diff --git a/.gitignore b/.gitignore
deleted file mode 100644
index b5abe8e..0000000
--- a/.gitignore
+++ /dev/null
@@ -1,29 +0,0 @@
-# This file is for projects that checkout webrtc/ directly (e.g. Chromium). It
-# is a truncated copy of the .gitignore file in the parent directory.
-*.DS_Store
-*.Makefile
-*.host.mk
-*.ncb
-*.ninja
-*.props
-*.pyc
-*.rules
-*.scons
-*.sdf
-*.sln
-*.suo
-*.target.mk
-*.targets
-*.user
-*.vcproj
-*.vcxproj
-*.vcxproj.filters
-*.vpj
-*.vpw
-*.vpwhistu
-*.vtg
-*.xcodeproj
-*_proto.xml
-*_proto_cpp.xml
-*~
-.*.sw?
diff --git a/BUILD.gn b/BUILD.gn
deleted file mode 100644
index bfdb53b..0000000
--- a/BUILD.gn
+++ /dev/null
@@ -1,542 +0,0 @@
-# Copyright (c) 2014 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.
-
-# TODO(kjellander): Rebase this to webrtc/build/common.gypi changes after r6330.
-
-import("//build/config/linux/pkg_config.gni")
-import("//build/config/sanitizers/sanitizers.gni")
-import("webrtc.gni")
-import("//third_party/protobuf/proto_library.gni")
-if (is_android) {
-  import("//build/config/android/config.gni")
-  import("//build/config/android/rules.gni")
-}
-
-# Contains the defines and includes in common.gypi that are duplicated both as
-# target_defaults and direct_dependent_settings.
-config("common_inherited_config") {
-  defines = []
-  cflags = []
-  ldflags = []
-  if (build_with_mozilla) {
-    defines += [ "WEBRTC_MOZILLA_BUILD" ]
-  }
-
-  # Some tests need to declare their own trace event handlers. If this define is
-  # not set, the first time TRACE_EVENT_* is called it will store the return
-  # value for the current handler in an static variable, so that subsequent
-  # changes to the handler for that TRACE_EVENT_* will be ignored.
-  # So when tests are included, we set this define, making it possible to use
-  # different event handlers in different tests.
-  if (rtc_include_tests) {
-    defines += [ "WEBRTC_NON_STATIC_TRACE_EVENT_HANDLERS=1" ]
-  } else {
-    defines += [ "WEBRTC_NON_STATIC_TRACE_EVENT_HANDLERS=0" ]
-  }
-  if (build_with_chromium) {
-    defines += [
-      # TODO(kjellander): Cleanup unused ones and move defines closer to
-      # the source when webrtc:4256 is completed.
-      "FEATURE_ENABLE_VOICEMAIL",
-      "GTEST_RELATIVE_PATH",
-      "WEBRTC_CHROMIUM_BUILD",
-    ]
-    include_dirs = [
-      # The overrides must be included first as that is the mechanism for
-      # selecting the override headers in Chromium.
-      "../webrtc_overrides",
-
-      # Allow includes to be prefixed with webrtc/ in case it is not an
-      # immediate subdirectory of the top-level.
-      "..",
-    ]
-  }
-  if (is_posix) {
-    defines += [ "WEBRTC_POSIX" ]
-  }
-  if (is_ios) {
-    defines += [
-      "WEBRTC_MAC",
-      "WEBRTC_IOS",
-    ]
-  }
-  if (is_linux) {
-    defines += [ "WEBRTC_LINUX" ]
-  }
-  if (is_mac) {
-    defines += [ "WEBRTC_MAC" ]
-  }
-  if (is_win) {
-    defines += [
-      "WEBRTC_WIN",
-      "_CRT_SECURE_NO_WARNINGS",  # Suppress warnings about _vsnprinf
-    ]
-  }
-  if (is_android) {
-    defines += [
-      "WEBRTC_LINUX",
-      "WEBRTC_ANDROID",
-    ]
-  }
-  if (is_chromeos) {
-    defines += [ "CHROMEOS" ]
-  }
-
-  if (rtc_sanitize_coverage != "") {
-    assert(is_clang, "sanitizer coverage requires clang")
-    cflags += [ "-fsanitize-coverage=${rtc_sanitize_coverage}" ]
-    ldflags += [ "-fsanitize-coverage=${rtc_sanitize_coverage}" ]
-  }
-
-  if (is_ubsan) {
-    cflags += [ "-fsanitize=float-cast-overflow" ]
-  }
-
-  # TODO(GYP): Support these in GN.
-  # if (is_bsd) {
-  #   defines += [ "BSD" ]
-  # }
-  # if (is_openbsd) {
-  #   defines += [ "OPENBSD" ]
-  # }
-  # if (is_freebsd) {
-  #   defines += [ "FREEBSD" ]
-  # }
-}
-
-config("common_config") {
-  cflags = []
-  cflags_cc = []
-  defines = []
-
-  if (rtc_enable_protobuf) {
-    defines += [ "WEBRTC_ENABLE_PROTOBUF=1" ]
-  } else {
-    defines += [ "WEBRTC_ENABLE_PROTOBUF=0" ]
-  }
-
-  if (rtc_restrict_logging) {
-    defines += [ "WEBRTC_RESTRICT_LOGGING" ]
-  }
-
-  if (rtc_include_internal_audio_device) {
-    defines += [ "WEBRTC_INCLUDE_INTERNAL_AUDIO_DEVICE" ]
-  }
-
-  if (!rtc_libvpx_build_vp9) {
-    defines += [ "RTC_DISABLE_VP9" ]
-  }
-
-  if (rtc_enable_sctp) {
-    defines += [ "HAVE_SCTP" ]
-  }
-
-  if (rtc_enable_external_auth) {
-    defines += [ "ENABLE_EXTERNAL_AUTH" ]
-  }
-
-  if (build_with_chromium) {
-    defines += [
-      # NOTICE: Since common_inherited_config is used in public_configs for our
-      # targets, there's no point including the defines in that config here.
-      # TODO(kjellander): Cleanup unused ones and move defines closer to the
-      # source when webrtc:4256 is completed.
-      "HAVE_WEBRTC_VIDEO",
-      "HAVE_WEBRTC_VOICE",
-      "LOGGING_INSIDE_WEBRTC",
-      "USE_WEBRTC_DEV_BRANCH",
-    ]
-  } else {
-    if (is_posix) {
-      # Enable more warnings: -Wextra is currently disabled in Chromium.
-      cflags = [
-        "-Wextra",
-
-        # Repeat some flags that get overridden by -Wextra.
-        "-Wno-unused-parameter",
-        "-Wno-missing-field-initializers",
-        "-Wno-strict-overflow",
-      ]
-      cflags_cc = [
-        "-Wnon-virtual-dtor",
-
-        # This is enabled for clang; enable for gcc as well.
-        "-Woverloaded-virtual",
-      ]
-    }
-
-    if (is_clang) {
-      cflags += [
-        "-Wc++11-narrowing",
-        "-Wimplicit-fallthrough",
-        "-Wthread-safety",
-        "-Winconsistent-missing-override",
-        "-Wundef",
-      ]
-
-      # use_xcode_clang only refers to the iOS toolchain, host binaries use
-      # chromium's clang always.
-      if (!is_nacl &&
-          (!use_xcode_clang || current_toolchain == host_toolchain)) {
-        # Flags NaCl (Clang 3.7) and Xcode 7.3 (Clang clang-703.0.31) do not
-        # recognize.
-        cflags += [ "-Wunused-lambda-capture" ]
-      }
-    }
-  }
-
-  if (current_cpu == "arm64") {
-    defines += [ "WEBRTC_ARCH_ARM64" ]
-    defines += [ "WEBRTC_HAS_NEON" ]
-  }
-
-  if (current_cpu == "arm") {
-    defines += [ "WEBRTC_ARCH_ARM" ]
-    if (arm_version >= 7) {
-      defines += [ "WEBRTC_ARCH_ARM_V7" ]
-      if (arm_use_neon) {
-        defines += [ "WEBRTC_HAS_NEON" ]
-      }
-    }
-  }
-
-  if (current_cpu == "mipsel") {
-    defines += [ "MIPS32_LE" ]
-    if (mips_float_abi == "hard") {
-      defines += [ "MIPS_FPU_LE" ]
-    }
-    if (mips_arch_variant == "r2") {
-      defines += [ "MIPS32_R2_LE" ]
-    }
-    if (mips_dsp_rev == 1) {
-      defines += [ "MIPS_DSP_R1_LE" ]
-    } else if (mips_dsp_rev == 2) {
-      defines += [
-        "MIPS_DSP_R1_LE",
-        "MIPS_DSP_R2_LE",
-      ]
-    }
-  }
-
-  if (is_android && !is_clang) {
-    # The Android NDK doesn"t provide optimized versions of these
-    # functions. Ensure they are disabled for all compilers.
-    cflags += [
-      "-fno-builtin-cos",
-      "-fno-builtin-sin",
-      "-fno-builtin-cosf",
-      "-fno-builtin-sinf",
-    ]
-  }
-
-  if (use_libfuzzer || use_drfuzz || use_afl) {
-    # Used in Chromium's overrides to disable logging
-    defines += [ "WEBRTC_UNSAFE_FUZZER_MODE" ]
-  }
-}
-
-config("common_objc") {
-  libs = [ "Foundation.framework" ]
-}
-
-if (!build_with_chromium) {
-  # Target to build all the WebRTC production code.
-  rtc_static_library("webrtc") {
-    # Only the root target should depend on this.
-    visibility = [ "//:default" ]
-
-    sources = []
-    complete_static_lib = true
-    defines = []
-
-    deps = [
-      ":webrtc_common",
-      "api",
-      "api:transport_api",
-      "audio",
-      "call",
-      "common_audio",
-      "common_video",
-      "logging",
-      "media",
-      "modules",
-      "modules/video_capture:video_capture_internal_impl",
-      "ortc",
-      "p2p",
-      "pc",
-      "rtc_base",
-      "sdk",
-      "stats",
-      "system_wrappers:system_wrappers_default",
-      "video",
-      "voice_engine",
-    ]
-
-    if (rtc_enable_protobuf) {
-      defines += [ "ENABLE_RTC_EVENT_LOG" ]
-      deps += [ "logging:rtc_event_log_proto" ]
-    }
-  }
-
-  if (rtc_include_tests) {
-    # Target to build all the WebRTC tests (but not examples or tools).
-    # Executable in order to get a target that links all WebRTC code.
-    rtc_executable("webrtc_tests") {
-      testonly = true
-
-      # Only the root target should depend on this.
-      visibility = [ "//:default" ]
-
-      deps = [
-        ":rtc_unittests",
-        ":video_engine_tests",
-        ":webrtc_nonparallel_tests",
-        ":webrtc_perf_tests",
-        "common_audio:common_audio_unittests",
-        "common_video:common_video_unittests",
-        "media:rtc_media_unittests",
-        "modules:modules_tests",
-        "modules:modules_unittests",
-        "modules/audio_coding:audio_coding_tests",
-        "modules/audio_processing:audio_processing_tests",
-        "modules/remote_bitrate_estimator:bwe_simulations_tests",
-        "modules/rtp_rtcp:test_packet_masks_metrics",
-        "modules/video_capture:video_capture_internal_impl",
-        "ortc:ortc_unittests",
-        "pc:peerconnection_unittests",
-        "pc:rtc_pc_unittests",
-        "rtc_base:rtc_base_tests_utils",
-        "stats:rtc_stats_unittests",
-        "system_wrappers:system_wrappers_unittests",
-        "test",
-        "video:screenshare_loopback",
-        "video:video_loopback",
-        "voice_engine:voice_engine_unittests",
-      ]
-      if (is_android) {
-        deps += [
-          ":android_junit_tests",
-          "sdk/android:libjingle_peerconnection_android_unittest",
-        ]
-      } else {
-        deps += [ "modules/video_capture:video_capture_tests" ]
-      }
-      if (!is_ios) {
-        deps += [ "voice_engine:voe_auto_test" ]
-      }
-      if (rtc_enable_protobuf) {
-        deps += [
-          "audio:low_bandwidth_audio_test",
-          "logging:rtc_event_log2rtp_dump",
-        ]
-      }
-    }
-  }
-}
-
-rtc_static_library("webrtc_common") {
-  # TODO(mbonadei): Remove (bugs.webrtc.org/7745)
-  # Enabling GN check triggers cyclic dependency error:
-  # :webrtc_common ->
-  # api:video_frame_api ->
-  # system_wrappers:system_wrappers ->
-  # webrtc_common
-  check_includes = false
-  sources = [
-    "common_types.cc",
-    "common_types.h",
-    "typedefs.h",
-  ]
-
-  if (!build_with_chromium && is_clang) {
-    # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-    suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-  }
-}
-
-if (use_libfuzzer || use_drfuzz || use_afl) {
-  # This target is only here for gn to discover fuzzer build targets under
-  # webrtc/test/fuzzers/.
-  group("webrtc_fuzzers_dummy") {
-    testonly = true
-    deps = [
-      "test/fuzzers:webrtc_fuzzer_main",
-    ]
-  }
-}
-
-if (rtc_include_tests) {
-  config("rtc_unittests_config") {
-    # GN orders flags on a target before flags from configs. The default config
-    # adds -Wall, and this flag have to be after -Wall -- so they need to
-    # come from a config and can"t be on the target directly.
-    if (is_clang) {
-      cflags = [
-        "-Wno-sign-compare",
-        "-Wno-unused-const-variable",
-      ]
-    }
-  }
-
-  rtc_test("rtc_unittests") {
-    testonly = true
-
-    deps = [
-      ":webrtc_common",
-      "api:rtc_api_unittests",
-      "api/audio_codecs/test:audio_codecs_api_unittests",
-      "p2p:libstunprober_unittests",
-      "p2p:rtc_p2p_unittests",
-      "rtc_base:rtc_base_approved_unittests",
-      "rtc_base:rtc_base_tests_main",
-      "rtc_base:rtc_base_tests_utils",
-      "rtc_base:rtc_base_unittests",
-      "rtc_base:rtc_numerics_unittests",
-      "rtc_base:rtc_task_queue_unittests",
-      "rtc_base:sequenced_task_checker_unittests",
-      "rtc_base:weak_ptr_unittests",
-      "system_wrappers:metrics_default",
-    ]
-
-    if (rtc_enable_protobuf) {
-      deps += [ "logging:rtc_event_log_tests" ]
-    }
-
-    if (is_android) {
-      deps += [ "//testing/android/native_test:native_test_support" ]
-      shard_timeout = 900
-    }
-
-    if (is_ios || is_mac) {
-      deps += [ "sdk:sdk_unittests_objc" ]
-    }
-  }
-
-  # TODO(pbos): Rename test suite, this is no longer "just" for video targets.
-  video_engine_tests_resources = [
-    "../resources/foreman_cif_short.yuv",
-    "../resources/voice_engine/audio_long16.pcm",
-  ]
-
-  if (is_ios) {
-    bundle_data("video_engine_tests_bundle_data") {
-      testonly = true
-      sources = video_engine_tests_resources
-      outputs = [
-        "{{bundle_resources_dir}}/{{source_file_part}}",
-      ]
-    }
-  }
-
-  rtc_test("video_engine_tests") {
-    testonly = true
-    deps = [
-      "audio:audio_tests",
-
-      # TODO(eladalon): call_tests aren't actually video-specific, so we
-      # should move them to a more appropriate test suite.
-      "call:call_tests",
-      "modules/video_capture",
-      "rtc_base:rtc_base_tests_utils",
-      "test:test_common",
-      "test:test_main",
-      "test:video_test_common",
-      "video:video_tests",
-    ]
-    data = video_engine_tests_resources
-    if (!build_with_chromium && is_clang) {
-      # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-    }
-    if (is_android) {
-      deps += [ "//testing/android/native_test:native_test_native_code" ]
-      shard_timeout = 900
-    }
-    if (is_ios) {
-      deps += [ ":video_engine_tests_bundle_data" ]
-    }
-  }
-
-  webrtc_perf_tests_resources = [
-    "../resources/audio_coding/speech_mono_16kHz.pcm",
-    "../resources/audio_coding/speech_mono_32_48kHz.pcm",
-    "../resources/audio_coding/testfile32kHz.pcm",
-    "../resources/ConferenceMotion_1280_720_50.yuv",
-    "../resources/difficult_photo_1850_1110.yuv",
-    "../resources/foreman_cif.yuv",
-    "../resources/google-wifi-3mbps.rx",
-    "../resources/paris_qcif.yuv",
-    "../resources/photo_1850_1110.yuv",
-    "../resources/presentation_1850_1110.yuv",
-    "../resources/verizon4g-downlink.rx",
-    "../resources/voice_engine/audio_long16.pcm",
-    "../resources/web_screenshot_1850_1110.yuv",
-  ]
-
-  if (is_ios) {
-    bundle_data("webrtc_perf_tests_bundle_data") {
-      testonly = true
-      sources = webrtc_perf_tests_resources
-      outputs = [
-        "{{bundle_resources_dir}}/{{source_file_part}}",
-      ]
-    }
-  }
-
-  rtc_test("webrtc_perf_tests") {
-    testonly = true
-    configs += [ ":rtc_unittests_config" ]
-
-    deps = [
-      "audio:audio_perf_tests",
-      "call:call_perf_tests",
-      "modules/audio_coding:audio_coding_perf_tests",
-      "modules/audio_processing:audio_processing_perf_tests",
-      "modules/remote_bitrate_estimator:remote_bitrate_estimator_perf_tests",
-      "test:test_main",
-      "video:video_full_stack_tests",
-    ]
-
-    data = webrtc_perf_tests_resources
-    if (is_android) {
-      deps += [ "//testing/android/native_test:native_test_native_code" ]
-      shard_timeout = 2700
-    }
-    if (is_ios) {
-      deps += [ ":webrtc_perf_tests_bundle_data" ]
-    }
-  }
-
-  rtc_test("webrtc_nonparallel_tests") {
-    testonly = true
-    deps = [
-      "rtc_base:rtc_base_nonparallel_tests",
-    ]
-    if (is_android) {
-      deps += [ "//testing/android/native_test:native_test_support" ]
-      shard_timeout = 900
-    }
-  }
-
-  if (is_android) {
-    junit_binary("android_junit_tests") {
-      java_files = [
-        "examples/androidjunit/src/org/appspot/apprtc/BluetoothManagerTest.java",
-        "examples/androidjunit/src/org/appspot/apprtc/DirectRTCClientTest.java",
-        "examples/androidjunit/src/org/appspot/apprtc/TCPChannelClientTest.java",
-        "sdk/android/tests/src/org/webrtc/CameraEnumerationTest.java",
-      ]
-
-      deps = [
-        "examples:AppRTCMobile_javalib",
-        "sdk/android:libjingle_peerconnection_java",
-        "//base:base_java_test_support",
-      ]
-    }
-  }
-}
diff --git a/DEPS b/DEPS
deleted file mode 100644
index 0459f4c..0000000
--- a/DEPS
+++ /dev/null
@@ -1,34 +0,0 @@
-# Define rules for which include paths are allowed in our source.
-include_rules = [
-  # Base is only used to build Android APK tests and may not be referenced by
-  # WebRTC production code.
-  "-base",
-  "-chromium",
-  "+external/webrtc/webrtc",  # Android platform build.
-  "+gflags",
-  "+libyuv",
-  "-webrtc",  # Has to be disabled; otherwise all dirs below will be allowed.
-  # Individual headers that will be moved out of here, see webrtc:4243.
-  "+webrtc/call/rtp_config.h",
-  "+webrtc/common_types.h",
-  "+webrtc/transport.h",
-  "+webrtc/typedefs.h",
-  "+webrtc/voice_engine_configurations.h",
-
-  "+WebRTC",
-  "+webrtc/api",
-  "+webrtc/modules/include",
-  "+webrtc/rtc_base",
-  "+webrtc/test",
-  "+webrtc/rtc_tools",
-]
-
-# The below rules will be removed when webrtc:4243 is fixed.
-specific_include_rules = {
-  "video_receive_stream\.h": [
-    "+webrtc/call/video_receive_stream.h",
-  ],
-  "video_send_stream\.h": [
-    "+webrtc/call/video_send_stream.h",
-  ],
-}
diff --git a/LICENSE b/LICENSE
deleted file mode 100644
index 4c41b7b..0000000
--- a/LICENSE
+++ /dev/null
@@ -1,29 +0,0 @@
-Copyright (c) 2011, The WebRTC project authors. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
-  * Redistributions of source code must retain the above copyright
-    notice, this list of conditions and the following disclaimer.
-
-  * Redistributions in binary form must reproduce the above copyright
-    notice, this list of conditions and the following disclaimer in
-    the documentation and/or other materials provided with the
-    distribution.
-
-  * Neither the name of Google nor the names of its contributors may
-    be used to endorse or promote products derived from this software
-    without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/LICENSE_THIRD_PARTY b/LICENSE_THIRD_PARTY
deleted file mode 100644
index af1aa50..0000000
--- a/LICENSE_THIRD_PARTY
+++ /dev/null
@@ -1,458 +0,0 @@
-This source tree contains third party source code which is governed by third
-party licenses. Paths to the files and associated licenses are collected here.
-
-Files governed by third party licenses:
-base/base64.cc
-base/base64.h
-base/md5.cc
-base/md5.h
-base/sha1.cc
-base/sha1.h
-base/sigslot.cc
-base/sigslot.h
-common_audio/fft4g.c
-common_audio/signal_processing/spl_sqrt_floor.c
-common_audio/signal_processing/spl_sqrt_floor_arm.S
-modules/audio_coding/codecs/g711/main/source/g711.c
-modules/audio_coding/codecs/g711/main/source/g711.h
-modules/audio_coding/codecs/g722/main/source/g722_decode.c
-modules/audio_coding/codecs/g722/main/source/g722_enc_dec.h
-modules/audio_coding/codecs/g722/main/source/g722_encode.c
-modules/audio_coding/codecs/isac/main/source/fft.c
-modules/audio_device/mac/portaudio/pa_memorybarrier.h
-modules/audio_device/mac/portaudio/pa_ringbuffer.c
-modules/audio_device/mac/portaudio/pa_ringbuffer.h
-modules/audio_processing/aec/aec_rdft.c
-system_wrappers/source/condition_variable_event_win.cc
-system_wrappers/source/set_thread_name_win.h
-
-Individual licenses for each file:
--------------------------------------------------------------------------------
-Files:
-base/base64.cc
-base/base64.h
-
-License:
-//*********************************************************************
-//* Base64 - a simple base64 encoder and decoder.
-//*
-//*     Copyright (c) 1999, Bob Withers - bwit@pobox.com
-//*
-//* This code may be freely used for any purpose, either personal
-//* or commercial, provided the authors copyright notice remains
-//* intact.
-//*
-//* Enhancements by Stanley Yamane:
-//*     o reverse lookup table for the decode function
-//*     o reserve string buffer space in advance
-//*
-//*********************************************************************
--------------------------------------------------------------------------------
-Files:
-base/md5.cc
-base/md5.h
-
-License:
-/*
- * This code implements the MD5 message-digest algorithm.
- * The algorithm is due to Ron Rivest.  This code was
- * written by Colin Plumb in 1993, no copyright is claimed.
- * This code is in the public domain; do with it what you wish.
- *
--------------------------------------------------------------------------------
-Files:
-base/sha1.cc
-base/sha1.h
-
-License:
-/*
- * SHA-1 in C
- * By Steve Reid <sreid@sea-to-sky.net>
- * 100% Public Domain
- *
- * -----------------
- * Modified 7/98
- * By James H. Brown <jbrown@burgoyne.com>
- * Still 100% Public Domain
- *
--------------------------------------------------------------------------------
-Files:
-base/sigslot.cc
-base/sigslot.h
-
-License:
-// sigslot.h: Signal/Slot classes
-//
-// Written by Sarah Thompson (sarah@telergy.com) 2002.
-//
-// License: Public domain. You are free to use this code however you like, with
-// the proviso that the author takes on no responsibility or liability for any
-// use.
--------------------------------------------------------------------------------
-Files:
-common_audio/signal_processing/spl_sqrt_floor.c
-common_audio/signal_processing/spl_sqrt_floor_arm.S
-
-License:
-/*
- * Written by Wilco Dijkstra, 1996. The following email exchange establishes the
- * license.
- *
- * From: Wilco Dijkstra <Wilco.Dijkstra@ntlworld.com>
- * Date: Fri, Jun 24, 2011 at 3:20 AM
- * Subject: Re: sqrt routine
- * To: Kevin Ma <kma@google.com>
- * Hi Kevin,
- * Thanks for asking. Those routines are public domain (originally posted to
- * comp.sys.arm a long time ago), so you can use them freely for any purpose.
- * Cheers,
- * Wilco
- *
- * ----- Original Message -----
- * From: "Kevin Ma" <kma@google.com>
- * To: <Wilco.Dijkstra@ntlworld.com>
- * Sent: Thursday, June 23, 2011 11:44 PM
- * Subject: Fwd: sqrt routine
- * Hi Wilco,
- * I saw your sqrt routine from several web sites, including
- * http://www.finesse.demon.co.uk/steven/sqrt.html.
- * Just wonder if there's any copyright information with your Successive
- * approximation routines, or if I can freely use it for any purpose.
- * Thanks.
- * Kevin
- */
--------------------------------------------------------------------------------
-Files:
-modules/audio_coding/codecs/g711/main/source/g711.c
-modules/audio_coding/codecs/g711/main/source/g711.h
-
-License:
-/*
- * SpanDSP - a series of DSP components for telephony
- *
- * g711.h - In line A-law and u-law conversion routines
- *
- * Written by Steve Underwood <steveu@coppice.org>
- *
- * Copyright (C) 2001 Steve Underwood
- *
- *  Despite my general liking of the GPL, I place this code in the
- *  public domain for the benefit of all mankind - even the slimy
- *  ones who might try to proprietize my work and use it to my
- *  detriment.
- */
--------------------------------------------------------------------------------
-Files:
-modules/audio_coding/codecs/g722/main/source/g722_decode.c
-modules/audio_coding/codecs/g722/main/source/g722_enc_dec.h
-modules/audio_coding/codecs/g722/main/source/g722_encode.c
-
-License:
-/*
- * SpanDSP - a series of DSP components for telephony
- *
- * g722_decode.c - The ITU G.722 codec, decode part.
- *
- * Written by Steve Underwood <steveu@coppice.org>
- *
- * Copyright (C) 2005 Steve Underwood
- *
- *  Despite my general liking of the GPL, I place my own contributions
- *  to this code in the public domain for the benefit of all mankind -
- *  even the slimy ones who might try to proprietize my work and use it
- *  to my detriment.
- *
- * Based in part on a single channel G.722 codec which is:
- *
- * Copyright (c) CMU 1993
- * Computer Science, Speech Group
- * Chengxiang Lu and Alex Hauptmann
- */
--------------------------------------------------------------------------------
-Files:
-modules/audio_coding/codecs/isac/main/source/fft.c
-
-License:
-/*
- * Copyright(c)1995,97 Mark Olesen <olesen@me.QueensU.CA>
- *    Queen's Univ at Kingston (Canada)
- *
- * Permission to use, copy, modify, and distribute this software for
- * any purpose without fee is hereby granted, provided that this
- * entire notice is included in all copies of any software which is
- * or includes a copy or modification of this software and in all
- * copies of the supporting documentation for such software.
- *
- * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR
- * IMPLIED WARRANTY.  IN PARTICULAR, NEITHER THE AUTHOR NOR QUEEN'S
- * UNIVERSITY AT KINGSTON MAKES ANY REPRESENTATION OR WARRANTY OF ANY
- * KIND CONCERNING THE MERCHANTABILITY OF THIS SOFTWARE OR ITS
- * FITNESS FOR ANY PARTICULAR PURPOSE.
- *
- * All of which is to say that you can do what you like with this
- * source code provided you don't try to sell it as your own and you
- * include an unaltered copy of this message (including the
- * copyright).
- *
- * It is also implicitly understood that bug fixes and improvements
- * should make their way back to the general Internet community so
- * that everyone benefits.
- */
--------------------------------------------------------------------------------
-Files:
-modules/audio_device/mac/portaudio/pa_memorybarrier.h
-modules/audio_device/mac/portaudio/pa_ringbuffer.c
-modules/audio_device/mac/portaudio/pa_ringbuffer.h
-
-License:
-/*
- * $Id: pa_memorybarrier.h 1240 2007-07-17 13:05:07Z bjornroche $
- * Portable Audio I/O Library
- * Memory barrier utilities
- *
- * Author: Bjorn Roche, XO Audio, LLC
- *
- * This program uses the PortAudio Portable Audio Library.
- * For more information see: http://www.portaudio.com
- * Copyright (c) 1999-2000 Ross Bencina and Phil Burk
- *
- * Permission is hereby granted, free of charge, to any person obtaining
- * a copy of this software and associated documentation files
- * (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge,
- * publish, distribute, sublicense, and/or sell copies of the Software,
- * and to permit persons to whom the Software is furnished to do so,
- * subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
- * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR
- * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
- * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
- * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-
-/*
- * The text above constitutes the entire PortAudio license; however,
- * the PortAudio community also makes the following non-binding requests:
- *
- * Any person wishing to distribute modifications to the Software is
- * requested to send the modifications to the original developer so that
- * they can be incorporated into the canonical version. It is also
- * requested that these non-binding requests be included along with the
- * license above.
- */
-
-/*
- * $Id: pa_ringbuffer.c 1421 2009-11-18 16:09:05Z bjornroche $
- * Portable Audio I/O Library
- * Ring Buffer utility.
- *
- * Author: Phil Burk, http://www.softsynth.com
- * modified for SMP safety on Mac OS X by Bjorn Roche
- * modified for SMP safety on Linux by Leland Lucius
- * also, allowed for const where possible
- * modified for multiple-byte-sized data elements by Sven Fischer
- *
- * Note that this is safe only for a single-thread reader and a
- * single-thread writer.
- *
- * This program uses the PortAudio Portable Audio Library.
- * For more information see: http://www.portaudio.com
- * Copyright (c) 1999-2000 Ross Bencina and Phil Burk
- *
- * Permission is hereby granted, free of charge, to any person obtaining
- * a copy of this software and associated documentation files
- * (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge,
- * publish, distribute, sublicense, and/or sell copies of the Software,
- * and to permit persons to whom the Software is furnished to do so,
- * subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
- * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR
- * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
- * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
- * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-
-/*
- * The text above constitutes the entire PortAudio license; however,
- * the PortAudio community also makes the following non-binding requests:
- *
- * Any person wishing to distribute modifications to the Software is
- * requested to send the modifications to the original developer so that
- * they can be incorporated into the canonical version. It is also
- * requested that these non-binding requests be included along with the
- * license above.
- */
--------------------------------------------------------------------------------
-Files:
-common_audio/fft4g.c
-modules/audio_processing/aec/aec_rdft.c
-
-License:
-/*
- * http://www.kurims.kyoto-u.ac.jp/~ooura/fft.html
- * Copyright Takuya OOURA, 1996-2001
- *
- * You may use, copy, modify and distribute this code for any purpose (include
- * commercial use) and without fee. Please refer to this package when you modify
- * this code.
- */
--------------------------------------------------------------------------------
-Files:
-system_wrappers/source/condition_variable_event_win.cc
-
-Source:
-http://www1.cse.wustl.edu/~schmidt/ACE-copying.html
-
-License:
-Copyright and Licensing Information for ACE(TM), TAO(TM), CIAO(TM), DAnCE(TM),
-and CoSMIC(TM)
-
-ACE(TM), TAO(TM), CIAO(TM), DAnCE>(TM), and CoSMIC(TM) (henceforth referred to
-as "DOC software") are copyrighted by Douglas C. Schmidt and his research
-group at Washington University, University of California, Irvine, and
-Vanderbilt University, Copyright (c) 1993-2009, all rights reserved. Since DOC
-software is open-source, freely available software, you are free to use,
-modify, copy, and distribute--perpetually and irrevocably--the DOC software
-source code and object code produced from the source, as well as copy and
-distribute modified versions of this software. You must, however, include this
-copyright statement along with any code built using DOC software that you
-release. No copyright statement needs to be provided if you just ship binary
-executables of your software products.
-You can use DOC software in commercial and/or binary software releases and are
-under no obligation to redistribute any of your source code that is built
-using DOC software. Note, however, that you may not misappropriate the DOC
-software code, such as copyrighting it yourself or claiming authorship of the
-DOC software code, in a way that will prevent DOC software from being
-distributed freely using an open-source development model. You needn't inform
-anyone that you're using DOC software in your software, though we encourage
-you to let us know so we can promote your project in the DOC software success
-stories.
-
-The ACE, TAO, CIAO, DAnCE, and CoSMIC web sites are maintained by the DOC
-Group at the Institute for Software Integrated Systems (ISIS) and the Center
-for Distributed Object Computing of Washington University, St. Louis for the
-development of open-source software as part of the open-source software
-community. Submissions are provided by the submitter ``as is'' with no
-warranties whatsoever, including any warranty of merchantability,
-noninfringement of third party intellectual property, or fitness for any
-particular purpose. In no event shall the submitter be liable for any direct,
-indirect, special, exemplary, punitive, or consequential damages, including
-without limitation, lost profits, even if advised of the possibility of such
-damages. Likewise, DOC software is provided as is with no warranties of any
-kind, including the warranties of design, merchantability, and fitness for a
-particular purpose, noninfringement, or arising from a course of dealing,
-usage or trade practice. Washington University, UC Irvine, Vanderbilt
-University, their employees, and students shall have no liability with respect
-to the infringement of copyrights, trade secrets or any patents by DOC
-software or any part thereof. Moreover, in no event will Washington
-University, UC Irvine, or Vanderbilt University, their employees, or students
-be liable for any lost revenue or profits or other special, indirect and
-consequential damages.
-
-DOC software is provided with no support and without any obligation on the
-part of Washington University, UC Irvine, Vanderbilt University, their
-employees, or students to assist in its use, correction, modification, or
-enhancement. A number of companies around the world provide commercial support
-for DOC software, however. DOC software is Y2K-compliant, as long as the
-underlying OS platform is Y2K-compliant. Likewise, DOC software is compliant
-with the new US daylight savings rule passed by Congress as "The Energy Policy
-Act of 2005," which established new daylight savings times (DST) rules for the
-United States that expand DST as of March 2007. Since DOC software obtains
-time/date and calendaring information from operating systems users will not be
-affected by the new DST rules as long as they upgrade their operating systems
-accordingly.
-
-The names ACE(TM), TAO(TM), CIAO(TM), DAnCE(TM), CoSMIC(TM), Washington
-University, UC Irvine, and Vanderbilt University, may not be used to endorse
-or promote products or services derived from this source without express
-written permission from Washington University, UC Irvine, or Vanderbilt
-University. This license grants no permission to call products or services
-derived from this source ACE(TM), TAO(TM), CIAO(TM), DAnCE(TM), or CoSMIC(TM),
-nor does it grant permission for the name Washington University, UC Irvine, or
-Vanderbilt University to appear in their names.
--------------------------------------------------------------------------------
-Files:
-system_wrappers/source/set_thread_name_win.h
-
-Source:
-http://msdn.microsoft.com/en-us/cc300389.aspx#P
-
-License:
-This license governs use of code marked as “sample” or “example” available on
-this web site without a license agreement, as provided under the section above
-titled “NOTICE SPECIFIC TO SOFTWARE AVAILABLE ON THIS WEB SITE.” If you use
-such code (the “software”), you accept this license. If you do not accept the
-license, do not use the software.
-
-1. Definitions
-
-The terms “reproduce,” “reproduction,” “derivative works,” and “distribution”
-have the same meaning here as under U.S. copyright law.
-
-A “contribution” is the original software, or any additions or changes to the
-software.
-
-A “contributor” is any person that distributes its contribution under this
-license.
-
-“Licensed patents” are a contributor’s patent claims that read directly on its
-contribution.
-
-2. Grant of Rights
-
-(A) Copyright Grant - Subject to the terms of this license, including the
-license conditions and limitations in section 3, each contributor grants you a
-non-exclusive, worldwide, royalty-free copyright license to reproduce its
-contribution, prepare derivative works of its contribution, and distribute its
-contribution or any derivative works that you create.
-
-(B) Patent Grant - Subject to the terms of this license, including the license
-conditions and limitations in section 3, each contributor grants you a
-non-exclusive, worldwide, royalty-free license under its licensed patents to
-make, have made, use, sell, offer for sale, import, and/or otherwise dispose
-of its contribution in the software or derivative works of the contribution in
-the software.
-
-3. Conditions and Limitations
-
-(A) No Trademark License- This license does not grant you rights to use any
-contributors’ name, logo, or trademarks.
-
-(B) If you bring a patent claim against any contributor over patents that you
-claim are infringed by the software, your patent license from such contributor
-to the software ends automatically.
-
-(C) If you distribute any portion of the software, you must retain all
-copyright, patent, trademark, and attribution notices that are present in the
-software.
-
-(D) If you distribute any portion of the software in source code form, you may
-do so only under this license by including a complete copy of this license
-with your distribution. If you distribute any portion of the software in
-compiled or object code form, you may only do so under a license that complies
-with this license.
-
-(E) The software is licensed “as-is.” You bear the risk of using it. The
-contributors give no express warranties, guarantees or conditions. You may
-have additional consumer rights under your local laws which this license
-cannot change. To the extent permitted under your local laws, the contributors
-exclude the implied warranties of merchantability, fitness for a particular
-purpose and non-infringement.
-
-(F) Platform Limitation - The licenses granted in sections 2(A) and 2(B)
-extend only to the software or derivative works that you create that run on a
-Microsoft Windows operating system product.
-
diff --git a/OWNERS b/OWNERS
deleted file mode 100644
index 025c721..0000000
--- a/OWNERS
+++ /dev/null
@@ -1,13 +0,0 @@
-henrika@webrtc.org
-kwiberg@webrtc.org
-mflodman@webrtc.org
-niklas.enbom@webrtc.org
-stefan@webrtc.org
-tina.legrand@webrtc.org
-tommi@webrtc.org
-
-per-file *.gn=kjellander@webrtc.org
-per-file *.gni=kjellander@webrtc.org
-
-per-file *video*.h=pbos@webrtc.org
-per-file DEPS=kjellander@webrtc.org
diff --git a/PATENTS b/PATENTS
deleted file mode 100644
index 190607a..0000000
--- a/PATENTS
+++ /dev/null
@@ -1,24 +0,0 @@
-Additional IP Rights Grant (Patents)
-
-"This implementation" means the copyrightable works distributed by
-Google as part of the WebRTC code package.
-
-Google hereby grants to you a perpetual, worldwide, non-exclusive,
-no-charge, irrevocable (except as stated in this section) patent
-license to make, have made, use, offer to sell, sell, import,
-transfer, and otherwise run, modify and propagate the contents of this
-implementation of the WebRTC code package, where such license applies
-only to those patent claims, both currently owned by Google and
-acquired in the future, licensable by Google that are necessarily
-infringed by this implementation of the WebRTC code package. This
-grant does not include claims that would be infringed only as a
-consequence of further modification of this implementation. If you or
-your agent or exclusive licensee institute or order or agree to the
-institution of patent litigation against any entity (including a
-cross-claim or counterclaim in a lawsuit) alleging that this
-implementation of the WebRTC code package or any code incorporated
-within this implementation of the WebRTC code package constitutes
-direct or contributory patent infringement, or inducement of patent
-infringement, then any patent rights granted to you under this License
-for this implementation of the WebRTC code package shall terminate as
-of the date such litigation is filed.
diff --git a/PRESUBMIT.py b/PRESUBMIT.py
deleted file mode 100644
index 4132c16..0000000
--- a/PRESUBMIT.py
+++ /dev/null
@@ -1,45 +0,0 @@
-# Copyright (c) 2013 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.
-
-def _LicenseHeader(input_api):
-  """Returns the license header regexp."""
-  # Accept any year number from 2003 to the current year
-  current_year = int(input_api.time.strftime('%Y'))
-  allowed_years = (str(s) for s in reversed(xrange(2003, current_year + 1)))
-  years_re = '(' + '|'.join(allowed_years) + ')'
-  license_header = (
-      r'.*? Copyright( \(c\))? %(year)s The WebRTC [Pp]roject [Aa]uthors\. '
-        r'All [Rr]ights [Rr]eserved\.\n'
-      r'.*?\n'
-      r'.*? Use of this source code is governed by a BSD-style license\n'
-      r'.*? that can be found in the LICENSE file in the root of the source\n'
-      r'.*? tree\. An additional intellectual property rights grant can be '
-        r'found\n'
-      r'.*? in the file PATENTS\.  All contributing project authors may\n'
-      r'.*? be found in the AUTHORS file in the root of the source tree\.\n'
-  ) % {
-      'year': years_re,
-  }
-  return license_header
-
-def _CommonChecks(input_api, output_api):
-  """Checks common to both upload and commit."""
-  results = []
-  results.extend(input_api.canned_checks.CheckLicense(
-      input_api, output_api, _LicenseHeader(input_api)))
-  return results
-
-def CheckChangeOnUpload(input_api, output_api):
-  results = []
-  results.extend(_CommonChecks(input_api, output_api))
-  return results
-
-def CheckChangeOnCommit(input_api, output_api):
-  results = []
-  results.extend(_CommonChecks(input_api, output_api))
-  return results
diff --git a/README.chromium b/README.chromium
deleted file mode 100644
index 246c13d..0000000
--- a/README.chromium
+++ /dev/null
@@ -1,13 +0,0 @@
-Name: WebRTC
-URL: http://www.webrtc.org
-Version: 90
-License: BSD
-License File: LICENSE
-
-Description:
-WebRTC provides real time voice and video processing
-functionality to enable the implementation of 
-PeerConnection/MediaStream.
-
-Third party code used in this project is described 
-in the file LICENSE_THIRD_PARTY.
diff --git a/api/BUILD.gn b/api/BUILD.gn
deleted file mode 100644
index 86a63e4..0000000
--- a/api/BUILD.gn
+++ /dev/null
@@ -1,302 +0,0 @@
-# Copyright (c) 2015 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.
-
-import("../webrtc.gni")
-if (is_android) {
-  import("//build/config/android/config.gni")
-  import("//build/config/android/rules.gni")
-}
-
-group("api") {
-  public_deps = [
-    ":libjingle_peerconnection_api",
-  ]
-}
-
-rtc_source_set("call_api") {
-  sources = [
-    "call/audio_sink.h",
-  ]
-
-  deps = [
-    # TODO(kjellander): Add remaining dependencies when webrtc:4243 is done.
-    ":audio_mixer_api",
-    ":transport_api",
-    "..:webrtc_common",
-    "../rtc_base:rtc_base_approved",
-    "audio_codecs:audio_codecs_api",
-  ]
-}
-
-rtc_static_library("libjingle_peerconnection_api") {
-  # Cannot have GN check enabled since that would introduce dependency cycles
-  # TODO(kjellander): Remove (bugs.webrtc.org/7504)
-  check_includes = false
-  cflags = []
-  sources = [
-    "datachannel.h",
-    "datachannelinterface.h",
-    "dtmfsenderinterface.h",
-    "jsep.h",
-    "jsepicecandidate.h",
-    "jsepsessiondescription.h",
-    "mediaconstraintsinterface.cc",
-    "mediaconstraintsinterface.h",
-    "mediastream.h",
-    "mediastreaminterface.cc",
-    "mediastreaminterface.h",
-    "mediastreamproxy.h",
-    "mediastreamtrack.h",
-    "mediastreamtrackproxy.h",
-    "mediatypes.cc",
-    "mediatypes.h",
-    "notifier.h",
-    "peerconnectionfactoryproxy.h",
-    "peerconnectioninterface.h",
-    "peerconnectionproxy.h",
-    "proxy.h",
-    "rtcerror.cc",
-    "rtcerror.h",
-    "rtpparameters.cc",
-    "rtpparameters.h",
-    "rtpreceiverinterface.h",
-    "rtpsender.h",
-    "rtpsenderinterface.h",
-    "statstypes.cc",
-    "statstypes.h",
-    "streamcollection.h",
-    "umametrics.h",
-    "videosourceproxy.h",
-    "videotracksource.h",
-    "webrtcsdp.h",
-  ]
-
-  if (!build_with_chromium && is_clang) {
-    # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-    suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-  }
-
-  deps = [
-    ":rtc_stats_api",
-    "..:webrtc_common",
-    "../rtc_base:rtc_base",
-    "../rtc_base:rtc_base_approved",
-    "audio_codecs:audio_codecs_api",
-  ]
-
-  # This is needed until bugs.webrtc.org/7504 is removed so this target can
-  # properly depend on ../media:rtc_media_base
-  # TODO(kjellander): Remove this dependency.
-  if (is_nacl) {
-    deps += [ "//native_client_sdk/src/libraries/nacl_io" ]
-  }
-}
-
-rtc_source_set("ortc_api") {
-  check_includes = false  # TODO(deadbeef): Remove (bugs.webrtc.org/6828)
-  sources = [
-    "ortc/mediadescription.cc",
-    "ortc/mediadescription.h",
-    "ortc/ortcfactoryinterface.h",
-    "ortc/ortcrtpreceiverinterface.h",
-    "ortc/ortcrtpsenderinterface.h",
-    "ortc/packettransportinterface.h",
-    "ortc/rtptransportcontrollerinterface.h",
-    "ortc/rtptransportinterface.h",
-    "ortc/sessiondescription.cc",
-    "ortc/sessiondescription.h",
-    "ortc/srtptransportinterface.h",
-    "ortc/udptransportinterface.h",
-  ]
-
-  # For mediastreaminterface.h, etc.
-  # TODO(deadbeef): Create a separate target for the common things ORTC and
-  # PeerConnection code shares, so that ortc_api can depend on that instead of
-  # libjingle_peerconnection_api.
-  public_deps = [
-    ":libjingle_peerconnection_api",
-  ]
-  if (!build_with_chromium && is_clang) {
-    # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-    suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-  }
-}
-
-# TODO(ossu): Remove once downstream projects have updated.
-rtc_source_set("libjingle_peerconnection") {
-  public_deps = [
-    "../pc:libjingle_peerconnection",
-  ]
-}
-
-rtc_source_set("rtc_stats_api") {
-  cflags = []
-  sources = [
-    "stats/rtcstats.h",
-    "stats/rtcstats_objects.h",
-    "stats/rtcstatscollectorcallback.h",
-    "stats/rtcstatsreport.h",
-  ]
-
-  deps = [
-    "../rtc_base:rtc_base_approved",
-  ]
-}
-
-rtc_source_set("audio_mixer_api") {
-  sources = [
-    "audio/audio_mixer.h",
-  ]
-
-  deps = [
-    "../modules:module_api",
-    "../rtc_base:rtc_base_approved",
-  ]
-}
-
-rtc_source_set("transport_api") {
-  sources = [
-    "call/transport.h",
-  ]
-}
-
-rtc_source_set("video_frame_api") {
-  sources = [
-    "video/i420_buffer.cc",
-    "video/i420_buffer.h",
-    "video/video_content_type.cc",
-    "video/video_content_type.h",
-    "video/video_frame.cc",
-    "video/video_frame.h",
-    "video/video_frame_buffer.cc",
-    "video/video_frame_buffer.h",
-    "video/video_rotation.h",
-    "video/video_timing.cc",
-    "video/video_timing.h",
-  ]
-
-  deps = [
-    "../rtc_base:rtc_base_approved",
-    "../system_wrappers",
-  ]
-
-  # TODO(nisse): This logic is duplicated in multiple places.
-  # Define in a single place.
-  if (rtc_build_libyuv) {
-    deps += [ "$rtc_libyuv_dir" ]
-    public_deps = [
-      "$rtc_libyuv_dir",
-    ]
-  } else {
-    # Need to add a directory normally exported by libyuv.
-    include_dirs = [ "$rtc_libyuv_dir/include" ]
-  }
-}
-
-rtc_source_set("array_view") {
-  sources = [
-    "array_view.h",
-  ]
-  deps = [
-    "../rtc_base:rtc_base_approved",
-  ]
-}
-
-rtc_source_set("optional") {
-  sources = [
-    "optional.cc",
-    "optional.h",
-  ]
-  deps = [
-    ":array_view",
-    "../rtc_base:rtc_base_approved",
-  ]
-}
-
-rtc_source_set("libjingle_peerconnection_test_api") {
-  testonly = true
-  sources = [
-    "test/fakeconstraints.h",
-  ]
-
-  public_deps = [
-    ":libjingle_peerconnection_api",
-  ]
-
-  deps = [
-    "../rtc_base:rtc_base_approved",
-  ]
-}
-
-if (rtc_include_tests) {
-  rtc_source_set("mock_audio_mixer") {
-    testonly = true
-    sources = [
-      "test/mock_audio_mixer.h",
-    ]
-
-    public_deps = [
-      ":audio_mixer_api",
-    ]
-
-    deps = [
-      "../test:test_support",
-      "//testing/gmock",
-    ]
-  }
-
-  rtc_source_set("fakemetricsobserver") {
-    testonly = true
-    sources = [
-      "fakemetricsobserver.cc",
-      "fakemetricsobserver.h",
-    ]
-    deps = [
-      ":libjingle_peerconnection_api",
-      "../rtc_base:rtc_base_approved",
-    ]
-    if (!build_with_chromium && is_clang) {
-      # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-    }
-  }
-
-  rtc_source_set("rtc_api_unittests") {
-    testonly = true
-
-    # Skip restricting visibility on mobile platforms since the tests on those
-    # gets additional generated targets which would require many lines here to
-    # cover (which would be confusing to read and hard to maintain).
-    if (!is_android && !is_ios) {
-      visibility = [ "..:rtc_unittests" ]
-    }
-    sources = [
-      "array_view_unittest.cc",
-      "optional_unittest.cc",
-      "ortc/mediadescription_unittest.cc",
-      "ortc/sessiondescription_unittest.cc",
-      "rtcerror_unittest.cc",
-      "rtpparameters_unittest.cc",
-    ]
-
-    if (!build_with_chromium && is_clang) {
-      # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-    }
-
-    deps = [
-      ":array_view",
-      ":libjingle_peerconnection_api",
-      ":optional",
-      ":ortc_api",
-      "../rtc_base:rtc_base_approved",
-      "../rtc_base:rtc_base_tests_utils",
-      "../test:test_support",
-    ]
-  }
-}
diff --git a/api/DEPS b/api/DEPS
deleted file mode 100644
index fad1d84..0000000
--- a/api/DEPS
+++ /dev/null
@@ -1,41 +0,0 @@
-include_rules = [
-  "+third_party/libyuv",
-  "+webrtc/common_video",
-  "+webrtc/media",
-  "+webrtc/p2p",
-  "+webrtc/pc",
-]
-
-specific_include_rules = {
-  "peerconnection_jni\.cc": [
-    "+webrtc/voice_engine",
-  ],
-
-  # TODO(ossu): Remove this exception when {builtin_,}audio_encoder_factory.h
-  # has moved to api/.
-  "peerconnectioninterface\.h": [
-    "+webrtc/call/callfactoryinterface.h",
-    "+webrtc/logging/rtc_event_log/rtc_event_log_factory_interface.h",
-    "+webrtc/modules/audio_coding/codecs/audio_encoder_factory.h",
-    "+webrtc/modules/audio_coding/codecs/builtin_audio_encoder_factory.h",
-  ],
-
-  # Needed because AudioEncoderOpus is in the wrong place for
-  # backwards compatibilty reasons. See
-  # https://bugs.chromium.org/p/webrtc/issues/detail?id=7847
-  "audio_encoder_opus\.h": [
-    "+webrtc/modules/audio_coding/codecs/opus/audio_encoder_opus.h",
-  ],
-
-  # We allow .cc files in webrtc/api/ to #include a bunch of stuff
-  # that's off-limits for the .h files. That's because .h files leak
-  # their #includes to whoever's #including them, but .cc files do not
-  # since no one #includes them.
-  ".*\.cc": [
-    "+webrtc/modules/audio_coding",
-  ],
-
-  ".*i420_buffer\.h": [
-    "+webrtc/system_wrappers/include/aligned_malloc.h",
-  ],
-}
diff --git a/api/OWNERS b/api/OWNERS
deleted file mode 100644
index e00e7d2..0000000
--- a/api/OWNERS
+++ /dev/null
@@ -1,12 +0,0 @@
-pthatcher@webrtc.org
-glaznev@webrtc.org
-juberti@webrtc.org
-perkj@webrtc.org
-solenberg@webrtc.org
-tkchin@webrtc.org
-tommi@webrtc.org
-deadbeef@webrtc.org
-kwiberg@webrtc.org
-
-per-file *.gn=kjellander@webrtc.org
-per-file *.gni=kjellander@webrtc.org
diff --git a/api/array_view.h b/api/array_view.h
deleted file mode 100644
index c97d388..0000000
--- a/api/array_view.h
+++ /dev/null
@@ -1,263 +0,0 @@
-/*
- *  Copyright 2015 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_API_ARRAY_VIEW_H_
-#define WEBRTC_API_ARRAY_VIEW_H_
-
-#include <algorithm>
-#include <type_traits>
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/type_traits.h"
-
-namespace rtc {
-
-// tl;dr: rtc::ArrayView is the same thing as gsl::span from the Guideline
-//        Support Library.
-//
-// Many functions read from or write to arrays. The obvious way to do this is
-// to use two arguments, a pointer to the first element and an element count:
-//
-//   bool Contains17(const int* arr, size_t size) {
-//     for (size_t i = 0; i < size; ++i) {
-//       if (arr[i] == 17)
-//         return true;
-//     }
-//     return false;
-//   }
-//
-// This is flexible, since it doesn't matter how the array is stored (C array,
-// std::vector, rtc::Buffer, ...), but it's error-prone because the caller has
-// to correctly specify the array length:
-//
-//   Contains17(arr, arraysize(arr));     // C array
-//   Contains17(arr.data(), arr.size());  // std::vector
-//   Contains17(arr, size);               // pointer + size
-//   ...
-//
-// It's also kind of messy to have two separate arguments for what is
-// conceptually a single thing.
-//
-// Enter rtc::ArrayView<T>. It contains a T pointer (to an array it doesn't
-// own) and a count, and supports the basic things you'd expect, such as
-// indexing and iteration. It allows us to write our function like this:
-//
-//   bool Contains17(rtc::ArrayView<const int> arr) {
-//     for (auto e : arr) {
-//       if (e == 17)
-//         return true;
-//     }
-//     return false;
-//   }
-//
-// And even better, because a bunch of things will implicitly convert to
-// ArrayView, we can call it like this:
-//
-//   Contains17(arr);                             // C array
-//   Contains17(arr);                             // std::vector
-//   Contains17(rtc::ArrayView<int>(arr, size));  // pointer + size
-//   Contains17(nullptr);                         // nullptr -> empty ArrayView
-//   ...
-//
-// ArrayView<T> stores both a pointer and a size, but you may also use
-// ArrayView<T, N>, which has a size that's fixed at compile time (which means
-// it only has to store the pointer).
-//
-// One important point is that ArrayView<T> and ArrayView<const T> are
-// different types, which allow and don't allow mutation of the array elements,
-// respectively. The implicit conversions work just like you'd hope, so that
-// e.g. vector<int> will convert to either ArrayView<int> or ArrayView<const
-// int>, but const vector<int> will convert only to ArrayView<const int>.
-// (ArrayView itself can be the source type in such conversions, so
-// ArrayView<int> will convert to ArrayView<const int>.)
-//
-// Note: ArrayView is tiny (just a pointer and a count if variable-sized, just
-// a pointer if fix-sized) and trivially copyable, so it's probably cheaper to
-// pass it by value than by const reference.
-
-namespace impl {
-
-// Magic constant for indicating that the size of an ArrayView is variable
-// instead of fixed.
-enum : std::ptrdiff_t { kArrayViewVarSize = -4711 };
-
-// Base class for ArrayViews of fixed nonzero size.
-template <typename T, std::ptrdiff_t Size>
-class ArrayViewBase {
-  static_assert(Size > 0, "ArrayView size must be variable or non-negative");
-
- public:
-  ArrayViewBase(T* data, size_t size) : data_(data) {}
-
-  static constexpr size_t size() { return Size; }
-  static constexpr bool empty() { return false; }
-  T* data() const { return data_; }
-
- protected:
-  static constexpr bool fixed_size() { return true; }
-
- private:
-  T* data_;
-};
-
-// Specialized base class for ArrayViews of fixed zero size.
-template <typename T>
-class ArrayViewBase<T, 0> {
- public:
-  explicit ArrayViewBase(T* data, size_t size) {}
-
-  static constexpr size_t size() { return 0; }
-  static constexpr bool empty() { return true; }
-  T* data() const { return nullptr; }
-
- protected:
-  static constexpr bool fixed_size() { return true; }
-};
-
-// Specialized base class for ArrayViews of variable size.
-template <typename T>
-class ArrayViewBase<T, impl::kArrayViewVarSize> {
- public:
-  ArrayViewBase(T* data, size_t size)
-      : data_(size == 0 ? nullptr : data), size_(size) {}
-
-  size_t size() const { return size_; }
-  bool empty() const { return size_ == 0; }
-  T* data() const { return data_; }
-
- protected:
-  static constexpr bool fixed_size() { return false; }
-
- private:
-  T* data_;
-  size_t size_;
-};
-
-}  // namespace impl
-
-template <typename T, std::ptrdiff_t Size = impl::kArrayViewVarSize>
-class ArrayView final : public impl::ArrayViewBase<T, Size> {
- public:
-  using value_type = T;
-  using const_iterator = const T*;
-
-  // Construct an ArrayView from a pointer and a length.
-  template <typename U>
-  ArrayView(U* data, size_t size)
-      : impl::ArrayViewBase<T, Size>::ArrayViewBase(data, size) {
-    RTC_DCHECK_EQ(size == 0 ? nullptr : data, this->data());
-    RTC_DCHECK_EQ(size, this->size());
-    RTC_DCHECK_EQ(!this->data(),
-                  this->size() == 0);  // data is null iff size == 0.
-  }
-
-  // Construct an empty ArrayView. Note that fixed-size ArrayViews of size > 0
-  // cannot be empty.
-  ArrayView() : ArrayView(nullptr, 0) {}
-  ArrayView(std::nullptr_t)  // NOLINT
-      : ArrayView() {}
-  ArrayView(std::nullptr_t, size_t size)
-      : ArrayView(static_cast<T*>(nullptr), size) {
-    static_assert(Size == 0 || Size == impl::kArrayViewVarSize, "");
-    RTC_DCHECK_EQ(0, size);
-  }
-
-  // Construct an ArrayView from an array.
-  template <typename U, size_t N>
-  ArrayView(U (&array)[N])  // NOLINT
-      : ArrayView(array, N) {
-    static_assert(Size == N || Size == impl::kArrayViewVarSize,
-                  "Array size must match ArrayView size");
-  }
-
-  // (Only if size is fixed.) Construct an ArrayView from any type U that has a
-  // static constexpr size() method whose return value is equal to Size, and a
-  // data() method whose return value converts implicitly to T*. In particular,
-  // this means we allow conversion from ArrayView<T, N> to ArrayView<const T,
-  // N>, but not the other way around. We also don't allow conversion from
-  // ArrayView<T> to ArrayView<T, N>, or from ArrayView<T, M> to ArrayView<T,
-  // N> when M != N.
-  template <
-      typename U,
-      typename std::enable_if<Size != impl::kArrayViewVarSize &&
-                              HasDataAndSize<U, T>::value>::type* = nullptr>
-  ArrayView(U& u)  // NOLINT
-      : ArrayView(u.data(), u.size()) {
-    static_assert(U::size() == Size, "Sizes must match exactly");
-  }
-
-  // (Only if size is variable.) Construct an ArrayView from any type U that
-  // has a size() method whose return value converts implicitly to size_t, and
-  // a data() method whose return value converts implicitly to T*. In
-  // particular, this means we allow conversion from ArrayView<T> to
-  // ArrayView<const T>, but not the other way around. Other allowed
-  // conversions include
-  // ArrayView<T, N> to ArrayView<T> or ArrayView<const T>,
-  // std::vector<T> to ArrayView<T> or ArrayView<const T>,
-  // const std::vector<T> to ArrayView<const T>,
-  // rtc::Buffer to ArrayView<uint8_t> or ArrayView<const uint8_t>, and
-  // const rtc::Buffer to ArrayView<const uint8_t>.
-  template <
-      typename U,
-      typename std::enable_if<Size == impl::kArrayViewVarSize &&
-                              HasDataAndSize<U, T>::value>::type* = nullptr>
-  ArrayView(U& u)  // NOLINT
-      : ArrayView(u.data(), u.size()) {}
-
-  // Indexing and iteration. These allow mutation even if the ArrayView is
-  // const, because the ArrayView doesn't own the array. (To prevent mutation,
-  // use a const element type.)
-  T& operator[](size_t idx) const {
-    RTC_DCHECK_LT(idx, this->size());
-    RTC_DCHECK(this->data());
-    return this->data()[idx];
-  }
-  T* begin() const { return this->data(); }
-  T* end() const { return this->data() + this->size(); }
-  const T* cbegin() const { return this->data(); }
-  const T* cend() const { return this->data() + this->size(); }
-
-  ArrayView<T> subview(size_t offset, size_t size) const {
-    return offset < this->size()
-               ? ArrayView<T>(this->data() + offset,
-                              std::min(size, this->size() - offset))
-               : ArrayView<T>();
-  }
-  ArrayView<T> subview(size_t offset) const {
-    return subview(offset, this->size());
-  }
-};
-
-// Comparing two ArrayViews compares their (pointer,size) pairs; it does *not*
-// dereference the pointers.
-template <typename T, std::ptrdiff_t Size1, std::ptrdiff_t Size2>
-bool operator==(const ArrayView<T, Size1>& a, const ArrayView<T, Size2>& b) {
-  return a.data() == b.data() && a.size() == b.size();
-}
-template <typename T, std::ptrdiff_t Size1, std::ptrdiff_t Size2>
-bool operator!=(const ArrayView<T, Size1>& a, const ArrayView<T, Size2>& b) {
-  return !(a == b);
-}
-
-// Variable-size ArrayViews are the size of two pointers; fixed-size ArrayViews
-// are the size of one pointer. (And as a special case, fixed-size ArrayViews
-// of size 0 require no storage.)
-static_assert(sizeof(ArrayView<int>) == 2 * sizeof(int*), "");
-static_assert(sizeof(ArrayView<int, 17>) == sizeof(int*), "");
-static_assert(std::is_empty<ArrayView<int, 0>>::value, "");
-
-template <typename T>
-inline ArrayView<T> MakeArrayView(T* data, size_t size) {
-  return ArrayView<T>(data, size);
-}
-
-}  // namespace rtc
-
-#endif  // WEBRTC_API_ARRAY_VIEW_H_
diff --git a/api/array_view_unittest.cc b/api/array_view_unittest.cc
deleted file mode 100644
index b19abc1..0000000
--- a/api/array_view_unittest.cc
+++ /dev/null
@@ -1,412 +0,0 @@
-/*
- *  Copyright 2015 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 <algorithm>
-#include <string>
-#include <utility>
-#include <vector>
-
-#include "webrtc/api/array_view.h"
-#include "webrtc/rtc_base/buffer.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/gunit.h"
-#include "webrtc/test/gmock.h"
-
-namespace rtc {
-
-namespace {
-
-using ::testing::ElementsAre;
-using ::testing::IsEmpty;
-
-template <typename T>
-void Call(ArrayView<T>) {}
-
-}  // namespace
-
-TEST(ArrayViewTest, TestConstructFromPtrAndArray) {
-  char arr[] = "Arrr!";
-  const char carr[] = "Carrr!";
-  Call<const char>(arr);
-  Call<const char>(carr);
-  Call<char>(arr);
-  // Call<char>(carr);  // Compile error, because can't drop const.
-  // Call<int>(arr);  // Compile error, because incompatible types.
-  ArrayView<int*> x;
-  EXPECT_EQ(0u, x.size());
-  EXPECT_EQ(nullptr, x.data());
-  ArrayView<char> y = arr;
-  EXPECT_EQ(6u, y.size());
-  EXPECT_EQ(arr, y.data());
-  ArrayView<char, 6> yf = arr;
-  static_assert(yf.size() == 6, "");
-  EXPECT_EQ(arr, yf.data());
-  ArrayView<const char> z(arr + 1, 3);
-  EXPECT_EQ(3u, z.size());
-  EXPECT_EQ(arr + 1, z.data());
-  ArrayView<const char, 3> zf(arr + 1, 3);
-  static_assert(zf.size() == 3, "");
-  EXPECT_EQ(arr + 1, zf.data());
-  ArrayView<const char> w(arr, 2);
-  EXPECT_EQ(2u, w.size());
-  EXPECT_EQ(arr, w.data());
-  ArrayView<const char, 2> wf(arr, 2);
-  static_assert(wf.size() == 2, "");
-  EXPECT_EQ(arr, wf.data());
-  ArrayView<char> q(arr, 0);
-  EXPECT_EQ(0u, q.size());
-  EXPECT_EQ(nullptr, q.data());
-  ArrayView<char, 0> qf(arr, 0);
-  static_assert(qf.size() == 0, "");
-  EXPECT_EQ(nullptr, qf.data());
-#if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
-  // DCHECK error (nullptr with nonzero size).
-  EXPECT_DEATH(ArrayView<int>(static_cast<int*>(nullptr), 5), "");
-#endif
-  // These are compile errors, because incompatible types.
-  // ArrayView<int> m = arr;
-  // ArrayView<float> n(arr + 2, 2);
-}
-
-TEST(ArrayViewTest, TestCopyConstructorVariable) {
-  char arr[] = "Arrr!";
-  ArrayView<char> x = arr;
-  EXPECT_EQ(6u, x.size());
-  EXPECT_EQ(arr, x.data());
-  ArrayView<char> y = x;  // Copy non-const -> non-const.
-  EXPECT_EQ(6u, y.size());
-  EXPECT_EQ(arr, y.data());
-  ArrayView<const char> z = x;  // Copy non-const -> const.
-  EXPECT_EQ(6u, z.size());
-  EXPECT_EQ(arr, z.data());
-  ArrayView<const char> w = z;  // Copy const -> const.
-  EXPECT_EQ(6u, w.size());
-  EXPECT_EQ(arr, w.data());
-  // ArrayView<char> v = z;  // Compile error, because can't drop const.
-}
-
-TEST(ArrayViewTest, TestCopyConstructorFixed) {
-  char arr[] = "Arrr!";
-  ArrayView<char, 6> x = arr;
-  static_assert(x.size() == 6, "");
-  EXPECT_EQ(arr, x.data());
-
-  // Copy fixed -> fixed.
-  ArrayView<char, 6> y = x;  // Copy non-const -> non-const.
-  static_assert(y.size() == 6, "");
-  EXPECT_EQ(arr, y.data());
-  ArrayView<const char, 6> z = x;  // Copy non-const -> const.
-  static_assert(z.size() == 6, "");
-  EXPECT_EQ(arr, z.data());
-  ArrayView<const char, 6> w = z;  // Copy const -> const.
-  static_assert(w.size() == 6, "");
-  EXPECT_EQ(arr, w.data());
-  // ArrayView<char, 6> v = z;  // Compile error, because can't drop const.
-
-  // Copy fixed -> variable.
-  ArrayView<char> yv = x;  // Copy non-const -> non-const.
-  EXPECT_EQ(6u, yv.size());
-  EXPECT_EQ(arr, yv.data());
-  ArrayView<const char> zv = x;  // Copy non-const -> const.
-  EXPECT_EQ(6u, zv.size());
-  EXPECT_EQ(arr, zv.data());
-  ArrayView<const char> wv = z;  // Copy const -> const.
-  EXPECT_EQ(6u, wv.size());
-  EXPECT_EQ(arr, wv.data());
-  // ArrayView<char> vv = z;  // Compile error, because can't drop const.
-}
-
-TEST(ArrayViewTest, TestCopyAssignmentVariable) {
-  char arr[] = "Arrr!";
-  ArrayView<char> x(arr);
-  EXPECT_EQ(6u, x.size());
-  EXPECT_EQ(arr, x.data());
-  ArrayView<char> y;
-  y = x;  // Copy non-const -> non-const.
-  EXPECT_EQ(6u, y.size());
-  EXPECT_EQ(arr, y.data());
-  ArrayView<const char> z;
-  z = x;  // Copy non-const -> const.
-  EXPECT_EQ(6u, z.size());
-  EXPECT_EQ(arr, z.data());
-  ArrayView<const char> w;
-  w = z;  // Copy const -> const.
-  EXPECT_EQ(6u, w.size());
-  EXPECT_EQ(arr, w.data());
-  // ArrayView<char> v;
-  // v = z;  // Compile error, because can't drop const.
-}
-
-TEST(ArrayViewTest, TestCopyAssignmentFixed) {
-  char arr[] = "Arrr!";
-  char init[] = "Init!";
-  ArrayView<char, 6> x(arr);
-  EXPECT_EQ(arr, x.data());
-
-  // Copy fixed -> fixed.
-  ArrayView<char, 6> y(init);
-  y = x;  // Copy non-const -> non-const.
-  EXPECT_EQ(arr, y.data());
-  ArrayView<const char, 6> z(init);
-  z = x;  // Copy non-const -> const.
-  EXPECT_EQ(arr, z.data());
-  ArrayView<const char, 6> w(init);
-  w = z;  // Copy const -> const.
-  EXPECT_EQ(arr, w.data());
-  // ArrayView<char, 6> v(init);
-  // v = z;  // Compile error, because can't drop const.
-
-  // Copy fixed -> variable.
-  ArrayView<char> yv;
-  yv = x;  // Copy non-const -> non-const.
-  EXPECT_EQ(6u, yv.size());
-  EXPECT_EQ(arr, yv.data());
-  ArrayView<const char> zv;
-  zv = x;  // Copy non-const -> const.
-  EXPECT_EQ(6u, zv.size());
-  EXPECT_EQ(arr, zv.data());
-  ArrayView<const char> wv;
-  wv = z;  // Copy const -> const.
-  EXPECT_EQ(6u, wv.size());
-  EXPECT_EQ(arr, wv.data());
-  // ArrayView<char> v;
-  // v = z;  // Compile error, because can't drop const.
-}
-
-TEST(ArrayViewTest, TestStdVector) {
-  std::vector<int> v;
-  v.push_back(3);
-  v.push_back(11);
-  Call<const int>(v);
-  Call<int>(v);
-  // Call<unsigned int>(v);  // Compile error, because incompatible types.
-  ArrayView<int> x = v;
-  EXPECT_EQ(2u, x.size());
-  EXPECT_EQ(v.data(), x.data());
-  ArrayView<const int> y;
-  y = v;
-  EXPECT_EQ(2u, y.size());
-  EXPECT_EQ(v.data(), y.data());
-  // ArrayView<double> d = v;  // Compile error, because incompatible types.
-  const std::vector<int> cv;
-  Call<const int>(cv);
-  // Call<int>(cv);  // Compile error, because can't drop const.
-  ArrayView<const int> z = cv;
-  EXPECT_EQ(0u, z.size());
-  EXPECT_EQ(nullptr, z.data());
-  // ArrayView<int> w = cv;  // Compile error, because can't drop const.
-}
-
-TEST(ArrayViewTest, TestRtcBuffer) {
-  rtc::Buffer b = "so buffer";
-  Call<const uint8_t>(b);
-  Call<uint8_t>(b);
-  // Call<int8_t>(b);  // Compile error, because incompatible types.
-  ArrayView<uint8_t> x = b;
-  EXPECT_EQ(10u, x.size());
-  EXPECT_EQ(b.data(), x.data());
-  ArrayView<const uint8_t> y;
-  y = b;
-  EXPECT_EQ(10u, y.size());
-  EXPECT_EQ(b.data(), y.data());
-  // ArrayView<char> d = b;  // Compile error, because incompatible types.
-  const rtc::Buffer cb = "very const";
-  Call<const uint8_t>(cb);
-  // Call<uint8_t>(cb);  // Compile error, because can't drop const.
-  ArrayView<const uint8_t> z = cb;
-  EXPECT_EQ(11u, z.size());
-  EXPECT_EQ(cb.data(), z.data());
-  // ArrayView<uint8_t> w = cb;  // Compile error, because can't drop const.
-}
-
-TEST(ArrayViewTest, TestSwapVariable) {
-  const char arr[] = "Arrr!";
-  const char aye[] = "Aye, Cap'n!";
-  ArrayView<const char> x(arr);
-  EXPECT_EQ(6u, x.size());
-  EXPECT_EQ(arr, x.data());
-  ArrayView<const char> y(aye);
-  EXPECT_EQ(12u, y.size());
-  EXPECT_EQ(aye, y.data());
-  using std::swap;
-  swap(x, y);
-  EXPECT_EQ(12u, x.size());
-  EXPECT_EQ(aye, x.data());
-  EXPECT_EQ(6u, y.size());
-  EXPECT_EQ(arr, y.data());
-  // ArrayView<char> z;
-  // swap(x, z);  // Compile error, because can't drop const.
-}
-
-TEST(FixArrayViewTest, TestSwapFixed) {
-  const char arr[] = "Arr!";
-  char aye[] = "Aye!";
-  ArrayView<const char, 5> x(arr);
-  EXPECT_EQ(arr, x.data());
-  ArrayView<const char, 5> y(aye);
-  EXPECT_EQ(aye, y.data());
-  using std::swap;
-  swap(x, y);
-  EXPECT_EQ(aye, x.data());
-  EXPECT_EQ(arr, y.data());
-  // ArrayView<char, 5> z(aye);
-  // swap(x, z);  // Compile error, because can't drop const.
-  // ArrayView<const char, 4> w(aye, 4);
-  // swap(x, w);  // Compile error, because different sizes.
-}
-
-TEST(ArrayViewTest, TestIndexing) {
-  char arr[] = "abcdefg";
-  ArrayView<char> x(arr);
-  const ArrayView<char> y(arr);
-  ArrayView<const char, 8> z(arr);
-  EXPECT_EQ(8u, x.size());
-  EXPECT_EQ(8u, y.size());
-  EXPECT_EQ(8u, z.size());
-  EXPECT_EQ('b', x[1]);
-  EXPECT_EQ('c', y[2]);
-  EXPECT_EQ('d', z[3]);
-  x[3] = 'X';
-  y[2] = 'Y';
-  // z[1] = 'Z';  // Compile error, because z's element type is const char.
-  EXPECT_EQ('b', x[1]);
-  EXPECT_EQ('Y', y[2]);
-  EXPECT_EQ('X', z[3]);
-#if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
-  EXPECT_DEATH(z[8], "");  // DCHECK error (index out of bounds).
-#endif
-}
-
-TEST(ArrayViewTest, TestIterationEmpty) {
-  // Variable-size.
-  ArrayView<std::vector<std::vector<std::vector<std::string>>>> av;
-  EXPECT_EQ(av.begin(), av.end());
-  EXPECT_EQ(av.cbegin(), av.cend());
-  for (auto& e : av) {
-    EXPECT_TRUE(false);
-    EXPECT_EQ(42u, e.size());  // Dummy use of e to prevent unused var warning.
-  }
-
-  // Fixed-size.
-  ArrayView<std::vector<std::vector<std::vector<std::string>>>, 0> af;
-  EXPECT_EQ(af.begin(), af.end());
-  EXPECT_EQ(af.cbegin(), af.cend());
-  for (auto& e : af) {
-    EXPECT_TRUE(false);
-    EXPECT_EQ(42u, e.size());  // Dummy use of e to prevent unused var warning.
-  }
-}
-
-TEST(ArrayViewTest, TestIterationVariable) {
-  char arr[] = "Arrr!";
-  ArrayView<char> av(arr);
-  EXPECT_EQ('A', *av.begin());
-  EXPECT_EQ('A', *av.cbegin());
-  EXPECT_EQ('\0', *(av.end() - 1));
-  EXPECT_EQ('\0', *(av.cend() - 1));
-  char i = 0;
-  for (auto& e : av) {
-    EXPECT_EQ(arr + i, &e);
-    e = 's' + i;
-    ++i;
-  }
-  i = 0;
-  for (auto& e : ArrayView<const char>(av)) {
-    EXPECT_EQ(arr + i, &e);
-    // e = 'q' + i;  // Compile error, because e is a const char&.
-    ++i;
-  }
-}
-
-TEST(ArrayViewTest, TestIterationFixed) {
-  char arr[] = "Arrr!";
-  ArrayView<char, 6> av(arr);
-  EXPECT_EQ('A', *av.begin());
-  EXPECT_EQ('A', *av.cbegin());
-  EXPECT_EQ('\0', *(av.end() - 1));
-  EXPECT_EQ('\0', *(av.cend() - 1));
-  char i = 0;
-  for (auto& e : av) {
-    EXPECT_EQ(arr + i, &e);
-    e = 's' + i;
-    ++i;
-  }
-  i = 0;
-  for (auto& e : ArrayView<const char, 6>(av)) {
-    EXPECT_EQ(arr + i, &e);
-    // e = 'q' + i;  // Compile error, because e is a const char&.
-    ++i;
-  }
-}
-
-TEST(ArrayViewTest, TestEmpty) {
-  EXPECT_TRUE(ArrayView<int>().empty());
-  const int a[] = {1, 2, 3};
-  EXPECT_FALSE(ArrayView<const int>(a).empty());
-
-  static_assert(ArrayView<int, 0>::empty(), "");
-  static_assert(!ArrayView<int, 3>::empty(), "");
-}
-
-TEST(ArrayViewTest, TestCompare) {
-  int a[] = {1, 2, 3};
-  int b[] = {1, 2, 3};
-
-  EXPECT_EQ(ArrayView<int>(a), ArrayView<int>(a));
-  EXPECT_EQ((ArrayView<int, 3>(a)), (ArrayView<int, 3>(a)));
-  EXPECT_EQ(ArrayView<int>(a), (ArrayView<int, 3>(a)));
-  EXPECT_EQ(ArrayView<int>(), ArrayView<int>());
-  EXPECT_EQ(ArrayView<int>(), ArrayView<int>(a, 0));
-  EXPECT_EQ(ArrayView<int>(a, 0), ArrayView<int>(b, 0));
-  EXPECT_EQ((ArrayView<int, 0>(a, 0)), ArrayView<int>());
-
-  EXPECT_NE(ArrayView<int>(a), ArrayView<int>(b));
-  EXPECT_NE((ArrayView<int, 3>(a)), (ArrayView<int, 3>(b)));
-  EXPECT_NE((ArrayView<int, 3>(a)), ArrayView<int>(b));
-  EXPECT_NE(ArrayView<int>(a), ArrayView<int>());
-  EXPECT_NE(ArrayView<int>(a), ArrayView<int>(a, 2));
-  EXPECT_NE((ArrayView<int, 3>(a)), (ArrayView<int, 2>(a, 2)));
-}
-
-TEST(ArrayViewTest, TestSubViewVariable) {
-  int a[] = {1, 2, 3};
-  ArrayView<int> av(a);
-
-  EXPECT_EQ(av.subview(0), av);
-
-  EXPECT_THAT(av.subview(1), ElementsAre(2, 3));
-  EXPECT_THAT(av.subview(2), ElementsAre(3));
-  EXPECT_THAT(av.subview(3), IsEmpty());
-  EXPECT_THAT(av.subview(4), IsEmpty());
-
-  EXPECT_THAT(av.subview(1, 0), IsEmpty());
-  EXPECT_THAT(av.subview(1, 1), ElementsAre(2));
-  EXPECT_THAT(av.subview(1, 2), ElementsAre(2, 3));
-  EXPECT_THAT(av.subview(1, 3), ElementsAre(2, 3));
-}
-
-TEST(ArrayViewTest, TestSubViewFixed) {
-  int a[] = {1, 2, 3};
-  ArrayView<int, 3> av(a);
-
-  EXPECT_EQ(av.subview(0), av);
-
-  EXPECT_THAT(av.subview(1), ElementsAre(2, 3));
-  EXPECT_THAT(av.subview(2), ElementsAre(3));
-  EXPECT_THAT(av.subview(3), IsEmpty());
-  EXPECT_THAT(av.subview(4), IsEmpty());
-
-  EXPECT_THAT(av.subview(1, 0), IsEmpty());
-  EXPECT_THAT(av.subview(1, 1), ElementsAre(2));
-  EXPECT_THAT(av.subview(1, 2), ElementsAre(2, 3));
-  EXPECT_THAT(av.subview(1, 3), ElementsAre(2, 3));
-}
-
-}  // namespace rtc
diff --git a/api/audio/audio_mixer.h b/api/audio/audio_mixer.h
deleted file mode 100644
index d1abf9a..0000000
--- a/api/audio/audio_mixer.h
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- *  Copyright (c) 2011 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_API_AUDIO_AUDIO_MIXER_H_
-#define WEBRTC_API_AUDIO_AUDIO_MIXER_H_
-
-#include <memory>
-
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/rtc_base/refcount.h"
-
-namespace webrtc {
-
-// WORK IN PROGRESS
-// This class is under development and is not yet intended for for use outside
-// of WebRtc/Libjingle.
-class AudioMixer : public rtc::RefCountInterface {
- public:
-  // A callback class that all mixer participants must inherit from/implement.
-  class Source {
-   public:
-    enum class AudioFrameInfo {
-      kNormal,  // The samples in audio_frame are valid and should be used.
-      kMuted,   // The samples in audio_frame should not be used, but
-                // should be implicitly interpreted as zero. Other
-                // fields in audio_frame may be read and should
-                // contain meaningful values.
-      kError,   // The audio_frame will not be used.
-    };
-
-    // Overwrites |audio_frame|. The data_ field is overwritten with
-    // 10 ms of new audio (either 1 or 2 interleaved channels) at
-    // |sample_rate_hz|. All fields in |audio_frame| must be updated.
-    virtual AudioFrameInfo GetAudioFrameWithInfo(int sample_rate_hz,
-                                                 AudioFrame* audio_frame) = 0;
-
-    // A way for a mixer implementation to distinguish participants.
-    virtual int Ssrc() const = 0;
-
-    // A way for this source to say that GetAudioFrameWithInfo called
-    // with this sample rate or higher will not cause quality loss.
-    virtual int PreferredSampleRate() const = 0;
-
-    virtual ~Source() {}
-  };
-
-  // Returns true if adding was successful. A source is never added
-  // twice. Addition and removal can happen on different threads.
-  virtual bool AddSource(Source* audio_source) = 0;
-
-  // Removal is never attempted if a source has not been successfully
-  // added to the mixer.
-  virtual void RemoveSource(Source* audio_source) = 0;
-
-  // Performs mixing by asking registered audio sources for audio. The
-  // mixed result is placed in the provided AudioFrame. This method
-  // will only be called from a single thread. The channels argument
-  // specifies the number of channels of the mix result. The mixer
-  // should mix at a rate that doesn't cause quality loss of the
-  // sources' audio. The mixing rate is one of the rates listed in
-  // AudioProcessing::NativeRate. All fields in
-  // |audio_frame_for_mixing| must be updated.
-  virtual void Mix(size_t number_of_channels,
-                   AudioFrame* audio_frame_for_mixing) = 0;
-
- protected:
-  // Since the mixer is reference counted, the destructor may be
-  // called from any thread.
-  ~AudioMixer() override {}
-};
-}  // namespace webrtc
-
-#endif  // WEBRTC_API_AUDIO_AUDIO_MIXER_H_
diff --git a/api/audio_codecs/BUILD.gn b/api/audio_codecs/BUILD.gn
deleted file mode 100644
index 04a5238..0000000
--- a/api/audio_codecs/BUILD.gn
+++ /dev/null
@@ -1,132 +0,0 @@
-# Copyright (c) 2017 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.
-
-import("../../webrtc.gni")
-if (is_android) {
-  import("//build/config/android/config.gni")
-  import("//build/config/android/rules.gni")
-}
-
-rtc_source_set("audio_codecs_api") {
-  sources = [
-    "audio_decoder.cc",
-    "audio_decoder.h",
-    "audio_decoder_factory.h",
-    "audio_decoder_factory_template.h",
-    "audio_encoder.cc",
-    "audio_encoder.h",
-    "audio_encoder_factory.h",
-    "audio_encoder_factory_template.h",
-    "audio_format.cc",
-    "audio_format.h",
-  ]
-  deps = [
-    "..:array_view",
-    "..:optional",
-    "../..:webrtc_common",
-    "../../rtc_base:rtc_base_approved",
-  ]
-}
-
-rtc_static_library("builtin_audio_decoder_factory") {
-  sources = [
-    "builtin_audio_decoder_factory.cc",
-    "builtin_audio_decoder_factory.h",
-  ]
-  deps = [
-    ":audio_codecs_api",
-    "../../rtc_base:rtc_base_approved",
-    "L16:audio_decoder_L16",
-    "g711:audio_decoder_g711",
-  ]
-  defines = []
-  if (rtc_include_ilbc) {
-    deps += [ "ilbc:audio_decoder_ilbc" ]
-    defines += [ "WEBRTC_USE_BUILTIN_ILBC=1" ]
-  } else {
-    defines += [ "WEBRTC_USE_BUILTIN_ILBC=0" ]
-  }
-  if (rtc_include_opus) {
-    deps += [ "opus:audio_decoder_opus" ]
-    defines += [ "WEBRTC_USE_BUILTIN_OPUS=1" ]
-  } else {
-    defines += [ "WEBRTC_USE_BUILTIN_OPUS=0" ]
-  }
-  if (build_with_mozilla) {
-    defines += [
-      "WEBRTC_USE_BUILTIN_G722=0",
-      "WEBRTC_USE_BUILTIN_ISAC_FIX=0",
-      "WEBRTC_USE_BUILTIN_ISAC_FLOAT=0",
-    ]
-  } else {
-    if (current_cpu == "arm") {
-      deps += [ "isac:audio_decoder_isac_fix" ]
-      defines += [
-        "WEBRTC_USE_BUILTIN_ISAC_FIX=1",
-        "WEBRTC_USE_BUILTIN_ISAC_FLOAT=0",
-      ]
-    } else {
-      deps += [ "isac:audio_decoder_isac_float" ]
-      defines += [
-        "WEBRTC_USE_BUILTIN_ISAC_FIX=0",
-        "WEBRTC_USE_BUILTIN_ISAC_FLOAT=1",
-      ]
-    }
-    deps += [ "g722:audio_decoder_g722" ]
-    defines += [ "WEBRTC_USE_BUILTIN_G722=1" ]
-  }
-}
-
-rtc_static_library("builtin_audio_encoder_factory") {
-  sources = [
-    "builtin_audio_encoder_factory.cc",
-    "builtin_audio_encoder_factory.h",
-  ]
-  deps = [
-    ":audio_codecs_api",
-    "../../rtc_base:rtc_base_approved",
-    "L16:audio_encoder_L16",
-    "g711:audio_encoder_g711",
-  ]
-  defines = []
-  if (rtc_include_ilbc) {
-    deps += [ "ilbc:audio_encoder_ilbc" ]
-    defines += [ "WEBRTC_USE_BUILTIN_ILBC=1" ]
-  } else {
-    defines += [ "WEBRTC_USE_BUILTIN_ILBC=0" ]
-  }
-  if (rtc_include_opus) {
-    deps += [ "opus:audio_encoder_opus" ]
-    defines += [ "WEBRTC_USE_BUILTIN_OPUS=1" ]
-  } else {
-    defines += [ "WEBRTC_USE_BUILTIN_OPUS=0" ]
-  }
-  if (build_with_mozilla) {
-    defines += [
-      "WEBRTC_USE_BUILTIN_G722=0",
-      "WEBRTC_USE_BUILTIN_ISAC_FIX=0",
-      "WEBRTC_USE_BUILTIN_ISAC_FLOAT=0",
-    ]
-  } else {
-    if (current_cpu == "arm") {
-      deps += [ "isac:audio_encoder_isac_fix" ]
-      defines += [
-        "WEBRTC_USE_BUILTIN_ISAC_FIX=1",
-        "WEBRTC_USE_BUILTIN_ISAC_FLOAT=0",
-      ]
-    } else {
-      deps += [ "isac:audio_encoder_isac_float" ]
-      defines += [
-        "WEBRTC_USE_BUILTIN_ISAC_FIX=0",
-        "WEBRTC_USE_BUILTIN_ISAC_FLOAT=1",
-      ]
-    }
-    deps += [ "g722:audio_encoder_g722" ]
-    defines += [ "WEBRTC_USE_BUILTIN_G722=1" ]
-  }
-}
diff --git a/api/audio_codecs/L16/BUILD.gn b/api/audio_codecs/L16/BUILD.gn
deleted file mode 100644
index 8f06a8f..0000000
--- a/api/audio_codecs/L16/BUILD.gn
+++ /dev/null
@@ -1,41 +0,0 @@
-# Copyright (c) 2017 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.
-
-import("../../../webrtc.gni")
-if (is_android) {
-  import("//build/config/android/config.gni")
-  import("//build/config/android/rules.gni")
-}
-
-rtc_static_library("audio_encoder_L16") {
-  sources = [
-    "audio_encoder_L16.cc",
-    "audio_encoder_L16.h",
-  ]
-  deps = [
-    "..:audio_codecs_api",
-    "../..:optional",
-    "../../..:webrtc_common",
-    "../../../modules/audio_coding:pcm16b",
-    "../../../rtc_base:rtc_base_approved",
-  ]
-}
-
-rtc_static_library("audio_decoder_L16") {
-  sources = [
-    "audio_decoder_L16.cc",
-    "audio_decoder_L16.h",
-  ]
-  deps = [
-    "..:audio_codecs_api",
-    "../..:optional",
-    "../../..:webrtc_common",
-    "../../../modules/audio_coding:pcm16b",
-    "../../../rtc_base:rtc_base_approved",
-  ]
-}
diff --git a/api/audio_codecs/L16/audio_decoder_L16.cc b/api/audio_codecs/L16/audio_decoder_L16.cc
deleted file mode 100644
index b5a64d8..0000000
--- a/api/audio_codecs/L16/audio_decoder_L16.cc
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- *  Copyright (c) 2017 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/api/audio_codecs/L16/audio_decoder_L16.h"
-
-#include "webrtc/common_types.h"
-#include "webrtc/modules/audio_coding/codecs/pcm16b/audio_decoder_pcm16b.h"
-#include "webrtc/modules/audio_coding/codecs/pcm16b/pcm16b_common.h"
-#include "webrtc/rtc_base/ptr_util.h"
-#include "webrtc/rtc_base/safe_conversions.h"
-
-namespace webrtc {
-
-rtc::Optional<AudioDecoderL16::Config> AudioDecoderL16::SdpToConfig(
-    const SdpAudioFormat& format) {
-  Config config;
-  config.sample_rate_hz = format.clockrate_hz;
-  config.num_channels = rtc::checked_cast<int>(format.num_channels);
-  return STR_CASE_CMP(format.name.c_str(), "L16") == 0 && config.IsOk()
-             ? rtc::Optional<Config>(config)
-             : rtc::Optional<Config>();
-}
-
-void AudioDecoderL16::AppendSupportedDecoders(
-    std::vector<AudioCodecSpec>* specs) {
-  Pcm16BAppendSupportedCodecSpecs(specs);
-}
-
-std::unique_ptr<AudioDecoder> AudioDecoderL16::MakeAudioDecoder(
-    const Config& config) {
-  return config.IsOk() ? rtc::MakeUnique<AudioDecoderPcm16B>(
-                             config.sample_rate_hz, config.num_channels)
-                       : nullptr;
-}
-
-}  // namespace webrtc
diff --git a/api/audio_codecs/L16/audio_decoder_L16.h b/api/audio_codecs/L16/audio_decoder_L16.h
deleted file mode 100644
index 39b389a..0000000
--- a/api/audio_codecs/L16/audio_decoder_L16.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- *  Copyright (c) 2017 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_API_AUDIO_CODECS_L16_AUDIO_DECODER_L16_H_
-#define WEBRTC_API_AUDIO_CODECS_L16_AUDIO_DECODER_L16_H_
-
-#include <memory>
-#include <vector>
-
-#include "webrtc/api/audio_codecs/audio_decoder.h"
-#include "webrtc/api/audio_codecs/audio_format.h"
-#include "webrtc/api/optional.h"
-
-namespace webrtc {
-
-// L16 decoder API for use as a template parameter to
-// CreateAudioDecoderFactory<...>().
-//
-// NOTE: This struct is still under development and may change without notice.
-struct AudioDecoderL16 {
-  struct Config {
-    bool IsOk() const {
-      return (sample_rate_hz == 8000 || sample_rate_hz == 16000 ||
-              sample_rate_hz == 32000 || sample_rate_hz == 48000) &&
-             num_channels >= 1;
-    }
-    int sample_rate_hz = 8000;
-    int num_channels = 1;
-  };
-  static rtc::Optional<Config> SdpToConfig(const SdpAudioFormat& audio_format);
-  static void AppendSupportedDecoders(std::vector<AudioCodecSpec>* specs);
-  static std::unique_ptr<AudioDecoder> MakeAudioDecoder(const Config& config);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_API_AUDIO_CODECS_L16_AUDIO_DECODER_L16_H_
diff --git a/api/audio_codecs/L16/audio_encoder_L16.cc b/api/audio_codecs/L16/audio_encoder_L16.cc
deleted file mode 100644
index 99af03d..0000000
--- a/api/audio_codecs/L16/audio_encoder_L16.cc
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- *  Copyright (c) 2017 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/api/audio_codecs/L16/audio_encoder_L16.h"
-
-#include "webrtc/common_types.h"
-#include "webrtc/modules/audio_coding/codecs/pcm16b/audio_encoder_pcm16b.h"
-#include "webrtc/modules/audio_coding/codecs/pcm16b/pcm16b_common.h"
-#include "webrtc/rtc_base/ptr_util.h"
-#include "webrtc/rtc_base/safe_conversions.h"
-
-namespace webrtc {
-
-rtc::Optional<AudioEncoderL16::Config> AudioEncoderL16::SdpToConfig(
-    const SdpAudioFormat& format) {
-  if (!rtc::IsValueInRangeForNumericType<int>(format.num_channels)) {
-    return rtc::Optional<Config>();
-  }
-  Config config;
-  config.sample_rate_hz = format.clockrate_hz;
-  config.num_channels = rtc::dchecked_cast<int>(format.num_channels);
-  return STR_CASE_CMP(format.name.c_str(), "L16") == 0 && config.IsOk()
-             ? rtc::Optional<Config>(config)
-             : rtc::Optional<Config>();
-}
-
-void AudioEncoderL16::AppendSupportedEncoders(
-    std::vector<AudioCodecSpec>* specs) {
-  Pcm16BAppendSupportedCodecSpecs(specs);
-}
-
-AudioCodecInfo AudioEncoderL16::QueryAudioEncoder(
-    const AudioEncoderL16::Config& config) {
-  RTC_DCHECK(config.IsOk());
-  return {config.sample_rate_hz,
-          rtc::dchecked_cast<size_t>(config.num_channels),
-          config.sample_rate_hz * config.num_channels * 16};
-}
-
-std::unique_ptr<AudioEncoder> AudioEncoderL16::MakeAudioEncoder(
-    const AudioEncoderL16::Config& config,
-    int payload_type) {
-  RTC_DCHECK(config.IsOk());
-  AudioEncoderPcm16B::Config c;
-  c.sample_rate_hz = config.sample_rate_hz;
-  c.num_channels = config.num_channels;
-  c.frame_size_ms = config.frame_size_ms;
-  c.payload_type = payload_type;
-  return rtc::MakeUnique<AudioEncoderPcm16B>(c);
-}
-
-}  // namespace webrtc
diff --git a/api/audio_codecs/L16/audio_encoder_L16.h b/api/audio_codecs/L16/audio_encoder_L16.h
deleted file mode 100644
index 3ac0423..0000000
--- a/api/audio_codecs/L16/audio_encoder_L16.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- *  Copyright (c) 2017 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_API_AUDIO_CODECS_L16_AUDIO_ENCODER_L16_H_
-#define WEBRTC_API_AUDIO_CODECS_L16_AUDIO_ENCODER_L16_H_
-
-#include <memory>
-#include <vector>
-
-#include "webrtc/api/audio_codecs/audio_encoder.h"
-#include "webrtc/api/audio_codecs/audio_format.h"
-#include "webrtc/api/optional.h"
-
-namespace webrtc {
-
-// L16 encoder API for use as a template parameter to
-// CreateAudioEncoderFactory<...>().
-//
-// NOTE: This struct is still under development and may change without notice.
-struct AudioEncoderL16 {
-  struct Config {
-    bool IsOk() const {
-      return (sample_rate_hz == 8000 || sample_rate_hz == 16000 ||
-              sample_rate_hz == 32000 || sample_rate_hz == 48000) &&
-             num_channels >= 1 && frame_size_ms > 0 && frame_size_ms <= 120 &&
-             frame_size_ms % 10 == 0;
-    }
-    int sample_rate_hz = 8000;
-    int num_channels = 1;
-    int frame_size_ms = 10;
-  };
-  static rtc::Optional<Config> SdpToConfig(const SdpAudioFormat& audio_format);
-  static void AppendSupportedEncoders(std::vector<AudioCodecSpec>* specs);
-  static AudioCodecInfo QueryAudioEncoder(const Config& config);
-  static std::unique_ptr<AudioEncoder> MakeAudioEncoder(const Config& config,
-                                                        int payload_type);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_API_AUDIO_CODECS_L16_AUDIO_ENCODER_L16_H_
diff --git a/api/audio_codecs/OWNERS b/api/audio_codecs/OWNERS
deleted file mode 100644
index a52dd93..0000000
--- a/api/audio_codecs/OWNERS
+++ /dev/null
@@ -1,2 +0,0 @@
-kwiberg@webrtc.org
-ossu@webrtc.org
diff --git a/api/audio_codecs/audio_decoder.cc b/api/audio_codecs/audio_decoder.cc
deleted file mode 100644
index b25e85b..0000000
--- a/api/audio_codecs/audio_decoder.cc
+++ /dev/null
@@ -1,169 +0,0 @@
-/*
- *  Copyright (c) 2012 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/api/audio_codecs/audio_decoder.h"
-
-#include <assert.h>
-#include <memory>
-#include <utility>
-
-#include "webrtc/api/array_view.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/sanitizer.h"
-#include "webrtc/rtc_base/trace_event.h"
-
-namespace webrtc {
-
-namespace {
-
-class OldStyleEncodedFrame final : public AudioDecoder::EncodedAudioFrame {
- public:
-  OldStyleEncodedFrame(AudioDecoder* decoder, rtc::Buffer&& payload)
-      : decoder_(decoder), payload_(std::move(payload)) {}
-
-  size_t Duration() const override {
-    const int ret = decoder_->PacketDuration(payload_.data(), payload_.size());
-    return ret < 0 ? 0 : static_cast<size_t>(ret);
-  }
-
-  rtc::Optional<DecodeResult> Decode(
-      rtc::ArrayView<int16_t> decoded) const override {
-    auto speech_type = AudioDecoder::kSpeech;
-    const int ret = decoder_->Decode(
-        payload_.data(), payload_.size(), decoder_->SampleRateHz(),
-        decoded.size() * sizeof(int16_t), decoded.data(), &speech_type);
-    return ret < 0 ? rtc::Optional<DecodeResult>()
-                   : rtc::Optional<DecodeResult>(
-                         {static_cast<size_t>(ret), speech_type});
-  }
-
- private:
-  AudioDecoder* const decoder_;
-  const rtc::Buffer payload_;
-};
-
-}  // namespace
-
-AudioDecoder::ParseResult::ParseResult() = default;
-AudioDecoder::ParseResult::ParseResult(ParseResult&& b) = default;
-AudioDecoder::ParseResult::ParseResult(uint32_t timestamp,
-                                       int priority,
-                                       std::unique_ptr<EncodedAudioFrame> frame)
-    : timestamp(timestamp), priority(priority), frame(std::move(frame)) {
-  RTC_DCHECK_GE(priority, 0);
-}
-
-AudioDecoder::ParseResult::~ParseResult() = default;
-
-AudioDecoder::ParseResult& AudioDecoder::ParseResult::operator=(
-    ParseResult&& b) = default;
-
-std::vector<AudioDecoder::ParseResult> AudioDecoder::ParsePayload(
-    rtc::Buffer&& payload,
-    uint32_t timestamp) {
-  std::vector<ParseResult> results;
-  std::unique_ptr<EncodedAudioFrame> frame(
-      new OldStyleEncodedFrame(this, std::move(payload)));
-  results.emplace_back(timestamp, 0, std::move(frame));
-  return results;
-}
-
-int AudioDecoder::Decode(const uint8_t* encoded,
-                         size_t encoded_len,
-                         int sample_rate_hz,
-                         size_t max_decoded_bytes,
-                         int16_t* decoded,
-                         SpeechType* speech_type) {
-  TRACE_EVENT0("webrtc", "AudioDecoder::Decode");
-  rtc::MsanCheckInitialized(rtc::MakeArrayView(encoded, encoded_len));
-  int duration = PacketDuration(encoded, encoded_len);
-  if (duration >= 0 &&
-      duration * Channels() * sizeof(int16_t) > max_decoded_bytes) {
-    return -1;
-  }
-  return DecodeInternal(encoded, encoded_len, sample_rate_hz, decoded,
-                        speech_type);
-}
-
-int AudioDecoder::DecodeRedundant(const uint8_t* encoded,
-                                  size_t encoded_len,
-                                  int sample_rate_hz,
-                                  size_t max_decoded_bytes,
-                                  int16_t* decoded,
-                                  SpeechType* speech_type) {
-  TRACE_EVENT0("webrtc", "AudioDecoder::DecodeRedundant");
-  rtc::MsanCheckInitialized(rtc::MakeArrayView(encoded, encoded_len));
-  int duration = PacketDurationRedundant(encoded, encoded_len);
-  if (duration >= 0 &&
-      duration * Channels() * sizeof(int16_t) > max_decoded_bytes) {
-    return -1;
-  }
-  return DecodeRedundantInternal(encoded, encoded_len, sample_rate_hz, decoded,
-                                 speech_type);
-}
-
-int AudioDecoder::DecodeRedundantInternal(const uint8_t* encoded,
-                                          size_t encoded_len,
-                                          int sample_rate_hz,
-                                          int16_t* decoded,
-                                          SpeechType* speech_type) {
-  return DecodeInternal(encoded, encoded_len, sample_rate_hz, decoded,
-                        speech_type);
-}
-
-bool AudioDecoder::HasDecodePlc() const {
-  return false;
-}
-
-size_t AudioDecoder::DecodePlc(size_t num_frames, int16_t* decoded) {
-  return 0;
-}
-
-int AudioDecoder::IncomingPacket(const uint8_t* payload,
-                                 size_t payload_len,
-                                 uint16_t rtp_sequence_number,
-                                 uint32_t rtp_timestamp,
-                                 uint32_t arrival_timestamp) {
-  return 0;
-}
-
-int AudioDecoder::ErrorCode() {
-  return 0;
-}
-
-int AudioDecoder::PacketDuration(const uint8_t* encoded,
-                                 size_t encoded_len) const {
-  return kNotImplemented;
-}
-
-int AudioDecoder::PacketDurationRedundant(const uint8_t* encoded,
-                                          size_t encoded_len) const {
-  return kNotImplemented;
-}
-
-bool AudioDecoder::PacketHasFec(const uint8_t* encoded,
-                                size_t encoded_len) const {
-  return false;
-}
-
-AudioDecoder::SpeechType AudioDecoder::ConvertSpeechType(int16_t type) {
-  switch (type) {
-    case 0:  // TODO(hlundin): Both iSAC and Opus return 0 for speech.
-    case 1:
-      return kSpeech;
-    case 2:
-      return kComfortNoise;
-    default:
-      assert(false);
-      return kSpeech;
-  }
-}
-
-}  // namespace webrtc
diff --git a/api/audio_codecs/audio_decoder.h b/api/audio_codecs/audio_decoder.h
deleted file mode 100644
index 2d850fd..0000000
--- a/api/audio_codecs/audio_decoder.h
+++ /dev/null
@@ -1,177 +0,0 @@
-/*
- *  Copyright (c) 2012 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_API_AUDIO_CODECS_AUDIO_DECODER_H_
-#define WEBRTC_API_AUDIO_CODECS_AUDIO_DECODER_H_
-
-#include <memory>
-#include <vector>
-
-#include "webrtc/api/array_view.h"
-#include "webrtc/api/optional.h"
-#include "webrtc/rtc_base/buffer.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-class AudioDecoder {
- public:
-  enum SpeechType {
-    kSpeech = 1,
-    kComfortNoise = 2,
-  };
-
-  // Used by PacketDuration below. Save the value -1 for errors.
-  enum { kNotImplemented = -2 };
-
-  AudioDecoder() = default;
-  virtual ~AudioDecoder() = default;
-
-  class EncodedAudioFrame {
-   public:
-    struct DecodeResult {
-      size_t num_decoded_samples;
-      SpeechType speech_type;
-    };
-
-    virtual ~EncodedAudioFrame() = default;
-
-    // Returns the duration in samples-per-channel of this audio frame.
-    // If no duration can be ascertained, returns zero.
-    virtual size_t Duration() const = 0;
-
-    // Decodes this frame of audio and writes the result in |decoded|.
-    // |decoded| must be large enough to store as many samples as indicated by a
-    // call to Duration() . On success, returns an rtc::Optional containing the
-    // total number of samples across all channels, as well as whether the
-    // decoder produced comfort noise or speech. On failure, returns an empty
-    // rtc::Optional. Decode may be called at most once per frame object.
-    virtual rtc::Optional<DecodeResult> Decode(
-        rtc::ArrayView<int16_t> decoded) const = 0;
-  };
-
-  struct ParseResult {
-    ParseResult();
-    ParseResult(uint32_t timestamp,
-                int priority,
-                std::unique_ptr<EncodedAudioFrame> frame);
-    ParseResult(ParseResult&& b);
-    ~ParseResult();
-
-    ParseResult& operator=(ParseResult&& b);
-
-    // The timestamp of the frame is in samples per channel.
-    uint32_t timestamp;
-    // The relative priority of the frame compared to other frames of the same
-    // payload and the same timeframe. A higher value means a lower priority.
-    // The highest priority is zero - negative values are not allowed.
-    int priority;
-    std::unique_ptr<EncodedAudioFrame> frame;
-  };
-
-  // Let the decoder parse this payload and prepare zero or more decodable
-  // frames. Each frame must be between 10 ms and 120 ms long. The caller must
-  // ensure that the AudioDecoder object outlives any frame objects returned by
-  // this call. The decoder is free to swap or move the data from the |payload|
-  // buffer. |timestamp| is the input timestamp, in samples, corresponding to
-  // the start of the payload.
-  virtual std::vector<ParseResult> ParsePayload(rtc::Buffer&& payload,
-                                                uint32_t timestamp);
-
-  // Decodes |encode_len| bytes from |encoded| and writes the result in
-  // |decoded|. The maximum bytes allowed to be written into |decoded| is
-  // |max_decoded_bytes|. Returns the total number of samples across all
-  // channels. If the decoder produced comfort noise, |speech_type|
-  // is set to kComfortNoise, otherwise it is kSpeech. The desired output
-  // sample rate is provided in |sample_rate_hz|, which must be valid for the
-  // codec at hand.
-  int Decode(const uint8_t* encoded,
-             size_t encoded_len,
-             int sample_rate_hz,
-             size_t max_decoded_bytes,
-             int16_t* decoded,
-             SpeechType* speech_type);
-
-  // Same as Decode(), but interfaces to the decoders redundant decode function.
-  // The default implementation simply calls the regular Decode() method.
-  int DecodeRedundant(const uint8_t* encoded,
-                      size_t encoded_len,
-                      int sample_rate_hz,
-                      size_t max_decoded_bytes,
-                      int16_t* decoded,
-                      SpeechType* speech_type);
-
-  // Indicates if the decoder implements the DecodePlc method.
-  virtual bool HasDecodePlc() const;
-
-  // Calls the packet-loss concealment of the decoder to update the state after
-  // one or several lost packets. The caller has to make sure that the
-  // memory allocated in |decoded| should accommodate |num_frames| frames.
-  virtual size_t DecodePlc(size_t num_frames, int16_t* decoded);
-
-  // Resets the decoder state (empty buffers etc.).
-  virtual void Reset() = 0;
-
-  // Notifies the decoder of an incoming packet to NetEQ.
-  virtual int IncomingPacket(const uint8_t* payload,
-                             size_t payload_len,
-                             uint16_t rtp_sequence_number,
-                             uint32_t rtp_timestamp,
-                             uint32_t arrival_timestamp);
-
-  // Returns the last error code from the decoder.
-  virtual int ErrorCode();
-
-  // Returns the duration in samples-per-channel of the payload in |encoded|
-  // which is |encoded_len| bytes long. Returns kNotImplemented if no duration
-  // estimate is available, or -1 in case of an error.
-  virtual int PacketDuration(const uint8_t* encoded, size_t encoded_len) const;
-
-  // Returns the duration in samples-per-channel of the redandant payload in
-  // |encoded| which is |encoded_len| bytes long. Returns kNotImplemented if no
-  // duration estimate is available, or -1 in case of an error.
-  virtual int PacketDurationRedundant(const uint8_t* encoded,
-                                      size_t encoded_len) const;
-
-  // Detects whether a packet has forward error correction. The packet is
-  // comprised of the samples in |encoded| which is |encoded_len| bytes long.
-  // Returns true if the packet has FEC and false otherwise.
-  virtual bool PacketHasFec(const uint8_t* encoded, size_t encoded_len) const;
-
-  // Returns the actual sample rate of the decoder's output. This value may not
-  // change during the lifetime of the decoder.
-  virtual int SampleRateHz() const = 0;
-
-  // The number of channels in the decoder's output. This value may not change
-  // during the lifetime of the decoder.
-  virtual size_t Channels() const = 0;
-
- protected:
-  static SpeechType ConvertSpeechType(int16_t type);
-
-  virtual int DecodeInternal(const uint8_t* encoded,
-                             size_t encoded_len,
-                             int sample_rate_hz,
-                             int16_t* decoded,
-                             SpeechType* speech_type) = 0;
-
-  virtual int DecodeRedundantInternal(const uint8_t* encoded,
-                                      size_t encoded_len,
-                                      int sample_rate_hz,
-                                      int16_t* decoded,
-                                      SpeechType* speech_type);
-
- private:
-  RTC_DISALLOW_COPY_AND_ASSIGN(AudioDecoder);
-};
-
-}  // namespace webrtc
-#endif  // WEBRTC_API_AUDIO_CODECS_AUDIO_DECODER_H_
diff --git a/api/audio_codecs/audio_decoder_factory.h b/api/audio_codecs/audio_decoder_factory.h
deleted file mode 100644
index 0becf6f..0000000
--- a/api/audio_codecs/audio_decoder_factory.h
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- *  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_API_AUDIO_CODECS_AUDIO_DECODER_FACTORY_H_
-#define WEBRTC_API_AUDIO_CODECS_AUDIO_DECODER_FACTORY_H_
-
-#include <memory>
-#include <vector>
-
-#include "webrtc/api/audio_codecs/audio_decoder.h"
-#include "webrtc/api/audio_codecs/audio_format.h"
-#include "webrtc/rtc_base/refcount.h"
-
-namespace webrtc {
-
-// A factory that creates AudioDecoders.
-// NOTE: This class is still under development and may change without notice.
-class AudioDecoderFactory : public rtc::RefCountInterface {
- public:
-  virtual std::vector<AudioCodecSpec> GetSupportedDecoders() = 0;
-
-  virtual bool IsSupportedDecoder(const SdpAudioFormat& format) = 0;
-
-  virtual std::unique_ptr<AudioDecoder> MakeAudioDecoder(
-      const SdpAudioFormat& format) = 0;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_API_AUDIO_CODECS_AUDIO_DECODER_FACTORY_H_
diff --git a/api/audio_codecs/audio_decoder_factory_template.h b/api/audio_codecs/audio_decoder_factory_template.h
deleted file mode 100644
index 422a514..0000000
--- a/api/audio_codecs/audio_decoder_factory_template.h
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- *  Copyright (c) 2017 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_API_AUDIO_CODECS_AUDIO_DECODER_FACTORY_TEMPLATE_H_
-#define WEBRTC_API_AUDIO_CODECS_AUDIO_DECODER_FACTORY_TEMPLATE_H_
-
-#include <memory>
-#include <vector>
-
-#include "webrtc/api/audio_codecs/audio_decoder_factory.h"
-#include "webrtc/rtc_base/scoped_ref_ptr.h"
-
-namespace webrtc {
-
-namespace audio_decoder_factory_template_impl {
-
-template <typename... Ts>
-struct Helper;
-
-// Base case: 0 template parameters.
-template <>
-struct Helper<> {
-  static void AppendSupportedDecoders(std::vector<AudioCodecSpec>* specs) {}
-  static bool IsSupportedDecoder(const SdpAudioFormat& format) { return false; }
-  static std::unique_ptr<AudioDecoder> MakeAudioDecoder(
-      const SdpAudioFormat& format) {
-    return nullptr;
-  }
-};
-
-// Inductive case: Called with n + 1 template parameters; calls subroutines
-// with n template parameters.
-template <typename T, typename... Ts>
-struct Helper<T, Ts...> {
-  static void AppendSupportedDecoders(std::vector<AudioCodecSpec>* specs) {
-    T::AppendSupportedDecoders(specs);
-    Helper<Ts...>::AppendSupportedDecoders(specs);
-  }
-  static bool IsSupportedDecoder(const SdpAudioFormat& format) {
-    auto opt_config = T::SdpToConfig(format);
-    return opt_config ? true : Helper<Ts...>::IsSupportedDecoder(format);
-  }
-  static std::unique_ptr<AudioDecoder> MakeAudioDecoder(
-      const SdpAudioFormat& format) {
-    auto opt_config = T::SdpToConfig(format);
-    return opt_config ? T::MakeAudioDecoder(*opt_config)
-                      : Helper<Ts...>::MakeAudioDecoder(format);
-  }
-};
-
-template <typename... Ts>
-class AudioDecoderFactoryT : public AudioDecoderFactory {
- public:
-  std::vector<AudioCodecSpec> GetSupportedDecoders() override {
-    std::vector<AudioCodecSpec> specs;
-    Helper<Ts...>::AppendSupportedDecoders(&specs);
-    return specs;
-  }
-
-  bool IsSupportedDecoder(const SdpAudioFormat& format) override {
-    return Helper<Ts...>::IsSupportedDecoder(format);
-  }
-
-  std::unique_ptr<AudioDecoder> MakeAudioDecoder(
-      const SdpAudioFormat& format) override {
-    return Helper<Ts...>::MakeAudioDecoder(format);
-  }
-};
-
-}  // namespace audio_decoder_factory_template_impl
-
-// Make an AudioDecoderFactory that can create instances of the given decoders.
-//
-// Each decoder type is given as a template argument to the function; it should
-// be a struct with the following static member functions:
-//
-//   // Converts |audio_format| to a ConfigType instance. Returns an empty
-//   // optional if |audio_format| doesn't correctly specify an decoder of our
-//   // type.
-//   rtc::Optional<ConfigType> SdpToConfig(const SdpAudioFormat& audio_format);
-//
-//   // Appends zero or more AudioCodecSpecs to the list that will be returned
-//   // by AudioDecoderFactory::GetSupportedDecoders().
-//   void AppendSupportedDecoders(std::vector<AudioCodecSpec>* specs);
-//
-//   // Creates an AudioDecoder for the specified format. Used to implement
-//   // AudioDecoderFactory::MakeAudioDecoder().
-//   std::unique_ptr<AudioDecoder> MakeAudioDecoder(const ConfigType& config);
-//
-// ConfigType should be a type that encapsulates all the settings needed to
-// create an AudioDecoder.
-//
-// Whenever it tries to do something, the new factory will try each of the
-// decoder types in the order they were specified in the template argument
-// list, stopping at the first one that claims to be able to do the job.
-//
-// NOTE: This function is still under development and may change without notice.
-//
-// TODO(kwiberg): Point at CreateBuiltinAudioDecoderFactory() for an example of
-// how it is used.
-template <typename... Ts>
-rtc::scoped_refptr<AudioDecoderFactory> CreateAudioDecoderFactory() {
-  // There's no technical reason we couldn't allow zero template parameters,
-  // but such a factory couldn't create any decoders, and callers can do this
-  // by mistake by simply forgetting the <> altogether. So we forbid it in
-  // order to prevent caller foot-shooting.
-  static_assert(sizeof...(Ts) >= 1,
-                "Caller must give at least one template parameter");
-
-  return rtc::scoped_refptr<AudioDecoderFactory>(
-      new rtc::RefCountedObject<
-          audio_decoder_factory_template_impl::AudioDecoderFactoryT<Ts...>>());
-}
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_API_AUDIO_CODECS_AUDIO_DECODER_FACTORY_TEMPLATE_H_
diff --git a/api/audio_codecs/audio_encoder.cc b/api/audio_codecs/audio_encoder.cc
deleted file mode 100644
index d5be26c..0000000
--- a/api/audio_codecs/audio_encoder.cc
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- *  Copyright (c) 2014 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/api/audio_codecs/audio_encoder.h"
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/trace_event.h"
-
-namespace webrtc {
-
-ANAStats::ANAStats() = default;
-ANAStats::~ANAStats() = default;
-ANAStats::ANAStats(const ANAStats&) = default;
-
-AudioEncoder::EncodedInfo::EncodedInfo() = default;
-AudioEncoder::EncodedInfo::EncodedInfo(const EncodedInfo&) = default;
-AudioEncoder::EncodedInfo::EncodedInfo(EncodedInfo&&) = default;
-AudioEncoder::EncodedInfo::~EncodedInfo() = default;
-AudioEncoder::EncodedInfo& AudioEncoder::EncodedInfo::operator=(
-    const EncodedInfo&) = default;
-AudioEncoder::EncodedInfo& AudioEncoder::EncodedInfo::operator=(EncodedInfo&&) =
-    default;
-
-int AudioEncoder::RtpTimestampRateHz() const {
-  return SampleRateHz();
-}
-
-AudioEncoder::EncodedInfo AudioEncoder::Encode(
-    uint32_t rtp_timestamp,
-    rtc::ArrayView<const int16_t> audio,
-    rtc::Buffer* encoded) {
-  TRACE_EVENT0("webrtc", "AudioEncoder::Encode");
-  RTC_CHECK_EQ(audio.size(),
-               static_cast<size_t>(NumChannels() * SampleRateHz() / 100));
-
-  const size_t old_size = encoded->size();
-  EncodedInfo info = EncodeImpl(rtp_timestamp, audio, encoded);
-  RTC_CHECK_EQ(encoded->size() - old_size, info.encoded_bytes);
-  return info;
-}
-
-bool AudioEncoder::SetFec(bool enable) {
-  return !enable;
-}
-
-bool AudioEncoder::SetDtx(bool enable) {
-  return !enable;
-}
-
-bool AudioEncoder::GetDtx() const {
-  return false;
-}
-
-bool AudioEncoder::SetApplication(Application application) {
-  return false;
-}
-
-void AudioEncoder::SetMaxPlaybackRate(int frequency_hz) {}
-
-void AudioEncoder::SetTargetBitrate(int target_bps) {}
-
-rtc::ArrayView<std::unique_ptr<AudioEncoder>>
-AudioEncoder::ReclaimContainedEncoders() {
-  return nullptr;
-}
-
-bool AudioEncoder::EnableAudioNetworkAdaptor(const std::string& config_string,
-                                             RtcEventLog* event_log) {
-  return false;
-}
-
-void AudioEncoder::DisableAudioNetworkAdaptor() {}
-
-void AudioEncoder::OnReceivedUplinkPacketLossFraction(
-    float uplink_packet_loss_fraction) {}
-
-void AudioEncoder::OnReceivedUplinkRecoverablePacketLossFraction(
-    float uplink_recoverable_packet_loss_fraction) {}
-
-void AudioEncoder::OnReceivedTargetAudioBitrate(int target_audio_bitrate_bps) {
-  OnReceivedUplinkBandwidth(target_audio_bitrate_bps, rtc::Optional<int64_t>());
-}
-
-void AudioEncoder::OnReceivedUplinkBandwidth(
-    int target_audio_bitrate_bps,
-    rtc::Optional<int64_t> bwe_period_ms) {}
-
-void AudioEncoder::OnReceivedRtt(int rtt_ms) {}
-
-void AudioEncoder::OnReceivedOverhead(size_t overhead_bytes_per_packet) {}
-
-void AudioEncoder::SetReceiverFrameLengthRange(int min_frame_length_ms,
-                                               int max_frame_length_ms) {}
-
-ANAStats AudioEncoder::GetANAStats() const {
-  return ANAStats();
-}
-
-}  // namespace webrtc
diff --git a/api/audio_codecs/audio_encoder.h b/api/audio_codecs/audio_encoder.h
deleted file mode 100644
index a1f36ae..0000000
--- a/api/audio_codecs/audio_encoder.h
+++ /dev/null
@@ -1,251 +0,0 @@
-/*
- *  Copyright (c) 2014 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_API_AUDIO_CODECS_AUDIO_ENCODER_H_
-#define WEBRTC_API_AUDIO_CODECS_AUDIO_ENCODER_H_
-
-#include <algorithm>
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "webrtc/api/array_view.h"
-#include "webrtc/api/optional.h"
-#include "webrtc/rtc_base/buffer.h"
-#include "webrtc/rtc_base/deprecation.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-class Clock;
-class RtcEventLog;
-
-// Statistics related to Audio Network Adaptation.
-struct ANAStats {
-  ANAStats();
-  ANAStats(const ANAStats&);
-  ~ANAStats();
-  // Number of actions taken by the ANA bitrate controller since the start of
-  // the call. If this value is not set, it indicates that the bitrate
-  // controller is disabled.
-  rtc::Optional<uint32_t> bitrate_action_counter;
-  // Number of actions taken by the ANA channel controller since the start of
-  // the call. If this value is not set, it indicates that the channel
-  // controller is disabled.
-  rtc::Optional<uint32_t> channel_action_counter;
-  // Number of actions taken by the ANA DTX controller since the start of the
-  // call. If this value is not set, it indicates that the DTX controller is
-  // disabled.
-  rtc::Optional<uint32_t> dtx_action_counter;
-  // Number of actions taken by the ANA FEC controller since the start of the
-  // call. If this value is not set, it indicates that the FEC controller is
-  // disabled.
-  rtc::Optional<uint32_t> fec_action_counter;
-  // Number of times the ANA frame length controller decided to increase the
-  // frame length since the start of the call. If this value is not set, it
-  // indicates that the frame length controller is disabled.
-  rtc::Optional<uint32_t> frame_length_increase_counter;
-  // Number of times the ANA frame length controller decided to decrease the
-  // frame length since the start of the call. If this value is not set, it
-  // indicates that the frame length controller is disabled.
-  rtc::Optional<uint32_t> frame_length_decrease_counter;
-  // The uplink packet loss fractions as set by the ANA FEC controller. If this
-  // value is not set, it indicates that the ANA FEC controller is not active.
-  rtc::Optional<float> uplink_packet_loss_fraction;
-};
-
-// This is the interface class for encoders in AudioCoding module. Each codec
-// type must have an implementation of this class.
-class AudioEncoder {
- public:
-  // Used for UMA logging of codec usage. The same codecs, with the
-  // same values, must be listed in
-  // src/tools/metrics/histograms/histograms.xml in chromium to log
-  // correct values.
-  enum class CodecType {
-    kOther = 0,  // Codec not specified, and/or not listed in this enum
-    kOpus = 1,
-    kIsac = 2,
-    kPcmA = 3,
-    kPcmU = 4,
-    kG722 = 5,
-    kIlbc = 6,
-
-    // Number of histogram bins in the UMA logging of codec types. The
-    // total number of different codecs that are logged cannot exceed this
-    // number.
-    kMaxLoggedAudioCodecTypes
-  };
-
-  struct EncodedInfoLeaf {
-    size_t encoded_bytes = 0;
-    uint32_t encoded_timestamp = 0;
-    int payload_type = 0;
-    bool send_even_if_empty = false;
-    bool speech = true;
-    CodecType encoder_type = CodecType::kOther;
-  };
-
-  // This is the main struct for auxiliary encoding information. Each encoded
-  // packet should be accompanied by one EncodedInfo struct, containing the
-  // total number of |encoded_bytes|, the |encoded_timestamp| and the
-  // |payload_type|. If the packet contains redundant encodings, the |redundant|
-  // vector will be populated with EncodedInfoLeaf structs. Each struct in the
-  // vector represents one encoding; the order of structs in the vector is the
-  // same as the order in which the actual payloads are written to the byte
-  // stream. When EncoderInfoLeaf structs are present in the vector, the main
-  // struct's |encoded_bytes| will be the sum of all the |encoded_bytes| in the
-  // vector.
-  struct EncodedInfo : public EncodedInfoLeaf {
-    EncodedInfo();
-    EncodedInfo(const EncodedInfo&);
-    EncodedInfo(EncodedInfo&&);
-    ~EncodedInfo();
-    EncodedInfo& operator=(const EncodedInfo&);
-    EncodedInfo& operator=(EncodedInfo&&);
-
-    std::vector<EncodedInfoLeaf> redundant;
-  };
-
-  virtual ~AudioEncoder() = default;
-
-  // Returns the input sample rate in Hz and the number of input channels.
-  // These are constants set at instantiation time.
-  virtual int SampleRateHz() const = 0;
-  virtual size_t NumChannels() const = 0;
-
-  // Returns the rate at which the RTP timestamps are updated. The default
-  // implementation returns SampleRateHz().
-  virtual int RtpTimestampRateHz() const;
-
-  // Returns the number of 10 ms frames the encoder will put in the next
-  // packet. This value may only change when Encode() outputs a packet; i.e.,
-  // the encoder may vary the number of 10 ms frames from packet to packet, but
-  // it must decide the length of the next packet no later than when outputting
-  // the preceding packet.
-  virtual size_t Num10MsFramesInNextPacket() const = 0;
-
-  // Returns the maximum value that can be returned by
-  // Num10MsFramesInNextPacket().
-  virtual size_t Max10MsFramesInAPacket() const = 0;
-
-  // Returns the current target bitrate in bits/s. The value -1 means that the
-  // codec adapts the target automatically, and a current target cannot be
-  // provided.
-  virtual int GetTargetBitrate() const = 0;
-
-  // Accepts one 10 ms block of input audio (i.e., SampleRateHz() / 100 *
-  // NumChannels() samples). Multi-channel audio must be sample-interleaved.
-  // The encoder appends zero or more bytes of output to |encoded| and returns
-  // additional encoding information.  Encode() checks some preconditions, calls
-  // EncodeImpl() which does the actual work, and then checks some
-  // postconditions.
-  EncodedInfo Encode(uint32_t rtp_timestamp,
-                     rtc::ArrayView<const int16_t> audio,
-                     rtc::Buffer* encoded);
-
-  // Resets the encoder to its starting state, discarding any input that has
-  // been fed to the encoder but not yet emitted in a packet.
-  virtual void Reset() = 0;
-
-  // Enables or disables codec-internal FEC (forward error correction). Returns
-  // true if the codec was able to comply. The default implementation returns
-  // true when asked to disable FEC and false when asked to enable it (meaning
-  // that FEC isn't supported).
-  virtual bool SetFec(bool enable);
-
-  // Enables or disables codec-internal VAD/DTX. Returns true if the codec was
-  // able to comply. The default implementation returns true when asked to
-  // disable DTX and false when asked to enable it (meaning that DTX isn't
-  // supported).
-  virtual bool SetDtx(bool enable);
-
-  // Returns the status of codec-internal DTX. The default implementation always
-  // returns false.
-  virtual bool GetDtx() const;
-
-  // Sets the application mode. Returns true if the codec was able to comply.
-  // The default implementation just returns false.
-  enum class Application { kSpeech, kAudio };
-  virtual bool SetApplication(Application application);
-
-  // Tells the encoder about the highest sample rate the decoder is expected to
-  // use when decoding the bitstream. The encoder would typically use this
-  // information to adjust the quality of the encoding. The default
-  // implementation does nothing.
-  virtual void SetMaxPlaybackRate(int frequency_hz);
-
-  // This is to be deprecated. Please use |OnReceivedTargetAudioBitrate|
-  // instead.
-  // Tells the encoder what average bitrate we'd like it to produce. The
-  // encoder is free to adjust or disregard the given bitrate (the default
-  // implementation does the latter).
-  RTC_DEPRECATED virtual void SetTargetBitrate(int target_bps);
-
-  // Causes this encoder to let go of any other encoders it contains, and
-  // returns a pointer to an array where they are stored (which is required to
-  // live as long as this encoder). Unless the returned array is empty, you may
-  // not call any methods on this encoder afterwards, except for the
-  // destructor. The default implementation just returns an empty array.
-  // NOTE: This method is subject to change. Do not call or override it.
-  virtual rtc::ArrayView<std::unique_ptr<AudioEncoder>>
-  ReclaimContainedEncoders();
-
-  // Enables audio network adaptor. Returns true if successful.
-  virtual bool EnableAudioNetworkAdaptor(const std::string& config_string,
-                                         RtcEventLog* event_log);
-
-  // Disables audio network adaptor.
-  virtual void DisableAudioNetworkAdaptor();
-
-  // Provides uplink packet loss fraction to this encoder to allow it to adapt.
-  // |uplink_packet_loss_fraction| is in the range [0.0, 1.0].
-  virtual void OnReceivedUplinkPacketLossFraction(
-      float uplink_packet_loss_fraction);
-
-  // Provides 1st-order-FEC-recoverable uplink packet loss rate to this encoder
-  // to allow it to adapt.
-  // |uplink_recoverable_packet_loss_fraction| is in the range [0.0, 1.0].
-  virtual void OnReceivedUplinkRecoverablePacketLossFraction(
-      float uplink_recoverable_packet_loss_fraction);
-
-  // Provides target audio bitrate to this encoder to allow it to adapt.
-  virtual void OnReceivedTargetAudioBitrate(int target_bps);
-
-  // Provides target audio bitrate and corresponding probing interval of
-  // the bandwidth estimator to this encoder to allow it to adapt.
-  virtual void OnReceivedUplinkBandwidth(
-      int target_audio_bitrate_bps,
-      rtc::Optional<int64_t> bwe_period_ms);
-
-  // Provides RTT to this encoder to allow it to adapt.
-  virtual void OnReceivedRtt(int rtt_ms);
-
-  // Provides overhead to this encoder to adapt. The overhead is the number of
-  // bytes that will be added to each packet the encoder generates.
-  virtual void OnReceivedOverhead(size_t overhead_bytes_per_packet);
-
-  // To allow encoder to adapt its frame length, it must be provided the frame
-  // length range that receivers can accept.
-  virtual void SetReceiverFrameLengthRange(int min_frame_length_ms,
-                                           int max_frame_length_ms);
-
-  // Get statistics related to audio network adaptation.
-  virtual ANAStats GetANAStats() const;
-
- protected:
-  // Subclasses implement this to perform the actual encoding. Called by
-  // Encode().
-  virtual EncodedInfo EncodeImpl(uint32_t rtp_timestamp,
-                                 rtc::ArrayView<const int16_t> audio,
-                                 rtc::Buffer* encoded) = 0;
-};
-}  // namespace webrtc
-#endif  // WEBRTC_API_AUDIO_CODECS_AUDIO_ENCODER_H_
diff --git a/api/audio_codecs/audio_encoder_factory.h b/api/audio_codecs/audio_encoder_factory.h
deleted file mode 100644
index 820651f..0000000
--- a/api/audio_codecs/audio_encoder_factory.h
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- *  Copyright (c) 2017 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_API_AUDIO_CODECS_AUDIO_ENCODER_FACTORY_H_
-#define WEBRTC_API_AUDIO_CODECS_AUDIO_ENCODER_FACTORY_H_
-
-#include <memory>
-#include <vector>
-
-#include "webrtc/api/audio_codecs/audio_encoder.h"
-#include "webrtc/api/audio_codecs/audio_format.h"
-#include "webrtc/rtc_base/refcount.h"
-
-namespace webrtc {
-
-// A factory that creates AudioEncoders.
-// NOTE: This class is still under development and may change without notice.
-class AudioEncoderFactory : public rtc::RefCountInterface {
- public:
-  // Returns a prioritized list of audio codecs, to use for signaling etc.
-  virtual std::vector<AudioCodecSpec> GetSupportedEncoders() = 0;
-
-  // Returns information about how this format would be encoded, provided it's
-  // supported. More format and format variations may be supported than those
-  // returned by GetSupportedEncoders().
-  virtual rtc::Optional<AudioCodecInfo> QueryAudioEncoder(
-      const SdpAudioFormat& format) = 0;
-
-  // Creates an AudioEncoder for the specified format. The encoder will tags its
-  // payloads with the specified payload type.
-  // TODO(ossu): Try to avoid audio encoders having to know their payload type.
-  virtual std::unique_ptr<AudioEncoder> MakeAudioEncoder(
-      int payload_type,
-      const SdpAudioFormat& format) = 0;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_API_AUDIO_CODECS_AUDIO_ENCODER_FACTORY_H_
diff --git a/api/audio_codecs/audio_encoder_factory_template.h b/api/audio_codecs/audio_encoder_factory_template.h
deleted file mode 100644
index 00bba46..0000000
--- a/api/audio_codecs/audio_encoder_factory_template.h
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- *  Copyright (c) 2017 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_API_AUDIO_CODECS_AUDIO_ENCODER_FACTORY_TEMPLATE_H_
-#define WEBRTC_API_AUDIO_CODECS_AUDIO_ENCODER_FACTORY_TEMPLATE_H_
-
-#include <memory>
-#include <vector>
-
-#include "webrtc/api/audio_codecs/audio_encoder_factory.h"
-#include "webrtc/rtc_base/scoped_ref_ptr.h"
-
-namespace webrtc {
-
-namespace audio_encoder_factory_template_impl {
-
-template <typename... Ts>
-struct Helper;
-
-// Base case: 0 template parameters.
-template <>
-struct Helper<> {
-  static void AppendSupportedEncoders(std::vector<AudioCodecSpec>* specs) {}
-  static rtc::Optional<AudioCodecInfo> QueryAudioEncoder(
-      const SdpAudioFormat& format) {
-    return rtc::Optional<AudioCodecInfo>();
-  }
-  static std::unique_ptr<AudioEncoder> MakeAudioEncoder(
-      int payload_type,
-      const SdpAudioFormat& format) {
-    return nullptr;
-  }
-};
-
-// Inductive case: Called with n + 1 template parameters; calls subroutines
-// with n template parameters.
-template <typename T, typename... Ts>
-struct Helper<T, Ts...> {
-  static void AppendSupportedEncoders(std::vector<AudioCodecSpec>* specs) {
-    T::AppendSupportedEncoders(specs);
-    Helper<Ts...>::AppendSupportedEncoders(specs);
-  }
-  static rtc::Optional<AudioCodecInfo> QueryAudioEncoder(
-      const SdpAudioFormat& format) {
-    auto opt_config = T::SdpToConfig(format);
-    return opt_config ? rtc::Optional<AudioCodecInfo>(
-                            T::QueryAudioEncoder(*opt_config))
-                      : Helper<Ts...>::QueryAudioEncoder(format);
-  }
-  static std::unique_ptr<AudioEncoder> MakeAudioEncoder(
-      int payload_type,
-      const SdpAudioFormat& format) {
-    auto opt_config = T::SdpToConfig(format);
-    if (opt_config) {
-      return T::MakeAudioEncoder(*opt_config, payload_type);
-    } else {
-      return Helper<Ts...>::MakeAudioEncoder(payload_type, format);
-    }
-  }
-};
-
-template <typename... Ts>
-class AudioEncoderFactoryT : public AudioEncoderFactory {
- public:
-  std::vector<AudioCodecSpec> GetSupportedEncoders() override {
-    std::vector<AudioCodecSpec> specs;
-    Helper<Ts...>::AppendSupportedEncoders(&specs);
-    return specs;
-  }
-
-  rtc::Optional<AudioCodecInfo> QueryAudioEncoder(
-      const SdpAudioFormat& format) override {
-    return Helper<Ts...>::QueryAudioEncoder(format);
-  }
-
-  std::unique_ptr<AudioEncoder> MakeAudioEncoder(
-      int payload_type,
-      const SdpAudioFormat& format) override {
-    return Helper<Ts...>::MakeAudioEncoder(payload_type, format);
-  }
-};
-
-}  // namespace audio_encoder_factory_template_impl
-
-// Make an AudioEncoderFactory that can create instances of the given encoders.
-//
-// Each encoder type is given as a template argument to the function; it should
-// be a struct with the following static member functions:
-//
-//   // Converts |audio_format| to a ConfigType instance. Returns an empty
-//   // optional if |audio_format| doesn't correctly specify an encoder of our
-//   // type.
-//   rtc::Optional<ConfigType> SdpToConfig(const SdpAudioFormat& audio_format);
-//
-//   // Appends zero or more AudioCodecSpecs to the list that will be returned
-//   // by AudioEncoderFactory::GetSupportedEncoders().
-//   void AppendSupportedEncoders(std::vector<AudioCodecSpec>* specs);
-//
-//   // Returns information about how this format would be encoded. Used to
-//   // implement AudioEncoderFactory::QueryAudioEncoder().
-//   AudioCodecInfo QueryAudioEncoder(const ConfigType& config);
-//
-//   // Creates an AudioEncoder for the specified format. Used to implement
-//   // AudioEncoderFactory::MakeAudioEncoder().
-//   std::unique_ptr<AudioEncoder> MakeAudioEncoder(const ConfigType& config,
-//                                                  int payload_type);
-//
-// ConfigType should be a type that encapsulates all the settings needed to
-// create an AudioDecoder.
-//
-// Whenever it tries to do something, the new factory will try each of the
-// encoders in the order they were specified in the template argument list,
-// stopping at the first one that claims to be able to do the job.
-//
-// NOTE: This function is still under development and may change without notice.
-//
-// TODO(kwiberg): Point at CreateBuiltinAudioEncoderFactory() for an example of
-// how it is used.
-template <typename... Ts>
-rtc::scoped_refptr<AudioEncoderFactory> CreateAudioEncoderFactory() {
-  // There's no technical reason we couldn't allow zero template parameters,
-  // but such a factory couldn't create any encoders, and callers can do this
-  // by mistake by simply forgetting the <> altogether. So we forbid it in
-  // order to prevent caller foot-shooting.
-  static_assert(sizeof...(Ts) >= 1,
-                "Caller must give at least one template parameter");
-
-  return rtc::scoped_refptr<AudioEncoderFactory>(
-      new rtc::RefCountedObject<
-          audio_encoder_factory_template_impl::AudioEncoderFactoryT<Ts...>>());
-}
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_API_AUDIO_CODECS_AUDIO_ENCODER_FACTORY_TEMPLATE_H_
diff --git a/api/audio_codecs/audio_format.cc b/api/audio_codecs/audio_format.cc
deleted file mode 100644
index de8b1fd..0000000
--- a/api/audio_codecs/audio_format.cc
+++ /dev/null
@@ -1,130 +0,0 @@
-/*
- *  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/api/audio_codecs/audio_format.h"
-
-#include "webrtc/common_types.h"
-
-namespace webrtc {
-
-SdpAudioFormat::SdpAudioFormat(const SdpAudioFormat&) = default;
-SdpAudioFormat::SdpAudioFormat(SdpAudioFormat&&) = default;
-
-SdpAudioFormat::SdpAudioFormat(const char* name,
-                               int clockrate_hz,
-                               size_t num_channels)
-    : name(name), clockrate_hz(clockrate_hz), num_channels(num_channels) {}
-
-SdpAudioFormat::SdpAudioFormat(const std::string& name,
-                               int clockrate_hz,
-                               size_t num_channels)
-    : name(name), clockrate_hz(clockrate_hz), num_channels(num_channels) {}
-
-SdpAudioFormat::SdpAudioFormat(const char* name,
-                               int clockrate_hz,
-                               size_t num_channels,
-                               const Parameters& param)
-    : name(name),
-      clockrate_hz(clockrate_hz),
-      num_channels(num_channels),
-      parameters(param) {}
-
-SdpAudioFormat::SdpAudioFormat(const std::string& name,
-                               int clockrate_hz,
-                               size_t num_channels,
-                               const Parameters& param)
-    : name(name),
-      clockrate_hz(clockrate_hz),
-      num_channels(num_channels),
-      parameters(param) {}
-
-bool SdpAudioFormat::Matches(const SdpAudioFormat& o) const {
-  return STR_CASE_CMP(name.c_str(), o.name.c_str()) == 0 &&
-         clockrate_hz == o.clockrate_hz && num_channels == o.num_channels;
-}
-
-SdpAudioFormat::~SdpAudioFormat() = default;
-SdpAudioFormat& SdpAudioFormat::operator=(const SdpAudioFormat&) = default;
-SdpAudioFormat& SdpAudioFormat::operator=(SdpAudioFormat&&) = default;
-
-bool operator==(const SdpAudioFormat& a, const SdpAudioFormat& b) {
-  return STR_CASE_CMP(a.name.c_str(), b.name.c_str()) == 0 &&
-         a.clockrate_hz == b.clockrate_hz && a.num_channels == b.num_channels &&
-         a.parameters == b.parameters;
-}
-
-void swap(SdpAudioFormat& a, SdpAudioFormat& b) {
-  using std::swap;
-  swap(a.name, b.name);
-  swap(a.clockrate_hz, b.clockrate_hz);
-  swap(a.num_channels, b.num_channels);
-  swap(a.parameters, b.parameters);
-}
-
-std::ostream& operator<<(std::ostream& os, const SdpAudioFormat& saf) {
-  os << "{name: " << saf.name;
-  os << ", clockrate_hz: " << saf.clockrate_hz;
-  os << ", num_channels: " << saf.num_channels;
-  os << ", parameters: {";
-  const char* sep = "";
-  for (const auto& kv : saf.parameters) {
-    os << sep << kv.first << ": " << kv.second;
-    sep = ", ";
-  }
-  os << "}}";
-  return os;
-}
-
-AudioCodecInfo::AudioCodecInfo(int sample_rate_hz,
-                               size_t num_channels,
-                               int bitrate_bps)
-    : AudioCodecInfo(sample_rate_hz,
-                     num_channels,
-                     bitrate_bps,
-                     bitrate_bps,
-                     bitrate_bps) {}
-
-AudioCodecInfo::AudioCodecInfo(int sample_rate_hz,
-                               size_t num_channels,
-                               int default_bitrate_bps,
-                               int min_bitrate_bps,
-                               int max_bitrate_bps)
-    : sample_rate_hz(sample_rate_hz),
-      num_channels(num_channels),
-      default_bitrate_bps(default_bitrate_bps),
-      min_bitrate_bps(min_bitrate_bps),
-      max_bitrate_bps(max_bitrate_bps) {
-  RTC_DCHECK_GT(sample_rate_hz, 0);
-  RTC_DCHECK_GT(num_channels, 0);
-  RTC_DCHECK_GE(min_bitrate_bps, 0);
-  RTC_DCHECK_LE(min_bitrate_bps, default_bitrate_bps);
-  RTC_DCHECK_GE(max_bitrate_bps, default_bitrate_bps);
-}
-
-std::ostream& operator<<(std::ostream& os, const AudioCodecInfo& aci) {
-  os << "{sample_rate_hz: " << aci.sample_rate_hz;
-  os << ", num_channels: " << aci.num_channels;
-  os << ", default_bitrate_bps: " << aci.default_bitrate_bps;
-  os << ", min_bitrate_bps: " << aci.min_bitrate_bps;
-  os << ", max_bitrate_bps: " << aci.max_bitrate_bps;
-  os << ", allow_comfort_noise: " << aci.allow_comfort_noise;
-  os << ", supports_network_adaption: " << aci.supports_network_adaption;
-  os << "}";
-  return os;
-}
-
-std::ostream& operator<<(std::ostream& os, const AudioCodecSpec& acs) {
-  os << "{format: " << acs.format;
-  os << ", info: " << acs.info;
-  os << "}";
-  return os;
-}
-
-}  // namespace webrtc
diff --git a/api/audio_codecs/audio_format.h b/api/audio_codecs/audio_format.h
deleted file mode 100644
index ab825bb..0000000
--- a/api/audio_codecs/audio_format.h
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- *  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_API_AUDIO_CODECS_AUDIO_FORMAT_H_
-#define WEBRTC_API_AUDIO_CODECS_AUDIO_FORMAT_H_
-
-#include <map>
-#include <ostream>
-#include <string>
-#include <utility>
-
-#include "webrtc/api/optional.h"
-
-namespace webrtc {
-
-// SDP specification for a single audio codec.
-// NOTE: This class is still under development and may change without notice.
-struct SdpAudioFormat {
-  using Parameters = std::map<std::string, std::string>;
-
-  SdpAudioFormat(const SdpAudioFormat&);
-  SdpAudioFormat(SdpAudioFormat&&);
-  SdpAudioFormat(const char* name, int clockrate_hz, size_t num_channels);
-  SdpAudioFormat(const std::string& name,
-                 int clockrate_hz,
-                 size_t num_channels);
-  SdpAudioFormat(const char* name,
-                 int clockrate_hz,
-                 size_t num_channels,
-                 const Parameters& param);
-  SdpAudioFormat(const std::string& name,
-                 int clockrate_hz,
-                 size_t num_channels,
-                 const Parameters& param);
-  ~SdpAudioFormat();
-
-  // Returns true if this format is compatible with |o|. In SDP terminology:
-  // would it represent the same codec between an offer and an answer? As
-  // opposed to operator==, this method disregards codec parameters.
-  bool Matches(const SdpAudioFormat& o) const;
-
-  SdpAudioFormat& operator=(const SdpAudioFormat&);
-  SdpAudioFormat& operator=(SdpAudioFormat&&);
-
-  friend bool operator==(const SdpAudioFormat& a, const SdpAudioFormat& b);
-  friend bool operator!=(const SdpAudioFormat& a, const SdpAudioFormat& b) {
-    return !(a == b);
-  }
-
-  std::string name;
-  int clockrate_hz;
-  size_t num_channels;
-  Parameters parameters;
-};
-
-void swap(SdpAudioFormat& a, SdpAudioFormat& b);
-std::ostream& operator<<(std::ostream& os, const SdpAudioFormat& saf);
-
-// Information about how an audio format is treated by the codec implementation.
-// Contains basic information, such as sample rate and number of channels, which
-// isn't uniformly presented by SDP. Also contains flags indicating support for
-// integrating with other parts of WebRTC, like external VAD and comfort noise
-// level calculation.
-//
-// To avoid API breakage, and make the code clearer, AudioCodecInfo should not
-// be directly initializable with any flags indicating optional support. If it
-// were, these initializers would break any time a new flag was added. It's also
-// more difficult to understand:
-//   AudioCodecInfo info{16000, 1, 32000, true, false, false, true, true};
-// than
-//   AudioCodecInfo info(16000, 1, 32000);
-//   info.allow_comfort_noise = true;
-//   info.future_flag_b = true;
-//   info.future_flag_c = true;
-struct AudioCodecInfo {
-  AudioCodecInfo(int sample_rate_hz, size_t num_channels, int bitrate_bps);
-  AudioCodecInfo(int sample_rate_hz,
-                 size_t num_channels,
-                 int default_bitrate_bps,
-                 int min_bitrate_bps,
-                 int max_bitrate_bps);
-  AudioCodecInfo(const AudioCodecInfo& b) = default;
-  ~AudioCodecInfo() = default;
-
-  bool operator==(const AudioCodecInfo& b) const {
-    return sample_rate_hz == b.sample_rate_hz &&
-           num_channels == b.num_channels &&
-           default_bitrate_bps == b.default_bitrate_bps &&
-           min_bitrate_bps == b.min_bitrate_bps &&
-           max_bitrate_bps == b.max_bitrate_bps &&
-           allow_comfort_noise == b.allow_comfort_noise &&
-           supports_network_adaption == b.supports_network_adaption;
-  }
-
-  bool operator!=(const AudioCodecInfo& b) const { return !(*this == b); }
-
-  bool HasFixedBitrate() const {
-    RTC_DCHECK_GE(min_bitrate_bps, 0);
-    RTC_DCHECK_LE(min_bitrate_bps, default_bitrate_bps);
-    RTC_DCHECK_GE(max_bitrate_bps, default_bitrate_bps);
-    return min_bitrate_bps == max_bitrate_bps;
-  }
-
-  int sample_rate_hz;
-  size_t num_channels;
-  int default_bitrate_bps;
-  int min_bitrate_bps;
-  int max_bitrate_bps;
-
-  bool allow_comfort_noise = true;  // This codec can be used with an external
-                                    // comfort noise generator.
-  bool supports_network_adaption = false;  // This codec can adapt to varying
-                                           // network conditions.
-};
-
-std::ostream& operator<<(std::ostream& os, const AudioCodecInfo& aci);
-
-// AudioCodecSpec ties an audio format to specific information about the codec
-// and its implementation.
-struct AudioCodecSpec {
-  bool operator==(const AudioCodecSpec& b) const {
-    return format == b.format && info == b.info;
-  }
-
-  bool operator!=(const AudioCodecSpec& b) const { return !(*this == b); }
-
-  SdpAudioFormat format;
-  AudioCodecInfo info;
-};
-
-std::ostream& operator<<(std::ostream& os, const AudioCodecSpec& acs);
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_API_AUDIO_CODECS_AUDIO_FORMAT_H_
diff --git a/api/audio_codecs/builtin_audio_decoder_factory.cc b/api/audio_codecs/builtin_audio_decoder_factory.cc
deleted file mode 100644
index 69a3e7c..0000000
--- a/api/audio_codecs/builtin_audio_decoder_factory.cc
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- *  Copyright (c) 2017 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/api/audio_codecs/builtin_audio_decoder_factory.h"
-
-#include <memory>
-#include <vector>
-
-#include "webrtc/api/audio_codecs/L16/audio_decoder_L16.h"
-#include "webrtc/api/audio_codecs/audio_decoder_factory_template.h"
-#include "webrtc/api/audio_codecs/g711/audio_decoder_g711.h"
-#if WEBRTC_USE_BUILTIN_G722
-#include "webrtc/api/audio_codecs/g722/audio_decoder_g722.h"  // nogncheck
-#endif
-#if WEBRTC_USE_BUILTIN_ILBC
-#include "webrtc/api/audio_codecs/ilbc/audio_decoder_ilbc.h"  // nogncheck
-#endif
-#if WEBRTC_USE_BUILTIN_ISAC_FIX
-#include "webrtc/api/audio_codecs/isac/audio_decoder_isac_fix.h"  // nogncheck
-#elif WEBRTC_USE_BUILTIN_ISAC_FLOAT
-#include "webrtc/api/audio_codecs/isac/audio_decoder_isac_float.h"  // nogncheck
-#endif
-#if WEBRTC_USE_BUILTIN_OPUS
-#include "webrtc/api/audio_codecs/opus/audio_decoder_opus.h"  // nogncheck
-#endif
-
-namespace webrtc {
-
-namespace {
-
-// Modify an audio decoder to not advertise support for anything.
-template <typename T>
-struct NotAdvertised {
-  using Config = typename T::Config;
-  static rtc::Optional<Config> SdpToConfig(const SdpAudioFormat& audio_format) {
-    return T::SdpToConfig(audio_format);
-  }
-  static void AppendSupportedDecoders(std::vector<AudioCodecSpec>* specs) {
-    // Don't advertise support for anything.
-  }
-  static std::unique_ptr<AudioDecoder> MakeAudioDecoder(const Config& config) {
-    return T::MakeAudioDecoder(config);
-  }
-};
-
-}  // namespace
-
-rtc::scoped_refptr<AudioDecoderFactory> CreateBuiltinAudioDecoderFactory() {
-  return CreateAudioDecoderFactory<
-
-#if WEBRTC_USE_BUILTIN_OPUS
-      AudioDecoderOpus,
-#endif
-
-#if WEBRTC_USE_BUILTIN_ISAC_FIX
-      AudioDecoderIsacFix,
-#elif WEBRTC_USE_BUILTIN_ISAC_FLOAT
-      AudioDecoderIsacFloat,
-#endif
-
-#if WEBRTC_USE_BUILTIN_G722
-      AudioDecoderG722,
-#endif
-
-#if WEBRTC_USE_BUILTIN_ILBC
-      AudioDecoderIlbc,
-#endif
-
-      AudioDecoderG711, NotAdvertised<AudioDecoderL16>>();
-}
-
-}  // namespace webrtc
diff --git a/api/audio_codecs/builtin_audio_decoder_factory.h b/api/audio_codecs/builtin_audio_decoder_factory.h
deleted file mode 100644
index 5b93158..0000000
--- a/api/audio_codecs/builtin_audio_decoder_factory.h
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- *  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_API_AUDIO_CODECS_BUILTIN_AUDIO_DECODER_FACTORY_H_
-#define WEBRTC_API_AUDIO_CODECS_BUILTIN_AUDIO_DECODER_FACTORY_H_
-
-#include "webrtc/api/audio_codecs/audio_decoder_factory.h"
-#include "webrtc/rtc_base/scoped_ref_ptr.h"
-
-namespace webrtc {
-
-// Creates a new factory that can create the built-in types of audio decoders.
-// NOTE: This function is still under development and may change without notice.
-rtc::scoped_refptr<AudioDecoderFactory> CreateBuiltinAudioDecoderFactory();
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_API_AUDIO_CODECS_BUILTIN_AUDIO_DECODER_FACTORY_H_
diff --git a/api/audio_codecs/builtin_audio_encoder_factory.cc b/api/audio_codecs/builtin_audio_encoder_factory.cc
deleted file mode 100644
index ae1bf4b..0000000
--- a/api/audio_codecs/builtin_audio_encoder_factory.cc
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- *  Copyright (c) 2017 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/api/audio_codecs/builtin_audio_encoder_factory.h"
-
-#include <memory>
-#include <vector>
-
-#include "webrtc/api/audio_codecs/L16/audio_encoder_L16.h"
-#include "webrtc/api/audio_codecs/audio_encoder_factory_template.h"
-#include "webrtc/api/audio_codecs/g711/audio_encoder_g711.h"
-#if WEBRTC_USE_BUILTIN_G722
-#include "webrtc/api/audio_codecs/g722/audio_encoder_g722.h"  // nogncheck
-#endif
-#if WEBRTC_USE_BUILTIN_ILBC
-#include "webrtc/api/audio_codecs/ilbc/audio_encoder_ilbc.h"  // nogncheck
-#endif
-#if WEBRTC_USE_BUILTIN_ISAC_FIX
-#include "webrtc/api/audio_codecs/isac/audio_encoder_isac_fix.h"  // nogncheck
-#elif WEBRTC_USE_BUILTIN_ISAC_FLOAT
-#include "webrtc/api/audio_codecs/isac/audio_encoder_isac_float.h"  // nogncheck
-#endif
-#if WEBRTC_USE_BUILTIN_OPUS
-#include "webrtc/api/audio_codecs/opus/audio_encoder_opus.h"  // nogncheck
-#endif
-
-namespace webrtc {
-
-namespace {
-
-// Modify an audio encoder to not advertise support for anything.
-template <typename T>
-struct NotAdvertised {
-  using Config = typename T::Config;
-  static rtc::Optional<Config> SdpToConfig(const SdpAudioFormat& audio_format) {
-    return T::SdpToConfig(audio_format);
-  }
-  static void AppendSupportedEncoders(std::vector<AudioCodecSpec>* specs) {
-    // Don't advertise support for anything.
-  }
-  static AudioCodecInfo QueryAudioEncoder(const Config& config) {
-    return T::QueryAudioEncoder(config);
-  }
-  static std::unique_ptr<AudioEncoder> MakeAudioEncoder(const Config& config,
-                                                        int payload_type) {
-    return T::MakeAudioEncoder(config, payload_type);
-  }
-};
-
-}  // namespace
-
-rtc::scoped_refptr<AudioEncoderFactory> CreateBuiltinAudioEncoderFactory() {
-  return CreateAudioEncoderFactory<
-
-#if WEBRTC_USE_BUILTIN_OPUS
-      AudioEncoderOpus,
-#endif
-
-#if WEBRTC_USE_BUILTIN_ISAC_FIX
-      AudioEncoderIsacFix,
-#elif WEBRTC_USE_BUILTIN_ISAC_FLOAT
-      AudioEncoderIsacFloat,
-#endif
-
-#if WEBRTC_USE_BUILTIN_G722
-      AudioEncoderG722,
-#endif
-
-#if WEBRTC_USE_BUILTIN_ILBC
-      AudioEncoderIlbc,
-#endif
-
-      AudioEncoderG711, NotAdvertised<AudioEncoderL16>>();
-}
-
-}  // namespace webrtc
diff --git a/api/audio_codecs/builtin_audio_encoder_factory.h b/api/audio_codecs/builtin_audio_encoder_factory.h
deleted file mode 100644
index 1546cfb..0000000
--- a/api/audio_codecs/builtin_audio_encoder_factory.h
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- *  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_API_AUDIO_CODECS_BUILTIN_AUDIO_ENCODER_FACTORY_H_
-#define WEBRTC_API_AUDIO_CODECS_BUILTIN_AUDIO_ENCODER_FACTORY_H_
-
-#include "webrtc/api/audio_codecs/audio_encoder_factory.h"
-#include "webrtc/rtc_base/scoped_ref_ptr.h"
-
-namespace webrtc {
-
-// Creates a new factory that can create the built-in types of audio encoders.
-// NOTE: This function is still under development and may change without notice.
-rtc::scoped_refptr<AudioEncoderFactory> CreateBuiltinAudioEncoderFactory();
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_API_AUDIO_CODECS_BUILTIN_AUDIO_ENCODER_FACTORY_H_
diff --git a/api/audio_codecs/g711/BUILD.gn b/api/audio_codecs/g711/BUILD.gn
deleted file mode 100644
index aa86490..0000000
--- a/api/audio_codecs/g711/BUILD.gn
+++ /dev/null
@@ -1,41 +0,0 @@
-# Copyright (c) 2017 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.
-
-import("../../../webrtc.gni")
-if (is_android) {
-  import("//build/config/android/config.gni")
-  import("//build/config/android/rules.gni")
-}
-
-rtc_static_library("audio_encoder_g711") {
-  sources = [
-    "audio_encoder_g711.cc",
-    "audio_encoder_g711.h",
-  ]
-  deps = [
-    "..:audio_codecs_api",
-    "../..:optional",
-    "../../..:webrtc_common",
-    "../../../modules/audio_coding:g711",
-    "../../../rtc_base:rtc_base_approved",
-  ]
-}
-
-rtc_static_library("audio_decoder_g711") {
-  sources = [
-    "audio_decoder_g711.cc",
-    "audio_decoder_g711.h",
-  ]
-  deps = [
-    "..:audio_codecs_api",
-    "../..:optional",
-    "../../..:webrtc_common",
-    "../../../modules/audio_coding:g711",
-    "../../../rtc_base:rtc_base_approved",
-  ]
-}
diff --git a/api/audio_codecs/g711/audio_decoder_g711.cc b/api/audio_codecs/g711/audio_decoder_g711.cc
deleted file mode 100644
index cb4b074..0000000
--- a/api/audio_codecs/g711/audio_decoder_g711.cc
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- *  Copyright (c) 2017 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/api/audio_codecs/g711/audio_decoder_g711.h"
-
-#include <memory>
-#include <vector>
-
-#include "webrtc/common_types.h"
-#include "webrtc/modules/audio_coding/codecs/g711/audio_decoder_pcm.h"
-#include "webrtc/rtc_base/ptr_util.h"
-#include "webrtc/rtc_base/safe_conversions.h"
-
-namespace webrtc {
-
-rtc::Optional<AudioDecoderG711::Config> AudioDecoderG711::SdpToConfig(
-    const SdpAudioFormat& format) {
-  const bool is_pcmu = STR_CASE_CMP(format.name.c_str(), "PCMU") == 0;
-  const bool is_pcma = STR_CASE_CMP(format.name.c_str(), "PCMA") == 0;
-  if (format.clockrate_hz == 8000 && format.num_channels >= 1 &&
-      (is_pcmu || is_pcma)) {
-    Config config;
-    config.type = is_pcmu ? Config::Type::kPcmU : Config::Type::kPcmA;
-    config.num_channels = rtc::dchecked_cast<int>(format.num_channels);
-    RTC_DCHECK(config.IsOk());
-    return rtc::Optional<Config>(config);
-  } else {
-    return rtc::Optional<Config>();
-  }
-}
-
-void AudioDecoderG711::AppendSupportedDecoders(
-    std::vector<AudioCodecSpec>* specs) {
-  for (const char* type : {"PCMU", "PCMA"}) {
-    specs->push_back({{type, 8000, 1}, {8000, 1, 64000}});
-  }
-}
-
-std::unique_ptr<AudioDecoder> AudioDecoderG711::MakeAudioDecoder(
-    const Config& config) {
-  RTC_DCHECK(config.IsOk());
-  switch (config.type) {
-    case Config::Type::kPcmU:
-      return rtc::MakeUnique<AudioDecoderPcmU>(config.num_channels);
-    case Config::Type::kPcmA:
-      return rtc::MakeUnique<AudioDecoderPcmA>(config.num_channels);
-    default:
-      return nullptr;
-  }
-}
-
-}  // namespace webrtc
diff --git a/api/audio_codecs/g711/audio_decoder_g711.h b/api/audio_codecs/g711/audio_decoder_g711.h
deleted file mode 100644
index 2824c32..0000000
--- a/api/audio_codecs/g711/audio_decoder_g711.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- *  Copyright (c) 2017 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_API_AUDIO_CODECS_G711_AUDIO_DECODER_G711_H_
-#define WEBRTC_API_AUDIO_CODECS_G711_AUDIO_DECODER_G711_H_
-
-#include <memory>
-#include <vector>
-
-#include "webrtc/api/audio_codecs/audio_decoder.h"
-#include "webrtc/api/audio_codecs/audio_format.h"
-#include "webrtc/api/optional.h"
-
-namespace webrtc {
-
-// G711 decoder API for use as a template parameter to
-// CreateAudioDecoderFactory<...>().
-//
-// NOTE: This struct is still under development and may change without notice.
-struct AudioDecoderG711 {
-  struct Config {
-    enum class Type { kPcmU, kPcmA };
-    bool IsOk() const {
-      return (type == Type::kPcmU || type == Type::kPcmA) && num_channels >= 1;
-    }
-    Type type;
-    int num_channels;
-  };
-  static rtc::Optional<Config> SdpToConfig(const SdpAudioFormat& audio_format);
-  static void AppendSupportedDecoders(std::vector<AudioCodecSpec>* specs);
-  static std::unique_ptr<AudioDecoder> MakeAudioDecoder(const Config& config);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_API_AUDIO_CODECS_G711_AUDIO_DECODER_G711_H_
diff --git a/api/audio_codecs/g711/audio_encoder_g711.cc b/api/audio_codecs/g711/audio_encoder_g711.cc
deleted file mode 100644
index 28fb951..0000000
--- a/api/audio_codecs/g711/audio_encoder_g711.cc
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- *  Copyright (c) 2017 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/api/audio_codecs/g711/audio_encoder_g711.h"
-
-#include <memory>
-#include <vector>
-
-#include "webrtc/common_types.h"
-#include "webrtc/modules/audio_coding/codecs/g711/audio_encoder_pcm.h"
-#include "webrtc/rtc_base/ptr_util.h"
-#include "webrtc/rtc_base/safe_conversions.h"
-#include "webrtc/rtc_base/safe_minmax.h"
-#include "webrtc/rtc_base/string_to_number.h"
-
-namespace webrtc {
-
-rtc::Optional<AudioEncoderG711::Config> AudioEncoderG711::SdpToConfig(
-    const SdpAudioFormat& format) {
-  const bool is_pcmu = STR_CASE_CMP(format.name.c_str(), "PCMU") == 0;
-  const bool is_pcma = STR_CASE_CMP(format.name.c_str(), "PCMA") == 0;
-  if (format.clockrate_hz == 8000 && format.num_channels >= 1 &&
-      (is_pcmu || is_pcma)) {
-    Config config;
-    config.type = is_pcmu ? Config::Type::kPcmU : Config::Type::kPcmA;
-    config.num_channels = rtc::dchecked_cast<int>(format.num_channels);
-    config.frame_size_ms = 20;
-    auto ptime_iter = format.parameters.find("ptime");
-    if (ptime_iter != format.parameters.end()) {
-      const auto ptime = rtc::StringToNumber<int>(ptime_iter->second);
-      if (ptime && *ptime > 0) {
-        config.frame_size_ms = rtc::SafeClamp(10 * (*ptime / 10), 10, 60);
-      }
-    }
-    RTC_DCHECK(config.IsOk());
-    return rtc::Optional<Config>(config);
-  } else {
-    return rtc::Optional<Config>();
-  }
-}
-
-void AudioEncoderG711::AppendSupportedEncoders(
-    std::vector<AudioCodecSpec>* specs) {
-  for (const char* type : {"PCMU", "PCMA"}) {
-    specs->push_back({{type, 8000, 1}, {8000, 1, 64000}});
-  }
-}
-
-AudioCodecInfo AudioEncoderG711::QueryAudioEncoder(const Config& config) {
-  RTC_DCHECK(config.IsOk());
-  return {8000, rtc::dchecked_cast<size_t>(config.num_channels),
-          64000 * config.num_channels};
-}
-
-std::unique_ptr<AudioEncoder> AudioEncoderG711::MakeAudioEncoder(
-    const Config& config,
-    int payload_type) {
-  RTC_DCHECK(config.IsOk());
-  switch (config.type) {
-    case Config::Type::kPcmU: {
-      AudioEncoderPcmU::Config impl_config;
-      impl_config.num_channels = config.num_channels;
-      impl_config.frame_size_ms = config.frame_size_ms;
-      impl_config.payload_type = payload_type;
-      return rtc::MakeUnique<AudioEncoderPcmU>(impl_config);
-    }
-    case Config::Type::kPcmA: {
-      AudioEncoderPcmA::Config impl_config;
-      impl_config.num_channels = config.num_channels;
-      impl_config.frame_size_ms = config.frame_size_ms;
-      impl_config.payload_type = payload_type;
-      return rtc::MakeUnique<AudioEncoderPcmA>(impl_config);
-    }
-    default: { return nullptr; }
-  }
-}
-
-}  // namespace webrtc
diff --git a/api/audio_codecs/g711/audio_encoder_g711.h b/api/audio_codecs/g711/audio_encoder_g711.h
deleted file mode 100644
index 5750100..0000000
--- a/api/audio_codecs/g711/audio_encoder_g711.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- *  Copyright (c) 2017 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_API_AUDIO_CODECS_G711_AUDIO_ENCODER_G711_H_
-#define WEBRTC_API_AUDIO_CODECS_G711_AUDIO_ENCODER_G711_H_
-
-#include <memory>
-#include <vector>
-
-#include "webrtc/api/audio_codecs/audio_encoder.h"
-#include "webrtc/api/audio_codecs/audio_format.h"
-#include "webrtc/api/optional.h"
-
-namespace webrtc {
-
-// G711 encoder API for use as a template parameter to
-// CreateAudioEncoderFactory<...>().
-//
-// NOTE: This struct is still under development and may change without notice.
-struct AudioEncoderG711 {
-  struct Config {
-    enum class Type { kPcmU, kPcmA };
-    bool IsOk() const {
-      return (type == Type::kPcmU || type == Type::kPcmA) &&
-             frame_size_ms > 0 && frame_size_ms % 10 == 0 && num_channels >= 1;
-    }
-    Type type = Type::kPcmU;
-    int num_channels = 1;
-    int frame_size_ms = 20;
-  };
-  static rtc::Optional<AudioEncoderG711::Config> SdpToConfig(
-      const SdpAudioFormat& audio_format);
-  static void AppendSupportedEncoders(std::vector<AudioCodecSpec>* specs);
-  static AudioCodecInfo QueryAudioEncoder(const Config& config);
-  static std::unique_ptr<AudioEncoder> MakeAudioEncoder(const Config& config,
-                                                        int payload_type);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_API_AUDIO_CODECS_G711_AUDIO_ENCODER_G711_H_
diff --git a/api/audio_codecs/g722/BUILD.gn b/api/audio_codecs/g722/BUILD.gn
deleted file mode 100644
index 5af7e5c..0000000
--- a/api/audio_codecs/g722/BUILD.gn
+++ /dev/null
@@ -1,48 +0,0 @@
-# Copyright (c) 2017 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.
-
-import("../../../webrtc.gni")
-if (is_android) {
-  import("//build/config/android/config.gni")
-  import("//build/config/android/rules.gni")
-}
-
-rtc_source_set("audio_encoder_g722_config") {
-  sources = [
-    "audio_encoder_g722_config.h",
-  ]
-}
-
-rtc_static_library("audio_encoder_g722") {
-  sources = [
-    "audio_encoder_g722.cc",
-    "audio_encoder_g722.h",
-  ]
-  deps = [
-    ":audio_encoder_g722_config",
-    "..:audio_codecs_api",
-    "../..:optional",
-    "../../..:webrtc_common",
-    "../../../modules/audio_coding:g722",
-    "../../../rtc_base:rtc_base_approved",
-  ]
-}
-
-rtc_static_library("audio_decoder_g722") {
-  sources = [
-    "audio_decoder_g722.cc",
-    "audio_decoder_g722.h",
-  ]
-  deps = [
-    "..:audio_codecs_api",
-    "../..:optional",
-    "../../..:webrtc_common",
-    "../../../modules/audio_coding:g722",
-    "../../../rtc_base:rtc_base_approved",
-  ]
-}
diff --git a/api/audio_codecs/g722/audio_decoder_g722.cc b/api/audio_codecs/g722/audio_decoder_g722.cc
deleted file mode 100644
index 6f3ce97..0000000
--- a/api/audio_codecs/g722/audio_decoder_g722.cc
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- *  Copyright (c) 2017 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/api/audio_codecs/g722/audio_decoder_g722.h"
-
-#include <memory>
-#include <vector>
-
-#include "webrtc/common_types.h"
-#include "webrtc/modules/audio_coding/codecs/g722/audio_decoder_g722.h"
-#include "webrtc/rtc_base/ptr_util.h"
-#include "webrtc/rtc_base/safe_conversions.h"
-
-namespace webrtc {
-
-rtc::Optional<AudioDecoderG722::Config> AudioDecoderG722::SdpToConfig(
-    const SdpAudioFormat& format) {
-  return STR_CASE_CMP(format.name.c_str(), "G722") == 0 &&
-                 format.clockrate_hz == 8000 &&
-                 (format.num_channels == 1 || format.num_channels == 2)
-             ? rtc::Optional<Config>(
-                   Config{rtc::dchecked_cast<int>(format.num_channels)})
-             : rtc::Optional<Config>();
-}
-
-void AudioDecoderG722::AppendSupportedDecoders(
-    std::vector<AudioCodecSpec>* specs) {
-  specs->push_back({{"G722", 8000, 1}, {16000, 1, 64000}});
-}
-
-std::unique_ptr<AudioDecoder> AudioDecoderG722::MakeAudioDecoder(
-    Config config) {
-  switch (config.num_channels) {
-    case 1:
-      return rtc::MakeUnique<AudioDecoderG722Impl>();
-    case 2:
-      return rtc::MakeUnique<AudioDecoderG722StereoImpl>();
-    default:
-      return nullptr;
-  }
-}
-
-}  // namespace webrtc
diff --git a/api/audio_codecs/g722/audio_decoder_g722.h b/api/audio_codecs/g722/audio_decoder_g722.h
deleted file mode 100644
index cf0dfa9..0000000
--- a/api/audio_codecs/g722/audio_decoder_g722.h
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- *  Copyright (c) 2017 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_API_AUDIO_CODECS_G722_AUDIO_DECODER_G722_H_
-#define WEBRTC_API_AUDIO_CODECS_G722_AUDIO_DECODER_G722_H_
-
-#include <memory>
-#include <vector>
-
-#include "webrtc/api/audio_codecs/audio_decoder.h"
-#include "webrtc/api/audio_codecs/audio_format.h"
-#include "webrtc/api/optional.h"
-
-namespace webrtc {
-
-// G722 decoder API for use as a template parameter to
-// CreateAudioDecoderFactory<...>().
-//
-// NOTE: This struct is still under development and may change without notice.
-struct AudioDecoderG722 {
-  struct Config {
-    bool IsOk() const { return num_channels == 1 || num_channels == 2; }
-    int num_channels;
-  };
-  static rtc::Optional<Config> SdpToConfig(const SdpAudioFormat& audio_format);
-  static void AppendSupportedDecoders(std::vector<AudioCodecSpec>* specs);
-  static std::unique_ptr<AudioDecoder> MakeAudioDecoder(Config config);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_API_AUDIO_CODECS_G722_AUDIO_DECODER_G722_H_
diff --git a/api/audio_codecs/g722/audio_encoder_g722.cc b/api/audio_codecs/g722/audio_encoder_g722.cc
deleted file mode 100644
index b9df585..0000000
--- a/api/audio_codecs/g722/audio_encoder_g722.cc
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- *  Copyright (c) 2017 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/api/audio_codecs/g722/audio_encoder_g722.h"
-
-#include <memory>
-#include <vector>
-
-#include "webrtc/common_types.h"
-#include "webrtc/modules/audio_coding/codecs/g722/audio_encoder_g722.h"
-#include "webrtc/rtc_base/ptr_util.h"
-#include "webrtc/rtc_base/safe_conversions.h"
-#include "webrtc/rtc_base/safe_minmax.h"
-#include "webrtc/rtc_base/string_to_number.h"
-
-namespace webrtc {
-
-rtc::Optional<AudioEncoderG722Config> AudioEncoderG722::SdpToConfig(
-    const SdpAudioFormat& format) {
-  if (STR_CASE_CMP(format.name.c_str(), "g722") != 0 ||
-      format.clockrate_hz != 8000) {
-    return rtc::Optional<AudioEncoderG722Config>();
-  }
-
-  AudioEncoderG722Config config;
-  config.num_channels = rtc::checked_cast<int>(format.num_channels);
-  auto ptime_iter = format.parameters.find("ptime");
-  if (ptime_iter != format.parameters.end()) {
-    auto ptime = rtc::StringToNumber<int>(ptime_iter->second);
-    if (ptime && *ptime > 0) {
-      const int whole_packets = *ptime / 10;
-      config.frame_size_ms = rtc::SafeClamp<int>(whole_packets * 10, 10, 60);
-    }
-  }
-  return config.IsOk() ? rtc::Optional<AudioEncoderG722Config>(config)
-                       : rtc::Optional<AudioEncoderG722Config>();
-}
-
-void AudioEncoderG722::AppendSupportedEncoders(
-    std::vector<AudioCodecSpec>* specs) {
-  const SdpAudioFormat fmt = {"G722", 8000, 1};
-  const AudioCodecInfo info = QueryAudioEncoder(*SdpToConfig(fmt));
-  specs->push_back({fmt, info});
-}
-
-AudioCodecInfo AudioEncoderG722::QueryAudioEncoder(
-    const AudioEncoderG722Config& config) {
-  RTC_DCHECK(config.IsOk());
-  return {16000, rtc::dchecked_cast<size_t>(config.num_channels),
-          64000 * config.num_channels};
-}
-
-std::unique_ptr<AudioEncoder> AudioEncoderG722::MakeAudioEncoder(
-    const AudioEncoderG722Config& config,
-    int payload_type) {
-  RTC_DCHECK(config.IsOk());
-  return rtc::MakeUnique<AudioEncoderG722Impl>(config, payload_type);
-}
-
-}  // namespace webrtc
diff --git a/api/audio_codecs/g722/audio_encoder_g722.h b/api/audio_codecs/g722/audio_encoder_g722.h
deleted file mode 100644
index 37cb968..0000000
--- a/api/audio_codecs/g722/audio_encoder_g722.h
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- *  Copyright (c) 2017 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_API_AUDIO_CODECS_G722_AUDIO_ENCODER_G722_H_
-#define WEBRTC_API_AUDIO_CODECS_G722_AUDIO_ENCODER_G722_H_
-
-#include <memory>
-#include <vector>
-
-#include "webrtc/api/audio_codecs/audio_encoder.h"
-#include "webrtc/api/audio_codecs/audio_format.h"
-#include "webrtc/api/audio_codecs/g722/audio_encoder_g722_config.h"
-#include "webrtc/api/optional.h"
-
-namespace webrtc {
-
-// G722 encoder API for use as a template parameter to
-// CreateAudioEncoderFactory<...>().
-//
-// NOTE: This struct is still under development and may change without notice.
-struct AudioEncoderG722 {
-  static rtc::Optional<AudioEncoderG722Config> SdpToConfig(
-      const SdpAudioFormat& audio_format);
-  static void AppendSupportedEncoders(std::vector<AudioCodecSpec>* specs);
-  static AudioCodecInfo QueryAudioEncoder(const AudioEncoderG722Config& config);
-  static std::unique_ptr<AudioEncoder> MakeAudioEncoder(
-      const AudioEncoderG722Config& config,
-      int payload_type);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_API_AUDIO_CODECS_G722_AUDIO_ENCODER_G722_H_
diff --git a/api/audio_codecs/g722/audio_encoder_g722_config.h b/api/audio_codecs/g722/audio_encoder_g722_config.h
deleted file mode 100644
index fa26942..0000000
--- a/api/audio_codecs/g722/audio_encoder_g722_config.h
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- *  Copyright (c) 2017 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_API_AUDIO_CODECS_G722_AUDIO_ENCODER_G722_CONFIG_H_
-#define WEBRTC_API_AUDIO_CODECS_G722_AUDIO_ENCODER_G722_CONFIG_H_
-
-namespace webrtc {
-
-// NOTE: This struct is still under development and may change without notice.
-struct AudioEncoderG722Config {
-  bool IsOk() const {
-    return frame_size_ms > 0 && frame_size_ms % 10 == 0 && num_channels >= 1;
-  }
-  int frame_size_ms = 20;
-  int num_channels = 1;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_API_AUDIO_CODECS_G722_AUDIO_ENCODER_G722_CONFIG_H_
diff --git a/api/audio_codecs/ilbc/BUILD.gn b/api/audio_codecs/ilbc/BUILD.gn
deleted file mode 100644
index 0f5f80d..0000000
--- a/api/audio_codecs/ilbc/BUILD.gn
+++ /dev/null
@@ -1,48 +0,0 @@
-# Copyright (c) 2017 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.
-
-import("../../../webrtc.gni")
-if (is_android) {
-  import("//build/config/android/config.gni")
-  import("//build/config/android/rules.gni")
-}
-
-rtc_source_set("audio_encoder_ilbc_config") {
-  sources = [
-    "audio_encoder_ilbc_config.h",
-  ]
-}
-
-rtc_static_library("audio_encoder_ilbc") {
-  sources = [
-    "audio_encoder_ilbc.cc",
-    "audio_encoder_ilbc.h",
-  ]
-  deps = [
-    ":audio_encoder_ilbc_config",
-    "..:audio_codecs_api",
-    "../..:optional",
-    "../../..:webrtc_common",
-    "../../../modules/audio_coding:ilbc",
-    "../../../rtc_base:rtc_base_approved",
-  ]
-}
-
-rtc_static_library("audio_decoder_ilbc") {
-  sources = [
-    "audio_decoder_ilbc.cc",
-    "audio_decoder_ilbc.h",
-  ]
-  deps = [
-    "..:audio_codecs_api",
-    "../..:optional",
-    "../../..:webrtc_common",
-    "../../../modules/audio_coding:ilbc",
-    "../../../rtc_base:rtc_base_approved",
-  ]
-}
diff --git a/api/audio_codecs/ilbc/audio_decoder_ilbc.cc b/api/audio_codecs/ilbc/audio_decoder_ilbc.cc
deleted file mode 100644
index dc17751..0000000
--- a/api/audio_codecs/ilbc/audio_decoder_ilbc.cc
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- *  Copyright (c) 2017 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/api/audio_codecs/ilbc/audio_decoder_ilbc.h"
-
-#include <memory>
-#include <vector>
-
-#include "webrtc/common_types.h"
-#include "webrtc/modules/audio_coding/codecs/ilbc/audio_decoder_ilbc.h"
-#include "webrtc/rtc_base/ptr_util.h"
-
-namespace webrtc {
-
-rtc::Optional<AudioDecoderIlbc::Config> AudioDecoderIlbc::SdpToConfig(
-    const SdpAudioFormat& format) {
-  return STR_CASE_CMP(format.name.c_str(), "ILBC") == 0 &&
-                 format.clockrate_hz == 8000 && format.num_channels == 1
-             ? rtc::Optional<Config>(Config())
-             : rtc::Optional<Config>();
-}
-
-void AudioDecoderIlbc::AppendSupportedDecoders(
-    std::vector<AudioCodecSpec>* specs) {
-  specs->push_back({{"ILBC", 8000, 1}, {8000, 1, 13300}});
-}
-
-std::unique_ptr<AudioDecoder> AudioDecoderIlbc::MakeAudioDecoder(
-    Config config) {
-  return rtc::MakeUnique<AudioDecoderIlbcImpl>();
-}
-
-}  // namespace webrtc
diff --git a/api/audio_codecs/ilbc/audio_decoder_ilbc.h b/api/audio_codecs/ilbc/audio_decoder_ilbc.h
deleted file mode 100644
index 343308d..0000000
--- a/api/audio_codecs/ilbc/audio_decoder_ilbc.h
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- *  Copyright (c) 2017 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_API_AUDIO_CODECS_ILBC_AUDIO_DECODER_ILBC_H_
-#define WEBRTC_API_AUDIO_CODECS_ILBC_AUDIO_DECODER_ILBC_H_
-
-#include <memory>
-#include <vector>
-
-#include "webrtc/api/audio_codecs/audio_decoder.h"
-#include "webrtc/api/audio_codecs/audio_format.h"
-#include "webrtc/api/optional.h"
-
-namespace webrtc {
-
-// ILBC decoder API for use as a template parameter to
-// CreateAudioDecoderFactory<...>().
-//
-// NOTE: This struct is still under development and may change without notice.
-struct AudioDecoderIlbc {
-  struct Config {};  // Empty---no config values needed!
-  static rtc::Optional<Config> SdpToConfig(const SdpAudioFormat& audio_format);
-  static void AppendSupportedDecoders(std::vector<AudioCodecSpec>* specs);
-  static std::unique_ptr<AudioDecoder> MakeAudioDecoder(Config config);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_API_AUDIO_CODECS_ILBC_AUDIO_DECODER_ILBC_H_
diff --git a/api/audio_codecs/ilbc/audio_encoder_ilbc.cc b/api/audio_codecs/ilbc/audio_encoder_ilbc.cc
deleted file mode 100644
index fd11f00..0000000
--- a/api/audio_codecs/ilbc/audio_encoder_ilbc.cc
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- *  Copyright (c) 2017 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/api/audio_codecs/ilbc/audio_encoder_ilbc.h"
-
-#include <memory>
-#include <vector>
-
-#include "webrtc/common_types.h"
-#include "webrtc/modules/audio_coding/codecs/ilbc/audio_encoder_ilbc.h"
-#include "webrtc/rtc_base/ptr_util.h"
-#include "webrtc/rtc_base/safe_conversions.h"
-#include "webrtc/rtc_base/safe_minmax.h"
-#include "webrtc/rtc_base/string_to_number.h"
-
-namespace webrtc {
-namespace {
-int GetIlbcBitrate(int ptime) {
-  switch (ptime) {
-    case 20:
-    case 40:
-      // 38 bytes per frame of 20 ms => 15200 bits/s.
-      return 15200;
-    case 30:
-    case 60:
-      // 50 bytes per frame of 30 ms => (approx) 13333 bits/s.
-      return 13333;
-    default:
-      FATAL();
-  }
-}
-}  // namespace
-
-rtc::Optional<AudioEncoderIlbcConfig> AudioEncoderIlbc::SdpToConfig(
-    const SdpAudioFormat& format) {
-  if (STR_CASE_CMP(format.name.c_str(), "ILBC") != 0 ||
-      format.clockrate_hz != 8000 || format.num_channels != 1) {
-    return rtc::Optional<AudioEncoderIlbcConfig>();
-  }
-
-  AudioEncoderIlbcConfig config;
-  auto ptime_iter = format.parameters.find("ptime");
-  if (ptime_iter != format.parameters.end()) {
-    auto ptime = rtc::StringToNumber<int>(ptime_iter->second);
-    if (ptime && *ptime > 0) {
-      const int whole_packets = *ptime / 10;
-      config.frame_size_ms = rtc::SafeClamp<int>(whole_packets * 10, 20, 60);
-    }
-  }
-  return config.IsOk() ? rtc::Optional<AudioEncoderIlbcConfig>(config)
-                       : rtc::Optional<AudioEncoderIlbcConfig>();
-}
-
-void AudioEncoderIlbc::AppendSupportedEncoders(
-    std::vector<AudioCodecSpec>* specs) {
-  const SdpAudioFormat fmt = {"ILBC", 8000, 1};
-  const AudioCodecInfo info = QueryAudioEncoder(*SdpToConfig(fmt));
-  specs->push_back({fmt, info});
-}
-
-AudioCodecInfo AudioEncoderIlbc::QueryAudioEncoder(
-    const AudioEncoderIlbcConfig& config) {
-  RTC_DCHECK(config.IsOk());
-  return {8000, 1, GetIlbcBitrate(config.frame_size_ms)};
-}
-
-std::unique_ptr<AudioEncoder> AudioEncoderIlbc::MakeAudioEncoder(
-    const AudioEncoderIlbcConfig& config,
-    int payload_type) {
-  RTC_DCHECK(config.IsOk());
-  return rtc::MakeUnique<AudioEncoderIlbcImpl>(config, payload_type);
-}
-
-}  // namespace webrtc
diff --git a/api/audio_codecs/ilbc/audio_encoder_ilbc.h b/api/audio_codecs/ilbc/audio_encoder_ilbc.h
deleted file mode 100644
index a30d109..0000000
--- a/api/audio_codecs/ilbc/audio_encoder_ilbc.h
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- *  Copyright (c) 2017 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_API_AUDIO_CODECS_ILBC_AUDIO_ENCODER_ILBC_H_
-#define WEBRTC_API_AUDIO_CODECS_ILBC_AUDIO_ENCODER_ILBC_H_
-
-#include <memory>
-#include <vector>
-
-#include "webrtc/api/audio_codecs/audio_encoder.h"
-#include "webrtc/api/audio_codecs/audio_format.h"
-#include "webrtc/api/audio_codecs/ilbc/audio_encoder_ilbc_config.h"
-#include "webrtc/api/optional.h"
-
-namespace webrtc {
-
-// ILBC encoder API for use as a template parameter to
-// CreateAudioEncoderFactory<...>().
-//
-// NOTE: This struct is still under development and may change without notice.
-struct AudioEncoderIlbc {
-  static rtc::Optional<AudioEncoderIlbcConfig> SdpToConfig(
-      const SdpAudioFormat& audio_format);
-  static void AppendSupportedEncoders(std::vector<AudioCodecSpec>* specs);
-  static AudioCodecInfo QueryAudioEncoder(const AudioEncoderIlbcConfig& config);
-  static std::unique_ptr<AudioEncoder> MakeAudioEncoder(
-      const AudioEncoderIlbcConfig& config,
-      int payload_type);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_API_AUDIO_CODECS_ILBC_AUDIO_ENCODER_ILBC_H_
diff --git a/api/audio_codecs/ilbc/audio_encoder_ilbc_config.h b/api/audio_codecs/ilbc/audio_encoder_ilbc_config.h
deleted file mode 100644
index 429ac81..0000000
--- a/api/audio_codecs/ilbc/audio_encoder_ilbc_config.h
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- *  Copyright (c) 2017 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_API_AUDIO_CODECS_ILBC_AUDIO_ENCODER_ILBC_CONFIG_H_
-#define WEBRTC_API_AUDIO_CODECS_ILBC_AUDIO_ENCODER_ILBC_CONFIG_H_
-
-namespace webrtc {
-
-// NOTE: This struct is still under development and may change without notice.
-struct AudioEncoderIlbcConfig {
-  bool IsOk() const {
-    return (frame_size_ms == 20 || frame_size_ms == 30 || frame_size_ms == 40 ||
-            frame_size_ms == 60);
-  }
-  int frame_size_ms = 30;  // Valid values are 20, 30, 40, and 60 ms.
-  // Note that frame size 40 ms produces encodings with two 20 ms frames in
-  // them, and frame size 60 ms consists of two 30 ms frames.
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_API_AUDIO_CODECS_ILBC_AUDIO_ENCODER_ILBC_CONFIG_H_
diff --git a/api/audio_codecs/isac/BUILD.gn b/api/audio_codecs/isac/BUILD.gn
deleted file mode 100644
index b22eb95..0000000
--- a/api/audio_codecs/isac/BUILD.gn
+++ /dev/null
@@ -1,69 +0,0 @@
-# Copyright (c) 2017 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.
-
-import("../../../webrtc.gni")
-if (is_android) {
-  import("//build/config/android/config.gni")
-  import("//build/config/android/rules.gni")
-}
-
-rtc_static_library("audio_encoder_isac_fix") {
-  sources = [
-    "audio_encoder_isac_fix.cc",
-    "audio_encoder_isac_fix.h",
-  ]
-  deps = [
-    "..:audio_codecs_api",
-    "../..:optional",
-    "../../..:webrtc_common",
-    "../../../modules/audio_coding:isac_fix",
-    "../../../rtc_base:rtc_base_approved",
-  ]
-}
-
-rtc_static_library("audio_decoder_isac_fix") {
-  sources = [
-    "audio_decoder_isac_fix.cc",
-    "audio_decoder_isac_fix.h",
-  ]
-  deps = [
-    "..:audio_codecs_api",
-    "../..:optional",
-    "../../..:webrtc_common",
-    "../../../modules/audio_coding:isac_fix",
-    "../../../rtc_base:rtc_base_approved",
-  ]
-}
-
-rtc_static_library("audio_encoder_isac_float") {
-  sources = [
-    "audio_encoder_isac_float.cc",
-    "audio_encoder_isac_float.h",
-  ]
-  deps = [
-    "..:audio_codecs_api",
-    "../..:optional",
-    "../../..:webrtc_common",
-    "../../../modules/audio_coding:isac",
-    "../../../rtc_base:rtc_base_approved",
-  ]
-}
-
-rtc_static_library("audio_decoder_isac_float") {
-  sources = [
-    "audio_decoder_isac_float.cc",
-    "audio_decoder_isac_float.h",
-  ]
-  deps = [
-    "..:audio_codecs_api",
-    "../..:optional",
-    "../../..:webrtc_common",
-    "../../../modules/audio_coding:isac",
-    "../../../rtc_base:rtc_base_approved",
-  ]
-}
diff --git a/api/audio_codecs/isac/audio_decoder_isac_fix.cc b/api/audio_codecs/isac/audio_decoder_isac_fix.cc
deleted file mode 100644
index ef8655f..0000000
--- a/api/audio_codecs/isac/audio_decoder_isac_fix.cc
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- *  Copyright (c) 2017 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/api/audio_codecs/isac/audio_decoder_isac_fix.h"
-
-#include "webrtc/common_types.h"
-#include "webrtc/modules/audio_coding/codecs/isac/fix/include/audio_decoder_isacfix.h"
-#include "webrtc/rtc_base/ptr_util.h"
-
-namespace webrtc {
-
-rtc::Optional<AudioDecoderIsacFix::Config> AudioDecoderIsacFix::SdpToConfig(
-    const SdpAudioFormat& format) {
-  return STR_CASE_CMP(format.name.c_str(), "ISAC") == 0 &&
-                 format.clockrate_hz == 16000 && format.num_channels == 1
-             ? rtc::Optional<Config>(Config())
-             : rtc::Optional<Config>();
-}
-
-void AudioDecoderIsacFix::AppendSupportedDecoders(
-    std::vector<AudioCodecSpec>* specs) {
-  specs->push_back({{"ISAC", 16000, 1}, {16000, 1, 32000, 10000, 32000}});
-}
-
-std::unique_ptr<AudioDecoder> AudioDecoderIsacFix::MakeAudioDecoder(
-    Config config) {
-  return rtc::MakeUnique<AudioDecoderIsacFixImpl>(16000);
-}
-
-}  // namespace webrtc
diff --git a/api/audio_codecs/isac/audio_decoder_isac_fix.h b/api/audio_codecs/isac/audio_decoder_isac_fix.h
deleted file mode 100644
index 7662002..0000000
--- a/api/audio_codecs/isac/audio_decoder_isac_fix.h
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- *  Copyright (c) 2017 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_API_AUDIO_CODECS_ISAC_AUDIO_DECODER_ISAC_FIX_H_
-#define WEBRTC_API_AUDIO_CODECS_ISAC_AUDIO_DECODER_ISAC_FIX_H_
-
-#include <memory>
-#include <vector>
-
-#include "webrtc/api/audio_codecs/audio_decoder.h"
-#include "webrtc/api/audio_codecs/audio_format.h"
-#include "webrtc/api/optional.h"
-
-namespace webrtc {
-
-// iSAC decoder API (fixed-point implementation) for use as a template
-// parameter to CreateAudioDecoderFactory<...>().
-//
-// NOTE: This struct is still under development and may change without notice.
-struct AudioDecoderIsacFix {
-  struct Config {};  // Empty---no config values needed!
-  static rtc::Optional<Config> SdpToConfig(const SdpAudioFormat& audio_format);
-  static void AppendSupportedDecoders(std::vector<AudioCodecSpec>* specs);
-  static std::unique_ptr<AudioDecoder> MakeAudioDecoder(Config config);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_API_AUDIO_CODECS_ISAC_AUDIO_DECODER_ISAC_FIX_H_
diff --git a/api/audio_codecs/isac/audio_decoder_isac_float.cc b/api/audio_codecs/isac/audio_decoder_isac_float.cc
deleted file mode 100644
index e26e651..0000000
--- a/api/audio_codecs/isac/audio_decoder_isac_float.cc
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- *  Copyright (c) 2017 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/api/audio_codecs/isac/audio_decoder_isac_float.h"
-
-#include "webrtc/common_types.h"
-#include "webrtc/modules/audio_coding/codecs/isac/main/include/audio_decoder_isac.h"
-#include "webrtc/rtc_base/ptr_util.h"
-
-namespace webrtc {
-
-rtc::Optional<AudioDecoderIsacFloat::Config> AudioDecoderIsacFloat::SdpToConfig(
-    const SdpAudioFormat& format) {
-  if (STR_CASE_CMP(format.name.c_str(), "ISAC") == 0 &&
-      (format.clockrate_hz == 16000 || format.clockrate_hz == 32000) &&
-      format.num_channels == 1) {
-    Config config;
-    config.sample_rate_hz = format.clockrate_hz;
-    return rtc::Optional<Config>(config);
-  } else {
-    return rtc::Optional<Config>();
-  }
-}
-
-void AudioDecoderIsacFloat::AppendSupportedDecoders(
-    std::vector<AudioCodecSpec>* specs) {
-  specs->push_back({{"ISAC", 16000, 1}, {16000, 1, 32000, 10000, 32000}});
-  specs->push_back({{"ISAC", 32000, 1}, {32000, 1, 56000, 10000, 56000}});
-}
-
-std::unique_ptr<AudioDecoder> AudioDecoderIsacFloat::MakeAudioDecoder(
-    Config config) {
-  RTC_DCHECK(config.IsOk());
-  return rtc::MakeUnique<AudioDecoderIsacFloatImpl>(config.sample_rate_hz);
-}
-
-}  // namespace webrtc
diff --git a/api/audio_codecs/isac/audio_decoder_isac_float.h b/api/audio_codecs/isac/audio_decoder_isac_float.h
deleted file mode 100644
index f0232e9..0000000
--- a/api/audio_codecs/isac/audio_decoder_isac_float.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- *  Copyright (c) 2017 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_API_AUDIO_CODECS_ISAC_AUDIO_DECODER_ISAC_FLOAT_H_
-#define WEBRTC_API_AUDIO_CODECS_ISAC_AUDIO_DECODER_ISAC_FLOAT_H_
-
-#include <memory>
-#include <vector>
-
-#include "webrtc/api/audio_codecs/audio_decoder.h"
-#include "webrtc/api/audio_codecs/audio_format.h"
-#include "webrtc/api/optional.h"
-
-namespace webrtc {
-
-// iSAC decoder API (floating-point implementation) for use as a template
-// parameter to CreateAudioDecoderFactory<...>().
-//
-// NOTE: This struct is still under development and may change without notice.
-struct AudioDecoderIsacFloat {
-  struct Config {
-    bool IsOk() const {
-      return sample_rate_hz == 16000 || sample_rate_hz == 32000;
-    }
-    int sample_rate_hz = 16000;
-  };
-  static rtc::Optional<Config> SdpToConfig(const SdpAudioFormat& audio_format);
-  static void AppendSupportedDecoders(std::vector<AudioCodecSpec>* specs);
-  static std::unique_ptr<AudioDecoder> MakeAudioDecoder(Config config);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_API_AUDIO_CODECS_ISAC_AUDIO_DECODER_ISAC_FLOAT_H_
diff --git a/api/audio_codecs/isac/audio_encoder_isac_fix.cc b/api/audio_codecs/isac/audio_encoder_isac_fix.cc
deleted file mode 100644
index c07957d..0000000
--- a/api/audio_codecs/isac/audio_encoder_isac_fix.cc
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- *  Copyright (c) 2017 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/api/audio_codecs/isac/audio_encoder_isac_fix.h"
-
-#include "webrtc/common_types.h"
-#include "webrtc/modules/audio_coding/codecs/isac/fix/include/audio_encoder_isacfix.h"
-#include "webrtc/rtc_base/ptr_util.h"
-#include "webrtc/rtc_base/string_to_number.h"
-
-namespace webrtc {
-
-rtc::Optional<AudioEncoderIsacFix::Config> AudioEncoderIsacFix::SdpToConfig(
-    const SdpAudioFormat& format) {
-  if (STR_CASE_CMP(format.name.c_str(), "ISAC") == 0 &&
-      format.clockrate_hz == 16000 && format.num_channels == 1) {
-    Config config;
-    const auto ptime_iter = format.parameters.find("ptime");
-    if (ptime_iter != format.parameters.end()) {
-      const auto ptime = rtc::StringToNumber<int>(ptime_iter->second);
-      if (ptime && *ptime >= 60) {
-        config.frame_size_ms = 60;
-      }
-    }
-    return rtc::Optional<Config>(config);
-  } else {
-    return rtc::Optional<Config>();
-  }
-}
-
-void AudioEncoderIsacFix::AppendSupportedEncoders(
-    std::vector<AudioCodecSpec>* specs) {
-  const SdpAudioFormat fmt = {"ISAC", 16000, 1};
-  const AudioCodecInfo info = QueryAudioEncoder(*SdpToConfig(fmt));
-  specs->push_back({fmt, info});
-}
-
-AudioCodecInfo AudioEncoderIsacFix::QueryAudioEncoder(
-    AudioEncoderIsacFix::Config config) {
-  RTC_DCHECK(config.IsOk());
-  return {16000, 1, 32000, 10000, 32000};
-}
-
-std::unique_ptr<AudioEncoder> AudioEncoderIsacFix::MakeAudioEncoder(
-    AudioEncoderIsacFix::Config config,
-    int payload_type) {
-  RTC_DCHECK(config.IsOk());
-  AudioEncoderIsacFixImpl::Config c;
-  c.frame_size_ms = config.frame_size_ms;
-  c.payload_type = payload_type;
-  return rtc::MakeUnique<AudioEncoderIsacFixImpl>(c);
-}
-
-}  // namespace webrtc
diff --git a/api/audio_codecs/isac/audio_encoder_isac_fix.h b/api/audio_codecs/isac/audio_encoder_isac_fix.h
deleted file mode 100644
index ce4a1d0..0000000
--- a/api/audio_codecs/isac/audio_encoder_isac_fix.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- *  Copyright (c) 2017 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_API_AUDIO_CODECS_ISAC_AUDIO_ENCODER_ISAC_FIX_H_
-#define WEBRTC_API_AUDIO_CODECS_ISAC_AUDIO_ENCODER_ISAC_FIX_H_
-
-#include <memory>
-#include <vector>
-
-#include "webrtc/api/audio_codecs/audio_encoder.h"
-#include "webrtc/api/audio_codecs/audio_format.h"
-#include "webrtc/api/optional.h"
-
-namespace webrtc {
-
-// iSAC encoder API (fixed-point implementation) for use as a template
-// parameter to CreateAudioEncoderFactory<...>().
-//
-// NOTE: This struct is still under development and may change without notice.
-struct AudioEncoderIsacFix {
-  struct Config {
-    bool IsOk() const { return frame_size_ms == 30 || frame_size_ms == 60; }
-    int frame_size_ms = 30;
-  };
-  static rtc::Optional<Config> SdpToConfig(const SdpAudioFormat& audio_format);
-  static void AppendSupportedEncoders(std::vector<AudioCodecSpec>* specs);
-  static AudioCodecInfo QueryAudioEncoder(Config config);
-  static std::unique_ptr<AudioEncoder> MakeAudioEncoder(Config config,
-                                                        int payload_type);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_API_AUDIO_CODECS_ISAC_AUDIO_ENCODER_ISAC_FIX_H_
diff --git a/api/audio_codecs/isac/audio_encoder_isac_float.cc b/api/audio_codecs/isac/audio_encoder_isac_float.cc
deleted file mode 100644
index 500cfd1..0000000
--- a/api/audio_codecs/isac/audio_encoder_isac_float.cc
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- *  Copyright (c) 2017 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/api/audio_codecs/isac/audio_encoder_isac_float.h"
-
-#include "webrtc/common_types.h"
-#include "webrtc/modules/audio_coding/codecs/isac/main/include/audio_encoder_isac.h"
-#include "webrtc/rtc_base/ptr_util.h"
-#include "webrtc/rtc_base/string_to_number.h"
-
-namespace webrtc {
-
-rtc::Optional<AudioEncoderIsacFloat::Config> AudioEncoderIsacFloat::SdpToConfig(
-    const SdpAudioFormat& format) {
-  if (STR_CASE_CMP(format.name.c_str(), "ISAC") == 0 &&
-      (format.clockrate_hz == 16000 || format.clockrate_hz == 32000) &&
-      format.num_channels == 1) {
-    Config config;
-    config.sample_rate_hz = format.clockrate_hz;
-    if (config.sample_rate_hz == 16000) {
-      // For sample rate 16 kHz, optionally use 60 ms frames, instead of the
-      // default 30 ms.
-      const auto ptime_iter = format.parameters.find("ptime");
-      if (ptime_iter != format.parameters.end()) {
-        const auto ptime = rtc::StringToNumber<int>(ptime_iter->second);
-        if (ptime && *ptime >= 60) {
-          config.frame_size_ms = 60;
-        }
-      }
-    }
-    return rtc::Optional<Config>(config);
-  } else {
-    return rtc::Optional<Config>();
-  }
-}
-
-void AudioEncoderIsacFloat::AppendSupportedEncoders(
-    std::vector<AudioCodecSpec>* specs) {
-  for (int sample_rate_hz : {16000, 32000}) {
-    const SdpAudioFormat fmt = {"ISAC", sample_rate_hz, 1};
-    const AudioCodecInfo info = QueryAudioEncoder(*SdpToConfig(fmt));
-    specs->push_back({fmt, info});
-  }
-}
-
-AudioCodecInfo AudioEncoderIsacFloat::QueryAudioEncoder(
-    const AudioEncoderIsacFloat::Config& config) {
-  RTC_DCHECK(config.IsOk());
-  constexpr int min_bitrate = 10000;
-  const int max_bitrate = config.sample_rate_hz == 16000 ? 32000 : 56000;
-  const int default_bitrate = max_bitrate;
-  return {config.sample_rate_hz, 1, default_bitrate, min_bitrate, max_bitrate};
-}
-
-std::unique_ptr<AudioEncoder> AudioEncoderIsacFloat::MakeAudioEncoder(
-    const AudioEncoderIsacFloat::Config& config,
-    int payload_type) {
-  RTC_DCHECK(config.IsOk());
-  AudioEncoderIsacFloatImpl::Config c;
-  c.sample_rate_hz = config.sample_rate_hz;
-  c.frame_size_ms = config.frame_size_ms;
-  c.payload_type = payload_type;
-  return rtc::MakeUnique<AudioEncoderIsacFloatImpl>(c);
-}
-
-}  // namespace webrtc
diff --git a/api/audio_codecs/isac/audio_encoder_isac_float.h b/api/audio_codecs/isac/audio_encoder_isac_float.h
deleted file mode 100644
index 244e59b..0000000
--- a/api/audio_codecs/isac/audio_encoder_isac_float.h
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- *  Copyright (c) 2017 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_API_AUDIO_CODECS_ISAC_AUDIO_ENCODER_ISAC_FLOAT_H_
-#define WEBRTC_API_AUDIO_CODECS_ISAC_AUDIO_ENCODER_ISAC_FLOAT_H_
-
-#include <memory>
-#include <vector>
-
-#include "webrtc/api/audio_codecs/audio_encoder.h"
-#include "webrtc/api/audio_codecs/audio_format.h"
-#include "webrtc/api/optional.h"
-
-namespace webrtc {
-
-// iSAC encoder API (floating-point implementation) for use as a template
-// parameter to CreateAudioEncoderFactory<...>().
-//
-// NOTE: This struct is still under development and may change without notice.
-struct AudioEncoderIsacFloat {
-  struct Config {
-    bool IsOk() const {
-      return (sample_rate_hz == 16000 &&
-              (frame_size_ms == 30 || frame_size_ms == 60)) ||
-             (sample_rate_hz == 32000 && frame_size_ms == 30);
-    }
-    int sample_rate_hz = 16000;
-    int frame_size_ms = 30;
-  };
-  static rtc::Optional<Config> SdpToConfig(const SdpAudioFormat& audio_format);
-  static void AppendSupportedEncoders(std::vector<AudioCodecSpec>* specs);
-  static AudioCodecInfo QueryAudioEncoder(const Config& config);
-  static std::unique_ptr<AudioEncoder> MakeAudioEncoder(const Config& config,
-                                                        int payload_type);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_API_AUDIO_CODECS_ISAC_AUDIO_ENCODER_ISAC_FLOAT_H_
diff --git a/api/audio_codecs/opus/BUILD.gn b/api/audio_codecs/opus/BUILD.gn
deleted file mode 100644
index faa5956..0000000
--- a/api/audio_codecs/opus/BUILD.gn
+++ /dev/null
@@ -1,60 +0,0 @@
-# Copyright (c) 2017 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.
-
-import("../../../webrtc.gni")
-if (is_android) {
-  import("//build/config/android/config.gni")
-  import("//build/config/android/rules.gni")
-}
-
-rtc_static_library("audio_encoder_opus_config") {
-  sources = [
-    "audio_encoder_opus_config.cc",
-    "audio_encoder_opus_config.h",
-  ]
-  deps = [
-    "../..:optional",
-    "../../../rtc_base:rtc_base_approved",
-  ]
-  defines = []
-  if (rtc_opus_variable_complexity) {
-    defines += [ "WEBRTC_OPUS_VARIABLE_COMPLEXITY=1" ]
-  } else {
-    defines += [ "WEBRTC_OPUS_VARIABLE_COMPLEXITY=0" ]
-  }
-}
-
-rtc_source_set("audio_encoder_opus") {
-  sources = [
-    "audio_encoder_opus.h",
-  ]
-  deps = [
-    ":audio_encoder_opus_config",
-    "..:audio_codecs_api",
-    "../../../modules/audio_coding:webrtc_opus",
-    "../../../rtc_base:rtc_base_approved",
-  ]
-  public_deps = [
-    # TODO(kwiberg): Remove this public_dep when bug 7847 has been fixed.
-    "../../../rtc_base:protobuf_utils",
-  ]
-}
-
-rtc_static_library("audio_decoder_opus") {
-  sources = [
-    "audio_decoder_opus.cc",
-    "audio_decoder_opus.h",
-  ]
-  deps = [
-    "..:audio_codecs_api",
-    "../..:optional",
-    "../../..:webrtc_common",
-    "../../../modules/audio_coding:webrtc_opus",
-    "../../../rtc_base:rtc_base_approved",
-  ]
-}
diff --git a/api/audio_codecs/opus/audio_decoder_opus.cc b/api/audio_codecs/opus/audio_decoder_opus.cc
deleted file mode 100644
index 7f478fe..0000000
--- a/api/audio_codecs/opus/audio_decoder_opus.cc
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- *  Copyright (c) 2017 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/api/audio_codecs/opus/audio_decoder_opus.h"
-
-#include <memory>
-#include <utility>
-#include <vector>
-
-#include "webrtc/common_types.h"
-#include "webrtc/modules/audio_coding/codecs/opus/audio_decoder_opus.h"
-#include "webrtc/rtc_base/ptr_util.h"
-
-namespace webrtc {
-
-rtc::Optional<AudioDecoderOpus::Config> AudioDecoderOpus::SdpToConfig(
-    const SdpAudioFormat& format) {
-  const rtc::Optional<int> num_channels = [&] {
-    auto stereo = format.parameters.find("stereo");
-    if (stereo != format.parameters.end()) {
-      if (stereo->second == "0") {
-        return rtc::Optional<int>(1);
-      } else if (stereo->second == "1") {
-        return rtc::Optional<int>(2);
-      } else {
-        return rtc::Optional<int>();  // Bad stereo parameter.
-      }
-    }
-    return rtc::Optional<int>(1);  // Default to mono.
-  }();
-  if (STR_CASE_CMP(format.name.c_str(), "opus") == 0 &&
-      format.clockrate_hz == 48000 && format.num_channels == 2 &&
-      num_channels) {
-    return rtc::Optional<Config>(Config{*num_channels});
-  } else {
-    return rtc::Optional<Config>();
-  }
-}
-
-void AudioDecoderOpus::AppendSupportedDecoders(
-    std::vector<AudioCodecSpec>* specs) {
-  AudioCodecInfo opus_info{48000, 1, 64000, 6000, 510000};
-  opus_info.allow_comfort_noise = false;
-  opus_info.supports_network_adaption = true;
-  SdpAudioFormat opus_format(
-      {"opus", 48000, 2, {{"minptime", "10"}, {"useinbandfec", "1"}}});
-  specs->push_back({std::move(opus_format), std::move(opus_info)});
-}
-
-std::unique_ptr<AudioDecoder> AudioDecoderOpus::MakeAudioDecoder(
-    Config config) {
-  return rtc::MakeUnique<AudioDecoderOpusImpl>(config.num_channels);
-}
-
-}  // namespace webrtc
diff --git a/api/audio_codecs/opus/audio_decoder_opus.h b/api/audio_codecs/opus/audio_decoder_opus.h
deleted file mode 100644
index 272503d..0000000
--- a/api/audio_codecs/opus/audio_decoder_opus.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- *  Copyright (c) 2017 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_API_AUDIO_CODECS_OPUS_AUDIO_DECODER_OPUS_H_
-#define WEBRTC_API_AUDIO_CODECS_OPUS_AUDIO_DECODER_OPUS_H_
-
-#include <memory>
-#include <vector>
-
-#include "webrtc/api/audio_codecs/audio_decoder.h"
-#include "webrtc/api/audio_codecs/audio_format.h"
-#include "webrtc/api/optional.h"
-
-namespace webrtc {
-
-// Opus decoder API for use as a template parameter to
-// CreateAudioDecoderFactory<...>().
-//
-// NOTE: This struct is still under development and may change without notice.
-struct AudioDecoderOpus {
-  struct Config {
-    int num_channels;
-  };
-  static rtc::Optional<Config> SdpToConfig(const SdpAudioFormat& audio_format);
-  static void AppendSupportedDecoders(std::vector<AudioCodecSpec>* specs);
-  static std::unique_ptr<AudioDecoder> MakeAudioDecoder(Config config);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_API_AUDIO_CODECS_OPUS_AUDIO_DECODER_OPUS_H_
diff --git a/api/audio_codecs/opus/audio_encoder_opus.h b/api/audio_codecs/opus/audio_encoder_opus.h
deleted file mode 100644
index 4763f44..0000000
--- a/api/audio_codecs/opus/audio_encoder_opus.h
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- *  Copyright (c) 2017 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_API_AUDIO_CODECS_OPUS_AUDIO_ENCODER_OPUS_H_
-#define WEBRTC_API_AUDIO_CODECS_OPUS_AUDIO_ENCODER_OPUS_H_
-
-#include "webrtc/modules/audio_coding/codecs/opus/audio_encoder_opus.h"
-
-namespace webrtc {
-
-// Opus encoder API for use as a template parameter to
-// CreateAudioEncoderFactory<...>().
-//
-// NOTE: At the moment, this struct actually resides in another file. This is a
-// temporary backwards compatibility hack; see
-// https://bugs.chromium.org/p/webrtc/issues/detail?id=7847
-//
-// NOTE: This struct is still under development and may change without notice.
-/*
-struct AudioEncoderOpus {
-  static rtc::Optional<AudioEncoderOpusConfig> SdpToConfig(
-      const SdpAudioFormat& audio_format);
-  static void AppendSupportedEncoders(std::vector<AudioCodecSpec>* specs);
-  static AudioCodecInfo QueryAudioEncoder(const AudioEncoderOpusConfig& config);
-  static std::unique_ptr<AudioEncoder> MakeAudioEncoder(
-      const AudioEncoderOpusConfig&,
-      int payload_type);
-};
-*/
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_API_AUDIO_CODECS_OPUS_AUDIO_ENCODER_OPUS_H_
diff --git a/api/audio_codecs/opus/audio_encoder_opus_config.cc b/api/audio_codecs/opus/audio_encoder_opus_config.cc
deleted file mode 100644
index 7d29883..0000000
--- a/api/audio_codecs/opus/audio_encoder_opus_config.cc
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- *  Copyright (c) 2017 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/api/audio_codecs/opus/audio_encoder_opus_config.h"
-
-namespace webrtc {
-
-namespace {
-
-#if defined(WEBRTC_ANDROID) || defined(WEBRTC_IOS) || defined(WEBRTC_ARCH_ARM)
-// If we are on Android, iOS and/or ARM, use a lower complexity setting by
-// default, to save encoder complexity.
-constexpr int kDefaultComplexity = 5;
-#else
-constexpr int kDefaultComplexity = 9;
-#endif
-
-constexpr int kDefaultLowRateComplexity =
-    WEBRTC_OPUS_VARIABLE_COMPLEXITY ? 9 : kDefaultComplexity;
-
-}  // namespace
-
-constexpr int AudioEncoderOpusConfig::kDefaultFrameSizeMs;
-constexpr int AudioEncoderOpusConfig::kMinBitrateBps;
-constexpr int AudioEncoderOpusConfig::kMaxBitrateBps;
-
-AudioEncoderOpusConfig::AudioEncoderOpusConfig()
-    : frame_size_ms(kDefaultFrameSizeMs),
-      num_channels(1),
-      application(ApplicationMode::kVoip),
-      bitrate_bps(32000),
-      fec_enabled(false),
-      cbr_enabled(false),
-      max_playback_rate_hz(48000),
-      complexity(kDefaultComplexity),
-      low_rate_complexity(kDefaultLowRateComplexity),
-      complexity_threshold_bps(12500),
-      complexity_threshold_window_bps(1500),
-      dtx_enabled(false),
-      uplink_bandwidth_update_interval_ms(200),
-      payload_type(-1) {}
-AudioEncoderOpusConfig::AudioEncoderOpusConfig(const AudioEncoderOpusConfig&) =
-    default;
-AudioEncoderOpusConfig::~AudioEncoderOpusConfig() = default;
-AudioEncoderOpusConfig& AudioEncoderOpusConfig::operator=(
-    const AudioEncoderOpusConfig&) = default;
-
-bool AudioEncoderOpusConfig::IsOk() const {
-  if (frame_size_ms <= 0 || frame_size_ms % 10 != 0)
-    return false;
-  if (num_channels != 1 && num_channels != 2)
-    return false;
-  if (!bitrate_bps)
-    return false;
-  if (*bitrate_bps < kMinBitrateBps || *bitrate_bps > kMaxBitrateBps)
-    return false;
-  if (complexity < 0 || complexity > 10)
-    return false;
-  if (low_rate_complexity < 0 || low_rate_complexity > 10)
-    return false;
-  return true;
-}
-}  // namespace webrtc
diff --git a/api/audio_codecs/opus/audio_encoder_opus_config.h b/api/audio_codecs/opus/audio_encoder_opus_config.h
deleted file mode 100644
index d07f784..0000000
--- a/api/audio_codecs/opus/audio_encoder_opus_config.h
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- *  Copyright (c) 2017 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_API_AUDIO_CODECS_OPUS_AUDIO_ENCODER_OPUS_CONFIG_H_
-#define WEBRTC_API_AUDIO_CODECS_OPUS_AUDIO_ENCODER_OPUS_CONFIG_H_
-
-#include <stddef.h>
-
-#include <vector>
-
-#include "webrtc/api/optional.h"
-
-namespace webrtc {
-
-// NOTE: This struct is still under development and may change without notice.
-struct AudioEncoderOpusConfig {
-  static constexpr int kDefaultFrameSizeMs = 20;
-
-  // Opus API allows a min bitrate of 500bps, but Opus documentation suggests
-  // bitrate should be in the range of 6000 to 510000, inclusive.
-  static constexpr int kMinBitrateBps = 6000;
-  static constexpr int kMaxBitrateBps = 510000;
-
-  AudioEncoderOpusConfig();
-  AudioEncoderOpusConfig(const AudioEncoderOpusConfig&);
-  ~AudioEncoderOpusConfig();
-  AudioEncoderOpusConfig& operator=(const AudioEncoderOpusConfig&);
-
-  bool IsOk() const;  // Checks if the values are currently OK.
-
-  int frame_size_ms;
-  size_t num_channels;
-  enum class ApplicationMode { kVoip, kAudio };
-  ApplicationMode application;
-
-  // NOTE: This member must always be set.
-  // TODO(kwiberg): Turn it into just an int.
-  rtc::Optional<int> bitrate_bps;
-
-  bool fec_enabled;
-  bool cbr_enabled;
-  int max_playback_rate_hz;
-
-  // |complexity| is used when the bitrate goes above
-  // |complexity_threshold_bps| + |complexity_threshold_window_bps|;
-  // |low_rate_complexity| is used when the bitrate falls below
-  // |complexity_threshold_bps| - |complexity_threshold_window_bps|. In the
-  // interval in the middle, we keep using the most recent of the two
-  // complexity settings.
-  int complexity;
-  int low_rate_complexity;
-  int complexity_threshold_bps;
-  int complexity_threshold_window_bps;
-
-  bool dtx_enabled;
-  std::vector<int> supported_frame_lengths_ms;
-  int uplink_bandwidth_update_interval_ms;
-
-  // NOTE: This member isn't necessary, and will soon go away. See
-  // https://bugs.chromium.org/p/webrtc/issues/detail?id=7847
-  int payload_type;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_API_AUDIO_CODECS_OPUS_AUDIO_ENCODER_OPUS_CONFIG_H_
diff --git a/api/audio_codecs/test/BUILD.gn b/api/audio_codecs/test/BUILD.gn
deleted file mode 100644
index 0f742f5..0000000
--- a/api/audio_codecs/test/BUILD.gn
+++ /dev/null
@@ -1,44 +0,0 @@
-# Copyright (c) 2017 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.
-
-import("../../../webrtc.gni")
-if (is_android) {
-  import("//build/config/android/config.gni")
-  import("//build/config/android/rules.gni")
-}
-
-if (rtc_include_tests) {
-  rtc_source_set("audio_codecs_api_unittests") {
-    testonly = true
-    sources = [
-      "audio_decoder_factory_template_unittest.cc",
-      "audio_encoder_factory_template_unittest.cc",
-    ]
-    deps = [
-      "..:audio_codecs_api",
-      "../../../rtc_base:rtc_base_approved",
-      "../../../test:audio_codec_mocks",
-      "../../../test:test_support",
-      "../L16:audio_decoder_L16",
-      "../L16:audio_encoder_L16",
-      "../g711:audio_decoder_g711",
-      "../g711:audio_encoder_g711",
-      "../g722:audio_decoder_g722",
-      "../g722:audio_encoder_g722",
-      "../ilbc:audio_decoder_ilbc",
-      "../ilbc:audio_encoder_ilbc",
-      "../isac:audio_decoder_isac_fix",
-      "../isac:audio_decoder_isac_float",
-      "../isac:audio_encoder_isac_fix",
-      "../isac:audio_encoder_isac_float",
-      "../opus:audio_decoder_opus",
-      "../opus:audio_encoder_opus",
-      "//testing/gmock",
-    ]
-  }
-}
diff --git a/api/audio_codecs/test/audio_decoder_factory_template_unittest.cc b/api/audio_codecs/test/audio_decoder_factory_template_unittest.cc
deleted file mode 100644
index 0b1135c..0000000
--- a/api/audio_codecs/test/audio_decoder_factory_template_unittest.cc
+++ /dev/null
@@ -1,241 +0,0 @@
-/*
- *  Copyright (c) 2017 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/api/audio_codecs/audio_decoder_factory_template.h"
-#include "webrtc/api/audio_codecs/L16/audio_decoder_L16.h"
-#include "webrtc/api/audio_codecs/g711/audio_decoder_g711.h"
-#include "webrtc/api/audio_codecs/g722/audio_decoder_g722.h"
-#include "webrtc/api/audio_codecs/ilbc/audio_decoder_ilbc.h"
-#include "webrtc/api/audio_codecs/isac/audio_decoder_isac_fix.h"
-#include "webrtc/api/audio_codecs/isac/audio_decoder_isac_float.h"
-#include "webrtc/api/audio_codecs/opus/audio_decoder_opus.h"
-#include "webrtc/rtc_base/ptr_util.h"
-#include "webrtc/test/gmock.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/mock_audio_decoder.h"
-
-namespace webrtc {
-
-namespace {
-
-struct BogusParams {
-  static SdpAudioFormat AudioFormat() { return {"bogus", 8000, 1}; }
-  static AudioCodecInfo CodecInfo() { return {8000, 1, 12345}; }
-};
-
-struct ShamParams {
-  static SdpAudioFormat AudioFormat() {
-    return {"sham", 16000, 2, {{"param", "value"}}};
-  }
-  static AudioCodecInfo CodecInfo() { return {16000, 2, 23456}; }
-};
-
-struct MyLittleConfig {
-  SdpAudioFormat audio_format;
-};
-
-template <typename Params>
-struct AudioDecoderFakeApi {
-  static rtc::Optional<MyLittleConfig> SdpToConfig(
-      const SdpAudioFormat& audio_format) {
-    if (Params::AudioFormat() == audio_format) {
-      MyLittleConfig config = {audio_format};
-      return rtc::Optional<MyLittleConfig>(config);
-    } else {
-      return rtc::Optional<MyLittleConfig>();
-    }
-  }
-
-  static void AppendSupportedDecoders(std::vector<AudioCodecSpec>* specs) {
-    specs->push_back({Params::AudioFormat(), Params::CodecInfo()});
-  }
-
-  static AudioCodecInfo QueryAudioDecoder(const MyLittleConfig&) {
-    return Params::CodecInfo();
-  }
-
-  static std::unique_ptr<AudioDecoder> MakeAudioDecoder(const MyLittleConfig&) {
-    auto dec = rtc::MakeUnique<testing::StrictMock<MockAudioDecoder>>();
-    EXPECT_CALL(*dec, SampleRateHz())
-        .WillOnce(testing::Return(Params::CodecInfo().sample_rate_hz));
-    EXPECT_CALL(*dec, Die());
-    return std::move(dec);
-  }
-};
-
-}  // namespace
-
-TEST(AudioDecoderFactoryTemplateTest, NoDecoderTypes) {
-  rtc::scoped_refptr<AudioDecoderFactory> factory(
-      new rtc::RefCountedObject<
-          audio_decoder_factory_template_impl::AudioDecoderFactoryT<>>());
-  EXPECT_THAT(factory->GetSupportedDecoders(), testing::IsEmpty());
-  EXPECT_FALSE(factory->IsSupportedDecoder({"foo", 8000, 1}));
-  EXPECT_EQ(nullptr, factory->MakeAudioDecoder({"bar", 16000, 1}));
-}
-
-TEST(AudioDecoderFactoryTemplateTest, OneDecoderType) {
-  auto factory = CreateAudioDecoderFactory<AudioDecoderFakeApi<BogusParams>>();
-  EXPECT_THAT(factory->GetSupportedDecoders(),
-              testing::ElementsAre(
-                  AudioCodecSpec{{"bogus", 8000, 1}, {8000, 1, 12345}}));
-  EXPECT_FALSE(factory->IsSupportedDecoder({"foo", 8000, 1}));
-  EXPECT_TRUE(factory->IsSupportedDecoder({"bogus", 8000, 1}));
-  EXPECT_EQ(nullptr, factory->MakeAudioDecoder({"bar", 16000, 1}));
-  auto dec = factory->MakeAudioDecoder({"bogus", 8000, 1});
-  ASSERT_NE(nullptr, dec);
-  EXPECT_EQ(8000, dec->SampleRateHz());
-}
-
-TEST(AudioDecoderFactoryTemplateTest, TwoDecoderTypes) {
-  auto factory = CreateAudioDecoderFactory<AudioDecoderFakeApi<BogusParams>,
-                                           AudioDecoderFakeApi<ShamParams>>();
-  EXPECT_THAT(factory->GetSupportedDecoders(),
-              testing::ElementsAre(
-                  AudioCodecSpec{{"bogus", 8000, 1}, {8000, 1, 12345}},
-                  AudioCodecSpec{{"sham", 16000, 2, {{"param", "value"}}},
-                                 {16000, 2, 23456}}));
-  EXPECT_FALSE(factory->IsSupportedDecoder({"foo", 8000, 1}));
-  EXPECT_TRUE(factory->IsSupportedDecoder({"bogus", 8000, 1}));
-  EXPECT_TRUE(
-      factory->IsSupportedDecoder({"sham", 16000, 2, {{"param", "value"}}}));
-  EXPECT_EQ(nullptr, factory->MakeAudioDecoder({"bar", 16000, 1}));
-  auto dec1 = factory->MakeAudioDecoder({"bogus", 8000, 1});
-  ASSERT_NE(nullptr, dec1);
-  EXPECT_EQ(8000, dec1->SampleRateHz());
-  EXPECT_EQ(nullptr, factory->MakeAudioDecoder({"sham", 16000, 2}));
-  auto dec2 =
-      factory->MakeAudioDecoder({"sham", 16000, 2, {{"param", "value"}}});
-  ASSERT_NE(nullptr, dec2);
-  EXPECT_EQ(16000, dec2->SampleRateHz());
-}
-
-TEST(AudioDecoderFactoryTemplateTest, G711) {
-  auto factory = CreateAudioDecoderFactory<AudioDecoderG711>();
-  EXPECT_THAT(factory->GetSupportedDecoders(),
-              testing::ElementsAre(
-                  AudioCodecSpec{{"PCMU", 8000, 1}, {8000, 1, 64000}},
-                  AudioCodecSpec{{"PCMA", 8000, 1}, {8000, 1, 64000}}));
-  EXPECT_FALSE(factory->IsSupportedDecoder({"G711", 8000, 1}));
-  EXPECT_TRUE(factory->IsSupportedDecoder({"PCMU", 8000, 1}));
-  EXPECT_TRUE(factory->IsSupportedDecoder({"pcma", 8000, 1}));
-  EXPECT_EQ(nullptr, factory->MakeAudioDecoder({"pcmu", 16000, 1}));
-  auto dec1 = factory->MakeAudioDecoder({"pcmu", 8000, 1});
-  ASSERT_NE(nullptr, dec1);
-  EXPECT_EQ(8000, dec1->SampleRateHz());
-  auto dec2 = factory->MakeAudioDecoder({"PCMA", 8000, 1});
-  ASSERT_NE(nullptr, dec2);
-  EXPECT_EQ(8000, dec2->SampleRateHz());
-}
-
-TEST(AudioDecoderFactoryTemplateTest, G722) {
-  auto factory = CreateAudioDecoderFactory<AudioDecoderG722>();
-  EXPECT_THAT(factory->GetSupportedDecoders(),
-              testing::ElementsAre(
-                  AudioCodecSpec{{"G722", 8000, 1}, {16000, 1, 64000}}));
-  EXPECT_FALSE(factory->IsSupportedDecoder({"foo", 8000, 1}));
-  EXPECT_TRUE(factory->IsSupportedDecoder({"G722", 8000, 1}));
-  EXPECT_EQ(nullptr, factory->MakeAudioDecoder({"bar", 16000, 1}));
-  auto dec1 = factory->MakeAudioDecoder({"G722", 8000, 1});
-  ASSERT_NE(nullptr, dec1);
-  EXPECT_EQ(16000, dec1->SampleRateHz());
-  EXPECT_EQ(1u, dec1->Channels());
-  auto dec2 = factory->MakeAudioDecoder({"G722", 8000, 2});
-  ASSERT_NE(nullptr, dec2);
-  EXPECT_EQ(16000, dec2->SampleRateHz());
-  EXPECT_EQ(2u, dec2->Channels());
-  auto dec3 = factory->MakeAudioDecoder({"G722", 8000, 3});
-  ASSERT_EQ(nullptr, dec3);
-}
-
-TEST(AudioDecoderFactoryTemplateTest, Ilbc) {
-  auto factory = CreateAudioDecoderFactory<AudioDecoderIlbc>();
-  EXPECT_THAT(factory->GetSupportedDecoders(),
-              testing::ElementsAre(
-                  AudioCodecSpec{{"ILBC", 8000, 1}, {8000, 1, 13300}}));
-  EXPECT_FALSE(factory->IsSupportedDecoder({"foo", 8000, 1}));
-  EXPECT_TRUE(factory->IsSupportedDecoder({"ilbc", 8000, 1}));
-  EXPECT_EQ(nullptr, factory->MakeAudioDecoder({"bar", 8000, 1}));
-  auto dec = factory->MakeAudioDecoder({"ilbc", 8000, 1});
-  ASSERT_NE(nullptr, dec);
-  EXPECT_EQ(8000, dec->SampleRateHz());
-}
-
-TEST(AudioDecoderFactoryTemplateTest, IsacFix) {
-  auto factory = CreateAudioDecoderFactory<AudioDecoderIsacFix>();
-  EXPECT_THAT(factory->GetSupportedDecoders(),
-              testing::ElementsAre(AudioCodecSpec{
-                  {"ISAC", 16000, 1}, {16000, 1, 32000, 10000, 32000}}));
-  EXPECT_FALSE(factory->IsSupportedDecoder({"isac", 16000, 2}));
-  EXPECT_TRUE(factory->IsSupportedDecoder({"isac", 16000, 1}));
-  EXPECT_FALSE(factory->IsSupportedDecoder({"isac", 32000, 1}));
-  EXPECT_EQ(nullptr, factory->MakeAudioDecoder({"isac", 8000, 1}));
-  auto dec = factory->MakeAudioDecoder({"isac", 16000, 1});
-  ASSERT_NE(nullptr, dec);
-  EXPECT_EQ(16000, dec->SampleRateHz());
-}
-
-TEST(AudioDecoderFactoryTemplateTest, IsacFloat) {
-  auto factory = CreateAudioDecoderFactory<AudioDecoderIsacFloat>();
-  EXPECT_THAT(
-      factory->GetSupportedDecoders(),
-      testing::ElementsAre(
-          AudioCodecSpec{{"ISAC", 16000, 1}, {16000, 1, 32000, 10000, 32000}},
-          AudioCodecSpec{{"ISAC", 32000, 1}, {32000, 1, 56000, 10000, 56000}}));
-  EXPECT_FALSE(factory->IsSupportedDecoder({"isac", 16000, 2}));
-  EXPECT_TRUE(factory->IsSupportedDecoder({"isac", 16000, 1}));
-  EXPECT_TRUE(factory->IsSupportedDecoder({"isac", 32000, 1}));
-  EXPECT_EQ(nullptr, factory->MakeAudioDecoder({"isac", 8000, 1}));
-  auto dec1 = factory->MakeAudioDecoder({"isac", 16000, 1});
-  ASSERT_NE(nullptr, dec1);
-  EXPECT_EQ(16000, dec1->SampleRateHz());
-  auto dec2 = factory->MakeAudioDecoder({"isac", 32000, 1});
-  ASSERT_NE(nullptr, dec2);
-  EXPECT_EQ(32000, dec2->SampleRateHz());
-}
-
-TEST(AudioDecoderFactoryTemplateTest, L16) {
-  auto factory = CreateAudioDecoderFactory<AudioDecoderL16>();
-  EXPECT_THAT(
-      factory->GetSupportedDecoders(),
-      testing::ElementsAre(
-          AudioCodecSpec{{"L16", 8000, 1}, {8000, 1, 8000 * 16}},
-          AudioCodecSpec{{"L16", 16000, 1}, {16000, 1, 16000 * 16}},
-          AudioCodecSpec{{"L16", 32000, 1}, {32000, 1, 32000 * 16}},
-          AudioCodecSpec{{"L16", 8000, 2}, {8000, 2, 8000 * 16 * 2}},
-          AudioCodecSpec{{"L16", 16000, 2}, {16000, 2, 16000 * 16 * 2}},
-          AudioCodecSpec{{"L16", 32000, 2}, {32000, 2, 32000 * 16 * 2}}));
-  EXPECT_FALSE(factory->IsSupportedDecoder({"foo", 8000, 1}));
-  EXPECT_TRUE(factory->IsSupportedDecoder({"L16", 48000, 1}));
-  EXPECT_FALSE(factory->IsSupportedDecoder({"L16", 96000, 1}));
-  EXPECT_EQ(nullptr, factory->MakeAudioDecoder({"L16", 8000, 0}));
-  auto dec = factory->MakeAudioDecoder({"L16", 48000, 2});
-  ASSERT_NE(nullptr, dec);
-  EXPECT_EQ(48000, dec->SampleRateHz());
-}
-
-TEST(AudioDecoderFactoryTemplateTest, Opus) {
-  auto factory = CreateAudioDecoderFactory<AudioDecoderOpus>();
-  AudioCodecInfo opus_info{48000, 1, 64000, 6000, 510000};
-  opus_info.allow_comfort_noise = false;
-  opus_info.supports_network_adaption = true;
-  const SdpAudioFormat opus_format(
-      {"opus", 48000, 2, {{"minptime", "10"}, {"useinbandfec", "1"}}});
-  EXPECT_THAT(factory->GetSupportedDecoders(),
-              testing::ElementsAre(AudioCodecSpec{opus_format, opus_info}));
-  EXPECT_FALSE(factory->IsSupportedDecoder({"opus", 48000, 1}));
-  EXPECT_TRUE(factory->IsSupportedDecoder({"opus", 48000, 2}));
-  EXPECT_EQ(nullptr, factory->MakeAudioDecoder({"bar", 16000, 1}));
-  auto dec = factory->MakeAudioDecoder({"opus", 48000, 2});
-  ASSERT_NE(nullptr, dec);
-  EXPECT_EQ(48000, dec->SampleRateHz());
-}
-
-}  // namespace webrtc
diff --git a/api/audio_codecs/test/audio_encoder_factory_template_unittest.cc b/api/audio_codecs/test/audio_encoder_factory_template_unittest.cc
deleted file mode 100644
index 891821a..0000000
--- a/api/audio_codecs/test/audio_encoder_factory_template_unittest.cc
+++ /dev/null
@@ -1,263 +0,0 @@
-/*
- *  Copyright (c) 2017 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/api/audio_codecs/audio_encoder_factory_template.h"
-#include "webrtc/api/audio_codecs/L16/audio_encoder_L16.h"
-#include "webrtc/api/audio_codecs/g711/audio_encoder_g711.h"
-#include "webrtc/api/audio_codecs/g722/audio_encoder_g722.h"
-#include "webrtc/api/audio_codecs/ilbc/audio_encoder_ilbc.h"
-#include "webrtc/api/audio_codecs/isac/audio_encoder_isac_fix.h"
-#include "webrtc/api/audio_codecs/isac/audio_encoder_isac_float.h"
-#include "webrtc/api/audio_codecs/opus/audio_encoder_opus.h"
-#include "webrtc/rtc_base/ptr_util.h"
-#include "webrtc/test/gmock.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/mock_audio_encoder.h"
-
-namespace webrtc {
-
-namespace {
-
-struct BogusParams {
-  static SdpAudioFormat AudioFormat() { return {"bogus", 8000, 1}; }
-  static AudioCodecInfo CodecInfo() { return {8000, 1, 12345}; }
-};
-
-struct ShamParams {
-  static SdpAudioFormat AudioFormat() {
-    return {"sham", 16000, 2, {{"param", "value"}}};
-  }
-  static AudioCodecInfo CodecInfo() { return {16000, 2, 23456}; }
-};
-
-struct MyLittleConfig {
-  SdpAudioFormat audio_format;
-};
-
-template <typename Params>
-struct AudioEncoderFakeApi {
-  static rtc::Optional<MyLittleConfig> SdpToConfig(
-      const SdpAudioFormat& audio_format) {
-    if (Params::AudioFormat() == audio_format) {
-      MyLittleConfig config = {audio_format};
-      return rtc::Optional<MyLittleConfig>(config);
-    } else {
-      return rtc::Optional<MyLittleConfig>();
-    }
-  }
-
-  static void AppendSupportedEncoders(std::vector<AudioCodecSpec>* specs) {
-    specs->push_back({Params::AudioFormat(), Params::CodecInfo()});
-  }
-
-  static AudioCodecInfo QueryAudioEncoder(const MyLittleConfig&) {
-    return Params::CodecInfo();
-  }
-
-  static std::unique_ptr<AudioEncoder> MakeAudioEncoder(const MyLittleConfig&,
-                                                        int payload_type) {
-    auto enc = rtc::MakeUnique<testing::StrictMock<MockAudioEncoder>>();
-    EXPECT_CALL(*enc, SampleRateHz())
-        .WillOnce(testing::Return(Params::CodecInfo().sample_rate_hz));
-    EXPECT_CALL(*enc, Die());
-    return std::move(enc);
-  }
-};
-
-}  // namespace
-
-TEST(AudioEncoderFactoryTemplateTest, NoEncoderTypes) {
-  rtc::scoped_refptr<AudioEncoderFactory> factory(
-      new rtc::RefCountedObject<
-          audio_encoder_factory_template_impl::AudioEncoderFactoryT<>>());
-  EXPECT_THAT(factory->GetSupportedEncoders(), testing::IsEmpty());
-  EXPECT_EQ(rtc::Optional<AudioCodecInfo>(),
-            factory->QueryAudioEncoder({"foo", 8000, 1}));
-  EXPECT_EQ(nullptr, factory->MakeAudioEncoder(17, {"bar", 16000, 1}));
-}
-
-TEST(AudioEncoderFactoryTemplateTest, OneEncoderType) {
-  auto factory = CreateAudioEncoderFactory<AudioEncoderFakeApi<BogusParams>>();
-  EXPECT_THAT(factory->GetSupportedEncoders(),
-              testing::ElementsAre(
-                  AudioCodecSpec{{"bogus", 8000, 1}, {8000, 1, 12345}}));
-  EXPECT_EQ(rtc::Optional<AudioCodecInfo>(),
-            factory->QueryAudioEncoder({"foo", 8000, 1}));
-  EXPECT_EQ(rtc::Optional<AudioCodecInfo>({8000, 1, 12345}),
-            factory->QueryAudioEncoder({"bogus", 8000, 1}));
-  EXPECT_EQ(nullptr, factory->MakeAudioEncoder(17, {"bar", 16000, 1}));
-  auto enc = factory->MakeAudioEncoder(17, {"bogus", 8000, 1});
-  ASSERT_NE(nullptr, enc);
-  EXPECT_EQ(8000, enc->SampleRateHz());
-}
-
-TEST(AudioEncoderFactoryTemplateTest, TwoEncoderTypes) {
-  auto factory = CreateAudioEncoderFactory<AudioEncoderFakeApi<BogusParams>,
-                                           AudioEncoderFakeApi<ShamParams>>();
-  EXPECT_THAT(factory->GetSupportedEncoders(),
-              testing::ElementsAre(
-                  AudioCodecSpec{{"bogus", 8000, 1}, {8000, 1, 12345}},
-                  AudioCodecSpec{{"sham", 16000, 2, {{"param", "value"}}},
-                                 {16000, 2, 23456}}));
-  EXPECT_EQ(rtc::Optional<AudioCodecInfo>(),
-            factory->QueryAudioEncoder({"foo", 8000, 1}));
-  EXPECT_EQ(rtc::Optional<AudioCodecInfo>({8000, 1, 12345}),
-            factory->QueryAudioEncoder({"bogus", 8000, 1}));
-  EXPECT_EQ(
-      rtc::Optional<AudioCodecInfo>({16000, 2, 23456}),
-      factory->QueryAudioEncoder({"sham", 16000, 2, {{"param", "value"}}}));
-  EXPECT_EQ(nullptr, factory->MakeAudioEncoder(17, {"bar", 16000, 1}));
-  auto enc1 = factory->MakeAudioEncoder(17, {"bogus", 8000, 1});
-  ASSERT_NE(nullptr, enc1);
-  EXPECT_EQ(8000, enc1->SampleRateHz());
-  EXPECT_EQ(nullptr, factory->MakeAudioEncoder(17, {"sham", 16000, 2}));
-  auto enc2 =
-      factory->MakeAudioEncoder(17, {"sham", 16000, 2, {{"param", "value"}}});
-  ASSERT_NE(nullptr, enc2);
-  EXPECT_EQ(16000, enc2->SampleRateHz());
-}
-
-TEST(AudioEncoderFactoryTemplateTest, G711) {
-  auto factory = CreateAudioEncoderFactory<AudioEncoderG711>();
-  EXPECT_THAT(factory->GetSupportedEncoders(),
-              testing::ElementsAre(
-                  AudioCodecSpec{{"PCMU", 8000, 1}, {8000, 1, 64000}},
-                  AudioCodecSpec{{"PCMA", 8000, 1}, {8000, 1, 64000}}));
-  EXPECT_EQ(rtc::Optional<AudioCodecInfo>(),
-            factory->QueryAudioEncoder({"PCMA", 16000, 1}));
-  EXPECT_EQ(rtc::Optional<AudioCodecInfo>({8000, 1, 64000}),
-            factory->QueryAudioEncoder({"PCMA", 8000, 1}));
-  EXPECT_EQ(nullptr, factory->MakeAudioEncoder(17, {"PCMU", 16000, 1}));
-  auto enc1 = factory->MakeAudioEncoder(17, {"PCMU", 8000, 1});
-  ASSERT_NE(nullptr, enc1);
-  EXPECT_EQ(8000, enc1->SampleRateHz());
-  auto enc2 = factory->MakeAudioEncoder(17, {"PCMA", 8000, 1});
-  ASSERT_NE(nullptr, enc2);
-  EXPECT_EQ(8000, enc2->SampleRateHz());
-}
-
-TEST(AudioEncoderFactoryTemplateTest, G722) {
-  auto factory = CreateAudioEncoderFactory<AudioEncoderG722>();
-  EXPECT_THAT(factory->GetSupportedEncoders(),
-              testing::ElementsAre(
-                  AudioCodecSpec{{"G722", 8000, 1}, {16000, 1, 64000}}));
-  EXPECT_EQ(rtc::Optional<AudioCodecInfo>(),
-            factory->QueryAudioEncoder({"foo", 8000, 1}));
-  EXPECT_EQ(rtc::Optional<AudioCodecInfo>({16000, 1, 64000}),
-            factory->QueryAudioEncoder({"G722", 8000, 1}));
-  EXPECT_EQ(nullptr, factory->MakeAudioEncoder(17, {"bar", 16000, 1}));
-  auto enc = factory->MakeAudioEncoder(17, {"G722", 8000, 1});
-  ASSERT_NE(nullptr, enc);
-  EXPECT_EQ(16000, enc->SampleRateHz());
-}
-
-TEST(AudioEncoderFactoryTemplateTest, Ilbc) {
-  auto factory = CreateAudioEncoderFactory<AudioEncoderIlbc>();
-  EXPECT_THAT(factory->GetSupportedEncoders(),
-              testing::ElementsAre(
-                  AudioCodecSpec{{"ILBC", 8000, 1}, {8000, 1, 13333}}));
-  EXPECT_EQ(rtc::Optional<AudioCodecInfo>(),
-            factory->QueryAudioEncoder({"foo", 8000, 1}));
-  EXPECT_EQ(rtc::Optional<AudioCodecInfo>({8000, 1, 13333}),
-            factory->QueryAudioEncoder({"ilbc", 8000, 1}));
-  EXPECT_EQ(nullptr, factory->MakeAudioEncoder(17, {"bar", 8000, 1}));
-  auto enc = factory->MakeAudioEncoder(17, {"ilbc", 8000, 1});
-  ASSERT_NE(nullptr, enc);
-  EXPECT_EQ(8000, enc->SampleRateHz());
-}
-
-TEST(AudioEncoderFactoryTemplateTest, IsacFix) {
-  auto factory = CreateAudioEncoderFactory<AudioEncoderIsacFix>();
-  EXPECT_THAT(factory->GetSupportedEncoders(),
-              testing::ElementsAre(AudioCodecSpec{
-                  {"ISAC", 16000, 1}, {16000, 1, 32000, 10000, 32000}}));
-  EXPECT_EQ(rtc::Optional<AudioCodecInfo>(),
-            factory->QueryAudioEncoder({"isac", 16000, 2}));
-  EXPECT_EQ(rtc::Optional<AudioCodecInfo>({16000, 1, 32000, 10000, 32000}),
-            factory->QueryAudioEncoder({"isac", 16000, 1}));
-  EXPECT_EQ(rtc::Optional<AudioCodecInfo>(),
-            factory->QueryAudioEncoder({"isac", 32000, 1}));
-  EXPECT_EQ(nullptr, factory->MakeAudioEncoder(17, {"isac", 8000, 1}));
-  auto enc1 = factory->MakeAudioEncoder(17, {"isac", 16000, 1});
-  ASSERT_NE(nullptr, enc1);
-  EXPECT_EQ(16000, enc1->SampleRateHz());
-  EXPECT_EQ(3u, enc1->Num10MsFramesInNextPacket());
-  auto enc2 =
-      factory->MakeAudioEncoder(17, {"isac", 16000, 1, {{"ptime", "60"}}});
-  ASSERT_NE(nullptr, enc2);
-  EXPECT_EQ(6u, enc2->Num10MsFramesInNextPacket());
-}
-
-TEST(AudioEncoderFactoryTemplateTest, IsacFloat) {
-  auto factory = CreateAudioEncoderFactory<AudioEncoderIsacFloat>();
-  EXPECT_THAT(
-      factory->GetSupportedEncoders(),
-      testing::ElementsAre(
-          AudioCodecSpec{{"ISAC", 16000, 1}, {16000, 1, 32000, 10000, 32000}},
-          AudioCodecSpec{{"ISAC", 32000, 1}, {32000, 1, 56000, 10000, 56000}}));
-  EXPECT_EQ(rtc::Optional<AudioCodecInfo>(),
-            factory->QueryAudioEncoder({"isac", 16000, 2}));
-  EXPECT_EQ(rtc::Optional<AudioCodecInfo>({16000, 1, 32000, 10000, 32000}),
-            factory->QueryAudioEncoder({"isac", 16000, 1}));
-  EXPECT_EQ(rtc::Optional<AudioCodecInfo>({32000, 1, 56000, 10000, 56000}),
-            factory->QueryAudioEncoder({"isac", 32000, 1}));
-  EXPECT_EQ(nullptr, factory->MakeAudioEncoder(17, {"isac", 8000, 1}));
-  auto enc1 = factory->MakeAudioEncoder(17, {"isac", 16000, 1});
-  ASSERT_NE(nullptr, enc1);
-  EXPECT_EQ(16000, enc1->SampleRateHz());
-  auto enc2 = factory->MakeAudioEncoder(17, {"isac", 32000, 1});
-  ASSERT_NE(nullptr, enc2);
-  EXPECT_EQ(32000, enc2->SampleRateHz());
-}
-
-TEST(AudioEncoderFactoryTemplateTest, L16) {
-  auto factory = CreateAudioEncoderFactory<AudioEncoderL16>();
-  EXPECT_THAT(
-      factory->GetSupportedEncoders(),
-      testing::ElementsAre(
-          AudioCodecSpec{{"L16", 8000, 1}, {8000, 1, 8000 * 16}},
-          AudioCodecSpec{{"L16", 16000, 1}, {16000, 1, 16000 * 16}},
-          AudioCodecSpec{{"L16", 32000, 1}, {32000, 1, 32000 * 16}},
-          AudioCodecSpec{{"L16", 8000, 2}, {8000, 2, 8000 * 16 * 2}},
-          AudioCodecSpec{{"L16", 16000, 2}, {16000, 2, 16000 * 16 * 2}},
-          AudioCodecSpec{{"L16", 32000, 2}, {32000, 2, 32000 * 16 * 2}}));
-  EXPECT_EQ(rtc::Optional<AudioCodecInfo>(),
-            factory->QueryAudioEncoder({"L16", 8000, 0}));
-  EXPECT_EQ(rtc::Optional<AudioCodecInfo>({48000, 1, 48000 * 16}),
-            factory->QueryAudioEncoder({"L16", 48000, 1}));
-  EXPECT_EQ(nullptr, factory->MakeAudioEncoder(17, {"L16", 8000, 0}));
-  auto enc = factory->MakeAudioEncoder(17, {"L16", 48000, 2});
-  ASSERT_NE(nullptr, enc);
-  EXPECT_EQ(48000, enc->SampleRateHz());
-}
-
-TEST(AudioEncoderFactoryTemplateTest, Opus) {
-  auto factory = CreateAudioEncoderFactory<AudioEncoderOpus>();
-  AudioCodecInfo info = {48000, 1, 32000, 6000, 510000};
-  info.allow_comfort_noise = false;
-  info.supports_network_adaption = true;
-  EXPECT_THAT(
-      factory->GetSupportedEncoders(),
-      testing::ElementsAre(AudioCodecSpec{
-          {"opus", 48000, 2, {{"minptime", "10"}, {"useinbandfec", "1"}}},
-          info}));
-  EXPECT_EQ(rtc::Optional<AudioCodecInfo>(),
-            factory->QueryAudioEncoder({"foo", 8000, 1}));
-  EXPECT_EQ(
-      rtc::Optional<AudioCodecInfo>(info),
-      factory->QueryAudioEncoder(
-          {"opus", 48000, 2, {{"minptime", "10"}, {"useinbandfec", "1"}}}));
-  EXPECT_EQ(nullptr, factory->MakeAudioEncoder(17, {"bar", 16000, 1}));
-  auto enc = factory->MakeAudioEncoder(17, {"opus", 48000, 2});
-  ASSERT_NE(nullptr, enc);
-  EXPECT_EQ(48000, enc->SampleRateHz());
-}
-
-}  // namespace webrtc
diff --git a/api/call/audio_sink.h b/api/call/audio_sink.h
deleted file mode 100644
index 8d38763..0000000
--- a/api/call/audio_sink.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- *  Copyright (c) 2015 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_API_CALL_AUDIO_SINK_H_
-#define WEBRTC_API_CALL_AUDIO_SINK_H_
-
-#if defined(WEBRTC_POSIX) && !defined(__STDC_FORMAT_MACROS)
-// Avoid conflict with format_macros.h.
-#define __STDC_FORMAT_MACROS
-#endif
-
-#include <inttypes.h>
-#include <stddef.h>
-
-namespace webrtc {
-
-// Represents a simple push audio sink.
-class AudioSinkInterface {
- public:
-  virtual ~AudioSinkInterface() {}
-
-  struct Data {
-    Data(const int16_t* data,
-         size_t samples_per_channel,
-         int sample_rate,
-         size_t channels,
-         uint32_t timestamp)
-        : data(data),
-          samples_per_channel(samples_per_channel),
-          sample_rate(sample_rate),
-          channels(channels),
-          timestamp(timestamp) {}
-
-    const int16_t* data;         // The actual 16bit audio data.
-    size_t samples_per_channel;  // Number of frames in the buffer.
-    int sample_rate;             // Sample rate in Hz.
-    size_t channels;             // Number of channels in the audio data.
-    uint32_t timestamp;          // The RTP timestamp of the first sample.
-  };
-
-  virtual void OnData(const Data& audio) = 0;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_API_CALL_AUDIO_SINK_H_
diff --git a/api/call/transport.h b/api/call/transport.h
deleted file mode 100644
index 1126f62..0000000
--- a/api/call/transport.h
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- *  Copyright (c) 2013 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_API_CALL_TRANSPORT_H_
-#define WEBRTC_API_CALL_TRANSPORT_H_
-
-#include <stddef.h>
-#include <stdint.h>
-
-namespace webrtc {
-
-// TODO(holmer): Look into unifying this with the PacketOptions in
-// asyncpacketsocket.h.
-struct PacketOptions {
-  // A 16 bits positive id. Negative ids are invalid and should be interpreted
-  // as packet_id not being set.
-  int packet_id = -1;
-};
-
-class Transport {
- public:
-  virtual bool SendRtp(const uint8_t* packet,
-                       size_t length,
-                       const PacketOptions& options) = 0;
-  virtual bool SendRtcp(const uint8_t* packet, size_t length) = 0;
-
- protected:
-  virtual ~Transport() {}
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_API_CALL_TRANSPORT_H_
diff --git a/api/datachannel.h b/api/datachannel.h
deleted file mode 100644
index 28112ad..0000000
--- a/api/datachannel.h
+++ /dev/null
@@ -1,18 +0,0 @@
-/*
- *  Copyright 2012 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_API_DATACHANNEL_H_
-#define WEBRTC_API_DATACHANNEL_H_
-
-// Including this file is deprecated. It is no longer part of the public API.
-// This only includes the file in its new location for backwards compatibility.
-#include "webrtc/pc/datachannel.h"
-
-#endif  // WEBRTC_API_DATACHANNEL_H_
diff --git a/api/datachannelinterface.h b/api/datachannelinterface.h
deleted file mode 100644
index 1395a2e..0000000
--- a/api/datachannelinterface.h
+++ /dev/null
@@ -1,183 +0,0 @@
-/*
- *  Copyright 2012 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.
- */
-
-// This file contains interfaces for DataChannels
-// http://dev.w3.org/2011/webrtc/editor/webrtc.html#rtcdatachannel
-
-#ifndef WEBRTC_API_DATACHANNELINTERFACE_H_
-#define WEBRTC_API_DATACHANNELINTERFACE_H_
-
-#include <string>
-
-#include "webrtc/rtc_base/basictypes.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/copyonwritebuffer.h"
-#include "webrtc/rtc_base/refcount.h"
-
-namespace webrtc {
-
-// C++ version of: https://www.w3.org/TR/webrtc/#idl-def-rtcdatachannelinit
-// TODO(deadbeef): Use rtc::Optional for the "-1 if unset" things.
-struct DataChannelInit {
-  // Deprecated. Reliability is assumed, and channel will be unreliable if
-  // maxRetransmitTime or MaxRetransmits is set.
-  bool reliable = false;
-
-  // True if ordered delivery is required.
-  bool ordered = true;
-
-  // The max period of time in milliseconds in which retransmissions will be
-  // sent. After this time, no more retransmissions will be sent. -1 if unset.
-  //
-  // Cannot be set along with |maxRetransmits|.
-  int maxRetransmitTime = -1;
-
-  // The max number of retransmissions. -1 if unset.
-  //
-  // Cannot be set along with |maxRetransmitTime|.
-  int maxRetransmits = -1;
-
-  // This is set by the application and opaque to the WebRTC implementation.
-  std::string protocol;
-
-  // True if the channel has been externally negotiated and we do not send an
-  // in-band signalling in the form of an "open" message. If this is true, |id|
-  // below must be set; otherwise it should be unset and will be negotiated
-  // in-band.
-  bool negotiated = false;
-
-  // The stream id, or SID, for SCTP data channels. -1 if unset (see above).
-  int id = -1;
-};
-
-// At the JavaScript level, data can be passed in as a string or a blob, so
-// this structure's |binary| flag tells whether the data should be interpreted
-// as binary or text.
-struct DataBuffer {
-  DataBuffer(const rtc::CopyOnWriteBuffer& data, bool binary)
-      : data(data),
-        binary(binary) {
-  }
-  // For convenience for unit tests.
-  explicit DataBuffer(const std::string& text)
-      : data(text.data(), text.length()),
-        binary(false) {
-  }
-  size_t size() const { return data.size(); }
-
-  rtc::CopyOnWriteBuffer data;
-  // Indicates if the received data contains UTF-8 or binary data.
-  // Note that the upper layers are left to verify the UTF-8 encoding.
-  // TODO(jiayl): prefer to use an enum instead of a bool.
-  bool binary;
-};
-
-// Used to implement RTCDataChannel events.
-//
-// The code responding to these callbacks should unwind the stack before
-// using any other webrtc APIs; re-entrancy is not supported.
-class DataChannelObserver {
- public:
-  // The data channel state have changed.
-  virtual void OnStateChange() = 0;
-  //  A data buffer was successfully received.
-  virtual void OnMessage(const DataBuffer& buffer) = 0;
-  // The data channel's buffered_amount has changed.
-  virtual void OnBufferedAmountChange(uint64_t previous_amount) {}
-
- protected:
-  virtual ~DataChannelObserver() {}
-};
-
-class DataChannelInterface : public rtc::RefCountInterface {
- public:
-  // C++ version of: https://www.w3.org/TR/webrtc/#idl-def-rtcdatachannelstate
-  // Unlikely to change, but keep in sync with DataChannel.java:State and
-  // RTCDataChannel.h:RTCDataChannelState.
-  enum DataState {
-    kConnecting,
-    kOpen,  // The DataChannel is ready to send data.
-    kClosing,
-    kClosed
-  };
-
-  static const char* DataStateString(DataState state) {
-    switch (state) {
-      case kConnecting:
-        return "connecting";
-      case kOpen:
-        return "open";
-      case kClosing:
-        return "closing";
-      case kClosed:
-        return "closed";
-    }
-    RTC_CHECK(false) << "Unknown DataChannel state: " << state;
-    return "";
-  }
-
-  // Used to receive events from the data channel. Only one observer can be
-  // registered at a time. UnregisterObserver should be called before the
-  // observer object is destroyed.
-  virtual void RegisterObserver(DataChannelObserver* observer) = 0;
-  virtual void UnregisterObserver() = 0;
-
-  // The label attribute represents a label that can be used to distinguish this
-  // DataChannel object from other DataChannel objects.
-  virtual std::string label() const = 0;
-
-  // The accessors below simply return the properties from the DataChannelInit
-  // the data channel was constructed with.
-  virtual bool reliable() const = 0;
-  // TODO(deadbeef): Remove these dummy implementations when all classes have
-  // implemented these APIs. They should all just return the values the
-  // DataChannel was created with.
-  virtual bool ordered() const { return false; }
-  virtual uint16_t maxRetransmitTime() const { return 0; }
-  virtual uint16_t maxRetransmits() const { return 0; }
-  virtual std::string protocol() const { return std::string(); }
-  virtual bool negotiated() const { return false; }
-
-  // Returns the ID from the DataChannelInit, if it was negotiated out-of-band.
-  // If negotiated in-band, this ID will be populated once the DTLS role is
-  // determined, and until then this will return -1.
-  virtual int id() const = 0;
-  virtual DataState state() const = 0;
-  virtual uint32_t messages_sent() const = 0;
-  virtual uint64_t bytes_sent() const = 0;
-  virtual uint32_t messages_received() const = 0;
-  virtual uint64_t bytes_received() const = 0;
-
-  // Returns the number of bytes of application data (UTF-8 text and binary
-  // data) that have been queued using Send but have not yet been processed at
-  // the SCTP level. See comment above Send below.
-  virtual uint64_t buffered_amount() const = 0;
-
-  // Begins the graceful data channel closing procedure. See:
-  // https://tools.ietf.org/html/draft-ietf-rtcweb-data-channel-13#section-6.7
-  virtual void Close() = 0;
-
-  // Sends |data| to the remote peer. If the data can't be sent at the SCTP
-  // level (due to congestion control), it's buffered at the data channel level,
-  // up to a maximum of 16MB. If Send is called while this buffer is full, the
-  // data channel will be closed abruptly.
-  //
-  // So, it's important to use buffered_amount() and OnBufferedAmountChange to
-  // ensure the data channel is used efficiently but without filling this
-  // buffer.
-  virtual bool Send(const DataBuffer& buffer) = 0;
-
- protected:
-  virtual ~DataChannelInterface() {}
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_API_DATACHANNELINTERFACE_H_
diff --git a/api/dtmfsenderinterface.h b/api/dtmfsenderinterface.h
deleted file mode 100644
index 68a08ff..0000000
--- a/api/dtmfsenderinterface.h
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- *  Copyright 2012 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_API_DTMFSENDERINTERFACE_H_
-#define WEBRTC_API_DTMFSENDERINTERFACE_H_
-
-#include <string>
-
-#include "webrtc/api/mediastreaminterface.h"
-#include "webrtc/rtc_base/refcount.h"
-
-namespace webrtc {
-
-// DtmfSender callback interface, used to implement RTCDtmfSender events.
-// Applications should implement this interface to get notifications from the
-// DtmfSender.
-class DtmfSenderObserverInterface {
- public:
-  // Triggered when DTMF |tone| is sent.
-  // If |tone| is empty that means the DtmfSender has sent out all the given
-  // tones.
-  virtual void OnToneChange(const std::string& tone) = 0;
-
- protected:
-  virtual ~DtmfSenderObserverInterface() {}
-};
-
-// The interface of native implementation of the RTCDTMFSender defined by the
-// WebRTC W3C Editor's Draft.
-// See: https://www.w3.org/TR/webrtc/#peer-to-peer-dtmf
-class DtmfSenderInterface : public rtc::RefCountInterface {
- public:
-  // Used to receive events from the DTMF sender. Only one observer can be
-  // registered at a time. UnregisterObserver should be called before the
-  // observer object is destroyed.
-  virtual void RegisterObserver(DtmfSenderObserverInterface* observer) = 0;
-  virtual void UnregisterObserver() = 0;
-
-  // Returns true if this DtmfSender is capable of sending DTMF. Otherwise
-  // returns false. To be able to send DTMF, the associated RtpSender must be
-  // able to send packets, and a "telephone-event" codec must be negotiated.
-  virtual bool CanInsertDtmf() = 0;
-
-  // Queues a task that sends the DTMF |tones|. The |tones| parameter is treated
-  // as a series of characters. The characters 0 through 9, A through D, #, and
-  // * generate the associated DTMF tones. The characters a to d are equivalent
-  // to A to D. The character ',' indicates a delay of 2 seconds before
-  // processing the next character in the tones parameter.
-  //
-  // Unrecognized characters are ignored.
-  //
-  // The |duration| parameter indicates the duration in ms to use for each
-  // character passed in the |tones| parameter. The duration cannot be more
-  // than 6000 or less than 70.
-  //
-  // The |inter_tone_gap| parameter indicates the gap between tones in ms. The
-  // |inter_tone_gap| must be at least 50 ms but should be as short as
-  // possible.
-  //
-  // If InsertDtmf is called on the same object while an existing task for this
-  // object to generate DTMF is still running, the previous task is canceled.
-  // Returns true on success and false on failure.
-  virtual bool InsertDtmf(const std::string& tones, int duration,
-                          int inter_tone_gap) = 0;
-
-  // Returns the track given as argument to the constructor. Only exists for
-  // backwards compatibilty; now that DtmfSenders are tied to RtpSenders, it's
-  // no longer relevant.
-  virtual const AudioTrackInterface* track() const = 0;
-
-  // Returns the tones remaining to be played out.
-  virtual std::string tones() const = 0;
-
-  // Returns the current tone duration value in ms.
-  // This value will be the value last set via the InsertDtmf() method, or the
-  // default value of 100 ms if InsertDtmf() was never called.
-  virtual int duration() const = 0;
-
-  // Returns the current value of the between-tone gap in ms.
-  // This value will be the value last set via the InsertDtmf() method, or the
-  // default value of 50 ms if InsertDtmf() was never called.
-  virtual int inter_tone_gap() const = 0;
-
- protected:
-  virtual ~DtmfSenderInterface() {}
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_API_DTMFSENDERINTERFACE_H_
diff --git a/api/fakemetricsobserver.cc b/api/fakemetricsobserver.cc
deleted file mode 100644
index d804f0d..0000000
--- a/api/fakemetricsobserver.cc
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- *  Copyright 2015 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/api/fakemetricsobserver.h"
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-
-FakeMetricsObserver::FakeMetricsObserver() {
-  Reset();
-}
-
-void FakeMetricsObserver::Reset() {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  counters_.clear();
-  memset(histogram_samples_, 0, sizeof(histogram_samples_));
-}
-
-void FakeMetricsObserver::IncrementEnumCounter(
-    PeerConnectionEnumCounterType type,
-    int counter,
-    int counter_max) {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  if (counters_.size() <= static_cast<size_t>(type)) {
-    counters_.resize(type + 1);
-  }
-  auto& counters = counters_[type];
-  ++counters[counter];
-}
-
-void FakeMetricsObserver::AddHistogramSample(PeerConnectionMetricsName type,
-    int value) {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  RTC_DCHECK_EQ(histogram_samples_[type], 0);
-  histogram_samples_[type] = value;
-}
-
-int FakeMetricsObserver::GetEnumCounter(PeerConnectionEnumCounterType type,
-                                        int counter) const {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  if (counters_.size() <= static_cast<size_t>(type)) {
-    return 0;
-  }
-  const auto& it = counters_[type].find(counter);
-  if (it == counters_[type].end()) {
-    return 0;
-  }
-  return it->second;
-}
-
-int FakeMetricsObserver::GetHistogramSample(
-    PeerConnectionMetricsName type) const {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  return histogram_samples_[type];
-}
-
-}  // namespace webrtc
diff --git a/api/fakemetricsobserver.h b/api/fakemetricsobserver.h
deleted file mode 100644
index 7608012..0000000
--- a/api/fakemetricsobserver.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- *  Copyright 2015 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_API_FAKEMETRICSOBSERVER_H_
-#define WEBRTC_API_FAKEMETRICSOBSERVER_H_
-
-#include <map>
-#include <string>
-#include <vector>
-
-#include "webrtc/api/peerconnectioninterface.h"
-#include "webrtc/rtc_base/thread_checker.h"
-
-namespace webrtc {
-
-class FakeMetricsObserver : public MetricsObserverInterface {
- public:
-  FakeMetricsObserver();
-  void Reset();
-
-  void IncrementEnumCounter(PeerConnectionEnumCounterType,
-                            int counter,
-                            int counter_max) override;
-  void AddHistogramSample(PeerConnectionMetricsName type,
-                          int value) override;
-
-  // Accessors to be used by the tests.
-  int GetEnumCounter(PeerConnectionEnumCounterType type, int counter) const;
-  int GetHistogramSample(PeerConnectionMetricsName type) const;
-
- protected:
-  ~FakeMetricsObserver() {}
-
- private:
-  rtc::ThreadChecker thread_checker_;
-  // The vector contains maps for each counter type. In the map, it's a mapping
-  // from individual counter to its count, such that it's memory efficient when
-  // comes to sparse enum types, like the SSL ciphers in the IANA registry.
-  std::vector<std::map<int, int>> counters_;
-  int histogram_samples_[kPeerConnectionMetricsName_Max];
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_API_FAKEMETRICSOBSERVER_H_
diff --git a/api/jsep.h b/api/jsep.h
deleted file mode 100644
index cfb604d..0000000
--- a/api/jsep.h
+++ /dev/null
@@ -1,175 +0,0 @@
-/*
- *  Copyright 2012 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.
- */
-
-// This file contains declarations of interfaces that wrap SDP-related
-// constructs; session descriptions and ICE candidates. The inner "cricket::"
-// objects shouldn't be accessed directly; the intention is that an application
-// using the PeerConnection API only creates these objects from strings, and
-// them passes them into the PeerConnection.
-//
-// Though in the future, we're planning to provide an SDP parsing API, with a
-// structure more friendly than cricket::SessionDescription.
-
-#ifndef WEBRTC_API_JSEP_H_
-#define WEBRTC_API_JSEP_H_
-
-#include <stddef.h>
-
-#include <string>
-#include <vector>
-
-#include "webrtc/rtc_base/refcount.h"
-
-namespace cricket {
-class Candidate;
-class SessionDescription;
-}  // namespace cricket
-
-namespace webrtc {
-
-struct SdpParseError {
- public:
-  // The sdp line that causes the error.
-  std::string line;
-  // Explains the error.
-  std::string description;
-};
-
-// Class representation of an ICE candidate.
-//
-// An instance of this interface is supposed to be owned by one class at
-// a time and is therefore not expected to be thread safe.
-//
-// An instance can be created by CreateIceCandidate.
-class IceCandidateInterface {
- public:
-  virtual ~IceCandidateInterface() {}
-  // If present, this is the value of the "a=mid" attribute of the candidate's
-  // m= section in SDP, which identifies the m= section.
-  virtual std::string sdp_mid() const = 0;
-  // This indicates the index (starting at zero) of m= section this candidate
-  // is assocated with. Needed when an endpoint doesn't support MIDs.
-  virtual int sdp_mline_index() const = 0;
-  // Only for use internally.
-  virtual const cricket::Candidate& candidate() const = 0;
-  // The URL of the ICE server which this candidate was gathered from.
-  // TODO(zhihuang): Remove the default implementation once the subclasses
-  // implement this method.
-  virtual std::string server_url() const { return ""; }
-  // Creates a SDP-ized form of this candidate.
-  virtual bool ToString(std::string* out) const = 0;
-};
-
-// Creates a IceCandidateInterface based on SDP string.
-// Returns null if the sdp string can't be parsed.
-// |error| may be null.
-IceCandidateInterface* CreateIceCandidate(const std::string& sdp_mid,
-                                          int sdp_mline_index,
-                                          const std::string& sdp,
-                                          SdpParseError* error);
-
-// This class represents a collection of candidates for a specific m= section.
-// Used in SessionDescriptionInterface.
-class IceCandidateCollection {
- public:
-  virtual ~IceCandidateCollection() {}
-  virtual size_t count() const = 0;
-  // Returns true if an equivalent |candidate| exist in the collection.
-  virtual bool HasCandidate(const IceCandidateInterface* candidate) const = 0;
-  virtual const IceCandidateInterface* at(size_t index) const = 0;
-};
-
-// Class representation of an SDP session description.
-//
-// An instance of this interface is supposed to be owned by one class at a time
-// and is therefore not expected to be thread safe.
-//
-// An instance can be created by CreateSessionDescription.
-class SessionDescriptionInterface {
- public:
-  // Supported types:
-  static const char kOffer[];
-  static const char kPrAnswer[];
-  static const char kAnswer[];
-
-  virtual ~SessionDescriptionInterface() {}
-
-  // Only for use internally.
-  virtual cricket::SessionDescription* description() = 0;
-  virtual const cricket::SessionDescription* description() const = 0;
-
-  // Get the session id and session version, which are defined based on
-  // RFC 4566 for the SDP o= line.
-  virtual std::string session_id() const = 0;
-  virtual std::string session_version() const = 0;
-
-  // kOffer/kPrAnswer/kAnswer
-  virtual std::string type() const = 0;
-
-  // Adds the specified candidate to the description.
-  //
-  // Ownership is not transferred.
-  //
-  // Returns false if the session description does not have a media section
-  // that corresponds to |candidate.sdp_mid()| or
-  // |candidate.sdp_mline_index()|.
-  virtual bool AddCandidate(const IceCandidateInterface* candidate) = 0;
-
-  // Removes the candidates from the description, if found.
-  //
-  // Returns the number of candidates removed.
-  virtual size_t RemoveCandidates(
-      const std::vector<cricket::Candidate>& candidates) { return 0; }
-
-  // Returns the number of m= sections in the session description.
-  virtual size_t number_of_mediasections() const = 0;
-
-  // Returns a collection of all candidates that belong to a certain m=
-  // section.
-  virtual const IceCandidateCollection* candidates(
-      size_t mediasection_index) const = 0;
-
-  // Serializes the description to SDP.
-  virtual bool ToString(std::string* out) const = 0;
-};
-
-// Creates a SessionDescriptionInterface based on the SDP string and the type.
-// Returns null if the sdp string can't be parsed or the type is unsupported.
-// |error| may be null.
-SessionDescriptionInterface* CreateSessionDescription(const std::string& type,
-                                                      const std::string& sdp,
-                                                      SdpParseError* error);
-
-// CreateOffer and CreateAnswer callback interface.
-class CreateSessionDescriptionObserver : public rtc::RefCountInterface {
- public:
-  // This callback transfers the ownership of the |desc|.
-  // TODO(deadbeef): Make this take an std::unique_ptr<> to avoid confusion
-  // around ownership.
-  virtual void OnSuccess(SessionDescriptionInterface* desc) = 0;
-  virtual void OnFailure(const std::string& error) = 0;
-
- protected:
-  ~CreateSessionDescriptionObserver() {}
-};
-
-// SetLocalDescription and SetRemoteDescription callback interface.
-class SetSessionDescriptionObserver : public rtc::RefCountInterface {
- public:
-  virtual void OnSuccess() = 0;
-  virtual void OnFailure(const std::string& error) = 0;
-
- protected:
-  ~SetSessionDescriptionObserver() {}
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_API_JSEP_H_
diff --git a/api/jsepicecandidate.h b/api/jsepicecandidate.h
deleted file mode 100644
index 0b34991..0000000
--- a/api/jsepicecandidate.h
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- *  Copyright 2012 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.
- */
-
-// TODO(deadbeef): Move this out of api/; it's an implementation detail and
-// shouldn't be used externally.
-
-#ifndef WEBRTC_API_JSEPICECANDIDATE_H_
-#define WEBRTC_API_JSEPICECANDIDATE_H_
-
-#include <string>
-#include <utility>
-#include <vector>
-
-#include "webrtc/api/jsep.h"
-#include "webrtc/p2p/base/candidate.h"
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace webrtc {
-
-// Implementation of IceCandidateInterface.
-class JsepIceCandidate : public IceCandidateInterface {
- public:
-  JsepIceCandidate(const std::string& sdp_mid, int sdp_mline_index);
-  JsepIceCandidate(const std::string& sdp_mid, int sdp_mline_index,
-                   const cricket::Candidate& candidate);
-  ~JsepIceCandidate();
-  // |err| may be null.
-  bool Initialize(const std::string& sdp, SdpParseError* err);
-  void SetCandidate(const cricket::Candidate& candidate) {
-    candidate_ = candidate;
-  }
-
-  virtual std::string sdp_mid() const { return sdp_mid_; }
-  virtual int sdp_mline_index() const { return sdp_mline_index_; }
-  virtual const cricket::Candidate& candidate() const {
-    return candidate_;
-  }
-
-  virtual std::string server_url() const { return candidate_.url(); }
-
-  virtual bool ToString(std::string* out) const;
-
- private:
-  std::string sdp_mid_;
-  int sdp_mline_index_;
-  cricket::Candidate candidate_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(JsepIceCandidate);
-};
-
-// Implementation of IceCandidateCollection which stores JsepIceCandidates.
-class JsepCandidateCollection : public IceCandidateCollection {
- public:
-  JsepCandidateCollection() {}
-  // Move constructor is defined so that a vector of JsepCandidateCollections
-  // can be resized.
-  JsepCandidateCollection(JsepCandidateCollection&& o)
-      : candidates_(std::move(o.candidates_)) {}
-  ~JsepCandidateCollection();
-  virtual size_t count() const {
-    return candidates_.size();
-  }
-  virtual bool HasCandidate(const IceCandidateInterface* candidate) const;
-  // Adds and takes ownership of the JsepIceCandidate.
-  // TODO(deadbeef): Make this use an std::unique_ptr<>, so ownership logic is
-  // more clear.
-  virtual void add(JsepIceCandidate* candidate) {
-    candidates_.push_back(candidate);
-  }
-  virtual const IceCandidateInterface* at(size_t index) const {
-    return candidates_[index];
-  }
-  // Removes the candidate that has a matching address and protocol.
-  //
-  // Returns the number of candidates that were removed.
-  size_t remove(const cricket::Candidate& candidate);
-
- private:
-  std::vector<JsepIceCandidate*> candidates_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(JsepCandidateCollection);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_API_JSEPICECANDIDATE_H_
diff --git a/api/jsepsessiondescription.h b/api/jsepsessiondescription.h
deleted file mode 100644
index 69945b4..0000000
--- a/api/jsepsessiondescription.h
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- *  Copyright 2012 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.
- */
-
-// TODO(deadbeef): Move this out of api/; it's an implementation detail and
-// shouldn't be used externally.
-
-#ifndef WEBRTC_API_JSEPSESSIONDESCRIPTION_H_
-#define WEBRTC_API_JSEPSESSIONDESCRIPTION_H_
-
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "webrtc/api/jsep.h"
-#include "webrtc/api/jsepicecandidate.h"
-#include "webrtc/p2p/base/candidate.h"
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace cricket {
-class SessionDescription;
-}
-
-namespace webrtc {
-
-// Implementation of SessionDescriptionInterface.
-class JsepSessionDescription : public SessionDescriptionInterface {
- public:
-  explicit JsepSessionDescription(const std::string& type);
-  virtual ~JsepSessionDescription();
-
-  // Takes ownership of |description|.
-  // TODO(deadbeef): Make this use an std::unique_ptr<>, so ownership logic is
-  // more clear.
-  bool Initialize(cricket::SessionDescription* description,
-      const std::string& session_id,
-      const std::string& session_version);
-
-  virtual cricket::SessionDescription* description() {
-    return description_.get();
-  }
-  virtual const cricket::SessionDescription* description() const {
-    return description_.get();
-  }
-  virtual std::string session_id() const {
-    return session_id_;
-  }
-  virtual std::string session_version() const {
-    return session_version_;
-  }
-  virtual std::string type() const {
-    return type_;
-  }
-  // Allows changing the type. Used for testing.
-  void set_type(const std::string& type) { type_ = type; }
-  virtual bool AddCandidate(const IceCandidateInterface* candidate);
-  virtual size_t RemoveCandidates(
-      const std::vector<cricket::Candidate>& candidates);
-  virtual size_t number_of_mediasections() const;
-  virtual const IceCandidateCollection* candidates(
-      size_t mediasection_index) const;
-  virtual bool ToString(std::string* out) const;
-
-  static const int kDefaultVideoCodecId;
-  static const char kDefaultVideoCodecName[];
-
- private:
-  std::unique_ptr<cricket::SessionDescription> description_;
-  std::string session_id_;
-  std::string session_version_;
-  std::string type_;
-  std::vector<JsepCandidateCollection> candidate_collection_;
-
-  bool GetMediasectionIndex(const IceCandidateInterface* candidate,
-                            size_t* index);
-  int GetMediasectionIndex(const cricket::Candidate& candidate);
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(JsepSessionDescription);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_API_JSEPSESSIONDESCRIPTION_H_
diff --git a/api/mediaconstraintsinterface.cc b/api/mediaconstraintsinterface.cc
deleted file mode 100644
index 15deebf..0000000
--- a/api/mediaconstraintsinterface.cc
+++ /dev/null
@@ -1,275 +0,0 @@
-/*
- *  Copyright 2013 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/api/mediaconstraintsinterface.h"
-
-#include "webrtc/api/peerconnectioninterface.h"
-#include "webrtc/rtc_base/stringencode.h"
-
-namespace {
-
-// Find the highest-priority instance of the T-valued constraint named by
-// |key| and return its value as |value|. |constraints| can be null.
-// If |mandatory_constraints| is non-null, it is incremented if the key appears
-// among the mandatory constraints.
-// Returns true if the key was found and has a valid value for type T.
-// If the key appears multiple times as an optional constraint, appearances
-// after the first are ignored.
-// Note: Because this uses FindFirst, repeated optional constraints whose
-// first instance has an unrecognized value are not handled precisely in
-// accordance with the specification.
-template <typename T>
-bool FindConstraint(const webrtc::MediaConstraintsInterface* constraints,
-                    const std::string& key,
-                    T* value,
-                    size_t* mandatory_constraints) {
-  std::string string_value;
-  if (!FindConstraint(constraints, key, &string_value, mandatory_constraints)) {
-    return false;
-  }
-  return rtc::FromString(string_value, value);
-}
-
-// Specialization for std::string, since a string doesn't need conversion.
-template <>
-bool FindConstraint(const webrtc::MediaConstraintsInterface* constraints,
-                    const std::string& key,
-                    std::string* value,
-                    size_t* mandatory_constraints) {
-  if (!constraints) {
-    return false;
-  }
-  if (constraints->GetMandatory().FindFirst(key, value)) {
-    if (mandatory_constraints) {
-      ++*mandatory_constraints;
-    }
-    return true;
-  }
-  if (constraints->GetOptional().FindFirst(key, value)) {
-    return true;
-  }
-  return false;
-}
-
-// Converts a constraint (mandatory takes precedence over optional) to an
-// rtc::Optional.
-template <typename T>
-void ConstraintToOptional(const webrtc::MediaConstraintsInterface* constraints,
-                          const std::string& key,
-                          rtc::Optional<T>* value_out) {
-  T value;
-  bool present = FindConstraint<T>(constraints, key, &value, nullptr);
-  if (present) {
-    *value_out = rtc::Optional<T>(value);
-  }
-}
-}  // namespace
-
-namespace webrtc {
-
-const char MediaConstraintsInterface::kValueTrue[] = "true";
-const char MediaConstraintsInterface::kValueFalse[] = "false";
-
-// Constraints declared as static members in mediastreaminterface.h
-// Specified by draft-alvestrand-constraints-resolution-00b
-const char MediaConstraintsInterface::kMinAspectRatio[] = "minAspectRatio";
-const char MediaConstraintsInterface::kMaxAspectRatio[] = "maxAspectRatio";
-const char MediaConstraintsInterface::kMaxWidth[] = "maxWidth";
-const char MediaConstraintsInterface::kMinWidth[] = "minWidth";
-const char MediaConstraintsInterface::kMaxHeight[] = "maxHeight";
-const char MediaConstraintsInterface::kMinHeight[] = "minHeight";
-const char MediaConstraintsInterface::kMaxFrameRate[] = "maxFrameRate";
-const char MediaConstraintsInterface::kMinFrameRate[] = "minFrameRate";
-
-// Audio constraints.
-const char MediaConstraintsInterface::kEchoCancellation[] =
-    "echoCancellation";
-const char MediaConstraintsInterface::kGoogEchoCancellation[] =
-    "googEchoCancellation";
-const char MediaConstraintsInterface::kExtendedFilterEchoCancellation[] =
-    "googEchoCancellation2";
-const char MediaConstraintsInterface::kDAEchoCancellation[] =
-    "googDAEchoCancellation";
-const char MediaConstraintsInterface::kAutoGainControl[] =
-    "googAutoGainControl";
-const char MediaConstraintsInterface::kExperimentalAutoGainControl[] =
-    "googAutoGainControl2";
-const char MediaConstraintsInterface::kNoiseSuppression[] =
-    "googNoiseSuppression";
-const char MediaConstraintsInterface::kExperimentalNoiseSuppression[] =
-    "googNoiseSuppression2";
-const char MediaConstraintsInterface::kIntelligibilityEnhancer[] =
-    "intelligibilityEnhancer";
-const char MediaConstraintsInterface::kLevelControl[] = "levelControl";
-const char MediaConstraintsInterface::kLevelControlInitialPeakLevelDBFS[] =
-    "levelControlInitialPeakLevelDBFS";
-const char MediaConstraintsInterface::kHighpassFilter[] =
-    "googHighpassFilter";
-const char MediaConstraintsInterface::kTypingNoiseDetection[] =
-    "googTypingNoiseDetection";
-const char MediaConstraintsInterface::kAudioMirroring[] = "googAudioMirroring";
-const char MediaConstraintsInterface::kAudioNetworkAdaptorConfig[] =
-    "googAudioNetworkAdaptorConfig";
-
-// Google-specific constraint keys for a local video source (getUserMedia).
-const char MediaConstraintsInterface::kNoiseReduction[] = "googNoiseReduction";
-
-// Constraint keys for CreateOffer / CreateAnswer defined in W3C specification.
-const char MediaConstraintsInterface::kOfferToReceiveAudio[] =
-    "OfferToReceiveAudio";
-const char MediaConstraintsInterface::kOfferToReceiveVideo[] =
-    "OfferToReceiveVideo";
-const char MediaConstraintsInterface::kVoiceActivityDetection[] =
-    "VoiceActivityDetection";
-const char MediaConstraintsInterface::kIceRestart[] =
-    "IceRestart";
-// Google specific constraint for BUNDLE enable/disable.
-const char MediaConstraintsInterface::kUseRtpMux[] =
-    "googUseRtpMUX";
-
-// Below constraints should be used during PeerConnection construction.
-const char MediaConstraintsInterface::kEnableDtlsSrtp[] =
-    "DtlsSrtpKeyAgreement";
-const char MediaConstraintsInterface::kEnableRtpDataChannels[] =
-    "RtpDataChannels";
-// Google-specific constraint keys.
-const char MediaConstraintsInterface::kEnableDscp[] = "googDscp";
-const char MediaConstraintsInterface::kEnableIPv6[] = "googIPv6";
-const char MediaConstraintsInterface::kEnableVideoSuspendBelowMinBitrate[] =
-    "googSuspendBelowMinBitrate";
-const char MediaConstraintsInterface::kCombinedAudioVideoBwe[] =
-    "googCombinedAudioVideoBwe";
-const char MediaConstraintsInterface::kScreencastMinBitrate[] =
-    "googScreencastMinBitrate";
-// TODO(ronghuawu): Remove once cpu overuse detection is stable.
-const char MediaConstraintsInterface::kCpuOveruseDetection[] =
-    "googCpuOveruseDetection";
-const char MediaConstraintsInterface::kPayloadPadding[] = "googPayloadPadding";
-
-
-// Set |value| to the value associated with the first appearance of |key|, or
-// return false if |key| is not found.
-bool MediaConstraintsInterface::Constraints::FindFirst(
-    const std::string& key, std::string* value) const {
-  for (Constraints::const_iterator iter = begin(); iter != end(); ++iter) {
-    if (iter->key == key) {
-      *value = iter->value;
-      return true;
-    }
-  }
-  return false;
-}
-
-bool FindConstraint(const MediaConstraintsInterface* constraints,
-                    const std::string& key, bool* value,
-                    size_t* mandatory_constraints) {
-  return ::FindConstraint<bool>(constraints, key, value, mandatory_constraints);
-}
-
-bool FindConstraint(const MediaConstraintsInterface* constraints,
-                    const std::string& key,
-                    int* value,
-                    size_t* mandatory_constraints) {
-  return ::FindConstraint<int>(constraints, key, value, mandatory_constraints);
-}
-
-void CopyConstraintsIntoRtcConfiguration(
-    const MediaConstraintsInterface* constraints,
-    PeerConnectionInterface::RTCConfiguration* configuration) {
-  // Copy info from constraints into configuration, if present.
-  if (!constraints) {
-    return;
-  }
-
-  bool enable_ipv6;
-  if (FindConstraint(constraints, MediaConstraintsInterface::kEnableIPv6,
-                     &enable_ipv6, nullptr)) {
-    configuration->disable_ipv6 = !enable_ipv6;
-  }
-  FindConstraint(constraints, MediaConstraintsInterface::kEnableDscp,
-                 &configuration->media_config.enable_dscp, nullptr);
-  FindConstraint(
-      constraints, MediaConstraintsInterface::kCpuOveruseDetection,
-      &configuration->media_config.video.enable_cpu_overuse_detection, nullptr);
-  FindConstraint(constraints, MediaConstraintsInterface::kEnableRtpDataChannels,
-                 &configuration->enable_rtp_data_channel, nullptr);
-  // Find Suspend Below Min Bitrate constraint.
-  FindConstraint(constraints,
-                 MediaConstraintsInterface::kEnableVideoSuspendBelowMinBitrate,
-                 &configuration->media_config.video.suspend_below_min_bitrate,
-                 nullptr);
-  ConstraintToOptional<int>(constraints,
-                            MediaConstraintsInterface::kScreencastMinBitrate,
-                            &configuration->screencast_min_bitrate);
-  ConstraintToOptional<bool>(constraints,
-                             MediaConstraintsInterface::kCombinedAudioVideoBwe,
-                             &configuration->combined_audio_video_bwe);
-  ConstraintToOptional<bool>(constraints,
-                             MediaConstraintsInterface::kEnableDtlsSrtp,
-                             &configuration->enable_dtls_srtp);
-}
-
-void CopyConstraintsIntoAudioOptions(
-    const MediaConstraintsInterface* constraints,
-    cricket::AudioOptions* options) {
-  if (!constraints) {
-    return;
-  }
-
-  ConstraintToOptional<bool>(constraints,
-                             MediaConstraintsInterface::kGoogEchoCancellation,
-                             &options->echo_cancellation);
-  ConstraintToOptional<bool>(
-      constraints, MediaConstraintsInterface::kExtendedFilterEchoCancellation,
-      &options->extended_filter_aec);
-  ConstraintToOptional<bool>(constraints,
-                             MediaConstraintsInterface::kDAEchoCancellation,
-                             &options->delay_agnostic_aec);
-  ConstraintToOptional<bool>(constraints,
-                             MediaConstraintsInterface::kAutoGainControl,
-                             &options->auto_gain_control);
-  ConstraintToOptional<bool>(
-      constraints, MediaConstraintsInterface::kExperimentalAutoGainControl,
-      &options->experimental_agc);
-  ConstraintToOptional<bool>(constraints,
-                             MediaConstraintsInterface::kNoiseSuppression,
-                             &options->noise_suppression);
-  ConstraintToOptional<bool>(
-      constraints, MediaConstraintsInterface::kExperimentalNoiseSuppression,
-      &options->experimental_ns);
-  ConstraintToOptional<bool>(
-      constraints, MediaConstraintsInterface::kIntelligibilityEnhancer,
-      &options->intelligibility_enhancer);
-  ConstraintToOptional<bool>(constraints,
-                             MediaConstraintsInterface::kLevelControl,
-                             &options->level_control);
-  ConstraintToOptional<bool>(constraints,
-                             MediaConstraintsInterface::kHighpassFilter,
-                             &options->highpass_filter);
-  ConstraintToOptional<bool>(constraints,
-                             MediaConstraintsInterface::kTypingNoiseDetection,
-                             &options->typing_detection);
-  ConstraintToOptional<bool>(constraints,
-                             MediaConstraintsInterface::kAudioMirroring,
-                             &options->stereo_swapping);
-  ConstraintToOptional<float>(
-      constraints, MediaConstraintsInterface::kLevelControlInitialPeakLevelDBFS,
-      &options->level_control_initial_peak_level_dbfs);
-  ConstraintToOptional<std::string>(
-      constraints, MediaConstraintsInterface::kAudioNetworkAdaptorConfig,
-      &options->audio_network_adaptor_config);
-  // When |kAudioNetworkAdaptorConfig| is defined, it both means that audio
-  // network adaptor is desired, and provides the config string.
-  if (options->audio_network_adaptor_config) {
-    options->audio_network_adaptor = rtc::Optional<bool>(true);
-  }
-}
-
-}  // namespace webrtc
diff --git a/api/mediaconstraintsinterface.h b/api/mediaconstraintsinterface.h
deleted file mode 100644
index eb89b3e..0000000
--- a/api/mediaconstraintsinterface.h
+++ /dev/null
@@ -1,154 +0,0 @@
-/*
- *  Copyright 2013 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.
- */
-
-// This file contains the interface for MediaConstraints, corresponding to
-// the definition at
-// http://www.w3.org/TR/mediacapture-streams/#mediastreamconstraints and also
-// used in WebRTC: http://dev.w3.org/2011/webrtc/editor/webrtc.html#constraints.
-
-// This interface is being deprecated in Chrome, and may be removed
-// from WebRTC too.
-// https://bugs.chromium.org/p/webrtc/issues/detail?id=5617
-
-#ifndef WEBRTC_API_MEDIACONSTRAINTSINTERFACE_H_
-#define WEBRTC_API_MEDIACONSTRAINTSINTERFACE_H_
-
-#include <string>
-#include <vector>
-
-#include "webrtc/api/optional.h"
-#include "webrtc/api/peerconnectioninterface.h"
-
-namespace webrtc {
-
-// Interface used for passing arguments about media constraints
-// to the MediaStream and PeerConnection implementation.
-//
-// Constraints may be either "mandatory", which means that unless satisfied,
-// the method taking the constraints should fail, or "optional", which means
-// they may not be satisfied..
-class MediaConstraintsInterface {
- public:
-  struct Constraint {
-    Constraint() {}
-    Constraint(const std::string& key, const std::string value)
-        : key(key), value(value) {
-    }
-    std::string key;
-    std::string value;
-  };
-
-  class Constraints : public std::vector<Constraint> {
-   public:
-    bool FindFirst(const std::string& key, std::string* value) const;
-  };
-
-  virtual const Constraints& GetMandatory() const = 0;
-  virtual const Constraints& GetOptional() const = 0;
-
-  // Constraint keys used by a local video source.
-  // Specified by draft-alvestrand-constraints-resolution-00b
-  static const char kMinAspectRatio[];  // minAspectRatio
-  static const char kMaxAspectRatio[];  // maxAspectRatio
-  static const char kMaxWidth[];  // maxWidth
-  static const char kMinWidth[];  // minWidth
-  static const char kMaxHeight[];  // maxHeight
-  static const char kMinHeight[];  // minHeight
-  static const char kMaxFrameRate[];  // maxFrameRate
-  static const char kMinFrameRate[];  // minFrameRate
-
-  // Constraint keys used by a local audio source.
-  static const char kEchoCancellation[];  // echoCancellation
-
-  // These keys are google specific.
-  static const char kGoogEchoCancellation[];  // googEchoCancellation
-
-  static const char kExtendedFilterEchoCancellation[];  // googEchoCancellation2
-  static const char kDAEchoCancellation[];  // googDAEchoCancellation
-  static const char kAutoGainControl[];  // googAutoGainControl
-  static const char kExperimentalAutoGainControl[];  // googAutoGainControl2
-  static const char kNoiseSuppression[];  // googNoiseSuppression
-  static const char kExperimentalNoiseSuppression[];  // googNoiseSuppression2
-  static const char kIntelligibilityEnhancer[];  // intelligibilityEnhancer
-  static const char kLevelControl[];             // levelControl
-  static const char
-      kLevelControlInitialPeakLevelDBFS[];  // levelControlInitialPeakLevelDBFS
-  static const char kHighpassFilter[];  // googHighpassFilter
-  static const char kTypingNoiseDetection[];  // googTypingNoiseDetection
-  static const char kAudioMirroring[];  // googAudioMirroring
-  static const char
-      kAudioNetworkAdaptorConfig[];  // goodAudioNetworkAdaptorConfig
-
-  // Google-specific constraint keys for a local video source
-  static const char kNoiseReduction[];  // googNoiseReduction
-
-  // Constraint keys for CreateOffer / CreateAnswer
-  // Specified by the W3C PeerConnection spec
-  static const char kOfferToReceiveVideo[];  // OfferToReceiveVideo
-  static const char kOfferToReceiveAudio[];  // OfferToReceiveAudio
-  static const char kVoiceActivityDetection[];  // VoiceActivityDetection
-  static const char kIceRestart[];  // IceRestart
-  // These keys are google specific.
-  static const char kUseRtpMux[];  // googUseRtpMUX
-
-  // Constraints values.
-  static const char kValueTrue[];  // true
-  static const char kValueFalse[];  // false
-
-  // PeerConnection constraint keys.
-  // Temporary pseudo-constraints used to enable DTLS-SRTP
-  static const char kEnableDtlsSrtp[];  // Enable DTLS-SRTP
-  // Temporary pseudo-constraints used to enable DataChannels
-  static const char kEnableRtpDataChannels[];  // Enable RTP DataChannels
-  // Google-specific constraint keys.
-  // Temporary pseudo-constraint for enabling DSCP through JS.
-  static const char kEnableDscp[];  // googDscp
-  // Constraint to enable IPv6 through JS.
-  static const char kEnableIPv6[];  // googIPv6
-  // Temporary constraint to enable suspend below min bitrate feature.
-  static const char kEnableVideoSuspendBelowMinBitrate[];
-      // googSuspendBelowMinBitrate
-  // Constraint to enable combined audio+video bandwidth estimation.
-  static const char kCombinedAudioVideoBwe[];  // googCombinedAudioVideoBwe
-  static const char kScreencastMinBitrate[];  // googScreencastMinBitrate
-  static const char kCpuOveruseDetection[];  // googCpuOveruseDetection
-  static const char kPayloadPadding[];  // googPayloadPadding
-
-  // The prefix of internal-only constraints whose JS set values should be
-  // stripped by Chrome before passed down to Libjingle.
-  static const char kInternalConstraintPrefix[];
-
- protected:
-  // Dtor protected as objects shouldn't be deleted via this interface
-  virtual ~MediaConstraintsInterface() {}
-};
-
-bool FindConstraint(const MediaConstraintsInterface* constraints,
-                    const std::string& key, bool* value,
-                    size_t* mandatory_constraints);
-
-bool FindConstraint(const MediaConstraintsInterface* constraints,
-                    const std::string& key,
-                    int* value,
-                    size_t* mandatory_constraints);
-
-// Copy all relevant constraints into an RTCConfiguration object.
-void CopyConstraintsIntoRtcConfiguration(
-    const MediaConstraintsInterface* constraints,
-    PeerConnectionInterface::RTCConfiguration* configuration);
-
-// Copy all relevant constraints into an AudioOptions object.
-void CopyConstraintsIntoAudioOptions(
-    const MediaConstraintsInterface* constraints,
-    cricket::AudioOptions* options);
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_API_MEDIACONSTRAINTSINTERFACE_H_
diff --git a/api/mediastream.h b/api/mediastream.h
deleted file mode 100644
index e6556c5..0000000
--- a/api/mediastream.h
+++ /dev/null
@@ -1,18 +0,0 @@
-/*
- *  Copyright 2015 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_API_MEDIASTREAM_H_
-#define WEBRTC_API_MEDIASTREAM_H_
-
-// Including this file is deprecated. It is no longer part of the public API.
-// This only includes the file in its new location for backwards compatibility.
-#include "webrtc/pc/mediastream.h"
-
-#endif  // WEBRTC_API_MEDIASTREAM_H_
diff --git a/api/mediastreaminterface.cc b/api/mediastreaminterface.cc
deleted file mode 100644
index d4fe5cb..0000000
--- a/api/mediastreaminterface.cc
+++ /dev/null
@@ -1,18 +0,0 @@
-/*
- *  Copyright 2017 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/api/mediastreaminterface.h"
-
-namespace webrtc {
-
-const char MediaStreamTrackInterface::kVideoKind[] = "video";
-const char MediaStreamTrackInterface::kAudioKind[] = "audio";
-
-}  // namespace webrtc
diff --git a/api/mediastreaminterface.h b/api/mediastreaminterface.h
deleted file mode 100644
index c3966dc..0000000
--- a/api/mediastreaminterface.h
+++ /dev/null
@@ -1,324 +0,0 @@
-/*
- *  Copyright 2012 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.
- */
-
-// This file contains interfaces for MediaStream, MediaTrack and MediaSource.
-// These interfaces are used for implementing MediaStream and MediaTrack as
-// defined in http://dev.w3.org/2011/webrtc/editor/webrtc.html#stream-api. These
-// interfaces must be used only with PeerConnection. PeerConnectionManager
-// interface provides the factory methods to create MediaStream and MediaTracks.
-
-#ifndef WEBRTC_API_MEDIASTREAMINTERFACE_H_
-#define WEBRTC_API_MEDIASTREAMINTERFACE_H_
-
-#include <stddef.h>
-
-#include <string>
-#include <vector>
-
-#include "webrtc/api/optional.h"
-#include "webrtc/api/video/video_frame.h"
-// TODO(zhihuang): Remove unrelated headers once downstream applications stop
-// relying on them; they were previously transitively included by
-// mediachannel.h, which is no longer a dependency of this file.
-#include "webrtc/media/base/streamparams.h"
-#include "webrtc/media/base/videosinkinterface.h"
-#include "webrtc/media/base/videosourceinterface.h"
-#include "webrtc/rtc_base/ratetracker.h"
-#include "webrtc/rtc_base/refcount.h"
-#include "webrtc/rtc_base/scoped_ref_ptr.h"
-#include "webrtc/rtc_base/thread.h"
-#include "webrtc/rtc_base/timeutils.h"
-
-namespace webrtc {
-
-// Generic observer interface.
-class ObserverInterface {
- public:
-  virtual void OnChanged() = 0;
-
- protected:
-  virtual ~ObserverInterface() {}
-};
-
-class NotifierInterface {
- public:
-  virtual void RegisterObserver(ObserverInterface* observer) = 0;
-  virtual void UnregisterObserver(ObserverInterface* observer) = 0;
-
-  virtual ~NotifierInterface() {}
-};
-
-// Base class for sources. A MediaStreamTrack has an underlying source that
-// provides media. A source can be shared by multiple tracks.
-class MediaSourceInterface : public rtc::RefCountInterface,
-                             public NotifierInterface {
- public:
-  enum SourceState {
-    kInitializing,
-    kLive,
-    kEnded,
-    kMuted
-  };
-
-  virtual SourceState state() const = 0;
-
-  virtual bool remote() const = 0;
-
- protected:
-  virtual ~MediaSourceInterface() {}
-};
-
-// C++ version of MediaStreamTrack.
-// See: https://www.w3.org/TR/mediacapture-streams/#mediastreamtrack
-class MediaStreamTrackInterface : public rtc::RefCountInterface,
-                                  public NotifierInterface {
- public:
-  enum TrackState {
-    kLive,
-    kEnded,
-  };
-
-  static const char kAudioKind[];
-  static const char kVideoKind[];
-
-  // The kind() method must return kAudioKind only if the object is a
-  // subclass of AudioTrackInterface, and kVideoKind only if the
-  // object is a subclass of VideoTrackInterface. It is typically used
-  // to protect a static_cast<> to the corresponding subclass.
-  virtual std::string kind() const = 0;
-
-  // Track identifier.
-  virtual std::string id() const = 0;
-
-  // A disabled track will produce silence (if audio) or black frames (if
-  // video). Can be disabled and re-enabled.
-  virtual bool enabled() const = 0;
-  virtual bool set_enabled(bool enable) = 0;
-
-  // Live or ended. A track will never be live again after becoming ended.
-  virtual TrackState state() const = 0;
-
- protected:
-  virtual ~MediaStreamTrackInterface() {}
-};
-
-// VideoTrackSourceInterface is a reference counted source used for
-// VideoTracks. The same source can be used by multiple VideoTracks.
-// VideoTrackSourceInterface is designed to be invoked on the signaling thread
-// except for rtc::VideoSourceInterface<VideoFrame> methods that will be invoked
-// on the worker thread via a VideoTrack. A custom implementation of a source
-// can inherit AdaptedVideoTrackSource instead of directly implementing this
-// interface.
-class VideoTrackSourceInterface
-    : public MediaSourceInterface,
-      public rtc::VideoSourceInterface<VideoFrame> {
- public:
-  struct Stats {
-    // Original size of captured frame, before video adaptation.
-    int input_width;
-    int input_height;
-  };
-
-  // Indicates that parameters suitable for screencasts should be automatically
-  // applied to RtpSenders.
-  // TODO(perkj): Remove these once all known applications have moved to
-  // explicitly setting suitable parameters for screencasts and don't need this
-  // implicit behavior.
-  virtual bool is_screencast() const = 0;
-
-  // Indicates that the encoder should denoise video before encoding it.
-  // If it is not set, the default configuration is used which is different
-  // depending on video codec.
-  // TODO(perkj): Remove this once denoising is done by the source, and not by
-  // the encoder.
-  virtual rtc::Optional<bool> needs_denoising() const = 0;
-
-  // Returns false if no stats are available, e.g, for a remote source, or a
-  // source which has not seen its first frame yet.
-  //
-  // Implementation should avoid blocking.
-  virtual bool GetStats(Stats* stats) = 0;
-
- protected:
-  virtual ~VideoTrackSourceInterface() {}
-};
-
-// VideoTrackInterface is designed to be invoked on the signaling thread except
-// for rtc::VideoSourceInterface<VideoFrame> methods that must be invoked
-// on the worker thread.
-// PeerConnectionFactory::CreateVideoTrack can be used for creating a VideoTrack
-// that ensures thread safety and that all methods are called on the right
-// thread.
-class VideoTrackInterface
-    : public MediaStreamTrackInterface,
-      public rtc::VideoSourceInterface<VideoFrame> {
- public:
-  // Video track content hint, used to override the source is_screencast
-  // property.
-  // See https://crbug.com/653531 and https://github.com/WICG/mst-content-hint.
-  enum class ContentHint { kNone, kFluid, kDetailed };
-
-  // Register a video sink for this track. Used to connect the track to the
-  // underlying video engine.
-  void AddOrUpdateSink(rtc::VideoSinkInterface<VideoFrame>* sink,
-                       const rtc::VideoSinkWants& wants) override {}
-  void RemoveSink(rtc::VideoSinkInterface<VideoFrame>* sink) override {}
-
-  virtual VideoTrackSourceInterface* GetSource() const = 0;
-
-  virtual ContentHint content_hint() const { return ContentHint::kNone; }
-  virtual void set_content_hint(ContentHint hint) {}
-
- protected:
-  virtual ~VideoTrackInterface() {}
-};
-
-// Interface for receiving audio data from a AudioTrack.
-class AudioTrackSinkInterface {
- public:
-  virtual void OnData(const void* audio_data,
-                      int bits_per_sample,
-                      int sample_rate,
-                      size_t number_of_channels,
-                      size_t number_of_frames) = 0;
-
- protected:
-  virtual ~AudioTrackSinkInterface() {}
-};
-
-// AudioSourceInterface is a reference counted source used for AudioTracks.
-// The same source can be used by multiple AudioTracks.
-class AudioSourceInterface : public MediaSourceInterface {
- public:
-  class AudioObserver {
-   public:
-    virtual void OnSetVolume(double volume) = 0;
-
-   protected:
-    virtual ~AudioObserver() {}
-  };
-
-  // TODO(deadbeef): Makes all the interfaces pure virtual after they're
-  // implemented in chromium.
-
-  // Sets the volume of the source. |volume| is in  the range of [0, 10].
-  // TODO(tommi): This method should be on the track and ideally volume should
-  // be applied in the track in a way that does not affect clones of the track.
-  virtual void SetVolume(double volume) {}
-
-  // Registers/unregisters observers to the audio source.
-  virtual void RegisterAudioObserver(AudioObserver* observer) {}
-  virtual void UnregisterAudioObserver(AudioObserver* observer) {}
-
-  // TODO(tommi): Make pure virtual.
-  virtual void AddSink(AudioTrackSinkInterface* sink) {}
-  virtual void RemoveSink(AudioTrackSinkInterface* sink) {}
-};
-
-// Interface of the audio processor used by the audio track to collect
-// statistics.
-class AudioProcessorInterface : public rtc::RefCountInterface {
- public:
-  struct AudioProcessorStats {
-    AudioProcessorStats()
-        : typing_noise_detected(false),
-          echo_return_loss(0),
-          echo_return_loss_enhancement(0),
-          echo_delay_median_ms(0),
-          echo_delay_std_ms(0),
-          aec_quality_min(0.0),
-          residual_echo_likelihood(0.0f),
-          residual_echo_likelihood_recent_max(0.0f),
-          aec_divergent_filter_fraction(0.0) {}
-    ~AudioProcessorStats() {}
-
-    bool typing_noise_detected;
-    int echo_return_loss;
-    int echo_return_loss_enhancement;
-    int echo_delay_median_ms;
-    int echo_delay_std_ms;
-    float aec_quality_min;
-    float residual_echo_likelihood;
-    float residual_echo_likelihood_recent_max;
-    float aec_divergent_filter_fraction;
-  };
-
-  // Get audio processor statistics.
-  virtual void GetStats(AudioProcessorStats* stats) = 0;
-
- protected:
-  virtual ~AudioProcessorInterface() {}
-};
-
-class AudioTrackInterface : public MediaStreamTrackInterface {
- public:
-  // TODO(deadbeef): Figure out if the following interface should be const or
-  // not.
-  virtual AudioSourceInterface* GetSource() const =  0;
-
-  // Add/Remove a sink that will receive the audio data from the track.
-  virtual void AddSink(AudioTrackSinkInterface* sink) = 0;
-  virtual void RemoveSink(AudioTrackSinkInterface* sink) = 0;
-
-  // Get the signal level from the audio track.
-  // Return true on success, otherwise false.
-  // TODO(deadbeef): Change the interface to int GetSignalLevel() and pure
-  // virtual after it's implemented in chromium.
-  virtual bool GetSignalLevel(int* level) { return false; }
-
-  // Get the audio processor used by the audio track. Return null if the track
-  // does not have any processor.
-  // TODO(deadbeef): Make the interface pure virtual.
-  virtual rtc::scoped_refptr<AudioProcessorInterface> GetAudioProcessor() {
-    return nullptr;
-  }
-
- protected:
-  virtual ~AudioTrackInterface() {}
-};
-
-typedef std::vector<rtc::scoped_refptr<AudioTrackInterface> >
-    AudioTrackVector;
-typedef std::vector<rtc::scoped_refptr<VideoTrackInterface> >
-    VideoTrackVector;
-
-// C++ version of https://www.w3.org/TR/mediacapture-streams/#mediastream.
-//
-// A major difference is that remote audio/video tracks (received by a
-// PeerConnection/RtpReceiver) are not synchronized simply by adding them to
-// the same stream; a session description with the correct "a=msid" attributes
-// must be pushed down.
-//
-// Thus, this interface acts as simply a container for tracks.
-class MediaStreamInterface : public rtc::RefCountInterface,
-                             public NotifierInterface {
- public:
-  // TODO(steveanton): This could be renamed to id() to match the spec.
-  virtual std::string label() const = 0;
-
-  virtual AudioTrackVector GetAudioTracks() = 0;
-  virtual VideoTrackVector GetVideoTracks() = 0;
-  virtual rtc::scoped_refptr<AudioTrackInterface>
-      FindAudioTrack(const std::string& track_id) = 0;
-  virtual rtc::scoped_refptr<VideoTrackInterface>
-      FindVideoTrack(const std::string& track_id) = 0;
-
-  virtual bool AddTrack(AudioTrackInterface* track) = 0;
-  virtual bool AddTrack(VideoTrackInterface* track) = 0;
-  virtual bool RemoveTrack(AudioTrackInterface* track) = 0;
-  virtual bool RemoveTrack(VideoTrackInterface* track) = 0;
-
- protected:
-  virtual ~MediaStreamInterface() {}
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_API_MEDIASTREAMINTERFACE_H_
diff --git a/api/mediastreamproxy.h b/api/mediastreamproxy.h
deleted file mode 100644
index 15b40ed..0000000
--- a/api/mediastreamproxy.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- *  Copyright 2011 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_API_MEDIASTREAMPROXY_H_
-#define WEBRTC_API_MEDIASTREAMPROXY_H_
-
-#include <string>
-
-#include "webrtc/api/mediastreaminterface.h"
-#include "webrtc/api/proxy.h"
-
-namespace webrtc {
-
-// TODO(deadbeef): Move this to .cc file and out of api/. What threads methods
-// are called on is an implementation detail.
-BEGIN_SIGNALING_PROXY_MAP(MediaStream)
-  PROXY_SIGNALING_THREAD_DESTRUCTOR()
-  PROXY_CONSTMETHOD0(std::string, label)
-  PROXY_METHOD0(AudioTrackVector, GetAudioTracks)
-  PROXY_METHOD0(VideoTrackVector, GetVideoTracks)
-  PROXY_METHOD1(rtc::scoped_refptr<AudioTrackInterface>,
-                FindAudioTrack,
-                const std::string&)
-  PROXY_METHOD1(rtc::scoped_refptr<VideoTrackInterface>,
-                FindVideoTrack,
-                const std::string&)
-  PROXY_METHOD1(bool, AddTrack, AudioTrackInterface*)
-  PROXY_METHOD1(bool, AddTrack, VideoTrackInterface*)
-  PROXY_METHOD1(bool, RemoveTrack, AudioTrackInterface*)
-  PROXY_METHOD1(bool, RemoveTrack, VideoTrackInterface*)
-  PROXY_METHOD1(void, RegisterObserver, ObserverInterface*)
-  PROXY_METHOD1(void, UnregisterObserver, ObserverInterface*)
-END_PROXY_MAP()
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_API_MEDIASTREAMPROXY_H_
diff --git a/api/mediastreamtrack.h b/api/mediastreamtrack.h
deleted file mode 100644
index 6075abe..0000000
--- a/api/mediastreamtrack.h
+++ /dev/null
@@ -1,18 +0,0 @@
-/*
- *  Copyright 2011 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_API_MEDIASTREAMTRACK_H_
-#define WEBRTC_API_MEDIASTREAMTRACK_H_
-
-// Including this file is deprecated. It is no longer part of the public API.
-// This only includes the file in its new location for backwards compatibility.
-#include "webrtc/pc/mediastreamtrack.h"
-
-#endif  // WEBRTC_API_MEDIASTREAMTRACK_H_
diff --git a/api/mediastreamtrackproxy.h b/api/mediastreamtrackproxy.h
deleted file mode 100644
index 605f3f2..0000000
--- a/api/mediastreamtrackproxy.h
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- *  Copyright 2011 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.
- */
-
-// This file includes proxy classes for tracks. The purpose is
-// to make sure tracks are only accessed from the signaling thread.
-
-#ifndef WEBRTC_API_MEDIASTREAMTRACKPROXY_H_
-#define WEBRTC_API_MEDIASTREAMTRACKPROXY_H_
-
-#include <string>
-
-#include "webrtc/api/mediastreaminterface.h"
-#include "webrtc/api/proxy.h"
-
-namespace webrtc {
-
-// TODO(deadbeef): Move this to .cc file and out of api/. What threads methods
-// are called on is an implementation detail.
-
-BEGIN_SIGNALING_PROXY_MAP(AudioTrack)
-  PROXY_SIGNALING_THREAD_DESTRUCTOR()
-  PROXY_CONSTMETHOD0(std::string, kind)
-  PROXY_CONSTMETHOD0(std::string, id)
-  PROXY_CONSTMETHOD0(TrackState, state)
-  PROXY_CONSTMETHOD0(bool, enabled)
-  PROXY_CONSTMETHOD0(AudioSourceInterface*, GetSource)
-  PROXY_METHOD1(void, AddSink, AudioTrackSinkInterface*)
-  PROXY_METHOD1(void, RemoveSink, AudioTrackSinkInterface*)
-  PROXY_METHOD1(bool, GetSignalLevel, int*)
-  PROXY_METHOD0(rtc::scoped_refptr<AudioProcessorInterface>, GetAudioProcessor)
-  PROXY_METHOD1(bool, set_enabled, bool)
-  PROXY_METHOD1(void, RegisterObserver, ObserverInterface*)
-  PROXY_METHOD1(void, UnregisterObserver, ObserverInterface*)
-END_PROXY_MAP()
-
-BEGIN_PROXY_MAP(VideoTrack)
-  PROXY_SIGNALING_THREAD_DESTRUCTOR()
-  PROXY_CONSTMETHOD0(std::string, kind)
-  PROXY_CONSTMETHOD0(std::string, id)
-  PROXY_CONSTMETHOD0(TrackState, state)
-  PROXY_CONSTMETHOD0(bool, enabled)
-  PROXY_METHOD1(bool, set_enabled, bool)
-  PROXY_CONSTMETHOD0(ContentHint, content_hint)
-  PROXY_METHOD1(void, set_content_hint, ContentHint)
-  PROXY_WORKER_METHOD2(void,
-                       AddOrUpdateSink,
-                       rtc::VideoSinkInterface<VideoFrame>*,
-                       const rtc::VideoSinkWants&)
-  PROXY_WORKER_METHOD1(void, RemoveSink, rtc::VideoSinkInterface<VideoFrame>*)
-  PROXY_CONSTMETHOD0(VideoTrackSourceInterface*, GetSource)
-
-  PROXY_METHOD1(void, RegisterObserver, ObserverInterface*)
-  PROXY_METHOD1(void, UnregisterObserver, ObserverInterface*)
-END_PROXY_MAP()
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_API_MEDIASTREAMTRACKPROXY_H_
diff --git a/api/mediatypes.cc b/api/mediatypes.cc
deleted file mode 100644
index 108b697..0000000
--- a/api/mediatypes.cc
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- *  Copyright 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/api/mediatypes.h"
-
-#include "webrtc/api/mediastreaminterface.h"
-#include "webrtc/rtc_base/checks.h"
-
-namespace {
-static const char* kMediaTypeData = "data";
-}  // namespace
-
-namespace cricket {
-
-std::string MediaTypeToString(MediaType type) {
-  switch (type) {
-    case MEDIA_TYPE_AUDIO:
-      return webrtc::MediaStreamTrackInterface::kAudioKind;
-    case MEDIA_TYPE_VIDEO:
-      return webrtc::MediaStreamTrackInterface::kVideoKind;
-    case MEDIA_TYPE_DATA:
-      return kMediaTypeData;
-  }
-  FATAL();
-  // Not reachable; avoids compile warning.
-  return "";
-}
-
-MediaType MediaTypeFromString(const std::string& type_str) {
-  if (type_str == webrtc::MediaStreamTrackInterface::kAudioKind) {
-    return MEDIA_TYPE_AUDIO;
-  } else if (type_str == webrtc::MediaStreamTrackInterface::kVideoKind) {
-    return MEDIA_TYPE_VIDEO;
-  } else if (type_str == kMediaTypeData) {
-    return MEDIA_TYPE_DATA;
-  }
-  FATAL();
-  // Not reachable; avoids compile warning.
-  return static_cast<MediaType>(-1);
-}
-
-}  // namespace cricket
diff --git a/api/mediatypes.h b/api/mediatypes.h
deleted file mode 100644
index ec3a70a..0000000
--- a/api/mediatypes.h
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- *  Copyright 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_API_MEDIATYPES_H_
-#define WEBRTC_API_MEDIATYPES_H_
-
-#include <string>
-
-namespace cricket {
-
-enum MediaType {
-  MEDIA_TYPE_AUDIO,
-  MEDIA_TYPE_VIDEO,
-  MEDIA_TYPE_DATA
-};
-
-std::string MediaTypeToString(MediaType type);
-// Aborts on invalid string. Only expected to be used on strings that are
-// guaranteed to be valid, such as MediaStreamTrackInterface::kind().
-MediaType MediaTypeFromString(const std::string& type_str);
-
-}  // namespace cricket
-
-#endif  // WEBRTC_API_MEDIATYPES_H_
diff --git a/api/notifier.h b/api/notifier.h
deleted file mode 100644
index e142d14..0000000
--- a/api/notifier.h
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- *  Copyright 2011 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_API_NOTIFIER_H_
-#define WEBRTC_API_NOTIFIER_H_
-
-#include <list>
-
-#include "webrtc/api/mediastreaminterface.h"
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-
-// Implements a template version of a notifier.
-// TODO(deadbeef): This is an implementation detail; move out of api/.
-template <class T>
-class Notifier : public T {
- public:
-  Notifier() {
-  }
-
-  virtual void RegisterObserver(ObserverInterface* observer) {
-    RTC_DCHECK(observer != nullptr);
-    observers_.push_back(observer);
-  }
-
-  virtual void UnregisterObserver(ObserverInterface* observer) {
-    for (std::list<ObserverInterface*>::iterator it = observers_.begin();
-         it != observers_.end(); it++) {
-      if (*it == observer) {
-        observers_.erase(it);
-        break;
-      }
-    }
-  }
-
-  void FireOnChanged() {
-    // Copy the list of observers to avoid a crash if the observer object
-    // unregisters as a result of the OnChanged() call. If the same list is used
-    // UnregisterObserver will affect the list make the iterator invalid.
-    std::list<ObserverInterface*> observers = observers_;
-    for (std::list<ObserverInterface*>::iterator it = observers.begin();
-         it != observers.end(); ++it) {
-      (*it)->OnChanged();
-    }
-  }
-
- protected:
-  std::list<ObserverInterface*> observers_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_API_NOTIFIER_H_
diff --git a/api/optional.cc b/api/optional.cc
deleted file mode 100644
index ec86966..0000000
--- a/api/optional.cc
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- *  Copyright 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/api/optional.h"
-
-namespace rtc {
-namespace optional_internal {
-
-#if RTC_HAS_ASAN
-
-void* FunctionThatDoesNothingImpl(void* x) {
-  return x;
-}
-
-#endif
-
-}  // namespace optional_internal
-}  // namespace rtc
diff --git a/api/optional.h b/api/optional.h
deleted file mode 100644
index de1ec76..0000000
--- a/api/optional.h
+++ /dev/null
@@ -1,407 +0,0 @@
-/*
- *  Copyright 2015 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_API_OPTIONAL_H_
-#define WEBRTC_API_OPTIONAL_H_
-
-#include <algorithm>
-#include <memory>
-#include <utility>
-
-#ifdef UNIT_TEST
-#include <iomanip>
-#include <ostream>
-#endif  // UNIT_TEST
-
-#include "webrtc/api/array_view.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/sanitizer.h"
-
-namespace rtc {
-
-namespace optional_internal {
-
-#if RTC_HAS_ASAN
-
-// This is a non-inlined function. The optimizer can't see inside it.  It
-// prevents the compiler from generating optimized code that reads value_ even
-// if it is unset. Although safe, this causes memory sanitizers to complain.
-void* FunctionThatDoesNothingImpl(void*);
-
-template <typename T>
-inline T* FunctionThatDoesNothing(T* x) {
-  return reinterpret_cast<T*>(
-      FunctionThatDoesNothingImpl(reinterpret_cast<void*>(x)));
-}
-
-#else
-
-template <typename T>
-inline T* FunctionThatDoesNothing(T* x) {
-  return x;
-}
-
-#endif
-
-}  // namespace optional_internal
-
-// Simple std::optional-wannabe. It either contains a T or not.
-//
-// A moved-from Optional<T> may only be destroyed, and assigned to if T allows
-// being assigned to after having been moved from. Specifically, you may not
-// assume that it just doesn't contain a value anymore.
-//
-// Examples of good places to use Optional:
-//
-// - As a class or struct member, when the member doesn't always have a value:
-//     struct Prisoner {
-//       std::string name;
-//       Optional<int> cell_number;  // Empty if not currently incarcerated.
-//     };
-//
-// - As a return value for functions that may fail to return a value on all
-//   allowed inputs. For example, a function that searches an array might
-//   return an Optional<size_t> (the index where it found the element, or
-//   nothing if it didn't find it); and a function that parses numbers might
-//   return Optional<double> (the parsed number, or nothing if parsing failed).
-//
-// Examples of bad places to use Optional:
-//
-// - As a return value for functions that may fail because of disallowed
-//   inputs. For example, a string length function should not return
-//   Optional<size_t> so that it can return nothing in case the caller passed
-//   it a null pointer; the function should probably use RTC_[D]CHECK instead,
-//   and return plain size_t.
-//
-// - As a return value for functions that may fail to return a value on all
-//   allowed inputs, but need to tell the caller what went wrong. Returning
-//   Optional<double> when parsing a single number as in the example above
-//   might make sense, but any larger parse job is probably going to need to
-//   tell the caller what the problem was, not just that there was one.
-//
-// - As a non-mutable function argument. When you want to pass a value of a
-//   type T that can fail to be there, const T* is almost always both fastest
-//   and cleanest. (If you're *sure* that the the caller will always already
-//   have an Optional<T>, const Optional<T>& is slightly faster than const T*,
-//   but this is a micro-optimization. In general, stick to const T*.)
-//
-// TODO(kwiberg): Get rid of this class when the standard library has
-// std::optional (and we're allowed to use it).
-template <typename T>
-class Optional final {
- public:
-  // Construct an empty Optional.
-  Optional() : has_value_(false), empty_('\0') { PoisonValue(); }
-
-  // Construct an Optional that contains a value.
-  explicit Optional(const T& value) : has_value_(true) {
-    new (&value_) T(value);
-  }
-  explicit Optional(T&& value) : has_value_(true) {
-    new (&value_) T(std::move(value));
-  }
-
-  // Copy constructor: copies the value from m if it has one.
-  Optional(const Optional& m) : has_value_(m.has_value_) {
-    if (has_value_)
-      new (&value_) T(m.value_);
-    else
-      PoisonValue();
-  }
-
-  // Move constructor: if m has a value, moves the value from m, leaving m
-  // still in a state where it has a value, but a moved-from one (the
-  // properties of which depends on T; the only general guarantee is that we
-  // can destroy m).
-  Optional(Optional&& m) : has_value_(m.has_value_) {
-    if (has_value_)
-      new (&value_) T(std::move(m.value_));
-    else
-      PoisonValue();
-  }
-
-  ~Optional() {
-    if (has_value_)
-      value_.~T();
-    else
-      UnpoisonValue();
-  }
-
-  // Copy assignment. Uses T's copy assignment if both sides have a value, T's
-  // copy constructor if only the right-hand side has a value.
-  Optional& operator=(const Optional& m) {
-    if (m.has_value_) {
-      if (has_value_) {
-        value_ = m.value_;  // T's copy assignment.
-      } else {
-        UnpoisonValue();
-        new (&value_) T(m.value_);  // T's copy constructor.
-        has_value_ = true;
-      }
-    } else {
-      reset();
-    }
-    return *this;
-  }
-
-  // Move assignment. Uses T's move assignment if both sides have a value, T's
-  // move constructor if only the right-hand side has a value. The state of m
-  // after it's been moved from is as for the move constructor.
-  Optional& operator=(Optional&& m) {
-    if (m.has_value_) {
-      if (has_value_) {
-        value_ = std::move(m.value_);  // T's move assignment.
-      } else {
-        UnpoisonValue();
-        new (&value_) T(std::move(m.value_));  // T's move constructor.
-        has_value_ = true;
-      }
-    } else {
-      reset();
-    }
-    return *this;
-  }
-
-  // Swap the values if both m1 and m2 have values; move the value if only one
-  // of them has one.
-  friend void swap(Optional& m1, Optional& m2) {
-    if (m1.has_value_) {
-      if (m2.has_value_) {
-        // Both have values: swap.
-        using std::swap;
-        swap(m1.value_, m2.value_);
-      } else {
-        // Only m1 has a value: move it to m2.
-        m2.UnpoisonValue();
-        new (&m2.value_) T(std::move(m1.value_));
-        m1.value_.~T();  // Destroy the moved-from value.
-        m1.has_value_ = false;
-        m2.has_value_ = true;
-        m1.PoisonValue();
-      }
-    } else if (m2.has_value_) {
-      // Only m2 has a value: move it to m1.
-      m1.UnpoisonValue();
-      new (&m1.value_) T(std::move(m2.value_));
-      m2.value_.~T();  // Destroy the moved-from value.
-      m1.has_value_ = true;
-      m2.has_value_ = false;
-      m2.PoisonValue();
-    }
-  }
-
-  // Destroy any contained value. Has no effect if we have no value.
-  void reset() {
-    if (!has_value_)
-      return;
-    value_.~T();
-    has_value_ = false;
-    PoisonValue();
-  }
-
-  template <class... Args>
-  void emplace(Args&&... args) {
-    if (has_value_)
-      value_.~T();
-    else
-      UnpoisonValue();
-    new (&value_) T(std::forward<Args>(args)...);
-    has_value_ = true;
-  }
-
-  // Conversion to bool to test if we have a value.
-  explicit operator bool() const { return has_value_; }
-  bool has_value() const { return has_value_; }
-
-  // Dereferencing. Only allowed if we have a value.
-  const T* operator->() const {
-    RTC_DCHECK(has_value_);
-    return &value_;
-  }
-  T* operator->() {
-    RTC_DCHECK(has_value_);
-    return &value_;
-  }
-  const T& operator*() const {
-    RTC_DCHECK(has_value_);
-    return value_;
-  }
-  T& operator*() {
-    RTC_DCHECK(has_value_);
-    return value_;
-  }
-  const T& value() const {
-    RTC_DCHECK(has_value_);
-    return value_;
-  }
-  T& value() {
-    RTC_DCHECK(has_value_);
-    return value_;
-  }
-
-  // Dereference with a default value in case we don't have a value.
-  const T& value_or(const T& default_val) const {
-    // The no-op call prevents the compiler from generating optimized code that
-    // reads value_ even if !has_value_, but only if FunctionThatDoesNothing is
-    // not completely inlined; see its declaration.).
-    return has_value_ ? *optional_internal::FunctionThatDoesNothing(&value_)
-                      : default_val;
-  }
-
-  // Dereference and move value.
-  T MoveValue() {
-    RTC_DCHECK(has_value_);
-    return std::move(value_);
-  }
-
-  // Equality tests. Two Optionals are equal if they contain equivalent values,
-  // or if they're both empty.
-  friend bool operator==(const Optional& m1, const Optional& m2) {
-    return m1.has_value_ && m2.has_value_ ? m1.value_ == m2.value_
-                                          : m1.has_value_ == m2.has_value_;
-  }
-  friend bool operator==(const Optional& opt, const T& value) {
-    return opt.has_value_ && opt.value_ == value;
-  }
-  friend bool operator==(const T& value, const Optional& opt) {
-    return opt.has_value_ && value == opt.value_;
-  }
-
-  friend bool operator!=(const Optional& m1, const Optional& m2) {
-    return m1.has_value_ && m2.has_value_ ? m1.value_ != m2.value_
-                                          : m1.has_value_ != m2.has_value_;
-  }
-  friend bool operator!=(const Optional& opt, const T& value) {
-    return !opt.has_value_ || opt.value_ != value;
-  }
-  friend bool operator!=(const T& value, const Optional& opt) {
-    return !opt.has_value_ || value != opt.value_;
-  }
-
- private:
-  // Tell sanitizers that value_ shouldn't be touched.
-  void PoisonValue() {
-    rtc::AsanPoison(rtc::MakeArrayView(&value_, 1));
-    rtc::MsanMarkUninitialized(rtc::MakeArrayView(&value_, 1));
-  }
-
-  // Tell sanitizers that value_ is OK to touch again.
-  void UnpoisonValue() { rtc::AsanUnpoison(rtc::MakeArrayView(&value_, 1)); }
-
-  bool has_value_;  // True iff value_ contains a live value.
-  union {
-    // empty_ exists only to make it possible to initialize the union, even when
-    // it doesn't contain any data. If the union goes uninitialized, it may
-    // trigger compiler warnings.
-    char empty_;
-    // By placing value_ in a union, we get to manage its construction and
-    // destruction manually: the Optional constructors won't automatically
-    // construct it, and the Optional destructor won't automatically destroy
-    // it. Basically, this just allocates a properly sized and aligned block of
-    // memory in which we can manually put a T with placement new.
-    T value_;
-  };
-};
-
-#ifdef UNIT_TEST
-namespace optional_internal {
-
-// Checks if there's a valid PrintTo(const T&, std::ostream*) call for T.
-template <typename T>
-struct HasPrintTo {
- private:
-  struct No {};
-
-  template <typename T2>
-  static auto Test(const T2& obj)
-      -> decltype(PrintTo(obj, std::declval<std::ostream*>()));
-
-  template <typename>
-  static No Test(...);
-
- public:
-  static constexpr bool value =
-      !std::is_same<decltype(Test<T>(std::declval<const T&>())), No>::value;
-};
-
-// Checks if there's a valid operator<<(std::ostream&, const T&) call for T.
-template <typename T>
-struct HasOstreamOperator {
- private:
-  struct No {};
-
-  template <typename T2>
-  static auto Test(const T2& obj)
-      -> decltype(std::declval<std::ostream&>() << obj);
-
-  template <typename>
-  static No Test(...);
-
- public:
-  static constexpr bool value =
-      !std::is_same<decltype(Test<T>(std::declval<const T&>())), No>::value;
-};
-
-// Prefer using PrintTo to print the object.
-template <typename T>
-typename std::enable_if<HasPrintTo<T>::value, void>::type OptionalPrintToHelper(
-    const T& value,
-    std::ostream* os) {
-  PrintTo(value, os);
-}
-
-// Fall back to operator<<(std::ostream&, ...) if it exists.
-template <typename T>
-typename std::enable_if<HasOstreamOperator<T>::value && !HasPrintTo<T>::value,
-                        void>::type
-OptionalPrintToHelper(const T& value, std::ostream* os) {
-  *os << value;
-}
-
-inline void OptionalPrintObjectBytes(const unsigned char* bytes,
-                                     size_t size,
-                                     std::ostream* os) {
-  *os << "<optional with " << size << "-byte object [";
-  for (size_t i = 0; i != size; ++i) {
-    *os << (i == 0 ? "" : ((i & 1) ? "-" : " "));
-    *os << std::hex << std::setw(2) << std::setfill('0')
-        << static_cast<int>(bytes[i]);
-  }
-  *os << "]>";
-}
-
-// As a final back-up, just print the contents of the objcets byte-wise.
-template <typename T>
-typename std::enable_if<!HasOstreamOperator<T>::value && !HasPrintTo<T>::value,
-                        void>::type
-OptionalPrintToHelper(const T& value, std::ostream* os) {
-  OptionalPrintObjectBytes(reinterpret_cast<const unsigned char*>(&value),
-                           sizeof(value), os);
-}
-
-}  // namespace optional_internal
-
-// PrintTo is used by gtest to print out the results of tests. We want to ensure
-// the object contained in an Optional can be printed out if it's set, while
-// avoiding touching the object's storage if it is undefined.
-template <typename T>
-void PrintTo(const rtc::Optional<T>& opt, std::ostream* os) {
-  if (opt) {
-    optional_internal::OptionalPrintToHelper(*opt, os);
-  } else {
-    *os << "<empty optional>";
-  }
-}
-
-#endif  // UNIT_TEST
-
-}  // namespace rtc
-
-#endif  // WEBRTC_API_OPTIONAL_H_
diff --git a/api/optional_unittest.cc b/api/optional_unittest.cc
deleted file mode 100644
index f8f9cf3..0000000
--- a/api/optional_unittest.cc
+++ /dev/null
@@ -1,829 +0,0 @@
-/*
- *  Copyright 2015 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 <memory>
-#include <sstream>
-#include <string>
-#include <utility>
-#include <vector>
-
-#include "webrtc/api/optional.h"
-#include "webrtc/rtc_base/gunit.h"
-
-namespace rtc {
-
-namespace {
-
-struct MyUnprintableType {
-  int value;
-};
-
-struct MyPrintableType {
-  int value;
-};
-
-struct MyOstreamPrintableType {
-  int value;
-};
-
-void PrintTo(const MyPrintableType& mpt, std::ostream* os) {
-  *os << "The value is " << mpt.value;
-}
-
-std::ostream& operator<<(std::ostream& os, const MyPrintableType& mpt) {
-  os << mpt.value;
-  return os;
-}
-
-std::ostream& operator<<(std::ostream& os, const MyOstreamPrintableType& mpt) {
-  os << mpt.value;
-  return os;
-}
-
-// Class whose instances logs various method calls (constructor, destructor,
-// etc.). Each instance has a unique ID (a simple global sequence number) and
-// an origin ID. When a copy is made, the new object gets a fresh ID but copies
-// the origin ID from the original. When a new Logger is created from scratch,
-// it gets a fresh ID, and the origin ID is the same as the ID (default
-// constructor) or given as an argument (explicit constructor).
-class Logger {
- public:
-  Logger() : id_(g_next_id++), origin_(id_) { Log("default constructor"); }
-  explicit Logger(int origin) : id_(g_next_id++), origin_(origin) {
-    Log("explicit constructor");
-  }
-  Logger(int origin, const Logger& pass_by_ref, Logger pass_by_value)
-      : id_(g_next_id++), origin_(origin) {
-    Log("multi parameter constructor");
-  }
-  Logger(const Logger& other) : id_(g_next_id++), origin_(other.origin_) {
-    LogFrom("copy constructor", other);
-  }
-  Logger(Logger&& other) : id_(g_next_id++), origin_(other.origin_) {
-    LogFrom("move constructor", other);
-  }
-  ~Logger() { Log("destructor"); }
-  Logger& operator=(const Logger& other) {
-    origin_ = other.origin_;
-    LogFrom("operator= copy", other);
-    return *this;
-  }
-  Logger& operator=(Logger&& other) {
-    origin_ = other.origin_;
-    LogFrom("operator= move", other);
-    return *this;
-  }
-  friend void swap(Logger& a, Logger& b) {
-    using std::swap;
-    swap(a.origin_, b.origin_);
-    Log2("swap", a, b);
-  }
-  friend bool operator==(const Logger& a, const Logger& b) {
-    Log2("operator==", a, b);
-    return a.origin_ == b.origin_;
-  }
-  friend bool operator!=(const Logger& a, const Logger& b) {
-    Log2("operator!=", a, b);
-    return a.origin_ != b.origin_;
-  }
-  void Foo() { Log("Foo()"); }
-  void Foo() const { Log("Foo() const"); }
-  static std::unique_ptr<std::vector<std::string>> Setup() {
-    std::unique_ptr<std::vector<std::string>> s(new std::vector<std::string>);
-    g_log = s.get();
-    g_next_id = 0;
-    return s;
-  }
-
- private:
-  int id_;
-  int origin_;
-  static std::vector<std::string>* g_log;
-  static int g_next_id;
-  void Log(const char* msg) const {
-    std::ostringstream oss;
-    oss << id_ << ':' << origin_ << ". " << msg;
-    g_log->push_back(oss.str());
-  }
-  void LogFrom(const char* msg, const Logger& other) const {
-    std::ostringstream oss;
-    oss << id_ << ':' << origin_ << ". " << msg << " (from " << other.id_ << ':'
-        << other.origin_ << ")";
-    g_log->push_back(oss.str());
-  }
-  static void Log2(const char* msg, const Logger& a, const Logger& b) {
-    std::ostringstream oss;
-    oss << msg << ' ' << a.id_ << ':' << a.origin_ << ", " << b.id_ << ':'
-        << b.origin_;
-    g_log->push_back(oss.str());
-  }
-};
-
-std::vector<std::string>* Logger::g_log = nullptr;
-int Logger::g_next_id = 0;
-
-// Append all the other args to the vector pointed to by the first arg.
-template <typename T>
-void VectorAppend(std::vector<T>* v) {}
-template <typename T, typename... Ts>
-void VectorAppend(std::vector<T>* v, const T& e, Ts... es) {
-  v->push_back(e);
-  VectorAppend(v, es...);
-}
-
-// Create a vector of strings. Because we're not allowed to use
-// std::initializer_list.
-template <typename... Ts>
-std::vector<std::string> V(Ts... es) {
-  std::vector<std::string> strings;
-  VectorAppend(&strings, static_cast<std::string>(es)...);
-  return strings;
-}
-
-}  // namespace
-
-TEST(OptionalTest, TestConstructDefault) {
-  auto log = Logger::Setup();
-  {
-    Optional<Logger> x;
-    EXPECT_FALSE(x);
-    EXPECT_FALSE(x.has_value());
-  }
-  EXPECT_EQ(V(), *log);
-}
-
-TEST(OptionalTest, TestConstructCopyEmpty) {
-  auto log = Logger::Setup();
-  {
-    Optional<Logger> x;
-    EXPECT_FALSE(x);
-    EXPECT_FALSE(x.has_value());
-    auto y = x;
-    EXPECT_FALSE(y);
-    EXPECT_FALSE(y.has_value());
-  }
-  EXPECT_EQ(V(), *log);
-}
-
-TEST(OptionalTest, TestConstructCopyFull) {
-  auto log = Logger::Setup();
-  {
-    Logger a;
-    Optional<Logger> x(a);
-    EXPECT_TRUE(x);
-    EXPECT_TRUE(x.has_value());
-    log->push_back("---");
-    auto y = x;
-    EXPECT_TRUE(y);
-    EXPECT_TRUE(y.has_value());
-    log->push_back("---");
-  }
-  EXPECT_EQ(V("0:0. default constructor", "1:0. copy constructor (from 0:0)",
-              "---", "2:0. copy constructor (from 1:0)", "---",
-              "2:0. destructor", "1:0. destructor", "0:0. destructor"),
-            *log);
-}
-
-TEST(OptionalTest, TestConstructMoveEmpty) {
-  auto log = Logger::Setup();
-  {
-    Optional<Logger> x;
-    EXPECT_FALSE(x);
-    EXPECT_FALSE(x.has_value());
-    auto y = std::move(x);
-    EXPECT_FALSE(y);
-    EXPECT_FALSE(y.has_value());
-  }
-  EXPECT_EQ(V(), *log);
-}
-
-TEST(OptionalTest, TestConstructMoveFull) {
-  auto log = Logger::Setup();
-  {
-    Optional<Logger> x(Logger(17));
-    EXPECT_TRUE(x);
-    EXPECT_TRUE(x.has_value());
-    log->push_back("---");
-    auto y = std::move(x);
-    EXPECT_TRUE(x);
-    EXPECT_TRUE(x.has_value());
-    EXPECT_TRUE(y);
-    EXPECT_TRUE(y.has_value());
-    log->push_back("---");
-  }
-  EXPECT_EQ(
-      V("0:17. explicit constructor", "1:17. move constructor (from 0:17)",
-        "0:17. destructor", "---", "2:17. move constructor (from 1:17)", "---",
-        "2:17. destructor", "1:17. destructor"),
-      *log);
-}
-
-TEST(OptionalTest, TestCopyAssignToEmptyFromEmpty) {
-  auto log = Logger::Setup();
-  {
-    Optional<Logger> x, y;
-    x = y;
-  }
-  EXPECT_EQ(V(), *log);
-}
-
-TEST(OptionalTest, TestCopyAssignToFullFromEmpty) {
-  auto log = Logger::Setup();
-  {
-    Optional<Logger> x(Logger(17));
-    Optional<Logger> y;
-    log->push_back("---");
-    x = y;
-    log->push_back("---");
-  }
-  EXPECT_EQ(
-      V("0:17. explicit constructor", "1:17. move constructor (from 0:17)",
-        "0:17. destructor", "---", "1:17. destructor", "---"),
-      *log);
-}
-
-TEST(OptionalTest, TestCopyAssignToEmptyFromFull) {
-  auto log = Logger::Setup();
-  {
-    Optional<Logger> x;
-    Optional<Logger> y(Logger(17));
-    log->push_back("---");
-    x = y;
-    log->push_back("---");
-  }
-  EXPECT_EQ(
-      V("0:17. explicit constructor", "1:17. move constructor (from 0:17)",
-        "0:17. destructor", "---", "2:17. copy constructor (from 1:17)", "---",
-        "1:17. destructor", "2:17. destructor"),
-      *log);
-}
-
-TEST(OptionalTest, TestCopyAssignToFullFromFull) {
-  auto log = Logger::Setup();
-  {
-    Optional<Logger> x(Logger(17));
-    Optional<Logger> y(Logger(42));
-    log->push_back("---");
-    x = y;
-    log->push_back("---");
-  }
-  EXPECT_EQ(
-      V("0:17. explicit constructor", "1:17. move constructor (from 0:17)",
-        "0:17. destructor", "2:42. explicit constructor",
-        "3:42. move constructor (from 2:42)", "2:42. destructor", "---",
-        "1:42. operator= copy (from 3:42)", "---", "3:42. destructor",
-        "1:42. destructor"),
-      *log);
-}
-
-TEST(OptionalTest, TestCopyAssignToEmptyFromT) {
-  auto log = Logger::Setup();
-  {
-    Optional<Logger> x;
-    Logger y(17);
-    log->push_back("---");
-    x = Optional<Logger>(y);
-    log->push_back("---");
-  }
-  EXPECT_EQ(V("0:17. explicit constructor", "---",
-              "1:17. copy constructor (from 0:17)",
-              "2:17. move constructor (from 1:17)", "1:17. destructor", "---",
-              "0:17. destructor", "2:17. destructor"),
-            *log);
-}
-
-TEST(OptionalTest, TestCopyAssignToFullFromT) {
-  auto log = Logger::Setup();
-  {
-    Optional<Logger> x(Logger(17));
-    Logger y(42);
-    log->push_back("---");
-    x = Optional<Logger>(y);
-    log->push_back("---");
-  }
-  EXPECT_EQ(
-      V("0:17. explicit constructor", "1:17. move constructor (from 0:17)",
-        "0:17. destructor", "2:42. explicit constructor", "---",
-        "3:42. copy constructor (from 2:42)",
-        "1:42. operator= move (from 3:42)", "3:42. destructor", "---",
-        "2:42. destructor", "1:42. destructor"),
-      *log);
-}
-
-TEST(OptionalTest, TestMoveAssignToEmptyFromEmpty) {
-  auto log = Logger::Setup();
-  {
-    Optional<Logger> x, y;
-    x = std::move(y);
-  }
-  EXPECT_EQ(V(), *log);
-}
-
-TEST(OptionalTest, TestMoveAssignToFullFromEmpty) {
-  auto log = Logger::Setup();
-  {
-    Optional<Logger> x(Logger(17));
-    Optional<Logger> y;
-    log->push_back("---");
-    x = std::move(y);
-    log->push_back("---");
-  }
-  EXPECT_EQ(
-      V("0:17. explicit constructor", "1:17. move constructor (from 0:17)",
-        "0:17. destructor", "---", "1:17. destructor", "---"),
-      *log);
-}
-
-TEST(OptionalTest, TestMoveAssignToEmptyFromFull) {
-  auto log = Logger::Setup();
-  {
-    Optional<Logger> x;
-    Optional<Logger> y(Logger(17));
-    log->push_back("---");
-    x = std::move(y);
-    log->push_back("---");
-  }
-  EXPECT_EQ(
-      V("0:17. explicit constructor", "1:17. move constructor (from 0:17)",
-        "0:17. destructor", "---", "2:17. move constructor (from 1:17)", "---",
-        "1:17. destructor", "2:17. destructor"),
-      *log);
-}
-
-TEST(OptionalTest, TestMoveAssignToFullFromFull) {
-  auto log = Logger::Setup();
-  {
-    Optional<Logger> x(Logger(17));
-    Optional<Logger> y(Logger(42));
-    log->push_back("---");
-    x = std::move(y);
-    log->push_back("---");
-  }
-  EXPECT_EQ(
-      V("0:17. explicit constructor", "1:17. move constructor (from 0:17)",
-        "0:17. destructor", "2:42. explicit constructor",
-        "3:42. move constructor (from 2:42)", "2:42. destructor", "---",
-        "1:42. operator= move (from 3:42)", "---", "3:42. destructor",
-        "1:42. destructor"),
-      *log);
-}
-
-TEST(OptionalTest, TestMoveAssignToEmptyFromT) {
-  auto log = Logger::Setup();
-  {
-    Optional<Logger> x;
-    Logger y(17);
-    log->push_back("---");
-    x = Optional<Logger>(std::move(y));
-    log->push_back("---");
-  }
-  EXPECT_EQ(V("0:17. explicit constructor", "---",
-              "1:17. move constructor (from 0:17)",
-              "2:17. move constructor (from 1:17)", "1:17. destructor", "---",
-              "0:17. destructor", "2:17. destructor"),
-            *log);
-}
-
-TEST(OptionalTest, TestMoveAssignToFullFromT) {
-  auto log = Logger::Setup();
-  {
-    Optional<Logger> x(Logger(17));
-    Logger y(42);
-    log->push_back("---");
-    x = Optional<Logger>(std::move(y));
-    log->push_back("---");
-  }
-  EXPECT_EQ(
-      V("0:17. explicit constructor", "1:17. move constructor (from 0:17)",
-        "0:17. destructor", "2:42. explicit constructor", "---",
-        "3:42. move constructor (from 2:42)",
-        "1:42. operator= move (from 3:42)", "3:42. destructor", "---",
-        "2:42. destructor", "1:42. destructor"),
-      *log);
-}
-
-TEST(OptionalTest, TestResetEmpty) {
-  auto log = Logger::Setup();
-  {
-    Optional<Logger> x;
-    x.reset();
-  }
-  EXPECT_EQ(V(), *log);
-}
-
-TEST(OptionalTest, TestResetFull) {
-  auto log = Logger::Setup();
-  {
-    Optional<Logger> x(Logger(17));
-    log->push_back("---");
-    x.reset();
-    log->push_back("---");
-  }
-  EXPECT_EQ(
-      V("0:17. explicit constructor", "1:17. move constructor (from 0:17)",
-        "0:17. destructor", "---", "1:17. destructor", "---"),
-      *log);
-}
-
-TEST(OptionalTest, TestEmplaceEmptyWithExplicit) {
-  auto log = Logger::Setup();
-  {
-    Optional<Logger> x;
-    log->push_back("---");
-    x.emplace(42);
-    log->push_back("---");
-  }
-  // clang-format off
-  EXPECT_EQ(V("---",
-              "0:42. explicit constructor",
-              "---",
-              "0:42. destructor"),
-            *log);
-  // clang-format on
-}
-
-TEST(OptionalTest, TestEmplaceEmptyWithMultipleParameters) {
-  auto log = Logger::Setup();
-  {
-    Optional<Logger> x;
-    Logger ref(21);
-    Logger value(35);
-    log->push_back("---");
-    x.emplace(42, ref, std::move(value));
-    log->push_back("---");
-  }
-  // clang-format off
-  EXPECT_EQ(V("0:21. explicit constructor",
-              "1:35. explicit constructor",
-              "---",
-              "2:35. move constructor (from 1:35)",
-              "3:42. multi parameter constructor",
-              "2:35. destructor",
-              "---",
-              "1:35. destructor",
-              "0:21. destructor",
-              "3:42. destructor"),
-            *log);
-  // clang-format on
-}
-
-TEST(OptionalTest, TestEmplaceEmptyWithCopy) {
-  auto log = Logger::Setup();
-  {
-    Optional<Logger> x;
-    Logger y(42);
-    log->push_back("---");
-    x.emplace(y);
-    log->push_back("---");
-  }
-  // clang-format off
-  EXPECT_EQ(V("0:42. explicit constructor",
-              "---",
-              "1:42. copy constructor (from 0:42)",
-              "---",
-              "0:42. destructor",
-              "1:42. destructor"),
-            *log);
-  // clang-format on
-}
-
-TEST(OptionalTest, TestEmplaceEmptyWithMove) {
-  auto log = Logger::Setup();
-  {
-    Optional<Logger> x;
-    Logger y(42);
-    log->push_back("---");
-    x.emplace(std::move(y));
-    log->push_back("---");
-  }
-  // clang-format off
-  EXPECT_EQ(V("0:42. explicit constructor",
-              "---",
-              "1:42. move constructor (from 0:42)",
-              "---",
-              "0:42. destructor",
-              "1:42. destructor"),
-            *log);
-  // clang-format on
-}
-
-TEST(OptionalTest, TestEmplaceFullWithExplicit) {
-  auto log = Logger::Setup();
-  {
-    Optional<Logger> x(Logger(17));
-    log->push_back("---");
-    x.emplace(42);
-    log->push_back("---");
-  }
-  // clang-format off
-  EXPECT_EQ(
-      V("0:17. explicit constructor",
-        "1:17. move constructor (from 0:17)",
-        "0:17. destructor",
-        "---",
-        "1:17. destructor",
-        "2:42. explicit constructor",
-        "---",
-        "2:42. destructor"),
-      *log);
-  // clang-format on
-}
-
-TEST(OptionalTest, TestEmplaceFullWithMultipleParameters) {
-  auto log = Logger::Setup();
-  {
-    Optional<Logger> x(Logger(17));
-    Logger ref(21);
-    Logger value(35);
-    log->push_back("---");
-    x.emplace(42, ref, std::move(value));
-    log->push_back("---");
-  }
-  // clang-format off
-  EXPECT_EQ(V("0:17. explicit constructor",
-              "1:17. move constructor (from 0:17)",
-              "0:17. destructor",
-              "2:21. explicit constructor",
-              "3:35. explicit constructor",
-              "---",
-              "1:17. destructor",
-              "4:35. move constructor (from 3:35)",
-              "5:42. multi parameter constructor",
-              "4:35. destructor",
-              "---",
-              "3:35. destructor",
-              "2:21. destructor",
-              "5:42. destructor"),
-            *log);
-  // clang-format on
-}
-
-TEST(OptionalTest, TestEmplaceFullWithCopy) {
-  auto log = Logger::Setup();
-  {
-    Optional<Logger> x(Logger(17));
-    Logger y(42);
-    log->push_back("---");
-    x.emplace(y);
-    log->push_back("---");
-  }
-  // clang-format off
-  EXPECT_EQ(V("0:17. explicit constructor",
-              "1:17. move constructor (from 0:17)",
-              "0:17. destructor",
-              "2:42. explicit constructor",
-              "---",
-              "1:17. destructor",
-              "3:42. copy constructor (from 2:42)",
-              "---",
-              "2:42. destructor",
-              "3:42. destructor"),
-           *log);
-  // clang-format on
-}
-
-TEST(OptionalTest, TestEmplaceFullWithMove) {
-  auto log = Logger::Setup();
-  {
-    Optional<Logger> x(Logger(17));
-    Logger y(42);
-    log->push_back("---");
-    x.emplace(std::move(y));
-    log->push_back("---");
-  }
-  // clang-format off
-  EXPECT_EQ(V("0:17. explicit constructor",
-              "1:17. move constructor (from 0:17)",
-              "0:17. destructor",
-              "2:42. explicit constructor",
-              "---",
-              "1:17. destructor",
-              "3:42. move constructor (from 2:42)",
-              "---",
-              "2:42. destructor",
-              "3:42. destructor"),
-            *log);
-  // clang-format on
-}
-
-TEST(OptionalTest, TestDereference) {
-  auto log = Logger::Setup();
-  {
-    Optional<Logger> x(Logger(42));
-    const auto& y = x;
-    log->push_back("---");
-    x->Foo();
-    y->Foo();
-    std::move(x)->Foo();
-    std::move(y)->Foo();
-    log->push_back("---");
-    (*x).Foo();
-    (*y).Foo();
-    (*std::move(x)).Foo();
-    (*std::move(y)).Foo();
-    log->push_back("---");
-    x.value().Foo();
-    y.value().Foo();
-    std::move(x).value().Foo();
-    std::move(y).value().Foo();
-    log->push_back("---");
-  }
-  // clang-format off
-  EXPECT_EQ(V("0:42. explicit constructor",
-              "1:42. move constructor (from 0:42)",
-              "0:42. destructor",
-              "---",
-              "1:42. Foo()",
-              "1:42. Foo() const",
-              "1:42. Foo()",
-              "1:42. Foo() const",
-              "---",
-              "1:42. Foo()",
-              "1:42. Foo() const",
-              "1:42. Foo()",
-              "1:42. Foo() const",
-              "---",
-              "1:42. Foo()",
-              "1:42. Foo() const",
-              "1:42. Foo()",
-              "1:42. Foo() const",
-              "---",
-              "1:42. destructor"),
-            *log);
-  // clang-format on
-}
-
-TEST(OptionalTest, TestDereferenceWithDefault) {
-  auto log = Logger::Setup();
-  {
-    const Logger a(17), b(42);
-    Optional<Logger> x(a);
-    Optional<Logger> y;
-    log->push_back("-1-");
-    EXPECT_EQ(a, x.value_or(Logger(42)));
-    log->push_back("-2-");
-    EXPECT_EQ(b, y.value_or(Logger(42)));
-    log->push_back("-3-");
-    EXPECT_EQ(a, Optional<Logger>(Logger(17)).value_or(b));
-    log->push_back("-4-");
-    EXPECT_EQ(b, Optional<Logger>().value_or(b));
-    log->push_back("-5-");
-  }
-  EXPECT_EQ(
-      V("0:17. explicit constructor", "1:42. explicit constructor",
-        "2:17. copy constructor (from 0:17)", "-1-",
-        "3:42. explicit constructor", "operator== 0:17, 2:17",
-        "3:42. destructor", "-2-", "4:42. explicit constructor",
-        "operator== 1:42, 4:42", "4:42. destructor", "-3-",
-        "5:17. explicit constructor", "6:17. move constructor (from 5:17)",
-        "operator== 0:17, 6:17", "6:17. destructor", "5:17. destructor", "-4-",
-        "operator== 1:42, 1:42", "-5-", "2:17. destructor", "1:42. destructor",
-        "0:17. destructor"),
-      *log);
-}
-
-TEST(OptionalTest, TestEquality) {
-  auto log = Logger::Setup();
-  {
-    Logger a(17), b(42);
-    Optional<Logger> ma1(a), ma2(a), mb(b), me1, me2;
-    log->push_back("---");
-    EXPECT_EQ(ma1, ma1);
-    EXPECT_EQ(ma1, ma2);
-    EXPECT_NE(ma1, mb);
-    EXPECT_NE(ma1, me1);
-    EXPECT_EQ(me1, me1);
-    EXPECT_EQ(me1, me2);
-    log->push_back("---");
-  }
-  EXPECT_EQ(
-      V("0:17. explicit constructor", "1:42. explicit constructor",
-        "2:17. copy constructor (from 0:17)",
-        "3:17. copy constructor (from 0:17)",
-        "4:42. copy constructor (from 1:42)", "---", "operator== 2:17, 2:17",
-        "operator== 2:17, 3:17", "operator!= 2:17, 4:42", "---",
-        "4:42. destructor", "3:17. destructor", "2:17. destructor",
-        "1:42. destructor", "0:17. destructor"),
-      *log);
-}
-
-TEST(OptionalTest, TestEqualityWithObject) {
-  auto log = Logger::Setup();
-  {
-    Logger a(17), b(42);
-    Optional<Logger> ma(a), me;
-    // Using operator== and operator!= explicetly instead of EXPECT_EQ/EXPECT_NE
-    // macros because those operators are under test.
-    log->push_back("---");
-
-    EXPECT_TRUE(ma == a);
-    EXPECT_TRUE(a == ma);
-    EXPECT_FALSE(ma == b);
-    EXPECT_FALSE(b == ma);
-    EXPECT_FALSE(me == a);
-    EXPECT_FALSE(a == me);
-
-    EXPECT_FALSE(ma != a);
-    EXPECT_FALSE(a != ma);
-    EXPECT_TRUE(ma != b);
-    EXPECT_TRUE(b != ma);
-    EXPECT_TRUE(me != a);
-    EXPECT_TRUE(a != me);
-
-    log->push_back("---");
-  }
-  // clang-format off
-  EXPECT_EQ(V("0:17. explicit constructor",
-              "1:42. explicit constructor",
-              "2:17. copy constructor (from 0:17)",
-              "---",
-              "operator== 2:17, 0:17",
-              "operator== 0:17, 2:17",
-              "operator== 2:17, 1:42",
-              "operator== 1:42, 2:17",
-              // No operator should be called when comparing to empty.
-              "operator!= 2:17, 0:17",
-              "operator!= 0:17, 2:17",
-              "operator!= 2:17, 1:42",
-              "operator!= 1:42, 2:17",
-              // No operator should be called when comparing to empty.
-              "---",
-              "2:17. destructor",
-              "1:42. destructor",
-              "0:17. destructor"),
-            *log);
-  // clang-format on
-}
-
-TEST(OptionalTest, TestSwap) {
-  auto log = Logger::Setup();
-  {
-    Logger a(17), b(42);
-    Optional<Logger> x1(a), x2(b), y1(a), y2, z1, z2;
-    log->push_back("---");
-    swap(x1, x2);  // Swap full <-> full.
-    swap(y1, y2);  // Swap full <-> empty.
-    swap(z1, z2);  // Swap empty <-> empty.
-    log->push_back("---");
-  }
-  EXPECT_EQ(V("0:17. explicit constructor", "1:42. explicit constructor",
-              "2:17. copy constructor (from 0:17)",
-              "3:42. copy constructor (from 1:42)",
-              "4:17. copy constructor (from 0:17)", "---", "swap 2:42, 3:17",
-              "5:17. move constructor (from 4:17)", "4:17. destructor", "---",
-              "5:17. destructor", "3:17. destructor", "2:42. destructor",
-              "1:42. destructor", "0:17. destructor"),
-            *log);
-}
-
-TEST(OptionalTest, TestMoveValue) {
-  auto log = Logger::Setup();
-  {
-    Optional<Logger> x(Logger(42));
-    log->push_back("---");
-    Logger moved = x.MoveValue();
-    log->push_back("---");
-  }
-  EXPECT_EQ(
-      V("0:42. explicit constructor", "1:42. move constructor (from 0:42)",
-        "0:42. destructor", "---", "2:42. move constructor (from 1:42)", "---",
-        "2:42. destructor", "1:42. destructor"),
-      *log);
-}
-
-TEST(OptionalTest, TestPrintTo) {
-  constexpr char kEmptyOptionalMessage[] = "<empty optional>";
-  const Optional<MyUnprintableType> empty_unprintable;
-  const Optional<MyPrintableType> empty_printable;
-  const Optional<MyOstreamPrintableType> empty_ostream_printable;
-  EXPECT_EQ(kEmptyOptionalMessage, ::testing::PrintToString(empty_unprintable));
-  EXPECT_EQ(kEmptyOptionalMessage, ::testing::PrintToString(empty_printable));
-  EXPECT_EQ(kEmptyOptionalMessage,
-            ::testing::PrintToString(empty_ostream_printable));
-  EXPECT_NE("1", ::testing::PrintToString(Optional<MyUnprintableType>({1})));
-  EXPECT_NE("1", ::testing::PrintToString(Optional<MyPrintableType>({1})));
-  EXPECT_EQ("The value is 1",
-            ::testing::PrintToString(Optional<MyPrintableType>({1})));
-  EXPECT_EQ("1",
-            ::testing::PrintToString(Optional<MyOstreamPrintableType>({1})));
-}
-
-void UnusedFunctionWorkaround() {
-  // These are here to ensure we don't get warnings about ostream and PrintTo
-  // for MyPrintableType never getting called.
-  const MyPrintableType dont_warn{17};
-  const MyOstreamPrintableType dont_warn2{18};
-  std::stringstream sstr;
-  sstr << dont_warn;
-  PrintTo(dont_warn, &sstr);
-  sstr << dont_warn2;
-}
-
-}  // namespace rtc
diff --git a/api/ortc/mediadescription.cc b/api/ortc/mediadescription.cc
deleted file mode 100644
index 9fca55c..0000000
--- a/api/ortc/mediadescription.cc
+++ /dev/null
@@ -1,13 +0,0 @@
-/*
- *  Copyright 2017 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/api/ortc/mediadescription.h"
-
-namespace webrtc {}
diff --git a/api/ortc/mediadescription.h b/api/ortc/mediadescription.h
deleted file mode 100644
index d638dfc..0000000
--- a/api/ortc/mediadescription.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- *  Copyright 2017 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_API_ORTC_MEDIADESCRIPTION_H_
-#define WEBRTC_API_ORTC_MEDIADESCRIPTION_H_
-
-#include <string>
-#include <utility>
-#include <vector>
-
-#include "webrtc/api/optional.h"
-#include "webrtc/media/base/cryptoparams.h"
-
-namespace webrtc {
-
-// A structured representation of a media description within an SDP session
-// description.
-class MediaDescription {
- public:
-  explicit MediaDescription(std::string mid) : mid_(std::move(mid)) {}
-
-  ~MediaDescription() {}
-
-  // The mid(media stream identification) is used for identifying media streams
-  // within a session description.
-  // https://tools.ietf.org/html/rfc5888#section-6
-  rtc::Optional<std::string> mid() const { return mid_; }
-  void set_mid(std::string mid) { mid_.emplace(std::move(mid)); }
-
-  // Security keys and parameters for this media stream. Can be used to
-  // negotiate parameters for SRTP.
-  // https://tools.ietf.org/html/rfc4568#page-5
-  std::vector<cricket::CryptoParams>& sdes_params() { return sdes_params_; }
-  const std::vector<cricket::CryptoParams>& sdes_params() const {
-    return sdes_params_;
-  }
-
- private:
-  rtc::Optional<std::string> mid_;
-
-  std::vector<cricket::CryptoParams> sdes_params_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_API_ORTC_MEDIADESCRIPTION_H_
diff --git a/api/ortc/mediadescription_unittest.cc b/api/ortc/mediadescription_unittest.cc
deleted file mode 100644
index d033a4e..0000000
--- a/api/ortc/mediadescription_unittest.cc
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- *  Copyright 2017 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/api/ortc/mediadescription.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-class MediaDescriptionTest : public testing::Test {};
-
-TEST_F(MediaDescriptionTest, CreateMediaDescription) {
-  MediaDescription m("a");
-  EXPECT_EQ("a", m.mid());
-}
-
-TEST_F(MediaDescriptionTest, AddSdesParam) {
-  MediaDescription m("a");
-  m.sdes_params().push_back(cricket::CryptoParams());
-  const std::vector<cricket::CryptoParams>& params = m.sdes_params();
-  EXPECT_EQ(1u, params.size());
-}
-
-}  // namespace webrtc
diff --git a/api/ortc/ortcfactoryinterface.h b/api/ortc/ortcfactoryinterface.h
deleted file mode 100644
index 4880d9d..0000000
--- a/api/ortc/ortcfactoryinterface.h
+++ /dev/null
@@ -1,239 +0,0 @@
-/*
- *  Copyright 2017 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_API_ORTC_ORTCFACTORYINTERFACE_H_
-#define WEBRTC_API_ORTC_ORTCFACTORYINTERFACE_H_
-
-#include <memory>
-#include <string>
-#include <utility>  // For std::move.
-
-#include "webrtc/api/mediaconstraintsinterface.h"
-#include "webrtc/api/mediastreaminterface.h"
-#include "webrtc/api/mediatypes.h"
-#include "webrtc/api/ortc/ortcrtpreceiverinterface.h"
-#include "webrtc/api/ortc/ortcrtpsenderinterface.h"
-#include "webrtc/api/ortc/packettransportinterface.h"
-#include "webrtc/api/ortc/rtptransportcontrollerinterface.h"
-#include "webrtc/api/ortc/rtptransportinterface.h"
-#include "webrtc/api/ortc/srtptransportinterface.h"
-#include "webrtc/api/ortc/udptransportinterface.h"
-#include "webrtc/api/rtcerror.h"
-#include "webrtc/api/rtpparameters.h"
-#include "webrtc/p2p/base/packetsocketfactory.h"
-#include "webrtc/rtc_base/network.h"
-#include "webrtc/rtc_base/scoped_ref_ptr.h"
-#include "webrtc/rtc_base/thread.h"
-
-namespace webrtc {
-
-// TODO(deadbeef): This should be part of /api/, but currently it's not and
-// including its header violates checkdeps rules.
-class AudioDeviceModule;
-
-// WARNING: This is experimental/under development, so use at your own risk; no
-// guarantee about API stability is guaranteed here yet.
-//
-// This class is the ORTC analog of PeerConnectionFactory. It acts as a factory
-// for ORTC objects that can be connected to each other.
-//
-// Some of these objects may not be represented by the ORTC specification, but
-// follow the same general principles.
-//
-// If one of the factory methods takes another object as an argument, it MUST
-// have been created by the same OrtcFactory.
-//
-// On object lifetimes: objects should be destroyed in this order:
-// 1. Objects created by the factory.
-// 2. The factory itself.
-// 3. Objects passed into OrtcFactoryInterface::Create.
-class OrtcFactoryInterface {
- public:
-  // |network_thread| is the thread on which packets are sent and received.
-  // If null, a new rtc::Thread with a default socket server is created.
-  //
-  // |signaling_thread| is used for callbacks to the consumer of the API. If
-  // null, the current thread will be used, which assumes that the API consumer
-  // is running a message loop on this thread (either using an existing
-  // rtc::Thread, or by calling rtc::Thread::Current()->ProcessMessages).
-  //
-  // |network_manager| is used to determine which network interfaces are
-  // available. This is used for ICE, for example. If null, a default
-  // implementation will be used. Only accessed on |network_thread|.
-  //
-  // |socket_factory| is used (on the network thread) for creating sockets. If
-  // it's null, a default implementation will be used, which assumes
-  // |network_thread| is a normal rtc::Thread.
-  //
-  // |adm| is optional, and allows a different audio device implementation to
-  // be injected; otherwise a platform-specific module will be used that will
-  // use the default audio input.
-  //
-  // Note that the OrtcFactoryInterface does not take ownership of any of the
-  // objects passed in, and as previously stated, these objects can't be
-  // destroyed before the factory is.
-  static RTCErrorOr<std::unique_ptr<OrtcFactoryInterface>> Create(
-      rtc::Thread* network_thread,
-      rtc::Thread* signaling_thread,
-      rtc::NetworkManager* network_manager,
-      rtc::PacketSocketFactory* socket_factory,
-      AudioDeviceModule* adm);
-
-  // Constructor for convenience which uses default implementations of
-  // everything (though does still require that the current thread runs a
-  // message loop; see above).
-  static RTCErrorOr<std::unique_ptr<OrtcFactoryInterface>> Create() {
-    return Create(nullptr, nullptr, nullptr, nullptr, nullptr);
-  }
-
-  virtual ~OrtcFactoryInterface() {}
-
-  // Creates an RTP transport controller, which is used in calls to
-  // CreateRtpTransport methods. If your application has some notion of a
-  // "call", you should create one transport controller per call.
-  //
-  // However, if you only are using one RtpTransport object, this doesn't need
-  // to be called explicitly; CreateRtpTransport will create one automatically
-  // if |rtp_transport_controller| is null. See below.
-  //
-  // TODO(deadbeef): Add MediaConfig and RtcEventLog arguments?
-  virtual RTCErrorOr<std::unique_ptr<RtpTransportControllerInterface>>
-  CreateRtpTransportController() = 0;
-
-  // Creates an RTP transport using the provided packet transports and
-  // transport controller.
-  //
-  // |rtp| will be used for sending RTP packets, and |rtcp| for RTCP packets.
-  //
-  // |rtp| can't be null. |rtcp| must be non-null if and only if
-  // |rtp_parameters.rtcp.mux| is false, indicating that RTCP muxing isn't used.
-  // Note that if RTCP muxing isn't enabled initially, it can still enabled
-  // later through SetParameters.
-  //
-  // If |transport_controller| is null, one will automatically be created, and
-  // its lifetime managed by the returned RtpTransport. This should only be
-  // done if a single RtpTransport is being used to communicate with the remote
-  // endpoint.
-  virtual RTCErrorOr<std::unique_ptr<RtpTransportInterface>> CreateRtpTransport(
-      const RtpTransportParameters& rtp_parameters,
-      PacketTransportInterface* rtp,
-      PacketTransportInterface* rtcp,
-      RtpTransportControllerInterface* transport_controller) = 0;
-
-  // Creates an SrtpTransport which is an RTP transport that uses SRTP.
-  virtual RTCErrorOr<std::unique_ptr<SrtpTransportInterface>>
-  CreateSrtpTransport(
-      const RtpTransportParameters& rtp_parameters,
-      PacketTransportInterface* rtp,
-      PacketTransportInterface* rtcp,
-      RtpTransportControllerInterface* transport_controller) = 0;
-
-  // Returns the capabilities of an RTP sender of type |kind|. These
-  // capabilities can be used to determine what RtpParameters to use to create
-  // an RtpSender.
-  //
-  // If for some reason you pass in MEDIA_TYPE_DATA, returns an empty structure.
-  virtual RtpCapabilities GetRtpSenderCapabilities(
-      cricket::MediaType kind) const = 0;
-
-  // Creates an RTP sender with |track|. Will not start sending until Send is
-  // called. This is provided as a convenience; it's equivalent to calling
-  // CreateRtpSender with a kind (see below), followed by SetTrack.
-  //
-  // |track| and |transport| must not be null.
-  virtual RTCErrorOr<std::unique_ptr<OrtcRtpSenderInterface>> CreateRtpSender(
-      rtc::scoped_refptr<MediaStreamTrackInterface> track,
-      RtpTransportInterface* transport) = 0;
-
-  // Overload of CreateRtpSender allows creating the sender without a track.
-  //
-  // |kind| must be MEDIA_TYPE_AUDIO or MEDIA_TYPE_VIDEO.
-  virtual RTCErrorOr<std::unique_ptr<OrtcRtpSenderInterface>> CreateRtpSender(
-      cricket::MediaType kind,
-      RtpTransportInterface* transport) = 0;
-
-  // Returns the capabilities of an RTP receiver of type |kind|. These
-  // capabilities can be used to determine what RtpParameters to use to create
-  // an RtpReceiver.
-  //
-  // If for some reason you pass in MEDIA_TYPE_DATA, returns an empty structure.
-  virtual RtpCapabilities GetRtpReceiverCapabilities(
-      cricket::MediaType kind) const = 0;
-
-  // Creates an RTP receiver of type |kind|. Will not start receiving media
-  // until Receive is called.
-  //
-  // |kind| must be MEDIA_TYPE_AUDIO or MEDIA_TYPE_VIDEO.
-  //
-  // |transport| must not be null.
-  virtual RTCErrorOr<std::unique_ptr<OrtcRtpReceiverInterface>>
-  CreateRtpReceiver(cricket::MediaType kind,
-                    RtpTransportInterface* transport) = 0;
-
-  // Create a UDP transport with IP address family |family|, using a port
-  // within the specified range.
-  //
-  // |family| must be AF_INET or AF_INET6.
-  //
-  // |min_port|/|max_port| values of 0 indicate no range restriction.
-  //
-  // Returns an error if the transport wasn't successfully created.
-  virtual RTCErrorOr<std::unique_ptr<UdpTransportInterface>>
-  CreateUdpTransport(int family, uint16_t min_port, uint16_t max_port) = 0;
-
-  // Method for convenience that has no port range restrictions.
-  RTCErrorOr<std::unique_ptr<UdpTransportInterface>> CreateUdpTransport(
-      int family) {
-    return CreateUdpTransport(family, 0, 0);
-  }
-
-  // NOTE: The methods below to create tracks/sources return scoped_refptrs
-  // rather than unique_ptrs, because these interfaces are also used with
-  // PeerConnection, where everything is ref-counted.
-
-  // Creates a audio source representing the default microphone input.
-  // |options| decides audio processing settings.
-  virtual rtc::scoped_refptr<AudioSourceInterface> CreateAudioSource(
-      const cricket::AudioOptions& options) = 0;
-
-  // Version of the above method that uses default options.
-  rtc::scoped_refptr<AudioSourceInterface> CreateAudioSource() {
-    return CreateAudioSource(cricket::AudioOptions());
-  }
-
-  // Creates a video source object wrapping and taking ownership of |capturer|.
-  //
-  // |constraints| can be used for selection of resolution and frame rate, and
-  // may be null if no constraints are desired.
-  virtual rtc::scoped_refptr<VideoTrackSourceInterface> CreateVideoSource(
-      std::unique_ptr<cricket::VideoCapturer> capturer,
-      const MediaConstraintsInterface* constraints) = 0;
-
-  // Version of the above method that omits |constraints|.
-  rtc::scoped_refptr<VideoTrackSourceInterface> CreateVideoSource(
-      std::unique_ptr<cricket::VideoCapturer> capturer) {
-    return CreateVideoSource(std::move(capturer), nullptr);
-  }
-
-  // Creates a new local video track wrapping |source|. The same |source| can
-  // be used in several tracks.
-  virtual rtc::scoped_refptr<VideoTrackInterface> CreateVideoTrack(
-      const std::string& id,
-      VideoTrackSourceInterface* source) = 0;
-
-  // Creates an new local audio track wrapping |source|.
-  virtual rtc::scoped_refptr<AudioTrackInterface> CreateAudioTrack(
-      const std::string& id,
-      AudioSourceInterface* source) = 0;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_API_ORTC_ORTCFACTORYINTERFACE_H_
diff --git a/api/ortc/ortcrtpreceiverinterface.h b/api/ortc/ortcrtpreceiverinterface.h
deleted file mode 100644
index 1fad29c..0000000
--- a/api/ortc/ortcrtpreceiverinterface.h
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- *  Copyright 2017 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.
- */
-
-// This file contains interfaces for RtpReceivers:
-// http://publications.ortc.org/2016/20161202/#rtcrtpreceiver*
-//
-// However, underneath the RtpReceiver is an RtpTransport, rather than a
-// DtlsTransport. This is to allow different types of RTP transports (besides
-// DTLS-SRTP) to be used.
-
-#ifndef WEBRTC_API_ORTC_ORTCRTPRECEIVERINTERFACE_H_
-#define WEBRTC_API_ORTC_ORTCRTPRECEIVERINTERFACE_H_
-
-#include "webrtc/api/mediastreaminterface.h"
-#include "webrtc/api/mediatypes.h"
-#include "webrtc/api/ortc/rtptransportinterface.h"
-#include "webrtc/api/rtcerror.h"
-#include "webrtc/api/rtpparameters.h"
-
-namespace webrtc {
-
-// Note: Since receiver capabilities may depend on how the OrtcFactory was
-// created, instead of a static "GetCapabilities" method on this interface,
-// there is a "GetRtpReceiverCapabilities" method on the OrtcFactory.
-class OrtcRtpReceiverInterface {
- public:
-  virtual ~OrtcRtpReceiverInterface() {}
-
-  // Returns a track representing the media received by this receiver.
-  //
-  // Currently, this will return null until Receive has been successfully
-  // called. Also, a new track will be created every time the primary SSRC
-  // changes.
-  //
-  // If encodings are removed, GetTrack will return null. Though deactivating
-  // an encoding (setting |active| to false) will not do this.
-  //
-  // In the future, these limitations will be fixed, and GetTrack will return
-  // the same track for the lifetime of the RtpReceiver. So it's not
-  // recommended to write code that depends on this non-standard behavior.
-  virtual rtc::scoped_refptr<MediaStreamTrackInterface> GetTrack() const = 0;
-
-  // Once supported, will switch to receiving media on a new transport.
-  // However, this is not currently supported and will always return an error.
-  virtual RTCError SetTransport(RtpTransportInterface* transport) = 0;
-  // Returns previously set (or constructed-with) transport.
-  virtual RtpTransportInterface* GetTransport() const = 0;
-
-  // Start receiving media with |parameters| (if |parameters| contains an
-  // active encoding).
-  //
-  // There are no limitations to how the parameters can be changed after the
-  // initial call to Receive, as long as they're valid (for example, they can't
-  // use the same payload type for two codecs).
-  virtual RTCError Receive(const RtpParameters& parameters) = 0;
-  // Returns parameters that were last successfully passed into Receive, or
-  // empty parameters if that hasn't yet occurred.
-  //
-  // Note that for parameters that are described as having an "implementation
-  // default" value chosen, GetParameters() will return those chosen defaults,
-  // with the exception of SSRCs which have special behavior. See
-  // rtpparameters.h for more details.
-  virtual RtpParameters GetParameters() const = 0;
-
-  // Audio or video receiver?
-  //
-  // Once GetTrack() starts always returning a track, this method will be
-  // redundant, as one can call "GetTrack()->kind()". However, it's still a
-  // nice convenience, and is symmetric with OrtcRtpSenderInterface::GetKind.
-  virtual cricket::MediaType GetKind() const = 0;
-
-  // TODO(deadbeef): GetContributingSources
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_API_ORTC_ORTCRTPRECEIVERINTERFACE_H_
diff --git a/api/ortc/ortcrtpsenderinterface.h b/api/ortc/ortcrtpsenderinterface.h
deleted file mode 100644
index a0fc208..0000000
--- a/api/ortc/ortcrtpsenderinterface.h
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- *  Copyright 2017 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.
- */
-
-// This file contains interfaces for RtpSenders:
-// http://publications.ortc.org/2016/20161202/#rtcrtpsender*
-//
-// However, underneath the RtpSender is an RtpTransport, rather than a
-// DtlsTransport. This is to allow different types of RTP transports (besides
-// DTLS-SRTP) to be used.
-
-#ifndef WEBRTC_API_ORTC_ORTCRTPSENDERINTERFACE_H_
-#define WEBRTC_API_ORTC_ORTCRTPSENDERINTERFACE_H_
-
-#include "webrtc/api/mediastreaminterface.h"
-#include "webrtc/api/mediatypes.h"
-#include "webrtc/api/ortc/rtptransportinterface.h"
-#include "webrtc/api/rtcerror.h"
-#include "webrtc/api/rtpparameters.h"
-
-namespace webrtc {
-
-// Note: Since sender capabilities may depend on how the OrtcFactory was
-// created, instead of a static "GetCapabilities" method on this interface,
-// there is a "GetRtpSenderCapabilities" method on the OrtcFactory.
-class OrtcRtpSenderInterface {
- public:
-  virtual ~OrtcRtpSenderInterface() {}
-
-  // Sets the source of media that will be sent by this sender.
-  //
-  // If Send has already been called, will immediately switch to sending this
-  // track. If |track| is null, will stop sending media.
-  //
-  // Returns INVALID_PARAMETER error if an audio track is set on a video
-  // RtpSender, or vice-versa.
-  virtual RTCError SetTrack(MediaStreamTrackInterface* track) = 0;
-  // Returns previously set (or constructed-with) track.
-  virtual rtc::scoped_refptr<MediaStreamTrackInterface> GetTrack() const = 0;
-
-  // Once supported, will switch to sending media on a new transport. However,
-  // this is not currently supported and will always return an error.
-  virtual RTCError SetTransport(RtpTransportInterface* transport) = 0;
-  // Returns previously set (or constructed-with) transport.
-  virtual RtpTransportInterface* GetTransport() const = 0;
-
-  // Start sending media with |parameters| (if |parameters| contains an active
-  // encoding).
-  //
-  // There are no limitations to how the parameters can be changed after the
-  // initial call to Send, as long as they're valid (for example, they can't
-  // use the same payload type for two codecs).
-  virtual RTCError Send(const RtpParameters& parameters) = 0;
-  // Returns parameters that were last successfully passed into Send, or empty
-  // parameters if that hasn't yet occurred.
-  //
-  // Note that for parameters that are described as having an "implementation
-  // default" value chosen, GetParameters() will return those chosen defaults,
-  // with the exception of SSRCs which have special behavior. See
-  // rtpparameters.h for more details.
-  virtual RtpParameters GetParameters() const = 0;
-
-  // Audio or video sender?
-  virtual cricket::MediaType GetKind() const = 0;
-
-  // TODO(deadbeef): SSRC conflict signal.
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_API_ORTC_ORTCRTPSENDERINTERFACE_H_
diff --git a/api/ortc/packettransportinterface.h b/api/ortc/packettransportinterface.h
deleted file mode 100644
index 2677ce6..0000000
--- a/api/ortc/packettransportinterface.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- *  Copyright 2017 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_API_ORTC_PACKETTRANSPORTINTERFACE_H_
-#define WEBRTC_API_ORTC_PACKETTRANSPORTINTERFACE_H_
-
-namespace rtc {
-
-class PacketTransportInternal;
-
-}  // namespace rtc
-
-namespace webrtc {
-
-// Base class for different packet-based transports.
-class PacketTransportInterface {
- public:
-  virtual ~PacketTransportInterface() {}
-
- protected:
-  // Only for internal use. Returns a pointer to an internal interface, for use
-  // by the implementation.
-  virtual rtc::PacketTransportInternal* GetInternal() = 0;
-
-  // Classes that can use this internal interface.
-  friend class RtpTransportControllerAdapter;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_API_ORTC_PACKETTRANSPORTINTERFACE_H_
diff --git a/api/ortc/rtptransportcontrollerinterface.h b/api/ortc/rtptransportcontrollerinterface.h
deleted file mode 100644
index d1d0e44..0000000
--- a/api/ortc/rtptransportcontrollerinterface.h
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- *  Copyright 2017 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_API_ORTC_RTPTRANSPORTCONTROLLERINTERFACE_H_
-#define WEBRTC_API_ORTC_RTPTRANSPORTCONTROLLERINTERFACE_H_
-
-#include <vector>
-
-#include "webrtc/api/ortc/rtptransportinterface.h"
-
-namespace webrtc {
-
-class RtpTransportControllerAdapter;
-
-// Used to group RTP transports between a local endpoint and the same remote
-// endpoint, for the purpose of sharing bandwidth estimation and other things.
-//
-// Comparing this to the PeerConnection model, non-budled audio/video would use
-// two RtpTransports with a single RtpTransportController, whereas bundled
-// media would use a single RtpTransport, and two PeerConnections would use
-// independent RtpTransportControllers.
-//
-// RtpTransports are associated with this controller when they're created, by
-// passing the controller into OrtcFactory's relevant "CreateRtpTransport"
-// method. When a transport is destroyed, it's automatically disassociated.
-// GetTransports returns all currently associated transports.
-//
-// This is the RTP equivalent of "IceTransportController" in ORTC; RtpTransport
-// is to RtpTransportController as IceTransport is to IceTransportController.
-class RtpTransportControllerInterface {
- public:
-  virtual ~RtpTransportControllerInterface() {}
-
-  // Returns all transports associated with this controller (see explanation
-  // above). No ordering is guaranteed.
-  virtual std::vector<RtpTransportInterface*> GetTransports() const = 0;
-
- protected:
-  // Only for internal use. Returns a pointer to an internal interface, for use
-  // by the implementation.
-  virtual RtpTransportControllerAdapter* GetInternal() = 0;
-
-  // Classes that can use this internal interface.
-  friend class OrtcFactory;
-  friend class RtpTransportAdapter;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_API_ORTC_RTPTRANSPORTCONTROLLERINTERFACE_H_
diff --git a/api/ortc/rtptransportinterface.h b/api/ortc/rtptransportinterface.h
deleted file mode 100644
index 1fdc12c..0000000
--- a/api/ortc/rtptransportinterface.h
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- *  Copyright 2017 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_API_ORTC_RTPTRANSPORTINTERFACE_H_
-#define WEBRTC_API_ORTC_RTPTRANSPORTINTERFACE_H_
-
-#include <string>
-
-#include "webrtc/api/optional.h"
-#include "webrtc/api/ortc/packettransportinterface.h"
-#include "webrtc/api/rtcerror.h"
-#include "webrtc/common_types.h"
-
-namespace webrtc {
-
-class RtpTransportAdapter;
-
-struct RtcpParameters final {
-  // The SSRC to be used in the "SSRC of packet sender" field. If not set, one
-  // will be chosen by the implementation.
-  // TODO(deadbeef): Not implemented.
-  rtc::Optional<uint32_t> ssrc;
-
-  // The Canonical Name (CNAME) used by RTCP (e.g. in SDES messages).
-  //
-  // If empty in the construction of the RtpTransport, one will be generated by
-  // the implementation, and returned in GetRtcpParameters. Multiple
-  // RtpTransports created by the same OrtcFactory will use the same generated
-  // CNAME.
-  //
-  // If empty when passed into SetParameters, the CNAME simply won't be
-  // modified.
-  std::string cname;
-
-  // Send reduced-size RTCP?
-  bool reduced_size = false;
-
-  // Send RTCP multiplexed on the RTP transport?
-  bool mux = true;
-
-  bool operator==(const RtcpParameters& o) const {
-    return ssrc == o.ssrc && cname == o.cname &&
-           reduced_size == o.reduced_size && mux == o.mux;
-  }
-  bool operator!=(const RtcpParameters& o) const { return !(*this == o); }
-};
-
-struct RtpTransportParameters final {
-  RtcpParameters rtcp;
-
-  // Enabled periodic sending of keep-alive packets, that help prevent timeouts
-  // on the network level, such as NAT bindings. See RFC6263 section 4.6.
-  RtpKeepAliveConfig keepalive;
-
-  bool operator==(const RtpTransportParameters& o) const {
-    return rtcp == o.rtcp && keepalive == o.keepalive;
-  }
-  bool operator!=(const RtpTransportParameters& o) const {
-    return !(*this == o);
-  }
-};
-
-// Base class for different types of RTP transports that can be created by an
-// OrtcFactory. Used by RtpSenders/RtpReceivers.
-//
-// This is not present in the standard ORTC API, but exists here for a few
-// reasons. Firstly, it allows different types of RTP transports to be used:
-// DTLS-SRTP (which is required for the web), but also SDES-SRTP and
-// unencrypted RTP. It also simplifies the handling of RTCP muxing, and
-// provides a better API point for it.
-//
-// Note that Edge's implementation of ORTC provides a similar API point, called
-// RTCSrtpSdesTransport:
-// https://msdn.microsoft.com/en-us/library/mt502527(v=vs.85).aspx
-class RtpTransportInterface {
- public:
-  virtual ~RtpTransportInterface() {}
-
-  // Returns packet transport that's used to send RTP packets.
-  virtual PacketTransportInterface* GetRtpPacketTransport() const = 0;
-
-  // Returns separate packet transport that's used to send RTCP packets. If
-  // RTCP multiplexing is being used, returns null.
-  virtual PacketTransportInterface* GetRtcpPacketTransport() const = 0;
-
-  // Set/get RTP/RTCP transport params. Can be used to enable RTCP muxing or
-  // reduced-size RTCP if initially not enabled.
-  //
-  // Changing |mux| from "true" to "false" is not allowed, and changing the
-  // CNAME is currently unsupported.
-  // RTP keep-alive settings need to be set before before an RtpSender has
-  // started sending, altering the payload type or timeout interval after this
-  // point is not supported. The parameters must also match across all RTP
-  // transports for a given RTP transport controller.
-  virtual RTCError SetParameters(const RtpTransportParameters& parameters) = 0;
-  // Returns last set or constructed-with parameters. If |cname| was empty in
-  // construction, the generated CNAME will be present in the returned
-  // parameters (see above).
-  virtual RtpTransportParameters GetParameters() const = 0;
-
- protected:
-  // Only for internal use. Returns a pointer to an internal interface, for use
-  // by the implementation.
-  virtual RtpTransportAdapter* GetInternal() = 0;
-
-  // Classes that can use this internal interface.
-  friend class OrtcFactory;
-  friend class OrtcRtpSenderAdapter;
-  friend class OrtcRtpReceiverAdapter;
-  friend class RtpTransportControllerAdapter;
-  friend class RtpTransportAdapter;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_API_ORTC_RTPTRANSPORTINTERFACE_H_
diff --git a/api/ortc/sessiondescription.cc b/api/ortc/sessiondescription.cc
deleted file mode 100644
index c1d4bbb..0000000
--- a/api/ortc/sessiondescription.cc
+++ /dev/null
@@ -1,13 +0,0 @@
-/*
- *  Copyright 2017 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/api/ortc/sessiondescription.h"
-
-namespace webrtc {}
diff --git a/api/ortc/sessiondescription.h b/api/ortc/sessiondescription.h
deleted file mode 100644
index 52f9b0c..0000000
--- a/api/ortc/sessiondescription.h
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- *  Copyright 2017 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_API_ORTC_SESSIONDESCRIPTION_H_
-#define WEBRTC_API_ORTC_SESSIONDESCRIPTION_H_
-
-#include <string>
-#include <utility>
-
-namespace webrtc {
-
-// A structured representation of an SDP session description.
-class SessionDescription {
- public:
-  SessionDescription(int64_t session_id, std::string session_version)
-      : session_id_(session_id), session_version_(std::move(session_version)) {}
-
-  // https://tools.ietf.org/html/rfc4566#section-5.2
-  // o=<username> <sess-id> <sess-version> <nettype> <addrtype>
-  //   <unicast-address>
-  // session_id_ is the "sess-id" field.
-  // session_version_ is the "sess-version" field.
-  int64_t session_id() { return session_id_; }
-  void set_session_id(int64_t session_id) { session_id_ = session_id; }
-
-  const std::string& session_version() const { return session_version_; }
-  void set_session_version(std::string session_version) {
-    session_version_ = std::move(session_version);
-  }
-
- private:
-  int64_t session_id_;
-  std::string session_version_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_API_ORTC_SESSIONDESCRIPTION_H_
diff --git a/api/ortc/sessiondescription_unittest.cc b/api/ortc/sessiondescription_unittest.cc
deleted file mode 100644
index 00d9198..0000000
--- a/api/ortc/sessiondescription_unittest.cc
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- *  Copyright 2017 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/api/ortc/sessiondescription.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-class SessionDescriptionTest : public testing::Test {};
-
-TEST_F(SessionDescriptionTest, CreateSessionDescription) {
-  SessionDescription s(-1, "0");
-  EXPECT_EQ(-1, s.session_id());
-  EXPECT_EQ("0", s.session_version());
-}
-}
diff --git a/api/ortc/srtptransportinterface.h b/api/ortc/srtptransportinterface.h
deleted file mode 100644
index f64618c..0000000
--- a/api/ortc/srtptransportinterface.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- *  Copyright 2017 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_API_ORTC_SRTPTRANSPORTINTERFACE_H_
-#define WEBRTC_API_ORTC_SRTPTRANSPORTINTERFACE_H_
-
-#include "webrtc/api/ortc/rtptransportinterface.h"
-#include "webrtc/api/rtcerror.h"
-#include "webrtc/media/base/cryptoparams.h"
-
-namespace webrtc {
-
-// The subclass of the RtpTransport which uses SRTP. The keying information
-// is explicitly passed in from the application.
-//
-// If using SDP and SDES (RFC4568) for signaling, then after applying the
-// answer, the negotiated keying information from the offer and answer would be
-// set and the SRTP would be active.
-//
-// Note that Edge's implementation of ORTC provides a similar API point, called
-// RTCSrtpSdesTransport:
-// https://msdn.microsoft.com/en-us/library/mt502527(v=vs.85).aspx
-class SrtpTransportInterface : public RtpTransportInterface {
- public:
-  virtual ~SrtpTransportInterface() {}
-
-  // There are some limitations of the current implementation:
-  //  1. Send and receive keys must use the same crypto suite.
-  //  2. The keys can't be changed after initially set.
-  //  3. The keys must be set before creating a sender/receiver using the SRTP
-  //     transport.
-  // Set the SRTP keying material for sending RTP and RTCP.
-  virtual RTCError SetSrtpSendKey(const cricket::CryptoParams& params) = 0;
-
-  // Set the SRTP keying material for receiving RTP and RTCP.
-  virtual RTCError SetSrtpReceiveKey(const cricket::CryptoParams& params) = 0;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_API_ORTC_SRTPTRANSPORTINTERFACE_H_
diff --git a/api/ortc/udptransportinterface.h b/api/ortc/udptransportinterface.h
deleted file mode 100644
index cdcd321..0000000
--- a/api/ortc/udptransportinterface.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- *  Copyright 2017 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_API_ORTC_UDPTRANSPORTINTERFACE_H_
-#define WEBRTC_API_ORTC_UDPTRANSPORTINTERFACE_H_
-
-#include "webrtc/api/ortc/packettransportinterface.h"
-#include "webrtc/api/proxy.h"
-#include "webrtc/rtc_base/socketaddress.h"
-
-namespace webrtc {
-
-// Interface for a raw UDP transport (not using ICE), meaning a combination of
-// a local/remote IP address/port.
-//
-// An instance can be instantiated using OrtcFactory.
-//
-// Each instance reserves a UDP port, which will be freed when the
-// UdpTransportInterface destructor is called.
-//
-// Calling SetRemoteAddress sets the destination of outgoing packets; without a
-// destination, packets can't be sent, but they can be received.
-class UdpTransportInterface : public virtual PacketTransportInterface {
- public:
-  // Get the address of the socket allocated for this transport.
-  virtual rtc::SocketAddress GetLocalAddress() const = 0;
-
-  // Sets the address to which packets will be delivered.
-  //
-  // Calling with a "nil" (default-constructed) address is legal, and unsets
-  // any previously set destination.
-  //
-  // However, calling with an incomplete address (port or IP not set) will
-  // fail.
-  virtual bool SetRemoteAddress(const rtc::SocketAddress& dest) = 0;
-  // Simple getter. If never set, returns nil address.
-  virtual rtc::SocketAddress GetRemoteAddress() const = 0;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_API_ORTC_UDPTRANSPORTINTERFACE_H_
diff --git a/api/peerconnectionfactoryproxy.h b/api/peerconnectionfactoryproxy.h
deleted file mode 100644
index 52f5109..0000000
--- a/api/peerconnectionfactoryproxy.h
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- *  Copyright 2014 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_API_PEERCONNECTIONFACTORYPROXY_H_
-#define WEBRTC_API_PEERCONNECTIONFACTORYPROXY_H_
-
-#include <memory>
-#include <string>
-#include <utility>
-
-#include "webrtc/api/peerconnectioninterface.h"
-#include "webrtc/api/proxy.h"
-#include "webrtc/rtc_base/bind.h"
-
-namespace webrtc {
-
-// TODO(deadbeef): Move this to .cc file and out of api/. What threads methods
-// are called on is an implementation detail.
-BEGIN_SIGNALING_PROXY_MAP(PeerConnectionFactory)
-  PROXY_SIGNALING_THREAD_DESTRUCTOR()
-  // Use the overloads of CreateVideoSource that take raw VideoCapturer
-  // pointers from PeerConnectionFactoryInterface.
-  // TODO(deadbeef): Remove this using statement once those overloads are
-  // removed.
-  using PeerConnectionFactoryInterface::CreateVideoSource;
-  PROXY_METHOD1(void, SetOptions, const Options&)
-  PROXY_METHOD5(rtc::scoped_refptr<PeerConnectionInterface>,
-                CreatePeerConnection,
-                const PeerConnectionInterface::RTCConfiguration&,
-                const MediaConstraintsInterface*,
-                std::unique_ptr<cricket::PortAllocator>,
-                std::unique_ptr<rtc::RTCCertificateGeneratorInterface>,
-                PeerConnectionObserver*);
-  PROXY_METHOD4(rtc::scoped_refptr<PeerConnectionInterface>,
-                CreatePeerConnection,
-                const PeerConnectionInterface::RTCConfiguration&,
-                std::unique_ptr<cricket::PortAllocator>,
-                std::unique_ptr<rtc::RTCCertificateGeneratorInterface>,
-                PeerConnectionObserver*);
-  PROXY_METHOD1(rtc::scoped_refptr<MediaStreamInterface>,
-                CreateLocalMediaStream, const std::string&)
-  PROXY_METHOD1(rtc::scoped_refptr<AudioSourceInterface>,
-                CreateAudioSource, const MediaConstraintsInterface*)
-  PROXY_METHOD1(rtc::scoped_refptr<AudioSourceInterface>,
-                CreateAudioSource,
-                const cricket::AudioOptions&)
-  PROXY_METHOD2(rtc::scoped_refptr<VideoTrackSourceInterface>,
-                CreateVideoSource,
-                std::unique_ptr<cricket::VideoCapturer>,
-                const MediaConstraintsInterface*)
-  PROXY_METHOD1(rtc::scoped_refptr<VideoTrackSourceInterface>,
-                CreateVideoSource,
-                std::unique_ptr<cricket::VideoCapturer>)
-  PROXY_METHOD2(rtc::scoped_refptr<VideoTrackInterface>,
-                CreateVideoTrack,
-                const std::string&,
-                VideoTrackSourceInterface*)
-  PROXY_METHOD2(rtc::scoped_refptr<AudioTrackInterface>,
-                CreateAudioTrack, const std::string&,  AudioSourceInterface*)
-  PROXY_METHOD2(bool, StartAecDump, rtc::PlatformFile, int64_t)
-  PROXY_METHOD0(void, StopAecDump)
-  // TODO(ivoc): Remove the StartRtcEventLog and StopRtcEventLog functions as
-  // soon as they are removed from PeerConnectionFactoryInterface.
-  PROXY_METHOD1(bool, StartRtcEventLog, rtc::PlatformFile)
-  PROXY_METHOD2(bool, StartRtcEventLog, rtc::PlatformFile, int64_t)
-  PROXY_METHOD0(void, StopRtcEventLog)
-END_PROXY_MAP()
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_API_PEERCONNECTIONFACTORYPROXY_H_
diff --git a/api/peerconnectioninterface.h b/api/peerconnectioninterface.h
deleted file mode 100644
index e23b705..0000000
--- a/api/peerconnectioninterface.h
+++ /dev/null
@@ -1,1227 +0,0 @@
-/*
- *  Copyright 2012 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.
- */
-
-// This file contains the PeerConnection interface as defined in
-// http://dev.w3.org/2011/webrtc/editor/webrtc.html#peer-to-peer-connections.
-//
-// The PeerConnectionFactory class provides factory methods to create
-// PeerConnection, MediaStream and MediaStreamTrack objects.
-//
-// The following steps are needed to setup a typical call using WebRTC:
-//
-// 1. Create a PeerConnectionFactoryInterface. Check constructors for more
-// information about input parameters.
-//
-// 2. Create a PeerConnection object. Provide a configuration struct which
-// points to STUN and/or TURN servers used to generate ICE candidates, and
-// provide an object that implements the PeerConnectionObserver interface,
-// which is used to receive callbacks from the PeerConnection.
-//
-// 3. Create local MediaStreamTracks using the PeerConnectionFactory and add
-// them to PeerConnection by calling AddTrack (or legacy method, AddStream).
-//
-// 4. Create an offer, call SetLocalDescription with it, serialize it, and send
-// it to the remote peer
-//
-// 5. Once an ICE candidate has been gathered, the PeerConnection will call the
-// observer function OnIceCandidate. The candidates must also be serialized and
-// sent to the remote peer.
-//
-// 6. Once an answer is received from the remote peer, call
-// SetRemoteDescription with the remote answer.
-//
-// 7. Once a remote candidate is received from the remote peer, provide it to
-// the PeerConnection by calling AddIceCandidate.
-//
-// The receiver of a call (assuming the application is "call"-based) can decide
-// to accept or reject the call; this decision will be taken by the application,
-// not the PeerConnection.
-//
-// If the application decides to accept the call, it should:
-//
-// 1. Create PeerConnectionFactoryInterface if it doesn't exist.
-//
-// 2. Create a new PeerConnection.
-//
-// 3. Provide the remote offer to the new PeerConnection object by calling
-// SetRemoteDescription.
-//
-// 4. Generate an answer to the remote offer by calling CreateAnswer and send it
-// back to the remote peer.
-//
-// 5. Provide the local answer to the new PeerConnection by calling
-// SetLocalDescription with the answer.
-//
-// 6. Provide the remote ICE candidates by calling AddIceCandidate.
-//
-// 7. Once a candidate has been gathered, the PeerConnection will call the
-// observer function OnIceCandidate. Send these candidates to the remote peer.
-
-#ifndef WEBRTC_API_PEERCONNECTIONINTERFACE_H_
-#define WEBRTC_API_PEERCONNECTIONINTERFACE_H_
-
-#include <memory>
-#include <string>
-#include <utility>
-#include <vector>
-
-#include "webrtc/api/audio_codecs/audio_decoder_factory.h"
-#include "webrtc/api/audio_codecs/audio_encoder_factory.h"
-#include "webrtc/api/datachannelinterface.h"
-#include "webrtc/api/dtmfsenderinterface.h"
-#include "webrtc/api/jsep.h"
-#include "webrtc/api/mediastreaminterface.h"
-#include "webrtc/api/rtcerror.h"
-#include "webrtc/api/rtpreceiverinterface.h"
-#include "webrtc/api/rtpsenderinterface.h"
-#include "webrtc/api/stats/rtcstatscollectorcallback.h"
-#include "webrtc/api/statstypes.h"
-#include "webrtc/api/umametrics.h"
-#include "webrtc/call/callfactoryinterface.h"
-#include "webrtc/logging/rtc_event_log/rtc_event_log_factory_interface.h"
-#include "webrtc/media/base/mediachannel.h"
-#include "webrtc/media/base/videocapturer.h"
-#include "webrtc/p2p/base/portallocator.h"
-#include "webrtc/rtc_base/fileutils.h"
-#include "webrtc/rtc_base/network.h"
-#include "webrtc/rtc_base/rtccertificate.h"
-#include "webrtc/rtc_base/rtccertificategenerator.h"
-#include "webrtc/rtc_base/socketaddress.h"
-#include "webrtc/rtc_base/sslstreamadapter.h"
-
-namespace rtc {
-class SSLIdentity;
-class Thread;
-}
-
-namespace cricket {
-class MediaEngineInterface;
-class WebRtcVideoDecoderFactory;
-class WebRtcVideoEncoderFactory;
-}
-
-namespace webrtc {
-class AudioDeviceModule;
-class AudioMixer;
-class CallFactoryInterface;
-class MediaConstraintsInterface;
-
-// MediaStream container interface.
-class StreamCollectionInterface : public rtc::RefCountInterface {
- public:
-  // TODO(ronghuawu): Update the function names to c++ style, e.g. find -> Find.
-  virtual size_t count() = 0;
-  virtual MediaStreamInterface* at(size_t index) = 0;
-  virtual MediaStreamInterface* find(const std::string& label) = 0;
-  virtual MediaStreamTrackInterface* FindAudioTrack(
-      const std::string& id) = 0;
-  virtual MediaStreamTrackInterface* FindVideoTrack(
-      const std::string& id) = 0;
-
- protected:
-  // Dtor protected as objects shouldn't be deleted via this interface.
-  ~StreamCollectionInterface() {}
-};
-
-class StatsObserver : public rtc::RefCountInterface {
- public:
-  virtual void OnComplete(const StatsReports& reports) = 0;
-
- protected:
-  virtual ~StatsObserver() {}
-};
-
-class PeerConnectionInterface : public rtc::RefCountInterface {
- public:
-  // See http://dev.w3.org/2011/webrtc/editor/webrtc.html#state-definitions .
-  enum SignalingState {
-    kStable,
-    kHaveLocalOffer,
-    kHaveLocalPrAnswer,
-    kHaveRemoteOffer,
-    kHaveRemotePrAnswer,
-    kClosed,
-  };
-
-  enum IceGatheringState {
-    kIceGatheringNew,
-    kIceGatheringGathering,
-    kIceGatheringComplete
-  };
-
-  enum IceConnectionState {
-    kIceConnectionNew,
-    kIceConnectionChecking,
-    kIceConnectionConnected,
-    kIceConnectionCompleted,
-    kIceConnectionFailed,
-    kIceConnectionDisconnected,
-    kIceConnectionClosed,
-    kIceConnectionMax,
-  };
-
-  // TLS certificate policy.
-  enum TlsCertPolicy {
-    // For TLS based protocols, ensure the connection is secure by not
-    // circumventing certificate validation.
-    kTlsCertPolicySecure,
-    // For TLS based protocols, disregard security completely by skipping
-    // certificate validation. This is insecure and should never be used unless
-    // security is irrelevant in that particular context.
-    kTlsCertPolicyInsecureNoCheck,
-  };
-
-  struct IceServer {
-    // TODO(jbauch): Remove uri when all code using it has switched to urls.
-    // List of URIs associated with this server. Valid formats are described
-    // in RFC7064 and RFC7065, and more may be added in the future. The "host"
-    // part of the URI may contain either an IP address or a hostname.
-    std::string uri;
-    std::vector<std::string> urls;
-    std::string username;
-    std::string password;
-    TlsCertPolicy tls_cert_policy = kTlsCertPolicySecure;
-    // If the URIs in |urls| only contain IP addresses, this field can be used
-    // to indicate the hostname, which may be necessary for TLS (using the SNI
-    // extension). If |urls| itself contains the hostname, this isn't
-    // necessary.
-    std::string hostname;
-    // List of protocols to be used in the TLS ALPN extension.
-    std::vector<std::string> tls_alpn_protocols;
-    // List of elliptic curves to be used in the TLS elliptic curves extension.
-    std::vector<std::string> tls_elliptic_curves;
-
-    bool operator==(const IceServer& o) const {
-      return uri == o.uri && urls == o.urls && username == o.username &&
-             password == o.password && tls_cert_policy == o.tls_cert_policy &&
-             hostname == o.hostname &&
-             tls_alpn_protocols == o.tls_alpn_protocols &&
-             tls_elliptic_curves == o.tls_elliptic_curves;
-    }
-    bool operator!=(const IceServer& o) const { return !(*this == o); }
-  };
-  typedef std::vector<IceServer> IceServers;
-
-  enum IceTransportsType {
-    // TODO(pthatcher): Rename these kTransporTypeXXX, but update
-    // Chromium at the same time.
-    kNone,
-    kRelay,
-    kNoHost,
-    kAll
-  };
-
-  // https://tools.ietf.org/html/draft-ietf-rtcweb-jsep-08#section-4.1.1
-  enum BundlePolicy {
-    kBundlePolicyBalanced,
-    kBundlePolicyMaxBundle,
-    kBundlePolicyMaxCompat
-  };
-
-  // https://tools.ietf.org/html/draft-ietf-rtcweb-jsep-09#section-4.1.1
-  enum RtcpMuxPolicy {
-    kRtcpMuxPolicyNegotiate,
-    kRtcpMuxPolicyRequire,
-  };
-
-  enum TcpCandidatePolicy {
-    kTcpCandidatePolicyEnabled,
-    kTcpCandidatePolicyDisabled
-  };
-
-  enum CandidateNetworkPolicy {
-    kCandidateNetworkPolicyAll,
-    kCandidateNetworkPolicyLowCost
-  };
-
-  enum ContinualGatheringPolicy {
-    GATHER_ONCE,
-    GATHER_CONTINUALLY
-  };
-
-  enum class RTCConfigurationType {
-    // A configuration that is safer to use, despite not having the best
-    // performance. Currently this is the default configuration.
-    kSafe,
-    // An aggressive configuration that has better performance, although it
-    // may be riskier and may need extra support in the application.
-    kAggressive
-  };
-
-  // TODO(hbos): Change into class with private data and public getters.
-  // TODO(nisse): In particular, accessing fields directly from an
-  // application is brittle, since the organization mirrors the
-  // organization of the implementation, which isn't stable. So we
-  // need getters and setters at least for fields which applications
-  // are interested in.
-  struct RTCConfiguration {
-    // This struct is subject to reorganization, both for naming
-    // consistency, and to group settings to match where they are used
-    // in the implementation. To do that, we need getter and setter
-    // methods for all settings which are of interest to applications,
-    // Chrome in particular.
-
-    RTCConfiguration() = default;
-    explicit RTCConfiguration(RTCConfigurationType type) {
-      if (type == RTCConfigurationType::kAggressive) {
-        // These parameters are also defined in Java and IOS configurations,
-        // so their values may be overwritten by the Java or IOS configuration.
-        bundle_policy = kBundlePolicyMaxBundle;
-        rtcp_mux_policy = kRtcpMuxPolicyRequire;
-        ice_connection_receiving_timeout =
-            kAggressiveIceConnectionReceivingTimeout;
-
-        // These parameters are not defined in Java or IOS configuration,
-        // so their values will not be overwritten.
-        enable_ice_renomination = true;
-        redetermine_role_on_ice_restart = false;
-      }
-    }
-
-    bool operator==(const RTCConfiguration& o) const;
-    bool operator!=(const RTCConfiguration& o) const;
-
-    bool dscp() { return media_config.enable_dscp; }
-    void set_dscp(bool enable) { media_config.enable_dscp = enable; }
-
-    // TODO(nisse): The corresponding flag in MediaConfig and
-    // elsewhere should be renamed enable_cpu_adaptation.
-    bool cpu_adaptation() {
-      return media_config.video.enable_cpu_overuse_detection;
-    }
-    void set_cpu_adaptation(bool enable) {
-      media_config.video.enable_cpu_overuse_detection = enable;
-    }
-
-    bool suspend_below_min_bitrate() {
-      return media_config.video.suspend_below_min_bitrate;
-    }
-    void set_suspend_below_min_bitrate(bool enable) {
-      media_config.video.suspend_below_min_bitrate = enable;
-    }
-
-    // TODO(nisse): The negation in the corresponding MediaConfig
-    // attribute is inconsistent, and it should be renamed at some
-    // point.
-    bool prerenderer_smoothing() {
-      return !media_config.video.disable_prerenderer_smoothing;
-    }
-    void set_prerenderer_smoothing(bool enable) {
-      media_config.video.disable_prerenderer_smoothing = !enable;
-    }
-
-    static const int kUndefined = -1;
-    // Default maximum number of packets in the audio jitter buffer.
-    static const int kAudioJitterBufferMaxPackets = 50;
-    // ICE connection receiving timeout for aggressive configuration.
-    static const int kAggressiveIceConnectionReceivingTimeout = 1000;
-
-    ////////////////////////////////////////////////////////////////////////
-    // The below few fields mirror the standard RTCConfiguration dictionary:
-    // https://www.w3.org/TR/webrtc/#rtcconfiguration-dictionary
-    ////////////////////////////////////////////////////////////////////////
-
-    // TODO(pthatcher): Rename this ice_servers, but update Chromium
-    // at the same time.
-    IceServers servers;
-    // TODO(pthatcher): Rename this ice_transport_type, but update
-    // Chromium at the same time.
-    IceTransportsType type = kAll;
-    BundlePolicy bundle_policy = kBundlePolicyBalanced;
-    RtcpMuxPolicy rtcp_mux_policy = kRtcpMuxPolicyRequire;
-    std::vector<rtc::scoped_refptr<rtc::RTCCertificate>> certificates;
-    int ice_candidate_pool_size = 0;
-
-    //////////////////////////////////////////////////////////////////////////
-    // The below fields correspond to constraints from the deprecated
-    // constraints interface for constructing a PeerConnection.
-    //
-    // rtc::Optional fields can be "missing", in which case the implementation
-    // default will be used.
-    //////////////////////////////////////////////////////////////////////////
-
-    // If set to true, don't gather IPv6 ICE candidates.
-    // TODO(deadbeef): Remove this? IPv6 support has long stopped being
-    // experimental
-    bool disable_ipv6 = false;
-
-    // If set to true, don't gather IPv6 ICE candidates on Wi-Fi.
-    // Only intended to be used on specific devices. Certain phones disable IPv6
-    // when the screen is turned off and it would be better to just disable the
-    // IPv6 ICE candidates on Wi-Fi in those cases.
-    bool disable_ipv6_on_wifi = false;
-
-    // By default, the PeerConnection will use a limited number of IPv6 network
-    // interfaces, in order to avoid too many ICE candidate pairs being created
-    // and delaying ICE completion.
-    //
-    // Can be set to INT_MAX to effectively disable the limit.
-    int max_ipv6_networks = cricket::kDefaultMaxIPv6Networks;
-
-    // If set to true, use RTP data channels instead of SCTP.
-    // TODO(deadbeef): Remove this. We no longer commit to supporting RTP data
-    // channels, though some applications are still working on moving off of
-    // them.
-    bool enable_rtp_data_channel = false;
-
-    // Minimum bitrate at which screencast video tracks will be encoded at.
-    // This means adding padding bits up to this bitrate, which can help
-    // when switching from a static scene to one with motion.
-    rtc::Optional<int> screencast_min_bitrate;
-
-    // Use new combined audio/video bandwidth estimation?
-    rtc::Optional<bool> combined_audio_video_bwe;
-
-    // Can be used to disable DTLS-SRTP. This should never be done, but can be
-    // useful for testing purposes, for example in setting up a loopback call
-    // with a single PeerConnection.
-    rtc::Optional<bool> enable_dtls_srtp;
-
-    /////////////////////////////////////////////////
-    // The below fields are not part of the standard.
-    /////////////////////////////////////////////////
-
-    // Can be used to disable TCP candidate generation.
-    TcpCandidatePolicy tcp_candidate_policy = kTcpCandidatePolicyEnabled;
-
-    // Can be used to avoid gathering candidates for a "higher cost" network,
-    // if a lower cost one exists. For example, if both Wi-Fi and cellular
-    // interfaces are available, this could be used to avoid using the cellular
-    // interface.
-    CandidateNetworkPolicy candidate_network_policy =
-        kCandidateNetworkPolicyAll;
-
-    // The maximum number of packets that can be stored in the NetEq audio
-    // jitter buffer. Can be reduced to lower tolerated audio latency.
-    int audio_jitter_buffer_max_packets = kAudioJitterBufferMaxPackets;
-
-    // Whether to use the NetEq "fast mode" which will accelerate audio quicker
-    // if it falls behind.
-    bool audio_jitter_buffer_fast_accelerate = false;
-
-    // Timeout in milliseconds before an ICE candidate pair is considered to be
-    // "not receiving", after which a lower priority candidate pair may be
-    // selected.
-    int ice_connection_receiving_timeout = kUndefined;
-
-    // Interval in milliseconds at which an ICE "backup" candidate pair will be
-    // pinged. This is a candidate pair which is not actively in use, but may
-    // be switched to if the active candidate pair becomes unusable.
-    //
-    // This is relevant mainly to Wi-Fi/cell handoff; the application may not
-    // want this backup cellular candidate pair pinged frequently, since it
-    // consumes data/battery.
-    int ice_backup_candidate_pair_ping_interval = kUndefined;
-
-    // Can be used to enable continual gathering, which means new candidates
-    // will be gathered as network interfaces change. Note that if continual
-    // gathering is used, the candidate removal API should also be used, to
-    // avoid an ever-growing list of candidates.
-    ContinualGatheringPolicy continual_gathering_policy = GATHER_ONCE;
-
-    // If set to true, candidate pairs will be pinged in order of most likely
-    // to work (which means using a TURN server, generally), rather than in
-    // standard priority order.
-    bool prioritize_most_likely_ice_candidate_pairs = false;
-
-    struct cricket::MediaConfig media_config;
-
-    // This doesn't currently work. For a while we were working on adding QUIC
-    // data channel support to PeerConnection, but decided on a different
-    // approach, and that code hasn't been updated for a while.
-    bool enable_quic = false;
-
-    // If set to true, only one preferred TURN allocation will be used per
-    // network interface. UDP is preferred over TCP and IPv6 over IPv4. This
-    // can be used to cut down on the number of candidate pairings.
-    bool prune_turn_ports = false;
-
-    // If set to true, this means the ICE transport should presume TURN-to-TURN
-    // candidate pairs will succeed, even before a binding response is received.
-    // This can be used to optimize the initial connection time, since the DTLS
-    // handshake can begin immediately.
-    bool presume_writable_when_fully_relayed = false;
-
-    // If true, "renomination" will be added to the ice options in the transport
-    // description.
-    // See: https://tools.ietf.org/html/draft-thatcher-ice-renomination-00
-    bool enable_ice_renomination = false;
-
-    // If true, the ICE role is re-determined when the PeerConnection sets a
-    // local transport description that indicates an ICE restart.
-    //
-    // This is standard RFC5245 ICE behavior, but causes unnecessary role
-    // thrashing, so an application may wish to avoid it. This role
-    // re-determining was removed in ICEbis (ICE v2).
-    bool redetermine_role_on_ice_restart = true;
-
-    // If set, the min interval (max rate) at which we will send ICE checks
-    // (STUN pings), in milliseconds.
-    rtc::Optional<int> ice_check_min_interval;
-
-
-    // ICE Periodic Regathering
-    // If set, WebRTC will periodically create and propose candidates without
-    // starting a new ICE generation. The regathering happens continuously with
-    // interval specified in milliseconds by the uniform distribution [a, b].
-    rtc::Optional<rtc::IntervalRange> ice_regather_interval_range;
-
-    //
-    // Don't forget to update operator== if adding something.
-    //
-  };
-
-  // See: https://www.w3.org/TR/webrtc/#idl-def-rtcofferansweroptions
-  struct RTCOfferAnswerOptions {
-    static const int kUndefined = -1;
-    static const int kMaxOfferToReceiveMedia = 1;
-
-    // The default value for constraint offerToReceiveX:true.
-    static const int kOfferToReceiveMediaTrue = 1;
-
-    // These have been removed from the standard in favor of the "transceiver"
-    // API, but given that we don't support that API, we still have them here.
-    //
-    // offer_to_receive_X set to 1 will cause a media description to be
-    // generated in the offer, even if no tracks of that type have been added.
-    // Values greater than 1 are treated the same.
-    //
-    // If set to 0, the generated directional attribute will not include the
-    // "recv" direction (meaning it will be "sendonly" or "inactive".
-    int offer_to_receive_video = kUndefined;
-    int offer_to_receive_audio = kUndefined;
-
-    bool voice_activity_detection = true;
-    bool ice_restart = false;
-
-    // If true, will offer to BUNDLE audio/video/data together. Not to be
-    // confused with RTCP mux (multiplexing RTP and RTCP together).
-    bool use_rtp_mux = true;
-
-    RTCOfferAnswerOptions() = default;
-
-    RTCOfferAnswerOptions(int offer_to_receive_video,
-                          int offer_to_receive_audio,
-                          bool voice_activity_detection,
-                          bool ice_restart,
-                          bool use_rtp_mux)
-        : offer_to_receive_video(offer_to_receive_video),
-          offer_to_receive_audio(offer_to_receive_audio),
-          voice_activity_detection(voice_activity_detection),
-          ice_restart(ice_restart),
-          use_rtp_mux(use_rtp_mux) {}
-  };
-
-  // Used by GetStats to decide which stats to include in the stats reports.
-  // |kStatsOutputLevelStandard| includes the standard stats for Javascript API;
-  // |kStatsOutputLevelDebug| includes both the standard stats and additional
-  // stats for debugging purposes.
-  enum StatsOutputLevel {
-    kStatsOutputLevelStandard,
-    kStatsOutputLevelDebug,
-  };
-
-  // Accessor methods to active local streams.
-  virtual rtc::scoped_refptr<StreamCollectionInterface>
-      local_streams() = 0;
-
-  // Accessor methods to remote streams.
-  virtual rtc::scoped_refptr<StreamCollectionInterface>
-      remote_streams() = 0;
-
-  // Add a new MediaStream to be sent on this PeerConnection.
-  // Note that a SessionDescription negotiation is needed before the
-  // remote peer can receive the stream.
-  //
-  // This has been removed from the standard in favor of a track-based API. So,
-  // this is equivalent to simply calling AddTrack for each track within the
-  // stream, with the one difference that if "stream->AddTrack(...)" is called
-  // later, the PeerConnection will automatically pick up the new track. Though
-  // this functionality will be deprecated in the future.
-  virtual bool AddStream(MediaStreamInterface* stream) = 0;
-
-  // Remove a MediaStream from this PeerConnection.
-  // Note that a SessionDescription negotiation is needed before the
-  // remote peer is notified.
-  virtual void RemoveStream(MediaStreamInterface* stream) = 0;
-
-  // Add a new MediaStreamTrack to be sent on this PeerConnection, and return
-  // the newly created RtpSender.
-  //
-  // |streams| indicates which stream labels the track should be associated
-  // with.
-  virtual rtc::scoped_refptr<RtpSenderInterface> AddTrack(
-      MediaStreamTrackInterface* track,
-      std::vector<MediaStreamInterface*> streams) = 0;
-
-  // Remove an RtpSender from this PeerConnection.
-  // Returns true on success.
-  virtual bool RemoveTrack(RtpSenderInterface* sender) = 0;
-
-  // Returns pointer to a DtmfSender on success. Otherwise returns null.
-  //
-  // This API is no longer part of the standard; instead DtmfSenders are
-  // obtained from RtpSenders. Which is what the implementation does; it finds
-  // an RtpSender for |track| and just returns its DtmfSender.
-  virtual rtc::scoped_refptr<DtmfSenderInterface> CreateDtmfSender(
-      AudioTrackInterface* track) = 0;
-
-  // TODO(deadbeef): Make these pure virtual once all subclasses implement them.
-
-  // Creates a sender without a track. Can be used for "early media"/"warmup"
-  // use cases, where the application may want to negotiate video attributes
-  // before a track is available to send.
-  //
-  // The standard way to do this would be through "addTransceiver", but we
-  // don't support that API yet.
-  //
-  // |kind| must be "audio" or "video".
-  //
-  // |stream_id| is used to populate the msid attribute; if empty, one will
-  // be generated automatically.
-  virtual rtc::scoped_refptr<RtpSenderInterface> CreateSender(
-      const std::string& kind,
-      const std::string& stream_id) {
-    return rtc::scoped_refptr<RtpSenderInterface>();
-  }
-
-  // Get all RtpSenders, created either through AddStream, AddTrack, or
-  // CreateSender. Note that these are "Plan B SDP" RtpSenders, not "Unified
-  // Plan SDP" RtpSenders, which means that all senders of a specific media
-  // type share the same media description.
-  virtual std::vector<rtc::scoped_refptr<RtpSenderInterface>> GetSenders()
-      const {
-    return std::vector<rtc::scoped_refptr<RtpSenderInterface>>();
-  }
-
-  // Get all RtpReceivers, created when a remote description is applied.
-  // Note that these are "Plan B SDP" RtpReceivers, not "Unified Plan SDP"
-  // RtpReceivers, which means that all receivers of a specific media type
-  // share the same media description.
-  //
-  // It is also possible to have a media description with no associated
-  // RtpReceivers, if the directional attribute does not indicate that the
-  // remote peer is sending any media.
-  virtual std::vector<rtc::scoped_refptr<RtpReceiverInterface>> GetReceivers()
-      const {
-    return std::vector<rtc::scoped_refptr<RtpReceiverInterface>>();
-  }
-
-  virtual bool GetStats(StatsObserver* observer,
-                        MediaStreamTrackInterface* track,
-                        StatsOutputLevel level) = 0;
-  // Gets stats using the new stats collection API, see webrtc/api/stats/. These
-  // will replace old stats collection API when the new API has matured enough.
-  // TODO(hbos): Default implementation that does nothing only exists as to not
-  // break third party projects. As soon as they have been updated this should
-  // be changed to "= 0;".
-  virtual void GetStats(RTCStatsCollectorCallback* callback) {}
-
-  // Create a data channel with the provided config, or default config if none
-  // is provided. Note that an offer/answer negotiation is still necessary
-  // before the data channel can be used.
-  //
-  // Also, calling CreateDataChannel is the only way to get a data "m=" section
-  // in SDP, so it should be done before CreateOffer is called, if the
-  // application plans to use data channels.
-  virtual rtc::scoped_refptr<DataChannelInterface> CreateDataChannel(
-      const std::string& label,
-      const DataChannelInit* config) = 0;
-
-  // Returns the more recently applied description; "pending" if it exists, and
-  // otherwise "current". See below.
-  virtual const SessionDescriptionInterface* local_description() const = 0;
-  virtual const SessionDescriptionInterface* remote_description() const = 0;
-
-  // A "current" description the one currently negotiated from a complete
-  // offer/answer exchange.
-  virtual const SessionDescriptionInterface* current_local_description() const {
-    return nullptr;
-  }
-  virtual const SessionDescriptionInterface* current_remote_description()
-      const {
-    return nullptr;
-  }
-
-  // A "pending" description is one that's part of an incomplete offer/answer
-  // exchange (thus, either an offer or a pranswer). Once the offer/answer
-  // exchange is finished, the "pending" description will become "current".
-  virtual const SessionDescriptionInterface* pending_local_description() const {
-    return nullptr;
-  }
-  virtual const SessionDescriptionInterface* pending_remote_description()
-      const {
-    return nullptr;
-  }
-
-  // Create a new offer.
-  // The CreateSessionDescriptionObserver callback will be called when done.
-  virtual void CreateOffer(CreateSessionDescriptionObserver* observer,
-                           const MediaConstraintsInterface* constraints) {}
-
-  // TODO(jiayl): remove the default impl and the old interface when chromium
-  // code is updated.
-  virtual void CreateOffer(CreateSessionDescriptionObserver* observer,
-                           const RTCOfferAnswerOptions& options) {}
-
-  // Create an answer to an offer.
-  // The CreateSessionDescriptionObserver callback will be called when done.
-  virtual void CreateAnswer(CreateSessionDescriptionObserver* observer,
-                            const RTCOfferAnswerOptions& options) {}
-  // Deprecated - use version above.
-  // TODO(hta): Remove and remove default implementations when all callers
-  // are updated.
-  virtual void CreateAnswer(CreateSessionDescriptionObserver* observer,
-                            const MediaConstraintsInterface* constraints) {}
-
-  // Sets the local session description.
-  // The PeerConnection takes the ownership of |desc| even if it fails.
-  // The |observer| callback will be called when done.
-  // TODO(deadbeef): Change |desc| to be a unique_ptr, to make it clear
-  // that this method always takes ownership of it.
-  virtual void SetLocalDescription(SetSessionDescriptionObserver* observer,
-                                   SessionDescriptionInterface* desc) = 0;
-  // Sets the remote session description.
-  // The PeerConnection takes the ownership of |desc| even if it fails.
-  // The |observer| callback will be called when done.
-  virtual void SetRemoteDescription(SetSessionDescriptionObserver* observer,
-                                    SessionDescriptionInterface* desc) = 0;
-  // Deprecated; Replaced by SetConfiguration.
-  // TODO(deadbeef): Remove once Chrome is moved over to SetConfiguration.
-  virtual bool UpdateIce(const IceServers& configuration,
-                         const MediaConstraintsInterface* constraints) {
-    return false;
-  }
-  virtual bool UpdateIce(const IceServers& configuration) { return false; }
-
-  // TODO(deadbeef): Make this pure virtual once all Chrome subclasses of
-  // PeerConnectionInterface implement it.
-  virtual PeerConnectionInterface::RTCConfiguration GetConfiguration() {
-    return PeerConnectionInterface::RTCConfiguration();
-  }
-
-  // Sets the PeerConnection's global configuration to |config|.
-  //
-  // The members of |config| that may be changed are |type|, |servers|,
-  // |ice_candidate_pool_size| and |prune_turn_ports| (though the candidate
-  // pool size can't be changed after the first call to SetLocalDescription).
-  // Note that this means the BUNDLE and RTCP-multiplexing policies cannot be
-  // changed with this method.
-  //
-  // Any changes to STUN/TURN servers or ICE candidate policy will affect the
-  // next gathering phase, and cause the next call to createOffer to generate
-  // new ICE credentials, as described in JSEP. This also occurs when
-  // |prune_turn_ports| changes, for the same reasoning.
-  //
-  // If an error occurs, returns false and populates |error| if non-null:
-  // - INVALID_MODIFICATION if |config| contains a modified parameter other
-  //   than one of the parameters listed above.
-  // - INVALID_RANGE if |ice_candidate_pool_size| is out of range.
-  // - SYNTAX_ERROR if parsing an ICE server URL failed.
-  // - INVALID_PARAMETER if a TURN server is missing |username| or |password|.
-  // - INTERNAL_ERROR if an unexpected error occurred.
-  //
-  // TODO(deadbeef): Make this pure virtual once all Chrome subclasses of
-  // PeerConnectionInterface implement it.
-  virtual bool SetConfiguration(
-      const PeerConnectionInterface::RTCConfiguration& config,
-      RTCError* error) {
-    return false;
-  }
-  // Version without error output param for backwards compatibility.
-  // TODO(deadbeef): Remove once chromium is updated.
-  virtual bool SetConfiguration(
-      const PeerConnectionInterface::RTCConfiguration& config) {
-    return false;
-  }
-
-  // Provides a remote candidate to the ICE Agent.
-  // A copy of the |candidate| will be created and added to the remote
-  // description. So the caller of this method still has the ownership of the
-  // |candidate|.
-  virtual bool AddIceCandidate(const IceCandidateInterface* candidate) = 0;
-
-  // Removes a group of remote candidates from the ICE agent. Needed mainly for
-  // continual gathering, to avoid an ever-growing list of candidates as
-  // networks come and go.
-  virtual bool RemoveIceCandidates(
-      const std::vector<cricket::Candidate>& candidates) {
-    return false;
-  }
-
-  // Register a metric observer (used by chromium).
-  //
-  // There can only be one observer at a time. Before the observer is
-  // destroyed, RegisterUMAOberver(nullptr) should be called.
-  virtual void RegisterUMAObserver(UMAObserver* observer) = 0;
-
-  // 0 <= min <= current <= max should hold for set parameters.
-  struct BitrateParameters {
-    rtc::Optional<int> min_bitrate_bps;
-    rtc::Optional<int> current_bitrate_bps;
-    rtc::Optional<int> max_bitrate_bps;
-  };
-
-  // SetBitrate limits the bandwidth allocated for all RTP streams sent by
-  // this PeerConnection. Other limitations might affect these limits and
-  // are respected (for example "b=AS" in SDP).
-  //
-  // Setting |current_bitrate_bps| will reset the current bitrate estimate
-  // to the provided value.
-  virtual RTCError SetBitrate(const BitrateParameters& bitrate) = 0;
-
-  // Returns the current SignalingState.
-  virtual SignalingState signaling_state() = 0;
-  virtual IceConnectionState ice_connection_state() = 0;
-  virtual IceGatheringState ice_gathering_state() = 0;
-
-  // Starts RtcEventLog using existing file. Takes ownership of |file| and
-  // passes it on to Call, which will take the ownership. If the
-  // operation fails the file will be closed. The logging will stop
-  // automatically after 10 minutes have passed, or when the StopRtcEventLog
-  // function is called.
-  // TODO(ivoc): Make this pure virtual when Chrome is updated.
-  virtual bool StartRtcEventLog(rtc::PlatformFile file,
-                                int64_t max_size_bytes) {
-    return false;
-  }
-
-  // Stops logging the RtcEventLog.
-  // TODO(ivoc): Make this pure virtual when Chrome is updated.
-  virtual void StopRtcEventLog() {}
-
-  // Terminates all media, closes the transports, and in general releases any
-  // resources used by the PeerConnection. This is an irreversible operation.
-  //
-  // Note that after this method completes, the PeerConnection will no longer
-  // use the PeerConnectionObserver interface passed in on construction, and
-  // thus the observer object can be safely destroyed.
-  virtual void Close() = 0;
-
- protected:
-  // Dtor protected as objects shouldn't be deleted via this interface.
-  ~PeerConnectionInterface() {}
-};
-
-// PeerConnection callback interface, used for RTCPeerConnection events.
-// Application should implement these methods.
-class PeerConnectionObserver {
- public:
-  enum StateType {
-    kSignalingState,
-    kIceState,
-  };
-
-  // Triggered when the SignalingState changed.
-  virtual void OnSignalingChange(
-      PeerConnectionInterface::SignalingState new_state) = 0;
-
-  // TODO(deadbeef): Once all subclasses override the scoped_refptr versions
-  // of the below three methods, make them pure virtual and remove the raw
-  // pointer version.
-
-  // Triggered when media is received on a new stream from remote peer.
-  virtual void OnAddStream(rtc::scoped_refptr<MediaStreamInterface> stream) = 0;
-
-  // Triggered when a remote peer close a stream.
-  virtual void OnRemoveStream(
-      rtc::scoped_refptr<MediaStreamInterface> stream) = 0;
-
-  // Triggered when a remote peer opens a data channel.
-  virtual void OnDataChannel(
-      rtc::scoped_refptr<DataChannelInterface> data_channel) = 0;
-
-  // Triggered when renegotiation is needed. For example, an ICE restart
-  // has begun.
-  virtual void OnRenegotiationNeeded() = 0;
-
-  // Called any time the IceConnectionState changes.
-  //
-  // Note that our ICE states lag behind the standard slightly. The most
-  // notable differences include the fact that "failed" occurs after 15
-  // seconds, not 30, and this actually represents a combination ICE + DTLS
-  // state, so it may be "failed" if DTLS fails while ICE succeeds.
-  virtual void OnIceConnectionChange(
-      PeerConnectionInterface::IceConnectionState new_state) = 0;
-
-  // Called any time the IceGatheringState changes.
-  virtual void OnIceGatheringChange(
-      PeerConnectionInterface::IceGatheringState new_state) = 0;
-
-  // A new ICE candidate has been gathered.
-  virtual void OnIceCandidate(const IceCandidateInterface* candidate) = 0;
-
-  // Ice candidates have been removed.
-  // TODO(honghaiz): Make this a pure virtual method when all its subclasses
-  // implement it.
-  virtual void OnIceCandidatesRemoved(
-      const std::vector<cricket::Candidate>& candidates) {}
-
-  // Called when the ICE connection receiving status changes.
-  virtual void OnIceConnectionReceivingChange(bool receiving) {}
-
-  // Called when a track is added to streams.
-  // TODO(zhihuang) Make this a pure virtual method when all its subclasses
-  // implement it.
-  virtual void OnAddTrack(
-      rtc::scoped_refptr<RtpReceiverInterface> receiver,
-      const std::vector<rtc::scoped_refptr<MediaStreamInterface>>& streams) {}
-
- protected:
-  // Dtor protected as objects shouldn't be deleted via this interface.
-  ~PeerConnectionObserver() {}
-};
-
-// PeerConnectionFactoryInterface is the factory interface used for creating
-// PeerConnection, MediaStream and MediaStreamTrack objects.
-//
-// The simplest method for obtaiing one, CreatePeerConnectionFactory will
-// create the required libjingle threads, socket and network manager factory
-// classes for networking if none are provided, though it requires that the
-// application runs a message loop on the thread that called the method (see
-// explanation below)
-//
-// If an application decides to provide its own threads and/or implementation
-// of networking classes, it should use the alternate
-// CreatePeerConnectionFactory method which accepts threads as input, and use
-// the CreatePeerConnection version that takes a PortAllocator as an argument.
-class PeerConnectionFactoryInterface : public rtc::RefCountInterface {
- public:
-  class Options {
-   public:
-    Options() : crypto_options(rtc::CryptoOptions::NoGcm()) {}
-
-    // If set to true, created PeerConnections won't enforce any SRTP
-    // requirement, allowing unsecured media. Should only be used for
-    // testing/debugging.
-    bool disable_encryption = false;
-
-    // Deprecated. The only effect of setting this to true is that
-    // CreateDataChannel will fail, which is not that useful.
-    bool disable_sctp_data_channels = false;
-
-    // If set to true, any platform-supported network monitoring capability
-    // won't be used, and instead networks will only be updated via polling.
-    //
-    // This only has an effect if a PeerConnection is created with the default
-    // PortAllocator implementation.
-    bool disable_network_monitor = false;
-
-    // Sets the network types to ignore. For instance, calling this with
-    // ADAPTER_TYPE_ETHERNET | ADAPTER_TYPE_LOOPBACK will ignore Ethernet and
-    // loopback interfaces.
-    int network_ignore_mask = rtc::kDefaultNetworkIgnoreMask;
-
-    // Sets the maximum supported protocol version. The highest version
-    // supported by both ends will be used for the connection, i.e. if one
-    // party supports DTLS 1.0 and the other DTLS 1.2, DTLS 1.0 will be used.
-    rtc::SSLProtocolVersion ssl_max_version = rtc::SSL_PROTOCOL_DTLS_12;
-
-    // Sets crypto related options, e.g. enabled cipher suites.
-    rtc::CryptoOptions crypto_options;
-  };
-
-  // Set the options to be used for subsequently created PeerConnections.
-  virtual void SetOptions(const Options& options) = 0;
-
-  // |allocator| and |cert_generator| may be null, in which case default
-  // implementations will be used.
-  //
-  // |observer| must not be null.
-  //
-  // Note that this method does not take ownership of |observer|; it's the
-  // responsibility of the caller to delete it. It can be safely deleted after
-  // Close has been called on the returned PeerConnection, which ensures no
-  // more observer callbacks will be invoked.
-  virtual rtc::scoped_refptr<PeerConnectionInterface> CreatePeerConnection(
-      const PeerConnectionInterface::RTCConfiguration& configuration,
-      std::unique_ptr<cricket::PortAllocator> allocator,
-      std::unique_ptr<rtc::RTCCertificateGeneratorInterface> cert_generator,
-      PeerConnectionObserver* observer) = 0;
-
-  // Deprecated; should use RTCConfiguration for everything that previously
-  // used constraints.
-  virtual rtc::scoped_refptr<PeerConnectionInterface> CreatePeerConnection(
-      const PeerConnectionInterface::RTCConfiguration& configuration,
-      const MediaConstraintsInterface* constraints,
-      std::unique_ptr<cricket::PortAllocator> allocator,
-      std::unique_ptr<rtc::RTCCertificateGeneratorInterface> cert_generator,
-      PeerConnectionObserver* observer) = 0;
-
-  virtual rtc::scoped_refptr<MediaStreamInterface>
-      CreateLocalMediaStream(const std::string& label) = 0;
-
-  // Creates an AudioSourceInterface.
-  // |options| decides audio processing settings.
-  virtual rtc::scoped_refptr<AudioSourceInterface> CreateAudioSource(
-      const cricket::AudioOptions& options) = 0;
-  // Deprecated - use version above.
-  // Can use CopyConstraintsIntoAudioOptions to bridge the gap.
-  virtual rtc::scoped_refptr<AudioSourceInterface> CreateAudioSource(
-      const MediaConstraintsInterface* constraints) = 0;
-
-  // Creates a VideoTrackSourceInterface from |capturer|.
-  // TODO(deadbeef): We should aim to remove cricket::VideoCapturer from the
-  // API. It's mainly used as a wrapper around webrtc's provided
-  // platform-specific capturers, but these should be refactored to use
-  // VideoTrackSourceInterface directly.
-  // TODO(deadbeef): Make pure virtual once downstream mock PC factory classes
-  // are updated.
-  virtual rtc::scoped_refptr<VideoTrackSourceInterface> CreateVideoSource(
-      std::unique_ptr<cricket::VideoCapturer> capturer) {
-    return nullptr;
-  }
-
-  // A video source creator that allows selection of resolution and frame rate.
-  // |constraints| decides video resolution and frame rate but can be null.
-  // In the null case, use the version above.
-  //
-  // |constraints| is only used for the invocation of this method, and can
-  // safely be destroyed afterwards.
-  virtual rtc::scoped_refptr<VideoTrackSourceInterface> CreateVideoSource(
-      std::unique_ptr<cricket::VideoCapturer> capturer,
-      const MediaConstraintsInterface* constraints) {
-    return nullptr;
-  }
-
-  // Deprecated; please use the versions that take unique_ptrs above.
-  // TODO(deadbeef): Remove these once safe to do so.
-  virtual rtc::scoped_refptr<VideoTrackSourceInterface> CreateVideoSource(
-      cricket::VideoCapturer* capturer) {
-    return CreateVideoSource(std::unique_ptr<cricket::VideoCapturer>(capturer));
-  }
-  virtual rtc::scoped_refptr<VideoTrackSourceInterface> CreateVideoSource(
-      cricket::VideoCapturer* capturer,
-      const MediaConstraintsInterface* constraints) {
-    return CreateVideoSource(std::unique_ptr<cricket::VideoCapturer>(capturer),
-                             constraints);
-  }
-
-  // Creates a new local VideoTrack. The same |source| can be used in several
-  // tracks.
-  virtual rtc::scoped_refptr<VideoTrackInterface> CreateVideoTrack(
-      const std::string& label,
-      VideoTrackSourceInterface* source) = 0;
-
-  // Creates an new AudioTrack. At the moment |source| can be null.
-  virtual rtc::scoped_refptr<AudioTrackInterface>
-      CreateAudioTrack(const std::string& label,
-                       AudioSourceInterface* source) = 0;
-
-  // Starts AEC dump using existing file. Takes ownership of |file| and passes
-  // it on to VoiceEngine (via other objects) immediately, which will take
-  // the ownerhip. If the operation fails, the file will be closed.
-  // A maximum file size in bytes can be specified. When the file size limit is
-  // reached, logging is stopped automatically. If max_size_bytes is set to a
-  // value <= 0, no limit will be used, and logging will continue until the
-  // StopAecDump function is called.
-  virtual bool StartAecDump(rtc::PlatformFile file, int64_t max_size_bytes) = 0;
-
-  // Stops logging the AEC dump.
-  virtual void StopAecDump() = 0;
-
-  // This function is deprecated and will be removed when Chrome is updated to
-  // use the equivalent function on PeerConnectionInterface.
-  // TODO(ivoc) Remove after Chrome is updated.
-  virtual bool StartRtcEventLog(rtc::PlatformFile file,
-                                int64_t max_size_bytes) = 0;
-  // This function is deprecated and will be removed when Chrome is updated to
-  // use the equivalent function on PeerConnectionInterface.
-  // TODO(ivoc) Remove after Chrome is updated.
-  virtual bool StartRtcEventLog(rtc::PlatformFile file) = 0;
-
-  // This function is deprecated and will be removed when Chrome is updated to
-  // use the equivalent function on PeerConnectionInterface.
-  // TODO(ivoc) Remove after Chrome is updated.
-  virtual void StopRtcEventLog() = 0;
-
- protected:
-  // Dtor and ctor protected as objects shouldn't be created or deleted via
-  // this interface.
-  PeerConnectionFactoryInterface() {}
-  ~PeerConnectionFactoryInterface() {} // NOLINT
-};
-
-// Create a new instance of PeerConnectionFactoryInterface.
-//
-// This method relies on the thread it's called on as the "signaling thread"
-// for the PeerConnectionFactory it creates.
-//
-// As such, if the current thread is not already running an rtc::Thread message
-// loop, an application using this method must eventually either call
-// rtc::Thread::Current()->Run(), or call
-// rtc::Thread::Current()->ProcessMessages() within the application's own
-// message loop.
-rtc::scoped_refptr<PeerConnectionFactoryInterface> CreatePeerConnectionFactory(
-    rtc::scoped_refptr<AudioEncoderFactory> audio_encoder_factory,
-    rtc::scoped_refptr<AudioDecoderFactory> audio_decoder_factory);
-
-// Deprecated variant of the above.
-// TODO(kwiberg): Remove.
-rtc::scoped_refptr<PeerConnectionFactoryInterface>
-CreatePeerConnectionFactory();
-
-// Create a new instance of PeerConnectionFactoryInterface.
-//
-// |network_thread|, |worker_thread| and |signaling_thread| are
-// the only mandatory parameters.
-//
-// If non-null, a reference is added to |default_adm|, and ownership of
-// |video_encoder_factory| and |video_decoder_factory| is transferred to the
-// returned factory.
-// TODO(deadbeef): Use rtc::scoped_refptr<> and std::unique_ptr<> to make this
-// ownership transfer and ref counting more obvious.
-rtc::scoped_refptr<PeerConnectionFactoryInterface> CreatePeerConnectionFactory(
-    rtc::Thread* network_thread,
-    rtc::Thread* worker_thread,
-    rtc::Thread* signaling_thread,
-    AudioDeviceModule* default_adm,
-    rtc::scoped_refptr<AudioEncoderFactory> audio_encoder_factory,
-    rtc::scoped_refptr<AudioDecoderFactory> audio_decoder_factory,
-    cricket::WebRtcVideoEncoderFactory* video_encoder_factory,
-    cricket::WebRtcVideoDecoderFactory* video_decoder_factory);
-
-// Deprecated variant of the above.
-// TODO(kwiberg): Remove.
-rtc::scoped_refptr<PeerConnectionFactoryInterface> CreatePeerConnectionFactory(
-    rtc::Thread* network_thread,
-    rtc::Thread* worker_thread,
-    rtc::Thread* signaling_thread,
-    AudioDeviceModule* default_adm,
-    cricket::WebRtcVideoEncoderFactory* encoder_factory,
-    cricket::WebRtcVideoDecoderFactory* decoder_factory);
-
-// Create a new instance of PeerConnectionFactoryInterface with optional
-// external audio mixed and audio processing modules.
-//
-// If |audio_mixer| is null, an internal audio mixer will be created and used.
-// If |audio_processing| is null, an internal audio processing module will be
-// created and used.
-rtc::scoped_refptr<PeerConnectionFactoryInterface> CreatePeerConnectionFactory(
-    rtc::Thread* network_thread,
-    rtc::Thread* worker_thread,
-    rtc::Thread* signaling_thread,
-    AudioDeviceModule* default_adm,
-    rtc::scoped_refptr<AudioEncoderFactory> audio_encoder_factory,
-    rtc::scoped_refptr<AudioDecoderFactory> audio_decoder_factory,
-    cricket::WebRtcVideoEncoderFactory* video_encoder_factory,
-    cricket::WebRtcVideoDecoderFactory* video_decoder_factory,
-    rtc::scoped_refptr<AudioMixer> audio_mixer,
-    rtc::scoped_refptr<AudioProcessing> audio_processing);
-
-// Create a new instance of PeerConnectionFactoryInterface with external audio
-// mixer.
-//
-// If |audio_mixer| is null, an internal audio mixer will be created and used.
-rtc::scoped_refptr<PeerConnectionFactoryInterface>
-CreatePeerConnectionFactoryWithAudioMixer(
-    rtc::Thread* network_thread,
-    rtc::Thread* worker_thread,
-    rtc::Thread* signaling_thread,
-    AudioDeviceModule* default_adm,
-    rtc::scoped_refptr<AudioEncoderFactory> audio_encoder_factory,
-    rtc::scoped_refptr<AudioDecoderFactory> audio_decoder_factory,
-    cricket::WebRtcVideoEncoderFactory* video_encoder_factory,
-    cricket::WebRtcVideoDecoderFactory* video_decoder_factory,
-    rtc::scoped_refptr<AudioMixer> audio_mixer);
-
-// Deprecated variant of the above.
-// TODO(kwiberg): Remove.
-rtc::scoped_refptr<PeerConnectionFactoryInterface>
-CreatePeerConnectionFactoryWithAudioMixer(
-    rtc::Thread* network_thread,
-    rtc::Thread* worker_thread,
-    rtc::Thread* signaling_thread,
-    AudioDeviceModule* default_adm,
-    cricket::WebRtcVideoEncoderFactory* encoder_factory,
-    cricket::WebRtcVideoDecoderFactory* decoder_factory,
-    rtc::scoped_refptr<AudioMixer> audio_mixer);
-
-// Create a new instance of PeerConnectionFactoryInterface.
-// Same thread is used as worker and network thread.
-inline rtc::scoped_refptr<PeerConnectionFactoryInterface>
-CreatePeerConnectionFactory(
-    rtc::Thread* worker_and_network_thread,
-    rtc::Thread* signaling_thread,
-    AudioDeviceModule* default_adm,
-    rtc::scoped_refptr<AudioEncoderFactory> audio_encoder_factory,
-    rtc::scoped_refptr<AudioDecoderFactory> audio_decoder_factory,
-    cricket::WebRtcVideoEncoderFactory* video_encoder_factory,
-    cricket::WebRtcVideoDecoderFactory* video_decoder_factory) {
-  return CreatePeerConnectionFactory(
-      worker_and_network_thread, worker_and_network_thread, signaling_thread,
-      default_adm, audio_encoder_factory, audio_decoder_factory,
-      video_encoder_factory, video_decoder_factory);
-}
-
-// Deprecated variant of the above.
-// TODO(kwiberg): Remove.
-inline rtc::scoped_refptr<PeerConnectionFactoryInterface>
-CreatePeerConnectionFactory(
-    rtc::Thread* worker_and_network_thread,
-    rtc::Thread* signaling_thread,
-    AudioDeviceModule* default_adm,
-    cricket::WebRtcVideoEncoderFactory* encoder_factory,
-    cricket::WebRtcVideoDecoderFactory* decoder_factory) {
-  return CreatePeerConnectionFactory(
-      worker_and_network_thread, worker_and_network_thread, signaling_thread,
-      default_adm, encoder_factory, decoder_factory);
-}
-
-// This is a lower-level version of the CreatePeerConnectionFactory functions
-// above. It's implemented in the "peerconnection" build target, whereas the
-// above methods are only implemented in the broader "libjingle_peerconnection"
-// build target, which pulls in the implementations of every module webrtc may
-// use.
-//
-// If an application knows it will only require certain modules, it can reduce
-// webrtc's impact on its binary size by depending only on the "peerconnection"
-// target and the modules the application requires, using
-// CreateModularPeerConnectionFactory instead of one of the
-// CreatePeerConnectionFactory methods above. For example, if an application
-// only uses WebRTC for audio, it can pass in null pointers for the
-// video-specific interfaces, and omit the corresponding modules from its
-// build.
-//
-// If |network_thread| or |worker_thread| are null, the PeerConnectionFactory
-// will create the necessary thread internally. If |signaling_thread| is null,
-// the PeerConnectionFactory will use the thread on which this method is called
-// as the signaling thread, wrapping it in an rtc::Thread object if needed.
-//
-// If non-null, a reference is added to |default_adm|, and ownership of
-// |video_encoder_factory| and |video_decoder_factory| is transferred to the
-// returned factory.
-//
-// If |audio_mixer| is null, an internal audio mixer will be created and used.
-//
-// TODO(deadbeef): Use rtc::scoped_refptr<> and std::unique_ptr<> to make this
-// ownership transfer and ref counting more obvious.
-//
-// TODO(deadbeef): Encapsulate these modules in a struct, so that when a new
-// module is inevitably exposed, we can just add a field to the struct instead
-// of adding a whole new CreateModularPeerConnectionFactory overload.
-rtc::scoped_refptr<PeerConnectionFactoryInterface>
-CreateModularPeerConnectionFactory(
-    rtc::Thread* network_thread,
-    rtc::Thread* worker_thread,
-    rtc::Thread* signaling_thread,
-    AudioDeviceModule* default_adm,
-    rtc::scoped_refptr<AudioEncoderFactory> audio_encoder_factory,
-    rtc::scoped_refptr<AudioDecoderFactory> audio_decoder_factory,
-    cricket::WebRtcVideoEncoderFactory* video_encoder_factory,
-    cricket::WebRtcVideoDecoderFactory* video_decoder_factory,
-    rtc::scoped_refptr<AudioMixer> audio_mixer,
-    std::unique_ptr<cricket::MediaEngineInterface> media_engine,
-    std::unique_ptr<CallFactoryInterface> call_factory,
-    std::unique_ptr<RtcEventLogFactoryInterface> event_log_factory);
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_API_PEERCONNECTIONINTERFACE_H_
diff --git a/api/peerconnectionproxy.h b/api/peerconnectionproxy.h
deleted file mode 100644
index c68bee6..0000000
--- a/api/peerconnectionproxy.h
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- *  Copyright 2012 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_API_PEERCONNECTIONPROXY_H_
-#define WEBRTC_API_PEERCONNECTIONPROXY_H_
-
-#include <string>
-#include <vector>
-
-#include "webrtc/api/peerconnectioninterface.h"
-#include "webrtc/api/proxy.h"
-
-namespace webrtc {
-
-// TODO(deadbeef): Move this to .cc file and out of api/. What threads methods
-// are called on is an implementation detail.
-BEGIN_SIGNALING_PROXY_MAP(PeerConnection)
-  PROXY_SIGNALING_THREAD_DESTRUCTOR()
-  PROXY_METHOD0(rtc::scoped_refptr<StreamCollectionInterface>, local_streams)
-  PROXY_METHOD0(rtc::scoped_refptr<StreamCollectionInterface>, remote_streams)
-  PROXY_METHOD1(bool, AddStream, MediaStreamInterface*)
-  PROXY_METHOD1(void, RemoveStream, MediaStreamInterface*)
-  PROXY_METHOD2(rtc::scoped_refptr<RtpSenderInterface>,
-                AddTrack,
-                MediaStreamTrackInterface*,
-                std::vector<MediaStreamInterface*>)
-  PROXY_METHOD1(bool, RemoveTrack, RtpSenderInterface*)
-  PROXY_METHOD1(rtc::scoped_refptr<DtmfSenderInterface>,
-                CreateDtmfSender,
-                AudioTrackInterface*)
-  PROXY_METHOD2(rtc::scoped_refptr<RtpSenderInterface>,
-                CreateSender,
-                const std::string&,
-                const std::string&)
-  PROXY_CONSTMETHOD0(std::vector<rtc::scoped_refptr<RtpSenderInterface>>,
-                     GetSenders)
-  PROXY_CONSTMETHOD0(std::vector<rtc::scoped_refptr<RtpReceiverInterface>>,
-                     GetReceivers)
-  PROXY_METHOD3(bool,
-                GetStats,
-                StatsObserver*,
-                MediaStreamTrackInterface*,
-                StatsOutputLevel)
-  PROXY_METHOD1(void, GetStats, RTCStatsCollectorCallback*)
-  PROXY_METHOD2(rtc::scoped_refptr<DataChannelInterface>,
-                CreateDataChannel,
-                const std::string&,
-                const DataChannelInit*)
-  PROXY_CONSTMETHOD0(const SessionDescriptionInterface*, local_description)
-  PROXY_CONSTMETHOD0(const SessionDescriptionInterface*, remote_description)
-  PROXY_CONSTMETHOD0(const SessionDescriptionInterface*,
-                     pending_local_description)
-  PROXY_CONSTMETHOD0(const SessionDescriptionInterface*,
-                     pending_remote_description)
-  PROXY_CONSTMETHOD0(const SessionDescriptionInterface*,
-                     current_local_description)
-  PROXY_CONSTMETHOD0(const SessionDescriptionInterface*,
-                     current_remote_description)
-  PROXY_METHOD2(void,
-                CreateOffer,
-                CreateSessionDescriptionObserver*,
-                const MediaConstraintsInterface*)
-  PROXY_METHOD2(void,
-                CreateAnswer,
-                CreateSessionDescriptionObserver*,
-                const MediaConstraintsInterface*)
-  PROXY_METHOD2(void,
-                CreateOffer,
-                CreateSessionDescriptionObserver*,
-                const RTCOfferAnswerOptions&)
-  PROXY_METHOD2(void,
-                CreateAnswer,
-                CreateSessionDescriptionObserver*,
-                const RTCOfferAnswerOptions&)
-  PROXY_METHOD2(void,
-                SetLocalDescription,
-                SetSessionDescriptionObserver*,
-                SessionDescriptionInterface*)
-  PROXY_METHOD2(void,
-                SetRemoteDescription,
-                SetSessionDescriptionObserver*,
-                SessionDescriptionInterface*)
-  PROXY_METHOD0(PeerConnectionInterface::RTCConfiguration, GetConfiguration);
-  PROXY_METHOD2(bool,
-                SetConfiguration,
-                const PeerConnectionInterface::RTCConfiguration&,
-                RTCError*);
-  PROXY_METHOD1(bool,
-                SetConfiguration,
-                const PeerConnectionInterface::RTCConfiguration&);
-  PROXY_METHOD1(bool, AddIceCandidate, const IceCandidateInterface*)
-  PROXY_METHOD1(bool,
-                RemoveIceCandidates,
-                const std::vector<cricket::Candidate>&);
-  PROXY_METHOD1(void, RegisterUMAObserver, UMAObserver*)
-  PROXY_METHOD1(RTCError, SetBitrate, const BitrateParameters&);
-  PROXY_METHOD0(SignalingState, signaling_state)
-  PROXY_METHOD0(IceConnectionState, ice_connection_state)
-  PROXY_METHOD0(IceGatheringState, ice_gathering_state)
-  PROXY_METHOD2(bool, StartRtcEventLog, rtc::PlatformFile, int64_t)
-  PROXY_METHOD0(void, StopRtcEventLog)
-  PROXY_METHOD0(void, Close)
-END_PROXY_MAP()
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_API_PEERCONNECTIONPROXY_H_
diff --git a/api/proxy.h b/api/proxy.h
deleted file mode 100644
index 03b6ff7..0000000
--- a/api/proxy.h
+++ /dev/null
@@ -1,582 +0,0 @@
-/*
- *  Copyright 2013 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.
- */
-
-// This file contains Macros for creating proxies for webrtc MediaStream and
-// PeerConnection classes.
-// TODO(deadbeef): Move this to pc/; this is part of the implementation.
-
-//
-// Example usage:
-//
-// class TestInterface : public rtc::RefCountInterface {
-//  public:
-//   std::string FooA() = 0;
-//   std::string FooB(bool arg1) const = 0;
-//   std::string FooC(bool arg1) = 0;
-//  };
-//
-// Note that return types can not be a const reference.
-//
-// class Test : public TestInterface {
-// ... implementation of the interface.
-// };
-//
-// BEGIN_PROXY_MAP(Test)
-//   PROXY_SIGNALING_THREAD_DESTRUCTOR()
-//   PROXY_METHOD0(std::string, FooA)
-//   PROXY_CONSTMETHOD1(std::string, FooB, arg1)
-//   PROXY_WORKER_METHOD1(std::string, FooC, arg1)
-// END_PROXY_MAP()
-//
-// Where the destructor and first two methods are invoked on the signaling
-// thread, and the third is invoked on the worker thread.
-//
-// The proxy can be created using
-//
-//   TestProxy::Create(Thread* signaling_thread, Thread* worker_thread,
-//                     TestInterface*).
-//
-// The variant defined with BEGIN_SIGNALING_PROXY_MAP is unaware of
-// the worker thread, and invokes all methods on the signaling thread.
-//
-// The variant defined with BEGIN_OWNED_PROXY_MAP does not use
-// refcounting, and instead just takes ownership of the object being proxied.
-
-#ifndef WEBRTC_API_PROXY_H_
-#define WEBRTC_API_PROXY_H_
-
-#include <memory>
-#include <utility>
-
-#include "webrtc/rtc_base/event.h"
-#include "webrtc/rtc_base/thread.h"
-
-namespace webrtc {
-
-template <typename R>
-class ReturnType {
- public:
-  template<typename C, typename M>
-  void Invoke(C* c, M m) { r_ = (c->*m)(); }
-  template <typename C, typename M, typename T1>
-  void Invoke(C* c, M m, T1 a1) {
-    r_ = (c->*m)(std::move(a1));
-  }
-  template <typename C, typename M, typename T1, typename T2>
-  void Invoke(C* c, M m, T1 a1, T2 a2) {
-    r_ = (c->*m)(std::move(a1), std::move(a2));
-  }
-  template <typename C, typename M, typename T1, typename T2, typename T3>
-  void Invoke(C* c, M m, T1 a1, T2 a2, T3 a3) {
-    r_ = (c->*m)(std::move(a1), std::move(a2), std::move(a3));
-  }
-  template<typename C, typename M, typename T1, typename T2, typename T3,
-      typename T4>
-  void Invoke(C* c, M m, T1 a1, T2 a2, T3 a3, T4 a4) {
-    r_ = (c->*m)(std::move(a1), std::move(a2), std::move(a3), std::move(a4));
-  }
-  template<typename C, typename M, typename T1, typename T2, typename T3,
-     typename T4, typename T5>
-  void Invoke(C* c, M m, T1 a1, T2 a2, T3 a3, T4 a4, T5 a5) {
-    r_ = (c->*m)(std::move(a1), std::move(a2), std::move(a3), std::move(a4),
-                 std::move(a5));
-  }
-
-  R moved_result() { return std::move(r_); }
-
- private:
-  R r_;
-};
-
-template <>
-class ReturnType<void> {
- public:
-  template<typename C, typename M>
-  void Invoke(C* c, M m) { (c->*m)(); }
-  template <typename C, typename M, typename T1>
-  void Invoke(C* c, M m, T1 a1) {
-    (c->*m)(std::move(a1));
-  }
-  template <typename C, typename M, typename T1, typename T2>
-  void Invoke(C* c, M m, T1 a1, T2 a2) {
-    (c->*m)(std::move(a1), std::move(a2));
-  }
-  template <typename C, typename M, typename T1, typename T2, typename T3>
-  void Invoke(C* c, M m, T1 a1, T2 a2, T3 a3) {
-    (c->*m)(std::move(a1), std::move(a2), std::move(a3));
-  }
-
-  void moved_result() {}
-};
-
-namespace internal {
-
-class SynchronousMethodCall
-    : public rtc::MessageData,
-      public rtc::MessageHandler {
- public:
-  explicit SynchronousMethodCall(rtc::MessageHandler* proxy)
-      : e_(), proxy_(proxy) {}
-  ~SynchronousMethodCall() {}
-
-  void Invoke(const rtc::Location& posted_from, rtc::Thread* t) {
-    if (t->IsCurrent()) {
-      proxy_->OnMessage(nullptr);
-    } else {
-      e_.reset(new rtc::Event(false, false));
-      t->Post(posted_from, this, 0);
-      e_->Wait(rtc::Event::kForever);
-    }
-  }
-
- private:
-  void OnMessage(rtc::Message*) {
-    proxy_->OnMessage(nullptr);
-    e_->Set();
-  }
-  std::unique_ptr<rtc::Event> e_;
-  rtc::MessageHandler* proxy_;
-};
-
-}  // namespace internal
-
-template <typename C, typename R>
-class MethodCall0 : public rtc::Message,
-                    public rtc::MessageHandler {
- public:
-  typedef R (C::*Method)();
-  MethodCall0(C* c, Method m) : c_(c), m_(m) {}
-
-  R Marshal(const rtc::Location& posted_from, rtc::Thread* t) {
-    internal::SynchronousMethodCall(this).Invoke(posted_from, t);
-    return r_.moved_result();
-  }
-
- private:
-  void OnMessage(rtc::Message*) {  r_.Invoke(c_, m_); }
-
-  C* c_;
-  Method m_;
-  ReturnType<R> r_;
-};
-
-template <typename C, typename R>
-class ConstMethodCall0 : public rtc::Message,
-                         public rtc::MessageHandler {
- public:
-  typedef R (C::*Method)() const;
-  ConstMethodCall0(C* c, Method m) : c_(c), m_(m) {}
-
-  R Marshal(const rtc::Location& posted_from, rtc::Thread* t) {
-    internal::SynchronousMethodCall(this).Invoke(posted_from, t);
-    return r_.moved_result();
-  }
-
- private:
-  void OnMessage(rtc::Message*) { r_.Invoke(c_, m_); }
-
-  C* c_;
-  Method m_;
-  ReturnType<R> r_;
-};
-
-template <typename C, typename R,  typename T1>
-class MethodCall1 : public rtc::Message,
-                    public rtc::MessageHandler {
- public:
-  typedef R (C::*Method)(T1 a1);
-  MethodCall1(C* c, Method m, T1 a1) : c_(c), m_(m), a1_(std::move(a1)) {}
-
-  R Marshal(const rtc::Location& posted_from, rtc::Thread* t) {
-    internal::SynchronousMethodCall(this).Invoke(posted_from, t);
-    return r_.moved_result();
-  }
-
- private:
-  void OnMessage(rtc::Message*) { r_.Invoke(c_, m_, std::move(a1_)); }
-
-  C* c_;
-  Method m_;
-  ReturnType<R> r_;
-  T1 a1_;
-};
-
-template <typename C, typename R,  typename T1>
-class ConstMethodCall1 : public rtc::Message,
-                         public rtc::MessageHandler {
- public:
-  typedef R (C::*Method)(T1 a1) const;
-  ConstMethodCall1(C* c, Method m, T1 a1) : c_(c), m_(m), a1_(std::move(a1)) {}
-
-  R Marshal(const rtc::Location& posted_from, rtc::Thread* t) {
-    internal::SynchronousMethodCall(this).Invoke(posted_from, t);
-    return r_.moved_result();
-  }
-
- private:
-  void OnMessage(rtc::Message*) { r_.Invoke(c_, m_, std::move(a1_)); }
-
-  C* c_;
-  Method m_;
-  ReturnType<R> r_;
-  T1 a1_;
-};
-
-template <typename C, typename R, typename T1, typename T2>
-class MethodCall2 : public rtc::Message,
-                    public rtc::MessageHandler {
- public:
-  typedef R (C::*Method)(T1 a1, T2 a2);
-  MethodCall2(C* c, Method m, T1 a1, T2 a2)
-      : c_(c), m_(m), a1_(std::move(a1)), a2_(std::move(a2)) {}
-
-  R Marshal(const rtc::Location& posted_from, rtc::Thread* t) {
-    internal::SynchronousMethodCall(this).Invoke(posted_from, t);
-    return r_.moved_result();
-  }
-
- private:
-  void OnMessage(rtc::Message*) {
-    r_.Invoke(c_, m_, std::move(a1_), std::move(a2_));
-  }
-
-  C* c_;
-  Method m_;
-  ReturnType<R> r_;
-  T1 a1_;
-  T2 a2_;
-};
-
-template <typename C, typename R, typename T1, typename T2, typename T3>
-class MethodCall3 : public rtc::Message,
-                    public rtc::MessageHandler {
- public:
-  typedef R (C::*Method)(T1 a1, T2 a2, T3 a3);
-  MethodCall3(C* c, Method m, T1 a1, T2 a2, T3 a3)
-      : c_(c),
-        m_(m),
-        a1_(std::move(a1)),
-        a2_(std::move(a2)),
-        a3_(std::move(a3)) {}
-
-  R Marshal(const rtc::Location& posted_from, rtc::Thread* t) {
-    internal::SynchronousMethodCall(this).Invoke(posted_from, t);
-    return r_.moved_result();
-  }
-
- private:
-  void OnMessage(rtc::Message*) {
-    r_.Invoke(c_, m_, std::move(a1_), std::move(a2_), std::move(a3_));
-  }
-
-  C* c_;
-  Method m_;
-  ReturnType<R> r_;
-  T1 a1_;
-  T2 a2_;
-  T3 a3_;
-};
-
-template <typename C, typename R, typename T1, typename T2, typename T3,
-    typename T4>
-class MethodCall4 : public rtc::Message,
-                    public rtc::MessageHandler {
- public:
-  typedef R (C::*Method)(T1 a1, T2 a2, T3 a3, T4 a4);
-  MethodCall4(C* c, Method m, T1 a1, T2 a2, T3 a3, T4 a4)
-      : c_(c),
-        m_(m),
-        a1_(std::move(a1)),
-        a2_(std::move(a2)),
-        a3_(std::move(a3)),
-        a4_(std::move(a4)) {}
-
-  R Marshal(const rtc::Location& posted_from, rtc::Thread* t) {
-    internal::SynchronousMethodCall(this).Invoke(posted_from, t);
-    return r_.moved_result();
-  }
-
- private:
-  void OnMessage(rtc::Message*) {
-    r_.Invoke(c_, m_, std::move(a1_), std::move(a2_), std::move(a3_),
-              std::move(a4_));
-  }
-
-  C* c_;
-  Method m_;
-  ReturnType<R> r_;
-  T1 a1_;
-  T2 a2_;
-  T3 a3_;
-  T4 a4_;
-};
-
-template <typename C, typename R, typename T1, typename T2, typename T3,
-    typename T4, typename T5>
-class MethodCall5 : public rtc::Message,
-                    public rtc::MessageHandler {
- public:
-  typedef R (C::*Method)(T1 a1, T2 a2, T3 a3, T4 a4, T5 a5);
-  MethodCall5(C* c, Method m, T1 a1, T2 a2, T3 a3, T4 a4, T5 a5)
-      : c_(c),
-        m_(m),
-        a1_(std::move(a1)),
-        a2_(std::move(a2)),
-        a3_(std::move(a3)),
-        a4_(std::move(a4)),
-        a5_(std::move(a5)) {}
-
-  R Marshal(const rtc::Location& posted_from, rtc::Thread* t) {
-    internal::SynchronousMethodCall(this).Invoke(posted_from, t);
-    return r_.moved_result();
-  }
-
- private:
-  void OnMessage(rtc::Message*) {
-    r_.Invoke(c_, m_, std::move(a1_), std::move(a2_), std::move(a3_),
-              std::move(a4_), std::move(a5_));
-  }
-
-  C* c_;
-  Method m_;
-  ReturnType<R> r_;
-  T1 a1_;
-  T2 a2_;
-  T3 a3_;
-  T4 a4_;
-  T5 a5_;
-};
-
-
-// Helper macros to reduce code duplication.
-#define PROXY_MAP_BOILERPLATE(c)                          \
-  template <class INTERNAL_CLASS>                         \
-  class c##ProxyWithInternal;                             \
-  typedef c##ProxyWithInternal<c##Interface> c##Proxy;    \
-  template <class INTERNAL_CLASS>                         \
-  class c##ProxyWithInternal : public c##Interface {      \
-   protected:                                             \
-    typedef c##Interface C;                               \
-                                                          \
-   public:                                                \
-    const INTERNAL_CLASS* internal() const { return c_; } \
-    INTERNAL_CLASS* internal() { return c_; }
-
-#define END_PROXY_MAP() \
-  };
-
-#define SIGNALING_PROXY_MAP_BOILERPLATE(c)                               \
- protected:                                                              \
-  c##ProxyWithInternal(rtc::Thread* signaling_thread, INTERNAL_CLASS* c) \
-      : signaling_thread_(signaling_thread), c_(c) {}                    \
-                                                                         \
- private:                                                                \
-  mutable rtc::Thread* signaling_thread_;
-
-#define WORKER_PROXY_MAP_BOILERPLATE(c)                               \
- protected:                                                           \
-  c##ProxyWithInternal(rtc::Thread* signaling_thread,                 \
-                       rtc::Thread* worker_thread, INTERNAL_CLASS* c) \
-      : signaling_thread_(signaling_thread),                          \
-        worker_thread_(worker_thread),                                \
-        c_(c) {}                                                      \
-                                                                      \
- private:                                                             \
-  mutable rtc::Thread* signaling_thread_;                             \
-  mutable rtc::Thread* worker_thread_;
-
-// Note that the destructor is protected so that the proxy can only be
-// destroyed via RefCountInterface.
-#define REFCOUNTED_PROXY_MAP_BOILERPLATE(c)            \
- protected:                                            \
-  ~c##ProxyWithInternal() {                            \
-    MethodCall0<c##ProxyWithInternal, void> call(      \
-        this, &c##ProxyWithInternal::DestroyInternal); \
-    call.Marshal(RTC_FROM_HERE, destructor_thread());  \
-  }                                                    \
-                                                       \
- private:                                              \
-  void DestroyInternal() { c_ = nullptr; }             \
-  rtc::scoped_refptr<INTERNAL_CLASS> c_;
-
-// Note: This doesn't use a unique_ptr, because it intends to handle a corner
-// case where an object's deletion triggers a callback that calls back into
-// this proxy object. If relying on a unique_ptr to delete the object, its
-// inner pointer would be set to null before this reentrant callback would have
-// a chance to run, resulting in a segfault.
-#define OWNED_PROXY_MAP_BOILERPLATE(c)                 \
- public:                                               \
-  ~c##ProxyWithInternal() {                            \
-    MethodCall0<c##ProxyWithInternal, void> call(      \
-        this, &c##ProxyWithInternal::DestroyInternal); \
-    call.Marshal(RTC_FROM_HERE, destructor_thread());  \
-  }                                                    \
-                                                       \
- private:                                              \
-  void DestroyInternal() { delete c_; }                \
-  INTERNAL_CLASS* c_;
-
-#define BEGIN_SIGNALING_PROXY_MAP(c)                                         \
-  PROXY_MAP_BOILERPLATE(c)                                                   \
-  SIGNALING_PROXY_MAP_BOILERPLATE(c)                                         \
-  REFCOUNTED_PROXY_MAP_BOILERPLATE(c)                                        \
- public:                                                                     \
-  static rtc::scoped_refptr<c##ProxyWithInternal> Create(                    \
-      rtc::Thread* signaling_thread, INTERNAL_CLASS* c) {                    \
-    return new rtc::RefCountedObject<c##ProxyWithInternal>(signaling_thread, \
-                                                           c);               \
-  }
-
-#define BEGIN_PROXY_MAP(c)                                                    \
-  PROXY_MAP_BOILERPLATE(c)                                                    \
-  WORKER_PROXY_MAP_BOILERPLATE(c)                                             \
-  REFCOUNTED_PROXY_MAP_BOILERPLATE(c)                                         \
- public:                                                                      \
-  static rtc::scoped_refptr<c##ProxyWithInternal> Create(                     \
-      rtc::Thread* signaling_thread, rtc::Thread* worker_thread,              \
-      INTERNAL_CLASS* c) {                                                    \
-    return new rtc::RefCountedObject<c##ProxyWithInternal>(signaling_thread,  \
-                                                           worker_thread, c); \
-  }
-
-#define BEGIN_OWNED_PROXY_MAP(c)                                   \
-  PROXY_MAP_BOILERPLATE(c)                                         \
-  WORKER_PROXY_MAP_BOILERPLATE(c)                                  \
-  OWNED_PROXY_MAP_BOILERPLATE(c)                                   \
- public:                                                           \
-  static std::unique_ptr<c##Interface> Create(                     \
-      rtc::Thread* signaling_thread, rtc::Thread* worker_thread,   \
-      std::unique_ptr<INTERNAL_CLASS> c) {                         \
-    return std::unique_ptr<c##Interface>(new c##ProxyWithInternal( \
-        signaling_thread, worker_thread, c.release()));            \
-  }
-
-#define PROXY_SIGNALING_THREAD_DESTRUCTOR()                            \
- private:                                                              \
-  rtc::Thread* destructor_thread() const { return signaling_thread_; } \
-                                                                       \
- public:  // NOLINTNEXTLINE
-
-#define PROXY_WORKER_THREAD_DESTRUCTOR()                            \
- private:                                                           \
-  rtc::Thread* destructor_thread() const { return worker_thread_; } \
-                                                                    \
- public:  // NOLINTNEXTLINE
-
-#define PROXY_METHOD0(r, method)                           \
-  r method() override {                                    \
-    MethodCall0<C, r> call(c_, &C::method);                \
-    return call.Marshal(RTC_FROM_HERE, signaling_thread_); \
-  }
-
-#define PROXY_CONSTMETHOD0(r, method)                      \
-  r method() const override {                              \
-    ConstMethodCall0<C, r> call(c_, &C::method);           \
-    return call.Marshal(RTC_FROM_HERE, signaling_thread_); \
-  }
-
-#define PROXY_METHOD1(r, method, t1)                           \
-  r method(t1 a1) override {                                   \
-    MethodCall1<C, r, t1> call(c_, &C::method, std::move(a1)); \
-    return call.Marshal(RTC_FROM_HERE, signaling_thread_);     \
-  }
-
-#define PROXY_CONSTMETHOD1(r, method, t1)                           \
-  r method(t1 a1) const override {                                  \
-    ConstMethodCall1<C, r, t1> call(c_, &C::method, std::move(a1)); \
-    return call.Marshal(RTC_FROM_HERE, signaling_thread_);          \
-  }
-
-#define PROXY_METHOD2(r, method, t1, t2)                          \
-  r method(t1 a1, t2 a2) override {                               \
-    MethodCall2<C, r, t1, t2> call(c_, &C::method, std::move(a1), \
-                                   std::move(a2));                \
-    return call.Marshal(RTC_FROM_HERE, signaling_thread_);        \
-  }
-
-#define PROXY_METHOD3(r, method, t1, t2, t3)                          \
-  r method(t1 a1, t2 a2, t3 a3) override {                            \
-    MethodCall3<C, r, t1, t2, t3> call(c_, &C::method, std::move(a1), \
-                                       std::move(a2), std::move(a3)); \
-    return call.Marshal(RTC_FROM_HERE, signaling_thread_);            \
-  }
-
-#define PROXY_METHOD4(r, method, t1, t2, t3, t4)                          \
-  r method(t1 a1, t2 a2, t3 a3, t4 a4) override {                         \
-    MethodCall4<C, r, t1, t2, t3, t4> call(c_, &C::method, std::move(a1), \
-                                           std::move(a2), std::move(a3),  \
-                                           std::move(a4));                \
-    return call.Marshal(RTC_FROM_HERE, signaling_thread_);                \
-  }
-
-#define PROXY_METHOD5(r, method, t1, t2, t3, t4, t5)                          \
-  r method(t1 a1, t2 a2, t3 a3, t4 a4, t5 a5) override {                      \
-    MethodCall5<C, r, t1, t2, t3, t4, t5> call(c_, &C::method, std::move(a1), \
-                                               std::move(a2), std::move(a3),  \
-                                               std::move(a4), std::move(a5)); \
-    return call.Marshal(RTC_FROM_HERE, signaling_thread_);                    \
-  }
-
-// Define methods which should be invoked on the worker thread.
-#define PROXY_WORKER_METHOD0(r, method)                 \
-  r method() override {                                 \
-    MethodCall0<C, r> call(c_, &C::method);             \
-    return call.Marshal(RTC_FROM_HERE, worker_thread_); \
-  }
-
-#define PROXY_WORKER_CONSTMETHOD0(r, method)            \
-  r method() const override {                           \
-    ConstMethodCall0<C, r> call(c_, &C::method);        \
-    return call.Marshal(RTC_FROM_HERE, worker_thread_); \
-  }
-
-#define PROXY_WORKER_METHOD1(r, method, t1)                    \
-  r method(t1 a1) override {                                   \
-    MethodCall1<C, r, t1> call(c_, &C::method, std::move(a1)); \
-    return call.Marshal(RTC_FROM_HERE, worker_thread_);        \
-  }
-
-#define PROXY_WORKER_CONSTMETHOD1(r, method, t1)                    \
-  r method(t1 a1) const override {                                  \
-    ConstMethodCall1<C, r, t1> call(c_, &C::method, std::move(a1)); \
-    return call.Marshal(RTC_FROM_HERE, worker_thread_);             \
-  }
-
-#define PROXY_WORKER_METHOD2(r, method, t1, t2)                   \
-  r method(t1 a1, t2 a2) override {                               \
-    MethodCall2<C, r, t1, t2> call(c_, &C::method, std::move(a1), \
-                                   std::move(a2));                \
-    return call.Marshal(RTC_FROM_HERE, worker_thread_);           \
-  }
-
-#define PROXY_WORKER_CONSTMETHOD2(r, method, t1, t2)                   \
-  r method(t1 a1, t2 a2) const override {                              \
-    ConstMethodCall2<C, r, t1, t2> call(c_, &C::method, std::move(a1), \
-                                        std::move(a2));                \
-    return call.Marshal(RTC_FROM_HERE, worker_thread_);                \
-  }
-
-#define PROXY_WORKER_METHOD3(r, method, t1, t2, t3)                   \
-  r method(t1 a1, t2 a2, t3 a3) override {                            \
-    MethodCall3<C, r, t1, t2, t3> call(c_, &C::method, std::move(a1), \
-                                       std::move(a2), std::move(a3)); \
-    return call.Marshal(RTC_FROM_HERE, worker_thread_);               \
-  }
-
-#define PROXY_WORKER_CONSTMETHOD3(r, method, t1, t2)                       \
-  r method(t1 a1, t2 a2, t3 a3) const override {                           \
-    ConstMethodCall3<C, r, t1, t2, t3> call(c_, &C::method, std::move(a1), \
-                                            std::move(a2), std::move(a3)); \
-    return call.Marshal(RTC_FROM_HERE, worker_thread_);                    \
-  }
-
-}  // namespace webrtc
-
-#endif  //  WEBRTC_API_PROXY_H_
diff --git a/api/rtcerror.cc b/api/rtcerror.cc
deleted file mode 100644
index f956484..0000000
--- a/api/rtcerror.cc
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- *  Copyright 2017 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/api/rtcerror.h"
-
-#include "webrtc/rtc_base/arraysize.h"
-
-namespace {
-
-static const char* const kRTCErrorTypeNames[] = {
-    "NONE",
-    "UNSUPPORTED_OPERATION",
-    "UNSUPPORTED_PARAMETER",
-    "INVALID_PARAMETER",
-    "INVALID_RANGE",
-    "SYNTAX_ERROR",
-    "INVALID_STATE",
-    "INVALID_MODIFICATION",
-    "NETWORK_ERROR",
-    "RESOURCE_EXHAUSTED",
-    "INTERNAL_ERROR",
-};
-static_assert(static_cast<int>(webrtc::RTCErrorType::INTERNAL_ERROR) ==
-                  (arraysize(kRTCErrorTypeNames) - 1),
-              "kRTCErrorTypeNames must have as many strings as RTCErrorType "
-              "has values.");
-
-}  // namespace
-
-namespace webrtc {
-
-RTCError::RTCError(RTCError&& other)
-    : type_(other.type_), have_string_message_(other.have_string_message_) {
-  if (have_string_message_) {
-    new (&string_message_) std::string(std::move(other.string_message_));
-  } else {
-    static_message_ = other.static_message_;
-  }
-}
-
-RTCError& RTCError::operator=(RTCError&& other) {
-  type_ = other.type_;
-  if (other.have_string_message_) {
-    set_message(std::move(other.string_message_));
-  } else {
-    set_message(other.static_message_);
-  }
-  return *this;
-}
-
-RTCError::~RTCError() {
-  // If we hold a message string that was built, rather than a static string,
-  // we need to delete it.
-  if (have_string_message_) {
-    string_message_.~basic_string();
-  }
-}
-
-// static
-RTCError RTCError::OK() {
-  return RTCError();
-}
-
-const char* RTCError::message() const {
-  if (have_string_message_) {
-    return string_message_.c_str();
-  } else {
-    return static_message_;
-  }
-}
-
-void RTCError::set_message(const char* message) {
-  if (have_string_message_) {
-    string_message_.~basic_string();
-    have_string_message_ = false;
-  }
-  static_message_ = message;
-}
-
-void RTCError::set_message(std::string&& message) {
-  if (!have_string_message_) {
-    new (&string_message_) std::string(std::move(message));
-    have_string_message_ = true;
-  } else {
-    string_message_ = message;
-  }
-}
-
-std::ostream& operator<<(std::ostream& stream, RTCErrorType error) {
-  int index = static_cast<int>(error);
-  return stream << kRTCErrorTypeNames[index];
-}
-
-}  // namespace webrtc
diff --git a/api/rtcerror.h b/api/rtcerror.h
deleted file mode 100644
index 7451fef..0000000
--- a/api/rtcerror.h
+++ /dev/null
@@ -1,300 +0,0 @@
-/*
- *  Copyright 2017 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_API_RTCERROR_H_
-#define WEBRTC_API_RTCERROR_H_
-
-#include <ostream>
-#include <string>
-#include <utility>  // For std::move.
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-
-namespace webrtc {
-
-// Enumeration to represent distinct classes of errors that an application
-// may wish to act upon differently. These roughly map to DOMExceptions or
-// RTCError "errorDetailEnum" values in the web API, as described in the
-// comments below.
-enum class RTCErrorType {
-  // No error.
-  NONE,
-
-  // An operation is valid, but currently unsupported.
-  // Maps to OperationError DOMException.
-  UNSUPPORTED_OPERATION,
-
-  // A supplied parameter is valid, but currently unsupported.
-  // Maps to OperationError DOMException.
-  UNSUPPORTED_PARAMETER,
-
-  // General error indicating that a supplied parameter is invalid.
-  // Maps to InvalidAccessError or TypeError DOMException depending on context.
-  INVALID_PARAMETER,
-
-  // Slightly more specific than INVALID_PARAMETER; a parameter's value was
-  // outside the allowed range.
-  // Maps to RangeError DOMException.
-  INVALID_RANGE,
-
-  // Slightly more specific than INVALID_PARAMETER; an error occurred while
-  // parsing string input.
-  // Maps to SyntaxError DOMException.
-  SYNTAX_ERROR,
-
-  // The object does not support this operation in its current state.
-  // Maps to InvalidStateError DOMException.
-  INVALID_STATE,
-
-  // An attempt was made to modify the object in an invalid way.
-  // Maps to InvalidModificationError DOMException.
-  INVALID_MODIFICATION,
-
-  // An error occurred within an underlying network protocol.
-  // Maps to NetworkError DOMException.
-  NETWORK_ERROR,
-
-  // Some resource has been exhausted; file handles, hardware resources, ports,
-  // etc.
-  // Maps to OperationError DOMException.
-  RESOURCE_EXHAUSTED,
-
-  // The operation failed due to an internal error.
-  // Maps to OperationError DOMException.
-  INTERNAL_ERROR,
-};
-
-// Roughly corresponds to RTCError in the web api. Holds an error type, a
-// message, and possibly additional information specific to that error.
-//
-// Doesn't contain anything beyond a type and message now, but will in the
-// future as more errors are implemented.
-class RTCError {
- public:
-  // Constructors.
-
-  // Creates a "no error" error.
-  RTCError() {}
-  explicit RTCError(RTCErrorType type) : type_(type) {}
-  // For performance, prefer using the constructor that takes a const char* if
-  // the message is a static string.
-  RTCError(RTCErrorType type, const char* message)
-      : type_(type), static_message_(message), have_string_message_(false) {}
-  RTCError(RTCErrorType type, std::string&& message)
-      : type_(type), string_message_(message), have_string_message_(true) {}
-
-  // Delete the copy constructor and assignment operator; there aren't any use
-  // cases where you should need to copy an RTCError, as opposed to moving it.
-  // Can revisit this decision if use cases arise in the future.
-  RTCError(const RTCError& other) = delete;
-  RTCError& operator=(const RTCError& other) = delete;
-
-  // Move constructor and move-assignment operator.
-  RTCError(RTCError&& other);
-  RTCError& operator=(RTCError&& other);
-
-  ~RTCError();
-
-  // Identical to default constructed error.
-  //
-  // Preferred over the default constructor for code readability.
-  static RTCError OK();
-
-  // Error type.
-  RTCErrorType type() const { return type_; }
-  void set_type(RTCErrorType type) { type_ = type; }
-
-  // Human-readable message describing the error. Shouldn't be used for
-  // anything but logging/diagnostics, since messages are not guaranteed to be
-  // stable.
-  const char* message() const;
-  // For performance, prefer using the method that takes a const char* if the
-  // message is a static string.
-  void set_message(const char* message);
-  void set_message(std::string&& message);
-
-  // Convenience method for situations where you only care whether or not an
-  // error occurred.
-  bool ok() const { return type_ == RTCErrorType::NONE; }
-
- private:
-  RTCErrorType type_ = RTCErrorType::NONE;
-  // For performance, we use static strings wherever possible. But in some
-  // cases the error string may need to be constructed, in which case an
-  // std::string is used.
-  union {
-    const char* static_message_ = "";
-    std::string string_message_;
-  };
-  // Whether or not |static_message_| or |string_message_| is being used in the
-  // above union.
-  bool have_string_message_ = false;
-};
-
-// Outputs the error as a friendly string. Update this method when adding a new
-// error type.
-//
-// Only intended to be used for logging/disagnostics.
-std::ostream& operator<<(std::ostream& stream, RTCErrorType error);
-
-// Helper macro that can be used by implementations to create an error with a
-// message and log it. |message| should be a string literal or movable
-// std::string.
-#define LOG_AND_RETURN_ERROR_EX(type, message, severity) \
-  {                                                      \
-    RTC_DCHECK(type != RTCErrorType::NONE);              \
-    LOG(severity) << message << " (" << type << ")";     \
-    return webrtc::RTCError(type, message);   \
-  }
-
-#define LOG_AND_RETURN_ERROR(type, message) \
-  LOG_AND_RETURN_ERROR_EX(type, message, LS_ERROR)
-
-// RTCErrorOr<T> is the union of an RTCError object and a T object. RTCErrorOr
-// models the concept of an object that is either a usable value, or an error
-// Status explaining why such a value is not present. To this end RTCErrorOr<T>
-// does not allow its RTCErrorType value to be RTCErrorType::NONE. This is
-// enforced by a debug check in most cases.
-//
-// The primary use-case for RTCErrorOr<T> is as the return value of a function
-// which may fail. For example, CreateRtpSender will fail if the parameters
-// could not be successfully applied at the media engine level, but if
-// successful will return a unique_ptr to an RtpSender.
-//
-// Example client usage for a RTCErrorOr<std::unique_ptr<T>>:
-//
-//  RTCErrorOr<std::unique_ptr<Foo>> result = FooFactory::MakeNewFoo(arg);
-//  if (result.ok()) {
-//    std::unique_ptr<Foo> foo = result.ConsumeValue();
-//    foo->DoSomethingCool();
-//  } else {
-//    LOG(LS_ERROR) << result.error();
-//  }
-//
-// Example factory implementation returning RTCErrorOr<std::unique_ptr<T>>:
-//
-//  RTCErrorOr<std::unique_ptr<Foo>> FooFactory::MakeNewFoo(int arg) {
-//    if (arg <= 0) {
-//      return RTCError(RTCErrorType::INVALID_RANGE, "Arg must be positive");
-//    } else {
-//      return std::unique_ptr<Foo>(new Foo(arg));
-//    }
-//  }
-//
-template <typename T>
-class RTCErrorOr {
-  // Used to convert between RTCErrorOr<Foo>/RtcErrorOr<Bar>, when an implicit
-  // conversion from Foo to Bar exists.
-  template <typename U>
-  friend class RTCErrorOr;
-
- public:
-  typedef T element_type;
-
-  // Constructs a new RTCErrorOr with RTCErrorType::INTERNAL_ERROR error. This
-  // is marked 'explicit' to try to catch cases like 'return {};', where people
-  // think RTCErrorOr<std::vector<int>> will be initialized with an empty
-  // vector, instead of a RTCErrorType::INTERNAL_ERROR error.
-  RTCErrorOr() : error_(RTCErrorType::INTERNAL_ERROR) {}
-
-  // Constructs a new RTCErrorOr with the given non-ok error. After calling
-  // this constructor, calls to value() will DCHECK-fail.
-  //
-  // NOTE: Not explicit - we want to use RTCErrorOr<T> as a return
-  // value, so it is convenient and sensible to be able to do 'return
-  // RTCError(...)' when the return type is RTCErrorOr<T>.
-  //
-  // REQUIRES: !error.ok(). This requirement is DCHECKed.
-  RTCErrorOr(RTCError&& error) : error_(std::move(error)) {  // NOLINT
-    RTC_DCHECK(!error.ok());
-  }
-
-  // Constructs a new RTCErrorOr with the given value. After calling this
-  // constructor, calls to value() will succeed, and calls to error() will
-  // return a default-constructed RTCError.
-  //
-  // NOTE: Not explicit - we want to use RTCErrorOr<T> as a return type
-  // so it is convenient and sensible to be able to do 'return T()'
-  // when the return type is RTCErrorOr<T>.
-  RTCErrorOr(T&& value) : value_(std::move(value)) {}  // NOLINT
-
-  // Delete the copy constructor and assignment operator; there aren't any use
-  // cases where you should need to copy an RTCErrorOr, as opposed to moving
-  // it. Can revisit this decision if use cases arise in the future.
-  RTCErrorOr(const RTCErrorOr& other) = delete;
-  RTCErrorOr& operator=(const RTCErrorOr& other) = delete;
-
-  // Move constructor and move-assignment operator.
-  //
-  // Visual Studio doesn't support "= default" with move constructors or
-  // assignment operators (even though they compile, they segfault), so define
-  // them explicitly.
-  RTCErrorOr(RTCErrorOr&& other)
-      : error_(std::move(other.error_)), value_(std::move(other.value_)) {}
-  RTCErrorOr& operator=(RTCErrorOr&& other) {
-    error_ = std::move(other.error_);
-    value_ = std::move(other.value_);
-    return *this;
-  }
-
-  // Conversion constructor and assignment operator; T must be copy or move
-  // constructible from U.
-  template <typename U>
-  RTCErrorOr(RTCErrorOr<U> other)  // NOLINT
-      : error_(std::move(other.error_)), value_(std::move(other.value_)) {}
-  template <typename U>
-  RTCErrorOr& operator=(RTCErrorOr<U> other) {
-    error_ = std::move(other.error_);
-    value_ = std::move(other.value_);
-    return *this;
-  }
-
-  // Returns a reference to our error. If this contains a T, then returns
-  // default-constructed RTCError.
-  const RTCError& error() const { return error_; }
-
-  // Moves the error. Can be useful if, say "CreateFoo" returns an
-  // RTCErrorOr<Foo>, and internally calls "CreateBar" which returns an
-  // RTCErrorOr<Bar>, and wants to forward the error up the stack.
-  RTCError MoveError() { return std::move(error_); }
-
-  // Returns this->error().ok()
-  bool ok() const { return error_.ok(); }
-
-  // Returns a reference to our current value, or DCHECK-fails if !this->ok().
-  //
-  // Can be convenient for the implementation; for example, a method may want
-  // to access the value in some way before returning it to the next method on
-  // the stack.
-  const T& value() const {
-    RTC_DCHECK(ok());
-    return value_;
-  }
-  T& value() {
-    RTC_DCHECK(ok());
-    return value_;
-  }
-
-  // Moves our current value out of this object and returns it, or DCHECK-fails
-  // if !this->ok().
-  T MoveValue() {
-    RTC_DCHECK(ok());
-    return std::move(value_);
-  }
-
- private:
-  RTCError error_;
-  T value_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_API_RTCERROR_H_
diff --git a/api/rtcerror_unittest.cc b/api/rtcerror_unittest.cc
deleted file mode 100644
index 486a029..0000000
--- a/api/rtcerror_unittest.cc
+++ /dev/null
@@ -1,249 +0,0 @@
-/*
- *  Copyright 2017 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/api/rtcerror.h"
-#include "webrtc/test/gtest.h"
-
-namespace {
-
-const int kDefaultMoveOnlyIntValue = 0xbadf00d;
-
-// Class that has no copy constructor, ensuring that RTCErrorOr can
-struct MoveOnlyInt {
-  MoveOnlyInt() {}
-  explicit MoveOnlyInt(int value) : value(value) {}
-  MoveOnlyInt(const MoveOnlyInt& other) = delete;
-  MoveOnlyInt& operator=(const MoveOnlyInt& other) = delete;
-  MoveOnlyInt(MoveOnlyInt&& other) : value(other.value) {}
-  MoveOnlyInt& operator=(MoveOnlyInt&& other) {
-    value = other.value;
-    return *this;
-  }
-
-  int value = kDefaultMoveOnlyIntValue;
-};
-
-// Same as above. Used to test conversion from RTCErrorOr<A> to RTCErrorOr<B>
-// when A can be converted to B.
-struct MoveOnlyInt2 {
-  MoveOnlyInt2() {}
-  explicit MoveOnlyInt2(int value) : value(value) {}
-  MoveOnlyInt2(const MoveOnlyInt2& other) = delete;
-  MoveOnlyInt2& operator=(const MoveOnlyInt2& other) = delete;
-  MoveOnlyInt2(MoveOnlyInt2&& other) : value(other.value) {}
-  MoveOnlyInt2& operator=(MoveOnlyInt2&& other) {
-    value = other.value;
-    return *this;
-  }
-
-  explicit MoveOnlyInt2(MoveOnlyInt&& other) : value(other.value) {}
-  MoveOnlyInt2& operator=(MoveOnlyInt&& other) {
-    value = other.value;
-    return *this;
-  }
-
-  int value = kDefaultMoveOnlyIntValue;
-};
-
-}  // namespace
-
-namespace webrtc {
-
-// Simple test for ostream operator for RTCErrorType.
-TEST(RTCErrorTypeTest, OstreamOperator) {
-  std::ostringstream oss;
-  oss << webrtc::RTCErrorType::NONE << ' '
-      << webrtc::RTCErrorType::INVALID_PARAMETER << ' '
-      << webrtc::RTCErrorType::INTERNAL_ERROR;
-  EXPECT_EQ("NONE INVALID_PARAMETER INTERNAL_ERROR", oss.str());
-}
-
-// Test that the default constructor creates a "no error" error.
-TEST(RTCErrorTest, DefaultConstructor) {
-  RTCError e;
-  EXPECT_EQ(RTCErrorType::NONE, e.type());
-  EXPECT_EQ(std::string(), e.message());
-  EXPECT_TRUE(e.ok());
-}
-
-TEST(RTCErrorTest, NormalConstructors) {
-  RTCError a(RTCErrorType::INVALID_PARAMETER);
-  EXPECT_EQ(RTCErrorType::INVALID_PARAMETER, a.type());
-  EXPECT_EQ(std::string(), a.message());
-
-  // Constructor that takes const char* message.
-  RTCError b(RTCErrorType::UNSUPPORTED_PARAMETER, "foobar");
-  EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER, b.type());
-  EXPECT_EQ(std::string("foobar"), b.message());
-
-  // Constructor that takes std::string message.
-  RTCError c(RTCErrorType::INVALID_RANGE, std::string("new"));
-  EXPECT_EQ(RTCErrorType::INVALID_RANGE, c.type());
-  EXPECT_EQ(std::string("new"), c.message());
-}
-
-TEST(RTCErrorTest, MoveConstructor) {
-  // Static string.
-  RTCError a(RTCErrorType::INVALID_PARAMETER, "foo");
-  RTCError b(std::move(a));
-  EXPECT_EQ(RTCErrorType::INVALID_PARAMETER, b.type());
-  EXPECT_EQ(std::string("foo"), b.message());
-
-  // Non-static string.
-  RTCError c(RTCErrorType::UNSUPPORTED_PARAMETER, std::string("bar"));
-  RTCError d(std::move(c));
-  EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER, d.type());
-  EXPECT_EQ(std::string("bar"), d.message());
-}
-
-TEST(RTCErrorTest, MoveAssignment) {
-  // Try all combinations of "is static string"/"is non-static string" moves.
-  RTCError e(RTCErrorType::INVALID_PARAMETER, "foo");
-
-  e = RTCError(RTCErrorType::UNSUPPORTED_PARAMETER, "bar");
-  EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER, e.type());
-  EXPECT_EQ(std::string("bar"), e.message());
-
-  e = RTCError(RTCErrorType::SYNTAX_ERROR, std::string("baz"));
-  EXPECT_EQ(std::string("baz"), e.message());
-
-  e = RTCError(RTCErrorType::SYNTAX_ERROR, std::string("another"));
-  EXPECT_EQ(std::string("another"), e.message());
-
-  e = RTCError(RTCErrorType::SYNTAX_ERROR, "last");
-  EXPECT_EQ(std::string("last"), e.message());
-}
-
-// Test that the error returned by RTCError::OK() is a "no error" error.
-TEST(RTCErrorTest, OKConstant) {
-  RTCError ok = RTCError::OK();
-  EXPECT_EQ(RTCErrorType::NONE, ok.type());
-  EXPECT_EQ(std::string(), ok.message());
-  EXPECT_TRUE(ok.ok());
-}
-
-// Test that "error.ok()" behaves as expected.
-TEST(RTCErrorTest, OkMethod) {
-  RTCError success;
-  RTCError failure(RTCErrorType::INTERNAL_ERROR);
-  EXPECT_TRUE(success.ok());
-  EXPECT_FALSE(failure.ok());
-}
-
-// Test that a message can be set using either static const strings or
-// std::strings.
-TEST(RTCErrorTest, SetMessage) {
-  RTCError e;
-  // Try all combinations of "is static string"/"is non-static string" calls.
-  e.set_message("foo");
-  EXPECT_EQ(std::string("foo"), e.message());
-
-  e.set_message("bar");
-  EXPECT_EQ(std::string("bar"), e.message());
-
-  e.set_message(std::string("string"));
-  EXPECT_EQ(std::string("string"), e.message());
-
-  e.set_message(std::string("more"));
-  EXPECT_EQ(std::string("more"), e.message());
-
-  e.set_message("love to test");
-  EXPECT_EQ(std::string("love to test"), e.message());
-}
-
-// Test that the default constructor creates an "INTERNAL_ERROR".
-TEST(RTCErrorOrTest, DefaultConstructor) {
-  RTCErrorOr<MoveOnlyInt> e;
-  EXPECT_EQ(RTCErrorType::INTERNAL_ERROR, e.error().type());
-}
-
-// Test that an RTCErrorOr can be implicitly constructed from a value.
-TEST(RTCErrorOrTest, ImplicitValueConstructor) {
-  RTCErrorOr<MoveOnlyInt> e = [] { return MoveOnlyInt(100); }();
-  EXPECT_EQ(100, e.value().value);
-}
-
-// Test that an RTCErrorOr can be implicitly constructed from an RTCError.
-TEST(RTCErrorOrTest, ImplicitErrorConstructor) {
-  RTCErrorOr<MoveOnlyInt> e = [] {
-    return RTCError(RTCErrorType::SYNTAX_ERROR);
-  }();
-  EXPECT_EQ(RTCErrorType::SYNTAX_ERROR, e.error().type());
-}
-
-TEST(RTCErrorOrTest, MoveConstructor) {
-  RTCErrorOr<MoveOnlyInt> a(MoveOnlyInt(5));
-  RTCErrorOr<MoveOnlyInt> b(std::move(a));
-  EXPECT_EQ(5, b.value().value);
-}
-
-TEST(RTCErrorOrTest, MoveAssignment) {
-  RTCErrorOr<MoveOnlyInt> a(MoveOnlyInt(5));
-  RTCErrorOr<MoveOnlyInt> b(MoveOnlyInt(10));
-  a = std::move(b);
-  EXPECT_EQ(10, a.value().value);
-}
-
-TEST(RTCErrorOrTest, ConversionConstructor) {
-  RTCErrorOr<MoveOnlyInt> a(MoveOnlyInt(1));
-  RTCErrorOr<MoveOnlyInt2> b(std::move(a));
-}
-
-TEST(RTCErrorOrTest, ConversionAssignment) {
-  RTCErrorOr<MoveOnlyInt> a(MoveOnlyInt(5));
-  RTCErrorOr<MoveOnlyInt2> b(MoveOnlyInt2(10));
-  b = std::move(a);
-  EXPECT_EQ(5, b.value().value);
-}
-
-TEST(RTCErrorOrTest, OkMethod) {
-  RTCErrorOr<int> success(1337);
-  RTCErrorOr<int> error = RTCError(RTCErrorType::INTERNAL_ERROR);
-  EXPECT_TRUE(success.ok());
-  EXPECT_FALSE(error.ok());
-}
-
-TEST(RTCErrorOrTest, MoveError) {
-  RTCErrorOr<int> e({RTCErrorType::SYNTAX_ERROR, "message"});
-  RTCError err = e.MoveError();
-  EXPECT_EQ(RTCErrorType::SYNTAX_ERROR, err.type());
-  EXPECT_EQ(std::string("message"), err.message());
-}
-
-TEST(RTCErrorOrTest, MoveValue) {
-  RTCErrorOr<MoveOnlyInt> e(MoveOnlyInt(88));
-  MoveOnlyInt value = e.MoveValue();
-  EXPECT_EQ(88, value.value);
-}
-
-// Death tests.
-// Disabled on Android because death tests misbehave on Android, see
-// base/test/gtest_util.h.
-#if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
-
-TEST(RTCErrorOrDeathTest, ConstructWithOkError) {
-  EXPECT_DEATH(RTCErrorOr<int> err = RTCError::OK(), "");
-}
-
-TEST(RTCErrorOrDeathTest, DereferenceErrorValue) {
-  RTCErrorOr<int> error = RTCError(RTCErrorType::INTERNAL_ERROR);
-  EXPECT_DEATH(error.value(), "");
-}
-
-TEST(RTCErrorOrDeathTest, MoveErrorValue) {
-  RTCErrorOr<int> error = RTCError(RTCErrorType::INTERNAL_ERROR);
-  EXPECT_DEATH(error.MoveValue(), "");
-}
-
-#endif  // RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
-
-}  // namespace webrtc
diff --git a/api/rtpparameters.cc b/api/rtpparameters.cc
deleted file mode 100644
index 29b14fb..0000000
--- a/api/rtpparameters.cc
+++ /dev/null
@@ -1,190 +0,0 @@
-/*
- *  Copyright (c) 2017 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/api/rtpparameters.h"
-
-#include <algorithm>
-#include <sstream>
-#include <string>
-
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-
-RtcpFeedback::RtcpFeedback() {}
-RtcpFeedback::RtcpFeedback(RtcpFeedbackType type) : type(type) {}
-RtcpFeedback::RtcpFeedback(RtcpFeedbackType type,
-                           RtcpFeedbackMessageType message_type)
-    : type(type), message_type(message_type) {}
-RtcpFeedback::~RtcpFeedback() {}
-
-RtpCodecCapability::RtpCodecCapability() {}
-RtpCodecCapability::~RtpCodecCapability() {}
-
-RtpHeaderExtensionCapability::RtpHeaderExtensionCapability() {}
-RtpHeaderExtensionCapability::RtpHeaderExtensionCapability(
-    const std::string& uri)
-    : uri(uri) {}
-RtpHeaderExtensionCapability::RtpHeaderExtensionCapability(
-    const std::string& uri,
-    int preferred_id)
-    : uri(uri), preferred_id(preferred_id) {}
-RtpHeaderExtensionCapability::~RtpHeaderExtensionCapability() {}
-
-RtpExtension::RtpExtension() {}
-RtpExtension::RtpExtension(const std::string& uri, int id) : uri(uri), id(id) {}
-RtpExtension::RtpExtension(const std::string& uri, int id, bool encrypt)
-    : uri(uri), id(id), encrypt(encrypt) {}
-RtpExtension::~RtpExtension() {}
-
-RtpFecParameters::RtpFecParameters() {}
-RtpFecParameters::RtpFecParameters(FecMechanism mechanism)
-    : mechanism(mechanism) {}
-RtpFecParameters::RtpFecParameters(FecMechanism mechanism, uint32_t ssrc)
-    : ssrc(ssrc), mechanism(mechanism) {}
-RtpFecParameters::~RtpFecParameters() {}
-
-RtpRtxParameters::RtpRtxParameters() {}
-RtpRtxParameters::RtpRtxParameters(uint32_t ssrc) : ssrc(ssrc) {}
-RtpRtxParameters::~RtpRtxParameters() {}
-
-RtpEncodingParameters::RtpEncodingParameters() {}
-RtpEncodingParameters::~RtpEncodingParameters() {}
-
-RtpCodecParameters::RtpCodecParameters() {}
-RtpCodecParameters::~RtpCodecParameters() {}
-
-RtpCapabilities::RtpCapabilities() {}
-RtpCapabilities::~RtpCapabilities() {}
-
-RtpParameters::RtpParameters() {}
-RtpParameters::~RtpParameters() {}
-
-std::string RtpExtension::ToString() const {
-  std::stringstream ss;
-  ss << "{uri: " << uri;
-  ss << ", id: " << id;
-  if (encrypt) {
-    ss << ", encrypt";
-  }
-  ss << '}';
-  return ss.str();
-}
-
-const char RtpExtension::kAudioLevelUri[] =
-    "urn:ietf:params:rtp-hdrext:ssrc-audio-level";
-const int RtpExtension::kAudioLevelDefaultId = 1;
-
-const char RtpExtension::kTimestampOffsetUri[] =
-    "urn:ietf:params:rtp-hdrext:toffset";
-const int RtpExtension::kTimestampOffsetDefaultId = 2;
-
-const char RtpExtension::kAbsSendTimeUri[] =
-    "http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time";
-const int RtpExtension::kAbsSendTimeDefaultId = 3;
-
-const char RtpExtension::kVideoRotationUri[] = "urn:3gpp:video-orientation";
-const int RtpExtension::kVideoRotationDefaultId = 4;
-
-const char RtpExtension::kTransportSequenceNumberUri[] =
-    "http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01";
-const int RtpExtension::kTransportSequenceNumberDefaultId = 5;
-
-// This extension allows applications to adaptively limit the playout delay
-// on frames as per the current needs. For example, a gaming application
-// has very different needs on end-to-end delay compared to a video-conference
-// application.
-const char RtpExtension::kPlayoutDelayUri[] =
-    "http://www.webrtc.org/experiments/rtp-hdrext/playout-delay";
-const int RtpExtension::kPlayoutDelayDefaultId = 6;
-
-const char RtpExtension::kVideoContentTypeUri[] =
-    "http://www.webrtc.org/experiments/rtp-hdrext/video-content-type";
-const int RtpExtension::kVideoContentTypeDefaultId = 7;
-
-const char RtpExtension::kVideoTimingUri[] =
-    "http://www.webrtc.org/experiments/rtp-hdrext/video-timing";
-const int RtpExtension::kVideoTimingDefaultId = 8;
-
-const char RtpExtension::kEncryptHeaderExtensionsUri[] =
-    "urn:ietf:params:rtp-hdrext:encrypt";
-
-const int RtpExtension::kMinId = 1;
-const int RtpExtension::kMaxId = 14;
-
-bool RtpExtension::IsSupportedForAudio(const std::string& uri) {
-  return uri == webrtc::RtpExtension::kAudioLevelUri ||
-         uri == webrtc::RtpExtension::kTransportSequenceNumberUri;
-}
-
-bool RtpExtension::IsSupportedForVideo(const std::string& uri) {
-  return uri == webrtc::RtpExtension::kTimestampOffsetUri ||
-         uri == webrtc::RtpExtension::kAbsSendTimeUri ||
-         uri == webrtc::RtpExtension::kVideoRotationUri ||
-         uri == webrtc::RtpExtension::kTransportSequenceNumberUri ||
-         uri == webrtc::RtpExtension::kPlayoutDelayUri ||
-         uri == webrtc::RtpExtension::kVideoContentTypeUri ||
-         uri == webrtc::RtpExtension::kVideoTimingUri;
-}
-
-bool RtpExtension::IsEncryptionSupported(const std::string& uri) {
-  return uri == webrtc::RtpExtension::kAudioLevelUri ||
-         uri == webrtc::RtpExtension::kTimestampOffsetUri ||
-#if !defined(ENABLE_EXTERNAL_AUTH)
-         // TODO(jbauch): Figure out a way to always allow "kAbsSendTimeUri"
-         // here and filter out later if external auth is really used in
-         // srtpfilter. External auth is used by Chromium and replaces the
-         // extension header value of "kAbsSendTimeUri", so it must not be
-         // encrypted (which can't be done by Chromium).
-         uri == webrtc::RtpExtension::kAbsSendTimeUri ||
-#endif
-         uri == webrtc::RtpExtension::kVideoRotationUri ||
-         uri == webrtc::RtpExtension::kTransportSequenceNumberUri ||
-         uri == webrtc::RtpExtension::kPlayoutDelayUri ||
-         uri == webrtc::RtpExtension::kVideoContentTypeUri;
-}
-
-const RtpExtension* RtpExtension::FindHeaderExtensionByUri(
-    const std::vector<RtpExtension>& extensions,
-    const std::string& uri) {
-  for (const auto& extension : extensions) {
-    if (extension.uri == uri) {
-      return &extension;
-    }
-  }
-  return nullptr;
-}
-
-std::vector<RtpExtension> RtpExtension::FilterDuplicateNonEncrypted(
-    const std::vector<RtpExtension>& extensions) {
-  std::vector<RtpExtension> filtered;
-  for (auto extension = extensions.begin(); extension != extensions.end();
-       ++extension) {
-    if (extension->encrypt) {
-      filtered.push_back(*extension);
-      continue;
-    }
-
-    // Only add non-encrypted extension if no encrypted with the same URI
-    // is also present...
-    if (std::find_if(extension + 1, extensions.end(),
-                     [extension](const RtpExtension& check) {
-                       return extension->uri == check.uri;
-                     }) != extensions.end()) {
-      continue;
-    }
-
-    // ...and has not been added before.
-    if (!FindHeaderExtensionByUri(filtered, extension->uri)) {
-      filtered.push_back(*extension);
-    }
-  }
-  return filtered;
-}
-}  // namespace webrtc
diff --git a/api/rtpparameters.h b/api/rtpparameters.h
deleted file mode 100644
index 96e2955..0000000
--- a/api/rtpparameters.h
+++ /dev/null
@@ -1,549 +0,0 @@
-/*
- *  Copyright 2015 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_API_RTPPARAMETERS_H_
-#define WEBRTC_API_RTPPARAMETERS_H_
-
-#include <string>
-#include <unordered_map>
-#include <vector>
-
-#include "webrtc/api/mediatypes.h"
-#include "webrtc/api/optional.h"
-
-namespace webrtc {
-
-// These structures are intended to mirror those defined by:
-// http://draft.ortc.org/#rtcrtpdictionaries*
-// Contains everything specified as of 2017 Jan 24.
-//
-// They are used when retrieving or modifying the parameters of an
-// RtpSender/RtpReceiver, or retrieving capabilities.
-//
-// Note on conventions: Where ORTC may use "octet", "short" and "unsigned"
-// types, we typically use "int", in keeping with our style guidelines. The
-// parameter's actual valid range will be enforced when the parameters are set,
-// rather than when the parameters struct is built. An exception is made for
-// SSRCs, since they use the full unsigned 32-bit range, and aren't expected to
-// be used for any numeric comparisons/operations.
-//
-// Additionally, where ORTC uses strings, we may use enums for things that have
-// a fixed number of supported values. However, for things that can be extended
-// (such as codecs, by providing an external encoder factory), a string
-// identifier is used.
-
-enum class FecMechanism {
-  RED,
-  RED_AND_ULPFEC,
-  FLEXFEC,
-};
-
-// Used in RtcpFeedback struct.
-enum class RtcpFeedbackType {
-  CCM,
-  NACK,
-  REMB,  // "goog-remb"
-  TRANSPORT_CC,
-};
-
-// Used in RtcpFeedback struct when type is NACK or CCM.
-enum class RtcpFeedbackMessageType {
-  // Equivalent to {type: "nack", parameter: undefined} in ORTC.
-  GENERIC_NACK,
-  PLI,  // Usable with NACK.
-  FIR,  // Usable with CCM.
-};
-
-enum class DtxStatus {
-  DISABLED,
-  ENABLED,
-};
-
-enum class DegradationPreference {
-  MAINTAIN_FRAMERATE,
-  MAINTAIN_RESOLUTION,
-  BALANCED,
-};
-
-enum class PriorityType { VERY_LOW, LOW, MEDIUM, HIGH };
-
-struct RtcpFeedback {
-  RtcpFeedbackType type = RtcpFeedbackType::CCM;
-
-  // Equivalent to ORTC "parameter" field with slight differences:
-  // 1. It's an enum instead of a string.
-  // 2. Generic NACK feedback is represented by a GENERIC_NACK message type,
-  //    rather than an unset "parameter" value.
-  rtc::Optional<RtcpFeedbackMessageType> message_type;
-
-  // Constructors for convenience.
-  RtcpFeedback();
-  explicit RtcpFeedback(RtcpFeedbackType type);
-  RtcpFeedback(RtcpFeedbackType type, RtcpFeedbackMessageType message_type);
-  ~RtcpFeedback();
-
-  bool operator==(const RtcpFeedback& o) const {
-    return type == o.type && message_type == o.message_type;
-  }
-  bool operator!=(const RtcpFeedback& o) const { return !(*this == o); }
-};
-
-// RtpCodecCapability is to RtpCodecParameters as RtpCapabilities is to
-// RtpParameters. This represents the static capabilities of an endpoint's
-// implementation of a codec.
-struct RtpCodecCapability {
-  RtpCodecCapability();
-  ~RtpCodecCapability();
-
-  // Build MIME "type/subtype" string from |name| and |kind|.
-  std::string mime_type() const { return MediaTypeToString(kind) + "/" + name; }
-
-  // Used to identify the codec. Equivalent to MIME subtype.
-  std::string name;
-
-  // The media type of this codec. Equivalent to MIME top-level type.
-  cricket::MediaType kind = cricket::MEDIA_TYPE_AUDIO;
-
-  // Clock rate in Hertz. If unset, the codec is applicable to any clock rate.
-  rtc::Optional<int> clock_rate;
-
-  // Default payload type for this codec. Mainly needed for codecs that use
-  // that have statically assigned payload types.
-  rtc::Optional<int> preferred_payload_type;
-
-  // Maximum packetization time supported by an RtpReceiver for this codec.
-  // TODO(deadbeef): Not implemented.
-  rtc::Optional<int> max_ptime;
-
-  // Preferred packetization time for an RtpReceiver or RtpSender of this
-  // codec.
-  // TODO(deadbeef): Not implemented.
-  rtc::Optional<int> ptime;
-
-  // The number of audio channels supported. Unused for video codecs.
-  rtc::Optional<int> num_channels;
-
-  // Feedback mechanisms supported for this codec.
-  std::vector<RtcpFeedback> rtcp_feedback;
-
-  // Codec-specific parameters that must be signaled to the remote party.
-  //
-  // Corresponds to "a=fmtp" parameters in SDP.
-  //
-  // Contrary to ORTC, these parameters are named using all lowercase strings.
-  // This helps make the mapping to SDP simpler, if an application is using
-  // SDP. Boolean values are represented by the string "1".
-  std::unordered_map<std::string, std::string> parameters;
-
-  // Codec-specific parameters that may optionally be signaled to the remote
-  // party.
-  // TODO(deadbeef): Not implemented.
-  std::unordered_map<std::string, std::string> options;
-
-  // Maximum number of temporal layer extensions supported by this codec.
-  // For example, a value of 1 indicates that 2 total layers are supported.
-  // TODO(deadbeef): Not implemented.
-  int max_temporal_layer_extensions = 0;
-
-  // Maximum number of spatial layer extensions supported by this codec.
-  // For example, a value of 1 indicates that 2 total layers are supported.
-  // TODO(deadbeef): Not implemented.
-  int max_spatial_layer_extensions = 0;
-
-  // Whether the implementation can send/receive SVC layers with distinct
-  // SSRCs. Always false for audio codecs. True for video codecs that support
-  // scalable video coding with MRST.
-  // TODO(deadbeef): Not implemented.
-  bool svc_multi_stream_support = false;
-
-  bool operator==(const RtpCodecCapability& o) const {
-    return name == o.name && kind == o.kind && clock_rate == o.clock_rate &&
-           preferred_payload_type == o.preferred_payload_type &&
-           max_ptime == o.max_ptime && ptime == o.ptime &&
-           num_channels == o.num_channels && rtcp_feedback == o.rtcp_feedback &&
-           parameters == o.parameters && options == o.options &&
-           max_temporal_layer_extensions == o.max_temporal_layer_extensions &&
-           max_spatial_layer_extensions == o.max_spatial_layer_extensions &&
-           svc_multi_stream_support == o.svc_multi_stream_support;
-  }
-  bool operator!=(const RtpCodecCapability& o) const { return !(*this == o); }
-};
-
-// Used in RtpCapabilities; represents the capabilities/preferences of an
-// implementation for a header extension.
-//
-// Just called "RtpHeaderExtension" in ORTC, but the "Capability" suffix was
-// added here for consistency and to avoid confusion with
-// RtpHeaderExtensionParameters.
-//
-// Note that ORTC includes a "kind" field, but we omit this because it's
-// redundant; if you call "RtpReceiver::GetCapabilities(MEDIA_TYPE_AUDIO)",
-// you know you're getting audio capabilities.
-struct RtpHeaderExtensionCapability {
-  // URI of this extension, as defined in RFC5285.
-  std::string uri;
-
-  // Preferred value of ID that goes in the packet.
-  rtc::Optional<int> preferred_id;
-
-  // If true, it's preferred that the value in the header is encrypted.
-  // TODO(deadbeef): Not implemented.
-  bool preferred_encrypt = false;
-
-  // Constructors for convenience.
-  RtpHeaderExtensionCapability();
-  explicit RtpHeaderExtensionCapability(const std::string& uri);
-  RtpHeaderExtensionCapability(const std::string& uri, int preferred_id);
-  ~RtpHeaderExtensionCapability();
-
-  bool operator==(const RtpHeaderExtensionCapability& o) const {
-    return uri == o.uri && preferred_id == o.preferred_id &&
-           preferred_encrypt == o.preferred_encrypt;
-  }
-  bool operator!=(const RtpHeaderExtensionCapability& o) const {
-    return !(*this == o);
-  }
-};
-
-// RTP header extension, see RFC 5285.
-struct RtpExtension {
-  RtpExtension();
-  RtpExtension(const std::string& uri, int id);
-  RtpExtension(const std::string& uri, int id, bool encrypt);
-  ~RtpExtension();
-  std::string ToString() const;
-  bool operator==(const RtpExtension& rhs) const {
-    return uri == rhs.uri && id == rhs.id && encrypt == rhs.encrypt;
-  }
-  static bool IsSupportedForAudio(const std::string& uri);
-  static bool IsSupportedForVideo(const std::string& uri);
-  // Return "true" if the given RTP header extension URI may be encrypted.
-  static bool IsEncryptionSupported(const std::string& uri);
-
-  // Returns the named header extension if found among all extensions,
-  // nullptr otherwise.
-  static const RtpExtension* FindHeaderExtensionByUri(
-      const std::vector<RtpExtension>& extensions,
-      const std::string& uri);
-
-  // Return a list of RTP header extensions with the non-encrypted extensions
-  // removed if both the encrypted and non-encrypted extension is present for
-  // the same URI.
-  static std::vector<RtpExtension> FilterDuplicateNonEncrypted(
-      const std::vector<RtpExtension>& extensions);
-
-  // Header extension for audio levels, as defined in:
-  // http://tools.ietf.org/html/draft-ietf-avtext-client-to-mixer-audio-level-03
-  static const char kAudioLevelUri[];
-  static const int kAudioLevelDefaultId;
-
-  // Header extension for RTP timestamp offset, see RFC 5450 for details:
-  // http://tools.ietf.org/html/rfc5450
-  static const char kTimestampOffsetUri[];
-  static const int kTimestampOffsetDefaultId;
-
-  // Header extension for absolute send time, see url for details:
-  // http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
-  static const char kAbsSendTimeUri[];
-  static const int kAbsSendTimeDefaultId;
-
-  // Header extension for coordination of video orientation, see url for
-  // details:
-  // http://www.etsi.org/deliver/etsi_ts/126100_126199/126114/12.07.00_60/ts_126114v120700p.pdf
-  static const char kVideoRotationUri[];
-  static const int kVideoRotationDefaultId;
-
-  // Header extension for video content type. E.g. default or screenshare.
-  static const char kVideoContentTypeUri[];
-  static const int kVideoContentTypeDefaultId;
-
-  // Header extension for video timing.
-  static const char kVideoTimingUri[];
-  static const int kVideoTimingDefaultId;
-
-  // Header extension for transport sequence number, see url for details:
-  // http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions
-  static const char kTransportSequenceNumberUri[];
-  static const int kTransportSequenceNumberDefaultId;
-
-  static const char kPlayoutDelayUri[];
-  static const int kPlayoutDelayDefaultId;
-
-  // Encryption of Header Extensions, see RFC 6904 for details:
-  // https://tools.ietf.org/html/rfc6904
-  static const char kEncryptHeaderExtensionsUri[];
-
-  // Inclusive min and max IDs for one-byte header extensions, per RFC5285.
-  static const int kMinId;
-  static const int kMaxId;
-
-  std::string uri;
-  int id = 0;
-  bool encrypt = false;
-};
-
-// TODO(deadbeef): This is missing the "encrypt" flag, which is unimplemented.
-typedef RtpExtension RtpHeaderExtensionParameters;
-
-struct RtpFecParameters {
-  // If unset, a value is chosen by the implementation.
-  // Works just like RtpEncodingParameters::ssrc.
-  rtc::Optional<uint32_t> ssrc;
-
-  FecMechanism mechanism = FecMechanism::RED;
-
-  // Constructors for convenience.
-  RtpFecParameters();
-  explicit RtpFecParameters(FecMechanism mechanism);
-  RtpFecParameters(FecMechanism mechanism, uint32_t ssrc);
-  ~RtpFecParameters();
-
-  bool operator==(const RtpFecParameters& o) const {
-    return ssrc == o.ssrc && mechanism == o.mechanism;
-  }
-  bool operator!=(const RtpFecParameters& o) const { return !(*this == o); }
-};
-
-struct RtpRtxParameters {
-  // If unset, a value is chosen by the implementation.
-  // Works just like RtpEncodingParameters::ssrc.
-  rtc::Optional<uint32_t> ssrc;
-
-  // Constructors for convenience.
-  RtpRtxParameters();
-  explicit RtpRtxParameters(uint32_t ssrc);
-  ~RtpRtxParameters();
-
-  bool operator==(const RtpRtxParameters& o) const { return ssrc == o.ssrc; }
-  bool operator!=(const RtpRtxParameters& o) const { return !(*this == o); }
-};
-
-struct RtpEncodingParameters {
-  RtpEncodingParameters();
-  ~RtpEncodingParameters();
-
-  // If unset, a value is chosen by the implementation.
-  //
-  // Note that the chosen value is NOT returned by GetParameters, because it
-  // may change due to an SSRC conflict, in which case the conflict is handled
-  // internally without any event. Another way of looking at this is that an
-  // unset SSRC acts as a "wildcard" SSRC.
-  rtc::Optional<uint32_t> ssrc;
-
-  // Can be used to reference a codec in the |codecs| member of the
-  // RtpParameters that contains this RtpEncodingParameters. If unset, the
-  // implementation will choose the first possible codec (if a sender), or
-  // prepare to receive any codec (for a receiver).
-  // TODO(deadbeef): Not implemented. Implementation of RtpSender will always
-  // choose the first codec from the list.
-  rtc::Optional<int> codec_payload_type;
-
-  // Specifies the FEC mechanism, if set.
-  // TODO(deadbeef): Not implemented. Current implementation will use whatever
-  // FEC codecs are available, including red+ulpfec.
-  rtc::Optional<RtpFecParameters> fec;
-
-  // Specifies the RTX parameters, if set.
-  // TODO(deadbeef): Not implemented with PeerConnection senders/receivers.
-  rtc::Optional<RtpRtxParameters> rtx;
-
-  // Only used for audio. If set, determines whether or not discontinuous
-  // transmission will be used, if an available codec supports it. If not
-  // set, the implementation default setting will be used.
-  // TODO(deadbeef): Not implemented. Current implementation will use a CN
-  // codec as long as it's present.
-  rtc::Optional<DtxStatus> dtx;
-
-  // The relative priority of this encoding.
-  // TODO(deadbeef): Not implemented.
-  rtc::Optional<PriorityType> priority;
-
-  // If set, this represents the Transport Independent Application Specific
-  // maximum bandwidth defined in RFC3890. If unset, there is no maximum
-  // bitrate.
-  //
-  // Just called "maxBitrate" in ORTC spec.
-  //
-  // TODO(deadbeef): With ORTC RtpSenders, this currently sets the total
-  // bandwidth for the entire bandwidth estimator (audio and video). This is
-  // just always how "b=AS" was handled, but it's not correct and should be
-  // fixed.
-  rtc::Optional<int> max_bitrate_bps;
-
-  // TODO(deadbeef): Not implemented.
-  rtc::Optional<int> max_framerate;
-
-  // For video, scale the resolution down by this factor.
-  // TODO(deadbeef): Not implemented.
-  double scale_resolution_down_by = 1.0;
-
-  // Scale the framerate down by this factor.
-  // TODO(deadbeef): Not implemented.
-  double scale_framerate_down_by = 1.0;
-
-  // For an RtpSender, set to true to cause this encoding to be sent, and false
-  // for it not to be sent. For an RtpReceiver, set to true to cause the
-  // encoding to be decoded, and false for it to be ignored.
-  // TODO(deadbeef): Not implemented for PeerConnection RtpReceivers.
-  bool active = true;
-
-  // Value to use for RID RTP header extension.
-  // Called "encodingId" in ORTC.
-  // TODO(deadbeef): Not implemented.
-  std::string rid;
-
-  // RIDs of encodings on which this layer depends.
-  // Called "dependencyEncodingIds" in ORTC spec.
-  // TODO(deadbeef): Not implemented.
-  std::vector<std::string> dependency_rids;
-
-  bool operator==(const RtpEncodingParameters& o) const {
-    return ssrc == o.ssrc && codec_payload_type == o.codec_payload_type &&
-           fec == o.fec && rtx == o.rtx && dtx == o.dtx &&
-           priority == o.priority && max_bitrate_bps == o.max_bitrate_bps &&
-           max_framerate == o.max_framerate &&
-           scale_resolution_down_by == o.scale_resolution_down_by &&
-           scale_framerate_down_by == o.scale_framerate_down_by &&
-           active == o.active && rid == o.rid &&
-           dependency_rids == o.dependency_rids;
-  }
-  bool operator!=(const RtpEncodingParameters& o) const {
-    return !(*this == o);
-  }
-};
-
-struct RtpCodecParameters {
-  RtpCodecParameters();
-  ~RtpCodecParameters();
-
-  // Build MIME "type/subtype" string from |name| and |kind|.
-  std::string mime_type() const { return MediaTypeToString(kind) + "/" + name; }
-
-  // Used to identify the codec. Equivalent to MIME subtype.
-  std::string name;
-
-  // The media type of this codec. Equivalent to MIME top-level type.
-  cricket::MediaType kind = cricket::MEDIA_TYPE_AUDIO;
-
-  // Payload type used to identify this codec in RTP packets.
-  // This must always be present, and must be unique across all codecs using
-  // the same transport.
-  int payload_type = 0;
-
-  // If unset, the implementation default is used.
-  rtc::Optional<int> clock_rate;
-
-  // The number of audio channels used. Unset for video codecs. If unset for
-  // audio, the implementation default is used.
-  // TODO(deadbeef): The "implementation default" part isn't fully implemented.
-  // Only defaults to 1, even though some codecs (such as opus) should really
-  // default to 2.
-  rtc::Optional<int> num_channels;
-
-  // The maximum packetization time to be used by an RtpSender.
-  // If |ptime| is also set, this will be ignored.
-  // TODO(deadbeef): Not implemented.
-  rtc::Optional<int> max_ptime;
-
-  // The packetization time to be used by an RtpSender.
-  // If unset, will use any time up to max_ptime.
-  // TODO(deadbeef): Not implemented.
-  rtc::Optional<int> ptime;
-
-  // Feedback mechanisms to be used for this codec.
-  // TODO(deadbeef): Not implemented with PeerConnection senders/receivers.
-  std::vector<RtcpFeedback> rtcp_feedback;
-
-  // Codec-specific parameters that must be signaled to the remote party.
-  //
-  // Corresponds to "a=fmtp" parameters in SDP.
-  //
-  // Contrary to ORTC, these parameters are named using all lowercase strings.
-  // This helps make the mapping to SDP simpler, if an application is using
-  // SDP. Boolean values are represented by the string "1".
-  //
-  // TODO(deadbeef): Not implemented with PeerConnection senders/receivers.
-  std::unordered_map<std::string, std::string> parameters;
-
-  bool operator==(const RtpCodecParameters& o) const {
-    return name == o.name && kind == o.kind && payload_type == o.payload_type &&
-           clock_rate == o.clock_rate && num_channels == o.num_channels &&
-           max_ptime == o.max_ptime && ptime == o.ptime &&
-           rtcp_feedback == o.rtcp_feedback && parameters == o.parameters;
-  }
-  bool operator!=(const RtpCodecParameters& o) const { return !(*this == o); }
-};
-
-// RtpCapabilities is used to represent the static capabilities of an
-// endpoint. An application can use these capabilities to construct an
-// RtpParameters.
-struct RtpCapabilities {
-  RtpCapabilities();
-  ~RtpCapabilities();
-
-  // Supported codecs.
-  std::vector<RtpCodecCapability> codecs;
-
-  // Supported RTP header extensions.
-  std::vector<RtpHeaderExtensionCapability> header_extensions;
-
-  // Supported Forward Error Correction (FEC) mechanisms. Note that the RED,
-  // ulpfec and flexfec codecs used by these mechanisms will still appear in
-  // |codecs|.
-  std::vector<FecMechanism> fec;
-
-  bool operator==(const RtpCapabilities& o) const {
-    return codecs == o.codecs && header_extensions == o.header_extensions &&
-           fec == o.fec;
-  }
-  bool operator!=(const RtpCapabilities& o) const { return !(*this == o); }
-};
-
-// Note that unlike in ORTC, an RtcpParameters structure is not included in
-// RtpParameters, because our API includes an additional "RtpTransport"
-// abstraction on which RTCP parameters are set.
-struct RtpParameters {
-  RtpParameters();
-  ~RtpParameters();
-
-  // Used when calling getParameters/setParameters with a PeerConnection
-  // RtpSender, to ensure that outdated parameters are not unintentionally
-  // applied successfully.
-  // TODO(deadbeef): Not implemented.
-  std::string transaction_id;
-
-  // Value to use for MID RTP header extension.
-  // Called "muxId" in ORTC.
-  // TODO(deadbeef): Not implemented.
-  std::string mid;
-
-  std::vector<RtpCodecParameters> codecs;
-
-  // TODO(deadbeef): Not implemented with PeerConnection senders/receivers.
-  std::vector<RtpHeaderExtensionParameters> header_extensions;
-
-  std::vector<RtpEncodingParameters> encodings;
-
-  // TODO(deadbeef): Not implemented.
-  DegradationPreference degradation_preference =
-      DegradationPreference::BALANCED;
-
-  bool operator==(const RtpParameters& o) const {
-    return mid == o.mid && codecs == o.codecs &&
-           header_extensions == o.header_extensions &&
-           encodings == o.encodings &&
-           degradation_preference == o.degradation_preference;
-  }
-  bool operator!=(const RtpParameters& o) const { return !(*this == o); }
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_API_RTPPARAMETERS_H_
diff --git a/api/rtpparameters_unittest.cc b/api/rtpparameters_unittest.cc
deleted file mode 100644
index 6cb90c2..0000000
--- a/api/rtpparameters_unittest.cc
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- *  Copyright (c) 2017 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/api/rtpparameters.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-using webrtc::RtpExtension;
-
-static const char kExtensionUri1[] = "extension-uri1";
-static const char kExtensionUri2[] = "extension-uri2";
-
-static const RtpExtension kExtension1(kExtensionUri1, 1);
-static const RtpExtension kExtension1Encrypted(kExtensionUri1, 10, true);
-static const RtpExtension kExtension2(kExtensionUri2, 2);
-
-TEST(RtpExtensionTest, FilterDuplicateNonEncrypted) {
-  std::vector<RtpExtension> extensions;
-  std::vector<RtpExtension> filtered;
-
-  extensions.push_back(kExtension1);
-  extensions.push_back(kExtension1Encrypted);
-  filtered = RtpExtension::FilterDuplicateNonEncrypted(extensions);
-  EXPECT_EQ(1u, filtered.size());
-  EXPECT_EQ(std::vector<RtpExtension>{kExtension1Encrypted}, filtered);
-
-  extensions.clear();
-  extensions.push_back(kExtension1Encrypted);
-  extensions.push_back(kExtension1);
-  filtered = RtpExtension::FilterDuplicateNonEncrypted(extensions);
-  EXPECT_EQ(1u, filtered.size());
-  EXPECT_EQ(std::vector<RtpExtension>{kExtension1Encrypted}, filtered);
-
-  extensions.clear();
-  extensions.push_back(kExtension1);
-  extensions.push_back(kExtension2);
-  filtered = RtpExtension::FilterDuplicateNonEncrypted(extensions);
-  EXPECT_EQ(2u, filtered.size());
-  EXPECT_EQ(extensions, filtered);
-}
-}  // namespace webrtc
diff --git a/api/rtpreceiverinterface.h b/api/rtpreceiverinterface.h
deleted file mode 100644
index 3119fb7..0000000
--- a/api/rtpreceiverinterface.h
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-// This file contains interfaces for RtpReceivers
-// http://w3c.github.io/webrtc-pc/#rtcrtpreceiver-interface
-
-#ifndef WEBRTC_API_RTPRECEIVERINTERFACE_H_
-#define WEBRTC_API_RTPRECEIVERINTERFACE_H_
-
-#include <string>
-#include <vector>
-
-#include "webrtc/api/mediastreaminterface.h"
-#include "webrtc/api/mediatypes.h"
-#include "webrtc/api/proxy.h"
-#include "webrtc/api/rtpparameters.h"
-#include "webrtc/rtc_base/refcount.h"
-#include "webrtc/rtc_base/scoped_ref_ptr.h"
-
-namespace webrtc {
-
-enum class RtpSourceType {
-  SSRC,
-  CSRC,
-};
-
-class RtpSource {
- public:
-  RtpSource() = delete;
-  RtpSource(int64_t timestamp_ms, uint32_t source_id, RtpSourceType source_type)
-      : timestamp_ms_(timestamp_ms),
-        source_id_(source_id),
-        source_type_(source_type) {}
-
-  RtpSource(int64_t timestamp_ms,
-            uint32_t source_id,
-            RtpSourceType source_type,
-            uint8_t audio_level)
-      : timestamp_ms_(timestamp_ms),
-        source_id_(source_id),
-        source_type_(source_type),
-        audio_level_(audio_level) {}
-
-  int64_t timestamp_ms() const { return timestamp_ms_; }
-  void update_timestamp_ms(int64_t timestamp_ms) {
-    RTC_DCHECK_LE(timestamp_ms_, timestamp_ms);
-    timestamp_ms_ = timestamp_ms;
-  }
-
-  // The identifier of the source can be the CSRC or the SSRC.
-  uint32_t source_id() const { return source_id_; }
-
-  // The source can be either a contributing source or a synchronization source.
-  RtpSourceType source_type() const { return source_type_; }
-
-  rtc::Optional<uint8_t> audio_level() const { return audio_level_; }
-  void set_audio_level(const rtc::Optional<uint8_t>& level) {
-    audio_level_ = level;
-  }
-
-  bool operator==(const RtpSource& o) const {
-    return timestamp_ms_ == o.timestamp_ms() && source_id_ == o.source_id() &&
-           source_type_ == o.source_type() && audio_level_ == o.audio_level_;
-  }
-
- private:
-  int64_t timestamp_ms_;
-  uint32_t source_id_;
-  RtpSourceType source_type_;
-  rtc::Optional<uint8_t> audio_level_;
-};
-
-class RtpReceiverObserverInterface {
- public:
-  // Note: Currently if there are multiple RtpReceivers of the same media type,
-  // they will all call OnFirstPacketReceived at once.
-  //
-  // In the future, it's likely that an RtpReceiver will only call
-  // OnFirstPacketReceived when a packet is received specifically for its
-  // SSRC/mid.
-  virtual void OnFirstPacketReceived(cricket::MediaType media_type) = 0;
-
- protected:
-  virtual ~RtpReceiverObserverInterface() {}
-};
-
-class RtpReceiverInterface : public rtc::RefCountInterface {
- public:
-  virtual rtc::scoped_refptr<MediaStreamTrackInterface> track() const = 0;
-
-  // Audio or video receiver?
-  virtual cricket::MediaType media_type() const = 0;
-
-  // Not to be confused with "mid", this is a field we can temporarily use
-  // to uniquely identify a receiver until we implement Unified Plan SDP.
-  virtual std::string id() const = 0;
-
-  // The WebRTC specification only defines RTCRtpParameters in terms of senders,
-  // but this API also applies them to receivers, similar to ORTC:
-  // http://ortc.org/wp-content/uploads/2016/03/ortc.html#rtcrtpparameters*.
-  virtual RtpParameters GetParameters() const = 0;
-  // Currently, doesn't support changing any parameters, but may in the future.
-  virtual bool SetParameters(const RtpParameters& parameters) = 0;
-
-  // Does not take ownership of observer.
-  // Must call SetObserver(nullptr) before the observer is destroyed.
-  virtual void SetObserver(RtpReceiverObserverInterface* observer) = 0;
-
-  // TODO(zhihuang): Remove the default implementation once the subclasses
-  // implement this. Currently, the only relevant subclass is the
-  // content::FakeRtpReceiver in Chromium.
-  virtual std::vector<RtpSource> GetSources() const {
-    return std::vector<RtpSource>();
-  }
-
- protected:
-  virtual ~RtpReceiverInterface() {}
-};
-
-// Define proxy for RtpReceiverInterface.
-// TODO(deadbeef): Move this to .cc file and out of api/. What threads methods
-// are called on is an implementation detail.
-BEGIN_SIGNALING_PROXY_MAP(RtpReceiver)
-  PROXY_SIGNALING_THREAD_DESTRUCTOR()
-  PROXY_CONSTMETHOD0(rtc::scoped_refptr<MediaStreamTrackInterface>, track)
-  PROXY_CONSTMETHOD0(cricket::MediaType, media_type)
-  PROXY_CONSTMETHOD0(std::string, id)
-  PROXY_CONSTMETHOD0(RtpParameters, GetParameters);
-  PROXY_METHOD1(bool, SetParameters, const RtpParameters&)
-  PROXY_METHOD1(void, SetObserver, RtpReceiverObserverInterface*);
-  PROXY_CONSTMETHOD0(std::vector<RtpSource>, GetSources);
-  END_PROXY_MAP()
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_API_RTPRECEIVERINTERFACE_H_
diff --git a/api/rtpsender.h b/api/rtpsender.h
deleted file mode 100644
index 3b7faec..0000000
--- a/api/rtpsender.h
+++ /dev/null
@@ -1,18 +0,0 @@
-/*
- *  Copyright 2015 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_API_RTPSENDER_H_
-#define WEBRTC_API_RTPSENDER_H_
-
-// Including this file is deprecated. It is no longer part of the public API.
-// This only includes the file in its new location for backwards compatibility.
-#include "webrtc/pc/rtpsender.h"
-
-#endif  // WEBRTC_API_RTPSENDER_H_
diff --git a/api/rtpsenderinterface.h b/api/rtpsenderinterface.h
deleted file mode 100644
index b2d59c4..0000000
--- a/api/rtpsenderinterface.h
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-// This file contains interfaces for RtpSenders
-// http://w3c.github.io/webrtc-pc/#rtcrtpsender-interface
-
-#ifndef WEBRTC_API_RTPSENDERINTERFACE_H_
-#define WEBRTC_API_RTPSENDERINTERFACE_H_
-
-#include <string>
-#include <vector>
-
-#include "webrtc/api/dtmfsenderinterface.h"
-#include "webrtc/api/mediastreaminterface.h"
-#include "webrtc/api/mediatypes.h"
-#include "webrtc/api/proxy.h"
-#include "webrtc/api/rtpparameters.h"
-#include "webrtc/rtc_base/refcount.h"
-#include "webrtc/rtc_base/scoped_ref_ptr.h"
-
-namespace webrtc {
-
-class RtpSenderInterface : public rtc::RefCountInterface {
- public:
-  // Returns true if successful in setting the track.
-  // Fails if an audio track is set on a video RtpSender, or vice-versa.
-  virtual bool SetTrack(MediaStreamTrackInterface* track) = 0;
-  virtual rtc::scoped_refptr<MediaStreamTrackInterface> track() const = 0;
-
-  // Returns primary SSRC used by this sender for sending media.
-  // Returns 0 if not yet determined.
-  // TODO(deadbeef): Change to rtc::Optional.
-  // TODO(deadbeef): Remove? With GetParameters this should be redundant.
-  virtual uint32_t ssrc() const = 0;
-
-  // Audio or video sender?
-  virtual cricket::MediaType media_type() const = 0;
-
-  // Not to be confused with "mid", this is a field we can temporarily use
-  // to uniquely identify a receiver until we implement Unified Plan SDP.
-  virtual std::string id() const = 0;
-
-  // Returns a list of streams associated with this sender's track. Although we
-  // only support one track per stream, in theory the API allows for multiple.
-  virtual std::vector<std::string> stream_ids() const = 0;
-
-  virtual RtpParameters GetParameters() const = 0;
-  // Note that only a subset of the parameters can currently be changed. See
-  // rtpparameters.h
-  virtual bool SetParameters(const RtpParameters& parameters) = 0;
-
-  // Returns null for a video sender.
-  virtual rtc::scoped_refptr<DtmfSenderInterface> GetDtmfSender() const = 0;
-
- protected:
-  virtual ~RtpSenderInterface() {}
-};
-
-// Define proxy for RtpSenderInterface.
-// TODO(deadbeef): Move this to .cc file and out of api/. What threads methods
-// are called on is an implementation detail.
-BEGIN_SIGNALING_PROXY_MAP(RtpSender)
-  PROXY_SIGNALING_THREAD_DESTRUCTOR()
-  PROXY_METHOD1(bool, SetTrack, MediaStreamTrackInterface*)
-  PROXY_CONSTMETHOD0(rtc::scoped_refptr<MediaStreamTrackInterface>, track)
-  PROXY_CONSTMETHOD0(uint32_t, ssrc)
-  PROXY_CONSTMETHOD0(cricket::MediaType, media_type)
-  PROXY_CONSTMETHOD0(std::string, id)
-  PROXY_CONSTMETHOD0(std::vector<std::string>, stream_ids)
-  PROXY_CONSTMETHOD0(RtpParameters, GetParameters);
-  PROXY_METHOD1(bool, SetParameters, const RtpParameters&)
-  PROXY_CONSTMETHOD0(rtc::scoped_refptr<DtmfSenderInterface>, GetDtmfSender);
-END_PROXY_MAP()
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_API_RTPSENDERINTERFACE_H_
diff --git a/api/stats/OWNERS b/api/stats/OWNERS
deleted file mode 100644
index 633d6b9..0000000
--- a/api/stats/OWNERS
+++ /dev/null
@@ -1,7 +0,0 @@
-hbos@webrtc.org
-hta@webrtc.org
-
-# These are for the common case of adding or renaming files. If you're doing
-# structural changes, please get a review from a reviewer in this file.
-per-file *.gn=*
-per-file *.gni=*
diff --git a/api/stats/rtcstats.h b/api/stats/rtcstats.h
deleted file mode 100644
index d9ed7bc..0000000
--- a/api/stats/rtcstats.h
+++ /dev/null
@@ -1,332 +0,0 @@
-/*
- *  Copyright 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_API_STATS_RTCSTATS_H_
-#define WEBRTC_API_STATS_RTCSTATS_H_
-
-#include <map>
-#include <memory>
-#include <string>
-#include <utility>
-#include <vector>
-
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-
-class RTCStatsMemberInterface;
-
-// Abstract base class for RTCStats-derived dictionaries, see
-// https://w3c.github.io/webrtc-stats/.
-//
-// All derived classes must have the following static variable defined:
-//   static const char kType[];
-// It is used as a unique class identifier and a string representation of the
-// class type, see https://w3c.github.io/webrtc-stats/#rtcstatstype-str*.
-// Use the |WEBRTC_RTCSTATS_IMPL| macro when implementing subclasses, see macro
-// for details.
-//
-// Derived classes list their dictionary members, RTCStatsMember<T>, as public
-// fields, allowing the following:
-//
-// RTCFooStats foo("fooId", GetCurrentTime());
-// foo.bar = 42;
-// foo.baz = std::vector<std::string>();
-// foo.baz->push_back("hello world");
-// uint32_t x = *foo.bar;
-//
-// Pointers to all the members are available with |Members|, allowing iteration:
-//
-// for (const RTCStatsMemberInterface* member : foo.Members()) {
-//   printf("%s = %s\n", member->name(), member->ValueToString().c_str());
-// }
-class RTCStats {
- public:
-  RTCStats(const std::string& id, int64_t timestamp_us)
-      : id_(id), timestamp_us_(timestamp_us) {}
-  RTCStats(std::string&& id, int64_t timestamp_us)
-      : id_(std::move(id)), timestamp_us_(timestamp_us) {}
-  virtual ~RTCStats() {}
-
-  virtual std::unique_ptr<RTCStats> copy() const = 0;
-
-  const std::string& id() const { return id_; }
-  // Time relative to the UNIX epoch (Jan 1, 1970, UTC), in microseconds.
-  int64_t timestamp_us() const { return timestamp_us_; }
-  // Returns the static member variable |kType| of the implementing class.
-  virtual const char* type() const = 0;
-  // Returns a vector of pointers to all the |RTCStatsMemberInterface| members
-  // of this class. This allows for iteration of members. For a given class,
-  // |Members| always returns the same members in the same order.
-  std::vector<const RTCStatsMemberInterface*> Members() const;
-  // Checks if the two stats objects are of the same type and have the same
-  // member values. Timestamps are not compared. These operators are exposed for
-  // testing.
-  bool operator==(const RTCStats& other) const;
-  bool operator!=(const RTCStats& other) const;
-
-  // Creates a JSON readable string representation of the stats
-  // object, listing all of its members (names and values).
-  std::string ToJson() const;
-
-  // Downcasts the stats object to an |RTCStats| subclass |T|. DCHECKs that the
-  // object is of type |T|.
-  template<typename T>
-  const T& cast_to() const {
-    RTC_DCHECK_EQ(type(), T::kType);
-    return static_cast<const T&>(*this);
-  }
-
- protected:
-  // Gets a vector of all members of this |RTCStats| object, including members
-  // derived from parent classes. |additional_capacity| is how many more members
-  // shall be reserved in the vector (so that subclasses can allocate a vector
-  // with room for both parent and child members without it having to resize).
-  virtual std::vector<const RTCStatsMemberInterface*>
-  MembersOfThisObjectAndAncestors(
-      size_t additional_capacity) const;
-
-  std::string const id_;
-  int64_t timestamp_us_;
-};
-
-// All |RTCStats| classes should use these macros.
-// |WEBRTC_RTCSTATS_DECL| is placed in a public section of the class definition.
-// |WEBRTC_RTCSTATS_IMPL| is placed outside the class definition (in a .cc).
-//
-// These macros declare (in _DECL) and define (in _IMPL) the static |kType| and
-// overrides methods as required by subclasses of |RTCStats|: |copy|, |type| and
-// |MembersOfThisObjectAndAncestors|. The |...| argument is a list of addresses
-// to each member defined in the implementing class. The list must have at least
-// one member.
-//
-// (Since class names need to be known to implement these methods this cannot be
-// part of the base |RTCStats|. While these methods could be implemented using
-// templates, that would only work for immediate subclasses. Subclasses of
-// subclasses also have to override these methods, resulting in boilerplate
-// code. Using a macro avoids this and works for any |RTCStats| class, including
-// grandchildren.)
-//
-// Sample usage:
-//
-// rtcfoostats.h:
-//   class RTCFooStats : public RTCStats {
-//    public:
-//     WEBRTC_RTCSTATS_DECL();
-//
-//     RTCFooStats(const std::string& id, int64_t timestamp_us);
-//
-//     RTCStatsMember<int32_t> foo;
-//     RTCStatsMember<int32_t> bar;
-//   };
-//
-// rtcfoostats.cc:
-//   WEBRTC_RTCSTATS_IMPL(RTCFooStats, RTCStats, "foo-stats"
-//       &foo,
-//       &bar);
-//
-//   RTCFooStats::RTCFooStats(const std::string& id, int64_t timestamp_us)
-//       : RTCStats(id, timestamp_us),
-//         foo("foo"),
-//         bar("bar") {
-//   }
-//
-#define WEBRTC_RTCSTATS_DECL()                                                 \
- public:                                                                       \
-  static const char kType[];                                                   \
-                                                                               \
-  std::unique_ptr<webrtc::RTCStats> copy() const override;                     \
-  const char* type() const override;                                           \
-                                                                               \
- protected:                                                                    \
-  std::vector<const webrtc::RTCStatsMemberInterface*>                          \
-  MembersOfThisObjectAndAncestors(                                             \
-      size_t local_var_additional_capacity) const override;                    \
-                                                                               \
- public:
-
-#define WEBRTC_RTCSTATS_IMPL(this_class, parent_class, type_str, ...)          \
-  const char this_class::kType[] = type_str;                                   \
-                                                                               \
-  std::unique_ptr<webrtc::RTCStats> this_class::copy() const {                 \
-    return std::unique_ptr<webrtc::RTCStats>(new this_class(*this));           \
-  }                                                                            \
-                                                                               \
-  const char* this_class::type() const {                                       \
-    return this_class::kType;                                                  \
-  }                                                                            \
-                                                                               \
-  std::vector<const webrtc::RTCStatsMemberInterface*>                          \
-  this_class::MembersOfThisObjectAndAncestors(                                 \
-      size_t local_var_additional_capacity) const {                            \
-    const webrtc::RTCStatsMemberInterface* local_var_members[] = {             \
-      __VA_ARGS__                                                              \
-    };                                                                         \
-    size_t local_var_members_count =                                           \
-        sizeof(local_var_members) / sizeof(local_var_members[0]);              \
-    std::vector<const webrtc::RTCStatsMemberInterface*> local_var_members_vec =\
-        parent_class::MembersOfThisObjectAndAncestors(                         \
-            local_var_members_count + local_var_additional_capacity);          \
-    RTC_DCHECK_GE(                                                             \
-        local_var_members_vec.capacity() - local_var_members_vec.size(),       \
-        local_var_members_count + local_var_additional_capacity);              \
-    local_var_members_vec.insert(local_var_members_vec.end(),                  \
-                                 &local_var_members[0],                        \
-                                 &local_var_members[local_var_members_count]); \
-    return local_var_members_vec;                                              \
-  }
-
-// Interface for |RTCStats| members, which have a name and a value of a type
-// defined in a subclass. Only the types listed in |Type| are supported, these
-// are implemented by |RTCStatsMember<T>|. The value of a member may be
-// undefined, the value can only be read if |is_defined|.
-class RTCStatsMemberInterface {
- public:
-  // Member value types.
-  enum Type {
-    kBool,                  // bool
-    kInt32,                 // int32_t
-    kUint32,                // uint32_t
-    kInt64,                 // int64_t
-    kUint64,                // uint64_t
-    kDouble,                // double
-    kString,                // std::string
-
-    kSequenceBool,          // std::vector<bool>
-    kSequenceInt32,         // std::vector<int32_t>
-    kSequenceUint32,        // std::vector<uint32_t>
-    kSequenceInt64,         // std::vector<int64_t>
-    kSequenceUint64,        // std::vector<uint64_t>
-    kSequenceDouble,        // std::vector<double>
-    kSequenceString,        // std::vector<std::string>
-  };
-
-  virtual ~RTCStatsMemberInterface() {}
-
-  const char* name() const { return name_; }
-  virtual Type type() const = 0;
-  virtual bool is_sequence() const = 0;
-  virtual bool is_string() const = 0;
-  bool is_defined() const { return is_defined_; }
-  // Type and value comparator. The names are not compared. These operators are
-  // exposed for testing.
-  virtual bool operator==(const RTCStatsMemberInterface& other) const = 0;
-  bool operator!=(const RTCStatsMemberInterface& other) const {
-    return !(*this == other);
-  }
-  virtual std::string ValueToString() const = 0;
-  // This is the same as ValueToString except for kInt64 and kUint64 types,
-  // where the value is represented as a double instead of as an integer.
-  // Since JSON stores numbers as floating point numbers, very large integers
-  // cannot be accurately represented, so we prefer to display them as doubles
-  // instead.
-  virtual std::string ValueToJson() const = 0;
-
-  template<typename T>
-  const T& cast_to() const {
-    RTC_DCHECK_EQ(type(), T::kType);
-    return static_cast<const T&>(*this);
-  }
-
- protected:
-  RTCStatsMemberInterface(const char* name, bool is_defined)
-      : name_(name), is_defined_(is_defined) {}
-
-  const char* const name_;
-  bool is_defined_;
-};
-
-// Template implementation of |RTCStatsMemberInterface|. Every possible |T| is
-// specialized in rtcstats.cc, using a different |T| results in a linker error
-// (undefined reference to |kType|). The supported types are the ones described
-// by |RTCStatsMemberInterface::Type|.
-template<typename T>
-class RTCStatsMember : public RTCStatsMemberInterface {
- public:
-  static const Type kType;
-
-  explicit RTCStatsMember(const char* name)
-      : RTCStatsMemberInterface(name, false),
-        value_() {}
-  RTCStatsMember(const char* name, const T& value)
-      : RTCStatsMemberInterface(name, true),
-        value_(value) {}
-  RTCStatsMember(const char* name, T&& value)
-      : RTCStatsMemberInterface(name, true),
-        value_(std::move(value)) {}
-  explicit RTCStatsMember(const RTCStatsMember<T>& other)
-      : RTCStatsMemberInterface(other.name_, other.is_defined_),
-        value_(other.value_) {}
-  explicit RTCStatsMember(RTCStatsMember<T>&& other)
-      : RTCStatsMemberInterface(other.name_, other.is_defined_),
-        value_(std::move(other.value_)) {}
-
-  Type type() const override { return kType; }
-  bool is_sequence() const override;
-  bool is_string() const override;
-  bool operator==(const RTCStatsMemberInterface& other) const override {
-    if (type() != other.type())
-      return false;
-    const RTCStatsMember<T>& other_t =
-        static_cast<const RTCStatsMember<T>&>(other);
-    if (!is_defined_)
-      return !other_t.is_defined();
-    if (!other.is_defined())
-      return false;
-    return value_ == other_t.value_;
-  }
-  std::string ValueToString() const override;
-  std::string ValueToJson() const override;
-
-  // Assignment operators.
-  T& operator=(const T& value) {
-    value_ = value;
-    is_defined_ = true;
-    return value_;
-  }
-  T& operator=(const T&& value) {
-    value_ = std::move(value);
-    is_defined_ = true;
-    return value_;
-  }
-  T& operator=(const RTCStatsMember<T>& other) {
-    RTC_DCHECK(other.is_defined_);
-    value_ = other.is_defined_;
-    is_defined_ = true;
-    return value_;
-  }
-
-  // Value getters.
-  T& operator*() {
-    RTC_DCHECK(is_defined_);
-    return value_;
-  }
-  const T& operator*() const {
-    RTC_DCHECK(is_defined_);
-    return value_;
-  }
-
-  // Value getters, arrow operator.
-  T* operator->() {
-    RTC_DCHECK(is_defined_);
-    return &value_;
-  }
-  const T* operator->() const {
-    RTC_DCHECK(is_defined_);
-    return &value_;
-  }
-
- private:
-  T value_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_API_STATS_RTCSTATS_H_
diff --git a/api/stats/rtcstats_objects.h b/api/stats/rtcstats_objects.h
deleted file mode 100644
index 0cbea7c..0000000
--- a/api/stats/rtcstats_objects.h
+++ /dev/null
@@ -1,418 +0,0 @@
-/*
- *  Copyright 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_API_STATS_RTCSTATS_OBJECTS_H_
-#define WEBRTC_API_STATS_RTCSTATS_OBJECTS_H_
-
-#include <string>
-#include <vector>
-
-#include "webrtc/api/stats/rtcstats.h"
-
-namespace webrtc {
-
-// https://w3c.github.io/webrtc-pc/#idl-def-rtcdatachannelstate
-struct RTCDataChannelState {
-  static const char* const kConnecting;
-  static const char* const kOpen;
-  static const char* const kClosing;
-  static const char* const kClosed;
-};
-
-// https://w3c.github.io/webrtc-stats/#dom-rtcstatsicecandidatepairstate
-struct RTCStatsIceCandidatePairState {
-  static const char* const kFrozen;
-  static const char* const kWaiting;
-  static const char* const kInProgress;
-  static const char* const kFailed;
-  static const char* const kSucceeded;
-};
-
-// https://w3c.github.io/webrtc-pc/#rtcicecandidatetype-enum
-struct RTCIceCandidateType {
-  static const char* const kHost;
-  static const char* const kSrflx;
-  static const char* const kPrflx;
-  static const char* const kRelay;
-};
-
-// https://w3c.github.io/webrtc-pc/#idl-def-rtcdtlstransportstate
-struct RTCDtlsTransportState {
-  static const char* const kNew;
-  static const char* const kConnecting;
-  static const char* const kConnected;
-  static const char* const kClosed;
-  static const char* const kFailed;
-};
-
-// |RTCMediaStreamTrackStats::kind| is not an enum in the spec but the only
-// valid values are "audio" and "video".
-// https://w3c.github.io/webrtc-stats/#dom-rtcmediastreamtrackstats-kind
-struct RTCMediaStreamTrackKind {
-  static const char* const kAudio;
-  static const char* const kVideo;
-};
-
-// https://w3c.github.io/webrtc-stats/#certificatestats-dict*
-class RTCCertificateStats final : public RTCStats {
- public:
-  WEBRTC_RTCSTATS_DECL();
-
-  RTCCertificateStats(const std::string& id, int64_t timestamp_us);
-  RTCCertificateStats(std::string&& id, int64_t timestamp_us);
-  RTCCertificateStats(const RTCCertificateStats& other);
-  ~RTCCertificateStats() override;
-
-  RTCStatsMember<std::string> fingerprint;
-  RTCStatsMember<std::string> fingerprint_algorithm;
-  RTCStatsMember<std::string> base64_certificate;
-  RTCStatsMember<std::string> issuer_certificate_id;
-};
-
-// https://w3c.github.io/webrtc-stats/#codec-dict*
-class RTCCodecStats final : public RTCStats {
- public:
-  WEBRTC_RTCSTATS_DECL();
-
-  RTCCodecStats(const std::string& id, int64_t timestamp_us);
-  RTCCodecStats(std::string&& id, int64_t timestamp_us);
-  RTCCodecStats(const RTCCodecStats& other);
-  ~RTCCodecStats() override;
-
-  RTCStatsMember<uint32_t> payload_type;
-  RTCStatsMember<std::string> mime_type;
-  RTCStatsMember<uint32_t> clock_rate;
-  // TODO(hbos): Collect and populate this value. https://bugs.webrtc.org/7061
-  RTCStatsMember<uint32_t> channels;
-  // TODO(hbos): Collect and populate this value. https://bugs.webrtc.org/7061
-  RTCStatsMember<std::string> sdp_fmtp_line;
-  // TODO(hbos): Collect and populate this value. https://bugs.webrtc.org/7061
-  RTCStatsMember<std::string> implementation;
-};
-
-// https://w3c.github.io/webrtc-stats/#dcstats-dict*
-class RTCDataChannelStats final : public RTCStats {
- public:
-  WEBRTC_RTCSTATS_DECL();
-
-  RTCDataChannelStats(const std::string& id, int64_t timestamp_us);
-  RTCDataChannelStats(std::string&& id, int64_t timestamp_us);
-  RTCDataChannelStats(const RTCDataChannelStats& other);
-  ~RTCDataChannelStats() override;
-
-  RTCStatsMember<std::string> label;
-  RTCStatsMember<std::string> protocol;
-  RTCStatsMember<int32_t> datachannelid;
-  // TODO(hbos): Support enum types? "RTCStatsMember<RTCDataChannelState>"?
-  RTCStatsMember<std::string> state;
-  RTCStatsMember<uint32_t> messages_sent;
-  RTCStatsMember<uint64_t> bytes_sent;
-  RTCStatsMember<uint32_t> messages_received;
-  RTCStatsMember<uint64_t> bytes_received;
-};
-
-// https://w3c.github.io/webrtc-stats/#candidatepair-dict*
-// TODO(hbos): Tracking bug https://bugs.webrtc.org/7062
-class RTCIceCandidatePairStats final : public RTCStats {
- public:
-  WEBRTC_RTCSTATS_DECL();
-
-  RTCIceCandidatePairStats(const std::string& id, int64_t timestamp_us);
-  RTCIceCandidatePairStats(std::string&& id, int64_t timestamp_us);
-  RTCIceCandidatePairStats(const RTCIceCandidatePairStats& other);
-  ~RTCIceCandidatePairStats() override;
-
-  RTCStatsMember<std::string> transport_id;
-  RTCStatsMember<std::string> local_candidate_id;
-  RTCStatsMember<std::string> remote_candidate_id;
-  // TODO(hbos): Support enum types?
-  // "RTCStatsMember<RTCStatsIceCandidatePairState>"?
-  RTCStatsMember<std::string> state;
-  RTCStatsMember<uint64_t> priority;
-  RTCStatsMember<bool> nominated;
-  // TODO(hbos): Collect this the way the spec describes it. We have a value for
-  // it but it is not spec-compliant. https://bugs.webrtc.org/7062
-  RTCStatsMember<bool> writable;
-  // TODO(hbos): Collect and populate this value. https://bugs.webrtc.org/7062
-  RTCStatsMember<bool> readable;
-  RTCStatsMember<uint64_t> bytes_sent;
-  RTCStatsMember<uint64_t> bytes_received;
-  RTCStatsMember<double> total_round_trip_time;
-  RTCStatsMember<double> current_round_trip_time;
-  RTCStatsMember<double> available_outgoing_bitrate;
-  // TODO(hbos): Populate this value. It is wired up and collected the same way
-  // "VideoBwe.googAvailableReceiveBandwidth" is, but that value is always
-  // undefined. https://bugs.webrtc.org/7062
-  RTCStatsMember<double> available_incoming_bitrate;
-  RTCStatsMember<uint64_t> requests_received;
-  RTCStatsMember<uint64_t> requests_sent;
-  RTCStatsMember<uint64_t> responses_received;
-  RTCStatsMember<uint64_t> responses_sent;
-  // TODO(hbos): Collect and populate this value. https://bugs.webrtc.org/7062
-  RTCStatsMember<uint64_t> retransmissions_received;
-  // TODO(hbos): Collect and populate this value. https://bugs.webrtc.org/7062
-  RTCStatsMember<uint64_t> retransmissions_sent;
-  // TODO(hbos): Collect and populate this value. https://bugs.webrtc.org/7062
-  RTCStatsMember<uint64_t> consent_requests_received;
-  RTCStatsMember<uint64_t> consent_requests_sent;
-  // TODO(hbos): Collect and populate this value. https://bugs.webrtc.org/7062
-  RTCStatsMember<uint64_t> consent_responses_received;
-  // TODO(hbos): Collect and populate this value. https://bugs.webrtc.org/7062
-  RTCStatsMember<uint64_t> consent_responses_sent;
-};
-
-// https://w3c.github.io/webrtc-stats/#icecandidate-dict*
-// TODO(hbos): |RTCStatsCollector| only collects candidates that are part of
-// ice candidate pairs, but there could be candidates not paired with anything.
-// crbug.com/632723
-class RTCIceCandidateStats : public RTCStats {
- public:
-  WEBRTC_RTCSTATS_DECL();
-
-  RTCIceCandidateStats(const RTCIceCandidateStats& other);
-  ~RTCIceCandidateStats() override;
-
-  RTCStatsMember<std::string> transport_id;
-  RTCStatsMember<bool> is_remote;
-  RTCStatsMember<std::string> ip;
-  RTCStatsMember<int32_t> port;
-  RTCStatsMember<std::string> protocol;
-  // TODO(hbos): Support enum types? "RTCStatsMember<RTCIceCandidateType>"?
-  RTCStatsMember<std::string> candidate_type;
-  RTCStatsMember<int32_t> priority;
-  // TODO(hbos): Not collected by |RTCStatsCollector|. crbug.com/632723
-  RTCStatsMember<std::string> url;
-  // TODO(hbos): |deleted = true| case is not supported by |RTCStatsCollector|.
-  // crbug.com/632723
-  RTCStatsMember<bool> deleted;  // = false
-
- protected:
-  RTCIceCandidateStats(
-      const std::string& id, int64_t timestamp_us, bool is_remote);
-  RTCIceCandidateStats(std::string&& id, int64_t timestamp_us, bool is_remote);
-};
-
-// In the spec both local and remote varieties are of type RTCIceCandidateStats.
-// But here we define them as subclasses of |RTCIceCandidateStats| because the
-// |kType| need to be different ("RTCStatsType type") in the local/remote case.
-// https://w3c.github.io/webrtc-stats/#rtcstatstype-str*
-class RTCLocalIceCandidateStats final : public RTCIceCandidateStats {
- public:
-  static const char kType[];
-  RTCLocalIceCandidateStats(const std::string& id, int64_t timestamp_us);
-  RTCLocalIceCandidateStats(std::string&& id, int64_t timestamp_us);
-  const char* type() const override;
-};
-
-class RTCRemoteIceCandidateStats final : public RTCIceCandidateStats {
- public:
-  static const char kType[];
-  RTCRemoteIceCandidateStats(const std::string& id, int64_t timestamp_us);
-  RTCRemoteIceCandidateStats(std::string&& id, int64_t timestamp_us);
-  const char* type() const override;
-};
-
-// https://w3c.github.io/webrtc-stats/#msstats-dict*
-// TODO(hbos): Tracking bug crbug.com/660827
-class RTCMediaStreamStats final : public RTCStats {
- public:
-  WEBRTC_RTCSTATS_DECL();
-
-  RTCMediaStreamStats(const std::string& id, int64_t timestamp_us);
-  RTCMediaStreamStats(std::string&& id, int64_t timestamp_us);
-  RTCMediaStreamStats(const RTCMediaStreamStats& other);
-  ~RTCMediaStreamStats() override;
-
-  RTCStatsMember<std::string> stream_identifier;
-  RTCStatsMember<std::vector<std::string>> track_ids;
-};
-
-// https://w3c.github.io/webrtc-stats/#mststats-dict*
-// TODO(hbos): Tracking bug crbug.com/659137
-class RTCMediaStreamTrackStats final : public RTCStats {
- public:
-  WEBRTC_RTCSTATS_DECL();
-
-  RTCMediaStreamTrackStats(const std::string& id, int64_t timestamp_us,
-                           const char* kind);
-  RTCMediaStreamTrackStats(std::string&& id, int64_t timestamp_us,
-                           const char* kind);
-  RTCMediaStreamTrackStats(const RTCMediaStreamTrackStats& other);
-  ~RTCMediaStreamTrackStats() override;
-
-  RTCStatsMember<std::string> track_identifier;
-  RTCStatsMember<bool> remote_source;
-  RTCStatsMember<bool> ended;
-  // TODO(hbos): |RTCStatsCollector| does not return stats for detached tracks.
-  // crbug.com/659137
-  RTCStatsMember<bool> detached;
-  // See |RTCMediaStreamTrackKind| for valid values.
-  RTCStatsMember<std::string> kind;
-  // Video-only members
-  RTCStatsMember<uint32_t> frame_width;
-  RTCStatsMember<uint32_t> frame_height;
-  // TODO(hbos): Not collected by |RTCStatsCollector|. crbug.com/659137
-  RTCStatsMember<double> frames_per_second;
-  RTCStatsMember<uint32_t> frames_sent;
-  RTCStatsMember<uint32_t> frames_received;
-  RTCStatsMember<uint32_t> frames_decoded;
-  RTCStatsMember<uint32_t> frames_dropped;
-  // TODO(hbos): Not collected by |RTCStatsCollector|. crbug.com/659137
-  RTCStatsMember<uint32_t> frames_corrupted;
-  // TODO(hbos): Not collected by |RTCStatsCollector|. crbug.com/659137
-  RTCStatsMember<uint32_t> partial_frames_lost;
-  // TODO(hbos): Not collected by |RTCStatsCollector|. crbug.com/659137
-  RTCStatsMember<uint32_t> full_frames_lost;
-  // Audio-only members
-  RTCStatsMember<double> audio_level;
-  RTCStatsMember<double> total_audio_energy;
-  RTCStatsMember<double> echo_return_loss;
-  RTCStatsMember<double> echo_return_loss_enhancement;
-  RTCStatsMember<uint64_t> total_samples_received;
-  RTCStatsMember<double> total_samples_duration;
-  RTCStatsMember<uint64_t> concealed_samples;
-};
-
-// https://w3c.github.io/webrtc-stats/#pcstats-dict*
-class RTCPeerConnectionStats final : public RTCStats {
- public:
-  WEBRTC_RTCSTATS_DECL();
-
-  RTCPeerConnectionStats(const std::string& id, int64_t timestamp_us);
-  RTCPeerConnectionStats(std::string&& id, int64_t timestamp_us);
-  RTCPeerConnectionStats(const RTCPeerConnectionStats& other);
-  ~RTCPeerConnectionStats() override;
-
-  RTCStatsMember<uint32_t> data_channels_opened;
-  RTCStatsMember<uint32_t> data_channels_closed;
-};
-
-// https://w3c.github.io/webrtc-stats/#streamstats-dict*
-// TODO(hbos): Tracking bug crbug.com/657854
-class RTCRTPStreamStats : public RTCStats {
- public:
-  WEBRTC_RTCSTATS_DECL();
-
-  RTCRTPStreamStats(const RTCRTPStreamStats& other);
-  ~RTCRTPStreamStats() override;
-
-  RTCStatsMember<uint32_t> ssrc;
-  // TODO(hbos): When the remote case is supported |RTCStatsCollector| needs to
-  // set this. crbug.com/657855, 657856
-  RTCStatsMember<std::string> associate_stats_id;
-  // TODO(hbos): Remote case not supported by |RTCStatsCollector|.
-  // crbug.com/657855, 657856
-  RTCStatsMember<bool> is_remote;  // = false
-  RTCStatsMember<std::string> media_type;
-  RTCStatsMember<std::string> track_id;
-  RTCStatsMember<std::string> transport_id;
-  RTCStatsMember<std::string> codec_id;
-  // FIR and PLI counts are only defined for |media_type == "video"|.
-  RTCStatsMember<uint32_t> fir_count;
-  RTCStatsMember<uint32_t> pli_count;
-  // TODO(hbos): NACK count should be collected by |RTCStatsCollector| for both
-  // audio and video but is only defined in the "video" case. crbug.com/657856
-  RTCStatsMember<uint32_t> nack_count;
-  // TODO(hbos): Not collected by |RTCStatsCollector|. crbug.com/657854
-  // SLI count is only defined for |media_type == "video"|.
-  RTCStatsMember<uint32_t> sli_count;
-  RTCStatsMember<uint64_t> qp_sum;
-
- protected:
-  RTCRTPStreamStats(const std::string& id, int64_t timestamp_us);
-  RTCRTPStreamStats(std::string&& id, int64_t timestamp_us);
-};
-
-// https://w3c.github.io/webrtc-stats/#inboundrtpstats-dict*
-// TODO(hbos): Support the remote case |is_remote = true|.
-// https://bugs.webrtc.org/7065
-class RTCInboundRTPStreamStats final : public RTCRTPStreamStats {
- public:
-  WEBRTC_RTCSTATS_DECL();
-
-  RTCInboundRTPStreamStats(const std::string& id, int64_t timestamp_us);
-  RTCInboundRTPStreamStats(std::string&& id, int64_t timestamp_us);
-  RTCInboundRTPStreamStats(const RTCInboundRTPStreamStats& other);
-  ~RTCInboundRTPStreamStats() override;
-
-  RTCStatsMember<uint32_t> packets_received;
-  RTCStatsMember<uint64_t> bytes_received;
-  RTCStatsMember<uint32_t> packets_lost;
-  // TODO(hbos): Collect and populate this value for both "audio" and "video",
-  // currently not collected for "video". https://bugs.webrtc.org/7065
-  RTCStatsMember<double> jitter;
-  RTCStatsMember<double> fraction_lost;
-  // TODO(hbos): Collect and populate this value. https://bugs.webrtc.org/7065
-  RTCStatsMember<double> round_trip_time;
-  // TODO(hbos): Collect and populate this value. https://bugs.webrtc.org/7065
-  RTCStatsMember<uint32_t> packets_discarded;
-  // TODO(hbos): Collect and populate this value. https://bugs.webrtc.org/7065
-  RTCStatsMember<uint32_t> packets_repaired;
-  // TODO(hbos): Collect and populate this value. https://bugs.webrtc.org/7065
-  RTCStatsMember<uint32_t> burst_packets_lost;
-  // TODO(hbos): Collect and populate this value. https://bugs.webrtc.org/7065
-  RTCStatsMember<uint32_t> burst_packets_discarded;
-  // TODO(hbos): Collect and populate this value. https://bugs.webrtc.org/7065
-  RTCStatsMember<uint32_t> burst_loss_count;
-  // TODO(hbos): Collect and populate this value. https://bugs.webrtc.org/7065
-  RTCStatsMember<uint32_t> burst_discard_count;
-  // TODO(hbos): Collect and populate this value. https://bugs.webrtc.org/7065
-  RTCStatsMember<double> burst_loss_rate;
-  // TODO(hbos): Collect and populate this value. https://bugs.webrtc.org/7065
-  RTCStatsMember<double> burst_discard_rate;
-  // TODO(hbos): Collect and populate this value. https://bugs.webrtc.org/7065
-  RTCStatsMember<double> gap_loss_rate;
-  // TODO(hbos): Collect and populate this value. https://bugs.webrtc.org/7065
-  RTCStatsMember<double> gap_discard_rate;
-  RTCStatsMember<uint32_t> frames_decoded;
-};
-
-// https://w3c.github.io/webrtc-stats/#outboundrtpstats-dict*
-// TODO(hbos): Support the remote case |is_remote = true|.
-// https://bugs.webrtc.org/7066
-class RTCOutboundRTPStreamStats final : public RTCRTPStreamStats {
- public:
-  WEBRTC_RTCSTATS_DECL();
-
-  RTCOutboundRTPStreamStats(const std::string& id, int64_t timestamp_us);
-  RTCOutboundRTPStreamStats(std::string&& id, int64_t timestamp_us);
-  RTCOutboundRTPStreamStats(const RTCOutboundRTPStreamStats& other);
-  ~RTCOutboundRTPStreamStats() override;
-
-  RTCStatsMember<uint32_t> packets_sent;
-  RTCStatsMember<uint64_t> bytes_sent;
-  // TODO(hbos): Collect and populate this value. https://bugs.webrtc.org/7066
-  RTCStatsMember<double> target_bitrate;
-  RTCStatsMember<uint32_t> frames_encoded;
-};
-
-// https://w3c.github.io/webrtc-stats/#transportstats-dict*
-class RTCTransportStats final : public RTCStats {
- public:
-  WEBRTC_RTCSTATS_DECL();
-
-  RTCTransportStats(const std::string& id, int64_t timestamp_us);
-  RTCTransportStats(std::string&& id, int64_t timestamp_us);
-  RTCTransportStats(const RTCTransportStats& other);
-  ~RTCTransportStats() override;
-
-  RTCStatsMember<uint64_t> bytes_sent;
-  RTCStatsMember<uint64_t> bytes_received;
-  RTCStatsMember<std::string> rtcp_transport_stats_id;
-  // TODO(hbos): Support enum types? "RTCStatsMember<RTCDtlsTransportState>"?
-  RTCStatsMember<std::string> dtls_state;
-  RTCStatsMember<std::string> selected_candidate_pair_id;
-  RTCStatsMember<std::string> local_certificate_id;
-  RTCStatsMember<std::string> remote_certificate_id;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_API_STATS_RTCSTATS_OBJECTS_H_
diff --git a/api/stats/rtcstatscollectorcallback.h b/api/stats/rtcstatscollectorcallback.h
deleted file mode 100644
index 90e6085..0000000
--- a/api/stats/rtcstatscollectorcallback.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- *  Copyright 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_API_STATS_RTCSTATSCOLLECTORCALLBACK_H_
-#define WEBRTC_API_STATS_RTCSTATSCOLLECTORCALLBACK_H_
-
-#include "webrtc/api/stats/rtcstatsreport.h"
-#include "webrtc/rtc_base/refcount.h"
-#include "webrtc/rtc_base/scoped_ref_ptr.h"
-
-namespace webrtc {
-
-class RTCStatsCollectorCallback : public virtual rtc::RefCountInterface {
- public:
-  virtual ~RTCStatsCollectorCallback() {}
-
-  virtual void OnStatsDelivered(
-      const rtc::scoped_refptr<const RTCStatsReport>& report) = 0;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_API_STATS_RTCSTATSCOLLECTORCALLBACK_H_
diff --git a/api/stats/rtcstatsreport.h b/api/stats/rtcstatsreport.h
deleted file mode 100644
index 3efe6c9..0000000
--- a/api/stats/rtcstatsreport.h
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- *  Copyright 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_API_STATS_RTCSTATSREPORT_H_
-#define WEBRTC_API_STATS_RTCSTATSREPORT_H_
-
-#include <map>
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "webrtc/api/stats/rtcstats.h"
-#include "webrtc/rtc_base/refcount.h"
-#include "webrtc/rtc_base/scoped_ref_ptr.h"
-
-namespace webrtc {
-
-// A collection of stats.
-// This is accessible as a map from |RTCStats::id| to |RTCStats|.
-class RTCStatsReport : public rtc::RefCountInterface {
- public:
-  typedef std::map<std::string, std::unique_ptr<const RTCStats>> StatsMap;
-
-  class ConstIterator {
-   public:
-    ConstIterator(const ConstIterator&& other);
-    ~ConstIterator();
-
-    ConstIterator& operator++();
-    ConstIterator& operator++(int);
-    const RTCStats& operator*() const;
-    const RTCStats* operator->() const;
-    bool operator==(const ConstIterator& other) const;
-    bool operator!=(const ConstIterator& other) const;
-
-   private:
-    friend class RTCStatsReport;
-    ConstIterator(const rtc::scoped_refptr<const RTCStatsReport>& report,
-                  StatsMap::const_iterator it);
-
-    // Reference report to make sure it is kept alive.
-    rtc::scoped_refptr<const RTCStatsReport> report_;
-    StatsMap::const_iterator it_;
-  };
-
-  // TODO(hbos): Remove "= 0" once Chromium unittest has been updated to call
-  // with a parameter. crbug.com/627816
-  static rtc::scoped_refptr<RTCStatsReport> Create(int64_t timestamp_us = 0);
-
-  explicit RTCStatsReport(int64_t timestamp_us);
-  RTCStatsReport(const RTCStatsReport& other) = delete;
-
-  int64_t timestamp_us() const { return timestamp_us_; }
-  void AddStats(std::unique_ptr<const RTCStats> stats);
-  const RTCStats* Get(const std::string& id) const;
-  size_t size() const { return stats_.size(); }
-
-  // Takes ownership of all the stats in |victim|, leaving it empty.
-  void TakeMembersFrom(rtc::scoped_refptr<RTCStatsReport> victim);
-
-  // Stats iterators. Stats are ordered lexicographically on |RTCStats::id|.
-  ConstIterator begin() const;
-  ConstIterator end() const;
-
-  // Gets the subset of stats that are of type |T|, where |T| is any class
-  // descending from |RTCStats|.
-  template<typename T>
-  std::vector<const T*> GetStatsOfType() const {
-    std::vector<const T*> stats_of_type;
-    for (const RTCStats& stats : *this) {
-      if (stats.type() == T::kType)
-        stats_of_type.push_back(&stats.cast_to<const T>());
-    }
-    return stats_of_type;
-  }
-
-  // Creates a JSON readable string representation of the report,
-  // listing all of its stats objects.
-  std::string ToJson() const;
-
-  friend class rtc::RefCountedObject<RTCStatsReport>;
-
- private:
-  ~RTCStatsReport() override;
-
-  int64_t timestamp_us_;
-  StatsMap stats_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_API_STATS_RTCSTATSREPORT_H_
diff --git a/api/statstypes.cc b/api/statstypes.cc
deleted file mode 100644
index 687b6b2..0000000
--- a/api/statstypes.cc
+++ /dev/null
@@ -1,821 +0,0 @@
-/*
- *  Copyright 2014 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/api/statstypes.h"
-
-#include <string.h>
-
-#include "webrtc/rtc_base/checks.h"
-
-// TODO(tommi): Could we have a static map of value name -> expected type
-// and use this to RTC_DCHECK on correct usage (somewhat strongly typed values)?
-// Alternatively, we could define the names+type in a separate document and
-// generate strongly typed inline C++ code that forces the correct type to be
-// used for a given name at compile time.
-
-using rtc::RefCountedObject;
-
-namespace webrtc {
-namespace {
-
-// The id of StatsReport of type kStatsReportTypeBwe.
-const char kStatsReportVideoBweId[] = "bweforvideo";
-
-// NOTE: These names need to be consistent with an external
-// specification (W3C Stats Identifiers).
-const char* InternalTypeToString(StatsReport::StatsType type) {
-  switch (type) {
-    case StatsReport::kStatsReportTypeSession:
-      return "googLibjingleSession";
-    case StatsReport::kStatsReportTypeBwe:
-      return "VideoBwe";
-    case StatsReport::kStatsReportTypeRemoteSsrc:
-      return "remoteSsrc";
-    case StatsReport::kStatsReportTypeSsrc:
-      return "ssrc";
-    case StatsReport::kStatsReportTypeTrack:
-      return "googTrack";
-    case StatsReport::kStatsReportTypeIceLocalCandidate:
-      return "localcandidate";
-    case StatsReport::kStatsReportTypeIceRemoteCandidate:
-      return "remotecandidate";
-    case StatsReport::kStatsReportTypeTransport:
-      return "transport";
-    case StatsReport::kStatsReportTypeComponent:
-      return "googComponent";
-    case StatsReport::kStatsReportTypeCandidatePair:
-      return "googCandidatePair";
-    case StatsReport::kStatsReportTypeCertificate:
-      return "googCertificate";
-    case StatsReport::kStatsReportTypeDataChannel:
-      return "datachannel";
-  }
-  RTC_NOTREACHED();
-  return nullptr;
-}
-
-class BandwidthEstimationId : public StatsReport::IdBase {
- public:
-  BandwidthEstimationId()
-      : StatsReport::IdBase(StatsReport::kStatsReportTypeBwe) {}
-  std::string ToString() const override { return kStatsReportVideoBweId; }
-};
-
-class TypedId : public StatsReport::IdBase {
- public:
-  TypedId(StatsReport::StatsType type, const std::string& id)
-      : StatsReport::IdBase(type), id_(id) {}
-
-  bool Equals(const IdBase& other) const override {
-    return IdBase::Equals(other) &&
-           static_cast<const TypedId&>(other).id_ == id_;
-  }
-
-  std::string ToString() const override {
-    return std::string(InternalTypeToString(type_)) + kSeparator + id_;
-  }
-
- protected:
-  const std::string id_;
-};
-
-class TypedIntId : public StatsReport::IdBase {
- public:
-  TypedIntId(StatsReport::StatsType type, int id)
-      : StatsReport::IdBase(type), id_(id) {}
-
-  bool Equals(const IdBase& other) const override {
-    return IdBase::Equals(other) &&
-           static_cast<const TypedIntId&>(other).id_ == id_;
-  }
-
-  std::string ToString() const override {
-    return std::string(InternalTypeToString(type_)) +
-           kSeparator +
-           rtc::ToString<int>(id_);
-  }
-
- protected:
-  const int id_;
-};
-
-class IdWithDirection : public TypedId {
- public:
-  IdWithDirection(StatsReport::StatsType type, const std::string& id,
-                  StatsReport::Direction direction)
-      : TypedId(type, id), direction_(direction) {}
-
-  bool Equals(const IdBase& other) const override {
-    return TypedId::Equals(other) &&
-           static_cast<const IdWithDirection&>(other).direction_ == direction_;
-  }
-
-  std::string ToString() const override {
-    std::string ret(TypedId::ToString());
-    ret += kSeparator;
-    ret += direction_ == StatsReport::kSend ? "send" : "recv";
-    return ret;
-  }
-
- private:
-  const StatsReport::Direction direction_;
-};
-
-class CandidateId : public TypedId {
- public:
-  CandidateId(bool local, const std::string& id)
-      : TypedId(local ?
-                    StatsReport::kStatsReportTypeIceLocalCandidate :
-                    StatsReport::kStatsReportTypeIceRemoteCandidate,
-                id) {
-  }
-
-  std::string ToString() const override {
-    return "Cand-" + id_;
-  }
-};
-
-class ComponentId : public StatsReport::IdBase {
- public:
-  ComponentId(const std::string& content_name, int component)
-      : ComponentId(StatsReport::kStatsReportTypeComponent, content_name,
-            component) {}
-
-  bool Equals(const IdBase& other) const override {
-    return IdBase::Equals(other) &&
-        static_cast<const ComponentId&>(other).component_ == component_ &&
-        static_cast<const ComponentId&>(other).content_name_ == content_name_;
-  }
-
-  std::string ToString() const override {
-    return ToString("Channel-");
-  }
-
- protected:
-  ComponentId(StatsReport::StatsType type, const std::string& content_name,
-              int component)
-      : IdBase(type),
-        content_name_(content_name),
-        component_(component) {}
-
-  std::string ToString(const char* prefix) const {
-    std::string ret(prefix);
-    ret += content_name_;
-    ret += '-';
-    ret += rtc::ToString<>(component_);
-    return ret;
-  }
-
- private:
-  const std::string content_name_;
-  const int component_;
-};
-
-class CandidatePairId : public ComponentId {
- public:
-  CandidatePairId(const std::string& content_name, int component, int index)
-      : ComponentId(StatsReport::kStatsReportTypeCandidatePair, content_name,
-            component),
-        index_(index) {}
-
-  bool Equals(const IdBase& other) const override {
-    return ComponentId::Equals(other) &&
-        static_cast<const CandidatePairId&>(other).index_ == index_;
-  }
-
-  std::string ToString() const override {
-    std::string ret(ComponentId::ToString("Conn-"));
-    ret += '-';
-    ret += rtc::ToString<>(index_);
-    return ret;
-  }
-
- private:
-  const int index_;
-};
-
-}  // namespace
-
-StatsReport::IdBase::IdBase(StatsType type) : type_(type) {}
-StatsReport::IdBase::~IdBase() {}
-
-StatsReport::StatsType StatsReport::IdBase::type() const { return type_; }
-
-bool StatsReport::IdBase::Equals(const IdBase& other) const {
-  return other.type_ == type_;
-}
-
-StatsReport::Value::Value(StatsValueName name, int64_t value, Type int_type)
-    : name(name), type_(int_type) {
-  RTC_DCHECK(type_ == kInt || type_ == kInt64);
-  type_ == kInt ? value_.int_ = static_cast<int>(value) : value_.int64_ = value;
-}
-
-StatsReport::Value::Value(StatsValueName name, float f)
-    : name(name), type_(kFloat) {
-  value_.float_ = f;
-}
-
-StatsReport::Value::Value(StatsValueName name, const std::string& value)
-    : name(name), type_(kString) {
-  value_.string_ = new std::string(value);
-}
-
-StatsReport::Value::Value(StatsValueName name, const char* value)
-    : name(name), type_(kStaticString) {
-  value_.static_string_ = value;
-}
-
-StatsReport::Value::Value(StatsValueName name, bool b)
-    : name(name), type_(kBool) {
-  value_.bool_ = b;
-}
-
-StatsReport::Value::Value(StatsValueName name, const Id& value)
-    : name(name), type_(kId) {
-  value_.id_ = new Id(value);
-}
-
-StatsReport::Value::~Value() {
-  switch (type_) {
-    case kInt:
-    case kInt64:
-    case kFloat:
-    case kBool:
-    case kStaticString:
-      break;
-    case kString:
-      delete value_.string_;
-      break;
-    case kId:
-      delete value_.id_;
-      break;
-  }
-}
-
-bool StatsReport::Value::Equals(const Value& other) const {
-  if (name != other.name)
-    return false;
-
-  // There's a 1:1 relation between a name and a type, so we don't have to
-  // check that.
-  RTC_DCHECK_EQ(type_, other.type_);
-
-  switch (type_) {
-    case kInt:
-      return value_.int_ == other.value_.int_;
-    case kInt64:
-      return value_.int64_ == other.value_.int64_;
-    case kFloat:
-      return value_.float_ == other.value_.float_;
-    case kStaticString: {
-#if RTC_DCHECK_IS_ON
-      if (value_.static_string_ != other.value_.static_string_) {
-        RTC_DCHECK(strcmp(value_.static_string_, other.value_.static_string_) !=
-                   0)
-            << "Duplicate global?";
-      }
-#endif
-      return value_.static_string_ == other.value_.static_string_;
-    }
-    case kString:
-      return *value_.string_ == *other.value_.string_;
-    case kBool:
-      return value_.bool_ == other.value_.bool_;
-    case kId:
-      return (*value_.id_)->Equals(*other.value_.id_);
-  }
-  RTC_NOTREACHED();
-  return false;
-}
-
-bool StatsReport::Value::operator==(const std::string& value) const {
-  return (type_ == kString && value_.string_->compare(value) == 0) ||
-         (type_ == kStaticString && value.compare(value_.static_string_) == 0);
-}
-
-bool StatsReport::Value::operator==(const char* value) const {
-  if (type_ == kString)
-    return value_.string_->compare(value) == 0;
-  if (type_ != kStaticString)
-    return false;
-#if RTC_DCHECK_IS_ON
-  if (value_.static_string_ != value)
-    RTC_DCHECK(strcmp(value_.static_string_, value) != 0)
-        << "Duplicate global?";
-#endif
-  return value == value_.static_string_;
-}
-
-bool StatsReport::Value::operator==(int64_t value) const {
-  return type_ == kInt ? value_.int_ == static_cast<int>(value) :
-      (type_ == kInt64 ? value_.int64_ == value : false);
-}
-
-bool StatsReport::Value::operator==(bool value) const {
-  return type_ == kBool && value_.bool_ == value;
-}
-
-bool StatsReport::Value::operator==(float value) const {
-  return type_ == kFloat && value_.float_ == value;
-}
-
-bool StatsReport::Value::operator==(const Id& value) const {
-  return type_ == kId && (*value_.id_)->Equals(value);
-}
-
-int StatsReport::Value::int_val() const {
-  RTC_DCHECK(type_ == kInt);
-  return value_.int_;
-}
-
-int64_t StatsReport::Value::int64_val() const {
-  RTC_DCHECK(type_ == kInt64);
-  return value_.int64_;
-}
-
-float StatsReport::Value::float_val() const {
-  RTC_DCHECK(type_ == kFloat);
-  return value_.float_;
-}
-
-const char* StatsReport::Value::static_string_val() const {
-  RTC_DCHECK(type_ == kStaticString);
-  return value_.static_string_;
-}
-
-const std::string& StatsReport::Value::string_val() const {
-  RTC_DCHECK(type_ == kString);
-  return *value_.string_;
-}
-
-bool StatsReport::Value::bool_val() const {
-  RTC_DCHECK(type_ == kBool);
-  return value_.bool_;
-}
-
-const char* StatsReport::Value::display_name() const {
-  switch (name) {
-    case kStatsValueNameAecDivergentFilterFraction:
-      return "aecDivergentFilterFraction";
-    case kStatsValueNameAudioOutputLevel:
-      return "audioOutputLevel";
-    case kStatsValueNameAudioInputLevel:
-      return "audioInputLevel";
-    case kStatsValueNameBytesSent:
-      return "bytesSent";
-    case kStatsValueNameConcealedSamples:
-      return "concealedSamples";
-    case kStatsValueNamePacketsSent:
-      return "packetsSent";
-    case kStatsValueNameBytesReceived:
-      return "bytesReceived";
-    case kStatsValueNameLabel:
-      return "label";
-    case kStatsValueNamePacketsReceived:
-      return "packetsReceived";
-    case kStatsValueNamePacketsLost:
-      return "packetsLost";
-    case kStatsValueNameProtocol:
-      return "protocol";
-    case kStatsValueNameTotalSamplesReceived:
-      return "totalSamplesReceived";
-    case kStatsValueNameTransportId:
-      return "transportId";
-    case kStatsValueNameSelectedCandidatePairId:
-      return "selectedCandidatePairId";
-    case kStatsValueNameSsrc:
-      return "ssrc";
-    case kStatsValueNameState:
-      return "state";
-    case kStatsValueNameDataChannelId:
-      return "datachannelid";
-    case kStatsValueNameFramesDecoded:
-      return "framesDecoded";
-    case kStatsValueNameFramesEncoded:
-      return "framesEncoded";
-    case kStatsValueNameCodecImplementationName:
-      return "codecImplementationName";
-    case kStatsValueNameMediaType:
-      return "mediaType";
-    case kStatsValueNameQpSum:
-      return "qpSum";
-    // 'goog' prefixed constants.
-    case kStatsValueNameAccelerateRate:
-      return "googAccelerateRate";
-    case kStatsValueNameActiveConnection:
-      return "googActiveConnection";
-    case kStatsValueNameActualEncBitrate:
-      return "googActualEncBitrate";
-    case kStatsValueNameAvailableReceiveBandwidth:
-      return "googAvailableReceiveBandwidth";
-    case kStatsValueNameAvailableSendBandwidth:
-      return "googAvailableSendBandwidth";
-    case kStatsValueNameAvgEncodeMs:
-      return "googAvgEncodeMs";
-    case kStatsValueNameBucketDelay:
-      return "googBucketDelay";
-    case kStatsValueNameBandwidthLimitedResolution:
-      return "googBandwidthLimitedResolution";
-    // STUN ping related attributes.
-    // TODO(zhihuang) Rename these stats to follow the standards.
-    case kStatsValueNameSentPingRequestsTotal:
-      return "requestsSent";
-    case kStatsValueNameSentPingRequestsBeforeFirstResponse:
-      return "consentRequestsSent";
-    case kStatsValueNameSentPingResponses:
-      return "responsesSent";
-    case kStatsValueNameRecvPingRequests:
-      return "requestsReceived";
-    case kStatsValueNameRecvPingResponses:
-      return "responsesReceived";
-
-    // Candidate related attributes. Values are taken from
-    // http://w3c.github.io/webrtc-stats/#rtcstatstype-enum*.
-    case kStatsValueNameCandidateIPAddress:
-      return "ipAddress";
-    case kStatsValueNameCandidateNetworkType:
-      return "networkType";
-    case kStatsValueNameCandidatePortNumber:
-      return "portNumber";
-    case kStatsValueNameCandidatePriority:
-      return "priority";
-    case kStatsValueNameCandidateTransportType:
-      return "transport";
-    case kStatsValueNameCandidateType:
-      return "candidateType";
-
-    case kStatsValueNameChannelId:
-      return "googChannelId";
-    case kStatsValueNameCodecName:
-      return "googCodecName";
-    case kStatsValueNameComponent:
-      return "googComponent";
-    case kStatsValueNameContentName:
-      return "googContentName";
-    case kStatsValueNameContentType:
-      return "googContentType";
-    case kStatsValueNameCpuLimitedResolution:
-      return "googCpuLimitedResolution";
-    case kStatsValueNameDecodingCTSG:
-      return "googDecodingCTSG";
-    case kStatsValueNameDecodingCTN:
-      return "googDecodingCTN";
-    case kStatsValueNameDecodingMutedOutput:
-      return "googDecodingMuted";
-    case kStatsValueNameDecodingNormal:
-      return "googDecodingNormal";
-    case kStatsValueNameDecodingPLC:
-      return "googDecodingPLC";
-    case kStatsValueNameDecodingCNG:
-      return "googDecodingCNG";
-    case kStatsValueNameDecodingPLCCNG:
-      return "googDecodingPLCCNG";
-    case kStatsValueNameDer:
-      return "googDerBase64";
-    case kStatsValueNameDtlsCipher:
-      return "dtlsCipher";
-    case kStatsValueNameEchoCancellationQualityMin:
-      return "googEchoCancellationQualityMin";
-    case kStatsValueNameEchoDelayMedian:
-      return "googEchoCancellationEchoDelayMedian";
-    case kStatsValueNameEchoDelayStdDev:
-      return "googEchoCancellationEchoDelayStdDev";
-    case kStatsValueNameEchoReturnLoss:
-      return "googEchoCancellationReturnLoss";
-    case kStatsValueNameEchoReturnLossEnhancement:
-      return "googEchoCancellationReturnLossEnhancement";
-    case kStatsValueNameEncodeUsagePercent:
-      return "googEncodeUsagePercent";
-    case kStatsValueNameExpandRate:
-      return "googExpandRate";
-    case kStatsValueNameFingerprint:
-      return "googFingerprint";
-    case kStatsValueNameFingerprintAlgorithm:
-      return "googFingerprintAlgorithm";
-    case kStatsValueNameFirsReceived:
-      return "googFirsReceived";
-    case kStatsValueNameFirsSent:
-      return "googFirsSent";
-    case kStatsValueNameFrameHeightInput:
-      return "googFrameHeightInput";
-    case kStatsValueNameFrameHeightReceived:
-      return "googFrameHeightReceived";
-    case kStatsValueNameFrameHeightSent:
-      return "googFrameHeightSent";
-    case kStatsValueNameFrameRateReceived:
-      return "googFrameRateReceived";
-    case kStatsValueNameFrameRateDecoded:
-      return "googFrameRateDecoded";
-    case kStatsValueNameFrameRateOutput:
-      return "googFrameRateOutput";
-    case kStatsValueNameDecodeMs:
-      return "googDecodeMs";
-    case kStatsValueNameMaxDecodeMs:
-      return "googMaxDecodeMs";
-    case kStatsValueNameCurrentDelayMs:
-      return "googCurrentDelayMs";
-    case kStatsValueNameTargetDelayMs:
-      return "googTargetDelayMs";
-    case kStatsValueNameJitterBufferMs:
-      return "googJitterBufferMs";
-    case kStatsValueNameMinPlayoutDelayMs:
-      return "googMinPlayoutDelayMs";
-    case kStatsValueNameRenderDelayMs:
-      return "googRenderDelayMs";
-    case kStatsValueNameCaptureStartNtpTimeMs:
-      return "googCaptureStartNtpTimeMs";
-    case kStatsValueNameFrameRateInput:
-      return "googFrameRateInput";
-    case kStatsValueNameFrameRateSent:
-      return "googFrameRateSent";
-    case kStatsValueNameFrameWidthInput:
-      return "googFrameWidthInput";
-    case kStatsValueNameFrameWidthReceived:
-      return "googFrameWidthReceived";
-    case kStatsValueNameFrameWidthSent:
-      return "googFrameWidthSent";
-    case kStatsValueNameInitiator:
-      return "googInitiator";
-    case kStatsValueNameInterframeDelayMaxMs:
-      return "googInterframeDelayMax";
-    case kStatsValueNameIssuerId:
-      return "googIssuerId";
-    case kStatsValueNameJitterReceived:
-      return "googJitterReceived";
-    case kStatsValueNameLocalAddress:
-      return "googLocalAddress";
-    case kStatsValueNameLocalCandidateId:
-      return "localCandidateId";
-    case kStatsValueNameLocalCandidateType:
-      return "googLocalCandidateType";
-    case kStatsValueNameLocalCertificateId:
-      return "localCertificateId";
-    case kStatsValueNameAdaptationChanges:
-      return "googAdaptationChanges";
-    case kStatsValueNameNacksReceived:
-      return "googNacksReceived";
-    case kStatsValueNameNacksSent:
-      return "googNacksSent";
-    case kStatsValueNamePreemptiveExpandRate:
-      return "googPreemptiveExpandRate";
-    case kStatsValueNamePlisReceived:
-      return "googPlisReceived";
-    case kStatsValueNamePlisSent:
-      return "googPlisSent";
-    case kStatsValueNamePreferredJitterBufferMs:
-      return "googPreferredJitterBufferMs";
-    case kStatsValueNameReceiving:
-      return "googReadable";
-    case kStatsValueNameRemoteAddress:
-      return "googRemoteAddress";
-    case kStatsValueNameRemoteCandidateId:
-      return "remoteCandidateId";
-    case kStatsValueNameRemoteCandidateType:
-      return "googRemoteCandidateType";
-    case kStatsValueNameRemoteCertificateId:
-      return "remoteCertificateId";
-    case kStatsValueNameResidualEchoLikelihood:
-      return "googResidualEchoLikelihood";
-    case kStatsValueNameResidualEchoLikelihoodRecentMax:
-      return "googResidualEchoLikelihoodRecentMax";
-    case kStatsValueNameAnaBitrateActionCounter:
-      return "googAnaBitrateActionCounter";
-    case kStatsValueNameAnaChannelActionCounter:
-      return "googAnaChannelActionCounter";
-    case kStatsValueNameAnaDtxActionCounter:
-      return "googAnaDtxActionCounter";
-    case kStatsValueNameAnaFecActionCounter:
-      return "googAnaFecActionCounter";
-    case kStatsValueNameAnaFrameLengthIncreaseCounter:
-      return "googAnaFrameLengthIncreaseCounter";
-    case kStatsValueNameAnaFrameLengthDecreaseCounter:
-      return "googAnaFrameLengthDecreaseCounter";
-    case kStatsValueNameAnaUplinkPacketLossFraction:
-      return "googAnaUplinkPacketLossFraction";
-    case kStatsValueNameRetransmitBitrate:
-      return "googRetransmitBitrate";
-    case kStatsValueNameRtt:
-      return "googRtt";
-    case kStatsValueNameSecondaryDecodedRate:
-      return "googSecondaryDecodedRate";
-    case kStatsValueNameSecondaryDiscardedRate:
-      return "googSecondaryDiscardedRate";
-    case kStatsValueNameSendPacketsDiscarded:
-      return "packetsDiscardedOnSend";
-    case kStatsValueNameSpeechExpandRate:
-      return "googSpeechExpandRate";
-    case kStatsValueNameSrtpCipher:
-      return "srtpCipher";
-    case kStatsValueNameTargetEncBitrate:
-      return "googTargetEncBitrate";
-    case kStatsValueNameTotalAudioEnergy:
-      return "totalAudioEnergy";
-    case kStatsValueNameTotalSamplesDuration:
-      return "totalSamplesDuration";
-    case kStatsValueNameTransmitBitrate:
-      return "googTransmitBitrate";
-    case kStatsValueNameTransportType:
-      return "googTransportType";
-    case kStatsValueNameTrackId:
-      return "googTrackId";
-    case kStatsValueNameTimingFrameInfo:
-      return "googTimingFrameInfo";
-    case kStatsValueNameTypingNoiseState:
-      return "googTypingNoiseState";
-    case kStatsValueNameWritable:
-      return "googWritable";
-  }
-
-  return nullptr;
-}
-
-std::string StatsReport::Value::ToString() const {
-  switch (type_) {
-    case kInt:
-      return rtc::ToString(value_.int_);
-    case kInt64:
-      return rtc::ToString(value_.int64_);
-    case kFloat:
-      return rtc::ToString(value_.float_);
-    case kStaticString:
-      return std::string(value_.static_string_);
-    case kString:
-      return *value_.string_;
-    case kBool:
-      return value_.bool_ ? "true" : "false";
-    case kId:
-      return (*value_.id_)->ToString();
-  }
-  RTC_NOTREACHED();
-  return std::string();
-}
-
-StatsReport::StatsReport(const Id& id) : id_(id), timestamp_(0.0) {
-  RTC_DCHECK(id_.get());
-}
-
-StatsReport::~StatsReport() = default;
-
-// static
-StatsReport::Id StatsReport::NewBandwidthEstimationId() {
-  return Id(new RefCountedObject<BandwidthEstimationId>());
-}
-
-// static
-StatsReport::Id StatsReport::NewTypedId(StatsType type, const std::string& id) {
-  return Id(new RefCountedObject<TypedId>(type, id));
-}
-
-// static
-StatsReport::Id StatsReport::NewTypedIntId(StatsType type, int id) {
-  return Id(new RefCountedObject<TypedIntId>(type, id));
-}
-
-// static
-StatsReport::Id StatsReport::NewIdWithDirection(
-    StatsType type, const std::string& id, StatsReport::Direction direction) {
-  return Id(new RefCountedObject<IdWithDirection>(type, id, direction));
-}
-
-// static
-StatsReport::Id StatsReport::NewCandidateId(bool local, const std::string& id) {
-  return Id(new RefCountedObject<CandidateId>(local, id));
-}
-
-// static
-StatsReport::Id StatsReport::NewComponentId(
-    const std::string& content_name, int component) {
-  return Id(new RefCountedObject<ComponentId>(content_name, component));
-}
-
-// static
-StatsReport::Id StatsReport::NewCandidatePairId(
-    const std::string& content_name, int component, int index) {
-  return Id(new RefCountedObject<CandidatePairId>(
-      content_name, component, index));
-}
-
-const char* StatsReport::TypeToString() const {
-  return InternalTypeToString(id_->type());
-}
-
-void StatsReport::AddString(StatsReport::StatsValueName name,
-                            const std::string& value) {
-  const Value* found = FindValue(name);
-  if (!found || !(*found == value))
-    values_[name] = ValuePtr(new Value(name, value));
-}
-
-void StatsReport::AddString(StatsReport::StatsValueName name,
-                            const char* value) {
-  const Value* found = FindValue(name);
-  if (!found || !(*found == value))
-    values_[name] = ValuePtr(new Value(name, value));
-}
-
-void StatsReport::AddInt64(StatsReport::StatsValueName name, int64_t value) {
-  const Value* found = FindValue(name);
-  if (!found || !(*found == value))
-    values_[name] = ValuePtr(new Value(name, value, Value::kInt64));
-}
-
-void StatsReport::AddInt(StatsReport::StatsValueName name, int value) {
-  const Value* found = FindValue(name);
-  if (!found || !(*found == static_cast<int64_t>(value)))
-    values_[name] = ValuePtr(new Value(name, value, Value::kInt));
-}
-
-void StatsReport::AddFloat(StatsReport::StatsValueName name, float value) {
-  const Value* found = FindValue(name);
-  if (!found || !(*found == value))
-    values_[name] = ValuePtr(new Value(name, value));
-}
-
-void StatsReport::AddBoolean(StatsReport::StatsValueName name, bool value) {
-  const Value* found = FindValue(name);
-  if (!found || !(*found == value))
-    values_[name] = ValuePtr(new Value(name, value));
-}
-
-void StatsReport::AddId(StatsReport::StatsValueName name,
-                        const Id& value) {
-  const Value* found = FindValue(name);
-  if (!found || !(*found == value))
-    values_[name] = ValuePtr(new Value(name, value));
-}
-
-const StatsReport::Value* StatsReport::FindValue(StatsValueName name) const {
-  Values::const_iterator it = values_.find(name);
-  return it == values_.end() ? nullptr : it->second.get();
-}
-
-StatsCollection::StatsCollection() {
-}
-
-StatsCollection::~StatsCollection() {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  for (auto* r : list_)
-    delete r;
-}
-
-StatsCollection::const_iterator StatsCollection::begin() const {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  return list_.begin();
-}
-
-StatsCollection::const_iterator StatsCollection::end() const {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  return list_.end();
-}
-
-size_t StatsCollection::size() const {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  return list_.size();
-}
-
-StatsReport* StatsCollection::InsertNew(const StatsReport::Id& id) {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  RTC_DCHECK(Find(id) == nullptr);
-  StatsReport* report = new StatsReport(id);
-  list_.push_back(report);
-  return report;
-}
-
-StatsReport* StatsCollection::FindOrAddNew(const StatsReport::Id& id) {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  StatsReport* ret = Find(id);
-  return ret ? ret : InsertNew(id);
-}
-
-StatsReport* StatsCollection::ReplaceOrAddNew(const StatsReport::Id& id) {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  RTC_DCHECK(id.get());
-  Container::iterator it = std::find_if(list_.begin(), list_.end(),
-      [&id](const StatsReport* r)->bool { return r->id()->Equals(id); });
-  if (it != end()) {
-    StatsReport* report = new StatsReport((*it)->id());
-    delete *it;
-    *it = report;
-    return report;
-  }
-  return InsertNew(id);
-}
-
-// Looks for a report with the given |id|.  If one is not found, null
-// will be returned.
-StatsReport* StatsCollection::Find(const StatsReport::Id& id) {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  Container::iterator it = std::find_if(list_.begin(), list_.end(),
-      [&id](const StatsReport* r)->bool { return r->id()->Equals(id); });
-  return it == list_.end() ? nullptr : *it;
-}
-
-}  // namespace webrtc
diff --git a/api/statstypes.h b/api/statstypes.h
deleted file mode 100644
index 6391ff5..0000000
--- a/api/statstypes.h
+++ /dev/null
@@ -1,444 +0,0 @@
-/*
- *  Copyright 2012 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.
- */
-
-// This file contains structures used for retrieving statistics from an ongoing
-// libjingle session.
-
-#ifndef WEBRTC_API_STATSTYPES_H_
-#define WEBRTC_API_STATSTYPES_H_
-
-#include <algorithm>
-#include <list>
-#include <map>
-#include <string>
-#include <vector>
-
-#include "webrtc/rtc_base/basictypes.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/refcount.h"
-#include "webrtc/rtc_base/scoped_ref_ptr.h"
-#include "webrtc/rtc_base/stringencode.h"
-#include "webrtc/rtc_base/thread_checker.h"
-
-namespace webrtc {
-
-class StatsReport {
- public:
-  // Indicates whether a track is for sending or receiving.
-  // Used in reports for audio/video tracks.
-  enum Direction {
-    kSend = 0,
-    kReceive,
-  };
-
-  enum StatsType {
-    // StatsReport types.
-    // A StatsReport of |type| = "googSession" contains overall information
-    // about the thing libjingle calls a session (which may contain one
-    // or more RTP sessions.
-    kStatsReportTypeSession,
-
-    // A StatsReport of |type| = "googTransport" contains information
-    // about a libjingle "transport".
-    kStatsReportTypeTransport,
-
-    // A StatsReport of |type| = "googComponent" contains information
-    // about a libjingle "channel" (typically, RTP or RTCP for a transport).
-    // This is intended to be the same thing as an ICE "Component".
-    kStatsReportTypeComponent,
-
-    // A StatsReport of |type| = "googCandidatePair" contains information
-    // about a libjingle "connection" - a single source/destination port pair.
-    // This is intended to be the same thing as an ICE "candidate pair".
-    kStatsReportTypeCandidatePair,
-
-    // A StatsReport of |type| = "VideoBWE" is statistics for video Bandwidth
-    // Estimation, which is global per-session.  The |id| field is "bweforvideo"
-    // (will probably change in the future).
-    kStatsReportTypeBwe,
-
-    // A StatsReport of |type| = "ssrc" is statistics for a specific rtp stream.
-    // The |id| field is the SSRC in decimal form of the rtp stream.
-    kStatsReportTypeSsrc,
-
-    // A StatsReport of |type| = "remoteSsrc" is statistics for a specific
-    // rtp stream, generated by the remote end of the connection.
-    kStatsReportTypeRemoteSsrc,
-
-    // A StatsReport of |type| = "googTrack" is statistics for a specific media
-    // track. The |id| field is the track id.
-    kStatsReportTypeTrack,
-
-    // A StatsReport of |type| = "localcandidate" or "remotecandidate" is
-    // attributes on a specific ICE Candidate. It links to its connection pair
-    // by candidate id. The string value is taken from
-    // http://w3c.github.io/webrtc-stats/#rtcstatstype-enum*.
-    kStatsReportTypeIceLocalCandidate,
-    kStatsReportTypeIceRemoteCandidate,
-
-    // A StatsReport of |type| = "googCertificate" contains an SSL certificate
-    // transmitted by one of the endpoints of this connection.  The |id| is
-    // controlled by the fingerprint, and is used to identify the certificate in
-    // the Channel stats (as "googLocalCertificateId" or
-    // "googRemoteCertificateId") and in any child certificates (as
-    // "googIssuerId").
-    kStatsReportTypeCertificate,
-
-    // A StatsReport of |type| = "datachannel" with statistics for a
-    // particular DataChannel.
-    kStatsReportTypeDataChannel,
-  };
-
-  enum StatsValueName {
-    kStatsValueNameActiveConnection,
-    kStatsValueNameAecDivergentFilterFraction,
-    kStatsValueNameAudioInputLevel,
-    kStatsValueNameAudioOutputLevel,
-    kStatsValueNameBytesReceived,
-    kStatsValueNameBytesSent,
-    kStatsValueNameCodecImplementationName,
-    kStatsValueNameConcealedSamples,
-    kStatsValueNameDataChannelId,
-    kStatsValueNameFramesDecoded,
-    kStatsValueNameFramesEncoded,
-    kStatsValueNameMediaType,
-    kStatsValueNamePacketsLost,
-    kStatsValueNamePacketsReceived,
-    kStatsValueNamePacketsSent,
-    kStatsValueNameProtocol,
-    kStatsValueNameQpSum,
-    kStatsValueNameReceiving,
-    kStatsValueNameSelectedCandidatePairId,
-    kStatsValueNameSsrc,
-    kStatsValueNameState,
-    kStatsValueNameTotalAudioEnergy,
-    kStatsValueNameTotalSamplesDuration,
-    kStatsValueNameTotalSamplesReceived,
-    kStatsValueNameTransportId,
-    kStatsValueNameSentPingRequestsTotal,
-    kStatsValueNameSentPingRequestsBeforeFirstResponse,
-    kStatsValueNameSentPingResponses,
-    kStatsValueNameRecvPingRequests,
-    kStatsValueNameRecvPingResponses,
-
-    // Internal StatsValue names.
-    kStatsValueNameAccelerateRate,
-    kStatsValueNameActualEncBitrate,
-    kStatsValueNameAdaptationChanges,
-    kStatsValueNameAvailableReceiveBandwidth,
-    kStatsValueNameAvailableSendBandwidth,
-    kStatsValueNameAvgEncodeMs,
-    kStatsValueNameBandwidthLimitedResolution,
-    kStatsValueNameBucketDelay,
-    kStatsValueNameCaptureStartNtpTimeMs,
-    kStatsValueNameCandidateIPAddress,
-    kStatsValueNameCandidateNetworkType,
-    kStatsValueNameCandidatePortNumber,
-    kStatsValueNameCandidatePriority,
-    kStatsValueNameCandidateTransportType,
-    kStatsValueNameCandidateType,
-    kStatsValueNameChannelId,
-    kStatsValueNameCodecName,
-    kStatsValueNameComponent,
-    kStatsValueNameContentName,
-    kStatsValueNameContentType,
-    kStatsValueNameCpuLimitedResolution,
-    kStatsValueNameCurrentDelayMs,
-    kStatsValueNameDecodeMs,
-    kStatsValueNameDecodingCNG,
-    kStatsValueNameDecodingCTN,
-    kStatsValueNameDecodingCTSG,
-    kStatsValueNameDecodingMutedOutput,
-    kStatsValueNameDecodingNormal,
-    kStatsValueNameDecodingPLC,
-    kStatsValueNameDecodingPLCCNG,
-    kStatsValueNameDer,
-    kStatsValueNameDtlsCipher,
-    kStatsValueNameEchoCancellationQualityMin,
-    kStatsValueNameEchoDelayMedian,
-    kStatsValueNameEchoDelayStdDev,
-    kStatsValueNameEchoReturnLoss,
-    kStatsValueNameEchoReturnLossEnhancement,
-    kStatsValueNameEncodeUsagePercent,
-    kStatsValueNameExpandRate,
-    kStatsValueNameFingerprint,
-    kStatsValueNameFingerprintAlgorithm,
-    kStatsValueNameFirsReceived,
-    kStatsValueNameFirsSent,
-    kStatsValueNameFrameHeightInput,
-    kStatsValueNameFrameHeightReceived,
-    kStatsValueNameFrameHeightSent,
-    kStatsValueNameFrameRateDecoded,
-    kStatsValueNameFrameRateInput,
-    kStatsValueNameFrameRateOutput,
-    kStatsValueNameFrameRateReceived,
-    kStatsValueNameFrameRateSent,
-    kStatsValueNameFrameWidthInput,
-    kStatsValueNameFrameWidthReceived,
-    kStatsValueNameFrameWidthSent,
-    kStatsValueNameInitiator,
-    kStatsValueNameInterframeDelayMaxMs,  // Max over last 10 seconds.
-    kStatsValueNameIssuerId,
-    kStatsValueNameJitterBufferMs,
-    kStatsValueNameJitterReceived,
-    kStatsValueNameLabel,
-    kStatsValueNameLocalAddress,
-    kStatsValueNameLocalCandidateId,
-    kStatsValueNameLocalCandidateType,
-    kStatsValueNameLocalCertificateId,
-    kStatsValueNameMaxDecodeMs,
-    kStatsValueNameMinPlayoutDelayMs,
-    kStatsValueNameNacksReceived,
-    kStatsValueNameNacksSent,
-    kStatsValueNamePlisReceived,
-    kStatsValueNamePlisSent,
-    kStatsValueNamePreemptiveExpandRate,
-    kStatsValueNamePreferredJitterBufferMs,
-    kStatsValueNameRemoteAddress,
-    kStatsValueNameRemoteCandidateId,
-    kStatsValueNameRemoteCandidateType,
-    kStatsValueNameRemoteCertificateId,
-    kStatsValueNameRenderDelayMs,
-    kStatsValueNameResidualEchoLikelihood,
-    kStatsValueNameResidualEchoLikelihoodRecentMax,
-    kStatsValueNameAnaBitrateActionCounter,
-    kStatsValueNameAnaChannelActionCounter,
-    kStatsValueNameAnaDtxActionCounter,
-    kStatsValueNameAnaFecActionCounter,
-    kStatsValueNameAnaFrameLengthIncreaseCounter,
-    kStatsValueNameAnaFrameLengthDecreaseCounter,
-    kStatsValueNameAnaUplinkPacketLossFraction,
-    kStatsValueNameRetransmitBitrate,
-    kStatsValueNameRtt,
-    kStatsValueNameSecondaryDecodedRate,
-    kStatsValueNameSecondaryDiscardedRate,
-    kStatsValueNameSendPacketsDiscarded,
-    kStatsValueNameSpeechExpandRate,
-    kStatsValueNameSrtpCipher,
-    kStatsValueNameTargetDelayMs,
-    kStatsValueNameTargetEncBitrate,
-    kStatsValueNameTimingFrameInfo,  // Result of |TimingFrameInfo::ToString|
-    kStatsValueNameTrackId,
-    kStatsValueNameTransmitBitrate,
-    kStatsValueNameTransportType,
-    kStatsValueNameTypingNoiseState,
-    kStatsValueNameWritable,
-  };
-
-  class IdBase : public rtc::RefCountInterface {
-   public:
-    ~IdBase() override;
-    StatsType type() const;
-
-    // Users of IdBase will be using the Id typedef, which is compatible with
-    // this Equals() function.  It simply calls the protected (and overridden)
-    // Equals() method.
-    bool Equals(const rtc::scoped_refptr<IdBase>& other) const {
-      return Equals(*other.get());
-    }
-
-    virtual std::string ToString() const = 0;
-
-   protected:
-    // Protected since users of the IdBase type will be using the Id typedef.
-    virtual bool Equals(const IdBase& other) const;
-
-    explicit IdBase(StatsType type);  // Only meant for derived classes.
-    const StatsType type_;
-
-    static const char kSeparator = '_';
-  };
-
-  typedef rtc::scoped_refptr<IdBase> Id;
-
-  struct Value {
-    enum Type {
-      kInt,           // int.
-      kInt64,         // int64_t.
-      kFloat,         // float.
-      kString,        // std::string
-      kStaticString,  // const char*.
-      kBool,          // bool.
-      kId,            // Id.
-    };
-
-    Value(StatsValueName name, int64_t value, Type int_type);
-    Value(StatsValueName name, float f);
-    Value(StatsValueName name, const std::string& value);
-    Value(StatsValueName name, const char* value);
-    Value(StatsValueName name, bool b);
-    Value(StatsValueName name, const Id& value);
-
-    ~Value();
-
-    // Support ref counting. Note that for performance reasons, we
-    // don't use thread safe operations. Therefore, all operations
-    // affecting the ref count (in practice, creation and copying of
-    // the Values mapping) must occur on webrtc's signalling thread.
-    int AddRef() const {
-      RTC_DCHECK_RUN_ON(&thread_checker_);
-      return ++ref_count_;
-    }
-    int Release() const {
-      RTC_DCHECK_RUN_ON(&thread_checker_);
-      int count = --ref_count_;
-      if (!count)
-        delete this;
-      return count;
-    }
-
-    // TODO(tommi): This compares name as well as value...
-    // I think we should only need to compare the value part and
-    // move the name part into a hash map.
-    bool Equals(const Value& other) const;
-
-    // Comparison operators. Return true iff the current instance is of the
-    // correct type and holds the same value.  No conversion is performed so
-    // a string value of "123" is not equal to an int value of 123 and an int
-    // value of 123 is not equal to a float value of 123.0f.
-    // One exception to this is that types kInt and kInt64 can be compared and
-    // kString and kStaticString too.
-    bool operator==(const std::string& value) const;
-    bool operator==(const char* value) const;
-    bool operator==(int64_t value) const;
-    bool operator==(bool value) const;
-    bool operator==(float value) const;
-    bool operator==(const Id& value) const;
-
-    // Getters that allow getting the native value directly.
-    // The caller must know the type beforehand or else hit a check.
-    int int_val() const;
-    int64_t int64_val() const;
-    float float_val() const;
-    const char* static_string_val() const;
-    const std::string& string_val() const;
-    bool bool_val() const;
-    const Id& id_val() const;
-
-    // Returns the string representation of |name|.
-    const char* display_name() const;
-
-    // Converts the native value to a string representation of the value.
-    std::string ToString() const;
-
-    Type type() const { return type_; }
-
-    // TODO(tommi): Move |name| and |display_name| out of the Value struct.
-    const StatsValueName name;
-
-   private:
-    rtc::ThreadChecker thread_checker_;
-    mutable int ref_count_ RTC_ACCESS_ON(thread_checker_) = 0;
-
-    const Type type_;
-    // TODO(tommi): Use C++ 11 union and make value_ const.
-    union InternalType {
-      int int_;
-      int64_t int64_;
-      float float_;
-      bool bool_;
-      std::string* string_;
-      const char* static_string_;
-      Id* id_;
-    } value_;
-
-    RTC_DISALLOW_COPY_AND_ASSIGN(Value);
-  };
-
-  typedef rtc::scoped_refptr<Value> ValuePtr;
-  typedef std::map<StatsValueName, ValuePtr> Values;
-
-  // Ownership of |id| is passed to |this|.
-  explicit StatsReport(const Id& id);
-  ~StatsReport();
-
-  // Factory functions for various types of stats IDs.
-  static Id NewBandwidthEstimationId();
-  static Id NewTypedId(StatsType type, const std::string& id);
-  static Id NewTypedIntId(StatsType type, int id);
-  static Id NewIdWithDirection(
-      StatsType type, const std::string& id, Direction direction);
-  static Id NewCandidateId(bool local, const std::string& id);
-  static Id NewComponentId(
-      const std::string& content_name, int component);
-  static Id NewCandidatePairId(
-      const std::string& content_name, int component, int index);
-
-  const Id& id() const { return id_; }
-  StatsType type() const { return id_->type(); }
-  double timestamp() const { return timestamp_; }
-  void set_timestamp(double t) { timestamp_ = t; }
-  bool empty() const { return values_.empty(); }
-  const Values& values() const { return values_; }
-
-  const char* TypeToString() const;
-
-  void AddString(StatsValueName name, const std::string& value);
-  void AddString(StatsValueName name, const char* value);
-  void AddInt64(StatsValueName name, int64_t value);
-  void AddInt(StatsValueName name, int value);
-  void AddFloat(StatsValueName name, float value);
-  void AddBoolean(StatsValueName name, bool value);
-  void AddId(StatsValueName name, const Id& value);
-
-  const Value* FindValue(StatsValueName name) const;
-
- private:
-  // The unique identifier for this object.
-  // This is used as a key for this report in ordered containers,
-  // so it must never be changed.
-  const Id id_;
-  double timestamp_;  // Time since 1970-01-01T00:00:00Z in milliseconds.
-  Values values_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(StatsReport);
-};
-
-// Typedef for an array of const StatsReport pointers.
-// Ownership of the pointers held by this implementation is assumed to lie
-// elsewhere and lifetime guarantees are made by the implementation that uses
-// this type.  In the StatsCollector, object ownership lies with the
-// StatsCollection class.
-typedef std::vector<const StatsReport*> StatsReports;
-
-// A map from the report id to the report.
-// This class wraps an STL container and provides a limited set of
-// functionality in order to keep things simple.
-class StatsCollection {
- public:
-  StatsCollection();
-  ~StatsCollection();
-
-  typedef std::list<StatsReport*> Container;
-  typedef Container::iterator iterator;
-  typedef Container::const_iterator const_iterator;
-
-  const_iterator begin() const;
-  const_iterator end() const;
-  size_t size() const;
-
-  // Creates a new report object with |id| that does not already
-  // exist in the list of reports.
-  StatsReport* InsertNew(const StatsReport::Id& id);
-  StatsReport* FindOrAddNew(const StatsReport::Id& id);
-  StatsReport* ReplaceOrAddNew(const StatsReport::Id& id);
-
-  // Looks for a report with the given |id|.  If one is not found, null
-  // will be returned.
-  StatsReport* Find(const StatsReport::Id& id);
-
- private:
-  Container list_;
-  rtc::ThreadChecker thread_checker_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_API_STATSTYPES_H_
diff --git a/api/streamcollection.h b/api/streamcollection.h
deleted file mode 100644
index 0f847f1..0000000
--- a/api/streamcollection.h
+++ /dev/null
@@ -1,18 +0,0 @@
-/*
- *  Copyright 2011 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_API_STREAMCOLLECTION_H_
-#define WEBRTC_API_STREAMCOLLECTION_H_
-
-// Including this file is deprecated. It is no longer part of the public API.
-// This only includes the file in its new location for backwards compatibility.
-#include "webrtc/pc/streamcollection.h"
-
-#endif  // WEBRTC_API_STREAMCOLLECTION_H_
diff --git a/api/test/fakeconstraints.h b/api/test/fakeconstraints.h
deleted file mode 100644
index d7b7011..0000000
--- a/api/test/fakeconstraints.h
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- *  Copyright 2012 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_API_TEST_FAKECONSTRAINTS_H_
-#define WEBRTC_API_TEST_FAKECONSTRAINTS_H_
-
-#include <string>
-#include <vector>
-
-#include "webrtc/api/mediaconstraintsinterface.h"
-#include "webrtc/rtc_base/stringencode.h"
-
-namespace webrtc {
-
-class FakeConstraints : public webrtc::MediaConstraintsInterface {
- public:
-  FakeConstraints() { }
-  virtual ~FakeConstraints() { }
-
-  virtual const Constraints& GetMandatory() const {
-    return mandatory_;
-  }
-
-  virtual const Constraints& GetOptional() const {
-    return optional_;
-  }
-
-  template <class T>
-  void AddMandatory(const std::string& key, const T& value) {
-    mandatory_.push_back(Constraint(key, rtc::ToString<T>(value)));
-  }
-
-  template <class T>
-  void SetMandatory(const std::string& key, const T& value) {
-    std::string value_str;
-    if (mandatory_.FindFirst(key, &value_str)) {
-      for (Constraints::iterator iter = mandatory_.begin();
-           iter != mandatory_.end(); ++iter) {
-        if (iter->key == key) {
-          mandatory_.erase(iter);
-          break;
-        }
-      }
-    }
-    mandatory_.push_back(Constraint(key, rtc::ToString<T>(value)));
-  }
-
-  template <class T>
-  void AddOptional(const std::string& key, const T& value) {
-    optional_.push_back(Constraint(key, rtc::ToString<T>(value)));
-  }
-
-  void SetMandatoryMinAspectRatio(double ratio) {
-    SetMandatory(MediaConstraintsInterface::kMinAspectRatio, ratio);
-  }
-
-  void SetMandatoryMinWidth(int width) {
-    SetMandatory(MediaConstraintsInterface::kMinWidth, width);
-  }
-
-  void SetMandatoryMinHeight(int height) {
-    SetMandatory(MediaConstraintsInterface::kMinHeight, height);
-  }
-
-  void SetOptionalMaxWidth(int width) {
-    AddOptional(MediaConstraintsInterface::kMaxWidth, width);
-  }
-
-  void SetMandatoryMaxFrameRate(int frame_rate) {
-    SetMandatory(MediaConstraintsInterface::kMaxFrameRate, frame_rate);
-  }
-
-  void SetMandatoryReceiveAudio(bool enable) {
-    SetMandatory(MediaConstraintsInterface::kOfferToReceiveAudio, enable);
-  }
-
-  void SetMandatoryReceiveVideo(bool enable) {
-    SetMandatory(MediaConstraintsInterface::kOfferToReceiveVideo, enable);
-  }
-
-  void SetMandatoryUseRtpMux(bool enable) {
-    SetMandatory(MediaConstraintsInterface::kUseRtpMux, enable);
-  }
-
-  void SetMandatoryIceRestart(bool enable) {
-    SetMandatory(MediaConstraintsInterface::kIceRestart, enable);
-  }
-
-  void SetAllowRtpDataChannels() {
-    SetMandatory(MediaConstraintsInterface::kEnableRtpDataChannels, true);
-    SetMandatory(MediaConstraintsInterface::kEnableDtlsSrtp, false);
-  }
-
-  void SetOptionalVAD(bool enable) {
-    AddOptional(MediaConstraintsInterface::kVoiceActivityDetection, enable);
-  }
-
-  void SetAllowDtlsSctpDataChannels() {
-    SetMandatory(MediaConstraintsInterface::kEnableDtlsSrtp, true);
-  }
-
- private:
-  Constraints mandatory_;
-  Constraints optional_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_API_TEST_FAKECONSTRAINTS_H_
diff --git a/api/test/mock_audio_mixer.h b/api/test/mock_audio_mixer.h
deleted file mode 100644
index 189455f..0000000
--- a/api/test/mock_audio_mixer.h
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- *  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_API_TEST_MOCK_AUDIO_MIXER_H_
-#define WEBRTC_API_TEST_MOCK_AUDIO_MIXER_H_
-
-#include "webrtc/api/audio/audio_mixer.h"
-
-#include "webrtc/test/gmock.h"
-
-namespace webrtc {
-namespace test {
-
-class MockAudioMixer : public AudioMixer {
- public:
-  MOCK_METHOD1(AddSource, bool(Source* audio_source));
-  MOCK_METHOD1(RemoveSource, void(Source* audio_source));
-  MOCK_METHOD2(Mix,
-               void(size_t number_of_channels,
-                    AudioFrame* audio_frame_for_mixing));
-};
-}  // namespace test
-}  // namespace webrtc
-
-#endif  // WEBRTC_API_TEST_MOCK_AUDIO_MIXER_H_
diff --git a/api/test/mock_rtpreceiver.h b/api/test/mock_rtpreceiver.h
deleted file mode 100644
index 552a653..0000000
--- a/api/test/mock_rtpreceiver.h
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- *  Copyright 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_API_TEST_MOCK_RTPRECEIVER_H_
-#define WEBRTC_API_TEST_MOCK_RTPRECEIVER_H_
-
-#include <string>
-#include <vector>
-
-#include "webrtc/api/rtpreceiverinterface.h"
-#include "webrtc/test/gmock.h"
-
-namespace webrtc {
-
-class MockRtpReceiver : public rtc::RefCountedObject<RtpReceiverInterface> {
- public:
-  MOCK_METHOD1(SetTrack, void(MediaStreamTrackInterface*));
-  MOCK_CONST_METHOD0(track, rtc::scoped_refptr<MediaStreamTrackInterface>());
-  MOCK_CONST_METHOD0(media_type, cricket::MediaType());
-  MOCK_CONST_METHOD0(id, std::string());
-  MOCK_CONST_METHOD0(GetParameters, RtpParameters());
-  MOCK_METHOD1(SetParameters, bool(const RtpParameters&));
-  MOCK_METHOD1(SetObserver, void(RtpReceiverObserverInterface*));
-  MOCK_CONST_METHOD0(GetSources, std::vector<RtpSource>());
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_API_TEST_MOCK_RTPRECEIVER_H_
diff --git a/api/test/mock_rtpsender.h b/api/test/mock_rtpsender.h
deleted file mode 100644
index 7458f45..0000000
--- a/api/test/mock_rtpsender.h
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- *  Copyright 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_API_TEST_MOCK_RTPSENDER_H_
-#define WEBRTC_API_TEST_MOCK_RTPSENDER_H_
-
-#include <string>
-#include <vector>
-
-#include "webrtc/api/rtpsenderinterface.h"
-#include "webrtc/test/gmock.h"
-
-namespace webrtc {
-
-class MockRtpSender : public rtc::RefCountedObject<RtpSenderInterface> {
- public:
-  MOCK_METHOD1(SetTrack, bool(MediaStreamTrackInterface*));
-  MOCK_CONST_METHOD0(track, rtc::scoped_refptr<MediaStreamTrackInterface>());
-  MOCK_CONST_METHOD0(ssrc, uint32_t());
-  MOCK_CONST_METHOD0(media_type, cricket::MediaType());
-  MOCK_CONST_METHOD0(id, std::string());
-  MOCK_CONST_METHOD0(stream_ids, std::vector<std::string>());
-  MOCK_CONST_METHOD0(GetParameters, RtpParameters());
-  MOCK_METHOD1(SetParameters, bool(const RtpParameters&));
-  MOCK_CONST_METHOD0(GetDtmfSender, rtc::scoped_refptr<DtmfSenderInterface>());
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_API_TEST_MOCK_RTPSENDER_H_
diff --git a/api/umametrics.h b/api/umametrics.h
deleted file mode 100644
index 81238c9..0000000
--- a/api/umametrics.h
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- *  Copyright 2014 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.
- */
-
-// This file contains enums related to IPv4/IPv6 metrics.
-
-#ifndef WEBRTC_API_UMAMETRICS_H_
-#define WEBRTC_API_UMAMETRICS_H_
-
-#include "webrtc/rtc_base/refcount.h"
-
-namespace webrtc {
-
-// Used to specify which enum counter type we're incrementing in
-// MetricsObserverInterface::IncrementEnumCounter.
-enum PeerConnectionEnumCounterType {
-  kEnumCounterAddressFamily,
-  // For the next 2 counters, we track them separately based on the "first hop"
-  // protocol used by the local candidate. "First hop" means the local candidate
-  // type in the case of non-TURN candidates, and the protocol used to connect
-  // to the TURN server in the case of TURN candidates.
-  kEnumCounterIceCandidatePairTypeUdp,
-  kEnumCounterIceCandidatePairTypeTcp,
-
-  kEnumCounterAudioSrtpCipher,
-  kEnumCounterAudioSslCipher,
-  kEnumCounterVideoSrtpCipher,
-  kEnumCounterVideoSslCipher,
-  kEnumCounterDataSrtpCipher,
-  kEnumCounterDataSslCipher,
-  kEnumCounterDtlsHandshakeError,
-  kEnumCounterIceRegathering,
-  kEnumCounterIceRestart,
-  kPeerConnectionEnumCounterMax
-};
-
-// Currently this contains information related to WebRTC network/transport
-// information.
-
-// The difference between PeerConnectionEnumCounter and
-// PeerConnectionMetricsName is that the "EnumCounter" is only counting the
-// occurrences of events, while "Name" has a value associated with it which is
-// used to form a histogram.
-
-// This enum is backed by Chromium's histograms.xml,
-// chromium/src/tools/metrics/histograms/histograms.xml
-// Existing values cannot be re-ordered and new enums must be added
-// before kBoundary.
-enum PeerConnectionAddressFamilyCounter {
-  kPeerConnection_IPv4,
-  kPeerConnection_IPv6,
-  kBestConnections_IPv4,
-  kBestConnections_IPv6,
-  kPeerConnectionAddressFamilyCounter_Max,
-};
-
-// TODO(guoweis): Keep previous name here until all references are renamed.
-#define kBoundary kPeerConnectionAddressFamilyCounter_Max
-
-// TODO(guoweis): Keep previous name here until all references are renamed.
-typedef PeerConnectionAddressFamilyCounter PeerConnectionUMAMetricsCounter;
-
-// This enum defines types for UMA samples, which will have a range.
-enum PeerConnectionMetricsName {
-  kNetworkInterfaces_IPv4,  // Number of IPv4 interfaces.
-  kNetworkInterfaces_IPv6,  // Number of IPv6 interfaces.
-  kTimeToConnect,           // In milliseconds.
-  kLocalCandidates_IPv4,    // Number of IPv4 local candidates.
-  kLocalCandidates_IPv6,    // Number of IPv6 local candidates.
-  kPeerConnectionMetricsName_Max
-};
-
-// TODO(guoweis): Keep previous name here until all references are renamed.
-typedef PeerConnectionMetricsName PeerConnectionUMAMetricsName;
-
-// The IceCandidatePairType has the format of
-// <local_candidate_type>_<remote_candidate_type>. It is recorded based on the
-// type of candidate pair used when the PeerConnection first goes to a completed
-// state. When BUNDLE is enabled, only the first transport gets recorded.
-enum IceCandidatePairType {
-  // HostHost is deprecated. It was replaced with the set of types at the bottom
-  // to report private or public host IP address.
-  kIceCandidatePairHostHost,
-  kIceCandidatePairHostSrflx,
-  kIceCandidatePairHostRelay,
-  kIceCandidatePairHostPrflx,
-  kIceCandidatePairSrflxHost,
-  kIceCandidatePairSrflxSrflx,
-  kIceCandidatePairSrflxRelay,
-  kIceCandidatePairSrflxPrflx,
-  kIceCandidatePairRelayHost,
-  kIceCandidatePairRelaySrflx,
-  kIceCandidatePairRelayRelay,
-  kIceCandidatePairRelayPrflx,
-  kIceCandidatePairPrflxHost,
-  kIceCandidatePairPrflxSrflx,
-  kIceCandidatePairPrflxRelay,
-
-  // The following 4 types tell whether local and remote hosts have private or
-  // public IP addresses.
-  kIceCandidatePairHostPrivateHostPrivate,
-  kIceCandidatePairHostPrivateHostPublic,
-  kIceCandidatePairHostPublicHostPrivate,
-  kIceCandidatePairHostPublicHostPublic,
-  kIceCandidatePairMax
-};
-
-class MetricsObserverInterface : public rtc::RefCountInterface {
- public:
-  // |type| is the type of the enum counter to be incremented. |counter|
-  // is the particular counter in that type. |counter_max| is the next sequence
-  // number after the highest counter.
-  virtual void IncrementEnumCounter(PeerConnectionEnumCounterType type,
-                                    int counter,
-                                    int counter_max) {}
-
-  // This is used to handle sparse counters like SSL cipher suites.
-  // TODO(guoweis): Remove the implementation once the dependency's interface
-  // definition is updated.
-  virtual void IncrementSparseEnumCounter(PeerConnectionEnumCounterType type,
-                                          int counter) {
-    IncrementEnumCounter(type, counter, 0 /* Ignored */);
-  }
-
-  virtual void AddHistogramSample(PeerConnectionMetricsName type,
-                                  int value) = 0;
-
- protected:
-  virtual ~MetricsObserverInterface() {}
-};
-
-typedef MetricsObserverInterface UMAObserver;
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_API_UMAMETRICS_H_
diff --git a/api/video/OWNERS b/api/video/OWNERS
deleted file mode 100644
index 4d31ffb..0000000
--- a/api/video/OWNERS
+++ /dev/null
@@ -1 +0,0 @@
-magjed@webrtc.org
diff --git a/api/video/i420_buffer.cc b/api/video/i420_buffer.cc
deleted file mode 100644
index 56b8ecc..0000000
--- a/api/video/i420_buffer.cc
+++ /dev/null
@@ -1,239 +0,0 @@
-/*
- *  Copyright (c) 2015 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/api/video/i420_buffer.h"
-
-#include <string.h>
-
-#include <algorithm>
-#include <utility>
-
-#include "libyuv/convert.h"
-#include "libyuv/planar_functions.h"
-#include "libyuv/scale.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/keep_ref_until_done.h"
-
-// Aligning pointer to 64 bytes for improved performance, e.g. use SIMD.
-static const int kBufferAlignment = 64;
-
-namespace webrtc {
-
-namespace {
-
-int I420DataSize(int height, int stride_y, int stride_u, int stride_v) {
-  return stride_y * height + (stride_u + stride_v) * ((height + 1) / 2);
-}
-
-}  // namespace
-
-I420Buffer::I420Buffer(int width, int height)
-    : I420Buffer(width, height, width, (width + 1) / 2, (width + 1) / 2) {
-}
-
-I420Buffer::I420Buffer(int width,
-                       int height,
-                       int stride_y,
-                       int stride_u,
-                       int stride_v)
-    : width_(width),
-      height_(height),
-      stride_y_(stride_y),
-      stride_u_(stride_u),
-      stride_v_(stride_v),
-      data_(static_cast<uint8_t*>(AlignedMalloc(
-          I420DataSize(height, stride_y, stride_u, stride_v),
-          kBufferAlignment))) {
-  RTC_DCHECK_GT(width, 0);
-  RTC_DCHECK_GT(height, 0);
-  RTC_DCHECK_GE(stride_y, width);
-  RTC_DCHECK_GE(stride_u, (width + 1) / 2);
-  RTC_DCHECK_GE(stride_v, (width + 1) / 2);
-}
-
-I420Buffer::~I420Buffer() {
-}
-
-// static
-rtc::scoped_refptr<I420Buffer> I420Buffer::Create(int width, int height) {
-  return new rtc::RefCountedObject<I420Buffer>(width, height);
-}
-
-// static
-rtc::scoped_refptr<I420Buffer> I420Buffer::Create(int width,
-                                                  int height,
-                                                  int stride_y,
-                                                  int stride_u,
-                                                  int stride_v) {
-  return new rtc::RefCountedObject<I420Buffer>(
-      width, height, stride_y, stride_u, stride_v);
-}
-
-// static
-rtc::scoped_refptr<I420Buffer> I420Buffer::Copy(
-    const I420BufferInterface& source) {
-  return Copy(source.width(), source.height(),
-              source.DataY(), source.StrideY(),
-              source.DataU(), source.StrideU(),
-              source.DataV(), source.StrideV());
-}
-
-// static
-rtc::scoped_refptr<I420Buffer> I420Buffer::Copy(
-      int width, int height,
-      const uint8_t* data_y, int stride_y,
-      const uint8_t* data_u, int stride_u,
-      const uint8_t* data_v, int stride_v) {
-  // Note: May use different strides than the input data.
-  rtc::scoped_refptr<I420Buffer> buffer = Create(width, height);
-  RTC_CHECK_EQ(0, libyuv::I420Copy(data_y, stride_y,
-                                   data_u, stride_u,
-                                   data_v, stride_v,
-                                   buffer->MutableDataY(), buffer->StrideY(),
-                                   buffer->MutableDataU(), buffer->StrideU(),
-                                   buffer->MutableDataV(), buffer->StrideV(),
-                                   width, height));
-  return buffer;
-}
-
-// static
-rtc::scoped_refptr<I420Buffer> I420Buffer::Rotate(
-    const I420BufferInterface& src,
-    VideoRotation rotation) {
-  RTC_CHECK(src.DataY());
-  RTC_CHECK(src.DataU());
-  RTC_CHECK(src.DataV());
-
-  int rotated_width = src.width();
-  int rotated_height = src.height();
-  if (rotation == webrtc::kVideoRotation_90 ||
-      rotation == webrtc::kVideoRotation_270) {
-    std::swap(rotated_width, rotated_height);
-  }
-
-  rtc::scoped_refptr<webrtc::I420Buffer> buffer =
-      I420Buffer::Create(rotated_width, rotated_height);
-
-  RTC_CHECK_EQ(0, libyuv::I420Rotate(
-      src.DataY(), src.StrideY(),
-      src.DataU(), src.StrideU(),
-      src.DataV(), src.StrideV(),
-      buffer->MutableDataY(), buffer->StrideY(), buffer->MutableDataU(),
-      buffer->StrideU(), buffer->MutableDataV(), buffer->StrideV(),
-      src.width(), src.height(),
-      static_cast<libyuv::RotationMode>(rotation)));
-
-  return buffer;
-}
-
-void I420Buffer::InitializeData() {
-  memset(data_.get(), 0,
-         I420DataSize(height_, stride_y_, stride_u_, stride_v_));
-}
-
-int I420Buffer::width() const {
-  return width_;
-}
-
-int I420Buffer::height() const {
-  return height_;
-}
-
-const uint8_t* I420Buffer::DataY() const {
-  return data_.get();
-}
-const uint8_t* I420Buffer::DataU() const {
-  return data_.get() + stride_y_ * height_;
-}
-const uint8_t* I420Buffer::DataV() const {
-  return data_.get() + stride_y_ * height_ + stride_u_ * ((height_ + 1) / 2);
-}
-
-int I420Buffer::StrideY() const {
-  return stride_y_;
-}
-int I420Buffer::StrideU() const {
-  return stride_u_;
-}
-int I420Buffer::StrideV() const {
-  return stride_v_;
-}
-
-uint8_t* I420Buffer::MutableDataY() {
-  return const_cast<uint8_t*>(DataY());
-}
-uint8_t* I420Buffer::MutableDataU() {
-  return const_cast<uint8_t*>(DataU());
-}
-uint8_t* I420Buffer::MutableDataV() {
-  return const_cast<uint8_t*>(DataV());
-}
-
-// static
-void I420Buffer::SetBlack(I420Buffer* buffer) {
-  RTC_CHECK(libyuv::I420Rect(buffer->MutableDataY(), buffer->StrideY(),
-                             buffer->MutableDataU(), buffer->StrideU(),
-                             buffer->MutableDataV(), buffer->StrideV(),
-                             0, 0, buffer->width(), buffer->height(),
-                             0, 128, 128) == 0);
-}
-
-void I420Buffer::CropAndScaleFrom(const I420BufferInterface& src,
-                                  int offset_x,
-                                  int offset_y,
-                                  int crop_width,
-                                  int crop_height) {
-  RTC_CHECK_LE(crop_width, src.width());
-  RTC_CHECK_LE(crop_height, src.height());
-  RTC_CHECK_LE(crop_width + offset_x, src.width());
-  RTC_CHECK_LE(crop_height + offset_y, src.height());
-  RTC_CHECK_GE(offset_x, 0);
-  RTC_CHECK_GE(offset_y, 0);
-
-  // Make sure offset is even so that u/v plane becomes aligned.
-  const int uv_offset_x = offset_x / 2;
-  const int uv_offset_y = offset_y / 2;
-  offset_x = uv_offset_x * 2;
-  offset_y = uv_offset_y * 2;
-
-  const uint8_t* y_plane =
-      src.DataY() + src.StrideY() * offset_y + offset_x;
-  const uint8_t* u_plane =
-      src.DataU() + src.StrideU() * uv_offset_y + uv_offset_x;
-  const uint8_t* v_plane =
-      src.DataV() + src.StrideV() * uv_offset_y + uv_offset_x;
-  int res = libyuv::I420Scale(y_plane, src.StrideY(),
-                              u_plane, src.StrideU(),
-                              v_plane, src.StrideV(),
-                              crop_width, crop_height,
-                              MutableDataY(), StrideY(),
-                              MutableDataU(), StrideU(),
-                              MutableDataV(), StrideV(),
-                              width(), height(), libyuv::kFilterBox);
-
-  RTC_DCHECK_EQ(res, 0);
-}
-
-void I420Buffer::CropAndScaleFrom(const I420BufferInterface& src) {
-  const int crop_width =
-      std::min(src.width(), width() * src.height() / height());
-  const int crop_height =
-      std::min(src.height(), height() * src.width() / width());
-
-  CropAndScaleFrom(
-      src,
-      (src.width() - crop_width) / 2, (src.height() - crop_height) / 2,
-      crop_width, crop_height);
-}
-
-void I420Buffer::ScaleFrom(const I420BufferInterface& src) {
-  CropAndScaleFrom(src, 0, 0, src.width(), src.height());
-}
-
-}  // namespace webrtc
diff --git a/api/video/i420_buffer.h b/api/video/i420_buffer.h
deleted file mode 100644
index 31014a3..0000000
--- a/api/video/i420_buffer.h
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- *  Copyright (c) 2015 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_API_VIDEO_I420_BUFFER_H_
-#define WEBRTC_API_VIDEO_I420_BUFFER_H_
-
-#include <memory>
-
-#include "webrtc/api/video/video_rotation.h"
-#include "webrtc/api/video/video_frame_buffer.h"
-#include "webrtc/system_wrappers/include/aligned_malloc.h"
-
-namespace webrtc {
-
-// Plain I420 buffer in standard memory.
-class I420Buffer : public I420BufferInterface {
- public:
-  static rtc::scoped_refptr<I420Buffer> Create(int width, int height);
-  static rtc::scoped_refptr<I420Buffer> Create(int width,
-                                               int height,
-                                               int stride_y,
-                                               int stride_u,
-                                               int stride_v);
-
-  // Create a new buffer and copy the pixel data.
-  static rtc::scoped_refptr<I420Buffer> Copy(const I420BufferInterface& buffer);
-  // Deprecated.
-  static rtc::scoped_refptr<I420Buffer> Copy(const VideoFrameBuffer& buffer) {
-    return Copy(*buffer.GetI420());
-  }
-
-  static rtc::scoped_refptr<I420Buffer> Copy(
-      int width, int height,
-      const uint8_t* data_y, int stride_y,
-      const uint8_t* data_u, int stride_u,
-      const uint8_t* data_v, int stride_v);
-
-  // Returns a rotated copy of |src|.
-  static rtc::scoped_refptr<I420Buffer> Rotate(const I420BufferInterface& src,
-                                               VideoRotation rotation);
-  // Deprecated.
-  static rtc::scoped_refptr<I420Buffer> Rotate(const VideoFrameBuffer& src,
-                                               VideoRotation rotation) {
-    return Rotate(*src.GetI420(), rotation);
-  }
-
-  // Sets the buffer to all black.
-  static void SetBlack(I420Buffer* buffer);
-
-  // Sets all three planes to all zeros. Used to work around for
-  // quirks in memory checkers
-  // (https://bugs.chromium.org/p/libyuv/issues/detail?id=377) and
-  // ffmpeg (http://crbug.com/390941).
-  // TODO(nisse): Deprecated. Should be deleted if/when those issues
-  // are resolved in a better way. Or in the mean time, use SetBlack.
-  void InitializeData();
-
-  int width() const override;
-  int height() const override;
-  const uint8_t* DataY() const override;
-  const uint8_t* DataU() const override;
-  const uint8_t* DataV() const override;
-
-  int StrideY() const override;
-  int StrideU() const override;
-  int StrideV() const override;
-
-  uint8_t* MutableDataY();
-  uint8_t* MutableDataU();
-  uint8_t* MutableDataV();
-
-  // Scale the cropped area of |src| to the size of |this| buffer, and
-  // write the result into |this|.
-  void CropAndScaleFrom(const I420BufferInterface& src,
-                        int offset_x,
-                        int offset_y,
-                        int crop_width,
-                        int crop_height);
-
-  // The common case of a center crop, when needed to adjust the
-  // aspect ratio without distorting the image.
-  void CropAndScaleFrom(const I420BufferInterface& src);
-
-  // Scale all of |src| to the size of |this| buffer, with no cropping.
-  void ScaleFrom(const I420BufferInterface& src);
-
- protected:
-  I420Buffer(int width, int height);
-  I420Buffer(int width, int height, int stride_y, int stride_u, int stride_v);
-
-  ~I420Buffer() override;
-
- private:
-  const int width_;
-  const int height_;
-  const int stride_y_;
-  const int stride_u_;
-  const int stride_v_;
-  const std::unique_ptr<uint8_t, AlignedFreeDeleter> data_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_API_VIDEO_I420_BUFFER_H_
diff --git a/api/video/video_content_type.cc b/api/video/video_content_type.cc
deleted file mode 100644
index 3839ff4..0000000
--- a/api/video/video_content_type.cc
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- *  Copyright (c) 2017 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/api/video/video_content_type.h"
-
-// VideoContentType stored as a single byte, which is sent over the network.
-// Structure:
-//
-//  0 1 2 3 4 5 6 7
-// +---------------+
-// |r r e e e s s c|
-//
-// where:
-// r - reserved bits.
-// e - 3-bit number of an experiment group counted from 1. 0 means there's no
-// experiment ongoing.
-// s - 2-bit simulcast stream id or spatial layer, counted from 1. 0 means that
-// no simulcast information is set.
-// c - content type. 0 means real-time video, 1 means screenshare.
-//
-
-namespace webrtc {
-namespace videocontenttypehelpers {
-
-namespace {
-static constexpr uint8_t kScreenshareBitsSize = 1;
-static constexpr uint8_t kScreenshareBitsMask =
-    (1u << kScreenshareBitsSize) - 1;
-
-static constexpr uint8_t kSimulcastShift = 1;
-static constexpr uint8_t kSimulcastBitsSize = 2;
-static constexpr uint8_t kSimulcastBitsMask = ((1u << kSimulcastBitsSize) - 1)
-                                              << kSimulcastShift;  // 0b00000110
-
-static constexpr uint8_t kExperimentShift = 3;
-static constexpr uint8_t kExperimentBitsSize = 3;
-static constexpr uint8_t kExperimentBitsMask =
-    ((1u << kExperimentBitsSize) - 1) << kExperimentShift;  // 0b00111000
-
-static constexpr uint8_t kTotalBitsSize =
-    kScreenshareBitsSize + kSimulcastBitsSize + kExperimentBitsSize;
-}  // namespace
-
-bool SetExperimentId(VideoContentType* content_type, uint8_t experiment_id) {
-  // Store in bits 2-4.
-  if (experiment_id >= (1 << kExperimentBitsSize))
-    return false;
-  *content_type = static_cast<VideoContentType>(
-      (static_cast<uint8_t>(*content_type) & ~kExperimentBitsMask) |
-      ((experiment_id << kExperimentShift) & kExperimentBitsMask));
-  return true;
-}
-
-bool SetSimulcastId(VideoContentType* content_type, uint8_t simulcast_id) {
-  // Store in bits 5-6.
-  if (simulcast_id >= (1 << kSimulcastBitsSize))
-    return false;
-  *content_type = static_cast<VideoContentType>(
-      (static_cast<uint8_t>(*content_type) & ~kSimulcastBitsMask) |
-      ((simulcast_id << kSimulcastShift) & kSimulcastBitsMask));
-  return true;
-}
-
-uint8_t GetExperimentId(
-    const VideoContentType& content_type) {
-  return (static_cast<uint8_t>(content_type) & kExperimentBitsMask) >>
-         kExperimentShift;
-}
-uint8_t GetSimulcastId(
-    const VideoContentType& content_type) {
-  return (static_cast<uint8_t>(content_type) & kSimulcastBitsMask) >>
-         kSimulcastShift;
-}
-
-bool IsScreenshare(
-    const VideoContentType& content_type) {
-  return (static_cast<uint8_t>(content_type) & kScreenshareBitsMask) > 0;
-}
-
-bool IsValidContentType(uint8_t value) {
-  // Any 6-bit value is allowed.
-  return value < (1 << kTotalBitsSize);
-}
-
-const char* ToString(const VideoContentType& content_type) {
-  return IsScreenshare(content_type) ? "screen" : "realtime";
-}
-}  // namespace videocontenttypehelpers
-}  // namespace webrtc
diff --git a/api/video/video_content_type.h b/api/video/video_content_type.h
deleted file mode 100644
index f9c6a98..0000000
--- a/api/video/video_content_type.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- *  Copyright (c) 2017 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_API_VIDEO_VIDEO_CONTENT_TYPE_H_
-#define WEBRTC_API_VIDEO_VIDEO_CONTENT_TYPE_H_
-
-#include <stdint.h>
-
-#include <string>
-
-namespace webrtc {
-
-enum class VideoContentType : uint8_t {
-  UNSPECIFIED = 0,
-  SCREENSHARE = 1,
-};
-
-namespace videocontenttypehelpers {
-bool SetExperimentId(VideoContentType* content_type, uint8_t experiment_id);
-bool SetSimulcastId(VideoContentType* content_type, uint8_t simulcast_id);
-
-uint8_t GetExperimentId(const VideoContentType& content_type);
-uint8_t GetSimulcastId(const VideoContentType& content_type);
-
-bool IsScreenshare(const VideoContentType& content_type);
-
-bool IsValidContentType(uint8_t value);
-
-const char* ToString(const VideoContentType& content_type);
-}  // namespace videocontenttypehelpers
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_API_VIDEO_VIDEO_CONTENT_TYPE_H_
diff --git a/api/video/video_frame.cc b/api/video/video_frame.cc
deleted file mode 100644
index fa3ad3d..0000000
--- a/api/video/video_frame.cc
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- *  Copyright (c) 2012 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/api/video/video_frame.h"
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/timeutils.h"
-
-namespace webrtc {
-
-VideoFrame::VideoFrame(const rtc::scoped_refptr<VideoFrameBuffer>& buffer,
-                       webrtc::VideoRotation rotation,
-                       int64_t timestamp_us)
-    : video_frame_buffer_(buffer),
-      timestamp_rtp_(0),
-      ntp_time_ms_(0),
-      timestamp_us_(timestamp_us),
-      rotation_(rotation) {}
-
-VideoFrame::VideoFrame(const rtc::scoped_refptr<VideoFrameBuffer>& buffer,
-                       uint32_t timestamp,
-                       int64_t render_time_ms,
-                       VideoRotation rotation)
-    : video_frame_buffer_(buffer),
-      timestamp_rtp_(timestamp),
-      ntp_time_ms_(0),
-      timestamp_us_(render_time_ms * rtc::kNumMicrosecsPerMillisec),
-      rotation_(rotation) {
-  RTC_DCHECK(buffer);
-}
-
-VideoFrame::~VideoFrame() = default;
-
-VideoFrame::VideoFrame(const VideoFrame&) = default;
-VideoFrame::VideoFrame(VideoFrame&&) = default;
-VideoFrame& VideoFrame::operator=(const VideoFrame&) = default;
-VideoFrame& VideoFrame::operator=(VideoFrame&&) = default;
-
-int VideoFrame::width() const {
-  return video_frame_buffer_ ? video_frame_buffer_->width() : 0;
-}
-
-int VideoFrame::height() const {
-  return video_frame_buffer_ ? video_frame_buffer_->height() : 0;
-}
-
-uint32_t VideoFrame::size() const {
-  return width() * height();
-}
-
-rtc::scoped_refptr<VideoFrameBuffer> VideoFrame::video_frame_buffer() const {
-  return video_frame_buffer_;
-}
-
-int64_t VideoFrame::render_time_ms() const {
-  return timestamp_us() / rtc::kNumMicrosecsPerMillisec;
-}
-
-}  // namespace webrtc
diff --git a/api/video/video_frame.h b/api/video/video_frame.h
deleted file mode 100644
index 3ee381b..0000000
--- a/api/video/video_frame.h
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- *  Copyright (c) 2014 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_API_VIDEO_VIDEO_FRAME_H_
-#define WEBRTC_API_VIDEO_VIDEO_FRAME_H_
-
-#include <stdint.h>
-
-#include "webrtc/api/video/video_rotation.h"
-#include "webrtc/api/video/video_frame_buffer.h"
-
-namespace webrtc {
-
-class VideoFrame {
- public:
-  // TODO(nisse): This constructor is consistent with the now deleted
-  // cricket::WebRtcVideoFrame. We should consider whether or not we
-  // want to stick to this style and deprecate the other constructor.
-  VideoFrame(const rtc::scoped_refptr<VideoFrameBuffer>& buffer,
-             webrtc::VideoRotation rotation,
-             int64_t timestamp_us);
-
-  // Preferred constructor.
-  VideoFrame(const rtc::scoped_refptr<VideoFrameBuffer>& buffer,
-             uint32_t timestamp,
-             int64_t render_time_ms,
-             VideoRotation rotation);
-
-  ~VideoFrame();
-
-  // Support move and copy.
-  VideoFrame(const VideoFrame&);
-  VideoFrame(VideoFrame&&);
-  VideoFrame& operator=(const VideoFrame&);
-  VideoFrame& operator=(VideoFrame&&);
-
-  // Get frame width.
-  int width() const;
-  // Get frame height.
-  int height() const;
-  // Get frame size in pixels.
-  uint32_t size() const;
-
-  // System monotonic clock, same timebase as rtc::TimeMicros().
-  int64_t timestamp_us() const { return timestamp_us_; }
-  void set_timestamp_us(int64_t timestamp_us) { timestamp_us_ = timestamp_us; }
-
-  // TODO(nisse): After the cricket::VideoFrame and webrtc::VideoFrame
-  // merge, timestamps other than timestamp_us will likely be
-  // deprecated.
-
-  // Set frame timestamp (90kHz).
-  void set_timestamp(uint32_t timestamp) { timestamp_rtp_ = timestamp; }
-
-  // Get frame timestamp (90kHz).
-  uint32_t timestamp() const { return timestamp_rtp_; }
-
-  // For now, transport_frame_id and rtp timestamp are the same.
-  // TODO(nisse): Must be handled differently for QUIC.
-  uint32_t transport_frame_id() const { return timestamp(); }
-
-  // Set capture ntp time in milliseconds.
-  // TODO(nisse): Deprecated. Migrate all users to timestamp_us().
-  void set_ntp_time_ms(int64_t ntp_time_ms) { ntp_time_ms_ = ntp_time_ms; }
-
-  // Get capture ntp time in milliseconds.
-  // TODO(nisse): Deprecated. Migrate all users to timestamp_us().
-  int64_t ntp_time_ms() const { return ntp_time_ms_; }
-
-  // Naming convention for Coordination of Video Orientation. Please see
-  // http://www.etsi.org/deliver/etsi_ts/126100_126199/126114/12.07.00_60/ts_126114v120700p.pdf
-  //
-  // "pending rotation" or "pending" = a frame that has a VideoRotation > 0.
-  //
-  // "not pending" = a frame that has a VideoRotation == 0.
-  //
-  // "apply rotation" = modify a frame from being "pending" to being "not
-  //                    pending" rotation (a no-op for "unrotated").
-  //
-  VideoRotation rotation() const { return rotation_; }
-  void set_rotation(VideoRotation rotation) { rotation_ = rotation; }
-
-  // Get render time in milliseconds.
-  // TODO(nisse): Deprecated. Migrate all users to timestamp_us().
-  int64_t render_time_ms() const;
-
-  // Return the underlying buffer. Never nullptr for a properly
-  // initialized VideoFrame.
-  rtc::scoped_refptr<webrtc::VideoFrameBuffer> video_frame_buffer() const;
-
-  // TODO(nisse): Deprecated.
-  // Return true if the frame is stored in a texture.
-  bool is_texture() const {
-    return video_frame_buffer()->type() == VideoFrameBuffer::Type::kNative;
-  }
-
- private:
-  // An opaque reference counted handle that stores the pixel data.
-  rtc::scoped_refptr<webrtc::VideoFrameBuffer> video_frame_buffer_;
-  uint32_t timestamp_rtp_;
-  int64_t ntp_time_ms_;
-  int64_t timestamp_us_;
-  VideoRotation rotation_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_API_VIDEO_VIDEO_FRAME_H_
diff --git a/api/video/video_frame_buffer.cc b/api/video/video_frame_buffer.cc
deleted file mode 100644
index d771e6a..0000000
--- a/api/video/video_frame_buffer.cc
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- *  Copyright (c) 2017 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/api/video/video_frame_buffer.h"
-
-#include "libyuv/convert.h"
-#include "webrtc/api/video/i420_buffer.h"
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-
-rtc::scoped_refptr<I420BufferInterface> VideoFrameBuffer::GetI420() {
-  RTC_CHECK(type() == Type::kI420);
-  return static_cast<I420BufferInterface*>(this);
-}
-
-rtc::scoped_refptr<const I420BufferInterface> VideoFrameBuffer::GetI420()
-    const {
-  RTC_CHECK(type() == Type::kI420);
-  return static_cast<const I420BufferInterface*>(this);
-}
-
-I444BufferInterface* VideoFrameBuffer::GetI444() {
-  RTC_CHECK(type() == Type::kI444);
-  return static_cast<I444BufferInterface*>(this);
-}
-
-const I444BufferInterface* VideoFrameBuffer::GetI444() const {
-  RTC_CHECK(type() == Type::kI444);
-  return static_cast<const I444BufferInterface*>(this);
-}
-
-VideoFrameBuffer::Type I420BufferInterface::type() const {
-  return Type::kI420;
-}
-
-int I420BufferInterface::ChromaWidth() const {
-  return (width() + 1) / 2;
-}
-
-int I420BufferInterface::ChromaHeight() const {
-  return (height() + 1) / 2;
-}
-
-rtc::scoped_refptr<I420BufferInterface> I420BufferInterface::ToI420() {
-  return this;
-}
-
-VideoFrameBuffer::Type I444BufferInterface::type() const {
-  return Type::kI444;
-}
-
-int I444BufferInterface::ChromaWidth() const {
-  return width();
-}
-
-int I444BufferInterface::ChromaHeight() const {
-  return height();
-}
-
-rtc::scoped_refptr<I420BufferInterface> I444BufferInterface::ToI420() {
-  rtc::scoped_refptr<I420Buffer> i420_buffer =
-      I420Buffer::Create(width(), height());
-  libyuv::I444ToI420(DataY(), StrideY(), DataU(), StrideU(), DataV(), StrideV(),
-                     i420_buffer->MutableDataY(), i420_buffer->StrideY(),
-                     i420_buffer->MutableDataU(), i420_buffer->StrideU(),
-                     i420_buffer->MutableDataV(), i420_buffer->StrideV(),
-                     width(), height());
-  return i420_buffer;
-}
-
-}  // namespace webrtc
diff --git a/api/video/video_frame_buffer.h b/api/video/video_frame_buffer.h
deleted file mode 100644
index a2ace6e..0000000
--- a/api/video/video_frame_buffer.h
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
- *  Copyright (c) 2015 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_API_VIDEO_VIDEO_FRAME_BUFFER_H_
-#define WEBRTC_API_VIDEO_VIDEO_FRAME_BUFFER_H_
-
-#include <stdint.h>
-
-#include "webrtc/rtc_base/refcount.h"
-#include "webrtc/rtc_base/scoped_ref_ptr.h"
-
-namespace webrtc {
-
-class I420BufferInterface;
-class I444BufferInterface;
-
-// Base class for frame buffers of different types of pixel format and storage.
-// The tag in type() indicates how the data is represented, and each type is
-// implemented as a subclass. To access the pixel data, call the appropriate
-// GetXXX() function, where XXX represents the type. There is also a function
-// ToI420() that returns a frame buffer in I420 format, converting from the
-// underlying representation if necessary. I420 is the most widely accepted
-// format and serves as a fallback for video sinks that can only handle I420,
-// e.g. the internal WebRTC software encoders. A special enum value 'kNative' is
-// provided for external clients to implement their own frame buffer
-// representations, e.g. as textures. The external client can produce such
-// native frame buffers from custom video sources, and then cast it back to the
-// correct subclass in custom video sinks. The purpose of this is to improve
-// performance by providing an optimized path without intermediate conversions.
-// Frame metadata such as rotation and timestamp are stored in
-// webrtc::VideoFrame, and not here.
-class VideoFrameBuffer : public rtc::RefCountInterface {
- public:
-  // New frame buffer types will be added conservatively when there is an
-  // opportunity to optimize the path between some pair of video source and
-  // video sink.
-  enum class Type {
-    kNative,
-    kI420,
-    kI444,
-  };
-
-  // This function specifies in what pixel format the data is stored in.
-  virtual Type type() const = 0;
-
-  // The resolution of the frame in pixels. For formats where some planes are
-  // subsampled, this is the highest-resolution plane.
-  virtual int width() const = 0;
-  virtual int height() const = 0;
-
-  // Returns a memory-backed frame buffer in I420 format. If the pixel data is
-  // in another format, a conversion will take place. All implementations must
-  // provide a fallback to I420 for compatibility with e.g. the internal WebRTC
-  // software encoders.
-  virtual rtc::scoped_refptr<I420BufferInterface> ToI420() = 0;
-
-  // These functions should only be called if type() is of the correct type.
-  // Calling with a different type will result in a crash.
-  // TODO(magjed): Return raw pointers for GetI420 once deprecated interface is
-  // removed.
-  rtc::scoped_refptr<I420BufferInterface> GetI420();
-  rtc::scoped_refptr<const I420BufferInterface> GetI420() const;
-  I444BufferInterface* GetI444();
-  const I444BufferInterface* GetI444() const;
-
- protected:
-  ~VideoFrameBuffer() override {}
-};
-
-// This interface represents Type::kI420 and Type::kI444.
-class PlanarYuvBuffer : public VideoFrameBuffer {
- public:
-  virtual int ChromaWidth() const = 0;
-  virtual int ChromaHeight() const = 0;
-
-  // Returns pointer to the pixel data for a given plane. The memory is owned by
-  // the VideoFrameBuffer object and must not be freed by the caller.
-  virtual const uint8_t* DataY() const = 0;
-  virtual const uint8_t* DataU() const = 0;
-  virtual const uint8_t* DataV() const = 0;
-
-  // Returns the number of bytes between successive rows for a given plane.
-  virtual int StrideY() const = 0;
-  virtual int StrideU() const = 0;
-  virtual int StrideV() const = 0;
-
- protected:
-  ~PlanarYuvBuffer() override {}
-};
-
-class I420BufferInterface : public PlanarYuvBuffer {
- public:
-  Type type() const final;
-
-  int ChromaWidth() const final;
-  int ChromaHeight() const final;
-
-  rtc::scoped_refptr<I420BufferInterface> ToI420() final;
-
- protected:
-  ~I420BufferInterface() override {}
-};
-
-class I444BufferInterface : public PlanarYuvBuffer {
- public:
-  Type type() const final;
-
-  int ChromaWidth() const final;
-  int ChromaHeight() const final;
-
-  rtc::scoped_refptr<I420BufferInterface> ToI420() final;
-
- protected:
-  ~I444BufferInterface() override {}
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_API_VIDEO_VIDEO_FRAME_BUFFER_H_
diff --git a/api/video/video_rotation.h b/api/video/video_rotation.h
deleted file mode 100644
index b8b2767..0000000
--- a/api/video/video_rotation.h
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- *  Copyright (c) 2015 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_API_VIDEO_VIDEO_ROTATION_H_
-#define WEBRTC_API_VIDEO_VIDEO_ROTATION_H_
-
-namespace webrtc {
-
-// enum for clockwise rotation.
-enum VideoRotation {
-  kVideoRotation_0 = 0,
-  kVideoRotation_90 = 90,
-  kVideoRotation_180 = 180,
-  kVideoRotation_270 = 270
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_API_VIDEO_VIDEO_ROTATION_H_
diff --git a/api/video/video_timing.cc b/api/video/video_timing.cc
deleted file mode 100644
index 2804c8b..0000000
--- a/api/video/video_timing.cc
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- *  Copyright (c) 2017 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/api/video/video_timing.h"
-
-#include <sstream>
-
-namespace webrtc {
-
-TimingFrameInfo::TimingFrameInfo()
-    : rtp_timestamp(0),
-      capture_time_ms(-1),
-      encode_start_ms(-1),
-      encode_finish_ms(-1),
-      packetization_finish_ms(-1),
-      pacer_exit_ms(-1),
-      network_timestamp_ms(-1),
-      network2_timestamp_ms(-1),
-      receive_start_ms(-1),
-      receive_finish_ms(-1),
-      decode_start_ms(-1),
-      decode_finish_ms(-1),
-      render_time_ms(-1),
-      flags(TimingFrameFlags::kDefault) {}
-
-int64_t TimingFrameInfo::EndToEndDelay() const {
-  return capture_time_ms >= 0 ? decode_finish_ms - capture_time_ms : -1;
-}
-
-bool TimingFrameInfo::IsLongerThan(const TimingFrameInfo& other) const {
-  int64_t other_delay = other.EndToEndDelay();
-  return other_delay == -1 || EndToEndDelay() > other_delay;
-}
-
-bool TimingFrameInfo::operator<(const TimingFrameInfo& other) const {
-  return other.IsLongerThan(*this);
-}
-
-bool TimingFrameInfo::operator<=(const TimingFrameInfo& other) const {
-  return !IsLongerThan(other);
-}
-
-bool TimingFrameInfo::IsOutlier() const {
-  return !IsInvalid() && (flags & TimingFrameFlags::kTriggeredBySize);
-}
-
-bool TimingFrameInfo::IsTimerTriggered() const {
-  return !IsInvalid() && (flags & TimingFrameFlags::kTriggeredByTimer);
-}
-
-bool TimingFrameInfo::IsInvalid() const {
-  return flags == TimingFrameFlags::kInvalid;
-}
-
-std::string TimingFrameInfo::ToString() const {
-  std::stringstream out;
-  if (IsInvalid()) {
-    out << "";
-  } else {
-    out << rtp_timestamp << ',' << capture_time_ms << ',' << encode_start_ms
-        << ',' << encode_finish_ms << ',' << packetization_finish_ms << ','
-        << pacer_exit_ms << ',' << network_timestamp_ms << ','
-        << network2_timestamp_ms << ',' << receive_start_ms << ','
-        << receive_finish_ms << ',' << decode_start_ms << ','
-        << decode_finish_ms << ',' << render_time_ms << ','
-        << IsOutlier() << ',' << IsTimerTriggered();
-  }
-  return out.str();
-}
-
-}  // namespace webrtc
diff --git a/api/video/video_timing.h b/api/video/video_timing.h
deleted file mode 100644
index e75c0c1..0000000
--- a/api/video/video_timing.h
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- *  Copyright (c) 2017 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_API_VIDEO_VIDEO_TIMING_H_
-#define WEBRTC_API_VIDEO_VIDEO_TIMING_H_
-
-#include <stdint.h>
-
-#include <limits>
-#include <string>
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/safe_conversions.h"
-
-namespace webrtc {
-
-enum TimingFrameFlags : uint8_t {
-  kDefault = 0,                // No flags set (used by old protocol)
-  kTriggeredByTimer = 1 << 0,  // Frame marked for tracing by periodic timer.
-  kTriggeredBySize = 1 << 1,   // Frame marked for tracing due to size.
-  kInvalid = std::numeric_limits<uint8_t>::max()  // Invalid, ignore!
-};
-
-// Video timing timestamps in ms counted from capture_time_ms of a frame.
-// This structure represents data sent in video-timing RTP header extension.
-struct VideoSendTiming {
-  // Offsets of the fields in the RTP header extension, counting from the first
-  // byte after the one-byte header.
-  static constexpr uint8_t kFlagsOffset = 0;
-  static constexpr uint8_t kEncodeStartDeltaOffset = 1;
-  static constexpr uint8_t kEncodeFinishDeltaOffset = 3;
-  static constexpr uint8_t kPacketizationFinishDeltaOffset = 5;
-  static constexpr uint8_t kPacerExitDeltaOffset = 7;
-  static constexpr uint8_t kNetworkTimestampDeltaOffset = 9;
-  static constexpr uint8_t kNetwork2TimestampDeltaOffset = 11;
-
-  // Returns |time_ms - base_ms| capped at max 16-bit value.
-  // Used to fill this data structure as per
-  // https://webrtc.org/experiments/rtp-hdrext/video-timing/ extension stores
-  // 16-bit deltas of timestamps from packet capture time.
-  static uint16_t GetDeltaCappedMs(int64_t base_ms, int64_t time_ms) {
-    RTC_DCHECK_GE(time_ms, base_ms);
-    return rtc::saturated_cast<uint16_t>(time_ms - base_ms);
-  }
-
-  uint16_t encode_start_delta_ms;
-  uint16_t encode_finish_delta_ms;
-  uint16_t packetization_finish_delta_ms;
-  uint16_t pacer_exit_delta_ms;
-  uint16_t network_timstamp_delta_ms;
-  uint16_t network2_timstamp_delta_ms;
-  uint8_t flags;
-};
-
-// Used to report precise timings of a 'timing frames'. Contains all important
-// timestamps for a lifetime of that specific frame. Reported as a string via
-// GetStats(). Only frame which took the longest between two GetStats calls is
-// reported.
-struct TimingFrameInfo {
-  TimingFrameInfo();
-
-  // Returns end-to-end delay of a frame, if sender and receiver timestamps are
-  // synchronized, -1 otherwise.
-  int64_t EndToEndDelay() const;
-
-  // Returns true if current frame took longer to process than |other| frame.
-  // If other frame's clocks are not synchronized, current frame is always
-  // preferred.
-  bool IsLongerThan(const TimingFrameInfo& other) const;
-
-  // Returns true if flags are set to indicate this frame was marked for tracing
-  // due to the size being outside some limit.
-  bool IsOutlier() const;
-
-  // Returns true if flags are set to indicate this frame was marked fro tracing
-  // due to cyclic timer.
-  bool IsTimerTriggered() const;
-
-  // Returns true if the timing data is marked as invalid, in which case it
-  // should be ignored.
-  bool IsInvalid() const;
-
-  std::string ToString() const;
-
-  bool operator<(const TimingFrameInfo& other) const;
-
-  bool operator<=(const TimingFrameInfo& other) const;
-
-  uint32_t rtp_timestamp;  // Identifier of a frame.
-  // All timestamps below are in local monotonous clock of a receiver.
-  // If sender clock is not yet estimated, sender timestamps
-  // (capture_time_ms ... pacer_exit_ms) are negative values, still
-  // relatively correct.
-  int64_t capture_time_ms;          // Captrue time of a frame.
-  int64_t encode_start_ms;          // Encode start time.
-  int64_t encode_finish_ms;         // Encode completion time.
-  int64_t packetization_finish_ms;  // Time when frame was passed to pacer.
-  int64_t pacer_exit_ms;  // Time when last packet was pushed out of pacer.
-  // Two in-network RTP processor timestamps: meaning is application specific.
-  int64_t network_timestamp_ms;
-  int64_t network2_timestamp_ms;
-  int64_t receive_start_ms;   // First received packet time.
-  int64_t receive_finish_ms;  // Last received packet time.
-  int64_t decode_start_ms;    // Decode start time.
-  int64_t decode_finish_ms;   // Decode completion time.
-  int64_t render_time_ms;     // Proposed render time to insure smooth playback.
-
-  uint8_t flags;  // Flags indicating validity and/or why tracing was triggered.
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_API_VIDEO_VIDEO_TIMING_H_
diff --git a/api/video_codecs/BUILD.gn b/api/video_codecs/BUILD.gn
deleted file mode 100644
index 4a050ab..0000000
--- a/api/video_codecs/BUILD.gn
+++ /dev/null
@@ -1,32 +0,0 @@
-# Copyright (c) 2017 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.
-
-import("../../webrtc.gni")
-if (is_android) {
-  import("//build/config/android/config.gni")
-  import("//build/config/android/rules.gni")
-}
-
-rtc_source_set("video_codecs_api") {
-  sources = [
-    "sdp_video_format.h",
-    "video_decoder.h",
-    "video_decoder_factory.h",
-    "video_encoder.cc",
-    "video_encoder.h",
-    "video_encoder_factory.h",
-  ]
-
-  deps = [
-    "..:optional",
-    "..:video_frame_api",
-    "../..:webrtc_common",
-    "../../common_video",
-    "../../rtc_base:rtc_base_approved",
-  ]
-}
diff --git a/api/video_codecs/sdp_video_format.h b/api/video_codecs/sdp_video_format.h
deleted file mode 100644
index bee4bf0..0000000
--- a/api/video_codecs/sdp_video_format.h
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- *  Copyright (c) 2017 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_API_VIDEO_CODECS_SDP_VIDEO_FORMAT_H_
-#define WEBRTC_API_VIDEO_CODECS_SDP_VIDEO_FORMAT_H_
-
-#include <map>
-#include <string>
-
-namespace webrtc {
-
-// SDP specification for a single video codec.
-// NOTE: This class is still under development and may change without notice.
-struct SdpVideoFormat {
-  using Parameters = std::map<std::string, std::string>;
-
-  explicit SdpVideoFormat(const std::string& name) : name(name) {}
-  SdpVideoFormat(const std::string& name, const Parameters& parameters)
-      : name(name), parameters(parameters) {}
-
-  friend bool operator==(const SdpVideoFormat& a, const SdpVideoFormat& b) {
-    return a.name == b.name && a.parameters == b.parameters;
-  }
-
-  friend bool operator!=(const SdpVideoFormat& a, const SdpVideoFormat& b) {
-    return !(a == b);
-  }
-
-  std::string name;
-  Parameters parameters;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_API_VIDEO_CODECS_SDP_VIDEO_FORMAT_H_
diff --git a/api/video_codecs/video_decoder.h b/api/video_codecs/video_decoder.h
deleted file mode 100644
index ea531e4..0000000
--- a/api/video_codecs/video_decoder.h
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- *  Copyright (c) 2014 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_API_VIDEO_CODECS_VIDEO_DECODER_H_
-#define WEBRTC_API_VIDEO_CODECS_VIDEO_DECODER_H_
-
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "webrtc/api/video/video_frame.h"
-#include "webrtc/common_types.h"
-#include "webrtc/common_video/include/video_frame.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-class RTPFragmentationHeader;
-// TODO(pbos): Expose these through a public (root) header or change these APIs.
-struct CodecSpecificInfo;
-class VideoCodec;
-
-class DecodedImageCallback {
- public:
-  virtual ~DecodedImageCallback() {}
-
-  virtual int32_t Decoded(VideoFrame& decodedImage) = 0;
-  // Provides an alternative interface that allows the decoder to specify the
-  // decode time excluding waiting time for any previous pending frame to
-  // return. This is necessary for breaking positive feedback in the delay
-  // estimation when the decoder has a single output buffer.
-  virtual int32_t Decoded(VideoFrame& decodedImage, int64_t decode_time_ms) {
-    // The default implementation ignores custom decode time value.
-    return Decoded(decodedImage);
-  }
-  // TODO(sakal): Remove other implementations when upstream projects have been
-  // updated.
-  virtual void Decoded(VideoFrame& decodedImage,
-                       rtc::Optional<int32_t> decode_time_ms,
-                       rtc::Optional<uint8_t> qp) {
-    Decoded(decodedImage,
-            decode_time_ms ? static_cast<int32_t>(*decode_time_ms) : -1);
-  }
-
-  virtual int32_t ReceivedDecodedReferenceFrame(const uint64_t pictureId) {
-    return -1;
-  }
-
-  virtual int32_t ReceivedDecodedFrame(const uint64_t pictureId) { return -1; }
-};
-
-class VideoDecoder {
- public:
-  virtual ~VideoDecoder() {}
-
-  virtual int32_t InitDecode(const VideoCodec* codec_settings,
-                             int32_t number_of_cores) = 0;
-
-  virtual int32_t Decode(const EncodedImage& input_image,
-                         bool missing_frames,
-                         const RTPFragmentationHeader* fragmentation,
-                         const CodecSpecificInfo* codec_specific_info = NULL,
-                         int64_t render_time_ms = -1) = 0;
-
-  virtual int32_t RegisterDecodeCompleteCallback(
-      DecodedImageCallback* callback) = 0;
-
-  virtual int32_t Release() = 0;
-
-  // Returns true if the decoder prefer to decode frames late.
-  // That is, it can not decode infinite number of frames before the decoded
-  // frame is consumed.
-  virtual bool PrefersLateDecoding() const { return true; }
-
-  virtual const char* ImplementationName() const { return "unknown"; }
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_API_VIDEO_CODECS_VIDEO_DECODER_H_
diff --git a/api/video_codecs/video_decoder_factory.h b/api/video_codecs/video_decoder_factory.h
deleted file mode 100644
index 2a44207..0000000
--- a/api/video_codecs/video_decoder_factory.h
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- *  Copyright (c) 2017 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_API_VIDEO_CODECS_VIDEO_DECODER_FACTORY_H_
-#define WEBRTC_API_VIDEO_CODECS_VIDEO_DECODER_FACTORY_H_
-
-#include <memory>
-#include <vector>
-
-namespace webrtc {
-
-class VideoDecoder;
-struct SdpVideoFormat;
-
-// A factory that creates VideoDecoders.
-// NOTE: This class is still under development and may change without notice.
-class VideoDecoderFactory {
- public:
-  // Returns a list of supported video formats in order of preference, to use
-  // for signaling etc.
-  virtual std::vector<SdpVideoFormat> GetSupportedFormats() const = 0;
-
-  // Creates a VideoDecoder for the specified format.
-  virtual std::unique_ptr<VideoDecoder> CreateVideoDecoder(
-      const SdpVideoFormat& format) = 0;
-
-  virtual ~VideoDecoderFactory() {}
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_API_VIDEO_CODECS_VIDEO_DECODER_FACTORY_H_
diff --git a/api/video_codecs/video_encoder.cc b/api/video_codecs/video_encoder.cc
deleted file mode 100644
index f61e4e1..0000000
--- a/api/video_codecs/video_encoder.cc
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- *  Copyright (c) 2017 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/api/video_codecs/video_encoder.h"
-
-namespace webrtc {
-
-// TODO(mflodman): Add default complexity for VP9 and VP9.
-VideoCodecVP8 VideoEncoder::GetDefaultVp8Settings() {
-  VideoCodecVP8 vp8_settings;
-  memset(&vp8_settings, 0, sizeof(vp8_settings));
-
-  vp8_settings.resilience = kResilientStream;
-  vp8_settings.numberOfTemporalLayers = 1;
-  vp8_settings.denoisingOn = true;
-  vp8_settings.errorConcealmentOn = false;
-  vp8_settings.automaticResizeOn = false;
-  vp8_settings.frameDroppingOn = true;
-  vp8_settings.keyFrameInterval = 3000;
-
-  return vp8_settings;
-}
-
-VideoCodecVP9 VideoEncoder::GetDefaultVp9Settings() {
-  VideoCodecVP9 vp9_settings;
-  memset(&vp9_settings, 0, sizeof(vp9_settings));
-
-  vp9_settings.resilienceOn = true;
-  vp9_settings.numberOfTemporalLayers = 1;
-  vp9_settings.denoisingOn = true;
-  vp9_settings.frameDroppingOn = true;
-  vp9_settings.keyFrameInterval = 3000;
-  vp9_settings.adaptiveQpMode = true;
-  vp9_settings.automaticResizeOn = true;
-  vp9_settings.numberOfSpatialLayers = 1;
-  vp9_settings.flexibleMode = false;
-
-  return vp9_settings;
-}
-
-VideoCodecH264 VideoEncoder::GetDefaultH264Settings() {
-  VideoCodecH264 h264_settings;
-  memset(&h264_settings, 0, sizeof(h264_settings));
-
-  h264_settings.frameDroppingOn = true;
-  h264_settings.keyFrameInterval = 3000;
-  h264_settings.spsData = nullptr;
-  h264_settings.spsLen = 0;
-  h264_settings.ppsData = nullptr;
-  h264_settings.ppsLen = 0;
-  h264_settings.profile = H264::kProfileConstrainedBaseline;
-
-  return h264_settings;
-}
-
-VideoEncoder::ScalingSettings::ScalingSettings(bool on, int low, int high)
-    : enabled(on),
-      thresholds(rtc::Optional<QpThresholds>(QpThresholds(low, high))) {}
-
-VideoEncoder::ScalingSettings::ScalingSettings(bool on,
-                                               int low,
-                                               int high,
-                                               int min_pixels)
-    : enabled(on),
-      thresholds(rtc::Optional<QpThresholds>(QpThresholds(low, high))),
-      min_pixels_per_frame(min_pixels) {}
-
-VideoEncoder::ScalingSettings::ScalingSettings(bool on, int min_pixels)
-    : enabled(on), min_pixels_per_frame(min_pixels) {}
-
-VideoEncoder::ScalingSettings::ScalingSettings(bool on) : enabled(on) {}
-
-VideoEncoder::ScalingSettings::~ScalingSettings() {}
-
-
-int32_t VideoEncoder::SetRates(uint32_t bitrate, uint32_t framerate) {
-  RTC_NOTREACHED() << "SetRate(uint32_t, uint32_t) is deprecated.";
-  return -1;
-}
-
-int32_t VideoEncoder::SetRateAllocation(
-    const BitrateAllocation& allocation,
-    uint32_t framerate) {
-  return SetRates(allocation.get_sum_kbps(), framerate);
-}
-
-VideoEncoder::ScalingSettings VideoEncoder::GetScalingSettings() const {
-  return ScalingSettings(false);
-}
-
-int32_t VideoEncoder::SetPeriodicKeyFrames(bool enable) {
-  return -1;
-}
-
-bool VideoEncoder::SupportsNativeHandle() const {
-  return false;
-}
-
-const char* VideoEncoder::ImplementationName() const {
-  return "unknown";
-}
-}  // namespace webrtc
diff --git a/api/video_codecs/video_encoder.h b/api/video_codecs/video_encoder.h
deleted file mode 100644
index 4ec6e45..0000000
--- a/api/video_codecs/video_encoder.h
+++ /dev/null
@@ -1,183 +0,0 @@
-/*
- *  Copyright (c) 2014 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_API_VIDEO_CODECS_VIDEO_ENCODER_H_
-#define WEBRTC_API_VIDEO_CODECS_VIDEO_ENCODER_H_
-
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "webrtc/api/optional.h"
-#include "webrtc/api/video/video_frame.h"
-#include "webrtc/common_types.h"
-#include "webrtc/common_video/include/video_frame.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-class RTPFragmentationHeader;
-// TODO(pbos): Expose these through a public (root) header or change these APIs.
-struct CodecSpecificInfo;
-class VideoCodec;
-
-class EncodedImageCallback {
- public:
-  virtual ~EncodedImageCallback() {}
-
-  struct Result {
-    enum Error {
-      OK,
-
-      // Failed to send the packet.
-      ERROR_SEND_FAILED,
-    };
-
-    explicit Result(Error error) : error(error) {}
-    Result(Error error, uint32_t frame_id) : error(error), frame_id(frame_id) {}
-
-    Error error;
-
-    // Frame ID assigned to the frame. The frame ID should be the same as the ID
-    // seen by the receiver for this frame. RTP timestamp of the frame is used
-    // as frame ID when RTP is used to send video. Must be used only when
-    // error=OK.
-    uint32_t frame_id = 0;
-
-    // Tells the encoder that the next frame is should be dropped.
-    bool drop_next_frame = false;
-  };
-
-  // Callback function which is called when an image has been encoded.
-  virtual Result OnEncodedImage(
-      const EncodedImage& encoded_image,
-      const CodecSpecificInfo* codec_specific_info,
-      const RTPFragmentationHeader* fragmentation) = 0;
-
-  virtual void OnDroppedFrame() {}
-};
-
-class VideoEncoder {
- public:
-  struct QpThresholds {
-    QpThresholds(int l, int h) : low(l), high(h) {}
-    QpThresholds() : low(-1), high(-1) {}
-    int low;
-    int high;
-  };
-  struct ScalingSettings {
-    ScalingSettings(bool on, int low, int high);
-    ScalingSettings(bool on, int low, int high, int min_pixels);
-    ScalingSettings(bool on, int min_pixels);
-    explicit ScalingSettings(bool on);
-    ScalingSettings(const ScalingSettings&);
-    ~ScalingSettings();
-
-    const bool enabled;
-    const rtc::Optional<QpThresholds> thresholds;
-
-    // We will never ask for a resolution lower than this.
-    // TODO(kthelgason): Lower this limit when better testing
-    // on MediaCodec and fallback implementations are in place.
-    // See https://bugs.chromium.org/p/webrtc/issues/detail?id=7206
-    const int min_pixels_per_frame = 320 * 180;
-  };
-
-  static VideoCodecVP8 GetDefaultVp8Settings();
-  static VideoCodecVP9 GetDefaultVp9Settings();
-  static VideoCodecH264 GetDefaultH264Settings();
-
-  virtual ~VideoEncoder() {}
-
-  // Initialize the encoder with the information from the codecSettings
-  //
-  // Input:
-  //          - codec_settings    : Codec settings
-  //          - number_of_cores   : Number of cores available for the encoder
-  //          - max_payload_size  : The maximum size each payload is allowed
-  //                                to have. Usually MTU - overhead.
-  //
-  // Return value                  : Set bit rate if OK
-  //                                 <0 - Errors:
-  //                                  WEBRTC_VIDEO_CODEC_ERR_PARAMETER
-  //                                  WEBRTC_VIDEO_CODEC_ERR_SIZE
-  //                                  WEBRTC_VIDEO_CODEC_LEVEL_EXCEEDED
-  //                                  WEBRTC_VIDEO_CODEC_MEMORY
-  //                                  WEBRTC_VIDEO_CODEC_ERROR
-  virtual int32_t InitEncode(const VideoCodec* codec_settings,
-                             int32_t number_of_cores,
-                             size_t max_payload_size) = 0;
-
-  // Register an encode complete callback object.
-  //
-  // Input:
-  //          - callback         : Callback object which handles encoded images.
-  //
-  // Return value                : WEBRTC_VIDEO_CODEC_OK if OK, < 0 otherwise.
-  virtual int32_t RegisterEncodeCompleteCallback(
-      EncodedImageCallback* callback) = 0;
-
-  // Free encoder memory.
-  // Return value                : WEBRTC_VIDEO_CODEC_OK if OK, < 0 otherwise.
-  virtual int32_t Release() = 0;
-
-  // Encode an I420 image (as a part of a video stream). The encoded image
-  // will be returned to the user through the encode complete callback.
-  //
-  // Input:
-  //          - frame             : Image to be encoded
-  //          - frame_types       : Frame type to be generated by the encoder.
-  //
-  // Return value                 : WEBRTC_VIDEO_CODEC_OK if OK
-  //                                <0 - Errors:
-  //                                  WEBRTC_VIDEO_CODEC_ERR_PARAMETER
-  //                                  WEBRTC_VIDEO_CODEC_MEMORY
-  //                                  WEBRTC_VIDEO_CODEC_ERROR
-  //                                  WEBRTC_VIDEO_CODEC_TIMEOUT
-  virtual int32_t Encode(const VideoFrame& frame,
-                         const CodecSpecificInfo* codec_specific_info,
-                         const std::vector<FrameType>* frame_types) = 0;
-
-  // Inform the encoder of the new packet loss rate and the round-trip time of
-  // the network.
-  //
-  // Input:
-  //          - packet_loss : Fraction lost
-  //                          (loss rate in percent = 100 * packetLoss / 255)
-  //          - rtt         : Round-trip time in milliseconds
-  // Return value           : WEBRTC_VIDEO_CODEC_OK if OK
-  //                          <0 - Errors: WEBRTC_VIDEO_CODEC_ERROR
-  virtual int32_t SetChannelParameters(uint32_t packet_loss, int64_t rtt) = 0;
-
-  // Inform the encoder about the new target bit rate.
-  //
-  // Input:
-  //          - bitrate         : New target bit rate
-  //          - framerate       : The target frame rate
-  //
-  // Return value                : WEBRTC_VIDEO_CODEC_OK if OK, < 0 otherwise.
-  virtual int32_t SetRates(uint32_t bitrate, uint32_t framerate);
-
-  // Default fallback: Just use the sum of bitrates as the single target rate.
-  // TODO(sprang): Remove this default implementation when we remove SetRates().
-  virtual int32_t SetRateAllocation(const BitrateAllocation& allocation,
-                                    uint32_t framerate);
-
-  // Any encoder implementation wishing to use the WebRTC provided
-  // quality scaler must implement this method.
-  virtual ScalingSettings GetScalingSettings() const;
-
-  virtual int32_t SetPeriodicKeyFrames(bool enable);
-  virtual bool SupportsNativeHandle() const;
-  virtual const char* ImplementationName() const;
-};
-}  // namespace webrtc
-#endif  // WEBRTC_API_VIDEO_CODECS_VIDEO_ENCODER_H_
diff --git a/api/video_codecs/video_encoder_factory.h b/api/video_codecs/video_encoder_factory.h
deleted file mode 100644
index 4e77392..0000000
--- a/api/video_codecs/video_encoder_factory.h
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- *  Copyright (c) 2017 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_API_VIDEO_CODECS_VIDEO_ENCODER_FACTORY_H_
-#define WEBRTC_API_VIDEO_CODECS_VIDEO_ENCODER_FACTORY_H_
-
-#include <memory>
-#include <vector>
-
-namespace webrtc {
-
-class VideoEncoder;
-struct SdpVideoFormat;
-
-// A factory that creates VideoEncoders.
-// NOTE: This class is still under development and may change without notice.
-class VideoEncoderFactory {
- public:
-  // TODO(magjed): Try to get rid of this struct.
-  struct CodecInfo {
-    // |is_hardware_accelerated| is true if the encoders created by this factory
-    // of the given codec will use hardware support.
-    bool is_hardware_accelerated;
-    // |has_internal_source| is true if encoders created by this factory of the
-    // given codec will use internal camera sources, meaning that they don't
-    // require/expect frames to be delivered via webrtc::VideoEncoder::Encode.
-    // This flag is used as the internal_source parameter to
-    // webrtc::ViEExternalCodec::RegisterExternalSendCodec.
-    bool has_internal_source;
-  };
-
-  // Returns a list of supported video formats in order of preference, to use
-  // for signaling etc.
-  virtual std::vector<SdpVideoFormat> GetSupportedFormats() const = 0;
-
-  // Returns information about how this format will be encoded. The specified
-  // format must be one of the supported formats by this factory.
-  // TODO(magjed): Try to get rid of this method.
-  virtual CodecInfo QueryVideoEncoder(const SdpVideoFormat& format) const = 0;
-
-  // Creates a VideoEncoder for the specified format.
-  virtual std::unique_ptr<VideoEncoder> CreateVideoEncoder(
-      const SdpVideoFormat& format) = 0;
-
-  virtual ~VideoEncoderFactory() {}
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_API_VIDEO_CODECS_VIDEO_ENCODER_FACTORY_H_
diff --git a/api/videosourceproxy.h b/api/videosourceproxy.h
deleted file mode 100644
index a00a21d..0000000
--- a/api/videosourceproxy.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- *  Copyright 2012 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_API_VIDEOSOURCEPROXY_H_
-#define WEBRTC_API_VIDEOSOURCEPROXY_H_
-
-#include "webrtc/api/proxy.h"
-#include "webrtc/api/mediastreaminterface.h"
-
-namespace webrtc {
-
-// Makes sure the real VideoTrackSourceInterface implementation is destroyed on
-// the signaling thread and marshals all method calls to the signaling thread.
-// TODO(deadbeef): Move this to .cc file and out of api/. What threads methods
-// are called on is an implementation detail.
-BEGIN_PROXY_MAP(VideoTrackSource)
-  PROXY_SIGNALING_THREAD_DESTRUCTOR()
-  PROXY_CONSTMETHOD0(SourceState, state)
-  PROXY_CONSTMETHOD0(bool, remote)
-  PROXY_CONSTMETHOD0(bool, is_screencast)
-  PROXY_CONSTMETHOD0(rtc::Optional<bool>, needs_denoising)
-  PROXY_METHOD1(bool, GetStats, Stats*)
-  PROXY_WORKER_METHOD2(void,
-                       AddOrUpdateSink,
-                       rtc::VideoSinkInterface<VideoFrame>*,
-                       const rtc::VideoSinkWants&)
-  PROXY_WORKER_METHOD1(void, RemoveSink, rtc::VideoSinkInterface<VideoFrame>*)
-  PROXY_METHOD1(void, RegisterObserver, ObserverInterface*)
-  PROXY_METHOD1(void, UnregisterObserver, ObserverInterface*)
-END_PROXY_MAP()
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_API_VIDEOSOURCEPROXY_H_
diff --git a/api/videotracksource.h b/api/videotracksource.h
deleted file mode 100644
index 45366cd..0000000
--- a/api/videotracksource.h
+++ /dev/null
@@ -1,18 +0,0 @@
-/*
- *  Copyright 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_API_VIDEOTRACKSOURCE_H_
-#define WEBRTC_API_VIDEOTRACKSOURCE_H_
-
-// Including this file is deprecated. It is no longer part of the public API.
-// This only includes the file in its new location for backwards compatibility.
-#include "webrtc/pc/videotracksource.h"
-
-#endif  //  WEBRTC_API_VIDEOTRACKSOURCE_H_
diff --git a/api/webrtcsdp.h b/api/webrtcsdp.h
deleted file mode 100644
index bd7809a..0000000
--- a/api/webrtcsdp.h
+++ /dev/null
@@ -1,18 +0,0 @@
-/*
- *  Copyright 2011 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_API_WEBRTCSDP_H_
-#define WEBRTC_API_WEBRTCSDP_H_
-
-// Including this file is deprecated. It is no longer part of the public API.
-// This only includes the file in its new location for backwards compatibility.
-#include "webrtc/pc/webrtcsdp.h"
-
-#endif  // WEBRTC_API_WEBRTCSDP_H_
diff --git a/audio/BUILD.gn b/audio/BUILD.gn
deleted file mode 100644
index 890de51..0000000
--- a/audio/BUILD.gn
+++ /dev/null
@@ -1,203 +0,0 @@
-# Copyright (c) 2015 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.
-
-import("../webrtc.gni")
-if (is_android) {
-  import("//build/config/android/config.gni")
-  import("//build/config/android/rules.gni")
-}
-
-rtc_static_library("audio") {
-  sources = [
-    "audio_receive_stream.cc",
-    "audio_receive_stream.h",
-    "audio_send_stream.cc",
-    "audio_send_stream.h",
-    "audio_state.cc",
-    "audio_state.h",
-    "audio_transport_proxy.cc",
-    "audio_transport_proxy.h",
-    "conversion.h",
-    "scoped_voe_interface.h",
-    "time_interval.cc",
-    "time_interval.h",
-  ]
-
-  if (!build_with_chromium && is_clang) {
-    # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-    suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-  }
-
-  deps = [
-    "..:webrtc_common",
-    "../api:audio_mixer_api",
-    "../api:call_api",
-    "../api:optional",
-    "../api/audio_codecs:audio_codecs_api",
-    "../api/audio_codecs:builtin_audio_encoder_factory",
-    "../call:call_interfaces",
-    "../call:rtp_interfaces",
-    "../common_audio",
-    "../modules/audio_coding:cng",
-    "../modules/audio_device",
-    "../modules/audio_processing",
-    "../modules/bitrate_controller:bitrate_controller",
-    "../modules/congestion_controller:congestion_controller",
-    "../modules/pacing:pacing",
-    "../modules/remote_bitrate_estimator:remote_bitrate_estimator",
-    "../modules/rtp_rtcp:rtp_rtcp",
-    "../rtc_base:rtc_base_approved",
-    "../rtc_base:rtc_task_queue",
-    "../system_wrappers",
-    "../voice_engine",
-  ]
-}
-if (rtc_include_tests) {
-  rtc_source_set("audio_end_to_end_test") {
-    testonly = true
-
-    sources = [
-      "test/audio_end_to_end_test.cc",
-      "test/audio_end_to_end_test.h",
-    ]
-    deps = [
-      ":audio",
-      "../system_wrappers:system_wrappers",
-      "../test:fake_audio_device",
-      "../test:test_common",
-      "../test:test_support",
-    ]
-
-    if (!build_with_chromium && is_clang) {
-      # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-    }
-  }
-
-  rtc_source_set("audio_tests") {
-    testonly = true
-
-    # Skip restricting visibility on mobile platforms since the tests on those
-    # gets additional generated targets which would require many lines here to
-    # cover (which would be confusing to read and hard to maintain).
-    if (!is_android && !is_ios) {
-      visibility = [ "..:video_engine_tests" ]
-    }
-
-    # TODO(kjellander): Remove (bugs.webrtc.org/6828)
-    # This needs remote_bitrate_estimator to be moved to webrtc/api first.
-    check_includes = false
-
-    sources = [
-      "audio_receive_stream_unittest.cc",
-      "audio_send_stream_unittest.cc",
-      "audio_state_unittest.cc",
-      "time_interval_unittest.cc",
-    ]
-    deps = [
-      ":audio",
-      ":audio_end_to_end_test",
-      "../api:mock_audio_mixer",
-      "../call:rtp_receiver",
-      "../modules/audio_device:mock_audio_device",
-      "../modules/audio_mixer:audio_mixer_impl",
-      "../modules/congestion_controller:congestion_controller",
-      "../modules/congestion_controller:mock_congestion_controller",
-      "../modules/pacing:pacing",
-      "../rtc_base:rtc_base_approved",
-      "../rtc_base:rtc_task_queue",
-      "../test:test_common",
-      "../test:test_support",
-      "utility:utility_tests",
-      "//testing/gmock",
-      "//testing/gtest",
-    ]
-
-    if (!rtc_use_memcheck) {
-      # This test is timing dependent, which rules out running on memcheck bots.
-      sources += [ "test/audio_stats_test.cc" ]
-    }
-
-    if (!build_with_chromium && is_clang) {
-      # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-    }
-  }
-
-  if (rtc_enable_protobuf) {
-    rtc_test("low_bandwidth_audio_test") {
-      testonly = true
-
-      sources = [
-        "test/low_bandwidth_audio_test.cc",
-      ]
-
-      deps = [
-        ":audio_end_to_end_test",
-        "../common_audio",
-        "../rtc_base:rtc_base_approved",
-        "../system_wrappers",
-        "../test:fake_audio_device",
-        "../test:test_common",
-        "../test:test_main",
-        "//testing/gmock",
-        "//testing/gtest",
-      ]
-      if (is_android) {
-        deps += [ "//testing/android/native_test:native_test_native_code" ]
-      }
-
-      data = [
-        "../../resources/voice_engine/audio_tiny16.wav",
-        "../../resources/voice_engine/audio_tiny48.wav",
-        "../../resources/voice_engine/audio_dtx16.wav",
-      ]
-
-      if (!build_with_chromium && is_clang) {
-        # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163)
-        suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-      }
-    }
-  }
-
-  rtc_source_set("audio_perf_tests") {
-    testonly = true
-
-    # Skip restricting visibility on mobile platforms since the tests on those
-    # gets additional generated targets which would require many lines here to
-    # cover (which would be confusing to read and hard to maintain).
-    if (!is_android && !is_ios) {
-      visibility = [ "..:webrtc_perf_tests" ]
-    }
-    sources = [
-      "test/audio_bwe_integration_test.cc",
-      "test/audio_bwe_integration_test.h",
-    ]
-    deps = [
-      "../common_audio",
-      "../rtc_base:rtc_base_approved",
-      "../system_wrappers",
-      "../test:fake_audio_device",
-      "../test:field_trial",
-      "../test:single_threaded_task_queue",
-      "../test:test_common",
-      "../test:test_main",
-      "//testing/gmock",
-      "//testing/gtest",
-    ]
-
-    data = [
-      "//resources/voice_engine/audio_dtx16.wav",
-    ]
-
-    if (!build_with_chromium && is_clang) {
-      # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-    }
-  }
-}
diff --git a/audio/DEPS b/audio/DEPS
deleted file mode 100644
index e77e1d1..0000000
--- a/audio/DEPS
+++ /dev/null
@@ -1,28 +0,0 @@
-include_rules = [
-  "+webrtc/call",
-  "+webrtc/common_audio",
-  "+webrtc/logging/rtc_event_log",
-  "+webrtc/modules/audio_coding",
-  "+webrtc/modules/audio_device",
-  "+webrtc/modules/audio_mixer",
-  "+webrtc/modules/audio_processing/include",
-  "+webrtc/modules/bitrate_controller",
-  "+webrtc/modules/congestion_controller",
-  "+webrtc/modules/pacing",
-  "+webrtc/modules/remote_bitrate_estimator",
-  "+webrtc/modules/rtp_rtcp",
-  "+webrtc/system_wrappers",
-  "+webrtc/voice_engine",
-]
-
-specific_include_rules = {
-  "audio_send_stream.cc": [
-    "+webrtc/modules/audio_coding/codecs/cng/audio_encoder_cng.h",
-  ],
-  # TODO(ossu): Remove this exception when builtin_audio_encoder_factory.h
-  # has moved to api/, or when the proper mocks have been made.
-  "audio_send_stream_unittest.cc": [
-    "+webrtc/modules/audio_coding/codecs/builtin_audio_encoder_factory.h",
-  ],
-}
-
diff --git a/audio/OWNERS b/audio/OWNERS
deleted file mode 100644
index d53e4fa..0000000
--- a/audio/OWNERS
+++ /dev/null
@@ -1,7 +0,0 @@
-solenberg@webrtc.org
-ossu@webrtc.org
-
-# These are for the common case of adding or renaming files. If you're doing
-# structural changes, please get a review from a reviewer in this file.
-per-file *.gn=*
-per-file *.gni=*
diff --git a/audio/audio_receive_stream.cc b/audio/audio_receive_stream.cc
deleted file mode 100644
index b7ea047..0000000
--- a/audio/audio_receive_stream.cc
+++ /dev/null
@@ -1,353 +0,0 @@
-/*
- *  Copyright (c) 2015 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/audio/audio_receive_stream.h"
-
-#include <string>
-#include <utility>
-
-#include "webrtc/api/call/audio_sink.h"
-#include "webrtc/audio/audio_send_stream.h"
-#include "webrtc/audio/audio_state.h"
-#include "webrtc/audio/conversion.h"
-#include "webrtc/call/rtp_stream_receiver_controller_interface.h"
-#include "webrtc/modules/remote_bitrate_estimator/include/remote_bitrate_estimator.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_receiver.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/timeutils.h"
-#include "webrtc/voice_engine/channel_proxy.h"
-#include "webrtc/voice_engine/include/voe_base.h"
-#include "webrtc/voice_engine/voice_engine_impl.h"
-
-namespace webrtc {
-
-std::string AudioReceiveStream::Config::Rtp::ToString() const {
-  std::stringstream ss;
-  ss << "{remote_ssrc: " << remote_ssrc;
-  ss << ", local_ssrc: " << local_ssrc;
-  ss << ", transport_cc: " << (transport_cc ? "on" : "off");
-  ss << ", nack: " << nack.ToString();
-  ss << ", extensions: [";
-  for (size_t i = 0; i < extensions.size(); ++i) {
-    ss << extensions[i].ToString();
-    if (i != extensions.size() - 1) {
-      ss << ", ";
-    }
-  }
-  ss << ']';
-  ss << '}';
-  return ss.str();
-}
-
-std::string AudioReceiveStream::Config::ToString() const {
-  std::stringstream ss;
-  ss << "{rtp: " << rtp.ToString();
-  ss << ", rtcp_send_transport: "
-     << (rtcp_send_transport ? "(Transport)" : "null");
-  ss << ", voe_channel_id: " << voe_channel_id;
-  if (!sync_group.empty()) {
-    ss << ", sync_group: " << sync_group;
-  }
-  ss << '}';
-  return ss.str();
-}
-
-namespace internal {
-AudioReceiveStream::AudioReceiveStream(
-    RtpStreamReceiverControllerInterface* receiver_controller,
-    PacketRouter* packet_router,
-    const webrtc::AudioReceiveStream::Config& config,
-    const rtc::scoped_refptr<webrtc::AudioState>& audio_state,
-    webrtc::RtcEventLog* event_log)
-    : config_(config), audio_state_(audio_state) {
-  LOG(LS_INFO) << "AudioReceiveStream: " << config_.ToString();
-  RTC_DCHECK_NE(config_.voe_channel_id, -1);
-  RTC_DCHECK(audio_state_.get());
-  RTC_DCHECK(packet_router);
-
-  module_process_thread_checker_.DetachFromThread();
-
-  VoiceEngineImpl* voe_impl = static_cast<VoiceEngineImpl*>(voice_engine());
-  channel_proxy_ = voe_impl->GetChannelProxy(config_.voe_channel_id);
-  channel_proxy_->SetRtcEventLog(event_log);
-  channel_proxy_->SetLocalSSRC(config.rtp.local_ssrc);
-  // TODO(solenberg): Config NACK history window (which is a packet count),
-  // using the actual packet size for the configured codec.
-  channel_proxy_->SetNACKStatus(config_.rtp.nack.rtp_history_ms != 0,
-                                config_.rtp.nack.rtp_history_ms / 20);
-
-  // TODO(ossu): This is where we'd like to set the decoder factory to
-  // use. However, since it needs to be included when constructing Channel, we
-  // cannot do that until we're able to move Channel ownership into the
-  // Audio{Send,Receive}Streams.  The best we can do is check that we're not
-  // trying to use two different factories using the different interfaces.
-  RTC_CHECK(config.decoder_factory);
-  RTC_CHECK_EQ(config.decoder_factory,
-               channel_proxy_->GetAudioDecoderFactory());
-
-  channel_proxy_->RegisterExternalTransport(config.rtcp_send_transport);
-  channel_proxy_->SetReceiveCodecs(config.decoder_map);
-
-  for (const auto& extension : config.rtp.extensions) {
-    if (extension.uri == RtpExtension::kAudioLevelUri) {
-      channel_proxy_->SetReceiveAudioLevelIndicationStatus(true, extension.id);
-    } else if (extension.uri == RtpExtension::kTransportSequenceNumberUri) {
-      channel_proxy_->EnableReceiveTransportSequenceNumber(extension.id);
-    } else {
-      RTC_NOTREACHED() << "Unsupported RTP extension.";
-    }
-  }
-  // Configure bandwidth estimation.
-  channel_proxy_->RegisterReceiverCongestionControlObjects(packet_router);
-
-  // Register with transport.
-  rtp_stream_receiver_ =
-      receiver_controller->CreateReceiver(config_.rtp.remote_ssrc,
-                                          channel_proxy_.get());
-}
-
-AudioReceiveStream::~AudioReceiveStream() {
-  RTC_DCHECK_RUN_ON(&worker_thread_checker_);
-  LOG(LS_INFO) << "~AudioReceiveStream: " << config_.ToString();
-  if (playing_) {
-    Stop();
-  }
-  channel_proxy_->DisassociateSendChannel();
-  channel_proxy_->DeRegisterExternalTransport();
-  channel_proxy_->ResetReceiverCongestionControlObjects();
-  channel_proxy_->SetRtcEventLog(nullptr);
-}
-
-void AudioReceiveStream::Start() {
-  RTC_DCHECK_RUN_ON(&worker_thread_checker_);
-  if (playing_) {
-    return;
-  }
-
-  int error = SetVoiceEnginePlayout(true);
-  if (error != 0) {
-    LOG(LS_ERROR) << "AudioReceiveStream::Start failed with error: " << error;
-    return;
-  }
-
-  if (!audio_state()->mixer()->AddSource(this)) {
-    LOG(LS_ERROR) << "Failed to add source to mixer.";
-    SetVoiceEnginePlayout(false);
-    return;
-  }
-
-  playing_ = true;
-}
-
-void AudioReceiveStream::Stop() {
-  RTC_DCHECK_RUN_ON(&worker_thread_checker_);
-  if (!playing_) {
-    return;
-  }
-  playing_ = false;
-
-  audio_state()->mixer()->RemoveSource(this);
-  SetVoiceEnginePlayout(false);
-}
-
-webrtc::AudioReceiveStream::Stats AudioReceiveStream::GetStats() const {
-  RTC_DCHECK_RUN_ON(&worker_thread_checker_);
-  webrtc::AudioReceiveStream::Stats stats;
-  stats.remote_ssrc = config_.rtp.remote_ssrc;
-
-  webrtc::CallStatistics call_stats = channel_proxy_->GetRTCPStatistics();
-  // TODO(solenberg): Don't return here if we can't get the codec - return the
-  //                  stats we *can* get.
-  webrtc::CodecInst codec_inst = {0};
-  if (!channel_proxy_->GetRecCodec(&codec_inst)) {
-    return stats;
-  }
-
-  stats.bytes_rcvd = call_stats.bytesReceived;
-  stats.packets_rcvd = call_stats.packetsReceived;
-  stats.packets_lost = call_stats.cumulativeLost;
-  stats.fraction_lost = Q8ToFloat(call_stats.fractionLost);
-  stats.capture_start_ntp_time_ms = call_stats.capture_start_ntp_time_ms_;
-  if (codec_inst.pltype != -1) {
-    stats.codec_name = codec_inst.plname;
-    stats.codec_payload_type = rtc::Optional<int>(codec_inst.pltype);
-  }
-  stats.ext_seqnum = call_stats.extendedMax;
-  if (codec_inst.plfreq / 1000 > 0) {
-    stats.jitter_ms = call_stats.jitterSamples / (codec_inst.plfreq / 1000);
-  }
-  stats.delay_estimate_ms = channel_proxy_->GetDelayEstimate();
-  stats.audio_level = channel_proxy_->GetSpeechOutputLevelFullRange();
-  stats.total_output_energy = channel_proxy_->GetTotalOutputEnergy();
-  stats.total_output_duration = channel_proxy_->GetTotalOutputDuration();
-
-  // Get jitter buffer and total delay (alg + jitter + playout) stats.
-  auto ns = channel_proxy_->GetNetworkStatistics();
-  stats.jitter_buffer_ms = ns.currentBufferSize;
-  stats.jitter_buffer_preferred_ms = ns.preferredBufferSize;
-  stats.total_samples_received = ns.totalSamplesReceived;
-  stats.concealed_samples = ns.concealedSamples;
-  stats.expand_rate = Q14ToFloat(ns.currentExpandRate);
-  stats.speech_expand_rate = Q14ToFloat(ns.currentSpeechExpandRate);
-  stats.secondary_decoded_rate = Q14ToFloat(ns.currentSecondaryDecodedRate);
-  stats.secondary_discarded_rate = Q14ToFloat(ns.currentSecondaryDiscardedRate);
-  stats.accelerate_rate = Q14ToFloat(ns.currentAccelerateRate);
-  stats.preemptive_expand_rate = Q14ToFloat(ns.currentPreemptiveRate);
-
-  auto ds = channel_proxy_->GetDecodingCallStatistics();
-  stats.decoding_calls_to_silence_generator = ds.calls_to_silence_generator;
-  stats.decoding_calls_to_neteq = ds.calls_to_neteq;
-  stats.decoding_normal = ds.decoded_normal;
-  stats.decoding_plc = ds.decoded_plc;
-  stats.decoding_cng = ds.decoded_cng;
-  stats.decoding_plc_cng = ds.decoded_plc_cng;
-  stats.decoding_muted_output = ds.decoded_muted_output;
-
-  return stats;
-}
-
-int AudioReceiveStream::GetOutputLevel() const {
-  RTC_DCHECK_RUN_ON(&worker_thread_checker_);
-  return channel_proxy_->GetSpeechOutputLevel();
-}
-
-void AudioReceiveStream::SetSink(std::unique_ptr<AudioSinkInterface> sink) {
-  RTC_DCHECK_RUN_ON(&worker_thread_checker_);
-  channel_proxy_->SetSink(std::move(sink));
-}
-
-void AudioReceiveStream::SetGain(float gain) {
-  RTC_DCHECK_RUN_ON(&worker_thread_checker_);
-  channel_proxy_->SetChannelOutputVolumeScaling(gain);
-}
-
-std::vector<RtpSource> AudioReceiveStream::GetSources() const {
-  RTC_DCHECK_RUN_ON(&worker_thread_checker_);
-  return channel_proxy_->GetSources();
-}
-
-AudioMixer::Source::AudioFrameInfo AudioReceiveStream::GetAudioFrameWithInfo(
-    int sample_rate_hz,
-    AudioFrame* audio_frame) {
-  return channel_proxy_->GetAudioFrameWithInfo(sample_rate_hz, audio_frame);
-}
-
-int AudioReceiveStream::Ssrc() const {
-  return config_.rtp.remote_ssrc;
-}
-
-int AudioReceiveStream::PreferredSampleRate() const {
-  return channel_proxy_->NeededFrequency();
-}
-
-int AudioReceiveStream::id() const {
-  RTC_DCHECK_RUN_ON(&worker_thread_checker_);
-  return config_.rtp.remote_ssrc;
-}
-
-rtc::Optional<Syncable::Info> AudioReceiveStream::GetInfo() const {
-  RTC_DCHECK_RUN_ON(&module_process_thread_checker_);
-  Syncable::Info info;
-
-  RtpRtcp* rtp_rtcp = nullptr;
-  RtpReceiver* rtp_receiver = nullptr;
-  channel_proxy_->GetRtpRtcp(&rtp_rtcp, &rtp_receiver);
-  RTC_DCHECK(rtp_rtcp);
-  RTC_DCHECK(rtp_receiver);
-
-  if (!rtp_receiver->Timestamp(&info.latest_received_capture_timestamp)) {
-    return rtc::Optional<Syncable::Info>();
-  }
-  if (!rtp_receiver->LastReceivedTimeMs(&info.latest_receive_time_ms)) {
-    return rtc::Optional<Syncable::Info>();
-  }
-  if (rtp_rtcp->RemoteNTP(&info.capture_time_ntp_secs,
-                          &info.capture_time_ntp_frac,
-                          nullptr,
-                          nullptr,
-                          &info.capture_time_source_clock) != 0) {
-    return rtc::Optional<Syncable::Info>();
-  }
-
-  info.current_delay_ms = channel_proxy_->GetDelayEstimate();
-  return rtc::Optional<Syncable::Info>(info);
-}
-
-uint32_t AudioReceiveStream::GetPlayoutTimestamp() const {
-  // Called on video capture thread.
-  return channel_proxy_->GetPlayoutTimestamp();
-}
-
-void AudioReceiveStream::SetMinimumPlayoutDelay(int delay_ms) {
-  RTC_DCHECK_RUN_ON(&module_process_thread_checker_);
-  return channel_proxy_->SetMinimumPlayoutDelay(delay_ms);
-}
-
-void AudioReceiveStream::AssociateSendStream(AudioSendStream* send_stream) {
-  RTC_DCHECK_RUN_ON(&worker_thread_checker_);
-  if (send_stream) {
-    VoiceEngineImpl* voe_impl = static_cast<VoiceEngineImpl*>(voice_engine());
-    std::unique_ptr<voe::ChannelProxy> send_channel_proxy =
-        voe_impl->GetChannelProxy(send_stream->GetConfig().voe_channel_id);
-    channel_proxy_->AssociateSendChannel(*send_channel_proxy.get());
-  } else {
-    channel_proxy_->DisassociateSendChannel();
-  }
-}
-
-void AudioReceiveStream::SignalNetworkState(NetworkState state) {
-  RTC_DCHECK_RUN_ON(&worker_thread_checker_);
-}
-
-bool AudioReceiveStream::DeliverRtcp(const uint8_t* packet, size_t length) {
-  // TODO(solenberg): Tests call this function on a network thread, libjingle
-  // calls on the worker thread. We should move towards always using a network
-  // thread. Then this check can be enabled.
-  // RTC_DCHECK(!thread_checker_.CalledOnValidThread());
-  return channel_proxy_->ReceivedRTCPPacket(packet, length);
-}
-
-void AudioReceiveStream::OnRtpPacket(const RtpPacketReceived& packet) {
-  // TODO(solenberg): Tests call this function on a network thread, libjingle
-  // calls on the worker thread. We should move towards always using a network
-  // thread. Then this check can be enabled.
-  // RTC_DCHECK(!thread_checker_.CalledOnValidThread());
-  channel_proxy_->OnRtpPacket(packet);
-}
-
-const webrtc::AudioReceiveStream::Config& AudioReceiveStream::config() const {
-  RTC_DCHECK_RUN_ON(&worker_thread_checker_);
-  return config_;
-}
-
-VoiceEngine* AudioReceiveStream::voice_engine() const {
-  auto* voice_engine = audio_state()->voice_engine();
-  RTC_DCHECK(voice_engine);
-  return voice_engine;
-}
-
-internal::AudioState* AudioReceiveStream::audio_state() const {
-  auto* audio_state = static_cast<internal::AudioState*>(audio_state_.get());
-  RTC_DCHECK(audio_state);
-  return audio_state;
-}
-
-int AudioReceiveStream::SetVoiceEnginePlayout(bool playout) {
-  ScopedVoEInterface<VoEBase> base(voice_engine());
-  if (playout) {
-    return base->StartPlayout(config_.voe_channel_id);
-  } else {
-    return base->StopPlayout(config_.voe_channel_id);
-  }
-}
-}  // namespace internal
-}  // namespace webrtc
diff --git a/audio/audio_receive_stream.h b/audio/audio_receive_stream.h
deleted file mode 100644
index 0615dc1..0000000
--- a/audio/audio_receive_stream.h
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- *  Copyright (c) 2015 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_AUDIO_AUDIO_RECEIVE_STREAM_H_
-#define WEBRTC_AUDIO_AUDIO_RECEIVE_STREAM_H_
-
-#include <memory>
-#include <vector>
-
-#include "webrtc/api/audio/audio_mixer.h"
-#include "webrtc/audio/audio_state.h"
-#include "webrtc/call/audio_receive_stream.h"
-#include "webrtc/call/rtp_packet_sink_interface.h"
-#include "webrtc/call/syncable.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/thread_checker.h"
-
-namespace webrtc {
-class PacketRouter;
-class RtcEventLog;
-class RtpPacketReceived;
-class RtpStreamReceiverControllerInterface;
-class RtpStreamReceiverInterface;
-
-namespace voe {
-class ChannelProxy;
-}  // namespace voe
-
-namespace internal {
-class AudioSendStream;
-
-class AudioReceiveStream final : public webrtc::AudioReceiveStream,
-                                 public AudioMixer::Source,
-                                 public Syncable {
- public:
-  AudioReceiveStream(RtpStreamReceiverControllerInterface* receiver_controller,
-                     PacketRouter* packet_router,
-                     const webrtc::AudioReceiveStream::Config& config,
-                     const rtc::scoped_refptr<webrtc::AudioState>& audio_state,
-                     webrtc::RtcEventLog* event_log);
-  ~AudioReceiveStream() override;
-
-  // webrtc::AudioReceiveStream implementation.
-  void Start() override;
-  void Stop() override;
-  webrtc::AudioReceiveStream::Stats GetStats() const override;
-  int GetOutputLevel() const override;
-  void SetSink(std::unique_ptr<AudioSinkInterface> sink) override;
-  void SetGain(float gain) override;
-  std::vector<webrtc::RtpSource> GetSources() const override;
-
-  // TODO(nisse): We don't formally implement RtpPacketSinkInterface, and this
-  // method shouldn't be needed. But it's currently used by the
-  // AudioReceiveStreamTest.ReceiveRtpPacket unittest. Figure out if that test
-  // shuld be refactored or deleted, and then delete this method.
-  void OnRtpPacket(const RtpPacketReceived& packet);
-
-  // AudioMixer::Source
-  AudioFrameInfo GetAudioFrameWithInfo(int sample_rate_hz,
-                                       AudioFrame* audio_frame) override;
-  int Ssrc() const override;
-  int PreferredSampleRate() const override;
-
-  // Syncable
-  int id() const override;
-  rtc::Optional<Syncable::Info> GetInfo() const override;
-  uint32_t GetPlayoutTimestamp() const override;
-  void SetMinimumPlayoutDelay(int delay_ms) override;
-
-  void AssociateSendStream(AudioSendStream* send_stream);
-  void SignalNetworkState(NetworkState state);
-  bool DeliverRtcp(const uint8_t* packet, size_t length);
-  const webrtc::AudioReceiveStream::Config& config() const;
-
- private:
-  VoiceEngine* voice_engine() const;
-  AudioState* audio_state() const;
-  int SetVoiceEnginePlayout(bool playout);
-
-  rtc::ThreadChecker worker_thread_checker_;
-  rtc::ThreadChecker module_process_thread_checker_;
-  const webrtc::AudioReceiveStream::Config config_;
-  rtc::scoped_refptr<webrtc::AudioState> audio_state_;
-  std::unique_ptr<voe::ChannelProxy> channel_proxy_;
-
-  bool playing_ RTC_ACCESS_ON(worker_thread_checker_) = false;
-
-  std::unique_ptr<RtpStreamReceiverInterface> rtp_stream_receiver_;
-
-  RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(AudioReceiveStream);
-};
-}  // namespace internal
-}  // namespace webrtc
-
-#endif  // WEBRTC_AUDIO_AUDIO_RECEIVE_STREAM_H_
diff --git a/audio/audio_receive_stream_unittest.cc b/audio/audio_receive_stream_unittest.cc
deleted file mode 100644
index 0d58614..0000000
--- a/audio/audio_receive_stream_unittest.cc
+++ /dev/null
@@ -1,388 +0,0 @@
-/*
- *  Copyright (c) 2015 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 <map>
-#include <string>
-#include <vector>
-
-#include "webrtc/api/test/mock_audio_mixer.h"
-#include "webrtc/audio/audio_receive_stream.h"
-#include "webrtc/audio/conversion.h"
-#include "webrtc/call/rtp_stream_receiver_controller.h"
-#include "webrtc/logging/rtc_event_log/mock/mock_rtc_event_log.h"
-#include "webrtc/modules/audio_processing/include/mock_audio_processing.h"
-#include "webrtc/modules/bitrate_controller/include/mock/mock_bitrate_controller.h"
-#include "webrtc/modules/pacing/packet_router.h"
-#include "webrtc/modules/rtp_rtcp/source/byte_io.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/mock_audio_decoder_factory.h"
-#include "webrtc/test/mock_voe_channel_proxy.h"
-#include "webrtc/test/mock_voice_engine.h"
-
-namespace webrtc {
-namespace test {
-namespace {
-
-using testing::_;
-using testing::FloatEq;
-using testing::Return;
-using testing::ReturnRef;
-
-AudioDecodingCallStats MakeAudioDecodeStatsForTest() {
-  AudioDecodingCallStats audio_decode_stats;
-  audio_decode_stats.calls_to_silence_generator = 234;
-  audio_decode_stats.calls_to_neteq = 567;
-  audio_decode_stats.decoded_normal = 890;
-  audio_decode_stats.decoded_plc = 123;
-  audio_decode_stats.decoded_cng = 456;
-  audio_decode_stats.decoded_plc_cng = 789;
-  audio_decode_stats.decoded_muted_output = 987;
-  return audio_decode_stats;
-}
-
-const int kChannelId = 2;
-const uint32_t kRemoteSsrc = 1234;
-const uint32_t kLocalSsrc = 5678;
-const size_t kOneByteExtensionHeaderLength = 4;
-const size_t kOneByteExtensionLength = 4;
-const int kAudioLevelId = 3;
-const int kTransportSequenceNumberId = 4;
-const int kJitterBufferDelay = -7;
-const int kPlayoutBufferDelay = 302;
-const unsigned int kSpeechOutputLevel = 99;
-const double kTotalOutputEnergy = 0.25;
-const double kTotalOutputDuration = 0.5;
-
-const CallStatistics kCallStats = {
-    345,  678,  901, 234, -12, 3456, 7890, 567, 890, 123};
-const CodecInst kCodecInst = {
-    123, "codec_name_recv", 96000, -187, 0, -103};
-const NetworkStatistics kNetworkStats = {123, 456, false, 789012, 3456, 0, {},
-                                         789, 12,  345,   678,    901,  0, -1,
-                                         -1,  -1,  -1,    -1,     0};
-const AudioDecodingCallStats kAudioDecodeStats = MakeAudioDecodeStatsForTest();
-
-struct ConfigHelper {
-  ConfigHelper()
-      : decoder_factory_(new rtc::RefCountedObject<MockAudioDecoderFactory>),
-        audio_mixer_(new rtc::RefCountedObject<MockAudioMixer>()) {
-    using testing::Invoke;
-
-    EXPECT_CALL(voice_engine_,
-        RegisterVoiceEngineObserver(_)).WillOnce(Return(0));
-    EXPECT_CALL(voice_engine_,
-        DeRegisterVoiceEngineObserver()).WillOnce(Return(0));
-    EXPECT_CALL(voice_engine_, audio_device_module());
-    EXPECT_CALL(voice_engine_, audio_transport());
-
-    AudioState::Config config;
-    config.voice_engine = &voice_engine_;
-    config.audio_mixer = audio_mixer_;
-    config.audio_processing = new rtc::RefCountedObject<MockAudioProcessing>();
-    audio_state_ = AudioState::Create(config);
-
-    EXPECT_CALL(voice_engine_, ChannelProxyFactory(kChannelId))
-        .WillOnce(Invoke([this](int channel_id) {
-          EXPECT_FALSE(channel_proxy_);
-          channel_proxy_ = new testing::StrictMock<MockVoEChannelProxy>();
-          EXPECT_CALL(*channel_proxy_, SetLocalSSRC(kLocalSsrc)).Times(1);
-          EXPECT_CALL(*channel_proxy_, SetNACKStatus(true, 15)).Times(1);
-          EXPECT_CALL(*channel_proxy_,
-              SetReceiveAudioLevelIndicationStatus(true, kAudioLevelId))
-                  .Times(1);
-          EXPECT_CALL(*channel_proxy_,
-              EnableReceiveTransportSequenceNumber(kTransportSequenceNumberId))
-                  .Times(1);
-          EXPECT_CALL(*channel_proxy_,
-              RegisterReceiverCongestionControlObjects(&packet_router_))
-                  .Times(1);
-          EXPECT_CALL(*channel_proxy_, ResetReceiverCongestionControlObjects())
-              .Times(1);
-          EXPECT_CALL(*channel_proxy_, RegisterExternalTransport(nullptr))
-              .Times(1);
-          EXPECT_CALL(*channel_proxy_, DeRegisterExternalTransport())
-              .Times(1);
-          EXPECT_CALL(*channel_proxy_, GetAudioDecoderFactory())
-              .WillOnce(ReturnRef(decoder_factory_));
-          testing::Expectation expect_set =
-              EXPECT_CALL(*channel_proxy_, SetRtcEventLog(&event_log_))
-                  .Times(1);
-          EXPECT_CALL(*channel_proxy_, SetRtcEventLog(testing::IsNull()))
-              .Times(1)
-              .After(expect_set);
-          EXPECT_CALL(*channel_proxy_, DisassociateSendChannel()).Times(1);
-          EXPECT_CALL(*channel_proxy_, SetReceiveCodecs(_))
-              .WillRepeatedly(
-                  Invoke([](const std::map<int, SdpAudioFormat>& codecs) {
-                    EXPECT_THAT(codecs, testing::IsEmpty());
-                  }));
-          return channel_proxy_;
-        }));
-    stream_config_.voe_channel_id = kChannelId;
-    stream_config_.rtp.local_ssrc = kLocalSsrc;
-    stream_config_.rtp.remote_ssrc = kRemoteSsrc;
-    stream_config_.rtp.nack.rtp_history_ms = 300;
-    stream_config_.rtp.extensions.push_back(
-        RtpExtension(RtpExtension::kAudioLevelUri, kAudioLevelId));
-    stream_config_.rtp.extensions.push_back(RtpExtension(
-        RtpExtension::kTransportSequenceNumberUri, kTransportSequenceNumberId));
-    stream_config_.decoder_factory = decoder_factory_;
-  }
-
-  PacketRouter* packet_router() { return &packet_router_; }
-  MockRtcEventLog* event_log() { return &event_log_; }
-  AudioReceiveStream::Config& config() { return stream_config_; }
-  rtc::scoped_refptr<AudioState> audio_state() { return audio_state_; }
-  rtc::scoped_refptr<MockAudioMixer> audio_mixer() { return audio_mixer_; }
-  MockVoiceEngine& voice_engine() { return voice_engine_; }
-  MockVoEChannelProxy* channel_proxy() { return channel_proxy_; }
-  RtpStreamReceiverControllerInterface* rtp_stream_receiver_controller() {
-    return &rtp_stream_receiver_controller_;
-  }
-
-  void SetupMockForGetStats() {
-    using testing::DoAll;
-    using testing::SetArgPointee;
-
-    ASSERT_TRUE(channel_proxy_);
-    EXPECT_CALL(*channel_proxy_, GetRTCPStatistics())
-        .WillOnce(Return(kCallStats));
-    EXPECT_CALL(*channel_proxy_, GetDelayEstimate())
-        .WillOnce(Return(kJitterBufferDelay + kPlayoutBufferDelay));
-    EXPECT_CALL(*channel_proxy_, GetSpeechOutputLevelFullRange())
-        .WillOnce(Return(kSpeechOutputLevel));
-    EXPECT_CALL(*channel_proxy_, GetTotalOutputEnergy())
-        .WillOnce(Return(kTotalOutputEnergy));
-    EXPECT_CALL(*channel_proxy_, GetTotalOutputDuration())
-        .WillOnce(Return(kTotalOutputDuration));
-    EXPECT_CALL(*channel_proxy_, GetNetworkStatistics())
-        .WillOnce(Return(kNetworkStats));
-    EXPECT_CALL(*channel_proxy_, GetDecodingCallStatistics())
-        .WillOnce(Return(kAudioDecodeStats));
-    EXPECT_CALL(*channel_proxy_, GetRecCodec(_))
-        .WillOnce(DoAll(SetArgPointee<0>(kCodecInst), Return(true)));
-  }
-
- private:
-  PacketRouter packet_router_;
-  rtc::scoped_refptr<AudioDecoderFactory> decoder_factory_;
-  MockRtcEventLog event_log_;
-  testing::StrictMock<MockVoiceEngine> voice_engine_;
-  rtc::scoped_refptr<AudioState> audio_state_;
-  rtc::scoped_refptr<MockAudioMixer> audio_mixer_;
-  AudioReceiveStream::Config stream_config_;
-  testing::StrictMock<MockVoEChannelProxy>* channel_proxy_ = nullptr;
-  RtpStreamReceiverController rtp_stream_receiver_controller_;
-};
-
-void BuildOneByteExtension(std::vector<uint8_t>::iterator it,
-                           int id,
-                           uint32_t extension_value,
-                           size_t value_length) {
-  const uint16_t kRtpOneByteHeaderExtensionId = 0xBEDE;
-  ByteWriter<uint16_t>::WriteBigEndian(&(*it), kRtpOneByteHeaderExtensionId);
-  it += 2;
-
-  ByteWriter<uint16_t>::WriteBigEndian(&(*it), kOneByteExtensionLength / 4);
-  it += 2;
-  const size_t kExtensionDataLength = kOneByteExtensionLength - 1;
-  uint32_t shifted_value = extension_value
-                           << (8 * (kExtensionDataLength - value_length));
-  *it = (id << 4) + (static_cast<uint8_t>(value_length) - 1);
-  ++it;
-  ByteWriter<uint32_t, kExtensionDataLength>::WriteBigEndian(&(*it),
-                                                             shifted_value);
-}
-
-const std::vector<uint8_t> CreateRtpHeaderWithOneByteExtension(
-    int extension_id,
-    uint32_t extension_value,
-    size_t value_length) {
-  std::vector<uint8_t> header;
-  header.resize(webrtc::kRtpHeaderSize + kOneByteExtensionHeaderLength +
-                kOneByteExtensionLength);
-  header[0] = 0x80;   // Version 2.
-  header[0] |= 0x10;  // Set extension bit.
-  header[1] = 100;    // Payload type.
-  header[1] |= 0x80;  // Marker bit is set.
-  ByteWriter<uint16_t>::WriteBigEndian(&header[2], 0x1234);  // Sequence number.
-  ByteWriter<uint32_t>::WriteBigEndian(&header[4], 0x5678);  // Timestamp.
-  ByteWriter<uint32_t>::WriteBigEndian(&header[8], 0x4321);  // SSRC.
-
-  BuildOneByteExtension(header.begin() + webrtc::kRtpHeaderSize, extension_id,
-                        extension_value, value_length);
-  return header;
-}
-
-const std::vector<uint8_t> CreateRtcpSenderReport() {
-  std::vector<uint8_t> packet;
-  const size_t kRtcpSrLength = 28;  // In bytes.
-  packet.resize(kRtcpSrLength);
-  packet[0] = 0x80;  // Version 2.
-  packet[1] = 0xc8;  // PT = 200, SR.
-  // Length in number of 32-bit words - 1.
-  ByteWriter<uint16_t>::WriteBigEndian(&packet[2], 6);
-  ByteWriter<uint32_t>::WriteBigEndian(&packet[4], kLocalSsrc);
-  return packet;
-}
-}  // namespace
-
-TEST(AudioReceiveStreamTest, ConfigToString) {
-  AudioReceiveStream::Config config;
-  config.rtp.remote_ssrc = kRemoteSsrc;
-  config.rtp.local_ssrc = kLocalSsrc;
-  config.voe_channel_id = kChannelId;
-  config.rtp.extensions.push_back(
-      RtpExtension(RtpExtension::kAudioLevelUri, kAudioLevelId));
-  EXPECT_EQ(
-      "{rtp: {remote_ssrc: 1234, local_ssrc: 5678, transport_cc: off, nack: "
-      "{rtp_history_ms: 0}, extensions: [{uri: "
-      "urn:ietf:params:rtp-hdrext:ssrc-audio-level, id: 3}]}, "
-      "rtcp_send_transport: null, voe_channel_id: 2}",
-      config.ToString());
-}
-
-TEST(AudioReceiveStreamTest, ConstructDestruct) {
-  ConfigHelper helper;
-  internal::AudioReceiveStream recv_stream(
-      helper.rtp_stream_receiver_controller(),
-      helper.packet_router(),
-      helper.config(), helper.audio_state(), helper.event_log());
-}
-
-TEST(AudioReceiveStreamTest, ReceiveRtpPacket) {
-  ConfigHelper helper;
-  helper.config().rtp.transport_cc = true;
-  internal::AudioReceiveStream recv_stream(
-      helper.rtp_stream_receiver_controller(),
-      helper.packet_router(),
-      helper.config(), helper.audio_state(), helper.event_log());
-  const int kTransportSequenceNumberValue = 1234;
-  std::vector<uint8_t> rtp_packet = CreateRtpHeaderWithOneByteExtension(
-      kTransportSequenceNumberId, kTransportSequenceNumberValue, 2);
-  PacketTime packet_time(5678000, 0);
-
-  RtpPacketReceived parsed_packet;
-  ASSERT_TRUE(parsed_packet.Parse(&rtp_packet[0], rtp_packet.size()));
-  parsed_packet.set_arrival_time_ms((packet_time.timestamp + 500) / 1000);
-
-  EXPECT_CALL(*helper.channel_proxy(),
-              OnRtpPacket(testing::Ref(parsed_packet)));
-
-  recv_stream.OnRtpPacket(parsed_packet);
-}
-
-TEST(AudioReceiveStreamTest, ReceiveRtcpPacket) {
-  ConfigHelper helper;
-  helper.config().rtp.transport_cc = true;
-  internal::AudioReceiveStream recv_stream(
-      helper.rtp_stream_receiver_controller(),
-      helper.packet_router(),
-      helper.config(), helper.audio_state(), helper.event_log());
-
-  std::vector<uint8_t> rtcp_packet = CreateRtcpSenderReport();
-  EXPECT_CALL(*helper.channel_proxy(),
-              ReceivedRTCPPacket(&rtcp_packet[0], rtcp_packet.size()))
-      .WillOnce(Return(true));
-  EXPECT_TRUE(recv_stream.DeliverRtcp(&rtcp_packet[0], rtcp_packet.size()));
-}
-
-TEST(AudioReceiveStreamTest, GetStats) {
-  ConfigHelper helper;
-  internal::AudioReceiveStream recv_stream(
-      helper.rtp_stream_receiver_controller(),
-      helper.packet_router(),
-      helper.config(), helper.audio_state(), helper.event_log());
-  helper.SetupMockForGetStats();
-  AudioReceiveStream::Stats stats = recv_stream.GetStats();
-  EXPECT_EQ(kRemoteSsrc, stats.remote_ssrc);
-  EXPECT_EQ(static_cast<int64_t>(kCallStats.bytesReceived), stats.bytes_rcvd);
-  EXPECT_EQ(static_cast<uint32_t>(kCallStats.packetsReceived),
-            stats.packets_rcvd);
-  EXPECT_EQ(kCallStats.cumulativeLost, stats.packets_lost);
-  EXPECT_EQ(Q8ToFloat(kCallStats.fractionLost), stats.fraction_lost);
-  EXPECT_EQ(std::string(kCodecInst.plname), stats.codec_name);
-  EXPECT_EQ(kCallStats.extendedMax, stats.ext_seqnum);
-  EXPECT_EQ(kCallStats.jitterSamples / (kCodecInst.plfreq / 1000),
-            stats.jitter_ms);
-  EXPECT_EQ(kNetworkStats.currentBufferSize, stats.jitter_buffer_ms);
-  EXPECT_EQ(kNetworkStats.preferredBufferSize,
-            stats.jitter_buffer_preferred_ms);
-  EXPECT_EQ(static_cast<uint32_t>(kJitterBufferDelay + kPlayoutBufferDelay),
-            stats.delay_estimate_ms);
-  EXPECT_EQ(static_cast<int32_t>(kSpeechOutputLevel), stats.audio_level);
-  EXPECT_EQ(kTotalOutputEnergy, stats.total_output_energy);
-  EXPECT_EQ(kNetworkStats.totalSamplesReceived, stats.total_samples_received);
-  EXPECT_EQ(kTotalOutputDuration, stats.total_output_duration);
-  EXPECT_EQ(kNetworkStats.concealedSamples, stats.concealed_samples);
-  EXPECT_EQ(Q14ToFloat(kNetworkStats.currentExpandRate), stats.expand_rate);
-  EXPECT_EQ(Q14ToFloat(kNetworkStats.currentSpeechExpandRate),
-            stats.speech_expand_rate);
-  EXPECT_EQ(Q14ToFloat(kNetworkStats.currentSecondaryDecodedRate),
-            stats.secondary_decoded_rate);
-  EXPECT_EQ(Q14ToFloat(kNetworkStats.currentSecondaryDiscardedRate),
-            stats.secondary_discarded_rate);
-  EXPECT_EQ(Q14ToFloat(kNetworkStats.currentAccelerateRate),
-            stats.accelerate_rate);
-  EXPECT_EQ(Q14ToFloat(kNetworkStats.currentPreemptiveRate),
-            stats.preemptive_expand_rate);
-  EXPECT_EQ(kAudioDecodeStats.calls_to_silence_generator,
-            stats.decoding_calls_to_silence_generator);
-  EXPECT_EQ(kAudioDecodeStats.calls_to_neteq, stats.decoding_calls_to_neteq);
-  EXPECT_EQ(kAudioDecodeStats.decoded_normal, stats.decoding_normal);
-  EXPECT_EQ(kAudioDecodeStats.decoded_plc, stats.decoding_plc);
-  EXPECT_EQ(kAudioDecodeStats.decoded_cng, stats.decoding_cng);
-  EXPECT_EQ(kAudioDecodeStats.decoded_plc_cng, stats.decoding_plc_cng);
-  EXPECT_EQ(kAudioDecodeStats.decoded_muted_output,
-            stats.decoding_muted_output);
-  EXPECT_EQ(kCallStats.capture_start_ntp_time_ms_,
-            stats.capture_start_ntp_time_ms);
-}
-
-TEST(AudioReceiveStreamTest, SetGain) {
-  ConfigHelper helper;
-  internal::AudioReceiveStream recv_stream(
-      helper.rtp_stream_receiver_controller(),
-      helper.packet_router(),
-      helper.config(), helper.audio_state(), helper.event_log());
-  EXPECT_CALL(*helper.channel_proxy(),
-      SetChannelOutputVolumeScaling(FloatEq(0.765f)));
-  recv_stream.SetGain(0.765f);
-}
-
-TEST(AudioReceiveStreamTest, StreamShouldNotBeAddedToMixerWhenVoEReturnsError) {
-  ConfigHelper helper;
-  internal::AudioReceiveStream recv_stream(
-      helper.rtp_stream_receiver_controller(),
-      helper.packet_router(),
-      helper.config(), helper.audio_state(), helper.event_log());
-
-  EXPECT_CALL(helper.voice_engine(), StartPlayout(_)).WillOnce(Return(-1));
-  EXPECT_CALL(*helper.audio_mixer(), AddSource(_)).Times(0);
-
-  recv_stream.Start();
-}
-
-TEST(AudioReceiveStreamTest, StreamShouldBeAddedToMixerOnStart) {
-  ConfigHelper helper;
-  internal::AudioReceiveStream recv_stream(
-      helper.rtp_stream_receiver_controller(),
-      helper.packet_router(),
-      helper.config(), helper.audio_state(), helper.event_log());
-
-  EXPECT_CALL(helper.voice_engine(), StartPlayout(_)).WillOnce(Return(0));
-  EXPECT_CALL(helper.voice_engine(), StopPlayout(_));
-  EXPECT_CALL(*helper.audio_mixer(), AddSource(&recv_stream))
-      .WillOnce(Return(true));
-
-  recv_stream.Start();
-}
-}  // namespace test
-}  // namespace webrtc
diff --git a/audio/audio_send_stream.cc b/audio/audio_send_stream.cc
deleted file mode 100644
index cb73e84..0000000
--- a/audio/audio_send_stream.cc
+++ /dev/null
@@ -1,659 +0,0 @@
-/*
- *  Copyright (c) 2015 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/audio/audio_send_stream.h"
-
-#include <string>
-#include <utility>
-#include <vector>
-
-#include "webrtc/audio/audio_state.h"
-#include "webrtc/audio/conversion.h"
-#include "webrtc/audio/scoped_voe_interface.h"
-#include "webrtc/call/rtp_transport_controller_send_interface.h"
-#include "webrtc/modules/audio_coding/codecs/cng/audio_encoder_cng.h"
-#include "webrtc/modules/bitrate_controller/include/bitrate_controller.h"
-#include "webrtc/modules/congestion_controller/include/send_side_congestion_controller.h"
-#include "webrtc/modules/pacing/paced_sender.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/event.h"
-#include "webrtc/rtc_base/function_view.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/task_queue.h"
-#include "webrtc/rtc_base/timeutils.h"
-#include "webrtc/voice_engine/channel_proxy.h"
-#include "webrtc/voice_engine/include/voe_base.h"
-#include "webrtc/voice_engine/transmit_mixer.h"
-#include "webrtc/voice_engine/voice_engine_impl.h"
-
-namespace webrtc {
-
-namespace internal {
-// TODO(eladalon): Subsequent CL will make these values experiment-dependent.
-constexpr size_t kPacketLossTrackerMaxWindowSizeMs = 15000;
-constexpr size_t kPacketLossRateMinNumAckedPackets = 50;
-constexpr size_t kRecoverablePacketLossRateMinNumAckedPairs = 40;
-
-namespace {
-void CallEncoder(const std::unique_ptr<voe::ChannelProxy>& channel_proxy,
-                 rtc::FunctionView<void(AudioEncoder*)> lambda) {
-  channel_proxy->ModifyEncoder([&](std::unique_ptr<AudioEncoder>* encoder_ptr) {
-    RTC_DCHECK(encoder_ptr);
-    lambda(encoder_ptr->get());
-  });
-}
-}  // namespace
-
-// TODO(saza): Move this declaration further down when we can use
-// std::make_unique.
-class AudioSendStream::TimedTransport : public Transport {
- public:
-  TimedTransport(Transport* transport, TimeInterval* time_interval)
-      : transport_(transport), lifetime_(time_interval) {}
-  bool SendRtp(const uint8_t* packet,
-               size_t length,
-               const PacketOptions& options) {
-    if (lifetime_) {
-      lifetime_->Extend();
-    }
-    return transport_->SendRtp(packet, length, options);
-  }
-  bool SendRtcp(const uint8_t* packet, size_t length) {
-    return transport_->SendRtcp(packet, length);
-  }
-  ~TimedTransport() {}
-
- private:
-  Transport* transport_;
-  TimeInterval* lifetime_;
-};
-
-AudioSendStream::AudioSendStream(
-    const webrtc::AudioSendStream::Config& config,
-    const rtc::scoped_refptr<webrtc::AudioState>& audio_state,
-    rtc::TaskQueue* worker_queue,
-    RtpTransportControllerSendInterface* transport,
-    BitrateAllocator* bitrate_allocator,
-    RtcEventLog* event_log,
-    RtcpRttStats* rtcp_rtt_stats,
-    const rtc::Optional<RtpState>& suspended_rtp_state)
-    : worker_queue_(worker_queue),
-      config_(Config(nullptr)),
-      audio_state_(audio_state),
-      event_log_(event_log),
-      bitrate_allocator_(bitrate_allocator),
-      transport_(transport),
-      packet_loss_tracker_(kPacketLossTrackerMaxWindowSizeMs,
-                           kPacketLossRateMinNumAckedPackets,
-                           kRecoverablePacketLossRateMinNumAckedPairs),
-      rtp_rtcp_module_(nullptr),
-      suspended_rtp_state_(suspended_rtp_state) {
-  LOG(LS_INFO) << "AudioSendStream: " << config.ToString();
-  RTC_DCHECK_NE(config.voe_channel_id, -1);
-  RTC_DCHECK(audio_state_.get());
-  RTC_DCHECK(transport);
-  RTC_DCHECK(transport->send_side_cc());
-
-  VoiceEngineImpl* voe_impl = static_cast<VoiceEngineImpl*>(voice_engine());
-  channel_proxy_ = voe_impl->GetChannelProxy(config.voe_channel_id);
-  channel_proxy_->SetRtcEventLog(event_log_);
-  channel_proxy_->SetRtcpRttStats(rtcp_rtt_stats);
-  channel_proxy_->SetRTCPStatus(true);
-  transport_->send_side_cc()->RegisterPacketFeedbackObserver(this);
-  RtpReceiver* rtpReceiver = nullptr;  // Unused, but required for call.
-  channel_proxy_->GetRtpRtcp(&rtp_rtcp_module_, &rtpReceiver);
-  RTC_DCHECK(rtp_rtcp_module_);
-
-  ConfigureStream(this, config, true);
-
-  pacer_thread_checker_.DetachFromThread();
-}
-
-AudioSendStream::~AudioSendStream() {
-  RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-  LOG(LS_INFO) << "~AudioSendStream: " << config_.ToString();
-  transport_->send_side_cc()->DeRegisterPacketFeedbackObserver(this);
-  channel_proxy_->DeRegisterExternalTransport();
-  channel_proxy_->ResetSenderCongestionControlObjects();
-  channel_proxy_->SetRtcEventLog(nullptr);
-  channel_proxy_->SetRtcpRttStats(nullptr);
-}
-
-const webrtc::AudioSendStream::Config& AudioSendStream::GetConfig() const {
-  RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-  return config_;
-}
-
-void AudioSendStream::Reconfigure(
-    const webrtc::AudioSendStream::Config& new_config) {
-  ConfigureStream(this, new_config, false);
-}
-
-void AudioSendStream::ConfigureStream(
-    webrtc::internal::AudioSendStream* stream,
-    const webrtc::AudioSendStream::Config& new_config,
-    bool first_time) {
-  LOG(LS_INFO) << "AudioSendStream::Configuring: " << new_config.ToString();
-  const auto& channel_proxy = stream->channel_proxy_;
-  const auto& old_config = stream->config_;
-
-  if (first_time || old_config.rtp.ssrc != new_config.rtp.ssrc) {
-    channel_proxy->SetLocalSSRC(new_config.rtp.ssrc);
-    if (stream->suspended_rtp_state_) {
-      stream->rtp_rtcp_module_->SetRtpState(*stream->suspended_rtp_state_);
-    }
-  }
-  if (first_time || old_config.rtp.c_name != new_config.rtp.c_name) {
-    channel_proxy->SetRTCP_CNAME(new_config.rtp.c_name);
-  }
-  // TODO(solenberg): Config NACK history window (which is a packet count),
-  // using the actual packet size for the configured codec.
-  if (first_time || old_config.rtp.nack.rtp_history_ms !=
-                        new_config.rtp.nack.rtp_history_ms) {
-    channel_proxy->SetNACKStatus(new_config.rtp.nack.rtp_history_ms != 0,
-                                 new_config.rtp.nack.rtp_history_ms / 20);
-  }
-
-  if (first_time ||
-      new_config.send_transport != old_config.send_transport) {
-    if (old_config.send_transport) {
-      channel_proxy->DeRegisterExternalTransport();
-    }
-    if (new_config.send_transport) {
-      stream->timed_send_transport_adapter_.reset(new TimedTransport(
-          new_config.send_transport, &stream->active_lifetime_));
-    } else {
-      stream->timed_send_transport_adapter_.reset(nullptr);
-    }
-    channel_proxy->RegisterExternalTransport(
-        stream->timed_send_transport_adapter_.get());
-  }
-
-  // RFC 5285: Each distinct extension MUST have a unique ID. The value 0 is
-  // reserved for padding and MUST NOT be used as a local identifier.
-  // So it should be safe to use 0 here to indicate "not configured".
-  struct ExtensionIds {
-    int audio_level = 0;
-    int transport_sequence_number = 0;
-  };
-
-  auto find_extension_ids = [](const std::vector<RtpExtension>& extensions) {
-    ExtensionIds ids;
-    for (const auto& extension : extensions) {
-      if (extension.uri == RtpExtension::kAudioLevelUri) {
-        ids.audio_level = extension.id;
-      } else if (extension.uri == RtpExtension::kTransportSequenceNumberUri) {
-        ids.transport_sequence_number = extension.id;
-      }
-    }
-    return ids;
-  };
-
-  const ExtensionIds old_ids = find_extension_ids(old_config.rtp.extensions);
-  const ExtensionIds new_ids = find_extension_ids(new_config.rtp.extensions);
-  // Audio level indication
-  if (first_time || new_ids.audio_level != old_ids.audio_level) {
-    channel_proxy->SetSendAudioLevelIndicationStatus(new_ids.audio_level != 0,
-                                                     new_ids.audio_level);
-  }
-  // Transport sequence number
-  if (first_time ||
-      new_ids.transport_sequence_number != old_ids.transport_sequence_number) {
-    if (!first_time) {
-      channel_proxy->ResetSenderCongestionControlObjects();
-      stream->bandwidth_observer_.reset();
-    }
-
-    if (new_ids.transport_sequence_number != 0) {
-      channel_proxy->EnableSendTransportSequenceNumber(
-          new_ids.transport_sequence_number);
-      stream->transport_->send_side_cc()->EnablePeriodicAlrProbing(true);
-      stream->bandwidth_observer_.reset(stream->transport_->send_side_cc()
-                                            ->GetBitrateController()
-                                            ->CreateRtcpBandwidthObserver());
-    }
-
-    channel_proxy->RegisterSenderCongestionControlObjects(
-        stream->transport_, stream->bandwidth_observer_.get());
-  }
-
-  if (!ReconfigureSendCodec(stream, new_config)) {
-    LOG(LS_ERROR) << "Failed to set up send codec state.";
-  }
-
-  ReconfigureBitrateObserver(stream, new_config);
-  stream->config_ = new_config;
-}
-
-void AudioSendStream::Start() {
-  RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-  if (config_.min_bitrate_bps != -1 && config_.max_bitrate_bps != -1) {
-    ConfigureBitrateObserver(config_.min_bitrate_bps, config_.max_bitrate_bps);
-  }
-
-  ScopedVoEInterface<VoEBase> base(voice_engine());
-  int error = base->StartSend(config_.voe_channel_id);
-  if (error != 0) {
-    LOG(LS_ERROR) << "AudioSendStream::Start failed with error: " << error;
-  }
-}
-
-void AudioSendStream::Stop() {
-  RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-  RemoveBitrateObserver();
-
-  ScopedVoEInterface<VoEBase> base(voice_engine());
-  int error = base->StopSend(config_.voe_channel_id);
-  if (error != 0) {
-    LOG(LS_ERROR) << "AudioSendStream::Stop failed with error: " << error;
-  }
-}
-
-bool AudioSendStream::SendTelephoneEvent(int payload_type,
-                                         int payload_frequency, int event,
-                                         int duration_ms) {
-  RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-  return channel_proxy_->SetSendTelephoneEventPayloadType(payload_type,
-                                                          payload_frequency) &&
-         channel_proxy_->SendTelephoneEventOutband(event, duration_ms);
-}
-
-void AudioSendStream::SetMuted(bool muted) {
-  RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-  channel_proxy_->SetInputMute(muted);
-}
-
-webrtc::AudioSendStream::Stats AudioSendStream::GetStats() const {
-  RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-  webrtc::AudioSendStream::Stats stats;
-  stats.local_ssrc = config_.rtp.ssrc;
-
-  webrtc::CallStatistics call_stats = channel_proxy_->GetRTCPStatistics();
-  stats.bytes_sent = call_stats.bytesSent;
-  stats.packets_sent = call_stats.packetsSent;
-  // RTT isn't known until a RTCP report is received. Until then, VoiceEngine
-  // returns 0 to indicate an error value.
-  if (call_stats.rttMs > 0) {
-    stats.rtt_ms = call_stats.rttMs;
-  }
-  // TODO(solenberg): [was ajm]: Re-enable this metric once we have a reliable
-  //                  implementation.
-  stats.aec_quality_min = -1;
-
-  if (config_.send_codec_spec) {
-    const auto& spec = *config_.send_codec_spec;
-    stats.codec_name = spec.format.name;
-    stats.codec_payload_type = rtc::Optional<int>(spec.payload_type);
-
-    // Get data from the last remote RTCP report.
-    for (const auto& block : channel_proxy_->GetRemoteRTCPReportBlocks()) {
-      // Lookup report for send ssrc only.
-      if (block.source_SSRC == stats.local_ssrc) {
-        stats.packets_lost = block.cumulative_num_packets_lost;
-        stats.fraction_lost = Q8ToFloat(block.fraction_lost);
-        stats.ext_seqnum = block.extended_highest_sequence_number;
-        // Convert timestamps to milliseconds.
-        if (spec.format.clockrate_hz / 1000 > 0) {
-          stats.jitter_ms =
-              block.interarrival_jitter / (spec.format.clockrate_hz / 1000);
-        }
-        break;
-      }
-    }
-  }
-
-  ScopedVoEInterface<VoEBase> base(voice_engine());
-  RTC_DCHECK(base->transmit_mixer());
-  stats.audio_level = base->transmit_mixer()->AudioLevelFullRange();
-  RTC_DCHECK_LE(0, stats.audio_level);
-
-  stats.total_input_energy = base->transmit_mixer()->GetTotalInputEnergy();
-  stats.total_input_duration = base->transmit_mixer()->GetTotalInputDuration();
-
-  RTC_DCHECK(audio_state_->audio_processing());
-  auto audio_processing_stats =
-      audio_state_->audio_processing()->GetStatistics();
-  stats.echo_delay_median_ms = audio_processing_stats.delay_median;
-  stats.echo_delay_std_ms = audio_processing_stats.delay_standard_deviation;
-  stats.echo_return_loss = audio_processing_stats.echo_return_loss.instant();
-  stats.echo_return_loss_enhancement =
-      audio_processing_stats.echo_return_loss_enhancement.instant();
-  stats.residual_echo_likelihood =
-      audio_processing_stats.residual_echo_likelihood;
-  stats.residual_echo_likelihood_recent_max =
-      audio_processing_stats.residual_echo_likelihood_recent_max;
-
-  internal::AudioState* audio_state =
-      static_cast<internal::AudioState*>(audio_state_.get());
-  stats.typing_noise_detected = audio_state->typing_noise_detected();
-  stats.ana_statistics = channel_proxy_->GetANAStatistics();
-
-  return stats;
-}
-
-void AudioSendStream::SignalNetworkState(NetworkState state) {
-  RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-}
-
-bool AudioSendStream::DeliverRtcp(const uint8_t* packet, size_t length) {
-  // TODO(solenberg): Tests call this function on a network thread, libjingle
-  // calls on the worker thread. We should move towards always using a network
-  // thread. Then this check can be enabled.
-  // RTC_DCHECK(!worker_thread_checker_.CalledOnValidThread());
-  return channel_proxy_->ReceivedRTCPPacket(packet, length);
-}
-
-uint32_t AudioSendStream::OnBitrateUpdated(uint32_t bitrate_bps,
-                                           uint8_t fraction_loss,
-                                           int64_t rtt,
-                                           int64_t bwe_period_ms) {
-  // A send stream may be allocated a bitrate of zero if the allocator decides
-  // to disable it. For now we ignore this decision and keep sending on min
-  // bitrate.
-  if (bitrate_bps == 0) {
-    bitrate_bps = config_.min_bitrate_bps;
-  }
-  RTC_DCHECK_GE(bitrate_bps,
-                static_cast<uint32_t>(config_.min_bitrate_bps));
-  // The bitrate allocator might allocate an higher than max configured bitrate
-  // if there is room, to allow for, as example, extra FEC. Ignore that for now.
-  const uint32_t max_bitrate_bps = config_.max_bitrate_bps;
-  if (bitrate_bps > max_bitrate_bps)
-    bitrate_bps = max_bitrate_bps;
-
-  channel_proxy_->SetBitrate(bitrate_bps, bwe_period_ms);
-
-  // The amount of audio protection is not exposed by the encoder, hence
-  // always returning 0.
-  return 0;
-}
-
-void AudioSendStream::OnPacketAdded(uint32_t ssrc, uint16_t seq_num) {
-  RTC_DCHECK(pacer_thread_checker_.CalledOnValidThread());
-  // Only packets that belong to this stream are of interest.
-  if (ssrc == config_.rtp.ssrc) {
-    rtc::CritScope lock(&packet_loss_tracker_cs_);
-    // TODO(eladalon): This function call could potentially reset the window,
-    // setting both PLR and RPLR to unknown. Consider (during upcoming
-    // refactoring) passing an indication of such an event.
-    packet_loss_tracker_.OnPacketAdded(seq_num, rtc::TimeMillis());
-  }
-}
-
-void AudioSendStream::OnPacketFeedbackVector(
-    const std::vector<PacketFeedback>& packet_feedback_vector) {
-  RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-  rtc::Optional<float> plr;
-  rtc::Optional<float> rplr;
-  {
-    rtc::CritScope lock(&packet_loss_tracker_cs_);
-    packet_loss_tracker_.OnPacketFeedbackVector(packet_feedback_vector);
-    plr = packet_loss_tracker_.GetPacketLossRate();
-    rplr = packet_loss_tracker_.GetRecoverablePacketLossRate();
-  }
-  // TODO(eladalon): If R/PLR go back to unknown, no indication is given that
-  // the previously sent value is no longer relevant. This will be taken care
-  // of with some refactoring which is now being done.
-  if (plr) {
-    channel_proxy_->OnTwccBasedUplinkPacketLossRate(*plr);
-  }
-  if (rplr) {
-    channel_proxy_->OnRecoverableUplinkPacketLossRate(*rplr);
-  }
-}
-
-void AudioSendStream::SetTransportOverhead(int transport_overhead_per_packet) {
-  RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-  transport_->send_side_cc()->SetTransportOverhead(
-      transport_overhead_per_packet);
-  channel_proxy_->SetTransportOverhead(transport_overhead_per_packet);
-}
-
-RtpState AudioSendStream::GetRtpState() const {
-  return rtp_rtcp_module_->GetRtpState();
-}
-
-const TimeInterval& AudioSendStream::GetActiveLifetime() const {
-  return active_lifetime_;
-}
-
-VoiceEngine* AudioSendStream::voice_engine() const {
-  internal::AudioState* audio_state =
-      static_cast<internal::AudioState*>(audio_state_.get());
-  VoiceEngine* voice_engine = audio_state->voice_engine();
-  RTC_DCHECK(voice_engine);
-  return voice_engine;
-}
-
-// Apply current codec settings to a single voe::Channel used for sending.
-bool AudioSendStream::SetupSendCodec(AudioSendStream* stream,
-                                     const Config& new_config) {
-  RTC_DCHECK(new_config.send_codec_spec);
-  const auto& spec = *new_config.send_codec_spec;
-
-  RTC_DCHECK(new_config.encoder_factory);
-  std::unique_ptr<AudioEncoder> encoder =
-      new_config.encoder_factory->MakeAudioEncoder(spec.payload_type,
-                                                   spec.format);
-
-  if (!encoder) {
-    LOG(LS_ERROR) << "Unable to create encoder for " << spec.format;
-    return false;
-  }
-  // If a bitrate has been specified for the codec, use it over the
-  // codec's default.
-  if (spec.target_bitrate_bps) {
-    encoder->OnReceivedTargetAudioBitrate(*spec.target_bitrate_bps);
-  }
-
-  // Enable ANA if configured (currently only used by Opus).
-  if (new_config.audio_network_adaptor_config) {
-    if (encoder->EnableAudioNetworkAdaptor(
-            *new_config.audio_network_adaptor_config, stream->event_log_)) {
-      LOG(LS_INFO) << "Audio network adaptor enabled on SSRC "
-                   << new_config.rtp.ssrc;
-    } else {
-      RTC_NOTREACHED();
-    }
-  }
-
-  // Wrap the encoder in a an AudioEncoderCNG, if VAD is enabled.
-  if (spec.cng_payload_type) {
-    AudioEncoderCng::Config cng_config;
-    cng_config.num_channels = encoder->NumChannels();
-    cng_config.payload_type = *spec.cng_payload_type;
-    cng_config.speech_encoder = std::move(encoder);
-    cng_config.vad_mode = Vad::kVadNormal;
-    encoder.reset(new AudioEncoderCng(std::move(cng_config)));
-
-    stream->RegisterCngPayloadType(
-        *spec.cng_payload_type,
-        new_config.send_codec_spec->format.clockrate_hz);
-  }
-
-  stream->channel_proxy_->SetEncoder(new_config.send_codec_spec->payload_type,
-                                     std::move(encoder));
-  return true;
-}
-
-bool AudioSendStream::ReconfigureSendCodec(AudioSendStream* stream,
-                                           const Config& new_config) {
-  const auto& old_config = stream->config_;
-
-  if (!new_config.send_codec_spec) {
-    // We cannot de-configure a send codec. So we will do nothing.
-    // By design, the send codec should have not been configured.
-    RTC_DCHECK(!old_config.send_codec_spec);
-    return true;
-  }
-
-  if (new_config.send_codec_spec == old_config.send_codec_spec &&
-      new_config.audio_network_adaptor_config ==
-          old_config.audio_network_adaptor_config) {
-    return true;
-  }
-
-  // If we have no encoder, or the format or payload type's changed, create a
-  // new encoder.
-  if (!old_config.send_codec_spec ||
-      new_config.send_codec_spec->format !=
-          old_config.send_codec_spec->format ||
-      new_config.send_codec_spec->payload_type !=
-          old_config.send_codec_spec->payload_type) {
-    return SetupSendCodec(stream, new_config);
-  }
-
-  const rtc::Optional<int>& new_target_bitrate_bps =
-      new_config.send_codec_spec->target_bitrate_bps;
-  // If a bitrate has been specified for the codec, use it over the
-  // codec's default.
-  if (new_target_bitrate_bps &&
-      new_target_bitrate_bps !=
-          old_config.send_codec_spec->target_bitrate_bps) {
-    CallEncoder(stream->channel_proxy_, [&](AudioEncoder* encoder) {
-      encoder->OnReceivedTargetAudioBitrate(*new_target_bitrate_bps);
-    });
-  }
-
-  ReconfigureANA(stream, new_config);
-  ReconfigureCNG(stream, new_config);
-
-  return true;
-}
-
-void AudioSendStream::ReconfigureANA(AudioSendStream* stream,
-                                     const Config& new_config) {
-  if (new_config.audio_network_adaptor_config ==
-      stream->config_.audio_network_adaptor_config) {
-    return;
-  }
-  if (new_config.audio_network_adaptor_config) {
-    CallEncoder(stream->channel_proxy_, [&](AudioEncoder* encoder) {
-      if (encoder->EnableAudioNetworkAdaptor(
-              *new_config.audio_network_adaptor_config, stream->event_log_)) {
-        LOG(LS_INFO) << "Audio network adaptor enabled on SSRC "
-                     << new_config.rtp.ssrc;
-      } else {
-        RTC_NOTREACHED();
-      }
-    });
-  } else {
-    CallEncoder(stream->channel_proxy_, [&](AudioEncoder* encoder) {
-      encoder->DisableAudioNetworkAdaptor();
-    });
-    LOG(LS_INFO) << "Audio network adaptor disabled on SSRC "
-                 << new_config.rtp.ssrc;
-  }
-}
-
-void AudioSendStream::ReconfigureCNG(AudioSendStream* stream,
-                                     const Config& new_config) {
-  if (new_config.send_codec_spec->cng_payload_type ==
-      stream->config_.send_codec_spec->cng_payload_type) {
-    return;
-  }
-
-  // Register the CNG payload type if it's been added, don't do anything if CNG
-  // is removed. Payload types must not be redefined.
-  if (new_config.send_codec_spec->cng_payload_type) {
-    stream->RegisterCngPayloadType(
-        *new_config.send_codec_spec->cng_payload_type,
-        new_config.send_codec_spec->format.clockrate_hz);
-  }
-
-  // Wrap or unwrap the encoder in an AudioEncoderCNG.
-  stream->channel_proxy_->ModifyEncoder(
-      [&](std::unique_ptr<AudioEncoder>* encoder_ptr) {
-        std::unique_ptr<AudioEncoder> old_encoder(std::move(*encoder_ptr));
-        auto sub_encoders = old_encoder->ReclaimContainedEncoders();
-        if (!sub_encoders.empty()) {
-          // Replace enc with its sub encoder. We need to put the sub
-          // encoder in a temporary first, since otherwise the old value
-          // of enc would be destroyed before the new value got assigned,
-          // which would be bad since the new value is a part of the old
-          // value.
-          auto tmp = std::move(sub_encoders[0]);
-          old_encoder = std::move(tmp);
-        }
-        if (new_config.send_codec_spec->cng_payload_type) {
-          AudioEncoderCng::Config config;
-          config.speech_encoder = std::move(old_encoder);
-          config.num_channels = config.speech_encoder->NumChannels();
-          config.payload_type = *new_config.send_codec_spec->cng_payload_type;
-          config.vad_mode = Vad::kVadNormal;
-          encoder_ptr->reset(new AudioEncoderCng(std::move(config)));
-        } else {
-          *encoder_ptr = std::move(old_encoder);
-        }
-      });
-}
-
-void AudioSendStream::ReconfigureBitrateObserver(
-    AudioSendStream* stream,
-    const webrtc::AudioSendStream::Config& new_config) {
-  // Since the Config's default is for both of these to be -1, this test will
-  // allow us to configure the bitrate observer if the new config has bitrate
-  // limits set, but would only have us call RemoveBitrateObserver if we were
-  // previously configured with bitrate limits.
-  if (stream->config_.min_bitrate_bps == new_config.min_bitrate_bps &&
-      stream->config_.max_bitrate_bps == new_config.max_bitrate_bps) {
-    return;
-  }
-
-  if (new_config.min_bitrate_bps != -1 && new_config.max_bitrate_bps != -1) {
-    stream->ConfigureBitrateObserver(new_config.min_bitrate_bps,
-                                     new_config.max_bitrate_bps);
-  } else {
-    stream->RemoveBitrateObserver();
-  }
-}
-
-void AudioSendStream::ConfigureBitrateObserver(int min_bitrate_bps,
-                                               int max_bitrate_bps) {
-  RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-  RTC_DCHECK_GE(max_bitrate_bps, min_bitrate_bps);
-  rtc::Event thread_sync_event(false /* manual_reset */, false);
-  worker_queue_->PostTask([&] {
-    // We may get a callback immediately as the observer is registered, so make
-    // sure the bitrate limits in config_ are up-to-date.
-    config_.min_bitrate_bps = min_bitrate_bps;
-    config_.max_bitrate_bps = max_bitrate_bps;
-    bitrate_allocator_->AddObserver(this, min_bitrate_bps, max_bitrate_bps, 0,
-                                    true);
-    thread_sync_event.Set();
-  });
-  thread_sync_event.Wait(rtc::Event::kForever);
-}
-
-void AudioSendStream::RemoveBitrateObserver() {
-  RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-  rtc::Event thread_sync_event(false /* manual_reset */, false);
-  worker_queue_->PostTask([this, &thread_sync_event] {
-    bitrate_allocator_->RemoveObserver(this);
-    thread_sync_event.Set();
-  });
-  thread_sync_event.Wait(rtc::Event::kForever);
-}
-
-void AudioSendStream::RegisterCngPayloadType(int payload_type,
-                                             int clockrate_hz) {
-  const CodecInst codec = {payload_type, "CN", clockrate_hz, 0, 1, 0};
-  if (rtp_rtcp_module_->RegisterSendPayload(codec) != 0) {
-    rtp_rtcp_module_->DeRegisterSendPayload(codec.pltype);
-    if (rtp_rtcp_module_->RegisterSendPayload(codec) != 0) {
-      LOG(LS_ERROR) << "RegisterCngPayloadType() failed to register CN to "
-                       "RTP/RTCP module";
-    }
-  }
-}
-
-
-}  // namespace internal
-}  // namespace webrtc
diff --git a/audio/audio_send_stream.h b/audio/audio_send_stream.h
deleted file mode 100644
index cf36c13..0000000
--- a/audio/audio_send_stream.h
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- *  Copyright (c) 2015 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_AUDIO_AUDIO_SEND_STREAM_H_
-#define WEBRTC_AUDIO_AUDIO_SEND_STREAM_H_
-
-#include <memory>
-#include <vector>
-
-#include "webrtc/audio/time_interval.h"
-#include "webrtc/call/audio_send_stream.h"
-#include "webrtc/call/audio_state.h"
-#include "webrtc/call/bitrate_allocator.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/thread_checker.h"
-#include "webrtc/voice_engine/transport_feedback_packet_loss_tracker.h"
-
-namespace webrtc {
-class VoiceEngine;
-class RtcEventLog;
-class RtcpBandwidthObserver;
-class RtcpRttStats;
-class RtpTransportControllerSendInterface;
-
-namespace voe {
-class ChannelProxy;
-}  // namespace voe
-
-namespace internal {
-class AudioSendStream final : public webrtc::AudioSendStream,
-                              public webrtc::BitrateAllocatorObserver,
-                              public webrtc::PacketFeedbackObserver {
- public:
-  AudioSendStream(const webrtc::AudioSendStream::Config& config,
-                  const rtc::scoped_refptr<webrtc::AudioState>& audio_state,
-                  rtc::TaskQueue* worker_queue,
-                  RtpTransportControllerSendInterface* transport,
-                  BitrateAllocator* bitrate_allocator,
-                  RtcEventLog* event_log,
-                  RtcpRttStats* rtcp_rtt_stats,
-                  const rtc::Optional<RtpState>& suspended_rtp_state);
-  ~AudioSendStream() override;
-
-  // webrtc::AudioSendStream implementation.
-  const webrtc::AudioSendStream::Config& GetConfig() const override;
-  void Reconfigure(const webrtc::AudioSendStream::Config& config) override;
-  void Start() override;
-  void Stop() override;
-  bool SendTelephoneEvent(int payload_type, int payload_frequency, int event,
-                          int duration_ms) override;
-  void SetMuted(bool muted) override;
-  webrtc::AudioSendStream::Stats GetStats() const override;
-
-  void SignalNetworkState(NetworkState state);
-  bool DeliverRtcp(const uint8_t* packet, size_t length);
-
-  // Implements BitrateAllocatorObserver.
-  uint32_t OnBitrateUpdated(uint32_t bitrate_bps,
-                            uint8_t fraction_loss,
-                            int64_t rtt,
-                            int64_t bwe_period_ms) override;
-
-  // From PacketFeedbackObserver.
-  void OnPacketAdded(uint32_t ssrc, uint16_t seq_num) override;
-  void OnPacketFeedbackVector(
-      const std::vector<PacketFeedback>& packet_feedback_vector) override;
-
-  void SetTransportOverhead(int transport_overhead_per_packet);
-
-  RtpState GetRtpState() const;
-  const TimeInterval& GetActiveLifetime() const;
-
- private:
-  class TimedTransport;
-
-  VoiceEngine* voice_engine() const;
-
-  // These are all static to make it less likely that (the old) config_ is
-  // accessed unintentionally.
-  static void ConfigureStream(AudioSendStream* stream,
-                              const Config& new_config,
-                              bool first_time);
-  static bool SetupSendCodec(AudioSendStream* stream, const Config& new_config);
-  static bool ReconfigureSendCodec(AudioSendStream* stream,
-                                   const Config& new_config);
-  static void ReconfigureANA(AudioSendStream* stream, const Config& new_config);
-  static void ReconfigureCNG(AudioSendStream* stream, const Config& new_config);
-  static void ReconfigureBitrateObserver(AudioSendStream* stream,
-                                         const Config& new_config);
-
-  void ConfigureBitrateObserver(int min_bitrate_bps, int max_bitrate_bps);
-  void RemoveBitrateObserver();
-
-  void RegisterCngPayloadType(int payload_type, int clockrate_hz);
-
-  rtc::ThreadChecker worker_thread_checker_;
-  rtc::ThreadChecker pacer_thread_checker_;
-  rtc::TaskQueue* worker_queue_;
-  webrtc::AudioSendStream::Config config_;
-  rtc::scoped_refptr<webrtc::AudioState> audio_state_;
-  std::unique_ptr<voe::ChannelProxy> channel_proxy_;
-  RtcEventLog* const event_log_;
-
-  BitrateAllocator* const bitrate_allocator_;
-  RtpTransportControllerSendInterface* const transport_;
-  std::unique_ptr<RtcpBandwidthObserver> bandwidth_observer_;
-
-  rtc::CriticalSection packet_loss_tracker_cs_;
-  TransportFeedbackPacketLossTracker packet_loss_tracker_
-      RTC_GUARDED_BY(&packet_loss_tracker_cs_);
-
-  RtpRtcp* rtp_rtcp_module_;
-  rtc::Optional<RtpState> const suspended_rtp_state_;
-
-  std::unique_ptr<TimedTransport> timed_send_transport_adapter_;
-  TimeInterval active_lifetime_;
-
-  RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(AudioSendStream);
-};
-}  // namespace internal
-}  // namespace webrtc
-
-#endif  // WEBRTC_AUDIO_AUDIO_SEND_STREAM_H_
diff --git a/audio/audio_send_stream_unittest.cc b/audio/audio_send_stream_unittest.cc
deleted file mode 100644
index 4c29f6a..0000000
--- a/audio/audio_send_stream_unittest.cc
+++ /dev/null
@@ -1,616 +0,0 @@
-/*
- *  Copyright (c) 2015 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 <string>
-#include <utility>
-#include <vector>
-
-#include "webrtc/audio/audio_send_stream.h"
-#include "webrtc/audio/audio_state.h"
-#include "webrtc/audio/conversion.h"
-#include "webrtc/call/fake_rtp_transport_controller_send.h"
-#include "webrtc/call/rtp_transport_controller_send_interface.h"
-#include "webrtc/logging/rtc_event_log/mock/mock_rtc_event_log.h"
-#include "webrtc/modules/audio_mixer/audio_mixer_impl.h"
-#include "webrtc/modules/audio_processing/include/mock_audio_processing.h"
-#include "webrtc/modules/congestion_controller/include/mock/mock_congestion_observer.h"
-#include "webrtc/modules/congestion_controller/include/send_side_congestion_controller.h"
-#include "webrtc/modules/pacing/mock/mock_paced_sender.h"
-#include "webrtc/modules/rtp_rtcp/mocks/mock_rtcp_rtt_stats.h"
-#include "webrtc/modules/rtp_rtcp/mocks/mock_rtp_rtcp.h"
-#include "webrtc/rtc_base/ptr_util.h"
-#include "webrtc/rtc_base/task_queue.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/mock_audio_encoder.h"
-#include "webrtc/test/mock_audio_encoder_factory.h"
-#include "webrtc/test/mock_voe_channel_proxy.h"
-#include "webrtc/test/mock_voice_engine.h"
-#include "webrtc/voice_engine/transmit_mixer.h"
-
-namespace webrtc {
-namespace test {
-namespace {
-
-using testing::_;
-using testing::Eq;
-using testing::Ne;
-using testing::Invoke;
-using testing::Return;
-using testing::StrEq;
-
-const int kChannelId = 1;
-const uint32_t kSsrc = 1234;
-const char* kCName = "foo_name";
-const int kAudioLevelId = 2;
-const int kTransportSequenceNumberId = 4;
-const int kEchoDelayMedian = 254;
-const int kEchoDelayStdDev = -3;
-const int kEchoReturnLoss = -65;
-const int kEchoReturnLossEnhancement = 101;
-const float kResidualEchoLikelihood = -1.0f;
-const int32_t kSpeechInputLevel = 96;
-const double kTotalInputEnergy = 0.25;
-const double kTotalInputDuration = 0.5;
-const CallStatistics kCallStats = {
-    1345,  1678,  1901, 1234,  112, 13456, 17890, 1567, -1890, -1123};
-const ReportBlock kReportBlock = {456, 780, 123, 567, 890, 132, 143, 13354};
-const int kTelephoneEventPayloadType = 123;
-const int kTelephoneEventPayloadFrequency = 65432;
-const int kTelephoneEventCode = 45;
-const int kTelephoneEventDuration = 6789;
-const CodecInst kIsacCodec = {103, "isac", 16000, 320, 1, 32000};
-constexpr int kIsacPayloadType = 103;
-const SdpAudioFormat kIsacFormat = {"isac", 16000, 1};
-const SdpAudioFormat kOpusFormat = {"opus", 48000, 2};
-const SdpAudioFormat kG722Format = {"g722", 8000, 1};
-const AudioCodecSpec kCodecSpecs[] = {
-    {kIsacFormat, {16000, 1, 32000, 10000, 32000}},
-    {kOpusFormat, {48000, 1, 32000, 6000, 510000}},
-    {kG722Format, {16000, 1, 64000}}};
-
-class MockLimitObserver : public BitrateAllocator::LimitObserver {
- public:
-  MOCK_METHOD2(OnAllocationLimitsChanged,
-               void(uint32_t min_send_bitrate_bps,
-                    uint32_t max_padding_bitrate_bps));
-};
-
-class MockTransmitMixer : public voe::TransmitMixer {
- public:
-  MOCK_CONST_METHOD0(AudioLevelFullRange, int16_t());
-  MOCK_CONST_METHOD0(GetTotalInputEnergy, double());
-  MOCK_CONST_METHOD0(GetTotalInputDuration, double());
-};
-
-std::unique_ptr<MockAudioEncoder> SetupAudioEncoderMock(
-    int payload_type,
-    const SdpAudioFormat& format) {
-  for (const auto& spec : kCodecSpecs) {
-    if (format == spec.format) {
-      std::unique_ptr<MockAudioEncoder> encoder(new MockAudioEncoder);
-      ON_CALL(*encoder.get(), SampleRateHz())
-          .WillByDefault(Return(spec.info.sample_rate_hz));
-      ON_CALL(*encoder.get(), NumChannels())
-          .WillByDefault(Return(spec.info.num_channels));
-      ON_CALL(*encoder.get(), RtpTimestampRateHz())
-          .WillByDefault(Return(spec.format.clockrate_hz));
-      return encoder;
-    }
-  }
-  return nullptr;
-}
-
-rtc::scoped_refptr<MockAudioEncoderFactory> SetupEncoderFactoryMock() {
-  rtc::scoped_refptr<MockAudioEncoderFactory> factory =
-      new rtc::RefCountedObject<MockAudioEncoderFactory>();
-  ON_CALL(*factory.get(), GetSupportedEncoders())
-      .WillByDefault(Return(std::vector<AudioCodecSpec>(
-          std::begin(kCodecSpecs), std::end(kCodecSpecs))));
-  ON_CALL(*factory.get(), QueryAudioEncoder(_))
-      .WillByDefault(Invoke([](const SdpAudioFormat& format) {
-        for (const auto& spec : kCodecSpecs) {
-          if (format == spec.format) {
-            return rtc::Optional<AudioCodecInfo>(spec.info);
-          }
-        }
-        return rtc::Optional<AudioCodecInfo>();
-      }));
-  ON_CALL(*factory.get(), MakeAudioEncoderMock(_, _, _))
-      .WillByDefault(Invoke([](int payload_type, const SdpAudioFormat& format,
-                               std::unique_ptr<AudioEncoder>* return_value) {
-        *return_value = SetupAudioEncoderMock(payload_type, format);
-      }));
-  return factory;
-}
-
-struct ConfigHelper {
-  ConfigHelper(bool audio_bwe_enabled, bool expect_set_encoder_call)
-      : stream_config_(nullptr),
-        audio_processing_(new rtc::RefCountedObject<MockAudioProcessing>()),
-        simulated_clock_(123456),
-        send_side_cc_(rtc::MakeUnique<SendSideCongestionController>(
-            &simulated_clock_,
-            nullptr /* observer */,
-            &event_log_,
-            &pacer_)),
-        fake_transport_(&packet_router_, &pacer_, send_side_cc_.get()),
-        bitrate_allocator_(&limit_observer_),
-        worker_queue_("ConfigHelper_worker_queue"),
-        audio_encoder_(nullptr) {
-    using testing::Invoke;
-
-    EXPECT_CALL(voice_engine_,
-        RegisterVoiceEngineObserver(_)).WillOnce(Return(0));
-    EXPECT_CALL(voice_engine_,
-        DeRegisterVoiceEngineObserver()).WillOnce(Return(0));
-    EXPECT_CALL(voice_engine_, audio_device_module());
-    EXPECT_CALL(voice_engine_, audio_transport());
-
-    AudioState::Config config;
-    config.voice_engine = &voice_engine_;
-    config.audio_mixer = AudioMixerImpl::Create();
-    config.audio_processing = audio_processing_;
-    audio_state_ = AudioState::Create(config);
-
-    SetupDefaultChannelProxy(audio_bwe_enabled);
-
-    EXPECT_CALL(voice_engine_, ChannelProxyFactory(kChannelId))
-        .WillOnce(Invoke([this](int channel_id) {
-          return channel_proxy_;
-        }));
-
-    SetupMockForSetupSendCodec(expect_set_encoder_call);
-
-    // Use ISAC as default codec so as to prevent unnecessary |voice_engine_|
-    // calls from the default ctor behavior.
-    stream_config_.send_codec_spec =
-        rtc::Optional<AudioSendStream::Config::SendCodecSpec>(
-            {kIsacPayloadType, kIsacFormat});
-    stream_config_.voe_channel_id = kChannelId;
-    stream_config_.rtp.ssrc = kSsrc;
-    stream_config_.rtp.nack.rtp_history_ms = 200;
-    stream_config_.rtp.c_name = kCName;
-    stream_config_.rtp.extensions.push_back(
-        RtpExtension(RtpExtension::kAudioLevelUri, kAudioLevelId));
-    if (audio_bwe_enabled) {
-      AddBweToConfig(&stream_config_);
-    }
-    stream_config_.encoder_factory = SetupEncoderFactoryMock();
-    stream_config_.min_bitrate_bps = 10000;
-    stream_config_.max_bitrate_bps = 65000;
-  }
-
-  AudioSendStream::Config& config() { return stream_config_; }
-  MockAudioEncoderFactory& mock_encoder_factory() {
-    return *static_cast<MockAudioEncoderFactory*>(
-        stream_config_.encoder_factory.get());
-  }
-  rtc::scoped_refptr<AudioState> audio_state() { return audio_state_; }
-  MockVoEChannelProxy* channel_proxy() { return channel_proxy_; }
-  RtpTransportControllerSendInterface* transport() { return &fake_transport_; }
-  BitrateAllocator* bitrate_allocator() { return &bitrate_allocator_; }
-  rtc::TaskQueue* worker_queue() { return &worker_queue_; }
-  RtcEventLog* event_log() { return &event_log_; }
-  MockVoiceEngine* voice_engine() { return &voice_engine_; }
-
-  static void AddBweToConfig(AudioSendStream::Config* config) {
-    config->rtp.extensions.push_back(
-        RtpExtension(RtpExtension::kTransportSequenceNumberUri,
-                     kTransportSequenceNumberId));
-    config->send_codec_spec->transport_cc_enabled = true;
-  }
-
-  void SetupDefaultChannelProxy(bool audio_bwe_enabled) {
-    channel_proxy_ = new testing::StrictMock<MockVoEChannelProxy>();
-    EXPECT_CALL(*channel_proxy_, GetRtpRtcp(_, _))
-        .WillRepeatedly(Invoke(
-            [this](RtpRtcp** rtp_rtcp_module, RtpReceiver** rtp_receiver) {
-              *rtp_rtcp_module = &this->rtp_rtcp_;
-              *rtp_receiver = nullptr;  // Not deemed necessary for tests yet.
-            }));
-    EXPECT_CALL(*channel_proxy_, SetRTCPStatus(true)).Times(1);
-    EXPECT_CALL(*channel_proxy_, SetLocalSSRC(kSsrc)).Times(1);
-    EXPECT_CALL(*channel_proxy_, SetRTCP_CNAME(StrEq(kCName))).Times(1);
-    EXPECT_CALL(*channel_proxy_, SetNACKStatus(true, 10)).Times(1);
-    EXPECT_CALL(*channel_proxy_,
-                SetSendAudioLevelIndicationStatus(true, kAudioLevelId))
-        .Times(1);
-    if (audio_bwe_enabled) {
-      EXPECT_CALL(*channel_proxy_,
-                  EnableSendTransportSequenceNumber(kTransportSequenceNumberId))
-          .Times(1);
-      EXPECT_CALL(*channel_proxy_, RegisterSenderCongestionControlObjects(
-                                       &fake_transport_, Ne(nullptr)))
-          .Times(1);
-    } else {
-      EXPECT_CALL(*channel_proxy_, RegisterSenderCongestionControlObjects(
-                                       &fake_transport_, Eq(nullptr)))
-          .Times(1);
-    }
-    EXPECT_CALL(*channel_proxy_, SetBitrate(_, _))
-        .Times(1);
-    EXPECT_CALL(*channel_proxy_, ResetSenderCongestionControlObjects())
-        .Times(1);
-    EXPECT_CALL(*channel_proxy_, RegisterExternalTransport(nullptr)).Times(1);
-    EXPECT_CALL(*channel_proxy_, DeRegisterExternalTransport()).Times(1);
-    EXPECT_CALL(*channel_proxy_, SetRtcEventLog(testing::NotNull())).Times(1);
-    EXPECT_CALL(*channel_proxy_, SetRtcEventLog(testing::IsNull()))
-        .Times(1);  // Destructor resets the event log
-    EXPECT_CALL(*channel_proxy_, SetRtcpRttStats(&rtcp_rtt_stats_)).Times(1);
-    EXPECT_CALL(*channel_proxy_, SetRtcpRttStats(testing::IsNull()))
-        .Times(1);  // Destructor resets the rtt stats.
-  }
-
-  void SetupMockForSetupSendCodec(bool expect_set_encoder_call) {
-    if (expect_set_encoder_call) {
-      EXPECT_CALL(*channel_proxy_, SetEncoderForMock(_, _))
-          .WillOnce(Invoke(
-              [this](int payload_type, std::unique_ptr<AudioEncoder>* encoder) {
-                this->audio_encoder_ = std::move(*encoder);
-                return true;
-              }));
-    }
-  }
-
-  void SetupMockForModifyEncoder() {
-    // Let ModifyEncoder to invoke mock audio encoder.
-    EXPECT_CALL(*channel_proxy_, ModifyEncoder(_))
-        .WillRepeatedly(Invoke(
-            [this](rtc::FunctionView<void(std::unique_ptr<AudioEncoder>*)>
-                       modifier) {
-              if (this->audio_encoder_)
-                modifier(&this->audio_encoder_);
-            }));
-  }
-
-  RtcpRttStats* rtcp_rtt_stats() { return &rtcp_rtt_stats_; }
-
-  void SetupMockForSendTelephoneEvent() {
-    EXPECT_TRUE(channel_proxy_);
-    EXPECT_CALL(*channel_proxy_,
-        SetSendTelephoneEventPayloadType(kTelephoneEventPayloadType,
-                                         kTelephoneEventPayloadFrequency))
-            .WillOnce(Return(true));
-    EXPECT_CALL(*channel_proxy_,
-        SendTelephoneEventOutband(kTelephoneEventCode, kTelephoneEventDuration))
-            .WillOnce(Return(true));
-  }
-
-  void SetupMockForGetStats() {
-    using testing::DoAll;
-    using testing::SetArgPointee;
-    using testing::SetArgReferee;
-
-    std::vector<ReportBlock> report_blocks;
-    webrtc::ReportBlock block = kReportBlock;
-    report_blocks.push_back(block);  // Has wrong SSRC.
-    block.source_SSRC = kSsrc;
-    report_blocks.push_back(block);  // Correct block.
-    block.fraction_lost = 0;
-    report_blocks.push_back(block);  // Duplicate SSRC, bad fraction_lost.
-
-    EXPECT_TRUE(channel_proxy_);
-    EXPECT_CALL(*channel_proxy_, GetRTCPStatistics())
-        .WillRepeatedly(Return(kCallStats));
-    EXPECT_CALL(*channel_proxy_, GetRemoteRTCPReportBlocks())
-        .WillRepeatedly(Return(report_blocks));
-    EXPECT_CALL(*channel_proxy_, GetANAStatistics())
-        .WillRepeatedly(Return(ANAStats()));
-    EXPECT_CALL(voice_engine_, transmit_mixer())
-        .WillRepeatedly(Return(&transmit_mixer_));
-
-    EXPECT_CALL(transmit_mixer_, AudioLevelFullRange())
-        .WillRepeatedly(Return(kSpeechInputLevel));
-    EXPECT_CALL(transmit_mixer_, GetTotalInputEnergy())
-        .WillRepeatedly(Return(kTotalInputEnergy));
-    EXPECT_CALL(transmit_mixer_, GetTotalInputDuration())
-        .WillRepeatedly(Return(kTotalInputDuration));
-
-    // We have to set the instantaneous value, the average, min and max. We only
-    // care about the instantaneous value, so we set all to the same value.
-    audio_processing_stats_.echo_return_loss.Set(
-        kEchoReturnLoss, kEchoReturnLoss, kEchoReturnLoss, kEchoReturnLoss);
-    audio_processing_stats_.echo_return_loss_enhancement.Set(
-        kEchoReturnLossEnhancement, kEchoReturnLossEnhancement,
-        kEchoReturnLossEnhancement, kEchoReturnLossEnhancement);
-    audio_processing_stats_.delay_median = kEchoDelayMedian;
-    audio_processing_stats_.delay_standard_deviation = kEchoDelayStdDev;
-
-    EXPECT_CALL(*audio_processing_, GetStatistics())
-        .WillRepeatedly(Return(audio_processing_stats_));
-  }
-
- private:
-  testing::StrictMock<MockVoiceEngine> voice_engine_;
-  rtc::scoped_refptr<AudioState> audio_state_;
-  AudioSendStream::Config stream_config_;
-  testing::StrictMock<MockVoEChannelProxy>* channel_proxy_ = nullptr;
-  rtc::scoped_refptr<MockAudioProcessing> audio_processing_;
-  MockTransmitMixer transmit_mixer_;
-  AudioProcessing::AudioProcessingStatistics audio_processing_stats_;
-  SimulatedClock simulated_clock_;
-  PacketRouter packet_router_;
-  testing::NiceMock<MockPacedSender> pacer_;
-  std::unique_ptr<SendSideCongestionController> send_side_cc_;
-  FakeRtpTransportControllerSend fake_transport_;
-  MockRtcEventLog event_log_;
-  MockRtpRtcp rtp_rtcp_;
-  MockRtcpRttStats rtcp_rtt_stats_;
-  testing::NiceMock<MockLimitObserver> limit_observer_;
-  BitrateAllocator bitrate_allocator_;
-  // |worker_queue| is defined last to ensure all pending tasks are cancelled
-  // and deleted before any other members.
-  rtc::TaskQueue worker_queue_;
-  std::unique_ptr<AudioEncoder> audio_encoder_;
-};
-}  // namespace
-
-TEST(AudioSendStreamTest, ConfigToString) {
-  AudioSendStream::Config config(nullptr);
-  config.rtp.ssrc = kSsrc;
-  config.rtp.c_name = kCName;
-  config.voe_channel_id = kChannelId;
-  config.min_bitrate_bps = 12000;
-  config.max_bitrate_bps = 34000;
-  config.send_codec_spec =
-      rtc::Optional<AudioSendStream::Config::SendCodecSpec>(
-          {kIsacPayloadType, kIsacFormat});
-  config.send_codec_spec->nack_enabled = true;
-  config.send_codec_spec->transport_cc_enabled = false;
-  config.send_codec_spec->cng_payload_type = rtc::Optional<int>(42);
-  config.encoder_factory = MockAudioEncoderFactory::CreateUnusedFactory();
-  config.rtp.extensions.push_back(
-      RtpExtension(RtpExtension::kAudioLevelUri, kAudioLevelId));
-  EXPECT_EQ(
-      "{rtp: {ssrc: 1234, extensions: [{uri: "
-      "urn:ietf:params:rtp-hdrext:ssrc-audio-level, id: 2}], nack: "
-      "{rtp_history_ms: 0}, c_name: foo_name}, send_transport: null, "
-      "voe_channel_id: 1, min_bitrate_bps: 12000, max_bitrate_bps: 34000, "
-      "send_codec_spec: {nack_enabled: true, transport_cc_enabled: false, "
-      "cng_payload_type: 42, payload_type: 103, "
-      "format: {name: isac, clockrate_hz: 16000, num_channels: 1, "
-      "parameters: {}}}}",
-      config.ToString());
-}
-
-TEST(AudioSendStreamTest, ConstructDestruct) {
-  ConfigHelper helper(false, true);
-  internal::AudioSendStream send_stream(
-      helper.config(), helper.audio_state(), helper.worker_queue(),
-      helper.transport(), helper.bitrate_allocator(), helper.event_log(),
-      helper.rtcp_rtt_stats(), rtc::Optional<RtpState>());
-}
-
-TEST(AudioSendStreamTest, SendTelephoneEvent) {
-  ConfigHelper helper(false, true);
-  internal::AudioSendStream send_stream(
-      helper.config(), helper.audio_state(), helper.worker_queue(),
-      helper.transport(), helper.bitrate_allocator(), helper.event_log(),
-      helper.rtcp_rtt_stats(), rtc::Optional<RtpState>());
-  helper.SetupMockForSendTelephoneEvent();
-  EXPECT_TRUE(send_stream.SendTelephoneEvent(kTelephoneEventPayloadType,
-      kTelephoneEventPayloadFrequency, kTelephoneEventCode,
-      kTelephoneEventDuration));
-}
-
-TEST(AudioSendStreamTest, SetMuted) {
-  ConfigHelper helper(false, true);
-  internal::AudioSendStream send_stream(
-      helper.config(), helper.audio_state(), helper.worker_queue(),
-      helper.transport(), helper.bitrate_allocator(), helper.event_log(),
-      helper.rtcp_rtt_stats(), rtc::Optional<RtpState>());
-  EXPECT_CALL(*helper.channel_proxy(), SetInputMute(true));
-  send_stream.SetMuted(true);
-}
-
-TEST(AudioSendStreamTest, AudioBweCorrectObjectsOnChannelProxy) {
-  ConfigHelper helper(true, true);
-  internal::AudioSendStream send_stream(
-      helper.config(), helper.audio_state(), helper.worker_queue(),
-      helper.transport(), helper.bitrate_allocator(), helper.event_log(),
-      helper.rtcp_rtt_stats(), rtc::Optional<RtpState>());
-}
-
-TEST(AudioSendStreamTest, NoAudioBweCorrectObjectsOnChannelProxy) {
-  ConfigHelper helper(false, true);
-  internal::AudioSendStream send_stream(
-      helper.config(), helper.audio_state(), helper.worker_queue(),
-      helper.transport(), helper.bitrate_allocator(), helper.event_log(),
-      helper.rtcp_rtt_stats(), rtc::Optional<RtpState>());
-}
-
-TEST(AudioSendStreamTest, GetStats) {
-  ConfigHelper helper(false, true);
-  internal::AudioSendStream send_stream(
-      helper.config(), helper.audio_state(), helper.worker_queue(),
-      helper.transport(), helper.bitrate_allocator(), helper.event_log(),
-      helper.rtcp_rtt_stats(), rtc::Optional<RtpState>());
-  helper.SetupMockForGetStats();
-  AudioSendStream::Stats stats = send_stream.GetStats();
-  EXPECT_EQ(kSsrc, stats.local_ssrc);
-  EXPECT_EQ(static_cast<int64_t>(kCallStats.bytesSent), stats.bytes_sent);
-  EXPECT_EQ(kCallStats.packetsSent, stats.packets_sent);
-  EXPECT_EQ(static_cast<int32_t>(kReportBlock.cumulative_num_packets_lost),
-            stats.packets_lost);
-  EXPECT_EQ(Q8ToFloat(kReportBlock.fraction_lost), stats.fraction_lost);
-  EXPECT_EQ(std::string(kIsacCodec.plname), stats.codec_name);
-  EXPECT_EQ(static_cast<int32_t>(kReportBlock.extended_highest_sequence_number),
-            stats.ext_seqnum);
-  EXPECT_EQ(static_cast<int32_t>(kReportBlock.interarrival_jitter /
-                                 (kIsacCodec.plfreq / 1000)),
-            stats.jitter_ms);
-  EXPECT_EQ(kCallStats.rttMs, stats.rtt_ms);
-  EXPECT_EQ(static_cast<int32_t>(kSpeechInputLevel), stats.audio_level);
-  EXPECT_EQ(kTotalInputEnergy, stats.total_input_energy);
-  EXPECT_EQ(kTotalInputDuration, stats.total_input_duration);
-  EXPECT_EQ(-1, stats.aec_quality_min);
-  EXPECT_EQ(kEchoDelayMedian, stats.echo_delay_median_ms);
-  EXPECT_EQ(kEchoDelayStdDev, stats.echo_delay_std_ms);
-  EXPECT_EQ(kEchoReturnLoss, stats.echo_return_loss);
-  EXPECT_EQ(kEchoReturnLossEnhancement, stats.echo_return_loss_enhancement);
-  EXPECT_EQ(kResidualEchoLikelihood, stats.residual_echo_likelihood);
-  EXPECT_FALSE(stats.typing_noise_detected);
-}
-
-TEST(AudioSendStreamTest, GetStatsTypingNoiseDetected) {
-  ConfigHelper helper(false, true);
-  internal::AudioSendStream send_stream(
-      helper.config(), helper.audio_state(), helper.worker_queue(),
-      helper.transport(), helper.bitrate_allocator(), helper.event_log(),
-      helper.rtcp_rtt_stats(), rtc::Optional<RtpState>());
-  helper.SetupMockForGetStats();
-  EXPECT_FALSE(send_stream.GetStats().typing_noise_detected);
-
-  internal::AudioState* internal_audio_state =
-      static_cast<internal::AudioState*>(helper.audio_state().get());
-  VoiceEngineObserver* voe_observer =
-      static_cast<VoiceEngineObserver*>(internal_audio_state);
-  voe_observer->CallbackOnError(-1, VE_TYPING_NOISE_WARNING);
-  EXPECT_TRUE(send_stream.GetStats().typing_noise_detected);
-  voe_observer->CallbackOnError(-1, VE_TYPING_NOISE_OFF_WARNING);
-  EXPECT_FALSE(send_stream.GetStats().typing_noise_detected);
-}
-
-TEST(AudioSendStreamTest, SendCodecAppliesAudioNetworkAdaptor) {
-  ConfigHelper helper(false, true);
-  auto stream_config = helper.config();
-  stream_config.send_codec_spec =
-      rtc::Optional<AudioSendStream::Config::SendCodecSpec>({0, kOpusFormat});
-  const std::string kAnaConfigString = "abcde";
-  const std::string kAnaReconfigString = "12345";
-
-  stream_config.audio_network_adaptor_config =
-      rtc::Optional<std::string>(kAnaConfigString);
-
-  EXPECT_CALL(helper.mock_encoder_factory(), MakeAudioEncoderMock(_, _, _))
-      .WillOnce(Invoke([&kAnaConfigString, &kAnaReconfigString](
-                           int payload_type, const SdpAudioFormat& format,
-                           std::unique_ptr<AudioEncoder>* return_value) {
-        auto mock_encoder = SetupAudioEncoderMock(payload_type, format);
-        EXPECT_CALL(*mock_encoder,
-                    EnableAudioNetworkAdaptor(StrEq(kAnaConfigString), _))
-            .WillOnce(Return(true));
-        EXPECT_CALL(*mock_encoder,
-                    EnableAudioNetworkAdaptor(StrEq(kAnaReconfigString), _))
-            .WillOnce(Return(true));
-        *return_value = std::move(mock_encoder);
-      }));
-
-  internal::AudioSendStream send_stream(
-      stream_config, helper.audio_state(), helper.worker_queue(),
-      helper.transport(), helper.bitrate_allocator(), helper.event_log(),
-      helper.rtcp_rtt_stats(), rtc::Optional<RtpState>());
-
-  stream_config.audio_network_adaptor_config =
-      rtc::Optional<std::string>(kAnaReconfigString);
-
-  helper.SetupMockForModifyEncoder();
-  send_stream.Reconfigure(stream_config);
-}
-
-// VAD is applied when codec is mono and the CNG frequency matches the codec
-// clock rate.
-TEST(AudioSendStreamTest, SendCodecCanApplyVad) {
-  ConfigHelper helper(false, false);
-  auto stream_config = helper.config();
-  stream_config.send_codec_spec =
-      rtc::Optional<AudioSendStream::Config::SendCodecSpec>({9, kG722Format});
-  stream_config.send_codec_spec->cng_payload_type = rtc::Optional<int>(105);
-  using ::testing::Invoke;
-  std::unique_ptr<AudioEncoder> stolen_encoder;
-  EXPECT_CALL(*helper.channel_proxy(), SetEncoderForMock(_, _))
-      .WillOnce(
-          Invoke([&stolen_encoder](int payload_type,
-                                   std::unique_ptr<AudioEncoder>* encoder) {
-            stolen_encoder = std::move(*encoder);
-            return true;
-          }));
-
-  internal::AudioSendStream send_stream(
-      stream_config, helper.audio_state(), helper.worker_queue(),
-      helper.transport(), helper.bitrate_allocator(), helper.event_log(),
-      helper.rtcp_rtt_stats(), rtc::Optional<RtpState>());
-
-  // We cannot truly determine if the encoder created is an AudioEncoderCng.  It
-  // is the only reasonable implementation that will return something from
-  // ReclaimContainedEncoders, though.
-  ASSERT_TRUE(stolen_encoder);
-  EXPECT_FALSE(stolen_encoder->ReclaimContainedEncoders().empty());
-}
-
-TEST(AudioSendStreamTest, DoesNotPassHigherBitrateThanMaxBitrate) {
-  ConfigHelper helper(false, true);
-  internal::AudioSendStream send_stream(
-      helper.config(), helper.audio_state(), helper.worker_queue(),
-      helper.transport(), helper.bitrate_allocator(), helper.event_log(),
-      helper.rtcp_rtt_stats(), rtc::Optional<RtpState>());
-  EXPECT_CALL(*helper.channel_proxy(),
-              SetBitrate(helper.config().max_bitrate_bps, _));
-  send_stream.OnBitrateUpdated(helper.config().max_bitrate_bps + 5000, 0.0, 50,
-                               6000);
-}
-
-TEST(AudioSendStreamTest, ProbingIntervalOnBitrateUpdated) {
-  ConfigHelper helper(false, true);
-  internal::AudioSendStream send_stream(
-      helper.config(), helper.audio_state(), helper.worker_queue(),
-      helper.transport(), helper.bitrate_allocator(), helper.event_log(),
-      helper.rtcp_rtt_stats(), rtc::Optional<RtpState>());
-  EXPECT_CALL(*helper.channel_proxy(), SetBitrate(_, 5000));
-  send_stream.OnBitrateUpdated(50000, 0.0, 50, 5000);
-}
-
-// Test that AudioSendStream doesn't recreate the encoder unnecessarily.
-TEST(AudioSendStreamTest, DontRecreateEncoder) {
-  ConfigHelper helper(false, false);
-  // WillOnce is (currently) the default used by ConfigHelper if asked to set an
-  // expectation for SetEncoder. Since this behavior is essential for this test
-  // to be correct, it's instead set-up manually here. Otherwise a simple change
-  // to ConfigHelper (say to WillRepeatedly) would silently make this test
-  // useless.
-  EXPECT_CALL(*helper.channel_proxy(), SetEncoderForMock(_, _))
-      .WillOnce(Return(true));
-
-  auto stream_config = helper.config();
-  stream_config.send_codec_spec =
-      rtc::Optional<AudioSendStream::Config::SendCodecSpec>({9, kG722Format});
-  stream_config.send_codec_spec->cng_payload_type = rtc::Optional<int>(105);
-  internal::AudioSendStream send_stream(
-      stream_config, helper.audio_state(), helper.worker_queue(),
-      helper.transport(), helper.bitrate_allocator(), helper.event_log(),
-      helper.rtcp_rtt_stats(), rtc::Optional<RtpState>());
-  send_stream.Reconfigure(stream_config);
-}
-
-TEST(AudioSendStreamTest, ReconfigureTransportCcResetsFirst) {
-  ConfigHelper helper(false, true);
-  internal::AudioSendStream send_stream(
-      helper.config(), helper.audio_state(), helper.worker_queue(),
-      helper.transport(), helper.bitrate_allocator(), helper.event_log(),
-      helper.rtcp_rtt_stats(), rtc::Optional<RtpState>());
-  auto new_config = helper.config();
-  ConfigHelper::AddBweToConfig(&new_config);
-  EXPECT_CALL(*helper.channel_proxy(),
-              EnableSendTransportSequenceNumber(kTransportSequenceNumberId))
-      .Times(1);
-  {
-    ::testing::InSequence seq;
-    EXPECT_CALL(*helper.channel_proxy(), ResetSenderCongestionControlObjects())
-        .Times(1);
-    EXPECT_CALL(*helper.channel_proxy(), RegisterSenderCongestionControlObjects(
-        helper.transport(), Ne(nullptr)))
-        .Times(1);
-  }
-  send_stream.Reconfigure(new_config);
-}
-
-
-}  // namespace test
-}  // namespace webrtc
diff --git a/audio/audio_state.cc b/audio/audio_state.cc
deleted file mode 100644
index 0e3f5f6..0000000
--- a/audio/audio_state.cc
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- *  Copyright (c) 2015 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/audio/audio_state.h"
-
-#include "webrtc/modules/audio_device/include/audio_device.h"
-#include "webrtc/rtc_base/atomicops.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/voice_engine/include/voe_errors.h"
-
-namespace webrtc {
-namespace internal {
-
-AudioState::AudioState(const AudioState::Config& config)
-    : config_(config),
-      voe_base_(config.voice_engine),
-      audio_transport_proxy_(voe_base_->audio_transport(),
-                             config_.audio_processing.get(),
-                             config_.audio_mixer) {
-  process_thread_checker_.DetachFromThread();
-  RTC_DCHECK(config_.audio_mixer);
-
-  // Only one AudioState should be created per VoiceEngine.
-  RTC_CHECK(voe_base_->RegisterVoiceEngineObserver(*this) != -1);
-
-  auto* const device = voe_base_->audio_device_module();
-  RTC_DCHECK(device);
-
-  // This is needed for the Chrome implementation of RegisterAudioCallback.
-  device->RegisterAudioCallback(nullptr);
-  device->RegisterAudioCallback(&audio_transport_proxy_);
-}
-
-AudioState::~AudioState() {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  voe_base_->DeRegisterVoiceEngineObserver();
-}
-
-VoiceEngine* AudioState::voice_engine() {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  return config_.voice_engine;
-}
-
-rtc::scoped_refptr<AudioMixer> AudioState::mixer() {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  return config_.audio_mixer;
-}
-
-bool AudioState::typing_noise_detected() const {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  rtc::CritScope lock(&crit_sect_);
-  return typing_noise_detected_;
-}
-
-// Reference count; implementation copied from rtc::RefCountedObject.
-int AudioState::AddRef() const {
-  return rtc::AtomicOps::Increment(&ref_count_);
-}
-
-// Reference count; implementation copied from rtc::RefCountedObject.
-int AudioState::Release() const {
-  int count = rtc::AtomicOps::Decrement(&ref_count_);
-  if (!count) {
-    delete this;
-  }
-  return count;
-}
-
-void AudioState::CallbackOnError(int channel_id, int err_code) {
-  RTC_DCHECK(process_thread_checker_.CalledOnValidThread());
-
-  // All call sites in VoE, as of this writing, specify -1 as channel_id.
-  RTC_DCHECK(channel_id == -1);
-  LOG(LS_INFO) << "VoiceEngine error " << err_code << " reported on channel "
-               << channel_id << ".";
-  if (err_code == VE_TYPING_NOISE_WARNING) {
-    rtc::CritScope lock(&crit_sect_);
-    typing_noise_detected_ = true;
-  } else if (err_code == VE_TYPING_NOISE_OFF_WARNING) {
-    rtc::CritScope lock(&crit_sect_);
-    typing_noise_detected_ = false;
-  }
-}
-}  // namespace internal
-
-rtc::scoped_refptr<AudioState> AudioState::Create(
-    const AudioState::Config& config) {
-  return rtc::scoped_refptr<AudioState>(new internal::AudioState(config));
-}
-}  // namespace webrtc
diff --git a/audio/audio_state.h b/audio/audio_state.h
deleted file mode 100644
index 893c1f9..0000000
--- a/audio/audio_state.h
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- *  Copyright (c) 2015 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_AUDIO_AUDIO_STATE_H_
-#define WEBRTC_AUDIO_AUDIO_STATE_H_
-
-#include "webrtc/audio/audio_transport_proxy.h"
-#include "webrtc/audio/scoped_voe_interface.h"
-#include "webrtc/call/audio_state.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/thread_checker.h"
-#include "webrtc/voice_engine/include/voe_base.h"
-
-namespace webrtc {
-namespace internal {
-
-class AudioState final : public webrtc::AudioState,
-                         public webrtc::VoiceEngineObserver {
- public:
-  explicit AudioState(const AudioState::Config& config);
-  ~AudioState() override;
-
-  AudioProcessing* audio_processing() override {
-    RTC_DCHECK(config_.audio_processing);
-    return config_.audio_processing.get();
-  }
-
-  VoiceEngine* voice_engine();
-  rtc::scoped_refptr<AudioMixer> mixer();
-  bool typing_noise_detected() const;
-
- private:
-  // rtc::RefCountInterface implementation.
-  int AddRef() const override;
-  int Release() const override;
-
-  // webrtc::VoiceEngineObserver implementation.
-  void CallbackOnError(int channel_id, int err_code) override;
-
-  rtc::ThreadChecker thread_checker_;
-  rtc::ThreadChecker process_thread_checker_;
-  const webrtc::AudioState::Config config_;
-
-  // We hold one interface pointer to the VoE to make sure it is kept alive.
-  ScopedVoEInterface<VoEBase> voe_base_;
-
-  // The critical section isn't strictly needed in this case, but xSAN bots may
-  // trigger on unprotected cross-thread access.
-  rtc::CriticalSection crit_sect_;
-  bool typing_noise_detected_ RTC_GUARDED_BY(crit_sect_) = false;
-
-  // Reference count; implementation copied from rtc::RefCountedObject.
-  mutable volatile int ref_count_ = 0;
-
-  // Transports mixed audio from the mixer to the audio device and
-  // recorded audio to the VoE AudioTransport.
-  AudioTransportProxy audio_transport_proxy_;
-
-  RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(AudioState);
-};
-}  // namespace internal
-}  // namespace webrtc
-
-#endif  // WEBRTC_AUDIO_AUDIO_STATE_H_
diff --git a/audio/audio_state_unittest.cc b/audio/audio_state_unittest.cc
deleted file mode 100644
index ffaacb6..0000000
--- a/audio/audio_state_unittest.cc
+++ /dev/null
@@ -1,175 +0,0 @@
-/*
- *  Copyright (c) 2015 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 <memory>
-
-#include "webrtc/audio/audio_state.h"
-#include "webrtc/modules/audio_mixer/audio_mixer_impl.h"
-#include "webrtc/modules/audio_processing/include/mock_audio_processing.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/mock_voice_engine.h"
-
-namespace webrtc {
-namespace test {
-namespace {
-
-const int kSampleRate = 8000;
-const int kNumberOfChannels = 1;
-const int kBytesPerSample = 2;
-
-struct ConfigHelper {
-  ConfigHelper() : audio_mixer(AudioMixerImpl::Create()) {
-    EXPECT_CALL(mock_voice_engine, RegisterVoiceEngineObserver(testing::_))
-        .WillOnce(testing::Return(0));
-    EXPECT_CALL(mock_voice_engine, DeRegisterVoiceEngineObserver())
-        .WillOnce(testing::Return(0));
-    EXPECT_CALL(mock_voice_engine, audio_device_module())
-        .Times(testing::AtLeast(1));
-    EXPECT_CALL(mock_voice_engine, audio_transport())
-        .WillRepeatedly(testing::Return(&audio_transport));
-
-    auto device = static_cast<MockAudioDeviceModule*>(
-        voice_engine().audio_device_module());
-
-    // Populate the audio transport proxy pointer to the most recent
-    // transport connected to the Audio Device.
-    ON_CALL(*device, RegisterAudioCallback(testing::_))
-        .WillByDefault(testing::Invoke([this](AudioTransport* transport) {
-          registered_audio_transport = transport;
-          return 0;
-        }));
-
-    audio_state_config.voice_engine = &mock_voice_engine;
-    audio_state_config.audio_mixer = audio_mixer;
-    audio_state_config.audio_processing =
-        new rtc::RefCountedObject<MockAudioProcessing>();
-  }
-  AudioState::Config& config() { return audio_state_config; }
-  MockVoiceEngine& voice_engine() { return mock_voice_engine; }
-  rtc::scoped_refptr<AudioMixer> mixer() { return audio_mixer; }
-  MockAudioTransport& original_audio_transport() { return audio_transport; }
-  AudioTransport* audio_transport_proxy() { return registered_audio_transport; }
-
- private:
-  testing::StrictMock<MockVoiceEngine> mock_voice_engine;
-  AudioState::Config audio_state_config;
-  rtc::scoped_refptr<AudioMixer> audio_mixer;
-  MockAudioTransport audio_transport;
-  AudioTransport* registered_audio_transport = nullptr;
-};
-
-class FakeAudioSource : public AudioMixer::Source {
- public:
-  // TODO(aleloi): Valid overrides commented out, because the gmock
-  // methods don't use any override declarations, and we want to avoid
-  // warnings from -Winconsistent-missing-override. See
-  // http://crbug.com/428099.
-  int Ssrc() const /*override*/ { return 0; }
-
-  int PreferredSampleRate() const /*override*/ { return kSampleRate; }
-
-  MOCK_METHOD2(GetAudioFrameWithInfo,
-               AudioFrameInfo(int sample_rate_hz, AudioFrame* audio_frame));
-};
-
-}  // namespace
-
-TEST(AudioStateTest, Create) {
-  ConfigHelper helper;
-  rtc::scoped_refptr<AudioState> audio_state =
-      AudioState::Create(helper.config());
-  EXPECT_TRUE(audio_state.get());
-}
-
-TEST(AudioStateTest, ConstructDestruct) {
-  ConfigHelper helper;
-  std::unique_ptr<internal::AudioState> audio_state(
-      new internal::AudioState(helper.config()));
-}
-
-TEST(AudioStateTest, GetVoiceEngine) {
-  ConfigHelper helper;
-  std::unique_ptr<internal::AudioState> audio_state(
-      new internal::AudioState(helper.config()));
-  EXPECT_EQ(audio_state->voice_engine(), &helper.voice_engine());
-}
-
-TEST(AudioStateTest, TypingNoiseDetected) {
-  ConfigHelper helper;
-  std::unique_ptr<internal::AudioState> audio_state(
-      new internal::AudioState(helper.config()));
-  VoiceEngineObserver* voe_observer =
-      static_cast<VoiceEngineObserver*>(audio_state.get());
-  EXPECT_FALSE(audio_state->typing_noise_detected());
-
-  voe_observer->CallbackOnError(-1, VE_NOT_INITED);
-  EXPECT_FALSE(audio_state->typing_noise_detected());
-
-  voe_observer->CallbackOnError(-1, VE_TYPING_NOISE_WARNING);
-  EXPECT_TRUE(audio_state->typing_noise_detected());
-  voe_observer->CallbackOnError(-1, VE_NOT_INITED);
-  EXPECT_TRUE(audio_state->typing_noise_detected());
-
-  voe_observer->CallbackOnError(-1, VE_TYPING_NOISE_OFF_WARNING);
-  EXPECT_FALSE(audio_state->typing_noise_detected());
-  voe_observer->CallbackOnError(-1, VE_NOT_INITED);
-  EXPECT_FALSE(audio_state->typing_noise_detected());
-}
-
-// Test that RecordedDataIsAvailable calls get to the original transport.
-TEST(AudioStateAudioPathTest, RecordedAudioArrivesAtOriginalTransport) {
-  ConfigHelper helper;
-
-  rtc::scoped_refptr<AudioState> audio_state =
-      AudioState::Create(helper.config());
-
-  // Setup completed. Ensure call of original transport is forwarded to new.
-  uint32_t new_mic_level;
-  EXPECT_CALL(
-      helper.original_audio_transport(),
-      RecordedDataIsAvailable(nullptr, kSampleRate / 100, kBytesPerSample,
-                              kNumberOfChannels, kSampleRate, 0, 0, 0, false,
-                              testing::Ref(new_mic_level)));
-
-  helper.audio_transport_proxy()->RecordedDataIsAvailable(
-      nullptr, kSampleRate / 100, kBytesPerSample, kNumberOfChannels,
-      kSampleRate, 0, 0, 0, false, new_mic_level);
-}
-
-TEST(AudioStateAudioPathTest,
-     QueryingProxyForAudioShouldResultInGetAudioCallOnMixerSource) {
-  ConfigHelper helper;
-
-  rtc::scoped_refptr<AudioState> audio_state =
-      AudioState::Create(helper.config());
-
-  FakeAudioSource fake_source;
-
-  helper.mixer()->AddSource(&fake_source);
-
-  EXPECT_CALL(fake_source, GetAudioFrameWithInfo(testing::_, testing::_))
-      .WillOnce(
-          testing::Invoke([](int sample_rate_hz, AudioFrame* audio_frame) {
-            audio_frame->sample_rate_hz_ = sample_rate_hz;
-            audio_frame->samples_per_channel_ = sample_rate_hz / 100;
-            audio_frame->num_channels_ = kNumberOfChannels;
-            return AudioMixer::Source::AudioFrameInfo::kNormal;
-          }));
-
-  int16_t audio_buffer[kSampleRate / 100 * kNumberOfChannels];
-  size_t n_samples_out;
-  int64_t elapsed_time_ms;
-  int64_t ntp_time_ms;
-  helper.audio_transport_proxy()->NeedMorePlayData(
-      kSampleRate / 100, kBytesPerSample, kNumberOfChannels, kSampleRate,
-      audio_buffer, n_samples_out, &elapsed_time_ms, &ntp_time_ms);
-}
-}  // namespace test
-}  // namespace webrtc
diff --git a/audio/audio_transport_proxy.cc b/audio/audio_transport_proxy.cc
deleted file mode 100644
index 73b0091..0000000
--- a/audio/audio_transport_proxy.cc
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
- *  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/audio/audio_transport_proxy.h"
-
-namespace webrtc {
-
-namespace {
-// Resample audio in |frame| to given sample rate preserving the
-// channel count and place the result in |destination|.
-int Resample(const AudioFrame& frame,
-             const int destination_sample_rate,
-             PushResampler<int16_t>* resampler,
-             int16_t* destination) {
-  const int number_of_channels = static_cast<int>(frame.num_channels_);
-  const int target_number_of_samples_per_channel =
-      destination_sample_rate / 100;
-  resampler->InitializeIfNeeded(frame.sample_rate_hz_, destination_sample_rate,
-                                number_of_channels);
-
-  // TODO(yujo): make resampler take an AudioFrame, and add special case
-  // handling of muted frames.
-  return resampler->Resample(
-      frame.data(), frame.samples_per_channel_ * number_of_channels,
-      destination, number_of_channels * target_number_of_samples_per_channel);
-}
-}  // namespace
-
-AudioTransportProxy::AudioTransportProxy(AudioTransport* voe_audio_transport,
-                                         AudioProcessing* audio_processing,
-                                         AudioMixer* mixer)
-    : voe_audio_transport_(voe_audio_transport),
-      audio_processing_(audio_processing),
-      mixer_(mixer) {
-  RTC_DCHECK(voe_audio_transport);
-  RTC_DCHECK(audio_processing);
-  RTC_DCHECK(mixer);
-}
-
-AudioTransportProxy::~AudioTransportProxy() {}
-
-int32_t AudioTransportProxy::RecordedDataIsAvailable(
-    const void* audioSamples,
-    const size_t nSamples,
-    const size_t nBytesPerSample,
-    const size_t nChannels,
-    const uint32_t samplesPerSec,
-    const uint32_t totalDelayMS,
-    const int32_t clockDrift,
-    const uint32_t currentMicLevel,
-    const bool keyPressed,
-    uint32_t& newMicLevel) {  // NOLINT: to avoid changing APIs
-  // Pass call through to original audio transport instance.
-  return voe_audio_transport_->RecordedDataIsAvailable(
-      audioSamples, nSamples, nBytesPerSample, nChannels, samplesPerSec,
-      totalDelayMS, clockDrift, currentMicLevel, keyPressed, newMicLevel);
-}
-
-int32_t AudioTransportProxy::NeedMorePlayData(const size_t nSamples,
-                                              const size_t nBytesPerSample,
-                                              const size_t nChannels,
-                                              const uint32_t samplesPerSec,
-                                              void* audioSamples,
-                                              size_t& nSamplesOut,
-                                              int64_t* elapsed_time_ms,
-                                              int64_t* ntp_time_ms) {
-  RTC_DCHECK_EQ(sizeof(int16_t) * nChannels, nBytesPerSample);
-  RTC_DCHECK_GE(nChannels, 1);
-  RTC_DCHECK_LE(nChannels, 2);
-  RTC_DCHECK_GE(
-      samplesPerSec,
-      static_cast<uint32_t>(AudioProcessing::NativeRate::kSampleRate8kHz));
-
-  // 100 = 1 second / data duration (10 ms).
-  RTC_DCHECK_EQ(nSamples * 100, samplesPerSec);
-  RTC_DCHECK_LE(nBytesPerSample * nSamples * nChannels,
-                AudioFrame::kMaxDataSizeBytes);
-
-  mixer_->Mix(nChannels, &mixed_frame_);
-  *elapsed_time_ms = mixed_frame_.elapsed_time_ms_;
-  *ntp_time_ms = mixed_frame_.ntp_time_ms_;
-
-  const auto error = audio_processing_->ProcessReverseStream(&mixed_frame_);
-  RTC_DCHECK_EQ(error, AudioProcessing::kNoError);
-
-  nSamplesOut = Resample(mixed_frame_, samplesPerSec, &resampler_,
-                         static_cast<int16_t*>(audioSamples));
-  RTC_DCHECK_EQ(nSamplesOut, nChannels * nSamples);
-  return 0;
-}
-
-void AudioTransportProxy::PushCaptureData(int voe_channel,
-                                          const void* audio_data,
-                                          int bits_per_sample,
-                                          int sample_rate,
-                                          size_t number_of_channels,
-                                          size_t number_of_frames) {
-  // This is part of deprecated VoE interface operating on specific
-  // VoE channels. It should not be used.
-  RTC_NOTREACHED();
-}
-
-void AudioTransportProxy::PullRenderData(int bits_per_sample,
-                                         int sample_rate,
-                                         size_t number_of_channels,
-                                         size_t number_of_frames,
-                                         void* audio_data,
-                                         int64_t* elapsed_time_ms,
-                                         int64_t* ntp_time_ms) {
-  RTC_DCHECK_EQ(bits_per_sample, 16);
-  RTC_DCHECK_GE(number_of_channels, 1);
-  RTC_DCHECK_LE(number_of_channels, 2);
-  RTC_DCHECK_GE(sample_rate, AudioProcessing::NativeRate::kSampleRate8kHz);
-
-  // 100 = 1 second / data duration (10 ms).
-  RTC_DCHECK_EQ(number_of_frames * 100, sample_rate);
-
-  // 8 = bits per byte.
-  RTC_DCHECK_LE(bits_per_sample / 8 * number_of_frames * number_of_channels,
-                AudioFrame::kMaxDataSizeBytes);
-  mixer_->Mix(number_of_channels, &mixed_frame_);
-  *elapsed_time_ms = mixed_frame_.elapsed_time_ms_;
-  *ntp_time_ms = mixed_frame_.ntp_time_ms_;
-
-  const auto output_samples = Resample(mixed_frame_, sample_rate, &resampler_,
-                                       static_cast<int16_t*>(audio_data));
-  RTC_DCHECK_EQ(output_samples, number_of_channels * number_of_frames);
-}
-
-}  // namespace webrtc
diff --git a/audio/audio_transport_proxy.h b/audio/audio_transport_proxy.h
deleted file mode 100644
index 7d2dea1..0000000
--- a/audio/audio_transport_proxy.h
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- *  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_AUDIO_AUDIO_TRANSPORT_PROXY_H_
-#define WEBRTC_AUDIO_AUDIO_TRANSPORT_PROXY_H_
-
-#include "webrtc/api/audio/audio_mixer.h"
-#include "webrtc/common_audio/resampler/include/push_resampler.h"
-#include "webrtc/modules/audio_device/include/audio_device_defines.h"
-#include "webrtc/modules/audio_processing/include/audio_processing.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/scoped_ref_ptr.h"
-
-namespace webrtc {
-
-class AudioTransportProxy : public AudioTransport {
- public:
-  AudioTransportProxy(AudioTransport* voe_audio_transport,
-                      AudioProcessing* audio_processing,
-                      AudioMixer* mixer);
-
-  ~AudioTransportProxy() override;
-
-  int32_t RecordedDataIsAvailable(const void* audioSamples,
-                                  const size_t nSamples,
-                                  const size_t nBytesPerSample,
-                                  const size_t nChannels,
-                                  const uint32_t samplesPerSec,
-                                  const uint32_t totalDelayMS,
-                                  const int32_t clockDrift,
-                                  const uint32_t currentMicLevel,
-                                  const bool keyPressed,
-                                  uint32_t& newMicLevel) override;
-
-  int32_t NeedMorePlayData(const size_t nSamples,
-                           const size_t nBytesPerSample,
-                           const size_t nChannels,
-                           const uint32_t samplesPerSec,
-                           void* audioSamples,
-                           size_t& nSamplesOut,
-                           int64_t* elapsed_time_ms,
-                           int64_t* ntp_time_ms) override;
-
-  void PushCaptureData(int voe_channel,
-                       const void* audio_data,
-                       int bits_per_sample,
-                       int sample_rate,
-                       size_t number_of_channels,
-                       size_t number_of_frames) override;
-
-  void PullRenderData(int bits_per_sample,
-                      int sample_rate,
-                      size_t number_of_channels,
-                      size_t number_of_frames,
-                      void* audio_data,
-                      int64_t* elapsed_time_ms,
-                      int64_t* ntp_time_ms) override;
-
- private:
-  AudioTransport* voe_audio_transport_;
-  AudioProcessing* audio_processing_;
-  rtc::scoped_refptr<AudioMixer> mixer_;
-  AudioFrame mixed_frame_;
-  // Converts mixed audio to the audio device output rate.
-  PushResampler<int16_t> resampler_;
-
-  RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(AudioTransportProxy);
-};
-}  // namespace webrtc
-
-#endif  // WEBRTC_AUDIO_AUDIO_TRANSPORT_PROXY_H_
diff --git a/audio/conversion.h b/audio/conversion.h
deleted file mode 100644
index 6ae3243..0000000
--- a/audio/conversion.h
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- *  Copyright (c) 2015 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_AUDIO_CONVERSION_H_
-#define WEBRTC_AUDIO_CONVERSION_H_
-
-namespace webrtc {
-
-// Convert fixed point number with 8 bit fractional part, to floating point.
-inline float Q8ToFloat(uint32_t v) {
-  return static_cast<float>(v) / (1 << 8);
-}
-
-// Convert fixed point number with 14 bit fractional part, to floating point.
-inline float Q14ToFloat(uint32_t v) {
-  return static_cast<float>(v) / (1 << 14);
-}
-}  // namespace webrtc
-
-#endif  // WEBRTC_AUDIO_CONVERSION_H_
diff --git a/audio/scoped_voe_interface.h b/audio/scoped_voe_interface.h
deleted file mode 100644
index 59631bf..0000000
--- a/audio/scoped_voe_interface.h
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- *  Copyright (c) 2015 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_AUDIO_SCOPED_VOE_INTERFACE_H_
-#define WEBRTC_AUDIO_SCOPED_VOE_INTERFACE_H_
-
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-
-class VoiceEngine;
-
-namespace internal {
-
-// Utility template for obtaining and holding a reference to a VoiceEngine
-// interface and making sure it is released when this object goes out of scope.
-template<class T> class ScopedVoEInterface {
- public:
-  explicit ScopedVoEInterface(webrtc::VoiceEngine* e)
-      : ptr_(T::GetInterface(e)) {
-    RTC_DCHECK(ptr_);
-  }
-  ~ScopedVoEInterface() {
-    if (ptr_) {
-      ptr_->Release();
-    }
-  }
-  T* operator->() {
-    RTC_DCHECK(ptr_);
-    return ptr_;
-  }
- private:
-  T* ptr_;
-};
-}  // namespace internal
-}  // namespace webrtc
-
-#endif  // WEBRTC_AUDIO_SCOPED_VOE_INTERFACE_H_
diff --git a/audio/test/audio_bwe_integration_test.cc b/audio/test/audio_bwe_integration_test.cc
deleted file mode 100644
index 265738c..0000000
--- a/audio/test/audio_bwe_integration_test.cc
+++ /dev/null
@@ -1,156 +0,0 @@
-/*
- *  Copyright (c) 2017 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/audio/test/audio_bwe_integration_test.h"
-
-#include "webrtc/common_audio/wav_file.h"
-#include "webrtc/rtc_base/ptr_util.h"
-#include "webrtc/system_wrappers/include/sleep.h"
-#include "webrtc/test/field_trial.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/testsupport/fileutils.h"
-
-namespace webrtc {
-namespace test {
-
-namespace {
-// Wait a second between stopping sending and stopping receiving audio.
-constexpr int kExtraProcessTimeMs = 1000;
-}  // namespace
-
-AudioBweTest::AudioBweTest() : EndToEndTest(CallTest::kDefaultTimeoutMs) {}
-
-size_t AudioBweTest::GetNumVideoStreams() const {
-  return 0;
-}
-size_t AudioBweTest::GetNumAudioStreams() const {
-  return 1;
-}
-size_t AudioBweTest::GetNumFlexfecStreams() const {
-  return 0;
-}
-
-std::unique_ptr<test::FakeAudioDevice::Capturer>
-AudioBweTest::CreateCapturer() {
-  return test::FakeAudioDevice::CreateWavFileReader(AudioInputFile());
-}
-
-void AudioBweTest::OnFakeAudioDevicesCreated(
-    test::FakeAudioDevice* send_audio_device,
-    test::FakeAudioDevice* recv_audio_device) {
-  send_audio_device_ = send_audio_device;
-}
-
-test::PacketTransport* AudioBweTest::CreateSendTransport(
-    SingleThreadedTaskQueueForTesting* task_queue,
-    Call* sender_call) {
-  return new test::PacketTransport(
-      task_queue, sender_call, this, test::PacketTransport::kSender,
-      test::CallTest::payload_type_map_, GetNetworkPipeConfig());
-}
-
-test::PacketTransport* AudioBweTest::CreateReceiveTransport(
-    SingleThreadedTaskQueueForTesting* task_queue) {
-  return new test::PacketTransport(
-      task_queue, nullptr, this, test::PacketTransport::kReceiver,
-      test::CallTest::payload_type_map_, GetNetworkPipeConfig());
-}
-
-void AudioBweTest::PerformTest() {
-  send_audio_device_->WaitForRecordingEnd();
-  SleepMs(GetNetworkPipeConfig().queue_delay_ms + kExtraProcessTimeMs);
-}
-
-class StatsPollTask : public rtc::QueuedTask {
- public:
-  explicit StatsPollTask(Call* sender_call) : sender_call_(sender_call) {}
-
- private:
-  bool Run() override {
-    RTC_CHECK(sender_call_);
-    Call::Stats call_stats = sender_call_->GetStats();
-    EXPECT_GT(call_stats.send_bandwidth_bps, 25000);
-    rtc::TaskQueue::Current()->PostDelayedTask(
-        std::unique_ptr<QueuedTask>(this), 100);
-    return false;
-  }
-  Call* sender_call_;
-};
-
-class NoBandwidthDropAfterDtx : public AudioBweTest {
- public:
-  NoBandwidthDropAfterDtx()
-      : sender_call_(nullptr), stats_poller_("stats poller task queue") {}
-
-  void ModifyAudioConfigs(
-      AudioSendStream::Config* send_config,
-      std::vector<AudioReceiveStream::Config>* receive_configs) override {
-    send_config->send_codec_spec =
-        rtc::Optional<AudioSendStream::Config::SendCodecSpec>(
-            {test::CallTest::kAudioSendPayloadType,
-             {"OPUS",
-              48000,
-              2,
-              {{"ptime", "60"}, {"usedtx", "1"}, {"stereo", "1"}}}});
-
-    send_config->min_bitrate_bps = 6000;
-    send_config->max_bitrate_bps = 100000;
-    send_config->rtp.extensions.push_back(
-        RtpExtension(RtpExtension::kTransportSequenceNumberUri,
-                     kTransportSequenceNumberExtensionId));
-    for (AudioReceiveStream::Config& recv_config : *receive_configs) {
-      recv_config.rtp.transport_cc = true;
-      recv_config.rtp.extensions = send_config->rtp.extensions;
-      recv_config.rtp.remote_ssrc = send_config->rtp.ssrc;
-    }
-  }
-
-  std::string AudioInputFile() override {
-    return test::ResourcePath("voice_engine/audio_dtx16", "wav");
-  }
-
-  FakeNetworkPipe::Config GetNetworkPipeConfig() override {
-    FakeNetworkPipe::Config pipe_config;
-    pipe_config.link_capacity_kbps = 50;
-    pipe_config.queue_length_packets = 1500;
-    pipe_config.queue_delay_ms = 300;
-    return pipe_config;
-  }
-
-  void OnCallsCreated(Call* sender_call, Call* receiver_call) override {
-    sender_call_ = sender_call;
-  }
-
-  void PerformTest() override {
-    stats_poller_.PostDelayedTask(
-        std::unique_ptr<rtc::QueuedTask>(new StatsPollTask(sender_call_)), 100);
-    sender_call_->OnTransportOverheadChanged(webrtc::MediaType::AUDIO, 0);
-    AudioBweTest::PerformTest();
-  }
-
- private:
-  Call* sender_call_;
-  rtc::TaskQueue stats_poller_;
-};
-
-using AudioBweIntegrationTest = CallTest;
-
-// TODO(tschumim): This test is flaky when run on android and mac. Re-enable the
-// test for when the issue is fixed.
-TEST_F(AudioBweIntegrationTest, DISABLED_NoBandwidthDropAfterDtx) {
-  webrtc::test::ScopedFieldTrials override_field_trials(
-      "WebRTC-Audio-SendSideBwe/Enabled/"
-      "WebRTC-SendSideBwe-WithOverhead/Enabled/");
-  NoBandwidthDropAfterDtx test;
-  RunBaseTest(&test);
-}
-
-}  // namespace test
-}  // namespace webrtc
diff --git a/audio/test/audio_bwe_integration_test.h b/audio/test/audio_bwe_integration_test.h
deleted file mode 100644
index 729b18f..0000000
--- a/audio/test/audio_bwe_integration_test.h
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- *  Copyright (c) 2017 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_AUDIO_TEST_AUDIO_BWE_INTEGRATION_TEST_H_
-#define WEBRTC_AUDIO_TEST_AUDIO_BWE_INTEGRATION_TEST_H_
-
-#include <memory>
-#include <string>
-
-#include "webrtc/test/call_test.h"
-#include "webrtc/test/fake_audio_device.h"
-#include "webrtc/test/single_threaded_task_queue.h"
-
-namespace webrtc {
-namespace test {
-
-class AudioBweTest : public test::EndToEndTest {
- public:
-  AudioBweTest();
-
- protected:
-  virtual std::string AudioInputFile() = 0;
-
-  virtual FakeNetworkPipe::Config GetNetworkPipeConfig() = 0;
-
-  size_t GetNumVideoStreams() const override;
-  size_t GetNumAudioStreams() const override;
-  size_t GetNumFlexfecStreams() const override;
-
-  std::unique_ptr<test::FakeAudioDevice::Capturer> CreateCapturer() override;
-
-  void OnFakeAudioDevicesCreated(
-      test::FakeAudioDevice* send_audio_device,
-      test::FakeAudioDevice* recv_audio_device) override;
-
-  test::PacketTransport* CreateSendTransport(
-      SingleThreadedTaskQueueForTesting* task_queue,
-      Call* sender_call) override;
-  test::PacketTransport* CreateReceiveTransport(
-      SingleThreadedTaskQueueForTesting* task_queue) override;
-
-  void PerformTest() override;
-
- private:
-  test::FakeAudioDevice* send_audio_device_;
-};
-
-}  // namespace test
-}  // namespace webrtc
-
-#endif  // WEBRTC_AUDIO_TEST_AUDIO_BWE_INTEGRATION_TEST_H_
diff --git a/audio/test/audio_end_to_end_test.cc b/audio/test/audio_end_to_end_test.cc
deleted file mode 100644
index 5d4cbf0..0000000
--- a/audio/test/audio_end_to_end_test.cc
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- *  Copyright (c) 2017 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 <algorithm>
-
-#include "webrtc/audio/test/audio_end_to_end_test.h"
-#include "webrtc/system_wrappers/include/sleep.h"
-#include "webrtc/test/fake_audio_device.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-namespace test {
-namespace {
-// Wait half a second between stopping sending and stopping receiving audio.
-constexpr int kExtraRecordTimeMs = 500;
-
-constexpr int kSampleRate = 48000;
-}  // namespace
-
-AudioEndToEndTest::AudioEndToEndTest()
-    : EndToEndTest(CallTest::kDefaultTimeoutMs) {}
-
-FakeNetworkPipe::Config AudioEndToEndTest::GetNetworkPipeConfig() const {
-  return FakeNetworkPipe::Config();
-}
-
-size_t AudioEndToEndTest::GetNumVideoStreams() const {
-  return 0;
-}
-
-size_t AudioEndToEndTest::GetNumAudioStreams() const {
-  return 1;
-}
-
-size_t AudioEndToEndTest::GetNumFlexfecStreams() const {
-  return 0;
-}
-
-std::unique_ptr<test::FakeAudioDevice::Capturer>
-    AudioEndToEndTest::CreateCapturer() {
-  return test::FakeAudioDevice::CreatePulsedNoiseCapturer(32000, kSampleRate);
-}
-
-std::unique_ptr<test::FakeAudioDevice::Renderer>
-    AudioEndToEndTest::CreateRenderer() {
-  return test::FakeAudioDevice::CreateDiscardRenderer(kSampleRate);
-}
-
-void AudioEndToEndTest::OnFakeAudioDevicesCreated(
-    test::FakeAudioDevice* send_audio_device,
-    test::FakeAudioDevice* recv_audio_device) {
-  send_audio_device_ = send_audio_device;
-}
-
-test::PacketTransport* AudioEndToEndTest::CreateSendTransport(
-    SingleThreadedTaskQueueForTesting* task_queue,
-    Call* sender_call) {
-  return new test::PacketTransport(
-      task_queue, sender_call, this, test::PacketTransport::kSender,
-      test::CallTest::payload_type_map_, GetNetworkPipeConfig());
-}
-
-test::PacketTransport* AudioEndToEndTest::CreateReceiveTransport(
-      SingleThreadedTaskQueueForTesting* task_queue) {
-  return new test::PacketTransport(
-      task_queue, nullptr, this, test::PacketTransport::kReceiver,
-      test::CallTest::payload_type_map_, GetNetworkPipeConfig());
-}
-
-void AudioEndToEndTest::ModifyAudioConfigs(
-  AudioSendStream::Config* send_config,
-  std::vector<AudioReceiveStream::Config>* receive_configs) {
-  // Large bitrate by default.
-  const webrtc::SdpAudioFormat kDefaultFormat("opus", 48000, 2,
-                                              {{"stereo", "1"}});
-  send_config->send_codec_spec =
-      rtc::Optional<AudioSendStream::Config::SendCodecSpec>(
-          {test::CallTest::kAudioSendPayloadType, kDefaultFormat});
-}
-
-void AudioEndToEndTest::OnAudioStreamsCreated(
-    AudioSendStream* send_stream,
-    const std::vector<AudioReceiveStream*>& receive_streams) {
-  ASSERT_NE(nullptr, send_stream);
-  ASSERT_EQ(1u, receive_streams.size());
-  ASSERT_NE(nullptr, receive_streams[0]);
-  send_stream_ = send_stream;
-  receive_stream_ = receive_streams[0];
-}
-
-void AudioEndToEndTest::PerformTest() {
-  // Wait until the input audio file is done...
-  send_audio_device_->WaitForRecordingEnd();
-  // and some extra time to account for network delay.
-  SleepMs(GetNetworkPipeConfig().queue_delay_ms + kExtraRecordTimeMs);
-}
-}  // namespace test
-}  // namespace webrtc
diff --git a/audio/test/audio_end_to_end_test.h b/audio/test/audio_end_to_end_test.h
deleted file mode 100644
index d14b7a1..0000000
--- a/audio/test/audio_end_to_end_test.h
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- *  Copyright (c) 2017 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_AUDIO_TEST_AUDIO_END_TO_END_TEST_H_
-#define WEBRTC_AUDIO_TEST_AUDIO_END_TO_END_TEST_H_
-
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "webrtc/test/call_test.h"
-
-namespace webrtc {
-namespace test {
-
-class AudioEndToEndTest : public test::EndToEndTest {
- public:
-  AudioEndToEndTest();
-
- protected:
-  test::FakeAudioDevice* send_audio_device() { return send_audio_device_; }
-  const AudioSendStream* send_stream() const { return send_stream_; }
-  const AudioReceiveStream* receive_stream() const { return receive_stream_; }
-
-  virtual FakeNetworkPipe::Config GetNetworkPipeConfig() const;
-
-  size_t GetNumVideoStreams() const override;
-  size_t GetNumAudioStreams() const override;
-  size_t GetNumFlexfecStreams() const override;
-
-  std::unique_ptr<test::FakeAudioDevice::Capturer> CreateCapturer() override;
-  std::unique_ptr<test::FakeAudioDevice::Renderer> CreateRenderer() override;
-
-  void OnFakeAudioDevicesCreated(
-      test::FakeAudioDevice* send_audio_device,
-      test::FakeAudioDevice* recv_audio_device) override;
-
-  test::PacketTransport* CreateSendTransport(
-      SingleThreadedTaskQueueForTesting* task_queue,
-      Call* sender_call) override;
-  test::PacketTransport* CreateReceiveTransport(
-      SingleThreadedTaskQueueForTesting* task_queue) override;
-
-  void ModifyAudioConfigs(
-      AudioSendStream::Config* send_config,
-      std::vector<AudioReceiveStream::Config>* receive_configs) override;
-  void OnAudioStreamsCreated(
-      AudioSendStream* send_stream,
-      const std::vector<AudioReceiveStream*>& receive_streams) override;
-
-  void PerformTest() override;
-
- private:
-  test::FakeAudioDevice* send_audio_device_ = nullptr;
-  AudioSendStream* send_stream_ = nullptr;
-  AudioReceiveStream* receive_stream_ = nullptr;
-};
-
-}  // namespace test
-}  // namespace webrtc
-
-#endif  // WEBRTC_AUDIO_TEST_AUDIO_END_TO_END_TEST_H_
diff --git a/audio/test/audio_stats_test.cc b/audio/test/audio_stats_test.cc
deleted file mode 100644
index 57dfbed..0000000
--- a/audio/test/audio_stats_test.cc
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- *  Copyright (c) 2017 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/audio/test/audio_end_to_end_test.h"
-#include "webrtc/rtc_base/safe_compare.h"
-#include "webrtc/system_wrappers/include/sleep.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-namespace test {
-namespace {
-
-bool IsNear(int reference, int v) {
-  // Margin is 10%.
-  const int error = reference / 10 + 1;
-  return std::abs(reference - v) <= error;
-}
-
-class NoLossTest : public AudioEndToEndTest {
- public:
-  const int kTestDurationMs = 8000;
-  const int kBytesSent = 69351;
-  const int32_t kPacketsSent = 400;
-  const int64_t kRttMs = 100;
-
-  NoLossTest() = default;
-
-  FakeNetworkPipe::Config GetNetworkPipeConfig() const override {
-    FakeNetworkPipe::Config pipe_config;
-    pipe_config.queue_delay_ms = kRttMs / 2;
-    return pipe_config;
-  }
-
-  void PerformTest() override {
-    SleepMs(kTestDurationMs);
-    send_audio_device()->StopRecording();
-    AudioEndToEndTest::PerformTest();
-  }
-
-  void OnStreamsStopped() override {
-    AudioSendStream::Stats send_stats = send_stream()->GetStats();
-    EXPECT_PRED2(IsNear, kBytesSent, send_stats.bytes_sent);
-    EXPECT_PRED2(IsNear, kPacketsSent, send_stats.packets_sent);
-    EXPECT_EQ(0, send_stats.packets_lost);
-    EXPECT_EQ(0.0f, send_stats.fraction_lost);
-    EXPECT_EQ("opus", send_stats.codec_name);
-    // send_stats.jitter_ms
-    EXPECT_PRED2(IsNear, kRttMs, send_stats.rtt_ms);
-    // Send level is 0 because it is cleared in TransmitMixer::StopSend().
-    EXPECT_EQ(0, send_stats.audio_level);
-    // send_stats.total_input_energy
-    // send_stats.total_input_duration
-    EXPECT_EQ(-1.0f, send_stats.aec_quality_min);
-    EXPECT_EQ(-1, send_stats.echo_delay_median_ms);
-    EXPECT_EQ(-1, send_stats.echo_delay_std_ms);
-    EXPECT_EQ(-100, send_stats.echo_return_loss);
-    EXPECT_EQ(-100, send_stats.echo_return_loss_enhancement);
-    EXPECT_EQ(0.0f, send_stats.residual_echo_likelihood);
-    EXPECT_EQ(0.0f, send_stats.residual_echo_likelihood_recent_max);
-    EXPECT_EQ(false, send_stats.typing_noise_detected);
-
-    AudioReceiveStream::Stats recv_stats = receive_stream()->GetStats();
-    EXPECT_PRED2(IsNear, kBytesSent, recv_stats.bytes_rcvd);
-    EXPECT_PRED2(IsNear, kPacketsSent, recv_stats.packets_rcvd);
-    EXPECT_EQ(0u, recv_stats.packets_lost);
-    EXPECT_EQ(0.0f, recv_stats.fraction_lost);
-    EXPECT_EQ("opus", send_stats.codec_name);
-    // recv_stats.jitter_ms
-    // recv_stats.jitter_buffer_ms
-    EXPECT_EQ(20u, recv_stats.jitter_buffer_preferred_ms);
-    // recv_stats.delay_estimate_ms
-    // Receive level is 0 because it is cleared in Channel::StopPlayout().
-    EXPECT_EQ(0, recv_stats.audio_level);
-    // recv_stats.total_output_energy
-    // recv_stats.total_samples_received
-    // recv_stats.total_output_duration
-    // recv_stats.concealed_samples
-    // recv_stats.expand_rate
-    // recv_stats.speech_expand_rate
-    EXPECT_EQ(0.0, recv_stats.secondary_decoded_rate);
-    EXPECT_EQ(0.0, recv_stats.secondary_discarded_rate);
-    EXPECT_EQ(0.0, recv_stats.accelerate_rate);
-    EXPECT_EQ(0.0, recv_stats.preemptive_expand_rate);
-    EXPECT_EQ(0, recv_stats.decoding_calls_to_silence_generator);
-    // recv_stats.decoding_calls_to_neteq
-    // recv_stats.decoding_normal
-    // recv_stats.decoding_plc
-    EXPECT_EQ(0, recv_stats.decoding_cng);
-    // recv_stats.decoding_plc_cng
-    // recv_stats.decoding_muted_output
-    // Capture start time is -1 because we do not have an associated send stream
-    // on the receiver side.
-    EXPECT_EQ(-1, recv_stats.capture_start_ntp_time_ms);
-
-    // Match these stats between caller and receiver.
-    EXPECT_EQ(send_stats.local_ssrc, recv_stats.remote_ssrc);
-    EXPECT_EQ(*send_stats.codec_payload_type, *recv_stats.codec_payload_type);
-    EXPECT_TRUE(rtc::SafeEq(send_stats.ext_seqnum, recv_stats.ext_seqnum));
-  }
-};
-}  // namespace
-
-using AudioStatsTest = CallTest;
-
-TEST_F(AudioStatsTest, NoLoss) {
-  NoLossTest test;
-  RunBaseTest(&test);
-}
-
-}  // namespace test
-}  // namespace webrtc
diff --git a/audio/test/low_bandwidth_audio_test.cc b/audio/test/low_bandwidth_audio_test.cc
deleted file mode 100644
index 8bbadfb..0000000
--- a/audio/test/low_bandwidth_audio_test.cc
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- *  Copyright (c) 2017 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/audio/test/audio_end_to_end_test.h"
-#include "webrtc/rtc_base/flags.h"
-#include "webrtc/system_wrappers/include/sleep.h"
-#include "webrtc/test/testsupport/fileutils.h"
-
-DEFINE_int(sample_rate_hz, 16000,
-           "Sample rate (Hz) of the produced audio files.");
-
-DEFINE_bool(quick, false,
-            "Don't do the full audio recording. "
-            "Used to quickly check that the test runs without crashing.");
-
-namespace webrtc {
-namespace test {
-namespace {
-
-std::string FileSampleRateSuffix() {
-  return std::to_string(FLAG_sample_rate_hz / 1000);
-}
-
-class AudioQualityTest : public AudioEndToEndTest {
- public:
-  AudioQualityTest() = default;
-
- private:
-  std::string AudioInputFile() const {
-    return test::ResourcePath(
-        "voice_engine/audio_tiny" + FileSampleRateSuffix(), "wav");
-  }
-
-  std::string AudioOutputFile() const {
-    const ::testing::TestInfo* const test_info =
-        ::testing::UnitTest::GetInstance()->current_test_info();
-    return webrtc::test::OutputPath() + "LowBandwidth_" + test_info->name() +
-        "_" + FileSampleRateSuffix() + ".wav";
-  }
-
-  std::unique_ptr<test::FakeAudioDevice::Capturer> CreateCapturer() override {
-    return test::FakeAudioDevice::CreateWavFileReader(AudioInputFile());
-  }
-
-  std::unique_ptr<test::FakeAudioDevice::Renderer> CreateRenderer() override {
-    return test::FakeAudioDevice::CreateBoundedWavFileWriter(
-        AudioOutputFile(), FLAG_sample_rate_hz);
-  }
-
-  void PerformTest() override {
-    if (FLAG_quick) {
-      // Let the recording run for a small amount of time to check if it works.
-      SleepMs(1000);
-    } else {
-      AudioEndToEndTest::PerformTest();
-    }
-  }
-
-  void OnStreamsStopped() override {
-    const ::testing::TestInfo* const test_info =
-        ::testing::UnitTest::GetInstance()->current_test_info();
-
-    // Output information about the input and output audio files so that further
-    // processing can be done by an external process.
-    printf("TEST %s %s %s\n", test_info->name(),
-           AudioInputFile().c_str(), AudioOutputFile().c_str());
-  }
-};
-
-class Mobile2GNetworkTest : public AudioQualityTest {
-  void ModifyAudioConfigs(AudioSendStream::Config* send_config,
-      std::vector<AudioReceiveStream::Config>* receive_configs) override {
-    send_config->send_codec_spec =
-        rtc::Optional<AudioSendStream::Config::SendCodecSpec>(
-            {test::CallTest::kAudioSendPayloadType,
-             {"OPUS",
-              48000,
-              2,
-              {{"maxaveragebitrate", "6000"},
-               {"ptime", "60"},
-               {"stereo", "1"}}}});
-  }
-
-  FakeNetworkPipe::Config GetNetworkPipeConfig() const override {
-    FakeNetworkPipe::Config pipe_config;
-    pipe_config.link_capacity_kbps = 12;
-    pipe_config.queue_length_packets = 1500;
-    pipe_config.queue_delay_ms = 400;
-    return pipe_config;
-  }
-};
-}  // namespace
-
-using LowBandwidthAudioTest = CallTest;
-
-TEST_F(LowBandwidthAudioTest, GoodNetworkHighBitrate) {
-  AudioQualityTest test;
-  RunBaseTest(&test);
-}
-
-TEST_F(LowBandwidthAudioTest, Mobile2GNetwork) {
-  Mobile2GNetworkTest test;
-  RunBaseTest(&test);
-}
-}  // namespace test
-}  // namespace webrtc
diff --git a/audio/test/low_bandwidth_audio_test.py b/audio/test/low_bandwidth_audio_test.py
deleted file mode 100755
index abe9da9..0000000
--- a/audio/test/low_bandwidth_audio_test.py
+++ /dev/null
@@ -1,232 +0,0 @@
-#!/usr/bin/env python
-# Copyright (c) 2017 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.
-
-"""
-This script is the wrapper that runs the low-bandwidth audio test.
-
-After running the test, post-process steps for calculating audio quality of the
-output files will be performed.
-"""
-
-import argparse
-import collections
-import logging
-import os
-import re
-import shutil
-import subprocess
-import sys
-
-
-SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
-SRC_DIR = os.path.normpath(os.path.join(SCRIPT_DIR, os.pardir, os.pardir,
-                                        os.pardir))
-
-
-def _LogCommand(command):
-  logging.info('Running %r', command)
-  return command
-
-
-def _ParseArgs():
-  parser = argparse.ArgumentParser(description='Run low-bandwidth audio tests.')
-  parser.add_argument('build_dir',
-      help='Path to the build directory (e.g. out/Release).')
-  parser.add_argument('--remove', action='store_true',
-      help='Remove output audio files after testing.')
-  parser.add_argument('--android', action='store_true',
-      help='Perform the test on a connected Android device instead.')
-  parser.add_argument('--adb-path', help='Path to adb binary.', default='adb')
-  args = parser.parse_args()
-  return args
-
-
-def _GetPlatform():
-  if sys.platform == 'win32':
-    return 'win'
-  elif sys.platform == 'darwin':
-    return 'mac'
-  elif sys.platform.startswith('linux'):
-    return 'linux'
-
-
-def _DownloadTools():
-  tools_dir = os.path.join(SRC_DIR, 'tools_webrtc')
-  toolchain_dir = os.path.join(tools_dir, 'audio_quality')
-
-  # Download PESQ and POLQA.
-  download_script = os.path.join(tools_dir, 'download_tools.py')
-  command = [sys.executable, download_script, toolchain_dir]
-  subprocess.check_call(_LogCommand(command))
-
-  pesq_path = os.path.join(toolchain_dir, _GetPlatform(), 'pesq')
-  polqa_path = os.path.join(toolchain_dir, _GetPlatform(), 'PolqaOem64')
-  return pesq_path, polqa_path
-
-
-def ExtractTestRuns(lines, echo=False):
-  """Extracts information about tests from the output of a test runner.
-
-  Produces tuples (android_device, test_name, reference_file, degraded_file).
-  """
-  for line in lines:
-    if echo:
-      sys.stdout.write(line)
-
-    # Output from Android has a prefix with the device name.
-    android_prefix_re = r'(?:I\b.+\brun_tests_on_device\((.+?)\)\s*)?'
-    test_re = r'^' + android_prefix_re + r'TEST (\w+) ([^ ]+?) ([^ ]+?)\s*$'
-
-    match = re.search(test_re, line)
-    if match:
-      yield match.groups()
-
-
-def _GetFile(file_path, out_dir, move=False,
-             android=False, adb_prefix=('adb',)):
-  out_file_name = os.path.basename(file_path)
-  out_file_path = os.path.join(out_dir, out_file_name)
-
-  if android:
-    # Pull the file from the connected Android device.
-    adb_command = adb_prefix + ('pull', file_path, out_dir)
-    subprocess.check_call(_LogCommand(adb_command))
-    if move:
-      # Remove that file.
-      adb_command = adb_prefix + ('shell', 'rm', file_path)
-      subprocess.check_call(_LogCommand(adb_command))
-  elif os.path.abspath(file_path) != os.path.abspath(out_file_path):
-    if move:
-      shutil.move(file_path, out_file_path)
-    else:
-      shutil.copy(file_path, out_file_path)
-
-  return out_file_path
-
-
-def _RunPesq(executable_path, reference_file, degraded_file,
-             sample_rate_hz=16000):
-  directory = os.path.dirname(reference_file)
-  assert os.path.dirname(degraded_file) == directory
-
-  # Analyze audio.
-  command = [executable_path, '+%d' % sample_rate_hz,
-             os.path.basename(reference_file),
-             os.path.basename(degraded_file)]
-  # Need to provide paths in the current directory due to a bug in PESQ:
-  # On Mac, for some 'path/to/file.wav', if 'file.wav' is longer than
-  # 'path/to', PESQ crashes.
-  out = subprocess.check_output(_LogCommand(command),
-                                cwd=directory, stderr=subprocess.STDOUT)
-
-  # Find the scores in stdout of PESQ.
-  match = re.search(
-      r'Prediction \(Raw MOS, MOS-LQO\):\s+=\s+([\d.]+)\s+([\d.]+)', out)
-  if match:
-    raw_mos, _ = match.groups()
-
-    return {'pesq_mos': (raw_mos, 'score')}
-  else:
-    logging.error('PESQ: %s', out.splitlines()[-1])
-    return {}
-
-
-def _RunPolqa(executable_path, reference_file, degraded_file):
-  # Analyze audio.
-  command = [executable_path, '-q', '-LC', 'NB',
-             '-Ref', reference_file, '-Test', degraded_file]
-  try:
-    process = subprocess.Popen(_LogCommand(command),
-                               stdout=subprocess.PIPE, stderr=subprocess.PIPE)
-  except OSError as e:
-    if e.errno == os.errno.ENOENT:
-      logging.warning('POLQA executable missing, skipping test.')
-      return {}
-    else:
-      raise
-  out, err = process.communicate()
-
-  # Find the scores in stdout of POLQA.
-  match = re.search(r'\bMOS-LQO:\s+([\d.]+)', out)
-
-  if process.returncode != 0 or not match:
-    if process.returncode == 2:
-      logging.warning('%s (2)', err.strip())
-      logging.warning('POLQA license error, skipping test.')
-    else:
-      logging.error('%s (%d)', err.strip(), process.returncode)
-    return {}
-
-  mos_lqo, = match.groups()
-  return {'polqa_mos_lqo': (mos_lqo, 'score')}
-
-
-Analyzer = collections.namedtuple('Analyzer', ['func', 'executable',
-                                               'sample_rate_hz'])
-
-
-def main():
-  # pylint: disable=W0101
-  logging.basicConfig(level=logging.INFO)
-
-  args = _ParseArgs()
-
-  pesq_path, polqa_path = _DownloadTools()
-
-  out_dir = os.path.join(args.build_dir, '..')
-  if args.android:
-    test_command = [os.path.join(args.build_dir, 'bin',
-                                 'run_low_bandwidth_audio_test'), '-v']
-  else:
-    test_command = [os.path.join(args.build_dir, 'low_bandwidth_audio_test')]
-
-  analyzers = [Analyzer(_RunPesq, pesq_path, 16000)]
-  # Check if POLQA can run at all, or skip the 48 kHz tests entirely.
-  example_path = os.path.join(SRC_DIR, 'resources',
-                              'voice_engine', 'audio_tiny48.wav')
-  if _RunPolqa(polqa_path, example_path, example_path):
-    analyzers.append(Analyzer(_RunPolqa, polqa_path, 48000))
-
-  for analyzer in analyzers:
-    # Start the test executable that produces audio files.
-    test_process = subprocess.Popen(
-        _LogCommand(test_command + ['--sample_rate_hz=%d' %
-                                    analyzer.sample_rate_hz]),
-        stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
-    try:
-      lines = iter(test_process.stdout.readline, '')
-      for result in ExtractTestRuns(lines, echo=True):
-        (android_device, test_name, reference_file, degraded_file) = result
-
-        adb_prefix = (args.adb_path,)
-        if android_device:
-          adb_prefix += ('-s', android_device)
-
-        reference_file = _GetFile(reference_file, out_dir,
-                                  android=args.android, adb_prefix=adb_prefix)
-        degraded_file = _GetFile(degraded_file, out_dir, move=True,
-                                 android=args.android, adb_prefix=adb_prefix)
-
-        analyzer_results = analyzer.func(analyzer.executable,
-                                         reference_file, degraded_file)
-        for metric, (value, units) in analyzer_results.items():
-          # Output a result for the perf dashboard.
-          print 'RESULT %s: %s= %s %s' % (metric, test_name, value, units)
-
-        if args.remove:
-          os.remove(reference_file)
-          os.remove(degraded_file)
-    finally:
-      test_process.terminate()
-
-  return test_process.wait()
-
-
-if __name__ == '__main__':
-  sys.exit(main())
diff --git a/audio/test/unittests/low_bandwidth_audio_test_test.py b/audio/test/unittests/low_bandwidth_audio_test_test.py
deleted file mode 100755
index 18c1eb1..0000000
--- a/audio/test/unittests/low_bandwidth_audio_test_test.py
+++ /dev/null
@@ -1,184 +0,0 @@
-#!/usr/bin/env python
-# Copyright (c) 2017 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.
-
-import os
-import unittest
-import sys
-
-
-SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
-PARENT_DIR = os.path.join(SCRIPT_DIR, os.pardir)
-sys.path.append(PARENT_DIR)
-import low_bandwidth_audio_test
-
-
-class TestExtractTestRuns(unittest.TestCase):
-  def _TestLog(self, log, *expected):
-    self.assertEqual(
-        tuple(low_bandwidth_audio_test.ExtractTestRuns(log.splitlines(True))),
-        expected)
-
-  def testLinux(self):
-    self._TestLog(LINUX_LOG,
-        (None, 'GoodNetworkHighBitrate',
-         '/webrtc/src/resources/voice_engine/audio_tiny16.wav',
-         '/webrtc/src/out/LowBandwidth_GoodNetworkHighBitrate.wav'),
-        (None, 'Mobile2GNetwork',
-         '/webrtc/src/resources/voice_engine/audio_tiny16.wav',
-         '/webrtc/src/out/LowBandwidth_Mobile2GNetwork.wav'))
-
-  def testAndroid(self):
-    self._TestLog(ANDROID_LOG,
-        ('ddfa6149', 'Mobile2GNetwork',
-         '/sdcard/chromium_tests_root/resources/voice_engine/audio_tiny16.wav',
-         '/sdcard/chromium_tests_root/LowBandwidth_Mobile2GNetwork.wav'),
-        ('TA99205CNO', 'GoodNetworkHighBitrate',
-         '/sdcard/chromium_tests_root/resources/voice_engine/audio_tiny16.wav',
-         '/sdcard/chromium_tests_root/LowBandwidth_GoodNetworkHighBitrate.wav'))
-
-
-LINUX_LOG = r'''\
-[==========] Running 2 tests from 1 test case.
-[----------] Global test environment set-up.
-[----------] 2 tests from LowBandwidthAudioTest
-[ RUN      ] LowBandwidthAudioTest.GoodNetworkHighBitrate
-TEST GoodNetworkHighBitrate /webrtc/src/resources/voice_engine/audio_tiny16.wav /webrtc/src/out/LowBandwidth_GoodNetworkHighBitrate.wav
-[       OK ] LowBandwidthAudioTest.GoodNetworkHighBitrate (5932 ms)
-[ RUN      ] LowBandwidthAudioTest.Mobile2GNetwork
-TEST Mobile2GNetwork /webrtc/src/resources/voice_engine/audio_tiny16.wav /webrtc/src/out/LowBandwidth_Mobile2GNetwork.wav
-[       OK ] LowBandwidthAudioTest.Mobile2GNetwork (6333 ms)
-[----------] 2 tests from LowBandwidthAudioTest (12265 ms total)
-
-[----------] Global test environment tear-down
-[==========] 2 tests from 1 test case ran. (12266 ms total)
-[  PASSED  ] 2 tests.
-'''
-
-ANDROID_LOG = r'''\
-I    0.000s Main  command: /webrtc/src/build/android/test_runner.py gtest --suite low_bandwidth_audio_test --output-directory /webrtc/src/out/debug-android --runtime-deps-path /webrtc/src/out/debug-android/gen.runtime/webrtc/audio/low_bandwidth_audio_test__test_runner_script.runtime_deps -v
-I    0.007s Main  [host]> /webrtc/src/third_party/android_tools/sdk/build-tools/24.0.2/aapt dump xmltree /webrtc/src/out/debug-android/low_bandwidth_audio_test_apk/low_bandwidth_audio_test-debug.apk AndroidManifest.xml
-I    0.028s TimeoutThread-1-for-MainThread  [host]> /webrtc/src/third_party/android_tools/sdk/platform-tools/adb devices
-I    0.062s TimeoutThread-1-for-prepare_device(TA99205CNO)  [host]> /webrtc/src/third_party/android_tools/sdk/platform-tools/adb -s TA99205CNO wait-for-device
-I    0.063s TimeoutThread-1-for-prepare_device(ddfa6149)  [host]> /webrtc/src/third_party/android_tools/sdk/platform-tools/adb -s ddfa6149 wait-for-device
-I    0.102s TimeoutThread-1-for-prepare_device(TA99205CNO)  [host]> /webrtc/src/third_party/android_tools/sdk/platform-tools/adb -s TA99205CNO shell '( ( c=/data/local/tmp/cache_token;echo $EXTERNAL_STORAGE;cat $c 2>/dev/null||echo;echo "77611072-160c-11d7-9362-705b0f464195">$c &&getprop )>/data/local/tmp/temp_file-5ea34389e3f92 );echo %$?'
-I    0.105s TimeoutThread-1-for-prepare_device(ddfa6149)  [host]> /webrtc/src/third_party/android_tools/sdk/platform-tools/adb -s ddfa6149 shell '( ( c=/data/local/tmp/cache_token;echo $EXTERNAL_STORAGE;cat $c 2>/dev/null||echo;echo "77618afc-160c-11d7-bda4-705b0f464195">$c &&getprop )>/data/local/tmp/temp_file-b995cef6e0e3d );echo %$?'
-I    0.204s TimeoutThread-1-for-prepare_device(ddfa6149)  [host]> /webrtc/src/third_party/android_tools/sdk/platform-tools/adb -s ddfa6149 pull /data/local/tmp/temp_file-b995cef6e0e3d /tmp/tmpieAgDj/tmp_ReadFileWithPull
-I    0.285s TimeoutThread-1-for-prepare_device(ddfa6149)  [host]> /webrtc/src/third_party/android_tools/sdk/platform-tools/adb -s ddfa6149 shell '( test -d /storage/emulated/legacy );echo %$?'
-I    0.285s TimeoutThread-1-for-delete_temporary_file(ddfa6149)  [host]> /webrtc/src/third_party/android_tools/sdk/platform-tools/adb -s ddfa6149 shell 'rm -f /data/local/tmp/temp_file-b995cef6e0e3d'
-I    0.302s TimeoutThread-1-for-prepare_device(TA99205CNO)  [host]> /webrtc/src/third_party/android_tools/sdk/platform-tools/adb -s TA99205CNO pull /data/local/tmp/temp_file-5ea34389e3f92 /tmp/tmpvlyG3I/tmp_ReadFileWithPull
-I    0.352s TimeoutThread-1-for-prepare_device(ddfa6149)  condition 'sd_card_ready' met (0.3s)
-I    0.353s TimeoutThread-1-for-prepare_device(ddfa6149)  [host]> /webrtc/src/third_party/android_tools/sdk/platform-tools/adb -s ddfa6149 shell '( pm path android );echo %$?'
-I    0.369s TimeoutThread-1-for-prepare_device(TA99205CNO)  [host]> /webrtc/src/third_party/android_tools/sdk/platform-tools/adb -s TA99205CNO shell '( test -d /sdcard );echo %$?'
-I    0.370s TimeoutThread-1-for-delete_temporary_file(TA99205CNO)  [host]> /webrtc/src/third_party/android_tools/sdk/platform-tools/adb -s TA99205CNO shell 'rm -f /data/local/tmp/temp_file-5ea34389e3f92'
-I    0.434s TimeoutThread-1-for-prepare_device(TA99205CNO)  condition 'sd_card_ready' met (0.4s)
-I    0.434s TimeoutThread-1-for-prepare_device(TA99205CNO)  [host]> /webrtc/src/third_party/android_tools/sdk/platform-tools/adb -s TA99205CNO shell '( pm path android );echo %$?'
-I    1.067s TimeoutThread-1-for-prepare_device(ddfa6149)  condition 'pm_ready' met (1.0s)
-I    1.067s TimeoutThread-1-for-prepare_device(ddfa6149)  [host]> /webrtc/src/third_party/android_tools/sdk/platform-tools/adb -s ddfa6149 shell '( getprop sys.boot_completed );echo %$?'
-I    1.115s TimeoutThread-1-for-prepare_device(ddfa6149)  condition 'boot_completed' met (1.1s)
-I    1.181s TimeoutThread-1-for-prepare_device(TA99205CNO)  condition 'pm_ready' met (1.1s)
-I    1.181s TimeoutThread-1-for-prepare_device(TA99205CNO)  [host]> /webrtc/src/third_party/android_tools/sdk/platform-tools/adb -s TA99205CNO shell '( getprop sys.boot_completed );echo %$?'
-I    1.242s TimeoutThread-1-for-prepare_device(TA99205CNO)  condition 'boot_completed' met (1.2s)
-I    1.268s TimeoutThread-1-for-individual_device_set_up(TA99205CNO)  [host]> /webrtc/src/third_party/android_tools/sdk/platform-tools/adb -s TA99205CNO shell '( pm path org.chromium.native_test );echo %$?'
-I    1.269s TimeoutThread-1-for-individual_device_set_up(ddfa6149)  [host]> /webrtc/src/third_party/android_tools/sdk/platform-tools/adb -s ddfa6149 shell '( pm path org.chromium.native_test );echo %$?'
-I    2.008s calculate_device_checksums  [host]> /webrtc/src/third_party/android_tools/sdk/platform-tools/adb -s ddfa6149 shell '( a=/data/local/tmp/md5sum/md5sum_bin;! [[ $(ls -l $a) = *1225256* ]]&&exit 2;export LD_LIBRARY_PATH=/data/local/tmp/md5sum;$a /data/app/org.chromium.native_test-2/base.apk;: );echo %$?'
-I    2.008s calculate_host_checksums  [host]> /webrtc/src/out/debug-android/md5sum_bin_host /webrtc/src/out/debug-android/low_bandwidth_audio_test_apk/low_bandwidth_audio_test-debug.apk
-I    2.019s calculate_device_checksums  [host]> /webrtc/src/third_party/android_tools/sdk/platform-tools/adb -s TA99205CNO shell '( a=/data/local/tmp/md5sum/md5sum_bin;! [[ $(ls -l $a) = *1225256* ]]&&exit 2;export LD_LIBRARY_PATH=/data/local/tmp/md5sum;$a /data/app/org.chromium.native_test-1/base.apk;: );echo %$?'
-I    2.020s calculate_host_checksums  [host]> /webrtc/src/out/debug-android/md5sum_bin_host /webrtc/src/out/debug-android/low_bandwidth_audio_test_apk/low_bandwidth_audio_test-debug.apk
-I    2.172s TimeoutThread-1-for-individual_device_set_up(ddfa6149)  [host]> /webrtc/src/third_party/android_tools/sdk/platform-tools/adb -s ddfa6149 shell '( p=org.chromium.native_test;if [[ "$(ps)" = *$p* ]]; then am force-stop $p; fi );echo %$?'
-I    2.183s TimeoutThread-1-for-individual_device_set_up(TA99205CNO)  [host]> /webrtc/src/third_party/android_tools/sdk/platform-tools/adb -s TA99205CNO shell '( p=org.chromium.native_test;if [[ "$(ps)" = *$p* ]]; then am force-stop $p; fi );echo %$?'
-I    2.290s calculate_device_checksums  [host]> /webrtc/src/third_party/android_tools/sdk/platform-tools/adb -s TA99205CNO shell '( a=/data/local/tmp/md5sum/md5sum_bin;! [[ $(ls -l $a) = *1225256* ]]&&exit 2;export LD_LIBRARY_PATH=/data/local/tmp/md5sum;$a /sdcard/chromium_tests_root/resources/voice_engine/audio_tiny16.wav;: );echo %$?'
-I    2.291s calculate_host_checksums  [host]> /webrtc/src/out/debug-android/md5sum_bin_host /webrtc/src/resources/voice_engine/audio_tiny16.wav
-I    2.373s calculate_device_checksums  [host]> /webrtc/src/third_party/android_tools/sdk/platform-tools/adb -s ddfa6149 shell '( a=/data/local/tmp/md5sum/md5sum_bin;! [[ $(ls -l $a) = *1225256* ]]&&exit 2;export LD_LIBRARY_PATH=/data/local/tmp/md5sum;$a /storage/emulated/legacy/chromium_tests_root/resources/voice_engine/audio_tiny16.wav;: );echo %$?'
-I    2.374s calculate_host_checksums  [host]> /webrtc/src/out/debug-android/md5sum_bin_host /webrtc/src/resources/voice_engine/audio_tiny16.wav
-I    2.390s calculate_device_checksums  [host]> /webrtc/src/third_party/android_tools/sdk/platform-tools/adb -s TA99205CNO shell '( a=/data/local/tmp/md5sum/md5sum_bin;! [[ $(ls -l $a) = *1225256* ]]&&exit 2;export LD_LIBRARY_PATH=/data/local/tmp/md5sum;$a /sdcard/chromium_tests_root/icudtl.dat;: );echo %$?'
-I    2.390s calculate_host_checksums  [host]> /webrtc/src/out/debug-android/md5sum_bin_host /webrtc/src/out/debug-android/icudtl.dat
-I    2.472s calculate_device_checksums  [host]> /webrtc/src/third_party/android_tools/sdk/platform-tools/adb -s ddfa6149 shell '( a=/data/local/tmp/md5sum/md5sum_bin;! [[ $(ls -l $a) = *1225256* ]]&&exit 2;export LD_LIBRARY_PATH=/data/local/tmp/md5sum;$a /storage/emulated/legacy/chromium_tests_root/icudtl.dat;: );echo %$?'
-I    2.472s calculate_host_checksums  [host]> /webrtc/src/out/debug-android/md5sum_bin_host /webrtc/src/out/debug-android/icudtl.dat
-I    2.675s TimeoutThread-1-for-list_tests(TA99205CNO)  [host]> /webrtc/src/third_party/android_tools/sdk/platform-tools/adb -s TA99205CNO shell '( ( p=org.chromium.native_test;am instrument -w -e "$p".NativeTestInstrumentationTestRunner.ShardNanoTimeout 30000000000 -e "$p".NativeTestInstrumentationTestRunner.NativeTestActivity "$p".NativeUnitTestActivity -e "$p".NativeTestInstrumentationTestRunner.StdoutFile /sdcard/temp_file-6407c967884af.gtest_out -e "$p".NativeTest.CommandLineFlags --gtest_list_tests "$p"/"$p".NativeTestInstrumentationTestRunner )>/data/local/tmp/temp_file-d21ebcd0977d9 );echo %$?'
-I    2.675s TimeoutThread-1-for-list_tests(ddfa6149)  [host]> /webrtc/src/third_party/android_tools/sdk/platform-tools/adb -s ddfa6149 shell '( ( p=org.chromium.native_test;am instrument -w -e "$p".NativeTestInstrumentationTestRunner.ShardNanoTimeout 30000000000 -e "$p".NativeTestInstrumentationTestRunner.NativeTestActivity "$p".NativeUnitTestActivity -e "$p".NativeTestInstrumentationTestRunner.StdoutFile /storage/emulated/legacy/temp_file-fa09560c3259.gtest_out -e "$p".NativeTest.CommandLineFlags --gtest_list_tests "$p"/"$p".NativeTestInstrumentationTestRunner )>/data/local/tmp/temp_file-95ad995999939 );echo %$?'
-I    3.739s TimeoutThread-1-for-list_tests(ddfa6149)  [host]> /webrtc/src/third_party/android_tools/sdk/platform-tools/adb -s ddfa6149 pull /data/local/tmp/temp_file-95ad995999939 /tmp/tmpSnnF6Y/tmp_ReadFileWithPull
-I    3.807s TimeoutThread-1-for-delete_temporary_file(ddfa6149)  [host]> /webrtc/src/third_party/android_tools/sdk/platform-tools/adb -s ddfa6149 shell 'rm -f /data/local/tmp/temp_file-95ad995999939'
-I    3.812s TimeoutThread-1-for-list_tests(ddfa6149)  [host]> /webrtc/src/third_party/android_tools/sdk/platform-tools/adb -s ddfa6149 shell '( TZ=utc ls -a -l /storage/emulated/legacy/ );echo %$?'
-I    3.866s TimeoutThread-1-for-list_tests(ddfa6149)  [host]> /webrtc/src/third_party/android_tools/sdk/platform-tools/adb -s ddfa6149 shell '( cat /storage/emulated/legacy/temp_file-fa09560c3259.gtest_out );echo %$?'
-I    3.912s TimeoutThread-1-for-delete_temporary_file(ddfa6149)  [host]> /webrtc/src/third_party/android_tools/sdk/platform-tools/adb -s ddfa6149 shell 'rm -f /storage/emulated/legacy/temp_file-fa09560c3259.gtest_out'
-I    4.256s TimeoutThread-1-for-list_tests(TA99205CNO)  [host]> /webrtc/src/third_party/android_tools/sdk/platform-tools/adb -s TA99205CNO pull /data/local/tmp/temp_file-d21ebcd0977d9 /tmp/tmpokPF5b/tmp_ReadFileWithPull
-I    4.324s TimeoutThread-1-for-delete_temporary_file(TA99205CNO)  [host]> /webrtc/src/third_party/android_tools/sdk/platform-tools/adb -s TA99205CNO shell 'rm -f /data/local/tmp/temp_file-d21ebcd0977d9'
-I    4.342s TimeoutThread-1-for-list_tests(TA99205CNO)  [host]> /webrtc/src/third_party/android_tools/sdk/platform-tools/adb -s TA99205CNO shell '( TZ=utc ls -a -l /sdcard/ );echo %$?'
-I    4.432s TimeoutThread-1-for-list_tests(TA99205CNO)  [host]> /webrtc/src/third_party/android_tools/sdk/platform-tools/adb -s TA99205CNO shell '( cat /sdcard/temp_file-6407c967884af.gtest_out );echo %$?'
-I    4.476s TimeoutThread-1-for-delete_temporary_file(TA99205CNO)  [host]> /webrtc/src/third_party/android_tools/sdk/platform-tools/adb -s TA99205CNO shell 'rm -f /sdcard/temp_file-6407c967884af.gtest_out'
-I    4.483s Main  Using external sharding settings. This is shard 0/1
-I    4.483s Main  STARTING TRY #1/3
-I    4.484s Main  Will run 2 tests on 2 devices: TA99205CNO, ddfa6149
-I    4.486s TimeoutThread-1-for-run_tests_on_device(TA99205CNO)  [host]> /webrtc/src/third_party/android_tools/sdk/platform-tools/adb -s TA99205CNO shell '( pm dump org.chromium.native_test | grep dataDir=; echo "PIPESTATUS: ${PIPESTATUS[@]}" );echo %$?'
-I    4.486s TimeoutThread-1-for-run_tests_on_device(ddfa6149)  [host]> /webrtc/src/third_party/android_tools/sdk/platform-tools/adb -s ddfa6149 shell '( pm dump org.chromium.native_test | grep dataDir=; echo "PIPESTATUS: ${PIPESTATUS[@]}" );echo %$?'
-I    5.551s run_tests_on_device(TA99205CNO)  flags:
-I    5.552s run_tests_on_device(ddfa6149)  flags:
-I    5.554s TimeoutThread-1-for-run_tests_on_device(TA99205CNO)  [host]> /webrtc/src/third_party/android_tools/sdk/platform-tools/adb -s TA99205CNO shell '( ( p=org.chromium.native_test;am instrument -w -e "$p".NativeTestInstrumentationTestRunner.ShardNanoTimeout 120000000000 -e "$p".NativeTestInstrumentationTestRunner.NativeTestActivity "$p".NativeUnitTestActivity -e "$p".NativeTestInstrumentationTestRunner.Test LowBandwidthAudioTest.GoodNetworkHighBitrate -e "$p".NativeTestInstrumentationTestRunner.StdoutFile /sdcard/temp_file-ffe7b76691cb7.gtest_out "$p"/"$p".NativeTestInstrumentationTestRunner )>/data/local/tmp/temp_file-c9d83b3078ab1 );echo %$?'
-I    5.556s TimeoutThread-1-for-run_tests_on_device(ddfa6149)  [host]> /webrtc/src/third_party/android_tools/sdk/platform-tools/adb -s ddfa6149 shell '( ( p=org.chromium.native_test;am instrument -w -e "$p".NativeTestInstrumentationTestRunner.ShardNanoTimeout 120000000000 -e "$p".NativeTestInstrumentationTestRunner.NativeTestActivity "$p".NativeUnitTestActivity -e "$p".NativeTestInstrumentationTestRunner.Test LowBandwidthAudioTest.Mobile2GNetwork -e "$p".NativeTestInstrumentationTestRunner.StdoutFile /storage/emulated/legacy/temp_file-f0ceb1a05ea8.gtest_out "$p"/"$p".NativeTestInstrumentationTestRunner )>/data/local/tmp/temp_file-245ef307a5b32 );echo %$?'
-I   12.956s TimeoutThread-1-for-run_tests_on_device(TA99205CNO)  [host]> /webrtc/src/third_party/android_tools/sdk/platform-tools/adb -s TA99205CNO pull /data/local/tmp/temp_file-c9d83b3078ab1 /tmp/tmpRQhTcM/tmp_ReadFileWithPull
-I   13.024s TimeoutThread-1-for-delete_temporary_file(TA99205CNO)  [host]> /webrtc/src/third_party/android_tools/sdk/platform-tools/adb -s TA99205CNO shell 'rm -f /data/local/tmp/temp_file-c9d83b3078ab1'
-I   13.032s TimeoutThread-1-for-run_tests_on_device(TA99205CNO)  [host]> /webrtc/src/third_party/android_tools/sdk/platform-tools/adb -s TA99205CNO shell '( TZ=utc ls -a -l /sdcard/ );echo %$?'
-I   13.114s TimeoutThread-1-for-run_tests_on_device(TA99205CNO)  [host]> /webrtc/src/third_party/android_tools/sdk/platform-tools/adb -s TA99205CNO shell '( cat /sdcard/temp_file-ffe7b76691cb7.gtest_out );echo %$?'
-I   13.154s TimeoutThread-1-for-run_tests_on_device(ddfa6149)  [host]> /webrtc/src/third_party/android_tools/sdk/platform-tools/adb -s ddfa6149 pull /data/local/tmp/temp_file-245ef307a5b32 /tmp/tmpfQ4J96/tmp_ReadFileWithPull
-I   13.167s TimeoutThread-1-for-delete_temporary_file(TA99205CNO)  [host]> /webrtc/src/third_party/android_tools/sdk/platform-tools/adb -s TA99205CNO shell 'rm -f /sdcard/temp_file-ffe7b76691cb7.gtest_out'
-I   13.169s TimeoutThread-1-for-delete_temporary_file(TA99205CNO)  [host]> /webrtc/src/third_party/android_tools/sdk/platform-tools/adb -s TA99205CNO shell 'rm -f /data/user/0/org.chromium.native_test/temp_file-f07c4808dbf8f.xml'
-I   13.170s TimeoutThread-1-for-run_tests_on_device(TA99205CNO)  [host]> /webrtc/src/third_party/android_tools/sdk/platform-tools/adb -s TA99205CNO shell '( pm clear org.chromium.native_test );echo %$?'
-I   13.234s TimeoutThread-1-for-delete_temporary_file(ddfa6149)  [host]> /webrtc/src/third_party/android_tools/sdk/platform-tools/adb -s ddfa6149 shell 'rm -f /data/local/tmp/temp_file-245ef307a5b32'
-I   13.239s TimeoutThread-1-for-run_tests_on_device(ddfa6149)  [host]> /webrtc/src/third_party/android_tools/sdk/platform-tools/adb -s ddfa6149 shell '( TZ=utc ls -a -l /storage/emulated/legacy/ );echo %$?'
-I   13.291s TimeoutThread-1-for-run_tests_on_device(ddfa6149)  [host]> /webrtc/src/third_party/android_tools/sdk/platform-tools/adb -s ddfa6149 shell '( cat /storage/emulated/legacy/temp_file-f0ceb1a05ea8.gtest_out );echo %$?'
-I   13.341s TimeoutThread-1-for-delete_temporary_file(ddfa6149)  [host]> /webrtc/src/third_party/android_tools/sdk/platform-tools/adb -s ddfa6149 shell 'rm -f /storage/emulated/legacy/temp_file-f0ceb1a05ea8.gtest_out'
-I   13.343s TimeoutThread-1-for-delete_temporary_file(ddfa6149)  [host]> /webrtc/src/third_party/android_tools/sdk/platform-tools/adb -s ddfa6149 shell 'rm -f /data/data/org.chromium.native_test/temp_file-5649bb01682da.xml'
-I   13.346s TimeoutThread-1-for-run_tests_on_device(ddfa6149)  [host]> /webrtc/src/third_party/android_tools/sdk/platform-tools/adb -s ddfa6149 shell '( pm clear org.chromium.native_test );echo %$?'
-I   13.971s TimeoutThread-1-for-run_tests_on_device(TA99205CNO)  Setting permissions for org.chromium.native_test.
-I   13.971s TimeoutThread-1-for-run_tests_on_device(TA99205CNO)  [host]> /webrtc/src/third_party/android_tools/sdk/platform-tools/adb -s TA99205CNO shell '( pm grant org.chromium.native_test android.permission.CAMERA&&pm grant org.chromium.native_test android.permission.RECORD_AUDIO&&pm grant org.chromium.native_test android.permission.WRITE_EXTERNAL_STORAGE&&pm grant org.chromium.native_test android.permission.READ_EXTERNAL_STORAGE );echo %$?'
-I   14.078s run_tests_on_device(ddfa6149)  >>ScopedMainEntryLogger
-I   14.078s run_tests_on_device(ddfa6149)  Note: Google Test filter = LowBandwidthAudioTest.Mobile2GNetwork
-I   14.078s run_tests_on_device(ddfa6149)  [==========] Running 1 test from 1 test case.
-I   14.078s run_tests_on_device(ddfa6149)  [----------] Global test environment set-up.
-I   14.078s run_tests_on_device(ddfa6149)  [----------] 1 test from LowBandwidthAudioTest
-I   14.078s run_tests_on_device(ddfa6149)  [ RUN      ] LowBandwidthAudioTest.Mobile2GNetwork
-I   14.078s run_tests_on_device(ddfa6149)  TEST Mobile2GNetwork /sdcard/chromium_tests_root/resources/voice_engine/audio_tiny16.wav /sdcard/chromium_tests_root/LowBandwidth_Mobile2GNetwork.wav
-I   14.078s run_tests_on_device(ddfa6149)  [       OK ] LowBandwidthAudioTest.Mobile2GNetwork (6438 ms)
-I   14.078s run_tests_on_device(ddfa6149)  [----------] 1 test from LowBandwidthAudioTest (6438 ms total)
-I   14.078s run_tests_on_device(ddfa6149)
-I   14.078s run_tests_on_device(ddfa6149)  [----------] Global test environment tear-down
-I   14.079s run_tests_on_device(ddfa6149)  [==========] 1 test from 1 test case ran. (6438 ms total)
-I   14.079s run_tests_on_device(ddfa6149)  [  PASSED  ] 1 test.
-I   14.079s run_tests_on_device(ddfa6149)  <<ScopedMainEntryLogger
-I   16.576s run_tests_on_device(TA99205CNO)  >>ScopedMainEntryLogger
-I   16.576s run_tests_on_device(TA99205CNO)  Note: Google Test filter = LowBandwidthAudioTest.GoodNetworkHighBitrate
-I   16.576s run_tests_on_device(TA99205CNO)  [==========] Running 1 test from 1 test case.
-I   16.576s run_tests_on_device(TA99205CNO)  [----------] Global test environment set-up.
-I   16.576s run_tests_on_device(TA99205CNO)  [----------] 1 test from LowBandwidthAudioTest
-I   16.576s run_tests_on_device(TA99205CNO)  [ RUN      ] LowBandwidthAudioTest.GoodNetworkHighBitrate
-I   16.576s run_tests_on_device(TA99205CNO)  TEST GoodNetworkHighBitrate /sdcard/chromium_tests_root/resources/voice_engine/audio_tiny16.wav /sdcard/chromium_tests_root/LowBandwidth_GoodNetworkHighBitrate.wav
-I   16.576s run_tests_on_device(TA99205CNO)  [       OK ] LowBandwidthAudioTest.GoodNetworkHighBitrate (5968 ms)
-I   16.576s run_tests_on_device(TA99205CNO)  [----------] 1 test from LowBandwidthAudioTest (5968 ms total)
-I   16.576s run_tests_on_device(TA99205CNO)
-I   16.576s run_tests_on_device(TA99205CNO)  [----------] Global test environment tear-down
-I   16.576s run_tests_on_device(TA99205CNO)  [==========] 1 test from 1 test case ran. (5968 ms total)
-I   16.577s run_tests_on_device(TA99205CNO)  [  PASSED  ] 1 test.
-I   16.577s run_tests_on_device(TA99205CNO)  <<ScopedMainEntryLogger
-I   16.577s run_tests_on_device(TA99205CNO)  Finished running tests on this device.
-I   16.577s run_tests_on_device(ddfa6149)  Finished running tests on this device.
-I   16.604s Main  FINISHED TRY #1/3
-I   16.604s Main  All tests completed.
-C   16.604s Main  ********************************************************************************
-C   16.604s Main  Summary
-C   16.604s Main  ********************************************************************************
-C   16.605s Main  [==========] 2 tests ran.
-C   16.605s Main  [  PASSED  ] 2 tests.
-C   16.605s Main  ********************************************************************************
-I   16.608s tear_down_device(ddfa6149)  Wrote device cache: /webrtc/src/out/debug-android/device_cache_ddea6549.json
-I   16.608s tear_down_device(TA99205CNO)  Wrote device cache: /webrtc/src/out/debug-android/device_cache_TA99305CMO.json
-'''
-
-
-if __name__ == "__main__":
-  unittest.main()
diff --git a/audio/time_interval.cc b/audio/time_interval.cc
deleted file mode 100644
index f156af0..0000000
--- a/audio/time_interval.cc
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- *  Copyright (c) 2017 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/audio/time_interval.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/timeutils.h"
-
-namespace webrtc {
-
-TimeInterval::TimeInterval() = default;
-TimeInterval::~TimeInterval() = default;
-
-void TimeInterval::Extend() {
-  Extend(rtc::TimeMillis());
-}
-
-void TimeInterval::Extend(int64_t time) {
-  if (!interval_) {
-    interval_.emplace(time, time);
-  } else {
-    if (time < interval_->first) {
-      interval_->first = time;
-    }
-    if (time > interval_->last) {
-      interval_->last = time;
-    }
-  }
-}
-
-void TimeInterval::Extend(const TimeInterval& other_interval) {
-  if (!other_interval.Empty()) {
-    Extend(other_interval.interval_->first);
-    Extend(other_interval.interval_->last);
-  }
-}
-
-bool TimeInterval::Empty() const {
-  return !interval_;
-}
-
-int64_t TimeInterval::Length() const {
-  RTC_DCHECK(interval_);
-  return interval_->last - interval_->first;
-}
-
-TimeInterval::Interval::Interval(int64_t first, int64_t last)
-    : first(first), last(last) {}
-
-}  // namespace webrtc
diff --git a/audio/time_interval.h b/audio/time_interval.h
deleted file mode 100644
index 4481843..0000000
--- a/audio/time_interval.h
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- *  Copyright (c) 2017 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_AUDIO_TIME_INTERVAL_H_
-#define WEBRTC_AUDIO_TIME_INTERVAL_H_
-
-#include <stdint.h>
-
-#include "webrtc/api/optional.h"
-
-namespace webrtc {
-
-// This class logs the first and last time its Extend() function is called.
-//
-// This class is not thread-safe; Extend() calls should only be made by a
-// single thread at a time, such as within a lock or destructor.
-//
-// Example usage:
-//   // let x < y < z < u < v
-//   rtc::TimeInterval interval;
-//   ...  //   interval.Extend(); // at time x
-//   ...
-//   interval.Extend(); // at time y
-//   ...
-//   interval.Extend(); // at time u
-//   ...
-//   interval.Extend(z); // at time v
-//   ...
-//   if (!interval.Empty()) {
-//     int64_t active_time = interval.Length(); // returns (u - x)
-//   }
-class TimeInterval {
- public:
-  TimeInterval();
-  ~TimeInterval();
-  // Extend the interval with the current time.
-  void Extend();
-  // Extend the interval with a given time.
-  void Extend(int64_t time);
-  // Take the convex hull with another interval.
-  void Extend(const TimeInterval& other_interval);
-  // True iff Extend has never been called.
-  bool Empty() const;
-  // Returns the time between the first and the last tick, in milliseconds.
-  int64_t Length() const;
-
- private:
-  struct Interval {
-    Interval(int64_t first, int64_t last);
-
-    int64_t first, last;
-  };
-  rtc::Optional<Interval> interval_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_AUDIO_TIME_INTERVAL_H_
diff --git a/audio/time_interval_unittest.cc b/audio/time_interval_unittest.cc
deleted file mode 100644
index 592f9fc..0000000
--- a/audio/time_interval_unittest.cc
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- *  Copyright 2017 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/audio/time_interval.h"
-#include "webrtc/rtc_base/fakeclock.h"
-#include "webrtc/rtc_base/timedelta.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-TEST(TimeIntervalTest, TimeInMs) {
-  rtc::ScopedFakeClock fake_clock;
-  TimeInterval interval;
-  interval.Extend();
-  fake_clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(100));
-  interval.Extend();
-  EXPECT_EQ(interval.Length(), 100);
-}
-
-TEST(TimeIntervalTest, Empty) {
-  TimeInterval interval;
-  EXPECT_TRUE(interval.Empty());
-  interval.Extend();
-  EXPECT_FALSE(interval.Empty());
-  interval.Extend(200);
-  EXPECT_FALSE(interval.Empty());
-}
-
-TEST(TimeIntervalTest, MonotoneIncreasing) {
-  const size_t point_count = 7;
-  const int64_t interval_points[] = {3, 2, 5, 0, 4, 1, 6};
-  const int64_t interval_differences[] = {0, 1, 3, 5, 5, 5, 6};
-  TimeInterval interval;
-  EXPECT_TRUE(interval.Empty());
-  for (size_t i = 0; i < point_count; ++i) {
-    interval.Extend(interval_points[i]);
-    EXPECT_EQ(interval_differences[i], interval.Length());
-  }
-}
-
-}  // namespace webrtc
diff --git a/audio/utility/BUILD.gn b/audio/utility/BUILD.gn
deleted file mode 100644
index 65f9cb0..0000000
--- a/audio/utility/BUILD.gn
+++ /dev/null
@@ -1,48 +0,0 @@
-# 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.
-import("../../webrtc.gni")
-
-group("utility") {
-  public_deps = [
-    ":audio_frame_operations",
-  ]
-}
-
-rtc_static_library("audio_frame_operations") {
-  sources = [
-    "audio_frame_operations.cc",
-    "audio_frame_operations.h",
-  ]
-
-  deps = [
-    "../..:webrtc_common",
-    "../../modules:module_api",
-    "../../modules/audio_coding:audio_format_conversion",
-    "../../rtc_base:rtc_base_approved",
-  ]
-}
-
-if (rtc_include_tests) {
-  rtc_source_set("utility_tests") {
-    testonly = true
-    sources = [
-      "audio_frame_operations_unittest.cc",
-    ]
-    deps = [
-      ":audio_frame_operations",
-      "../../modules:module_api",
-      "../../rtc_base:rtc_base_approved",
-      "../../test:test_support",
-      "//testing/gtest",
-    ]
-    if (!build_with_chromium && is_clang) {
-      # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-    }
-  }
-}
diff --git a/audio/utility/audio_frame_operations.cc b/audio/utility/audio_frame_operations.cc
deleted file mode 100644
index 1299e04..0000000
--- a/audio/utility/audio_frame_operations.cc
+++ /dev/null
@@ -1,330 +0,0 @@
-/*
- *  Copyright (c) 2012 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/audio/utility/audio_frame_operations.h"
-
-#include <algorithm>
-
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/safe_conversions.h"
-
-namespace webrtc {
-namespace {
-
-// 2.7ms @ 48kHz, 4ms @ 32kHz, 8ms @ 16kHz.
-const size_t kMuteFadeFrames = 128;
-const float kMuteFadeInc = 1.0f / kMuteFadeFrames;
-
-}  // namespace
-
-void AudioFrameOperations::Add(const AudioFrame& frame_to_add,
-                               AudioFrame* result_frame) {
-  // Sanity check.
-  RTC_DCHECK(result_frame);
-  RTC_DCHECK_GT(result_frame->num_channels_, 0);
-  RTC_DCHECK_EQ(result_frame->num_channels_, frame_to_add.num_channels_);
-
-  bool no_previous_data = result_frame->muted();
-  if (result_frame->samples_per_channel_ != frame_to_add.samples_per_channel_) {
-    // Special case we have no data to start with.
-    RTC_DCHECK_EQ(result_frame->samples_per_channel_, 0);
-    result_frame->samples_per_channel_ = frame_to_add.samples_per_channel_;
-    no_previous_data = true;
-  }
-
-  if (result_frame->vad_activity_ == AudioFrame::kVadActive ||
-      frame_to_add.vad_activity_ == AudioFrame::kVadActive) {
-    result_frame->vad_activity_ = AudioFrame::kVadActive;
-  } else if (result_frame->vad_activity_ == AudioFrame::kVadUnknown ||
-             frame_to_add.vad_activity_ == AudioFrame::kVadUnknown) {
-    result_frame->vad_activity_ = AudioFrame::kVadUnknown;
-  }
-
-  if (result_frame->speech_type_ != frame_to_add.speech_type_)
-    result_frame->speech_type_ = AudioFrame::kUndefined;
-
-  if (!frame_to_add.muted()) {
-    const int16_t* in_data = frame_to_add.data();
-    int16_t* out_data = result_frame->mutable_data();
-    size_t length =
-        frame_to_add.samples_per_channel_ * frame_to_add.num_channels_;
-    if (no_previous_data) {
-      std::copy(in_data, in_data + length, out_data);
-    } else {
-      for (size_t i = 0; i < length; i++) {
-        const int32_t wrap_guard = static_cast<int32_t>(out_data[i]) +
-                                   static_cast<int32_t>(in_data[i]);
-        out_data[i] = rtc::saturated_cast<int16_t>(wrap_guard);
-      }
-    }
-  }
-}
-
-void AudioFrameOperations::MonoToStereo(const int16_t* src_audio,
-                                        size_t samples_per_channel,
-                                        int16_t* dst_audio) {
-  for (size_t i = 0; i < samples_per_channel; i++) {
-    dst_audio[2 * i] = src_audio[i];
-    dst_audio[2 * i + 1] = src_audio[i];
-  }
-}
-
-int AudioFrameOperations::MonoToStereo(AudioFrame* frame) {
-  if (frame->num_channels_ != 1) {
-    return -1;
-  }
-  if ((frame->samples_per_channel_ * 2) >= AudioFrame::kMaxDataSizeSamples) {
-    // Not enough memory to expand from mono to stereo.
-    return -1;
-  }
-
-  if (!frame->muted()) {
-    // TODO(yujo): this operation can be done in place.
-    int16_t data_copy[AudioFrame::kMaxDataSizeSamples];
-    memcpy(data_copy, frame->data(),
-           sizeof(int16_t) * frame->samples_per_channel_);
-    MonoToStereo(data_copy, frame->samples_per_channel_, frame->mutable_data());
-  }
-  frame->num_channels_ = 2;
-
-  return 0;
-}
-
-void AudioFrameOperations::StereoToMono(const int16_t* src_audio,
-                                        size_t samples_per_channel,
-                                        int16_t* dst_audio) {
-  for (size_t i = 0; i < samples_per_channel; i++) {
-    dst_audio[i] =
-        (static_cast<int32_t>(src_audio[2 * i]) + src_audio[2 * i + 1]) >> 1;
-  }
-}
-
-int AudioFrameOperations::StereoToMono(AudioFrame* frame) {
-  if (frame->num_channels_ != 2) {
-    return -1;
-  }
-
-  RTC_DCHECK_LE(frame->samples_per_channel_ * 2,
-                AudioFrame::kMaxDataSizeSamples);
-
-  if (!frame->muted()) {
-    StereoToMono(frame->data(), frame->samples_per_channel_,
-                 frame->mutable_data());
-  }
-  frame->num_channels_ = 1;
-
-  return 0;
-}
-
-void AudioFrameOperations::QuadToStereo(const int16_t* src_audio,
-                                        size_t samples_per_channel,
-                                        int16_t* dst_audio) {
-  for (size_t i = 0; i < samples_per_channel; i++) {
-    dst_audio[i * 2] =
-        (static_cast<int32_t>(src_audio[4 * i]) + src_audio[4 * i + 1]) >> 1;
-    dst_audio[i * 2 + 1] =
-        (static_cast<int32_t>(src_audio[4 * i + 2]) + src_audio[4 * i + 3]) >>
-        1;
-  }
-}
-
-int AudioFrameOperations::QuadToStereo(AudioFrame* frame) {
-  if (frame->num_channels_ != 4) {
-    return -1;
-  }
-
-  RTC_DCHECK_LE(frame->samples_per_channel_ * 4,
-                AudioFrame::kMaxDataSizeSamples);
-
-  if (!frame->muted()) {
-    QuadToStereo(frame->data(), frame->samples_per_channel_,
-                 frame->mutable_data());
-  }
-  frame->num_channels_ = 2;
-
-  return 0;
-}
-
-void AudioFrameOperations::QuadToMono(const int16_t* src_audio,
-                                      size_t samples_per_channel,
-                                      int16_t* dst_audio) {
-  for (size_t i = 0; i < samples_per_channel; i++) {
-    dst_audio[i] =
-        (static_cast<int32_t>(src_audio[4 * i]) + src_audio[4 * i + 1] +
-         src_audio[4 * i + 2] + src_audio[4 * i + 3]) >> 2;
-  }
-}
-
-int AudioFrameOperations::QuadToMono(AudioFrame* frame) {
-  if (frame->num_channels_ != 4) {
-    return -1;
-  }
-
-  RTC_DCHECK_LE(frame->samples_per_channel_ * 4,
-                AudioFrame::kMaxDataSizeSamples);
-
-  if (!frame->muted()) {
-    QuadToMono(frame->data(), frame->samples_per_channel_,
-               frame->mutable_data());
-  }
-  frame->num_channels_ = 1;
-
-  return 0;
-}
-
-void AudioFrameOperations::DownmixChannels(const int16_t* src_audio,
-                                           size_t src_channels,
-                                           size_t samples_per_channel,
-                                           size_t dst_channels,
-                                           int16_t* dst_audio) {
-  if (src_channels == 2 && dst_channels == 1) {
-    StereoToMono(src_audio, samples_per_channel, dst_audio);
-    return;
-  } else if (src_channels == 4 && dst_channels == 2) {
-    QuadToStereo(src_audio, samples_per_channel, dst_audio);
-    return;
-  } else if (src_channels == 4 && dst_channels == 1) {
-    QuadToMono(src_audio, samples_per_channel, dst_audio);
-    return;
-  }
-
-  RTC_NOTREACHED() << "src_channels: " << src_channels
-                   << ", dst_channels: " << dst_channels;
-}
-
-int AudioFrameOperations::DownmixChannels(size_t dst_channels,
-                                          AudioFrame* frame) {
-  if (frame->num_channels_ == 2 && dst_channels == 1) {
-    return StereoToMono(frame);
-  } else if (frame->num_channels_ == 4 && dst_channels == 2) {
-    return QuadToStereo(frame);
-  } else if (frame->num_channels_ == 4 && dst_channels == 1) {
-    return QuadToMono(frame);
-  }
-
-  return -1;
-}
-
-void AudioFrameOperations::SwapStereoChannels(AudioFrame* frame) {
-  RTC_DCHECK(frame);
-  if (frame->num_channels_ != 2 || frame->muted()) {
-    return;
-  }
-
-  int16_t* frame_data = frame->mutable_data();
-  for (size_t i = 0; i < frame->samples_per_channel_ * 2; i += 2) {
-    int16_t temp_data = frame_data[i];
-    frame_data[i] = frame_data[i + 1];
-    frame_data[i + 1] = temp_data;
-  }
-}
-
-void AudioFrameOperations::Mute(AudioFrame* frame,
-                                bool previous_frame_muted,
-                                bool current_frame_muted) {
-  RTC_DCHECK(frame);
-  if (!previous_frame_muted && !current_frame_muted) {
-    // Not muted, don't touch.
-  } else if (previous_frame_muted && current_frame_muted) {
-    // Frame fully muted.
-    size_t total_samples = frame->samples_per_channel_ * frame->num_channels_;
-    RTC_DCHECK_GE(AudioFrame::kMaxDataSizeSamples, total_samples);
-    frame->Mute();
-  } else {
-    // Fade is a no-op on a muted frame.
-    if (frame->muted()) {
-      return;
-    }
-
-    // Limit number of samples to fade, if frame isn't long enough.
-    size_t count = kMuteFadeFrames;
-    float inc = kMuteFadeInc;
-    if (frame->samples_per_channel_ < kMuteFadeFrames) {
-      count = frame->samples_per_channel_;
-      if (count > 0) {
-        inc = 1.0f / count;
-      }
-    }
-
-    size_t start = 0;
-    size_t end = count;
-    float start_g = 0.0f;
-    if (current_frame_muted) {
-      // Fade out the last |count| samples of frame.
-      RTC_DCHECK(!previous_frame_muted);
-      start = frame->samples_per_channel_ - count;
-      end = frame->samples_per_channel_;
-      start_g = 1.0f;
-      inc = -inc;
-    } else {
-      // Fade in the first |count| samples of frame.
-      RTC_DCHECK(previous_frame_muted);
-    }
-
-    // Perform fade.
-    int16_t* frame_data = frame->mutable_data();
-    size_t channels = frame->num_channels_;
-    for (size_t j = 0; j < channels; ++j) {
-      float g = start_g;
-      for (size_t i = start * channels; i < end * channels; i += channels) {
-        g += inc;
-        frame_data[i + j] *= g;
-      }
-    }
-  }
-}
-
-void AudioFrameOperations::Mute(AudioFrame* frame) {
-  Mute(frame, true, true);
-}
-
-void AudioFrameOperations::ApplyHalfGain(AudioFrame* frame) {
-  RTC_DCHECK(frame);
-  RTC_DCHECK_GT(frame->num_channels_, 0);
-  if (frame->num_channels_ < 1 || frame->muted()) {
-    return;
-  }
-
-  int16_t* frame_data = frame->mutable_data();
-  for (size_t i = 0; i < frame->samples_per_channel_ * frame->num_channels_;
-       i++) {
-    frame_data[i] = frame_data[i] >> 1;
-  }
-}
-
-int AudioFrameOperations::Scale(float left, float right, AudioFrame* frame) {
-  if (frame->num_channels_ != 2) {
-    return -1;
-  } else if (frame->muted()) {
-    return 0;
-  }
-
-  int16_t* frame_data = frame->mutable_data();
-  for (size_t i = 0; i < frame->samples_per_channel_; i++) {
-    frame_data[2 * i] = static_cast<int16_t>(left * frame_data[2 * i]);
-    frame_data[2 * i + 1] = static_cast<int16_t>(right * frame_data[2 * i + 1]);
-  }
-  return 0;
-}
-
-int AudioFrameOperations::ScaleWithSat(float scale, AudioFrame* frame) {
-  if (frame->muted()) {
-    return 0;
-  }
-
-  int16_t* frame_data = frame->mutable_data();
-  for (size_t i = 0; i < frame->samples_per_channel_ * frame->num_channels_;
-       i++) {
-    frame_data[i] = rtc::saturated_cast<int16_t>(scale * frame_data[i]);
-  }
-  return 0;
-}
-}  // namespace webrtc
diff --git a/audio/utility/audio_frame_operations.h b/audio/utility/audio_frame_operations.h
deleted file mode 100644
index 23c33ec..0000000
--- a/audio/utility/audio_frame_operations.h
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- *  Copyright (c) 2012 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_AUDIO_UTILITY_AUDIO_FRAME_OPERATIONS_H_
-#define WEBRTC_AUDIO_UTILITY_AUDIO_FRAME_OPERATIONS_H_
-
-#include <stddef.h>
-
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-class AudioFrame;
-
-// TODO(andrew): consolidate this with utility.h and audio_frame_manipulator.h.
-// Change reference parameters to pointers. Consider using a namespace rather
-// than a class.
-class AudioFrameOperations {
- public:
-  // Add samples in |frame_to_add| with samples in |result_frame|
-  // putting the results in |results_frame|.  The fields
-  // |vad_activity_| and |speech_type_| of the result frame are
-  // updated. If |result_frame| is empty (|samples_per_channel_|==0),
-  // the samples in |frame_to_add| are added to it.  The number of
-  // channels and number of samples per channel must match except when
-  // |result_frame| is empty.
-  static void Add(const AudioFrame& frame_to_add, AudioFrame* result_frame);
-
-  // Upmixes mono |src_audio| to stereo |dst_audio|. This is an out-of-place
-  // operation, meaning src_audio and dst_audio must point to different
-  // buffers. It is the caller's responsibility to ensure that |dst_audio| is
-  // sufficiently large.
-  static void MonoToStereo(const int16_t* src_audio,
-                           size_t samples_per_channel,
-                           int16_t* dst_audio);
-
-  // |frame.num_channels_| will be updated. This version checks for sufficient
-  // buffer size and that |num_channels_| is mono.
-  static int MonoToStereo(AudioFrame* frame);
-
-  // Downmixes stereo |src_audio| to mono |dst_audio|. This is an in-place
-  // operation, meaning |src_audio| and |dst_audio| may point to the same
-  // buffer.
-  static void StereoToMono(const int16_t* src_audio,
-                           size_t samples_per_channel,
-                           int16_t* dst_audio);
-
-  // |frame.num_channels_| will be updated. This version checks that
-  // |num_channels_| is stereo.
-  static int StereoToMono(AudioFrame* frame);
-
-  // Downmixes 4 channels |src_audio| to stereo |dst_audio|. This is an in-place
-  // operation, meaning |src_audio| and |dst_audio| may point to the same
-  // buffer.
-  static void QuadToStereo(const int16_t* src_audio,
-                           size_t samples_per_channel,
-                           int16_t* dst_audio);
-
-  // |frame.num_channels_| will be updated. This version checks that
-  // |num_channels_| is 4 channels.
-  static int QuadToStereo(AudioFrame* frame);
-
-  // Downmixes 4 channels |src_audio| to mono |dst_audio|. This is an in-place
-  // operation, meaning |src_audio| and |dst_audio| may point to the same
-  // buffer.
-  static void QuadToMono(const int16_t* src_audio,
-                         size_t samples_per_channel,
-                         int16_t* dst_audio);
-
-  // |frame.num_channels_| will be updated. This version checks that
-  // |num_channels_| is 4 channels.
-  static int QuadToMono(AudioFrame* frame);
-
-  // Downmixes |src_channels| |src_audio| to |dst_channels| |dst_audio|.
-  // This is an in-place operation, meaning |src_audio| and |dst_audio|
-  // may point to the same buffer. Supported channel combinations are
-  // Stereo to Mono, Quad to Mono, and Quad to Stereo.
-  static void DownmixChannels(const int16_t* src_audio,
-                              size_t src_channels,
-                              size_t samples_per_channel,
-                              size_t dst_channels,
-                              int16_t* dst_audio);
-
-  // |frame.num_channels_| will be updated. This version checks that
-  // |num_channels_| and |dst_channels| are valid and performs relevant
-  // downmix.  Supported channel combinations are Stereo to Mono, Quad to Mono,
-  // and Quad to Stereo.
-  static int DownmixChannels(size_t dst_channels, AudioFrame* frame);
-
-  // Swap the left and right channels of |frame|. Fails silently if |frame| is
-  // not stereo.
-  static void SwapStereoChannels(AudioFrame* frame);
-
-  // Conditionally zero out contents of |frame| for implementing audio mute:
-  //  |previous_frame_muted| &&  |current_frame_muted| - Zero out whole frame.
-  //  |previous_frame_muted| && !|current_frame_muted| - Fade-in at frame start.
-  // !|previous_frame_muted| &&  |current_frame_muted| - Fade-out at frame end.
-  // !|previous_frame_muted| && !|current_frame_muted| - Leave frame untouched.
-  static void Mute(AudioFrame* frame,
-                   bool previous_frame_muted,
-                   bool current_frame_muted);
-
-  // Zero out contents of frame.
-  static void Mute(AudioFrame* frame);
-
-  // Halve samples in |frame|.
-  static void ApplyHalfGain(AudioFrame* frame);
-
-  static int Scale(float left, float right, AudioFrame* frame);
-
-  static int ScaleWithSat(float scale, AudioFrame* frame);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_AUDIO_UTILITY_AUDIO_FRAME_OPERATIONS_H_
diff --git a/audio/utility/audio_frame_operations_unittest.cc b/audio/utility/audio_frame_operations_unittest.cc
deleted file mode 100644
index deab9bd..0000000
--- a/audio/utility/audio_frame_operations_unittest.cc
+++ /dev/null
@@ -1,629 +0,0 @@
-/*
- *  Copyright (c) 2012 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/audio/utility/audio_frame_operations.h"
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-namespace {
-
-class AudioFrameOperationsTest : public ::testing::Test {
- protected:
-  AudioFrameOperationsTest() {
-    // Set typical values.
-    frame_.samples_per_channel_ = 320;
-    frame_.num_channels_ = 2;
-  }
-
-  AudioFrame frame_;
-};
-
-void SetFrameData(int16_t ch1,
-                  int16_t ch2,
-                  int16_t ch3,
-                  int16_t ch4,
-                  AudioFrame* frame) {
-  int16_t* frame_data = frame->mutable_data();
-  for (size_t i = 0; i < frame->samples_per_channel_ * 4; i += 4) {
-    frame_data[i] = ch1;
-    frame_data[i + 1] = ch2;
-    frame_data[i + 2] = ch3;
-    frame_data[i + 3] = ch4;
-  }
-}
-
-void SetFrameData(int16_t left, int16_t right, AudioFrame* frame) {
-  int16_t* frame_data = frame->mutable_data();
-  for (size_t i = 0; i < frame->samples_per_channel_ * 2; i += 2) {
-    frame_data[i] = left;
-    frame_data[i + 1] = right;
-  }
-}
-
-void SetFrameData(int16_t data, AudioFrame* frame) {
-  int16_t* frame_data = frame->mutable_data();
-  for (size_t i = 0;
-       i < frame->samples_per_channel_ * frame->num_channels_; i++) {
-    frame_data[i] = data;
-  }
-}
-
-void VerifyFramesAreEqual(const AudioFrame& frame1, const AudioFrame& frame2) {
-  EXPECT_EQ(frame1.num_channels_, frame2.num_channels_);
-  EXPECT_EQ(frame1.samples_per_channel_,
-            frame2.samples_per_channel_);
-  const int16_t* frame1_data = frame1.data();
-  const int16_t* frame2_data = frame2.data();
-  for (size_t i = 0; i < frame1.samples_per_channel_ * frame1.num_channels_;
-      i++) {
-    EXPECT_EQ(frame1_data[i], frame2_data[i]);
-  }
-  EXPECT_EQ(frame1.muted(), frame2.muted());
-}
-
-void InitFrame(AudioFrame* frame, size_t channels, size_t samples_per_channel,
-               int16_t left_data, int16_t right_data) {
-  RTC_DCHECK(frame);
-  RTC_DCHECK_GE(2, channels);
-  RTC_DCHECK_GE(AudioFrame::kMaxDataSizeSamples,
-                samples_per_channel * channels);
-  frame->samples_per_channel_ = samples_per_channel;
-  frame->num_channels_ = channels;
-  if (channels == 2) {
-    SetFrameData(left_data, right_data, frame);
-  } else if (channels == 1) {
-    SetFrameData(left_data, frame);
-  }
-}
-
-int16_t GetChannelData(const AudioFrame& frame, size_t channel, size_t index) {
-  RTC_DCHECK_LT(channel, frame.num_channels_);
-  RTC_DCHECK_LT(index, frame.samples_per_channel_);
-  return frame.data()[index * frame.num_channels_ + channel];
-}
-
-void VerifyFrameDataBounds(const AudioFrame& frame, size_t channel, int16_t max,
-                           int16_t min) {
-  for (size_t i = 0; i < frame.samples_per_channel_; ++i) {
-    int16_t s = GetChannelData(frame, channel, i);
-    EXPECT_LE(min, s);
-    EXPECT_GE(max, s);
-  }
-}
-
-TEST_F(AudioFrameOperationsTest, MonoToStereoFailsWithBadParameters) {
-  EXPECT_EQ(-1, AudioFrameOperations::MonoToStereo(&frame_));
-
-  frame_.samples_per_channel_ = AudioFrame::kMaxDataSizeSamples;
-  frame_.num_channels_ = 1;
-  EXPECT_EQ(-1, AudioFrameOperations::MonoToStereo(&frame_));
-}
-
-TEST_F(AudioFrameOperationsTest, MonoToStereoSucceeds) {
-  frame_.num_channels_ = 1;
-  SetFrameData(1, &frame_);
-
-  EXPECT_EQ(0, AudioFrameOperations::MonoToStereo(&frame_));
-
-  AudioFrame stereo_frame;
-  stereo_frame.samples_per_channel_ = 320;
-  stereo_frame.num_channels_ = 2;
-  SetFrameData(1, 1, &stereo_frame);
-  VerifyFramesAreEqual(stereo_frame, frame_);
-}
-
-TEST_F(AudioFrameOperationsTest, MonoToStereoMuted) {
-  frame_.num_channels_ = 1;
-  ASSERT_TRUE(frame_.muted());
-  EXPECT_EQ(0, AudioFrameOperations::MonoToStereo(&frame_));
-  EXPECT_TRUE(frame_.muted());
-}
-
-TEST_F(AudioFrameOperationsTest, MonoToStereoBufferSucceeds) {
-  AudioFrame target_frame;
-  frame_.num_channels_ = 1;
-  SetFrameData(4, &frame_);
-
-  target_frame.num_channels_ = 2;
-  target_frame.samples_per_channel_ = frame_.samples_per_channel_;
-
-  AudioFrameOperations::MonoToStereo(frame_.data(), frame_.samples_per_channel_,
-                                     target_frame.mutable_data());
-
-  AudioFrame stereo_frame;
-  stereo_frame.samples_per_channel_ = 320;
-  stereo_frame.num_channels_ = 2;
-  SetFrameData(4, 4, &stereo_frame);
-  VerifyFramesAreEqual(stereo_frame, target_frame);
-}
-
-TEST_F(AudioFrameOperationsTest, StereoToMonoFailsWithBadParameters) {
-  frame_.num_channels_ = 1;
-  EXPECT_EQ(-1, AudioFrameOperations::StereoToMono(&frame_));
-}
-
-TEST_F(AudioFrameOperationsTest, StereoToMonoSucceeds) {
-  SetFrameData(4, 2, &frame_);
-  EXPECT_EQ(0, AudioFrameOperations::StereoToMono(&frame_));
-
-  AudioFrame mono_frame;
-  mono_frame.samples_per_channel_ = 320;
-  mono_frame.num_channels_ = 1;
-  SetFrameData(3, &mono_frame);
-  VerifyFramesAreEqual(mono_frame, frame_);
-}
-
-TEST_F(AudioFrameOperationsTest, StereoToMonoMuted) {
-  ASSERT_TRUE(frame_.muted());
-  EXPECT_EQ(0, AudioFrameOperations::StereoToMono(&frame_));
-  EXPECT_TRUE(frame_.muted());
-}
-
-TEST_F(AudioFrameOperationsTest, StereoToMonoBufferSucceeds) {
-  AudioFrame target_frame;
-  SetFrameData(4, 2, &frame_);
-
-  target_frame.num_channels_ = 1;
-  target_frame.samples_per_channel_ = frame_.samples_per_channel_;
-
-  AudioFrameOperations::StereoToMono(frame_.data(), frame_.samples_per_channel_,
-                                     target_frame.mutable_data());
-
-  AudioFrame mono_frame;
-  mono_frame.samples_per_channel_ = 320;
-  mono_frame.num_channels_ = 1;
-  SetFrameData(3, &mono_frame);
-  VerifyFramesAreEqual(mono_frame, target_frame);
-}
-
-TEST_F(AudioFrameOperationsTest, StereoToMonoDoesNotWrapAround) {
-  SetFrameData(-32768, -32768, &frame_);
-  EXPECT_EQ(0, AudioFrameOperations::StereoToMono(&frame_));
-
-  AudioFrame mono_frame;
-  mono_frame.samples_per_channel_ = 320;
-  mono_frame.num_channels_ = 1;
-  SetFrameData(-32768, &mono_frame);
-  VerifyFramesAreEqual(mono_frame, frame_);
-}
-
-TEST_F(AudioFrameOperationsTest, QuadToMonoFailsWithBadParameters) {
-  frame_.num_channels_ = 1;
-  EXPECT_EQ(-1, AudioFrameOperations::QuadToMono(&frame_));
-  frame_.num_channels_ = 2;
-  EXPECT_EQ(-1, AudioFrameOperations::QuadToMono(&frame_));
-}
-
-TEST_F(AudioFrameOperationsTest, QuadToMonoSucceeds) {
-  frame_.num_channels_ = 4;
-  SetFrameData(4, 2, 6, 8, &frame_);
-
-  EXPECT_EQ(0, AudioFrameOperations::QuadToMono(&frame_));
-
-  AudioFrame mono_frame;
-  mono_frame.samples_per_channel_ = 320;
-  mono_frame.num_channels_ = 1;
-  SetFrameData(5, &mono_frame);
-  VerifyFramesAreEqual(mono_frame, frame_);
-}
-
-TEST_F(AudioFrameOperationsTest, QuadToMonoMuted) {
-  frame_.num_channels_ = 4;
-  ASSERT_TRUE(frame_.muted());
-  EXPECT_EQ(0, AudioFrameOperations::QuadToMono(&frame_));
-  EXPECT_TRUE(frame_.muted());
-}
-
-TEST_F(AudioFrameOperationsTest, QuadToMonoBufferSucceeds) {
-  AudioFrame target_frame;
-  frame_.num_channels_ = 4;
-  SetFrameData(4, 2, 6, 8, &frame_);
-
-  target_frame.num_channels_ = 1;
-  target_frame.samples_per_channel_ = frame_.samples_per_channel_;
-
-  AudioFrameOperations::QuadToMono(frame_.data(), frame_.samples_per_channel_,
-                                   target_frame.mutable_data());
-  AudioFrame mono_frame;
-  mono_frame.samples_per_channel_ = 320;
-  mono_frame.num_channels_ = 1;
-  SetFrameData(5, &mono_frame);
-  VerifyFramesAreEqual(mono_frame, target_frame);
-}
-
-TEST_F(AudioFrameOperationsTest, QuadToMonoDoesNotWrapAround) {
-  frame_.num_channels_ = 4;
-  SetFrameData(-32768, -32768, -32768, -32768, &frame_);
-  EXPECT_EQ(0, AudioFrameOperations::QuadToMono(&frame_));
-
-  AudioFrame mono_frame;
-  mono_frame.samples_per_channel_ = 320;
-  mono_frame.num_channels_ = 1;
-  SetFrameData(-32768, &mono_frame);
-  VerifyFramesAreEqual(mono_frame, frame_);
-}
-
-TEST_F(AudioFrameOperationsTest, QuadToStereoFailsWithBadParameters) {
-  frame_.num_channels_ = 1;
-  EXPECT_EQ(-1, AudioFrameOperations::QuadToStereo(&frame_));
-  frame_.num_channels_ = 2;
-  EXPECT_EQ(-1, AudioFrameOperations::QuadToStereo(&frame_));
-}
-
-TEST_F(AudioFrameOperationsTest, QuadToStereoSucceeds) {
-  frame_.num_channels_ = 4;
-  SetFrameData(4, 2, 6, 8, &frame_);
-  EXPECT_EQ(0, AudioFrameOperations::QuadToStereo(&frame_));
-
-  AudioFrame stereo_frame;
-  stereo_frame.samples_per_channel_ = 320;
-  stereo_frame.num_channels_ = 2;
-  SetFrameData(3, 7, &stereo_frame);
-  VerifyFramesAreEqual(stereo_frame, frame_);
-}
-
-TEST_F(AudioFrameOperationsTest, QuadToStereoMuted) {
-  frame_.num_channels_ = 4;
-  ASSERT_TRUE(frame_.muted());
-  EXPECT_EQ(0, AudioFrameOperations::QuadToStereo(&frame_));
-  EXPECT_TRUE(frame_.muted());
-}
-
-TEST_F(AudioFrameOperationsTest, QuadToStereoBufferSucceeds) {
-  AudioFrame target_frame;
-  frame_.num_channels_ = 4;
-  SetFrameData(4, 2, 6, 8, &frame_);
-
-  target_frame.num_channels_ = 2;
-  target_frame.samples_per_channel_ = frame_.samples_per_channel_;
-
-  AudioFrameOperations::QuadToStereo(frame_.data(), frame_.samples_per_channel_,
-                                     target_frame.mutable_data());
-  AudioFrame stereo_frame;
-  stereo_frame.samples_per_channel_ = 320;
-  stereo_frame.num_channels_ = 2;
-  SetFrameData(3, 7, &stereo_frame);
-  VerifyFramesAreEqual(stereo_frame, target_frame);
-}
-
-TEST_F(AudioFrameOperationsTest, QuadToStereoDoesNotWrapAround) {
-  frame_.num_channels_ = 4;
-  SetFrameData(-32768, -32768, -32768, -32768, &frame_);
-  EXPECT_EQ(0, AudioFrameOperations::QuadToStereo(&frame_));
-
-  AudioFrame stereo_frame;
-  stereo_frame.samples_per_channel_ = 320;
-  stereo_frame.num_channels_ = 2;
-  SetFrameData(-32768, -32768, &stereo_frame);
-  VerifyFramesAreEqual(stereo_frame, frame_);
-}
-
-TEST_F(AudioFrameOperationsTest, SwapStereoChannelsSucceedsOnStereo) {
-  SetFrameData(0, 1, &frame_);
-
-  AudioFrame swapped_frame;
-  swapped_frame.samples_per_channel_ = 320;
-  swapped_frame.num_channels_ = 2;
-  SetFrameData(1, 0, &swapped_frame);
-
-  AudioFrameOperations::SwapStereoChannels(&frame_);
-  VerifyFramesAreEqual(swapped_frame, frame_);
-}
-
-TEST_F(AudioFrameOperationsTest, SwapStereoChannelsMuted) {
-  ASSERT_TRUE(frame_.muted());
-  AudioFrameOperations::SwapStereoChannels(&frame_);
-  EXPECT_TRUE(frame_.muted());
-}
-
-TEST_F(AudioFrameOperationsTest, SwapStereoChannelsFailsOnMono) {
-  frame_.num_channels_ = 1;
-  // Set data to "stereo", despite it being a mono frame.
-  SetFrameData(0, 1, &frame_);
-
-  AudioFrame orig_frame;
-  orig_frame.CopyFrom(frame_);
-  AudioFrameOperations::SwapStereoChannels(&frame_);
-  // Verify that no swap occurred.
-  VerifyFramesAreEqual(orig_frame, frame_);
-}
-
-TEST_F(AudioFrameOperationsTest, MuteDisabled) {
-  SetFrameData(1000, -1000, &frame_);
-  AudioFrameOperations::Mute(&frame_, false, false);
-
-  AudioFrame muted_frame;
-  muted_frame.samples_per_channel_ = 320;
-  muted_frame.num_channels_ = 2;
-  SetFrameData(1000, -1000, &muted_frame);
-  VerifyFramesAreEqual(muted_frame, frame_);
-}
-
-TEST_F(AudioFrameOperationsTest, MuteEnabled) {
-  SetFrameData(1000, -1000, &frame_);
-  AudioFrameOperations::Mute(&frame_, true, true);
-
-  AudioFrame muted_frame;
-  muted_frame.samples_per_channel_ = frame_.samples_per_channel_;
-  muted_frame.num_channels_ = frame_.num_channels_;
-  ASSERT_TRUE(muted_frame.muted());
-  VerifyFramesAreEqual(muted_frame, frame_);
-}
-
-// Verify that *beginning* to mute works for short and long (>128) frames, mono
-// and stereo. Beginning mute should yield a ramp down to zero.
-TEST_F(AudioFrameOperationsTest, MuteBeginMonoLong) {
-  InitFrame(&frame_, 1, 228, 1000, -1000);
-  AudioFrameOperations::Mute(&frame_, false, true);
-  VerifyFrameDataBounds(frame_, 0, 1000, 0);
-  EXPECT_EQ(1000, GetChannelData(frame_, 0, 99));
-  EXPECT_EQ(992, GetChannelData(frame_, 0, 100));
-  EXPECT_EQ(7, GetChannelData(frame_, 0, 226));
-  EXPECT_EQ(0, GetChannelData(frame_, 0, 227));
-}
-
-TEST_F(AudioFrameOperationsTest, MuteBeginMonoShort) {
-  InitFrame(&frame_, 1, 93, 1000, -1000);
-  AudioFrameOperations::Mute(&frame_, false, true);
-  VerifyFrameDataBounds(frame_, 0, 1000, 0);
-  EXPECT_EQ(989, GetChannelData(frame_, 0, 0));
-  EXPECT_EQ(978, GetChannelData(frame_, 0, 1));
-  EXPECT_EQ(10, GetChannelData(frame_, 0, 91));
-  EXPECT_EQ(0, GetChannelData(frame_, 0, 92));
-}
-
-TEST_F(AudioFrameOperationsTest, MuteBeginStereoLong) {
-  InitFrame(&frame_, 2, 228, 1000, -1000);
-  AudioFrameOperations::Mute(&frame_, false, true);
-  VerifyFrameDataBounds(frame_, 0, 1000, 0);
-  VerifyFrameDataBounds(frame_, 1, 0, -1000);
-  EXPECT_EQ(1000, GetChannelData(frame_, 0, 99));
-  EXPECT_EQ(-1000, GetChannelData(frame_, 1, 99));
-  EXPECT_EQ(992, GetChannelData(frame_, 0, 100));
-  EXPECT_EQ(-992, GetChannelData(frame_, 1, 100));
-  EXPECT_EQ(7, GetChannelData(frame_, 0, 226));
-  EXPECT_EQ(-7, GetChannelData(frame_, 1, 226));
-  EXPECT_EQ(0, GetChannelData(frame_, 0, 227));
-  EXPECT_EQ(0, GetChannelData(frame_, 1, 227));
-}
-
-TEST_F(AudioFrameOperationsTest, MuteBeginStereoShort) {
-  InitFrame(&frame_, 2, 93, 1000, -1000);
-  AudioFrameOperations::Mute(&frame_, false, true);
-  VerifyFrameDataBounds(frame_, 0, 1000, 0);
-  VerifyFrameDataBounds(frame_, 1, 0, -1000);
-  EXPECT_EQ(989, GetChannelData(frame_, 0, 0));
-  EXPECT_EQ(-989, GetChannelData(frame_, 1, 0));
-  EXPECT_EQ(978, GetChannelData(frame_, 0, 1));
-  EXPECT_EQ(-978, GetChannelData(frame_, 1, 1));
-  EXPECT_EQ(10, GetChannelData(frame_, 0, 91));
-  EXPECT_EQ(-10, GetChannelData(frame_, 1, 91));
-  EXPECT_EQ(0, GetChannelData(frame_, 0, 92));
-  EXPECT_EQ(0, GetChannelData(frame_, 1, 92));
-}
-
-// Verify that *ending* to mute works for short and long (>128) frames, mono
-// and stereo. Ending mute should yield a ramp up from zero.
-TEST_F(AudioFrameOperationsTest, MuteEndMonoLong) {
-  InitFrame(&frame_, 1, 228, 1000, -1000);
-  AudioFrameOperations::Mute(&frame_, true, false);
-  VerifyFrameDataBounds(frame_, 0, 1000, 0);
-  EXPECT_EQ(7, GetChannelData(frame_, 0, 0));
-  EXPECT_EQ(15, GetChannelData(frame_, 0, 1));
-  EXPECT_EQ(1000, GetChannelData(frame_, 0, 127));
-  EXPECT_EQ(1000, GetChannelData(frame_, 0, 128));
-}
-
-TEST_F(AudioFrameOperationsTest, MuteEndMonoShort) {
-  InitFrame(&frame_, 1, 93, 1000, -1000);
-  AudioFrameOperations::Mute(&frame_, true, false);
-  VerifyFrameDataBounds(frame_, 0, 1000, 0);
-  EXPECT_EQ(10, GetChannelData(frame_, 0, 0));
-  EXPECT_EQ(21, GetChannelData(frame_, 0, 1));
-  EXPECT_EQ(989, GetChannelData(frame_, 0, 91));
-  EXPECT_EQ(999, GetChannelData(frame_, 0, 92));
-}
-
-TEST_F(AudioFrameOperationsTest, MuteEndStereoLong) {
-  InitFrame(&frame_, 2, 228, 1000, -1000);
-  AudioFrameOperations::Mute(&frame_, true, false);
-  VerifyFrameDataBounds(frame_, 0, 1000, 0);
-  VerifyFrameDataBounds(frame_, 1, 0, -1000);
-  EXPECT_EQ(7, GetChannelData(frame_, 0, 0));
-  EXPECT_EQ(-7, GetChannelData(frame_, 1, 0));
-  EXPECT_EQ(15, GetChannelData(frame_, 0, 1));
-  EXPECT_EQ(-15, GetChannelData(frame_, 1, 1));
-  EXPECT_EQ(1000, GetChannelData(frame_, 0, 127));
-  EXPECT_EQ(-1000, GetChannelData(frame_, 1, 127));
-  EXPECT_EQ(1000, GetChannelData(frame_, 0, 128));
-  EXPECT_EQ(-1000, GetChannelData(frame_, 1, 128));
-}
-
-TEST_F(AudioFrameOperationsTest, MuteEndStereoShort) {
-  InitFrame(&frame_, 2, 93, 1000, -1000);
-  AudioFrameOperations::Mute(&frame_, true, false);
-  VerifyFrameDataBounds(frame_, 0, 1000, 0);
-  VerifyFrameDataBounds(frame_, 1, 0, -1000);
-  EXPECT_EQ(10, GetChannelData(frame_, 0, 0));
-  EXPECT_EQ(-10, GetChannelData(frame_, 1, 0));
-  EXPECT_EQ(21, GetChannelData(frame_, 0, 1));
-  EXPECT_EQ(-21, GetChannelData(frame_, 1, 1));
-  EXPECT_EQ(989, GetChannelData(frame_, 0, 91));
-  EXPECT_EQ(-989, GetChannelData(frame_, 1, 91));
-  EXPECT_EQ(999, GetChannelData(frame_, 0, 92));
-  EXPECT_EQ(-999, GetChannelData(frame_, 1, 92));
-}
-
-TEST_F(AudioFrameOperationsTest, MuteBeginAlreadyMuted) {
-  ASSERT_TRUE(frame_.muted());
-  AudioFrameOperations::Mute(&frame_, false, true);
-  EXPECT_TRUE(frame_.muted());
-}
-
-TEST_F(AudioFrameOperationsTest, MuteEndAlreadyMuted) {
-  ASSERT_TRUE(frame_.muted());
-  AudioFrameOperations::Mute(&frame_, true, false);
-  EXPECT_TRUE(frame_.muted());
-}
-
-TEST_F(AudioFrameOperationsTest, ApplyHalfGainSucceeds) {
-  SetFrameData(2, &frame_);
-
-  AudioFrame half_gain_frame;
-  half_gain_frame.num_channels_ = frame_.num_channels_;
-  half_gain_frame.samples_per_channel_ = frame_.samples_per_channel_;
-  SetFrameData(1, &half_gain_frame);
-
-  AudioFrameOperations::ApplyHalfGain(&frame_);
-  VerifyFramesAreEqual(half_gain_frame, frame_);
-}
-
-TEST_F(AudioFrameOperationsTest, ApplyHalfGainMuted) {
-  ASSERT_TRUE(frame_.muted());
-  AudioFrameOperations::ApplyHalfGain(&frame_);
-  EXPECT_TRUE(frame_.muted());
-}
-
-// TODO(andrew): should not allow negative scales.
-TEST_F(AudioFrameOperationsTest, DISABLED_ScaleFailsWithBadParameters) {
-  frame_.num_channels_ = 1;
-  EXPECT_EQ(-1, AudioFrameOperations::Scale(1.0, 1.0, &frame_));
-
-  frame_.num_channels_ = 3;
-  EXPECT_EQ(-1, AudioFrameOperations::Scale(1.0, 1.0, &frame_));
-
-  frame_.num_channels_ = 2;
-  EXPECT_EQ(-1, AudioFrameOperations::Scale(-1.0, 1.0, &frame_));
-  EXPECT_EQ(-1, AudioFrameOperations::Scale(1.0, -1.0, &frame_));
-}
-
-// TODO(andrew): fix the wraparound bug. We should always saturate.
-TEST_F(AudioFrameOperationsTest, DISABLED_ScaleDoesNotWrapAround) {
-  SetFrameData(4000, -4000, &frame_);
-  EXPECT_EQ(0, AudioFrameOperations::Scale(10.0, 10.0, &frame_));
-
-  AudioFrame clipped_frame;
-  clipped_frame.samples_per_channel_ = 320;
-  clipped_frame.num_channels_ = 2;
-  SetFrameData(32767, -32768, &clipped_frame);
-  VerifyFramesAreEqual(clipped_frame, frame_);
-}
-
-TEST_F(AudioFrameOperationsTest, ScaleSucceeds) {
-  SetFrameData(1, -1, &frame_);
-  EXPECT_EQ(0, AudioFrameOperations::Scale(2.0, 3.0, &frame_));
-
-  AudioFrame scaled_frame;
-  scaled_frame.samples_per_channel_ = 320;
-  scaled_frame.num_channels_ = 2;
-  SetFrameData(2, -3, &scaled_frame);
-  VerifyFramesAreEqual(scaled_frame, frame_);
-}
-
-TEST_F(AudioFrameOperationsTest, ScaleMuted) {
-  ASSERT_TRUE(frame_.muted());
-  EXPECT_EQ(0, AudioFrameOperations::Scale(2.0, 3.0, &frame_));
-  EXPECT_TRUE(frame_.muted());
-}
-
-// TODO(andrew): should fail with a negative scale.
-TEST_F(AudioFrameOperationsTest, DISABLED_ScaleWithSatFailsWithBadParameters) {
-  EXPECT_EQ(-1, AudioFrameOperations::ScaleWithSat(-1.0, &frame_));
-}
-
-TEST_F(AudioFrameOperationsTest, ScaleWithSatDoesNotWrapAround) {
-  frame_.num_channels_ = 1;
-  SetFrameData(4000, &frame_);
-  EXPECT_EQ(0, AudioFrameOperations::ScaleWithSat(10.0, &frame_));
-
-  AudioFrame clipped_frame;
-  clipped_frame.samples_per_channel_ = 320;
-  clipped_frame.num_channels_ = 1;
-  SetFrameData(32767, &clipped_frame);
-  VerifyFramesAreEqual(clipped_frame, frame_);
-
-  SetFrameData(-4000, &frame_);
-  EXPECT_EQ(0, AudioFrameOperations::ScaleWithSat(10.0, &frame_));
-  SetFrameData(-32768, &clipped_frame);
-  VerifyFramesAreEqual(clipped_frame, frame_);
-}
-
-TEST_F(AudioFrameOperationsTest, ScaleWithSatSucceeds) {
-  frame_.num_channels_ = 1;
-  SetFrameData(1, &frame_);
-  EXPECT_EQ(0, AudioFrameOperations::ScaleWithSat(2.0, &frame_));
-
-  AudioFrame scaled_frame;
-  scaled_frame.samples_per_channel_ = 320;
-  scaled_frame.num_channels_ = 1;
-  SetFrameData(2, &scaled_frame);
-  VerifyFramesAreEqual(scaled_frame, frame_);
-}
-
-TEST_F(AudioFrameOperationsTest, ScaleWithSatMuted) {
-  ASSERT_TRUE(frame_.muted());
-  EXPECT_EQ(0, AudioFrameOperations::ScaleWithSat(2.0, &frame_));
-  EXPECT_TRUE(frame_.muted());
-}
-
-TEST_F(AudioFrameOperationsTest, AddingXToEmptyGivesX) {
-  // When samples_per_channel_ is 0, the frame counts as empty and zero.
-  AudioFrame frame_to_add_to;
-  frame_to_add_to.mutable_data();  // Unmute the frame.
-  ASSERT_FALSE(frame_to_add_to.muted());
-  frame_to_add_to.samples_per_channel_ = 0;
-  frame_to_add_to.num_channels_ = frame_.num_channels_;
-
-  SetFrameData(1000, &frame_);
-  AudioFrameOperations::Add(frame_, &frame_to_add_to);
-  VerifyFramesAreEqual(frame_, frame_to_add_to);
-}
-
-TEST_F(AudioFrameOperationsTest, AddingXToMutedGivesX) {
-  AudioFrame frame_to_add_to;
-  ASSERT_TRUE(frame_to_add_to.muted());
-  frame_to_add_to.samples_per_channel_ = frame_.samples_per_channel_;
-  frame_to_add_to.num_channels_ = frame_.num_channels_;
-
-  SetFrameData(1000, &frame_);
-  AudioFrameOperations::Add(frame_, &frame_to_add_to);
-  VerifyFramesAreEqual(frame_, frame_to_add_to);
-}
-
-TEST_F(AudioFrameOperationsTest, AddingMutedToXGivesX) {
-  AudioFrame frame_to_add_to;
-  frame_to_add_to.samples_per_channel_ = frame_.samples_per_channel_;
-  frame_to_add_to.num_channels_ = frame_.num_channels_;
-  SetFrameData(1000, &frame_to_add_to);
-
-  AudioFrame frame_copy;
-  frame_copy.CopyFrom(frame_to_add_to);
-
-  ASSERT_TRUE(frame_.muted());
-  AudioFrameOperations::Add(frame_, &frame_to_add_to);
-  VerifyFramesAreEqual(frame_copy, frame_to_add_to);
-}
-
-TEST_F(AudioFrameOperationsTest, AddingTwoFramesProducesTheirSum) {
-  AudioFrame frame_to_add_to;
-  frame_to_add_to.samples_per_channel_ = frame_.samples_per_channel_;
-  frame_to_add_to.num_channels_ = frame_.num_channels_;
-  SetFrameData(1000, &frame_to_add_to);
-  SetFrameData(2000, &frame_);
-
-  AudioFrameOperations::Add(frame_, &frame_to_add_to);
-  SetFrameData(frame_.data()[0] + 1000, &frame_);
-  VerifyFramesAreEqual(frame_, frame_to_add_to);
-}
-
-}  // namespace
-}  // namespace webrtc
diff --git a/call/BUILD.gn b/call/BUILD.gn
deleted file mode 100644
index 706d502..0000000
--- a/call/BUILD.gn
+++ /dev/null
@@ -1,267 +0,0 @@
-# Copyright (c) 2015 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.
-
-import("../webrtc.gni")
-
-rtc_source_set("call_interfaces") {
-  sources = [
-    "audio_receive_stream.h",
-    "audio_send_stream.cc",
-    "audio_send_stream.h",
-    "audio_state.h",
-    "call.h",
-    "callfactoryinterface.h",
-    "flexfec_receive_stream.h",
-    "syncable.cc",
-    "syncable.h",
-  ]
-  deps = [
-    ":rtp_interfaces",
-    ":video_stream_api",
-    "..:webrtc_common",
-    "../api:audio_mixer_api",
-    "../api:libjingle_peerconnection_api",
-    "../api:optional",
-    "../api:transport_api",
-    "../api/audio_codecs:audio_codecs_api",
-    "../rtc_base:rtc_base",
-    "../rtc_base:rtc_base_approved",
-  ]
-}
-
-# TODO(nisse): These RTP targets should be moved elsewhere
-# when interfaces have stabilized. See also TODO for |mock_rtp_interfaces|.
-rtc_source_set("rtp_interfaces") {
-  sources = [
-    "rtcp_packet_sink_interface.h",
-    "rtp_config.cc",
-    "rtp_config.h",
-    "rtp_packet_sink_interface.h",
-    "rtp_stream_receiver_controller_interface.h",
-    "rtp_transport_controller_send_interface.h",
-  ]
-  deps = [
-    "../api:array_view",
-    "../rtc_base:rtc_base_approved",
-  ]
-}
-
-rtc_source_set("rtp_receiver") {
-  sources = [
-    "rtcp_demuxer.cc",
-    "rtcp_demuxer.h",
-    "rtp_demuxer.cc",
-    "rtp_demuxer.h",
-    "rtp_rtcp_demuxer_helper.cc",
-    "rtp_rtcp_demuxer_helper.h",
-    "rtp_stream_receiver_controller.cc",
-    "rtp_stream_receiver_controller.h",
-    "rtx_receive_stream.cc",
-    "rtx_receive_stream.h",
-    "ssrc_binding_observer.h",
-  ]
-  deps = [
-    ":rtp_interfaces",
-    "..:webrtc_common",
-    "../api:array_view",
-    "../api:optional",
-    "../modules/rtp_rtcp",
-    "../rtc_base:rtc_base_approved",
-  ]
-}
-
-rtc_source_set("rtp_sender") {
-  sources = [
-    "rtp_transport_controller_send.cc",
-    "rtp_transport_controller_send.h",
-  ]
-  deps = [
-    ":rtp_interfaces",
-    "..:webrtc_common",
-    "../modules/congestion_controller",
-    "../rtc_base:rtc_base_approved",
-  ]
-}
-
-rtc_static_library("call") {
-  sources = [
-    "bitrate_allocator.cc",
-    "call.cc",
-    "callfactory.cc",
-    "callfactory.h",
-    "flexfec_receive_stream_impl.cc",
-    "flexfec_receive_stream_impl.h",
-  ]
-
-  if (!build_with_chromium && is_clang) {
-    # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-    suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-  }
-
-  public_deps = [
-    ":call_interfaces",
-    "../api:call_api",
-    "../api:libjingle_peerconnection_api",
-  ]
-
-  deps = [
-    ":call_interfaces",
-    ":rtp_interfaces",
-    ":rtp_receiver",
-    ":rtp_sender",
-    ":video_stream_api",
-    "..:webrtc_common",
-    "../api:optional",
-    "../api:transport_api",
-    "../audio",
-    "../logging:rtc_event_log_api",
-    "../logging:rtc_event_log_impl",
-    "../modules/bitrate_controller",
-    "../modules/congestion_controller",
-    "../modules/pacing",
-    "../modules/rtp_rtcp",
-    "../modules/utility",
-    "../rtc_base:rtc_base_approved",
-    "../rtc_base:rtc_task_queue",
-    "../rtc_base:sequenced_task_checker",
-    "../system_wrappers",
-    "../video",
-  ]
-}
-
-rtc_source_set("video_stream_api") {
-  sources = [
-    "video_config.cc",
-    "video_config.h",
-    "video_receive_stream.cc",
-    "video_receive_stream.h",
-    "video_send_stream.cc",
-    "video_send_stream.h",
-  ]
-  deps = [
-    ":rtp_interfaces",
-    "../:webrtc_common",
-    "../api:libjingle_peerconnection_api",
-    "../api:optional",
-    "../api:transport_api",
-    "../common_video:common_video",
-    "../rtc_base:rtc_base_approved",
-  ]
-}
-
-if (rtc_include_tests) {
-  rtc_source_set("call_tests") {
-    testonly = true
-
-    # Skip restricting visibility on mobile platforms since the tests on those
-    # gets additional generated targets which would require many lines here to
-    # cover (which would be confusing to read and hard to maintain).
-    if (!is_android && !is_ios) {
-      visibility = [ "..:video_engine_tests" ]
-    }
-    sources = [
-      "bitrate_allocator_unittest.cc",
-      "bitrate_estimator_tests.cc",
-      "call_unittest.cc",
-      "flexfec_receive_stream_unittest.cc",
-      "rtcp_demuxer_unittest.cc",
-      "rtp_demuxer_unittest.cc",
-      "rtp_rtcp_demuxer_helper_unittest.cc",
-      "rtx_receive_stream_unittest.cc",
-    ]
-    deps = [
-      ":call",
-      ":mock_rtp_interfaces",
-      ":rtp_interfaces",
-      ":rtp_receiver",
-      ":rtp_sender",
-      "..:webrtc_common",
-      "../api:array_view",
-      "../api:mock_audio_mixer",
-      "../logging:rtc_event_log_api",
-      "../modules/audio_device:mock_audio_device",
-      "../modules/audio_mixer",
-      "../modules/bitrate_controller",
-      "../modules/congestion_controller:mock_congestion_controller",
-      "../modules/pacing",
-      "../modules/pacing:mock_paced_sender",
-      "../modules/rtp_rtcp",
-      "../modules/rtp_rtcp:mock_rtp_rtcp",
-      "../modules/utility:mock_process_thread",
-      "../rtc_base:rtc_base_approved",
-      "../system_wrappers",
-      "../test:audio_codec_mocks",
-      "../test:direct_transport",
-      "../test:test_common",
-      "../test:test_support",
-      "../test:video_test_common",
-      "//testing/gmock",
-      "//testing/gtest",
-    ]
-    if (!build_with_chromium && is_clang) {
-      # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-    }
-  }
-
-  rtc_source_set("call_perf_tests") {
-    testonly = true
-
-    # Skip restricting visibility on mobile platforms since the tests on those
-    # gets additional generated targets which would require many lines here to
-    # cover (which would be confusing to read and hard to maintain).
-    if (!is_android && !is_ios) {
-      visibility = [ "..:webrtc_perf_tests" ]
-    }
-    sources = [
-      "call_perf_tests.cc",
-      "rampup_tests.cc",
-      "rampup_tests.h",
-    ]
-    deps = [
-      ":call_interfaces",
-      ":video_stream_api",
-      "..:webrtc_common",
-      "../api/audio_codecs:builtin_audio_encoder_factory",
-      "../logging:rtc_event_log_api",
-      "../modules/audio_coding",
-      "../modules/audio_mixer:audio_mixer_impl",
-      "../modules/rtp_rtcp",
-      "../rtc_base:rtc_base_approved",
-      "../system_wrappers",
-      "../system_wrappers:metrics_default",
-      "../test:direct_transport",
-      "../test:fake_audio_device",
-      "../test:field_trial",
-      "../test:test_common",
-      "../test:test_support",
-      "../test:video_test_common",
-      "../video",
-      "../voice_engine",
-      "//testing/gtest",
-    ]
-    if (!build_with_chromium && is_clang) {
-      # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-    }
-  }
-
-  # TODO(eladalon): This should be moved, as with the TODO for |rtp_interfaces|.
-  rtc_source_set("mock_rtp_interfaces") {
-    testonly = true
-
-    sources = [
-      "test/mock_rtp_packet_sink_interface.h",
-    ]
-    deps = [
-      ":rtp_interfaces",
-      "../test:test_support",
-      "//testing/gmock",
-    ]
-  }
-}
diff --git a/call/DEPS b/call/DEPS
deleted file mode 100644
index 54dcebb..0000000
--- a/call/DEPS
+++ /dev/null
@@ -1,27 +0,0 @@
-include_rules = [
-  "+webrtc/audio",
-  "+webrtc/logging/rtc_event_log",
-  "+webrtc/modules/audio_coding",
-  "+webrtc/modules/audio_device",
-  "+webrtc/modules/audio_mixer",
-  "+webrtc/modules/audio_processing",
-  "+webrtc/modules/bitrate_controller",
-  "+webrtc/modules/congestion_controller",
-  "+webrtc/modules/pacing",
-  "+webrtc/modules/rtp_rtcp",
-  "+webrtc/modules/utility",
-  "+webrtc/system_wrappers",
-  "+webrtc/voice_engine",
-  "+webrtc/video",
-]
-
-specific_include_rules = {
-  "video_receive_stream\.h": [
-    "+webrtc/common_video/include",
-    "+webrtc/media/base",
-  ],
-  "video_send_stream\.h": [
-    "+webrtc/common_video/include",
-    "+webrtc/media/base",
-  ],
-}
diff --git a/call/OWNERS b/call/OWNERS
deleted file mode 100644
index 5ba9537..0000000
--- a/call/OWNERS
+++ /dev/null
@@ -1,9 +0,0 @@
-mflodman@webrtc.org
-pbos@webrtc.org
-solenberg@webrtc.org
-stefan@webrtc.org
-
-# These are for the common case of adding or renaming files. If you're doing
-# structural changes, please get a review from a reviewer in this file.
-per-file *.gn=*
-per-file *.gni=*
diff --git a/call/audio_receive_stream.h b/call/audio_receive_stream.h
deleted file mode 100644
index 6de62df..0000000
--- a/call/audio_receive_stream.h
+++ /dev/null
@@ -1,158 +0,0 @@
-/*
- *  Copyright (c) 2015 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_CALL_AUDIO_RECEIVE_STREAM_H_
-#define WEBRTC_CALL_AUDIO_RECEIVE_STREAM_H_
-
-#include <map>
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "webrtc/api/audio_codecs/audio_decoder_factory.h"
-#include "webrtc/api/call/transport.h"
-#include "webrtc/api/optional.h"
-#include "webrtc/api/rtpparameters.h"
-#include "webrtc/api/rtpreceiverinterface.h"
-#include "webrtc/call/rtp_config.h"
-#include "webrtc/common_types.h"
-#include "webrtc/rtc_base/scoped_ref_ptr.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-class AudioSinkInterface;
-
-// WORK IN PROGRESS
-// This class is under development and is not yet intended for for use outside
-// of WebRtc/Libjingle. Please use the VoiceEngine API instead.
-// See: https://bugs.chromium.org/p/webrtc/issues/detail?id=4690
-
-class AudioReceiveStream {
- public:
-  struct Stats {
-    uint32_t remote_ssrc = 0;
-    int64_t bytes_rcvd = 0;
-    uint32_t packets_rcvd = 0;
-    uint32_t packets_lost = 0;
-    float fraction_lost = 0.0f;
-    std::string codec_name;
-    rtc::Optional<int> codec_payload_type;
-    uint32_t ext_seqnum = 0;
-    uint32_t jitter_ms = 0;
-    uint32_t jitter_buffer_ms = 0;
-    uint32_t jitter_buffer_preferred_ms = 0;
-    uint32_t delay_estimate_ms = 0;
-    int32_t audio_level = -1;
-    // See description of "totalAudioEnergy" in the WebRTC stats spec:
-    // https://w3c.github.io/webrtc-stats/#dom-rtcmediastreamtrackstats-totalaudioenergy
-    double total_output_energy = 0.0;
-    // See description of "totalSamplesReceived" in the WebRTC stats spec:
-    // https://w3c.github.io/webrtc-stats/#dom-rtcmediastreamtrackstats-totalsamplesreceived
-    uint64_t total_samples_received = 0;
-    // See description of "totalSamplesDuration" in the WebRTC stats spec:
-    // https://w3c.github.io/webrtc-stats/#dom-rtcmediastreamtrackstats-totalsamplesduration
-    double total_output_duration = 0.0;
-    // See description of "concealedSamples" in the WebRTC stats spec:
-    // https://w3c.github.io/webrtc-stats/#dom-rtcmediastreamtrackstats-concealedsamples
-    uint64_t concealed_samples = 0;
-    float expand_rate = 0.0f;
-    float speech_expand_rate = 0.0f;
-    float secondary_decoded_rate = 0.0f;
-    float secondary_discarded_rate = 0.0f;
-    float accelerate_rate = 0.0f;
-    float preemptive_expand_rate = 0.0f;
-    int32_t decoding_calls_to_silence_generator = 0;
-    int32_t decoding_calls_to_neteq = 0;
-    int32_t decoding_normal = 0;
-    int32_t decoding_plc = 0;
-    int32_t decoding_cng = 0;
-    int32_t decoding_plc_cng = 0;
-    int32_t decoding_muted_output = 0;
-    int64_t capture_start_ntp_time_ms = 0;
-  };
-
-  struct Config {
-    std::string ToString() const;
-
-    // Receive-stream specific RTP settings.
-    struct Rtp {
-      std::string ToString() const;
-
-      // Synchronization source (stream identifier) to be received.
-      uint32_t remote_ssrc = 0;
-
-      // Sender SSRC used for sending RTCP (such as receiver reports).
-      uint32_t local_ssrc = 0;
-
-      // Enable feedback for send side bandwidth estimation.
-      // See
-      // https://tools.ietf.org/html/draft-holmer-rmcat-transport-wide-cc-extensions
-      // for details.
-      bool transport_cc = false;
-
-      // See NackConfig for description.
-      NackConfig nack;
-
-      // RTP header extensions used for the received stream.
-      std::vector<RtpExtension> extensions;
-    } rtp;
-
-    Transport* rtcp_send_transport = nullptr;
-
-    // Underlying VoiceEngine handle, used to map AudioReceiveStream to lower-
-    // level components.
-    // TODO(solenberg): Remove when VoiceEngine channels are created outside
-    // of Call.
-    int voe_channel_id = -1;
-
-    // Identifier for an A/V synchronization group. Empty string to disable.
-    // TODO(pbos): Synchronize streams in a sync group, not just one video
-    // stream to one audio stream. Tracked by issue webrtc:4762.
-    std::string sync_group;
-
-    // Decoder specifications for every payload type that we can receive.
-    std::map<int, SdpAudioFormat> decoder_map;
-
-    rtc::scoped_refptr<AudioDecoderFactory> decoder_factory;
-  };
-
-  // Starts stream activity.
-  // When a stream is active, it can receive, process and deliver packets.
-  virtual void Start() = 0;
-  // Stops stream activity.
-  // When a stream is stopped, it can't receive, process or deliver packets.
-  virtual void Stop() = 0;
-
-  virtual Stats GetStats() const = 0;
-  // TODO(solenberg): Remove, once AudioMonitor is gone.
-  virtual int GetOutputLevel() const = 0;
-
-  // Sets an audio sink that receives unmixed audio from the receive stream.
-  // Ownership of the sink is passed to the stream and can be used by the
-  // caller to do lifetime management (i.e. when the sink's dtor is called).
-  // Only one sink can be set and passing a null sink clears an existing one.
-  // NOTE: Audio must still somehow be pulled through AudioTransport for audio
-  // to stream through this sink. In practice, this happens if mixed audio
-  // is being pulled+rendered and/or if audio is being pulled for the purposes
-  // of feeding to the AEC.
-  virtual void SetSink(std::unique_ptr<AudioSinkInterface> sink) = 0;
-
-  // Sets playback gain of the stream, applied when mixing, and thus after it
-  // is potentially forwarded to any attached AudioSinkInterface implementation.
-  virtual void SetGain(float gain) = 0;
-
-  virtual std::vector<RtpSource> GetSources() const = 0;
-
- protected:
-  virtual ~AudioReceiveStream() {}
-};
-}  // namespace webrtc
-
-#endif  // WEBRTC_CALL_AUDIO_RECEIVE_STREAM_H_
diff --git a/call/audio_send_stream.cc b/call/audio_send_stream.cc
deleted file mode 100644
index 0bc555b..0000000
--- a/call/audio_send_stream.cc
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- *  Copyright (c) 2015 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/call/audio_send_stream.h"
-
-#include <string>
-
-namespace webrtc {
-
-AudioSendStream::Stats::Stats() = default;
-AudioSendStream::Stats::~Stats() = default;
-
-AudioSendStream::Config::Config(Transport* send_transport)
-    : send_transport(send_transport) {}
-
-AudioSendStream::Config::~Config() = default;
-
-std::string AudioSendStream::Config::ToString() const {
-  std::stringstream ss;
-  ss << "{rtp: " << rtp.ToString();
-  ss << ", send_transport: " << (send_transport ? "(Transport)" : "null");
-  ss << ", voe_channel_id: " << voe_channel_id;
-  ss << ", min_bitrate_bps: " << min_bitrate_bps;
-  ss << ", max_bitrate_bps: " << max_bitrate_bps;
-  ss << ", send_codec_spec: "
-     << (send_codec_spec ? send_codec_spec->ToString() : "<unset>");
-  ss << '}';
-  return ss.str();
-}
-
-AudioSendStream::Config::Rtp::Rtp() = default;
-
-AudioSendStream::Config::Rtp::~Rtp() = default;
-
-std::string AudioSendStream::Config::Rtp::ToString() const {
-  std::stringstream ss;
-  ss << "{ssrc: " << ssrc;
-  ss << ", extensions: [";
-  for (size_t i = 0; i < extensions.size(); ++i) {
-    ss << extensions[i].ToString();
-    if (i != extensions.size() - 1) {
-      ss << ", ";
-    }
-  }
-  ss << ']';
-  ss << ", nack: " << nack.ToString();
-  ss << ", c_name: " << c_name;
-  ss << '}';
-  return ss.str();
-}
-
-AudioSendStream::Config::SendCodecSpec::SendCodecSpec(
-    int payload_type,
-    const SdpAudioFormat& format)
-    : payload_type(payload_type), format(format) {}
-AudioSendStream::Config::SendCodecSpec::~SendCodecSpec() = default;
-
-std::string AudioSendStream::Config::SendCodecSpec::ToString() const {
-  std::stringstream ss;
-  ss << "{nack_enabled: " << (nack_enabled ? "true" : "false");
-  ss << ", transport_cc_enabled: " << (transport_cc_enabled ? "true" : "false");
-  ss << ", cng_payload_type: "
-     << (cng_payload_type ? std::to_string(*cng_payload_type) : "<unset>");
-  ss << ", payload_type: " << payload_type;
-  ss << ", format: " << format;
-  ss << '}';
-  return ss.str();
-}
-
-bool AudioSendStream::Config::SendCodecSpec::operator==(
-    const AudioSendStream::Config::SendCodecSpec& rhs) const {
-  if (nack_enabled == rhs.nack_enabled &&
-      transport_cc_enabled == rhs.transport_cc_enabled &&
-      cng_payload_type == rhs.cng_payload_type &&
-      payload_type == rhs.payload_type && format == rhs.format &&
-      target_bitrate_bps == rhs.target_bitrate_bps) {
-    return true;
-  }
-  return false;
-}
-}  // namespace webrtc
diff --git a/call/audio_send_stream.h b/call/audio_send_stream.h
deleted file mode 100644
index ac962c5..0000000
--- a/call/audio_send_stream.h
+++ /dev/null
@@ -1,160 +0,0 @@
-/*
- *  Copyright (c) 2015 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_CALL_AUDIO_SEND_STREAM_H_
-#define WEBRTC_CALL_AUDIO_SEND_STREAM_H_
-
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "webrtc/api/audio_codecs/audio_encoder.h"
-#include "webrtc/api/audio_codecs/audio_encoder_factory.h"
-#include "webrtc/api/audio_codecs/audio_format.h"
-#include "webrtc/api/call/transport.h"
-#include "webrtc/api/optional.h"
-#include "webrtc/api/rtpparameters.h"
-#include "webrtc/call/rtp_config.h"
-#include "webrtc/rtc_base/scoped_ref_ptr.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-// WORK IN PROGRESS
-// This class is under development and is not yet intended for for use outside
-// of WebRtc/Libjingle. Please use the VoiceEngine API instead.
-// See: https://bugs.chromium.org/p/webrtc/issues/detail?id=4690
-
-class AudioSendStream {
- public:
-  struct Stats {
-    Stats();
-    ~Stats();
-
-    // TODO(solenberg): Harmonize naming and defaults with receive stream stats.
-    uint32_t local_ssrc = 0;
-    int64_t bytes_sent = 0;
-    int32_t packets_sent = 0;
-    int32_t packets_lost = -1;
-    float fraction_lost = -1.0f;
-    std::string codec_name;
-    rtc::Optional<int> codec_payload_type;
-    int32_t ext_seqnum = -1;
-    int32_t jitter_ms = -1;
-    int64_t rtt_ms = -1;
-    int32_t audio_level = -1;
-    // See description of "totalAudioEnergy" in the WebRTC stats spec:
-    // https://w3c.github.io/webrtc-stats/#dom-rtcmediastreamtrackstats-totalaudioenergy
-    double total_input_energy = 0.0;
-    double total_input_duration = 0.0;
-    float aec_quality_min = -1.0f;
-    int32_t echo_delay_median_ms = -1;
-    int32_t echo_delay_std_ms = -1;
-    int32_t echo_return_loss = -100;
-    int32_t echo_return_loss_enhancement = -100;
-    float residual_echo_likelihood = -1.0f;
-    float residual_echo_likelihood_recent_max = -1.0f;
-    bool typing_noise_detected = false;
-    ANAStats ana_statistics;
-  };
-
-  struct Config {
-    Config() = delete;
-    explicit Config(Transport* send_transport);
-    ~Config();
-    std::string ToString() const;
-
-    // Send-stream specific RTP settings.
-    struct Rtp {
-      Rtp();
-      ~Rtp();
-      std::string ToString() const;
-
-      // Sender SSRC.
-      uint32_t ssrc = 0;
-
-      // RTP header extensions used for the sent stream.
-      std::vector<RtpExtension> extensions;
-
-      // See NackConfig for description.
-      NackConfig nack;
-
-      // RTCP CNAME, see RFC 3550.
-      std::string c_name;
-    } rtp;
-
-    // Transport for outgoing packets. The transport is expected to exist for
-    // the entire life of the AudioSendStream and is owned by the API client.
-    Transport* send_transport = nullptr;
-
-    // Underlying VoiceEngine handle, used to map AudioSendStream to lower-level
-    // components.
-    // TODO(solenberg): Remove when VoiceEngine channels are created outside
-    // of Call.
-    int voe_channel_id = -1;
-
-    // Bitrate limits used for variable audio bitrate streams. Set both to -1 to
-    // disable audio bitrate adaptation.
-    // Note: This is still an experimental feature and not ready for real usage.
-    int min_bitrate_bps = -1;
-    int max_bitrate_bps = -1;
-
-    // Defines whether to turn on audio network adaptor, and defines its config
-    // string.
-    rtc::Optional<std::string> audio_network_adaptor_config;
-
-    struct SendCodecSpec {
-      SendCodecSpec(int payload_type, const SdpAudioFormat& format);
-      ~SendCodecSpec();
-      std::string ToString() const;
-
-      bool operator==(const SendCodecSpec& rhs) const;
-      bool operator!=(const SendCodecSpec& rhs) const {
-        return !(*this == rhs);
-      }
-
-      int payload_type;
-      SdpAudioFormat format;
-      bool nack_enabled = false;
-      bool transport_cc_enabled = false;
-      rtc::Optional<int> cng_payload_type;
-      // If unset, use the encoder's default target bitrate.
-      rtc::Optional<int> target_bitrate_bps;
-    };
-
-    rtc::Optional<SendCodecSpec> send_codec_spec;
-    rtc::scoped_refptr<AudioEncoderFactory> encoder_factory;
-  };
-
-  virtual ~AudioSendStream() = default;
-
-  virtual const webrtc::AudioSendStream::Config& GetConfig() const = 0;
-
-  // Reconfigure the stream according to the Configuration.
-  virtual void Reconfigure(const Config& config) = 0;
-
-  // Starts stream activity.
-  // When a stream is active, it can receive, process and deliver packets.
-  virtual void Start() = 0;
-  // Stops stream activity.
-  // When a stream is stopped, it can't receive, process or deliver packets.
-  virtual void Stop() = 0;
-
-  // TODO(solenberg): Make payload_type a config property instead.
-  virtual bool SendTelephoneEvent(int payload_type, int payload_frequency,
-                                  int event, int duration_ms) = 0;
-
-  virtual void SetMuted(bool muted) = 0;
-
-  virtual Stats GetStats() const = 0;
-};
-}  // namespace webrtc
-
-#endif  // WEBRTC_CALL_AUDIO_SEND_STREAM_H_
diff --git a/call/audio_state.h b/call/audio_state.h
deleted file mode 100644
index 826b31d..0000000
--- a/call/audio_state.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- *  Copyright (c) 2015 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_CALL_AUDIO_STATE_H_
-#define WEBRTC_CALL_AUDIO_STATE_H_
-
-#include "webrtc/api/audio/audio_mixer.h"
-#include "webrtc/rtc_base/refcount.h"
-#include "webrtc/rtc_base/scoped_ref_ptr.h"
-
-namespace webrtc {
-
-class AudioProcessing;
-class VoiceEngine;
-
-// WORK IN PROGRESS
-// This class is under development and is not yet intended for for use outside
-// of WebRtc/Libjingle. Please use the VoiceEngine API instead.
-// See: https://bugs.chromium.org/p/webrtc/issues/detail?id=4690
-
-// AudioState holds the state which must be shared between multiple instances of
-// webrtc::Call for audio processing purposes.
-class AudioState : public rtc::RefCountInterface {
- public:
-  struct Config {
-    // VoiceEngine used for audio streams and audio/video synchronization.
-    // AudioState will tickle the VoE refcount to keep it alive for as long as
-    // the AudioState itself.
-    VoiceEngine* voice_engine = nullptr;
-
-    // The audio mixer connected to active receive streams. One per
-    // AudioState.
-    rtc::scoped_refptr<AudioMixer> audio_mixer;
-
-    // The audio processing module.
-    rtc::scoped_refptr<webrtc::AudioProcessing> audio_processing;
-  };
-
-  virtual AudioProcessing* audio_processing() = 0;
-
-  // TODO(solenberg): Replace scoped_refptr with shared_ptr once we can use it.
-  static rtc::scoped_refptr<AudioState> Create(
-      const AudioState::Config& config);
-
-  virtual ~AudioState() {}
-};
-}  // namespace webrtc
-
-#endif  // WEBRTC_CALL_AUDIO_STATE_H_
diff --git a/call/bitrate_allocator.cc b/call/bitrate_allocator.cc
deleted file mode 100644
index 1e22c00..0000000
--- a/call/bitrate_allocator.cc
+++ /dev/null
@@ -1,440 +0,0 @@
-/*
- *  Copyright (c) 2015 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/call/bitrate_allocator.h"
-
-#include <algorithm>
-#include <utility>
-
-#include "webrtc/modules/bitrate_controller/include/bitrate_controller.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/system_wrappers/include/clock.h"
-#include "webrtc/system_wrappers/include/metrics.h"
-
-namespace webrtc {
-
-// Allow packets to be transmitted in up to 2 times max video bitrate if the
-// bandwidth estimate allows it.
-const int kTransmissionMaxBitrateMultiplier = 2;
-const int kDefaultBitrateBps = 300000;
-
-// Require a bitrate increase of max(10%, 20kbps) to resume paused streams.
-const double kToggleFactor = 0.1;
-const uint32_t kMinToggleBitrateBps = 20000;
-
-const int64_t kBweLogIntervalMs = 5000;
-
-namespace {
-
-double MediaRatio(uint32_t allocated_bitrate, uint32_t protection_bitrate) {
-  RTC_DCHECK_GT(allocated_bitrate, 0);
-  if (protection_bitrate == 0)
-    return 1.0;
-
-  uint32_t media_bitrate = allocated_bitrate - protection_bitrate;
-  return media_bitrate / static_cast<double>(allocated_bitrate);
-}
-}  // namespace
-
-BitrateAllocator::BitrateAllocator(LimitObserver* limit_observer)
-    : limit_observer_(limit_observer),
-      bitrate_observer_configs_(),
-      last_bitrate_bps_(0),
-      last_non_zero_bitrate_bps_(kDefaultBitrateBps),
-      last_fraction_loss_(0),
-      last_rtt_(0),
-      num_pause_events_(0),
-      clock_(Clock::GetRealTimeClock()),
-      last_bwe_log_time_(0),
-      total_requested_padding_bitrate_(0),
-      total_requested_min_bitrate_(0) {
-  sequenced_checker_.Detach();
-}
-
-BitrateAllocator::~BitrateAllocator() {
-  RTC_HISTOGRAM_COUNTS_100("WebRTC.Call.NumberOfPauseEvents",
-                           num_pause_events_);
-}
-
-void BitrateAllocator::OnNetworkChanged(uint32_t target_bitrate_bps,
-                                        uint8_t fraction_loss,
-                                        int64_t rtt,
-                                        int64_t bwe_period_ms) {
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&sequenced_checker_);
-  last_bitrate_bps_ = target_bitrate_bps;
-  last_non_zero_bitrate_bps_ =
-      target_bitrate_bps > 0 ? target_bitrate_bps : last_non_zero_bitrate_bps_;
-  last_fraction_loss_ = fraction_loss;
-  last_rtt_ = rtt;
-  last_bwe_period_ms_ = bwe_period_ms;
-
-  // Periodically log the incoming BWE.
-  int64_t now = clock_->TimeInMilliseconds();
-  if (now > last_bwe_log_time_ + kBweLogIntervalMs) {
-    LOG(LS_INFO) << "Current BWE " << target_bitrate_bps;
-    last_bwe_log_time_ = now;
-  }
-
-  ObserverAllocation allocation = AllocateBitrates(target_bitrate_bps);
-
-  for (auto& config : bitrate_observer_configs_) {
-    uint32_t allocated_bitrate = allocation[config.observer];
-    uint32_t protection_bitrate = config.observer->OnBitrateUpdated(
-        allocated_bitrate, last_fraction_loss_, last_rtt_,
-        last_bwe_period_ms_);
-
-    if (allocated_bitrate == 0 && config.allocated_bitrate_bps > 0) {
-      if (target_bitrate_bps > 0)
-        ++num_pause_events_;
-      // The protection bitrate is an estimate based on the ratio between media
-      // and protection used before this observer was muted.
-      uint32_t predicted_protection_bps =
-          (1.0 - config.media_ratio) * config.min_bitrate_bps;
-      LOG(LS_INFO) << "Pausing observer " << config.observer
-                   << " with configured min bitrate " << config.min_bitrate_bps
-                   << " and current estimate of " << target_bitrate_bps
-                   << " and protection bitrate " << predicted_protection_bps;
-    } else if (allocated_bitrate > 0 && config.allocated_bitrate_bps == 0) {
-      if (target_bitrate_bps > 0)
-        ++num_pause_events_;
-      LOG(LS_INFO) << "Resuming observer " << config.observer
-                   << ", configured min bitrate " << config.min_bitrate_bps
-                   << ", current allocation " << allocated_bitrate
-                   << " and protection bitrate " << protection_bitrate;
-    }
-
-    // Only update the media ratio if the observer got an allocation.
-    if (allocated_bitrate > 0)
-      config.media_ratio = MediaRatio(allocated_bitrate, protection_bitrate);
-    config.allocated_bitrate_bps = allocated_bitrate;
-  }
-  UpdateAllocationLimits();
-}
-
-void BitrateAllocator::AddObserver(BitrateAllocatorObserver* observer,
-                                   uint32_t min_bitrate_bps,
-                                   uint32_t max_bitrate_bps,
-                                   uint32_t pad_up_bitrate_bps,
-                                   bool enforce_min_bitrate) {
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&sequenced_checker_);
-  auto it = FindObserverConfig(observer);
-
-  // Update settings if the observer already exists, create a new one otherwise.
-  if (it != bitrate_observer_configs_.end()) {
-    it->min_bitrate_bps = min_bitrate_bps;
-    it->max_bitrate_bps = max_bitrate_bps;
-    it->pad_up_bitrate_bps = pad_up_bitrate_bps;
-    it->enforce_min_bitrate = enforce_min_bitrate;
-  } else {
-    bitrate_observer_configs_.push_back(
-        ObserverConfig(observer, min_bitrate_bps, max_bitrate_bps,
-                       pad_up_bitrate_bps, enforce_min_bitrate));
-  }
-
-  ObserverAllocation allocation;
-  if (last_bitrate_bps_ > 0) {
-    // Calculate a new allocation and update all observers.
-    allocation = AllocateBitrates(last_bitrate_bps_);
-    for (auto& config : bitrate_observer_configs_) {
-      uint32_t allocated_bitrate = allocation[config.observer];
-      uint32_t protection_bitrate = config.observer->OnBitrateUpdated(
-          allocated_bitrate, last_fraction_loss_, last_rtt_,
-          last_bwe_period_ms_);
-      config.allocated_bitrate_bps = allocated_bitrate;
-      if (allocated_bitrate > 0)
-        config.media_ratio = MediaRatio(allocated_bitrate, protection_bitrate);
-    }
-  } else {
-    // Currently, an encoder is not allowed to produce frames.
-    // But we still have to return the initial config bitrate + let the
-    // observer know that it can not produce frames.
-    allocation = AllocateBitrates(last_non_zero_bitrate_bps_);
-    observer->OnBitrateUpdated(0, last_fraction_loss_, last_rtt_,
-                               last_bwe_period_ms_);
-  }
-  UpdateAllocationLimits();
-}
-
-void BitrateAllocator::UpdateAllocationLimits() {
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&sequenced_checker_);
-  uint32_t total_requested_padding_bitrate = 0;
-  uint32_t total_requested_min_bitrate = 0;
-
-  for (const auto& config : bitrate_observer_configs_) {
-    uint32_t stream_padding = config.pad_up_bitrate_bps;
-    if (config.enforce_min_bitrate) {
-      total_requested_min_bitrate += config.min_bitrate_bps;
-    } else if (config.allocated_bitrate_bps == 0) {
-      stream_padding =
-          std::max(MinBitrateWithHysteresis(config), stream_padding);
-    }
-    total_requested_padding_bitrate += stream_padding;
-  }
-
-  if (total_requested_padding_bitrate == total_requested_padding_bitrate_ &&
-      total_requested_min_bitrate == total_requested_min_bitrate_) {
-    return;
-  }
-
-  total_requested_min_bitrate_ = total_requested_min_bitrate;
-  total_requested_padding_bitrate_ = total_requested_padding_bitrate;
-
-  LOG(LS_INFO) << "UpdateAllocationLimits : total_requested_min_bitrate: "
-               << total_requested_min_bitrate
-               << "bps, total_requested_padding_bitrate: "
-               << total_requested_padding_bitrate << "bps";
-  limit_observer_->OnAllocationLimitsChanged(total_requested_min_bitrate,
-                                             total_requested_padding_bitrate);
-}
-
-void BitrateAllocator::RemoveObserver(BitrateAllocatorObserver* observer) {
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&sequenced_checker_);
-  auto it = FindObserverConfig(observer);
-  if (it != bitrate_observer_configs_.end()) {
-    bitrate_observer_configs_.erase(it);
-  }
-
-  UpdateAllocationLimits();
-}
-
-int BitrateAllocator::GetStartBitrate(BitrateAllocatorObserver* observer) {
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&sequenced_checker_);
-  const auto& it = FindObserverConfig(observer);
-  if (it == bitrate_observer_configs_.end()) {
-    // This observer hasn't been added yet, just give it its fair share.
-    return last_non_zero_bitrate_bps_ /
-           static_cast<int>((bitrate_observer_configs_.size() + 1));
-  } else if (it->allocated_bitrate_bps == -1) {
-    // This observer hasn't received an allocation yet, so do the same.
-    return last_non_zero_bitrate_bps_ /
-           static_cast<int>(bitrate_observer_configs_.size());
-  } else {
-    // This observer already has an allocation.
-    return it->allocated_bitrate_bps;
-  }
-}
-
-BitrateAllocator::ObserverConfigs::iterator
-BitrateAllocator::FindObserverConfig(const BitrateAllocatorObserver* observer) {
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&sequenced_checker_);
-  for (auto it = bitrate_observer_configs_.begin();
-       it != bitrate_observer_configs_.end(); ++it) {
-    if (it->observer == observer)
-      return it;
-  }
-  return bitrate_observer_configs_.end();
-}
-
-BitrateAllocator::ObserverAllocation BitrateAllocator::AllocateBitrates(
-    uint32_t bitrate) {
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&sequenced_checker_);
-  if (bitrate_observer_configs_.empty())
-    return ObserverAllocation();
-
-  if (bitrate == 0)
-    return ZeroRateAllocation();
-
-  uint32_t sum_min_bitrates = 0;
-  uint32_t sum_max_bitrates = 0;
-  for (const auto& observer_config : bitrate_observer_configs_) {
-    sum_min_bitrates += observer_config.min_bitrate_bps;
-    sum_max_bitrates += observer_config.max_bitrate_bps;
-  }
-
-  // Not enough for all observers to get an allocation, allocate according to:
-  // enforced min bitrate -> allocated bitrate previous round -> restart paused
-  // streams.
-  if (!EnoughBitrateForAllObservers(bitrate, sum_min_bitrates))
-    return LowRateAllocation(bitrate);
-
-  // All observers will get their min bitrate plus an even share of the rest.
-  if (bitrate <= sum_max_bitrates)
-    return NormalRateAllocation(bitrate, sum_min_bitrates);
-
-  // All observers will get up to kTransmissionMaxBitrateMultiplier x max.
-  return MaxRateAllocation(bitrate, sum_max_bitrates);
-}
-
-BitrateAllocator::ObserverAllocation BitrateAllocator::ZeroRateAllocation() {
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&sequenced_checker_);
-  ObserverAllocation allocation;
-  for (const auto& observer_config : bitrate_observer_configs_)
-    allocation[observer_config.observer] = 0;
-  return allocation;
-}
-
-BitrateAllocator::ObserverAllocation BitrateAllocator::LowRateAllocation(
-    uint32_t bitrate) {
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&sequenced_checker_);
-  ObserverAllocation allocation;
-  // Start by allocating bitrate to observers enforcing a min bitrate, hence
-  // remaining_bitrate might turn negative.
-  int64_t remaining_bitrate = bitrate;
-  for (const auto& observer_config : bitrate_observer_configs_) {
-    int32_t allocated_bitrate = 0;
-    if (observer_config.enforce_min_bitrate)
-      allocated_bitrate = observer_config.min_bitrate_bps;
-
-    allocation[observer_config.observer] = allocated_bitrate;
-    remaining_bitrate -= allocated_bitrate;
-  }
-
-  // Allocate bitrate to all previously active streams.
-  if (remaining_bitrate > 0) {
-    for (const auto& observer_config : bitrate_observer_configs_) {
-      if (observer_config.enforce_min_bitrate ||
-          LastAllocatedBitrate(observer_config) == 0)
-        continue;
-
-      uint32_t required_bitrate = MinBitrateWithHysteresis(observer_config);
-      if (remaining_bitrate >= required_bitrate) {
-        allocation[observer_config.observer] = required_bitrate;
-        remaining_bitrate -= required_bitrate;
-      }
-    }
-  }
-
-  // Allocate bitrate to previously paused streams.
-  if (remaining_bitrate > 0) {
-    for (const auto& observer_config : bitrate_observer_configs_) {
-      if (LastAllocatedBitrate(observer_config) != 0)
-        continue;
-
-      // Add a hysteresis to avoid toggling.
-      uint32_t required_bitrate = MinBitrateWithHysteresis(observer_config);
-      if (remaining_bitrate >= required_bitrate) {
-        allocation[observer_config.observer] = required_bitrate;
-        remaining_bitrate -= required_bitrate;
-      }
-    }
-  }
-
-  // Split a possible remainder evenly on all streams with an allocation.
-  if (remaining_bitrate > 0)
-    DistributeBitrateEvenly(remaining_bitrate, false, 1, &allocation);
-
-  RTC_DCHECK_EQ(allocation.size(), bitrate_observer_configs_.size());
-  return allocation;
-}
-
-BitrateAllocator::ObserverAllocation BitrateAllocator::NormalRateAllocation(
-    uint32_t bitrate,
-    uint32_t sum_min_bitrates) {
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&sequenced_checker_);
-  ObserverAllocation allocation;
-  for (const auto& observer_config : bitrate_observer_configs_)
-    allocation[observer_config.observer] = observer_config.min_bitrate_bps;
-
-  bitrate -= sum_min_bitrates;
-  if (bitrate > 0)
-    DistributeBitrateEvenly(bitrate, true, 1, &allocation);
-
-  return allocation;
-}
-
-BitrateAllocator::ObserverAllocation BitrateAllocator::MaxRateAllocation(
-    uint32_t bitrate,
-    uint32_t sum_max_bitrates) {
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&sequenced_checker_);
-  ObserverAllocation allocation;
-
-  for (const auto& observer_config : bitrate_observer_configs_) {
-    allocation[observer_config.observer] = observer_config.max_bitrate_bps;
-    bitrate -= observer_config.max_bitrate_bps;
-  }
-  DistributeBitrateEvenly(bitrate, true, kTransmissionMaxBitrateMultiplier,
-                          &allocation);
-  return allocation;
-}
-
-uint32_t BitrateAllocator::LastAllocatedBitrate(
-    const ObserverConfig& observer_config) {
-  // Return the configured minimum bitrate for newly added observers, to avoid
-  // requiring an extra high bitrate for the observer to get an allocated
-  // bitrate.
-  return observer_config.allocated_bitrate_bps == -1
-             ? observer_config.min_bitrate_bps
-             : observer_config.allocated_bitrate_bps;
-}
-
-uint32_t BitrateAllocator::MinBitrateWithHysteresis(
-    const ObserverConfig& observer_config) {
-  uint32_t min_bitrate = observer_config.min_bitrate_bps;
-  if (LastAllocatedBitrate(observer_config) == 0) {
-    min_bitrate += std::max(static_cast<uint32_t>(kToggleFactor * min_bitrate),
-                            kMinToggleBitrateBps);
-  }
-  // Account for protection bitrate used by this observer in the previous
-  // allocation.
-  // Note: the ratio will only be updated when the stream is active, meaning a
-  // paused stream won't get any ratio updates. This might lead to waiting a bit
-  // longer than necessary if the network condition improves, but this is to
-  // avoid too much toggling.
-  if (observer_config.media_ratio > 0.0 && observer_config.media_ratio < 1.0)
-    min_bitrate += min_bitrate * (1.0 - observer_config.media_ratio);
-
-  return min_bitrate;
-}
-
-void BitrateAllocator::DistributeBitrateEvenly(uint32_t bitrate,
-                                               bool include_zero_allocations,
-                                               int max_multiplier,
-                                               ObserverAllocation* allocation) {
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&sequenced_checker_);
-  RTC_DCHECK_EQ(allocation->size(), bitrate_observer_configs_.size());
-
-  ObserverSortingMap list_max_bitrates;
-  for (const auto& observer_config : bitrate_observer_configs_) {
-    if (include_zero_allocations ||
-        allocation->at(observer_config.observer) != 0) {
-      list_max_bitrates.insert(std::pair<uint32_t, const ObserverConfig*>(
-          observer_config.max_bitrate_bps, &observer_config));
-    }
-  }
-  auto it = list_max_bitrates.begin();
-  while (it != list_max_bitrates.end()) {
-    RTC_DCHECK_GT(bitrate, 0);
-    uint32_t extra_allocation =
-        bitrate / static_cast<uint32_t>(list_max_bitrates.size());
-    uint32_t total_allocation =
-        extra_allocation + allocation->at(it->second->observer);
-    bitrate -= extra_allocation;
-    if (total_allocation > max_multiplier * it->first) {
-      // There is more than we can fit for this observer, carry over to the
-      // remaining observers.
-      bitrate += total_allocation - max_multiplier * it->first;
-      total_allocation = max_multiplier * it->first;
-    }
-    // Finally, update the allocation for this observer.
-    allocation->at(it->second->observer) = total_allocation;
-    it = list_max_bitrates.erase(it);
-  }
-}
-
-bool BitrateAllocator::EnoughBitrateForAllObservers(uint32_t bitrate,
-                                                    uint32_t sum_min_bitrates) {
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&sequenced_checker_);
-  if (bitrate < sum_min_bitrates)
-    return false;
-
-  uint32_t extra_bitrate_per_observer =
-      (bitrate - sum_min_bitrates) /
-      static_cast<uint32_t>(bitrate_observer_configs_.size());
-  for (const auto& observer_config : bitrate_observer_configs_) {
-    if (observer_config.min_bitrate_bps + extra_bitrate_per_observer <
-        MinBitrateWithHysteresis(observer_config)) {
-      return false;
-    }
-  }
-  return true;
-}
-}  // namespace webrtc
diff --git a/call/bitrate_allocator.h b/call/bitrate_allocator.h
deleted file mode 100644
index b9bbc93..0000000
--- a/call/bitrate_allocator.h
+++ /dev/null
@@ -1,172 +0,0 @@
-/*
- *  Copyright (c) 2015 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_CALL_BITRATE_ALLOCATOR_H_
-#define WEBRTC_CALL_BITRATE_ALLOCATOR_H_
-
-#include <stdint.h>
-
-#include <map>
-#include <utility>
-#include <vector>
-
-#include "webrtc/rtc_base/sequenced_task_checker.h"
-
-namespace webrtc {
-
-class Clock;
-
-// Used by all send streams with adaptive bitrate, to get the currently
-// allocated bitrate for the send stream. The current network properties are
-// given at the same time, to let the send stream decide about possible loss
-// protection.
-class BitrateAllocatorObserver {
- public:
-  // Returns the amount of protection used by the BitrateAllocatorObserver
-  // implementation, as bitrate in bps.
-  virtual uint32_t OnBitrateUpdated(uint32_t bitrate_bps,
-                                    uint8_t fraction_loss,
-                                    int64_t rtt,
-                                    int64_t bwe_period_ms) = 0;
-
- protected:
-  virtual ~BitrateAllocatorObserver() {}
-};
-
-// Usage: this class will register multiple RtcpBitrateObserver's one at each
-// RTCP module. It will aggregate the results and run one bandwidth estimation
-// and push the result to the encoders via BitrateAllocatorObserver(s).
-class BitrateAllocator {
- public:
-  // Used to get notified when send stream limits such as the minimum send
-  // bitrate and max padding bitrate is changed.
-  class LimitObserver {
-   public:
-    virtual void OnAllocationLimitsChanged(
-        uint32_t min_send_bitrate_bps,
-        uint32_t max_padding_bitrate_bps) = 0;
-
-   protected:
-    virtual ~LimitObserver() {}
-  };
-
-  explicit BitrateAllocator(LimitObserver* limit_observer);
-  ~BitrateAllocator();
-
-  // Allocate target_bitrate across the registered BitrateAllocatorObservers.
-  void OnNetworkChanged(uint32_t target_bitrate_bps,
-                        uint8_t fraction_loss,
-                        int64_t rtt,
-                        int64_t bwe_period_ms);
-
-  // Set the start and max send bitrate used by the bandwidth management.
-  //
-  // |observer| updates bitrates if already in use.
-  // |min_bitrate_bps| = 0 equals no min bitrate.
-  // |max_bitrate_bps| = 0 equals no max bitrate.
-  // |enforce_min_bitrate| = 'true' will allocate at least |min_bitrate_bps| for
-  //    this observer, even if the BWE is too low, 'false' will allocate 0 to
-  //    the observer if BWE doesn't allow |min_bitrate_bps|.
-  // Note that |observer|->OnBitrateUpdated() will be called within the scope of
-  // this method with the current rtt, fraction_loss and available bitrate and
-  // that the bitrate in OnBitrateUpdated will be zero if the |observer| is
-  // currently not allowed to send data.
-  void AddObserver(BitrateAllocatorObserver* observer,
-                   uint32_t min_bitrate_bps,
-                   uint32_t max_bitrate_bps,
-                   uint32_t pad_up_bitrate_bps,
-                   bool enforce_min_bitrate);
-
-  // Removes a previously added observer, but will not trigger a new bitrate
-  // allocation.
-  void RemoveObserver(BitrateAllocatorObserver* observer);
-
-  // Returns initial bitrate allocated for |observer|. If |observer| is not in
-  // the list of added observers, a best guess is returned.
-  int GetStartBitrate(BitrateAllocatorObserver* observer);
-
- private:
-  // Note: All bitrates for member variables and methods are in bps.
-  struct ObserverConfig {
-    ObserverConfig(BitrateAllocatorObserver* observer,
-                   uint32_t min_bitrate_bps,
-                   uint32_t max_bitrate_bps,
-                   uint32_t pad_up_bitrate_bps,
-                   bool enforce_min_bitrate)
-        : observer(observer),
-          min_bitrate_bps(min_bitrate_bps),
-          max_bitrate_bps(max_bitrate_bps),
-          pad_up_bitrate_bps(pad_up_bitrate_bps),
-          enforce_min_bitrate(enforce_min_bitrate),
-          allocated_bitrate_bps(-1),
-          media_ratio(1.0) {}
-
-    BitrateAllocatorObserver* observer;
-    uint32_t min_bitrate_bps;
-    uint32_t max_bitrate_bps;
-    uint32_t pad_up_bitrate_bps;
-    bool enforce_min_bitrate;
-    int64_t allocated_bitrate_bps;
-    double media_ratio;  // Part of the total bitrate used for media [0.0, 1.0].
-  };
-
-  // Calculates the minimum requested send bitrate and max padding bitrate and
-  // calls LimitObserver::OnAllocationLimitsChanged.
-  void UpdateAllocationLimits();
-
-  typedef std::vector<ObserverConfig> ObserverConfigs;
-  ObserverConfigs::iterator FindObserverConfig(
-      const BitrateAllocatorObserver* observer);
-
-  typedef std::multimap<uint32_t, const ObserverConfig*> ObserverSortingMap;
-  typedef std::map<BitrateAllocatorObserver*, int> ObserverAllocation;
-
-  ObserverAllocation AllocateBitrates(uint32_t bitrate);
-
-  ObserverAllocation ZeroRateAllocation();
-  ObserverAllocation LowRateAllocation(uint32_t bitrate);
-  ObserverAllocation NormalRateAllocation(uint32_t bitrate,
-                                          uint32_t sum_min_bitrates);
-  ObserverAllocation MaxRateAllocation(uint32_t bitrate,
-                                       uint32_t sum_max_bitrates);
-
-  uint32_t LastAllocatedBitrate(const ObserverConfig& observer_config);
-  // The minimum bitrate required by this observer, including enable-hysteresis
-  // if the observer is in a paused state.
-  uint32_t MinBitrateWithHysteresis(const ObserverConfig& observer_config);
-  // Splits |bitrate| evenly to observers already in |allocation|.
-  // |include_zero_allocations| decides if zero allocations should be part of
-  // the distribution or not. The allowed max bitrate is |max_multiplier| x
-  // observer max bitrate.
-  void DistributeBitrateEvenly(uint32_t bitrate,
-                               bool include_zero_allocations,
-                               int max_multiplier,
-                               ObserverAllocation* allocation);
-  bool EnoughBitrateForAllObservers(uint32_t bitrate,
-                                    uint32_t sum_min_bitrates);
-
-  rtc::SequencedTaskChecker sequenced_checker_;
-  LimitObserver* const limit_observer_ RTC_GUARDED_BY(&sequenced_checker_);
-  // Stored in a list to keep track of the insertion order.
-  ObserverConfigs bitrate_observer_configs_ RTC_GUARDED_BY(&sequenced_checker_);
-  uint32_t last_bitrate_bps_ RTC_GUARDED_BY(&sequenced_checker_);
-  uint32_t last_non_zero_bitrate_bps_ RTC_GUARDED_BY(&sequenced_checker_);
-  uint8_t last_fraction_loss_ RTC_GUARDED_BY(&sequenced_checker_);
-  int64_t last_rtt_ RTC_GUARDED_BY(&sequenced_checker_);
-  int64_t last_bwe_period_ms_ RTC_GUARDED_BY(&sequenced_checker_);
-  // Number of mute events based on too low BWE, not network up/down.
-  int num_pause_events_ RTC_GUARDED_BY(&sequenced_checker_);
-  Clock* const clock_ RTC_GUARDED_BY(&sequenced_checker_);
-  int64_t last_bwe_log_time_ RTC_GUARDED_BY(&sequenced_checker_);
-  uint32_t total_requested_padding_bitrate_ RTC_GUARDED_BY(&sequenced_checker_);
-  uint32_t total_requested_min_bitrate_ RTC_GUARDED_BY(&sequenced_checker_);
-};
-}  // namespace webrtc
-#endif  // WEBRTC_CALL_BITRATE_ALLOCATOR_H_
diff --git a/call/bitrate_allocator_unittest.cc b/call/bitrate_allocator_unittest.cc
deleted file mode 100644
index ead4cbd..0000000
--- a/call/bitrate_allocator_unittest.cc
+++ /dev/null
@@ -1,522 +0,0 @@
-/*
- *  Copyright (c) 2012 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 <algorithm>
-#include <memory>
-#include <vector>
-
-#include "webrtc/call/bitrate_allocator.h"
-#include "webrtc/modules/bitrate_controller/include/bitrate_controller.h"
-#include "webrtc/test/gmock.h"
-#include "webrtc/test/gtest.h"
-
-using testing::NiceMock;
-
-namespace webrtc {
-
-class MockLimitObserver : public BitrateAllocator::LimitObserver {
- public:
-  MOCK_METHOD2(OnAllocationLimitsChanged,
-               void(uint32_t min_send_bitrate_bps,
-                    uint32_t max_padding_bitrate_bps));
-};
-
-class TestBitrateObserver : public BitrateAllocatorObserver {
- public:
-  TestBitrateObserver()
-      : last_bitrate_bps_(0),
-        last_fraction_loss_(0),
-        last_rtt_ms_(0),
-        last_probing_interval_ms_(0),
-        protection_ratio_(0.0) {}
-
-  void SetBitrateProtectionRatio(double protection_ratio) {
-    protection_ratio_ = protection_ratio;
-  }
-
-  uint32_t OnBitrateUpdated(uint32_t bitrate_bps,
-                            uint8_t fraction_loss,
-                            int64_t rtt,
-                            int64_t probing_interval_ms) override {
-    last_bitrate_bps_ = bitrate_bps;
-    last_fraction_loss_ = fraction_loss;
-    last_rtt_ms_ = rtt;
-    last_probing_interval_ms_ = probing_interval_ms;
-    return bitrate_bps * protection_ratio_;
-  }
-  uint32_t last_bitrate_bps_;
-  uint8_t last_fraction_loss_;
-  int64_t last_rtt_ms_;
-  int last_probing_interval_ms_;
-  double protection_ratio_;
-};
-
-namespace {
-constexpr int64_t kDefaultProbingIntervalMs = 3000;
-}
-
-class BitrateAllocatorTest : public ::testing::Test {
- protected:
-  BitrateAllocatorTest() : allocator_(new BitrateAllocator(&limit_observer_)) {
-    allocator_->OnNetworkChanged(300000u, 0, 0, kDefaultProbingIntervalMs);
-  }
-  ~BitrateAllocatorTest() {}
-
-  NiceMock<MockLimitObserver> limit_observer_;
-  std::unique_ptr<BitrateAllocator> allocator_;
-};
-
-TEST_F(BitrateAllocatorTest, UpdatingBitrateObserver) {
-  TestBitrateObserver bitrate_observer;
-  const uint32_t kMinSendBitrateBps = 100000;
-  const uint32_t kPadUpToBitrateBps = 50000;
-
-  EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(kMinSendBitrateBps,
-                                                         kPadUpToBitrateBps));
-  allocator_->AddObserver(&bitrate_observer, kMinSendBitrateBps, 1500000,
-                          kPadUpToBitrateBps, true);
-  EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer));
-  allocator_->OnNetworkChanged(200000, 0, 0, kDefaultProbingIntervalMs);
-  EXPECT_EQ(200000, allocator_->GetStartBitrate(&bitrate_observer));
-
-  // TODO(pbos): Expect capping to 1.5M instead of 3M when not boosting the max
-  // bitrate for FEC/retransmissions (see todo in BitrateAllocator).
-  allocator_->OnNetworkChanged(4000000, 0, 0, kDefaultProbingIntervalMs);
-  EXPECT_EQ(3000000, allocator_->GetStartBitrate(&bitrate_observer));
-
-  // Expect |max_padding_bitrate_bps| to change to 0 if the observer is updated.
-  EXPECT_CALL(limit_observer_,
-              OnAllocationLimitsChanged(kMinSendBitrateBps, 0));
-  allocator_->AddObserver(&bitrate_observer, kMinSendBitrateBps, 4000000, 0,
-                          true);
-  EXPECT_EQ(4000000, allocator_->GetStartBitrate(&bitrate_observer));
-
-  allocator_->AddObserver(&bitrate_observer, kMinSendBitrateBps, 1500000, 0,
-                          true);
-  EXPECT_EQ(3000000, allocator_->GetStartBitrate(&bitrate_observer));
-  EXPECT_EQ(3000000u, bitrate_observer.last_bitrate_bps_);
-  allocator_->OnNetworkChanged(1500000, 0, 0, kDefaultProbingIntervalMs);
-  EXPECT_EQ(1500000u, bitrate_observer.last_bitrate_bps_);
-}
-
-TEST_F(BitrateAllocatorTest, TwoBitrateObserversOneRtcpObserver) {
-  TestBitrateObserver bitrate_observer_1;
-  TestBitrateObserver bitrate_observer_2;
-  EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(100000, 0));
-  allocator_->AddObserver(&bitrate_observer_1, 100000, 300000, 0, true);
-  EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
-  EXPECT_CALL(limit_observer_,
-              OnAllocationLimitsChanged(100000 + 200000, 0));
-  allocator_->AddObserver(&bitrate_observer_2, 200000, 300000, 0, true);
-  EXPECT_EQ(200000, allocator_->GetStartBitrate(&bitrate_observer_2));
-
-  // Test too low start bitrate, hence lower than sum of min. Min bitrates
-  // will
-  // be allocated to all observers.
-  allocator_->OnNetworkChanged(200000, 0, 50, kDefaultProbingIntervalMs);
-  EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
-  EXPECT_EQ(0, bitrate_observer_1.last_fraction_loss_);
-  EXPECT_EQ(50, bitrate_observer_1.last_rtt_ms_);
-  EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_);
-  EXPECT_EQ(0, bitrate_observer_2.last_fraction_loss_);
-  EXPECT_EQ(50, bitrate_observer_2.last_rtt_ms_);
-
-  // Test a bitrate which should be distributed equally.
-  allocator_->OnNetworkChanged(500000, 0, 50, kDefaultProbingIntervalMs);
-  const uint32_t kBitrateToShare = 500000 - 200000 - 100000;
-  EXPECT_EQ(100000u + kBitrateToShare / 2,
-            bitrate_observer_1.last_bitrate_bps_);
-  EXPECT_EQ(200000u + kBitrateToShare / 2,
-            bitrate_observer_2.last_bitrate_bps_);
-
-  // Limited by 2x max bitrates since we leave room for FEC and
-  // retransmissions.
-  allocator_->OnNetworkChanged(1500000, 0, 50, kDefaultProbingIntervalMs);
-  EXPECT_EQ(600000u, bitrate_observer_1.last_bitrate_bps_);
-  EXPECT_EQ(600000u, bitrate_observer_2.last_bitrate_bps_);
-
-  // Verify that if the bandwidth estimate is set to zero, the allocated
-  // rate is
-  // zero.
-  allocator_->OnNetworkChanged(0, 0, 50, kDefaultProbingIntervalMs);
-  EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
-  EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
-}
-
-TEST_F(BitrateAllocatorTest, RemoveObserverTriggersLimitObserver) {
-  TestBitrateObserver bitrate_observer;
-  const uint32_t kMinSendBitrateBps = 100000;
-  const uint32_t kPadUpToBitrateBps = 50000;
-
-  EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(kMinSendBitrateBps,
-                                                         kPadUpToBitrateBps));
-  allocator_->AddObserver(&bitrate_observer, kMinSendBitrateBps, 1500000,
-                          kPadUpToBitrateBps, true);
-  EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 0));
-  allocator_->RemoveObserver(&bitrate_observer);
-}
-
-class BitrateAllocatorTestNoEnforceMin : public ::testing::Test {
- protected:
-  BitrateAllocatorTestNoEnforceMin()
-      : allocator_(new BitrateAllocator(&limit_observer_)) {
-    allocator_->OnNetworkChanged(300000u, 0, 0, kDefaultProbingIntervalMs);
-  }
-  ~BitrateAllocatorTestNoEnforceMin() {}
-
-  NiceMock<MockLimitObserver> limit_observer_;
-  std::unique_ptr<BitrateAllocator> allocator_;
-};
-
-// The following three tests verify enforcing a minimum bitrate works as
-// intended.
-TEST_F(BitrateAllocatorTestNoEnforceMin, OneBitrateObserver) {
-  TestBitrateObserver bitrate_observer_1;
-  // Expect OnAllocationLimitsChanged with |min_send_bitrate_bps| = 0 since
-  // AddObserver is called with |enforce_min_bitrate| = false.
-  EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 120000));
-  allocator_->AddObserver(&bitrate_observer_1, 100000, 400000, 0, false);
-  EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
-
-  // High BWE.
-  allocator_->OnNetworkChanged(150000, 0, 0, kDefaultProbingIntervalMs);
-  EXPECT_EQ(150000u, bitrate_observer_1.last_bitrate_bps_);
-
-  // Low BWE.
-  allocator_->OnNetworkChanged(10000, 0, 0, kDefaultProbingIntervalMs);
-  EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
-
-  EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 0));
-  allocator_->RemoveObserver(&bitrate_observer_1);
-}
-
-TEST_F(BitrateAllocatorTestNoEnforceMin, ThreeBitrateObservers) {
-  TestBitrateObserver bitrate_observer_1;
-  TestBitrateObserver bitrate_observer_2;
-  TestBitrateObserver bitrate_observer_3;
-  // Set up the observers with min bitrates at 100000, 200000, and 300000.
-  allocator_->AddObserver(&bitrate_observer_1, 100000, 400000, 0, false);
-  EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
-
-  allocator_->AddObserver(&bitrate_observer_2, 200000, 400000, 0, false);
-  EXPECT_EQ(200000, allocator_->GetStartBitrate(&bitrate_observer_2));
-  EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
-
-  allocator_->AddObserver(&bitrate_observer_3, 300000, 400000, 0, false);
-  EXPECT_EQ(0, allocator_->GetStartBitrate(&bitrate_observer_3));
-  EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
-  EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_);
-
-  // High BWE. Make sure the controllers get a fair share of the surplus (i.e.,
-  // what is left after each controller gets its min rate).
-  allocator_->OnNetworkChanged(690000, 0, 0, kDefaultProbingIntervalMs);
-  // Verify that each observer gets its min rate (sum of min rates is 600000),
-  // and that the remaining 90000 is divided equally among the three.
-  uint32_t bitrate_to_share = 690000u - 100000u - 200000u - 300000u;
-  EXPECT_EQ(100000u + bitrate_to_share / 3,
-            bitrate_observer_1.last_bitrate_bps_);
-  EXPECT_EQ(200000u + bitrate_to_share / 3,
-            bitrate_observer_2.last_bitrate_bps_);
-  EXPECT_EQ(300000u + bitrate_to_share / 3,
-            bitrate_observer_3.last_bitrate_bps_);
-
-  // BWE below the sum of observer's min bitrate.
-  allocator_->OnNetworkChanged(300000, 0, 0, kDefaultProbingIntervalMs);
-  EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);  // Min bitrate.
-  EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_);  // Min bitrate.
-  EXPECT_EQ(0u, bitrate_observer_3.last_bitrate_bps_);  // Nothing.
-
-  // Increased BWE, but still below the sum of configured min bitrates for all
-  // observers and too little for observer 3. 1 and 2 will share the rest.
-  allocator_->OnNetworkChanged(500000, 0, 0, kDefaultProbingIntervalMs);
-  EXPECT_EQ(200000u, bitrate_observer_1.last_bitrate_bps_);  // Min + split.
-  EXPECT_EQ(300000u, bitrate_observer_2.last_bitrate_bps_);  // Min + split.
-  EXPECT_EQ(0u, bitrate_observer_3.last_bitrate_bps_);  // Nothing.
-
-  // Below min for all.
-  allocator_->OnNetworkChanged(10000, 0, 0, kDefaultProbingIntervalMs);
-  EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
-  EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
-  EXPECT_EQ(0u, bitrate_observer_3.last_bitrate_bps_);
-
-  // Verify that zero estimated bandwidth, means that that all gets zero,
-  // regardless of set min bitrate.
-  allocator_->OnNetworkChanged(0, 0, 0, kDefaultProbingIntervalMs);
-  EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
-  EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
-  EXPECT_EQ(0u, bitrate_observer_3.last_bitrate_bps_);
-
-  allocator_->RemoveObserver(&bitrate_observer_1);
-  allocator_->RemoveObserver(&bitrate_observer_2);
-  allocator_->RemoveObserver(&bitrate_observer_3);
-}
-
-TEST_F(BitrateAllocatorTestNoEnforceMin, OneBitrateObserverWithPacketLoss) {
-  TestBitrateObserver bitrate_observer;
-  // Expect OnAllocationLimitsChanged with |min_send_bitrate_bps| = 0 since
-  // AddObserver is called with |enforce_min_bitrate| = false.
-  EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 168000));
-  allocator_->AddObserver(
-      &bitrate_observer, 100000, 400000, 0, false);
-  EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer));
-
-  // High BWE.
-  allocator_->OnNetworkChanged(150000, 0, 0, kDefaultProbingIntervalMs);
-  EXPECT_EQ(150000u, bitrate_observer.last_bitrate_bps_);
-
-  // Add loss and use a part of the bitrate for protection.
-  double protection_ratio = 0.4;
-  uint8_t fraction_loss = protection_ratio * 256;
-  bitrate_observer.SetBitrateProtectionRatio(protection_ratio);
-  allocator_->OnNetworkChanged(200000, 0, fraction_loss,
-                               kDefaultProbingIntervalMs);
-  EXPECT_EQ(200000u, bitrate_observer.last_bitrate_bps_);
-
-  // Above the min threshold, but not enough given the protection used.
-  allocator_->OnNetworkChanged(139000, 0, fraction_loss,
-                               kDefaultProbingIntervalMs);
-  EXPECT_EQ(0u, bitrate_observer.last_bitrate_bps_);
-
-  // Verify the hysteresis is added for the protection.
-  allocator_->OnNetworkChanged(150000, 0, fraction_loss,
-                               kDefaultProbingIntervalMs);
-  EXPECT_EQ(0u, bitrate_observer.last_bitrate_bps_);
-
-  // Just enough to enable video again.
-  EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(0, 0));
-  allocator_->OnNetworkChanged(168000, 0, fraction_loss,
-                               kDefaultProbingIntervalMs);
-  EXPECT_EQ(168000u, bitrate_observer.last_bitrate_bps_);
-
-  // Remove all protection and make sure video is not paused as earlier.
-  bitrate_observer.SetBitrateProtectionRatio(0.0);
-  allocator_->OnNetworkChanged(140000, 0, 0, kDefaultProbingIntervalMs);
-  EXPECT_EQ(140000u, bitrate_observer.last_bitrate_bps_);
-
-  allocator_->OnNetworkChanged(139000, 0, 0, kDefaultProbingIntervalMs);
-  EXPECT_EQ(139000u, bitrate_observer.last_bitrate_bps_);
-
-  allocator_->RemoveObserver(&bitrate_observer);
-}
-
-TEST_F(BitrateAllocatorTestNoEnforceMin, TwoBitrateObserverWithPacketLoss) {
-  TestBitrateObserver bitrate_observer_1;
-  TestBitrateObserver bitrate_observer_2;
-
-  allocator_->AddObserver(&bitrate_observer_1, 100000, 400000, 0, false);
-  EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
-  allocator_->AddObserver(&bitrate_observer_2, 200000, 400000, 0, false);
-  EXPECT_EQ(200000, allocator_->GetStartBitrate(&bitrate_observer_2));
-  EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
-
-  // Enough bitrate for both.
-  bitrate_observer_2.SetBitrateProtectionRatio(0.5);
-  allocator_->OnNetworkChanged(300000, 0, 0, kDefaultProbingIntervalMs);
-  EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
-  EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_);
-
-  // Above min for observer 2, but too little given the protection used.
-  allocator_->OnNetworkChanged(330000, 0, 0, kDefaultProbingIntervalMs);
-  EXPECT_EQ(330000u, bitrate_observer_1.last_bitrate_bps_);
-  EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
-
-  allocator_->OnNetworkChanged(100000, 0, 0, kDefaultProbingIntervalMs);
-  EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
-  EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
-
-  allocator_->OnNetworkChanged(99999, 0, 0, kDefaultProbingIntervalMs);
-  EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
-  EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
-
-  allocator_->OnNetworkChanged(119000, 0, 0, kDefaultProbingIntervalMs);
-  EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
-  EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
-
-  allocator_->OnNetworkChanged(120000, 0, 0, kDefaultProbingIntervalMs);
-  EXPECT_EQ(120000u, bitrate_observer_1.last_bitrate_bps_);
-  EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
-
-  // Verify the protection is accounted for before resuming observer 2.
-  allocator_->OnNetworkChanged(429000, 0, 0, kDefaultProbingIntervalMs);
-  EXPECT_EQ(400000u, bitrate_observer_1.last_bitrate_bps_);
-  EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
-
-  allocator_->OnNetworkChanged(430000, 0, 0, kDefaultProbingIntervalMs);
-  EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
-  EXPECT_EQ(330000u, bitrate_observer_2.last_bitrate_bps_);
-
-  allocator_->RemoveObserver(&bitrate_observer_1);
-  allocator_->RemoveObserver(&bitrate_observer_2);
-}
-
-TEST_F(BitrateAllocatorTest, ThreeBitrateObserversLowBweEnforceMin) {
-  TestBitrateObserver bitrate_observer_1;
-  TestBitrateObserver bitrate_observer_2;
-  TestBitrateObserver bitrate_observer_3;
-
-  allocator_->AddObserver(&bitrate_observer_1, 100000, 400000, 0, true);
-  EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
-
-  allocator_->AddObserver(&bitrate_observer_2, 200000, 400000, 0, true);
-  EXPECT_EQ(200000, allocator_->GetStartBitrate(&bitrate_observer_2));
-  EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);
-
-  allocator_->AddObserver(&bitrate_observer_3, 300000, 400000, 0, true);
-  EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_3));
-  EXPECT_EQ(100000, static_cast<int>(bitrate_observer_1.last_bitrate_bps_));
-  EXPECT_EQ(200000, static_cast<int>(bitrate_observer_2.last_bitrate_bps_));
-
-  // Low BWE. Verify that all observers still get their respective min
-  // bitrate.
-  allocator_->OnNetworkChanged(1000, 0, 0, kDefaultProbingIntervalMs);
-  EXPECT_EQ(100000u, bitrate_observer_1.last_bitrate_bps_);  // Min cap.
-  EXPECT_EQ(200000u, bitrate_observer_2.last_bitrate_bps_);  // Min cap.
-  EXPECT_EQ(300000u, bitrate_observer_3.last_bitrate_bps_);  // Min cap.
-
-  allocator_->RemoveObserver(&bitrate_observer_1);
-  allocator_->RemoveObserver(&bitrate_observer_2);
-  allocator_->RemoveObserver(&bitrate_observer_3);
-}
-
-TEST_F(BitrateAllocatorTest, AddObserverWhileNetworkDown) {
-  TestBitrateObserver bitrate_observer_1;
-  EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(50000, 0));
-
-  allocator_->AddObserver(&bitrate_observer_1, 50000, 400000, 0, true);
-  EXPECT_EQ(300000, allocator_->GetStartBitrate(&bitrate_observer_1));
-
-  // Set network down, ie, no available bitrate.
-  allocator_->OnNetworkChanged(0, 0, 0, kDefaultProbingIntervalMs);
-
-  EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
-
-  TestBitrateObserver bitrate_observer_2;
-  // Adding an observer while the network is down should not affect the limits.
-  EXPECT_CALL(limit_observer_, OnAllocationLimitsChanged(50000 + 50000, 0));
-  allocator_->AddObserver(&bitrate_observer_2, 50000, 400000, 0, true);
-
-  // Expect the start_bitrate to be set as if the network was still up but that
-  // the new observer have been notified that the network is down.
-  EXPECT_EQ(300000 / 2, allocator_->GetStartBitrate(&bitrate_observer_2));
-  EXPECT_EQ(0u, bitrate_observer_1.last_bitrate_bps_);
-  EXPECT_EQ(0u, bitrate_observer_2.last_bitrate_bps_);
-
-  // Set network back up.
-  allocator_->OnNetworkChanged(1500000, 0, 50, kDefaultProbingIntervalMs);
-  EXPECT_EQ(750000u, bitrate_observer_1.last_bitrate_bps_);
-  EXPECT_EQ(750000u, bitrate_observer_2.last_bitrate_bps_);
-}
-
-TEST_F(BitrateAllocatorTest, MixedEnforecedConfigs) {
-  TestBitrateObserver enforced_observer;
-  allocator_->AddObserver(&enforced_observer, 6000, 30000, 0, true);
-  EXPECT_EQ(60000, allocator_->GetStartBitrate(&enforced_observer));
-
-  TestBitrateObserver not_enforced_observer;
-  allocator_->AddObserver(&not_enforced_observer, 30000, 2500000, 0, false);
-  EXPECT_EQ(270000, allocator_->GetStartBitrate(&not_enforced_observer));
-  EXPECT_EQ(30000u, enforced_observer.last_bitrate_bps_);
-
-  allocator_->OnNetworkChanged(36000, 0, 50, kDefaultProbingIntervalMs);
-  EXPECT_EQ(6000u, enforced_observer.last_bitrate_bps_);
-  EXPECT_EQ(30000u, not_enforced_observer.last_bitrate_bps_);
-
-  allocator_->OnNetworkChanged(35000, 0, 50, kDefaultProbingIntervalMs);
-  EXPECT_EQ(30000u, enforced_observer.last_bitrate_bps_);
-  EXPECT_EQ(0u, not_enforced_observer.last_bitrate_bps_);
-
-  allocator_->OnNetworkChanged(5000, 0, 50, kDefaultProbingIntervalMs);
-  EXPECT_EQ(6000u, enforced_observer.last_bitrate_bps_);
-  EXPECT_EQ(0u, not_enforced_observer.last_bitrate_bps_);
-
-  allocator_->OnNetworkChanged(36000, 0, 50, kDefaultProbingIntervalMs);
-  EXPECT_EQ(30000u, enforced_observer.last_bitrate_bps_);
-  EXPECT_EQ(0u, not_enforced_observer.last_bitrate_bps_);
-
-  allocator_->OnNetworkChanged(55000, 0, 50, kDefaultProbingIntervalMs);
-  EXPECT_EQ(30000u, enforced_observer.last_bitrate_bps_);
-  EXPECT_EQ(0u, not_enforced_observer.last_bitrate_bps_);
-
-  allocator_->OnNetworkChanged(56000, 0, 50, kDefaultProbingIntervalMs);
-  EXPECT_EQ(6000u, enforced_observer.last_bitrate_bps_);
-  EXPECT_EQ(50000u, not_enforced_observer.last_bitrate_bps_);
-
-  allocator_->OnNetworkChanged(56000, 0, 50, kDefaultProbingIntervalMs);
-  EXPECT_EQ(16000u, enforced_observer.last_bitrate_bps_);
-  EXPECT_EQ(40000u, not_enforced_observer.last_bitrate_bps_);
-
-  allocator_->RemoveObserver(&enforced_observer);
-  allocator_->RemoveObserver(&not_enforced_observer);
-}
-
-TEST_F(BitrateAllocatorTest, AvoidToggleAbsolute) {
-  TestBitrateObserver observer;
-  allocator_->AddObserver(&observer, 30000, 300000, 0, false);
-  EXPECT_EQ(300000, allocator_->GetStartBitrate(&observer));
-
-  allocator_->OnNetworkChanged(30000, 0, 50, kDefaultProbingIntervalMs);
-  EXPECT_EQ(30000u, observer.last_bitrate_bps_);
-
-  allocator_->OnNetworkChanged(20000, 0, 50, kDefaultProbingIntervalMs);
-  EXPECT_EQ(0u, observer.last_bitrate_bps_);
-
-  allocator_->OnNetworkChanged(30000, 0, 50, kDefaultProbingIntervalMs);
-  EXPECT_EQ(0u, observer.last_bitrate_bps_);
-
-  allocator_->OnNetworkChanged(49000, 0, 50, kDefaultProbingIntervalMs);
-  EXPECT_EQ(0u, observer.last_bitrate_bps_);
-
-  allocator_->OnNetworkChanged(50000, 0, 50, kDefaultProbingIntervalMs);
-  EXPECT_EQ(50000u, observer.last_bitrate_bps_);
-
-  allocator_->OnNetworkChanged(30000, 0, 50, kDefaultProbingIntervalMs);
-  EXPECT_EQ(30000u, observer.last_bitrate_bps_);
-
-  allocator_->RemoveObserver(&observer);
-}
-
-TEST_F(BitrateAllocatorTest, AvoidTogglePercent) {
-  TestBitrateObserver observer;
-  allocator_->AddObserver(&observer, 300000, 600000, 0, false);
-  EXPECT_EQ(300000, allocator_->GetStartBitrate(&observer));
-
-  allocator_->OnNetworkChanged(300000, 0, 50, kDefaultProbingIntervalMs);
-  EXPECT_EQ(300000u, observer.last_bitrate_bps_);
-
-  allocator_->OnNetworkChanged(200000, 0, 50, kDefaultProbingIntervalMs);
-  EXPECT_EQ(0u, observer.last_bitrate_bps_);
-
-  allocator_->OnNetworkChanged(300000, 0, 50, kDefaultProbingIntervalMs);
-  EXPECT_EQ(0u, observer.last_bitrate_bps_);
-
-  allocator_->OnNetworkChanged(329000, 0, 50, kDefaultProbingIntervalMs);
-  EXPECT_EQ(0u, observer.last_bitrate_bps_);
-
-  allocator_->OnNetworkChanged(330000, 0, 50, kDefaultProbingIntervalMs);
-  EXPECT_EQ(330000u, observer.last_bitrate_bps_);
-
-  allocator_->OnNetworkChanged(300000, 0, 50, kDefaultProbingIntervalMs);
-  EXPECT_EQ(300000u, observer.last_bitrate_bps_);
-
-  allocator_->RemoveObserver(&observer);
-}
-
-TEST_F(BitrateAllocatorTest, PassProbingInterval) {
-  TestBitrateObserver observer;
-  allocator_->AddObserver(&observer, 300000, 600000, 0, false);
-  EXPECT_EQ(300000, allocator_->GetStartBitrate(&observer));
-
-  allocator_->OnNetworkChanged(300000, 0, 50, 5000);
-  EXPECT_EQ(5000, observer.last_probing_interval_ms_);
-
-  allocator_->RemoveObserver(&observer);
-}
-
-}  // namespace webrtc
diff --git a/call/bitrate_estimator_tests.cc b/call/bitrate_estimator_tests.cc
deleted file mode 100644
index 49f149b..0000000
--- a/call/bitrate_estimator_tests.cc
+++ /dev/null
@@ -1,324 +0,0 @@
-/*
- *  Copyright (c) 2013 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 <functional>
-#include <list>
-#include <memory>
-#include <string>
-
-#include "webrtc/call/call.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/event.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/thread_annotations.h"
-#include "webrtc/test/call_test.h"
-#include "webrtc/test/direct_transport.h"
-#include "webrtc/test/encoder_settings.h"
-#include "webrtc/test/fake_decoder.h"
-#include "webrtc/test/fake_encoder.h"
-#include "webrtc/test/frame_generator_capturer.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-namespace {
-// Note: If you consider to re-use this class, think twice and instead consider
-// writing tests that don't depend on the logging system.
-class LogObserver {
- public:
-  LogObserver() { rtc::LogMessage::AddLogToStream(&callback_, rtc::LS_INFO); }
-
-  ~LogObserver() { rtc::LogMessage::RemoveLogToStream(&callback_); }
-
-  void PushExpectedLogLine(const std::string& expected_log_line) {
-    callback_.PushExpectedLogLine(expected_log_line);
-  }
-
-  bool Wait() { return callback_.Wait(); }
-
- private:
-  class Callback : public rtc::LogSink {
-   public:
-    Callback() : done_(false, false) {}
-
-    void OnLogMessage(const std::string& message) override {
-      rtc::CritScope lock(&crit_sect_);
-      // Ignore log lines that are due to missing AST extensions, these are
-      // logged when we switch back from AST to TOF until the wrapping bitrate
-      // estimator gives up on using AST.
-      if (message.find("BitrateEstimator") != std::string::npos &&
-          message.find("packet is missing") == std::string::npos) {
-        received_log_lines_.push_back(message);
-      }
-
-      int num_popped = 0;
-      while (!received_log_lines_.empty() && !expected_log_lines_.empty()) {
-        std::string a = received_log_lines_.front();
-        std::string b = expected_log_lines_.front();
-        received_log_lines_.pop_front();
-        expected_log_lines_.pop_front();
-        num_popped++;
-        EXPECT_TRUE(a.find(b) != std::string::npos) << a << " != " << b;
-      }
-      if (expected_log_lines_.size() <= 0) {
-        if (num_popped > 0) {
-          done_.Set();
-        }
-        return;
-      }
-    }
-
-    bool Wait() { return done_.Wait(test::CallTest::kDefaultTimeoutMs); }
-
-    void PushExpectedLogLine(const std::string& expected_log_line) {
-      rtc::CritScope lock(&crit_sect_);
-      expected_log_lines_.push_back(expected_log_line);
-    }
-
-   private:
-    typedef std::list<std::string> Strings;
-    rtc::CriticalSection crit_sect_;
-    Strings received_log_lines_ RTC_GUARDED_BY(crit_sect_);
-    Strings expected_log_lines_ RTC_GUARDED_BY(crit_sect_);
-    rtc::Event done_;
-  };
-
-  Callback callback_;
-};
-}  // namespace
-
-static const int kTOFExtensionId = 4;
-static const int kASTExtensionId = 5;
-
-class BitrateEstimatorTest : public test::CallTest {
- public:
-  BitrateEstimatorTest() : receive_config_(nullptr) {}
-
-  virtual ~BitrateEstimatorTest() { EXPECT_TRUE(streams_.empty()); }
-
-  virtual void SetUp() {
-    task_queue_.SendTask([this]() {
-      Call::Config config(event_log_.get());
-      receiver_call_.reset(Call::Create(config));
-      sender_call_.reset(Call::Create(config));
-
-      send_transport_.reset(new test::DirectTransport(
-          &task_queue_, sender_call_.get(), payload_type_map_));
-      send_transport_->SetReceiver(receiver_call_->Receiver());
-      receive_transport_.reset(new test::DirectTransport(
-          &task_queue_, receiver_call_.get(), payload_type_map_));
-      receive_transport_->SetReceiver(sender_call_->Receiver());
-
-      video_send_config_ = VideoSendStream::Config(send_transport_.get());
-      video_send_config_.rtp.ssrcs.push_back(kVideoSendSsrcs[0]);
-      // Encoders will be set separately per stream.
-      video_send_config_.encoder_settings.encoder = nullptr;
-      video_send_config_.encoder_settings.payload_name = "FAKE";
-      video_send_config_.encoder_settings.payload_type =
-          kFakeVideoSendPayloadType;
-      test::FillEncoderConfiguration(1, &video_encoder_config_);
-
-      receive_config_ = VideoReceiveStream::Config(receive_transport_.get());
-      // receive_config_.decoders will be set by every stream separately.
-      receive_config_.rtp.remote_ssrc = video_send_config_.rtp.ssrcs[0];
-      receive_config_.rtp.local_ssrc = kReceiverLocalVideoSsrc;
-      receive_config_.rtp.remb = true;
-      receive_config_.rtp.extensions.push_back(
-          RtpExtension(RtpExtension::kTimestampOffsetUri, kTOFExtensionId));
-      receive_config_.rtp.extensions.push_back(
-          RtpExtension(RtpExtension::kAbsSendTimeUri, kASTExtensionId));
-    });
-  }
-
-  virtual void TearDown() {
-    task_queue_.SendTask([this]() {
-      std::for_each(streams_.begin(), streams_.end(),
-                    std::mem_fun(&Stream::StopSending));
-
-      while (!streams_.empty()) {
-        delete streams_.back();
-        streams_.pop_back();
-      }
-
-      send_transport_.reset();
-      receive_transport_.reset();
-
-      receiver_call_.reset();
-      sender_call_.reset();
-    });
-  }
-
- protected:
-  friend class Stream;
-
-  class Stream {
-   public:
-    explicit Stream(BitrateEstimatorTest* test)
-        : test_(test),
-          is_sending_receiving_(false),
-          send_stream_(nullptr),
-          frame_generator_capturer_(),
-          fake_encoder_(Clock::GetRealTimeClock()),
-          fake_decoder_() {
-      test_->video_send_config_.rtp.ssrcs[0]++;
-      test_->video_send_config_.encoder_settings.encoder = &fake_encoder_;
-      send_stream_ = test_->sender_call_->CreateVideoSendStream(
-          test_->video_send_config_.Copy(),
-          test_->video_encoder_config_.Copy());
-      RTC_DCHECK_EQ(1, test_->video_encoder_config_.number_of_streams);
-      frame_generator_capturer_.reset(test::FrameGeneratorCapturer::Create(
-          kDefaultWidth, kDefaultHeight, kDefaultFramerate,
-          Clock::GetRealTimeClock()));
-      send_stream_->SetSource(
-          frame_generator_capturer_.get(),
-          VideoSendStream::DegradationPreference::kMaintainFramerate);
-      send_stream_->Start();
-      frame_generator_capturer_->Start();
-
-      VideoReceiveStream::Decoder decoder;
-      decoder.decoder = &fake_decoder_;
-      decoder.payload_type =
-          test_->video_send_config_.encoder_settings.payload_type;
-      decoder.payload_name =
-          test_->video_send_config_.encoder_settings.payload_name;
-      test_->receive_config_.decoders.clear();
-      test_->receive_config_.decoders.push_back(decoder);
-      test_->receive_config_.rtp.remote_ssrc =
-          test_->video_send_config_.rtp.ssrcs[0];
-      test_->receive_config_.rtp.local_ssrc++;
-      test_->receive_config_.renderer = &test->fake_renderer_;
-      video_receive_stream_ = test_->receiver_call_->CreateVideoReceiveStream(
-          test_->receive_config_.Copy());
-      video_receive_stream_->Start();
-      is_sending_receiving_ = true;
-    }
-
-    ~Stream() {
-      EXPECT_FALSE(is_sending_receiving_);
-      test_->sender_call_->DestroyVideoSendStream(send_stream_);
-      frame_generator_capturer_.reset(nullptr);
-      send_stream_ = nullptr;
-      if (video_receive_stream_) {
-        test_->receiver_call_->DestroyVideoReceiveStream(video_receive_stream_);
-        video_receive_stream_ = nullptr;
-      }
-    }
-
-    void StopSending() {
-      if (is_sending_receiving_) {
-        frame_generator_capturer_->Stop();
-        send_stream_->Stop();
-        if (video_receive_stream_) {
-          video_receive_stream_->Stop();
-        }
-        is_sending_receiving_ = false;
-      }
-    }
-
-   private:
-    BitrateEstimatorTest* test_;
-    bool is_sending_receiving_;
-    VideoSendStream* send_stream_;
-    VideoReceiveStream* video_receive_stream_;
-    std::unique_ptr<test::FrameGeneratorCapturer> frame_generator_capturer_;
-    test::FakeEncoder fake_encoder_;
-    test::FakeDecoder fake_decoder_;
-  };
-
-  LogObserver receiver_log_;
-  std::unique_ptr<test::DirectTransport> send_transport_;
-  std::unique_ptr<test::DirectTransport> receive_transport_;
-  std::unique_ptr<Call> sender_call_;
-  std::unique_ptr<Call> receiver_call_;
-  VideoReceiveStream::Config receive_config_;
-  std::vector<Stream*> streams_;
-};
-
-static const char* kAbsSendTimeLog =
-    "RemoteBitrateEstimatorAbsSendTime: Instantiating.";
-static const char* kSingleStreamLog =
-    "RemoteBitrateEstimatorSingleStream: Instantiating.";
-
-TEST_F(BitrateEstimatorTest, InstantiatesTOFPerDefaultForVideo) {
-  task_queue_.SendTask([this]() {
-    video_send_config_.rtp.extensions.push_back(
-        RtpExtension(RtpExtension::kTimestampOffsetUri, kTOFExtensionId));
-    receiver_log_.PushExpectedLogLine(kSingleStreamLog);
-    receiver_log_.PushExpectedLogLine(kSingleStreamLog);
-    streams_.push_back(new Stream(this));
-  });
-  EXPECT_TRUE(receiver_log_.Wait());
-}
-
-TEST_F(BitrateEstimatorTest, ImmediatelySwitchToASTForVideo) {
-  task_queue_.SendTask([this]() {
-    video_send_config_.rtp.extensions.push_back(
-        RtpExtension(RtpExtension::kAbsSendTimeUri, kASTExtensionId));
-    receiver_log_.PushExpectedLogLine(kSingleStreamLog);
-    receiver_log_.PushExpectedLogLine(kSingleStreamLog);
-    receiver_log_.PushExpectedLogLine("Switching to absolute send time RBE.");
-    receiver_log_.PushExpectedLogLine(kAbsSendTimeLog);
-    streams_.push_back(new Stream(this));
-  });
-  EXPECT_TRUE(receiver_log_.Wait());
-}
-
-TEST_F(BitrateEstimatorTest, SwitchesToASTForVideo) {
-  task_queue_.SendTask([this]() {
-    video_send_config_.rtp.extensions.push_back(
-        RtpExtension(RtpExtension::kTimestampOffsetUri, kTOFExtensionId));
-    receiver_log_.PushExpectedLogLine(kSingleStreamLog);
-    receiver_log_.PushExpectedLogLine(kSingleStreamLog);
-    streams_.push_back(new Stream(this));
-  });
-  EXPECT_TRUE(receiver_log_.Wait());
-
-  task_queue_.SendTask([this]() {
-    video_send_config_.rtp.extensions[0] =
-        RtpExtension(RtpExtension::kAbsSendTimeUri, kASTExtensionId);
-    receiver_log_.PushExpectedLogLine("Switching to absolute send time RBE.");
-    receiver_log_.PushExpectedLogLine(kAbsSendTimeLog);
-    streams_.push_back(new Stream(this));
-  });
-  EXPECT_TRUE(receiver_log_.Wait());
-}
-
-// This test is flaky. See webrtc:5790.
-TEST_F(BitrateEstimatorTest, DISABLED_SwitchesToASTThenBackToTOFForVideo) {
-  task_queue_.SendTask([this]() {
-    video_send_config_.rtp.extensions.push_back(
-        RtpExtension(RtpExtension::kTimestampOffsetUri, kTOFExtensionId));
-    receiver_log_.PushExpectedLogLine(kSingleStreamLog);
-    receiver_log_.PushExpectedLogLine(kAbsSendTimeLog);
-    receiver_log_.PushExpectedLogLine(kSingleStreamLog);
-    streams_.push_back(new Stream(this));
-  });
-  EXPECT_TRUE(receiver_log_.Wait());
-
-  task_queue_.SendTask([this]() {
-    video_send_config_.rtp.extensions[0] =
-        RtpExtension(RtpExtension::kAbsSendTimeUri, kASTExtensionId);
-    receiver_log_.PushExpectedLogLine(kAbsSendTimeLog);
-    receiver_log_.PushExpectedLogLine("Switching to absolute send time RBE.");
-    streams_.push_back(new Stream(this));
-  });
-  EXPECT_TRUE(receiver_log_.Wait());
-
-  task_queue_.SendTask([this]() {
-    video_send_config_.rtp.extensions[0] =
-        RtpExtension(RtpExtension::kTimestampOffsetUri, kTOFExtensionId);
-    receiver_log_.PushExpectedLogLine(kAbsSendTimeLog);
-    receiver_log_.PushExpectedLogLine(
-        "WrappingBitrateEstimator: Switching to transmission time offset RBE.");
-    streams_.push_back(new Stream(this));
-    streams_[0]->StopSending();
-    streams_[1]->StopSending();
-  });
-  EXPECT_TRUE(receiver_log_.Wait());
-}
-}  // namespace webrtc
diff --git a/call/call.cc b/call/call.cc
deleted file mode 100644
index b7cd059..0000000
--- a/call/call.cc
+++ /dev/null
@@ -1,1447 +0,0 @@
-/*
- *  Copyright (c) 2013 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 <string.h>
-#include <algorithm>
-#include <map>
-#include <memory>
-#include <set>
-#include <utility>
-#include <vector>
-
-#include "webrtc/api/optional.h"
-#include "webrtc/audio/audio_receive_stream.h"
-#include "webrtc/audio/audio_send_stream.h"
-#include "webrtc/audio/audio_state.h"
-#include "webrtc/audio/scoped_voe_interface.h"
-#include "webrtc/audio/time_interval.h"
-#include "webrtc/call/bitrate_allocator.h"
-#include "webrtc/call/call.h"
-#include "webrtc/call/flexfec_receive_stream_impl.h"
-#include "webrtc/call/rtp_stream_receiver_controller.h"
-#include "webrtc/call/rtp_transport_controller_send.h"
-#include "webrtc/logging/rtc_event_log/rtc_event_log.h"
-#include "webrtc/modules/bitrate_controller/include/bitrate_controller.h"
-#include "webrtc/modules/congestion_controller/include/receive_side_congestion_controller.h"
-#include "webrtc/modules/rtp_rtcp/include/flexfec_receiver.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_header_extension_map.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_header_parser.h"
-#include "webrtc/modules/rtp_rtcp/source/byte_io.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_packet_received.h"
-#include "webrtc/modules/utility/include/process_thread.h"
-#include "webrtc/rtc_base/basictypes.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/location.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/ptr_util.h"
-#include "webrtc/rtc_base/sequenced_task_checker.h"
-#include "webrtc/rtc_base/task_queue.h"
-#include "webrtc/rtc_base/thread_annotations.h"
-#include "webrtc/rtc_base/trace_event.h"
-#include "webrtc/system_wrappers/include/clock.h"
-#include "webrtc/system_wrappers/include/cpu_info.h"
-#include "webrtc/system_wrappers/include/metrics.h"
-#include "webrtc/system_wrappers/include/rw_lock_wrapper.h"
-#include "webrtc/system_wrappers/include/trace.h"
-#include "webrtc/video/call_stats.h"
-#include "webrtc/video/send_delay_stats.h"
-#include "webrtc/video/stats_counter.h"
-#include "webrtc/video/video_receive_stream.h"
-#include "webrtc/video/video_send_stream.h"
-
-namespace webrtc {
-
-namespace {
-
-// TODO(nisse): This really begs for a shared context struct.
-bool UseSendSideBwe(const std::vector<RtpExtension>& extensions,
-                    bool transport_cc) {
-  if (!transport_cc)
-    return false;
-  for (const auto& extension : extensions) {
-    if (extension.uri == RtpExtension::kTransportSequenceNumberUri)
-      return true;
-  }
-  return false;
-}
-
-bool UseSendSideBwe(const VideoReceiveStream::Config& config) {
-  return UseSendSideBwe(config.rtp.extensions, config.rtp.transport_cc);
-}
-
-bool UseSendSideBwe(const AudioReceiveStream::Config& config) {
-  return UseSendSideBwe(config.rtp.extensions, config.rtp.transport_cc);
-}
-
-bool UseSendSideBwe(const FlexfecReceiveStream::Config& config) {
-  return UseSendSideBwe(config.rtp_header_extensions, config.transport_cc);
-}
-
-const int* FindKeyByValue(const std::map<int, int>& m, int v) {
-  for (const auto& kv : m) {
-    if (kv.second == v)
-      return &kv.first;
-  }
-  return nullptr;
-}
-
-std::unique_ptr<rtclog::StreamConfig> CreateRtcLogStreamConfig(
-    const VideoReceiveStream::Config& config) {
-  auto rtclog_config = rtc::MakeUnique<rtclog::StreamConfig>();
-  rtclog_config->remote_ssrc = config.rtp.remote_ssrc;
-  rtclog_config->local_ssrc = config.rtp.local_ssrc;
-  rtclog_config->rtx_ssrc = config.rtp.rtx_ssrc;
-  rtclog_config->rtcp_mode = config.rtp.rtcp_mode;
-  rtclog_config->remb = config.rtp.remb;
-  rtclog_config->rtp_extensions = config.rtp.extensions;
-
-  for (const auto& d : config.decoders) {
-    const int* search =
-        FindKeyByValue(config.rtp.rtx_associated_payload_types, d.payload_type);
-    rtclog_config->codecs.emplace_back(d.payload_name, d.payload_type,
-                                      search ? *search : 0);
-  }
-  return rtclog_config;
-}
-
-std::unique_ptr<rtclog::StreamConfig> CreateRtcLogStreamConfig(
-    const VideoSendStream::Config& config,
-    size_t ssrc_index) {
-  auto rtclog_config = rtc::MakeUnique<rtclog::StreamConfig>();
-  rtclog_config->local_ssrc = config.rtp.ssrcs[ssrc_index];
-  if (ssrc_index < config.rtp.rtx.ssrcs.size()) {
-    rtclog_config->rtx_ssrc = config.rtp.rtx.ssrcs[ssrc_index];
-  }
-  rtclog_config->rtcp_mode = config.rtp.rtcp_mode;
-  rtclog_config->rtp_extensions = config.rtp.extensions;
-
-  rtclog_config->codecs.emplace_back(config.encoder_settings.payload_name,
-                                     config.encoder_settings.payload_type,
-                                     config.rtp.rtx.payload_type);
-  return rtclog_config;
-}
-
-std::unique_ptr<rtclog::StreamConfig> CreateRtcLogStreamConfig(
-    const AudioReceiveStream::Config& config) {
-  auto rtclog_config = rtc::MakeUnique<rtclog::StreamConfig>();
-  rtclog_config->remote_ssrc = config.rtp.remote_ssrc;
-  rtclog_config->local_ssrc = config.rtp.local_ssrc;
-  rtclog_config->rtp_extensions = config.rtp.extensions;
-  return rtclog_config;
-}
-
-std::unique_ptr<rtclog::StreamConfig> CreateRtcLogStreamConfig(
-    const AudioSendStream::Config& config) {
-  auto rtclog_config = rtc::MakeUnique<rtclog::StreamConfig>();
-  rtclog_config->local_ssrc = config.rtp.ssrc;
-  rtclog_config->rtp_extensions = config.rtp.extensions;
-  if (config.send_codec_spec) {
-    rtclog_config->codecs.emplace_back(config.send_codec_spec->format.name,
-                                       config.send_codec_spec->payload_type, 0);
-  }
-  return rtclog_config;
-}
-
-}  // namespace
-
-namespace internal {
-
-class Call : public webrtc::Call,
-             public PacketReceiver,
-             public RecoveredPacketReceiver,
-             public SendSideCongestionController::Observer,
-             public BitrateAllocator::LimitObserver {
- public:
-  Call(const Call::Config& config,
-       std::unique_ptr<RtpTransportControllerSendInterface> transport_send);
-  virtual ~Call();
-
-  // Implements webrtc::Call.
-  PacketReceiver* Receiver() override;
-
-  webrtc::AudioSendStream* CreateAudioSendStream(
-      const webrtc::AudioSendStream::Config& config) override;
-  void DestroyAudioSendStream(webrtc::AudioSendStream* send_stream) override;
-
-  webrtc::AudioReceiveStream* CreateAudioReceiveStream(
-      const webrtc::AudioReceiveStream::Config& config) override;
-  void DestroyAudioReceiveStream(
-      webrtc::AudioReceiveStream* receive_stream) override;
-
-  webrtc::VideoSendStream* CreateVideoSendStream(
-      webrtc::VideoSendStream::Config config,
-      VideoEncoderConfig encoder_config) override;
-  void DestroyVideoSendStream(webrtc::VideoSendStream* send_stream) override;
-
-  webrtc::VideoReceiveStream* CreateVideoReceiveStream(
-      webrtc::VideoReceiveStream::Config configuration) override;
-  void DestroyVideoReceiveStream(
-      webrtc::VideoReceiveStream* receive_stream) override;
-
-  FlexfecReceiveStream* CreateFlexfecReceiveStream(
-      const FlexfecReceiveStream::Config& config) override;
-  void DestroyFlexfecReceiveStream(
-      FlexfecReceiveStream* receive_stream) override;
-
-  Stats GetStats() const override;
-
-  // Implements PacketReceiver.
-  DeliveryStatus DeliverPacket(MediaType media_type,
-                               const uint8_t* packet,
-                               size_t length,
-                               const PacketTime& packet_time) override;
-
-  // Implements RecoveredPacketReceiver.
-  void OnRecoveredPacket(const uint8_t* packet, size_t length) override;
-
-  void SetBitrateConfig(
-      const webrtc::Call::Config::BitrateConfig& bitrate_config) override;
-
-  void SetBitrateConfigMask(
-      const webrtc::Call::Config::BitrateConfigMask& bitrate_config) override;
-
-  void SignalChannelNetworkState(MediaType media, NetworkState state) override;
-
-  void OnTransportOverheadChanged(MediaType media,
-                                  int transport_overhead_per_packet) override;
-
-  void OnNetworkRouteChanged(const std::string& transport_name,
-                             const rtc::NetworkRoute& network_route) override;
-
-  void OnSentPacket(const rtc::SentPacket& sent_packet) override;
-
-  // Implements BitrateObserver.
-  void OnNetworkChanged(uint32_t bitrate_bps,
-                        uint8_t fraction_loss,
-                        int64_t rtt_ms,
-                        int64_t probing_interval_ms) override;
-
-  // Implements BitrateAllocator::LimitObserver.
-  void OnAllocationLimitsChanged(uint32_t min_send_bitrate_bps,
-                                 uint32_t max_padding_bitrate_bps) override;
-
- private:
-  DeliveryStatus DeliverRtcp(MediaType media_type, const uint8_t* packet,
-                             size_t length);
-  DeliveryStatus DeliverRtp(MediaType media_type,
-                            const uint8_t* packet,
-                            size_t length,
-                            const PacketTime& packet_time);
-  void ConfigureSync(const std::string& sync_group)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(receive_crit_);
-
-  void NotifyBweOfReceivedPacket(const RtpPacketReceived& packet,
-                                 MediaType media_type)
-      RTC_SHARED_LOCKS_REQUIRED(receive_crit_);
-
-  rtc::Optional<RtpPacketReceived> ParseRtpPacket(
-      const uint8_t* packet,
-      size_t length,
-      const PacketTime* packet_time) const;
-
-  void UpdateSendHistograms(int64_t first_sent_packet_ms)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(&bitrate_crit_);
-  void UpdateReceiveHistograms();
-  void UpdateHistograms();
-  void UpdateAggregateNetworkState();
-
-  // Applies update to the BitrateConfig cached in |config_|, restarting
-  // bandwidth estimation from |new_start| if set.
-  void UpdateCurrentBitrateConfig(const rtc::Optional<int>& new_start);
-
-  Clock* const clock_;
-
-  const int num_cpu_cores_;
-  const std::unique_ptr<ProcessThread> module_process_thread_;
-  const std::unique_ptr<ProcessThread> pacer_thread_;
-  const std::unique_ptr<CallStats> call_stats_;
-  const std::unique_ptr<BitrateAllocator> bitrate_allocator_;
-  Call::Config config_;
-  rtc::SequencedTaskChecker configuration_sequence_checker_;
-
-  NetworkState audio_network_state_;
-  NetworkState video_network_state_;
-
-  std::unique_ptr<RWLockWrapper> receive_crit_;
-  // Audio, Video, and FlexFEC receive streams are owned by the client that
-  // creates them.
-  std::set<AudioReceiveStream*> audio_receive_streams_
-      RTC_GUARDED_BY(receive_crit_);
-  std::set<VideoReceiveStream*> video_receive_streams_
-      RTC_GUARDED_BY(receive_crit_);
-
-  std::map<std::string, AudioReceiveStream*> sync_stream_mapping_
-      RTC_GUARDED_BY(receive_crit_);
-
-  // TODO(nisse): Should eventually be injected at creation,
-  // with a single object in the bundled case.
-  RtpStreamReceiverController audio_receiver_controller_;
-  RtpStreamReceiverController video_receiver_controller_;
-
-  // This extra map is used for receive processing which is
-  // independent of media type.
-
-  // TODO(nisse): In the RTP transport refactoring, we should have a
-  // single mapping from ssrc to a more abstract receive stream, with
-  // accessor methods for all configuration we need at this level.
-  struct ReceiveRtpConfig {
-    ReceiveRtpConfig() = default;  // Needed by std::map
-    ReceiveRtpConfig(const std::vector<RtpExtension>& extensions,
-                     bool use_send_side_bwe)
-        : extensions(extensions), use_send_side_bwe(use_send_side_bwe) {}
-
-    // Registered RTP header extensions for each stream. Note that RTP header
-    // extensions are negotiated per track ("m= line") in the SDP, but we have
-    // no notion of tracks at the Call level. We therefore store the RTP header
-    // extensions per SSRC instead, which leads to some storage overhead.
-    RtpHeaderExtensionMap extensions;
-    // Set if both RTP extension the RTCP feedback message needed for
-    // send side BWE are negotiated.
-    bool use_send_side_bwe = false;
-  };
-  std::map<uint32_t, ReceiveRtpConfig> receive_rtp_config_
-      RTC_GUARDED_BY(receive_crit_);
-
-  std::unique_ptr<RWLockWrapper> send_crit_;
-  // Audio and Video send streams are owned by the client that creates them.
-  std::map<uint32_t, AudioSendStream*> audio_send_ssrcs_
-      RTC_GUARDED_BY(send_crit_);
-  std::map<uint32_t, VideoSendStream*> video_send_ssrcs_
-      RTC_GUARDED_BY(send_crit_);
-  std::set<VideoSendStream*> video_send_streams_ RTC_GUARDED_BY(send_crit_);
-
-  using RtpStateMap = std::map<uint32_t, RtpState>;
-  RtpStateMap suspended_audio_send_ssrcs_
-      RTC_GUARDED_BY(configuration_sequence_checker_);
-  RtpStateMap suspended_video_send_ssrcs_
-      RTC_GUARDED_BY(configuration_sequence_checker_);
-
-  webrtc::RtcEventLog* event_log_;
-
-  // The following members are only accessed (exclusively) from one thread and
-  // from the destructor, and therefore doesn't need any explicit
-  // synchronization.
-  RateCounter received_bytes_per_second_counter_;
-  RateCounter received_audio_bytes_per_second_counter_;
-  RateCounter received_video_bytes_per_second_counter_;
-  RateCounter received_rtcp_bytes_per_second_counter_;
-  rtc::Optional<int64_t> first_received_rtp_audio_ms_;
-  rtc::Optional<int64_t> last_received_rtp_audio_ms_;
-  rtc::Optional<int64_t> first_received_rtp_video_ms_;
-  rtc::Optional<int64_t> last_received_rtp_video_ms_;
-  TimeInterval sent_rtp_audio_timer_ms_;
-
-  // TODO(holmer): Remove this lock once BitrateController no longer calls
-  // OnNetworkChanged from multiple threads.
-  rtc::CriticalSection bitrate_crit_;
-  uint32_t min_allocated_send_bitrate_bps_ RTC_GUARDED_BY(&bitrate_crit_);
-  uint32_t configured_max_padding_bitrate_bps_ RTC_GUARDED_BY(&bitrate_crit_);
-  AvgCounter estimated_send_bitrate_kbps_counter_
-      RTC_GUARDED_BY(&bitrate_crit_);
-  AvgCounter pacer_bitrate_kbps_counter_ RTC_GUARDED_BY(&bitrate_crit_);
-
-  std::map<std::string, rtc::NetworkRoute> network_routes_;
-
-  std::unique_ptr<RtpTransportControllerSendInterface> transport_send_;
-  ReceiveSideCongestionController receive_side_cc_;
-  const std::unique_ptr<SendDelayStats> video_send_delay_stats_;
-  const int64_t start_ms_;
-  // TODO(perkj): |worker_queue_| is supposed to replace
-  // |module_process_thread_|.
-  // |worker_queue| is defined last to ensure all pending tasks are cancelled
-  // and deleted before any other members.
-  rtc::TaskQueue worker_queue_;
-
-  // The config mask set by SetBitrateConfigMask.
-  // 0 <= min <= start <= max
-  Config::BitrateConfigMask bitrate_config_mask_;
-
-  // The config set by SetBitrateConfig.
-  // min >= 0, start != 0, max == -1 || max > 0
-  Config::BitrateConfig base_bitrate_config_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(Call);
-};
-}  // namespace internal
-
-std::string Call::Stats::ToString(int64_t time_ms) const {
-  std::stringstream ss;
-  ss << "Call stats: " << time_ms << ", {";
-  ss << "send_bw_bps: " << send_bandwidth_bps << ", ";
-  ss << "recv_bw_bps: " << recv_bandwidth_bps << ", ";
-  ss << "max_pad_bps: " << max_padding_bitrate_bps << ", ";
-  ss << "pacer_delay_ms: " << pacer_delay_ms << ", ";
-  ss << "rtt_ms: " << rtt_ms;
-  ss << '}';
-  return ss.str();
-}
-
-Call* Call::Create(const Call::Config& config) {
-  return new internal::Call(config,
-                            rtc::MakeUnique<RtpTransportControllerSend>(
-                                Clock::GetRealTimeClock(), config.event_log));
-}
-
-Call* Call::Create(
-    const Call::Config& config,
-    std::unique_ptr<RtpTransportControllerSendInterface> transport_send) {
-  return new internal::Call(config, std::move(transport_send));
-}
-
-namespace internal {
-
-Call::Call(const Call::Config& config,
-           std::unique_ptr<RtpTransportControllerSendInterface> transport_send)
-    : clock_(Clock::GetRealTimeClock()),
-      num_cpu_cores_(CpuInfo::DetectNumberOfCores()),
-      module_process_thread_(ProcessThread::Create("ModuleProcessThread")),
-      pacer_thread_(ProcessThread::Create("PacerThread")),
-      call_stats_(new CallStats(clock_)),
-      bitrate_allocator_(new BitrateAllocator(this)),
-      config_(config),
-      audio_network_state_(kNetworkDown),
-      video_network_state_(kNetworkDown),
-      receive_crit_(RWLockWrapper::CreateRWLock()),
-      send_crit_(RWLockWrapper::CreateRWLock()),
-      event_log_(config.event_log),
-      received_bytes_per_second_counter_(clock_, nullptr, true),
-      received_audio_bytes_per_second_counter_(clock_, nullptr, true),
-      received_video_bytes_per_second_counter_(clock_, nullptr, true),
-      received_rtcp_bytes_per_second_counter_(clock_, nullptr, true),
-      min_allocated_send_bitrate_bps_(0),
-      configured_max_padding_bitrate_bps_(0),
-      estimated_send_bitrate_kbps_counter_(clock_, nullptr, true),
-      pacer_bitrate_kbps_counter_(clock_, nullptr, true),
-      receive_side_cc_(clock_, transport_send->packet_router()),
-      video_send_delay_stats_(new SendDelayStats(clock_)),
-      start_ms_(clock_->TimeInMilliseconds()),
-      worker_queue_("call_worker_queue"),
-      base_bitrate_config_(config.bitrate_config) {
-  RTC_DCHECK(config.event_log != nullptr);
-  RTC_DCHECK_GE(config.bitrate_config.min_bitrate_bps, 0);
-  RTC_DCHECK_GE(config.bitrate_config.start_bitrate_bps,
-                config.bitrate_config.min_bitrate_bps);
-  if (config.bitrate_config.max_bitrate_bps != -1) {
-    RTC_DCHECK_GE(config.bitrate_config.max_bitrate_bps,
-                  config.bitrate_config.start_bitrate_bps);
-  }
-  Trace::CreateTrace();
-  transport_send->send_side_cc()->RegisterNetworkObserver(this);
-  transport_send_ = std::move(transport_send);
-  transport_send_->send_side_cc()->SignalNetworkState(kNetworkDown);
-  transport_send_->send_side_cc()->SetBweBitrates(
-      config_.bitrate_config.min_bitrate_bps,
-      config_.bitrate_config.start_bitrate_bps,
-      config_.bitrate_config.max_bitrate_bps);
-  call_stats_->RegisterStatsObserver(&receive_side_cc_);
-  call_stats_->RegisterStatsObserver(transport_send_->send_side_cc());
-
-  // We have to attach the pacer to the pacer thread before starting the
-  // module process thread to avoid a race accessing the process thread
-  // both from the process thread and the pacer thread.
-  pacer_thread_->RegisterModule(transport_send_->pacer(), RTC_FROM_HERE);
-  pacer_thread_->RegisterModule(
-      receive_side_cc_.GetRemoteBitrateEstimator(true), RTC_FROM_HERE);
-  pacer_thread_->Start();
-
-  module_process_thread_->RegisterModule(call_stats_.get(), RTC_FROM_HERE);
-  module_process_thread_->RegisterModule(&receive_side_cc_, RTC_FROM_HERE);
-  module_process_thread_->RegisterModule(transport_send_->send_side_cc(),
-                                         RTC_FROM_HERE);
-  module_process_thread_->Start();
-}
-
-Call::~Call() {
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&configuration_sequence_checker_);
-
-  RTC_CHECK(audio_send_ssrcs_.empty());
-  RTC_CHECK(video_send_ssrcs_.empty());
-  RTC_CHECK(video_send_streams_.empty());
-  RTC_CHECK(audio_receive_streams_.empty());
-  RTC_CHECK(video_receive_streams_.empty());
-
-  // The send-side congestion controller must be de-registered prior to
-  // the pacer thread being stopped to avoid a race when accessing the
-  // pacer thread object on the module process thread at the same time as
-  // the pacer thread is stopped.
-  module_process_thread_->DeRegisterModule(transport_send_->send_side_cc());
-  pacer_thread_->Stop();
-  pacer_thread_->DeRegisterModule(transport_send_->pacer());
-  pacer_thread_->DeRegisterModule(
-      receive_side_cc_.GetRemoteBitrateEstimator(true));
-  module_process_thread_->DeRegisterModule(&receive_side_cc_);
-  module_process_thread_->DeRegisterModule(call_stats_.get());
-  module_process_thread_->Stop();
-  call_stats_->DeregisterStatsObserver(&receive_side_cc_);
-  call_stats_->DeregisterStatsObserver(transport_send_->send_side_cc());
-
-  int64_t first_sent_packet_ms =
-      transport_send_->send_side_cc()->GetFirstPacketTimeMs();
-  // Only update histograms after process threads have been shut down, so that
-  // they won't try to concurrently update stats.
-  {
-    rtc::CritScope lock(&bitrate_crit_);
-    UpdateSendHistograms(first_sent_packet_ms);
-  }
-  UpdateReceiveHistograms();
-  UpdateHistograms();
-
-  Trace::ReturnTrace();
-}
-
-rtc::Optional<RtpPacketReceived> Call::ParseRtpPacket(
-    const uint8_t* packet,
-    size_t length,
-    const PacketTime* packet_time) const {
-  RtpPacketReceived parsed_packet;
-  if (!parsed_packet.Parse(packet, length))
-    return rtc::Optional<RtpPacketReceived>();
-
-  int64_t arrival_time_ms;
-  if (packet_time && packet_time->timestamp != -1) {
-    arrival_time_ms = (packet_time->timestamp + 500) / 1000;
-  } else {
-    arrival_time_ms = clock_->TimeInMilliseconds();
-  }
-  parsed_packet.set_arrival_time_ms(arrival_time_ms);
-
-  return rtc::Optional<RtpPacketReceived>(std::move(parsed_packet));
-}
-
-void Call::UpdateHistograms() {
-  RTC_HISTOGRAM_COUNTS_100000(
-      "WebRTC.Call.LifetimeInSeconds",
-      (clock_->TimeInMilliseconds() - start_ms_) / 1000);
-}
-
-void Call::UpdateSendHistograms(int64_t first_sent_packet_ms) {
-  if (first_sent_packet_ms == -1)
-    return;
-  if (!sent_rtp_audio_timer_ms_.Empty()) {
-    RTC_HISTOGRAM_COUNTS_100000(
-        "WebRTC.Call.TimeSendingAudioRtpPacketsInSeconds",
-        sent_rtp_audio_timer_ms_.Length() / 1000);
-  }
-  int64_t elapsed_sec =
-      (clock_->TimeInMilliseconds() - first_sent_packet_ms) / 1000;
-  if (elapsed_sec < metrics::kMinRunTimeInSeconds)
-    return;
-  const int kMinRequiredPeriodicSamples = 5;
-  AggregatedStats send_bitrate_stats =
-      estimated_send_bitrate_kbps_counter_.ProcessAndGetStats();
-  if (send_bitrate_stats.num_samples > kMinRequiredPeriodicSamples) {
-    RTC_HISTOGRAM_COUNTS_100000("WebRTC.Call.EstimatedSendBitrateInKbps",
-                                send_bitrate_stats.average);
-    LOG(LS_INFO) << "WebRTC.Call.EstimatedSendBitrateInKbps, "
-                 << send_bitrate_stats.ToString();
-  }
-  AggregatedStats pacer_bitrate_stats =
-      pacer_bitrate_kbps_counter_.ProcessAndGetStats();
-  if (pacer_bitrate_stats.num_samples > kMinRequiredPeriodicSamples) {
-    RTC_HISTOGRAM_COUNTS_100000("WebRTC.Call.PacerBitrateInKbps",
-                                pacer_bitrate_stats.average);
-    LOG(LS_INFO) << "WebRTC.Call.PacerBitrateInKbps, "
-                 << pacer_bitrate_stats.ToString();
-  }
-}
-
-void Call::UpdateReceiveHistograms() {
-  if (first_received_rtp_audio_ms_) {
-    RTC_HISTOGRAM_COUNTS_100000(
-        "WebRTC.Call.TimeReceivingAudioRtpPacketsInSeconds",
-        (*last_received_rtp_audio_ms_ - *first_received_rtp_audio_ms_) / 1000);
-  }
-  if (first_received_rtp_video_ms_) {
-    RTC_HISTOGRAM_COUNTS_100000(
-        "WebRTC.Call.TimeReceivingVideoRtpPacketsInSeconds",
-        (*last_received_rtp_video_ms_ - *first_received_rtp_video_ms_) / 1000);
-  }
-  const int kMinRequiredPeriodicSamples = 5;
-  AggregatedStats video_bytes_per_sec =
-      received_video_bytes_per_second_counter_.GetStats();
-  if (video_bytes_per_sec.num_samples > kMinRequiredPeriodicSamples) {
-    RTC_HISTOGRAM_COUNTS_100000("WebRTC.Call.VideoBitrateReceivedInKbps",
-                                video_bytes_per_sec.average * 8 / 1000);
-    LOG(LS_INFO) << "WebRTC.Call.VideoBitrateReceivedInBps, "
-                 << video_bytes_per_sec.ToStringWithMultiplier(8);
-  }
-  AggregatedStats audio_bytes_per_sec =
-      received_audio_bytes_per_second_counter_.GetStats();
-  if (audio_bytes_per_sec.num_samples > kMinRequiredPeriodicSamples) {
-    RTC_HISTOGRAM_COUNTS_100000("WebRTC.Call.AudioBitrateReceivedInKbps",
-                                audio_bytes_per_sec.average * 8 / 1000);
-    LOG(LS_INFO) << "WebRTC.Call.AudioBitrateReceivedInBps, "
-                 << audio_bytes_per_sec.ToStringWithMultiplier(8);
-  }
-  AggregatedStats rtcp_bytes_per_sec =
-      received_rtcp_bytes_per_second_counter_.GetStats();
-  if (rtcp_bytes_per_sec.num_samples > kMinRequiredPeriodicSamples) {
-    RTC_HISTOGRAM_COUNTS_100000("WebRTC.Call.RtcpBitrateReceivedInBps",
-                                rtcp_bytes_per_sec.average * 8);
-    LOG(LS_INFO) << "WebRTC.Call.RtcpBitrateReceivedInBps, "
-                 << rtcp_bytes_per_sec.ToStringWithMultiplier(8);
-  }
-  AggregatedStats recv_bytes_per_sec =
-      received_bytes_per_second_counter_.GetStats();
-  if (recv_bytes_per_sec.num_samples > kMinRequiredPeriodicSamples) {
-    RTC_HISTOGRAM_COUNTS_100000("WebRTC.Call.BitrateReceivedInKbps",
-                                recv_bytes_per_sec.average * 8 / 1000);
-    LOG(LS_INFO) << "WebRTC.Call.BitrateReceivedInBps, "
-                 << recv_bytes_per_sec.ToStringWithMultiplier(8);
-  }
-}
-
-PacketReceiver* Call::Receiver() {
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&configuration_sequence_checker_);
-  return this;
-}
-
-webrtc::AudioSendStream* Call::CreateAudioSendStream(
-    const webrtc::AudioSendStream::Config& config) {
-  TRACE_EVENT0("webrtc", "Call::CreateAudioSendStream");
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&configuration_sequence_checker_);
-  event_log_->LogAudioSendStreamConfig(*CreateRtcLogStreamConfig(config));
-
-  rtc::Optional<RtpState> suspended_rtp_state;
-  {
-    const auto& iter = suspended_audio_send_ssrcs_.find(config.rtp.ssrc);
-    if (iter != suspended_audio_send_ssrcs_.end()) {
-      suspended_rtp_state.emplace(iter->second);
-    }
-  }
-
-  AudioSendStream* send_stream = new AudioSendStream(
-      config, config_.audio_state, &worker_queue_, transport_send_.get(),
-      bitrate_allocator_.get(), event_log_, call_stats_->rtcp_rtt_stats(),
-      suspended_rtp_state);
-  {
-    WriteLockScoped write_lock(*send_crit_);
-    RTC_DCHECK(audio_send_ssrcs_.find(config.rtp.ssrc) ==
-               audio_send_ssrcs_.end());
-    audio_send_ssrcs_[config.rtp.ssrc] = send_stream;
-  }
-  {
-    ReadLockScoped read_lock(*receive_crit_);
-    for (AudioReceiveStream* stream : audio_receive_streams_) {
-      if (stream->config().rtp.local_ssrc == config.rtp.ssrc) {
-        stream->AssociateSendStream(send_stream);
-      }
-    }
-  }
-  send_stream->SignalNetworkState(audio_network_state_);
-  UpdateAggregateNetworkState();
-  return send_stream;
-}
-
-void Call::DestroyAudioSendStream(webrtc::AudioSendStream* send_stream) {
-  TRACE_EVENT0("webrtc", "Call::DestroyAudioSendStream");
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&configuration_sequence_checker_);
-  RTC_DCHECK(send_stream != nullptr);
-
-  send_stream->Stop();
-
-  const uint32_t ssrc = send_stream->GetConfig().rtp.ssrc;
-  webrtc::internal::AudioSendStream* audio_send_stream =
-      static_cast<webrtc::internal::AudioSendStream*>(send_stream);
-  suspended_audio_send_ssrcs_[ssrc] = audio_send_stream->GetRtpState();
-  {
-    WriteLockScoped write_lock(*send_crit_);
-    size_t num_deleted = audio_send_ssrcs_.erase(ssrc);
-    RTC_DCHECK_EQ(1, num_deleted);
-  }
-  {
-    ReadLockScoped read_lock(*receive_crit_);
-    for (AudioReceiveStream* stream : audio_receive_streams_) {
-      if (stream->config().rtp.local_ssrc == ssrc) {
-        stream->AssociateSendStream(nullptr);
-      }
-    }
-  }
-  UpdateAggregateNetworkState();
-  sent_rtp_audio_timer_ms_.Extend(audio_send_stream->GetActiveLifetime());
-  delete send_stream;
-}
-
-webrtc::AudioReceiveStream* Call::CreateAudioReceiveStream(
-    const webrtc::AudioReceiveStream::Config& config) {
-  TRACE_EVENT0("webrtc", "Call::CreateAudioReceiveStream");
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&configuration_sequence_checker_);
-  event_log_->LogAudioReceiveStreamConfig(*CreateRtcLogStreamConfig(config));
-  AudioReceiveStream* receive_stream = new AudioReceiveStream(
-      &audio_receiver_controller_, transport_send_->packet_router(), config,
-      config_.audio_state, event_log_);
-  {
-    WriteLockScoped write_lock(*receive_crit_);
-    receive_rtp_config_[config.rtp.remote_ssrc] =
-        ReceiveRtpConfig(config.rtp.extensions, UseSendSideBwe(config));
-    audio_receive_streams_.insert(receive_stream);
-
-    ConfigureSync(config.sync_group);
-  }
-  {
-    ReadLockScoped read_lock(*send_crit_);
-    auto it = audio_send_ssrcs_.find(config.rtp.local_ssrc);
-    if (it != audio_send_ssrcs_.end()) {
-      receive_stream->AssociateSendStream(it->second);
-    }
-  }
-  receive_stream->SignalNetworkState(audio_network_state_);
-  UpdateAggregateNetworkState();
-  return receive_stream;
-}
-
-void Call::DestroyAudioReceiveStream(
-    webrtc::AudioReceiveStream* receive_stream) {
-  TRACE_EVENT0("webrtc", "Call::DestroyAudioReceiveStream");
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&configuration_sequence_checker_);
-  RTC_DCHECK(receive_stream != nullptr);
-  webrtc::internal::AudioReceiveStream* audio_receive_stream =
-      static_cast<webrtc::internal::AudioReceiveStream*>(receive_stream);
-  {
-    WriteLockScoped write_lock(*receive_crit_);
-    const AudioReceiveStream::Config& config = audio_receive_stream->config();
-    uint32_t ssrc = config.rtp.remote_ssrc;
-    receive_side_cc_.GetRemoteBitrateEstimator(UseSendSideBwe(config))
-        ->RemoveStream(ssrc);
-    audio_receive_streams_.erase(audio_receive_stream);
-    const std::string& sync_group = audio_receive_stream->config().sync_group;
-    const auto it = sync_stream_mapping_.find(sync_group);
-    if (it != sync_stream_mapping_.end() &&
-        it->second == audio_receive_stream) {
-      sync_stream_mapping_.erase(it);
-      ConfigureSync(sync_group);
-    }
-    receive_rtp_config_.erase(ssrc);
-  }
-  UpdateAggregateNetworkState();
-  delete audio_receive_stream;
-}
-
-webrtc::VideoSendStream* Call::CreateVideoSendStream(
-    webrtc::VideoSendStream::Config config,
-    VideoEncoderConfig encoder_config) {
-  TRACE_EVENT0("webrtc", "Call::CreateVideoSendStream");
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&configuration_sequence_checker_);
-
-  video_send_delay_stats_->AddSsrcs(config);
-  for (size_t ssrc_index = 0; ssrc_index < config.rtp.ssrcs.size();
-       ++ssrc_index) {
-    event_log_->LogVideoSendStreamConfig(
-        *CreateRtcLogStreamConfig(config, ssrc_index));
-  }
-
-  // TODO(mflodman): Base the start bitrate on a current bandwidth estimate, if
-  // the call has already started.
-  // Copy ssrcs from |config| since |config| is moved.
-  std::vector<uint32_t> ssrcs = config.rtp.ssrcs;
-  VideoSendStream* send_stream = new VideoSendStream(
-      num_cpu_cores_, module_process_thread_.get(), &worker_queue_,
-      call_stats_.get(), transport_send_.get(), bitrate_allocator_.get(),
-      video_send_delay_stats_.get(), event_log_, std::move(config),
-      std::move(encoder_config), suspended_video_send_ssrcs_);
-
-  {
-    WriteLockScoped write_lock(*send_crit_);
-    for (uint32_t ssrc : ssrcs) {
-      RTC_DCHECK(video_send_ssrcs_.find(ssrc) == video_send_ssrcs_.end());
-      video_send_ssrcs_[ssrc] = send_stream;
-    }
-    video_send_streams_.insert(send_stream);
-  }
-  send_stream->SignalNetworkState(video_network_state_);
-  UpdateAggregateNetworkState();
-
-  return send_stream;
-}
-
-void Call::DestroyVideoSendStream(webrtc::VideoSendStream* send_stream) {
-  TRACE_EVENT0("webrtc", "Call::DestroyVideoSendStream");
-  RTC_DCHECK(send_stream != nullptr);
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&configuration_sequence_checker_);
-
-  send_stream->Stop();
-
-  VideoSendStream* send_stream_impl = nullptr;
-  {
-    WriteLockScoped write_lock(*send_crit_);
-    auto it = video_send_ssrcs_.begin();
-    while (it != video_send_ssrcs_.end()) {
-      if (it->second == static_cast<VideoSendStream*>(send_stream)) {
-        send_stream_impl = it->second;
-        video_send_ssrcs_.erase(it++);
-      } else {
-        ++it;
-      }
-    }
-    video_send_streams_.erase(send_stream_impl);
-  }
-  RTC_CHECK(send_stream_impl != nullptr);
-
-  VideoSendStream::RtpStateMap rtp_state =
-      send_stream_impl->StopPermanentlyAndGetRtpStates();
-
-  for (VideoSendStream::RtpStateMap::iterator it = rtp_state.begin();
-       it != rtp_state.end(); ++it) {
-    suspended_video_send_ssrcs_[it->first] = it->second;
-  }
-
-  UpdateAggregateNetworkState();
-  delete send_stream_impl;
-}
-
-webrtc::VideoReceiveStream* Call::CreateVideoReceiveStream(
-    webrtc::VideoReceiveStream::Config configuration) {
-  TRACE_EVENT0("webrtc", "Call::CreateVideoReceiveStream");
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&configuration_sequence_checker_);
-
-  VideoReceiveStream* receive_stream = new VideoReceiveStream(
-      &video_receiver_controller_, num_cpu_cores_,
-      transport_send_->packet_router(), std::move(configuration),
-      module_process_thread_.get(), call_stats_.get());
-
-  const webrtc::VideoReceiveStream::Config& config = receive_stream->config();
-  ReceiveRtpConfig receive_config(config.rtp.extensions,
-                                  UseSendSideBwe(config));
-  {
-    WriteLockScoped write_lock(*receive_crit_);
-    if (config.rtp.rtx_ssrc) {
-      // We record identical config for the rtx stream as for the main
-      // stream. Since the transport_send_cc negotiation is per payload
-      // type, we may get an incorrect value for the rtx stream, but
-      // that is unlikely to matter in practice.
-      receive_rtp_config_[config.rtp.rtx_ssrc] = receive_config;
-    }
-    receive_rtp_config_[config.rtp.remote_ssrc] = receive_config;
-    video_receive_streams_.insert(receive_stream);
-    ConfigureSync(config.sync_group);
-  }
-  receive_stream->SignalNetworkState(video_network_state_);
-  UpdateAggregateNetworkState();
-  event_log_->LogVideoReceiveStreamConfig(*CreateRtcLogStreamConfig(config));
-  return receive_stream;
-}
-
-void Call::DestroyVideoReceiveStream(
-    webrtc::VideoReceiveStream* receive_stream) {
-  TRACE_EVENT0("webrtc", "Call::DestroyVideoReceiveStream");
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&configuration_sequence_checker_);
-  RTC_DCHECK(receive_stream != nullptr);
-  VideoReceiveStream* receive_stream_impl =
-      static_cast<VideoReceiveStream*>(receive_stream);
-  const VideoReceiveStream::Config& config = receive_stream_impl->config();
-  {
-    WriteLockScoped write_lock(*receive_crit_);
-    // Remove all ssrcs pointing to a receive stream. As RTX retransmits on a
-    // separate SSRC there can be either one or two.
-    receive_rtp_config_.erase(config.rtp.remote_ssrc);
-    if (config.rtp.rtx_ssrc) {
-      receive_rtp_config_.erase(config.rtp.rtx_ssrc);
-    }
-    video_receive_streams_.erase(receive_stream_impl);
-    ConfigureSync(config.sync_group);
-  }
-
-  receive_side_cc_.GetRemoteBitrateEstimator(UseSendSideBwe(config))
-      ->RemoveStream(config.rtp.remote_ssrc);
-
-  UpdateAggregateNetworkState();
-  delete receive_stream_impl;
-}
-
-FlexfecReceiveStream* Call::CreateFlexfecReceiveStream(
-    const FlexfecReceiveStream::Config& config) {
-  TRACE_EVENT0("webrtc", "Call::CreateFlexfecReceiveStream");
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&configuration_sequence_checker_);
-
-  RecoveredPacketReceiver* recovered_packet_receiver = this;
-
-  FlexfecReceiveStreamImpl* receive_stream;
-  {
-    WriteLockScoped write_lock(*receive_crit_);
-    // Unlike the video and audio receive streams,
-    // FlexfecReceiveStream implements RtpPacketSinkInterface itself,
-    // and hence its constructor passes its |this| pointer to
-    // video_receiver_controller_->CreateStream(). Calling the
-    // constructor while holding |receive_crit_| ensures that we don't
-    // call OnRtpPacket until the constructor is finished and the
-    // object is in a valid state.
-    // TODO(nisse): Fix constructor so that it can be moved outside of
-    // this locked scope.
-    receive_stream = new FlexfecReceiveStreamImpl(
-        &video_receiver_controller_, config, recovered_packet_receiver,
-        call_stats_->rtcp_rtt_stats(), module_process_thread_.get());
-
-    RTC_DCHECK(receive_rtp_config_.find(config.remote_ssrc) ==
-               receive_rtp_config_.end());
-    receive_rtp_config_[config.remote_ssrc] =
-        ReceiveRtpConfig(config.rtp_header_extensions, UseSendSideBwe(config));
-  }
-
-  // TODO(brandtr): Store config in RtcEventLog here.
-
-  return receive_stream;
-}
-
-void Call::DestroyFlexfecReceiveStream(FlexfecReceiveStream* receive_stream) {
-  TRACE_EVENT0("webrtc", "Call::DestroyFlexfecReceiveStream");
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&configuration_sequence_checker_);
-
-  RTC_DCHECK(receive_stream != nullptr);
-  {
-    WriteLockScoped write_lock(*receive_crit_);
-
-    const FlexfecReceiveStream::Config& config = receive_stream->GetConfig();
-    uint32_t ssrc = config.remote_ssrc;
-    receive_rtp_config_.erase(ssrc);
-
-    // Remove all SSRCs pointing to the FlexfecReceiveStreamImpl to be
-    // destroyed.
-    receive_side_cc_.GetRemoteBitrateEstimator(UseSendSideBwe(config))
-        ->RemoveStream(ssrc);
-  }
-
-  delete receive_stream;
-}
-
-Call::Stats Call::GetStats() const {
-  // TODO(solenberg): Some test cases in EndToEndTest use this from a different
-  // thread. Re-enable once that is fixed.
-  // RTC_DCHECK_CALLED_SEQUENTIALLY(&configuration_sequence_checker_);
-  Stats stats;
-  // Fetch available send/receive bitrates.
-  uint32_t send_bandwidth = 0;
-  transport_send_->send_side_cc()->GetBitrateController()->AvailableBandwidth(
-      &send_bandwidth);
-  std::vector<unsigned int> ssrcs;
-  uint32_t recv_bandwidth = 0;
-  receive_side_cc_.GetRemoteBitrateEstimator(false)->LatestEstimate(
-      &ssrcs, &recv_bandwidth);
-  stats.send_bandwidth_bps = send_bandwidth;
-  stats.recv_bandwidth_bps = recv_bandwidth;
-  stats.pacer_delay_ms =
-      transport_send_->send_side_cc()->GetPacerQueuingDelayMs();
-  stats.rtt_ms = call_stats_->rtcp_rtt_stats()->LastProcessedRtt();
-  {
-    rtc::CritScope cs(&bitrate_crit_);
-    stats.max_padding_bitrate_bps = configured_max_padding_bitrate_bps_;
-  }
-  return stats;
-}
-
-void Call::SetBitrateConfig(
-    const webrtc::Call::Config::BitrateConfig& bitrate_config) {
-  TRACE_EVENT0("webrtc", "Call::SetBitrateConfig");
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&configuration_sequence_checker_);
-  RTC_DCHECK_GE(bitrate_config.min_bitrate_bps, 0);
-  RTC_DCHECK_NE(bitrate_config.start_bitrate_bps, 0);
-  if (bitrate_config.max_bitrate_bps != -1) {
-    RTC_DCHECK_GT(bitrate_config.max_bitrate_bps, 0);
-  }
-
-  rtc::Optional<int> new_start;
-  // Only update the "start" bitrate if it's set, and different from the old
-  // value. In practice, this value comes from the x-google-start-bitrate codec
-  // parameter in SDP, and setting the same remote description twice shouldn't
-  // restart bandwidth estimation.
-  if (bitrate_config.start_bitrate_bps != -1 &&
-      bitrate_config.start_bitrate_bps !=
-          base_bitrate_config_.start_bitrate_bps) {
-    new_start.emplace(bitrate_config.start_bitrate_bps);
-  }
-  base_bitrate_config_ = bitrate_config;
-  UpdateCurrentBitrateConfig(new_start);
-}
-
-void Call::SetBitrateConfigMask(
-    const webrtc::Call::Config::BitrateConfigMask& mask) {
-  TRACE_EVENT0("webrtc", "Call::SetBitrateConfigMask");
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&configuration_sequence_checker_);
-
-  bitrate_config_mask_ = mask;
-  UpdateCurrentBitrateConfig(mask.start_bitrate_bps);
-}
-
-void Call::UpdateCurrentBitrateConfig(const rtc::Optional<int>& new_start) {
-  Config::BitrateConfig updated;
-  updated.min_bitrate_bps =
-      std::max(bitrate_config_mask_.min_bitrate_bps.value_or(0),
-               base_bitrate_config_.min_bitrate_bps);
-
-  updated.max_bitrate_bps =
-      MinPositive(bitrate_config_mask_.max_bitrate_bps.value_or(-1),
-                  base_bitrate_config_.max_bitrate_bps);
-
-  // If the combined min ends up greater than the combined max, the max takes
-  // priority.
-  if (updated.max_bitrate_bps != -1 &&
-      updated.min_bitrate_bps > updated.max_bitrate_bps) {
-    updated.min_bitrate_bps = updated.max_bitrate_bps;
-  }
-
-  // If there is nothing to update (min/max unchanged, no new bandwidth
-  // estimation start value), return early.
-  if (updated.min_bitrate_bps == config_.bitrate_config.min_bitrate_bps &&
-      updated.max_bitrate_bps == config_.bitrate_config.max_bitrate_bps &&
-      !new_start) {
-    LOG(LS_VERBOSE) << "WebRTC.Call.UpdateCurrentBitrateConfig: "
-                    << "nothing to update";
-    return;
-  }
-
-  if (new_start) {
-    // Clamp start by min and max.
-    updated.start_bitrate_bps = MinPositive(
-        std::max(*new_start, updated.min_bitrate_bps), updated.max_bitrate_bps);
-  } else {
-    updated.start_bitrate_bps = -1;
-  }
-
-  LOG(INFO) << "WebRTC.Call.UpdateCurrentBitrateConfig: "
-            << "calling SetBweBitrates with args (" << updated.min_bitrate_bps
-            << ", " << updated.start_bitrate_bps << ", "
-            << updated.max_bitrate_bps << ")";
-  transport_send_->send_side_cc()->SetBweBitrates(updated.min_bitrate_bps,
-                                                  updated.start_bitrate_bps,
-                                                  updated.max_bitrate_bps);
-  if (!new_start) {
-    updated.start_bitrate_bps = config_.bitrate_config.start_bitrate_bps;
-  }
-  config_.bitrate_config = updated;
-}
-
-void Call::SignalChannelNetworkState(MediaType media, NetworkState state) {
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&configuration_sequence_checker_);
-  switch (media) {
-    case MediaType::AUDIO:
-      audio_network_state_ = state;
-      break;
-    case MediaType::VIDEO:
-      video_network_state_ = state;
-      break;
-    case MediaType::ANY:
-    case MediaType::DATA:
-      RTC_NOTREACHED();
-      break;
-  }
-
-  UpdateAggregateNetworkState();
-  {
-    ReadLockScoped read_lock(*send_crit_);
-    for (auto& kv : audio_send_ssrcs_) {
-      kv.second->SignalNetworkState(audio_network_state_);
-    }
-    for (auto& kv : video_send_ssrcs_) {
-      kv.second->SignalNetworkState(video_network_state_);
-    }
-  }
-  {
-    ReadLockScoped read_lock(*receive_crit_);
-    for (AudioReceiveStream* audio_receive_stream : audio_receive_streams_) {
-      audio_receive_stream->SignalNetworkState(audio_network_state_);
-    }
-    for (VideoReceiveStream* video_receive_stream : video_receive_streams_) {
-      video_receive_stream->SignalNetworkState(video_network_state_);
-    }
-  }
-}
-
-void Call::OnTransportOverheadChanged(MediaType media,
-                                      int transport_overhead_per_packet) {
-  switch (media) {
-    case MediaType::AUDIO: {
-      ReadLockScoped read_lock(*send_crit_);
-      for (auto& kv : audio_send_ssrcs_) {
-        kv.second->SetTransportOverhead(transport_overhead_per_packet);
-      }
-      break;
-    }
-    case MediaType::VIDEO: {
-      ReadLockScoped read_lock(*send_crit_);
-      for (auto& kv : video_send_ssrcs_) {
-        kv.second->SetTransportOverhead(transport_overhead_per_packet);
-      }
-      break;
-    }
-    case MediaType::ANY:
-    case MediaType::DATA:
-      RTC_NOTREACHED();
-      break;
-  }
-}
-
-// TODO(honghaiz): Add tests for this method.
-void Call::OnNetworkRouteChanged(const std::string& transport_name,
-                                 const rtc::NetworkRoute& network_route) {
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&configuration_sequence_checker_);
-  // 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
-                 << " Reset bitrates to min: "
-                 << config_.bitrate_config.min_bitrate_bps
-                 << " bps, start: " << config_.bitrate_config.start_bitrate_bps
-                 << " bps,  max: " << config_.bitrate_config.start_bitrate_bps
-                 << " bps.";
-    RTC_DCHECK_GT(config_.bitrate_config.start_bitrate_bps, 0);
-    transport_send_->send_side_cc()->OnNetworkRouteChanged(
-        network_route, config_.bitrate_config.start_bitrate_bps,
-        config_.bitrate_config.min_bitrate_bps,
-        config_.bitrate_config.max_bitrate_bps);
-  }
-}
-
-void Call::UpdateAggregateNetworkState() {
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&configuration_sequence_checker_);
-
-  bool have_audio = false;
-  bool have_video = false;
-  {
-    ReadLockScoped read_lock(*send_crit_);
-    if (audio_send_ssrcs_.size() > 0)
-      have_audio = true;
-    if (video_send_ssrcs_.size() > 0)
-      have_video = true;
-  }
-  {
-    ReadLockScoped read_lock(*receive_crit_);
-    if (audio_receive_streams_.size() > 0)
-      have_audio = true;
-    if (video_receive_streams_.size() > 0)
-      have_video = true;
-  }
-
-  NetworkState aggregate_state = kNetworkDown;
-  if ((have_video && video_network_state_ == kNetworkUp) ||
-      (have_audio && audio_network_state_ == kNetworkUp)) {
-    aggregate_state = kNetworkUp;
-  }
-
-  LOG(LS_INFO) << "UpdateAggregateNetworkState: aggregate_state="
-               << (aggregate_state == kNetworkUp ? "up" : "down");
-
-  transport_send_->send_side_cc()->SignalNetworkState(aggregate_state);
-}
-
-void Call::OnSentPacket(const rtc::SentPacket& sent_packet) {
-  video_send_delay_stats_->OnSentPacket(sent_packet.packet_id,
-                                        clock_->TimeInMilliseconds());
-  transport_send_->send_side_cc()->OnSentPacket(sent_packet);
-}
-
-void Call::OnNetworkChanged(uint32_t target_bitrate_bps,
-                            uint8_t fraction_loss,
-                            int64_t rtt_ms,
-                            int64_t probing_interval_ms) {
-  // TODO(perkj): Consider making sure CongestionController operates on
-  // |worker_queue_|.
-  if (!worker_queue_.IsCurrent()) {
-    worker_queue_.PostTask(
-        [this, target_bitrate_bps, fraction_loss, rtt_ms, probing_interval_ms] {
-          OnNetworkChanged(target_bitrate_bps, fraction_loss, rtt_ms,
-                           probing_interval_ms);
-        });
-    return;
-  }
-  RTC_DCHECK_RUN_ON(&worker_queue_);
-  // For controlling the rate of feedback messages.
-  receive_side_cc_.OnBitrateChanged(target_bitrate_bps);
-  bitrate_allocator_->OnNetworkChanged(target_bitrate_bps, fraction_loss,
-                                       rtt_ms, probing_interval_ms);
-
-  // Ignore updates if bitrate is zero (the aggregate network state is down).
-  if (target_bitrate_bps == 0) {
-    rtc::CritScope lock(&bitrate_crit_);
-    estimated_send_bitrate_kbps_counter_.ProcessAndPause();
-    pacer_bitrate_kbps_counter_.ProcessAndPause();
-    return;
-  }
-
-  bool sending_video;
-  {
-    ReadLockScoped read_lock(*send_crit_);
-    sending_video = !video_send_streams_.empty();
-  }
-
-  rtc::CritScope lock(&bitrate_crit_);
-  if (!sending_video) {
-    // Do not update the stats if we are not sending video.
-    estimated_send_bitrate_kbps_counter_.ProcessAndPause();
-    pacer_bitrate_kbps_counter_.ProcessAndPause();
-    return;
-  }
-  estimated_send_bitrate_kbps_counter_.Add(target_bitrate_bps / 1000);
-  // Pacer bitrate may be higher than bitrate estimate if enforcing min bitrate.
-  uint32_t pacer_bitrate_bps =
-      std::max(target_bitrate_bps, min_allocated_send_bitrate_bps_);
-  pacer_bitrate_kbps_counter_.Add(pacer_bitrate_bps / 1000);
-}
-
-void Call::OnAllocationLimitsChanged(uint32_t min_send_bitrate_bps,
-                                     uint32_t max_padding_bitrate_bps) {
-  transport_send_->SetAllocatedSendBitrateLimits(min_send_bitrate_bps,
-                                                 max_padding_bitrate_bps);
-  rtc::CritScope lock(&bitrate_crit_);
-  min_allocated_send_bitrate_bps_ = min_send_bitrate_bps;
-  configured_max_padding_bitrate_bps_ = max_padding_bitrate_bps;
-}
-
-void Call::ConfigureSync(const std::string& sync_group) {
-  // Set sync only if there was no previous one.
-  if (sync_group.empty())
-    return;
-
-  AudioReceiveStream* sync_audio_stream = nullptr;
-  // Find existing audio stream.
-  const auto it = sync_stream_mapping_.find(sync_group);
-  if (it != sync_stream_mapping_.end()) {
-    sync_audio_stream = it->second;
-  } else {
-    // No configured audio stream, see if we can find one.
-    for (AudioReceiveStream* stream : audio_receive_streams_) {
-      if (stream->config().sync_group == sync_group) {
-        if (sync_audio_stream != nullptr) {
-          LOG(LS_WARNING) << "Attempting to sync more than one audio stream "
-                             "within the same sync group. This is not "
-                             "supported in the current implementation.";
-          break;
-        }
-        sync_audio_stream = stream;
-      }
-    }
-  }
-  if (sync_audio_stream)
-    sync_stream_mapping_[sync_group] = sync_audio_stream;
-  size_t num_synced_streams = 0;
-  for (VideoReceiveStream* video_stream : video_receive_streams_) {
-    if (video_stream->config().sync_group != sync_group)
-      continue;
-    ++num_synced_streams;
-    if (num_synced_streams > 1) {
-      // TODO(pbos): Support synchronizing more than one A/V pair.
-      // https://code.google.com/p/webrtc/issues/detail?id=4762
-      LOG(LS_WARNING) << "Attempting to sync more than one audio/video pair "
-                         "within the same sync group. This is not supported in "
-                         "the current implementation.";
-    }
-    // Only sync the first A/V pair within this sync group.
-    if (num_synced_streams == 1) {
-      // sync_audio_stream may be null and that's ok.
-      video_stream->SetSync(sync_audio_stream);
-    } else {
-      video_stream->SetSync(nullptr);
-    }
-  }
-}
-
-PacketReceiver::DeliveryStatus Call::DeliverRtcp(MediaType media_type,
-                                                 const uint8_t* packet,
-                                                 size_t length) {
-  TRACE_EVENT0("webrtc", "Call::DeliverRtcp");
-  // TODO(pbos): Make sure it's a valid packet.
-  //             Return DELIVERY_UNKNOWN_SSRC if it can be determined that
-  //             there's no receiver of the packet.
-  if (received_bytes_per_second_counter_.HasSample()) {
-    // First RTP packet has been received.
-    received_bytes_per_second_counter_.Add(static_cast<int>(length));
-    received_rtcp_bytes_per_second_counter_.Add(static_cast<int>(length));
-  }
-  bool rtcp_delivered = false;
-  if (media_type == MediaType::ANY || media_type == MediaType::VIDEO) {
-    ReadLockScoped read_lock(*receive_crit_);
-    for (VideoReceiveStream* stream : video_receive_streams_) {
-      if (stream->DeliverRtcp(packet, length))
-        rtcp_delivered = true;
-    }
-  }
-  if (media_type == MediaType::ANY || media_type == MediaType::AUDIO) {
-    ReadLockScoped read_lock(*receive_crit_);
-    for (AudioReceiveStream* stream : audio_receive_streams_) {
-      if (stream->DeliverRtcp(packet, length))
-        rtcp_delivered = true;
-    }
-  }
-  if (media_type == MediaType::ANY || media_type == MediaType::VIDEO) {
-    ReadLockScoped read_lock(*send_crit_);
-    for (VideoSendStream* stream : video_send_streams_) {
-      if (stream->DeliverRtcp(packet, length))
-        rtcp_delivered = true;
-    }
-  }
-  if (media_type == MediaType::ANY || media_type == MediaType::AUDIO) {
-    ReadLockScoped read_lock(*send_crit_);
-    for (auto& kv : audio_send_ssrcs_) {
-      if (kv.second->DeliverRtcp(packet, length))
-        rtcp_delivered = true;
-    }
-  }
-
-  if (rtcp_delivered)
-    event_log_->LogRtcpPacket(kIncomingPacket, packet, length);
-
-  return rtcp_delivered ? DELIVERY_OK : DELIVERY_PACKET_ERROR;
-}
-
-PacketReceiver::DeliveryStatus Call::DeliverRtp(MediaType media_type,
-                                                const uint8_t* packet,
-                                                size_t length,
-                                                const PacketTime& packet_time) {
-  TRACE_EVENT0("webrtc", "Call::DeliverRtp");
-
-  // TODO(nisse): We should parse the RTP header only here, and pass
-  // on parsed_packet to the receive streams.
-  rtc::Optional<RtpPacketReceived> parsed_packet =
-      ParseRtpPacket(packet, length, &packet_time);
-
-  // We might get RTP keep-alive packets in accordance with RFC6263 section 4.6.
-  // These are empty (zero length payload) RTP packets with an unsignaled
-  // payload type.
-  const bool is_keep_alive_packet =
-      parsed_packet && parsed_packet->payload_size() == 0;
-
-  RTC_DCHECK(media_type == MediaType::AUDIO || media_type == MediaType::VIDEO ||
-             is_keep_alive_packet);
-
-  if (!parsed_packet)
-    return DELIVERY_PACKET_ERROR;
-
-  ReadLockScoped read_lock(*receive_crit_);
-  auto it = receive_rtp_config_.find(parsed_packet->Ssrc());
-  if (it == receive_rtp_config_.end()) {
-    LOG(LS_ERROR) << "receive_rtp_config_ lookup failed for ssrc "
-                  << parsed_packet->Ssrc();
-    // Destruction of the receive stream, including deregistering from the
-    // RtpDemuxer, is not protected by the |receive_crit_| lock. But
-    // deregistering in the |receive_rtp_config_| map is protected by that lock.
-    // So by not passing the packet on to demuxing in this case, we prevent
-    // incoming packets to be passed on via the demuxer to a receive stream
-    // which is being torned down.
-    return DELIVERY_UNKNOWN_SSRC;
-  }
-  parsed_packet->IdentifyExtensions(it->second.extensions);
-
-  NotifyBweOfReceivedPacket(*parsed_packet, media_type);
-
-  if (media_type == MediaType::AUDIO) {
-    if (audio_receiver_controller_.OnRtpPacket(*parsed_packet)) {
-      received_bytes_per_second_counter_.Add(static_cast<int>(length));
-      received_audio_bytes_per_second_counter_.Add(static_cast<int>(length));
-      event_log_->LogRtpHeader(kIncomingPacket, packet, length);
-      const int64_t arrival_time_ms = parsed_packet->arrival_time_ms();
-      if (!first_received_rtp_audio_ms_) {
-        first_received_rtp_audio_ms_.emplace(arrival_time_ms);
-      }
-      last_received_rtp_audio_ms_.emplace(arrival_time_ms);
-      return DELIVERY_OK;
-    }
-  } else if (media_type == MediaType::VIDEO) {
-    if (video_receiver_controller_.OnRtpPacket(*parsed_packet)) {
-      received_bytes_per_second_counter_.Add(static_cast<int>(length));
-      received_video_bytes_per_second_counter_.Add(static_cast<int>(length));
-      event_log_->LogRtpHeader(kIncomingPacket, packet, length);
-      const int64_t arrival_time_ms = parsed_packet->arrival_time_ms();
-      if (!first_received_rtp_video_ms_) {
-        first_received_rtp_video_ms_.emplace(arrival_time_ms);
-      }
-      last_received_rtp_video_ms_.emplace(arrival_time_ms);
-      return DELIVERY_OK;
-    }
-  }
-  return DELIVERY_UNKNOWN_SSRC;
-}
-
-PacketReceiver::DeliveryStatus Call::DeliverPacket(
-    MediaType media_type,
-    const uint8_t* packet,
-    size_t length,
-    const PacketTime& packet_time) {
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&configuration_sequence_checker_);
-  if (RtpHeaderParser::IsRtcp(packet, length))
-    return DeliverRtcp(media_type, packet, length);
-
-  return DeliverRtp(media_type, packet, length, packet_time);
-}
-
-void Call::OnRecoveredPacket(const uint8_t* packet, size_t length) {
-  rtc::Optional<RtpPacketReceived> parsed_packet =
-      ParseRtpPacket(packet, length, nullptr);
-  if (!parsed_packet)
-    return;
-
-  parsed_packet->set_recovered(true);
-
-  ReadLockScoped read_lock(*receive_crit_);
-  auto it = receive_rtp_config_.find(parsed_packet->Ssrc());
-  if (it == receive_rtp_config_.end()) {
-    LOG(LS_ERROR) << "receive_rtp_config_ lookup failed for ssrc "
-                  << parsed_packet->Ssrc();
-    // Destruction of the receive stream, including deregistering from the
-    // RtpDemuxer, is not protected by the |receive_crit_| lock. But
-    // deregistering in the |receive_rtp_config_| map is protected by that lock.
-    // So by not passing the packet on to demuxing in this case, we prevent
-    // incoming packets to be passed on via the demuxer to a receive stream
-    // which is being torned down.
-    return;
-  }
-  parsed_packet->IdentifyExtensions(it->second.extensions);
-
-  // TODO(brandtr): Update here when we support protecting audio packets too.
-  video_receiver_controller_.OnRtpPacket(*parsed_packet);
-}
-
-void Call::NotifyBweOfReceivedPacket(const RtpPacketReceived& packet,
-                                     MediaType media_type) {
-  auto it = receive_rtp_config_.find(packet.Ssrc());
-  bool use_send_side_bwe =
-      (it != receive_rtp_config_.end()) && it->second.use_send_side_bwe;
-
-  RTPHeader header;
-  packet.GetHeader(&header);
-
-  if (!use_send_side_bwe && header.extension.hasTransportSequenceNumber) {
-    // Inconsistent configuration of send side BWE. Do nothing.
-    // TODO(nisse): Without this check, we may produce RTCP feedback
-    // packets even when not negotiated. But it would be cleaner to
-    // move the check down to RTCPSender::SendFeedbackPacket, which
-    // would also help the PacketRouter to select an appropriate rtp
-    // module in the case that some, but not all, have RTCP feedback
-    // enabled.
-    return;
-  }
-  // For audio, we only support send side BWE.
-  if (media_type == MediaType::VIDEO ||
-      (use_send_side_bwe && header.extension.hasTransportSequenceNumber)) {
-    receive_side_cc_.OnReceivedPacket(
-        packet.arrival_time_ms(), packet.payload_size() + packet.padding_size(),
-        header);
-  }
-}
-
-}  // namespace internal
-
-}  // namespace webrtc
diff --git a/call/call.h b/call/call.h
deleted file mode 100644
index 74ea2eb..0000000
--- a/call/call.h
+++ /dev/null
@@ -1,207 +0,0 @@
-/*
- *  Copyright (c) 2013 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_CALL_CALL_H_
-#define WEBRTC_CALL_CALL_H_
-
-#include <algorithm>
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "webrtc/api/rtcerror.h"
-#include "webrtc/call/audio_receive_stream.h"
-#include "webrtc/call/audio_send_stream.h"
-#include "webrtc/call/audio_state.h"
-#include "webrtc/call/flexfec_receive_stream.h"
-#include "webrtc/call/rtp_transport_controller_send_interface.h"
-#include "webrtc/call/video_receive_stream.h"
-#include "webrtc/call/video_send_stream.h"
-#include "webrtc/common_types.h"
-#include "webrtc/rtc_base/networkroute.h"
-#include "webrtc/rtc_base/platform_file.h"
-#include "webrtc/rtc_base/socket.h"
-
-namespace webrtc {
-
-class AudioProcessing;
-class RtcEventLog;
-
-enum class MediaType {
-  ANY,
-  AUDIO,
-  VIDEO,
-  DATA
-};
-
-// Like std::min, but considers non-positive values to be unset.
-// TODO(zstein): Remove once all callers use rtc::Optional.
-template <typename T>
-static T MinPositive(T a, T b) {
-  if (a <= 0) {
-    return b;
-  }
-  if (b <= 0) {
-    return a;
-  }
-  return std::min(a, b);
-}
-
-class PacketReceiver {
- public:
-  enum DeliveryStatus {
-    DELIVERY_OK,
-    DELIVERY_UNKNOWN_SSRC,
-    DELIVERY_PACKET_ERROR,
-  };
-
-  virtual DeliveryStatus DeliverPacket(MediaType media_type,
-                                       const uint8_t* packet,
-                                       size_t length,
-                                       const PacketTime& packet_time) = 0;
-
- protected:
-  virtual ~PacketReceiver() {}
-};
-
-// A Call instance can contain several send and/or receive streams. All streams
-// are assumed to have the same remote endpoint and will share bitrate estimates
-// etc.
-class Call {
- public:
-  struct Config {
-    explicit Config(RtcEventLog* event_log) : event_log(event_log) {
-      RTC_DCHECK(event_log);
-    }
-
-    static constexpr int kDefaultStartBitrateBps = 300000;
-
-    // Bitrate config used until valid bitrate estimates are calculated. Also
-    // used to cap total bitrate used. This comes from the remote connection.
-    struct BitrateConfig {
-      int min_bitrate_bps = 0;
-      int start_bitrate_bps = kDefaultStartBitrateBps;
-      int max_bitrate_bps = -1;
-    } bitrate_config;
-
-    // The local client's bitrate preferences. The actual configuration used
-    // is a combination of this and |bitrate_config|. The combination is
-    // currently more complicated than a simple mask operation (see
-    // SetBitrateConfig and SetBitrateConfigMask). Assumes that 0 <= min <=
-    // start <= max holds for set parameters.
-    struct BitrateConfigMask {
-      rtc::Optional<int> min_bitrate_bps;
-      rtc::Optional<int> start_bitrate_bps;
-      rtc::Optional<int> max_bitrate_bps;
-    };
-
-    // AudioState which is possibly shared between multiple calls.
-    // TODO(solenberg): Change this to a shared_ptr once we can use C++11.
-    rtc::scoped_refptr<AudioState> audio_state;
-
-    // Audio Processing Module to be used in this call.
-    // TODO(solenberg): Change this to a shared_ptr once we can use C++11.
-    AudioProcessing* audio_processing = nullptr;
-
-    // RtcEventLog to use for this call. Required.
-    // Use webrtc::RtcEventLog::CreateNull() for a null implementation.
-    RtcEventLog* event_log = nullptr;
-  };
-
-  struct Stats {
-    std::string ToString(int64_t time_ms) const;
-
-    int send_bandwidth_bps = 0;       // Estimated available send bandwidth.
-    int max_padding_bitrate_bps = 0;  // Cumulative configured max padding.
-    int recv_bandwidth_bps = 0;       // Estimated available receive bandwidth.
-    int64_t pacer_delay_ms = 0;
-    int64_t rtt_ms = -1;
-  };
-
-  static Call* Create(const Call::Config& config);
-
-  // Allows mocking |transport_send| for testing.
-  static Call* Create(
-      const Call::Config& config,
-      std::unique_ptr<RtpTransportControllerSendInterface> transport_send);
-
-  virtual AudioSendStream* CreateAudioSendStream(
-      const AudioSendStream::Config& config) = 0;
-  virtual void DestroyAudioSendStream(AudioSendStream* send_stream) = 0;
-
-  virtual AudioReceiveStream* CreateAudioReceiveStream(
-      const AudioReceiveStream::Config& config) = 0;
-  virtual void DestroyAudioReceiveStream(
-      AudioReceiveStream* receive_stream) = 0;
-
-  virtual VideoSendStream* CreateVideoSendStream(
-      VideoSendStream::Config config,
-      VideoEncoderConfig encoder_config) = 0;
-  virtual void DestroyVideoSendStream(VideoSendStream* send_stream) = 0;
-
-  virtual VideoReceiveStream* CreateVideoReceiveStream(
-      VideoReceiveStream::Config configuration) = 0;
-  virtual void DestroyVideoReceiveStream(
-      VideoReceiveStream* receive_stream) = 0;
-
-  // In order for a created VideoReceiveStream to be aware that it is
-  // protected by a FlexfecReceiveStream, the latter should be created before
-  // the former.
-  virtual FlexfecReceiveStream* CreateFlexfecReceiveStream(
-      const FlexfecReceiveStream::Config& config) = 0;
-  virtual void DestroyFlexfecReceiveStream(
-      FlexfecReceiveStream* receive_stream) = 0;
-
-  // All received RTP and RTCP packets for the call should be inserted to this
-  // PacketReceiver. The PacketReceiver pointer is valid as long as the
-  // Call instance exists.
-  virtual PacketReceiver* Receiver() = 0;
-
-  // Returns the call statistics, such as estimated send and receive bandwidth,
-  // pacing delay, etc.
-  virtual Stats GetStats() const = 0;
-
-  // The greater min and smaller max set by this and SetBitrateConfigMask will
-  // be used. The latest non-negative start value from either call will be used.
-  // Specifying a start bitrate (>0) will reset the current bitrate estimate.
-  // This is due to how the 'x-google-start-bitrate' flag is currently
-  // implemented. Passing -1 leaves the start bitrate unchanged. Behavior is not
-  // guaranteed for other negative values or 0.
-  virtual void SetBitrateConfig(
-      const Config::BitrateConfig& bitrate_config) = 0;
-
-  // The greater min and smaller max set by this and SetBitrateConfig will be
-  // used. The latest non-negative start value form either call will be used.
-  // Specifying a start bitrate will reset the current bitrate estimate.
-  // Assumes 0 <= min <= start <= max holds for set parameters.
-  virtual void SetBitrateConfigMask(
-      const Config::BitrateConfigMask& bitrate_mask) = 0;
-
-  // TODO(skvlad): When the unbundled case with multiple streams for the same
-  // media type going over different networks is supported, track the state
-  // for each stream separately. Right now it's global per media type.
-  virtual void SignalChannelNetworkState(MediaType media,
-                                         NetworkState state) = 0;
-
-  virtual void OnTransportOverheadChanged(
-      MediaType media,
-      int transport_overhead_per_packet) = 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() {}
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_CALL_CALL_H_
diff --git a/call/call_perf_tests.cc b/call/call_perf_tests.cc
deleted file mode 100644
index 46611a1..0000000
--- a/call/call_perf_tests.cc
+++ /dev/null
@@ -1,788 +0,0 @@
-/*
- *  Copyright (c) 2013 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 <algorithm>
-#include <limits>
-#include <memory>
-#include <string>
-
-#include "webrtc/api/audio_codecs/builtin_audio_encoder_factory.h"
-#include "webrtc/call/call.h"
-#include "webrtc/call/video_config.h"
-#include "webrtc/logging/rtc_event_log/rtc_event_log.h"
-#include "webrtc/modules/audio_coding/include/audio_coding_module.h"
-#include "webrtc/modules/audio_mixer/audio_mixer_impl.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_header_parser.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/ptr_util.h"
-#include "webrtc/rtc_base/thread_annotations.h"
-#include "webrtc/system_wrappers/include/metrics_default.h"
-#include "webrtc/test/call_test.h"
-#include "webrtc/test/direct_transport.h"
-#include "webrtc/test/drifting_clock.h"
-#include "webrtc/test/encoder_settings.h"
-#include "webrtc/test/fake_audio_device.h"
-#include "webrtc/test/fake_encoder.h"
-#include "webrtc/test/field_trial.h"
-#include "webrtc/test/frame_generator.h"
-#include "webrtc/test/frame_generator_capturer.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/rtp_rtcp_observer.h"
-#include "webrtc/test/single_threaded_task_queue.h"
-#include "webrtc/test/testsupport/fileutils.h"
-#include "webrtc/test/testsupport/perf_test.h"
-#include "webrtc/video/transport_adapter.h"
-#include "webrtc/voice_engine/include/voe_base.h"
-
-using webrtc::test::DriftingClock;
-using webrtc::test::FakeAudioDevice;
-
-namespace webrtc {
-
-class CallPerfTest : public test::CallTest {
- protected:
-  enum class FecMode {
-    kOn, kOff
-  };
-  enum class CreateOrder {
-    kAudioFirst, kVideoFirst
-  };
-  void TestAudioVideoSync(FecMode fec,
-                          CreateOrder create_first,
-                          float video_ntp_speed,
-                          float video_rtp_speed,
-                          float audio_rtp_speed);
-
-  void TestMinTransmitBitrate(bool pad_to_min_bitrate);
-
-  void TestCaptureNtpTime(const FakeNetworkPipe::Config& net_config,
-                          int threshold_ms,
-                          int start_time_ms,
-                          int run_time_ms);
-};
-
-class VideoRtcpAndSyncObserver : public test::RtpRtcpObserver,
-                                 public rtc::VideoSinkInterface<VideoFrame> {
-  static const int kInSyncThresholdMs = 50;
-  static const int kStartupTimeMs = 2000;
-  static const int kMinRunTimeMs = 30000;
-
- public:
-  explicit VideoRtcpAndSyncObserver(Clock* clock)
-      : test::RtpRtcpObserver(CallPerfTest::kLongTimeoutMs),
-        clock_(clock),
-        creation_time_ms_(clock_->TimeInMilliseconds()),
-        first_time_in_sync_(-1),
-        receive_stream_(nullptr) {}
-
-  void OnFrame(const VideoFrame& video_frame) override {
-    VideoReceiveStream::Stats stats;
-    {
-      rtc::CritScope lock(&crit_);
-      if (receive_stream_)
-        stats = receive_stream_->GetStats();
-    }
-    if (stats.sync_offset_ms == std::numeric_limits<int>::max())
-      return;
-
-    int64_t now_ms = clock_->TimeInMilliseconds();
-    int64_t time_since_creation = now_ms - creation_time_ms_;
-    // During the first couple of seconds audio and video can falsely be
-    // estimated as being synchronized. We don't want to trigger on those.
-    if (time_since_creation < kStartupTimeMs)
-      return;
-    if (std::abs(stats.sync_offset_ms) < kInSyncThresholdMs) {
-      if (first_time_in_sync_ == -1) {
-        first_time_in_sync_ = now_ms;
-        webrtc::test::PrintResult("sync_convergence_time",
-                                  "",
-                                  "synchronization",
-                                  time_since_creation,
-                                  "ms",
-                                  false);
-      }
-      if (time_since_creation > kMinRunTimeMs)
-        observation_complete_.Set();
-    }
-    if (first_time_in_sync_ != -1)
-      sync_offset_ms_list_.push_back(stats.sync_offset_ms);
-  }
-
-  void set_receive_stream(VideoReceiveStream* receive_stream) {
-    rtc::CritScope lock(&crit_);
-    receive_stream_ = receive_stream;
-  }
-
-  void PrintResults() {
-    test::PrintResultList("stream_offset", "", "synchronization",
-                          test::ValuesToString(sync_offset_ms_list_), "ms",
-                          false);
-  }
-
- private:
-  Clock* const clock_;
-  const int64_t creation_time_ms_;
-  int64_t first_time_in_sync_;
-  rtc::CriticalSection crit_;
-  VideoReceiveStream* receive_stream_ RTC_GUARDED_BY(crit_);
-  std::vector<int> sync_offset_ms_list_;
-};
-
-void CallPerfTest::TestAudioVideoSync(FecMode fec,
-                                      CreateOrder create_first,
-                                      float video_ntp_speed,
-                                      float video_rtp_speed,
-                                      float audio_rtp_speed) {
-  const char* kSyncGroup = "av_sync";
-  const uint32_t kAudioSendSsrc = 1234;
-  const uint32_t kAudioRecvSsrc = 5678;
-
-  int send_channel_id;
-  int recv_channel_id;
-
-  FakeNetworkPipe::Config audio_net_config;
-  audio_net_config.queue_delay_ms = 500;
-  audio_net_config.loss_percent = 5;
-
-  rtc::scoped_refptr<AudioProcessing> audio_processing;
-  VoiceEngine* voice_engine;
-  VoEBase* voe_base;
-  std::unique_ptr<FakeAudioDevice> fake_audio_device;
-  VideoRtcpAndSyncObserver observer(Clock::GetRealTimeClock());
-
-  std::map<uint8_t, MediaType> audio_pt_map;
-  std::map<uint8_t, MediaType> video_pt_map;
-
-  std::unique_ptr<test::PacketTransport> audio_send_transport;
-  std::unique_ptr<test::PacketTransport> video_send_transport;
-  std::unique_ptr<test::PacketTransport> receive_transport;
-
-  AudioSendStream* audio_send_stream;
-  AudioReceiveStream* audio_receive_stream;
-  std::unique_ptr<DriftingClock> drifting_clock;
-
-  task_queue_.SendTask([&]() {
-    metrics::Reset();
-    audio_processing = AudioProcessing::Create();
-    voice_engine = VoiceEngine::Create();
-    voe_base = VoEBase::GetInterface(voice_engine);
-    fake_audio_device = rtc::MakeUnique<FakeAudioDevice>(
-        FakeAudioDevice::CreatePulsedNoiseCapturer(256, 48000),
-        FakeAudioDevice::CreateDiscardRenderer(48000), audio_rtp_speed);
-    EXPECT_EQ(0, voe_base->Init(fake_audio_device.get(), audio_processing.get(),
-                                decoder_factory_));
-    VoEBase::ChannelConfig config;
-    config.enable_voice_pacing = true;
-    send_channel_id = voe_base->CreateChannel(config);
-    recv_channel_id = voe_base->CreateChannel();
-
-    AudioState::Config send_audio_state_config;
-    send_audio_state_config.voice_engine = voice_engine;
-    send_audio_state_config.audio_mixer = AudioMixerImpl::Create();
-    send_audio_state_config.audio_processing = audio_processing;
-    Call::Config sender_config(event_log_.get());
-
-    sender_config.audio_state = AudioState::Create(send_audio_state_config);
-    Call::Config receiver_config(event_log_.get());
-    receiver_config.audio_state = sender_config.audio_state;
-    CreateCalls(sender_config, receiver_config);
-
-    std::copy_if(std::begin(payload_type_map_), std::end(payload_type_map_),
-                 std::inserter(audio_pt_map, audio_pt_map.end()),
-                 [](const std::pair<const uint8_t, MediaType>& pair) {
-                   return pair.second == MediaType::AUDIO;
-                 });
-    std::copy_if(std::begin(payload_type_map_), std::end(payload_type_map_),
-                 std::inserter(video_pt_map, video_pt_map.end()),
-                 [](const std::pair<const uint8_t, MediaType>& pair) {
-                   return pair.second == MediaType::VIDEO;
-                 });
-
-    audio_send_transport = rtc::MakeUnique<test::PacketTransport>(
-        &task_queue_, sender_call_.get(), &observer,
-        test::PacketTransport::kSender, audio_pt_map, audio_net_config);
-    audio_send_transport->SetReceiver(receiver_call_->Receiver());
-
-    video_send_transport = rtc::MakeUnique<test::PacketTransport>(
-        &task_queue_, sender_call_.get(), &observer,
-        test::PacketTransport::kSender, video_pt_map,
-        FakeNetworkPipe::Config());
-    video_send_transport->SetReceiver(receiver_call_->Receiver());
-
-    receive_transport = rtc::MakeUnique<test::PacketTransport>(
-        &task_queue_, receiver_call_.get(), &observer,
-        test::PacketTransport::kReceiver, payload_type_map_,
-        FakeNetworkPipe::Config());
-    receive_transport->SetReceiver(sender_call_->Receiver());
-
-    CreateSendConfig(1, 0, 0, video_send_transport.get());
-    CreateMatchingReceiveConfigs(receive_transport.get());
-
-    AudioSendStream::Config audio_send_config(audio_send_transport.get());
-    audio_send_config.voe_channel_id = send_channel_id;
-    audio_send_config.rtp.ssrc = kAudioSendSsrc;
-    audio_send_config.send_codec_spec =
-        rtc::Optional<AudioSendStream::Config::SendCodecSpec>(
-            {kAudioSendPayloadType, {"ISAC", 16000, 1}});
-    audio_send_config.encoder_factory = CreateBuiltinAudioEncoderFactory();
-    audio_send_stream = sender_call_->CreateAudioSendStream(audio_send_config);
-
-    video_send_config_.rtp.nack.rtp_history_ms = kNackRtpHistoryMs;
-    if (fec == FecMode::kOn) {
-      video_send_config_.rtp.ulpfec.red_payload_type = kRedPayloadType;
-      video_send_config_.rtp.ulpfec.ulpfec_payload_type = kUlpfecPayloadType;
-      video_receive_configs_[0].rtp.ulpfec.red_payload_type = kRedPayloadType;
-      video_receive_configs_[0].rtp.ulpfec.ulpfec_payload_type =
-          kUlpfecPayloadType;
-    }
-    video_receive_configs_[0].rtp.nack.rtp_history_ms = 1000;
-    video_receive_configs_[0].renderer = &observer;
-    video_receive_configs_[0].sync_group = kSyncGroup;
-
-    AudioReceiveStream::Config audio_recv_config;
-    audio_recv_config.rtp.remote_ssrc = kAudioSendSsrc;
-    audio_recv_config.rtp.local_ssrc = kAudioRecvSsrc;
-    audio_recv_config.voe_channel_id = recv_channel_id;
-    audio_recv_config.sync_group = kSyncGroup;
-    audio_recv_config.decoder_factory = decoder_factory_;
-    audio_recv_config.decoder_map = {
-        {kAudioSendPayloadType, {"ISAC", 16000, 1}}};
-
-    if (create_first == CreateOrder::kAudioFirst) {
-      audio_receive_stream =
-          receiver_call_->CreateAudioReceiveStream(audio_recv_config);
-      CreateVideoStreams();
-    } else {
-      CreateVideoStreams();
-      audio_receive_stream =
-          receiver_call_->CreateAudioReceiveStream(audio_recv_config);
-    }
-    EXPECT_EQ(1u, video_receive_streams_.size());
-    observer.set_receive_stream(video_receive_streams_[0]);
-    drifting_clock = rtc::MakeUnique<DriftingClock>(clock_, video_ntp_speed);
-    CreateFrameGeneratorCapturerWithDrift(drifting_clock.get(), video_rtp_speed,
-                                          kDefaultFramerate, kDefaultWidth,
-                                          kDefaultHeight);
-
-    Start();
-
-    audio_send_stream->Start();
-    audio_receive_stream->Start();
-  });
-
-  EXPECT_TRUE(observer.Wait())
-      << "Timed out while waiting for audio and video to be synchronized.";
-
-  task_queue_.SendTask([&]() {
-    audio_send_stream->Stop();
-    audio_receive_stream->Stop();
-
-    Stop();
-
-    DestroyStreams();
-
-    video_send_transport.reset();
-    audio_send_transport.reset();
-    receive_transport.reset();
-
-    sender_call_->DestroyAudioSendStream(audio_send_stream);
-    receiver_call_->DestroyAudioReceiveStream(audio_receive_stream);
-
-    voe_base->DeleteChannel(send_channel_id);
-    voe_base->DeleteChannel(recv_channel_id);
-    voe_base->Release();
-
-    DestroyCalls();
-
-    VoiceEngine::Delete(voice_engine);
-
-    fake_audio_device.reset();
-  });
-
-  observer.PrintResults();
-
-  // In quick test synchronization may not be achieved in time.
-  if (!field_trial::IsEnabled("WebRTC-QuickPerfTest")) {
-    EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.AVSyncOffsetInMs"));
-  }
-}
-
-TEST_F(CallPerfTest, PlaysOutAudioAndVideoInSyncWithVideoNtpDrift) {
-  TestAudioVideoSync(FecMode::kOff, CreateOrder::kAudioFirst,
-                     DriftingClock::PercentsFaster(10.0f),
-                     DriftingClock::kNoDrift, DriftingClock::kNoDrift);
-}
-
-TEST_F(CallPerfTest, PlaysOutAudioAndVideoInSyncWithAudioFasterThanVideoDrift) {
-  TestAudioVideoSync(FecMode::kOff, CreateOrder::kAudioFirst,
-                     DriftingClock::kNoDrift,
-                     DriftingClock::PercentsSlower(30.0f),
-                     DriftingClock::PercentsFaster(30.0f));
-}
-
-TEST_F(CallPerfTest, PlaysOutAudioAndVideoInSyncWithVideoFasterThanAudioDrift) {
-  TestAudioVideoSync(FecMode::kOn, CreateOrder::kVideoFirst,
-                     DriftingClock::kNoDrift,
-                     DriftingClock::PercentsFaster(30.0f),
-                     DriftingClock::PercentsSlower(30.0f));
-}
-
-void CallPerfTest::TestCaptureNtpTime(const FakeNetworkPipe::Config& net_config,
-                                      int threshold_ms,
-                                      int start_time_ms,
-                                      int run_time_ms) {
-  class CaptureNtpTimeObserver : public test::EndToEndTest,
-                                 public rtc::VideoSinkInterface<VideoFrame> {
-   public:
-    CaptureNtpTimeObserver(const FakeNetworkPipe::Config& net_config,
-                           int threshold_ms,
-                           int start_time_ms,
-                           int run_time_ms)
-        : EndToEndTest(kLongTimeoutMs),
-          net_config_(net_config),
-          clock_(Clock::GetRealTimeClock()),
-          threshold_ms_(threshold_ms),
-          start_time_ms_(start_time_ms),
-          run_time_ms_(run_time_ms),
-          creation_time_ms_(clock_->TimeInMilliseconds()),
-          capturer_(nullptr),
-          rtp_start_timestamp_set_(false),
-          rtp_start_timestamp_(0) {}
-
-   private:
-    test::PacketTransport* CreateSendTransport(
-        test::SingleThreadedTaskQueueForTesting* task_queue,
-        Call* sender_call) override {
-      return new test::PacketTransport(task_queue, sender_call, this,
-                                       test::PacketTransport::kSender,
-                                       payload_type_map_, net_config_);
-    }
-
-    test::PacketTransport* CreateReceiveTransport(
-        test::SingleThreadedTaskQueueForTesting* task_queue) override {
-      return new test::PacketTransport(task_queue, nullptr, this,
-                                       test::PacketTransport::kReceiver,
-                                       payload_type_map_, net_config_);
-    }
-
-    void OnFrame(const VideoFrame& video_frame) override {
-      rtc::CritScope lock(&crit_);
-      if (video_frame.ntp_time_ms() <= 0) {
-        // Haven't got enough RTCP SR in order to calculate the capture ntp
-        // time.
-        return;
-      }
-
-      int64_t now_ms = clock_->TimeInMilliseconds();
-      int64_t time_since_creation = now_ms - creation_time_ms_;
-      if (time_since_creation < start_time_ms_) {
-        // Wait for |start_time_ms_| before start measuring.
-        return;
-      }
-
-      if (time_since_creation > run_time_ms_) {
-        observation_complete_.Set();
-      }
-
-      FrameCaptureTimeList::iterator iter =
-          capture_time_list_.find(video_frame.timestamp());
-      EXPECT_TRUE(iter != capture_time_list_.end());
-
-      // The real capture time has been wrapped to uint32_t before converted
-      // to rtp timestamp in the sender side. So here we convert the estimated
-      // capture time to a uint32_t 90k timestamp also for comparing.
-      uint32_t estimated_capture_timestamp =
-          90 * static_cast<uint32_t>(video_frame.ntp_time_ms());
-      uint32_t real_capture_timestamp = iter->second;
-      int time_offset_ms = real_capture_timestamp - estimated_capture_timestamp;
-      time_offset_ms = time_offset_ms / 90;
-      time_offset_ms_list_.push_back(time_offset_ms);
-
-      EXPECT_TRUE(std::abs(time_offset_ms) < threshold_ms_);
-    }
-
-    Action OnSendRtp(const uint8_t* packet, size_t length) override {
-      rtc::CritScope lock(&crit_);
-      RTPHeader header;
-      EXPECT_TRUE(parser_->Parse(packet, length, &header));
-
-      if (!rtp_start_timestamp_set_) {
-        // Calculate the rtp timestamp offset in order to calculate the real
-        // capture time.
-        uint32_t first_capture_timestamp =
-            90 * static_cast<uint32_t>(capturer_->first_frame_capture_time());
-        rtp_start_timestamp_ = header.timestamp - first_capture_timestamp;
-        rtp_start_timestamp_set_ = true;
-      }
-
-      uint32_t capture_timestamp = header.timestamp - rtp_start_timestamp_;
-      capture_time_list_.insert(
-          capture_time_list_.end(),
-          std::make_pair(header.timestamp, capture_timestamp));
-      return SEND_PACKET;
-    }
-
-    void OnFrameGeneratorCapturerCreated(
-        test::FrameGeneratorCapturer* frame_generator_capturer) override {
-      capturer_ = frame_generator_capturer;
-    }
-
-    void ModifyVideoConfigs(
-        VideoSendStream::Config* send_config,
-        std::vector<VideoReceiveStream::Config>* receive_configs,
-        VideoEncoderConfig* encoder_config) override {
-      (*receive_configs)[0].renderer = this;
-      // Enable the receiver side rtt calculation.
-      (*receive_configs)[0].rtp.rtcp_xr.receiver_reference_time_report = true;
-    }
-
-    void PerformTest() override {
-      EXPECT_TRUE(Wait()) << "Timed out while waiting for "
-                             "estimated capture NTP time to be "
-                             "within bounds.";
-      test::PrintResultList("capture_ntp_time", "", "real - estimated",
-                            test::ValuesToString(time_offset_ms_list_), "ms",
-                            true);
-    }
-
-    rtc::CriticalSection crit_;
-    const FakeNetworkPipe::Config net_config_;
-    Clock* const clock_;
-    int threshold_ms_;
-    int start_time_ms_;
-    int run_time_ms_;
-    int64_t creation_time_ms_;
-    test::FrameGeneratorCapturer* capturer_;
-    bool rtp_start_timestamp_set_;
-    uint32_t rtp_start_timestamp_;
-    typedef std::map<uint32_t, uint32_t> FrameCaptureTimeList;
-    FrameCaptureTimeList capture_time_list_ RTC_GUARDED_BY(&crit_);
-    std::vector<int> time_offset_ms_list_;
-  } test(net_config, threshold_ms, start_time_ms, run_time_ms);
-
-  RunBaseTest(&test);
-}
-
-TEST_F(CallPerfTest, CaptureNtpTimeWithNetworkDelay) {
-  FakeNetworkPipe::Config net_config;
-  net_config.queue_delay_ms = 100;
-  // TODO(wu): lower the threshold as the calculation/estimatation becomes more
-  // accurate.
-  const int kThresholdMs = 100;
-  const int kStartTimeMs = 10000;
-  const int kRunTimeMs = 20000;
-  TestCaptureNtpTime(net_config, kThresholdMs, kStartTimeMs, kRunTimeMs);
-}
-
-TEST_F(CallPerfTest, CaptureNtpTimeWithNetworkJitter) {
-  FakeNetworkPipe::Config net_config;
-  net_config.queue_delay_ms = 100;
-  net_config.delay_standard_deviation_ms = 10;
-  // TODO(wu): lower the threshold as the calculation/estimatation becomes more
-  // accurate.
-  const int kThresholdMs = 100;
-  const int kStartTimeMs = 10000;
-  const int kRunTimeMs = 20000;
-  TestCaptureNtpTime(net_config, kThresholdMs, kStartTimeMs, kRunTimeMs);
-}
-
-TEST_F(CallPerfTest, ReceivesCpuOveruseAndUnderuse) {
-  // Minimal normal usage at the start, then 30s overuse to allow filter to
-  // settle, and then 80s underuse to allow plenty of time for rampup again.
-  test::ScopedFieldTrials fake_overuse_settings(
-      "WebRTC-ForceSimulatedOveruseIntervalMs/1-30000-80000/");
-
-  class LoadObserver : public test::SendTest,
-                       public test::FrameGeneratorCapturer::SinkWantsObserver {
-   public:
-    LoadObserver() : SendTest(kLongTimeoutMs), test_phase_(TestPhase::kStart) {}
-
-    void OnFrameGeneratorCapturerCreated(
-        test::FrameGeneratorCapturer* frame_generator_capturer) override {
-      frame_generator_capturer->SetSinkWantsObserver(this);
-      // Set a high initial resolution to be sure that we can scale down.
-      frame_generator_capturer->ChangeResolution(1920, 1080);
-    }
-
-    // OnSinkWantsChanged is called when FrameGeneratorCapturer::AddOrUpdateSink
-    // is called.
-    // TODO(sprang): Add integration test for maintain-framerate mode?
-    void OnSinkWantsChanged(rtc::VideoSinkInterface<VideoFrame>* sink,
-                            const rtc::VideoSinkWants& wants) override {
-      // First expect CPU overuse. Then expect CPU underuse when the encoder
-      // delay has been decreased.
-      switch (test_phase_) {
-        case TestPhase::kStart:
-          if (wants.max_pixel_count < std::numeric_limits<int>::max()) {
-            // On adapting down, VideoStreamEncoder::VideoSourceProxy will set
-            // only the max pixel count, leaving the target unset.
-            test_phase_ = TestPhase::kAdaptedDown;
-          } else {
-            ADD_FAILURE() << "Got unexpected adaptation request, max res = "
-                          << wants.max_pixel_count << ", target res = "
-                          << wants.target_pixel_count.value_or(-1)
-                          << ", max fps = " << wants.max_framerate_fps;
-          }
-          break;
-        case TestPhase::kAdaptedDown:
-          // On adapting up, the adaptation counter will again be at zero, and
-          // so all constraints will be reset.
-          if (wants.max_pixel_count == std::numeric_limits<int>::max() &&
-              !wants.target_pixel_count) {
-            test_phase_ = TestPhase::kAdaptedUp;
-            observation_complete_.Set();
-          } else {
-            ADD_FAILURE() << "Got unexpected adaptation request, max res = "
-                          << wants.max_pixel_count << ", target res = "
-                          << wants.target_pixel_count.value_or(-1)
-                          << ", max fps = " << wants.max_framerate_fps;
-          }
-          break;
-        case TestPhase::kAdaptedUp:
-          ADD_FAILURE() << "Got unexpected adaptation request, max res = "
-                        << wants.max_pixel_count << ", target res = "
-                        << wants.target_pixel_count.value_or(-1)
-                        << ", max fps = " << wants.max_framerate_fps;
-      }
-    }
-
-    void ModifyVideoConfigs(
-        VideoSendStream::Config* send_config,
-        std::vector<VideoReceiveStream::Config>* receive_configs,
-        VideoEncoderConfig* encoder_config) override {
-    }
-
-    void PerformTest() override {
-      EXPECT_TRUE(Wait()) << "Timed out before receiving an overuse callback.";
-    }
-
-    enum class TestPhase { kStart, kAdaptedDown, kAdaptedUp } test_phase_;
-  } test;
-
-  RunBaseTest(&test);
-}
-
-void CallPerfTest::TestMinTransmitBitrate(bool pad_to_min_bitrate) {
-  static const int kMaxEncodeBitrateKbps = 30;
-  static const int kMinTransmitBitrateBps = 150000;
-  static const int kMinAcceptableTransmitBitrate = 130;
-  static const int kMaxAcceptableTransmitBitrate = 170;
-  static const int kNumBitrateObservationsInRange = 100;
-  static const int kAcceptableBitrateErrorMargin = 15;  // +- 7
-  class BitrateObserver : public test::EndToEndTest {
-   public:
-    explicit BitrateObserver(bool using_min_transmit_bitrate)
-        : EndToEndTest(kLongTimeoutMs),
-          send_stream_(nullptr),
-          converged_(false),
-          pad_to_min_bitrate_(using_min_transmit_bitrate),
-          min_acceptable_bitrate_(using_min_transmit_bitrate
-                                      ? kMinAcceptableTransmitBitrate
-                                      : (kMaxEncodeBitrateKbps -
-                                         kAcceptableBitrateErrorMargin / 2)),
-          max_acceptable_bitrate_(using_min_transmit_bitrate
-                                      ? kMaxAcceptableTransmitBitrate
-                                      : (kMaxEncodeBitrateKbps +
-                                         kAcceptableBitrateErrorMargin / 2)),
-          num_bitrate_observations_in_range_(0) {}
-
-   private:
-    // TODO(holmer): Run this with a timer instead of once per packet.
-    Action OnSendRtp(const uint8_t* packet, size_t length) override {
-      VideoSendStream::Stats stats = send_stream_->GetStats();
-      if (stats.substreams.size() > 0) {
-        RTC_DCHECK_EQ(1, stats.substreams.size());
-        int bitrate_kbps =
-            stats.substreams.begin()->second.total_bitrate_bps / 1000;
-        if (bitrate_kbps > min_acceptable_bitrate_ &&
-            bitrate_kbps < max_acceptable_bitrate_) {
-          converged_ = true;
-          ++num_bitrate_observations_in_range_;
-          if (num_bitrate_observations_in_range_ ==
-              kNumBitrateObservationsInRange)
-            observation_complete_.Set();
-        }
-        if (converged_)
-          bitrate_kbps_list_.push_back(bitrate_kbps);
-      }
-      return SEND_PACKET;
-    }
-
-    void OnVideoStreamsCreated(
-        VideoSendStream* send_stream,
-        const std::vector<VideoReceiveStream*>& receive_streams) override {
-      send_stream_ = send_stream;
-    }
-
-    void ModifyVideoConfigs(
-        VideoSendStream::Config* send_config,
-        std::vector<VideoReceiveStream::Config>* receive_configs,
-        VideoEncoderConfig* encoder_config) override {
-      if (pad_to_min_bitrate_) {
-        encoder_config->min_transmit_bitrate_bps = kMinTransmitBitrateBps;
-      } else {
-        RTC_DCHECK_EQ(0, encoder_config->min_transmit_bitrate_bps);
-      }
-    }
-
-    void PerformTest() override {
-      EXPECT_TRUE(Wait()) << "Timeout while waiting for send-bitrate stats.";
-      test::PrintResultList(
-          "bitrate_stats_",
-          (pad_to_min_bitrate_ ? "min_transmit_bitrate"
-                               : "without_min_transmit_bitrate"),
-          "bitrate_kbps", test::ValuesToString(bitrate_kbps_list_), "kbps",
-          false);
-    }
-
-    VideoSendStream* send_stream_;
-    bool converged_;
-    const bool pad_to_min_bitrate_;
-    const int min_acceptable_bitrate_;
-    const int max_acceptable_bitrate_;
-    int num_bitrate_observations_in_range_;
-    std::vector<size_t> bitrate_kbps_list_;
-  } test(pad_to_min_bitrate);
-
-  fake_encoder_.SetMaxBitrate(kMaxEncodeBitrateKbps);
-  RunBaseTest(&test);
-}
-
-TEST_F(CallPerfTest, PadsToMinTransmitBitrate) { TestMinTransmitBitrate(true); }
-
-TEST_F(CallPerfTest, NoPadWithoutMinTransmitBitrate) {
-  TestMinTransmitBitrate(false);
-}
-
-TEST_F(CallPerfTest, KeepsHighBitrateWhenReconfiguringSender) {
-  static const uint32_t kInitialBitrateKbps = 400;
-  static const uint32_t kReconfigureThresholdKbps = 600;
-  static const uint32_t kPermittedReconfiguredBitrateDiffKbps = 100;
-
-  class VideoStreamFactory
-      : public VideoEncoderConfig::VideoStreamFactoryInterface {
-   public:
-    VideoStreamFactory() {}
-
-   private:
-    std::vector<VideoStream> CreateEncoderStreams(
-        int width,
-        int height,
-        const VideoEncoderConfig& encoder_config) override {
-      std::vector<VideoStream> streams =
-          test::CreateVideoStreams(width, height, encoder_config);
-      streams[0].min_bitrate_bps = 50000;
-      streams[0].target_bitrate_bps = streams[0].max_bitrate_bps = 2000000;
-      return streams;
-    }
-  };
-
-  class BitrateObserver : public test::EndToEndTest, public test::FakeEncoder {
-   public:
-    BitrateObserver()
-        : EndToEndTest(kDefaultTimeoutMs),
-          FakeEncoder(Clock::GetRealTimeClock()),
-          time_to_reconfigure_(false, false),
-          encoder_inits_(0),
-          last_set_bitrate_kbps_(0),
-          send_stream_(nullptr),
-          frame_generator_(nullptr) {}
-
-    int32_t InitEncode(const VideoCodec* config,
-                       int32_t number_of_cores,
-                       size_t max_payload_size) override {
-      ++encoder_inits_;
-      if (encoder_inits_ == 1) {
-        // First time initialization. Frame size is known.
-        // |expected_bitrate| is affected by bandwidth estimation before the
-        // first frame arrives to the encoder.
-        uint32_t expected_bitrate = last_set_bitrate_kbps_ > 0
-                                        ? last_set_bitrate_kbps_
-                                        : kInitialBitrateKbps;
-        EXPECT_EQ(expected_bitrate, config->startBitrate)
-            << "Encoder not initialized at expected bitrate.";
-        EXPECT_EQ(kDefaultWidth, config->width);
-        EXPECT_EQ(kDefaultHeight, config->height);
-      } else if (encoder_inits_ == 2) {
-        EXPECT_EQ(2 * kDefaultWidth, config->width);
-        EXPECT_EQ(2 * kDefaultHeight, config->height);
-        EXPECT_GE(last_set_bitrate_kbps_, kReconfigureThresholdKbps);
-        EXPECT_GT(
-            config->startBitrate,
-            last_set_bitrate_kbps_ - kPermittedReconfiguredBitrateDiffKbps)
-            << "Encoder reconfigured with bitrate too far away from last set.";
-        observation_complete_.Set();
-      }
-      return FakeEncoder::InitEncode(config, number_of_cores, max_payload_size);
-    }
-
-    int32_t SetRateAllocation(const BitrateAllocation& rate_allocation,
-                              uint32_t framerate) override {
-      last_set_bitrate_kbps_ = rate_allocation.get_sum_kbps();
-      if (encoder_inits_ == 1 &&
-          rate_allocation.get_sum_kbps() > kReconfigureThresholdKbps) {
-        time_to_reconfigure_.Set();
-      }
-      return FakeEncoder::SetRateAllocation(rate_allocation, framerate);
-    }
-
-    Call::Config GetSenderCallConfig() override {
-      Call::Config config = EndToEndTest::GetSenderCallConfig();
-      config.event_log = event_log_.get();
-      config.bitrate_config.start_bitrate_bps = kInitialBitrateKbps * 1000;
-      return config;
-    }
-
-    void ModifyVideoConfigs(
-        VideoSendStream::Config* send_config,
-        std::vector<VideoReceiveStream::Config>* receive_configs,
-        VideoEncoderConfig* encoder_config) override {
-      send_config->encoder_settings.encoder = this;
-      encoder_config->max_bitrate_bps = 2 * kReconfigureThresholdKbps * 1000;
-      encoder_config->video_stream_factory =
-          new rtc::RefCountedObject<VideoStreamFactory>();
-
-      encoder_config_ = encoder_config->Copy();
-    }
-
-    void OnVideoStreamsCreated(
-        VideoSendStream* send_stream,
-        const std::vector<VideoReceiveStream*>& receive_streams) override {
-      send_stream_ = send_stream;
-    }
-
-    void OnFrameGeneratorCapturerCreated(
-        test::FrameGeneratorCapturer* frame_generator_capturer) override {
-      frame_generator_ = frame_generator_capturer;
-    }
-
-    void PerformTest() override {
-      ASSERT_TRUE(time_to_reconfigure_.Wait(kDefaultTimeoutMs))
-          << "Timed out before receiving an initial high bitrate.";
-      frame_generator_->ChangeResolution(kDefaultWidth * 2, kDefaultHeight * 2);
-      send_stream_->ReconfigureVideoEncoder(encoder_config_.Copy());
-      EXPECT_TRUE(Wait())
-          << "Timed out while waiting for a couple of high bitrate estimates "
-             "after reconfiguring the send stream.";
-    }
-
-   private:
-    rtc::Event time_to_reconfigure_;
-    int encoder_inits_;
-    uint32_t last_set_bitrate_kbps_;
-    VideoSendStream* send_stream_;
-    test::FrameGeneratorCapturer* frame_generator_;
-    VideoEncoderConfig encoder_config_;
-  } test;
-
-  RunBaseTest(&test);
-}
-
-}  // namespace webrtc
diff --git a/call/call_unittest.cc b/call/call_unittest.cc
deleted file mode 100644
index e342dfa..0000000
--- a/call/call_unittest.cc
+++ /dev/null
@@ -1,718 +0,0 @@
-/*
- *  Copyright (c) 2015 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 <list>
-#include <map>
-#include <memory>
-#include <utility>
-
-#include "webrtc/api/test/mock_audio_mixer.h"
-#include "webrtc/call/audio_state.h"
-#include "webrtc/call/call.h"
-#include "webrtc/call/fake_rtp_transport_controller_send.h"
-#include "webrtc/logging/rtc_event_log/rtc_event_log.h"
-#include "webrtc/modules/audio_device/include/mock_audio_device.h"
-#include "webrtc/modules/audio_mixer/audio_mixer_impl.h"
-#include "webrtc/modules/congestion_controller/include/mock/mock_send_side_congestion_controller.h"
-#include "webrtc/modules/pacing/mock/mock_paced_sender.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp.h"
-#include "webrtc/rtc_base/ptr_util.h"
-#include "webrtc/test/fake_encoder.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/mock_audio_decoder_factory.h"
-#include "webrtc/test/mock_transport.h"
-#include "webrtc/test/mock_voice_engine.h"
-
-namespace {
-
-struct CallHelper {
-  explicit CallHelper(
-      rtc::scoped_refptr<webrtc::AudioDecoderFactory> decoder_factory = nullptr)
-      : voice_engine_(decoder_factory) {
-    webrtc::AudioState::Config audio_state_config;
-    audio_state_config.voice_engine = &voice_engine_;
-    audio_state_config.audio_mixer = webrtc::AudioMixerImpl::Create();
-    audio_state_config.audio_processing = webrtc::AudioProcessing::Create();
-    EXPECT_CALL(voice_engine_, audio_device_module());
-    EXPECT_CALL(voice_engine_, audio_transport());
-    webrtc::Call::Config config(&event_log_);
-    config.audio_state = webrtc::AudioState::Create(audio_state_config);
-    call_.reset(webrtc::Call::Create(config));
-  }
-
-  webrtc::Call* operator->() { return call_.get(); }
-  webrtc::test::MockVoiceEngine* voice_engine() { return &voice_engine_; }
-
- private:
-  testing::NiceMock<webrtc::test::MockVoiceEngine> voice_engine_;
-  webrtc::RtcEventLogNullImpl event_log_;
-  std::unique_ptr<webrtc::Call> call_;
-};
-}  // namespace
-
-namespace webrtc {
-
-TEST(CallTest, ConstructDestruct) {
-  CallHelper call;
-}
-
-TEST(CallTest, CreateDestroy_AudioSendStream) {
-  CallHelper call;
-  AudioSendStream::Config config(nullptr);
-  config.rtp.ssrc = 42;
-  config.voe_channel_id = 123;
-  AudioSendStream* stream = call->CreateAudioSendStream(config);
-  EXPECT_NE(stream, nullptr);
-  call->DestroyAudioSendStream(stream);
-}
-
-TEST(CallTest, CreateDestroy_AudioReceiveStream) {
-  rtc::scoped_refptr<webrtc::AudioDecoderFactory> decoder_factory(
-      new rtc::RefCountedObject<webrtc::MockAudioDecoderFactory>);
-  CallHelper call(decoder_factory);
-  AudioReceiveStream::Config config;
-  config.rtp.remote_ssrc = 42;
-  config.voe_channel_id = 123;
-  config.decoder_factory = decoder_factory;
-  AudioReceiveStream* stream = call->CreateAudioReceiveStream(config);
-  EXPECT_NE(stream, nullptr);
-  call->DestroyAudioReceiveStream(stream);
-}
-
-TEST(CallTest, CreateDestroy_AudioSendStreams) {
-  CallHelper call;
-  AudioSendStream::Config config(nullptr);
-  config.voe_channel_id = 123;
-  std::list<AudioSendStream*> streams;
-  for (int i = 0; i < 2; ++i) {
-    for (uint32_t ssrc = 0; ssrc < 1234567; ssrc += 34567) {
-      config.rtp.ssrc = ssrc;
-      AudioSendStream* stream = call->CreateAudioSendStream(config);
-      EXPECT_NE(stream, nullptr);
-      if (ssrc & 1) {
-        streams.push_back(stream);
-      } else {
-        streams.push_front(stream);
-      }
-    }
-    for (auto s : streams) {
-      call->DestroyAudioSendStream(s);
-    }
-    streams.clear();
-  }
-}
-
-TEST(CallTest, CreateDestroy_AudioReceiveStreams) {
-  rtc::scoped_refptr<webrtc::AudioDecoderFactory> decoder_factory(
-      new rtc::RefCountedObject<webrtc::MockAudioDecoderFactory>);
-  CallHelper call(decoder_factory);
-  AudioReceiveStream::Config config;
-  config.voe_channel_id = 123;
-  config.decoder_factory = decoder_factory;
-  std::list<AudioReceiveStream*> streams;
-  for (int i = 0; i < 2; ++i) {
-    for (uint32_t ssrc = 0; ssrc < 1234567; ssrc += 34567) {
-      config.rtp.remote_ssrc = ssrc;
-      AudioReceiveStream* stream = call->CreateAudioReceiveStream(config);
-      EXPECT_NE(stream, nullptr);
-      if (ssrc & 1) {
-        streams.push_back(stream);
-      } else {
-        streams.push_front(stream);
-      }
-    }
-    for (auto s : streams) {
-      call->DestroyAudioReceiveStream(s);
-    }
-    streams.clear();
-  }
-}
-
-TEST(CallTest, CreateDestroy_AssociateAudioSendReceiveStreams_RecvFirst) {
-  rtc::scoped_refptr<webrtc::AudioDecoderFactory> decoder_factory(
-      new rtc::RefCountedObject<webrtc::MockAudioDecoderFactory>);
-  CallHelper call(decoder_factory);
-  ::testing::NiceMock<MockRtpRtcp> mock_rtp_rtcp;
-
-  constexpr int kRecvChannelId = 101;
-
-  // Set up the mock to create a channel proxy which we know of, so that we can
-  // add our expectations to it.
-  test::MockVoEChannelProxy* recv_channel_proxy = nullptr;
-  EXPECT_CALL(*call.voice_engine(), ChannelProxyFactory(testing::_))
-      .WillRepeatedly(testing::Invoke([&](int channel_id) {
-        test::MockVoEChannelProxy* channel_proxy =
-            new testing::NiceMock<test::MockVoEChannelProxy>();
-        EXPECT_CALL(*channel_proxy, GetAudioDecoderFactory())
-            .WillRepeatedly(testing::ReturnRef(decoder_factory));
-        EXPECT_CALL(*channel_proxy, SetReceiveCodecs(testing::_))
-            .WillRepeatedly(testing::Invoke(
-                [](const std::map<int, SdpAudioFormat>& codecs) {
-                  EXPECT_THAT(codecs, testing::IsEmpty());
-                }));
-        EXPECT_CALL(*channel_proxy, GetRtpRtcp(testing::_, testing::_))
-            .WillRepeatedly(testing::SetArgPointee<0>(&mock_rtp_rtcp));
-        // If being called for the send channel, save a pointer to the channel
-        // proxy for later.
-        if (channel_id == kRecvChannelId) {
-          EXPECT_FALSE(recv_channel_proxy);
-          recv_channel_proxy = channel_proxy;
-        }
-        return channel_proxy;
-      }));
-
-  AudioReceiveStream::Config recv_config;
-  recv_config.rtp.remote_ssrc = 42;
-  recv_config.rtp.local_ssrc = 777;
-  recv_config.voe_channel_id = kRecvChannelId;
-  recv_config.decoder_factory = decoder_factory;
-  AudioReceiveStream* recv_stream = call->CreateAudioReceiveStream(recv_config);
-  EXPECT_NE(recv_stream, nullptr);
-
-  EXPECT_CALL(*recv_channel_proxy, AssociateSendChannel(testing::_)).Times(1);
-  AudioSendStream::Config send_config(nullptr);
-  send_config.rtp.ssrc = 777;
-  send_config.voe_channel_id = 123;
-  AudioSendStream* send_stream = call->CreateAudioSendStream(send_config);
-  EXPECT_NE(send_stream, nullptr);
-
-  EXPECT_CALL(*recv_channel_proxy, DisassociateSendChannel()).Times(1);
-  call->DestroyAudioSendStream(send_stream);
-
-  EXPECT_CALL(*recv_channel_proxy, DisassociateSendChannel()).Times(1);
-  call->DestroyAudioReceiveStream(recv_stream);
-}
-
-TEST(CallTest, CreateDestroy_AssociateAudioSendReceiveStreams_SendFirst) {
-  rtc::scoped_refptr<webrtc::AudioDecoderFactory> decoder_factory(
-      new rtc::RefCountedObject<webrtc::MockAudioDecoderFactory>);
-  CallHelper call(decoder_factory);
-  ::testing::NiceMock<MockRtpRtcp> mock_rtp_rtcp;
-
-  constexpr int kRecvChannelId = 101;
-
-  // Set up the mock to create a channel proxy which we know of, so that we can
-  // add our expectations to it.
-  test::MockVoEChannelProxy* recv_channel_proxy = nullptr;
-  EXPECT_CALL(*call.voice_engine(), ChannelProxyFactory(testing::_))
-      .WillRepeatedly(testing::Invoke([&](int channel_id) {
-        test::MockVoEChannelProxy* channel_proxy =
-            new testing::NiceMock<test::MockVoEChannelProxy>();
-        EXPECT_CALL(*channel_proxy, GetAudioDecoderFactory())
-            .WillRepeatedly(testing::ReturnRef(decoder_factory));
-        EXPECT_CALL(*channel_proxy, SetReceiveCodecs(testing::_))
-            .WillRepeatedly(testing::Invoke(
-                [](const std::map<int, SdpAudioFormat>& codecs) {
-                  EXPECT_THAT(codecs, testing::IsEmpty());
-                }));
-        EXPECT_CALL(*channel_proxy, GetRtpRtcp(testing::_, testing::_))
-            .WillRepeatedly(testing::SetArgPointee<0>(&mock_rtp_rtcp));
-        // If being called for the send channel, save a pointer to the channel
-        // proxy for later.
-        if (channel_id == kRecvChannelId) {
-          EXPECT_FALSE(recv_channel_proxy);
-          recv_channel_proxy = channel_proxy;
-          // We need to set this expectation here since the channel proxy is
-          // created as a side effect of CreateAudioReceiveStream().
-          EXPECT_CALL(*recv_channel_proxy,
-                      AssociateSendChannel(testing::_)).Times(1);
-        }
-        return channel_proxy;
-      }));
-
-  AudioSendStream::Config send_config(nullptr);
-  send_config.rtp.ssrc = 777;
-  send_config.voe_channel_id = 123;
-  AudioSendStream* send_stream = call->CreateAudioSendStream(send_config);
-  EXPECT_NE(send_stream, nullptr);
-
-  AudioReceiveStream::Config recv_config;
-  recv_config.rtp.remote_ssrc = 42;
-  recv_config.rtp.local_ssrc = 777;
-  recv_config.voe_channel_id = kRecvChannelId;
-  recv_config.decoder_factory = decoder_factory;
-  AudioReceiveStream* recv_stream = call->CreateAudioReceiveStream(recv_config);
-  EXPECT_NE(recv_stream, nullptr);
-
-  EXPECT_CALL(*recv_channel_proxy, DisassociateSendChannel()).Times(1);
-  call->DestroyAudioReceiveStream(recv_stream);
-
-  call->DestroyAudioSendStream(send_stream);
-}
-
-TEST(CallTest, CreateDestroy_FlexfecReceiveStream) {
-  CallHelper call;
-  MockTransport rtcp_send_transport;
-  FlexfecReceiveStream::Config config(&rtcp_send_transport);
-  config.payload_type = 118;
-  config.remote_ssrc = 38837212;
-  config.protected_media_ssrcs = {27273};
-
-  FlexfecReceiveStream* stream = call->CreateFlexfecReceiveStream(config);
-  EXPECT_NE(stream, nullptr);
-  call->DestroyFlexfecReceiveStream(stream);
-}
-
-TEST(CallTest, CreateDestroy_FlexfecReceiveStreams) {
-  CallHelper call;
-  MockTransport rtcp_send_transport;
-  FlexfecReceiveStream::Config config(&rtcp_send_transport);
-  config.payload_type = 118;
-  std::list<FlexfecReceiveStream*> streams;
-
-  for (int i = 0; i < 2; ++i) {
-    for (uint32_t ssrc = 0; ssrc < 1234567; ssrc += 34567) {
-      config.remote_ssrc = ssrc;
-      config.protected_media_ssrcs = {ssrc + 1};
-      FlexfecReceiveStream* stream = call->CreateFlexfecReceiveStream(config);
-      EXPECT_NE(stream, nullptr);
-      if (ssrc & 1) {
-        streams.push_back(stream);
-      } else {
-        streams.push_front(stream);
-      }
-    }
-    for (auto s : streams) {
-      call->DestroyFlexfecReceiveStream(s);
-    }
-    streams.clear();
-  }
-}
-
-TEST(CallTest, MultipleFlexfecReceiveStreamsProtectingSingleVideoStream) {
-  CallHelper call;
-  MockTransport rtcp_send_transport;
-  FlexfecReceiveStream::Config config(&rtcp_send_transport);
-  config.payload_type = 118;
-  config.protected_media_ssrcs = {1324234};
-  FlexfecReceiveStream* stream;
-  std::list<FlexfecReceiveStream*> streams;
-
-  config.remote_ssrc = 838383;
-  stream = call->CreateFlexfecReceiveStream(config);
-  EXPECT_NE(stream, nullptr);
-  streams.push_back(stream);
-
-  config.remote_ssrc = 424993;
-  stream = call->CreateFlexfecReceiveStream(config);
-  EXPECT_NE(stream, nullptr);
-  streams.push_back(stream);
-
-  config.remote_ssrc = 99383;
-  stream = call->CreateFlexfecReceiveStream(config);
-  EXPECT_NE(stream, nullptr);
-  streams.push_back(stream);
-
-  config.remote_ssrc = 5548;
-  stream = call->CreateFlexfecReceiveStream(config);
-  EXPECT_NE(stream, nullptr);
-  streams.push_back(stream);
-
-  for (auto s : streams) {
-    call->DestroyFlexfecReceiveStream(s);
-  }
-}
-
-namespace {
-struct CallBitrateHelper {
-  CallBitrateHelper() : CallBitrateHelper(Call::Config::BitrateConfig()) {}
-
-  explicit CallBitrateHelper(const Call::Config::BitrateConfig& bitrate_config)
-      : mock_cc_(Clock::GetRealTimeClock(), &event_log_, &pacer_) {
-    Call::Config config(&event_log_);
-    config.bitrate_config = bitrate_config;
-    call_.reset(
-        Call::Create(config, rtc::MakeUnique<FakeRtpTransportControllerSend>(
-                                 &packet_router_, &pacer_, &mock_cc_)));
-  }
-
-  webrtc::Call* operator->() { return call_.get(); }
-  testing::NiceMock<test::MockSendSideCongestionController>& mock_cc() {
-    return mock_cc_;
-  }
-
- private:
-  webrtc::RtcEventLogNullImpl event_log_;
-  PacketRouter packet_router_;
-  testing::NiceMock<MockPacedSender> pacer_;
-  testing::NiceMock<test::MockSendSideCongestionController> mock_cc_;
-  std::unique_ptr<Call> call_;
-};
-}  // namespace
-
-TEST(CallBitrateTest, SetBitrateConfigWithValidConfigCallsSetBweBitrates) {
-  CallBitrateHelper call;
-
-  Call::Config::BitrateConfig bitrate_config;
-  bitrate_config.min_bitrate_bps = 1;
-  bitrate_config.start_bitrate_bps = 2;
-  bitrate_config.max_bitrate_bps = 3;
-
-  EXPECT_CALL(call.mock_cc(), SetBweBitrates(1, 2, 3));
-  call->SetBitrateConfig(bitrate_config);
-}
-
-TEST(CallBitrateTest, SetBitrateConfigWithDifferentMinCallsSetBweBitrates) {
-  CallBitrateHelper call;
-
-  Call::Config::BitrateConfig bitrate_config;
-  bitrate_config.min_bitrate_bps = 10;
-  bitrate_config.start_bitrate_bps = 20;
-  bitrate_config.max_bitrate_bps = 30;
-  call->SetBitrateConfig(bitrate_config);
-
-  bitrate_config.min_bitrate_bps = 11;
-  EXPECT_CALL(call.mock_cc(), SetBweBitrates(11, -1, 30));
-  call->SetBitrateConfig(bitrate_config);
-}
-
-TEST(CallBitrateTest, SetBitrateConfigWithDifferentStartCallsSetBweBitrates) {
-  CallBitrateHelper call;
-
-  Call::Config::BitrateConfig bitrate_config;
-  bitrate_config.min_bitrate_bps = 10;
-  bitrate_config.start_bitrate_bps = 20;
-  bitrate_config.max_bitrate_bps = 30;
-  call->SetBitrateConfig(bitrate_config);
-
-  bitrate_config.start_bitrate_bps = 21;
-  EXPECT_CALL(call.mock_cc(), SetBweBitrates(10, 21, 30));
-  call->SetBitrateConfig(bitrate_config);
-}
-
-TEST(CallBitrateTest, SetBitrateConfigWithDifferentMaxCallsSetBweBitrates) {
-  CallBitrateHelper call;
-
-  Call::Config::BitrateConfig bitrate_config;
-  bitrate_config.min_bitrate_bps = 10;
-  bitrate_config.start_bitrate_bps = 20;
-  bitrate_config.max_bitrate_bps = 30;
-  call->SetBitrateConfig(bitrate_config);
-
-  bitrate_config.max_bitrate_bps = 31;
-  EXPECT_CALL(call.mock_cc(), SetBweBitrates(10, -1, 31));
-  call->SetBitrateConfig(bitrate_config);
-}
-
-TEST(CallBitrateTest, SetBitrateConfigWithSameConfigElidesSecondCall) {
-  CallBitrateHelper call;
-  Call::Config::BitrateConfig bitrate_config;
-  bitrate_config.min_bitrate_bps = 1;
-  bitrate_config.start_bitrate_bps = 2;
-  bitrate_config.max_bitrate_bps = 3;
-
-  EXPECT_CALL(call.mock_cc(), SetBweBitrates(1, 2, 3)).Times(1);
-  call->SetBitrateConfig(bitrate_config);
-  call->SetBitrateConfig(bitrate_config);
-}
-
-TEST(CallBitrateTest,
-     SetBitrateConfigWithSameMinMaxAndNegativeStartElidesSecondCall) {
-  CallBitrateHelper call;
-
-  Call::Config::BitrateConfig bitrate_config;
-  bitrate_config.min_bitrate_bps = 1;
-  bitrate_config.start_bitrate_bps = 2;
-  bitrate_config.max_bitrate_bps = 3;
-
-  EXPECT_CALL(call.mock_cc(), SetBweBitrates(1, 2, 3)).Times(1);
-  call->SetBitrateConfig(bitrate_config);
-
-  bitrate_config.start_bitrate_bps = -1;
-  call->SetBitrateConfig(bitrate_config);
-}
-
-TEST(CallTest, RecreatingAudioStreamWithSameSsrcReusesRtpState) {
-  constexpr uint32_t kSSRC = 12345;
-  testing::NiceMock<test::MockAudioDeviceModule> mock_adm;
-  // Reply with a 10ms timer every time TimeUntilNextProcess is called to
-  // avoid entering a tight loop on the process thread.
-  EXPECT_CALL(mock_adm, TimeUntilNextProcess())
-       .WillRepeatedly(testing::Return(10));
-  rtc::scoped_refptr<test::MockAudioMixer> mock_mixer(
-      new rtc::RefCountedObject<test::MockAudioMixer>);
-
-  // There's similar functionality in cricket::VoEWrapper but it's not reachable
-  // from here. Since we're working on removing VoE interfaces, I doubt it's
-  // worth making VoEWrapper more easily available.
-  struct ScopedVoiceEngine {
-    ScopedVoiceEngine()
-        : voe(VoiceEngine::Create()),
-          base(VoEBase::GetInterface(voe)) {}
-    ~ScopedVoiceEngine() {
-      base->Release();
-      EXPECT_TRUE(VoiceEngine::Delete(voe));
-    }
-
-    VoiceEngine* voe;
-    VoEBase* base;
-  };
-  ScopedVoiceEngine voice_engine;
-
-  AudioState::Config audio_state_config;
-  audio_state_config.voice_engine = voice_engine.voe;
-  audio_state_config.audio_mixer = mock_mixer;
-  audio_state_config.audio_processing = AudioProcessing::Create();
-  voice_engine.base->Init(&mock_adm, audio_state_config.audio_processing.get());
-  auto audio_state = AudioState::Create(audio_state_config);
-
-  RtcEventLogNullImpl event_log;
-  Call::Config call_config(&event_log);
-  call_config.audio_state = audio_state;
-  std::unique_ptr<Call> call(Call::Create(call_config));
-
-  auto create_stream_and_get_rtp_state = [&](uint32_t ssrc) {
-    AudioSendStream::Config config(nullptr);
-    config.rtp.ssrc = ssrc;
-    config.voe_channel_id = voice_engine.base->CreateChannel();
-    AudioSendStream* stream = call->CreateAudioSendStream(config);
-    VoiceEngineImpl* voe_impl = static_cast<VoiceEngineImpl*>(voice_engine.voe);
-    auto channel_proxy = voe_impl->GetChannelProxy(config.voe_channel_id);
-    RtpRtcp* rtp_rtcp = nullptr;
-    RtpReceiver* rtp_receiver = nullptr;  // Unused but required for call.
-    channel_proxy->GetRtpRtcp(&rtp_rtcp, &rtp_receiver);
-    const RtpState rtp_state = rtp_rtcp->GetRtpState();
-    call->DestroyAudioSendStream(stream);
-    voice_engine.base->DeleteChannel(config.voe_channel_id);
-    return rtp_state;
-  };
-
-  const RtpState rtp_state1 = create_stream_and_get_rtp_state(kSSRC);
-  const RtpState rtp_state2 = create_stream_and_get_rtp_state(kSSRC);
-
-  EXPECT_EQ(rtp_state1.sequence_number, rtp_state2.sequence_number);
-  EXPECT_EQ(rtp_state1.start_timestamp, rtp_state2.start_timestamp);
-  EXPECT_EQ(rtp_state1.timestamp, rtp_state2.timestamp);
-  EXPECT_EQ(rtp_state1.capture_time_ms, rtp_state2.capture_time_ms);
-  EXPECT_EQ(rtp_state1.last_timestamp_time_ms,
-            rtp_state2.last_timestamp_time_ms);
-  EXPECT_EQ(rtp_state1.media_has_been_sent, rtp_state2.media_has_been_sent);
-}
-TEST(CallBitrateTest, BiggerMaskMinUsed) {
-  CallBitrateHelper call;
-  Call::Config::BitrateConfigMask mask;
-  mask.min_bitrate_bps = rtc::Optional<int>(1234);
-
-  EXPECT_CALL(call.mock_cc(),
-              SetBweBitrates(*mask.min_bitrate_bps, testing::_, testing::_));
-  call->SetBitrateConfigMask(mask);
-}
-
-TEST(CallBitrateTest, BiggerConfigMinUsed) {
-  CallBitrateHelper call;
-  Call::Config::BitrateConfigMask mask;
-  mask.min_bitrate_bps = rtc::Optional<int>(1000);
-  EXPECT_CALL(call.mock_cc(), SetBweBitrates(1000, testing::_, testing::_));
-  call->SetBitrateConfigMask(mask);
-
-  Call::Config::BitrateConfig config;
-  config.min_bitrate_bps = 1234;
-
-  EXPECT_CALL(call.mock_cc(), SetBweBitrates(1234, testing::_, testing::_));
-  call->SetBitrateConfig(config);
-}
-
-// The last call to set start should be used.
-TEST(CallBitrateTest, LatestStartMaskPreferred) {
-  CallBitrateHelper call;
-  Call::Config::BitrateConfigMask mask;
-  mask.start_bitrate_bps = rtc::Optional<int>(1300);
-
-  EXPECT_CALL(call.mock_cc(),
-              SetBweBitrates(testing::_, *mask.start_bitrate_bps, testing::_));
-  call->SetBitrateConfigMask(mask);
-
-  Call::Config::BitrateConfig bitrate_config;
-  bitrate_config.start_bitrate_bps = 1200;
-
-  EXPECT_CALL(
-      call.mock_cc(),
-      SetBweBitrates(testing::_, bitrate_config.start_bitrate_bps, testing::_));
-  call->SetBitrateConfig(bitrate_config);
-}
-
-TEST(CallBitrateTest, SmallerMaskMaxUsed) {
-  Call::Config::BitrateConfig bitrate_config;
-  bitrate_config.max_bitrate_bps = bitrate_config.start_bitrate_bps + 2000;
-  CallBitrateHelper call(bitrate_config);
-
-  Call::Config::BitrateConfigMask mask;
-  mask.max_bitrate_bps =
-      rtc::Optional<int>(bitrate_config.start_bitrate_bps + 1000);
-
-  EXPECT_CALL(call.mock_cc(),
-              SetBweBitrates(testing::_, testing::_, *mask.max_bitrate_bps));
-  call->SetBitrateConfigMask(mask);
-}
-
-TEST(CallBitrateTest, SmallerConfigMaxUsed) {
-  Call::Config::BitrateConfig bitrate_config;
-  bitrate_config.max_bitrate_bps = bitrate_config.start_bitrate_bps + 1000;
-  CallBitrateHelper call(bitrate_config);
-
-  Call::Config::BitrateConfigMask mask;
-  mask.max_bitrate_bps =
-      rtc::Optional<int>(bitrate_config.start_bitrate_bps + 2000);
-
-  // Expect no calls because nothing changes
-  EXPECT_CALL(call.mock_cc(),
-              SetBweBitrates(testing::_, testing::_, testing::_))
-      .Times(0);
-  call->SetBitrateConfigMask(mask);
-}
-
-TEST(CallBitrateTest, MaskStartLessThanConfigMinClamped) {
-  Call::Config::BitrateConfig bitrate_config;
-  bitrate_config.min_bitrate_bps = 2000;
-  CallBitrateHelper call(bitrate_config);
-
-  Call::Config::BitrateConfigMask mask;
-  mask.start_bitrate_bps = rtc::Optional<int>(1000);
-
-  EXPECT_CALL(call.mock_cc(), SetBweBitrates(2000, 2000, testing::_));
-  call->SetBitrateConfigMask(mask);
-}
-
-TEST(CallBitrateTest, MaskStartGreaterThanConfigMaxClamped) {
-  Call::Config::BitrateConfig bitrate_config;
-  bitrate_config.start_bitrate_bps = 2000;
-  CallBitrateHelper call(bitrate_config);
-
-  Call::Config::BitrateConfigMask mask;
-  mask.max_bitrate_bps = rtc::Optional<int>(1000);
-
-  EXPECT_CALL(call.mock_cc(), SetBweBitrates(testing::_, -1, 1000));
-  call->SetBitrateConfigMask(mask);
-}
-
-TEST(CallBitrateTest, MaskMinGreaterThanConfigMaxClamped) {
-  Call::Config::BitrateConfig bitrate_config;
-  bitrate_config.min_bitrate_bps = 2000;
-  CallBitrateHelper call(bitrate_config);
-
-  Call::Config::BitrateConfigMask mask;
-  mask.max_bitrate_bps = rtc::Optional<int>(1000);
-
-  EXPECT_CALL(call.mock_cc(), SetBweBitrates(1000, testing::_, 1000));
-  call->SetBitrateConfigMask(mask);
-}
-
-TEST(CallBitrateTest, SettingMaskStartForcesUpdate) {
-  CallBitrateHelper call;
-
-  Call::Config::BitrateConfigMask mask;
-  mask.start_bitrate_bps = rtc::Optional<int>(1000);
-
-  // SetBweBitrates should be called twice with the same params since
-  // start_bitrate_bps is set.
-  EXPECT_CALL(call.mock_cc(), SetBweBitrates(testing::_, 1000, testing::_))
-      .Times(2);
-  call->SetBitrateConfigMask(mask);
-  call->SetBitrateConfigMask(mask);
-}
-
-TEST(CallBitrateTest, SetBitrateConfigWithNoChangesDoesNotCallSetBweBitrates) {
-  CallBitrateHelper call;
-
-  Call::Config::BitrateConfig config1;
-  config1.min_bitrate_bps = 0;
-  config1.start_bitrate_bps = 1000;
-  config1.max_bitrate_bps = -1;
-
-  Call::Config::BitrateConfig config2;
-  config2.min_bitrate_bps = 0;
-  config2.start_bitrate_bps = -1;
-  config2.max_bitrate_bps = -1;
-
-  // The second call should not call SetBweBitrates because it doesn't
-  // change any values.
-  EXPECT_CALL(call.mock_cc(), SetBweBitrates(0, 1000, -1));
-  call->SetBitrateConfig(config1);
-  call->SetBitrateConfig(config2);
-}
-
-// If SetBitrateConfig changes the max, but not the effective max,
-// SetBweBitrates shouldn't be called, to avoid unnecessary encoder
-// reconfigurations.
-TEST(CallBitrateTest, SetBweBitratesNotCalledWhenEffectiveMaxUnchanged) {
-  CallBitrateHelper call;
-
-  Call::Config::BitrateConfig config;
-  config.min_bitrate_bps = 0;
-  config.start_bitrate_bps = -1;
-  config.max_bitrate_bps = 2000;
-  EXPECT_CALL(call.mock_cc(), SetBweBitrates(testing::_, testing::_, 2000));
-  call->SetBitrateConfig(config);
-
-  // Reduce effective max to 1000 with the mask.
-  Call::Config::BitrateConfigMask mask;
-  mask.max_bitrate_bps = rtc::Optional<int>(1000);
-  EXPECT_CALL(call.mock_cc(), SetBweBitrates(testing::_, testing::_, 1000));
-  call->SetBitrateConfigMask(mask);
-
-  // This leaves the effective max unchanged, so SetBweBitrates shouldn't be
-  // called again.
-  config.max_bitrate_bps = 1000;
-  call->SetBitrateConfig(config);
-}
-
-// When the "start bitrate" mask is removed, SetBweBitrates shouldn't be called
-// again, since nothing's changing.
-TEST(CallBitrateTest, SetBweBitratesNotCalledWhenStartMaskRemoved) {
-  CallBitrateHelper call;
-
-  Call::Config::BitrateConfigMask mask;
-  mask.start_bitrate_bps = rtc::Optional<int>(1000);
-  EXPECT_CALL(call.mock_cc(), SetBweBitrates(0, 1000, -1));
-  call->SetBitrateConfigMask(mask);
-
-  mask.start_bitrate_bps.reset();
-  call->SetBitrateConfigMask(mask);
-}
-
-// Test that if SetBitrateConfig is called after SetBitrateConfigMask applies a
-// "start" value, the SetBitrateConfig call won't apply that start value a
-// second time.
-TEST(CallBitrateTest, SetBitrateConfigAfterSetBitrateConfigMaskWithStart) {
-  CallBitrateHelper call;
-
-  Call::Config::BitrateConfigMask mask;
-  mask.start_bitrate_bps = rtc::Optional<int>(1000);
-  EXPECT_CALL(call.mock_cc(), SetBweBitrates(0, 1000, -1));
-  call->SetBitrateConfigMask(mask);
-
-  Call::Config::BitrateConfig config;
-  config.min_bitrate_bps = 0;
-  config.start_bitrate_bps = -1;
-  config.max_bitrate_bps = 5000;
-  // The start value isn't changing, so SetBweBitrates should be called with
-  // -1.
-  EXPECT_CALL(call.mock_cc(), SetBweBitrates(0, -1, 5000));
-  call->SetBitrateConfig(config);
-}
-
-TEST(CallBitrateTest, SetBweBitratesNotCalledWhenClampedMinUnchanged) {
-  Call::Config::BitrateConfig bitrate_config;
-  bitrate_config.start_bitrate_bps = 500;
-  bitrate_config.max_bitrate_bps = 1000;
-  CallBitrateHelper call(bitrate_config);
-
-  // Set min to 2000; it is clamped to the max (1000).
-  Call::Config::BitrateConfigMask mask;
-  mask.min_bitrate_bps = rtc::Optional<int>(2000);
-  EXPECT_CALL(call.mock_cc(), SetBweBitrates(1000, -1, 1000));
-  call->SetBitrateConfigMask(mask);
-
-  // Set min to 3000; the clamped value stays the same so nothing happens.
-  mask.min_bitrate_bps = rtc::Optional<int>(3000);
-  call->SetBitrateConfigMask(mask);
-}
-
-}  // namespace webrtc
diff --git a/call/callfactory.cc b/call/callfactory.cc
deleted file mode 100644
index 7399cfc..0000000
--- a/call/callfactory.cc
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- *  Copyright 2017 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/call/callfactory.h"
-
-#include <memory>
-
-namespace webrtc {
-
-Call* CallFactory::CreateCall(const Call::Config& config) {
-  return Call::Create(config);
-}
-
-std::unique_ptr<CallFactoryInterface> CreateCallFactory() {
-  return std::unique_ptr<CallFactoryInterface>(new CallFactory());
-}
-
-}  // namespace webrtc
diff --git a/call/callfactory.h b/call/callfactory.h
deleted file mode 100644
index 98eb68a..0000000
--- a/call/callfactory.h
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- *  Copyright 2017 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_CALL_CALLFACTORY_H_
-#define WEBRTC_CALL_CALLFACTORY_H_
-
-#include "webrtc/call/callfactoryinterface.h"
-
-namespace webrtc {
-
-class CallFactory : public CallFactoryInterface {
-  ~CallFactory() override {}
-
-  Call* CreateCall(const Call::Config& config) override;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_CALL_CALLFACTORY_H_
diff --git a/call/callfactoryinterface.h b/call/callfactoryinterface.h
deleted file mode 100644
index 6a0329a..0000000
--- a/call/callfactoryinterface.h
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- *  Copyright 2017 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_CALL_CALLFACTORYINTERFACE_H_
-#define WEBRTC_CALL_CALLFACTORYINTERFACE_H_
-
-#include <memory>
-
-#include "webrtc/call/call.h"
-
-namespace webrtc {
-
-// This interface exists to allow webrtc to be optionally built without media
-// support (i.e., if only being used for data channels). PeerConnectionFactory
-// is constructed with a CallFactoryInterface, which may or may not be null.
-class CallFactoryInterface {
- public:
-  virtual ~CallFactoryInterface() {}
-
-  virtual Call* CreateCall(const Call::Config& config) = 0;
-};
-
-std::unique_ptr<CallFactoryInterface> CreateCallFactory();
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_CALL_CALLFACTORYINTERFACE_H_
diff --git a/call/fake_rtp_transport_controller_send.h b/call/fake_rtp_transport_controller_send.h
deleted file mode 100644
index 6cff173..0000000
--- a/call/fake_rtp_transport_controller_send.h
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- *  Copyright (c) 2015 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_CALL_FAKE_RTP_TRANSPORT_CONTROLLER_SEND_H_
-#define WEBRTC_CALL_FAKE_RTP_TRANSPORT_CONTROLLER_SEND_H_
-
-#include "webrtc/call/rtp_transport_controller_send_interface.h"
-#include "webrtc/common_types.h"
-#include "webrtc/modules/congestion_controller/include/send_side_congestion_controller.h"
-#include "webrtc/modules/pacing/packet_router.h"
-
-namespace webrtc {
-
-class FakeRtpTransportControllerSend
-    : public RtpTransportControllerSendInterface {
- public:
-  explicit FakeRtpTransportControllerSend(
-      PacketRouter* packet_router,
-      PacedSender* paced_sender,
-      SendSideCongestionController* send_side_cc)
-      : packet_router_(packet_router),
-        paced_sender_(paced_sender),
-        send_side_cc_(send_side_cc) {
-    RTC_DCHECK(send_side_cc);
-  }
-
-  PacketRouter* packet_router() override { return packet_router_; }
-
-  SendSideCongestionController* send_side_cc() override {
-    return send_side_cc_;
-  }
-
-  TransportFeedbackObserver* transport_feedback_observer() override {
-    return send_side_cc_;
-  }
-
-  PacedSender* pacer() override { return paced_sender_; }
-
-  RtpPacketSender* packet_sender() override { return paced_sender_; }
-
-  const RtpKeepAliveConfig& keepalive_config() const override {
-    return keepalive_;
-  }
-
-  void SetAllocatedSendBitrateLimits(int min_send_bitrate_bps,
-                                     int max_padding_bitrate_bps) override {}
-
-  void set_keepalive_config(const RtpKeepAliveConfig& keepalive_config) {
-    keepalive_ = keepalive_config;
-  }
-
- private:
-  PacketRouter* packet_router_;
-  PacedSender* paced_sender_;
-  SendSideCongestionController* send_side_cc_;
-  RtpKeepAliveConfig keepalive_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_CALL_FAKE_RTP_TRANSPORT_CONTROLLER_SEND_H_
diff --git a/call/flexfec_receive_stream.h b/call/flexfec_receive_stream.h
deleted file mode 100644
index 400bca4..0000000
--- a/call/flexfec_receive_stream.h
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- *  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_CALL_FLEXFEC_RECEIVE_STREAM_H_
-#define WEBRTC_CALL_FLEXFEC_RECEIVE_STREAM_H_
-
-#include <stdint.h>
-
-#include <string>
-#include <vector>
-
-#include "webrtc/api/call/transport.h"
-#include "webrtc/api/rtpparameters.h"
-#include "webrtc/call/rtp_packet_sink_interface.h"
-#include "webrtc/common_types.h"
-
-namespace webrtc {
-
-class FlexfecReceiveStream : public RtpPacketSinkInterface {
- public:
-  ~FlexfecReceiveStream() override = default;
-
-  struct Stats {
-    std::string ToString(int64_t time_ms) const;
-
-    // TODO(brandtr): Add appropriate stats here.
-    int flexfec_bitrate_bps;
-  };
-
-  struct Config {
-    explicit Config(Transport* rtcp_send_transport)
-        : rtcp_send_transport(rtcp_send_transport) {
-      RTC_DCHECK(rtcp_send_transport);
-    }
-
-    std::string ToString() const;
-
-    // Returns true if all RTP information is available in order to
-    // enable receiving FlexFEC.
-    bool IsCompleteAndEnabled() const;
-
-    // Payload type for FlexFEC.
-    int payload_type = -1;
-
-    // SSRC for FlexFEC stream to be received.
-    uint32_t remote_ssrc = 0;
-
-    // Vector containing a single element, corresponding to the SSRC of the
-    // media stream being protected by this FlexFEC stream. The vector MUST have
-    // size 1.
-    //
-    // TODO(brandtr): Update comment above when we support multistream
-    // protection.
-    std::vector<uint32_t> protected_media_ssrcs;
-
-    // SSRC for RTCP reports to be sent.
-    uint32_t local_ssrc = 0;
-
-    // What RTCP mode to use in the reports.
-    RtcpMode rtcp_mode = RtcpMode::kCompound;
-
-    // Transport for outgoing RTCP packets.
-    Transport* rtcp_send_transport = nullptr;
-
-    // |transport_cc| is true whenever the send-side BWE RTCP feedback message
-    // has been negotiated. This is a prerequisite for enabling send-side BWE.
-    bool transport_cc = false;
-
-    // RTP header extensions that have been negotiated for this track.
-    std::vector<RtpExtension> rtp_header_extensions;
-  };
-
-  virtual Stats GetStats() const = 0;
-
-  virtual const Config& GetConfig() const = 0;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_CALL_FLEXFEC_RECEIVE_STREAM_H_
diff --git a/call/flexfec_receive_stream_impl.cc b/call/flexfec_receive_stream_impl.cc
deleted file mode 100644
index d6b41ed..0000000
--- a/call/flexfec_receive_stream_impl.cc
+++ /dev/null
@@ -1,194 +0,0 @@
-/*
- *  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/call/flexfec_receive_stream_impl.h"
-
-#include <string>
-
-#include "webrtc/call/rtp_stream_receiver_controller_interface.h"
-#include "webrtc/modules/rtp_rtcp/include/flexfec_receiver.h"
-#include "webrtc/modules/rtp_rtcp/include/receive_statistics.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_packet_received.h"
-#include "webrtc/modules/utility/include/process_thread.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/location.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/system_wrappers/include/clock.h"
-
-namespace webrtc {
-
-std::string FlexfecReceiveStream::Stats::ToString(int64_t time_ms) const {
-  std::stringstream ss;
-  ss << "FlexfecReceiveStream stats: " << time_ms
-     << ", {flexfec_bitrate_bps: " << flexfec_bitrate_bps << "}";
-  return ss.str();
-}
-
-std::string FlexfecReceiveStream::Config::ToString() const {
-  std::stringstream ss;
-  ss << "{payload_type: " << payload_type;
-  ss << ", remote_ssrc: " << remote_ssrc;
-  ss << ", local_ssrc: " << local_ssrc;
-  ss << ", protected_media_ssrcs: [";
-  size_t i = 0;
-  for (; i + 1 < protected_media_ssrcs.size(); ++i)
-    ss << protected_media_ssrcs[i] << ", ";
-  if (!protected_media_ssrcs.empty())
-    ss << protected_media_ssrcs[i];
-  ss << "], transport_cc: " << (transport_cc ? "on" : "off");
-  ss << ", rtp_header_extensions: [";
-  i = 0;
-  for (; i + 1 < rtp_header_extensions.size(); ++i)
-    ss << rtp_header_extensions[i].ToString() << ", ";
-  if (!rtp_header_extensions.empty())
-    ss << rtp_header_extensions[i].ToString();
-  ss << "]}";
-  return ss.str();
-}
-
-bool FlexfecReceiveStream::Config::IsCompleteAndEnabled() const {
-  // Check if FlexFEC is enabled.
-  if (payload_type < 0)
-    return false;
-  // Do we have the necessary SSRC information?
-  if (remote_ssrc == 0)
-    return false;
-  // TODO(brandtr): Update this check when we support multistream protection.
-  if (protected_media_ssrcs.size() != 1u)
-    return false;
-  return true;
-}
-
-namespace {
-
-// TODO(brandtr): Update this function when we support multistream protection.
-std::unique_ptr<FlexfecReceiver> MaybeCreateFlexfecReceiver(
-    const FlexfecReceiveStream::Config& config,
-    RecoveredPacketReceiver* recovered_packet_receiver) {
-  if (config.payload_type < 0) {
-    LOG(LS_WARNING) << "Invalid FlexFEC payload type given. "
-                    << "This FlexfecReceiveStream will therefore be useless.";
-    return nullptr;
-  }
-  RTC_DCHECK_GE(config.payload_type, 0);
-  RTC_DCHECK_LE(config.payload_type, 127);
-  if (config.remote_ssrc == 0) {
-    LOG(LS_WARNING) << "Invalid FlexFEC SSRC given. "
-                    << "This FlexfecReceiveStream will therefore be useless.";
-    return nullptr;
-  }
-  if (config.protected_media_ssrcs.empty()) {
-    LOG(LS_WARNING) << "No protected media SSRC supplied. "
-                    << "This FlexfecReceiveStream will therefore be useless.";
-    return nullptr;
-  }
-
-  if (config.protected_media_ssrcs.size() > 1) {
-    LOG(LS_WARNING)
-        << "The supplied FlexfecConfig contained multiple protected "
-           "media streams, but our implementation currently only "
-           "supports protecting a single media stream. "
-           "To avoid confusion, disabling FlexFEC completely.";
-    return nullptr;
-  }
-  RTC_DCHECK_EQ(1U, config.protected_media_ssrcs.size());
-  return std::unique_ptr<FlexfecReceiver>(
-      new FlexfecReceiver(config.remote_ssrc, config.protected_media_ssrcs[0],
-                          recovered_packet_receiver));
-}
-
-std::unique_ptr<RtpRtcp> CreateRtpRtcpModule(
-    ReceiveStatistics* receive_statistics,
-    Transport* rtcp_send_transport,
-    RtcpRttStats* rtt_stats) {
-  RtpRtcp::Configuration configuration;
-  configuration.audio = false;
-  configuration.receiver_only = true;
-  configuration.clock = Clock::GetRealTimeClock();
-  configuration.receive_statistics = receive_statistics;
-  configuration.outgoing_transport = rtcp_send_transport;
-  configuration.rtt_stats = rtt_stats;
-  std::unique_ptr<RtpRtcp> rtp_rtcp(RtpRtcp::CreateRtpRtcp(configuration));
-  return rtp_rtcp;
-}
-
-}  // namespace
-
-FlexfecReceiveStreamImpl::FlexfecReceiveStreamImpl(
-    RtpStreamReceiverControllerInterface* receiver_controller,
-    const Config& config,
-    RecoveredPacketReceiver* recovered_packet_receiver,
-    RtcpRttStats* rtt_stats,
-    ProcessThread* process_thread)
-    : config_(config),
-      receiver_(MaybeCreateFlexfecReceiver(config_, recovered_packet_receiver)),
-      rtp_receive_statistics_(
-          ReceiveStatistics::Create(Clock::GetRealTimeClock())),
-      rtp_rtcp_(CreateRtpRtcpModule(rtp_receive_statistics_.get(),
-                                    config_.rtcp_send_transport,
-                                    rtt_stats)),
-      process_thread_(process_thread) {
-  LOG(LS_INFO) << "FlexfecReceiveStreamImpl: " << config_.ToString();
-
-  // RTCP reporting.
-  rtp_rtcp_->SetRTCPStatus(config_.rtcp_mode);
-  rtp_rtcp_->SetSSRC(config_.local_ssrc);
-  process_thread_->RegisterModule(rtp_rtcp_.get(), RTC_FROM_HERE);
-
-  // Register with transport.
-  // TODO(nisse): OnRtpPacket in this class delegates all real work to
-  // |receiver_|. So maybe we don't need to implement RtpPacketSinkInterface
-  // here at all, we'd then delete the OnRtpPacket method and instead register
-  // |receiver_| as the RtpPacketSinkInterface for this stream.
-  // TODO(nisse): Passing |this| from the constructor to the RtpDemuxer, before
-  // the object is fully initialized, is risky. But it works in this case
-  // because locking in our caller, Call::CreateFlexfecReceiveStream, ensures
-  // that the demuxer doesn't call OnRtpPacket before this object is fully
-  // constructed. Registering |receiver_| instead of |this| would solve this
-  // problem too.
-  rtp_stream_receiver_ =
-      receiver_controller->CreateReceiver(config_.remote_ssrc, this);
-}
-
-FlexfecReceiveStreamImpl::~FlexfecReceiveStreamImpl() {
-  LOG(LS_INFO) << "~FlexfecReceiveStreamImpl: " << config_.ToString();
-  process_thread_->DeRegisterModule(rtp_rtcp_.get());
-}
-
-void FlexfecReceiveStreamImpl::OnRtpPacket(const RtpPacketReceived& packet) {
-  if (!receiver_)
-    return;
-
-  receiver_->OnRtpPacket(packet);
-
-  // Do not report media packets in the RTCP RRs generated by |rtp_rtcp_|.
-  if (packet.Ssrc() == config_.remote_ssrc) {
-    RTPHeader header;
-    packet.GetHeader(&header);
-    // FlexFEC packets are never retransmitted.
-    const bool kNotRetransmitted = false;
-    rtp_receive_statistics_->IncomingPacket(header, packet.size(),
-                                            kNotRetransmitted);
-  }
-}
-
-// TODO(brandtr): Implement this member function when we have designed the
-// stats for FlexFEC.
-FlexfecReceiveStreamImpl::Stats FlexfecReceiveStreamImpl::GetStats() const {
-  return FlexfecReceiveStream::Stats();
-}
-
-const FlexfecReceiveStream::Config& FlexfecReceiveStreamImpl::GetConfig()
-    const {
-  return config_;
-}
-
-}  // namespace webrtc
diff --git a/call/flexfec_receive_stream_impl.h b/call/flexfec_receive_stream_impl.h
deleted file mode 100644
index f60e810..0000000
--- a/call/flexfec_receive_stream_impl.h
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- *  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_CALL_FLEXFEC_RECEIVE_STREAM_IMPL_H_
-#define WEBRTC_CALL_FLEXFEC_RECEIVE_STREAM_IMPL_H_
-
-#include <memory>
-
-#include "webrtc/call/flexfec_receive_stream.h"
-#include "webrtc/call/rtp_packet_sink_interface.h"
-
-namespace webrtc {
-
-class FlexfecReceiver;
-class ProcessThread;
-class ReceiveStatistics;
-class RecoveredPacketReceiver;
-class RtcpRttStats;
-class RtpPacketReceived;
-class RtpRtcp;
-class RtpStreamReceiverControllerInterface;
-class RtpStreamReceiverInterface;
-
-class FlexfecReceiveStreamImpl : public FlexfecReceiveStream {
- public:
-  FlexfecReceiveStreamImpl(
-      RtpStreamReceiverControllerInterface* receiver_controller,
-      const Config& config,
-      RecoveredPacketReceiver* recovered_packet_receiver,
-      RtcpRttStats* rtt_stats,
-      ProcessThread* process_thread);
-  ~FlexfecReceiveStreamImpl() override;
-
-  // RtpPacketSinkInterface.
-  void OnRtpPacket(const RtpPacketReceived& packet) override;
-
-  Stats GetStats() const override;
-  const Config& GetConfig() const override;
-
- private:
-  // Config.
-  const Config config_;
-
-  // Erasure code interfacing.
-  const std::unique_ptr<FlexfecReceiver> receiver_;
-
-  // RTCP reporting.
-  const std::unique_ptr<ReceiveStatistics> rtp_receive_statistics_;
-  const std::unique_ptr<RtpRtcp> rtp_rtcp_;
-  ProcessThread* process_thread_;
-
-  std::unique_ptr<RtpStreamReceiverInterface> rtp_stream_receiver_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_CALL_FLEXFEC_RECEIVE_STREAM_IMPL_H_
diff --git a/call/flexfec_receive_stream_unittest.cc b/call/flexfec_receive_stream_unittest.cc
deleted file mode 100644
index c3bf2e0..0000000
--- a/call/flexfec_receive_stream_unittest.cc
+++ /dev/null
@@ -1,157 +0,0 @@
-/*
- *  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/call/flexfec_receive_stream_impl.h"
-
-#include <stdint.h>
-#include <memory>
-
-#include "webrtc/api/array_view.h"
-#include "webrtc/call/rtp_stream_receiver_controller.h"
-#include "webrtc/modules/pacing/packet_router.h"
-#include "webrtc/modules/rtp_rtcp/include/flexfec_receiver.h"
-#include "webrtc/modules/rtp_rtcp/mocks/mock_recovered_packet_receiver.h"
-#include "webrtc/modules/rtp_rtcp/mocks/mock_rtcp_rtt_stats.h"
-#include "webrtc/modules/rtp_rtcp/source/byte_io.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_header_extensions.h"
-#include "webrtc/modules/utility/include/mock/mock_process_thread.h"
-#include "webrtc/rtc_base/ptr_util.h"
-#include "webrtc/test/gmock.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/mock_transport.h"
-
-namespace webrtc {
-
-namespace {
-
-using ::testing::_;
-
-constexpr uint8_t kFlexfecPlType = 118;
-constexpr uint8_t kFlexfecSsrc[] = {0x00, 0x00, 0x00, 0x01};
-constexpr uint8_t kMediaSsrc[] = {0x00, 0x00, 0x00, 0x02};
-
-FlexfecReceiveStream::Config CreateDefaultConfig(
-    Transport* rtcp_send_transport) {
-  FlexfecReceiveStream::Config config(rtcp_send_transport);
-  config.payload_type = kFlexfecPlType;
-  config.remote_ssrc = ByteReader<uint32_t>::ReadBigEndian(kFlexfecSsrc);
-  config.protected_media_ssrcs = {
-      ByteReader<uint32_t>::ReadBigEndian(kMediaSsrc)};
-  EXPECT_TRUE(config.IsCompleteAndEnabled());
-  return config;
-}
-
-RtpPacketReceived ParsePacket(rtc::ArrayView<const uint8_t> packet) {
-  RtpPacketReceived parsed_packet(nullptr);
-  EXPECT_TRUE(parsed_packet.Parse(packet));
-  return parsed_packet;
-}
-
-}  // namespace
-
-TEST(FlexfecReceiveStreamConfigTest, IsCompleteAndEnabled) {
-  MockTransport rtcp_send_transport;
-  FlexfecReceiveStream::Config config(&rtcp_send_transport);
-
-  config.local_ssrc = 18374743;
-  config.rtcp_mode = RtcpMode::kCompound;
-  config.transport_cc = true;
-  config.rtp_header_extensions.emplace_back(TransportSequenceNumber::kUri, 7);
-  EXPECT_FALSE(config.IsCompleteAndEnabled());
-
-  config.payload_type = 123;
-  EXPECT_FALSE(config.IsCompleteAndEnabled());
-
-  config.remote_ssrc = 238423838;
-  EXPECT_FALSE(config.IsCompleteAndEnabled());
-
-  config.protected_media_ssrcs.push_back(138989393);
-  EXPECT_TRUE(config.IsCompleteAndEnabled());
-
-  config.protected_media_ssrcs.push_back(33423423);
-  EXPECT_FALSE(config.IsCompleteAndEnabled());
-}
-
-class FlexfecReceiveStreamTest : public ::testing::Test {
- protected:
-  FlexfecReceiveStreamTest()
-      : config_(CreateDefaultConfig(&rtcp_send_transport_)) {
-    EXPECT_CALL(process_thread_, RegisterModule(_, _)).Times(1);
-    receive_stream_ = rtc::MakeUnique<FlexfecReceiveStreamImpl>(
-        &rtp_stream_receiver_controller_, config_, &recovered_packet_receiver_,
-        &rtt_stats_, &process_thread_);
-  }
-
-  ~FlexfecReceiveStreamTest() {
-    EXPECT_CALL(process_thread_, DeRegisterModule(_)).Times(1);
-  }
-
-  MockTransport rtcp_send_transport_;
-  FlexfecReceiveStream::Config config_;
-  MockRecoveredPacketReceiver recovered_packet_receiver_;
-  MockRtcpRttStats rtt_stats_;
-  MockProcessThread process_thread_;
-  RtpStreamReceiverController rtp_stream_receiver_controller_;
-  std::unique_ptr<FlexfecReceiveStreamImpl> receive_stream_;
-};
-
-TEST_F(FlexfecReceiveStreamTest, ConstructDestruct) {}
-
-// Create a FlexFEC packet that protects a single media packet and ensure
-// that the callback is called. Correctness of recovery is checked in the
-// FlexfecReceiver unit tests.
-TEST_F(FlexfecReceiveStreamTest, RecoversPacket) {
-  constexpr uint8_t kFlexfecSeqNum[] = {0x00, 0x01};
-  constexpr uint8_t kFlexfecTs[] = {0x00, 0x11, 0x22, 0x33};
-  constexpr uint8_t kMediaPlType = 107;
-  constexpr uint8_t kMediaSeqNum[] = {0x00, 0x02};
-  constexpr uint8_t kMediaTs[] = {0xaa, 0xbb, 0xcc, 0xdd};
-
-  // This packet mask protects a single media packet, i.e., the FlexFEC payload
-  // is a copy of that media packet. When inserted in the FlexFEC pipeline,
-  // it will thus trivially recover the lost media packet.
-  constexpr uint8_t kKBit0 = 1 << 7;
-  constexpr uint8_t kFlexfecPktMask[] = {kKBit0 | 0x00, 0x01};
-  constexpr uint8_t kPayloadLength[] = {0x00, 0x04};
-  constexpr uint8_t kSsrcCount = 1;
-  constexpr uint8_t kReservedBits = 0x00;
-  constexpr uint8_t kPayloadBits = 0x00;
-  // clang-format off
-  constexpr uint8_t kFlexfecPacket[] = {
-      // RTP header.
-      0x80,            kFlexfecPlType,  kFlexfecSeqNum[0],  kFlexfecSeqNum[1],
-      kFlexfecTs[0],   kFlexfecTs[1],   kFlexfecTs[2],      kFlexfecTs[3],
-      kFlexfecSsrc[0], kFlexfecSsrc[1], kFlexfecSsrc[2],    kFlexfecSsrc[3],
-      // FlexFEC header.
-      0x00,            kMediaPlType,    kPayloadLength[0],  kPayloadLength[1],
-      kMediaTs[0],     kMediaTs[1],     kMediaTs[2],        kMediaTs[3],
-      kSsrcCount,      kReservedBits,   kReservedBits,      kReservedBits,
-      kMediaSsrc[0],   kMediaSsrc[1],   kMediaSsrc[2],      kMediaSsrc[3],
-      kMediaSeqNum[0], kMediaSeqNum[1], kFlexfecPktMask[0], kFlexfecPktMask[1],
-      // FEC payload.
-      kPayloadBits,    kPayloadBits,    kPayloadBits,       kPayloadBits};
-  // clang-format on
-
-  testing::StrictMock<MockRecoveredPacketReceiver> recovered_packet_receiver;
-  EXPECT_CALL(process_thread_, RegisterModule(_, _)).Times(1);
-  FlexfecReceiveStreamImpl receive_stream(&rtp_stream_receiver_controller_,
-                                          config_, &recovered_packet_receiver,
-                                          &rtt_stats_, &process_thread_);
-
-  EXPECT_CALL(recovered_packet_receiver,
-              OnRecoveredPacket(_, kRtpHeaderSize + kPayloadLength[1]));
-
-  receive_stream.OnRtpPacket(ParsePacket(kFlexfecPacket));
-
-  // Tear-down
-  EXPECT_CALL(process_thread_, DeRegisterModule(_)).Times(1);
-}
-
-}  // namespace webrtc
diff --git a/call/rampup_tests.cc b/call/rampup_tests.cc
deleted file mode 100644
index 2b85452..0000000
--- a/call/rampup_tests.cc
+++ /dev/null
@@ -1,653 +0,0 @@
-/*
- *  Copyright (c) 2013 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/call/rampup_tests.h"
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/platform_thread.h"
-#include "webrtc/test/encoder_settings.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/testsupport/perf_test.h"
-
-namespace webrtc {
-namespace {
-
-static const int64_t kPollIntervalMs = 20;
-static const int kExpectedHighVideoBitrateBps = 80000;
-static const int kExpectedHighAudioBitrateBps = 30000;
-static const int kLowBandwidthLimitBps = 20000;
-static const int kExpectedLowBitrateBps = 20000;
-
-std::vector<uint32_t> GenerateSsrcs(size_t num_streams, uint32_t ssrc_offset) {
-  std::vector<uint32_t> ssrcs;
-  for (size_t i = 0; i != num_streams; ++i)
-    ssrcs.push_back(static_cast<uint32_t>(ssrc_offset + i));
-  return ssrcs;
-}
-}  // namespace
-
-RampUpTester::RampUpTester(size_t num_video_streams,
-                           size_t num_audio_streams,
-                           size_t num_flexfec_streams,
-                           unsigned int start_bitrate_bps,
-                           int64_t min_run_time_ms,
-                           const std::string& extension_type,
-                           bool rtx,
-                           bool red,
-                           bool report_perf_stats)
-    : EndToEndTest(test::CallTest::kLongTimeoutMs),
-      stop_event_(false, false),
-      clock_(Clock::GetRealTimeClock()),
-      num_video_streams_(num_video_streams),
-      num_audio_streams_(num_audio_streams),
-      num_flexfec_streams_(num_flexfec_streams),
-      rtx_(rtx),
-      red_(red),
-      report_perf_stats_(report_perf_stats),
-      sender_call_(nullptr),
-      send_stream_(nullptr),
-      send_transport_(nullptr),
-      start_bitrate_bps_(start_bitrate_bps),
-      min_run_time_ms_(min_run_time_ms),
-      expected_bitrate_bps_(0),
-      test_start_ms_(-1),
-      ramp_up_finished_ms_(-1),
-      extension_type_(extension_type),
-      video_ssrcs_(GenerateSsrcs(num_video_streams_, 100)),
-      video_rtx_ssrcs_(GenerateSsrcs(num_video_streams_, 200)),
-      audio_ssrcs_(GenerateSsrcs(num_audio_streams_, 300)),
-      poller_thread_(&BitrateStatsPollingThread,
-                     this,
-                     "BitrateStatsPollingThread") {
-  if (red_)
-    EXPECT_EQ(0u, num_flexfec_streams_);
-  EXPECT_LE(num_audio_streams_, 1u);
-}
-
-RampUpTester::~RampUpTester() {
-}
-
-Call::Config RampUpTester::GetSenderCallConfig() {
-  Call::Config call_config(&event_log_);
-  if (start_bitrate_bps_ != 0) {
-    call_config.bitrate_config.start_bitrate_bps = start_bitrate_bps_;
-  }
-  call_config.bitrate_config.min_bitrate_bps = 10000;
-  return call_config;
-}
-
-void RampUpTester::OnVideoStreamsCreated(
-    VideoSendStream* send_stream,
-    const std::vector<VideoReceiveStream*>& receive_streams) {
-  send_stream_ = send_stream;
-}
-
-test::PacketTransport* RampUpTester::CreateSendTransport(
-    test::SingleThreadedTaskQueueForTesting* task_queue,
-    Call* sender_call) {
-  send_transport_ = new test::PacketTransport(
-      task_queue, sender_call, this, test::PacketTransport::kSender,
-      test::CallTest::payload_type_map_, forward_transport_config_);
-  return send_transport_;
-}
-
-size_t RampUpTester::GetNumVideoStreams() const {
-  return num_video_streams_;
-}
-
-size_t RampUpTester::GetNumAudioStreams() const {
-  return num_audio_streams_;
-}
-
-size_t RampUpTester::GetNumFlexfecStreams() const {
-  return num_flexfec_streams_;
-}
-
-class RampUpTester::VideoStreamFactory
-    : public VideoEncoderConfig::VideoStreamFactoryInterface {
- public:
-  VideoStreamFactory() {}
-
- private:
-  std::vector<VideoStream> CreateEncoderStreams(
-      int width,
-      int height,
-      const VideoEncoderConfig& encoder_config) override {
-    std::vector<VideoStream> streams =
-        test::CreateVideoStreams(width, height, encoder_config);
-    if (encoder_config.number_of_streams == 1) {
-      streams[0].target_bitrate_bps = streams[0].max_bitrate_bps = 2000000;
-    }
-    return streams;
-  }
-};
-
-void RampUpTester::ModifyVideoConfigs(
-    VideoSendStream::Config* send_config,
-    std::vector<VideoReceiveStream::Config>* receive_configs,
-    VideoEncoderConfig* encoder_config) {
-  send_config->suspend_below_min_bitrate = true;
-  encoder_config->number_of_streams = num_video_streams_;
-  encoder_config->max_bitrate_bps = 2000000;
-  encoder_config->video_stream_factory =
-      new rtc::RefCountedObject<RampUpTester::VideoStreamFactory>();
-  if (num_video_streams_ == 1) {
-    // For single stream rampup until 1mbps
-    expected_bitrate_bps_ = kSingleStreamTargetBps;
-  } else {
-    // For multi stream rampup until all streams are being sent. That means
-    // enough bitrate to send all the target streams plus the min bitrate of
-    // the last one.
-    std::vector<VideoStream> streams = test::CreateVideoStreams(
-        test::CallTest::kDefaultWidth, test::CallTest::kDefaultHeight,
-        *encoder_config);
-    expected_bitrate_bps_ = streams.back().min_bitrate_bps;
-    for (size_t i = 0; i < streams.size() - 1; ++i) {
-      expected_bitrate_bps_ += streams[i].target_bitrate_bps;
-    }
-  }
-
-  send_config->rtp.extensions.clear();
-
-  bool remb;
-  bool transport_cc;
-  if (extension_type_ == RtpExtension::kAbsSendTimeUri) {
-    remb = true;
-    transport_cc = false;
-    send_config->rtp.extensions.push_back(
-        RtpExtension(extension_type_.c_str(), kAbsSendTimeExtensionId));
-  } else if (extension_type_ == RtpExtension::kTransportSequenceNumberUri) {
-    remb = false;
-    transport_cc = true;
-    send_config->rtp.extensions.push_back(RtpExtension(
-        extension_type_.c_str(), kTransportSequenceNumberExtensionId));
-  } else {
-    remb = true;
-    transport_cc = false;
-    send_config->rtp.extensions.push_back(RtpExtension(
-        extension_type_.c_str(), kTransmissionTimeOffsetExtensionId));
-  }
-
-  send_config->rtp.nack.rtp_history_ms = test::CallTest::kNackRtpHistoryMs;
-  send_config->rtp.ssrcs = video_ssrcs_;
-  if (rtx_) {
-    send_config->rtp.rtx.payload_type = test::CallTest::kSendRtxPayloadType;
-    send_config->rtp.rtx.ssrcs = video_rtx_ssrcs_;
-  }
-  if (red_) {
-    send_config->rtp.ulpfec.ulpfec_payload_type =
-        test::CallTest::kUlpfecPayloadType;
-    send_config->rtp.ulpfec.red_payload_type = test::CallTest::kRedPayloadType;
-    if (rtx_) {
-      send_config->rtp.ulpfec.red_rtx_payload_type =
-          test::CallTest::kRtxRedPayloadType;
-    }
-  }
-
-  size_t i = 0;
-  for (VideoReceiveStream::Config& recv_config : *receive_configs) {
-    recv_config.rtp.remb = remb;
-    recv_config.rtp.transport_cc = transport_cc;
-    recv_config.rtp.extensions = send_config->rtp.extensions;
-
-    recv_config.rtp.remote_ssrc = video_ssrcs_[i];
-    recv_config.rtp.nack.rtp_history_ms = send_config->rtp.nack.rtp_history_ms;
-
-    if (red_) {
-      recv_config.rtp.ulpfec.red_payload_type =
-          send_config->rtp.ulpfec.red_payload_type;
-      recv_config.rtp.ulpfec.ulpfec_payload_type =
-          send_config->rtp.ulpfec.ulpfec_payload_type;
-      if (rtx_) {
-        recv_config.rtp.rtx_associated_payload_types
-            [send_config->rtp.ulpfec.red_rtx_payload_type] =
-            send_config->rtp.ulpfec.red_payload_type;
-      }
-    }
-
-    if (rtx_) {
-      recv_config.rtp.rtx_ssrc = video_rtx_ssrcs_[i];
-      recv_config.rtp
-          .rtx_associated_payload_types[send_config->rtp.rtx.payload_type] =
-          send_config->encoder_settings.payload_type;
-    }
-    ++i;
-  }
-
-  RTC_DCHECK_LE(num_flexfec_streams_, 1);
-  if (num_flexfec_streams_ == 1) {
-    send_config->rtp.flexfec.payload_type = test::CallTest::kFlexfecPayloadType;
-    send_config->rtp.flexfec.ssrc = test::CallTest::kFlexfecSendSsrc;
-    send_config->rtp.flexfec.protected_media_ssrcs = {video_ssrcs_[0]};
-  }
-}
-
-void RampUpTester::ModifyAudioConfigs(
-    AudioSendStream::Config* send_config,
-    std::vector<AudioReceiveStream::Config>* receive_configs) {
-  if (num_audio_streams_ == 0)
-    return;
-
-  EXPECT_NE(RtpExtension::kTimestampOffsetUri, extension_type_)
-      << "Audio BWE not supported with toffset.";
-  EXPECT_NE(RtpExtension::kAbsSendTimeUri, extension_type_)
-      << "Audio BWE not supported with abs-send-time.";
-
-  send_config->rtp.ssrc = audio_ssrcs_[0];
-  send_config->rtp.extensions.clear();
-
-  send_config->min_bitrate_bps = 6000;
-  send_config->max_bitrate_bps = 60000;
-
-  bool transport_cc = false;
-  if (extension_type_ == RtpExtension::kTransportSequenceNumberUri) {
-    transport_cc = true;
-    send_config->rtp.extensions.push_back(RtpExtension(
-        extension_type_.c_str(), kTransportSequenceNumberExtensionId));
-  }
-
-  for (AudioReceiveStream::Config& recv_config : *receive_configs) {
-    recv_config.rtp.transport_cc = transport_cc;
-    recv_config.rtp.extensions = send_config->rtp.extensions;
-    recv_config.rtp.remote_ssrc = send_config->rtp.ssrc;
-  }
-}
-
-void RampUpTester::ModifyFlexfecConfigs(
-    std::vector<FlexfecReceiveStream::Config>* receive_configs) {
-  if (num_flexfec_streams_ == 0)
-    return;
-  RTC_DCHECK_EQ(1, num_flexfec_streams_);
-  (*receive_configs)[0].payload_type = test::CallTest::kFlexfecPayloadType;
-  (*receive_configs)[0].remote_ssrc = test::CallTest::kFlexfecSendSsrc;
-  (*receive_configs)[0].protected_media_ssrcs = {video_ssrcs_[0]};
-  (*receive_configs)[0].local_ssrc = video_ssrcs_[0];
-  if (extension_type_ == RtpExtension::kAbsSendTimeUri) {
-    (*receive_configs)[0].transport_cc = false;
-    (*receive_configs)[0].rtp_header_extensions.push_back(
-        RtpExtension(extension_type_.c_str(), kAbsSendTimeExtensionId));
-  } else if (extension_type_ == RtpExtension::kTransportSequenceNumberUri) {
-    (*receive_configs)[0].transport_cc = true;
-    (*receive_configs)[0].rtp_header_extensions.push_back(RtpExtension(
-        extension_type_.c_str(), kTransportSequenceNumberExtensionId));
-  }
-}
-
-void RampUpTester::OnCallsCreated(Call* sender_call, Call* receiver_call) {
-  sender_call_ = sender_call;
-}
-
-void RampUpTester::BitrateStatsPollingThread(void* obj) {
-  static_cast<RampUpTester*>(obj)->PollStats();
-}
-
-void RampUpTester::PollStats() {
-  do {
-    if (sender_call_) {
-      Call::Stats stats = sender_call_->GetStats();
-
-      EXPECT_GE(stats.send_bandwidth_bps, start_bitrate_bps_);
-      EXPECT_GE(expected_bitrate_bps_, 0);
-      if (stats.send_bandwidth_bps >= expected_bitrate_bps_ &&
-          (min_run_time_ms_ == -1 ||
-           clock_->TimeInMilliseconds() - test_start_ms_ >= min_run_time_ms_)) {
-        ramp_up_finished_ms_ = clock_->TimeInMilliseconds();
-        observation_complete_.Set();
-      }
-    }
-  } while (!stop_event_.Wait(kPollIntervalMs));
-}
-
-void RampUpTester::ReportResult(const std::string& measurement,
-                                size_t value,
-                                const std::string& units) const {
-  webrtc::test::PrintResult(
-      measurement, "",
-      ::testing::UnitTest::GetInstance()->current_test_info()->name(), value,
-      units, false);
-}
-
-void RampUpTester::AccumulateStats(const VideoSendStream::StreamStats& stream,
-                                   size_t* total_packets_sent,
-                                   size_t* total_sent,
-                                   size_t* padding_sent,
-                                   size_t* media_sent) const {
-  *total_packets_sent += stream.rtp_stats.transmitted.packets +
-                         stream.rtp_stats.retransmitted.packets +
-                         stream.rtp_stats.fec.packets;
-  *total_sent += stream.rtp_stats.transmitted.TotalBytes() +
-                 stream.rtp_stats.retransmitted.TotalBytes() +
-                 stream.rtp_stats.fec.TotalBytes();
-  *padding_sent += stream.rtp_stats.transmitted.padding_bytes +
-                   stream.rtp_stats.retransmitted.padding_bytes +
-                   stream.rtp_stats.fec.padding_bytes;
-  *media_sent += stream.rtp_stats.MediaPayloadBytes();
-}
-
-void RampUpTester::TriggerTestDone() {
-  RTC_DCHECK_GE(test_start_ms_, 0);
-
-  // TODO(holmer): Add audio send stats here too when those APIs are available.
-  if (!send_stream_)
-    return;
-
-  VideoSendStream::Stats send_stats = send_stream_->GetStats();
-
-  size_t total_packets_sent = 0;
-  size_t total_sent = 0;
-  size_t padding_sent = 0;
-  size_t media_sent = 0;
-  for (uint32_t ssrc : video_ssrcs_) {
-    AccumulateStats(send_stats.substreams[ssrc], &total_packets_sent,
-                    &total_sent, &padding_sent, &media_sent);
-  }
-
-  size_t rtx_total_packets_sent = 0;
-  size_t rtx_total_sent = 0;
-  size_t rtx_padding_sent = 0;
-  size_t rtx_media_sent = 0;
-  for (uint32_t rtx_ssrc : video_rtx_ssrcs_) {
-    AccumulateStats(send_stats.substreams[rtx_ssrc], &rtx_total_packets_sent,
-                    &rtx_total_sent, &rtx_padding_sent, &rtx_media_sent);
-  }
-
-  if (report_perf_stats_) {
-    ReportResult("ramp-up-media-sent", media_sent, "bytes");
-    ReportResult("ramp-up-padding-sent", padding_sent, "bytes");
-    ReportResult("ramp-up-rtx-media-sent", rtx_media_sent, "bytes");
-    ReportResult("ramp-up-rtx-padding-sent", rtx_padding_sent, "bytes");
-    if (ramp_up_finished_ms_ >= 0) {
-      ReportResult("ramp-up-time", ramp_up_finished_ms_ - test_start_ms_,
-                   "milliseconds");
-    }
-    ReportResult("ramp-up-average-network-latency",
-                 send_transport_->GetAverageDelayMs(), "milliseconds");
-  }
-}
-
-void RampUpTester::PerformTest() {
-  test_start_ms_ = clock_->TimeInMilliseconds();
-  poller_thread_.Start();
-  EXPECT_TRUE(Wait()) << "Timed out while waiting for ramp-up to complete.";
-  TriggerTestDone();
-  stop_event_.Set();
-  poller_thread_.Stop();
-}
-
-RampUpDownUpTester::RampUpDownUpTester(size_t num_video_streams,
-                                       size_t num_audio_streams,
-                                       size_t num_flexfec_streams,
-                                       unsigned int start_bitrate_bps,
-                                       const std::string& extension_type,
-                                       bool rtx,
-                                       bool red,
-                                       const std::vector<int>& loss_rates,
-                                       bool report_perf_stats)
-    : RampUpTester(num_video_streams,
-                   num_audio_streams,
-                   num_flexfec_streams,
-                   start_bitrate_bps,
-                   0,
-                   extension_type,
-                   rtx,
-                   red,
-                   report_perf_stats),
-      link_rates_({4 * GetExpectedHighBitrate() / (3 * 1000),
-                   kLowBandwidthLimitBps / 1000,
-                   4 * GetExpectedHighBitrate() / (3 * 1000), 0}),
-      test_state_(kFirstRampup),
-      next_state_(kTransitionToNextState),
-      state_start_ms_(clock_->TimeInMilliseconds()),
-      interval_start_ms_(clock_->TimeInMilliseconds()),
-      sent_bytes_(0),
-      loss_rates_(loss_rates) {
-  forward_transport_config_.link_capacity_kbps = link_rates_[test_state_];
-  forward_transport_config_.queue_delay_ms = 100;
-  forward_transport_config_.loss_percent = loss_rates_[test_state_];
-}
-
-RampUpDownUpTester::~RampUpDownUpTester() {}
-
-void RampUpDownUpTester::PollStats() {
-  do {
-    if (send_stream_) {
-      webrtc::VideoSendStream::Stats stats = send_stream_->GetStats();
-      int transmit_bitrate_bps = 0;
-      for (auto it : stats.substreams) {
-        transmit_bitrate_bps += it.second.total_bitrate_bps;
-      }
-      EvolveTestState(transmit_bitrate_bps, stats.suspended);
-    } else if (num_audio_streams_ > 0 && sender_call_ != nullptr) {
-      // An audio send stream doesn't have bitrate stats, so the call send BW is
-      // currently used instead.
-      int transmit_bitrate_bps = sender_call_->GetStats().send_bandwidth_bps;
-      EvolveTestState(transmit_bitrate_bps, false);
-    }
-  } while (!stop_event_.Wait(kPollIntervalMs));
-}
-
-Call::Config RampUpDownUpTester::GetReceiverCallConfig() {
-  Call::Config config(&event_log_);
-  config.bitrate_config.min_bitrate_bps = 10000;
-  return config;
-}
-
-std::string RampUpDownUpTester::GetModifierString() const {
-  std::string str("_");
-  if (num_video_streams_ > 0) {
-    std::ostringstream s;
-    s << num_video_streams_;
-    str += s.str();
-    str += "stream";
-    str += (num_video_streams_ > 1 ? "s" : "");
-    str += "_";
-  }
-  if (num_audio_streams_ > 0) {
-    std::ostringstream s;
-    s << num_audio_streams_;
-    str += s.str();
-    str += "stream";
-    str += (num_audio_streams_ > 1 ? "s" : "");
-    str += "_";
-  }
-  str += (rtx_ ? "" : "no");
-  str += "rtx";
-  return str;
-}
-
-int RampUpDownUpTester::GetExpectedHighBitrate() const {
-  int expected_bitrate_bps = 0;
-  if (num_audio_streams_ > 0)
-    expected_bitrate_bps += kExpectedHighAudioBitrateBps;
-  if (num_video_streams_ > 0)
-    expected_bitrate_bps += kExpectedHighVideoBitrateBps;
-  return expected_bitrate_bps;
-}
-
-size_t RampUpDownUpTester::GetFecBytes() const {
-  size_t flex_fec_bytes = 0;
-  if (num_flexfec_streams_ > 0) {
-    webrtc::VideoSendStream::Stats stats = send_stream_->GetStats();
-    for (const auto& kv : stats.substreams)
-      flex_fec_bytes += kv.second.rtp_stats.fec.TotalBytes();
-  }
-  return flex_fec_bytes;
-}
-
-bool RampUpDownUpTester::ExpectingFec() const {
-  return num_flexfec_streams_ > 0 && forward_transport_config_.loss_percent > 0;
-}
-
-void RampUpDownUpTester::EvolveTestState(int bitrate_bps, bool suspended) {
-  int64_t now = clock_->TimeInMilliseconds();
-  switch (test_state_) {
-    case kFirstRampup:
-      EXPECT_FALSE(suspended);
-      if (bitrate_bps >= GetExpectedHighBitrate()) {
-        if (report_perf_stats_) {
-          webrtc::test::PrintResult("ramp_up_down_up", GetModifierString(),
-                                    "first_rampup", now - state_start_ms_, "ms",
-                                    false);
-        }
-        // Apply loss during the transition between states if FEC is enabled.
-        forward_transport_config_.loss_percent = loss_rates_[test_state_];
-        test_state_ = kTransitionToNextState;
-        next_state_ = kLowRate;
-      }
-      break;
-    case kLowRate: {
-      // Audio streams are never suspended.
-      bool check_suspend_state = num_video_streams_ > 0;
-      if (bitrate_bps < kExpectedLowBitrateBps &&
-          suspended == check_suspend_state) {
-        if (report_perf_stats_) {
-          webrtc::test::PrintResult("ramp_up_down_up", GetModifierString(),
-                                    "rampdown", now - state_start_ms_, "ms",
-                                    false);
-        }
-        // Apply loss during the transition between states if FEC is enabled.
-        forward_transport_config_.loss_percent = loss_rates_[test_state_];
-        test_state_ = kTransitionToNextState;
-        next_state_ = kSecondRampup;
-      }
-      break;
-    }
-    case kSecondRampup:
-      if (bitrate_bps >= GetExpectedHighBitrate() && !suspended) {
-        if (report_perf_stats_) {
-          webrtc::test::PrintResult("ramp_up_down_up", GetModifierString(),
-                                    "second_rampup", now - state_start_ms_,
-                                    "ms", false);
-          ReportResult("ramp-up-down-up-average-network-latency",
-                       send_transport_->GetAverageDelayMs(), "milliseconds");
-        }
-        // Apply loss during the transition between states if FEC is enabled.
-        forward_transport_config_.loss_percent = loss_rates_[test_state_];
-        test_state_ = kTransitionToNextState;
-        next_state_ = kTestEnd;
-      }
-      break;
-    case kTestEnd:
-      observation_complete_.Set();
-      break;
-    case kTransitionToNextState:
-      if (!ExpectingFec() || GetFecBytes() > 0) {
-        test_state_ = next_state_;
-        forward_transport_config_.link_capacity_kbps = link_rates_[test_state_];
-        // No loss while ramping up and down as it may affect the BWE
-        // negatively, making the test flaky.
-        forward_transport_config_.loss_percent = 0;
-        state_start_ms_ = now;
-        interval_start_ms_ = now;
-        sent_bytes_ = 0;
-        send_transport_->SetConfig(forward_transport_config_);
-      }
-      break;
-  }
-}
-
-class RampUpTest : public test::CallTest {
- public:
-  RampUpTest() {}
-
-  virtual ~RampUpTest() {
-    EXPECT_EQ(nullptr, video_send_stream_);
-    EXPECT_TRUE(video_receive_streams_.empty());
-  }
-};
-
-static const uint32_t kStartBitrateBps = 60000;
-
-TEST_F(RampUpTest, UpDownUpAbsSendTimeSimulcastRedRtx) {
-  std::vector<int> loss_rates = {0, 0, 0, 0};
-  RampUpDownUpTester test(3, 0, 0, kStartBitrateBps,
-                          RtpExtension::kAbsSendTimeUri, true, true, loss_rates,
-                          true);
-  RunBaseTest(&test);
-}
-
-TEST_F(RampUpTest, UpDownUpTransportSequenceNumberRtx) {
-  std::vector<int> loss_rates = {0, 0, 0, 0};
-  RampUpDownUpTester test(3, 0, 0, kStartBitrateBps,
-                          RtpExtension::kTransportSequenceNumberUri, true,
-                          false, loss_rates, true);
-  RunBaseTest(&test);
-}
-
-// TODO(holmer): Tests which don't report perf stats should be moved to a
-// different executable since they per definition are not perf tests.
-TEST_F(RampUpTest, UpDownUpTransportSequenceNumberPacketLoss) {
-  std::vector<int> loss_rates = {20, 0, 0, 0};
-  RampUpDownUpTester test(1, 0, 1, kStartBitrateBps,
-                          RtpExtension::kTransportSequenceNumberUri, true,
-                          false, loss_rates, false);
-  RunBaseTest(&test);
-}
-
-TEST_F(RampUpTest, UpDownUpAudioVideoTransportSequenceNumberRtx) {
-  std::vector<int> loss_rates = {0, 0, 0, 0};
-  RampUpDownUpTester test(3, 1, 0, kStartBitrateBps,
-                          RtpExtension::kTransportSequenceNumberUri, true,
-                          false, loss_rates, false);
-  RunBaseTest(&test);
-}
-
-TEST_F(RampUpTest, UpDownUpAudioTransportSequenceNumberRtx) {
-  std::vector<int> loss_rates = {0, 0, 0, 0};
-  RampUpDownUpTester test(0, 1, 0, kStartBitrateBps,
-                          RtpExtension::kTransportSequenceNumberUri, true,
-                          false, loss_rates, false);
-  RunBaseTest(&test);
-}
-
-TEST_F(RampUpTest, TOffsetSimulcastRedRtx) {
-  RampUpTester test(3, 0, 0, 0, 0, RtpExtension::kTimestampOffsetUri, true,
-                    true, true);
-  RunBaseTest(&test);
-}
-
-TEST_F(RampUpTest, AbsSendTime) {
-  RampUpTester test(1, 0, 0, 0, 0, RtpExtension::kAbsSendTimeUri, false, false,
-                    false);
-  RunBaseTest(&test);
-}
-
-TEST_F(RampUpTest, AbsSendTimeSimulcastRedRtx) {
-  RampUpTester test(3, 0, 0, 0, 0, RtpExtension::kAbsSendTimeUri, true, true,
-                    true);
-  RunBaseTest(&test);
-}
-
-TEST_F(RampUpTest, TransportSequenceNumber) {
-  RampUpTester test(1, 0, 0, 0, 0, RtpExtension::kTransportSequenceNumberUri,
-                    false, false, false);
-  RunBaseTest(&test);
-}
-
-TEST_F(RampUpTest, TransportSequenceNumberSimulcast) {
-  RampUpTester test(3, 0, 0, 0, 0, RtpExtension::kTransportSequenceNumberUri,
-                    false, false, false);
-  RunBaseTest(&test);
-}
-
-TEST_F(RampUpTest, TransportSequenceNumberSimulcastRedRtx) {
-  RampUpTester test(3, 0, 0, 0, 0, RtpExtension::kTransportSequenceNumberUri,
-                    true, true, true);
-  RunBaseTest(&test);
-}
-
-TEST_F(RampUpTest, AudioTransportSequenceNumber) {
-  RampUpTester test(0, 1, 0, 300000, 10000,
-                    RtpExtension::kTransportSequenceNumberUri, false, false,
-                    false);
-  RunBaseTest(&test);
-}
-}  // namespace webrtc
diff --git a/call/rampup_tests.h b/call/rampup_tests.h
deleted file mode 100644
index 8358822..0000000
--- a/call/rampup_tests.h
+++ /dev/null
@@ -1,160 +0,0 @@
-/*
- *  Copyright (c) 2014 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_CALL_RAMPUP_TESTS_H_
-#define WEBRTC_CALL_RAMPUP_TESTS_H_
-
-#include <map>
-#include <string>
-#include <vector>
-
-#include "webrtc/call/call.h"
-#include "webrtc/logging/rtc_event_log/rtc_event_log.h"
-#include "webrtc/rtc_base/event.h"
-#include "webrtc/test/call_test.h"
-
-namespace webrtc {
-
-static const int kTransmissionTimeOffsetExtensionId = 6;
-static const int kAbsSendTimeExtensionId = 7;
-static const int kTransportSequenceNumberExtensionId = 8;
-static const unsigned int kSingleStreamTargetBps = 1000000;
-
-class Clock;
-
-class RampUpTester : public test::EndToEndTest {
- public:
-  RampUpTester(size_t num_video_streams,
-               size_t num_audio_streams,
-               size_t num_flexfec_streams,
-               unsigned int start_bitrate_bps,
-               int64_t min_run_time_ms,
-               const std::string& extension_type,
-               bool rtx,
-               bool red,
-               bool report_perf_stats);
-  ~RampUpTester() override;
-
-  size_t GetNumVideoStreams() const override;
-  size_t GetNumAudioStreams() const override;
-  size_t GetNumFlexfecStreams() const override;
-
-  void PerformTest() override;
-
- protected:
-  virtual void PollStats();
-
-  void AccumulateStats(const VideoSendStream::StreamStats& stream,
-                       size_t* total_packets_sent,
-                       size_t* total_sent,
-                       size_t* padding_sent,
-                       size_t* media_sent) const;
-
-  void ReportResult(const std::string& measurement,
-                    size_t value,
-                    const std::string& units) const;
-  void TriggerTestDone();
-
-  webrtc::RtcEventLogNullImpl event_log_;
-  rtc::Event stop_event_;
-  Clock* const clock_;
-  FakeNetworkPipe::Config forward_transport_config_;
-  const size_t num_video_streams_;
-  const size_t num_audio_streams_;
-  const size_t num_flexfec_streams_;
-  const bool rtx_;
-  const bool red_;
-  const bool report_perf_stats_;
-  Call* sender_call_;
-  VideoSendStream* send_stream_;
-  test::PacketTransport* send_transport_;
-
- private:
-  typedef std::map<uint32_t, uint32_t> SsrcMap;
-  class VideoStreamFactory;
-
-  Call::Config GetSenderCallConfig() override;
-  void OnVideoStreamsCreated(
-      VideoSendStream* send_stream,
-      const std::vector<VideoReceiveStream*>& receive_streams) override;
-  test::PacketTransport* CreateSendTransport(
-      test::SingleThreadedTaskQueueForTesting* task_queue,
-      Call* sender_call) override;
-  void ModifyVideoConfigs(
-      VideoSendStream::Config* send_config,
-      std::vector<VideoReceiveStream::Config>* receive_configs,
-      VideoEncoderConfig* encoder_config) override;
-  void ModifyAudioConfigs(
-      AudioSendStream::Config* send_config,
-      std::vector<AudioReceiveStream::Config>* receive_configs) override;
-  void ModifyFlexfecConfigs(
-      std::vector<FlexfecReceiveStream::Config>* receive_configs) override;
-  void OnCallsCreated(Call* sender_call, Call* receiver_call) override;
-
-  static void BitrateStatsPollingThread(void* obj);
-
-  const int start_bitrate_bps_;
-  const int64_t min_run_time_ms_;
-  int expected_bitrate_bps_;
-  int64_t test_start_ms_;
-  int64_t ramp_up_finished_ms_;
-
-  const std::string extension_type_;
-  std::vector<uint32_t> video_ssrcs_;
-  std::vector<uint32_t> video_rtx_ssrcs_;
-  std::vector<uint32_t> audio_ssrcs_;
-
-  rtc::PlatformThread poller_thread_;
-};
-
-class RampUpDownUpTester : public RampUpTester {
- public:
-  RampUpDownUpTester(size_t num_video_streams,
-                     size_t num_audio_streams,
-                     size_t num_flexfec_streams,
-                     unsigned int start_bitrate_bps,
-                     const std::string& extension_type,
-                     bool rtx,
-                     bool red,
-                     const std::vector<int>& loss_rates,
-                     bool report_perf_stats);
-  ~RampUpDownUpTester() override;
-
- protected:
-  void PollStats() override;
-
- private:
-  enum TestStates {
-    kFirstRampup = 0,
-    kLowRate,
-    kSecondRampup,
-    kTestEnd,
-    kTransitionToNextState,
-  };
-
-  Call::Config GetReceiverCallConfig() override;
-
-  std::string GetModifierString() const;
-  int GetExpectedHighBitrate() const;
-  int GetHighLinkCapacity() const;
-  size_t GetFecBytes() const;
-  bool ExpectingFec() const;
-  void EvolveTestState(int bitrate_bps, bool suspended);
-
-  const std::vector<int> link_rates_;
-  TestStates test_state_;
-  TestStates next_state_;
-  int64_t state_start_ms_;
-  int64_t interval_start_ms_;
-  int sent_bytes_;
-  std::vector<int> loss_rates_;
-};
-}  // namespace webrtc
-#endif  // WEBRTC_CALL_RAMPUP_TESTS_H_
diff --git a/call/rtcp_demuxer.cc b/call/rtcp_demuxer.cc
deleted file mode 100644
index 90620c3..0000000
--- a/call/rtcp_demuxer.cc
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- *  Copyright (c) 2017 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/call/rtcp_demuxer.h"
-
-#include "webrtc/call/rtcp_packet_sink_interface.h"
-#include "webrtc/call/rtp_rtcp_demuxer_helper.h"
-#include "webrtc/common_types.h"
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-
-RtcpDemuxer::RtcpDemuxer() = default;
-
-RtcpDemuxer::~RtcpDemuxer() {
-  RTC_DCHECK(ssrc_sinks_.empty());
-  RTC_DCHECK(rsid_sinks_.empty());
-  RTC_DCHECK(broadcast_sinks_.empty());
-}
-
-void RtcpDemuxer::AddSink(uint32_t sender_ssrc, RtcpPacketSinkInterface* sink) {
-  RTC_DCHECK(sink);
-  RTC_DCHECK(!ContainerHasKey(broadcast_sinks_, sink));
-  RTC_DCHECK(!MultimapAssociationExists(ssrc_sinks_, sender_ssrc, sink));
-  ssrc_sinks_.emplace(sender_ssrc, sink);
-}
-
-void RtcpDemuxer::AddSink(const std::string& rsid,
-                          RtcpPacketSinkInterface* sink) {
-  RTC_DCHECK(StreamId::IsLegalName(rsid));
-  RTC_DCHECK(sink);
-  RTC_DCHECK(!ContainerHasKey(broadcast_sinks_, sink));
-  RTC_DCHECK(!MultimapAssociationExists(rsid_sinks_, rsid, sink));
-  rsid_sinks_.emplace(rsid, sink);
-}
-
-void RtcpDemuxer::AddBroadcastSink(RtcpPacketSinkInterface* sink) {
-  RTC_DCHECK(sink);
-  RTC_DCHECK(!MultimapHasValue(ssrc_sinks_, sink));
-  RTC_DCHECK(!MultimapHasValue(rsid_sinks_, sink));
-  RTC_DCHECK(!ContainerHasKey(broadcast_sinks_, sink));
-  broadcast_sinks_.push_back(sink);
-}
-
-void RtcpDemuxer::RemoveSink(const RtcpPacketSinkInterface* sink) {
-  RTC_DCHECK(sink);
-  size_t removal_count = RemoveFromMultimapByValue(&ssrc_sinks_, sink) +
-                         RemoveFromMultimapByValue(&rsid_sinks_, sink);
-  RTC_DCHECK_GT(removal_count, 0);
-}
-
-void RtcpDemuxer::RemoveBroadcastSink(const RtcpPacketSinkInterface* sink) {
-  RTC_DCHECK(sink);
-  auto it = std::find(broadcast_sinks_.begin(), broadcast_sinks_.end(), sink);
-  RTC_DCHECK(it != broadcast_sinks_.end());
-  broadcast_sinks_.erase(it);
-}
-
-void RtcpDemuxer::OnRtcpPacket(rtc::ArrayView<const uint8_t> packet) {
-  // Perform sender-SSRC-based demuxing for packets with a sender-SSRC.
-  rtc::Optional<uint32_t> sender_ssrc = ParseRtcpPacketSenderSsrc(packet);
-  if (sender_ssrc) {
-    auto it_range = ssrc_sinks_.equal_range(*sender_ssrc);
-    for (auto it = it_range.first; it != it_range.second; ++it) {
-      it->second->OnRtcpPacket(packet);
-    }
-  }
-
-  // All packets, even those without a sender-SSRC, are broadcast to sinks
-  // which listen to broadcasts.
-  for (RtcpPacketSinkInterface* sink : broadcast_sinks_) {
-    sink->OnRtcpPacket(packet);
-  }
-}
-
-void RtcpDemuxer::OnSsrcBoundToRsid(const std::string& rsid, uint32_t ssrc) {
-  // Record the new SSRC association for all of the sinks that were associated
-  // with the RSID.
-  auto it_range = rsid_sinks_.equal_range(rsid);
-  for (auto it = it_range.first; it != it_range.second; ++it) {
-    RtcpPacketSinkInterface* sink = it->second;
-    // Watch out for pre-existing SSRC-based associations.
-    if (!MultimapAssociationExists(ssrc_sinks_, ssrc, sink)) {
-      AddSink(ssrc, sink);
-    }
-  }
-
-  // RSIDs are uniquely associated with SSRCs; no need to keep in memory
-  // the RSID-to-sink association of resolved RSIDs.
-  rsid_sinks_.erase(it_range.first, it_range.second);
-}
-
-}  // namespace webrtc
diff --git a/call/rtcp_demuxer.h b/call/rtcp_demuxer.h
deleted file mode 100644
index 7b5af9f..0000000
--- a/call/rtcp_demuxer.h
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- *  Copyright (c) 2017 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_CALL_RTCP_DEMUXER_H_
-#define WEBRTC_CALL_RTCP_DEMUXER_H_
-
-#include <map>
-#include <string>
-#include <vector>
-
-#include "webrtc/api/array_view.h"
-#include "webrtc/call/ssrc_binding_observer.h"
-#include "webrtc/rtc_base/basictypes.h"
-
-namespace webrtc {
-
-class RtcpPacketSinkInterface;
-
-// This class represents the RTCP demuxing, for a single RTP session (i.e., one
-// SSRC space, see RFC 7656). It isn't thread aware, leaving responsibility of
-// multithreading issues to the user of this class.
-class RtcpDemuxer : public SsrcBindingObserver {
- public:
-  RtcpDemuxer();
-  ~RtcpDemuxer() override;
-
-  // Registers a sink. The sink will be notified of incoming RTCP packets with
-  // that sender-SSRC. The same sink can be registered for multiple SSRCs, and
-  // the same SSRC can have multiple sinks. Null pointer is not allowed.
-  // Sinks may be associated with both an SSRC and an RSID.
-  // Sinks may be registered as SSRC/RSID-specific or broadcast, but not both.
-  void AddSink(uint32_t sender_ssrc, RtcpPacketSinkInterface* sink);
-
-  // Registers a sink. Once the RSID is resolved to an SSRC, the sink will be
-  // notified of all RTCP packets with that sender-SSRC.
-  // The same sink can be registered for multiple RSIDs, and
-  // the same RSID can have multiple sinks. Null pointer is not allowed.
-  // Sinks may be associated with both an SSRC and an RSID.
-  // Sinks may be registered as SSRC/RSID-specific or broadcast, but not both.
-  void AddSink(const std::string& rsid, RtcpPacketSinkInterface* sink);
-
-  // Registers a sink. The sink will be notified of any incoming RTCP packet.
-  // Null pointer is not allowed.
-  // Sinks may be registered as SSRC/RSID-specific or broadcast, but not both.
-  void AddBroadcastSink(RtcpPacketSinkInterface* sink);
-
-  // Undo previous AddSink() calls with the given sink.
-  void RemoveSink(const RtcpPacketSinkInterface* sink);
-
-  // Undo AddBroadcastSink().
-  void RemoveBroadcastSink(const RtcpPacketSinkInterface* sink);
-
-  // Process a new RTCP packet and forward it to the appropriate sinks.
-  void OnRtcpPacket(rtc::ArrayView<const uint8_t> packet);
-
-  // Implement SsrcBindingObserver - become notified whenever RSIDs resolve to
-  // an SSRC.
-  void OnSsrcBoundToRsid(const std::string& rsid, uint32_t ssrc) override;
-
-  // TODO(eladalon): Add the ability to resolve RSIDs and inform observers,
-  // like in the RtpDemuxer case, once the relevant standard is finalized.
-
- private:
-  // Records the association SSRCs to sinks.
-  std::multimap<uint32_t, RtcpPacketSinkInterface*> ssrc_sinks_;
-
-  // Records the association RSIDs to sinks.
-  std::multimap<std::string, RtcpPacketSinkInterface*> rsid_sinks_;
-
-  // Sinks which will receive notifications of all incoming RTCP packets.
-  // Additional/removal of sinks is expected to be significantly less frequent
-  // than RTCP message reception; container chosen for iteration performance.
-  std::vector<RtcpPacketSinkInterface*> broadcast_sinks_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_CALL_RTCP_DEMUXER_H_
diff --git a/call/rtcp_demuxer_unittest.cc b/call/rtcp_demuxer_unittest.cc
deleted file mode 100644
index 91adf99..0000000
--- a/call/rtcp_demuxer_unittest.cc
+++ /dev/null
@@ -1,504 +0,0 @@
-/*
- *  Copyright (c) 2017 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/call/rtcp_demuxer.h"
-
-#include <memory>
-#include <set>
-
-#include "webrtc/call/rtcp_packet_sink_interface.h"
-#include "webrtc/common_types.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/bye.h"
-#include "webrtc/rtc_base/arraysize.h"
-#include "webrtc/rtc_base/basictypes.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/ptr_util.h"
-#include "webrtc/test/gmock.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-namespace {
-
-using ::testing::_;
-using ::testing::AtLeast;
-using ::testing::ElementsAreArray;
-using ::testing::InSequence;
-using ::testing::Matcher;
-using ::testing::NiceMock;
-
-class MockRtcpPacketSink : public RtcpPacketSinkInterface {
- public:
-  MOCK_METHOD1(OnRtcpPacket, void(rtc::ArrayView<const uint8_t>));
-};
-
-class RtcpDemuxerTest : public testing::Test {
- protected:
-  ~RtcpDemuxerTest() {
-    for (auto* sink : sinks_to_tear_down_) {
-      demuxer_.RemoveSink(sink);
-    }
-    for (auto* sink : broadcast_sinks_to_tear_down_) {
-      demuxer_.RemoveBroadcastSink(sink);
-    }
-  }
-
-  void AddSsrcSink(uint32_t ssrc, RtcpPacketSinkInterface* sink) {
-    demuxer_.AddSink(ssrc, sink);
-    sinks_to_tear_down_.insert(sink);
-  }
-
-  void AddRsidSink(const std::string& rsid, RtcpPacketSinkInterface* sink) {
-    demuxer_.AddSink(rsid, sink);
-    sinks_to_tear_down_.insert(sink);
-  }
-
-  void RemoveSink(RtcpPacketSinkInterface* sink) {
-    sinks_to_tear_down_.erase(sink);
-    demuxer_.RemoveSink(sink);
-  }
-
-  void AddBroadcastSink(RtcpPacketSinkInterface* sink) {
-    demuxer_.AddBroadcastSink(sink);
-    broadcast_sinks_to_tear_down_.insert(sink);
-  }
-
-  void RemoveBroadcastSink(RtcpPacketSinkInterface* sink) {
-    broadcast_sinks_to_tear_down_.erase(sink);
-    demuxer_.RemoveBroadcastSink(sink);
-  }
-
-  RtcpDemuxer demuxer_;
-  std::set<RtcpPacketSinkInterface*> sinks_to_tear_down_;
-  std::set<RtcpPacketSinkInterface*> broadcast_sinks_to_tear_down_;
-};
-
-// Produces a packet buffer representing an RTCP packet with a given SSRC,
-// as it would look when sent over the wire.
-// |distinguishing_string| allows different RTCP packets with the same SSRC
-// to be distinguished. How this is set into the actual packet is
-// unimportant, and depends on which RTCP message we choose to use.
-rtc::Buffer CreateRtcpPacket(uint32_t ssrc,
-                             const std::string& distinguishing_string = "") {
-  rtcp::Bye packet;
-  packet.SetSenderSsrc(ssrc);
-  if (distinguishing_string != "") {
-    // Actual way we use |distinguishing_string| is unimportant, so long
-    // as it ends up in the packet.
-    packet.SetReason(distinguishing_string);
-  }
-  return packet.Build();
-}
-
-static Matcher<rtc::ArrayView<const uint8_t>> SamePacketAs(
-    const rtc::Buffer& other) {
-  return ElementsAreArray(other.cbegin(), other.cend());
-}
-
-}  // namespace
-
-TEST_F(RtcpDemuxerTest, OnRtcpPacketCalledOnCorrectSinkBySsrc) {
-  constexpr uint32_t ssrcs[] = {101, 202, 303};
-  MockRtcpPacketSink sinks[arraysize(ssrcs)];
-  for (size_t i = 0; i < arraysize(ssrcs); i++) {
-    AddSsrcSink(ssrcs[i], &sinks[i]);
-  }
-
-  for (size_t i = 0; i < arraysize(ssrcs); i++) {
-    auto packet = CreateRtcpPacket(ssrcs[i]);
-    EXPECT_CALL(sinks[i], OnRtcpPacket(SamePacketAs(packet))).Times(1);
-    demuxer_.OnRtcpPacket(packet);
-  }
-}
-
-TEST_F(RtcpDemuxerTest, OnRtcpPacketCalledOnResolvedRsidSink) {
-  // Set up some RSID sinks.
-  const std::string rsids[] = {"a", "b", "c"};
-  MockRtcpPacketSink sinks[arraysize(rsids)];
-  for (size_t i = 0; i < arraysize(rsids); i++) {
-    AddRsidSink(rsids[i], &sinks[i]);
-  }
-
-  // Only resolve one of the sinks.
-  constexpr size_t resolved_sink_index = 0;
-  constexpr uint32_t ssrc = 345;
-  demuxer_.OnSsrcBoundToRsid(rsids[resolved_sink_index], ssrc);
-
-  // The resolved sink gets notifications of RTCP messages with its SSRC.
-  auto packet = CreateRtcpPacket(ssrc);
-  EXPECT_CALL(sinks[resolved_sink_index], OnRtcpPacket(SamePacketAs(packet)))
-      .Times(1);
-
-  // RTCP received; expected calls triggered.
-  demuxer_.OnRtcpPacket(packet);
-}
-
-TEST_F(RtcpDemuxerTest,
-       SingleCallbackAfterResolutionOfAnRsidToAlreadyRegisteredSsrc) {
-  // Associate a sink with an SSRC.
-  MockRtcpPacketSink sink;
-  constexpr uint32_t ssrc = 999;
-  AddSsrcSink(ssrc, &sink);
-
-  // Associate the same sink with an RSID.
-  const std::string rsid = "r";
-  AddRsidSink(rsid, &sink);
-
-  // Resolve the RSID to the aforementioned SSRC.
-  demuxer_.OnSsrcBoundToRsid(rsid, ssrc);
-
-  // OnRtcpPacket still called only a single time for messages with this SSRC.
-  auto packet = CreateRtcpPacket(ssrc);
-  EXPECT_CALL(sink, OnRtcpPacket(SamePacketAs(packet))).Times(1);
-  demuxer_.OnRtcpPacket(packet);
-}
-
-TEST_F(RtcpDemuxerTest,
-       OnRtcpPacketCalledOnAllBroadcastSinksForAllRtcpPackets) {
-  MockRtcpPacketSink sinks[3];
-  for (MockRtcpPacketSink& sink : sinks) {
-    AddBroadcastSink(&sink);
-  }
-
-  constexpr uint32_t ssrc = 747;
-  auto packet = CreateRtcpPacket(ssrc);
-
-  for (MockRtcpPacketSink& sink : sinks) {
-    EXPECT_CALL(sink, OnRtcpPacket(SamePacketAs(packet))).Times(1);
-  }
-
-  // RTCP received; expected calls triggered.
-  demuxer_.OnRtcpPacket(packet);
-}
-
-TEST_F(RtcpDemuxerTest, PacketsDeliveredInRightOrderToNonBroadcastSink) {
-  constexpr uint32_t ssrc = 101;
-  MockRtcpPacketSink sink;
-  AddSsrcSink(ssrc, &sink);
-
-  std::vector<rtc::Buffer> packets;
-  for (size_t i = 0; i < 5; i++) {
-    packets.push_back(CreateRtcpPacket(ssrc, std::to_string(i)));
-  }
-
-  InSequence sequence;
-  for (const auto& packet : packets) {
-    EXPECT_CALL(sink, OnRtcpPacket(SamePacketAs(packet))).Times(1);
-  }
-
-  for (const auto& packet : packets) {
-    demuxer_.OnRtcpPacket(packet);
-  }
-}
-
-TEST_F(RtcpDemuxerTest, PacketsDeliveredInRightOrderToBroadcastSink) {
-  MockRtcpPacketSink sink;
-  AddBroadcastSink(&sink);
-
-  std::vector<rtc::Buffer> packets;
-  for (size_t i = 0; i < 5; i++) {
-    constexpr uint32_t ssrc = 101;
-    packets.push_back(CreateRtcpPacket(ssrc, std::to_string(i)));
-  }
-
-  InSequence sequence;
-  for (const auto& packet : packets) {
-    EXPECT_CALL(sink, OnRtcpPacket(SamePacketAs(packet))).Times(1);
-  }
-
-  for (const auto& packet : packets) {
-    demuxer_.OnRtcpPacket(packet);
-  }
-}
-
-TEST_F(RtcpDemuxerTest, MultipleSinksMappedToSameSsrc) {
-  MockRtcpPacketSink sinks[3];
-  constexpr uint32_t ssrc = 404;
-  for (auto& sink : sinks) {
-    AddSsrcSink(ssrc, &sink);
-  }
-
-  // Reception of an RTCP packet associated with the shared SSRC triggers the
-  // callback on all of the sinks associated with it.
-  auto packet = CreateRtcpPacket(ssrc);
-  for (auto& sink : sinks) {
-    EXPECT_CALL(sink, OnRtcpPacket(SamePacketAs(packet)));
-  }
-
-  demuxer_.OnRtcpPacket(packet);
-}
-
-TEST_F(RtcpDemuxerTest, SinkMappedToMultipleSsrcs) {
-  constexpr uint32_t ssrcs[] = {404, 505, 606};
-  MockRtcpPacketSink sink;
-  for (uint32_t ssrc : ssrcs) {
-    AddSsrcSink(ssrc, &sink);
-  }
-
-  // The sink which is associated with multiple SSRCs gets the callback
-  // triggered for each of those SSRCs.
-  for (uint32_t ssrc : ssrcs) {
-    auto packet = CreateRtcpPacket(ssrc);
-    EXPECT_CALL(sink, OnRtcpPacket(SamePacketAs(packet)));
-    demuxer_.OnRtcpPacket(packet);
-  }
-}
-
-TEST_F(RtcpDemuxerTest, MultipleRsidsOnSameSink) {
-  // Sink associated with multiple sinks.
-  MockRtcpPacketSink sink;
-  const std::string rsids[] = {"a", "b", "c"};
-  for (const auto& rsid : rsids) {
-    AddRsidSink(rsid, &sink);
-  }
-
-  // RSIDs resolved to SSRCs.
-  uint32_t ssrcs[arraysize(rsids)];
-  for (size_t i = 0; i < arraysize(rsids); i++) {
-    ssrcs[i] = 1000 + static_cast<uint32_t>(i);
-    demuxer_.OnSsrcBoundToRsid(rsids[i], ssrcs[i]);
-  }
-
-  // Set up packets to match those RSIDs/SSRCs.
-  std::vector<rtc::Buffer> packets;
-  for (size_t i = 0; i < arraysize(rsids); i++) {
-    packets.push_back(CreateRtcpPacket(ssrcs[i]));
-  }
-
-  // The sink expects to receive all of the packets.
-  for (const auto& packet : packets) {
-    EXPECT_CALL(sink, OnRtcpPacket(SamePacketAs(packet))).Times(1);
-  }
-
-  // Packet demuxed correctly; OnRtcpPacket() triggered on sink.
-  for (const auto& packet : packets) {
-    demuxer_.OnRtcpPacket(packet);
-  }
-}
-
-TEST_F(RtcpDemuxerTest, RsidUsedByMultipleSinks) {
-  MockRtcpPacketSink sinks[3];
-  const std::string shared_rsid = "a";
-
-  for (MockRtcpPacketSink& sink : sinks) {
-    AddRsidSink(shared_rsid, &sink);
-  }
-
-  constexpr uint32_t shared_ssrc = 888;
-  demuxer_.OnSsrcBoundToRsid(shared_rsid, shared_ssrc);
-
-  auto packet = CreateRtcpPacket(shared_ssrc);
-
-  for (MockRtcpPacketSink& sink : sinks) {
-    EXPECT_CALL(sink, OnRtcpPacket(SamePacketAs(packet))).Times(1);
-  }
-
-  demuxer_.OnRtcpPacket(packet);
-}
-
-TEST_F(RtcpDemuxerTest, NoCallbackOnSsrcSinkRemovedBeforeFirstPacket) {
-  constexpr uint32_t ssrc = 404;
-  MockRtcpPacketSink sink;
-  AddSsrcSink(ssrc, &sink);
-
-  RemoveSink(&sink);
-
-  // The removed sink does not get callbacks.
-  auto packet = CreateRtcpPacket(ssrc);
-  EXPECT_CALL(sink, OnRtcpPacket(_)).Times(0);  // Not called.
-  demuxer_.OnRtcpPacket(packet);
-}
-
-TEST_F(RtcpDemuxerTest, NoCallbackOnSsrcSinkRemovedAfterFirstPacket) {
-  constexpr uint32_t ssrc = 404;
-  NiceMock<MockRtcpPacketSink> sink;
-  AddSsrcSink(ssrc, &sink);
-
-  auto before_packet = CreateRtcpPacket(ssrc);
-  demuxer_.OnRtcpPacket(before_packet);
-
-  RemoveSink(&sink);
-
-  // The removed sink does not get callbacks.
-  auto after_packet = CreateRtcpPacket(ssrc);
-  EXPECT_CALL(sink, OnRtcpPacket(_)).Times(0);  // Not called.
-  demuxer_.OnRtcpPacket(after_packet);
-}
-
-TEST_F(RtcpDemuxerTest, NoCallbackOnRsidSinkRemovedBeforeRsidResolution) {
-  const std::string rsid = "a";
-  constexpr uint32_t ssrc = 404;
-  MockRtcpPacketSink sink;
-  AddRsidSink(rsid, &sink);
-
-  // Removal before resolution.
-  RemoveSink(&sink);
-  demuxer_.OnSsrcBoundToRsid(rsid, ssrc);
-
-  // The removed sink does not get callbacks.
-  auto packet = CreateRtcpPacket(ssrc);
-  EXPECT_CALL(sink, OnRtcpPacket(_)).Times(0);  // Not called.
-  demuxer_.OnRtcpPacket(packet);
-}
-
-TEST_F(RtcpDemuxerTest, NoCallbackOnRsidSinkRemovedAfterRsidResolution) {
-  const std::string rsid = "a";
-  constexpr uint32_t ssrc = 404;
-  MockRtcpPacketSink sink;
-  AddRsidSink(rsid, &sink);
-
-  // Removal after resolution.
-  demuxer_.OnSsrcBoundToRsid(rsid, ssrc);
-  RemoveSink(&sink);
-
-  // The removed sink does not get callbacks.
-  auto packet = CreateRtcpPacket(ssrc);
-  EXPECT_CALL(sink, OnRtcpPacket(_)).Times(0);  // Not called.
-  demuxer_.OnRtcpPacket(packet);
-}
-
-TEST_F(RtcpDemuxerTest, NoCallbackOnBroadcastSinkRemovedBeforeFirstPacket) {
-  MockRtcpPacketSink sink;
-  AddBroadcastSink(&sink);
-
-  RemoveBroadcastSink(&sink);
-
-  // The removed sink does not get callbacks.
-  constexpr uint32_t ssrc = 404;
-  auto packet = CreateRtcpPacket(ssrc);
-  EXPECT_CALL(sink, OnRtcpPacket(_)).Times(0);  // Not called.
-  demuxer_.OnRtcpPacket(packet);
-}
-
-TEST_F(RtcpDemuxerTest, NoCallbackOnBroadcastSinkRemovedAfterFirstPacket) {
-  NiceMock<MockRtcpPacketSink> sink;
-  AddBroadcastSink(&sink);
-
-  constexpr uint32_t ssrc = 404;
-  auto before_packet = CreateRtcpPacket(ssrc);
-  demuxer_.OnRtcpPacket(before_packet);
-
-  RemoveBroadcastSink(&sink);
-
-  // The removed sink does not get callbacks.
-  auto after_packet = CreateRtcpPacket(ssrc);
-  EXPECT_CALL(sink, OnRtcpPacket(_)).Times(0);  // Not called.
-  demuxer_.OnRtcpPacket(after_packet);
-}
-
-// The RSID to SSRC mapping should be one-to-one. If we end up receiving
-// two (or more) packets with the same SSRC, but different RSIDs, we guarantee
-// remembering the first one; no guarantees are made about further associations.
-TEST_F(RtcpDemuxerTest, FirstResolutionOfRsidNotForgotten) {
-  MockRtcpPacketSink sink;
-  const std::string rsid = "a";
-  AddRsidSink(rsid, &sink);
-
-  constexpr uint32_t ssrc_a = 111;  // First resolution - guaranteed effective.
-  demuxer_.OnSsrcBoundToRsid(rsid, ssrc_a);
-
-  constexpr uint32_t ssrc_b = 222;  // Second resolution - no guarantees.
-  demuxer_.OnSsrcBoundToRsid(rsid, ssrc_b);
-
-  auto packet_a = CreateRtcpPacket(ssrc_a);
-  EXPECT_CALL(sink, OnRtcpPacket(SamePacketAs(packet_a))).Times(1);
-  demuxer_.OnRtcpPacket(packet_a);
-
-  auto packet_b = CreateRtcpPacket(ssrc_b);
-  EXPECT_CALL(sink, OnRtcpPacket(SamePacketAs(packet_b))).Times(AtLeast(0));
-  demuxer_.OnRtcpPacket(packet_b);
-}
-
-#if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
-
-TEST_F(RtcpDemuxerTest, RepeatedSsrcToSinkAssociationsDisallowed) {
-  MockRtcpPacketSink sink;
-
-  constexpr uint32_t ssrc = 101;
-  AddSsrcSink(ssrc, &sink);
-  EXPECT_DEATH(AddSsrcSink(ssrc, &sink), "");
-}
-
-TEST_F(RtcpDemuxerTest, RepeatedRsidToSinkAssociationsDisallowed) {
-  MockRtcpPacketSink sink;
-
-  const std::string rsid = "z";
-  AddRsidSink(rsid, &sink);
-  EXPECT_DEATH(AddRsidSink(rsid, &sink), "");
-}
-
-TEST_F(RtcpDemuxerTest, RepeatedBroadcastSinkRegistrationDisallowed) {
-  MockRtcpPacketSink sink;
-
-  AddBroadcastSink(&sink);
-  EXPECT_DEATH(AddBroadcastSink(&sink), "");
-}
-
-TEST_F(RtcpDemuxerTest, SsrcSinkCannotAlsoBeRegisteredAsBroadcast) {
-  MockRtcpPacketSink sink;
-
-  constexpr uint32_t ssrc = 101;
-  AddSsrcSink(ssrc, &sink);
-  EXPECT_DEATH(AddBroadcastSink(&sink), "");
-}
-
-TEST_F(RtcpDemuxerTest, RsidSinkCannotAlsoBeRegisteredAsBroadcast) {
-  MockRtcpPacketSink sink;
-
-  const std::string rsid = "z";
-  AddRsidSink(rsid, &sink);
-  EXPECT_DEATH(AddBroadcastSink(&sink), "");
-}
-
-TEST_F(RtcpDemuxerTest, BroadcastSinkCannotAlsoBeRegisteredAsSsrcSink) {
-  MockRtcpPacketSink sink;
-
-  AddBroadcastSink(&sink);
-  constexpr uint32_t ssrc = 101;
-  EXPECT_DEATH(AddSsrcSink(ssrc, &sink), "");
-}
-
-TEST_F(RtcpDemuxerTest, BroadcastSinkCannotAlsoBeRegisteredAsRsidSink) {
-  MockRtcpPacketSink sink;
-
-  AddBroadcastSink(&sink);
-  const std::string rsid = "j";
-  EXPECT_DEATH(AddRsidSink(rsid, &sink), "");
-}
-
-TEST_F(RtcpDemuxerTest, MayNotCallRemoveSinkOnNeverAddedSink) {
-  MockRtcpPacketSink sink;
-  EXPECT_DEATH(RemoveSink(&sink), "");
-}
-
-TEST_F(RtcpDemuxerTest, MayNotCallRemoveBroadcastSinkOnNeverAddedSink) {
-  MockRtcpPacketSink sink;
-  EXPECT_DEATH(RemoveBroadcastSink(&sink), "");
-}
-
-TEST_F(RtcpDemuxerTest, RsidMustBeNonEmpty) {
-  MockRtcpPacketSink sink;
-  EXPECT_DEATH(AddRsidSink("", &sink), "");
-}
-
-TEST_F(RtcpDemuxerTest, RsidMustBeAlphaNumeric) {
-  MockRtcpPacketSink sink;
-  EXPECT_DEATH(AddRsidSink("a_3", &sink), "");
-}
-
-TEST_F(RtcpDemuxerTest, RsidMustNotExceedMaximumLength) {
-  MockRtcpPacketSink sink;
-  std::string rsid(StreamId::kMaxSize + 1, 'a');
-  EXPECT_DEATH(AddRsidSink(rsid, &sink), "");
-}
-
-#endif
-
-}  // namespace webrtc
diff --git a/call/rtcp_packet_sink_interface.h b/call/rtcp_packet_sink_interface.h
deleted file mode 100644
index 22a404d..0000000
--- a/call/rtcp_packet_sink_interface.h
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- *  Copyright (c) 2017 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_CALL_RTCP_PACKET_SINK_INTERFACE_H_
-#define WEBRTC_CALL_RTCP_PACKET_SINK_INTERFACE_H_
-
-#include "webrtc/api/array_view.h"
-
-namespace webrtc {
-
-// This class represents a receiver of unparsed RTCP packets.
-// TODO(eladalon): Replace this by demuxing over parsed rather than raw data.
-// Whether this should be over an entire RTCP packet, or over RTCP blocks,
-// is still under discussion.
-class RtcpPacketSinkInterface {
- public:
-  virtual ~RtcpPacketSinkInterface() = default;
-  virtual void OnRtcpPacket(rtc::ArrayView<const uint8_t> packet) = 0;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_CALL_RTCP_PACKET_SINK_INTERFACE_H_
diff --git a/call/rtp_config.cc b/call/rtp_config.cc
deleted file mode 100644
index dc3ea21..0000000
--- a/call/rtp_config.cc
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- *  Copyright (c) 2017 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/call/rtp_config.h"
-
-#include <sstream>
-
-namespace webrtc {
-
-std::string NackConfig::ToString() const {
-  std::stringstream ss;
-  ss << "{rtp_history_ms: " << rtp_history_ms;
-  ss << '}';
-  return ss.str();
-}
-
-std::string UlpfecConfig::ToString() const {
-  std::stringstream ss;
-  ss << "{ulpfec_payload_type: " << ulpfec_payload_type;
-  ss << ", red_payload_type: " << red_payload_type;
-  ss << ", red_rtx_payload_type: " << red_rtx_payload_type;
-  ss << '}';
-  return ss.str();
-}
-
-bool UlpfecConfig::operator==(const UlpfecConfig& other) const {
-  return ulpfec_payload_type == other.ulpfec_payload_type &&
-         red_payload_type == other.red_payload_type &&
-         red_rtx_payload_type == other.red_rtx_payload_type;
-}
-}  // namespace webrtc
diff --git a/call/rtp_config.h b/call/rtp_config.h
deleted file mode 100644
index f33103d..0000000
--- a/call/rtp_config.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- *  Copyright (c) 2017 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_CALL_RTP_CONFIG_H_
-#define WEBRTC_CALL_RTP_CONFIG_H_
-
-#include <string>
-
-namespace webrtc {
-// Settings for NACK, see RFC 4585 for details.
-struct NackConfig {
-  NackConfig() : rtp_history_ms(0) {}
-  std::string ToString() const;
-  // Send side: the time RTP packets are stored for retransmissions.
-  // Receive side: the time the receiver is prepared to wait for
-  // retransmissions.
-  // Set to '0' to disable.
-  int rtp_history_ms;
-};
-
-// Settings for ULPFEC forward error correction.
-// Set the payload types to '-1' to disable.
-struct UlpfecConfig {
-  UlpfecConfig()
-      : ulpfec_payload_type(-1),
-        red_payload_type(-1),
-        red_rtx_payload_type(-1) {}
-  std::string ToString() const;
-  bool operator==(const UlpfecConfig& other) const;
-
-  // Payload type used for ULPFEC packets.
-  int ulpfec_payload_type;
-
-  // Payload type used for RED packets.
-  int red_payload_type;
-
-  // RTX payload type for RED payload.
-  int red_rtx_payload_type;
-};
-}  // namespace webrtc
-#endif  // WEBRTC_CALL_RTP_CONFIG_H_
diff --git a/call/rtp_demuxer.cc b/call/rtp_demuxer.cc
deleted file mode 100644
index 1939a0f..0000000
--- a/call/rtp_demuxer.cc
+++ /dev/null
@@ -1,377 +0,0 @@
-/*
- *  Copyright (c) 2017 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/call/rtp_demuxer.h"
-
-#include "webrtc/call/rtp_packet_sink_interface.h"
-#include "webrtc/call/rtp_rtcp_demuxer_helper.h"
-#include "webrtc/call/ssrc_binding_observer.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_header_extensions.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_packet_received.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-
-namespace webrtc {
-
-RtpDemuxerCriteria::RtpDemuxerCriteria() = default;
-RtpDemuxerCriteria::~RtpDemuxerCriteria() = default;
-
-RtpDemuxer::RtpDemuxer() = default;
-
-RtpDemuxer::~RtpDemuxer() {
-  RTC_DCHECK(sink_by_mid_.empty());
-  RTC_DCHECK(sink_by_ssrc_.empty());
-  RTC_DCHECK(sinks_by_pt_.empty());
-  RTC_DCHECK(sink_by_mid_and_rsid_.empty());
-  RTC_DCHECK(sink_by_rsid_.empty());
-  RTC_DCHECK(ssrc_binding_observers_.empty());
-}
-
-bool RtpDemuxer::AddSink(const RtpDemuxerCriteria& criteria,
-                         RtpPacketSinkInterface* sink) {
-  RTC_DCHECK(!criteria.payload_types.empty() || !criteria.ssrcs.empty() ||
-             !criteria.mid.empty() || !criteria.rsid.empty());
-  RTC_DCHECK(criteria.mid.empty() || Mid::IsLegalName(criteria.mid));
-  RTC_DCHECK(criteria.rsid.empty() || StreamId::IsLegalName(criteria.rsid));
-  RTC_DCHECK(sink);
-
-  // We return false instead of DCHECKing for logical conflicts with the new
-  // criteria because new sinks are created according to user-specified SDP and
-  // we do not want to crash due to a data validation error.
-  if (CriteriaWouldConflict(criteria)) {
-    return false;
-  }
-
-  if (!criteria.mid.empty()) {
-    if (criteria.rsid.empty()) {
-      sink_by_mid_.emplace(criteria.mid, sink);
-    } else {
-      sink_by_mid_and_rsid_.emplace(std::make_pair(criteria.mid, criteria.rsid),
-                                    sink);
-    }
-  } else {
-    if (!criteria.rsid.empty()) {
-      sink_by_rsid_.emplace(criteria.rsid, sink);
-    }
-  }
-
-  for (uint32_t ssrc : criteria.ssrcs) {
-    sink_by_ssrc_.emplace(ssrc, sink);
-  }
-
-  for (uint8_t payload_type : criteria.payload_types) {
-    sinks_by_pt_.emplace(payload_type, sink);
-  }
-
-  RefreshKnownMids();
-
-  return true;
-}
-
-bool RtpDemuxer::CriteriaWouldConflict(
-    const RtpDemuxerCriteria& criteria) const {
-  if (!criteria.mid.empty()) {
-    if (criteria.rsid.empty()) {
-      // If the MID is in the known_mids_ set, then there is already a sink
-      // added for this MID directly, or there is a sink already added with a
-      // MID, RSID pair for our MID and some RSID.
-      // Adding this criteria would cause one of these rules to be shadowed, so
-      // reject this new criteria.
-      if (known_mids_.find(criteria.mid) != known_mids_.end()) {
-        return true;
-      }
-    } else {
-      // If the exact rule already exists, then reject this duplicate.
-      if (sink_by_mid_and_rsid_.find(std::make_pair(
-              criteria.mid, criteria.rsid)) != sink_by_mid_and_rsid_.end()) {
-        return true;
-      }
-      // If there is already a sink registered for the bare MID, then this
-      // criteria will never receive any packets because they will just be
-      // directed to that MID sink, so reject this new criteria.
-      if (sink_by_mid_.find(criteria.mid) != sink_by_mid_.end()) {
-        return true;
-      }
-    }
-  }
-
-  for (uint32_t ssrc : criteria.ssrcs) {
-    if (sink_by_ssrc_.find(ssrc) != sink_by_ssrc_.end()) {
-      return true;
-    }
-  }
-
-  // TODO(steveanton): May also sanity check payload types.
-
-  return false;
-}
-
-void RtpDemuxer::RefreshKnownMids() {
-  known_mids_.clear();
-
-  for (auto const& item : sink_by_mid_) {
-    const std::string& mid = item.first;
-    known_mids_.insert(mid);
-  }
-
-  for (auto const& item : sink_by_mid_and_rsid_) {
-    const std::string& mid = item.first.first;
-    known_mids_.insert(mid);
-  }
-}
-
-bool RtpDemuxer::AddSink(uint32_t ssrc, RtpPacketSinkInterface* sink) {
-  RtpDemuxerCriteria criteria;
-  criteria.ssrcs.insert(ssrc);
-  return AddSink(criteria, sink);
-}
-
-void RtpDemuxer::AddSink(const std::string& rsid,
-                         RtpPacketSinkInterface* sink) {
-  RtpDemuxerCriteria criteria;
-  criteria.rsid = rsid;
-  AddSink(criteria, sink);
-}
-
-bool RtpDemuxer::RemoveSink(const RtpPacketSinkInterface* sink) {
-  RTC_DCHECK(sink);
-  size_t num_removed = RemoveFromMapByValue(&sink_by_mid_, sink) +
-                       RemoveFromMapByValue(&sink_by_ssrc_, sink) +
-                       RemoveFromMultimapByValue(&sinks_by_pt_, sink) +
-                       RemoveFromMapByValue(&sink_by_mid_and_rsid_, sink) +
-                       RemoveFromMapByValue(&sink_by_rsid_, sink);
-  RefreshKnownMids();
-  return num_removed > 0;
-}
-
-bool RtpDemuxer::OnRtpPacket(const RtpPacketReceived& packet) {
-  RtpPacketSinkInterface* sink = ResolveSink(packet);
-  if (sink != nullptr) {
-    sink->OnRtpPacket(packet);
-    return true;
-  }
-  return false;
-}
-
-RtpPacketSinkInterface* RtpDemuxer::ResolveSink(
-    const RtpPacketReceived& packet) {
-  // See the BUNDLE spec for high level reference to this algorithm:
-  // https://tools.ietf.org/html/draft-ietf-mmusic-sdp-bundle-negotiation-38#section-10.2
-
-  // RSID and RRID are routed to the same sinks. If an RSID is specified on a
-  // repair packet, it should be ignored and the RRID should be used.
-  std::string packet_mid, packet_rsid;
-  bool has_mid = packet.GetExtension<RtpMid>(&packet_mid);
-  bool has_rsid = packet.GetExtension<RepairedRtpStreamId>(&packet_rsid);
-  if (!has_rsid) {
-    has_rsid = packet.GetExtension<RtpStreamId>(&packet_rsid);
-  }
-  uint32_t ssrc = packet.Ssrc();
-
-  // The BUNDLE spec says to drop any packets with unknown MIDs, even if the
-  // SSRC is known/latched.
-  if (has_mid && known_mids_.find(packet_mid) == known_mids_.end()) {
-    return nullptr;
-  }
-
-  // Cache information we learn about SSRCs and IDs. We need to do this even if
-  // there isn't a rule/sink yet because we might add an MID/RSID rule after
-  // learning an MID/RSID<->SSRC association.
-
-  std::string* mid = nullptr;
-  if (has_mid) {
-    mid_by_ssrc_[ssrc] = packet_mid;
-    mid = &packet_mid;
-  } else {
-    // If the packet does not include a MID header extension, check if there is
-    // a latched MID for the SSRC.
-    const auto it = mid_by_ssrc_.find(ssrc);
-    if (it != mid_by_ssrc_.end()) {
-      mid = &it->second;
-    }
-  }
-
-  std::string* rsid = nullptr;
-  if (has_rsid) {
-    rsid_by_ssrc_[ssrc] = packet_rsid;
-    rsid = &packet_rsid;
-  } else {
-    // If the packet does not include an RRID/RSID header extension, check if
-    // there is a latched RSID for the SSRC.
-    const auto it = rsid_by_ssrc_.find(ssrc);
-    if (it != rsid_by_ssrc_.end()) {
-      rsid = &it->second;
-    }
-  }
-
-  // If MID and/or RSID is specified, prioritize that for demuxing the packet.
-  // The motivation behind the BUNDLE algorithm is that we trust these are used
-  // deliberately by senders and are more likely to be correct than SSRC/payload
-  // type which are included with every packet.
-  // TODO(steveanton): According to the BUNDLE spec, new SSRC mappings are only
-  //                   accepted if the packet's extended sequence number is
-  //                   greater than that of the last SSRC mapping update.
-  //                   https://tools.ietf.org/html/rfc7941#section-4.2.6
-  if (mid != nullptr) {
-    RtpPacketSinkInterface* sink_by_mid = ResolveSinkByMid(*mid, ssrc);
-    if (sink_by_mid != nullptr) {
-      return sink_by_mid;
-    }
-
-    // RSID is scoped to a given MID if both are included.
-    if (rsid != nullptr) {
-      RtpPacketSinkInterface* sink_by_mid_rsid =
-          ResolveSinkByMidRsid(*mid, *rsid, ssrc);
-      if (sink_by_mid_rsid != nullptr) {
-        return sink_by_mid_rsid;
-      }
-    }
-
-    // At this point, there is at least one sink added for this MID and an RSID
-    // but either the packet does not have an RSID or it is for a different
-    // RSID. This falls outside the BUNDLE spec so drop the packet.
-    return nullptr;
-  }
-
-  // RSID can be used without MID as long as they are unique.
-  if (rsid != nullptr) {
-    RtpPacketSinkInterface* sink_by_rsid = ResolveSinkByRsid(*rsid, ssrc);
-    if (sink_by_rsid != nullptr) {
-      return sink_by_rsid;
-    }
-  }
-
-  // We trust signaled SSRC more than payload type which is likely to conflict
-  // between streams.
-  const auto ssrc_sink_it = sink_by_ssrc_.find(ssrc);
-  if (ssrc_sink_it != sink_by_ssrc_.end()) {
-    return ssrc_sink_it->second;
-  }
-
-  // Legacy senders will only signal payload type, support that as last resort.
-  return ResolveSinkByPayloadType(packet.PayloadType(), ssrc);
-}
-
-RtpPacketSinkInterface* RtpDemuxer::ResolveSinkByMid(const std::string& mid,
-                                                     uint32_t ssrc) {
-  const auto it = sink_by_mid_.find(mid);
-  if (it != sink_by_mid_.end()) {
-    RtpPacketSinkInterface* sink = it->second;
-    bool notify = AddSsrcSinkBinding(ssrc, sink);
-    if (notify) {
-      for (auto* observer : ssrc_binding_observers_) {
-        observer->OnSsrcBoundToMid(mid, ssrc);
-      }
-    }
-    return sink;
-  }
-  return nullptr;
-}
-
-RtpPacketSinkInterface* RtpDemuxer::ResolveSinkByMidRsid(
-    const std::string& mid,
-    const std::string& rsid,
-    uint32_t ssrc) {
-  const auto it = sink_by_mid_and_rsid_.find(std::make_pair(mid, rsid));
-  if (it != sink_by_mid_and_rsid_.end()) {
-    RtpPacketSinkInterface* sink = it->second;
-    bool notify = AddSsrcSinkBinding(ssrc, sink);
-    if (notify) {
-      for (auto* observer : ssrc_binding_observers_) {
-        observer->OnSsrcBoundToMidRsid(mid, rsid, ssrc);
-      }
-    }
-    return sink;
-  }
-  return nullptr;
-}
-void RtpDemuxer::RegisterRsidResolutionObserver(SsrcBindingObserver* observer) {
-  RegisterSsrcBindingObserver(observer);
-}
-
-RtpPacketSinkInterface* RtpDemuxer::ResolveSinkByRsid(const std::string& rsid,
-                                                      uint32_t ssrc) {
-  const auto it = sink_by_rsid_.find(rsid);
-  if (it != sink_by_rsid_.end()) {
-    RtpPacketSinkInterface* sink = it->second;
-    bool notify = AddSsrcSinkBinding(ssrc, sink);
-    if (notify) {
-      for (auto* observer : ssrc_binding_observers_) {
-        observer->OnSsrcBoundToRsid(rsid, ssrc);
-      }
-    }
-    return sink;
-  }
-  return nullptr;
-}
-void RtpDemuxer::DeregisterRsidResolutionObserver(
-    const SsrcBindingObserver* observer) {
-  DeregisterSsrcBindingObserver(observer);
-}
-
-RtpPacketSinkInterface* RtpDemuxer::ResolveSinkByPayloadType(
-    uint8_t payload_type,
-    uint32_t ssrc) {
-  const auto range = sinks_by_pt_.equal_range(payload_type);
-  if (range.first != range.second) {
-    auto it = range.first;
-    const auto end = range.second;
-    if (std::next(it) == end) {
-      RtpPacketSinkInterface* sink = it->second;
-      bool notify = AddSsrcSinkBinding(ssrc, sink);
-      if (notify) {
-        for (auto* observer : ssrc_binding_observers_) {
-          observer->OnSsrcBoundToPayloadType(payload_type, ssrc);
-        }
-      }
-      return sink;
-    }
-  }
-  return nullptr;
-}
-
-bool RtpDemuxer::AddSsrcSinkBinding(uint32_t ssrc,
-                                    RtpPacketSinkInterface* sink) {
-  if (sink_by_ssrc_.size() >= kMaxSsrcBindings) {
-    LOG(LS_WARNING) << "New SSRC=" << ssrc << " sink binding ignored; limit of"
-                    << kMaxSsrcBindings << " bindings has been reached.";
-    return false;
-  }
-
-  auto result = sink_by_ssrc_.emplace(ssrc, sink);
-  auto it = result.first;
-  bool inserted = result.second;
-  if (inserted) {
-    return true;
-  }
-  if (it->second != sink) {
-    it->second = sink;
-    return true;
-  }
-  return false;
-}
-
-void RtpDemuxer::RegisterSsrcBindingObserver(SsrcBindingObserver* observer) {
-  RTC_DCHECK(observer);
-  RTC_DCHECK(!ContainerHasKey(ssrc_binding_observers_, observer));
-
-  ssrc_binding_observers_.push_back(observer);
-}
-
-void RtpDemuxer::DeregisterSsrcBindingObserver(
-    const SsrcBindingObserver* observer) {
-  RTC_DCHECK(observer);
-  auto it = std::find(ssrc_binding_observers_.begin(),
-                      ssrc_binding_observers_.end(), observer);
-  RTC_DCHECK(it != ssrc_binding_observers_.end());
-  ssrc_binding_observers_.erase(it);
-}
-
-}  // namespace webrtc
diff --git a/call/rtp_demuxer.h b/call/rtp_demuxer.h
deleted file mode 100644
index ddd4a2f..0000000
--- a/call/rtp_demuxer.h
+++ /dev/null
@@ -1,204 +0,0 @@
-/*
- *  Copyright (c) 2017 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_CALL_RTP_DEMUXER_H_
-#define WEBRTC_CALL_RTP_DEMUXER_H_
-
-#include <map>
-#include <set>
-#include <string>
-#include <utility>
-#include <vector>
-
-namespace webrtc {
-
-class RtpPacketReceived;
-class RtpPacketSinkInterface;
-class SsrcBindingObserver;
-
-// This struct describes the criteria that will be used to match packets to a
-// specific sink.
-struct RtpDemuxerCriteria {
-  RtpDemuxerCriteria();
-  ~RtpDemuxerCriteria();
-
-  // If not the empty string, will match packets with this MID.
-  std::string mid;
-
-  // If not the empty string, will match packets with this as their RTP stream
-  // ID or repaired RTP stream ID.
-  // Note that if both MID and RSID are specified, this will only match packets
-  // that have both specified (either through RTP header extensions, SSRC
-  // latching or RTCP).
-  std::string rsid;
-
-  // Will match packets with any of these SSRCs.
-  std::set<uint32_t> ssrcs;
-
-  // Will match packets with any of these payload types.
-  std::set<uint8_t> payload_types;
-};
-
-// This class represents the RTP demuxing, for a single RTP session (i.e., one
-// SSRC space, see RFC 7656). It isn't thread aware, leaving responsibility of
-// multithreading issues to the user of this class.
-// The demuxing algorithm follows the sketch given in the BUNDLE draft:
-// https://tools.ietf.org/html/draft-ietf-mmusic-sdp-bundle-negotiation-38#section-10.2
-// with modifications to support RTP stream IDs also.
-//
-// When a packet is received, the RtpDemuxer will route according to the
-// following rules:
-// 1. If the packet contains the MID header extension, and no sink has been
-//    added with that MID as a criteria, the packet is not routed.
-// 2. If the packet has the MID header extension, but no RSID or RRID extension,
-//    and the MID is bound to a sink, then bind its SSRC to the same sink and
-//    forward the packet to that sink. Note that rebinding to the same sink is
-//    not an error. (Later packets with that SSRC would therefore be forwarded
-//    to the same sink, whether they have the MID header extension or not.)
-// 3. If the packet has the MID header extension and either the RSID or RRID
-//    extension, and the MID, RSID (or RRID) pair is bound to a sink, then bind
-//    its SSRC to the same sink and forward the packet to that sink. Later
-//    packets with that SSRC will be forwarded to the same sink.
-// 4. If the packet has the RSID or RRID header extension, but no MID extension,
-//    and the RSID or RRID is bound to an RSID sink, then bind its SSRC to the
-//    same sink and forward the packet to that sink. Later packets with that
-//    SSRC will be forwarded to the same sink.
-// 5. If the packet's SSRC is bound to an SSRC through a previous call to
-//    AddSink, then forward the packet to that sink. Note that the RtpDemuxer
-//    will not verify the payload type even if included in the sink's criteria.
-//    The sink is expected to do the check in its handler.
-// 6. If the packet's payload type is bound to exactly one payload type sink
-//    through an earlier call to AddSink, then forward the packet to that sink.
-// 7. Otherwise, the packet is not routed.
-//
-// In summary, the routing algorithm will always try to first match MID and RSID
-// (including through SSRC binding), match SSRC directly as needed, and use
-// payload types only if all else fails.
-class RtpDemuxer {
- public:
-  // Maximum number of unique SSRC bindings allowed. This limit is to prevent
-  // memory overuse attacks due to a malicious peer sending many packets with
-  // different SSRCs.
-  static constexpr int kMaxSsrcBindings = 1000;
-
-  RtpDemuxer();
-  ~RtpDemuxer();
-
-  RtpDemuxer(const RtpDemuxer&) = delete;
-  void operator=(const RtpDemuxer&) = delete;
-
-  // Registers a sink that will be notified when RTP packets match its given
-  // criteria according to the algorithm described in the class description.
-  // Returns true if the sink was successfully added.
-  // Returns false in the following situations:
-  // - Only MID is specified and the MID is already registered.
-  // - Only RSID is specified and the RSID is already registered.
-  // - Both MID and RSID is specified and the (MID, RSID) pair is already
-  //   registered.
-  // - Any of the criteria SSRCs are already registered.
-  // If false is returned, no changes are made to the demuxer state.
-  bool AddSink(const RtpDemuxerCriteria& criteria,
-               RtpPacketSinkInterface* sink);
-
-  // Registers a sink. Multiple SSRCs may be mapped to the same sink, but
-  // each SSRC may only be mapped to one sink. The return value reports
-  // whether the association has been recorded or rejected. Rejection may occur
-  // if the SSRC has already been associated with a sink. The previously added
-  // sink is *not* forgotten.
-  bool AddSink(uint32_t ssrc, RtpPacketSinkInterface* sink);
-
-  // Registers a sink's association to an RSID. Only one sink may be associated
-  // with a given RSID. Null pointer is not allowed.
-  void AddSink(const std::string& rsid, RtpPacketSinkInterface* sink);
-
-  // Removes a sink. Return value reports if anything was actually removed.
-  // Null pointer is not allowed.
-  bool RemoveSink(const RtpPacketSinkInterface* sink);
-
-  // Demuxes the given packet and forwards it to the chosen sink. Returns true
-  // if the packet was forwarded and false if the packet was dropped.
-  bool OnRtpPacket(const RtpPacketReceived& packet);
-
-  // The Observer will be notified when an attribute (e.g., RSID, MID, etc.) is
-  // bound to an SSRC.
-  void RegisterSsrcBindingObserver(SsrcBindingObserver* observer);
-  // Deprecated: Use the above method.
-  void RegisterRsidResolutionObserver(SsrcBindingObserver* observer);
-
-  // Undo a previous RegisterSsrcBindingObserver().
-  void DeregisterSsrcBindingObserver(const SsrcBindingObserver* observer);
-  // Deprecated: Use the above method.
-  void DeregisterRsidResolutionObserver(const SsrcBindingObserver* observer);
-
- private:
-  // Returns true if adding a sink with the given criteria would cause conflicts
-  // with the existing criteria and should be rejected.
-  bool CriteriaWouldConflict(const RtpDemuxerCriteria& criteria) const;
-
-  // Runs the demux algorithm on the given packet and returns the sink that
-  // should receive the packet.
-  // Will record any SSRC<->ID associations along the way.
-  // If the packet should be dropped, this method returns null.
-  RtpPacketSinkInterface* ResolveSink(const RtpPacketReceived& packet);
-
-  // Used by the ResolveSink algorithm.
-  RtpPacketSinkInterface* ResolveSinkByMid(const std::string& mid,
-                                           uint32_t ssrc);
-  RtpPacketSinkInterface* ResolveSinkByMidRsid(const std::string& mid,
-                                               const std::string& rsid,
-                                               uint32_t ssrc);
-  RtpPacketSinkInterface* ResolveSinkByRsid(const std::string& rsid,
-                                            uint32_t ssrc);
-  RtpPacketSinkInterface* ResolveSinkByPayloadType(uint8_t payload_type,
-                                                   uint32_t ssrc);
-
-  // Regenerate the known_mids_ set from information in the sink_by_mid_ and
-  // sink_by_mid_and_rsid_ maps.
-  void RefreshKnownMids();
-
-  // Map each sink by its component attributes to facilitate quick lookups.
-  // Payload Type mapping is a multimap because if two sinks register for the
-  // same payload type, both AddSinks succeed but we must know not to demux on
-  // that attribute since it is ambiguous.
-  // Note: Mappings are only modified by AddSink/RemoveSink (except for
-  // SSRC mapping which receives all MID, payload type, or RSID to SSRC bindings
-  // discovered when demuxing packets).
-  std::map<std::string, RtpPacketSinkInterface*> sink_by_mid_;
-  std::map<uint32_t, RtpPacketSinkInterface*> sink_by_ssrc_;
-  std::multimap<uint8_t, RtpPacketSinkInterface*> sinks_by_pt_;
-  std::map<std::pair<std::string, std::string>, RtpPacketSinkInterface*>
-      sink_by_mid_and_rsid_;
-  std::map<std::string, RtpPacketSinkInterface*> sink_by_rsid_;
-
-  // Tracks all the MIDs that have been identified in added criteria. Used to
-  // determine if a packet should be dropped right away because the MID is
-  // unknown.
-  std::set<std::string> known_mids_;
-
-  // Records learned mappings of MID --> SSRC and RSID --> SSRC as packets are
-  // received.
-  // This is stored separately from the sink mappings because if a sink is
-  // removed we want to still remember these associations.
-  std::map<uint32_t, std::string> mid_by_ssrc_;
-  std::map<uint32_t, std::string> rsid_by_ssrc_;
-
-  // Adds a binding from the SSRC to the given sink. Returns true if there was
-  // not already a sink bound to the SSRC or if the sink replaced a different
-  // sink. Returns false if the binding was unchanged.
-  bool AddSsrcSinkBinding(uint32_t ssrc, RtpPacketSinkInterface* sink);
-
-  // Observers which will be notified when an RSID association to an SSRC is
-  // resolved by this object.
-  std::vector<SsrcBindingObserver*> ssrc_binding_observers_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_CALL_RTP_DEMUXER_H_
diff --git a/call/rtp_demuxer_unittest.cc b/call/rtp_demuxer_unittest.cc
deleted file mode 100644
index 6fe5fc8..0000000
--- a/call/rtp_demuxer_unittest.cc
+++ /dev/null
@@ -1,1527 +0,0 @@
-/*
- *  Copyright (c) 2017 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/call/rtp_demuxer.h"
-
-#include <memory>
-#include <set>
-#include <string>
-
-#include "webrtc/call/ssrc_binding_observer.h"
-#include "webrtc/call/test/mock_rtp_packet_sink_interface.h"
-#include "webrtc/common_types.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_header_extension_map.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_header_extensions.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_packet_received.h"
-#include "webrtc/rtc_base/arraysize.h"
-#include "webrtc/rtc_base/basictypes.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/ptr_util.h"
-#include "webrtc/rtc_base/safe_conversions.h"
-#include "webrtc/test/gmock.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-namespace {
-
-using ::testing::_;
-using ::testing::AtLeast;
-using ::testing::AtMost;
-using ::testing::InSequence;
-using ::testing::NiceMock;
-
-class MockSsrcBindingObserver : public SsrcBindingObserver {
- public:
-  MOCK_METHOD2(OnSsrcBoundToRsid, void(const std::string& rsid, uint32_t ssrc));
-  MOCK_METHOD2(OnSsrcBoundToMid, void(const std::string& mid, uint32_t ssrc));
-  MOCK_METHOD3(OnSsrcBoundToMidRsid,
-               void(const std::string& mid,
-                    const std::string& rsid,
-                    uint32_t ssrc));
-  MOCK_METHOD2(OnSsrcBoundToPayloadType,
-               void(uint8_t payload_type, uint32_t ssrc));
-};
-
-class RtpDemuxerTest : public testing::Test {
- protected:
-  ~RtpDemuxerTest() {
-    for (auto* sink : sinks_to_tear_down_) {
-      demuxer_.RemoveSink(sink);
-    }
-    for (auto* observer : observers_to_tear_down_) {
-      demuxer_.DeregisterSsrcBindingObserver(observer);
-    }
-  }
-
-  // These are convenience methods for calling demuxer.AddSink with different
-  // parameters and will ensure that the sink is automatically removed when the
-  // test case finishes.
-
-  bool AddSink(const RtpDemuxerCriteria& criteria,
-               RtpPacketSinkInterface* sink) {
-    bool added = demuxer_.AddSink(criteria, sink);
-    if (added) {
-      sinks_to_tear_down_.insert(sink);
-    }
-    return added;
-  }
-
-  bool AddSinkOnlySsrc(uint32_t ssrc, RtpPacketSinkInterface* sink) {
-    RtpDemuxerCriteria criteria;
-    criteria.ssrcs = {ssrc};
-    return AddSink(criteria, sink);
-  }
-
-  bool AddSinkOnlyRsid(const std::string& rsid, RtpPacketSinkInterface* sink) {
-    RtpDemuxerCriteria criteria;
-    criteria.rsid = rsid;
-    return AddSink(criteria, sink);
-  }
-
-  bool AddSinkOnlyMid(const std::string& mid, RtpPacketSinkInterface* sink) {
-    RtpDemuxerCriteria criteria;
-    criteria.mid = mid;
-    return AddSink(criteria, sink);
-  }
-
-  bool AddSinkBothMidRsid(const std::string& mid,
-                          const std::string& rsid,
-                          RtpPacketSinkInterface* sink) {
-    RtpDemuxerCriteria criteria;
-    criteria.mid = mid;
-    criteria.rsid = rsid;
-    return AddSink(criteria, sink);
-  }
-
-  bool RemoveSink(RtpPacketSinkInterface* sink) {
-    sinks_to_tear_down_.erase(sink);
-    return demuxer_.RemoveSink(sink);
-  }
-
-  // These are convenience methods for calling
-  // demuxer.{Register|Unregister}SsrcBindingObserver such that observers are
-  // automatically removed when the test finishes.
-
-  void RegisterSsrcBindingObserver(SsrcBindingObserver* observer) {
-    demuxer_.RegisterSsrcBindingObserver(observer);
-    observers_to_tear_down_.insert(observer);
-  }
-
-  void DeregisterSsrcBindingObserver(SsrcBindingObserver* observer) {
-    demuxer_.DeregisterSsrcBindingObserver(observer);
-    observers_to_tear_down_.erase(observer);
-  }
-
-  // The CreatePacket* methods are helpers for creating new RTP packets with
-  // various attributes set. Tests should use the helper that provides the
-  // minimum information needed to exercise the behavior under test. Tests also
-  // should not rely on any behavior which is not clearly described in the
-  // helper name/arguments. Any additional settings that are not covered by the
-  // helper should be set manually on the packet once it has been returned.
-  // For example, most tests in this file do not care about the RTP sequence
-  // number, but to ensure that the returned packets are valid the helpers will
-  // auto-increment the sequence number starting with 1. Tests that rely on
-  // specific sequence number behavior should call SetSequenceNumber manually on
-  // the returned packet.
-
-  // Intended for use only by other CreatePacket* helpers.
-  std::unique_ptr<RtpPacketReceived> CreatePacket(
-      uint32_t ssrc,
-      RtpPacketReceived::ExtensionManager* extension_manager) {
-    auto packet = rtc::MakeUnique<RtpPacketReceived>(extension_manager);
-    packet->SetSsrc(ssrc);
-    packet->SetSequenceNumber(next_sequence_number_++);
-    return packet;
-  }
-
-  std::unique_ptr<RtpPacketReceived> CreatePacketWithSsrc(uint32_t ssrc) {
-    return CreatePacket(ssrc, nullptr);
-  }
-
-  std::unique_ptr<RtpPacketReceived> CreatePacketWithSsrcMid(
-      uint32_t ssrc,
-      const std::string& mid) {
-    RtpPacketReceived::ExtensionManager extension_manager;
-    extension_manager.Register<RtpMid>(11);
-
-    auto packet = CreatePacket(ssrc, &extension_manager);
-    packet->SetExtension<RtpMid>(mid);
-    return packet;
-  }
-
-  std::unique_ptr<RtpPacketReceived> CreatePacketWithSsrcRsid(
-      uint32_t ssrc,
-      const std::string& rsid) {
-    RtpPacketReceived::ExtensionManager extension_manager;
-    extension_manager.Register<RtpStreamId>(6);
-
-    auto packet = CreatePacket(ssrc, &extension_manager);
-    packet->SetExtension<RtpStreamId>(rsid);
-    return packet;
-  }
-
-  std::unique_ptr<RtpPacketReceived> CreatePacketWithSsrcRrid(
-      uint32_t ssrc,
-      const std::string& rrid) {
-    RtpPacketReceived::ExtensionManager extension_manager;
-    extension_manager.Register<RepairedRtpStreamId>(7);
-
-    auto packet = CreatePacket(ssrc, &extension_manager);
-    packet->SetExtension<RepairedRtpStreamId>(rrid);
-    return packet;
-  }
-
-  std::unique_ptr<RtpPacketReceived> CreatePacketWithSsrcMidRsid(
-      uint32_t ssrc,
-      const std::string& mid,
-      const std::string& rsid) {
-    RtpPacketReceived::ExtensionManager extension_manager;
-    extension_manager.Register<RtpMid>(11);
-    extension_manager.Register<RtpStreamId>(6);
-
-    auto packet = CreatePacket(ssrc, &extension_manager);
-    packet->SetExtension<RtpMid>(mid);
-    packet->SetExtension<RtpStreamId>(rsid);
-    return packet;
-  }
-
-  std::unique_ptr<RtpPacketReceived> CreatePacketWithSsrcRsidRrid(
-      uint32_t ssrc,
-      const std::string& rsid,
-      const std::string& rrid) {
-    RtpPacketReceived::ExtensionManager extension_manager;
-    extension_manager.Register<RtpStreamId>(6);
-    extension_manager.Register<RepairedRtpStreamId>(7);
-
-    auto packet = CreatePacket(ssrc, &extension_manager);
-    packet->SetExtension<RtpStreamId>(rsid);
-    packet->SetExtension<RepairedRtpStreamId>(rrid);
-    return packet;
-  }
-
-  RtpDemuxer demuxer_;
-  std::set<RtpPacketSinkInterface*> sinks_to_tear_down_;
-  std::set<SsrcBindingObserver*> observers_to_tear_down_;
-  uint16_t next_sequence_number_ = 1;
-};
-
-MATCHER_P(SamePacketAs, other, "") {
-  return arg.Ssrc() == other.Ssrc() &&
-         arg.SequenceNumber() == other.SequenceNumber();
-}
-
-TEST_F(RtpDemuxerTest, CanAddSinkBySsrc) {
-  MockRtpPacketSink sink;
-  constexpr uint32_t ssrc = 1;
-
-  EXPECT_TRUE(AddSinkOnlySsrc(ssrc, &sink));
-}
-
-TEST_F(RtpDemuxerTest, AllowAddSinkWithOverlappingPayloadTypesIfDifferentMid) {
-  const std::string mid1 = "v";
-  const std::string mid2 = "a";
-  constexpr uint8_t pt1 = 30;
-  constexpr uint8_t pt2 = 31;
-  constexpr uint8_t pt3 = 32;
-
-  RtpDemuxerCriteria pt1_pt2;
-  pt1_pt2.mid = mid1;
-  pt1_pt2.payload_types = {pt1, pt2};
-  MockRtpPacketSink sink1;
-  AddSink(pt1_pt2, &sink1);
-
-  RtpDemuxerCriteria pt1_pt3;
-  pt1_pt2.mid = mid2;
-  pt1_pt3.payload_types = {pt1, pt3};
-  MockRtpPacketSink sink2;
-  EXPECT_TRUE(AddSink(pt1_pt3, &sink2));
-}
-
-TEST_F(RtpDemuxerTest, RejectAddSinkForSameMidOnly) {
-  const std::string mid = "mid";
-
-  MockRtpPacketSink sink;
-  AddSinkOnlyMid(mid, &sink);
-  EXPECT_FALSE(AddSinkOnlyMid(mid, &sink));
-}
-
-TEST_F(RtpDemuxerTest, RejectAddSinkForSameMidRsid) {
-  const std::string mid = "v";
-  const std::string rsid = "1";
-
-  MockRtpPacketSink sink1;
-  AddSinkBothMidRsid(mid, rsid, &sink1);
-
-  MockRtpPacketSink sink2;
-  EXPECT_FALSE(AddSinkBothMidRsid(mid, rsid, &sink2));
-}
-
-TEST_F(RtpDemuxerTest, RejectAddSinkForConflictingMidAndMidRsid) {
-  const std::string mid = "v";
-  const std::string rsid = "1";
-
-  MockRtpPacketSink mid_sink;
-  AddSinkOnlyMid(mid, &mid_sink);
-
-  // This sink would never get any packets routed to it because the above sink
-  // would receive them all.
-  MockRtpPacketSink mid_rsid_sink;
-  EXPECT_FALSE(AddSinkBothMidRsid(mid, rsid, &mid_rsid_sink));
-}
-
-TEST_F(RtpDemuxerTest, RejectAddSinkForConflictingMidRsidAndMid) {
-  const std::string mid = "v";
-  const std::string rsid = "";
-
-  MockRtpPacketSink mid_rsid_sink;
-  AddSinkBothMidRsid(mid, rsid, &mid_rsid_sink);
-
-  // This sink would shadow the above sink.
-  MockRtpPacketSink mid_sink;
-  EXPECT_FALSE(AddSinkOnlyMid(mid, &mid_sink));
-}
-
-TEST_F(RtpDemuxerTest, AddSinkFailsIfCalledForTwoSinksWithSameSsrc) {
-  MockRtpPacketSink sink_a;
-  MockRtpPacketSink sink_b;
-  constexpr uint32_t ssrc = 1;
-  ASSERT_TRUE(AddSinkOnlySsrc(ssrc, &sink_a));
-
-  EXPECT_FALSE(AddSinkOnlySsrc(ssrc, &sink_b));
-}
-
-TEST_F(RtpDemuxerTest, AddSinkFailsIfCalledTwiceEvenIfSameSinkWithSameSsrc) {
-  MockRtpPacketSink sink;
-  constexpr uint32_t ssrc = 1;
-  ASSERT_TRUE(AddSinkOnlySsrc(ssrc, &sink));
-
-  EXPECT_FALSE(AddSinkOnlySsrc(ssrc, &sink));
-}
-
-// TODO(steveanton): Currently fails because payload type validation is not
-// complete in AddSink (see note in rtp_demuxer.cc).
-TEST_F(RtpDemuxerTest, DISABLED_RejectAddSinkForSamePayloadTypes) {
-  constexpr uint8_t pt1 = 30;
-  constexpr uint8_t pt2 = 31;
-
-  RtpDemuxerCriteria pt1_pt2;
-  pt1_pt2.payload_types = {pt1, pt2};
-  MockRtpPacketSink sink1;
-  AddSink(pt1_pt2, &sink1);
-
-  RtpDemuxerCriteria pt2_pt1;
-  pt2_pt1.payload_types = {pt2, pt1};
-  MockRtpPacketSink sink2;
-  EXPECT_FALSE(AddSink(pt2_pt1, &sink2));
-}
-
-// Routing Tests
-
-TEST_F(RtpDemuxerTest, OnRtpPacketCalledOnCorrectSinkBySsrc) {
-  constexpr uint32_t ssrcs[] = {101, 202, 303};
-  MockRtpPacketSink sinks[arraysize(ssrcs)];
-  for (size_t i = 0; i < arraysize(ssrcs); i++) {
-    AddSinkOnlySsrc(ssrcs[i], &sinks[i]);
-  }
-
-  for (size_t i = 0; i < arraysize(ssrcs); i++) {
-    auto packet = CreatePacketWithSsrc(ssrcs[i]);
-    EXPECT_CALL(sinks[i], OnRtpPacket(SamePacketAs(*packet))).Times(1);
-    EXPECT_TRUE(demuxer_.OnRtpPacket(*packet));
-  }
-}
-
-TEST_F(RtpDemuxerTest, OnRtpPacketCalledOnCorrectSinkByRsid) {
-  const std::string rsids[] = {"a", "b", "c"};
-  MockRtpPacketSink sinks[arraysize(rsids)];
-  for (size_t i = 0; i < arraysize(rsids); i++) {
-    AddSinkOnlyRsid(rsids[i], &sinks[i]);
-  }
-
-  for (size_t i = 0; i < arraysize(rsids); i++) {
-    auto packet = CreatePacketWithSsrcRsid(rtc::checked_cast<uint32_t>(i),
-                                           rsids[i]);
-    EXPECT_CALL(sinks[i], OnRtpPacket(SamePacketAs(*packet))).Times(1);
-    EXPECT_TRUE(demuxer_.OnRtpPacket(*packet));
-  }
-}
-
-TEST_F(RtpDemuxerTest, OnRtpPacketCalledOnCorrectSinkByMid) {
-  const std::string mids[] = {"a", "v", "s"};
-  MockRtpPacketSink sinks[arraysize(mids)];
-  for (size_t i = 0; i < arraysize(mids); i++) {
-    AddSinkOnlyMid(mids[i], &sinks[i]);
-  }
-
-  for (size_t i = 0; i < arraysize(mids); i++) {
-    auto packet = CreatePacketWithSsrcMid(rtc::checked_cast<uint32_t>(i),
-                                          mids[i]);
-    EXPECT_CALL(sinks[i], OnRtpPacket(SamePacketAs(*packet))).Times(1);
-    EXPECT_TRUE(demuxer_.OnRtpPacket(*packet));
-  }
-}
-
-TEST_F(RtpDemuxerTest, OnRtpPacketCalledOnCorrectSinkByMidAndRsid) {
-  const std::string mid = "v";
-  const std::string rsid = "1";
-  constexpr uint32_t ssrc = 10;
-
-  MockRtpPacketSink sink;
-  AddSinkBothMidRsid(mid, rsid, &sink);
-
-  auto packet = CreatePacketWithSsrcMidRsid(ssrc, mid, rsid);
-  EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet))).Times(1);
-  EXPECT_TRUE(demuxer_.OnRtpPacket(*packet));
-}
-
-TEST_F(RtpDemuxerTest, OnRtpPacketCalledOnCorrectSinkByRepairedRsid) {
-  const std::string rrid = "1";
-  constexpr uint32_t ssrc = 10;
-
-  MockRtpPacketSink sink;
-  AddSinkOnlyRsid(rrid, &sink);
-
-  auto packet_with_rrid = CreatePacketWithSsrcRrid(ssrc, rrid);
-  EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet_with_rrid))).Times(1);
-  EXPECT_TRUE(demuxer_.OnRtpPacket(*packet_with_rrid));
-}
-
-TEST_F(RtpDemuxerTest, OnRtpPacketCalledOnCorrectSinkByPayloadType) {
-  constexpr uint32_t ssrc = 10;
-  constexpr uint8_t payload_type = 30;
-
-  MockRtpPacketSink sink;
-  RtpDemuxerCriteria criteria;
-  criteria.payload_types = {payload_type};
-  AddSink(criteria, &sink);
-
-  auto packet = CreatePacketWithSsrc(ssrc);
-  packet->SetPayloadType(payload_type);
-  EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet))).Times(1);
-  EXPECT_TRUE(demuxer_.OnRtpPacket(*packet));
-}
-
-TEST_F(RtpDemuxerTest, PacketsDeliveredInRightOrder) {
-  constexpr uint32_t ssrc = 101;
-  MockRtpPacketSink sink;
-  AddSinkOnlySsrc(ssrc, &sink);
-
-  std::unique_ptr<RtpPacketReceived> packets[5];
-  for (size_t i = 0; i < arraysize(packets); i++) {
-    packets[i] = CreatePacketWithSsrc(ssrc);
-    packets[i]->SetSequenceNumber(rtc::checked_cast<uint16_t>(i));
-  }
-
-  InSequence sequence;
-  for (const auto& packet : packets) {
-    EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet))).Times(1);
-  }
-
-  for (const auto& packet : packets) {
-    EXPECT_TRUE(demuxer_.OnRtpPacket(*packet));
-  }
-}
-
-TEST_F(RtpDemuxerTest, SinkMappedToMultipleSsrcs) {
-  constexpr uint32_t ssrcs[] = {404, 505, 606};
-  MockRtpPacketSink sink;
-  for (uint32_t ssrc : ssrcs) {
-    AddSinkOnlySsrc(ssrc, &sink);
-  }
-
-  // The sink which is associated with multiple SSRCs gets the callback
-  // triggered for each of those SSRCs.
-  for (uint32_t ssrc : ssrcs) {
-    auto packet = CreatePacketWithSsrc(ssrc);
-    EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet))).Times(1);
-    EXPECT_TRUE(demuxer_.OnRtpPacket(*packet));
-  }
-}
-
-TEST_F(RtpDemuxerTest, NoCallbackOnSsrcSinkRemovedBeforeFirstPacket) {
-  constexpr uint32_t ssrc = 404;
-  MockRtpPacketSink sink;
-  AddSinkOnlySsrc(ssrc, &sink);
-
-  ASSERT_TRUE(RemoveSink(&sink));
-
-  // The removed sink does not get callbacks.
-  auto packet = CreatePacketWithSsrc(ssrc);
-  EXPECT_CALL(sink, OnRtpPacket(_)).Times(0);  // Not called.
-  EXPECT_FALSE(demuxer_.OnRtpPacket(*packet));
-}
-
-TEST_F(RtpDemuxerTest, NoCallbackOnSsrcSinkRemovedAfterFirstPacket) {
-  constexpr uint32_t ssrc = 404;
-  NiceMock<MockRtpPacketSink> sink;
-  AddSinkOnlySsrc(ssrc, &sink);
-
-  InSequence sequence;
-  for (size_t i = 0; i < 10; i++) {
-    ASSERT_TRUE(demuxer_.OnRtpPacket(*CreatePacketWithSsrc(ssrc)));
-  }
-
-  ASSERT_TRUE(RemoveSink(&sink));
-
-  // The removed sink does not get callbacks.
-  auto packet = CreatePacketWithSsrc(ssrc);
-  EXPECT_CALL(sink, OnRtpPacket(_)).Times(0);  // Not called.
-  EXPECT_FALSE(demuxer_.OnRtpPacket(*packet));
-}
-
-// An SSRC may only be mapped to a single sink. However, since configuration
-// of this associations might come from the network, we need to fail gracefully.
-TEST_F(RtpDemuxerTest, OnlyOneSinkPerSsrcGetsOnRtpPacketTriggered) {
-  MockRtpPacketSink sinks[3];
-  constexpr uint32_t ssrc = 404;
-  ASSERT_TRUE(AddSinkOnlySsrc(ssrc, &sinks[0]));
-  ASSERT_FALSE(AddSinkOnlySsrc(ssrc, &sinks[1]));
-  ASSERT_FALSE(AddSinkOnlySsrc(ssrc, &sinks[2]));
-
-  // The first sink associated with the SSRC remains active; other sinks
-  // were not really added, and so do not get OnRtpPacket() called.
-  auto packet = CreatePacketWithSsrc(ssrc);
-  EXPECT_CALL(sinks[0], OnRtpPacket(SamePacketAs(*packet))).Times(1);
-  EXPECT_CALL(sinks[1], OnRtpPacket(_)).Times(0);
-  EXPECT_CALL(sinks[2], OnRtpPacket(_)).Times(0);
-  ASSERT_TRUE(demuxer_.OnRtpPacket(*packet));
-}
-
-TEST_F(RtpDemuxerTest, NoRepeatedCallbackOnRepeatedAddSinkForSameSink) {
-  constexpr uint32_t ssrc = 111;
-  MockRtpPacketSink sink;
-
-  ASSERT_TRUE(AddSinkOnlySsrc(ssrc, &sink));
-  ASSERT_FALSE(AddSinkOnlySsrc(ssrc, &sink));
-
-  auto packet = CreatePacketWithSsrc(ssrc);
-  EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet))).Times(1);
-  EXPECT_TRUE(demuxer_.OnRtpPacket(*packet));
-}
-
-TEST_F(RtpDemuxerTest, RemoveSinkReturnsFalseForNeverAddedSink) {
-  MockRtpPacketSink sink;
-  EXPECT_FALSE(RemoveSink(&sink));
-}
-
-TEST_F(RtpDemuxerTest, RemoveSinkReturnsTrueForPreviouslyAddedSsrcSink) {
-  constexpr uint32_t ssrc = 101;
-  MockRtpPacketSink sink;
-  AddSinkOnlySsrc(ssrc, &sink);
-
-  EXPECT_TRUE(RemoveSink(&sink));
-}
-
-TEST_F(RtpDemuxerTest,
-       RemoveSinkReturnsTrueForUnresolvedPreviouslyAddedRsidSink) {
-  const std::string rsid = "a";
-  MockRtpPacketSink sink;
-  AddSinkOnlyRsid(rsid, &sink);
-
-  EXPECT_TRUE(RemoveSink(&sink));
-}
-
-TEST_F(RtpDemuxerTest,
-       RemoveSinkReturnsTrueForResolvedPreviouslyAddedRsidSink) {
-  const std::string rsid = "a";
-  constexpr uint32_t ssrc = 101;
-  NiceMock<MockRtpPacketSink> sink;
-  AddSinkOnlyRsid(rsid, &sink);
-  ASSERT_TRUE(demuxer_.OnRtpPacket(*CreatePacketWithSsrcRsid(ssrc, rsid)));
-
-  EXPECT_TRUE(RemoveSink(&sink));
-}
-
-TEST_F(RtpDemuxerTest, RsidLearnedAndLaterPacketsDeliveredWithOnlySsrc) {
-  MockRtpPacketSink sink;
-  const std::string rsid = "a";
-  AddSinkOnlyRsid(rsid, &sink);
-
-  // Create a sequence of RTP packets, where only the first one actually
-  // mentions the RSID.
-  std::unique_ptr<RtpPacketReceived> packets[5];
-  constexpr uint32_t rsid_ssrc = 111;
-  packets[0] = CreatePacketWithSsrcRsid(rsid_ssrc, rsid);
-  for (size_t i = 1; i < arraysize(packets); i++) {
-    packets[i] = CreatePacketWithSsrc(rsid_ssrc);
-  }
-
-  // The first packet associates the RSID with the SSRC, thereby allowing the
-  // demuxer to correctly demux all of the packets.
-  InSequence sequence;
-  for (const auto& packet : packets) {
-    EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet))).Times(1);
-  }
-  for (const auto& packet : packets) {
-    EXPECT_TRUE(demuxer_.OnRtpPacket(*packet));
-  }
-}
-
-TEST_F(RtpDemuxerTest, NoCallbackOnRsidSinkRemovedBeforeFirstPacket) {
-  MockRtpPacketSink sink;
-  const std::string rsid = "a";
-  AddSinkOnlyRsid(rsid, &sink);
-
-  // Sink removed - it won't get triggers even if packets with its RSID arrive.
-  ASSERT_TRUE(RemoveSink(&sink));
-
-  constexpr uint32_t ssrc = 111;
-  auto packet = CreatePacketWithSsrcRsid(ssrc, rsid);
-  EXPECT_CALL(sink, OnRtpPacket(_)).Times(0);  // Not called.
-  EXPECT_FALSE(demuxer_.OnRtpPacket(*packet));
-}
-
-TEST_F(RtpDemuxerTest, NoCallbackOnRsidSinkRemovedAfterFirstPacket) {
-  NiceMock<MockRtpPacketSink> sink;
-  const std::string rsid = "a";
-  AddSinkOnlyRsid(rsid, &sink);
-
-  InSequence sequence;
-  constexpr uint32_t ssrc = 111;
-  for (size_t i = 0; i < 10; i++) {
-    auto packet = CreatePacketWithSsrcRsid(ssrc, rsid);
-    ASSERT_TRUE(demuxer_.OnRtpPacket(*packet));
-  }
-
-  // Sink removed - it won't get triggers even if packets with its RSID arrive.
-  ASSERT_TRUE(RemoveSink(&sink));
-
-  auto packet = CreatePacketWithSsrcRsid(ssrc, rsid);
-  EXPECT_CALL(sink, OnRtpPacket(_)).Times(0);  // Not called.
-  EXPECT_FALSE(demuxer_.OnRtpPacket(*packet));
-}
-
-TEST_F(RtpDemuxerTest, NoCallbackOnMidSinkRemovedBeforeFirstPacket) {
-  const std::string mid = "v";
-  constexpr uint32_t ssrc = 10;
-
-  MockRtpPacketSink sink;
-  AddSinkOnlyMid(mid, &sink);
-  RemoveSink(&sink);
-
-  auto packet = CreatePacketWithSsrcMid(ssrc, mid);
-  EXPECT_CALL(sink, OnRtpPacket(_)).Times(0);
-  EXPECT_FALSE(demuxer_.OnRtpPacket(*packet));
-}
-
-TEST_F(RtpDemuxerTest, NoCallbackOnMidSinkRemovedAfterFirstPacket) {
-  const std::string mid = "v";
-  constexpr uint32_t ssrc = 10;
-
-  NiceMock<MockRtpPacketSink> sink;
-  AddSinkOnlyMid(mid, &sink);
-
-  auto p1 = CreatePacketWithSsrcMid(ssrc, mid);
-  demuxer_.OnRtpPacket(*p1);
-
-  RemoveSink(&sink);
-
-  auto p2 = CreatePacketWithSsrcMid(ssrc, mid);
-  EXPECT_CALL(sink, OnRtpPacket(_)).Times(0);
-  EXPECT_FALSE(demuxer_.OnRtpPacket(*p2));
-}
-
-TEST_F(RtpDemuxerTest, NoCallbackOnMidRsidSinkRemovedAfterFirstPacket) {
-  const std::string mid = "v";
-  const std::string rsid = "1";
-  constexpr uint32_t ssrc = 10;
-
-  NiceMock<MockRtpPacketSink> sink;
-  AddSinkBothMidRsid(mid, rsid, &sink);
-
-  auto p1 = CreatePacketWithSsrcMidRsid(ssrc, mid, rsid);
-  demuxer_.OnRtpPacket(*p1);
-
-  RemoveSink(&sink);
-
-  auto p2 = CreatePacketWithSsrcMidRsid(ssrc, mid, rsid);
-  EXPECT_CALL(sink, OnRtpPacket(_)).Times(0);
-  EXPECT_FALSE(demuxer_.OnRtpPacket(*p2));
-}
-
-// The RSID to SSRC mapping should be one-to-one. If we end up receiving
-// two (or more) packets with the same SSRC, but different RSIDs, we guarantee
-// delivery to one of them but not both.
-TEST_F(RtpDemuxerTest, FirstSsrcAssociatedWithAnRsidIsNotForgotten) {
-  // Each sink has a distinct RSID.
-  MockRtpPacketSink sink_a;
-  const std::string rsid_a = "a";
-  AddSinkOnlyRsid(rsid_a, &sink_a);
-
-  MockRtpPacketSink sink_b;
-  const std::string rsid_b = "b";
-  AddSinkOnlyRsid(rsid_b, &sink_b);
-
-  InSequence sequence;  // Verify that the order of delivery is unchanged.
-
-  constexpr uint32_t shared_ssrc = 100;
-
-  // First a packet with |rsid_a| is received, and |sink_a| is associated with
-  // its SSRC.
-  auto packet_a = CreatePacketWithSsrcRsid(shared_ssrc, rsid_a);
-  EXPECT_CALL(sink_a, OnRtpPacket(SamePacketAs(*packet_a))).Times(1);
-  EXPECT_TRUE(demuxer_.OnRtpPacket(*packet_a));
-
-  // Second, a packet with |rsid_b| is received. We guarantee that |sink_b|
-  // receives it.
-  auto packet_b = CreatePacketWithSsrcRsid(shared_ssrc, rsid_b);
-  EXPECT_CALL(sink_a, OnRtpPacket(_)).Times(0);
-  EXPECT_CALL(sink_b, OnRtpPacket(SamePacketAs(*packet_b))).Times(1);
-  EXPECT_TRUE(demuxer_.OnRtpPacket(*packet_b));
-
-  // Known edge-case; adding a new RSID association makes us re-examine all
-  // SSRCs. |sink_b| may or may not be associated with the SSRC now; we make
-  // no promises on that. However, since the RSID is specified and it cannot be
-  // found the packet should be dropped.
-  MockRtpPacketSink sink_c;
-  const std::string rsid_c = "c";
-  constexpr uint32_t some_other_ssrc = shared_ssrc + 1;
-  AddSinkOnlySsrc(some_other_ssrc, &sink_c);
-
-  auto packet_c = CreatePacketWithSsrcMid(shared_ssrc, rsid_c);
-  EXPECT_CALL(sink_a, OnRtpPacket(_)).Times(0);
-  EXPECT_CALL(sink_b, OnRtpPacket(_)).Times(0);
-  EXPECT_CALL(sink_c, OnRtpPacket(_)).Times(0);
-  EXPECT_FALSE(demuxer_.OnRtpPacket(*packet_c));
-}
-
-TEST_F(RtpDemuxerTest, MultipleRsidsOnSameSink) {
-  MockRtpPacketSink sink;
-  const std::string rsids[] = {"a", "b", "c"};
-
-  for (const std::string& rsid : rsids) {
-    AddSinkOnlyRsid(rsid, &sink);
-  }
-
-  InSequence sequence;
-  for (size_t i = 0; i < arraysize(rsids); i++) {
-    // Assign different SSRCs and sequence numbers to all packets.
-    const uint32_t ssrc = 1000 + static_cast<uint32_t>(i);
-    const uint16_t sequence_number = 50 + static_cast<uint16_t>(i);
-    auto packet = CreatePacketWithSsrcRsid(ssrc, rsids[i]);
-    packet->SetSequenceNumber(sequence_number);
-    EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet))).Times(1);
-    EXPECT_TRUE(demuxer_.OnRtpPacket(*packet));
-  }
-}
-
-// RSIDs are given higher priority than SSRC because we believe senders are less
-// likely to mislabel packets with RSID than mislabel them with SSRCs.
-TEST_F(RtpDemuxerTest, SinkWithBothRsidAndSsrcAssociations) {
-  MockRtpPacketSink sink;
-  constexpr uint32_t standalone_ssrc = 10101;
-  constexpr uint32_t rsid_ssrc = 20202;
-  const std::string rsid = "1";
-
-  AddSinkOnlySsrc(standalone_ssrc, &sink);
-  AddSinkOnlyRsid(rsid, &sink);
-
-  InSequence sequence;
-
-  auto ssrc_packet = CreatePacketWithSsrc(standalone_ssrc);
-  EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*ssrc_packet))).Times(1);
-  EXPECT_TRUE(demuxer_.OnRtpPacket(*ssrc_packet));
-
-  auto rsid_packet = CreatePacketWithSsrcRsid(rsid_ssrc, rsid);
-  EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*rsid_packet))).Times(1);
-  EXPECT_TRUE(demuxer_.OnRtpPacket(*rsid_packet));
-}
-
-// Packets are always guaranteed to be routed to only one sink.
-TEST_F(RtpDemuxerTest, AssociatingByRsidAndBySsrcCannotTriggerDoubleCall) {
-  constexpr uint32_t ssrc = 10101;
-  const std::string rsid = "a";
-
-  MockRtpPacketSink sink;
-  AddSinkOnlySsrc(ssrc, &sink);
-  AddSinkOnlyRsid(rsid, &sink);
-
-  auto packet = CreatePacketWithSsrcRsid(ssrc, rsid);
-  EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet))).Times(1);
-  EXPECT_TRUE(demuxer_.OnRtpPacket(*packet));
-}
-
-TEST_F(RtpDemuxerTest, ObserversNotifiedOfSsrcBoundToMid) {
-  const std::string mid = "v";
-  constexpr uint32_t ssrc = 10;
-
-  NiceMock<MockRtpPacketSink> sink;
-  AddSinkOnlyMid(mid, &sink);
-
-  MockSsrcBindingObserver observer;
-  RegisterSsrcBindingObserver(&observer);
-
-  auto packet = CreatePacketWithSsrcMid(ssrc, mid);
-  EXPECT_CALL(observer, OnSsrcBoundToMid(mid, ssrc));
-  EXPECT_TRUE(demuxer_.OnRtpPacket(*packet));
-}
-
-TEST_F(RtpDemuxerTest, ObserversNotifiedOfSsrcBoundToRsid) {
-  const std::string rsid = "1";
-  constexpr uint32_t ssrc = 111;
-
-  // Only RSIDs which the demuxer knows may be resolved.
-  NiceMock<MockRtpPacketSink> sink;
-  AddSinkOnlyRsid(rsid, &sink);
-
-  NiceMock<MockSsrcBindingObserver> rsid_resolution_observers[3];
-  for (auto& observer : rsid_resolution_observers) {
-    RegisterSsrcBindingObserver(&observer);
-    EXPECT_CALL(observer, OnSsrcBoundToRsid(rsid, ssrc)).Times(1);
-  }
-
-  // The expected calls to OnSsrcBoundToRsid() will be triggered by this.
-  auto packet = CreatePacketWithSsrcRsid(ssrc, rsid);
-  EXPECT_TRUE(demuxer_.OnRtpPacket(*packet));
-}
-
-TEST_F(RtpDemuxerTest, ObserversNotifiedOfSsrcBoundToMidRsid) {
-  const std::string mid = "v";
-  const std::string rsid = "1";
-  constexpr uint32_t ssrc = 10;
-
-  NiceMock<MockRtpPacketSink> sink;
-  AddSinkBothMidRsid(mid, rsid, &sink);
-
-  MockSsrcBindingObserver observer;
-  RegisterSsrcBindingObserver(&observer);
-
-  auto packet = CreatePacketWithSsrcMidRsid(ssrc, mid, rsid);
-  EXPECT_CALL(observer, OnSsrcBoundToMidRsid(mid, rsid, ssrc));
-  EXPECT_TRUE(demuxer_.OnRtpPacket(*packet));
-}
-
-TEST_F(RtpDemuxerTest, ObserversNotifiedOfSsrcBoundToPayloadType) {
-  constexpr uint8_t payload_type = 3;
-  constexpr uint32_t ssrc = 10;
-
-  RtpDemuxerCriteria criteria;
-  criteria.payload_types = {payload_type};
-  NiceMock<MockRtpPacketSink> sink;
-  AddSink(criteria, &sink);
-
-  MockSsrcBindingObserver observer;
-  RegisterSsrcBindingObserver(&observer);
-
-  auto packet = CreatePacketWithSsrc(ssrc);
-  packet->SetPayloadType(payload_type);
-  EXPECT_CALL(observer, OnSsrcBoundToPayloadType(payload_type, ssrc));
-  EXPECT_TRUE(demuxer_.OnRtpPacket(*packet));
-}
-
-// If one sink is associated with SSRC x, and another sink with RSID y, then if
-// we receive a packet with both SSRC x and RSID y, route that to only the sink
-// for RSID y since we believe RSID tags to be more trustworthy than signaled
-// SSRCs.
-TEST_F(RtpDemuxerTest,
-       PacketFittingBothRsidSinkAndSsrcSinkGivenOnlyToRsidSink) {
-  constexpr uint32_t ssrc = 111;
-  MockRtpPacketSink ssrc_sink;
-  AddSinkOnlySsrc(ssrc, &ssrc_sink);
-
-  const std::string rsid = "a";
-  MockRtpPacketSink rsid_sink;
-  AddSinkOnlyRsid(rsid, &rsid_sink);
-
-  auto packet = CreatePacketWithSsrcRsid(ssrc, rsid);
-
-  EXPECT_CALL(ssrc_sink, OnRtpPacket(_)).Times(0);
-  EXPECT_CALL(rsid_sink, OnRtpPacket(SamePacketAs(*packet))).Times(1);
-  EXPECT_TRUE(demuxer_.OnRtpPacket(*packet));
-}
-
-// We're not expecting RSIDs to be resolved to SSRCs which were previously
-// mapped to sinks, and make no guarantees except for graceful handling.
-TEST_F(RtpDemuxerTest,
-       GracefullyHandleRsidBeingMappedToPrevouslyAssociatedSsrc) {
-  constexpr uint32_t ssrc = 111;
-  NiceMock<MockRtpPacketSink> ssrc_sink;
-  AddSinkOnlySsrc(ssrc, &ssrc_sink);
-
-  const std::string rsid = "a";
-  NiceMock<MockRtpPacketSink> rsid_sink;
-  AddSinkOnlyRsid(rsid, &rsid_sink);
-
-  NiceMock<MockSsrcBindingObserver> observer;
-  RegisterSsrcBindingObserver(&observer);
-
-  // The SSRC was mapped to an SSRC sink, but was even active (packets flowed
-  // over it).
-  auto packet = CreatePacketWithSsrcRsid(ssrc, rsid);
-  demuxer_.OnRtpPacket(*packet);
-
-  // If the SSRC sink is ever removed, the RSID sink *might* receive indications
-  // of packets, and observers *might* be informed. Only graceful handling
-  // is guaranteed.
-  RemoveSink(&ssrc_sink);
-  EXPECT_CALL(rsid_sink, OnRtpPacket(SamePacketAs(*packet))).Times(AtLeast(0));
-  EXPECT_CALL(observer, OnSsrcBoundToRsid(rsid, ssrc)).Times(AtLeast(0));
-  EXPECT_TRUE(demuxer_.OnRtpPacket(*packet));
-}
-
-// Tests that when one MID sink is configured, packets that include the MID
-// extension will get routed to that sink and any packets that use the same
-// SSRC as one of those packets later will also get routed to the sink, even
-// if a new SSRC is introduced for the same MID.
-TEST_F(RtpDemuxerTest, RoutedByMidWhenSsrcAdded) {
-  const std::string mid = "v";
-  NiceMock<MockRtpPacketSink> sink;
-  AddSinkOnlyMid(mid, &sink);
-
-  constexpr uint32_t ssrc1 = 10;
-  constexpr uint32_t ssrc2 = 11;
-
-  auto packet_ssrc1_mid = CreatePacketWithSsrcMid(ssrc1, mid);
-  demuxer_.OnRtpPacket(*packet_ssrc1_mid);
-  auto packet_ssrc2_mid = CreatePacketWithSsrcMid(ssrc2, mid);
-  demuxer_.OnRtpPacket(*packet_ssrc2_mid);
-
-  auto packet_ssrc1_only = CreatePacketWithSsrc(ssrc1);
-  EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet_ssrc1_only))).Times(1);
-  EXPECT_TRUE(demuxer_.OnRtpPacket(*packet_ssrc1_only));
-
-  auto packet_ssrc2_only = CreatePacketWithSsrc(ssrc2);
-  EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet_ssrc2_only))).Times(1);
-  EXPECT_TRUE(demuxer_.OnRtpPacket(*packet_ssrc2_only));
-}
-
-TEST_F(RtpDemuxerTest, DontLearnMidSsrcBindingBeforeSinkAdded) {
-  const std::string mid = "v";
-  constexpr uint32_t ssrc = 10;
-
-  auto packet_ssrc_mid = CreatePacketWithSsrcMid(ssrc, mid);
-  ASSERT_FALSE(demuxer_.OnRtpPacket(*packet_ssrc_mid));
-
-  MockRtpPacketSink sink;
-  AddSinkOnlyMid(mid, &sink);
-
-  auto packet_ssrc_only = CreatePacketWithSsrc(ssrc);
-  EXPECT_CALL(sink, OnRtpPacket(_)).Times(0);
-  EXPECT_FALSE(demuxer_.OnRtpPacket(*packet_ssrc_only));
-}
-
-TEST_F(RtpDemuxerTest, DontForgetMidSsrcBindingWhenSinkRemoved) {
-  const std::string mid = "v";
-  constexpr uint32_t ssrc = 10;
-
-  NiceMock<MockRtpPacketSink> sink1;
-  AddSinkOnlyMid(mid, &sink1);
-
-  auto packet_with_mid = CreatePacketWithSsrcMid(ssrc, mid);
-  demuxer_.OnRtpPacket(*packet_with_mid);
-
-  RemoveSink(&sink1);
-
-  MockRtpPacketSink sink2;
-  AddSinkOnlyMid(mid, &sink2);
-
-  auto packet_with_ssrc = CreatePacketWithSsrc(ssrc);
-  EXPECT_CALL(sink2, OnRtpPacket(SamePacketAs(*packet_with_ssrc)));
-  EXPECT_TRUE(demuxer_.OnRtpPacket(*packet_with_ssrc));
-}
-
-// If a sink is added with only a MID, then any packet with that MID no matter
-// the RSID should be routed to that sink.
-TEST_F(RtpDemuxerTest, RoutedByMidWithAnyRsid) {
-  const std::string mid = "v";
-  const std::string rsid1 = "1";
-  const std::string rsid2 = "2";
-  constexpr uint32_t ssrc1 = 10;
-  constexpr uint32_t ssrc2 = 11;
-
-  MockRtpPacketSink sink;
-  AddSinkOnlyMid(mid, &sink);
-
-  InSequence sequence;
-
-  auto packet_ssrc1_rsid1 = CreatePacketWithSsrcMidRsid(ssrc1, mid, rsid1);
-  EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet_ssrc1_rsid1))).Times(1);
-  EXPECT_TRUE(demuxer_.OnRtpPacket(*packet_ssrc1_rsid1));
-
-  auto packet_ssrc2_rsid2 = CreatePacketWithSsrcMidRsid(ssrc2, mid, rsid2);
-  EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet_ssrc2_rsid2))).Times(1);
-  EXPECT_TRUE(demuxer_.OnRtpPacket(*packet_ssrc2_rsid2));
-}
-
-// These two tests verify that for a sink added with a MID, RSID pair, if the
-// MID and RSID are learned in separate packets (e.g., because the header
-// extensions are sent separately), then a later packet with just SSRC will get
-// routed to that sink.
-// The first test checks that the functionality works when MID is learned first.
-// The second test checks that the functionality works when RSID is learned
-// first.
-TEST_F(RtpDemuxerTest, LearnMidThenRsidSeparatelyAndRouteBySsrc) {
-  const std::string mid = "v";
-  const std::string rsid = "1";
-  constexpr uint32_t ssrc = 10;
-
-  NiceMock<MockRtpPacketSink> sink;
-  AddSinkBothMidRsid(mid, rsid, &sink);
-
-  auto packet_with_mid = CreatePacketWithSsrcMid(ssrc, mid);
-  ASSERT_FALSE(demuxer_.OnRtpPacket(*packet_with_mid));
-
-  auto packet_with_rsid = CreatePacketWithSsrcRsid(ssrc, rsid);
-  ASSERT_TRUE(demuxer_.OnRtpPacket(*packet_with_rsid));
-
-  auto packet_with_ssrc = CreatePacketWithSsrc(ssrc);
-  EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet_with_ssrc))).Times(1);
-  EXPECT_TRUE(demuxer_.OnRtpPacket(*packet_with_ssrc));
-}
-
-TEST_F(RtpDemuxerTest, LearnRsidThenMidSeparatelyAndRouteBySsrc) {
-  const std::string mid = "v";
-  const std::string rsid = "1";
-  constexpr uint32_t ssrc = 10;
-
-  NiceMock<MockRtpPacketSink> sink;
-  AddSinkBothMidRsid(mid, rsid, &sink);
-
-  auto packet_with_rsid = CreatePacketWithSsrcRsid(ssrc, rsid);
-  ASSERT_FALSE(demuxer_.OnRtpPacket(*packet_with_rsid));
-
-  auto packet_with_mid = CreatePacketWithSsrcMid(ssrc, mid);
-  ASSERT_TRUE(demuxer_.OnRtpPacket(*packet_with_mid));
-
-  auto packet_with_ssrc = CreatePacketWithSsrc(ssrc);
-  EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet_with_ssrc))).Times(1);
-  EXPECT_TRUE(demuxer_.OnRtpPacket(*packet_with_ssrc));
-}
-
-TEST_F(RtpDemuxerTest, DontLearnMidRsidBindingBeforeSinkAdded) {
-  const std::string mid = "v";
-  const std::string rsid = "1";
-  constexpr uint32_t ssrc = 10;
-
-  auto packet_with_both = CreatePacketWithSsrcMidRsid(ssrc, mid, rsid);
-  ASSERT_FALSE(demuxer_.OnRtpPacket(*packet_with_both));
-
-  MockRtpPacketSink sink;
-  AddSinkBothMidRsid(mid, rsid, &sink);
-
-  auto packet_with_ssrc = CreatePacketWithSsrc(ssrc);
-  EXPECT_CALL(sink, OnRtpPacket(_)).Times(0);
-  EXPECT_FALSE(demuxer_.OnRtpPacket(*packet_with_ssrc));
-}
-
-TEST_F(RtpDemuxerTest, DontForgetMidRsidBindingWhenSinkRemoved) {
-  const std::string mid = "v";
-  const std::string rsid = "1";
-  constexpr uint32_t ssrc = 10;
-
-  NiceMock<MockRtpPacketSink> sink1;
-  AddSinkBothMidRsid(mid, rsid, &sink1);
-
-  auto packet_with_both = CreatePacketWithSsrcMidRsid(ssrc, mid, rsid);
-  demuxer_.OnRtpPacket(*packet_with_both);
-
-  RemoveSink(&sink1);
-
-  MockRtpPacketSink sink2;
-  AddSinkBothMidRsid(mid, rsid, &sink2);
-
-  auto packet_with_ssrc = CreatePacketWithSsrc(ssrc);
-  EXPECT_CALL(sink2, OnRtpPacket(SamePacketAs(*packet_with_ssrc)));
-  EXPECT_TRUE(demuxer_.OnRtpPacket(*packet_with_ssrc));
-}
-
-TEST_F(RtpDemuxerTest, LearnMidRsidBindingAfterSinkAdded) {
-  const std::string mid = "v";
-  const std::string rsid = "1";
-  constexpr uint32_t ssrc = 10;
-
-  NiceMock<MockRtpPacketSink> sink;
-  AddSinkBothMidRsid(mid, rsid, &sink);
-
-  auto packet_with_both = CreatePacketWithSsrcMidRsid(ssrc, mid, rsid);
-  demuxer_.OnRtpPacket(*packet_with_both);
-
-  auto packet_with_ssrc = CreatePacketWithSsrc(ssrc);
-  EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet_with_ssrc)));
-  EXPECT_TRUE(demuxer_.OnRtpPacket(*packet_with_ssrc));
-}
-
-TEST_F(RtpDemuxerTest, DropByPayloadTypeIfNoSink) {
-  constexpr uint8_t payload_type = 30;
-  constexpr uint32_t ssrc = 10;
-
-  auto packet = CreatePacketWithSsrc(ssrc);
-  packet->SetPayloadType(payload_type);
-  EXPECT_FALSE(demuxer_.OnRtpPacket(*packet));
-}
-
-// For legacy applications, it's possible for us to demux if the payload type is
-// unique. But if multiple sinks are registered with different MIDs and the same
-// payload types, then we cannot route a packet with just payload type because
-// it is ambiguous which sink it should be sent to.
-TEST_F(RtpDemuxerTest, DropByPayloadTypeIfAddedInMultipleSinks) {
-  const std::string mid1 = "v";
-  const std::string mid2 = "a";
-  constexpr uint8_t payload_type = 30;
-  constexpr uint32_t ssrc = 10;
-
-  RtpDemuxerCriteria mid1_pt;
-  mid1_pt.mid = mid1;
-  mid1_pt.payload_types = {payload_type};
-  MockRtpPacketSink sink1;
-  AddSink(mid1_pt, &sink1);
-
-  RtpDemuxerCriteria mid2_pt;
-  mid2_pt.mid = mid2;
-  mid2_pt.payload_types = {payload_type};
-  MockRtpPacketSink sink2;
-  AddSink(mid2_pt, &sink2);
-
-  auto packet = CreatePacketWithSsrc(ssrc);
-  packet->SetPayloadType(payload_type);
-
-  EXPECT_CALL(sink1, OnRtpPacket(_)).Times(0);
-  EXPECT_CALL(sink2, OnRtpPacket(_)).Times(0);
-  EXPECT_FALSE(demuxer_.OnRtpPacket(*packet));
-}
-
-// If two sinks are added with different MIDs but the same payload types, then
-// we cannot demux on the payload type only unless one of the sinks is removed.
-TEST_F(RtpDemuxerTest, RoutedByPayloadTypeIfAmbiguousSinkRemoved) {
-  const std::string mid1 = "v";
-  const std::string mid2 = "a";
-  constexpr uint8_t payload_type = 30;
-  constexpr uint32_t ssrc = 10;
-
-  RtpDemuxerCriteria mid1_pt;
-  mid1_pt.mid = mid1;
-  mid1_pt.payload_types = {payload_type};
-  MockRtpPacketSink sink1;
-  AddSink(mid1_pt, &sink1);
-
-  RtpDemuxerCriteria mid2_pt;
-  mid2_pt.mid = mid2;
-  mid2_pt.payload_types = {payload_type};
-  MockRtpPacketSink sink2;
-  AddSink(mid2_pt, &sink2);
-
-  RemoveSink(&sink1);
-
-  auto packet = CreatePacketWithSsrc(ssrc);
-  packet->SetPayloadType(payload_type);
-
-  EXPECT_CALL(sink1, OnRtpPacket(_)).Times(0);
-  EXPECT_CALL(sink2, OnRtpPacket(SamePacketAs(*packet))).Times(1);
-
-  EXPECT_TRUE(demuxer_.OnRtpPacket(*packet));
-}
-
-TEST_F(RtpDemuxerTest, RoutedByPayloadTypeLatchesSsrc) {
-  constexpr uint8_t payload_type = 30;
-  constexpr uint32_t ssrc = 10;
-
-  RtpDemuxerCriteria pt;
-  pt.payload_types = {payload_type};
-  NiceMock<MockRtpPacketSink> sink;
-  AddSink(pt, &sink);
-
-  auto packet_with_pt = CreatePacketWithSsrc(ssrc);
-  packet_with_pt->SetPayloadType(payload_type);
-  ASSERT_TRUE(demuxer_.OnRtpPacket(*packet_with_pt));
-
-  auto packet_with_ssrc = CreatePacketWithSsrc(ssrc);
-  EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet_with_ssrc))).Times(1);
-  EXPECT_TRUE(demuxer_.OnRtpPacket(*packet_with_ssrc));
-}
-
-// RSIDs are scoped within MID, so if two sinks are registered with the same
-// RSIDs but different MIDs, then packets containing both extensions should be
-// routed to the correct one.
-TEST_F(RtpDemuxerTest, PacketWithSameRsidDifferentMidRoutedToProperSink) {
-  const std::string mid1 = "mid1";
-  const std::string mid2 = "mid2";
-  const std::string rsid = "rsid";
-  constexpr uint32_t ssrc1 = 10;
-  constexpr uint32_t ssrc2 = 11;
-
-  NiceMock<MockRtpPacketSink> mid1_sink;
-  AddSinkBothMidRsid(mid1, rsid, &mid1_sink);
-
-  MockRtpPacketSink mid2_sink;
-  AddSinkBothMidRsid(mid2, rsid, &mid2_sink);
-
-  auto packet_mid1 = CreatePacketWithSsrcMidRsid(ssrc1, mid1, rsid);
-  ASSERT_TRUE(demuxer_.OnRtpPacket(*packet_mid1));
-
-  auto packet_mid2 = CreatePacketWithSsrcMidRsid(ssrc2, mid2, rsid);
-  EXPECT_CALL(mid2_sink, OnRtpPacket(SamePacketAs(*packet_mid2))).Times(1);
-  EXPECT_TRUE(demuxer_.OnRtpPacket(*packet_mid2));
-}
-
-// If a sink is first bound to a given SSRC by signaling but later a new sink is
-// bound to a given MID by a later signaling, then when a packet arrives with
-// both the SSRC and MID, then the signaled MID sink should take precedence.
-TEST_F(RtpDemuxerTest, SignaledMidShouldOverwriteSignaledSsrc) {
-  constexpr uint32_t ssrc = 11;
-  const std::string mid = "mid";
-
-  MockRtpPacketSink ssrc_sink;
-  AddSinkOnlySsrc(ssrc, &ssrc_sink);
-
-  MockRtpPacketSink mid_sink;
-  AddSinkOnlyMid(mid, &mid_sink);
-
-  auto p = CreatePacketWithSsrcMid(ssrc, mid);
-  EXPECT_CALL(ssrc_sink, OnRtpPacket(_)).Times(0);
-  EXPECT_CALL(mid_sink, OnRtpPacket(SamePacketAs(*p))).Times(1);
-  EXPECT_TRUE(demuxer_.OnRtpPacket(*p));
-}
-
-// Extends the previous test to also ensure that later packets that do not
-// specify MID are still routed to the MID sink rather than the overwritten SSRC
-// sink.
-TEST_F(RtpDemuxerTest, SignaledMidShouldOverwriteSignalledSsrcPersistent) {
-  constexpr uint32_t ssrc = 11;
-  const std::string mid = "mid";
-
-  MockRtpPacketSink ssrc_sink;
-  AddSinkOnlySsrc(ssrc, &ssrc_sink);
-
-  NiceMock<MockRtpPacketSink> mid_sink;
-  AddSinkOnlyMid(mid, &mid_sink);
-
-  EXPECT_CALL(ssrc_sink, OnRtpPacket(_)).Times(0);
-
-  auto packet_with_mid = CreatePacketWithSsrcMid(ssrc, mid);
-  demuxer_.OnRtpPacket(*packet_with_mid);
-
-  auto packet_without_mid = CreatePacketWithSsrc(ssrc);
-  EXPECT_CALL(mid_sink, OnRtpPacket(SamePacketAs(*packet_without_mid)))
-      .Times(1);
-  EXPECT_TRUE(demuxer_.OnRtpPacket(*packet_without_mid));
-}
-
-TEST_F(RtpDemuxerTest, RouteByPayloadTypeMultipleMatch) {
-  constexpr uint32_t ssrc = 10;
-  constexpr uint8_t pt1 = 30;
-  constexpr uint8_t pt2 = 31;
-
-  MockRtpPacketSink sink;
-  RtpDemuxerCriteria criteria;
-  criteria.payload_types = {pt1, pt2};
-  AddSink(criteria, &sink);
-
-  auto packet_with_pt1 = CreatePacketWithSsrc(ssrc);
-  packet_with_pt1->SetPayloadType(pt1);
-  EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet_with_pt1)));
-  EXPECT_TRUE(demuxer_.OnRtpPacket(*packet_with_pt1));
-
-  auto packet_with_pt2 = CreatePacketWithSsrc(ssrc);
-  packet_with_pt2->SetPayloadType(pt2);
-  EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet_with_pt2)));
-  EXPECT_TRUE(demuxer_.OnRtpPacket(*packet_with_pt2));
-}
-
-TEST_F(RtpDemuxerTest, DontDemuxOnMidAloneIfAddedWithRsid) {
-  const std::string mid = "v";
-  const std::string rsid = "1";
-  constexpr uint32_t ssrc = 10;
-
-  MockRtpPacketSink sink;
-  AddSinkBothMidRsid(mid, rsid, &sink);
-
-  EXPECT_CALL(sink, OnRtpPacket(_)).Times(0);
-
-  auto packet = CreatePacketWithSsrcMid(ssrc, mid);
-  EXPECT_FALSE(demuxer_.OnRtpPacket(*packet));
-}
-
-TEST_F(RtpDemuxerTest, DemuxBySsrcEvenWithMidAndRsid) {
-  const std::string mid = "v";
-  const std::string rsid = "1";
-  constexpr uint32_t ssrc = 10;
-
-  RtpDemuxerCriteria criteria;
-  criteria.rsid = rsid;
-  criteria.mid = mid;
-  criteria.ssrcs = {ssrc};
-  MockRtpPacketSink sink;
-  AddSink(criteria, &sink);
-
-  auto packet = CreatePacketWithSsrc(ssrc);
-  EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet))).Times(1);
-  EXPECT_TRUE(demuxer_.OnRtpPacket(*packet));
-}
-
-// In slight deviation from the BUNDLE spec, if we match a sink according to
-// SSRC, then we do not verify payload type against the criteria and defer to
-// the sink to check that it is correct.
-TEST_F(RtpDemuxerTest, DoNotCheckPayloadTypeIfMatchedByOtherCriteria) {
-  constexpr uint32_t ssrc = 10;
-  constexpr uint8_t payload_type = 30;
-  constexpr uint8_t different_payload_type = payload_type + 1;
-
-  RtpDemuxerCriteria criteria;
-  criteria.ssrcs = {ssrc};
-  criteria.payload_types = {payload_type};
-  MockRtpPacketSink sink;
-  AddSink(criteria, &sink);
-
-  auto packet = CreatePacketWithSsrc(ssrc);
-  packet->SetPayloadType(different_payload_type);
-  EXPECT_CALL(sink, OnRtpPacket(SamePacketAs(*packet))).Times(1);
-  EXPECT_TRUE(demuxer_.OnRtpPacket(*packet));
-}
-
-// If a repair packet includes an RSID it should be ignored and the packet
-// should be routed by its RRID.
-TEST_F(RtpDemuxerTest, PacketWithRsidAndRridRoutedByRrid) {
-  const std::string rsid = "1";
-  const std::string rrid = "1r";
-  constexpr uint32_t ssrc = 10;
-
-  MockRtpPacketSink sink_rsid;
-  AddSinkOnlyRsid(rsid, &sink_rsid);
-
-  MockRtpPacketSink sink_rrid;
-  AddSinkOnlyRsid(rrid, &sink_rrid);
-
-  auto packet = CreatePacketWithSsrcRsidRrid(ssrc, rsid, rrid);
-  EXPECT_CALL(sink_rsid, OnRtpPacket(_)).Times(0);
-  EXPECT_CALL(sink_rrid, OnRtpPacket(SamePacketAs(*packet))).Times(1);
-  EXPECT_TRUE(demuxer_.OnRtpPacket(*packet));
-}
-
-// Same test as above but checks that the latched SSRC routes to the RRID sink.
-TEST_F(RtpDemuxerTest, PacketWithRsidAndRridLatchesSsrcToRrid) {
-  const std::string rsid = "1";
-  const std::string rrid = "1r";
-  constexpr uint32_t ssrc = 10;
-
-  MockRtpPacketSink sink_rsid;
-  AddSinkOnlyRsid(rsid, &sink_rsid);
-
-  NiceMock<MockRtpPacketSink> sink_rrid;
-  AddSinkOnlyRsid(rrid, &sink_rrid);
-
-  auto packet_rsid_rrid = CreatePacketWithSsrcRsidRrid(ssrc, rsid, rrid);
-  demuxer_.OnRtpPacket(*packet_rsid_rrid);
-
-  auto packet_ssrc_only = CreatePacketWithSsrc(ssrc);
-  EXPECT_CALL(sink_rsid, OnRtpPacket(_)).Times(0);
-  EXPECT_CALL(sink_rrid, OnRtpPacket(SamePacketAs(*packet_ssrc_only))).Times(1);
-  EXPECT_TRUE(demuxer_.OnRtpPacket(*packet_ssrc_only));
-}
-
-// Tests that a packet which includes MID and RSID is dropped and not routed by
-// SSRC if the MID and RSID do not match an added sink.
-TEST_F(RtpDemuxerTest, PacketWithMidAndUnknownRsidIsNotRoutedBySsrc) {
-  constexpr uint32_t ssrc = 10;
-  const std::string mid = "v";
-  const std::string rsid = "1";
-  const std::string wrong_rsid = "2";
-
-  RtpDemuxerCriteria criteria;
-  criteria.mid = mid;
-  criteria.rsid = rsid;
-  criteria.ssrcs = {ssrc};
-  MockRtpPacketSink sink;
-  AddSink(criteria, &sink);
-
-  auto packet = CreatePacketWithSsrcMidRsid(ssrc, mid, wrong_rsid);
-  EXPECT_CALL(sink, OnRtpPacket(_)).Times(0);
-  EXPECT_FALSE(demuxer_.OnRtpPacket(*packet));
-}
-
-// Tests that a packet which includes MID and RSID is dropped and not routed by
-// payload type if the MID and RSID do not match an added sink.
-TEST_F(RtpDemuxerTest, PacketWithMidAndUnknownRsidIsNotRoutedByPayloadType) {
-  constexpr uint32_t ssrc = 10;
-  const std::string mid = "v";
-  const std::string rsid = "1";
-  const std::string wrong_rsid = "2";
-  constexpr uint8_t payload_type = 30;
-
-  RtpDemuxerCriteria criteria;
-  criteria.mid = mid;
-  criteria.rsid = rsid;
-  criteria.payload_types = {payload_type};
-  MockRtpPacketSink sink;
-  AddSink(criteria, &sink);
-
-  auto packet = CreatePacketWithSsrcMidRsid(ssrc, mid, wrong_rsid);
-  packet->SetPayloadType(payload_type);
-  EXPECT_CALL(sink, OnRtpPacket(_)).Times(0);
-  EXPECT_FALSE(demuxer_.OnRtpPacket(*packet));
-}
-
-// Observers are only notified of an SSRC binding to an RSID if we care about
-// the RSID (i.e., have a sink added for that RSID).
-TEST_F(RtpDemuxerTest, ObserversNotNotifiedOfUntrackedRsids) {
-  const std::string rsid = "1";
-  constexpr uint32_t ssrc = 111;
-
-  MockSsrcBindingObserver rsid_resolution_observers[3];
-  for (auto& observer : rsid_resolution_observers) {
-    RegisterSsrcBindingObserver(&observer);
-    EXPECT_CALL(observer, OnSsrcBoundToRsid(_, _)).Times(0);
-  }
-
-  // Since no sink is registered for this SSRC/RSID, expect the packet to not be
-  // routed and no observers notified of the SSRC -> RSID binding.
-  EXPECT_FALSE(demuxer_.OnRtpPacket(*CreatePacketWithSsrcRsid(ssrc, rsid)));
-}
-
-// Ensure that observers are notified of SSRC bindings only once per unique
-// binding source (e.g., SSRC -> MID, SSRC -> RSID, etc.)
-TEST_F(RtpDemuxerTest, ObserversNotifiedOfSsrcBoundtoMidOnlyOnce) {
-  const std::string mid = "v";
-  constexpr uint32_t ssrc = 10;
-
-  NiceMock<MockRtpPacketSink> sink;
-  AddSinkOnlyMid(mid, &sink);
-
-  MockSsrcBindingObserver observer;
-  RegisterSsrcBindingObserver(&observer);
-
-  EXPECT_CALL(observer, OnSsrcBoundToMid(mid, ssrc)).Times(1);
-
-  demuxer_.OnRtpPacket(*CreatePacketWithSsrcMid(ssrc, mid));
-  demuxer_.OnRtpPacket(*CreatePacketWithSsrcMid(ssrc, mid));
-}
-
-// Ensure that when a new SSRC -> MID binding is discovered observers are also
-// notified of that, even if there has already been an SSRC bound to the MID.
-TEST_F(RtpDemuxerTest, ObserversNotifiedOfSsrcBoundtoMidWhenSsrcChanges) {
-  const std::string mid = "v";
-  constexpr uint32_t ssrc1 = 10;
-  constexpr uint32_t ssrc2 = 11;
-
-  NiceMock<MockRtpPacketSink> sink;
-  AddSinkOnlyMid(mid, &sink);
-
-  MockSsrcBindingObserver observer;
-  RegisterSsrcBindingObserver(&observer);
-
-  InSequence seq;
-  EXPECT_CALL(observer, OnSsrcBoundToMid(mid, ssrc1)).Times(1);
-  EXPECT_CALL(observer, OnSsrcBoundToMid(mid, ssrc2)).Times(1);
-
-  auto p1 = CreatePacketWithSsrcMid(ssrc1, mid);
-  demuxer_.OnRtpPacket(*p1);
-
-  auto p2 = CreatePacketWithSsrcMid(ssrc2, mid);
-  demuxer_.OnRtpPacket(*p2);
-}
-
-TEST_F(RtpDemuxerTest, DeregisteredRsidObserversNotInformedOfResolutions) {
-  constexpr uint32_t ssrc = 111;
-  const std::string rsid = "a";
-  NiceMock<MockRtpPacketSink> sink;
-  AddSinkOnlyRsid(rsid, &sink);
-
-  // Register several, then deregister only one, to show that not all of the
-  // observers had been forgotten when one was removed.
-  MockSsrcBindingObserver observer_1;
-  MockSsrcBindingObserver observer_2_removed;
-  MockSsrcBindingObserver observer_3;
-
-  RegisterSsrcBindingObserver(&observer_1);
-  RegisterSsrcBindingObserver(&observer_2_removed);
-  RegisterSsrcBindingObserver(&observer_3);
-
-  DeregisterSsrcBindingObserver(&observer_2_removed);
-
-  EXPECT_CALL(observer_1, OnSsrcBoundToRsid(rsid, ssrc)).Times(1);
-  EXPECT_CALL(observer_2_removed, OnSsrcBoundToRsid(_, _)).Times(0);
-  EXPECT_CALL(observer_3, OnSsrcBoundToRsid(rsid, ssrc)).Times(1);
-
-  // The expected calls to OnSsrcBoundToRsid() will be triggered by this.
-  demuxer_.OnRtpPacket(*CreatePacketWithSsrcRsid(ssrc, rsid));
-}
-
-TEST_F(RtpDemuxerTest,
-       PacketFittingBothRsidSinkAndSsrcSinkTriggersResolutionCallbacks) {
-  constexpr uint32_t ssrc = 111;
-  NiceMock<MockRtpPacketSink> ssrc_sink;
-  AddSinkOnlySsrc(ssrc, &ssrc_sink);
-
-  const std::string rsid = "a";
-  NiceMock<MockRtpPacketSink> rsid_sink;
-  AddSinkOnlyRsid(rsid, &rsid_sink);
-
-  MockSsrcBindingObserver observer;
-  RegisterSsrcBindingObserver(&observer);
-
-  auto packet = CreatePacketWithSsrcRsid(ssrc, rsid);
-  EXPECT_CALL(observer, OnSsrcBoundToRsid(rsid, ssrc)).Times(1);
-  demuxer_.OnRtpPacket(*packet);
-}
-
-TEST_F(RtpDemuxerTest, MaliciousPeerCannotCauseMemoryOveruse) {
-  const std::string mid = "v";
-
-  NiceMock<MockRtpPacketSink> sink;
-  AddSinkOnlyMid(mid, &sink);
-
-  MockSsrcBindingObserver observer;
-  RegisterSsrcBindingObserver(&observer);
-
-  EXPECT_CALL(observer, OnSsrcBoundToMid(_, _))
-      .Times(AtMost(RtpDemuxer::kMaxSsrcBindings));
-
-  for (int i = 0; i < RtpDemuxer::kMaxSsrcBindings + 1; i++) {
-    auto packet = CreatePacketWithSsrcMid(i, mid);
-    EXPECT_TRUE(demuxer_.OnRtpPacket(*packet));
-  }
-}
-
-#if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
-
-TEST_F(RtpDemuxerTest, CriteriaMustBeNonEmpty) {
-  MockRtpPacketSink sink;
-  RtpDemuxerCriteria criteria;
-  EXPECT_DEATH(AddSink(criteria, &sink), "");
-}
-
-TEST_F(RtpDemuxerTest, RsidMustBeAlphaNumeric) {
-  MockRtpPacketSink sink;
-  EXPECT_DEATH(AddSinkOnlyRsid("a_3", &sink), "");
-}
-
-TEST_F(RtpDemuxerTest, MidMustBeAlphaNumeric) {
-  MockRtpPacketSink sink;
-  EXPECT_DEATH(AddSinkOnlyMid("a_3", &sink), "");
-}
-
-TEST_F(RtpDemuxerTest, RsidMustNotExceedMaximumLength) {
-  MockRtpPacketSink sink;
-  std::string rsid(StreamId::kMaxSize + 1, 'a');
-  EXPECT_DEATH(AddSinkOnlyRsid(rsid, &sink), "");
-}
-
-TEST_F(RtpDemuxerTest, MidMustNotExceedMaximumLength) {
-  MockRtpPacketSink sink;
-  std::string mid(Mid::kMaxSize + 1, 'a');
-  EXPECT_DEATH(AddSinkOnlyMid(mid, &sink), "");
-}
-
-TEST_F(RtpDemuxerTest, DoubleRegisterationOfSsrcBindingObserverDisallowed) {
-  MockSsrcBindingObserver observer;
-  RegisterSsrcBindingObserver(&observer);
-  EXPECT_DEATH(RegisterSsrcBindingObserver(&observer), "");
-}
-
-TEST_F(RtpDemuxerTest,
-       DregisterationOfNeverRegisteredSsrcBindingObserverDisallowed) {
-  MockSsrcBindingObserver observer;
-  EXPECT_DEATH(DeregisterSsrcBindingObserver(&observer), "");
-}
-
-#endif
-
-}  // namespace
-}  // namespace webrtc
diff --git a/call/rtp_packet_sink_interface.h b/call/rtp_packet_sink_interface.h
deleted file mode 100644
index 0b3e64e..0000000
--- a/call/rtp_packet_sink_interface.h
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- *  Copyright (c) 2017 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_CALL_RTP_PACKET_SINK_INTERFACE_H_
-#define WEBRTC_CALL_RTP_PACKET_SINK_INTERFACE_H_
-
-namespace webrtc {
-
-class RtpPacketReceived;
-
-// This class represents a receiver of already parsed RTP packets.
-class RtpPacketSinkInterface {
- public:
-  virtual ~RtpPacketSinkInterface() = default;
-  virtual void OnRtpPacket(const RtpPacketReceived& packet) = 0;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_CALL_RTP_PACKET_SINK_INTERFACE_H_
diff --git a/call/rtp_rtcp_demuxer_helper.cc b/call/rtp_rtcp_demuxer_helper.cc
deleted file mode 100644
index e8d3cbf..0000000
--- a/call/rtp_rtcp_demuxer_helper.cc
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- *  Copyright (c) 2017 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/call/rtp_rtcp_demuxer_helper.h"
-
-#include "webrtc/modules/rtp_rtcp/source/byte_io.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/bye.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/common_header.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/extended_reports.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/psfb.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/receiver_report.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/rtpfb.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/sender_report.h"
-
-namespace webrtc {
-
-rtc::Optional<uint32_t> ParseRtcpPacketSenderSsrc(
-    rtc::ArrayView<const uint8_t> packet) {
-  rtcp::CommonHeader header;
-  for (const uint8_t* next_packet = packet.begin(); next_packet < packet.end();
-       next_packet = header.NextPacket()) {
-    if (!header.Parse(next_packet, packet.end() - next_packet)) {
-      return rtc::Optional<uint32_t>();
-    }
-
-    switch (header.type()) {
-      case rtcp::Bye::kPacketType:
-      case rtcp::ExtendedReports::kPacketType:
-      case rtcp::Psfb::kPacketType:
-      case rtcp::ReceiverReport::kPacketType:
-      case rtcp::Rtpfb::kPacketType:
-      case rtcp::SenderReport::kPacketType: {
-        // Sender SSRC at the beginning of the RTCP payload.
-        if (header.payload_size_bytes() >= sizeof(uint32_t)) {
-          const uint32_t ssrc_sender =
-              ByteReader<uint32_t>::ReadBigEndian(header.payload());
-          return rtc::Optional<uint32_t>(ssrc_sender);
-        } else {
-          return rtc::Optional<uint32_t>();
-        }
-      }
-    }
-  }
-
-  return rtc::Optional<uint32_t>();
-}
-
-}  // namespace webrtc
diff --git a/call/rtp_rtcp_demuxer_helper.h b/call/rtp_rtcp_demuxer_helper.h
deleted file mode 100644
index 0a4767d..0000000
--- a/call/rtp_rtcp_demuxer_helper.h
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- *  Copyright (c) 2017 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_CALL_RTP_RTCP_DEMUXER_HELPER_H_
-#define WEBRTC_CALL_RTP_RTCP_DEMUXER_HELPER_H_
-
-#include <algorithm>
-#include <map>
-#include <utility>
-
-#include "webrtc/api/array_view.h"
-#include "webrtc/api/optional.h"
-#include "webrtc/rtc_base/basictypes.h"
-
-namespace webrtc {
-
-// TODO(eladalon): Remove this in the next CL.
-template <typename Container>
-bool MultimapAssociationExists(const Container& multimap,
-                               const typename Container::key_type& key,
-                               const typename Container::mapped_type& val) {
-  auto it_range = multimap.equal_range(key);
-  using Reference = typename Container::const_reference;
-  return std::any_of(it_range.first, it_range.second,
-                     [val](Reference elem) { return elem.second == val; });
-}
-
-template <typename Container, typename Value>
-size_t RemoveFromMultimapByValue(Container* multimap, const Value& value) {
-  size_t count = 0;
-  for (auto it = multimap->begin(); it != multimap->end();) {
-    if (it->second == value) {
-      it = multimap->erase(it);
-      ++count;
-    } else {
-      ++it;
-    }
-  }
-  return count;
-}
-
-template <typename Map, typename Value>
-size_t RemoveFromMapByValue(Map* map, const Value& value) {
-  size_t count = 0;
-  for (auto it = map->begin(); it != map->end();) {
-    if (it->second == value) {
-      it = map->erase(it);
-      ++count;
-    } else {
-      ++it;
-    }
-  }
-  return count;
-}
-
-template <typename Container, typename Key>
-bool ContainerHasKey(const Container& c, const Key& k) {
-  return std::find(c.cbegin(), c.cend(), k) != c.cend();
-}
-
-// TODO(eladalon): Remove this in the next CL.
-template <typename Container>
-bool MultimapHasValue(const Container& c,
-                      const typename Container::mapped_type& v) {
-  auto predicate = [v](const typename Container::value_type& it) {
-    return it.second == v;
-  };
-  return std::any_of(c.cbegin(), c.cend(), predicate);
-}
-
-template <typename Map>
-bool MapHasValue(const Map& map, const typename Map::mapped_type& value) {
-  auto predicate = [value](const typename Map::value_type& it) {
-    return it.second == value;
-  };
-  return std::any_of(map.cbegin(), map.cend(), predicate);
-}
-
-template <typename Container>
-bool MultimapHasKey(const Container& c,
-                    const typename Container::key_type& key) {
-  auto it_range = c.equal_range(key);
-  return it_range.first != it_range.second;
-}
-
-rtc::Optional<uint32_t> ParseRtcpPacketSenderSsrc(
-    rtc::ArrayView<const uint8_t> packet);
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_CALL_RTP_RTCP_DEMUXER_HELPER_H_
diff --git a/call/rtp_rtcp_demuxer_helper_unittest.cc b/call/rtp_rtcp_demuxer_helper_unittest.cc
deleted file mode 100644
index 96a1383..0000000
--- a/call/rtp_rtcp_demuxer_helper_unittest.cc
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- *  Copyright (c) 2017 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 <cstdio>
-
-#include "webrtc/call/rtp_rtcp_demuxer_helper.h"
-
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/bye.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/extended_jitter_report.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/extended_reports.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/pli.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/rapid_resync_request.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/receiver_report.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/sender_report.h"
-#include "webrtc/rtc_base/arraysize.h"
-#include "webrtc/rtc_base/basictypes.h"
-#include "webrtc/rtc_base/buffer.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-namespace {
-constexpr uint32_t kSsrc = 8374;
-}  // namespace
-
-TEST(RtpRtcpDemuxerHelperTest, ParseRtcpPacketSenderSsrc_ByePacket) {
-  webrtc::rtcp::Bye rtcp_packet;
-  rtcp_packet.SetSenderSsrc(kSsrc);
-  rtc::Buffer raw_packet = rtcp_packet.Build();
-
-  rtc::Optional<uint32_t> ssrc = ParseRtcpPacketSenderSsrc(raw_packet);
-  EXPECT_EQ(ssrc, kSsrc);
-}
-
-TEST(RtpRtcpDemuxerHelperTest,
-     ParseRtcpPacketSenderSsrc_ExtendedReportsPacket) {
-  webrtc::rtcp::ExtendedReports rtcp_packet;
-  rtcp_packet.SetSenderSsrc(kSsrc);
-  rtc::Buffer raw_packet = rtcp_packet.Build();
-
-  rtc::Optional<uint32_t> ssrc = ParseRtcpPacketSenderSsrc(raw_packet);
-  EXPECT_EQ(ssrc, kSsrc);
-}
-
-TEST(RtpRtcpDemuxerHelperTest, ParseRtcpPacketSenderSsrc_PsfbPacket) {
-  webrtc::rtcp::Pli rtcp_packet;  // Psfb is abstract; use a subclass.
-  rtcp_packet.SetSenderSsrc(kSsrc);
-  rtc::Buffer raw_packet = rtcp_packet.Build();
-
-  rtc::Optional<uint32_t> ssrc = ParseRtcpPacketSenderSsrc(raw_packet);
-  EXPECT_EQ(ssrc, kSsrc);
-}
-
-TEST(RtpRtcpDemuxerHelperTest, ParseRtcpPacketSenderSsrc_ReceiverReportPacket) {
-  webrtc::rtcp::ReceiverReport rtcp_packet;
-  rtcp_packet.SetSenderSsrc(kSsrc);
-  rtc::Buffer raw_packet = rtcp_packet.Build();
-
-  rtc::Optional<uint32_t> ssrc = ParseRtcpPacketSenderSsrc(raw_packet);
-  EXPECT_EQ(ssrc, kSsrc);
-}
-
-TEST(RtpRtcpDemuxerHelperTest, ParseRtcpPacketSenderSsrc_RtpfbPacket) {
-  // Rtpfb is abstract; use a subclass.
-  webrtc::rtcp::RapidResyncRequest rtcp_packet;
-  rtcp_packet.SetSenderSsrc(kSsrc);
-  rtc::Buffer raw_packet = rtcp_packet.Build();
-
-  rtc::Optional<uint32_t> ssrc = ParseRtcpPacketSenderSsrc(raw_packet);
-  EXPECT_EQ(ssrc, kSsrc);
-}
-
-TEST(RtpRtcpDemuxerHelperTest, ParseRtcpPacketSenderSsrc_SenderReportPacket) {
-  webrtc::rtcp::SenderReport rtcp_packet;
-  rtcp_packet.SetSenderSsrc(kSsrc);
-  rtc::Buffer raw_packet = rtcp_packet.Build();
-
-  rtc::Optional<uint32_t> ssrc = ParseRtcpPacketSenderSsrc(raw_packet);
-  EXPECT_EQ(ssrc, kSsrc);
-}
-
-TEST(RtpRtcpDemuxerHelperTest, ParseRtcpPacketSenderSsrc_MalformedRtcpPacket) {
-  uint8_t garbage[100];
-  memset(&garbage[0], 0, arraysize(garbage));
-
-  rtc::Optional<uint32_t> ssrc = ParseRtcpPacketSenderSsrc(garbage);
-  EXPECT_FALSE(ssrc);
-}
-
-TEST(RtpRtcpDemuxerHelperTest,
-     ParseRtcpPacketSenderSsrc_RtcpMessageWithoutSenderSsrc) {
-  webrtc::rtcp::ExtendedJitterReport rtcp_packet;  // Has no sender SSRC.
-  rtc::Buffer raw_packet = rtcp_packet.Build();
-
-  rtc::Optional<uint32_t> ssrc = ParseRtcpPacketSenderSsrc(raw_packet);
-  EXPECT_FALSE(ssrc);
-}
-
-TEST(RtpRtcpDemuxerHelperTest, ParseRtcpPacketSenderSsrc_TruncatedRtcpMessage) {
-  webrtc::rtcp::Bye rtcp_packet;
-  rtcp_packet.SetSenderSsrc(kSsrc);
-  rtc::Buffer raw_packet = rtcp_packet.Build();
-
-  constexpr size_t rtcp_length_bytes = 8;
-  ASSERT_EQ(rtcp_length_bytes, raw_packet.size());
-
-  rtc::Optional<uint32_t> ssrc = ParseRtcpPacketSenderSsrc(
-      rtc::ArrayView<const uint8_t>(raw_packet.data(), rtcp_length_bytes - 1));
-  EXPECT_FALSE(ssrc);
-}
-
-}  // namespace webrtc
diff --git a/call/rtp_stream_receiver_controller.cc b/call/rtp_stream_receiver_controller.cc
deleted file mode 100644
index 94fa83b..0000000
--- a/call/rtp_stream_receiver_controller.cc
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- *  Copyright (c) 2017 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/call/rtp_stream_receiver_controller.h"
-
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/ptr_util.h"
-
-namespace webrtc {
-
-RtpStreamReceiverController::Receiver::Receiver(
-    RtpStreamReceiverController* controller,
-    uint32_t ssrc,
-    RtpPacketSinkInterface* sink)
-    : controller_(controller), sink_(sink) {
-  const bool sink_added = controller_->AddSink(ssrc, sink_);
-  if (!sink_added) {
-    LOG(LS_ERROR) << "RtpStreamReceiverController::Receiver::Receiver: Sink "
-                  << "could not be added for SSRC=" << ssrc << ".";
-  }
-}
-
-RtpStreamReceiverController::Receiver::~Receiver() {
-  // Don't require return value > 0, since for RTX we currently may
-  // have multiple Receiver objects with the same sink.
-  // TODO(nisse): Consider adding a DCHECK when RtxReceiveStream is wired up.
-  controller_->RemoveSink(sink_);
-}
-
-RtpStreamReceiverController::RtpStreamReceiverController() = default;
-RtpStreamReceiverController::~RtpStreamReceiverController() = default;
-
-std::unique_ptr<RtpStreamReceiverInterface>
-RtpStreamReceiverController::CreateReceiver(
-    uint32_t ssrc,
-    RtpPacketSinkInterface* sink) {
-  return rtc::MakeUnique<Receiver>(this, ssrc, sink);
-}
-
-bool RtpStreamReceiverController::OnRtpPacket(const RtpPacketReceived& packet) {
-  rtc::CritScope cs(&lock_);
-  return demuxer_.OnRtpPacket(packet);
-}
-
-bool RtpStreamReceiverController::AddSink(uint32_t ssrc,
-                                          RtpPacketSinkInterface* sink) {
-  rtc::CritScope cs(&lock_);
-  return demuxer_.AddSink(ssrc, sink);
-}
-
-size_t RtpStreamReceiverController::RemoveSink(
-    const RtpPacketSinkInterface* sink) {
-  rtc::CritScope cs(&lock_);
-  return demuxer_.RemoveSink(sink);
-}
-
-}  // namespace webrtc
diff --git a/call/rtp_stream_receiver_controller.h b/call/rtp_stream_receiver_controller.h
deleted file mode 100644
index feec5e4..0000000
--- a/call/rtp_stream_receiver_controller.h
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- *  Copyright (c) 2017 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_CALL_RTP_STREAM_RECEIVER_CONTROLLER_H_
-#define WEBRTC_CALL_RTP_STREAM_RECEIVER_CONTROLLER_H_
-
-#include <memory>
-
-#include "webrtc/call/rtp_demuxer.h"
-#include "webrtc/call/rtp_stream_receiver_controller_interface.h"
-#include "webrtc/rtc_base/criticalsection.h"
-
-namespace webrtc {
-
-class RtpPacketReceived;
-
-// This class represents the RTP receive parsing and demuxing, for a
-// single RTP session.
-// TODO(nisse): Add RTCP processing, we should aim to terminate RTCP
-// and not leave any RTCP processing to individual receive streams.
-// TODO(nisse): Extract per-packet processing, including parsing and
-// demuxing, into a separate class.
-class RtpStreamReceiverController
-    : public RtpStreamReceiverControllerInterface {
- public:
-  RtpStreamReceiverController();
-  ~RtpStreamReceiverController() override;
-
-  // Implements RtpStreamReceiverControllerInterface.
-  std::unique_ptr<RtpStreamReceiverInterface> CreateReceiver(
-      uint32_t ssrc,
-      RtpPacketSinkInterface* sink) override;
-
-  // Thread-safe wrappers for the corresponding RtpDemuxer methods.
-  bool AddSink(uint32_t ssrc, RtpPacketSinkInterface* sink) override;
-  size_t RemoveSink(const RtpPacketSinkInterface* sink) override;
-
-  // TODO(nisse): Not yet responsible for parsing.
-  bool OnRtpPacket(const RtpPacketReceived& packet);
-
- private:
-  class Receiver : public RtpStreamReceiverInterface {
-   public:
-    Receiver(RtpStreamReceiverController* controller,
-             uint32_t ssrc,
-             RtpPacketSinkInterface* sink);
-
-    ~Receiver() override;
-
-   private:
-    RtpStreamReceiverController* const controller_;
-    RtpPacketSinkInterface* const sink_;
-  };
-
-  // TODO(nisse): Move to a TaskQueue for synchronization. When used
-  // by Call, we expect construction and all methods but OnRtpPacket
-  // to be called on the same thread, and OnRtpPacket to be called
-  // by a single, but possibly distinct, thread. But applications not
-  // using Call may have use threads differently.
-  rtc::CriticalSection lock_;
-  RtpDemuxer demuxer_ RTC_GUARDED_BY(&lock_);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_CALL_RTP_STREAM_RECEIVER_CONTROLLER_H_
diff --git a/call/rtp_stream_receiver_controller_interface.h b/call/rtp_stream_receiver_controller_interface.h
deleted file mode 100644
index 94b4f10..0000000
--- a/call/rtp_stream_receiver_controller_interface.h
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- *  Copyright (c) 2017 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_CALL_RTP_STREAM_RECEIVER_CONTROLLER_INTERFACE_H_
-#define WEBRTC_CALL_RTP_STREAM_RECEIVER_CONTROLLER_INTERFACE_H_
-
-#include <memory>
-
-#include "webrtc/call/rtp_packet_sink_interface.h"
-
-namespace webrtc {
-
-// An RtpStreamReceiver is responsible for the rtp-specific but
-// media-independent state needed for receiving an RTP stream.
-// TODO(nisse): Currently, only owns the association between ssrc and
-// the stream's RtpPacketSinkInterface. Ownership of corresponding
-// objects from modules/rtp_rtcp/ should move to this class (or
-// rather, the corresponding implementation class). We should add
-// methods for getting rtp receive stats, and for sending RTCP
-// messages related to the receive stream.
-class RtpStreamReceiverInterface {
- public:
-  virtual ~RtpStreamReceiverInterface() {}
-};
-
-// This class acts as a factory for RtpStreamReceiver objects.
-class RtpStreamReceiverControllerInterface {
- public:
-  virtual ~RtpStreamReceiverControllerInterface() {}
-
-  virtual std::unique_ptr<RtpStreamReceiverInterface> CreateReceiver(
-      uint32_t ssrc,
-      RtpPacketSinkInterface* sink) = 0;
-  // For registering additional sinks, needed for FlexFEC.
-  virtual bool AddSink(uint32_t ssrc, RtpPacketSinkInterface* sink) = 0;
-  virtual size_t RemoveSink(const RtpPacketSinkInterface* sink) = 0;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_CALL_RTP_STREAM_RECEIVER_CONTROLLER_INTERFACE_H_
diff --git a/call/rtp_transport_controller_send.cc b/call/rtp_transport_controller_send.cc
deleted file mode 100644
index ec061d0..0000000
--- a/call/rtp_transport_controller_send.cc
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- *  Copyright (c) 2017 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/call/rtp_transport_controller_send.h"
-
-namespace webrtc {
-
-RtpTransportControllerSend::RtpTransportControllerSend(
-    Clock* clock,
-    webrtc::RtcEventLog* event_log)
-    : pacer_(clock, &packet_router_, event_log),
-      send_side_cc_(clock, nullptr /* observer */, event_log, &pacer_) {}
-
-PacketRouter* RtpTransportControllerSend::packet_router() {
-  return &packet_router_;
-}
-
-PacedSender* RtpTransportControllerSend::pacer() {
-  return &pacer_;
-}
-
-SendSideCongestionController* RtpTransportControllerSend::send_side_cc() {
-  return &send_side_cc_;
-}
-
-TransportFeedbackObserver*
-RtpTransportControllerSend::transport_feedback_observer() {
-  return &send_side_cc_;
-}
-
-RtpPacketSender* RtpTransportControllerSend::packet_sender() {
-  return &pacer_;
-}
-
-const RtpKeepAliveConfig& RtpTransportControllerSend::keepalive_config() const {
-  return keepalive_;
-}
-
-void RtpTransportControllerSend::SetAllocatedSendBitrateLimits(
-    int min_send_bitrate_bps,
-    int max_padding_bitrate_bps) {
-  pacer_.SetSendBitrateLimits(min_send_bitrate_bps, max_padding_bitrate_bps);
-}
-
-void RtpTransportControllerSend::SetKeepAliveConfig(
-    const RtpKeepAliveConfig& config) {
-  keepalive_ = config;
-}
-
-}  // namespace webrtc
diff --git a/call/rtp_transport_controller_send.h b/call/rtp_transport_controller_send.h
deleted file mode 100644
index 766a2e3..0000000
--- a/call/rtp_transport_controller_send.h
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- *  Copyright (c) 2017 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_CALL_RTP_TRANSPORT_CONTROLLER_SEND_H_
-#define WEBRTC_CALL_RTP_TRANSPORT_CONTROLLER_SEND_H_
-
-#include "webrtc/call/rtp_transport_controller_send_interface.h"
-#include "webrtc/common_types.h"
-#include "webrtc/modules/congestion_controller/include/send_side_congestion_controller.h"
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace webrtc {
-class Clock;
-class RtcEventLog;
-
-// TODO(nisse): When we get the underlying transports here, we should
-// have one object implementing RtpTransportControllerSendInterface
-// per transport, sharing the same congestion controller.
-class RtpTransportControllerSend : public RtpTransportControllerSendInterface {
- public:
-  RtpTransportControllerSend(Clock* clock, webrtc::RtcEventLog* event_log);
-
-  // Implements RtpTransportControllerSendInterface
-  PacketRouter* packet_router() override;
-  // TODO(holmer): Temporarily exposed, should be removed and the
-  // appropriate methods should be added to this class instead.
-  // In addition the PacedSender should be driven by this class, either
-  // by owning the process thread, or later by using a task queue.
-  PacedSender* pacer() override;
-  SendSideCongestionController* send_side_cc() override;
-  TransportFeedbackObserver* transport_feedback_observer() override;
-  RtpPacketSender* packet_sender() override;
-  const RtpKeepAliveConfig& keepalive_config() const override;
-
-  void SetAllocatedSendBitrateLimits(int min_send_bitrate_bps,
-                                     int max_padding_bitrate_bps) override;
-
-  void SetKeepAliveConfig(const RtpKeepAliveConfig& config);
-
- private:
-  PacketRouter packet_router_;
-  PacedSender pacer_;
-  SendSideCongestionController send_side_cc_;
-  RtpKeepAliveConfig keepalive_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(RtpTransportControllerSend);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_CALL_RTP_TRANSPORT_CONTROLLER_SEND_H_
diff --git a/call/rtp_transport_controller_send_interface.h b/call/rtp_transport_controller_send_interface.h
deleted file mode 100644
index b580421..0000000
--- a/call/rtp_transport_controller_send_interface.h
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- *  Copyright (c) 2017 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_CALL_RTP_TRANSPORT_CONTROLLER_SEND_INTERFACE_H_
-#define WEBRTC_CALL_RTP_TRANSPORT_CONTROLLER_SEND_INTERFACE_H_
-
-namespace webrtc {
-
-class PacedSender;
-class PacketRouter;
-class RtpPacketSender;
-struct RtpKeepAliveConfig;
-class SendSideCongestionController;
-class TransportFeedbackObserver;
-
-// An RtpTransportController should own everything related to the RTP
-// transport to/from a remote endpoint. We should have separate
-// interfaces for send and receive side, even if they are implemented
-// by the same class. This is an ongoing refactoring project. At some
-// point, this class should be promoted to a public api under
-// webrtc/api/rtp/.
-//
-// For a start, this object is just a collection of the objects needed
-// by the VideoSendStream constructor. The plan is to move ownership
-// of all RTP-related objects here, and add methods to create per-ssrc
-// objects which would then be passed to VideoSendStream. Eventually,
-// direct accessors like packet_router() should be removed.
-//
-// This should also have a reference to the underlying
-// webrtc::Transport(s). Currently, webrtc::Transport is implemented by
-// WebRtcVideoChannel and WebRtcVoiceMediaChannel, and owned by
-// WebrtcSession. Video and audio always uses different transport
-// objects, even in the common case where they are bundled over the
-// same underlying transport.
-//
-// Extracting the logic of the webrtc::Transport from BaseChannel and
-// subclasses into a separate class seems to be a prerequesite for
-// moving the transport here.
-class RtpTransportControllerSendInterface {
- public:
-  virtual ~RtpTransportControllerSendInterface() {}
-  virtual PacketRouter* packet_router() = 0;
-  virtual PacedSender* pacer() = 0;
-  // Currently returning the same pointer, but with different types.
-  virtual SendSideCongestionController* send_side_cc() = 0;
-  virtual TransportFeedbackObserver* transport_feedback_observer() = 0;
-
-  virtual RtpPacketSender* packet_sender() = 0;
-  virtual const RtpKeepAliveConfig& keepalive_config() const = 0;
-
-  // SetAllocatedSendBitrateLimits sets bitrates limits imposed by send codec
-  // settings.
-  // |min_send_bitrate_bps| is the total minimum send bitrate required by all
-  // sending streams.  This is the minimum bitrate the PacedSender will use.
-  // Note that SendSideCongestionController::OnNetworkChanged can still be
-  // called with a lower bitrate estimate. |max_padding_bitrate_bps| is the max
-  // bitrate the send streams request for padding. This can be higher than the
-  // current network estimate and tells the PacedSender how much it should max
-  // pad unless there is real packets to send.
-  virtual void SetAllocatedSendBitrateLimits(int min_send_bitrate_bps,
-                                             int max_padding_bitrate_bps) = 0;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_CALL_RTP_TRANSPORT_CONTROLLER_SEND_INTERFACE_H_
diff --git a/call/rtx_receive_stream.cc b/call/rtx_receive_stream.cc
deleted file mode 100644
index 6a5432f..0000000
--- a/call/rtx_receive_stream.cc
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- *  Copyright (c) 2017 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/call/rtx_receive_stream.h"
-#include "webrtc/modules/rtp_rtcp/include/receive_statistics.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_packet_received.h"
-#include "webrtc/rtc_base/logging.h"
-
-namespace webrtc {
-
-RtxReceiveStream::RtxReceiveStream(
-    RtpPacketSinkInterface* media_sink,
-    std::map<int, int> associated_payload_types,
-    uint32_t media_ssrc,
-    ReceiveStatistics* rtp_receive_statistics /* = nullptr */)
-    : media_sink_(media_sink),
-      associated_payload_types_(std::move(associated_payload_types)),
-      media_ssrc_(media_ssrc),
-      rtp_receive_statistics_(rtp_receive_statistics) {
-  if (associated_payload_types_.empty()) {
-    LOG(LS_WARNING)
-        << "RtxReceiveStream created with empty payload type mapping.";
-  }
-}
-
-RtxReceiveStream::~RtxReceiveStream() = default;
-
-void RtxReceiveStream::OnRtpPacket(const RtpPacketReceived& rtx_packet) {
-  if (rtp_receive_statistics_) {
-    RTPHeader header;
-    rtx_packet.GetHeader(&header);
-    rtp_receive_statistics_->IncomingPacket(header, rtx_packet.size(),
-                                            false /* retransmitted */);
-  }
-  rtc::ArrayView<const uint8_t> payload = rtx_packet.payload();
-
-  if (payload.size() < kRtxHeaderSize) {
-    return;
-  }
-
-  auto it = associated_payload_types_.find(rtx_packet.PayloadType());
-  if (it == associated_payload_types_.end()) {
-    LOG(LS_VERBOSE) << "Unknown payload type "
-                    << static_cast<int>(rtx_packet.PayloadType())
-                    << " on rtx ssrc " << rtx_packet.Ssrc();
-    return;
-  }
-  RtpPacketReceived media_packet;
-  media_packet.CopyHeaderFrom(rtx_packet);
-
-  media_packet.SetSsrc(media_ssrc_);
-  media_packet.SetSequenceNumber((payload[0] << 8) + payload[1]);
-  media_packet.SetPayloadType(it->second);
-  media_packet.set_recovered(true);
-
-  // Skip the RTX header.
-  rtc::ArrayView<const uint8_t> rtx_payload =
-      payload.subview(kRtxHeaderSize);
-
-  uint8_t* media_payload = media_packet.AllocatePayload(rtx_payload.size());
-  RTC_DCHECK(media_payload != nullptr);
-
-  memcpy(media_payload, rtx_payload.data(), rtx_payload.size());
-
-  media_sink_->OnRtpPacket(media_packet);
-}
-
-}  // namespace webrtc
diff --git a/call/rtx_receive_stream.h b/call/rtx_receive_stream.h
deleted file mode 100644
index c288a27..0000000
--- a/call/rtx_receive_stream.h
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- *  Copyright (c) 2017 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_CALL_RTX_RECEIVE_STREAM_H_
-#define WEBRTC_CALL_RTX_RECEIVE_STREAM_H_
-
-#include <map>
-
-#include "webrtc/call/rtp_packet_sink_interface.h"
-
-namespace webrtc {
-
-class ReceiveStatistics;
-
-// This class is responsible for RTX decapsulation. The resulting media packets
-// are passed on to a sink representing the associated media stream.
-class RtxReceiveStream : public RtpPacketSinkInterface {
- public:
-  RtxReceiveStream(RtpPacketSinkInterface* media_sink,
-                   std::map<int, int> associated_payload_types,
-                   uint32_t media_ssrc,
-                   // TODO(nisse): Delete this argument, and
-                   // corresponding member variable, by moving the
-                   // responsibility for rtcp feedback to
-                   // RtpStreamReceiverController.
-                   ReceiveStatistics* rtp_receive_statistics = nullptr);
-  ~RtxReceiveStream() override;
-  // RtpPacketSinkInterface.
-  void OnRtpPacket(const RtpPacketReceived& packet) override;
-
- private:
-  RtpPacketSinkInterface* const media_sink_;
-  // Map from rtx payload type -> media payload type.
-  const std::map<int, int> associated_payload_types_;
-  // TODO(nisse): Ultimately, the media receive stream shouldn't care about the
-  // ssrc, and we should delete this.
-  const uint32_t media_ssrc_;
-  ReceiveStatistics* const rtp_receive_statistics_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_CALL_RTX_RECEIVE_STREAM_H_
diff --git a/call/rtx_receive_stream_unittest.cc b/call/rtx_receive_stream_unittest.cc
deleted file mode 100644
index 2b2625d..0000000
--- a/call/rtx_receive_stream_unittest.cc
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- *  Copyright (c) 2017 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/call/rtx_receive_stream.h"
-#include "webrtc/call/test/mock_rtp_packet_sink_interface.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_header_extension_map.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_header_extensions.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_packet_received.h"
-#include "webrtc/test/gmock.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-namespace {
-
-using ::testing::_;
-using ::testing::StrictMock;
-
-constexpr int kMediaPayloadType = 100;
-constexpr int kRtxPayloadType = 98;
-constexpr int kUnknownPayloadType = 90;
-constexpr uint32_t kMediaSSRC = 0x3333333;
-constexpr uint16_t kMediaSeqno = 0x5657;
-
-constexpr uint8_t kRtxPacket[] = {
-    0x80,                    // Version 2.
-    98,                      // Payload type.
-    0x12, 0x34,              // Seqno.
-    0x11, 0x11, 0x11, 0x11,  // Timestamp.
-    0x22, 0x22, 0x22, 0x22,  // SSRC.
-    // RTX header.
-    0x56, 0x57,              // Orig seqno.
-    // Payload.
-    0xee,
-};
-
-constexpr uint8_t kRtxPacketWithCVO[] = {
-    0x90,                    // Version 2, X set.
-    98,                      // Payload type.
-    0x12, 0x34,              // Seqno.
-    0x11, 0x11, 0x11, 0x11,  // Timestamp.
-    0x22, 0x22, 0x22, 0x22,  // SSRC.
-    0xbe, 0xde, 0x00, 0x01,  // Extension header.
-    0x30, 0x01, 0x00, 0x00,  // 90 degree rotation.
-    // RTX header.
-    0x56, 0x57,              // Orig seqno.
-    // Payload.
-    0xee,
-};
-
-std::map<int, int> PayloadTypeMapping() {
-  const std::map<int, int> m = {{kRtxPayloadType, kMediaPayloadType}};
-  return m;
-}
-
-template <typename T>
-rtc::ArrayView<T> Truncate(rtc::ArrayView<T> a, size_t drop) {
-  return a.subview(0, a.size() - drop);
-}
-
-}  // namespace
-
-TEST(RtxReceiveStreamTest, RestoresPacketPayload) {
-  StrictMock<MockRtpPacketSink> media_sink;
-  RtxReceiveStream rtx_sink(&media_sink, PayloadTypeMapping(), kMediaSSRC);
-  RtpPacketReceived rtx_packet;
-  EXPECT_TRUE(rtx_packet.Parse(rtc::ArrayView<const uint8_t>(kRtxPacket)));
-
-  EXPECT_CALL(media_sink, OnRtpPacket(_)).WillOnce(testing::Invoke(
-      [](const RtpPacketReceived& packet) {
-        EXPECT_EQ(packet.SequenceNumber(), kMediaSeqno);
-        EXPECT_EQ(packet.Ssrc(), kMediaSSRC);
-        EXPECT_EQ(packet.PayloadType(), kMediaPayloadType);
-        EXPECT_THAT(packet.payload(), testing::ElementsAre(0xee));
-      }));
-
-  rtx_sink.OnRtpPacket(rtx_packet);
-}
-
-TEST(RtxReceiveStreamTest, SetsRecoveredFlag) {
-  StrictMock<MockRtpPacketSink> media_sink;
-  RtxReceiveStream rtx_sink(&media_sink, PayloadTypeMapping(), kMediaSSRC);
-  RtpPacketReceived rtx_packet;
-  EXPECT_TRUE(rtx_packet.Parse(rtc::ArrayView<const uint8_t>(kRtxPacket)));
-  EXPECT_FALSE(rtx_packet.recovered());
-  EXPECT_CALL(media_sink, OnRtpPacket(_))
-      .WillOnce(testing::Invoke([](const RtpPacketReceived& packet) {
-        EXPECT_TRUE(packet.recovered());
-      }));
-
-  rtx_sink.OnRtpPacket(rtx_packet);
-}
-
-TEST(RtxReceiveStreamTest, IgnoresUnknownPayloadType) {
-  StrictMock<MockRtpPacketSink> media_sink;
-  const std::map<int, int> payload_type_mapping = {
-      {kUnknownPayloadType, kMediaPayloadType}};
-
-  RtxReceiveStream rtx_sink(&media_sink, payload_type_mapping, kMediaSSRC);
-  RtpPacketReceived rtx_packet;
-  EXPECT_TRUE(rtx_packet.Parse(rtc::ArrayView<const uint8_t>(kRtxPacket)));
-  rtx_sink.OnRtpPacket(rtx_packet);
-}
-
-TEST(RtxReceiveStreamTest, IgnoresTruncatedPacket) {
-  StrictMock<MockRtpPacketSink> media_sink;
-  RtxReceiveStream rtx_sink(&media_sink, PayloadTypeMapping(), kMediaSSRC);
-  RtpPacketReceived rtx_packet;
-  EXPECT_TRUE(
-      rtx_packet.Parse(Truncate(rtc::ArrayView<const uint8_t>(kRtxPacket), 2)));
-  rtx_sink.OnRtpPacket(rtx_packet);
-}
-
-TEST(RtxReceiveStreamTest, CopiesRtpHeaderExtensions) {
-  StrictMock<MockRtpPacketSink> media_sink;
-  RtxReceiveStream rtx_sink(&media_sink, PayloadTypeMapping(), kMediaSSRC);
-  RtpHeaderExtensionMap extension_map;
-  extension_map.RegisterByType(3, kRtpExtensionVideoRotation);
-  RtpPacketReceived rtx_packet(&extension_map);
-  EXPECT_TRUE(rtx_packet.Parse(
-      rtc::ArrayView<const uint8_t>(kRtxPacketWithCVO)));
-
-  VideoRotation rotation = kVideoRotation_0;
-  EXPECT_TRUE(rtx_packet.GetExtension<VideoOrientation>(&rotation));
-  EXPECT_EQ(kVideoRotation_90, rotation);
-
-  EXPECT_CALL(media_sink, OnRtpPacket(_)).WillOnce(testing::Invoke(
-      [](const RtpPacketReceived& packet) {
-        EXPECT_EQ(packet.SequenceNumber(), kMediaSeqno);
-        EXPECT_EQ(packet.Ssrc(), kMediaSSRC);
-        EXPECT_EQ(packet.PayloadType(), kMediaPayloadType);
-        EXPECT_THAT(packet.payload(), testing::ElementsAre(0xee));
-        VideoRotation rotation = kVideoRotation_0;
-        EXPECT_TRUE(packet.GetExtension<VideoOrientation>(&rotation));
-        EXPECT_EQ(rotation, kVideoRotation_90);
-      }));
-
-  rtx_sink.OnRtpPacket(rtx_packet);
-}
-
-}  // namespace webrtc
diff --git a/call/ssrc_binding_observer.h b/call/ssrc_binding_observer.h
deleted file mode 100644
index 205a5c9..0000000
--- a/call/ssrc_binding_observer.h
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- *  Copyright (c) 2017 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_CALL_SSRC_BINDING_OBSERVER_H_
-#define WEBRTC_CALL_SSRC_BINDING_OBSERVER_H_
-
-#include <string>
-
-#include "webrtc/rtc_base/basictypes.h"
-
-namespace webrtc {
-
-// With newer versions of SDP, SSRC is often not explicitly signaled and must
-// be learned on the fly. This happens by correlating packet SSRCs with included
-// RTP extension headers like MID and RSID, or by receiving information from
-// RTCP messages.
-// SsrcBindingObservers will be notified when a new binding is learned, which
-// can happen during call setup and/or during the call.
-class SsrcBindingObserver {
- public:
-  virtual ~SsrcBindingObserver() = default;
-
-  virtual void OnSsrcBoundToRsid(const std::string& rsid, uint32_t ssrc) {}
-
-  virtual void OnSsrcBoundToMid(const std::string& mid, uint32_t ssrc) {}
-
-  virtual void OnSsrcBoundToMidRsid(const std::string& mid,
-                                    const std::string& rsid,
-                                    uint32_t ssrc) {}
-
-  virtual void OnSsrcBoundToPayloadType(uint8_t payload_type, uint32_t ssrc) {}
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_CALL_SSRC_BINDING_OBSERVER_H_
diff --git a/call/syncable.cc b/call/syncable.cc
deleted file mode 100644
index c254e4f..0000000
--- a/call/syncable.cc
+++ /dev/null
@@ -1,17 +0,0 @@
-/*
- *  Copyright (c) 2017 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/call/syncable.h"
-
-namespace webrtc {
-
-Syncable::~Syncable() = default;
-
-}  // namespace webrtc
diff --git a/call/syncable.h b/call/syncable.h
deleted file mode 100644
index 2692a8a..0000000
--- a/call/syncable.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- *  Copyright (c) 2017 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.
- */
-
-// Syncable is used by RtpStreamsSynchronizer in VideoReceiveStream, and
-// implemented by AudioReceiveStream.
-
-#ifndef WEBRTC_CALL_SYNCABLE_H_
-#define WEBRTC_CALL_SYNCABLE_H_
-
-#include <stdint.h>
-
-#include "webrtc/api/optional.h"
-
-namespace webrtc {
-
-class Syncable {
- public:
-  struct Info {
-    int64_t latest_receive_time_ms = 0;
-    uint32_t latest_received_capture_timestamp = 0;
-    uint32_t capture_time_ntp_secs = 0;
-    uint32_t capture_time_ntp_frac = 0;
-    uint32_t capture_time_source_clock = 0;
-    int current_delay_ms = 0;
-  };
-
-  virtual ~Syncable();
-
-  virtual int id() const = 0;
-  virtual rtc::Optional<Info> GetInfo() const = 0;
-  virtual uint32_t GetPlayoutTimestamp() const = 0;
-  virtual void SetMinimumPlayoutDelay(int delay_ms) = 0;
-};
-}  // namespace webrtc
-
-#endif  // WEBRTC_CALL_SYNCABLE_H_
diff --git a/call/test/mock_rtp_packet_sink_interface.h b/call/test/mock_rtp_packet_sink_interface.h
deleted file mode 100644
index a139004..0000000
--- a/call/test/mock_rtp_packet_sink_interface.h
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- *  Copyright (c) 2017 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_CALL_TEST_MOCK_RTP_PACKET_SINK_INTERFACE_H_
-#define WEBRTC_CALL_TEST_MOCK_RTP_PACKET_SINK_INTERFACE_H_
-
-#include "webrtc/call/rtp_packet_sink_interface.h"
-
-#include "webrtc/test/gmock.h"
-
-namespace webrtc {
-
-class MockRtpPacketSink : public RtpPacketSinkInterface {
- public:
-  MOCK_METHOD1(OnRtpPacket, void(const RtpPacketReceived&));
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_CALL_TEST_MOCK_RTP_PACKET_SINK_INTERFACE_H_
diff --git a/call/video_config.cc b/call/video_config.cc
deleted file mode 100644
index e06d5e8..0000000
--- a/call/video_config.cc
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- *  Copyright (c) 2014 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/call/video_config.h"
-
-#include <algorithm>
-#include <sstream>
-#include <string>
-
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-VideoStream::VideoStream()
-    : width(0),
-      height(0),
-      max_framerate(-1),
-      min_bitrate_bps(-1),
-      target_bitrate_bps(-1),
-      max_bitrate_bps(-1),
-      max_qp(-1) {}
-
-VideoStream::~VideoStream() = default;
-
-std::string VideoStream::ToString() const {
-  std::stringstream ss;
-  ss << "{width: " << width;
-  ss << ", height: " << height;
-  ss << ", max_framerate: " << max_framerate;
-  ss << ", min_bitrate_bps:" << min_bitrate_bps;
-  ss << ", target_bitrate_bps:" << target_bitrate_bps;
-  ss << ", max_bitrate_bps:" << max_bitrate_bps;
-  ss << ", max_qp: " << max_qp;
-
-  ss << ", temporal_layer_thresholds_bps: [";
-  for (size_t i = 0; i < temporal_layer_thresholds_bps.size(); ++i) {
-    ss << temporal_layer_thresholds_bps[i];
-    if (i != temporal_layer_thresholds_bps.size() - 1)
-      ss << ", ";
-  }
-  ss << ']';
-
-  ss << '}';
-  return ss.str();
-}
-
-VideoEncoderConfig::VideoEncoderConfig()
-    : content_type(ContentType::kRealtimeVideo),
-      encoder_specific_settings(nullptr),
-      min_transmit_bitrate_bps(0),
-      max_bitrate_bps(0),
-      number_of_streams(0) {}
-
-VideoEncoderConfig::VideoEncoderConfig(VideoEncoderConfig&&) = default;
-
-VideoEncoderConfig::~VideoEncoderConfig() = default;
-
-std::string VideoEncoderConfig::ToString() const {
-  std::stringstream ss;
-  ss << "{content_type: ";
-  switch (content_type) {
-    case ContentType::kRealtimeVideo:
-      ss << "kRealtimeVideo";
-      break;
-    case ContentType::kScreen:
-      ss << "kScreenshare";
-      break;
-  }
-  ss << ", encoder_specific_settings: ";
-  ss << (encoder_specific_settings != NULL ? "(ptr)" : "NULL");
-
-  ss << ", min_transmit_bitrate_bps: " << min_transmit_bitrate_bps;
-  ss << '}';
-  return ss.str();
-}
-
-VideoEncoderConfig::VideoEncoderConfig(const VideoEncoderConfig&) = default;
-
-void VideoEncoderConfig::EncoderSpecificSettings::FillEncoderSpecificSettings(
-    VideoCodec* codec) const {
-  if (codec->codecType == kVideoCodecH264) {
-    FillVideoCodecH264(codec->H264());
-  } else if (codec->codecType == kVideoCodecVP8) {
-    FillVideoCodecVp8(codec->VP8());
-  } else if (codec->codecType == kVideoCodecVP9) {
-    FillVideoCodecVp9(codec->VP9());
-  } else {
-    RTC_NOTREACHED() << "Encoder specifics set/used for unknown codec type.";
-  }
-}
-
-void VideoEncoderConfig::EncoderSpecificSettings::FillVideoCodecH264(
-    VideoCodecH264* h264_settings) const {
-  RTC_NOTREACHED();
-}
-
-void VideoEncoderConfig::EncoderSpecificSettings::FillVideoCodecVp8(
-    VideoCodecVP8* vp8_settings) const {
-  RTC_NOTREACHED();
-}
-
-void VideoEncoderConfig::EncoderSpecificSettings::FillVideoCodecVp9(
-    VideoCodecVP9* vp9_settings) const {
-  RTC_NOTREACHED();
-}
-
-VideoEncoderConfig::H264EncoderSpecificSettings::H264EncoderSpecificSettings(
-    const VideoCodecH264& specifics)
-    : specifics_(specifics) {}
-
-void VideoEncoderConfig::H264EncoderSpecificSettings::FillVideoCodecH264(
-    VideoCodecH264* h264_settings) const {
-  *h264_settings = specifics_;
-}
-
-VideoEncoderConfig::Vp8EncoderSpecificSettings::Vp8EncoderSpecificSettings(
-    const VideoCodecVP8& specifics)
-    : specifics_(specifics) {}
-
-void VideoEncoderConfig::Vp8EncoderSpecificSettings::FillVideoCodecVp8(
-    VideoCodecVP8* vp8_settings) const {
-  *vp8_settings = specifics_;
-}
-
-VideoEncoderConfig::Vp9EncoderSpecificSettings::Vp9EncoderSpecificSettings(
-    const VideoCodecVP9& specifics)
-    : specifics_(specifics) {}
-
-void VideoEncoderConfig::Vp9EncoderSpecificSettings::FillVideoCodecVp9(
-    VideoCodecVP9* vp9_settings) const {
-  *vp9_settings = specifics_;
-}
-
-}  // namespace webrtc
diff --git a/call/video_config.h b/call/video_config.h
deleted file mode 100644
index 4a98d01..0000000
--- a/call/video_config.h
+++ /dev/null
@@ -1,157 +0,0 @@
-/*
- *  Copyright (c) 2013 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_CALL_VIDEO_CONFIG_H_
-#define WEBRTC_CALL_VIDEO_CONFIG_H_
-
-#include <string>
-#include <vector>
-
-#include "webrtc/api/optional.h"
-#include "webrtc/common_types.h"
-#include "webrtc/rtc_base/basictypes.h"
-#include "webrtc/rtc_base/refcount.h"
-#include "webrtc/rtc_base/scoped_ref_ptr.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-struct VideoStream {
-  VideoStream();
-  ~VideoStream();
-  std::string ToString() const;
-
-  size_t width;
-  size_t height;
-  int max_framerate;
-
-  int min_bitrate_bps;
-  int target_bitrate_bps;
-  int max_bitrate_bps;
-
-  int max_qp;
-
-  // Bitrate thresholds for enabling additional temporal layers. Since these are
-  // thresholds in between layers, we have one additional layer. One threshold
-  // gives two temporal layers, one below the threshold and one above, two give
-  // three, and so on.
-  // The VideoEncoder may redistribute bitrates over the temporal layers so a
-  // bitrate threshold of 100k and an estimate of 105k does not imply that we
-  // get 100k in one temporal layer and 5k in the other, just that the bitrate
-  // in the first temporal layer should not exceed 100k.
-  // TODO(kthelgason): Apart from a special case for two-layer screencast these
-  // thresholds are not propagated to the VideoEncoder. To be implemented.
-  std::vector<int> temporal_layer_thresholds_bps;
-};
-
-class VideoEncoderConfig {
- public:
-  // These are reference counted to permit copying VideoEncoderConfig and be
-  // kept alive until all encoder_specific_settings go out of scope.
-  // TODO(kthelgason): Consider removing the need for copying VideoEncoderConfig
-  // and use rtc::Optional for encoder_specific_settings instead.
-  class EncoderSpecificSettings : public rtc::RefCountInterface {
-   public:
-    // TODO(pbos): Remove FillEncoderSpecificSettings as soon as VideoCodec is
-    // not in use and encoder implementations ask for codec-specific structs
-    // directly.
-    void FillEncoderSpecificSettings(VideoCodec* codec_struct) const;
-
-    virtual void FillVideoCodecVp8(VideoCodecVP8* vp8_settings) const;
-    virtual void FillVideoCodecVp9(VideoCodecVP9* vp9_settings) const;
-    virtual void FillVideoCodecH264(VideoCodecH264* h264_settings) const;
-
-   private:
-    ~EncoderSpecificSettings() override {}
-    friend class VideoEncoderConfig;
-  };
-
-  class H264EncoderSpecificSettings : public EncoderSpecificSettings {
-   public:
-    explicit H264EncoderSpecificSettings(const VideoCodecH264& specifics);
-    void FillVideoCodecH264(VideoCodecH264* h264_settings) const override;
-
-   private:
-    VideoCodecH264 specifics_;
-  };
-
-  class Vp8EncoderSpecificSettings : public EncoderSpecificSettings {
-   public:
-    explicit Vp8EncoderSpecificSettings(const VideoCodecVP8& specifics);
-    void FillVideoCodecVp8(VideoCodecVP8* vp8_settings) const override;
-
-   private:
-    VideoCodecVP8 specifics_;
-  };
-
-  class Vp9EncoderSpecificSettings : public EncoderSpecificSettings {
-   public:
-    explicit Vp9EncoderSpecificSettings(const VideoCodecVP9& specifics);
-    void FillVideoCodecVp9(VideoCodecVP9* vp9_settings) const override;
-
-   private:
-    VideoCodecVP9 specifics_;
-  };
-
-  enum class ContentType {
-    kRealtimeVideo,
-    kScreen,
-  };
-
-  class VideoStreamFactoryInterface : public rtc::RefCountInterface {
-   public:
-    // An implementation should return a std::vector<VideoStream> with the
-    // wanted VideoStream settings for the given video resolution.
-    // The size of the vector may not be larger than
-    // |encoder_config.number_of_streams|.
-    virtual std::vector<VideoStream> CreateEncoderStreams(
-        int width,
-        int height,
-        const VideoEncoderConfig& encoder_config) = 0;
-
-   protected:
-    ~VideoStreamFactoryInterface() override {}
-  };
-
-  VideoEncoderConfig& operator=(VideoEncoderConfig&&) = default;
-  VideoEncoderConfig& operator=(const VideoEncoderConfig&) = delete;
-
-  // Mostly used by tests.  Avoid creating copies if you can.
-  VideoEncoderConfig Copy() const { return VideoEncoderConfig(*this); }
-
-  VideoEncoderConfig();
-  VideoEncoderConfig(VideoEncoderConfig&&);
-  ~VideoEncoderConfig();
-  std::string ToString() const;
-
-  rtc::scoped_refptr<VideoStreamFactoryInterface> video_stream_factory;
-  std::vector<SpatialLayer> spatial_layers;
-  ContentType content_type;
-  rtc::scoped_refptr<const EncoderSpecificSettings> encoder_specific_settings;
-
-  // Padding will be used up to this bitrate regardless of the bitrate produced
-  // by the encoder. Padding above what's actually produced by the encoder helps
-  // maintaining a higher bitrate estimate. Padding will however not be sent
-  // unless the estimated bandwidth indicates that the link can handle it.
-  int min_transmit_bitrate_bps;
-  int max_bitrate_bps;
-
-  // Max number of encoded VideoStreams to produce.
-  size_t number_of_streams;
-
- private:
-  // Access to the copy constructor is private to force use of the Copy()
-  // method for those exceptional cases where we do use it.
-  VideoEncoderConfig(const VideoEncoderConfig&);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_CALL_VIDEO_CONFIG_H_
diff --git a/call/video_receive_stream.cc b/call/video_receive_stream.cc
deleted file mode 100644
index ef6c608..0000000
--- a/call/video_receive_stream.cc
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- *  Copyright (c) 2017 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/call/video_receive_stream.h"
-
-namespace webrtc {
-
-VideoReceiveStream::Decoder::Decoder() = default;
-VideoReceiveStream::Decoder::Decoder(const Decoder&) = default;
-VideoReceiveStream::Decoder::~Decoder() = default;
-
-std::string VideoReceiveStream::Decoder::ToString() const {
-  std::stringstream ss;
-  ss << "{decoder: " << (decoder ? "(VideoDecoder)" : "nullptr");
-  ss << ", payload_type: " << payload_type;
-  ss << ", payload_name: " << payload_name;
-  ss << ", codec_params: {";
-  for (const auto& it : codec_params)
-    ss << it.first << ": " << it.second;
-  ss << '}';
-  ss << '}';
-
-  return ss.str();
-}
-
-VideoReceiveStream::Stats::Stats() = default;
-VideoReceiveStream::Stats::~Stats() = default;
-
-std::string VideoReceiveStream::Stats::ToString(int64_t time_ms) const {
-  std::stringstream ss;
-  ss << "VideoReceiveStream stats: " << time_ms << ", {ssrc: " << ssrc << ", ";
-  ss << "total_bps: " << total_bitrate_bps << ", ";
-  ss << "width: " << width << ", ";
-  ss << "height: " << height << ", ";
-  ss << "key: " << frame_counts.key_frames << ", ";
-  ss << "delta: " << frame_counts.delta_frames << ", ";
-  ss << "network_fps: " << network_frame_rate << ", ";
-  ss << "decode_fps: " << decode_frame_rate << ", ";
-  ss << "render_fps: " << render_frame_rate << ", ";
-  ss << "decode_ms: " << decode_ms << ", ";
-  ss << "max_decode_ms: " << max_decode_ms << ", ";
-  ss << "cur_delay_ms: " << current_delay_ms << ", ";
-  ss << "targ_delay_ms: " << target_delay_ms << ", ";
-  ss << "jb_delay_ms: " << jitter_buffer_ms << ", ";
-  ss << "min_playout_delay_ms: " << min_playout_delay_ms << ", ";
-  ss << "discarded: " << discarded_packets << ", ";
-  ss << "sync_offset_ms: " << sync_offset_ms << ", ";
-  ss << "cum_loss: " << rtcp_stats.packets_lost << ", ";
-  ss << "max_ext_seq: " << rtcp_stats.extended_highest_sequence_number << ", ";
-  ss << "nack: " << rtcp_packet_type_counts.nack_packets << ", ";
-  ss << "fir: " << rtcp_packet_type_counts.fir_packets << ", ";
-  ss << "pli: " << rtcp_packet_type_counts.pli_packets;
-  ss << '}';
-  return ss.str();
-}
-
-VideoReceiveStream::Config::Config(const Config&) = default;
-VideoReceiveStream::Config::Config(Config&&) = default;
-VideoReceiveStream::Config::Config(Transport* rtcp_send_transport)
-    : rtcp_send_transport(rtcp_send_transport) {}
-
-VideoReceiveStream::Config& VideoReceiveStream::Config::operator=(Config&&) =
-    default;
-VideoReceiveStream::Config::Config::~Config() = default;
-
-std::string VideoReceiveStream::Config::ToString() const {
-  std::stringstream ss;
-  ss << "{decoders: [";
-  for (size_t i = 0; i < decoders.size(); ++i) {
-    ss << decoders[i].ToString();
-    if (i != decoders.size() - 1)
-      ss << ", ";
-  }
-  ss << ']';
-  ss << ", rtp: " << rtp.ToString();
-  ss << ", renderer: " << (renderer ? "(renderer)" : "nullptr");
-  ss << ", render_delay_ms: " << render_delay_ms;
-  if (!sync_group.empty())
-    ss << ", sync_group: " << sync_group;
-  ss << ", pre_decode_callback: "
-     << (pre_decode_callback ? "(EncodedFrameObserver)" : "nullptr");
-  ss << ", target_delay_ms: " << target_delay_ms;
-  ss << '}';
-
-  return ss.str();
-}
-
-VideoReceiveStream::Config::Rtp::Rtp() = default;
-VideoReceiveStream::Config::Rtp::Rtp(const Rtp&) = default;
-VideoReceiveStream::Config::Rtp::~Rtp() = default;
-
-std::string VideoReceiveStream::Config::Rtp::ToString() const {
-  std::stringstream ss;
-  ss << "{remote_ssrc: " << remote_ssrc;
-  ss << ", local_ssrc: " << local_ssrc;
-  ss << ", rtcp_mode: "
-     << (rtcp_mode == RtcpMode::kCompound ? "RtcpMode::kCompound"
-                                          : "RtcpMode::kReducedSize");
-  ss << ", rtcp_xr: ";
-  ss << "{receiver_reference_time_report: "
-     << (rtcp_xr.receiver_reference_time_report ? "on" : "off");
-  ss << '}';
-  ss << ", remb: " << (remb ? "on" : "off");
-  ss << ", transport_cc: " << (transport_cc ? "on" : "off");
-  ss << ", nack: {rtp_history_ms: " << nack.rtp_history_ms << '}';
-  ss << ", ulpfec: " << ulpfec.ToString();
-  ss << ", rtx_ssrc: " << rtx_ssrc;
-  ss << ", rtx_payload_types: {";
-  for (auto& kv : rtx_associated_payload_types) {
-    ss << kv.first << " (pt) -> " << kv.second << " (apt), ";
-  }
-  ss << '}';
-  ss << ", extensions: [";
-  for (size_t i = 0; i < extensions.size(); ++i) {
-    ss << extensions[i].ToString();
-    if (i != extensions.size() - 1)
-      ss << ", ";
-  }
-  ss << ']';
-  ss << '}';
-  return ss.str();
-}
-
-}  // namespace webrtc
diff --git a/call/video_receive_stream.h b/call/video_receive_stream.h
deleted file mode 100644
index f199ca1..0000000
--- a/call/video_receive_stream.h
+++ /dev/null
@@ -1,260 +0,0 @@
-/*
- *  Copyright (c) 2013 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_CALL_VIDEO_RECEIVE_STREAM_H_
-#define WEBRTC_CALL_VIDEO_RECEIVE_STREAM_H_
-
-#include <limits>
-#include <map>
-#include <string>
-#include <vector>
-
-#include "webrtc/api/call/transport.h"
-#include "webrtc/api/rtpparameters.h"
-#include "webrtc/call/rtp_config.h"
-#include "webrtc/common_types.h"
-#include "webrtc/common_video/include/frame_callback.h"
-#include "webrtc/media/base/videosinkinterface.h"
-#include "webrtc/rtc_base/platform_file.h"
-
-namespace webrtc {
-
-class RtpPacketSinkInterface;
-class VideoDecoder;
-
-class VideoReceiveStream {
- public:
-  // TODO(mflodman) Move all these settings to VideoDecoder and move the
-  // declaration to common_types.h.
-  struct Decoder {
-    Decoder();
-    Decoder(const Decoder&);
-    ~Decoder();
-    std::string ToString() const;
-
-    // The actual decoder instance.
-    VideoDecoder* decoder = nullptr;
-
-    // Received RTP packets with this payload type will be sent to this decoder
-    // instance.
-    int payload_type = 0;
-
-    // Name of the decoded payload (such as VP8). Maps back to the depacketizer
-    // used to unpack incoming packets.
-    std::string payload_name;
-
-    // This map contains the codec specific parameters from SDP, i.e. the "fmtp"
-    // parameters. It is the same as cricket::CodecParameterMap used in
-    // cricket::VideoCodec.
-    std::map<std::string, std::string> codec_params;
-  };
-
-  struct Stats {
-    Stats();
-    ~Stats();
-    std::string ToString(int64_t time_ms) const;
-
-    int network_frame_rate = 0;
-    int decode_frame_rate = 0;
-    int render_frame_rate = 0;
-    uint32_t frames_rendered = 0;
-
-    // Decoder stats.
-    std::string decoder_implementation_name = "unknown";
-    FrameCounts frame_counts;
-    int decode_ms = 0;
-    int max_decode_ms = 0;
-    int current_delay_ms = 0;
-    int target_delay_ms = 0;
-    int jitter_buffer_ms = 0;
-    int min_playout_delay_ms = 0;
-    int render_delay_ms = 10;
-    int64_t interframe_delay_max_ms = -1;
-    uint32_t frames_decoded = 0;
-    rtc::Optional<uint64_t> qp_sum;
-
-    int current_payload_type = -1;
-
-    int total_bitrate_bps = 0;
-    int discarded_packets = 0;
-
-    int width = 0;
-    int height = 0;
-
-    VideoContentType content_type = VideoContentType::UNSPECIFIED;
-
-    int sync_offset_ms = std::numeric_limits<int>::max();
-
-    uint32_t ssrc = 0;
-    std::string c_name;
-    StreamDataCounters rtp_stats;
-    RtcpPacketTypeCounter rtcp_packet_type_counts;
-    RtcpStatistics rtcp_stats;
-
-    // Timing frame info: all important timestamps for a full lifetime of a
-    // single 'timing frame'.
-    rtc::Optional<webrtc::TimingFrameInfo> timing_frame_info;
-  };
-
-  struct Config {
-   private:
-    // Access to the copy constructor is private to force use of the Copy()
-    // method for those exceptional cases where we do use it.
-    Config(const Config&);
-
-   public:
-    Config() = delete;
-    Config(Config&&);
-    explicit Config(Transport* rtcp_send_transport);
-    Config& operator=(Config&&);
-    Config& operator=(const Config&) = delete;
-    ~Config();
-
-    // Mostly used by tests.  Avoid creating copies if you can.
-    Config Copy() const { return Config(*this); }
-
-    std::string ToString() const;
-
-    // Decoders for every payload that we can receive.
-    std::vector<Decoder> decoders;
-
-    // Receive-stream specific RTP settings.
-    struct Rtp {
-      Rtp();
-      Rtp(const Rtp&);
-      ~Rtp();
-      std::string ToString() const;
-
-      // Synchronization source (stream identifier) to be received.
-      uint32_t remote_ssrc = 0;
-
-      // Sender SSRC used for sending RTCP (such as receiver reports).
-      uint32_t local_ssrc = 0;
-
-      // See RtcpMode for description.
-      RtcpMode rtcp_mode = RtcpMode::kCompound;
-
-      // Extended RTCP settings.
-      struct RtcpXr {
-        // True if RTCP Receiver Reference Time Report Block extension
-        // (RFC 3611) should be enabled.
-        bool receiver_reference_time_report = false;
-      } rtcp_xr;
-
-      // TODO(nisse): This remb setting is currently set but never
-      // applied. REMB logic is now the responsibility of
-      // PacketRouter, and it will generate REMB feedback if
-      // OnReceiveBitrateChanged is used, which depends on how the
-      // estimators belonging to the ReceiveSideCongestionController
-      // are configured. Decide if this setting should be deleted, and
-      // if it needs to be replaced by a setting in PacketRouter to
-      // disable REMB feedback.
-
-      // See draft-alvestrand-rmcat-remb for information.
-      bool remb = false;
-
-      // See draft-holmer-rmcat-transport-wide-cc-extensions for details.
-      bool transport_cc = false;
-
-      // See NackConfig for description.
-      NackConfig nack;
-
-      // See UlpfecConfig for description.
-      // TODO(nisse): UlpfecConfig includes the field red_rtx_payload_type,
-      // which duplicates info in the rtx_associated_payload_types mapping. So
-      // delete the use of UlpfecConfig here, and replace by the values which
-      // make sense in this context, likely those are ulpfec_payload_type_ and
-      // red_payload_type_.
-      UlpfecConfig ulpfec;
-
-      // SSRC for retransmissions.
-      uint32_t rtx_ssrc = 0;
-
-      // Set if the stream is protected using FlexFEC.
-      bool protected_by_flexfec = false;
-
-      // Map from rtx payload type -> media payload type.
-      // For RTX to be enabled, both an SSRC and this mapping are needed.
-      std::map<int, int> rtx_associated_payload_types;
-      // TODO(nisse): This is a temporary accessor function to enable
-      // reversing and renaming of the rtx_payload_types mapping.
-      void AddRtxBinding(int rtx_payload_type, int media_payload_type) {
-        rtx_associated_payload_types[rtx_payload_type] = media_payload_type;
-      }
-
-      // RTP header extensions used for the received stream.
-      std::vector<RtpExtension> extensions;
-    } rtp;
-
-    // Transport for outgoing packets (RTCP).
-    Transport* rtcp_send_transport = nullptr;
-
-    // Must not be 'nullptr' when the stream is started.
-    rtc::VideoSinkInterface<VideoFrame>* renderer = nullptr;
-
-    // Expected delay needed by the renderer, i.e. the frame will be delivered
-    // this many milliseconds, if possible, earlier than the ideal render time.
-    // Only valid if 'renderer' is set.
-    int render_delay_ms = 10;
-
-    // If set, pass frames on to the renderer as soon as they are
-    // available.
-    bool disable_prerenderer_smoothing = false;
-
-    // Identifier for an A/V synchronization group. Empty string to disable.
-    // TODO(pbos): Synchronize streams in a sync group, not just video streams
-    // to one of the audio streams.
-    std::string sync_group;
-
-    // Called for each incoming video frame, i.e. in encoded state. E.g. used
-    // when
-    // saving the stream to a file. 'nullptr' disables the callback.
-    EncodedFrameObserver* pre_decode_callback = nullptr;
-
-    // Target delay in milliseconds. A positive value indicates this stream is
-    // used for streaming instead of a real-time call.
-    int target_delay_ms = 0;
-  };
-
-  // Starts stream activity.
-  // When a stream is active, it can receive, process and deliver packets.
-  virtual void Start() = 0;
-  // Stops stream activity.
-  // When a stream is stopped, it can't receive, process or deliver packets.
-  virtual void Stop() = 0;
-
-  // TODO(pbos): Add info on currently-received codec to Stats.
-  virtual Stats GetStats() const = 0;
-
-  // Takes ownership of the file, is responsible for closing it later.
-  // Calling this method will close and finalize any current log.
-  // Giving rtc::kInvalidPlatformFileValue disables logging.
-  // If a frame to be written would make the log too large the write fails and
-  // the log is closed and finalized. A |byte_limit| of 0 means no limit.
-  virtual void EnableEncodedFrameRecording(rtc::PlatformFile file,
-                                           size_t byte_limit) = 0;
-  inline void DisableEncodedFrameRecording() {
-    EnableEncodedFrameRecording(rtc::kInvalidPlatformFileValue, 0);
-  }
-
-  // RtpDemuxer only forwards a given RTP packet to one sink. However, some
-  // sinks, such as FlexFEC, might wish to be informed of all of the packets
-  // a given sink receives (or any set of sinks). They may do so by registering
-  // themselves as secondary sinks.
-  virtual void AddSecondarySink(RtpPacketSinkInterface* sink) = 0;
-  virtual void RemoveSecondarySink(const RtpPacketSinkInterface* sink) = 0;
-
- protected:
-  virtual ~VideoReceiveStream() {}
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_CALL_VIDEO_RECEIVE_STREAM_H_
diff --git a/call/video_send_stream.cc b/call/video_send_stream.cc
deleted file mode 100644
index f6ea13f..0000000
--- a/call/video_send_stream.cc
+++ /dev/null
@@ -1,162 +0,0 @@
-/*
- *  Copyright (c) 2017 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/call/video_send_stream.h"
-
-namespace webrtc {
-
-VideoSendStream::StreamStats::StreamStats() = default;
-VideoSendStream::StreamStats::~StreamStats() = default;
-
-std::string VideoSendStream::StreamStats::ToString() const {
-  std::stringstream ss;
-  ss << "width: " << width << ", ";
-  ss << "height: " << height << ", ";
-  ss << "key: " << frame_counts.key_frames << ", ";
-  ss << "delta: " << frame_counts.delta_frames << ", ";
-  ss << "total_bps: " << total_bitrate_bps << ", ";
-  ss << "retransmit_bps: " << retransmit_bitrate_bps << ", ";
-  ss << "avg_delay_ms: " << avg_delay_ms << ", ";
-  ss << "max_delay_ms: " << max_delay_ms << ", ";
-  ss << "cum_loss: " << rtcp_stats.packets_lost << ", ";
-  ss << "max_ext_seq: " << rtcp_stats.extended_highest_sequence_number << ", ";
-  ss << "nack: " << rtcp_packet_type_counts.nack_packets << ", ";
-  ss << "fir: " << rtcp_packet_type_counts.fir_packets << ", ";
-  ss << "pli: " << rtcp_packet_type_counts.pli_packets;
-  return ss.str();
-}
-
-VideoSendStream::Stats::Stats() = default;
-VideoSendStream::Stats::~Stats() = default;
-
-std::string VideoSendStream::Stats::ToString(int64_t time_ms) const {
-  std::stringstream ss;
-  ss << "VideoSendStream stats: " << time_ms << ", {";
-  ss << "input_fps: " << input_frame_rate << ", ";
-  ss << "encode_fps: " << encode_frame_rate << ", ";
-  ss << "encode_ms: " << avg_encode_time_ms << ", ";
-  ss << "encode_usage_perc: " << encode_usage_percent << ", ";
-  ss << "target_bps: " << target_media_bitrate_bps << ", ";
-  ss << "media_bps: " << media_bitrate_bps << ", ";
-  ss << "preferred_media_bitrate_bps: " << preferred_media_bitrate_bps << ", ";
-  ss << "suspended: " << (suspended ? "true" : "false") << ", ";
-  ss << "bw_adapted: " << (bw_limited_resolution ? "true" : "false");
-  ss << '}';
-  for (const auto& substream : substreams) {
-    if (!substream.second.is_rtx && !substream.second.is_flexfec) {
-      ss << " {ssrc: " << substream.first << ", ";
-      ss << substream.second.ToString();
-      ss << '}';
-    }
-  }
-  return ss.str();
-}
-
-VideoSendStream::Config::Config(const Config&) = default;
-VideoSendStream::Config::Config(Config&&) = default;
-VideoSendStream::Config::Config(Transport* send_transport)
-    : send_transport(send_transport) {}
-
-VideoSendStream::Config& VideoSendStream::Config::operator=(Config&&) = default;
-VideoSendStream::Config::Config::~Config() = default;
-
-std::string VideoSendStream::Config::ToString() const {
-  std::stringstream ss;
-  ss << "{encoder_settings: " << encoder_settings.ToString();
-  ss << ", rtp: " << rtp.ToString();
-  ss << ", pre_encode_callback: "
-     << (pre_encode_callback ? "(VideoSinkInterface)" : "nullptr");
-  ss << ", post_encode_callback: "
-     << (post_encode_callback ? "(EncodedFrameObserver)" : "nullptr");
-  ss << ", render_delay_ms: " << render_delay_ms;
-  ss << ", target_delay_ms: " << target_delay_ms;
-  ss << ", suspend_below_min_bitrate: "
-     << (suspend_below_min_bitrate ? "on" : "off");
-  ss << '}';
-  return ss.str();
-}
-
-std::string VideoSendStream::Config::EncoderSettings::ToString() const {
-  std::stringstream ss;
-  ss << "{payload_name: " << payload_name;
-  ss << ", payload_type: " << payload_type;
-  ss << ", encoder: " << (encoder ? "(VideoEncoder)" : "nullptr");
-  ss << '}';
-  return ss.str();
-}
-
-VideoSendStream::Config::Rtp::Rtp() = default;
-VideoSendStream::Config::Rtp::Rtp(const Rtp&) = default;
-VideoSendStream::Config::Rtp::~Rtp() = default;
-
-VideoSendStream::Config::Rtp::Flexfec::Flexfec() = default;
-VideoSendStream::Config::Rtp::Flexfec::Flexfec(const Flexfec&) = default;
-VideoSendStream::Config::Rtp::Flexfec::~Flexfec() = default;
-
-std::string VideoSendStream::Config::Rtp::ToString() const {
-  std::stringstream ss;
-  ss << "{ssrcs: [";
-  for (size_t i = 0; i < ssrcs.size(); ++i) {
-    ss << ssrcs[i];
-    if (i != ssrcs.size() - 1)
-      ss << ", ";
-  }
-  ss << ']';
-  ss << ", rtcp_mode: "
-     << (rtcp_mode == RtcpMode::kCompound ? "RtcpMode::kCompound"
-                                          : "RtcpMode::kReducedSize");
-  ss << ", max_packet_size: " << max_packet_size;
-  ss << ", extensions: [";
-  for (size_t i = 0; i < extensions.size(); ++i) {
-    ss << extensions[i].ToString();
-    if (i != extensions.size() - 1)
-      ss << ", ";
-  }
-  ss << ']';
-
-  ss << ", nack: {rtp_history_ms: " << nack.rtp_history_ms << '}';
-  ss << ", ulpfec: " << ulpfec.ToString();
-
-  ss << ", flexfec: {payload_type: " << flexfec.payload_type;
-  ss << ", ssrc: " << flexfec.ssrc;
-  ss << ", protected_media_ssrcs: [";
-  for (size_t i = 0; i < flexfec.protected_media_ssrcs.size(); ++i) {
-    ss << flexfec.protected_media_ssrcs[i];
-    if (i != flexfec.protected_media_ssrcs.size() - 1)
-      ss << ", ";
-  }
-  ss << "]}";
-
-  ss << ", rtx: " << rtx.ToString();
-  ss << ", c_name: " << c_name;
-  ss << '}';
-  return ss.str();
-}
-
-VideoSendStream::Config::Rtp::Rtx::Rtx() = default;
-VideoSendStream::Config::Rtp::Rtx::Rtx(const Rtx&) = default;
-VideoSendStream::Config::Rtp::Rtx::~Rtx() = default;
-
-std::string VideoSendStream::Config::Rtp::Rtx::ToString() const {
-  std::stringstream ss;
-  ss << "{ssrcs: [";
-  for (size_t i = 0; i < ssrcs.size(); ++i) {
-    ss << ssrcs[i];
-    if (i != ssrcs.size() - 1)
-      ss << ", ";
-  }
-  ss << ']';
-
-  ss << ", payload_type: " << payload_type;
-  ss << '}';
-  return ss.str();
-}
-
-}  // namespace webrtc
diff --git a/call/video_send_stream.h b/call/video_send_stream.h
deleted file mode 100644
index 6dd13ab..0000000
--- a/call/video_send_stream.h
+++ /dev/null
@@ -1,286 +0,0 @@
-/*
- *  Copyright (c) 2013 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_CALL_VIDEO_SEND_STREAM_H_
-#define WEBRTC_CALL_VIDEO_SEND_STREAM_H_
-
-#include <map>
-#include <string>
-#include <utility>
-#include <vector>
-
-#include "webrtc/api/call/transport.h"
-#include "webrtc/api/rtpparameters.h"
-#include "webrtc/call/rtp_config.h"
-#include "webrtc/call/video_config.h"
-#include "webrtc/common_types.h"
-#include "webrtc/common_video/include/frame_callback.h"
-#include "webrtc/media/base/videosinkinterface.h"
-#include "webrtc/media/base/videosourceinterface.h"
-#include "webrtc/rtc_base/platform_file.h"
-
-namespace webrtc {
-
-class VideoEncoder;
-
-class VideoSendStream {
- public:
-  struct StreamStats {
-    StreamStats();
-    ~StreamStats();
-
-    std::string ToString() const;
-
-    FrameCounts frame_counts;
-    bool is_rtx = false;
-    bool is_flexfec = false;
-    int width = 0;
-    int height = 0;
-    // TODO(holmer): Move bitrate_bps out to the webrtc::Call layer.
-    int total_bitrate_bps = 0;
-    int retransmit_bitrate_bps = 0;
-    int avg_delay_ms = 0;
-    int max_delay_ms = 0;
-    StreamDataCounters rtp_stats;
-    RtcpPacketTypeCounter rtcp_packet_type_counts;
-    RtcpStatistics rtcp_stats;
-  };
-
-  struct Stats {
-    Stats();
-    ~Stats();
-    std::string ToString(int64_t time_ms) const;
-    std::string encoder_implementation_name = "unknown";
-    int input_frame_rate = 0;
-    int encode_frame_rate = 0;
-    int avg_encode_time_ms = 0;
-    int encode_usage_percent = 0;
-    uint32_t frames_encoded = 0;
-    rtc::Optional<uint64_t> qp_sum;
-    // Bitrate the encoder is currently configured to use due to bandwidth
-    // limitations.
-    int target_media_bitrate_bps = 0;
-    // Bitrate the encoder is actually producing.
-    int media_bitrate_bps = 0;
-    // Media bitrate this VideoSendStream is configured to prefer if there are
-    // no bandwidth limitations.
-    int preferred_media_bitrate_bps = 0;
-    bool suspended = false;
-    bool bw_limited_resolution = false;
-    bool cpu_limited_resolution = false;
-    bool bw_limited_framerate = false;
-    bool cpu_limited_framerate = false;
-    // Total number of times resolution as been requested to be changed due to
-    // CPU/quality adaptation.
-    int number_of_cpu_adapt_changes = 0;
-    int number_of_quality_adapt_changes = 0;
-    std::map<uint32_t, StreamStats> substreams;
-    webrtc::VideoContentType content_type =
-        webrtc::VideoContentType::UNSPECIFIED;
-  };
-
-  struct Config {
-   public:
-    Config() = delete;
-    Config(Config&&);
-    explicit Config(Transport* send_transport);
-
-    Config& operator=(Config&&);
-    Config& operator=(const Config&) = delete;
-
-    ~Config();
-
-    // Mostly used by tests.  Avoid creating copies if you can.
-    Config Copy() const { return Config(*this); }
-
-    std::string ToString() const;
-
-    struct EncoderSettings {
-      EncoderSettings() = default;
-      EncoderSettings(std::string payload_name,
-                      int payload_type,
-                      VideoEncoder* encoder)
-          : payload_name(std::move(payload_name)),
-            payload_type(payload_type),
-            encoder(encoder) {}
-      std::string ToString() const;
-
-      std::string payload_name;
-      int payload_type = -1;
-
-      // TODO(sophiechang): Delete this field when no one is using internal
-      // sources anymore.
-      bool internal_source = false;
-
-      // Allow 100% encoder utilization. Used for HW encoders where CPU isn't
-      // expected to be the limiting factor, but a chip could be running at
-      // 30fps (for example) exactly.
-      bool full_overuse_time = false;
-
-      // Uninitialized VideoEncoder instance to be used for encoding. Will be
-      // initialized from inside the VideoSendStream.
-      VideoEncoder* encoder = nullptr;
-    } encoder_settings;
-
-    static const size_t kDefaultMaxPacketSize = 1500 - 40;  // TCP over IPv4.
-    struct Rtp {
-      Rtp();
-      Rtp(const Rtp&);
-      ~Rtp();
-      std::string ToString() const;
-
-      std::vector<uint32_t> ssrcs;
-
-      // See RtcpMode for description.
-      RtcpMode rtcp_mode = RtcpMode::kCompound;
-
-      // Max RTP packet size delivered to send transport from VideoEngine.
-      size_t max_packet_size = kDefaultMaxPacketSize;
-
-      // RTP header extensions to use for this send stream.
-      std::vector<RtpExtension> extensions;
-
-      // See NackConfig for description.
-      NackConfig nack;
-
-      // See UlpfecConfig for description.
-      UlpfecConfig ulpfec;
-
-      struct Flexfec {
-        Flexfec();
-        Flexfec(const Flexfec&);
-        ~Flexfec();
-        // Payload type of FlexFEC. Set to -1 to disable sending FlexFEC.
-        int payload_type = -1;
-
-        // SSRC of FlexFEC stream.
-        uint32_t ssrc = 0;
-
-        // Vector containing a single element, corresponding to the SSRC of the
-        // media stream being protected by this FlexFEC stream.
-        // The vector MUST have size 1.
-        //
-        // TODO(brandtr): Update comment above when we support
-        // multistream protection.
-        std::vector<uint32_t> protected_media_ssrcs;
-      } flexfec;
-
-      // Settings for RTP retransmission payload format, see RFC 4588 for
-      // details.
-      struct Rtx {
-        Rtx();
-        Rtx(const Rtx&);
-        ~Rtx();
-        std::string ToString() const;
-        // SSRCs to use for the RTX streams.
-        std::vector<uint32_t> ssrcs;
-
-        // Payload type to use for the RTX stream.
-        int payload_type = -1;
-      } rtx;
-
-      // RTCP CNAME, see RFC 3550.
-      std::string c_name;
-    } rtp;
-
-    // Transport for outgoing packets.
-    Transport* send_transport = nullptr;
-
-    // Called for each I420 frame before encoding the frame. Can be used for
-    // effects, snapshots etc. 'nullptr' disables the callback.
-    rtc::VideoSinkInterface<VideoFrame>* pre_encode_callback = nullptr;
-
-    // Called for each encoded frame, e.g. used for file storage. 'nullptr'
-    // disables the callback. Also measures timing and passes the time
-    // spent on encoding. This timing will not fire if encoding takes longer
-    // than the measuring window, since the sample data will have been dropped.
-    EncodedFrameObserver* post_encode_callback = nullptr;
-
-    // Expected delay needed by the renderer, i.e. the frame will be delivered
-    // this many milliseconds, if possible, earlier than expected render time.
-    // Only valid if |local_renderer| is set.
-    int render_delay_ms = 0;
-
-    // Target delay in milliseconds. A positive value indicates this stream is
-    // used for streaming instead of a real-time call.
-    int target_delay_ms = 0;
-
-    // True if the stream should be suspended when the available bitrate fall
-    // below the minimum configured bitrate. If this variable is false, the
-    // stream may send at a rate higher than the estimated available bitrate.
-    bool suspend_below_min_bitrate = false;
-
-    // Enables periodic bandwidth probing in application-limited region.
-    bool periodic_alr_bandwidth_probing = false;
-
-   private:
-    // Access to the copy constructor is private to force use of the Copy()
-    // method for those exceptional cases where we do use it.
-    Config(const Config&);
-  };
-
-  // Starts stream activity.
-  // When a stream is active, it can receive, process and deliver packets.
-  virtual void Start() = 0;
-  // Stops stream activity.
-  // When a stream is stopped, it can't receive, process or deliver packets.
-  virtual void Stop() = 0;
-
-  // Based on the spec in
-  // https://w3c.github.io/webrtc-pc/#idl-def-rtcdegradationpreference.
-  // These options are enforced on a best-effort basis. For instance, all of
-  // these options may suffer some frame drops in order to avoid queuing.
-  // TODO(sprang): Look into possibility of more strictly enforcing the
-  // maintain-framerate option.
-  enum class DegradationPreference {
-    // Don't take any actions based on over-utilization signals.
-    kDegradationDisabled,
-    // On over-use, request lower frame rate, possibly causing frame drops.
-    kMaintainResolution,
-    // On over-use, request lower resolution, possibly causing down-scaling.
-    kMaintainFramerate,
-    // Try to strike a "pleasing" balance between frame rate or resolution.
-    kBalanced,
-  };
-
-  virtual void SetSource(
-      rtc::VideoSourceInterface<webrtc::VideoFrame>* source,
-      const DegradationPreference& degradation_preference) = 0;
-
-  // Set which streams to send. Must have at least as many SSRCs as configured
-  // in the config. Encoder settings are passed on to the encoder instance along
-  // with the VideoStream settings.
-  virtual void ReconfigureVideoEncoder(VideoEncoderConfig config) = 0;
-
-  virtual Stats GetStats() = 0;
-
-  // Takes ownership of each file, is responsible for closing them later.
-  // Calling this method will close and finalize any current logs.
-  // Some codecs produce multiple streams (VP8 only at present), each of these
-  // streams will log to a separate file. kMaxSimulcastStreams in common_types.h
-  // gives the max number of such streams. If there is no file for a stream, or
-  // the file is rtc::kInvalidPlatformFileValue, frames from that stream will
-  // not be logged.
-  // If a frame to be written would make the log too large the write fails and
-  // the log is closed and finalized. A |byte_limit| of 0 means no limit.
-  virtual void EnableEncodedFrameRecording(
-      const std::vector<rtc::PlatformFile>& files,
-      size_t byte_limit) = 0;
-  inline void DisableEncodedFrameRecording() {
-    EnableEncodedFrameRecording(std::vector<rtc::PlatformFile>(), 0);
-  }
-
- protected:
-  virtual ~VideoSendStream() {}
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_CALL_VIDEO_SEND_STREAM_H_
diff --git a/codereview.settings b/codereview.settings
deleted file mode 100644
index 37cff97..0000000
--- a/codereview.settings
+++ /dev/null
@@ -1,6 +0,0 @@
-
-Creating CLs from this location is not supported! Please make sure the current
-working directory is the parent directory of this directory.
-If you're working with a Chromium checkout, you'll have to create a full WebRTC
-checkout and upload a CL from that. See
-https://webrtc.org/native-code/development/ for instructions.
diff --git a/common_audio/BUILD.gn b/common_audio/BUILD.gn
deleted file mode 100644
index 8cfd642..0000000
--- a/common_audio/BUILD.gn
+++ /dev/null
@@ -1,419 +0,0 @@
-# Copyright (c) 2014 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.
-
-import("//build/config/arm.gni")
-import("../webrtc.gni")
-
-config("common_audio_config") {
-  include_dirs = [
-    "resampler/include",
-    "signal_processing/include",
-    "vad/include",
-  ]
-}
-
-rtc_static_library("common_audio") {
-  sources = [
-    "audio_converter.cc",
-    "audio_converter.h",
-    "audio_ring_buffer.cc",
-    "audio_ring_buffer.h",
-    "audio_util.cc",
-    "blocker.cc",
-    "blocker.h",
-    "channel_buffer.cc",
-    "channel_buffer.h",
-    "fir_filter.cc",
-    "fir_filter.h",
-    "fir_filter_neon.h",
-    "fir_filter_sse.h",
-    "include/audio_util.h",
-    "lapped_transform.cc",
-    "lapped_transform.h",
-    "real_fourier.cc",
-    "real_fourier.h",
-    "real_fourier_ooura.cc",
-    "real_fourier_ooura.h",
-    "resampler/include/push_resampler.h",
-    "resampler/include/resampler.h",
-    "resampler/push_resampler.cc",
-    "resampler/push_sinc_resampler.cc",
-    "resampler/push_sinc_resampler.h",
-    "resampler/resampler.cc",
-    "resampler/sinc_resampler.cc",
-    "smoothing_filter.cc",
-    "smoothing_filter.h",
-    "sparse_fir_filter.cc",
-    "sparse_fir_filter.h",
-    "vad/include/vad.h",
-    "vad/vad.cc",
-    "wav_file.cc",
-    "wav_file.h",
-    "wav_header.cc",
-    "wav_header.h",
-    "window_generator.cc",
-    "window_generator.h",
-  ]
-
-  deps = [
-    ":sinc_resampler",
-    "..:webrtc_common",
-    "../api:optional",
-    "../rtc_base:gtest_prod",
-    "../rtc_base:rtc_base_approved",
-    "../system_wrappers",
-  ]
-  public_deps = [
-    ":common_audio_c",
-  ]
-
-  defines = []
-  if (rtc_use_openmax_dl) {
-    sources += [
-      "real_fourier_openmax.cc",
-      "real_fourier_openmax.h",
-    ]
-    defines += [ "RTC_USE_OPENMAX_DL" ]
-    if (rtc_build_openmax_dl) {
-      deps += [ "//third_party/openmax_dl/dl" ]
-    }
-  }
-
-  if (rtc_build_with_neon) {
-    deps += [ ":common_audio_neon" ]
-  }
-
-  if (is_win) {
-    cflags = [ "/wd4334" ]  # Ignore warning on shift operator promotion.
-  }
-
-  public_configs = [ ":common_audio_config" ]
-
-  if (!build_with_chromium && is_clang) {
-    # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-    suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-  }
-
-  if (current_cpu == "x86" || current_cpu == "x64") {
-    deps += [ ":common_audio_sse2" ]
-  }
-}
-
-rtc_source_set("common_audio_c_arm_asm") {
-  visibility = [ ":*" ]  # Only targets in this file can depend on this.
-  sources = []
-  if (current_cpu == "arm") {
-    sources += [
-      "signal_processing/complex_bit_reverse_arm.S",
-      "signal_processing/spl_sqrt_floor_arm.S",
-    ]
-
-    if (arm_version >= 7) {
-      sources += [ "signal_processing/filter_ar_fast_q12_armv7.S" ]
-    } else {
-      sources += [ "signal_processing/filter_ar_fast_q12.c" ]
-    }
-  }
-}
-
-rtc_source_set("common_audio_c") {
-  visibility = [ ":*" ]  # Only targets in this file can depend on this.
-  sources = [
-    "fft4g.c",
-    "fft4g.h",
-    "ring_buffer.c",
-    "ring_buffer.h",
-    "signal_processing/auto_corr_to_refl_coef.c",
-    "signal_processing/auto_correlation.c",
-    "signal_processing/complex_fft_tables.h",
-    "signal_processing/copy_set_operations.c",
-    "signal_processing/cross_correlation.c",
-    "signal_processing/division_operations.c",
-    "signal_processing/downsample_fast.c",
-    "signal_processing/energy.c",
-    "signal_processing/filter_ar.c",
-    "signal_processing/filter_ma_fast_q12.c",
-    "signal_processing/get_hanning_window.c",
-    "signal_processing/get_scaling_square.c",
-    "signal_processing/ilbc_specific_functions.c",
-    "signal_processing/include/real_fft.h",
-    "signal_processing/include/signal_processing_library.h",
-    "signal_processing/include/spl_inl.h",
-    "signal_processing/levinson_durbin.c",
-    "signal_processing/lpc_to_refl_coef.c",
-    "signal_processing/min_max_operations.c",
-    "signal_processing/randomization_functions.c",
-    "signal_processing/real_fft.c",
-    "signal_processing/refl_coef_to_lpc.c",
-    "signal_processing/resample.c",
-    "signal_processing/resample_48khz.c",
-    "signal_processing/resample_by_2.c",
-    "signal_processing/resample_by_2_internal.c",
-    "signal_processing/resample_by_2_internal.h",
-    "signal_processing/resample_fractional.c",
-    "signal_processing/spl_init.c",
-    "signal_processing/spl_inl.c",
-    "signal_processing/spl_sqrt.c",
-    "signal_processing/splitting_filter.c",
-    "signal_processing/sqrt_of_one_minus_x_squared.c",
-    "signal_processing/vector_scaling_operations.c",
-    "vad/include/webrtc_vad.h",
-    "vad/vad_core.c",
-    "vad/vad_core.h",
-    "vad/vad_filterbank.c",
-    "vad/vad_filterbank.h",
-    "vad/vad_gmm.c",
-    "vad/vad_gmm.h",
-    "vad/vad_sp.c",
-    "vad/vad_sp.h",
-    "vad/webrtc_vad.c",
-  ]
-
-  if (current_cpu == "mipsel") {
-    sources += [
-      "signal_processing/complex_bit_reverse_mips.c",
-      "signal_processing/complex_fft_mips.c",
-      "signal_processing/cross_correlation_mips.c",
-      "signal_processing/downsample_fast_mips.c",
-      "signal_processing/filter_ar_fast_q12_mips.c",
-      "signal_processing/include/spl_inl_mips.h",
-      "signal_processing/min_max_operations_mips.c",
-      "signal_processing/resample_by_2_mips.c",
-      "signal_processing/spl_sqrt_floor_mips.c",
-    ]
-    if (mips_dsp_rev > 0) {
-      sources += [ "signal_processing/vector_scaling_operations_mips.c" ]
-    }
-  } else {
-    sources += [ "signal_processing/complex_fft.c" ]
-  }
-
-  if (current_cpu != "arm" && current_cpu != "mipsel") {
-    sources += [
-      "signal_processing/complex_bit_reverse.c",
-      "signal_processing/filter_ar_fast_q12.c",
-      "signal_processing/spl_sqrt_floor.c",
-    ]
-  }
-
-  if (is_win) {
-    cflags = [ "/wd4334" ]  # Ignore warning on shift operator promotion.
-  }
-
-  public_configs = [ ":common_audio_config" ]
-  deps = [
-    ":common_audio_c_arm_asm",
-    ":common_audio_cc",
-    "..:webrtc_common",
-    "../rtc_base:compile_assert_c",
-    "../rtc_base:rtc_base_approved",
-    "../system_wrappers:system_wrappers",
-  ]
-}
-
-rtc_source_set("common_audio_cc") {
-  visibility = [ ":*" ]  # Only targets in this file can depend on this.
-  sources = [
-    "signal_processing/dot_product_with_scale.cc",
-    "signal_processing/dot_product_with_scale.h",
-  ]
-
-  public_configs = [ ":common_audio_config" ]
-  deps = [
-    "..:webrtc_common",
-    "../rtc_base:rtc_base_approved",
-    "../system_wrappers:system_wrappers",
-  ]
-}
-
-rtc_source_set("sinc_resampler") {
-  sources = [
-    "resampler/sinc_resampler.h",
-  ]
-  deps = [
-    "..:webrtc_common",
-    "../rtc_base:gtest_prod",
-    "../rtc_base:rtc_base_approved",
-    "../system_wrappers",
-  ]
-}
-
-if (current_cpu == "x86" || current_cpu == "x64") {
-  rtc_static_library("common_audio_sse2") {
-    # TODO(kjellander): Remove (bugs.webrtc.org/6828)
-    # Enabling GN check triggers dependency cycle:
-    #   :common_audio ->
-    #   :common_audio_sse2 ->
-    #   :common_audio
-    check_includes = false
-    sources = [
-      "fir_filter_sse.cc",
-      "resampler/sinc_resampler_sse.cc",
-    ]
-
-    if (is_posix) {
-      cflags = [ "-msse2" ]
-    }
-
-    if (!build_with_chromium && is_clang) {
-      # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-    }
-    deps = [
-      ":sinc_resampler",
-    ]
-  }
-}
-
-if (rtc_build_with_neon) {
-  rtc_static_library("common_audio_neon") {
-    # TODO(kjellander): Remove (bugs.webrtc.org/6828)
-    # Enabling GN check triggers dependency cycle:
-    #   :common_audio ->
-    #   :common_audio_neon ->
-    #   :common_audio
-    check_includes = false
-    sources = [
-      "fir_filter_neon.cc",
-      "resampler/sinc_resampler_neon.cc",
-    ]
-
-    if (current_cpu != "arm64") {
-      # Enable compilation for the NEON instruction set. This is needed
-      # since //build/config/arm.gni only enables NEON for iOS, not Android.
-      # This provides the same functionality as webrtc/build/arm_neon.gypi.
-      suppressed_configs += [ "//build/config/compiler:compiler_arm_fpu" ]
-      cflags = [ "-mfpu=neon" ]
-    }
-
-    # Disable LTO on NEON targets due to compiler bug.
-    # TODO(fdegans): Enable this. See crbug.com/408997.
-    if (rtc_use_lto) {
-      cflags -= [
-        "-flto",
-        "-ffat-lto-objects",
-      ]
-    }
-
-    if (!build_with_chromium && is_clang) {
-      # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-    }
-
-    deps = [
-      ":sinc_resampler",
-    ]
-
-    public_deps = [
-      ":common_audio_neon_c",
-    ]
-  }
-
-  rtc_source_set("common_audio_neon_c") {
-    visibility = [ ":*" ]  # Only targets in this file can depend on this.
-    sources = [
-      "signal_processing/cross_correlation_neon.c",
-      "signal_processing/downsample_fast_neon.c",
-      "signal_processing/min_max_operations_neon.c",
-    ]
-
-    if (current_cpu != "arm64") {
-      # Enable compilation for the NEON instruction set. This is needed
-      # since //build/config/arm.gni only enables NEON for iOS, not Android.
-      # This provides the same functionality as webrtc/build/arm_neon.gypi.
-      suppressed_configs += [ "//build/config/compiler:compiler_arm_fpu" ]
-      cflags = [ "-mfpu=neon" ]
-    }
-
-    # Disable LTO on NEON targets due to compiler bug.
-    # TODO(fdegans): Enable this. See crbug.com/408997.
-    if (rtc_use_lto) {
-      cflags -= [
-        "-flto",
-        "-ffat-lto-objects",
-      ]
-    }
-
-    if (!build_with_chromium && is_clang) {
-      # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-    }
-    deps = [
-      ":common_audio_c",
-      "../rtc_base:rtc_base_approved",
-    ]
-  }
-}
-
-if (rtc_include_tests) {
-  rtc_test("common_audio_unittests") {
-    testonly = true
-
-    sources = [
-      "audio_converter_unittest.cc",
-      "audio_ring_buffer_unittest.cc",
-      "audio_util_unittest.cc",
-      "blocker_unittest.cc",
-      "channel_buffer_unittest.cc",
-      "fir_filter_unittest.cc",
-      "lapped_transform_unittest.cc",
-      "real_fourier_unittest.cc",
-      "resampler/push_resampler_unittest.cc",
-      "resampler/push_sinc_resampler_unittest.cc",
-      "resampler/resampler_unittest.cc",
-      "resampler/sinusoidal_linear_chirp_source.cc",
-      "resampler/sinusoidal_linear_chirp_source.h",
-      "ring_buffer_unittest.cc",
-      "signal_processing/real_fft_unittest.cc",
-      "signal_processing/signal_processing_unittest.cc",
-      "smoothing_filter_unittest.cc",
-      "sparse_fir_filter_unittest.cc",
-      "vad/vad_core_unittest.cc",
-      "vad/vad_filterbank_unittest.cc",
-      "vad/vad_gmm_unittest.cc",
-      "vad/vad_sp_unittest.cc",
-      "vad/vad_unittest.cc",
-      "vad/vad_unittest.h",
-      "wav_file_unittest.cc",
-      "wav_header_unittest.cc",
-      "window_generator_unittest.cc",
-    ]
-
-    # Does not compile on iOS for arm: webrtc:5544.
-    if (!is_ios || target_cpu != "arm") {
-      sources += [ "resampler/sinc_resampler_unittest.cc" ]
-    }
-
-    if (rtc_use_openmax_dl) {
-      defines = [ "RTC_USE_OPENMAX_DL" ]
-    }
-
-    if (!build_with_chromium && is_clang) {
-      # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-    }
-
-    deps = [
-      ":common_audio",
-      ":sinc_resampler",
-      "..:webrtc_common",
-      "../rtc_base:rtc_base_approved",
-      "../rtc_base:rtc_base_tests_utils",
-      "../system_wrappers",
-      "../test:test_main",
-      "//testing/gmock",
-      "//testing/gtest",
-    ]
-
-    if (is_android) {
-      deps += [ "//testing/android/native_test:native_test_support" ]
-
-      shard_timeout = 900
-    }
-  }
-}
diff --git a/common_audio/DEPS b/common_audio/DEPS
deleted file mode 100644
index 01e7f31..0000000
--- a/common_audio/DEPS
+++ /dev/null
@@ -1,4 +0,0 @@
-include_rules = [
-  "+dl/sp/api",  # For openmax_dl.
-  "+webrtc/system_wrappers",
-]
diff --git a/common_audio/OWNERS b/common_audio/OWNERS
deleted file mode 100644
index 7f721de..0000000
--- a/common_audio/OWNERS
+++ /dev/null
@@ -1,9 +0,0 @@
-henrik.lundin@webrtc.org
-jan.skoglund@webrtc.org
-kwiberg@webrtc.org
-tina.legrand@webrtc.org
-
-# These are for the common case of adding or renaming files. If you're doing
-# structural changes, please get a review from a reviewer in this file.
-per-file *.gn=*
-per-file *.gni=*
diff --git a/common_audio/audio_converter.cc b/common_audio/audio_converter.cc
deleted file mode 100644
index 9e4bdaa..0000000
--- a/common_audio/audio_converter.cc
+++ /dev/null
@@ -1,207 +0,0 @@
-/*
- *  Copyright (c) 2014 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/common_audio/audio_converter.h"
-
-#include <cstring>
-#include <memory>
-#include <utility>
-#include <vector>
-
-#include "webrtc/common_audio/channel_buffer.h"
-#include "webrtc/common_audio/resampler/push_sinc_resampler.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/safe_conversions.h"
-
-using rtc::checked_cast;
-
-namespace webrtc {
-
-class CopyConverter : public AudioConverter {
- public:
-  CopyConverter(size_t src_channels, size_t src_frames, size_t dst_channels,
-                size_t dst_frames)
-      : AudioConverter(src_channels, src_frames, dst_channels, dst_frames) {}
-  ~CopyConverter() override {};
-
-  void Convert(const float* const* src, size_t src_size, float* const* dst,
-               size_t dst_capacity) override {
-    CheckSizes(src_size, dst_capacity);
-    if (src != dst) {
-      for (size_t i = 0; i < src_channels(); ++i)
-        std::memcpy(dst[i], src[i], dst_frames() * sizeof(*dst[i]));
-    }
-  }
-};
-
-class UpmixConverter : public AudioConverter {
- public:
-  UpmixConverter(size_t src_channels, size_t src_frames, size_t dst_channels,
-                 size_t dst_frames)
-      : AudioConverter(src_channels, src_frames, dst_channels, dst_frames) {}
-  ~UpmixConverter() override {};
-
-  void Convert(const float* const* src, size_t src_size, float* const* dst,
-               size_t dst_capacity) override {
-    CheckSizes(src_size, dst_capacity);
-    for (size_t i = 0; i < dst_frames(); ++i) {
-      const float value = src[0][i];
-      for (size_t j = 0; j < dst_channels(); ++j)
-        dst[j][i] = value;
-    }
-  }
-};
-
-class DownmixConverter : public AudioConverter {
- public:
-  DownmixConverter(size_t src_channels, size_t src_frames, size_t dst_channels,
-                   size_t dst_frames)
-      : AudioConverter(src_channels, src_frames, dst_channels, dst_frames) {
-  }
-  ~DownmixConverter() override {};
-
-  void Convert(const float* const* src, size_t src_size, float* const* dst,
-               size_t dst_capacity) override {
-    CheckSizes(src_size, dst_capacity);
-    float* dst_mono = dst[0];
-    for (size_t i = 0; i < src_frames(); ++i) {
-      float sum = 0;
-      for (size_t j = 0; j < src_channels(); ++j)
-        sum += src[j][i];
-      dst_mono[i] = sum / src_channels();
-    }
-  }
-};
-
-class ResampleConverter : public AudioConverter {
- public:
-  ResampleConverter(size_t src_channels, size_t src_frames, size_t dst_channels,
-                    size_t dst_frames)
-      : AudioConverter(src_channels, src_frames, dst_channels, dst_frames) {
-    resamplers_.reserve(src_channels);
-    for (size_t i = 0; i < src_channels; ++i)
-      resamplers_.push_back(std::unique_ptr<PushSincResampler>(
-          new PushSincResampler(src_frames, dst_frames)));
-  }
-  ~ResampleConverter() override {};
-
-  void Convert(const float* const* src, size_t src_size, float* const* dst,
-               size_t dst_capacity) override {
-    CheckSizes(src_size, dst_capacity);
-    for (size_t i = 0; i < resamplers_.size(); ++i)
-      resamplers_[i]->Resample(src[i], src_frames(), dst[i], dst_frames());
-  }
-
- private:
-  std::vector<std::unique_ptr<PushSincResampler>> resamplers_;
-};
-
-// Apply a vector of converters in serial, in the order given. At least two
-// converters must be provided.
-class CompositionConverter : public AudioConverter {
- public:
-  explicit CompositionConverter(
-    std::vector<std::unique_ptr<AudioConverter>> converters)
-      : converters_(std::move(converters)) {
-    RTC_CHECK_GE(converters_.size(), 2);
-    // We need an intermediate buffer after every converter.
-    for (auto it = converters_.begin(); it != converters_.end() - 1; ++it)
-      buffers_.push_back(
-          std::unique_ptr<ChannelBuffer<float>>(new ChannelBuffer<float>(
-              (*it)->dst_frames(), (*it)->dst_channels())));
-  }
-  ~CompositionConverter() override {};
-
-  void Convert(const float* const* src, size_t src_size, float* const* dst,
-               size_t dst_capacity) override {
-    converters_.front()->Convert(src, src_size, buffers_.front()->channels(),
-                                 buffers_.front()->size());
-    for (size_t i = 2; i < converters_.size(); ++i) {
-      auto& src_buffer = buffers_[i - 2];
-      auto& dst_buffer = buffers_[i - 1];
-      converters_[i]->Convert(src_buffer->channels(),
-                              src_buffer->size(),
-                              dst_buffer->channels(),
-                              dst_buffer->size());
-    }
-    converters_.back()->Convert(buffers_.back()->channels(),
-                                buffers_.back()->size(), dst, dst_capacity);
-  }
-
- private:
-  std::vector<std::unique_ptr<AudioConverter>> converters_;
-  std::vector<std::unique_ptr<ChannelBuffer<float>>> buffers_;
-};
-
-std::unique_ptr<AudioConverter> AudioConverter::Create(size_t src_channels,
-                                                       size_t src_frames,
-                                                       size_t dst_channels,
-                                                       size_t dst_frames) {
-  std::unique_ptr<AudioConverter> sp;
-  if (src_channels > dst_channels) {
-    if (src_frames != dst_frames) {
-      std::vector<std::unique_ptr<AudioConverter>> converters;
-      converters.push_back(std::unique_ptr<AudioConverter>(new DownmixConverter(
-          src_channels, src_frames, dst_channels, src_frames)));
-      converters.push_back(
-          std::unique_ptr<AudioConverter>(new ResampleConverter(
-              dst_channels, src_frames, dst_channels, dst_frames)));
-      sp.reset(new CompositionConverter(std::move(converters)));
-    } else {
-      sp.reset(new DownmixConverter(src_channels, src_frames, dst_channels,
-                                    dst_frames));
-    }
-  } else if (src_channels < dst_channels) {
-    if (src_frames != dst_frames) {
-      std::vector<std::unique_ptr<AudioConverter>> converters;
-      converters.push_back(
-          std::unique_ptr<AudioConverter>(new ResampleConverter(
-              src_channels, src_frames, src_channels, dst_frames)));
-      converters.push_back(std::unique_ptr<AudioConverter>(new UpmixConverter(
-          src_channels, dst_frames, dst_channels, dst_frames)));
-      sp.reset(new CompositionConverter(std::move(converters)));
-    } else {
-      sp.reset(new UpmixConverter(src_channels, src_frames, dst_channels,
-                                  dst_frames));
-    }
-  } else if (src_frames != dst_frames) {
-    sp.reset(new ResampleConverter(src_channels, src_frames, dst_channels,
-                                   dst_frames));
-  } else {
-    sp.reset(new CopyConverter(src_channels, src_frames, dst_channels,
-                               dst_frames));
-  }
-
-  return sp;
-}
-
-// For CompositionConverter.
-AudioConverter::AudioConverter()
-    : src_channels_(0),
-      src_frames_(0),
-      dst_channels_(0),
-      dst_frames_(0) {}
-
-AudioConverter::AudioConverter(size_t src_channels, size_t src_frames,
-                               size_t dst_channels, size_t dst_frames)
-    : src_channels_(src_channels),
-      src_frames_(src_frames),
-      dst_channels_(dst_channels),
-      dst_frames_(dst_frames) {
-  RTC_CHECK(dst_channels == src_channels || dst_channels == 1 ||
-            src_channels == 1);
-}
-
-void AudioConverter::CheckSizes(size_t src_size, size_t dst_capacity) const {
-  RTC_CHECK_EQ(src_size, src_channels() * src_frames());
-  RTC_CHECK_GE(dst_capacity, dst_channels() * dst_frames());
-}
-
-}  // namespace webrtc
diff --git a/common_audio/audio_converter.h b/common_audio/audio_converter.h
deleted file mode 100644
index 8b2388f..0000000
--- a/common_audio/audio_converter.h
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- *  Copyright (c) 2014 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_COMMON_AUDIO_AUDIO_CONVERTER_H_
-#define WEBRTC_COMMON_AUDIO_AUDIO_CONVERTER_H_
-
-#include <memory>
-
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace webrtc {
-
-// Format conversion (remixing and resampling) for audio. Only simple remixing
-// conversions are supported: downmix to mono (i.e. |dst_channels| == 1) or
-// upmix from mono (i.e. |src_channels == 1|).
-//
-// The source and destination chunks have the same duration in time; specifying
-// the number of frames is equivalent to specifying the sample rates.
-class AudioConverter {
- public:
-  // Returns a new AudioConverter, which will use the supplied format for its
-  // lifetime. Caller is responsible for the memory.
-  static std::unique_ptr<AudioConverter> Create(size_t src_channels,
-                                                size_t src_frames,
-                                                size_t dst_channels,
-                                                size_t dst_frames);
-  virtual ~AudioConverter() {}
-
-  // Convert |src|, containing |src_size| samples, to |dst|, having a sample
-  // capacity of |dst_capacity|. Both point to a series of buffers containing
-  // the samples for each channel. The sizes must correspond to the format
-  // passed to Create().
-  virtual void Convert(const float* const* src, size_t src_size,
-                       float* const* dst, size_t dst_capacity) = 0;
-
-  size_t src_channels() const { return src_channels_; }
-  size_t src_frames() const { return src_frames_; }
-  size_t dst_channels() const { return dst_channels_; }
-  size_t dst_frames() const { return dst_frames_; }
-
- protected:
-  AudioConverter();
-  AudioConverter(size_t src_channels, size_t src_frames, size_t dst_channels,
-                 size_t dst_frames);
-
-  // Helper to RTC_CHECK that inputs are correctly sized.
-  void CheckSizes(size_t src_size, size_t dst_capacity) const;
-
- private:
-  const size_t src_channels_;
-  const size_t src_frames_;
-  const size_t dst_channels_;
-  const size_t dst_frames_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(AudioConverter);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_COMMON_AUDIO_AUDIO_CONVERTER_H_
diff --git a/common_audio/audio_converter_unittest.cc b/common_audio/audio_converter_unittest.cc
deleted file mode 100644
index 2c44998..0000000
--- a/common_audio/audio_converter_unittest.cc
+++ /dev/null
@@ -1,161 +0,0 @@
-/*
- *  Copyright (c) 2014 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 <cmath>
-#include <algorithm>
-#include <memory>
-#include <vector>
-
-#include "webrtc/common_audio/audio_converter.h"
-#include "webrtc/common_audio/channel_buffer.h"
-#include "webrtc/common_audio/resampler/push_sinc_resampler.h"
-#include "webrtc/rtc_base/arraysize.h"
-#include "webrtc/rtc_base/format_macros.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-typedef std::unique_ptr<ChannelBuffer<float>> ScopedBuffer;
-
-// Sets the signal value to increase by |data| with every sample.
-ScopedBuffer CreateBuffer(const std::vector<float>& data, size_t frames) {
-  const size_t num_channels = data.size();
-  ScopedBuffer sb(new ChannelBuffer<float>(frames, num_channels));
-  for (size_t i = 0; i < num_channels; ++i)
-    for (size_t j = 0; j < frames; ++j)
-      sb->channels()[i][j] = data[i] * j;
-  return sb;
-}
-
-void VerifyParams(const ChannelBuffer<float>& ref,
-                  const ChannelBuffer<float>& test) {
-  EXPECT_EQ(ref.num_channels(), test.num_channels());
-  EXPECT_EQ(ref.num_frames(), test.num_frames());
-}
-
-// Computes the best SNR based on the error between |ref_frame| and
-// |test_frame|. It searches around |expected_delay| in samples between the
-// signals to compensate for the resampling delay.
-float ComputeSNR(const ChannelBuffer<float>& ref,
-                 const ChannelBuffer<float>& test,
-                 size_t expected_delay) {
-  VerifyParams(ref, test);
-  float best_snr = 0;
-  size_t best_delay = 0;
-
-  // Search within one sample of the expected delay.
-  for (size_t delay = std::max(expected_delay, static_cast<size_t>(1)) - 1;
-       delay <= std::min(expected_delay + 1, ref.num_frames());
-       ++delay) {
-    float mse = 0;
-    float variance = 0;
-    float mean = 0;
-    for (size_t i = 0; i < ref.num_channels(); ++i) {
-      for (size_t j = 0; j < ref.num_frames() - delay; ++j) {
-        float error = ref.channels()[i][j] - test.channels()[i][j + delay];
-        mse += error * error;
-        variance += ref.channels()[i][j] * ref.channels()[i][j];
-        mean += ref.channels()[i][j];
-      }
-    }
-
-    const size_t length = ref.num_channels() * (ref.num_frames() - delay);
-    mse /= length;
-    variance /= length;
-    mean /= length;
-    variance -= mean * mean;
-    float snr = 100;  // We assign 100 dB to the zero-error case.
-    if (mse > 0)
-      snr = 10 * std::log10(variance / mse);
-    if (snr > best_snr) {
-      best_snr = snr;
-      best_delay = delay;
-    }
-  }
-  printf("SNR=%.1f dB at delay=%" PRIuS "\n", best_snr, best_delay);
-  return best_snr;
-}
-
-// Sets the source to a linearly increasing signal for which we can easily
-// generate a reference. Runs the AudioConverter and ensures the output has
-// sufficiently high SNR relative to the reference.
-void RunAudioConverterTest(size_t src_channels,
-                           int src_sample_rate_hz,
-                           size_t dst_channels,
-                           int dst_sample_rate_hz) {
-  const float kSrcLeft = 0.0002f;
-  const float kSrcRight = 0.0001f;
-  const float resampling_factor = (1.f * src_sample_rate_hz) /
-      dst_sample_rate_hz;
-  const float dst_left = resampling_factor * kSrcLeft;
-  const float dst_right = resampling_factor * kSrcRight;
-  const float dst_mono = (dst_left + dst_right) / 2;
-  const size_t src_frames = static_cast<size_t>(src_sample_rate_hz / 100);
-  const size_t dst_frames = static_cast<size_t>(dst_sample_rate_hz / 100);
-
-  std::vector<float> src_data(1, kSrcLeft);
-  if (src_channels == 2)
-    src_data.push_back(kSrcRight);
-  ScopedBuffer src_buffer = CreateBuffer(src_data, src_frames);
-
-  std::vector<float> dst_data(1, 0);
-  std::vector<float> ref_data;
-  if (dst_channels == 1) {
-    if (src_channels == 1)
-      ref_data.push_back(dst_left);
-    else
-      ref_data.push_back(dst_mono);
-  } else {
-    dst_data.push_back(0);
-    ref_data.push_back(dst_left);
-    if (src_channels == 1)
-      ref_data.push_back(dst_left);
-    else
-      ref_data.push_back(dst_right);
-  }
-  ScopedBuffer dst_buffer = CreateBuffer(dst_data, dst_frames);
-  ScopedBuffer ref_buffer = CreateBuffer(ref_data, dst_frames);
-
-  // The sinc resampler has a known delay, which we compute here.
-  const size_t delay_frames = src_sample_rate_hz == dst_sample_rate_hz ? 0 :
-      static_cast<size_t>(
-          PushSincResampler::AlgorithmicDelaySeconds(src_sample_rate_hz) *
-          dst_sample_rate_hz);
-  // SNR reported on the same line later.
-  printf("(%" PRIuS ", %d Hz) -> (%" PRIuS ", %d Hz) ",
-         src_channels, src_sample_rate_hz, dst_channels, dst_sample_rate_hz);
-
-  std::unique_ptr<AudioConverter> converter = AudioConverter::Create(
-      src_channels, src_frames, dst_channels, dst_frames);
-  converter->Convert(src_buffer->channels(), src_buffer->size(),
-                     dst_buffer->channels(), dst_buffer->size());
-
-  EXPECT_LT(43.f,
-            ComputeSNR(*ref_buffer.get(), *dst_buffer.get(), delay_frames));
-}
-
-TEST(AudioConverterTest, ConversionsPassSNRThreshold) {
-  const int kSampleRates[] = {8000, 16000, 32000, 44100, 48000};
-  const size_t kChannels[] = {1, 2};
-  for (size_t src_rate = 0; src_rate < arraysize(kSampleRates); ++src_rate) {
-    for (size_t dst_rate = 0; dst_rate < arraysize(kSampleRates); ++dst_rate) {
-      for (size_t src_channel = 0; src_channel < arraysize(kChannels);
-           ++src_channel) {
-        for (size_t dst_channel = 0; dst_channel < arraysize(kChannels);
-             ++dst_channel) {
-          RunAudioConverterTest(kChannels[src_channel], kSampleRates[src_rate],
-                                kChannels[dst_channel], kSampleRates[dst_rate]);
-        }
-      }
-    }
-  }
-}
-
-}  // namespace webrtc
diff --git a/common_audio/audio_ring_buffer.cc b/common_audio/audio_ring_buffer.cc
deleted file mode 100644
index e5631b2..0000000
--- a/common_audio/audio_ring_buffer.cc
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- *  Copyright (c) 2015 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/common_audio/audio_ring_buffer.h"
-
-#include "webrtc/common_audio/ring_buffer.h"
-#include "webrtc/rtc_base/checks.h"
-
-// This is a simple multi-channel wrapper over the ring_buffer.h C interface.
-
-namespace webrtc {
-
-AudioRingBuffer::AudioRingBuffer(size_t channels, size_t max_frames) {
-  buffers_.reserve(channels);
-  for (size_t i = 0; i < channels; ++i)
-    buffers_.push_back(WebRtc_CreateBuffer(max_frames, sizeof(float)));
-}
-
-AudioRingBuffer::~AudioRingBuffer() {
-  for (auto buf : buffers_)
-    WebRtc_FreeBuffer(buf);
-}
-
-void AudioRingBuffer::Write(const float* const* data, size_t channels,
-                            size_t frames) {
-  RTC_DCHECK_EQ(buffers_.size(), channels);
-  for (size_t i = 0; i < channels; ++i) {
-    const size_t written = WebRtc_WriteBuffer(buffers_[i], data[i], frames);
-    RTC_CHECK_EQ(written, frames);
-  }
-}
-
-void AudioRingBuffer::Read(float* const* data, size_t channels, size_t frames) {
-  RTC_DCHECK_EQ(buffers_.size(), channels);
-  for (size_t i = 0; i < channels; ++i) {
-    const size_t read =
-        WebRtc_ReadBuffer(buffers_[i], nullptr, data[i], frames);
-    RTC_CHECK_EQ(read, frames);
-  }
-}
-
-size_t AudioRingBuffer::ReadFramesAvailable() const {
-  // All buffers have the same amount available.
-  return WebRtc_available_read(buffers_[0]);
-}
-
-size_t AudioRingBuffer::WriteFramesAvailable() const {
-  // All buffers have the same amount available.
-  return WebRtc_available_write(buffers_[0]);
-}
-
-void AudioRingBuffer::MoveReadPositionForward(size_t frames) {
-  for (auto buf : buffers_) {
-    const size_t moved =
-        static_cast<size_t>(WebRtc_MoveReadPtr(buf, static_cast<int>(frames)));
-    RTC_CHECK_EQ(moved, frames);
-  }
-}
-
-void AudioRingBuffer::MoveReadPositionBackward(size_t frames) {
-  for (auto buf : buffers_) {
-    const size_t moved = static_cast<size_t>(
-        -WebRtc_MoveReadPtr(buf, -static_cast<int>(frames)));
-    RTC_CHECK_EQ(moved, frames);
-  }
-}
-
-}  // namespace webrtc
diff --git a/common_audio/audio_ring_buffer.h b/common_audio/audio_ring_buffer.h
deleted file mode 100644
index 6bf3a19..0000000
--- a/common_audio/audio_ring_buffer.h
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- *  Copyright (c) 2015 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_COMMON_AUDIO_AUDIO_RING_BUFFER_H_
-#define WEBRTC_COMMON_AUDIO_AUDIO_RING_BUFFER_H_
-
-#include <stddef.h>
-
-#include <memory>
-#include <vector>
-
-struct RingBuffer;
-
-namespace webrtc {
-
-// A ring buffer tailored for float deinterleaved audio. Any operation that
-// cannot be performed as requested will cause a crash (e.g. insufficient data
-// in the buffer to fulfill a read request.)
-class AudioRingBuffer final {
- public:
-  // Specify the number of channels and maximum number of frames the buffer will
-  // contain.
-  AudioRingBuffer(size_t channels, size_t max_frames);
-  ~AudioRingBuffer();
-
-  // Copies |data| to the buffer and advances the write pointer. |channels| must
-  // be the same as at creation time.
-  void Write(const float* const* data, size_t channels, size_t frames);
-
-  // Copies from the buffer to |data| and advances the read pointer. |channels|
-  // must be the same as at creation time.
-  void Read(float* const* data, size_t channels, size_t frames);
-
-  size_t ReadFramesAvailable() const;
-  size_t WriteFramesAvailable() const;
-
-  // Moves the read position. The forward version advances the read pointer
-  // towards the write pointer and the backward verison withdraws the read
-  // pointer away from the write pointer (i.e. flushing and stuffing the buffer
-  // respectively.)
-  void MoveReadPositionForward(size_t frames);
-  void MoveReadPositionBackward(size_t frames);
-
- private:
-  // TODO(kwiberg): Use std::vector<std::unique_ptr<RingBuffer>> instead.
-  std::vector<RingBuffer*> buffers_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_COMMON_AUDIO_AUDIO_RING_BUFFER_H_
diff --git a/common_audio/audio_ring_buffer_unittest.cc b/common_audio/audio_ring_buffer_unittest.cc
deleted file mode 100644
index fe86853..0000000
--- a/common_audio/audio_ring_buffer_unittest.cc
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- *  Copyright (c) 2015 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 <memory>
-
-#include "webrtc/common_audio/audio_ring_buffer.h"
-
-#include "webrtc/common_audio/channel_buffer.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-class AudioRingBufferTest :
-    public ::testing::TestWithParam< ::testing::tuple<int, int, int, int> > {
-};
-
-void ReadAndWriteTest(const ChannelBuffer<float>& input,
-                      size_t num_write_chunk_frames,
-                      size_t num_read_chunk_frames,
-                      size_t buffer_frames,
-                      ChannelBuffer<float>* output) {
-  const size_t num_channels = input.num_channels();
-  const size_t total_frames = input.num_frames();
-  AudioRingBuffer buf(num_channels, buffer_frames);
-  std::unique_ptr<float* []> slice(new float*[num_channels]);
-
-  size_t input_pos = 0;
-  size_t output_pos = 0;
-  while (input_pos + buf.WriteFramesAvailable() < total_frames) {
-    // Write until the buffer is as full as possible.
-    while (buf.WriteFramesAvailable() >= num_write_chunk_frames) {
-      buf.Write(input.Slice(slice.get(), input_pos), num_channels,
-                num_write_chunk_frames);
-      input_pos += num_write_chunk_frames;
-    }
-    // Read until the buffer is as empty as possible.
-    while (buf.ReadFramesAvailable() >= num_read_chunk_frames) {
-      EXPECT_LT(output_pos, total_frames);
-      buf.Read(output->Slice(slice.get(), output_pos), num_channels,
-               num_read_chunk_frames);
-      output_pos += num_read_chunk_frames;
-    }
-  }
-
-  // Write and read the last bit.
-  if (input_pos < total_frames) {
-    buf.Write(input.Slice(slice.get(), input_pos), num_channels,
-              total_frames - input_pos);
-  }
-  if (buf.ReadFramesAvailable()) {
-    buf.Read(output->Slice(slice.get(), output_pos), num_channels,
-             buf.ReadFramesAvailable());
-  }
-  EXPECT_EQ(0u, buf.ReadFramesAvailable());
-}
-
-TEST_P(AudioRingBufferTest, ReadDataMatchesWrittenData) {
-  const size_t kFrames = 5000;
-  const size_t num_channels = ::testing::get<3>(GetParam());
-
-  // Initialize the input data to an increasing sequence.
-  ChannelBuffer<float> input(kFrames, static_cast<int>(num_channels));
-  for (size_t i = 0; i < num_channels; ++i)
-    for (size_t j = 0; j < kFrames; ++j)
-      input.channels()[i][j] = (i + 1) * (j + 1);
-
-  ChannelBuffer<float> output(kFrames, static_cast<int>(num_channels));
-  ReadAndWriteTest(input,
-                   ::testing::get<0>(GetParam()),
-                   ::testing::get<1>(GetParam()),
-                   ::testing::get<2>(GetParam()),
-                   &output);
-
-  // Verify the read data matches the input.
-  for (size_t i = 0; i < num_channels; ++i)
-    for (size_t j = 0; j < kFrames; ++j)
-      EXPECT_EQ(input.channels()[i][j], output.channels()[i][j]);
-}
-
-INSTANTIATE_TEST_CASE_P(
-    AudioRingBufferTest, AudioRingBufferTest,
-    ::testing::Combine(::testing::Values(10, 20, 42),  // num_write_chunk_frames
-                       ::testing::Values(1, 10, 17),   // num_read_chunk_frames
-                       ::testing::Values(100, 256),    // buffer_frames
-                       ::testing::Values(1, 4)));      // num_channels
-
-TEST_F(AudioRingBufferTest, MoveReadPosition) {
-  const size_t kNumChannels = 1;
-  const float kInputArray[] = {1, 2, 3, 4};
-  const size_t kNumFrames = sizeof(kInputArray) / sizeof(*kInputArray);
-  ChannelBuffer<float> input(kNumFrames, kNumChannels);
-  input.SetDataForTesting(kInputArray, kNumFrames);
-  AudioRingBuffer buf(kNumChannels, kNumFrames);
-  buf.Write(input.channels(), kNumChannels, kNumFrames);
-
-  buf.MoveReadPositionForward(3);
-  ChannelBuffer<float> output(1, kNumChannels);
-  buf.Read(output.channels(), kNumChannels, 1);
-  EXPECT_EQ(4, output.channels()[0][0]);
-  buf.MoveReadPositionBackward(3);
-  buf.Read(output.channels(), kNumChannels, 1);
-  EXPECT_EQ(2, output.channels()[0][0]);
-}
-
-}  // namespace webrtc
diff --git a/common_audio/audio_util.cc b/common_audio/audio_util.cc
deleted file mode 100644
index 2ce2eba..0000000
--- a/common_audio/audio_util.cc
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- *  Copyright (c) 2013 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/common_audio/include/audio_util.h"
-
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-void FloatToS16(const float* src, size_t size, int16_t* dest) {
-  for (size_t i = 0; i < size; ++i)
-    dest[i] = FloatToS16(src[i]);
-}
-
-void S16ToFloat(const int16_t* src, size_t size, float* dest) {
-  for (size_t i = 0; i < size; ++i)
-    dest[i] = S16ToFloat(src[i]);
-}
-
-void FloatS16ToS16(const float* src, size_t size, int16_t* dest) {
-  for (size_t i = 0; i < size; ++i)
-    dest[i] = FloatS16ToS16(src[i]);
-}
-
-void FloatToFloatS16(const float* src, size_t size, float* dest) {
-  for (size_t i = 0; i < size; ++i)
-    dest[i] = FloatToFloatS16(src[i]);
-}
-
-void FloatS16ToFloat(const float* src, size_t size, float* dest) {
-  for (size_t i = 0; i < size; ++i)
-    dest[i] = FloatS16ToFloat(src[i]);
-}
-
-template <>
-void DownmixInterleavedToMono<int16_t>(const int16_t* interleaved,
-                                       size_t num_frames,
-                                       int num_channels,
-                                       int16_t* deinterleaved) {
-  DownmixInterleavedToMonoImpl<int16_t, int32_t>(interleaved, num_frames,
-                                                 num_channels, deinterleaved);
-}
-
-}  // namespace webrtc
diff --git a/common_audio/audio_util_unittest.cc b/common_audio/audio_util_unittest.cc
deleted file mode 100644
index d91b648..0000000
--- a/common_audio/audio_util_unittest.cc
+++ /dev/null
@@ -1,231 +0,0 @@
-/*
- *  Copyright (c) 2013 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/common_audio/include/audio_util.h"
-#include "webrtc/test/gmock.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-namespace {
-
-using ::testing::ElementsAreArray;
-
-void ExpectArraysEq(const int16_t* ref, const int16_t* test, size_t length) {
-  for (size_t i = 0; i < length; ++i) {
-    EXPECT_EQ(ref[i], test[i]);
-  }
-}
-
-void ExpectArraysEq(const float* ref, const float* test, size_t length) {
-  for (size_t i = 0; i < length; ++i) {
-    EXPECT_FLOAT_EQ(ref[i], test[i]);
-  }
-}
-
-TEST(AudioUtilTest, FloatToS16) {
-  const size_t kSize = 9;
-  const float kInput[kSize] = {0.f,
-                               0.4f / 32767.f,
-                               0.6f / 32767.f,
-                               -0.4f / 32768.f,
-                               -0.6f / 32768.f,
-                               1.f,
-                               -1.f,
-                               1.1f,
-                               -1.1f};
-  const int16_t kReference[kSize] = {0,     0,      1,     0,     -1,
-                                     32767, -32768, 32767, -32768};
-  int16_t output[kSize];
-  FloatToS16(kInput, kSize, output);
-  ExpectArraysEq(kReference, output, kSize);
-}
-
-TEST(AudioUtilTest, S16ToFloat) {
-  const size_t kSize = 7;
-  const int16_t kInput[kSize] = {0, 1, -1, 16384, -16384, 32767, -32768};
-  const float kReference[kSize] = {
-      0.f, 1.f / 32767.f, -1.f / 32768.f, 16384.f / 32767.f, -0.5f, 1.f, -1.f};
-  float output[kSize];
-  S16ToFloat(kInput, kSize, output);
-  ExpectArraysEq(kReference, output, kSize);
-}
-
-TEST(AudioUtilTest, FloatS16ToS16) {
-  const size_t kSize = 7;
-  const float kInput[kSize] = {0.f,   0.4f,    0.5f,    -0.4f,
-                               -0.5f, 32768.f, -32769.f};
-  const int16_t kReference[kSize] = {0, 0, 1, 0, -1, 32767, -32768};
-  int16_t output[kSize];
-  FloatS16ToS16(kInput, kSize, output);
-  ExpectArraysEq(kReference, output, kSize);
-}
-
-TEST(AudioUtilTest, FloatToFloatS16) {
-  const size_t kSize = 9;
-  const float kInput[kSize] = {0.f,
-                               0.4f / 32767.f,
-                               0.6f / 32767.f,
-                               -0.4f / 32768.f,
-                               -0.6f / 32768.f,
-                               1.f,
-                               -1.f,
-                               1.1f,
-                               -1.1f};
-  const float kReference[kSize] = {0.f,     0.4f,     0.6f,     -0.4f,    -0.6f,
-                                   32767.f, -32768.f, 36043.7f, -36044.8f};
-  float output[kSize];
-  FloatToFloatS16(kInput, kSize, output);
-  ExpectArraysEq(kReference, output, kSize);
-}
-
-TEST(AudioUtilTest, FloatS16ToFloat) {
-  const size_t kSize = 9;
-  const float kInput[kSize] = {0.f,     0.4f,     0.6f,     -0.4f,    -0.6f,
-                               32767.f, -32768.f, 36043.7f, -36044.8f};
-  const float kReference[kSize] = {0.f,
-                                   0.4f / 32767.f,
-                                   0.6f / 32767.f,
-                                   -0.4f / 32768.f,
-                                   -0.6f / 32768.f,
-                                   1.f,
-                                   -1.f,
-                                   1.1f,
-                                   -1.1f};
-  float output[kSize];
-  FloatS16ToFloat(kInput, kSize, output);
-  ExpectArraysEq(kReference, output, kSize);
-}
-
-TEST(AudioUtilTest, InterleavingStereo) {
-  const int16_t kInterleaved[] = {2, 3, 4, 9, 8, 27, 16, 81};
-  const size_t kSamplesPerChannel = 4;
-  const int kNumChannels = 2;
-  const size_t kLength = kSamplesPerChannel * kNumChannels;
-  int16_t left[kSamplesPerChannel], right[kSamplesPerChannel];
-  int16_t* deinterleaved[] = {left, right};
-  Deinterleave(kInterleaved, kSamplesPerChannel, kNumChannels, deinterleaved);
-  const int16_t kRefLeft[] = {2, 4, 8, 16};
-  const int16_t kRefRight[] = {3, 9, 27, 81};
-  ExpectArraysEq(kRefLeft, left, kSamplesPerChannel);
-  ExpectArraysEq(kRefRight, right, kSamplesPerChannel);
-
-  int16_t interleaved[kLength];
-  Interleave(deinterleaved, kSamplesPerChannel, kNumChannels, interleaved);
-  ExpectArraysEq(kInterleaved, interleaved, kLength);
-}
-
-TEST(AudioUtilTest, InterleavingMonoIsIdentical) {
-  const int16_t kInterleaved[] = {1, 2, 3, 4, 5};
-  const size_t kSamplesPerChannel = 5;
-  const int kNumChannels = 1;
-  int16_t mono[kSamplesPerChannel];
-  int16_t* deinterleaved[] = {mono};
-  Deinterleave(kInterleaved, kSamplesPerChannel, kNumChannels, deinterleaved);
-  ExpectArraysEq(kInterleaved, mono, kSamplesPerChannel);
-
-  int16_t interleaved[kSamplesPerChannel];
-  Interleave(deinterleaved, kSamplesPerChannel, kNumChannels, interleaved);
-  ExpectArraysEq(mono, interleaved, kSamplesPerChannel);
-}
-
-TEST(AudioUtilTest, DownmixInterleavedToMono) {
-  {
-    const size_t kNumFrames = 4;
-    const int kNumChannels = 1;
-    const int16_t interleaved[kNumChannels * kNumFrames] = {1, 2, -1, -3};
-    int16_t deinterleaved[kNumFrames];
-
-    DownmixInterleavedToMono(interleaved, kNumFrames, kNumChannels,
-                             deinterleaved);
-
-    EXPECT_THAT(deinterleaved, ElementsAreArray(interleaved));
-  }
-  {
-    const size_t kNumFrames = 2;
-    const int kNumChannels = 2;
-    const int16_t interleaved[kNumChannels * kNumFrames] = {10, 20, -10, -30};
-    int16_t deinterleaved[kNumFrames];
-
-    DownmixInterleavedToMono(interleaved, kNumFrames, kNumChannels,
-                             deinterleaved);
-    const int16_t expected[kNumFrames] = {15, -20};
-
-    EXPECT_THAT(deinterleaved, ElementsAreArray(expected));
-  }
-  {
-    const size_t kNumFrames = 3;
-    const int kNumChannels = 3;
-    const int16_t interleaved[kNumChannels * kNumFrames] = {
-        30000, 30000, 24001, -5, -10, -20, -30000, -30999, -30000};
-    int16_t deinterleaved[kNumFrames];
-
-    DownmixInterleavedToMono(interleaved, kNumFrames, kNumChannels,
-                             deinterleaved);
-    const int16_t expected[kNumFrames] = {28000, -11, -30333};
-
-    EXPECT_THAT(deinterleaved, ElementsAreArray(expected));
-  }
-}
-
-TEST(AudioUtilTest, DownmixToMonoTest) {
-  {
-    const size_t kNumFrames = 4;
-    const int kNumChannels = 1;
-    const float input_data[kNumChannels][kNumFrames] = {{1.f, 2.f, -1.f, -3.f}};
-    const float* input[kNumChannels];
-    for (int i = 0; i < kNumChannels; ++i) {
-      input[i] = input_data[i];
-    }
-
-    float downmixed[kNumFrames];
-
-    DownmixToMono<float, float>(input, kNumFrames, kNumChannels, downmixed);
-
-    EXPECT_THAT(downmixed, ElementsAreArray(input_data[0]));
-  }
-  {
-    const size_t kNumFrames = 3;
-    const int kNumChannels = 2;
-    const float input_data[kNumChannels][kNumFrames] = {{1.f, 2.f, -1.f},
-                                                        {3.f, 0.f, 1.f}};
-    const float* input[kNumChannels];
-    for (int i = 0; i < kNumChannels; ++i) {
-      input[i] = input_data[i];
-    }
-
-    float downmixed[kNumFrames];
-    const float expected[kNumFrames] = {2.f, 1.f, 0.f};
-
-    DownmixToMono<float, float>(input, kNumFrames, kNumChannels, downmixed);
-
-    EXPECT_THAT(downmixed, ElementsAreArray(expected));
-  }
-  {
-    const size_t kNumFrames = 3;
-    const int kNumChannels = 3;
-    const int16_t input_data[kNumChannels][kNumFrames] = {
-        {30000, -5, -30000}, {30000, -10, -30999}, {24001, -20, -30000}};
-    const int16_t* input[kNumChannels];
-    for (int i = 0; i < kNumChannels; ++i) {
-      input[i] = input_data[i];
-    }
-
-    int16_t downmixed[kNumFrames];
-    const int16_t expected[kNumFrames] = {28000, -11, -30333};
-
-    DownmixToMono<int16_t, int32_t>(input, kNumFrames, kNumChannels, downmixed);
-
-    EXPECT_THAT(downmixed, ElementsAreArray(expected));
-  }
-}
-
-}  // namespace
-}  // namespace webrtc
diff --git a/common_audio/blocker.cc b/common_audio/blocker.cc
deleted file mode 100644
index 6969332..0000000
--- a/common_audio/blocker.cc
+++ /dev/null
@@ -1,238 +0,0 @@
-/*
- *  Copyright (c) 2014 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/common_audio/blocker.h"
-
-#include <string.h>
-
-#include "webrtc/rtc_base/checks.h"
-
-namespace {
-
-// Adds |a| and |b| frame by frame into |result| (basically matrix addition).
-void AddFrames(const float* const* a,
-               size_t a_start_index,
-               const float* const* b,
-               int b_start_index,
-               size_t num_frames,
-               size_t num_channels,
-               float* const* result,
-               size_t result_start_index) {
-  for (size_t i = 0; i < num_channels; ++i) {
-    for (size_t j = 0; j < num_frames; ++j) {
-      result[i][j + result_start_index] =
-          a[i][j + a_start_index] + b[i][j + b_start_index];
-    }
-  }
-}
-
-// Copies |src| into |dst| channel by channel.
-void CopyFrames(const float* const* src,
-                size_t src_start_index,
-                size_t num_frames,
-                size_t num_channels,
-                float* const* dst,
-                size_t dst_start_index) {
-  for (size_t i = 0; i < num_channels; ++i) {
-    memcpy(&dst[i][dst_start_index],
-           &src[i][src_start_index],
-           num_frames * sizeof(dst[i][dst_start_index]));
-  }
-}
-
-// Moves |src| into |dst| channel by channel.
-void MoveFrames(const float* const* src,
-                size_t src_start_index,
-                size_t num_frames,
-                size_t num_channels,
-                float* const* dst,
-                size_t dst_start_index) {
-  for (size_t i = 0; i < num_channels; ++i) {
-    memmove(&dst[i][dst_start_index],
-            &src[i][src_start_index],
-            num_frames * sizeof(dst[i][dst_start_index]));
-  }
-}
-
-void ZeroOut(float* const* buffer,
-             size_t starting_idx,
-             size_t num_frames,
-             size_t num_channels) {
-  for (size_t i = 0; i < num_channels; ++i) {
-    memset(&buffer[i][starting_idx], 0,
-           num_frames * sizeof(buffer[i][starting_idx]));
-  }
-}
-
-// Pointwise multiplies each channel of |frames| with |window|. Results are
-// stored in |frames|.
-void ApplyWindow(const float* window,
-                 size_t num_frames,
-                 size_t num_channels,
-                 float* const* frames) {
-  for (size_t i = 0; i < num_channels; ++i) {
-    for (size_t j = 0; j < num_frames; ++j) {
-      frames[i][j] = frames[i][j] * window[j];
-    }
-  }
-}
-
-size_t gcd(size_t a, size_t b) {
-  size_t tmp;
-  while (b) {
-     tmp = a;
-     a = b;
-     b = tmp % b;
-  }
-  return a;
-}
-
-}  // namespace
-
-namespace webrtc {
-
-Blocker::Blocker(size_t chunk_size,
-                 size_t block_size,
-                 size_t num_input_channels,
-                 size_t num_output_channels,
-                 const float* window,
-                 size_t shift_amount,
-                 BlockerCallback* callback)
-    : chunk_size_(chunk_size),
-      block_size_(block_size),
-      num_input_channels_(num_input_channels),
-      num_output_channels_(num_output_channels),
-      initial_delay_(block_size_ - gcd(chunk_size, shift_amount)),
-      frame_offset_(0),
-      input_buffer_(num_input_channels_, chunk_size_ + initial_delay_),
-      output_buffer_(chunk_size_ + initial_delay_, num_output_channels_),
-      input_block_(block_size_, num_input_channels_),
-      output_block_(block_size_, num_output_channels_),
-      window_(new float[block_size_]),
-      shift_amount_(shift_amount),
-      callback_(callback) {
-  RTC_CHECK_LE(num_output_channels_, num_input_channels_);
-  RTC_CHECK_LE(shift_amount_, block_size_);
-
-  memcpy(window_.get(), window, block_size_ * sizeof(*window_.get()));
-  input_buffer_.MoveReadPositionBackward(initial_delay_);
-}
-
-Blocker::~Blocker() = default;
-
-// When block_size < chunk_size the input and output buffers look like this:
-//
-//                      delay*             chunk_size    chunk_size + delay*
-//  buffer: <-------------|---------------------|---------------|>
-//                _a_              _b_                 _c_
-//
-// On each call to ProcessChunk():
-// 1. New input gets read into sections _b_ and _c_ of the input buffer.
-// 2. We block starting from frame_offset.
-// 3. We block until we reach a block |bl| that doesn't contain any frames
-//    from sections _a_ or _b_ of the input buffer.
-// 4. We window the current block, fire the callback for processing, window
-//    again, and overlap/add to the output buffer.
-// 5. We copy sections _a_ and _b_ of the output buffer into output.
-// 6. For both the input and the output buffers, we copy section _c_ into
-//    section _a_.
-// 7. We set the new frame_offset to be the difference between the first frame
-//    of |bl| and the border between sections _b_ and _c_.
-//
-// When block_size > chunk_size the input and output buffers look like this:
-//
-//                   chunk_size               delay*       chunk_size + delay*
-//  buffer: <-------------|---------------------|---------------|>
-//                _a_              _b_                 _c_
-//
-// On each call to ProcessChunk():
-// The procedure is the same as above, except for:
-// 1. New input gets read into section _c_ of the input buffer.
-// 3. We block until we reach a block |bl| that doesn't contain any frames
-//    from section _a_ of the input buffer.
-// 5. We copy section _a_ of the output buffer into output.
-// 6. For both the input and the output buffers, we copy sections _b_ and _c_
-//    into section _a_ and _b_.
-// 7. We set the new frame_offset to be the difference between the first frame
-//    of |bl| and the border between sections _a_ and _b_.
-//
-// * delay here refers to inintial_delay_
-//
-// TODO(claguna): Look at using ring buffers to eliminate some copies.
-void Blocker::ProcessChunk(const float* const* input,
-                           size_t chunk_size,
-                           size_t num_input_channels,
-                           size_t num_output_channels,
-                           float* const* output) {
-  RTC_CHECK_EQ(chunk_size, chunk_size_);
-  RTC_CHECK_EQ(num_input_channels, num_input_channels_);
-  RTC_CHECK_EQ(num_output_channels, num_output_channels_);
-
-  input_buffer_.Write(input, num_input_channels, chunk_size_);
-  size_t first_frame_in_block = frame_offset_;
-
-  // Loop through blocks.
-  while (first_frame_in_block < chunk_size_) {
-    input_buffer_.Read(input_block_.channels(), num_input_channels,
-                       block_size_);
-    input_buffer_.MoveReadPositionBackward(block_size_ - shift_amount_);
-
-    ApplyWindow(window_.get(),
-                block_size_,
-                num_input_channels_,
-                input_block_.channels());
-    callback_->ProcessBlock(input_block_.channels(),
-                            block_size_,
-                            num_input_channels_,
-                            num_output_channels_,
-                            output_block_.channels());
-    ApplyWindow(window_.get(),
-                block_size_,
-                num_output_channels_,
-                output_block_.channels());
-
-    AddFrames(output_buffer_.channels(),
-              first_frame_in_block,
-              output_block_.channels(),
-              0,
-              block_size_,
-              num_output_channels_,
-              output_buffer_.channels(),
-              first_frame_in_block);
-
-    first_frame_in_block += shift_amount_;
-  }
-
-  // Copy output buffer to output
-  CopyFrames(output_buffer_.channels(),
-             0,
-             chunk_size_,
-             num_output_channels_,
-             output,
-             0);
-
-  // Copy output buffer [chunk_size_, chunk_size_ + initial_delay]
-  // to output buffer [0, initial_delay], zero the rest.
-  MoveFrames(output_buffer_.channels(),
-             chunk_size,
-             initial_delay_,
-             num_output_channels_,
-             output_buffer_.channels(),
-             0);
-  ZeroOut(output_buffer_.channels(),
-          initial_delay_,
-          chunk_size_,
-          num_output_channels_);
-
-  // Calculate new starting frames.
-  frame_offset_ = first_frame_in_block - chunk_size_;
-}
-
-}  // namespace webrtc
diff --git a/common_audio/blocker.h b/common_audio/blocker.h
deleted file mode 100644
index 3832471..0000000
--- a/common_audio/blocker.h
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- *  Copyright (c) 2014 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_COMMON_AUDIO_BLOCKER_H_
-#define WEBRTC_COMMON_AUDIO_BLOCKER_H_
-
-#include <memory>
-
-#include "webrtc/common_audio/audio_ring_buffer.h"
-#include "webrtc/common_audio/channel_buffer.h"
-
-namespace webrtc {
-
-// The callback function to process audio in the time domain. Input has already
-// been windowed, and output will be windowed. The number of input channels
-// must be >= the number of output channels.
-class BlockerCallback {
- public:
-  virtual ~BlockerCallback() {}
-
-  virtual void ProcessBlock(const float* const* input,
-                            size_t num_frames,
-                            size_t num_input_channels,
-                            size_t num_output_channels,
-                            float* const* output) = 0;
-};
-
-// The main purpose of Blocker is to abstract away the fact that often we
-// receive a different number of audio frames than our transform takes. For
-// example, most FFTs work best when the fft-size is a power of 2, but suppose
-// we receive 20ms of audio at a sample rate of 48000. That comes to 960 frames
-// of audio, which is not a power of 2. Blocker allows us to specify the
-// transform and all other necessary processing via the Process() callback
-// function without any constraints on the transform-size
-// (read: |block_size_|) or received-audio-size (read: |chunk_size_|).
-// We handle this for the multichannel audio case, allowing for different
-// numbers of input and output channels (for example, beamforming takes 2 or
-// more input channels and returns 1 output channel). Audio signals are
-// represented as deinterleaved floats in the range [-1, 1].
-//
-// Blocker is responsible for:
-// - blocking audio while handling potential discontinuities on the edges
-//   of chunks
-// - windowing blocks before sending them to Process()
-// - windowing processed blocks, and overlap-adding them together before
-//   sending back a processed chunk
-//
-// To use blocker:
-// 1. Impelment a BlockerCallback object |bc|.
-// 2. Instantiate a Blocker object |b|, passing in |bc|.
-// 3. As you receive audio, call b.ProcessChunk() to get processed audio.
-//
-// A small amount of delay is added to the first received chunk to deal with
-// the difference in chunk/block sizes. This delay is <= chunk_size.
-//
-// Ownership of window is retained by the caller.  That is, Blocker makes a
-// copy of window and does not attempt to delete it.
-class Blocker {
- public:
-  Blocker(size_t chunk_size,
-          size_t block_size,
-          size_t num_input_channels,
-          size_t num_output_channels,
-          const float* window,
-          size_t shift_amount,
-          BlockerCallback* callback);
-  ~Blocker();
-
-  void ProcessChunk(const float* const* input,
-                    size_t chunk_size,
-                    size_t num_input_channels,
-                    size_t num_output_channels,
-                    float* const* output);
-
-  size_t initial_delay() const { return initial_delay_; }
-
- private:
-  const size_t chunk_size_;
-  const size_t block_size_;
-  const size_t num_input_channels_;
-  const size_t num_output_channels_;
-
-  // The number of frames of delay to add at the beginning of the first chunk.
-  const size_t initial_delay_;
-
-  // The frame index into the input buffer where the first block should be read
-  // from. This is necessary because shift_amount_ is not necessarily a
-  // multiple of chunk_size_, so blocks won't line up at the start of the
-  // buffer.
-  size_t frame_offset_;
-
-  // Since blocks nearly always overlap, there are certain blocks that require
-  // frames from the end of one chunk and the beginning of the next chunk. The
-  // input and output buffers are responsible for saving those frames between
-  // calls to ProcessChunk().
-  //
-  // Both contain |initial delay| + |chunk_size| frames. The input is a fairly
-  // standard FIFO, but due to the overlap-add it's harder to use an
-  // AudioRingBuffer for the output.
-  AudioRingBuffer input_buffer_;
-  ChannelBuffer<float> output_buffer_;
-
-  // Space for the input block (can't wrap because of windowing).
-  ChannelBuffer<float> input_block_;
-
-  // Space for the output block (can't wrap because of overlap/add).
-  ChannelBuffer<float> output_block_;
-
-  std::unique_ptr<float[]> window_;
-
-  // The amount of frames between the start of contiguous blocks. For example,
-  // |shift_amount_| = |block_size_| / 2 for a Hann window.
-  size_t shift_amount_;
-
-  BlockerCallback* callback_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_COMMON_AUDIO_BLOCKER_H_
diff --git a/common_audio/blocker_unittest.cc b/common_audio/blocker_unittest.cc
deleted file mode 100644
index 3af9699..0000000
--- a/common_audio/blocker_unittest.cc
+++ /dev/null
@@ -1,345 +0,0 @@
-/*
- *  Copyright (c) 2014 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 <memory>
-
-#include "webrtc/common_audio/blocker.h"
-
-#include "webrtc/rtc_base/arraysize.h"
-#include "webrtc/test/gtest.h"
-
-namespace {
-
-// Callback Function to add 3 to every sample in the signal.
-class PlusThreeBlockerCallback : public webrtc::BlockerCallback {
- public:
-  void ProcessBlock(const float* const* input,
-                    size_t num_frames,
-                    size_t num_input_channels,
-                    size_t num_output_channels,
-                    float* const* output) override {
-    for (size_t i = 0; i < num_output_channels; ++i) {
-      for (size_t j = 0; j < num_frames; ++j) {
-        output[i][j] = input[i][j] + 3;
-      }
-    }
-  }
-};
-
-// No-op Callback Function.
-class CopyBlockerCallback : public webrtc::BlockerCallback {
- public:
-  void ProcessBlock(const float* const* input,
-                    size_t num_frames,
-                    size_t num_input_channels,
-                    size_t num_output_channels,
-                    float* const* output) override {
-    for (size_t i = 0; i < num_output_channels; ++i) {
-      for (size_t j = 0; j < num_frames; ++j) {
-        output[i][j] = input[i][j];
-      }
-    }
-  }
-};
-
-}  // namespace
-
-namespace webrtc {
-
-// Tests blocking with a window that multiplies the signal by 2, a callback
-// that adds 3 to each sample in the signal, and different combinations of chunk
-// size, block size, and shift amount.
-class BlockerTest : public ::testing::Test {
- protected:
-  void RunTest(Blocker* blocker,
-               size_t chunk_size,
-               size_t num_frames,
-               const float* const* input,
-               float* const* input_chunk,
-               float* const* output,
-               float* const* output_chunk,
-               size_t num_input_channels,
-               size_t num_output_channels) {
-    size_t start = 0;
-    size_t end = chunk_size - 1;
-    while (end < num_frames) {
-      CopyTo(input_chunk, 0, start, num_input_channels, chunk_size, input);
-      blocker->ProcessChunk(input_chunk,
-                            chunk_size,
-                            num_input_channels,
-                            num_output_channels,
-                            output_chunk);
-      CopyTo(output, start, 0, num_output_channels, chunk_size, output_chunk);
-
-      start += chunk_size;
-      end += chunk_size;
-    }
-  }
-
-  void ValidateSignalEquality(const float* const* expected,
-                              const float* const* actual,
-                              size_t num_channels,
-                              size_t num_frames) {
-    for (size_t i = 0; i < num_channels; ++i) {
-      for (size_t j = 0; j < num_frames; ++j) {
-        EXPECT_FLOAT_EQ(expected[i][j], actual[i][j]);
-      }
-    }
-  }
-
-  void ValidateInitialDelay(const float* const* output,
-                            size_t num_channels,
-                            size_t num_frames,
-                            size_t initial_delay) {
-    for (size_t i = 0; i < num_channels; ++i) {
-      for (size_t j = 0; j < num_frames; ++j) {
-        if (j < initial_delay) {
-          EXPECT_FLOAT_EQ(output[i][j], 0.f);
-        } else {
-          EXPECT_GT(output[i][j], 0.f);
-        }
-      }
-    }
-  }
-
-  static void CopyTo(float* const* dst,
-                     size_t start_index_dst,
-                     size_t start_index_src,
-                     size_t num_channels,
-                     size_t num_frames,
-                     const float* const* src) {
-    for (size_t i = 0; i < num_channels; ++i) {
-      memcpy(&dst[i][start_index_dst],
-             &src[i][start_index_src],
-             num_frames * sizeof(float));
-    }
-  }
-};
-
-TEST_F(BlockerTest, TestBlockerMutuallyPrimeChunkandBlockSize) {
-  const size_t kNumInputChannels = 3;
-  const size_t kNumOutputChannels = 2;
-  const size_t kNumFrames = 10;
-  const size_t kBlockSize = 4;
-  const size_t kChunkSize = 5;
-  const size_t kShiftAmount = 2;
-
-  const float kInput[kNumInputChannels][kNumFrames] = {
-      {1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
-      {2, 2, 2, 2, 2, 2, 2, 2, 2, 2},
-      {3, 3, 3, 3, 3, 3, 3, 3, 3, 3}};
-  ChannelBuffer<float> input_cb(kNumFrames, kNumInputChannels);
-  input_cb.SetDataForTesting(kInput[0], sizeof(kInput) / sizeof(**kInput));
-
-  const float kExpectedOutput[kNumInputChannels][kNumFrames] = {
-      {6, 6, 12, 20, 20, 20, 20, 20, 20, 20},
-      {6, 6, 12, 28, 28, 28, 28, 28, 28, 28}};
-  ChannelBuffer<float> expected_output_cb(kNumFrames, kNumInputChannels);
-  expected_output_cb.SetDataForTesting(
-      kExpectedOutput[0], sizeof(kExpectedOutput) / sizeof(**kExpectedOutput));
-
-  const float kWindow[kBlockSize] = {2.f, 2.f, 2.f, 2.f};
-
-  ChannelBuffer<float> actual_output_cb(kNumFrames, kNumOutputChannels);
-  ChannelBuffer<float> input_chunk_cb(kChunkSize, kNumInputChannels);
-  ChannelBuffer<float> output_chunk_cb(kChunkSize, kNumOutputChannels);
-
-  PlusThreeBlockerCallback callback;
-  Blocker blocker(kChunkSize,
-                  kBlockSize,
-                  kNumInputChannels,
-                  kNumOutputChannels,
-                  kWindow,
-                  kShiftAmount,
-                  &callback);
-
-  RunTest(&blocker,
-          kChunkSize,
-          kNumFrames,
-          input_cb.channels(),
-          input_chunk_cb.channels(),
-          actual_output_cb.channels(),
-          output_chunk_cb.channels(),
-          kNumInputChannels,
-          kNumOutputChannels);
-
-  ValidateSignalEquality(expected_output_cb.channels(),
-                         actual_output_cb.channels(),
-                         kNumOutputChannels,
-                         kNumFrames);
-}
-
-TEST_F(BlockerTest, TestBlockerMutuallyPrimeShiftAndBlockSize) {
-  const size_t kNumInputChannels = 3;
-  const size_t kNumOutputChannels = 2;
-  const size_t kNumFrames = 12;
-  const size_t kBlockSize = 4;
-  const size_t kChunkSize = 6;
-  const size_t kShiftAmount = 3;
-
-  const float kInput[kNumInputChannels][kNumFrames] = {
-      {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
-      {2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2},
-      {3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}};
-  ChannelBuffer<float> input_cb(kNumFrames, kNumInputChannels);
-  input_cb.SetDataForTesting(kInput[0], sizeof(kInput) / sizeof(**kInput));
-
-  const float kExpectedOutput[kNumOutputChannels][kNumFrames] = {
-      {6, 10, 10, 20, 10, 10, 20, 10, 10, 20, 10, 10},
-      {6, 14, 14, 28, 14, 14, 28, 14, 14, 28, 14, 14}};
-  ChannelBuffer<float> expected_output_cb(kNumFrames, kNumOutputChannels);
-  expected_output_cb.SetDataForTesting(
-      kExpectedOutput[0], sizeof(kExpectedOutput) / sizeof(**kExpectedOutput));
-
-  const float kWindow[kBlockSize] = {2.f, 2.f, 2.f, 2.f};
-
-  ChannelBuffer<float> actual_output_cb(kNumFrames, kNumOutputChannels);
-  ChannelBuffer<float> input_chunk_cb(kChunkSize, kNumInputChannels);
-  ChannelBuffer<float> output_chunk_cb(kChunkSize, kNumOutputChannels);
-
-  PlusThreeBlockerCallback callback;
-  Blocker blocker(kChunkSize,
-                  kBlockSize,
-                  kNumInputChannels,
-                  kNumOutputChannels,
-                  kWindow,
-                  kShiftAmount,
-                  &callback);
-
-  RunTest(&blocker,
-          kChunkSize,
-          kNumFrames,
-          input_cb.channels(),
-          input_chunk_cb.channels(),
-          actual_output_cb.channels(),
-          output_chunk_cb.channels(),
-          kNumInputChannels,
-          kNumOutputChannels);
-
-  ValidateSignalEquality(expected_output_cb.channels(),
-                         actual_output_cb.channels(),
-                         kNumOutputChannels,
-                         kNumFrames);
-}
-
-TEST_F(BlockerTest, TestBlockerNoOverlap) {
-  const size_t kNumInputChannels = 3;
-  const size_t kNumOutputChannels = 2;
-  const size_t kNumFrames = 12;
-  const size_t kBlockSize = 4;
-  const size_t kChunkSize = 4;
-  const size_t kShiftAmount = 4;
-
-  const float kInput[kNumInputChannels][kNumFrames] = {
-      {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
-      {2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2},
-      {3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}};
-  ChannelBuffer<float> input_cb(kNumFrames, kNumInputChannels);
-  input_cb.SetDataForTesting(kInput[0], sizeof(kInput) / sizeof(**kInput));
-
-  const float kExpectedOutput[kNumOutputChannels][kNumFrames] = {
-      {10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10},
-      {14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14}};
-  ChannelBuffer<float> expected_output_cb(kNumFrames, kNumOutputChannels);
-  expected_output_cb.SetDataForTesting(
-      kExpectedOutput[0], sizeof(kExpectedOutput) / sizeof(**kExpectedOutput));
-
-  const float kWindow[kBlockSize] = {2.f, 2.f, 2.f, 2.f};
-
-  ChannelBuffer<float> actual_output_cb(kNumFrames, kNumOutputChannels);
-  ChannelBuffer<float> input_chunk_cb(kChunkSize, kNumInputChannels);
-  ChannelBuffer<float> output_chunk_cb(kChunkSize, kNumOutputChannels);
-
-  PlusThreeBlockerCallback callback;
-  Blocker blocker(kChunkSize,
-                  kBlockSize,
-                  kNumInputChannels,
-                  kNumOutputChannels,
-                  kWindow,
-                  kShiftAmount,
-                  &callback);
-
-  RunTest(&blocker,
-          kChunkSize,
-          kNumFrames,
-          input_cb.channels(),
-          input_chunk_cb.channels(),
-          actual_output_cb.channels(),
-          output_chunk_cb.channels(),
-          kNumInputChannels,
-          kNumOutputChannels);
-
-  ValidateSignalEquality(expected_output_cb.channels(),
-                         actual_output_cb.channels(),
-                         kNumOutputChannels,
-                         kNumFrames);
-}
-
-TEST_F(BlockerTest, InitialDelaysAreMinimum) {
-  const size_t kNumInputChannels = 3;
-  const size_t kNumOutputChannels = 2;
-  const size_t kNumFrames = 1280;
-  const size_t kChunkSize[] =
-      {80, 80, 80, 80, 80, 80, 160, 160, 160, 160, 160, 160};
-  const size_t kBlockSize[] =
-      {64, 64, 64, 128, 128, 128, 128, 128, 128, 256, 256, 256};
-  const size_t kShiftAmount[] =
-      {16, 32, 64, 32, 64, 128, 32, 64, 128, 64, 128, 256};
-  const size_t kInitialDelay[] =
-      {48, 48, 48, 112, 112, 112, 96, 96, 96, 224, 224, 224};
-
-  float input[kNumInputChannels][kNumFrames];
-  for (size_t i = 0; i < kNumInputChannels; ++i) {
-    for (size_t j = 0; j < kNumFrames; ++j) {
-      input[i][j] = i + 1;
-    }
-  }
-  ChannelBuffer<float> input_cb(kNumFrames, kNumInputChannels);
-  input_cb.SetDataForTesting(input[0], sizeof(input) / sizeof(**input));
-
-  ChannelBuffer<float> output_cb(kNumFrames, kNumOutputChannels);
-
-  CopyBlockerCallback callback;
-
-  for (size_t i = 0; i < arraysize(kChunkSize); ++i) {
-    std::unique_ptr<float[]> window(new float[kBlockSize[i]]);
-    for (size_t j = 0; j < kBlockSize[i]; ++j) {
-      window[j] = 1.f;
-    }
-
-    ChannelBuffer<float> input_chunk_cb(kChunkSize[i], kNumInputChannels);
-    ChannelBuffer<float> output_chunk_cb(kChunkSize[i], kNumOutputChannels);
-
-    Blocker blocker(kChunkSize[i],
-                    kBlockSize[i],
-                    kNumInputChannels,
-                    kNumOutputChannels,
-                    window.get(),
-                    kShiftAmount[i],
-                    &callback);
-
-    RunTest(&blocker,
-            kChunkSize[i],
-            kNumFrames,
-            input_cb.channels(),
-            input_chunk_cb.channels(),
-            output_cb.channels(),
-            output_chunk_cb.channels(),
-            kNumInputChannels,
-            kNumOutputChannels);
-
-    ValidateInitialDelay(output_cb.channels(),
-                         kNumOutputChannels,
-                         kNumFrames,
-                         kInitialDelay[i]);
-  }
-}
-
-}  // namespace webrtc
diff --git a/common_audio/channel_buffer.cc b/common_audio/channel_buffer.cc
deleted file mode 100644
index e7912bb..0000000
--- a/common_audio/channel_buffer.cc
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- *  Copyright (c) 2014 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/common_audio/channel_buffer.h"
-
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-
-IFChannelBuffer::IFChannelBuffer(size_t num_frames,
-                                 size_t num_channels,
-                                 size_t num_bands)
-    : ivalid_(true),
-      ibuf_(num_frames, num_channels, num_bands),
-      fvalid_(true),
-      fbuf_(num_frames, num_channels, num_bands) {}
-
-IFChannelBuffer::~IFChannelBuffer() = default;
-
-ChannelBuffer<int16_t>* IFChannelBuffer::ibuf() {
-  RefreshI();
-  fvalid_ = false;
-  return &ibuf_;
-}
-
-ChannelBuffer<float>* IFChannelBuffer::fbuf() {
-  RefreshF();
-  ivalid_ = false;
-  return &fbuf_;
-}
-
-const ChannelBuffer<int16_t>* IFChannelBuffer::ibuf_const() const {
-  RefreshI();
-  return &ibuf_;
-}
-
-const ChannelBuffer<float>* IFChannelBuffer::fbuf_const() const {
-  RefreshF();
-  return &fbuf_;
-}
-
-void IFChannelBuffer::RefreshF() const {
-  if (!fvalid_) {
-    RTC_DCHECK(ivalid_);
-    fbuf_.set_num_channels(ibuf_.num_channels());
-    const int16_t* const* int_channels = ibuf_.channels();
-    float* const* float_channels = fbuf_.channels();
-    for (size_t i = 0; i < ibuf_.num_channels(); ++i) {
-      for (size_t j = 0; j < ibuf_.num_frames(); ++j) {
-        float_channels[i][j] = int_channels[i][j];
-      }
-    }
-    fvalid_ = true;
-  }
-}
-
-void IFChannelBuffer::RefreshI() const {
-  if (!ivalid_) {
-    RTC_DCHECK(fvalid_);
-    int16_t* const* int_channels = ibuf_.channels();
-    ibuf_.set_num_channels(fbuf_.num_channels());
-    const float* const* float_channels = fbuf_.channels();
-    for (size_t i = 0; i < fbuf_.num_channels(); ++i) {
-      FloatS16ToS16(float_channels[i],
-                    ibuf_.num_frames(),
-                    int_channels[i]);
-    }
-    ivalid_ = true;
-  }
-}
-
-}  // namespace webrtc
diff --git a/common_audio/channel_buffer.h b/common_audio/channel_buffer.h
deleted file mode 100644
index 5d4fb88..0000000
--- a/common_audio/channel_buffer.h
+++ /dev/null
@@ -1,186 +0,0 @@
-/*
- *  Copyright (c) 2014 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_COMMON_AUDIO_CHANNEL_BUFFER_H_
-#define WEBRTC_COMMON_AUDIO_CHANNEL_BUFFER_H_
-
-#include <string.h>
-
-#include <memory>
-
-#include "webrtc/common_audio/include/audio_util.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/gtest_prod_util.h"
-
-namespace webrtc {
-
-// Helper to encapsulate a contiguous data buffer, full or split into frequency
-// bands, with access to a pointer arrays of the deinterleaved channels and
-// bands. The buffer is zero initialized at creation.
-//
-// The buffer structure is showed below for a 2 channel and 2 bands case:
-//
-// |data_|:
-// { [ --- b1ch1 --- ] [ --- b2ch1 --- ] [ --- b1ch2 --- ] [ --- b2ch2 --- ] }
-//
-// The pointer arrays for the same example are as follows:
-//
-// |channels_|:
-// { [ b1ch1* ] [ b1ch2* ] [ b2ch1* ] [ b2ch2* ] }
-//
-// |bands_|:
-// { [ b1ch1* ] [ b2ch1* ] [ b1ch2* ] [ b2ch2* ] }
-template <typename T>
-class ChannelBuffer {
- public:
-  ChannelBuffer(size_t num_frames,
-                size_t num_channels,
-                size_t num_bands = 1)
-      : data_(new T[num_frames * num_channels]()),
-        channels_(new T*[num_channels * num_bands]),
-        bands_(new T*[num_channels * num_bands]),
-        num_frames_(num_frames),
-        num_frames_per_band_(num_frames / num_bands),
-        num_allocated_channels_(num_channels),
-        num_channels_(num_channels),
-        num_bands_(num_bands) {
-    for (size_t i = 0; i < num_allocated_channels_; ++i) {
-      for (size_t j = 0; j < num_bands_; ++j) {
-        channels_[j * num_allocated_channels_ + i] =
-            &data_[i * num_frames_ + j * num_frames_per_band_];
-        bands_[i * num_bands_ + j] = channels_[j * num_allocated_channels_ + i];
-      }
-    }
-  }
-
-  // Returns a pointer array to the full-band channels (or lower band channels).
-  // Usage:
-  // channels()[channel][sample].
-  // Where:
-  // 0 <= channel < |num_allocated_channels_|
-  // 0 <= sample < |num_frames_|
-  T* const* channels() { return channels(0); }
-  const T* const* channels() const { return channels(0); }
-
-  // Returns a pointer array to the channels for a specific band.
-  // Usage:
-  // channels(band)[channel][sample].
-  // Where:
-  // 0 <= band < |num_bands_|
-  // 0 <= channel < |num_allocated_channels_|
-  // 0 <= sample < |num_frames_per_band_|
-  const T* const* channels(size_t band) const {
-    RTC_DCHECK_LT(band, num_bands_);
-    return &channels_[band * num_allocated_channels_];
-  }
-  T* const* channels(size_t band) {
-    const ChannelBuffer<T>* t = this;
-    return const_cast<T* const*>(t->channels(band));
-  }
-
-  // Returns a pointer array to the bands for a specific channel.
-  // Usage:
-  // bands(channel)[band][sample].
-  // Where:
-  // 0 <= channel < |num_channels_|
-  // 0 <= band < |num_bands_|
-  // 0 <= sample < |num_frames_per_band_|
-  const T* const* bands(size_t channel) const {
-    RTC_DCHECK_LT(channel, num_channels_);
-    RTC_DCHECK_GE(channel, 0);
-    return &bands_[channel * num_bands_];
-  }
-  T* const* bands(size_t channel) {
-    const ChannelBuffer<T>* t = this;
-    return const_cast<T* const*>(t->bands(channel));
-  }
-
-  // Sets the |slice| pointers to the |start_frame| position for each channel.
-  // Returns |slice| for convenience.
-  const T* const* Slice(T** slice, size_t start_frame) const {
-    RTC_DCHECK_LT(start_frame, num_frames_);
-    for (size_t i = 0; i < num_channels_; ++i)
-      slice[i] = &channels_[i][start_frame];
-    return slice;
-  }
-  T** Slice(T** slice, size_t start_frame) {
-    const ChannelBuffer<T>* t = this;
-    return const_cast<T**>(t->Slice(slice, start_frame));
-  }
-
-  size_t num_frames() const { return num_frames_; }
-  size_t num_frames_per_band() const { return num_frames_per_band_; }
-  size_t num_channels() const { return num_channels_; }
-  size_t num_bands() const { return num_bands_; }
-  size_t size() const {return num_frames_ * num_allocated_channels_; }
-
-  void set_num_channels(size_t num_channels) {
-    RTC_DCHECK_LE(num_channels, num_allocated_channels_);
-    num_channels_ = num_channels;
-  }
-
-  void SetDataForTesting(const T* data, size_t size) {
-    RTC_CHECK_EQ(size, this->size());
-    memcpy(data_.get(), data, size * sizeof(*data));
-  }
-
- private:
-  std::unique_ptr<T[]> data_;
-  std::unique_ptr<T* []> channels_;
-  std::unique_ptr<T* []> bands_;
-  const size_t num_frames_;
-  const size_t num_frames_per_band_;
-  // Number of channels the internal buffer holds.
-  const size_t num_allocated_channels_;
-  // Number of channels the user sees.
-  size_t num_channels_;
-  const size_t num_bands_;
-};
-
-// One int16_t and one float ChannelBuffer that are kept in sync. The sync is
-// broken when someone requests write access to either ChannelBuffer, and
-// reestablished when someone requests the outdated ChannelBuffer. It is
-// therefore safe to use the return value of ibuf_const() and fbuf_const()
-// until the next call to ibuf() or fbuf(), and the return value of ibuf() and
-// fbuf() until the next call to any of the other functions.
-class IFChannelBuffer {
- public:
-  IFChannelBuffer(size_t num_frames, size_t num_channels, size_t num_bands = 1);
-  ~IFChannelBuffer();
-
-  ChannelBuffer<int16_t>* ibuf();
-  ChannelBuffer<float>* fbuf();
-  const ChannelBuffer<int16_t>* ibuf_const() const;
-  const ChannelBuffer<float>* fbuf_const() const;
-
-  size_t num_frames() const { return ibuf_.num_frames(); }
-  size_t num_frames_per_band() const { return ibuf_.num_frames_per_band(); }
-  size_t num_channels() const {
-    return ivalid_ ? ibuf_.num_channels() : fbuf_.num_channels();
-  }
-  void set_num_channels(size_t num_channels) {
-    ibuf_.set_num_channels(num_channels);
-    fbuf_.set_num_channels(num_channels);
-  }
-  size_t num_bands() const { return ibuf_.num_bands(); }
-
- private:
-  void RefreshF() const;
-  void RefreshI() const;
-
-  mutable bool ivalid_;
-  mutable ChannelBuffer<int16_t> ibuf_;
-  mutable bool fvalid_;
-  mutable ChannelBuffer<float> fbuf_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_COMMON_AUDIO_CHANNEL_BUFFER_H_
diff --git a/common_audio/channel_buffer_unittest.cc b/common_audio/channel_buffer_unittest.cc
deleted file mode 100644
index f4171ba..0000000
--- a/common_audio/channel_buffer_unittest.cc
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- *  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/common_audio/channel_buffer.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-namespace {
-
-const size_t kNumFrames = 480u;
-const size_t kStereo = 2u;
-const size_t kMono = 1u;
-
-void ExpectNumChannels(const IFChannelBuffer& ifchb, size_t num_channels) {
-  EXPECT_EQ(ifchb.ibuf_const()->num_channels(), num_channels);
-  EXPECT_EQ(ifchb.fbuf_const()->num_channels(), num_channels);
-  EXPECT_EQ(ifchb.num_channels(), num_channels);
-}
-
-}  // namespace
-
-TEST(ChannelBufferTest, SetNumChannelsSetsNumChannels) {
-  ChannelBuffer<float> chb(kNumFrames, kStereo);
-  EXPECT_EQ(chb.num_channels(), kStereo);
-  chb.set_num_channels(kMono);
-  EXPECT_EQ(chb.num_channels(), kMono);
-}
-
-TEST(IFChannelBufferTest, SetNumChannelsSetsChannelBuffersNumChannels) {
-  IFChannelBuffer ifchb(kNumFrames, kStereo);
-  ExpectNumChannels(ifchb, kStereo);
-  ifchb.set_num_channels(kMono);
-  ExpectNumChannels(ifchb, kMono);
-}
-
-TEST(IFChannelBufferTest, SettingNumChannelsOfOneChannelBufferSetsTheOther) {
-  IFChannelBuffer ifchb(kNumFrames, kStereo);
-  ExpectNumChannels(ifchb, kStereo);
-  ifchb.ibuf()->set_num_channels(kMono);
-  ExpectNumChannels(ifchb, kMono);
-  ifchb.fbuf()->set_num_channels(kStereo);
-  ExpectNumChannels(ifchb, kStereo);
-}
-
-#if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
-TEST(ChannelBufferTest, SetNumChannelsDeathTest) {
-  ChannelBuffer<float> chb(kNumFrames, kMono);
-  EXPECT_DEATH(chb.set_num_channels(kStereo), "num_channels");
-}
-
-TEST(IFChannelBufferTest, SetNumChannelsDeathTest) {
-  IFChannelBuffer ifchb(kNumFrames, kMono);
-  EXPECT_DEATH(ifchb.ibuf()->set_num_channels(kStereo), "num_channels");
-}
-#endif
-
-}  // namespace webrtc
diff --git a/common_audio/fft4g.c b/common_audio/fft4g.c
deleted file mode 100644
index 9cf7b9f..0000000
--- a/common_audio/fft4g.c
+++ /dev/null
@@ -1,1332 +0,0 @@
-/*
- * http://www.kurims.kyoto-u.ac.jp/~ooura/fft.html
- * Copyright Takuya OOURA, 1996-2001
- *
- * You may use, copy, modify and distribute this code for any purpose (include
- * commercial use) and without fee. Please refer to this package when you modify
- * this code.
- *
- * Changes:
- * Trivial type modifications by the WebRTC authors.
- */
-
-/*
-Fast Fourier/Cosine/Sine Transform
-    dimension   :one
-    data length :power of 2
-    decimation  :frequency
-    radix       :4, 2
-    data        :inplace
-    table       :use
-functions
-    cdft: Complex Discrete Fourier Transform
-    rdft: Real Discrete Fourier Transform
-    ddct: Discrete Cosine Transform
-    ddst: Discrete Sine Transform
-    dfct: Cosine Transform of RDFT (Real Symmetric DFT)
-    dfst: Sine Transform of RDFT (Real Anti-symmetric DFT)
-function prototypes
-    void cdft(int, int, float *, int *, float *);
-    void rdft(size_t, int, float *, size_t *, float *);
-    void ddct(int, int, float *, int *, float *);
-    void ddst(int, int, float *, int *, float *);
-    void dfct(int, float *, float *, int *, float *);
-    void dfst(int, float *, float *, int *, float *);
-
-
--------- Complex DFT (Discrete Fourier Transform) --------
-    [definition]
-        <case1>
-            X[k] = sum_j=0^n-1 x[j]*exp(2*pi*i*j*k/n), 0<=k<n
-        <case2>
-            X[k] = sum_j=0^n-1 x[j]*exp(-2*pi*i*j*k/n), 0<=k<n
-        (notes: sum_j=0^n-1 is a summation from j=0 to n-1)
-    [usage]
-        <case1>
-            ip[0] = 0; // first time only
-            cdft(2*n, 1, a, ip, w);
-        <case2>
-            ip[0] = 0; // first time only
-            cdft(2*n, -1, a, ip, w);
-    [parameters]
-        2*n            :data length (int)
-                        n >= 1, n = power of 2
-        a[0...2*n-1]   :input/output data (float *)
-                        input data
-                            a[2*j] = Re(x[j]),
-                            a[2*j+1] = Im(x[j]), 0<=j<n
-                        output data
-                            a[2*k] = Re(X[k]),
-                            a[2*k+1] = Im(X[k]), 0<=k<n
-        ip[0...*]      :work area for bit reversal (int *)
-                        length of ip >= 2+sqrt(n)
-                        strictly,
-                        length of ip >=
-                            2+(1<<(int)(log(n+0.5)/log(2))/2).
-                        ip[0],ip[1] are pointers of the cos/sin table.
-        w[0...n/2-1]   :cos/sin table (float *)
-                        w[],ip[] are initialized if ip[0] == 0.
-    [remark]
-        Inverse of
-            cdft(2*n, -1, a, ip, w);
-        is
-            cdft(2*n, 1, a, ip, w);
-            for (j = 0; j <= 2 * n - 1; j++) {
-                a[j] *= 1.0 / n;
-            }
-        .
-
-
--------- Real DFT / Inverse of Real DFT --------
-    [definition]
-        <case1> RDFT
-            R[k] = sum_j=0^n-1 a[j]*cos(2*pi*j*k/n), 0<=k<=n/2
-            I[k] = sum_j=0^n-1 a[j]*sin(2*pi*j*k/n), 0<k<n/2
-        <case2> IRDFT (excluding scale)
-            a[k] = (R[0] + R[n/2]*cos(pi*k))/2 +
-                   sum_j=1^n/2-1 R[j]*cos(2*pi*j*k/n) +
-                   sum_j=1^n/2-1 I[j]*sin(2*pi*j*k/n), 0<=k<n
-    [usage]
-        <case1>
-            ip[0] = 0; // first time only
-            rdft(n, 1, a, ip, w);
-        <case2>
-            ip[0] = 0; // first time only
-            rdft(n, -1, a, ip, w);
-    [parameters]
-        n              :data length (size_t)
-                        n >= 2, n = power of 2
-        a[0...n-1]     :input/output data (float *)
-                        <case1>
-                            output data
-                                a[2*k] = R[k], 0<=k<n/2
-                                a[2*k+1] = I[k], 0<k<n/2
-                                a[1] = R[n/2]
-                        <case2>
-                            input data
-                                a[2*j] = R[j], 0<=j<n/2
-                                a[2*j+1] = I[j], 0<j<n/2
-                                a[1] = R[n/2]
-        ip[0...*]      :work area for bit reversal (size_t *)
-                        length of ip >= 2+sqrt(n/2)
-                        strictly,
-                        length of ip >=
-                            2+(1<<(int)(log(n/2+0.5)/log(2))/2).
-                        ip[0],ip[1] are pointers of the cos/sin table.
-        w[0...n/2-1]   :cos/sin table (float *)
-                        w[],ip[] are initialized if ip[0] == 0.
-    [remark]
-        Inverse of
-            rdft(n, 1, a, ip, w);
-        is
-            rdft(n, -1, a, ip, w);
-            for (j = 0; j <= n - 1; j++) {
-                a[j] *= 2.0 / n;
-            }
-        .
-
-
--------- DCT (Discrete Cosine Transform) / Inverse of DCT --------
-    [definition]
-        <case1> IDCT (excluding scale)
-            C[k] = sum_j=0^n-1 a[j]*cos(pi*j*(k+1/2)/n), 0<=k<n
-        <case2> DCT
-            C[k] = sum_j=0^n-1 a[j]*cos(pi*(j+1/2)*k/n), 0<=k<n
-    [usage]
-        <case1>
-            ip[0] = 0; // first time only
-            ddct(n, 1, a, ip, w);
-        <case2>
-            ip[0] = 0; // first time only
-            ddct(n, -1, a, ip, w);
-    [parameters]
-        n              :data length (int)
-                        n >= 2, n = power of 2
-        a[0...n-1]     :input/output data (float *)
-                        output data
-                            a[k] = C[k], 0<=k<n
-        ip[0...*]      :work area for bit reversal (int *)
-                        length of ip >= 2+sqrt(n/2)
-                        strictly,
-                        length of ip >=
-                            2+(1<<(int)(log(n/2+0.5)/log(2))/2).
-                        ip[0],ip[1] are pointers of the cos/sin table.
-        w[0...n*5/4-1] :cos/sin table (float *)
-                        w[],ip[] are initialized if ip[0] == 0.
-    [remark]
-        Inverse of
-            ddct(n, -1, a, ip, w);
-        is
-            a[0] *= 0.5;
-            ddct(n, 1, a, ip, w);
-            for (j = 0; j <= n - 1; j++) {
-                a[j] *= 2.0 / n;
-            }
-        .
-
-
--------- DST (Discrete Sine Transform) / Inverse of DST --------
-    [definition]
-        <case1> IDST (excluding scale)
-            S[k] = sum_j=1^n A[j]*sin(pi*j*(k+1/2)/n), 0<=k<n
-        <case2> DST
-            S[k] = sum_j=0^n-1 a[j]*sin(pi*(j+1/2)*k/n), 0<k<=n
-    [usage]
-        <case1>
-            ip[0] = 0; // first time only
-            ddst(n, 1, a, ip, w);
-        <case2>
-            ip[0] = 0; // first time only
-            ddst(n, -1, a, ip, w);
-    [parameters]
-        n              :data length (int)
-                        n >= 2, n = power of 2
-        a[0...n-1]     :input/output data (float *)
-                        <case1>
-                            input data
-                                a[j] = A[j], 0<j<n
-                                a[0] = A[n]
-                            output data
-                                a[k] = S[k], 0<=k<n
-                        <case2>
-                            output data
-                                a[k] = S[k], 0<k<n
-                                a[0] = S[n]
-        ip[0...*]      :work area for bit reversal (int *)
-                        length of ip >= 2+sqrt(n/2)
-                        strictly,
-                        length of ip >=
-                            2+(1<<(int)(log(n/2+0.5)/log(2))/2).
-                        ip[0],ip[1] are pointers of the cos/sin table.
-        w[0...n*5/4-1] :cos/sin table (float *)
-                        w[],ip[] are initialized if ip[0] == 0.
-    [remark]
-        Inverse of
-            ddst(n, -1, a, ip, w);
-        is
-            a[0] *= 0.5;
-            ddst(n, 1, a, ip, w);
-            for (j = 0; j <= n - 1; j++) {
-                a[j] *= 2.0 / n;
-            }
-        .
-
-
--------- Cosine Transform of RDFT (Real Symmetric DFT) --------
-    [definition]
-        C[k] = sum_j=0^n a[j]*cos(pi*j*k/n), 0<=k<=n
-    [usage]
-        ip[0] = 0; // first time only
-        dfct(n, a, t, ip, w);
-    [parameters]
-        n              :data length - 1 (int)
-                        n >= 2, n = power of 2
-        a[0...n]       :input/output data (float *)
-                        output data
-                            a[k] = C[k], 0<=k<=n
-        t[0...n/2]     :work area (float *)
-        ip[0...*]      :work area for bit reversal (int *)
-                        length of ip >= 2+sqrt(n/4)
-                        strictly,
-                        length of ip >=
-                            2+(1<<(int)(log(n/4+0.5)/log(2))/2).
-                        ip[0],ip[1] are pointers of the cos/sin table.
-        w[0...n*5/8-1] :cos/sin table (float *)
-                        w[],ip[] are initialized if ip[0] == 0.
-    [remark]
-        Inverse of
-            a[0] *= 0.5;
-            a[n] *= 0.5;
-            dfct(n, a, t, ip, w);
-        is
-            a[0] *= 0.5;
-            a[n] *= 0.5;
-            dfct(n, a, t, ip, w);
-            for (j = 0; j <= n; j++) {
-                a[j] *= 2.0 / n;
-            }
-        .
-
-
--------- Sine Transform of RDFT (Real Anti-symmetric DFT) --------
-    [definition]
-        S[k] = sum_j=1^n-1 a[j]*sin(pi*j*k/n), 0<k<n
-    [usage]
-        ip[0] = 0; // first time only
-        dfst(n, a, t, ip, w);
-    [parameters]
-        n              :data length + 1 (int)
-                        n >= 2, n = power of 2
-        a[0...n-1]     :input/output data (float *)
-                        output data
-                            a[k] = S[k], 0<k<n
-                        (a[0] is used for work area)
-        t[0...n/2-1]   :work area (float *)
-        ip[0...*]      :work area for bit reversal (int *)
-                        length of ip >= 2+sqrt(n/4)
-                        strictly,
-                        length of ip >=
-                            2+(1<<(int)(log(n/4+0.5)/log(2))/2).
-                        ip[0],ip[1] are pointers of the cos/sin table.
-        w[0...n*5/8-1] :cos/sin table (float *)
-                        w[],ip[] are initialized if ip[0] == 0.
-    [remark]
-        Inverse of
-            dfst(n, a, t, ip, w);
-        is
-            dfst(n, a, t, ip, w);
-            for (j = 1; j <= n - 1; j++) {
-                a[j] *= 2.0 / n;
-            }
-        .
-
-
-Appendix :
-    The cos/sin table is recalculated when the larger table required.
-    w[] and ip[] are compatible with all routines.
-*/
-
-#include <stddef.h>
-
-static void makewt(size_t nw, size_t *ip, float *w);
-static void makect(size_t nc, size_t *ip, float *c);
-static void bitrv2(size_t n, size_t *ip, float *a);
-#if 0  // Not used.
-static void bitrv2conj(int n, int *ip, float *a);
-#endif
-static void cftfsub(size_t n, float *a, float *w);
-static void cftbsub(size_t n, float *a, float *w);
-static void cft1st(size_t n, float *a, float *w);
-static void cftmdl(size_t n, size_t l, float *a, float *w);
-static void rftfsub(size_t n, float *a, size_t nc, float *c);
-static void rftbsub(size_t n, float *a, size_t nc, float *c);
-#if 0  // Not used.
-static void dctsub(int n, float *a, int nc, float *c)
-static void dstsub(int n, float *a, int nc, float *c)
-#endif
-
-
-#if 0  // Not used.
-void WebRtc_cdft(int n, int isgn, float *a, int *ip, float *w)
-{
-    if (n > (ip[0] << 2)) {
-        makewt(n >> 2, ip, w);
-    }
-    if (n > 4) {
-        if (isgn >= 0) {
-            bitrv2(n, ip + 2, a);
-            cftfsub(n, a, w);
-        } else {
-            bitrv2conj(n, ip + 2, a);
-            cftbsub(n, a, w);
-        }
-    } else if (n == 4) {
-        cftfsub(n, a, w);
-    }
-}
-#endif
-
-
-void WebRtc_rdft(size_t n, int isgn, float *a, size_t *ip, float *w)
-{
-    size_t nw, nc;
-    float xi;
-
-    nw = ip[0];
-    if (n > (nw << 2)) {
-        nw = n >> 2;
-        makewt(nw, ip, w);
-    }
-    nc = ip[1];
-    if (n > (nc << 2)) {
-        nc = n >> 2;
-        makect(nc, ip, w + nw);
-    }
-    if (isgn >= 0) {
-        if (n > 4) {
-            bitrv2(n, ip + 2, a);
-            cftfsub(n, a, w);
-            rftfsub(n, a, nc, w + nw);
-        } else if (n == 4) {
-            cftfsub(n, a, w);
-        }
-        xi = a[0] - a[1];
-        a[0] += a[1];
-        a[1] = xi;
-    } else {
-        a[1] = 0.5f * (a[0] - a[1]);
-        a[0] -= a[1];
-        if (n > 4) {
-            rftbsub(n, a, nc, w + nw);
-            bitrv2(n, ip + 2, a);
-            cftbsub(n, a, w);
-        } else if (n == 4) {
-            cftfsub(n, a, w);
-        }
-    }
-}
-
-#if 0  // Not used.
-static void ddct(int n, int isgn, float *a, int *ip, float *w)
-{
-    int j, nw, nc;
-    float xr;
-
-    nw = ip[0];
-    if (n > (nw << 2)) {
-        nw = n >> 2;
-        makewt(nw, ip, w);
-    }
-    nc = ip[1];
-    if (n > nc) {
-        nc = n;
-        makect(nc, ip, w + nw);
-    }
-    if (isgn < 0) {
-        xr = a[n - 1];
-        for (j = n - 2; j >= 2; j -= 2) {
-            a[j + 1] = a[j] - a[j - 1];
-            a[j] += a[j - 1];
-        }
-        a[1] = a[0] - xr;
-        a[0] += xr;
-        if (n > 4) {
-            rftbsub(n, a, nc, w + nw);
-            bitrv2(n, ip + 2, a);
-            cftbsub(n, a, w);
-        } else if (n == 4) {
-            cftfsub(n, a, w);
-        }
-    }
-    dctsub(n, a, nc, w + nw);
-    if (isgn >= 0) {
-        if (n > 4) {
-            bitrv2(n, ip + 2, a);
-            cftfsub(n, a, w);
-            rftfsub(n, a, nc, w + nw);
-        } else if (n == 4) {
-            cftfsub(n, a, w);
-        }
-        xr = a[0] - a[1];
-        a[0] += a[1];
-        for (j = 2; j < n; j += 2) {
-            a[j - 1] = a[j] - a[j + 1];
-            a[j] += a[j + 1];
-        }
-        a[n - 1] = xr;
-    }
-}
-
-
-static void ddst(int n, int isgn, float *a, int *ip, float *w)
-{
-    int j, nw, nc;
-    float xr;
-
-    nw = ip[0];
-    if (n > (nw << 2)) {
-        nw = n >> 2;
-        makewt(nw, ip, w);
-    }
-    nc = ip[1];
-    if (n > nc) {
-        nc = n;
-        makect(nc, ip, w + nw);
-    }
-    if (isgn < 0) {
-        xr = a[n - 1];
-        for (j = n - 2; j >= 2; j -= 2) {
-            a[j + 1] = -a[j] - a[j - 1];
-            a[j] -= a[j - 1];
-        }
-        a[1] = a[0] + xr;
-        a[0] -= xr;
-        if (n > 4) {
-            rftbsub(n, a, nc, w + nw);
-            bitrv2(n, ip + 2, a);
-            cftbsub(n, a, w);
-        } else if (n == 4) {
-            cftfsub(n, a, w);
-        }
-    }
-    dstsub(n, a, nc, w + nw);
-    if (isgn >= 0) {
-        if (n > 4) {
-            bitrv2(n, ip + 2, a);
-            cftfsub(n, a, w);
-            rftfsub(n, a, nc, w + nw);
-        } else if (n == 4) {
-            cftfsub(n, a, w);
-        }
-        xr = a[0] - a[1];
-        a[0] += a[1];
-        for (j = 2; j < n; j += 2) {
-            a[j - 1] = -a[j] - a[j + 1];
-            a[j] -= a[j + 1];
-        }
-        a[n - 1] = -xr;
-    }
-}
-
-
-static void dfct(int n, float *a, float *t, int *ip, float *w)
-{
-    int j, k, l, m, mh, nw, nc;
-    float xr, xi, yr, yi;
-
-    nw = ip[0];
-    if (n > (nw << 3)) {
-        nw = n >> 3;
-        makewt(nw, ip, w);
-    }
-    nc = ip[1];
-    if (n > (nc << 1)) {
-        nc = n >> 1;
-        makect(nc, ip, w + nw);
-    }
-    m = n >> 1;
-    yi = a[m];
-    xi = a[0] + a[n];
-    a[0] -= a[n];
-    t[0] = xi - yi;
-    t[m] = xi + yi;
-    if (n > 2) {
-        mh = m >> 1;
-        for (j = 1; j < mh; j++) {
-            k = m - j;
-            xr = a[j] - a[n - j];
-            xi = a[j] + a[n - j];
-            yr = a[k] - a[n - k];
-            yi = a[k] + a[n - k];
-            a[j] = xr;
-            a[k] = yr;
-            t[j] = xi - yi;
-            t[k] = xi + yi;
-        }
-        t[mh] = a[mh] + a[n - mh];
-        a[mh] -= a[n - mh];
-        dctsub(m, a, nc, w + nw);
-        if (m > 4) {
-            bitrv2(m, ip + 2, a);
-            cftfsub(m, a, w);
-            rftfsub(m, a, nc, w + nw);
-        } else if (m == 4) {
-            cftfsub(m, a, w);
-        }
-        a[n - 1] = a[0] - a[1];
-        a[1] = a[0] + a[1];
-        for (j = m - 2; j >= 2; j -= 2) {
-            a[2 * j + 1] = a[j] + a[j + 1];
-            a[2 * j - 1] = a[j] - a[j + 1];
-        }
-        l = 2;
-        m = mh;
-        while (m >= 2) {
-            dctsub(m, t, nc, w + nw);
-            if (m > 4) {
-                bitrv2(m, ip + 2, t);
-                cftfsub(m, t, w);
-                rftfsub(m, t, nc, w + nw);
-            } else if (m == 4) {
-                cftfsub(m, t, w);
-            }
-            a[n - l] = t[0] - t[1];
-            a[l] = t[0] + t[1];
-            k = 0;
-            for (j = 2; j < m; j += 2) {
-                k += l << 2;
-                a[k - l] = t[j] - t[j + 1];
-                a[k + l] = t[j] + t[j + 1];
-            }
-            l <<= 1;
-            mh = m >> 1;
-            for (j = 0; j < mh; j++) {
-                k = m - j;
-                t[j] = t[m + k] - t[m + j];
-                t[k] = t[m + k] + t[m + j];
-            }
-            t[mh] = t[m + mh];
-            m = mh;
-        }
-        a[l] = t[0];
-        a[n] = t[2] - t[1];
-        a[0] = t[2] + t[1];
-    } else {
-        a[1] = a[0];
-        a[2] = t[0];
-        a[0] = t[1];
-    }
-}
-
-static void dfst(int n, float *a, float *t, int *ip, float *w)
-{
-    int j, k, l, m, mh, nw, nc;
-    float xr, xi, yr, yi;
-
-    nw = ip[0];
-    if (n > (nw << 3)) {
-        nw = n >> 3;
-        makewt(nw, ip, w);
-    }
-    nc = ip[1];
-    if (n > (nc << 1)) {
-        nc = n >> 1;
-        makect(nc, ip, w + nw);
-    }
-    if (n > 2) {
-        m = n >> 1;
-        mh = m >> 1;
-        for (j = 1; j < mh; j++) {
-            k = m - j;
-            xr = a[j] + a[n - j];
-            xi = a[j] - a[n - j];
-            yr = a[k] + a[n - k];
-            yi = a[k] - a[n - k];
-            a[j] = xr;
-            a[k] = yr;
-            t[j] = xi + yi;
-            t[k] = xi - yi;
-        }
-        t[0] = a[mh] - a[n - mh];
-        a[mh] += a[n - mh];
-        a[0] = a[m];
-        dstsub(m, a, nc, w + nw);
-        if (m > 4) {
-            bitrv2(m, ip + 2, a);
-            cftfsub(m, a, w);
-            rftfsub(m, a, nc, w + nw);
-        } else if (m == 4) {
-            cftfsub(m, a, w);
-        }
-        a[n - 1] = a[1] - a[0];
-        a[1] = a[0] + a[1];
-        for (j = m - 2; j >= 2; j -= 2) {
-            a[2 * j + 1] = a[j] - a[j + 1];
-            a[2 * j - 1] = -a[j] - a[j + 1];
-        }
-        l = 2;
-        m = mh;
-        while (m >= 2) {
-            dstsub(m, t, nc, w + nw);
-            if (m > 4) {
-                bitrv2(m, ip + 2, t);
-                cftfsub(m, t, w);
-                rftfsub(m, t, nc, w + nw);
-            } else if (m == 4) {
-                cftfsub(m, t, w);
-            }
-            a[n - l] = t[1] - t[0];
-            a[l] = t[0] + t[1];
-            k = 0;
-            for (j = 2; j < m; j += 2) {
-                k += l << 2;
-                a[k - l] = -t[j] - t[j + 1];
-                a[k + l] = t[j] - t[j + 1];
-            }
-            l <<= 1;
-            mh = m >> 1;
-            for (j = 1; j < mh; j++) {
-                k = m - j;
-                t[j] = t[m + k] + t[m + j];
-                t[k] = t[m + k] - t[m + j];
-            }
-            t[0] = t[m + mh];
-            m = mh;
-        }
-        a[l] = t[0];
-    }
-    a[0] = 0;
-}
-#endif  // Not used.
-
-
-/* -------- initializing routines -------- */
-
-
-#include <math.h>
-
-static void makewt(size_t nw, size_t *ip, float *w)
-{
-    size_t j, nwh;
-    float delta, x, y;
-
-    ip[0] = nw;
-    ip[1] = 1;
-    if (nw > 2) {
-        nwh = nw >> 1;
-        delta = atanf(1.0f) / nwh;
-        w[0] = 1;
-        w[1] = 0;
-        w[nwh] = (float)cos(delta * nwh);
-        w[nwh + 1] = w[nwh];
-        if (nwh > 2) {
-            for (j = 2; j < nwh; j += 2) {
-                x = (float)cos(delta * j);
-                y = (float)sin(delta * j);
-                w[j] = x;
-                w[j + 1] = y;
-                w[nw - j] = y;
-                w[nw - j + 1] = x;
-            }
-            bitrv2(nw, ip + 2, w);
-        }
-    }
-}
-
-
-static void makect(size_t nc, size_t *ip, float *c)
-{
-    size_t j, nch;
-    float delta;
-
-    ip[1] = nc;
-    if (nc > 1) {
-        nch = nc >> 1;
-        delta = atanf(1.0f) / nch;
-        c[0] = (float)cos(delta * nch);
-        c[nch] = 0.5f * c[0];
-        for (j = 1; j < nch; j++) {
-            c[j] = 0.5f * (float)cos(delta * j);
-            c[nc - j] = 0.5f * (float)sin(delta * j);
-        }
-    }
-}
-
-
-/* -------- child routines -------- */
-
-
-static void bitrv2(size_t n, size_t *ip, float *a)
-{
-    size_t j, j1, k, k1, l, m, m2;
-    float xr, xi, yr, yi;
-
-    ip[0] = 0;
-    l = n;
-    m = 1;
-    while ((m << 3) < l) {
-        l >>= 1;
-        for (j = 0; j < m; j++) {
-            ip[m + j] = ip[j] + l;
-        }
-        m <<= 1;
-    }
-    m2 = 2 * m;
-    if ((m << 3) == l) {
-        for (k = 0; k < m; k++) {
-            for (j = 0; j < k; j++) {
-                j1 = 2 * j + ip[k];
-                k1 = 2 * k + ip[j];
-                xr = a[j1];
-                xi = a[j1 + 1];
-                yr = a[k1];
-                yi = a[k1 + 1];
-                a[j1] = yr;
-                a[j1 + 1] = yi;
-                a[k1] = xr;
-                a[k1 + 1] = xi;
-                j1 += m2;
-                k1 += 2 * m2;
-                xr = a[j1];
-                xi = a[j1 + 1];
-                yr = a[k1];
-                yi = a[k1 + 1];
-                a[j1] = yr;
-                a[j1 + 1] = yi;
-                a[k1] = xr;
-                a[k1 + 1] = xi;
-                j1 += m2;
-                k1 -= m2;
-                xr = a[j1];
-                xi = a[j1 + 1];
-                yr = a[k1];
-                yi = a[k1 + 1];
-                a[j1] = yr;
-                a[j1 + 1] = yi;
-                a[k1] = xr;
-                a[k1 + 1] = xi;
-                j1 += m2;
-                k1 += 2 * m2;
-                xr = a[j1];
-                xi = a[j1 + 1];
-                yr = a[k1];
-                yi = a[k1 + 1];
-                a[j1] = yr;
-                a[j1 + 1] = yi;
-                a[k1] = xr;
-                a[k1 + 1] = xi;
-            }
-            j1 = 2 * k + m2 + ip[k];
-            k1 = j1 + m2;
-            xr = a[j1];
-            xi = a[j1 + 1];
-            yr = a[k1];
-            yi = a[k1 + 1];
-            a[j1] = yr;
-            a[j1 + 1] = yi;
-            a[k1] = xr;
-            a[k1 + 1] = xi;
-        }
-    } else {
-        for (k = 1; k < m; k++) {
-            for (j = 0; j < k; j++) {
-                j1 = 2 * j + ip[k];
-                k1 = 2 * k + ip[j];
-                xr = a[j1];
-                xi = a[j1 + 1];
-                yr = a[k1];
-                yi = a[k1 + 1];
-                a[j1] = yr;
-                a[j1 + 1] = yi;
-                a[k1] = xr;
-                a[k1 + 1] = xi;
-                j1 += m2;
-                k1 += m2;
-                xr = a[j1];
-                xi = a[j1 + 1];
-                yr = a[k1];
-                yi = a[k1 + 1];
-                a[j1] = yr;
-                a[j1 + 1] = yi;
-                a[k1] = xr;
-                a[k1 + 1] = xi;
-            }
-        }
-    }
-}
-
-#if 0  // Not used.
-static void bitrv2conj(int n, int *ip, float *a)
-{
-    int j, j1, k, k1, l, m, m2;
-    float xr, xi, yr, yi;
-
-    ip[0] = 0;
-    l = n;
-    m = 1;
-    while ((m << 3) < l) {
-        l >>= 1;
-        for (j = 0; j < m; j++) {
-            ip[m + j] = ip[j] + l;
-        }
-        m <<= 1;
-    }
-    m2 = 2 * m;
-    if ((m << 3) == l) {
-        for (k = 0; k < m; k++) {
-            for (j = 0; j < k; j++) {
-                j1 = 2 * j + ip[k];
-                k1 = 2 * k + ip[j];
-                xr = a[j1];
-                xi = -a[j1 + 1];
-                yr = a[k1];
-                yi = -a[k1 + 1];
-                a[j1] = yr;
-                a[j1 + 1] = yi;
-                a[k1] = xr;
-                a[k1 + 1] = xi;
-                j1 += m2;
-                k1 += 2 * m2;
-                xr = a[j1];
-                xi = -a[j1 + 1];
-                yr = a[k1];
-                yi = -a[k1 + 1];
-                a[j1] = yr;
-                a[j1 + 1] = yi;
-                a[k1] = xr;
-                a[k1 + 1] = xi;
-                j1 += m2;
-                k1 -= m2;
-                xr = a[j1];
-                xi = -a[j1 + 1];
-                yr = a[k1];
-                yi = -a[k1 + 1];
-                a[j1] = yr;
-                a[j1 + 1] = yi;
-                a[k1] = xr;
-                a[k1 + 1] = xi;
-                j1 += m2;
-                k1 += 2 * m2;
-                xr = a[j1];
-                xi = -a[j1 + 1];
-                yr = a[k1];
-                yi = -a[k1 + 1];
-                a[j1] = yr;
-                a[j1 + 1] = yi;
-                a[k1] = xr;
-                a[k1 + 1] = xi;
-            }
-            k1 = 2 * k + ip[k];
-            a[k1 + 1] = -a[k1 + 1];
-            j1 = k1 + m2;
-            k1 = j1 + m2;
-            xr = a[j1];
-            xi = -a[j1 + 1];
-            yr = a[k1];
-            yi = -a[k1 + 1];
-            a[j1] = yr;
-            a[j1 + 1] = yi;
-            a[k1] = xr;
-            a[k1 + 1] = xi;
-            k1 += m2;
-            a[k1 + 1] = -a[k1 + 1];
-        }
-    } else {
-        a[1] = -a[1];
-        a[m2 + 1] = -a[m2 + 1];
-        for (k = 1; k < m; k++) {
-            for (j = 0; j < k; j++) {
-                j1 = 2 * j + ip[k];
-                k1 = 2 * k + ip[j];
-                xr = a[j1];
-                xi = -a[j1 + 1];
-                yr = a[k1];
-                yi = -a[k1 + 1];
-                a[j1] = yr;
-                a[j1 + 1] = yi;
-                a[k1] = xr;
-                a[k1 + 1] = xi;
-                j1 += m2;
-                k1 += m2;
-                xr = a[j1];
-                xi = -a[j1 + 1];
-                yr = a[k1];
-                yi = -a[k1 + 1];
-                a[j1] = yr;
-                a[j1 + 1] = yi;
-                a[k1] = xr;
-                a[k1 + 1] = xi;
-            }
-            k1 = 2 * k + ip[k];
-            a[k1 + 1] = -a[k1 + 1];
-            a[k1 + m2 + 1] = -a[k1 + m2 + 1];
-        }
-    }
-}
-#endif
-
-static void cftfsub(size_t n, float *a, float *w)
-{
-    size_t j, j1, j2, j3, l;
-    float x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
-
-    l = 2;
-    if (n > 8) {
-        cft1st(n, a, w);
-        l = 8;
-        while ((l << 2) < n) {
-            cftmdl(n, l, a, w);
-            l <<= 2;
-        }
-    }
-    if ((l << 2) == n) {
-        for (j = 0; j < l; j += 2) {
-            j1 = j + l;
-            j2 = j1 + l;
-            j3 = j2 + l;
-            x0r = a[j] + a[j1];
-            x0i = a[j + 1] + a[j1 + 1];
-            x1r = a[j] - a[j1];
-            x1i = a[j + 1] - a[j1 + 1];
-            x2r = a[j2] + a[j3];
-            x2i = a[j2 + 1] + a[j3 + 1];
-            x3r = a[j2] - a[j3];
-            x3i = a[j2 + 1] - a[j3 + 1];
-            a[j] = x0r + x2r;
-            a[j + 1] = x0i + x2i;
-            a[j2] = x0r - x2r;
-            a[j2 + 1] = x0i - x2i;
-            a[j1] = x1r - x3i;
-            a[j1 + 1] = x1i + x3r;
-            a[j3] = x1r + x3i;
-            a[j3 + 1] = x1i - x3r;
-        }
-    } else {
-        for (j = 0; j < l; j += 2) {
-            j1 = j + l;
-            x0r = a[j] - a[j1];
-            x0i = a[j + 1] - a[j1 + 1];
-            a[j] += a[j1];
-            a[j + 1] += a[j1 + 1];
-            a[j1] = x0r;
-            a[j1 + 1] = x0i;
-        }
-    }
-}
-
-
-static void cftbsub(size_t n, float *a, float *w)
-{
-    size_t j, j1, j2, j3, l;
-    float x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
-
-    l = 2;
-    if (n > 8) {
-        cft1st(n, a, w);
-        l = 8;
-        while ((l << 2) < n) {
-            cftmdl(n, l, a, w);
-            l <<= 2;
-        }
-    }
-    if ((l << 2) == n) {
-        for (j = 0; j < l; j += 2) {
-            j1 = j + l;
-            j2 = j1 + l;
-            j3 = j2 + l;
-            x0r = a[j] + a[j1];
-            x0i = -a[j + 1] - a[j1 + 1];
-            x1r = a[j] - a[j1];
-            x1i = -a[j + 1] + a[j1 + 1];
-            x2r = a[j2] + a[j3];
-            x2i = a[j2 + 1] + a[j3 + 1];
-            x3r = a[j2] - a[j3];
-            x3i = a[j2 + 1] - a[j3 + 1];
-            a[j] = x0r + x2r;
-            a[j + 1] = x0i - x2i;
-            a[j2] = x0r - x2r;
-            a[j2 + 1] = x0i + x2i;
-            a[j1] = x1r - x3i;
-            a[j1 + 1] = x1i - x3r;
-            a[j3] = x1r + x3i;
-            a[j3 + 1] = x1i + x3r;
-        }
-    } else {
-        for (j = 0; j < l; j += 2) {
-            j1 = j + l;
-            x0r = a[j] - a[j1];
-            x0i = -a[j + 1] + a[j1 + 1];
-            a[j] += a[j1];
-            a[j + 1] = -a[j + 1] - a[j1 + 1];
-            a[j1] = x0r;
-            a[j1 + 1] = x0i;
-        }
-    }
-}
-
-
-static void cft1st(size_t n, float *a, float *w)
-{
-    size_t j, k1, k2;
-    float wk1r, wk1i, wk2r, wk2i, wk3r, wk3i;
-    float x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
-
-    x0r = a[0] + a[2];
-    x0i = a[1] + a[3];
-    x1r = a[0] - a[2];
-    x1i = a[1] - a[3];
-    x2r = a[4] + a[6];
-    x2i = a[5] + a[7];
-    x3r = a[4] - a[6];
-    x3i = a[5] - a[7];
-    a[0] = x0r + x2r;
-    a[1] = x0i + x2i;
-    a[4] = x0r - x2r;
-    a[5] = x0i - x2i;
-    a[2] = x1r - x3i;
-    a[3] = x1i + x3r;
-    a[6] = x1r + x3i;
-    a[7] = x1i - x3r;
-    wk1r = w[2];
-    x0r = a[8] + a[10];
-    x0i = a[9] + a[11];
-    x1r = a[8] - a[10];
-    x1i = a[9] - a[11];
-    x2r = a[12] + a[14];
-    x2i = a[13] + a[15];
-    x3r = a[12] - a[14];
-    x3i = a[13] - a[15];
-    a[8] = x0r + x2r;
-    a[9] = x0i + x2i;
-    a[12] = x2i - x0i;
-    a[13] = x0r - x2r;
-    x0r = x1r - x3i;
-    x0i = x1i + x3r;
-    a[10] = wk1r * (x0r - x0i);
-    a[11] = wk1r * (x0r + x0i);
-    x0r = x3i + x1r;
-    x0i = x3r - x1i;
-    a[14] = wk1r * (x0i - x0r);
-    a[15] = wk1r * (x0i + x0r);
-    k1 = 0;
-    for (j = 16; j < n; j += 16) {
-        k1 += 2;
-        k2 = 2 * k1;
-        wk2r = w[k1];
-        wk2i = w[k1 + 1];
-        wk1r = w[k2];
-        wk1i = w[k2 + 1];
-        wk3r = wk1r - 2 * wk2i * wk1i;
-        wk3i = 2 * wk2i * wk1r - wk1i;
-        x0r = a[j] + a[j + 2];
-        x0i = a[j + 1] + a[j + 3];
-        x1r = a[j] - a[j + 2];
-        x1i = a[j + 1] - a[j + 3];
-        x2r = a[j + 4] + a[j + 6];
-        x2i = a[j + 5] + a[j + 7];
-        x3r = a[j + 4] - a[j + 6];
-        x3i = a[j + 5] - a[j + 7];
-        a[j] = x0r + x2r;
-        a[j + 1] = x0i + x2i;
-        x0r -= x2r;
-        x0i -= x2i;
-        a[j + 4] = wk2r * x0r - wk2i * x0i;
-        a[j + 5] = wk2r * x0i + wk2i * x0r;
-        x0r = x1r - x3i;
-        x0i = x1i + x3r;
-        a[j + 2] = wk1r * x0r - wk1i * x0i;
-        a[j + 3] = wk1r * x0i + wk1i * x0r;
-        x0r = x1r + x3i;
-        x0i = x1i - x3r;
-        a[j + 6] = wk3r * x0r - wk3i * x0i;
-        a[j + 7] = wk3r * x0i + wk3i * x0r;
-        wk1r = w[k2 + 2];
-        wk1i = w[k2 + 3];
-        wk3r = wk1r - 2 * wk2r * wk1i;
-        wk3i = 2 * wk2r * wk1r - wk1i;
-        x0r = a[j + 8] + a[j + 10];
-        x0i = a[j + 9] + a[j + 11];
-        x1r = a[j + 8] - a[j + 10];
-        x1i = a[j + 9] - a[j + 11];
-        x2r = a[j + 12] + a[j + 14];
-        x2i = a[j + 13] + a[j + 15];
-        x3r = a[j + 12] - a[j + 14];
-        x3i = a[j + 13] - a[j + 15];
-        a[j + 8] = x0r + x2r;
-        a[j + 9] = x0i + x2i;
-        x0r -= x2r;
-        x0i -= x2i;
-        a[j + 12] = -wk2i * x0r - wk2r * x0i;
-        a[j + 13] = -wk2i * x0i + wk2r * x0r;
-        x0r = x1r - x3i;
-        x0i = x1i + x3r;
-        a[j + 10] = wk1r * x0r - wk1i * x0i;
-        a[j + 11] = wk1r * x0i + wk1i * x0r;
-        x0r = x1r + x3i;
-        x0i = x1i - x3r;
-        a[j + 14] = wk3r * x0r - wk3i * x0i;
-        a[j + 15] = wk3r * x0i + wk3i * x0r;
-    }
-}
-
-
-static void cftmdl(size_t n, size_t l, float *a, float *w)
-{
-    size_t j, j1, j2, j3, k, k1, k2, m, m2;
-    float wk1r, wk1i, wk2r, wk2i, wk3r, wk3i;
-    float x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
-
-    m = l << 2;
-    for (j = 0; j < l; j += 2) {
-        j1 = j + l;
-        j2 = j1 + l;
-        j3 = j2 + l;
-        x0r = a[j] + a[j1];
-        x0i = a[j + 1] + a[j1 + 1];
-        x1r = a[j] - a[j1];
-        x1i = a[j + 1] - a[j1 + 1];
-        x2r = a[j2] + a[j3];
-        x2i = a[j2 + 1] + a[j3 + 1];
-        x3r = a[j2] - a[j3];
-        x3i = a[j2 + 1] - a[j3 + 1];
-        a[j] = x0r + x2r;
-        a[j + 1] = x0i + x2i;
-        a[j2] = x0r - x2r;
-        a[j2 + 1] = x0i - x2i;
-        a[j1] = x1r - x3i;
-        a[j1 + 1] = x1i + x3r;
-        a[j3] = x1r + x3i;
-        a[j3 + 1] = x1i - x3r;
-    }
-    wk1r = w[2];
-    for (j = m; j < l + m; j += 2) {
-        j1 = j + l;
-        j2 = j1 + l;
-        j3 = j2 + l;
-        x0r = a[j] + a[j1];
-        x0i = a[j + 1] + a[j1 + 1];
-        x1r = a[j] - a[j1];
-        x1i = a[j + 1] - a[j1 + 1];
-        x2r = a[j2] + a[j3];
-        x2i = a[j2 + 1] + a[j3 + 1];
-        x3r = a[j2] - a[j3];
-        x3i = a[j2 + 1] - a[j3 + 1];
-        a[j] = x0r + x2r;
-        a[j + 1] = x0i + x2i;
-        a[j2] = x2i - x0i;
-        a[j2 + 1] = x0r - x2r;
-        x0r = x1r - x3i;
-        x0i = x1i + x3r;
-        a[j1] = wk1r * (x0r - x0i);
-        a[j1 + 1] = wk1r * (x0r + x0i);
-        x0r = x3i + x1r;
-        x0i = x3r - x1i;
-        a[j3] = wk1r * (x0i - x0r);
-        a[j3 + 1] = wk1r * (x0i + x0r);
-    }
-    k1 = 0;
-    m2 = 2 * m;
-    for (k = m2; k < n; k += m2) {
-        k1 += 2;
-        k2 = 2 * k1;
-        wk2r = w[k1];
-        wk2i = w[k1 + 1];
-        wk1r = w[k2];
-        wk1i = w[k2 + 1];
-        wk3r = wk1r - 2 * wk2i * wk1i;
-        wk3i = 2 * wk2i * wk1r - wk1i;
-        for (j = k; j < l + k; j += 2) {
-            j1 = j + l;
-            j2 = j1 + l;
-            j3 = j2 + l;
-            x0r = a[j] + a[j1];
-            x0i = a[j + 1] + a[j1 + 1];
-            x1r = a[j] - a[j1];
-            x1i = a[j + 1] - a[j1 + 1];
-            x2r = a[j2] + a[j3];
-            x2i = a[j2 + 1] + a[j3 + 1];
-            x3r = a[j2] - a[j3];
-            x3i = a[j2 + 1] - a[j3 + 1];
-            a[j] = x0r + x2r;
-            a[j + 1] = x0i + x2i;
-            x0r -= x2r;
-            x0i -= x2i;
-            a[j2] = wk2r * x0r - wk2i * x0i;
-            a[j2 + 1] = wk2r * x0i + wk2i * x0r;
-            x0r = x1r - x3i;
-            x0i = x1i + x3r;
-            a[j1] = wk1r * x0r - wk1i * x0i;
-            a[j1 + 1] = wk1r * x0i + wk1i * x0r;
-            x0r = x1r + x3i;
-            x0i = x1i - x3r;
-            a[j3] = wk3r * x0r - wk3i * x0i;
-            a[j3 + 1] = wk3r * x0i + wk3i * x0r;
-        }
-        wk1r = w[k2 + 2];
-        wk1i = w[k2 + 3];
-        wk3r = wk1r - 2 * wk2r * wk1i;
-        wk3i = 2 * wk2r * wk1r - wk1i;
-        for (j = k + m; j < l + (k + m); j += 2) {
-            j1 = j + l;
-            j2 = j1 + l;
-            j3 = j2 + l;
-            x0r = a[j] + a[j1];
-            x0i = a[j + 1] + a[j1 + 1];
-            x1r = a[j] - a[j1];
-            x1i = a[j + 1] - a[j1 + 1];
-            x2r = a[j2] + a[j3];
-            x2i = a[j2 + 1] + a[j3 + 1];
-            x3r = a[j2] - a[j3];
-            x3i = a[j2 + 1] - a[j3 + 1];
-            a[j] = x0r + x2r;
-            a[j + 1] = x0i + x2i;
-            x0r -= x2r;
-            x0i -= x2i;
-            a[j2] = -wk2i * x0r - wk2r * x0i;
-            a[j2 + 1] = -wk2i * x0i + wk2r * x0r;
-            x0r = x1r - x3i;
-            x0i = x1i + x3r;
-            a[j1] = wk1r * x0r - wk1i * x0i;
-            a[j1 + 1] = wk1r * x0i + wk1i * x0r;
-            x0r = x1r + x3i;
-            x0i = x1i - x3r;
-            a[j3] = wk3r * x0r - wk3i * x0i;
-            a[j3 + 1] = wk3r * x0i + wk3i * x0r;
-        }
-    }
-}
-
-
-static void rftfsub(size_t n, float *a, size_t nc, float *c)
-{
-    size_t j, k, kk, ks, m;
-    float wkr, wki, xr, xi, yr, yi;
-
-    m = n >> 1;
-    ks = 2 * nc / m;
-    kk = 0;
-    for (j = 2; j < m; j += 2) {
-        k = n - j;
-        kk += ks;
-        wkr = 0.5f - c[nc - kk];
-        wki = c[kk];
-        xr = a[j] - a[k];
-        xi = a[j + 1] + a[k + 1];
-        yr = wkr * xr - wki * xi;
-        yi = wkr * xi + wki * xr;
-        a[j] -= yr;
-        a[j + 1] -= yi;
-        a[k] += yr;
-        a[k + 1] -= yi;
-    }
-}
-
-
-static void rftbsub(size_t n, float *a, size_t nc, float *c)
-{
-    size_t j, k, kk, ks, m;
-    float wkr, wki, xr, xi, yr, yi;
-
-    a[1] = -a[1];
-    m = n >> 1;
-    ks = 2 * nc / m;
-    kk = 0;
-    for (j = 2; j < m; j += 2) {
-        k = n - j;
-        kk += ks;
-        wkr = 0.5f - c[nc - kk];
-        wki = c[kk];
-        xr = a[j] - a[k];
-        xi = a[j + 1] + a[k + 1];
-        yr = wkr * xr + wki * xi;
-        yi = wkr * xi - wki * xr;
-        a[j] -= yr;
-        a[j + 1] = yi - a[j + 1];
-        a[k] += yr;
-        a[k + 1] = yi - a[k + 1];
-    }
-    a[m + 1] = -a[m + 1];
-}
-
-#if 0  // Not used.
-static void dctsub(int n, float *a, int nc, float *c)
-{
-    int j, k, kk, ks, m;
-    float wkr, wki, xr;
-
-    m = n >> 1;
-    ks = nc / n;
-    kk = 0;
-    for (j = 1; j < m; j++) {
-        k = n - j;
-        kk += ks;
-        wkr = c[kk] - c[nc - kk];
-        wki = c[kk] + c[nc - kk];
-        xr = wki * a[j] - wkr * a[k];
-        a[j] = wkr * a[j] + wki * a[k];
-        a[k] = xr;
-    }
-    a[m] *= c[0];
-}
-
-
-static void dstsub(int n, float *a, int nc, float *c)
-{
-    int j, k, kk, ks, m;
-    float wkr, wki, xr;
-
-    m = n >> 1;
-    ks = nc / n;
-    kk = 0;
-    for (j = 1; j < m; j++) {
-        k = n - j;
-        kk += ks;
-        wkr = c[kk] - c[nc - kk];
-        wki = c[kk] + c[nc - kk];
-        xr = wki * a[k] - wkr * a[j];
-        a[k] = wkr * a[k] + wki * a[j];
-        a[j] = xr;
-    }
-    a[m] *= c[0];
-}
-#endif  // Not used.
diff --git a/common_audio/fft4g.h b/common_audio/fft4g.h
deleted file mode 100644
index 6dd792f..0000000
--- a/common_audio/fft4g.h
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- *  Copyright (c) 2011 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_COMMON_AUDIO_FFT4G_H_
-#define WEBRTC_COMMON_AUDIO_FFT4G_H_
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-// Refer to fft4g.c for documentation.
-void WebRtc_rdft(size_t n, int isgn, float *a, size_t *ip, float *w);
-
-#if defined(__cplusplus)
-}
-#endif
-
-#endif  // WEBRTC_COMMON_AUDIO_FFT4G_H_
diff --git a/common_audio/fir_filter.cc b/common_audio/fir_filter.cc
deleted file mode 100644
index f069af3..0000000
--- a/common_audio/fir_filter.cc
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- *  Copyright (c) 2014 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/common_audio/fir_filter.h"
-
-#include <string.h>
-
-#include <memory>
-
-#include "webrtc/common_audio/fir_filter_neon.h"
-#include "webrtc/common_audio/fir_filter_sse.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/system_wrappers/include/cpu_features_wrapper.h"
-
-namespace webrtc {
-
-class FIRFilterC : public FIRFilter {
- public:
-  FIRFilterC(const float* coefficients,
-             size_t coefficients_length);
-
-  void Filter(const float* in, size_t length, float* out) override;
-
- private:
-  size_t coefficients_length_;
-  size_t state_length_;
-  std::unique_ptr<float[]> coefficients_;
-  std::unique_ptr<float[]> state_;
-};
-
-FIRFilter* FIRFilter::Create(const float* coefficients,
-                             size_t coefficients_length,
-                             size_t max_input_length) {
-  if (!coefficients || coefficients_length <= 0 || max_input_length <= 0) {
-    RTC_NOTREACHED();
-    return nullptr;
-  }
-
-  FIRFilter* filter = nullptr;
-// If we know the minimum architecture at compile time, avoid CPU detection.
-#if defined(WEBRTC_ARCH_X86_FAMILY)
-#if defined(__SSE2__)
-  filter =
-      new FIRFilterSSE2(coefficients, coefficients_length, max_input_length);
-#else
-  // x86 CPU detection required.
-  if (WebRtc_GetCPUInfo(kSSE2)) {
-    filter =
-        new FIRFilterSSE2(coefficients, coefficients_length, max_input_length);
-  } else {
-    filter = new FIRFilterC(coefficients, coefficients_length);
-  }
-#endif
-#elif defined(WEBRTC_HAS_NEON)
-  filter =
-      new FIRFilterNEON(coefficients, coefficients_length, max_input_length);
-#else
-  filter = new FIRFilterC(coefficients, coefficients_length);
-#endif
-
-  return filter;
-}
-
-FIRFilterC::FIRFilterC(const float* coefficients, size_t coefficients_length)
-    : coefficients_length_(coefficients_length),
-      state_length_(coefficients_length - 1),
-      coefficients_(new float[coefficients_length_]),
-      state_(new float[state_length_]) {
-  for (size_t i = 0; i < coefficients_length_; ++i) {
-    coefficients_[i] = coefficients[coefficients_length_ - i - 1];
-  }
-  memset(state_.get(), 0, state_length_ * sizeof(state_[0]));
-}
-
-void FIRFilterC::Filter(const float* in, size_t length, float* out) {
-  RTC_DCHECK_GT(length, 0);
-
-  // Convolves the input signal |in| with the filter kernel |coefficients_|
-  // taking into account the previous state.
-  for (size_t i = 0; i < length; ++i) {
-    out[i] = 0.f;
-    size_t j;
-    for (j = 0; state_length_ > i && j < state_length_ - i; ++j) {
-      out[i] += state_[i + j] * coefficients_[j];
-    }
-    for (; j < coefficients_length_; ++j) {
-      out[i] += in[j + i - state_length_] * coefficients_[j];
-    }
-  }
-
-  // Update current state.
-  if (length >= state_length_) {
-    memcpy(
-        state_.get(), &in[length - state_length_], state_length_ * sizeof(*in));
-  } else {
-    memmove(state_.get(),
-            &state_[length],
-            (state_length_ - length) * sizeof(state_[0]));
-    memcpy(&state_[state_length_ - length], in, length * sizeof(*in));
-  }
-}
-
-}  // namespace webrtc
diff --git a/common_audio/fir_filter.h b/common_audio/fir_filter.h
deleted file mode 100644
index a5dc6ec..0000000
--- a/common_audio/fir_filter.h
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- *  Copyright (c) 2014 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_COMMON_AUDIO_FIR_FILTER_H_
-#define WEBRTC_COMMON_AUDIO_FIR_FILTER_H_
-
-#include <string.h>
-
-namespace webrtc {
-
-// Finite Impulse Response filter using floating-point arithmetic.
-class FIRFilter {
- public:
-  // Creates a filter with the given coefficients. All initial state values will
-  // be zeros.
-  // The length of the chunks fed to the filter should never be greater than
-  // |max_input_length|. This is needed because, when vectorizing it is
-  // necessary to concatenate the input after the state, and resizing this array
-  // dynamically is expensive.
-  static FIRFilter* Create(const float* coefficients,
-                           size_t coefficients_length,
-                           size_t max_input_length);
-
-  virtual ~FIRFilter() {}
-
-  // Filters the |in| data supplied.
-  // |out| must be previously allocated and it must be at least of |length|.
-  virtual void Filter(const float* in, size_t length, float* out) = 0;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_COMMON_AUDIO_FIR_FILTER_H_
diff --git a/common_audio/fir_filter_neon.cc b/common_audio/fir_filter_neon.cc
deleted file mode 100644
index 26d1195..0000000
--- a/common_audio/fir_filter_neon.cc
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- *  Copyright (c) 2014 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/common_audio/fir_filter_neon.h"
-
-#include <arm_neon.h>
-#include <string.h>
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/system_wrappers/include/aligned_malloc.h"
-
-namespace webrtc {
-
-FIRFilterNEON::FIRFilterNEON(const float* coefficients,
-                             size_t coefficients_length,
-                             size_t max_input_length)
-    :  // Closest higher multiple of four.
-      coefficients_length_((coefficients_length + 3) & ~0x03),
-      state_length_(coefficients_length_ - 1),
-      coefficients_(static_cast<float*>(
-          AlignedMalloc(sizeof(float) * coefficients_length_, 16))),
-      state_(static_cast<float*>(
-          AlignedMalloc(sizeof(float) * (max_input_length + state_length_),
-                        16))) {
-  // Add zeros at the end of the coefficients.
-  size_t padding = coefficients_length_ - coefficients_length;
-  memset(coefficients_.get(), 0.f, padding * sizeof(coefficients_[0]));
-  // The coefficients are reversed to compensate for the order in which the
-  // input samples are acquired (most recent last).
-  for (size_t i = 0; i < coefficients_length; ++i) {
-    coefficients_[i + padding] = coefficients[coefficients_length - i - 1];
-  }
-  memset(state_.get(),
-         0.f,
-         (max_input_length + state_length_) * sizeof(state_[0]));
-}
-
-void FIRFilterNEON::Filter(const float* in, size_t length, float* out) {
-  RTC_DCHECK_GT(length, 0);
-
-  memcpy(&state_[state_length_], in, length * sizeof(*in));
-
-  // Convolves the input signal |in| with the filter kernel |coefficients_|
-  // taking into account the previous state.
-  for (size_t i = 0; i < length; ++i) {
-    float* in_ptr = &state_[i];
-    float* coef_ptr = coefficients_.get();
-
-    float32x4_t m_sum = vmovq_n_f32(0);
-    float32x4_t m_in;
-
-    for (size_t j = 0; j < coefficients_length_; j += 4) {
-       m_in = vld1q_f32(in_ptr + j);
-       m_sum = vmlaq_f32(m_sum, m_in, vld1q_f32(coef_ptr + j));
-    }
-
-    float32x2_t m_half = vadd_f32(vget_high_f32(m_sum), vget_low_f32(m_sum));
-    out[i] = vget_lane_f32(vpadd_f32(m_half, m_half), 0);
-  }
-
-  // Update current state.
-  memmove(state_.get(), &state_[length], state_length_ * sizeof(state_[0]));
-}
-
-}  // namespace webrtc
diff --git a/common_audio/fir_filter_neon.h b/common_audio/fir_filter_neon.h
deleted file mode 100644
index 5576856..0000000
--- a/common_audio/fir_filter_neon.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- *  Copyright (c) 2014 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_COMMON_AUDIO_FIR_FILTER_NEON_H_
-#define WEBRTC_COMMON_AUDIO_FIR_FILTER_NEON_H_
-
-#include <memory>
-
-#include "webrtc/common_audio/fir_filter.h"
-#include "webrtc/system_wrappers/include/aligned_malloc.h"
-
-namespace webrtc {
-
-class FIRFilterNEON : public FIRFilter {
- public:
-  FIRFilterNEON(const float* coefficients,
-                size_t coefficients_length,
-                size_t max_input_length);
-
-  void Filter(const float* in, size_t length, float* out) override;
-
- private:
-  size_t coefficients_length_;
-  size_t state_length_;
-  std::unique_ptr<float[], AlignedFreeDeleter> coefficients_;
-  std::unique_ptr<float[], AlignedFreeDeleter> state_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_COMMON_AUDIO_FIR_FILTER_NEON_H_
diff --git a/common_audio/fir_filter_sse.cc b/common_audio/fir_filter_sse.cc
deleted file mode 100644
index 3e7c2af..0000000
--- a/common_audio/fir_filter_sse.cc
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- *  Copyright (c) 2014 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/common_audio/fir_filter_sse.h"
-
-#include <stdint.h>
-#include <string.h>
-#include <xmmintrin.h>
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/system_wrappers/include/aligned_malloc.h"
-
-namespace webrtc {
-
-FIRFilterSSE2::FIRFilterSSE2(const float* coefficients,
-                             size_t coefficients_length,
-                             size_t max_input_length)
-    :  // Closest higher multiple of four.
-      coefficients_length_((coefficients_length + 3) & ~0x03),
-      state_length_(coefficients_length_ - 1),
-      coefficients_(static_cast<float*>(
-          AlignedMalloc(sizeof(float) * coefficients_length_, 16))),
-      state_(static_cast<float*>(
-          AlignedMalloc(sizeof(float) * (max_input_length + state_length_),
-                        16))) {
-  // Add zeros at the end of the coefficients.
-  size_t padding = coefficients_length_ - coefficients_length;
-  memset(coefficients_.get(), 0, padding * sizeof(coefficients_[0]));
-  // The coefficients are reversed to compensate for the order in which the
-  // input samples are acquired (most recent last).
-  for (size_t i = 0; i < coefficients_length; ++i) {
-    coefficients_[i + padding] = coefficients[coefficients_length - i - 1];
-  }
-  memset(state_.get(),
-         0,
-         (max_input_length + state_length_) * sizeof(state_[0]));
-}
-
-void FIRFilterSSE2::Filter(const float* in, size_t length, float* out) {
-  RTC_DCHECK_GT(length, 0);
-
-  memcpy(&state_[state_length_], in, length * sizeof(*in));
-
-  // Convolves the input signal |in| with the filter kernel |coefficients_|
-  // taking into account the previous state.
-  for (size_t i = 0; i < length; ++i) {
-    float* in_ptr = &state_[i];
-    float* coef_ptr = coefficients_.get();
-
-    __m128 m_sum = _mm_setzero_ps();
-    __m128 m_in;
-
-    // Depending on if the pointer is aligned with 16 bytes or not it is loaded
-    // differently.
-    if (reinterpret_cast<uintptr_t>(in_ptr) & 0x0F) {
-      for (size_t j = 0; j < coefficients_length_; j += 4) {
-        m_in = _mm_loadu_ps(in_ptr + j);
-        m_sum = _mm_add_ps(m_sum, _mm_mul_ps(m_in, _mm_load_ps(coef_ptr + j)));
-      }
-    } else {
-      for (size_t j = 0; j < coefficients_length_; j += 4) {
-        m_in = _mm_load_ps(in_ptr + j);
-        m_sum = _mm_add_ps(m_sum, _mm_mul_ps(m_in, _mm_load_ps(coef_ptr + j)));
-      }
-    }
-    m_sum = _mm_add_ps(_mm_movehl_ps(m_sum, m_sum), m_sum);
-    _mm_store_ss(out + i, _mm_add_ss(m_sum, _mm_shuffle_ps(m_sum, m_sum, 1)));
-  }
-
-  // Update current state.
-  memmove(state_.get(), &state_[length], state_length_ * sizeof(state_[0]));
-}
-
-}  // namespace webrtc
diff --git a/common_audio/fir_filter_sse.h b/common_audio/fir_filter_sse.h
deleted file mode 100644
index 3b1e324..0000000
--- a/common_audio/fir_filter_sse.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- *  Copyright (c) 2014 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_COMMON_AUDIO_FIR_FILTER_SSE_H_
-#define WEBRTC_COMMON_AUDIO_FIR_FILTER_SSE_H_
-
-#include <memory>
-
-#include "webrtc/common_audio/fir_filter.h"
-#include "webrtc/system_wrappers/include/aligned_malloc.h"
-
-namespace webrtc {
-
-class FIRFilterSSE2 : public FIRFilter {
- public:
-  FIRFilterSSE2(const float* coefficients,
-                size_t coefficients_length,
-                size_t max_input_length);
-
-  void Filter(const float* in, size_t length, float* out) override;
-
- private:
-  size_t coefficients_length_;
-  size_t state_length_;
-  std::unique_ptr<float[], AlignedFreeDeleter> coefficients_;
-  std::unique_ptr<float[], AlignedFreeDeleter> state_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_COMMON_AUDIO_FIR_FILTER_SSE_H_
diff --git a/common_audio/fir_filter_unittest.cc b/common_audio/fir_filter_unittest.cc
deleted file mode 100644
index fdbd3ef..0000000
--- a/common_audio/fir_filter_unittest.cc
+++ /dev/null
@@ -1,211 +0,0 @@
-/*
- *  Copyright (c) 2014 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/common_audio/fir_filter.h"
-
-#include <string.h>
-
-#include <memory>
-
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-namespace {
-
-static const float kCoefficients[] = {0.2f, 0.3f, 0.5f, 0.7f, 0.11f};
-static const size_t kCoefficientsLength = sizeof(kCoefficients) /
-                                       sizeof(kCoefficients[0]);
-
-static const float kInput[] = {1.f, 2.f, 3.f, 4.f, 5.f, 6.f, 7.f,
-                                      8.f, 9.f, 10.f};
-static const size_t kInputLength = sizeof(kInput) /
-                                      sizeof(kInput[0]);
-
-void VerifyOutput(const float* expected_output,
-                  const float* output,
-                  size_t length) {
-  EXPECT_EQ(0, memcmp(expected_output,
-                      output,
-                      length * sizeof(expected_output[0])));
-}
-
-}  // namespace
-
-TEST(FIRFilterTest, FilterAsIdentity) {
-  const float kCoefficients[] = {1.f, 0.f, 0.f, 0.f, 0.f};
-  float output[kInputLength];
-  std::unique_ptr<FIRFilter> filter(
-      FIRFilter::Create(kCoefficients, kCoefficientsLength, kInputLength));
-  filter->Filter(kInput, kInputLength, output);
-
-  VerifyOutput(kInput, output, kInputLength);
-}
-
-TEST(FIRFilterTest, FilterUsedAsScalarMultiplication) {
-  const float kCoefficients[] = {5.f, 0.f, 0.f, 0.f, 0.f};
-  float output[kInputLength];
-  std::unique_ptr<FIRFilter> filter(
-      FIRFilter::Create(kCoefficients, kCoefficientsLength, kInputLength));
-  filter->Filter(kInput, kInputLength, output);
-
-  EXPECT_FLOAT_EQ(5.f, output[0]);
-  EXPECT_FLOAT_EQ(20.f, output[3]);
-  EXPECT_FLOAT_EQ(25.f, output[4]);
-  EXPECT_FLOAT_EQ(50.f, output[kInputLength - 1]);
-}
-
-TEST(FIRFilterTest, FilterUsedAsInputShifting) {
-  const float kCoefficients[] = {0.f, 0.f, 0.f, 0.f, 1.f};
-  float output[kInputLength];
-  std::unique_ptr<FIRFilter> filter(
-      FIRFilter::Create(kCoefficients, kCoefficientsLength, kInputLength));
-  filter->Filter(kInput, kInputLength, output);
-
-  EXPECT_FLOAT_EQ(0.f, output[0]);
-  EXPECT_FLOAT_EQ(0.f, output[3]);
-  EXPECT_FLOAT_EQ(1.f, output[4]);
-  EXPECT_FLOAT_EQ(2.f, output[5]);
-  EXPECT_FLOAT_EQ(6.f, output[kInputLength - 1]);
-}
-
-TEST(FIRFilterTest, FilterUsedAsArbitraryWeighting) {
-  float output[kInputLength];
-  std::unique_ptr<FIRFilter> filter(
-      FIRFilter::Create(kCoefficients, kCoefficientsLength, kInputLength));
-  filter->Filter(kInput, kInputLength, output);
-
-  EXPECT_FLOAT_EQ(0.2f, output[0]);
-  EXPECT_FLOAT_EQ(3.4f, output[3]);
-  EXPECT_FLOAT_EQ(5.21f, output[4]);
-  EXPECT_FLOAT_EQ(7.02f, output[5]);
-  EXPECT_FLOAT_EQ(14.26f, output[kInputLength - 1]);
-}
-
-TEST(FIRFilterTest, FilterInLengthLesserOrEqualToCoefficientsLength) {
-  float output[kInputLength];
-  std::unique_ptr<FIRFilter> filter(
-      FIRFilter::Create(kCoefficients, kCoefficientsLength, 2));
-  filter->Filter(kInput, 2, output);
-
-  EXPECT_FLOAT_EQ(0.2f, output[0]);
-  EXPECT_FLOAT_EQ(0.7f, output[1]);
-  filter.reset(FIRFilter::Create(
-      kCoefficients, kCoefficientsLength, kCoefficientsLength));
-  filter->Filter(kInput, kCoefficientsLength, output);
-
-  EXPECT_FLOAT_EQ(0.2f, output[0]);
-  EXPECT_FLOAT_EQ(3.4f, output[3]);
-  EXPECT_FLOAT_EQ(5.21f, output[4]);
-}
-
-TEST(FIRFilterTest, MultipleFilterCalls) {
-  float output[kInputLength];
-  std::unique_ptr<FIRFilter> filter(
-      FIRFilter::Create(kCoefficients, kCoefficientsLength, 3));
-  filter->Filter(kInput, 2, output);
-  EXPECT_FLOAT_EQ(0.2f, output[0]);
-  EXPECT_FLOAT_EQ(0.7f, output[1]);
-
-  filter->Filter(kInput, 2, output);
-  EXPECT_FLOAT_EQ(1.3f, output[0]);
-  EXPECT_FLOAT_EQ(2.4f, output[1]);
-
-  filter->Filter(kInput, 2, output);
-  EXPECT_FLOAT_EQ(2.81f, output[0]);
-  EXPECT_FLOAT_EQ(2.62f, output[1]);
-
-  filter->Filter(kInput, 2, output);
-  EXPECT_FLOAT_EQ(2.81f, output[0]);
-  EXPECT_FLOAT_EQ(2.62f, output[1]);
-
-  filter->Filter(&kInput[3], 3, output);
-  EXPECT_FLOAT_EQ(3.41f, output[0]);
-  EXPECT_FLOAT_EQ(4.12f, output[1]);
-  EXPECT_FLOAT_EQ(6.21f, output[2]);
-
-  filter->Filter(&kInput[3], 3, output);
-  EXPECT_FLOAT_EQ(8.12f, output[0]);
-  EXPECT_FLOAT_EQ(9.14f, output[1]);
-  EXPECT_FLOAT_EQ(9.45f, output[2]);
-}
-
-TEST(FIRFilterTest, VerifySampleBasedVsBlockBasedFiltering) {
-  float output_block_based[kInputLength];
-  std::unique_ptr<FIRFilter> filter(
-      FIRFilter::Create(kCoefficients, kCoefficientsLength, kInputLength));
-  filter->Filter(kInput, kInputLength, output_block_based);
-
-  float output_sample_based[kInputLength];
-  filter.reset(FIRFilter::Create(kCoefficients, kCoefficientsLength, 1));
-  for (size_t i = 0; i < kInputLength; ++i) {
-    filter->Filter(&kInput[i], 1, &output_sample_based[i]);
-  }
-
-  EXPECT_EQ(0, memcmp(output_sample_based,
-                      output_block_based,
-                      kInputLength));
-}
-
-TEST(FIRFilterTest, SimplestHighPassFilter) {
-  const float kCoefficients[] = {1.f, -1.f};
-  const size_t kCoefficientsLength = sizeof(kCoefficients) /
-                                  sizeof(kCoefficients[0]);
-
-  float kConstantInput[] = {1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 1.f};
-  const size_t kConstantInputLength = sizeof(kConstantInput) /
-      sizeof(kConstantInput[0]);
-
-  float output[kConstantInputLength];
-  std::unique_ptr<FIRFilter> filter(FIRFilter::Create(
-      kCoefficients, kCoefficientsLength, kConstantInputLength));
-  filter->Filter(kConstantInput, kConstantInputLength, output);
-  EXPECT_FLOAT_EQ(1.f, output[0]);
-  for (size_t i = kCoefficientsLength - 1; i < kConstantInputLength; ++i) {
-    EXPECT_FLOAT_EQ(0.f, output[i]);
-  }
-}
-
-TEST(FIRFilterTest, SimplestLowPassFilter) {
-  const float kCoefficients[] = {1.f, 1.f};
-  const size_t kCoefficientsLength = sizeof(kCoefficients) /
-                                  sizeof(kCoefficients[0]);
-
-  float kHighFrequencyInput[] = {-1.f, 1.f, -1.f, 1.f, -1.f, 1.f, -1.f, 1.f};
-  const size_t kHighFrequencyInputLength = sizeof(kHighFrequencyInput) /
-                                        sizeof(kHighFrequencyInput[0]);
-
-  float output[kHighFrequencyInputLength];
-  std::unique_ptr<FIRFilter> filter(FIRFilter::Create(
-      kCoefficients, kCoefficientsLength, kHighFrequencyInputLength));
-  filter->Filter(kHighFrequencyInput, kHighFrequencyInputLength, output);
-  EXPECT_FLOAT_EQ(-1.f, output[0]);
-  for (size_t i = kCoefficientsLength - 1; i < kHighFrequencyInputLength; ++i) {
-    EXPECT_FLOAT_EQ(0.f, output[i]);
-  }
-}
-
-TEST(FIRFilterTest, SameOutputWhenSwapedCoefficientsAndInput) {
-  float output[kCoefficientsLength];
-  float output_swaped[kCoefficientsLength];
-  std::unique_ptr<FIRFilter> filter(FIRFilter::Create(
-      kCoefficients, kCoefficientsLength, kCoefficientsLength));
-  // Use kCoefficientsLength for in_length to get same-length outputs.
-  filter->Filter(kInput, kCoefficientsLength, output);
-
-  filter.reset(FIRFilter::Create(
-      kInput, kCoefficientsLength, kCoefficientsLength));
-  filter->Filter(kCoefficients, kCoefficientsLength, output_swaped);
-
-  for (size_t i = 0 ; i < kCoefficientsLength; ++i) {
-    EXPECT_FLOAT_EQ(output[i], output_swaped[i]);
-  }
-}
-
-}  // namespace webrtc
diff --git a/common_audio/include/audio_util.h b/common_audio/include/audio_util.h
deleted file mode 100644
index f1077c6..0000000
--- a/common_audio/include/audio_util.h
+++ /dev/null
@@ -1,188 +0,0 @@
-/*
- *  Copyright (c) 2013 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_COMMON_AUDIO_INCLUDE_AUDIO_UTIL_H_
-#define WEBRTC_COMMON_AUDIO_INCLUDE_AUDIO_UTIL_H_
-
-#include <algorithm>
-#include <limits>
-#include <cstring>
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-typedef std::numeric_limits<int16_t> limits_int16;
-
-// The conversion functions use the following naming convention:
-// S16:      int16_t [-32768, 32767]
-// Float:    float   [-1.0, 1.0]
-// FloatS16: float   [-32768.0, 32767.0]
-static inline int16_t FloatToS16(float v) {
-  if (v > 0)
-    return v >= 1 ? limits_int16::max()
-                  : static_cast<int16_t>(v * limits_int16::max() + 0.5f);
-  return v <= -1 ? limits_int16::min()
-                 : static_cast<int16_t>(-v * limits_int16::min() - 0.5f);
-}
-
-static inline float S16ToFloat(int16_t v) {
-  static const float kMaxInt16Inverse = 1.f / limits_int16::max();
-  static const float kMinInt16Inverse = 1.f / limits_int16::min();
-  return v * (v > 0 ? kMaxInt16Inverse : -kMinInt16Inverse);
-}
-
-static inline int16_t FloatS16ToS16(float v) {
-  static const float kMaxRound = limits_int16::max() - 0.5f;
-  static const float kMinRound = limits_int16::min() + 0.5f;
-  if (v > 0)
-    return v >= kMaxRound ? limits_int16::max()
-                          : static_cast<int16_t>(v + 0.5f);
-  return v <= kMinRound ? limits_int16::min() : static_cast<int16_t>(v - 0.5f);
-}
-
-static inline float FloatToFloatS16(float v) {
-  return v * (v > 0 ? limits_int16::max() : -limits_int16::min());
-}
-
-static inline float FloatS16ToFloat(float v) {
-  static const float kMaxInt16Inverse = 1.f / limits_int16::max();
-  static const float kMinInt16Inverse = 1.f / limits_int16::min();
-  return v * (v > 0 ? kMaxInt16Inverse : -kMinInt16Inverse);
-}
-
-void FloatToS16(const float* src, size_t size, int16_t* dest);
-void S16ToFloat(const int16_t* src, size_t size, float* dest);
-void FloatS16ToS16(const float* src, size_t size, int16_t* dest);
-void FloatToFloatS16(const float* src, size_t size, float* dest);
-void FloatS16ToFloat(const float* src, size_t size, float* dest);
-
-// Copy audio from |src| channels to |dest| channels unless |src| and |dest|
-// point to the same address. |src| and |dest| must have the same number of
-// channels, and there must be sufficient space allocated in |dest|.
-template <typename T>
-void CopyAudioIfNeeded(const T* const* src,
-                       int num_frames,
-                       int num_channels,
-                       T* const* dest) {
-  for (int i = 0; i < num_channels; ++i) {
-    if (src[i] != dest[i]) {
-      std::copy(src[i], src[i] + num_frames, dest[i]);
-    }
-  }
-}
-
-// Deinterleave audio from |interleaved| to the channel buffers pointed to
-// by |deinterleaved|. There must be sufficient space allocated in the
-// |deinterleaved| buffers (|num_channel| buffers with |samples_per_channel|
-// per buffer).
-template <typename T>
-void Deinterleave(const T* interleaved,
-                  size_t samples_per_channel,
-                  size_t num_channels,
-                  T* const* deinterleaved) {
-  for (size_t i = 0; i < num_channels; ++i) {
-    T* channel = deinterleaved[i];
-    size_t interleaved_idx = i;
-    for (size_t j = 0; j < samples_per_channel; ++j) {
-      channel[j] = interleaved[interleaved_idx];
-      interleaved_idx += num_channels;
-    }
-  }
-}
-
-// Interleave audio from the channel buffers pointed to by |deinterleaved| to
-// |interleaved|. There must be sufficient space allocated in |interleaved|
-// (|samples_per_channel| * |num_channels|).
-template <typename T>
-void Interleave(const T* const* deinterleaved,
-                size_t samples_per_channel,
-                size_t num_channels,
-                T* interleaved) {
-  for (size_t i = 0; i < num_channels; ++i) {
-    const T* channel = deinterleaved[i];
-    size_t interleaved_idx = i;
-    for (size_t j = 0; j < samples_per_channel; ++j) {
-      interleaved[interleaved_idx] = channel[j];
-      interleaved_idx += num_channels;
-    }
-  }
-}
-
-// Copies audio from a single channel buffer pointed to by |mono| to each
-// channel of |interleaved|. There must be sufficient space allocated in
-// |interleaved| (|samples_per_channel| * |num_channels|).
-template <typename T>
-void UpmixMonoToInterleaved(const T* mono,
-                            int num_frames,
-                            int num_channels,
-                            T* interleaved) {
-  int interleaved_idx = 0;
-  for (int i = 0; i < num_frames; ++i) {
-    for (int j = 0; j < num_channels; ++j) {
-      interleaved[interleaved_idx++] = mono[i];
-    }
-  }
-}
-
-template <typename T, typename Intermediate>
-void DownmixToMono(const T* const* input_channels,
-                   size_t num_frames,
-                   int num_channels,
-                   T* out) {
-  for (size_t i = 0; i < num_frames; ++i) {
-    Intermediate value = input_channels[0][i];
-    for (int j = 1; j < num_channels; ++j) {
-      value += input_channels[j][i];
-    }
-    out[i] = value / num_channels;
-  }
-}
-
-// Downmixes an interleaved multichannel signal to a single channel by averaging
-// all channels.
-template <typename T, typename Intermediate>
-void DownmixInterleavedToMonoImpl(const T* interleaved,
-                                  size_t num_frames,
-                                  int num_channels,
-                                  T* deinterleaved) {
-  RTC_DCHECK_GT(num_channels, 0);
-  RTC_DCHECK_GT(num_frames, 0);
-
-  const T* const end = interleaved + num_frames * num_channels;
-
-  while (interleaved < end) {
-    const T* const frame_end = interleaved + num_channels;
-
-    Intermediate value = *interleaved++;
-    while (interleaved < frame_end) {
-      value += *interleaved++;
-    }
-
-    *deinterleaved++ = value / num_channels;
-  }
-}
-
-template <typename T>
-void DownmixInterleavedToMono(const T* interleaved,
-                              size_t num_frames,
-                              int num_channels,
-                              T* deinterleaved);
-
-template <>
-void DownmixInterleavedToMono<int16_t>(const int16_t* interleaved,
-                                       size_t num_frames,
-                                       int num_channels,
-                                       int16_t* deinterleaved);
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_COMMON_AUDIO_INCLUDE_AUDIO_UTIL_H_
diff --git a/common_audio/lapped_transform.cc b/common_audio/lapped_transform.cc
deleted file mode 100644
index 227b866..0000000
--- a/common_audio/lapped_transform.cc
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- *  Copyright (c) 2014 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/common_audio/lapped_transform.h"
-
-#include <algorithm>
-#include <cstdlib>
-#include <cstring>
-
-#include "webrtc/common_audio/real_fourier.h"
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-
-void LappedTransform::BlockThunk::ProcessBlock(const float* const* input,
-                                               size_t num_frames,
-                                               size_t num_input_channels,
-                                               size_t num_output_channels,
-                                               float* const* output) {
-  RTC_CHECK_EQ(num_input_channels, parent_->num_in_channels_);
-  RTC_CHECK_EQ(num_output_channels, parent_->num_out_channels_);
-  RTC_CHECK_EQ(parent_->block_length_, num_frames);
-
-  for (size_t i = 0; i < num_input_channels; ++i) {
-    memcpy(parent_->real_buf_.Row(i), input[i],
-           num_frames * sizeof(*input[0]));
-    parent_->fft_->Forward(parent_->real_buf_.Row(i),
-                           parent_->cplx_pre_.Row(i));
-  }
-
-  size_t block_length = RealFourier::ComplexLength(
-      RealFourier::FftOrder(num_frames));
-  RTC_CHECK_EQ(parent_->cplx_length_, block_length);
-  parent_->block_processor_->ProcessAudioBlock(parent_->cplx_pre_.Array(),
-                                               num_input_channels,
-                                               parent_->cplx_length_,
-                                               num_output_channels,
-                                               parent_->cplx_post_.Array());
-
-  for (size_t i = 0; i < num_output_channels; ++i) {
-    parent_->fft_->Inverse(parent_->cplx_post_.Row(i),
-                           parent_->real_buf_.Row(i));
-    memcpy(output[i], parent_->real_buf_.Row(i),
-           num_frames * sizeof(*input[0]));
-  }
-}
-
-LappedTransform::LappedTransform(size_t num_in_channels,
-                                 size_t num_out_channels,
-                                 size_t chunk_length,
-                                 const float* window,
-                                 size_t block_length,
-                                 size_t shift_amount,
-                                 Callback* callback)
-    : blocker_callback_(this),
-      num_in_channels_(num_in_channels),
-      num_out_channels_(num_out_channels),
-      block_length_(block_length),
-      chunk_length_(chunk_length),
-      block_processor_(callback),
-      blocker_(chunk_length_,
-               block_length_,
-               num_in_channels_,
-               num_out_channels_,
-               window,
-               shift_amount,
-               &blocker_callback_),
-      fft_(RealFourier::Create(RealFourier::FftOrder(block_length_))),
-      cplx_length_(RealFourier::ComplexLength(fft_->order())),
-      real_buf_(num_in_channels,
-                block_length_,
-                RealFourier::kFftBufferAlignment),
-      cplx_pre_(num_in_channels,
-                cplx_length_,
-                RealFourier::kFftBufferAlignment),
-      cplx_post_(num_out_channels,
-                 cplx_length_,
-                 RealFourier::kFftBufferAlignment) {
-  RTC_CHECK(num_in_channels_ > 0);
-  RTC_CHECK_GT(block_length_, 0);
-  RTC_CHECK_GT(chunk_length_, 0);
-  RTC_CHECK(block_processor_);
-
-  // block_length_ power of 2?
-  RTC_CHECK_EQ(0, block_length_ & (block_length_ - 1));
-}
-
-LappedTransform::~LappedTransform() = default;
-
-void LappedTransform::ProcessChunk(const float* const* in_chunk,
-                                   float* const* out_chunk) {
-  blocker_.ProcessChunk(in_chunk, chunk_length_, num_in_channels_,
-                        num_out_channels_, out_chunk);
-}
-
-}  // namespace webrtc
diff --git a/common_audio/lapped_transform.h b/common_audio/lapped_transform.h
deleted file mode 100644
index fc03a9d..0000000
--- a/common_audio/lapped_transform.h
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- *  Copyright (c) 2014 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_COMMON_AUDIO_LAPPED_TRANSFORM_H_
-#define WEBRTC_COMMON_AUDIO_LAPPED_TRANSFORM_H_
-
-#include <complex>
-#include <memory>
-
-#include "webrtc/common_audio/blocker.h"
-#include "webrtc/common_audio/real_fourier.h"
-#include "webrtc/system_wrappers/include/aligned_array.h"
-
-namespace webrtc {
-
-// Helper class for audio processing modules which operate on frequency domain
-// input derived from the windowed time domain audio stream.
-//
-// The input audio chunk is sliced into possibly overlapping blocks, multiplied
-// by a window and transformed with an FFT implementation. The transformed data
-// is supplied to the given callback for processing. The processed output is
-// then inverse transformed into the time domain and spliced back into a chunk
-// which constitutes the final output of this processing module.
-class LappedTransform {
- public:
-  class Callback {
-   public:
-    virtual ~Callback() {}
-
-    virtual void ProcessAudioBlock(const std::complex<float>* const* in_block,
-                                   size_t num_in_channels, size_t frames,
-                                   size_t num_out_channels,
-                                   std::complex<float>* const* out_block) = 0;
-  };
-
-  // Construct a transform instance. |chunk_length| is the number of samples in
-  // each channel. |window| defines the window, owned by the caller (a copy is
-  // made internally); |window| should have length equal to |block_length|.
-  // |block_length| defines the length of a block, in samples.
-  // |shift_amount| is in samples. |callback| is the caller-owned audio
-  // processing function called for each block of the input chunk.
-  LappedTransform(size_t num_in_channels,
-                  size_t num_out_channels,
-                  size_t chunk_length,
-                  const float* window,
-                  size_t block_length,
-                  size_t shift_amount,
-                  Callback* callback);
-  ~LappedTransform();
-
-  // Main audio processing helper method. Internally slices |in_chunk| into
-  // blocks, transforms them to frequency domain, calls the callback for each
-  // block and returns a de-blocked time domain chunk of audio through
-  // |out_chunk|. Both buffers are caller-owned.
-  void ProcessChunk(const float* const* in_chunk, float* const* out_chunk);
-
-  // Get the chunk length.
-  //
-  // The chunk length is the number of samples per channel that must be passed
-  // to ProcessChunk via the parameter in_chunk.
-  //
-  // Returns the same chunk_length passed to the LappedTransform constructor.
-  size_t chunk_length() const { return chunk_length_; }
-
-  // Get the number of input channels.
-  //
-  // This is the number of arrays that must be passed to ProcessChunk via
-  // in_chunk.
-  //
-  // Returns the same num_in_channels passed to the LappedTransform constructor.
-  size_t num_in_channels() const { return num_in_channels_; }
-
-  // Get the number of output channels.
-  //
-  // This is the number of arrays that must be passed to ProcessChunk via
-  // out_chunk.
-  //
-  // Returns the same num_out_channels passed to the LappedTransform
-  // constructor.
-  size_t num_out_channels() const { return num_out_channels_; }
-
-  // Returns the initial delay.
-  //
-  // This is the delay introduced by the |blocker_| to be able to get and return
-  // chunks of |chunk_length|, but process blocks of |block_length|.
-  size_t initial_delay() const { return blocker_.initial_delay(); }
-
- private:
-  // Internal middleware callback, given to the blocker. Transforms each block
-  // and hands it over to the processing method given at construction time.
-  class BlockThunk : public BlockerCallback {
-   public:
-    explicit BlockThunk(LappedTransform* parent) : parent_(parent) {}
-
-    void ProcessBlock(const float* const* input,
-                      size_t num_frames,
-                      size_t num_input_channels,
-                      size_t num_output_channels,
-                      float* const* output) override;
-
-   private:
-    LappedTransform* const parent_;
-  } blocker_callback_;
-
-  const size_t num_in_channels_;
-  const size_t num_out_channels_;
-
-  const size_t block_length_;
-  const size_t chunk_length_;
-
-  Callback* const block_processor_;
-  Blocker blocker_;
-
-  std::unique_ptr<RealFourier> fft_;
-  const size_t cplx_length_;
-  AlignedArray<float> real_buf_;
-  AlignedArray<std::complex<float> > cplx_pre_;
-  AlignedArray<std::complex<float> > cplx_post_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_COMMON_AUDIO_LAPPED_TRANSFORM_H_
-
diff --git a/common_audio/lapped_transform_unittest.cc b/common_audio/lapped_transform_unittest.cc
deleted file mode 100644
index 66d4a59..0000000
--- a/common_audio/lapped_transform_unittest.cc
+++ /dev/null
@@ -1,208 +0,0 @@
-/*
- *  Copyright (c) 2014 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/common_audio/lapped_transform.h"
-
-#include <algorithm>
-#include <cmath>
-#include <cstring>
-
-#include "webrtc/test/gtest.h"
-
-using std::complex;
-
-namespace {
-
-class NoopCallback : public webrtc::LappedTransform::Callback {
- public:
-  NoopCallback() : block_num_(0) {}
-
-  virtual void ProcessAudioBlock(const complex<float>* const* in_block,
-                                 size_t in_channels,
-                                 size_t frames,
-                                 size_t out_channels,
-                                 complex<float>* const* out_block) {
-    RTC_CHECK_EQ(in_channels, out_channels);
-    for (size_t i = 0; i < out_channels; ++i) {
-      memcpy(out_block[i], in_block[i], sizeof(**in_block) * frames);
-    }
-    ++block_num_;
-  }
-
-  size_t block_num() {
-    return block_num_;
-  }
-
- private:
-  size_t block_num_;
-};
-
-class FftCheckerCallback : public webrtc::LappedTransform::Callback {
- public:
-  FftCheckerCallback() : block_num_(0) {}
-
-  virtual void ProcessAudioBlock(const complex<float>* const* in_block,
-                                 size_t in_channels,
-                                 size_t frames,
-                                 size_t out_channels,
-                                 complex<float>* const* out_block) {
-    RTC_CHECK_EQ(in_channels, out_channels);
-
-    size_t full_length = (frames - 1) * 2;
-    ++block_num_;
-
-    if (block_num_ > 0) {
-      ASSERT_NEAR(in_block[0][0].real(), static_cast<float>(full_length),
-                  1e-5f);
-      ASSERT_NEAR(in_block[0][0].imag(), 0.0f, 1e-5f);
-      for (size_t i = 1; i < frames; ++i) {
-        ASSERT_NEAR(in_block[0][i].real(), 0.0f, 1e-5f);
-        ASSERT_NEAR(in_block[0][i].imag(), 0.0f, 1e-5f);
-      }
-    }
-  }
-
-  size_t block_num() {
-    return block_num_;
-  }
-
- private:
-  size_t block_num_;
-};
-
-void SetFloatArray(float value, int rows, int cols, float* const* array) {
-  for (int i = 0; i < rows; ++i) {
-    for (int j = 0; j < cols; ++j) {
-      array[i][j] = value;
-    }
-  }
-}
-
-}  // namespace
-
-namespace webrtc {
-
-TEST(LappedTransformTest, Windowless) {
-  const size_t kChannels = 3;
-  const size_t kChunkLength = 512;
-  const size_t kBlockLength = 64;
-  const size_t kShiftAmount = 64;
-  NoopCallback noop;
-
-  // Rectangular window.
-  float window[kBlockLength];
-  std::fill(window, &window[kBlockLength], 1.0f);
-
-  LappedTransform trans(kChannels, kChannels, kChunkLength, window,
-                        kBlockLength, kShiftAmount, &noop);
-  float in_buffer[kChannels][kChunkLength];
-  float* in_chunk[kChannels];
-  float out_buffer[kChannels][kChunkLength];
-  float* out_chunk[kChannels];
-
-  in_chunk[0] = in_buffer[0];
-  in_chunk[1] = in_buffer[1];
-  in_chunk[2] = in_buffer[2];
-  out_chunk[0] = out_buffer[0];
-  out_chunk[1] = out_buffer[1];
-  out_chunk[2] = out_buffer[2];
-  SetFloatArray(2.0f, kChannels, kChunkLength, in_chunk);
-  SetFloatArray(-1.0f, kChannels, kChunkLength, out_chunk);
-
-  trans.ProcessChunk(in_chunk, out_chunk);
-
-  for (size_t i = 0; i < kChannels; ++i) {
-    for (size_t j = 0; j < kChunkLength; ++j) {
-      ASSERT_NEAR(out_chunk[i][j], 2.0f, 1e-5f);
-    }
-  }
-
-  ASSERT_EQ(kChunkLength / kBlockLength, noop.block_num());
-}
-
-TEST(LappedTransformTest, IdentityProcessor) {
-  const size_t kChunkLength = 512;
-  const size_t kBlockLength = 64;
-  const size_t kShiftAmount = 32;
-  NoopCallback noop;
-
-  // Identity window for |overlap = block_size / 2|.
-  float window[kBlockLength];
-  std::fill(window, &window[kBlockLength], std::sqrt(0.5f));
-
-  LappedTransform trans(1, 1, kChunkLength, window, kBlockLength, kShiftAmount,
-                        &noop);
-  float in_buffer[kChunkLength];
-  float* in_chunk = in_buffer;
-  float out_buffer[kChunkLength];
-  float* out_chunk = out_buffer;
-
-  SetFloatArray(2.0f, 1, kChunkLength, &in_chunk);
-  SetFloatArray(-1.0f, 1, kChunkLength, &out_chunk);
-
-  trans.ProcessChunk(&in_chunk, &out_chunk);
-
-  for (size_t i = 0; i < kChunkLength; ++i) {
-    ASSERT_NEAR(out_chunk[i],
-                (i < kBlockLength - kShiftAmount) ? 0.0f : 2.0f,
-                1e-5f);
-  }
-
-  ASSERT_EQ(kChunkLength / kShiftAmount, noop.block_num());
-}
-
-TEST(LappedTransformTest, Callbacks) {
-  const size_t kChunkLength = 512;
-  const size_t kBlockLength = 64;
-  FftCheckerCallback call;
-
-  // Rectangular window.
-  float window[kBlockLength];
-  std::fill(window, &window[kBlockLength], 1.0f);
-
-  LappedTransform trans(1, 1, kChunkLength, window, kBlockLength,
-                        kBlockLength, &call);
-  float in_buffer[kChunkLength];
-  float* in_chunk = in_buffer;
-  float out_buffer[kChunkLength];
-  float* out_chunk = out_buffer;
-
-  SetFloatArray(1.0f, 1, kChunkLength, &in_chunk);
-  SetFloatArray(-1.0f, 1, kChunkLength, &out_chunk);
-
-  trans.ProcessChunk(&in_chunk, &out_chunk);
-
-  ASSERT_EQ(kChunkLength / kBlockLength, call.block_num());
-}
-
-TEST(LappedTransformTest, chunk_length) {
-  const size_t kBlockLength = 64;
-  FftCheckerCallback call;
-  const float window[kBlockLength] = {};
-
-  // Make sure that chunk_length returns the same value passed to the
-  // LappedTransform constructor.
-  {
-    const size_t kExpectedChunkLength = 512;
-    const LappedTransform trans(1, 1, kExpectedChunkLength, window,
-                                kBlockLength, kBlockLength, &call);
-
-    EXPECT_EQ(kExpectedChunkLength, trans.chunk_length());
-  }
-  {
-    const size_t kExpectedChunkLength = 160;
-    const LappedTransform trans(1, 1, kExpectedChunkLength, window,
-                                kBlockLength, kBlockLength, &call);
-
-    EXPECT_EQ(kExpectedChunkLength, trans.chunk_length());
-  }
-}
-
-}  // namespace webrtc
diff --git a/common_audio/mocks/mock_smoothing_filter.h b/common_audio/mocks/mock_smoothing_filter.h
deleted file mode 100644
index 82cea55..0000000
--- a/common_audio/mocks/mock_smoothing_filter.h
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- *  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_COMMON_AUDIO_MOCKS_MOCK_SMOOTHING_FILTER_H_
-#define WEBRTC_COMMON_AUDIO_MOCKS_MOCK_SMOOTHING_FILTER_H_
-
-#include "webrtc/common_audio/smoothing_filter.h"
-#include "webrtc/test/gmock.h"
-
-namespace webrtc {
-
-class MockSmoothingFilter : public SmoothingFilter {
- public:
-  MOCK_METHOD1(AddSample, void(float));
-  MOCK_METHOD0(GetAverage, rtc::Optional<float>());
-  MOCK_METHOD1(SetTimeConstantMs, bool(int));
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_COMMON_AUDIO_MOCKS_MOCK_SMOOTHING_FILTER_H_
diff --git a/common_audio/real_fourier.cc b/common_audio/real_fourier.cc
deleted file mode 100644
index ed1ad11..0000000
--- a/common_audio/real_fourier.cc
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- *  Copyright (c) 2014 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/common_audio/real_fourier.h"
-
-#include "webrtc/common_audio/real_fourier_ooura.h"
-#include "webrtc/common_audio/real_fourier_openmax.h"
-#include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-
-using std::complex;
-
-const size_t RealFourier::kFftBufferAlignment = 32;
-
-std::unique_ptr<RealFourier> RealFourier::Create(int fft_order) {
-#if defined(RTC_USE_OPENMAX_DL)
-  return std::unique_ptr<RealFourier>(new RealFourierOpenmax(fft_order));
-#else
-  return std::unique_ptr<RealFourier>(new RealFourierOoura(fft_order));
-#endif
-}
-
-int RealFourier::FftOrder(size_t length) {
-  RTC_CHECK_GT(length, 0U);
-  return WebRtcSpl_GetSizeInBits(static_cast<uint32_t>(length - 1));
-}
-
-size_t RealFourier::FftLength(int order) {
-  RTC_CHECK_GE(order, 0);
-  return static_cast<size_t>(1 << order);
-}
-
-size_t RealFourier::ComplexLength(int order) {
-  return FftLength(order) / 2 + 1;
-}
-
-RealFourier::fft_real_scoper RealFourier::AllocRealBuffer(int count) {
-  return fft_real_scoper(static_cast<float*>(
-      AlignedMalloc(sizeof(float) * count, kFftBufferAlignment)));
-}
-
-RealFourier::fft_cplx_scoper RealFourier::AllocCplxBuffer(int count) {
-  return fft_cplx_scoper(static_cast<complex<float>*>(
-      AlignedMalloc(sizeof(complex<float>) * count, kFftBufferAlignment)));
-}
-
-}  // namespace webrtc
-
diff --git a/common_audio/real_fourier.h b/common_audio/real_fourier.h
deleted file mode 100644
index 1b851e9..0000000
--- a/common_audio/real_fourier.h
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- *  Copyright (c) 2014 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_COMMON_AUDIO_REAL_FOURIER_H_
-#define WEBRTC_COMMON_AUDIO_REAL_FOURIER_H_
-
-#include <complex>
-#include <memory>
-
-#include "webrtc/system_wrappers/include/aligned_malloc.h"
-
-// Uniform interface class for the real DFT and its inverse, for power-of-2
-// input lengths. Also contains helper functions for buffer allocation, taking
-// care of any memory alignment requirements the underlying library might have.
-
-namespace webrtc {
-
-class RealFourier {
- public:
-  // Shorthand typenames for the scopers used by the buffer allocation helpers.
-  typedef std::unique_ptr<float[], AlignedFreeDeleter> fft_real_scoper;
-  typedef std::unique_ptr<std::complex<float>[], AlignedFreeDeleter>
-      fft_cplx_scoper;
-
-  // The alignment required for all input and output buffers, in bytes.
-  static const size_t kFftBufferAlignment;
-
-  // Construct a wrapper instance for the given input order, which must be
-  // between 1 and kMaxFftOrder, inclusively.
-  static std::unique_ptr<RealFourier> Create(int fft_order);
-  virtual ~RealFourier() {}
-
-  // Helper to compute the smallest FFT order (a power of 2) which will contain
-  // the given input length.
-  static int FftOrder(size_t length);
-
-  // Helper to compute the input length from the FFT order.
-  static size_t FftLength(int order);
-
-  // Helper to compute the exact length, in complex floats, of the transform
-  // output (i.e. |2^order / 2 + 1|).
-  static size_t ComplexLength(int order);
-
-  // Buffer allocation helpers. The buffers are large enough to hold |count|
-  // floats/complexes and suitably aligned for use by the implementation.
-  // The returned scopers are set up with proper deleters; the caller owns
-  // the allocated memory.
-  static fft_real_scoper AllocRealBuffer(int count);
-  static fft_cplx_scoper AllocCplxBuffer(int count);
-
-  // Main forward transform interface. The output array need only be big
-  // enough for |2^order / 2 + 1| elements - the conjugate pairs are not
-  // returned. Input and output must be properly aligned (e.g. through
-  // AllocRealBuffer and AllocCplxBuffer) and input length must be
-  // |2^order| (same as given at construction time).
-  virtual void Forward(const float* src, std::complex<float>* dest) const = 0;
-
-  // Inverse transform. Same input format as output above, conjugate pairs
-  // not needed.
-  virtual void Inverse(const std::complex<float>* src, float* dest) const = 0;
-
-  virtual int order() const = 0;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_COMMON_AUDIO_REAL_FOURIER_H_
-
diff --git a/common_audio/real_fourier_ooura.cc b/common_audio/real_fourier_ooura.cc
deleted file mode 100644
index 26a8a7d..0000000
--- a/common_audio/real_fourier_ooura.cc
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- *  Copyright (c) 2015 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/common_audio/real_fourier_ooura.h"
-
-#include <cmath>
-#include <algorithm>
-
-#include "webrtc/common_audio/fft4g.h"
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-
-using std::complex;
-
-namespace {
-
-void Conjugate(complex<float>* array, size_t complex_length) {
-  std::for_each(array, array + complex_length,
-                [=](complex<float>& v) { v = std::conj(v); });
-}
-
-size_t ComputeWorkIpSize(size_t fft_length) {
-  return static_cast<size_t>(2 + std::ceil(std::sqrt(
-      static_cast<float>(fft_length))));
-}
-
-}  // namespace
-
-RealFourierOoura::RealFourierOoura(int fft_order)
-    : order_(fft_order),
-      length_(FftLength(order_)),
-      complex_length_(ComplexLength(order_)),
-      // Zero-initializing work_ip_ will cause rdft to initialize these work
-      // arrays on the first call.
-      work_ip_(new size_t[ComputeWorkIpSize(length_)]()),
-      work_w_(new float[complex_length_]()) {
-  RTC_CHECK_GE(fft_order, 1);
-}
-
-void RealFourierOoura::Forward(const float* src, complex<float>* dest) const {
-  {
-    // This cast is well-defined since C++11. See "Non-static data members" at:
-    // http://en.cppreference.com/w/cpp/numeric/complex
-    auto dest_float = reinterpret_cast<float*>(dest);
-    std::copy(src, src + length_, dest_float);
-    WebRtc_rdft(length_, 1, dest_float, work_ip_.get(), work_w_.get());
-  }
-
-  // Ooura places real[n/2] in imag[0].
-  dest[complex_length_ - 1] = complex<float>(dest[0].imag(), 0.0f);
-  dest[0] = complex<float>(dest[0].real(), 0.0f);
-  // Ooura returns the conjugate of the usual Fourier definition.
-  Conjugate(dest, complex_length_);
-}
-
-void RealFourierOoura::Inverse(const complex<float>* src, float* dest) const {
-  {
-    auto dest_complex = reinterpret_cast<complex<float>*>(dest);
-    // The real output array is shorter than the input complex array by one
-    // complex element.
-    const size_t dest_complex_length = complex_length_ - 1;
-    std::copy(src, src + dest_complex_length, dest_complex);
-    // Restore Ooura's conjugate definition.
-    Conjugate(dest_complex, dest_complex_length);
-    // Restore real[n/2] to imag[0].
-    dest_complex[0] = complex<float>(dest_complex[0].real(),
-                                     src[complex_length_ - 1].real());
-  }
-
-  WebRtc_rdft(length_, -1, dest, work_ip_.get(), work_w_.get());
-
-  // Ooura returns a scaled version.
-  const float scale = 2.0f / length_;
-  std::for_each(dest, dest + length_, [scale](float& v) { v *= scale; });
-}
-
-}  // namespace webrtc
diff --git a/common_audio/real_fourier_ooura.h b/common_audio/real_fourier_ooura.h
deleted file mode 100644
index 99d09d7..0000000
--- a/common_audio/real_fourier_ooura.h
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- *  Copyright (c) 2015 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_COMMON_AUDIO_REAL_FOURIER_OOURA_H_
-#define WEBRTC_COMMON_AUDIO_REAL_FOURIER_OOURA_H_
-
-#include <complex>
-#include <memory>
-
-#include "webrtc/common_audio/real_fourier.h"
-
-namespace webrtc {
-
-class RealFourierOoura : public RealFourier {
- public:
-  explicit RealFourierOoura(int fft_order);
-
-  void Forward(const float* src, std::complex<float>* dest) const override;
-  void Inverse(const std::complex<float>* src, float* dest) const override;
-
-  int order() const override {
-    return order_;
-  }
-
- private:
-  const int order_;
-  const size_t length_;
-  const size_t complex_length_;
-  // These are work arrays for Ooura. The names are based on the comments in
-  // fft4g.c.
-  const std::unique_ptr<size_t[]> work_ip_;
-  const std::unique_ptr<float[]> work_w_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_COMMON_AUDIO_REAL_FOURIER_OOURA_H_
-
diff --git a/common_audio/real_fourier_openmax.cc b/common_audio/real_fourier_openmax.cc
deleted file mode 100644
index 4d971da..0000000
--- a/common_audio/real_fourier_openmax.cc
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- *  Copyright (c) 2015 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/common_audio/real_fourier_openmax.h"
-
-#include <cstdlib>
-
-#include "dl/sp/api/omxSP.h"
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-
-using std::complex;
-
-namespace {
-
-// Creates and initializes the Openmax state. Transfers ownership to caller.
-OMXFFTSpec_R_F32* CreateOpenmaxState(int order) {
-  RTC_CHECK_GE(order, 1);
-  // The omx implementation uses this macro to check order validity.
-  RTC_CHECK_LE(order, TWIDDLE_TABLE_ORDER);
-
-  OMX_INT buffer_size;
-  OMXResult r = omxSP_FFTGetBufSize_R_F32(order, &buffer_size);
-  RTC_CHECK_EQ(r, OMX_Sts_NoErr);
-
-  OMXFFTSpec_R_F32* omx_spec = malloc(buffer_size);
-  RTC_DCHECK(omx_spec);
-
-  r = omxSP_FFTInit_R_F32(omx_spec, order);
-  RTC_CHECK_EQ(r, OMX_Sts_NoErr);
-  return omx_spec;
-}
-
-}  // namespace
-
-RealFourierOpenmax::RealFourierOpenmax(int fft_order)
-    : order_(fft_order),
-      omx_spec_(CreateOpenmaxState(order_)) {
-}
-
-RealFourierOpenmax::~RealFourierOpenmax() {
-  free(omx_spec_);
-}
-
-void RealFourierOpenmax::Forward(const float* src, complex<float>* dest) const {
-  // This cast is well-defined since C++11. See "Non-static data members" at:
-  // http://en.cppreference.com/w/cpp/numeric/complex
-  OMXResult r =
-      omxSP_FFTFwd_RToCCS_F32(src, reinterpret_cast<OMX_F32*>(dest), omx_spec_);
-  RTC_CHECK_EQ(r, OMX_Sts_NoErr);
-}
-
-void RealFourierOpenmax::Inverse(const complex<float>* src, float* dest) const {
-  OMXResult r =
-      omxSP_FFTInv_CCSToR_F32(reinterpret_cast<const OMX_F32*>(src), dest,
-                              omx_spec_);
-  RTC_CHECK_EQ(r, OMX_Sts_NoErr);
-}
-
-}  // namespace webrtc
-
diff --git a/common_audio/real_fourier_openmax.h b/common_audio/real_fourier_openmax.h
deleted file mode 100644
index 63ce5ba..0000000
--- a/common_audio/real_fourier_openmax.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- *  Copyright (c) 2015 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_COMMON_AUDIO_REAL_FOURIER_OPENMAX_H_
-#define WEBRTC_COMMON_AUDIO_REAL_FOURIER_OPENMAX_H_
-
-#include <complex>
-
-#include "webrtc/common_audio/real_fourier.h"
-
-namespace webrtc {
-
-class RealFourierOpenmax : public RealFourier {
- public:
-  explicit RealFourierOpenmax(int fft_order);
-  ~RealFourierOpenmax() override;
-
-  void Forward(const float* src, std::complex<float>* dest) const override;
-  void Inverse(const std::complex<float>* src, float* dest) const override;
-
-  int order() const override {
-    return order_;
-  }
-
- private:
-  // Basically a forward declare of OMXFFTSpec_R_F32. To get rid of the
-  // dependency on openmax.
-  typedef void OMXFFTSpec_R_F32_;
-  const int order_;
-
-  OMXFFTSpec_R_F32_* const omx_spec_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_COMMON_AUDIO_REAL_FOURIER_OPENMAX_H_
-
diff --git a/common_audio/real_fourier_unittest.cc b/common_audio/real_fourier_unittest.cc
deleted file mode 100644
index d1281c7..0000000
--- a/common_audio/real_fourier_unittest.cc
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- *  Copyright (c) 2014 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/common_audio/real_fourier.h"
-
-#include <stdlib.h>
-
-#include "webrtc/common_audio/real_fourier_ooura.h"
-#include "webrtc/common_audio/real_fourier_openmax.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-using std::complex;
-
-TEST(RealFourierStaticsTest, AllocatorAlignment) {
-  {
-    RealFourier::fft_real_scoper real;
-    real = RealFourier::AllocRealBuffer(3);
-    ASSERT_TRUE(real.get() != nullptr);
-    uintptr_t ptr_value = reinterpret_cast<uintptr_t>(real.get());
-    EXPECT_EQ(0u, ptr_value % RealFourier::kFftBufferAlignment);
-  }
-  {
-    RealFourier::fft_cplx_scoper cplx;
-    cplx = RealFourier::AllocCplxBuffer(3);
-    ASSERT_TRUE(cplx.get() != nullptr);
-    uintptr_t ptr_value = reinterpret_cast<uintptr_t>(cplx.get());
-    EXPECT_EQ(0u, ptr_value % RealFourier::kFftBufferAlignment);
-  }
-}
-
-TEST(RealFourierStaticsTest, OrderComputation) {
-  EXPECT_EQ(4, RealFourier::FftOrder(13));
-  EXPECT_EQ(5, RealFourier::FftOrder(32));
-  EXPECT_EQ(1, RealFourier::FftOrder(2));
-  EXPECT_EQ(0, RealFourier::FftOrder(1));
-}
-
-TEST(RealFourierStaticsTest, ComplexLengthComputation) {
-  EXPECT_EQ(2U, RealFourier::ComplexLength(1));
-  EXPECT_EQ(3U, RealFourier::ComplexLength(2));
-  EXPECT_EQ(5U, RealFourier::ComplexLength(3));
-  EXPECT_EQ(9U, RealFourier::ComplexLength(4));
-  EXPECT_EQ(17U, RealFourier::ComplexLength(5));
-  EXPECT_EQ(65U, RealFourier::ComplexLength(7));
-}
-
-template <typename T>
-class RealFourierTest : public ::testing::Test {
- protected:
-  RealFourierTest()
-      : rf_(2),
-        real_buffer_(RealFourier::AllocRealBuffer(4)),
-        cplx_buffer_(RealFourier::AllocCplxBuffer(3)) {}
-
-  ~RealFourierTest() {
-  }
-
-  T rf_;
-  const RealFourier::fft_real_scoper real_buffer_;
-  const RealFourier::fft_cplx_scoper cplx_buffer_;
-};
-
-using FftTypes = ::testing::Types<
-#if defined(RTC_USE_OPENMAX_DL)
-    RealFourierOpenmax,
-#endif
-    RealFourierOoura>;
-TYPED_TEST_CASE(RealFourierTest, FftTypes);
-
-TYPED_TEST(RealFourierTest, SimpleForwardTransform) {
-  this->real_buffer_[0] = 1.0f;
-  this->real_buffer_[1] = 2.0f;
-  this->real_buffer_[2] = 3.0f;
-  this->real_buffer_[3] = 4.0f;
-
-  this->rf_.Forward(this->real_buffer_.get(), this->cplx_buffer_.get());
-
-  EXPECT_NEAR(this->cplx_buffer_[0].real(), 10.0f, 1e-8f);
-  EXPECT_NEAR(this->cplx_buffer_[0].imag(), 0.0f, 1e-8f);
-  EXPECT_NEAR(this->cplx_buffer_[1].real(), -2.0f, 1e-8f);
-  EXPECT_NEAR(this->cplx_buffer_[1].imag(), 2.0f, 1e-8f);
-  EXPECT_NEAR(this->cplx_buffer_[2].real(), -2.0f, 1e-8f);
-  EXPECT_NEAR(this->cplx_buffer_[2].imag(), 0.0f, 1e-8f);
-}
-
-TYPED_TEST(RealFourierTest, SimpleBackwardTransform) {
-  this->cplx_buffer_[0] = complex<float>(10.0f, 0.0f);
-  this->cplx_buffer_[1] = complex<float>(-2.0f, 2.0f);
-  this->cplx_buffer_[2] = complex<float>(-2.0f, 0.0f);
-
-  this->rf_.Inverse(this->cplx_buffer_.get(), this->real_buffer_.get());
-
-  EXPECT_NEAR(this->real_buffer_[0], 1.0f, 1e-8f);
-  EXPECT_NEAR(this->real_buffer_[1], 2.0f, 1e-8f);
-  EXPECT_NEAR(this->real_buffer_[2], 3.0f, 1e-8f);
-  EXPECT_NEAR(this->real_buffer_[3], 4.0f, 1e-8f);
-}
-
-}  // namespace webrtc
-
diff --git a/common_audio/resampler/include/push_resampler.h b/common_audio/resampler/include/push_resampler.h
deleted file mode 100644
index 31e08e3..0000000
--- a/common_audio/resampler/include/push_resampler.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- *  Copyright (c) 2013 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_COMMON_AUDIO_RESAMPLER_INCLUDE_PUSH_RESAMPLER_H_
-#define WEBRTC_COMMON_AUDIO_RESAMPLER_INCLUDE_PUSH_RESAMPLER_H_
-
-#include <memory>
-
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-class PushSincResampler;
-
-// Wraps PushSincResampler to provide stereo support.
-// TODO(ajm): add support for an arbitrary number of channels.
-template <typename T>
-class PushResampler {
- public:
-  PushResampler();
-  virtual ~PushResampler();
-
-  // Must be called whenever the parameters change. Free to be called at any
-  // time as it is a no-op if parameters have not changed since the last call.
-  int InitializeIfNeeded(int src_sample_rate_hz, int dst_sample_rate_hz,
-                         size_t num_channels);
-
-  // Returns the total number of samples provided in destination (e.g. 32 kHz,
-  // 2 channel audio gives 640 samples).
-  int Resample(const T* src, size_t src_length, T* dst, size_t dst_capacity);
-
- private:
-  std::unique_ptr<PushSincResampler> sinc_resampler_;
-  std::unique_ptr<PushSincResampler> sinc_resampler_right_;
-  int src_sample_rate_hz_;
-  int dst_sample_rate_hz_;
-  size_t num_channels_;
-  std::unique_ptr<T[]> src_left_;
-  std::unique_ptr<T[]> src_right_;
-  std::unique_ptr<T[]> dst_left_;
-  std::unique_ptr<T[]> dst_right_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_COMMON_AUDIO_RESAMPLER_INCLUDE_PUSH_RESAMPLER_H_
diff --git a/common_audio/resampler/include/resampler.h b/common_audio/resampler/include/resampler.h
deleted file mode 100644
index 259349b..0000000
--- a/common_audio/resampler/include/resampler.h
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-
-/*
- * A wrapper for resampling a numerous amount of sampling combinations.
- */
-
-#ifndef WEBRTC_COMMON_AUDIO_RESAMPLER_INCLUDE_RESAMPLER_H_
-#define WEBRTC_COMMON_AUDIO_RESAMPLER_INCLUDE_RESAMPLER_H_
-
-#include <stddef.h>
-
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-// All methods return 0 on success and -1 on failure.
-class Resampler {
- public:
-  Resampler();
-  Resampler(int inFreq, int outFreq, size_t num_channels);
-  ~Resampler();
-
-  // Reset all states
-  int Reset(int inFreq, int outFreq, size_t num_channels);
-
-  // Reset all states if any parameter has changed
-  int ResetIfNeeded(int inFreq, int outFreq, size_t num_channels);
-
-  // Resample samplesIn to samplesOut.
-  int Push(const int16_t* samplesIn, size_t lengthIn, int16_t* samplesOut,
-           size_t maxLen, size_t& outLen);  // NOLINT: to avoid changing APIs
-
- private:
-  enum ResamplerMode {
-    kResamplerMode1To1,
-    kResamplerMode1To2,
-    kResamplerMode1To3,
-    kResamplerMode1To4,
-    kResamplerMode1To6,
-    kResamplerMode1To12,
-    kResamplerMode2To3,
-    kResamplerMode2To11,
-    kResamplerMode4To11,
-    kResamplerMode8To11,
-    kResamplerMode11To16,
-    kResamplerMode11To32,
-    kResamplerMode2To1,
-    kResamplerMode3To1,
-    kResamplerMode4To1,
-    kResamplerMode6To1,
-    kResamplerMode12To1,
-    kResamplerMode3To2,
-    kResamplerMode11To2,
-    kResamplerMode11To4,
-    kResamplerMode11To8
-  };
-
-  // Generic pointers since we don't know what states we'll need
-  void* state1_;
-  void* state2_;
-  void* state3_;
-
-  // Storage if needed
-  int16_t* in_buffer_;
-  int16_t* out_buffer_;
-  size_t in_buffer_size_;
-  size_t out_buffer_size_;
-  size_t in_buffer_size_max_;
-  size_t out_buffer_size_max_;
-
-  int my_in_frequency_khz_;
-  int my_out_frequency_khz_;
-  ResamplerMode my_mode_;
-  size_t num_channels_;
-
-  // Extra instance for stereo
-  Resampler* slave_left_;
-  Resampler* slave_right_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_COMMON_AUDIO_RESAMPLER_INCLUDE_RESAMPLER_H_
diff --git a/common_audio/resampler/push_resampler.cc b/common_audio/resampler/push_resampler.cc
deleted file mode 100644
index 38cdf2b..0000000
--- a/common_audio/resampler/push_resampler.cc
+++ /dev/null
@@ -1,147 +0,0 @@
-/*
- *  Copyright (c) 2013 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/common_audio/resampler/include/push_resampler.h"
-
-#include <string.h>
-
-#include "webrtc/common_audio/include/audio_util.h"
-#include "webrtc/common_audio/resampler/include/resampler.h"
-#include "webrtc/common_audio/resampler/push_sinc_resampler.h"
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-namespace {
-// These checks were factored out into a non-templatized function
-// due to problems with clang on Windows in debug builds.
-// For some reason having the DCHECKs inline in the template code
-// caused the compiler to generate code that threw off the linker.
-// TODO(tommi): Re-enable when we've figured out what the problem is.
-// http://crbug.com/615050
-void CheckValidInitParams(int src_sample_rate_hz, int dst_sample_rate_hz,
-                          size_t num_channels) {
-// The below checks are temporarily disabled on WEBRTC_WIN due to problems
-// with clang debug builds.
-#if !defined(WEBRTC_WIN) && defined(__clang__)
-  RTC_DCHECK_GT(src_sample_rate_hz, 0);
-  RTC_DCHECK_GT(dst_sample_rate_hz, 0);
-  RTC_DCHECK_GT(num_channels, 0);
-  RTC_DCHECK_LE(num_channels, 2);
-#endif
-}
-
-void CheckExpectedBufferSizes(size_t src_length,
-                              size_t dst_capacity,
-                              size_t num_channels,
-                              int src_sample_rate,
-                              int dst_sample_rate) {
-// The below checks are temporarily disabled on WEBRTC_WIN due to problems
-// with clang debug builds.
-// TODO(tommi): Re-enable when we've figured out what the problem is.
-// http://crbug.com/615050
-#if !defined(WEBRTC_WIN) && defined(__clang__)
-  const size_t src_size_10ms = src_sample_rate * num_channels / 100;
-  const size_t dst_size_10ms = dst_sample_rate * num_channels / 100;
-  RTC_DCHECK_EQ(src_length, src_size_10ms);
-  RTC_DCHECK_GE(dst_capacity, dst_size_10ms);
-#endif
-}
-}  // namespace
-
-template <typename T>
-PushResampler<T>::PushResampler()
-    : src_sample_rate_hz_(0),
-      dst_sample_rate_hz_(0),
-      num_channels_(0) {
-}
-
-template <typename T>
-PushResampler<T>::~PushResampler() {
-}
-
-template <typename T>
-int PushResampler<T>::InitializeIfNeeded(int src_sample_rate_hz,
-                                         int dst_sample_rate_hz,
-                                         size_t num_channels) {
-  CheckValidInitParams(src_sample_rate_hz, dst_sample_rate_hz, num_channels);
-
-  if (src_sample_rate_hz == src_sample_rate_hz_ &&
-      dst_sample_rate_hz == dst_sample_rate_hz_ &&
-      num_channels == num_channels_) {
-    // No-op if settings haven't changed.
-    return 0;
-  }
-
-  if (src_sample_rate_hz <= 0 || dst_sample_rate_hz <= 0 || num_channels <= 0 ||
-      num_channels > 2) {
-    return -1;
-  }
-
-  src_sample_rate_hz_ = src_sample_rate_hz;
-  dst_sample_rate_hz_ = dst_sample_rate_hz;
-  num_channels_ = num_channels;
-
-  const size_t src_size_10ms_mono =
-      static_cast<size_t>(src_sample_rate_hz / 100);
-  const size_t dst_size_10ms_mono =
-      static_cast<size_t>(dst_sample_rate_hz / 100);
-  sinc_resampler_.reset(new PushSincResampler(src_size_10ms_mono,
-                                              dst_size_10ms_mono));
-  if (num_channels_ == 2) {
-    src_left_.reset(new T[src_size_10ms_mono]);
-    src_right_.reset(new T[src_size_10ms_mono]);
-    dst_left_.reset(new T[dst_size_10ms_mono]);
-    dst_right_.reset(new T[dst_size_10ms_mono]);
-    sinc_resampler_right_.reset(new PushSincResampler(src_size_10ms_mono,
-                                                      dst_size_10ms_mono));
-  }
-
-  return 0;
-}
-
-template <typename T>
-int PushResampler<T>::Resample(const T* src, size_t src_length, T* dst,
-                               size_t dst_capacity) {
-  CheckExpectedBufferSizes(src_length, dst_capacity, num_channels_,
-                           src_sample_rate_hz_, dst_sample_rate_hz_);
-
-  if (src_sample_rate_hz_ == dst_sample_rate_hz_) {
-    // The old resampler provides this memcpy facility in the case of matching
-    // sample rates, so reproduce it here for the sinc resampler.
-    memcpy(dst, src, src_length * sizeof(T));
-    return static_cast<int>(src_length);
-  }
-  if (num_channels_ == 2) {
-    const size_t src_length_mono = src_length / num_channels_;
-    const size_t dst_capacity_mono = dst_capacity / num_channels_;
-    T* deinterleaved[] = {src_left_.get(), src_right_.get()};
-    Deinterleave(src, src_length_mono, num_channels_, deinterleaved);
-
-    size_t dst_length_mono =
-        sinc_resampler_->Resample(src_left_.get(), src_length_mono,
-                                  dst_left_.get(), dst_capacity_mono);
-    sinc_resampler_right_->Resample(src_right_.get(), src_length_mono,
-                                    dst_right_.get(), dst_capacity_mono);
-
-    deinterleaved[0] = dst_left_.get();
-    deinterleaved[1] = dst_right_.get();
-    Interleave(deinterleaved, dst_length_mono, num_channels_, dst);
-    return static_cast<int>(dst_length_mono * num_channels_);
-  } else {
-    return static_cast<int>(
-        sinc_resampler_->Resample(src, src_length, dst, dst_capacity));
-  }
-}
-
-// Explictly generate required instantiations.
-template class PushResampler<int16_t>;
-template class PushResampler<float>;
-
-}  // namespace webrtc
diff --git a/common_audio/resampler/push_resampler_unittest.cc b/common_audio/resampler/push_resampler_unittest.cc
deleted file mode 100644
index eb08f70..0000000
--- a/common_audio/resampler/push_resampler_unittest.cc
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- *  Copyright (c) 2013 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/common_audio/resampler/include/push_resampler.h"
-#include "webrtc/rtc_base/checks.h"  // RTC_DCHECK_IS_ON
-#include "webrtc/test/gtest.h"
-
-// Quality testing of PushResampler is handled through output_mixer_unittest.cc.
-
-namespace webrtc {
-
-// The below tests are temporarily disabled on WEBRTC_WIN due to problems
-// with clang debug builds.
-// TODO(tommi): Re-enable when we've figured out what the problem is.
-// http://crbug.com/615050
-#if !defined(WEBRTC_WIN) && defined(__clang__) && !defined(NDEBUG)
-TEST(PushResamplerTest, VerifiesInputParameters) {
-  PushResampler<int16_t> resampler;
-  EXPECT_EQ(0, resampler.InitializeIfNeeded(16000, 16000, 1));
-  EXPECT_EQ(0, resampler.InitializeIfNeeded(16000, 16000, 2));
-}
-
-#if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
-TEST(PushResamplerTest, VerifiesBadInputParameters1) {
-  PushResampler<int16_t> resampler;
-  EXPECT_DEATH(resampler.InitializeIfNeeded(-1, 16000, 1),
-               "src_sample_rate_hz");
-}
-
-TEST(PushResamplerTest, VerifiesBadInputParameters2) {
-  PushResampler<int16_t> resampler;
-  EXPECT_DEATH(resampler.InitializeIfNeeded(16000, -1, 1),
-               "dst_sample_rate_hz");
-}
-
-TEST(PushResamplerTest, VerifiesBadInputParameters3) {
-  PushResampler<int16_t> resampler;
-  EXPECT_DEATH(resampler.InitializeIfNeeded(16000, 16000, 0), "num_channels");
-}
-
-TEST(PushResamplerTest, VerifiesBadInputParameters4) {
-  PushResampler<int16_t> resampler;
-  EXPECT_DEATH(resampler.InitializeIfNeeded(16000, 16000, 3), "num_channels");
-}
-#endif
-#endif
-
-}  // namespace webrtc
diff --git a/common_audio/resampler/push_sinc_resampler.cc b/common_audio/resampler/push_sinc_resampler.cc
deleted file mode 100644
index 3b603db..0000000
--- a/common_audio/resampler/push_sinc_resampler.cc
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- *  Copyright (c) 2013 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/common_audio/resampler/push_sinc_resampler.h"
-
-#include <cstring>
-
-#include "webrtc/common_audio/include/audio_util.h"
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-
-PushSincResampler::PushSincResampler(size_t source_frames,
-                                     size_t destination_frames)
-    : resampler_(new SincResampler(source_frames * 1.0 / destination_frames,
-                                   source_frames,
-                                   this)),
-      source_ptr_(nullptr),
-      source_ptr_int_(nullptr),
-      destination_frames_(destination_frames),
-      first_pass_(true),
-      source_available_(0) {}
-
-PushSincResampler::~PushSincResampler() {
-}
-
-size_t PushSincResampler::Resample(const int16_t* source,
-                                   size_t source_length,
-                                   int16_t* destination,
-                                   size_t destination_capacity) {
-  if (!float_buffer_.get())
-    float_buffer_.reset(new float[destination_frames_]);
-
-  source_ptr_int_ = source;
-  // Pass nullptr as the float source to have Run() read from the int16 source.
-  Resample(nullptr, source_length, float_buffer_.get(), destination_frames_);
-  FloatS16ToS16(float_buffer_.get(), destination_frames_, destination);
-  source_ptr_int_ = nullptr;
-  return destination_frames_;
-}
-
-size_t PushSincResampler::Resample(const float* source,
-                                   size_t source_length,
-                                   float* destination,
-                                   size_t destination_capacity) {
-  RTC_CHECK_EQ(source_length, resampler_->request_frames());
-  RTC_CHECK_GE(destination_capacity, destination_frames_);
-  // Cache the source pointer. Calling Resample() will immediately trigger
-  // the Run() callback whereupon we provide the cached value.
-  source_ptr_ = source;
-  source_available_ = source_length;
-
-  // On the first pass, we call Resample() twice. During the first call, we
-  // provide dummy input and discard the output. This is done to prime the
-  // SincResampler buffer with the correct delay (half the kernel size), thereby
-  // ensuring that all later Resample() calls will only result in one input
-  // request through Run().
-  //
-  // If this wasn't done, SincResampler would call Run() twice on the first
-  // pass, and we'd have to introduce an entire |source_frames| of delay, rather
-  // than the minimum half kernel.
-  //
-  // It works out that ChunkSize() is exactly the amount of output we need to
-  // request in order to prime the buffer with a single Run() request for
-  // |source_frames|.
-  if (first_pass_)
-    resampler_->Resample(resampler_->ChunkSize(), destination);
-
-  resampler_->Resample(destination_frames_, destination);
-  source_ptr_ = nullptr;
-  return destination_frames_;
-}
-
-void PushSincResampler::Run(size_t frames, float* destination) {
-  // Ensure we are only asked for the available samples. This would fail if
-  // Run() was triggered more than once per Resample() call.
-  RTC_CHECK_EQ(source_available_, frames);
-
-  if (first_pass_) {
-    // Provide dummy input on the first pass, the output of which will be
-    // discarded, as described in Resample().
-    std::memset(destination, 0, frames * sizeof(*destination));
-    first_pass_ = false;
-    return;
-  }
-
-  if (source_ptr_) {
-    std::memcpy(destination, source_ptr_, frames * sizeof(*destination));
-  } else {
-    for (size_t i = 0; i < frames; ++i)
-      destination[i] = static_cast<float>(source_ptr_int_[i]);
-  }
-  source_available_ -= frames;
-}
-
-}  // namespace webrtc
diff --git a/common_audio/resampler/push_sinc_resampler.h b/common_audio/resampler/push_sinc_resampler.h
deleted file mode 100644
index 7af85c8..0000000
--- a/common_audio/resampler/push_sinc_resampler.h
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- *  Copyright (c) 2013 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_COMMON_AUDIO_RESAMPLER_PUSH_SINC_RESAMPLER_H_
-#define WEBRTC_COMMON_AUDIO_RESAMPLER_PUSH_SINC_RESAMPLER_H_
-
-#include <memory>
-
-#include "webrtc/common_audio/resampler/sinc_resampler.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-// A thin wrapper over SincResampler to provide a push-based interface as
-// required by WebRTC. SincResampler uses a pull-based interface, and will
-// use SincResamplerCallback::Run() to request data upon a call to Resample().
-// These Run() calls will happen on the same thread Resample() is called on.
-class PushSincResampler : public SincResamplerCallback {
- public:
-  // Provide the size of the source and destination blocks in samples. These
-  // must correspond to the same time duration (typically 10 ms) as the sample
-  // ratio is inferred from them.
-  PushSincResampler(size_t source_frames, size_t destination_frames);
-  ~PushSincResampler() override;
-
-  // Perform the resampling. |source_frames| must always equal the
-  // |source_frames| provided at construction. |destination_capacity| must be
-  // at least as large as |destination_frames|. Returns the number of samples
-  // provided in destination (for convenience, since this will always be equal
-  // to |destination_frames|).
-  size_t Resample(const int16_t* source, size_t source_frames,
-                  int16_t* destination, size_t destination_capacity);
-  size_t Resample(const float* source,
-                  size_t source_frames,
-                  float* destination,
-                  size_t destination_capacity);
-
-  // Delay due to the filter kernel. Essentially, the time after which an input
-  // sample will appear in the resampled output.
-  static float AlgorithmicDelaySeconds(int source_rate_hz) {
-    return 1.f / source_rate_hz * SincResampler::kKernelSize / 2;
-  }
-
- protected:
-  // Implements SincResamplerCallback.
-  void Run(size_t frames, float* destination) override;
-
- private:
-  friend class PushSincResamplerTest;
-  SincResampler* get_resampler_for_testing() { return resampler_.get(); }
-
-  std::unique_ptr<SincResampler> resampler_;
-  std::unique_ptr<float[]> float_buffer_;
-  const float* source_ptr_;
-  const int16_t* source_ptr_int_;
-  const size_t destination_frames_;
-
-  // True on the first call to Resample(), to prime the SincResampler buffer.
-  bool first_pass_;
-
-  // Used to assert we are only requested for as much data as is available.
-  size_t source_available_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(PushSincResampler);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_COMMON_AUDIO_RESAMPLER_PUSH_SINC_RESAMPLER_H_
diff --git a/common_audio/resampler/push_sinc_resampler_unittest.cc b/common_audio/resampler/push_sinc_resampler_unittest.cc
deleted file mode 100644
index cb156cc..0000000
--- a/common_audio/resampler/push_sinc_resampler_unittest.cc
+++ /dev/null
@@ -1,338 +0,0 @@
-/*
- *  Copyright (c) 2013 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 <algorithm>
-#include <cmath>
-#include <cstring>
-#include <memory>
-
-#include "webrtc/common_audio/include/audio_util.h"
-#include "webrtc/common_audio/resampler/push_sinc_resampler.h"
-#include "webrtc/common_audio/resampler/sinusoidal_linear_chirp_source.h"
-#include "webrtc/rtc_base/timeutils.h"
-#include "webrtc/test/gmock.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-namespace {
-
-// Almost all conversions have an RMS error of around -14 dbFS.
-const double kResamplingRMSError = -14.42;
-
-// Used to convert errors to dbFS.
-template <typename T>
-T DBFS(T x) {
-  return 20 * std::log10(x);
-}
-
-}  // namespace
-
-class PushSincResamplerTest : public ::testing::TestWithParam<
-    ::testing::tuple<int, int, double, double>> {
- public:
-  PushSincResamplerTest()
-      : input_rate_(::testing::get<0>(GetParam())),
-        output_rate_(::testing::get<1>(GetParam())),
-        rms_error_(::testing::get<2>(GetParam())),
-        low_freq_error_(::testing::get<3>(GetParam())) {
-  }
-
-  ~PushSincResamplerTest() override {}
-
- protected:
-  void ResampleBenchmarkTest(bool int_format);
-  void ResampleTest(bool int_format);
-
-  int input_rate_;
-  int output_rate_;
-  double rms_error_;
-  double low_freq_error_;
-};
-
-class ZeroSource : public SincResamplerCallback {
- public:
-  void Run(size_t frames, float* destination) {
-    std::memset(destination, 0, sizeof(float) * frames);
-  }
-};
-
-void PushSincResamplerTest::ResampleBenchmarkTest(bool int_format) {
-  const size_t input_samples = static_cast<size_t>(input_rate_ / 100);
-  const size_t output_samples = static_cast<size_t>(output_rate_ / 100);
-  const int kResampleIterations = 500000;
-
-  // Source for data to be resampled.
-  ZeroSource resampler_source;
-
-  std::unique_ptr<float[]> resampled_destination(new float[output_samples]);
-  std::unique_ptr<float[]> source(new float[input_samples]);
-  std::unique_ptr<int16_t[]> source_int(new int16_t[input_samples]);
-  std::unique_ptr<int16_t[]> destination_int(new int16_t[output_samples]);
-
-  resampler_source.Run(input_samples, source.get());
-  for (size_t i = 0; i < input_samples; ++i) {
-    source_int[i] = static_cast<int16_t>(floor(32767 * source[i] + 0.5));
-  }
-
-  printf("Benchmarking %d iterations of %d Hz -> %d Hz:\n",
-         kResampleIterations, input_rate_, output_rate_);
-  const double io_ratio = input_rate_ / static_cast<double>(output_rate_);
-  SincResampler sinc_resampler(io_ratio, SincResampler::kDefaultRequestSize,
-                               &resampler_source);
-  int64_t start = rtc::TimeNanos();
-  for (int i = 0; i < kResampleIterations; ++i) {
-    sinc_resampler.Resample(output_samples, resampled_destination.get());
-  }
-  double total_time_sinc_us =
-      (rtc::TimeNanos() - start) / rtc::kNumNanosecsPerMicrosec;
-  printf("SincResampler took %.2f us per frame.\n",
-         total_time_sinc_us / kResampleIterations);
-
-  PushSincResampler resampler(input_samples, output_samples);
-  start = rtc::TimeNanos();
-  if (int_format) {
-    for (int i = 0; i < kResampleIterations; ++i) {
-      EXPECT_EQ(output_samples,
-                resampler.Resample(source_int.get(),
-                                   input_samples,
-                                   destination_int.get(),
-                                   output_samples));
-    }
-  } else {
-    for (int i = 0; i < kResampleIterations; ++i) {
-      EXPECT_EQ(output_samples,
-                resampler.Resample(source.get(),
-                                   input_samples,
-                                   resampled_destination.get(),
-                                   output_samples));
-    }
-  }
-  double total_time_us =
-      (rtc::TimeNanos() - start) / rtc::kNumNanosecsPerMicrosec;
-  printf("PushSincResampler took %.2f us per frame; which is a %.1f%% overhead "
-         "on SincResampler.\n\n", total_time_us / kResampleIterations,
-         (total_time_us - total_time_sinc_us) / total_time_sinc_us * 100);
-}
-
-// Disabled because it takes too long to run routinely. Use for performance
-// benchmarking when needed.
-TEST_P(PushSincResamplerTest, DISABLED_BenchmarkInt) {
-  ResampleBenchmarkTest(true);
-}
-
-TEST_P(PushSincResamplerTest, DISABLED_BenchmarkFloat) {
-  ResampleBenchmarkTest(false);
-}
-
-// Tests resampling using a given input and output sample rate.
-void PushSincResamplerTest::ResampleTest(bool int_format) {
-  // Make comparisons using one second of data.
-  static const double kTestDurationSecs = 1;
-  // 10 ms blocks.
-  const size_t kNumBlocks = static_cast<size_t>(kTestDurationSecs * 100);
-  const size_t input_block_size = static_cast<size_t>(input_rate_ / 100);
-  const size_t output_block_size = static_cast<size_t>(output_rate_ / 100);
-  const size_t input_samples =
-      static_cast<size_t>(kTestDurationSecs * input_rate_);
-  const size_t output_samples =
-      static_cast<size_t>(kTestDurationSecs * output_rate_);
-
-  // Nyquist frequency for the input sampling rate.
-  const double input_nyquist_freq = 0.5 * input_rate_;
-
-  // Source for data to be resampled.
-  SinusoidalLinearChirpSource resampler_source(
-      input_rate_, input_samples, input_nyquist_freq, 0);
-
-  PushSincResampler resampler(input_block_size, output_block_size);
-
-  // TODO(dalecurtis): If we switch to AVX/SSE optimization, we'll need to
-  // allocate these on 32-byte boundaries and ensure they're sized % 32 bytes.
-  std::unique_ptr<float[]> resampled_destination(new float[output_samples]);
-  std::unique_ptr<float[]> pure_destination(new float[output_samples]);
-  std::unique_ptr<float[]> source(new float[input_samples]);
-  std::unique_ptr<int16_t[]> source_int(new int16_t[input_block_size]);
-  std::unique_ptr<int16_t[]> destination_int(new int16_t[output_block_size]);
-
-  // The sinc resampler has an implicit delay of approximately half the kernel
-  // size at the input sample rate. By moving to a push model, this delay
-  // becomes explicit and is managed by zero-stuffing in PushSincResampler. We
-  // deal with it in the test by delaying the "pure" source to match. It must be
-  // checked before the first call to Resample(), because ChunkSize() will
-  // change afterwards.
-  const size_t output_delay_samples = output_block_size -
-      resampler.get_resampler_for_testing()->ChunkSize();
-
-  // Generate resampled signal.
-  // With the PushSincResampler, we produce the signal block-by-10ms-block
-  // rather than in a single pass, to exercise how it will be used in WebRTC.
-  resampler_source.Run(input_samples, source.get());
-  if (int_format) {
-    for (size_t i = 0; i < kNumBlocks; ++i) {
-      FloatToS16(&source[i * input_block_size], input_block_size,
-               source_int.get());
-      EXPECT_EQ(output_block_size,
-                resampler.Resample(source_int.get(),
-                                   input_block_size,
-                                   destination_int.get(),
-                                   output_block_size));
-      S16ToFloat(destination_int.get(), output_block_size,
-               &resampled_destination[i * output_block_size]);
-    }
-  } else {
-    for (size_t i = 0; i < kNumBlocks; ++i) {
-      EXPECT_EQ(
-          output_block_size,
-          resampler.Resample(&source[i * input_block_size],
-                             input_block_size,
-                             &resampled_destination[i * output_block_size],
-                             output_block_size));
-    }
-  }
-
-  // Generate pure signal.
-  SinusoidalLinearChirpSource pure_source(
-      output_rate_, output_samples, input_nyquist_freq, output_delay_samples);
-  pure_source.Run(output_samples, pure_destination.get());
-
-  // Range of the Nyquist frequency (0.5 * min(input rate, output_rate)) which
-  // we refer to as low and high.
-  static const double kLowFrequencyNyquistRange = 0.7;
-  static const double kHighFrequencyNyquistRange = 0.9;
-
-  // Calculate Root-Mean-Square-Error and maximum error for the resampling.
-  double sum_of_squares = 0;
-  double low_freq_max_error = 0;
-  double high_freq_max_error = 0;
-  int minimum_rate = std::min(input_rate_, output_rate_);
-  double low_frequency_range = kLowFrequencyNyquistRange * 0.5 * minimum_rate;
-  double high_frequency_range = kHighFrequencyNyquistRange * 0.5 * minimum_rate;
-
-  for (size_t i = 0; i < output_samples; ++i) {
-    double error = fabs(resampled_destination[i] - pure_destination[i]);
-
-    if (pure_source.Frequency(i) < low_frequency_range) {
-      if (error > low_freq_max_error)
-        low_freq_max_error = error;
-    } else if (pure_source.Frequency(i) < high_frequency_range) {
-      if (error > high_freq_max_error)
-        high_freq_max_error = error;
-    }
-    // TODO(dalecurtis): Sanity check frequencies > kHighFrequencyNyquistRange.
-
-    sum_of_squares += error * error;
-  }
-
-  double rms_error = sqrt(sum_of_squares / output_samples);
-
-  rms_error = DBFS(rms_error);
-  // In order to keep the thresholds in this test identical to SincResamplerTest
-  // we must account for the quantization error introduced by truncating from
-  // float to int. This happens twice (once at input and once at output) and we
-  // allow for the maximum possible error (1 / 32767) for each step.
-  //
-  // The quantization error is insignificant in the RMS calculation so does not
-  // need to be accounted for there.
-  low_freq_max_error = DBFS(low_freq_max_error - 2.0 / 32767);
-  high_freq_max_error = DBFS(high_freq_max_error - 2.0 / 32767);
-
-  EXPECT_LE(rms_error, rms_error_);
-  EXPECT_LE(low_freq_max_error, low_freq_error_);
-
-  // All conversions currently have a high frequency error around -6 dbFS.
-  static const double kHighFrequencyMaxError = -6.02;
-  EXPECT_LE(high_freq_max_error, kHighFrequencyMaxError);
-}
-
-TEST_P(PushSincResamplerTest, ResampleInt) { ResampleTest(true); }
-
-TEST_P(PushSincResamplerTest, ResampleFloat) { ResampleTest(false); }
-
-// Thresholds chosen arbitrarily based on what each resampling reported during
-// testing.  All thresholds are in dbFS, http://en.wikipedia.org/wiki/DBFS.
-INSTANTIATE_TEST_CASE_P(
-    PushSincResamplerTest,
-    PushSincResamplerTest,
-    ::testing::Values(
-        // First run through the rates tested in SincResamplerTest. The
-        // thresholds are identical.
-        //
-        // We don't test rates which fail to provide an integer number of
-        // samples in a 10 ms block (22050 and 11025 Hz). WebRTC doesn't support
-        // these rates in any case (for the same reason).
-
-        // To 44.1kHz
-        ::testing::make_tuple(8000, 44100, kResamplingRMSError, -62.73),
-        ::testing::make_tuple(16000, 44100, kResamplingRMSError, -62.54),
-        ::testing::make_tuple(32000, 44100, kResamplingRMSError, -63.32),
-        ::testing::make_tuple(44100, 44100, kResamplingRMSError, -73.53),
-        ::testing::make_tuple(48000, 44100, -15.01, -64.04),
-        ::testing::make_tuple(96000, 44100, -18.49, -25.51),
-        ::testing::make_tuple(192000, 44100, -20.50, -13.31),
-
-        // To 48kHz
-        ::testing::make_tuple(8000, 48000, kResamplingRMSError, -63.43),
-        ::testing::make_tuple(16000, 48000, kResamplingRMSError, -63.96),
-        ::testing::make_tuple(32000, 48000, kResamplingRMSError, -64.04),
-        ::testing::make_tuple(44100, 48000, kResamplingRMSError, -62.63),
-        ::testing::make_tuple(48000, 48000, kResamplingRMSError, -73.52),
-        ::testing::make_tuple(96000, 48000, -18.40, -28.44),
-        ::testing::make_tuple(192000, 48000, -20.43, -14.11),
-
-        // To 96kHz
-        ::testing::make_tuple(8000, 96000, kResamplingRMSError, -63.19),
-        ::testing::make_tuple(16000, 96000, kResamplingRMSError, -63.39),
-        ::testing::make_tuple(32000, 96000, kResamplingRMSError, -63.95),
-        ::testing::make_tuple(44100, 96000, kResamplingRMSError, -62.63),
-        ::testing::make_tuple(48000, 96000, kResamplingRMSError, -73.52),
-        ::testing::make_tuple(96000, 96000, kResamplingRMSError, -73.52),
-        ::testing::make_tuple(192000, 96000, kResamplingRMSError, -28.41),
-
-        // To 192kHz
-        ::testing::make_tuple(8000, 192000, kResamplingRMSError, -63.10),
-        ::testing::make_tuple(16000, 192000, kResamplingRMSError, -63.14),
-        ::testing::make_tuple(32000, 192000, kResamplingRMSError, -63.38),
-        ::testing::make_tuple(44100, 192000, kResamplingRMSError, -62.63),
-        ::testing::make_tuple(48000, 192000, kResamplingRMSError, -73.44),
-        ::testing::make_tuple(96000, 192000, kResamplingRMSError, -73.52),
-        ::testing::make_tuple(192000, 192000, kResamplingRMSError, -73.52),
-
-        // Next run through some additional cases interesting for WebRTC.
-        // We skip some extreme downsampled cases (192 -> {8, 16}, 96 -> 8)
-        // because they violate |kHighFrequencyMaxError|, which is not
-        // unexpected. It's very unlikely that we'll see these conversions in
-        // practice anyway.
-
-        // To 8 kHz
-        ::testing::make_tuple(8000, 8000, kResamplingRMSError, -75.50),
-        ::testing::make_tuple(16000, 8000, -18.56, -28.79),
-        ::testing::make_tuple(32000, 8000, -20.36, -14.13),
-        ::testing::make_tuple(44100, 8000, -21.00, -11.39),
-        ::testing::make_tuple(48000, 8000, -20.96, -11.04),
-
-        // To 16 kHz
-        ::testing::make_tuple(8000, 16000, kResamplingRMSError, -70.30),
-        ::testing::make_tuple(16000, 16000, kResamplingRMSError, -75.51),
-        ::testing::make_tuple(32000, 16000, -18.48, -28.59),
-        ::testing::make_tuple(44100, 16000, -19.30, -19.67),
-        ::testing::make_tuple(48000, 16000, -19.81, -18.11),
-        ::testing::make_tuple(96000, 16000, -20.95, -10.96),
-
-        // To 32 kHz
-        ::testing::make_tuple(8000, 32000, kResamplingRMSError, -70.30),
-        ::testing::make_tuple(16000, 32000, kResamplingRMSError, -75.51),
-        ::testing::make_tuple(32000, 32000, kResamplingRMSError, -75.51),
-        ::testing::make_tuple(44100, 32000, -16.44, -51.10),
-        ::testing::make_tuple(48000, 32000, -16.90, -44.03),
-        ::testing::make_tuple(96000, 32000, -19.61, -18.04),
-        ::testing::make_tuple(192000, 32000, -21.02, -10.94)));
-
-}  // namespace webrtc
diff --git a/common_audio/resampler/resampler.cc b/common_audio/resampler/resampler.cc
deleted file mode 100644
index 8efb16c..0000000
--- a/common_audio/resampler/resampler.cc
+++ /dev/null
@@ -1,903 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-
-/*
- * A wrapper for resampling a numerous amount of sampling combinations.
- */
-
-#include <stdlib.h>
-#include <string.h>
-
-#include "webrtc/common_audio/resampler/include/resampler.h"
-#include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
-
-namespace webrtc {
-
-Resampler::Resampler()
-    : state1_(nullptr),
-      state2_(nullptr),
-      state3_(nullptr),
-      in_buffer_(nullptr),
-      out_buffer_(nullptr),
-      in_buffer_size_(0),
-      out_buffer_size_(0),
-      in_buffer_size_max_(0),
-      out_buffer_size_max_(0),
-      my_in_frequency_khz_(0),
-      my_out_frequency_khz_(0),
-      my_mode_(kResamplerMode1To1),
-      num_channels_(0),
-      slave_left_(nullptr),
-      slave_right_(nullptr) {
-}
-
-Resampler::Resampler(int inFreq, int outFreq, size_t num_channels)
-    : Resampler() {
-  Reset(inFreq, outFreq, num_channels);
-}
-
-Resampler::~Resampler() {
-  if (state1_) {
-    free(state1_);
-  }
-  if (state2_) {
-    free(state2_);
-  }
-  if (state3_) {
-    free(state3_);
-  }
-  if (in_buffer_) {
-    free(in_buffer_);
-  }
-  if (out_buffer_) {
-    free(out_buffer_);
-  }
-  if (slave_left_) {
-    delete slave_left_;
-  }
-  if (slave_right_) {
-    delete slave_right_;
-  }
-}
-
-int Resampler::ResetIfNeeded(int inFreq, int outFreq, size_t num_channels) {
-  int tmpInFreq_kHz = inFreq / 1000;
-  int tmpOutFreq_kHz = outFreq / 1000;
-
-  if ((tmpInFreq_kHz != my_in_frequency_khz_)
-      || (tmpOutFreq_kHz != my_out_frequency_khz_)
-      || (num_channels != num_channels_)) {
-    return Reset(inFreq, outFreq, num_channels);
-  } else {
-    return 0;
-  }
-}
-
-int Resampler::Reset(int inFreq, int outFreq, size_t num_channels) {
-  if (num_channels != 1 && num_channels != 2) {
-      return -1;
-  }
-  num_channels_ = num_channels;
-
-  if (state1_) {
-    free(state1_);
-    state1_ = nullptr;
-  }
-  if (state2_) {
-    free(state2_);
-    state2_ = nullptr;
-  }
-  if (state3_) {
-    free(state3_);
-    state3_ = nullptr;
-  }
-  if (in_buffer_) {
-    free(in_buffer_);
-    in_buffer_ = nullptr;
-  }
-  if (out_buffer_) {
-    free(out_buffer_);
-    out_buffer_ = nullptr;
-  }
-  if (slave_left_) {
-    delete slave_left_;
-    slave_left_ = nullptr;
-  }
-  if (slave_right_) {
-    delete slave_right_;
-    slave_right_ = nullptr;
-  }
-
-  in_buffer_size_ = 0;
-  out_buffer_size_ = 0;
-  in_buffer_size_max_ = 0;
-  out_buffer_size_max_ = 0;
-
-  // Start with a math exercise, Euclid's algorithm to find the gcd:
-  int a = inFreq;
-  int b = outFreq;
-  int c = a % b;
-  while (c != 0) {
-    a = b;
-    b = c;
-    c = a % b;
-  }
-  // b is now the gcd;
-
-  // We need to track what domain we're in.
-  my_in_frequency_khz_ = inFreq / 1000;
-  my_out_frequency_khz_ = outFreq / 1000;
-
-  // Scale with GCD
-  inFreq = inFreq / b;
-  outFreq = outFreq / b;
-
-  if (num_channels_ == 2) {
-    // Create two mono resamplers.
-    slave_left_ = new Resampler(inFreq, outFreq, 1);
-    slave_right_ = new Resampler(inFreq, outFreq, 1);
-  }
-
-  if (inFreq == outFreq) {
-    my_mode_ = kResamplerMode1To1;
-  } else if (inFreq == 1) {
-    switch (outFreq) {
-      case 2:
-        my_mode_ = kResamplerMode1To2;
-        break;
-      case 3:
-        my_mode_ = kResamplerMode1To3;
-        break;
-      case 4:
-        my_mode_ = kResamplerMode1To4;
-        break;
-      case 6:
-        my_mode_ = kResamplerMode1To6;
-        break;
-      case 12:
-        my_mode_ = kResamplerMode1To12;
-        break;
-      default:
-        return -1;
-    }
-  } else if (outFreq == 1) {
-    switch (inFreq) {
-      case 2:
-        my_mode_ = kResamplerMode2To1;
-        break;
-      case 3:
-        my_mode_ = kResamplerMode3To1;
-        break;
-      case 4:
-        my_mode_ = kResamplerMode4To1;
-        break;
-      case 6:
-        my_mode_ = kResamplerMode6To1;
-        break;
-      case 12:
-        my_mode_ = kResamplerMode12To1;
-        break;
-      default:
-        return -1;
-    }
-  } else if ((inFreq == 2) && (outFreq == 3)) {
-    my_mode_ = kResamplerMode2To3;
-  } else if ((inFreq == 2) && (outFreq == 11)) {
-    my_mode_ = kResamplerMode2To11;
-  } else if ((inFreq == 4) && (outFreq == 11)) {
-    my_mode_ = kResamplerMode4To11;
-  } else if ((inFreq == 8) && (outFreq == 11)) {
-    my_mode_ = kResamplerMode8To11;
-  } else if ((inFreq == 3) && (outFreq == 2)) {
-    my_mode_ = kResamplerMode3To2;
-  } else if ((inFreq == 11) && (outFreq == 2)) {
-    my_mode_ = kResamplerMode11To2;
-  } else if ((inFreq == 11) && (outFreq == 4)) {
-    my_mode_ = kResamplerMode11To4;
-  } else if ((inFreq == 11) && (outFreq == 16)) {
-    my_mode_ = kResamplerMode11To16;
-  } else if ((inFreq == 11) && (outFreq == 32)) {
-    my_mode_ = kResamplerMode11To32;
-  } else if ((inFreq == 11) && (outFreq == 8)) {
-    my_mode_ = kResamplerMode11To8;
-  } else {
-    return -1;
-  }
-
-  // Now create the states we need
-  switch (my_mode_) {
-    case kResamplerMode1To1:
-      // No state needed;
-      break;
-    case kResamplerMode1To2:
-      state1_ = malloc(8 * sizeof(int32_t));
-      memset(state1_, 0, 8 * sizeof(int32_t));
-      break;
-    case kResamplerMode1To3:
-      state1_ = malloc(sizeof(WebRtcSpl_State16khzTo48khz));
-      WebRtcSpl_ResetResample16khzTo48khz(
-          static_cast<WebRtcSpl_State16khzTo48khz*>(state1_));
-      break;
-    case kResamplerMode1To4:
-      // 1:2
-      state1_ = malloc(8 * sizeof(int32_t));
-      memset(state1_, 0, 8 * sizeof(int32_t));
-      // 2:4
-      state2_ = malloc(8 * sizeof(int32_t));
-      memset(state2_, 0, 8 * sizeof(int32_t));
-      break;
-    case kResamplerMode1To6:
-      // 1:2
-      state1_ = malloc(8 * sizeof(int32_t));
-      memset(state1_, 0, 8 * sizeof(int32_t));
-      // 2:6
-      state2_ = malloc(sizeof(WebRtcSpl_State16khzTo48khz));
-      WebRtcSpl_ResetResample16khzTo48khz(
-          static_cast<WebRtcSpl_State16khzTo48khz*>(state2_));
-      break;
-    case kResamplerMode1To12:
-      // 1:2
-      state1_ = malloc(8 * sizeof(int32_t));
-      memset(state1_, 0, 8 * sizeof(int32_t));
-      // 2:4
-      state2_ = malloc(8 * sizeof(int32_t));
-      memset(state2_, 0, 8 * sizeof(int32_t));
-      // 4:12
-      state3_ = malloc(sizeof(WebRtcSpl_State16khzTo48khz));
-      WebRtcSpl_ResetResample16khzTo48khz(
-          static_cast<WebRtcSpl_State16khzTo48khz*>(state3_));
-      break;
-    case kResamplerMode2To3:
-      // 2:6
-      state1_ = malloc(sizeof(WebRtcSpl_State16khzTo48khz));
-      WebRtcSpl_ResetResample16khzTo48khz(
-        static_cast<WebRtcSpl_State16khzTo48khz*>(state1_));
-      // 6:3
-      state2_ = malloc(8 * sizeof(int32_t));
-      memset(state2_, 0, 8 * sizeof(int32_t));
-      break;
-    case kResamplerMode2To11:
-      state1_ = malloc(8 * sizeof(int32_t));
-      memset(state1_, 0, 8 * sizeof(int32_t));
-
-      state2_ = malloc(sizeof(WebRtcSpl_State8khzTo22khz));
-      WebRtcSpl_ResetResample8khzTo22khz(
-          static_cast<WebRtcSpl_State8khzTo22khz*>(state2_));
-      break;
-    case kResamplerMode4To11:
-      state1_ = malloc(sizeof(WebRtcSpl_State8khzTo22khz));
-      WebRtcSpl_ResetResample8khzTo22khz(
-          static_cast<WebRtcSpl_State8khzTo22khz*>(state1_));
-      break;
-    case kResamplerMode8To11:
-      state1_ = malloc(sizeof(WebRtcSpl_State16khzTo22khz));
-      WebRtcSpl_ResetResample16khzTo22khz(
-          static_cast<WebRtcSpl_State16khzTo22khz*>(state1_));
-      break;
-    case kResamplerMode11To16:
-      state1_ = malloc(8 * sizeof(int32_t));
-      memset(state1_, 0, 8 * sizeof(int32_t));
-
-      state2_ = malloc(sizeof(WebRtcSpl_State22khzTo16khz));
-      WebRtcSpl_ResetResample22khzTo16khz(
-          static_cast<WebRtcSpl_State22khzTo16khz*>(state2_));
-      break;
-    case kResamplerMode11To32:
-      // 11 -> 22
-      state1_ = malloc(8 * sizeof(int32_t));
-      memset(state1_, 0, 8 * sizeof(int32_t));
-
-      // 22 -> 16
-      state2_ = malloc(sizeof(WebRtcSpl_State22khzTo16khz));
-      WebRtcSpl_ResetResample22khzTo16khz(
-          static_cast<WebRtcSpl_State22khzTo16khz*>(state2_));
-
-      // 16 -> 32
-      state3_ = malloc(8 * sizeof(int32_t));
-      memset(state3_, 0, 8 * sizeof(int32_t));
-
-      break;
-    case kResamplerMode2To1:
-      state1_ = malloc(8 * sizeof(int32_t));
-      memset(state1_, 0, 8 * sizeof(int32_t));
-      break;
-    case kResamplerMode3To1:
-      state1_ = malloc(sizeof(WebRtcSpl_State48khzTo16khz));
-      WebRtcSpl_ResetResample48khzTo16khz(
-          static_cast<WebRtcSpl_State48khzTo16khz*>(state1_));
-      break;
-    case kResamplerMode4To1:
-      // 4:2
-      state1_ = malloc(8 * sizeof(int32_t));
-      memset(state1_, 0, 8 * sizeof(int32_t));
-      // 2:1
-      state2_ = malloc(8 * sizeof(int32_t));
-      memset(state2_, 0, 8 * sizeof(int32_t));
-      break;
-    case kResamplerMode6To1:
-      // 6:2
-      state1_ = malloc(sizeof(WebRtcSpl_State48khzTo16khz));
-      WebRtcSpl_ResetResample48khzTo16khz(
-          static_cast<WebRtcSpl_State48khzTo16khz*>(state1_));
-      // 2:1
-      state2_ = malloc(8 * sizeof(int32_t));
-      memset(state2_, 0, 8 * sizeof(int32_t));
-      break;
-    case kResamplerMode12To1:
-      // 12:4
-      state1_ = malloc(sizeof(WebRtcSpl_State48khzTo16khz));
-      WebRtcSpl_ResetResample48khzTo16khz(
-          static_cast<WebRtcSpl_State48khzTo16khz*>(state1_));
-      // 4:2
-      state2_ = malloc(8 * sizeof(int32_t));
-      memset(state2_, 0, 8 * sizeof(int32_t));
-      // 2:1
-      state3_ = malloc(8 * sizeof(int32_t));
-      memset(state3_, 0, 8 * sizeof(int32_t));
-      break;
-    case kResamplerMode3To2:
-      // 3:6
-      state1_ = malloc(8 * sizeof(int32_t));
-      memset(state1_, 0, 8 * sizeof(int32_t));
-      // 6:2
-      state2_ = malloc(sizeof(WebRtcSpl_State48khzTo16khz));
-      WebRtcSpl_ResetResample48khzTo16khz(
-          static_cast<WebRtcSpl_State48khzTo16khz*>(state2_));
-      break;
-    case kResamplerMode11To2:
-      state1_ = malloc(sizeof(WebRtcSpl_State22khzTo8khz));
-      WebRtcSpl_ResetResample22khzTo8khz(
-          static_cast<WebRtcSpl_State22khzTo8khz*>(state1_));
-
-      state2_ = malloc(8 * sizeof(int32_t));
-      memset(state2_, 0, 8 * sizeof(int32_t));
-
-      break;
-    case kResamplerMode11To4:
-      state1_ = malloc(sizeof(WebRtcSpl_State22khzTo8khz));
-      WebRtcSpl_ResetResample22khzTo8khz(
-          static_cast<WebRtcSpl_State22khzTo8khz*>(state1_));
-      break;
-    case kResamplerMode11To8:
-      state1_ = malloc(sizeof(WebRtcSpl_State22khzTo16khz));
-      WebRtcSpl_ResetResample22khzTo16khz(
-          static_cast<WebRtcSpl_State22khzTo16khz*>(state1_));
-      break;
-  }
-
-  return 0;
-}
-
-// Synchronous resampling, all output samples are written to samplesOut
-int Resampler::Push(const int16_t * samplesIn, size_t lengthIn,
-                    int16_t* samplesOut, size_t maxLen, size_t& outLen) {
-  if (num_channels_ == 2) {
-    // Split up the signal and call the slave object for each channel
-    int16_t* left =
-        static_cast<int16_t*>(malloc(lengthIn * sizeof(int16_t) / 2));
-    int16_t* right =
-        static_cast<int16_t*>(malloc(lengthIn * sizeof(int16_t) / 2));
-    int16_t* out_left =
-        static_cast<int16_t*>(malloc(maxLen / 2 * sizeof(int16_t)));
-    int16_t* out_right =
-        static_cast<int16_t*>(malloc(maxLen / 2 * sizeof(int16_t)));
-    int res = 0;
-    for (size_t i = 0; i < lengthIn; i += 2) {
-      left[i >> 1] = samplesIn[i];
-      right[i >> 1] = samplesIn[i + 1];
-    }
-
-    // It's OK to overwrite the local parameter, since it's just a copy
-    lengthIn = lengthIn / 2;
-
-    size_t actualOutLen_left = 0;
-    size_t actualOutLen_right = 0;
-    // Do resampling for right channel
-    res |= slave_left_->Push(left, lengthIn, out_left, maxLen / 2,
-                             actualOutLen_left);
-    res |= slave_right_->Push(right, lengthIn, out_right, maxLen / 2,
-                              actualOutLen_right);
-    if (res || (actualOutLen_left != actualOutLen_right)) {
-      free(left);
-      free(right);
-      free(out_left);
-      free(out_right);
-      return -1;
-    }
-
-    // Reassemble the signal
-    for (size_t i = 0; i < actualOutLen_left; i++) {
-      samplesOut[i * 2] = out_left[i];
-      samplesOut[i * 2 + 1] = out_right[i];
-    }
-    outLen = 2 * actualOutLen_left;
-
-    free(left);
-    free(right);
-    free(out_left);
-    free(out_right);
-
-    return 0;
-  }
-
-  // Containers for temp samples
-  int16_t* tmp;
-  int16_t* tmp_2;
-  // tmp data for resampling routines
-  int32_t* tmp_mem;
-
-  switch (my_mode_) {
-    case kResamplerMode1To1:
-      memcpy(samplesOut, samplesIn, lengthIn * sizeof(int16_t));
-      outLen = lengthIn;
-      break;
-    case kResamplerMode1To2:
-      if (maxLen < (lengthIn * 2)) {
-        return -1;
-      }
-      WebRtcSpl_UpsampleBy2(samplesIn, lengthIn, samplesOut,
-                            static_cast<int32_t*>(state1_));
-      outLen = lengthIn * 2;
-      return 0;
-    case kResamplerMode1To3:
-
-      // We can only handle blocks of 160 samples
-      // Can be fixed, but I don't think it's needed
-      if ((lengthIn % 160) != 0) {
-        return -1;
-      }
-      if (maxLen < (lengthIn * 3)) {
-        return -1;
-      }
-      tmp_mem = static_cast<int32_t*>(malloc(336 * sizeof(int32_t)));
-
-      for (size_t i = 0; i < lengthIn; i += 160) {
-        WebRtcSpl_Resample16khzTo48khz(
-            samplesIn + i, samplesOut + i * 3,
-            static_cast<WebRtcSpl_State16khzTo48khz*>(state1_), tmp_mem);
-      }
-      outLen = lengthIn * 3;
-      free(tmp_mem);
-      return 0;
-    case kResamplerMode1To4:
-      if (maxLen < (lengthIn * 4)) {
-        return -1;
-      }
-
-      tmp = static_cast<int16_t*>(malloc(sizeof(int16_t) * 2 * lengthIn));
-      // 1:2
-      WebRtcSpl_UpsampleBy2(samplesIn, lengthIn, tmp,
-                            static_cast<int32_t*>(state1_));
-      // 2:4
-      WebRtcSpl_UpsampleBy2(tmp, lengthIn * 2, samplesOut,
-                            static_cast<int32_t*>(state2_));
-      outLen = lengthIn * 4;
-      free(tmp);
-      return 0;
-    case kResamplerMode1To6:
-      // We can only handle blocks of 80 samples
-      // Can be fixed, but I don't think it's needed
-      if ((lengthIn % 80) != 0) {
-        return -1;
-      }
-      if (maxLen < (lengthIn * 6)) {
-        return -1;
-      }
-
-      // 1:2
-
-      tmp_mem = static_cast<int32_t*>(malloc(336 * sizeof(int32_t)));
-      tmp = static_cast<int16_t*>(malloc(sizeof(int16_t) * 2 * lengthIn));
-
-      WebRtcSpl_UpsampleBy2(samplesIn, lengthIn, tmp,
-                            static_cast<int32_t*>(state1_));
-      outLen = lengthIn * 2;
-
-      for (size_t i = 0; i < outLen; i += 160) {
-        WebRtcSpl_Resample16khzTo48khz(
-            tmp + i, samplesOut + i * 3,
-            static_cast<WebRtcSpl_State16khzTo48khz*>(state2_), tmp_mem);
-      }
-      outLen = outLen * 3;
-      free(tmp_mem);
-      free(tmp);
-
-      return 0;
-    case kResamplerMode1To12:
-      // We can only handle blocks of 40 samples
-      // Can be fixed, but I don't think it's needed
-      if ((lengthIn % 40) != 0) {
-        return -1;
-      }
-      if (maxLen < (lengthIn * 12)) {
-        return -1;
-      }
-
-      tmp_mem = static_cast<int32_t*>(malloc(336 * sizeof(int32_t)));
-      tmp = static_cast<int16_t*>(malloc(sizeof(int16_t) * 4 * lengthIn));
-      // 1:2
-      WebRtcSpl_UpsampleBy2(samplesIn, lengthIn, samplesOut,
-                            static_cast<int32_t*>(state1_));
-      outLen = lengthIn * 2;
-      // 2:4
-      WebRtcSpl_UpsampleBy2(samplesOut, outLen, tmp,
-                            static_cast<int32_t*>(state2_));
-      outLen = outLen * 2;
-      // 4:12
-      for (size_t i = 0; i < outLen; i += 160) {
-        // WebRtcSpl_Resample16khzTo48khz() takes a block of 160 samples
-        // as input and outputs a resampled block of 480 samples. The
-        // data is now actually in 32 kHz sampling rate, despite the
-        // function name, and with a resampling factor of three becomes
-        // 96 kHz.
-        WebRtcSpl_Resample16khzTo48khz(
-            tmp + i, samplesOut + i * 3,
-            static_cast<WebRtcSpl_State16khzTo48khz*>(state3_), tmp_mem);
-      }
-      outLen = outLen * 3;
-      free(tmp_mem);
-      free(tmp);
-
-      return 0;
-    case kResamplerMode2To3:
-      if (maxLen < (lengthIn * 3 / 2)) {
-        return -1;
-      }
-      // 2:6
-      // We can only handle blocks of 160 samples
-      // Can be fixed, but I don't think it's needed
-      if ((lengthIn % 160) != 0) {
-        return -1;
-      }
-      tmp = static_cast<int16_t*> (malloc(sizeof(int16_t) * lengthIn * 3));
-      tmp_mem = static_cast<int32_t*>(malloc(336 * sizeof(int32_t)));
-      for (size_t i = 0; i < lengthIn; i += 160) {
-        WebRtcSpl_Resample16khzTo48khz(
-            samplesIn + i, tmp + i * 3,
-            static_cast<WebRtcSpl_State16khzTo48khz*>(state1_), tmp_mem);
-      }
-      lengthIn = lengthIn * 3;
-      // 6:3
-      WebRtcSpl_DownsampleBy2(tmp, lengthIn, samplesOut,
-                              static_cast<int32_t*>(state2_));
-      outLen = lengthIn / 2;
-      free(tmp);
-      free(tmp_mem);
-      return 0;
-    case kResamplerMode2To11:
-
-      // We can only handle blocks of 80 samples
-      // Can be fixed, but I don't think it's needed
-      if ((lengthIn % 80) != 0) {
-        return -1;
-      }
-      if (maxLen < ((lengthIn * 11) / 2)) {
-        return -1;
-      }
-      tmp = static_cast<int16_t*>(malloc(sizeof(int16_t) * 2 * lengthIn));
-      // 1:2
-      WebRtcSpl_UpsampleBy2(samplesIn, lengthIn, tmp,
-                            static_cast<int32_t*>(state1_));
-      lengthIn *= 2;
-
-      tmp_mem = static_cast<int32_t*>(malloc(98 * sizeof(int32_t)));
-
-      for (size_t i = 0; i < lengthIn; i += 80) {
-        WebRtcSpl_Resample8khzTo22khz(
-            tmp + i, samplesOut + (i * 11) / 4,
-            static_cast<WebRtcSpl_State8khzTo22khz*>(state2_), tmp_mem);
-      }
-      outLen = (lengthIn * 11) / 4;
-      free(tmp_mem);
-      free(tmp);
-      return 0;
-    case kResamplerMode4To11:
-
-      // We can only handle blocks of 80 samples
-      // Can be fixed, but I don't think it's needed
-      if ((lengthIn % 80) != 0) {
-        return -1;
-      }
-      if (maxLen < ((lengthIn * 11) / 4)) {
-        return -1;
-      }
-      tmp_mem = static_cast<int32_t*>(malloc(98 * sizeof(int32_t)));
-
-      for (size_t i = 0; i < lengthIn; i += 80) {
-        WebRtcSpl_Resample8khzTo22khz(
-            samplesIn + i, samplesOut + (i * 11) / 4,
-            static_cast<WebRtcSpl_State8khzTo22khz*>(state1_), tmp_mem);
-      }
-      outLen = (lengthIn * 11) / 4;
-      free(tmp_mem);
-      return 0;
-    case kResamplerMode8To11:
-      // We can only handle blocks of 160 samples
-      // Can be fixed, but I don't think it's needed
-      if ((lengthIn % 160) != 0) {
-        return -1;
-      }
-      if (maxLen < ((lengthIn * 11) / 8)) {
-        return -1;
-      }
-      tmp_mem = static_cast<int32_t*>(malloc(88 * sizeof(int32_t)));
-
-      for (size_t i = 0; i < lengthIn; i += 160) {
-        WebRtcSpl_Resample16khzTo22khz(
-            samplesIn + i, samplesOut + (i * 11) / 8,
-            static_cast<WebRtcSpl_State16khzTo22khz*>(state1_), tmp_mem);
-      }
-      outLen = (lengthIn * 11) / 8;
-      free(tmp_mem);
-      return 0;
-
-    case kResamplerMode11To16:
-      // We can only handle blocks of 110 samples
-      if ((lengthIn % 110) != 0) {
-        return -1;
-      }
-      if (maxLen < ((lengthIn * 16) / 11)) {
-        return -1;
-      }
-
-      tmp_mem = static_cast<int32_t*>(malloc(104 * sizeof(int32_t)));
-      tmp = static_cast<int16_t*>(malloc((sizeof(int16_t) * lengthIn * 2)));
-
-      WebRtcSpl_UpsampleBy2(samplesIn, lengthIn, tmp,
-                            static_cast<int32_t*>(state1_));
-
-      for (size_t i = 0; i < (lengthIn * 2); i += 220) {
-        WebRtcSpl_Resample22khzTo16khz(
-            tmp + i, samplesOut + (i / 220) * 160,
-            static_cast<WebRtcSpl_State22khzTo16khz*>(state2_), tmp_mem);
-      }
-
-      outLen = (lengthIn * 16) / 11;
-
-      free(tmp_mem);
-      free(tmp);
-      return 0;
-
-    case kResamplerMode11To32:
-
-      // We can only handle blocks of 110 samples
-      if ((lengthIn % 110) != 0) {
-        return -1;
-      }
-      if (maxLen < ((lengthIn * 32) / 11)) {
-        return -1;
-      }
-
-      tmp_mem = static_cast<int32_t*>(malloc(104 * sizeof(int32_t)));
-      tmp = static_cast<int16_t*>(malloc((sizeof(int16_t) * lengthIn * 2)));
-
-      // 11 -> 22 kHz in samplesOut
-      WebRtcSpl_UpsampleBy2(samplesIn, lengthIn, samplesOut,
-                            static_cast<int32_t*>(state1_));
-
-      // 22 -> 16 in tmp
-      for (size_t i = 0; i < (lengthIn * 2); i += 220) {
-        WebRtcSpl_Resample22khzTo16khz(
-            samplesOut + i, tmp + (i / 220) * 160,
-            static_cast<WebRtcSpl_State22khzTo16khz*>(state2_), tmp_mem);
-      }
-
-      // 16 -> 32 in samplesOut
-      WebRtcSpl_UpsampleBy2(tmp, (lengthIn * 16) / 11, samplesOut,
-                            static_cast<int32_t*>(state3_));
-
-      outLen = (lengthIn * 32) / 11;
-
-      free(tmp_mem);
-      free(tmp);
-      return 0;
-
-    case kResamplerMode2To1:
-      if (maxLen < (lengthIn / 2)) {
-        return -1;
-      }
-      WebRtcSpl_DownsampleBy2(samplesIn, lengthIn, samplesOut,
-                              static_cast<int32_t*>(state1_));
-      outLen = lengthIn / 2;
-      return 0;
-    case kResamplerMode3To1:
-      // We can only handle blocks of 480 samples
-      // Can be fixed, but I don't think it's needed
-      if ((lengthIn % 480) != 0) {
-        return -1;
-      }
-      if (maxLen < (lengthIn / 3)) {
-        return -1;
-      }
-      tmp_mem = static_cast<int32_t*>(malloc(496 * sizeof(int32_t)));
-
-      for (size_t i = 0; i < lengthIn; i += 480) {
-        WebRtcSpl_Resample48khzTo16khz(
-            samplesIn + i, samplesOut + i / 3,
-            static_cast<WebRtcSpl_State48khzTo16khz*>(state1_), tmp_mem);
-      }
-      outLen = lengthIn / 3;
-      free(tmp_mem);
-      return 0;
-    case kResamplerMode4To1:
-      if (maxLen < (lengthIn / 4)) {
-        return -1;
-      }
-      tmp = static_cast<int16_t*>(malloc(sizeof(int16_t) * lengthIn / 2));
-      // 4:2
-      WebRtcSpl_DownsampleBy2(samplesIn, lengthIn, tmp,
-                              static_cast<int32_t*>(state1_));
-      // 2:1
-      WebRtcSpl_DownsampleBy2(tmp, lengthIn / 2, samplesOut,
-                              static_cast<int32_t*>(state2_));
-      outLen = lengthIn / 4;
-      free(tmp);
-      return 0;
-
-    case kResamplerMode6To1:
-      // We can only handle blocks of 480 samples
-      // Can be fixed, but I don't think it's needed
-      if ((lengthIn % 480) != 0) {
-        return -1;
-      }
-      if (maxLen < (lengthIn / 6)) {
-        return -1;
-      }
-
-      tmp_mem = static_cast<int32_t*>(malloc(496 * sizeof(int32_t)));
-      tmp = static_cast<int16_t*>(malloc((sizeof(int16_t) * lengthIn) / 3));
-
-      for (size_t i = 0; i < lengthIn; i += 480) {
-        WebRtcSpl_Resample48khzTo16khz(
-            samplesIn + i, tmp + i / 3,
-            static_cast<WebRtcSpl_State48khzTo16khz*>(state1_), tmp_mem);
-      }
-      outLen = lengthIn / 3;
-      free(tmp_mem);
-      WebRtcSpl_DownsampleBy2(tmp, outLen, samplesOut,
-                              static_cast<int32_t*>(state2_));
-      free(tmp);
-      outLen = outLen / 2;
-      return 0;
-    case kResamplerMode12To1:
-      // We can only handle blocks of 480 samples
-      // Can be fixed, but I don't think it's needed
-      if ((lengthIn % 480) != 0) {
-        return -1;
-      }
-      if (maxLen < (lengthIn / 12)) {
-        return -1;
-      }
-
-      tmp_mem = static_cast<int32_t*>(malloc(496 * sizeof(int32_t)));
-      tmp = static_cast<int16_t*>(malloc((sizeof(int16_t) * lengthIn) / 3));
-      tmp_2 = static_cast<int16_t*>(malloc((sizeof(int16_t) * lengthIn) / 6));
-      // 12:4
-      for (size_t i = 0; i < lengthIn; i += 480) {
-        // WebRtcSpl_Resample48khzTo16khz() takes a block of 480 samples
-        // as input and outputs a resampled block of 160 samples. The
-        // data is now actually in 96 kHz sampling rate, despite the
-        // function name, and with a resampling factor of 1/3 becomes
-        // 32 kHz.
-        WebRtcSpl_Resample48khzTo16khz(
-            samplesIn + i, tmp + i / 3,
-            static_cast<WebRtcSpl_State48khzTo16khz*>(state1_), tmp_mem);
-      }
-      outLen = lengthIn / 3;
-      free(tmp_mem);
-      // 4:2
-      WebRtcSpl_DownsampleBy2(tmp, outLen, tmp_2,
-                              static_cast<int32_t*>(state2_));
-      outLen = outLen / 2;
-      free(tmp);
-      // 2:1
-      WebRtcSpl_DownsampleBy2(tmp_2, outLen, samplesOut,
-                              static_cast<int32_t*>(state3_));
-      free(tmp_2);
-      outLen = outLen / 2;
-      return 0;
-    case kResamplerMode3To2:
-      if (maxLen < (lengthIn * 2 / 3)) {
-        return -1;
-      }
-      // 3:6
-      tmp = static_cast<int16_t*> (malloc(sizeof(int16_t) * lengthIn * 2));
-      WebRtcSpl_UpsampleBy2(samplesIn, lengthIn, tmp,
-                            static_cast<int32_t*>(state1_));
-      lengthIn *= 2;
-      // 6:2
-      // We can only handle blocks of 480 samples
-      // Can be fixed, but I don't think it's needed
-      if ((lengthIn % 480) != 0) {
-        free(tmp);
-        return -1;
-      }
-      tmp_mem = static_cast<int32_t*>(malloc(496 * sizeof(int32_t)));
-      for (size_t i = 0; i < lengthIn; i += 480) {
-        WebRtcSpl_Resample48khzTo16khz(
-            tmp + i, samplesOut + i / 3,
-            static_cast<WebRtcSpl_State48khzTo16khz*>(state2_), tmp_mem);
-      }
-      outLen = lengthIn / 3;
-      free(tmp);
-      free(tmp_mem);
-      return 0;
-    case kResamplerMode11To2:
-      // We can only handle blocks of 220 samples
-      // Can be fixed, but I don't think it's needed
-      if ((lengthIn % 220) != 0) {
-        return -1;
-      }
-      if (maxLen < ((lengthIn * 2) / 11)) {
-        return -1;
-      }
-      tmp_mem = static_cast<int32_t*>(malloc(126 * sizeof(int32_t)));
-      tmp = static_cast<int16_t*>(
-          malloc((lengthIn * 4) / 11 * sizeof(int16_t)));
-
-      for (size_t i = 0; i < lengthIn; i += 220) {
-        WebRtcSpl_Resample22khzTo8khz(
-            samplesIn + i, tmp + (i * 4) / 11,
-            static_cast<WebRtcSpl_State22khzTo8khz*>(state1_), tmp_mem);
-      }
-      lengthIn = (lengthIn * 4) / 11;
-
-      WebRtcSpl_DownsampleBy2(tmp, lengthIn, samplesOut,
-                              static_cast<int32_t*>(state2_));
-      outLen = lengthIn / 2;
-
-      free(tmp_mem);
-      free(tmp);
-      return 0;
-    case kResamplerMode11To4:
-      // We can only handle blocks of 220 samples
-      // Can be fixed, but I don't think it's needed
-      if ((lengthIn % 220) != 0) {
-        return -1;
-      }
-      if (maxLen < ((lengthIn * 4) / 11)) {
-        return -1;
-      }
-      tmp_mem = static_cast<int32_t*>(malloc(126 * sizeof(int32_t)));
-
-      for (size_t i = 0; i < lengthIn; i += 220) {
-        WebRtcSpl_Resample22khzTo8khz(
-            samplesIn + i, samplesOut + (i * 4) / 11,
-            static_cast<WebRtcSpl_State22khzTo8khz*>(state1_), tmp_mem);
-      }
-      outLen = (lengthIn * 4) / 11;
-      free(tmp_mem);
-      return 0;
-    case kResamplerMode11To8:
-      // We can only handle blocks of 160 samples
-      // Can be fixed, but I don't think it's needed
-      if ((lengthIn % 220) != 0) {
-        return -1;
-      }
-      if (maxLen < ((lengthIn * 8) / 11)) {
-        return -1;
-      }
-      tmp_mem = static_cast<int32_t*>(malloc(104 * sizeof(int32_t)));
-
-      for (size_t i = 0; i < lengthIn; i += 220) {
-        WebRtcSpl_Resample22khzTo16khz(
-            samplesIn + i, samplesOut + (i * 8) / 11,
-            static_cast<WebRtcSpl_State22khzTo16khz*>(state1_), tmp_mem);
-      }
-      outLen = (lengthIn * 8) / 11;
-      free(tmp_mem);
-      return 0;
-      break;
-  }
-  return 0;
-}
-
-}  // namespace webrtc
diff --git a/common_audio/resampler/resampler_unittest.cc b/common_audio/resampler/resampler_unittest.cc
deleted file mode 100644
index 4f50363..0000000
--- a/common_audio/resampler/resampler_unittest.cc
+++ /dev/null
@@ -1,138 +0,0 @@
-/*
- *  Copyright (c) 2011 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/common_audio/resampler/include/resampler.h"
-#include "webrtc/test/gtest.h"
-
-// TODO(andrew): this is a work-in-progress. Many more tests are needed.
-
-namespace webrtc {
-namespace {
-
-const int kNumChannels[] = {1, 2};
-const size_t kNumChannelsSize = sizeof(kNumChannels) / sizeof(*kNumChannels);
-
-// Rates we must support.
-const int kMaxRate = 96000;
-const int kRates[] = {
-  8000,
-  16000,
-  32000,
-  44000,
-  48000,
-  kMaxRate
-};
-const size_t kRatesSize = sizeof(kRates) / sizeof(*kRates);
-const int kMaxChannels = 2;
-const size_t kDataSize = static_cast<size_t> (kMaxChannels * kMaxRate / 100);
-
-// TODO(andrew): should we be supporting these combinations?
-bool ValidRates(int in_rate, int out_rate) {
-  // Not the most compact notation, for clarity.
-  if ((in_rate == 44000 && (out_rate == 48000 || out_rate == 96000)) ||
-      (out_rate == 44000 && (in_rate == 48000 || in_rate == 96000))) {
-    return false;
-  }
-
-  return true;
-}
-
-class ResamplerTest : public testing::Test {
- protected:
-  ResamplerTest();
-  virtual void SetUp();
-  virtual void TearDown();
-
-  Resampler rs_;
-  int16_t data_in_[kDataSize];
-  int16_t data_out_[kDataSize];
-};
-
-ResamplerTest::ResamplerTest() {}
-
-void ResamplerTest::SetUp() {
-  // Initialize input data with anything. The tests are content independent.
-  memset(data_in_, 1, sizeof(data_in_));
-}
-
-void ResamplerTest::TearDown() {}
-
-TEST_F(ResamplerTest, Reset) {
-  // The only failure mode for the constructor is if Reset() fails. For the
-  // time being then (until an Init function is added), we rely on Reset()
-  // to test the constructor.
-
-  // Check that all required combinations are supported.
-  for (size_t i = 0; i < kRatesSize; ++i) {
-    for (size_t j = 0; j < kRatesSize; ++j) {
-      for (size_t k = 0; k < kNumChannelsSize; ++k) {
-        std::ostringstream ss;
-        ss << "Input rate: " << kRates[i] << ", output rate: " << kRates[j]
-            << ", channels: " << kNumChannels[k];
-        SCOPED_TRACE(ss.str());
-        if (ValidRates(kRates[i], kRates[j]))
-          EXPECT_EQ(0, rs_.Reset(kRates[i], kRates[j], kNumChannels[k]));
-        else
-          EXPECT_EQ(-1, rs_.Reset(kRates[i], kRates[j], kNumChannels[k]));
-      }
-    }
-  }
-}
-
-// TODO(tlegrand): Replace code inside the two tests below with a function
-// with number of channels and ResamplerType as input.
-TEST_F(ResamplerTest, Mono) {
-  const int kChannels = 1;
-  for (size_t i = 0; i < kRatesSize; ++i) {
-    for (size_t j = 0; j < kRatesSize; ++j) {
-      std::ostringstream ss;
-      ss << "Input rate: " << kRates[i] << ", output rate: " << kRates[j];
-      SCOPED_TRACE(ss.str());
-
-      if (ValidRates(kRates[i], kRates[j])) {
-        size_t in_length = static_cast<size_t>(kRates[i] / 100);
-        size_t out_length = 0;
-        EXPECT_EQ(0, rs_.Reset(kRates[i], kRates[j], kChannels));
-        EXPECT_EQ(0, rs_.Push(data_in_, in_length, data_out_, kDataSize,
-                              out_length));
-        EXPECT_EQ(static_cast<size_t>(kRates[j] / 100), out_length);
-      } else {
-        EXPECT_EQ(-1, rs_.Reset(kRates[i], kRates[j], kChannels));
-      }
-    }
-  }
-}
-
-TEST_F(ResamplerTest, Stereo) {
-  const int kChannels = 2;
-  for (size_t i = 0; i < kRatesSize; ++i) {
-    for (size_t j = 0; j < kRatesSize; ++j) {
-      std::ostringstream ss;
-      ss << "Input rate: " << kRates[i] << ", output rate: " << kRates[j];
-      SCOPED_TRACE(ss.str());
-
-      if (ValidRates(kRates[i], kRates[j])) {
-        size_t in_length = static_cast<size_t>(kChannels * kRates[i] / 100);
-        size_t out_length = 0;
-        EXPECT_EQ(0, rs_.Reset(kRates[i], kRates[j],
-                               kChannels));
-        EXPECT_EQ(0, rs_.Push(data_in_, in_length, data_out_, kDataSize,
-                              out_length));
-        EXPECT_EQ(static_cast<size_t>(kChannels * kRates[j] / 100), out_length);
-      } else {
-        EXPECT_EQ(-1, rs_.Reset(kRates[i], kRates[j],
-                                kChannels));
-      }
-    }
-  }
-}
-
-}  // namespace
-}  // namespace webrtc
diff --git a/common_audio/resampler/sinc_resampler.cc b/common_audio/resampler/sinc_resampler.cc
deleted file mode 100644
index acf7d0f..0000000
--- a/common_audio/resampler/sinc_resampler.cc
+++ /dev/null
@@ -1,374 +0,0 @@
-/*
- *  Copyright (c) 2013 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.
- */
-
-// Modified from the Chromium original:
-// src/media/base/sinc_resampler.cc
-
-// Initial input buffer layout, dividing into regions r0_ to r4_ (note: r0_, r3_
-// and r4_ will move after the first load):
-//
-// |----------------|-----------------------------------------|----------------|
-//
-//                                        request_frames_
-//                   <--------------------------------------------------------->
-//                                    r0_ (during first load)
-//
-//  kKernelSize / 2   kKernelSize / 2         kKernelSize / 2   kKernelSize / 2
-// <---------------> <--------------->       <---------------> <--------------->
-//        r1_               r2_                     r3_               r4_
-//
-//                             block_size_ == r4_ - r2_
-//                   <--------------------------------------->
-//
-//                                                  request_frames_
-//                                    <------------------ ... ----------------->
-//                                               r0_ (during second load)
-//
-// On the second request r0_ slides to the right by kKernelSize / 2 and r3_, r4_
-// and block_size_ are reinitialized via step (3) in the algorithm below.
-//
-// These new regions remain constant until a Flush() occurs.  While complicated,
-// this allows us to reduce jitter by always requesting the same amount from the
-// provided callback.
-//
-// The algorithm:
-//
-// 1) Allocate input_buffer of size: request_frames_ + kKernelSize; this ensures
-//    there's enough room to read request_frames_ from the callback into region
-//    r0_ (which will move between the first and subsequent passes).
-//
-// 2) Let r1_, r2_ each represent half the kernel centered around r0_:
-//
-//        r0_ = input_buffer_ + kKernelSize / 2
-//        r1_ = input_buffer_
-//        r2_ = r0_
-//
-//    r0_ is always request_frames_ in size.  r1_, r2_ are kKernelSize / 2 in
-//    size.  r1_ must be zero initialized to avoid convolution with garbage (see
-//    step (5) for why).
-//
-// 3) Let r3_, r4_ each represent half the kernel right aligned with the end of
-//    r0_ and choose block_size_ as the distance in frames between r4_ and r2_:
-//
-//        r3_ = r0_ + request_frames_ - kKernelSize
-//        r4_ = r0_ + request_frames_ - kKernelSize / 2
-//        block_size_ = r4_ - r2_ = request_frames_ - kKernelSize / 2
-//
-// 4) Consume request_frames_ frames into r0_.
-//
-// 5) Position kernel centered at start of r2_ and generate output frames until
-//    the kernel is centered at the start of r4_ or we've finished generating
-//    all the output frames.
-//
-// 6) Wrap left over data from the r3_ to r1_ and r4_ to r2_.
-//
-// 7) If we're on the second load, in order to avoid overwriting the frames we
-//    just wrapped from r4_ we need to slide r0_ to the right by the size of
-//    r4_, which is kKernelSize / 2:
-//
-//        r0_ = r0_ + kKernelSize / 2 = input_buffer_ + kKernelSize
-//
-//    r3_, r4_, and block_size_ then need to be reinitialized, so goto (3).
-//
-// 8) Else, if we're not on the second load, goto (4).
-//
-// Note: we're glossing over how the sub-sample handling works with
-// |virtual_source_idx_|, etc.
-
-// MSVC++ requires this to be set before any other includes to get M_PI.
-#define _USE_MATH_DEFINES
-
-#include "webrtc/common_audio/resampler/sinc_resampler.h"
-
-#include <math.h>
-#include <string.h>
-
-#include <limits>
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/system_wrappers/include/cpu_features_wrapper.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-namespace {
-
-double SincScaleFactor(double io_ratio) {
-  // |sinc_scale_factor| is basically the normalized cutoff frequency of the
-  // low-pass filter.
-  double sinc_scale_factor = io_ratio > 1.0 ? 1.0 / io_ratio : 1.0;
-
-  // The sinc function is an idealized brick-wall filter, but since we're
-  // windowing it the transition from pass to stop does not happen right away.
-  // So we should adjust the low pass filter cutoff slightly downward to avoid
-  // some aliasing at the very high-end.
-  // TODO(crogers): this value is empirical and to be more exact should vary
-  // depending on kKernelSize.
-  sinc_scale_factor *= 0.9;
-
-  return sinc_scale_factor;
-}
-
-}  // namespace
-
-const size_t SincResampler::kKernelSize;
-
-// If we know the minimum architecture at compile time, avoid CPU detection.
-#if defined(WEBRTC_ARCH_X86_FAMILY)
-#if defined(__SSE2__)
-#define CONVOLVE_FUNC Convolve_SSE
-void SincResampler::InitializeCPUSpecificFeatures() {}
-#else
-// x86 CPU detection required.  Function will be set by
-// InitializeCPUSpecificFeatures().
-// TODO(dalecurtis): Once Chrome moves to an SSE baseline this can be removed.
-#define CONVOLVE_FUNC convolve_proc_
-
-void SincResampler::InitializeCPUSpecificFeatures() {
-  convolve_proc_ = WebRtc_GetCPUInfo(kSSE2) ? Convolve_SSE : Convolve_C;
-}
-#endif
-#elif defined(WEBRTC_HAS_NEON)
-#define CONVOLVE_FUNC Convolve_NEON
-void SincResampler::InitializeCPUSpecificFeatures() {}
-#else
-// Unknown architecture.
-#define CONVOLVE_FUNC Convolve_C
-void SincResampler::InitializeCPUSpecificFeatures() {}
-#endif
-
-SincResampler::SincResampler(double io_sample_rate_ratio,
-                             size_t request_frames,
-                             SincResamplerCallback* read_cb)
-    : io_sample_rate_ratio_(io_sample_rate_ratio),
-      read_cb_(read_cb),
-      request_frames_(request_frames),
-      input_buffer_size_(request_frames_ + kKernelSize),
-      // Create input buffers with a 16-byte alignment for SSE optimizations.
-      kernel_storage_(static_cast<float*>(
-          AlignedMalloc(sizeof(float) * kKernelStorageSize, 16))),
-      kernel_pre_sinc_storage_(static_cast<float*>(
-          AlignedMalloc(sizeof(float) * kKernelStorageSize, 16))),
-      kernel_window_storage_(static_cast<float*>(
-          AlignedMalloc(sizeof(float) * kKernelStorageSize, 16))),
-      input_buffer_(static_cast<float*>(
-          AlignedMalloc(sizeof(float) * input_buffer_size_, 16))),
-#if defined(WEBRTC_CPU_DETECTION)
-      convolve_proc_(nullptr),
-#endif
-      r1_(input_buffer_.get()),
-      r2_(input_buffer_.get() + kKernelSize / 2) {
-#if defined(WEBRTC_CPU_DETECTION)
-  InitializeCPUSpecificFeatures();
-  RTC_DCHECK(convolve_proc_);
-#endif
-  RTC_DCHECK_GT(request_frames_, 0);
-  Flush();
-  RTC_DCHECK_GT(block_size_, kKernelSize);
-
-  memset(kernel_storage_.get(), 0,
-         sizeof(*kernel_storage_.get()) * kKernelStorageSize);
-  memset(kernel_pre_sinc_storage_.get(), 0,
-         sizeof(*kernel_pre_sinc_storage_.get()) * kKernelStorageSize);
-  memset(kernel_window_storage_.get(), 0,
-         sizeof(*kernel_window_storage_.get()) * kKernelStorageSize);
-
-  InitializeKernel();
-}
-
-SincResampler::~SincResampler() {}
-
-void SincResampler::UpdateRegions(bool second_load) {
-  // Setup various region pointers in the buffer (see diagram above).  If we're
-  // on the second load we need to slide r0_ to the right by kKernelSize / 2.
-  r0_ = input_buffer_.get() + (second_load ? kKernelSize : kKernelSize / 2);
-  r3_ = r0_ + request_frames_ - kKernelSize;
-  r4_ = r0_ + request_frames_ - kKernelSize / 2;
-  block_size_ = r4_ - r2_;
-
-  // r1_ at the beginning of the buffer.
-  RTC_DCHECK_EQ(r1_, input_buffer_.get());
-  // r1_ left of r2_, r4_ left of r3_ and size correct.
-  RTC_DCHECK_EQ(r2_ - r1_, r4_ - r3_);
-  // r2_ left of r3.
-  RTC_DCHECK_LT(r2_, r3_);
-}
-
-void SincResampler::InitializeKernel() {
-  // Blackman window parameters.
-  static const double kAlpha = 0.16;
-  static const double kA0 = 0.5 * (1.0 - kAlpha);
-  static const double kA1 = 0.5;
-  static const double kA2 = 0.5 * kAlpha;
-
-  // Generates a set of windowed sinc() kernels.
-  // We generate a range of sub-sample offsets from 0.0 to 1.0.
-  const double sinc_scale_factor = SincScaleFactor(io_sample_rate_ratio_);
-  for (size_t offset_idx = 0; offset_idx <= kKernelOffsetCount; ++offset_idx) {
-    const float subsample_offset =
-        static_cast<float>(offset_idx) / kKernelOffsetCount;
-
-    for (size_t i = 0; i < kKernelSize; ++i) {
-      const size_t idx = i + offset_idx * kKernelSize;
-      const float pre_sinc = static_cast<float>(M_PI *
-          (static_cast<int>(i) - static_cast<int>(kKernelSize / 2) -
-           subsample_offset));
-      kernel_pre_sinc_storage_[idx] = pre_sinc;
-
-      // Compute Blackman window, matching the offset of the sinc().
-      const float x = (i - subsample_offset) / kKernelSize;
-      const float window = static_cast<float>(kA0 - kA1 * cos(2.0 * M_PI * x) +
-          kA2 * cos(4.0 * M_PI * x));
-      kernel_window_storage_[idx] = window;
-
-      // Compute the sinc with offset, then window the sinc() function and store
-      // at the correct offset.
-      kernel_storage_[idx] = static_cast<float>(window *
-          ((pre_sinc == 0) ?
-              sinc_scale_factor :
-              (sin(sinc_scale_factor * pre_sinc) / pre_sinc)));
-    }
-  }
-}
-
-void SincResampler::SetRatio(double io_sample_rate_ratio) {
-  if (fabs(io_sample_rate_ratio_ - io_sample_rate_ratio) <
-      std::numeric_limits<double>::epsilon()) {
-    return;
-  }
-
-  io_sample_rate_ratio_ = io_sample_rate_ratio;
-
-  // Optimize reinitialization by reusing values which are independent of
-  // |sinc_scale_factor|.  Provides a 3x speedup.
-  const double sinc_scale_factor = SincScaleFactor(io_sample_rate_ratio_);
-  for (size_t offset_idx = 0; offset_idx <= kKernelOffsetCount; ++offset_idx) {
-    for (size_t i = 0; i < kKernelSize; ++i) {
-      const size_t idx = i + offset_idx * kKernelSize;
-      const float window = kernel_window_storage_[idx];
-      const float pre_sinc = kernel_pre_sinc_storage_[idx];
-
-      kernel_storage_[idx] = static_cast<float>(window *
-          ((pre_sinc == 0) ?
-              sinc_scale_factor :
-              (sin(sinc_scale_factor * pre_sinc) / pre_sinc)));
-    }
-  }
-}
-
-void SincResampler::Resample(size_t frames, float* destination) {
-  size_t remaining_frames = frames;
-
-  // Step (1) -- Prime the input buffer at the start of the input stream.
-  if (!buffer_primed_ && remaining_frames) {
-    read_cb_->Run(request_frames_, r0_);
-    buffer_primed_ = true;
-  }
-
-  // Step (2) -- Resample!  const what we can outside of the loop for speed.  It
-  // actually has an impact on ARM performance.  See inner loop comment below.
-  const double current_io_ratio = io_sample_rate_ratio_;
-  const float* const kernel_ptr = kernel_storage_.get();
-  while (remaining_frames) {
-    // |i| may be negative if the last Resample() call ended on an iteration
-    // that put |virtual_source_idx_| over the limit.
-    //
-    // Note: The loop construct here can severely impact performance on ARM
-    // or when built with clang.  See https://codereview.chromium.org/18566009/
-    for (int i = static_cast<int>(
-             ceil((block_size_ - virtual_source_idx_) / current_io_ratio));
-         i > 0; --i) {
-      RTC_DCHECK_LT(virtual_source_idx_, block_size_);
-
-      // |virtual_source_idx_| lies in between two kernel offsets so figure out
-      // what they are.
-      const int source_idx = static_cast<int>(virtual_source_idx_);
-      const double subsample_remainder = virtual_source_idx_ - source_idx;
-
-      const double virtual_offset_idx =
-          subsample_remainder * kKernelOffsetCount;
-      const int offset_idx = static_cast<int>(virtual_offset_idx);
-
-      // We'll compute "convolutions" for the two kernels which straddle
-      // |virtual_source_idx_|.
-      const float* const k1 = kernel_ptr + offset_idx * kKernelSize;
-      const float* const k2 = k1 + kKernelSize;
-
-      // Ensure |k1|, |k2| are 16-byte aligned for SIMD usage.  Should always be
-      // true so long as kKernelSize is a multiple of 16.
-      RTC_DCHECK_EQ(0, reinterpret_cast<uintptr_t>(k1) % 16);
-      RTC_DCHECK_EQ(0, reinterpret_cast<uintptr_t>(k2) % 16);
-
-      // Initialize input pointer based on quantized |virtual_source_idx_|.
-      const float* const input_ptr = r1_ + source_idx;
-
-      // Figure out how much to weight each kernel's "convolution".
-      const double kernel_interpolation_factor =
-          virtual_offset_idx - offset_idx;
-      *destination++ = CONVOLVE_FUNC(
-          input_ptr, k1, k2, kernel_interpolation_factor);
-
-      // Advance the virtual index.
-      virtual_source_idx_ += current_io_ratio;
-
-      if (!--remaining_frames)
-        return;
-    }
-
-    // Wrap back around to the start.
-    virtual_source_idx_ -= block_size_;
-
-    // Step (3) -- Copy r3_, r4_ to r1_, r2_.
-    // This wraps the last input frames back to the start of the buffer.
-    memcpy(r1_, r3_, sizeof(*input_buffer_.get()) * kKernelSize);
-
-    // Step (4) -- Reinitialize regions if necessary.
-    if (r0_ == r2_)
-      UpdateRegions(true);
-
-    // Step (5) -- Refresh the buffer with more input.
-    read_cb_->Run(request_frames_, r0_);
-  }
-}
-
-#undef CONVOLVE_FUNC
-
-size_t SincResampler::ChunkSize() const {
-  return static_cast<size_t>(block_size_ / io_sample_rate_ratio_);
-}
-
-void SincResampler::Flush() {
-  virtual_source_idx_ = 0;
-  buffer_primed_ = false;
-  memset(input_buffer_.get(), 0,
-         sizeof(*input_buffer_.get()) * input_buffer_size_);
-  UpdateRegions(false);
-}
-
-float SincResampler::Convolve_C(const float* input_ptr, const float* k1,
-                                const float* k2,
-                                double kernel_interpolation_factor) {
-  float sum1 = 0;
-  float sum2 = 0;
-
-  // Generate a single output sample.  Unrolling this loop hurt performance in
-  // local testing.
-  size_t n = kKernelSize;
-  while (n--) {
-    sum1 += *input_ptr * *k1++;
-    sum2 += *input_ptr++ * *k2++;
-  }
-
-  // Linearly interpolate the two "convolutions".
-  return static_cast<float>((1.0 - kernel_interpolation_factor) * sum1 +
-      kernel_interpolation_factor * sum2);
-}
-
-}  // namespace webrtc
diff --git a/common_audio/resampler/sinc_resampler.h b/common_audio/resampler/sinc_resampler.h
deleted file mode 100644
index fa92163..0000000
--- a/common_audio/resampler/sinc_resampler.h
+++ /dev/null
@@ -1,171 +0,0 @@
-/*
- *  Copyright (c) 2013 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.
- */
-
-// Modified from the Chromium original here:
-// src/media/base/sinc_resampler.h
-
-#ifndef WEBRTC_COMMON_AUDIO_RESAMPLER_SINC_RESAMPLER_H_
-#define WEBRTC_COMMON_AUDIO_RESAMPLER_SINC_RESAMPLER_H_
-
-#include <memory>
-
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/gtest_prod_util.h"
-#include "webrtc/system_wrappers/include/aligned_malloc.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-// Callback class for providing more data into the resampler.  Expects |frames|
-// of data to be rendered into |destination|; zero padded if not enough frames
-// are available to satisfy the request.
-class SincResamplerCallback {
- public:
-  virtual ~SincResamplerCallback() {}
-  virtual void Run(size_t frames, float* destination) = 0;
-};
-
-// SincResampler is a high-quality single-channel sample-rate converter.
-class SincResampler {
- public:
-  // The kernel size can be adjusted for quality (higher is better) at the
-  // expense of performance.  Must be a multiple of 32.
-  // TODO(dalecurtis): Test performance to see if we can jack this up to 64+.
-  static const size_t kKernelSize = 32;
-
-  // Default request size.  Affects how often and for how much SincResampler
-  // calls back for input.  Must be greater than kKernelSize.
-  static const size_t kDefaultRequestSize = 512;
-
-  // The kernel offset count is used for interpolation and is the number of
-  // sub-sample kernel shifts.  Can be adjusted for quality (higher is better)
-  // at the expense of allocating more memory.
-  static const size_t kKernelOffsetCount = 32;
-  static const size_t kKernelStorageSize =
-      kKernelSize * (kKernelOffsetCount + 1);
-
-  // Constructs a SincResampler with the specified |read_cb|, which is used to
-  // acquire audio data for resampling.  |io_sample_rate_ratio| is the ratio
-  // of input / output sample rates.  |request_frames| controls the size in
-  // frames of the buffer requested by each |read_cb| call.  The value must be
-  // greater than kKernelSize.  Specify kDefaultRequestSize if there are no
-  // request size constraints.
-  SincResampler(double io_sample_rate_ratio,
-                size_t request_frames,
-                SincResamplerCallback* read_cb);
-  virtual ~SincResampler();
-
-  // Resample |frames| of data from |read_cb_| into |destination|.
-  void Resample(size_t frames, float* destination);
-
-  // The maximum size in frames that guarantees Resample() will only make a
-  // single call to |read_cb_| for more data.
-  size_t ChunkSize() const;
-
-  size_t request_frames() const { return request_frames_; }
-
-  // Flush all buffered data and reset internal indices.  Not thread safe, do
-  // not call while Resample() is in progress.
-  void Flush();
-
-  // Update |io_sample_rate_ratio_|.  SetRatio() will cause a reconstruction of
-  // the kernels used for resampling.  Not thread safe, do not call while
-  // Resample() is in progress.
-  //
-  // TODO(ajm): Use this in PushSincResampler rather than reconstructing
-  // SincResampler.  We would also need a way to update |request_frames_|.
-  void SetRatio(double io_sample_rate_ratio);
-
-  float* get_kernel_for_testing() { return kernel_storage_.get(); }
-
- private:
-  FRIEND_TEST_ALL_PREFIXES(SincResamplerTest, Convolve);
-  FRIEND_TEST_ALL_PREFIXES(SincResamplerTest, ConvolveBenchmark);
-
-  void InitializeKernel();
-  void UpdateRegions(bool second_load);
-
-  // Selects runtime specific CPU features like SSE.  Must be called before
-  // using SincResampler.
-  // TODO(ajm): Currently managed by the class internally. See the note with
-  // |convolve_proc_| below.
-  void InitializeCPUSpecificFeatures();
-
-  // Compute convolution of |k1| and |k2| over |input_ptr|, resultant sums are
-  // linearly interpolated using |kernel_interpolation_factor|.  On x86 and ARM
-  // the underlying implementation is chosen at run time.
-  static float Convolve_C(const float* input_ptr, const float* k1,
-                          const float* k2, double kernel_interpolation_factor);
-#if defined(WEBRTC_ARCH_X86_FAMILY)
-  static float Convolve_SSE(const float* input_ptr, const float* k1,
-                            const float* k2,
-                            double kernel_interpolation_factor);
-#elif defined(WEBRTC_HAS_NEON)
-  static float Convolve_NEON(const float* input_ptr, const float* k1,
-                             const float* k2,
-                             double kernel_interpolation_factor);
-#endif
-
-  // The ratio of input / output sample rates.
-  double io_sample_rate_ratio_;
-
-  // An index on the source input buffer with sub-sample precision.  It must be
-  // double precision to avoid drift.
-  double virtual_source_idx_;
-
-  // The buffer is primed once at the very beginning of processing.
-  bool buffer_primed_;
-
-  // Source of data for resampling.
-  SincResamplerCallback* read_cb_;
-
-  // The size (in samples) to request from each |read_cb_| execution.
-  const size_t request_frames_;
-
-  // The number of source frames processed per pass.
-  size_t block_size_;
-
-  // The size (in samples) of the internal buffer used by the resampler.
-  const size_t input_buffer_size_;
-
-  // Contains kKernelOffsetCount kernels back-to-back, each of size kKernelSize.
-  // The kernel offsets are sub-sample shifts of a windowed sinc shifted from
-  // 0.0 to 1.0 sample.
-  std::unique_ptr<float[], AlignedFreeDeleter> kernel_storage_;
-  std::unique_ptr<float[], AlignedFreeDeleter> kernel_pre_sinc_storage_;
-  std::unique_ptr<float[], AlignedFreeDeleter> kernel_window_storage_;
-
-  // Data from the source is copied into this buffer for each processing pass.
-  std::unique_ptr<float[], AlignedFreeDeleter> input_buffer_;
-
-  // Stores the runtime selection of which Convolve function to use.
-  // TODO(ajm): Move to using a global static which must only be initialized
-  // once by the user. We're not doing this initially, because we don't have
-  // e.g. a LazyInstance helper in webrtc.
-#if defined(WEBRTC_CPU_DETECTION)
-  typedef float (*ConvolveProc)(const float*, const float*, const float*,
-                                double);
-  ConvolveProc convolve_proc_;
-#endif
-
-  // Pointers to the various regions inside |input_buffer_|.  See the diagram at
-  // the top of the .cc file for more information.
-  float* r0_;
-  float* const r1_;
-  float* const r2_;
-  float* r3_;
-  float* r4_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(SincResampler);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_COMMON_AUDIO_RESAMPLER_SINC_RESAMPLER_H_
diff --git a/common_audio/resampler/sinc_resampler_neon.cc b/common_audio/resampler/sinc_resampler_neon.cc
deleted file mode 100644
index e909a6c..0000000
--- a/common_audio/resampler/sinc_resampler_neon.cc
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- *  Copyright (c) 2013 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.
- */
-
-// Modified from the Chromium original:
-// src/media/base/sinc_resampler.cc
-
-#include "webrtc/common_audio/resampler/sinc_resampler.h"
-
-#include <arm_neon.h>
-
-namespace webrtc {
-
-float SincResampler::Convolve_NEON(const float* input_ptr, const float* k1,
-                                   const float* k2,
-                                   double kernel_interpolation_factor) {
-  float32x4_t m_input;
-  float32x4_t m_sums1 = vmovq_n_f32(0);
-  float32x4_t m_sums2 = vmovq_n_f32(0);
-
-  const float* upper = input_ptr + kKernelSize;
-  for (; input_ptr < upper; ) {
-    m_input = vld1q_f32(input_ptr);
-    input_ptr += 4;
-    m_sums1 = vmlaq_f32(m_sums1, m_input, vld1q_f32(k1));
-    k1 += 4;
-    m_sums2 = vmlaq_f32(m_sums2, m_input, vld1q_f32(k2));
-    k2 += 4;
-  }
-
-  // Linearly interpolate the two "convolutions".
-  m_sums1 = vmlaq_f32(
-      vmulq_f32(m_sums1, vmovq_n_f32(1.0 - kernel_interpolation_factor)),
-      m_sums2, vmovq_n_f32(kernel_interpolation_factor));
-
-  // Sum components together.
-  float32x2_t m_half = vadd_f32(vget_high_f32(m_sums1), vget_low_f32(m_sums1));
-  return vget_lane_f32(vpadd_f32(m_half, m_half), 0);
-}
-
-}  // namespace webrtc
diff --git a/common_audio/resampler/sinc_resampler_sse.cc b/common_audio/resampler/sinc_resampler_sse.cc
deleted file mode 100644
index 9e3953f..0000000
--- a/common_audio/resampler/sinc_resampler_sse.cc
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- *  Copyright (c) 2013 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.
- */
-
-// Modified from the Chromium original:
-// src/media/base/simd/sinc_resampler_sse.cc
-
-#include "webrtc/common_audio/resampler/sinc_resampler.h"
-
-#include <xmmintrin.h>
-
-namespace webrtc {
-
-float SincResampler::Convolve_SSE(const float* input_ptr, const float* k1,
-                                  const float* k2,
-                                  double kernel_interpolation_factor) {
-  __m128 m_input;
-  __m128 m_sums1 = _mm_setzero_ps();
-  __m128 m_sums2 = _mm_setzero_ps();
-
-  // Based on |input_ptr| alignment, we need to use loadu or load.  Unrolling
-  // these loops hurt performance in local testing.
-  if (reinterpret_cast<uintptr_t>(input_ptr) & 0x0F) {
-    for (size_t i = 0; i < kKernelSize; i += 4) {
-      m_input = _mm_loadu_ps(input_ptr + i);
-      m_sums1 = _mm_add_ps(m_sums1, _mm_mul_ps(m_input, _mm_load_ps(k1 + i)));
-      m_sums2 = _mm_add_ps(m_sums2, _mm_mul_ps(m_input, _mm_load_ps(k2 + i)));
-    }
-  } else {
-    for (size_t i = 0; i < kKernelSize; i += 4) {
-      m_input = _mm_load_ps(input_ptr + i);
-      m_sums1 = _mm_add_ps(m_sums1, _mm_mul_ps(m_input, _mm_load_ps(k1 + i)));
-      m_sums2 = _mm_add_ps(m_sums2, _mm_mul_ps(m_input, _mm_load_ps(k2 + i)));
-    }
-  }
-
-  // Linearly interpolate the two "convolutions".
-  m_sums1 = _mm_mul_ps(m_sums1, _mm_set_ps1(
-      static_cast<float>(1.0 - kernel_interpolation_factor)));
-  m_sums2 = _mm_mul_ps(m_sums2, _mm_set_ps1(
-      static_cast<float>(kernel_interpolation_factor)));
-  m_sums1 = _mm_add_ps(m_sums1, m_sums2);
-
-  // Sum components together.
-  float result;
-  m_sums2 = _mm_add_ps(_mm_movehl_ps(m_sums1, m_sums1), m_sums1);
-  _mm_store_ss(&result, _mm_add_ss(m_sums2, _mm_shuffle_ps(
-      m_sums2, m_sums2, 1)));
-
-  return result;
-}
-
-}  // namespace webrtc
diff --git a/common_audio/resampler/sinc_resampler_unittest.cc b/common_audio/resampler/sinc_resampler_unittest.cc
deleted file mode 100644
index 8a3d1ec..0000000
--- a/common_audio/resampler/sinc_resampler_unittest.cc
+++ /dev/null
@@ -1,392 +0,0 @@
-/*
- *  Copyright (c) 2013 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.
- */
-
-// Modified from the Chromium original:
-// src/media/base/sinc_resampler_unittest.cc
-
-// MSVC++ requires this to be set before any other includes to get M_PI.
-#define _USE_MATH_DEFINES
-
-#include <math.h>
-
-#include <algorithm>
-#include <memory>
-
-#include "webrtc/common_audio/resampler/sinc_resampler.h"
-#include "webrtc/common_audio/resampler/sinusoidal_linear_chirp_source.h"
-#include "webrtc/rtc_base/stringize_macros.h"
-#include "webrtc/rtc_base/timeutils.h"
-#include "webrtc/system_wrappers/include/cpu_features_wrapper.h"
-#include "webrtc/test/gmock.h"
-#include "webrtc/test/gtest.h"
-
-using testing::_;
-
-namespace webrtc {
-
-static const double kSampleRateRatio = 192000.0 / 44100.0;
-static const double kKernelInterpolationFactor = 0.5;
-
-// Helper class to ensure ChunkedResample() functions properly.
-class MockSource : public SincResamplerCallback {
- public:
-  MOCK_METHOD2(Run, void(size_t frames, float* destination));
-};
-
-ACTION(ClearBuffer) {
-  memset(arg1, 0, arg0 * sizeof(float));
-}
-
-ACTION(FillBuffer) {
-  // Value chosen arbitrarily such that SincResampler resamples it to something
-  // easily representable on all platforms; e.g., using kSampleRateRatio this
-  // becomes 1.81219.
-  memset(arg1, 64, arg0 * sizeof(float));
-}
-
-// Test requesting multiples of ChunkSize() frames results in the proper number
-// of callbacks.
-TEST(SincResamplerTest, ChunkedResample) {
-  MockSource mock_source;
-
-  // Choose a high ratio of input to output samples which will result in quick
-  // exhaustion of SincResampler's internal buffers.
-  SincResampler resampler(kSampleRateRatio, SincResampler::kDefaultRequestSize,
-                          &mock_source);
-
-  static const int kChunks = 2;
-  size_t max_chunk_size = resampler.ChunkSize() * kChunks;
-  std::unique_ptr<float[]> resampled_destination(new float[max_chunk_size]);
-
-  // Verify requesting ChunkSize() frames causes a single callback.
-  EXPECT_CALL(mock_source, Run(_, _))
-      .Times(1).WillOnce(ClearBuffer());
-  resampler.Resample(resampler.ChunkSize(), resampled_destination.get());
-
-  // Verify requesting kChunks * ChunkSize() frames causes kChunks callbacks.
-  testing::Mock::VerifyAndClear(&mock_source);
-  EXPECT_CALL(mock_source, Run(_, _))
-      .Times(kChunks).WillRepeatedly(ClearBuffer());
-  resampler.Resample(max_chunk_size, resampled_destination.get());
-}
-
-// Test flush resets the internal state properly.
-TEST(SincResamplerTest, Flush) {
-  MockSource mock_source;
-  SincResampler resampler(kSampleRateRatio, SincResampler::kDefaultRequestSize,
-                          &mock_source);
-  std::unique_ptr<float[]> resampled_destination(
-      new float[resampler.ChunkSize()]);
-
-  // Fill the resampler with junk data.
-  EXPECT_CALL(mock_source, Run(_, _))
-      .Times(1).WillOnce(FillBuffer());
-  resampler.Resample(resampler.ChunkSize() / 2, resampled_destination.get());
-  ASSERT_NE(resampled_destination[0], 0);
-
-  // Flush and request more data, which should all be zeros now.
-  resampler.Flush();
-  testing::Mock::VerifyAndClear(&mock_source);
-  EXPECT_CALL(mock_source, Run(_, _))
-      .Times(1).WillOnce(ClearBuffer());
-  resampler.Resample(resampler.ChunkSize() / 2, resampled_destination.get());
-  for (size_t i = 0; i < resampler.ChunkSize() / 2; ++i)
-    ASSERT_FLOAT_EQ(resampled_destination[i], 0);
-}
-
-// Test flush resets the internal state properly.
-TEST(SincResamplerTest, DISABLED_SetRatioBench) {
-  MockSource mock_source;
-  SincResampler resampler(kSampleRateRatio, SincResampler::kDefaultRequestSize,
-                          &mock_source);
-
-  int64_t start = rtc::TimeNanos();
-  for (int i = 1; i < 10000; ++i)
-    resampler.SetRatio(1.0 / i);
-  double total_time_c_us =
-      (rtc::TimeNanos() - start) / rtc::kNumNanosecsPerMicrosec;
-  printf("SetRatio() took %.2fms.\n", total_time_c_us / 1000);
-}
-
-
-// Define platform independent function name for Convolve* tests.
-#if defined(WEBRTC_ARCH_X86_FAMILY)
-#define CONVOLVE_FUNC Convolve_SSE
-#elif defined(WEBRTC_ARCH_ARM_V7)
-#define CONVOLVE_FUNC Convolve_NEON
-#endif
-
-// Ensure various optimized Convolve() methods return the same value.  Only run
-// this test if other optimized methods exist, otherwise the default Convolve()
-// will be tested by the parameterized SincResampler tests below.
-#if defined(CONVOLVE_FUNC)
-TEST(SincResamplerTest, Convolve) {
-#if defined(WEBRTC_ARCH_X86_FAMILY)
-  ASSERT_TRUE(WebRtc_GetCPUInfo(kSSE2));
-#elif defined(WEBRTC_ARCH_ARM_V7)
-  ASSERT_TRUE(WebRtc_GetCPUFeaturesARM() & kCPUFeatureNEON);
-#endif
-
-  // Initialize a dummy resampler.
-  MockSource mock_source;
-  SincResampler resampler(kSampleRateRatio, SincResampler::kDefaultRequestSize,
-                          &mock_source);
-
-  // The optimized Convolve methods are slightly more precise than Convolve_C(),
-  // so comparison must be done using an epsilon.
-  static const double kEpsilon = 0.00000005;
-
-  // Use a kernel from SincResampler as input and kernel data, this has the
-  // benefit of already being properly sized and aligned for Convolve_SSE().
-  double result = resampler.Convolve_C(
-      resampler.kernel_storage_.get(), resampler.kernel_storage_.get(),
-      resampler.kernel_storage_.get(), kKernelInterpolationFactor);
-  double result2 = resampler.CONVOLVE_FUNC(
-      resampler.kernel_storage_.get(), resampler.kernel_storage_.get(),
-      resampler.kernel_storage_.get(), kKernelInterpolationFactor);
-  EXPECT_NEAR(result2, result, kEpsilon);
-
-  // Test Convolve() w/ unaligned input pointer.
-  result = resampler.Convolve_C(
-      resampler.kernel_storage_.get() + 1, resampler.kernel_storage_.get(),
-      resampler.kernel_storage_.get(), kKernelInterpolationFactor);
-  result2 = resampler.CONVOLVE_FUNC(
-      resampler.kernel_storage_.get() + 1, resampler.kernel_storage_.get(),
-      resampler.kernel_storage_.get(), kKernelInterpolationFactor);
-  EXPECT_NEAR(result2, result, kEpsilon);
-}
-#endif
-
-// Benchmark for the various Convolve() methods.  Make sure to build with
-// branding=Chrome so that RTC_DCHECKs are compiled out when benchmarking.
-// Original benchmarks were run with --convolve-iterations=50000000.
-TEST(SincResamplerTest, ConvolveBenchmark) {
-  // Initialize a dummy resampler.
-  MockSource mock_source;
-  SincResampler resampler(kSampleRateRatio, SincResampler::kDefaultRequestSize,
-                          &mock_source);
-
-  // Retrieve benchmark iterations from command line.
-  // TODO(ajm): Reintroduce this as a command line option.
-  const int kConvolveIterations = 1000000;
-
-  printf("Benchmarking %d iterations:\n", kConvolveIterations);
-
-  // Benchmark Convolve_C().
-  int64_t start = rtc::TimeNanos();
-  for (int i = 0; i < kConvolveIterations; ++i) {
-    resampler.Convolve_C(
-        resampler.kernel_storage_.get(), resampler.kernel_storage_.get(),
-        resampler.kernel_storage_.get(), kKernelInterpolationFactor);
-  }
-  double total_time_c_us =
-      (rtc::TimeNanos() - start) / rtc::kNumNanosecsPerMicrosec;
-  printf("Convolve_C took %.2fms.\n", total_time_c_us / 1000);
-
-#if defined(CONVOLVE_FUNC)
-#if defined(WEBRTC_ARCH_X86_FAMILY)
-  ASSERT_TRUE(WebRtc_GetCPUInfo(kSSE2));
-#elif defined(WEBRTC_ARCH_ARM_V7)
-  ASSERT_TRUE(WebRtc_GetCPUFeaturesARM() & kCPUFeatureNEON);
-#endif
-
-  // Benchmark with unaligned input pointer.
-  start = rtc::TimeNanos();
-  for (int j = 0; j < kConvolveIterations; ++j) {
-    resampler.CONVOLVE_FUNC(
-        resampler.kernel_storage_.get() + 1, resampler.kernel_storage_.get(),
-        resampler.kernel_storage_.get(), kKernelInterpolationFactor);
-  }
-  double total_time_optimized_unaligned_us =
-      (rtc::TimeNanos() - start) / rtc::kNumNanosecsPerMicrosec;
-  printf(STRINGIZE(CONVOLVE_FUNC) "(unaligned) took %.2fms; which is %.2fx "
-         "faster than Convolve_C.\n", total_time_optimized_unaligned_us / 1000,
-         total_time_c_us / total_time_optimized_unaligned_us);
-
-  // Benchmark with aligned input pointer.
-  start = rtc::TimeNanos();
-  for (int j = 0; j < kConvolveIterations; ++j) {
-    resampler.CONVOLVE_FUNC(
-        resampler.kernel_storage_.get(), resampler.kernel_storage_.get(),
-        resampler.kernel_storage_.get(), kKernelInterpolationFactor);
-  }
-  double total_time_optimized_aligned_us =
-      (rtc::TimeNanos() - start) / rtc::kNumNanosecsPerMicrosec;
-  printf(STRINGIZE(CONVOLVE_FUNC) " (aligned) took %.2fms; which is %.2fx "
-         "faster than Convolve_C and %.2fx faster than "
-         STRINGIZE(CONVOLVE_FUNC) " (unaligned).\n",
-         total_time_optimized_aligned_us / 1000,
-         total_time_c_us / total_time_optimized_aligned_us,
-         total_time_optimized_unaligned_us / total_time_optimized_aligned_us);
-#endif
-}
-
-#undef CONVOLVE_FUNC
-
-typedef std::tr1::tuple<int, int, double, double> SincResamplerTestData;
-class SincResamplerTest
-    : public testing::TestWithParam<SincResamplerTestData> {
- public:
-  SincResamplerTest()
-      : input_rate_(std::tr1::get<0>(GetParam())),
-        output_rate_(std::tr1::get<1>(GetParam())),
-        rms_error_(std::tr1::get<2>(GetParam())),
-        low_freq_error_(std::tr1::get<3>(GetParam())) {
-  }
-
-  virtual ~SincResamplerTest() {}
-
- protected:
-  int input_rate_;
-  int output_rate_;
-  double rms_error_;
-  double low_freq_error_;
-};
-
-// Tests resampling using a given input and output sample rate.
-TEST_P(SincResamplerTest, Resample) {
-  // Make comparisons using one second of data.
-  static const double kTestDurationSecs = 1;
-  const size_t input_samples =
-      static_cast<size_t>(kTestDurationSecs * input_rate_);
-  const size_t output_samples =
-      static_cast<size_t>(kTestDurationSecs * output_rate_);
-
-  // Nyquist frequency for the input sampling rate.
-  const double input_nyquist_freq = 0.5 * input_rate_;
-
-  // Source for data to be resampled.
-  SinusoidalLinearChirpSource resampler_source(
-      input_rate_, input_samples, input_nyquist_freq, 0);
-
-  const double io_ratio = input_rate_ / static_cast<double>(output_rate_);
-  SincResampler resampler(io_ratio, SincResampler::kDefaultRequestSize,
-                          &resampler_source);
-
-  // Force an update to the sample rate ratio to ensure dyanmic sample rate
-  // changes are working correctly.
-  std::unique_ptr<float[]> kernel(new float[SincResampler::kKernelStorageSize]);
-  memcpy(kernel.get(), resampler.get_kernel_for_testing(),
-         SincResampler::kKernelStorageSize);
-  resampler.SetRatio(M_PI);
-  ASSERT_NE(0, memcmp(kernel.get(), resampler.get_kernel_for_testing(),
-                      SincResampler::kKernelStorageSize));
-  resampler.SetRatio(io_ratio);
-  ASSERT_EQ(0, memcmp(kernel.get(), resampler.get_kernel_for_testing(),
-                      SincResampler::kKernelStorageSize));
-
-  // TODO(dalecurtis): If we switch to AVX/SSE optimization, we'll need to
-  // allocate these on 32-byte boundaries and ensure they're sized % 32 bytes.
-  std::unique_ptr<float[]> resampled_destination(new float[output_samples]);
-  std::unique_ptr<float[]> pure_destination(new float[output_samples]);
-
-  // Generate resampled signal.
-  resampler.Resample(output_samples, resampled_destination.get());
-
-  // Generate pure signal.
-  SinusoidalLinearChirpSource pure_source(
-      output_rate_, output_samples, input_nyquist_freq, 0);
-  pure_source.Run(output_samples, pure_destination.get());
-
-  // Range of the Nyquist frequency (0.5 * min(input rate, output_rate)) which
-  // we refer to as low and high.
-  static const double kLowFrequencyNyquistRange = 0.7;
-  static const double kHighFrequencyNyquistRange = 0.9;
-
-  // Calculate Root-Mean-Square-Error and maximum error for the resampling.
-  double sum_of_squares = 0;
-  double low_freq_max_error = 0;
-  double high_freq_max_error = 0;
-  int minimum_rate = std::min(input_rate_, output_rate_);
-  double low_frequency_range = kLowFrequencyNyquistRange * 0.5 * minimum_rate;
-  double high_frequency_range = kHighFrequencyNyquistRange * 0.5 * minimum_rate;
-  for (size_t i = 0; i < output_samples; ++i) {
-    double error = fabs(resampled_destination[i] - pure_destination[i]);
-
-    if (pure_source.Frequency(i) < low_frequency_range) {
-      if (error > low_freq_max_error)
-        low_freq_max_error = error;
-    } else if (pure_source.Frequency(i) < high_frequency_range) {
-      if (error > high_freq_max_error)
-        high_freq_max_error = error;
-    }
-    // TODO(dalecurtis): Sanity check frequencies > kHighFrequencyNyquistRange.
-
-    sum_of_squares += error * error;
-  }
-
-  double rms_error = sqrt(sum_of_squares / output_samples);
-
-  // Convert each error to dbFS.
-  #define DBFS(x) 20 * log10(x)
-  rms_error = DBFS(rms_error);
-  low_freq_max_error = DBFS(low_freq_max_error);
-  high_freq_max_error = DBFS(high_freq_max_error);
-
-  EXPECT_LE(rms_error, rms_error_);
-  EXPECT_LE(low_freq_max_error, low_freq_error_);
-
-  // All conversions currently have a high frequency error around -6 dbFS.
-  static const double kHighFrequencyMaxError = -6.02;
-  EXPECT_LE(high_freq_max_error, kHighFrequencyMaxError);
-}
-
-// Almost all conversions have an RMS error of around -14 dbFS.
-static const double kResamplingRMSError = -14.58;
-
-// Thresholds chosen arbitrarily based on what each resampling reported during
-// testing.  All thresholds are in dbFS, http://en.wikipedia.org/wiki/DBFS.
-INSTANTIATE_TEST_CASE_P(
-    SincResamplerTest, SincResamplerTest, testing::Values(
-        // To 44.1kHz
-        std::tr1::make_tuple(8000, 44100, kResamplingRMSError, -62.73),
-        std::tr1::make_tuple(11025, 44100, kResamplingRMSError, -72.19),
-        std::tr1::make_tuple(16000, 44100, kResamplingRMSError, -62.54),
-        std::tr1::make_tuple(22050, 44100, kResamplingRMSError, -73.53),
-        std::tr1::make_tuple(32000, 44100, kResamplingRMSError, -63.32),
-        std::tr1::make_tuple(44100, 44100, kResamplingRMSError, -73.53),
-        std::tr1::make_tuple(48000, 44100, -15.01, -64.04),
-        std::tr1::make_tuple(96000, 44100, -18.49, -25.51),
-        std::tr1::make_tuple(192000, 44100, -20.50, -13.31),
-
-        // To 48kHz
-        std::tr1::make_tuple(8000, 48000, kResamplingRMSError, -63.43),
-        std::tr1::make_tuple(11025, 48000, kResamplingRMSError, -62.61),
-        std::tr1::make_tuple(16000, 48000, kResamplingRMSError, -63.96),
-        std::tr1::make_tuple(22050, 48000, kResamplingRMSError, -62.42),
-        std::tr1::make_tuple(32000, 48000, kResamplingRMSError, -64.04),
-        std::tr1::make_tuple(44100, 48000, kResamplingRMSError, -62.63),
-        std::tr1::make_tuple(48000, 48000, kResamplingRMSError, -73.52),
-        std::tr1::make_tuple(96000, 48000, -18.40, -28.44),
-        std::tr1::make_tuple(192000, 48000, -20.43, -14.11),
-
-        // To 96kHz
-        std::tr1::make_tuple(8000, 96000, kResamplingRMSError, -63.19),
-        std::tr1::make_tuple(11025, 96000, kResamplingRMSError, -62.61),
-        std::tr1::make_tuple(16000, 96000, kResamplingRMSError, -63.39),
-        std::tr1::make_tuple(22050, 96000, kResamplingRMSError, -62.42),
-        std::tr1::make_tuple(32000, 96000, kResamplingRMSError, -63.95),
-        std::tr1::make_tuple(44100, 96000, kResamplingRMSError, -62.63),
-        std::tr1::make_tuple(48000, 96000, kResamplingRMSError, -73.52),
-        std::tr1::make_tuple(96000, 96000, kResamplingRMSError, -73.52),
-        std::tr1::make_tuple(192000, 96000, kResamplingRMSError, -28.41),
-
-        // To 192kHz
-        std::tr1::make_tuple(8000, 192000, kResamplingRMSError, -63.10),
-        std::tr1::make_tuple(11025, 192000, kResamplingRMSError, -62.61),
-        std::tr1::make_tuple(16000, 192000, kResamplingRMSError, -63.14),
-        std::tr1::make_tuple(22050, 192000, kResamplingRMSError, -62.42),
-        std::tr1::make_tuple(32000, 192000, kResamplingRMSError, -63.38),
-        std::tr1::make_tuple(44100, 192000, kResamplingRMSError, -62.63),
-        std::tr1::make_tuple(48000, 192000, kResamplingRMSError, -73.44),
-        std::tr1::make_tuple(96000, 192000, kResamplingRMSError, -73.52),
-        std::tr1::make_tuple(192000, 192000, kResamplingRMSError, -73.52)));
-
-}  // namespace webrtc
diff --git a/common_audio/resampler/sinusoidal_linear_chirp_source.cc b/common_audio/resampler/sinusoidal_linear_chirp_source.cc
deleted file mode 100644
index 5d21568..0000000
--- a/common_audio/resampler/sinusoidal_linear_chirp_source.cc
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- *  Copyright (c) 2013 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.
- */
-
-// MSVC++ requires this to be set before any other includes to get M_PI.
-#define _USE_MATH_DEFINES
-
-#include "webrtc/common_audio/resampler/sinusoidal_linear_chirp_source.h"
-
-#include <math.h>
-
-namespace webrtc {
-
-SinusoidalLinearChirpSource::SinusoidalLinearChirpSource(int sample_rate,
-                                                         size_t samples,
-                                                         double max_frequency,
-                                                         double delay_samples)
-    : sample_rate_(sample_rate),
-      total_samples_(samples),
-      max_frequency_(max_frequency),
-      current_index_(0),
-      delay_samples_(delay_samples) {
-  // Chirp rate.
-  double duration = static_cast<double>(total_samples_) / sample_rate_;
-  k_ = (max_frequency_ - kMinFrequency) / duration;
-}
-
-void SinusoidalLinearChirpSource::Run(size_t frames, float* destination) {
-  for (size_t i = 0; i < frames; ++i, ++current_index_) {
-    // Filter out frequencies higher than Nyquist.
-    if (Frequency(current_index_) > 0.5 * sample_rate_) {
-      destination[i] = 0;
-    } else {
-      // Calculate time in seconds.
-      if (current_index_ < delay_samples_) {
-        destination[i] = 0;
-      } else {
-        // Sinusoidal linear chirp.
-        double t = (current_index_ - delay_samples_) / sample_rate_;
-        destination[i] =
-            sin(2 * M_PI * (kMinFrequency * t + (k_ / 2) * t * t));
-      }
-    }
-  }
-}
-
-double SinusoidalLinearChirpSource::Frequency(size_t position) {
-  return kMinFrequency + (position - delay_samples_) *
-      (max_frequency_ - kMinFrequency) / total_samples_;
-}
-
-}  // namespace webrtc
diff --git a/common_audio/resampler/sinusoidal_linear_chirp_source.h b/common_audio/resampler/sinusoidal_linear_chirp_source.h
deleted file mode 100644
index 80ccd80..0000000
--- a/common_audio/resampler/sinusoidal_linear_chirp_source.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- *  Copyright (c) 2013 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.
- */
-
-// Modified from the Chromium original here:
-// src/media/base/sinc_resampler_unittest.cc
-
-#ifndef WEBRTC_COMMON_AUDIO_RESAMPLER_SINUSOIDAL_LINEAR_CHIRP_SOURCE_H_
-#define WEBRTC_COMMON_AUDIO_RESAMPLER_SINUSOIDAL_LINEAR_CHIRP_SOURCE_H_
-
-#include "webrtc/common_audio/resampler/sinc_resampler.h"
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace webrtc {
-
-// Fake audio source for testing the resampler.  Generates a sinusoidal linear
-// chirp (http://en.wikipedia.org/wiki/Chirp) which can be tuned to stress the
-// resampler for the specific sample rate conversion being used.
-class SinusoidalLinearChirpSource : public SincResamplerCallback {
- public:
-  // |delay_samples| can be used to insert a fractional sample delay into the
-  // source.  It will produce zeros until non-negative time is reached.
-  SinusoidalLinearChirpSource(int sample_rate, size_t samples,
-                              double max_frequency, double delay_samples);
-
-  virtual ~SinusoidalLinearChirpSource() {}
-
-  void Run(size_t frames, float* destination) override;
-
-  double Frequency(size_t position);
-
- private:
-  enum {
-    kMinFrequency = 5
-  };
-
-  int sample_rate_;
-  size_t total_samples_;
-  double max_frequency_;
-  double k_;
-  size_t current_index_;
-  double delay_samples_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(SinusoidalLinearChirpSource);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_COMMON_AUDIO_RESAMPLER_SINUSOIDAL_LINEAR_CHIRP_SOURCE_H_
diff --git a/common_audio/ring_buffer.c b/common_audio/ring_buffer.c
deleted file mode 100644
index 5a91205..0000000
--- a/common_audio/ring_buffer.c
+++ /dev/null
@@ -1,232 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-// A ring buffer to hold arbitrary data. Provides no thread safety. Unless
-// otherwise specified, functions return 0 on success and -1 on error.
-
-#include "webrtc/common_audio/ring_buffer.h"
-
-#include <stddef.h>  // size_t
-#include <stdlib.h>
-#include <string.h>
-
-// Get address of region(s) from which we can read data.
-// If the region is contiguous, |data_ptr_bytes_2| will be zero.
-// If non-contiguous, |data_ptr_bytes_2| will be the size in bytes of the second
-// region. Returns room available to be read or |element_count|, whichever is
-// smaller.
-static size_t GetBufferReadRegions(RingBuffer* buf,
-                                   size_t element_count,
-                                   void** data_ptr_1,
-                                   size_t* data_ptr_bytes_1,
-                                   void** data_ptr_2,
-                                   size_t* data_ptr_bytes_2) {
-
-  const size_t readable_elements = WebRtc_available_read(buf);
-  const size_t read_elements = (readable_elements < element_count ?
-      readable_elements : element_count);
-  const size_t margin = buf->element_count - buf->read_pos;
-
-  // Check to see if read is not contiguous.
-  if (read_elements > margin) {
-    // Write data in two blocks that wrap the buffer.
-    *data_ptr_1 = buf->data + buf->read_pos * buf->element_size;
-    *data_ptr_bytes_1 = margin * buf->element_size;
-    *data_ptr_2 = buf->data;
-    *data_ptr_bytes_2 = (read_elements - margin) * buf->element_size;
-  } else {
-    *data_ptr_1 = buf->data + buf->read_pos * buf->element_size;
-    *data_ptr_bytes_1 = read_elements * buf->element_size;
-    *data_ptr_2 = NULL;
-    *data_ptr_bytes_2 = 0;
-  }
-
-  return read_elements;
-}
-
-RingBuffer* WebRtc_CreateBuffer(size_t element_count, size_t element_size) {
-  RingBuffer* self = NULL;
-  if (element_count == 0 || element_size == 0) {
-    return NULL;
-  }
-
-  self = malloc(sizeof(RingBuffer));
-  if (!self) {
-    return NULL;
-  }
-
-  self->data = malloc(element_count * element_size);
-  if (!self->data) {
-    free(self);
-    self = NULL;
-    return NULL;
-  }
-
-  self->element_count = element_count;
-  self->element_size = element_size;
-  WebRtc_InitBuffer(self);
-
-  return self;
-}
-
-void WebRtc_InitBuffer(RingBuffer* self) {
-  self->read_pos = 0;
-  self->write_pos = 0;
-  self->rw_wrap = SAME_WRAP;
-
-  // Initialize buffer to zeros
-  memset(self->data, 0, self->element_count * self->element_size);
-}
-
-void WebRtc_FreeBuffer(void* handle) {
-  RingBuffer* self = (RingBuffer*)handle;
-  if (!self) {
-    return;
-  }
-
-  free(self->data);
-  free(self);
-}
-
-size_t WebRtc_ReadBuffer(RingBuffer* self,
-                         void** data_ptr,
-                         void* data,
-                         size_t element_count) {
-
-  if (self == NULL) {
-    return 0;
-  }
-  if (data == NULL) {
-    return 0;
-  }
-
-  {
-    void* buf_ptr_1 = NULL;
-    void* buf_ptr_2 = NULL;
-    size_t buf_ptr_bytes_1 = 0;
-    size_t buf_ptr_bytes_2 = 0;
-    const size_t read_count = GetBufferReadRegions(self,
-                                                   element_count,
-                                                   &buf_ptr_1,
-                                                   &buf_ptr_bytes_1,
-                                                   &buf_ptr_2,
-                                                   &buf_ptr_bytes_2);
-    if (buf_ptr_bytes_2 > 0) {
-      // We have a wrap around when reading the buffer. Copy the buffer data to
-      // |data| and point to it.
-      memcpy(data, buf_ptr_1, buf_ptr_bytes_1);
-      memcpy(((char*) data) + buf_ptr_bytes_1, buf_ptr_2, buf_ptr_bytes_2);
-      buf_ptr_1 = data;
-    } else if (!data_ptr) {
-      // No wrap, but a memcpy was requested.
-      memcpy(data, buf_ptr_1, buf_ptr_bytes_1);
-    }
-    if (data_ptr) {
-      // |buf_ptr_1| == |data| in the case of a wrap.
-      *data_ptr = read_count == 0 ? NULL : buf_ptr_1;
-    }
-
-    // Update read position
-    WebRtc_MoveReadPtr(self, (int) read_count);
-
-    return read_count;
-  }
-}
-
-size_t WebRtc_WriteBuffer(RingBuffer* self,
-                          const void* data,
-                          size_t element_count) {
-  if (!self) {
-    return 0;
-  }
-  if (!data) {
-    return 0;
-  }
-
-  {
-    const size_t free_elements = WebRtc_available_write(self);
-    const size_t write_elements = (free_elements < element_count ? free_elements
-        : element_count);
-    size_t n = write_elements;
-    const size_t margin = self->element_count - self->write_pos;
-
-    if (write_elements > margin) {
-      // Buffer wrap around when writing.
-      memcpy(self->data + self->write_pos * self->element_size,
-             data, margin * self->element_size);
-      self->write_pos = 0;
-      n -= margin;
-      self->rw_wrap = DIFF_WRAP;
-    }
-    memcpy(self->data + self->write_pos * self->element_size,
-           ((const char*) data) + ((write_elements - n) * self->element_size),
-           n * self->element_size);
-    self->write_pos += n;
-
-    return write_elements;
-  }
-}
-
-int WebRtc_MoveReadPtr(RingBuffer* self, int element_count) {
-  if (!self) {
-    return 0;
-  }
-
-  {
-    // We need to be able to take care of negative changes, hence use "int"
-    // instead of "size_t".
-    const int free_elements = (int) WebRtc_available_write(self);
-    const int readable_elements = (int) WebRtc_available_read(self);
-    int read_pos = (int) self->read_pos;
-
-    if (element_count > readable_elements) {
-      element_count = readable_elements;
-    }
-    if (element_count < -free_elements) {
-      element_count = -free_elements;
-    }
-
-    read_pos += element_count;
-    if (read_pos > (int) self->element_count) {
-      // Buffer wrap around. Restart read position and wrap indicator.
-      read_pos -= (int) self->element_count;
-      self->rw_wrap = SAME_WRAP;
-    }
-    if (read_pos < 0) {
-      // Buffer wrap around. Restart read position and wrap indicator.
-      read_pos += (int) self->element_count;
-      self->rw_wrap = DIFF_WRAP;
-    }
-
-    self->read_pos = (size_t) read_pos;
-
-    return element_count;
-  }
-}
-
-size_t WebRtc_available_read(const RingBuffer* self) {
-  if (!self) {
-    return 0;
-  }
-
-  if (self->rw_wrap == SAME_WRAP) {
-    return self->write_pos - self->read_pos;
-  } else {
-    return self->element_count - self->read_pos + self->write_pos;
-  }
-}
-
-size_t WebRtc_available_write(const RingBuffer* self) {
-  if (!self) {
-    return 0;
-  }
-
-  return self->element_count - WebRtc_available_read(self);
-}
diff --git a/common_audio/ring_buffer.h b/common_audio/ring_buffer.h
deleted file mode 100644
index 46759b6..0000000
--- a/common_audio/ring_buffer.h
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-// A ring buffer to hold arbitrary data. Provides no thread safety. Unless
-// otherwise specified, functions return 0 on success and -1 on error.
-
-#ifndef WEBRTC_COMMON_AUDIO_RING_BUFFER_H_
-#define WEBRTC_COMMON_AUDIO_RING_BUFFER_H_
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include <stddef.h>  // size_t
-
-enum Wrap { SAME_WRAP, DIFF_WRAP };
-
-typedef struct RingBuffer {
-  size_t read_pos;
-  size_t write_pos;
-  size_t element_count;
-  size_t element_size;
-  enum Wrap rw_wrap;
-  char* data;
-} RingBuffer;
-
-// Creates and initializes the buffer. Returns null on failure.
-RingBuffer* WebRtc_CreateBuffer(size_t element_count, size_t element_size);
-void WebRtc_InitBuffer(RingBuffer* handle);
-void WebRtc_FreeBuffer(void* handle);
-
-// Reads data from the buffer. Returns the number of elements that were read.
-// The |data_ptr| will point to the address where the read data is located.
-// If no data can be read, |data_ptr| is set to |NULL|. If all data can be read
-// without buffer wrap around then |data_ptr| will point to the location in the
-// buffer. Otherwise, the data will be copied to |data| (memory allocation done
-// by the user) and |data_ptr| points to the address of |data|. |data_ptr| is
-// only guaranteed to be valid until the next call to WebRtc_WriteBuffer().
-//
-// To force a copying to |data|, pass a null |data_ptr|.
-//
-// Returns number of elements read.
-size_t WebRtc_ReadBuffer(RingBuffer* handle,
-                         void** data_ptr,
-                         void* data,
-                         size_t element_count);
-
-// Writes |data| to buffer and returns the number of elements written.
-size_t WebRtc_WriteBuffer(RingBuffer* handle, const void* data,
-                          size_t element_count);
-
-// Moves the buffer read position and returns the number of elements moved.
-// Positive |element_count| moves the read position towards the write position,
-// that is, flushing the buffer. Negative |element_count| moves the read
-// position away from the the write position, that is, stuffing the buffer.
-// Returns number of elements moved.
-int WebRtc_MoveReadPtr(RingBuffer* handle, int element_count);
-
-// Returns number of available elements to read.
-size_t WebRtc_available_read(const RingBuffer* handle);
-
-// Returns number of available elements for write.
-size_t WebRtc_available_write(const RingBuffer* handle);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif  // WEBRTC_COMMON_AUDIO_RING_BUFFER_H_
diff --git a/common_audio/ring_buffer_unittest.cc b/common_audio/ring_buffer_unittest.cc
deleted file mode 100644
index 20fc014..0000000
--- a/common_audio/ring_buffer_unittest.cc
+++ /dev/null
@@ -1,151 +0,0 @@
-/*
- *  Copyright (c) 2013 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/common_audio/ring_buffer.h"
-
-#include <stdlib.h>
-#include <time.h>
-
-#include <algorithm>
-#include <memory>
-
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-struct FreeBufferDeleter {
-  inline void operator()(void* ptr) const {
-    WebRtc_FreeBuffer(ptr);
-  }
-};
-typedef std::unique_ptr<RingBuffer, FreeBufferDeleter> scoped_ring_buffer;
-
-static void AssertElementEq(int expected, int actual) {
-  ASSERT_EQ(expected, actual);
-}
-
-static int SetIncrementingData(int* data, int num_elements,
-                               int starting_value) {
-  for (int i = 0; i < num_elements; i++) {
-    data[i] = starting_value++;
-  }
-  return starting_value;
-}
-
-static int CheckIncrementingData(int* data, int num_elements,
-                                 int starting_value) {
-  for (int i = 0; i < num_elements; i++) {
-    AssertElementEq(starting_value++, data[i]);
-  }
-  return starting_value;
-}
-
-// We use ASSERTs in this test to avoid obscuring the seed in the case of a
-// failure.
-static void RandomStressTest(int** data_ptr) {
-  const int kNumTests = 10;
-  const int kNumOps = 1000;
-  const int kMaxBufferSize = 1000;
-
-  unsigned int seed = time(nullptr);
-  printf("seed=%u\n", seed);
-  srand(seed);
-  for (int i = 0; i < kNumTests; i++) {
-    // rand_r is not supported on many platforms, so rand is used.
-    const int buffer_size = std::max(rand() % kMaxBufferSize, 1);  // NOLINT
-    std::unique_ptr<int[]> write_data(new int[buffer_size]);
-    std::unique_ptr<int[]> read_data(new int[buffer_size]);
-    scoped_ring_buffer buffer(WebRtc_CreateBuffer(buffer_size, sizeof(int)));
-    ASSERT_TRUE(buffer.get() != nullptr);
-    WebRtc_InitBuffer(buffer.get());
-    int buffer_consumed = 0;
-    int write_element = 0;
-    int read_element = 0;
-    for (int j = 0; j < kNumOps; j++) {
-      const bool write = rand() % 2 == 0 ? true : false;  // NOLINT
-      const int num_elements = rand() % buffer_size;  // NOLINT
-      if (write) {
-        const int buffer_available = buffer_size - buffer_consumed;
-        ASSERT_EQ(static_cast<size_t>(buffer_available),
-                  WebRtc_available_write(buffer.get()));
-        const int expected_elements = std::min(num_elements, buffer_available);
-        write_element = SetIncrementingData(write_data.get(), expected_elements,
-                                     write_element);
-        ASSERT_EQ(static_cast<size_t>(expected_elements),
-                  WebRtc_WriteBuffer(buffer.get(), write_data.get(),
-                                     num_elements));
-        buffer_consumed = std::min(buffer_consumed + expected_elements,
-                                   buffer_size);
-      } else {
-        const int expected_elements = std::min(num_elements,
-                                               buffer_consumed);
-        ASSERT_EQ(static_cast<size_t>(buffer_consumed),
-                  WebRtc_available_read(buffer.get()));
-        ASSERT_EQ(static_cast<size_t>(expected_elements),
-                  WebRtc_ReadBuffer(buffer.get(),
-                                    reinterpret_cast<void**>(data_ptr),
-                                    read_data.get(),
-                                    num_elements));
-        int* check_ptr = read_data.get();
-        if (data_ptr) {
-          check_ptr = *data_ptr;
-        }
-        read_element = CheckIncrementingData(check_ptr, expected_elements,
-                                             read_element);
-        buffer_consumed = std::max(buffer_consumed - expected_elements, 0);
-      }
-    }
-  }
-}
-
-TEST(RingBufferTest, RandomStressTest) {
-  int* data_ptr = nullptr;
-  RandomStressTest(&data_ptr);
-}
-
-TEST(RingBufferTest, RandomStressTestWithNullPtr) {
-  RandomStressTest(nullptr);
-}
-
-TEST(RingBufferTest, PassingNulltoReadBufferForcesMemcpy) {
-  const size_t kDataSize = 2;
-  int write_data[kDataSize];
-  int read_data[kDataSize];
-  int* data_ptr;
-
-  scoped_ring_buffer buffer(WebRtc_CreateBuffer(kDataSize, sizeof(int)));
-  ASSERT_TRUE(buffer.get() != nullptr);
-  WebRtc_InitBuffer(buffer.get());
-
-  SetIncrementingData(write_data, kDataSize, 0);
-  EXPECT_EQ(kDataSize, WebRtc_WriteBuffer(buffer.get(), write_data, kDataSize));
-  SetIncrementingData(read_data, kDataSize, kDataSize);
-  EXPECT_EQ(kDataSize, WebRtc_ReadBuffer(buffer.get(),
-      reinterpret_cast<void**>(&data_ptr), read_data, kDataSize));
-  // Copying was not necessary, so |read_data| has not been updated.
-  CheckIncrementingData(data_ptr, kDataSize, 0);
-  CheckIncrementingData(read_data, kDataSize, kDataSize);
-
-  EXPECT_EQ(kDataSize, WebRtc_WriteBuffer(buffer.get(), write_data, kDataSize));
-  EXPECT_EQ(kDataSize,
-            WebRtc_ReadBuffer(buffer.get(), nullptr, read_data, kDataSize));
-  // Passing null forces a memcpy, so |read_data| is now updated.
-  CheckIncrementingData(read_data, kDataSize, 0);
-}
-
-TEST(RingBufferTest, CreateHandlesErrors) {
-  EXPECT_TRUE(WebRtc_CreateBuffer(0, 1) == nullptr);
-  EXPECT_TRUE(WebRtc_CreateBuffer(1, 0) == nullptr);
-  RingBuffer* buffer = WebRtc_CreateBuffer(1, 1);
-  EXPECT_TRUE(buffer != nullptr);
-  WebRtc_FreeBuffer(buffer);
-}
-
-}  // namespace webrtc
diff --git a/common_audio/signal_processing/auto_corr_to_refl_coef.c b/common_audio/signal_processing/auto_corr_to_refl_coef.c
deleted file mode 100644
index f99dd62..0000000
--- a/common_audio/signal_processing/auto_corr_to_refl_coef.c
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-
-/*
- * This file contains the function WebRtcSpl_AutoCorrToReflCoef().
- * The description header can be found in signal_processing_library.h
- *
- */
-
-#include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
-
-void WebRtcSpl_AutoCorrToReflCoef(const int32_t *R, int use_order, int16_t *K)
-{
-    int i, n;
-    int16_t tmp;
-    const int32_t *rptr;
-    int32_t L_num, L_den;
-    int16_t *acfptr, *pptr, *wptr, *p1ptr, *w1ptr, ACF[WEBRTC_SPL_MAX_LPC_ORDER],
-            P[WEBRTC_SPL_MAX_LPC_ORDER], W[WEBRTC_SPL_MAX_LPC_ORDER];
-
-    // Initialize loop and pointers.
-    acfptr = ACF;
-    rptr = R;
-    pptr = P;
-    p1ptr = &P[1];
-    w1ptr = &W[1];
-    wptr = w1ptr;
-
-    // First loop; n=0. Determine shifting.
-    tmp = WebRtcSpl_NormW32(*R);
-    *acfptr = (int16_t)((*rptr++ << tmp) >> 16);
-    *pptr++ = *acfptr++;
-
-    // Initialize ACF, P and W.
-    for (i = 1; i <= use_order; i++)
-    {
-        *acfptr = (int16_t)((*rptr++ << tmp) >> 16);
-        *wptr++ = *acfptr;
-        *pptr++ = *acfptr++;
-    }
-
-    // Compute reflection coefficients.
-    for (n = 1; n <= use_order; n++, K++)
-    {
-        tmp = WEBRTC_SPL_ABS_W16(*p1ptr);
-        if (*P < tmp)
-        {
-            for (i = n; i <= use_order; i++)
-                *K++ = 0;
-
-            return;
-        }
-
-        // Division: WebRtcSpl_div(tmp, *P)
-        *K = 0;
-        if (tmp != 0)
-        {
-            L_num = tmp;
-            L_den = *P;
-            i = 15;
-            while (i--)
-            {
-                (*K) <<= 1;
-                L_num <<= 1;
-                if (L_num >= L_den)
-                {
-                    L_num -= L_den;
-                    (*K)++;
-                }
-            }
-            if (*p1ptr > 0)
-                *K = -*K;
-        }
-
-        // Last iteration; don't do Schur recursion.
-        if (n == use_order)
-            return;
-
-        // Schur recursion.
-        pptr = P;
-        wptr = w1ptr;
-        tmp = (int16_t)(((int32_t)*p1ptr * (int32_t)*K + 16384) >> 15);
-        *pptr = WebRtcSpl_AddSatW16(*pptr, tmp);
-        pptr++;
-        for (i = 1; i <= use_order - n; i++)
-        {
-            tmp = (int16_t)(((int32_t)*wptr * (int32_t)*K + 16384) >> 15);
-            *pptr = WebRtcSpl_AddSatW16(*(pptr + 1), tmp);
-            pptr++;
-            tmp = (int16_t)(((int32_t)*pptr * (int32_t)*K + 16384) >> 15);
-            *wptr = WebRtcSpl_AddSatW16(*wptr, tmp);
-            wptr++;
-        }
-    }
-}
diff --git a/common_audio/signal_processing/auto_correlation.c b/common_audio/signal_processing/auto_correlation.c
deleted file mode 100644
index 8b99e82..0000000
--- a/common_audio/signal_processing/auto_correlation.c
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- *  Copyright (c) 2012 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/common_audio/signal_processing/include/signal_processing_library.h"
-
-#include "webrtc/rtc_base/checks.h"
-
-size_t WebRtcSpl_AutoCorrelation(const int16_t* in_vector,
-                                 size_t in_vector_length,
-                                 size_t order,
-                                 int32_t* result,
-                                 int* scale) {
-  int32_t sum = 0;
-  size_t i = 0, j = 0;
-  int16_t smax = 0;
-  int scaling = 0;
-
-  RTC_DCHECK_LE(order, in_vector_length);
-
-  // Find the maximum absolute value of the samples.
-  smax = WebRtcSpl_MaxAbsValueW16(in_vector, in_vector_length);
-
-  // In order to avoid overflow when computing the sum we should scale the
-  // samples so that (in_vector_length * smax * smax) will not overflow.
-  if (smax == 0) {
-    scaling = 0;
-  } else {
-    // Number of bits in the sum loop.
-    int nbits = WebRtcSpl_GetSizeInBits((uint32_t)in_vector_length);
-    // Number of bits to normalize smax.
-    int t = WebRtcSpl_NormW32(WEBRTC_SPL_MUL(smax, smax));
-
-    if (t > nbits) {
-      scaling = 0;
-    } else {
-      scaling = nbits - t;
-    }
-  }
-
-  // Perform the actual correlation calculation.
-  for (i = 0; i < order + 1; i++) {
-    sum = 0;
-    /* Unroll the loop to improve performance. */
-    for (j = 0; i + j + 3 < in_vector_length; j += 4) {
-      sum += (in_vector[j + 0] * in_vector[i + j + 0]) >> scaling;
-      sum += (in_vector[j + 1] * in_vector[i + j + 1]) >> scaling;
-      sum += (in_vector[j + 2] * in_vector[i + j + 2]) >> scaling;
-      sum += (in_vector[j + 3] * in_vector[i + j + 3]) >> scaling;
-    }
-    for (; j < in_vector_length - i; j++) {
-      sum += (in_vector[j] * in_vector[i + j]) >> scaling;
-    }
-    *result++ = sum;
-  }
-
-  *scale = scaling;
-  return order + 1;
-}
diff --git a/common_audio/signal_processing/complex_bit_reverse.c b/common_audio/signal_processing/complex_bit_reverse.c
deleted file mode 100644
index c8bd2dc..0000000
--- a/common_audio/signal_processing/complex_bit_reverse.c
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- *  Copyright (c) 2012 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/common_audio/signal_processing/include/signal_processing_library.h"
-
-/* Tables for data buffer indexes that are bit reversed and thus need to be
- * swapped. Note that, index_7[{0, 2, 4, ...}] are for the left side of the swap
- * operations, while index_7[{1, 3, 5, ...}] are for the right side of the
- * operation. Same for index_8.
- */
-
-/* Indexes for the case of stages == 7. */
-static const int16_t index_7[112] = {
-  1, 64, 2, 32, 3, 96, 4, 16, 5, 80, 6, 48, 7, 112, 9, 72, 10, 40, 11, 104,
-  12, 24, 13, 88, 14, 56, 15, 120, 17, 68, 18, 36, 19, 100, 21, 84, 22, 52,
-  23, 116, 25, 76, 26, 44, 27, 108, 29, 92, 30, 60, 31, 124, 33, 66, 35, 98,
-  37, 82, 38, 50, 39, 114, 41, 74, 43, 106, 45, 90, 46, 58, 47, 122, 49, 70,
-  51, 102, 53, 86, 55, 118, 57, 78, 59, 110, 61, 94, 63, 126, 67, 97, 69,
-  81, 71, 113, 75, 105, 77, 89, 79, 121, 83, 101, 87, 117, 91, 109, 95, 125,
-  103, 115, 111, 123
-};
-
-/* Indexes for the case of stages == 8. */
-static const int16_t index_8[240] = {
-  1, 128, 2, 64, 3, 192, 4, 32, 5, 160, 6, 96, 7, 224, 8, 16, 9, 144, 10, 80,
-  11, 208, 12, 48, 13, 176, 14, 112, 15, 240, 17, 136, 18, 72, 19, 200, 20,
-  40, 21, 168, 22, 104, 23, 232, 25, 152, 26, 88, 27, 216, 28, 56, 29, 184,
-  30, 120, 31, 248, 33, 132, 34, 68, 35, 196, 37, 164, 38, 100, 39, 228, 41,
-  148, 42, 84, 43, 212, 44, 52, 45, 180, 46, 116, 47, 244, 49, 140, 50, 76,
-  51, 204, 53, 172, 54, 108, 55, 236, 57, 156, 58, 92, 59, 220, 61, 188, 62,
-  124, 63, 252, 65, 130, 67, 194, 69, 162, 70, 98, 71, 226, 73, 146, 74, 82,
-  75, 210, 77, 178, 78, 114, 79, 242, 81, 138, 83, 202, 85, 170, 86, 106, 87,
-  234, 89, 154, 91, 218, 93, 186, 94, 122, 95, 250, 97, 134, 99, 198, 101,
-  166, 103, 230, 105, 150, 107, 214, 109, 182, 110, 118, 111, 246, 113, 142,
-  115, 206, 117, 174, 119, 238, 121, 158, 123, 222, 125, 190, 127, 254, 131,
-  193, 133, 161, 135, 225, 137, 145, 139, 209, 141, 177, 143, 241, 147, 201,
-  149, 169, 151, 233, 155, 217, 157, 185, 159, 249, 163, 197, 167, 229, 171,
-  213, 173, 181, 175, 245, 179, 205, 183, 237, 187, 221, 191, 253, 199, 227,
-  203, 211, 207, 243, 215, 235, 223, 251, 239, 247
-};
-
-void WebRtcSpl_ComplexBitReverse(int16_t* __restrict complex_data, int stages) {
-  /* For any specific value of stages, we know exactly the indexes that are
-   * bit reversed. Currently (Feb. 2012) in WebRTC the only possible values of
-   * stages are 7 and 8, so we use tables to save unnecessary iterations and
-   * calculations for these two cases.
-   */
-  if (stages == 7 || stages == 8) {
-    int m = 0;
-    int length = 112;
-    const int16_t* index = index_7;
-
-    if (stages == 8) {
-      length = 240;
-      index = index_8;
-    }
-
-    /* Decimation in time. Swap the elements with bit-reversed indexes. */
-    for (m = 0; m < length; m += 2) {
-      /* We declare a int32_t* type pointer, to load both the 16-bit real
-       * and imaginary elements from complex_data in one instruction, reducing
-       * complexity.
-       */
-      int32_t* complex_data_ptr = (int32_t*)complex_data;
-      int32_t temp = 0;
-
-      temp = complex_data_ptr[index[m]];  /* Real and imaginary */
-      complex_data_ptr[index[m]] = complex_data_ptr[index[m + 1]];
-      complex_data_ptr[index[m + 1]] = temp;
-    }
-  }
-  else {
-    int m = 0, mr = 0, l = 0;
-    int n = 1 << stages;
-    int nn = n - 1;
-
-    /* Decimation in time - re-order data */
-    for (m = 1; m <= nn; ++m) {
-      int32_t* complex_data_ptr = (int32_t*)complex_data;
-      int32_t temp = 0;
-
-      /* Find out indexes that are bit-reversed. */
-      l = n;
-      do {
-        l >>= 1;
-      } while (l > nn - mr);
-      mr = (mr & (l - 1)) + l;
-
-      if (mr <= m) {
-        continue;
-      }
-
-      /* Swap the elements with bit-reversed indexes.
-       * This is similar to the loop in the stages == 7 or 8 cases.
-       */
-      temp = complex_data_ptr[m];  /* Real and imaginary */
-      complex_data_ptr[m] = complex_data_ptr[mr];
-      complex_data_ptr[mr] = temp;
-    }
-  }
-}
diff --git a/common_audio/signal_processing/complex_bit_reverse_arm.S b/common_audio/signal_processing/complex_bit_reverse_arm.S
deleted file mode 100644
index 93de99f..0000000
--- a/common_audio/signal_processing/complex_bit_reverse_arm.S
+++ /dev/null
@@ -1,119 +0,0 @@
-@
-@ Copyright (c) 2012 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.
-@
-
-@ This file contains the function WebRtcSpl_ComplexBitReverse(), optimized
-@ for ARMv5 platforms.
-@ Reference C code is in file complex_bit_reverse.c. Bit-exact.
-
-#include "webrtc/system_wrappers/include/asm_defines.h"
-
-GLOBAL_FUNCTION WebRtcSpl_ComplexBitReverse
-.align  2
-DEFINE_FUNCTION WebRtcSpl_ComplexBitReverse
-  push {r4-r7}
-
-  cmp r1, #7
-  adr r3, index_7                 @ Table pointer.
-  mov r4, #112                    @ Number of interations.
-  beq PRE_LOOP_STAGES_7_OR_8
-
-  cmp r1, #8
-  adr r3, index_8                 @ Table pointer.
-  mov r4, #240                    @ Number of interations.
-  beq PRE_LOOP_STAGES_7_OR_8
-
-  mov r3, #1                      @ Initialize m.
-  mov r1, r3, asl r1              @ n = 1 << stages;
-  subs r6, r1, #1                 @ nn = n - 1;
-  ble END
-
-  mov r5, r0                      @ &complex_data
-  mov r4, #0                      @ ml
-
-LOOP_GENERIC:
-  rsb r12, r4, r6                 @ l > nn - mr
-  mov r2, r1                      @ n
-
-LOOP_SHIFT:
-  asr r2, #1                      @ l >>= 1;
-  cmp r2, r12
-  bgt LOOP_SHIFT
-
-  sub r12, r2, #1
-  and r4, r12, r4
-  add r4, r2                      @ mr = (mr & (l - 1)) + l;
-  cmp r4, r3                      @ mr <= m ?
-  ble UPDATE_REGISTERS
-
-  mov r12, r4, asl #2
-  ldr r7, [r5, #4]                @ complex_data[2 * m, 2 * m + 1].
-                                  @   Offset 4 due to m incrementing from 1.
-  ldr r2, [r0, r12]               @ complex_data[2 * mr, 2 * mr + 1].
-  str r7, [r0, r12]
-  str r2, [r5, #4]
-
-UPDATE_REGISTERS:
-  add r3, r3, #1
-  add r5, #4
-  cmp r3, r1
-  bne LOOP_GENERIC
-
-  b END
-
-PRE_LOOP_STAGES_7_OR_8:
-  add r4, r3, r4, asl #1
-
-LOOP_STAGES_7_OR_8:
-  ldrsh r2, [r3], #2              @ index[m]
-  ldrsh r5, [r3], #2              @ index[m + 1]
-  ldr r1, [r0, r2]                @ complex_data[index[m], index[m] + 1]
-  ldr r12, [r0, r5]               @ complex_data[index[m + 1], index[m + 1] + 1]
-  cmp r3, r4
-  str r1, [r0, r5]
-  str r12, [r0, r2]
-  bne LOOP_STAGES_7_OR_8
-
-END:
-  pop {r4-r7}
-  bx lr
-
-@ The index tables. Note the values are doubles of the actual indexes for 16-bit
-@ elements, different from the generic C code. It actually provides byte offsets
-@ for the indexes.
-
-.align  2
-index_7:  @ Indexes for stages == 7.
-  .short 4, 256, 8, 128, 12, 384, 16, 64, 20, 320, 24, 192, 28, 448, 36, 288
-  .short 40, 160, 44, 416, 48, 96, 52, 352, 56, 224, 60, 480, 68, 272, 72, 144
-  .short 76, 400, 84, 336, 88, 208, 92, 464, 100, 304, 104, 176, 108, 432, 116
-  .short 368, 120, 240, 124, 496, 132, 264, 140, 392, 148, 328, 152, 200, 156
-  .short 456, 164, 296, 172, 424, 180, 360, 184, 232, 188, 488, 196, 280, 204
-  .short 408, 212, 344, 220, 472, 228, 312, 236, 440, 244, 376, 252, 504, 268
-  .short 388, 276, 324, 284, 452, 300, 420, 308, 356, 316, 484, 332, 404, 348
-  .short 468, 364, 436, 380, 500, 412, 460, 444, 492
-
-index_8:  @ Indexes for stages == 8.
-  .short 4, 512, 8, 256, 12, 768, 16, 128, 20, 640, 24, 384, 28, 896, 32, 64
-  .short 36, 576, 40, 320, 44, 832, 48, 192, 52, 704, 56, 448, 60, 960, 68, 544
-  .short 72, 288, 76, 800, 80, 160, 84, 672, 88, 416, 92, 928, 100, 608, 104
-  .short 352, 108, 864, 112, 224, 116, 736, 120, 480, 124, 992, 132, 528, 136
-  .short 272, 140, 784, 148, 656, 152, 400, 156, 912, 164, 592, 168, 336, 172
-  .short 848, 176, 208, 180, 720, 184, 464, 188, 976, 196, 560, 200, 304, 204
-  .short 816, 212, 688, 216, 432, 220, 944, 228, 624, 232, 368, 236, 880, 244
-  .short 752, 248, 496, 252, 1008, 260, 520, 268, 776, 276, 648, 280, 392, 284
-  .short 904, 292, 584, 296, 328, 300, 840, 308, 712, 312, 456, 316, 968, 324
-  .short 552, 332, 808, 340, 680, 344, 424, 348, 936, 356, 616, 364, 872, 372
-  .short 744, 376, 488, 380, 1000, 388, 536, 396, 792, 404, 664, 412, 920, 420
-  .short 600, 428, 856, 436, 728, 440, 472, 444, 984, 452, 568, 460, 824, 468
-  .short 696, 476, 952, 484, 632, 492, 888, 500, 760, 508, 1016, 524, 772, 532
-  .short 644, 540, 900, 548, 580, 556, 836, 564, 708, 572, 964, 588, 804, 596
-  .short 676, 604, 932, 620, 868, 628, 740, 636, 996, 652, 788, 668, 916, 684
-  .short 852, 692, 724, 700, 980, 716, 820, 732, 948, 748, 884, 764, 1012, 796
-  .short 908, 812, 844, 828, 972, 860, 940, 892, 1004, 956, 988
diff --git a/common_audio/signal_processing/complex_bit_reverse_mips.c b/common_audio/signal_processing/complex_bit_reverse_mips.c
deleted file mode 100644
index 583fe4f..0000000
--- a/common_audio/signal_processing/complex_bit_reverse_mips.c
+++ /dev/null
@@ -1,176 +0,0 @@
-/*
- *  Copyright (c) 2013 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/common_audio/signal_processing/include/signal_processing_library.h"
-
-static int16_t coefTable_7[] = {
-    4, 256,   8, 128,  12, 384,  16,  64,
-   20, 320,  24, 192,  28, 448,  36, 288,
-   40, 160,  44, 416,  48,  96,  52, 352,
-   56, 224,  60, 480,  68, 272,  72, 144,
-   76, 400,  84, 336,  88, 208,  92, 464,
-  100, 304, 104, 176, 108, 432, 116, 368,
-  120, 240, 124, 496, 132, 264, 140, 392,
-  148, 328, 152, 200, 156, 456, 164, 296,
-  172, 424, 180, 360, 184, 232, 188, 488,
-  196, 280, 204, 408, 212, 344, 220, 472,
-  228, 312, 236, 440, 244, 376, 252, 504,
-  268, 388, 276, 324, 284, 452, 300, 420,
-  308, 356, 316, 484, 332, 404, 348, 468,
-  364, 436, 380, 500, 412, 460, 444, 492
-};
-
-static int16_t coefTable_8[] = {
-    4,  512,    8,  256,   12,  768,   16,  128,
-   20,  640,   24,  384,   28,  896,   32,   64,
-   36,  576,   40,  320,   44,  832,   48,  192,
-   52,  704,   56,  448,   60,  960,   68,  544,
-   72,  288,   76,  800,   80,  160,   84,  672,
-   88,  416,   92,  928,  100,  608,  104,  352,
-  108,  864,  112,  224,  116,  736,  120,  480,
-  124,  992,  132,  528,  136,  272,  140,  784,
-  148,  656,  152,  400,  156,  912,  164,  592,
-  168,  336,  172,  848,  176,  208,  180,  720,
-  184,  464,  188,  976,  196,  560,  200,  304,
-  204,  816,  212,  688,  216,  432,  220,  944,
-  228,  624,  232,  368,  236,  880,  244,  752,
-  248,  496,  252, 1008,  260,  520,  268,  776,
-  276,  648,  280,  392,  284,  904,  292,  584,
-  296,  328,  300,  840,  308,  712,  312,  456,
-  316,  968,  324,  552,  332,  808,  340,  680,
-  344,  424,  348,  936,  356,  616,  364,  872,
-  372,  744,  376,  488,  380, 1000,  388,  536,
-  396,  792,  404,  664,  412,  920,  420,  600,
-  428,  856,  436,  728,  440,  472,  444,  984,
-  452,  568,  460,  824,  468,  696,  476,  952,
-  484,  632,  492,  888,  500,  760,  508, 1016,
-  524,  772,  532,  644,  540,  900,  548,  580,
-  556,  836,  564,  708,  572,  964,  588,  804,
-  596,  676,  604,  932,  620,  868,  628,  740,
-  636,  996,  652,  788,  668,  916,  684,  852,
-  692,  724,  700,  980,  716,  820,  732,  948,
-  748,  884,  764, 1012,  796,  908,  812,  844,
-  828,  972,  860,  940,  892, 1004,  956,  988
-};
-
-void WebRtcSpl_ComplexBitReverse(int16_t frfi[], int stages) {
-  int l;
-  int16_t tr, ti;
-  int32_t tmp1, tmp2, tmp3, tmp4;
-  int32_t* ptr_i;
-  int32_t* ptr_j;
-
-  if (stages == 8) {
-    int16_t* pcoeftable_8 = coefTable_8;
-
-    __asm __volatile (
-      ".set         push                                             \n\t"
-      ".set         noreorder                                        \n\t"
-      "addiu        %[l],            $zero,               120        \n\t"
-     "1:                                                             \n\t"
-      "addiu        %[l],            %[l],                -4         \n\t"
-      "lh           %[tr],           0(%[pcoeftable_8])              \n\t"
-      "lh           %[ti],           2(%[pcoeftable_8])              \n\t"
-      "lh           %[tmp3],         4(%[pcoeftable_8])              \n\t"
-      "lh           %[tmp4],         6(%[pcoeftable_8])              \n\t"
-      "addu         %[ptr_i],        %[frfi],             %[tr]      \n\t"
-      "addu         %[ptr_j],        %[frfi],             %[ti]      \n\t"
-      "addu         %[tr],           %[frfi],             %[tmp3]    \n\t"
-      "addu         %[ti],           %[frfi],             %[tmp4]    \n\t"
-      "ulw          %[tmp1],         0(%[ptr_i])                     \n\t"
-      "ulw          %[tmp2],         0(%[ptr_j])                     \n\t"
-      "ulw          %[tmp3],         0(%[tr])                        \n\t"
-      "ulw          %[tmp4],         0(%[ti])                        \n\t"
-      "usw          %[tmp1],         0(%[ptr_j])                     \n\t"
-      "usw          %[tmp2],         0(%[ptr_i])                     \n\t"
-      "usw          %[tmp4],         0(%[tr])                        \n\t"
-      "usw          %[tmp3],         0(%[ti])                        \n\t"
-      "lh           %[tmp1],         8(%[pcoeftable_8])              \n\t"
-      "lh           %[tmp2],         10(%[pcoeftable_8])             \n\t"
-      "lh           %[tr],           12(%[pcoeftable_8])             \n\t"
-      "lh           %[ti],           14(%[pcoeftable_8])             \n\t"
-      "addu         %[ptr_i],        %[frfi],             %[tmp1]    \n\t"
-      "addu         %[ptr_j],        %[frfi],             %[tmp2]    \n\t"
-      "addu         %[tr],           %[frfi],             %[tr]      \n\t"
-      "addu         %[ti],           %[frfi],             %[ti]      \n\t"
-      "ulw          %[tmp1],         0(%[ptr_i])                     \n\t"
-      "ulw          %[tmp2],         0(%[ptr_j])                     \n\t"
-      "ulw          %[tmp3],         0(%[tr])                        \n\t"
-      "ulw          %[tmp4],         0(%[ti])                        \n\t"
-      "usw          %[tmp1],         0(%[ptr_j])                     \n\t"
-      "usw          %[tmp2],         0(%[ptr_i])                     \n\t"
-      "usw          %[tmp4],         0(%[tr])                        \n\t"
-      "usw          %[tmp3],         0(%[ti])                        \n\t"
-      "bgtz         %[l],            1b                              \n\t"
-      " addiu       %[pcoeftable_8], %[pcoeftable_8],     16         \n\t"
-      ".set         pop                                              \n\t"
-
-      : [tmp1] "=&r" (tmp1), [tmp2] "=&r" (tmp2), [ptr_i] "=&r" (ptr_i),
-        [ptr_j] "=&r" (ptr_j), [tr] "=&r" (tr), [l] "=&r" (l),
-        [tmp3] "=&r" (tmp3), [pcoeftable_8] "+r" (pcoeftable_8),
-        [ti] "=&r" (ti), [tmp4] "=&r" (tmp4)
-      : [frfi] "r" (frfi)
-      : "memory"
-    );
-  } else if (stages == 7) {
-    int16_t* pcoeftable_7 = coefTable_7;
-
-    __asm __volatile (
-      ".set push                                                     \n\t"
-      ".set noreorder                                                \n\t"
-      "addiu        %[l],            $zero,               56         \n\t"
-     "1:                                                             \n\t"
-      "addiu        %[l],            %[l],                -4         \n\t"
-      "lh           %[tr],           0(%[pcoeftable_7])              \n\t"
-      "lh           %[ti],           2(%[pcoeftable_7])              \n\t"
-      "lh           %[tmp3],         4(%[pcoeftable_7])              \n\t"
-      "lh           %[tmp4],         6(%[pcoeftable_7])              \n\t"
-      "addu         %[ptr_i],        %[frfi],             %[tr]      \n\t"
-      "addu         %[ptr_j],        %[frfi],             %[ti]      \n\t"
-      "addu         %[tr],           %[frfi],             %[tmp3]    \n\t"
-      "addu         %[ti],           %[frfi],             %[tmp4]    \n\t"
-      "ulw          %[tmp1],         0(%[ptr_i])                     \n\t"
-      "ulw          %[tmp2],         0(%[ptr_j])                     \n\t"
-      "ulw          %[tmp3],         0(%[tr])                        \n\t"
-      "ulw          %[tmp4],         0(%[ti])                        \n\t"
-      "usw          %[tmp1],         0(%[ptr_j])                     \n\t"
-      "usw          %[tmp2],         0(%[ptr_i])                     \n\t"
-      "usw          %[tmp4],         0(%[tr])                        \n\t"
-      "usw          %[tmp3],         0(%[ti])                        \n\t"
-      "lh           %[tmp1],         8(%[pcoeftable_7])              \n\t"
-      "lh           %[tmp2],         10(%[pcoeftable_7])             \n\t"
-      "lh           %[tr],           12(%[pcoeftable_7])             \n\t"
-      "lh           %[ti],           14(%[pcoeftable_7])             \n\t"
-      "addu         %[ptr_i],        %[frfi],             %[tmp1]    \n\t"
-      "addu         %[ptr_j],        %[frfi],             %[tmp2]    \n\t"
-      "addu         %[tr],           %[frfi],             %[tr]      \n\t"
-      "addu         %[ti],           %[frfi],             %[ti]      \n\t"
-      "ulw          %[tmp1],         0(%[ptr_i])                     \n\t"
-      "ulw          %[tmp2],         0(%[ptr_j])                     \n\t"
-      "ulw          %[tmp3],         0(%[tr])                        \n\t"
-      "ulw          %[tmp4],         0(%[ti])                        \n\t"
-      "usw          %[tmp1],         0(%[ptr_j])                     \n\t"
-      "usw          %[tmp2],         0(%[ptr_i])                     \n\t"
-      "usw          %[tmp4],         0(%[tr])                        \n\t"
-      "usw          %[tmp3],         0(%[ti])                        \n\t"
-      "bgtz         %[l],            1b                              \n\t"
-      " addiu       %[pcoeftable_7], %[pcoeftable_7],     16         \n\t"
-      ".set pop                                                      \n\t"
-
-      : [tmp1] "=&r" (tmp1), [tmp2] "=&r" (tmp2), [ptr_i] "=&r" (ptr_i),
-        [ptr_j] "=&r" (ptr_j), [ti] "=&r" (ti), [tr] "=&r" (tr),
-        [l] "=&r" (l), [pcoeftable_7] "+r" (pcoeftable_7),
-        [tmp3] "=&r" (tmp3), [tmp4] "=&r" (tmp4)
-      : [frfi] "r" (frfi)
-      : "memory"
-    );
-  }
-}
diff --git a/common_audio/signal_processing/complex_fft.c b/common_audio/signal_processing/complex_fft.c
deleted file mode 100644
index 97ebacc..0000000
--- a/common_audio/signal_processing/complex_fft.c
+++ /dev/null
@@ -1,298 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-
-/*
- * This file contains the function WebRtcSpl_ComplexFFT().
- * The description header can be found in signal_processing_library.h
- *
- */
-
-#include "webrtc/common_audio/signal_processing/complex_fft_tables.h"
-#include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
-
-#define CFFTSFT 14
-#define CFFTRND 1
-#define CFFTRND2 16384
-
-#define CIFFTSFT 14
-#define CIFFTRND 1
-
-
-int WebRtcSpl_ComplexFFT(int16_t frfi[], int stages, int mode)
-{
-    int i, j, l, k, istep, n, m;
-    int16_t wr, wi;
-    int32_t tr32, ti32, qr32, qi32;
-
-    /* The 1024-value is a constant given from the size of kSinTable1024[],
-     * and should not be changed depending on the input parameter 'stages'
-     */
-    n = 1 << stages;
-    if (n > 1024)
-        return -1;
-
-    l = 1;
-    k = 10 - 1; /* Constant for given kSinTable1024[]. Do not change
-         depending on the input parameter 'stages' */
-
-    if (mode == 0)
-    {
-        // mode==0: Low-complexity and Low-accuracy mode
-        while (l < n)
-        {
-            istep = l << 1;
-
-            for (m = 0; m < l; ++m)
-            {
-                j = m << k;
-
-                /* The 256-value is a constant given as 1/4 of the size of
-                 * kSinTable1024[], and should not be changed depending on the input
-                 * parameter 'stages'. It will result in 0 <= j < N_SINE_WAVE/2
-                 */
-                wr = kSinTable1024[j + 256];
-                wi = -kSinTable1024[j];
-
-                for (i = m; i < n; i += istep)
-                {
-                    j = i + l;
-
-                    tr32 = (wr * frfi[2 * j] - wi * frfi[2 * j + 1]) >> 15;
-
-                    ti32 = (wr * frfi[2 * j + 1] + wi * frfi[2 * j]) >> 15;
-
-                    qr32 = (int32_t)frfi[2 * i];
-                    qi32 = (int32_t)frfi[2 * i + 1];
-                    frfi[2 * j] = (int16_t)((qr32 - tr32) >> 1);
-                    frfi[2 * j + 1] = (int16_t)((qi32 - ti32) >> 1);
-                    frfi[2 * i] = (int16_t)((qr32 + tr32) >> 1);
-                    frfi[2 * i + 1] = (int16_t)((qi32 + ti32) >> 1);
-                }
-            }
-
-            --k;
-            l = istep;
-
-        }
-
-    } else
-    {
-        // mode==1: High-complexity and High-accuracy mode
-        while (l < n)
-        {
-            istep = l << 1;
-
-            for (m = 0; m < l; ++m)
-            {
-                j = m << k;
-
-                /* The 256-value is a constant given as 1/4 of the size of
-                 * kSinTable1024[], and should not be changed depending on the input
-                 * parameter 'stages'. It will result in 0 <= j < N_SINE_WAVE/2
-                 */
-                wr = kSinTable1024[j + 256];
-                wi = -kSinTable1024[j];
-
-#ifdef WEBRTC_ARCH_ARM_V7
-                int32_t wri = 0;
-                __asm __volatile("pkhbt %0, %1, %2, lsl #16" : "=r"(wri) :
-                    "r"((int32_t)wr), "r"((int32_t)wi));
-#endif
-
-                for (i = m; i < n; i += istep)
-                {
-                    j = i + l;
-
-#ifdef WEBRTC_ARCH_ARM_V7
-                    register int32_t frfi_r;
-                    __asm __volatile(
-                        "pkhbt %[frfi_r], %[frfi_even], %[frfi_odd],"
-                        " lsl #16\n\t"
-                        "smlsd %[tr32], %[wri], %[frfi_r], %[cfftrnd]\n\t"
-                        "smladx %[ti32], %[wri], %[frfi_r], %[cfftrnd]\n\t"
-                        :[frfi_r]"=&r"(frfi_r),
-                         [tr32]"=&r"(tr32),
-                         [ti32]"=r"(ti32)
-                        :[frfi_even]"r"((int32_t)frfi[2*j]),
-                         [frfi_odd]"r"((int32_t)frfi[2*j +1]),
-                         [wri]"r"(wri),
-                         [cfftrnd]"r"(CFFTRND));
-#else
-                    tr32 = wr * frfi[2 * j] - wi * frfi[2 * j + 1] + CFFTRND;
-
-                    ti32 = wr * frfi[2 * j + 1] + wi * frfi[2 * j] + CFFTRND;
-#endif
-
-                    tr32 >>= 15 - CFFTSFT;
-                    ti32 >>= 15 - CFFTSFT;
-
-                    qr32 = ((int32_t)frfi[2 * i]) << CFFTSFT;
-                    qi32 = ((int32_t)frfi[2 * i + 1]) << CFFTSFT;
-
-                    frfi[2 * j] = (int16_t)(
-                        (qr32 - tr32 + CFFTRND2) >> (1 + CFFTSFT));
-                    frfi[2 * j + 1] = (int16_t)(
-                        (qi32 - ti32 + CFFTRND2) >> (1 + CFFTSFT));
-                    frfi[2 * i] = (int16_t)(
-                        (qr32 + tr32 + CFFTRND2) >> (1 + CFFTSFT));
-                    frfi[2 * i + 1] = (int16_t)(
-                        (qi32 + ti32 + CFFTRND2) >> (1 + CFFTSFT));
-                }
-            }
-
-            --k;
-            l = istep;
-        }
-    }
-    return 0;
-}
-
-int WebRtcSpl_ComplexIFFT(int16_t frfi[], int stages, int mode)
-{
-    size_t i, j, l, istep, n, m;
-    int k, scale, shift;
-    int16_t wr, wi;
-    int32_t tr32, ti32, qr32, qi32;
-    int32_t tmp32, round2;
-
-    /* The 1024-value is a constant given from the size of kSinTable1024[],
-     * and should not be changed depending on the input parameter 'stages'
-     */
-    n = 1 << stages;
-    if (n > 1024)
-        return -1;
-
-    scale = 0;
-
-    l = 1;
-    k = 10 - 1; /* Constant for given kSinTable1024[]. Do not change
-         depending on the input parameter 'stages' */
-
-    while (l < n)
-    {
-        // variable scaling, depending upon data
-        shift = 0;
-        round2 = 8192;
-
-        tmp32 = WebRtcSpl_MaxAbsValueW16(frfi, 2 * n);
-        if (tmp32 > 13573)
-        {
-            shift++;
-            scale++;
-            round2 <<= 1;
-        }
-        if (tmp32 > 27146)
-        {
-            shift++;
-            scale++;
-            round2 <<= 1;
-        }
-
-        istep = l << 1;
-
-        if (mode == 0)
-        {
-            // mode==0: Low-complexity and Low-accuracy mode
-            for (m = 0; m < l; ++m)
-            {
-                j = m << k;
-
-                /* The 256-value is a constant given as 1/4 of the size of
-                 * kSinTable1024[], and should not be changed depending on the input
-                 * parameter 'stages'. It will result in 0 <= j < N_SINE_WAVE/2
-                 */
-                wr = kSinTable1024[j + 256];
-                wi = kSinTable1024[j];
-
-                for (i = m; i < n; i += istep)
-                {
-                    j = i + l;
-
-                    tr32 = (wr * frfi[2 * j] - wi * frfi[2 * j + 1]) >> 15;
-
-                    ti32 = (wr * frfi[2 * j + 1] + wi * frfi[2 * j]) >> 15;
-
-                    qr32 = (int32_t)frfi[2 * i];
-                    qi32 = (int32_t)frfi[2 * i + 1];
-                    frfi[2 * j] = (int16_t)((qr32 - tr32) >> shift);
-                    frfi[2 * j + 1] = (int16_t)((qi32 - ti32) >> shift);
-                    frfi[2 * i] = (int16_t)((qr32 + tr32) >> shift);
-                    frfi[2 * i + 1] = (int16_t)((qi32 + ti32) >> shift);
-                }
-            }
-        } else
-        {
-            // mode==1: High-complexity and High-accuracy mode
-
-            for (m = 0; m < l; ++m)
-            {
-                j = m << k;
-
-                /* The 256-value is a constant given as 1/4 of the size of
-                 * kSinTable1024[], and should not be changed depending on the input
-                 * parameter 'stages'. It will result in 0 <= j < N_SINE_WAVE/2
-                 */
-                wr = kSinTable1024[j + 256];
-                wi = kSinTable1024[j];
-
-#ifdef WEBRTC_ARCH_ARM_V7
-                int32_t wri = 0;
-                __asm __volatile("pkhbt %0, %1, %2, lsl #16" : "=r"(wri) :
-                    "r"((int32_t)wr), "r"((int32_t)wi));
-#endif
-
-                for (i = m; i < n; i += istep)
-                {
-                    j = i + l;
-
-#ifdef WEBRTC_ARCH_ARM_V7
-                    register int32_t frfi_r;
-                    __asm __volatile(
-                      "pkhbt %[frfi_r], %[frfi_even], %[frfi_odd], lsl #16\n\t"
-                      "smlsd %[tr32], %[wri], %[frfi_r], %[cifftrnd]\n\t"
-                      "smladx %[ti32], %[wri], %[frfi_r], %[cifftrnd]\n\t"
-                      :[frfi_r]"=&r"(frfi_r),
-                       [tr32]"=&r"(tr32),
-                       [ti32]"=r"(ti32)
-                      :[frfi_even]"r"((int32_t)frfi[2*j]),
-                       [frfi_odd]"r"((int32_t)frfi[2*j +1]),
-                       [wri]"r"(wri),
-                       [cifftrnd]"r"(CIFFTRND)
-                    );
-#else
-
-                    tr32 = wr * frfi[2 * j] - wi * frfi[2 * j + 1] + CIFFTRND;
-
-                    ti32 = wr * frfi[2 * j + 1] + wi * frfi[2 * j] + CIFFTRND;
-#endif
-                    tr32 >>= 15 - CIFFTSFT;
-                    ti32 >>= 15 - CIFFTSFT;
-
-                    qr32 = ((int32_t)frfi[2 * i]) << CIFFTSFT;
-                    qi32 = ((int32_t)frfi[2 * i + 1]) << CIFFTSFT;
-
-                    frfi[2 * j] = (int16_t)(
-                        (qr32 - tr32 + round2) >> (shift + CIFFTSFT));
-                    frfi[2 * j + 1] = (int16_t)(
-                        (qi32 - ti32 + round2) >> (shift + CIFFTSFT));
-                    frfi[2 * i] = (int16_t)(
-                        (qr32 + tr32 + round2) >> (shift + CIFFTSFT));
-                    frfi[2 * i + 1] = (int16_t)(
-                        (qi32 + ti32 + round2) >> (shift + CIFFTSFT));
-                }
-            }
-
-        }
-        --k;
-        l = istep;
-    }
-    return scale;
-}
diff --git a/common_audio/signal_processing/complex_fft_mips.c b/common_audio/signal_processing/complex_fft_mips.c
deleted file mode 100644
index 34c4f23..0000000
--- a/common_audio/signal_processing/complex_fft_mips.c
+++ /dev/null
@@ -1,328 +0,0 @@
-/*
- *  Copyright (c) 2013 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/common_audio/signal_processing/complex_fft_tables.h"
-#include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
-
-#define CFFTSFT 14
-#define CFFTRND 1
-#define CFFTRND2 16384
-
-#define CIFFTSFT 14
-#define CIFFTRND 1
-
-int WebRtcSpl_ComplexFFT(int16_t frfi[], int stages, int mode) {
-  int i = 0;
-  int l = 0;
-  int k = 0;
-  int istep = 0;
-  int n = 0;
-  int m = 0;
-  int32_t wr = 0, wi = 0;
-  int32_t tmp1 = 0;
-  int32_t tmp2 = 0;
-  int32_t tmp3 = 0;
-  int32_t tmp4 = 0;
-  int32_t tmp5 = 0;
-  int32_t tmp6 = 0;
-  int32_t tmp = 0;
-  int16_t* ptr_j = NULL;
-  int16_t* ptr_i = NULL;
-
-  n = 1 << stages;
-  if (n > 1024) {
-    return -1;
-  }
-
-  __asm __volatile (
-    ".set push                                                         \n\t"
-    ".set noreorder                                                    \n\t"
-
-    "addiu      %[k],           $zero,            10                   \n\t"
-    "addiu      %[l],           $zero,            1                    \n\t"
-   "3:                                                                 \n\t"
-    "sll        %[istep],       %[l],             1                    \n\t"
-    "move       %[m],           $zero                                  \n\t"
-    "sll        %[tmp],         %[l],             2                    \n\t"
-    "move       %[i],           $zero                                  \n\t"
-   "2:                                                                 \n\t"
-#if defined(MIPS_DSP_R1_LE)
-    "sllv       %[tmp3],        %[m],             %[k]                 \n\t"
-    "addiu      %[tmp2],        %[tmp3],          512                  \n\t"
-    "addiu      %[m],           %[m],             1                    \n\t"
-    "lhx        %[wi],          %[tmp3](%[kSinTable1024])              \n\t"
-    "lhx        %[wr],          %[tmp2](%[kSinTable1024])              \n\t"
-#else  // #if defined(MIPS_DSP_R1_LE)
-    "sllv       %[tmp3],        %[m],             %[k]                 \n\t"
-    "addu       %[ptr_j],       %[tmp3],          %[kSinTable1024]     \n\t"
-    "addiu      %[ptr_i],       %[ptr_j],         512                  \n\t"
-    "addiu      %[m],           %[m],             1                    \n\t"
-    "lh         %[wi],          0(%[ptr_j])                            \n\t"
-    "lh         %[wr],          0(%[ptr_i])                            \n\t"
-#endif  // #if defined(MIPS_DSP_R1_LE)
-   "1:                                                                 \n\t"
-    "sll        %[tmp1],        %[i],             2                    \n\t"
-    "addu       %[ptr_i],       %[frfi],          %[tmp1]              \n\t"
-    "addu       %[ptr_j],       %[ptr_i],         %[tmp]               \n\t"
-    "lh         %[tmp6],        0(%[ptr_i])                            \n\t"
-    "lh         %[tmp5],        2(%[ptr_i])                            \n\t"
-    "lh         %[tmp3],        0(%[ptr_j])                            \n\t"
-    "lh         %[tmp4],        2(%[ptr_j])                            \n\t"
-    "addu       %[i],           %[i],             %[istep]             \n\t"
-#if defined(MIPS_DSP_R2_LE)
-    "mult       %[wr],          %[tmp3]                                \n\t"
-    "madd       %[wi],          %[tmp4]                                \n\t"
-    "mult       $ac1,           %[wr],            %[tmp4]              \n\t"
-    "msub       $ac1,           %[wi],            %[tmp3]              \n\t"
-    "mflo       %[tmp1]                                                \n\t"
-    "mflo       %[tmp2],        $ac1                                   \n\t"
-    "sll        %[tmp6],        %[tmp6],          14                   \n\t"
-    "sll        %[tmp5],        %[tmp5],          14                   \n\t"
-    "shra_r.w   %[tmp1],        %[tmp1],          1                    \n\t"
-    "shra_r.w   %[tmp2],        %[tmp2],          1                    \n\t"
-    "subu       %[tmp4],        %[tmp6],          %[tmp1]              \n\t"
-    "addu       %[tmp1],        %[tmp6],          %[tmp1]              \n\t"
-    "addu       %[tmp6],        %[tmp5],          %[tmp2]              \n\t"
-    "subu       %[tmp5],        %[tmp5],          %[tmp2]              \n\t"
-    "shra_r.w   %[tmp1],        %[tmp1],          15                   \n\t"
-    "shra_r.w   %[tmp6],        %[tmp6],          15                   \n\t"
-    "shra_r.w   %[tmp4],        %[tmp4],          15                   \n\t"
-    "shra_r.w   %[tmp5],        %[tmp5],          15                   \n\t"
-#else  // #if defined(MIPS_DSP_R2_LE)
-    "mul        %[tmp2],        %[wr],            %[tmp4]              \n\t"
-    "mul        %[tmp1],        %[wr],            %[tmp3]              \n\t"
-    "mul        %[tmp4],        %[wi],            %[tmp4]              \n\t"
-    "mul        %[tmp3],        %[wi],            %[tmp3]              \n\t"
-    "sll        %[tmp6],        %[tmp6],          14                   \n\t"
-    "sll        %[tmp5],        %[tmp5],          14                   \n\t"
-    "addiu      %[tmp6],        %[tmp6],          16384                \n\t"
-    "addiu      %[tmp5],        %[tmp5],          16384                \n\t"
-    "addu       %[tmp1],        %[tmp1],          %[tmp4]              \n\t"
-    "subu       %[tmp2],        %[tmp2],          %[tmp3]              \n\t"
-    "addiu      %[tmp1],        %[tmp1],          1                    \n\t"
-    "addiu      %[tmp2],        %[tmp2],          1                    \n\t"
-    "sra        %[tmp1],        %[tmp1],          1                    \n\t"
-    "sra        %[tmp2],        %[tmp2],          1                    \n\t"
-    "subu       %[tmp4],        %[tmp6],          %[tmp1]              \n\t"
-    "addu       %[tmp1],        %[tmp6],          %[tmp1]              \n\t"
-    "addu       %[tmp6],        %[tmp5],          %[tmp2]              \n\t"
-    "subu       %[tmp5],        %[tmp5],          %[tmp2]              \n\t"
-    "sra        %[tmp4],        %[tmp4],          15                   \n\t"
-    "sra        %[tmp1],        %[tmp1],          15                   \n\t"
-    "sra        %[tmp6],        %[tmp6],          15                   \n\t"
-    "sra        %[tmp5],        %[tmp5],          15                   \n\t"
-#endif  // #if defined(MIPS_DSP_R2_LE)
-    "sh         %[tmp1],        0(%[ptr_i])                            \n\t"
-    "sh         %[tmp6],        2(%[ptr_i])                            \n\t"
-    "sh         %[tmp4],        0(%[ptr_j])                            \n\t"
-    "blt        %[i],           %[n],             1b                   \n\t"
-    " sh        %[tmp5],        2(%[ptr_j])                            \n\t"
-    "blt        %[m],           %[l],             2b                   \n\t"
-    " addu      %[i],           $zero,            %[m]                 \n\t"
-    "move       %[l],           %[istep]                               \n\t"
-    "blt        %[l],           %[n],             3b                   \n\t"
-    " addiu     %[k],           %[k],             -1                   \n\t"
-
-    ".set pop                                                          \n\t"
-
-    : [tmp1] "=&r" (tmp1), [tmp2] "=&r" (tmp2), [tmp3] "=&r" (tmp3),
-      [tmp4] "=&r" (tmp4), [tmp5] "=&r" (tmp5), [tmp6] "=&r" (tmp6),
-      [ptr_i] "=&r" (ptr_i), [i] "=&r" (i), [wi] "=&r" (wi), [wr] "=&r" (wr),
-      [m] "=&r" (m), [istep] "=&r" (istep), [l] "=&r" (l), [k] "=&r" (k),
-      [ptr_j] "=&r" (ptr_j), [tmp] "=&r" (tmp)
-    : [n] "r" (n), [frfi] "r" (frfi), [kSinTable1024] "r" (kSinTable1024)
-    : "hi", "lo", "memory"
-#if defined(MIPS_DSP_R2_LE)
-    , "$ac1hi", "$ac1lo"
-#endif  // #if defined(MIPS_DSP_R2_LE)
-  );
-
-  return 0;
-}
-
-int WebRtcSpl_ComplexIFFT(int16_t frfi[], int stages, int mode) {
-  int i = 0, l = 0, k = 0;
-  int istep = 0, n = 0, m = 0;
-  int scale = 0, shift = 0;
-  int32_t wr = 0, wi = 0;
-  int32_t tmp1 = 0, tmp2 = 0, tmp3 = 0, tmp4 = 0;
-  int32_t tmp5 = 0, tmp6 = 0, tmp = 0, tempMax = 0, round2 = 0;
-  int16_t* ptr_j = NULL;
-  int16_t* ptr_i = NULL;
-
-  n = 1 << stages;
-  if (n > 1024) {
-    return -1;
-  }
-
-  __asm __volatile (
-    ".set push                                                         \n\t"
-    ".set noreorder                                                    \n\t"
-
-    "addiu      %[k],           $zero,            10                   \n\t"
-    "addiu      %[l],           $zero,            1                    \n\t"
-    "move       %[scale],       $zero                                  \n\t"
-   "3:                                                                 \n\t"
-    "addiu      %[shift],       $zero,            14                   \n\t"
-    "addiu      %[round2],      $zero,            8192                 \n\t"
-    "move       %[ptr_i],       %[frfi]                                \n\t"
-    "move       %[tempMax],     $zero                                  \n\t"
-    "addu       %[i],           %[n],             %[n]                 \n\t"
-   "5:                                                                 \n\t"
-    "lh         %[tmp1],        0(%[ptr_i])                            \n\t"
-    "lh         %[tmp2],        2(%[ptr_i])                            \n\t"
-    "lh         %[tmp3],        4(%[ptr_i])                            \n\t"
-    "lh         %[tmp4],        6(%[ptr_i])                            \n\t"
-#if defined(MIPS_DSP_R1_LE)
-    "absq_s.w   %[tmp1],        %[tmp1]                                \n\t"
-    "absq_s.w   %[tmp2],        %[tmp2]                                \n\t"
-    "absq_s.w   %[tmp3],        %[tmp3]                                \n\t"
-    "absq_s.w   %[tmp4],        %[tmp4]                                \n\t"
-#else  // #if defined(MIPS_DSP_R1_LE)
-    "slt        %[tmp5],        %[tmp1],          $zero                \n\t"
-    "subu       %[tmp6],        $zero,            %[tmp1]              \n\t"
-    "movn       %[tmp1],        %[tmp6],          %[tmp5]              \n\t"
-    "slt        %[tmp5],        %[tmp2],          $zero                \n\t"
-    "subu       %[tmp6],        $zero,            %[tmp2]              \n\t"
-    "movn       %[tmp2],        %[tmp6],          %[tmp5]              \n\t"
-    "slt        %[tmp5],        %[tmp3],          $zero                \n\t"
-    "subu       %[tmp6],        $zero,            %[tmp3]              \n\t"
-    "movn       %[tmp3],        %[tmp6],          %[tmp5]              \n\t"
-    "slt        %[tmp5],        %[tmp4],          $zero                \n\t"
-    "subu       %[tmp6],        $zero,            %[tmp4]              \n\t"
-    "movn       %[tmp4],        %[tmp6],          %[tmp5]              \n\t"
-#endif  // #if defined(MIPS_DSP_R1_LE)
-    "slt        %[tmp5],        %[tempMax],       %[tmp1]              \n\t"
-    "movn       %[tempMax],     %[tmp1],          %[tmp5]              \n\t"
-    "addiu      %[i],           %[i],             -4                   \n\t"
-    "slt        %[tmp5],        %[tempMax],       %[tmp2]              \n\t"
-    "movn       %[tempMax],     %[tmp2],          %[tmp5]              \n\t"
-    "slt        %[tmp5],        %[tempMax],       %[tmp3]              \n\t"
-    "movn       %[tempMax],     %[tmp3],          %[tmp5]              \n\t"
-    "slt        %[tmp5],        %[tempMax],       %[tmp4]              \n\t"
-    "movn       %[tempMax],     %[tmp4],          %[tmp5]              \n\t"
-    "bgtz       %[i],                             5b                   \n\t"
-    " addiu     %[ptr_i],       %[ptr_i],         8                    \n\t"
-    "addiu      %[tmp1],        $zero,            13573                \n\t"
-    "addiu      %[tmp2],        $zero,            27146                \n\t"
-#if !defined(MIPS32_R2_LE)
-    "sll        %[tempMax],     %[tempMax],       16                   \n\t"
-    "sra        %[tempMax],     %[tempMax],       16                   \n\t"
-#else  // #if !defined(MIPS32_R2_LE)
-    "seh        %[tempMax]                                             \n\t"
-#endif  // #if !defined(MIPS32_R2_LE)
-    "slt        %[tmp1],        %[tmp1],          %[tempMax]           \n\t"
-    "slt        %[tmp2],        %[tmp2],          %[tempMax]           \n\t"
-    "addu       %[tmp1],        %[tmp1],          %[tmp2]              \n\t"
-    "addu       %[shift],       %[shift],         %[tmp1]              \n\t"
-    "addu       %[scale],       %[scale],         %[tmp1]              \n\t"
-    "sllv       %[round2],      %[round2],        %[tmp1]              \n\t"
-    "sll        %[istep],       %[l],             1                    \n\t"
-    "move       %[m],           $zero                                  \n\t"
-    "sll        %[tmp],         %[l],             2                    \n\t"
-   "2:                                                                 \n\t"
-#if defined(MIPS_DSP_R1_LE)
-    "sllv       %[tmp3],        %[m],             %[k]                 \n\t"
-    "addiu      %[tmp2],        %[tmp3],          512                  \n\t"
-    "addiu      %[m],           %[m],             1                    \n\t"
-    "lhx        %[wi],          %[tmp3](%[kSinTable1024])              \n\t"
-    "lhx        %[wr],          %[tmp2](%[kSinTable1024])              \n\t"
-#else  // #if defined(MIPS_DSP_R1_LE)
-    "sllv       %[tmp3],        %[m],             %[k]                 \n\t"
-    "addu       %[ptr_j],       %[tmp3],          %[kSinTable1024]     \n\t"
-    "addiu      %[ptr_i],       %[ptr_j],         512                  \n\t"
-    "addiu      %[m],           %[m],             1                    \n\t"
-    "lh         %[wi],          0(%[ptr_j])                            \n\t"
-    "lh         %[wr],          0(%[ptr_i])                            \n\t"
-#endif  // #if defined(MIPS_DSP_R1_LE)
-   "1:                                                                 \n\t"
-    "sll        %[tmp1],        %[i],             2                    \n\t"
-    "addu       %[ptr_i],       %[frfi],          %[tmp1]              \n\t"
-    "addu       %[ptr_j],       %[ptr_i],         %[tmp]               \n\t"
-    "lh         %[tmp3],        0(%[ptr_j])                            \n\t"
-    "lh         %[tmp4],        2(%[ptr_j])                            \n\t"
-    "lh         %[tmp6],        0(%[ptr_i])                            \n\t"
-    "lh         %[tmp5],        2(%[ptr_i])                            \n\t"
-    "addu       %[i],           %[i],             %[istep]             \n\t"
-#if defined(MIPS_DSP_R2_LE)
-    "mult       %[wr],          %[tmp3]                                \n\t"
-    "msub       %[wi],          %[tmp4]                                \n\t"
-    "mult       $ac1,           %[wr],            %[tmp4]              \n\t"
-    "madd       $ac1,           %[wi],            %[tmp3]              \n\t"
-    "mflo       %[tmp1]                                                \n\t"
-    "mflo       %[tmp2],        $ac1                                   \n\t"
-    "sll        %[tmp6],        %[tmp6],          14                   \n\t"
-    "sll        %[tmp5],        %[tmp5],          14                   \n\t"
-    "shra_r.w   %[tmp1],        %[tmp1],          1                    \n\t"
-    "shra_r.w   %[tmp2],        %[tmp2],          1                    \n\t"
-    "addu       %[tmp6],        %[tmp6],          %[round2]            \n\t"
-    "addu       %[tmp5],        %[tmp5],          %[round2]            \n\t"
-    "subu       %[tmp4],        %[tmp6],          %[tmp1]              \n\t"
-    "addu       %[tmp1],        %[tmp6],          %[tmp1]              \n\t"
-    "addu       %[tmp6],        %[tmp5],          %[tmp2]              \n\t"
-    "subu       %[tmp5],        %[tmp5],          %[tmp2]              \n\t"
-    "srav       %[tmp4],        %[tmp4],          %[shift]             \n\t"
-    "srav       %[tmp1],        %[tmp1],          %[shift]             \n\t"
-    "srav       %[tmp6],        %[tmp6],          %[shift]             \n\t"
-    "srav       %[tmp5],        %[tmp5],          %[shift]             \n\t"
-#else  // #if defined(MIPS_DSP_R2_LE)
-    "mul        %[tmp1],        %[wr],            %[tmp3]              \n\t"
-    "mul        %[tmp2],        %[wr],            %[tmp4]              \n\t"
-    "mul        %[tmp4],        %[wi],            %[tmp4]              \n\t"
-    "mul        %[tmp3],        %[wi],            %[tmp3]              \n\t"
-    "sll        %[tmp6],        %[tmp6],          14                   \n\t"
-    "sll        %[tmp5],        %[tmp5],          14                   \n\t"
-    "sub        %[tmp1],        %[tmp1],          %[tmp4]              \n\t"
-    "addu       %[tmp2],        %[tmp2],          %[tmp3]              \n\t"
-    "addiu      %[tmp1],        %[tmp1],          1                    \n\t"
-    "addiu      %[tmp2],        %[tmp2],          1                    \n\t"
-    "sra        %[tmp2],        %[tmp2],          1                    \n\t"
-    "sra        %[tmp1],        %[tmp1],          1                    \n\t"
-    "addu       %[tmp6],        %[tmp6],          %[round2]            \n\t"
-    "addu       %[tmp5],        %[tmp5],          %[round2]            \n\t"
-    "subu       %[tmp4],        %[tmp6],          %[tmp1]              \n\t"
-    "addu       %[tmp1],        %[tmp6],          %[tmp1]              \n\t"
-    "addu       %[tmp6],        %[tmp5],          %[tmp2]              \n\t"
-    "subu       %[tmp5],        %[tmp5],          %[tmp2]              \n\t"
-    "sra        %[tmp4],        %[tmp4],          %[shift]             \n\t"
-    "sra        %[tmp1],        %[tmp1],          %[shift]             \n\t"
-    "sra        %[tmp6],        %[tmp6],          %[shift]             \n\t"
-    "sra        %[tmp5],        %[tmp5],          %[shift]             \n\t"
-#endif  // #if defined(MIPS_DSP_R2_LE)
-    "sh         %[tmp1],         0(%[ptr_i])                           \n\t"
-    "sh         %[tmp6],         2(%[ptr_i])                           \n\t"
-    "sh         %[tmp4],         0(%[ptr_j])                           \n\t"
-    "blt        %[i],            %[n],            1b                   \n\t"
-    " sh        %[tmp5],         2(%[ptr_j])                           \n\t"
-    "blt        %[m],            %[l],            2b                   \n\t"
-    " addu      %[i],            $zero,           %[m]                 \n\t"
-    "move       %[l],            %[istep]                              \n\t"
-    "blt        %[l],            %[n],            3b                   \n\t"
-    " addiu     %[k],            %[k],            -1                   \n\t"
-
-    ".set pop                                                          \n\t"
-
-    : [tmp1] "=&r" (tmp1), [tmp2] "=&r" (tmp2), [tmp3] "=&r" (tmp3),
-      [tmp4] "=&r" (tmp4), [tmp5] "=&r" (tmp5), [tmp6] "=&r" (tmp6),
-      [ptr_i] "=&r" (ptr_i), [i] "=&r" (i), [m] "=&r" (m), [tmp] "=&r" (tmp),
-      [istep] "=&r" (istep), [wi] "=&r" (wi), [wr] "=&r" (wr), [l] "=&r" (l),
-      [k] "=&r" (k), [round2] "=&r" (round2), [ptr_j] "=&r" (ptr_j),
-      [shift] "=&r" (shift), [scale] "=&r" (scale), [tempMax] "=&r" (tempMax)
-    : [n] "r" (n), [frfi] "r" (frfi), [kSinTable1024] "r" (kSinTable1024)
-    : "hi", "lo", "memory"
-#if defined(MIPS_DSP_R2_LE)
-    , "$ac1hi", "$ac1lo"
-#endif  // #if defined(MIPS_DSP_R2_LE)
-  );
-
-  return scale;
-
-}
diff --git a/common_audio/signal_processing/complex_fft_tables.h b/common_audio/signal_processing/complex_fft_tables.h
deleted file mode 100644
index ca7b7fe..0000000
--- a/common_audio/signal_processing/complex_fft_tables.h
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- *  Copyright (c) 2013 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_COMMON_AUDIO_SIGNAL_PROCESSING_COMPLEX_FFT_TABLES_H_
-#define WEBRTC_COMMON_AUDIO_SIGNAL_PROCESSING_COMPLEX_FFT_TABLES_H_
-
-#include "webrtc/typedefs.h"
-
-static const int16_t kSinTable1024[] = {
-       0,    201,    402,    603,    804,   1005,   1206,   1406,
-    1607,   1808,   2009,   2209,   2410,   2610,   2811,   3011,
-    3211,   3411,   3611,   3811,   4011,   4210,   4409,   4608,
-    4807,   5006,   5205,   5403,   5601,   5799,   5997,   6195,
-    6392,   6589,   6786,   6982,   7179,   7375,   7571,   7766,
-    7961,   8156,   8351,   8545,   8739,   8932,   9126,   9319,
-    9511,   9703,   9895,  10087,  10278,  10469,  10659,  10849,
-   11038,  11227,  11416,  11604,  11792,  11980,  12166,  12353,
-   12539,  12724,  12909,  13094,  13278,  13462,  13645,  13827,
-   14009,  14191,  14372,  14552,  14732,  14911,  15090,  15268,
-   15446,  15623,  15799,  15975,  16150,  16325,  16499,  16672,
-   16845,  17017,  17189,  17360,  17530,  17699,  17868,  18036,
-   18204,  18371,  18537,  18702,  18867,  19031,  19194,  19357,
-   19519,  19680,  19840,  20000,  20159,  20317,  20474,  20631,
-   20787,  20942,  21096,  21249,  21402,  21554,  21705,  21855,
-   22004,  22153,  22301,  22448,  22594,  22739,  22883,  23027,
-   23169,  23311,  23452,  23592,  23731,  23869,  24006,  24143,
-   24278,  24413,  24546,  24679,  24811,  24942,  25072,  25201,
-   25329,  25456,  25582,  25707,  25831,  25954,  26077,  26198,
-   26318,  26437,  26556,  26673,  26789,  26905,  27019,  27132,
-   27244,  27355,  27466,  27575,  27683,  27790,  27896,  28001,
-   28105,  28208,  28309,  28410,  28510,  28608,  28706,  28802,
-   28897,  28992,  29085,  29177,  29268,  29358,  29446,  29534,
-   29621,  29706,  29790,  29873,  29955,  30036,  30116,  30195,
-   30272,  30349,  30424,  30498,  30571,  30643,  30713,  30783,
-   30851,  30918,  30984,  31049,  31113,  31175,  31236,  31297,
-   31356,  31413,  31470,  31525,  31580,  31633,  31684,  31735,
-   31785,  31833,  31880,  31926,  31970,  32014,  32056,  32097,
-   32137,  32176,  32213,  32249,  32284,  32318,  32350,  32382,
-   32412,  32441,  32468,  32495,  32520,  32544,  32567,  32588,
-   32609,  32628,  32646,  32662,  32678,  32692,  32705,  32717,
-   32727,  32736,  32744,  32751,  32757,  32761,  32764,  32766,
-   32767,  32766,  32764,  32761,  32757,  32751,  32744,  32736,
-   32727,  32717,  32705,  32692,  32678,  32662,  32646,  32628,
-   32609,  32588,  32567,  32544,  32520,  32495,  32468,  32441,
-   32412,  32382,  32350,  32318,  32284,  32249,  32213,  32176,
-   32137,  32097,  32056,  32014,  31970,  31926,  31880,  31833,
-   31785,  31735,  31684,  31633,  31580,  31525,  31470,  31413,
-   31356,  31297,  31236,  31175,  31113,  31049,  30984,  30918,
-   30851,  30783,  30713,  30643,  30571,  30498,  30424,  30349,
-   30272,  30195,  30116,  30036,  29955,  29873,  29790,  29706,
-   29621,  29534,  29446,  29358,  29268,  29177,  29085,  28992,
-   28897,  28802,  28706,  28608,  28510,  28410,  28309,  28208,
-   28105,  28001,  27896,  27790,  27683,  27575,  27466,  27355,
-   27244,  27132,  27019,  26905,  26789,  26673,  26556,  26437,
-   26318,  26198,  26077,  25954,  25831,  25707,  25582,  25456,
-   25329,  25201,  25072,  24942,  24811,  24679,  24546,  24413,
-   24278,  24143,  24006,  23869,  23731,  23592,  23452,  23311,
-   23169,  23027,  22883,  22739,  22594,  22448,  22301,  22153,
-   22004,  21855,  21705,  21554,  21402,  21249,  21096,  20942,
-   20787,  20631,  20474,  20317,  20159,  20000,  19840,  19680,
-   19519,  19357,  19194,  19031,  18867,  18702,  18537,  18371,
-   18204,  18036,  17868,  17699,  17530,  17360,  17189,  17017,
-   16845,  16672,  16499,  16325,  16150,  15975,  15799,  15623,
-   15446,  15268,  15090,  14911,  14732,  14552,  14372,  14191,
-   14009,  13827,  13645,  13462,  13278,  13094,  12909,  12724,
-   12539,  12353,  12166,  11980,  11792,  11604,  11416,  11227,
-   11038,  10849,  10659,  10469,  10278,  10087,   9895,   9703,
-    9511,   9319,   9126,   8932,   8739,   8545,   8351,   8156,
-    7961,   7766,   7571,   7375,   7179,   6982,   6786,   6589,
-    6392,   6195,   5997,   5799,   5601,   5403,   5205,   5006,
-    4807,   4608,   4409,   4210,   4011,   3811,   3611,   3411,
-    3211,   3011,   2811,   2610,   2410,   2209,   2009,   1808,
-    1607,   1406,   1206,   1005,    804,    603,    402,    201,
-       0,   -201,   -402,   -603,   -804,  -1005,  -1206,  -1406,
-   -1607,  -1808,  -2009,  -2209,  -2410,  -2610,  -2811,  -3011,
-   -3211,  -3411,  -3611,  -3811,  -4011,  -4210,  -4409,  -4608,
-   -4807,  -5006,  -5205,  -5403,  -5601,  -5799,  -5997,  -6195,
-   -6392,  -6589,  -6786,  -6982,  -7179,  -7375,  -7571,  -7766,
-   -7961,  -8156,  -8351,  -8545,  -8739,  -8932,  -9126,  -9319,
-   -9511,  -9703,  -9895, -10087, -10278, -10469, -10659, -10849,
-  -11038, -11227, -11416, -11604, -11792, -11980, -12166, -12353,
-  -12539, -12724, -12909, -13094, -13278, -13462, -13645, -13827,
-  -14009, -14191, -14372, -14552, -14732, -14911, -15090, -15268,
-  -15446, -15623, -15799, -15975, -16150, -16325, -16499, -16672,
-  -16845, -17017, -17189, -17360, -17530, -17699, -17868, -18036,
-  -18204, -18371, -18537, -18702, -18867, -19031, -19194, -19357,
-  -19519, -19680, -19840, -20000, -20159, -20317, -20474, -20631,
-  -20787, -20942, -21096, -21249, -21402, -21554, -21705, -21855,
-  -22004, -22153, -22301, -22448, -22594, -22739, -22883, -23027,
-  -23169, -23311, -23452, -23592, -23731, -23869, -24006, -24143,
-  -24278, -24413, -24546, -24679, -24811, -24942, -25072, -25201,
-  -25329, -25456, -25582, -25707, -25831, -25954, -26077, -26198,
-  -26318, -26437, -26556, -26673, -26789, -26905, -27019, -27132,
-  -27244, -27355, -27466, -27575, -27683, -27790, -27896, -28001,
-  -28105, -28208, -28309, -28410, -28510, -28608, -28706, -28802,
-  -28897, -28992, -29085, -29177, -29268, -29358, -29446, -29534,
-  -29621, -29706, -29790, -29873, -29955, -30036, -30116, -30195,
-  -30272, -30349, -30424, -30498, -30571, -30643, -30713, -30783,
-  -30851, -30918, -30984, -31049, -31113, -31175, -31236, -31297,
-  -31356, -31413, -31470, -31525, -31580, -31633, -31684, -31735,
-  -31785, -31833, -31880, -31926, -31970, -32014, -32056, -32097,
-  -32137, -32176, -32213, -32249, -32284, -32318, -32350, -32382,
-  -32412, -32441, -32468, -32495, -32520, -32544, -32567, -32588,
-  -32609, -32628, -32646, -32662, -32678, -32692, -32705, -32717,
-  -32727, -32736, -32744, -32751, -32757, -32761, -32764, -32766,
-  -32767, -32766, -32764, -32761, -32757, -32751, -32744, -32736,
-  -32727, -32717, -32705, -32692, -32678, -32662, -32646, -32628,
-  -32609, -32588, -32567, -32544, -32520, -32495, -32468, -32441,
-  -32412, -32382, -32350, -32318, -32284, -32249, -32213, -32176,
-  -32137, -32097, -32056, -32014, -31970, -31926, -31880, -31833,
-  -31785, -31735, -31684, -31633, -31580, -31525, -31470, -31413,
-  -31356, -31297, -31236, -31175, -31113, -31049, -30984, -30918,
-  -30851, -30783, -30713, -30643, -30571, -30498, -30424, -30349,
-  -30272, -30195, -30116, -30036, -29955, -29873, -29790, -29706,
-  -29621, -29534, -29446, -29358, -29268, -29177, -29085, -28992,
-  -28897, -28802, -28706, -28608, -28510, -28410, -28309, -28208,
-  -28105, -28001, -27896, -27790, -27683, -27575, -27466, -27355,
-  -27244, -27132, -27019, -26905, -26789, -26673, -26556, -26437,
-  -26318, -26198, -26077, -25954, -25831, -25707, -25582, -25456,
-  -25329, -25201, -25072, -24942, -24811, -24679, -24546, -24413,
-  -24278, -24143, -24006, -23869, -23731, -23592, -23452, -23311,
-  -23169, -23027, -22883, -22739, -22594, -22448, -22301, -22153,
-  -22004, -21855, -21705, -21554, -21402, -21249, -21096, -20942,
-  -20787, -20631, -20474, -20317, -20159, -20000, -19840, -19680,
-  -19519, -19357, -19194, -19031, -18867, -18702, -18537, -18371,
-  -18204, -18036, -17868, -17699, -17530, -17360, -17189, -17017,
-  -16845, -16672, -16499, -16325, -16150, -15975, -15799, -15623,
-  -15446, -15268, -15090, -14911, -14732, -14552, -14372, -14191,
-  -14009, -13827, -13645, -13462, -13278, -13094, -12909, -12724,
-  -12539, -12353, -12166, -11980, -11792, -11604, -11416, -11227,
-  -11038, -10849, -10659, -10469, -10278, -10087,  -9895,  -9703,
-   -9511,  -9319,  -9126,  -8932,  -8739,  -8545,  -8351,  -8156,
-   -7961,  -7766,  -7571,  -7375,  -7179,  -6982,  -6786,  -6589,
-   -6392,  -6195,  -5997,  -5799,  -5601,  -5403,  -5205,  -5006,
-   -4807,  -4608,  -4409,  -4210,  -4011,  -3811,  -3611,  -3411,
-   -3211,  -3011,  -2811,  -2610,  -2410,  -2209,  -2009,  -1808,
-   -1607,  -1406,  -1206,  -1005,   -804,   -603,   -402,   -201
-};
-
-#endif  // WEBRTC_COMMON_AUDIO_SIGNAL_PROCESSING_COMPLEX_FFT_TABLES_H_
diff --git a/common_audio/signal_processing/copy_set_operations.c b/common_audio/signal_processing/copy_set_operations.c
deleted file mode 100644
index 9d7cf47..0000000
--- a/common_audio/signal_processing/copy_set_operations.c
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-
-/*
- * This file contains the implementation of functions
- * WebRtcSpl_MemSetW16()
- * WebRtcSpl_MemSetW32()
- * WebRtcSpl_MemCpyReversedOrder()
- * WebRtcSpl_CopyFromEndW16()
- * WebRtcSpl_ZerosArrayW16()
- * WebRtcSpl_ZerosArrayW32()
- *
- * The description header can be found in signal_processing_library.h
- *
- */
-
-#include <string.h>
-#include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
-
-
-void WebRtcSpl_MemSetW16(int16_t *ptr, int16_t set_value, size_t length)
-{
-    size_t j;
-    int16_t *arrptr = ptr;
-
-    for (j = length; j > 0; j--)
-    {
-        *arrptr++ = set_value;
-    }
-}
-
-void WebRtcSpl_MemSetW32(int32_t *ptr, int32_t set_value, size_t length)
-{
-    size_t j;
-    int32_t *arrptr = ptr;
-
-    for (j = length; j > 0; j--)
-    {
-        *arrptr++ = set_value;
-    }
-}
-
-void WebRtcSpl_MemCpyReversedOrder(int16_t* dest,
-                                   int16_t* source,
-                                   size_t length)
-{
-    size_t j;
-    int16_t* destPtr = dest;
-    int16_t* sourcePtr = source;
-
-    for (j = 0; j < length; j++)
-    {
-        *destPtr-- = *sourcePtr++;
-    }
-}
-
-void WebRtcSpl_CopyFromEndW16(const int16_t *vector_in,
-                              size_t length,
-                              size_t samples,
-                              int16_t *vector_out)
-{
-    // Copy the last <samples> of the input vector to vector_out
-    WEBRTC_SPL_MEMCPY_W16(vector_out, &vector_in[length - samples], samples);
-}
-
-void WebRtcSpl_ZerosArrayW16(int16_t *vector, size_t length)
-{
-    WebRtcSpl_MemSetW16(vector, 0, length);
-}
-
-void WebRtcSpl_ZerosArrayW32(int32_t *vector, size_t length)
-{
-    WebRtcSpl_MemSetW32(vector, 0, length);
-}
diff --git a/common_audio/signal_processing/cross_correlation.c b/common_audio/signal_processing/cross_correlation.c
deleted file mode 100644
index d7c9f2b..0000000
--- a/common_audio/signal_processing/cross_correlation.c
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- *  Copyright (c) 2012 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/common_audio/signal_processing/include/signal_processing_library.h"
-
-/* C version of WebRtcSpl_CrossCorrelation() for generic platforms. */
-void WebRtcSpl_CrossCorrelationC(int32_t* cross_correlation,
-                                 const int16_t* seq1,
-                                 const int16_t* seq2,
-                                 size_t dim_seq,
-                                 size_t dim_cross_correlation,
-                                 int right_shifts,
-                                 int step_seq2) {
-  size_t i = 0, j = 0;
-
-  for (i = 0; i < dim_cross_correlation; i++) {
-    int32_t corr = 0;
-    for (j = 0; j < dim_seq; j++)
-      corr += (seq1[j] * seq2[j]) >> right_shifts;
-    seq2 += step_seq2;
-    *cross_correlation++ = corr;
-  }
-}
diff --git a/common_audio/signal_processing/cross_correlation_mips.c b/common_audio/signal_processing/cross_correlation_mips.c
deleted file mode 100644
index b236402..0000000
--- a/common_audio/signal_processing/cross_correlation_mips.c
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- *  Copyright (c) 2013 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/common_audio/signal_processing/include/signal_processing_library.h"
-
-void WebRtcSpl_CrossCorrelation_mips(int32_t* cross_correlation,
-                                     const int16_t* seq1,
-                                     const int16_t* seq2,
-                                     size_t dim_seq,
-                                     size_t dim_cross_correlation,
-                                     int right_shifts,
-                                     int step_seq2) {
-
-  int32_t t0 = 0, t1 = 0, t2 = 0, t3 = 0, sum = 0;
-  int16_t *pseq2 = NULL;
-  int16_t *pseq1 = NULL;
-  int16_t *pseq1_0 = (int16_t*)&seq1[0];
-  int16_t *pseq2_0 = (int16_t*)&seq2[0];
-  int k = 0;
-
-  __asm __volatile (
-    ".set        push                                           \n\t"
-    ".set        noreorder                                      \n\t"
-    "sll         %[step_seq2], %[step_seq2],   1                \n\t"
-    "andi        %[t0],        %[dim_seq],     1                \n\t"
-    "bgtz        %[t0],        3f                               \n\t"
-    " nop                                                       \n\t"
-   "1:                                                          \n\t"
-    "move        %[pseq1],     %[pseq1_0]                       \n\t"
-    "move        %[pseq2],     %[pseq2_0]                       \n\t"
-    "sra         %[k],         %[dim_seq],     1                \n\t"
-    "addiu       %[dim_cc],    %[dim_cc],      -1               \n\t"
-    "xor         %[sum],       %[sum],         %[sum]           \n\t"
-   "2:                                                          \n\t"
-    "lh          %[t0],        0(%[pseq1])                      \n\t"
-    "lh          %[t1],        0(%[pseq2])                      \n\t"
-    "lh          %[t2],        2(%[pseq1])                      \n\t"
-    "lh          %[t3],        2(%[pseq2])                      \n\t"
-    "mul         %[t0],        %[t0],          %[t1]            \n\t"
-    "addiu       %[k],         %[k],           -1               \n\t"
-    "mul         %[t2],        %[t2],          %[t3]            \n\t"
-    "addiu       %[pseq1],     %[pseq1],       4                \n\t"
-    "addiu       %[pseq2],     %[pseq2],       4                \n\t"
-    "srav        %[t0],        %[t0],          %[right_shifts]  \n\t"
-    "addu        %[sum],       %[sum],         %[t0]            \n\t"
-    "srav        %[t2],        %[t2],          %[right_shifts]  \n\t"
-    "bgtz        %[k],         2b                               \n\t"
-    " addu       %[sum],       %[sum],         %[t2]            \n\t"
-    "addu        %[pseq2_0],   %[pseq2_0],     %[step_seq2]     \n\t"
-    "sw          %[sum],       0(%[cc])                         \n\t"
-    "bgtz        %[dim_cc],    1b                               \n\t"
-    " addiu      %[cc],        %[cc],          4                \n\t"
-    "b           6f                                             \n\t"
-    " nop                                                       \n\t"
-   "3:                                                          \n\t"
-    "move        %[pseq1],     %[pseq1_0]                       \n\t"
-    "move        %[pseq2],     %[pseq2_0]                       \n\t"
-    "sra         %[k],         %[dim_seq],     1                \n\t"
-    "addiu       %[dim_cc],    %[dim_cc],      -1               \n\t"
-    "beqz        %[k],         5f                               \n\t"
-    " xor        %[sum],       %[sum],         %[sum]           \n\t"
-   "4:                                                          \n\t"
-    "lh          %[t0],        0(%[pseq1])                      \n\t"
-    "lh          %[t1],        0(%[pseq2])                      \n\t"
-    "lh          %[t2],        2(%[pseq1])                      \n\t"
-    "lh          %[t3],        2(%[pseq2])                      \n\t"
-    "mul         %[t0],        %[t0],          %[t1]            \n\t"
-    "addiu       %[k],         %[k],           -1               \n\t"
-    "mul         %[t2],        %[t2],          %[t3]            \n\t"
-    "addiu       %[pseq1],     %[pseq1],       4                \n\t"
-    "addiu       %[pseq2],     %[pseq2],       4                \n\t"
-    "srav        %[t0],        %[t0],          %[right_shifts]  \n\t"
-    "addu        %[sum],       %[sum],         %[t0]            \n\t"
-    "srav        %[t2],        %[t2],          %[right_shifts]  \n\t"
-    "bgtz        %[k],         4b                               \n\t"
-    " addu       %[sum],       %[sum],         %[t2]            \n\t"
-   "5:                                                          \n\t"
-    "lh          %[t0],        0(%[pseq1])                      \n\t"
-    "lh          %[t1],        0(%[pseq2])                      \n\t"
-    "mul         %[t0],        %[t0],          %[t1]            \n\t"
-    "srav        %[t0],        %[t0],          %[right_shifts]  \n\t"
-    "addu        %[sum],       %[sum],         %[t0]            \n\t"
-    "addu        %[pseq2_0],   %[pseq2_0],     %[step_seq2]     \n\t"
-    "sw          %[sum],       0(%[cc])                         \n\t"
-    "bgtz        %[dim_cc],    3b                               \n\t"
-    " addiu      %[cc],        %[cc],          4                \n\t"
-   "6:                                                          \n\t"
-    ".set        pop                                            \n\t"
-    : [step_seq2] "+r" (step_seq2), [t0] "=&r" (t0), [t1] "=&r" (t1),
-      [t2] "=&r" (t2), [t3] "=&r" (t3), [pseq1] "=&r" (pseq1),
-      [pseq2] "=&r" (pseq2), [pseq1_0] "+r" (pseq1_0), [pseq2_0] "+r" (pseq2_0),
-      [k] "=&r" (k), [dim_cc] "+r" (dim_cross_correlation), [sum] "=&r" (sum),
-      [cc] "+r" (cross_correlation)
-    : [dim_seq] "r" (dim_seq), [right_shifts] "r" (right_shifts)
-    : "hi", "lo", "memory"
-  );
-}
diff --git a/common_audio/signal_processing/cross_correlation_neon.c b/common_audio/signal_processing/cross_correlation_neon.c
deleted file mode 100644
index 918b671..0000000
--- a/common_audio/signal_processing/cross_correlation_neon.c
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- *  Copyright (c) 2014 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/common_audio/signal_processing/include/signal_processing_library.h"
-
-#include <arm_neon.h>
-
-static inline void DotProductWithScaleNeon(int32_t* cross_correlation,
-                                           const int16_t* vector1,
-                                           const int16_t* vector2,
-                                           size_t length,
-                                           int scaling) {
-  size_t i = 0;
-  size_t len1 = length >> 3;
-  size_t len2 = length & 7;
-  int64x2_t sum0 = vdupq_n_s64(0);
-  int64x2_t sum1 = vdupq_n_s64(0);
-
-  for (i = len1; i > 0; i -= 1) {
-    int16x8_t seq1_16x8 = vld1q_s16(vector1);
-    int16x8_t seq2_16x8 = vld1q_s16(vector2);
-#if defined(WEBRTC_ARCH_ARM64)
-    int32x4_t tmp0 = vmull_s16(vget_low_s16(seq1_16x8),
-                               vget_low_s16(seq2_16x8));
-    int32x4_t tmp1 = vmull_high_s16(seq1_16x8, seq2_16x8);
-#else
-    int32x4_t tmp0 = vmull_s16(vget_low_s16(seq1_16x8),
-                               vget_low_s16(seq2_16x8));
-    int32x4_t tmp1 = vmull_s16(vget_high_s16(seq1_16x8),
-                               vget_high_s16(seq2_16x8));
-#endif
-    sum0 = vpadalq_s32(sum0, tmp0);
-    sum1 = vpadalq_s32(sum1, tmp1);
-    vector1 += 8;
-    vector2 += 8;
-  }
-
-  // Calculate the rest of the samples.
-  int64_t sum_res = 0;
-  for (i = len2; i > 0; i -= 1) {
-    sum_res += WEBRTC_SPL_MUL_16_16(*vector1, *vector2);
-    vector1++;
-    vector2++;
-  }
-
-  sum0 = vaddq_s64(sum0, sum1);
-#if defined(WEBRTC_ARCH_ARM64)
-  int64_t sum2 = vaddvq_s64(sum0);
-  *cross_correlation = (int32_t)((sum2 + sum_res) >> scaling);
-#else
-  int64x1_t shift = vdup_n_s64(-scaling);
-  int64x1_t sum2 = vadd_s64(vget_low_s64(sum0), vget_high_s64(sum0));
-  sum2 = vadd_s64(sum2, vdup_n_s64(sum_res));
-  sum2 = vshl_s64(sum2, shift);
-  vst1_lane_s32(cross_correlation, vreinterpret_s32_s64(sum2), 0);
-#endif
-}
-
-/* NEON version of WebRtcSpl_CrossCorrelation() for ARM32/64 platforms. */
-void WebRtcSpl_CrossCorrelationNeon(int32_t* cross_correlation,
-                                    const int16_t* seq1,
-                                    const int16_t* seq2,
-                                    size_t dim_seq,
-                                    size_t dim_cross_correlation,
-                                    int right_shifts,
-                                    int step_seq2) {
-  size_t i = 0;
-
-  for (i = 0; i < dim_cross_correlation; i++) {
-    const int16_t* seq1_ptr = seq1;
-    const int16_t* seq2_ptr = seq2 + (step_seq2 * i);
-
-    DotProductWithScaleNeon(cross_correlation,
-                            seq1_ptr,
-                            seq2_ptr,
-                            dim_seq,
-                            right_shifts);
-    cross_correlation++;
-  }
-}
diff --git a/common_audio/signal_processing/division_operations.c b/common_audio/signal_processing/division_operations.c
deleted file mode 100644
index 2d42052..0000000
--- a/common_audio/signal_processing/division_operations.c
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-
-/*
- * This file contains implementations of the divisions
- * WebRtcSpl_DivU32U16()
- * WebRtcSpl_DivW32W16()
- * WebRtcSpl_DivW32W16ResW16()
- * WebRtcSpl_DivResultInQ31()
- * WebRtcSpl_DivW32HiLow()
- *
- * The description header can be found in signal_processing_library.h
- *
- */
-
-#include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
-#include "webrtc/rtc_base/sanitizer.h"
-
-uint32_t WebRtcSpl_DivU32U16(uint32_t num, uint16_t den)
-{
-    // Guard against division with 0
-    if (den != 0)
-    {
-        return (uint32_t)(num / den);
-    } else
-    {
-        return (uint32_t)0xFFFFFFFF;
-    }
-}
-
-int32_t WebRtcSpl_DivW32W16(int32_t num, int16_t den)
-{
-    // Guard against division with 0
-    if (den != 0)
-    {
-        return (int32_t)(num / den);
-    } else
-    {
-        return (int32_t)0x7FFFFFFF;
-    }
-}
-
-int16_t WebRtcSpl_DivW32W16ResW16(int32_t num, int16_t den)
-{
-    // Guard against division with 0
-    if (den != 0)
-    {
-        return (int16_t)(num / den);
-    } else
-    {
-        return (int16_t)0x7FFF;
-    }
-}
-
-int32_t WebRtcSpl_DivResultInQ31(int32_t num, int32_t den)
-{
-    int32_t L_num = num;
-    int32_t L_den = den;
-    int32_t div = 0;
-    int k = 31;
-    int change_sign = 0;
-
-    if (num == 0)
-        return 0;
-
-    if (num < 0)
-    {
-        change_sign++;
-        L_num = -num;
-    }
-    if (den < 0)
-    {
-        change_sign++;
-        L_den = -den;
-    }
-    while (k--)
-    {
-        div <<= 1;
-        L_num <<= 1;
-        if (L_num >= L_den)
-        {
-            L_num -= L_den;
-            div++;
-        }
-    }
-    if (change_sign == 1)
-    {
-        div = -div;
-    }
-    return div;
-}
-
-int32_t RTC_NO_SANITIZE("signed-integer-overflow")  // bugs.webrtc.org/5486
-WebRtcSpl_DivW32HiLow(int32_t num, int16_t den_hi, int16_t den_low)
-{
-    int16_t approx, tmp_hi, tmp_low, num_hi, num_low;
-    int32_t tmpW32;
-
-    approx = (int16_t)WebRtcSpl_DivW32W16((int32_t)0x1FFFFFFF, den_hi);
-    // result in Q14 (Note: 3FFFFFFF = 0.5 in Q30)
-
-    // tmpW32 = 1/den = approx * (2.0 - den * approx) (in Q30)
-    tmpW32 = (den_hi * approx << 1) + ((den_low * approx >> 15) << 1);
-    // tmpW32 = den * approx
-
-    tmpW32 = (int32_t)0x7fffffffL - tmpW32; // result in Q30 (tmpW32 = 2.0-(den*approx))
-    // UBSan: 2147483647 - -2 cannot be represented in type 'int'
-
-    // Store tmpW32 in hi and low format
-    tmp_hi = (int16_t)(tmpW32 >> 16);
-    tmp_low = (int16_t)((tmpW32 - ((int32_t)tmp_hi << 16)) >> 1);
-
-    // tmpW32 = 1/den in Q29
-    tmpW32 = (tmp_hi * approx + (tmp_low * approx >> 15)) << 1;
-
-    // 1/den in hi and low format
-    tmp_hi = (int16_t)(tmpW32 >> 16);
-    tmp_low = (int16_t)((tmpW32 - ((int32_t)tmp_hi << 16)) >> 1);
-
-    // Store num in hi and low format
-    num_hi = (int16_t)(num >> 16);
-    num_low = (int16_t)((num - ((int32_t)num_hi << 16)) >> 1);
-
-    // num * (1/den) by 32 bit multiplication (result in Q28)
-
-    tmpW32 = num_hi * tmp_hi + (num_hi * tmp_low >> 15) +
-        (num_low * tmp_hi >> 15);
-
-    // Put result in Q31 (convert from Q28)
-    tmpW32 = WEBRTC_SPL_LSHIFT_W32(tmpW32, 3);
-
-    return tmpW32;
-}
diff --git a/common_audio/signal_processing/dot_product_with_scale.cc b/common_audio/signal_processing/dot_product_with_scale.cc
deleted file mode 100644
index 7cd6e91..0000000
--- a/common_audio/signal_processing/dot_product_with_scale.cc
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- *  Copyright (c) 2012 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/common_audio/signal_processing/dot_product_with_scale.h"
-
-#include "webrtc/rtc_base/safe_conversions.h"
-
-int32_t WebRtcSpl_DotProductWithScale(const int16_t* vector1,
-                                      const int16_t* vector2,
-                                      size_t length,
-                                      int scaling) {
-  int64_t sum = 0;
-  size_t i = 0;
-
-  /* Unroll the loop to improve performance. */
-  for (i = 0; i + 3 < length; i += 4) {
-    sum += (vector1[i + 0] * vector2[i + 0]) >> scaling;
-    sum += (vector1[i + 1] * vector2[i + 1]) >> scaling;
-    sum += (vector1[i + 2] * vector2[i + 2]) >> scaling;
-    sum += (vector1[i + 3] * vector2[i + 3]) >> scaling;
-  }
-  for (; i < length; i++) {
-    sum += (vector1[i] * vector2[i]) >> scaling;
-  }
-
-  return rtc::saturated_cast<int32_t>(sum);
-}
diff --git a/common_audio/signal_processing/dot_product_with_scale.h b/common_audio/signal_processing/dot_product_with_scale.h
deleted file mode 100644
index 288fe5e..0000000
--- a/common_audio/signal_processing/dot_product_with_scale.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- *  Copyright (c) 2017 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_COMMON_AUDIO_SIGNAL_PROCESSING_DOT_PRODUCT_WITH_SCALE_H_
-#define WEBRTC_COMMON_AUDIO_SIGNAL_PROCESSING_DOT_PRODUCT_WITH_SCALE_H_
-
-#include <string.h>
-
-#include "webrtc/typedefs.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-// Calculates the dot product between two (int16_t) vectors.
-//
-// Input:
-//      - vector1       : Vector 1
-//      - vector2       : Vector 2
-//      - vector_length : Number of samples used in the dot product
-//      - scaling       : The number of right bit shifts to apply on each term
-//                        during calculation to avoid overflow, i.e., the
-//                        output will be in Q(-|scaling|)
-//
-// Return value         : The dot product in Q(-scaling)
-int32_t WebRtcSpl_DotProductWithScale(const int16_t* vector1,
-                                      const int16_t* vector2,
-                                      size_t length,
-                                      int scaling);
-
-#ifdef __cplusplus
-}
-#endif  // __cplusplus
-#endif  // WEBRTC_COMMON_AUDIO_SIGNAL_PROCESSING_DOT_PRODUCT_WITH_SCALE_H_
diff --git a/common_audio/signal_processing/downsample_fast.c b/common_audio/signal_processing/downsample_fast.c
deleted file mode 100644
index 90de156..0000000
--- a/common_audio/signal_processing/downsample_fast.c
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- *  Copyright (c) 2012 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/common_audio/signal_processing/include/signal_processing_library.h"
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/sanitizer.h"
-
-// TODO(Bjornv): Change the function parameter order to WebRTC code style.
-// C version of WebRtcSpl_DownsampleFast() for generic platforms.
-int WebRtcSpl_DownsampleFastC(const int16_t* data_in,
-                              size_t data_in_length,
-                              int16_t* data_out,
-                              size_t data_out_length,
-                              const int16_t* __restrict coefficients,
-                              size_t coefficients_length,
-                              int factor,
-                              size_t delay) {
-  int16_t* const original_data_out = data_out;
-  size_t i = 0;
-  size_t j = 0;
-  int32_t out_s32 = 0;
-  size_t endpos = delay + factor * (data_out_length - 1) + 1;
-
-  // Return error if any of the running conditions doesn't meet.
-  if (data_out_length == 0 || coefficients_length == 0
-                           || data_in_length < endpos) {
-    return -1;
-  }
-
-  rtc_MsanCheckInitialized(coefficients, sizeof(coefficients[0]),
-                           coefficients_length);
-
-  for (i = delay; i < endpos; i += factor) {
-    out_s32 = 2048;  // Round value, 0.5 in Q12.
-
-    for (j = 0; j < coefficients_length; j++) {
-      rtc_MsanCheckInitialized(&data_in[i - j], sizeof(data_in[0]), 1);
-      out_s32 += coefficients[j] * data_in[i - j];  // Q12.
-    }
-
-    out_s32 >>= 12;  // Q0.
-
-    // Saturate and store the output.
-    *data_out++ = WebRtcSpl_SatW32ToW16(out_s32);
-  }
-
-  RTC_DCHECK_EQ(original_data_out + data_out_length, data_out);
-  rtc_MsanCheckInitialized(original_data_out, sizeof(original_data_out[0]),
-                           data_out_length);
-
-  return 0;
-}
diff --git a/common_audio/signal_processing/downsample_fast_mips.c b/common_audio/signal_processing/downsample_fast_mips.c
deleted file mode 100644
index ac39401..0000000
--- a/common_audio/signal_processing/downsample_fast_mips.c
+++ /dev/null
@@ -1,169 +0,0 @@
-/*
- *  Copyright (c) 2013 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/common_audio/signal_processing/include/signal_processing_library.h"
-
-// Version of WebRtcSpl_DownsampleFast() for MIPS platforms.
-int WebRtcSpl_DownsampleFast_mips(const int16_t* data_in,
-                                  size_t data_in_length,
-                                  int16_t* data_out,
-                                  size_t data_out_length,
-                                  const int16_t* __restrict coefficients,
-                                  size_t coefficients_length,
-                                  int factor,
-                                  size_t delay) {
-  int i;
-  int j;
-  int k;
-  int32_t out_s32 = 0;
-  size_t endpos = delay + factor * (data_out_length - 1) + 1;
-
-  int32_t  tmp1, tmp2, tmp3, tmp4, factor_2;
-  int16_t* p_coefficients;
-  int16_t* p_data_in;
-  int16_t* p_data_in_0 = (int16_t*)&data_in[delay];
-  int16_t* p_coefficients_0 = (int16_t*)&coefficients[0];
-#if !defined(MIPS_DSP_R1_LE)
-  int32_t max_16 = 0x7FFF;
-  int32_t min_16 = 0xFFFF8000;
-#endif  // #if !defined(MIPS_DSP_R1_LE)
-
-  // Return error if any of the running conditions doesn't meet.
-  if (data_out_length == 0 || coefficients_length == 0
-                           || data_in_length < endpos) {
-    return -1;
-  }
-#if defined(MIPS_DSP_R2_LE)
-  __asm __volatile (
-    ".set        push                                                \n\t"
-    ".set        noreorder                                           \n\t"
-    "subu        %[i],            %[endpos],       %[delay]          \n\t"
-    "sll         %[factor_2],     %[factor],       1                 \n\t"
-   "1:                                                               \n\t"
-    "move        %[p_data_in],    %[p_data_in_0]                     \n\t"
-    "mult        $zero,           $zero                              \n\t"
-    "move        %[p_coefs],      %[p_coefs_0]                       \n\t"
-    "sra         %[j],            %[coef_length],  2                 \n\t"
-    "beq         %[j],            $zero,           3f                \n\t"
-    " andi       %[k],            %[coef_length],  3                 \n\t"
-   "2:                                                               \n\t"
-    "lwl         %[tmp1],         1(%[p_data_in])                    \n\t"
-    "lwl         %[tmp2],         3(%[p_coefs])                      \n\t"
-    "lwl         %[tmp3],         -3(%[p_data_in])                   \n\t"
-    "lwl         %[tmp4],         7(%[p_coefs])                      \n\t"
-    "lwr         %[tmp1],         -2(%[p_data_in])                   \n\t"
-    "lwr         %[tmp2],         0(%[p_coefs])                      \n\t"
-    "lwr         %[tmp3],         -6(%[p_data_in])                   \n\t"
-    "lwr         %[tmp4],         4(%[p_coefs])                      \n\t"
-    "packrl.ph   %[tmp1],         %[tmp1],         %[tmp1]           \n\t"
-    "packrl.ph   %[tmp3],         %[tmp3],         %[tmp3]           \n\t"
-    "dpa.w.ph    $ac0,            %[tmp1],         %[tmp2]           \n\t"
-    "dpa.w.ph    $ac0,            %[tmp3],         %[tmp4]           \n\t"
-    "addiu       %[j],            %[j],            -1                \n\t"
-    "addiu       %[p_data_in],    %[p_data_in],    -8                \n\t"
-    "bgtz        %[j],            2b                                 \n\t"
-    " addiu      %[p_coefs],      %[p_coefs],      8                 \n\t"
-   "3:                                                               \n\t"
-    "beq         %[k],            $zero,           5f                \n\t"
-    " nop                                                            \n\t"
-   "4:                                                               \n\t"
-    "lhu         %[tmp1],         0(%[p_data_in])                    \n\t"
-    "lhu         %[tmp2],         0(%[p_coefs])                      \n\t"
-    "addiu       %[p_data_in],    %[p_data_in],    -2                \n\t"
-    "addiu       %[k],            %[k],            -1                \n\t"
-    "dpa.w.ph    $ac0,            %[tmp1],         %[tmp2]           \n\t"
-    "bgtz        %[k],            4b                                 \n\t"
-    " addiu      %[p_coefs],      %[p_coefs],      2                 \n\t"
-   "5:                                                               \n\t"
-    "extr_r.w    %[out_s32],      $ac0,            12                \n\t"
-    "addu        %[p_data_in_0],  %[p_data_in_0],  %[factor_2]       \n\t"
-    "subu        %[i],            %[i],            %[factor]         \n\t"
-    "shll_s.w    %[out_s32],      %[out_s32],      16                \n\t"
-    "sra         %[out_s32],      %[out_s32],      16                \n\t"
-    "sh          %[out_s32],      0(%[data_out])                     \n\t"
-    "bgtz        %[i],            1b                                 \n\t"
-    " addiu      %[data_out],     %[data_out],     2                 \n\t"
-    ".set        pop                                                 \n\t"
-    : [tmp1] "=&r" (tmp1), [tmp2] "=&r" (tmp2), [tmp3] "=&r" (tmp3),
-      [tmp4] "=&r" (tmp4), [p_data_in] "=&r" (p_data_in),
-      [p_data_in_0] "+r" (p_data_in_0), [p_coefs] "=&r" (p_coefficients),
-      [j] "=&r" (j), [out_s32] "=&r" (out_s32), [factor_2] "=&r" (factor_2),
-      [i] "=&r" (i), [k] "=&r" (k)
-    : [coef_length] "r" (coefficients_length), [data_out] "r" (data_out),
-      [p_coefs_0] "r" (p_coefficients_0), [endpos] "r" (endpos),
-      [delay] "r" (delay), [factor] "r" (factor)
-    : "memory", "hi", "lo"
- );
-#else  // #if defined(MIPS_DSP_R2_LE)
-  __asm __volatile (
-    ".set        push                                                \n\t"
-    ".set        noreorder                                           \n\t"
-    "sll         %[factor_2],     %[factor],       1                 \n\t"
-    "subu        %[i],            %[endpos],       %[delay]          \n\t"
-   "1:                                                               \n\t"
-    "move        %[p_data_in],    %[p_data_in_0]                     \n\t"
-    "addiu       %[out_s32],      $zero,           2048              \n\t"
-    "move        %[p_coefs],      %[p_coefs_0]                       \n\t"
-    "sra         %[j],            %[coef_length],  1                 \n\t"
-    "beq         %[j],            $zero,           3f                \n\t"
-    " andi       %[k],            %[coef_length],  1                 \n\t"
-   "2:                                                               \n\t"
-    "lh          %[tmp1],         0(%[p_data_in])                    \n\t"
-    "lh          %[tmp2],         0(%[p_coefs])                      \n\t"
-    "lh          %[tmp3],         -2(%[p_data_in])                   \n\t"
-    "lh          %[tmp4],         2(%[p_coefs])                      \n\t"
-    "mul         %[tmp1],         %[tmp1],         %[tmp2]           \n\t"
-    "addiu       %[p_coefs],      %[p_coefs],      4                 \n\t"
-    "mul         %[tmp3],         %[tmp3],         %[tmp4]           \n\t"
-    "addiu       %[j],            %[j],            -1                \n\t"
-    "addiu       %[p_data_in],    %[p_data_in],    -4                \n\t"
-    "addu        %[tmp1],         %[tmp1],         %[tmp3]           \n\t"
-    "bgtz        %[j],            2b                                 \n\t"
-    " addu       %[out_s32],      %[out_s32],      %[tmp1]           \n\t"
-   "3:                                                               \n\t"
-    "beq         %[k],            $zero,           4f                \n\t"
-    " nop                                                            \n\t"
-    "lh          %[tmp1],         0(%[p_data_in])                    \n\t"
-    "lh          %[tmp2],         0(%[p_coefs])                      \n\t"
-    "mul         %[tmp1],         %[tmp1],         %[tmp2]           \n\t"
-    "addu        %[out_s32],      %[out_s32],      %[tmp1]           \n\t"
-   "4:                                                               \n\t"
-    "sra         %[out_s32],      %[out_s32],      12                \n\t"
-    "addu        %[p_data_in_0],  %[p_data_in_0],  %[factor_2]       \n\t"
-#if defined(MIPS_DSP_R1_LE)
-    "shll_s.w    %[out_s32],      %[out_s32],      16                \n\t"
-    "sra         %[out_s32],      %[out_s32],      16                \n\t"
-#else  // #if defined(MIPS_DSP_R1_LE)
-    "slt         %[tmp1],         %[max_16],       %[out_s32]        \n\t"
-    "movn        %[out_s32],      %[max_16],       %[tmp1]           \n\t"
-    "slt         %[tmp1],         %[out_s32],      %[min_16]         \n\t"
-    "movn        %[out_s32],      %[min_16],       %[tmp1]           \n\t"
-#endif  // #if defined(MIPS_DSP_R1_LE)
-    "subu        %[i],            %[i],            %[factor]         \n\t"
-    "sh          %[out_s32],      0(%[data_out])                     \n\t"
-    "bgtz        %[i],            1b                                 \n\t"
-    " addiu      %[data_out],     %[data_out],     2                 \n\t"
-    ".set        pop                                                 \n\t"
-    : [tmp1] "=&r" (tmp1), [tmp2] "=&r" (tmp2), [tmp3] "=&r" (tmp3),
-      [tmp4] "=&r" (tmp4), [p_data_in] "=&r" (p_data_in), [k] "=&r" (k),
-      [p_data_in_0] "+r" (p_data_in_0), [p_coefs] "=&r" (p_coefficients),
-      [j] "=&r" (j), [out_s32] "=&r" (out_s32), [factor_2] "=&r" (factor_2),
-      [i] "=&r" (i)
-    : [coef_length] "r" (coefficients_length), [data_out] "r" (data_out),
-      [p_coefs_0] "r" (p_coefficients_0), [endpos] "r" (endpos),
-#if !defined(MIPS_DSP_R1_LE)
-      [max_16] "r" (max_16), [min_16] "r" (min_16),
-#endif  // #if !defined(MIPS_DSP_R1_LE)
-      [delay] "r" (delay), [factor] "r" (factor)
-    : "memory", "hi", "lo"
-  );
-#endif  // #if defined(MIPS_DSP_R2_LE)
-  return 0;
-}
diff --git a/common_audio/signal_processing/downsample_fast_neon.c b/common_audio/signal_processing/downsample_fast_neon.c
deleted file mode 100644
index 58732da..0000000
--- a/common_audio/signal_processing/downsample_fast_neon.c
+++ /dev/null
@@ -1,217 +0,0 @@
-/*
- *  Copyright (c) 2014 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/common_audio/signal_processing/include/signal_processing_library.h"
-
-#include <arm_neon.h>
-
-// NEON intrinsics version of WebRtcSpl_DownsampleFast()
-// for ARM 32-bit/64-bit platforms.
-int WebRtcSpl_DownsampleFastNeon(const int16_t* data_in,
-                                 size_t data_in_length,
-                                 int16_t* data_out,
-                                 size_t data_out_length,
-                                 const int16_t* __restrict coefficients,
-                                 size_t coefficients_length,
-                                 int factor,
-                                 size_t delay) {
-  size_t i = 0;
-  size_t j = 0;
-  int32_t out_s32 = 0;
-  size_t endpos = delay + factor * (data_out_length - 1) + 1;
-  size_t res = data_out_length & 0x7;
-  size_t endpos1 = endpos - factor * res;
-
-  // Return error if any of the running conditions doesn't meet.
-  if (data_out_length == 0 || coefficients_length == 0
-                           || data_in_length < endpos) {
-    return -1;
-  }
-
-  // First part, unroll the loop 8 times, with 3 subcases
-  // (factor == 2, 4, others).
-  switch (factor) {
-    case 2: {
-      for (i = delay; i < endpos1; i += 16) {
-        // Round value, 0.5 in Q12.
-        int32x4_t out32x4_0 = vdupq_n_s32(2048);
-        int32x4_t out32x4_1 = vdupq_n_s32(2048);
-
-#if defined(WEBRTC_ARCH_ARM64)
-        // Unroll the loop 2 times.
-        for (j = 0; j < coefficients_length - 1; j += 2) {
-          int32x2_t coeff32 = vld1_dup_s32((int32_t*)&coefficients[j]);
-          int16x4_t coeff16x4 = vreinterpret_s16_s32(coeff32);
-          int16x8x2_t in16x8x2 = vld2q_s16(&data_in[i - j - 1]);
-
-          // Mul and accumulate low 64-bit data.
-          int16x4_t in16x4_0 = vget_low_s16(in16x8x2.val[0]);
-          int16x4_t in16x4_1 = vget_low_s16(in16x8x2.val[1]);
-          out32x4_0 = vmlal_lane_s16(out32x4_0, in16x4_0, coeff16x4, 1);
-          out32x4_0 = vmlal_lane_s16(out32x4_0, in16x4_1, coeff16x4, 0);
-
-          // Mul and accumulate high 64-bit data.
-          // TODO: vget_high_s16 need extra cost on ARM64. This could be
-          // replaced by vmlal_high_lane_s16. But for the interface of
-          // vmlal_high_lane_s16, there is a bug in gcc 4.9.
-          // This issue need to be tracked in the future.
-          int16x4_t in16x4_2 = vget_high_s16(in16x8x2.val[0]);
-          int16x4_t in16x4_3 = vget_high_s16(in16x8x2.val[1]);
-          out32x4_1 = vmlal_lane_s16(out32x4_1, in16x4_2, coeff16x4, 1);
-          out32x4_1 = vmlal_lane_s16(out32x4_1, in16x4_3, coeff16x4, 0);
-        }
-
-        for (; j < coefficients_length; j++) {
-          int16x4_t coeff16x4 = vld1_dup_s16(&coefficients[j]);
-          int16x8x2_t in16x8x2 = vld2q_s16(&data_in[i - j]);
-
-          // Mul and accumulate low 64-bit data.
-          int16x4_t in16x4_0 = vget_low_s16(in16x8x2.val[0]);
-          out32x4_0 = vmlal_lane_s16(out32x4_0, in16x4_0, coeff16x4, 0);
-
-          // Mul and accumulate high 64-bit data.
-          // TODO: vget_high_s16 need extra cost on ARM64. This could be
-          // replaced by vmlal_high_lane_s16. But for the interface of
-          // vmlal_high_lane_s16, there is a bug in gcc 4.9.
-          // This issue need to be tracked in the future.
-          int16x4_t in16x4_1 = vget_high_s16(in16x8x2.val[0]);
-          out32x4_1 = vmlal_lane_s16(out32x4_1, in16x4_1, coeff16x4, 0);
-        }
-#else
-        // On ARMv7, the loop unrolling 2 times results in performance
-        // regression.
-        for (j = 0; j < coefficients_length; j++) {
-          int16x4_t coeff16x4 = vld1_dup_s16(&coefficients[j]);
-          int16x8x2_t in16x8x2 = vld2q_s16(&data_in[i - j]);
-
-          // Mul and accumulate.
-          int16x4_t in16x4_0 = vget_low_s16(in16x8x2.val[0]);
-          int16x4_t in16x4_1 = vget_high_s16(in16x8x2.val[0]);
-          out32x4_0 = vmlal_lane_s16(out32x4_0, in16x4_0, coeff16x4, 0);
-          out32x4_1 = vmlal_lane_s16(out32x4_1, in16x4_1, coeff16x4, 0);
-        }
-#endif
-
-        // Saturate and store the output.
-        int16x4_t out16x4_0 = vqshrn_n_s32(out32x4_0, 12);
-        int16x4_t out16x4_1 = vqshrn_n_s32(out32x4_1, 12);
-        vst1q_s16(data_out, vcombine_s16(out16x4_0, out16x4_1));
-        data_out += 8;
-      }
-      break;
-    }
-    case 4: {
-      for (i = delay; i < endpos1; i += 32) {
-        // Round value, 0.5 in Q12.
-        int32x4_t out32x4_0 = vdupq_n_s32(2048);
-        int32x4_t out32x4_1 = vdupq_n_s32(2048);
-
-        // Unroll the loop 4 times.
-        for (j = 0; j < coefficients_length - 3; j += 4) {
-          int16x4_t coeff16x4 = vld1_s16(&coefficients[j]);
-          int16x8x4_t in16x8x4 = vld4q_s16(&data_in[i - j - 3]);
-
-          // Mul and accumulate low 64-bit data.
-          int16x4_t in16x4_0 = vget_low_s16(in16x8x4.val[0]);
-          int16x4_t in16x4_2 = vget_low_s16(in16x8x4.val[1]);
-          int16x4_t in16x4_4 = vget_low_s16(in16x8x4.val[2]);
-          int16x4_t in16x4_6 = vget_low_s16(in16x8x4.val[3]);
-          out32x4_0 = vmlal_lane_s16(out32x4_0, in16x4_0, coeff16x4, 3);
-          out32x4_0 = vmlal_lane_s16(out32x4_0, in16x4_2, coeff16x4, 2);
-          out32x4_0 = vmlal_lane_s16(out32x4_0, in16x4_4, coeff16x4, 1);
-          out32x4_0 = vmlal_lane_s16(out32x4_0, in16x4_6, coeff16x4, 0);
-
-          // Mul and accumulate high 64-bit data.
-          // TODO: vget_high_s16 need extra cost on ARM64. This could be
-          // replaced by vmlal_high_lane_s16. But for the interface of
-          // vmlal_high_lane_s16, there is a bug in gcc 4.9.
-          // This issue need to be tracked in the future.
-          int16x4_t in16x4_1 = vget_high_s16(in16x8x4.val[0]);
-          int16x4_t in16x4_3 = vget_high_s16(in16x8x4.val[1]);
-          int16x4_t in16x4_5 = vget_high_s16(in16x8x4.val[2]);
-          int16x4_t in16x4_7 = vget_high_s16(in16x8x4.val[3]);
-          out32x4_1 = vmlal_lane_s16(out32x4_1, in16x4_1, coeff16x4, 3);
-          out32x4_1 = vmlal_lane_s16(out32x4_1, in16x4_3, coeff16x4, 2);
-          out32x4_1 = vmlal_lane_s16(out32x4_1, in16x4_5, coeff16x4, 1);
-          out32x4_1 = vmlal_lane_s16(out32x4_1, in16x4_7, coeff16x4, 0);
-        }
-
-        for (; j < coefficients_length; j++) {
-          int16x4_t coeff16x4 = vld1_dup_s16(&coefficients[j]);
-          int16x8x4_t in16x8x4 = vld4q_s16(&data_in[i - j]);
-
-          // Mul and accumulate low 64-bit data.
-          int16x4_t in16x4_0 = vget_low_s16(in16x8x4.val[0]);
-          out32x4_0 = vmlal_lane_s16(out32x4_0, in16x4_0, coeff16x4, 0);
-
-          // Mul and accumulate high 64-bit data.
-          // TODO: vget_high_s16 need extra cost on ARM64. This could be
-          // replaced by vmlal_high_lane_s16. But for the interface of
-          // vmlal_high_lane_s16, there is a bug in gcc 4.9.
-          // This issue need to be tracked in the future.
-          int16x4_t in16x4_1 = vget_high_s16(in16x8x4.val[0]);
-          out32x4_1 = vmlal_lane_s16(out32x4_1, in16x4_1, coeff16x4, 0);
-        }
-
-        // Saturate and store the output.
-        int16x4_t out16x4_0 = vqshrn_n_s32(out32x4_0, 12);
-        int16x4_t out16x4_1 = vqshrn_n_s32(out32x4_1, 12);
-        vst1q_s16(data_out, vcombine_s16(out16x4_0, out16x4_1));
-        data_out += 8;
-      }
-      break;
-    }
-    default: {
-      for (i = delay; i < endpos1; i += factor * 8) {
-        // Round value, 0.5 in Q12.
-        int32x4_t out32x4_0 = vdupq_n_s32(2048);
-        int32x4_t out32x4_1 = vdupq_n_s32(2048);
-
-        for (j = 0; j < coefficients_length; j++) {
-          int16x4_t coeff16x4 = vld1_dup_s16(&coefficients[j]);
-          int16x4_t in16x4_0 = vld1_dup_s16(&data_in[i - j]);
-          in16x4_0 = vld1_lane_s16(&data_in[i + factor - j], in16x4_0, 1);
-          in16x4_0 = vld1_lane_s16(&data_in[i + factor * 2 - j], in16x4_0, 2);
-          in16x4_0 = vld1_lane_s16(&data_in[i + factor * 3 - j], in16x4_0, 3);
-          int16x4_t in16x4_1 = vld1_dup_s16(&data_in[i + factor * 4 - j]);
-          in16x4_1 = vld1_lane_s16(&data_in[i + factor * 5 - j], in16x4_1, 1);
-          in16x4_1 = vld1_lane_s16(&data_in[i + factor * 6 - j], in16x4_1, 2);
-          in16x4_1 = vld1_lane_s16(&data_in[i + factor * 7 - j], in16x4_1, 3);
-
-          // Mul and accumulate.
-          out32x4_0 = vmlal_lane_s16(out32x4_0, in16x4_0, coeff16x4, 0);
-          out32x4_1 = vmlal_lane_s16(out32x4_1, in16x4_1, coeff16x4, 0);
-        }
-
-        // Saturate and store the output.
-        int16x4_t out16x4_0 = vqshrn_n_s32(out32x4_0, 12);
-        int16x4_t out16x4_1 = vqshrn_n_s32(out32x4_1, 12);
-        vst1q_s16(data_out, vcombine_s16(out16x4_0, out16x4_1));
-        data_out += 8;
-      }
-      break;
-    }
-  }
-
-  // Second part, do the rest iterations (if any).
-  for (; i < endpos; i += factor) {
-    out_s32 = 2048;  // Round value, 0.5 in Q12.
-
-    for (j = 0; j < coefficients_length; j++) {
-      out_s32 = WebRtc_MulAccumW16(coefficients[j], data_in[i - j], out_s32);
-    }
-
-    // Saturate and store the output.
-    out_s32 >>= 12;
-    *data_out++ = WebRtcSpl_SatW32ToW16(out_s32);
-  }
-
-  return 0;
-}
diff --git a/common_audio/signal_processing/energy.c b/common_audio/signal_processing/energy.c
deleted file mode 100644
index e83f1a6..0000000
--- a/common_audio/signal_processing/energy.c
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-
-/*
- * This file contains the function WebRtcSpl_Energy().
- * The description header can be found in signal_processing_library.h
- *
- */
-
-#include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
-
-int32_t WebRtcSpl_Energy(int16_t* vector,
-                         size_t vector_length,
-                         int* scale_factor)
-{
-    int32_t en = 0;
-    size_t i;
-    int scaling =
-        WebRtcSpl_GetScalingSquare(vector, vector_length, vector_length);
-    size_t looptimes = vector_length;
-    int16_t *vectorptr = vector;
-
-    for (i = 0; i < looptimes; i++)
-    {
-      en += (*vectorptr * *vectorptr) >> scaling;
-      vectorptr++;
-    }
-    *scale_factor = scaling;
-
-    return en;
-}
diff --git a/common_audio/signal_processing/filter_ar.c b/common_audio/signal_processing/filter_ar.c
deleted file mode 100644
index d389ee4..0000000
--- a/common_audio/signal_processing/filter_ar.c
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-
-/*
- * This file contains the function WebRtcSpl_FilterAR().
- * The description header can be found in signal_processing_library.h
- *
- */
-
-#include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
-
-size_t WebRtcSpl_FilterAR(const int16_t* a,
-                          size_t a_length,
-                          const int16_t* x,
-                          size_t x_length,
-                          int16_t* state,
-                          size_t state_length,
-                          int16_t* state_low,
-                          size_t state_low_length,
-                          int16_t* filtered,
-                          int16_t* filtered_low,
-                          size_t filtered_low_length)
-{
-    int32_t o;
-    int32_t oLOW;
-    size_t i, j, stop;
-    const int16_t* x_ptr = &x[0];
-    int16_t* filteredFINAL_ptr = filtered;
-    int16_t* filteredFINAL_LOW_ptr = filtered_low;
-
-    for (i = 0; i < x_length; i++)
-    {
-        // Calculate filtered[i] and filtered_low[i]
-        const int16_t* a_ptr = &a[1];
-        int16_t* filtered_ptr = &filtered[i - 1];
-        int16_t* filtered_low_ptr = &filtered_low[i - 1];
-        int16_t* state_ptr = &state[state_length - 1];
-        int16_t* state_low_ptr = &state_low[state_length - 1];
-
-        o = (int32_t)(*x_ptr++) * (1 << 12);
-        oLOW = (int32_t)0;
-
-        stop = (i < a_length) ? i + 1 : a_length;
-        for (j = 1; j < stop; j++)
-        {
-          o -= *a_ptr * *filtered_ptr--;
-          oLOW -= *a_ptr++ * *filtered_low_ptr--;
-        }
-        for (j = i + 1; j < a_length; j++)
-        {
-          o -= *a_ptr * *state_ptr--;
-          oLOW -= *a_ptr++ * *state_low_ptr--;
-        }
-
-        o += (oLOW >> 12);
-        *filteredFINAL_ptr = (int16_t)((o + (int32_t)2048) >> 12);
-        *filteredFINAL_LOW_ptr++ =
-            (int16_t)(o - ((int32_t)(*filteredFINAL_ptr++) * (1 << 12)));
-    }
-
-    // Save the filter state
-    if (x_length >= state_length)
-    {
-        WebRtcSpl_CopyFromEndW16(filtered, x_length, a_length - 1, state);
-        WebRtcSpl_CopyFromEndW16(filtered_low, x_length, a_length - 1, state_low);
-    } else
-    {
-        for (i = 0; i < state_length - x_length; i++)
-        {
-            state[i] = state[i + x_length];
-            state_low[i] = state_low[i + x_length];
-        }
-        for (i = 0; i < x_length; i++)
-        {
-            state[state_length - x_length + i] = filtered[i];
-            state[state_length - x_length + i] = filtered_low[i];
-        }
-    }
-
-    return x_length;
-}
diff --git a/common_audio/signal_processing/filter_ar_fast_q12.c b/common_audio/signal_processing/filter_ar_fast_q12.c
deleted file mode 100644
index 71be360..0000000
--- a/common_audio/signal_processing/filter_ar_fast_q12.c
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- *  Copyright (c) 2012 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/rtc_base/checks.h"
-#include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
-
-// TODO(bjornv): Change the return type to report errors.
-
-void WebRtcSpl_FilterARFastQ12(const int16_t* data_in,
-                               int16_t* data_out,
-                               const int16_t* __restrict coefficients,
-                               size_t coefficients_length,
-                               size_t data_length) {
-  size_t i = 0;
-  size_t j = 0;
-
-  RTC_DCHECK_GT(data_length, 0);
-  RTC_DCHECK_GT(coefficients_length, 1);
-
-  for (i = 0; i < data_length; i++) {
-    int32_t output = 0;
-    int32_t sum = 0;
-
-    for (j = coefficients_length - 1; j > 0; j--) {
-      sum += coefficients[j] * data_out[i - j];
-    }
-
-    output = coefficients[0] * data_in[i];
-    output -= sum;
-
-    // Saturate and store the output.
-    output = WEBRTC_SPL_SAT(134215679, output, -134217728);
-    data_out[i] = (int16_t)((output + 2048) >> 12);
-  }
-}
diff --git a/common_audio/signal_processing/filter_ar_fast_q12_armv7.S b/common_audio/signal_processing/filter_ar_fast_q12_armv7.S
deleted file mode 100644
index f163627..0000000
--- a/common_audio/signal_processing/filter_ar_fast_q12_armv7.S
+++ /dev/null
@@ -1,218 +0,0 @@
-@
-@ Copyright (c) 2012 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.
-@
-
-@ This file contains the function WebRtcSpl_FilterARFastQ12(), optimized for
-@ ARMv7  platform. The description header can be found in
-@ signal_processing_library.h
-@
-@ Output is bit-exact with the generic C code as in filter_ar_fast_q12.c, and
-@ the reference C code at end of this file.
-
-@ Assumptions:
-@ (1) data_length > 0
-@ (2) coefficients_length > 1
-
-@ Register usage:
-@
-@ r0:  &data_in[i]
-@ r1:  &data_out[i], for result ouput
-@ r2:  &coefficients[0]
-@ r3:  coefficients_length
-@ r4:  Iteration counter for the outer loop.
-@ r5:  data_out[j] as multiplication inputs
-@ r6:  Calculated value for output data_out[]; interation counter for inner loop
-@ r7:  Partial sum of a filtering multiplication results
-@ r8:  Partial sum of a filtering multiplication results
-@ r9:  &data_out[], for filtering input; data_in[i]
-@ r10: coefficients[j]
-@ r11: Scratch
-@ r12: &coefficients[j]
-
-#include "webrtc/system_wrappers/include/asm_defines.h"
-
-GLOBAL_FUNCTION WebRtcSpl_FilterARFastQ12
-.align  2
-DEFINE_FUNCTION WebRtcSpl_FilterARFastQ12
-  push {r4-r11}
-
-  ldrsh r12, [sp, #32]         @ data_length
-  subs r4, r12, #1
-  beq ODD_LENGTH               @ jump if data_length == 1
-
-LOOP_LENGTH:
-  add r12, r2, r3, lsl #1
-  sub r12, #4                  @ &coefficients[coefficients_length - 2]
-  sub r9, r1, r3, lsl #1
-  add r9, #2                   @ &data_out[i - coefficients_length + 1]
-  ldr r5, [r9], #4             @ data_out[i - coefficients_length + {1,2}]
-
-  mov r7, #0                   @ sum1
-  mov r8, #0                   @ sum2
-  subs r6, r3, #3              @ Iteration counter for inner loop.
-  beq ODD_A_LENGTH             @ branch if coefficients_length == 3
-  blt POST_LOOP_A_LENGTH       @ branch if coefficients_length == 2
-
-LOOP_A_LENGTH:
-  ldr r10, [r12], #-4          @ coefficients[j - 1], coefficients[j]
-  subs r6, #2
-  smlatt r8, r10, r5, r8       @ sum2 += coefficients[j] * data_out[i - j + 1];
-  smlatb r7, r10, r5, r7       @ sum1 += coefficients[j] * data_out[i - j];
-  smlabt r7, r10, r5, r7       @ coefficients[j - 1] * data_out[i - j + 1];
-  ldr r5, [r9], #4             @ data_out[i - j + 2],  data_out[i - j + 3]
-  smlabb r8, r10, r5, r8       @ coefficients[j - 1] * data_out[i - j + 2];
-  bgt LOOP_A_LENGTH
-  blt POST_LOOP_A_LENGTH
-
-ODD_A_LENGTH:
-  ldrsh r10, [r12, #2]         @ Filter coefficients coefficients[2]
-  sub r12, #2                  @ &coefficients[0]
-  smlabb r7, r10, r5, r7       @ sum1 += coefficients[2] * data_out[i - 2];
-  smlabt r8, r10, r5, r8       @ sum2 += coefficients[2] * data_out[i - 1];
-  ldr r5, [r9, #-2]            @ data_out[i - 1],  data_out[i]
-
-POST_LOOP_A_LENGTH:
-  ldr r10, [r12]               @ coefficients[0], coefficients[1]
-  smlatb r7, r10, r5, r7       @ sum1 += coefficients[1] * data_out[i - 1];
-
-  ldr r9, [r0], #4             @ data_in[i], data_in[i + 1]
-  smulbb r6, r10, r9           @ output1 = coefficients[0] * data_in[i];
-  sub r6, r7                   @ output1 -= sum1;
-
-  sbfx r11, r6, #12, #16
-  ssat r7, #16, r6, asr #12
-  cmp r7, r11
-  addeq r6, r6, #2048
-  ssat r6, #16, r6, asr #12
-  strh r6, [r1], #2            @ Store data_out[i]
-
-  smlatb r8, r10, r6, r8       @ sum2 += coefficients[1] * data_out[i];
-  smulbt r6, r10, r9           @ output2 = coefficients[0] * data_in[i + 1];
-  sub r6, r8                   @ output1 -= sum1;
-
-  sbfx r11, r6, #12, #16
-  ssat r7, #16, r6, asr #12
-  cmp r7, r11
-  addeq r6, r6, #2048
-  ssat r6, #16, r6, asr #12
-  strh r6, [r1], #2            @ Store data_out[i + 1]
-
-  subs r4, #2
-  bgt LOOP_LENGTH
-  blt END                      @ For even data_length, it's done. Jump to END.
-
-@ Process i = data_length -1, for the case of an odd length.
-ODD_LENGTH:
-  add r12, r2, r3, lsl #1
-  sub r12, #4                  @ &coefficients[coefficients_length - 2]
-  sub r9, r1, r3, lsl #1
-  add r9, #2                   @ &data_out[i - coefficients_length + 1]
-  mov r7, #0                   @ sum1
-  mov r8, #0                   @ sum1
-  subs r6, r3, #2              @ inner loop counter
-  beq EVEN_A_LENGTH            @ branch if coefficients_length == 2
-
-LOOP2_A_LENGTH:
-  ldr r10, [r12], #-4          @ coefficients[j - 1], coefficients[j]
-  ldr r5, [r9], #4             @ data_out[i - j],  data_out[i - j + 1]
-  subs r6, #2
-  smlatb r7, r10, r5, r7       @ sum1 += coefficients[j] * data_out[i - j];
-  smlabt r8, r10, r5, r8       @ coefficients[j - 1] * data_out[i - j + 1];
-  bgt LOOP2_A_LENGTH
-  addlt r12, #2
-  blt POST_LOOP2_A_LENGTH
-
-EVEN_A_LENGTH:
-  ldrsh r10, [r12, #2]         @ Filter coefficients coefficients[1]
-  ldrsh r5, [r9]               @ data_out[i - 1]
-  smlabb r7, r10, r5, r7       @ sum1 += coefficients[1] * data_out[i - 1];
-
-POST_LOOP2_A_LENGTH:
-  ldrsh r10, [r12]             @ Filter coefficients coefficients[0]
-  ldrsh r9, [r0]               @ data_in[i]
-  smulbb r6, r10, r9           @ output1 = coefficients[0] * data_in[i];
-  sub r6, r7                   @ output1 -= sum1;
-  sub r6, r8                   @ output1 -= sum1;
-  sbfx r8, r6, #12, #16
-  ssat r7, #16, r6, asr #12
-  cmp r7, r8
-  addeq r6, r6, #2048
-  ssat r6, #16, r6, asr #12
-  strh r6, [r1]                @ Store the data_out[i]
-
-END:
-  pop {r4-r11}
-  bx  lr
-
-@Reference C code:
-@
-@void WebRtcSpl_FilterARFastQ12(int16_t* data_in,
-@                               int16_t* data_out,
-@                               int16_t* __restrict coefficients,
-@                               size_t coefficients_length,
-@                               size_t data_length) {
-@  size_t i = 0;
-@  size_t j = 0;
-@
-@  assert(data_length > 0);
-@  assert(coefficients_length > 1);
-@
-@  for (i = 0; i < data_length - 1; i += 2) {
-@    int32_t output1 = 0;
-@    int32_t sum1 = 0;
-@    int32_t output2 = 0;
-@    int32_t sum2 = 0;
-@
-@    for (j = coefficients_length - 1; j > 2; j -= 2) {
-@      sum1 += coefficients[j]      * data_out[i - j];
-@      sum1 += coefficients[j - 1]  * data_out[i - j + 1];
-@      sum2 += coefficients[j]     * data_out[i - j + 1];
-@      sum2 += coefficients[j - 1] * data_out[i - j + 2];
-@    }
-@
-@    if (j == 2) {
-@      sum1 += coefficients[2] * data_out[i - 2];
-@      sum2 += coefficients[2] * data_out[i - 1];
-@    }
-@
-@    sum1 += coefficients[1] * data_out[i - 1];
-@    output1 = coefficients[0] * data_in[i];
-@    output1 -= sum1;
-@    // Saturate and store the output.
-@    output1 = WEBRTC_SPL_SAT(134215679, output1, -134217728);
-@    data_out[i] = (int16_t)((output1 + 2048) >> 12);
-@
-@    sum2 += coefficients[1] * data_out[i];
-@    output2 = coefficients[0] * data_in[i + 1];
-@    output2 -= sum2;
-@    // Saturate and store the output.
-@    output2 = WEBRTC_SPL_SAT(134215679, output2, -134217728);
-@    data_out[i + 1] = (int16_t)((output2 + 2048) >> 12);
-@  }
-@
-@  if (i == data_length - 1) {
-@    int32_t output1 = 0;
-@    int32_t sum1 = 0;
-@
-@    for (j = coefficients_length - 1; j > 1; j -= 2) {
-@      sum1 += coefficients[j]      * data_out[i - j];
-@      sum1 += coefficients[j - 1]  * data_out[i - j + 1];
-@    }
-@
-@    if (j == 1) {
-@      sum1 += coefficients[1] * data_out[i - 1];
-@    }
-@
-@    output1 = coefficients[0] * data_in[i];
-@    output1 -= sum1;
-@    // Saturate and store the output.
-@    output1 = WEBRTC_SPL_SAT(134215679, output1, -134217728);
-@    data_out[i] = (int16_t)((output1 + 2048) >> 12);
-@  }
-@}
diff --git a/common_audio/signal_processing/filter_ar_fast_q12_mips.c b/common_audio/signal_processing/filter_ar_fast_q12_mips.c
deleted file mode 100644
index d6ee401..0000000
--- a/common_audio/signal_processing/filter_ar_fast_q12_mips.c
+++ /dev/null
@@ -1,140 +0,0 @@
-/*
- *  Copyright (c) 2013 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/rtc_base/checks.h"
-#include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
-
-void WebRtcSpl_FilterARFastQ12(const int16_t* data_in,
-                               int16_t* data_out,
-                               const int16_t* __restrict coefficients,
-                               size_t coefficients_length,
-                               size_t data_length) {
-  int r0, r1, r2, r3;
-  int coef0, offset;
-  int i, j, k;
-  int coefptr, outptr, tmpout, inptr;
-#if !defined(MIPS_DSP_R1_LE)
-  int max16 = 0x7FFF;
-  int min16 = 0xFFFF8000;
-#endif  // #if !defined(MIPS_DSP_R1_LE)
-
-  RTC_DCHECK_GT(data_length, 0);
-  RTC_DCHECK_GT(coefficients_length, 1);
-
-  __asm __volatile (
-    ".set       push                                             \n\t"
-    ".set       noreorder                                        \n\t"
-    "addiu      %[i],       %[data_length],          0           \n\t"
-    "lh         %[coef0],   0(%[coefficients])                   \n\t"
-    "addiu      %[j],       %[coefficients_length],  -1          \n\t"
-    "andi       %[k],       %[j],                    1           \n\t"
-    "sll        %[offset],  %[j],                    1           \n\t"
-    "subu       %[outptr],  %[data_out],             %[offset]   \n\t"
-    "addiu      %[inptr],   %[data_in],              0           \n\t"
-    "bgtz       %[k],       3f                                   \n\t"
-    " addu      %[coefptr], %[coefficients],         %[offset]   \n\t"
-   "1:                                                           \n\t"
-    "lh         %[r0],      0(%[inptr])                          \n\t"
-    "addiu      %[i],       %[i],                    -1          \n\t"
-    "addiu      %[tmpout],  %[outptr],               0           \n\t"
-    "mult       %[r0],      %[coef0]                             \n\t"
-   "2:                                                           \n\t"
-    "lh         %[r0],      0(%[tmpout])                         \n\t"
-    "lh         %[r1],      0(%[coefptr])                        \n\t"
-    "lh         %[r2],      2(%[tmpout])                         \n\t"
-    "lh         %[r3],      -2(%[coefptr])                       \n\t"
-    "addiu      %[tmpout],  %[tmpout],               4           \n\t"
-    "msub       %[r0],      %[r1]                                \n\t"
-    "msub       %[r2],      %[r3]                                \n\t"
-    "addiu      %[j],       %[j],                    -2          \n\t"
-    "bgtz       %[j],       2b                                   \n\t"
-    " addiu     %[coefptr], %[coefptr],              -4          \n\t"
-#if defined(MIPS_DSP_R1_LE)
-    "extr_r.w   %[r0],      $ac0,                    12          \n\t"
-#else  // #if defined(MIPS_DSP_R1_LE)
-    "mflo       %[r0]                                            \n\t"
-#endif  // #if defined(MIPS_DSP_R1_LE)
-    "addu       %[coefptr], %[coefficients],         %[offset]   \n\t"
-    "addiu      %[inptr],   %[inptr],                2           \n\t"
-    "addiu      %[j],       %[coefficients_length],  -1          \n\t"
-#if defined(MIPS_DSP_R1_LE)
-    "shll_s.w   %[r0],      %[r0],                   16          \n\t"
-    "sra        %[r0],      %[r0],                   16          \n\t"
-#else  // #if defined(MIPS_DSP_R1_LE)
-    "addiu      %[r0],      %[r0],                   2048        \n\t"
-    "sra        %[r0],      %[r0],                   12          \n\t"
-    "slt        %[r1],      %[max16],                %[r0]       \n\t"
-    "movn       %[r0],      %[max16],                %[r1]       \n\t"
-    "slt        %[r1],      %[r0],                   %[min16]    \n\t"
-    "movn       %[r0],      %[min16],                %[r1]       \n\t"
-#endif  // #if defined(MIPS_DSP_R1_LE)
-    "sh         %[r0],      0(%[tmpout])                         \n\t"
-    "bgtz       %[i],       1b                                   \n\t"
-    " addiu     %[outptr],  %[outptr],               2           \n\t"
-    "b          5f                                               \n\t"
-    " nop                                                        \n\t"
-   "3:                                                           \n\t"
-    "lh         %[r0],      0(%[inptr])                          \n\t"
-    "addiu      %[i],       %[i],                    -1          \n\t"
-    "addiu      %[tmpout],  %[outptr],               0           \n\t"
-    "mult       %[r0],      %[coef0]                             \n\t"
-   "4:                                                           \n\t"
-    "lh         %[r0],      0(%[tmpout])                         \n\t"
-    "lh         %[r1],      0(%[coefptr])                        \n\t"
-    "lh         %[r2],      2(%[tmpout])                         \n\t"
-    "lh         %[r3],      -2(%[coefptr])                       \n\t"
-    "addiu      %[tmpout],  %[tmpout],               4           \n\t"
-    "msub       %[r0],      %[r1]                                \n\t"
-    "msub       %[r2],      %[r3]                                \n\t"
-    "addiu      %[j],       %[j],                    -2          \n\t"
-    "bgtz       %[j],       4b                                   \n\t"
-    " addiu     %[coefptr], %[coefptr],              -4          \n\t"
-    "lh         %[r0],      0(%[tmpout])                         \n\t"
-    "lh         %[r1],      0(%[coefptr])                        \n\t"
-    "msub       %[r0],      %[r1]                                \n\t"
-#if defined(MIPS_DSP_R1_LE)
-    "extr_r.w   %[r0],      $ac0,                    12          \n\t"
-#else  // #if defined(MIPS_DSP_R1_LE)
-    "mflo       %[r0]                                            \n\t"
-#endif  // #if defined(MIPS_DSP_R1_LE)
-    "addu       %[coefptr], %[coefficients],         %[offset]   \n\t"
-    "addiu      %[inptr],   %[inptr],                2           \n\t"
-    "addiu      %[j],       %[coefficients_length],  -1          \n\t"
-#if defined(MIPS_DSP_R1_LE)
-    "shll_s.w   %[r0],      %[r0],                   16          \n\t"
-    "sra        %[r0],      %[r0],                   16          \n\t"
-#else  // #if defined(MIPS_DSP_R1_LE)
-    "addiu      %[r0],      %[r0],                   2048        \n\t"
-    "sra        %[r0],      %[r0],                   12          \n\t"
-    "slt        %[r1],      %[max16],                %[r0]       \n\t"
-    "movn       %[r0],      %[max16],                %[r1]       \n\t"
-    "slt        %[r1],      %[r0],                   %[min16]    \n\t"
-    "movn       %[r0],      %[min16],                %[r1]       \n\t"
-#endif  // #if defined(MIPS_DSP_R1_LE)
-    "sh         %[r0],      2(%[tmpout])                         \n\t"
-    "bgtz       %[i],       3b                                   \n\t"
-    " addiu     %[outptr],  %[outptr],               2           \n\t"
-   "5:                                                           \n\t"
-    ".set       pop                                              \n\t"
-    : [i] "=&r" (i), [j] "=&r" (j), [k] "=&r" (k), [r0] "=&r" (r0),
-      [r1] "=&r" (r1), [r2] "=&r" (r2), [r3] "=&r" (r3),
-      [coef0] "=&r" (coef0), [offset] "=&r" (offset),
-      [outptr] "=&r" (outptr), [inptr] "=&r" (inptr),
-      [coefptr] "=&r" (coefptr), [tmpout] "=&r" (tmpout)
-    : [coefficients] "r" (coefficients), [data_length] "r" (data_length),
-      [coefficients_length] "r" (coefficients_length),
-#if !defined(MIPS_DSP_R1_LE)
-      [max16] "r" (max16), [min16] "r" (min16),
-#endif
-      [data_out] "r" (data_out), [data_in] "r" (data_in)
-    : "hi", "lo", "memory"
-  );
-}
-
diff --git a/common_audio/signal_processing/filter_ma_fast_q12.c b/common_audio/signal_processing/filter_ma_fast_q12.c
deleted file mode 100644
index ded1ad6..0000000
--- a/common_audio/signal_processing/filter_ma_fast_q12.c
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-
-/*
- * This file contains the function WebRtcSpl_FilterMAFastQ12().
- * The description header can be found in signal_processing_library.h
- *
- */
-
-#include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
-
-#include "webrtc/rtc_base/sanitizer.h"
-
-void WebRtcSpl_FilterMAFastQ12(const int16_t* in_ptr,
-                               int16_t* out_ptr,
-                               const int16_t* B,
-                               size_t B_length,
-                               size_t length)
-{
-    size_t i, j;
-
-    rtc_MsanCheckInitialized(B, sizeof(B[0]), B_length);
-    rtc_MsanCheckInitialized(in_ptr - B_length + 1, sizeof(in_ptr[0]),
-                             B_length + length - 1);
-
-    for (i = 0; i < length; i++)
-    {
-        int32_t o = 0;
-
-        for (j = 0; j < B_length; j++)
-        {
-          o += B[j] * in_ptr[i - j];
-        }
-
-        // If output is higher than 32768, saturate it. Same with negative side
-        // 2^27 = 134217728, which corresponds to 32768 in Q12
-
-        // Saturate the output
-        o = WEBRTC_SPL_SAT((int32_t)134215679, o, (int32_t)-134217728);
-
-        *out_ptr++ = (int16_t)((o + (int32_t)2048) >> 12);
-    }
-    return;
-}
diff --git a/common_audio/signal_processing/get_hanning_window.c b/common_audio/signal_processing/get_hanning_window.c
deleted file mode 100644
index d83ac21..0000000
--- a/common_audio/signal_processing/get_hanning_window.c
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-
-/*
- * This file contains the function WebRtcSpl_GetHanningWindow().
- * The description header can be found in signal_processing_library.h
- *
- */
-
-#include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
-
-// Hanning table with 256 entries
-static const int16_t kHanningTable[] = {
-    1,      2,      6,     10,     15,     22,     30,     39,
-   50,     62,     75,     89,    104,    121,    138,    157,
-  178,    199,    222,    246,    271,    297,    324,    353,
-  383,    413,    446,    479,    513,    549,    586,    624,
-  663,    703,    744,    787,    830,    875,    920,    967,
- 1015,   1064,   1114,   1165,   1218,   1271,   1325,   1381,
- 1437,   1494,   1553,   1612,   1673,   1734,   1796,   1859,
- 1924,   1989,   2055,   2122,   2190,   2259,   2329,   2399,
- 2471,   2543,   2617,   2691,   2765,   2841,   2918,   2995,
- 3073,   3152,   3232,   3312,   3393,   3475,   3558,   3641,
- 3725,   3809,   3895,   3980,   4067,   4154,   4242,   4330,
- 4419,   4509,   4599,   4689,   4781,   4872,   4964,   5057,
- 5150,   5244,   5338,   5432,   5527,   5622,   5718,   5814,
- 5910,   6007,   6104,   6202,   6299,   6397,   6495,   6594,
- 6693,   6791,   6891,   6990,   7090,   7189,   7289,   7389,
- 7489,   7589,   7690,   7790,   7890,   7991,   8091,   8192,
- 8293,   8393,   8494,   8594,   8694,   8795,   8895,   8995,
- 9095,   9195,   9294,   9394,   9493,   9593,   9691,   9790,
- 9889,   9987,  10085,  10182,  10280,  10377,  10474,  10570,
-10666,  10762,  10857,  10952,  11046,  11140,  11234,  11327,
-11420,  11512,  11603,  11695,  11785,  11875,  11965,  12054,
-12142,  12230,  12317,  12404,  12489,  12575,  12659,  12743,
-12826,  12909,  12991,  13072,  13152,  13232,  13311,  13389,
-13466,  13543,  13619,  13693,  13767,  13841,  13913,  13985,
-14055,  14125,  14194,  14262,  14329,  14395,  14460,  14525,
-14588,  14650,  14711,  14772,  14831,  14890,  14947,  15003,
-15059,  15113,  15166,  15219,  15270,  15320,  15369,  15417,
-15464,  15509,  15554,  15597,  15640,  15681,  15721,  15760,
-15798,  15835,  15871,  15905,  15938,  15971,  16001,  16031,
-16060,  16087,  16113,  16138,  16162,  16185,  16206,  16227,
-16246,  16263,  16280,  16295,  16309,  16322,  16334,  16345,
-16354,  16362,  16369,  16374,  16378,  16382,  16383,  16384
-};
-
-void WebRtcSpl_GetHanningWindow(int16_t *v, size_t size)
-{
-    size_t jj;
-    int16_t *vptr1;
-
-    int32_t index;
-    int32_t factor = ((int32_t)0x40000000);
-
-    factor = WebRtcSpl_DivW32W16(factor, (int16_t)size);
-    if (size < 513)
-        index = (int32_t)-0x200000;
-    else
-        index = (int32_t)-0x100000;
-    vptr1 = v;
-
-    for (jj = 0; jj < size; jj++)
-    {
-        index += factor;
-        (*vptr1++) = kHanningTable[index >> 22];
-    }
-
-}
diff --git a/common_audio/signal_processing/get_scaling_square.c b/common_audio/signal_processing/get_scaling_square.c
deleted file mode 100644
index 82e3c8b..0000000
--- a/common_audio/signal_processing/get_scaling_square.c
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-
-/*
- * This file contains the function WebRtcSpl_GetScalingSquare().
- * The description header can be found in signal_processing_library.h
- *
- */
-
-#include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
-
-int16_t WebRtcSpl_GetScalingSquare(int16_t* in_vector,
-                                   size_t in_vector_length,
-                                   size_t times)
-{
-    int16_t nbits = WebRtcSpl_GetSizeInBits((uint32_t)times);
-    size_t i;
-    int16_t smax = -1;
-    int16_t sabs;
-    int16_t *sptr = in_vector;
-    int16_t t;
-    size_t looptimes = in_vector_length;
-
-    for (i = looptimes; i > 0; i--)
-    {
-        sabs = (*sptr > 0 ? *sptr++ : -*sptr++);
-        smax = (sabs > smax ? sabs : smax);
-    }
-    t = WebRtcSpl_NormW32(WEBRTC_SPL_MUL(smax, smax));
-
-    if (smax == 0)
-    {
-        return 0; // Since norm(0) returns 0
-    } else
-    {
-        return (t > nbits) ? 0 : nbits - t;
-    }
-}
diff --git a/common_audio/signal_processing/ilbc_specific_functions.c b/common_audio/signal_processing/ilbc_specific_functions.c
deleted file mode 100644
index 301a922..0000000
--- a/common_audio/signal_processing/ilbc_specific_functions.c
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- *  Copyright (c) 2012 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.
- */
-
-
-/*
- * This file contains implementations of the iLBC specific functions
- * WebRtcSpl_ReverseOrderMultArrayElements()
- * WebRtcSpl_ElementwiseVectorMult()
- * WebRtcSpl_AddVectorsAndShift()
- * WebRtcSpl_AddAffineVectorToVector()
- * WebRtcSpl_AffineTransformVector()
- *
- */
-
-#include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
-
-void WebRtcSpl_ReverseOrderMultArrayElements(int16_t *out, const int16_t *in,
-                                             const int16_t *win,
-                                             size_t vector_length,
-                                             int16_t right_shifts)
-{
-    size_t i;
-    int16_t *outptr = out;
-    const int16_t *inptr = in;
-    const int16_t *winptr = win;
-    for (i = 0; i < vector_length; i++)
-    {
-      *outptr++ = (int16_t)((*inptr++ * *winptr--) >> right_shifts);
-    }
-}
-
-void WebRtcSpl_ElementwiseVectorMult(int16_t *out, const int16_t *in,
-                                     const int16_t *win, size_t vector_length,
-                                     int16_t right_shifts)
-{
-    size_t i;
-    int16_t *outptr = out;
-    const int16_t *inptr = in;
-    const int16_t *winptr = win;
-    for (i = 0; i < vector_length; i++)
-    {
-      *outptr++ = (int16_t)((*inptr++ * *winptr++) >> right_shifts);
-    }
-}
-
-void WebRtcSpl_AddVectorsAndShift(int16_t *out, const int16_t *in1,
-                                  const int16_t *in2, size_t vector_length,
-                                  int16_t right_shifts)
-{
-    size_t i;
-    int16_t *outptr = out;
-    const int16_t *in1ptr = in1;
-    const int16_t *in2ptr = in2;
-    for (i = vector_length; i > 0; i--)
-    {
-        (*outptr++) = (int16_t)(((*in1ptr++) + (*in2ptr++)) >> right_shifts);
-    }
-}
-
-void WebRtcSpl_AddAffineVectorToVector(int16_t *out, int16_t *in,
-                                       int16_t gain, int32_t add_constant,
-                                       int16_t right_shifts,
-                                       size_t vector_length)
-{
-    size_t i;
-
-    for (i = 0; i < vector_length; i++)
-    {
-      out[i] += (int16_t)((in[i] * gain + add_constant) >> right_shifts);
-    }
-}
-
-void WebRtcSpl_AffineTransformVector(int16_t *out, int16_t *in,
-                                     int16_t gain, int32_t add_constant,
-                                     int16_t right_shifts, size_t vector_length)
-{
-    size_t i;
-
-    for (i = 0; i < vector_length; i++)
-    {
-      out[i] = (int16_t)((in[i] * gain + add_constant) >> right_shifts);
-    }
-}
diff --git a/common_audio/signal_processing/include/real_fft.h b/common_audio/signal_processing/include/real_fft.h
deleted file mode 100644
index ed0db76..0000000
--- a/common_audio/signal_processing/include/real_fft.h
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- *  Copyright (c) 2012 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_COMMON_AUDIO_SIGNAL_PROCESSING_INCLUDE_REAL_FFT_H_
-#define WEBRTC_COMMON_AUDIO_SIGNAL_PROCESSING_INCLUDE_REAL_FFT_H_
-
-#include "webrtc/typedefs.h"
-
-// For ComplexFFT(), the maximum fft order is 10;
-// for OpenMax FFT in ARM, it is 12;
-// WebRTC APM uses orders of only 7 and 8.
-enum {kMaxFFTOrder = 10};
-
-struct RealFFT;
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-struct RealFFT* WebRtcSpl_CreateRealFFT(int order);
-void WebRtcSpl_FreeRealFFT(struct RealFFT* self);
-
-// Compute an FFT for a real-valued signal of length of 2^order,
-// where 1 < order <= MAX_FFT_ORDER. Transform length is determined by the
-// specification structure, which must be initialized prior to calling the FFT
-// function with WebRtcSpl_CreateRealFFT().
-// The relationship between the input and output sequences can
-// be expressed in terms of the DFT, i.e.:
-//     x[n] = (2^(-scalefactor)/N)  . SUM[k=0,...,N-1] X[k].e^(jnk.2.pi/N)
-//     n=0,1,2,...N-1
-//     N=2^order.
-// The conjugate-symmetric output sequence is represented using a CCS vector,
-// which is of length N+2, and is organized as follows:
-//     Index:      0  1  2  3  4  5   . . .   N-2       N-1       N       N+1
-//     Component:  R0 0  R1 I1 R2 I2  . . .   R[N/2-1]  I[N/2-1]  R[N/2]  0
-// where R[n] and I[n], respectively, denote the real and imaginary components
-// for FFT bin 'n'. Bins  are numbered from 0 to N/2, where N is the FFT length.
-// Bin index 0 corresponds to the DC component, and bin index N/2 corresponds to
-// the foldover frequency.
-//
-// Input Arguments:
-//   self - pointer to preallocated and initialized FFT specification structure.
-//   real_data_in - the input signal. For an ARM Neon platform, it must be
-//                  aligned on a 32-byte boundary.
-//
-// Output Arguments:
-//   complex_data_out - the output complex signal with (2^order + 2) 16-bit
-//                      elements. For an ARM Neon platform, it must be different
-//                      from real_data_in, and aligned on a 32-byte boundary.
-//
-// Return Value:
-//   0  - FFT calculation is successful.
-//   -1 - Error with bad arguments (null pointers).
-int WebRtcSpl_RealForwardFFT(struct RealFFT* self,
-                             const int16_t* real_data_in,
-                             int16_t* complex_data_out);
-
-// Compute the inverse FFT for a conjugate-symmetric input sequence of length of
-// 2^order, where 1 < order <= MAX_FFT_ORDER. Transform length is determined by
-// the specification structure, which must be initialized prior to calling the
-// FFT function with WebRtcSpl_CreateRealFFT().
-// For a transform of length M, the input sequence is represented using a packed
-// CCS vector of length M+2, which is explained in the comments for
-// WebRtcSpl_RealForwardFFTC above.
-//
-// Input Arguments:
-//   self - pointer to preallocated and initialized FFT specification structure.
-//   complex_data_in - the input complex signal with (2^order + 2) 16-bit
-//                     elements. For an ARM Neon platform, it must be aligned on
-//                     a 32-byte boundary.
-//
-// Output Arguments:
-//   real_data_out - the output real signal. For an ARM Neon platform, it must
-//                   be different to complex_data_in, and aligned on a 32-byte
-//                   boundary.
-//
-// Return Value:
-//   0 or a positive number - a value that the elements in the |real_data_out|
-//                            should be shifted left with in order to get
-//                            correct physical values.
-//   -1 - Error with bad arguments (null pointers).
-int WebRtcSpl_RealInverseFFT(struct RealFFT* self,
-                             const int16_t* complex_data_in,
-                             int16_t* real_data_out);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif  // WEBRTC_COMMON_AUDIO_SIGNAL_PROCESSING_INCLUDE_REAL_FFT_H_
diff --git a/common_audio/signal_processing/include/signal_processing_library.h b/common_audio/signal_processing/include/signal_processing_library.h
deleted file mode 100644
index f4fe8e8..0000000
--- a/common_audio/signal_processing/include/signal_processing_library.h
+++ /dev/null
@@ -1,1627 +0,0 @@
-/*
- *  Copyright (c) 2012 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.
- */
-
-
-/*
- * This header file includes all of the fix point signal processing library (SPL) function
- * descriptions and declarations.
- * For specific function calls, see bottom of file.
- */
-
-#ifndef WEBRTC_COMMON_AUDIO_SIGNAL_PROCESSING_INCLUDE_SIGNAL_PROCESSING_LIBRARY_H_
-#define WEBRTC_COMMON_AUDIO_SIGNAL_PROCESSING_INCLUDE_SIGNAL_PROCESSING_LIBRARY_H_
-
-#include <string.h>
-#include "webrtc/common_audio/signal_processing/dot_product_with_scale.h"
-#include "webrtc/typedefs.h"
-
-// Macros specific for the fixed point implementation
-#define WEBRTC_SPL_WORD16_MAX       32767
-#define WEBRTC_SPL_WORD16_MIN       -32768
-#define WEBRTC_SPL_WORD32_MAX       (int32_t)0x7fffffff
-#define WEBRTC_SPL_WORD32_MIN       (int32_t)0x80000000
-#define WEBRTC_SPL_MAX_LPC_ORDER    14
-#define WEBRTC_SPL_MIN(A, B)        (A < B ? A : B)  // Get min value
-#define WEBRTC_SPL_MAX(A, B)        (A > B ? A : B)  // Get max value
-// TODO(kma/bjorn): For the next two macros, investigate how to correct the code
-// for inputs of a = WEBRTC_SPL_WORD16_MIN or WEBRTC_SPL_WORD32_MIN.
-#define WEBRTC_SPL_ABS_W16(a) \
-    (((int16_t)a >= 0) ? ((int16_t)a) : -((int16_t)a))
-#define WEBRTC_SPL_ABS_W32(a) \
-    (((int32_t)a >= 0) ? ((int32_t)a) : -((int32_t)a))
-
-#define WEBRTC_SPL_MUL(a, b) \
-    ((int32_t) ((int32_t)(a) * (int32_t)(b)))
-#define WEBRTC_SPL_UMUL(a, b) \
-    ((uint32_t) ((uint32_t)(a) * (uint32_t)(b)))
-#define WEBRTC_SPL_UMUL_32_16(a, b) \
-    ((uint32_t) ((uint32_t)(a) * (uint16_t)(b)))
-#define WEBRTC_SPL_MUL_16_U16(a, b) \
-    ((int32_t)(int16_t)(a) * (uint16_t)(b))
-
-#ifndef WEBRTC_ARCH_ARM_V7
-// For ARMv7 platforms, these are inline functions in spl_inl_armv7.h
-#ifndef MIPS32_LE
-// For MIPS platforms, these are inline functions in spl_inl_mips.h
-#define WEBRTC_SPL_MUL_16_16(a, b) \
-    ((int32_t) (((int16_t)(a)) * ((int16_t)(b))))
-#define WEBRTC_SPL_MUL_16_32_RSFT16(a, b) \
-    (WEBRTC_SPL_MUL_16_16(a, b >> 16) \
-     + ((WEBRTC_SPL_MUL_16_16(a, (b & 0xffff) >> 1) + 0x4000) >> 15))
-#endif
-#endif
-
-#define WEBRTC_SPL_MUL_16_32_RSFT11(a, b)          \
-  (WEBRTC_SPL_MUL_16_16(a, (b) >> 16) * (1 << 5) + \
-    (((WEBRTC_SPL_MUL_16_U16(a, (uint16_t)(b)) >> 1) + 0x0200) >> 10))
-#define WEBRTC_SPL_MUL_16_32_RSFT14(a, b)          \
-  (WEBRTC_SPL_MUL_16_16(a, (b) >> 16) * (1 << 2) + \
-    (((WEBRTC_SPL_MUL_16_U16(a, (uint16_t)(b)) >> 1) + 0x1000) >> 13))
-#define WEBRTC_SPL_MUL_16_32_RSFT15(a, b)            \
-  ((WEBRTC_SPL_MUL_16_16(a, (b) >> 16) * (1 << 1)) + \
-    (((WEBRTC_SPL_MUL_16_U16(a, (uint16_t)(b)) >> 1) + 0x2000) >> 14))
-
-#define WEBRTC_SPL_MUL_16_16_RSFT(a, b, c) \
-    (WEBRTC_SPL_MUL_16_16(a, b) >> (c))
-
-#define WEBRTC_SPL_MUL_16_16_RSFT_WITH_ROUND(a, b, c) \
-    ((WEBRTC_SPL_MUL_16_16(a, b) + ((int32_t) \
-                                  (((int32_t)1) << ((c) - 1)))) >> (c))
-
-// C + the 32 most significant bits of A * B
-#define WEBRTC_SPL_SCALEDIFF32(A, B, C) \
-    (C + (B >> 16) * A + (((uint32_t)(B & 0x0000FFFF) * A) >> 16))
-
-#define WEBRTC_SPL_SAT(a, b, c)         (b > a ? a : b < c ? c : b)
-
-// Shifting with negative numbers allowed
-// Positive means left shift
-#define WEBRTC_SPL_SHIFT_W32(x, c) ((c) >= 0 ? (x) * (1 << (c)) : (x) >> -(c))
-
-// Shifting with negative numbers not allowed
-// We cannot do casting here due to signed/unsigned problem
-#define WEBRTC_SPL_LSHIFT_W32(x, c)     ((x) << (c))
-
-#define WEBRTC_SPL_RSHIFT_U32(x, c)     ((uint32_t)(x) >> (c))
-
-#define WEBRTC_SPL_RAND(a) \
-    ((int16_t)((((int16_t)a * 18816) >> 7) & 0x00007fff))
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#define WEBRTC_SPL_MEMCPY_W16(v1, v2, length) \
-  memcpy(v1, v2, (length) * sizeof(int16_t))
-
-// inline functions:
-#include "webrtc/common_audio/signal_processing/include/spl_inl.h"
-
-// Initialize SPL. Currently it contains only function pointer initialization.
-// If the underlying platform is known to be ARM-Neon (WEBRTC_HAS_NEON defined),
-// the pointers will be assigned to code optimized for Neon; otherwise, generic
-// C code will be assigned.
-// Note that this function MUST be called in any application that uses SPL
-// functions.
-void WebRtcSpl_Init();
-
-int16_t WebRtcSpl_GetScalingSquare(int16_t* in_vector,
-                                   size_t in_vector_length,
-                                   size_t times);
-
-// Copy and set operations. Implementation in copy_set_operations.c.
-// Descriptions at bottom of file.
-void WebRtcSpl_MemSetW16(int16_t* vector,
-                         int16_t set_value,
-                         size_t vector_length);
-void WebRtcSpl_MemSetW32(int32_t* vector,
-                         int32_t set_value,
-                         size_t vector_length);
-void WebRtcSpl_MemCpyReversedOrder(int16_t* out_vector,
-                                   int16_t* in_vector,
-                                   size_t vector_length);
-void WebRtcSpl_CopyFromEndW16(const int16_t* in_vector,
-                              size_t in_vector_length,
-                              size_t samples,
-                              int16_t* out_vector);
-void WebRtcSpl_ZerosArrayW16(int16_t* vector,
-                             size_t vector_length);
-void WebRtcSpl_ZerosArrayW32(int32_t* vector,
-                             size_t vector_length);
-// End: Copy and set operations.
-
-
-// Minimum and maximum operation functions and their pointers.
-// Implementation in min_max_operations.c.
-
-// Returns the largest absolute value in a signed 16-bit vector.
-//
-// Input:
-//      - vector : 16-bit input vector.
-//      - length : Number of samples in vector.
-//
-// Return value  : Maximum absolute value in vector.
-typedef int16_t (*MaxAbsValueW16)(const int16_t* vector, size_t length);
-extern MaxAbsValueW16 WebRtcSpl_MaxAbsValueW16;
-int16_t WebRtcSpl_MaxAbsValueW16C(const int16_t* vector, size_t length);
-#if defined(WEBRTC_HAS_NEON)
-int16_t WebRtcSpl_MaxAbsValueW16Neon(const int16_t* vector, size_t length);
-#endif
-#if defined(MIPS32_LE)
-int16_t WebRtcSpl_MaxAbsValueW16_mips(const int16_t* vector, size_t length);
-#endif
-
-// Returns the largest absolute value in a signed 32-bit vector.
-//
-// Input:
-//      - vector : 32-bit input vector.
-//      - length : Number of samples in vector.
-//
-// Return value  : Maximum absolute value in vector.
-typedef int32_t (*MaxAbsValueW32)(const int32_t* vector, size_t length);
-extern MaxAbsValueW32 WebRtcSpl_MaxAbsValueW32;
-int32_t WebRtcSpl_MaxAbsValueW32C(const int32_t* vector, size_t length);
-#if defined(WEBRTC_HAS_NEON)
-int32_t WebRtcSpl_MaxAbsValueW32Neon(const int32_t* vector, size_t length);
-#endif
-#if defined(MIPS_DSP_R1_LE)
-int32_t WebRtcSpl_MaxAbsValueW32_mips(const int32_t* vector, size_t length);
-#endif
-
-// Returns the maximum value of a 16-bit vector.
-//
-// Input:
-//      - vector : 16-bit input vector.
-//      - length : Number of samples in vector.
-//
-// Return value  : Maximum sample value in |vector|.
-typedef int16_t (*MaxValueW16)(const int16_t* vector, size_t length);
-extern MaxValueW16 WebRtcSpl_MaxValueW16;
-int16_t WebRtcSpl_MaxValueW16C(const int16_t* vector, size_t length);
-#if defined(WEBRTC_HAS_NEON)
-int16_t WebRtcSpl_MaxValueW16Neon(const int16_t* vector, size_t length);
-#endif
-#if defined(MIPS32_LE)
-int16_t WebRtcSpl_MaxValueW16_mips(const int16_t* vector, size_t length);
-#endif
-
-// Returns the maximum value of a 32-bit vector.
-//
-// Input:
-//      - vector : 32-bit input vector.
-//      - length : Number of samples in vector.
-//
-// Return value  : Maximum sample value in |vector|.
-typedef int32_t (*MaxValueW32)(const int32_t* vector, size_t length);
-extern MaxValueW32 WebRtcSpl_MaxValueW32;
-int32_t WebRtcSpl_MaxValueW32C(const int32_t* vector, size_t length);
-#if defined(WEBRTC_HAS_NEON)
-int32_t WebRtcSpl_MaxValueW32Neon(const int32_t* vector, size_t length);
-#endif
-#if defined(MIPS32_LE)
-int32_t WebRtcSpl_MaxValueW32_mips(const int32_t* vector, size_t length);
-#endif
-
-// Returns the minimum value of a 16-bit vector.
-//
-// Input:
-//      - vector : 16-bit input vector.
-//      - length : Number of samples in vector.
-//
-// Return value  : Minimum sample value in |vector|.
-typedef int16_t (*MinValueW16)(const int16_t* vector, size_t length);
-extern MinValueW16 WebRtcSpl_MinValueW16;
-int16_t WebRtcSpl_MinValueW16C(const int16_t* vector, size_t length);
-#if defined(WEBRTC_HAS_NEON)
-int16_t WebRtcSpl_MinValueW16Neon(const int16_t* vector, size_t length);
-#endif
-#if defined(MIPS32_LE)
-int16_t WebRtcSpl_MinValueW16_mips(const int16_t* vector, size_t length);
-#endif
-
-// Returns the minimum value of a 32-bit vector.
-//
-// Input:
-//      - vector : 32-bit input vector.
-//      - length : Number of samples in vector.
-//
-// Return value  : Minimum sample value in |vector|.
-typedef int32_t (*MinValueW32)(const int32_t* vector, size_t length);
-extern MinValueW32 WebRtcSpl_MinValueW32;
-int32_t WebRtcSpl_MinValueW32C(const int32_t* vector, size_t length);
-#if defined(WEBRTC_HAS_NEON)
-int32_t WebRtcSpl_MinValueW32Neon(const int32_t* vector, size_t length);
-#endif
-#if defined(MIPS32_LE)
-int32_t WebRtcSpl_MinValueW32_mips(const int32_t* vector, size_t length);
-#endif
-
-// Returns the vector index to the largest absolute value of a 16-bit vector.
-//
-// Input:
-//      - vector : 16-bit input vector.
-//      - length : Number of samples in vector.
-//
-// Return value  : Index to the maximum absolute value in vector.
-//                 If there are multiple equal maxima, return the index of the
-//                 first. -32768 will always have precedence over 32767 (despite
-//                 -32768 presenting an int16 absolute value of 32767).
-size_t WebRtcSpl_MaxAbsIndexW16(const int16_t* vector, size_t length);
-
-// Returns the vector index to the maximum sample value of a 16-bit vector.
-//
-// Input:
-//      - vector : 16-bit input vector.
-//      - length : Number of samples in vector.
-//
-// Return value  : Index to the maximum value in vector (if multiple
-//                 indexes have the maximum, return the first).
-size_t WebRtcSpl_MaxIndexW16(const int16_t* vector, size_t length);
-
-// Returns the vector index to the maximum sample value of a 32-bit vector.
-//
-// Input:
-//      - vector : 32-bit input vector.
-//      - length : Number of samples in vector.
-//
-// Return value  : Index to the maximum value in vector (if multiple
-//                 indexes have the maximum, return the first).
-size_t WebRtcSpl_MaxIndexW32(const int32_t* vector, size_t length);
-
-// Returns the vector index to the minimum sample value of a 16-bit vector.
-//
-// Input:
-//      - vector : 16-bit input vector.
-//      - length : Number of samples in vector.
-//
-// Return value  : Index to the mimimum value in vector  (if multiple
-//                 indexes have the minimum, return the first).
-size_t WebRtcSpl_MinIndexW16(const int16_t* vector, size_t length);
-
-// Returns the vector index to the minimum sample value of a 32-bit vector.
-//
-// Input:
-//      - vector : 32-bit input vector.
-//      - length : Number of samples in vector.
-//
-// Return value  : Index to the mimimum value in vector  (if multiple
-//                 indexes have the minimum, return the first).
-size_t WebRtcSpl_MinIndexW32(const int32_t* vector, size_t length);
-
-// End: Minimum and maximum operations.
-
-
-// Vector scaling operations. Implementation in vector_scaling_operations.c.
-// Description at bottom of file.
-void WebRtcSpl_VectorBitShiftW16(int16_t* out_vector,
-                                 size_t vector_length,
-                                 const int16_t* in_vector,
-                                 int16_t right_shifts);
-void WebRtcSpl_VectorBitShiftW32(int32_t* out_vector,
-                                 size_t vector_length,
-                                 const int32_t* in_vector,
-                                 int16_t right_shifts);
-void WebRtcSpl_VectorBitShiftW32ToW16(int16_t* out_vector,
-                                      size_t vector_length,
-                                      const int32_t* in_vector,
-                                      int right_shifts);
-void WebRtcSpl_ScaleVector(const int16_t* in_vector,
-                           int16_t* out_vector,
-                           int16_t gain,
-                           size_t vector_length,
-                           int16_t right_shifts);
-void WebRtcSpl_ScaleVectorWithSat(const int16_t* in_vector,
-                                  int16_t* out_vector,
-                                  int16_t gain,
-                                  size_t vector_length,
-                                  int16_t right_shifts);
-void WebRtcSpl_ScaleAndAddVectors(const int16_t* in_vector1,
-                                  int16_t gain1, int right_shifts1,
-                                  const int16_t* in_vector2,
-                                  int16_t gain2, int right_shifts2,
-                                  int16_t* out_vector,
-                                  size_t vector_length);
-
-// The functions (with related pointer) perform the vector operation:
-//   out_vector[k] = ((scale1 * in_vector1[k]) + (scale2 * in_vector2[k])
-//        + round_value) >> right_shifts,
-//   where  round_value = (1 << right_shifts) >> 1.
-//
-// Input:
-//      - in_vector1       : Input vector 1
-//      - in_vector1_scale : Gain to be used for vector 1
-//      - in_vector2       : Input vector 2
-//      - in_vector2_scale : Gain to be used for vector 2
-//      - right_shifts     : Number of right bit shifts to be applied
-//      - length           : Number of elements in the input vectors
-//
-// Output:
-//      - out_vector       : Output vector
-// Return value            : 0 if OK, -1 if (in_vector1 == null
-//                           || in_vector2 == null || out_vector == null
-//                           || length <= 0 || right_shift < 0).
-typedef int (*ScaleAndAddVectorsWithRound)(const int16_t* in_vector1,
-                                           int16_t in_vector1_scale,
-                                           const int16_t* in_vector2,
-                                           int16_t in_vector2_scale,
-                                           int right_shifts,
-                                           int16_t* out_vector,
-                                           size_t length);
-extern ScaleAndAddVectorsWithRound WebRtcSpl_ScaleAndAddVectorsWithRound;
-int WebRtcSpl_ScaleAndAddVectorsWithRoundC(const int16_t* in_vector1,
-                                           int16_t in_vector1_scale,
-                                           const int16_t* in_vector2,
-                                           int16_t in_vector2_scale,
-                                           int right_shifts,
-                                           int16_t* out_vector,
-                                           size_t length);
-#if defined(MIPS_DSP_R1_LE)
-int WebRtcSpl_ScaleAndAddVectorsWithRound_mips(const int16_t* in_vector1,
-                                               int16_t in_vector1_scale,
-                                               const int16_t* in_vector2,
-                                               int16_t in_vector2_scale,
-                                               int right_shifts,
-                                               int16_t* out_vector,
-                                               size_t length);
-#endif
-// End: Vector scaling operations.
-
-// iLBC specific functions. Implementations in ilbc_specific_functions.c.
-// Description at bottom of file.
-void WebRtcSpl_ReverseOrderMultArrayElements(int16_t* out_vector,
-                                             const int16_t* in_vector,
-                                             const int16_t* window,
-                                             size_t vector_length,
-                                             int16_t right_shifts);
-void WebRtcSpl_ElementwiseVectorMult(int16_t* out_vector,
-                                     const int16_t* in_vector,
-                                     const int16_t* window,
-                                     size_t vector_length,
-                                     int16_t right_shifts);
-void WebRtcSpl_AddVectorsAndShift(int16_t* out_vector,
-                                  const int16_t* in_vector1,
-                                  const int16_t* in_vector2,
-                                  size_t vector_length,
-                                  int16_t right_shifts);
-void WebRtcSpl_AddAffineVectorToVector(int16_t* out_vector,
-                                       int16_t* in_vector,
-                                       int16_t gain,
-                                       int32_t add_constant,
-                                       int16_t right_shifts,
-                                       size_t vector_length);
-void WebRtcSpl_AffineTransformVector(int16_t* out_vector,
-                                     int16_t* in_vector,
-                                     int16_t gain,
-                                     int32_t add_constant,
-                                     int16_t right_shifts,
-                                     size_t vector_length);
-// End: iLBC specific functions.
-
-// Signal processing operations.
-
-// A 32-bit fix-point implementation of auto-correlation computation
-//
-// Input:
-//      - in_vector        : Vector to calculate autocorrelation upon
-//      - in_vector_length : Length (in samples) of |vector|
-//      - order            : The order up to which the autocorrelation should be
-//                           calculated
-//
-// Output:
-//      - result           : auto-correlation values (values should be seen
-//                           relative to each other since the absolute values
-//                           might have been down shifted to avoid overflow)
-//
-//      - scale            : The number of left shifts required to obtain the
-//                           auto-correlation in Q0
-//
-// Return value            : Number of samples in |result|, i.e. (order+1)
-size_t WebRtcSpl_AutoCorrelation(const int16_t* in_vector,
-                                 size_t in_vector_length,
-                                 size_t order,
-                                 int32_t* result,
-                                 int* scale);
-
-// A 32-bit fix-point implementation of the Levinson-Durbin algorithm that
-// does NOT use the 64 bit class
-//
-// Input:
-//      - auto_corr : Vector with autocorrelation values of length >= |order|+1
-//      - order     : The LPC filter order (support up to order 20)
-//
-// Output:
-//      - lpc_coef  : lpc_coef[0..order] LPC coefficients in Q12
-//      - refl_coef : refl_coef[0...order-1]| Reflection coefficients in Q15
-//
-// Return value     : 1 for stable 0 for unstable
-int16_t WebRtcSpl_LevinsonDurbin(const int32_t* auto_corr,
-                                 int16_t* lpc_coef,
-                                 int16_t* refl_coef,
-                                 size_t order);
-
-// Converts reflection coefficients |refl_coef| to LPC coefficients |lpc_coef|.
-// This version is a 16 bit operation.
-//
-// NOTE: The 16 bit refl_coef -> lpc_coef conversion might result in a
-// "slightly unstable" filter (i.e., a pole just outside the unit circle) in
-// "rare" cases even if the reflection coefficients are stable.
-//
-// Input:
-//      - refl_coef : Reflection coefficients in Q15 that should be converted
-//                    to LPC coefficients
-//      - use_order : Number of coefficients in |refl_coef|
-//
-// Output:
-//      - lpc_coef  : LPC coefficients in Q12
-void WebRtcSpl_ReflCoefToLpc(const int16_t* refl_coef,
-                             int use_order,
-                             int16_t* lpc_coef);
-
-// Converts LPC coefficients |lpc_coef| to reflection coefficients |refl_coef|.
-// This version is a 16 bit operation.
-// The conversion is implemented by the step-down algorithm.
-//
-// Input:
-//      - lpc_coef  : LPC coefficients in Q12, that should be converted to
-//                    reflection coefficients
-//      - use_order : Number of coefficients in |lpc_coef|
-//
-// Output:
-//      - refl_coef : Reflection coefficients in Q15.
-void WebRtcSpl_LpcToReflCoef(int16_t* lpc_coef,
-                             int use_order,
-                             int16_t* refl_coef);
-
-// Calculates reflection coefficients (16 bit) from auto-correlation values
-//
-// Input:
-//      - auto_corr : Auto-correlation values
-//      - use_order : Number of coefficients wanted be calculated
-//
-// Output:
-//      - refl_coef : Reflection coefficients in Q15.
-void WebRtcSpl_AutoCorrToReflCoef(const int32_t* auto_corr,
-                                  int use_order,
-                                  int16_t* refl_coef);
-
-// The functions (with related pointer) calculate the cross-correlation between
-// two sequences |seq1| and |seq2|.
-// |seq1| is fixed and |seq2| slides as the pointer is increased with the
-// amount |step_seq2|. Note the arguments should obey the relationship:
-// |dim_seq| - 1 + |step_seq2| * (|dim_cross_correlation| - 1) <
-//      buffer size of |seq2|
-//
-// Input:
-//      - seq1           : First sequence (fixed throughout the correlation)
-//      - seq2           : Second sequence (slides |step_vector2| for each
-//                            new correlation)
-//      - dim_seq        : Number of samples to use in the cross-correlation
-//      - dim_cross_correlation : Number of cross-correlations to calculate (the
-//                            start position for |vector2| is updated for each
-//                            new one)
-//      - right_shifts   : Number of right bit shifts to use. This will
-//                            become the output Q-domain.
-//      - step_seq2      : How many (positive or negative) steps the
-//                            |vector2| pointer should be updated for each new
-//                            cross-correlation value.
-//
-// Output:
-//      - cross_correlation : The cross-correlation in Q(-right_shifts)
-typedef void (*CrossCorrelation)(int32_t* cross_correlation,
-                                 const int16_t* seq1,
-                                 const int16_t* seq2,
-                                 size_t dim_seq,
-                                 size_t dim_cross_correlation,
-                                 int right_shifts,
-                                 int step_seq2);
-extern CrossCorrelation WebRtcSpl_CrossCorrelation;
-void WebRtcSpl_CrossCorrelationC(int32_t* cross_correlation,
-                                 const int16_t* seq1,
-                                 const int16_t* seq2,
-                                 size_t dim_seq,
-                                 size_t dim_cross_correlation,
-                                 int right_shifts,
-                                 int step_seq2);
-#if defined(WEBRTC_HAS_NEON)
-void WebRtcSpl_CrossCorrelationNeon(int32_t* cross_correlation,
-                                    const int16_t* seq1,
-                                    const int16_t* seq2,
-                                    size_t dim_seq,
-                                    size_t dim_cross_correlation,
-                                    int right_shifts,
-                                    int step_seq2);
-#endif
-#if defined(MIPS32_LE)
-void WebRtcSpl_CrossCorrelation_mips(int32_t* cross_correlation,
-                                     const int16_t* seq1,
-                                     const int16_t* seq2,
-                                     size_t dim_seq,
-                                     size_t dim_cross_correlation,
-                                     int right_shifts,
-                                     int step_seq2);
-#endif
-
-// Creates (the first half of) a Hanning window. Size must be at least 1 and
-// at most 512.
-//
-// Input:
-//      - size      : Length of the requested Hanning window (1 to 512)
-//
-// Output:
-//      - window    : Hanning vector in Q14.
-void WebRtcSpl_GetHanningWindow(int16_t* window, size_t size);
-
-// Calculates y[k] = sqrt(1 - x[k]^2) for each element of the input vector
-// |in_vector|. Input and output values are in Q15.
-//
-// Inputs:
-//      - in_vector     : Values to calculate sqrt(1 - x^2) of
-//      - vector_length : Length of vector |in_vector|
-//
-// Output:
-//      - out_vector    : Output values in Q15
-void WebRtcSpl_SqrtOfOneMinusXSquared(int16_t* in_vector,
-                                      size_t vector_length,
-                                      int16_t* out_vector);
-// End: Signal processing operations.
-
-// Randomization functions. Implementations collected in
-// randomization_functions.c and descriptions at bottom of this file.
-int16_t WebRtcSpl_RandU(uint32_t* seed);
-int16_t WebRtcSpl_RandN(uint32_t* seed);
-int16_t WebRtcSpl_RandUArray(int16_t* vector,
-                             int16_t vector_length,
-                             uint32_t* seed);
-// End: Randomization functions.
-
-// Math functions
-int32_t WebRtcSpl_Sqrt(int32_t value);
-int32_t WebRtcSpl_SqrtFloor(int32_t value);
-
-// Divisions. Implementations collected in division_operations.c and
-// descriptions at bottom of this file.
-uint32_t WebRtcSpl_DivU32U16(uint32_t num, uint16_t den);
-int32_t WebRtcSpl_DivW32W16(int32_t num, int16_t den);
-int16_t WebRtcSpl_DivW32W16ResW16(int32_t num, int16_t den);
-int32_t WebRtcSpl_DivResultInQ31(int32_t num, int32_t den);
-int32_t WebRtcSpl_DivW32HiLow(int32_t num, int16_t den_hi, int16_t den_low);
-// End: Divisions.
-
-int32_t WebRtcSpl_Energy(int16_t* vector,
-                         size_t vector_length,
-                         int* scale_factor);
-
-// Filter operations.
-size_t WebRtcSpl_FilterAR(const int16_t* ar_coef,
-                          size_t ar_coef_length,
-                          const int16_t* in_vector,
-                          size_t in_vector_length,
-                          int16_t* filter_state,
-                          size_t filter_state_length,
-                          int16_t* filter_state_low,
-                          size_t filter_state_low_length,
-                          int16_t* out_vector,
-                          int16_t* out_vector_low,
-                          size_t out_vector_low_length);
-
-// WebRtcSpl_FilterMAFastQ12(...)
-//
-// Performs a MA filtering on a vector in Q12
-//
-// Input:
-//      - in_vector         : Input samples (state in positions
-//                            in_vector[-order] .. in_vector[-1])
-//      - ma_coef           : Filter coefficients (in Q12)
-//      - ma_coef_length    : Number of B coefficients (order+1)
-//      - vector_length     : Number of samples to be filtered
-//
-// Output:
-//      - out_vector        : Filtered samples
-//
-void WebRtcSpl_FilterMAFastQ12(const int16_t* in_vector,
-                               int16_t* out_vector,
-                               const int16_t* ma_coef,
-                               size_t ma_coef_length,
-                               size_t vector_length);
-
-// Performs a AR filtering on a vector in Q12
-// Input:
-//      - data_in            : Input samples
-//      - data_out           : State information in positions
-//                               data_out[-order] .. data_out[-1]
-//      - coefficients       : Filter coefficients (in Q12)
-//      - coefficients_length: Number of coefficients (order+1)
-//      - data_length        : Number of samples to be filtered
-// Output:
-//      - data_out           : Filtered samples
-void WebRtcSpl_FilterARFastQ12(const int16_t* data_in,
-                               int16_t* data_out,
-                               const int16_t* __restrict coefficients,
-                               size_t coefficients_length,
-                               size_t data_length);
-
-// The functions (with related pointer) perform a MA down sampling filter
-// on a vector.
-// Input:
-//      - data_in            : Input samples (state in positions
-//                               data_in[-order] .. data_in[-1])
-//      - data_in_length     : Number of samples in |data_in| to be filtered.
-//                               This must be at least
-//                               |delay| + |factor|*(|out_vector_length|-1) + 1)
-//      - data_out_length    : Number of down sampled samples desired
-//      - coefficients       : Filter coefficients (in Q12)
-//      - coefficients_length: Number of coefficients (order+1)
-//      - factor             : Decimation factor
-//      - delay              : Delay of filter (compensated for in out_vector)
-// Output:
-//      - data_out           : Filtered samples
-// Return value              : 0 if OK, -1 if |in_vector| is too short
-typedef int (*DownsampleFast)(const int16_t* data_in,
-                              size_t data_in_length,
-                              int16_t* data_out,
-                              size_t data_out_length,
-                              const int16_t* __restrict coefficients,
-                              size_t coefficients_length,
-                              int factor,
-                              size_t delay);
-extern DownsampleFast WebRtcSpl_DownsampleFast;
-int WebRtcSpl_DownsampleFastC(const int16_t* data_in,
-                              size_t data_in_length,
-                              int16_t* data_out,
-                              size_t data_out_length,
-                              const int16_t* __restrict coefficients,
-                              size_t coefficients_length,
-                              int factor,
-                              size_t delay);
-#if defined(WEBRTC_HAS_NEON)
-int WebRtcSpl_DownsampleFastNeon(const int16_t* data_in,
-                                 size_t data_in_length,
-                                 int16_t* data_out,
-                                 size_t data_out_length,
-                                 const int16_t* __restrict coefficients,
-                                 size_t coefficients_length,
-                                 int factor,
-                                 size_t delay);
-#endif
-#if defined(MIPS32_LE)
-int WebRtcSpl_DownsampleFast_mips(const int16_t* data_in,
-                                  size_t data_in_length,
-                                  int16_t* data_out,
-                                  size_t data_out_length,
-                                  const int16_t* __restrict coefficients,
-                                  size_t coefficients_length,
-                                  int factor,
-                                  size_t delay);
-#endif
-
-// End: Filter operations.
-
-// FFT operations
-
-int WebRtcSpl_ComplexFFT(int16_t vector[], int stages, int mode);
-int WebRtcSpl_ComplexIFFT(int16_t vector[], int stages, int mode);
-
-// Treat a 16-bit complex data buffer |complex_data| as an array of 32-bit
-// values, and swap elements whose indexes are bit-reverses of each other.
-//
-// Input:
-//      - complex_data  : Complex data buffer containing 2^|stages| real
-//                        elements interleaved with 2^|stages| imaginary
-//                        elements: [Re Im Re Im Re Im....]
-//      - stages        : Number of FFT stages. Must be at least 3 and at most
-//                        10, since the table WebRtcSpl_kSinTable1024[] is 1024
-//                        elements long.
-//
-// Output:
-//      - complex_data  : The complex data buffer.
-
-void WebRtcSpl_ComplexBitReverse(int16_t* __restrict complex_data, int stages);
-
-// End: FFT operations
-
-/************************************************************
- *
- * RESAMPLING FUNCTIONS AND THEIR STRUCTS ARE DEFINED BELOW
- *
- ************************************************************/
-
-/*******************************************************************
- * resample.c
- *
- * Includes the following resampling combinations
- * 22 kHz -> 16 kHz
- * 16 kHz -> 22 kHz
- * 22 kHz ->  8 kHz
- *  8 kHz -> 22 kHz
- *
- ******************************************************************/
-
-// state structure for 22 -> 16 resampler
-typedef struct {
-  int32_t S_22_44[8];
-  int32_t S_44_32[8];
-  int32_t S_32_16[8];
-} WebRtcSpl_State22khzTo16khz;
-
-void WebRtcSpl_Resample22khzTo16khz(const int16_t* in,
-                                    int16_t* out,
-                                    WebRtcSpl_State22khzTo16khz* state,
-                                    int32_t* tmpmem);
-
-void WebRtcSpl_ResetResample22khzTo16khz(WebRtcSpl_State22khzTo16khz* state);
-
-// state structure for 16 -> 22 resampler
-typedef struct {
-  int32_t S_16_32[8];
-  int32_t S_32_22[8];
-} WebRtcSpl_State16khzTo22khz;
-
-void WebRtcSpl_Resample16khzTo22khz(const int16_t* in,
-                                    int16_t* out,
-                                    WebRtcSpl_State16khzTo22khz* state,
-                                    int32_t* tmpmem);
-
-void WebRtcSpl_ResetResample16khzTo22khz(WebRtcSpl_State16khzTo22khz* state);
-
-// state structure for 22 -> 8 resampler
-typedef struct {
-  int32_t S_22_22[16];
-  int32_t S_22_16[8];
-  int32_t S_16_8[8];
-} WebRtcSpl_State22khzTo8khz;
-
-void WebRtcSpl_Resample22khzTo8khz(const int16_t* in, int16_t* out,
-                                   WebRtcSpl_State22khzTo8khz* state,
-                                   int32_t* tmpmem);
-
-void WebRtcSpl_ResetResample22khzTo8khz(WebRtcSpl_State22khzTo8khz* state);
-
-// state structure for 8 -> 22 resampler
-typedef struct {
-  int32_t S_8_16[8];
-  int32_t S_16_11[8];
-  int32_t S_11_22[8];
-} WebRtcSpl_State8khzTo22khz;
-
-void WebRtcSpl_Resample8khzTo22khz(const int16_t* in, int16_t* out,
-                                   WebRtcSpl_State8khzTo22khz* state,
-                                   int32_t* tmpmem);
-
-void WebRtcSpl_ResetResample8khzTo22khz(WebRtcSpl_State8khzTo22khz* state);
-
-/*******************************************************************
- * resample_fractional.c
- * Functions for internal use in the other resample functions
- *
- * Includes the following resampling combinations
- * 48 kHz -> 32 kHz
- * 32 kHz -> 24 kHz
- * 44 kHz -> 32 kHz
- *
- ******************************************************************/
-
-void WebRtcSpl_Resample48khzTo32khz(const int32_t* In, int32_t* Out, size_t K);
-
-void WebRtcSpl_Resample32khzTo24khz(const int32_t* In, int32_t* Out, size_t K);
-
-void WebRtcSpl_Resample44khzTo32khz(const int32_t* In, int32_t* Out, size_t K);
-
-/*******************************************************************
- * resample_48khz.c
- *
- * Includes the following resampling combinations
- * 48 kHz -> 16 kHz
- * 16 kHz -> 48 kHz
- * 48 kHz ->  8 kHz
- *  8 kHz -> 48 kHz
- *
- ******************************************************************/
-
-typedef struct {
-  int32_t S_48_48[16];
-  int32_t S_48_32[8];
-  int32_t S_32_16[8];
-} WebRtcSpl_State48khzTo16khz;
-
-void WebRtcSpl_Resample48khzTo16khz(const int16_t* in, int16_t* out,
-                                    WebRtcSpl_State48khzTo16khz* state,
-                                    int32_t* tmpmem);
-
-void WebRtcSpl_ResetResample48khzTo16khz(WebRtcSpl_State48khzTo16khz* state);
-
-typedef struct {
-  int32_t S_16_32[8];
-  int32_t S_32_24[8];
-  int32_t S_24_48[8];
-} WebRtcSpl_State16khzTo48khz;
-
-void WebRtcSpl_Resample16khzTo48khz(const int16_t* in, int16_t* out,
-                                    WebRtcSpl_State16khzTo48khz* state,
-                                    int32_t* tmpmem);
-
-void WebRtcSpl_ResetResample16khzTo48khz(WebRtcSpl_State16khzTo48khz* state);
-
-typedef struct {
-  int32_t S_48_24[8];
-  int32_t S_24_24[16];
-  int32_t S_24_16[8];
-  int32_t S_16_8[8];
-} WebRtcSpl_State48khzTo8khz;
-
-void WebRtcSpl_Resample48khzTo8khz(const int16_t* in, int16_t* out,
-                                   WebRtcSpl_State48khzTo8khz* state,
-                                   int32_t* tmpmem);
-
-void WebRtcSpl_ResetResample48khzTo8khz(WebRtcSpl_State48khzTo8khz* state);
-
-typedef struct {
-  int32_t S_8_16[8];
-  int32_t S_16_12[8];
-  int32_t S_12_24[8];
-  int32_t S_24_48[8];
-} WebRtcSpl_State8khzTo48khz;
-
-void WebRtcSpl_Resample8khzTo48khz(const int16_t* in, int16_t* out,
-                                   WebRtcSpl_State8khzTo48khz* state,
-                                   int32_t* tmpmem);
-
-void WebRtcSpl_ResetResample8khzTo48khz(WebRtcSpl_State8khzTo48khz* state);
-
-/*******************************************************************
- * resample_by_2.c
- *
- * Includes down and up sampling by a factor of two.
- *
- ******************************************************************/
-
-void WebRtcSpl_DownsampleBy2(const int16_t* in, size_t len,
-                             int16_t* out, int32_t* filtState);
-
-void WebRtcSpl_UpsampleBy2(const int16_t* in, size_t len,
-                           int16_t* out, int32_t* filtState);
-
-/************************************************************
- * END OF RESAMPLING FUNCTIONS
- ************************************************************/
-void WebRtcSpl_AnalysisQMF(const int16_t* in_data,
-                           size_t in_data_length,
-                           int16_t* low_band,
-                           int16_t* high_band,
-                           int32_t* filter_state1,
-                           int32_t* filter_state2);
-void WebRtcSpl_SynthesisQMF(const int16_t* low_band,
-                            const int16_t* high_band,
-                            size_t band_length,
-                            int16_t* out_data,
-                            int32_t* filter_state1,
-                            int32_t* filter_state2);
-
-#ifdef __cplusplus
-}
-#endif  // __cplusplus
-#endif  // WEBRTC_COMMON_AUDIO_SIGNAL_PROCESSING_INCLUDE_SIGNAL_PROCESSING_LIBRARY_H_
-
-//
-// WebRtcSpl_AddSatW16(...)
-// WebRtcSpl_AddSatW32(...)
-//
-// Returns the result of a saturated 16-bit, respectively 32-bit, addition of
-// the numbers specified by the |var1| and |var2| parameters.
-//
-// Input:
-//      - var1      : Input variable 1
-//      - var2      : Input variable 2
-//
-// Return value     : Added and saturated value
-//
-
-//
-// WebRtcSpl_SubSatW16(...)
-// WebRtcSpl_SubSatW32(...)
-//
-// Returns the result of a saturated 16-bit, respectively 32-bit, subtraction
-// of the numbers specified by the |var1| and |var2| parameters.
-//
-// Input:
-//      - var1      : Input variable 1
-//      - var2      : Input variable 2
-//
-// Returned value   : Subtracted and saturated value
-//
-
-//
-// WebRtcSpl_GetSizeInBits(...)
-//
-// Returns the # of bits that are needed at the most to represent the number
-// specified by the |value| parameter.
-//
-// Input:
-//      - value     : Input value
-//
-// Return value     : Number of bits needed to represent |value|
-//
-
-//
-// WebRtcSpl_NormW32(...)
-//
-// Norm returns the # of left shifts required to 32-bit normalize the 32-bit
-// signed number specified by the |value| parameter.
-//
-// Input:
-//      - value     : Input value
-//
-// Return value     : Number of bit shifts needed to 32-bit normalize |value|
-//
-
-//
-// WebRtcSpl_NormW16(...)
-//
-// Norm returns the # of left shifts required to 16-bit normalize the 16-bit
-// signed number specified by the |value| parameter.
-//
-// Input:
-//      - value     : Input value
-//
-// Return value     : Number of bit shifts needed to 32-bit normalize |value|
-//
-
-//
-// WebRtcSpl_NormU32(...)
-//
-// Norm returns the # of left shifts required to 32-bit normalize the unsigned
-// 32-bit number specified by the |value| parameter.
-//
-// Input:
-//      - value     : Input value
-//
-// Return value     : Number of bit shifts needed to 32-bit normalize |value|
-//
-
-//
-// WebRtcSpl_GetScalingSquare(...)
-//
-// Returns the # of bits required to scale the samples specified in the
-// |in_vector| parameter so that, if the squares of the samples are added the
-// # of times specified by the |times| parameter, the 32-bit addition will not
-// overflow (result in int32_t).
-//
-// Input:
-//      - in_vector         : Input vector to check scaling on
-//      - in_vector_length  : Samples in |in_vector|
-//      - times             : Number of additions to be performed
-//
-// Return value             : Number of right bit shifts needed to avoid
-//                            overflow in the addition calculation
-//
-
-//
-// WebRtcSpl_MemSetW16(...)
-//
-// Sets all the values in the int16_t vector |vector| of length
-// |vector_length| to the specified value |set_value|
-//
-// Input:
-//      - vector        : Pointer to the int16_t vector
-//      - set_value     : Value specified
-//      - vector_length : Length of vector
-//
-
-//
-// WebRtcSpl_MemSetW32(...)
-//
-// Sets all the values in the int32_t vector |vector| of length
-// |vector_length| to the specified value |set_value|
-//
-// Input:
-//      - vector        : Pointer to the int16_t vector
-//      - set_value     : Value specified
-//      - vector_length : Length of vector
-//
-
-//
-// WebRtcSpl_MemCpyReversedOrder(...)
-//
-// Copies all the values from the source int16_t vector |in_vector| to a
-// destination int16_t vector |out_vector|. It is done in reversed order,
-// meaning that the first sample of |in_vector| is copied to the last sample of
-// the |out_vector|. The procedure continues until the last sample of
-// |in_vector| has been copied to the first sample of |out_vector|. This
-// creates a reversed vector. Used in e.g. prediction in iLBC.
-//
-// Input:
-//      - in_vector     : Pointer to the first sample in a int16_t vector
-//                        of length |length|
-//      - vector_length : Number of elements to copy
-//
-// Output:
-//      - out_vector    : Pointer to the last sample in a int16_t vector
-//                        of length |length|
-//
-
-//
-// WebRtcSpl_CopyFromEndW16(...)
-//
-// Copies the rightmost |samples| of |in_vector| (of length |in_vector_length|)
-// to the vector |out_vector|.
-//
-// Input:
-//      - in_vector         : Input vector
-//      - in_vector_length  : Number of samples in |in_vector|
-//      - samples           : Number of samples to extract (from right side)
-//                            from |in_vector|
-//
-// Output:
-//      - out_vector        : Vector with the requested samples
-//
-
-//
-// WebRtcSpl_ZerosArrayW16(...)
-// WebRtcSpl_ZerosArrayW32(...)
-//
-// Inserts the value "zero" in all positions of a w16 and a w32 vector
-// respectively.
-//
-// Input:
-//      - vector_length : Number of samples in vector
-//
-// Output:
-//      - vector        : Vector containing all zeros
-//
-
-//
-// WebRtcSpl_VectorBitShiftW16(...)
-// WebRtcSpl_VectorBitShiftW32(...)
-//
-// Bit shifts all the values in a vector up or downwards. Different calls for
-// int16_t and int32_t vectors respectively.
-//
-// Input:
-//      - vector_length : Length of vector
-//      - in_vector     : Pointer to the vector that should be bit shifted
-//      - right_shifts  : Number of right bit shifts (negative value gives left
-//                        shifts)
-//
-// Output:
-//      - out_vector    : Pointer to the result vector (can be the same as
-//                        |in_vector|)
-//
-
-//
-// WebRtcSpl_VectorBitShiftW32ToW16(...)
-//
-// Bit shifts all the values in a int32_t vector up or downwards and
-// stores the result as an int16_t vector. The function will saturate the
-// signal if needed, before storing in the output vector.
-//
-// Input:
-//      - vector_length : Length of vector
-//      - in_vector     : Pointer to the vector that should be bit shifted
-//      - right_shifts  : Number of right bit shifts (negative value gives left
-//                        shifts)
-//
-// Output:
-//      - out_vector    : Pointer to the result vector (can be the same as
-//                        |in_vector|)
-//
-
-//
-// WebRtcSpl_ScaleVector(...)
-//
-// Performs the vector operation:
-//  out_vector[k] = (gain*in_vector[k])>>right_shifts
-//
-// Input:
-//      - in_vector     : Input vector
-//      - gain          : Scaling gain
-//      - vector_length : Elements in the |in_vector|
-//      - right_shifts  : Number of right bit shifts applied
-//
-// Output:
-//      - out_vector    : Output vector (can be the same as |in_vector|)
-//
-
-//
-// WebRtcSpl_ScaleVectorWithSat(...)
-//
-// Performs the vector operation:
-//  out_vector[k] = SATURATE( (gain*in_vector[k])>>right_shifts )
-//
-// Input:
-//      - in_vector     : Input vector
-//      - gain          : Scaling gain
-//      - vector_length : Elements in the |in_vector|
-//      - right_shifts  : Number of right bit shifts applied
-//
-// Output:
-//      - out_vector    : Output vector (can be the same as |in_vector|)
-//
-
-//
-// WebRtcSpl_ScaleAndAddVectors(...)
-//
-// Performs the vector operation:
-//  out_vector[k] = (gain1*in_vector1[k])>>right_shifts1
-//                  + (gain2*in_vector2[k])>>right_shifts2
-//
-// Input:
-//      - in_vector1    : Input vector 1
-//      - gain1         : Gain to be used for vector 1
-//      - right_shifts1 : Right bit shift to be used for vector 1
-//      - in_vector2    : Input vector 2
-//      - gain2         : Gain to be used for vector 2
-//      - right_shifts2 : Right bit shift to be used for vector 2
-//      - vector_length : Elements in the input vectors
-//
-// Output:
-//      - out_vector    : Output vector
-//
-
-//
-// WebRtcSpl_ReverseOrderMultArrayElements(...)
-//
-// Performs the vector operation:
-//  out_vector[n] = (in_vector[n]*window[-n])>>right_shifts
-//
-// Input:
-//      - in_vector     : Input vector
-//      - window        : Window vector (should be reversed). The pointer
-//                        should be set to the last value in the vector
-//      - right_shifts  : Number of right bit shift to be applied after the
-//                        multiplication
-//      - vector_length : Number of elements in |in_vector|
-//
-// Output:
-//      - out_vector    : Output vector (can be same as |in_vector|)
-//
-
-//
-// WebRtcSpl_ElementwiseVectorMult(...)
-//
-// Performs the vector operation:
-//  out_vector[n] = (in_vector[n]*window[n])>>right_shifts
-//
-// Input:
-//      - in_vector     : Input vector
-//      - window        : Window vector.
-//      - right_shifts  : Number of right bit shift to be applied after the
-//                        multiplication
-//      - vector_length : Number of elements in |in_vector|
-//
-// Output:
-//      - out_vector    : Output vector (can be same as |in_vector|)
-//
-
-//
-// WebRtcSpl_AddVectorsAndShift(...)
-//
-// Performs the vector operation:
-//  out_vector[k] = (in_vector1[k] + in_vector2[k])>>right_shifts
-//
-// Input:
-//      - in_vector1    : Input vector 1
-//      - in_vector2    : Input vector 2
-//      - right_shifts  : Number of right bit shift to be applied after the
-//                        multiplication
-//      - vector_length : Number of elements in |in_vector1| and |in_vector2|
-//
-// Output:
-//      - out_vector    : Output vector (can be same as |in_vector1|)
-//
-
-//
-// WebRtcSpl_AddAffineVectorToVector(...)
-//
-// Adds an affine transformed vector to another vector |out_vector|, i.e,
-// performs
-//  out_vector[k] += (in_vector[k]*gain+add_constant)>>right_shifts
-//
-// Input:
-//      - in_vector     : Input vector
-//      - gain          : Gain value, used to multiply the in vector with
-//      - add_constant  : Constant value to add (usually 1<<(right_shifts-1),
-//                        but others can be used as well
-//      - right_shifts  : Number of right bit shifts (0-16)
-//      - vector_length : Number of samples in |in_vector| and |out_vector|
-//
-// Output:
-//      - out_vector    : Vector with the output
-//
-
-//
-// WebRtcSpl_AffineTransformVector(...)
-//
-// Affine transforms a vector, i.e, performs
-//  out_vector[k] = (in_vector[k]*gain+add_constant)>>right_shifts
-//
-// Input:
-//      - in_vector     : Input vector
-//      - gain          : Gain value, used to multiply the in vector with
-//      - add_constant  : Constant value to add (usually 1<<(right_shifts-1),
-//                        but others can be used as well
-//      - right_shifts  : Number of right bit shifts (0-16)
-//      - vector_length : Number of samples in |in_vector| and |out_vector|
-//
-// Output:
-//      - out_vector    : Vector with the output
-//
-
-//
-// WebRtcSpl_IncreaseSeed(...)
-//
-// Increases the seed (and returns the new value)
-//
-// Input:
-//      - seed      : Seed for random calculation
-//
-// Output:
-//      - seed      : Updated seed value
-//
-// Return value     : The new seed value
-//
-
-//
-// WebRtcSpl_RandU(...)
-//
-// Produces a uniformly distributed value in the int16_t range
-//
-// Input:
-//      - seed      : Seed for random calculation
-//
-// Output:
-//      - seed      : Updated seed value
-//
-// Return value     : Uniformly distributed value in the range
-//                    [Word16_MIN...Word16_MAX]
-//
-
-//
-// WebRtcSpl_RandN(...)
-//
-// Produces a normal distributed value in the int16_t range
-//
-// Input:
-//      - seed      : Seed for random calculation
-//
-// Output:
-//      - seed      : Updated seed value
-//
-// Return value     : N(0,1) value in the Q13 domain
-//
-
-//
-// WebRtcSpl_RandUArray(...)
-//
-// Produces a uniformly distributed vector with elements in the int16_t
-// range
-//
-// Input:
-//      - vector_length : Samples wanted in the vector
-//      - seed          : Seed for random calculation
-//
-// Output:
-//      - vector        : Vector with the uniform values
-//      - seed          : Updated seed value
-//
-// Return value         : Number of samples in vector, i.e., |vector_length|
-//
-
-//
-// WebRtcSpl_Sqrt(...)
-//
-// Returns the square root of the input value |value|. The precision of this
-// function is integer precision, i.e., sqrt(8) gives 2 as answer.
-// If |value| is a negative number then 0 is returned.
-//
-// Algorithm:
-//
-// A sixth order Taylor Series expansion is used here to compute the square
-// root of a number y^0.5 = (1+x)^0.5
-// where
-// x = y-1
-//   = 1+(x/2)-0.5*((x/2)^2+0.5*((x/2)^3-0.625*((x/2)^4+0.875*((x/2)^5)
-// 0.5 <= x < 1
-//
-// Input:
-//      - value     : Value to calculate sqrt of
-//
-// Return value     : Result of the sqrt calculation
-//
-
-//
-// WebRtcSpl_SqrtFloor(...)
-//
-// Returns the square root of the input value |value|. The precision of this
-// function is rounding down integer precision, i.e., sqrt(8) gives 2 as answer.
-// If |value| is a negative number then 0 is returned.
-//
-// Algorithm:
-//
-// An iterative 4 cylce/bit routine
-//
-// Input:
-//      - value     : Value to calculate sqrt of
-//
-// Return value     : Result of the sqrt calculation
-//
-
-//
-// WebRtcSpl_DivU32U16(...)
-//
-// Divides a uint32_t |num| by a uint16_t |den|.
-//
-// If |den|==0, (uint32_t)0xFFFFFFFF is returned.
-//
-// Input:
-//      - num       : Numerator
-//      - den       : Denominator
-//
-// Return value     : Result of the division (as a uint32_t), i.e., the
-//                    integer part of num/den.
-//
-
-//
-// WebRtcSpl_DivW32W16(...)
-//
-// Divides a int32_t |num| by a int16_t |den|.
-//
-// If |den|==0, (int32_t)0x7FFFFFFF is returned.
-//
-// Input:
-//      - num       : Numerator
-//      - den       : Denominator
-//
-// Return value     : Result of the division (as a int32_t), i.e., the
-//                    integer part of num/den.
-//
-
-//
-// WebRtcSpl_DivW32W16ResW16(...)
-//
-// Divides a int32_t |num| by a int16_t |den|, assuming that the
-// result is less than 32768, otherwise an unpredictable result will occur.
-//
-// If |den|==0, (int16_t)0x7FFF is returned.
-//
-// Input:
-//      - num       : Numerator
-//      - den       : Denominator
-//
-// Return value     : Result of the division (as a int16_t), i.e., the
-//                    integer part of num/den.
-//
-
-//
-// WebRtcSpl_DivResultInQ31(...)
-//
-// Divides a int32_t |num| by a int16_t |den|, assuming that the
-// absolute value of the denominator is larger than the numerator, otherwise
-// an unpredictable result will occur.
-//
-// Input:
-//      - num       : Numerator
-//      - den       : Denominator
-//
-// Return value     : Result of the division in Q31.
-//
-
-//
-// WebRtcSpl_DivW32HiLow(...)
-//
-// Divides a int32_t |num| by a denominator in hi, low format. The
-// absolute value of the denominator has to be larger (or equal to) the
-// numerator.
-//
-// Input:
-//      - num       : Numerator
-//      - den_hi    : High part of denominator
-//      - den_low   : Low part of denominator
-//
-// Return value     : Divided value in Q31
-//
-
-//
-// WebRtcSpl_Energy(...)
-//
-// Calculates the energy of a vector
-//
-// Input:
-//      - vector        : Vector which the energy should be calculated on
-//      - vector_length : Number of samples in vector
-//
-// Output:
-//      - scale_factor  : Number of left bit shifts needed to get the physical
-//                        energy value, i.e, to get the Q0 value
-//
-// Return value         : Energy value in Q(-|scale_factor|)
-//
-
-//
-// WebRtcSpl_FilterAR(...)
-//
-// Performs a 32-bit AR filtering on a vector in Q12
-//
-// Input:
-//  - ar_coef                   : AR-coefficient vector (values in Q12),
-//                                ar_coef[0] must be 4096.
-//  - ar_coef_length            : Number of coefficients in |ar_coef|.
-//  - in_vector                 : Vector to be filtered.
-//  - in_vector_length          : Number of samples in |in_vector|.
-//  - filter_state              : Current state (higher part) of the filter.
-//  - filter_state_length       : Length (in samples) of |filter_state|.
-//  - filter_state_low          : Current state (lower part) of the filter.
-//  - filter_state_low_length   : Length (in samples) of |filter_state_low|.
-//  - out_vector_low_length     : Maximum length (in samples) of
-//                                |out_vector_low|.
-//
-// Output:
-//  - filter_state              : Updated state (upper part) vector.
-//  - filter_state_low          : Updated state (lower part) vector.
-//  - out_vector                : Vector containing the upper part of the
-//                                filtered values.
-//  - out_vector_low            : Vector containing the lower part of the
-//                                filtered values.
-//
-// Return value                 : Number of samples in the |out_vector|.
-//
-
-//
-// WebRtcSpl_ComplexIFFT(...)
-//
-// Complex Inverse FFT
-//
-// Computes an inverse complex 2^|stages|-point FFT on the input vector, which
-// is in bit-reversed order. The original content of the vector is destroyed in
-// the process, since the input is overwritten by the output, normal-ordered,
-// FFT vector. With X as the input complex vector, y as the output complex
-// vector and with M = 2^|stages|, the following is computed:
-//
-//        M-1
-// y(k) = sum[X(i)*[cos(2*pi*i*k/M) + j*sin(2*pi*i*k/M)]]
-//        i=0
-//
-// The implementations are optimized for speed, not for code size. It uses the
-// decimation-in-time algorithm with radix-2 butterfly technique.
-//
-// Input:
-//      - vector    : In pointer to complex vector containing 2^|stages|
-//                    real elements interleaved with 2^|stages| imaginary
-//                    elements.
-//                    [ReImReImReIm....]
-//                    The elements are in Q(-scale) domain, see more on Return
-//                    Value below.
-//
-//      - stages    : Number of FFT stages. Must be at least 3 and at most 10,
-//                    since the table WebRtcSpl_kSinTable1024[] is 1024
-//                    elements long.
-//
-//      - mode      : This parameter gives the user to choose how the FFT
-//                    should work.
-//                    mode==0: Low-complexity and Low-accuracy mode
-//                    mode==1: High-complexity and High-accuracy mode
-//
-// Output:
-//      - vector    : Out pointer to the FFT vector (the same as input).
-//
-// Return Value     : The scale value that tells the number of left bit shifts
-//                    that the elements in the |vector| should be shifted with
-//                    in order to get Q0 values, i.e. the physically correct
-//                    values. The scale parameter is always 0 or positive,
-//                    except if N>1024 (|stages|>10), which returns a scale
-//                    value of -1, indicating error.
-//
-
-//
-// WebRtcSpl_ComplexFFT(...)
-//
-// Complex FFT
-//
-// Computes a complex 2^|stages|-point FFT on the input vector, which is in
-// bit-reversed order. The original content of the vector is destroyed in
-// the process, since the input is overwritten by the output, normal-ordered,
-// FFT vector. With x as the input complex vector, Y as the output complex
-// vector and with M = 2^|stages|, the following is computed:
-//
-//              M-1
-// Y(k) = 1/M * sum[x(i)*[cos(2*pi*i*k/M) + j*sin(2*pi*i*k/M)]]
-//              i=0
-//
-// The implementations are optimized for speed, not for code size. It uses the
-// decimation-in-time algorithm with radix-2 butterfly technique.
-//
-// This routine prevents overflow by scaling by 2 before each FFT stage. This is
-// a fixed scaling, for proper normalization - there will be log2(n) passes, so
-// this results in an overall factor of 1/n, distributed to maximize arithmetic
-// accuracy.
-//
-// Input:
-//      - vector    : In pointer to complex vector containing 2^|stages| real
-//                    elements interleaved with 2^|stages| imaginary elements.
-//                    [ReImReImReIm....]
-//                    The output is in the Q0 domain.
-//
-//      - stages    : Number of FFT stages. Must be at least 3 and at most 10,
-//                    since the table WebRtcSpl_kSinTable1024[] is 1024
-//                    elements long.
-//
-//      - mode      : This parameter gives the user to choose how the FFT
-//                    should work.
-//                    mode==0: Low-complexity and Low-accuracy mode
-//                    mode==1: High-complexity and High-accuracy mode
-//
-// Output:
-//      - vector    : The output FFT vector is in the Q0 domain.
-//
-// Return value     : The scale parameter is always 0, except if N>1024,
-//                    which returns a scale value of -1, indicating error.
-//
-
-//
-// WebRtcSpl_AnalysisQMF(...)
-//
-// Splits a 0-2*F Hz signal into two sub bands: 0-F Hz and F-2*F Hz. The
-// current version has F = 8000, therefore, a super-wideband audio signal is
-// split to lower-band 0-8 kHz and upper-band 8-16 kHz.
-//
-// Input:
-//      - in_data       : Wide band speech signal, 320 samples (10 ms)
-//
-// Input & Output:
-//      - filter_state1 : Filter state for first All-pass filter
-//      - filter_state2 : Filter state for second All-pass filter
-//
-// Output:
-//      - low_band      : Lower-band signal 0-8 kHz band, 160 samples (10 ms)
-//      - high_band     : Upper-band signal 8-16 kHz band (flipped in frequency
-//                        domain), 160 samples (10 ms)
-//
-
-//
-// WebRtcSpl_SynthesisQMF(...)
-//
-// Combines the two sub bands (0-F and F-2*F Hz) into a signal of 0-2*F
-// Hz, (current version has F = 8000 Hz). So the filter combines lower-band
-// (0-8 kHz) and upper-band (8-16 kHz) channels to obtain super-wideband 0-16
-// kHz audio.
-//
-// Input:
-//      - low_band      : The signal with the 0-8 kHz band, 160 samples (10 ms)
-//      - high_band     : The signal with the 8-16 kHz band, 160 samples (10 ms)
-//
-// Input & Output:
-//      - filter_state1 : Filter state for first All-pass filter
-//      - filter_state2 : Filter state for second All-pass filter
-//
-// Output:
-//      - out_data      : Super-wideband speech signal, 0-16 kHz
-//
-
-// int16_t WebRtcSpl_SatW32ToW16(...)
-//
-// This function saturates a 32-bit word into a 16-bit word.
-//
-// Input:
-//      - value32   : The value of a 32-bit word.
-//
-// Output:
-//      - out16     : the saturated 16-bit word.
-//
-
-// int32_t WebRtc_MulAccumW16(...)
-//
-// This function multiply a 16-bit word by a 16-bit word, and accumulate this
-// value to a 32-bit integer.
-//
-// Input:
-//      - a    : The value of the first 16-bit word.
-//      - b    : The value of the second 16-bit word.
-//      - c    : The value of an 32-bit integer.
-//
-// Return Value: The value of a * b + c.
-//
diff --git a/common_audio/signal_processing/include/spl_inl.h b/common_audio/signal_processing/include/spl_inl.h
deleted file mode 100644
index c5aec27..0000000
--- a/common_audio/signal_processing/include/spl_inl.h
+++ /dev/null
@@ -1,154 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-
-// This header file includes the inline functions in
-// the fix point signal processing library.
-
-#ifndef WEBRTC_COMMON_AUDIO_SIGNAL_PROCESSING_INCLUDE_SPL_INL_H_
-#define WEBRTC_COMMON_AUDIO_SIGNAL_PROCESSING_INCLUDE_SPL_INL_H_
-
-#include "webrtc/rtc_base/compile_assert_c.h"
-
-extern const int8_t kWebRtcSpl_CountLeadingZeros32_Table[64];
-
-// Don't call this directly except in tests!
-static __inline int WebRtcSpl_CountLeadingZeros32_NotBuiltin(uint32_t n) {
-  // Normalize n by rounding up to the nearest number that is a sequence of 0
-  // bits followed by a sequence of 1 bits. This number has the same number of
-  // leading zeros as the original n. There are exactly 33 such values.
-  n |= n >> 1;
-  n |= n >> 2;
-  n |= n >> 4;
-  n |= n >> 8;
-  n |= n >> 16;
-
-  // Multiply the modified n with a constant selected (by exhaustive search)
-  // such that each of the 33 possible values of n give a product whose 6 most
-  // significant bits are unique. Then look up the answer in the table.
-  return kWebRtcSpl_CountLeadingZeros32_Table[(n * 0x8c0b2891) >> 26];
-}
-
-// Don't call this directly except in tests!
-static __inline int WebRtcSpl_CountLeadingZeros64_NotBuiltin(uint64_t n) {
-  const int leading_zeros = n >> 32 == 0 ? 32 : 0;
-  return leading_zeros + WebRtcSpl_CountLeadingZeros32_NotBuiltin(
-                             (uint32_t)(n >> (32 - leading_zeros)));
-}
-
-// Returns the number of leading zero bits in the argument.
-static __inline int WebRtcSpl_CountLeadingZeros32(uint32_t n) {
-#ifdef __GNUC__
-  RTC_COMPILE_ASSERT(sizeof(unsigned int) == sizeof(uint32_t));
-  return n == 0 ? 32 : __builtin_clz(n);
-#else
-  return WebRtcSpl_CountLeadingZeros32_NotBuiltin(n);
-#endif
-}
-
-// Returns the number of leading zero bits in the argument.
-static __inline int WebRtcSpl_CountLeadingZeros64(uint64_t n) {
-#ifdef __GNUC__
-  RTC_COMPILE_ASSERT(sizeof(unsigned long long) == sizeof(uint64_t));  // NOLINT
-  return n == 0 ? 64 : __builtin_clzll(n);
-#else
-  return WebRtcSpl_CountLeadingZeros64_NotBuiltin(n);
-#endif
-}
-
-#ifdef WEBRTC_ARCH_ARM_V7
-#include "webrtc/common_audio/signal_processing/include/spl_inl_armv7.h"
-#else
-
-#if defined(MIPS32_LE)
-#include "webrtc/common_audio/signal_processing/include/spl_inl_mips.h"
-#endif
-
-#if !defined(MIPS_DSP_R1_LE)
-static __inline int16_t WebRtcSpl_SatW32ToW16(int32_t value32) {
-  int16_t out16 = (int16_t) value32;
-
-  if (value32 > 32767)
-    out16 = 32767;
-  else if (value32 < -32768)
-    out16 = -32768;
-
-  return out16;
-}
-
-static __inline int32_t WebRtcSpl_AddSatW32(int32_t a, int32_t b) {
-  // Do the addition in unsigned numbers, since signed overflow is undefined
-  // behavior.
-  const int32_t sum = (int32_t)((uint32_t)a + (uint32_t)b);
-
-  // a + b can't overflow if a and b have different signs. If they have the
-  // same sign, a + b also has the same sign iff it didn't overflow.
-  if ((a < 0) == (b < 0) && (a < 0) != (sum < 0)) {
-    // The direction of the overflow is obvious from the sign of a + b.
-    return sum < 0 ? INT32_MAX : INT32_MIN;
-  }
-  return sum;
-}
-
-static __inline int32_t WebRtcSpl_SubSatW32(int32_t a, int32_t b) {
-  // Do the subtraction in unsigned numbers, since signed overflow is undefined
-  // behavior.
-  const int32_t diff = (int32_t)((uint32_t)a - (uint32_t)b);
-
-  // a - b can't overflow if a and b have the same sign. If they have different
-  // signs, a - b has the same sign as a iff it didn't overflow.
-  if ((a < 0) != (b < 0) && (a < 0) != (diff < 0)) {
-    // The direction of the overflow is obvious from the sign of a - b.
-    return diff < 0 ? INT32_MAX : INT32_MIN;
-  }
-  return diff;
-}
-
-static __inline int16_t WebRtcSpl_AddSatW16(int16_t a, int16_t b) {
-  return WebRtcSpl_SatW32ToW16((int32_t) a + (int32_t) b);
-}
-
-static __inline int16_t WebRtcSpl_SubSatW16(int16_t var1, int16_t var2) {
-  return WebRtcSpl_SatW32ToW16((int32_t) var1 - (int32_t) var2);
-}
-#endif  // #if !defined(MIPS_DSP_R1_LE)
-
-#if !defined(MIPS32_LE)
-static __inline int16_t WebRtcSpl_GetSizeInBits(uint32_t n) {
-  return 32 - WebRtcSpl_CountLeadingZeros32(n);
-}
-
-// Return the number of steps a can be left-shifted without overflow,
-// or 0 if a == 0.
-static __inline int16_t WebRtcSpl_NormW32(int32_t a) {
-  return a == 0 ? 0 : WebRtcSpl_CountLeadingZeros32(a < 0 ? ~a : a) - 1;
-}
-
-// Return the number of steps a can be left-shifted without overflow,
-// or 0 if a == 0.
-static __inline int16_t WebRtcSpl_NormU32(uint32_t a) {
-  return a == 0 ? 0 : WebRtcSpl_CountLeadingZeros32(a);
-}
-
-// Return the number of steps a can be left-shifted without overflow,
-// or 0 if a == 0.
-static __inline int16_t WebRtcSpl_NormW16(int16_t a) {
-  const int32_t a32 = a;
-  return a == 0 ? 0 : WebRtcSpl_CountLeadingZeros32(a < 0 ? ~a32 : a32) - 17;
-}
-
-static __inline int32_t WebRtc_MulAccumW16(int16_t a, int16_t b, int32_t c) {
-  return (a * b + c);
-}
-#endif  // #if !defined(MIPS32_LE)
-
-#endif  // WEBRTC_ARCH_ARM_V7
-
-#endif  // WEBRTC_COMMON_AUDIO_SIGNAL_PROCESSING_INCLUDE_SPL_INL_H_
diff --git a/common_audio/signal_processing/include/spl_inl_armv7.h b/common_audio/signal_processing/include/spl_inl_armv7.h
deleted file mode 100644
index 634be48..0000000
--- a/common_audio/signal_processing/include/spl_inl_armv7.h
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- *  Copyright (c) 2012 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.
- */
-
-
-/* This header file includes the inline functions for ARM processors in
- * the fix point signal processing library.
- */
-
-#ifndef WEBRTC_COMMON_AUDIO_SIGNAL_PROCESSING_INCLUDE_SPL_INL_ARMV7_H_
-#define WEBRTC_COMMON_AUDIO_SIGNAL_PROCESSING_INCLUDE_SPL_INL_ARMV7_H_
-
-/* TODO(kma): Replace some assembly code with GCC intrinsics
- * (e.g. __builtin_clz).
- */
-
-/* This function produces result that is not bit exact with that by the generic
- * C version in some cases, although the former is at least as accurate as the
- * later.
- */
-static __inline int32_t WEBRTC_SPL_MUL_16_32_RSFT16(int16_t a, int32_t b) {
-  int32_t tmp = 0;
-  __asm __volatile ("smulwb %0, %1, %2":"=r"(tmp):"r"(b), "r"(a));
-  return tmp;
-}
-
-static __inline int32_t WEBRTC_SPL_MUL_16_16(int16_t a, int16_t b) {
-  int32_t tmp = 0;
-  __asm __volatile ("smulbb %0, %1, %2":"=r"(tmp):"r"(a), "r"(b));
-  return tmp;
-}
-
-// TODO(kma): add unit test.
-static __inline int32_t WebRtc_MulAccumW16(int16_t a, int16_t b, int32_t c) {
-  int32_t tmp = 0;
-  __asm __volatile ("smlabb %0, %1, %2, %3":"=r"(tmp):"r"(a), "r"(b), "r"(c));
-  return tmp;
-}
-
-static __inline int16_t WebRtcSpl_AddSatW16(int16_t a, int16_t b) {
-  int32_t s_sum = 0;
-
-  __asm __volatile ("qadd16 %0, %1, %2":"=r"(s_sum):"r"(a), "r"(b));
-
-  return (int16_t) s_sum;
-}
-
-static __inline int32_t WebRtcSpl_AddSatW32(int32_t l_var1, int32_t l_var2) {
-  int32_t l_sum = 0;
-
-  __asm __volatile ("qadd %0, %1, %2":"=r"(l_sum):"r"(l_var1), "r"(l_var2));
-
-  return l_sum;
-}
-
-static __inline int32_t WebRtcSpl_SubSatW32(int32_t l_var1, int32_t l_var2) {
-  int32_t l_sub = 0;
-
-  __asm __volatile ("qsub %0, %1, %2":"=r"(l_sub):"r"(l_var1), "r"(l_var2));
-
-  return l_sub;
-}
-
-static __inline int16_t WebRtcSpl_SubSatW16(int16_t var1, int16_t var2) {
-  int32_t s_sub = 0;
-
-  __asm __volatile ("qsub16 %0, %1, %2":"=r"(s_sub):"r"(var1), "r"(var2));
-
-  return (int16_t)s_sub;
-}
-
-static __inline int16_t WebRtcSpl_GetSizeInBits(uint32_t n) {
-  int32_t tmp = 0;
-
-  __asm __volatile ("clz %0, %1":"=r"(tmp):"r"(n));
-
-  return (int16_t)(32 - tmp);
-}
-
-static __inline int16_t WebRtcSpl_NormW32(int32_t a) {
-  int32_t tmp = 0;
-
-  if (a == 0) {
-    return 0;
-  } else if (a < 0) {
-    a ^= 0xFFFFFFFF;
-  }
-
-  __asm __volatile ("clz %0, %1":"=r"(tmp):"r"(a));
-
-  return (int16_t)(tmp - 1);
-}
-
-static __inline int16_t WebRtcSpl_NormU32(uint32_t a) {
-  int tmp = 0;
-
-  if (a == 0) return 0;
-
-  __asm __volatile ("clz %0, %1":"=r"(tmp):"r"(a));
-
-  return (int16_t)tmp;
-}
-
-static __inline int16_t WebRtcSpl_NormW16(int16_t a) {
-  int32_t tmp = 0;
-  int32_t a_32 = a;
-
-  if (a_32 == 0) {
-    return 0;
-  } else if (a_32 < 0) {
-    a_32 ^= 0xFFFFFFFF;
-  }
-
-  __asm __volatile ("clz %0, %1":"=r"(tmp):"r"(a_32));
-
-  return (int16_t)(tmp - 17);
-}
-
-// TODO(kma): add unit test.
-static __inline int16_t WebRtcSpl_SatW32ToW16(int32_t value32) {
-  int32_t out = 0;
-
-  __asm __volatile ("ssat %0, #16, %1" : "=r"(out) : "r"(value32));
-
-  return (int16_t)out;
-}
-
-#endif  // WEBRTC_COMMON_AUDIO_SIGNAL_PROCESSING_INCLUDE_SPL_INL_ARMV7_H_
diff --git a/common_audio/signal_processing/include/spl_inl_mips.h b/common_audio/signal_processing/include/spl_inl_mips.h
deleted file mode 100644
index 90fa07a..0000000
--- a/common_audio/signal_processing/include/spl_inl_mips.h
+++ /dev/null
@@ -1,213 +0,0 @@
-/*
- *  Copyright (c) 2013 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.
- */
-
-
-// This header file includes the inline functions in
-// the fix point signal processing library.
-
-#ifndef WEBRTC_COMMON_AUDIO_SIGNAL_PROCESSING_INCLUDE_SPL_INL_MIPS_H_
-#define WEBRTC_COMMON_AUDIO_SIGNAL_PROCESSING_INCLUDE_SPL_INL_MIPS_H_
-
-static __inline int32_t WEBRTC_SPL_MUL_16_16(int32_t a,
-                                             int32_t b) {
-  int32_t value32 = 0;
-  int32_t a1 = 0, b1 = 0;
-
-  __asm __volatile(
-#if defined(MIPS32_R2_LE)
-    "seh    %[a1],          %[a]                \n\t"
-    "seh    %[b1],          %[b]                \n\t"
-#else
-    "sll    %[a1],          %[a],         16    \n\t"
-    "sll    %[b1],          %[b],         16    \n\t"
-    "sra    %[a1],          %[a1],        16    \n\t"
-    "sra    %[b1],          %[b1],        16    \n\t"
-#endif
-    "mul    %[value32],     %[a1],  %[b1]       \n\t"
-    : [value32] "=r" (value32), [a1] "=&r" (a1), [b1] "=&r" (b1)
-    : [a] "r" (a), [b] "r" (b)
-    : "hi", "lo");
-  return value32;
-}
-
-static __inline int32_t WEBRTC_SPL_MUL_16_32_RSFT16(int16_t a,
-                                                    int32_t b) {
-  int32_t value32 = 0, b1 = 0, b2 = 0;
-  int32_t a1 = 0;
-
-  __asm __volatile(
-#if defined(MIPS32_R2_LE)
-    "seh    %[a1],          %[a]                        \n\t"
-#else
-    "sll    %[a1],          %[a],           16          \n\t"
-    "sra    %[a1],          %[a1],          16          \n\t"
-#endif
-    "andi   %[b2],          %[b],           0xFFFF      \n\t"
-    "sra    %[b1],          %[b],           16          \n\t"
-    "sra    %[b2],          %[b2],          1           \n\t"
-    "mul    %[value32],     %[a1],          %[b1]       \n\t"
-    "mul    %[b2],          %[a1],          %[b2]       \n\t"
-    "addiu  %[b2],          %[b2],          0x4000      \n\t"
-    "sra    %[b2],          %[b2],          15          \n\t"
-    "addu   %[value32],     %[value32],     %[b2]       \n\t"
-    : [value32] "=&r" (value32), [b1] "=&r" (b1), [b2] "=&r" (b2),
-      [a1] "=&r" (a1)
-    : [a] "r" (a), [b] "r" (b)
-    : "hi", "lo");
-  return value32;
-}
-
-#if defined(MIPS_DSP_R1_LE)
-static __inline int16_t WebRtcSpl_SatW32ToW16(int32_t value32) {
-  __asm __volatile(
-    "shll_s.w   %[value32], %[value32], 16      \n\t"
-    "sra        %[value32], %[value32], 16      \n\t"
-    : [value32] "+r" (value32)
-    :);
-  int16_t out16 = (int16_t)value32;
-  return out16;
-}
-
-static __inline int16_t WebRtcSpl_AddSatW16(int16_t a, int16_t b) {
-  int32_t value32 = 0;
-
-  __asm __volatile(
-    "addq_s.ph      %[value32],     %[a],   %[b]    \n\t"
-    : [value32] "=r" (value32)
-    : [a] "r" (a), [b] "r" (b) );
-  return (int16_t)value32;
-}
-
-static __inline int32_t WebRtcSpl_AddSatW32(int32_t l_var1, int32_t l_var2) {
-  int32_t l_sum;
-
-  __asm __volatile(
-    "addq_s.w   %[l_sum],       %[l_var1],      %[l_var2]    \n\t"
-    : [l_sum] "=r" (l_sum)
-    : [l_var1] "r" (l_var1), [l_var2] "r" (l_var2) );
-
-  return l_sum;
-}
-
-static __inline int16_t WebRtcSpl_SubSatW16(int16_t var1, int16_t var2) {
-  int32_t value32;
-
-  __asm __volatile(
-    "subq_s.ph  %[value32], %[var1],    %[var2]     \n\t"
-    : [value32] "=r" (value32)
-    : [var1] "r" (var1), [var2] "r" (var2) );
-
-  return (int16_t)value32;
-}
-
-static __inline int32_t WebRtcSpl_SubSatW32(int32_t l_var1, int32_t l_var2) {
-  int32_t l_diff;
-
-  __asm __volatile(
-    "subq_s.w   %[l_diff],      %[l_var1],      %[l_var2]    \n\t"
-    : [l_diff] "=r" (l_diff)
-    : [l_var1] "r" (l_var1), [l_var2] "r" (l_var2) );
-
-  return l_diff;
-}
-#endif
-
-static __inline int16_t WebRtcSpl_GetSizeInBits(uint32_t n) {
-  int bits = 0;
-  int i32 = 32;
-
-  __asm __volatile(
-    "clz    %[bits],    %[n]                    \n\t"
-    "subu   %[bits],    %[i32],     %[bits]     \n\t"
-    : [bits] "=&r" (bits)
-    : [n] "r" (n), [i32] "r" (i32) );
-
-  return (int16_t)bits;
-}
-
-static __inline int16_t WebRtcSpl_NormW32(int32_t a) {
-  int zeros = 0;
-
-  __asm __volatile(
-    ".set       push                                \n\t"
-    ".set       noreorder                           \n\t"
-    "bnez       %[a],       1f                      \n\t"
-    " sra       %[zeros],   %[a],       31          \n\t"
-    "b          2f                                  \n\t"
-    " move      %[zeros],   $zero                   \n\t"
-   "1:                                              \n\t"
-    "xor        %[zeros],   %[a],       %[zeros]    \n\t"
-    "clz        %[zeros],   %[zeros]                \n\t"
-    "addiu      %[zeros],   %[zeros],   -1          \n\t"
-   "2:                                              \n\t"
-    ".set       pop                                 \n\t"
-    : [zeros]"=&r"(zeros)
-    : [a] "r" (a) );
-
-  return (int16_t)zeros;
-}
-
-static __inline int16_t WebRtcSpl_NormU32(uint32_t a) {
-  int zeros = 0;
-
-  __asm __volatile(
-    "clz    %[zeros],   %[a]    \n\t"
-    : [zeros] "=r" (zeros)
-    : [a] "r" (a) );
-
-  return (int16_t)(zeros & 0x1f);
-}
-
-static __inline int16_t WebRtcSpl_NormW16(int16_t a) {
-  int zeros = 0;
-  int a0 = a << 16;
-
-  __asm __volatile(
-    ".set       push                                \n\t"
-    ".set       noreorder                           \n\t"
-    "bnez       %[a0],      1f                      \n\t"
-    " sra       %[zeros],   %[a0],      31          \n\t"
-    "b          2f                                  \n\t"
-    " move      %[zeros],   $zero                   \n\t"
-   "1:                                              \n\t"
-    "xor        %[zeros],   %[a0],      %[zeros]    \n\t"
-    "clz        %[zeros],   %[zeros]                \n\t"
-    "addiu      %[zeros],   %[zeros],   -1          \n\t"
-   "2:                                              \n\t"
-    ".set       pop                                 \n\t"
-    : [zeros]"=&r"(zeros)
-    : [a0] "r" (a0) );
-
-  return (int16_t)zeros;
-}
-
-static __inline int32_t WebRtc_MulAccumW16(int16_t a,
-                                           int16_t b,
-                                           int32_t c) {
-  int32_t res = 0, c1 = 0;
-  __asm __volatile(
-#if defined(MIPS32_R2_LE)
-    "seh    %[a],       %[a]            \n\t"
-    "seh    %[b],       %[b]            \n\t"
-#else
-    "sll    %[a],       %[a],   16      \n\t"
-    "sll    %[b],       %[b],   16      \n\t"
-    "sra    %[a],       %[a],   16      \n\t"
-    "sra    %[b],       %[b],   16      \n\t"
-#endif
-    "mul    %[res],     %[a],   %[b]    \n\t"
-    "addu   %[c1],      %[c],   %[res]  \n\t"
-    : [c1] "=r" (c1), [res] "=&r" (res)
-    : [a] "r" (a), [b] "r" (b), [c] "r" (c)
-    : "hi", "lo");
-  return (c1);
-}
-
-#endif  // WEBRTC_COMMON_AUDIO_SIGNAL_PROCESSING_INCLUDE_SPL_INL_MIPS_H_
diff --git a/common_audio/signal_processing/levinson_durbin.c b/common_audio/signal_processing/levinson_durbin.c
deleted file mode 100644
index 3e16b23..0000000
--- a/common_audio/signal_processing/levinson_durbin.c
+++ /dev/null
@@ -1,249 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-
-/*
- * This file contains the function WebRtcSpl_LevinsonDurbin().
- * The description header can be found in signal_processing_library.h
- *
- */
-
-#include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
-#include "webrtc/rtc_base/sanitizer.h"
-
-#define SPL_LEVINSON_MAXORDER 20
-
-int16_t RTC_NO_SANITIZE("signed-integer-overflow")  // bugs.webrtc.org/5486
-WebRtcSpl_LevinsonDurbin(const int32_t* R, int16_t* A, int16_t* K,
-                         size_t order)
-{
-    size_t i, j;
-    // Auto-correlation coefficients in high precision
-    int16_t R_hi[SPL_LEVINSON_MAXORDER + 1], R_low[SPL_LEVINSON_MAXORDER + 1];
-    // LPC coefficients in high precision
-    int16_t A_hi[SPL_LEVINSON_MAXORDER + 1], A_low[SPL_LEVINSON_MAXORDER + 1];
-    // LPC coefficients for next iteration
-    int16_t A_upd_hi[SPL_LEVINSON_MAXORDER + 1], A_upd_low[SPL_LEVINSON_MAXORDER + 1];
-    // Reflection coefficient in high precision
-    int16_t K_hi, K_low;
-    // Prediction gain Alpha in high precision and with scale factor
-    int16_t Alpha_hi, Alpha_low, Alpha_exp;
-    int16_t tmp_hi, tmp_low;
-    int32_t temp1W32, temp2W32, temp3W32;
-    int16_t norm;
-
-    // Normalize the autocorrelation R[0]...R[order+1]
-
-    norm = WebRtcSpl_NormW32(R[0]);
-
-    for (i = 0; i <= order; ++i)
-    {
-        temp1W32 = R[i] * (1 << norm);
-        // UBSan: 12 * 268435456 cannot be represented in type 'int'
-
-        // Put R in hi and low format
-        R_hi[i] = (int16_t)(temp1W32 >> 16);
-        R_low[i] = (int16_t)((temp1W32 - ((int32_t)R_hi[i] * 65536)) >> 1);
-    }
-
-    // K = A[1] = -R[1] / R[0]
-
-    temp2W32 = R[1] * (1 << norm); // R[1] in Q31
-    temp3W32 = WEBRTC_SPL_ABS_W32(temp2W32); // abs R[1]
-    temp1W32 = WebRtcSpl_DivW32HiLow(temp3W32, R_hi[0], R_low[0]); // abs(R[1])/R[0] in Q31
-    // Put back the sign on R[1]
-    if (temp2W32 > 0)
-    {
-        temp1W32 = -temp1W32;
-    }
-
-    // Put K in hi and low format
-    K_hi = (int16_t)(temp1W32 >> 16);
-    K_low = (int16_t)((temp1W32 - ((int32_t)K_hi * 65536)) >> 1);
-
-    // Store first reflection coefficient
-    K[0] = K_hi;
-
-    temp1W32 >>= 4;  // A[1] in Q27.
-
-    // Put A[1] in hi and low format
-    A_hi[1] = (int16_t)(temp1W32 >> 16);
-    A_low[1] = (int16_t)((temp1W32 - ((int32_t)A_hi[1] * 65536)) >> 1);
-
-    // Alpha = R[0] * (1-K^2)
-
-    temp1W32 = ((K_hi * K_low >> 14) + K_hi * K_hi) * 2;  // = k^2 in Q31
-
-    temp1W32 = WEBRTC_SPL_ABS_W32(temp1W32); // Guard against <0
-    temp1W32 = (int32_t)0x7fffffffL - temp1W32; // temp1W32 = (1 - K[0]*K[0]) in Q31
-
-    // Store temp1W32 = 1 - K[0]*K[0] on hi and low format
-    tmp_hi = (int16_t)(temp1W32 >> 16);
-    tmp_low = (int16_t)((temp1W32 - ((int32_t)tmp_hi << 16)) >> 1);
-
-    // Calculate Alpha in Q31
-    temp1W32 = (R_hi[0] * tmp_hi + (R_hi[0] * tmp_low >> 15) +
-        (R_low[0] * tmp_hi >> 15)) << 1;
-
-    // Normalize Alpha and put it in hi and low format
-
-    Alpha_exp = WebRtcSpl_NormW32(temp1W32);
-    temp1W32 = WEBRTC_SPL_LSHIFT_W32(temp1W32, Alpha_exp);
-    Alpha_hi = (int16_t)(temp1W32 >> 16);
-    Alpha_low = (int16_t)((temp1W32 - ((int32_t)Alpha_hi << 16)) >> 1);
-
-    // Perform the iterative calculations in the Levinson-Durbin algorithm
-
-    for (i = 2; i <= order; i++)
-    {
-        /*                    ----
-         temp1W32 =  R[i] + > R[j]*A[i-j]
-         /
-         ----
-         j=1..i-1
-         */
-
-        temp1W32 = 0;
-
-        for (j = 1; j < i; j++)
-        {
-          // temp1W32 is in Q31
-          temp1W32 += (R_hi[j] * A_hi[i - j] * 2) +
-              (((R_hi[j] * A_low[i - j] >> 15) +
-              (R_low[j] * A_hi[i - j] >> 15)) * 2);
-        }
-
-        temp1W32 = temp1W32 * 16;
-        temp1W32 += ((int32_t)R_hi[i] * 65536)
-                + WEBRTC_SPL_LSHIFT_W32((int32_t)R_low[i], 1);
-
-        // K = -temp1W32 / Alpha
-        temp2W32 = WEBRTC_SPL_ABS_W32(temp1W32); // abs(temp1W32)
-        temp3W32 = WebRtcSpl_DivW32HiLow(temp2W32, Alpha_hi, Alpha_low); // abs(temp1W32)/Alpha
-
-        // Put the sign of temp1W32 back again
-        if (temp1W32 > 0)
-        {
-            temp3W32 = -temp3W32;
-        }
-
-        // Use the Alpha shifts from earlier to de-normalize
-        norm = WebRtcSpl_NormW32(temp3W32);
-        if ((Alpha_exp <= norm) || (temp3W32 == 0))
-        {
-            temp3W32 = temp3W32 * (1 << Alpha_exp);
-        } else
-        {
-            if (temp3W32 > 0)
-            {
-                temp3W32 = (int32_t)0x7fffffffL;
-            } else
-            {
-                temp3W32 = (int32_t)0x80000000L;
-            }
-        }
-
-        // Put K on hi and low format
-        K_hi = (int16_t)(temp3W32 >> 16);
-        K_low = (int16_t)((temp3W32 - ((int32_t)K_hi * 65536)) >> 1);
-
-        // Store Reflection coefficient in Q15
-        K[i - 1] = K_hi;
-
-        // Test for unstable filter.
-        // If unstable return 0 and let the user decide what to do in that case
-
-        if ((int32_t)WEBRTC_SPL_ABS_W16(K_hi) > (int32_t)32750)
-        {
-            return 0; // Unstable filter
-        }
-
-        /*
-         Compute updated LPC coefficient: Anew[i]
-         Anew[j]= A[j] + K*A[i-j]   for j=1..i-1
-         Anew[i]= K
-         */
-
-        for (j = 1; j < i; j++)
-        {
-            // temp1W32 = A[j] in Q27
-            temp1W32 = (int32_t)A_hi[j] * 65536
-                    + WEBRTC_SPL_LSHIFT_W32((int32_t)A_low[j],1);
-
-            // temp1W32 += K*A[i-j] in Q27
-            temp1W32 += (K_hi * A_hi[i - j] + (K_hi * A_low[i - j] >> 15) +
-                (K_low * A_hi[i - j] >> 15)) * 2;
-
-            // Put Anew in hi and low format
-            A_upd_hi[j] = (int16_t)(temp1W32 >> 16);
-            A_upd_low[j] = (int16_t)(
-                (temp1W32 - ((int32_t)A_upd_hi[j] * 65536)) >> 1);
-        }
-
-        // temp3W32 = K in Q27 (Convert from Q31 to Q27)
-        temp3W32 >>= 4;
-
-        // Store Anew in hi and low format
-        A_upd_hi[i] = (int16_t)(temp3W32 >> 16);
-        A_upd_low[i] = (int16_t)(
-            (temp3W32 - ((int32_t)A_upd_hi[i] * 65536)) >> 1);
-
-        // Alpha = Alpha * (1-K^2)
-
-        temp1W32 = ((K_hi * K_low >> 14) + K_hi * K_hi) * 2;  // K*K in Q31
-
-        temp1W32 = WEBRTC_SPL_ABS_W32(temp1W32); // Guard against <0
-        temp1W32 = (int32_t)0x7fffffffL - temp1W32; // 1 - K*K  in Q31
-
-        // Convert 1- K^2 in hi and low format
-        tmp_hi = (int16_t)(temp1W32 >> 16);
-        tmp_low = (int16_t)((temp1W32 - ((int32_t)tmp_hi << 16)) >> 1);
-
-        // Calculate Alpha = Alpha * (1-K^2) in Q31
-        temp1W32 = (Alpha_hi * tmp_hi + (Alpha_hi * tmp_low >> 15) +
-            (Alpha_low * tmp_hi >> 15)) << 1;
-
-        // Normalize Alpha and store it on hi and low format
-
-        norm = WebRtcSpl_NormW32(temp1W32);
-        temp1W32 = WEBRTC_SPL_LSHIFT_W32(temp1W32, norm);
-
-        Alpha_hi = (int16_t)(temp1W32 >> 16);
-        Alpha_low = (int16_t)((temp1W32 - ((int32_t)Alpha_hi << 16)) >> 1);
-
-        // Update the total normalization of Alpha
-        Alpha_exp = Alpha_exp + norm;
-
-        // Update A[]
-
-        for (j = 1; j <= i; j++)
-        {
-            A_hi[j] = A_upd_hi[j];
-            A_low[j] = A_upd_low[j];
-        }
-    }
-
-    /*
-     Set A[0] to 1.0 and store the A[i] i=1...order in Q12
-     (Convert from Q27 and use rounding)
-     */
-
-    A[0] = 4096;
-
-    for (i = 1; i <= order; i++)
-    {
-        // temp1W32 in Q27
-        temp1W32 = (int32_t)A_hi[i] * 65536
-                + WEBRTC_SPL_LSHIFT_W32((int32_t)A_low[i], 1);
-        // Round and store upper word
-        A[i] = (int16_t)(((temp1W32 * 2) + 32768) >> 16);
-    }
-    return 1; // Stable filters
-}
diff --git a/common_audio/signal_processing/lpc_to_refl_coef.c b/common_audio/signal_processing/lpc_to_refl_coef.c
deleted file mode 100644
index edcebd4..0000000
--- a/common_audio/signal_processing/lpc_to_refl_coef.c
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-
-/*
- * This file contains the function WebRtcSpl_LpcToReflCoef().
- * The description header can be found in signal_processing_library.h
- *
- */
-
-#include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
-
-#define SPL_LPC_TO_REFL_COEF_MAX_AR_MODEL_ORDER 50
-
-void WebRtcSpl_LpcToReflCoef(int16_t* a16, int use_order, int16_t* k16)
-{
-    int m, k;
-    int32_t tmp32[SPL_LPC_TO_REFL_COEF_MAX_AR_MODEL_ORDER];
-    int32_t tmp_inv_denom32;
-    int16_t tmp_inv_denom16;
-
-    k16[use_order - 1] = a16[use_order] << 3;  // Q12<<3 => Q15
-    for (m = use_order - 1; m > 0; m--)
-    {
-        // (1 - k^2) in Q30
-        tmp_inv_denom32 = 1073741823 - k16[m] * k16[m];
-        // (1 - k^2) in Q15
-        tmp_inv_denom16 = (int16_t)(tmp_inv_denom32 >> 15);
-
-        for (k = 1; k <= m; k++)
-        {
-            // tmp[k] = (a[k] - RC[m] * a[m-k+1]) / (1.0 - RC[m]*RC[m]);
-
-            // [Q12<<16 - (Q15*Q12)<<1] = [Q28 - Q28] = Q28
-            tmp32[k] = (a16[k] << 16) - (k16[m] * a16[m - k + 1] << 1);
-
-            tmp32[k] = WebRtcSpl_DivW32W16(tmp32[k], tmp_inv_denom16); //Q28/Q15 = Q13
-        }
-
-        for (k = 1; k < m; k++)
-        {
-            a16[k] = (int16_t)(tmp32[k] >> 1);  // Q13>>1 => Q12
-        }
-
-        tmp32[m] = WEBRTC_SPL_SAT(8191, tmp32[m], -8191);
-        k16[m - 1] = (int16_t)WEBRTC_SPL_LSHIFT_W32(tmp32[m], 2); //Q13<<2 => Q15
-    }
-    return;
-}
diff --git a/common_audio/signal_processing/min_max_operations.c b/common_audio/signal_processing/min_max_operations.c
deleted file mode 100644
index 75975bb..0000000
--- a/common_audio/signal_processing/min_max_operations.c
+++ /dev/null
@@ -1,224 +0,0 @@
-/*
- *  Copyright (c) 2012 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.
- */
-
-/*
- * This file contains the implementation of functions
- * WebRtcSpl_MaxAbsValueW16C()
- * WebRtcSpl_MaxAbsValueW32C()
- * WebRtcSpl_MaxValueW16C()
- * WebRtcSpl_MaxValueW32C()
- * WebRtcSpl_MinValueW16C()
- * WebRtcSpl_MinValueW32C()
- * WebRtcSpl_MaxAbsIndexW16()
- * WebRtcSpl_MaxIndexW16()
- * WebRtcSpl_MaxIndexW32()
- * WebRtcSpl_MinIndexW16()
- * WebRtcSpl_MinIndexW32()
- *
- */
-
-#include <stdlib.h>
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
-
-// TODO(bjorn/kma): Consolidate function pairs (e.g. combine
-//   WebRtcSpl_MaxAbsValueW16C and WebRtcSpl_MaxAbsIndexW16 into a single one.)
-// TODO(kma): Move the next six functions into min_max_operations_c.c.
-
-// Maximum absolute value of word16 vector. C version for generic platforms.
-int16_t WebRtcSpl_MaxAbsValueW16C(const int16_t* vector, size_t length) {
-  size_t i = 0;
-  int absolute = 0, maximum = 0;
-
-  RTC_DCHECK_GT(length, 0);
-
-  for (i = 0; i < length; i++) {
-    absolute = abs((int)vector[i]);
-
-    if (absolute > maximum) {
-      maximum = absolute;
-    }
-  }
-
-  // Guard the case for abs(-32768).
-  if (maximum > WEBRTC_SPL_WORD16_MAX) {
-    maximum = WEBRTC_SPL_WORD16_MAX;
-  }
-
-  return (int16_t)maximum;
-}
-
-// Maximum absolute value of word32 vector. C version for generic platforms.
-int32_t WebRtcSpl_MaxAbsValueW32C(const int32_t* vector, size_t length) {
-  // Use uint32_t for the local variables, to accommodate the return value
-  // of abs(0x80000000), which is 0x80000000.
-
-  uint32_t absolute = 0, maximum = 0;
-  size_t i = 0;
-
-  RTC_DCHECK_GT(length, 0);
-
-  for (i = 0; i < length; i++) {
-    absolute = abs((int)vector[i]);
-    if (absolute > maximum) {
-      maximum = absolute;
-    }
-  }
-
-  maximum = WEBRTC_SPL_MIN(maximum, WEBRTC_SPL_WORD32_MAX);
-
-  return (int32_t)maximum;
-}
-
-// Maximum value of word16 vector. C version for generic platforms.
-int16_t WebRtcSpl_MaxValueW16C(const int16_t* vector, size_t length) {
-  int16_t maximum = WEBRTC_SPL_WORD16_MIN;
-  size_t i = 0;
-
-  RTC_DCHECK_GT(length, 0);
-
-  for (i = 0; i < length; i++) {
-    if (vector[i] > maximum)
-      maximum = vector[i];
-  }
-  return maximum;
-}
-
-// Maximum value of word32 vector. C version for generic platforms.
-int32_t WebRtcSpl_MaxValueW32C(const int32_t* vector, size_t length) {
-  int32_t maximum = WEBRTC_SPL_WORD32_MIN;
-  size_t i = 0;
-
-  RTC_DCHECK_GT(length, 0);
-
-  for (i = 0; i < length; i++) {
-    if (vector[i] > maximum)
-      maximum = vector[i];
-  }
-  return maximum;
-}
-
-// Minimum value of word16 vector. C version for generic platforms.
-int16_t WebRtcSpl_MinValueW16C(const int16_t* vector, size_t length) {
-  int16_t minimum = WEBRTC_SPL_WORD16_MAX;
-  size_t i = 0;
-
-  RTC_DCHECK_GT(length, 0);
-
-  for (i = 0; i < length; i++) {
-    if (vector[i] < minimum)
-      minimum = vector[i];
-  }
-  return minimum;
-}
-
-// Minimum value of word32 vector. C version for generic platforms.
-int32_t WebRtcSpl_MinValueW32C(const int32_t* vector, size_t length) {
-  int32_t minimum = WEBRTC_SPL_WORD32_MAX;
-  size_t i = 0;
-
-  RTC_DCHECK_GT(length, 0);
-
-  for (i = 0; i < length; i++) {
-    if (vector[i] < minimum)
-      minimum = vector[i];
-  }
-  return minimum;
-}
-
-// Index of maximum absolute value in a word16 vector.
-size_t WebRtcSpl_MaxAbsIndexW16(const int16_t* vector, size_t length) {
-  // Use type int for local variables, to accomodate the value of abs(-32768).
-
-  size_t i = 0, index = 0;
-  int absolute = 0, maximum = 0;
-
-  RTC_DCHECK_GT(length, 0);
-
-  for (i = 0; i < length; i++) {
-    absolute = abs((int)vector[i]);
-
-    if (absolute > maximum) {
-      maximum = absolute;
-      index = i;
-    }
-  }
-
-  return index;
-}
-
-// Index of maximum value in a word16 vector.
-size_t WebRtcSpl_MaxIndexW16(const int16_t* vector, size_t length) {
-  size_t i = 0, index = 0;
-  int16_t maximum = WEBRTC_SPL_WORD16_MIN;
-
-  RTC_DCHECK_GT(length, 0);
-
-  for (i = 0; i < length; i++) {
-    if (vector[i] > maximum) {
-      maximum = vector[i];
-      index = i;
-    }
-  }
-
-  return index;
-}
-
-// Index of maximum value in a word32 vector.
-size_t WebRtcSpl_MaxIndexW32(const int32_t* vector, size_t length) {
-  size_t i = 0, index = 0;
-  int32_t maximum = WEBRTC_SPL_WORD32_MIN;
-
-  RTC_DCHECK_GT(length, 0);
-
-  for (i = 0; i < length; i++) {
-    if (vector[i] > maximum) {
-      maximum = vector[i];
-      index = i;
-    }
-  }
-
-  return index;
-}
-
-// Index of minimum value in a word16 vector.
-size_t WebRtcSpl_MinIndexW16(const int16_t* vector, size_t length) {
-  size_t i = 0, index = 0;
-  int16_t minimum = WEBRTC_SPL_WORD16_MAX;
-
-  RTC_DCHECK_GT(length, 0);
-
-  for (i = 0; i < length; i++) {
-    if (vector[i] < minimum) {
-      minimum = vector[i];
-      index = i;
-    }
-  }
-
-  return index;
-}
-
-// Index of minimum value in a word32 vector.
-size_t WebRtcSpl_MinIndexW32(const int32_t* vector, size_t length) {
-  size_t i = 0, index = 0;
-  int32_t minimum = WEBRTC_SPL_WORD32_MAX;
-
-  RTC_DCHECK_GT(length, 0);
-
-  for (i = 0; i < length; i++) {
-    if (vector[i] < minimum) {
-      minimum = vector[i];
-      index = i;
-    }
-  }
-
-  return index;
-}
diff --git a/common_audio/signal_processing/min_max_operations_mips.c b/common_audio/signal_processing/min_max_operations_mips.c
deleted file mode 100644
index 96e20af..0000000
--- a/common_audio/signal_processing/min_max_operations_mips.c
+++ /dev/null
@@ -1,375 +0,0 @@
-/*
- *  Copyright (c) 2013 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.
- */
-
-/*
- * This file contains the implementation of function
- * WebRtcSpl_MaxAbsValueW16()
- *
- * The description header can be found in signal_processing_library.h.
- *
- */
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
-
-// Maximum absolute value of word16 vector.
-int16_t WebRtcSpl_MaxAbsValueW16_mips(const int16_t* vector, size_t length) {
-  int32_t totMax = 0;
-  int32_t tmp32_0, tmp32_1, tmp32_2, tmp32_3;
-  size_t i, loop_size;
-
-  RTC_DCHECK_GT(length, 0);
-
-#if defined(MIPS_DSP_R1)
-  const int32_t* tmpvec32 = (int32_t*)vector;
-  loop_size = length >> 4;
-
-  for (i = 0; i < loop_size; i++) {
-    __asm__ volatile (
-      "lw         %[tmp32_0],     0(%[tmpvec32])              \n\t"
-      "lw         %[tmp32_1],     4(%[tmpvec32])              \n\t"
-      "lw         %[tmp32_2],     8(%[tmpvec32])              \n\t"
-      "lw         %[tmp32_3],     12(%[tmpvec32])             \n\t"
-
-      "absq_s.ph  %[tmp32_0],     %[tmp32_0]                  \n\t"
-      "absq_s.ph  %[tmp32_1],     %[tmp32_1]                  \n\t"
-      "cmp.lt.ph  %[totMax],      %[tmp32_0]                  \n\t"
-      "pick.ph    %[totMax],      %[tmp32_0],     %[totMax]   \n\t"
-
-      "lw         %[tmp32_0],     16(%[tmpvec32])             \n\t"
-      "absq_s.ph  %[tmp32_2],     %[tmp32_2]                  \n\t"
-      "cmp.lt.ph  %[totMax],      %[tmp32_1]                  \n\t"
-      "pick.ph    %[totMax],      %[tmp32_1],     %[totMax]   \n\t"
-
-      "lw         %[tmp32_1],     20(%[tmpvec32])             \n\t"
-      "absq_s.ph  %[tmp32_3],     %[tmp32_3]                  \n\t"
-      "cmp.lt.ph  %[totMax],      %[tmp32_2]                  \n\t"
-      "pick.ph    %[totMax],      %[tmp32_2],     %[totMax]   \n\t"
-
-      "lw         %[tmp32_2],     24(%[tmpvec32])             \n\t"
-      "cmp.lt.ph  %[totMax],      %[tmp32_3]                  \n\t"
-      "pick.ph    %[totMax],      %[tmp32_3],     %[totMax]   \n\t"
-
-      "lw         %[tmp32_3],     28(%[tmpvec32])             \n\t"
-      "absq_s.ph  %[tmp32_0],     %[tmp32_0]                  \n\t"
-      "absq_s.ph  %[tmp32_1],     %[tmp32_1]                  \n\t"
-      "cmp.lt.ph  %[totMax],      %[tmp32_0]                  \n\t"
-      "pick.ph    %[totMax],      %[tmp32_0],     %[totMax]   \n\t"
-
-      "absq_s.ph  %[tmp32_2],     %[tmp32_2]                  \n\t"
-      "cmp.lt.ph  %[totMax],      %[tmp32_1]                  \n\t"
-      "pick.ph    %[totMax],      %[tmp32_1],     %[totMax]   \n\t"
-      "absq_s.ph  %[tmp32_3],     %[tmp32_3]                  \n\t"
-      "cmp.lt.ph  %[totMax],      %[tmp32_2]                  \n\t"
-      "pick.ph    %[totMax],      %[tmp32_2],     %[totMax]   \n\t"
-
-      "cmp.lt.ph  %[totMax],      %[tmp32_3]                  \n\t"
-      "pick.ph    %[totMax],      %[tmp32_3],     %[totMax]   \n\t"
-
-      "addiu      %[tmpvec32],    %[tmpvec32],    32          \n\t"
-      : [tmp32_0] "=&r" (tmp32_0), [tmp32_1] "=&r" (tmp32_1),
-        [tmp32_2] "=&r" (tmp32_2), [tmp32_3] "=&r" (tmp32_3),
-        [totMax] "+r" (totMax), [tmpvec32] "+r" (tmpvec32)
-      :
-      : "memory"
-    );
-  }
-  __asm__ volatile (
-    "rotr       %[tmp32_0],     %[totMax],      16          \n\t"
-    "cmp.lt.ph  %[totMax],      %[tmp32_0]                  \n\t"
-    "pick.ph    %[totMax],      %[tmp32_0],     %[totMax]   \n\t"
-    "packrl.ph  %[totMax],      $0,             %[totMax]   \n\t"
-    : [tmp32_0] "=&r" (tmp32_0), [totMax] "+r" (totMax)
-    :
-  );
-  loop_size = length & 0xf;
-  for (i = 0; i < loop_size; i++) {
-    __asm__ volatile (
-      "lh         %[tmp32_0],     0(%[tmpvec32])              \n\t"
-      "addiu      %[tmpvec32],    %[tmpvec32],     2          \n\t"
-      "absq_s.w   %[tmp32_0],     %[tmp32_0]                  \n\t"
-      "slt        %[tmp32_1],     %[totMax],       %[tmp32_0] \n\t"
-      "movn       %[totMax],      %[tmp32_0],      %[tmp32_1] \n\t"
-      : [tmp32_0] "=&r" (tmp32_0), [tmp32_1] "=&r" (tmp32_1),
-        [tmpvec32] "+r" (tmpvec32), [totMax] "+r" (totMax)
-      :
-      : "memory"
-    );
-  }
-#else  // #if defined(MIPS_DSP_R1)
-  int32_t v16MaxMax = WEBRTC_SPL_WORD16_MAX;
-  int32_t r, r1, r2, r3;
-  const int16_t* tmpvector = vector;
-  loop_size = length >> 4;
-  for (i = 0; i < loop_size; i++) {
-    __asm__ volatile (
-      "lh     %[tmp32_0],     0(%[tmpvector])                 \n\t"
-      "lh     %[tmp32_1],     2(%[tmpvector])                 \n\t"
-      "lh     %[tmp32_2],     4(%[tmpvector])                 \n\t"
-      "lh     %[tmp32_3],     6(%[tmpvector])                 \n\t"
-
-      "abs    %[tmp32_0],     %[tmp32_0]                      \n\t"
-      "abs    %[tmp32_1],     %[tmp32_1]                      \n\t"
-      "abs    %[tmp32_2],     %[tmp32_2]                      \n\t"
-      "abs    %[tmp32_3],     %[tmp32_3]                      \n\t"
-
-      "slt    %[r],           %[totMax],      %[tmp32_0]      \n\t"
-      "movn   %[totMax],      %[tmp32_0],     %[r]            \n\t"
-      "slt    %[r1],          %[totMax],      %[tmp32_1]      \n\t"
-      "movn   %[totMax],      %[tmp32_1],     %[r1]           \n\t"
-      "slt    %[r2],          %[totMax],      %[tmp32_2]      \n\t"
-      "movn   %[totMax],      %[tmp32_2],     %[r2]           \n\t"
-      "slt    %[r3],          %[totMax],      %[tmp32_3]      \n\t"
-      "movn   %[totMax],      %[tmp32_3],     %[r3]           \n\t"
-
-      "lh     %[tmp32_0],     8(%[tmpvector])                 \n\t"
-      "lh     %[tmp32_1],     10(%[tmpvector])                \n\t"
-      "lh     %[tmp32_2],     12(%[tmpvector])                \n\t"
-      "lh     %[tmp32_3],     14(%[tmpvector])                \n\t"
-
-      "abs    %[tmp32_0],     %[tmp32_0]                      \n\t"
-      "abs    %[tmp32_1],     %[tmp32_1]                      \n\t"
-      "abs    %[tmp32_2],     %[tmp32_2]                      \n\t"
-      "abs    %[tmp32_3],     %[tmp32_3]                      \n\t"
-
-      "slt    %[r],           %[totMax],      %[tmp32_0]      \n\t"
-      "movn   %[totMax],      %[tmp32_0],     %[r]            \n\t"
-      "slt    %[r1],          %[totMax],      %[tmp32_1]      \n\t"
-      "movn   %[totMax],      %[tmp32_1],     %[r1]           \n\t"
-      "slt    %[r2],          %[totMax],      %[tmp32_2]      \n\t"
-      "movn   %[totMax],      %[tmp32_2],     %[r2]           \n\t"
-      "slt    %[r3],          %[totMax],      %[tmp32_3]      \n\t"
-      "movn   %[totMax],      %[tmp32_3],     %[r3]           \n\t"
-
-      "lh     %[tmp32_0],     16(%[tmpvector])                \n\t"
-      "lh     %[tmp32_1],     18(%[tmpvector])                \n\t"
-      "lh     %[tmp32_2],     20(%[tmpvector])                \n\t"
-      "lh     %[tmp32_3],     22(%[tmpvector])                \n\t"
-
-      "abs    %[tmp32_0],     %[tmp32_0]                      \n\t"
-      "abs    %[tmp32_1],     %[tmp32_1]                      \n\t"
-      "abs    %[tmp32_2],     %[tmp32_2]                      \n\t"
-      "abs    %[tmp32_3],     %[tmp32_3]                      \n\t"
-
-      "slt    %[r],           %[totMax],      %[tmp32_0]      \n\t"
-      "movn   %[totMax],      %[tmp32_0],     %[r]            \n\t"
-      "slt    %[r1],          %[totMax],      %[tmp32_1]      \n\t"
-      "movn   %[totMax],      %[tmp32_1],     %[r1]           \n\t"
-      "slt    %[r2],          %[totMax],      %[tmp32_2]      \n\t"
-      "movn   %[totMax],      %[tmp32_2],     %[r2]           \n\t"
-      "slt    %[r3],          %[totMax],      %[tmp32_3]      \n\t"
-      "movn   %[totMax],      %[tmp32_3],     %[r3]           \n\t"
-
-      "lh     %[tmp32_0],     24(%[tmpvector])                \n\t"
-      "lh     %[tmp32_1],     26(%[tmpvector])                \n\t"
-      "lh     %[tmp32_2],     28(%[tmpvector])                \n\t"
-      "lh     %[tmp32_3],     30(%[tmpvector])                \n\t"
-
-      "abs    %[tmp32_0],     %[tmp32_0]                      \n\t"
-      "abs    %[tmp32_1],     %[tmp32_1]                      \n\t"
-      "abs    %[tmp32_2],     %[tmp32_2]                      \n\t"
-      "abs    %[tmp32_3],     %[tmp32_3]                      \n\t"
-
-      "slt    %[r],           %[totMax],      %[tmp32_0]      \n\t"
-      "movn   %[totMax],      %[tmp32_0],     %[r]            \n\t"
-      "slt    %[r1],          %[totMax],      %[tmp32_1]      \n\t"
-      "movn   %[totMax],      %[tmp32_1],     %[r1]           \n\t"
-      "slt    %[r2],          %[totMax],      %[tmp32_2]      \n\t"
-      "movn   %[totMax],      %[tmp32_2],     %[r2]           \n\t"
-      "slt    %[r3],          %[totMax],      %[tmp32_3]      \n\t"
-      "movn   %[totMax],      %[tmp32_3],     %[r3]           \n\t"
-
-      "addiu  %[tmpvector],   %[tmpvector],   32              \n\t"
-      : [tmp32_0] "=&r" (tmp32_0), [tmp32_1] "=&r" (tmp32_1),
-        [tmp32_2] "=&r" (tmp32_2), [tmp32_3] "=&r" (tmp32_3),
-        [totMax] "+r" (totMax), [r] "=&r" (r), [tmpvector] "+r" (tmpvector),
-        [r1] "=&r" (r1), [r2] "=&r" (r2), [r3] "=&r" (r3)
-      :
-      : "memory"
-    );
-  }
-  loop_size = length & 0xf;
-  for (i = 0; i < loop_size; i++) {
-    __asm__ volatile (
-      "lh         %[tmp32_0],     0(%[tmpvector])             \n\t"
-      "addiu      %[tmpvector],   %[tmpvector],    2          \n\t"
-      "abs        %[tmp32_0],     %[tmp32_0]                  \n\t"
-      "slt        %[tmp32_1],     %[totMax],       %[tmp32_0] \n\t"
-      "movn       %[totMax],      %[tmp32_0],      %[tmp32_1] \n\t"
-      : [tmp32_0] "=&r" (tmp32_0), [tmp32_1] "=&r" (tmp32_1),
-        [tmpvector] "+r" (tmpvector), [totMax] "+r" (totMax)
-      :
-      : "memory"
-    );
-  }
-
-  __asm__ volatile (
-    "slt    %[r],       %[v16MaxMax],   %[totMax]   \n\t"
-    "movn   %[totMax],  %[v16MaxMax],   %[r]        \n\t"
-    : [totMax] "+r" (totMax), [r] "=&r" (r)
-    : [v16MaxMax] "r" (v16MaxMax)
-  );
-#endif  // #if defined(MIPS_DSP_R1)
-  return (int16_t)totMax;
-}
-
-#if defined(MIPS_DSP_R1_LE)
-// Maximum absolute value of word32 vector. Version for MIPS platform.
-int32_t WebRtcSpl_MaxAbsValueW32_mips(const int32_t* vector, size_t length) {
-  // Use uint32_t for the local variables, to accommodate the return value
-  // of abs(0x80000000), which is 0x80000000.
-
-  uint32_t absolute = 0, maximum = 0;
-  int tmp1 = 0, max_value = 0x7fffffff;
-
-  RTC_DCHECK_GT(length, 0);
-
-  __asm__ volatile (
-    ".set push                                                        \n\t"
-    ".set noreorder                                                   \n\t"
-
-   "1:                                                                \n\t"
-    "lw         %[absolute],      0(%[vector])                        \n\t"
-    "absq_s.w   %[absolute],      %[absolute]                         \n\t"
-    "addiu      %[length],        %[length],          -1              \n\t"
-    "slt        %[tmp1],          %[maximum],         %[absolute]     \n\t"
-    "movn       %[maximum],       %[absolute],        %[tmp1]         \n\t"
-    "bgtz       %[length],        1b                                  \n\t"
-    " addiu     %[vector],        %[vector],          4               \n\t"
-    "slt        %[tmp1],          %[max_value],       %[maximum]      \n\t"
-    "movn       %[maximum],       %[max_value],       %[tmp1]         \n\t"
-
-    ".set pop                                                         \n\t"
-
-    : [tmp1] "=&r" (tmp1), [maximum] "+r" (maximum), [absolute] "+r" (absolute)
-    : [vector] "r" (vector), [length] "r" (length), [max_value] "r" (max_value)
-    : "memory"
-  );
-
-  return (int32_t)maximum;
-}
-#endif  // #if defined(MIPS_DSP_R1_LE)
-
-// Maximum value of word16 vector. Version for MIPS platform.
-int16_t WebRtcSpl_MaxValueW16_mips(const int16_t* vector, size_t length) {
-  int16_t maximum = WEBRTC_SPL_WORD16_MIN;
-  int tmp1;
-  int16_t value;
-
-  RTC_DCHECK_GT(length, 0);
-
-  __asm__ volatile (
-    ".set push                                                        \n\t"
-    ".set noreorder                                                   \n\t"
-
-   "1:                                                                \n\t"
-    "lh         %[value],         0(%[vector])                        \n\t"
-    "addiu      %[length],        %[length],          -1              \n\t"
-    "slt        %[tmp1],          %[maximum],         %[value]        \n\t"
-    "movn       %[maximum],       %[value],           %[tmp1]         \n\t"
-    "bgtz       %[length],        1b                                  \n\t"
-    " addiu     %[vector],        %[vector],          2               \n\t"
-    ".set pop                                                         \n\t"
-
-    : [tmp1] "=&r" (tmp1), [maximum] "+r" (maximum), [value] "=&r" (value)
-    : [vector] "r" (vector), [length] "r" (length)
-    : "memory"
-  );
-
-  return maximum;
-}
-
-// Maximum value of word32 vector. Version for MIPS platform.
-int32_t WebRtcSpl_MaxValueW32_mips(const int32_t* vector, size_t length) {
-  int32_t maximum = WEBRTC_SPL_WORD32_MIN;
-  int tmp1, value;
-
-  RTC_DCHECK_GT(length, 0);
-
-  __asm__ volatile (
-    ".set push                                                        \n\t"
-    ".set noreorder                                                   \n\t"
-
-   "1:                                                                \n\t"
-    "lw         %[value],         0(%[vector])                        \n\t"
-    "addiu      %[length],        %[length],          -1              \n\t"
-    "slt        %[tmp1],          %[maximum],         %[value]        \n\t"
-    "movn       %[maximum],       %[value],           %[tmp1]         \n\t"
-    "bgtz       %[length],        1b                                  \n\t"
-    " addiu     %[vector],        %[vector],          4               \n\t"
-
-    ".set pop                                                         \n\t"
-
-    : [tmp1] "=&r" (tmp1), [maximum] "+r" (maximum), [value] "=&r" (value)
-    : [vector] "r" (vector), [length] "r" (length)
-    : "memory"
-  );
-
-  return maximum;
-}
-
-// Minimum value of word16 vector. Version for MIPS platform.
-int16_t WebRtcSpl_MinValueW16_mips(const int16_t* vector, size_t length) {
-  int16_t minimum = WEBRTC_SPL_WORD16_MAX;
-  int tmp1;
-  int16_t value;
-
-  RTC_DCHECK_GT(length, 0);
-
-  __asm__ volatile (
-    ".set push                                                        \n\t"
-    ".set noreorder                                                   \n\t"
-
-   "1:                                                                \n\t"
-    "lh         %[value],         0(%[vector])                        \n\t"
-    "addiu      %[length],        %[length],          -1              \n\t"
-    "slt        %[tmp1],          %[value],           %[minimum]      \n\t"
-    "movn       %[minimum],       %[value],           %[tmp1]         \n\t"
-    "bgtz       %[length],        1b                                  \n\t"
-    " addiu     %[vector],        %[vector],          2               \n\t"
-
-    ".set pop                                                         \n\t"
-
-    : [tmp1] "=&r" (tmp1), [minimum] "+r" (minimum), [value] "=&r" (value)
-    : [vector] "r" (vector), [length] "r" (length)
-    : "memory"
-  );
-
-  return minimum;
-}
-
-// Minimum value of word32 vector. Version for MIPS platform.
-int32_t WebRtcSpl_MinValueW32_mips(const int32_t* vector, size_t length) {
-  int32_t minimum = WEBRTC_SPL_WORD32_MAX;
-  int tmp1, value;
-
-  RTC_DCHECK_GT(length, 0);
-
-  __asm__ volatile (
-    ".set push                                                        \n\t"
-    ".set noreorder                                                   \n\t"
-
-   "1:                                                                \n\t"
-    "lw         %[value],         0(%[vector])                        \n\t"
-    "addiu      %[length],        %[length],          -1              \n\t"
-    "slt        %[tmp1],          %[value],           %[minimum]      \n\t"
-    "movn       %[minimum],       %[value],           %[tmp1]         \n\t"
-    "bgtz       %[length],        1b                                  \n\t"
-    " addiu     %[vector],        %[vector],          4               \n\t"
-
-    ".set pop                                                         \n\t"
-
-    : [tmp1] "=&r" (tmp1), [minimum] "+r" (minimum), [value] "=&r" (value)
-    : [vector] "r" (vector), [length] "r" (length)
-    : "memory"
-  );
-
-  return minimum;
-}
diff --git a/common_audio/signal_processing/min_max_operations_neon.c b/common_audio/signal_processing/min_max_operations_neon.c
deleted file mode 100644
index e26d0ab..0000000
--- a/common_audio/signal_processing/min_max_operations_neon.c
+++ /dev/null
@@ -1,283 +0,0 @@
-/*
- *  Copyright (c) 2014 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 <arm_neon.h>
-#include <stdlib.h>
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
-
-// Maximum absolute value of word16 vector. C version for generic platforms.
-int16_t WebRtcSpl_MaxAbsValueW16Neon(const int16_t* vector, size_t length) {
-  int absolute = 0, maximum = 0;
-
-  RTC_DCHECK_GT(length, 0);
-
-  const int16_t* p_start = vector;
-  size_t rest = length & 7;
-  const int16_t* p_end = vector + length - rest;
-
-  int16x8_t v;
-  uint16x8_t max_qv;
-  max_qv = vdupq_n_u16(0);
-
-  while (p_start < p_end) {
-    v = vld1q_s16(p_start);
-    // Note vabs doesn't change the value of -32768.
-    v = vabsq_s16(v);
-    // Use u16 so we don't lose the value -32768.
-    max_qv = vmaxq_u16(max_qv, vreinterpretq_u16_s16(v));
-    p_start += 8;
-  }
-
-#ifdef WEBRTC_ARCH_ARM64
-  maximum = (int)vmaxvq_u16(max_qv);
-#else
-  uint16x4_t max_dv;
-  max_dv = vmax_u16(vget_low_u16(max_qv), vget_high_u16(max_qv));
-  max_dv = vpmax_u16(max_dv, max_dv);
-  max_dv = vpmax_u16(max_dv, max_dv);
-
-  maximum = (int)vget_lane_u16(max_dv, 0);
-#endif
-
-  p_end = vector + length;
-  while (p_start < p_end) {
-    absolute = abs((int)(*p_start));
-
-    if (absolute > maximum) {
-      maximum = absolute;
-    }
-    p_start++;
-  }
-
-  // Guard the case for abs(-32768).
-  if (maximum > WEBRTC_SPL_WORD16_MAX) {
-    maximum = WEBRTC_SPL_WORD16_MAX;
-  }
-
-  return (int16_t)maximum;
-}
-
-// Maximum absolute value of word32 vector. NEON intrinsics version for
-// ARM 32-bit/64-bit platforms.
-int32_t WebRtcSpl_MaxAbsValueW32Neon(const int32_t* vector, size_t length) {
-  // Use uint32_t for the local variables, to accommodate the return value
-  // of abs(0x80000000), which is 0x80000000.
-
-  uint32_t absolute = 0, maximum = 0;
-  size_t i = 0;
-  size_t residual = length & 0x7;
-
-  RTC_DCHECK_GT(length, 0);
-
-  const int32_t* p_start = vector;
-  uint32x4_t max32x4_0 = vdupq_n_u32(0);
-  uint32x4_t max32x4_1 = vdupq_n_u32(0);
-
-  // First part, unroll the loop 8 times.
-  for (i = 0; i < length - residual; i += 8) {
-    int32x4_t in32x4_0 = vld1q_s32(p_start);
-    p_start += 4;
-    int32x4_t in32x4_1 = vld1q_s32(p_start);
-    p_start += 4;
-    in32x4_0 = vabsq_s32(in32x4_0);
-    in32x4_1 = vabsq_s32(in32x4_1);
-    // vabs doesn't change the value of 0x80000000.
-    // Use u32 so we don't lose the value 0x80000000.
-    max32x4_0 = vmaxq_u32(max32x4_0, vreinterpretq_u32_s32(in32x4_0));
-    max32x4_1 = vmaxq_u32(max32x4_1, vreinterpretq_u32_s32(in32x4_1));
-  }
-
-  uint32x4_t max32x4 = vmaxq_u32(max32x4_0, max32x4_1);
-#if defined(WEBRTC_ARCH_ARM64)
-  maximum = vmaxvq_u32(max32x4);
-#else
-  uint32x2_t max32x2 = vmax_u32(vget_low_u32(max32x4), vget_high_u32(max32x4));
-  max32x2 = vpmax_u32(max32x2, max32x2);
-
-  maximum = vget_lane_u32(max32x2, 0);
-#endif
-
-  // Second part, do the remaining iterations (if any).
-  for (i = residual; i > 0; i--) {
-    absolute = abs((int)(*p_start));
-    if (absolute > maximum) {
-      maximum = absolute;
-    }
-    p_start++;
-  }
-
-  // Guard against the case for 0x80000000.
-  maximum = WEBRTC_SPL_MIN(maximum, WEBRTC_SPL_WORD32_MAX);
-
-  return (int32_t)maximum;
-}
-
-// Maximum value of word16 vector. NEON intrinsics version for
-// ARM 32-bit/64-bit platforms.
-int16_t WebRtcSpl_MaxValueW16Neon(const int16_t* vector, size_t length) {
-  int16_t maximum = WEBRTC_SPL_WORD16_MIN;
-  size_t i = 0;
-  size_t residual = length & 0x7;
-
-  RTC_DCHECK_GT(length, 0);
-
-  const int16_t* p_start = vector;
-  int16x8_t max16x8 = vdupq_n_s16(WEBRTC_SPL_WORD16_MIN);
-
-  // First part, unroll the loop 8 times.
-  for (i = 0; i < length - residual; i += 8) {
-    int16x8_t in16x8 = vld1q_s16(p_start);
-    max16x8 = vmaxq_s16(max16x8, in16x8);
-    p_start += 8;
-  }
-
-#if defined(WEBRTC_ARCH_ARM64)
-  maximum = vmaxvq_s16(max16x8);
-#else
-  int16x4_t max16x4 = vmax_s16(vget_low_s16(max16x8), vget_high_s16(max16x8));
-  max16x4 = vpmax_s16(max16x4, max16x4);
-  max16x4 = vpmax_s16(max16x4, max16x4);
-
-  maximum = vget_lane_s16(max16x4, 0);
-#endif
-
-  // Second part, do the remaining iterations (if any).
-  for (i = residual; i > 0; i--) {
-    if (*p_start > maximum)
-      maximum = *p_start;
-    p_start++;
-  }
-  return maximum;
-}
-
-// Maximum value of word32 vector. NEON intrinsics version for
-// ARM 32-bit/64-bit platforms.
-int32_t WebRtcSpl_MaxValueW32Neon(const int32_t* vector, size_t length) {
-  int32_t maximum = WEBRTC_SPL_WORD32_MIN;
-  size_t i = 0;
-  size_t residual = length & 0x7;
-
-  RTC_DCHECK_GT(length, 0);
-
-  const int32_t* p_start = vector;
-  int32x4_t max32x4_0 = vdupq_n_s32(WEBRTC_SPL_WORD32_MIN);
-  int32x4_t max32x4_1 = vdupq_n_s32(WEBRTC_SPL_WORD32_MIN);
-
-  // First part, unroll the loop 8 times.
-  for (i = 0; i < length - residual; i += 8) {
-    int32x4_t in32x4_0 = vld1q_s32(p_start);
-    p_start += 4;
-    int32x4_t in32x4_1 = vld1q_s32(p_start);
-    p_start += 4;
-    max32x4_0 = vmaxq_s32(max32x4_0, in32x4_0);
-    max32x4_1 = vmaxq_s32(max32x4_1, in32x4_1);
-  }
-
-  int32x4_t max32x4 = vmaxq_s32(max32x4_0, max32x4_1);
-#if defined(WEBRTC_ARCH_ARM64)
-  maximum = vmaxvq_s32(max32x4);
-#else
-  int32x2_t max32x2 = vmax_s32(vget_low_s32(max32x4), vget_high_s32(max32x4));
-  max32x2 = vpmax_s32(max32x2, max32x2);
-
-  maximum = vget_lane_s32(max32x2, 0);
-#endif
-
-  // Second part, do the remaining iterations (if any).
-  for (i = residual; i > 0; i--) {
-    if (*p_start > maximum)
-      maximum = *p_start;
-    p_start++;
-  }
-  return maximum;
-}
-
-// Minimum value of word16 vector. NEON intrinsics version for
-// ARM 32-bit/64-bit platforms.
-int16_t WebRtcSpl_MinValueW16Neon(const int16_t* vector, size_t length) {
-  int16_t minimum = WEBRTC_SPL_WORD16_MAX;
-  size_t i = 0;
-  size_t residual = length & 0x7;
-
-  RTC_DCHECK_GT(length, 0);
-
-  const int16_t* p_start = vector;
-  int16x8_t min16x8 = vdupq_n_s16(WEBRTC_SPL_WORD16_MAX);
-
-  // First part, unroll the loop 8 times.
-  for (i = 0; i < length - residual; i += 8) {
-    int16x8_t in16x8 = vld1q_s16(p_start);
-    min16x8 = vminq_s16(min16x8, in16x8);
-    p_start += 8;
-  }
-
-#if defined(WEBRTC_ARCH_ARM64)
-  minimum = vminvq_s16(min16x8);
-#else
-  int16x4_t min16x4 = vmin_s16(vget_low_s16(min16x8), vget_high_s16(min16x8));
-  min16x4 = vpmin_s16(min16x4, min16x4);
-  min16x4 = vpmin_s16(min16x4, min16x4);
-
-  minimum = vget_lane_s16(min16x4, 0);
-#endif
-
-  // Second part, do the remaining iterations (if any).
-  for (i = residual; i > 0; i--) {
-    if (*p_start < minimum)
-      minimum = *p_start;
-    p_start++;
-  }
-  return minimum;
-}
-
-// Minimum value of word32 vector. NEON intrinsics version for
-// ARM 32-bit/64-bit platforms.
-int32_t WebRtcSpl_MinValueW32Neon(const int32_t* vector, size_t length) {
-  int32_t minimum = WEBRTC_SPL_WORD32_MAX;
-  size_t i = 0;
-  size_t residual = length & 0x7;
-
-  RTC_DCHECK_GT(length, 0);
-
-  const int32_t* p_start = vector;
-  int32x4_t min32x4_0 = vdupq_n_s32(WEBRTC_SPL_WORD32_MAX);
-  int32x4_t min32x4_1 = vdupq_n_s32(WEBRTC_SPL_WORD32_MAX);
-
-  // First part, unroll the loop 8 times.
-  for (i = 0; i < length - residual; i += 8) {
-    int32x4_t in32x4_0 = vld1q_s32(p_start);
-    p_start += 4;
-    int32x4_t in32x4_1 = vld1q_s32(p_start);
-    p_start += 4;
-    min32x4_0 = vminq_s32(min32x4_0, in32x4_0);
-    min32x4_1 = vminq_s32(min32x4_1, in32x4_1);
-  }
-
-  int32x4_t min32x4 = vminq_s32(min32x4_0, min32x4_1);
-#if defined(WEBRTC_ARCH_ARM64)
-  minimum = vminvq_s32(min32x4);
-#else
-  int32x2_t min32x2 = vmin_s32(vget_low_s32(min32x4), vget_high_s32(min32x4));
-  min32x2 = vpmin_s32(min32x2, min32x2);
-
-  minimum = vget_lane_s32(min32x2, 0);
-#endif
-
-  // Second part, do the remaining iterations (if any).
-  for (i = residual; i > 0; i--) {
-    if (*p_start < minimum)
-      minimum = *p_start;
-    p_start++;
-  }
-  return minimum;
-}
-
diff --git a/common_audio/signal_processing/randomization_functions.c b/common_audio/signal_processing/randomization_functions.c
deleted file mode 100644
index 73f2409..0000000
--- a/common_audio/signal_processing/randomization_functions.c
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-
-/*
- * This file contains implementations of the randomization functions
- * WebRtcSpl_RandU()
- * WebRtcSpl_RandN()
- * WebRtcSpl_RandUArray()
- *
- * The description header can be found in signal_processing_library.h
- *
- */
-
-#include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
-
-static const uint32_t kMaxSeedUsed = 0x80000000;
-
-static const int16_t kRandNTable[] = {
-    9178,    -7260,       40,    10189,     4894,    -3531,   -13779,    14764,
-   -4008,    -8884,    -8990,     1008,     7368,     5184,     3251,    -5817,
-   -9786,     5963,     1770,     8066,    -7135,    10772,    -2298,     1361,
-    6484,     2241,    -8633,      792,      199,    -3344,     6553,   -10079,
-  -15040,       95,    11608,   -12469,    14161,    -4176,     2476,     6403,
-   13685,   -16005,     6646,     2239,    10916,    -3004,     -602,    -3141,
-    2142,    14144,    -5829,     5305,     8209,     4713,     2697,    -5112,
-   16092,    -1210,    -2891,    -6631,    -5360,   -11878,    -6781,    -2739,
-   -6392,      536,    10923,    10872,     5059,    -4748,    -7770,     5477,
-      38,    -1025,    -2892,     1638,     6304,    14375,   -11028,     1553,
-   -1565,    10762,     -393,     4040,     5257,    12310,     6554,    -4799,
-    4899,    -6354,     1603,    -1048,    -2220,     8247,     -186,    -8944,
-  -12004,     2332,     4801,    -4933,     6371,      131,     8614,    -5927,
-   -8287,   -22760,     4033,   -15162,     3385,     3246,     3153,    -5250,
-    3766,      784,     6494,      -62,     3531,    -1582,    15572,      662,
-   -3952,     -330,    -3196,      669,     7236,    -2678,    -6569,    23319,
-   -8645,     -741,    14830,   -15976,     4903,      315,   -11342,    10311,
-    1858,    -7777,     2145,     5436,     5677,     -113,   -10033,      826,
-   -1353,    17210,     7768,      986,    -1471,     8291,    -4982,     8207,
-  -14911,    -6255,    -2449,   -11881,    -7059,   -11703,    -4338,     8025,
-    7538,    -2823,   -12490,     9470,    -1613,    -2529,   -10092,    -7807,
-    9480,     6970,   -12844,     5123,     3532,     4816,     4803,    -8455,
-   -5045,    14032,    -4378,    -1643,     5756,   -11041,    -2732,   -16618,
-   -6430,   -18375,    -3320,     6098,     5131,    -4269,    -8840,     2482,
-   -7048,     1547,   -21890,    -6505,    -7414,     -424,   -11722,     7955,
-    1653,   -17299,     1823,      473,    -9232,     3337,     1111,      873,
-    4018,    -8982,     9889,     3531,   -11763,    -3799,     7373,    -4539,
-    3231,     7054,    -8537,     7616,     6244,    16635,      447,    -2915,
-   13967,      705,    -2669,    -1520,    -1771,   -16188,     5956,     5117,
-    6371,    -9936,    -1448,     2480,     5128,     7550,    -8130,     5236,
-    8213,    -6443,     7707,    -1950,   -13811,     7218,     7031,    -3883,
-      67,     5731,    -2874,    13480,    -3743,     9298,    -3280,     3552,
-   -4425,      -18,    -3785,    -9988,    -5357,     5477,   -11794,     2117,
-    1416,    -9935,     3376,      802,    -5079,    -8243,    12652,       66,
-    3653,    -2368,     6781,   -21895,    -7227,     2487,     7839,     -385,
-    6646,    -7016,    -4658,     5531,    -1705,      834,      129,     3694,
-   -1343,     2238,   -22640,    -6417,   -11139,    11301,    -2945,    -3494,
-   -5626,      185,    -3615,    -2041,    -7972,    -3106,      -60,   -23497,
-   -1566,    17064,     3519,     2518,      304,    -6805,   -10269,     2105,
-    1936,     -426,     -736,    -8122,    -1467,     4238,    -6939,   -13309,
-     360,     7402,    -7970,    12576,     3287,    12194,    -6289,   -16006,
-    9171,     4042,    -9193,     9123,    -2512,     6388,    -4734,    -8739,
-    1028,    -5406,    -1696,     5889,     -666,    -4736,     4971,     3565,
-    9362,    -6292,     3876,    -3652,   -19666,     7523,    -4061,      391,
-  -11773,     7502,    -3763,     4929,    -9478,    13278,     2805,     4496,
-    7814,    16419,    12455,   -14773,     2127,    -2746,     3763,     4847,
-    3698,     6978,     4751,    -6957,    -3581,      -45,     6252,     1513,
-   -4797,    -7925,    11270,    16188,    -2359,    -5269,     9376,   -10777,
-    7262,    20031,    -6515,    -2208,    -5353,     8085,    -1341,    -1303,
-    7333,     5576,     3625,     5763,    -7931,     9833,    -3371,   -10305,
-    6534,   -13539,    -9971,      997,     8464,    -4064,    -1495,     1857,
-   13624,     5458,     9490,   -11086,    -4524,    12022,     -550,     -198,
-     408,    -8455,    -7068,    10289,     9712,    -3366,     9028,    -7621,
-   -5243,     2362,     6909,     4672,    -4933,    -1799,     4709,    -4563,
-     -62,     -566,     1624,    -7010,    14730,   -17791,    -3697,    -2344,
-   -1741,     7099,    -9509,    -6855,    -1989,     3495,    -2289,     2031,
-   12784,      891,    14189,    -3963,    -5683,      421,   -12575,     1724,
-  -12682,    -5970,    -8169,     3143,    -1824,    -5488,    -5130,     8536,
-   12799,      794,     5738,     3459,   -11689,     -258,    -3738,    -3775,
-   -8742,     2333,     8312,    -9383,    10331,    13119,     8398,    10644,
-  -19433,    -6446,   -16277,   -11793,    16284,     9345,    15222,    15834,
-    2009,    -7349,      130,   -14547,      338,    -5998,     3337,    21492,
-    2406,     7703,     -951,    11196,     -564,     3406,     2217,     4806,
-    2374,    -5797,    11839,     8940,   -11874,    18213,     2855,    10492
-};
-
-static uint32_t IncreaseSeed(uint32_t* seed) {
-  seed[0] = (seed[0] * ((int32_t)69069) + 1) & (kMaxSeedUsed - 1);
-  return seed[0];
-}
-
-int16_t WebRtcSpl_RandU(uint32_t* seed) {
-  return (int16_t)(IncreaseSeed(seed) >> 16);
-}
-
-int16_t WebRtcSpl_RandN(uint32_t* seed) {
-  return kRandNTable[IncreaseSeed(seed) >> 23];
-}
-
-// Creates an array of uniformly distributed variables.
-int16_t WebRtcSpl_RandUArray(int16_t* vector,
-                             int16_t vector_length,
-                             uint32_t* seed) {
-  int i;
-  for (i = 0; i < vector_length; i++) {
-    vector[i] = WebRtcSpl_RandU(seed);
-  }
-  return vector_length;
-}
diff --git a/common_audio/signal_processing/real_fft.c b/common_audio/signal_processing/real_fft.c
deleted file mode 100644
index 92daae4..0000000
--- a/common_audio/signal_processing/real_fft.c
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- *  Copyright (c) 2012 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/common_audio/signal_processing/include/real_fft.h"
-
-#include <stdlib.h>
-
-#include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
-
-struct RealFFT {
-  int order;
-};
-
-struct RealFFT* WebRtcSpl_CreateRealFFT(int order) {
-  struct RealFFT* self = NULL;
-
-  if (order > kMaxFFTOrder || order < 0) {
-    return NULL;
-  }
-
-  self = malloc(sizeof(struct RealFFT));
-  if (self == NULL) {
-    return NULL;
-  }
-  self->order = order;
-
-  return self;
-}
-
-void WebRtcSpl_FreeRealFFT(struct RealFFT* self) {
-  if (self != NULL) {
-    free(self);
-  }
-}
-
-// The C version FFT functions (i.e. WebRtcSpl_RealForwardFFT and
-// WebRtcSpl_RealInverseFFT) are real-valued FFT wrappers for complex-valued
-// FFT implementation in SPL.
-
-int WebRtcSpl_RealForwardFFT(struct RealFFT* self,
-                             const int16_t* real_data_in,
-                             int16_t* complex_data_out) {
-  int i = 0;
-  int j = 0;
-  int result = 0;
-  int n = 1 << self->order;
-  // The complex-value FFT implementation needs a buffer to hold 2^order
-  // 16-bit COMPLEX numbers, for both time and frequency data.
-  int16_t complex_buffer[2 << kMaxFFTOrder];
-
-  // Insert zeros to the imaginary parts for complex forward FFT input.
-  for (i = 0, j = 0; i < n; i += 1, j += 2) {
-    complex_buffer[j] = real_data_in[i];
-    complex_buffer[j + 1] = 0;
-  };
-
-  WebRtcSpl_ComplexBitReverse(complex_buffer, self->order);
-  result = WebRtcSpl_ComplexFFT(complex_buffer, self->order, 1);
-
-  // For real FFT output, use only the first N + 2 elements from
-  // complex forward FFT.
-  memcpy(complex_data_out, complex_buffer, sizeof(int16_t) * (n + 2));
-
-  return result;
-}
-
-int WebRtcSpl_RealInverseFFT(struct RealFFT* self,
-                             const int16_t* complex_data_in,
-                             int16_t* real_data_out) {
-  int i = 0;
-  int j = 0;
-  int result = 0;
-  int n = 1 << self->order;
-  // Create the buffer specific to complex-valued FFT implementation.
-  int16_t complex_buffer[2 << kMaxFFTOrder];
-
-  // For n-point FFT, first copy the first n + 2 elements into complex
-  // FFT, then construct the remaining n - 2 elements by real FFT's
-  // conjugate-symmetric properties.
-  memcpy(complex_buffer, complex_data_in, sizeof(int16_t) * (n + 2));
-  for (i = n + 2; i < 2 * n; i += 2) {
-    complex_buffer[i] = complex_data_in[2 * n - i];
-    complex_buffer[i + 1] = -complex_data_in[2 * n - i + 1];
-  }
-
-  WebRtcSpl_ComplexBitReverse(complex_buffer, self->order);
-  result = WebRtcSpl_ComplexIFFT(complex_buffer, self->order, 1);
-
-  // Strip out the imaginary parts of the complex inverse FFT output.
-  for (i = 0, j = 0; i < n; i += 1, j += 2) {
-    real_data_out[i] = complex_buffer[j];
-  }
-
-  return result;
-}
diff --git a/common_audio/signal_processing/real_fft_unittest.cc b/common_audio/signal_processing/real_fft_unittest.cc
deleted file mode 100644
index fcf11d7..0000000
--- a/common_audio/signal_processing/real_fft_unittest.cc
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- *  Copyright (c) 2012 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/common_audio/signal_processing/include/real_fft.h"
-#include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-namespace {
-
-// FFT order.
-const int kOrder = 5;
-// Lengths for real FFT's time and frequency bufffers.
-// For N-point FFT, the length requirements from API are N and N+2 respectively.
-const int kTimeDataLength = 1 << kOrder;
-const int kFreqDataLength = (1 << kOrder) + 2;
-// For complex FFT's time and freq buffer. The implementation requires
-// 2*N 16-bit words.
-const int kComplexFftDataLength = 2 << kOrder;
-// Reference data for time signal.
-const int16_t kRefData[kTimeDataLength] = {
-  11739, 6848, -8688, 31980, -30295, 25242, 27085, 19410,
-  -26299, 15607, -10791, 11778, -23819, 14498, -25772, 10076,
-  1173, 6848, -8688, 31980, -30295, 2522, 27085, 19410,
-  -2629, 5607, -3, 1178, -23819, 1498, -25772, 10076
-};
-
-class RealFFTTest : public ::testing::Test {
- protected:
-  RealFFTTest() {
-    WebRtcSpl_Init();
-  }
-};
-
-TEST_F(RealFFTTest, CreateFailsOnBadInput) {
-  RealFFT* fft = WebRtcSpl_CreateRealFFT(11);
-  EXPECT_TRUE(fft == nullptr);
-  fft = WebRtcSpl_CreateRealFFT(-1);
-  EXPECT_TRUE(fft == nullptr);
-}
-
-TEST_F(RealFFTTest, RealAndComplexMatch) {
-  int i = 0;
-  int j = 0;
-  int16_t real_fft_time[kTimeDataLength] = {0};
-  int16_t real_fft_freq[kFreqDataLength] = {0};
-  // One common buffer for complex FFT's time and frequency data.
-  int16_t complex_fft_buff[kComplexFftDataLength] = {0};
-
-  // Prepare the inputs to forward FFT's.
-  memcpy(real_fft_time, kRefData, sizeof(kRefData));
-  for (i = 0, j = 0; i < kTimeDataLength; i += 1, j += 2) {
-    complex_fft_buff[j] = kRefData[i];
-    complex_fft_buff[j + 1] = 0;  // Insert zero's to imaginary parts.
-  }
-
-  // Create and run real forward FFT.
-  RealFFT* fft = WebRtcSpl_CreateRealFFT(kOrder);
-  EXPECT_TRUE(fft != nullptr);
-  EXPECT_EQ(0, WebRtcSpl_RealForwardFFT(fft, real_fft_time, real_fft_freq));
-
-  // Run complex forward FFT.
-  WebRtcSpl_ComplexBitReverse(complex_fft_buff, kOrder);
-  EXPECT_EQ(0, WebRtcSpl_ComplexFFT(complex_fft_buff, kOrder, 1));
-
-  // Verify the results between complex and real forward FFT.
-  for (i = 0; i < kFreqDataLength; i++) {
-    EXPECT_EQ(real_fft_freq[i], complex_fft_buff[i]);
-  }
-
-  // Prepare the inputs to inverse real FFT.
-  // We use whatever data in complex_fft_buff[] since we don't care
-  // about data contents. Only kFreqDataLength 16-bit words are copied
-  // from complex_fft_buff to real_fft_freq since remaining words (2nd half)
-  // are conjugate-symmetric to the first half in theory.
-  memcpy(real_fft_freq, complex_fft_buff, sizeof(real_fft_freq));
-
-  // Run real inverse FFT.
-  int real_scale = WebRtcSpl_RealInverseFFT(fft, real_fft_freq, real_fft_time);
-  EXPECT_GE(real_scale, 0);
-
-  // Run complex inverse FFT.
-  WebRtcSpl_ComplexBitReverse(complex_fft_buff, kOrder);
-  int complex_scale = WebRtcSpl_ComplexIFFT(complex_fft_buff, kOrder, 1);
-
-  // Verify the results between complex and real inverse FFT.
-  // They are not bit-exact, since complex IFFT doesn't produce
-  // exactly conjugate-symmetric data (between first and second half).
-  EXPECT_EQ(real_scale, complex_scale);
-  for (i = 0, j = 0; i < kTimeDataLength; i += 1, j += 2) {
-    EXPECT_LE(abs(real_fft_time[i] - complex_fft_buff[j]), 1);
-  }
-
-  WebRtcSpl_FreeRealFFT(fft);
-}
-
-}  // namespace
-}  // namespace webrtc
diff --git a/common_audio/signal_processing/refl_coef_to_lpc.c b/common_audio/signal_processing/refl_coef_to_lpc.c
deleted file mode 100644
index 06a29b6..0000000
--- a/common_audio/signal_processing/refl_coef_to_lpc.c
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-
-/*
- * This file contains the function WebRtcSpl_ReflCoefToLpc().
- * The description header can be found in signal_processing_library.h
- *
- */
-
-#include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
-
-void WebRtcSpl_ReflCoefToLpc(const int16_t *k, int use_order, int16_t *a)
-{
-    int16_t any[WEBRTC_SPL_MAX_LPC_ORDER + 1];
-    int16_t *aptr, *aptr2, *anyptr;
-    const int16_t *kptr;
-    int m, i;
-
-    kptr = k;
-    *a = 4096; // i.e., (Word16_MAX >> 3)+1.
-    *any = *a;
-    a[1] = *k >> 3;
-
-    for (m = 1; m < use_order; m++)
-    {
-        kptr++;
-        aptr = a;
-        aptr++;
-        aptr2 = &a[m];
-        anyptr = any;
-        anyptr++;
-
-        any[m + 1] = *kptr >> 3;
-        for (i = 0; i < m; i++)
-        {
-            *anyptr = *aptr + (int16_t)((*aptr2 * *kptr) >> 15);
-            anyptr++;
-            aptr++;
-            aptr2--;
-        }
-
-        aptr = a;
-        anyptr = any;
-        for (i = 0; i < (m + 2); i++)
-        {
-            *aptr = *anyptr;
-            aptr++;
-            anyptr++;
-        }
-    }
-}
diff --git a/common_audio/signal_processing/resample.c b/common_audio/signal_processing/resample.c
deleted file mode 100644
index 45fe52a..0000000
--- a/common_audio/signal_processing/resample.c
+++ /dev/null
@@ -1,505 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-
-/*
- * This file contains the resampling functions for 22 kHz.
- * The description header can be found in signal_processing_library.h
- *
- */
-
-#include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
-#include "webrtc/common_audio/signal_processing/resample_by_2_internal.h"
-
-// Declaration of internally used functions
-static void WebRtcSpl_32khzTo22khzIntToShort(const int32_t *In, int16_t *Out,
-                                             int32_t K);
-
-void WebRtcSpl_32khzTo22khzIntToInt(const int32_t *In, int32_t *Out,
-                                    int32_t K);
-
-// interpolation coefficients
-static const int16_t kCoefficients32To22[5][9] = {
-        {127, -712,  2359, -6333, 23456, 16775, -3695,  945, -154},
-        {-39,  230,  -830,  2785, 32366, -2324,   760, -218,   38},
-        {117, -663,  2222, -6133, 26634, 13070, -3174,  831, -137},
-        {-77,  457, -1677,  5958, 31175, -4136,  1405, -408,   71},
-        { 98, -560,  1900, -5406, 29240,  9423, -2480,  663, -110}
-};
-
-//////////////////////
-// 22 kHz -> 16 kHz //
-//////////////////////
-
-// number of subblocks; options: 1, 2, 4, 5, 10
-#define SUB_BLOCKS_22_16    5
-
-// 22 -> 16 resampler
-void WebRtcSpl_Resample22khzTo16khz(const int16_t* in, int16_t* out,
-                                    WebRtcSpl_State22khzTo16khz* state, int32_t* tmpmem)
-{
-    int k;
-
-    // process two blocks of 10/SUB_BLOCKS_22_16 ms (to reduce temp buffer size)
-    for (k = 0; k < SUB_BLOCKS_22_16; k++)
-    {
-        ///// 22 --> 44 /////
-        // int16_t  in[220/SUB_BLOCKS_22_16]
-        // int32_t out[440/SUB_BLOCKS_22_16]
-        /////
-        WebRtcSpl_UpBy2ShortToInt(in, 220 / SUB_BLOCKS_22_16, tmpmem + 16, state->S_22_44);
-
-        ///// 44 --> 32 /////
-        // int32_t  in[440/SUB_BLOCKS_22_16]
-        // int32_t out[320/SUB_BLOCKS_22_16]
-        /////
-        // copy state to and from input array
-        tmpmem[8] = state->S_44_32[0];
-        tmpmem[9] = state->S_44_32[1];
-        tmpmem[10] = state->S_44_32[2];
-        tmpmem[11] = state->S_44_32[3];
-        tmpmem[12] = state->S_44_32[4];
-        tmpmem[13] = state->S_44_32[5];
-        tmpmem[14] = state->S_44_32[6];
-        tmpmem[15] = state->S_44_32[7];
-        state->S_44_32[0] = tmpmem[440 / SUB_BLOCKS_22_16 + 8];
-        state->S_44_32[1] = tmpmem[440 / SUB_BLOCKS_22_16 + 9];
-        state->S_44_32[2] = tmpmem[440 / SUB_BLOCKS_22_16 + 10];
-        state->S_44_32[3] = tmpmem[440 / SUB_BLOCKS_22_16 + 11];
-        state->S_44_32[4] = tmpmem[440 / SUB_BLOCKS_22_16 + 12];
-        state->S_44_32[5] = tmpmem[440 / SUB_BLOCKS_22_16 + 13];
-        state->S_44_32[6] = tmpmem[440 / SUB_BLOCKS_22_16 + 14];
-        state->S_44_32[7] = tmpmem[440 / SUB_BLOCKS_22_16 + 15];
-
-        WebRtcSpl_Resample44khzTo32khz(tmpmem + 8, tmpmem, 40 / SUB_BLOCKS_22_16);
-
-        ///// 32 --> 16 /////
-        // int32_t  in[320/SUB_BLOCKS_22_16]
-        // int32_t out[160/SUB_BLOCKS_22_16]
-        /////
-        WebRtcSpl_DownBy2IntToShort(tmpmem, 320 / SUB_BLOCKS_22_16, out, state->S_32_16);
-
-        // move input/output pointers 10/SUB_BLOCKS_22_16 ms seconds ahead
-        in += 220 / SUB_BLOCKS_22_16;
-        out += 160 / SUB_BLOCKS_22_16;
-    }
-}
-
-// initialize state of 22 -> 16 resampler
-void WebRtcSpl_ResetResample22khzTo16khz(WebRtcSpl_State22khzTo16khz* state)
-{
-    int k;
-    for (k = 0; k < 8; k++)
-    {
-        state->S_22_44[k] = 0;
-        state->S_44_32[k] = 0;
-        state->S_32_16[k] = 0;
-    }
-}
-
-//////////////////////
-// 16 kHz -> 22 kHz //
-//////////////////////
-
-// number of subblocks; options: 1, 2, 4, 5, 10
-#define SUB_BLOCKS_16_22    4
-
-// 16 -> 22 resampler
-void WebRtcSpl_Resample16khzTo22khz(const int16_t* in, int16_t* out,
-                                    WebRtcSpl_State16khzTo22khz* state, int32_t* tmpmem)
-{
-    int k;
-
-    // process two blocks of 10/SUB_BLOCKS_16_22 ms (to reduce temp buffer size)
-    for (k = 0; k < SUB_BLOCKS_16_22; k++)
-    {
-        ///// 16 --> 32 /////
-        // int16_t  in[160/SUB_BLOCKS_16_22]
-        // int32_t out[320/SUB_BLOCKS_16_22]
-        /////
-        WebRtcSpl_UpBy2ShortToInt(in, 160 / SUB_BLOCKS_16_22, tmpmem + 8, state->S_16_32);
-
-        ///// 32 --> 22 /////
-        // int32_t  in[320/SUB_BLOCKS_16_22]
-        // int32_t out[220/SUB_BLOCKS_16_22]
-        /////
-        // copy state to and from input array
-        tmpmem[0] = state->S_32_22[0];
-        tmpmem[1] = state->S_32_22[1];
-        tmpmem[2] = state->S_32_22[2];
-        tmpmem[3] = state->S_32_22[3];
-        tmpmem[4] = state->S_32_22[4];
-        tmpmem[5] = state->S_32_22[5];
-        tmpmem[6] = state->S_32_22[6];
-        tmpmem[7] = state->S_32_22[7];
-        state->S_32_22[0] = tmpmem[320 / SUB_BLOCKS_16_22];
-        state->S_32_22[1] = tmpmem[320 / SUB_BLOCKS_16_22 + 1];
-        state->S_32_22[2] = tmpmem[320 / SUB_BLOCKS_16_22 + 2];
-        state->S_32_22[3] = tmpmem[320 / SUB_BLOCKS_16_22 + 3];
-        state->S_32_22[4] = tmpmem[320 / SUB_BLOCKS_16_22 + 4];
-        state->S_32_22[5] = tmpmem[320 / SUB_BLOCKS_16_22 + 5];
-        state->S_32_22[6] = tmpmem[320 / SUB_BLOCKS_16_22 + 6];
-        state->S_32_22[7] = tmpmem[320 / SUB_BLOCKS_16_22 + 7];
-
-        WebRtcSpl_32khzTo22khzIntToShort(tmpmem, out, 20 / SUB_BLOCKS_16_22);
-
-        // move input/output pointers 10/SUB_BLOCKS_16_22 ms seconds ahead
-        in += 160 / SUB_BLOCKS_16_22;
-        out += 220 / SUB_BLOCKS_16_22;
-    }
-}
-
-// initialize state of 16 -> 22 resampler
-void WebRtcSpl_ResetResample16khzTo22khz(WebRtcSpl_State16khzTo22khz* state)
-{
-    int k;
-    for (k = 0; k < 8; k++)
-    {
-        state->S_16_32[k] = 0;
-        state->S_32_22[k] = 0;
-    }
-}
-
-//////////////////////
-// 22 kHz ->  8 kHz //
-//////////////////////
-
-// number of subblocks; options: 1, 2, 5, 10
-#define SUB_BLOCKS_22_8     2
-
-// 22 -> 8 resampler
-void WebRtcSpl_Resample22khzTo8khz(const int16_t* in, int16_t* out,
-                                   WebRtcSpl_State22khzTo8khz* state, int32_t* tmpmem)
-{
-    int k;
-
-    // process two blocks of 10/SUB_BLOCKS_22_8 ms (to reduce temp buffer size)
-    for (k = 0; k < SUB_BLOCKS_22_8; k++)
-    {
-        ///// 22 --> 22 lowpass /////
-        // int16_t  in[220/SUB_BLOCKS_22_8]
-        // int32_t out[220/SUB_BLOCKS_22_8]
-        /////
-        WebRtcSpl_LPBy2ShortToInt(in, 220 / SUB_BLOCKS_22_8, tmpmem + 16, state->S_22_22);
-
-        ///// 22 --> 16 /////
-        // int32_t  in[220/SUB_BLOCKS_22_8]
-        // int32_t out[160/SUB_BLOCKS_22_8]
-        /////
-        // copy state to and from input array
-        tmpmem[8] = state->S_22_16[0];
-        tmpmem[9] = state->S_22_16[1];
-        tmpmem[10] = state->S_22_16[2];
-        tmpmem[11] = state->S_22_16[3];
-        tmpmem[12] = state->S_22_16[4];
-        tmpmem[13] = state->S_22_16[5];
-        tmpmem[14] = state->S_22_16[6];
-        tmpmem[15] = state->S_22_16[7];
-        state->S_22_16[0] = tmpmem[220 / SUB_BLOCKS_22_8 + 8];
-        state->S_22_16[1] = tmpmem[220 / SUB_BLOCKS_22_8 + 9];
-        state->S_22_16[2] = tmpmem[220 / SUB_BLOCKS_22_8 + 10];
-        state->S_22_16[3] = tmpmem[220 / SUB_BLOCKS_22_8 + 11];
-        state->S_22_16[4] = tmpmem[220 / SUB_BLOCKS_22_8 + 12];
-        state->S_22_16[5] = tmpmem[220 / SUB_BLOCKS_22_8 + 13];
-        state->S_22_16[6] = tmpmem[220 / SUB_BLOCKS_22_8 + 14];
-        state->S_22_16[7] = tmpmem[220 / SUB_BLOCKS_22_8 + 15];
-
-        WebRtcSpl_Resample44khzTo32khz(tmpmem + 8, tmpmem, 20 / SUB_BLOCKS_22_8);
-
-        ///// 16 --> 8 /////
-        // int32_t in[160/SUB_BLOCKS_22_8]
-        // int32_t out[80/SUB_BLOCKS_22_8]
-        /////
-        WebRtcSpl_DownBy2IntToShort(tmpmem, 160 / SUB_BLOCKS_22_8, out, state->S_16_8);
-
-        // move input/output pointers 10/SUB_BLOCKS_22_8 ms seconds ahead
-        in += 220 / SUB_BLOCKS_22_8;
-        out += 80 / SUB_BLOCKS_22_8;
-    }
-}
-
-// initialize state of 22 -> 8 resampler
-void WebRtcSpl_ResetResample22khzTo8khz(WebRtcSpl_State22khzTo8khz* state)
-{
-    int k;
-    for (k = 0; k < 8; k++)
-    {
-        state->S_22_22[k] = 0;
-        state->S_22_22[k + 8] = 0;
-        state->S_22_16[k] = 0;
-        state->S_16_8[k] = 0;
-    }
-}
-
-//////////////////////
-//  8 kHz -> 22 kHz //
-//////////////////////
-
-// number of subblocks; options: 1, 2, 5, 10
-#define SUB_BLOCKS_8_22     2
-
-// 8 -> 22 resampler
-void WebRtcSpl_Resample8khzTo22khz(const int16_t* in, int16_t* out,
-                                   WebRtcSpl_State8khzTo22khz* state, int32_t* tmpmem)
-{
-    int k;
-
-    // process two blocks of 10/SUB_BLOCKS_8_22 ms (to reduce temp buffer size)
-    for (k = 0; k < SUB_BLOCKS_8_22; k++)
-    {
-        ///// 8 --> 16 /////
-        // int16_t  in[80/SUB_BLOCKS_8_22]
-        // int32_t out[160/SUB_BLOCKS_8_22]
-        /////
-        WebRtcSpl_UpBy2ShortToInt(in, 80 / SUB_BLOCKS_8_22, tmpmem + 18, state->S_8_16);
-
-        ///// 16 --> 11 /////
-        // int32_t  in[160/SUB_BLOCKS_8_22]
-        // int32_t out[110/SUB_BLOCKS_8_22]
-        /////
-        // copy state to and from input array
-        tmpmem[10] = state->S_16_11[0];
-        tmpmem[11] = state->S_16_11[1];
-        tmpmem[12] = state->S_16_11[2];
-        tmpmem[13] = state->S_16_11[3];
-        tmpmem[14] = state->S_16_11[4];
-        tmpmem[15] = state->S_16_11[5];
-        tmpmem[16] = state->S_16_11[6];
-        tmpmem[17] = state->S_16_11[7];
-        state->S_16_11[0] = tmpmem[160 / SUB_BLOCKS_8_22 + 10];
-        state->S_16_11[1] = tmpmem[160 / SUB_BLOCKS_8_22 + 11];
-        state->S_16_11[2] = tmpmem[160 / SUB_BLOCKS_8_22 + 12];
-        state->S_16_11[3] = tmpmem[160 / SUB_BLOCKS_8_22 + 13];
-        state->S_16_11[4] = tmpmem[160 / SUB_BLOCKS_8_22 + 14];
-        state->S_16_11[5] = tmpmem[160 / SUB_BLOCKS_8_22 + 15];
-        state->S_16_11[6] = tmpmem[160 / SUB_BLOCKS_8_22 + 16];
-        state->S_16_11[7] = tmpmem[160 / SUB_BLOCKS_8_22 + 17];
-
-        WebRtcSpl_32khzTo22khzIntToInt(tmpmem + 10, tmpmem, 10 / SUB_BLOCKS_8_22);
-
-        ///// 11 --> 22 /////
-        // int32_t  in[110/SUB_BLOCKS_8_22]
-        // int16_t out[220/SUB_BLOCKS_8_22]
-        /////
-        WebRtcSpl_UpBy2IntToShort(tmpmem, 110 / SUB_BLOCKS_8_22, out, state->S_11_22);
-
-        // move input/output pointers 10/SUB_BLOCKS_8_22 ms seconds ahead
-        in += 80 / SUB_BLOCKS_8_22;
-        out += 220 / SUB_BLOCKS_8_22;
-    }
-}
-
-// initialize state of 8 -> 22 resampler
-void WebRtcSpl_ResetResample8khzTo22khz(WebRtcSpl_State8khzTo22khz* state)
-{
-    int k;
-    for (k = 0; k < 8; k++)
-    {
-        state->S_8_16[k] = 0;
-        state->S_16_11[k] = 0;
-        state->S_11_22[k] = 0;
-    }
-}
-
-// compute two inner-products and store them to output array
-static void WebRtcSpl_DotProdIntToInt(const int32_t* in1, const int32_t* in2,
-                                      const int16_t* coef_ptr, int32_t* out1,
-                                      int32_t* out2)
-{
-    int32_t tmp1 = 16384;
-    int32_t tmp2 = 16384;
-    int16_t coef;
-
-    coef = coef_ptr[0];
-    tmp1 += coef * in1[0];
-    tmp2 += coef * in2[-0];
-
-    coef = coef_ptr[1];
-    tmp1 += coef * in1[1];
-    tmp2 += coef * in2[-1];
-
-    coef = coef_ptr[2];
-    tmp1 += coef * in1[2];
-    tmp2 += coef * in2[-2];
-
-    coef = coef_ptr[3];
-    tmp1 += coef * in1[3];
-    tmp2 += coef * in2[-3];
-
-    coef = coef_ptr[4];
-    tmp1 += coef * in1[4];
-    tmp2 += coef * in2[-4];
-
-    coef = coef_ptr[5];
-    tmp1 += coef * in1[5];
-    tmp2 += coef * in2[-5];
-
-    coef = coef_ptr[6];
-    tmp1 += coef * in1[6];
-    tmp2 += coef * in2[-6];
-
-    coef = coef_ptr[7];
-    tmp1 += coef * in1[7];
-    tmp2 += coef * in2[-7];
-
-    coef = coef_ptr[8];
-    *out1 = tmp1 + coef * in1[8];
-    *out2 = tmp2 + coef * in2[-8];
-}
-
-// compute two inner-products and store them to output array
-static void WebRtcSpl_DotProdIntToShort(const int32_t* in1, const int32_t* in2,
-                                        const int16_t* coef_ptr, int16_t* out1,
-                                        int16_t* out2)
-{
-    int32_t tmp1 = 16384;
-    int32_t tmp2 = 16384;
-    int16_t coef;
-
-    coef = coef_ptr[0];
-    tmp1 += coef * in1[0];
-    tmp2 += coef * in2[-0];
-
-    coef = coef_ptr[1];
-    tmp1 += coef * in1[1];
-    tmp2 += coef * in2[-1];
-
-    coef = coef_ptr[2];
-    tmp1 += coef * in1[2];
-    tmp2 += coef * in2[-2];
-
-    coef = coef_ptr[3];
-    tmp1 += coef * in1[3];
-    tmp2 += coef * in2[-3];
-
-    coef = coef_ptr[4];
-    tmp1 += coef * in1[4];
-    tmp2 += coef * in2[-4];
-
-    coef = coef_ptr[5];
-    tmp1 += coef * in1[5];
-    tmp2 += coef * in2[-5];
-
-    coef = coef_ptr[6];
-    tmp1 += coef * in1[6];
-    tmp2 += coef * in2[-6];
-
-    coef = coef_ptr[7];
-    tmp1 += coef * in1[7];
-    tmp2 += coef * in2[-7];
-
-    coef = coef_ptr[8];
-    tmp1 += coef * in1[8];
-    tmp2 += coef * in2[-8];
-
-    // scale down, round and saturate
-    tmp1 >>= 15;
-    if (tmp1 > (int32_t)0x00007FFF)
-        tmp1 = 0x00007FFF;
-    if (tmp1 < (int32_t)0xFFFF8000)
-        tmp1 = 0xFFFF8000;
-    tmp2 >>= 15;
-    if (tmp2 > (int32_t)0x00007FFF)
-        tmp2 = 0x00007FFF;
-    if (tmp2 < (int32_t)0xFFFF8000)
-        tmp2 = 0xFFFF8000;
-    *out1 = (int16_t)tmp1;
-    *out2 = (int16_t)tmp2;
-}
-
-//   Resampling ratio: 11/16
-// input:  int32_t (normalized, not saturated) :: size 16 * K
-// output: int32_t (shifted 15 positions to the left, + offset 16384) :: size 11 * K
-//      K: Number of blocks
-
-void WebRtcSpl_32khzTo22khzIntToInt(const int32_t* In,
-                                    int32_t* Out,
-                                    int32_t K)
-{
-    /////////////////////////////////////////////////////////////
-    // Filter operation:
-    //
-    // Perform resampling (16 input samples -> 11 output samples);
-    // process in sub blocks of size 16 samples.
-    int32_t m;
-
-    for (m = 0; m < K; m++)
-    {
-        // first output sample
-        Out[0] = ((int32_t)In[3] << 15) + (1 << 14);
-
-        // sum and accumulate filter coefficients and input samples
-        WebRtcSpl_DotProdIntToInt(&In[0], &In[22], kCoefficients32To22[0], &Out[1], &Out[10]);
-
-        // sum and accumulate filter coefficients and input samples
-        WebRtcSpl_DotProdIntToInt(&In[2], &In[20], kCoefficients32To22[1], &Out[2], &Out[9]);
-
-        // sum and accumulate filter coefficients and input samples
-        WebRtcSpl_DotProdIntToInt(&In[3], &In[19], kCoefficients32To22[2], &Out[3], &Out[8]);
-
-        // sum and accumulate filter coefficients and input samples
-        WebRtcSpl_DotProdIntToInt(&In[5], &In[17], kCoefficients32To22[3], &Out[4], &Out[7]);
-
-        // sum and accumulate filter coefficients and input samples
-        WebRtcSpl_DotProdIntToInt(&In[6], &In[16], kCoefficients32To22[4], &Out[5], &Out[6]);
-
-        // update pointers
-        In += 16;
-        Out += 11;
-    }
-}
-
-//   Resampling ratio: 11/16
-// input:  int32_t (normalized, not saturated) :: size 16 * K
-// output: int16_t (saturated) :: size 11 * K
-//      K: Number of blocks
-
-void WebRtcSpl_32khzTo22khzIntToShort(const int32_t *In,
-                                      int16_t *Out,
-                                      int32_t K)
-{
-    /////////////////////////////////////////////////////////////
-    // Filter operation:
-    //
-    // Perform resampling (16 input samples -> 11 output samples);
-    // process in sub blocks of size 16 samples.
-    int32_t tmp;
-    int32_t m;
-
-    for (m = 0; m < K; m++)
-    {
-        // first output sample
-        tmp = In[3];
-        if (tmp > (int32_t)0x00007FFF)
-            tmp = 0x00007FFF;
-        if (tmp < (int32_t)0xFFFF8000)
-            tmp = 0xFFFF8000;
-        Out[0] = (int16_t)tmp;
-
-        // sum and accumulate filter coefficients and input samples
-        WebRtcSpl_DotProdIntToShort(&In[0], &In[22], kCoefficients32To22[0], &Out[1], &Out[10]);
-
-        // sum and accumulate filter coefficients and input samples
-        WebRtcSpl_DotProdIntToShort(&In[2], &In[20], kCoefficients32To22[1], &Out[2], &Out[9]);
-
-        // sum and accumulate filter coefficients and input samples
-        WebRtcSpl_DotProdIntToShort(&In[3], &In[19], kCoefficients32To22[2], &Out[3], &Out[8]);
-
-        // sum and accumulate filter coefficients and input samples
-        WebRtcSpl_DotProdIntToShort(&In[5], &In[17], kCoefficients32To22[3], &Out[4], &Out[7]);
-
-        // sum and accumulate filter coefficients and input samples
-        WebRtcSpl_DotProdIntToShort(&In[6], &In[16], kCoefficients32To22[4], &Out[5], &Out[6]);
-
-        // update pointers
-        In += 16;
-        Out += 11;
-    }
-}
diff --git a/common_audio/signal_processing/resample_48khz.c b/common_audio/signal_processing/resample_48khz.c
deleted file mode 100644
index 2220cc3..0000000
--- a/common_audio/signal_processing/resample_48khz.c
+++ /dev/null
@@ -1,186 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-
-/*
- * This file contains resampling functions between 48 kHz and nb/wb.
- * The description header can be found in signal_processing_library.h
- *
- */
-
-#include <string.h>
-#include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
-#include "webrtc/common_audio/signal_processing/resample_by_2_internal.h"
-
-////////////////////////////
-///// 48 kHz -> 16 kHz /////
-////////////////////////////
-
-// 48 -> 16 resampler
-void WebRtcSpl_Resample48khzTo16khz(const int16_t* in, int16_t* out,
-                                    WebRtcSpl_State48khzTo16khz* state, int32_t* tmpmem)
-{
-    ///// 48 --> 48(LP) /////
-    // int16_t  in[480]
-    // int32_t out[480]
-    /////
-    WebRtcSpl_LPBy2ShortToInt(in, 480, tmpmem + 16, state->S_48_48);
-
-    ///// 48 --> 32 /////
-    // int32_t  in[480]
-    // int32_t out[320]
-    /////
-    // copy state to and from input array
-    memcpy(tmpmem + 8, state->S_48_32, 8 * sizeof(int32_t));
-    memcpy(state->S_48_32, tmpmem + 488, 8 * sizeof(int32_t));
-    WebRtcSpl_Resample48khzTo32khz(tmpmem + 8, tmpmem, 160);
-
-    ///// 32 --> 16 /////
-    // int32_t  in[320]
-    // int16_t out[160]
-    /////
-    WebRtcSpl_DownBy2IntToShort(tmpmem, 320, out, state->S_32_16);
-}
-
-// initialize state of 48 -> 16 resampler
-void WebRtcSpl_ResetResample48khzTo16khz(WebRtcSpl_State48khzTo16khz* state)
-{
-    memset(state->S_48_48, 0, 16 * sizeof(int32_t));
-    memset(state->S_48_32, 0, 8 * sizeof(int32_t));
-    memset(state->S_32_16, 0, 8 * sizeof(int32_t));
-}
-
-////////////////////////////
-///// 16 kHz -> 48 kHz /////
-////////////////////////////
-
-// 16 -> 48 resampler
-void WebRtcSpl_Resample16khzTo48khz(const int16_t* in, int16_t* out,
-                                    WebRtcSpl_State16khzTo48khz* state, int32_t* tmpmem)
-{
-    ///// 16 --> 32 /////
-    // int16_t  in[160]
-    // int32_t out[320]
-    /////
-    WebRtcSpl_UpBy2ShortToInt(in, 160, tmpmem + 16, state->S_16_32);
-
-    ///// 32 --> 24 /////
-    // int32_t  in[320]
-    // int32_t out[240]
-    // copy state to and from input array
-    /////
-    memcpy(tmpmem + 8, state->S_32_24, 8 * sizeof(int32_t));
-    memcpy(state->S_32_24, tmpmem + 328, 8 * sizeof(int32_t));
-    WebRtcSpl_Resample32khzTo24khz(tmpmem + 8, tmpmem, 80);
-
-    ///// 24 --> 48 /////
-    // int32_t  in[240]
-    // int16_t out[480]
-    /////
-    WebRtcSpl_UpBy2IntToShort(tmpmem, 240, out, state->S_24_48);
-}
-
-// initialize state of 16 -> 48 resampler
-void WebRtcSpl_ResetResample16khzTo48khz(WebRtcSpl_State16khzTo48khz* state)
-{
-    memset(state->S_16_32, 0, 8 * sizeof(int32_t));
-    memset(state->S_32_24, 0, 8 * sizeof(int32_t));
-    memset(state->S_24_48, 0, 8 * sizeof(int32_t));
-}
-
-////////////////////////////
-///// 48 kHz ->  8 kHz /////
-////////////////////////////
-
-// 48 -> 8 resampler
-void WebRtcSpl_Resample48khzTo8khz(const int16_t* in, int16_t* out,
-                                   WebRtcSpl_State48khzTo8khz* state, int32_t* tmpmem)
-{
-    ///// 48 --> 24 /////
-    // int16_t  in[480]
-    // int32_t out[240]
-    /////
-    WebRtcSpl_DownBy2ShortToInt(in, 480, tmpmem + 256, state->S_48_24);
-
-    ///// 24 --> 24(LP) /////
-    // int32_t  in[240]
-    // int32_t out[240]
-    /////
-    WebRtcSpl_LPBy2IntToInt(tmpmem + 256, 240, tmpmem + 16, state->S_24_24);
-
-    ///// 24 --> 16 /////
-    // int32_t  in[240]
-    // int32_t out[160]
-    /////
-    // copy state to and from input array
-    memcpy(tmpmem + 8, state->S_24_16, 8 * sizeof(int32_t));
-    memcpy(state->S_24_16, tmpmem + 248, 8 * sizeof(int32_t));
-    WebRtcSpl_Resample48khzTo32khz(tmpmem + 8, tmpmem, 80);
-
-    ///// 16 --> 8 /////
-    // int32_t  in[160]
-    // int16_t out[80]
-    /////
-    WebRtcSpl_DownBy2IntToShort(tmpmem, 160, out, state->S_16_8);
-}
-
-// initialize state of 48 -> 8 resampler
-void WebRtcSpl_ResetResample48khzTo8khz(WebRtcSpl_State48khzTo8khz* state)
-{
-    memset(state->S_48_24, 0, 8 * sizeof(int32_t));
-    memset(state->S_24_24, 0, 16 * sizeof(int32_t));
-    memset(state->S_24_16, 0, 8 * sizeof(int32_t));
-    memset(state->S_16_8, 0, 8 * sizeof(int32_t));
-}
-
-////////////////////////////
-/////  8 kHz -> 48 kHz /////
-////////////////////////////
-
-// 8 -> 48 resampler
-void WebRtcSpl_Resample8khzTo48khz(const int16_t* in, int16_t* out,
-                                   WebRtcSpl_State8khzTo48khz* state, int32_t* tmpmem)
-{
-    ///// 8 --> 16 /////
-    // int16_t  in[80]
-    // int32_t out[160]
-    /////
-    WebRtcSpl_UpBy2ShortToInt(in, 80, tmpmem + 264, state->S_8_16);
-
-    ///// 16 --> 12 /////
-    // int32_t  in[160]
-    // int32_t out[120]
-    /////
-    // copy state to and from input array
-    memcpy(tmpmem + 256, state->S_16_12, 8 * sizeof(int32_t));
-    memcpy(state->S_16_12, tmpmem + 416, 8 * sizeof(int32_t));
-    WebRtcSpl_Resample32khzTo24khz(tmpmem + 256, tmpmem + 240, 40);
-
-    ///// 12 --> 24 /////
-    // int32_t  in[120]
-    // int16_t out[240]
-    /////
-    WebRtcSpl_UpBy2IntToInt(tmpmem + 240, 120, tmpmem, state->S_12_24);
-
-    ///// 24 --> 48 /////
-    // int32_t  in[240]
-    // int16_t out[480]
-    /////
-    WebRtcSpl_UpBy2IntToShort(tmpmem, 240, out, state->S_24_48);
-}
-
-// initialize state of 8 -> 48 resampler
-void WebRtcSpl_ResetResample8khzTo48khz(WebRtcSpl_State8khzTo48khz* state)
-{
-    memset(state->S_8_16, 0, 8 * sizeof(int32_t));
-    memset(state->S_16_12, 0, 8 * sizeof(int32_t));
-    memset(state->S_12_24, 0, 8 * sizeof(int32_t));
-    memset(state->S_24_48, 0, 8 * sizeof(int32_t));
-}
diff --git a/common_audio/signal_processing/resample_by_2.c b/common_audio/signal_processing/resample_by_2.c
deleted file mode 100644
index dcba82e..0000000
--- a/common_audio/signal_processing/resample_by_2.c
+++ /dev/null
@@ -1,183 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-
-/*
- * This file contains the resampling by two functions.
- * The description header can be found in signal_processing_library.h
- *
- */
-
-#include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
-
-#ifdef WEBRTC_ARCH_ARM_V7
-
-// allpass filter coefficients.
-static const uint32_t kResampleAllpass1[3] = {3284, 24441, 49528 << 15};
-static const uint32_t kResampleAllpass2[3] =
-  {12199, 37471 << 15, 60255 << 15};
-
-// Multiply two 32-bit values and accumulate to another input value.
-// Return: state + ((diff * tbl_value) >> 16)
-
-static __inline int32_t MUL_ACCUM_1(int32_t tbl_value,
-                                    int32_t diff,
-                                    int32_t state) {
-  int32_t result;
-  __asm __volatile ("smlawb %0, %1, %2, %3": "=r"(result): "r"(diff),
-                                   "r"(tbl_value), "r"(state));
-  return result;
-}
-
-// Multiply two 32-bit values and accumulate to another input value.
-// Return: Return: state + (((diff << 1) * tbl_value) >> 32)
-//
-// The reason to introduce this function is that, in case we can't use smlawb
-// instruction (in MUL_ACCUM_1) due to input value range, we can still use 
-// smmla to save some cycles.
-
-static __inline int32_t MUL_ACCUM_2(int32_t tbl_value,
-                                    int32_t diff,
-                                    int32_t state) {
-  int32_t result;
-  __asm __volatile ("smmla %0, %1, %2, %3": "=r"(result): "r"(diff << 1),
-                                  "r"(tbl_value), "r"(state));
-  return result;
-}
-
-#else
-
-// allpass filter coefficients.
-static const uint16_t kResampleAllpass1[3] = {3284, 24441, 49528};
-static const uint16_t kResampleAllpass2[3] = {12199, 37471, 60255};
-
-// Multiply a 32-bit value with a 16-bit value and accumulate to another input:
-#define MUL_ACCUM_1(a, b, c) WEBRTC_SPL_SCALEDIFF32(a, b, c)
-#define MUL_ACCUM_2(a, b, c) WEBRTC_SPL_SCALEDIFF32(a, b, c)
-
-#endif  // WEBRTC_ARCH_ARM_V7
-
-
-// decimator
-#if !defined(MIPS32_LE)
-void WebRtcSpl_DownsampleBy2(const int16_t* in, size_t len,
-                             int16_t* out, int32_t* filtState) {
-  int32_t tmp1, tmp2, diff, in32, out32;
-  size_t i;
-
-  register int32_t state0 = filtState[0];
-  register int32_t state1 = filtState[1];
-  register int32_t state2 = filtState[2];
-  register int32_t state3 = filtState[3];
-  register int32_t state4 = filtState[4];
-  register int32_t state5 = filtState[5];
-  register int32_t state6 = filtState[6];
-  register int32_t state7 = filtState[7];
-
-  for (i = (len >> 1); i > 0; i--) {
-    // lower allpass filter
-    in32 = (int32_t)(*in++) << 10;
-    diff = in32 - state1;
-    tmp1 = MUL_ACCUM_1(kResampleAllpass2[0], diff, state0);
-    state0 = in32;
-    diff = tmp1 - state2;
-    tmp2 = MUL_ACCUM_2(kResampleAllpass2[1], diff, state1);
-    state1 = tmp1;
-    diff = tmp2 - state3;
-    state3 = MUL_ACCUM_2(kResampleAllpass2[2], diff, state2);
-    state2 = tmp2;
-
-    // upper allpass filter
-    in32 = (int32_t)(*in++) << 10;
-    diff = in32 - state5;
-    tmp1 = MUL_ACCUM_1(kResampleAllpass1[0], diff, state4);
-    state4 = in32;
-    diff = tmp1 - state6;
-    tmp2 = MUL_ACCUM_1(kResampleAllpass1[1], diff, state5);
-    state5 = tmp1;
-    diff = tmp2 - state7;
-    state7 = MUL_ACCUM_2(kResampleAllpass1[2], diff, state6);
-    state6 = tmp2;
-
-    // add two allpass outputs, divide by two and round
-    out32 = (state3 + state7 + 1024) >> 11;
-
-    // limit amplitude to prevent wrap-around, and write to output array
-    *out++ = WebRtcSpl_SatW32ToW16(out32);
-  }
-
-  filtState[0] = state0;
-  filtState[1] = state1;
-  filtState[2] = state2;
-  filtState[3] = state3;
-  filtState[4] = state4;
-  filtState[5] = state5;
-  filtState[6] = state6;
-  filtState[7] = state7;
-}
-#endif  // #if defined(MIPS32_LE)
-
-
-void WebRtcSpl_UpsampleBy2(const int16_t* in, size_t len,
-                           int16_t* out, int32_t* filtState) {
-  int32_t tmp1, tmp2, diff, in32, out32;
-  size_t i;
-
-  register int32_t state0 = filtState[0];
-  register int32_t state1 = filtState[1];
-  register int32_t state2 = filtState[2];
-  register int32_t state3 = filtState[3];
-  register int32_t state4 = filtState[4];
-  register int32_t state5 = filtState[5];
-  register int32_t state6 = filtState[6];
-  register int32_t state7 = filtState[7];
-
-  for (i = len; i > 0; i--) {
-    // lower allpass filter
-    in32 = (int32_t)(*in++) << 10;
-    diff = in32 - state1;
-    tmp1 = MUL_ACCUM_1(kResampleAllpass1[0], diff, state0);
-    state0 = in32;
-    diff = tmp1 - state2;
-    tmp2 = MUL_ACCUM_1(kResampleAllpass1[1], diff, state1);
-    state1 = tmp1;
-    diff = tmp2 - state3;
-    state3 = MUL_ACCUM_2(kResampleAllpass1[2], diff, state2);
-    state2 = tmp2;
-
-    // round; limit amplitude to prevent wrap-around; write to output array
-    out32 = (state3 + 512) >> 10;
-    *out++ = WebRtcSpl_SatW32ToW16(out32);
-
-    // upper allpass filter
-    diff = in32 - state5;
-    tmp1 = MUL_ACCUM_1(kResampleAllpass2[0], diff, state4);
-    state4 = in32;
-    diff = tmp1 - state6;
-    tmp2 = MUL_ACCUM_2(kResampleAllpass2[1], diff, state5);
-    state5 = tmp1;
-    diff = tmp2 - state7;
-    state7 = MUL_ACCUM_2(kResampleAllpass2[2], diff, state6);
-    state6 = tmp2;
-
-    // round; limit amplitude to prevent wrap-around; write to output array
-    out32 = (state7 + 512) >> 10;
-    *out++ = WebRtcSpl_SatW32ToW16(out32);
-  }
-
-  filtState[0] = state0;
-  filtState[1] = state1;
-  filtState[2] = state2;
-  filtState[3] = state3;
-  filtState[4] = state4;
-  filtState[5] = state5;
-  filtState[6] = state6;
-  filtState[7] = state7;
-}
diff --git a/common_audio/signal_processing/resample_by_2_internal.c b/common_audio/signal_processing/resample_by_2_internal.c
deleted file mode 100644
index 72bc0f9..0000000
--- a/common_audio/signal_processing/resample_by_2_internal.c
+++ /dev/null
@@ -1,689 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-
-/*
- * This header file contains some internal resampling functions.
- *
- */
-
-#include "webrtc/common_audio/signal_processing/resample_by_2_internal.h"
-#include "webrtc/rtc_base/sanitizer.h"
-
-// allpass filter coefficients.
-static const int16_t kResampleAllpass[2][3] = {
-        {821, 6110, 12382},
-        {3050, 9368, 15063}
-};
-
-//
-//   decimator
-// input:  int32_t (shifted 15 positions to the left, + offset 16384) OVERWRITTEN!
-// output: int16_t (saturated) (of length len/2)
-// state:  filter state array; length = 8
-
-void RTC_NO_SANITIZE("signed-integer-overflow")  // bugs.webrtc.org/5486
-WebRtcSpl_DownBy2IntToShort(int32_t *in, int32_t len, int16_t *out,
-                            int32_t *state)
-{
-    int32_t tmp0, tmp1, diff;
-    int32_t i;
-
-    len >>= 1;
-
-    // lower allpass filter (operates on even input samples)
-    for (i = 0; i < len; i++)
-    {
-        tmp0 = in[i << 1];
-        diff = tmp0 - state[1];
-        // UBSan: -1771017321 - 999586185 cannot be represented in type 'int'
-
-        // scale down and round
-        diff = (diff + (1 << 13)) >> 14;
-        tmp1 = state[0] + diff * kResampleAllpass[1][0];
-        state[0] = tmp0;
-        diff = tmp1 - state[2];
-        // scale down and truncate
-        diff = diff >> 14;
-        if (diff < 0)
-            diff += 1;
-        tmp0 = state[1] + diff * kResampleAllpass[1][1];
-        state[1] = tmp1;
-        diff = tmp0 - state[3];
-        // scale down and truncate
-        diff = diff >> 14;
-        if (diff < 0)
-            diff += 1;
-        state[3] = state[2] + diff * kResampleAllpass[1][2];
-        state[2] = tmp0;
-
-        // divide by two and store temporarily
-        in[i << 1] = (state[3] >> 1);
-    }
-
-    in++;
-
-    // upper allpass filter (operates on odd input samples)
-    for (i = 0; i < len; i++)
-    {
-        tmp0 = in[i << 1];
-        diff = tmp0 - state[5];
-        // scale down and round
-        diff = (diff + (1 << 13)) >> 14;
-        tmp1 = state[4] + diff * kResampleAllpass[0][0];
-        state[4] = tmp0;
-        diff = tmp1 - state[6];
-        // scale down and round
-        diff = diff >> 14;
-        if (diff < 0)
-            diff += 1;
-        tmp0 = state[5] + diff * kResampleAllpass[0][1];
-        state[5] = tmp1;
-        diff = tmp0 - state[7];
-        // scale down and truncate
-        diff = diff >> 14;
-        if (diff < 0)
-            diff += 1;
-        state[7] = state[6] + diff * kResampleAllpass[0][2];
-        state[6] = tmp0;
-
-        // divide by two and store temporarily
-        in[i << 1] = (state[7] >> 1);
-    }
-
-    in--;
-
-    // combine allpass outputs
-    for (i = 0; i < len; i += 2)
-    {
-        // divide by two, add both allpass outputs and round
-        tmp0 = (in[i << 1] + in[(i << 1) + 1]) >> 15;
-        tmp1 = (in[(i << 1) + 2] + in[(i << 1) + 3]) >> 15;
-        if (tmp0 > (int32_t)0x00007FFF)
-            tmp0 = 0x00007FFF;
-        if (tmp0 < (int32_t)0xFFFF8000)
-            tmp0 = 0xFFFF8000;
-        out[i] = (int16_t)tmp0;
-        if (tmp1 > (int32_t)0x00007FFF)
-            tmp1 = 0x00007FFF;
-        if (tmp1 < (int32_t)0xFFFF8000)
-            tmp1 = 0xFFFF8000;
-        out[i + 1] = (int16_t)tmp1;
-    }
-}
-
-//
-//   decimator
-// input:  int16_t
-// output: int32_t (shifted 15 positions to the left, + offset 16384) (of length len/2)
-// state:  filter state array; length = 8
-
-void RTC_NO_SANITIZE("signed-integer-overflow")  // bugs.webrtc.org/5486
-WebRtcSpl_DownBy2ShortToInt(const int16_t *in,
-                            int32_t len,
-                            int32_t *out,
-                            int32_t *state)
-{
-    int32_t tmp0, tmp1, diff;
-    int32_t i;
-
-    len >>= 1;
-
-    // lower allpass filter (operates on even input samples)
-    for (i = 0; i < len; i++)
-    {
-        tmp0 = ((int32_t)in[i << 1] << 15) + (1 << 14);
-        diff = tmp0 - state[1];
-        // scale down and round
-        diff = (diff + (1 << 13)) >> 14;
-        tmp1 = state[0] + diff * kResampleAllpass[1][0];
-        state[0] = tmp0;
-        diff = tmp1 - state[2];
-        // UBSan: -1379909682 - 834099714 cannot be represented in type 'int'
-
-        // scale down and truncate
-        diff = diff >> 14;
-        if (diff < 0)
-            diff += 1;
-        tmp0 = state[1] + diff * kResampleAllpass[1][1];
-        state[1] = tmp1;
-        diff = tmp0 - state[3];
-        // scale down and truncate
-        diff = diff >> 14;
-        if (diff < 0)
-            diff += 1;
-        state[3] = state[2] + diff * kResampleAllpass[1][2];
-        state[2] = tmp0;
-
-        // divide by two and store temporarily
-        out[i] = (state[3] >> 1);
-    }
-
-    in++;
-
-    // upper allpass filter (operates on odd input samples)
-    for (i = 0; i < len; i++)
-    {
-        tmp0 = ((int32_t)in[i << 1] << 15) + (1 << 14);
-        diff = tmp0 - state[5];
-        // scale down and round
-        diff = (diff + (1 << 13)) >> 14;
-        tmp1 = state[4] + diff * kResampleAllpass[0][0];
-        state[4] = tmp0;
-        diff = tmp1 - state[6];
-        // scale down and round
-        diff = diff >> 14;
-        if (diff < 0)
-            diff += 1;
-        tmp0 = state[5] + diff * kResampleAllpass[0][1];
-        state[5] = tmp1;
-        diff = tmp0 - state[7];
-        // scale down and truncate
-        diff = diff >> 14;
-        if (diff < 0)
-            diff += 1;
-        state[7] = state[6] + diff * kResampleAllpass[0][2];
-        state[6] = tmp0;
-
-        // divide by two and store temporarily
-        out[i] += (state[7] >> 1);
-    }
-
-    in--;
-}
-
-//
-//   interpolator
-// input:  int16_t
-// output: int32_t (normalized, not saturated) (of length len*2)
-// state:  filter state array; length = 8
-void WebRtcSpl_UpBy2ShortToInt(const int16_t *in, int32_t len, int32_t *out,
-                               int32_t *state)
-{
-    int32_t tmp0, tmp1, diff;
-    int32_t i;
-
-    // upper allpass filter (generates odd output samples)
-    for (i = 0; i < len; i++)
-    {
-        tmp0 = ((int32_t)in[i] << 15) + (1 << 14);
-        diff = tmp0 - state[5];
-        // scale down and round
-        diff = (diff + (1 << 13)) >> 14;
-        tmp1 = state[4] + diff * kResampleAllpass[0][0];
-        state[4] = tmp0;
-        diff = tmp1 - state[6];
-        // scale down and truncate
-        diff = diff >> 14;
-        if (diff < 0)
-            diff += 1;
-        tmp0 = state[5] + diff * kResampleAllpass[0][1];
-        state[5] = tmp1;
-        diff = tmp0 - state[7];
-        // scale down and truncate
-        diff = diff >> 14;
-        if (diff < 0)
-            diff += 1;
-        state[7] = state[6] + diff * kResampleAllpass[0][2];
-        state[6] = tmp0;
-
-        // scale down, round and store
-        out[i << 1] = state[7] >> 15;
-    }
-
-    out++;
-
-    // lower allpass filter (generates even output samples)
-    for (i = 0; i < len; i++)
-    {
-        tmp0 = ((int32_t)in[i] << 15) + (1 << 14);
-        diff = tmp0 - state[1];
-        // scale down and round
-        diff = (diff + (1 << 13)) >> 14;
-        tmp1 = state[0] + diff * kResampleAllpass[1][0];
-        state[0] = tmp0;
-        diff = tmp1 - state[2];
-        // scale down and truncate
-        diff = diff >> 14;
-        if (diff < 0)
-            diff += 1;
-        tmp0 = state[1] + diff * kResampleAllpass[1][1];
-        state[1] = tmp1;
-        diff = tmp0 - state[3];
-        // scale down and truncate
-        diff = diff >> 14;
-        if (diff < 0)
-            diff += 1;
-        state[3] = state[2] + diff * kResampleAllpass[1][2];
-        state[2] = tmp0;
-
-        // scale down, round and store
-        out[i << 1] = state[3] >> 15;
-    }
-}
-
-//
-//   interpolator
-// input:  int32_t (shifted 15 positions to the left, + offset 16384)
-// output: int32_t (shifted 15 positions to the left, + offset 16384) (of length len*2)
-// state:  filter state array; length = 8
-void WebRtcSpl_UpBy2IntToInt(const int32_t *in, int32_t len, int32_t *out,
-                             int32_t *state)
-{
-    int32_t tmp0, tmp1, diff;
-    int32_t i;
-
-    // upper allpass filter (generates odd output samples)
-    for (i = 0; i < len; i++)
-    {
-        tmp0 = in[i];
-        diff = tmp0 - state[5];
-        // scale down and round
-        diff = (diff + (1 << 13)) >> 14;
-        tmp1 = state[4] + diff * kResampleAllpass[0][0];
-        state[4] = tmp0;
-        diff = tmp1 - state[6];
-        // scale down and truncate
-        diff = diff >> 14;
-        if (diff < 0)
-            diff += 1;
-        tmp0 = state[5] + diff * kResampleAllpass[0][1];
-        state[5] = tmp1;
-        diff = tmp0 - state[7];
-        // scale down and truncate
-        diff = diff >> 14;
-        if (diff < 0)
-            diff += 1;
-        state[7] = state[6] + diff * kResampleAllpass[0][2];
-        state[6] = tmp0;
-
-        // scale down, round and store
-        out[i << 1] = state[7];
-    }
-
-    out++;
-
-    // lower allpass filter (generates even output samples)
-    for (i = 0; i < len; i++)
-    {
-        tmp0 = in[i];
-        diff = tmp0 - state[1];
-        // scale down and round
-        diff = (diff + (1 << 13)) >> 14;
-        tmp1 = state[0] + diff * kResampleAllpass[1][0];
-        state[0] = tmp0;
-        diff = tmp1 - state[2];
-        // scale down and truncate
-        diff = diff >> 14;
-        if (diff < 0)
-            diff += 1;
-        tmp0 = state[1] + diff * kResampleAllpass[1][1];
-        state[1] = tmp1;
-        diff = tmp0 - state[3];
-        // scale down and truncate
-        diff = diff >> 14;
-        if (diff < 0)
-            diff += 1;
-        state[3] = state[2] + diff * kResampleAllpass[1][2];
-        state[2] = tmp0;
-
-        // scale down, round and store
-        out[i << 1] = state[3];
-    }
-}
-
-//
-//   interpolator
-// input:  int32_t (shifted 15 positions to the left, + offset 16384)
-// output: int16_t (saturated) (of length len*2)
-// state:  filter state array; length = 8
-void WebRtcSpl_UpBy2IntToShort(const int32_t *in, int32_t len, int16_t *out,
-                               int32_t *state)
-{
-    int32_t tmp0, tmp1, diff;
-    int32_t i;
-
-    // upper allpass filter (generates odd output samples)
-    for (i = 0; i < len; i++)
-    {
-        tmp0 = in[i];
-        diff = tmp0 - state[5];
-        // scale down and round
-        diff = (diff + (1 << 13)) >> 14;
-        tmp1 = state[4] + diff * kResampleAllpass[0][0];
-        state[4] = tmp0;
-        diff = tmp1 - state[6];
-        // scale down and round
-        diff = diff >> 14;
-        if (diff < 0)
-            diff += 1;
-        tmp0 = state[5] + diff * kResampleAllpass[0][1];
-        state[5] = tmp1;
-        diff = tmp0 - state[7];
-        // scale down and truncate
-        diff = diff >> 14;
-        if (diff < 0)
-            diff += 1;
-        state[7] = state[6] + diff * kResampleAllpass[0][2];
-        state[6] = tmp0;
-
-        // scale down, saturate and store
-        tmp1 = state[7] >> 15;
-        if (tmp1 > (int32_t)0x00007FFF)
-            tmp1 = 0x00007FFF;
-        if (tmp1 < (int32_t)0xFFFF8000)
-            tmp1 = 0xFFFF8000;
-        out[i << 1] = (int16_t)tmp1;
-    }
-
-    out++;
-
-    // lower allpass filter (generates even output samples)
-    for (i = 0; i < len; i++)
-    {
-        tmp0 = in[i];
-        diff = tmp0 - state[1];
-        // scale down and round
-        diff = (diff + (1 << 13)) >> 14;
-        tmp1 = state[0] + diff * kResampleAllpass[1][0];
-        state[0] = tmp0;
-        diff = tmp1 - state[2];
-        // scale down and truncate
-        diff = diff >> 14;
-        if (diff < 0)
-            diff += 1;
-        tmp0 = state[1] + diff * kResampleAllpass[1][1];
-        state[1] = tmp1;
-        diff = tmp0 - state[3];
-        // scale down and truncate
-        diff = diff >> 14;
-        if (diff < 0)
-            diff += 1;
-        state[3] = state[2] + diff * kResampleAllpass[1][2];
-        state[2] = tmp0;
-
-        // scale down, saturate and store
-        tmp1 = state[3] >> 15;
-        if (tmp1 > (int32_t)0x00007FFF)
-            tmp1 = 0x00007FFF;
-        if (tmp1 < (int32_t)0xFFFF8000)
-            tmp1 = 0xFFFF8000;
-        out[i << 1] = (int16_t)tmp1;
-    }
-}
-
-//   lowpass filter
-// input:  int16_t
-// output: int32_t (normalized, not saturated)
-// state:  filter state array; length = 8
-void WebRtcSpl_LPBy2ShortToInt(const int16_t* in, int32_t len, int32_t* out,
-                               int32_t* state)
-{
-    int32_t tmp0, tmp1, diff;
-    int32_t i;
-
-    len >>= 1;
-
-    // lower allpass filter: odd input -> even output samples
-    in++;
-    // initial state of polyphase delay element
-    tmp0 = state[12];
-    for (i = 0; i < len; i++)
-    {
-        diff = tmp0 - state[1];
-        // scale down and round
-        diff = (diff + (1 << 13)) >> 14;
-        tmp1 = state[0] + diff * kResampleAllpass[1][0];
-        state[0] = tmp0;
-        diff = tmp1 - state[2];
-        // scale down and truncate
-        diff = diff >> 14;
-        if (diff < 0)
-            diff += 1;
-        tmp0 = state[1] + diff * kResampleAllpass[1][1];
-        state[1] = tmp1;
-        diff = tmp0 - state[3];
-        // scale down and truncate
-        diff = diff >> 14;
-        if (diff < 0)
-            diff += 1;
-        state[3] = state[2] + diff * kResampleAllpass[1][2];
-        state[2] = tmp0;
-
-        // scale down, round and store
-        out[i << 1] = state[3] >> 1;
-        tmp0 = ((int32_t)in[i << 1] << 15) + (1 << 14);
-    }
-    in--;
-
-    // upper allpass filter: even input -> even output samples
-    for (i = 0; i < len; i++)
-    {
-        tmp0 = ((int32_t)in[i << 1] << 15) + (1 << 14);
-        diff = tmp0 - state[5];
-        // scale down and round
-        diff = (diff + (1 << 13)) >> 14;
-        tmp1 = state[4] + diff * kResampleAllpass[0][0];
-        state[4] = tmp0;
-        diff = tmp1 - state[6];
-        // scale down and round
-        diff = diff >> 14;
-        if (diff < 0)
-            diff += 1;
-        tmp0 = state[5] + diff * kResampleAllpass[0][1];
-        state[5] = tmp1;
-        diff = tmp0 - state[7];
-        // scale down and truncate
-        diff = diff >> 14;
-        if (diff < 0)
-            diff += 1;
-        state[7] = state[6] + diff * kResampleAllpass[0][2];
-        state[6] = tmp0;
-
-        // average the two allpass outputs, scale down and store
-        out[i << 1] = (out[i << 1] + (state[7] >> 1)) >> 15;
-    }
-
-    // switch to odd output samples
-    out++;
-
-    // lower allpass filter: even input -> odd output samples
-    for (i = 0; i < len; i++)
-    {
-        tmp0 = ((int32_t)in[i << 1] << 15) + (1 << 14);
-        diff = tmp0 - state[9];
-        // scale down and round
-        diff = (diff + (1 << 13)) >> 14;
-        tmp1 = state[8] + diff * kResampleAllpass[1][0];
-        state[8] = tmp0;
-        diff = tmp1 - state[10];
-        // scale down and truncate
-        diff = diff >> 14;
-        if (diff < 0)
-            diff += 1;
-        tmp0 = state[9] + diff * kResampleAllpass[1][1];
-        state[9] = tmp1;
-        diff = tmp0 - state[11];
-        // scale down and truncate
-        diff = diff >> 14;
-        if (diff < 0)
-            diff += 1;
-        state[11] = state[10] + diff * kResampleAllpass[1][2];
-        state[10] = tmp0;
-
-        // scale down, round and store
-        out[i << 1] = state[11] >> 1;
-    }
-
-    // upper allpass filter: odd input -> odd output samples
-    in++;
-    for (i = 0; i < len; i++)
-    {
-        tmp0 = ((int32_t)in[i << 1] << 15) + (1 << 14);
-        diff = tmp0 - state[13];
-        // scale down and round
-        diff = (diff + (1 << 13)) >> 14;
-        tmp1 = state[12] + diff * kResampleAllpass[0][0];
-        state[12] = tmp0;
-        diff = tmp1 - state[14];
-        // scale down and round
-        diff = diff >> 14;
-        if (diff < 0)
-            diff += 1;
-        tmp0 = state[13] + diff * kResampleAllpass[0][1];
-        state[13] = tmp1;
-        diff = tmp0 - state[15];
-        // scale down and truncate
-        diff = diff >> 14;
-        if (diff < 0)
-            diff += 1;
-        state[15] = state[14] + diff * kResampleAllpass[0][2];
-        state[14] = tmp0;
-
-        // average the two allpass outputs, scale down and store
-        out[i << 1] = (out[i << 1] + (state[15] >> 1)) >> 15;
-    }
-}
-
-//   lowpass filter
-// input:  int32_t (shifted 15 positions to the left, + offset 16384)
-// output: int32_t (normalized, not saturated)
-// state:  filter state array; length = 8
-void RTC_NO_SANITIZE("signed-integer-overflow")  // bugs.webrtc.org/5486
-WebRtcSpl_LPBy2IntToInt(const int32_t* in, int32_t len, int32_t* out,
-                        int32_t* state)
-{
-    int32_t tmp0, tmp1, diff;
-    int32_t i;
-
-    len >>= 1;
-
-    // lower allpass filter: odd input -> even output samples
-    in++;
-    // initial state of polyphase delay element
-    tmp0 = state[12];
-    for (i = 0; i < len; i++)
-    {
-        diff = tmp0 - state[1];
-        // scale down and round
-        diff = (diff + (1 << 13)) >> 14;
-        tmp1 = state[0] + diff * kResampleAllpass[1][0];
-        state[0] = tmp0;
-        diff = tmp1 - state[2];
-        // scale down and truncate
-        diff = diff >> 14;
-        if (diff < 0)
-            diff += 1;
-        tmp0 = state[1] + diff * kResampleAllpass[1][1];
-        state[1] = tmp1;
-        diff = tmp0 - state[3];
-        // scale down and truncate
-        diff = diff >> 14;
-        if (diff < 0)
-            diff += 1;
-        state[3] = state[2] + diff * kResampleAllpass[1][2];
-        state[2] = tmp0;
-
-        // scale down, round and store
-        out[i << 1] = state[3] >> 1;
-        tmp0 = in[i << 1];
-    }
-    in--;
-
-    // upper allpass filter: even input -> even output samples
-    for (i = 0; i < len; i++)
-    {
-        tmp0 = in[i << 1];
-        diff = tmp0 - state[5];
-        // UBSan: -794814117 - 1566149201 cannot be represented in type 'int'
-
-        // scale down and round
-        diff = (diff + (1 << 13)) >> 14;
-        tmp1 = state[4] + diff * kResampleAllpass[0][0];
-        state[4] = tmp0;
-        diff = tmp1 - state[6];
-        // scale down and round
-        diff = diff >> 14;
-        if (diff < 0)
-            diff += 1;
-        tmp0 = state[5] + diff * kResampleAllpass[0][1];
-        state[5] = tmp1;
-        diff = tmp0 - state[7];
-        // scale down and truncate
-        diff = diff >> 14;
-        if (diff < 0)
-            diff += 1;
-        state[7] = state[6] + diff * kResampleAllpass[0][2];
-        state[6] = tmp0;
-
-        // average the two allpass outputs, scale down and store
-        out[i << 1] = (out[i << 1] + (state[7] >> 1)) >> 15;
-    }
-
-    // switch to odd output samples
-    out++;
-
-    // lower allpass filter: even input -> odd output samples
-    for (i = 0; i < len; i++)
-    {
-        tmp0 = in[i << 1];
-        diff = tmp0 - state[9];
-        // scale down and round
-        diff = (diff + (1 << 13)) >> 14;
-        tmp1 = state[8] + diff * kResampleAllpass[1][0];
-        state[8] = tmp0;
-        diff = tmp1 - state[10];
-        // scale down and truncate
-        diff = diff >> 14;
-        if (diff < 0)
-            diff += 1;
-        tmp0 = state[9] + diff * kResampleAllpass[1][1];
-        state[9] = tmp1;
-        diff = tmp0 - state[11];
-        // scale down and truncate
-        diff = diff >> 14;
-        if (diff < 0)
-            diff += 1;
-        state[11] = state[10] + diff * kResampleAllpass[1][2];
-        state[10] = tmp0;
-
-        // scale down, round and store
-        out[i << 1] = state[11] >> 1;
-    }
-
-    // upper allpass filter: odd input -> odd output samples
-    in++;
-    for (i = 0; i < len; i++)
-    {
-        tmp0 = in[i << 1];
-        diff = tmp0 - state[13];
-        // scale down and round
-        diff = (diff + (1 << 13)) >> 14;
-        tmp1 = state[12] + diff * kResampleAllpass[0][0];
-        state[12] = tmp0;
-        diff = tmp1 - state[14];
-        // scale down and round
-        diff = diff >> 14;
-        if (diff < 0)
-            diff += 1;
-        tmp0 = state[13] + diff * kResampleAllpass[0][1];
-        state[13] = tmp1;
-        diff = tmp0 - state[15];
-        // scale down and truncate
-        diff = diff >> 14;
-        if (diff < 0)
-            diff += 1;
-        state[15] = state[14] + diff * kResampleAllpass[0][2];
-        state[14] = tmp0;
-
-        // average the two allpass outputs, scale down and store
-        out[i << 1] = (out[i << 1] + (state[15] >> 1)) >> 15;
-    }
-}
diff --git a/common_audio/signal_processing/resample_by_2_internal.h b/common_audio/signal_processing/resample_by_2_internal.h
deleted file mode 100644
index d0954e5..0000000
--- a/common_audio/signal_processing/resample_by_2_internal.h
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-
-/*
- * This header file contains some internal resampling functions.
- *
- */
-
-#ifndef WEBRTC_COMMON_AUDIO_SIGNAL_PROCESSING_RESAMPLE_BY_2_INTERNAL_H_
-#define WEBRTC_COMMON_AUDIO_SIGNAL_PROCESSING_RESAMPLE_BY_2_INTERNAL_H_
-
-#include "webrtc/typedefs.h"
-
-/*******************************************************************
- * resample_by_2_fast.c
- * Functions for internal use in the other resample functions
- ******************************************************************/
-void WebRtcSpl_DownBy2IntToShort(int32_t *in, int32_t len, int16_t *out,
-                                 int32_t *state);
-
-void WebRtcSpl_DownBy2ShortToInt(const int16_t *in, int32_t len,
-                                 int32_t *out, int32_t *state);
-
-void WebRtcSpl_UpBy2ShortToInt(const int16_t *in, int32_t len,
-                               int32_t *out, int32_t *state);
-
-void WebRtcSpl_UpBy2IntToInt(const int32_t *in, int32_t len, int32_t *out,
-                             int32_t *state);
-
-void WebRtcSpl_UpBy2IntToShort(const int32_t *in, int32_t len,
-                               int16_t *out, int32_t *state);
-
-void WebRtcSpl_LPBy2ShortToInt(const int16_t* in, int32_t len,
-                               int32_t* out, int32_t* state);
-
-void WebRtcSpl_LPBy2IntToInt(const int32_t* in, int32_t len, int32_t* out,
-                             int32_t* state);
-
-#endif  // WEBRTC_COMMON_AUDIO_SIGNAL_PROCESSING_RESAMPLE_BY_2_INTERNAL_H_
diff --git a/common_audio/signal_processing/resample_by_2_mips.c b/common_audio/signal_processing/resample_by_2_mips.c
deleted file mode 100644
index 7885bea..0000000
--- a/common_audio/signal_processing/resample_by_2_mips.c
+++ /dev/null
@@ -1,292 +0,0 @@
-/*
- *  Copyright (c) 2013 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.
- */
-
-
-/*
- * This file contains the resampling by two functions.
- * The description header can be found in signal_processing_library.h
- *
- */
-
-#if defined(MIPS32_LE)
-
-#include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
-
-#if !defined(MIPS_DSP_R2_LE)
-// allpass filter coefficients.
-static const uint16_t kResampleAllpass1[3] = {3284, 24441, 49528};
-static const uint16_t kResampleAllpass2[3] = {12199, 37471, 60255};
-#endif
-
-// Multiply a 32-bit value with a 16-bit value and accumulate to another input:
-#define MUL_ACCUM_1(a, b, c) WEBRTC_SPL_SCALEDIFF32(a, b, c)
-#define MUL_ACCUM_2(a, b, c) WEBRTC_SPL_SCALEDIFF32(a, b, c)
-
-// decimator
-void WebRtcSpl_DownsampleBy2(const int16_t* in,
-                             size_t len,
-                             int16_t* out,
-                             int32_t* filtState) {
-  int32_t out32;
-  size_t i, len1;
-
-  register int32_t state0 = filtState[0];
-  register int32_t state1 = filtState[1];
-  register int32_t state2 = filtState[2];
-  register int32_t state3 = filtState[3];
-  register int32_t state4 = filtState[4];
-  register int32_t state5 = filtState[5];
-  register int32_t state6 = filtState[6];
-  register int32_t state7 = filtState[7];
-
-#if defined(MIPS_DSP_R2_LE)
-  int32_t k1Res0, k1Res1, k1Res2, k2Res0, k2Res1, k2Res2;
-
-  k1Res0= 3284;
-  k1Res1= 24441;
-  k1Res2= 49528;
-  k2Res0= 12199;
-  k2Res1= 37471;
-  k2Res2= 60255;
-  len1 = (len >> 1);
-
-  const int32_t* inw = (int32_t*)in;
-  int32_t tmp11, tmp12, tmp21, tmp22;
-  int32_t in322, in321;
-  int32_t diff1, diff2;
-  for (i = len1; i > 0; i--) {
-    __asm__ volatile (
-      "lh         %[in321],    0(%[inw])                  \n\t"
-      "lh         %[in322],    2(%[inw])                  \n\t"
-
-      "sll        %[in321],    %[in321],      10          \n\t"
-      "sll        %[in322],    %[in322],      10          \n\t"
-
-      "addiu      %[inw],      %[inw],        4           \n\t"
-
-      "subu       %[diff1],    %[in321],      %[state1]   \n\t"
-      "subu       %[diff2],    %[in322],      %[state5]   \n\t"
-
-      : [in322] "=&r" (in322), [in321] "=&r" (in321),
-        [diff1] "=&r" (diff1), [diff2] "=r" (diff2), [inw] "+r" (inw)
-      : [state1] "r" (state1), [state5] "r" (state5)
-      : "memory"
-    );
-
-    __asm__ volatile (
-      "mult       $ac0,       %[diff1],       %[k2Res0]   \n\t"
-      "mult       $ac1,       %[diff2],       %[k1Res0]   \n\t"
-
-      "extr.w     %[tmp11],   $ac0,           16          \n\t"
-      "extr.w     %[tmp12],   $ac1,           16          \n\t"
-
-      "addu       %[tmp11],   %[state0],      %[tmp11]    \n\t"
-      "addu       %[tmp12],   %[state4],      %[tmp12]    \n\t"
-
-      "addiu      %[state0],  %[in321],       0           \n\t"
-      "addiu      %[state4],  %[in322],       0           \n\t"
-
-      "subu       %[diff1],   %[tmp11],       %[state2]   \n\t"
-      "subu       %[diff2],   %[tmp12],       %[state6]   \n\t"
-
-      "mult       $ac0,       %[diff1],       %[k2Res1]   \n\t"
-      "mult       $ac1,       %[diff2],       %[k1Res1]   \n\t"
-
-      "extr.w     %[tmp21],   $ac0,           16          \n\t"
-      "extr.w     %[tmp22],   $ac1,           16          \n\t"
-
-      "addu       %[tmp21],   %[state1],      %[tmp21]    \n\t"
-      "addu       %[tmp22],   %[state5],      %[tmp22]    \n\t"
-
-      "addiu      %[state1],  %[tmp11],       0           \n\t"
-      "addiu      %[state5],  %[tmp12],       0           \n\t"
-      : [tmp22] "=r" (tmp22), [tmp21] "=&r" (tmp21),
-        [tmp11] "=&r" (tmp11), [state0] "+r" (state0),
-        [state1] "+r" (state1),
-        [state2] "+r" (state2),
-        [state4] "+r" (state4), [tmp12] "=&r" (tmp12),
-        [state6] "+r" (state6), [state5] "+r" (state5)
-      : [k1Res1] "r" (k1Res1), [k2Res1] "r" (k2Res1), [k2Res0] "r" (k2Res0),
-        [diff2] "r" (diff2), [diff1] "r" (diff1), [in322] "r" (in322),
-        [in321] "r" (in321), [k1Res0] "r" (k1Res0)
-      : "hi", "lo", "$ac1hi", "$ac1lo"
-    );
-
-    // upper allpass filter
-    __asm__ volatile (
-      "subu       %[diff1],   %[tmp21],       %[state3]   \n\t"
-      "subu       %[diff2],   %[tmp22],       %[state7]   \n\t"
-
-      "mult       $ac0,       %[diff1],       %[k2Res2]   \n\t"
-      "mult       $ac1,       %[diff2],       %[k1Res2]   \n\t"
-      "extr.w     %[state3],  $ac0,           16          \n\t"
-      "extr.w     %[state7],  $ac1,           16          \n\t"
-      "addu       %[state3],  %[state2],      %[state3]   \n\t"
-      "addu       %[state7],  %[state6],      %[state7]   \n\t"
-
-      "addiu      %[state2],  %[tmp21],       0           \n\t"
-      "addiu      %[state6],  %[tmp22],       0           \n\t"
-
-      // add two allpass outputs, divide by two and round
-      "addu       %[out32],   %[state3],      %[state7]   \n\t"
-      "addiu      %[out32],   %[out32],       1024        \n\t"
-      "sra        %[out32],   %[out32],       11          \n\t"
-      : [state3] "+r" (state3), [state6] "+r" (state6),
-        [state2] "+r" (state2), [diff2] "=&r" (diff2),
-        [out32] "=r" (out32), [diff1] "=&r" (diff1), [state7] "+r" (state7)
-      : [tmp22] "r" (tmp22), [tmp21] "r" (tmp21),
-        [k1Res2] "r" (k1Res2), [k2Res2] "r" (k2Res2)
-      : "hi", "lo", "$ac1hi", "$ac1lo"
-    );
-
-    // limit amplitude to prevent wrap-around, and write to output array
-    *out++ = WebRtcSpl_SatW32ToW16(out32);
-  }
-#else  // #if defined(MIPS_DSP_R2_LE)
-  int32_t tmp1, tmp2, diff;
-  int32_t in32;
-  len1 = (len >> 1)/4;
-  for (i = len1; i > 0; i--) {
-    // lower allpass filter
-    in32 = (int32_t)(*in++) << 10;
-    diff = in32 - state1;
-    tmp1 = MUL_ACCUM_1(kResampleAllpass2[0], diff, state0);
-    state0 = in32;
-    diff = tmp1 - state2;
-    tmp2 = MUL_ACCUM_2(kResampleAllpass2[1], diff, state1);
-    state1 = tmp1;
-    diff = tmp2 - state3;
-    state3 = MUL_ACCUM_2(kResampleAllpass2[2], diff, state2);
-    state2 = tmp2;
-
-    // upper allpass filter
-    in32 = (int32_t)(*in++) << 10;
-    diff = in32 - state5;
-    tmp1 = MUL_ACCUM_1(kResampleAllpass1[0], diff, state4);
-    state4 = in32;
-    diff = tmp1 - state6;
-    tmp2 = MUL_ACCUM_1(kResampleAllpass1[1], diff, state5);
-    state5 = tmp1;
-    diff = tmp2 - state7;
-    state7 = MUL_ACCUM_2(kResampleAllpass1[2], diff, state6);
-    state6 = tmp2;
-
-    // add two allpass outputs, divide by two and round
-    out32 = (state3 + state7 + 1024) >> 11;
-
-    // limit amplitude to prevent wrap-around, and write to output array
-    *out++ = WebRtcSpl_SatW32ToW16(out32);
-    // lower allpass filter
-    in32 = (int32_t)(*in++) << 10;
-    diff = in32 - state1;
-    tmp1 = MUL_ACCUM_1(kResampleAllpass2[0], diff, state0);
-    state0 = in32;
-    diff = tmp1 - state2;
-    tmp2 = MUL_ACCUM_2(kResampleAllpass2[1], diff, state1);
-    state1 = tmp1;
-    diff = tmp2 - state3;
-    state3 = MUL_ACCUM_2(kResampleAllpass2[2], diff, state2);
-    state2 = tmp2;
-
-    // upper allpass filter
-    in32 = (int32_t)(*in++) << 10;
-    diff = in32 - state5;
-    tmp1 = MUL_ACCUM_1(kResampleAllpass1[0], diff, state4);
-    state4 = in32;
-    diff = tmp1 - state6;
-    tmp2 = MUL_ACCUM_1(kResampleAllpass1[1], diff, state5);
-    state5 = tmp1;
-    diff = tmp2 - state7;
-    state7 = MUL_ACCUM_2(kResampleAllpass1[2], diff, state6);
-    state6 = tmp2;
-
-    // add two allpass outputs, divide by two and round
-    out32 = (state3 + state7 + 1024) >> 11;
-
-    // limit amplitude to prevent wrap-around, and write to output array
-    *out++ = WebRtcSpl_SatW32ToW16(out32);
-    // lower allpass filter
-    in32 = (int32_t)(*in++) << 10;
-    diff = in32 - state1;
-    tmp1 = MUL_ACCUM_1(kResampleAllpass2[0], diff, state0);
-    state0 = in32;
-    diff = tmp1 - state2;
-    tmp2 = MUL_ACCUM_2(kResampleAllpass2[1], diff, state1);
-    state1 = tmp1;
-    diff = tmp2 - state3;
-    state3 = MUL_ACCUM_2(kResampleAllpass2[2], diff, state2);
-    state2 = tmp2;
-
-    // upper allpass filter
-    in32 = (int32_t)(*in++) << 10;
-    diff = in32 - state5;
-    tmp1 = MUL_ACCUM_1(kResampleAllpass1[0], diff, state4);
-    state4 = in32;
-    diff = tmp1 - state6;
-    tmp2 = MUL_ACCUM_1(kResampleAllpass1[1], diff, state5);
-    state5 = tmp1;
-    diff = tmp2 - state7;
-    state7 = MUL_ACCUM_2(kResampleAllpass1[2], diff, state6);
-    state6 = tmp2;
-
-    // add two allpass outputs, divide by two and round
-    out32 = (state3 + state7 + 1024) >> 11;
-
-    // limit amplitude to prevent wrap-around, and write to output array
-    *out++ = WebRtcSpl_SatW32ToW16(out32);
-    // lower allpass filter
-    in32 = (int32_t)(*in++) << 10;
-    diff = in32 - state1;
-    tmp1 = MUL_ACCUM_1(kResampleAllpass2[0], diff, state0);
-    state0 = in32;
-    diff = tmp1 - state2;
-    tmp2 = MUL_ACCUM_2(kResampleAllpass2[1], diff, state1);
-    state1 = tmp1;
-    diff = tmp2 - state3;
-    state3 = MUL_ACCUM_2(kResampleAllpass2[2], diff, state2);
-    state2 = tmp2;
-
-    // upper allpass filter
-    in32 = (int32_t)(*in++) << 10;
-    diff = in32 - state5;
-    tmp1 = MUL_ACCUM_1(kResampleAllpass1[0], diff, state4);
-    state4 = in32;
-    diff = tmp1 - state6;
-    tmp2 = MUL_ACCUM_1(kResampleAllpass1[1], diff, state5);
-    state5 = tmp1;
-    diff = tmp2 - state7;
-    state7 = MUL_ACCUM_2(kResampleAllpass1[2], diff, state6);
-    state6 = tmp2;
-
-    // add two allpass outputs, divide by two and round
-    out32 = (state3 + state7 + 1024) >> 11;
-
-    // limit amplitude to prevent wrap-around, and write to output array
-    *out++ = WebRtcSpl_SatW32ToW16(out32);
-  }
-#endif  // #if defined(MIPS_DSP_R2_LE)
-  __asm__ volatile (
-    "sw       %[state0],      0(%[filtState])     \n\t"
-    "sw       %[state1],      4(%[filtState])     \n\t"
-    "sw       %[state2],      8(%[filtState])     \n\t"
-    "sw       %[state3],      12(%[filtState])    \n\t"
-    "sw       %[state4],      16(%[filtState])    \n\t"
-    "sw       %[state5],      20(%[filtState])    \n\t"
-    "sw       %[state6],      24(%[filtState])    \n\t"
-    "sw       %[state7],      28(%[filtState])    \n\t"
-    :
-    : [state0] "r" (state0), [state1] "r" (state1), [state2] "r" (state2),
-      [state3] "r" (state3), [state4] "r" (state4), [state5] "r" (state5),
-      [state6] "r" (state6), [state7] "r" (state7), [filtState] "r" (filtState)
-    : "memory"
-  );
-}
-
-#endif  // #if defined(MIPS32_LE)
diff --git a/common_audio/signal_processing/resample_fractional.c b/common_audio/signal_processing/resample_fractional.c
deleted file mode 100644
index 6409fba..0000000
--- a/common_audio/signal_processing/resample_fractional.c
+++ /dev/null
@@ -1,239 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-
-/*
- * This file contains the resampling functions between 48, 44, 32 and 24 kHz.
- * The description headers can be found in signal_processing_library.h
- *
- */
-
-#include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
-
-// interpolation coefficients
-static const int16_t kCoefficients48To32[2][8] = {
-        {778, -2050, 1087, 23285, 12903, -3783, 441, 222},
-        {222, 441, -3783, 12903, 23285, 1087, -2050, 778}
-};
-
-static const int16_t kCoefficients32To24[3][8] = {
-        {767, -2362, 2434, 24406, 10620, -3838, 721, 90},
-        {386, -381, -2646, 19062, 19062, -2646, -381, 386},
-        {90, 721, -3838, 10620, 24406, 2434, -2362, 767}
-};
-
-static const int16_t kCoefficients44To32[4][9] = {
-        {117, -669, 2245, -6183, 26267, 13529, -3245, 845, -138},
-        {-101, 612, -2283, 8532, 29790, -5138, 1789, -524, 91},
-        {50, -292, 1016, -3064, 32010, 3933, -1147, 315, -53},
-        {-156, 974, -3863, 18603, 21691, -6246, 2353, -712, 126}
-};
-
-//   Resampling ratio: 2/3
-// input:  int32_t (normalized, not saturated) :: size 3 * K
-// output: int32_t (shifted 15 positions to the left, + offset 16384) :: size 2 * K
-//      K: number of blocks
-
-void WebRtcSpl_Resample48khzTo32khz(const int32_t *In, int32_t *Out, size_t K)
-{
-    /////////////////////////////////////////////////////////////
-    // Filter operation:
-    //
-    // Perform resampling (3 input samples -> 2 output samples);
-    // process in sub blocks of size 3 samples.
-    int32_t tmp;
-    size_t m;
-
-    for (m = 0; m < K; m++)
-    {
-        tmp = 1 << 14;
-        tmp += kCoefficients48To32[0][0] * In[0];
-        tmp += kCoefficients48To32[0][1] * In[1];
-        tmp += kCoefficients48To32[0][2] * In[2];
-        tmp += kCoefficients48To32[0][3] * In[3];
-        tmp += kCoefficients48To32[0][4] * In[4];
-        tmp += kCoefficients48To32[0][5] * In[5];
-        tmp += kCoefficients48To32[0][6] * In[6];
-        tmp += kCoefficients48To32[0][7] * In[7];
-        Out[0] = tmp;
-
-        tmp = 1 << 14;
-        tmp += kCoefficients48To32[1][0] * In[1];
-        tmp += kCoefficients48To32[1][1] * In[2];
-        tmp += kCoefficients48To32[1][2] * In[3];
-        tmp += kCoefficients48To32[1][3] * In[4];
-        tmp += kCoefficients48To32[1][4] * In[5];
-        tmp += kCoefficients48To32[1][5] * In[6];
-        tmp += kCoefficients48To32[1][6] * In[7];
-        tmp += kCoefficients48To32[1][7] * In[8];
-        Out[1] = tmp;
-
-        // update pointers
-        In += 3;
-        Out += 2;
-    }
-}
-
-//   Resampling ratio: 3/4
-// input:  int32_t (normalized, not saturated) :: size 4 * K
-// output: int32_t (shifted 15 positions to the left, + offset 16384) :: size 3 * K
-//      K: number of blocks
-
-void WebRtcSpl_Resample32khzTo24khz(const int32_t *In, int32_t *Out, size_t K)
-{
-    /////////////////////////////////////////////////////////////
-    // Filter operation:
-    //
-    // Perform resampling (4 input samples -> 3 output samples);
-    // process in sub blocks of size 4 samples.
-    size_t m;
-    int32_t tmp;
-
-    for (m = 0; m < K; m++)
-    {
-        tmp = 1 << 14;
-        tmp += kCoefficients32To24[0][0] * In[0];
-        tmp += kCoefficients32To24[0][1] * In[1];
-        tmp += kCoefficients32To24[0][2] * In[2];
-        tmp += kCoefficients32To24[0][3] * In[3];
-        tmp += kCoefficients32To24[0][4] * In[4];
-        tmp += kCoefficients32To24[0][5] * In[5];
-        tmp += kCoefficients32To24[0][6] * In[6];
-        tmp += kCoefficients32To24[0][7] * In[7];
-        Out[0] = tmp;
-
-        tmp = 1 << 14;
-        tmp += kCoefficients32To24[1][0] * In[1];
-        tmp += kCoefficients32To24[1][1] * In[2];
-        tmp += kCoefficients32To24[1][2] * In[3];
-        tmp += kCoefficients32To24[1][3] * In[4];
-        tmp += kCoefficients32To24[1][4] * In[5];
-        tmp += kCoefficients32To24[1][5] * In[6];
-        tmp += kCoefficients32To24[1][6] * In[7];
-        tmp += kCoefficients32To24[1][7] * In[8];
-        Out[1] = tmp;
-
-        tmp = 1 << 14;
-        tmp += kCoefficients32To24[2][0] * In[2];
-        tmp += kCoefficients32To24[2][1] * In[3];
-        tmp += kCoefficients32To24[2][2] * In[4];
-        tmp += kCoefficients32To24[2][3] * In[5];
-        tmp += kCoefficients32To24[2][4] * In[6];
-        tmp += kCoefficients32To24[2][5] * In[7];
-        tmp += kCoefficients32To24[2][6] * In[8];
-        tmp += kCoefficients32To24[2][7] * In[9];
-        Out[2] = tmp;
-
-        // update pointers
-        In += 4;
-        Out += 3;
-    }
-}
-
-//
-// fractional resampling filters
-//   Fout = 11/16 * Fin
-//   Fout =  8/11 * Fin
-//
-
-// compute two inner-products and store them to output array
-static void WebRtcSpl_ResampDotProduct(const int32_t *in1, const int32_t *in2,
-                                       const int16_t *coef_ptr, int32_t *out1,
-                                       int32_t *out2)
-{
-    int32_t tmp1 = 16384;
-    int32_t tmp2 = 16384;
-    int16_t coef;
-
-    coef = coef_ptr[0];
-    tmp1 += coef * in1[0];
-    tmp2 += coef * in2[-0];
-
-    coef = coef_ptr[1];
-    tmp1 += coef * in1[1];
-    tmp2 += coef * in2[-1];
-
-    coef = coef_ptr[2];
-    tmp1 += coef * in1[2];
-    tmp2 += coef * in2[-2];
-
-    coef = coef_ptr[3];
-    tmp1 += coef * in1[3];
-    tmp2 += coef * in2[-3];
-
-    coef = coef_ptr[4];
-    tmp1 += coef * in1[4];
-    tmp2 += coef * in2[-4];
-
-    coef = coef_ptr[5];
-    tmp1 += coef * in1[5];
-    tmp2 += coef * in2[-5];
-
-    coef = coef_ptr[6];
-    tmp1 += coef * in1[6];
-    tmp2 += coef * in2[-6];
-
-    coef = coef_ptr[7];
-    tmp1 += coef * in1[7];
-    tmp2 += coef * in2[-7];
-
-    coef = coef_ptr[8];
-    *out1 = tmp1 + coef * in1[8];
-    *out2 = tmp2 + coef * in2[-8];
-}
-
-//   Resampling ratio: 8/11
-// input:  int32_t (normalized, not saturated) :: size 11 * K
-// output: int32_t (shifted 15 positions to the left, + offset 16384) :: size  8 * K
-//      K: number of blocks
-
-void WebRtcSpl_Resample44khzTo32khz(const int32_t *In, int32_t *Out, size_t K)
-{
-    /////////////////////////////////////////////////////////////
-    // Filter operation:
-    //
-    // Perform resampling (11 input samples -> 8 output samples);
-    // process in sub blocks of size 11 samples.
-    int32_t tmp;
-    size_t m;
-
-    for (m = 0; m < K; m++)
-    {
-        tmp = 1 << 14;
-
-        // first output sample
-        Out[0] = ((int32_t)In[3] << 15) + tmp;
-
-        // sum and accumulate filter coefficients and input samples
-        tmp += kCoefficients44To32[3][0] * In[5];
-        tmp += kCoefficients44To32[3][1] * In[6];
-        tmp += kCoefficients44To32[3][2] * In[7];
-        tmp += kCoefficients44To32[3][3] * In[8];
-        tmp += kCoefficients44To32[3][4] * In[9];
-        tmp += kCoefficients44To32[3][5] * In[10];
-        tmp += kCoefficients44To32[3][6] * In[11];
-        tmp += kCoefficients44To32[3][7] * In[12];
-        tmp += kCoefficients44To32[3][8] * In[13];
-        Out[4] = tmp;
-
-        // sum and accumulate filter coefficients and input samples
-        WebRtcSpl_ResampDotProduct(&In[0], &In[17], kCoefficients44To32[0], &Out[1], &Out[7]);
-
-        // sum and accumulate filter coefficients and input samples
-        WebRtcSpl_ResampDotProduct(&In[2], &In[15], kCoefficients44To32[1], &Out[2], &Out[6]);
-
-        // sum and accumulate filter coefficients and input samples
-        WebRtcSpl_ResampDotProduct(&In[3], &In[14], kCoefficients44To32[2], &Out[3], &Out[5]);
-
-        // update pointers
-        In += 11;
-        Out += 8;
-    }
-}
diff --git a/common_audio/signal_processing/signal_processing_unittest.cc b/common_audio/signal_processing/signal_processing_unittest.cc
deleted file mode 100644
index 52c4390..0000000
--- a/common_audio/signal_processing/signal_processing_unittest.cc
+++ /dev/null
@@ -1,608 +0,0 @@
-/*
- *  Copyright (c) 2012 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 <algorithm>
-#include <sstream>
-
-#include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
-#include "webrtc/test/gtest.h"
-
-static const size_t kVector16Size = 9;
-static const int16_t vector16[kVector16Size] = {1, -15511, 4323, 1963,
-  WEBRTC_SPL_WORD16_MAX, 0, WEBRTC_SPL_WORD16_MIN + 5, -3333, 345};
-
-class SplTest : public testing::Test {
- protected:
-  SplTest() {
-    WebRtcSpl_Init();
-  }
-  virtual ~SplTest() {
-  }
-};
-
-TEST_F(SplTest, MacroTest) {
-    // Macros with inputs.
-    int A = 10;
-    int B = 21;
-    int a = -3;
-    int b = WEBRTC_SPL_WORD32_MAX;
-
-    EXPECT_EQ(10, WEBRTC_SPL_MIN(A, B));
-    EXPECT_EQ(21, WEBRTC_SPL_MAX(A, B));
-
-    EXPECT_EQ(3, WEBRTC_SPL_ABS_W16(a));
-    EXPECT_EQ(3, WEBRTC_SPL_ABS_W32(a));
-
-    EXPECT_EQ(-63, WEBRTC_SPL_MUL(a, B));
-    EXPECT_EQ(2147483651u, WEBRTC_SPL_UMUL(a, b));
-    b = WEBRTC_SPL_WORD16_MAX >> 1;
-    EXPECT_EQ(4294918147u, WEBRTC_SPL_UMUL_32_16(a, b));
-    EXPECT_EQ(-49149, WEBRTC_SPL_MUL_16_U16(a, b));
-
-    a = b;
-    b = -3;
-
-    EXPECT_EQ(-1, WEBRTC_SPL_MUL_16_32_RSFT16(a, b));
-    EXPECT_EQ(-1, WEBRTC_SPL_MUL_16_32_RSFT15(a, b));
-    EXPECT_EQ(-3, WEBRTC_SPL_MUL_16_32_RSFT14(a, b));
-    EXPECT_EQ(-24, WEBRTC_SPL_MUL_16_32_RSFT11(a, b));
-
-    EXPECT_EQ(-12288, WEBRTC_SPL_MUL_16_16_RSFT(a, b, 2));
-    EXPECT_EQ(-12287, WEBRTC_SPL_MUL_16_16_RSFT_WITH_ROUND(a, b, 2));
-
-    EXPECT_EQ(21, WEBRTC_SPL_SAT(a, A, B));
-    EXPECT_EQ(21, WEBRTC_SPL_SAT(a, B, A));
-
-    // Shifting with negative numbers allowed
-    int shift_amount = 1;  // Workaround compiler warning using variable here.
-    // Positive means left shift
-    EXPECT_EQ(32766, WEBRTC_SPL_SHIFT_W32(a, shift_amount));
-
-    // Shifting with negative numbers not allowed
-    // We cannot do casting here due to signed/unsigned problem
-    EXPECT_EQ(32766, WEBRTC_SPL_LSHIFT_W32(a, 1));
-
-    EXPECT_EQ(8191u, WEBRTC_SPL_RSHIFT_U32(a, 1));
-
-    EXPECT_EQ(1470, WEBRTC_SPL_RAND(A));
-
-    EXPECT_EQ(-49149, WEBRTC_SPL_MUL_16_16(a, b));
-    EXPECT_EQ(1073676289, WEBRTC_SPL_MUL_16_16(WEBRTC_SPL_WORD16_MAX,
-                                               WEBRTC_SPL_WORD16_MAX));
-    EXPECT_EQ(1073709055, WEBRTC_SPL_MUL_16_32_RSFT16(WEBRTC_SPL_WORD16_MAX,
-                                                      WEBRTC_SPL_WORD32_MAX));
-    EXPECT_EQ(1073741824, WEBRTC_SPL_MUL_16_32_RSFT16(WEBRTC_SPL_WORD16_MIN,
-                                                      WEBRTC_SPL_WORD32_MIN));
-#ifdef WEBRTC_ARCH_ARM_V7
-    EXPECT_EQ(-1073741824,
-              WEBRTC_SPL_MUL_16_32_RSFT16(WEBRTC_SPL_WORD16_MIN,
-                                          WEBRTC_SPL_WORD32_MAX));
-#else
-    EXPECT_EQ(-1073741823,
-              WEBRTC_SPL_MUL_16_32_RSFT16(WEBRTC_SPL_WORD16_MIN,
-                                          WEBRTC_SPL_WORD32_MAX));
-#endif
-}
-
-TEST_F(SplTest, InlineTest) {
-    int16_t a16 = 121;
-    int16_t b16 = -17;
-    int32_t a32 = 111121;
-    int32_t b32 = -1711;
-
-    EXPECT_EQ(17, WebRtcSpl_GetSizeInBits(a32));
-
-    EXPECT_EQ(0, WebRtcSpl_NormW32(0));
-    EXPECT_EQ(31, WebRtcSpl_NormW32(-1));
-    EXPECT_EQ(0, WebRtcSpl_NormW32(WEBRTC_SPL_WORD32_MIN));
-    EXPECT_EQ(14, WebRtcSpl_NormW32(a32));
-
-    EXPECT_EQ(0, WebRtcSpl_NormW16(0));
-    EXPECT_EQ(15, WebRtcSpl_NormW16(-1));
-    EXPECT_EQ(0, WebRtcSpl_NormW16(WEBRTC_SPL_WORD16_MIN));
-    EXPECT_EQ(4, WebRtcSpl_NormW16(b32));
-    for (int ii = 0; ii < 15; ++ii) {
-      int16_t value = 1 << ii;
-      EXPECT_EQ(14 - ii, WebRtcSpl_NormW16(value));
-      EXPECT_EQ(15 - ii, WebRtcSpl_NormW16(-value));
-    }
-
-    EXPECT_EQ(0, WebRtcSpl_NormU32(0u));
-    EXPECT_EQ(0, WebRtcSpl_NormU32(0xffffffff));
-    EXPECT_EQ(15, WebRtcSpl_NormU32(static_cast<uint32_t>(a32)));
-
-    EXPECT_EQ(104, WebRtcSpl_AddSatW16(a16, b16));
-    EXPECT_EQ(138, WebRtcSpl_SubSatW16(a16, b16));
-}
-
-TEST_F(SplTest, AddSubSatW32) {
-  static constexpr int32_t kAddSubArgs[] = {
-      INT32_MIN, INT32_MIN + 1, -3,       -2, -1, 0, 1, -1, 2,
-      3,         INT32_MAX - 1, INT32_MAX};
-  for (int32_t a : kAddSubArgs) {
-    for (int32_t b : kAddSubArgs) {
-      const int64_t sum = std::max<int64_t>(
-          INT32_MIN, std::min<int64_t>(INT32_MAX, static_cast<int64_t>(a) + b));
-      const int64_t diff = std::max<int64_t>(
-          INT32_MIN, std::min<int64_t>(INT32_MAX, static_cast<int64_t>(a) - b));
-      std::ostringstream ss;
-      ss << a << " +/- " << b << ": sum " << sum << ", diff " << diff;
-      SCOPED_TRACE(ss.str());
-      EXPECT_EQ(sum, WebRtcSpl_AddSatW32(a, b));
-      EXPECT_EQ(diff, WebRtcSpl_SubSatW32(a, b));
-    }
-  }
-}
-
-TEST_F(SplTest, CountLeadingZeros32) {
-  EXPECT_EQ(32, WebRtcSpl_CountLeadingZeros32(0));
-  EXPECT_EQ(32, WebRtcSpl_CountLeadingZeros32_NotBuiltin(0));
-  for (int i = 0; i < 32; ++i) {
-    const uint32_t single_one = uint32_t{1} << i;
-    const uint32_t all_ones = 2 * single_one - 1;
-    EXPECT_EQ(31 - i, WebRtcSpl_CountLeadingZeros32(single_one));
-    EXPECT_EQ(31 - i, WebRtcSpl_CountLeadingZeros32_NotBuiltin(single_one));
-    EXPECT_EQ(31 - i, WebRtcSpl_CountLeadingZeros32(all_ones));
-    EXPECT_EQ(31 - i, WebRtcSpl_CountLeadingZeros32_NotBuiltin(all_ones));
-  }
-}
-
-TEST_F(SplTest, CountLeadingZeros64) {
-  EXPECT_EQ(64, WebRtcSpl_CountLeadingZeros64(0));
-  EXPECT_EQ(64, WebRtcSpl_CountLeadingZeros64_NotBuiltin(0));
-  for (int i = 0; i < 64; ++i) {
-    const uint64_t single_one = uint64_t{1} << i;
-    const uint64_t all_ones = 2 * single_one - 1;
-    EXPECT_EQ(63 - i, WebRtcSpl_CountLeadingZeros64(single_one));
-    EXPECT_EQ(63 - i, WebRtcSpl_CountLeadingZeros64_NotBuiltin(single_one));
-    EXPECT_EQ(63 - i, WebRtcSpl_CountLeadingZeros64(all_ones));
-    EXPECT_EQ(63 - i, WebRtcSpl_CountLeadingZeros64_NotBuiltin(all_ones));
-  }
-}
-
-TEST_F(SplTest, MathOperationsTest) {
-    int A = 1134567892;
-    int32_t num = 117;
-    int32_t den = -5;
-    uint16_t denU = 5;
-    EXPECT_EQ(33700, WebRtcSpl_Sqrt(A));
-    EXPECT_EQ(33683, WebRtcSpl_SqrtFloor(A));
-
-
-    EXPECT_EQ(-91772805, WebRtcSpl_DivResultInQ31(den, num));
-    EXPECT_EQ(-23, WebRtcSpl_DivW32W16ResW16(num, (int16_t)den));
-    EXPECT_EQ(-23, WebRtcSpl_DivW32W16(num, (int16_t)den));
-    EXPECT_EQ(23u, WebRtcSpl_DivU32U16(num, denU));
-    EXPECT_EQ(0, WebRtcSpl_DivW32HiLow(128, 0, 256));
-}
-
-TEST_F(SplTest, BasicArrayOperationsTest) {
-    const size_t kVectorSize = 4;
-    int B[] = {4, 12, 133, 1100};
-    int16_t b16[kVectorSize];
-    int32_t b32[kVectorSize];
-
-    int16_t bTmp16[kVectorSize];
-    int32_t bTmp32[kVectorSize];
-
-    WebRtcSpl_MemSetW16(b16, 3, kVectorSize);
-    for (size_t kk = 0; kk < kVectorSize; ++kk) {
-        EXPECT_EQ(3, b16[kk]);
-    }
-    WebRtcSpl_ZerosArrayW16(b16, kVectorSize);
-    for (size_t kk = 0; kk < kVectorSize; ++kk) {
-        EXPECT_EQ(0, b16[kk]);
-    }
-    WebRtcSpl_MemSetW32(b32, 3, kVectorSize);
-    for (size_t kk = 0; kk < kVectorSize; ++kk) {
-        EXPECT_EQ(3, b32[kk]);
-    }
-    WebRtcSpl_ZerosArrayW32(b32, kVectorSize);
-    for (size_t kk = 0; kk < kVectorSize; ++kk) {
-        EXPECT_EQ(0, b32[kk]);
-    }
-    for (size_t kk = 0; kk < kVectorSize; ++kk) {
-        bTmp16[kk] = (int16_t)kk;
-        bTmp32[kk] = (int32_t)kk;
-    }
-    WEBRTC_SPL_MEMCPY_W16(b16, bTmp16, kVectorSize);
-    for (size_t kk = 0; kk < kVectorSize; ++kk) {
-        EXPECT_EQ(b16[kk], bTmp16[kk]);
-    }
-//    WEBRTC_SPL_MEMCPY_W32(b32, bTmp32, kVectorSize);
-//    for (int kk = 0; kk < kVectorSize; ++kk) {
-//        EXPECT_EQ(b32[kk], bTmp32[kk]);
-//    }
-    WebRtcSpl_CopyFromEndW16(b16, kVectorSize, 2, bTmp16);
-    for (size_t kk = 0; kk < 2; ++kk) {
-        EXPECT_EQ(static_cast<int16_t>(kk+2), bTmp16[kk]);
-    }
-
-    for (size_t kk = 0; kk < kVectorSize; ++kk) {
-        b32[kk] = B[kk];
-        b16[kk] = (int16_t)B[kk];
-    }
-    WebRtcSpl_VectorBitShiftW32ToW16(bTmp16, kVectorSize, b32, 1);
-    for (size_t kk = 0; kk < kVectorSize; ++kk) {
-        EXPECT_EQ((B[kk]>>1), bTmp16[kk]);
-    }
-    WebRtcSpl_VectorBitShiftW16(bTmp16, kVectorSize, b16, 1);
-    for (size_t kk = 0; kk < kVectorSize; ++kk) {
-        EXPECT_EQ((B[kk]>>1), bTmp16[kk]);
-    }
-    WebRtcSpl_VectorBitShiftW32(bTmp32, kVectorSize, b32, 1);
-    for (size_t kk = 0; kk < kVectorSize; ++kk) {
-        EXPECT_EQ((B[kk]>>1), bTmp32[kk]);
-    }
-
-    WebRtcSpl_MemCpyReversedOrder(&bTmp16[3], b16, kVectorSize);
-    for (size_t kk = 0; kk < kVectorSize; ++kk) {
-        EXPECT_EQ(b16[3-kk], bTmp16[kk]);
-    }
-}
-
-TEST_F(SplTest, MinMaxOperationsTest) {
-  const size_t kVectorSize = 17;
-
-  // Vectors to test the cases where minimum values have to be caught
-  // outside of the unrolled loops in ARM-Neon.
-  int16_t vector16[kVectorSize] = {-1, 7485, 0, 3333,
-      -18283, 0, 12334, -29871, 988, -3333,
-      345, -456, 222, 999,  888, 8774, WEBRTC_SPL_WORD16_MIN};
-  int32_t vector32[kVectorSize] = {-1, 0, 283211, 3333,
-      8712345, 0, -3333, 89345, -374585456, 222, 999, 122345334,
-      -12389756, -987329871, 888, -2, WEBRTC_SPL_WORD32_MIN};
-
-  EXPECT_EQ(WEBRTC_SPL_WORD16_MIN,
-            WebRtcSpl_MinValueW16(vector16, kVectorSize));
-  EXPECT_EQ(WEBRTC_SPL_WORD32_MIN,
-            WebRtcSpl_MinValueW32(vector32, kVectorSize));
-  EXPECT_EQ(kVectorSize - 1, WebRtcSpl_MinIndexW16(vector16, kVectorSize));
-  EXPECT_EQ(kVectorSize - 1, WebRtcSpl_MinIndexW32(vector32, kVectorSize));
-
-  // Test the cases where maximum values have to be caught
-  // outside of the unrolled loops in ARM-Neon.
-  vector16[kVectorSize - 1] = WEBRTC_SPL_WORD16_MAX;
-  vector32[kVectorSize - 1] = WEBRTC_SPL_WORD32_MAX;
-
-  EXPECT_EQ(WEBRTC_SPL_WORD16_MAX,
-            WebRtcSpl_MaxAbsValueW16(vector16, kVectorSize));
-  EXPECT_EQ(WEBRTC_SPL_WORD16_MAX,
-            WebRtcSpl_MaxValueW16(vector16, kVectorSize));
-  EXPECT_EQ(WEBRTC_SPL_WORD32_MAX,
-            WebRtcSpl_MaxAbsValueW32(vector32, kVectorSize));
-  EXPECT_EQ(WEBRTC_SPL_WORD32_MAX,
-            WebRtcSpl_MaxValueW32(vector32, kVectorSize));
-  EXPECT_EQ(kVectorSize - 1, WebRtcSpl_MaxAbsIndexW16(vector16, kVectorSize));
-  EXPECT_EQ(kVectorSize - 1, WebRtcSpl_MaxIndexW16(vector16, kVectorSize));
-  EXPECT_EQ(kVectorSize - 1, WebRtcSpl_MaxIndexW32(vector32, kVectorSize));
-
-  // Test the cases where multiple maximum and minimum values are present.
-  vector16[1] = WEBRTC_SPL_WORD16_MAX;
-  vector16[6] = WEBRTC_SPL_WORD16_MIN;
-  vector16[11] = WEBRTC_SPL_WORD16_MIN;
-  vector32[1] = WEBRTC_SPL_WORD32_MAX;
-  vector32[6] = WEBRTC_SPL_WORD32_MIN;
-  vector32[11] = WEBRTC_SPL_WORD32_MIN;
-
-  EXPECT_EQ(WEBRTC_SPL_WORD16_MAX,
-            WebRtcSpl_MaxAbsValueW16(vector16, kVectorSize));
-  EXPECT_EQ(WEBRTC_SPL_WORD16_MAX,
-            WebRtcSpl_MaxValueW16(vector16, kVectorSize));
-  EXPECT_EQ(WEBRTC_SPL_WORD16_MIN,
-            WebRtcSpl_MinValueW16(vector16, kVectorSize));
-  EXPECT_EQ(WEBRTC_SPL_WORD32_MAX,
-            WebRtcSpl_MaxAbsValueW32(vector32, kVectorSize));
-  EXPECT_EQ(WEBRTC_SPL_WORD32_MAX,
-            WebRtcSpl_MaxValueW32(vector32, kVectorSize));
-  EXPECT_EQ(WEBRTC_SPL_WORD32_MIN,
-            WebRtcSpl_MinValueW32(vector32, kVectorSize));
-  EXPECT_EQ(6u, WebRtcSpl_MaxAbsIndexW16(vector16, kVectorSize));
-  EXPECT_EQ(1u, WebRtcSpl_MaxIndexW16(vector16, kVectorSize));
-  EXPECT_EQ(1u, WebRtcSpl_MaxIndexW32(vector32, kVectorSize));
-  EXPECT_EQ(6u, WebRtcSpl_MinIndexW16(vector16, kVectorSize));
-  EXPECT_EQ(6u, WebRtcSpl_MinIndexW32(vector32, kVectorSize));
-}
-
-TEST_F(SplTest, VectorOperationsTest) {
-    const size_t kVectorSize = 4;
-    int B[] = {4, 12, 133, 1100};
-    int16_t a16[kVectorSize];
-    int16_t b16[kVectorSize];
-    int16_t bTmp16[kVectorSize];
-
-    for (size_t kk = 0; kk < kVectorSize; ++kk) {
-        a16[kk] = B[kk];
-        b16[kk] = B[kk];
-    }
-
-    WebRtcSpl_AffineTransformVector(bTmp16, b16, 3, 7, 2, kVectorSize);
-    for (size_t kk = 0; kk < kVectorSize; ++kk) {
-        EXPECT_EQ((B[kk]*3+7)>>2, bTmp16[kk]);
-    }
-    WebRtcSpl_ScaleAndAddVectorsWithRound(b16, 3, b16, 2, 2, bTmp16,
-                                          kVectorSize);
-    for (size_t kk = 0; kk < kVectorSize; ++kk) {
-        EXPECT_EQ((B[kk]*3+B[kk]*2+2)>>2, bTmp16[kk]);
-    }
-
-    WebRtcSpl_AddAffineVectorToVector(bTmp16, b16, 3, 7, 2, kVectorSize);
-    for (size_t kk = 0; kk < kVectorSize; ++kk) {
-        EXPECT_EQ(((B[kk]*3+B[kk]*2+2)>>2)+((b16[kk]*3+7)>>2), bTmp16[kk]);
-    }
-
-    WebRtcSpl_ScaleVector(b16, bTmp16, 13, kVectorSize, 2);
-    for (size_t kk = 0; kk < kVectorSize; ++kk) {
-        EXPECT_EQ((b16[kk]*13)>>2, bTmp16[kk]);
-    }
-    WebRtcSpl_ScaleVectorWithSat(b16, bTmp16, 13, kVectorSize, 2);
-    for (size_t kk = 0; kk < kVectorSize; ++kk) {
-        EXPECT_EQ((b16[kk]*13)>>2, bTmp16[kk]);
-    }
-    WebRtcSpl_ScaleAndAddVectors(a16, 13, 2, b16, 7, 2, bTmp16, kVectorSize);
-    for (size_t kk = 0; kk < kVectorSize; ++kk) {
-        EXPECT_EQ(((a16[kk]*13)>>2)+((b16[kk]*7)>>2), bTmp16[kk]);
-    }
-
-    WebRtcSpl_AddVectorsAndShift(bTmp16, a16, b16, kVectorSize, 2);
-    for (size_t kk = 0; kk < kVectorSize; ++kk) {
-        EXPECT_EQ(B[kk] >> 1, bTmp16[kk]);
-    }
-    WebRtcSpl_ReverseOrderMultArrayElements(bTmp16, a16, &b16[3],
-                                            kVectorSize, 2);
-    for (size_t kk = 0; kk < kVectorSize; ++kk) {
-        EXPECT_EQ((a16[kk]*b16[3-kk])>>2, bTmp16[kk]);
-    }
-    WebRtcSpl_ElementwiseVectorMult(bTmp16, a16, b16, kVectorSize, 6);
-    for (size_t kk = 0; kk < kVectorSize; ++kk) {
-        EXPECT_EQ((a16[kk]*b16[kk])>>6, bTmp16[kk]);
-    }
-
-    WebRtcSpl_SqrtOfOneMinusXSquared(b16, kVectorSize, bTmp16);
-    for (size_t kk = 0; kk < kVectorSize - 1; ++kk) {
-        EXPECT_EQ(32767, bTmp16[kk]);
-    }
-    EXPECT_EQ(32749, bTmp16[kVectorSize - 1]);
-
-    EXPECT_EQ(0, WebRtcSpl_GetScalingSquare(b16, kVectorSize, 1));
-}
-
-TEST_F(SplTest, EstimatorsTest) {
-  const size_t kOrder = 2;
-  const int32_t unstable_filter[] = { 4, 12, 133, 1100 };
-  const int32_t stable_filter[] = { 1100, 133, 12, 4 };
-  int16_t lpc[kOrder + 2] = { 0 };
-  int16_t refl[kOrder + 2] = { 0 };
-  int16_t lpc_result[] = { 4096, -497, 15, 0 };
-  int16_t refl_result[] = { -3962, 123, 0, 0 };
-
-  EXPECT_EQ(0, WebRtcSpl_LevinsonDurbin(unstable_filter, lpc, refl, kOrder));
-  EXPECT_EQ(1, WebRtcSpl_LevinsonDurbin(stable_filter, lpc, refl, kOrder));
-  for (size_t i = 0; i < kOrder + 2; ++i) {
-    EXPECT_EQ(lpc_result[i], lpc[i]);
-    EXPECT_EQ(refl_result[i], refl[i]);
-  }
-}
-
-TEST_F(SplTest, FilterTest) {
-    const size_t kVectorSize = 4;
-    const size_t kFilterOrder = 3;
-    int16_t A[] = {1, 2, 33, 100};
-    int16_t A5[] = {1, 2, 33, 100, -5};
-    int16_t B[] = {4, 12, 133, 110};
-    int16_t data_in[kVectorSize];
-    int16_t data_out[kVectorSize];
-    int16_t bTmp16Low[kVectorSize];
-    int16_t bState[kVectorSize];
-    int16_t bStateLow[kVectorSize];
-
-    WebRtcSpl_ZerosArrayW16(bState, kVectorSize);
-    WebRtcSpl_ZerosArrayW16(bStateLow, kVectorSize);
-
-    for (size_t kk = 0; kk < kVectorSize; ++kk) {
-        data_in[kk] = A[kk];
-        data_out[kk] = 0;
-    }
-
-    // MA filters.
-    // Note that the input data has |kFilterOrder| states before the actual
-    // data (one sample).
-    WebRtcSpl_FilterMAFastQ12(&data_in[kFilterOrder], data_out, B,
-                              kFilterOrder + 1, 1);
-    EXPECT_EQ(0, data_out[0]);
-    // AR filters.
-    // Note that the output data has |kFilterOrder| states before the actual
-    // data (one sample).
-    WebRtcSpl_FilterARFastQ12(data_in, &data_out[kFilterOrder], A,
-                              kFilterOrder + 1, 1);
-    EXPECT_EQ(0, data_out[kFilterOrder]);
-
-    EXPECT_EQ(kVectorSize, WebRtcSpl_FilterAR(A5,
-                                              5,
-                                              data_in,
-                                              kVectorSize,
-                                              bState,
-                                              kVectorSize,
-                                              bStateLow,
-                                              kVectorSize,
-                                              data_out,
-                                              bTmp16Low,
-                                              kVectorSize));
-}
-
-TEST_F(SplTest, RandTest) {
-    const int kVectorSize = 4;
-    int16_t BU[] = {3653, 12446, 8525, 30691};
-    int16_t b16[kVectorSize];
-    uint32_t bSeed = 100000;
-
-    EXPECT_EQ(7086, WebRtcSpl_RandU(&bSeed));
-    EXPECT_EQ(31565, WebRtcSpl_RandU(&bSeed));
-    EXPECT_EQ(-9786, WebRtcSpl_RandN(&bSeed));
-    EXPECT_EQ(kVectorSize, WebRtcSpl_RandUArray(b16, kVectorSize, &bSeed));
-    for (int kk = 0; kk < kVectorSize; ++kk) {
-        EXPECT_EQ(BU[kk], b16[kk]);
-    }
-}
-
-TEST_F(SplTest, DotProductWithScaleTest) {
-  EXPECT_EQ(605362796, WebRtcSpl_DotProductWithScale(vector16,
-      vector16, kVector16Size, 2));
-}
-
-TEST_F(SplTest, CrossCorrelationTest) {
-  // Note the function arguments relation specificed by API.
-  const size_t kCrossCorrelationDimension = 3;
-  const int kShift = 2;
-  const int kStep = 1;
-  const size_t kSeqDimension = 6;
-
-  const int16_t kVector16[kVector16Size] = {1, 4323, 1963,
-    WEBRTC_SPL_WORD16_MAX, WEBRTC_SPL_WORD16_MIN + 5, -3333, -876, 8483, 142};
-  int32_t vector32[kCrossCorrelationDimension] = {0};
-
-  WebRtcSpl_CrossCorrelation(vector32, vector16, kVector16, kSeqDimension,
-                             kCrossCorrelationDimension, kShift, kStep);
-
-  // WebRtcSpl_CrossCorrelationC() and WebRtcSpl_CrossCorrelationNeon()
-  // are not bit-exact.
-  const int32_t kExpected[kCrossCorrelationDimension] =
-      {-266947903, -15579555, -171282001};
-  const int32_t* expected = kExpected;
-#if !defined(MIPS32_LE)
-  const int32_t kExpectedNeon[kCrossCorrelationDimension] =
-      {-266947901, -15579553, -171281999};
-  if (WebRtcSpl_CrossCorrelation != WebRtcSpl_CrossCorrelationC) {
-    expected = kExpectedNeon;
-  }
-#endif
-  for (size_t i = 0; i < kCrossCorrelationDimension; ++i) {
-    EXPECT_EQ(expected[i], vector32[i]);
-  }
-}
-
-TEST_F(SplTest, AutoCorrelationTest) {
-  int scale = 0;
-  int32_t vector32[kVector16Size];
-  const int32_t expected[kVector16Size] = {302681398, 14223410, -121705063,
-    -85221647, -17104971, 61806945, 6644603, -669329, 43};
-
-  EXPECT_EQ(kVector16Size,
-            WebRtcSpl_AutoCorrelation(vector16, kVector16Size,
-                                      kVector16Size - 1, vector32, &scale));
-  EXPECT_EQ(3, scale);
-  for (size_t i = 0; i < kVector16Size; ++i) {
-    EXPECT_EQ(expected[i], vector32[i]);
-  }
-}
-
-TEST_F(SplTest, SignalProcessingTest) {
-    const size_t kVectorSize = 4;
-    int A[] = {1, 2, 33, 100};
-    const int16_t kHanning[4] = { 2399, 8192, 13985, 16384 };
-    int16_t b16[kVectorSize];
-
-    int16_t bTmp16[kVectorSize];
-
-    int bScale = 0;
-
-    for (size_t kk = 0; kk < kVectorSize; ++kk) {
-        b16[kk] = A[kk];
-    }
-
-    // TODO(bjornv): Activate the Reflection Coefficient tests when refactoring.
-//    WebRtcSpl_ReflCoefToLpc(b16, kVectorSize, bTmp16);
-////    for (int kk = 0; kk < kVectorSize; ++kk) {
-////        EXPECT_EQ(aTmp16[kk], bTmp16[kk]);
-////    }
-//    WebRtcSpl_LpcToReflCoef(bTmp16, kVectorSize, b16);
-////    for (int kk = 0; kk < kVectorSize; ++kk) {
-////        EXPECT_EQ(a16[kk], b16[kk]);
-////    }
-//    WebRtcSpl_AutoCorrToReflCoef(b32, kVectorSize, bTmp16);
-////    for (int kk = 0; kk < kVectorSize; ++kk) {
-////        EXPECT_EQ(aTmp16[kk], bTmp16[kk]);
-////    }
-
-    WebRtcSpl_GetHanningWindow(bTmp16, kVectorSize);
-    for (size_t kk = 0; kk < kVectorSize; ++kk) {
-        EXPECT_EQ(kHanning[kk], bTmp16[kk]);
-    }
-
-    for (size_t kk = 0; kk < kVectorSize; ++kk) {
-        b16[kk] = A[kk];
-    }
-    EXPECT_EQ(11094 , WebRtcSpl_Energy(b16, kVectorSize, &bScale));
-    EXPECT_EQ(0, bScale);
-}
-
-TEST_F(SplTest, FFTTest) {
-    int16_t B[] = {1, 2, 33, 100,
-            2, 3, 34, 101,
-            3, 4, 35, 102,
-            4, 5, 36, 103};
-
-    EXPECT_EQ(0, WebRtcSpl_ComplexFFT(B, 3, 1));
-//    for (int kk = 0; kk < 16; ++kk) {
-//        EXPECT_EQ(A[kk], B[kk]);
-//    }
-    EXPECT_EQ(0, WebRtcSpl_ComplexIFFT(B, 3, 1));
-//    for (int kk = 0; kk < 16; ++kk) {
-//        EXPECT_EQ(A[kk], B[kk]);
-//    }
-    WebRtcSpl_ComplexBitReverse(B, 3);
-    for (int kk = 0; kk < 16; ++kk) {
-//      EXPECT_EQ(A[kk], B[kk]);
-    }
-}
-
-TEST_F(SplTest, Resample48WithSaturationTest) {
-  // The test resamples 3*kBlockSize number of samples to 2*kBlockSize number
-  // of samples.
-  const size_t kBlockSize = 16;
-
-  // Saturated input vector of 48 samples.
-  const int32_t kVectorSaturated[3 * kBlockSize + 7] = {
-     -32768, -32768, -32768, -32768, -32768, -32768, -32768, -32768,
-     -32768, -32768, -32768, -32768, -32768, -32768, -32768, -32768,
-     -32768, -32768, -32768, -32768, -32768, -32768, -32768, -32768,
-     32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
-     32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
-     32767, 32767, 32767, 32767, 32767, 32767, 32767, 32767,
-     32767, 32767, 32767, 32767, 32767, 32767, 32767
-  };
-
-  // All values in |out_vector| should be |kRefValue32kHz|.
-  const int32_t kRefValue32kHz1 = -1077493760;
-  const int32_t kRefValue32kHz2 = 1077493645;
-
-  // After bit shift with saturation, |out_vector_w16| is saturated.
-
-  const int16_t kRefValue16kHz1 = -32768;
-  const int16_t kRefValue16kHz2 = 32767;
-  // Vector for storing output.
-  int32_t out_vector[2 * kBlockSize];
-  int16_t out_vector_w16[2 * kBlockSize];
-
-  WebRtcSpl_Resample48khzTo32khz(kVectorSaturated, out_vector, kBlockSize);
-  WebRtcSpl_VectorBitShiftW32ToW16(out_vector_w16, 2 * kBlockSize, out_vector,
-                                   15);
-
-  // Comparing output values against references. The values at position
-  // 12-15 are skipped to account for the filter lag.
-  for (size_t i = 0; i < 12; ++i) {
-    EXPECT_EQ(kRefValue32kHz1, out_vector[i]);
-    EXPECT_EQ(kRefValue16kHz1, out_vector_w16[i]);
-  }
-  for (size_t i = 16; i < 2 * kBlockSize; ++i) {
-    EXPECT_EQ(kRefValue32kHz2, out_vector[i]);
-    EXPECT_EQ(kRefValue16kHz2, out_vector_w16[i]);
-  }
-}
diff --git a/common_audio/signal_processing/spl_init.c b/common_audio/signal_processing/spl_init.c
deleted file mode 100644
index c9c4e65..0000000
--- a/common_audio/signal_processing/spl_init.c
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- *  Copyright (c) 2012 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.
- */
-
-/* The global function contained in this file initializes SPL function
- * pointers, currently only for ARM platforms.
- *
- * Some code came from common/rtcd.c in the WebM project.
- */
-
-#include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
-#include "webrtc/system_wrappers/include/cpu_features_wrapper.h"
-
-/* Declare function pointers. */
-MaxAbsValueW16 WebRtcSpl_MaxAbsValueW16;
-MaxAbsValueW32 WebRtcSpl_MaxAbsValueW32;
-MaxValueW16 WebRtcSpl_MaxValueW16;
-MaxValueW32 WebRtcSpl_MaxValueW32;
-MinValueW16 WebRtcSpl_MinValueW16;
-MinValueW32 WebRtcSpl_MinValueW32;
-CrossCorrelation WebRtcSpl_CrossCorrelation;
-DownsampleFast WebRtcSpl_DownsampleFast;
-ScaleAndAddVectorsWithRound WebRtcSpl_ScaleAndAddVectorsWithRound;
-
-#if (!defined(WEBRTC_HAS_NEON)) && !defined(MIPS32_LE)
-/* Initialize function pointers to the generic C version. */
-static void InitPointersToC() {
-  WebRtcSpl_MaxAbsValueW16 = WebRtcSpl_MaxAbsValueW16C;
-  WebRtcSpl_MaxAbsValueW32 = WebRtcSpl_MaxAbsValueW32C;
-  WebRtcSpl_MaxValueW16 = WebRtcSpl_MaxValueW16C;
-  WebRtcSpl_MaxValueW32 = WebRtcSpl_MaxValueW32C;
-  WebRtcSpl_MinValueW16 = WebRtcSpl_MinValueW16C;
-  WebRtcSpl_MinValueW32 = WebRtcSpl_MinValueW32C;
-  WebRtcSpl_CrossCorrelation = WebRtcSpl_CrossCorrelationC;
-  WebRtcSpl_DownsampleFast = WebRtcSpl_DownsampleFastC;
-  WebRtcSpl_ScaleAndAddVectorsWithRound =
-      WebRtcSpl_ScaleAndAddVectorsWithRoundC;
-}
-#endif
-
-#if defined(WEBRTC_HAS_NEON)
-/* Initialize function pointers to the Neon version. */
-static void InitPointersToNeon() {
-  WebRtcSpl_MaxAbsValueW16 = WebRtcSpl_MaxAbsValueW16Neon;
-  WebRtcSpl_MaxAbsValueW32 = WebRtcSpl_MaxAbsValueW32Neon;
-  WebRtcSpl_MaxValueW16 = WebRtcSpl_MaxValueW16Neon;
-  WebRtcSpl_MaxValueW32 = WebRtcSpl_MaxValueW32Neon;
-  WebRtcSpl_MinValueW16 = WebRtcSpl_MinValueW16Neon;
-  WebRtcSpl_MinValueW32 = WebRtcSpl_MinValueW32Neon;
-  WebRtcSpl_CrossCorrelation = WebRtcSpl_CrossCorrelationNeon;
-  WebRtcSpl_DownsampleFast = WebRtcSpl_DownsampleFastNeon;
-  WebRtcSpl_ScaleAndAddVectorsWithRound =
-      WebRtcSpl_ScaleAndAddVectorsWithRoundC;
-}
-#endif
-
-#if defined(MIPS32_LE)
-/* Initialize function pointers to the MIPS version. */
-static void InitPointersToMIPS() {
-  WebRtcSpl_MaxAbsValueW16 = WebRtcSpl_MaxAbsValueW16_mips;
-  WebRtcSpl_MaxValueW16 = WebRtcSpl_MaxValueW16_mips;
-  WebRtcSpl_MaxValueW32 = WebRtcSpl_MaxValueW32_mips;
-  WebRtcSpl_MinValueW16 = WebRtcSpl_MinValueW16_mips;
-  WebRtcSpl_MinValueW32 = WebRtcSpl_MinValueW32_mips;
-  WebRtcSpl_CrossCorrelation = WebRtcSpl_CrossCorrelation_mips;
-  WebRtcSpl_DownsampleFast = WebRtcSpl_DownsampleFast_mips;
-#if defined(MIPS_DSP_R1_LE)
-  WebRtcSpl_MaxAbsValueW32 = WebRtcSpl_MaxAbsValueW32_mips;
-  WebRtcSpl_ScaleAndAddVectorsWithRound =
-      WebRtcSpl_ScaleAndAddVectorsWithRound_mips;
-#else
-  WebRtcSpl_MaxAbsValueW32 = WebRtcSpl_MaxAbsValueW32C;
-  WebRtcSpl_ScaleAndAddVectorsWithRound =
-      WebRtcSpl_ScaleAndAddVectorsWithRoundC;
-#endif
-}
-#endif
-
-static void InitFunctionPointers(void) {
-#if defined(WEBRTC_HAS_NEON)
-  InitPointersToNeon();
-#elif defined(MIPS32_LE)
-  InitPointersToMIPS();
-#else
-  InitPointersToC();
-#endif  /* WEBRTC_HAS_NEON */
-}
-
-#if defined(WEBRTC_POSIX)
-#include <pthread.h>
-
-static void once(void (*func)(void)) {
-  static pthread_once_t lock = PTHREAD_ONCE_INIT;
-  pthread_once(&lock, func);
-}
-
-#elif defined(_WIN32)
-#include <windows.h>
-
-static void once(void (*func)(void)) {
-  /* Didn't use InitializeCriticalSection() since there's no race-free context
-   * in which to execute it.
-   *
-   * TODO(kma): Change to different implementation (e.g.
-   * InterlockedCompareExchangePointer) to avoid issues similar to
-   * http://code.google.com/p/webm/issues/detail?id=467.
-   */
-  static CRITICAL_SECTION lock = {(void *)((size_t)-1), -1, 0, 0, 0, 0};
-  static int done = 0;
-
-  EnterCriticalSection(&lock);
-  if (!done) {
-    func();
-    done = 1;
-  }
-  LeaveCriticalSection(&lock);
-}
-
-/* There's no fallback version as an #else block here to ensure thread safety.
- * In case of neither pthread for WEBRTC_POSIX nor _WIN32 is present, build
- * system should pick it up.
- */
-#endif  /* WEBRTC_POSIX */
-
-void WebRtcSpl_Init() {
-  once(InitFunctionPointers);
-}
diff --git a/common_audio/signal_processing/spl_inl.c b/common_audio/signal_processing/spl_inl.c
deleted file mode 100644
index efa6a65..0000000
--- a/common_audio/signal_processing/spl_inl.c
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- *  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 <stdint.h>
-
-#include "webrtc/common_audio/signal_processing/include/spl_inl.h"
-
-// Table used by WebRtcSpl_CountLeadingZeros32_NotBuiltin. For each uint32_t n
-// that's a sequence of 0 bits followed by a sequence of 1 bits, the entry at
-// index (n * 0x8c0b2891) >> 26 in this table gives the number of zero bits in
-// n.
-const int8_t kWebRtcSpl_CountLeadingZeros32_Table[64] = {
-    32, 8,  17, -1, -1, 14, -1, -1, -1, 20, -1, -1, -1, 28, -1, 18,
-    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0,  26, 25, 24,
-    4,  11, 23, 31, 3,  7,  10, 16, 22, 30, -1, -1, 2,  6,  13, 9,
-    -1, 15, -1, 21, -1, 29, 19, -1, -1, -1, -1, -1, 1,  27, 5,  12,
-};
diff --git a/common_audio/signal_processing/spl_sqrt.c b/common_audio/signal_processing/spl_sqrt.c
deleted file mode 100644
index f79ac9f..0000000
--- a/common_audio/signal_processing/spl_sqrt.c
+++ /dev/null
@@ -1,194 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-
-/*
- * This file contains the function WebRtcSpl_Sqrt().
- * The description header can be found in signal_processing_library.h
- *
- */
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
-
-int32_t WebRtcSpl_SqrtLocal(int32_t in);
-
-int32_t WebRtcSpl_SqrtLocal(int32_t in)
-{
-
-    int16_t x_half, t16;
-    int32_t A, B, x2;
-
-    /* The following block performs:
-     y=in/2
-     x=y-2^30
-     x_half=x/2^31
-     t = 1 + (x_half) - 0.5*((x_half)^2) + 0.5*((x_half)^3) - 0.625*((x_half)^4)
-         + 0.875*((x_half)^5)
-     */
-
-    B = in / 2;
-
-    B = B - ((int32_t)0x40000000); // B = in/2 - 1/2
-    x_half = (int16_t)(B >> 16);  // x_half = x/2 = (in-1)/2
-    B = B + ((int32_t)0x40000000); // B = 1 + x/2
-    B = B + ((int32_t)0x40000000); // Add 0.5 twice (since 1.0 does not exist in Q31)
-
-    x2 = ((int32_t)x_half) * ((int32_t)x_half) * 2; // A = (x/2)^2
-    A = -x2; // A = -(x/2)^2
-    B = B + (A >> 1); // B = 1 + x/2 - 0.5*(x/2)^2
-
-    A >>= 16;
-    A = A * A * 2; // A = (x/2)^4
-    t16 = (int16_t)(A >> 16);
-    B += -20480 * t16 * 2;  // B = B - 0.625*A
-    // After this, B = 1 + x/2 - 0.5*(x/2)^2 - 0.625*(x/2)^4
-
-    A = x_half * t16 * 2;  // A = (x/2)^5
-    t16 = (int16_t)(A >> 16);
-    B += 28672 * t16 * 2;  // B = B + 0.875*A
-    // After this, B = 1 + x/2 - 0.5*(x/2)^2 - 0.625*(x/2)^4 + 0.875*(x/2)^5
-
-    t16 = (int16_t)(x2 >> 16);
-    A = x_half * t16 * 2;  // A = x/2^3
-
-    B = B + (A >> 1); // B = B + 0.5*A
-    // After this, B = 1 + x/2 - 0.5*(x/2)^2 + 0.5*(x/2)^3 - 0.625*(x/2)^4 + 0.875*(x/2)^5
-
-    B = B + ((int32_t)32768); // Round off bit
-
-    return B;
-}
-
-int32_t WebRtcSpl_Sqrt(int32_t value)
-{
-    /*
-     Algorithm:
-
-     Six term Taylor Series is used here to compute the square root of a number
-     y^0.5 = (1+x)^0.5 where x = y-1
-     = 1+(x/2)-0.5*((x/2)^2+0.5*((x/2)^3-0.625*((x/2)^4+0.875*((x/2)^5)
-     0.5 <= x < 1
-
-     Example of how the algorithm works, with ut=sqrt(in), and
-     with in=73632 and ut=271 (even shift value case):
-
-     in=73632
-     y= in/131072
-     x=y-1
-     t = 1 + (x/2) - 0.5*((x/2)^2) + 0.5*((x/2)^3) - 0.625*((x/2)^4) + 0.875*((x/2)^5)
-     ut=t*(1/sqrt(2))*512
-
-     or:
-
-     in=73632
-     in2=73632*2^14
-     y= in2/2^31
-     x=y-1
-     t = 1 + (x/2) - 0.5*((x/2)^2) + 0.5*((x/2)^3) - 0.625*((x/2)^4) + 0.875*((x/2)^5)
-     ut=t*(1/sqrt(2))
-     ut2=ut*2^9
-
-     which gives:
-
-     in  = 73632
-     in2 = 1206386688
-     y   = 0.56176757812500
-     x   = -0.43823242187500
-     t   = 0.74973506527313
-     ut  = 0.53014274874797
-     ut2 = 2.714330873589594e+002
-
-     or:
-
-     in=73632
-     in2=73632*2^14
-     y=in2/2
-     x=y-2^30
-     x_half=x/2^31
-     t = 1 + (x_half) - 0.5*((x_half)^2) + 0.5*((x_half)^3) - 0.625*((x_half)^4)
-         + 0.875*((x_half)^5)
-     ut=t*(1/sqrt(2))
-     ut2=ut*2^9
-
-     which gives:
-
-     in  = 73632
-     in2 = 1206386688
-     y   = 603193344
-     x   = -470548480
-     x_half =  -0.21911621093750
-     t   = 0.74973506527313
-     ut  = 0.53014274874797
-     ut2 = 2.714330873589594e+002
-
-     */
-
-    int16_t x_norm, nshift, t16, sh;
-    int32_t A;
-
-    int16_t k_sqrt_2 = 23170; // 1/sqrt2 (==5a82)
-
-    A = value;
-
-    // The convention in this function is to calculate sqrt(abs(A)). Negate the
-    // input if it is negative.
-    if (A < 0) {
-        if (A == WEBRTC_SPL_WORD32_MIN) {
-            // This number cannot be held in an int32_t after negating.
-            // Map it to the maximum positive value.
-            A = WEBRTC_SPL_WORD32_MAX;
-        } else {
-            A = -A;
-        }
-    } else if (A == 0) {
-        return 0;  // sqrt(0) = 0
-    }
-
-    sh = WebRtcSpl_NormW32(A); // # shifts to normalize A
-    A = WEBRTC_SPL_LSHIFT_W32(A, sh); // Normalize A
-    if (A < (WEBRTC_SPL_WORD32_MAX - 32767))
-    {
-        A = A + ((int32_t)32768); // Round off bit
-    } else
-    {
-        A = WEBRTC_SPL_WORD32_MAX;
-    }
-
-    x_norm = (int16_t)(A >> 16);  // x_norm = AH
-
-    nshift = (sh / 2);
-    RTC_DCHECK_GE(nshift, 0);
-
-    A = (int32_t)WEBRTC_SPL_LSHIFT_W32((int32_t)x_norm, 16);
-    A = WEBRTC_SPL_ABS_W32(A); // A = abs(x_norm<<16)
-    A = WebRtcSpl_SqrtLocal(A); // A = sqrt(A)
-
-    if (2 * nshift == sh) {
-        // Even shift value case
-
-        t16 = (int16_t)(A >> 16);  // t16 = AH
-
-        A = k_sqrt_2 * t16 * 2;  // A = 1/sqrt(2)*t16
-        A = A + ((int32_t)32768); // Round off
-        A = A & ((int32_t)0x7fff0000); // Round off
-
-        A >>= 15;  // A = A>>16
-
-    } else
-    {
-        A >>= 16;  // A = A>>16
-    }
-
-    A = A & ((int32_t)0x0000ffff);
-    A >>= nshift;  // De-normalize the result.
-
-    return A;
-}
diff --git a/common_audio/signal_processing/spl_sqrt_floor.c b/common_audio/signal_processing/spl_sqrt_floor.c
deleted file mode 100644
index 370307a..0000000
--- a/common_audio/signal_processing/spl_sqrt_floor.c
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Written by Wilco Dijkstra, 1996. The following email exchange establishes the
- * license.
- *
- * From: Wilco Dijkstra <Wilco.Dijkstra@ntlworld.com>
- * Date: Fri, Jun 24, 2011 at 3:20 AM
- * Subject: Re: sqrt routine
- * To: Kevin Ma <kma@google.com>
- * Hi Kevin,
- * Thanks for asking. Those routines are public domain (originally posted to
- * comp.sys.arm a long time ago), so you can use them freely for any purpose.
- * Cheers,
- * Wilco
- *
- * ----- Original Message -----
- * From: "Kevin Ma" <kma@google.com>
- * To: <Wilco.Dijkstra@ntlworld.com>
- * Sent: Thursday, June 23, 2011 11:44 PM
- * Subject: Fwd: sqrt routine
- * Hi Wilco,
- * I saw your sqrt routine from several web sites, including
- * http://www.finesse.demon.co.uk/steven/sqrt.html.
- * Just wonder if there's any copyright information with your Successive
- * approximation routines, or if I can freely use it for any purpose.
- * Thanks.
- * Kevin
- */
-
-// Minor modifications in code style for WebRTC, 2012.
-
-#include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
-
-/*
- * Algorithm:
- * Successive approximation of the equation (root + delta) ^ 2 = N
- * until delta < 1. If delta < 1 we have the integer part of SQRT (N).
- * Use delta = 2^i for i = 15 .. 0.
- *
- * Output precision is 16 bits. Note for large input values (close to
- * 0x7FFFFFFF), bit 15 (the highest bit of the low 16-bit half word)
- * contains the MSB information (a non-sign value). Do with caution
- * if you need to cast the output to int16_t type.
- *
- * If the input value is negative, it returns 0.
- */
-
-#define WEBRTC_SPL_SQRT_ITER(N)                 \
-  try1 = root + (1 << (N));                     \
-  if (value >= try1 << (N))                     \
-  {                                             \
-    value -= try1 << (N);                       \
-    root |= 2 << (N);                           \
-  }
-
-int32_t WebRtcSpl_SqrtFloor(int32_t value)
-{
-  int32_t root = 0, try1;
-
-  WEBRTC_SPL_SQRT_ITER (15);
-  WEBRTC_SPL_SQRT_ITER (14);
-  WEBRTC_SPL_SQRT_ITER (13);
-  WEBRTC_SPL_SQRT_ITER (12);
-  WEBRTC_SPL_SQRT_ITER (11);
-  WEBRTC_SPL_SQRT_ITER (10);
-  WEBRTC_SPL_SQRT_ITER ( 9);
-  WEBRTC_SPL_SQRT_ITER ( 8);
-  WEBRTC_SPL_SQRT_ITER ( 7);
-  WEBRTC_SPL_SQRT_ITER ( 6);
-  WEBRTC_SPL_SQRT_ITER ( 5);
-  WEBRTC_SPL_SQRT_ITER ( 4);
-  WEBRTC_SPL_SQRT_ITER ( 3);
-  WEBRTC_SPL_SQRT_ITER ( 2);
-  WEBRTC_SPL_SQRT_ITER ( 1);
-  WEBRTC_SPL_SQRT_ITER ( 0);
-
-  return root >> 1;
-}
diff --git a/common_audio/signal_processing/spl_sqrt_floor_arm.S b/common_audio/signal_processing/spl_sqrt_floor_arm.S
deleted file mode 100644
index 72cd2d9..0000000
--- a/common_audio/signal_processing/spl_sqrt_floor_arm.S
+++ /dev/null
@@ -1,110 +0,0 @@
-@
-@ Written by Wilco Dijkstra, 1996. The following email exchange establishes the
-@ license.
-@
-@ From: Wilco Dijkstra <Wilco.Dijkstra@ntlworld.com>
-@ Date: Fri, Jun 24, 2011 at 3:20 AM
-@ Subject: Re: sqrt routine
-@ To: Kevin Ma <kma@google.com>
-@ Hi Kevin,
-@ Thanks for asking. Those routines are public domain (originally posted to
-@ comp.sys.arm a long time ago), so you can use them freely for any purpose.
-@ Cheers,
-@ Wilco
-@
-@ ----- Original Message -----
-@ From: "Kevin Ma" <kma@google.com>
-@ To: <Wilco.Dijkstra@ntlworld.com>
-@ Sent: Thursday, June 23, 2011 11:44 PM
-@ Subject: Fwd: sqrt routine
-@ Hi Wilco,
-@ I saw your sqrt routine from several web sites, including
-@ http://www.finesse.demon.co.uk/steven/sqrt.html.
-@ Just wonder if there's any copyright information with your Successive
-@ approximation routines, or if I can freely use it for any purpose.
-@ Thanks.
-@ Kevin
-
-@ Minor modifications in code style for WebRTC, 2012.
-@ Output is bit-exact with the reference C code in spl_sqrt_floor.c.
-
-@ Input :             r0 32 bit unsigned integer
-@ Output:             r0 = INT (SQRT (r0)), precision is 16 bits
-@ Registers touched:  r1, r2
-
-#include "webrtc/system_wrappers/include/asm_defines.h"
-
-GLOBAL_FUNCTION WebRtcSpl_SqrtFloor
-.align  2
-DEFINE_FUNCTION WebRtcSpl_SqrtFloor
-  mov    r1, #3 << 30
-  mov    r2, #1 << 30
-
-  @ unroll for i = 0 .. 15
-
-  cmp    r0, r2, ror #2 * 0
-  subhs  r0, r0, r2, ror #2 * 0
-  adc    r2, r1, r2, lsl #1
-
-  cmp    r0, r2, ror #2 * 1
-  subhs  r0, r0, r2, ror #2 * 1
-  adc    r2, r1, r2, lsl #1
-
-  cmp    r0, r2, ror #2 * 2
-  subhs  r0, r0, r2, ror #2 * 2
-  adc    r2, r1, r2, lsl #1
-
-  cmp    r0, r2, ror #2 * 3
-  subhs  r0, r0, r2, ror #2 * 3
-  adc    r2, r1, r2, lsl #1
-
-  cmp    r0, r2, ror #2 * 4
-  subhs  r0, r0, r2, ror #2 * 4
-  adc    r2, r1, r2, lsl #1
-
-  cmp    r0, r2, ror #2 * 5
-  subhs  r0, r0, r2, ror #2 * 5
-  adc    r2, r1, r2, lsl #1
-
-  cmp    r0, r2, ror #2 * 6
-  subhs  r0, r0, r2, ror #2 * 6
-  adc    r2, r1, r2, lsl #1
-
-  cmp    r0, r2, ror #2 * 7
-  subhs  r0, r0, r2, ror #2 * 7
-  adc    r2, r1, r2, lsl #1
-
-  cmp    r0, r2, ror #2 * 8
-  subhs  r0, r0, r2, ror #2 * 8
-  adc    r2, r1, r2, lsl #1
-
-  cmp    r0, r2, ror #2 * 9
-  subhs  r0, r0, r2, ror #2 * 9
-  adc    r2, r1, r2, lsl #1
-
-  cmp    r0, r2, ror #2 * 10
-  subhs  r0, r0, r2, ror #2 * 10
-  adc    r2, r1, r2, lsl #1
-
-  cmp    r0, r2, ror #2 * 11
-  subhs  r0, r0, r2, ror #2 * 11
-  adc    r2, r1, r2, lsl #1
-
-  cmp    r0, r2, ror #2 * 12
-  subhs  r0, r0, r2, ror #2 * 12
-  adc    r2, r1, r2, lsl #1
-
-  cmp    r0, r2, ror #2 * 13
-  subhs  r0, r0, r2, ror #2 * 13
-  adc    r2, r1, r2, lsl #1
-
-  cmp    r0, r2, ror #2 * 14
-  subhs  r0, r0, r2, ror #2 * 14
-  adc    r2, r1, r2, lsl #1
-
-  cmp    r0, r2, ror #2 * 15
-  subhs  r0, r0, r2, ror #2 * 15
-  adc    r2, r1, r2, lsl #1
-
-  bic    r0, r2, #3 << 30  @ for rounding add: cmp r0, r2  adc r2, #1
-  bx lr
diff --git a/common_audio/signal_processing/spl_sqrt_floor_mips.c b/common_audio/signal_processing/spl_sqrt_floor_mips.c
deleted file mode 100644
index 8716459..0000000
--- a/common_audio/signal_processing/spl_sqrt_floor_mips.c
+++ /dev/null
@@ -1,207 +0,0 @@
-/*
- * Written by Wilco Dijkstra, 1996. The following email exchange establishes the
- * license.
- *
- * From: Wilco Dijkstra <Wilco.Dijkstra@ntlworld.com>
- * Date: Fri, Jun 24, 2011 at 3:20 AM
- * Subject: Re: sqrt routine
- * To: Kevin Ma <kma@google.com>
- * Hi Kevin,
- * Thanks for asking. Those routines are public domain (originally posted to
- * comp.sys.arm a long time ago), so you can use them freely for any purpose.
- * Cheers,
- * Wilco
- *
- * ----- Original Message -----
- * From: "Kevin Ma" <kma@google.com>
- * To: <Wilco.Dijkstra@ntlworld.com>
- * Sent: Thursday, June 23, 2011 11:44 PM
- * Subject: Fwd: sqrt routine
- * Hi Wilco,
- * I saw your sqrt routine from several web sites, including
- * http://www.finesse.demon.co.uk/steven/sqrt.html.
- * Just wonder if there's any copyright information with your Successive
- * approximation routines, or if I can freely use it for any purpose.
- * Thanks.
- * Kevin
- */
-
-// Minor modifications in code style for WebRTC, 2012.
-// Code optimizations for MIPS, 2013.
-
-#include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
-
-/*
- * Algorithm:
- * Successive approximation of the equation (root + delta) ^ 2 = N
- * until delta < 1. If delta < 1 we have the integer part of SQRT (N).
- * Use delta = 2^i for i = 15 .. 0.
- *
- * Output precision is 16 bits. Note for large input values (close to
- * 0x7FFFFFFF), bit 15 (the highest bit of the low 16-bit half word)
- * contains the MSB information (a non-sign value). Do with caution
- * if you need to cast the output to int16_t type.
- *
- * If the input value is negative, it returns 0.
- */
-
-
-int32_t WebRtcSpl_SqrtFloor(int32_t value)
-{
-  int32_t root = 0, tmp1, tmp2, tmp3, tmp4;
-
-  __asm __volatile(
-    ".set   push                                       \n\t"
-    ".set   noreorder                                  \n\t"
-
-    "lui    %[tmp1],      0x4000                       \n\t"
-    "slt    %[tmp2],      %[value],     %[tmp1]        \n\t"
-    "sub    %[tmp3],      %[value],     %[tmp1]        \n\t"
-    "lui    %[tmp1],      0x1                          \n\t"
-    "or     %[tmp4],      %[root],      %[tmp1]        \n\t"
-    "movz   %[value],     %[tmp3],      %[tmp2]        \n\t"
-    "movz   %[root],      %[tmp4],      %[tmp2]        \n\t"
-
-    "addiu  %[tmp1],      $0,           0x4000         \n\t"
-    "addu   %[tmp1],      %[tmp1],      %[root]        \n\t"
-    "sll    %[tmp1],      14                           \n\t"
-    "slt    %[tmp2],      %[value],     %[tmp1]        \n\t"
-    "subu   %[tmp3],      %[value],     %[tmp1]        \n\t"
-    "ori    %[tmp4],      %[root],      0x8000         \n\t"
-    "movz   %[value],     %[tmp3],      %[tmp2]        \n\t"
-    "movz   %[root],      %[tmp4],      %[tmp2]        \n\t"
-
-    "addiu  %[tmp1],      $0,           0x2000         \n\t"
-    "addu   %[tmp1],      %[tmp1],      %[root]        \n\t"
-    "sll    %[tmp1],      13                           \n\t"
-    "slt    %[tmp2],      %[value],     %[tmp1]        \n\t"
-    "subu   %[tmp3],      %[value],     %[tmp1]        \n\t"
-    "ori    %[tmp4],      %[root],      0x4000         \n\t"
-    "movz   %[value],     %[tmp3],      %[tmp2]        \n\t"
-    "movz   %[root],      %[tmp4],      %[tmp2]        \n\t"
-
-    "addiu  %[tmp1],      $0,           0x1000         \n\t"
-    "addu   %[tmp1],      %[tmp1],      %[root]        \n\t"
-    "sll    %[tmp1],      12                           \n\t"
-    "slt    %[tmp2],      %[value],     %[tmp1]        \n\t"
-    "subu   %[tmp3],      %[value],     %[tmp1]        \n\t"
-    "ori    %[tmp4],      %[root],      0x2000         \n\t"
-    "movz   %[value],     %[tmp3],      %[tmp2]        \n\t"
-    "movz   %[root],      %[tmp4],      %[tmp2]        \n\t"
-
-    "addiu  %[tmp1],      $0,           0x800          \n\t"
-    "addu   %[tmp1],      %[tmp1],      %[root]        \n\t"
-    "sll    %[tmp1],      11                           \n\t"
-    "slt    %[tmp2],      %[value],     %[tmp1]        \n\t"
-    "subu   %[tmp3],      %[value],     %[tmp1]        \n\t"
-    "ori    %[tmp4],      %[root],      0x1000         \n\t"
-    "movz   %[value],     %[tmp3],      %[tmp2]        \n\t"
-    "movz   %[root],      %[tmp4],      %[tmp2]        \n\t"
-
-    "addiu  %[tmp1],      $0,           0x400          \n\t"
-    "addu   %[tmp1],      %[tmp1],      %[root]        \n\t"
-    "sll    %[tmp1],      10                           \n\t"
-    "slt    %[tmp2],      %[value],     %[tmp1]        \n\t"
-    "subu   %[tmp3],      %[value],     %[tmp1]        \n\t"
-    "ori    %[tmp4],      %[root],      0x800          \n\t"
-    "movz   %[value],     %[tmp3],      %[tmp2]        \n\t"
-    "movz   %[root],      %[tmp4],      %[tmp2]        \n\t"
-
-    "addiu  %[tmp1],      $0,           0x200          \n\t"
-    "addu   %[tmp1],      %[tmp1],      %[root]        \n\t"
-    "sll    %[tmp1],      9                            \n\t"
-    "slt    %[tmp2],      %[value],     %[tmp1]        \n\t"
-    "subu   %[tmp3],      %[value],     %[tmp1]        \n\t"
-    "ori    %[tmp4],      %[root],       0x400         \n\t"
-    "movz   %[value],     %[tmp3],      %[tmp2]        \n\t"
-    "movz   %[root],      %[tmp4],      %[tmp2]        \n\t"
-
-    "addiu  %[tmp1],      $0,           0x100          \n\t"
-    "addu   %[tmp1],      %[tmp1],      %[root]        \n\t"
-    "sll    %[tmp1],      8                            \n\t"
-    "slt    %[tmp2],      %[value],     %[tmp1]        \n\t"
-    "subu   %[tmp3],      %[value],     %[tmp1]        \n\t"
-    "ori    %[tmp4],      %[root],      0x200          \n\t"
-    "movz   %[value],     %[tmp3],      %[tmp2]        \n\t"
-    "movz   %[root],      %[tmp4],      %[tmp2]        \n\t"
-
-    "addiu  %[tmp1],      $0,           0x80           \n\t"
-    "addu   %[tmp1],      %[tmp1],      %[root]        \n\t"
-    "sll    %[tmp1],      7                            \n\t"
-    "slt    %[tmp2],      %[value],     %[tmp1]        \n\t"
-    "subu   %[tmp3],      %[value],     %[tmp1]        \n\t"
-    "ori    %[tmp4],      %[root],      0x100          \n\t"
-    "movz   %[value],     %[tmp3],      %[tmp2]        \n\t"
-    "movz   %[root],      %[tmp4],      %[tmp2]        \n\t"
-
-    "addiu  %[tmp1],      $0,           0x40           \n\t"
-    "addu   %[tmp1],      %[tmp1],      %[root]        \n\t"
-    "sll    %[tmp1],      6                            \n\t"
-    "slt    %[tmp2],      %[value],     %[tmp1]        \n\t"
-    "subu   %[tmp3],      %[value],     %[tmp1]        \n\t"
-    "ori    %[tmp4],      %[root],      0x80           \n\t"
-    "movz   %[value],     %[tmp3],      %[tmp2]        \n\t"
-    "movz   %[root],      %[tmp4],      %[tmp2]        \n\t"
-
-    "addiu  %[tmp1],      $0,           0x20           \n\t"
-    "addu   %[tmp1],      %[tmp1],      %[root]        \n\t"
-    "sll    %[tmp1],      5                            \n\t"
-    "slt    %[tmp2],      %[value],     %[tmp1]        \n\t"
-    "subu   %[tmp3],      %[value],     %[tmp1]        \n\t"
-    "ori    %[tmp4],      %[root],      0x40           \n\t"
-    "movz   %[value],     %[tmp3],      %[tmp2]        \n\t"
-    "movz   %[root],      %[tmp4],      %[tmp2]        \n\t"
-
-    "addiu  %[tmp1],      $0,           0x10           \n\t"
-    "addu   %[tmp1],      %[tmp1],      %[root]        \n\t"
-    "sll    %[tmp1],      4                            \n\t"
-    "slt    %[tmp2],      %[value],     %[tmp1]        \n\t"
-    "subu   %[tmp3],      %[value],     %[tmp1]        \n\t"
-    "ori    %[tmp4],      %[root],      0x20           \n\t"
-    "movz   %[value],     %[tmp3],      %[tmp2]        \n\t"
-    "movz   %[root],      %[tmp4],      %[tmp2]        \n\t"
-
-    "addiu  %[tmp1],      $0,           0x8            \n\t"
-    "addu   %[tmp1],      %[tmp1],      %[root]        \n\t"
-    "sll    %[tmp1],      3                            \n\t"
-    "slt    %[tmp2],      %[value],     %[tmp1]        \n\t"
-    "subu   %[tmp3],      %[value],     %[tmp1]        \n\t"
-    "ori    %[tmp4],      %[root],      0x10           \n\t"
-    "movz   %[value],     %[tmp3],      %[tmp2]        \n\t"
-    "movz   %[root],      %[tmp4],      %[tmp2]        \n\t"
-
-    "addiu  %[tmp1],      $0,           0x4            \n\t"
-    "addu   %[tmp1],      %[tmp1],      %[root]        \n\t"
-    "sll    %[tmp1],      2                            \n\t"
-    "slt    %[tmp2],      %[value],     %[tmp1]        \n\t"
-    "subu   %[tmp3],      %[value],     %[tmp1]        \n\t"
-    "ori    %[tmp4],      %[root],      0x8            \n\t"
-    "movz   %[value],     %[tmp3],      %[tmp2]        \n\t"
-    "movz   %[root],      %[tmp4],      %[tmp2]        \n\t"
-
-    "addiu  %[tmp1],      $0,           0x2            \n\t"
-    "addu   %[tmp1],      %[tmp1],      %[root]        \n\t"
-    "sll    %[tmp1],      1                            \n\t"
-    "slt    %[tmp2],      %[value],     %[tmp1]        \n\t"
-    "subu   %[tmp3],      %[value],     %[tmp1]        \n\t"
-    "ori    %[tmp4],      %[root],      0x4            \n\t"
-    "movz   %[value],     %[tmp3],      %[tmp2]        \n\t"
-    "movz   %[root],      %[tmp4],      %[tmp2]        \n\t"
-
-    "addiu  %[tmp1],      $0,           0x1            \n\t"
-    "addu   %[tmp1],      %[tmp1],      %[root]        \n\t"
-    "slt    %[tmp2],      %[value],     %[tmp1]        \n\t"
-    "ori    %[tmp4],      %[root],      0x2            \n\t"
-    "movz   %[root],      %[tmp4],      %[tmp2]        \n\t"
-
-    ".set   pop                                        \n\t"
-
-    : [root] "+r" (root), [value] "+r" (value),
-      [tmp1] "=&r" (tmp1), [tmp2] "=&r" (tmp2),
-      [tmp3] "=&r" (tmp3), [tmp4] "=&r" (tmp4)
-    :
-  );
-
-  return root >> 1;
-}
-
diff --git a/common_audio/signal_processing/splitting_filter.c b/common_audio/signal_processing/splitting_filter.c
deleted file mode 100644
index 4a179a8..0000000
--- a/common_audio/signal_processing/splitting_filter.c
+++ /dev/null
@@ -1,207 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/*
- * This file contains the splitting filter functions.
- *
- */
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
-
-// Maximum number of samples in a low/high-band frame.
-enum
-{
-    kMaxBandFrameLength = 320  // 10 ms at 64 kHz.
-};
-
-// QMF filter coefficients in Q16.
-static const uint16_t WebRtcSpl_kAllPassFilter1[3] = {6418, 36982, 57261};
-static const uint16_t WebRtcSpl_kAllPassFilter2[3] = {21333, 49062, 63010};
-
-///////////////////////////////////////////////////////////////////////////////////////////////
-// WebRtcSpl_AllPassQMF(...)
-//
-// Allpass filter used by the analysis and synthesis parts of the QMF filter.
-//
-// Input:
-//    - in_data             : Input data sequence (Q10)
-//    - data_length         : Length of data sequence (>2)
-//    - filter_coefficients : Filter coefficients (length 3, Q16)
-//
-// Input & Output:
-//    - filter_state        : Filter state (length 6, Q10).
-//
-// Output:
-//    - out_data            : Output data sequence (Q10), length equal to
-//                            |data_length|
-//
-
-void WebRtcSpl_AllPassQMF(int32_t* in_data, size_t data_length,
-                          int32_t* out_data, const uint16_t* filter_coefficients,
-                          int32_t* filter_state)
-{
-    // The procedure is to filter the input with three first order all pass filters
-    // (cascade operations).
-    //
-    //         a_3 + q^-1    a_2 + q^-1    a_1 + q^-1
-    // y[n] =  -----------   -----------   -----------   x[n]
-    //         1 + a_3q^-1   1 + a_2q^-1   1 + a_1q^-1
-    //
-    // The input vector |filter_coefficients| includes these three filter coefficients.
-    // The filter state contains the in_data state, in_data[-1], followed by
-    // the out_data state, out_data[-1]. This is repeated for each cascade.
-    // The first cascade filter will filter the |in_data| and store the output in
-    // |out_data|. The second will the take the |out_data| as input and make an
-    // intermediate storage in |in_data|, to save memory. The third, and final, cascade
-    // filter operation takes the |in_data| (which is the output from the previous cascade
-    // filter) and store the output in |out_data|.
-    // Note that the input vector values are changed during the process.
-    size_t k;
-    int32_t diff;
-    // First all-pass cascade; filter from in_data to out_data.
-
-    // Let y_i[n] indicate the output of cascade filter i (with filter coefficient a_i) at
-    // vector position n. Then the final output will be y[n] = y_3[n]
-
-    // First loop, use the states stored in memory.
-    // "diff" should be safe from wrap around since max values are 2^25
-    // diff = (x[0] - y_1[-1])
-    diff = WebRtcSpl_SubSatW32(in_data[0], filter_state[1]);
-    // y_1[0] =  x[-1] + a_1 * (x[0] - y_1[-1])
-    out_data[0] = WEBRTC_SPL_SCALEDIFF32(filter_coefficients[0], diff, filter_state[0]);
-
-    // For the remaining loops, use previous values.
-    for (k = 1; k < data_length; k++)
-    {
-        // diff = (x[n] - y_1[n-1])
-        diff = WebRtcSpl_SubSatW32(in_data[k], out_data[k - 1]);
-        // y_1[n] =  x[n-1] + a_1 * (x[n] - y_1[n-1])
-        out_data[k] = WEBRTC_SPL_SCALEDIFF32(filter_coefficients[0], diff, in_data[k - 1]);
-    }
-
-    // Update states.
-    filter_state[0] = in_data[data_length - 1]; // x[N-1], becomes x[-1] next time
-    filter_state[1] = out_data[data_length - 1]; // y_1[N-1], becomes y_1[-1] next time
-
-    // Second all-pass cascade; filter from out_data to in_data.
-    // diff = (y_1[0] - y_2[-1])
-    diff = WebRtcSpl_SubSatW32(out_data[0], filter_state[3]);
-    // y_2[0] =  y_1[-1] + a_2 * (y_1[0] - y_2[-1])
-    in_data[0] = WEBRTC_SPL_SCALEDIFF32(filter_coefficients[1], diff, filter_state[2]);
-    for (k = 1; k < data_length; k++)
-    {
-        // diff = (y_1[n] - y_2[n-1])
-        diff = WebRtcSpl_SubSatW32(out_data[k], in_data[k - 1]);
-        // y_2[0] =  y_1[-1] + a_2 * (y_1[0] - y_2[-1])
-        in_data[k] = WEBRTC_SPL_SCALEDIFF32(filter_coefficients[1], diff, out_data[k-1]);
-    }
-
-    filter_state[2] = out_data[data_length - 1]; // y_1[N-1], becomes y_1[-1] next time
-    filter_state[3] = in_data[data_length - 1]; // y_2[N-1], becomes y_2[-1] next time
-
-    // Third all-pass cascade; filter from in_data to out_data.
-    // diff = (y_2[0] - y[-1])
-    diff = WebRtcSpl_SubSatW32(in_data[0], filter_state[5]);
-    // y[0] =  y_2[-1] + a_3 * (y_2[0] - y[-1])
-    out_data[0] = WEBRTC_SPL_SCALEDIFF32(filter_coefficients[2], diff, filter_state[4]);
-    for (k = 1; k < data_length; k++)
-    {
-        // diff = (y_2[n] - y[n-1])
-        diff = WebRtcSpl_SubSatW32(in_data[k], out_data[k - 1]);
-        // y[n] =  y_2[n-1] + a_3 * (y_2[n] - y[n-1])
-        out_data[k] = WEBRTC_SPL_SCALEDIFF32(filter_coefficients[2], diff, in_data[k-1]);
-    }
-    filter_state[4] = in_data[data_length - 1]; // y_2[N-1], becomes y_2[-1] next time
-    filter_state[5] = out_data[data_length - 1]; // y[N-1], becomes y[-1] next time
-}
-
-void WebRtcSpl_AnalysisQMF(const int16_t* in_data, size_t in_data_length,
-                           int16_t* low_band, int16_t* high_band,
-                           int32_t* filter_state1, int32_t* filter_state2)
-{
-    size_t i;
-    int16_t k;
-    int32_t tmp;
-    int32_t half_in1[kMaxBandFrameLength];
-    int32_t half_in2[kMaxBandFrameLength];
-    int32_t filter1[kMaxBandFrameLength];
-    int32_t filter2[kMaxBandFrameLength];
-    const size_t band_length = in_data_length / 2;
-    RTC_DCHECK_EQ(0, in_data_length % 2);
-    RTC_DCHECK_LE(band_length, kMaxBandFrameLength);
-
-    // Split even and odd samples. Also shift them to Q10.
-    for (i = 0, k = 0; i < band_length; i++, k += 2)
-    {
-        half_in2[i] = ((int32_t)in_data[k]) * (1 << 10);
-        half_in1[i] = ((int32_t)in_data[k + 1]) * (1 << 10);
-    }
-
-    // All pass filter even and odd samples, independently.
-    WebRtcSpl_AllPassQMF(half_in1, band_length, filter1,
-                         WebRtcSpl_kAllPassFilter1, filter_state1);
-    WebRtcSpl_AllPassQMF(half_in2, band_length, filter2,
-                         WebRtcSpl_kAllPassFilter2, filter_state2);
-
-    // Take the sum and difference of filtered version of odd and even
-    // branches to get upper & lower band.
-    for (i = 0; i < band_length; i++)
-    {
-        tmp = (filter1[i] + filter2[i] + 1024) >> 11;
-        low_band[i] = WebRtcSpl_SatW32ToW16(tmp);
-
-        tmp = (filter1[i] - filter2[i] + 1024) >> 11;
-        high_band[i] = WebRtcSpl_SatW32ToW16(tmp);
-    }
-}
-
-void WebRtcSpl_SynthesisQMF(const int16_t* low_band, const int16_t* high_band,
-                            size_t band_length, int16_t* out_data,
-                            int32_t* filter_state1, int32_t* filter_state2)
-{
-    int32_t tmp;
-    int32_t half_in1[kMaxBandFrameLength];
-    int32_t half_in2[kMaxBandFrameLength];
-    int32_t filter1[kMaxBandFrameLength];
-    int32_t filter2[kMaxBandFrameLength];
-    size_t i;
-    int16_t k;
-    RTC_DCHECK_LE(band_length, kMaxBandFrameLength);
-
-    // Obtain the sum and difference channels out of upper and lower-band channels.
-    // Also shift to Q10 domain.
-    for (i = 0; i < band_length; i++)
-    {
-        tmp = (int32_t)low_band[i] + (int32_t)high_band[i];
-        half_in1[i] = tmp * (1 << 10);
-        tmp = (int32_t)low_band[i] - (int32_t)high_band[i];
-        half_in2[i] = tmp * (1 << 10);
-    }
-
-    // all-pass filter the sum and difference channels
-    WebRtcSpl_AllPassQMF(half_in1, band_length, filter1,
-                         WebRtcSpl_kAllPassFilter2, filter_state1);
-    WebRtcSpl_AllPassQMF(half_in2, band_length, filter2,
-                         WebRtcSpl_kAllPassFilter1, filter_state2);
-
-    // The filtered signals are even and odd samples of the output. Combine
-    // them. The signals are Q10 should shift them back to Q0 and take care of
-    // saturation.
-    for (i = 0, k = 0; i < band_length; i++)
-    {
-        tmp = (filter2[i] + 512) >> 10;
-        out_data[k++] = WebRtcSpl_SatW32ToW16(tmp);
-
-        tmp = (filter1[i] + 512) >> 10;
-        out_data[k++] = WebRtcSpl_SatW32ToW16(tmp);
-    }
-
-}
diff --git a/common_audio/signal_processing/sqrt_of_one_minus_x_squared.c b/common_audio/signal_processing/sqrt_of_one_minus_x_squared.c
deleted file mode 100644
index ff78b52..0000000
--- a/common_audio/signal_processing/sqrt_of_one_minus_x_squared.c
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-
-/*
- * This file contains the function WebRtcSpl_SqrtOfOneMinusXSquared().
- * The description header can be found in signal_processing_library.h
- *
- */
-
-#include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
-
-void WebRtcSpl_SqrtOfOneMinusXSquared(int16_t *xQ15, size_t vector_length,
-                                      int16_t *yQ15)
-{
-    int32_t sq;
-    size_t m;
-    int16_t tmp;
-
-    for (m = 0; m < vector_length; m++)
-    {
-        tmp = xQ15[m];
-        sq = tmp * tmp;  // x^2 in Q30
-        sq = 1073741823 - sq; // 1-x^2, where 1 ~= 0.99999999906 is 1073741823 in Q30
-        sq = WebRtcSpl_Sqrt(sq); // sqrt(1-x^2) in Q15
-        yQ15[m] = (int16_t)sq;
-    }
-}
diff --git a/common_audio/signal_processing/vector_scaling_operations.c b/common_audio/signal_processing/vector_scaling_operations.c
deleted file mode 100644
index e1f391d..0000000
--- a/common_audio/signal_processing/vector_scaling_operations.c
+++ /dev/null
@@ -1,165 +0,0 @@
-/*
- *  Copyright (c) 2012 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.
- */
-
-
-/*
- * This file contains implementations of the functions
- * WebRtcSpl_VectorBitShiftW16()
- * WebRtcSpl_VectorBitShiftW32()
- * WebRtcSpl_VectorBitShiftW32ToW16()
- * WebRtcSpl_ScaleVector()
- * WebRtcSpl_ScaleVectorWithSat()
- * WebRtcSpl_ScaleAndAddVectors()
- * WebRtcSpl_ScaleAndAddVectorsWithRoundC()
- */
-
-#include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
-
-void WebRtcSpl_VectorBitShiftW16(int16_t *res, size_t length,
-                                 const int16_t *in, int16_t right_shifts)
-{
-    size_t i;
-
-    if (right_shifts > 0)
-    {
-        for (i = length; i > 0; i--)
-        {
-            (*res++) = ((*in++) >> right_shifts);
-        }
-    } else
-    {
-        for (i = length; i > 0; i--)
-        {
-            (*res++) = ((*in++) * (1 << (-right_shifts)));
-        }
-    }
-}
-
-void WebRtcSpl_VectorBitShiftW32(int32_t *out_vector,
-                                 size_t vector_length,
-                                 const int32_t *in_vector,
-                                 int16_t right_shifts)
-{
-    size_t i;
-
-    if (right_shifts > 0)
-    {
-        for (i = vector_length; i > 0; i--)
-        {
-            (*out_vector++) = ((*in_vector++) >> right_shifts);
-        }
-    } else
-    {
-        for (i = vector_length; i > 0; i--)
-        {
-            (*out_vector++) = ((*in_vector++) << (-right_shifts));
-        }
-    }
-}
-
-void WebRtcSpl_VectorBitShiftW32ToW16(int16_t* out, size_t length,
-                                      const int32_t* in, int right_shifts) {
-  size_t i;
-  int32_t tmp_w32;
-
-  if (right_shifts >= 0) {
-    for (i = length; i > 0; i--) {
-      tmp_w32 = (*in++) >> right_shifts;
-      (*out++) = WebRtcSpl_SatW32ToW16(tmp_w32);
-    }
-  } else {
-    int left_shifts = -right_shifts;
-    for (i = length; i > 0; i--) {
-      tmp_w32 = (*in++) << left_shifts;
-      (*out++) = WebRtcSpl_SatW32ToW16(tmp_w32);
-    }
-  }
-}
-
-void WebRtcSpl_ScaleVector(const int16_t *in_vector, int16_t *out_vector,
-                           int16_t gain, size_t in_vector_length,
-                           int16_t right_shifts)
-{
-    // Performs vector operation: out_vector = (gain*in_vector)>>right_shifts
-    size_t i;
-    const int16_t *inptr;
-    int16_t *outptr;
-
-    inptr = in_vector;
-    outptr = out_vector;
-
-    for (i = 0; i < in_vector_length; i++)
-    {
-      *outptr++ = (int16_t)((*inptr++ * gain) >> right_shifts);
-    }
-}
-
-void WebRtcSpl_ScaleVectorWithSat(const int16_t *in_vector, int16_t *out_vector,
-                                 int16_t gain, size_t in_vector_length,
-                                 int16_t right_shifts)
-{
-    // Performs vector operation: out_vector = (gain*in_vector)>>right_shifts
-    size_t i;
-    const int16_t *inptr;
-    int16_t *outptr;
-
-    inptr = in_vector;
-    outptr = out_vector;
-
-    for (i = 0; i < in_vector_length; i++) {
-      *outptr++ = WebRtcSpl_SatW32ToW16((*inptr++ * gain) >> right_shifts);
-    }
-}
-
-void WebRtcSpl_ScaleAndAddVectors(const int16_t *in1, int16_t gain1, int shift1,
-                                  const int16_t *in2, int16_t gain2, int shift2,
-                                  int16_t *out, size_t vector_length)
-{
-    // Performs vector operation: out = (gain1*in1)>>shift1 + (gain2*in2)>>shift2
-    size_t i;
-    const int16_t *in1ptr;
-    const int16_t *in2ptr;
-    int16_t *outptr;
-
-    in1ptr = in1;
-    in2ptr = in2;
-    outptr = out;
-
-    for (i = 0; i < vector_length; i++)
-    {
-      *outptr++ = (int16_t)((gain1 * *in1ptr++) >> shift1) +
-          (int16_t)((gain2 * *in2ptr++) >> shift2);
-    }
-}
-
-// C version of WebRtcSpl_ScaleAndAddVectorsWithRound() for generic platforms.
-int WebRtcSpl_ScaleAndAddVectorsWithRoundC(const int16_t* in_vector1,
-                                           int16_t in_vector1_scale,
-                                           const int16_t* in_vector2,
-                                           int16_t in_vector2_scale,
-                                           int right_shifts,
-                                           int16_t* out_vector,
-                                           size_t length) {
-  size_t i = 0;
-  int round_value = (1 << right_shifts) >> 1;
-
-  if (in_vector1 == NULL || in_vector2 == NULL || out_vector == NULL ||
-      length == 0 || right_shifts < 0) {
-    return -1;
-  }
-
-  for (i = 0; i < length; i++) {
-    out_vector[i] = (int16_t)((
-        in_vector1[i] * in_vector1_scale + in_vector2[i] * in_vector2_scale +
-        round_value) >> right_shifts);
-  }
-
-  return 0;
-}
diff --git a/common_audio/signal_processing/vector_scaling_operations_mips.c b/common_audio/signal_processing/vector_scaling_operations_mips.c
deleted file mode 100644
index dd73eea..0000000
--- a/common_audio/signal_processing/vector_scaling_operations_mips.c
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- *  Copyright (c) 2013 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.
- */
-
-
-/*
- * This file contains implementations of the functions
- * WebRtcSpl_ScaleAndAddVectorsWithRound_mips()
- */
-
-#include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
-
-int WebRtcSpl_ScaleAndAddVectorsWithRound_mips(const int16_t* in_vector1,
-                                               int16_t in_vector1_scale,
-                                               const int16_t* in_vector2,
-                                               int16_t in_vector2_scale,
-                                               int right_shifts,
-                                               int16_t* out_vector,
-                                               size_t length) {
-  int16_t r0 = 0, r1 = 0;
-  int16_t *in1 = (int16_t*)in_vector1;
-  int16_t *in2 = (int16_t*)in_vector2;
-  int16_t *out = out_vector;
-  size_t i = 0;
-  int value32 = 0;
-
-  if (in_vector1 == NULL || in_vector2 == NULL || out_vector == NULL ||
-      length == 0 || right_shifts < 0) {
-    return -1;
-  }
-  for (i = 0; i < length; i++) {
-    __asm __volatile (
-      "lh         %[r0],          0(%[in1])                               \n\t"
-      "lh         %[r1],          0(%[in2])                               \n\t"
-      "mult       %[r0],          %[in_vector1_scale]                     \n\t"
-      "madd       %[r1],          %[in_vector2_scale]                     \n\t"
-      "extrv_r.w  %[value32],     $ac0,               %[right_shifts]     \n\t"
-      "addiu      %[in1],         %[in1],             2                   \n\t"
-      "addiu      %[in2],         %[in2],             2                   \n\t"
-      "sh         %[value32],     0(%[out])                               \n\t"
-      "addiu      %[out],         %[out],             2                   \n\t"
-      : [value32] "=&r" (value32), [out] "+r" (out), [in1] "+r" (in1),
-        [in2] "+r" (in2), [r0] "=&r" (r0), [r1] "=&r" (r1)
-      : [in_vector1_scale] "r" (in_vector1_scale),
-        [in_vector2_scale] "r" (in_vector2_scale),
-        [right_shifts] "r" (right_shifts)
-      : "hi", "lo", "memory"
-    );
-  }
-  return 0;
-}
diff --git a/common_audio/smoothing_filter.cc b/common_audio/smoothing_filter.cc
deleted file mode 100644
index d95662c..0000000
--- a/common_audio/smoothing_filter.cc
+++ /dev/null
@@ -1,144 +0,0 @@
-/*
- *  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/common_audio/smoothing_filter.h"
-
-#include <cmath>
-
-#include "webrtc/rtc_base/timeutils.h"
-
-namespace webrtc {
-
-SmoothingFilterImpl::SmoothingFilterImpl(int init_time_ms)
-    : init_time_ms_(init_time_ms),
-      // Duing the initalization time, we use an increasing alpha. Specifically,
-      //   alpha(n) = exp(-powf(init_factor_, n)),
-      // where |init_factor_| is chosen such that
-      //   alpha(init_time_ms_) = exp(-1.0f / init_time_ms_),
-      init_factor_(init_time_ms_ == 0
-                       ? 0.0f
-                       : powf(init_time_ms_, -1.0f / init_time_ms_)),
-      // |init_const_| is to a factor to help the calculation during
-      // initialization phase.
-      init_const_(init_time_ms_ == 0
-                      ? 0.0f
-                      : init_time_ms_ -
-                            powf(init_time_ms_, 1.0f - 1.0f / init_time_ms_)) {
-  UpdateAlpha(init_time_ms_);
-}
-
-SmoothingFilterImpl::~SmoothingFilterImpl() = default;
-
-void SmoothingFilterImpl::AddSample(float sample) {
-  const int64_t now_ms = rtc::TimeMillis();
-
-  if (!init_end_time_ms_) {
-    // This is equivalent to assuming the filter has been receiving the same
-    // value as the first sample since time -infinity.
-    state_ = last_sample_ = sample;
-    init_end_time_ms_ = rtc::Optional<int64_t>(now_ms + init_time_ms_);
-    last_state_time_ms_ = now_ms;
-    return;
-  }
-
-  ExtrapolateLastSample(now_ms);
-  last_sample_ = sample;
-}
-
-rtc::Optional<float> SmoothingFilterImpl::GetAverage() {
-  if (!init_end_time_ms_) {
-    // |init_end_time_ms_| undefined since we have not received any sample.
-    return rtc::Optional<float>();
-  }
-  ExtrapolateLastSample(rtc::TimeMillis());
-  return rtc::Optional<float>(state_);
-}
-
-bool SmoothingFilterImpl::SetTimeConstantMs(int time_constant_ms) {
-  if (!init_end_time_ms_ || last_state_time_ms_ < *init_end_time_ms_) {
-    return false;
-  }
-  UpdateAlpha(time_constant_ms);
-  return true;
-}
-
-void SmoothingFilterImpl::UpdateAlpha(int time_constant_ms) {
-  alpha_ = time_constant_ms == 0 ? 0.0f : exp(-1.0f / time_constant_ms);
-}
-
-void SmoothingFilterImpl::ExtrapolateLastSample(int64_t time_ms) {
-  RTC_DCHECK_GE(time_ms, last_state_time_ms_);
-  RTC_DCHECK(init_end_time_ms_);
-
-  float multiplier = 0.0f;
-
-  if (time_ms <= *init_end_time_ms_) {
-    // Current update is to be made during initialization phase.
-    // We update the state as if the |alpha| has been increased according
-    //   alpha(n) = exp(-powf(init_factor_, n)),
-    // where n is the time (in millisecond) since the first sample received.
-    // With algebraic derivation as shown in the Appendix, we can find that the
-    // state can be updated in a similar manner as if alpha is a constant,
-    // except for a different multiplier.
-    if (init_time_ms_ == 0) {
-      // This means |init_factor_| = 0.
-      multiplier = 0.0f;
-    } else if (init_time_ms_ == 1) {
-      // This means |init_factor_| = 1.
-      multiplier = exp(last_state_time_ms_ - time_ms);
-    } else {
-      multiplier =
-          exp(-(powf(init_factor_, last_state_time_ms_ - *init_end_time_ms_) -
-                powf(init_factor_, time_ms - *init_end_time_ms_)) /
-              init_const_);
-    }
-  } else {
-    if (last_state_time_ms_ < *init_end_time_ms_) {
-      // The latest state update was made during initialization phase.
-      // We first extrapolate to the initialization time.
-      ExtrapolateLastSample(*init_end_time_ms_);
-      // Then extrapolate the rest by the following.
-    }
-    multiplier = powf(alpha_, time_ms - last_state_time_ms_);
-  }
-
-  state_ = multiplier * state_ + (1.0f - multiplier) * last_sample_;
-  last_state_time_ms_ = time_ms;
-}
-
-}  // namespace webrtc
-
-// Appendix: derivation of extrapolation during initialization phase.
-// (LaTeX syntax)
-// Assuming
-//   \begin{align}
-//     y(n) &= \alpha_{n-1} y(n-1) + \left(1 - \alpha_{n-1}\right) x(m) \\*
-//          &= \left(\prod_{i=m}^{n-1} \alpha_i\right) y(m) +
-//             \left(1 - \prod_{i=m}^{n-1} \alpha_i \right) x(m)
-//   \end{align}
-// Taking $\alpha_{n} = \exp(-\gamma^n)$, $\gamma$ denotes init\_factor\_, the
-// multiplier becomes
-//   \begin{align}
-//     \prod_{i=m}^{n-1} \alpha_i
-//     &= \exp\left(-\sum_{i=m}^{n-1} \gamma^i \right) \\*
-//     &= \begin{cases}
-//          \exp\left(-\frac{\gamma^m - \gamma^n}{1 - \gamma} \right)
-//          & \gamma \neq 1 \\*
-//          m-n & \gamma = 1
-//        \end{cases}
-//   \end{align}
-// We know $\gamma = T^{-\frac{1}{T}}$, where $T$ denotes init\_time\_ms\_. Then
-// $1 - \gamma$ approaches zero when $T$ increases. This can cause numerical
-// difficulties. We multiply $T$ (if $T > 0$) to both numerator and denominator
-// in the fraction. See.
-//   \begin{align}
-//     \frac{\gamma^m - \gamma^n}{1 - \gamma}
-//     &= \frac{T^\frac{T-m}{T} - T^\frac{T-n}{T}}{T - T^{1-\frac{1}{T}}}
-//   \end{align}
diff --git a/common_audio/smoothing_filter.h b/common_audio/smoothing_filter.h
deleted file mode 100644
index 15ea3d1..0000000
--- a/common_audio/smoothing_filter.h
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- *  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_COMMON_AUDIO_SMOOTHING_FILTER_H_
-#define WEBRTC_COMMON_AUDIO_SMOOTHING_FILTER_H_
-
-#include "webrtc/api/optional.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/system_wrappers/include/clock.h"
-
-namespace webrtc {
-
-class SmoothingFilter {
- public:
-  virtual ~SmoothingFilter() = default;
-  virtual void AddSample(float sample) = 0;
-  virtual rtc::Optional<float> GetAverage() = 0;
-  virtual bool SetTimeConstantMs(int time_constant_ms) = 0;
-};
-
-// SmoothingFilterImpl applies an exponential filter
-//   alpha = exp(-1.0 / time_constant_ms);
-//   y[t] = alpha * y[t-1] + (1 - alpha) * sample;
-// This implies a sample rate of 1000 Hz, i.e., 1 sample / ms.
-// But SmoothingFilterImpl allows sparse samples. All missing samples will be
-// assumed to equal the last received sample.
-class SmoothingFilterImpl final : public SmoothingFilter {
- public:
-  // |init_time_ms| is initialization time. It defines a period starting from
-  // the arriving time of the first sample. During this period, the exponential
-  // filter uses a varying time constant so that a smaller time constant will be
-  // applied to the earlier samples. This is to allow the the filter to adapt to
-  // earlier samples quickly. After the initialization period, the time constant
-  // will be set to |init_time_ms| first and can be changed through
-  // |SetTimeConstantMs|.
-  explicit SmoothingFilterImpl(int init_time_ms);
-  ~SmoothingFilterImpl() override;
-
-  void AddSample(float sample) override;
-  rtc::Optional<float> GetAverage() override;
-  bool SetTimeConstantMs(int time_constant_ms) override;
-
-  // Methods used for unittests.
-  float alpha() const { return alpha_; }
-
- private:
-  void UpdateAlpha(int time_constant_ms);
-  void ExtrapolateLastSample(int64_t time_ms);
-
-  const int init_time_ms_;
-  const float init_factor_;
-  const float init_const_;
-
-  rtc::Optional<int64_t> init_end_time_ms_;
-  float last_sample_;
-  float alpha_;
-  float state_;
-  int64_t last_state_time_ms_;
-
-  RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(SmoothingFilterImpl);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_COMMON_AUDIO_SMOOTHING_FILTER_H_
diff --git a/common_audio/smoothing_filter_unittest.cc b/common_audio/smoothing_filter_unittest.cc
deleted file mode 100644
index 6e0bde8..0000000
--- a/common_audio/smoothing_filter_unittest.cc
+++ /dev/null
@@ -1,164 +0,0 @@
-/*
- *  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 <cmath>
-#include <memory>
-
-#include "webrtc/common_audio/smoothing_filter.h"
-#include "webrtc/rtc_base/fakeclock.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-namespace {
-
-constexpr float kMaxAbsError = 1e-5f;
-constexpr int64_t kClockInitialTime = 123456;
-
-struct SmoothingFilterStates {
-  explicit SmoothingFilterStates(int init_time_ms)
-      : smoothing_filter(init_time_ms) {
-    fake_clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(kClockInitialTime));
-  }
-  rtc::ScopedFakeClock fake_clock;
-  SmoothingFilterImpl smoothing_filter;
-};
-
-// This function does the following:
-//   1. Add a sample to filter at current clock,
-//   2. Advance the clock by |advance_time_ms|,
-//   3. Get the output of both SmoothingFilter and verify that it equals to an
-//      expected value.
-void CheckOutput(SmoothingFilterStates* states,
-                 float sample,
-                 int advance_time_ms,
-                 float expected_ouput) {
-  states->smoothing_filter.AddSample(sample);
-  states->fake_clock.AdvanceTime(
-      rtc::TimeDelta::FromMilliseconds(advance_time_ms));
-  auto output = states->smoothing_filter.GetAverage();
-  EXPECT_TRUE(output);
-  EXPECT_NEAR(expected_ouput, *output, kMaxAbsError);
-}
-
-}  // namespace
-
-TEST(SmoothingFilterTest, NoOutputWhenNoSampleAdded) {
-  constexpr int kInitTimeMs = 100;
-  SmoothingFilterStates states(kInitTimeMs);
-  EXPECT_FALSE(states.smoothing_filter.GetAverage());
-}
-
-// Python script to calculate the reference values used in this test.
-//   import math
-//
-//   class ExpFilter:
-//     def add_sample(self, new_value):
-//       self.state = self.state * self.alpha + (1.0 - self.alpha) * new_value
-//
-//   filter = ExpFilter()
-//   init_time = 795
-//   init_factor = (1.0 / init_time) ** (1.0 / init_time)
-//
-//   filter.state = 1.0
-//
-//   for time_now in range(1, 500):
-//     filter.alpha = math.exp(-init_factor ** time_now)
-//     filter.add_sample(1.0)
-//   print filter.state
-//
-//   for time_now in range(500, 600):
-//     filter.alpha = math.exp(-init_factor ** time_now)
-//     filter.add_sample(0.5)
-//   print filter.state
-//
-//   for time_now in range(600, 700):
-//     filter.alpha = math.exp(-init_factor ** time_now)
-//     filter.add_sample(1.0)
-//   print filter.state
-//
-//   for time_now in range(700, init_time):
-//     filter.alpha = math.exp(-init_factor ** time_now)
-//     filter.add_sample(1.0)
-//
-//   filter.alpha = math.exp(-1.0 / init_time)
-//   for time_now in range(init_time, 800):
-//     filter.add_sample(1.0)
-//   print filter.state
-//
-//   for i in range(800, 900):
-//     filter.add_sample(0.5)
-//   print filter.state
-//
-//   for i in range(900, 1000):
-//     filter.add_sample(1.0)
-//   print filter.state
-TEST(SmoothingFilterTest, CheckBehaviorAroundInitTime) {
-  constexpr int kInitTimeMs = 795;
-  SmoothingFilterStates states(kInitTimeMs);
-  CheckOutput(&states, 1.0f, 500, 1.0f);
-  CheckOutput(&states, 0.5f, 100, 0.680562264029f);
-  CheckOutput(&states, 1.0f, 100, 0.794207139813f);
-  // Next step will go across initialization time.
-  CheckOutput(&states, 1.0f, 100, 0.829803409752f);
-  CheckOutput(&states, 0.5f, 100, 0.790821764210f);
-  CheckOutput(&states, 1.0f, 100, 0.815545922911f);
-}
-
-TEST(SmoothingFilterTest, InitTimeEqualsZero) {
-  constexpr int kInitTimeMs = 0;
-  SmoothingFilterStates states(kInitTimeMs);
-  CheckOutput(&states, 1.0f, 1, 1.0f);
-  CheckOutput(&states, 0.5f, 1, 0.5f);
-}
-
-TEST(SmoothingFilterTest, InitTimeEqualsOne) {
-  constexpr int kInitTimeMs = 1;
-  SmoothingFilterStates states(kInitTimeMs);
-  CheckOutput(&states, 1.0f, 1, 1.0f);
-  CheckOutput(&states, 0.5f, 1, 1.0f * exp(-1.0f) + (1.0f - exp(-1.0f)) * 0.5f);
-}
-
-TEST(SmoothingFilterTest, GetAverageOutputsEmptyBeforeFirstSample) {
-  constexpr int kInitTimeMs = 100;
-  SmoothingFilterStates states(kInitTimeMs);
-  EXPECT_FALSE(states.smoothing_filter.GetAverage());
-  constexpr float kFirstSample = 1.2345f;
-  states.smoothing_filter.AddSample(kFirstSample);
-  EXPECT_EQ(rtc::Optional<float>(kFirstSample),
-            states.smoothing_filter.GetAverage());
-}
-
-TEST(SmoothingFilterTest, CannotChangeTimeConstantDuringInitialization) {
-  constexpr int kInitTimeMs = 100;
-  SmoothingFilterStates states(kInitTimeMs);
-  states.smoothing_filter.AddSample(0.0);
-
-  // During initialization, |SetTimeConstantMs| does not take effect.
-  states.fake_clock.AdvanceTime(
-      rtc::TimeDelta::FromMilliseconds(kInitTimeMs - 1));
-  states.smoothing_filter.AddSample(0.0);
-
-  EXPECT_FALSE(states.smoothing_filter.SetTimeConstantMs(kInitTimeMs * 2));
-  EXPECT_NE(exp(-1.0f / (kInitTimeMs * 2)), states.smoothing_filter.alpha());
-
-  states.fake_clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1));
-  states.smoothing_filter.AddSample(0.0);
-  // When initialization finishes, the time constant should be come
-  // |kInitTimeConstantMs|.
-  EXPECT_FLOAT_EQ(exp(-1.0f / kInitTimeMs), states.smoothing_filter.alpha());
-
-  // After initialization, |SetTimeConstantMs| takes effect.
-  EXPECT_TRUE(states.smoothing_filter.SetTimeConstantMs(kInitTimeMs * 2));
-  EXPECT_FLOAT_EQ(exp(-1.0f / (kInitTimeMs * 2)),
-                  states.smoothing_filter.alpha());
-}
-
-}  // namespace webrtc
diff --git a/common_audio/sparse_fir_filter.cc b/common_audio/sparse_fir_filter.cc
deleted file mode 100644
index 299028f..0000000
--- a/common_audio/sparse_fir_filter.cc
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- *  Copyright (c) 2015 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/common_audio/sparse_fir_filter.h"
-
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-
-SparseFIRFilter::SparseFIRFilter(const float* nonzero_coeffs,
-                                 size_t num_nonzero_coeffs,
-                                 size_t sparsity,
-                                 size_t offset)
-    : sparsity_(sparsity),
-      offset_(offset),
-      nonzero_coeffs_(nonzero_coeffs, nonzero_coeffs + num_nonzero_coeffs),
-      state_(sparsity_ * (num_nonzero_coeffs - 1) + offset_, 0.f) {
-  RTC_CHECK_GE(num_nonzero_coeffs, 1);
-  RTC_CHECK_GE(sparsity, 1);
-}
-
-SparseFIRFilter::~SparseFIRFilter() = default;
-
-void SparseFIRFilter::Filter(const float* in, size_t length, float* out) {
-  // Convolves the input signal |in| with the filter kernel |nonzero_coeffs_|
-  // taking into account the previous state.
-  for (size_t i = 0; i < length; ++i) {
-    out[i] = 0.f;
-    size_t j;
-    for (j = 0; i >= j * sparsity_ + offset_ &&
-                j < nonzero_coeffs_.size(); ++j) {
-      out[i] += in[i - j * sparsity_ - offset_] * nonzero_coeffs_[j];
-    }
-    for (; j < nonzero_coeffs_.size(); ++j) {
-      out[i] += state_[i + (nonzero_coeffs_.size() - j - 1) * sparsity_] *
-                nonzero_coeffs_[j];
-    }
-  }
-
-  // Update current state.
-  if (state_.size() > 0u) {
-    if (length >= state_.size()) {
-      std::memcpy(&state_[0],
-                  &in[length - state_.size()],
-                  state_.size() * sizeof(*in));
-    } else {
-      std::memmove(&state_[0],
-                   &state_[length],
-                   (state_.size() - length) * sizeof(state_[0]));
-      std::memcpy(&state_[state_.size() - length], in, length * sizeof(*in));
-    }
-  }
-}
-
-}  // namespace webrtc
diff --git a/common_audio/sparse_fir_filter.h b/common_audio/sparse_fir_filter.h
deleted file mode 100644
index 6bc5528..0000000
--- a/common_audio/sparse_fir_filter.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- *  Copyright (c) 2015 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_COMMON_AUDIO_SPARSE_FIR_FILTER_H_
-#define WEBRTC_COMMON_AUDIO_SPARSE_FIR_FILTER_H_
-
-#include <cstring>
-#include <vector>
-
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace webrtc {
-
-// A Finite Impulse Response filter implementation which takes advantage of a
-// sparse structure with uniformly distributed non-zero coefficients.
-class SparseFIRFilter final {
- public:
-  // |num_nonzero_coeffs| is the number of non-zero coefficients,
-  // |nonzero_coeffs|. They are assumed to be uniformly distributed every
-  // |sparsity| samples and with an initial |offset|. The rest of the filter
-  // coefficients will be assumed zeros. For example, with sparsity = 3, and
-  // offset = 1 the filter coefficients will be:
-  // B = [0 coeffs[0] 0 0 coeffs[1] 0 0 coeffs[2] ... ]
-  // All initial state values will be zeros.
-  SparseFIRFilter(const float* nonzero_coeffs,
-                  size_t num_nonzero_coeffs,
-                  size_t sparsity,
-                  size_t offset);
-  ~SparseFIRFilter();
-
-  // Filters the |in| data supplied.
-  // |out| must be previously allocated and it must be at least of |length|.
-  void Filter(const float* in, size_t length, float* out);
-
- private:
-  const size_t sparsity_;
-  const size_t offset_;
-  const std::vector<float> nonzero_coeffs_;
-  std::vector<float> state_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(SparseFIRFilter);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_COMMON_AUDIO_SPARSE_FIR_FILTER_H_
diff --git a/common_audio/sparse_fir_filter_unittest.cc b/common_audio/sparse_fir_filter_unittest.cc
deleted file mode 100644
index a000596..0000000
--- a/common_audio/sparse_fir_filter_unittest.cc
+++ /dev/null
@@ -1,231 +0,0 @@
-/*
- *  Copyright (c) 2015 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 <memory>
-
-#include "webrtc/common_audio/sparse_fir_filter.h"
-
-#include "webrtc/common_audio/fir_filter.h"
-#include "webrtc/rtc_base/arraysize.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-namespace {
-
-static const float kCoeffs[] = {0.2f, 0.3f, 0.5f, 0.7f, 0.11f};
-static const float kInput[] =
-    {1.f, 2.f, 3.f, 4.f, 5.f, 6.f, 7.f, 8.f, 9.f, 10.f};
-
-template <size_t N>
-void VerifyOutput(const float (&expected_output)[N], const float (&output)[N]) {
-  EXPECT_EQ(0, memcmp(expected_output, output, sizeof(output)));
-}
-
-}  // namespace
-
-TEST(SparseFIRFilterTest, FilterAsIdentity) {
-  const float kCoeff = 1.f;
-  const size_t kNumCoeff = 1;
-  const size_t kSparsity = 3;
-  const size_t kOffset = 0;
-  float output[arraysize(kInput)];
-  SparseFIRFilter filter(&kCoeff, kNumCoeff, kSparsity, kOffset);
-  filter.Filter(kInput, arraysize(kInput), output);
-  VerifyOutput(kInput, output);
-}
-
-TEST(SparseFIRFilterTest, SameOutputForScalarCoefficientAndDifferentSparsity) {
-  const float kCoeff = 2.f;
-  const size_t kNumCoeff = 1;
-  const size_t kLowSparsity = 1;
-  const size_t kHighSparsity = 7;
-  const size_t kOffset = 0;
-  float low_sparsity_output[arraysize(kInput)];
-  float high_sparsity_output[arraysize(kInput)];
-  SparseFIRFilter low_sparsity_filter(&kCoeff,
-                                      kNumCoeff,
-                                      kLowSparsity,
-                                      kOffset);
-  SparseFIRFilter high_sparsity_filter(&kCoeff,
-                                       kNumCoeff,
-                                       kHighSparsity,
-                                       kOffset);
-  low_sparsity_filter.Filter(kInput, arraysize(kInput), low_sparsity_output);
-  high_sparsity_filter.Filter(kInput, arraysize(kInput), high_sparsity_output);
-  VerifyOutput(low_sparsity_output, high_sparsity_output);
-}
-
-TEST(SparseFIRFilterTest, FilterUsedAsScalarMultiplication) {
-  const float kCoeff = 5.f;
-  const size_t kNumCoeff = 1;
-  const size_t kSparsity = 5;
-  const size_t kOffset = 0;
-  float output[arraysize(kInput)];
-  SparseFIRFilter filter(&kCoeff, kNumCoeff, kSparsity, kOffset);
-  filter.Filter(kInput, arraysize(kInput), output);
-  EXPECT_FLOAT_EQ(5.f, output[0]);
-  EXPECT_FLOAT_EQ(20.f, output[3]);
-  EXPECT_FLOAT_EQ(25.f, output[4]);
-  EXPECT_FLOAT_EQ(50.f, output[arraysize(kInput) - 1]);
-}
-
-TEST(SparseFIRFilterTest, FilterUsedAsInputShifting) {
-  const float kCoeff = 1.f;
-  const size_t kNumCoeff = 1;
-  const size_t kSparsity = 1;
-  const size_t kOffset = 4;
-  float output[arraysize(kInput)];
-  SparseFIRFilter filter(&kCoeff, kNumCoeff, kSparsity, kOffset);
-  filter.Filter(kInput, arraysize(kInput), output);
-  EXPECT_FLOAT_EQ(0.f, output[0]);
-  EXPECT_FLOAT_EQ(0.f, output[3]);
-  EXPECT_FLOAT_EQ(1.f, output[4]);
-  EXPECT_FLOAT_EQ(2.f, output[5]);
-  EXPECT_FLOAT_EQ(6.f, output[arraysize(kInput) - 1]);
-}
-
-TEST(SparseFIRFilterTest, FilterUsedAsArbitraryWeighting) {
-  const size_t kSparsity = 2;
-  const size_t kOffset = 1;
-  float output[arraysize(kInput)];
-  SparseFIRFilter filter(kCoeffs, arraysize(kCoeffs), kSparsity, kOffset);
-  filter.Filter(kInput, arraysize(kInput), output);
-  EXPECT_FLOAT_EQ(0.f, output[0]);
-  EXPECT_FLOAT_EQ(0.9f, output[3]);
-  EXPECT_FLOAT_EQ(1.4f, output[4]);
-  EXPECT_FLOAT_EQ(2.4f, output[5]);
-  EXPECT_FLOAT_EQ(8.61f, output[arraysize(kInput) - 1]);
-}
-
-TEST(SparseFIRFilterTest, FilterInLengthLesserOrEqualToCoefficientsLength) {
-  const size_t kSparsity = 1;
-  const size_t kOffset = 0;
-  float output[arraysize(kInput)];
-  SparseFIRFilter filter(kCoeffs, arraysize(kCoeffs), kSparsity, kOffset);
-  filter.Filter(kInput, 2, output);
-  EXPECT_FLOAT_EQ(0.2f, output[0]);
-  EXPECT_FLOAT_EQ(0.7f, output[1]);
-}
-
-TEST(SparseFIRFilterTest, MultipleFilterCalls) {
-  const size_t kSparsity = 1;
-  const size_t kOffset = 0;
-  float output[arraysize(kInput)];
-  SparseFIRFilter filter(kCoeffs, arraysize(kCoeffs), kSparsity, kOffset);
-  filter.Filter(kInput, 2, output);
-  EXPECT_FLOAT_EQ(0.2f, output[0]);
-  EXPECT_FLOAT_EQ(0.7f, output[1]);
-  filter.Filter(kInput, 2, output);
-  EXPECT_FLOAT_EQ(1.3f, output[0]);
-  EXPECT_FLOAT_EQ(2.4f, output[1]);
-  filter.Filter(kInput, 2, output);
-  EXPECT_FLOAT_EQ(2.81f, output[0]);
-  EXPECT_FLOAT_EQ(2.62f, output[1]);
-  filter.Filter(kInput, 2, output);
-  EXPECT_FLOAT_EQ(2.81f, output[0]);
-  EXPECT_FLOAT_EQ(2.62f, output[1]);
-  filter.Filter(&kInput[3], 3, output);
-  EXPECT_FLOAT_EQ(3.41f, output[0]);
-  EXPECT_FLOAT_EQ(4.12f, output[1]);
-  EXPECT_FLOAT_EQ(6.21f, output[2]);
-  filter.Filter(&kInput[3], 3, output);
-  EXPECT_FLOAT_EQ(8.12f, output[0]);
-  EXPECT_FLOAT_EQ(9.14f, output[1]);
-  EXPECT_FLOAT_EQ(9.45f, output[2]);
-}
-
-TEST(SparseFIRFilterTest, VerifySampleBasedVsBlockBasedFiltering) {
-  const size_t kSparsity = 3;
-  const size_t kOffset = 1;
-  float output_block_based[arraysize(kInput)];
-  SparseFIRFilter filter_block(kCoeffs,
-                               arraysize(kCoeffs),
-                               kSparsity,
-                               kOffset);
-  filter_block.Filter(kInput, arraysize(kInput), output_block_based);
-  float output_sample_based[arraysize(kInput)];
-  SparseFIRFilter filter_sample(kCoeffs,
-                                arraysize(kCoeffs),
-                                kSparsity,
-                                kOffset);
-  for (size_t i = 0; i < arraysize(kInput); ++i)
-    filter_sample.Filter(&kInput[i], 1, &output_sample_based[i]);
-  VerifyOutput(output_block_based, output_sample_based);
-}
-
-TEST(SparseFIRFilterTest, SimpleHighPassFilter) {
-  const size_t kSparsity = 2;
-  const size_t kOffset = 2;
-  const float kHPCoeffs[] = {1.f, -1.f};
-  const float kConstantInput[] =
-      {1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 1.f};
-  float output[arraysize(kConstantInput)];
-  SparseFIRFilter filter(kHPCoeffs, arraysize(kHPCoeffs), kSparsity, kOffset);
-  filter.Filter(kConstantInput, arraysize(kConstantInput), output);
-  EXPECT_FLOAT_EQ(0.f, output[0]);
-  EXPECT_FLOAT_EQ(0.f, output[1]);
-  EXPECT_FLOAT_EQ(1.f, output[2]);
-  EXPECT_FLOAT_EQ(1.f, output[3]);
-  for (size_t i = kSparsity + kOffset; i < arraysize(kConstantInput); ++i)
-    EXPECT_FLOAT_EQ(0.f, output[i]);
-}
-
-TEST(SparseFIRFilterTest, SimpleLowPassFilter) {
-  const size_t kSparsity = 2;
-  const size_t kOffset = 2;
-  const float kLPCoeffs[] = {1.f, 1.f};
-  const float kHighFrequencyInput[] =
-      {1.f, 1.f, -1.f, -1.f, 1.f, 1.f, -1.f, -1.f, 1.f, 1.f};
-  float output[arraysize(kHighFrequencyInput)];
-  SparseFIRFilter filter(kLPCoeffs, arraysize(kLPCoeffs), kSparsity, kOffset);
-  filter.Filter(kHighFrequencyInput, arraysize(kHighFrequencyInput), output);
-  EXPECT_FLOAT_EQ(0.f, output[0]);
-  EXPECT_FLOAT_EQ(0.f, output[1]);
-  EXPECT_FLOAT_EQ(1.f, output[2]);
-  EXPECT_FLOAT_EQ(1.f, output[3]);
-  for (size_t i = kSparsity + kOffset; i < arraysize(kHighFrequencyInput); ++i)
-    EXPECT_FLOAT_EQ(0.f, output[i]);
-}
-
-TEST(SparseFIRFilterTest, SameOutputWhenSwappedCoefficientsAndInput) {
-  const size_t kSparsity = 1;
-  const size_t kOffset = 0;
-  float output[arraysize(kCoeffs)];
-  float output_swapped[arraysize(kCoeffs)];
-  SparseFIRFilter filter(kCoeffs, arraysize(kCoeffs), kSparsity, kOffset);
-  // Use arraysize(kCoeffs) for in_length to get same-length outputs.
-  filter.Filter(kInput, arraysize(kCoeffs), output);
-  SparseFIRFilter filter_swapped(kInput,
-                                 arraysize(kCoeffs),
-                                 kSparsity,
-                                 kOffset);
-  filter_swapped.Filter(kCoeffs, arraysize(kCoeffs), output_swapped);
-  VerifyOutput(output, output_swapped);
-}
-
-TEST(SparseFIRFilterTest, SameOutputAsFIRFilterWhenSparsityOneAndOffsetZero) {
-  const size_t kSparsity = 1;
-  const size_t kOffset = 0;
-  float output[arraysize(kInput)];
-  float sparse_output[arraysize(kInput)];
-  std::unique_ptr<FIRFilter> filter(
-      FIRFilter::Create(kCoeffs, arraysize(kCoeffs), arraysize(kInput)));
-  SparseFIRFilter sparse_filter(kCoeffs,
-                                arraysize(kCoeffs),
-                                kSparsity,
-                                kOffset);
-  filter->Filter(kInput, arraysize(kInput), output);
-  sparse_filter.Filter(kInput, arraysize(kInput), sparse_output);
-  for (size_t i = 0; i < arraysize(kInput); ++i) {
-    EXPECT_FLOAT_EQ(output[i], sparse_output[i]);
-  }
-}
-
-}  // namespace webrtc
diff --git a/common_audio/vad/include/vad.h b/common_audio/vad/include/vad.h
deleted file mode 100644
index ed649f5..0000000
--- a/common_audio/vad/include/vad.h
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- *  Copyright (c) 2014 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_COMMON_AUDIO_VAD_INCLUDE_VAD_H_
-#define WEBRTC_COMMON_AUDIO_VAD_INCLUDE_VAD_H_
-
-#include <memory>
-
-#include "webrtc/common_audio/vad/include/webrtc_vad.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-class Vad {
- public:
-  enum Aggressiveness {
-    kVadNormal = 0,
-    kVadLowBitrate = 1,
-    kVadAggressive = 2,
-    kVadVeryAggressive = 3
-  };
-
-  enum Activity { kPassive = 0, kActive = 1, kError = -1 };
-
-  virtual ~Vad() = default;
-
-  // Calculates a VAD decision for the given audio frame. Valid sample rates
-  // are 8000, 16000, and 32000 Hz; the number of samples must be such that the
-  // frame is 10, 20, or 30 ms long.
-  virtual Activity VoiceActivity(const int16_t* audio,
-                                 size_t num_samples,
-                                 int sample_rate_hz) = 0;
-
-  // Resets VAD state.
-  virtual void Reset() = 0;
-};
-
-// Returns a Vad instance that's implemented on top of WebRtcVad.
-std::unique_ptr<Vad> CreateVad(Vad::Aggressiveness aggressiveness);
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_COMMON_AUDIO_VAD_INCLUDE_VAD_H_
diff --git a/common_audio/vad/include/webrtc_vad.h b/common_audio/vad/include/webrtc_vad.h
deleted file mode 100644
index 7c11b12..0000000
--- a/common_audio/vad/include/webrtc_vad.h
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- *  Copyright (c) 2012 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.
- */
-
-
-/*
- * This header file includes the VAD API calls. Specific function calls are given below.
- */
-
-#ifndef WEBRTC_COMMON_AUDIO_VAD_INCLUDE_WEBRTC_VAD_H_  // NOLINT
-#define WEBRTC_COMMON_AUDIO_VAD_INCLUDE_WEBRTC_VAD_H_
-
-#include <stddef.h>
-
-#include "webrtc/typedefs.h"
-
-typedef struct WebRtcVadInst VadInst;
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-// Creates an instance to the VAD structure.
-VadInst* WebRtcVad_Create();
-
-// Frees the dynamic memory of a specified VAD instance.
-//
-// - handle [i] : Pointer to VAD instance that should be freed.
-void WebRtcVad_Free(VadInst* handle);
-
-// Initializes a VAD instance.
-//
-// - handle [i/o] : Instance that should be initialized.
-//
-// returns        : 0 - (OK),
-//                 -1 - (null pointer or Default mode could not be set).
-int WebRtcVad_Init(VadInst* handle);
-
-// Sets the VAD operating mode. A more aggressive (higher mode) VAD is more
-// restrictive in reporting speech. Put in other words the probability of being
-// speech when the VAD returns 1 is increased with increasing mode. As a
-// consequence also the missed detection rate goes up.
-//
-// - handle [i/o] : VAD instance.
-// - mode   [i]   : Aggressiveness mode (0, 1, 2, or 3).
-//
-// returns        : 0 - (OK),
-//                 -1 - (null pointer, mode could not be set or the VAD instance
-//                       has not been initialized).
-int WebRtcVad_set_mode(VadInst* handle, int mode);
-
-// Calculates a VAD decision for the |audio_frame|. For valid sampling rates
-// frame lengths, see the description of WebRtcVad_ValidRatesAndFrameLengths().
-//
-// - handle       [i/o] : VAD Instance. Needs to be initialized by
-//                        WebRtcVad_Init() before call.
-// - fs           [i]   : Sampling frequency (Hz): 8000, 16000, or 32000
-// - audio_frame  [i]   : Audio frame buffer.
-// - frame_length [i]   : Length of audio frame buffer in number of samples.
-//
-// returns              : 1 - (Active Voice),
-//                        0 - (Non-active Voice),
-//                       -1 - (Error)
-int WebRtcVad_Process(VadInst* handle, int fs, const int16_t* audio_frame,
-                      size_t frame_length);
-
-// Checks for valid combinations of |rate| and |frame_length|. We support 10,
-// 20 and 30 ms frames and the rates 8000, 16000 and 32000 Hz.
-//
-// - rate         [i] : Sampling frequency (Hz).
-// - frame_length [i] : Speech frame buffer length in number of samples.
-//
-// returns            : 0 - (valid combination), -1 - (invalid combination)
-int WebRtcVad_ValidRateAndFrameLength(int rate, size_t frame_length);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif  // WEBRTC_COMMON_AUDIO_VAD_INCLUDE_WEBRTC_VAD_H_  // NOLINT
diff --git a/common_audio/vad/mock/mock_vad.h b/common_audio/vad/mock/mock_vad.h
deleted file mode 100644
index 09109e6..0000000
--- a/common_audio/vad/mock/mock_vad.h
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- *  Copyright (c) 2014 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_COMMON_AUDIO_VAD_MOCK_MOCK_VAD_H_
-#define WEBRTC_COMMON_AUDIO_VAD_MOCK_MOCK_VAD_H_
-
-#include "webrtc/common_audio/vad/include/vad.h"
-#include "webrtc/test/gmock.h"
-
-namespace webrtc {
-
-class MockVad : public Vad {
- public:
-  virtual ~MockVad() { Die(); }
-  MOCK_METHOD0(Die, void());
-
-  MOCK_METHOD3(VoiceActivity,
-               enum Activity(const int16_t* audio,
-                             size_t num_samples,
-                             int sample_rate_hz));
-  MOCK_METHOD0(Reset, void());
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_COMMON_AUDIO_VAD_MOCK_MOCK_VAD_H_
diff --git a/common_audio/vad/vad.cc b/common_audio/vad/vad.cc
deleted file mode 100644
index 5f3443e..0000000
--- a/common_audio/vad/vad.cc
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- *  Copyright (c) 2014 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/common_audio/vad/include/vad.h"
-
-#include <memory>
-
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-
-namespace {
-
-class VadImpl final : public Vad {
- public:
-  explicit VadImpl(Aggressiveness aggressiveness)
-      : handle_(nullptr), aggressiveness_(aggressiveness) {
-    Reset();
-  }
-
-  ~VadImpl() override { WebRtcVad_Free(handle_); }
-
-  Activity VoiceActivity(const int16_t* audio,
-                         size_t num_samples,
-                         int sample_rate_hz) override {
-    int ret = WebRtcVad_Process(handle_, sample_rate_hz, audio, num_samples);
-    switch (ret) {
-      case 0:
-        return kPassive;
-      case 1:
-        return kActive;
-      default:
-        RTC_NOTREACHED() << "WebRtcVad_Process returned an error.";
-        return kError;
-    }
-  }
-
-  void Reset() override {
-    if (handle_)
-      WebRtcVad_Free(handle_);
-    handle_ = WebRtcVad_Create();
-    RTC_CHECK(handle_);
-    RTC_CHECK_EQ(WebRtcVad_Init(handle_), 0);
-    RTC_CHECK_EQ(WebRtcVad_set_mode(handle_, aggressiveness_), 0);
-  }
-
- private:
-  VadInst* handle_;
-  Aggressiveness aggressiveness_;
-};
-
-}  // namespace
-
-std::unique_ptr<Vad> CreateVad(Vad::Aggressiveness aggressiveness) {
-  return std::unique_ptr<Vad>(new VadImpl(aggressiveness));
-}
-
-}  // namespace webrtc
diff --git a/common_audio/vad/vad_core.c b/common_audio/vad/vad_core.c
deleted file mode 100644
index be517ef..0000000
--- a/common_audio/vad/vad_core.c
+++ /dev/null
@@ -1,686 +0,0 @@
-/*
- *  Copyright (c) 2012 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/common_audio/vad/vad_core.h"
-
-#include "webrtc/rtc_base/sanitizer.h"
-#include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
-#include "webrtc/common_audio/vad/vad_filterbank.h"
-#include "webrtc/common_audio/vad/vad_gmm.h"
-#include "webrtc/common_audio/vad/vad_sp.h"
-#include "webrtc/typedefs.h"
-
-// Spectrum Weighting
-static const int16_t kSpectrumWeight[kNumChannels] = { 6, 8, 10, 12, 14, 16 };
-static const int16_t kNoiseUpdateConst = 655; // Q15
-static const int16_t kSpeechUpdateConst = 6554; // Q15
-static const int16_t kBackEta = 154; // Q8
-// Minimum difference between the two models, Q5
-static const int16_t kMinimumDifference[kNumChannels] = {
-    544, 544, 576, 576, 576, 576 };
-// Upper limit of mean value for speech model, Q7
-static const int16_t kMaximumSpeech[kNumChannels] = {
-    11392, 11392, 11520, 11520, 11520, 11520 };
-// Minimum value for mean value
-static const int16_t kMinimumMean[kNumGaussians] = { 640, 768 };
-// Upper limit of mean value for noise model, Q7
-static const int16_t kMaximumNoise[kNumChannels] = {
-    9216, 9088, 8960, 8832, 8704, 8576 };
-// Start values for the Gaussian models, Q7
-// Weights for the two Gaussians for the six channels (noise)
-static const int16_t kNoiseDataWeights[kTableSize] = {
-    34, 62, 72, 66, 53, 25, 94, 66, 56, 62, 75, 103 };
-// Weights for the two Gaussians for the six channels (speech)
-static const int16_t kSpeechDataWeights[kTableSize] = {
-    48, 82, 45, 87, 50, 47, 80, 46, 83, 41, 78, 81 };
-// Means for the two Gaussians for the six channels (noise)
-static const int16_t kNoiseDataMeans[kTableSize] = {
-    6738, 4892, 7065, 6715, 6771, 3369, 7646, 3863, 7820, 7266, 5020, 4362 };
-// Means for the two Gaussians for the six channels (speech)
-static const int16_t kSpeechDataMeans[kTableSize] = {
-    8306, 10085, 10078, 11823, 11843, 6309, 9473, 9571, 10879, 7581, 8180, 7483
-};
-// Stds for the two Gaussians for the six channels (noise)
-static const int16_t kNoiseDataStds[kTableSize] = {
-    378, 1064, 493, 582, 688, 593, 474, 697, 475, 688, 421, 455 };
-// Stds for the two Gaussians for the six channels (speech)
-static const int16_t kSpeechDataStds[kTableSize] = {
-    555, 505, 567, 524, 585, 1231, 509, 828, 492, 1540, 1079, 850 };
-
-// Constants used in GmmProbability().
-//
-// Maximum number of counted speech (VAD = 1) frames in a row.
-static const int16_t kMaxSpeechFrames = 6;
-// Minimum standard deviation for both speech and noise.
-static const int16_t kMinStd = 384;
-
-// Constants in WebRtcVad_InitCore().
-// Default aggressiveness mode.
-static const short kDefaultMode = 0;
-static const int kInitCheck = 42;
-
-// Constants used in WebRtcVad_set_mode_core().
-//
-// Thresholds for different frame lengths (10 ms, 20 ms and 30 ms).
-//
-// Mode 0, Quality.
-static const int16_t kOverHangMax1Q[3] = { 8, 4, 3 };
-static const int16_t kOverHangMax2Q[3] = { 14, 7, 5 };
-static const int16_t kLocalThresholdQ[3] = { 24, 21, 24 };
-static const int16_t kGlobalThresholdQ[3] = { 57, 48, 57 };
-// Mode 1, Low bitrate.
-static const int16_t kOverHangMax1LBR[3] = { 8, 4, 3 };
-static const int16_t kOverHangMax2LBR[3] = { 14, 7, 5 };
-static const int16_t kLocalThresholdLBR[3] = { 37, 32, 37 };
-static const int16_t kGlobalThresholdLBR[3] = { 100, 80, 100 };
-// Mode 2, Aggressive.
-static const int16_t kOverHangMax1AGG[3] = { 6, 3, 2 };
-static const int16_t kOverHangMax2AGG[3] = { 9, 5, 3 };
-static const int16_t kLocalThresholdAGG[3] = { 82, 78, 82 };
-static const int16_t kGlobalThresholdAGG[3] = { 285, 260, 285 };
-// Mode 3, Very aggressive.
-static const int16_t kOverHangMax1VAG[3] = { 6, 3, 2 };
-static const int16_t kOverHangMax2VAG[3] = { 9, 5, 3 };
-static const int16_t kLocalThresholdVAG[3] = { 94, 94, 94 };
-static const int16_t kGlobalThresholdVAG[3] = { 1100, 1050, 1100 };
-
-// Calculates the weighted average w.r.t. number of Gaussians. The |data| are
-// updated with an |offset| before averaging.
-//
-// - data     [i/o] : Data to average.
-// - offset   [i]   : An offset added to |data|.
-// - weights  [i]   : Weights used for averaging.
-//
-// returns          : The weighted average.
-static int32_t WeightedAverage(int16_t* data, int16_t offset,
-                               const int16_t* weights) {
-  int k;
-  int32_t weighted_average = 0;
-
-  for (k = 0; k < kNumGaussians; k++) {
-    data[k * kNumChannels] += offset;
-    weighted_average += data[k * kNumChannels] * weights[k * kNumChannels];
-  }
-  return weighted_average;
-}
-
-// An s16 x s32 -> s32 multiplication that's allowed to overflow. (It's still
-// undefined behavior, so not a good idea; this just makes UBSan ignore the
-// violation, so that our old code can continue to do what it's always been
-// doing.)
-static inline int32_t RTC_NO_SANITIZE("signed-integer-overflow")
-    OverflowingMulS16ByS32ToS32(int16_t a, int32_t b) {
-  return a * b;
-}
-
-// Calculates the probabilities for both speech and background noise using
-// Gaussian Mixture Models (GMM). A hypothesis-test is performed to decide which
-// type of signal is most probable.
-//
-// - self           [i/o] : Pointer to VAD instance
-// - features       [i]   : Feature vector of length |kNumChannels|
-//                          = log10(energy in frequency band)
-// - total_power    [i]   : Total power in audio frame.
-// - frame_length   [i]   : Number of input samples
-//
-// - returns              : the VAD decision (0 - noise, 1 - speech).
-static int16_t GmmProbability(VadInstT* self, int16_t* features,
-                              int16_t total_power, size_t frame_length) {
-  int channel, k;
-  int16_t feature_minimum;
-  int16_t h0, h1;
-  int16_t log_likelihood_ratio;
-  int16_t vadflag = 0;
-  int16_t shifts_h0, shifts_h1;
-  int16_t tmp_s16, tmp1_s16, tmp2_s16;
-  int16_t diff;
-  int gaussian;
-  int16_t nmk, nmk2, nmk3, smk, smk2, nsk, ssk;
-  int16_t delt, ndelt;
-  int16_t maxspe, maxmu;
-  int16_t deltaN[kTableSize], deltaS[kTableSize];
-  int16_t ngprvec[kTableSize] = { 0 };  // Conditional probability = 0.
-  int16_t sgprvec[kTableSize] = { 0 };  // Conditional probability = 0.
-  int32_t h0_test, h1_test;
-  int32_t tmp1_s32, tmp2_s32;
-  int32_t sum_log_likelihood_ratios = 0;
-  int32_t noise_global_mean, speech_global_mean;
-  int32_t noise_probability[kNumGaussians], speech_probability[kNumGaussians];
-  int16_t overhead1, overhead2, individualTest, totalTest;
-
-  // Set various thresholds based on frame lengths (80, 160 or 240 samples).
-  if (frame_length == 80) {
-    overhead1 = self->over_hang_max_1[0];
-    overhead2 = self->over_hang_max_2[0];
-    individualTest = self->individual[0];
-    totalTest = self->total[0];
-  } else if (frame_length == 160) {
-    overhead1 = self->over_hang_max_1[1];
-    overhead2 = self->over_hang_max_2[1];
-    individualTest = self->individual[1];
-    totalTest = self->total[1];
-  } else {
-    overhead1 = self->over_hang_max_1[2];
-    overhead2 = self->over_hang_max_2[2];
-    individualTest = self->individual[2];
-    totalTest = self->total[2];
-  }
-
-  if (total_power > kMinEnergy) {
-    // The signal power of current frame is large enough for processing. The
-    // processing consists of two parts:
-    // 1) Calculating the likelihood of speech and thereby a VAD decision.
-    // 2) Updating the underlying model, w.r.t., the decision made.
-
-    // The detection scheme is an LRT with hypothesis
-    // H0: Noise
-    // H1: Speech
-    //
-    // We combine a global LRT with local tests, for each frequency sub-band,
-    // here defined as |channel|.
-    for (channel = 0; channel < kNumChannels; channel++) {
-      // For each channel we model the probability with a GMM consisting of
-      // |kNumGaussians|, with different means and standard deviations depending
-      // on H0 or H1.
-      h0_test = 0;
-      h1_test = 0;
-      for (k = 0; k < kNumGaussians; k++) {
-        gaussian = channel + k * kNumChannels;
-        // Probability under H0, that is, probability of frame being noise.
-        // Value given in Q27 = Q7 * Q20.
-        tmp1_s32 = WebRtcVad_GaussianProbability(features[channel],
-                                                 self->noise_means[gaussian],
-                                                 self->noise_stds[gaussian],
-                                                 &deltaN[gaussian]);
-        noise_probability[k] = kNoiseDataWeights[gaussian] * tmp1_s32;
-        h0_test += noise_probability[k];  // Q27
-
-        // Probability under H1, that is, probability of frame being speech.
-        // Value given in Q27 = Q7 * Q20.
-        tmp1_s32 = WebRtcVad_GaussianProbability(features[channel],
-                                                 self->speech_means[gaussian],
-                                                 self->speech_stds[gaussian],
-                                                 &deltaS[gaussian]);
-        speech_probability[k] = kSpeechDataWeights[gaussian] * tmp1_s32;
-        h1_test += speech_probability[k];  // Q27
-      }
-
-      // Calculate the log likelihood ratio: log2(Pr{X|H1} / Pr{X|H1}).
-      // Approximation:
-      // log2(Pr{X|H1} / Pr{X|H1}) = log2(Pr{X|H1}*2^Q) - log2(Pr{X|H1}*2^Q)
-      //                           = log2(h1_test) - log2(h0_test)
-      //                           = log2(2^(31-shifts_h1)*(1+b1))
-      //                             - log2(2^(31-shifts_h0)*(1+b0))
-      //                           = shifts_h0 - shifts_h1
-      //                             + log2(1+b1) - log2(1+b0)
-      //                          ~= shifts_h0 - shifts_h1
-      //
-      // Note that b0 and b1 are values less than 1, hence, 0 <= log2(1+b0) < 1.
-      // Further, b0 and b1 are independent and on the average the two terms
-      // cancel.
-      shifts_h0 = WebRtcSpl_NormW32(h0_test);
-      shifts_h1 = WebRtcSpl_NormW32(h1_test);
-      if (h0_test == 0) {
-        shifts_h0 = 31;
-      }
-      if (h1_test == 0) {
-        shifts_h1 = 31;
-      }
-      log_likelihood_ratio = shifts_h0 - shifts_h1;
-
-      // Update |sum_log_likelihood_ratios| with spectrum weighting. This is
-      // used for the global VAD decision.
-      sum_log_likelihood_ratios +=
-          (int32_t) (log_likelihood_ratio * kSpectrumWeight[channel]);
-
-      // Local VAD decision.
-      if ((log_likelihood_ratio << 2) > individualTest) {
-        vadflag = 1;
-      }
-
-      // TODO(bjornv): The conditional probabilities below are applied on the
-      // hard coded number of Gaussians set to two. Find a way to generalize.
-      // Calculate local noise probabilities used later when updating the GMM.
-      h0 = (int16_t) (h0_test >> 12);  // Q15
-      if (h0 > 0) {
-        // High probability of noise. Assign conditional probabilities for each
-        // Gaussian in the GMM.
-        tmp1_s32 = (noise_probability[0] & 0xFFFFF000) << 2;  // Q29
-        ngprvec[channel] = (int16_t) WebRtcSpl_DivW32W16(tmp1_s32, h0);  // Q14
-        ngprvec[channel + kNumChannels] = 16384 - ngprvec[channel];
-      } else {
-        // Low noise probability. Assign conditional probability 1 to the first
-        // Gaussian and 0 to the rest (which is already set at initialization).
-        ngprvec[channel] = 16384;
-      }
-
-      // Calculate local speech probabilities used later when updating the GMM.
-      h1 = (int16_t) (h1_test >> 12);  // Q15
-      if (h1 > 0) {
-        // High probability of speech. Assign conditional probabilities for each
-        // Gaussian in the GMM. Otherwise use the initialized values, i.e., 0.
-        tmp1_s32 = (speech_probability[0] & 0xFFFFF000) << 2;  // Q29
-        sgprvec[channel] = (int16_t) WebRtcSpl_DivW32W16(tmp1_s32, h1);  // Q14
-        sgprvec[channel + kNumChannels] = 16384 - sgprvec[channel];
-      }
-    }
-
-    // Make a global VAD decision.
-    vadflag |= (sum_log_likelihood_ratios >= totalTest);
-
-    // Update the model parameters.
-    maxspe = 12800;
-    for (channel = 0; channel < kNumChannels; channel++) {
-
-      // Get minimum value in past which is used for long term correction in Q4.
-      feature_minimum = WebRtcVad_FindMinimum(self, features[channel], channel);
-
-      // Compute the "global" mean, that is the sum of the two means weighted.
-      noise_global_mean = WeightedAverage(&self->noise_means[channel], 0,
-                                          &kNoiseDataWeights[channel]);
-      tmp1_s16 = (int16_t) (noise_global_mean >> 6);  // Q8
-
-      for (k = 0; k < kNumGaussians; k++) {
-        gaussian = channel + k * kNumChannels;
-
-        nmk = self->noise_means[gaussian];
-        smk = self->speech_means[gaussian];
-        nsk = self->noise_stds[gaussian];
-        ssk = self->speech_stds[gaussian];
-
-        // Update noise mean vector if the frame consists of noise only.
-        nmk2 = nmk;
-        if (!vadflag) {
-          // deltaN = (x-mu)/sigma^2
-          // ngprvec[k] = |noise_probability[k]| /
-          //   (|noise_probability[0]| + |noise_probability[1]|)
-
-          // (Q14 * Q11 >> 11) = Q14.
-          delt = (int16_t)((ngprvec[gaussian] * deltaN[gaussian]) >> 11);
-          // Q7 + (Q14 * Q15 >> 22) = Q7.
-          nmk2 = nmk + (int16_t)((delt * kNoiseUpdateConst) >> 22);
-        }
-
-        // Long term correction of the noise mean.
-        // Q8 - Q8 = Q8.
-        ndelt = (feature_minimum << 4) - tmp1_s16;
-        // Q7 + (Q8 * Q8) >> 9 = Q7.
-        nmk3 = nmk2 + (int16_t)((ndelt * kBackEta) >> 9);
-
-        // Control that the noise mean does not drift to much.
-        tmp_s16 = (int16_t) ((k + 5) << 7);
-        if (nmk3 < tmp_s16) {
-          nmk3 = tmp_s16;
-        }
-        tmp_s16 = (int16_t) ((72 + k - channel) << 7);
-        if (nmk3 > tmp_s16) {
-          nmk3 = tmp_s16;
-        }
-        self->noise_means[gaussian] = nmk3;
-
-        if (vadflag) {
-          // Update speech mean vector:
-          // |deltaS| = (x-mu)/sigma^2
-          // sgprvec[k] = |speech_probability[k]| /
-          //   (|speech_probability[0]| + |speech_probability[1]|)
-
-          // (Q14 * Q11) >> 11 = Q14.
-          delt = (int16_t)((sgprvec[gaussian] * deltaS[gaussian]) >> 11);
-          // Q14 * Q15 >> 21 = Q8.
-          tmp_s16 = (int16_t)((delt * kSpeechUpdateConst) >> 21);
-          // Q7 + (Q8 >> 1) = Q7. With rounding.
-          smk2 = smk + ((tmp_s16 + 1) >> 1);
-
-          // Control that the speech mean does not drift to much.
-          maxmu = maxspe + 640;
-          if (smk2 < kMinimumMean[k]) {
-            smk2 = kMinimumMean[k];
-          }
-          if (smk2 > maxmu) {
-            smk2 = maxmu;
-          }
-          self->speech_means[gaussian] = smk2;  // Q7.
-
-          // (Q7 >> 3) = Q4. With rounding.
-          tmp_s16 = ((smk + 4) >> 3);
-
-          tmp_s16 = features[channel] - tmp_s16;  // Q4
-          // (Q11 * Q4 >> 3) = Q12.
-          tmp1_s32 = (deltaS[gaussian] * tmp_s16) >> 3;
-          tmp2_s32 = tmp1_s32 - 4096;
-          tmp_s16 = sgprvec[gaussian] >> 2;
-          // (Q14 >> 2) * Q12 = Q24.
-          tmp1_s32 = tmp_s16 * tmp2_s32;
-
-          tmp2_s32 = tmp1_s32 >> 4;  // Q20
-
-          // 0.1 * Q20 / Q7 = Q13.
-          if (tmp2_s32 > 0) {
-            tmp_s16 = (int16_t) WebRtcSpl_DivW32W16(tmp2_s32, ssk * 10);
-          } else {
-            tmp_s16 = (int16_t) WebRtcSpl_DivW32W16(-tmp2_s32, ssk * 10);
-            tmp_s16 = -tmp_s16;
-          }
-          // Divide by 4 giving an update factor of 0.025 (= 0.1 / 4).
-          // Note that division by 4 equals shift by 2, hence,
-          // (Q13 >> 8) = (Q13 >> 6) / 4 = Q7.
-          tmp_s16 += 128;  // Rounding.
-          ssk += (tmp_s16 >> 8);
-          if (ssk < kMinStd) {
-            ssk = kMinStd;
-          }
-          self->speech_stds[gaussian] = ssk;
-        } else {
-          // Update GMM variance vectors.
-          // deltaN * (features[channel] - nmk) - 1
-          // Q4 - (Q7 >> 3) = Q4.
-          tmp_s16 = features[channel] - (nmk >> 3);
-          // (Q11 * Q4 >> 3) = Q12.
-          tmp1_s32 = (deltaN[gaussian] * tmp_s16) >> 3;
-          tmp1_s32 -= 4096;
-
-          // (Q14 >> 2) * Q12 = Q24.
-          tmp_s16 = (ngprvec[gaussian] + 2) >> 2;
-          tmp2_s32 = OverflowingMulS16ByS32ToS32(tmp_s16, tmp1_s32);
-          // Q20  * approx 0.001 (2^-10=0.0009766), hence,
-          // (Q24 >> 14) = (Q24 >> 4) / 2^10 = Q20.
-          tmp1_s32 = tmp2_s32 >> 14;
-
-          // Q20 / Q7 = Q13.
-          if (tmp1_s32 > 0) {
-            tmp_s16 = (int16_t) WebRtcSpl_DivW32W16(tmp1_s32, nsk);
-          } else {
-            tmp_s16 = (int16_t) WebRtcSpl_DivW32W16(-tmp1_s32, nsk);
-            tmp_s16 = -tmp_s16;
-          }
-          tmp_s16 += 32;  // Rounding
-          nsk += tmp_s16 >> 6;  // Q13 >> 6 = Q7.
-          if (nsk < kMinStd) {
-            nsk = kMinStd;
-          }
-          self->noise_stds[gaussian] = nsk;
-        }
-      }
-
-      // Separate models if they are too close.
-      // |noise_global_mean| in Q14 (= Q7 * Q7).
-      noise_global_mean = WeightedAverage(&self->noise_means[channel], 0,
-                                          &kNoiseDataWeights[channel]);
-
-      // |speech_global_mean| in Q14 (= Q7 * Q7).
-      speech_global_mean = WeightedAverage(&self->speech_means[channel], 0,
-                                           &kSpeechDataWeights[channel]);
-
-      // |diff| = "global" speech mean - "global" noise mean.
-      // (Q14 >> 9) - (Q14 >> 9) = Q5.
-      diff = (int16_t) (speech_global_mean >> 9) -
-          (int16_t) (noise_global_mean >> 9);
-      if (diff < kMinimumDifference[channel]) {
-        tmp_s16 = kMinimumDifference[channel] - diff;
-
-        // |tmp1_s16| = ~0.8 * (kMinimumDifference - diff) in Q7.
-        // |tmp2_s16| = ~0.2 * (kMinimumDifference - diff) in Q7.
-        tmp1_s16 = (int16_t)((13 * tmp_s16) >> 2);
-        tmp2_s16 = (int16_t)((3 * tmp_s16) >> 2);
-
-        // Move Gaussian means for speech model by |tmp1_s16| and update
-        // |speech_global_mean|. Note that |self->speech_means[channel]| is
-        // changed after the call.
-        speech_global_mean = WeightedAverage(&self->speech_means[channel],
-                                             tmp1_s16,
-                                             &kSpeechDataWeights[channel]);
-
-        // Move Gaussian means for noise model by -|tmp2_s16| and update
-        // |noise_global_mean|. Note that |self->noise_means[channel]| is
-        // changed after the call.
-        noise_global_mean = WeightedAverage(&self->noise_means[channel],
-                                            -tmp2_s16,
-                                            &kNoiseDataWeights[channel]);
-      }
-
-      // Control that the speech & noise means do not drift to much.
-      maxspe = kMaximumSpeech[channel];
-      tmp2_s16 = (int16_t) (speech_global_mean >> 7);
-      if (tmp2_s16 > maxspe) {
-        // Upper limit of speech model.
-        tmp2_s16 -= maxspe;
-
-        for (k = 0; k < kNumGaussians; k++) {
-          self->speech_means[channel + k * kNumChannels] -= tmp2_s16;
-        }
-      }
-
-      tmp2_s16 = (int16_t) (noise_global_mean >> 7);
-      if (tmp2_s16 > kMaximumNoise[channel]) {
-        tmp2_s16 -= kMaximumNoise[channel];
-
-        for (k = 0; k < kNumGaussians; k++) {
-          self->noise_means[channel + k * kNumChannels] -= tmp2_s16;
-        }
-      }
-    }
-    self->frame_counter++;
-  }
-
-  // Smooth with respect to transition hysteresis.
-  if (!vadflag) {
-    if (self->over_hang > 0) {
-      vadflag = 2 + self->over_hang;
-      self->over_hang--;
-    }
-    self->num_of_speech = 0;
-  } else {
-    self->num_of_speech++;
-    if (self->num_of_speech > kMaxSpeechFrames) {
-      self->num_of_speech = kMaxSpeechFrames;
-      self->over_hang = overhead2;
-    } else {
-      self->over_hang = overhead1;
-    }
-  }
-  return vadflag;
-}
-
-// Initialize the VAD. Set aggressiveness mode to default value.
-int WebRtcVad_InitCore(VadInstT* self) {
-  int i;
-
-  if (self == NULL) {
-    return -1;
-  }
-
-  // Initialization of general struct variables.
-  self->vad = 1;  // Speech active (=1).
-  self->frame_counter = 0;
-  self->over_hang = 0;
-  self->num_of_speech = 0;
-
-  // Initialization of downsampling filter state.
-  memset(self->downsampling_filter_states, 0,
-         sizeof(self->downsampling_filter_states));
-
-  // Initialization of 48 to 8 kHz downsampling.
-  WebRtcSpl_ResetResample48khzTo8khz(&self->state_48_to_8);
-
-  // Read initial PDF parameters.
-  for (i = 0; i < kTableSize; i++) {
-    self->noise_means[i] = kNoiseDataMeans[i];
-    self->speech_means[i] = kSpeechDataMeans[i];
-    self->noise_stds[i] = kNoiseDataStds[i];
-    self->speech_stds[i] = kSpeechDataStds[i];
-  }
-
-  // Initialize Index and Minimum value vectors.
-  for (i = 0; i < 16 * kNumChannels; i++) {
-    self->low_value_vector[i] = 10000;
-    self->index_vector[i] = 0;
-  }
-
-  // Initialize splitting filter states.
-  memset(self->upper_state, 0, sizeof(self->upper_state));
-  memset(self->lower_state, 0, sizeof(self->lower_state));
-
-  // Initialize high pass filter states.
-  memset(self->hp_filter_state, 0, sizeof(self->hp_filter_state));
-
-  // Initialize mean value memory, for WebRtcVad_FindMinimum().
-  for (i = 0; i < kNumChannels; i++) {
-    self->mean_value[i] = 1600;
-  }
-
-  // Set aggressiveness mode to default (=|kDefaultMode|).
-  if (WebRtcVad_set_mode_core(self, kDefaultMode) != 0) {
-    return -1;
-  }
-
-  self->init_flag = kInitCheck;
-
-  return 0;
-}
-
-// Set aggressiveness mode
-int WebRtcVad_set_mode_core(VadInstT* self, int mode) {
-  int return_value = 0;
-
-  switch (mode) {
-    case 0:
-      // Quality mode.
-      memcpy(self->over_hang_max_1, kOverHangMax1Q,
-             sizeof(self->over_hang_max_1));
-      memcpy(self->over_hang_max_2, kOverHangMax2Q,
-             sizeof(self->over_hang_max_2));
-      memcpy(self->individual, kLocalThresholdQ,
-             sizeof(self->individual));
-      memcpy(self->total, kGlobalThresholdQ,
-             sizeof(self->total));
-      break;
-    case 1:
-      // Low bitrate mode.
-      memcpy(self->over_hang_max_1, kOverHangMax1LBR,
-             sizeof(self->over_hang_max_1));
-      memcpy(self->over_hang_max_2, kOverHangMax2LBR,
-             sizeof(self->over_hang_max_2));
-      memcpy(self->individual, kLocalThresholdLBR,
-             sizeof(self->individual));
-      memcpy(self->total, kGlobalThresholdLBR,
-             sizeof(self->total));
-      break;
-    case 2:
-      // Aggressive mode.
-      memcpy(self->over_hang_max_1, kOverHangMax1AGG,
-             sizeof(self->over_hang_max_1));
-      memcpy(self->over_hang_max_2, kOverHangMax2AGG,
-             sizeof(self->over_hang_max_2));
-      memcpy(self->individual, kLocalThresholdAGG,
-             sizeof(self->individual));
-      memcpy(self->total, kGlobalThresholdAGG,
-             sizeof(self->total));
-      break;
-    case 3:
-      // Very aggressive mode.
-      memcpy(self->over_hang_max_1, kOverHangMax1VAG,
-             sizeof(self->over_hang_max_1));
-      memcpy(self->over_hang_max_2, kOverHangMax2VAG,
-             sizeof(self->over_hang_max_2));
-      memcpy(self->individual, kLocalThresholdVAG,
-             sizeof(self->individual));
-      memcpy(self->total, kGlobalThresholdVAG,
-             sizeof(self->total));
-      break;
-    default:
-      return_value = -1;
-      break;
-  }
-
-  return return_value;
-}
-
-// Calculate VAD decision by first extracting feature values and then calculate
-// probability for both speech and background noise.
-
-int WebRtcVad_CalcVad48khz(VadInstT* inst, const int16_t* speech_frame,
-                           size_t frame_length) {
-  int vad;
-  size_t i;
-  int16_t speech_nb[240];  // 30 ms in 8 kHz.
-  // |tmp_mem| is a temporary memory used by resample function, length is
-  // frame length in 10 ms (480 samples) + 256 extra.
-  int32_t tmp_mem[480 + 256] = { 0 };
-  const size_t kFrameLen10ms48khz = 480;
-  const size_t kFrameLen10ms8khz = 80;
-  size_t num_10ms_frames = frame_length / kFrameLen10ms48khz;
-
-  for (i = 0; i < num_10ms_frames; i++) {
-    WebRtcSpl_Resample48khzTo8khz(speech_frame,
-                                  &speech_nb[i * kFrameLen10ms8khz],
-                                  &inst->state_48_to_8,
-                                  tmp_mem);
-  }
-
-  // Do VAD on an 8 kHz signal
-  vad = WebRtcVad_CalcVad8khz(inst, speech_nb, frame_length / 6);
-
-  return vad;
-}
-
-int WebRtcVad_CalcVad32khz(VadInstT* inst, const int16_t* speech_frame,
-                           size_t frame_length)
-{
-    size_t len;
-    int vad;
-    int16_t speechWB[480]; // Downsampled speech frame: 960 samples (30ms in SWB)
-    int16_t speechNB[240]; // Downsampled speech frame: 480 samples (30ms in WB)
-
-
-    // Downsample signal 32->16->8 before doing VAD
-    WebRtcVad_Downsampling(speech_frame, speechWB, &(inst->downsampling_filter_states[2]),
-                           frame_length);
-    len = frame_length / 2;
-
-    WebRtcVad_Downsampling(speechWB, speechNB, inst->downsampling_filter_states, len);
-    len /= 2;
-
-    // Do VAD on an 8 kHz signal
-    vad = WebRtcVad_CalcVad8khz(inst, speechNB, len);
-
-    return vad;
-}
-
-int WebRtcVad_CalcVad16khz(VadInstT* inst, const int16_t* speech_frame,
-                           size_t frame_length)
-{
-    size_t len;
-    int vad;
-    int16_t speechNB[240]; // Downsampled speech frame: 480 samples (30ms in WB)
-
-    // Wideband: Downsample signal before doing VAD
-    WebRtcVad_Downsampling(speech_frame, speechNB, inst->downsampling_filter_states,
-                           frame_length);
-
-    len = frame_length / 2;
-    vad = WebRtcVad_CalcVad8khz(inst, speechNB, len);
-
-    return vad;
-}
-
-int WebRtcVad_CalcVad8khz(VadInstT* inst, const int16_t* speech_frame,
-                          size_t frame_length)
-{
-    int16_t feature_vector[kNumChannels], total_power;
-
-    // Get power in the bands
-    total_power = WebRtcVad_CalculateFeatures(inst, speech_frame, frame_length,
-                                              feature_vector);
-
-    // Make a VAD
-    inst->vad = GmmProbability(inst, feature_vector, total_power, frame_length);
-
-    return inst->vad;
-}
diff --git a/common_audio/vad/vad_core.h b/common_audio/vad/vad_core.h
deleted file mode 100644
index 47e2d88..0000000
--- a/common_audio/vad/vad_core.h
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- *  Copyright (c) 2012 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.
- */
-
-
-/*
- * This header file includes the descriptions of the core VAD calls.
- */
-
-#ifndef WEBRTC_COMMON_AUDIO_VAD_VAD_CORE_H_
-#define WEBRTC_COMMON_AUDIO_VAD_VAD_CORE_H_
-
-#include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
-#include "webrtc/typedefs.h"
-
-enum { kNumChannels = 6 };  // Number of frequency bands (named channels).
-enum { kNumGaussians = 2 };  // Number of Gaussians per channel in the GMM.
-enum { kTableSize = kNumChannels * kNumGaussians };
-enum { kMinEnergy = 10 };  // Minimum energy required to trigger audio signal.
-
-typedef struct VadInstT_ {
-    int vad;
-    int32_t downsampling_filter_states[4];
-    WebRtcSpl_State48khzTo8khz state_48_to_8;
-    int16_t noise_means[kTableSize];
-    int16_t speech_means[kTableSize];
-    int16_t noise_stds[kTableSize];
-    int16_t speech_stds[kTableSize];
-    // TODO(bjornv): Change to |frame_count|.
-    int32_t frame_counter;
-    int16_t over_hang;  // Over Hang
-    int16_t num_of_speech;
-    // TODO(bjornv): Change to |age_vector|.
-    int16_t index_vector[16 * kNumChannels];
-    int16_t low_value_vector[16 * kNumChannels];
-    // TODO(bjornv): Change to |median|.
-    int16_t mean_value[kNumChannels];
-    int16_t upper_state[5];
-    int16_t lower_state[5];
-    int16_t hp_filter_state[4];
-    int16_t over_hang_max_1[3];
-    int16_t over_hang_max_2[3];
-    int16_t individual[3];
-    int16_t total[3];
-
-    int init_flag;
-} VadInstT;
-
-// Initializes the core VAD component. The default aggressiveness mode is
-// controlled by |kDefaultMode| in vad_core.c.
-//
-// - self [i/o] : Instance that should be initialized
-//
-// returns      : 0 (OK), -1 (null pointer in or if the default mode can't be
-//                set)
-int WebRtcVad_InitCore(VadInstT* self);
-
-/****************************************************************************
- * WebRtcVad_set_mode_core(...)
- *
- * This function changes the VAD settings
- *
- * Input:
- *      - inst      : VAD instance
- *      - mode      : Aggressiveness degree
- *                    0 (High quality) - 3 (Highly aggressive)
- *
- * Output:
- *      - inst      : Changed  instance
- *
- * Return value     :  0 - Ok
- *                    -1 - Error
- */
-
-int WebRtcVad_set_mode_core(VadInstT* self, int mode);
-
-/****************************************************************************
- * WebRtcVad_CalcVad48khz(...)
- * WebRtcVad_CalcVad32khz(...)
- * WebRtcVad_CalcVad16khz(...)
- * WebRtcVad_CalcVad8khz(...)
- *
- * Calculate probability for active speech and make VAD decision.
- *
- * Input:
- *      - inst          : Instance that should be initialized
- *      - speech_frame  : Input speech frame
- *      - frame_length  : Number of input samples
- *
- * Output:
- *      - inst          : Updated filter states etc.
- *
- * Return value         : VAD decision
- *                        0 - No active speech
- *                        1-6 - Active speech
- */
-int WebRtcVad_CalcVad48khz(VadInstT* inst, const int16_t* speech_frame,
-                           size_t frame_length);
-int WebRtcVad_CalcVad32khz(VadInstT* inst, const int16_t* speech_frame,
-                           size_t frame_length);
-int WebRtcVad_CalcVad16khz(VadInstT* inst, const int16_t* speech_frame,
-                           size_t frame_length);
-int WebRtcVad_CalcVad8khz(VadInstT* inst, const int16_t* speech_frame,
-                          size_t frame_length);
-
-#endif  // WEBRTC_COMMON_AUDIO_VAD_VAD_CORE_H_
diff --git a/common_audio/vad/vad_core_unittest.cc b/common_audio/vad/vad_core_unittest.cc
deleted file mode 100644
index d922010..0000000
--- a/common_audio/vad/vad_core_unittest.cc
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- *  Copyright (c) 2012 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 <stdlib.h>
-
-#include "webrtc/common_audio/vad/vad_unittest.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/typedefs.h"
-
-extern "C" {
-#include "webrtc/common_audio/vad/vad_core.h"
-}
-
-namespace webrtc {
-namespace test {
-
-TEST_F(VadTest, InitCore) {
-  // Test WebRtcVad_InitCore().
-  VadInstT* self = reinterpret_cast<VadInstT*>(malloc(sizeof(VadInstT)));
-
-  // null pointer test.
-  EXPECT_EQ(-1, WebRtcVad_InitCore(nullptr));
-
-  // Verify return = 0 for non-null pointer.
-  EXPECT_EQ(0, WebRtcVad_InitCore(self));
-  // Verify init_flag is set.
-  EXPECT_EQ(42, self->init_flag);
-
-  free(self);
-}
-
-TEST_F(VadTest, set_mode_core) {
-  VadInstT* self = reinterpret_cast<VadInstT*>(malloc(sizeof(VadInstT)));
-
-  // TODO(bjornv): Add null pointer check if we take care of it in
-  // vad_core.c
-
-  ASSERT_EQ(0, WebRtcVad_InitCore(self));
-  // Test WebRtcVad_set_mode_core().
-  // Invalid modes should return -1.
-  EXPECT_EQ(-1, WebRtcVad_set_mode_core(self, -1));
-  EXPECT_EQ(-1, WebRtcVad_set_mode_core(self, 1000));
-  // Valid modes should return 0.
-  for (size_t j = 0; j < kModesSize; ++j) {
-    EXPECT_EQ(0, WebRtcVad_set_mode_core(self, kModes[j]));
-  }
-
-  free(self);
-}
-
-TEST_F(VadTest, CalcVad) {
-  VadInstT* self = reinterpret_cast<VadInstT*>(malloc(sizeof(VadInstT)));
-  int16_t speech[kMaxFrameLength];
-
-  // TODO(bjornv): Add null pointer check if we take care of it in
-  // vad_core.c
-
-  // Test WebRtcVad_CalcVadXXkhz()
-  // Verify that all zeros in gives VAD = 0 out.
-  memset(speech, 0, sizeof(speech));
-  ASSERT_EQ(0, WebRtcVad_InitCore(self));
-  for (size_t j = 0; j < kFrameLengthsSize; ++j) {
-    if (ValidRatesAndFrameLengths(8000, kFrameLengths[j])) {
-      EXPECT_EQ(0, WebRtcVad_CalcVad8khz(self, speech, kFrameLengths[j]));
-    }
-    if (ValidRatesAndFrameLengths(16000, kFrameLengths[j])) {
-      EXPECT_EQ(0, WebRtcVad_CalcVad16khz(self, speech, kFrameLengths[j]));
-    }
-    if (ValidRatesAndFrameLengths(32000, kFrameLengths[j])) {
-      EXPECT_EQ(0, WebRtcVad_CalcVad32khz(self, speech, kFrameLengths[j]));
-    }
-    if (ValidRatesAndFrameLengths(48000, kFrameLengths[j])) {
-      EXPECT_EQ(0, WebRtcVad_CalcVad48khz(self, speech, kFrameLengths[j]));
-    }
-  }
-
-  // Construct a speech signal that will trigger the VAD in all modes. It is
-  // known that (i * i) will wrap around, but that doesn't matter in this case.
-  for (size_t i = 0; i < kMaxFrameLength; ++i) {
-    speech[i] = static_cast<int16_t>(i * i);
-  }
-  for (size_t j = 0; j < kFrameLengthsSize; ++j) {
-    if (ValidRatesAndFrameLengths(8000, kFrameLengths[j])) {
-      EXPECT_EQ(1, WebRtcVad_CalcVad8khz(self, speech, kFrameLengths[j]));
-    }
-    if (ValidRatesAndFrameLengths(16000, kFrameLengths[j])) {
-      EXPECT_EQ(1, WebRtcVad_CalcVad16khz(self, speech, kFrameLengths[j]));
-    }
-    if (ValidRatesAndFrameLengths(32000, kFrameLengths[j])) {
-      EXPECT_EQ(1, WebRtcVad_CalcVad32khz(self, speech, kFrameLengths[j]));
-    }
-    if (ValidRatesAndFrameLengths(48000, kFrameLengths[j])) {
-      EXPECT_EQ(1, WebRtcVad_CalcVad48khz(self, speech, kFrameLengths[j]));
-    }
-  }
-
-  free(self);
-}
-}  // namespace test
-}  // namespace webrtc
diff --git a/common_audio/vad/vad_filterbank.c b/common_audio/vad/vad_filterbank.c
deleted file mode 100644
index 6aee7b7..0000000
--- a/common_audio/vad/vad_filterbank.c
+++ /dev/null
@@ -1,330 +0,0 @@
-/*
- *  Copyright (c) 2012 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/common_audio/vad/vad_filterbank.h"
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
-#include "webrtc/typedefs.h"
-
-// Constants used in LogOfEnergy().
-static const int16_t kLogConst = 24660;  // 160*log10(2) in Q9.
-static const int16_t kLogEnergyIntPart = 14336;  // 14 in Q10
-
-// Coefficients used by HighPassFilter, Q14.
-static const int16_t kHpZeroCoefs[3] = { 6631, -13262, 6631 };
-static const int16_t kHpPoleCoefs[3] = { 16384, -7756, 5620 };
-
-// Allpass filter coefficients, upper and lower, in Q15.
-// Upper: 0.64, Lower: 0.17
-static const int16_t kAllPassCoefsQ15[2] = { 20972, 5571 };
-
-// Adjustment for division with two in SplitFilter.
-static const int16_t kOffsetVector[6] = { 368, 368, 272, 176, 176, 176 };
-
-// High pass filtering, with a cut-off frequency at 80 Hz, if the |data_in| is
-// sampled at 500 Hz.
-//
-// - data_in      [i]   : Input audio data sampled at 500 Hz.
-// - data_length  [i]   : Length of input and output data.
-// - filter_state [i/o] : State of the filter.
-// - data_out     [o]   : Output audio data in the frequency interval
-//                        80 - 250 Hz.
-static void HighPassFilter(const int16_t* data_in, size_t data_length,
-                           int16_t* filter_state, int16_t* data_out) {
-  size_t i;
-  const int16_t* in_ptr = data_in;
-  int16_t* out_ptr = data_out;
-  int32_t tmp32 = 0;
-
-
-  // The sum of the absolute values of the impulse response:
-  // The zero/pole-filter has a max amplification of a single sample of: 1.4546
-  // Impulse response: 0.4047 -0.6179 -0.0266  0.1993  0.1035  -0.0194
-  // The all-zero section has a max amplification of a single sample of: 1.6189
-  // Impulse response: 0.4047 -0.8094  0.4047  0       0        0
-  // The all-pole section has a max amplification of a single sample of: 1.9931
-  // Impulse response: 1.0000  0.4734 -0.1189 -0.2187 -0.0627   0.04532
-
-  for (i = 0; i < data_length; i++) {
-    // All-zero section (filter coefficients in Q14).
-    tmp32 = kHpZeroCoefs[0] * *in_ptr;
-    tmp32 += kHpZeroCoefs[1] * filter_state[0];
-    tmp32 += kHpZeroCoefs[2] * filter_state[1];
-    filter_state[1] = filter_state[0];
-    filter_state[0] = *in_ptr++;
-
-    // All-pole section (filter coefficients in Q14).
-    tmp32 -= kHpPoleCoefs[1] * filter_state[2];
-    tmp32 -= kHpPoleCoefs[2] * filter_state[3];
-    filter_state[3] = filter_state[2];
-    filter_state[2] = (int16_t) (tmp32 >> 14);
-    *out_ptr++ = filter_state[2];
-  }
-}
-
-// All pass filtering of |data_in|, used before splitting the signal into two
-// frequency bands (low pass vs high pass).
-// Note that |data_in| and |data_out| can NOT correspond to the same address.
-//
-// - data_in            [i]   : Input audio signal given in Q0.
-// - data_length        [i]   : Length of input and output data.
-// - filter_coefficient [i]   : Given in Q15.
-// - filter_state       [i/o] : State of the filter given in Q(-1).
-// - data_out           [o]   : Output audio signal given in Q(-1).
-static void AllPassFilter(const int16_t* data_in, size_t data_length,
-                          int16_t filter_coefficient, int16_t* filter_state,
-                          int16_t* data_out) {
-  // The filter can only cause overflow (in the w16 output variable)
-  // if more than 4 consecutive input numbers are of maximum value and
-  // has the the same sign as the impulse responses first taps.
-  // First 6 taps of the impulse response:
-  // 0.6399 0.5905 -0.3779 0.2418 -0.1547 0.0990
-
-  size_t i;
-  int16_t tmp16 = 0;
-  int32_t tmp32 = 0;
-  int32_t state32 = ((int32_t) (*filter_state) << 16);  // Q15
-
-  for (i = 0; i < data_length; i++) {
-    tmp32 = state32 + filter_coefficient * *data_in;
-    tmp16 = (int16_t) (tmp32 >> 16);  // Q(-1)
-    *data_out++ = tmp16;
-    state32 = (*data_in << 14) - filter_coefficient * tmp16;  // Q14
-    state32 <<= 1;  // Q15.
-    data_in += 2;
-  }
-
-  *filter_state = (int16_t) (state32 >> 16);  // Q(-1)
-}
-
-// Splits |data_in| into |hp_data_out| and |lp_data_out| corresponding to
-// an upper (high pass) part and a lower (low pass) part respectively.
-//
-// - data_in      [i]   : Input audio data to be split into two frequency bands.
-// - data_length  [i]   : Length of |data_in|.
-// - upper_state  [i/o] : State of the upper filter, given in Q(-1).
-// - lower_state  [i/o] : State of the lower filter, given in Q(-1).
-// - hp_data_out  [o]   : Output audio data of the upper half of the spectrum.
-//                        The length is |data_length| / 2.
-// - lp_data_out  [o]   : Output audio data of the lower half of the spectrum.
-//                        The length is |data_length| / 2.
-static void SplitFilter(const int16_t* data_in, size_t data_length,
-                        int16_t* upper_state, int16_t* lower_state,
-                        int16_t* hp_data_out, int16_t* lp_data_out) {
-  size_t i;
-  size_t half_length = data_length >> 1;  // Downsampling by 2.
-  int16_t tmp_out;
-
-  // All-pass filtering upper branch.
-  AllPassFilter(&data_in[0], half_length, kAllPassCoefsQ15[0], upper_state,
-                hp_data_out);
-
-  // All-pass filtering lower branch.
-  AllPassFilter(&data_in[1], half_length, kAllPassCoefsQ15[1], lower_state,
-                lp_data_out);
-
-  // Make LP and HP signals.
-  for (i = 0; i < half_length; i++) {
-    tmp_out = *hp_data_out;
-    *hp_data_out++ -= *lp_data_out;
-    *lp_data_out++ += tmp_out;
-  }
-}
-
-// Calculates the energy of |data_in| in dB, and also updates an overall
-// |total_energy| if necessary.
-//
-// - data_in      [i]   : Input audio data for energy calculation.
-// - data_length  [i]   : Length of input data.
-// - offset       [i]   : Offset value added to |log_energy|.
-// - total_energy [i/o] : An external energy updated with the energy of
-//                        |data_in|.
-//                        NOTE: |total_energy| is only updated if
-//                        |total_energy| <= |kMinEnergy|.
-// - log_energy   [o]   : 10 * log10("energy of |data_in|") given in Q4.
-static void LogOfEnergy(const int16_t* data_in, size_t data_length,
-                        int16_t offset, int16_t* total_energy,
-                        int16_t* log_energy) {
-  // |tot_rshifts| accumulates the number of right shifts performed on |energy|.
-  int tot_rshifts = 0;
-  // The |energy| will be normalized to 15 bits. We use unsigned integer because
-  // we eventually will mask out the fractional part.
-  uint32_t energy = 0;
-
-  RTC_DCHECK(data_in);
-  RTC_DCHECK_GT(data_length, 0);
-
-  energy = (uint32_t) WebRtcSpl_Energy((int16_t*) data_in, data_length,
-                                       &tot_rshifts);
-
-  if (energy != 0) {
-    // By construction, normalizing to 15 bits is equivalent with 17 leading
-    // zeros of an unsigned 32 bit value.
-    int normalizing_rshifts = 17 - WebRtcSpl_NormU32(energy);
-    // In a 15 bit representation the leading bit is 2^14. log2(2^14) in Q10 is
-    // (14 << 10), which is what we initialize |log2_energy| with. For a more
-    // detailed derivations, see below.
-    int16_t log2_energy = kLogEnergyIntPart;
-
-    tot_rshifts += normalizing_rshifts;
-    // Normalize |energy| to 15 bits.
-    // |tot_rshifts| is now the total number of right shifts performed on
-    // |energy| after normalization. This means that |energy| is in
-    // Q(-tot_rshifts).
-    if (normalizing_rshifts < 0) {
-      energy <<= -normalizing_rshifts;
-    } else {
-      energy >>= normalizing_rshifts;
-    }
-
-    // Calculate the energy of |data_in| in dB, in Q4.
-    //
-    // 10 * log10("true energy") in Q4 = 2^4 * 10 * log10("true energy") =
-    // 160 * log10(|energy| * 2^|tot_rshifts|) =
-    // 160 * log10(2) * log2(|energy| * 2^|tot_rshifts|) =
-    // 160 * log10(2) * (log2(|energy|) + log2(2^|tot_rshifts|)) =
-    // (160 * log10(2)) * (log2(|energy|) + |tot_rshifts|) =
-    // |kLogConst| * (|log2_energy| + |tot_rshifts|)
-    //
-    // We know by construction that |energy| is normalized to 15 bits. Hence,
-    // |energy| = 2^14 + frac_Q15, where frac_Q15 is a fractional part in Q15.
-    // Further, we'd like |log2_energy| in Q10
-    // log2(|energy|) in Q10 = 2^10 * log2(2^14 + frac_Q15) =
-    // 2^10 * log2(2^14 * (1 + frac_Q15 * 2^-14)) =
-    // 2^10 * (14 + log2(1 + frac_Q15 * 2^-14)) ~=
-    // (14 << 10) + 2^10 * (frac_Q15 * 2^-14) =
-    // (14 << 10) + (frac_Q15 * 2^-4) = (14 << 10) + (frac_Q15 >> 4)
-    //
-    // Note that frac_Q15 = (|energy| & 0x00003FFF)
-
-    // Calculate and add the fractional part to |log2_energy|.
-    log2_energy += (int16_t) ((energy & 0x00003FFF) >> 4);
-
-    // |kLogConst| is in Q9, |log2_energy| in Q10 and |tot_rshifts| in Q0.
-    // Note that we in our derivation above have accounted for an output in Q4.
-    *log_energy = (int16_t)(((kLogConst * log2_energy) >> 19) +
-        ((tot_rshifts * kLogConst) >> 9));
-
-    if (*log_energy < 0) {
-      *log_energy = 0;
-    }
-  } else {
-    *log_energy = offset;
-    return;
-  }
-
-  *log_energy += offset;
-
-  // Update the approximate |total_energy| with the energy of |data_in|, if
-  // |total_energy| has not exceeded |kMinEnergy|. |total_energy| is used as an
-  // energy indicator in WebRtcVad_GmmProbability() in vad_core.c.
-  if (*total_energy <= kMinEnergy) {
-    if (tot_rshifts >= 0) {
-      // We know by construction that the |energy| > |kMinEnergy| in Q0, so add
-      // an arbitrary value such that |total_energy| exceeds |kMinEnergy|.
-      *total_energy += kMinEnergy + 1;
-    } else {
-      // By construction |energy| is represented by 15 bits, hence any number of
-      // right shifted |energy| will fit in an int16_t. In addition, adding the
-      // value to |total_energy| is wrap around safe as long as
-      // |kMinEnergy| < 8192.
-      *total_energy += (int16_t) (energy >> -tot_rshifts);  // Q0.
-    }
-  }
-}
-
-int16_t WebRtcVad_CalculateFeatures(VadInstT* self, const int16_t* data_in,
-                                    size_t data_length, int16_t* features) {
-  int16_t total_energy = 0;
-  // We expect |data_length| to be 80, 160 or 240 samples, which corresponds to
-  // 10, 20 or 30 ms in 8 kHz. Therefore, the intermediate downsampled data will
-  // have at most 120 samples after the first split and at most 60 samples after
-  // the second split.
-  int16_t hp_120[120], lp_120[120];
-  int16_t hp_60[60], lp_60[60];
-  const size_t half_data_length = data_length >> 1;
-  size_t length = half_data_length;  // |data_length| / 2, corresponds to
-                                     // bandwidth = 2000 Hz after downsampling.
-
-  // Initialize variables for the first SplitFilter().
-  int frequency_band = 0;
-  const int16_t* in_ptr = data_in;  // [0 - 4000] Hz.
-  int16_t* hp_out_ptr = hp_120;  // [2000 - 4000] Hz.
-  int16_t* lp_out_ptr = lp_120;  // [0 - 2000] Hz.
-
-  RTC_DCHECK_LE(data_length, 240);
-  RTC_DCHECK_LT(4, kNumChannels - 1);  // Checking maximum |frequency_band|.
-
-  // Split at 2000 Hz and downsample.
-  SplitFilter(in_ptr, data_length, &self->upper_state[frequency_band],
-              &self->lower_state[frequency_band], hp_out_ptr, lp_out_ptr);
-
-  // For the upper band (2000 Hz - 4000 Hz) split at 3000 Hz and downsample.
-  frequency_band = 1;
-  in_ptr = hp_120;  // [2000 - 4000] Hz.
-  hp_out_ptr = hp_60;  // [3000 - 4000] Hz.
-  lp_out_ptr = lp_60;  // [2000 - 3000] Hz.
-  SplitFilter(in_ptr, length, &self->upper_state[frequency_band],
-              &self->lower_state[frequency_band], hp_out_ptr, lp_out_ptr);
-
-  // Energy in 3000 Hz - 4000 Hz.
-  length >>= 1;  // |data_length| / 4 <=> bandwidth = 1000 Hz.
-
-  LogOfEnergy(hp_60, length, kOffsetVector[5], &total_energy, &features[5]);
-
-  // Energy in 2000 Hz - 3000 Hz.
-  LogOfEnergy(lp_60, length, kOffsetVector[4], &total_energy, &features[4]);
-
-  // For the lower band (0 Hz - 2000 Hz) split at 1000 Hz and downsample.
-  frequency_band = 2;
-  in_ptr = lp_120;  // [0 - 2000] Hz.
-  hp_out_ptr = hp_60;  // [1000 - 2000] Hz.
-  lp_out_ptr = lp_60;  // [0 - 1000] Hz.
-  length = half_data_length;  // |data_length| / 2 <=> bandwidth = 2000 Hz.
-  SplitFilter(in_ptr, length, &self->upper_state[frequency_band],
-              &self->lower_state[frequency_band], hp_out_ptr, lp_out_ptr);
-
-  // Energy in 1000 Hz - 2000 Hz.
-  length >>= 1;  // |data_length| / 4 <=> bandwidth = 1000 Hz.
-  LogOfEnergy(hp_60, length, kOffsetVector[3], &total_energy, &features[3]);
-
-  // For the lower band (0 Hz - 1000 Hz) split at 500 Hz and downsample.
-  frequency_band = 3;
-  in_ptr = lp_60;  // [0 - 1000] Hz.
-  hp_out_ptr = hp_120;  // [500 - 1000] Hz.
-  lp_out_ptr = lp_120;  // [0 - 500] Hz.
-  SplitFilter(in_ptr, length, &self->upper_state[frequency_band],
-              &self->lower_state[frequency_band], hp_out_ptr, lp_out_ptr);
-
-  // Energy in 500 Hz - 1000 Hz.
-  length >>= 1;  // |data_length| / 8 <=> bandwidth = 500 Hz.
-  LogOfEnergy(hp_120, length, kOffsetVector[2], &total_energy, &features[2]);
-
-  // For the lower band (0 Hz - 500 Hz) split at 250 Hz and downsample.
-  frequency_band = 4;
-  in_ptr = lp_120;  // [0 - 500] Hz.
-  hp_out_ptr = hp_60;  // [250 - 500] Hz.
-  lp_out_ptr = lp_60;  // [0 - 250] Hz.
-  SplitFilter(in_ptr, length, &self->upper_state[frequency_band],
-              &self->lower_state[frequency_band], hp_out_ptr, lp_out_ptr);
-
-  // Energy in 250 Hz - 500 Hz.
-  length >>= 1;  // |data_length| / 16 <=> bandwidth = 250 Hz.
-  LogOfEnergy(hp_60, length, kOffsetVector[1], &total_energy, &features[1]);
-
-  // Remove 0 Hz - 80 Hz, by high pass filtering the lower band.
-  HighPassFilter(lp_60, length, self->hp_filter_state, hp_120);
-
-  // Energy in 80 Hz - 250 Hz.
-  LogOfEnergy(hp_120, length, kOffsetVector[0], &total_energy, &features[0]);
-
-  return total_energy;
-}
diff --git a/common_audio/vad/vad_filterbank.h b/common_audio/vad/vad_filterbank.h
deleted file mode 100644
index 42bf3fc..0000000
--- a/common_audio/vad/vad_filterbank.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- *  Copyright (c) 2012 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.
- */
-
-/*
- * This file includes feature calculating functionality used in vad_core.c.
- */
-
-#ifndef WEBRTC_COMMON_AUDIO_VAD_VAD_FILTERBANK_H_
-#define WEBRTC_COMMON_AUDIO_VAD_VAD_FILTERBANK_H_
-
-#include "webrtc/common_audio/vad/vad_core.h"
-#include "webrtc/typedefs.h"
-
-// Takes |data_length| samples of |data_in| and calculates the logarithm of the
-// energy of each of the |kNumChannels| = 6 frequency bands used by the VAD:
-//        80 Hz - 250 Hz
-//        250 Hz - 500 Hz
-//        500 Hz - 1000 Hz
-//        1000 Hz - 2000 Hz
-//        2000 Hz - 3000 Hz
-//        3000 Hz - 4000 Hz
-//
-// The values are given in Q4 and written to |features|. Further, an approximate
-// overall energy is returned. The return value is used in
-// WebRtcVad_GmmProbability() as a signal indicator, hence it is arbitrary above
-// the threshold |kMinEnergy|.
-//
-// - self         [i/o] : State information of the VAD.
-// - data_in      [i]   : Input audio data, for feature extraction.
-// - data_length  [i]   : Audio data size, in number of samples.
-// - features     [o]   : 10 * log10(energy in each frequency band), Q4.
-// - returns            : Total energy of the signal (NOTE! This value is not
-//                        exact. It is only used in a comparison.)
-int16_t WebRtcVad_CalculateFeatures(VadInstT* self, const int16_t* data_in,
-                                    size_t data_length, int16_t* features);
-
-#endif  // WEBRTC_COMMON_AUDIO_VAD_VAD_FILTERBANK_H_
diff --git a/common_audio/vad/vad_filterbank_unittest.cc b/common_audio/vad/vad_filterbank_unittest.cc
deleted file mode 100644
index d15fc1b..0000000
--- a/common_audio/vad/vad_filterbank_unittest.cc
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- *  Copyright (c) 2012 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 <stdlib.h>
-
-#include "webrtc/common_audio/vad/vad_unittest.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/typedefs.h"
-
-extern "C" {
-#include "webrtc/common_audio/vad/vad_core.h"
-#include "webrtc/common_audio/vad/vad_filterbank.h"
-}
-
-namespace webrtc {
-namespace test {
-
-const int kNumValidFrameLengths = 3;
-
-TEST_F(VadTest, vad_filterbank) {
-  VadInstT* self = reinterpret_cast<VadInstT*>(malloc(sizeof(VadInstT)));
-  static const int16_t kReference[kNumValidFrameLengths] = { 48, 11, 11 };
-  static const int16_t kFeatures[kNumValidFrameLengths * kNumChannels] = {
-      1213, 759, 587, 462, 434, 272,
-      1479, 1385, 1291, 1200, 1103, 1099,
-      1732, 1692, 1681, 1629, 1436, 1436
-  };
-  static const int16_t kOffsetVector[kNumChannels] = {
-      368, 368, 272, 176, 176, 176 };
-  int16_t features[kNumChannels];
-
-  // Construct a speech signal that will trigger the VAD in all modes. It is
-  // known that (i * i) will wrap around, but that doesn't matter in this case.
-  int16_t speech[kMaxFrameLength];
-  for (size_t i = 0; i < kMaxFrameLength; ++i) {
-    speech[i] = static_cast<int16_t>(i * i);
-  }
-
-  int frame_length_index = 0;
-  ASSERT_EQ(0, WebRtcVad_InitCore(self));
-  for (size_t j = 0; j < kFrameLengthsSize; ++j) {
-    if (ValidRatesAndFrameLengths(8000, kFrameLengths[j])) {
-      EXPECT_EQ(kReference[frame_length_index],
-                WebRtcVad_CalculateFeatures(self, speech, kFrameLengths[j],
-                                            features));
-      for (int k = 0; k < kNumChannels; ++k) {
-        EXPECT_EQ(kFeatures[k + frame_length_index * kNumChannels],
-                  features[k]);
-      }
-      frame_length_index++;
-    }
-  }
-  EXPECT_EQ(kNumValidFrameLengths, frame_length_index);
-
-  // Verify that all zeros in gives kOffsetVector out.
-  memset(speech, 0, sizeof(speech));
-  ASSERT_EQ(0, WebRtcVad_InitCore(self));
-  for (size_t j = 0; j < kFrameLengthsSize; ++j) {
-    if (ValidRatesAndFrameLengths(8000, kFrameLengths[j])) {
-      EXPECT_EQ(0, WebRtcVad_CalculateFeatures(self, speech, kFrameLengths[j],
-                                               features));
-      for (int k = 0; k < kNumChannels; ++k) {
-        EXPECT_EQ(kOffsetVector[k], features[k]);
-      }
-    }
-  }
-
-  // Verify that all ones in gives kOffsetVector out. Any other constant input
-  // will have a small impact in the sub bands.
-  for (size_t i = 0; i < kMaxFrameLength; ++i) {
-    speech[i] = 1;
-  }
-  for (size_t j = 0; j < kFrameLengthsSize; ++j) {
-    if (ValidRatesAndFrameLengths(8000, kFrameLengths[j])) {
-      ASSERT_EQ(0, WebRtcVad_InitCore(self));
-      EXPECT_EQ(0, WebRtcVad_CalculateFeatures(self, speech, kFrameLengths[j],
-                                               features));
-      for (int k = 0; k < kNumChannels; ++k) {
-        EXPECT_EQ(kOffsetVector[k], features[k]);
-      }
-    }
-  }
-
-  free(self);
-}
-}  // namespace test
-}  // namespace webrtc
diff --git a/common_audio/vad/vad_gmm.c b/common_audio/vad/vad_gmm.c
deleted file mode 100644
index 4a01440..0000000
--- a/common_audio/vad/vad_gmm.c
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- *  Copyright (c) 2011 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/common_audio/vad/vad_gmm.h"
-
-#include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
-#include "webrtc/typedefs.h"
-
-static const int32_t kCompVar = 22005;
-static const int16_t kLog2Exp = 5909;  // log2(exp(1)) in Q12.
-
-// For a normal distribution, the probability of |input| is calculated and
-// returned (in Q20). The formula for normal distributed probability is
-//
-// 1 / s * exp(-(x - m)^2 / (2 * s^2))
-//
-// where the parameters are given in the following Q domains:
-// m = |mean| (Q7)
-// s = |std| (Q7)
-// x = |input| (Q4)
-// in addition to the probability we output |delta| (in Q11) used when updating
-// the noise/speech model.
-int32_t WebRtcVad_GaussianProbability(int16_t input,
-                                      int16_t mean,
-                                      int16_t std,
-                                      int16_t* delta) {
-  int16_t tmp16, inv_std, inv_std2, exp_value = 0;
-  int32_t tmp32;
-
-  // Calculate |inv_std| = 1 / s, in Q10.
-  // 131072 = 1 in Q17, and (|std| >> 1) is for rounding instead of truncation.
-  // Q-domain: Q17 / Q7 = Q10.
-  tmp32 = (int32_t) 131072 + (int32_t) (std >> 1);
-  inv_std = (int16_t) WebRtcSpl_DivW32W16(tmp32, std);
-
-  // Calculate |inv_std2| = 1 / s^2, in Q14.
-  tmp16 = (inv_std >> 2);  // Q10 -> Q8.
-  // Q-domain: (Q8 * Q8) >> 2 = Q14.
-  inv_std2 = (int16_t)((tmp16 * tmp16) >> 2);
-  // TODO(bjornv): Investigate if changing to
-  // inv_std2 = (int16_t)((inv_std * inv_std) >> 6);
-  // gives better accuracy.
-
-  tmp16 = (input << 3);  // Q4 -> Q7
-  tmp16 = tmp16 - mean;  // Q7 - Q7 = Q7
-
-  // To be used later, when updating noise/speech model.
-  // |delta| = (x - m) / s^2, in Q11.
-  // Q-domain: (Q14 * Q7) >> 10 = Q11.
-  *delta = (int16_t)((inv_std2 * tmp16) >> 10);
-
-  // Calculate the exponent |tmp32| = (x - m)^2 / (2 * s^2), in Q10. Replacing
-  // division by two with one shift.
-  // Q-domain: (Q11 * Q7) >> 8 = Q10.
-  tmp32 = (*delta * tmp16) >> 9;
-
-  // If the exponent is small enough to give a non-zero probability we calculate
-  // |exp_value| ~= exp(-(x - m)^2 / (2 * s^2))
-  //             ~= exp2(-log2(exp(1)) * |tmp32|).
-  if (tmp32 < kCompVar) {
-    // Calculate |tmp16| = log2(exp(1)) * |tmp32|, in Q10.
-    // Q-domain: (Q12 * Q10) >> 12 = Q10.
-    tmp16 = (int16_t)((kLog2Exp * tmp32) >> 12);
-    tmp16 = -tmp16;
-    exp_value = (0x0400 | (tmp16 & 0x03FF));
-    tmp16 ^= 0xFFFF;
-    tmp16 >>= 10;
-    tmp16 += 1;
-    // Get |exp_value| = exp(-|tmp32|) in Q10.
-    exp_value >>= tmp16;
-  }
-
-  // Calculate and return (1 / s) * exp(-(x - m)^2 / (2 * s^2)), in Q20.
-  // Q-domain: Q10 * Q10 = Q20.
-  return inv_std * exp_value;
-}
diff --git a/common_audio/vad/vad_gmm.h b/common_audio/vad/vad_gmm.h
deleted file mode 100644
index 992a156..0000000
--- a/common_audio/vad/vad_gmm.h
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-// Gaussian probability calculations internally used in vad_core.c.
-
-#ifndef WEBRTC_COMMON_AUDIO_VAD_VAD_GMM_H_
-#define WEBRTC_COMMON_AUDIO_VAD_VAD_GMM_H_
-
-#include "webrtc/typedefs.h"
-
-// Calculates the probability for |input|, given that |input| comes from a
-// normal distribution with mean and standard deviation (|mean|, |std|).
-//
-// Inputs:
-//      - input         : input sample in Q4.
-//      - mean          : mean input in the statistical model, Q7.
-//      - std           : standard deviation, Q7.
-//
-// Output:
-//
-//      - delta         : input used when updating the model, Q11.
-//                        |delta| = (|input| - |mean|) / |std|^2.
-//
-// Return:
-//   (probability for |input|) =
-//    1 / |std| * exp(-(|input| - |mean|)^2 / (2 * |std|^2));
-int32_t WebRtcVad_GaussianProbability(int16_t input,
-                                      int16_t mean,
-                                      int16_t std,
-                                      int16_t* delta);
-
-#endif  // WEBRTC_COMMON_AUDIO_VAD_VAD_GMM_H_
diff --git a/common_audio/vad/vad_gmm_unittest.cc b/common_audio/vad/vad_gmm_unittest.cc
deleted file mode 100644
index 7d95111..0000000
--- a/common_audio/vad/vad_gmm_unittest.cc
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- *  Copyright (c) 2011 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/common_audio/vad/vad_unittest.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/typedefs.h"
-
-extern "C" {
-#include "webrtc/common_audio/vad/vad_gmm.h"
-}
-
-namespace webrtc {
-namespace test {
-
-TEST_F(VadTest, vad_gmm) {
-  int16_t delta = 0;
-  // Input value at mean.
-  EXPECT_EQ(1048576, WebRtcVad_GaussianProbability(0, 0, 128, &delta));
-  EXPECT_EQ(0, delta);
-  EXPECT_EQ(1048576, WebRtcVad_GaussianProbability(16, 128, 128, &delta));
-  EXPECT_EQ(0, delta);
-  EXPECT_EQ(1048576, WebRtcVad_GaussianProbability(-16, -128, 128, &delta));
-  EXPECT_EQ(0, delta);
-
-  // Largest possible input to give non-zero probability.
-  EXPECT_EQ(1024, WebRtcVad_GaussianProbability(59, 0, 128, &delta));
-  EXPECT_EQ(7552, delta);
-  EXPECT_EQ(1024, WebRtcVad_GaussianProbability(75, 128, 128, &delta));
-  EXPECT_EQ(7552, delta);
-  EXPECT_EQ(1024, WebRtcVad_GaussianProbability(-75, -128, 128, &delta));
-  EXPECT_EQ(-7552, delta);
-
-  // Too large input, should give zero probability.
-  EXPECT_EQ(0, WebRtcVad_GaussianProbability(105, 0, 128, &delta));
-  EXPECT_EQ(13440, delta);
-}
-}  // namespace test
-}  // namespace webrtc
diff --git a/common_audio/vad/vad_sp.c b/common_audio/vad/vad_sp.c
deleted file mode 100644
index 4191c03..0000000
--- a/common_audio/vad/vad_sp.c
+++ /dev/null
@@ -1,177 +0,0 @@
-/*
- *  Copyright (c) 2012 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/common_audio/vad/vad_sp.h"
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
-#include "webrtc/common_audio/vad/vad_core.h"
-#include "webrtc/typedefs.h"
-
-// Allpass filter coefficients, upper and lower, in Q13.
-// Upper: 0.64, Lower: 0.17.
-static const int16_t kAllPassCoefsQ13[2] = { 5243, 1392 };  // Q13.
-static const int16_t kSmoothingDown = 6553;  // 0.2 in Q15.
-static const int16_t kSmoothingUp = 32439;  // 0.99 in Q15.
-
-// TODO(bjornv): Move this function to vad_filterbank.c.
-// Downsampling filter based on splitting filter and allpass functions.
-void WebRtcVad_Downsampling(const int16_t* signal_in,
-                            int16_t* signal_out,
-                            int32_t* filter_state,
-                            size_t in_length) {
-  int16_t tmp16_1 = 0, tmp16_2 = 0;
-  int32_t tmp32_1 = filter_state[0];
-  int32_t tmp32_2 = filter_state[1];
-  size_t n = 0;
-  // Downsampling by 2 gives half length.
-  size_t half_length = (in_length >> 1);
-
-  // Filter coefficients in Q13, filter state in Q0.
-  for (n = 0; n < half_length; n++) {
-    // All-pass filtering upper branch.
-    tmp16_1 = (int16_t) ((tmp32_1 >> 1) +
-        ((kAllPassCoefsQ13[0] * *signal_in) >> 14));
-    *signal_out = tmp16_1;
-    tmp32_1 = (int32_t)(*signal_in++) - ((kAllPassCoefsQ13[0] * tmp16_1) >> 12);
-
-    // All-pass filtering lower branch.
-    tmp16_2 = (int16_t) ((tmp32_2 >> 1) +
-        ((kAllPassCoefsQ13[1] * *signal_in) >> 14));
-    *signal_out++ += tmp16_2;
-    tmp32_2 = (int32_t)(*signal_in++) - ((kAllPassCoefsQ13[1] * tmp16_2) >> 12);
-  }
-  // Store the filter states.
-  filter_state[0] = tmp32_1;
-  filter_state[1] = tmp32_2;
-}
-
-// Inserts |feature_value| into |low_value_vector|, if it is one of the 16
-// smallest values the last 100 frames. Then calculates and returns the median
-// of the five smallest values.
-int16_t WebRtcVad_FindMinimum(VadInstT* self,
-                              int16_t feature_value,
-                              int channel) {
-  int i = 0, j = 0;
-  int position = -1;
-  // Offset to beginning of the 16 minimum values in memory.
-  const int offset = (channel << 4);
-  int16_t current_median = 1600;
-  int16_t alpha = 0;
-  int32_t tmp32 = 0;
-  // Pointer to memory for the 16 minimum values and the age of each value of
-  // the |channel|.
-  int16_t* age = &self->index_vector[offset];
-  int16_t* smallest_values = &self->low_value_vector[offset];
-
-  RTC_DCHECK_LT(channel, kNumChannels);
-
-  // Each value in |smallest_values| is getting 1 loop older. Update |age|, and
-  // remove old values.
-  for (i = 0; i < 16; i++) {
-    if (age[i] != 100) {
-      age[i]++;
-    } else {
-      // Too old value. Remove from memory and shift larger values downwards.
-      for (j = i; j < 16; j++) {
-        smallest_values[j] = smallest_values[j + 1];
-        age[j] = age[j + 1];
-      }
-      age[15] = 101;
-      smallest_values[15] = 10000;
-    }
-  }
-
-  // Check if |feature_value| is smaller than any of the values in
-  // |smallest_values|. If so, find the |position| where to insert the new value
-  // (|feature_value|).
-  if (feature_value < smallest_values[7]) {
-    if (feature_value < smallest_values[3]) {
-      if (feature_value < smallest_values[1]) {
-        if (feature_value < smallest_values[0]) {
-          position = 0;
-        } else {
-          position = 1;
-        }
-      } else if (feature_value < smallest_values[2]) {
-        position = 2;
-      } else {
-        position = 3;
-      }
-    } else if (feature_value < smallest_values[5]) {
-      if (feature_value < smallest_values[4]) {
-        position = 4;
-      } else {
-        position = 5;
-      }
-    } else if (feature_value < smallest_values[6]) {
-      position = 6;
-    } else {
-      position = 7;
-    }
-  } else if (feature_value < smallest_values[15]) {
-    if (feature_value < smallest_values[11]) {
-      if (feature_value < smallest_values[9]) {
-        if (feature_value < smallest_values[8]) {
-          position = 8;
-        } else {
-          position = 9;
-        }
-      } else if (feature_value < smallest_values[10]) {
-        position = 10;
-      } else {
-        position = 11;
-      }
-    } else if (feature_value < smallest_values[13]) {
-      if (feature_value < smallest_values[12]) {
-        position = 12;
-      } else {
-        position = 13;
-      }
-    } else if (feature_value < smallest_values[14]) {
-      position = 14;
-    } else {
-      position = 15;
-    }
-  }
-
-  // If we have detected a new small value, insert it at the correct position
-  // and shift larger values up.
-  if (position > -1) {
-    for (i = 15; i > position; i--) {
-      smallest_values[i] = smallest_values[i - 1];
-      age[i] = age[i - 1];
-    }
-    smallest_values[position] = feature_value;
-    age[position] = 1;
-  }
-
-  // Get |current_median|.
-  if (self->frame_counter > 2) {
-    current_median = smallest_values[2];
-  } else if (self->frame_counter > 0) {
-    current_median = smallest_values[0];
-  }
-
-  // Smooth the median value.
-  if (self->frame_counter > 0) {
-    if (current_median < self->mean_value[channel]) {
-      alpha = kSmoothingDown;  // 0.2 in Q15.
-    } else {
-      alpha = kSmoothingUp;  // 0.99 in Q15.
-    }
-  }
-  tmp32 = (alpha + 1) * self->mean_value[channel];
-  tmp32 += (WEBRTC_SPL_WORD16_MAX - alpha) * current_median;
-  tmp32 += 16384;
-  self->mean_value[channel] = (int16_t) (tmp32 >> 15);
-
-  return self->mean_value[channel];
-}
diff --git a/common_audio/vad/vad_sp.h b/common_audio/vad/vad_sp.h
deleted file mode 100644
index 4d2b02a..0000000
--- a/common_audio/vad/vad_sp.h
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-
-// This file includes specific signal processing tools used in vad_core.c.
-
-#ifndef WEBRTC_COMMON_AUDIO_VAD_VAD_SP_H_
-#define WEBRTC_COMMON_AUDIO_VAD_VAD_SP_H_
-
-#include "webrtc/common_audio/vad/vad_core.h"
-#include "webrtc/typedefs.h"
-
-// Downsamples the signal by a factor 2, eg. 32->16 or 16->8.
-//
-// Inputs:
-//      - signal_in     : Input signal.
-//      - in_length     : Length of input signal in samples.
-//
-// Input & Output:
-//      - filter_state  : Current filter states of the two all-pass filters. The
-//                        |filter_state| is updated after all samples have been
-//                        processed.
-//
-// Output:
-//      - signal_out    : Downsampled signal (of length |in_length| / 2).
-void WebRtcVad_Downsampling(const int16_t* signal_in,
-                            int16_t* signal_out,
-                            int32_t* filter_state,
-                            size_t in_length);
-
-// Updates and returns the smoothed feature minimum. As minimum we use the
-// median of the five smallest feature values in a 100 frames long window.
-// As long as |handle->frame_counter| is zero, that is, we haven't received any
-// "valid" data, FindMinimum() outputs the default value of 1600.
-//
-// Inputs:
-//      - feature_value : New feature value to update with.
-//      - channel       : Channel number.
-//
-// Input & Output:
-//      - handle        : State information of the VAD.
-//
-// Returns:
-//                      : Smoothed minimum value for a moving window.
-int16_t WebRtcVad_FindMinimum(VadInstT* handle,
-                              int16_t feature_value,
-                              int channel);
-
-#endif  // WEBRTC_COMMON_AUDIO_VAD_VAD_SP_H_
diff --git a/common_audio/vad/vad_sp_unittest.cc b/common_audio/vad/vad_sp_unittest.cc
deleted file mode 100644
index e841308..0000000
--- a/common_audio/vad/vad_sp_unittest.cc
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- *  Copyright (c) 2012 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 <stdlib.h>
-
-#include "webrtc/common_audio/vad/vad_unittest.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/typedefs.h"
-
-extern "C" {
-#include "webrtc/common_audio/vad/vad_core.h"
-#include "webrtc/common_audio/vad/vad_sp.h"
-}
-
-namespace webrtc {
-namespace test {
-
-TEST_F(VadTest, vad_sp) {
-  VadInstT* self = reinterpret_cast<VadInstT*>(malloc(sizeof(VadInstT)));
-  const size_t kMaxFrameLenSp = 960;  // Maximum frame length in this unittest.
-  int16_t zeros[kMaxFrameLenSp] = { 0 };
-  int32_t state[2] = { 0 };
-  int16_t data_in[kMaxFrameLenSp];
-  int16_t data_out[kMaxFrameLenSp];
-
-  // We expect the first value to be 1600 as long as |frame_counter| is zero,
-  // which is true for the first iteration.
-  static const int16_t kReferenceMin[32] = {
-      1600, 720, 509, 512, 532, 552, 570, 588,
-       606, 624, 642, 659, 675, 691, 707, 723,
-      1600, 544, 502, 522, 542, 561, 579, 597,
-       615, 633, 651, 667, 683, 699, 715, 731
-  };
-
-  // Construct a speech signal that will trigger the VAD in all modes. It is
-  // known that (i * i) will wrap around, but that doesn't matter in this case.
-  for (size_t i = 0; i < kMaxFrameLenSp; ++i) {
-    data_in[i] = static_cast<int16_t>(i * i);
-  }
-  // Input values all zeros, expect all zeros out.
-  WebRtcVad_Downsampling(zeros, data_out, state, kMaxFrameLenSp);
-  EXPECT_EQ(0, state[0]);
-  EXPECT_EQ(0, state[1]);
-  for (size_t i = 0; i < kMaxFrameLenSp / 2; ++i) {
-    EXPECT_EQ(0, data_out[i]);
-  }
-  // Make a simple non-zero data test.
-  WebRtcVad_Downsampling(data_in, data_out, state, kMaxFrameLenSp);
-  EXPECT_EQ(207, state[0]);
-  EXPECT_EQ(2270, state[1]);
-
-  ASSERT_EQ(0, WebRtcVad_InitCore(self));
-  // TODO(bjornv): Replace this part of the test with taking values from an
-  // array and calculate the reference value here. Make sure the values are not
-  // ordered.
-  for (int16_t i = 0; i < 16; ++i) {
-    int16_t value = 500 * (i + 1);
-    for (int j = 0; j < kNumChannels; ++j) {
-      // Use values both above and below initialized value.
-      EXPECT_EQ(kReferenceMin[i], WebRtcVad_FindMinimum(self, value, j));
-      EXPECT_EQ(kReferenceMin[i + 16], WebRtcVad_FindMinimum(self, 12000, j));
-    }
-    self->frame_counter++;
-  }
-
-  free(self);
-}
-}  // namespace test
-}  // namespace webrtc
diff --git a/common_audio/vad/vad_unittest.cc b/common_audio/vad/vad_unittest.cc
deleted file mode 100644
index 69d6a7b..0000000
--- a/common_audio/vad/vad_unittest.cc
+++ /dev/null
@@ -1,157 +0,0 @@
-/*
- *  Copyright (c) 2012 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/common_audio/vad/vad_unittest.h"
-
-#include <stdlib.h>
-
-#include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
-#include "webrtc/common_audio/vad/include/webrtc_vad.h"
-#include "webrtc/rtc_base/arraysize.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/typedefs.h"
-
-VadTest::VadTest() {}
-
-void VadTest::SetUp() {}
-
-void VadTest::TearDown() {}
-
-// Returns true if the rate and frame length combination is valid.
-bool VadTest::ValidRatesAndFrameLengths(int rate, size_t frame_length) {
-  if (rate == 8000) {
-    if (frame_length == 80 || frame_length == 160 || frame_length == 240) {
-      return true;
-    }
-    return false;
-  } else if (rate == 16000) {
-    if (frame_length == 160 || frame_length == 320 || frame_length == 480) {
-      return true;
-    }
-    return false;
-  } else if (rate == 32000) {
-    if (frame_length == 320 || frame_length == 640 || frame_length == 960) {
-      return true;
-    }
-    return false;
-  } else if (rate == 48000) {
-    if (frame_length == 480 || frame_length == 960 || frame_length == 1440) {
-      return true;
-    }
-    return false;
-  }
-
-  return false;
-}
-
-namespace webrtc {
-namespace test {
-
-TEST_F(VadTest, ApiTest) {
-  // This API test runs through the APIs for all possible valid and invalid
-  // combinations.
-
-  VadInst* handle = WebRtcVad_Create();
-  int16_t zeros[kMaxFrameLength] = { 0 };
-
-  // Construct a speech signal that will trigger the VAD in all modes. It is
-  // known that (i * i) will wrap around, but that doesn't matter in this case.
-  int16_t speech[kMaxFrameLength];
-  for (size_t i = 0; i < kMaxFrameLength; i++) {
-    speech[i] = static_cast<int16_t>(i * i);
-  }
-
-  // nullptr instance tests
-  EXPECT_EQ(-1, WebRtcVad_Init(nullptr));
-  EXPECT_EQ(-1, WebRtcVad_set_mode(nullptr, kModes[0]));
-  EXPECT_EQ(-1,
-            WebRtcVad_Process(nullptr, kRates[0], speech, kFrameLengths[0]));
-
-  // WebRtcVad_Create()
-  RTC_CHECK(handle);
-
-  // Not initialized tests
-  EXPECT_EQ(-1, WebRtcVad_Process(handle, kRates[0], speech, kFrameLengths[0]));
-  EXPECT_EQ(-1, WebRtcVad_set_mode(handle, kModes[0]));
-
-  // WebRtcVad_Init() test
-  ASSERT_EQ(0, WebRtcVad_Init(handle));
-
-  // WebRtcVad_set_mode() invalid modes tests. Tries smallest supported value
-  // minus one and largest supported value plus one.
-  EXPECT_EQ(-1, WebRtcVad_set_mode(handle,
-                                   WebRtcSpl_MinValueW32(kModes,
-                                                         kModesSize) - 1));
-  EXPECT_EQ(-1, WebRtcVad_set_mode(handle,
-                                   WebRtcSpl_MaxValueW32(kModes,
-                                                         kModesSize) + 1));
-
-  // WebRtcVad_Process() tests
-  // nullptr as speech pointer
-  EXPECT_EQ(-1,
-            WebRtcVad_Process(handle, kRates[0], nullptr, kFrameLengths[0]));
-  // Invalid sampling rate
-  EXPECT_EQ(-1, WebRtcVad_Process(handle, 9999, speech, kFrameLengths[0]));
-  // All zeros as input should work
-  EXPECT_EQ(0, WebRtcVad_Process(handle, kRates[0], zeros, kFrameLengths[0]));
-  for (size_t k = 0; k < kModesSize; k++) {
-    // Test valid modes
-    EXPECT_EQ(0, WebRtcVad_set_mode(handle, kModes[k]));
-    // Loop through sampling rate and frame length combinations
-    for (size_t i = 0; i < kRatesSize; i++) {
-      for (size_t j = 0; j < kFrameLengthsSize; j++) {
-        if (ValidRatesAndFrameLengths(kRates[i], kFrameLengths[j])) {
-          EXPECT_EQ(1, WebRtcVad_Process(handle,
-                                         kRates[i],
-                                         speech,
-                                         kFrameLengths[j]));
-        } else {
-          EXPECT_EQ(-1, WebRtcVad_Process(handle,
-                                          kRates[i],
-                                          speech,
-                                          kFrameLengths[j]));
-        }
-      }
-    }
-  }
-
-  WebRtcVad_Free(handle);
-}
-
-TEST_F(VadTest, ValidRatesFrameLengths) {
-  // This test verifies valid and invalid rate/frame_length combinations. We
-  // loop through some sampling rates and frame lengths from negative values to
-  // values larger than possible.
-  const int kRates[] = {
-    -8000, -4000, 0, 4000, 8000, 8001, 15999, 16000, 32000, 48000, 48001, 96000
-  };
-
-  const size_t kFrameLengths[] = {
-    0, 80, 81, 159, 160, 240, 320, 480, 640, 960, 1440, 2000
-  };
-
-  for (size_t i = 0; i < arraysize(kRates); i++) {
-    for (size_t j = 0; j < arraysize(kFrameLengths); j++) {
-      if (ValidRatesAndFrameLengths(kRates[i], kFrameLengths[j])) {
-        EXPECT_EQ(0, WebRtcVad_ValidRateAndFrameLength(kRates[i],
-                                                       kFrameLengths[j]));
-      } else {
-        EXPECT_EQ(-1, WebRtcVad_ValidRateAndFrameLength(kRates[i],
-                                                        kFrameLengths[j]));
-      }
-    }
-  }
-}
-
-// TODO(bjornv): Add a process test, run on file.
-
-}  // namespace test
-}  // namespace webrtc
diff --git a/common_audio/vad/vad_unittest.h b/common_audio/vad/vad_unittest.h
deleted file mode 100644
index 7edf585..0000000
--- a/common_audio/vad/vad_unittest.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- *  Copyright (c) 2012 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_COMMON_AUDIO_VAD_VAD_UNITTEST_H_
-#define WEBRTC_COMMON_AUDIO_VAD_VAD_UNITTEST_H_
-
-#include <stddef.h>  // size_t
-
-#include "webrtc/test/gtest.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-namespace test {
-
-// Modes we support
-const int kModes[] = { 0, 1, 2, 3 };
-const size_t kModesSize = sizeof(kModes) / sizeof(*kModes);
-
-// Rates we support.
-const int kRates[] = { 8000, 12000, 16000, 24000, 32000, 48000 };
-const size_t kRatesSize = sizeof(kRates) / sizeof(*kRates);
-
-// Frame lengths we support.
-const size_t kMaxFrameLength = 1440;
-const size_t kFrameLengths[] = { 80, 120, 160, 240, 320, 480, 640, 960,
-    kMaxFrameLength };
-const size_t kFrameLengthsSize = sizeof(kFrameLengths) / sizeof(*kFrameLengths);
-
-}  // namespace test
-}  // namespace webrtc
-
-class VadTest : public ::testing::Test {
- protected:
-  VadTest();
-  virtual void SetUp();
-  virtual void TearDown();
-
-  // Returns true if the rate and frame length combination is valid.
-  bool ValidRatesAndFrameLengths(int rate, size_t frame_length);
-};
-
-#endif  // WEBRTC_COMMON_AUDIO_VAD_VAD_UNITTEST_H_
diff --git a/common_audio/vad/webrtc_vad.c b/common_audio/vad/webrtc_vad.c
deleted file mode 100644
index 80c8f3c..0000000
--- a/common_audio/vad/webrtc_vad.c
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- *  Copyright (c) 2012 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/common_audio/vad/include/webrtc_vad.h"
-
-#include <stdlib.h>
-#include <string.h>
-
-#include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
-#include "webrtc/common_audio/vad/vad_core.h"
-#include "webrtc/typedefs.h"
-
-static const int kInitCheck = 42;
-static const int kValidRates[] = { 8000, 16000, 32000, 48000 };
-static const size_t kRatesSize = sizeof(kValidRates) / sizeof(*kValidRates);
-static const int kMaxFrameLengthMs = 30;
-
-VadInst* WebRtcVad_Create() {
-  VadInstT* self = (VadInstT*)malloc(sizeof(VadInstT));
-
-  WebRtcSpl_Init();
-  self->init_flag = 0;
-
-  return (VadInst*)self;
-}
-
-void WebRtcVad_Free(VadInst* handle) {
-  free(handle);
-}
-
-// TODO(bjornv): Move WebRtcVad_InitCore() code here.
-int WebRtcVad_Init(VadInst* handle) {
-  // Initialize the core VAD component.
-  return WebRtcVad_InitCore((VadInstT*) handle);
-}
-
-// TODO(bjornv): Move WebRtcVad_set_mode_core() code here.
-int WebRtcVad_set_mode(VadInst* handle, int mode) {
-  VadInstT* self = (VadInstT*) handle;
-
-  if (handle == NULL) {
-    return -1;
-  }
-  if (self->init_flag != kInitCheck) {
-    return -1;
-  }
-
-  return WebRtcVad_set_mode_core(self, mode);
-}
-
-int WebRtcVad_Process(VadInst* handle, int fs, const int16_t* audio_frame,
-                      size_t frame_length) {
-  int vad = -1;
-  VadInstT* self = (VadInstT*) handle;
-
-  if (handle == NULL) {
-    return -1;
-  }
-
-  if (self->init_flag != kInitCheck) {
-    return -1;
-  }
-  if (audio_frame == NULL) {
-    return -1;
-  }
-  if (WebRtcVad_ValidRateAndFrameLength(fs, frame_length) != 0) {
-    return -1;
-  }
-
-  if (fs == 48000) {
-      vad = WebRtcVad_CalcVad48khz(self, audio_frame, frame_length);
-  } else if (fs == 32000) {
-    vad = WebRtcVad_CalcVad32khz(self, audio_frame, frame_length);
-  } else if (fs == 16000) {
-    vad = WebRtcVad_CalcVad16khz(self, audio_frame, frame_length);
-  } else if (fs == 8000) {
-    vad = WebRtcVad_CalcVad8khz(self, audio_frame, frame_length);
-  }
-
-  if (vad > 0) {
-    vad = 1;
-  }
-  return vad;
-}
-
-int WebRtcVad_ValidRateAndFrameLength(int rate, size_t frame_length) {
-  int return_value = -1;
-  size_t i;
-  int valid_length_ms;
-  size_t valid_length;
-
-  // We only allow 10, 20 or 30 ms frames. Loop through valid frame rates and
-  // see if we have a matching pair.
-  for (i = 0; i < kRatesSize; i++) {
-    if (kValidRates[i] == rate) {
-      for (valid_length_ms = 10; valid_length_ms <= kMaxFrameLengthMs;
-          valid_length_ms += 10) {
-        valid_length = (size_t)(kValidRates[i] / 1000 * valid_length_ms);
-        if (frame_length == valid_length) {
-          return_value = 0;
-          break;
-        }
-      }
-      break;
-    }
-  }
-
-  return return_value;
-}
diff --git a/common_audio/wav_file.cc b/common_audio/wav_file.cc
deleted file mode 100644
index 3b1b9ee..0000000
--- a/common_audio/wav_file.cc
+++ /dev/null
@@ -1,205 +0,0 @@
-/*
- *  Copyright (c) 2014 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/common_audio/wav_file.h"
-
-#include <algorithm>
-#include <cstdio>
-#include <limits>
-#include <sstream>
-
-#include "webrtc/common_audio/include/audio_util.h"
-#include "webrtc/common_audio/wav_header.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/safe_conversions.h"
-
-namespace webrtc {
-
-// We write 16-bit PCM WAV files.
-static const WavFormat kWavFormat = kWavFormatPcm;
-static const size_t kBytesPerSample = 2;
-
-// Doesn't take ownership of the file handle and won't close it.
-class ReadableWavFile : public ReadableWav {
- public:
-  explicit ReadableWavFile(FILE* file) : file_(file) {}
-  virtual size_t Read(void* buf, size_t num_bytes) {
-    return fread(buf, 1, num_bytes, file_);
-  }
-
- private:
-  FILE* file_;
-};
-
-std::string WavFile::FormatAsString() const {
-  std::ostringstream s;
-  s << "Sample rate: " << sample_rate() << " Hz, Channels: " << num_channels()
-    << ", Duration: "
-    << (1.f * num_samples()) / (num_channels() * sample_rate()) << " s";
-  return s.str();
-}
-
-WavReader::WavReader(const std::string& filename)
-    : file_handle_(fopen(filename.c_str(), "rb")) {
-  RTC_CHECK(file_handle_) << "Could not open wav file for reading.";
-
-  ReadableWavFile readable(file_handle_);
-  WavFormat format;
-  size_t bytes_per_sample;
-  RTC_CHECK(ReadWavHeader(&readable, &num_channels_, &sample_rate_, &format,
-                          &bytes_per_sample, &num_samples_));
-  num_samples_remaining_ = num_samples_;
-  RTC_CHECK_EQ(kWavFormat, format);
-  RTC_CHECK_EQ(kBytesPerSample, bytes_per_sample);
-}
-
-WavReader::~WavReader() {
-  Close();
-}
-
-int WavReader::sample_rate() const {
-  return sample_rate_;
-}
-
-size_t WavReader::num_channels() const {
-  return num_channels_;
-}
-
-size_t WavReader::num_samples() const {
-  return num_samples_;
-}
-
-size_t WavReader::ReadSamples(size_t num_samples, int16_t* samples) {
-#ifndef WEBRTC_ARCH_LITTLE_ENDIAN
-#error "Need to convert samples to big-endian when reading from WAV file"
-#endif
-  // There could be metadata after the audio; ensure we don't read it.
-  num_samples = std::min(num_samples, num_samples_remaining_);
-  const size_t read =
-      fread(samples, sizeof(*samples), num_samples, file_handle_);
-  // If we didn't read what was requested, ensure we've reached the EOF.
-  RTC_CHECK(read == num_samples || feof(file_handle_));
-  RTC_CHECK_LE(read, num_samples_remaining_);
-  num_samples_remaining_ -= read;
-  return read;
-}
-
-size_t WavReader::ReadSamples(size_t num_samples, float* samples) {
-  static const size_t kChunksize = 4096 / sizeof(uint16_t);
-  size_t read = 0;
-  for (size_t i = 0; i < num_samples; i += kChunksize) {
-    int16_t isamples[kChunksize];
-    size_t chunk = std::min(kChunksize, num_samples - i);
-    chunk = ReadSamples(chunk, isamples);
-    for (size_t j = 0; j < chunk; ++j)
-      samples[i + j] = isamples[j];
-    read += chunk;
-  }
-  return read;
-}
-
-void WavReader::Close() {
-  RTC_CHECK_EQ(0, fclose(file_handle_));
-  file_handle_ = nullptr;
-}
-
-WavWriter::WavWriter(const std::string& filename, int sample_rate,
-                     size_t num_channels)
-    : sample_rate_(sample_rate),
-      num_channels_(num_channels),
-      num_samples_(0),
-      file_handle_(fopen(filename.c_str(), "wb")) {
-  RTC_CHECK(file_handle_) << "Could not open wav file for writing.";
-  RTC_CHECK(CheckWavParameters(num_channels_, sample_rate_, kWavFormat,
-                               kBytesPerSample, num_samples_));
-
-  // Write a blank placeholder header, since we need to know the total number
-  // of samples before we can fill in the real data.
-  static const uint8_t blank_header[kWavHeaderSize] = {0};
-  RTC_CHECK_EQ(1, fwrite(blank_header, kWavHeaderSize, 1, file_handle_));
-}
-
-WavWriter::~WavWriter() {
-  Close();
-}
-
-int WavWriter::sample_rate() const {
-  return sample_rate_;
-}
-
-size_t WavWriter::num_channels() const {
-  return num_channels_;
-}
-
-size_t WavWriter::num_samples() const {
-  return num_samples_;
-}
-
-void WavWriter::WriteSamples(const int16_t* samples, size_t num_samples) {
-#ifndef WEBRTC_ARCH_LITTLE_ENDIAN
-#error "Need to convert samples to little-endian when writing to WAV file"
-#endif
-  const size_t written =
-      fwrite(samples, sizeof(*samples), num_samples, file_handle_);
-  RTC_CHECK_EQ(num_samples, written);
-  num_samples_ += written;
-  RTC_CHECK(num_samples_ >= written);  // detect size_t overflow
-}
-
-void WavWriter::WriteSamples(const float* samples, size_t num_samples) {
-  static const size_t kChunksize = 4096 / sizeof(uint16_t);
-  for (size_t i = 0; i < num_samples; i += kChunksize) {
-    int16_t isamples[kChunksize];
-    const size_t chunk = std::min(kChunksize, num_samples - i);
-    FloatS16ToS16(samples + i, chunk, isamples);
-    WriteSamples(isamples, chunk);
-  }
-}
-
-void WavWriter::Close() {
-  RTC_CHECK_EQ(0, fseek(file_handle_, 0, SEEK_SET));
-  uint8_t header[kWavHeaderSize];
-  WriteWavHeader(header, num_channels_, sample_rate_, kWavFormat,
-                 kBytesPerSample, num_samples_);
-  RTC_CHECK_EQ(1, fwrite(header, kWavHeaderSize, 1, file_handle_));
-  RTC_CHECK_EQ(0, fclose(file_handle_));
-  file_handle_ = nullptr;
-}
-
-}  // namespace webrtc
-
-rtc_WavWriter* rtc_WavOpen(const char* filename,
-                           int sample_rate,
-                           size_t num_channels) {
-  return reinterpret_cast<rtc_WavWriter*>(
-      new webrtc::WavWriter(filename, sample_rate, num_channels));
-}
-
-void rtc_WavClose(rtc_WavWriter* wf) {
-  delete reinterpret_cast<webrtc::WavWriter*>(wf);
-}
-
-void rtc_WavWriteSamples(rtc_WavWriter* wf,
-                         const float* samples,
-                         size_t num_samples) {
-  reinterpret_cast<webrtc::WavWriter*>(wf)->WriteSamples(samples, num_samples);
-}
-
-int rtc_WavSampleRate(const rtc_WavWriter* wf) {
-  return reinterpret_cast<const webrtc::WavWriter*>(wf)->sample_rate();
-}
-
-size_t rtc_WavNumChannels(const rtc_WavWriter* wf) {
-  return reinterpret_cast<const webrtc::WavWriter*>(wf)->num_channels();
-}
-
-size_t rtc_WavNumSamples(const rtc_WavWriter* wf) {
-  return reinterpret_cast<const webrtc::WavWriter*>(wf)->num_samples();
-}
diff --git a/common_audio/wav_file.h b/common_audio/wav_file.h
deleted file mode 100644
index 1ec6c65..0000000
--- a/common_audio/wav_file.h
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- *  Copyright (c) 2014 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_COMMON_AUDIO_WAV_FILE_H_
-#define WEBRTC_COMMON_AUDIO_WAV_FILE_H_
-
-#ifdef __cplusplus
-
-#include <stdint.h>
-#include <cstddef>
-#include <string>
-
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace webrtc {
-
-// Interface to provide access to WAV file parameters.
-class WavFile {
- public:
-  virtual ~WavFile() {}
-
-  virtual int sample_rate() const = 0;
-  virtual size_t num_channels() const = 0;
-  virtual size_t num_samples() const = 0;
-
-  // Returns a human-readable string containing the audio format.
-  std::string FormatAsString() const;
-};
-
-// Simple C++ class for writing 16-bit PCM WAV files. All error handling is
-// by calls to RTC_CHECK(), making it unsuitable for anything but debug code.
-class WavWriter final : public WavFile {
- public:
-  // Open a new WAV file for writing.
-  WavWriter(const std::string& filename, int sample_rate, size_t num_channels);
-
-  // Close the WAV file, after writing its header.
-  ~WavWriter() override;
-
-  // Write additional samples to the file. Each sample is in the range
-  // [-32768,32767], and there must be the previously specified number of
-  // interleaved channels.
-  void WriteSamples(const float* samples, size_t num_samples);
-  void WriteSamples(const int16_t* samples, size_t num_samples);
-
-  int sample_rate() const override;
-  size_t num_channels() const override;
-  size_t num_samples() const override;
-
- private:
-  void Close();
-  const int sample_rate_;
-  const size_t num_channels_;
-  size_t num_samples_;  // Total number of samples written to file.
-  FILE* file_handle_;  // Output file, owned by this class
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(WavWriter);
-};
-
-// Follows the conventions of WavWriter.
-class WavReader final : public WavFile {
- public:
-  // Opens an existing WAV file for reading.
-  explicit WavReader(const std::string& filename);
-
-  // Close the WAV file.
-  ~WavReader() override;
-
-  // Returns the number of samples read. If this is less than requested,
-  // verifies that the end of the file was reached.
-  size_t ReadSamples(size_t num_samples, float* samples);
-  size_t ReadSamples(size_t num_samples, int16_t* samples);
-
-  int sample_rate() const override;
-  size_t num_channels() const override;
-  size_t num_samples() const override;
-
- private:
-  void Close();
-  int sample_rate_;
-  size_t num_channels_;
-  size_t num_samples_;  // Total number of samples in the file.
-  size_t num_samples_remaining_;
-  FILE* file_handle_;  // Input file, owned by this class.
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(WavReader);
-};
-
-}  // namespace webrtc
-
-extern "C" {
-#endif  // __cplusplus
-
-// C wrappers for the WavWriter class.
-typedef struct rtc_WavWriter rtc_WavWriter;
-rtc_WavWriter* rtc_WavOpen(const char* filename,
-                           int sample_rate,
-                           size_t num_channels);
-void rtc_WavClose(rtc_WavWriter* wf);
-void rtc_WavWriteSamples(rtc_WavWriter* wf,
-                         const float* samples,
-                         size_t num_samples);
-int rtc_WavSampleRate(const rtc_WavWriter* wf);
-size_t rtc_WavNumChannels(const rtc_WavWriter* wf);
-size_t rtc_WavNumSamples(const rtc_WavWriter* wf);
-
-#ifdef __cplusplus
-}  // extern "C"
-#endif
-
-#endif  // WEBRTC_COMMON_AUDIO_WAV_FILE_H_
diff --git a/common_audio/wav_file_unittest.cc b/common_audio/wav_file_unittest.cc
deleted file mode 100644
index 0868fa6..0000000
--- a/common_audio/wav_file_unittest.cc
+++ /dev/null
@@ -1,177 +0,0 @@
-/*
- *  Copyright (c) 2014 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.
- */
-
-// MSVC++ requires this to be set before any other includes to get M_PI.
-#define _USE_MATH_DEFINES
-
-#include <cmath>
-#include <limits>
-
-#include "webrtc/common_audio/wav_file.h"
-#include "webrtc/common_audio/wav_header.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/testsupport/fileutils.h"
-
-namespace webrtc {
-
-static const float kSamples[] = {0.0, 10.0, 4e4, -1e9};
-
-// Write a tiny WAV file with the C++ interface and verify the result.
-TEST(WavWriterTest, CPP) {
-  const std::string outfile = test::OutputPath() + "wavtest1.wav";
-  static const size_t kNumSamples = 3;
-  {
-    WavWriter w(outfile, 14099, 1);
-    EXPECT_EQ(14099, w.sample_rate());
-    EXPECT_EQ(1u, w.num_channels());
-    EXPECT_EQ(0u, w.num_samples());
-    w.WriteSamples(kSamples, kNumSamples);
-    EXPECT_EQ(kNumSamples, w.num_samples());
-  }
-  // Write some extra "metadata" to the file that should be silently ignored
-  // by WavReader. We don't use WavWriter directly for this because it doesn't
-  // support metadata.
-  static const uint8_t kMetadata[] = {101, 202};
-  {
-    FILE* f = fopen(outfile.c_str(), "ab");
-    ASSERT_TRUE(f);
-    ASSERT_EQ(1u, fwrite(kMetadata, sizeof(kMetadata), 1, f));
-    fclose(f);
-  }
-  static const uint8_t kExpectedContents[] = {
-    'R', 'I', 'F', 'F',
-    42, 0, 0, 0,  // size of whole file - 8: 6 + 44 - 8
-    'W', 'A', 'V', 'E',
-    'f', 'm', 't', ' ',
-    16, 0, 0, 0,  // size of fmt block - 8: 24 - 8
-    1, 0,  // format: PCM (1)
-    1, 0,  // channels: 1
-    0x13, 0x37, 0, 0,  // sample rate: 14099
-    0x26, 0x6e, 0, 0,  // byte rate: 2 * 14099
-    2, 0,  // block align: NumChannels * BytesPerSample
-    16, 0,  // bits per sample: 2 * 8
-    'd', 'a', 't', 'a',
-    6, 0, 0, 0,  // size of payload: 6
-    0, 0,  // first sample: 0.0
-    10, 0,  // second sample: 10.0
-    0xff, 0x7f,  // third sample: 4e4 (saturated)
-    kMetadata[0], kMetadata[1],
-  };
-  static const size_t kContentSize =
-      kWavHeaderSize + kNumSamples * sizeof(int16_t) + sizeof(kMetadata);
-  static_assert(sizeof(kExpectedContents) == kContentSize, "content size");
-  EXPECT_EQ(kContentSize, test::GetFileSize(outfile));
-  FILE* f = fopen(outfile.c_str(), "rb");
-  ASSERT_TRUE(f);
-  uint8_t contents[kContentSize];
-  ASSERT_EQ(1u, fread(contents, kContentSize, 1, f));
-  EXPECT_EQ(0, fclose(f));
-  EXPECT_EQ(0, memcmp(kExpectedContents, contents, kContentSize));
-
-  {
-    WavReader r(outfile);
-    EXPECT_EQ(14099, r.sample_rate());
-    EXPECT_EQ(1u, r.num_channels());
-    EXPECT_EQ(kNumSamples, r.num_samples());
-    static const float kTruncatedSamples[] = {0.0, 10.0, 32767.0};
-    float samples[kNumSamples];
-    EXPECT_EQ(kNumSamples, r.ReadSamples(kNumSamples, samples));
-    EXPECT_EQ(0, memcmp(kTruncatedSamples, samples, sizeof(samples)));
-    EXPECT_EQ(0u, r.ReadSamples(kNumSamples, samples));
-  }
-}
-
-// Write a tiny WAV file with the C interface and verify the result.
-TEST(WavWriterTest, C) {
-  const std::string outfile = test::OutputPath() + "wavtest2.wav";
-  rtc_WavWriter* w = rtc_WavOpen(outfile.c_str(), 11904, 2);
-  EXPECT_EQ(11904, rtc_WavSampleRate(w));
-  EXPECT_EQ(2u, rtc_WavNumChannels(w));
-  EXPECT_EQ(0u, rtc_WavNumSamples(w));
-  static const size_t kNumSamples = 4;
-  rtc_WavWriteSamples(w, &kSamples[0], 2);
-  EXPECT_EQ(2u, rtc_WavNumSamples(w));
-  rtc_WavWriteSamples(w, &kSamples[2], kNumSamples - 2);
-  EXPECT_EQ(kNumSamples, rtc_WavNumSamples(w));
-  rtc_WavClose(w);
-  static const uint8_t kExpectedContents[] = {
-    'R', 'I', 'F', 'F',
-    44, 0, 0, 0,  // size of whole file - 8: 8 + 44 - 8
-    'W', 'A', 'V', 'E',
-    'f', 'm', 't', ' ',
-    16, 0, 0, 0,  // size of fmt block - 8: 24 - 8
-    1, 0,  // format: PCM (1)
-    2, 0,  // channels: 2
-    0x80, 0x2e, 0, 0,  // sample rate: 11904
-    0, 0xba, 0, 0,  // byte rate: 2 * 2 * 11904
-    4, 0,  // block align: NumChannels * BytesPerSample
-    16, 0,  // bits per sample: 2 * 8
-    'd', 'a', 't', 'a',
-    8, 0, 0, 0,  // size of payload: 8
-    0, 0,  // first sample: 0.0
-    10, 0,  // second sample: 10.0
-    0xff, 0x7f,  // third sample: 4e4 (saturated)
-    0, 0x80,  // fourth sample: -1e9 (saturated)
-  };
-  static const size_t kContentSize =
-      kWavHeaderSize + kNumSamples * sizeof(int16_t);
-  static_assert(sizeof(kExpectedContents) == kContentSize, "content size");
-  EXPECT_EQ(kContentSize, test::GetFileSize(outfile));
-  FILE* f = fopen(outfile.c_str(), "rb");
-  ASSERT_TRUE(f);
-  uint8_t contents[kContentSize];
-  ASSERT_EQ(1u, fread(contents, kContentSize, 1, f));
-  EXPECT_EQ(0, fclose(f));
-  EXPECT_EQ(0, memcmp(kExpectedContents, contents, kContentSize));
-}
-
-// Write a larger WAV file. You can listen to this file to sanity-check it.
-TEST(WavWriterTest, LargeFile) {
-  std::string outfile = test::OutputPath() + "wavtest3.wav";
-  static const int kSampleRate = 8000;
-  static const size_t kNumChannels = 2;
-  static const size_t kNumSamples = 3 * kSampleRate * kNumChannels;
-  float samples[kNumSamples];
-  for (size_t i = 0; i < kNumSamples; i += kNumChannels) {
-    // A nice periodic beeping sound.
-    static const double kToneHz = 440;
-    const double t = static_cast<double>(i) / (kNumChannels * kSampleRate);
-    const double x =
-        std::numeric_limits<int16_t>::max() * std::sin(t * kToneHz * 2 * M_PI);
-    samples[i] = std::pow(std::sin(t * 2 * 2 * M_PI), 10) * x;
-    samples[i + 1] = std::pow(std::cos(t * 2 * 2 * M_PI), 10) * x;
-  }
-  {
-    WavWriter w(outfile, kSampleRate, kNumChannels);
-    EXPECT_EQ(kSampleRate, w.sample_rate());
-    EXPECT_EQ(kNumChannels, w.num_channels());
-    EXPECT_EQ(0u, w.num_samples());
-    w.WriteSamples(samples, kNumSamples);
-    EXPECT_EQ(kNumSamples, w.num_samples());
-  }
-  EXPECT_EQ(sizeof(int16_t) * kNumSamples + kWavHeaderSize,
-            test::GetFileSize(outfile));
-
-  {
-    WavReader r(outfile);
-    EXPECT_EQ(kSampleRate, r.sample_rate());
-    EXPECT_EQ(kNumChannels, r.num_channels());
-    EXPECT_EQ(kNumSamples, r.num_samples());
-
-    float read_samples[kNumSamples];
-    EXPECT_EQ(kNumSamples, r.ReadSamples(kNumSamples, read_samples));
-    for (size_t i = 0; i < kNumSamples; ++i)
-      EXPECT_NEAR(samples[i], read_samples[i], 1);
-
-    EXPECT_EQ(0u, r.ReadSamples(kNumSamples, read_samples));
-  }
-}
-
-}  // namespace webrtc
diff --git a/common_audio/wav_header.cc b/common_audio/wav_header.cc
deleted file mode 100644
index 0423c08..0000000
--- a/common_audio/wav_header.cc
+++ /dev/null
@@ -1,243 +0,0 @@
-/*
- *  Copyright (c) 2014 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.
- */
-
-// Based on the WAV file format documentation at
-// https://ccrma.stanford.edu/courses/422/projects/WaveFormat/ and
-// http://www-mmsp.ece.mcgill.ca/Documents/AudioFormats/WAVE/WAVE.html
-
-#include "webrtc/common_audio/wav_header.h"
-
-#include <algorithm>
-#include <cstring>
-#include <limits>
-#include <string>
-
-#include "webrtc/common_audio/include/audio_util.h"
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-namespace {
-
-struct ChunkHeader {
-  uint32_t ID;
-  uint32_t Size;
-};
-static_assert(sizeof(ChunkHeader) == 8, "ChunkHeader size");
-
-// We can't nest this definition in WavHeader, because VS2013 gives an error
-// on sizeof(WavHeader::fmt): "error C2070: 'unknown': illegal sizeof operand".
-struct FmtSubchunk {
-  ChunkHeader header;
-  uint16_t AudioFormat;
-  uint16_t NumChannels;
-  uint32_t SampleRate;
-  uint32_t ByteRate;
-  uint16_t BlockAlign;
-  uint16_t BitsPerSample;
-};
-static_assert(sizeof(FmtSubchunk) == 24, "FmtSubchunk size");
-const uint32_t kFmtSubchunkSize = sizeof(FmtSubchunk) - sizeof(ChunkHeader);
-
-struct WavHeader {
-  struct {
-    ChunkHeader header;
-    uint32_t Format;
-  } riff;
-  FmtSubchunk fmt;
-  struct {
-    ChunkHeader header;
-  } data;
-};
-static_assert(sizeof(WavHeader) == kWavHeaderSize, "no padding in header");
-
-}  // namespace
-
-bool CheckWavParameters(size_t num_channels,
-                        int sample_rate,
-                        WavFormat format,
-                        size_t bytes_per_sample,
-                        size_t num_samples) {
-  // num_channels, sample_rate, and bytes_per_sample must be positive, must fit
-  // in their respective fields, and their product must fit in the 32-bit
-  // ByteRate field.
-  if (num_channels == 0 || sample_rate <= 0 || bytes_per_sample == 0)
-    return false;
-  if (static_cast<uint64_t>(sample_rate) > std::numeric_limits<uint32_t>::max())
-    return false;
-  if (num_channels > std::numeric_limits<uint16_t>::max())
-    return false;
-  if (static_cast<uint64_t>(bytes_per_sample) * 8 >
-      std::numeric_limits<uint16_t>::max())
-    return false;
-  if (static_cast<uint64_t>(sample_rate) * num_channels * bytes_per_sample >
-      std::numeric_limits<uint32_t>::max())
-    return false;
-
-  // format and bytes_per_sample must agree.
-  switch (format) {
-    case kWavFormatPcm:
-      // Other values may be OK, but for now we're conservative:
-      if (bytes_per_sample != 1 && bytes_per_sample != 2)
-        return false;
-      break;
-    case kWavFormatALaw:
-    case kWavFormatMuLaw:
-      if (bytes_per_sample != 1)
-        return false;
-      break;
-    default:
-      return false;
-  }
-
-  // The number of bytes in the file, not counting the first ChunkHeader, must
-  // be less than 2^32; otherwise, the ChunkSize field overflows.
-  const size_t header_size = kWavHeaderSize - sizeof(ChunkHeader);
-  const size_t max_samples =
-      (std::numeric_limits<uint32_t>::max() - header_size) / bytes_per_sample;
-  if (num_samples > max_samples)
-    return false;
-
-  // Each channel must have the same number of samples.
-  if (num_samples % num_channels != 0)
-    return false;
-
-  return true;
-}
-
-#ifdef WEBRTC_ARCH_LITTLE_ENDIAN
-static inline void WriteLE16(uint16_t* f, uint16_t x) { *f = x; }
-static inline void WriteLE32(uint32_t* f, uint32_t x) { *f = x; }
-static inline void WriteFourCC(uint32_t* f, char a, char b, char c, char d) {
-  *f = static_cast<uint32_t>(a)
-      | static_cast<uint32_t>(b) << 8
-      | static_cast<uint32_t>(c) << 16
-      | static_cast<uint32_t>(d) << 24;
-}
-
-static inline uint16_t ReadLE16(uint16_t x) { return x; }
-static inline uint32_t ReadLE32(uint32_t x) { return x; }
-static inline std::string ReadFourCC(uint32_t x) {
-  return std::string(reinterpret_cast<char*>(&x), 4);
-}
-#else
-#error "Write be-to-le conversion functions"
-#endif
-
-static inline uint32_t RiffChunkSize(size_t bytes_in_payload) {
-  return static_cast<uint32_t>(
-      bytes_in_payload + kWavHeaderSize - sizeof(ChunkHeader));
-}
-
-static inline uint32_t ByteRate(size_t num_channels, int sample_rate,
-                                size_t bytes_per_sample) {
-  return static_cast<uint32_t>(num_channels * sample_rate * bytes_per_sample);
-}
-
-static inline uint16_t BlockAlign(size_t num_channels,
-                                  size_t bytes_per_sample) {
-  return static_cast<uint16_t>(num_channels * bytes_per_sample);
-}
-
-void WriteWavHeader(uint8_t* buf,
-                    size_t num_channels,
-                    int sample_rate,
-                    WavFormat format,
-                    size_t bytes_per_sample,
-                    size_t num_samples) {
-  RTC_CHECK(CheckWavParameters(num_channels, sample_rate, format,
-                               bytes_per_sample, num_samples));
-
-  WavHeader header;
-  const size_t bytes_in_payload = bytes_per_sample * num_samples;
-
-  WriteFourCC(&header.riff.header.ID, 'R', 'I', 'F', 'F');
-  WriteLE32(&header.riff.header.Size, RiffChunkSize(bytes_in_payload));
-  WriteFourCC(&header.riff.Format, 'W', 'A', 'V', 'E');
-
-  WriteFourCC(&header.fmt.header.ID, 'f', 'm', 't', ' ');
-  WriteLE32(&header.fmt.header.Size, kFmtSubchunkSize);
-  WriteLE16(&header.fmt.AudioFormat, format);
-  WriteLE16(&header.fmt.NumChannels, static_cast<uint16_t>(num_channels));
-  WriteLE32(&header.fmt.SampleRate, sample_rate);
-  WriteLE32(&header.fmt.ByteRate, ByteRate(num_channels, sample_rate,
-                                           bytes_per_sample));
-  WriteLE16(&header.fmt.BlockAlign, BlockAlign(num_channels, bytes_per_sample));
-  WriteLE16(&header.fmt.BitsPerSample,
-            static_cast<uint16_t>(8 * bytes_per_sample));
-
-  WriteFourCC(&header.data.header.ID, 'd', 'a', 't', 'a');
-  WriteLE32(&header.data.header.Size, static_cast<uint32_t>(bytes_in_payload));
-
-  // Do an extra copy rather than writing everything to buf directly, since buf
-  // might not be correctly aligned.
-  memcpy(buf, &header, kWavHeaderSize);
-}
-
-bool ReadWavHeader(ReadableWav* readable,
-                   size_t* num_channels,
-                   int* sample_rate,
-                   WavFormat* format,
-                   size_t* bytes_per_sample,
-                   size_t* num_samples) {
-  WavHeader header;
-  if (readable->Read(&header, kWavHeaderSize - sizeof(header.data)) !=
-      kWavHeaderSize - sizeof(header.data))
-    return false;
-
-  const uint32_t fmt_size = ReadLE32(header.fmt.header.Size);
-  if (fmt_size != kFmtSubchunkSize) {
-    // There is an optional two-byte extension field permitted to be present
-    // with PCM, but which must be zero.
-    int16_t ext_size;
-    if (kFmtSubchunkSize + sizeof(ext_size) != fmt_size)
-      return false;
-    if (readable->Read(&ext_size, sizeof(ext_size)) != sizeof(ext_size))
-      return false;
-    if (ext_size != 0)
-      return false;
-  }
-  if (readable->Read(&header.data, sizeof(header.data)) != sizeof(header.data))
-    return false;
-
-  // Parse needed fields.
-  *format = static_cast<WavFormat>(ReadLE16(header.fmt.AudioFormat));
-  *num_channels = ReadLE16(header.fmt.NumChannels);
-  *sample_rate = ReadLE32(header.fmt.SampleRate);
-  *bytes_per_sample = ReadLE16(header.fmt.BitsPerSample) / 8;
-  const size_t bytes_in_payload = ReadLE32(header.data.header.Size);
-  if (*bytes_per_sample == 0)
-    return false;
-  *num_samples = bytes_in_payload / *bytes_per_sample;
-
-  // Sanity check remaining fields.
-  if (ReadFourCC(header.riff.header.ID) != "RIFF")
-    return false;
-  if (ReadFourCC(header.riff.Format) != "WAVE")
-    return false;
-  if (ReadFourCC(header.fmt.header.ID) != "fmt ")
-    return false;
-  if (ReadFourCC(header.data.header.ID) != "data")
-    return false;
-
-  if (ReadLE32(header.riff.header.Size) < RiffChunkSize(bytes_in_payload))
-    return false;
-  if (ReadLE32(header.fmt.ByteRate) !=
-      ByteRate(*num_channels, *sample_rate, *bytes_per_sample))
-    return false;
-  if (ReadLE16(header.fmt.BlockAlign) !=
-      BlockAlign(*num_channels, *bytes_per_sample))
-    return false;
-
-  return CheckWavParameters(*num_channels, *sample_rate, *format,
-                            *bytes_per_sample, *num_samples);
-}
-
-
-}  // namespace webrtc
diff --git a/common_audio/wav_header.h b/common_audio/wav_header.h
deleted file mode 100644
index 6844306..0000000
--- a/common_audio/wav_header.h
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- *  Copyright (c) 2014 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_COMMON_AUDIO_WAV_HEADER_H_
-#define WEBRTC_COMMON_AUDIO_WAV_HEADER_H_
-
-#include <stddef.h>
-#include <stdint.h>
-
-namespace webrtc {
-
-static const size_t kWavHeaderSize = 44;
-
-class ReadableWav {
- public:
-  // Returns the number of bytes read.
-  size_t virtual Read(void* buf, size_t num_bytes) = 0;
-  virtual ~ReadableWav() {}
-};
-
-enum WavFormat {
-  kWavFormatPcm   = 1,  // PCM, each sample of size bytes_per_sample
-  kWavFormatALaw  = 6,  // 8-bit ITU-T G.711 A-law
-  kWavFormatMuLaw = 7,  // 8-bit ITU-T G.711 mu-law
-};
-
-// Return true if the given parameters will make a well-formed WAV header.
-bool CheckWavParameters(size_t num_channels,
-                        int sample_rate,
-                        WavFormat format,
-                        size_t bytes_per_sample,
-                        size_t num_samples);
-
-// Write a kWavHeaderSize bytes long WAV header to buf. The payload that
-// follows the header is supposed to have the specified number of interleaved
-// channels and contain the specified total number of samples of the specified
-// type. CHECKs the input parameters for validity.
-void WriteWavHeader(uint8_t* buf,
-                    size_t num_channels,
-                    int sample_rate,
-                    WavFormat format,
-                    size_t bytes_per_sample,
-                    size_t num_samples);
-
-// Read a WAV header from an implemented ReadableWav and parse the values into
-// the provided output parameters. ReadableWav is used because the header can
-// be variably sized. Returns false if the header is invalid.
-bool ReadWavHeader(ReadableWav* readable,
-                   size_t* num_channels,
-                   int* sample_rate,
-                   WavFormat* format,
-                   size_t* bytes_per_sample,
-                   size_t* num_samples);
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_COMMON_AUDIO_WAV_HEADER_H_
diff --git a/common_audio/wav_header_unittest.cc b/common_audio/wav_header_unittest.cc
deleted file mode 100644
index 17ebf82..0000000
--- a/common_audio/wav_header_unittest.cc
+++ /dev/null
@@ -1,323 +0,0 @@
-/*
- *  Copyright (c) 2014 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 <limits>
-
-#include "webrtc/common_audio/wav_header.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-// Doesn't take ownership of the buffer.
-class ReadableWavBuffer : public ReadableWav {
- public:
-  ReadableWavBuffer(const uint8_t* buf, size_t size)
-      : buf_(buf),
-        size_(size),
-        pos_(0),
-        buf_exhausted_(false),
-        check_read_size_(true) {}
-  ReadableWavBuffer(const uint8_t* buf, size_t size, bool check_read_size)
-      : buf_(buf),
-        size_(size),
-        pos_(0),
-        buf_exhausted_(false),
-        check_read_size_(check_read_size) {}
-
-  virtual ~ReadableWavBuffer() {
-    // Verify the entire buffer has been read.
-    if (check_read_size_)
-      EXPECT_EQ(size_, pos_);
-  }
-
-  virtual size_t Read(void* buf, size_t num_bytes) {
-    // Verify we don't try to read outside of a properly sized header.
-    if (size_ >= kWavHeaderSize)
-      EXPECT_GE(size_, pos_ + num_bytes);
-    EXPECT_FALSE(buf_exhausted_);
-
-    const size_t bytes_remaining = size_ - pos_;
-    if (num_bytes > bytes_remaining) {
-      // The caller is signalled about an exhausted buffer when we return fewer
-      // bytes than requested. There should not be another read attempt after
-      // this point.
-      buf_exhausted_ = true;
-      num_bytes = bytes_remaining;
-    }
-    memcpy(buf, &buf_[pos_], num_bytes);
-    pos_ += num_bytes;
-    return num_bytes;
-  }
-
- private:
-  const uint8_t* buf_;
-  const size_t size_;
-  size_t pos_;
-  bool buf_exhausted_;
-  const bool check_read_size_;
-};
-
-// Try various choices of WAV header parameters, and make sure that the good
-// ones are accepted and the bad ones rejected.
-TEST(WavHeaderTest, CheckWavParameters) {
-  // Try some really stupid values for one parameter at a time.
-  EXPECT_TRUE(CheckWavParameters(1, 8000, kWavFormatPcm, 1, 0));
-  EXPECT_FALSE(CheckWavParameters(0, 8000, kWavFormatPcm, 1, 0));
-  EXPECT_FALSE(CheckWavParameters(0x10000, 8000, kWavFormatPcm, 1, 0));
-  EXPECT_FALSE(CheckWavParameters(1, 0, kWavFormatPcm, 1, 0));
-  EXPECT_FALSE(CheckWavParameters(1, 8000, WavFormat(0), 1, 0));
-  EXPECT_FALSE(CheckWavParameters(1, 8000, kWavFormatPcm, 0, 0));
-
-  // Try invalid format/bytes-per-sample combinations.
-  EXPECT_TRUE(CheckWavParameters(1, 8000, kWavFormatPcm, 2, 0));
-  EXPECT_FALSE(CheckWavParameters(1, 8000, kWavFormatPcm, 4, 0));
-  EXPECT_FALSE(CheckWavParameters(1, 8000, kWavFormatALaw, 2, 0));
-  EXPECT_FALSE(CheckWavParameters(1, 8000, kWavFormatMuLaw, 2, 0));
-
-  // Too large values.
-  EXPECT_FALSE(CheckWavParameters(1 << 20, 1 << 20, kWavFormatPcm, 1, 0));
-  EXPECT_FALSE(CheckWavParameters(
-      1, 8000, kWavFormatPcm, 1, std::numeric_limits<uint32_t>::max()));
-
-  // Not the same number of samples for each channel.
-  EXPECT_FALSE(CheckWavParameters(3, 8000, kWavFormatPcm, 1, 5));
-}
-
-TEST(WavHeaderTest, ReadWavHeaderWithErrors) {
-  size_t num_channels = 0;
-  int sample_rate = 0;
-  WavFormat format = kWavFormatPcm;
-  size_t bytes_per_sample = 0;
-  size_t num_samples = 0;
-
-  // Test a few ways the header can be invalid. We start with the valid header
-  // used in WriteAndReadWavHeader, and invalidate one field per test. The
-  // invalid field is indicated in the array name, and in the comments with
-  // *BAD*.
-  {
-    static const uint8_t kBadRiffID[] = {
-      'R', 'i', 'f', 'f',  // *BAD*
-      0xbd, 0xd0, 0x5b, 0x07,  // size of whole file - 8: 123457689 + 44 - 8
-      'W', 'A', 'V', 'E',
-      'f', 'm', 't', ' ',
-      16, 0, 0, 0,  // size of fmt block - 8: 24 - 8
-      6, 0,  // format: A-law (6)
-      17, 0,  // channels: 17
-      0x39, 0x30, 0, 0,  // sample rate: 12345
-      0xc9, 0x33, 0x03, 0,  // byte rate: 1 * 17 * 12345
-      17, 0,  // block align: NumChannels * BytesPerSample
-      8, 0,  // bits per sample: 1 * 8
-      'd', 'a', 't', 'a',
-      0x99, 0xd0, 0x5b, 0x07,  // size of payload: 123457689
-    };
-    ReadableWavBuffer r(kBadRiffID, sizeof(kBadRiffID));
-    EXPECT_FALSE(
-        ReadWavHeader(&r, &num_channels, &sample_rate, &format,
-                      &bytes_per_sample, &num_samples));
-  }
-  {
-    static const uint8_t kBadBitsPerSample[] = {
-      'R', 'I', 'F', 'F',
-      0xbd, 0xd0, 0x5b, 0x07,  // size of whole file - 8: 123457689 + 44 - 8
-      'W', 'A', 'V', 'E',
-      'f', 'm', 't', ' ',
-      16, 0, 0, 0,  // size of fmt block - 8: 24 - 8
-      6, 0,  // format: A-law (6)
-      17, 0,  // channels: 17
-      0x39, 0x30, 0, 0,  // sample rate: 12345
-      0xc9, 0x33, 0x03, 0,  // byte rate: 1 * 17 * 12345
-      17, 0,  // block align: NumChannels * BytesPerSample
-      1, 0,  // bits per sample: *BAD*
-      'd', 'a', 't', 'a',
-      0x99, 0xd0, 0x5b, 0x07,  // size of payload: 123457689
-    };
-    ReadableWavBuffer r(kBadBitsPerSample, sizeof(kBadBitsPerSample));
-    EXPECT_FALSE(
-        ReadWavHeader(&r, &num_channels, &sample_rate, &format,
-                      &bytes_per_sample, &num_samples));
-  }
-  {
-    static const uint8_t kBadByteRate[] = {
-      'R', 'I', 'F', 'F',
-      0xbd, 0xd0, 0x5b, 0x07,  // size of whole file - 8: 123457689 + 44 - 8
-      'W', 'A', 'V', 'E',
-      'f', 'm', 't', ' ',
-      16, 0, 0, 0,  // size of fmt block - 8: 24 - 8
-      6, 0,  // format: A-law (6)
-      17, 0,  // channels: 17
-      0x39, 0x30, 0, 0,  // sample rate: 12345
-      0x00, 0x33, 0x03, 0,  // byte rate: *BAD*
-      17, 0,  // block align: NumChannels * BytesPerSample
-      8, 0,  // bits per sample: 1 * 8
-      'd', 'a', 't', 'a',
-      0x99, 0xd0, 0x5b, 0x07,  // size of payload: 123457689
-    };
-    ReadableWavBuffer r(kBadByteRate, sizeof(kBadByteRate));
-    EXPECT_FALSE(
-        ReadWavHeader(&r, &num_channels, &sample_rate, &format,
-                      &bytes_per_sample, &num_samples));
-  }
-  {
-    static const uint8_t kBadFmtHeaderSize[] = {
-      'R', 'I', 'F', 'F',
-      0xbd, 0xd0, 0x5b, 0x07,  // size of whole file - 8: 123457689 + 44 - 8
-      'W', 'A', 'V', 'E',
-      'f', 'm', 't', ' ',
-      17, 0, 0, 0,  // size of fmt block *BAD*. Only 16 and 18 permitted.
-      6, 0,  // format: A-law (6)
-      17, 0,  // channels: 17
-      0x39, 0x30, 0, 0,  // sample rate: 12345
-      0xc9, 0x33, 0x03, 0,  // byte rate: 1 * 17 * 12345
-      17, 0,  // block align: NumChannels * BytesPerSample
-      8, 0,  // bits per sample: 1 * 8
-      0,  // extra (though invalid) header byte
-      'd', 'a', 't', 'a',
-      0x99, 0xd0, 0x5b, 0x07,  // size of payload: 123457689
-    };
-    ReadableWavBuffer r(kBadFmtHeaderSize, sizeof(kBadFmtHeaderSize), false);
-    EXPECT_FALSE(
-        ReadWavHeader(&r, &num_channels, &sample_rate, &format,
-                      &bytes_per_sample, &num_samples));
-  }
-  {
-    static const uint8_t kNonZeroExtensionField[] = {
-      'R', 'I', 'F', 'F',
-      0xbd, 0xd0, 0x5b, 0x07,  // size of whole file - 8: 123457689 + 44 - 8
-      'W', 'A', 'V', 'E',
-      'f', 'm', 't', ' ',
-      18, 0, 0, 0,  // size of fmt block - 8: 24 - 8
-      6, 0,  // format: A-law (6)
-      17, 0,  // channels: 17
-      0x39, 0x30, 0, 0,  // sample rate: 12345
-      0xc9, 0x33, 0x03, 0,  // byte rate: 1 * 17 * 12345
-      17, 0,  // block align: NumChannels * BytesPerSample
-      8, 0,  // bits per sample: 1 * 8
-      1, 0,  // non-zero extension field *BAD*
-      'd', 'a', 't', 'a',
-      0x99, 0xd0, 0x5b, 0x07,  // size of payload: 123457689
-    };
-    ReadableWavBuffer r(kNonZeroExtensionField, sizeof(kNonZeroExtensionField),
-                        false);
-    EXPECT_FALSE(
-        ReadWavHeader(&r, &num_channels, &sample_rate, &format,
-                      &bytes_per_sample, &num_samples));
-  }
-  {
-    static const uint8_t kMissingDataChunk[] = {
-      'R', 'I', 'F', 'F',
-      0xbd, 0xd0, 0x5b, 0x07,  // size of whole file - 8: 123457689 + 44 - 8
-      'W', 'A', 'V', 'E',
-      'f', 'm', 't', ' ',
-      16, 0, 0, 0,  // size of fmt block - 8: 24 - 8
-      6, 0,  // format: A-law (6)
-      17, 0,  // channels: 17
-      0x39, 0x30, 0, 0,  // sample rate: 12345
-      0xc9, 0x33, 0x03, 0,  // byte rate: 1 * 17 * 12345
-      17, 0,  // block align: NumChannels * BytesPerSample
-      8, 0,  // bits per sample: 1 * 8
-    };
-    ReadableWavBuffer r(kMissingDataChunk, sizeof(kMissingDataChunk));
-    EXPECT_FALSE(
-        ReadWavHeader(&r, &num_channels, &sample_rate, &format,
-                      &bytes_per_sample, &num_samples));
-  }
-  {
-    static const uint8_t kMissingFmtAndDataChunks[] = {
-      'R', 'I', 'F', 'F',
-      0xbd, 0xd0, 0x5b, 0x07,  // size of whole file - 8: 123457689 + 44 - 8
-      'W', 'A', 'V', 'E',
-    };
-    ReadableWavBuffer r(kMissingFmtAndDataChunks,
-                        sizeof(kMissingFmtAndDataChunks));
-    EXPECT_FALSE(
-        ReadWavHeader(&r, &num_channels, &sample_rate, &format,
-                      &bytes_per_sample, &num_samples));
-  }
-}
-
-// Try writing and reading a valid WAV header and make sure it looks OK.
-TEST(WavHeaderTest, WriteAndReadWavHeader) {
-  static const int kSize = 4 + kWavHeaderSize + 4;
-  uint8_t buf[kSize];
-  memset(buf, 0xa4, sizeof(buf));
-  WriteWavHeader(buf + 4, 17, 12345, kWavFormatALaw, 1, 123457689);
-  static const uint8_t kExpectedBuf[] = {
-    0xa4, 0xa4, 0xa4, 0xa4,  // untouched bytes before header
-    'R', 'I', 'F', 'F',
-    0xbd, 0xd0, 0x5b, 0x07,  // size of whole file - 8: 123457689 + 44 - 8
-    'W', 'A', 'V', 'E',
-    'f', 'm', 't', ' ',
-    16, 0, 0, 0,  // size of fmt block - 8: 24 - 8
-    6, 0,  // format: A-law (6)
-    17, 0,  // channels: 17
-    0x39, 0x30, 0, 0,  // sample rate: 12345
-    0xc9, 0x33, 0x03, 0,  // byte rate: 1 * 17 * 12345
-    17, 0,  // block align: NumChannels * BytesPerSample
-    8, 0,  // bits per sample: 1 * 8
-    'd', 'a', 't', 'a',
-    0x99, 0xd0, 0x5b, 0x07,  // size of payload: 123457689
-    0xa4, 0xa4, 0xa4, 0xa4,  // untouched bytes after header
-  };
-  static_assert(sizeof(kExpectedBuf) == kSize, "buffer size");
-  EXPECT_EQ(0, memcmp(kExpectedBuf, buf, kSize));
-
-  size_t num_channels = 0;
-  int sample_rate = 0;
-  WavFormat format = kWavFormatPcm;
-  size_t bytes_per_sample = 0;
-  size_t num_samples = 0;
-  ReadableWavBuffer r(buf + 4, sizeof(buf) - 8);
-  EXPECT_TRUE(
-      ReadWavHeader(&r, &num_channels, &sample_rate, &format,
-                    &bytes_per_sample, &num_samples));
-  EXPECT_EQ(17u, num_channels);
-  EXPECT_EQ(12345, sample_rate);
-  EXPECT_EQ(kWavFormatALaw, format);
-  EXPECT_EQ(1u, bytes_per_sample);
-  EXPECT_EQ(123457689u, num_samples);
-}
-
-// Try reading an atypical but valid WAV header and make sure it's parsed OK.
-TEST(WavHeaderTest, ReadAtypicalWavHeader) {
-  static const uint8_t kBuf[] = {
-    'R', 'I', 'F', 'F',
-    0x3d, 0xd1, 0x5b, 0x07,  // size of whole file - 8 + an extra 128 bytes of
-                             // "metadata": 123457689 + 44 - 8 + 128. (atypical)
-    'W', 'A', 'V', 'E',
-    'f', 'm', 't', ' ',
-    18, 0, 0, 0,  // size of fmt block (with an atypical extension size field)
-    6, 0,  // format: A-law (6)
-    17, 0,  // channels: 17
-    0x39, 0x30, 0, 0,  // sample rate: 12345
-    0xc9, 0x33, 0x03, 0,  // byte rate: 1 * 17 * 12345
-    17, 0,  // block align: NumChannels * BytesPerSample
-    8, 0,  // bits per sample: 1 * 8
-    0, 0,  // zero extension size field (atypical)
-    'd', 'a', 't', 'a',
-    0x99, 0xd0, 0x5b, 0x07,  // size of payload: 123457689
-  };
-
-  size_t num_channels = 0;
-  int sample_rate = 0;
-  WavFormat format = kWavFormatPcm;
-  size_t bytes_per_sample = 0;
-  size_t num_samples = 0;
-  ReadableWavBuffer r(kBuf, sizeof(kBuf));
-  EXPECT_TRUE(
-      ReadWavHeader(&r, &num_channels, &sample_rate, &format,
-                    &bytes_per_sample, &num_samples));
-  EXPECT_EQ(17u, num_channels);
-  EXPECT_EQ(12345, sample_rate);
-  EXPECT_EQ(kWavFormatALaw, format);
-  EXPECT_EQ(1u, bytes_per_sample);
-  EXPECT_EQ(123457689u, num_samples);
-}
-
-}  // namespace webrtc
diff --git a/common_audio/window_generator.cc b/common_audio/window_generator.cc
deleted file mode 100644
index ea5198a..0000000
--- a/common_audio/window_generator.cc
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- *  Copyright (c) 2014 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.
- */
-
-#define _USE_MATH_DEFINES
-
-#include "webrtc/common_audio/window_generator.h"
-
-#include <cmath>
-#include <complex>
-
-#include "webrtc/rtc_base/checks.h"
-
-using std::complex;
-
-namespace {
-
-// Modified Bessel function of order 0 for complex inputs.
-complex<float> I0(complex<float> x) {
-  complex<float> y = x / 3.75f;
-  y *= y;
-  return 1.0f + y * (
-    3.5156229f + y * (
-      3.0899424f + y * (
-        1.2067492f + y * (
-          0.2659732f + y * (
-            0.360768e-1f + y * 0.45813e-2f)))));
-}
-
-}  // namespace
-
-namespace webrtc {
-
-void WindowGenerator::Hanning(int length, float* window) {
-  RTC_CHECK_GT(length, 1);
-  RTC_CHECK(window != nullptr);
-  for (int i = 0; i < length; ++i) {
-    window[i] = 0.5f * (1 - cosf(2 * static_cast<float>(M_PI) * i /
-                                 (length - 1)));
-  }
-}
-
-void WindowGenerator::KaiserBesselDerived(float alpha, size_t length,
-                                          float* window) {
-  RTC_CHECK_GT(length, 1U);
-  RTC_CHECK(window != nullptr);
-
-  const size_t half = (length + 1) / 2;
-  float sum = 0.0f;
-
-  for (size_t i = 0; i <= half; ++i) {
-    complex<float> r = (4.0f * i) / length - 1.0f;
-    sum += I0(static_cast<float>(M_PI) * alpha * sqrt(1.0f - r * r)).real();
-    window[i] = sum;
-  }
-  for (size_t i = length - 1; i >= half; --i) {
-    window[length - i - 1] = sqrtf(window[length - i - 1] / sum);
-    window[i] = window[length - i - 1];
-  }
-  if (length % 2 == 1) {
-    window[half - 1] = sqrtf(window[half - 1] / sum);
-  }
-}
-
-}  // namespace webrtc
-
diff --git a/common_audio/window_generator.h b/common_audio/window_generator.h
deleted file mode 100644
index 3bbf21a..0000000
--- a/common_audio/window_generator.h
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- *  Copyright (c) 2014 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_COMMON_AUDIO_WINDOW_GENERATOR_H_
-#define WEBRTC_COMMON_AUDIO_WINDOW_GENERATOR_H_
-
-#include <stddef.h>
-
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace webrtc {
-
-// Helper class with generators for various signal transform windows.
-class WindowGenerator {
- public:
-  static void Hanning(int length, float* window);
-  static void KaiserBesselDerived(float alpha, size_t length, float* window);
-
- private:
-  RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(WindowGenerator);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_COMMON_AUDIO_WINDOW_GENERATOR_H_
-
diff --git a/common_audio/window_generator_unittest.cc b/common_audio/window_generator_unittest.cc
deleted file mode 100644
index d0d2903..0000000
--- a/common_audio/window_generator_unittest.cc
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- *  Copyright (c) 2014 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/common_audio/window_generator.h"
-
-#include <cstring>
-
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-TEST(WindowGeneratorTest, KaiserBesselDerived) {
-  float window[7];
-
-  memset(window, 0, sizeof(window));
-
-  WindowGenerator::KaiserBesselDerived(0.397856f, 2, window);
-  ASSERT_NEAR(window[0], 0.707106f, 1e-6f);
-  ASSERT_NEAR(window[1], 0.707106f, 1e-6f);
-  ASSERT_NEAR(window[2], 0.0f, 1e-6f);
-  ASSERT_NEAR(window[3], 0.0f, 1e-6f);
-  ASSERT_NEAR(window[4], 0.0f, 1e-6f);
-  ASSERT_NEAR(window[5], 0.0f, 1e-6f);
-  ASSERT_NEAR(window[6], 0.0f, 1e-6f);
-
-  WindowGenerator::KaiserBesselDerived(0.397856f, 3, window);
-  ASSERT_NEAR(window[0], 0.598066f, 1e-6f);
-  ASSERT_NEAR(window[1], 0.922358f, 1e-6f);
-  ASSERT_NEAR(window[2], 0.598066f, 1e-6f);
-  ASSERT_NEAR(window[3], 0.0f, 1e-6f);
-  ASSERT_NEAR(window[4], 0.0f, 1e-6f);
-  ASSERT_NEAR(window[5], 0.0f, 1e-6f);
-  ASSERT_NEAR(window[6], 0.0f, 1e-6f);
-
-  WindowGenerator::KaiserBesselDerived(0.397856f, 6, window);
-  ASSERT_NEAR(window[0], 0.458495038865344f, 1e-6f);
-  ASSERT_NEAR(window[1], 0.707106781186548f, 1e-6f);
-  ASSERT_NEAR(window[2], 0.888696967101760f, 1e-6f);
-  ASSERT_NEAR(window[3], 0.888696967101760f, 1e-6f);
-  ASSERT_NEAR(window[4], 0.707106781186548f, 1e-6f);
-  ASSERT_NEAR(window[5], 0.458495038865344f, 1e-6f);
-  ASSERT_NEAR(window[6], 0.0f, 1e-6f);
-}
-
-TEST(WindowGeneratorTest, Hanning) {
-  float window[7];
-
-  memset(window, 0, sizeof(window));
-
-  window[0] = -1.0f;
-  window[1] = -1.0f;
-  WindowGenerator::Hanning(2, window);
-  ASSERT_NEAR(window[0], 0.0f, 1e-6f);
-  ASSERT_NEAR(window[1], 0.0f, 1e-6f);
-  ASSERT_NEAR(window[2], 0.0f, 1e-6f);
-  ASSERT_NEAR(window[3], 0.0f, 1e-6f);
-  ASSERT_NEAR(window[4], 0.0f, 1e-6f);
-  ASSERT_NEAR(window[5], 0.0f, 1e-6f);
-  ASSERT_NEAR(window[6], 0.0f, 1e-6f);
-
-  window[0] = -1.0f;
-  window[2] = -1.0f;
-  WindowGenerator::Hanning(3, window);
-  ASSERT_NEAR(window[0], 0.0f, 1e-6f);
-  ASSERT_NEAR(window[1], 1.0f, 1e-6f);
-  ASSERT_NEAR(window[2], 0.0f, 1e-6f);
-  ASSERT_NEAR(window[3], 0.0f, 1e-6f);
-  ASSERT_NEAR(window[4], 0.0f, 1e-6f);
-  ASSERT_NEAR(window[5], 0.0f, 1e-6f);
-  ASSERT_NEAR(window[6], 0.0f, 1e-6f);
-
-  window[0] = -1.0f;
-  window[5] = -1.0f;
-  WindowGenerator::Hanning(6, window);
-  ASSERT_NEAR(window[0], 0.0f, 1e-6f);
-  ASSERT_NEAR(window[1], 0.345491f, 1e-6f);
-  ASSERT_NEAR(window[2], 0.904508f, 1e-6f);
-  ASSERT_NEAR(window[3], 0.904508f, 1e-6f);
-  ASSERT_NEAR(window[4], 0.345491f, 1e-6f);
-  ASSERT_NEAR(window[5], 0.0f, 1e-6f);
-  ASSERT_NEAR(window[6], 0.0f, 1e-6f);
-}
-
-}  // namespace webrtc
-
diff --git a/common_types.cc b/common_types.cc
deleted file mode 100644
index 7a27fcb..0000000
--- a/common_types.cc
+++ /dev/null
@@ -1,268 +0,0 @@
-/*
- *  Copyright (c) 2012 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/common_types.h"
-
-#include <string.h>
-#include <algorithm>
-#include <limits>
-#include <type_traits>
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/stringutils.h"
-
-namespace webrtc {
-
-StreamDataCounters::StreamDataCounters() : first_packet_time_ms(-1) {}
-
-constexpr size_t StreamId::kMaxSize;
-
-bool StreamId::IsLegalName(rtc::ArrayView<const char> name) {
-  return (name.size() <= kMaxSize && name.size() > 0 &&
-          std::all_of(name.data(), name.data() + name.size(), isalnum));
-}
-
-void StreamId::Set(const char* data, size_t size) {
-  // If |data| contains \0, the stream id size might become less than |size|.
-  RTC_CHECK_LE(size, kMaxSize);
-  memcpy(value_, data, size);
-  if (size < kMaxSize)
-    value_[size] = 0;
-}
-
-// StreamId is used as member of RTPHeader that is sometimes copied with memcpy
-// and thus assume trivial destructibility.
-static_assert(std::is_trivially_destructible<StreamId>::value, "");
-
-RTPHeaderExtension::RTPHeaderExtension()
-    : hasTransmissionTimeOffset(false),
-      transmissionTimeOffset(0),
-      hasAbsoluteSendTime(false),
-      absoluteSendTime(0),
-      hasTransportSequenceNumber(false),
-      transportSequenceNumber(0),
-      hasAudioLevel(false),
-      voiceActivity(false),
-      audioLevel(0),
-      hasVideoRotation(false),
-      videoRotation(kVideoRotation_0),
-      hasVideoContentType(false),
-      videoContentType(VideoContentType::UNSPECIFIED),
-      has_video_timing(false) {}
-
-RTPHeaderExtension::RTPHeaderExtension(const RTPHeaderExtension& other) =
-    default;
-
-RTPHeaderExtension& RTPHeaderExtension::operator=(
-    const RTPHeaderExtension& other) = default;
-
-RTPHeader::RTPHeader()
-    : markerBit(false),
-      payloadType(0),
-      sequenceNumber(0),
-      timestamp(0),
-      ssrc(0),
-      numCSRCs(0),
-      arrOfCSRCs(),
-      paddingLength(0),
-      headerLength(0),
-      payload_type_frequency(0),
-      extension() {}
-
-RTPHeader::RTPHeader(const RTPHeader& other) = default;
-
-RTPHeader& RTPHeader::operator=(const RTPHeader& other) = default;
-
-VideoCodec::VideoCodec()
-    : codecType(kVideoCodecUnknown),
-      plName(),
-      plType(0),
-      width(0),
-      height(0),
-      startBitrate(0),
-      maxBitrate(0),
-      minBitrate(0),
-      targetBitrate(0),
-      maxFramerate(0),
-      qpMax(0),
-      numberOfSimulcastStreams(0),
-      simulcastStream(),
-      spatialLayers(),
-      mode(kRealtimeVideo),
-      expect_encode_from_texture(false),
-      timing_frame_thresholds({0, 0}),
-      codec_specific_() {}
-
-VideoCodecVP8* VideoCodec::VP8() {
-  RTC_DCHECK_EQ(codecType, kVideoCodecVP8);
-  return &codec_specific_.VP8;
-}
-
-const VideoCodecVP8& VideoCodec::VP8() const {
-  RTC_DCHECK_EQ(codecType, kVideoCodecVP8);
-  return codec_specific_.VP8;
-}
-
-VideoCodecVP9* VideoCodec::VP9() {
-  RTC_DCHECK_EQ(codecType, kVideoCodecVP9);
-  return &codec_specific_.VP9;
-}
-
-const VideoCodecVP9& VideoCodec::VP9() const {
-  RTC_DCHECK_EQ(codecType, kVideoCodecVP9);
-  return codec_specific_.VP9;
-}
-
-VideoCodecH264* VideoCodec::H264() {
-  RTC_DCHECK_EQ(codecType, kVideoCodecH264);
-  return &codec_specific_.H264;
-}
-
-const VideoCodecH264& VideoCodec::H264() const {
-  RTC_DCHECK_EQ(codecType, kVideoCodecH264);
-  return codec_specific_.H264;
-}
-
-static const char* kPayloadNameVp8 = "VP8";
-static const char* kPayloadNameVp9 = "VP9";
-static const char* kPayloadNameH264 = "H264";
-static const char* kPayloadNameI420 = "I420";
-static const char* kPayloadNameRED = "RED";
-static const char* kPayloadNameULPFEC = "ULPFEC";
-static const char* kPayloadNameGeneric = "Generic";
-
-static bool CodecNamesEq(const char* name1, const char* name2) {
-  return _stricmp(name1, name2) == 0;
-}
-
-const char* CodecTypeToPayloadString(VideoCodecType type) {
-  switch (type) {
-    case kVideoCodecVP8:
-      return kPayloadNameVp8;
-    case kVideoCodecVP9:
-      return kPayloadNameVp9;
-    case kVideoCodecH264:
-      return kPayloadNameH264;
-    case kVideoCodecI420:
-      return kPayloadNameI420;
-    case kVideoCodecRED:
-      return kPayloadNameRED;
-    case kVideoCodecULPFEC:
-      return kPayloadNameULPFEC;
-    default:
-      // Unrecognized codecs default to generic.
-      return kPayloadNameGeneric;
-  }
-}
-
-VideoCodecType PayloadStringToCodecType(const std::string& name) {
-  if (CodecNamesEq(name.c_str(), kPayloadNameVp8))
-    return kVideoCodecVP8;
-  if (CodecNamesEq(name.c_str(), kPayloadNameVp9))
-    return kVideoCodecVP9;
-  if (CodecNamesEq(name.c_str(), kPayloadNameH264))
-    return kVideoCodecH264;
-  if (CodecNamesEq(name.c_str(), kPayloadNameI420))
-    return kVideoCodecI420;
-  if (CodecNamesEq(name.c_str(), kPayloadNameRED))
-    return kVideoCodecRED;
-  if (CodecNamesEq(name.c_str(), kPayloadNameULPFEC))
-    return kVideoCodecULPFEC;
-  return kVideoCodecGeneric;
-}
-
-const uint32_t BitrateAllocation::kMaxBitrateBps =
-    std::numeric_limits<uint32_t>::max();
-
-BitrateAllocation::BitrateAllocation() : sum_(0), bitrates_{} {}
-
-bool BitrateAllocation::SetBitrate(size_t spatial_index,
-                                   size_t temporal_index,
-                                   uint32_t bitrate_bps) {
-  RTC_CHECK_LT(spatial_index, kMaxSpatialLayers);
-  RTC_CHECK_LT(temporal_index, kMaxTemporalStreams);
-  RTC_CHECK_LE(bitrates_[spatial_index][temporal_index], sum_);
-  uint64_t new_bitrate_sum_bps = sum_;
-  new_bitrate_sum_bps -= bitrates_[spatial_index][temporal_index];
-  new_bitrate_sum_bps += bitrate_bps;
-  if (new_bitrate_sum_bps > kMaxBitrateBps)
-    return false;
-
-  bitrates_[spatial_index][temporal_index] = bitrate_bps;
-  sum_ = static_cast<uint32_t>(new_bitrate_sum_bps);
-  return true;
-}
-
-uint32_t BitrateAllocation::GetBitrate(size_t spatial_index,
-                                       size_t temporal_index) const {
-  RTC_CHECK_LT(spatial_index, kMaxSpatialLayers);
-  RTC_CHECK_LT(temporal_index, kMaxTemporalStreams);
-  return bitrates_[spatial_index][temporal_index];
-}
-
-// Get the sum of all the temporal layer for a specific spatial layer.
-uint32_t BitrateAllocation::GetSpatialLayerSum(size_t spatial_index) const {
-  RTC_CHECK_LT(spatial_index, kMaxSpatialLayers);
-  uint32_t sum = 0;
-  for (int i = 0; i < kMaxTemporalStreams; ++i)
-    sum += bitrates_[spatial_index][i];
-  return sum;
-}
-
-std::string BitrateAllocation::ToString() const {
-  if (sum_ == 0)
-    return "BitrateAllocation [ [] ]";
-
-  // TODO(sprang): Replace this stringstream with something cheaper.
-  std::ostringstream oss;
-  oss << "BitrateAllocation [";
-  uint32_t spatial_cumulator = 0;
-  for (int si = 0; si < kMaxSpatialLayers; ++si) {
-    RTC_DCHECK_LE(spatial_cumulator, sum_);
-    if (spatial_cumulator == sum_)
-      break;
-
-    const uint32_t layer_sum = GetSpatialLayerSum(si);
-    if (layer_sum == sum_) {
-      oss << " [";
-    } else {
-      if (si > 0)
-        oss << ",";
-      oss << std::endl << "  [";
-    }
-    spatial_cumulator += layer_sum;
-
-    uint32_t temporal_cumulator = 0;
-    for (int ti = 0; ti < kMaxTemporalStreams; ++ti) {
-      RTC_DCHECK_LE(temporal_cumulator, layer_sum);
-      if (temporal_cumulator == layer_sum)
-        break;
-
-      if (ti > 0)
-        oss << ", ";
-
-      uint32_t bitrate = bitrates_[si][ti];
-      oss << bitrate;
-      temporal_cumulator += bitrate;
-    }
-    oss << "]";
-  }
-
-  RTC_DCHECK_EQ(spatial_cumulator, sum_);
-  oss << " ]";
-  return oss.str();
-}
-
-std::ostream& BitrateAllocation::operator<<(std::ostream& os) const {
-  os << ToString();
-  return os;
-}
-
-}  // namespace webrtc
diff --git a/common_types.h b/common_types.h
deleted file mode 100644
index 9ad5165..0000000
--- a/common_types.h
+++ /dev/null
@@ -1,975 +0,0 @@
-/*
- *  Copyright (c) 2012 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_COMMON_TYPES_H_
-#define WEBRTC_COMMON_TYPES_H_
-
-#include <stddef.h>
-#include <string.h>
-#include <ostream>
-#include <string>
-#include <vector>
-
-#include "webrtc/api/array_view.h"
-#include "webrtc/api/optional.h"
-#include "webrtc/api/video/video_content_type.h"
-#include "webrtc/api/video/video_rotation.h"
-#include "webrtc/api/video/video_timing.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/deprecation.h"
-#include "webrtc/typedefs.h"
-
-#if defined(_MSC_VER)
-// Disable "new behavior: elements of array will be default initialized"
-// warning. Affects OverUseDetectorOptions.
-#pragma warning(disable : 4351)
-#endif
-
-#if defined(WEBRTC_EXPORT)
-#define WEBRTC_DLLEXPORT _declspec(dllexport)
-#elif defined(WEBRTC_DLL)
-#define WEBRTC_DLLEXPORT _declspec(dllimport)
-#else
-#define WEBRTC_DLLEXPORT
-#endif
-
-#ifndef NULL
-#define NULL 0
-#endif
-
-#define RTP_PAYLOAD_NAME_SIZE 32u
-
-#if defined(WEBRTC_WIN) || defined(WIN32)
-// Compares two strings without regard to case.
-#define STR_CASE_CMP(s1, s2) ::_stricmp(s1, s2)
-// Compares characters of two strings without regard to case.
-#define STR_NCASE_CMP(s1, s2, n) ::_strnicmp(s1, s2, n)
-#else
-#define STR_CASE_CMP(s1, s2) ::strcasecmp(s1, s2)
-#define STR_NCASE_CMP(s1, s2, n) ::strncasecmp(s1, s2, n)
-#endif
-
-namespace webrtc {
-
-class RewindableStream {
- public:
-  virtual ~RewindableStream() {}
-  virtual int Rewind() = 0;
-};
-
-class InStream : public RewindableStream {
- public:
-  // Reads |len| bytes from file to |buf|. Returns the number of bytes read
-  // or -1 on error.
-  virtual int Read(void* buf, size_t len) = 0;
-};
-
-class OutStream : public RewindableStream {
- public:
-  // Writes |len| bytes from |buf| to file. The actual writing may happen
-  // some time later. Call Flush() to force a write.
-  virtual bool Write(const void* buf, size_t len) = 0;
-};
-
-enum TraceModule {
-  kTraceUndefined = 0,
-  // not a module, triggered from the engine code
-  kTraceVoice = 0x0001,
-  // not a module, triggered from the engine code
-  kTraceVideo = 0x0002,
-  // not a module, triggered from the utility code
-  kTraceUtility = 0x0003,
-  kTraceRtpRtcp = 0x0004,
-  kTraceTransport = 0x0005,
-  kTraceSrtp = 0x0006,
-  kTraceAudioCoding = 0x0007,
-  kTraceAudioMixerServer = 0x0008,
-  kTraceAudioMixerClient = 0x0009,
-  kTraceFile = 0x000a,
-  kTraceAudioProcessing = 0x000b,
-  kTraceVideoCoding = 0x0010,
-  kTraceVideoMixer = 0x0011,
-  kTraceAudioDevice = 0x0012,
-  kTraceVideoRenderer = 0x0014,
-  kTraceVideoCapture = 0x0015,
-  kTraceRemoteBitrateEstimator = 0x0017,
-};
-
-enum TraceLevel {
-  kTraceNone = 0x0000,  // no trace
-  kTraceStateInfo = 0x0001,
-  kTraceWarning = 0x0002,
-  kTraceError = 0x0004,
-  kTraceCritical = 0x0008,
-  kTraceApiCall = 0x0010,
-  kTraceDefault = 0x00ff,
-
-  kTraceModuleCall = 0x0020,
-  kTraceMemory = 0x0100,  // memory info
-  kTraceTimer = 0x0200,   // timing info
-  kTraceStream = 0x0400,  // "continuous" stream of data
-
-  // used for debug purposes
-  kTraceDebug = 0x0800,  // debug
-  kTraceInfo = 0x1000,   // debug info
-
-  // Non-verbose level used by LS_INFO of logging.h. Do not use directly.
-  kTraceTerseInfo = 0x2000,
-
-  kTraceAll = 0xffff
-};
-
-// External Trace API
-class TraceCallback {
- public:
-  virtual void Print(TraceLevel level, const char* message, int length) = 0;
-
- protected:
-  virtual ~TraceCallback() {}
-  TraceCallback() {}
-};
-
-enum FileFormats {
-  kFileFormatWavFile = 1,
-  kFileFormatCompressedFile = 2,
-  kFileFormatPreencodedFile = 4,
-  kFileFormatPcm16kHzFile = 7,
-  kFileFormatPcm8kHzFile = 8,
-  kFileFormatPcm32kHzFile = 9,
-  kFileFormatPcm48kHzFile = 10
-};
-
-enum FrameType {
-  kEmptyFrame = 0,
-  kAudioFrameSpeech = 1,
-  kAudioFrameCN = 2,
-  kVideoFrameKey = 3,
-  kVideoFrameDelta = 4,
-};
-
-// Statistics for an RTCP channel
-struct RtcpStatistics {
-  RtcpStatistics()
-      : fraction_lost(0),
-        packets_lost(0),
-        extended_highest_sequence_number(0),
-        jitter(0) {}
-
-  uint8_t fraction_lost;
-  union {
-    uint32_t packets_lost;
-    RTC_DEPRECATED uint32_t cumulative_lost;
-  };
-  union {
-    uint32_t extended_highest_sequence_number;
-    RTC_DEPRECATED uint32_t extended_max_sequence_number;
-  };
-  uint32_t jitter;
-};
-
-class RtcpStatisticsCallback {
- public:
-  virtual ~RtcpStatisticsCallback() {}
-
-  virtual void StatisticsUpdated(const RtcpStatistics& statistics,
-                                 uint32_t ssrc) = 0;
-  virtual void CNameChanged(const char* cname, uint32_t ssrc) = 0;
-};
-
-// Statistics for RTCP packet types.
-struct RtcpPacketTypeCounter {
-  RtcpPacketTypeCounter()
-      : first_packet_time_ms(-1),
-        nack_packets(0),
-        fir_packets(0),
-        pli_packets(0),
-        nack_requests(0),
-        unique_nack_requests(0) {}
-
-  void Add(const RtcpPacketTypeCounter& other) {
-    nack_packets += other.nack_packets;
-    fir_packets += other.fir_packets;
-    pli_packets += other.pli_packets;
-    nack_requests += other.nack_requests;
-    unique_nack_requests += other.unique_nack_requests;
-    if (other.first_packet_time_ms != -1 &&
-        (other.first_packet_time_ms < first_packet_time_ms ||
-         first_packet_time_ms == -1)) {
-      // Use oldest time.
-      first_packet_time_ms = other.first_packet_time_ms;
-    }
-  }
-
-  void Subtract(const RtcpPacketTypeCounter& other) {
-    nack_packets -= other.nack_packets;
-    fir_packets -= other.fir_packets;
-    pli_packets -= other.pli_packets;
-    nack_requests -= other.nack_requests;
-    unique_nack_requests -= other.unique_nack_requests;
-    if (other.first_packet_time_ms != -1 &&
-        (other.first_packet_time_ms > first_packet_time_ms ||
-         first_packet_time_ms == -1)) {
-      // Use youngest time.
-      first_packet_time_ms = other.first_packet_time_ms;
-    }
-  }
-
-  int64_t TimeSinceFirstPacketInMs(int64_t now_ms) const {
-    return (first_packet_time_ms == -1) ? -1 : (now_ms - first_packet_time_ms);
-  }
-
-  int UniqueNackRequestsInPercent() const {
-    if (nack_requests == 0) {
-      return 0;
-    }
-    return static_cast<int>((unique_nack_requests * 100.0f / nack_requests) +
-                            0.5f);
-  }
-
-  int64_t first_packet_time_ms;   // Time when first packet is sent/received.
-  uint32_t nack_packets;          // Number of RTCP NACK packets.
-  uint32_t fir_packets;           // Number of RTCP FIR packets.
-  uint32_t pli_packets;           // Number of RTCP PLI packets.
-  uint32_t nack_requests;         // Number of NACKed RTP packets.
-  uint32_t unique_nack_requests;  // Number of unique NACKed RTP packets.
-};
-
-class RtcpPacketTypeCounterObserver {
- public:
-  virtual ~RtcpPacketTypeCounterObserver() {}
-  virtual void RtcpPacketTypesCounterUpdated(
-      uint32_t ssrc,
-      const RtcpPacketTypeCounter& packet_counter) = 0;
-};
-
-// Rate statistics for a stream.
-struct BitrateStatistics {
-  BitrateStatistics() : bitrate_bps(0), packet_rate(0) {}
-
-  uint32_t bitrate_bps;  // Bitrate in bits per second.
-  uint32_t packet_rate;  // Packet rate in packets per second.
-};
-
-// Callback, used to notify an observer whenever new rates have been estimated.
-class BitrateStatisticsObserver {
- public:
-  virtual ~BitrateStatisticsObserver() {}
-
-  virtual void Notify(uint32_t total_bitrate_bps,
-                      uint32_t retransmit_bitrate_bps,
-                      uint32_t ssrc) = 0;
-};
-
-struct FrameCounts {
-  FrameCounts() : key_frames(0), delta_frames(0) {}
-  int key_frames;
-  int delta_frames;
-};
-
-// Callback, used to notify an observer whenever frame counts have been updated.
-class FrameCountObserver {
- public:
-  virtual ~FrameCountObserver() {}
-  virtual void FrameCountUpdated(const FrameCounts& frame_counts,
-                                 uint32_t ssrc) = 0;
-};
-
-// Callback, used to notify an observer whenever the send-side delay is updated.
-class SendSideDelayObserver {
- public:
-  virtual ~SendSideDelayObserver() {}
-  virtual void SendSideDelayUpdated(int avg_delay_ms,
-                                    int max_delay_ms,
-                                    uint32_t ssrc) = 0;
-};
-
-// Callback, used to notify an observer whenever a packet is sent to the
-// transport.
-// TODO(asapersson): This class will remove the need for SendSideDelayObserver.
-// Remove SendSideDelayObserver once possible.
-class SendPacketObserver {
- public:
-  virtual ~SendPacketObserver() {}
-  virtual void OnSendPacket(uint16_t packet_id,
-                            int64_t capture_time_ms,
-                            uint32_t ssrc) = 0;
-};
-
-// Callback, used to notify an observer when the overhead per packet
-// has changed.
-class OverheadObserver {
- public:
-  virtual ~OverheadObserver() = default;
-  virtual void OnOverheadChanged(size_t overhead_bytes_per_packet) = 0;
-};
-
-// ==================================================================
-// Voice specific types
-// ==================================================================
-
-// Each codec supported can be described by this structure.
-struct CodecInst {
-  int pltype;
-  char plname[RTP_PAYLOAD_NAME_SIZE];
-  int plfreq;
-  int pacsize;
-  size_t channels;
-  int rate;  // bits/sec unlike {start,min,max}Bitrate elsewhere in this file!
-
-  bool operator==(const CodecInst& other) const {
-    return pltype == other.pltype &&
-           (STR_CASE_CMP(plname, other.plname) == 0) &&
-           plfreq == other.plfreq && pacsize == other.pacsize &&
-           channels == other.channels && rate == other.rate;
-  }
-
-  bool operator!=(const CodecInst& other) const { return !(*this == other); }
-
-  friend std::ostream& operator<<(std::ostream& os, const CodecInst& ci) {
-    os << "{pltype: " << ci.pltype;
-    os << ", plname: " << ci.plname;
-    os << ", plfreq: " << ci.plfreq;
-    os << ", pacsize: " << ci.pacsize;
-    os << ", channels: " << ci.channels;
-    os << ", rate: " << ci.rate << "}";
-    return os;
-  }
-};
-
-// RTP
-enum { kRtpCsrcSize = 15 };  // RFC 3550 page 13
-
-enum PayloadFrequencies {
-  kFreq8000Hz = 8000,
-  kFreq16000Hz = 16000,
-  kFreq32000Hz = 32000
-};
-
-// Degree of bandwidth reduction.
-enum VadModes {
-  kVadConventional = 0,  // lowest reduction
-  kVadAggressiveLow,
-  kVadAggressiveMid,
-  kVadAggressiveHigh  // highest reduction
-};
-
-// NETEQ statistics.
-struct NetworkStatistics {
-  // current jitter buffer size in ms
-  uint16_t currentBufferSize;
-  // preferred (optimal) buffer size in ms
-  uint16_t preferredBufferSize;
-  // adding extra delay due to "peaky jitter"
-  bool jitterPeaksFound;
-  // Total number of audio samples received, including synthesized samples.
-  // https://w3c.github.io/webrtc-stats/#dom-rtcmediastreamtrackstats-totalsamplesreceived
-  uint64_t totalSamplesReceived;
-  // Total number of inbound audio samples that are based on synthesized data to
-  // conceal packet loss.
-  // https://w3c.github.io/webrtc-stats/#dom-rtcmediastreamtrackstats-concealedsamples
-  uint64_t concealedSamples;
-  // Loss rate (network + late); fraction between 0 and 1, scaled to Q14.
-  uint16_t currentPacketLossRate;
-  // Late loss rate; fraction between 0 and 1, scaled to Q14.
-  union {
-    RTC_DEPRECATED uint16_t currentDiscardRate;
-  };
-  // fraction (of original stream) of synthesized audio inserted through
-  // expansion (in Q14)
-  uint16_t currentExpandRate;
-  // fraction (of original stream) of synthesized speech inserted through
-  // expansion (in Q14)
-  uint16_t currentSpeechExpandRate;
-  // fraction of synthesized speech inserted through pre-emptive expansion
-  // (in Q14)
-  uint16_t currentPreemptiveRate;
-  // fraction of data removed through acceleration (in Q14)
-  uint16_t currentAccelerateRate;
-  // fraction of data coming from secondary decoding (in Q14)
-  uint16_t currentSecondaryDecodedRate;
-  // Fraction of secondary data, including FEC and RED, that is discarded (in
-  // Q14). Discarding of secondary data can be caused by the reception of the
-  // primary data, obsoleting the secondary data. It can also be caused by early
-  // or late arrival of secondary data.
-  uint16_t currentSecondaryDiscardedRate;
-  // clock-drift in parts-per-million (negative or positive)
-  int32_t clockDriftPPM;
-  // average packet waiting time in the jitter buffer (ms)
-  int meanWaitingTimeMs;
-  // median packet waiting time in the jitter buffer (ms)
-  int medianWaitingTimeMs;
-  // min packet waiting time in the jitter buffer (ms)
-  int minWaitingTimeMs;
-  // max packet waiting time in the jitter buffer (ms)
-  int maxWaitingTimeMs;
-  // added samples in off mode due to packet loss
-  size_t addedSamples;
-};
-
-// Statistics for calls to AudioCodingModule::PlayoutData10Ms().
-struct AudioDecodingCallStats {
-  AudioDecodingCallStats()
-      : calls_to_silence_generator(0),
-        calls_to_neteq(0),
-        decoded_normal(0),
-        decoded_plc(0),
-        decoded_cng(0),
-        decoded_plc_cng(0),
-        decoded_muted_output(0) {}
-
-  int calls_to_silence_generator;  // Number of calls where silence generated,
-                                   // and NetEq was disengaged from decoding.
-  int calls_to_neteq;              // Number of calls to NetEq.
-  int decoded_normal;  // Number of calls where audio RTP packet decoded.
-  int decoded_plc;     // Number of calls resulted in PLC.
-  int decoded_cng;  // Number of calls where comfort noise generated due to DTX.
-  int decoded_plc_cng;  // Number of calls resulted where PLC faded to CNG.
-  int decoded_muted_output;  // Number of calls returning a muted state output.
-};
-
-// ==================================================================
-// Video specific types
-// ==================================================================
-
-// TODO(nisse): Delete, and switch to fourcc values everywhere?
-// Supported video types.
-enum class VideoType {
-  kUnknown,
-  kI420,
-  kIYUV,
-  kRGB24,
-  kABGR,
-  kARGB,
-  kARGB4444,
-  kRGB565,
-  kARGB1555,
-  kYUY2,
-  kYV12,
-  kUYVY,
-  kMJPEG,
-  kNV21,
-  kNV12,
-  kBGRA,
-};
-
-// Video codec
-enum { kPayloadNameSize = 32 };
-enum { kMaxSimulcastStreams = 4 };
-enum { kMaxSpatialLayers = 5 };
-enum { kMaxTemporalStreams = 4 };
-
-enum VideoCodecComplexity {
-  kComplexityNormal = 0,
-  kComplexityHigh = 1,
-  kComplexityHigher = 2,
-  kComplexityMax = 3
-};
-
-enum VP8ResilienceMode {
-  kResilienceOff,    // The stream produced by the encoder requires a
-                     // recovery frame (typically a key frame) to be
-                     // decodable after a packet loss.
-  kResilientStream,  // A stream produced by the encoder is resilient to
-                     // packet losses, but packets within a frame subsequent
-                     // to a loss can't be decoded.
-  kResilientFrames   // Same as kResilientStream but with added resilience
-                     // within a frame.
-};
-
-class TemporalLayersFactory;
-// VP8 specific
-struct VideoCodecVP8 {
-  // TODO(nisse): Unused, delete?
-  bool pictureLossIndicationOn;
-  VideoCodecComplexity complexity;
-  VP8ResilienceMode resilience;
-  unsigned char numberOfTemporalLayers;
-  bool denoisingOn;
-  bool errorConcealmentOn;
-  bool automaticResizeOn;
-  bool frameDroppingOn;
-  int keyFrameInterval;
-  TemporalLayersFactory* tl_factory;
-};
-
-// VP9 specific.
-struct VideoCodecVP9 {
-  VideoCodecComplexity complexity;
-  bool resilienceOn;
-  unsigned char numberOfTemporalLayers;
-  bool denoisingOn;
-  bool frameDroppingOn;
-  int keyFrameInterval;
-  bool adaptiveQpMode;
-  bool automaticResizeOn;
-  unsigned char numberOfSpatialLayers;
-  bool flexibleMode;
-};
-
-// TODO(magjed): Move this and other H264 related classes out to their own file.
-namespace H264 {
-
-enum Profile {
-  kProfileConstrainedBaseline,
-  kProfileBaseline,
-  kProfileMain,
-  kProfileConstrainedHigh,
-  kProfileHigh,
-};
-
-}  // namespace H264
-
-// H264 specific.
-struct VideoCodecH264 {
-  bool frameDroppingOn;
-  int keyFrameInterval;
-  // These are NULL/0 if not externally negotiated.
-  const uint8_t* spsData;
-  size_t spsLen;
-  const uint8_t* ppsData;
-  size_t ppsLen;
-  H264::Profile profile;
-};
-
-// Video codec types
-enum VideoCodecType {
-  kVideoCodecVP8,
-  kVideoCodecVP9,
-  kVideoCodecH264,
-  kVideoCodecI420,
-  kVideoCodecRED,
-  kVideoCodecULPFEC,
-  kVideoCodecFlexfec,
-  kVideoCodecGeneric,
-  kVideoCodecUnknown
-};
-
-// Translates from name of codec to codec type and vice versa.
-const char* CodecTypeToPayloadString(VideoCodecType type);
-VideoCodecType PayloadStringToCodecType(const std::string& name);
-
-union VideoCodecUnion {
-  VideoCodecVP8 VP8;
-  VideoCodecVP9 VP9;
-  VideoCodecH264 H264;
-};
-
-// Simulcast is when the same stream is encoded multiple times with different
-// settings such as resolution.
-struct SimulcastStream {
-  unsigned short width;
-  unsigned short height;
-  unsigned char numberOfTemporalLayers;
-  unsigned int maxBitrate;     // kilobits/sec.
-  unsigned int targetBitrate;  // kilobits/sec.
-  unsigned int minBitrate;     // kilobits/sec.
-  unsigned int qpMax;          // minimum quality
-};
-
-struct SpatialLayer {
-  int scaling_factor_num;
-  int scaling_factor_den;
-  int target_bitrate_bps;
-  // TODO(ivica): Add max_quantizer and min_quantizer?
-};
-
-enum VideoCodecMode { kRealtimeVideo, kScreensharing };
-
-// Common video codec properties
-class VideoCodec {
- public:
-  VideoCodec();
-
-  // Public variables. TODO(hta): Make them private with accessors.
-  VideoCodecType codecType;
-  char plName[kPayloadNameSize];
-  unsigned char plType;
-
-  unsigned short width;
-  unsigned short height;
-
-  unsigned int startBitrate;   // kilobits/sec.
-  unsigned int maxBitrate;     // kilobits/sec.
-  unsigned int minBitrate;     // kilobits/sec.
-  unsigned int targetBitrate;  // kilobits/sec.
-
-  uint32_t maxFramerate;
-
-  unsigned int qpMax;
-  unsigned char numberOfSimulcastStreams;
-  SimulcastStream simulcastStream[kMaxSimulcastStreams];
-  SpatialLayer spatialLayers[kMaxSpatialLayers];
-
-  VideoCodecMode mode;
-  bool expect_encode_from_texture;
-
-  // Timing frames configuration. There is delay of delay_ms between two
-  // consequent timing frames, excluding outliers. Frame is always made a
-  // timing frame if it's at least outlier_ratio in percent of "ideal" average
-  // frame given bitrate and framerate, i.e. if it's bigger than
-  // |outlier_ratio / 100.0 * bitrate_bps / fps| in bits. This way, timing
-  // frames will not be sent too often usually. Yet large frames will always
-  // have timing information for debug purposes because they are more likely to
-  // cause extra delays.
-  struct TimingFrameTriggerThresholds {
-    int64_t delay_ms;
-    uint16_t outlier_ratio_percent;
-  } timing_frame_thresholds;
-
-  bool operator==(const VideoCodec& other) const = delete;
-  bool operator!=(const VideoCodec& other) const = delete;
-
-  // Accessors for codec specific information.
-  // There is a const version of each that returns a reference,
-  // and a non-const version that returns a pointer, in order
-  // to allow modification of the parameters.
-  VideoCodecVP8* VP8();
-  const VideoCodecVP8& VP8() const;
-  VideoCodecVP9* VP9();
-  const VideoCodecVP9& VP9() const;
-  VideoCodecH264* H264();
-  const VideoCodecH264& H264() const;
-
- private:
-  // TODO(hta): Consider replacing the union with a pointer type.
-  // This will allow removing the VideoCodec* types from this file.
-  VideoCodecUnion codec_specific_;
-};
-
-class BitrateAllocation {
- public:
-  static const uint32_t kMaxBitrateBps;
-  BitrateAllocation();
-
-  bool SetBitrate(size_t spatial_index,
-                  size_t temporal_index,
-                  uint32_t bitrate_bps);
-
-  uint32_t GetBitrate(size_t spatial_index, size_t temporal_index) const;
-
-  // Get the sum of all the temporal layer for a specific spatial layer.
-  uint32_t GetSpatialLayerSum(size_t spatial_index) const;
-
-  uint32_t get_sum_bps() const { return sum_; }  // Sum of all bitrates.
-  uint32_t get_sum_kbps() const { return (sum_ + 500) / 1000; }
-
-  inline bool operator==(const BitrateAllocation& other) const {
-    return memcmp(bitrates_, other.bitrates_, sizeof(bitrates_)) == 0;
-  }
-  inline bool operator!=(const BitrateAllocation& other) const {
-    return !(*this == other);
-  }
-
-  // Expensive, please use only in tests.
-  std::string ToString() const;
-  std::ostream& operator<<(std::ostream& os) const;
-
- private:
-  uint32_t sum_;
-  uint32_t bitrates_[kMaxSpatialLayers][kMaxTemporalStreams];
-};
-
-// Bandwidth over-use detector options.  These are used to drive
-// experimentation with bandwidth estimation parameters.
-// See modules/remote_bitrate_estimator/overuse_detector.h
-// TODO(terelius): This is only used in overuse_estimator.cc, and only in the
-// default constructed state. Can we move the relevant variables into that
-// class and delete this? See also disabled warning at line 27
-struct OverUseDetectorOptions {
-  OverUseDetectorOptions()
-      : initial_slope(8.0 / 512.0),
-        initial_offset(0),
-        initial_e(),
-        initial_process_noise(),
-        initial_avg_noise(0.0),
-        initial_var_noise(50) {
-    initial_e[0][0] = 100;
-    initial_e[1][1] = 1e-1;
-    initial_e[0][1] = initial_e[1][0] = 0;
-    initial_process_noise[0] = 1e-13;
-    initial_process_noise[1] = 1e-3;
-  }
-  double initial_slope;
-  double initial_offset;
-  double initial_e[2][2];
-  double initial_process_noise[2];
-  double initial_avg_noise;
-  double initial_var_noise;
-};
-
-// This structure will have the information about when packet is actually
-// received by socket.
-struct PacketTime {
-  PacketTime() : timestamp(-1), not_before(-1) {}
-  PacketTime(int64_t timestamp, int64_t not_before)
-      : timestamp(timestamp), not_before(not_before) {}
-
-  int64_t timestamp;   // Receive time after socket delivers the data.
-  int64_t not_before;  // Earliest possible time the data could have arrived,
-                       // indicating the potential error in the |timestamp|
-                       // value,in case the system is busy.
-                       // For example, the time of the last select() call.
-                       // If unknown, this value will be set to zero.
-};
-
-// Minimum and maximum playout delay values from capture to render.
-// These are best effort values.
-//
-// A value < 0 indicates no change from previous valid value.
-//
-// min = max = 0 indicates that the receiver should try and render
-// frame as soon as possible.
-//
-// min = x, max = y indicates that the receiver is free to adapt
-// in the range (x, y) based on network jitter.
-//
-// Note: Given that this gets embedded in a union, it is up-to the owner to
-// initialize these values.
-struct PlayoutDelay {
-  int min_ms;
-  int max_ms;
-};
-
-// Class to represent the value of RTP header extensions that are
-// variable-length strings (e.g., RtpStreamId and RtpMid).
-// Unlike std::string, it can be copied with memcpy and cleared with memset.
-//
-// Empty value represents unset header extension (use empty() to query).
-class StringRtpHeaderExtension {
- public:
-  // String RTP header extensions are limited to 16 bytes because it is the
-  // maximum length that can be encoded with one-byte header extensions.
-  static constexpr size_t kMaxSize = 16;
-
-  static bool IsLegalName(rtc::ArrayView<const char> name);
-
-  StringRtpHeaderExtension() { value_[0] = 0; }
-  explicit StringRtpHeaderExtension(rtc::ArrayView<const char> value) {
-    Set(value.data(), value.size());
-  }
-  StringRtpHeaderExtension(const StringRtpHeaderExtension&) = default;
-  StringRtpHeaderExtension& operator=(const StringRtpHeaderExtension&) =
-      default;
-
-  bool empty() const { return value_[0] == 0; }
-  const char* data() const { return value_; }
-  size_t size() const { return strnlen(value_, kMaxSize); }
-
-  void Set(rtc::ArrayView<const uint8_t> value) {
-    Set(reinterpret_cast<const char*>(value.data()), value.size());
-  }
-  void Set(const char* data, size_t size);
-
-  friend bool operator==(const StringRtpHeaderExtension& lhs,
-                         const StringRtpHeaderExtension& rhs) {
-    return strncmp(lhs.value_, rhs.value_, kMaxSize) == 0;
-  }
-  friend bool operator!=(const StringRtpHeaderExtension& lhs,
-                         const StringRtpHeaderExtension& rhs) {
-    return !(lhs == rhs);
-  }
-
- private:
-  char value_[kMaxSize];
-};
-
-// StreamId represents RtpStreamId which is a string.
-typedef StringRtpHeaderExtension StreamId;
-
-// Mid represents RtpMid which is a string.
-typedef StringRtpHeaderExtension Mid;
-
-struct RTPHeaderExtension {
-  RTPHeaderExtension();
-  RTPHeaderExtension(const RTPHeaderExtension& other);
-  RTPHeaderExtension& operator=(const RTPHeaderExtension& other);
-
-  bool hasTransmissionTimeOffset;
-  int32_t transmissionTimeOffset;
-  bool hasAbsoluteSendTime;
-  uint32_t absoluteSendTime;
-  bool hasTransportSequenceNumber;
-  uint16_t transportSequenceNumber;
-
-  // Audio Level includes both level in dBov and voiced/unvoiced bit. See:
-  // https://datatracker.ietf.org/doc/draft-lennox-avt-rtp-audio-level-exthdr/
-  bool hasAudioLevel;
-  bool voiceActivity;
-  uint8_t audioLevel;
-
-  // For Coordination of Video Orientation. See
-  // http://www.etsi.org/deliver/etsi_ts/126100_126199/126114/12.07.00_60/
-  // ts_126114v120700p.pdf
-  bool hasVideoRotation;
-  VideoRotation videoRotation;
-
-  // TODO(ilnik): Refactor this and one above to be rtc::Optional() and remove
-  // a corresponding bool flag.
-  bool hasVideoContentType;
-  VideoContentType videoContentType;
-
-  bool has_video_timing;
-  VideoSendTiming video_timing;
-
-  PlayoutDelay playout_delay = {-1, -1};
-
-  // For identification of a stream when ssrc is not signaled. See
-  // https://tools.ietf.org/html/draft-ietf-avtext-rid-09
-  // TODO(danilchap): Update url from draft to release version.
-  StreamId stream_id;
-  StreamId repaired_stream_id;
-
-  // For identifying the media section used to interpret this RTP packet. See
-  // https://tools.ietf.org/html/draft-ietf-mmusic-sdp-bundle-negotiation-38
-  Mid mid;
-};
-
-struct RTPHeader {
-  RTPHeader();
-  RTPHeader(const RTPHeader& other);
-  RTPHeader& operator=(const RTPHeader& other);
-
-  bool markerBit;
-  uint8_t payloadType;
-  uint16_t sequenceNumber;
-  uint32_t timestamp;
-  uint32_t ssrc;
-  uint8_t numCSRCs;
-  uint32_t arrOfCSRCs[kRtpCsrcSize];
-  size_t paddingLength;
-  size_t headerLength;
-  int payload_type_frequency;
-  RTPHeaderExtension extension;
-};
-
-struct RtpPacketCounter {
-  RtpPacketCounter()
-      : header_bytes(0), payload_bytes(0), padding_bytes(0), packets(0) {}
-
-  void Add(const RtpPacketCounter& other) {
-    header_bytes += other.header_bytes;
-    payload_bytes += other.payload_bytes;
-    padding_bytes += other.padding_bytes;
-    packets += other.packets;
-  }
-
-  void Subtract(const RtpPacketCounter& other) {
-    RTC_DCHECK_GE(header_bytes, other.header_bytes);
-    header_bytes -= other.header_bytes;
-    RTC_DCHECK_GE(payload_bytes, other.payload_bytes);
-    payload_bytes -= other.payload_bytes;
-    RTC_DCHECK_GE(padding_bytes, other.padding_bytes);
-    padding_bytes -= other.padding_bytes;
-    RTC_DCHECK_GE(packets, other.packets);
-    packets -= other.packets;
-  }
-
-  void AddPacket(size_t packet_length, const RTPHeader& header) {
-    ++packets;
-    header_bytes += header.headerLength;
-    padding_bytes += header.paddingLength;
-    payload_bytes +=
-        packet_length - (header.headerLength + header.paddingLength);
-  }
-
-  size_t TotalBytes() const {
-    return header_bytes + payload_bytes + padding_bytes;
-  }
-
-  size_t header_bytes;   // Number of bytes used by RTP headers.
-  size_t payload_bytes;  // Payload bytes, excluding RTP headers and padding.
-  size_t padding_bytes;  // Number of padding bytes.
-  uint32_t packets;      // Number of packets.
-};
-
-// Data usage statistics for a (rtp) stream.
-struct StreamDataCounters {
-  StreamDataCounters();
-
-  void Add(const StreamDataCounters& other) {
-    transmitted.Add(other.transmitted);
-    retransmitted.Add(other.retransmitted);
-    fec.Add(other.fec);
-    if (other.first_packet_time_ms != -1 &&
-        (other.first_packet_time_ms < first_packet_time_ms ||
-         first_packet_time_ms == -1)) {
-      // Use oldest time.
-      first_packet_time_ms = other.first_packet_time_ms;
-    }
-  }
-
-  void Subtract(const StreamDataCounters& other) {
-    transmitted.Subtract(other.transmitted);
-    retransmitted.Subtract(other.retransmitted);
-    fec.Subtract(other.fec);
-    if (other.first_packet_time_ms != -1 &&
-        (other.first_packet_time_ms > first_packet_time_ms ||
-         first_packet_time_ms == -1)) {
-      // Use youngest time.
-      first_packet_time_ms = other.first_packet_time_ms;
-    }
-  }
-
-  int64_t TimeSinceFirstPacketInMs(int64_t now_ms) const {
-    return (first_packet_time_ms == -1) ? -1 : (now_ms - first_packet_time_ms);
-  }
-
-  // Returns the number of bytes corresponding to the actual media payload (i.e.
-  // RTP headers, padding, retransmissions and fec packets are excluded).
-  // Note this function does not have meaning for an RTX stream.
-  size_t MediaPayloadBytes() const {
-    return transmitted.payload_bytes - retransmitted.payload_bytes -
-           fec.payload_bytes;
-  }
-
-  int64_t first_packet_time_ms;    // Time when first packet is sent/received.
-  RtpPacketCounter transmitted;    // Number of transmitted packets/bytes.
-  RtpPacketCounter retransmitted;  // Number of retransmitted packets/bytes.
-  RtpPacketCounter fec;            // Number of redundancy packets/bytes.
-};
-
-// Callback, called whenever byte/packet counts have been updated.
-class StreamDataCountersCallback {
- public:
-  virtual ~StreamDataCountersCallback() {}
-
-  virtual void DataCountersUpdated(const StreamDataCounters& counters,
-                                   uint32_t ssrc) = 0;
-};
-
-// RTCP mode to use. Compound mode is described by RFC 4585 and reduced-size
-// RTCP mode is described by RFC 5506.
-enum class RtcpMode { kOff, kCompound, kReducedSize };
-
-enum NetworkState {
-  kNetworkUp,
-  kNetworkDown,
-};
-
-struct RtpKeepAliveConfig final {
-  // If no packet has been sent for |timeout_interval_ms|, send a keep-alive
-  // packet. The keep-alive packet is an empty (no payload) RTP packet with a
-  // payload type of 20 as long as the other end has not negotiated the use of
-  // this value. If this value has already been negotiated, then some other
-  // unused static payload type from table 5 of RFC 3551 shall be used and set
-  // in |payload_type|.
-  int64_t timeout_interval_ms = -1;
-  uint8_t payload_type = 20;
-
-  bool operator==(const RtpKeepAliveConfig& o) const {
-    return timeout_interval_ms == o.timeout_interval_ms &&
-           payload_type == o.payload_type;
-  }
-  bool operator!=(const RtpKeepAliveConfig& o) const { return !(*this == o); }
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_COMMON_TYPES_H_
diff --git a/common_video/BUILD.gn b/common_video/BUILD.gn
deleted file mode 100644
index f0e262f..0000000
--- a/common_video/BUILD.gn
+++ /dev/null
@@ -1,138 +0,0 @@
-# Copyright (c) 2014 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.
-
-import("../webrtc.gni")
-
-config("common_video_config") {
-  include_dirs = [
-    "include",
-    "libyuv/include",
-  ]
-}
-
-rtc_static_library("common_video") {
-  sources = [
-    "bitrate_adjuster.cc",
-    "h264/h264_bitstream_parser.cc",
-    "h264/h264_bitstream_parser.h",
-    "h264/h264_common.cc",
-    "h264/h264_common.h",
-    "h264/pps_parser.cc",
-    "h264/pps_parser.h",
-    "h264/profile_level_id.h",
-    "h264/sps_parser.cc",
-    "h264/sps_parser.h",
-    "h264/sps_vui_rewriter.cc",
-    "h264/sps_vui_rewriter.h",
-    "i420_buffer_pool.cc",
-    "include/bitrate_adjuster.h",
-    "include/frame_callback.h",
-    "include/i420_buffer_pool.h",
-    "include/incoming_video_stream.h",
-    "include/video_bitrate_allocator.h",
-    "include/video_frame.h",
-    "include/video_frame_buffer.h",
-    "incoming_video_stream.cc",
-    "libyuv/include/webrtc_libyuv.h",
-    "libyuv/webrtc_libyuv.cc",
-    "video_frame.cc",
-    "video_frame_buffer.cc",
-    "video_render_frames.cc",
-    "video_render_frames.h",
-  ]
-
-  include_dirs = [ "../modules/interface" ]
-
-  public_configs = [ ":common_video_config" ]
-
-  if (!build_with_chromium && is_clang) {
-    # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-    suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-  }
-
-  deps = [
-    "..:webrtc_common",
-    "../api:optional",
-    "../media:rtc_h264_profile_id",
-    "../modules:module_api",
-    "../rtc_base:rtc_base",
-    "../rtc_base:rtc_task_queue",
-    "../system_wrappers",
-  ]
-  public_deps = [
-    "../api:video_frame_api",
-  ]
-
-  if (rtc_build_libyuv) {
-    deps += [ "$rtc_libyuv_dir" ]
-    public_deps += [ "$rtc_libyuv_dir" ]
-  } else {
-    # Need to add a directory normally exported by libyuv.
-    include_dirs += [ "$rtc_libyuv_dir/include" ]
-  }
-}
-
-if (rtc_include_tests) {
-  common_video_resources = [ "../../resources/foreman_cif.yuv" ]
-
-  if (is_ios) {
-    bundle_data("common_video_unittests_bundle_data") {
-      testonly = true
-      sources = common_video_resources
-      outputs = [
-        "{{bundle_resources_dir}}/{{source_file_part}}",
-      ]
-    }
-  }
-
-  rtc_test("common_video_unittests") {
-    testonly = true
-
-    sources = [
-      "bitrate_adjuster_unittest.cc",
-      "h264/h264_bitstream_parser_unittest.cc",
-      "h264/pps_parser_unittest.cc",
-      "h264/profile_level_id_unittest.cc",
-      "h264/sps_parser_unittest.cc",
-      "h264/sps_vui_rewriter_unittest.cc",
-      "i420_buffer_pool_unittest.cc",
-      "i420_video_frame_unittest.cc",
-      "libyuv/libyuv_unittest.cc",
-    ]
-
-    # TODO(jschuh): Bug 1348: fix this warning.
-    configs += [ "//build/config/compiler:no_size_t_to_int_warning" ]
-
-    if (!build_with_chromium && is_clang) {
-      # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-    }
-
-    deps = [
-      ":common_video",
-      "../modules/video_capture:video_capture",
-      "../rtc_base:rtc_base",
-      "../rtc_base:rtc_base_approved",
-      "../system_wrappers:system_wrappers",
-      "../test:test_main",
-      "../test:video_test_common",
-      "//testing/gmock",
-      "//testing/gtest",
-    ]
-
-    data = common_video_resources
-    if (is_android) {
-      deps += [ "//testing/android/native_test:native_test_support" ]
-      shard_timeout = 900
-    }
-
-    if (is_ios) {
-      deps += [ ":common_video_unittests_bundle_data" ]
-    }
-  }
-}
diff --git a/common_video/DEPS b/common_video/DEPS
deleted file mode 100644
index 0044419..0000000
--- a/common_video/DEPS
+++ /dev/null
@@ -1,6 +0,0 @@
-include_rules = [
-  "+webrtc/media/base",
-  "+webrtc/system_wrappers",
-  # TODO(magjed): This is temporary, remove once external clients are updated.
-  "+webrtc/sdk/objc",
-]
diff --git a/common_video/OWNERS b/common_video/OWNERS
deleted file mode 100644
index fb914ab..0000000
--- a/common_video/OWNERS
+++ /dev/null
@@ -1,9 +0,0 @@
-magjed@webrtc.org
-marpan@webrtc.org
-pbos@webrtc.org
-stefan@webrtc.org
-
-# These are for the common case of adding or renaming files. If you're doing
-# structural changes, please get a review from a reviewer in this file.
-per-file *.gn=*
-per-file *.gni=*
diff --git a/common_video/bitrate_adjuster.cc b/common_video/bitrate_adjuster.cc
deleted file mode 100644
index 7f58ec9..0000000
--- a/common_video/bitrate_adjuster.cc
+++ /dev/null
@@ -1,162 +0,0 @@
-/*
- *  Copyright 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/common_video/include/bitrate_adjuster.h"
-
-#include <algorithm>
-#include <cmath>
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/system_wrappers/include/clock.h"
-
-namespace webrtc {
-
-// Update bitrate at most once every second.
-const uint32_t BitrateAdjuster::kBitrateUpdateIntervalMs = 1000;
-
-// Update bitrate at most once every 30 frames.
-const uint32_t BitrateAdjuster::kBitrateUpdateFrameInterval = 30;
-
-// 10 percent of original.
-const float BitrateAdjuster::kBitrateTolerancePct = .1f;
-
-const float BitrateAdjuster::kBytesPerMsToBitsPerSecond = 8 * 1000;
-
-BitrateAdjuster::BitrateAdjuster(Clock* clock,
-                                 float min_adjusted_bitrate_pct,
-                                 float max_adjusted_bitrate_pct)
-    : clock_(clock),
-      min_adjusted_bitrate_pct_(min_adjusted_bitrate_pct),
-      max_adjusted_bitrate_pct_(max_adjusted_bitrate_pct),
-      bitrate_tracker_(1.5 * kBitrateUpdateIntervalMs,
-                       kBytesPerMsToBitsPerSecond) {
-  Reset();
-}
-
-void BitrateAdjuster::SetTargetBitrateBps(uint32_t bitrate_bps) {
-  rtc::CritScope cs(&crit_);
-  // If the change in target bitrate is large, update the adjusted bitrate
-  // immediately since it's likely we have gained or lost a sizeable amount of
-  // bandwidth and we'll want to respond quickly.
-  // If the change in target bitrate fits within the existing tolerance of
-  // encoder output, wait for the next adjustment time to preserve
-  // existing penalties and not forcibly reset the adjusted bitrate to target.
-  // However, if we received many small deltas within an update time
-  // window and one of them exceeds the tolerance when compared to the last
-  // target we updated against, treat it as a large change in target bitrate.
-  if (!IsWithinTolerance(bitrate_bps, target_bitrate_bps_) ||
-      !IsWithinTolerance(bitrate_bps, last_adjusted_target_bitrate_bps_)) {
-    adjusted_bitrate_bps_ = bitrate_bps;
-    last_adjusted_target_bitrate_bps_ = bitrate_bps;
-  }
-  target_bitrate_bps_ = bitrate_bps;
-}
-
-uint32_t BitrateAdjuster::GetTargetBitrateBps() const {
-  rtc::CritScope cs(&crit_);
-  return target_bitrate_bps_;
-}
-
-uint32_t BitrateAdjuster::GetAdjustedBitrateBps() const {
-  rtc::CritScope cs(&crit_);
-  return adjusted_bitrate_bps_;
-}
-
-rtc::Optional<uint32_t> BitrateAdjuster::GetEstimatedBitrateBps() {
-  rtc::CritScope cs(&crit_);
-  return bitrate_tracker_.Rate(clock_->TimeInMilliseconds());
-}
-
-void BitrateAdjuster::Update(size_t frame_size) {
-  rtc::CritScope cs(&crit_);
-  uint32_t current_time_ms = clock_->TimeInMilliseconds();
-  bitrate_tracker_.Update(frame_size, current_time_ms);
-  UpdateBitrate(current_time_ms);
-}
-
-bool BitrateAdjuster::IsWithinTolerance(uint32_t bitrate_bps,
-                                        uint32_t target_bitrate_bps) {
-  if (target_bitrate_bps == 0) {
-    return false;
-  }
-  float delta = std::abs(static_cast<float>(bitrate_bps) -
-                         static_cast<float>(target_bitrate_bps));
-  float delta_pct = delta / target_bitrate_bps;
-  return delta_pct < kBitrateTolerancePct;
-}
-
-uint32_t BitrateAdjuster::GetMinAdjustedBitrateBps() const {
-  return min_adjusted_bitrate_pct_ * target_bitrate_bps_;
-}
-
-uint32_t BitrateAdjuster::GetMaxAdjustedBitrateBps() const {
-  return max_adjusted_bitrate_pct_ * target_bitrate_bps_;
-}
-
-// Only safe to call this after Update calls have stopped
-void BitrateAdjuster::Reset() {
-  rtc::CritScope cs(&crit_);
-  target_bitrate_bps_ = 0;
-  adjusted_bitrate_bps_ = 0;
-  last_adjusted_target_bitrate_bps_ = 0;
-  last_bitrate_update_time_ms_ = 0;
-  frames_since_last_update_ = 0;
-  bitrate_tracker_.Reset();
-}
-
-void BitrateAdjuster::UpdateBitrate(uint32_t current_time_ms) {
-  uint32_t time_since_last_update_ms =
-      current_time_ms - last_bitrate_update_time_ms_;
-  // Don't attempt to update bitrate unless enough time and frames have passed.
-  ++frames_since_last_update_;
-  if (time_since_last_update_ms < kBitrateUpdateIntervalMs ||
-      frames_since_last_update_ < kBitrateUpdateFrameInterval) {
-    return;
-  }
-  float target_bitrate_bps = target_bitrate_bps_;
-  float estimated_bitrate_bps =
-      bitrate_tracker_.Rate(current_time_ms).value_or(target_bitrate_bps);
-  float error = target_bitrate_bps - estimated_bitrate_bps;
-
-  // Adjust if we've overshot by any amount or if we've undershot too much.
-  if (estimated_bitrate_bps > target_bitrate_bps ||
-      error > kBitrateTolerancePct * target_bitrate_bps) {
-    // Adjust the bitrate by a fraction of the error.
-    float adjustment = .5 * error;
-    float adjusted_bitrate_bps = target_bitrate_bps + adjustment;
-
-    // Clamp the adjustment.
-    float min_bitrate_bps = GetMinAdjustedBitrateBps();
-    float max_bitrate_bps = GetMaxAdjustedBitrateBps();
-    adjusted_bitrate_bps = std::max(adjusted_bitrate_bps, min_bitrate_bps);
-    adjusted_bitrate_bps = std::min(adjusted_bitrate_bps, max_bitrate_bps);
-
-    // Set the adjustment if it's not already set.
-    float last_adjusted_bitrate_bps = adjusted_bitrate_bps_;
-    if (adjusted_bitrate_bps != last_adjusted_bitrate_bps) {
-      LOG(LS_VERBOSE) << "Adjusting encoder bitrate:"
-                      << "\n  target_bitrate:"
-                      << static_cast<uint32_t>(target_bitrate_bps)
-                      << "\n  estimated_bitrate:"
-                      << static_cast<uint32_t>(estimated_bitrate_bps)
-                      << "\n  last_adjusted_bitrate:"
-                      << static_cast<uint32_t>(last_adjusted_bitrate_bps)
-                      << "\n  adjusted_bitrate:"
-                      << static_cast<uint32_t>(adjusted_bitrate_bps);
-      adjusted_bitrate_bps_ = adjusted_bitrate_bps;
-    }
-  }
-  last_bitrate_update_time_ms_ = current_time_ms;
-  frames_since_last_update_ = 0;
-  last_adjusted_target_bitrate_bps_ = target_bitrate_bps_;
-}
-
-}  // namespace webrtc
diff --git a/common_video/bitrate_adjuster_unittest.cc b/common_video/bitrate_adjuster_unittest.cc
deleted file mode 100644
index b6152ac..0000000
--- a/common_video/bitrate_adjuster_unittest.cc
+++ /dev/null
@@ -1,168 +0,0 @@
-/*
- *  Copyright 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/common_video/include/bitrate_adjuster.h"
-#include "webrtc/system_wrappers/include/clock.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-class BitrateAdjusterTest : public ::testing::Test {
- public:
-  BitrateAdjusterTest()
-      : clock_(0),
-        adjuster_(&clock_, kMinAdjustedBitratePct, kMaxAdjustedBitratePct) {}
-
-  // Simulate an output bitrate for one update cycle of BitrateAdjuster.
-  void SimulateBitrateBps(uint32_t bitrate_bps) {
-    const uint32_t update_interval_ms =
-        BitrateAdjuster::kBitrateUpdateIntervalMs;
-    const uint32_t update_frame_interval =
-        BitrateAdjuster::kBitrateUpdateFrameInterval;
-    // Round up frame interval so we get one cycle passes.
-    const uint32_t frame_interval_ms =
-        (update_interval_ms + update_frame_interval - 1) /
-        update_frame_interval;
-    const size_t frame_size_bytes =
-        (bitrate_bps * frame_interval_ms) / (8 * 1000);
-    for (size_t i = 0; i < update_frame_interval; ++i) {
-      clock_.AdvanceTimeMilliseconds(frame_interval_ms);
-      adjuster_.Update(frame_size_bytes);
-    }
-  }
-
-  uint32_t GetTargetBitrateBpsPct(float pct) {
-    return pct * adjuster_.GetTargetBitrateBps();
-  }
-
-  void VerifyAdjustment() {
-    // The adjusted bitrate should be between the estimated bitrate and the
-    // target bitrate within clamp.
-    uint32_t target_bitrate_bps = adjuster_.GetTargetBitrateBps();
-    uint32_t adjusted_bitrate_bps = adjuster_.GetAdjustedBitrateBps();
-    uint32_t estimated_bitrate_bps =
-        adjuster_.GetEstimatedBitrateBps().value_or(target_bitrate_bps);
-    uint32_t adjusted_lower_bound_bps =
-        GetTargetBitrateBpsPct(kMinAdjustedBitratePct);
-    uint32_t adjusted_upper_bound_bps =
-        GetTargetBitrateBpsPct(kMaxAdjustedBitratePct);
-    EXPECT_LE(adjusted_bitrate_bps, adjusted_upper_bound_bps);
-    EXPECT_GE(adjusted_bitrate_bps, adjusted_lower_bound_bps);
-    if (estimated_bitrate_bps > target_bitrate_bps) {
-      EXPECT_LT(adjusted_bitrate_bps, target_bitrate_bps);
-    }
-  }
-
- protected:
-  static const float kMinAdjustedBitratePct;
-  static const float kMaxAdjustedBitratePct;
-  SimulatedClock clock_;
-  BitrateAdjuster adjuster_;
-};
-
-const float BitrateAdjusterTest::kMinAdjustedBitratePct = .5f;
-const float BitrateAdjusterTest::kMaxAdjustedBitratePct = .95f;
-
-TEST_F(BitrateAdjusterTest, VaryingBitrates) {
-  const uint32_t target_bitrate_bps = 640000;
-  adjuster_.SetTargetBitrateBps(target_bitrate_bps);
-
-  // Grossly overshoot for a little while. Adjusted bitrate should decrease.
-  uint32_t actual_bitrate_bps = 2 * target_bitrate_bps;
-  uint32_t last_adjusted_bitrate_bps = 0;
-  uint32_t adjusted_bitrate_bps = 0;
-
-  SimulateBitrateBps(actual_bitrate_bps);
-  VerifyAdjustment();
-  last_adjusted_bitrate_bps = adjuster_.GetAdjustedBitrateBps();
-
-  SimulateBitrateBps(actual_bitrate_bps);
-  VerifyAdjustment();
-  adjusted_bitrate_bps = adjuster_.GetAdjustedBitrateBps();
-  EXPECT_LE(adjusted_bitrate_bps, last_adjusted_bitrate_bps);
-  last_adjusted_bitrate_bps = adjusted_bitrate_bps;
-  // After two cycles we should've stabilized and hit the lower bound.
-  EXPECT_EQ(GetTargetBitrateBpsPct(kMinAdjustedBitratePct),
-            adjusted_bitrate_bps);
-
-  // Simulate encoder settling down. Adjusted bitrate should increase.
-  SimulateBitrateBps(target_bitrate_bps);
-  adjusted_bitrate_bps = adjuster_.GetAdjustedBitrateBps();
-  VerifyAdjustment();
-  EXPECT_GT(adjusted_bitrate_bps, last_adjusted_bitrate_bps);
-  last_adjusted_bitrate_bps = adjusted_bitrate_bps;
-
-  SimulateBitrateBps(target_bitrate_bps);
-  adjusted_bitrate_bps = adjuster_.GetAdjustedBitrateBps();
-  VerifyAdjustment();
-  EXPECT_GT(adjusted_bitrate_bps, last_adjusted_bitrate_bps);
-  last_adjusted_bitrate_bps = adjusted_bitrate_bps;
-  // After two cycles we should've stabilized and hit the upper bound.
-  EXPECT_EQ(GetTargetBitrateBpsPct(kMaxAdjustedBitratePct),
-            adjusted_bitrate_bps);
-}
-
-// Tests that large changes in target bitrate will result in immediate change
-// in adjusted bitrate.
-TEST_F(BitrateAdjusterTest, LargeTargetDelta) {
-  uint32_t target_bitrate_bps = 640000;
-  adjuster_.SetTargetBitrateBps(target_bitrate_bps);
-  EXPECT_EQ(target_bitrate_bps, adjuster_.GetAdjustedBitrateBps());
-
-  float delta_pct = BitrateAdjuster::kBitrateTolerancePct * 2;
-
-  target_bitrate_bps = (1 + delta_pct) * target_bitrate_bps;
-  adjuster_.SetTargetBitrateBps(target_bitrate_bps);
-  EXPECT_EQ(target_bitrate_bps, adjuster_.GetAdjustedBitrateBps());
-
-  target_bitrate_bps = (1 - delta_pct) * target_bitrate_bps;
-  adjuster_.SetTargetBitrateBps(target_bitrate_bps);
-  EXPECT_EQ(target_bitrate_bps, adjuster_.GetAdjustedBitrateBps());
-}
-
-// Tests that small changes in target bitrate within tolerance will not affect
-// adjusted bitrate immediately.
-TEST_F(BitrateAdjusterTest, SmallTargetDelta) {
-  const uint32_t initial_target_bitrate_bps = 640000;
-  uint32_t target_bitrate_bps = initial_target_bitrate_bps;
-  adjuster_.SetTargetBitrateBps(target_bitrate_bps);
-  EXPECT_EQ(initial_target_bitrate_bps, adjuster_.GetAdjustedBitrateBps());
-
-  float delta_pct = BitrateAdjuster::kBitrateTolerancePct / 2;
-
-  target_bitrate_bps = (1 + delta_pct) * target_bitrate_bps;
-  adjuster_.SetTargetBitrateBps(target_bitrate_bps);
-  EXPECT_EQ(initial_target_bitrate_bps, adjuster_.GetAdjustedBitrateBps());
-
-  target_bitrate_bps = (1 - delta_pct) * target_bitrate_bps;
-  adjuster_.SetTargetBitrateBps(target_bitrate_bps);
-  EXPECT_EQ(initial_target_bitrate_bps, adjuster_.GetAdjustedBitrateBps());
-}
-
-TEST_F(BitrateAdjusterTest, SmallTargetDeltaOverflow) {
-  const uint32_t initial_target_bitrate_bps = 640000;
-  uint32_t target_bitrate_bps = initial_target_bitrate_bps;
-  adjuster_.SetTargetBitrateBps(target_bitrate_bps);
-  EXPECT_EQ(initial_target_bitrate_bps, adjuster_.GetAdjustedBitrateBps());
-
-  float delta_pct = BitrateAdjuster::kBitrateTolerancePct / 2;
-
-  target_bitrate_bps = (1 + delta_pct) * target_bitrate_bps;
-  adjuster_.SetTargetBitrateBps(target_bitrate_bps);
-  EXPECT_EQ(initial_target_bitrate_bps, adjuster_.GetAdjustedBitrateBps());
-
-  // 1.05 * 1.05 is 1.1 which is greater than tolerance for the initial target
-  // bitrate. Since we didn't advance the clock the adjuster never updated.
-  target_bitrate_bps = (1 + delta_pct) * target_bitrate_bps;
-  adjuster_.SetTargetBitrateBps(target_bitrate_bps);
-  EXPECT_EQ(target_bitrate_bps, adjuster_.GetAdjustedBitrateBps());
-}
-
-}  // namespace webrtc
diff --git a/common_video/h264/h264_bitstream_parser.cc b/common_video/h264/h264_bitstream_parser.cc
deleted file mode 100644
index 4661687..0000000
--- a/common_video/h264/h264_bitstream_parser.cc
+++ /dev/null
@@ -1,317 +0,0 @@
-/*
- *  Copyright (c) 2015 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/common_video/h264/h264_bitstream_parser.h"
-
-#include <memory>
-#include <vector>
-
-#include "webrtc/rtc_base/bitbuffer.h"
-#include "webrtc/rtc_base/checks.h"
-
-#include "webrtc/common_video/h264/h264_common.h"
-#include "webrtc/rtc_base/logging.h"
-
-namespace {
-const int kMaxAbsQpDeltaValue = 51;
-const int kMinQpValue = 0;
-const int kMaxQpValue = 51;
-}
-
-namespace webrtc {
-
-#define RETURN_ON_FAIL(x, res)        \
-  if (!(x)) {                         \
-    LOG_F(LS_ERROR) << "FAILED: " #x; \
-    return res;                       \
-  }
-
-#define RETURN_INV_ON_FAIL(x) RETURN_ON_FAIL(x, kInvalidStream)
-
-H264BitstreamParser::H264BitstreamParser() {}
-H264BitstreamParser::~H264BitstreamParser() {}
-
-H264BitstreamParser::Result H264BitstreamParser::ParseNonParameterSetNalu(
-    const uint8_t* source,
-    size_t source_length,
-    uint8_t nalu_type) {
-  if (!sps_ || !pps_)
-    return kInvalidStream;
-
-  last_slice_qp_delta_ = rtc::Optional<int32_t>();
-  const std::vector<uint8_t> slice_rbsp =
-      H264::ParseRbsp(source, source_length);
-  if (slice_rbsp.size() < H264::kNaluTypeSize)
-    return kInvalidStream;
-
-  rtc::BitBuffer slice_reader(slice_rbsp.data() + H264::kNaluTypeSize,
-                              slice_rbsp.size() - H264::kNaluTypeSize);
-  // Check to see if this is an IDR slice, which has an extra field to parse
-  // out.
-  bool is_idr = (source[0] & 0x0F) == H264::NaluType::kIdr;
-  uint8_t nal_ref_idc = (source[0] & 0x60) >> 5;
-  uint32_t golomb_tmp;
-  uint32_t bits_tmp;
-
-  // first_mb_in_slice: ue(v)
-  RETURN_INV_ON_FAIL(slice_reader.ReadExponentialGolomb(&golomb_tmp));
-  // slice_type: ue(v)
-  uint32_t slice_type;
-  RETURN_INV_ON_FAIL(slice_reader.ReadExponentialGolomb(&slice_type));
-  // slice_type's 5..9 range is used to indicate that all slices of a picture
-  // have the same value of slice_type % 5, we don't care about that, so we map
-  // to the corresponding 0..4 range.
-  slice_type %= 5;
-  // pic_parameter_set_id: ue(v)
-  RETURN_INV_ON_FAIL(slice_reader.ReadExponentialGolomb(&golomb_tmp));
-  if (sps_->separate_colour_plane_flag == 1) {
-    // colour_plane_id
-    RETURN_INV_ON_FAIL(slice_reader.ReadBits(&bits_tmp, 2));
-  }
-  // frame_num: u(v)
-  // Represented by log2_max_frame_num_minus4 + 4 bits.
-  RETURN_INV_ON_FAIL(
-      slice_reader.ReadBits(&bits_tmp, sps_->log2_max_frame_num_minus4 + 4));
-  uint32_t field_pic_flag = 0;
-  if (sps_->frame_mbs_only_flag == 0) {
-    // field_pic_flag: u(1)
-    RETURN_INV_ON_FAIL(slice_reader.ReadBits(&field_pic_flag, 1));
-    if (field_pic_flag != 0) {
-      // bottom_field_flag: u(1)
-      RETURN_INV_ON_FAIL(slice_reader.ReadBits(&bits_tmp, 1));
-    }
-  }
-  if (is_idr) {
-    // idr_pic_id: ue(v)
-    RETURN_INV_ON_FAIL(slice_reader.ReadExponentialGolomb(&golomb_tmp));
-  }
-  // pic_order_cnt_lsb: u(v)
-  // Represented by sps_.log2_max_pic_order_cnt_lsb_minus4 + 4 bits.
-  if (sps_->pic_order_cnt_type == 0) {
-    RETURN_INV_ON_FAIL(slice_reader.ReadBits(
-        &bits_tmp, sps_->log2_max_pic_order_cnt_lsb_minus4 + 4));
-    if (pps_->bottom_field_pic_order_in_frame_present_flag &&
-        field_pic_flag == 0) {
-      // delta_pic_order_cnt_bottom: se(v)
-      RETURN_INV_ON_FAIL(slice_reader.ReadExponentialGolomb(&golomb_tmp));
-    }
-  }
-  if (sps_->pic_order_cnt_type == 1 &&
-      !sps_->delta_pic_order_always_zero_flag) {
-    // delta_pic_order_cnt[0]: se(v)
-    RETURN_INV_ON_FAIL(slice_reader.ReadExponentialGolomb(&golomb_tmp));
-    if (pps_->bottom_field_pic_order_in_frame_present_flag && !field_pic_flag) {
-      // delta_pic_order_cnt[1]: se(v)
-      RETURN_INV_ON_FAIL(slice_reader.ReadExponentialGolomb(&golomb_tmp));
-    }
-  }
-  if (pps_->redundant_pic_cnt_present_flag) {
-    // redundant_pic_cnt: ue(v)
-    RETURN_INV_ON_FAIL(slice_reader.ReadExponentialGolomb(&golomb_tmp));
-  }
-  if (slice_type == H264::SliceType::kB) {
-    // direct_spatial_mv_pred_flag: u(1)
-    RETURN_INV_ON_FAIL(slice_reader.ReadBits(&bits_tmp, 1));
-  }
-  switch (slice_type) {
-    case H264::SliceType::kP:
-    case H264::SliceType::kB:
-    case H264::SliceType::kSp:
-      uint32_t num_ref_idx_active_override_flag;
-      // num_ref_idx_active_override_flag: u(1)
-      RETURN_INV_ON_FAIL(
-          slice_reader.ReadBits(&num_ref_idx_active_override_flag, 1));
-      if (num_ref_idx_active_override_flag != 0) {
-        // num_ref_idx_l0_active_minus1: ue(v)
-        RETURN_INV_ON_FAIL(slice_reader.ReadExponentialGolomb(&golomb_tmp));
-        if (slice_type == H264::SliceType::kB) {
-          // num_ref_idx_l1_active_minus1: ue(v)
-          RETURN_INV_ON_FAIL(slice_reader.ReadExponentialGolomb(&golomb_tmp));
-        }
-      }
-      break;
-    default:
-      break;
-  }
-  // assume nal_unit_type != 20 && nal_unit_type != 21:
-  if (nalu_type == 20 || nalu_type == 21) {
-    LOG(LS_ERROR) << "Unsupported nal unit type.";
-    return kUnsupportedStream;
-  }
-  // if (nal_unit_type == 20 || nal_unit_type == 21)
-  //   ref_pic_list_mvc_modification()
-  // else
-  {
-    // ref_pic_list_modification():
-    // |slice_type| checks here don't use named constants as they aren't named
-    // in the spec for this segment. Keeping them consistent makes it easier to
-    // verify that they are both the same.
-    if (slice_type % 5 != 2 && slice_type % 5 != 4) {
-      // ref_pic_list_modification_flag_l0: u(1)
-      uint32_t ref_pic_list_modification_flag_l0;
-      RETURN_INV_ON_FAIL(
-          slice_reader.ReadBits(&ref_pic_list_modification_flag_l0, 1));
-      if (ref_pic_list_modification_flag_l0) {
-        uint32_t modification_of_pic_nums_idc;
-        do {
-          // modification_of_pic_nums_idc: ue(v)
-          RETURN_INV_ON_FAIL(slice_reader.ReadExponentialGolomb(
-              &modification_of_pic_nums_idc));
-          if (modification_of_pic_nums_idc == 0 ||
-              modification_of_pic_nums_idc == 1) {
-            // abs_diff_pic_num_minus1: ue(v)
-            RETURN_INV_ON_FAIL(slice_reader.ReadExponentialGolomb(&golomb_tmp));
-          } else if (modification_of_pic_nums_idc == 2) {
-            // long_term_pic_num: ue(v)
-            RETURN_INV_ON_FAIL(slice_reader.ReadExponentialGolomb(&golomb_tmp));
-          }
-        } while (modification_of_pic_nums_idc != 3);
-      }
-    }
-    if (slice_type % 5 == 1) {
-      // ref_pic_list_modification_flag_l1: u(1)
-      uint32_t ref_pic_list_modification_flag_l1;
-      RETURN_INV_ON_FAIL(
-          slice_reader.ReadBits(&ref_pic_list_modification_flag_l1, 1));
-      if (ref_pic_list_modification_flag_l1) {
-        uint32_t modification_of_pic_nums_idc;
-        do {
-          // modification_of_pic_nums_idc: ue(v)
-          RETURN_INV_ON_FAIL(slice_reader.ReadExponentialGolomb(
-              &modification_of_pic_nums_idc));
-          if (modification_of_pic_nums_idc == 0 ||
-              modification_of_pic_nums_idc == 1) {
-            // abs_diff_pic_num_minus1: ue(v)
-            RETURN_INV_ON_FAIL(slice_reader.ReadExponentialGolomb(&golomb_tmp));
-          } else if (modification_of_pic_nums_idc == 2) {
-            // long_term_pic_num: ue(v)
-            RETURN_INV_ON_FAIL(slice_reader.ReadExponentialGolomb(&golomb_tmp));
-          }
-        } while (modification_of_pic_nums_idc != 3);
-      }
-    }
-  }
-  // TODO(pbos): Do we need support for pred_weight_table()?
-  if ((pps_->weighted_pred_flag && (slice_type == H264::SliceType::kP ||
-                                    slice_type == H264::SliceType::kSp)) ||
-      (pps_->weighted_bipred_idc == 1 && slice_type == H264::SliceType::kB)) {
-    LOG(LS_ERROR) << "Streams with pred_weight_table unsupported.";
-    return kUnsupportedStream;
-  }
-  // if ((weighted_pred_flag && (slice_type == P || slice_type == SP)) ||
-  //    (weighted_bipred_idc == 1 && slice_type == B)) {
-  //  pred_weight_table()
-  // }
-  if (nal_ref_idc != 0) {
-    // dec_ref_pic_marking():
-    if (is_idr) {
-      // no_output_of_prior_pics_flag: u(1)
-      // long_term_reference_flag: u(1)
-      RETURN_INV_ON_FAIL(slice_reader.ReadBits(&bits_tmp, 2));
-    } else {
-      // adaptive_ref_pic_marking_mode_flag: u(1)
-      uint32_t adaptive_ref_pic_marking_mode_flag;
-      RETURN_INV_ON_FAIL(
-          slice_reader.ReadBits(&adaptive_ref_pic_marking_mode_flag, 1));
-      if (adaptive_ref_pic_marking_mode_flag) {
-        uint32_t memory_management_control_operation;
-        do {
-          // memory_management_control_operation: ue(v)
-          RETURN_INV_ON_FAIL(slice_reader.ReadExponentialGolomb(
-              &memory_management_control_operation));
-          if (memory_management_control_operation == 1 ||
-              memory_management_control_operation == 3) {
-            // difference_of_pic_nums_minus1: ue(v)
-            RETURN_INV_ON_FAIL(slice_reader.ReadExponentialGolomb(&golomb_tmp));
-          }
-          if (memory_management_control_operation == 2) {
-            // long_term_pic_num: ue(v)
-            RETURN_INV_ON_FAIL(slice_reader.ReadExponentialGolomb(&golomb_tmp));
-          }
-          if (memory_management_control_operation == 3 ||
-              memory_management_control_operation == 6) {
-            // long_term_frame_idx: ue(v)
-            RETURN_INV_ON_FAIL(slice_reader.ReadExponentialGolomb(&golomb_tmp));
-          }
-          if (memory_management_control_operation == 4) {
-            // max_long_term_frame_idx_plus1: ue(v)
-            RETURN_INV_ON_FAIL(slice_reader.ReadExponentialGolomb(&golomb_tmp));
-          }
-        } while (memory_management_control_operation != 0);
-      }
-    }
-  }
-  if (pps_->entropy_coding_mode_flag &&
-      slice_type != H264::SliceType::kI && slice_type != H264::SliceType::kSi) {
-    // cabac_init_idc: ue(v)
-    RETURN_INV_ON_FAIL(slice_reader.ReadExponentialGolomb(&golomb_tmp));
-  }
-
-  int32_t last_slice_qp_delta;
-  RETURN_INV_ON_FAIL(
-      slice_reader.ReadSignedExponentialGolomb(&last_slice_qp_delta));
-  if (abs(last_slice_qp_delta) > kMaxAbsQpDeltaValue) {
-    // Something has gone wrong, and the parsed value is invalid.
-    LOG(LS_WARNING) << "Parsed QP value out of range.";
-    return kInvalidStream;
-  }
-
-  last_slice_qp_delta_ = rtc::Optional<int32_t>(last_slice_qp_delta);
-  return kOk;
-}
-
-void H264BitstreamParser::ParseSlice(const uint8_t* slice, size_t length) {
-  H264::NaluType nalu_type = H264::ParseNaluType(slice[0]);
-  switch (nalu_type) {
-    case H264::NaluType::kSps: {
-      sps_ = SpsParser::ParseSps(slice + H264::kNaluTypeSize,
-                                 length - H264::kNaluTypeSize);
-      if (!sps_)
-        LOG(LS_WARNING) << "Unable to parse SPS from H264 bitstream.";
-      break;
-    }
-    case H264::NaluType::kPps: {
-      pps_ = PpsParser::ParsePps(slice + H264::kNaluTypeSize,
-                                 length - H264::kNaluTypeSize);
-      if (!pps_)
-        LOG(LS_WARNING) << "Unable to parse PPS from H264 bitstream.";
-      break;
-    }
-    case H264::NaluType::kAud:
-    case H264::NaluType::kSei:
-      break;  // Ignore these nalus, as we don't care about their contents.
-    default:
-      Result res = ParseNonParameterSetNalu(slice, length, nalu_type);
-      if (res != kOk)
-        LOG(LS_INFO) << "Failed to parse bitstream. Error: " << res;
-      break;
-  }
-}
-
-void H264BitstreamParser::ParseBitstream(const uint8_t* bitstream,
-                                         size_t length) {
-  std::vector<H264::NaluIndex> nalu_indices =
-      H264::FindNaluIndices(bitstream, length);
-  for (const H264::NaluIndex& index : nalu_indices)
-    ParseSlice(&bitstream[index.payload_start_offset], index.payload_size);
-}
-
-bool H264BitstreamParser::GetLastSliceQp(int* qp) const {
-  if (!last_slice_qp_delta_ || !pps_)
-    return false;
-  const int parsed_qp = 26 + pps_->pic_init_qp_minus26 + *last_slice_qp_delta_;
-  if (parsed_qp < kMinQpValue || parsed_qp > kMaxQpValue) {
-    LOG(LS_ERROR) << "Parsed invalid QP from bitstream.";
-    return false;
-  }
-  *qp = parsed_qp;
-  return true;
-}
-
-}  // namespace webrtc
diff --git a/common_video/h264/h264_bitstream_parser.h b/common_video/h264/h264_bitstream_parser.h
deleted file mode 100644
index 145700f..0000000
--- a/common_video/h264/h264_bitstream_parser.h
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- *  Copyright (c) 2015 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_COMMON_VIDEO_H264_H264_BITSTREAM_PARSER_H_
-#define WEBRTC_COMMON_VIDEO_H264_H264_BITSTREAM_PARSER_H_
-#include <stddef.h>
-#include <stdint.h>
-
-#include "webrtc/api/optional.h"
-#include "webrtc/common_video/h264/pps_parser.h"
-#include "webrtc/common_video/h264/sps_parser.h"
-
-namespace rtc {
-class BitBufferWriter;
-}
-
-namespace webrtc {
-
-// Stateful H264 bitstream parser (due to SPS/PPS). Used to parse out QP values
-// from the bitstream.
-// TODO(pbos): Unify with RTP SPS parsing and only use one H264 parser.
-// TODO(pbos): If/when this gets used on the receiver side CHECKs must be
-// removed and gracefully abort as we have no control over receive-side
-// bitstreams.
-class H264BitstreamParser {
- public:
-  enum Result {
-    kOk,
-    kInvalidStream,
-    kUnsupportedStream,
-  };
-
-  H264BitstreamParser();
-  virtual ~H264BitstreamParser();
-
-  // Parse an additional chunk of H264 bitstream.
-  void ParseBitstream(const uint8_t* bitstream, size_t length);
-
-  // Get the last extracted QP value from the parsed bitstream.
-  bool GetLastSliceQp(int* qp) const;
-
- protected:
-  void ParseSlice(const uint8_t* slice, size_t length);
-  Result ParseNonParameterSetNalu(const uint8_t* source,
-                                  size_t source_length,
-                                  uint8_t nalu_type);
-
-  // SPS/PPS state, updated when parsing new SPS/PPS, used to parse slices.
-  rtc::Optional<SpsParser::SpsState> sps_;
-  rtc::Optional<PpsParser::PpsState> pps_;
-
-  // Last parsed slice QP.
-  rtc::Optional<int32_t> last_slice_qp_delta_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_COMMON_VIDEO_H264_H264_BITSTREAM_PARSER_H_
diff --git a/common_video/h264/h264_bitstream_parser_unittest.cc b/common_video/h264/h264_bitstream_parser_unittest.cc
deleted file mode 100644
index e2b5f4c..0000000
--- a/common_video/h264/h264_bitstream_parser_unittest.cc
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- *  Copyright (c) 2015 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/common_video/h264/h264_bitstream_parser.h"
-
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-// SPS/PPS part of below chunk.
-uint8_t kH264SpsPps[] = {0x00, 0x00, 0x00, 0x01, 0x67, 0x42, 0x80, 0x20, 0xda,
-                         0x01, 0x40, 0x16, 0xe8, 0x06, 0xd0, 0xa1, 0x35, 0x00,
-                         0x00, 0x00, 0x01, 0x68, 0xce, 0x06, 0xe2};
-
-// Contains enough of the image slice to contain slice QP.
-uint8_t kH264BitstreamChunk[] = {
-    0x00, 0x00, 0x00, 0x01, 0x67, 0x42, 0x80, 0x20, 0xda, 0x01, 0x40, 0x16,
-    0xe8, 0x06, 0xd0, 0xa1, 0x35, 0x00, 0x00, 0x00, 0x01, 0x68, 0xce, 0x06,
-    0xe2, 0x00, 0x00, 0x00, 0x01, 0x65, 0xb8, 0x40, 0xf0, 0x8c, 0x03, 0xf2,
-    0x75, 0x67, 0xad, 0x41, 0x64, 0x24, 0x0e, 0xa0, 0xb2, 0x12, 0x1e, 0xf8,
-};
-
-uint8_t kH264BitstreamChunkCabac[] = {
-  0x00, 0x00, 0x00, 0x01, 0x27, 0x64, 0x00, 0x0d, 0xac, 0x52, 0x30, 0x50,
-  0x7e, 0xc0, 0x5a, 0x81, 0x01, 0x01, 0x18, 0x56, 0xbd, 0xef, 0x80, 0x80,
-  0x00, 0x00, 0x00, 0x01, 0x28, 0xfe, 0x09, 0x8b,
-};
-
-// Contains enough of the image slice to contain slice QP.
-uint8_t kH264BitstreamNextImageSliceChunk[] = {
-    0x00, 0x00, 0x00, 0x01, 0x41, 0xe2, 0x01, 0x16, 0x0e, 0x3e, 0x2b, 0x86,
-};
-
-// Contains enough of the image slice to contain slice QP.
-uint8_t kH264BitstreamNextImageSliceChunkCabac[] = {
-  0x00, 0x00, 0x00, 0x01, 0x21, 0xe1, 0x05, 0x11, 0x3f, 0x9a, 0xae, 0x46,
-  0x70, 0xbf, 0xc1, 0x4a, 0x16, 0x8f, 0x51, 0xf4, 0xca, 0xfb, 0xa3, 0x65,
-};
-
-TEST(H264BitstreamParserTest, ReportsNoQpWithoutParsedSlices) {
-  H264BitstreamParser h264_parser;
-  int qp;
-  EXPECT_FALSE(h264_parser.GetLastSliceQp(&qp));
-}
-
-TEST(H264BitstreamParserTest, ReportsNoQpWithOnlyParsedPpsAndSpsSlices) {
-  H264BitstreamParser h264_parser;
-  h264_parser.ParseBitstream(kH264SpsPps, sizeof(kH264SpsPps));
-  int qp;
-  EXPECT_FALSE(h264_parser.GetLastSliceQp(&qp));
-}
-
-TEST(H264BitstreamParserTest, ReportsLastSliceQpForImageSlices) {
-  H264BitstreamParser h264_parser;
-  h264_parser.ParseBitstream(kH264BitstreamChunk, sizeof(kH264BitstreamChunk));
-  int qp;
-  ASSERT_TRUE(h264_parser.GetLastSliceQp(&qp));
-  EXPECT_EQ(35, qp);
-
-  // Parse an additional image slice.
-  h264_parser.ParseBitstream(kH264BitstreamNextImageSliceChunk,
-                             sizeof(kH264BitstreamNextImageSliceChunk));
-  ASSERT_TRUE(h264_parser.GetLastSliceQp(&qp));
-  EXPECT_EQ(37, qp);
-}
-
-TEST(H264BitstreamParserTest, ReportsLastSliceQpForCABACImageSlices) {
-  H264BitstreamParser h264_parser;
-  h264_parser.ParseBitstream(kH264BitstreamChunkCabac,
-                             sizeof(kH264BitstreamChunkCabac));
-  int qp;
-  EXPECT_FALSE(h264_parser.GetLastSliceQp(&qp));
-
-  // Parse an additional image slice.
-  h264_parser.ParseBitstream(kH264BitstreamNextImageSliceChunkCabac,
-                             sizeof(kH264BitstreamNextImageSliceChunkCabac));
-  ASSERT_TRUE(h264_parser.GetLastSliceQp(&qp));
-  EXPECT_EQ(24, qp);
-}
-
-}  // namespace webrtc
diff --git a/common_video/h264/h264_common.cc b/common_video/h264/h264_common.cc
deleted file mode 100644
index b9e7d67..0000000
--- a/common_video/h264/h264_common.cc
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- *  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/common_video/h264/h264_common.h"
-
-namespace webrtc {
-namespace H264 {
-
-const uint8_t kNaluTypeMask = 0x1F;
-
-std::vector<NaluIndex> FindNaluIndices(const uint8_t* buffer,
-                                       size_t buffer_size) {
-  // This is sorta like Boyer-Moore, but with only the first optimization step:
-  // given a 3-byte sequence we're looking at, if the 3rd byte isn't 1 or 0,
-  // skip ahead to the next 3-byte sequence. 0s and 1s are relatively rare, so
-  // this will skip the majority of reads/checks.
-  std::vector<NaluIndex> sequences;
-  if (buffer_size < kNaluShortStartSequenceSize)
-    return sequences;
-
-  const size_t end = buffer_size - kNaluShortStartSequenceSize;
-  for (size_t i = 0; i < end;) {
-    if (buffer[i + 2] > 1) {
-      i += 3;
-    } else if (buffer[i + 2] == 1 && buffer[i + 1] == 0 && buffer[i] == 0) {
-      // We found a start sequence, now check if it was a 3 of 4 byte one.
-      NaluIndex index = {i, i + 3, 0};
-      if (index.start_offset > 0 && buffer[index.start_offset - 1] == 0)
-        --index.start_offset;
-
-      // Update length of previous entry.
-      auto it = sequences.rbegin();
-      if (it != sequences.rend())
-        it->payload_size = index.start_offset - it->payload_start_offset;
-
-      sequences.push_back(index);
-
-      i += 3;
-    } else {
-      ++i;
-    }
-  }
-
-  // Update length of last entry, if any.
-  auto it = sequences.rbegin();
-  if (it != sequences.rend())
-    it->payload_size = buffer_size - it->payload_start_offset;
-
-  return sequences;
-}
-
-NaluType ParseNaluType(uint8_t data) {
-  return static_cast<NaluType>(data & kNaluTypeMask);
-}
-
-std::vector<uint8_t> ParseRbsp(const uint8_t* data, size_t length) {
-  std::vector<uint8_t> out;
-  out.reserve(length);
-
-  for (size_t i = 0; i < length;) {
-    // Be careful about over/underflow here. byte_length_ - 3 can underflow, and
-    // i + 3 can overflow, but byte_length_ - i can't, because i < byte_length_
-    // above, and that expression will produce the number of bytes left in
-    // the stream including the byte at i.
-    if (length - i >= 3 && !data[i] && !data[i + 1] && data[i + 2] == 3) {
-      // Two rbsp bytes.
-      out.push_back(data[i++]);
-      out.push_back(data[i++]);
-      // Skip the emulation byte.
-      i++;
-    } else {
-      // Single rbsp byte.
-      out.push_back(data[i++]);
-    }
-  }
-  return out;
-}
-
-void WriteRbsp(const uint8_t* bytes, size_t length, rtc::Buffer* destination) {
-  static const uint8_t kZerosInStartSequence = 2;
-  static const uint8_t kEmulationByte = 0x03u;
-  size_t num_consecutive_zeros = 0;
-  destination->EnsureCapacity(destination->size() + length);
-
-  for (size_t i = 0; i < length; ++i) {
-    uint8_t byte = bytes[i];
-    if (byte <= kEmulationByte &&
-        num_consecutive_zeros >= kZerosInStartSequence) {
-      // Need to escape.
-      destination->AppendData(kEmulationByte);
-      num_consecutive_zeros = 0;
-    }
-    destination->AppendData(byte);
-    if (byte == 0) {
-      ++num_consecutive_zeros;
-    } else {
-      num_consecutive_zeros = 0;
-    }
-  }
-}
-
-}  // namespace H264
-}  // namespace webrtc
diff --git a/common_video/h264/h264_common.h b/common_video/h264/h264_common.h
deleted file mode 100644
index fc34484..0000000
--- a/common_video/h264/h264_common.h
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- *  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_COMMON_VIDEO_H264_H264_COMMON_H_
-#define WEBRTC_COMMON_VIDEO_H264_H264_COMMON_H_
-
-#include <memory>
-#include <vector>
-
-#include "webrtc/rtc_base/buffer.h"
-
-namespace webrtc {
-
-namespace H264 {
-// The size of a full NALU start sequence {0 0 0 1}, used for the first NALU
-// of an access unit, and for SPS and PPS blocks.
-const size_t kNaluLongStartSequenceSize = 4;
-
-// The size of a shortened NALU start sequence {0 0 1}, that may be used if
-// not the first NALU of an access unit or an SPS or PPS block.
-const size_t kNaluShortStartSequenceSize = 3;
-
-// The size of the NALU type byte (1).
-const size_t kNaluTypeSize = 1;
-
-enum NaluType : uint8_t {
-  kSlice = 1,
-  kIdr = 5,
-  kSei = 6,
-  kSps = 7,
-  kPps = 8,
-  kAud = 9,
-  kEndOfSequence = 10,
-  kEndOfStream = 11,
-  kFiller = 12,
-  kStapA = 24,
-  kFuA = 28
-};
-
-enum SliceType : uint8_t { kP = 0, kB = 1, kI = 2, kSp = 3, kSi = 4 };
-
-struct NaluIndex {
-  // Start index of NALU, including start sequence.
-  size_t start_offset;
-  // Start index of NALU payload, typically type header.
-  size_t payload_start_offset;
-  // Length of NALU payload, in bytes, counting from payload_start_offset.
-  size_t payload_size;
-};
-
-// Returns a vector of the NALU indices in the given buffer.
-std::vector<NaluIndex> FindNaluIndices(const uint8_t* buffer,
-                                       size_t buffer_size);
-
-// Get the NAL type from the header byte immediately following start sequence.
-NaluType ParseNaluType(uint8_t data);
-
-// Methods for parsing and writing RBSP. See section 7.4.1 of the H264 spec.
-//
-// The following sequences are illegal, and need to be escaped when encoding:
-// 00 00 00 -> 00 00 03 00
-// 00 00 01 -> 00 00 03 01
-// 00 00 02 -> 00 00 03 02
-// And things in the source that look like the emulation byte pattern (00 00 03)
-// need to have an extra emulation byte added, so it's removed when decoding:
-// 00 00 03 -> 00 00 03 03
-//
-// Decoding is simply a matter of finding any 00 00 03 sequence and removing
-// the 03 emulation byte.
-
-// Parse the given data and remove any emulation byte escaping.
-std::vector<uint8_t> ParseRbsp(const uint8_t* data, size_t length);
-
-// Write the given data to the destination buffer, inserting and emulation
-// bytes in order to escape any data the could be interpreted as a start
-// sequence.
-void WriteRbsp(const uint8_t* bytes, size_t length, rtc::Buffer* destination);
-}  // namespace H264
-}  // namespace webrtc
-
-#endif  // WEBRTC_COMMON_VIDEO_H264_H264_COMMON_H_
diff --git a/common_video/h264/pps_parser.cc b/common_video/h264/pps_parser.cc
deleted file mode 100644
index 0df0289..0000000
--- a/common_video/h264/pps_parser.cc
+++ /dev/null
@@ -1,201 +0,0 @@
-/*
- *  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/common_video/h264/pps_parser.h"
-
-#include <memory>
-#include <vector>
-
-#include "webrtc/common_video/h264/h264_common.h"
-#include "webrtc/rtc_base/bitbuffer.h"
-#include "webrtc/rtc_base/logging.h"
-
-#define RETURN_EMPTY_ON_FAIL(x)                  \
-  if (!(x)) {                                    \
-    return rtc::Optional<PpsParser::PpsState>(); \
-  }
-
-namespace {
-const int kMaxPicInitQpDeltaValue = 25;
-const int kMinPicInitQpDeltaValue = -26;
-}
-
-namespace webrtc {
-
-// General note: this is based off the 02/2014 version of the H.264 standard.
-// You can find it on this page:
-// http://www.itu.int/rec/T-REC-H.264
-
-rtc::Optional<PpsParser::PpsState> PpsParser::ParsePps(const uint8_t* data,
-                                                       size_t length) {
-  // First, parse out rbsp, which is basically the source buffer minus emulation
-  // bytes (the last byte of a 0x00 0x00 0x03 sequence). RBSP is defined in
-  // section 7.3.1 of the H.264 standard.
-  std::vector<uint8_t> unpacked_buffer = H264::ParseRbsp(data, length);
-  rtc::BitBuffer bit_buffer(unpacked_buffer.data(), unpacked_buffer.size());
-  return ParseInternal(&bit_buffer);
-}
-
-bool PpsParser::ParsePpsIds(const uint8_t* data,
-                            size_t length,
-                            uint32_t* pps_id,
-                            uint32_t* sps_id) {
-  RTC_DCHECK(pps_id);
-  RTC_DCHECK(sps_id);
-  // First, parse out rbsp, which is basically the source buffer minus emulation
-  // bytes (the last byte of a 0x00 0x00 0x03 sequence). RBSP is defined in
-  // section 7.3.1 of the H.264 standard.
-  std::vector<uint8_t> unpacked_buffer = H264::ParseRbsp(data, length);
-  rtc::BitBuffer bit_buffer(unpacked_buffer.data(), unpacked_buffer.size());
-  return ParsePpsIdsInternal(&bit_buffer, pps_id, sps_id);
-}
-
-rtc::Optional<uint32_t> PpsParser::ParsePpsIdFromSlice(const uint8_t* data,
-                                                       size_t length) {
-  std::vector<uint8_t> unpacked_buffer = H264::ParseRbsp(data, length);
-  rtc::BitBuffer slice_reader(unpacked_buffer.data(), unpacked_buffer.size());
-
-  uint32_t golomb_tmp;
-  // first_mb_in_slice: ue(v)
-  if (!slice_reader.ReadExponentialGolomb(&golomb_tmp))
-    return rtc::Optional<uint32_t>();
-  // slice_type: ue(v)
-  if (!slice_reader.ReadExponentialGolomb(&golomb_tmp))
-    return rtc::Optional<uint32_t>();
-  // pic_parameter_set_id: ue(v)
-  uint32_t slice_pps_id;
-  if (!slice_reader.ReadExponentialGolomb(&slice_pps_id))
-    return rtc::Optional<uint32_t>();
-  return rtc::Optional<uint32_t>(slice_pps_id);
-}
-
-rtc::Optional<PpsParser::PpsState> PpsParser::ParseInternal(
-    rtc::BitBuffer* bit_buffer) {
-  PpsState pps;
-
-  RETURN_EMPTY_ON_FAIL(ParsePpsIdsInternal(bit_buffer, &pps.id, &pps.sps_id));
-
-  uint32_t bits_tmp;
-  uint32_t golomb_ignored;
-  // entropy_coding_mode_flag: u(1)
-  uint32_t entropy_coding_mode_flag;
-  RETURN_EMPTY_ON_FAIL(bit_buffer->ReadBits(&entropy_coding_mode_flag, 1));
-  pps.entropy_coding_mode_flag = entropy_coding_mode_flag != 0;
-  // bottom_field_pic_order_in_frame_present_flag: u(1)
-  uint32_t bottom_field_pic_order_in_frame_present_flag;
-  RETURN_EMPTY_ON_FAIL(
-      bit_buffer->ReadBits(&bottom_field_pic_order_in_frame_present_flag, 1));
-  pps.bottom_field_pic_order_in_frame_present_flag =
-      bottom_field_pic_order_in_frame_present_flag != 0;
-
-  // num_slice_groups_minus1: ue(v)
-  uint32_t num_slice_groups_minus1;
-  RETURN_EMPTY_ON_FAIL(
-      bit_buffer->ReadExponentialGolomb(&num_slice_groups_minus1));
-  if (num_slice_groups_minus1 > 0) {
-    uint32_t slice_group_map_type;
-    // slice_group_map_type: ue(v)
-    RETURN_EMPTY_ON_FAIL(
-        bit_buffer->ReadExponentialGolomb(&slice_group_map_type));
-    if (slice_group_map_type == 0) {
-      for (uint32_t i_group = 0; i_group <= num_slice_groups_minus1;
-           ++i_group) {
-        // run_length_minus1[iGroup]: ue(v)
-        RETURN_EMPTY_ON_FAIL(
-            bit_buffer->ReadExponentialGolomb(&golomb_ignored));
-      }
-    } else if (slice_group_map_type == 1) {
-      // TODO(sprang): Implement support for dispersed slice group map type.
-      // See 8.2.2.2 Specification for dispersed slice group map type.
-    } else if (slice_group_map_type == 2) {
-      for (uint32_t i_group = 0; i_group <= num_slice_groups_minus1;
-           ++i_group) {
-        // top_left[iGroup]: ue(v)
-        RETURN_EMPTY_ON_FAIL(
-            bit_buffer->ReadExponentialGolomb(&golomb_ignored));
-        // bottom_right[iGroup]: ue(v)
-        RETURN_EMPTY_ON_FAIL(
-            bit_buffer->ReadExponentialGolomb(&golomb_ignored));
-      }
-    } else if (slice_group_map_type == 3 || slice_group_map_type == 4 ||
-               slice_group_map_type == 5) {
-      // slice_group_change_direction_flag: u(1)
-      RETURN_EMPTY_ON_FAIL(bit_buffer->ReadBits(&bits_tmp, 1));
-      // slice_group_change_rate_minus1: ue(v)
-      RETURN_EMPTY_ON_FAIL(bit_buffer->ReadExponentialGolomb(&golomb_ignored));
-    } else if (slice_group_map_type == 6) {
-      // pic_size_in_map_units_minus1: ue(v)
-      uint32_t pic_size_in_map_units_minus1;
-      RETURN_EMPTY_ON_FAIL(
-          bit_buffer->ReadExponentialGolomb(&pic_size_in_map_units_minus1));
-      uint32_t slice_group_id_bits = 0;
-      uint32_t num_slice_groups = num_slice_groups_minus1 + 1;
-      // If num_slice_groups is not a power of two an additional bit is required
-      // to account for the ceil() of log2() below.
-      if ((num_slice_groups & (num_slice_groups - 1)) != 0)
-        ++slice_group_id_bits;
-      while (num_slice_groups > 0) {
-        num_slice_groups >>= 1;
-        ++slice_group_id_bits;
-      }
-      for (uint32_t i = 0; i <= pic_size_in_map_units_minus1; i++) {
-        // slice_group_id[i]: u(v)
-        // Represented by ceil(log2(num_slice_groups_minus1 + 1)) bits.
-        RETURN_EMPTY_ON_FAIL(
-            bit_buffer->ReadBits(&bits_tmp, slice_group_id_bits));
-      }
-    }
-  }
-  // num_ref_idx_l0_default_active_minus1: ue(v)
-  RETURN_EMPTY_ON_FAIL(bit_buffer->ReadExponentialGolomb(&golomb_ignored));
-  // num_ref_idx_l1_default_active_minus1: ue(v)
-  RETURN_EMPTY_ON_FAIL(bit_buffer->ReadExponentialGolomb(&golomb_ignored));
-  // weighted_pred_flag: u(1)
-  uint32_t weighted_pred_flag;
-  RETURN_EMPTY_ON_FAIL(bit_buffer->ReadBits(&weighted_pred_flag, 1));
-  pps.weighted_pred_flag = weighted_pred_flag != 0;
-  // weighted_bipred_idc: u(2)
-  RETURN_EMPTY_ON_FAIL(bit_buffer->ReadBits(&pps.weighted_bipred_idc, 2));
-
-  // pic_init_qp_minus26: se(v)
-  RETURN_EMPTY_ON_FAIL(
-      bit_buffer->ReadSignedExponentialGolomb(&pps.pic_init_qp_minus26));
-  // Sanity-check parsed value
-  if (pps.pic_init_qp_minus26 > kMaxPicInitQpDeltaValue ||
-      pps.pic_init_qp_minus26 < kMinPicInitQpDeltaValue) {
-    RETURN_EMPTY_ON_FAIL(false);
-  }
-  // pic_init_qs_minus26: se(v)
-  RETURN_EMPTY_ON_FAIL(bit_buffer->ReadExponentialGolomb(&golomb_ignored));
-  // chroma_qp_index_offset: se(v)
-  RETURN_EMPTY_ON_FAIL(bit_buffer->ReadExponentialGolomb(&golomb_ignored));
-  // deblocking_filter_control_present_flag: u(1)
-  // constrained_intra_pred_flag: u(1)
-  RETURN_EMPTY_ON_FAIL(bit_buffer->ReadBits(&bits_tmp, 2));
-  // redundant_pic_cnt_present_flag: u(1)
-  RETURN_EMPTY_ON_FAIL(
-      bit_buffer->ReadBits(&pps.redundant_pic_cnt_present_flag, 1));
-
-  return rtc::Optional<PpsParser::PpsState>(pps);
-}
-
-bool PpsParser::ParsePpsIdsInternal(rtc::BitBuffer* bit_buffer,
-                                    uint32_t* pps_id,
-                                    uint32_t* sps_id) {
-  // pic_parameter_set_id: ue(v)
-  if (!bit_buffer->ReadExponentialGolomb(pps_id))
-    return false;
-  // seq_parameter_set_id: ue(v)
-  if (!bit_buffer->ReadExponentialGolomb(sps_id))
-    return false;
-  return true;
-}
-
-}  // namespace webrtc
diff --git a/common_video/h264/pps_parser.h b/common_video/h264/pps_parser.h
deleted file mode 100644
index b981d22..0000000
--- a/common_video/h264/pps_parser.h
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- *  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_COMMON_VIDEO_H264_PPS_PARSER_H_
-#define WEBRTC_COMMON_VIDEO_H264_PPS_PARSER_H_
-
-#include "webrtc/api/optional.h"
-
-namespace rtc {
-class BitBuffer;
-}
-
-namespace webrtc {
-
-// A class for parsing out picture parameter set (PPS) data from a H264 NALU.
-class PpsParser {
- public:
-  // The parsed state of the PPS. Only some select values are stored.
-  // Add more as they are actually needed.
-  struct PpsState {
-    PpsState() = default;
-
-    bool bottom_field_pic_order_in_frame_present_flag = false;
-    bool weighted_pred_flag = false;
-    bool entropy_coding_mode_flag = false;
-    uint32_t weighted_bipred_idc = false;
-    uint32_t redundant_pic_cnt_present_flag = 0;
-    int pic_init_qp_minus26 = 0;
-    uint32_t id = 0;
-    uint32_t sps_id = 0;
-  };
-
-  // Unpack RBSP and parse PPS state from the supplied buffer.
-  static rtc::Optional<PpsState> ParsePps(const uint8_t* data, size_t length);
-
-  static bool ParsePpsIds(const uint8_t* data,
-                          size_t length,
-                          uint32_t* pps_id,
-                          uint32_t* sps_id);
-
-  static rtc::Optional<uint32_t> ParsePpsIdFromSlice(const uint8_t* data,
-                                                     size_t length);
-
- protected:
-  // Parse the PPS state, for a bit buffer where RBSP decoding has already been
-  // performed.
-  static rtc::Optional<PpsState> ParseInternal(rtc::BitBuffer* bit_buffer);
-  static bool ParsePpsIdsInternal(rtc::BitBuffer* bit_buffer,
-                                  uint32_t* pps_id,
-                                  uint32_t* sps_id);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_COMMON_VIDEO_H264_PPS_PARSER_H_
diff --git a/common_video/h264/pps_parser_unittest.cc b/common_video/h264/pps_parser_unittest.cc
deleted file mode 100644
index 886808a..0000000
--- a/common_video/h264/pps_parser_unittest.cc
+++ /dev/null
@@ -1,224 +0,0 @@
-/*
- *  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/common_video/h264/pps_parser.h"
-
-#include <limits>
-#include <memory>
-
-#include "webrtc/common_video/h264/h264_common.h"
-#include "webrtc/rtc_base/bitbuffer.h"
-#include "webrtc/rtc_base/buffer.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-namespace {
-// Contains enough of the image slice to contain slice QP.
-const uint8_t kH264BitstreamChunk[] = {
-    0x00, 0x00, 0x00, 0x01, 0x67, 0x42, 0x80, 0x20, 0xda, 0x01, 0x40, 0x16,
-    0xe8, 0x06, 0xd0, 0xa1, 0x35, 0x00, 0x00, 0x00, 0x01, 0x68, 0xce, 0x06,
-    0xe2, 0x00, 0x00, 0x00, 0x01, 0x65, 0xb8, 0x40, 0xf0, 0x8c, 0x03, 0xf2,
-    0x75, 0x67, 0xad, 0x41, 0x64, 0x24, 0x0e, 0xa0, 0xb2, 0x12, 0x1e, 0xf8,
-};
-const size_t kPpsBufferMaxSize = 256;
-const uint32_t kIgnored = 0;
-}  // namespace
-
-void WritePps(const PpsParser::PpsState& pps,
-              int slice_group_map_type,
-              int num_slice_groups,
-              int pic_size_in_map_units,
-              rtc::Buffer* out_buffer) {
-  uint8_t data[kPpsBufferMaxSize] = {0};
-  rtc::BitBufferWriter bit_buffer(data, kPpsBufferMaxSize);
-
-  // pic_parameter_set_id: ue(v)
-  bit_buffer.WriteExponentialGolomb(pps.id);
-  // seq_parameter_set_id: ue(v)
-  bit_buffer.WriteExponentialGolomb(pps.sps_id);
-  // entropy_coding_mode_flag: u(1)
-  bit_buffer.WriteBits(pps.entropy_coding_mode_flag, 1);
-  // bottom_field_pic_order_in_frame_present_flag: u(1)
-  bit_buffer.WriteBits(pps.bottom_field_pic_order_in_frame_present_flag ? 1 : 0,
-                       1);
-  // num_slice_groups_minus1: ue(v)
-  RTC_CHECK_GT(num_slice_groups, 0);
-  bit_buffer.WriteExponentialGolomb(num_slice_groups - 1);
-
-  if (num_slice_groups > 1) {
-    // slice_group_map_type: ue(v)
-    bit_buffer.WriteExponentialGolomb(slice_group_map_type);
-    switch (slice_group_map_type) {
-      case 0:
-        for (int i = 0; i < num_slice_groups; ++i) {
-          // run_length_minus1[iGroup]: ue(v)
-          bit_buffer.WriteExponentialGolomb(kIgnored);
-        }
-        break;
-      case 2:
-        for (int i = 0; i < num_slice_groups; ++i) {
-          // top_left[iGroup]: ue(v)
-          bit_buffer.WriteExponentialGolomb(kIgnored);
-          // bottom_right[iGroup]: ue(v)
-          bit_buffer.WriteExponentialGolomb(kIgnored);
-        }
-        break;
-      case 3:
-      case 4:
-      case 5:
-        // slice_group_change_direction_flag: u(1)
-        bit_buffer.WriteBits(kIgnored, 1);
-        // slice_group_change_rate_minus1: ue(v)
-        bit_buffer.WriteExponentialGolomb(kIgnored);
-        break;
-      case 6: {
-        bit_buffer.WriteExponentialGolomb(pic_size_in_map_units - 1);
-
-        uint32_t slice_group_id_bits = 0;
-        // If num_slice_groups is not a power of two an additional bit is
-        // required
-        // to account for the ceil() of log2() below.
-        if ((num_slice_groups & (num_slice_groups - 1)) != 0)
-          ++slice_group_id_bits;
-        while (num_slice_groups > 0) {
-          num_slice_groups >>= 1;
-          ++slice_group_id_bits;
-        }
-
-        for (int i = 0; i < pic_size_in_map_units; ++i) {
-          // slice_group_id[i]: u(v)
-          // Represented by ceil(log2(num_slice_groups_minus1 + 1)) bits.
-          bit_buffer.WriteBits(kIgnored, slice_group_id_bits);
-        }
-        break;
-      }
-      default:
-        RTC_NOTREACHED();
-    }
-  }
-
-  // num_ref_idx_l0_default_active_minus1: ue(v)
-  bit_buffer.WriteExponentialGolomb(kIgnored);
-  // num_ref_idx_l1_default_active_minus1: ue(v)
-  bit_buffer.WriteExponentialGolomb(kIgnored);
-  // weighted_pred_flag: u(1)
-  bit_buffer.WriteBits(pps.weighted_pred_flag ? 1 : 0, 1);
-  // weighted_bipred_idc: u(2)
-  bit_buffer.WriteBits(pps.weighted_bipred_idc, 2);
-
-  // pic_init_qp_minus26: se(v)
-  bit_buffer.WriteSignedExponentialGolomb(pps.pic_init_qp_minus26);
-  // pic_init_qs_minus26: se(v)
-  bit_buffer.WriteExponentialGolomb(kIgnored);
-  // chroma_qp_index_offset: se(v)
-  bit_buffer.WriteExponentialGolomb(kIgnored);
-  // deblocking_filter_control_present_flag: u(1)
-  // constrained_intra_pred_flag: u(1)
-  bit_buffer.WriteBits(kIgnored, 2);
-  // redundant_pic_cnt_present_flag: u(1)
-  bit_buffer.WriteBits(pps.redundant_pic_cnt_present_flag, 1);
-
-  size_t byte_offset;
-  size_t bit_offset;
-  bit_buffer.GetCurrentOffset(&byte_offset, &bit_offset);
-  if (bit_offset > 0) {
-    bit_buffer.WriteBits(0, 8 - bit_offset);
-    bit_buffer.GetCurrentOffset(&byte_offset, &bit_offset);
-  }
-
-  H264::WriteRbsp(data, byte_offset, out_buffer);
-}
-
-class PpsParserTest : public ::testing::Test {
- public:
-  PpsParserTest() {}
-  virtual ~PpsParserTest() {}
-
-  void RunTest() {
-    VerifyParsing(generated_pps_, 0, 1, 0);
-    const int kMaxSliceGroups = 17;  // Arbitrarily large.
-    const int kMaxMapType = 6;
-    int slice_group_bits = 0;
-    for (int slice_group = 2; slice_group < kMaxSliceGroups; ++slice_group) {
-      if ((slice_group & (slice_group - 1)) == 0) {
-        // Slice group at a new power of two - increase slice_group_bits.
-        ++slice_group_bits;
-      }
-      for (int map_type = 0; map_type <= kMaxMapType; ++map_type) {
-        if (map_type == 1) {
-          // TODO(sprang): Implement support for dispersed slice group map type.
-          // See 8.2.2.2 Specification for dispersed slice group map type.
-          continue;
-        } else if (map_type == 6) {
-          int max_pic_size = 1 << slice_group_bits;
-          for (int pic_size = 1; pic_size < max_pic_size; ++pic_size)
-            VerifyParsing(generated_pps_, map_type, slice_group, pic_size);
-        } else {
-          VerifyParsing(generated_pps_, map_type, slice_group, 0);
-        }
-      }
-    }
-  }
-
-  void VerifyParsing(const PpsParser::PpsState& pps,
-                     int slice_group_map_type,
-                     int num_slice_groups,
-                     int pic_size_in_map_units) {
-    buffer_.Clear();
-    WritePps(pps, slice_group_map_type, num_slice_groups, pic_size_in_map_units,
-             &buffer_);
-    parsed_pps_ = PpsParser::ParsePps(buffer_.data(), buffer_.size());
-    EXPECT_TRUE(static_cast<bool>(parsed_pps_));
-    EXPECT_EQ(pps.bottom_field_pic_order_in_frame_present_flag,
-              parsed_pps_->bottom_field_pic_order_in_frame_present_flag);
-    EXPECT_EQ(pps.weighted_pred_flag, parsed_pps_->weighted_pred_flag);
-    EXPECT_EQ(pps.weighted_bipred_idc, parsed_pps_->weighted_bipred_idc);
-    EXPECT_EQ(pps.entropy_coding_mode_flag,
-              parsed_pps_->entropy_coding_mode_flag);
-    EXPECT_EQ(pps.redundant_pic_cnt_present_flag,
-              parsed_pps_->redundant_pic_cnt_present_flag);
-    EXPECT_EQ(pps.pic_init_qp_minus26, parsed_pps_->pic_init_qp_minus26);
-    EXPECT_EQ(pps.id, parsed_pps_->id);
-    EXPECT_EQ(pps.sps_id, parsed_pps_->sps_id);
-  }
-
-  PpsParser::PpsState generated_pps_;
-  rtc::Buffer buffer_;
-  rtc::Optional<PpsParser::PpsState> parsed_pps_;
-};
-
-TEST_F(PpsParserTest, ZeroPps) {
-  RunTest();
-}
-
-TEST_F(PpsParserTest, MaxPps) {
-  generated_pps_.bottom_field_pic_order_in_frame_present_flag = true;
-  generated_pps_.pic_init_qp_minus26 = 25;
-  generated_pps_.redundant_pic_cnt_present_flag = 1;  // 1 bit value.
-  generated_pps_.weighted_bipred_idc = (1 << 2) - 1;  // 2 bit value.
-  generated_pps_.weighted_pred_flag = true;
-  generated_pps_.entropy_coding_mode_flag = true;
-  generated_pps_.id = 2;
-  generated_pps_.sps_id = 1;
-  RunTest();
-
-  generated_pps_.pic_init_qp_minus26 = -25;
-  RunTest();
-}
-
-TEST_F(PpsParserTest, PpsIdFromSlice) {
-  rtc::Optional<uint32_t> pps_id = PpsParser::ParsePpsIdFromSlice(
-      kH264BitstreamChunk, sizeof(kH264BitstreamChunk));
-  ASSERT_TRUE(pps_id);
-  EXPECT_EQ(2u, *pps_id);
-}
-
-}  // namespace webrtc
diff --git a/common_video/h264/profile_level_id.h b/common_video/h264/profile_level_id.h
deleted file mode 100644
index a13fa4b..0000000
--- a/common_video/h264/profile_level_id.h
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- *  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_COMMON_VIDEO_H264_PROFILE_LEVEL_ID_H_
-#define WEBRTC_COMMON_VIDEO_H264_PROFILE_LEVEL_ID_H_
-
-#include "webrtc/media/base/h264_profile_level_id.h"
-
-// TODO(zhihuang): Delete this file once dependent applications switch to
-// including "webrtc/media/base/h264_profile_level_id.h" directly.
-
-#endif  // WEBRTC_COMMON_VIDEO_H264_PROFILE_LEVEL_ID_H_
diff --git a/common_video/h264/profile_level_id_unittest.cc b/common_video/h264/profile_level_id_unittest.cc
deleted file mode 100644
index 38a84d5..0000000
--- a/common_video/h264/profile_level_id_unittest.cc
+++ /dev/null
@@ -1,196 +0,0 @@
-/*
- *  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/common_video/h264/profile_level_id.h"
-
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-namespace H264 {
-
-TEST(H264ProfileLevelId, TestParsingInvalid) {
-  // Malformed strings.
-  EXPECT_FALSE(ParseProfileLevelId(""));
-  EXPECT_FALSE(ParseProfileLevelId(" 42e01f"));
-  EXPECT_FALSE(ParseProfileLevelId("4242e01f"));
-  EXPECT_FALSE(ParseProfileLevelId("e01f"));
-  EXPECT_FALSE(ParseProfileLevelId("gggggg"));
-
-  // Invalid level.
-  EXPECT_FALSE(ParseProfileLevelId("42e000"));
-  EXPECT_FALSE(ParseProfileLevelId("42e00f"));
-  EXPECT_FALSE(ParseProfileLevelId("42e0ff"));
-
-  // Invalid profile.
-  EXPECT_FALSE(ParseProfileLevelId("42e11f"));
-  EXPECT_FALSE(ParseProfileLevelId("58601f"));
-  EXPECT_FALSE(ParseProfileLevelId("64e01f"));
-}
-
-TEST(H264ProfileLevelId, TestParsingLevel) {
-  EXPECT_EQ(kLevel3_1, ParseProfileLevelId("42e01f")->level);
-  EXPECT_EQ(kLevel1_1, ParseProfileLevelId("42e00b")->level);
-  EXPECT_EQ(kLevel1_b, ParseProfileLevelId("42f00b")->level);
-  EXPECT_EQ(kLevel4_2, ParseProfileLevelId("42C02A")->level);
-  EXPECT_EQ(kLevel5_2, ParseProfileLevelId("640c34")->level);
-}
-
-TEST(H264ProfileLevelId, TestParsingConstrainedBaseline) {
-  EXPECT_EQ(kProfileConstrainedBaseline,
-            ParseProfileLevelId("42e01f")->profile);
-  EXPECT_EQ(kProfileConstrainedBaseline,
-            ParseProfileLevelId("42C02A")->profile);
-  EXPECT_EQ(kProfileConstrainedBaseline,
-            ParseProfileLevelId("4de01f")->profile);
-  EXPECT_EQ(kProfileConstrainedBaseline,
-            ParseProfileLevelId("58f01f")->profile);
-}
-
-TEST(H264ProfileLevelId, TestParsingBaseline) {
-  EXPECT_EQ(kProfileBaseline, ParseProfileLevelId("42a01f")->profile);
-  EXPECT_EQ(kProfileBaseline, ParseProfileLevelId("58A01F")->profile);
-}
-
-TEST(H264ProfileLevelId, TestParsingMain) {
-  EXPECT_EQ(kProfileMain, ParseProfileLevelId("4D401f")->profile);
-}
-
-TEST(H264ProfileLevelId, TestParsingHigh) {
-  EXPECT_EQ(kProfileHigh, ParseProfileLevelId("64001f")->profile);
-}
-
-TEST(H264ProfileLevelId, TestParsingConstrainedHigh) {
-  EXPECT_EQ(kProfileConstrainedHigh, ParseProfileLevelId("640c1f")->profile);
-}
-
-TEST(H264ProfileLevelId, TestSupportedLevel) {
-  EXPECT_EQ(kLevel2_1, *SupportedLevel(640 * 480, 25));
-  EXPECT_EQ(kLevel3_1, *SupportedLevel(1280 * 720, 30));
-  EXPECT_EQ(kLevel4_2, *SupportedLevel(1920 * 1280, 60));
-}
-
-// Test supported level below level 1 requirements.
-TEST(H264ProfileLevelId, TestSupportedLevelInvalid) {
-  EXPECT_FALSE(SupportedLevel(0, 0));
-  // All levels support fps > 5.
-  EXPECT_FALSE(SupportedLevel(1280 * 720, 5));
-  // All levels support frame sizes > 183 * 137.
-  EXPECT_FALSE(SupportedLevel(183 * 137, 30));
-}
-
-TEST(H264ProfileLevelId, TestToString) {
-  EXPECT_EQ("42e01f", *ProfileLevelIdToString(ProfileLevelId(
-                          kProfileConstrainedBaseline, kLevel3_1)));
-  EXPECT_EQ("42000a",
-            *ProfileLevelIdToString(ProfileLevelId(kProfileBaseline, kLevel1)));
-  EXPECT_EQ("4d001f",
-            ProfileLevelIdToString(ProfileLevelId(kProfileMain, kLevel3_1)));
-  EXPECT_EQ("640c2a", *ProfileLevelIdToString(
-                          ProfileLevelId(kProfileConstrainedHigh, kLevel4_2)));
-  EXPECT_EQ("64002a",
-            *ProfileLevelIdToString(ProfileLevelId(kProfileHigh, kLevel4_2)));
-}
-
-TEST(H264ProfileLevelId, TestToStringLevel1b) {
-  EXPECT_EQ("42f00b", *ProfileLevelIdToString(ProfileLevelId(
-                          kProfileConstrainedBaseline, kLevel1_b)));
-  EXPECT_EQ("42100b", *ProfileLevelIdToString(
-                          ProfileLevelId(kProfileBaseline, kLevel1_b)));
-  EXPECT_EQ("4d100b",
-            *ProfileLevelIdToString(ProfileLevelId(kProfileMain, kLevel1_b)));
-}
-
-TEST(H264ProfileLevelId, TestToStringRoundTrip) {
-  EXPECT_EQ("42e01f", *ProfileLevelIdToString(*ParseProfileLevelId("42e01f")));
-  EXPECT_EQ("42e01f", *ProfileLevelIdToString(*ParseProfileLevelId("42E01F")));
-  EXPECT_EQ("4d100b", *ProfileLevelIdToString(*ParseProfileLevelId("4d100b")));
-  EXPECT_EQ("4d100b", *ProfileLevelIdToString(*ParseProfileLevelId("4D100B")));
-  EXPECT_EQ("640c2a", *ProfileLevelIdToString(*ParseProfileLevelId("640c2a")));
-  EXPECT_EQ("640c2a", *ProfileLevelIdToString(*ParseProfileLevelId("640C2A")));
-}
-
-TEST(H264ProfileLevelId, TestToStringInvalid) {
-  EXPECT_FALSE(ProfileLevelIdToString(ProfileLevelId(kProfileHigh, kLevel1_b)));
-  EXPECT_FALSE(ProfileLevelIdToString(
-      ProfileLevelId(kProfileConstrainedHigh, kLevel1_b)));
-  EXPECT_FALSE(ProfileLevelIdToString(
-      ProfileLevelId(static_cast<Profile>(255), kLevel3_1)));
-}
-
-TEST(H264ProfileLevelId, TestParseSdpProfileLevelIdEmpty) {
-  const rtc::Optional<ProfileLevelId> profile_level_id =
-      ParseSdpProfileLevelId(CodecParameterMap());
-  EXPECT_TRUE(profile_level_id);
-  EXPECT_EQ(kProfileConstrainedBaseline, profile_level_id->profile);
-  EXPECT_EQ(kLevel3_1, profile_level_id->level);
-}
-
-TEST(H264ProfileLevelId, TestParseSdpProfileLevelIdConstrainedHigh) {
-  CodecParameterMap params;
-  params["profile-level-id"] = "640c2a";
-  const rtc::Optional<ProfileLevelId> profile_level_id =
-      ParseSdpProfileLevelId(params);
-  EXPECT_TRUE(profile_level_id);
-  EXPECT_EQ(kProfileConstrainedHigh, profile_level_id->profile);
-  EXPECT_EQ(kLevel4_2, profile_level_id->level);
-}
-
-TEST(H264ProfileLevelId, TestParseSdpProfileLevelIdInvalid) {
-  CodecParameterMap params;
-  params["profile-level-id"] = "foobar";
-  EXPECT_FALSE(ParseSdpProfileLevelId(params));
-}
-
-TEST(H264ProfileLevelId, TestGenerateProfileLevelIdForAnswerEmpty) {
-  CodecParameterMap answer_params;
-  GenerateProfileLevelIdForAnswer(CodecParameterMap(), CodecParameterMap(),
-                                  &answer_params);
-  EXPECT_TRUE(answer_params.empty());
-}
-
-TEST(H264ProfileLevelId,
-     TestGenerateProfileLevelIdForAnswerLevelSymmetryCapped) {
-  CodecParameterMap low_level;
-  low_level["profile-level-id"] = "42e015";
-  CodecParameterMap high_level;
-  high_level["profile-level-id"] = "42e01f";
-
-  // Level asymmetry is not allowed; test that answer level is the lower of the
-  // local and remote levels.
-  CodecParameterMap answer_params;
-  GenerateProfileLevelIdForAnswer(low_level /* local_supported */,
-                                  high_level /* remote_offered */,
-                                  &answer_params);
-  EXPECT_EQ("42e015", answer_params["profile-level-id"]);
-
-  CodecParameterMap answer_params2;
-  GenerateProfileLevelIdForAnswer(high_level /* local_supported */,
-                                  low_level /* remote_offered */,
-                                  &answer_params2);
-  EXPECT_EQ("42e015", answer_params2["profile-level-id"]);
-}
-
-TEST(H264ProfileLevelId,
-     TestGenerateProfileLevelIdForAnswerConstrainedBaselineLevelAsymmetry) {
-  CodecParameterMap local_params;
-  local_params["profile-level-id"] = "42e01f";
-  local_params["level-asymmetry-allowed"] = "1";
-  CodecParameterMap remote_params;
-  remote_params["profile-level-id"] = "42e015";
-  remote_params["level-asymmetry-allowed"] = "1";
-  CodecParameterMap answer_params;
-  GenerateProfileLevelIdForAnswer(local_params, remote_params, &answer_params);
-  // When level asymmetry is allowed, we can answer a higher level than what was
-  // offered.
-  EXPECT_EQ("42e01f", answer_params["profile-level-id"]);
-}
-
-}  // namespace H264
-}  // namespace webrtc
diff --git a/common_video/h264/sps_parser.cc b/common_video/h264/sps_parser.cc
deleted file mode 100644
index fbf7ee7..0000000
--- a/common_video/h264/sps_parser.cc
+++ /dev/null
@@ -1,221 +0,0 @@
-/*
- *  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/common_video/h264/sps_parser.h"
-
-#include <memory>
-#include <vector>
-
-#include "webrtc/common_video/h264/h264_common.h"
-#include "webrtc/rtc_base/bitbuffer.h"
-#include "webrtc/rtc_base/logging.h"
-
-typedef rtc::Optional<webrtc::SpsParser::SpsState> OptionalSps;
-
-#define RETURN_EMPTY_ON_FAIL(x) \
-  if (!(x)) {                   \
-    return OptionalSps();       \
-  }
-
-namespace webrtc {
-
-// General note: this is based off the 02/2014 version of the H.264 standard.
-// You can find it on this page:
-// http://www.itu.int/rec/T-REC-H.264
-
-// Unpack RBSP and parse SPS state from the supplied buffer.
-rtc::Optional<SpsParser::SpsState> SpsParser::ParseSps(const uint8_t* data,
-                                                       size_t length) {
-  std::vector<uint8_t> unpacked_buffer = H264::ParseRbsp(data, length);
-  rtc::BitBuffer bit_buffer(unpacked_buffer.data(), unpacked_buffer.size());
-  return ParseSpsUpToVui(&bit_buffer);
-}
-
-rtc::Optional<SpsParser::SpsState> SpsParser::ParseSpsUpToVui(
-    rtc::BitBuffer* buffer) {
-  // Now, we need to use a bit buffer to parse through the actual AVC SPS
-  // format. See Section 7.3.2.1.1 ("Sequence parameter set data syntax") of the
-  // H.264 standard for a complete description.
-  // Since we only care about resolution, we ignore the majority of fields, but
-  // we still have to actively parse through a lot of the data, since many of
-  // the fields have variable size.
-  // We're particularly interested in:
-  // chroma_format_idc -> affects crop units
-  // pic_{width,height}_* -> resolution of the frame in macroblocks (16x16).
-  // frame_crop_*_offset -> crop information
-
-  SpsState sps;
-
-  // The golomb values we have to read, not just consume.
-  uint32_t golomb_ignored;
-
-  // chroma_format_idc will be ChromaArrayType if separate_colour_plane_flag is
-  // 0. It defaults to 1, when not specified.
-  uint32_t chroma_format_idc = 1;
-
-  // profile_idc: u(8). We need it to determine if we need to read/skip chroma
-  // formats.
-  uint8_t profile_idc;
-  RETURN_EMPTY_ON_FAIL(buffer->ReadUInt8(&profile_idc));
-  // constraint_set0_flag through constraint_set5_flag + reserved_zero_2bits
-  // 1 bit each for the flags + 2 bits = 8 bits = 1 byte.
-  RETURN_EMPTY_ON_FAIL(buffer->ConsumeBytes(1));
-  // level_idc: u(8)
-  RETURN_EMPTY_ON_FAIL(buffer->ConsumeBytes(1));
-  // seq_parameter_set_id: ue(v)
-  RETURN_EMPTY_ON_FAIL(buffer->ReadExponentialGolomb(&sps.id));
-  sps.separate_colour_plane_flag = 0;
-  // See if profile_idc has chroma format information.
-  if (profile_idc == 100 || profile_idc == 110 || profile_idc == 122 ||
-      profile_idc == 244 || profile_idc == 44 || profile_idc == 83 ||
-      profile_idc == 86 || profile_idc == 118 || profile_idc == 128 ||
-      profile_idc == 138 || profile_idc == 139 || profile_idc == 134) {
-    // chroma_format_idc: ue(v)
-    RETURN_EMPTY_ON_FAIL(buffer->ReadExponentialGolomb(&chroma_format_idc));
-    if (chroma_format_idc == 3) {
-      // separate_colour_plane_flag: u(1)
-      RETURN_EMPTY_ON_FAIL(
-          buffer->ReadBits(&sps.separate_colour_plane_flag, 1));
-    }
-    // bit_depth_luma_minus8: ue(v)
-    RETURN_EMPTY_ON_FAIL(buffer->ReadExponentialGolomb(&golomb_ignored));
-    // bit_depth_chroma_minus8: ue(v)
-    RETURN_EMPTY_ON_FAIL(buffer->ReadExponentialGolomb(&golomb_ignored));
-    // qpprime_y_zero_transform_bypass_flag: u(1)
-    RETURN_EMPTY_ON_FAIL(buffer->ConsumeBits(1));
-    // seq_scaling_matrix_present_flag: u(1)
-    uint32_t seq_scaling_matrix_present_flag;
-    RETURN_EMPTY_ON_FAIL(buffer->ReadBits(&seq_scaling_matrix_present_flag, 1));
-    if (seq_scaling_matrix_present_flag) {
-      // seq_scaling_list_present_flags. Either 8 or 12, depending on
-      // chroma_format_idc.
-      uint32_t seq_scaling_list_present_flags;
-      if (chroma_format_idc != 3) {
-        RETURN_EMPTY_ON_FAIL(
-            buffer->ReadBits(&seq_scaling_list_present_flags, 8));
-      } else {
-        RETURN_EMPTY_ON_FAIL(
-            buffer->ReadBits(&seq_scaling_list_present_flags, 12));
-      }
-      // We don't support reading the sequence scaling list, and we don't really
-      // see/use them in practice, so we'll just reject the full sps if we see
-      // any provided.
-      if (seq_scaling_list_present_flags > 0) {
-        LOG(LS_WARNING) << "SPS contains scaling lists, which are unsupported.";
-        return OptionalSps();
-      }
-    }
-  }
-  // log2_max_frame_num_minus4: ue(v)
-  RETURN_EMPTY_ON_FAIL(
-      buffer->ReadExponentialGolomb(&sps.log2_max_frame_num_minus4));
-  // pic_order_cnt_type: ue(v)
-  RETURN_EMPTY_ON_FAIL(buffer->ReadExponentialGolomb(&sps.pic_order_cnt_type));
-  if (sps.pic_order_cnt_type == 0) {
-    // log2_max_pic_order_cnt_lsb_minus4: ue(v)
-    RETURN_EMPTY_ON_FAIL(
-        buffer->ReadExponentialGolomb(&sps.log2_max_pic_order_cnt_lsb_minus4));
-  } else if (sps.pic_order_cnt_type == 1) {
-    // delta_pic_order_always_zero_flag: u(1)
-    RETURN_EMPTY_ON_FAIL(
-        buffer->ReadBits(&sps.delta_pic_order_always_zero_flag, 1));
-    // offset_for_non_ref_pic: se(v)
-    RETURN_EMPTY_ON_FAIL(buffer->ReadExponentialGolomb(&golomb_ignored));
-    // offset_for_top_to_bottom_field: se(v)
-    RETURN_EMPTY_ON_FAIL(buffer->ReadExponentialGolomb(&golomb_ignored));
-    // num_ref_frames_in_pic_order_cnt_cycle: ue(v)
-    uint32_t num_ref_frames_in_pic_order_cnt_cycle;
-    RETURN_EMPTY_ON_FAIL(
-        buffer->ReadExponentialGolomb(&num_ref_frames_in_pic_order_cnt_cycle));
-    for (size_t i = 0; i < num_ref_frames_in_pic_order_cnt_cycle; ++i) {
-      // offset_for_ref_frame[i]: se(v)
-      RETURN_EMPTY_ON_FAIL(buffer->ReadExponentialGolomb(&golomb_ignored));
-    }
-  }
-  // max_num_ref_frames: ue(v)
-  RETURN_EMPTY_ON_FAIL(buffer->ReadExponentialGolomb(&sps.max_num_ref_frames));
-  // gaps_in_frame_num_value_allowed_flag: u(1)
-  RETURN_EMPTY_ON_FAIL(buffer->ConsumeBits(1));
-  //
-  // IMPORTANT ONES! Now we're getting to resolution. First we read the pic
-  // width/height in macroblocks (16x16), which gives us the base resolution,
-  // and then we continue on until we hit the frame crop offsets, which are used
-  // to signify resolutions that aren't multiples of 16.
-  //
-  // pic_width_in_mbs_minus1: ue(v)
-  uint32_t pic_width_in_mbs_minus1;
-  RETURN_EMPTY_ON_FAIL(buffer->ReadExponentialGolomb(&pic_width_in_mbs_minus1));
-  // pic_height_in_map_units_minus1: ue(v)
-  uint32_t pic_height_in_map_units_minus1;
-  RETURN_EMPTY_ON_FAIL(
-      buffer->ReadExponentialGolomb(&pic_height_in_map_units_minus1));
-  // frame_mbs_only_flag: u(1)
-  RETURN_EMPTY_ON_FAIL(buffer->ReadBits(&sps.frame_mbs_only_flag, 1));
-  if (!sps.frame_mbs_only_flag) {
-    // mb_adaptive_frame_field_flag: u(1)
-    RETURN_EMPTY_ON_FAIL(buffer->ConsumeBits(1));
-  }
-  // direct_8x8_inference_flag: u(1)
-  RETURN_EMPTY_ON_FAIL(buffer->ConsumeBits(1));
-  //
-  // MORE IMPORTANT ONES! Now we're at the frame crop information.
-  //
-  // frame_cropping_flag: u(1)
-  uint32_t frame_cropping_flag;
-  uint32_t frame_crop_left_offset = 0;
-  uint32_t frame_crop_right_offset = 0;
-  uint32_t frame_crop_top_offset = 0;
-  uint32_t frame_crop_bottom_offset = 0;
-  RETURN_EMPTY_ON_FAIL(buffer->ReadBits(&frame_cropping_flag, 1));
-  if (frame_cropping_flag) {
-    // frame_crop_{left, right, top, bottom}_offset: ue(v)
-    RETURN_EMPTY_ON_FAIL(
-        buffer->ReadExponentialGolomb(&frame_crop_left_offset));
-    RETURN_EMPTY_ON_FAIL(
-        buffer->ReadExponentialGolomb(&frame_crop_right_offset));
-    RETURN_EMPTY_ON_FAIL(buffer->ReadExponentialGolomb(&frame_crop_top_offset));
-    RETURN_EMPTY_ON_FAIL(
-        buffer->ReadExponentialGolomb(&frame_crop_bottom_offset));
-  }
-  // vui_parameters_present_flag: u(1)
-  RETURN_EMPTY_ON_FAIL(buffer->ReadBits(&sps.vui_params_present, 1));
-
-  // Far enough! We don't use the rest of the SPS.
-
-  // Start with the resolution determined by the pic_width/pic_height fields.
-  sps.width = 16 * (pic_width_in_mbs_minus1 + 1);
-  sps.height =
-      16 * (2 - sps.frame_mbs_only_flag) * (pic_height_in_map_units_minus1 + 1);
-
-  // Figure out the crop units in pixels. That's based on the chroma format's
-  // sampling, which is indicated by chroma_format_idc.
-  if (sps.separate_colour_plane_flag || chroma_format_idc == 0) {
-    frame_crop_bottom_offset *= (2 - sps.frame_mbs_only_flag);
-    frame_crop_top_offset *= (2 - sps.frame_mbs_only_flag);
-  } else if (!sps.separate_colour_plane_flag && chroma_format_idc > 0) {
-    // Width multipliers for formats 1 (4:2:0) and 2 (4:2:2).
-    if (chroma_format_idc == 1 || chroma_format_idc == 2) {
-      frame_crop_left_offset *= 2;
-      frame_crop_right_offset *= 2;
-    }
-    // Height multipliers for format 1 (4:2:0).
-    if (chroma_format_idc == 1) {
-      frame_crop_top_offset *= 2;
-      frame_crop_bottom_offset *= 2;
-    }
-  }
-  // Subtract the crop for each dimension.
-  sps.width -= (frame_crop_left_offset + frame_crop_right_offset);
-  sps.height -= (frame_crop_top_offset + frame_crop_bottom_offset);
-
-  return OptionalSps(sps);
-}
-
-}  // namespace webrtc
diff --git a/common_video/h264/sps_parser.h b/common_video/h264/sps_parser.h
deleted file mode 100644
index 77ad25d..0000000
--- a/common_video/h264/sps_parser.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- *  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_COMMON_VIDEO_H264_SPS_PARSER_H_
-#define WEBRTC_COMMON_VIDEO_H264_SPS_PARSER_H_
-
-#include "webrtc/api/optional.h"
-
-namespace rtc {
-class BitBuffer;
-}
-
-namespace webrtc {
-
-// A class for parsing out sequence parameter set (SPS) data from an H264 NALU.
-class SpsParser {
- public:
-  // The parsed state of the SPS. Only some select values are stored.
-  // Add more as they are actually needed.
-  struct SpsState {
-    SpsState() = default;
-
-    uint32_t width = 0;
-    uint32_t height = 0;
-    uint32_t delta_pic_order_always_zero_flag = 0;
-    uint32_t separate_colour_plane_flag = 0;
-    uint32_t frame_mbs_only_flag = 0;
-    uint32_t log2_max_frame_num_minus4 = 0;
-    uint32_t log2_max_pic_order_cnt_lsb_minus4 = 0;
-    uint32_t pic_order_cnt_type = 0;
-    uint32_t max_num_ref_frames = 0;
-    uint32_t vui_params_present = 0;
-    uint32_t id = 0;
-  };
-
-  // Unpack RBSP and parse SPS state from the supplied buffer.
-  static rtc::Optional<SpsState> ParseSps(const uint8_t* data, size_t length);
-
- protected:
-  // Parse the SPS state, up till the VUI part, for a bit buffer where RBSP
-  // decoding has already been performed.
-  static rtc::Optional<SpsState> ParseSpsUpToVui(rtc::BitBuffer* buffer);
-};
-
-}  // namespace webrtc
-#endif  // WEBRTC_COMMON_VIDEO_H264_SPS_PARSER_H_
diff --git a/common_video/h264/sps_parser_unittest.cc b/common_video/h264/sps_parser_unittest.cc
deleted file mode 100644
index 5a0df9a..0000000
--- a/common_video/h264/sps_parser_unittest.cc
+++ /dev/null
@@ -1,174 +0,0 @@
-/*
- *  Copyright (c) 2015 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/common_video/h264/sps_parser.h"
-
-#include "webrtc/common_video/h264/h264_common.h"
-#include "webrtc/rtc_base/arraysize.h"
-#include "webrtc/rtc_base/bitbuffer.h"
-#include "webrtc/rtc_base/buffer.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-// Example SPS can be generated with ffmpeg. Here's an example set of commands,
-// runnable on OS X:
-// 1) Generate a video, from the camera:
-// ffmpeg -f avfoundation -i "0" -video_size 640x360 camera.mov
-//
-// 2) Scale the video to the desired size:
-// ffmpeg -i camera.mov -vf scale=640x360 scaled.mov
-//
-// 3) Get just the H.264 bitstream in AnnexB:
-// ffmpeg -i scaled.mov -vcodec copy -vbsf h264_mp4toannexb -an out.h264
-//
-// 4) Open out.h264 and find the SPS, generally everything between the first
-// two start codes (0 0 0 1 or 0 0 1). The first byte should be 0x67,
-// which should be stripped out before being passed to the parser.
-
-static const size_t kSpsBufferMaxSize = 256;
-
-// Generates a fake SPS with basically everything empty but the width/height.
-// Pass in a buffer of at least kSpsBufferMaxSize.
-// The fake SPS that this generates also always has at least one emulation byte
-// at offset 2, since the first two bytes are always 0, and has a 0x3 as the
-// level_idc, to make sure the parser doesn't eat all 0x3 bytes.
-void GenerateFakeSps(uint16_t width,
-                     uint16_t height,
-                     int id,
-                     rtc::Buffer* out_buffer) {
-  uint8_t rbsp[kSpsBufferMaxSize] = {0};
-  rtc::BitBufferWriter writer(rbsp, kSpsBufferMaxSize);
-  // Profile byte.
-  writer.WriteUInt8(0);
-  // Constraint sets and reserved zero bits.
-  writer.WriteUInt8(0);
-  // level_idc.
-  writer.WriteUInt8(0x3u);
-  // seq_paramter_set_id.
-  writer.WriteExponentialGolomb(id);
-  // Profile is not special, so we skip all the chroma format settings.
-
-  // Now some bit magic.
-  // log2_max_frame_num_minus4: ue(v). 0 is fine.
-  writer.WriteExponentialGolomb(0);
-  // pic_order_cnt_type: ue(v). 0 is the type we want.
-  writer.WriteExponentialGolomb(0);
-  // log2_max_pic_order_cnt_lsb_minus4: ue(v). 0 is fine.
-  writer.WriteExponentialGolomb(0);
-  // max_num_ref_frames: ue(v). 0 is fine.
-  writer.WriteExponentialGolomb(0);
-  // gaps_in_frame_num_value_allowed_flag: u(1).
-  writer.WriteBits(0, 1);
-  // Next are width/height. First, calculate the mbs/map_units versions.
-  uint16_t width_in_mbs_minus1 = (width + 15) / 16 - 1;
-
-  // For the height, we're going to define frame_mbs_only_flag, so we need to
-  // divide by 2. See the parser for the full calculation.
-  uint16_t height_in_map_units_minus1 = ((height + 15) / 16 - 1) / 2;
-  // Write each as ue(v).
-  writer.WriteExponentialGolomb(width_in_mbs_minus1);
-  writer.WriteExponentialGolomb(height_in_map_units_minus1);
-  // frame_mbs_only_flag: u(1). Needs to be false.
-  writer.WriteBits(0, 1);
-  // mb_adaptive_frame_field_flag: u(1).
-  writer.WriteBits(0, 1);
-  // direct_8x8_inferene_flag: u(1).
-  writer.WriteBits(0, 1);
-  // frame_cropping_flag: u(1). 1, so we can supply crop.
-  writer.WriteBits(1, 1);
-  // Now we write the left/right/top/bottom crop. For simplicity, we'll put all
-  // the crop at the left/top.
-  // We picked a 4:2:0 format, so the crops are 1/2 the pixel crop values.
-  // Left/right.
-  writer.WriteExponentialGolomb(((16 - (width % 16)) % 16) / 2);
-  writer.WriteExponentialGolomb(0);
-  // Top/bottom.
-  writer.WriteExponentialGolomb(((16 - (height % 16)) % 16) / 2);
-  writer.WriteExponentialGolomb(0);
-
-  // vui_parameters_present_flag: u(1)
-  writer.WriteBits(0, 1);
-
-  // Get the number of bytes written (including the last partial byte).
-  size_t byte_count, bit_offset;
-  writer.GetCurrentOffset(&byte_count, &bit_offset);
-  if (bit_offset > 0) {
-    byte_count++;
-  }
-
-  H264::WriteRbsp(rbsp, byte_count, out_buffer);
-}
-
-class H264SpsParserTest : public ::testing::Test {
- public:
-  H264SpsParserTest() {}
-  virtual ~H264SpsParserTest() {}
-
-  rtc::Optional<SpsParser::SpsState> sps_;
-};
-
-TEST_F(H264SpsParserTest, TestSampleSPSHdLandscape) {
-  // SPS for a 1280x720 camera capture from ffmpeg on osx. Contains
-  // emulation bytes but no cropping.
-  const uint8_t buffer[] = {0x7A, 0x00, 0x1F, 0xBC, 0xD9, 0x40, 0x50, 0x05,
-                            0xBA, 0x10, 0x00, 0x00, 0x03, 0x00, 0xC0, 0x00,
-                            0x00, 0x2A, 0xE0, 0xF1, 0x83, 0x19, 0x60};
-  EXPECT_TRUE(
-      static_cast<bool>(sps_ = SpsParser::ParseSps(buffer, arraysize(buffer))));
-  EXPECT_EQ(1280u, sps_->width);
-  EXPECT_EQ(720u, sps_->height);
-}
-
-TEST_F(H264SpsParserTest, TestSampleSPSVgaLandscape) {
-  // SPS for a 640x360 camera capture from ffmpeg on osx. Contains emulation
-  // bytes and cropping (360 isn't divisible by 16).
-  const uint8_t buffer[] = {0x7A, 0x00, 0x1E, 0xBC, 0xD9, 0x40, 0xA0, 0x2F,
-                            0xF8, 0x98, 0x40, 0x00, 0x00, 0x03, 0x01, 0x80,
-                            0x00, 0x00, 0x56, 0x83, 0xC5, 0x8B, 0x65, 0x80};
-  EXPECT_TRUE(
-      static_cast<bool>(sps_ = SpsParser::ParseSps(buffer, arraysize(buffer))));
-  EXPECT_EQ(640u, sps_->width);
-  EXPECT_EQ(360u, sps_->height);
-}
-
-TEST_F(H264SpsParserTest, TestSampleSPSWeirdResolution) {
-  // SPS for a 200x400 camera capture from ffmpeg on osx. Horizontal and
-  // veritcal crop (neither dimension is divisible by 16).
-  const uint8_t buffer[] = {0x7A, 0x00, 0x0D, 0xBC, 0xD9, 0x43, 0x43, 0x3E,
-                            0x5E, 0x10, 0x00, 0x00, 0x03, 0x00, 0x60, 0x00,
-                            0x00, 0x15, 0xA0, 0xF1, 0x42, 0x99, 0x60};
-  EXPECT_TRUE(
-      static_cast<bool>(sps_ = SpsParser::ParseSps(buffer, arraysize(buffer))));
-  EXPECT_EQ(200u, sps_->width);
-  EXPECT_EQ(400u, sps_->height);
-}
-
-TEST_F(H264SpsParserTest, TestSyntheticSPSQvgaLandscape) {
-  rtc::Buffer buffer;
-  GenerateFakeSps(320u, 180u, 1, &buffer);
-  EXPECT_TRUE(static_cast<bool>(
-      sps_ = SpsParser::ParseSps(buffer.data(), buffer.size())));
-  EXPECT_EQ(320u, sps_->width);
-  EXPECT_EQ(180u, sps_->height);
-  EXPECT_EQ(1u, sps_->id);
-}
-
-TEST_F(H264SpsParserTest, TestSyntheticSPSWeirdResolution) {
-  rtc::Buffer buffer;
-  GenerateFakeSps(156u, 122u, 2, &buffer);
-  EXPECT_TRUE(static_cast<bool>(
-      sps_ = SpsParser::ParseSps(buffer.data(), buffer.size())));
-  EXPECT_EQ(156u, sps_->width);
-  EXPECT_EQ(122u, sps_->height);
-  EXPECT_EQ(2u, sps_->id);
-}
-
-}  // namespace webrtc
diff --git a/common_video/h264/sps_vui_rewriter.cc b/common_video/h264/sps_vui_rewriter.cc
deleted file mode 100644
index 1d1b76e..0000000
--- a/common_video/h264/sps_vui_rewriter.cc
+++ /dev/null
@@ -1,363 +0,0 @@
-/*
- *  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/common_video/h264/sps_vui_rewriter.h"
-
-#include <algorithm>
-#include <memory>
-#include <vector>
-
-#include "webrtc/rtc_base/bitbuffer.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/safe_minmax.h"
-
-#include "webrtc/common_video/h264/h264_common.h"
-#include "webrtc/common_video/h264/sps_parser.h"
-
-namespace webrtc {
-
-// The maximum expected growth from adding a VUI to the SPS. It's actually
-// closer to 24 or so, but better safe than sorry.
-const size_t kMaxVuiSpsIncrease = 64;
-
-#define RETURN_FALSE_ON_FAIL(x)                                  \
-  if (!(x)) {                                                    \
-    LOG_F(LS_ERROR) << " (line:" << __LINE__ << ") FAILED: " #x; \
-    return false;                                                \
-  }
-
-#define COPY_UINT8(src, dest, tmp)                   \
-  do {                                               \
-    RETURN_FALSE_ON_FAIL((src)->ReadUInt8(&tmp));    \
-    if (dest)                                        \
-      RETURN_FALSE_ON_FAIL((dest)->WriteUInt8(tmp)); \
-  } while (0)
-
-#define COPY_EXP_GOLOMB(src, dest, tmp)                          \
-  do {                                                           \
-    RETURN_FALSE_ON_FAIL((src)->ReadExponentialGolomb(&tmp));    \
-    if (dest)                                                    \
-      RETURN_FALSE_ON_FAIL((dest)->WriteExponentialGolomb(tmp)); \
-  } while (0)
-
-#define COPY_BITS(src, dest, tmp, bits)                   \
-  do {                                                    \
-    RETURN_FALSE_ON_FAIL((src)->ReadBits(&tmp, bits));    \
-    if (dest)                                             \
-      RETURN_FALSE_ON_FAIL((dest)->WriteBits(tmp, bits)); \
-  } while (0)
-
-typedef const SpsParser::SpsState& Sps;
-
-bool CopyAndRewriteVui(Sps sps,
-                       rtc::BitBuffer* source,
-                       rtc::BitBufferWriter* destination,
-                       SpsVuiRewriter::ParseResult* out_vui_rewritten);
-bool CopyHrdParameters(rtc::BitBuffer* source,
-                       rtc::BitBufferWriter* destination);
-bool AddBitstreamRestriction(rtc::BitBufferWriter* destination,
-                             uint32_t max_num_ref_frames);
-bool CopyRemainingBits(rtc::BitBuffer* source,
-                       rtc::BitBufferWriter* destination);
-
-SpsVuiRewriter::ParseResult SpsVuiRewriter::ParseAndRewriteSps(
-    const uint8_t* buffer,
-    size_t length,
-    rtc::Optional<SpsParser::SpsState>* sps,
-    rtc::Buffer* destination) {
-  // Create temporary RBSP decoded buffer of the payload (exlcuding the
-  // leading nalu type header byte (the SpsParser uses only the payload).
-  std::vector<uint8_t> rbsp_buffer = H264::ParseRbsp(buffer, length);
-  rtc::BitBuffer source_buffer(rbsp_buffer.data(), rbsp_buffer.size());
-  rtc::Optional<SpsParser::SpsState> sps_state =
-      SpsParser::ParseSpsUpToVui(&source_buffer);
-  if (!sps_state)
-    return ParseResult::kFailure;
-
-  *sps = sps_state;
-
-  if (sps_state->pic_order_cnt_type >= 2) {
-    // No need to rewrite VUI in this case.
-    return ParseResult::kPocOk;
-  }
-
-  // We're going to completely muck up alignment, so we need a BitBuffer to
-  // write with.
-  rtc::Buffer out_buffer(length + kMaxVuiSpsIncrease);
-  rtc::BitBufferWriter sps_writer(out_buffer.data(), out_buffer.size());
-
-  // Check how far the SpsParser has read, and copy that data in bulk.
-  size_t byte_offset;
-  size_t bit_offset;
-  source_buffer.GetCurrentOffset(&byte_offset, &bit_offset);
-  memcpy(out_buffer.data(), rbsp_buffer.data(),
-         byte_offset + (bit_offset > 0 ? 1 : 0));  // OK to copy the last bits.
-
-  // SpsParser will have read the vui_params_present flag, which we want to
-  // modify, so back off a bit;
-  if (bit_offset == 0) {
-    --byte_offset;
-    bit_offset = 7;
-  } else {
-    --bit_offset;
-  }
-  sps_writer.Seek(byte_offset, bit_offset);
-
-  ParseResult vui_updated;
-  if (!CopyAndRewriteVui(*sps_state, &source_buffer, &sps_writer,
-                         &vui_updated)) {
-    LOG(LS_ERROR) << "Failed to parse/copy SPS VUI.";
-    return ParseResult::kFailure;
-  }
-
-  if (vui_updated == ParseResult::kVuiOk) {
-    // No update necessary after all, just return.
-    return vui_updated;
-  }
-
-  if (!CopyRemainingBits(&source_buffer, &sps_writer)) {
-    LOG(LS_ERROR) << "Failed to parse/copy SPS VUI.";
-    return ParseResult::kFailure;
-  }
-
-  // Pad up to next byte with zero bits.
-  sps_writer.GetCurrentOffset(&byte_offset, &bit_offset);
-  if (bit_offset > 0) {
-    sps_writer.WriteBits(0, 8 - bit_offset);
-    ++byte_offset;
-    bit_offset = 0;
-  }
-
-  RTC_DCHECK(byte_offset <= length + kMaxVuiSpsIncrease);
-  RTC_CHECK(destination != nullptr);
-
-  out_buffer.SetSize(byte_offset);
-
-  // Write updates SPS to destination with added RBSP
-  H264::WriteRbsp(out_buffer.data(), out_buffer.size(), destination);
-
-  return ParseResult::kVuiRewritten;
-}
-
-bool CopyAndRewriteVui(Sps sps,
-                       rtc::BitBuffer* source,
-                       rtc::BitBufferWriter* destination,
-                       SpsVuiRewriter::ParseResult* out_vui_rewritten) {
-  uint32_t golomb_tmp;
-  uint32_t bits_tmp;
-
-  //
-  // vui_parameters_present_flag: u(1)
-  //
-  RETURN_FALSE_ON_FAIL(destination->WriteBits(1, 1));
-
-  // ********* IMPORTANT! **********
-  // Now we're at the VUI, so we want to (1) add it if it isn't present, and
-  // (2) rewrite frame reordering values so no reordering is allowed.
-  if (!sps.vui_params_present) {
-    // Write a simple VUI with the parameters we want and 0 for all other flags.
-    // There are 8 flags to be off before the bitstream restriction flag.
-    RETURN_FALSE_ON_FAIL(destination->WriteBits(0, 8));
-    // bitstream_restriction_flag: u(1)
-    RETURN_FALSE_ON_FAIL(destination->WriteBits(1, 1));
-    RETURN_FALSE_ON_FAIL(
-        AddBitstreamRestriction(destination, sps.max_num_ref_frames));
-  } else {
-    // Parse out the full VUI.
-    // aspect_ratio_info_present_flag: u(1)
-    COPY_BITS(source, destination, bits_tmp, 1);
-    if (bits_tmp == 1) {
-      // aspect_ratio_idc: u(8)
-      COPY_BITS(source, destination, bits_tmp, 8);
-      if (bits_tmp == 255u) {  // Extended_SAR
-        // sar_width/sar_height: u(16) each.
-        COPY_BITS(source, destination, bits_tmp, 32);
-      }
-    }
-    // overscan_info_present_flag: u(1)
-    COPY_BITS(source, destination, bits_tmp, 1);
-    if (bits_tmp == 1) {
-      // overscan_appropriate_flag: u(1)
-      COPY_BITS(source, destination, bits_tmp, 1);
-    }
-    // video_signal_type_present_flag: u(1)
-    COPY_BITS(source, destination, bits_tmp, 1);
-    if (bits_tmp == 1) {
-      // video_format + video_full_range_flag: u(3) + u(1)
-      COPY_BITS(source, destination, bits_tmp, 4);
-      // colour_description_present_flag: u(1)
-      COPY_BITS(source, destination, bits_tmp, 1);
-      if (bits_tmp == 1) {
-        // colour_primaries, transfer_characteristics, matrix_coefficients:
-        // u(8) each.
-        COPY_BITS(source, destination, bits_tmp, 24);
-      }
-    }
-    // chroma_loc_info_present_flag: u(1)
-    COPY_BITS(source, destination, bits_tmp, 1);
-    if (bits_tmp == 1) {
-      // chroma_sample_loc_type_(top|bottom)_field: ue(v) each.
-      COPY_EXP_GOLOMB(source, destination, golomb_tmp);
-      COPY_EXP_GOLOMB(source, destination, golomb_tmp);
-    }
-    // timing_info_present_flag: u(1)
-    COPY_BITS(source, destination, bits_tmp, 1);
-    if (bits_tmp == 1) {
-      // num_units_in_tick, time_scale: u(32) each
-      COPY_BITS(source, destination, bits_tmp, 32);
-      COPY_BITS(source, destination, bits_tmp, 32);
-      // fixed_frame_rate_flag: u(1)
-      COPY_BITS(source, destination, bits_tmp, 1);
-    }
-    // nal_hrd_parameters_present_flag: u(1)
-    uint32_t nal_hrd_parameters_present_flag;
-    COPY_BITS(source, destination, nal_hrd_parameters_present_flag, 1);
-    if (nal_hrd_parameters_present_flag == 1) {
-      RETURN_FALSE_ON_FAIL(CopyHrdParameters(source, destination));
-    }
-    // vcl_hrd_parameters_present_flag: u(1)
-    uint32_t vcl_hrd_parameters_present_flag;
-    COPY_BITS(source, destination, vcl_hrd_parameters_present_flag, 1);
-    if (vcl_hrd_parameters_present_flag == 1) {
-      RETURN_FALSE_ON_FAIL(CopyHrdParameters(source, destination));
-    }
-    if (nal_hrd_parameters_present_flag == 1 ||
-        vcl_hrd_parameters_present_flag == 1) {
-      // low_delay_hrd_flag: u(1)
-      COPY_BITS(source, destination, bits_tmp, 1);
-    }
-    // pic_struct_present_flag: u(1)
-    COPY_BITS(source, destination, bits_tmp, 1);
-
-    // bitstream_restriction_flag: u(1)
-    uint32_t bitstream_restriction_flag;
-    RETURN_FALSE_ON_FAIL(source->ReadBits(&bitstream_restriction_flag, 1));
-    RETURN_FALSE_ON_FAIL(destination->WriteBits(1, 1));
-    if (bitstream_restriction_flag == 0) {
-      // We're adding one from scratch.
-      RETURN_FALSE_ON_FAIL(
-          AddBitstreamRestriction(destination, sps.max_num_ref_frames));
-    } else {
-      // We're replacing.
-      // motion_vectors_over_pic_boundaries_flag: u(1)
-      COPY_BITS(source, destination, bits_tmp, 1);
-      // max_bytes_per_pic_denom: ue(v)
-      COPY_EXP_GOLOMB(source, destination, golomb_tmp);
-      // max_bits_per_mb_denom: ue(v)
-      COPY_EXP_GOLOMB(source, destination, golomb_tmp);
-      // log2_max_mv_length_horizontal: ue(v)
-      COPY_EXP_GOLOMB(source, destination, golomb_tmp);
-      // log2_max_mv_length_vertical: ue(v)
-      COPY_EXP_GOLOMB(source, destination, golomb_tmp);
-      // ********* IMPORTANT! **********
-      // The next two are the ones we need to set to low numbers:
-      // max_num_reorder_frames: ue(v)
-      // max_dec_frame_buffering: ue(v)
-      // However, if they are already set to no greater than the numbers we
-      // want, then we don't need to be rewriting.
-      uint32_t max_num_reorder_frames, max_dec_frame_buffering;
-      RETURN_FALSE_ON_FAIL(
-          source->ReadExponentialGolomb(&max_num_reorder_frames));
-      RETURN_FALSE_ON_FAIL(
-          source->ReadExponentialGolomb(&max_dec_frame_buffering));
-      if (max_num_reorder_frames == 0 &&
-          max_dec_frame_buffering <= sps.max_num_ref_frames) {
-        LOG(LS_INFO) << "VUI bitstream already contains an optimal VUI.";
-        *out_vui_rewritten = SpsVuiRewriter::ParseResult::kVuiOk;
-        return true;
-      }
-      RETURN_FALSE_ON_FAIL(destination->WriteExponentialGolomb(0));
-      RETURN_FALSE_ON_FAIL(
-          destination->WriteExponentialGolomb(sps.max_num_ref_frames));
-    }
-  }
-  *out_vui_rewritten = SpsVuiRewriter::ParseResult::kVuiRewritten;
-  return true;
-}
-
-// Copies a VUI HRD parameters segment.
-bool CopyHrdParameters(rtc::BitBuffer* source,
-                       rtc::BitBufferWriter* destination) {
-  uint32_t golomb_tmp;
-  uint32_t bits_tmp;
-
-  // cbp_cnt_minus1: ue(v)
-  uint32_t cbp_cnt_minus1;
-  COPY_EXP_GOLOMB(source, destination, cbp_cnt_minus1);
-  // bit_rate_scale and cbp_size_scale: u(4) each
-  COPY_BITS(source, destination, bits_tmp, 8);
-  for (size_t i = 0; i <= cbp_cnt_minus1; ++i) {
-    // bit_rate_value_minus1 and cbp_size_value_minus1: ue(v) each
-    COPY_EXP_GOLOMB(source, destination, golomb_tmp);
-    COPY_EXP_GOLOMB(source, destination, golomb_tmp);
-    // cbr_flag: u(1)
-    COPY_BITS(source, destination, bits_tmp, 1);
-  }
-  // initial_cbp_removal_delay_length_minus1: u(5)
-  COPY_BITS(source, destination, bits_tmp, 5);
-  // cbp_removal_delay_length_minus1: u(5)
-  COPY_BITS(source, destination, bits_tmp, 5);
-  // dbp_output_delay_length_minus1: u(5)
-  COPY_BITS(source, destination, bits_tmp, 5);
-  // time_offset_length: u(5)
-  COPY_BITS(source, destination, bits_tmp, 5);
-  return true;
-}
-
-// These functions are similar to webrtc::H264SpsParser::Parse, and based on the
-// same version of the H.264 standard. You can find it here:
-// http://www.itu.int/rec/T-REC-H.264
-
-// Adds a bitstream restriction VUI segment.
-bool AddBitstreamRestriction(rtc::BitBufferWriter* destination,
-                             uint32_t max_num_ref_frames) {
-  // motion_vectors_over_pic_boundaries_flag: u(1)
-  // Default is 1 when not present.
-  RETURN_FALSE_ON_FAIL(destination->WriteBits(1, 1));
-  // max_bytes_per_pic_denom: ue(v)
-  // Default is 2 when not present.
-  RETURN_FALSE_ON_FAIL(destination->WriteExponentialGolomb(2));
-  // max_bits_per_mb_denom: ue(v)
-  // Default is 1 when not present.
-  RETURN_FALSE_ON_FAIL(destination->WriteExponentialGolomb(1));
-  // log2_max_mv_length_horizontal: ue(v)
-  // log2_max_mv_length_vertical: ue(v)
-  // Both default to 16 when not present.
-  RETURN_FALSE_ON_FAIL(destination->WriteExponentialGolomb(16));
-  RETURN_FALSE_ON_FAIL(destination->WriteExponentialGolomb(16));
-
-  // ********* IMPORTANT! **********
-  // max_num_reorder_frames: ue(v)
-  RETURN_FALSE_ON_FAIL(destination->WriteExponentialGolomb(0));
-  // max_dec_frame_buffering: ue(v)
-  RETURN_FALSE_ON_FAIL(destination->WriteExponentialGolomb(max_num_ref_frames));
-  return true;
-}
-
-bool CopyRemainingBits(rtc::BitBuffer* source,
-                       rtc::BitBufferWriter* destination) {
-  uint32_t bits_tmp;
-  // Try to get at least the destination aligned.
-  if (source->RemainingBitCount() > 0 && source->RemainingBitCount() % 8 != 0) {
-    size_t misaligned_bits = source->RemainingBitCount() % 8;
-    COPY_BITS(source, destination, bits_tmp, misaligned_bits);
-  }
-  while (source->RemainingBitCount() > 0) {
-    auto count = rtc::SafeMin<size_t>(32u, source->RemainingBitCount());
-    COPY_BITS(source, destination, bits_tmp, count);
-  }
-  // TODO(noahric): The last byte could be all zeroes now, which we should just
-  // strip.
-  return true;
-}
-
-}  // namespace webrtc
diff --git a/common_video/h264/sps_vui_rewriter.h b/common_video/h264/sps_vui_rewriter.h
deleted file mode 100644
index 7875117..0000000
--- a/common_video/h264/sps_vui_rewriter.h
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- *  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_COMMON_VIDEO_H264_SPS_VUI_REWRITER_H_
-#define WEBRTC_COMMON_VIDEO_H264_SPS_VUI_REWRITER_H_
-
-#include "webrtc/api/optional.h"
-#include "webrtc/common_video/h264/sps_parser.h"
-#include "webrtc/rtc_base/buffer.h"
-
-namespace rtc {
-class BitBuffer;
-}
-
-namespace webrtc {
-
-// A class that can parse an SPS block of a NAL unit and if necessary
-// creates a copy with updated settings to allow for faster decoding for streams
-// that use picture order count type 0. Streams in that format incur additional
-// delay because it allows decode order to differ from render order.
-// The mechanism used is to rewrite (edit or add) the SPS's VUI to contain
-// restrictions on the maximum number of reordered pictures. This reduces
-// latency significantly, though it still adds about a frame of latency to
-// decoding.
-class SpsVuiRewriter : private SpsParser {
- public:
-  enum class ParseResult { kFailure, kPocOk, kVuiOk, kVuiRewritten };
-
-  // Parses an SPS block and if necessary copies it and rewrites the VUI.
-  // Returns kFailure on failure, kParseOk if parsing succeeded and no update
-  // was necessary and kParsedAndModified if an updated copy of buffer was
-  // written to destination. destination may be populated with some data even if
-  // no rewrite was necessary, but the end offset should remain unchanged.
-  // Unless parsing fails, the sps parameter will be populated with the parsed
-  // SPS state. This function assumes that any previous headers
-  // (NALU start, type, Stap-A, etc) have already been parsed and that RBSP
-  // decoding has been performed.
-  static ParseResult ParseAndRewriteSps(const uint8_t* buffer,
-                                        size_t length,
-                                        rtc::Optional<SpsParser::SpsState>* sps,
-                                        rtc::Buffer* destination);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_COMMON_VIDEO_H264_SPS_VUI_REWRITER_H_
diff --git a/common_video/h264/sps_vui_rewriter_unittest.cc b/common_video/h264/sps_vui_rewriter_unittest.cc
deleted file mode 100644
index 4f36e58..0000000
--- a/common_video/h264/sps_vui_rewriter_unittest.cc
+++ /dev/null
@@ -1,191 +0,0 @@
-/*
- *  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 <vector>
-
-#include "webrtc/common_video/h264/h264_common.h"
-#include "webrtc/common_video/h264/sps_vui_rewriter.h"
-#include "webrtc/rtc_base/bitbuffer.h"
-#include "webrtc/rtc_base/buffer.h"
-#include "webrtc/rtc_base/fileutils.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/pathutils.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-enum SpsMode {
-  kNoRewriteRequired_PocCorrect,
-  kNoRewriteRequired_VuiOptimal,
-  kRewriteRequired_NoVui,
-  kRewriteRequired_NoBitstreamRestriction,
-  kRewriteRequired_VuiSuboptimal,
-};
-
-static const size_t kSpsBufferMaxSize = 256;
-static const size_t kWidth = 640;
-static const size_t kHeight = 480;
-
-// Generates a fake SPS with basically everything empty and with characteristics
-// based off SpsMode.
-// Pass in a buffer of at least kSpsBufferMaxSize.
-// The fake SPS that this generates also always has at least one emulation byte
-// at offset 2, since the first two bytes are always 0, and has a 0x3 as the
-// level_idc, to make sure the parser doesn't eat all 0x3 bytes.
-void GenerateFakeSps(SpsMode mode, rtc::Buffer* out_buffer) {
-  uint8_t rbsp[kSpsBufferMaxSize] = {0};
-  rtc::BitBufferWriter writer(rbsp, kSpsBufferMaxSize);
-  // Profile byte.
-  writer.WriteUInt8(0);
-  // Constraint sets and reserved zero bits.
-  writer.WriteUInt8(0);
-  // level_idc.
-  writer.WriteUInt8(3);
-  // seq_paramter_set_id.
-  writer.WriteExponentialGolomb(0);
-  // Profile is not special, so we skip all the chroma format settings.
-
-  // Now some bit magic.
-  // log2_max_frame_num_minus4: ue(v). 0 is fine.
-  writer.WriteExponentialGolomb(0);
-  // pic_order_cnt_type: ue(v).
-  // POC type 2 is the one that doesn't need to be rewritten.
-  if (mode == kNoRewriteRequired_PocCorrect) {
-    writer.WriteExponentialGolomb(2);
-  } else {
-    writer.WriteExponentialGolomb(0);
-    // log2_max_pic_order_cnt_lsb_minus4: ue(v). 0 is fine.
-    writer.WriteExponentialGolomb(0);
-  }
-  // max_num_ref_frames: ue(v). Use 1, to make optimal/suboptimal more obvious.
-  writer.WriteExponentialGolomb(1);
-  // gaps_in_frame_num_value_allowed_flag: u(1).
-  writer.WriteBits(0, 1);
-  // Next are width/height. First, calculate the mbs/map_units versions.
-  uint16_t width_in_mbs_minus1 = (kWidth + 15) / 16 - 1;
-
-  // For the height, we're going to define frame_mbs_only_flag, so we need to
-  // divide by 2. See the parser for the full calculation.
-  uint16_t height_in_map_units_minus1 = ((kHeight + 15) / 16 - 1) / 2;
-  // Write each as ue(v).
-  writer.WriteExponentialGolomb(width_in_mbs_minus1);
-  writer.WriteExponentialGolomb(height_in_map_units_minus1);
-  // frame_mbs_only_flag: u(1). Needs to be false.
-  writer.WriteBits(0, 1);
-  // mb_adaptive_frame_field_flag: u(1).
-  writer.WriteBits(0, 1);
-  // direct_8x8_inferene_flag: u(1).
-  writer.WriteBits(0, 1);
-  // frame_cropping_flag: u(1). 1, so we can supply crop.
-  writer.WriteBits(1, 1);
-  // Now we write the left/right/top/bottom crop. For simplicity, we'll put all
-  // the crop at the left/top.
-  // We picked a 4:2:0 format, so the crops are 1/2 the pixel crop values.
-  // Left/right.
-  writer.WriteExponentialGolomb(((16 - (kWidth % 16)) % 16) / 2);
-  writer.WriteExponentialGolomb(0);
-  // Top/bottom.
-  writer.WriteExponentialGolomb(((16 - (kHeight % 16)) % 16) / 2);
-  writer.WriteExponentialGolomb(0);
-
-  // Finally! The VUI.
-  // vui_parameters_present_flag: u(1)
-  if (mode == kNoRewriteRequired_PocCorrect || mode == kRewriteRequired_NoVui) {
-    writer.WriteBits(0, 1);
-  } else {
-    writer.WriteBits(1, 1);
-    // VUI time. 8 flags to ignore followed by the bitstream restriction flag.
-    writer.WriteBits(0, 8);
-    if (mode == kRewriteRequired_NoBitstreamRestriction) {
-      writer.WriteBits(0, 1);
-    } else {
-      writer.WriteBits(1, 1);
-      // Write some defaults. Shouldn't matter for parsing, though.
-      // motion_vectors_over_pic_boundaries_flag: u(1)
-      writer.WriteBits(1, 1);
-      // max_bytes_per_pic_denom: ue(v)
-      writer.WriteExponentialGolomb(2);
-      // max_bits_per_mb_denom: ue(v)
-      writer.WriteExponentialGolomb(1);
-      // log2_max_mv_length_horizontal: ue(v)
-      // log2_max_mv_length_vertical: ue(v)
-      writer.WriteExponentialGolomb(16);
-      writer.WriteExponentialGolomb(16);
-
-      // Next are the limits we care about.
-      // max_num_reorder_frames: ue(v)
-      // max_dec_frame_buffering: ue(v)
-      if (mode == kRewriteRequired_VuiSuboptimal) {
-        writer.WriteExponentialGolomb(4);
-        writer.WriteExponentialGolomb(4);
-      } else if (kNoRewriteRequired_VuiOptimal) {
-        writer.WriteExponentialGolomb(0);
-        writer.WriteExponentialGolomb(1);
-      }
-    }
-  }
-
-  // Get the number of bytes written (including the last partial byte).
-  size_t byte_count, bit_offset;
-  writer.GetCurrentOffset(&byte_count, &bit_offset);
-  if (bit_offset > 0) {
-    byte_count++;
-  }
-
-  // Write the NALU header and type; {0 0 0 1} and 7 for the SPS header type.
-  uint8_t header[] = {0, 0, 0, 1, 7};
-  out_buffer->AppendData(header, sizeof(header));
-
-  H264::WriteRbsp(rbsp, byte_count, out_buffer);
-}
-
-void TestSps(SpsMode mode, SpsVuiRewriter::ParseResult expected_parse_result) {
-  rtc::LogMessage::LogToDebug(rtc::LS_VERBOSE);
-  rtc::Buffer buffer;
-  GenerateFakeSps(mode, &buffer);
-  std::vector<H264::NaluIndex> start_offsets =
-      H264::FindNaluIndices(buffer.data(), buffer.size());
-  EXPECT_EQ(1u, start_offsets.size());
-  H264::NaluIndex index = start_offsets[0];
-
-  H264::NaluType nal_type =
-      H264::ParseNaluType(buffer[index.payload_start_offset]);
-  EXPECT_EQ(H264::kSps, nal_type);
-  index.payload_start_offset += H264::kNaluTypeSize;
-  index.payload_size -= H264::kNaluTypeSize;
-
-  rtc::Optional<SpsParser::SpsState> sps;
-  rtc::Buffer out_buffer;
-  SpsVuiRewriter::ParseResult result =
-      SpsVuiRewriter::ParseAndRewriteSps(&buffer[index.payload_start_offset],
-                                         index.payload_size, &sps, &out_buffer);
-  EXPECT_EQ(expected_parse_result, result);
-}
-
-#define REWRITE_TEST(test_name, mode, expected_parse_result) \
-  TEST(SpsVuiRewriterTest, test_name) { TestSps(mode, expected_parse_result); }
-
-REWRITE_TEST(PocCorrect,
-             kNoRewriteRequired_PocCorrect,
-             SpsVuiRewriter::ParseResult::kPocOk);
-REWRITE_TEST(VuiAlreadyOptimal,
-             kNoRewriteRequired_VuiOptimal,
-             SpsVuiRewriter::ParseResult::kVuiOk);
-REWRITE_TEST(RewriteFullVui,
-             kRewriteRequired_NoVui,
-             SpsVuiRewriter::ParseResult::kVuiRewritten);
-REWRITE_TEST(AddBitstreamRestriction,
-             kRewriteRequired_NoBitstreamRestriction,
-             SpsVuiRewriter::ParseResult::kVuiRewritten);
-REWRITE_TEST(RewriteSuboptimalVui,
-             kRewriteRequired_VuiSuboptimal,
-             SpsVuiRewriter::ParseResult::kVuiRewritten);
-
-}  // namespace webrtc
diff --git a/common_video/i420_buffer_pool.cc b/common_video/i420_buffer_pool.cc
deleted file mode 100644
index 8dab614..0000000
--- a/common_video/i420_buffer_pool.cc
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- *  Copyright (c) 2015 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/common_video/include/i420_buffer_pool.h"
-
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-
-I420BufferPool::I420BufferPool(bool zero_initialize,
-                               size_t max_number_of_buffers)
-    : zero_initialize_(zero_initialize),
-      max_number_of_buffers_(max_number_of_buffers) {}
-
-void I420BufferPool::Release() {
-  buffers_.clear();
-}
-
-rtc::scoped_refptr<I420Buffer> I420BufferPool::CreateBuffer(int width,
-                                                            int height) {
-  RTC_DCHECK_RUNS_SERIALIZED(&race_checker_);
-  // Release buffers with wrong resolution.
-  for (auto it = buffers_.begin(); it != buffers_.end();) {
-    if ((*it)->width() != width || (*it)->height() != height)
-      it = buffers_.erase(it);
-    else
-      ++it;
-  }
-  // Look for a free buffer.
-  for (const rtc::scoped_refptr<PooledI420Buffer>& buffer : buffers_) {
-    // If the buffer is in use, the ref count will be >= 2, one from the list we
-    // are looping over and one from the application. If the ref count is 1,
-    // then the list we are looping over holds the only reference and it's safe
-    // to reuse.
-    if (buffer->HasOneRef())
-      return buffer;
-  }
-
-  if (buffers_.size() >= max_number_of_buffers_)
-    return nullptr;
-  // Allocate new buffer.
-  rtc::scoped_refptr<PooledI420Buffer> buffer =
-      new PooledI420Buffer(width, height);
-  if (zero_initialize_)
-    buffer->InitializeData();
-  buffers_.push_back(buffer);
-  return buffer;
-}
-
-}  // namespace webrtc
diff --git a/common_video/i420_buffer_pool_unittest.cc b/common_video/i420_buffer_pool_unittest.cc
deleted file mode 100644
index 77aa086..0000000
--- a/common_video/i420_buffer_pool_unittest.cc
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- *  Copyright (c) 2015 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 <string>
-
-#include "webrtc/common_video/include/i420_buffer_pool.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-TEST(TestI420BufferPool, SimpleFrameReuse) {
-  I420BufferPool pool;
-  rtc::scoped_refptr<I420BufferInterface> buffer = pool.CreateBuffer(16, 16);
-  EXPECT_EQ(16, buffer->width());
-  EXPECT_EQ(16, buffer->height());
-  // Extract non-refcounted pointers for testing.
-  const uint8_t* y_ptr = buffer->DataY();
-  const uint8_t* u_ptr = buffer->DataU();
-  const uint8_t* v_ptr = buffer->DataV();
-  // Release buffer so that it is returned to the pool.
-  buffer = nullptr;
-  // Check that the memory is resued.
-  buffer = pool.CreateBuffer(16, 16);
-  EXPECT_EQ(y_ptr, buffer->DataY());
-  EXPECT_EQ(u_ptr, buffer->DataU());
-  EXPECT_EQ(v_ptr, buffer->DataV());
-  EXPECT_EQ(16, buffer->width());
-  EXPECT_EQ(16, buffer->height());
-}
-
-TEST(TestI420BufferPool, FailToReuse) {
-  I420BufferPool pool;
-  rtc::scoped_refptr<I420BufferInterface> buffer = pool.CreateBuffer(16, 16);
-  // Extract non-refcounted pointers for testing.
-  const uint8_t* u_ptr = buffer->DataU();
-  const uint8_t* v_ptr = buffer->DataV();
-  // Release buffer so that it is returned to the pool.
-  buffer = nullptr;
-  // Check that the pool doesn't try to reuse buffers of incorrect size.
-  buffer = pool.CreateBuffer(32, 16);
-  EXPECT_EQ(32, buffer->width());
-  EXPECT_EQ(16, buffer->height());
-  EXPECT_NE(u_ptr, buffer->DataU());
-  EXPECT_NE(v_ptr, buffer->DataV());
-}
-
-TEST(TestI420BufferPool, FrameValidAfterPoolDestruction) {
-  rtc::scoped_refptr<I420Buffer> buffer;
-  {
-    I420BufferPool pool;
-    buffer = pool.CreateBuffer(16, 16);
-  }
-  EXPECT_EQ(16, buffer->width());
-  EXPECT_EQ(16, buffer->height());
-  // Try to trigger use-after-free errors by writing to y-plane.
-  memset(buffer->MutableDataY(), 0xA5, 16 * buffer->StrideY());
-}
-
-TEST(TestI420BufferPool, MaxNumberOfBuffers) {
-  I420BufferPool pool(false, 1);
-  rtc::scoped_refptr<I420BufferInterface> buffer1 = pool.CreateBuffer(16, 16);
-  EXPECT_NE(nullptr, buffer1.get());
-  EXPECT_EQ(nullptr, pool.CreateBuffer(16, 16).get());
-}
-
-}  // namespace webrtc
diff --git a/common_video/i420_video_frame_unittest.cc b/common_video/i420_video_frame_unittest.cc
deleted file mode 100644
index 025c54b..0000000
--- a/common_video/i420_video_frame_unittest.cc
+++ /dev/null
@@ -1,298 +0,0 @@
-/*
- *  Copyright (c) 2012 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 <math.h>
-#include <string.h>
-
-#include "webrtc/api/video/i420_buffer.h"
-#include "webrtc/api/video/video_frame.h"
-#include "webrtc/rtc_base/bind.h"
-#include "webrtc/rtc_base/timeutils.h"
-#include "webrtc/test/fake_texture_frame.h"
-#include "webrtc/test/frame_utils.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-namespace {
-
-rtc::scoped_refptr<I420Buffer> CreateGradient(int width, int height) {
-  rtc::scoped_refptr<I420Buffer> buffer(
-      I420Buffer::Create(width, height));
-  // Initialize with gradient, Y = 128(x/w + y/h), U = 256 x/w, V = 256 y/h
-  for (int x = 0; x < width; x++) {
-    for (int y = 0; y < height; y++) {
-      buffer->MutableDataY()[x + y * width] =
-          128 * (x * height + y * width) / (width * height);
-    }
-  }
-  int chroma_width = buffer->ChromaWidth();
-  int chroma_height = buffer->ChromaHeight();
-  for (int x = 0; x < chroma_width; x++) {
-    for (int y = 0; y < chroma_height; y++) {
-      buffer->MutableDataU()[x + y * chroma_width] =
-          255 * x / (chroma_width - 1);
-      buffer->MutableDataV()[x + y * chroma_width] =
-          255 * y / (chroma_height - 1);
-    }
-  }
-  return buffer;
-}
-
-// The offsets and sizes describe the rectangle extracted from the
-// original (gradient) frame, in relative coordinates where the
-// original frame correspond to the unit square, 0.0 <= x, y < 1.0.
-void CheckCrop(const webrtc::I420BufferInterface& frame,
-               double offset_x,
-               double offset_y,
-               double rel_width,
-               double rel_height) {
-  int width = frame.width();
-  int height = frame.height();
-  // Check that pixel values in the corners match the gradient used
-  // for initialization.
-  for (int i = 0; i < 2; i++) {
-    for (int j = 0; j < 2; j++) {
-      // Pixel coordinates of the corner.
-      int x = i * (width - 1);
-      int y = j * (height - 1);
-      // Relative coordinates, range 0.0 - 1.0 correspond to the
-      // size of the uncropped input frame.
-      double orig_x = offset_x + i * rel_width;
-      double orig_y = offset_y + j * rel_height;
-
-      EXPECT_NEAR(frame.DataY()[x + y * frame.StrideY()] / 256.0,
-                  (orig_x + orig_y) / 2, 0.02);
-      EXPECT_NEAR(frame.DataU()[x / 2 + (y / 2) * frame.StrideU()] / 256.0,
-                  orig_x, 0.02);
-      EXPECT_NEAR(frame.DataV()[x / 2 + (y / 2) * frame.StrideV()] / 256.0,
-                  orig_y, 0.02);
-    }
-  }
-}
-
-void CheckRotate(int width,
-                 int height,
-                 webrtc::VideoRotation rotation,
-                 const webrtc::I420BufferInterface& rotated) {
-  int rotated_width = width;
-  int rotated_height = height;
-
-  if (rotation == kVideoRotation_90 || rotation == kVideoRotation_270) {
-    std::swap(rotated_width, rotated_height);
-  }
-  EXPECT_EQ(rotated_width, rotated.width());
-  EXPECT_EQ(rotated_height, rotated.height());
-
-  // Clock-wise order (with 0,0 at top-left)
-  const struct { int x; int y; } corners[] = {
-    { 0, 0 }, { 1, 0 }, { 1, 1 }, { 0, 1 }
-  };
-  // Corresponding corner colors of the frame produced by CreateGradient.
-  const struct { int y; int u; int v; } colors[] = {
-    {0, 0, 0}, { 127, 255, 0}, { 255, 255, 255 }, {127, 0, 255}
-  };
-  int corner_offset = static_cast<int>(rotation) / 90;
-
-  for (int i = 0; i < 4; i++) {
-    int j = (i + corner_offset) % 4;
-    int x = corners[j].x * (rotated_width - 1);
-    int y = corners[j].y * (rotated_height - 1);
-    EXPECT_EQ(colors[i].y, rotated.DataY()[x + y * rotated.StrideY()]);
-    EXPECT_EQ(colors[i].u,
-              rotated.DataU()[(x / 2) + (y / 2) * rotated.StrideU()]);
-    EXPECT_EQ(colors[i].v,
-              rotated.DataV()[(x / 2) + (y / 2) * rotated.StrideV()]);
-  }
-}
-
-}  // namespace
-
-TEST(TestVideoFrame, WidthHeightValues) {
-  VideoFrame frame(I420Buffer::Create(10, 10, 10, 14, 90),
-                   webrtc::kVideoRotation_0,
-                   789 * rtc::kNumMicrosecsPerMillisec);
-  const int valid_value = 10;
-  EXPECT_EQ(valid_value, frame.width());
-  EXPECT_EQ(valid_value, frame.height());
-  frame.set_timestamp(123u);
-  EXPECT_EQ(123u, frame.timestamp());
-  frame.set_ntp_time_ms(456);
-  EXPECT_EQ(456, frame.ntp_time_ms());
-  EXPECT_EQ(789, frame.render_time_ms());
-}
-
-TEST(TestVideoFrame, ShallowCopy) {
-  uint32_t timestamp = 1;
-  int64_t ntp_time_ms = 2;
-  int64_t timestamp_us = 3;
-  int stride_y = 15;
-  int stride_u = 10;
-  int stride_v = 10;
-  int width = 15;
-  int height = 15;
-
-  const int kSizeY = 400;
-  const int kSizeU = 100;
-  const int kSizeV = 100;
-  const VideoRotation kRotation = kVideoRotation_270;
-  uint8_t buffer_y[kSizeY];
-  uint8_t buffer_u[kSizeU];
-  uint8_t buffer_v[kSizeV];
-  memset(buffer_y, 16, kSizeY);
-  memset(buffer_u, 8, kSizeU);
-  memset(buffer_v, 4, kSizeV);
-
-  VideoFrame frame1(
-      I420Buffer::Copy(width, height,
-                       buffer_y, stride_y,
-                       buffer_u, stride_u,
-                       buffer_v, stride_v),
-      kRotation, 0);
-  frame1.set_timestamp(timestamp);
-  frame1.set_ntp_time_ms(ntp_time_ms);
-  frame1.set_timestamp_us(timestamp_us);
-  VideoFrame frame2(frame1);
-
-  EXPECT_EQ(frame1.video_frame_buffer(), frame2.video_frame_buffer());
-  rtc::scoped_refptr<I420BufferInterface> yuv1 =
-      frame1.video_frame_buffer()->GetI420();
-  rtc::scoped_refptr<I420BufferInterface> yuv2 =
-      frame2.video_frame_buffer()->GetI420();
-  EXPECT_EQ(yuv1->DataY(), yuv2->DataY());
-  EXPECT_EQ(yuv1->DataU(), yuv2->DataU());
-  EXPECT_EQ(yuv1->DataV(), yuv2->DataV());
-
-  EXPECT_EQ(frame2.timestamp(), frame1.timestamp());
-  EXPECT_EQ(frame2.ntp_time_ms(), frame1.ntp_time_ms());
-  EXPECT_EQ(frame2.timestamp_us(), frame1.timestamp_us());
-  EXPECT_EQ(frame2.rotation(), frame1.rotation());
-
-  frame2.set_timestamp(timestamp + 1);
-  frame2.set_ntp_time_ms(ntp_time_ms + 1);
-  frame2.set_timestamp_us(timestamp_us + 1);
-  frame2.set_rotation(kVideoRotation_90);
-
-  EXPECT_NE(frame2.timestamp(), frame1.timestamp());
-  EXPECT_NE(frame2.ntp_time_ms(), frame1.ntp_time_ms());
-  EXPECT_NE(frame2.timestamp_us(), frame1.timestamp_us());
-  EXPECT_NE(frame2.rotation(), frame1.rotation());
-}
-
-TEST(TestVideoFrame, TextureInitialValues) {
-  VideoFrame frame = test::FakeNativeBuffer::CreateFrame(
-      640, 480, 100, 10, webrtc::kVideoRotation_0);
-  EXPECT_EQ(640, frame.width());
-  EXPECT_EQ(480, frame.height());
-  EXPECT_EQ(100u, frame.timestamp());
-  EXPECT_EQ(10, frame.render_time_ms());
-  ASSERT_TRUE(frame.video_frame_buffer() != nullptr);
-  EXPECT_TRUE(frame.video_frame_buffer()->type() ==
-              VideoFrameBuffer::Type::kNative);
-
-  frame.set_timestamp(200);
-  EXPECT_EQ(200u, frame.timestamp());
-  frame.set_timestamp_us(20);
-  EXPECT_EQ(20, frame.timestamp_us());
-}
-
-TEST(TestI420FrameBuffer, Copy) {
-  rtc::scoped_refptr<I420Buffer> buf1(
-      I420Buffer::Create(20, 10));
-  memset(buf1->MutableDataY(), 1, 200);
-  memset(buf1->MutableDataU(), 2, 50);
-  memset(buf1->MutableDataV(), 3, 50);
-  rtc::scoped_refptr<I420Buffer> buf2 = I420Buffer::Copy(*buf1);
-  EXPECT_TRUE(test::FrameBufsEqual(buf1, buf2));
-}
-
-TEST(TestI420FrameBuffer, Scale) {
-  rtc::scoped_refptr<I420Buffer> buf = CreateGradient(200, 100);
-
-  // Pure scaling, no cropping.
-  rtc::scoped_refptr<I420Buffer> scaled_buffer(
-      I420Buffer::Create(150, 75));
-
-  scaled_buffer->ScaleFrom(*buf);
-  CheckCrop(*scaled_buffer, 0.0, 0.0, 1.0, 1.0);
-}
-
-TEST(TestI420FrameBuffer, CropXCenter) {
-  rtc::scoped_refptr<I420Buffer> buf = CreateGradient(200, 100);
-
-  // Pure center cropping, no scaling.
-  rtc::scoped_refptr<I420Buffer> scaled_buffer(
-      I420Buffer::Create(100, 100));
-
-  scaled_buffer->CropAndScaleFrom(*buf, 50, 0, 100, 100);
-  CheckCrop(*scaled_buffer, 0.25, 0.0, 0.5, 1.0);
-}
-
-TEST(TestI420FrameBuffer, CropXNotCenter) {
-  rtc::scoped_refptr<I420Buffer> buf = CreateGradient(200, 100);
-
-  // Non-center cropping, no scaling.
-  rtc::scoped_refptr<I420Buffer> scaled_buffer(
-      I420Buffer::Create(100, 100));
-
-  scaled_buffer->CropAndScaleFrom(*buf, 25, 0, 100, 100);
-  CheckCrop(*scaled_buffer, 0.125, 0.0, 0.5, 1.0);
-}
-
-TEST(TestI420FrameBuffer, CropYCenter) {
-  rtc::scoped_refptr<I420Buffer> buf = CreateGradient(100, 200);
-
-  // Pure center cropping, no scaling.
-  rtc::scoped_refptr<I420Buffer> scaled_buffer(
-      I420Buffer::Create(100, 100));
-
-  scaled_buffer->CropAndScaleFrom(*buf, 0, 50, 100, 100);
-  CheckCrop(*scaled_buffer, 0.0, 0.25, 1.0, 0.5);
-}
-
-TEST(TestI420FrameBuffer, CropYNotCenter) {
-  rtc::scoped_refptr<I420Buffer> buf = CreateGradient(100, 200);
-
-  // Non-center cropping, no scaling.
-  rtc::scoped_refptr<I420Buffer> scaled_buffer(
-      I420Buffer::Create(100, 100));
-
-  scaled_buffer->CropAndScaleFrom(*buf, 0, 25, 100, 100);
-  CheckCrop(*scaled_buffer, 0.0, 0.125, 1.0, 0.5);
-}
-
-TEST(TestI420FrameBuffer, CropAndScale16x9) {
-  rtc::scoped_refptr<I420Buffer> buf = CreateGradient(640, 480);
-
-  // Center crop to 640 x 360 (16/9 aspect), then scale down by 2.
-  rtc::scoped_refptr<I420Buffer> scaled_buffer(
-      I420Buffer::Create(320, 180));
-
-  scaled_buffer->CropAndScaleFrom(*buf);
-  CheckCrop(*scaled_buffer, 0.0, 0.125, 1.0, 0.75);
-}
-
-class TestI420BufferRotate
-    : public ::testing::TestWithParam<webrtc::VideoRotation> {};
-
-TEST_P(TestI420BufferRotate, Rotates) {
-  rtc::scoped_refptr<I420BufferInterface> buffer = CreateGradient(640, 480);
-  rtc::scoped_refptr<I420BufferInterface> rotated_buffer =
-      I420Buffer::Rotate(*buffer, GetParam());
-  CheckRotate(640, 480, GetParam(), *rotated_buffer);
-}
-
-INSTANTIATE_TEST_CASE_P(Rotate, TestI420BufferRotate,
-                        ::testing::Values(kVideoRotation_0,
-                                          kVideoRotation_90,
-                                          kVideoRotation_180,
-                                          kVideoRotation_270));
-
-}  // namespace webrtc
diff --git a/common_video/include/bitrate_adjuster.h b/common_video/include/bitrate_adjuster.h
deleted file mode 100644
index d04486c..0000000
--- a/common_video/include/bitrate_adjuster.h
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- *  Copyright 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_COMMON_VIDEO_INCLUDE_BITRATE_ADJUSTER_H_
-#define WEBRTC_COMMON_VIDEO_INCLUDE_BITRATE_ADJUSTER_H_
-
-#include <functional>
-
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/rate_statistics.h"
-
-namespace webrtc {
-
-class Clock;
-
-// Certain hardware encoders tend to consistently overshoot the bitrate that
-// they are configured to encode at. This class estimates an adjusted bitrate
-// that when set on the encoder will produce the desired bitrate.
-class BitrateAdjuster {
- public:
-  // min_adjusted_bitrate_pct and max_adjusted_bitrate_pct are the lower and
-  // upper bound outputted adjusted bitrates as a percentage of the target
-  // bitrate.
-  BitrateAdjuster(Clock* clock,
-                  float min_adjusted_bitrate_pct,
-                  float max_adjusted_bitrate_pct);
-  virtual ~BitrateAdjuster() {}
-
-  static const uint32_t kBitrateUpdateIntervalMs;
-  static const uint32_t kBitrateUpdateFrameInterval;
-  static const float kBitrateTolerancePct;
-  static const float kBytesPerMsToBitsPerSecond;
-
-  // Sets the desired bitrate in bps (bits per second).
-  // Should be called at least once before Update.
-  void SetTargetBitrateBps(uint32_t bitrate_bps);
-  uint32_t GetTargetBitrateBps() const;
-
-  // Returns the adjusted bitrate in bps.
-  uint32_t GetAdjustedBitrateBps() const;
-
-  // Returns what we think the current bitrate is.
-  rtc::Optional<uint32_t> GetEstimatedBitrateBps();
-
-  // This should be called after each frame is encoded. The timestamp at which
-  // it is called is used to estimate the output bitrate of the encoder.
-  // Should be called from only one thread.
-  void Update(size_t frame_size);
-
- private:
-  // Returns true if the bitrate is within kBitrateTolerancePct of bitrate_bps.
-  bool IsWithinTolerance(uint32_t bitrate_bps, uint32_t target_bitrate_bps);
-
-  // Returns smallest possible adjusted value.
-  uint32_t GetMinAdjustedBitrateBps() const RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_);
-  // Returns largest possible adjusted value.
-  uint32_t GetMaxAdjustedBitrateBps() const RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_);
-
-  void Reset();
-  void UpdateBitrate(uint32_t current_time_ms)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_);
-
-  rtc::CriticalSection crit_;
-  Clock* const clock_;
-  const float min_adjusted_bitrate_pct_;
-  const float max_adjusted_bitrate_pct_;
-  // The bitrate we want.
-  volatile uint32_t target_bitrate_bps_ RTC_GUARDED_BY(crit_);
-  // The bitrate we use to get what we want.
-  volatile uint32_t adjusted_bitrate_bps_ RTC_GUARDED_BY(crit_);
-  // The target bitrate that the adjusted bitrate was computed from.
-  volatile uint32_t last_adjusted_target_bitrate_bps_ RTC_GUARDED_BY(crit_);
-  // Used to estimate bitrate.
-  RateStatistics bitrate_tracker_ RTC_GUARDED_BY(crit_);
-  // The last time we tried to adjust the bitrate.
-  uint32_t last_bitrate_update_time_ms_ RTC_GUARDED_BY(crit_);
-  // The number of frames since the last time we tried to adjust the bitrate.
-  uint32_t frames_since_last_update_ RTC_GUARDED_BY(crit_);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_COMMON_VIDEO_INCLUDE_BITRATE_ADJUSTER_H_
diff --git a/common_video/include/frame_callback.h b/common_video/include/frame_callback.h
deleted file mode 100644
index 0a2a905..0000000
--- a/common_video/include/frame_callback.h
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- *  Copyright (c) 2013 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_COMMON_VIDEO_INCLUDE_FRAME_CALLBACK_H_
-#define WEBRTC_COMMON_VIDEO_INCLUDE_FRAME_CALLBACK_H_
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include "webrtc/common_types.h"
-
-namespace webrtc {
-
-class VideoFrame;
-
-struct EncodedFrame {
- public:
-  EncodedFrame()
-      : data_(nullptr),
-        length_(0),
-        frame_type_(kEmptyFrame),
-        stream_id_(0),
-        timestamp_(0) {}
-  EncodedFrame(const uint8_t* data,
-               size_t length,
-               FrameType frame_type,
-               size_t stream_id,
-               uint32_t timestamp)
-      : data_(data),
-        length_(length),
-        frame_type_(frame_type),
-        stream_id_(stream_id),
-        timestamp_(timestamp) {}
-
-  const uint8_t* data_;
-  const size_t length_;
-  const FrameType frame_type_;
-  const size_t stream_id_;
-  const uint32_t timestamp_;
-};
-
-class EncodedFrameObserver {
- public:
-  virtual void EncodedFrameCallback(const EncodedFrame& encoded_frame) = 0;
-  virtual void OnEncodeTiming(int64_t capture_ntp_ms, int encode_duration_ms) {}
-
- protected:
-  virtual ~EncodedFrameObserver() {}
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_COMMON_VIDEO_INCLUDE_FRAME_CALLBACK_H_
diff --git a/common_video/include/i420_buffer_pool.h b/common_video/include/i420_buffer_pool.h
deleted file mode 100644
index 85206ee..0000000
--- a/common_video/include/i420_buffer_pool.h
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- *  Copyright (c) 2015 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_COMMON_VIDEO_INCLUDE_I420_BUFFER_POOL_H_
-#define WEBRTC_COMMON_VIDEO_INCLUDE_I420_BUFFER_POOL_H_
-
-#include <list>
-#include <limits>
-
-#include "webrtc/api/video/i420_buffer.h"
-#include "webrtc/rtc_base/race_checker.h"
-
-namespace webrtc {
-
-// Simple buffer pool to avoid unnecessary allocations of I420Buffer objects.
-// The pool manages the memory of the I420Buffer returned from CreateBuffer.
-// When the I420Buffer is destructed, the memory is returned to the pool for use
-// by subsequent calls to CreateBuffer. If the resolution passed to CreateBuffer
-// changes, old buffers will be purged from the pool.
-// Note that CreateBuffer will crash if more than kMaxNumberOfFramesBeforeCrash
-// are created. This is to prevent memory leaks where frames are not returned.
-class I420BufferPool {
- public:
-  I420BufferPool()
-      : I420BufferPool(false) {}
-  explicit I420BufferPool(bool zero_initialize)
-      : I420BufferPool(zero_initialize, std::numeric_limits<size_t>::max()) {}
-  I420BufferPool(bool zero_initialze, size_t max_number_of_buffers);
-
-  // Returns a buffer from the pool. If no suitable buffer exist in the pool
-  // and there are less than |max_number_of_buffers| pending, a buffer is
-  // created. Returns null otherwise.
-  rtc::scoped_refptr<I420Buffer> CreateBuffer(int width, int height);
-  // Clears buffers_ and detaches the thread checker so that it can be reused
-  // later from another thread.
-  void Release();
-
- private:
-  // Explicitly use a RefCountedObject to get access to HasOneRef,
-  // needed by the pool to check exclusive access.
-  using PooledI420Buffer = rtc::RefCountedObject<I420Buffer>;
-
-  rtc::RaceChecker race_checker_;
-  std::list<rtc::scoped_refptr<PooledI420Buffer>> buffers_;
-  // If true, newly allocated buffers are zero-initialized. Note that recycled
-  // buffers are not zero'd before reuse. This is required of buffers used by
-  // FFmpeg according to http://crbug.com/390941, which only requires it for the
-  // initial allocation (as shown by FFmpeg's own buffer allocation code). It
-  // has to do with "Use-of-uninitialized-value" on "Linux_msan_chrome".
-  const bool zero_initialize_;
-  // Max number of buffers this pool can have pending.
-  const size_t max_number_of_buffers_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_COMMON_VIDEO_INCLUDE_I420_BUFFER_POOL_H_
diff --git a/common_video/include/incoming_video_stream.h b/common_video/include/incoming_video_stream.h
deleted file mode 100644
index 927336a..0000000
--- a/common_video/include/incoming_video_stream.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- *  Copyright (c) 2012 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_COMMON_VIDEO_INCLUDE_INCOMING_VIDEO_STREAM_H_
-#define WEBRTC_COMMON_VIDEO_INCLUDE_INCOMING_VIDEO_STREAM_H_
-
-#include "webrtc/common_video/video_render_frames.h"
-#include "webrtc/media/base/videosinkinterface.h"
-#include "webrtc/rtc_base/race_checker.h"
-#include "webrtc/rtc_base/task_queue.h"
-
-namespace webrtc {
-
-class IncomingVideoStream : public rtc::VideoSinkInterface<VideoFrame> {
- public:
-  IncomingVideoStream(int32_t delay_ms,
-                      rtc::VideoSinkInterface<VideoFrame>* callback);
-  ~IncomingVideoStream() override;
-
- private:
-  void OnFrame(const VideoFrame& video_frame) override;
-  void Dequeue();
-
-  // Fwd decl of a QueuedTask implementation for carrying frames over to the TQ.
-  class NewFrameTask;
-
-  rtc::ThreadChecker main_thread_checker_;
-  rtc::RaceChecker decoder_race_checker_;
-
-  VideoRenderFrames render_buffers_;  // Only touched on the TaskQueue.
-  rtc::VideoSinkInterface<VideoFrame>* const callback_;
-  rtc::TaskQueue incoming_render_queue_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_COMMON_VIDEO_INCLUDE_INCOMING_VIDEO_STREAM_H_
diff --git a/common_video/include/video_bitrate_allocator.h b/common_video/include/video_bitrate_allocator.h
deleted file mode 100644
index b85879d..0000000
--- a/common_video/include/video_bitrate_allocator.h
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- *  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_COMMON_VIDEO_INCLUDE_VIDEO_BITRATE_ALLOCATOR_H_
-#define WEBRTC_COMMON_VIDEO_INCLUDE_VIDEO_BITRATE_ALLOCATOR_H_
-
-#include "webrtc/common_types.h"
-
-namespace webrtc {
-
-class VideoBitrateAllocator {
- public:
-  VideoBitrateAllocator() {}
-  virtual ~VideoBitrateAllocator() {}
-
-  virtual BitrateAllocation GetAllocation(uint32_t total_bitrate,
-                                          uint32_t framerate) = 0;
-  virtual uint32_t GetPreferredBitrateBps(uint32_t framerate) = 0;
-};
-
-class VideoBitrateAllocationObserver {
- public:
-  VideoBitrateAllocationObserver() {}
-  virtual ~VideoBitrateAllocationObserver() {}
-
-  virtual void OnBitrateAllocationUpdated(
-      const BitrateAllocation& allocation) = 0;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_COMMON_VIDEO_INCLUDE_VIDEO_BITRATE_ALLOCATOR_H_
diff --git a/common_video/include/video_frame.h b/common_video/include/video_frame.h
deleted file mode 100644
index 99e0b8f..0000000
--- a/common_video/include/video_frame.h
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- *  Copyright (c) 2014 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_COMMON_VIDEO_INCLUDE_VIDEO_FRAME_H_
-#define WEBRTC_COMMON_VIDEO_INCLUDE_VIDEO_FRAME_H_
-
-// TODO(nisse): This header file should eventually be deleted. The
-// EncodedImage class stays in this file until we have figured out how
-// to refactor and clean up related interfaces, at which point it
-// should be moved to somewhere under api/.
-
-#include "webrtc/common_types.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-// TODO(pbos): Rename EncodedFrame and reformat this class' members.
-class EncodedImage {
- public:
-  static const size_t kBufferPaddingBytesH264;
-
-  // Some decoders require encoded image buffers to be padded with a small
-  // number of additional bytes (due to over-reading byte readers).
-  static size_t GetBufferPaddingBytes(VideoCodecType codec_type);
-
-  EncodedImage();
-  EncodedImage(uint8_t* buffer, size_t length, size_t size);
-
-  void SetEncodeTime(int64_t encode_start_ms, int64_t encode_finish_ms) const;
-
-  // TODO(kthelgason): get rid of this struct as it only has a single member
-  // remaining.
-  struct AdaptReason {
-    AdaptReason() : bw_resolutions_disabled(-1) {}
-    int bw_resolutions_disabled;  // Number of resolutions that are not sent
-                                  // due to bandwidth for this frame.
-                                  // Or -1 if information is not provided.
-  };
-  uint32_t _encodedWidth = 0;
-  uint32_t _encodedHeight = 0;
-  uint32_t _timeStamp = 0;
-  // NTP time of the capture time in local timebase in milliseconds.
-  int64_t ntp_time_ms_ = 0;
-  int64_t capture_time_ms_ = 0;
-  FrameType _frameType = kVideoFrameDelta;
-  uint8_t* _buffer;
-  size_t _length;
-  size_t _size;
-  VideoRotation rotation_ = kVideoRotation_0;
-  mutable VideoContentType content_type_ = VideoContentType::UNSPECIFIED;
-  bool _completeFrame = false;
-  AdaptReason adapt_reason_;
-  int qp_ = -1;  // Quantizer value.
-
-  // When an application indicates non-zero values here, it is taken as an
-  // indication that all future frames will be constrained with those limits
-  // until the application indicates a change again.
-  PlayoutDelay playout_delay_ = {-1, -1};
-
-  // Timing information should be updatable on const instances.
-  mutable struct Timing {
-    uint8_t flags = TimingFrameFlags::kInvalid;
-    int64_t encode_start_ms = 0;
-    int64_t encode_finish_ms = 0;
-    int64_t packetization_finish_ms = 0;
-    int64_t pacer_exit_ms = 0;
-    int64_t network_timestamp_ms = 0;
-    int64_t network2_timestamp_ms = 0;
-    int64_t receive_start_ms = 0;
-    int64_t receive_finish_ms = 0;
-  } timing_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_COMMON_VIDEO_INCLUDE_VIDEO_FRAME_H_
diff --git a/common_video/include/video_frame_buffer.h b/common_video/include/video_frame_buffer.h
deleted file mode 100644
index cdeb7cd..0000000
--- a/common_video/include/video_frame_buffer.h
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- *  Copyright (c) 2015 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_COMMON_VIDEO_INCLUDE_VIDEO_FRAME_BUFFER_H_
-#define WEBRTC_COMMON_VIDEO_INCLUDE_VIDEO_FRAME_BUFFER_H_
-
-#include <memory>
-
-#include "webrtc/api/video/video_frame_buffer.h"
-#include "webrtc/rtc_base/callback.h"
-#include "webrtc/rtc_base/scoped_ref_ptr.h"
-
-namespace webrtc {
-
-// Deprecated. Please use WrapI420Buffer(...) instead.
-class WrappedI420Buffer : public I420BufferInterface {
- public:
-  WrappedI420Buffer(int width,
-                    int height,
-                    const uint8_t* y_plane,
-                    int y_stride,
-                    const uint8_t* u_plane,
-                    int u_stride,
-                    const uint8_t* v_plane,
-                    int v_stride,
-                    const rtc::Callback0<void>& no_longer_used);
-  int width() const override;
-  int height() const override;
-
-  const uint8_t* DataY() const override;
-  const uint8_t* DataU() const override;
-  const uint8_t* DataV() const override;
-  int StrideY() const override;
-  int StrideU() const override;
-  int StrideV() const override;
-
- private:
-  friend class rtc::RefCountedObject<WrappedI420Buffer>;
-  ~WrappedI420Buffer() override;
-
-  const int width_;
-  const int height_;
-  const uint8_t* const y_plane_;
-  const uint8_t* const u_plane_;
-  const uint8_t* const v_plane_;
-  const int y_stride_;
-  const int u_stride_;
-  const int v_stride_;
-  rtc::Callback0<void> no_longer_used_cb_;
-};
-
-rtc::scoped_refptr<I420BufferInterface> WrapI420Buffer(
-    int width,
-    int height,
-    const uint8_t* y_plane,
-    int y_stride,
-    const uint8_t* u_plane,
-    int u_stride,
-    const uint8_t* v_plane,
-    int v_stride,
-    const rtc::Callback0<void>& no_longer_used);
-
-rtc::scoped_refptr<I444BufferInterface> WrapI444Buffer(
-    int width,
-    int height,
-    const uint8_t* y_plane,
-    int y_stride,
-    const uint8_t* u_plane,
-    int u_stride,
-    const uint8_t* v_plane,
-    int v_stride,
-    const rtc::Callback0<void>& no_longer_used);
-
-rtc::scoped_refptr<PlanarYuvBuffer> WrapYuvBuffer(
-    VideoFrameBuffer::Type type,
-    int width,
-    int height,
-    const uint8_t* y_plane,
-    int y_stride,
-    const uint8_t* u_plane,
-    int u_stride,
-    const uint8_t* v_plane,
-    int v_stride,
-    const rtc::Callback0<void>& no_longer_used);
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_COMMON_VIDEO_INCLUDE_VIDEO_FRAME_BUFFER_H_
diff --git a/common_video/incoming_video_stream.cc b/common_video/incoming_video_stream.cc
deleted file mode 100644
index b1c3191..0000000
--- a/common_video/incoming_video_stream.cc
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- *  Copyright (c) 2012 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/common_video/include/incoming_video_stream.h"
-
-#include <memory>
-
-#include "webrtc/common_video/video_render_frames.h"
-#include "webrtc/rtc_base/timeutils.h"
-#include "webrtc/rtc_base/trace_event.h"
-#include "webrtc/system_wrappers/include/event_wrapper.h"
-
-namespace webrtc {
-namespace {
-const char kIncomingQueueName[] = "IncomingVideoStream";
-}
-
-// Capture by moving (std::move) into a lambda isn't possible in C++11
-// (supported in C++14). This class provides the functionality of what would be
-// something like (inside OnFrame):
-// VideoFrame frame(video_frame);
-// incoming_render_queue_.PostTask([this, frame = std::move(frame)](){
-//   if (render_buffers_.AddFrame(std::move(frame)) == 1)
-//     Dequeue();
-// });
-class IncomingVideoStream::NewFrameTask : public rtc::QueuedTask {
- public:
-  NewFrameTask(IncomingVideoStream* stream, VideoFrame frame)
-      : stream_(stream), frame_(std::move(frame)) {}
-
- private:
-  bool Run() override {
-    RTC_DCHECK(stream_->incoming_render_queue_.IsCurrent());
-    if (stream_->render_buffers_.AddFrame(std::move(frame_)) == 1)
-      stream_->Dequeue();
-    return true;
-  }
-
-  IncomingVideoStream* stream_;
-  VideoFrame frame_;
-};
-
-IncomingVideoStream::IncomingVideoStream(
-    int32_t delay_ms,
-    rtc::VideoSinkInterface<VideoFrame>* callback)
-    : render_buffers_(delay_ms),
-      callback_(callback),
-      incoming_render_queue_(kIncomingQueueName,
-                             rtc::TaskQueue::Priority::HIGH) {}
-
-IncomingVideoStream::~IncomingVideoStream() {
-  RTC_DCHECK(main_thread_checker_.CalledOnValidThread());
-}
-
-void IncomingVideoStream::OnFrame(const VideoFrame& video_frame) {
-  TRACE_EVENT0("webrtc", "IncomingVideoStream::OnFrame");
-  RTC_CHECK_RUNS_SERIALIZED(&decoder_race_checker_);
-  RTC_DCHECK(!incoming_render_queue_.IsCurrent());
-  incoming_render_queue_.PostTask(
-      std::unique_ptr<rtc::QueuedTask>(new NewFrameTask(this, video_frame)));
-}
-
-void IncomingVideoStream::Dequeue() {
-  TRACE_EVENT0("webrtc", "IncomingVideoStream::Dequeue");
-  RTC_DCHECK(incoming_render_queue_.IsCurrent());
-  rtc::Optional<VideoFrame> frame_to_render = render_buffers_.FrameToRender();
-  if (frame_to_render)
-    callback_->OnFrame(*frame_to_render);
-
-  if (render_buffers_.HasPendingFrames()) {
-    uint32_t wait_time = render_buffers_.TimeToNextFrameRelease();
-    incoming_render_queue_.PostDelayedTask([this]() { Dequeue(); }, wait_time);
-  }
-}
-
-}  // namespace webrtc
diff --git a/common_video/libyuv/include/webrtc_libyuv.h b/common_video/libyuv/include/webrtc_libyuv.h
deleted file mode 100644
index 13e58d2..0000000
--- a/common_video/libyuv/include/webrtc_libyuv.h
+++ /dev/null
@@ -1,152 +0,0 @@
-/*
- *  Copyright (c) 2012 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.
- */
-
-/*
- * WebRTC's wrapper to libyuv.
- */
-
-#ifndef WEBRTC_COMMON_VIDEO_LIBYUV_INCLUDE_WEBRTC_LIBYUV_H_
-#define WEBRTC_COMMON_VIDEO_LIBYUV_INCLUDE_WEBRTC_LIBYUV_H_
-
-#include <stdio.h>
-#include <vector>
-
-#include "webrtc/api/video/video_frame.h"
-#include "webrtc/common_types.h"  // VideoTypes.
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-class I420Buffer;
-
-// This is the max PSNR value our algorithms can return.
-const double kPerfectPSNR = 48.0f;
-
-// TODO(nisse): Some downstream apps call CalcBufferSize with
-// ::webrtc::kI420 as the first argument. Delete after they are updated.
-const VideoType kI420 = VideoType::kI420;
-
-// Calculate the required buffer size.
-// Input:
-//   - type         :The type of the designated video frame.
-//   - width        :frame width in pixels.
-//   - height       :frame height in pixels.
-// Return value:    :The required size in bytes to accommodate the specified
-//                   video frame.
-size_t CalcBufferSize(VideoType type, int width, int height);
-
-// TODO(mikhal): Add unit test for these two functions and determine location.
-// Print VideoFrame to file
-// Input:
-//    - frame       : Reference to video frame.
-//    - file        : pointer to file object. It is assumed that the file is
-//                    already open for writing.
-// Return value: 0 if OK, < 0 otherwise.
-int PrintVideoFrame(const VideoFrame& frame, FILE* file);
-int PrintVideoFrame(const I420BufferInterface& frame, FILE* file);
-
-// Extract buffer from VideoFrame or I420BufferInterface (consecutive
-// planes, no stride)
-// Input:
-//   - frame       : Reference to video frame.
-//   - size        : pointer to the size of the allocated buffer. If size is
-//                   insufficient, an error will be returned.
-//   - buffer      : Pointer to buffer
-// Return value: length of buffer if OK, < 0 otherwise.
-int ExtractBuffer(const rtc::scoped_refptr<I420BufferInterface>& input_frame,
-                  size_t size,
-                  uint8_t* buffer);
-int ExtractBuffer(const VideoFrame& input_frame, size_t size, uint8_t* buffer);
-// Convert To I420
-// Input:
-//   - src_video_type   : Type of input video.
-//   - src_frame        : Pointer to a source frame.
-//   - crop_x/crop_y    : Starting positions for cropping (0 for no crop).
-//   - src_width        : src width in pixels.
-//   - src_height       : src height in pixels.
-//   - sample_size      : Required only for the parsing of MJPG (set to 0 else).
-//   - rotate           : Rotation mode of output image.
-// Output:
-//   - dst_buffer       : Reference to a destination frame buffer.
-// Return value: 0 if OK, < 0 otherwise.
-
-// TODO(nisse): Delete this wrapper, and let users call libyuv directly. Most
-// calls pass |src_video_type| == kI420, and should use libyuv::I420Copy. Also
-// remember to delete the I420Buffer forward declaration above. The only
-// exception at the time of this writing is VideoCaptureImpl::IncomingFrame,
-// which still needs libyuv::ConvertToI420.
-int ConvertToI420(VideoType src_video_type,
-                  const uint8_t* src_frame,
-                  int crop_x,
-                  int crop_y,
-                  int src_width,
-                  int src_height,
-                  size_t sample_size,
-                  VideoRotation rotation,
-                  I420Buffer* dst_buffer);
-
-// Convert From I420
-// Input:
-//   - src_frame        : Reference to a source frame.
-//   - dst_video_type   : Type of output video.
-//   - dst_sample_size  : Required only for the parsing of MJPG.
-//   - dst_frame        : Pointer to a destination frame.
-// Return value: 0 if OK, < 0 otherwise.
-// It is assumed that source and destination have equal height.
-int ConvertFromI420(const VideoFrame& src_frame,
-                    VideoType dst_video_type,
-                    int dst_sample_size,
-                    uint8_t* dst_frame);
-
-// Compute PSNR for an I420 frame (all planes).
-// Returns the PSNR in decibel, to a maximum of kInfinitePSNR.
-double I420PSNR(const VideoFrame* ref_frame, const VideoFrame* test_frame);
-double I420PSNR(const I420BufferInterface& ref_buffer,
-                const I420BufferInterface& test_buffer);
-
-// Compute SSIM for an I420 frame (all planes).
-double I420SSIM(const VideoFrame* ref_frame, const VideoFrame* test_frame);
-double I420SSIM(const I420BufferInterface& ref_buffer,
-                const I420BufferInterface& test_buffer);
-
-// Helper function for scaling NV12 to NV12.
-// If the |src_width| and |src_height| matches the |dst_width| and |dst_height|,
-// then |tmp_buffer| is not used. In other cases, the minimum size of
-// |tmp_buffer| should be:
-//   (src_width/2) * (src_height/2) * 2 + (dst_width/2) * (dst_height/2) * 2
-void NV12Scale(uint8_t* tmp_buffer,
-               const uint8_t* src_y, int src_stride_y,
-               const uint8_t* src_uv, int src_stride_uv,
-               int src_width, int src_height,
-               uint8_t* dst_y, int dst_stride_y,
-               uint8_t* dst_uv, int dst_stride_uv,
-               int dst_width, int dst_height);
-
-// Helper class for directly converting and scaling NV12 to I420. The Y-plane
-// will be scaled directly to the I420 destination, which makes this faster
-// than separate NV12->I420 + I420->I420 scaling.
-class NV12ToI420Scaler {
- public:
-  NV12ToI420Scaler();
-  ~NV12ToI420Scaler();
-  void NV12ToI420Scale(const uint8_t* src_y, int src_stride_y,
-                       const uint8_t* src_uv, int src_stride_uv,
-                       int src_width, int src_height,
-                       uint8_t* dst_y, int dst_stride_y,
-                       uint8_t* dst_u, int dst_stride_u,
-                       uint8_t* dst_v, int dst_stride_v,
-                       int dst_width, int dst_height);
- private:
-  std::vector<uint8_t> tmp_uv_planes_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_COMMON_VIDEO_LIBYUV_INCLUDE_WEBRTC_LIBYUV_H_
diff --git a/common_video/libyuv/libyuv_unittest.cc b/common_video/libyuv/libyuv_unittest.cc
deleted file mode 100644
index 60e45ba..0000000
--- a/common_video/libyuv/libyuv_unittest.cc
+++ /dev/null
@@ -1,328 +0,0 @@
-/*
- *  Copyright (c) 2012 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 <math.h>
-#include <string.h>
-
-#include <memory>
-
-#include "webrtc/api/video/i420_buffer.h"
-#include "webrtc/api/video/video_frame.h"
-#include "webrtc/common_video/libyuv/include/webrtc_libyuv.h"
-#include "webrtc/test/frame_utils.h"
-#include "webrtc/test/gmock.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/testsupport/fileutils.h"
-
-namespace webrtc {
-
-namespace {
-void Calc16ByteAlignedStride(int width, int* stride_y, int* stride_uv) {
-  *stride_y = 16 * ((width + 15) / 16);
-  *stride_uv = 16 * ((width + 31) / 32);
-}
-
-}  // Anonymous namespace
-
-class TestLibYuv : public ::testing::Test {
- protected:
-  TestLibYuv();
-  virtual void SetUp();
-  virtual void TearDown();
-
-  FILE* source_file_;
-  std::unique_ptr<VideoFrame> orig_frame_;
-  const int width_;
-  const int height_;
-  const int size_y_;
-  const int size_uv_;
-  const size_t frame_length_;
-};
-
-TestLibYuv::TestLibYuv()
-    : source_file_(NULL),
-      orig_frame_(),
-      width_(352),
-      height_(288),
-      size_y_(width_ * height_),
-      size_uv_(((width_ + 1) / 2) * ((height_ + 1) / 2)),
-      frame_length_(CalcBufferSize(VideoType::kI420, 352, 288)) {}
-
-void TestLibYuv::SetUp() {
-  const std::string input_file_name = webrtc::test::ResourcePath("foreman_cif",
-                                                                 "yuv");
-  source_file_  = fopen(input_file_name.c_str(), "rb");
-  ASSERT_TRUE(source_file_ != NULL) << "Cannot read file: "<<
-                                       input_file_name << "\n";
-
-  rtc::scoped_refptr<I420BufferInterface> buffer(
-      test::ReadI420Buffer(width_, height_, source_file_));
-
-  orig_frame_.reset(new VideoFrame(buffer, kVideoRotation_0, 0));
-}
-
-void TestLibYuv::TearDown() {
-  if (source_file_ != NULL) {
-    ASSERT_EQ(0, fclose(source_file_));
-  }
-  source_file_ = NULL;
-}
-
-TEST_F(TestLibYuv, ConvertSanityTest) {
-  // TODO(mikhal)
-}
-
-TEST_F(TestLibYuv, ConvertTest) {
-  // Reading YUV frame - testing on the first frame of the foreman sequence
-  int j = 0;
-  std::string output_file_name = webrtc::test::OutputPath() +
-                                 "LibYuvTest_conversion.yuv";
-  FILE*  output_file = fopen(output_file_name.c_str(), "wb");
-  ASSERT_TRUE(output_file != NULL);
-
-  double psnr = 0.0;
-
-  rtc::scoped_refptr<I420Buffer> res_i420_buffer =
-      I420Buffer::Create(width_, height_);
-
-  printf("\nConvert #%d I420 <-> I420 \n", j);
-  std::unique_ptr<uint8_t[]> out_i420_buffer(new uint8_t[frame_length_]);
-  EXPECT_EQ(0, ConvertFromI420(*orig_frame_, VideoType::kI420, 0,
-                               out_i420_buffer.get()));
-  EXPECT_EQ(0,
-            ConvertToI420(VideoType::kI420, out_i420_buffer.get(), 0, 0, width_,
-                          height_, 0, kVideoRotation_0, res_i420_buffer.get()));
-
-  if (PrintVideoFrame(*res_i420_buffer, output_file) < 0) {
-    return;
-  }
-  psnr =
-      I420PSNR(*orig_frame_->video_frame_buffer()->GetI420(), *res_i420_buffer);
-  EXPECT_EQ(48.0, psnr);
-  j++;
-
-  printf("\nConvert #%d I420 <-> RGB24\n", j);
-  std::unique_ptr<uint8_t[]> res_rgb_buffer2(new uint8_t[width_ * height_ * 3]);
-  // Align the stride values for the output frame.
-  int stride_y = 0;
-  int stride_uv = 0;
-  Calc16ByteAlignedStride(width_, &stride_y, &stride_uv);
-  res_i420_buffer =
-      I420Buffer::Create(width_, height_, stride_y, stride_uv, stride_uv);
-  EXPECT_EQ(0, ConvertFromI420(*orig_frame_, VideoType::kRGB24, 0,
-                               res_rgb_buffer2.get()));
-
-  EXPECT_EQ(
-      0, ConvertToI420(VideoType::kRGB24, res_rgb_buffer2.get(), 0, 0, width_,
-                       height_, 0, kVideoRotation_0, res_i420_buffer.get()));
-
-  if (PrintVideoFrame(*res_i420_buffer, output_file) < 0) {
-    return;
-  }
-  psnr =
-      I420PSNR(*orig_frame_->video_frame_buffer()->GetI420(), *res_i420_buffer);
-
-  // Optimization Speed- quality trade-off => 45 dB only (platform dependant).
-  EXPECT_GT(ceil(psnr), 44);
-  j++;
-
-  printf("\nConvert #%d I420 <-> UYVY\n", j);
-  std::unique_ptr<uint8_t[]> out_uyvy_buffer(new uint8_t[width_ * height_ * 2]);
-  EXPECT_EQ(0, ConvertFromI420(*orig_frame_, VideoType::kUYVY, 0,
-                               out_uyvy_buffer.get()));
-  EXPECT_EQ(0,
-            ConvertToI420(VideoType::kUYVY, out_uyvy_buffer.get(), 0, 0, width_,
-                          height_, 0, kVideoRotation_0, res_i420_buffer.get()));
-  psnr =
-      I420PSNR(*orig_frame_->video_frame_buffer()->GetI420(), *res_i420_buffer);
-  EXPECT_EQ(48.0, psnr);
-  if (PrintVideoFrame(*res_i420_buffer, output_file) < 0) {
-    return;
-  }
-  j++;
-
-  printf("\nConvert #%d I420 <-> YUY2\n", j);
-  std::unique_ptr<uint8_t[]> out_yuy2_buffer(new uint8_t[width_ * height_ * 2]);
-  EXPECT_EQ(0, ConvertFromI420(*orig_frame_, VideoType::kYUY2, 0,
-                               out_yuy2_buffer.get()));
-
-  EXPECT_EQ(0,
-            ConvertToI420(VideoType::kYUY2, out_yuy2_buffer.get(), 0, 0, width_,
-                          height_, 0, kVideoRotation_0, res_i420_buffer.get()));
-
-  if (PrintVideoFrame(*res_i420_buffer, output_file) < 0) {
-    return;
-  }
-
-  psnr =
-      I420PSNR(*orig_frame_->video_frame_buffer()->GetI420(), *res_i420_buffer);
-  EXPECT_EQ(48.0, psnr);
-
-  printf("\nConvert #%d I420 <-> RGB565\n", j);
-  std::unique_ptr<uint8_t[]> out_rgb565_buffer(
-      new uint8_t[width_ * height_ * 2]);
-  EXPECT_EQ(0, ConvertFromI420(*orig_frame_, VideoType::kRGB565, 0,
-                               out_rgb565_buffer.get()));
-
-  EXPECT_EQ(0, ConvertToI420(VideoType::kRGB565, out_rgb565_buffer.get(), 0, 0,
-                             width_, height_, 0, kVideoRotation_0,
-                             res_i420_buffer.get()));
-  if (PrintVideoFrame(*res_i420_buffer, output_file) < 0) {
-    return;
-  }
-  j++;
-
-  psnr =
-      I420PSNR(*orig_frame_->video_frame_buffer()->GetI420(), *res_i420_buffer);
-  // TODO(leozwang) Investigate the right psnr should be set for I420ToRGB565,
-  // Another example is I420ToRGB24, the psnr is 44
-  // TODO(mikhal): Add psnr for RGB565, 1555, 4444, convert to ARGB.
-  EXPECT_GT(ceil(psnr), 40);
-
-  printf("\nConvert #%d I420 <-> ARGB8888\n", j);
-  std::unique_ptr<uint8_t[]> out_argb8888_buffer(
-      new uint8_t[width_ * height_ * 4]);
-  EXPECT_EQ(0, ConvertFromI420(*orig_frame_, VideoType::kARGB, 0,
-                               out_argb8888_buffer.get()));
-
-  EXPECT_EQ(0, ConvertToI420(VideoType::kARGB, out_argb8888_buffer.get(), 0, 0,
-                             width_, height_, 0, kVideoRotation_0,
-                             res_i420_buffer.get()));
-
-  if (PrintVideoFrame(*res_i420_buffer, output_file) < 0) {
-    return;
-  }
-
-  psnr =
-      I420PSNR(*orig_frame_->video_frame_buffer()->GetI420(), *res_i420_buffer);
-  // TODO(leozwang) Investigate the right psnr should be set for
-  // I420ToARGB8888,
-  EXPECT_GT(ceil(psnr), 42);
-
-  ASSERT_EQ(0, fclose(output_file));
-}
-
-TEST_F(TestLibYuv, ConvertAlignedFrame) {
-  // Reading YUV frame - testing on the first frame of the foreman sequence
-  std::string output_file_name = webrtc::test::OutputPath() +
-                                 "LibYuvTest_conversion.yuv";
-  FILE*  output_file = fopen(output_file_name.c_str(), "wb");
-  ASSERT_TRUE(output_file != NULL);
-
-  double psnr = 0.0;
-
-  int stride_y = 0;
-  int stride_uv = 0;
-  Calc16ByteAlignedStride(width_, &stride_y, &stride_uv);
-
-  rtc::scoped_refptr<I420Buffer> res_i420_buffer =
-      I420Buffer::Create(width_, height_, stride_y, stride_uv, stride_uv);
-  std::unique_ptr<uint8_t[]> out_i420_buffer(new uint8_t[frame_length_]);
-  EXPECT_EQ(0, ConvertFromI420(*orig_frame_, VideoType::kI420, 0,
-                               out_i420_buffer.get()));
-  EXPECT_EQ(0,
-            ConvertToI420(VideoType::kI420, out_i420_buffer.get(), 0, 0, width_,
-                          height_, 0, kVideoRotation_0, res_i420_buffer.get()));
-
-  if (PrintVideoFrame(*res_i420_buffer, output_file) < 0) {
-    return;
-  }
-  psnr =
-      I420PSNR(*orig_frame_->video_frame_buffer()->GetI420(), *res_i420_buffer);
-  EXPECT_EQ(48.0, psnr);
-}
-
-TEST_F(TestLibYuv, RotateTest) {
-  // Use ConvertToI420 for multiple rotations - see that nothing breaks, all
-  // memory is properly allocated and end result is equal to the starting point.
-  int rotated_width = height_;
-  int rotated_height = width_;
-  int stride_y;
-  int stride_uv;
-
-  // Assume compact layout, no padding.
-  const uint8_t* orig_buffer =
-      orig_frame_->video_frame_buffer()->GetI420()->DataY();
-
-  Calc16ByteAlignedStride(rotated_width, &stride_y, &stride_uv);
-  rtc::scoped_refptr<I420Buffer> rotated_res_i420_buffer = I420Buffer::Create(
-      rotated_width, rotated_height, stride_y, stride_uv, stride_uv);
-  EXPECT_EQ(
-      0, ConvertToI420(VideoType::kI420, orig_buffer, 0, 0, width_, height_, 0,
-                       kVideoRotation_90, rotated_res_i420_buffer.get()));
-  EXPECT_EQ(
-      0, ConvertToI420(VideoType::kI420, orig_buffer, 0, 0, width_, height_, 0,
-                       kVideoRotation_270, rotated_res_i420_buffer.get()));
-  rotated_res_i420_buffer = I420Buffer::Create(width_, height_);
-  EXPECT_EQ(
-      0, ConvertToI420(VideoType::kI420, orig_buffer, 0, 0, width_, height_, 0,
-                       kVideoRotation_180, rotated_res_i420_buffer.get()));
-}
-
-static uint8_t Average(int a, int b, int c, int d) {
-  return (a + b + c + d + 2) / 4;
-}
-
-TEST_F(TestLibYuv, NV12Scale2x2to2x2) {
-  const std::vector<uint8_t> src_y = {0, 1,
-                                      2, 3};
-  const std::vector<uint8_t> src_uv = {0, 1};
-  std::vector<uint8_t> dst_y(4);
-  std::vector<uint8_t> dst_uv(2);
-
-  uint8_t* tmp_buffer = nullptr;
-
-  NV12Scale(tmp_buffer,
-            src_y.data(), 2,
-            src_uv.data(), 2,
-            2, 2,
-            dst_y.data(), 2,
-            dst_uv.data(), 2,
-            2, 2);
-
-  EXPECT_THAT(dst_y, ::testing::ContainerEq(src_y));
-  EXPECT_THAT(dst_uv, ::testing::ContainerEq(src_uv));
-}
-
-TEST_F(TestLibYuv, NV12Scale4x4to2x2) {
-  const uint8_t src_y[] = { 0,  1,  2,  3,
-                            4,  5,  6,  7,
-                            8,  9, 10, 11,
-                           12, 13, 14, 15};
-  const uint8_t src_uv[] = {0, 1, 2, 3,
-                            4, 5, 6, 7};
-  std::vector<uint8_t> dst_y(4);
-  std::vector<uint8_t> dst_uv(2);
-
-  std::vector<uint8_t> tmp_buffer;
-  const int src_chroma_width = (4 + 1) / 2;
-  const int src_chroma_height = (4 + 1) / 2;
-  const int dst_chroma_width = (2 + 1) / 2;
-  const int dst_chroma_height = (2 + 1) / 2;
-  tmp_buffer.resize(src_chroma_width * src_chroma_height * 2 +
-                    dst_chroma_width * dst_chroma_height * 2);
-  tmp_buffer.shrink_to_fit();
-
-  NV12Scale(tmp_buffer.data(),
-            src_y, 4,
-            src_uv, 4,
-            4, 4,
-            dst_y.data(), 2,
-            dst_uv.data(), 2,
-            2, 2);
-
-  EXPECT_THAT(dst_y, ::testing::ElementsAre(
-                         Average(0, 1, 4, 5), Average(2, 3, 6, 7),
-                         Average(8, 9, 12, 13), Average(10, 11, 14, 15)));
-  EXPECT_THAT(dst_uv,
-              ::testing::ElementsAre(Average(0, 2, 4, 6), Average(1, 3, 5, 7)));
-}
-
-}  // namespace webrtc
diff --git a/common_video/libyuv/webrtc_libyuv.cc b/common_video/libyuv/webrtc_libyuv.cc
deleted file mode 100644
index 0cb3b04..0000000
--- a/common_video/libyuv/webrtc_libyuv.cc
+++ /dev/null
@@ -1,415 +0,0 @@
-/*
- *  Copyright (c) 2012 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/common_video/libyuv/include/webrtc_libyuv.h"
-
-#include <string.h>
-
-#include "webrtc/rtc_base/checks.h"
-// TODO(nisse): Only needed for the deprecated ConvertToI420.
-#include "webrtc/api/video/i420_buffer.h"
-
-// NOTE(ajm): Path provided by gn.
-#include "libyuv.h"  // NOLINT
-
-namespace webrtc {
-
-size_t CalcBufferSize(VideoType type, int width, int height) {
-  RTC_DCHECK_GE(width, 0);
-  RTC_DCHECK_GE(height, 0);
-  size_t buffer_size = 0;
-  switch (type) {
-    case VideoType::kI420:
-    case VideoType::kNV12:
-    case VideoType::kNV21:
-    case VideoType::kIYUV:
-    case VideoType::kYV12: {
-      int half_width = (width + 1) >> 1;
-      int half_height = (height + 1) >> 1;
-      buffer_size = width * height + half_width * half_height * 2;
-      break;
-    }
-    case VideoType::kARGB4444:
-    case VideoType::kRGB565:
-    case VideoType::kARGB1555:
-    case VideoType::kYUY2:
-    case VideoType::kUYVY:
-      buffer_size = width * height * 2;
-      break;
-    case VideoType::kRGB24:
-      buffer_size = width * height * 3;
-      break;
-    case VideoType::kBGRA:
-    case VideoType::kARGB:
-      buffer_size = width * height * 4;
-      break;
-    default:
-      RTC_NOTREACHED();
-      break;
-  }
-  return buffer_size;
-}
-
-static int PrintPlane(const uint8_t* buf,
-                      int width,
-                      int height,
-                      int stride,
-                      FILE* file) {
-  for (int i = 0; i < height; i++, buf += stride) {
-    if (fwrite(buf, 1, width, file) != static_cast<unsigned int>(width))
-      return -1;
-  }
-  return 0;
-}
-
-// TODO(nisse): Belongs with the test code?
-int PrintVideoFrame(const I420BufferInterface& frame, FILE* file) {
-  int width = frame.width();
-  int height = frame.height();
-  int chroma_width = frame.ChromaWidth();
-  int chroma_height = frame.ChromaHeight();
-
-  if (PrintPlane(frame.DataY(), width, height,
-                 frame.StrideY(), file) < 0) {
-    return -1;
-  }
-  if (PrintPlane(frame.DataU(),
-                 chroma_width, chroma_height,
-                 frame.StrideU(), file) < 0) {
-    return -1;
-  }
-  if (PrintPlane(frame.DataV(),
-                 chroma_width, chroma_height,
-                 frame.StrideV(), file) < 0) {
-    return -1;
-  }
-  return 0;
-}
-
-int PrintVideoFrame(const VideoFrame& frame, FILE* file) {
-  return PrintVideoFrame(*frame.video_frame_buffer()->ToI420(), file);
-}
-
-int ExtractBuffer(const rtc::scoped_refptr<I420BufferInterface>& input_frame,
-                  size_t size,
-                  uint8_t* buffer) {
-  RTC_DCHECK(buffer);
-  if (!input_frame)
-    return -1;
-  int width = input_frame->width();
-  int height = input_frame->height();
-  size_t length = CalcBufferSize(VideoType::kI420, width, height);
-  if (size < length) {
-     return -1;
-  }
-
-  int chroma_width = input_frame->ChromaWidth();
-  int chroma_height = input_frame->ChromaHeight();
-
-  libyuv::I420Copy(input_frame->DataY(),
-                   input_frame->StrideY(),
-                   input_frame->DataU(),
-                   input_frame->StrideU(),
-                   input_frame->DataV(),
-                   input_frame->StrideV(),
-                   buffer, width,
-                   buffer + width*height, chroma_width,
-                   buffer + width*height + chroma_width*chroma_height,
-                   chroma_width,
-                   width, height);
-
-  return static_cast<int>(length);
-}
-
-int ExtractBuffer(const VideoFrame& input_frame, size_t size, uint8_t* buffer) {
-  return ExtractBuffer(input_frame.video_frame_buffer()->ToI420(), size,
-                       buffer);
-}
-
-int ConvertNV12ToRGB565(const uint8_t* src_frame,
-                        uint8_t* dst_frame,
-                        int width, int height) {
-  int abs_height = (height < 0) ? -height : height;
-  const uint8_t* yplane = src_frame;
-  const uint8_t* uvInterlaced = src_frame + (width * abs_height);
-
-  return libyuv::NV12ToRGB565(yplane, width,
-                              uvInterlaced, (width + 1) >> 1,
-                              dst_frame, width,
-                              width, height);
-}
-
-int ConvertRGB24ToARGB(const uint8_t* src_frame, uint8_t* dst_frame,
-                       int width, int height, int dst_stride) {
-  if (dst_stride == 0)
-    dst_stride = width;
-  return libyuv::RGB24ToARGB(src_frame, width,
-                             dst_frame, dst_stride,
-                             width, height);
-}
-
-libyuv::RotationMode ConvertRotationMode(VideoRotation rotation) {
-  switch (rotation) {
-    case kVideoRotation_0:
-      return libyuv::kRotate0;
-    case kVideoRotation_90:
-      return libyuv::kRotate90;
-    case kVideoRotation_180:
-      return libyuv::kRotate180;
-    case kVideoRotation_270:
-      return libyuv::kRotate270;
-  }
-  RTC_NOTREACHED();
-  return libyuv::kRotate0;
-}
-
-int ConvertVideoType(VideoType video_type) {
-  switch (video_type) {
-    case VideoType::kUnknown:
-      return libyuv::FOURCC_ANY;
-    case VideoType::kI420:
-      return libyuv::FOURCC_I420;
-    case VideoType::kIYUV:  // same as VideoType::kYV12
-    case VideoType::kYV12:
-      return libyuv::FOURCC_YV12;
-    case VideoType::kRGB24:
-      return libyuv::FOURCC_24BG;
-    case VideoType::kABGR:
-      return libyuv::FOURCC_ABGR;
-    case VideoType::kRGB565:
-      return libyuv::FOURCC_RGBP;
-    case VideoType::kYUY2:
-      return libyuv::FOURCC_YUY2;
-    case VideoType::kUYVY:
-      return libyuv::FOURCC_UYVY;
-    case VideoType::kMJPEG:
-      return libyuv::FOURCC_MJPG;
-    case VideoType::kNV21:
-      return libyuv::FOURCC_NV21;
-    case VideoType::kNV12:
-      return libyuv::FOURCC_NV12;
-    case VideoType::kARGB:
-      return libyuv::FOURCC_ARGB;
-    case VideoType::kBGRA:
-      return libyuv::FOURCC_BGRA;
-    case VideoType::kARGB4444:
-      return libyuv::FOURCC_R444;
-    case VideoType::kARGB1555:
-      return libyuv::FOURCC_RGBO;
-  }
-  RTC_NOTREACHED();
-  return libyuv::FOURCC_ANY;
-}
-
-// TODO(nisse): Delete this wrapper, let callers use libyuv directly.
-int ConvertToI420(VideoType src_video_type,
-                  const uint8_t* src_frame,
-                  int crop_x,
-                  int crop_y,
-                  int src_width,
-                  int src_height,
-                  size_t sample_size,
-                  VideoRotation rotation,
-                  I420Buffer* dst_buffer) {
-  int dst_width = dst_buffer->width();
-  int dst_height = dst_buffer->height();
-  // LibYuv expects pre-rotation values for dst.
-  // Stride values should correspond to the destination values.
-  if (rotation == kVideoRotation_90 || rotation == kVideoRotation_270) {
-    std::swap(dst_width, dst_height);
-  }
-  return libyuv::ConvertToI420(
-      src_frame, sample_size,
-      dst_buffer->MutableDataY(), dst_buffer->StrideY(),
-      dst_buffer->MutableDataU(), dst_buffer->StrideU(),
-      dst_buffer->MutableDataV(), dst_buffer->StrideV(),
-      crop_x, crop_y,
-      src_width, src_height,
-      dst_width, dst_height,
-      ConvertRotationMode(rotation),
-      ConvertVideoType(src_video_type));
-}
-
-int ConvertFromI420(const VideoFrame& src_frame,
-                    VideoType dst_video_type,
-                    int dst_sample_size,
-                    uint8_t* dst_frame) {
-  rtc::scoped_refptr<I420BufferInterface> i420_buffer =
-      src_frame.video_frame_buffer()->ToI420();
-  return libyuv::ConvertFromI420(
-      i420_buffer->DataY(), i420_buffer->StrideY(), i420_buffer->DataU(),
-      i420_buffer->StrideU(), i420_buffer->DataV(), i420_buffer->StrideV(),
-      dst_frame, dst_sample_size, src_frame.width(), src_frame.height(),
-      ConvertVideoType(dst_video_type));
-}
-
-// Compute PSNR for an I420 frame (all planes). Can upscale test frame.
-double I420PSNR(const I420BufferInterface& ref_buffer,
-                const I420BufferInterface& test_buffer) {
-  RTC_DCHECK_GE(ref_buffer.width(), test_buffer.width());
-  RTC_DCHECK_GE(ref_buffer.height(), test_buffer.height());
-  if ((ref_buffer.width() != test_buffer.width()) ||
-      (ref_buffer.height() != test_buffer.height())) {
-    rtc::scoped_refptr<I420Buffer> scaled_buffer =
-        I420Buffer::Create(ref_buffer.width(), ref_buffer.height());
-    scaled_buffer->ScaleFrom(test_buffer);
-    return I420PSNR(ref_buffer, *scaled_buffer);
-  }
-  double psnr = libyuv::I420Psnr(
-      ref_buffer.DataY(), ref_buffer.StrideY(), ref_buffer.DataU(),
-      ref_buffer.StrideU(), ref_buffer.DataV(), ref_buffer.StrideV(),
-      test_buffer.DataY(), test_buffer.StrideY(), test_buffer.DataU(),
-      test_buffer.StrideU(), test_buffer.DataV(), test_buffer.StrideV(),
-      test_buffer.width(), test_buffer.height());
-  // LibYuv sets the max psnr value to 128, we restrict it here.
-  // In case of 0 mse in one frame, 128 can skew the results significantly.
-  return (psnr > kPerfectPSNR) ? kPerfectPSNR : psnr;
-}
-
-// Compute PSNR for an I420 frame (all planes)
-double I420PSNR(const VideoFrame* ref_frame, const VideoFrame* test_frame) {
-  if (!ref_frame || !test_frame)
-    return -1;
-  return I420PSNR(*ref_frame->video_frame_buffer()->ToI420(),
-                  *test_frame->video_frame_buffer()->ToI420());
-}
-
-// Compute SSIM for an I420 frame (all planes). Can upscale test_buffer.
-double I420SSIM(const I420BufferInterface& ref_buffer,
-                const I420BufferInterface& test_buffer) {
-  RTC_DCHECK_GE(ref_buffer.width(), test_buffer.width());
-  RTC_DCHECK_GE(ref_buffer.height(), test_buffer.height());
-  if ((ref_buffer.width() != test_buffer.width()) ||
-      (ref_buffer.height() != test_buffer.height())) {
-    rtc::scoped_refptr<I420Buffer> scaled_buffer =
-        I420Buffer::Create(ref_buffer.width(), ref_buffer.height());
-    scaled_buffer->ScaleFrom(test_buffer);
-    return I420SSIM(ref_buffer, *scaled_buffer);
-  }
-  return libyuv::I420Ssim(
-      ref_buffer.DataY(), ref_buffer.StrideY(), ref_buffer.DataU(),
-      ref_buffer.StrideU(), ref_buffer.DataV(), ref_buffer.StrideV(),
-      test_buffer.DataY(), test_buffer.StrideY(), test_buffer.DataU(),
-      test_buffer.StrideU(), test_buffer.DataV(), test_buffer.StrideV(),
-      test_buffer.width(), test_buffer.height());
-}
-double I420SSIM(const VideoFrame* ref_frame, const VideoFrame* test_frame) {
-  if (!ref_frame || !test_frame)
-    return -1;
-  return I420SSIM(*ref_frame->video_frame_buffer()->ToI420(),
-                  *test_frame->video_frame_buffer()->ToI420());
-}
-
-void NV12Scale(uint8_t* tmp_buffer,
-               const uint8_t* src_y, int src_stride_y,
-               const uint8_t* src_uv, int src_stride_uv,
-               int src_width, int src_height,
-               uint8_t* dst_y, int dst_stride_y,
-               uint8_t* dst_uv, int dst_stride_uv,
-               int dst_width, int dst_height) {
-  const int src_chroma_width = (src_width + 1) / 2;
-  const int src_chroma_height = (src_height + 1) / 2;
-
-  if (src_width == dst_width && src_height == dst_height) {
-    // No scaling.
-    libyuv::CopyPlane(src_y, src_stride_y, dst_y, dst_stride_y, src_width,
-                      src_height);
-    libyuv::CopyPlane(src_uv, src_stride_uv, dst_uv, dst_stride_uv,
-                      src_chroma_width * 2, src_chroma_height);
-    return;
-  }
-
-  // Scaling.
-  // Allocate temporary memory for spitting UV planes and scaling them.
-  const int dst_chroma_width = (dst_width + 1) / 2;
-  const int dst_chroma_height = (dst_height + 1) / 2;
-
-  uint8_t* const src_u = tmp_buffer;
-  uint8_t* const src_v = src_u + src_chroma_width * src_chroma_height;
-  uint8_t* const dst_u = src_v + src_chroma_width * src_chroma_height;
-  uint8_t* const dst_v = dst_u + dst_chroma_width * dst_chroma_height;
-
-  // Split source UV plane into separate U and V plane using the temporary data.
-  libyuv::SplitUVPlane(src_uv, src_stride_uv,
-                       src_u, src_chroma_width,
-                       src_v, src_chroma_width,
-                       src_chroma_width, src_chroma_height);
-
-  // Scale the planes.
-  libyuv::I420Scale(src_y, src_stride_y,
-                    src_u, src_chroma_width,
-                    src_v, src_chroma_width,
-                    src_width, src_height,
-                    dst_y, dst_stride_y,
-                    dst_u, dst_chroma_width,
-                    dst_v, dst_chroma_width,
-                    dst_width, dst_height,
-                    libyuv::kFilterBox);
-
-  // Merge the UV planes into the destination.
-  libyuv::MergeUVPlane(dst_u, dst_chroma_width,
-                       dst_v, dst_chroma_width,
-                       dst_uv, dst_stride_uv,
-                       dst_chroma_width, dst_chroma_height);
-}
-
-NV12ToI420Scaler::NV12ToI420Scaler() = default;
-NV12ToI420Scaler::~NV12ToI420Scaler() = default;
-
-void NV12ToI420Scaler::NV12ToI420Scale(
-    const uint8_t* src_y, int src_stride_y,
-    const uint8_t* src_uv, int src_stride_uv,
-    int src_width, int src_height,
-    uint8_t* dst_y, int dst_stride_y,
-    uint8_t* dst_u, int dst_stride_u,
-    uint8_t* dst_v, int dst_stride_v,
-    int dst_width, int dst_height) {
-  if (src_width == dst_width && src_height == dst_height) {
-    // No scaling.
-    tmp_uv_planes_.clear();
-    tmp_uv_planes_.shrink_to_fit();
-    libyuv::NV12ToI420(
-        src_y, src_stride_y,
-        src_uv, src_stride_uv,
-        dst_y, dst_stride_y,
-        dst_u, dst_stride_u,
-        dst_v, dst_stride_v,
-        src_width, src_height);
-    return;
-  }
-
-  // Scaling.
-  // Allocate temporary memory for spitting UV planes.
-  const int src_uv_width = (src_width + 1) / 2;
-  const int src_uv_height = (src_height + 1) / 2;
-  tmp_uv_planes_.resize(src_uv_width * src_uv_height * 2);
-  tmp_uv_planes_.shrink_to_fit();
-
-  // Split source UV plane into separate U and V plane using the temporary data.
-  uint8_t* const src_u = tmp_uv_planes_.data();
-  uint8_t* const src_v = tmp_uv_planes_.data() + src_uv_width * src_uv_height;
-  libyuv::SplitUVPlane(src_uv, src_stride_uv,
-                       src_u, src_uv_width,
-                       src_v, src_uv_width,
-                       src_uv_width, src_uv_height);
-
-  // Scale the planes into the destination.
-  libyuv::I420Scale(src_y, src_stride_y,
-                    src_u, src_uv_width,
-                    src_v, src_uv_width,
-                    src_width, src_height,
-                    dst_y, dst_stride_y,
-                    dst_u, dst_stride_u,
-                    dst_v, dst_stride_v,
-                    dst_width, dst_height,
-                    libyuv::kFilterBox);
-}
-
-}  // namespace webrtc
diff --git a/common_video/video_frame.cc b/common_video/video_frame.cc
deleted file mode 100644
index 8678700..0000000
--- a/common_video/video_frame.cc
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- *  Copyright (c) 2012 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/common_video/include/video_frame.h"
-
-#include <string.h>
-
-#include <algorithm>  // swap
-
-#include "webrtc/rtc_base/bind.h"
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-
-// FFmpeg's decoder, used by H264DecoderImpl, requires up to 8 bytes padding due
-// to optimized bitstream readers. See avcodec_decode_video2.
-const size_t EncodedImage::kBufferPaddingBytesH264 = 8;
-
-size_t EncodedImage::GetBufferPaddingBytes(VideoCodecType codec_type) {
-  switch (codec_type) {
-    case kVideoCodecVP8:
-    case kVideoCodecVP9:
-      return 0;
-    case kVideoCodecH264:
-      return kBufferPaddingBytesH264;
-    case kVideoCodecI420:
-    case kVideoCodecRED:
-    case kVideoCodecULPFEC:
-    case kVideoCodecFlexfec:
-    case kVideoCodecGeneric:
-    case kVideoCodecUnknown:
-      return 0;
-  }
-  RTC_NOTREACHED();
-  return 0;
-}
-
-EncodedImage::EncodedImage() : EncodedImage(nullptr, 0, 0) {}
-
-EncodedImage::EncodedImage(uint8_t* buffer, size_t length, size_t size)
-      : _buffer(buffer), _length(length), _size(size) {}
-
-void EncodedImage::SetEncodeTime(int64_t encode_start_ms,
-                                int64_t encode_finish_ms) const {
-    timing_.encode_start_ms = encode_start_ms;
-    timing_.encode_finish_ms = encode_finish_ms;
-}
-}  // namespace webrtc
diff --git a/common_video/video_frame_buffer.cc b/common_video/video_frame_buffer.cc
deleted file mode 100644
index f26e627..0000000
--- a/common_video/video_frame_buffer.cc
+++ /dev/null
@@ -1,187 +0,0 @@
-/*
- *  Copyright (c) 2015 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/common_video/include/video_frame_buffer.h"
-
-#include <string.h>
-
-#include <algorithm>
-
-#include "libyuv/convert.h"
-#include "libyuv/planar_functions.h"
-#include "libyuv/scale.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/keep_ref_until_done.h"
-
-namespace webrtc {
-
-WrappedI420Buffer::WrappedI420Buffer(int width,
-                                     int height,
-                                     const uint8_t* y_plane,
-                                     int y_stride,
-                                     const uint8_t* u_plane,
-                                     int u_stride,
-                                     const uint8_t* v_plane,
-                                     int v_stride,
-                                     const rtc::Callback0<void>& no_longer_used)
-    : width_(width),
-      height_(height),
-      y_plane_(y_plane),
-      u_plane_(u_plane),
-      v_plane_(v_plane),
-      y_stride_(y_stride),
-      u_stride_(u_stride),
-      v_stride_(v_stride),
-      no_longer_used_cb_(no_longer_used) {
-}
-
-WrappedI420Buffer::~WrappedI420Buffer() {
-  no_longer_used_cb_();
-}
-
-int WrappedI420Buffer::width() const {
-  return width_;
-}
-
-int WrappedI420Buffer::height() const {
-  return height_;
-}
-
-const uint8_t* WrappedI420Buffer::DataY() const {
-  return y_plane_;
-}
-const uint8_t* WrappedI420Buffer::DataU() const {
-  return u_plane_;
-}
-const uint8_t* WrappedI420Buffer::DataV() const {
-  return v_plane_;
-}
-
-int WrappedI420Buffer::StrideY() const {
-  return y_stride_;
-}
-int WrappedI420Buffer::StrideU() const {
-  return u_stride_;
-}
-int WrappedI420Buffer::StrideV() const {
-  return v_stride_;
-}
-
-// Template to implement a wrapped buffer for a I4??BufferInterface.
-template <typename Base>
-class WrappedYuvBuffer : public Base {
- public:
-  WrappedYuvBuffer(int width,
-                   int height,
-                   const uint8_t* y_plane,
-                   int y_stride,
-                   const uint8_t* u_plane,
-                   int u_stride,
-                   const uint8_t* v_plane,
-                   int v_stride,
-                   const rtc::Callback0<void>& no_longer_used)
-      : width_(width),
-        height_(height),
-        y_plane_(y_plane),
-        u_plane_(u_plane),
-        v_plane_(v_plane),
-        y_stride_(y_stride),
-        u_stride_(u_stride),
-        v_stride_(v_stride),
-        no_longer_used_cb_(no_longer_used) {}
-
-  int width() const override { return width_; }
-
-  int height() const override { return height_; }
-
-  const uint8_t* DataY() const override { return y_plane_; }
-
-  const uint8_t* DataU() const override { return u_plane_; }
-
-  const uint8_t* DataV() const override { return v_plane_; }
-
-  int StrideY() const override { return y_stride_; }
-
-  int StrideU() const override { return u_stride_; }
-
-  int StrideV() const override { return v_stride_; }
-
- private:
-  friend class rtc::RefCountedObject<WrappedYuvBuffer>;
-
-  ~WrappedYuvBuffer() override { no_longer_used_cb_(); }
-
-  const int width_;
-  const int height_;
-  const uint8_t* const y_plane_;
-  const uint8_t* const u_plane_;
-  const uint8_t* const v_plane_;
-  const int y_stride_;
-  const int u_stride_;
-  const int v_stride_;
-  rtc::Callback0<void> no_longer_used_cb_;
-};
-
-rtc::scoped_refptr<I420BufferInterface> WrapI420Buffer(
-    int width,
-    int height,
-    const uint8_t* y_plane,
-    int y_stride,
-    const uint8_t* u_plane,
-    int u_stride,
-    const uint8_t* v_plane,
-    int v_stride,
-    const rtc::Callback0<void>& no_longer_used) {
-  return rtc::scoped_refptr<I420BufferInterface>(
-      new rtc::RefCountedObject<WrappedYuvBuffer<I420BufferInterface>>(
-          width, height, y_plane, y_stride, u_plane, u_stride, v_plane,
-          v_stride, no_longer_used));
-}
-
-rtc::scoped_refptr<I444BufferInterface> WrapI444Buffer(
-    int width,
-    int height,
-    const uint8_t* y_plane,
-    int y_stride,
-    const uint8_t* u_plane,
-    int u_stride,
-    const uint8_t* v_plane,
-    int v_stride,
-    const rtc::Callback0<void>& no_longer_used) {
-  return rtc::scoped_refptr<I444BufferInterface>(
-      new rtc::RefCountedObject<WrappedYuvBuffer<I444BufferInterface>>(
-          width, height, y_plane, y_stride, u_plane, u_stride, v_plane,
-          v_stride, no_longer_used));
-}
-
-rtc::scoped_refptr<PlanarYuvBuffer> WrapYuvBuffer(
-    VideoFrameBuffer::Type type,
-    int width,
-    int height,
-    const uint8_t* y_plane,
-    int y_stride,
-    const uint8_t* u_plane,
-    int u_stride,
-    const uint8_t* v_plane,
-    int v_stride,
-    const rtc::Callback0<void>& no_longer_used) {
-  switch (type) {
-    case VideoFrameBuffer::Type::kI420:
-      return WrapI420Buffer(width, height, y_plane, y_stride, u_plane, u_stride,
-                            v_plane, v_stride, no_longer_used);
-    case VideoFrameBuffer::Type::kI444:
-      return WrapI444Buffer(width, height, y_plane, y_stride, u_plane, u_stride,
-                            v_plane, v_stride, no_longer_used);
-    default:
-      FATAL() << "Unexpected frame buffer type.";
-      return nullptr;
-  }
-}
-
-}  // namespace webrtc
diff --git a/common_video/video_render_frames.cc b/common_video/video_render_frames.cc
deleted file mode 100644
index e91c678..0000000
--- a/common_video/video_render_frames.cc
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- *  Copyright (c) 2012 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/common_video/video_render_frames.h"
-
-#include <utility>
-
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/timeutils.h"
-
-namespace webrtc {
-namespace {
-// Don't render frames with timestamp older than 500ms from now.
-const int kOldRenderTimestampMS = 500;
-// Don't render frames with timestamp more than 10s into the future.
-const int kFutureRenderTimestampMS = 10000;
-
-const uint32_t kEventMaxWaitTimeMs = 200;
-const uint32_t kMinRenderDelayMs = 10;
-const uint32_t kMaxRenderDelayMs = 500;
-const size_t kMaxIncomingFramesBeforeLogged = 100;
-
-uint32_t EnsureValidRenderDelay(uint32_t render_delay) {
-  return (render_delay < kMinRenderDelayMs || render_delay > kMaxRenderDelayMs)
-             ? kMinRenderDelayMs
-             : render_delay;
-}
-}  // namespace
-
-VideoRenderFrames::VideoRenderFrames(uint32_t render_delay_ms)
-    : render_delay_ms_(EnsureValidRenderDelay(render_delay_ms)) {}
-
-int32_t VideoRenderFrames::AddFrame(VideoFrame&& new_frame) {
-  const int64_t time_now = rtc::TimeMillis();
-
-  // Drop old frames only when there are other frames in the queue, otherwise, a
-  // really slow system never renders any frames.
-  if (!incoming_frames_.empty() &&
-      new_frame.render_time_ms() + kOldRenderTimestampMS < time_now) {
-    LOG(LS_WARNING) << "Too old frame, timestamp=" << new_frame.timestamp();
-    return -1;
-  }
-
-  if (new_frame.render_time_ms() > time_now + kFutureRenderTimestampMS) {
-    LOG(LS_WARNING) << "Frame too long into the future, timestamp="
-                    << new_frame.timestamp();
-    return -1;
-  }
-
-  if (new_frame.render_time_ms() < last_render_time_ms_) {
-    LOG(LS_WARNING) << "Frame scheduled out of order, render_time="
-                    << new_frame.render_time_ms()
-                    << ", latest=" << last_render_time_ms_;
-    // For more details, see bug:
-    // https://bugs.chromium.org/p/webrtc/issues/detail?id=7253
-    return -1;
-  }
-
-  last_render_time_ms_ = new_frame.render_time_ms();
-  incoming_frames_.emplace_back(std::move(new_frame));
-
-  if (incoming_frames_.size() > kMaxIncomingFramesBeforeLogged)
-    LOG(LS_WARNING) << "Stored incoming frames: " << incoming_frames_.size();
-  return static_cast<int32_t>(incoming_frames_.size());
-}
-
-rtc::Optional<VideoFrame> VideoRenderFrames::FrameToRender() {
-  rtc::Optional<VideoFrame> render_frame;
-  // Get the newest frame that can be released for rendering.
-  while (!incoming_frames_.empty() && TimeToNextFrameRelease() <= 0) {
-    render_frame =
-        rtc::Optional<VideoFrame>(std::move(incoming_frames_.front()));
-    incoming_frames_.pop_front();
-  }
-  return render_frame;
-}
-
-uint32_t VideoRenderFrames::TimeToNextFrameRelease() {
-  if (incoming_frames_.empty()) {
-    return kEventMaxWaitTimeMs;
-  }
-  const int64_t time_to_release = incoming_frames_.front().render_time_ms() -
-                                  render_delay_ms_ -
-                                  rtc::TimeMillis();
-  return time_to_release < 0 ? 0u : static_cast<uint32_t>(time_to_release);
-}
-
-bool VideoRenderFrames::HasPendingFrames() const {
-  return !incoming_frames_.empty();
-}
-
-}  // namespace webrtc
diff --git a/common_video/video_render_frames.h b/common_video/video_render_frames.h
deleted file mode 100644
index fe4d4f0..0000000
--- a/common_video/video_render_frames.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- *  Copyright (c) 2012 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_COMMON_VIDEO_VIDEO_RENDER_FRAMES_H_
-#define WEBRTC_COMMON_VIDEO_VIDEO_RENDER_FRAMES_H_
-
-#include <stdint.h>
-
-#include <list>
-
-#include "webrtc/api/optional.h"
-#include "webrtc/api/video/video_frame.h"
-
-namespace webrtc {
-
-// Class definitions
-class VideoRenderFrames {
- public:
-  explicit VideoRenderFrames(uint32_t render_delay_ms);
-  VideoRenderFrames(const VideoRenderFrames&) = delete;
-
-  // Add a frame to the render queue
-  int32_t AddFrame(VideoFrame&& new_frame);
-
-  // Get a frame for rendering, or false if it's not time to render.
-  rtc::Optional<VideoFrame> FrameToRender();
-
-  // Returns the number of ms to next frame to render
-  uint32_t TimeToNextFrameRelease();
-
-  bool HasPendingFrames() const;
-
- private:
-  // Sorted list with framed to be rendered, oldest first.
-  std::list<VideoFrame> incoming_frames_;
-
-  // Estimated delay from a frame is released until it's rendered.
-  const uint32_t render_delay_ms_;
-
-  int64_t last_render_time_ms_ = 0;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_COMMON_VIDEO_VIDEO_RENDER_FRAMES_H_
diff --git a/examples/BUILD.gn b/examples/BUILD.gn
deleted file mode 100644
index 3d49bc3..0000000
--- a/examples/BUILD.gn
+++ /dev/null
@@ -1,725 +0,0 @@
-# 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.
-
-import("../webrtc.gni")
-if (is_android) {
-  import("//build/config/android/config.gni")
-  import("//build/config/android/rules.gni")
-} else if (is_mac) {
-  import("//build/config/mac/rules.gni")
-} else if (is_ios) {
-  import("//build/config/ios/rules.gni")
-}
-
-group("examples") {
-  # This target shall build all targets in examples.
-  testonly = true
-  public_deps = []
-
-  if (is_android) {
-    public_deps += [
-      ":AppRTCMobile",
-      ":AppRTCMobileTest",
-      ":AppRTCMobileTestStubbedVideoIO",
-    ]
-  }
-
-  if (!build_with_chromium) {
-    public_deps += [ ":stun_prober" ]
-  }
-
-  if (is_ios || (is_mac && target_cpu != "x86")) {
-    public_deps += [ ":AppRTCMobile" ]
-  }
-
-  if (is_linux || is_win) {
-    public_deps += [
-      ":peerconnection_client",
-      ":peerconnection_server",
-      ":relayserver",
-      ":stunserver",
-      ":turnserver",
-    ]
-  }
-}
-
-if (is_android) {
-  android_apk("AppRTCMobile") {
-    testonly = true
-    apk_name = "AppRTCMobile"
-    android_manifest = "androidapp/AndroidManifest.xml"
-
-    deps = [
-      ":AppRTCMobile_javalib",
-      ":AppRTCMobile_resources",
-      "../rtc_base:base_java",
-      "//base:base_java",
-    ]
-
-    shared_libraries = [ "../sdk/android:libjingle_peerconnection_so" ]
-
-    # TODO(sakal): Fix build hooks crbug.com/webrtc/8148
-    no_build_hooks = true
-  }
-
-  android_library("AppRTCMobile_javalib") {
-    testonly = true
-    android_manifest = "androidapp/AndroidManifest.xml"
-
-    java_files = [
-      "androidapp/src/org/appspot/apprtc/AppRTCAudioManager.java",
-      "androidapp/src/org/appspot/apprtc/AppRTCBluetoothManager.java",
-      "androidapp/src/org/appspot/apprtc/AppRTCClient.java",
-      "androidapp/src/org/appspot/apprtc/AppRTCProximitySensor.java",
-      "androidapp/src/org/appspot/apprtc/CallActivity.java",
-      "androidapp/src/org/appspot/apprtc/CallFragment.java",
-      "androidapp/src/org/appspot/apprtc/CaptureQualityController.java",
-      "androidapp/src/org/appspot/apprtc/ConnectActivity.java",
-      "androidapp/src/org/appspot/apprtc/CpuMonitor.java",
-      "androidapp/src/org/appspot/apprtc/DirectRTCClient.java",
-      "androidapp/src/org/appspot/apprtc/HudFragment.java",
-      "androidapp/src/org/appspot/apprtc/PeerConnectionClient.java",
-      "androidapp/src/org/appspot/apprtc/RoomParametersFetcher.java",
-      "androidapp/src/org/appspot/apprtc/SettingsActivity.java",
-      "androidapp/src/org/appspot/apprtc/SettingsFragment.java",
-      "androidapp/src/org/appspot/apprtc/TCPChannelClient.java",
-      "androidapp/src/org/appspot/apprtc/UnhandledExceptionHandler.java",
-      "androidapp/src/org/appspot/apprtc/WebSocketChannelClient.java",
-      "androidapp/src/org/appspot/apprtc/WebSocketRTCClient.java",
-      "androidapp/src/org/appspot/apprtc/util/AppRTCUtils.java",
-      "androidapp/src/org/appspot/apprtc/util/AsyncHttpURLConnection.java",
-    ]
-
-    deps = [
-      ":AppRTCMobile_resources",
-      "../modules/audio_device:audio_device_java",
-      "../rtc_base:base_java",
-      "../sdk/android:libjingle_peerconnection_java",
-      "../sdk/android:libjingle_peerconnection_metrics_default_java",
-      "androidapp/third_party/autobanh:autobanh_java",
-    ]
-
-    # TODO(sakal): Fix build hooks crbug.com/webrtc/8148
-    no_build_hooks = true
-  }
-
-  android_resources("AppRTCMobile_resources") {
-    testonly = true
-    resource_dirs = [ "androidapp/res" ]
-    custom_package = "org.appspot.apprtc"
-  }
-
-  instrumentation_test_apk("AppRTCMobileTest") {
-    apk_name = "AppRTCMobileTest"
-    android_manifest = "androidtests/AndroidManifest.xml"
-
-    java_files = [ "androidtests/src/org/appspot/apprtc/test/PeerConnectionClientTest.java" ]
-
-    apk_under_test = ":AppRTCMobile"
-
-    deps = [
-      ":AppRTCMobile_javalib",
-      "../sdk/android:libjingle_peerconnection_java",
-      "//base:base_java_test_support",
-      "//third_party/android_support_test_runner:runner_java",
-      "//third_party/junit",
-    ]
-
-    # TODO(sakal): Fix build hooks crbug.com/webrtc/8148
-    no_build_hooks = true
-  }
-
-  instrumentation_test_apk("AppRTCMobileTestStubbedVideoIO") {
-    apk_name = "AppRTCMobileTestStubbedVideoIO"
-    android_manifest = "androidtests/AndroidManifest.xml"
-
-    java_files = [ "androidtests/src/org/appspot/apprtc/test/CallActivityStubbedInputOutputTest.java" ]
-
-    apk_under_test = ":AppRTCMobile"
-
-    deps = [
-      ":AppRTCMobile_javalib",
-      "../sdk/android:libjingle_peerconnection_java",
-      "//third_party/android_support_test_runner:rules_java",
-      "//third_party/android_support_test_runner:runner_java",
-      "//third_party/espresso:espresso_all_java",
-      "//third_party/hamcrest:hamcrest_java",
-      "//third_party/junit",
-    ]
-
-    data = [
-      "../../resources/reference_video_640x360_30fps.y4m",
-    ]
-
-    # TODO(sakal): Fix build hooks crbug.com/webrtc/8148
-    no_build_hooks = true
-  }
-}
-
-if (is_ios || (is_mac && target_cpu != "x86")) {
-  config("apprtc_common_config") {
-    include_dirs = [ "objc/AppRTCMobile/common" ]
-  }
-
-  rtc_static_library("apprtc_common") {
-    testonly = true
-    sources = [
-      "objc/AppRTCMobile/common/ARDUtilities.h",
-      "objc/AppRTCMobile/common/ARDUtilities.m",
-    ]
-    public_configs = [ ":apprtc_common_config" ]
-
-    if (is_ios) {
-      deps = [
-        ":AppRTCMobile_ios_frameworks",
-      ]
-    } else {
-      deps = [
-        "../sdk:common_objc",
-        "../system_wrappers:field_trial_default",
-        "../system_wrappers:metrics_default",
-      ]
-    }
-  }
-
-  config("apprtc_signaling_config") {
-    include_dirs = [ "objc/AppRTCMobile" ]
-
-    # GN orders flags on a target before flags from configs. The default config
-    # adds these flags so to cancel them out they need to come from a config and
-    # cannot be on the target directly.
-    cflags = [
-      "-Wno-sign-compare",
-      "-Wno-unused-variable",
-    ]
-  }
-
-  rtc_static_library("apprtc_signaling") {
-    testonly = true
-    sources = [
-      "objc/AppRTCMobile/ARDAppClient+Internal.h",
-      "objc/AppRTCMobile/ARDAppClient.h",
-      "objc/AppRTCMobile/ARDAppClient.m",
-      "objc/AppRTCMobile/ARDAppEngineClient.h",
-      "objc/AppRTCMobile/ARDAppEngineClient.m",
-      "objc/AppRTCMobile/ARDBitrateTracker.h",
-      "objc/AppRTCMobile/ARDBitrateTracker.m",
-      "objc/AppRTCMobile/ARDCaptureController.h",
-      "objc/AppRTCMobile/ARDCaptureController.m",
-      "objc/AppRTCMobile/ARDJoinResponse+Internal.h",
-      "objc/AppRTCMobile/ARDJoinResponse.h",
-      "objc/AppRTCMobile/ARDJoinResponse.m",
-      "objc/AppRTCMobile/ARDMessageResponse+Internal.h",
-      "objc/AppRTCMobile/ARDMessageResponse.h",
-      "objc/AppRTCMobile/ARDMessageResponse.m",
-      "objc/AppRTCMobile/ARDRoomServerClient.h",
-      "objc/AppRTCMobile/ARDSDPUtils.h",
-      "objc/AppRTCMobile/ARDSDPUtils.m",
-      "objc/AppRTCMobile/ARDSettingsModel+Private.h",
-      "objc/AppRTCMobile/ARDSettingsModel.h",
-      "objc/AppRTCMobile/ARDSettingsModel.m",
-      "objc/AppRTCMobile/ARDSettingsStore.h",
-      "objc/AppRTCMobile/ARDSettingsStore.m",
-      "objc/AppRTCMobile/ARDSignalingChannel.h",
-      "objc/AppRTCMobile/ARDSignalingMessage.h",
-      "objc/AppRTCMobile/ARDSignalingMessage.m",
-      "objc/AppRTCMobile/ARDStatsBuilder.h",
-      "objc/AppRTCMobile/ARDStatsBuilder.m",
-      "objc/AppRTCMobile/ARDTURNClient+Internal.h",
-      "objc/AppRTCMobile/ARDTURNClient.h",
-      "objc/AppRTCMobile/ARDTURNClient.m",
-      "objc/AppRTCMobile/ARDWebSocketChannel.h",
-      "objc/AppRTCMobile/ARDWebSocketChannel.m",
-      "objc/AppRTCMobile/RTCIceCandidate+JSON.h",
-      "objc/AppRTCMobile/RTCIceCandidate+JSON.m",
-      "objc/AppRTCMobile/RTCIceServer+JSON.h",
-      "objc/AppRTCMobile/RTCIceServer+JSON.m",
-      "objc/AppRTCMobile/RTCMediaConstraints+JSON.h",
-      "objc/AppRTCMobile/RTCMediaConstraints+JSON.m",
-      "objc/AppRTCMobile/RTCSessionDescription+JSON.h",
-      "objc/AppRTCMobile/RTCSessionDescription+JSON.m",
-    ]
-    public_configs = [ ":apprtc_signaling_config" ]
-    deps = [
-      ":apprtc_common",
-      ":socketrocket",
-    ]
-    if (is_ios) {
-      deps += [ ":AppRTCMobile_ios_frameworks" ]
-    } else {
-      public_deps = [
-        "../sdk:peerconnection_objc",
-      ]
-    }
-    libs = [ "QuartzCore.framework" ]
-  }
-
-  if (is_ios) {
-    rtc_static_library("AppRTCMobile_lib") {
-      testonly = true
-      sources = [
-        "objc/AppRTCMobile/ios/ARDAppDelegate.m",
-        "objc/AppRTCMobile/ios/ARDMainView.h",
-        "objc/AppRTCMobile/ios/ARDMainView.m",
-        "objc/AppRTCMobile/ios/ARDMainViewController.h",
-        "objc/AppRTCMobile/ios/ARDMainViewController.m",
-        "objc/AppRTCMobile/ios/ARDSettingsViewController.h",
-        "objc/AppRTCMobile/ios/ARDSettingsViewController.m",
-        "objc/AppRTCMobile/ios/ARDStatsView.h",
-        "objc/AppRTCMobile/ios/ARDStatsView.m",
-        "objc/AppRTCMobile/ios/ARDVideoCallView.h",
-        "objc/AppRTCMobile/ios/ARDVideoCallView.m",
-        "objc/AppRTCMobile/ios/ARDVideoCallViewController.h",
-        "objc/AppRTCMobile/ios/ARDVideoCallViewController.m",
-        "objc/AppRTCMobile/ios/AppRTCMobile-Prefix.pch",
-        "objc/AppRTCMobile/ios/UIImage+ARDUtilities.h",
-        "objc/AppRTCMobile/ios/UIImage+ARDUtilities.m",
-      ]
-
-      deps = [
-        ":AppRTCMobile_ios_frameworks",
-        ":apprtc_common",
-        ":apprtc_signaling",
-      ]
-    }
-
-    ios_app_bundle("AppRTCMobile") {
-      testonly = true
-      sources = [
-        "objc/AppRTCMobile/ios/main.m",
-      ]
-
-      info_plist = "objc/AppRTCMobile/ios/Info.plist"
-
-      configs += [ "..:common_config" ]
-      public_configs = [ "..:common_inherited_config" ]
-
-      deps = [
-        ":AppRTCMobile_ios_bundle_data",
-        ":AppRTCMobile_ios_frameworks",
-        ":AppRTCMobile_lib",
-      ]
-
-      if (target_cpu == "x86") {
-        deps += [ "//testing/iossim:iossim" ]
-      }
-    }
-
-    bundle_data("AppRTCMobile_ios_frameworks") {
-      public_deps = [
-        "../sdk:framework_objc+link",
-      ]
-      sources = [
-        "$root_out_dir/WebRTC.framework",
-      ]
-      outputs = [
-        "{{bundle_resources_dir}}/Frameworks/{{source_file_part}}",
-      ]
-    }
-
-    bundle_data("AppRTCMobile_ios_bundle_data") {
-      sources = [
-        "objc/AppRTCMobile/ios/resources/Roboto-Regular.ttf",
-        "objc/AppRTCMobile/ios/resources/iPhone5@2x.png",
-        "objc/AppRTCMobile/ios/resources/iPhone6@2x.png",
-        "objc/AppRTCMobile/ios/resources/iPhone6p@3x.png",
-        "objc/AppRTCMobile/ios/resources/ic_call_end_black_24dp.png",
-        "objc/AppRTCMobile/ios/resources/ic_call_end_black_24dp@2x.png",
-        "objc/AppRTCMobile/ios/resources/ic_clear_black_24dp.png",
-        "objc/AppRTCMobile/ios/resources/ic_clear_black_24dp@2x.png",
-        "objc/AppRTCMobile/ios/resources/ic_settings_black_24dp.png",
-        "objc/AppRTCMobile/ios/resources/ic_settings_black_24dp@2x.png",
-        "objc/AppRTCMobile/ios/resources/ic_surround_sound_black_24dp.png",
-        "objc/AppRTCMobile/ios/resources/ic_surround_sound_black_24dp@2x.png",
-        "objc/AppRTCMobile/ios/resources/ic_switch_video_black_24dp.png",
-        "objc/AppRTCMobile/ios/resources/ic_switch_video_black_24dp@2x.png",
-        "objc/AppRTCMobile/ios/resources/mozart.mp3",
-        "objc/Icon-120.png",
-        "objc/Icon-180.png",
-        "objc/Icon.png",
-      ]
-      outputs = [
-        "{{bundle_resources_dir}}/{{source_file_part}}",
-      ]
-    }
-  }
-
-  if (is_mac) {
-    rtc_static_library("AppRTCMobile_lib") {
-      testonly = true
-      sources = [
-        "objc/AppRTCMobile/mac/APPRTCAppDelegate.h",
-        "objc/AppRTCMobile/mac/APPRTCAppDelegate.m",
-        "objc/AppRTCMobile/mac/APPRTCViewController.h",
-        "objc/AppRTCMobile/mac/APPRTCViewController.m",
-      ]
-      configs += [ "..:common_objc" ]
-      deps = [
-        ":apprtc_common",
-        ":apprtc_signaling",
-        "../sdk:ui_objc",
-      ]
-    }
-
-    mac_app_bundle("AppRTCMobile") {
-      testonly = true
-      output_name = "AppRTCMobile"
-
-      sources = [
-        "objc/AppRTCMobile/mac/main.m",
-      ]
-
-      public_configs = [ "..:common_inherited_config" ]
-
-      info_plist = "objc/AppRTCMobile/mac/Info.plist"
-
-      libs = [ "AppKit.framework" ]
-
-      deps = [
-        ":AppRTCMobile_lib",
-      ]
-    }
-  }
-
-  config("socketrocket_include_config") {
-    include_dirs = [ "objc/AppRTCMobile/third_party/SocketRocket" ]
-  }
-
-  config("socketrocket_warning_config") {
-    # GN orders flags on a target before flags from configs. The default config
-    # adds these flags so to cancel them out they need to come from a config and
-    # cannot be on the target directly.
-    cflags = [
-      "-Wno-deprecated-declarations",
-      "-Wno-nonnull",
-      "-Wno-semicolon-before-method-body",
-      "-Wno-unused-variable",
-    ]
-
-    cflags_objc = [
-      # Enabled for cflags_objc in build/config/compiler/BUILD.gn.
-      "-Wno-objc-missing-property-synthesis",
-    ]
-  }
-
-  rtc_static_library("socketrocket") {
-    testonly = true
-    sources = [
-      "objc/AppRTCMobile/third_party/SocketRocket/SRWebSocket.h",
-      "objc/AppRTCMobile/third_party/SocketRocket/SRWebSocket.m",
-    ]
-    configs += [ ":socketrocket_warning_config" ]
-    public_configs = [ ":socketrocket_include_config" ]
-
-    libs = [
-      "CFNetwork.framework",
-      "icucore",
-    ]
-  }
-
-  if (rtc_include_tests) {
-    # TODO(kthelgason): compile xctests on mac when chromium supports it.
-    if (is_ios) {
-      rtc_source_set("apprtcmobile_test_sources") {
-        testonly = true
-        include_dirs = [
-          "objc/AppRTCMobile",
-          "objc/AppRTCMobile/ios",
-        ]
-        testonly = true
-        sources = [
-          "objc/AppRTCMobile/tests/ARDAppClient_xctest.mm",
-          "objc/AppRTCMobile/tests/ARDSDPUtils_xctest.mm",
-          "objc/AppRTCMobile/tests/ARDSettingsModel_xctest.mm",
-        ]
-        deps = [
-          "../rtc_base:rtc_base",
-        ]
-        public_deps = [
-          ":AppRTCMobile_ios_frameworks",
-          ":AppRTCMobile_lib",
-          "//build/config/ios:xctest",
-          "//third_party/ocmock",
-        ]
-      }
-
-      rtc_ios_xctest_test("apprtcmobile_tests") {
-        info_plist = "objc/AppRTCMobile/ios/Info.plist"
-        sources = [
-          "objc/AppRTCMobile/ios/main.m",
-        ]
-        deps = [
-          ":apprtcmobile_test_sources",
-        ]
-        ldflags = [ "-all_load" ]
-      }
-    }
-  }
-}
-
-if (is_linux || is_win) {
-  config("peerconnection_client_warnings_config") {
-    cflags = []
-    if (is_win && is_clang) {
-      cflags += [
-        # Disable warnings failing when compiling with Clang on Windows.
-        # https://bugs.chromium.org/p/webrtc/issues/detail?id=5366
-        "-Wno-format",
-
-        # See https://bugs.chromium.org/p/webrtc/issues/detail?id=6271
-        # for -Wno-reorder and -Wno-sign-compare
-        "-Wno-reorder",
-        "-Wno-sign-compare",
-      ]
-    }
-    if (is_linux && target_cpu == "x86") {
-      cflags += [
-        # Needed to compile on Linux 32-bit.
-        "-Wno-sentinel",
-      ]
-    }
-
-    if (is_clang) {
-      # TODO(ehmaldonado): Make peerconnection_client compile with the standard
-      # set of warnings.
-      # See https://bugs.chromium.org/p/webrtc/issues/detail?id=6306
-      cflags += [ "-Wno-inconsistent-missing-override" ]
-    }
-  }
-
-  rtc_executable("peerconnection_client") {
-    testonly = true
-    sources = [
-      "peerconnection/client/conductor.cc",
-      "peerconnection/client/conductor.h",
-      "peerconnection/client/defaults.cc",
-      "peerconnection/client/defaults.h",
-      "peerconnection/client/peer_connection_client.cc",
-      "peerconnection/client/peer_connection_client.h",
-    ]
-
-    if (!build_with_chromium && is_clang) {
-      # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-    }
-    deps = []
-    if (is_win) {
-      sources += [
-        "peerconnection/client/flagdefs.h",
-        "peerconnection/client/main.cc",
-        "peerconnection/client/main_wnd.cc",
-        "peerconnection/client/main_wnd.h",
-      ]
-      cflags = [ "/wd4245" ]
-      configs += [ "//build/config/win:windowed" ]
-      deps += [ "../media:rtc_media_base" ]
-    }
-    if (is_linux) {
-      sources += [
-        "peerconnection/client/linux/main.cc",
-        "peerconnection/client/linux/main_wnd.cc",
-        "peerconnection/client/linux/main_wnd.h",
-      ]
-      cflags = [ "-Wno-deprecated-declarations" ]
-      libs = [
-        "X11",
-        "Xcomposite",
-        "Xext",
-        "Xrender",
-      ]
-      deps += [ "//build/config/linux/gtk" ]
-    }
-    configs += [ ":peerconnection_client_warnings_config" ]
-
-    deps += [
-      "../api:libjingle_peerconnection_test_api",
-      "../api:video_frame_api",
-      "../media:rtc_media",
-      "../modules/video_capture:video_capture_module",
-      "../pc:libjingle_peerconnection",
-      "../rtc_base:rtc_base",
-      "../rtc_base:rtc_base_approved",
-      "../rtc_base:rtc_json",
-      "../system_wrappers:field_trial_default",
-      "../system_wrappers:metrics_default",
-      "//third_party/libyuv",
-    ]
-  }
-
-  rtc_executable("peerconnection_server") {
-    testonly = true
-    sources = [
-      "peerconnection/server/data_socket.cc",
-      "peerconnection/server/data_socket.h",
-      "peerconnection/server/main.cc",
-      "peerconnection/server/peer_channel.cc",
-      "peerconnection/server/peer_channel.h",
-      "peerconnection/server/utils.cc",
-      "peerconnection/server/utils.h",
-    ]
-    deps = [
-      "..:webrtc_common",
-      "../rtc_base:rtc_base_approved",
-      "../rtc_tools:command_line_parser",
-    ]
-    if (!build_with_chromium && is_clang) {
-      # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-    }
-  }
-  rtc_executable("relayserver") {
-    testonly = true
-    sources = [
-      "relayserver/relayserver_main.cc",
-    ]
-    deps = [
-      "../p2p:rtc_p2p",
-      "../pc:rtc_pc",
-      "../rtc_base:rtc_base",
-      "../rtc_base:rtc_base_approved",
-      "../system_wrappers:field_trial_default",
-      "../system_wrappers:metrics_default",
-    ]
-    if (!build_with_chromium && is_clang) {
-      # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-    }
-  }
-  rtc_executable("turnserver") {
-    testonly = true
-    sources = [
-      "turnserver/turnserver_main.cc",
-    ]
-    deps = [
-      "../p2p:rtc_p2p",
-      "../pc:rtc_pc",
-      "../rtc_base:rtc_base",
-      "../rtc_base:rtc_base_approved",
-      "../system_wrappers:field_trial_default",
-      "../system_wrappers:metrics_default",
-    ]
-    if (!build_with_chromium && is_clang) {
-      # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-    }
-  }
-  rtc_executable("stunserver") {
-    testonly = true
-    sources = [
-      "stunserver/stunserver_main.cc",
-    ]
-    deps = [
-      "../p2p:rtc_p2p",
-      "../pc:rtc_pc",
-      "../rtc_base:rtc_base",
-      "../rtc_base:rtc_base_approved",
-      "../system_wrappers:field_trial_default",
-      "../system_wrappers:metrics_default",
-    ]
-    if (!build_with_chromium && is_clang) {
-      # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-    }
-  }
-}
-
-if (is_win || is_android) {
-  rtc_shared_library("webrtc_unity_plugin") {
-    testonly = true
-    sources = [
-      "unityplugin/simple_peer_connection.cc",
-      "unityplugin/simple_peer_connection.h",
-      "unityplugin/unity_plugin_apis.cc",
-      "unityplugin/unity_plugin_apis.h",
-      "unityplugin/video_observer.cc",
-      "unityplugin/video_observer.h",
-    ]
-
-    if (is_android) {
-      sources += [
-        "unityplugin/classreferenceholder.cc",
-        "unityplugin/classreferenceholder.h",
-        "unityplugin/jni_onload.cc",
-      ]
-    }
-
-    if (!build_with_chromium && is_clang) {
-      # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-    }
-    if (is_win) {
-      cflags = [ "/wd4245" ]
-      configs += [
-        "//build/config/win:windowed",
-        ":peerconnection_client_warnings_config",
-      ]
-    }
-    deps = [
-      "../api:libjingle_peerconnection_test_api",
-      "../api:video_frame_api",
-      "../media:rtc_media",
-      "../media:rtc_media_base",
-      "../modules/video_capture:video_capture_module",
-      "../pc:libjingle_peerconnection",
-      "../rtc_base:rtc_base",
-      "../system_wrappers:field_trial_default",
-      "../system_wrappers:metrics_default",
-    ]
-    if (is_android) {
-      deps += [ "../sdk/android:libjingle_peerconnection_jni" ]
-    }
-  }
-}
-
-if (is_android) {
-  android_library("webrtc_unity_java") {
-    java_files = [ "unityplugin/java/src/org/webrtc/UnityUtility.java" ]
-    deps = [
-      "../rtc_base:base_java",
-      "../sdk/android:libjingle_peerconnection_java",
-    ]
-  }
-
-  dist_jar("libwebrtc_unity") {
-    _target_dir_name = get_label_info(":$target_name", "dir")
-    output = "${root_out_dir}/lib.java${_target_dir_name}/${target_name}.jar"
-    direct_deps_only = true
-    use_interface_jars = false
-    deps = [
-      ":webrtc_unity_java",
-      "../modules/audio_device:audio_device_java",
-      "../rtc_base:base_java",
-      "../sdk/android:libjingle_peerconnection_java",
-      "../sdk/android:libjingle_peerconnection_metrics_default_java",
-    ]
-  }
-}
-
-if (!build_with_chromium) {
-  # Doesn't build within Chrome on Win.
-  rtc_executable("stun_prober") {
-    testonly = true
-    sources = [
-      "stunprober/main.cc",
-    ]
-
-    if (!build_with_chromium && is_clang) {
-      # Suppress warnings from Chrome's Clang plugins.
-      # See http://code.google.com/p/webrtc/issues/detail?id=163 for details.
-      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-    }
-
-    deps = [
-      "../p2p:libstunprober",
-      "../p2p:rtc_p2p",
-      "../rtc_base:rtc_base",
-      "../rtc_base:rtc_base_approved",
-      "../system_wrappers:field_trial_default",
-    ]
-  }
-}
diff --git a/examples/DEPS b/examples/DEPS
deleted file mode 100644
index 6c26780..0000000
--- a/examples/DEPS
+++ /dev/null
@@ -1,9 +0,0 @@
-include_rules = [
-  "+WebRTC",
-  "+webrtc/api",
-  "+webrtc/media",
-  "+webrtc/modules/audio_device",
-  "+webrtc/modules/video_capture",
-  "+webrtc/p2p",
-  "+webrtc/pc",
-]
diff --git a/examples/OWNERS b/examples/OWNERS
deleted file mode 100644
index 65ae2ff..0000000
--- a/examples/OWNERS
+++ /dev/null
@@ -1,10 +0,0 @@
-glaznev@webrtc.org
-magjed@webrtc.org
-perkj@webrtc.org
-tkchin@webrtc.org
-kthelgason@webrtc.org
-
-# These are for the common case of adding or renaming files. If you're doing
-# structural changes, please get a review from a reviewer in this file.
-per-file *.gn=*
-per-file *.gni=*
diff --git a/examples/androidapp/AndroidManifest.xml b/examples/androidapp/AndroidManifest.xml
deleted file mode 100644
index d6e0ff0..0000000
--- a/examples/androidapp/AndroidManifest.xml
+++ /dev/null
@@ -1,59 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-          xmlns:tools="http://schemas.android.com/tools"
-          package="org.appspot.apprtc"
-          android:versionCode="1"
-          android:versionName="1.0">
-
-    <uses-feature android:name="android.hardware.camera" />
-    <uses-feature android:name="android.hardware.camera.autofocus" />
-    <uses-feature android:glEsVersion="0x00020000" android:required="true" />
-    <uses-sdk android:minSdkVersion="16" android:targetSdkVersion="21" />
-
-    <uses-permission android:name="android.permission.CAMERA" />
-    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
-    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
-    <uses-permission android:name="android.permission.RECORD_AUDIO" />
-    <uses-permission android:name="android.permission.BLUETOOTH" />
-    <uses-permission android:name="android.permission.INTERNET" />
-    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
-    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
-    <uses-permission android:name="android.permission.CAPTURE_VIDEO_OUTPUT" />
-
-    <!-- This is a test application that should always be debuggable. -->
-    <application android:label="@string/app_name"
-                 android:icon="@drawable/ic_launcher"
-                 android:allowBackup="false"
-                 android:debuggable="true"
-                 android:supportsRtl="false"
-                 tools:ignore="HardcodedDebugMode">
-
-        <activity android:name="ConnectActivity"
-                  android:label="@string/app_name"
-                  android:windowSoftInputMode="adjustPan">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN"/>
-                <category android:name="android.intent.category.LAUNCHER"/>
-            </intent-filter>
-
-            <intent-filter>
-                <action android:name="android.intent.action.VIEW"/>
-                <category android:name="android.intent.category.DEFAULT"/>
-                <category android:name="android.intent.category.BROWSABLE"/>
-                <data android:scheme="https" android:host="appr.tc"/>
-                <data android:scheme="http" android:host="appr.tc"/>
-            </intent-filter>
-        </activity>
-
-        <activity android:name="SettingsActivity"
-                  android:label="@string/settings_name">
-        </activity>
-
-        <activity android:name="CallActivity"
-                  android:label="@string/app_name"
-                  android:screenOrientation="fullUser"
-                  android:configChanges="orientation|smallestScreenSize|screenSize|screenLayout"
-                  android:theme="@style/CallActivityTheme">
-        </activity>
-    </application>
-</manifest>
diff --git a/examples/androidapp/OWNERS b/examples/androidapp/OWNERS
deleted file mode 100644
index 46cd5a0..0000000
--- a/examples/androidapp/OWNERS
+++ /dev/null
@@ -1,4 +0,0 @@
-magjed@webrtc.org
-sakal@webrtc.org
-
-per-file *.py=kjellander@webrtc.org
diff --git a/examples/androidapp/README b/examples/androidapp/README
deleted file mode 100644
index 97e6091..0000000
--- a/examples/androidapp/README
+++ /dev/null
@@ -1,23 +0,0 @@
-This directory contains an example Android client for https://appr.tc
-
-Prerequisites:
-- "Getting the code", "Compiling", and "Using the Bundled Android SDK/NDK"
-  on http://www.webrtc.org/native-code/android
-
-Example of building & using the app:
-
-cd <path/to/webrtc>/src
-ninja -C out/Default AppRTCMobile
-adb install -r out/Default/apks/AppRTCMobile.apk
-
-In desktop chrome, navigate to https://appr.tc and note the r=<NNN> room
-this redirects to or navigate directly to https://appr.tc/r/<NNN> with
-your own room number. Launch AppRTC on the device and add same <NNN> into the room name list.
-
-You can also run application from a command line to connect to the first room in a list:
-adb shell am start -n org.appspot.apprtc/.ConnectActivity -a android.intent.action.VIEW
-This should result in the app launching on Android and connecting to the 3-dot-apprtc
-page displayed in the desktop browser.
-To run loopback test execute following command:
-adb shell am start -n org.appspot.apprtc/.ConnectActivity -a android.intent.action.VIEW --ez "org.appspot.apprtc.LOOPBACK" true
-
diff --git a/examples/androidapp/ant.properties b/examples/androidapp/ant.properties
deleted file mode 100644
index b0971e8..0000000
--- a/examples/androidapp/ant.properties
+++ /dev/null
@@ -1,17 +0,0 @@
-# This file is used to override default values used by the Ant build system.
-#
-# This file must be checked into Version Control Systems, as it is
-# integral to the build system of your project.
-
-# This file is only used by the Ant script.
-
-# You can use this to override default values such as
-#  'source.dir' for the location of your java source folder and
-#  'out.dir' for the location of your output folder.
-
-# You can also use it define how the release builds are signed by declaring
-# the following properties:
-#  'key.store' for the location of your keystore and
-#  'key.alias' for the name of the key to use.
-# The password will be asked during the build when you use the 'release' target.
-
diff --git a/examples/androidapp/build.xml b/examples/androidapp/build.xml
deleted file mode 100644
index aa1db6d..0000000
--- a/examples/androidapp/build.xml
+++ /dev/null
@@ -1,92 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project name="AppRTCMobile" default="help">
-
-    <!-- The local.properties file is created and updated by the 'android' tool.
-         It contains the path to the SDK. It should *NOT* be checked into
-         Version Control Systems. -->
-    <property file="local.properties" />
-
-    <!-- The ant.properties file can be created by you. It is only edited by the
-         'android' tool to add properties to it.
-         This is the place to change some Ant specific build properties.
-         Here are some properties you may want to change/update:
-
-         source.dir
-             The name of the source directory. Default is 'src'.
-         out.dir
-             The name of the output directory. Default is 'bin'.
-
-         For other overridable properties, look at the beginning of the rules
-         files in the SDK, at tools/ant/build.xml
-
-         Properties related to the SDK location or the project target should
-         be updated using the 'android' tool with the 'update' action.
-
-         This file is an integral part of the build system for your
-         application and should be checked into Version Control Systems.
-
-         -->
-    <property file="ant.properties" />
-
-    <!-- if sdk.dir was not set from one of the property file, then
-         get it from the ANDROID_HOME env var.
-         This must be done before we load project.properties since
-         the proguard config can use sdk.dir -->
-    <property environment="env" />
-    <condition property="sdk.dir" value="${env.ANDROID_SDK_ROOT}">
-        <isset property="env.ANDROID_SDK_ROOT" />
-    </condition>
-
-    <!-- The project.properties file is created and updated by the 'android'
-         tool, as well as ADT.
-
-         This contains project specific properties such as project target, and library
-         dependencies. Lower level build properties are stored in ant.properties
-         (or in .classpath for Eclipse projects).
-
-         This file is an integral part of the build system for your
-         application and should be checked into Version Control Systems. -->
-    <loadproperties srcFile="project.properties" />
-
-    <!-- quick check on sdk.dir -->
-    <fail
-            message="sdk.dir is missing. Make sure to generate local.properties using 'android update project' or to inject it through the ANDROID_HOME environment variable."
-            unless="sdk.dir"
-    />
-
-    <!--
-        Import per project custom build rules if present at the root of the project.
-        This is the place to put custom intermediary targets such as:
-            -pre-build
-            -pre-compile
-            -post-compile (This is typically used for code obfuscation.
-                           Compiled code location: ${out.classes.absolute.dir}
-                           If this is not done in place, override ${out.dex.input.absolute.dir})
-            -post-package
-            -post-build
-            -pre-clean
-    -->
-    <import file="custom_rules.xml" optional="true" />
-
-    <!-- Import the actual build file.
-
-         To customize existing targets, there are two options:
-         - Customize only one target:
-             - copy/paste the target into this file, *before* the
-               <import> task.
-             - customize it to your needs.
-         - Customize the whole content of build.xml
-             - copy/paste the content of the rules files (minus the top node)
-               into this file, replacing the <import> task.
-             - customize to your needs.
-
-         ***********************
-         ****** IMPORTANT ******
-         ***********************
-         In all cases you must update the value of version-tag below to read 'custom' instead of an integer,
-         in order to avoid having your file be overridden by tools such as "android update project"
-    -->
-    <!-- version-tag: 1 -->
-    <import file="${sdk.dir}/tools/ant/build.xml" />
-
-</project>
diff --git a/examples/androidapp/project.properties b/examples/androidapp/project.properties
deleted file mode 100644
index a6ca533..0000000
--- a/examples/androidapp/project.properties
+++ /dev/null
@@ -1,16 +0,0 @@
-# This file is automatically generated by Android Tools.
-# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
-#
-# This file must be checked in Version Control Systems.
-#
-# To customize properties used by the Ant build system edit
-# "ant.properties", and override values to adapt the script to your
-# project structure.
-#
-# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
-#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
-
-# Project target.
-target=android-22
-
-java.compilerargs=-Xlint:all -Werror
diff --git a/examples/androidapp/res/drawable-hdpi/disconnect.png b/examples/androidapp/res/drawable-hdpi/disconnect.png
deleted file mode 100644
index be36174..0000000
--- a/examples/androidapp/res/drawable-hdpi/disconnect.png
+++ /dev/null
Binary files differ
diff --git a/examples/androidapp/res/drawable-hdpi/ic_action_full_screen.png b/examples/androidapp/res/drawable-hdpi/ic_action_full_screen.png
deleted file mode 100644
index 22f30d3..0000000
--- a/examples/androidapp/res/drawable-hdpi/ic_action_full_screen.png
+++ /dev/null
Binary files differ
diff --git a/examples/androidapp/res/drawable-hdpi/ic_action_return_from_full_screen.png b/examples/androidapp/res/drawable-hdpi/ic_action_return_from_full_screen.png
deleted file mode 100644
index d9436e5..0000000
--- a/examples/androidapp/res/drawable-hdpi/ic_action_return_from_full_screen.png
+++ /dev/null
Binary files differ
diff --git a/examples/androidapp/res/drawable-hdpi/ic_launcher.png b/examples/androidapp/res/drawable-hdpi/ic_launcher.png
deleted file mode 100644
index f01a31a..0000000
--- a/examples/androidapp/res/drawable-hdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/examples/androidapp/res/drawable-hdpi/ic_loopback_call.png b/examples/androidapp/res/drawable-hdpi/ic_loopback_call.png
deleted file mode 100644
index 3931185..0000000
--- a/examples/androidapp/res/drawable-hdpi/ic_loopback_call.png
+++ /dev/null
Binary files differ
diff --git a/examples/androidapp/res/drawable-ldpi/disconnect.png b/examples/androidapp/res/drawable-ldpi/disconnect.png
deleted file mode 100644
index be36174..0000000
--- a/examples/androidapp/res/drawable-ldpi/disconnect.png
+++ /dev/null
Binary files differ
diff --git a/examples/androidapp/res/drawable-ldpi/ic_action_full_screen.png b/examples/androidapp/res/drawable-ldpi/ic_action_full_screen.png
deleted file mode 100644
index e4a9ff0..0000000
--- a/examples/androidapp/res/drawable-ldpi/ic_action_full_screen.png
+++ /dev/null
Binary files differ
diff --git a/examples/androidapp/res/drawable-ldpi/ic_action_return_from_full_screen.png b/examples/androidapp/res/drawable-ldpi/ic_action_return_from_full_screen.png
deleted file mode 100644
index f5c80f0..0000000
--- a/examples/androidapp/res/drawable-ldpi/ic_action_return_from_full_screen.png
+++ /dev/null
Binary files differ
diff --git a/examples/androidapp/res/drawable-ldpi/ic_launcher.png b/examples/androidapp/res/drawable-ldpi/ic_launcher.png
deleted file mode 100644
index 5492ed7..0000000
--- a/examples/androidapp/res/drawable-ldpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/examples/androidapp/res/drawable-ldpi/ic_loopback_call.png b/examples/androidapp/res/drawable-ldpi/ic_loopback_call.png
deleted file mode 100644
index 3931185..0000000
--- a/examples/androidapp/res/drawable-ldpi/ic_loopback_call.png
+++ /dev/null
Binary files differ
diff --git a/examples/androidapp/res/drawable-mdpi/disconnect.png b/examples/androidapp/res/drawable-mdpi/disconnect.png
deleted file mode 100644
index be36174..0000000
--- a/examples/androidapp/res/drawable-mdpi/disconnect.png
+++ /dev/null
Binary files differ
diff --git a/examples/androidapp/res/drawable-mdpi/ic_action_full_screen.png b/examples/androidapp/res/drawable-mdpi/ic_action_full_screen.png
deleted file mode 100644
index e4a9ff0..0000000
--- a/examples/androidapp/res/drawable-mdpi/ic_action_full_screen.png
+++ /dev/null
Binary files differ
diff --git a/examples/androidapp/res/drawable-mdpi/ic_action_return_from_full_screen.png b/examples/androidapp/res/drawable-mdpi/ic_action_return_from_full_screen.png
deleted file mode 100644
index f5c80f0..0000000
--- a/examples/androidapp/res/drawable-mdpi/ic_action_return_from_full_screen.png
+++ /dev/null
Binary files differ
diff --git a/examples/androidapp/res/drawable-mdpi/ic_launcher.png b/examples/androidapp/res/drawable-mdpi/ic_launcher.png
deleted file mode 100644
index b8b4b0e..0000000
--- a/examples/androidapp/res/drawable-mdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/examples/androidapp/res/drawable-mdpi/ic_loopback_call.png b/examples/androidapp/res/drawable-mdpi/ic_loopback_call.png
deleted file mode 100644
index 3931185..0000000
--- a/examples/androidapp/res/drawable-mdpi/ic_loopback_call.png
+++ /dev/null
Binary files differ
diff --git a/examples/androidapp/res/drawable-xhdpi/disconnect.png b/examples/androidapp/res/drawable-xhdpi/disconnect.png
deleted file mode 100644
index be36174..0000000
--- a/examples/androidapp/res/drawable-xhdpi/disconnect.png
+++ /dev/null
Binary files differ
diff --git a/examples/androidapp/res/drawable-xhdpi/ic_action_full_screen.png b/examples/androidapp/res/drawable-xhdpi/ic_action_full_screen.png
deleted file mode 100644
index 6d90c07..0000000
--- a/examples/androidapp/res/drawable-xhdpi/ic_action_full_screen.png
+++ /dev/null
Binary files differ
diff --git a/examples/androidapp/res/drawable-xhdpi/ic_action_return_from_full_screen.png b/examples/androidapp/res/drawable-xhdpi/ic_action_return_from_full_screen.png
deleted file mode 100644
index a773b34..0000000
--- a/examples/androidapp/res/drawable-xhdpi/ic_action_return_from_full_screen.png
+++ /dev/null
Binary files differ
diff --git a/examples/androidapp/res/drawable-xhdpi/ic_launcher.png b/examples/androidapp/res/drawable-xhdpi/ic_launcher.png
deleted file mode 100644
index a3cd458..0000000
--- a/examples/androidapp/res/drawable-xhdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/examples/androidapp/res/drawable-xhdpi/ic_loopback_call.png b/examples/androidapp/res/drawable-xhdpi/ic_loopback_call.png
deleted file mode 100644
index 3931185..0000000
--- a/examples/androidapp/res/drawable-xhdpi/ic_loopback_call.png
+++ /dev/null
Binary files differ
diff --git a/examples/androidapp/res/layout/activity_call.xml b/examples/androidapp/res/layout/activity_call.xml
deleted file mode 100644
index bf81142..0000000
--- a/examples/androidapp/res/layout/activity_call.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<!-- tools:ignore is needed because lint thinks this can be replaced with a merge. Replacing this
-     with a merge causes the fullscreen SurfaceView not to be centered. -->
-<FrameLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:tools="http://schemas.android.com/tools"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    tools:ignore="MergeRootFrame">
-
-    <org.webrtc.SurfaceViewRenderer
-        android:id="@+id/fullscreen_video_view"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_gravity="center" />
-
-    <org.webrtc.SurfaceViewRenderer
-        android:id="@+id/pip_video_view"
-        android:layout_height="144dp"
-        android:layout_width="wrap_content"
-        android:layout_gravity="bottom|end"
-        android:layout_margin="16dp"/>
-
-    <FrameLayout
-        android:id="@+id/call_fragment_container"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent" />
-    <FrameLayout
-        android:id="@+id/hud_fragment_container"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent" />
-
-</FrameLayout>
diff --git a/examples/androidapp/res/layout/activity_connect.xml b/examples/androidapp/res/layout/activity_connect.xml
deleted file mode 100644
index 83707f7..0000000
--- a/examples/androidapp/res/layout/activity_connect.xml
+++ /dev/null
@@ -1,77 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_margin="16dp"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:orientation="vertical"
-    android:weightSum="1"
-    android:layout_centerHorizontal="true">
-
-    <TextView
-        android:id="@+id/room_edittext_description"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:text="@string/room_description"/>
-
-    <LinearLayout
-        android:orientation="horizontal"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:gravity="center"
-        android:layout_marginBottom="8dp">
-
-        <EditText
-            android:id="@+id/room_edittext"
-            android:layout_width="0dp"
-            android:layout_height="wrap_content"
-            android:layout_weight="1"
-            android:maxLines="1"
-            android:imeOptions="actionDone"
-            android:inputType="text"/>
-
-        <ImageButton
-            android:id="@+id/connect_button"
-            android:layout_width="48dp"
-            android:layout_height="48dp"
-            android:contentDescription="@string/connect_description"
-            android:background="@android:drawable/sym_action_call" />
-
-        <ImageButton
-            android:id="@+id/add_favorite_button"
-            android:layout_width="48dp"
-            android:layout_height="48dp"
-            android:contentDescription="@string/add_favorite_description"
-            android:background="@android:drawable/ic_input_add" />
-    </LinearLayout>
-
-    <TextView
-        android:id="@+id/room_listview_description"
-        android:layout_width="match_parent"
-        android:layout_height="48dp"
-        android:layout_marginTop="8dp"
-        android:lines="1"
-        android:maxLines="1"
-        android:textAppearance="?android:attr/textAppearanceMedium"
-        android:text="@string/favorites"
-        android:gravity="center_vertical"/>
-
-    <FrameLayout
-        android:layout_width="match_parent"
-        android:layout_height="0dp"
-        android:layout_weight="1">
-
-        <ListView
-            android:id="@+id/room_listview"
-            android:layout_width="match_parent"
-            android:layout_height="match_parent"
-            android:drawSelectorOnTop="false" />
-
-        <TextView
-            android:id="@android:id/empty"
-            android:layout_width="match_parent"
-            android:layout_height="match_parent"
-            android:gravity="center"
-            android:text="@string/no_favorites" />
-    </FrameLayout>
-</LinearLayout>
diff --git a/examples/androidapp/res/layout/fragment_call.xml b/examples/androidapp/res/layout/fragment_call.xml
deleted file mode 100644
index 90b1e9c..0000000
--- a/examples/androidapp/res/layout/fragment_call.xml
+++ /dev/null
@@ -1,77 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<RelativeLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent">
-
-    <TextView
-        android:id="@+id/contact_name_call"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_centerHorizontal="true"
-        android:layout_above="@+id/buttons_call_container"
-        android:textSize="24sp"
-        android:layout_margin="8dp"/>
-
-    <LinearLayout
-           android:id="@+id/buttons_call_container"
-           android:orientation="horizontal"
-           android:layout_above="@+id/capture_format_text_call"
-           android:layout_alignWithParentIfMissing="true"
-           android:layout_marginBottom="32dp"
-           android:layout_centerHorizontal="true"
-           android:layout_width="wrap_content"
-           android:layout_height="wrap_content">
-
-       <ImageButton
-           android:id="@+id/button_call_disconnect"
-           android:background="@drawable/disconnect"
-           android:contentDescription="@string/disconnect_call"
-           android:layout_marginEnd="16dp"
-           android:layout_width="48dp"
-           android:layout_height="48dp"/>
-
-       <ImageButton
-           android:id="@+id/button_call_switch_camera"
-           android:background="@android:drawable/ic_menu_camera"
-           android:contentDescription="@string/switch_camera"
-           android:layout_marginEnd="8dp"
-           android:layout_width="48dp"
-           android:layout_height="48dp"/>
-
-        <ImageButton
-           android:id="@+id/button_call_scaling_mode"
-           android:background="@drawable/ic_action_return_from_full_screen"
-           android:contentDescription="@string/disconnect_call"
-           android:layout_width="48dp"
-           android:layout_height="48dp"/>
-
-       <ImageButton
-           android:id="@+id/button_call_toggle_mic"
-           android:background="@android:drawable/ic_btn_speak_now"
-           android:contentDescription="@string/toggle_mic"
-           android:layout_marginEnd="8dp"
-           android:layout_width="48dp"
-           android:layout_height="48dp"/>
-    </LinearLayout>
-
-    <TextView
-        android:id="@+id/capture_format_text_call"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_centerHorizontal="true"
-        android:layout_above="@+id/capture_format_slider_call"
-        android:textSize="16sp"
-        android:text="@string/capture_format_change_text"/>
-
-    <SeekBar
-        android:id="@+id/capture_format_slider_call"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:layout_centerHorizontal="true"
-        android:layout_alignParentBottom="true"
-        android:progress="50"
-        android:layout_margin="8dp"/>
-
-</RelativeLayout>
diff --git a/examples/androidapp/res/layout/fragment_hud.xml b/examples/androidapp/res/layout/fragment_hud.xml
deleted file mode 100644
index 20d2654..0000000
--- a/examples/androidapp/res/layout/fragment_hud.xml
+++ /dev/null
@@ -1,74 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<RelativeLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent">
-
-    <ImageButton
-        android:id="@+id/button_toggle_debug"
-        android:background="@android:drawable/ic_menu_info_details"
-        android:contentDescription="@string/toggle_debug"
-        android:layout_alignParentBottom="true"
-        android:layout_alignParentStart="true"
-        android:layout_width="48dp"
-        android:layout_height="48dp"/>
-
-    <TextView
-        android:id="@+id/encoder_stat_call"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_alignParentEnd="true"
-        android:textStyle="bold"
-        android:textColor="#C000FF00"
-        android:textSize="12sp"
-        android:layout_margin="8dp"/>
-
-    <TableLayout
-           android:id="@+id/hudview_container"
-           android:layout_width="match_parent"
-           android:layout_height="match_parent">
-
-           <TableRow>
-              <TextView
-                 android:id="@+id/hud_stat_bwe"
-                 android:layout_width="wrap_content"
-                 android:layout_height="wrap_content"
-                 android:alpha="0.4"
-                 android:padding="2dip"
-                 android:background="@android:color/white"
-                 android:textColor="@android:color/black" />
-
-              <TextView
-                 android:id="@+id/hud_stat_connection"
-                 android:layout_width="wrap_content"
-                 android:layout_height="wrap_content"
-                 android:alpha="0.4"
-                 android:padding="2dip"
-                 android:background="@android:color/white"
-                 android:textColor="@android:color/black" />
-
-           </TableRow>
-
-           <TableRow>
-              <TextView
-                 android:id="@+id/hud_stat_video_send"
-                 android:layout_width="wrap_content"
-                 android:layout_height="wrap_content"
-                 android:alpha="0.4"
-                 android:padding="2dip"
-                 android:background="@android:color/white"
-                 android:textColor="@android:color/black" />
-
-              <TextView
-                 android:id="@+id/hud_stat_video_recv"
-                 android:layout_width="wrap_content"
-                 android:layout_height="wrap_content"
-                 android:padding="2dip"
-                 android:alpha="0.4"
-                 android:background="@android:color/white"
-                 android:textColor="@android:color/black" />
-            </TableRow>
-    </TableLayout>
-
-</RelativeLayout>
diff --git a/examples/androidapp/res/menu/connect_menu.xml b/examples/androidapp/res/menu/connect_menu.xml
deleted file mode 100644
index a723f54..0000000
--- a/examples/androidapp/res/menu/connect_menu.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<menu xmlns:android="http://schemas.android.com/apk/res/android">
-    <item
-        android:id="@+id/action_loopback"
-        android:icon="@drawable/ic_loopback_call"
-        android:showAsAction="always"
-        android:title="@string/action_loopback"/>
-    <item
-        android:id="@+id/action_settings"
-        android:orderInCategory="100"
-        android:icon="@android:drawable/ic_menu_preferences"
-        android:showAsAction="ifRoom"
-        android:title="@string/action_settings"/>
-</menu>
diff --git a/examples/androidapp/res/values-v17/styles.xml b/examples/androidapp/res/values-v17/styles.xml
deleted file mode 100644
index 1d72850..0000000
--- a/examples/androidapp/res/values-v17/styles.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
-  <style name="CallActivityTheme" parent="android:Theme.Black">
-    <item name="android:windowActionBar">false</item>
-    <item name="android:windowFullscreen">true</item>
-    <item name="android:windowNoTitle">true</item>
-  </style>
-</resources>
diff --git a/examples/androidapp/res/values-v21/styles.xml b/examples/androidapp/res/values-v21/styles.xml
deleted file mode 100644
index a051a23..0000000
--- a/examples/androidapp/res/values-v21/styles.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
-  <style name="AppRTCMobileActivityTheme" parent="android:Theme.Material">
-    <item name="android:windowActionBar">false</item>
-    <item name="android:windowFullscreen">true</item>
-    <item name="android:windowNoTitle">true</item>
-  </style>
-</resources>
diff --git a/examples/androidapp/res/values/arrays.xml b/examples/androidapp/res/values/arrays.xml
deleted file mode 100644
index e0e6ccb..0000000
--- a/examples/androidapp/res/values/arrays.xml
+++ /dev/null
@@ -1,60 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
-    <string-array name="videoResolutions">
-        <item>Default</item>
-        <item>4K (3840 x 2160)</item>
-        <item>Full HD (1920 x 1080)</item>
-        <item>HD (1280 x 720)</item>
-        <item>VGA (640 x 480)</item>
-        <item>QVGA (320 x 240)</item>
-    </string-array>
-
-    <string-array name="videoResolutionsValues">
-        <item>Default</item>
-        <item>3840 x 2160</item>
-        <item>1920 x 1080</item>
-        <item>1280 x 720</item>
-        <item>640 x 480</item>
-        <item>320 x 240</item>
-    </string-array>
-
-    <string-array name="cameraFps">
-        <item>Default</item>
-        <item>30 fps</item>
-        <item>15 fps</item>
-    </string-array>
-
-    <string-array name="startBitrate">
-        <item>Default</item>
-        <item>Manual</item>
-    </string-array>
-
-    <string-array name="videoCodecs">
-        <item>VP8</item>
-        <item>VP9</item>
-        <item>H264 Baseline</item>
-        <item>H264 High</item>
-    </string-array>
-
-    <string-array name="audioCodecs">
-        <item>OPUS</item>
-        <item>ISAC</item>
-    </string-array>
-
-    <string-array name="speakerphone">
-        <item>Auto (proximity sensor)</item>
-        <item>Enabled</item>
-        <item>Disabled</item>
-    </string-array>
-
-    <string-array name="speakerphoneValues">
-        <item>auto</item>
-        <item>true</item>
-        <item>false</item>
-    </string-array>
-
-    <string-array name="roomListContextMenu">
-        <item>Remove favorite</item>
-    </string-array>
-
-</resources>
diff --git a/examples/androidapp/res/values/strings.xml b/examples/androidapp/res/values/strings.xml
deleted file mode 100644
index 231475f..0000000
--- a/examples/androidapp/res/values/strings.xml
+++ /dev/null
@@ -1,216 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
-    <string name="app_name" translatable="false">AppRTC</string>
-    <string name="settings_name" translatable="false">AppRTC Settings</string>
-    <string name="disconnect_call">Disconnect Call</string>
-    <string name="room_description">
-        Please enter a room name. Room names are shared with everyone, so think
-        of something unique and send it to a friend.
-    </string>
-    <string name="favorites">Favorites</string>
-    <string name="no_favorites">No favorites</string>
-    <string name="invalid_url_title">Invalid URL</string>
-    <string name="invalid_url_text">The URL or room name you entered resulted in an invalid URL: %1$s
-    </string>
-    <string name="channel_error_title">Connection error</string>
-    <string name="connecting_to">Connecting to: %1$s</string>
-    <string name="missing_url">FATAL ERROR: Missing URL to connect to.</string>
-    <string name="camera2_texture_only_error">Camera2 only supports capturing to texture. Either disable Camera2 or enable capturing to texture in the options.</string>
-    <string name="ok">OK</string>
-    <string name="switch_camera">Switch front/back camera</string>
-    <string name="capture_format_change_text">Slide to change capture format</string>
-    <string name="muted">Muted</string>
-    <string name="toggle_debug">Toggle debug view</string>
-    <string name="toggle_mic">Toggle microphone on/off</string>
-    <string name="action_settings">Settings</string>
-    <string name="action_loopback">Loopback connection</string>
-    <string name="connect_description">Connect to the room</string>
-    <string name="add_favorite_description">Add favorite</string>
-    <string name="format_description">%1$dx%2$d @ %3$d fps</string>
-
-    <!-- Settings strings. -->
-    <string name="pref_room_key">room_preference</string>
-    <string name="pref_room_list_key">room_list_preference</string>
-
-    <string name="pref_videosettings_key">video_settings_key</string>
-    <string name="pref_videosettings_title">WebRTC video settings.</string>
-
-    <string name="pref_videocall_key">videocall_preference</string>
-    <string name="pref_videocall_title">Video call.</string>
-    <string name="pref_videocall_dlg">Enable video in a call.</string>
-    <string name="pref_videocall_default">true</string>
-
-    <string name="pref_screencapture_key">screencapture_preference</string>
-    <string name="pref_screencapture_title">Use screencapture.</string>
-    <string name="pref_screencapture_default">false</string>
-
-    <string name="pref_camera2_key">camera2_preference</string>
-    <string name="pref_camera2_title">Use Camera2.</string>
-    <string name="pref_camera2_default">true</string>
-    <string name="pref_camera2_not_supported">Not supported on this device.</string>
-
-    <string name="pref_resolution_key">resolution_preference</string>
-    <string name="pref_resolution_title">Video resolution.</string>
-    <string name="pref_resolution_dlg">Enter AppRTC local video resolution.</string>
-    <string name="pref_resolution_default">Default</string>
-
-    <string name="pref_fps_key">fps_preference</string>
-    <string name="pref_fps_title">Camera fps.</string>
-    <string name="pref_fps_dlg">Enter local camera fps.</string>
-    <string name="pref_fps_default">Default</string>
-
-    <string name="pref_capturequalityslider_key">capturequalityslider_preference</string>
-    <string name="pref_capturequalityslider_title">Capture quality slider.</string>
-    <string name="pref_capturequalityslider_dlg">Enable slider for changing capture quality.</string>
-    <string name="pref_capturequalityslider_default">false</string>
-
-    <string name="pref_maxvideobitrate_key">maxvideobitrate_preference</string>
-    <string name="pref_maxvideobitrate_title">Maximum video bitrate setting.</string>
-    <string name="pref_maxvideobitrate_dlg">Maximum video bitrate setting.</string>
-    <string name="pref_maxvideobitrate_default">Default</string>
-
-    <string name="pref_maxvideobitratevalue_key">maxvideobitratevalue_preference</string>
-    <string name="pref_maxvideobitratevalue_title">Video encoder maximum bitrate.</string>
-    <string name="pref_maxvideobitratevalue_dlg">Enter video encoder maximum bitrate in kbps.</string>
-    <string name="pref_maxvideobitratevalue_default">1700</string>
-
-    <string name="pref_videocodec_key">videocodec_preference</string>
-    <string name="pref_videocodec_title">Default video codec.</string>
-    <string name="pref_videocodec_dlg">Select default video codec.</string>
-    <string name="pref_videocodec_default">VP8</string>
-
-    <string name="pref_hwcodec_key">hwcodec_preference</string>
-    <string name="pref_hwcodec_title">Video codec hardware acceleration.</string>
-    <string name="pref_hwcodec_dlg">Use hardware accelerated video codec (if available).</string>
-    <string name="pref_hwcodec_default">true</string>
-
-    <string name="pref_capturetotexture_key">capturetotexture_preference</string>
-    <string name="pref_capturetotexture_title">Video capture to surface texture.</string>
-    <string name="pref_capturetotexture_dlg">Capture video to textures (if available).</string>
-    <string name="pref_capturetotexture_default">true</string>
-
-    <string name="pref_flexfec_key">flexfec_preference</string>
-    <string name="pref_flexfec_title">Codec-agnostic Flexible FEC.</string>
-    <string name="pref_flexfec_dlg">Enable FlexFEC.</string>
-    <string name="pref_flexfec_default">false</string>
-
-    <string name="pref_value_enabled">Enabled</string>
-    <string name="pref_value_disabled">Disabled</string>
-
-    <string name="pref_audiosettings_key">audio_settings_key</string>
-    <string name="pref_audiosettings_title">WebRTC audio settings.</string>
-
-    <string name="pref_startaudiobitrate_key">startaudiobitrate_preference</string>
-    <string name="pref_startaudiobitrate_title">Audio bitrate setting.</string>
-    <string name="pref_startaudiobitrate_dlg">Audio bitrate setting.</string>
-    <string name="pref_startaudiobitrate_default">Default</string>
-
-    <string name="pref_startaudiobitratevalue_key">startaudiobitratevalue_preference</string>
-    <string name="pref_startaudiobitratevalue_title">Audio codec bitrate.</string>
-    <string name="pref_startaudiobitratevalue_dlg">Enter audio codec bitrate in kbps.</string>
-    <string name="pref_startaudiobitratevalue_default">32</string>
-
-    <string name="pref_audiocodec_key">audiocodec_preference</string>
-    <string name="pref_audiocodec_title">Default audio codec.</string>
-    <string name="pref_audiocodec_dlg">Select default audio codec.</string>
-    <string name="pref_audiocodec_default">OPUS</string>
-
-    <string name="pref_noaudioprocessing_key">audioprocessing_preference</string>
-    <string name="pref_noaudioprocessing_title">Disable audio processing.</string>
-    <string name="pref_noaudioprocessing_dlg">Disable audio processing pipeline.</string>
-    <string name="pref_noaudioprocessing_default">false</string>
-
-    <string name="pref_aecdump_key">aecdump_preference</string>
-    <string name="pref_aecdump_title">Create aecdump.</string>
-    <string name="pref_aecdump_dlg">Enable diagnostic audio recordings.</string>
-    <string name="pref_aecdump_default">false</string>
-
-    <string name="pref_opensles_key">opensles_preference</string>
-    <string name="pref_opensles_title">Use OpenSL ES for audio playback.</string>
-    <string name="pref_opensles_dlg">Use OpenSL ES for audio playback.</string>
-    <string name="pref_opensles_default">false</string>
-
-    <string name="pref_disable_built_in_aec_key">disable_built_in_aec_preference</string>
-    <string name="pref_disable_built_in_aec_title">Disable hardware AEC.</string>
-    <string name="pref_disable_built_in_aec_dlg">Disable hardware AEC.</string>
-    <string name="pref_disable_built_in_aec_default">false</string>
-    <string name="pref_built_in_aec_not_available">Hardware AEC is not available</string>
-
-    <string name="pref_disable_built_in_agc_key">disable_built_in_agc_preference</string>
-    <string name="pref_disable_built_in_agc_title">Disable hardware AGC.</string>
-    <string name="pref_disable_built_in_agc_dlg">Disable hardware AGC.</string>
-    <string name="pref_disable_built_in_agc_default">false</string>
-    <string name="pref_built_in_agc_not_available">Hardware AGC is not available</string>
-
-    <string name="pref_disable_built_in_ns_key">disable_built_in_ns_preference</string>
-    <string name="pref_disable_built_in_ns_title">Disable hardware NS.</string>
-    <string name="pref_disable_built_in_ns_dlg">Disable hardware NS.</string>
-    <string name="pref_disable_built_in_ns_default">false</string>
-    <string name="pref_built_in_ns_not_available">Hardware NS is not available</string>
-
-    <string name="pref_enable_level_control_key">enable_level_control_preference</string>
-    <string name="pref_enable_level_control_title">Enable level control.</string>
-    <string name="pref_enable_level_control_default">false</string>
-
-    <string name="pref_disable_webrtc_agc_and_hpf_key">disable_webrtc_agc_and_hpf_preference</string>
-    <string name="pref_disable_webrtc_agc_and_hpf_title">Disable WebRTC AGC and HPF.</string>
-    <string name="pref_disable_webrtc_agc_default">false</string>
-
-    <string name="pref_speakerphone_key">speakerphone_preference</string>
-    <string name="pref_speakerphone_title">Speakerphone.</string>
-    <string name="pref_speakerphone_dlg">Speakerphone.</string>
-    <string name="pref_speakerphone_default">auto</string>
-
-    <string name="pref_datasettings_key">data_settings_key</string>
-    <string name="pref_datasettings_title">WebRTC data channel settings.</string>
-
-    <string name="pref_enable_datachannel_key">enable_datachannel_preference</string>
-    <string name="pref_enable_datachannel_title">Enable datachannel.</string>
-    <string name="pref_enable_datachannel_default" translatable="false">true</string>
-
-    <string name="pref_ordered_key">ordered_preference</string>
-    <string name="pref_ordered_title">Order messages.</string>
-    <string name="pref_ordered_default" translatable="false">true</string>
-
-    <string name="pref_data_protocol_key">Subprotocol</string>
-    <string name="pref_data_protocol_title">Subprotocol.</string>
-    <string name="pref_data_protocol_dlg">Enter subprotocol.</string>
-    <string name="pref_data_protocol_default" translatable="false"></string>
-
-    <string name="pref_negotiated_key">negotiated_preference</string>
-    <string name="pref_negotiated_title">Negotiated.</string>
-    <string name="pref_negotiated_default" translatable="false">false</string>
-
-    <string name="pref_max_retransmit_time_ms_key">max_retransmit_time_ms_preference</string>
-    <string name="pref_max_retransmit_time_ms_title">Max delay to retransmit.</string>
-    <string name="pref_max_retransmit_time_ms_dlg">Enter max delay to retransmit (in ms).</string>
-    <string name="pref_max_retransmit_time_ms_default" translatable="false">-1</string>
-
-    <string name="pref_max_retransmits_key">max_retransmits_preference</string>
-    <string name="pref_max_retransmits_title">Max attempts to retransmit.</string>
-    <string name="pref_max_retransmits_dlg">Enter max attempts to retransmit.</string>
-    <string name="pref_max_retransmits_default" translatable="false">-1</string>
-
-    <string name="pref_data_id_key">data_id_preference</string>
-    <string name="pref_data_id_title">Data id.</string>
-    <string name="pref_data_id_dlg">Enter data channel id.</string>
-    <string name="pref_data_id_default" translatable="false">-1</string>
-
-    <string name="pref_miscsettings_key">misc_settings_key</string>
-    <string name="pref_miscsettings_title">Miscellaneous settings.</string>
-
-    <string name="pref_room_server_url_key">room_server_url_preference</string>
-    <string name="pref_room_server_url_title">Room server URL.</string>
-    <string name="pref_room_server_url_dlg">Enter a room server URL.</string>
-    <string name="pref_room_server_url_default" translatable="false">https://appr.tc</string>
-
-    <string name="pref_displayhud_key">displayhud_preference</string>
-    <string name="pref_displayhud_title">Display call statistics.</string>
-    <string name="pref_displayhud_dlg">Display call statistics.</string>
-    <string name="pref_displayhud_default" translatable="false">false</string>
-
-    <string name="pref_tracing_key">tracing_preference</string>
-    <string name="pref_tracing_title">Debug performance tracing.</string>
-    <string name="pref_tracing_dlg">Debug performance tracing.</string>
-    <string name="pref_tracing_default" translatable="false">false</string>
-</resources>
diff --git a/examples/androidapp/res/xml/preferences.xml b/examples/androidapp/res/xml/preferences.xml
deleted file mode 100644
index c9fe750..0000000
--- a/examples/androidapp/res/xml/preferences.xml
+++ /dev/null
@@ -1,241 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
-    <PreferenceCategory
-        android:key="@string/pref_videosettings_key"
-        android:title="@string/pref_videosettings_title">
-
-        <CheckBoxPreference
-            android:key="@string/pref_videocall_key"
-            android:title="@string/pref_videocall_title"
-            android:dialogTitle="@string/pref_videocall_dlg"
-            android:defaultValue="@string/pref_videocall_default" />
-
-        <CheckBoxPreference
-            android:key="@string/pref_screencapture_key"
-            android:title="@string/pref_screencapture_title"
-            android:defaultValue="@string/pref_screencapture_default" />
-
-        <CheckBoxPreference
-            android:key="@string/pref_camera2_key"
-            android:title="@string/pref_camera2_title"
-            android:defaultValue="@string/pref_camera2_default" />
-
-        <ListPreference
-            android:key="@string/pref_resolution_key"
-            android:title="@string/pref_resolution_title"
-            android:defaultValue="@string/pref_resolution_default"
-            android:dialogTitle="@string/pref_resolution_dlg"
-            android:entries="@array/videoResolutions"
-            android:entryValues="@array/videoResolutionsValues" />
-
-        <ListPreference
-            android:key="@string/pref_fps_key"
-            android:title="@string/pref_fps_title"
-            android:defaultValue="@string/pref_fps_default"
-            android:dialogTitle="@string/pref_fps_dlg"
-            android:entries="@array/cameraFps"
-            android:entryValues="@array/cameraFps" />
-
-        <CheckBoxPreference
-            android:key="@string/pref_capturequalityslider_key"
-            android:title="@string/pref_capturequalityslider_title"
-            android:dialogTitle="@string/pref_capturequalityslider_dlg"
-            android:defaultValue="@string/pref_capturequalityslider_default" />
-
-        <ListPreference
-            android:key="@string/pref_maxvideobitrate_key"
-            android:title="@string/pref_maxvideobitrate_title"
-            android:defaultValue="@string/pref_maxvideobitrate_default"
-            android:dialogTitle="@string/pref_maxvideobitrate_dlg"
-            android:entries="@array/startBitrate"
-            android:entryValues="@array/startBitrate" />
-
-        <EditTextPreference
-            android:key="@string/pref_maxvideobitratevalue_key"
-            android:title="@string/pref_maxvideobitratevalue_title"
-            android:inputType="number"
-            android:defaultValue="@string/pref_maxvideobitratevalue_default"
-            android:dialogTitle="@string/pref_maxvideobitratevalue_dlg" />
-
-        <ListPreference
-            android:key="@string/pref_videocodec_key"
-            android:title="@string/pref_videocodec_title"
-            android:defaultValue="@string/pref_videocodec_default"
-            android:dialogTitle="@string/pref_videocodec_dlg"
-            android:entries="@array/videoCodecs"
-            android:entryValues="@array/videoCodecs" />
-
-        <CheckBoxPreference
-            android:key="@string/pref_hwcodec_key"
-            android:title="@string/pref_hwcodec_title"
-            android:dialogTitle="@string/pref_hwcodec_dlg"
-            android:defaultValue="@string/pref_hwcodec_default" />
-
-        <CheckBoxPreference
-            android:key="@string/pref_capturetotexture_key"
-            android:title="@string/pref_capturetotexture_title"
-            android:dialogTitle="@string/pref_capturetotexture_dlg"
-            android:defaultValue="@string/pref_capturetotexture_default" />
-
-        <CheckBoxPreference
-            android:key="@string/pref_flexfec_key"
-            android:title="@string/pref_flexfec_title"
-            android:dialogTitle="@string/pref_flexfec_dlg"
-            android:defaultValue="@string/pref_flexfec_default" />
-    </PreferenceCategory>
-
-    <PreferenceCategory
-        android:key="@string/pref_audiosettings_key"
-        android:title="@string/pref_audiosettings_title">
-
-        <ListPreference
-            android:key="@string/pref_startaudiobitrate_key"
-            android:title="@string/pref_startaudiobitrate_title"
-            android:defaultValue="@string/pref_startaudiobitrate_default"
-            android:dialogTitle="@string/pref_startaudiobitrate_dlg"
-            android:entries="@array/startBitrate"
-            android:entryValues="@array/startBitrate" />
-
-        <EditTextPreference
-            android:key="@string/pref_startaudiobitratevalue_key"
-            android:title="@string/pref_startaudiobitratevalue_title"
-            android:inputType="number"
-            android:defaultValue="@string/pref_startaudiobitratevalue_default"
-            android:dialogTitle="@string/pref_startaudiobitratevalue_dlg" />
-
-        <ListPreference
-            android:key="@string/pref_audiocodec_key"
-            android:title="@string/pref_audiocodec_title"
-            android:defaultValue="@string/pref_audiocodec_default"
-            android:dialogTitle="@string/pref_audiocodec_dlg"
-            android:entries="@array/audioCodecs"
-            android:entryValues="@array/audioCodecs" />
-
-        <CheckBoxPreference
-            android:key="@string/pref_noaudioprocessing_key"
-            android:title="@string/pref_noaudioprocessing_title"
-            android:dialogTitle="@string/pref_noaudioprocessing_dlg"
-            android:defaultValue="@string/pref_noaudioprocessing_default" />
-
-        <CheckBoxPreference
-            android:key="@string/pref_aecdump_key"
-            android:title="@string/pref_aecdump_title"
-            android:dialogTitle="@string/pref_aecdump_dlg"
-            android:defaultValue="@string/pref_aecdump_default" />
-
-        <CheckBoxPreference
-            android:key="@string/pref_opensles_key"
-            android:title="@string/pref_opensles_title"
-            android:dialogTitle="@string/pref_opensles_dlg"
-            android:defaultValue="@string/pref_opensles_default" />
-
-        <CheckBoxPreference
-            android:key="@string/pref_disable_built_in_aec_key"
-            android:title="@string/pref_disable_built_in_aec_title"
-            android:dialogTitle="@string/pref_disable_built_in_aec_dlg"
-            android:defaultValue="@string/pref_disable_built_in_aec_default" />
-
-        <CheckBoxPreference
-            android:key="@string/pref_disable_built_in_agc_key"
-            android:title="@string/pref_disable_built_in_agc_title"
-            android:dialogTitle="@string/pref_disable_built_in_agc_dlg"
-            android:defaultValue="@string/pref_disable_built_in_agc_default" />
-
-        <CheckBoxPreference
-            android:key="@string/pref_disable_built_in_ns_key"
-            android:title="@string/pref_disable_built_in_ns_title"
-            android:dialogTitle="@string/pref_disable_built_in_ns_dlg"
-            android:defaultValue="@string/pref_disable_built_in_ns_default" />
-
-        <CheckBoxPreference
-            android:key="@string/pref_enable_level_control_key"
-            android:title="@string/pref_enable_level_control_title"
-            android:defaultValue="@string/pref_enable_level_control_default" />
-
-        <CheckBoxPreference
-            android:key="@string/pref_disable_webrtc_agc_and_hpf_key"
-            android:title="@string/pref_disable_webrtc_agc_and_hpf_title"
-            android:defaultValue="@string/pref_disable_webrtc_agc_default" />
-
-        <ListPreference
-            android:key="@string/pref_speakerphone_key"
-            android:title="@string/pref_speakerphone_title"
-            android:defaultValue="@string/pref_speakerphone_default"
-            android:dialogTitle="@string/pref_speakerphone_dlg"
-            android:entries="@array/speakerphone"
-            android:entryValues="@array/speakerphoneValues" />
-    </PreferenceCategory>
-
-    <PreferenceCategory
-        android:key="@string/pref_datasettings_key"
-        android:title="@string/pref_datasettings_title">
-
-        <CheckBoxPreference
-            android:key="@string/pref_enable_datachannel_key"
-            android:title="@string/pref_enable_datachannel_title"
-            android:defaultValue="@string/pref_enable_datachannel_default" />
-
-        <CheckBoxPreference
-            android:key="@string/pref_ordered_key"
-            android:title="@string/pref_ordered_title"
-            android:defaultValue="@string/pref_ordered_default" />
-
-        <EditTextPreference
-            android:key="@string/pref_data_protocol_key"
-            android:title="@string/pref_data_protocol_title"
-            android:inputType="text"
-            android:defaultValue="@string/pref_data_protocol_default"
-            android:dialogTitle="@string/pref_data_protocol_dlg" />
-
-        <CheckBoxPreference
-            android:key="@string/pref_negotiated_key"
-            android:title="@string/pref_negotiated_title"
-            android:defaultValue="@string/pref_negotiated_default" />
-
-        <EditTextPreference
-            android:key="@string/pref_max_retransmit_time_ms_key"
-            android:title="@string/pref_max_retransmit_time_ms_title"
-            android:inputType="number"
-            android:defaultValue="@string/pref_max_retransmit_time_ms_default"
-            android:dialogTitle="@string/pref_max_retransmit_time_ms_dlg" />
-
-        <EditTextPreference
-            android:key="@string/pref_max_retransmits_key"
-            android:title="@string/pref_max_retransmits_title"
-            android:inputType="number"
-            android:defaultValue="@string/pref_max_retransmits_default"
-            android:dialogTitle="@string/pref_max_retransmits_dlg" />
-
-        <EditTextPreference
-            android:key="@string/pref_data_id_key"
-            android:title="@string/pref_data_id_title"
-            android:inputType="number"
-            android:defaultValue="@string/pref_data_id_default"
-            android:dialogTitle="@string/pref_data_id_dlg" />
-    </PreferenceCategory>
-
-    <PreferenceCategory
-        android:key="@string/pref_miscsettings_key"
-        android:title="@string/pref_miscsettings_title">
-
-        <EditTextPreference
-            android:key="@string/pref_room_server_url_key"
-            android:title="@string/pref_room_server_url_title"
-            android:inputType="text"
-            android:defaultValue="@string/pref_room_server_url_default"
-            android:dialogTitle="@string/pref_room_server_url_dlg" />
-
-        <CheckBoxPreference
-            android:key="@string/pref_displayhud_key"
-            android:title="@string/pref_displayhud_title"
-            android:dialogTitle="@string/pref_displayhud_dlg"
-           android:defaultValue="@string/pref_displayhud_default" />
-
-        <CheckBoxPreference
-            android:key="@string/pref_tracing_key"
-            android:title="@string/pref_tracing_title"
-            android:dialogTitle="@string/pref_tracing_dlg"
-           android:defaultValue="@string/pref_tracing_default" />
-    </PreferenceCategory>
-
-</PreferenceScreen>
diff --git a/examples/androidapp/src/org/appspot/apprtc/AppRTCAudioManager.java b/examples/androidapp/src/org/appspot/apprtc/AppRTCAudioManager.java
deleted file mode 100644
index fb4914e..0000000
--- a/examples/androidapp/src/org/appspot/apprtc/AppRTCAudioManager.java
+++ /dev/null
@@ -1,595 +0,0 @@
-/*
- *  Copyright 2014 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.
- */
-
-package org.appspot.apprtc;
-
-import org.appspot.apprtc.util.AppRTCUtils;
-
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.content.SharedPreferences;
-import android.content.pm.PackageManager;
-import android.media.AudioDeviceInfo;
-import android.media.AudioManager;
-import android.os.Build;
-import android.preference.PreferenceManager;
-import android.util.Log;
-
-import org.webrtc.ThreadUtils;
-
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-/**
- * AppRTCAudioManager manages all audio related parts of the AppRTC demo.
- */
-public class AppRTCAudioManager {
-  private static final String TAG = "AppRTCAudioManager";
-  private static final String SPEAKERPHONE_AUTO = "auto";
-  private static final String SPEAKERPHONE_TRUE = "true";
-  private static final String SPEAKERPHONE_FALSE = "false";
-
-  /**
-   * AudioDevice is the names of possible audio devices that we currently
-   * support.
-   */
-  public enum AudioDevice { SPEAKER_PHONE, WIRED_HEADSET, EARPIECE, BLUETOOTH, NONE }
-
-  /** AudioManager state. */
-  public enum AudioManagerState {
-    UNINITIALIZED,
-    PREINITIALIZED,
-    RUNNING,
-  }
-
-  /** Selected audio device change event. */
-  public static interface AudioManagerEvents {
-    // Callback fired once audio device is changed or list of available audio devices changed.
-    void onAudioDeviceChanged(
-        AudioDevice selectedAudioDevice, Set<AudioDevice> availableAudioDevices);
-  }
-
-  private final Context apprtcContext;
-  private AudioManager audioManager;
-
-  private AudioManagerEvents audioManagerEvents;
-  private AudioManagerState amState;
-  private int savedAudioMode = AudioManager.MODE_INVALID;
-  private boolean savedIsSpeakerPhoneOn = false;
-  private boolean savedIsMicrophoneMute = false;
-  private boolean hasWiredHeadset = false;
-
-  // Default audio device; speaker phone for video calls or earpiece for audio
-  // only calls.
-  private AudioDevice defaultAudioDevice;
-
-  // Contains the currently selected audio device.
-  // This device is changed automatically using a certain scheme where e.g.
-  // a wired headset "wins" over speaker phone. It is also possible for a
-  // user to explicitly select a device (and overrid any predefined scheme).
-  // See |userSelectedAudioDevice| for details.
-  private AudioDevice selectedAudioDevice;
-
-  // Contains the user-selected audio device which overrides the predefined
-  // selection scheme.
-  // TODO(henrika): always set to AudioDevice.NONE today. Add support for
-  // explicit selection based on choice by userSelectedAudioDevice.
-  private AudioDevice userSelectedAudioDevice;
-
-  // Contains speakerphone setting: auto, true or false
-  private final String useSpeakerphone;
-
-  // Proximity sensor object. It measures the proximity of an object in cm
-  // relative to the view screen of a device and can therefore be used to
-  // assist device switching (close to ear <=> use headset earpiece if
-  // available, far from ear <=> use speaker phone).
-  private AppRTCProximitySensor proximitySensor = null;
-
-  // Handles all tasks related to Bluetooth headset devices.
-  private final AppRTCBluetoothManager bluetoothManager;
-
-  // Contains a list of available audio devices. A Set collection is used to
-  // avoid duplicate elements.
-  private Set<AudioDevice> audioDevices = new HashSet<AudioDevice>();
-
-  // Broadcast receiver for wired headset intent broadcasts.
-  private BroadcastReceiver wiredHeadsetReceiver;
-
-  // Callback method for changes in audio focus.
-  private AudioManager.OnAudioFocusChangeListener audioFocusChangeListener;
-
-  /**
-   * This method is called when the proximity sensor reports a state change,
-   * e.g. from "NEAR to FAR" or from "FAR to NEAR".
-   */
-  private void onProximitySensorChangedState() {
-    if (!useSpeakerphone.equals(SPEAKERPHONE_AUTO)) {
-      return;
-    }
-
-    // The proximity sensor should only be activated when there are exactly two
-    // available audio devices.
-    if (audioDevices.size() == 2 && audioDevices.contains(AppRTCAudioManager.AudioDevice.EARPIECE)
-        && audioDevices.contains(AppRTCAudioManager.AudioDevice.SPEAKER_PHONE)) {
-      if (proximitySensor.sensorReportsNearState()) {
-        // Sensor reports that a "handset is being held up to a person's ear",
-        // or "something is covering the light sensor".
-        setAudioDeviceInternal(AppRTCAudioManager.AudioDevice.EARPIECE);
-      } else {
-        // Sensor reports that a "handset is removed from a person's ear", or
-        // "the light sensor is no longer covered".
-        setAudioDeviceInternal(AppRTCAudioManager.AudioDevice.SPEAKER_PHONE);
-      }
-    }
-  }
-
-  /* Receiver which handles changes in wired headset availability. */
-  private class WiredHeadsetReceiver extends BroadcastReceiver {
-    private static final int STATE_UNPLUGGED = 0;
-    private static final int STATE_PLUGGED = 1;
-    private static final int HAS_NO_MIC = 0;
-    private static final int HAS_MIC = 1;
-
-    @Override
-    public void onReceive(Context context, Intent intent) {
-      int state = intent.getIntExtra("state", STATE_UNPLUGGED);
-      int microphone = intent.getIntExtra("microphone", HAS_NO_MIC);
-      String name = intent.getStringExtra("name");
-      Log.d(TAG, "WiredHeadsetReceiver.onReceive" + AppRTCUtils.getThreadInfo() + ": "
-              + "a=" + intent.getAction() + ", s="
-              + (state == STATE_UNPLUGGED ? "unplugged" : "plugged") + ", m="
-              + (microphone == HAS_MIC ? "mic" : "no mic") + ", n=" + name + ", sb="
-              + isInitialStickyBroadcast());
-      hasWiredHeadset = (state == STATE_PLUGGED);
-      updateAudioDeviceState();
-    }
-  };
-
-  /** Construction. */
-  static AppRTCAudioManager create(Context context) {
-    return new AppRTCAudioManager(context);
-  }
-
-  private AppRTCAudioManager(Context context) {
-    Log.d(TAG, "ctor");
-    ThreadUtils.checkIsOnMainThread();
-    apprtcContext = context;
-    audioManager = ((AudioManager) context.getSystemService(Context.AUDIO_SERVICE));
-    bluetoothManager = AppRTCBluetoothManager.create(context, this);
-    wiredHeadsetReceiver = new WiredHeadsetReceiver();
-    amState = AudioManagerState.UNINITIALIZED;
-
-    SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context);
-    useSpeakerphone = sharedPreferences.getString(context.getString(R.string.pref_speakerphone_key),
-        context.getString(R.string.pref_speakerphone_default));
-    Log.d(TAG, "useSpeakerphone: " + useSpeakerphone);
-    if (useSpeakerphone.equals(SPEAKERPHONE_FALSE)) {
-      defaultAudioDevice = AudioDevice.EARPIECE;
-    } else {
-      defaultAudioDevice = AudioDevice.SPEAKER_PHONE;
-    }
-
-    // Create and initialize the proximity sensor.
-    // Tablet devices (e.g. Nexus 7) does not support proximity sensors.
-    // Note that, the sensor will not be active until start() has been called.
-    proximitySensor = AppRTCProximitySensor.create(context, new Runnable() {
-      // This method will be called each time a state change is detected.
-      // Example: user holds his hand over the device (closer than ~5 cm),
-      // or removes his hand from the device.
-      public void run() {
-        onProximitySensorChangedState();
-      }
-    });
-
-    Log.d(TAG, "defaultAudioDevice: " + defaultAudioDevice);
-    AppRTCUtils.logDeviceInfo(TAG);
-  }
-
-  public void start(AudioManagerEvents audioManagerEvents) {
-    Log.d(TAG, "start");
-    ThreadUtils.checkIsOnMainThread();
-    if (amState == AudioManagerState.RUNNING) {
-      Log.e(TAG, "AudioManager is already active");
-      return;
-    }
-    // TODO(henrika): perhaps call new method called preInitAudio() here if UNINITIALIZED.
-
-    Log.d(TAG, "AudioManager starts...");
-    this.audioManagerEvents = audioManagerEvents;
-    amState = AudioManagerState.RUNNING;
-
-    // Store current audio state so we can restore it when stop() is called.
-    savedAudioMode = audioManager.getMode();
-    savedIsSpeakerPhoneOn = audioManager.isSpeakerphoneOn();
-    savedIsMicrophoneMute = audioManager.isMicrophoneMute();
-    hasWiredHeadset = hasWiredHeadset();
-
-    // Create an AudioManager.OnAudioFocusChangeListener instance.
-    audioFocusChangeListener = new AudioManager.OnAudioFocusChangeListener() {
-      // Called on the listener to notify if the audio focus for this listener has been changed.
-      // The |focusChange| value indicates whether the focus was gained, whether the focus was lost,
-      // and whether that loss is transient, or whether the new focus holder will hold it for an
-      // unknown amount of time.
-      // TODO(henrika): possibly extend support of handling audio-focus changes. Only contains
-      // logging for now.
-      @Override
-      public void onAudioFocusChange(int focusChange) {
-        String typeOfChange = "AUDIOFOCUS_NOT_DEFINED";
-        switch (focusChange) {
-          case AudioManager.AUDIOFOCUS_GAIN:
-            typeOfChange = "AUDIOFOCUS_GAIN";
-            break;
-          case AudioManager.AUDIOFOCUS_GAIN_TRANSIENT:
-            typeOfChange = "AUDIOFOCUS_GAIN_TRANSIENT";
-            break;
-          case AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE:
-            typeOfChange = "AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE";
-            break;
-          case AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK:
-            typeOfChange = "AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK";
-            break;
-          case AudioManager.AUDIOFOCUS_LOSS:
-            typeOfChange = "AUDIOFOCUS_LOSS";
-            break;
-          case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:
-            typeOfChange = "AUDIOFOCUS_LOSS_TRANSIENT";
-            break;
-          case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:
-            typeOfChange = "AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK";
-            break;
-          default:
-            typeOfChange = "AUDIOFOCUS_INVALID";
-            break;
-        }
-        Log.d(TAG, "onAudioFocusChange: " + typeOfChange);
-      }
-    };
-
-    // Request audio playout focus (without ducking) and install listener for changes in focus.
-    int result = audioManager.requestAudioFocus(audioFocusChangeListener,
-        AudioManager.STREAM_VOICE_CALL, AudioManager.AUDIOFOCUS_GAIN_TRANSIENT);
-    if (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
-      Log.d(TAG, "Audio focus request granted for VOICE_CALL streams");
-    } else {
-      Log.e(TAG, "Audio focus request failed");
-    }
-
-    // Start by setting MODE_IN_COMMUNICATION as default audio mode. It is
-    // required to be in this mode when playout and/or recording starts for
-    // best possible VoIP performance.
-    audioManager.setMode(AudioManager.MODE_IN_COMMUNICATION);
-
-    // Always disable microphone mute during a WebRTC call.
-    setMicrophoneMute(false);
-
-    // Set initial device states.
-    userSelectedAudioDevice = AudioDevice.NONE;
-    selectedAudioDevice = AudioDevice.NONE;
-    audioDevices.clear();
-
-    // Initialize and start Bluetooth if a BT device is available or initiate
-    // detection of new (enabled) BT devices.
-    bluetoothManager.start();
-
-    // Do initial selection of audio device. This setting can later be changed
-    // either by adding/removing a BT or wired headset or by covering/uncovering
-    // the proximity sensor.
-    updateAudioDeviceState();
-
-    // Register receiver for broadcast intents related to adding/removing a
-    // wired headset.
-    registerReceiver(wiredHeadsetReceiver, new IntentFilter(Intent.ACTION_HEADSET_PLUG));
-    Log.d(TAG, "AudioManager started");
-  }
-
-  public void stop() {
-    Log.d(TAG, "stop");
-    ThreadUtils.checkIsOnMainThread();
-    if (amState != AudioManagerState.RUNNING) {
-      Log.e(TAG, "Trying to stop AudioManager in incorrect state: " + amState);
-      return;
-    }
-    amState = AudioManagerState.UNINITIALIZED;
-
-    unregisterReceiver(wiredHeadsetReceiver);
-
-    bluetoothManager.stop();
-
-    // Restore previously stored audio states.
-    setSpeakerphoneOn(savedIsSpeakerPhoneOn);
-    setMicrophoneMute(savedIsMicrophoneMute);
-    audioManager.setMode(savedAudioMode);
-
-    // Abandon audio focus. Gives the previous focus owner, if any, focus.
-    audioManager.abandonAudioFocus(audioFocusChangeListener);
-    audioFocusChangeListener = null;
-    Log.d(TAG, "Abandoned audio focus for VOICE_CALL streams");
-
-    if (proximitySensor != null) {
-      proximitySensor.stop();
-      proximitySensor = null;
-    }
-
-    audioManagerEvents = null;
-    Log.d(TAG, "AudioManager stopped");
-  }
-
-  /** Changes selection of the currently active audio device. */
-  private void setAudioDeviceInternal(AudioDevice device) {
-    Log.d(TAG, "setAudioDeviceInternal(device=" + device + ")");
-    AppRTCUtils.assertIsTrue(audioDevices.contains(device));
-
-    switch (device) {
-      case SPEAKER_PHONE:
-        setSpeakerphoneOn(true);
-        break;
-      case EARPIECE:
-        setSpeakerphoneOn(false);
-        break;
-      case WIRED_HEADSET:
-        setSpeakerphoneOn(false);
-        break;
-      case BLUETOOTH:
-        setSpeakerphoneOn(false);
-        break;
-      default:
-        Log.e(TAG, "Invalid audio device selection");
-        break;
-    }
-    selectedAudioDevice = device;
-  }
-
-  /**
-   * Changes default audio device.
-   * TODO(henrika): add usage of this method in the AppRTCMobile client.
-   */
-  public void setDefaultAudioDevice(AudioDevice defaultDevice) {
-    ThreadUtils.checkIsOnMainThread();
-    switch (defaultDevice) {
-      case SPEAKER_PHONE:
-        defaultAudioDevice = defaultDevice;
-        break;
-      case EARPIECE:
-        if (hasEarpiece()) {
-          defaultAudioDevice = defaultDevice;
-        } else {
-          defaultAudioDevice = AudioDevice.SPEAKER_PHONE;
-        }
-        break;
-      default:
-        Log.e(TAG, "Invalid default audio device selection");
-        break;
-    }
-    Log.d(TAG, "setDefaultAudioDevice(device=" + defaultAudioDevice + ")");
-    updateAudioDeviceState();
-  }
-
-  /** Changes selection of the currently active audio device. */
-  public void selectAudioDevice(AudioDevice device) {
-    ThreadUtils.checkIsOnMainThread();
-    if (!audioDevices.contains(device)) {
-      Log.e(TAG, "Can not select " + device + " from available " + audioDevices);
-    }
-    userSelectedAudioDevice = device;
-    updateAudioDeviceState();
-  }
-
-  /** Returns current set of available/selectable audio devices. */
-  public Set<AudioDevice> getAudioDevices() {
-    ThreadUtils.checkIsOnMainThread();
-    return Collections.unmodifiableSet(new HashSet<AudioDevice>(audioDevices));
-  }
-
-  /** Returns the currently selected audio device. */
-  public AudioDevice getSelectedAudioDevice() {
-    ThreadUtils.checkIsOnMainThread();
-    return selectedAudioDevice;
-  }
-
-  /** Helper method for receiver registration. */
-  private void registerReceiver(BroadcastReceiver receiver, IntentFilter filter) {
-    apprtcContext.registerReceiver(receiver, filter);
-  }
-
-  /** Helper method for unregistration of an existing receiver. */
-  private void unregisterReceiver(BroadcastReceiver receiver) {
-    apprtcContext.unregisterReceiver(receiver);
-  }
-
-  /** Sets the speaker phone mode. */
-  private void setSpeakerphoneOn(boolean on) {
-    boolean wasOn = audioManager.isSpeakerphoneOn();
-    if (wasOn == on) {
-      return;
-    }
-    audioManager.setSpeakerphoneOn(on);
-  }
-
-  /** Sets the microphone mute state. */
-  private void setMicrophoneMute(boolean on) {
-    boolean wasMuted = audioManager.isMicrophoneMute();
-    if (wasMuted == on) {
-      return;
-    }
-    audioManager.setMicrophoneMute(on);
-  }
-
-  /** Gets the current earpiece state. */
-  private boolean hasEarpiece() {
-    return apprtcContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_TELEPHONY);
-  }
-
-  /**
-   * Checks whether a wired headset is connected or not.
-   * This is not a valid indication that audio playback is actually over
-   * the wired headset as audio routing depends on other conditions. We
-   * only use it as an early indicator (during initialization) of an attached
-   * wired headset.
-   */
-  @Deprecated
-  private boolean hasWiredHeadset() {
-    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
-      return audioManager.isWiredHeadsetOn();
-    } else {
-      final AudioDeviceInfo[] devices = audioManager.getDevices(AudioManager.GET_DEVICES_ALL);
-      for (AudioDeviceInfo device : devices) {
-        final int type = device.getType();
-        if (type == AudioDeviceInfo.TYPE_WIRED_HEADSET) {
-          Log.d(TAG, "hasWiredHeadset: found wired headset");
-          return true;
-        } else if (type == AudioDeviceInfo.TYPE_USB_DEVICE) {
-          Log.d(TAG, "hasWiredHeadset: found USB audio device");
-          return true;
-        }
-      }
-      return false;
-    }
-  }
-
-  /**
-   * Updates list of possible audio devices and make new device selection.
-   * TODO(henrika): add unit test to verify all state transitions.
-   */
-  public void updateAudioDeviceState() {
-    ThreadUtils.checkIsOnMainThread();
-    Log.d(TAG, "--- updateAudioDeviceState: "
-            + "wired headset=" + hasWiredHeadset + ", "
-            + "BT state=" + bluetoothManager.getState());
-    Log.d(TAG, "Device status: "
-            + "available=" + audioDevices + ", "
-            + "selected=" + selectedAudioDevice + ", "
-            + "user selected=" + userSelectedAudioDevice);
-
-    // Check if any Bluetooth headset is connected. The internal BT state will
-    // change accordingly.
-    // TODO(henrika): perhaps wrap required state into BT manager.
-    if (bluetoothManager.getState() == AppRTCBluetoothManager.State.HEADSET_AVAILABLE
-        || bluetoothManager.getState() == AppRTCBluetoothManager.State.HEADSET_UNAVAILABLE
-        || bluetoothManager.getState() == AppRTCBluetoothManager.State.SCO_DISCONNECTING) {
-      bluetoothManager.updateDevice();
-    }
-
-    // Update the set of available audio devices.
-    Set<AudioDevice> newAudioDevices = new HashSet<>();
-
-    if (bluetoothManager.getState() == AppRTCBluetoothManager.State.SCO_CONNECTED
-        || bluetoothManager.getState() == AppRTCBluetoothManager.State.SCO_CONNECTING
-        || bluetoothManager.getState() == AppRTCBluetoothManager.State.HEADSET_AVAILABLE) {
-      newAudioDevices.add(AudioDevice.BLUETOOTH);
-    }
-
-    if (hasWiredHeadset) {
-      // If a wired headset is connected, then it is the only possible option.
-      newAudioDevices.add(AudioDevice.WIRED_HEADSET);
-    } else {
-      // No wired headset, hence the audio-device list can contain speaker
-      // phone (on a tablet), or speaker phone and earpiece (on mobile phone).
-      newAudioDevices.add(AudioDevice.SPEAKER_PHONE);
-      if (hasEarpiece()) {
-        newAudioDevices.add(AudioDevice.EARPIECE);
-      }
-    }
-    // Store state which is set to true if the device list has changed.
-    boolean audioDeviceSetUpdated = !audioDevices.equals(newAudioDevices);
-    // Update the existing audio device set.
-    audioDevices = newAudioDevices;
-    // Correct user selected audio devices if needed.
-    if (bluetoothManager.getState() == AppRTCBluetoothManager.State.HEADSET_UNAVAILABLE
-        && userSelectedAudioDevice == AudioDevice.BLUETOOTH) {
-      // If BT is not available, it can't be the user selection.
-      userSelectedAudioDevice = AudioDevice.NONE;
-    }
-    if (hasWiredHeadset && userSelectedAudioDevice == AudioDevice.SPEAKER_PHONE) {
-      // If user selected speaker phone, but then plugged wired headset then make
-      // wired headset as user selected device.
-      userSelectedAudioDevice = AudioDevice.WIRED_HEADSET;
-    }
-    if (!hasWiredHeadset && userSelectedAudioDevice == AudioDevice.WIRED_HEADSET) {
-      // If user selected wired headset, but then unplugged wired headset then make
-      // speaker phone as user selected device.
-      userSelectedAudioDevice = AudioDevice.SPEAKER_PHONE;
-    }
-
-    // Need to start Bluetooth if it is available and user either selected it explicitly or
-    // user did not select any output device.
-    boolean needBluetoothAudioStart =
-        bluetoothManager.getState() == AppRTCBluetoothManager.State.HEADSET_AVAILABLE
-        && (userSelectedAudioDevice == AudioDevice.NONE
-               || userSelectedAudioDevice == AudioDevice.BLUETOOTH);
-
-    // Need to stop Bluetooth audio if user selected different device and
-    // Bluetooth SCO connection is established or in the process.
-    boolean needBluetoothAudioStop =
-        (bluetoothManager.getState() == AppRTCBluetoothManager.State.SCO_CONNECTED
-            || bluetoothManager.getState() == AppRTCBluetoothManager.State.SCO_CONNECTING)
-        && (userSelectedAudioDevice != AudioDevice.NONE
-               && userSelectedAudioDevice != AudioDevice.BLUETOOTH);
-
-    if (bluetoothManager.getState() == AppRTCBluetoothManager.State.HEADSET_AVAILABLE
-        || bluetoothManager.getState() == AppRTCBluetoothManager.State.SCO_CONNECTING
-        || bluetoothManager.getState() == AppRTCBluetoothManager.State.SCO_CONNECTED) {
-      Log.d(TAG, "Need BT audio: start=" + needBluetoothAudioStart + ", "
-              + "stop=" + needBluetoothAudioStop + ", "
-              + "BT state=" + bluetoothManager.getState());
-    }
-
-    // Start or stop Bluetooth SCO connection given states set earlier.
-    if (needBluetoothAudioStop) {
-      bluetoothManager.stopScoAudio();
-      bluetoothManager.updateDevice();
-    }
-
-    if (needBluetoothAudioStart && !needBluetoothAudioStop) {
-      // Attempt to start Bluetooth SCO audio (takes a few second to start).
-      if (!bluetoothManager.startScoAudio()) {
-        // Remove BLUETOOTH from list of available devices since SCO failed.
-        audioDevices.remove(AudioDevice.BLUETOOTH);
-        audioDeviceSetUpdated = true;
-      }
-    }
-
-    // Update selected audio device.
-    AudioDevice newAudioDevice = selectedAudioDevice;
-
-    if (bluetoothManager.getState() == AppRTCBluetoothManager.State.SCO_CONNECTED) {
-      // If a Bluetooth is connected, then it should be used as output audio
-      // device. Note that it is not sufficient that a headset is available;
-      // an active SCO channel must also be up and running.
-      newAudioDevice = AudioDevice.BLUETOOTH;
-    } else if (hasWiredHeadset) {
-      // If a wired headset is connected, but Bluetooth is not, then wired headset is used as
-      // audio device.
-      newAudioDevice = AudioDevice.WIRED_HEADSET;
-    } else {
-      // No wired headset and no Bluetooth, hence the audio-device list can contain speaker
-      // phone (on a tablet), or speaker phone and earpiece (on mobile phone).
-      // |defaultAudioDevice| contains either AudioDevice.SPEAKER_PHONE or AudioDevice.EARPIECE
-      // depending on the user's selection.
-      newAudioDevice = defaultAudioDevice;
-    }
-    // Switch to new device but only if there has been any changes.
-    if (newAudioDevice != selectedAudioDevice || audioDeviceSetUpdated) {
-      // Do the required device switch.
-      setAudioDeviceInternal(newAudioDevice);
-      Log.d(TAG, "New device status: "
-              + "available=" + audioDevices + ", "
-              + "selected=" + newAudioDevice);
-      if (audioManagerEvents != null) {
-        // Notify a listening client that audio device has been changed.
-        audioManagerEvents.onAudioDeviceChanged(selectedAudioDevice, audioDevices);
-      }
-    }
-    Log.d(TAG, "--- updateAudioDeviceState done");
-  }
-}
diff --git a/examples/androidapp/src/org/appspot/apprtc/AppRTCBluetoothManager.java b/examples/androidapp/src/org/appspot/apprtc/AppRTCBluetoothManager.java
deleted file mode 100644
index 99979a3..0000000
--- a/examples/androidapp/src/org/appspot/apprtc/AppRTCBluetoothManager.java
+++ /dev/null
@@ -1,526 +0,0 @@
-/*
- *  Copyright 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.
- */
-
-package org.appspot.apprtc;
-
-import android.annotation.SuppressLint;
-import android.bluetooth.BluetoothAdapter;
-import android.bluetooth.BluetoothDevice;
-import android.bluetooth.BluetoothHeadset;
-import android.bluetooth.BluetoothProfile;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.content.pm.PackageManager;
-import android.media.AudioManager;
-import android.os.Handler;
-import android.os.Looper;
-import android.os.Process;
-import android.util.Log;
-import java.util.List;
-import java.util.Set;
-import org.appspot.apprtc.util.AppRTCUtils;
-import org.webrtc.ThreadUtils;
-
-/**
- * AppRTCProximitySensor manages functions related to Bluetoth devices in the
- * AppRTC demo.
- */
-public class AppRTCBluetoothManager {
-  private static final String TAG = "AppRTCBluetoothManager";
-
-  // Timeout interval for starting or stopping audio to a Bluetooth SCO device.
-  private static final int BLUETOOTH_SCO_TIMEOUT_MS = 4000;
-  // Maximum number of SCO connection attempts.
-  private static final int MAX_SCO_CONNECTION_ATTEMPTS = 2;
-
-  // Bluetooth connection state.
-  public enum State {
-    // Bluetooth is not available; no adapter or Bluetooth is off.
-    UNINITIALIZED,
-    // Bluetooth error happened when trying to start Bluetooth.
-    ERROR,
-    // Bluetooth proxy object for the Headset profile exists, but no connected headset devices,
-    // SCO is not started or disconnected.
-    HEADSET_UNAVAILABLE,
-    // Bluetooth proxy object for the Headset profile connected, connected Bluetooth headset
-    // present, but SCO is not started or disconnected.
-    HEADSET_AVAILABLE,
-    // Bluetooth audio SCO connection with remote device is closing.
-    SCO_DISCONNECTING,
-    // Bluetooth audio SCO connection with remote device is initiated.
-    SCO_CONNECTING,
-    // Bluetooth audio SCO connection with remote device is established.
-    SCO_CONNECTED
-  }
-
-  private final Context apprtcContext;
-  private final AppRTCAudioManager apprtcAudioManager;
-  private final AudioManager audioManager;
-  private final Handler handler;
-
-  int scoConnectionAttempts;
-  private State bluetoothState;
-  private final BluetoothProfile.ServiceListener bluetoothServiceListener;
-  private BluetoothAdapter bluetoothAdapter;
-  private BluetoothHeadset bluetoothHeadset;
-  private BluetoothDevice bluetoothDevice;
-  private final BroadcastReceiver bluetoothHeadsetReceiver;
-
-  // Runs when the Bluetooth timeout expires. We use that timeout after calling
-  // startScoAudio() or stopScoAudio() because we're not guaranteed to get a
-  // callback after those calls.
-  private final Runnable bluetoothTimeoutRunnable = new Runnable() {
-    @Override
-    public void run() {
-      bluetoothTimeout();
-    }
-  };
-
-  /**
-   * Implementation of an interface that notifies BluetoothProfile IPC clients when they have been
-   * connected to or disconnected from the service.
-   */
-  private class BluetoothServiceListener implements BluetoothProfile.ServiceListener {
-    @Override
-    // Called to notify the client when the proxy object has been connected to the service.
-    // Once we have the profile proxy object, we can use it to monitor the state of the
-    // connection and perform other operations that are relevant to the headset profile.
-    public void onServiceConnected(int profile, BluetoothProfile proxy) {
-      if (profile != BluetoothProfile.HEADSET || bluetoothState == State.UNINITIALIZED) {
-        return;
-      }
-      Log.d(TAG, "BluetoothServiceListener.onServiceConnected: BT state=" + bluetoothState);
-      // Android only supports one connected Bluetooth Headset at a time.
-      bluetoothHeadset = (BluetoothHeadset) proxy;
-      updateAudioDeviceState();
-      Log.d(TAG, "onServiceConnected done: BT state=" + bluetoothState);
-    }
-
-    @Override
-    /** Notifies the client when the proxy object has been disconnected from the service. */
-    public void onServiceDisconnected(int profile) {
-      if (profile != BluetoothProfile.HEADSET || bluetoothState == State.UNINITIALIZED) {
-        return;
-      }
-      Log.d(TAG, "BluetoothServiceListener.onServiceDisconnected: BT state=" + bluetoothState);
-      stopScoAudio();
-      bluetoothHeadset = null;
-      bluetoothDevice = null;
-      bluetoothState = State.HEADSET_UNAVAILABLE;
-      updateAudioDeviceState();
-      Log.d(TAG, "onServiceDisconnected done: BT state=" + bluetoothState);
-    }
-  }
-
-  // Intent broadcast receiver which handles changes in Bluetooth device availability.
-  // Detects headset changes and Bluetooth SCO state changes.
-  private class BluetoothHeadsetBroadcastReceiver extends BroadcastReceiver {
-    @Override
-    public void onReceive(Context context, Intent intent) {
-      if (bluetoothState == State.UNINITIALIZED) {
-        return;
-      }
-      final String action = intent.getAction();
-      // Change in connection state of the Headset profile. Note that the
-      // change does not tell us anything about whether we're streaming
-      // audio to BT over SCO. Typically received when user turns on a BT
-      // headset while audio is active using another audio device.
-      if (action.equals(BluetoothHeadset.ACTION_CONNECTION_STATE_CHANGED)) {
-        final int state =
-            intent.getIntExtra(BluetoothHeadset.EXTRA_STATE, BluetoothHeadset.STATE_DISCONNECTED);
-        Log.d(TAG, "BluetoothHeadsetBroadcastReceiver.onReceive: "
-                + "a=ACTION_CONNECTION_STATE_CHANGED, "
-                + "s=" + stateToString(state) + ", "
-                + "sb=" + isInitialStickyBroadcast() + ", "
-                + "BT state: " + bluetoothState);
-        if (state == BluetoothHeadset.STATE_CONNECTED) {
-          scoConnectionAttempts = 0;
-          updateAudioDeviceState();
-        } else if (state == BluetoothHeadset.STATE_CONNECTING) {
-          // No action needed.
-        } else if (state == BluetoothHeadset.STATE_DISCONNECTING) {
-          // No action needed.
-        } else if (state == BluetoothHeadset.STATE_DISCONNECTED) {
-          // Bluetooth is probably powered off during the call.
-          stopScoAudio();
-          updateAudioDeviceState();
-        }
-        // Change in the audio (SCO) connection state of the Headset profile.
-        // Typically received after call to startScoAudio() has finalized.
-      } else if (action.equals(BluetoothHeadset.ACTION_AUDIO_STATE_CHANGED)) {
-        final int state = intent.getIntExtra(
-            BluetoothHeadset.EXTRA_STATE, BluetoothHeadset.STATE_AUDIO_DISCONNECTED);
-        Log.d(TAG, "BluetoothHeadsetBroadcastReceiver.onReceive: "
-                + "a=ACTION_AUDIO_STATE_CHANGED, "
-                + "s=" + stateToString(state) + ", "
-                + "sb=" + isInitialStickyBroadcast() + ", "
-                + "BT state: " + bluetoothState);
-        if (state == BluetoothHeadset.STATE_AUDIO_CONNECTED) {
-          cancelTimer();
-          if (bluetoothState == State.SCO_CONNECTING) {
-            Log.d(TAG, "+++ Bluetooth audio SCO is now connected");
-            bluetoothState = State.SCO_CONNECTED;
-            scoConnectionAttempts = 0;
-            updateAudioDeviceState();
-          } else {
-            Log.w(TAG, "Unexpected state BluetoothHeadset.STATE_AUDIO_CONNECTED");
-          }
-        } else if (state == BluetoothHeadset.STATE_AUDIO_CONNECTING) {
-          Log.d(TAG, "+++ Bluetooth audio SCO is now connecting...");
-        } else if (state == BluetoothHeadset.STATE_AUDIO_DISCONNECTED) {
-          Log.d(TAG, "+++ Bluetooth audio SCO is now disconnected");
-          if (isInitialStickyBroadcast()) {
-            Log.d(TAG, "Ignore STATE_AUDIO_DISCONNECTED initial sticky broadcast.");
-            return;
-          }
-          updateAudioDeviceState();
-        }
-      }
-      Log.d(TAG, "onReceive done: BT state=" + bluetoothState);
-    }
-  };
-
-  /** Construction. */
-  static AppRTCBluetoothManager create(Context context, AppRTCAudioManager audioManager) {
-    Log.d(TAG, "create" + AppRTCUtils.getThreadInfo());
-    return new AppRTCBluetoothManager(context, audioManager);
-  }
-
-  protected AppRTCBluetoothManager(Context context, AppRTCAudioManager audioManager) {
-    Log.d(TAG, "ctor");
-    ThreadUtils.checkIsOnMainThread();
-    apprtcContext = context;
-    apprtcAudioManager = audioManager;
-    this.audioManager = getAudioManager(context);
-    bluetoothState = State.UNINITIALIZED;
-    bluetoothServiceListener = new BluetoothServiceListener();
-    bluetoothHeadsetReceiver = new BluetoothHeadsetBroadcastReceiver();
-    handler = new Handler(Looper.getMainLooper());
-  }
-
-  /** Returns the internal state. */
-  public State getState() {
-    ThreadUtils.checkIsOnMainThread();
-    return bluetoothState;
-  }
-
-  /**
-   * Activates components required to detect Bluetooth devices and to enable
-   * BT SCO (audio is routed via BT SCO) for the headset profile. The end
-   * state will be HEADSET_UNAVAILABLE but a state machine has started which
-   * will start a state change sequence where the final outcome depends on
-   * if/when the BT headset is enabled.
-   * Example of state change sequence when start() is called while BT device
-   * is connected and enabled:
-   *   UNINITIALIZED --> HEADSET_UNAVAILABLE --> HEADSET_AVAILABLE -->
-   *   SCO_CONNECTING --> SCO_CONNECTED <==> audio is now routed via BT SCO.
-   * Note that the AppRTCAudioManager is also involved in driving this state
-   * change.
-   */
-  public void start() {
-    ThreadUtils.checkIsOnMainThread();
-    Log.d(TAG, "start");
-    if (!hasPermission(apprtcContext, android.Manifest.permission.BLUETOOTH)) {
-      Log.w(TAG, "Process (pid=" + Process.myPid() + ") lacks BLUETOOTH permission");
-      return;
-    }
-    if (bluetoothState != State.UNINITIALIZED) {
-      Log.w(TAG, "Invalid BT state");
-      return;
-    }
-    bluetoothHeadset = null;
-    bluetoothDevice = null;
-    scoConnectionAttempts = 0;
-    // Get a handle to the default local Bluetooth adapter.
-    bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
-    if (bluetoothAdapter == null) {
-      Log.w(TAG, "Device does not support Bluetooth");
-      return;
-    }
-    // Ensure that the device supports use of BT SCO audio for off call use cases.
-    if (!audioManager.isBluetoothScoAvailableOffCall()) {
-      Log.e(TAG, "Bluetooth SCO audio is not available off call");
-      return;
-    }
-    logBluetoothAdapterInfo(bluetoothAdapter);
-    // Establish a connection to the HEADSET profile (includes both Bluetooth Headset and
-    // Hands-Free) proxy object and install a listener.
-    if (!getBluetoothProfileProxy(
-            apprtcContext, bluetoothServiceListener, BluetoothProfile.HEADSET)) {
-      Log.e(TAG, "BluetoothAdapter.getProfileProxy(HEADSET) failed");
-      return;
-    }
-    // Register receivers for BluetoothHeadset change notifications.
-    IntentFilter bluetoothHeadsetFilter = new IntentFilter();
-    // Register receiver for change in connection state of the Headset profile.
-    bluetoothHeadsetFilter.addAction(BluetoothHeadset.ACTION_CONNECTION_STATE_CHANGED);
-    // Register receiver for change in audio connection state of the Headset profile.
-    bluetoothHeadsetFilter.addAction(BluetoothHeadset.ACTION_AUDIO_STATE_CHANGED);
-    registerReceiver(bluetoothHeadsetReceiver, bluetoothHeadsetFilter);
-    Log.d(TAG, "HEADSET profile state: "
-            + stateToString(bluetoothAdapter.getProfileConnectionState(BluetoothProfile.HEADSET)));
-    Log.d(TAG, "Bluetooth proxy for headset profile has started");
-    bluetoothState = State.HEADSET_UNAVAILABLE;
-    Log.d(TAG, "start done: BT state=" + bluetoothState);
-  }
-
-  /** Stops and closes all components related to Bluetooth audio. */
-  public void stop() {
-    ThreadUtils.checkIsOnMainThread();
-    Log.d(TAG, "stop: BT state=" + bluetoothState);
-    if (bluetoothAdapter == null) {
-      return;
-    }
-    // Stop BT SCO connection with remote device if needed.
-    stopScoAudio();
-    // Close down remaining BT resources.
-    if (bluetoothState == State.UNINITIALIZED) {
-      return;
-    }
-    unregisterReceiver(bluetoothHeadsetReceiver);
-    cancelTimer();
-    if (bluetoothHeadset != null) {
-      bluetoothAdapter.closeProfileProxy(BluetoothProfile.HEADSET, bluetoothHeadset);
-      bluetoothHeadset = null;
-    }
-    bluetoothAdapter = null;
-    bluetoothDevice = null;
-    bluetoothState = State.UNINITIALIZED;
-    Log.d(TAG, "stop done: BT state=" + bluetoothState);
-  }
-
-  /**
-   * Starts Bluetooth SCO connection with remote device.
-   * Note that the phone application always has the priority on the usage of the SCO connection
-   * for telephony. If this method is called while the phone is in call it will be ignored.
-   * Similarly, if a call is received or sent while an application is using the SCO connection,
-   * the connection will be lost for the application and NOT returned automatically when the call
-   * ends. Also note that: up to and including API version JELLY_BEAN_MR1, this method initiates a
-   * virtual voice call to the Bluetooth headset. After API version JELLY_BEAN_MR2 only a raw SCO
-   * audio connection is established.
-   * TODO(henrika): should we add support for virtual voice call to BT headset also for JBMR2 and
-   * higher. It might be required to initiates a virtual voice call since many devices do not
-   * accept SCO audio without a "call".
-   */
-  public boolean startScoAudio() {
-    ThreadUtils.checkIsOnMainThread();
-    Log.d(TAG, "startSco: BT state=" + bluetoothState + ", "
-            + "attempts: " + scoConnectionAttempts + ", "
-            + "SCO is on: " + isScoOn());
-    if (scoConnectionAttempts >= MAX_SCO_CONNECTION_ATTEMPTS) {
-      Log.e(TAG, "BT SCO connection fails - no more attempts");
-      return false;
-    }
-    if (bluetoothState != State.HEADSET_AVAILABLE) {
-      Log.e(TAG, "BT SCO connection fails - no headset available");
-      return false;
-    }
-    // Start BT SCO channel and wait for ACTION_AUDIO_STATE_CHANGED.
-    Log.d(TAG, "Starting Bluetooth SCO and waits for ACTION_AUDIO_STATE_CHANGED...");
-    // The SCO connection establishment can take several seconds, hence we cannot rely on the
-    // connection to be available when the method returns but instead register to receive the
-    // intent ACTION_SCO_AUDIO_STATE_UPDATED and wait for the state to be SCO_AUDIO_STATE_CONNECTED.
-    bluetoothState = State.SCO_CONNECTING;
-    audioManager.startBluetoothSco();
-    audioManager.setBluetoothScoOn(true);
-    scoConnectionAttempts++;
-    startTimer();
-    Log.d(TAG, "startScoAudio done: BT state=" + bluetoothState + ", "
-            + "SCO is on: " + isScoOn());
-    return true;
-  }
-
-  /** Stops Bluetooth SCO connection with remote device. */
-  public void stopScoAudio() {
-    ThreadUtils.checkIsOnMainThread();
-    Log.d(TAG, "stopScoAudio: BT state=" + bluetoothState + ", "
-            + "SCO is on: " + isScoOn());
-    if (bluetoothState != State.SCO_CONNECTING && bluetoothState != State.SCO_CONNECTED) {
-      return;
-    }
-    cancelTimer();
-    audioManager.stopBluetoothSco();
-    audioManager.setBluetoothScoOn(false);
-    bluetoothState = State.SCO_DISCONNECTING;
-    Log.d(TAG, "stopScoAudio done: BT state=" + bluetoothState + ", "
-            + "SCO is on: " + isScoOn());
-  }
-
-  /**
-   * Use the BluetoothHeadset proxy object (controls the Bluetooth Headset
-   * Service via IPC) to update the list of connected devices for the HEADSET
-   * profile. The internal state will change to HEADSET_UNAVAILABLE or to
-   * HEADSET_AVAILABLE and |bluetoothDevice| will be mapped to the connected
-   * device if available.
-   */
-  public void updateDevice() {
-    if (bluetoothState == State.UNINITIALIZED || bluetoothHeadset == null) {
-      return;
-    }
-    Log.d(TAG, "updateDevice");
-    // Get connected devices for the headset profile. Returns the set of
-    // devices which are in state STATE_CONNECTED. The BluetoothDevice class
-    // is just a thin wrapper for a Bluetooth hardware address.
-    List<BluetoothDevice> devices = bluetoothHeadset.getConnectedDevices();
-    if (devices.isEmpty()) {
-      bluetoothDevice = null;
-      bluetoothState = State.HEADSET_UNAVAILABLE;
-      Log.d(TAG, "No connected bluetooth headset");
-    } else {
-      // Always use first device in list. Android only supports one device.
-      bluetoothDevice = devices.get(0);
-      bluetoothState = State.HEADSET_AVAILABLE;
-      Log.d(TAG, "Connected bluetooth headset: "
-              + "name=" + bluetoothDevice.getName() + ", "
-              + "state=" + stateToString(bluetoothHeadset.getConnectionState(bluetoothDevice))
-              + ", SCO audio=" + bluetoothHeadset.isAudioConnected(bluetoothDevice));
-    }
-    Log.d(TAG, "updateDevice done: BT state=" + bluetoothState);
-  }
-
-  /**
-   * Stubs for test mocks.
-   */
-  protected AudioManager getAudioManager(Context context) {
-    return (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
-  }
-
-  protected void registerReceiver(BroadcastReceiver receiver, IntentFilter filter) {
-    apprtcContext.registerReceiver(receiver, filter);
-  }
-
-  protected void unregisterReceiver(BroadcastReceiver receiver) {
-    apprtcContext.unregisterReceiver(receiver);
-  }
-
-  protected boolean getBluetoothProfileProxy(
-      Context context, BluetoothProfile.ServiceListener listener, int profile) {
-    return bluetoothAdapter.getProfileProxy(context, listener, profile);
-  }
-
-  protected boolean hasPermission(Context context, String permission) {
-    return apprtcContext.checkPermission(permission, Process.myPid(), Process.myUid())
-        == PackageManager.PERMISSION_GRANTED;
-  }
-
-  /** Logs the state of the local Bluetooth adapter. */
-  @SuppressLint("HardwareIds")
-  protected void logBluetoothAdapterInfo(BluetoothAdapter localAdapter) {
-    Log.d(TAG, "BluetoothAdapter: "
-            + "enabled=" + localAdapter.isEnabled() + ", "
-            + "state=" + stateToString(localAdapter.getState()) + ", "
-            + "name=" + localAdapter.getName() + ", "
-            + "address=" + localAdapter.getAddress());
-    // Log the set of BluetoothDevice objects that are bonded (paired) to the local adapter.
-    Set<BluetoothDevice> pairedDevices = localAdapter.getBondedDevices();
-    if (!pairedDevices.isEmpty()) {
-      Log.d(TAG, "paired devices:");
-      for (BluetoothDevice device : pairedDevices) {
-        Log.d(TAG, " name=" + device.getName() + ", address=" + device.getAddress());
-      }
-    }
-  }
-
-  /** Ensures that the audio manager updates its list of available audio devices. */
-  private void updateAudioDeviceState() {
-    ThreadUtils.checkIsOnMainThread();
-    Log.d(TAG, "updateAudioDeviceState");
-    apprtcAudioManager.updateAudioDeviceState();
-  }
-
-  /** Starts timer which times out after BLUETOOTH_SCO_TIMEOUT_MS milliseconds. */
-  private void startTimer() {
-    ThreadUtils.checkIsOnMainThread();
-    Log.d(TAG, "startTimer");
-    handler.postDelayed(bluetoothTimeoutRunnable, BLUETOOTH_SCO_TIMEOUT_MS);
-  }
-
-  /** Cancels any outstanding timer tasks. */
-  private void cancelTimer() {
-    ThreadUtils.checkIsOnMainThread();
-    Log.d(TAG, "cancelTimer");
-    handler.removeCallbacks(bluetoothTimeoutRunnable);
-  }
-
-  /**
-   * Called when start of the BT SCO channel takes too long time. Usually
-   * happens when the BT device has been turned on during an ongoing call.
-   */
-  private void bluetoothTimeout() {
-    ThreadUtils.checkIsOnMainThread();
-    if (bluetoothState == State.UNINITIALIZED || bluetoothHeadset == null) {
-      return;
-    }
-    Log.d(TAG, "bluetoothTimeout: BT state=" + bluetoothState + ", "
-            + "attempts: " + scoConnectionAttempts + ", "
-            + "SCO is on: " + isScoOn());
-    if (bluetoothState != State.SCO_CONNECTING) {
-      return;
-    }
-    // Bluetooth SCO should be connecting; check the latest result.
-    boolean scoConnected = false;
-    List<BluetoothDevice> devices = bluetoothHeadset.getConnectedDevices();
-    if (devices.size() > 0) {
-      bluetoothDevice = devices.get(0);
-      if (bluetoothHeadset.isAudioConnected(bluetoothDevice)) {
-        Log.d(TAG, "SCO connected with " + bluetoothDevice.getName());
-        scoConnected = true;
-      } else {
-        Log.d(TAG, "SCO is not connected with " + bluetoothDevice.getName());
-      }
-    }
-    if (scoConnected) {
-      // We thought BT had timed out, but it's actually on; updating state.
-      bluetoothState = State.SCO_CONNECTED;
-      scoConnectionAttempts = 0;
-    } else {
-      // Give up and "cancel" our request by calling stopBluetoothSco().
-      Log.w(TAG, "BT failed to connect after timeout");
-      stopScoAudio();
-    }
-    updateAudioDeviceState();
-    Log.d(TAG, "bluetoothTimeout done: BT state=" + bluetoothState);
-  }
-
-  /** Checks whether audio uses Bluetooth SCO. */
-  private boolean isScoOn() {
-    return audioManager.isBluetoothScoOn();
-  }
-
-  /** Converts BluetoothAdapter states into local string representations. */
-  private String stateToString(int state) {
-    switch (state) {
-      case BluetoothAdapter.STATE_DISCONNECTED:
-        return "DISCONNECTED";
-      case BluetoothAdapter.STATE_CONNECTED:
-        return "CONNECTED";
-      case BluetoothAdapter.STATE_CONNECTING:
-        return "CONNECTING";
-      case BluetoothAdapter.STATE_DISCONNECTING:
-        return "DISCONNECTING";
-      case BluetoothAdapter.STATE_OFF:
-        return "OFF";
-      case BluetoothAdapter.STATE_ON:
-        return "ON";
-      case BluetoothAdapter.STATE_TURNING_OFF:
-        // Indicates the local Bluetooth adapter is turning off. Local clients should immediately
-        // attempt graceful disconnection of any remote links.
-        return "TURNING_OFF";
-      case BluetoothAdapter.STATE_TURNING_ON:
-        // Indicates the local Bluetooth adapter is turning on. However local clients should wait
-        // for STATE_ON before attempting to use the adapter.
-        return  "TURNING_ON";
-      default:
-        return "INVALID";
-    }
-  }
-}
diff --git a/examples/androidapp/src/org/appspot/apprtc/AppRTCClient.java b/examples/androidapp/src/org/appspot/apprtc/AppRTCClient.java
deleted file mode 100644
index 5487fba..0000000
--- a/examples/androidapp/src/org/appspot/apprtc/AppRTCClient.java
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
- *  Copyright 2013 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.
- */
-
-package org.appspot.apprtc;
-
-import org.webrtc.IceCandidate;
-import org.webrtc.PeerConnection;
-import org.webrtc.SessionDescription;
-
-import java.util.List;
-
-/**
- * AppRTCClient is the interface representing an AppRTC client.
- */
-public interface AppRTCClient {
-  /**
-   * Struct holding the connection parameters of an AppRTC room.
-   */
-  class RoomConnectionParameters {
-    public final String roomUrl;
-    public final String roomId;
-    public final boolean loopback;
-    public final String urlParameters;
-    public RoomConnectionParameters(
-        String roomUrl, String roomId, boolean loopback, String urlParameters) {
-      this.roomUrl = roomUrl;
-      this.roomId = roomId;
-      this.loopback = loopback;
-      this.urlParameters = urlParameters;
-    }
-    public RoomConnectionParameters(String roomUrl, String roomId, boolean loopback) {
-      this(roomUrl, roomId, loopback, null /* urlParameters */);
-    }
-  }
-
-  /**
-   * Asynchronously connect to an AppRTC room URL using supplied connection
-   * parameters. Once connection is established onConnectedToRoom()
-   * callback with room parameters is invoked.
-   */
-  void connectToRoom(RoomConnectionParameters connectionParameters);
-
-  /**
-   * Send offer SDP to the other participant.
-   */
-  void sendOfferSdp(final SessionDescription sdp);
-
-  /**
-   * Send answer SDP to the other participant.
-   */
-  void sendAnswerSdp(final SessionDescription sdp);
-
-  /**
-   * Send Ice candidate to the other participant.
-   */
-  void sendLocalIceCandidate(final IceCandidate candidate);
-
-  /**
-   * Send removed ICE candidates to the other participant.
-   */
-  void sendLocalIceCandidateRemovals(final IceCandidate[] candidates);
-
-  /**
-   * Disconnect from room.
-   */
-  void disconnectFromRoom();
-
-  /**
-   * Struct holding the signaling parameters of an AppRTC room.
-   */
-  class SignalingParameters {
-    public final List<PeerConnection.IceServer> iceServers;
-    public final boolean initiator;
-    public final String clientId;
-    public final String wssUrl;
-    public final String wssPostUrl;
-    public final SessionDescription offerSdp;
-    public final List<IceCandidate> iceCandidates;
-
-    public SignalingParameters(List<PeerConnection.IceServer> iceServers, boolean initiator,
-        String clientId, String wssUrl, String wssPostUrl, SessionDescription offerSdp,
-        List<IceCandidate> iceCandidates) {
-      this.iceServers = iceServers;
-      this.initiator = initiator;
-      this.clientId = clientId;
-      this.wssUrl = wssUrl;
-      this.wssPostUrl = wssPostUrl;
-      this.offerSdp = offerSdp;
-      this.iceCandidates = iceCandidates;
-    }
-  }
-
-  /**
-   * Callback interface for messages delivered on signaling channel.
-   *
-   * <p>Methods are guaranteed to be invoked on the UI thread of |activity|.
-   */
-  interface SignalingEvents {
-    /**
-     * Callback fired once the room's signaling parameters
-     * SignalingParameters are extracted.
-     */
-    void onConnectedToRoom(final SignalingParameters params);
-
-    /**
-     * Callback fired once remote SDP is received.
-     */
-    void onRemoteDescription(final SessionDescription sdp);
-
-    /**
-     * Callback fired once remote Ice candidate is received.
-     */
-    void onRemoteIceCandidate(final IceCandidate candidate);
-
-    /**
-     * Callback fired once remote Ice candidate removals are received.
-     */
-    void onRemoteIceCandidatesRemoved(final IceCandidate[] candidates);
-
-    /**
-     * Callback fired once channel is closed.
-     */
-    void onChannelClose();
-
-    /**
-     * Callback fired once channel error happened.
-     */
-    void onChannelError(final String description);
-  }
-}
diff --git a/examples/androidapp/src/org/appspot/apprtc/AppRTCProximitySensor.java b/examples/androidapp/src/org/appspot/apprtc/AppRTCProximitySensor.java
deleted file mode 100644
index b63e8b8..0000000
--- a/examples/androidapp/src/org/appspot/apprtc/AppRTCProximitySensor.java
+++ /dev/null
@@ -1,163 +0,0 @@
-/*
- *  Copyright 2014 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.
- */
-
-package org.appspot.apprtc;
-
-import android.content.Context;
-import android.hardware.Sensor;
-import android.hardware.SensorEvent;
-import android.hardware.SensorEventListener;
-import android.hardware.SensorManager;
-import android.os.Build;
-import android.util.Log;
-import org.appspot.apprtc.util.AppRTCUtils;
-import org.webrtc.ThreadUtils;
-
-/**
- * AppRTCProximitySensor manages functions related to the proximity sensor in
- * the AppRTC demo.
- * On most device, the proximity sensor is implemented as a boolean-sensor.
- * It returns just two values "NEAR" or "FAR". Thresholding is done on the LUX
- * value i.e. the LUX value of the light sensor is compared with a threshold.
- * A LUX-value more than the threshold means the proximity sensor returns "FAR".
- * Anything less than the threshold value and the sensor  returns "NEAR".
- */
-public class AppRTCProximitySensor implements SensorEventListener {
-  private static final String TAG = "AppRTCProximitySensor";
-
-  // This class should be created, started and stopped on one thread
-  // (e.g. the main thread). We use |nonThreadSafe| to ensure that this is
-  // the case. Only active when |DEBUG| is set to true.
-  private final ThreadUtils.ThreadChecker threadChecker = new ThreadUtils.ThreadChecker();
-
-  private final Runnable onSensorStateListener;
-  private final SensorManager sensorManager;
-  private Sensor proximitySensor = null;
-  private boolean lastStateReportIsNear = false;
-
-  /** Construction */
-  static AppRTCProximitySensor create(Context context, Runnable sensorStateListener) {
-    return new AppRTCProximitySensor(context, sensorStateListener);
-  }
-
-  private AppRTCProximitySensor(Context context, Runnable sensorStateListener) {
-    Log.d(TAG, "AppRTCProximitySensor" + AppRTCUtils.getThreadInfo());
-    onSensorStateListener = sensorStateListener;
-    sensorManager = ((SensorManager) context.getSystemService(Context.SENSOR_SERVICE));
-  }
-
-  /**
-   * Activate the proximity sensor. Also do initialization if called for the
-   * first time.
-   */
-  public boolean start() {
-    threadChecker.checkIsOnValidThread();
-    Log.d(TAG, "start" + AppRTCUtils.getThreadInfo());
-    if (!initDefaultSensor()) {
-      // Proximity sensor is not supported on this device.
-      return false;
-    }
-    sensorManager.registerListener(this, proximitySensor, SensorManager.SENSOR_DELAY_NORMAL);
-    return true;
-  }
-
-  /** Deactivate the proximity sensor. */
-  public void stop() {
-    threadChecker.checkIsOnValidThread();
-    Log.d(TAG, "stop" + AppRTCUtils.getThreadInfo());
-    if (proximitySensor == null) {
-      return;
-    }
-    sensorManager.unregisterListener(this, proximitySensor);
-  }
-
-  /** Getter for last reported state. Set to true if "near" is reported. */
-  public boolean sensorReportsNearState() {
-    threadChecker.checkIsOnValidThread();
-    return lastStateReportIsNear;
-  }
-
-  @Override
-  public final void onAccuracyChanged(Sensor sensor, int accuracy) {
-    threadChecker.checkIsOnValidThread();
-    AppRTCUtils.assertIsTrue(sensor.getType() == Sensor.TYPE_PROXIMITY);
-    if (accuracy == SensorManager.SENSOR_STATUS_UNRELIABLE) {
-      Log.e(TAG, "The values returned by this sensor cannot be trusted");
-    }
-  }
-
-  @Override
-  public final void onSensorChanged(SensorEvent event) {
-    threadChecker.checkIsOnValidThread();
-    AppRTCUtils.assertIsTrue(event.sensor.getType() == Sensor.TYPE_PROXIMITY);
-    // As a best practice; do as little as possible within this method and
-    // avoid blocking.
-    float distanceInCentimeters = event.values[0];
-    if (distanceInCentimeters < proximitySensor.getMaximumRange()) {
-      Log.d(TAG, "Proximity sensor => NEAR state");
-      lastStateReportIsNear = true;
-    } else {
-      Log.d(TAG, "Proximity sensor => FAR state");
-      lastStateReportIsNear = false;
-    }
-
-    // Report about new state to listening client. Client can then call
-    // sensorReportsNearState() to query the current state (NEAR or FAR).
-    if (onSensorStateListener != null) {
-      onSensorStateListener.run();
-    }
-
-    Log.d(TAG, "onSensorChanged" + AppRTCUtils.getThreadInfo() + ": "
-            + "accuracy=" + event.accuracy + ", timestamp=" + event.timestamp + ", distance="
-            + event.values[0]);
-  }
-
-  /**
-   * Get default proximity sensor if it exists. Tablet devices (e.g. Nexus 7)
-   * does not support this type of sensor and false will be returned in such
-   * cases.
-   */
-  private boolean initDefaultSensor() {
-    if (proximitySensor != null) {
-      return true;
-    }
-    proximitySensor = sensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);
-    if (proximitySensor == null) {
-      return false;
-    }
-    logProximitySensorInfo();
-    return true;
-  }
-
-  /** Helper method for logging information about the proximity sensor. */
-  private void logProximitySensorInfo() {
-    if (proximitySensor == null) {
-      return;
-    }
-    StringBuilder info = new StringBuilder("Proximity sensor: ");
-    info.append("name=").append(proximitySensor.getName());
-    info.append(", vendor: ").append(proximitySensor.getVendor());
-    info.append(", power: ").append(proximitySensor.getPower());
-    info.append(", resolution: ").append(proximitySensor.getResolution());
-    info.append(", max range: ").append(proximitySensor.getMaximumRange());
-    info.append(", min delay: ").append(proximitySensor.getMinDelay());
-    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT_WATCH) {
-      // Added in API level 20.
-      info.append(", type: ").append(proximitySensor.getStringType());
-    }
-    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
-      // Added in API level 21.
-      info.append(", max delay: ").append(proximitySensor.getMaxDelay());
-      info.append(", reporting mode: ").append(proximitySensor.getReportingMode());
-      info.append(", isWakeUpSensor: ").append(proximitySensor.isWakeUpSensor());
-    }
-    Log.d(TAG, info.toString());
-  }
-}
diff --git a/examples/androidapp/src/org/appspot/apprtc/CallActivity.java b/examples/androidapp/src/org/appspot/apprtc/CallActivity.java
deleted file mode 100644
index 45bc26b..0000000
--- a/examples/androidapp/src/org/appspot/apprtc/CallActivity.java
+++ /dev/null
@@ -1,957 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-package org.appspot.apprtc;
-
-import android.annotation.TargetApi;
-import android.app.Activity;
-import android.app.AlertDialog;
-import android.app.FragmentTransaction;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.content.Intent;
-import android.content.pm.PackageManager;
-import android.media.projection.MediaProjection;
-import android.media.projection.MediaProjectionManager;
-import android.net.Uri;
-import android.os.Build;
-import android.os.Bundle;
-import android.os.Handler;
-import android.util.DisplayMetrics;
-import android.util.Log;
-import android.view.View;
-import android.view.Window;
-import android.view.WindowManager;
-import android.view.WindowManager.LayoutParams;
-import android.widget.Toast;
-import java.io.IOException;
-import java.lang.RuntimeException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Set;
-import org.appspot.apprtc.AppRTCAudioManager.AudioDevice;
-import org.appspot.apprtc.AppRTCAudioManager.AudioManagerEvents;
-import org.appspot.apprtc.AppRTCClient.RoomConnectionParameters;
-import org.appspot.apprtc.AppRTCClient.SignalingParameters;
-import org.appspot.apprtc.PeerConnectionClient.DataChannelParameters;
-import org.appspot.apprtc.PeerConnectionClient.PeerConnectionParameters;
-import org.webrtc.Camera1Enumerator;
-import org.webrtc.Camera2Enumerator;
-import org.webrtc.CameraEnumerator;
-import org.webrtc.FileVideoCapturer;
-import org.webrtc.IceCandidate;
-import org.webrtc.Logging;
-import org.webrtc.PeerConnectionFactory;
-import org.webrtc.RendererCommon.ScalingType;
-import org.webrtc.ScreenCapturerAndroid;
-import org.webrtc.SessionDescription;
-import org.webrtc.StatsReport;
-import org.webrtc.SurfaceViewRenderer;
-import org.webrtc.VideoCapturer;
-import org.webrtc.VideoFileRenderer;
-import org.webrtc.VideoFrame;
-import org.webrtc.VideoRenderer;
-import org.webrtc.VideoSink;
-
-/**
- * Activity for peer connection call setup, call waiting
- * and call view.
- */
-public class CallActivity extends Activity implements AppRTCClient.SignalingEvents,
-                                                      PeerConnectionClient.PeerConnectionEvents,
-                                                      CallFragment.OnCallEvents {
-  private static final String TAG = "CallRTCClient";
-
-  // Fix for devices running old Android versions not finding the libraries.
-  // https://bugs.chromium.org/p/webrtc/issues/detail?id=6751
-  static {
-    try {
-      System.loadLibrary("c++_shared");
-      System.loadLibrary("boringssl.cr");
-      System.loadLibrary("protobuf_lite.cr");
-    } catch (UnsatisfiedLinkError e) {
-      Logging.w(TAG, "Failed to load native dependencies: ", e);
-    }
-  }
-
-  public static final String EXTRA_ROOMID = "org.appspot.apprtc.ROOMID";
-  public static final String EXTRA_URLPARAMETERS = "org.appspot.apprtc.URLPARAMETERS";
-  public static final String EXTRA_LOOPBACK = "org.appspot.apprtc.LOOPBACK";
-  public static final String EXTRA_VIDEO_CALL = "org.appspot.apprtc.VIDEO_CALL";
-  public static final String EXTRA_SCREENCAPTURE = "org.appspot.apprtc.SCREENCAPTURE";
-  public static final String EXTRA_CAMERA2 = "org.appspot.apprtc.CAMERA2";
-  public static final String EXTRA_VIDEO_WIDTH = "org.appspot.apprtc.VIDEO_WIDTH";
-  public static final String EXTRA_VIDEO_HEIGHT = "org.appspot.apprtc.VIDEO_HEIGHT";
-  public static final String EXTRA_VIDEO_FPS = "org.appspot.apprtc.VIDEO_FPS";
-  public static final String EXTRA_VIDEO_CAPTUREQUALITYSLIDER_ENABLED =
-      "org.appsopt.apprtc.VIDEO_CAPTUREQUALITYSLIDER";
-  public static final String EXTRA_VIDEO_BITRATE = "org.appspot.apprtc.VIDEO_BITRATE";
-  public static final String EXTRA_VIDEOCODEC = "org.appspot.apprtc.VIDEOCODEC";
-  public static final String EXTRA_HWCODEC_ENABLED = "org.appspot.apprtc.HWCODEC";
-  public static final String EXTRA_CAPTURETOTEXTURE_ENABLED = "org.appspot.apprtc.CAPTURETOTEXTURE";
-  public static final String EXTRA_FLEXFEC_ENABLED = "org.appspot.apprtc.FLEXFEC";
-  public static final String EXTRA_AUDIO_BITRATE = "org.appspot.apprtc.AUDIO_BITRATE";
-  public static final String EXTRA_AUDIOCODEC = "org.appspot.apprtc.AUDIOCODEC";
-  public static final String EXTRA_NOAUDIOPROCESSING_ENABLED =
-      "org.appspot.apprtc.NOAUDIOPROCESSING";
-  public static final String EXTRA_AECDUMP_ENABLED = "org.appspot.apprtc.AECDUMP";
-  public static final String EXTRA_OPENSLES_ENABLED = "org.appspot.apprtc.OPENSLES";
-  public static final String EXTRA_DISABLE_BUILT_IN_AEC = "org.appspot.apprtc.DISABLE_BUILT_IN_AEC";
-  public static final String EXTRA_DISABLE_BUILT_IN_AGC = "org.appspot.apprtc.DISABLE_BUILT_IN_AGC";
-  public static final String EXTRA_DISABLE_BUILT_IN_NS = "org.appspot.apprtc.DISABLE_BUILT_IN_NS";
-  public static final String EXTRA_ENABLE_LEVEL_CONTROL = "org.appspot.apprtc.ENABLE_LEVEL_CONTROL";
-  public static final String EXTRA_DISABLE_WEBRTC_AGC_AND_HPF =
-      "org.appspot.apprtc.DISABLE_WEBRTC_GAIN_CONTROL";
-  public static final String EXTRA_DISPLAY_HUD = "org.appspot.apprtc.DISPLAY_HUD";
-  public static final String EXTRA_TRACING = "org.appspot.apprtc.TRACING";
-  public static final String EXTRA_CMDLINE = "org.appspot.apprtc.CMDLINE";
-  public static final String EXTRA_RUNTIME = "org.appspot.apprtc.RUNTIME";
-  public static final String EXTRA_VIDEO_FILE_AS_CAMERA = "org.appspot.apprtc.VIDEO_FILE_AS_CAMERA";
-  public static final String EXTRA_SAVE_REMOTE_VIDEO_TO_FILE =
-      "org.appspot.apprtc.SAVE_REMOTE_VIDEO_TO_FILE";
-  public static final String EXTRA_SAVE_REMOTE_VIDEO_TO_FILE_WIDTH =
-      "org.appspot.apprtc.SAVE_REMOTE_VIDEO_TO_FILE_WIDTH";
-  public static final String EXTRA_SAVE_REMOTE_VIDEO_TO_FILE_HEIGHT =
-      "org.appspot.apprtc.SAVE_REMOTE_VIDEO_TO_FILE_HEIGHT";
-  public static final String EXTRA_USE_VALUES_FROM_INTENT =
-      "org.appspot.apprtc.USE_VALUES_FROM_INTENT";
-  public static final String EXTRA_DATA_CHANNEL_ENABLED = "org.appspot.apprtc.DATA_CHANNEL_ENABLED";
-  public static final String EXTRA_ORDERED = "org.appspot.apprtc.ORDERED";
-  public static final String EXTRA_MAX_RETRANSMITS_MS = "org.appspot.apprtc.MAX_RETRANSMITS_MS";
-  public static final String EXTRA_MAX_RETRANSMITS = "org.appspot.apprtc.MAX_RETRANSMITS";
-  public static final String EXTRA_PROTOCOL = "org.appspot.apprtc.PROTOCOL";
-  public static final String EXTRA_NEGOTIATED = "org.appspot.apprtc.NEGOTIATED";
-  public static final String EXTRA_ID = "org.appspot.apprtc.ID";
-
-  private static final int CAPTURE_PERMISSION_REQUEST_CODE = 1;
-
-  // List of mandatory application permissions.
-  private static final String[] MANDATORY_PERMISSIONS = {"android.permission.MODIFY_AUDIO_SETTINGS",
-      "android.permission.RECORD_AUDIO", "android.permission.INTERNET"};
-
-  // Peer connection statistics callback period in ms.
-  private static final int STAT_CALLBACK_PERIOD = 1000;
-
-  private class ProxyRenderer<T extends VideoRenderer.Callbacks & VideoSink>
-      implements VideoRenderer.Callbacks, VideoSink {
-    private T target;
-
-    @Override
-    synchronized public void renderFrame(VideoRenderer.I420Frame frame) {
-      if (target == null) {
-        Logging.d(TAG, "Dropping frame in proxy because target is null.");
-        VideoRenderer.renderFrameDone(frame);
-        return;
-      }
-
-      target.renderFrame(frame);
-    }
-
-    @Override
-    synchronized public void onFrame(VideoFrame frame) {
-      if (target == null) {
-        Logging.d(TAG, "Dropping frame in proxy because target is null.");
-        return;
-      }
-
-      target.onFrame(frame);
-    }
-
-    synchronized public void setTarget(T target) {
-      this.target = target;
-    }
-  }
-
-  private final ProxyRenderer remoteProxyRenderer = new ProxyRenderer();
-  private final ProxyRenderer localProxyRenderer = new ProxyRenderer();
-  private PeerConnectionClient peerConnectionClient = null;
-  private AppRTCClient appRtcClient;
-  private SignalingParameters signalingParameters;
-  private AppRTCAudioManager audioManager = null;
-  private SurfaceViewRenderer pipRenderer;
-  private SurfaceViewRenderer fullscreenRenderer;
-  private VideoFileRenderer videoFileRenderer;
-  private final List<VideoRenderer.Callbacks> remoteRenderers =
-      new ArrayList<VideoRenderer.Callbacks>();
-  private Toast logToast;
-  private boolean commandLineRun;
-  private int runTimeMs;
-  private boolean activityRunning;
-  private RoomConnectionParameters roomConnectionParameters;
-  private PeerConnectionParameters peerConnectionParameters;
-  private boolean iceConnected;
-  private boolean isError;
-  private boolean callControlFragmentVisible = true;
-  private long callStartedTimeMs = 0;
-  private boolean micEnabled = true;
-  private boolean screencaptureEnabled = false;
-  private static Intent mediaProjectionPermissionResultData;
-  private static int mediaProjectionPermissionResultCode;
-  // True if local view is in the fullscreen renderer.
-  private boolean isSwappedFeeds;
-
-  // Controls
-  private CallFragment callFragment;
-  private HudFragment hudFragment;
-  private CpuMonitor cpuMonitor;
-
-  @Override
-  public void onCreate(Bundle savedInstanceState) {
-    super.onCreate(savedInstanceState);
-    Thread.setDefaultUncaughtExceptionHandler(new UnhandledExceptionHandler(this));
-
-    // Set window styles for fullscreen-window size. Needs to be done before
-    // adding content.
-    requestWindowFeature(Window.FEATURE_NO_TITLE);
-    getWindow().addFlags(LayoutParams.FLAG_FULLSCREEN | LayoutParams.FLAG_KEEP_SCREEN_ON
-        | LayoutParams.FLAG_DISMISS_KEYGUARD | LayoutParams.FLAG_SHOW_WHEN_LOCKED
-        | LayoutParams.FLAG_TURN_SCREEN_ON);
-    getWindow().getDecorView().setSystemUiVisibility(getSystemUiVisibility());
-    setContentView(R.layout.activity_call);
-
-    iceConnected = false;
-    signalingParameters = null;
-
-    // Create UI controls.
-    pipRenderer = (SurfaceViewRenderer) findViewById(R.id.pip_video_view);
-    fullscreenRenderer = (SurfaceViewRenderer) findViewById(R.id.fullscreen_video_view);
-    callFragment = new CallFragment();
-    hudFragment = new HudFragment();
-
-    // Show/hide call control fragment on view click.
-    View.OnClickListener listener = new View.OnClickListener() {
-      @Override
-      public void onClick(View view) {
-        toggleCallControlFragmentVisibility();
-      }
-    };
-
-    // Swap feeds on pip view click.
-    pipRenderer.setOnClickListener(new View.OnClickListener() {
-      @Override
-      public void onClick(View view) {
-        setSwappedFeeds(!isSwappedFeeds);
-      }
-    });
-
-    fullscreenRenderer.setOnClickListener(listener);
-    remoteRenderers.add(remoteProxyRenderer);
-
-    final Intent intent = getIntent();
-
-    // Create peer connection client.
-    peerConnectionClient = new PeerConnectionClient();
-
-    // Create video renderers.
-    pipRenderer.init(peerConnectionClient.getRenderContext(), null);
-    pipRenderer.setScalingType(ScalingType.SCALE_ASPECT_FIT);
-    String saveRemoteVideoToFile = intent.getStringExtra(EXTRA_SAVE_REMOTE_VIDEO_TO_FILE);
-
-    // When saveRemoteVideoToFile is set we save the video from the remote to a file.
-    if (saveRemoteVideoToFile != null) {
-      int videoOutWidth = intent.getIntExtra(EXTRA_SAVE_REMOTE_VIDEO_TO_FILE_WIDTH, 0);
-      int videoOutHeight = intent.getIntExtra(EXTRA_SAVE_REMOTE_VIDEO_TO_FILE_HEIGHT, 0);
-      try {
-        videoFileRenderer = new VideoFileRenderer(saveRemoteVideoToFile, videoOutWidth,
-            videoOutHeight, peerConnectionClient.getRenderContext());
-        remoteRenderers.add(videoFileRenderer);
-      } catch (IOException e) {
-        throw new RuntimeException(
-            "Failed to open video file for output: " + saveRemoteVideoToFile, e);
-      }
-    }
-    fullscreenRenderer.init(peerConnectionClient.getRenderContext(), null);
-    fullscreenRenderer.setScalingType(ScalingType.SCALE_ASPECT_FILL);
-
-    pipRenderer.setZOrderMediaOverlay(true);
-    pipRenderer.setEnableHardwareScaler(true /* enabled */);
-    fullscreenRenderer.setEnableHardwareScaler(true /* enabled */);
-    // Start with local feed in fullscreen and swap it to the pip when the call is connected.
-    setSwappedFeeds(true /* isSwappedFeeds */);
-
-    // Check for mandatory permissions.
-    for (String permission : MANDATORY_PERMISSIONS) {
-      if (checkCallingOrSelfPermission(permission) != PackageManager.PERMISSION_GRANTED) {
-        logAndToast("Permission " + permission + " is not granted");
-        setResult(RESULT_CANCELED);
-        finish();
-        return;
-      }
-    }
-
-    Uri roomUri = intent.getData();
-    if (roomUri == null) {
-      logAndToast(getString(R.string.missing_url));
-      Log.e(TAG, "Didn't get any URL in intent!");
-      setResult(RESULT_CANCELED);
-      finish();
-      return;
-    }
-
-    // Get Intent parameters.
-    String roomId = intent.getStringExtra(EXTRA_ROOMID);
-    Log.d(TAG, "Room ID: " + roomId);
-    if (roomId == null || roomId.length() == 0) {
-      logAndToast(getString(R.string.missing_url));
-      Log.e(TAG, "Incorrect room ID in intent!");
-      setResult(RESULT_CANCELED);
-      finish();
-      return;
-    }
-
-    boolean loopback = intent.getBooleanExtra(EXTRA_LOOPBACK, false);
-    boolean tracing = intent.getBooleanExtra(EXTRA_TRACING, false);
-
-    int videoWidth = intent.getIntExtra(EXTRA_VIDEO_WIDTH, 0);
-    int videoHeight = intent.getIntExtra(EXTRA_VIDEO_HEIGHT, 0);
-
-    screencaptureEnabled = intent.getBooleanExtra(EXTRA_SCREENCAPTURE, false);
-    // If capturing format is not specified for screencapture, use screen resolution.
-    if (screencaptureEnabled && videoWidth == 0 && videoHeight == 0) {
-      DisplayMetrics displayMetrics = getDisplayMetrics();
-      videoWidth = displayMetrics.widthPixels;
-      videoHeight = displayMetrics.heightPixels;
-    }
-    DataChannelParameters dataChannelParameters = null;
-    if (intent.getBooleanExtra(EXTRA_DATA_CHANNEL_ENABLED, false)) {
-      dataChannelParameters = new DataChannelParameters(intent.getBooleanExtra(EXTRA_ORDERED, true),
-          intent.getIntExtra(EXTRA_MAX_RETRANSMITS_MS, -1),
-          intent.getIntExtra(EXTRA_MAX_RETRANSMITS, -1), intent.getStringExtra(EXTRA_PROTOCOL),
-          intent.getBooleanExtra(EXTRA_NEGOTIATED, false), intent.getIntExtra(EXTRA_ID, -1));
-    }
-    peerConnectionParameters =
-        new PeerConnectionParameters(intent.getBooleanExtra(EXTRA_VIDEO_CALL, true), loopback,
-            tracing, videoWidth, videoHeight, intent.getIntExtra(EXTRA_VIDEO_FPS, 0),
-            intent.getIntExtra(EXTRA_VIDEO_BITRATE, 0), intent.getStringExtra(EXTRA_VIDEOCODEC),
-            intent.getBooleanExtra(EXTRA_HWCODEC_ENABLED, true),
-            intent.getBooleanExtra(EXTRA_FLEXFEC_ENABLED, false),
-            intent.getIntExtra(EXTRA_AUDIO_BITRATE, 0), intent.getStringExtra(EXTRA_AUDIOCODEC),
-            intent.getBooleanExtra(EXTRA_NOAUDIOPROCESSING_ENABLED, false),
-            intent.getBooleanExtra(EXTRA_AECDUMP_ENABLED, false),
-            intent.getBooleanExtra(EXTRA_OPENSLES_ENABLED, false),
-            intent.getBooleanExtra(EXTRA_DISABLE_BUILT_IN_AEC, false),
-            intent.getBooleanExtra(EXTRA_DISABLE_BUILT_IN_AGC, false),
-            intent.getBooleanExtra(EXTRA_DISABLE_BUILT_IN_NS, false),
-            intent.getBooleanExtra(EXTRA_ENABLE_LEVEL_CONTROL, false),
-            intent.getBooleanExtra(EXTRA_DISABLE_WEBRTC_AGC_AND_HPF, false), dataChannelParameters);
-    commandLineRun = intent.getBooleanExtra(EXTRA_CMDLINE, false);
-    runTimeMs = intent.getIntExtra(EXTRA_RUNTIME, 0);
-
-    Log.d(TAG, "VIDEO_FILE: '" + intent.getStringExtra(EXTRA_VIDEO_FILE_AS_CAMERA) + "'");
-
-    // Create connection client. Use DirectRTCClient if room name is an IP otherwise use the
-    // standard WebSocketRTCClient.
-    if (loopback || !DirectRTCClient.IP_PATTERN.matcher(roomId).matches()) {
-      appRtcClient = new WebSocketRTCClient(this);
-    } else {
-      Log.i(TAG, "Using DirectRTCClient because room name looks like an IP.");
-      appRtcClient = new DirectRTCClient(this);
-    }
-    // Create connection parameters.
-    String urlParameters = intent.getStringExtra(EXTRA_URLPARAMETERS);
-    roomConnectionParameters =
-        new RoomConnectionParameters(roomUri.toString(), roomId, loopback, urlParameters);
-
-    // Create CPU monitor
-    cpuMonitor = new CpuMonitor(this);
-    hudFragment.setCpuMonitor(cpuMonitor);
-
-    // Send intent arguments to fragments.
-    callFragment.setArguments(intent.getExtras());
-    hudFragment.setArguments(intent.getExtras());
-    // Activate call and HUD fragments and start the call.
-    FragmentTransaction ft = getFragmentManager().beginTransaction();
-    ft.add(R.id.call_fragment_container, callFragment);
-    ft.add(R.id.hud_fragment_container, hudFragment);
-    ft.commit();
-
-    // For command line execution run connection for <runTimeMs> and exit.
-    if (commandLineRun && runTimeMs > 0) {
-      (new Handler()).postDelayed(new Runnable() {
-        @Override
-        public void run() {
-          disconnect();
-        }
-      }, runTimeMs);
-    }
-
-    if (loopback) {
-      PeerConnectionFactory.Options options = new PeerConnectionFactory.Options();
-      options.networkIgnoreMask = 0;
-      peerConnectionClient.setPeerConnectionFactoryOptions(options);
-    }
-    peerConnectionClient.createPeerConnectionFactory(
-        getApplicationContext(), peerConnectionParameters, CallActivity.this);
-
-    if (screencaptureEnabled) {
-      startScreenCapture();
-    } else {
-      startCall();
-    }
-  }
-
-  @TargetApi(17)
-  private DisplayMetrics getDisplayMetrics() {
-    DisplayMetrics displayMetrics = new DisplayMetrics();
-    WindowManager windowManager =
-        (WindowManager) getApplication().getSystemService(Context.WINDOW_SERVICE);
-    windowManager.getDefaultDisplay().getRealMetrics(displayMetrics);
-    return displayMetrics;
-  }
-
-  @TargetApi(19)
-  private static int getSystemUiVisibility() {
-    int flags = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN;
-    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
-      flags |= View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
-    }
-    return flags;
-  }
-
-  @TargetApi(21)
-  private void startScreenCapture() {
-    MediaProjectionManager mediaProjectionManager =
-        (MediaProjectionManager) getApplication().getSystemService(
-            Context.MEDIA_PROJECTION_SERVICE);
-    startActivityForResult(
-        mediaProjectionManager.createScreenCaptureIntent(), CAPTURE_PERMISSION_REQUEST_CODE);
-  }
-
-  @Override
-  public void onActivityResult(int requestCode, int resultCode, Intent data) {
-    if (requestCode != CAPTURE_PERMISSION_REQUEST_CODE)
-      return;
-    mediaProjectionPermissionResultCode = resultCode;
-    mediaProjectionPermissionResultData = data;
-    startCall();
-  }
-
-  private boolean useCamera2() {
-    return Camera2Enumerator.isSupported(this) && getIntent().getBooleanExtra(EXTRA_CAMERA2, true);
-  }
-
-  private boolean captureToTexture() {
-    return getIntent().getBooleanExtra(EXTRA_CAPTURETOTEXTURE_ENABLED, false);
-  }
-
-  private VideoCapturer createCameraCapturer(CameraEnumerator enumerator) {
-    final String[] deviceNames = enumerator.getDeviceNames();
-
-    // First, try to find front facing camera
-    Logging.d(TAG, "Looking for front facing cameras.");
-    for (String deviceName : deviceNames) {
-      if (enumerator.isFrontFacing(deviceName)) {
-        Logging.d(TAG, "Creating front facing camera capturer.");
-        VideoCapturer videoCapturer = enumerator.createCapturer(deviceName, null);
-
-        if (videoCapturer != null) {
-          return videoCapturer;
-        }
-      }
-    }
-
-    // Front facing camera not found, try something else
-    Logging.d(TAG, "Looking for other cameras.");
-    for (String deviceName : deviceNames) {
-      if (!enumerator.isFrontFacing(deviceName)) {
-        Logging.d(TAG, "Creating other camera capturer.");
-        VideoCapturer videoCapturer = enumerator.createCapturer(deviceName, null);
-
-        if (videoCapturer != null) {
-          return videoCapturer;
-        }
-      }
-    }
-
-    return null;
-  }
-
-  @TargetApi(21)
-  private VideoCapturer createScreenCapturer() {
-    if (mediaProjectionPermissionResultCode != Activity.RESULT_OK) {
-      reportError("User didn't give permission to capture the screen.");
-      return null;
-    }
-    return new ScreenCapturerAndroid(
-        mediaProjectionPermissionResultData, new MediaProjection.Callback() {
-      @Override
-      public void onStop() {
-        reportError("User revoked permission to capture the screen.");
-      }
-    });
-  }
-
-  // Activity interfaces
-  @Override
-  public void onStop() {
-    super.onStop();
-    activityRunning = false;
-    // Don't stop the video when using screencapture to allow user to show other apps to the remote
-    // end.
-    if (peerConnectionClient != null && !screencaptureEnabled) {
-      peerConnectionClient.stopVideoSource();
-    }
-    cpuMonitor.pause();
-  }
-
-  @Override
-  public void onStart() {
-    super.onStart();
-    activityRunning = true;
-    // Video is not paused for screencapture. See onPause.
-    if (peerConnectionClient != null && !screencaptureEnabled) {
-      peerConnectionClient.startVideoSource();
-    }
-    cpuMonitor.resume();
-  }
-
-  @Override
-  protected void onDestroy() {
-    Thread.setDefaultUncaughtExceptionHandler(null);
-    disconnect();
-    if (logToast != null) {
-      logToast.cancel();
-    }
-    activityRunning = false;
-    super.onDestroy();
-  }
-
-  // CallFragment.OnCallEvents interface implementation.
-  @Override
-  public void onCallHangUp() {
-    disconnect();
-  }
-
-  @Override
-  public void onCameraSwitch() {
-    if (peerConnectionClient != null) {
-      peerConnectionClient.switchCamera();
-    }
-  }
-
-  @Override
-  public void onVideoScalingSwitch(ScalingType scalingType) {
-    fullscreenRenderer.setScalingType(scalingType);
-  }
-
-  @Override
-  public void onCaptureFormatChange(int width, int height, int framerate) {
-    if (peerConnectionClient != null) {
-      peerConnectionClient.changeCaptureFormat(width, height, framerate);
-    }
-  }
-
-  @Override
-  public boolean onToggleMic() {
-    if (peerConnectionClient != null) {
-      micEnabled = !micEnabled;
-      peerConnectionClient.setAudioEnabled(micEnabled);
-    }
-    return micEnabled;
-  }
-
-  // Helper functions.
-  private void toggleCallControlFragmentVisibility() {
-    if (!iceConnected || !callFragment.isAdded()) {
-      return;
-    }
-    // Show/hide call control fragment
-    callControlFragmentVisible = !callControlFragmentVisible;
-    FragmentTransaction ft = getFragmentManager().beginTransaction();
-    if (callControlFragmentVisible) {
-      ft.show(callFragment);
-      ft.show(hudFragment);
-    } else {
-      ft.hide(callFragment);
-      ft.hide(hudFragment);
-    }
-    ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
-    ft.commit();
-  }
-
-  private void startCall() {
-    if (appRtcClient == null) {
-      Log.e(TAG, "AppRTC client is not allocated for a call.");
-      return;
-    }
-    callStartedTimeMs = System.currentTimeMillis();
-
-    // Start room connection.
-    logAndToast(getString(R.string.connecting_to, roomConnectionParameters.roomUrl));
-    appRtcClient.connectToRoom(roomConnectionParameters);
-
-    // Create and audio manager that will take care of audio routing,
-    // audio modes, audio device enumeration etc.
-    audioManager = AppRTCAudioManager.create(getApplicationContext());
-    // Store existing audio settings and change audio mode to
-    // MODE_IN_COMMUNICATION for best possible VoIP performance.
-    Log.d(TAG, "Starting the audio manager...");
-    audioManager.start(new AudioManagerEvents() {
-      // This method will be called each time the number of available audio
-      // devices has changed.
-      @Override
-      public void onAudioDeviceChanged(
-          AudioDevice audioDevice, Set<AudioDevice> availableAudioDevices) {
-        onAudioManagerDevicesChanged(audioDevice, availableAudioDevices);
-      }
-    });
-  }
-
-  // Should be called from UI thread
-  private void callConnected() {
-    final long delta = System.currentTimeMillis() - callStartedTimeMs;
-    Log.i(TAG, "Call connected: delay=" + delta + "ms");
-    if (peerConnectionClient == null || isError) {
-      Log.w(TAG, "Call is connected in closed or error state");
-      return;
-    }
-    // Enable statistics callback.
-    peerConnectionClient.enableStatsEvents(true, STAT_CALLBACK_PERIOD);
-    setSwappedFeeds(false /* isSwappedFeeds */);
-  }
-
-  // This method is called when the audio manager reports audio device change,
-  // e.g. from wired headset to speakerphone.
-  private void onAudioManagerDevicesChanged(
-      final AudioDevice device, final Set<AudioDevice> availableDevices) {
-    Log.d(TAG, "onAudioManagerDevicesChanged: " + availableDevices + ", "
-            + "selected: " + device);
-    // TODO(henrika): add callback handler.
-  }
-
-  // Disconnect from remote resources, dispose of local resources, and exit.
-  private void disconnect() {
-    activityRunning = false;
-    remoteProxyRenderer.setTarget(null);
-    localProxyRenderer.setTarget(null);
-    if (appRtcClient != null) {
-      appRtcClient.disconnectFromRoom();
-      appRtcClient = null;
-    }
-    if (pipRenderer != null) {
-      pipRenderer.release();
-      pipRenderer = null;
-    }
-    if (videoFileRenderer != null) {
-      videoFileRenderer.release();
-      videoFileRenderer = null;
-    }
-    if (fullscreenRenderer != null) {
-      fullscreenRenderer.release();
-      fullscreenRenderer = null;
-    }
-    if (peerConnectionClient != null) {
-      peerConnectionClient.close();
-      peerConnectionClient = null;
-    }
-    if (audioManager != null) {
-      audioManager.stop();
-      audioManager = null;
-    }
-    if (iceConnected && !isError) {
-      setResult(RESULT_OK);
-    } else {
-      setResult(RESULT_CANCELED);
-    }
-    finish();
-  }
-
-  private void disconnectWithErrorMessage(final String errorMessage) {
-    if (commandLineRun || !activityRunning) {
-      Log.e(TAG, "Critical error: " + errorMessage);
-      disconnect();
-    } else {
-      new AlertDialog.Builder(this)
-          .setTitle(getText(R.string.channel_error_title))
-          .setMessage(errorMessage)
-          .setCancelable(false)
-          .setNeutralButton(R.string.ok,
-              new DialogInterface.OnClickListener() {
-                @Override
-                public void onClick(DialogInterface dialog, int id) {
-                  dialog.cancel();
-                  disconnect();
-                }
-              })
-          .create()
-          .show();
-    }
-  }
-
-  // Log |msg| and Toast about it.
-  private void logAndToast(String msg) {
-    Log.d(TAG, msg);
-    if (logToast != null) {
-      logToast.cancel();
-    }
-    logToast = Toast.makeText(this, msg, Toast.LENGTH_SHORT);
-    logToast.show();
-  }
-
-  private void reportError(final String description) {
-    runOnUiThread(new Runnable() {
-      @Override
-      public void run() {
-        if (!isError) {
-          isError = true;
-          disconnectWithErrorMessage(description);
-        }
-      }
-    });
-  }
-
-  private VideoCapturer createVideoCapturer() {
-    VideoCapturer videoCapturer = null;
-    String videoFileAsCamera = getIntent().getStringExtra(EXTRA_VIDEO_FILE_AS_CAMERA);
-    if (videoFileAsCamera != null) {
-      try {
-        videoCapturer = new FileVideoCapturer(videoFileAsCamera);
-      } catch (IOException e) {
-        reportError("Failed to open video file for emulated camera");
-        return null;
-      }
-    } else if (screencaptureEnabled) {
-      return createScreenCapturer();
-    } else if (useCamera2()) {
-      if (!captureToTexture()) {
-        reportError(getString(R.string.camera2_texture_only_error));
-        return null;
-      }
-
-      Logging.d(TAG, "Creating capturer using camera2 API.");
-      videoCapturer = createCameraCapturer(new Camera2Enumerator(this));
-    } else {
-      Logging.d(TAG, "Creating capturer using camera1 API.");
-      videoCapturer = createCameraCapturer(new Camera1Enumerator(captureToTexture()));
-    }
-    if (videoCapturer == null) {
-      reportError("Failed to open camera");
-      return null;
-    }
-    return videoCapturer;
-  }
-
-  private void setSwappedFeeds(boolean isSwappedFeeds) {
-    Logging.d(TAG, "setSwappedFeeds: " + isSwappedFeeds);
-    this.isSwappedFeeds = isSwappedFeeds;
-    localProxyRenderer.setTarget(isSwappedFeeds ? fullscreenRenderer : pipRenderer);
-    remoteProxyRenderer.setTarget(isSwappedFeeds ? pipRenderer : fullscreenRenderer);
-    fullscreenRenderer.setMirror(isSwappedFeeds);
-    pipRenderer.setMirror(!isSwappedFeeds);
-  }
-
-  // -----Implementation of AppRTCClient.AppRTCSignalingEvents ---------------
-  // All callbacks are invoked from websocket signaling looper thread and
-  // are routed to UI thread.
-  private void onConnectedToRoomInternal(final SignalingParameters params) {
-    final long delta = System.currentTimeMillis() - callStartedTimeMs;
-
-    signalingParameters = params;
-    logAndToast("Creating peer connection, delay=" + delta + "ms");
-    VideoCapturer videoCapturer = null;
-    if (peerConnectionParameters.videoCallEnabled) {
-      videoCapturer = createVideoCapturer();
-    }
-    peerConnectionClient.createPeerConnection(
-        localProxyRenderer, remoteRenderers, videoCapturer, signalingParameters);
-
-    if (signalingParameters.initiator) {
-      logAndToast("Creating OFFER...");
-      // Create offer. Offer SDP will be sent to answering client in
-      // PeerConnectionEvents.onLocalDescription event.
-      peerConnectionClient.createOffer();
-    } else {
-      if (params.offerSdp != null) {
-        peerConnectionClient.setRemoteDescription(params.offerSdp);
-        logAndToast("Creating ANSWER...");
-        // Create answer. Answer SDP will be sent to offering client in
-        // PeerConnectionEvents.onLocalDescription event.
-        peerConnectionClient.createAnswer();
-      }
-      if (params.iceCandidates != null) {
-        // Add remote ICE candidates from room.
-        for (IceCandidate iceCandidate : params.iceCandidates) {
-          peerConnectionClient.addRemoteIceCandidate(iceCandidate);
-        }
-      }
-    }
-  }
-
-  @Override
-  public void onConnectedToRoom(final SignalingParameters params) {
-    runOnUiThread(new Runnable() {
-      @Override
-      public void run() {
-        onConnectedToRoomInternal(params);
-      }
-    });
-  }
-
-  @Override
-  public void onRemoteDescription(final SessionDescription sdp) {
-    final long delta = System.currentTimeMillis() - callStartedTimeMs;
-    runOnUiThread(new Runnable() {
-      @Override
-      public void run() {
-        if (peerConnectionClient == null) {
-          Log.e(TAG, "Received remote SDP for non-initilized peer connection.");
-          return;
-        }
-        logAndToast("Received remote " + sdp.type + ", delay=" + delta + "ms");
-        peerConnectionClient.setRemoteDescription(sdp);
-        if (!signalingParameters.initiator) {
-          logAndToast("Creating ANSWER...");
-          // Create answer. Answer SDP will be sent to offering client in
-          // PeerConnectionEvents.onLocalDescription event.
-          peerConnectionClient.createAnswer();
-        }
-      }
-    });
-  }
-
-  @Override
-  public void onRemoteIceCandidate(final IceCandidate candidate) {
-    runOnUiThread(new Runnable() {
-      @Override
-      public void run() {
-        if (peerConnectionClient == null) {
-          Log.e(TAG, "Received ICE candidate for a non-initialized peer connection.");
-          return;
-        }
-        peerConnectionClient.addRemoteIceCandidate(candidate);
-      }
-    });
-  }
-
-  @Override
-  public void onRemoteIceCandidatesRemoved(final IceCandidate[] candidates) {
-    runOnUiThread(new Runnable() {
-      @Override
-      public void run() {
-        if (peerConnectionClient == null) {
-          Log.e(TAG, "Received ICE candidate removals for a non-initialized peer connection.");
-          return;
-        }
-        peerConnectionClient.removeRemoteIceCandidates(candidates);
-      }
-    });
-  }
-
-  @Override
-  public void onChannelClose() {
-    runOnUiThread(new Runnable() {
-      @Override
-      public void run() {
-        logAndToast("Remote end hung up; dropping PeerConnection");
-        disconnect();
-      }
-    });
-  }
-
-  @Override
-  public void onChannelError(final String description) {
-    reportError(description);
-  }
-
-  // -----Implementation of PeerConnectionClient.PeerConnectionEvents.---------
-  // Send local peer connection SDP and ICE candidates to remote party.
-  // All callbacks are invoked from peer connection client looper thread and
-  // are routed to UI thread.
-  @Override
-  public void onLocalDescription(final SessionDescription sdp) {
-    final long delta = System.currentTimeMillis() - callStartedTimeMs;
-    runOnUiThread(new Runnable() {
-      @Override
-      public void run() {
-        if (appRtcClient != null) {
-          logAndToast("Sending " + sdp.type + ", delay=" + delta + "ms");
-          if (signalingParameters.initiator) {
-            appRtcClient.sendOfferSdp(sdp);
-          } else {
-            appRtcClient.sendAnswerSdp(sdp);
-          }
-        }
-        if (peerConnectionParameters.videoMaxBitrate > 0) {
-          Log.d(TAG, "Set video maximum bitrate: " + peerConnectionParameters.videoMaxBitrate);
-          peerConnectionClient.setVideoMaxBitrate(peerConnectionParameters.videoMaxBitrate);
-        }
-      }
-    });
-  }
-
-  @Override
-  public void onIceCandidate(final IceCandidate candidate) {
-    runOnUiThread(new Runnable() {
-      @Override
-      public void run() {
-        if (appRtcClient != null) {
-          appRtcClient.sendLocalIceCandidate(candidate);
-        }
-      }
-    });
-  }
-
-  @Override
-  public void onIceCandidatesRemoved(final IceCandidate[] candidates) {
-    runOnUiThread(new Runnable() {
-      @Override
-      public void run() {
-        if (appRtcClient != null) {
-          appRtcClient.sendLocalIceCandidateRemovals(candidates);
-        }
-      }
-    });
-  }
-
-  @Override
-  public void onIceConnected() {
-    final long delta = System.currentTimeMillis() - callStartedTimeMs;
-    runOnUiThread(new Runnable() {
-      @Override
-      public void run() {
-        logAndToast("ICE connected, delay=" + delta + "ms");
-        iceConnected = true;
-        callConnected();
-      }
-    });
-  }
-
-  @Override
-  public void onIceDisconnected() {
-    runOnUiThread(new Runnable() {
-      @Override
-      public void run() {
-        logAndToast("ICE disconnected");
-        iceConnected = false;
-        disconnect();
-      }
-    });
-  }
-
-  @Override
-  public void onPeerConnectionClosed() {}
-
-  @Override
-  public void onPeerConnectionStatsReady(final StatsReport[] reports) {
-    runOnUiThread(new Runnable() {
-      @Override
-      public void run() {
-        if (!isError && iceConnected) {
-          hudFragment.updateEncoderStatistics(reports);
-        }
-      }
-    });
-  }
-
-  @Override
-  public void onPeerConnectionError(final String description) {
-    reportError(description);
-  }
-}
diff --git a/examples/androidapp/src/org/appspot/apprtc/CallFragment.java b/examples/androidapp/src/org/appspot/apprtc/CallFragment.java
deleted file mode 100644
index 0901499..0000000
--- a/examples/androidapp/src/org/appspot/apprtc/CallFragment.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-package org.appspot.apprtc;
-
-import android.app.Activity;
-import android.app.Fragment;
-import android.os.Bundle;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.ImageButton;
-import android.widget.SeekBar;
-import android.widget.TextView;
-
-import org.webrtc.RendererCommon.ScalingType;
-
-/**
- * Fragment for call control.
- */
-public class CallFragment extends Fragment {
-  private View controlView;
-  private TextView contactView;
-  private ImageButton disconnectButton;
-  private ImageButton cameraSwitchButton;
-  private ImageButton videoScalingButton;
-  private ImageButton toggleMuteButton;
-  private TextView captureFormatText;
-  private SeekBar captureFormatSlider;
-  private OnCallEvents callEvents;
-  private ScalingType scalingType;
-  private boolean videoCallEnabled = true;
-
-  /**
-   * Call control interface for container activity.
-   */
-  public interface OnCallEvents {
-    void onCallHangUp();
-    void onCameraSwitch();
-    void onVideoScalingSwitch(ScalingType scalingType);
-    void onCaptureFormatChange(int width, int height, int framerate);
-    boolean onToggleMic();
-  }
-
-  @Override
-  public View onCreateView(
-      LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
-    controlView = inflater.inflate(R.layout.fragment_call, container, false);
-
-    // Create UI controls.
-    contactView = (TextView) controlView.findViewById(R.id.contact_name_call);
-    disconnectButton = (ImageButton) controlView.findViewById(R.id.button_call_disconnect);
-    cameraSwitchButton = (ImageButton) controlView.findViewById(R.id.button_call_switch_camera);
-    videoScalingButton = (ImageButton) controlView.findViewById(R.id.button_call_scaling_mode);
-    toggleMuteButton = (ImageButton) controlView.findViewById(R.id.button_call_toggle_mic);
-    captureFormatText = (TextView) controlView.findViewById(R.id.capture_format_text_call);
-    captureFormatSlider = (SeekBar) controlView.findViewById(R.id.capture_format_slider_call);
-
-    // Add buttons click events.
-    disconnectButton.setOnClickListener(new View.OnClickListener() {
-      @Override
-      public void onClick(View view) {
-        callEvents.onCallHangUp();
-      }
-    });
-
-    cameraSwitchButton.setOnClickListener(new View.OnClickListener() {
-      @Override
-      public void onClick(View view) {
-        callEvents.onCameraSwitch();
-      }
-    });
-
-    videoScalingButton.setOnClickListener(new View.OnClickListener() {
-      @Override
-      public void onClick(View view) {
-        if (scalingType == ScalingType.SCALE_ASPECT_FILL) {
-          videoScalingButton.setBackgroundResource(R.drawable.ic_action_full_screen);
-          scalingType = ScalingType.SCALE_ASPECT_FIT;
-        } else {
-          videoScalingButton.setBackgroundResource(R.drawable.ic_action_return_from_full_screen);
-          scalingType = ScalingType.SCALE_ASPECT_FILL;
-        }
-        callEvents.onVideoScalingSwitch(scalingType);
-      }
-    });
-    scalingType = ScalingType.SCALE_ASPECT_FILL;
-
-    toggleMuteButton.setOnClickListener(new View.OnClickListener() {
-      @Override
-      public void onClick(View view) {
-        boolean enabled = callEvents.onToggleMic();
-        toggleMuteButton.setAlpha(enabled ? 1.0f : 0.3f);
-      }
-    });
-
-    return controlView;
-  }
-
-  @Override
-  public void onStart() {
-    super.onStart();
-
-    boolean captureSliderEnabled = false;
-    Bundle args = getArguments();
-    if (args != null) {
-      String contactName = args.getString(CallActivity.EXTRA_ROOMID);
-      contactView.setText(contactName);
-      videoCallEnabled = args.getBoolean(CallActivity.EXTRA_VIDEO_CALL, true);
-      captureSliderEnabled = videoCallEnabled
-          && args.getBoolean(CallActivity.EXTRA_VIDEO_CAPTUREQUALITYSLIDER_ENABLED, false);
-    }
-    if (!videoCallEnabled) {
-      cameraSwitchButton.setVisibility(View.INVISIBLE);
-    }
-    if (captureSliderEnabled) {
-      captureFormatSlider.setOnSeekBarChangeListener(
-          new CaptureQualityController(captureFormatText, callEvents));
-    } else {
-      captureFormatText.setVisibility(View.GONE);
-      captureFormatSlider.setVisibility(View.GONE);
-    }
-  }
-
-  // TODO(sakal): Replace with onAttach(Context) once we only support API level 23+.
-  @SuppressWarnings("deprecation")
-  @Override
-  public void onAttach(Activity activity) {
-    super.onAttach(activity);
-    callEvents = (OnCallEvents) activity;
-  }
-}
diff --git a/examples/androidapp/src/org/appspot/apprtc/CaptureQualityController.java b/examples/androidapp/src/org/appspot/apprtc/CaptureQualityController.java
deleted file mode 100644
index 82cf338..0000000
--- a/examples/androidapp/src/org/appspot/apprtc/CaptureQualityController.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-package org.appspot.apprtc;
-
-import android.widget.SeekBar;
-import android.widget.TextView;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.List;
-import org.webrtc.CameraEnumerationAndroid.CaptureFormat;
-
-/**
- * Control capture format based on a seekbar listener.
- */
-public class CaptureQualityController implements SeekBar.OnSeekBarChangeListener {
-  private final List<CaptureFormat> formats =
-      Arrays.asList(new CaptureFormat(1280, 720, 0, 30000), new CaptureFormat(960, 540, 0, 30000),
-          new CaptureFormat(640, 480, 0, 30000), new CaptureFormat(480, 360, 0, 30000),
-          new CaptureFormat(320, 240, 0, 30000), new CaptureFormat(256, 144, 0, 30000));
-  // Prioritize framerate below this threshold and resolution above the threshold.
-  private static final int FRAMERATE_THRESHOLD = 15;
-  private TextView captureFormatText;
-  private CallFragment.OnCallEvents callEvents;
-  private int width = 0;
-  private int height = 0;
-  private int framerate = 0;
-  private double targetBandwidth = 0;
-
-  public CaptureQualityController(
-      TextView captureFormatText, CallFragment.OnCallEvents callEvents) {
-    this.captureFormatText = captureFormatText;
-    this.callEvents = callEvents;
-  }
-
-  private final Comparator<CaptureFormat> compareFormats = new Comparator<CaptureFormat>() {
-    @Override
-    public int compare(CaptureFormat first, CaptureFormat second) {
-      int firstFps = calculateFramerate(targetBandwidth, first);
-      int secondFps = calculateFramerate(targetBandwidth, second);
-
-      if (firstFps >= FRAMERATE_THRESHOLD && secondFps >= FRAMERATE_THRESHOLD
-          || firstFps == secondFps) {
-        // Compare resolution.
-        return first.width * first.height - second.width * second.height;
-      } else {
-        // Compare fps.
-        return firstFps - secondFps;
-      }
-    }
-  };
-
-  @Override
-  public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
-    if (progress == 0) {
-      width = 0;
-      height = 0;
-      framerate = 0;
-      captureFormatText.setText(R.string.muted);
-      return;
-    }
-
-    // Extract max bandwidth (in millipixels / second).
-    long maxCaptureBandwidth = java.lang.Long.MIN_VALUE;
-    for (CaptureFormat format : formats) {
-      maxCaptureBandwidth =
-          Math.max(maxCaptureBandwidth, (long) format.width * format.height * format.framerate.max);
-    }
-
-    // Fraction between 0 and 1.
-    double bandwidthFraction = (double) progress / 100.0;
-    // Make a log-scale transformation, still between 0 and 1.
-    final double kExpConstant = 3.0;
-    bandwidthFraction =
-        (Math.exp(kExpConstant * bandwidthFraction) - 1) / (Math.exp(kExpConstant) - 1);
-    targetBandwidth = bandwidthFraction * maxCaptureBandwidth;
-
-    // Choose the best format given a target bandwidth.
-    final CaptureFormat bestFormat = Collections.max(formats, compareFormats);
-    width = bestFormat.width;
-    height = bestFormat.height;
-    framerate = calculateFramerate(targetBandwidth, bestFormat);
-    captureFormatText.setText(
-        String.format(captureFormatText.getContext().getString(R.string.format_description), width,
-            height, framerate));
-  }
-
-  @Override
-  public void onStartTrackingTouch(SeekBar seekBar) {}
-
-  @Override
-  public void onStopTrackingTouch(SeekBar seekBar) {
-    callEvents.onCaptureFormatChange(width, height, framerate);
-  }
-
-  // Return the highest frame rate possible based on bandwidth and format.
-  private int calculateFramerate(double bandwidth, CaptureFormat format) {
-    return (int) Math.round(
-        Math.min(format.framerate.max, (int) Math.round(bandwidth / (format.width * format.height)))
-        / 1000.0);
-  }
-}
diff --git a/examples/androidapp/src/org/appspot/apprtc/ConnectActivity.java b/examples/androidapp/src/org/appspot/apprtc/ConnectActivity.java
deleted file mode 100644
index ac03bfb..0000000
--- a/examples/androidapp/src/org/appspot/apprtc/ConnectActivity.java
+++ /dev/null
@@ -1,626 +0,0 @@
-/*
- *  Copyright 2014 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.
- */
-
-package org.appspot.apprtc;
-
-import android.app.Activity;
-import android.app.AlertDialog;
-import android.content.DialogInterface;
-import android.content.Intent;
-import android.content.SharedPreferences;
-import android.net.Uri;
-import android.os.Bundle;
-import android.preference.PreferenceManager;
-import android.util.Log;
-import android.view.ContextMenu;
-import android.view.KeyEvent;
-import android.view.Menu;
-import android.view.MenuItem;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.view.inputmethod.EditorInfo;
-import android.webkit.URLUtil;
-import android.widget.AdapterView;
-import android.widget.ArrayAdapter;
-import android.widget.EditText;
-import android.widget.ImageButton;
-import android.widget.ListView;
-import android.widget.TextView;
-import java.util.ArrayList;
-import java.util.Random;
-import org.json.JSONArray;
-import org.json.JSONException;
-
-/**
- * Handles the initial setup where the user selects which room to join.
- */
-public class ConnectActivity extends Activity {
-  private static final String TAG = "ConnectActivity";
-  private static final int CONNECTION_REQUEST = 1;
-  private static final int REMOVE_FAVORITE_INDEX = 0;
-  private static boolean commandLineRun = false;
-
-  private ImageButton connectButton;
-  private ImageButton addFavoriteButton;
-  private EditText roomEditText;
-  private ListView roomListView;
-  private SharedPreferences sharedPref;
-  private String keyprefVideoCallEnabled;
-  private String keyprefScreencapture;
-  private String keyprefCamera2;
-  private String keyprefResolution;
-  private String keyprefFps;
-  private String keyprefCaptureQualitySlider;
-  private String keyprefVideoBitrateType;
-  private String keyprefVideoBitrateValue;
-  private String keyprefVideoCodec;
-  private String keyprefAudioBitrateType;
-  private String keyprefAudioBitrateValue;
-  private String keyprefAudioCodec;
-  private String keyprefHwCodecAcceleration;
-  private String keyprefCaptureToTexture;
-  private String keyprefFlexfec;
-  private String keyprefNoAudioProcessingPipeline;
-  private String keyprefAecDump;
-  private String keyprefOpenSLES;
-  private String keyprefDisableBuiltInAec;
-  private String keyprefDisableBuiltInAgc;
-  private String keyprefDisableBuiltInNs;
-  private String keyprefEnableLevelControl;
-  private String keyprefDisableWebRtcAGCAndHPF;
-  private String keyprefDisplayHud;
-  private String keyprefTracing;
-  private String keyprefRoomServerUrl;
-  private String keyprefRoom;
-  private String keyprefRoomList;
-  private ArrayList<String> roomList;
-  private ArrayAdapter<String> adapter;
-  private String keyprefEnableDataChannel;
-  private String keyprefOrdered;
-  private String keyprefMaxRetransmitTimeMs;
-  private String keyprefMaxRetransmits;
-  private String keyprefDataProtocol;
-  private String keyprefNegotiated;
-  private String keyprefDataId;
-
-  @Override
-  public void onCreate(Bundle savedInstanceState) {
-    super.onCreate(savedInstanceState);
-
-    // Get setting keys.
-    PreferenceManager.setDefaultValues(this, R.xml.preferences, false);
-    sharedPref = PreferenceManager.getDefaultSharedPreferences(this);
-    keyprefVideoCallEnabled = getString(R.string.pref_videocall_key);
-    keyprefScreencapture = getString(R.string.pref_screencapture_key);
-    keyprefCamera2 = getString(R.string.pref_camera2_key);
-    keyprefResolution = getString(R.string.pref_resolution_key);
-    keyprefFps = getString(R.string.pref_fps_key);
-    keyprefCaptureQualitySlider = getString(R.string.pref_capturequalityslider_key);
-    keyprefVideoBitrateType = getString(R.string.pref_maxvideobitrate_key);
-    keyprefVideoBitrateValue = getString(R.string.pref_maxvideobitratevalue_key);
-    keyprefVideoCodec = getString(R.string.pref_videocodec_key);
-    keyprefHwCodecAcceleration = getString(R.string.pref_hwcodec_key);
-    keyprefCaptureToTexture = getString(R.string.pref_capturetotexture_key);
-    keyprefFlexfec = getString(R.string.pref_flexfec_key);
-    keyprefAudioBitrateType = getString(R.string.pref_startaudiobitrate_key);
-    keyprefAudioBitrateValue = getString(R.string.pref_startaudiobitratevalue_key);
-    keyprefAudioCodec = getString(R.string.pref_audiocodec_key);
-    keyprefNoAudioProcessingPipeline = getString(R.string.pref_noaudioprocessing_key);
-    keyprefAecDump = getString(R.string.pref_aecdump_key);
-    keyprefOpenSLES = getString(R.string.pref_opensles_key);
-    keyprefDisableBuiltInAec = getString(R.string.pref_disable_built_in_aec_key);
-    keyprefDisableBuiltInAgc = getString(R.string.pref_disable_built_in_agc_key);
-    keyprefDisableBuiltInNs = getString(R.string.pref_disable_built_in_ns_key);
-    keyprefEnableLevelControl = getString(R.string.pref_enable_level_control_key);
-    keyprefDisableWebRtcAGCAndHPF = getString(R.string.pref_disable_webrtc_agc_and_hpf_key);
-    keyprefDisplayHud = getString(R.string.pref_displayhud_key);
-    keyprefTracing = getString(R.string.pref_tracing_key);
-    keyprefRoomServerUrl = getString(R.string.pref_room_server_url_key);
-    keyprefRoom = getString(R.string.pref_room_key);
-    keyprefRoomList = getString(R.string.pref_room_list_key);
-    keyprefEnableDataChannel = getString(R.string.pref_enable_datachannel_key);
-    keyprefOrdered = getString(R.string.pref_ordered_key);
-    keyprefMaxRetransmitTimeMs = getString(R.string.pref_max_retransmit_time_ms_key);
-    keyprefMaxRetransmits = getString(R.string.pref_max_retransmits_key);
-    keyprefDataProtocol = getString(R.string.pref_data_protocol_key);
-    keyprefNegotiated = getString(R.string.pref_negotiated_key);
-    keyprefDataId = getString(R.string.pref_data_id_key);
-
-    setContentView(R.layout.activity_connect);
-
-    roomEditText = (EditText) findViewById(R.id.room_edittext);
-    roomEditText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
-      @Override
-      public boolean onEditorAction(TextView textView, int i, KeyEvent keyEvent) {
-        if (i == EditorInfo.IME_ACTION_DONE) {
-          addFavoriteButton.performClick();
-          return true;
-        }
-        return false;
-      }
-    });
-    roomEditText.requestFocus();
-
-    roomListView = (ListView) findViewById(R.id.room_listview);
-    roomListView.setEmptyView(findViewById(android.R.id.empty));
-    roomListView.setOnItemClickListener(roomListClickListener);
-    registerForContextMenu(roomListView);
-    connectButton = (ImageButton) findViewById(R.id.connect_button);
-    connectButton.setOnClickListener(connectListener);
-    addFavoriteButton = (ImageButton) findViewById(R.id.add_favorite_button);
-    addFavoriteButton.setOnClickListener(addFavoriteListener);
-
-    // If an implicit VIEW intent is launching the app, go directly to that URL.
-    final Intent intent = getIntent();
-    if ("android.intent.action.VIEW".equals(intent.getAction()) && !commandLineRun) {
-      boolean loopback = intent.getBooleanExtra(CallActivity.EXTRA_LOOPBACK, false);
-      int runTimeMs = intent.getIntExtra(CallActivity.EXTRA_RUNTIME, 0);
-      boolean useValuesFromIntent =
-          intent.getBooleanExtra(CallActivity.EXTRA_USE_VALUES_FROM_INTENT, false);
-      String room = sharedPref.getString(keyprefRoom, "");
-      connectToRoom(room, true, loopback, useValuesFromIntent, runTimeMs);
-    }
-  }
-
-  @Override
-  public boolean onCreateOptionsMenu(Menu menu) {
-    getMenuInflater().inflate(R.menu.connect_menu, menu);
-    return true;
-  }
-
-  @Override
-  public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
-    if (v.getId() == R.id.room_listview) {
-      AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo;
-      menu.setHeaderTitle(roomList.get(info.position));
-      String[] menuItems = getResources().getStringArray(R.array.roomListContextMenu);
-      for (int i = 0; i < menuItems.length; i++) {
-        menu.add(Menu.NONE, i, i, menuItems[i]);
-      }
-    } else {
-      super.onCreateContextMenu(menu, v, menuInfo);
-    }
-  }
-
-  @Override
-  public boolean onContextItemSelected(MenuItem item) {
-    if (item.getItemId() == REMOVE_FAVORITE_INDEX) {
-      AdapterView.AdapterContextMenuInfo info =
-          (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
-      roomList.remove(info.position);
-      adapter.notifyDataSetChanged();
-      return true;
-    }
-
-    return super.onContextItemSelected(item);
-  }
-
-  @Override
-  public boolean onOptionsItemSelected(MenuItem item) {
-    // Handle presses on the action bar items.
-    if (item.getItemId() == R.id.action_settings) {
-      Intent intent = new Intent(this, SettingsActivity.class);
-      startActivity(intent);
-      return true;
-    } else if (item.getItemId() == R.id.action_loopback) {
-      connectToRoom(null, false, true, false, 0);
-      return true;
-    } else {
-      return super.onOptionsItemSelected(item);
-    }
-  }
-
-  @Override
-  public void onPause() {
-    super.onPause();
-    String room = roomEditText.getText().toString();
-    String roomListJson = new JSONArray(roomList).toString();
-    SharedPreferences.Editor editor = sharedPref.edit();
-    editor.putString(keyprefRoom, room);
-    editor.putString(keyprefRoomList, roomListJson);
-    editor.commit();
-  }
-
-  @Override
-  public void onResume() {
-    super.onResume();
-    String room = sharedPref.getString(keyprefRoom, "");
-    roomEditText.setText(room);
-    roomList = new ArrayList<String>();
-    String roomListJson = sharedPref.getString(keyprefRoomList, null);
-    if (roomListJson != null) {
-      try {
-        JSONArray jsonArray = new JSONArray(roomListJson);
-        for (int i = 0; i < jsonArray.length(); i++) {
-          roomList.add(jsonArray.get(i).toString());
-        }
-      } catch (JSONException e) {
-        Log.e(TAG, "Failed to load room list: " + e.toString());
-      }
-    }
-    adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, roomList);
-    roomListView.setAdapter(adapter);
-    if (adapter.getCount() > 0) {
-      roomListView.requestFocus();
-      roomListView.setItemChecked(0, true);
-    }
-  }
-
-  @Override
-  protected void onActivityResult(int requestCode, int resultCode, Intent data) {
-    if (requestCode == CONNECTION_REQUEST && commandLineRun) {
-      Log.d(TAG, "Return: " + resultCode);
-      setResult(resultCode);
-      commandLineRun = false;
-      finish();
-    }
-  }
-
-  /**
-   * Get a value from the shared preference or from the intent, if it does not
-   * exist the default is used.
-   */
-  private String sharedPrefGetString(
-      int attributeId, String intentName, int defaultId, boolean useFromIntent) {
-    String defaultValue = getString(defaultId);
-    if (useFromIntent) {
-      String value = getIntent().getStringExtra(intentName);
-      if (value != null) {
-        return value;
-      }
-      return defaultValue;
-    } else {
-      String attributeName = getString(attributeId);
-      return sharedPref.getString(attributeName, defaultValue);
-    }
-  }
-
-  /**
-   * Get a value from the shared preference or from the intent, if it does not
-   * exist the default is used.
-   */
-  private boolean sharedPrefGetBoolean(
-      int attributeId, String intentName, int defaultId, boolean useFromIntent) {
-    boolean defaultValue = Boolean.valueOf(getString(defaultId));
-    if (useFromIntent) {
-      return getIntent().getBooleanExtra(intentName, defaultValue);
-    } else {
-      String attributeName = getString(attributeId);
-      return sharedPref.getBoolean(attributeName, defaultValue);
-    }
-  }
-
-  /**
-   * Get a value from the shared preference or from the intent, if it does not
-   * exist the default is used.
-   */
-  private int sharedPrefGetInteger(
-      int attributeId, String intentName, int defaultId, boolean useFromIntent) {
-    String defaultString = getString(defaultId);
-    int defaultValue = Integer.parseInt(defaultString);
-    if (useFromIntent) {
-      return getIntent().getIntExtra(intentName, defaultValue);
-    } else {
-      String attributeName = getString(attributeId);
-      String value = sharedPref.getString(attributeName, defaultString);
-      try {
-        return Integer.parseInt(value);
-      } catch (NumberFormatException e) {
-        Log.e(TAG, "Wrong setting for: " + attributeName + ":" + value);
-        return defaultValue;
-      }
-    }
-  }
-
-  private void connectToRoom(String roomId, boolean commandLineRun, boolean loopback,
-      boolean useValuesFromIntent, int runTimeMs) {
-    this.commandLineRun = commandLineRun;
-
-    // roomId is random for loopback.
-    if (loopback) {
-      roomId = Integer.toString((new Random()).nextInt(100000000));
-    }
-
-    String roomUrl = sharedPref.getString(
-        keyprefRoomServerUrl, getString(R.string.pref_room_server_url_default));
-
-    // Video call enabled flag.
-    boolean videoCallEnabled = sharedPrefGetBoolean(R.string.pref_videocall_key,
-        CallActivity.EXTRA_VIDEO_CALL, R.string.pref_videocall_default, useValuesFromIntent);
-
-    // Use screencapture option.
-    boolean useScreencapture = sharedPrefGetBoolean(R.string.pref_screencapture_key,
-        CallActivity.EXTRA_SCREENCAPTURE, R.string.pref_screencapture_default, useValuesFromIntent);
-
-    // Use Camera2 option.
-    boolean useCamera2 = sharedPrefGetBoolean(R.string.pref_camera2_key, CallActivity.EXTRA_CAMERA2,
-        R.string.pref_camera2_default, useValuesFromIntent);
-
-    // Get default codecs.
-    String videoCodec = sharedPrefGetString(R.string.pref_videocodec_key,
-        CallActivity.EXTRA_VIDEOCODEC, R.string.pref_videocodec_default, useValuesFromIntent);
-    String audioCodec = sharedPrefGetString(R.string.pref_audiocodec_key,
-        CallActivity.EXTRA_AUDIOCODEC, R.string.pref_audiocodec_default, useValuesFromIntent);
-
-    // Check HW codec flag.
-    boolean hwCodec = sharedPrefGetBoolean(R.string.pref_hwcodec_key,
-        CallActivity.EXTRA_HWCODEC_ENABLED, R.string.pref_hwcodec_default, useValuesFromIntent);
-
-    // Check Capture to texture.
-    boolean captureToTexture = sharedPrefGetBoolean(R.string.pref_capturetotexture_key,
-        CallActivity.EXTRA_CAPTURETOTEXTURE_ENABLED, R.string.pref_capturetotexture_default,
-        useValuesFromIntent);
-
-    // Check FlexFEC.
-    boolean flexfecEnabled = sharedPrefGetBoolean(R.string.pref_flexfec_key,
-        CallActivity.EXTRA_FLEXFEC_ENABLED, R.string.pref_flexfec_default, useValuesFromIntent);
-
-    // Check Disable Audio Processing flag.
-    boolean noAudioProcessing = sharedPrefGetBoolean(R.string.pref_noaudioprocessing_key,
-        CallActivity.EXTRA_NOAUDIOPROCESSING_ENABLED, R.string.pref_noaudioprocessing_default,
-        useValuesFromIntent);
-
-    // Check Disable Audio Processing flag.
-    boolean aecDump = sharedPrefGetBoolean(R.string.pref_aecdump_key,
-        CallActivity.EXTRA_AECDUMP_ENABLED, R.string.pref_aecdump_default, useValuesFromIntent);
-
-    // Check OpenSL ES enabled flag.
-    boolean useOpenSLES = sharedPrefGetBoolean(R.string.pref_opensles_key,
-        CallActivity.EXTRA_OPENSLES_ENABLED, R.string.pref_opensles_default, useValuesFromIntent);
-
-    // Check Disable built-in AEC flag.
-    boolean disableBuiltInAEC = sharedPrefGetBoolean(R.string.pref_disable_built_in_aec_key,
-        CallActivity.EXTRA_DISABLE_BUILT_IN_AEC, R.string.pref_disable_built_in_aec_default,
-        useValuesFromIntent);
-
-    // Check Disable built-in AGC flag.
-    boolean disableBuiltInAGC = sharedPrefGetBoolean(R.string.pref_disable_built_in_agc_key,
-        CallActivity.EXTRA_DISABLE_BUILT_IN_AGC, R.string.pref_disable_built_in_agc_default,
-        useValuesFromIntent);
-
-    // Check Disable built-in NS flag.
-    boolean disableBuiltInNS = sharedPrefGetBoolean(R.string.pref_disable_built_in_ns_key,
-        CallActivity.EXTRA_DISABLE_BUILT_IN_NS, R.string.pref_disable_built_in_ns_default,
-        useValuesFromIntent);
-
-    // Check Enable level control.
-    boolean enableLevelControl = sharedPrefGetBoolean(R.string.pref_enable_level_control_key,
-        CallActivity.EXTRA_ENABLE_LEVEL_CONTROL, R.string.pref_enable_level_control_key,
-        useValuesFromIntent);
-
-    // Check Disable gain control
-    boolean disableWebRtcAGCAndHPF = sharedPrefGetBoolean(
-        R.string.pref_disable_webrtc_agc_and_hpf_key, CallActivity.EXTRA_DISABLE_WEBRTC_AGC_AND_HPF,
-        R.string.pref_disable_webrtc_agc_and_hpf_key, useValuesFromIntent);
-
-    // Get video resolution from settings.
-    int videoWidth = 0;
-    int videoHeight = 0;
-    if (useValuesFromIntent) {
-      videoWidth = getIntent().getIntExtra(CallActivity.EXTRA_VIDEO_WIDTH, 0);
-      videoHeight = getIntent().getIntExtra(CallActivity.EXTRA_VIDEO_HEIGHT, 0);
-    }
-    if (videoWidth == 0 && videoHeight == 0) {
-      String resolution =
-          sharedPref.getString(keyprefResolution, getString(R.string.pref_resolution_default));
-      String[] dimensions = resolution.split("[ x]+");
-      if (dimensions.length == 2) {
-        try {
-          videoWidth = Integer.parseInt(dimensions[0]);
-          videoHeight = Integer.parseInt(dimensions[1]);
-        } catch (NumberFormatException e) {
-          videoWidth = 0;
-          videoHeight = 0;
-          Log.e(TAG, "Wrong video resolution setting: " + resolution);
-        }
-      }
-    }
-
-    // Get camera fps from settings.
-    int cameraFps = 0;
-    if (useValuesFromIntent) {
-      cameraFps = getIntent().getIntExtra(CallActivity.EXTRA_VIDEO_FPS, 0);
-    }
-    if (cameraFps == 0) {
-      String fps = sharedPref.getString(keyprefFps, getString(R.string.pref_fps_default));
-      String[] fpsValues = fps.split("[ x]+");
-      if (fpsValues.length == 2) {
-        try {
-          cameraFps = Integer.parseInt(fpsValues[0]);
-        } catch (NumberFormatException e) {
-          cameraFps = 0;
-          Log.e(TAG, "Wrong camera fps setting: " + fps);
-        }
-      }
-    }
-
-    // Check capture quality slider flag.
-    boolean captureQualitySlider = sharedPrefGetBoolean(R.string.pref_capturequalityslider_key,
-        CallActivity.EXTRA_VIDEO_CAPTUREQUALITYSLIDER_ENABLED,
-        R.string.pref_capturequalityslider_default, useValuesFromIntent);
-
-    // Get video and audio start bitrate.
-    int videoStartBitrate = 0;
-    if (useValuesFromIntent) {
-      videoStartBitrate = getIntent().getIntExtra(CallActivity.EXTRA_VIDEO_BITRATE, 0);
-    }
-    if (videoStartBitrate == 0) {
-      String bitrateTypeDefault = getString(R.string.pref_maxvideobitrate_default);
-      String bitrateType = sharedPref.getString(keyprefVideoBitrateType, bitrateTypeDefault);
-      if (!bitrateType.equals(bitrateTypeDefault)) {
-        String bitrateValue = sharedPref.getString(
-            keyprefVideoBitrateValue, getString(R.string.pref_maxvideobitratevalue_default));
-        videoStartBitrate = Integer.parseInt(bitrateValue);
-      }
-    }
-
-    int audioStartBitrate = 0;
-    if (useValuesFromIntent) {
-      audioStartBitrate = getIntent().getIntExtra(CallActivity.EXTRA_AUDIO_BITRATE, 0);
-    }
-    if (audioStartBitrate == 0) {
-      String bitrateTypeDefault = getString(R.string.pref_startaudiobitrate_default);
-      String bitrateType = sharedPref.getString(keyprefAudioBitrateType, bitrateTypeDefault);
-      if (!bitrateType.equals(bitrateTypeDefault)) {
-        String bitrateValue = sharedPref.getString(
-            keyprefAudioBitrateValue, getString(R.string.pref_startaudiobitratevalue_default));
-        audioStartBitrate = Integer.parseInt(bitrateValue);
-      }
-    }
-
-    // Check statistics display option.
-    boolean displayHud = sharedPrefGetBoolean(R.string.pref_displayhud_key,
-        CallActivity.EXTRA_DISPLAY_HUD, R.string.pref_displayhud_default, useValuesFromIntent);
-
-    boolean tracing = sharedPrefGetBoolean(R.string.pref_tracing_key, CallActivity.EXTRA_TRACING,
-        R.string.pref_tracing_default, useValuesFromIntent);
-
-    // Get datachannel options
-    boolean dataChannelEnabled = sharedPrefGetBoolean(R.string.pref_enable_datachannel_key,
-        CallActivity.EXTRA_DATA_CHANNEL_ENABLED, R.string.pref_enable_datachannel_default,
-        useValuesFromIntent);
-    boolean ordered = sharedPrefGetBoolean(R.string.pref_ordered_key, CallActivity.EXTRA_ORDERED,
-        R.string.pref_ordered_default, useValuesFromIntent);
-    boolean negotiated = sharedPrefGetBoolean(R.string.pref_negotiated_key,
-        CallActivity.EXTRA_NEGOTIATED, R.string.pref_negotiated_default, useValuesFromIntent);
-    int maxRetrMs = sharedPrefGetInteger(R.string.pref_max_retransmit_time_ms_key,
-        CallActivity.EXTRA_MAX_RETRANSMITS_MS, R.string.pref_max_retransmit_time_ms_default,
-        useValuesFromIntent);
-    int maxRetr =
-        sharedPrefGetInteger(R.string.pref_max_retransmits_key, CallActivity.EXTRA_MAX_RETRANSMITS,
-            R.string.pref_max_retransmits_default, useValuesFromIntent);
-    int id = sharedPrefGetInteger(R.string.pref_data_id_key, CallActivity.EXTRA_ID,
-        R.string.pref_data_id_default, useValuesFromIntent);
-    String protocol = sharedPrefGetString(R.string.pref_data_protocol_key,
-        CallActivity.EXTRA_PROTOCOL, R.string.pref_data_protocol_default, useValuesFromIntent);
-
-    // Start AppRTCMobile activity.
-    Log.d(TAG, "Connecting to room " + roomId + " at URL " + roomUrl);
-    if (validateUrl(roomUrl)) {
-      Uri uri = Uri.parse(roomUrl);
-      Intent intent = new Intent(this, CallActivity.class);
-      intent.setData(uri);
-      intent.putExtra(CallActivity.EXTRA_ROOMID, roomId);
-      intent.putExtra(CallActivity.EXTRA_LOOPBACK, loopback);
-      intent.putExtra(CallActivity.EXTRA_VIDEO_CALL, videoCallEnabled);
-      intent.putExtra(CallActivity.EXTRA_SCREENCAPTURE, useScreencapture);
-      intent.putExtra(CallActivity.EXTRA_CAMERA2, useCamera2);
-      intent.putExtra(CallActivity.EXTRA_VIDEO_WIDTH, videoWidth);
-      intent.putExtra(CallActivity.EXTRA_VIDEO_HEIGHT, videoHeight);
-      intent.putExtra(CallActivity.EXTRA_VIDEO_FPS, cameraFps);
-      intent.putExtra(CallActivity.EXTRA_VIDEO_CAPTUREQUALITYSLIDER_ENABLED, captureQualitySlider);
-      intent.putExtra(CallActivity.EXTRA_VIDEO_BITRATE, videoStartBitrate);
-      intent.putExtra(CallActivity.EXTRA_VIDEOCODEC, videoCodec);
-      intent.putExtra(CallActivity.EXTRA_HWCODEC_ENABLED, hwCodec);
-      intent.putExtra(CallActivity.EXTRA_CAPTURETOTEXTURE_ENABLED, captureToTexture);
-      intent.putExtra(CallActivity.EXTRA_FLEXFEC_ENABLED, flexfecEnabled);
-      intent.putExtra(CallActivity.EXTRA_NOAUDIOPROCESSING_ENABLED, noAudioProcessing);
-      intent.putExtra(CallActivity.EXTRA_AECDUMP_ENABLED, aecDump);
-      intent.putExtra(CallActivity.EXTRA_OPENSLES_ENABLED, useOpenSLES);
-      intent.putExtra(CallActivity.EXTRA_DISABLE_BUILT_IN_AEC, disableBuiltInAEC);
-      intent.putExtra(CallActivity.EXTRA_DISABLE_BUILT_IN_AGC, disableBuiltInAGC);
-      intent.putExtra(CallActivity.EXTRA_DISABLE_BUILT_IN_NS, disableBuiltInNS);
-      intent.putExtra(CallActivity.EXTRA_ENABLE_LEVEL_CONTROL, enableLevelControl);
-      intent.putExtra(CallActivity.EXTRA_DISABLE_WEBRTC_AGC_AND_HPF, disableWebRtcAGCAndHPF);
-      intent.putExtra(CallActivity.EXTRA_AUDIO_BITRATE, audioStartBitrate);
-      intent.putExtra(CallActivity.EXTRA_AUDIOCODEC, audioCodec);
-      intent.putExtra(CallActivity.EXTRA_DISPLAY_HUD, displayHud);
-      intent.putExtra(CallActivity.EXTRA_TRACING, tracing);
-      intent.putExtra(CallActivity.EXTRA_CMDLINE, commandLineRun);
-      intent.putExtra(CallActivity.EXTRA_RUNTIME, runTimeMs);
-
-      intent.putExtra(CallActivity.EXTRA_DATA_CHANNEL_ENABLED, dataChannelEnabled);
-
-      if (dataChannelEnabled) {
-        intent.putExtra(CallActivity.EXTRA_ORDERED, ordered);
-        intent.putExtra(CallActivity.EXTRA_MAX_RETRANSMITS_MS, maxRetrMs);
-        intent.putExtra(CallActivity.EXTRA_MAX_RETRANSMITS, maxRetr);
-        intent.putExtra(CallActivity.EXTRA_PROTOCOL, protocol);
-        intent.putExtra(CallActivity.EXTRA_NEGOTIATED, negotiated);
-        intent.putExtra(CallActivity.EXTRA_ID, id);
-      }
-
-      if (useValuesFromIntent) {
-        if (getIntent().hasExtra(CallActivity.EXTRA_VIDEO_FILE_AS_CAMERA)) {
-          String videoFileAsCamera =
-              getIntent().getStringExtra(CallActivity.EXTRA_VIDEO_FILE_AS_CAMERA);
-          intent.putExtra(CallActivity.EXTRA_VIDEO_FILE_AS_CAMERA, videoFileAsCamera);
-        }
-
-        if (getIntent().hasExtra(CallActivity.EXTRA_SAVE_REMOTE_VIDEO_TO_FILE)) {
-          String saveRemoteVideoToFile =
-              getIntent().getStringExtra(CallActivity.EXTRA_SAVE_REMOTE_VIDEO_TO_FILE);
-          intent.putExtra(CallActivity.EXTRA_SAVE_REMOTE_VIDEO_TO_FILE, saveRemoteVideoToFile);
-        }
-
-        if (getIntent().hasExtra(CallActivity.EXTRA_SAVE_REMOTE_VIDEO_TO_FILE_WIDTH)) {
-          int videoOutWidth =
-              getIntent().getIntExtra(CallActivity.EXTRA_SAVE_REMOTE_VIDEO_TO_FILE_WIDTH, 0);
-          intent.putExtra(CallActivity.EXTRA_SAVE_REMOTE_VIDEO_TO_FILE_WIDTH, videoOutWidth);
-        }
-
-        if (getIntent().hasExtra(CallActivity.EXTRA_SAVE_REMOTE_VIDEO_TO_FILE_HEIGHT)) {
-          int videoOutHeight =
-              getIntent().getIntExtra(CallActivity.EXTRA_SAVE_REMOTE_VIDEO_TO_FILE_HEIGHT, 0);
-          intent.putExtra(CallActivity.EXTRA_SAVE_REMOTE_VIDEO_TO_FILE_HEIGHT, videoOutHeight);
-        }
-      }
-
-      startActivityForResult(intent, CONNECTION_REQUEST);
-    }
-  }
-
-  private boolean validateUrl(String url) {
-    if (URLUtil.isHttpsUrl(url) || URLUtil.isHttpUrl(url)) {
-      return true;
-    }
-
-    new AlertDialog.Builder(this)
-        .setTitle(getText(R.string.invalid_url_title))
-        .setMessage(getString(R.string.invalid_url_text, url))
-        .setCancelable(false)
-        .setNeutralButton(R.string.ok,
-            new DialogInterface.OnClickListener() {
-              public void onClick(DialogInterface dialog, int id) {
-                dialog.cancel();
-              }
-            })
-        .create()
-        .show();
-    return false;
-  }
-
-  private final AdapterView.OnItemClickListener roomListClickListener =
-      new AdapterView.OnItemClickListener() {
-        @Override
-        public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
-          String roomId = ((TextView) view).getText().toString();
-          connectToRoom(roomId, false, false, false, 0);
-        }
-      };
-
-  private final OnClickListener addFavoriteListener = new OnClickListener() {
-    @Override
-    public void onClick(View view) {
-      String newRoom = roomEditText.getText().toString();
-      if (newRoom.length() > 0 && !roomList.contains(newRoom)) {
-        adapter.add(newRoom);
-        adapter.notifyDataSetChanged();
-      }
-    }
-  };
-
-  private final OnClickListener connectListener = new OnClickListener() {
-    @Override
-    public void onClick(View view) {
-      connectToRoom(roomEditText.getText().toString(), false, false, false, 0);
-    }
-  };
-}
diff --git a/examples/androidapp/src/org/appspot/apprtc/CpuMonitor.java b/examples/androidapp/src/org/appspot/apprtc/CpuMonitor.java
deleted file mode 100644
index bc1bb27..0000000
--- a/examples/androidapp/src/org/appspot/apprtc/CpuMonitor.java
+++ /dev/null
@@ -1,511 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-package org.appspot.apprtc;
-
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.os.BatteryManager;
-import android.os.SystemClock;
-import android.util.Log;
-import java.io.BufferedReader;
-import java.io.FileNotFoundException;
-import java.io.FileReader;
-import java.io.IOException;
-import java.util.Arrays;
-import java.util.Scanner;
-import java.util.concurrent.Executors;
-import java.util.concurrent.Future;
-import java.util.concurrent.ScheduledExecutorService;
-import java.util.concurrent.TimeUnit;
-
-/**
- * Simple CPU monitor.  The caller creates a CpuMonitor object which can then
- * be used via sampleCpuUtilization() to collect the percentual use of the
- * cumulative CPU capacity for all CPUs running at their nominal frequency.  3
- * values are generated: (1) getCpuCurrent() returns the use since the last
- * sampleCpuUtilization(), (2) getCpuAvg3() returns the use since 3 prior
- * calls, and (3) getCpuAvgAll() returns the use over all SAMPLE_SAVE_NUMBER
- * calls.
- *
- * <p>CPUs in Android are often "offline", and while this of course means 0 Hz
- * as current frequency, in this state we cannot even get their nominal
- * frequency.  We therefore tread carefully, and allow any CPU to be missing.
- * Missing CPUs are assumed to have the same nominal frequency as any close
- * lower-numbered CPU, but as soon as it is online, we'll get their proper
- * frequency and remember it.  (Since CPU 0 in practice always seem to be
- * online, this unidirectional frequency inheritance should be no problem in
- * practice.)
- *
- * <p>Caveats:
- *   o No provision made for zany "turbo" mode, common in the x86 world.
- *   o No provision made for ARM big.LITTLE; if CPU n can switch behind our
- *     back, we might get incorrect estimates.
- *   o This is not thread-safe.  To call asynchronously, create different
- *     CpuMonitor objects.
- *
- * <p>If we can gather enough info to generate a sensible result,
- * sampleCpuUtilization returns true.  It is designed to never throw an
- * exception.
- *
- * <p>sampleCpuUtilization should not be called too often in its present form,
- * since then deltas would be small and the percent values would fluctuate and
- * be unreadable. If it is desirable to call it more often than say once per
- * second, one would need to increase SAMPLE_SAVE_NUMBER and probably use
- * Queue<Integer> to avoid copying overhead.
- *
- * <p>Known problems:
- *   1. Nexus 7 devices running Kitkat have a kernel which often output an
- *      incorrect 'idle' field in /proc/stat.  The value is close to twice the
- *      correct value, and then returns to back to correct reading.  Both when
- *      jumping up and back down we might create faulty CPU load readings.
- */
-
-class CpuMonitor {
-  private static final String TAG = "CpuMonitor";
-  private static final int MOVING_AVERAGE_SAMPLES = 5;
-
-  private static final int CPU_STAT_SAMPLE_PERIOD_MS = 2000;
-  private static final int CPU_STAT_LOG_PERIOD_MS = 6000;
-
-  private final Context appContext;
-  // User CPU usage at current frequency.
-  private final MovingAverage userCpuUsage;
-  // System CPU usage at current frequency.
-  private final MovingAverage systemCpuUsage;
-  // Total CPU usage relative to maximum frequency.
-  private final MovingAverage totalCpuUsage;
-  // CPU frequency in percentage from maximum.
-  private final MovingAverage frequencyScale;
-
-  private ScheduledExecutorService executor;
-  private long lastStatLogTimeMs;
-  private long[] cpuFreqMax;
-  private int cpusPresent;
-  private int actualCpusPresent;
-  private boolean initialized;
-  private boolean cpuOveruse;
-  private String[] maxPath;
-  private String[] curPath;
-  private double[] curFreqScales;
-  private ProcStat lastProcStat;
-
-  private static class ProcStat {
-    final long userTime;
-    final long systemTime;
-    final long idleTime;
-
-    ProcStat(long userTime, long systemTime, long idleTime) {
-      this.userTime = userTime;
-      this.systemTime = systemTime;
-      this.idleTime = idleTime;
-    }
-  }
-
-  private static class MovingAverage {
-    private final int size;
-    private double sum;
-    private double currentValue;
-    private double[] circBuffer;
-    private int circBufferIndex;
-
-    public MovingAverage(int size) {
-      if (size <= 0) {
-        throw new AssertionError("Size value in MovingAverage ctor should be positive.");
-      }
-      this.size = size;
-      circBuffer = new double[size];
-    }
-
-    public void reset() {
-      Arrays.fill(circBuffer, 0);
-      circBufferIndex = 0;
-      sum = 0;
-      currentValue = 0;
-    }
-
-    public void addValue(double value) {
-      sum -= circBuffer[circBufferIndex];
-      circBuffer[circBufferIndex++] = value;
-      currentValue = value;
-      sum += value;
-      if (circBufferIndex >= size) {
-        circBufferIndex = 0;
-      }
-    }
-
-    public double getCurrent() {
-      return currentValue;
-    }
-
-    public double getAverage() {
-      return sum / (double) size;
-    }
-  }
-
-  public CpuMonitor(Context context) {
-    Log.d(TAG, "CpuMonitor ctor.");
-    appContext = context.getApplicationContext();
-    userCpuUsage = new MovingAverage(MOVING_AVERAGE_SAMPLES);
-    systemCpuUsage = new MovingAverage(MOVING_AVERAGE_SAMPLES);
-    totalCpuUsage = new MovingAverage(MOVING_AVERAGE_SAMPLES);
-    frequencyScale = new MovingAverage(MOVING_AVERAGE_SAMPLES);
-    lastStatLogTimeMs = SystemClock.elapsedRealtime();
-
-    scheduleCpuUtilizationTask();
-  }
-
-  public void pause() {
-    if (executor != null) {
-      Log.d(TAG, "pause");
-      executor.shutdownNow();
-      executor = null;
-    }
-  }
-
-  public void resume() {
-    Log.d(TAG, "resume");
-    resetStat();
-    scheduleCpuUtilizationTask();
-  }
-
-  public synchronized void reset() {
-    if (executor != null) {
-      Log.d(TAG, "reset");
-      resetStat();
-      cpuOveruse = false;
-    }
-  }
-
-  public synchronized int getCpuUsageCurrent() {
-    return doubleToPercent(userCpuUsage.getCurrent() + systemCpuUsage.getCurrent());
-  }
-
-  public synchronized int getCpuUsageAverage() {
-    return doubleToPercent(userCpuUsage.getAverage() + systemCpuUsage.getAverage());
-  }
-
-  public synchronized int getFrequencyScaleAverage() {
-    return doubleToPercent(frequencyScale.getAverage());
-  }
-
-  private void scheduleCpuUtilizationTask() {
-    if (executor != null) {
-      executor.shutdownNow();
-      executor = null;
-    }
-
-    executor = Executors.newSingleThreadScheduledExecutor();
-    @SuppressWarnings("unused") // Prevent downstream linter warnings.
-    Future<?> possiblyIgnoredError = executor.scheduleAtFixedRate(new Runnable() {
-      @Override
-      public void run() {
-        cpuUtilizationTask();
-      }
-    }, 0, CPU_STAT_SAMPLE_PERIOD_MS, TimeUnit.MILLISECONDS);
-  }
-
-  private void cpuUtilizationTask() {
-    boolean cpuMonitorAvailable = sampleCpuUtilization();
-    if (cpuMonitorAvailable
-        && SystemClock.elapsedRealtime() - lastStatLogTimeMs >= CPU_STAT_LOG_PERIOD_MS) {
-      lastStatLogTimeMs = SystemClock.elapsedRealtime();
-      String statString = getStatString();
-      Log.d(TAG, statString);
-    }
-  }
-
-  private void init() {
-    try {
-      FileReader fin = new FileReader("/sys/devices/system/cpu/present");
-      try {
-        BufferedReader reader = new BufferedReader(fin);
-        Scanner scanner = new Scanner(reader).useDelimiter("[-\n]");
-        scanner.nextInt(); // Skip leading number 0.
-        cpusPresent = 1 + scanner.nextInt();
-        scanner.close();
-      } catch (Exception e) {
-        Log.e(TAG, "Cannot do CPU stats due to /sys/devices/system/cpu/present parsing problem");
-      } finally {
-        fin.close();
-      }
-    } catch (FileNotFoundException e) {
-      Log.e(TAG, "Cannot do CPU stats since /sys/devices/system/cpu/present is missing");
-    } catch (IOException e) {
-      Log.e(TAG, "Error closing file");
-    }
-
-    cpuFreqMax = new long[cpusPresent];
-    maxPath = new String[cpusPresent];
-    curPath = new String[cpusPresent];
-    curFreqScales = new double[cpusPresent];
-    for (int i = 0; i < cpusPresent; i++) {
-      cpuFreqMax[i] = 0; // Frequency "not yet determined".
-      curFreqScales[i] = 0;
-      maxPath[i] = "/sys/devices/system/cpu/cpu" + i + "/cpufreq/cpuinfo_max_freq";
-      curPath[i] = "/sys/devices/system/cpu/cpu" + i + "/cpufreq/scaling_cur_freq";
-    }
-
-    lastProcStat = new ProcStat(0, 0, 0);
-    resetStat();
-
-    initialized = true;
-  }
-
-  private synchronized void resetStat() {
-    userCpuUsage.reset();
-    systemCpuUsage.reset();
-    totalCpuUsage.reset();
-    frequencyScale.reset();
-    lastStatLogTimeMs = SystemClock.elapsedRealtime();
-  }
-
-  private int getBatteryLevel() {
-    // Use sticky broadcast with null receiver to read battery level once only.
-    Intent intent = appContext.registerReceiver(
-        null /* receiver */, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
-
-    int batteryLevel = 0;
-    int batteryScale = intent.getIntExtra(BatteryManager.EXTRA_SCALE, 100);
-    if (batteryScale > 0) {
-      batteryLevel =
-          (int) (100f * intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0) / batteryScale);
-    }
-    return batteryLevel;
-  }
-
-  /**
-   * Re-measure CPU use.  Call this method at an interval of around 1/s.
-   * This method returns true on success.  The fields
-   * cpuCurrent, cpuAvg3, and cpuAvgAll are updated on success, and represents:
-   * cpuCurrent: The CPU use since the last sampleCpuUtilization call.
-   * cpuAvg3: The average CPU over the last 3 calls.
-   * cpuAvgAll: The average CPU over the last SAMPLE_SAVE_NUMBER calls.
-   */
-  private synchronized boolean sampleCpuUtilization() {
-    long lastSeenMaxFreq = 0;
-    long cpuFreqCurSum = 0;
-    long cpuFreqMaxSum = 0;
-
-    if (!initialized) {
-      init();
-    }
-    if (cpusPresent == 0) {
-      return false;
-    }
-
-    actualCpusPresent = 0;
-    for (int i = 0; i < cpusPresent; i++) {
-      /*
-       * For each CPU, attempt to first read its max frequency, then its
-       * current frequency.  Once as the max frequency for a CPU is found,
-       * save it in cpuFreqMax[].
-       */
-
-      curFreqScales[i] = 0;
-      if (cpuFreqMax[i] == 0) {
-        // We have never found this CPU's max frequency.  Attempt to read it.
-        long cpufreqMax = readFreqFromFile(maxPath[i]);
-        if (cpufreqMax > 0) {
-          Log.d(TAG, "Core " + i + ". Max frequency: " + cpufreqMax);
-          lastSeenMaxFreq = cpufreqMax;
-          cpuFreqMax[i] = cpufreqMax;
-          maxPath[i] = null; // Kill path to free its memory.
-        }
-      } else {
-        lastSeenMaxFreq = cpuFreqMax[i]; // A valid, previously read value.
-      }
-
-      long cpuFreqCur = readFreqFromFile(curPath[i]);
-      if (cpuFreqCur == 0 && lastSeenMaxFreq == 0) {
-        // No current frequency information for this CPU core - ignore it.
-        continue;
-      }
-      if (cpuFreqCur > 0) {
-        actualCpusPresent++;
-      }
-      cpuFreqCurSum += cpuFreqCur;
-
-      /* Here, lastSeenMaxFreq might come from
-       * 1. cpuFreq[i], or
-       * 2. a previous iteration, or
-       * 3. a newly read value, or
-       * 4. hypothetically from the pre-loop dummy.
-       */
-      cpuFreqMaxSum += lastSeenMaxFreq;
-      if (lastSeenMaxFreq > 0) {
-        curFreqScales[i] = (double) cpuFreqCur / lastSeenMaxFreq;
-      }
-    }
-
-    if (cpuFreqCurSum == 0 || cpuFreqMaxSum == 0) {
-      Log.e(TAG, "Could not read max or current frequency for any CPU");
-      return false;
-    }
-
-    /*
-     * Since the cycle counts are for the period between the last invocation
-     * and this present one, we average the percentual CPU frequencies between
-     * now and the beginning of the measurement period.  This is significantly
-     * incorrect only if the frequencies have peeked or dropped in between the
-     * invocations.
-     */
-    double currentFrequencyScale = cpuFreqCurSum / (double) cpuFreqMaxSum;
-    if (frequencyScale.getCurrent() > 0) {
-      currentFrequencyScale = (frequencyScale.getCurrent() + currentFrequencyScale) * 0.5;
-    }
-
-    ProcStat procStat = readProcStat();
-    if (procStat == null) {
-      return false;
-    }
-
-    long diffUserTime = procStat.userTime - lastProcStat.userTime;
-    long diffSystemTime = procStat.systemTime - lastProcStat.systemTime;
-    long diffIdleTime = procStat.idleTime - lastProcStat.idleTime;
-    long allTime = diffUserTime + diffSystemTime + diffIdleTime;
-
-    if (currentFrequencyScale == 0 || allTime == 0) {
-      return false;
-    }
-
-    // Update statistics.
-    frequencyScale.addValue(currentFrequencyScale);
-
-    double currentUserCpuUsage = diffUserTime / (double) allTime;
-    userCpuUsage.addValue(currentUserCpuUsage);
-
-    double currentSystemCpuUsage = diffSystemTime / (double) allTime;
-    systemCpuUsage.addValue(currentSystemCpuUsage);
-
-    double currentTotalCpuUsage =
-        (currentUserCpuUsage + currentSystemCpuUsage) * currentFrequencyScale;
-    totalCpuUsage.addValue(currentTotalCpuUsage);
-
-    // Save new measurements for next round's deltas.
-    lastProcStat = procStat;
-
-    return true;
-  }
-
-  private int doubleToPercent(double d) {
-    return (int) (d * 100 + 0.5);
-  }
-
-  private synchronized String getStatString() {
-    StringBuilder stat = new StringBuilder();
-    stat.append("CPU User: ")
-        .append(doubleToPercent(userCpuUsage.getCurrent()))
-        .append("/")
-        .append(doubleToPercent(userCpuUsage.getAverage()))
-        .append(". System: ")
-        .append(doubleToPercent(systemCpuUsage.getCurrent()))
-        .append("/")
-        .append(doubleToPercent(systemCpuUsage.getAverage()))
-        .append(". Freq: ")
-        .append(doubleToPercent(frequencyScale.getCurrent()))
-        .append("/")
-        .append(doubleToPercent(frequencyScale.getAverage()))
-        .append(". Total usage: ")
-        .append(doubleToPercent(totalCpuUsage.getCurrent()))
-        .append("/")
-        .append(doubleToPercent(totalCpuUsage.getAverage()))
-        .append(". Cores: ")
-        .append(actualCpusPresent);
-    stat.append("( ");
-    for (int i = 0; i < cpusPresent; i++) {
-      stat.append(doubleToPercent(curFreqScales[i])).append(" ");
-    }
-    stat.append("). Battery: ").append(getBatteryLevel());
-    if (cpuOveruse) {
-      stat.append(". Overuse.");
-    }
-    return stat.toString();
-  }
-
-  /**
-   * Read a single integer value from the named file.  Return the read value
-   * or if an error occurs return 0.
-   */
-  private long readFreqFromFile(String fileName) {
-    long number = 0;
-    try {
-      BufferedReader reader = new BufferedReader(new FileReader(fileName));
-      try {
-        String line = reader.readLine();
-        number = parseLong(line);
-      } finally {
-        reader.close();
-      }
-    } catch (FileNotFoundException e) {
-      // CPU core is off, so file with its scaling frequency .../cpufreq/scaling_cur_freq
-      // is not present. This is not an error.
-    } catch (IOException e) {
-      // CPU core is off, so file with its scaling frequency .../cpufreq/scaling_cur_freq
-      // is empty. This is not an error.
-    }
-    return number;
-  }
-
-  private static long parseLong(String value) {
-    long number = 0;
-    try {
-      number = Long.parseLong(value);
-    } catch (NumberFormatException e) {
-      Log.e(TAG, "parseLong error.", e);
-    }
-    return number;
-  }
-
-  /*
-   * Read the current utilization of all CPUs using the cumulative first line
-   * of /proc/stat.
-   */
-  private ProcStat readProcStat() {
-    long userTime = 0;
-    long systemTime = 0;
-    long idleTime = 0;
-    try {
-      BufferedReader reader = new BufferedReader(new FileReader("/proc/stat"));
-      try {
-        // line should contain something like this:
-        // cpu  5093818 271838 3512830 165934119 101374 447076 272086 0 0 0
-        //       user    nice  system     idle   iowait  irq   softirq
-        String line = reader.readLine();
-        String[] lines = line.split("\\s+");
-        int length = lines.length;
-        if (length >= 5) {
-          userTime = parseLong(lines[1]); // user
-          userTime += parseLong(lines[2]); // nice
-          systemTime = parseLong(lines[3]); // system
-          idleTime = parseLong(lines[4]); // idle
-        }
-        if (length >= 8) {
-          userTime += parseLong(lines[5]); // iowait
-          systemTime += parseLong(lines[6]); // irq
-          systemTime += parseLong(lines[7]); // softirq
-        }
-      } catch (Exception e) {
-        Log.e(TAG, "Problems parsing /proc/stat", e);
-        return null;
-      } finally {
-        reader.close();
-      }
-    } catch (FileNotFoundException e) {
-      Log.e(TAG, "Cannot open /proc/stat for reading", e);
-      return null;
-    } catch (IOException e) {
-      Log.e(TAG, "Problems reading /proc/stat", e);
-      return null;
-    }
-    return new ProcStat(userTime, systemTime, idleTime);
-  }
-}
diff --git a/examples/androidapp/src/org/appspot/apprtc/DirectRTCClient.java b/examples/androidapp/src/org/appspot/apprtc/DirectRTCClient.java
deleted file mode 100644
index 199979f..0000000
--- a/examples/androidapp/src/org/appspot/apprtc/DirectRTCClient.java
+++ /dev/null
@@ -1,347 +0,0 @@
-/*
- *  Copyright 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.
- */
-
-package org.appspot.apprtc;
-
-import android.util.Log;
-
-import org.json.JSONArray;
-import org.json.JSONException;
-import org.json.JSONObject;
-import org.webrtc.IceCandidate;
-import org.webrtc.PeerConnection;
-import org.webrtc.SessionDescription;
-
-import java.util.LinkedList;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-/**
- * Implementation of AppRTCClient that uses direct TCP connection as the signaling channel.
- * This eliminates the need for an external server. This class does not support loopback
- * connections.
- */
-public class DirectRTCClient implements AppRTCClient, TCPChannelClient.TCPChannelEvents {
-  private static final String TAG = "DirectRTCClient";
-  private static final int DEFAULT_PORT = 8888;
-
-  // Regex pattern used for checking if room id looks like an IP.
-  static final Pattern IP_PATTERN = Pattern.compile("("
-      // IPv4
-      + "((\\d+\\.){3}\\d+)|"
-      // IPv6
-      + "\\[((([0-9a-fA-F]{1,4}:)*[0-9a-fA-F]{1,4})?::"
-      + "(([0-9a-fA-F]{1,4}:)*[0-9a-fA-F]{1,4})?)\\]|"
-      + "\\[(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4})\\]|"
-      // IPv6 without []
-      + "((([0-9a-fA-F]{1,4}:)*[0-9a-fA-F]{1,4})?::(([0-9a-fA-F]{1,4}:)*[0-9a-fA-F]{1,4})?)|"
-      + "(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4})|"
-      // Literals
-      + "localhost"
-      + ")"
-      // Optional port number
-      + "(:(\\d+))?");
-
-  private final ExecutorService executor;
-  private final SignalingEvents events;
-  private TCPChannelClient tcpClient;
-  private RoomConnectionParameters connectionParameters;
-
-  private enum ConnectionState { NEW, CONNECTED, CLOSED, ERROR }
-
-  // All alterations of the room state should be done from inside the looper thread.
-  private ConnectionState roomState;
-
-  public DirectRTCClient(SignalingEvents events) {
-    this.events = events;
-
-    executor = Executors.newSingleThreadExecutor();
-    roomState = ConnectionState.NEW;
-  }
-
-  /**
-   * Connects to the room, roomId in connectionsParameters is required. roomId must be a valid
-   * IP address matching IP_PATTERN.
-   */
-  @Override
-  public void connectToRoom(RoomConnectionParameters connectionParameters) {
-    this.connectionParameters = connectionParameters;
-
-    if (connectionParameters.loopback) {
-      reportError("Loopback connections aren't supported by DirectRTCClient.");
-    }
-
-    executor.execute(new Runnable() {
-      @Override
-      public void run() {
-        connectToRoomInternal();
-      }
-    });
-  }
-
-  @Override
-  public void disconnectFromRoom() {
-    executor.execute(new Runnable() {
-      @Override
-      public void run() {
-        disconnectFromRoomInternal();
-      }
-    });
-  }
-
-  /**
-   * Connects to the room.
-   *
-   * Runs on the looper thread.
-   */
-  private void connectToRoomInternal() {
-    this.roomState = ConnectionState.NEW;
-
-    String endpoint = connectionParameters.roomId;
-
-    Matcher matcher = IP_PATTERN.matcher(endpoint);
-    if (!matcher.matches()) {
-      reportError("roomId must match IP_PATTERN for DirectRTCClient.");
-      return;
-    }
-
-    String ip = matcher.group(1);
-    String portStr = matcher.group(matcher.groupCount());
-    int port;
-
-    if (portStr != null) {
-      try {
-        port = Integer.parseInt(portStr);
-      } catch (NumberFormatException e) {
-        reportError("Invalid port number: " + portStr);
-        return;
-      }
-    } else {
-      port = DEFAULT_PORT;
-    }
-
-    tcpClient = new TCPChannelClient(executor, this, ip, port);
-  }
-
-  /**
-   * Disconnects from the room.
-   *
-   * Runs on the looper thread.
-   */
-  private void disconnectFromRoomInternal() {
-    roomState = ConnectionState.CLOSED;
-
-    if (tcpClient != null) {
-      tcpClient.disconnect();
-      tcpClient = null;
-    }
-    executor.shutdown();
-  }
-
-  @Override
-  public void sendOfferSdp(final SessionDescription sdp) {
-    executor.execute(new Runnable() {
-      @Override
-      public void run() {
-        if (roomState != ConnectionState.CONNECTED) {
-          reportError("Sending offer SDP in non connected state.");
-          return;
-        }
-        JSONObject json = new JSONObject();
-        jsonPut(json, "sdp", sdp.description);
-        jsonPut(json, "type", "offer");
-        sendMessage(json.toString());
-      }
-    });
-  }
-
-  @Override
-  public void sendAnswerSdp(final SessionDescription sdp) {
-    executor.execute(new Runnable() {
-      @Override
-      public void run() {
-        JSONObject json = new JSONObject();
-        jsonPut(json, "sdp", sdp.description);
-        jsonPut(json, "type", "answer");
-        sendMessage(json.toString());
-      }
-    });
-  }
-
-  @Override
-  public void sendLocalIceCandidate(final IceCandidate candidate) {
-    executor.execute(new Runnable() {
-      @Override
-      public void run() {
-        JSONObject json = new JSONObject();
-        jsonPut(json, "type", "candidate");
-        jsonPut(json, "label", candidate.sdpMLineIndex);
-        jsonPut(json, "id", candidate.sdpMid);
-        jsonPut(json, "candidate", candidate.sdp);
-
-        if (roomState != ConnectionState.CONNECTED) {
-          reportError("Sending ICE candidate in non connected state.");
-          return;
-        }
-        sendMessage(json.toString());
-      }
-    });
-  }
-
-  /** Send removed Ice candidates to the other participant. */
-  @Override
-  public void sendLocalIceCandidateRemovals(final IceCandidate[] candidates) {
-    executor.execute(new Runnable() {
-      @Override
-      public void run() {
-        JSONObject json = new JSONObject();
-        jsonPut(json, "type", "remove-candidates");
-        JSONArray jsonArray = new JSONArray();
-        for (final IceCandidate candidate : candidates) {
-          jsonArray.put(toJsonCandidate(candidate));
-        }
-        jsonPut(json, "candidates", jsonArray);
-
-        if (roomState != ConnectionState.CONNECTED) {
-          reportError("Sending ICE candidate removals in non connected state.");
-          return;
-        }
-        sendMessage(json.toString());
-      }
-    });
-  }
-
-  // -------------------------------------------------------------------
-  // TCPChannelClient event handlers
-
-  /**
-   * If the client is the server side, this will trigger onConnectedToRoom.
-   */
-  @Override
-  public void onTCPConnected(boolean isServer) {
-    if (isServer) {
-      roomState = ConnectionState.CONNECTED;
-
-      SignalingParameters parameters = new SignalingParameters(
-          // Ice servers are not needed for direct connections.
-          new LinkedList<PeerConnection.IceServer>(),
-          isServer, // Server side acts as the initiator on direct connections.
-          null, // clientId
-          null, // wssUrl
-          null, // wwsPostUrl
-          null, // offerSdp
-          null // iceCandidates
-          );
-      events.onConnectedToRoom(parameters);
-    }
-  }
-
-  @Override
-  public void onTCPMessage(String msg) {
-    try {
-      JSONObject json = new JSONObject(msg);
-      String type = json.optString("type");
-      if (type.equals("candidate")) {
-        events.onRemoteIceCandidate(toJavaCandidate(json));
-      } else if (type.equals("remove-candidates")) {
-        JSONArray candidateArray = json.getJSONArray("candidates");
-        IceCandidate[] candidates = new IceCandidate[candidateArray.length()];
-        for (int i = 0; i < candidateArray.length(); ++i) {
-          candidates[i] = toJavaCandidate(candidateArray.getJSONObject(i));
-        }
-        events.onRemoteIceCandidatesRemoved(candidates);
-      } else if (type.equals("answer")) {
-        SessionDescription sdp = new SessionDescription(
-            SessionDescription.Type.fromCanonicalForm(type), json.getString("sdp"));
-        events.onRemoteDescription(sdp);
-      } else if (type.equals("offer")) {
-        SessionDescription sdp = new SessionDescription(
-            SessionDescription.Type.fromCanonicalForm(type), json.getString("sdp"));
-
-        SignalingParameters parameters = new SignalingParameters(
-            // Ice servers are not needed for direct connections.
-            new LinkedList<PeerConnection.IceServer>(),
-            false, // This code will only be run on the client side. So, we are not the initiator.
-            null, // clientId
-            null, // wssUrl
-            null, // wssPostUrl
-            sdp, // offerSdp
-            null // iceCandidates
-            );
-        roomState = ConnectionState.CONNECTED;
-        events.onConnectedToRoom(parameters);
-      } else {
-        reportError("Unexpected TCP message: " + msg);
-      }
-    } catch (JSONException e) {
-      reportError("TCP message JSON parsing error: " + e.toString());
-    }
-  }
-
-  @Override
-  public void onTCPError(String description) {
-    reportError("TCP connection error: " + description);
-  }
-
-  @Override
-  public void onTCPClose() {
-    events.onChannelClose();
-  }
-
-  // --------------------------------------------------------------------
-  // Helper functions.
-  private void reportError(final String errorMessage) {
-    Log.e(TAG, errorMessage);
-    executor.execute(new Runnable() {
-      @Override
-      public void run() {
-        if (roomState != ConnectionState.ERROR) {
-          roomState = ConnectionState.ERROR;
-          events.onChannelError(errorMessage);
-        }
-      }
-    });
-  }
-
-  private void sendMessage(final String message) {
-    executor.execute(new Runnable() {
-      @Override
-      public void run() {
-        tcpClient.send(message);
-      }
-    });
-  }
-
-  // Put a |key|->|value| mapping in |json|.
-  private static void jsonPut(JSONObject json, String key, Object value) {
-    try {
-      json.put(key, value);
-    } catch (JSONException e) {
-      throw new RuntimeException(e);
-    }
-  }
-
-  // Converts a Java candidate to a JSONObject.
-  private static JSONObject toJsonCandidate(final IceCandidate candidate) {
-    JSONObject json = new JSONObject();
-    jsonPut(json, "label", candidate.sdpMLineIndex);
-    jsonPut(json, "id", candidate.sdpMid);
-    jsonPut(json, "candidate", candidate.sdp);
-    return json;
-  }
-
-  // Converts a JSON candidate to a Java object.
-  private static IceCandidate toJavaCandidate(JSONObject json) throws JSONException {
-    return new IceCandidate(
-        json.getString("id"), json.getInt("label"), json.getString("candidate"));
-  }
-}
diff --git a/examples/androidapp/src/org/appspot/apprtc/HudFragment.java b/examples/androidapp/src/org/appspot/apprtc/HudFragment.java
deleted file mode 100644
index ca571bb..0000000
--- a/examples/androidapp/src/org/appspot/apprtc/HudFragment.java
+++ /dev/null
@@ -1,205 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-package org.appspot.apprtc;
-
-import android.app.Fragment;
-import android.os.Bundle;
-import android.util.TypedValue;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.ImageButton;
-import android.widget.TextView;
-
-import org.webrtc.StatsReport;
-
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * Fragment for HUD statistics display.
- */
-public class HudFragment extends Fragment {
-  private View controlView;
-  private TextView encoderStatView;
-  private TextView hudViewBwe;
-  private TextView hudViewConnection;
-  private TextView hudViewVideoSend;
-  private TextView hudViewVideoRecv;
-  private ImageButton toggleDebugButton;
-  private boolean videoCallEnabled;
-  private boolean displayHud;
-  private volatile boolean isRunning;
-  private CpuMonitor cpuMonitor;
-
-  @Override
-  public View onCreateView(
-      LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
-    controlView = inflater.inflate(R.layout.fragment_hud, container, false);
-
-    // Create UI controls.
-    encoderStatView = (TextView) controlView.findViewById(R.id.encoder_stat_call);
-    hudViewBwe = (TextView) controlView.findViewById(R.id.hud_stat_bwe);
-    hudViewConnection = (TextView) controlView.findViewById(R.id.hud_stat_connection);
-    hudViewVideoSend = (TextView) controlView.findViewById(R.id.hud_stat_video_send);
-    hudViewVideoRecv = (TextView) controlView.findViewById(R.id.hud_stat_video_recv);
-    toggleDebugButton = (ImageButton) controlView.findViewById(R.id.button_toggle_debug);
-
-    toggleDebugButton.setOnClickListener(new View.OnClickListener() {
-      @Override
-      public void onClick(View view) {
-        if (displayHud) {
-          int visibility =
-              (hudViewBwe.getVisibility() == View.VISIBLE) ? View.INVISIBLE : View.VISIBLE;
-          hudViewsSetProperties(visibility);
-        }
-      }
-    });
-
-    return controlView;
-  }
-
-  @Override
-  public void onStart() {
-    super.onStart();
-
-    Bundle args = getArguments();
-    if (args != null) {
-      videoCallEnabled = args.getBoolean(CallActivity.EXTRA_VIDEO_CALL, true);
-      displayHud = args.getBoolean(CallActivity.EXTRA_DISPLAY_HUD, false);
-    }
-    int visibility = displayHud ? View.VISIBLE : View.INVISIBLE;
-    encoderStatView.setVisibility(visibility);
-    toggleDebugButton.setVisibility(visibility);
-    hudViewsSetProperties(View.INVISIBLE);
-    isRunning = true;
-  }
-
-  @Override
-  public void onStop() {
-    isRunning = false;
-    super.onStop();
-  }
-
-  public void setCpuMonitor(CpuMonitor cpuMonitor) {
-    this.cpuMonitor = cpuMonitor;
-  }
-
-  private void hudViewsSetProperties(int visibility) {
-    hudViewBwe.setVisibility(visibility);
-    hudViewConnection.setVisibility(visibility);
-    hudViewVideoSend.setVisibility(visibility);
-    hudViewVideoRecv.setVisibility(visibility);
-    hudViewBwe.setTextSize(TypedValue.COMPLEX_UNIT_PT, 5);
-    hudViewConnection.setTextSize(TypedValue.COMPLEX_UNIT_PT, 5);
-    hudViewVideoSend.setTextSize(TypedValue.COMPLEX_UNIT_PT, 5);
-    hudViewVideoRecv.setTextSize(TypedValue.COMPLEX_UNIT_PT, 5);
-  }
-
-  private Map<String, String> getReportMap(StatsReport report) {
-    Map<String, String> reportMap = new HashMap<String, String>();
-    for (StatsReport.Value value : report.values) {
-      reportMap.put(value.name, value.value);
-    }
-    return reportMap;
-  }
-
-  public void updateEncoderStatistics(final StatsReport[] reports) {
-    if (!isRunning || !displayHud) {
-      return;
-    }
-    StringBuilder encoderStat = new StringBuilder(128);
-    StringBuilder bweStat = new StringBuilder();
-    StringBuilder connectionStat = new StringBuilder();
-    StringBuilder videoSendStat = new StringBuilder();
-    StringBuilder videoRecvStat = new StringBuilder();
-    String fps = null;
-    String targetBitrate = null;
-    String actualBitrate = null;
-
-    for (StatsReport report : reports) {
-      if (report.type.equals("ssrc") && report.id.contains("ssrc") && report.id.contains("send")) {
-        // Send video statistics.
-        Map<String, String> reportMap = getReportMap(report);
-        String trackId = reportMap.get("googTrackId");
-        if (trackId != null && trackId.contains(PeerConnectionClient.VIDEO_TRACK_ID)) {
-          fps = reportMap.get("googFrameRateSent");
-          videoSendStat.append(report.id).append("\n");
-          for (StatsReport.Value value : report.values) {
-            String name = value.name.replace("goog", "");
-            videoSendStat.append(name).append("=").append(value.value).append("\n");
-          }
-        }
-      } else if (report.type.equals("ssrc") && report.id.contains("ssrc")
-          && report.id.contains("recv")) {
-        // Receive video statistics.
-        Map<String, String> reportMap = getReportMap(report);
-        // Check if this stat is for video track.
-        String frameWidth = reportMap.get("googFrameWidthReceived");
-        if (frameWidth != null) {
-          videoRecvStat.append(report.id).append("\n");
-          for (StatsReport.Value value : report.values) {
-            String name = value.name.replace("goog", "");
-            videoRecvStat.append(name).append("=").append(value.value).append("\n");
-          }
-        }
-      } else if (report.id.equals("bweforvideo")) {
-        // BWE statistics.
-        Map<String, String> reportMap = getReportMap(report);
-        targetBitrate = reportMap.get("googTargetEncBitrate");
-        actualBitrate = reportMap.get("googActualEncBitrate");
-
-        bweStat.append(report.id).append("\n");
-        for (StatsReport.Value value : report.values) {
-          String name = value.name.replace("goog", "").replace("Available", "");
-          bweStat.append(name).append("=").append(value.value).append("\n");
-        }
-      } else if (report.type.equals("googCandidatePair")) {
-        // Connection statistics.
-        Map<String, String> reportMap = getReportMap(report);
-        String activeConnection = reportMap.get("googActiveConnection");
-        if (activeConnection != null && activeConnection.equals("true")) {
-          connectionStat.append(report.id).append("\n");
-          for (StatsReport.Value value : report.values) {
-            String name = value.name.replace("goog", "");
-            connectionStat.append(name).append("=").append(value.value).append("\n");
-          }
-        }
-      }
-    }
-    hudViewBwe.setText(bweStat.toString());
-    hudViewConnection.setText(connectionStat.toString());
-    hudViewVideoSend.setText(videoSendStat.toString());
-    hudViewVideoRecv.setText(videoRecvStat.toString());
-
-    if (videoCallEnabled) {
-      if (fps != null) {
-        encoderStat.append("Fps:  ").append(fps).append("\n");
-      }
-      if (targetBitrate != null) {
-        encoderStat.append("Target BR: ").append(targetBitrate).append("\n");
-      }
-      if (actualBitrate != null) {
-        encoderStat.append("Actual BR: ").append(actualBitrate).append("\n");
-      }
-    }
-
-    if (cpuMonitor != null) {
-      encoderStat.append("CPU%: ")
-          .append(cpuMonitor.getCpuUsageCurrent())
-          .append("/")
-          .append(cpuMonitor.getCpuUsageAverage())
-          .append(". Freq: ")
-          .append(cpuMonitor.getFrequencyScaleAverage());
-    }
-    encoderStatView.setText(encoderStat.toString());
-  }
-}
diff --git a/examples/androidapp/src/org/appspot/apprtc/PeerConnectionClient.java b/examples/androidapp/src/org/appspot/apprtc/PeerConnectionClient.java
deleted file mode 100644
index e40a17c..0000000
--- a/examples/androidapp/src/org/appspot/apprtc/PeerConnectionClient.java
+++ /dev/null
@@ -1,1368 +0,0 @@
-/*
- *  Copyright 2014 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.
- */
-
-package org.appspot.apprtc;
-
-import android.content.Context;
-import android.os.Environment;
-import android.os.ParcelFileDescriptor;
-import android.util.Log;
-import java.io.File;
-import java.io.IOException;
-import java.nio.ByteBuffer;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.EnumSet;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Timer;
-import java.util.TimerTask;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-import org.appspot.apprtc.AppRTCClient.SignalingParameters;
-import org.webrtc.AudioSource;
-import org.webrtc.AudioTrack;
-import org.webrtc.CameraVideoCapturer;
-import org.webrtc.DataChannel;
-import org.webrtc.EglBase;
-import org.webrtc.IceCandidate;
-import org.webrtc.Logging;
-import org.webrtc.MediaConstraints;
-import org.webrtc.MediaStream;
-import org.webrtc.PeerConnection;
-import org.webrtc.PeerConnection.IceConnectionState;
-import org.webrtc.PeerConnectionFactory;
-import org.webrtc.RtpParameters;
-import org.webrtc.RtpReceiver;
-import org.webrtc.RtpSender;
-import org.webrtc.SdpObserver;
-import org.webrtc.SessionDescription;
-import org.webrtc.StatsObserver;
-import org.webrtc.StatsReport;
-import org.webrtc.VideoCapturer;
-import org.webrtc.VideoRenderer;
-import org.webrtc.VideoSink;
-import org.webrtc.VideoSource;
-import org.webrtc.VideoTrack;
-import org.webrtc.voiceengine.WebRtcAudioManager;
-import org.webrtc.voiceengine.WebRtcAudioRecord;
-import org.webrtc.voiceengine.WebRtcAudioRecord.AudioRecordStartErrorCode;
-import org.webrtc.voiceengine.WebRtcAudioRecord.WebRtcAudioRecordErrorCallback;
-import org.webrtc.voiceengine.WebRtcAudioTrack;
-import org.webrtc.voiceengine.WebRtcAudioTrack.WebRtcAudioTrackErrorCallback;
-import org.webrtc.voiceengine.WebRtcAudioUtils;
-
-/**
- * Peer connection client implementation.
- *
- * <p>All public methods are routed to local looper thread.
- * All PeerConnectionEvents callbacks are invoked from the same looper thread.
- * This class is a singleton.
- */
-public class PeerConnectionClient {
-  public static final String VIDEO_TRACK_ID = "ARDAMSv0";
-  public static final String AUDIO_TRACK_ID = "ARDAMSa0";
-  public static final String VIDEO_TRACK_TYPE = "video";
-  private static final String TAG = "PCRTCClient";
-  private static final String VIDEO_CODEC_VP8 = "VP8";
-  private static final String VIDEO_CODEC_VP9 = "VP9";
-  private static final String VIDEO_CODEC_H264 = "H264";
-  private static final String VIDEO_CODEC_H264_BASELINE = "H264 Baseline";
-  private static final String VIDEO_CODEC_H264_HIGH = "H264 High";
-  private static final String AUDIO_CODEC_OPUS = "opus";
-  private static final String AUDIO_CODEC_ISAC = "ISAC";
-  private static final String VIDEO_CODEC_PARAM_START_BITRATE = "x-google-start-bitrate";
-  private static final String VIDEO_FLEXFEC_FIELDTRIAL =
-      "WebRTC-FlexFEC-03-Advertised/Enabled/WebRTC-FlexFEC-03/Enabled/";
-  private static final String VIDEO_VP8_INTEL_HW_ENCODER_FIELDTRIAL = "WebRTC-IntelVP8/Enabled/";
-  private static final String VIDEO_H264_HIGH_PROFILE_FIELDTRIAL =
-      "WebRTC-H264HighProfile/Enabled/";
-  private static final String DISABLE_WEBRTC_AGC_FIELDTRIAL =
-      "WebRTC-Audio-MinimizeResamplingOnMobile/Enabled/";
-  private static final String VIDEO_FRAME_EMIT_FIELDTRIAL =
-      PeerConnectionFactory.VIDEO_FRAME_EMIT_TRIAL + "/" + PeerConnectionFactory.TRIAL_ENABLED
-      + "/";
-  private static final String AUDIO_CODEC_PARAM_BITRATE = "maxaveragebitrate";
-  private static final String AUDIO_ECHO_CANCELLATION_CONSTRAINT = "googEchoCancellation";
-  private static final String AUDIO_AUTO_GAIN_CONTROL_CONSTRAINT = "googAutoGainControl";
-  private static final String AUDIO_HIGH_PASS_FILTER_CONSTRAINT = "googHighpassFilter";
-  private static final String AUDIO_NOISE_SUPPRESSION_CONSTRAINT = "googNoiseSuppression";
-  private static final String AUDIO_LEVEL_CONTROL_CONSTRAINT = "levelControl";
-  private static final String DTLS_SRTP_KEY_AGREEMENT_CONSTRAINT = "DtlsSrtpKeyAgreement";
-  private static final int HD_VIDEO_WIDTH = 1280;
-  private static final int HD_VIDEO_HEIGHT = 720;
-  private static final int BPS_IN_KBPS = 1000;
-
-  // Executor thread is started once in private ctor and is used for all
-  // peer connection API calls to ensure new peer connection factory is
-  // created on the same thread as previously destroyed factory.
-  private static final ExecutorService executor = Executors.newSingleThreadExecutor();
-
-  private final PCObserver pcObserver = new PCObserver();
-  private final SDPObserver sdpObserver = new SDPObserver();
-
-  private final EglBase rootEglBase;
-  private PeerConnectionFactory factory;
-  private PeerConnection peerConnection;
-  PeerConnectionFactory.Options options = null;
-  private AudioSource audioSource;
-  private VideoSource videoSource;
-  private boolean videoCallEnabled;
-  private boolean preferIsac;
-  private String preferredVideoCodec;
-  private boolean videoCapturerStopped;
-  private boolean isError;
-  private Timer statsTimer;
-  private VideoSink localRender;
-  private List<VideoRenderer.Callbacks> remoteRenders;
-  private SignalingParameters signalingParameters;
-  private MediaConstraints pcConstraints;
-  private int videoWidth;
-  private int videoHeight;
-  private int videoFps;
-  private MediaConstraints audioConstraints;
-  private ParcelFileDescriptor aecDumpFileDescriptor;
-  private MediaConstraints sdpMediaConstraints;
-  private PeerConnectionParameters peerConnectionParameters;
-  // Queued remote ICE candidates are consumed only after both local and
-  // remote descriptions are set. Similarly local ICE candidates are sent to
-  // remote peer after both local and remote description are set.
-  private LinkedList<IceCandidate> queuedRemoteCandidates;
-  private PeerConnectionEvents events;
-  private boolean isInitiator;
-  private SessionDescription localSdp; // either offer or answer SDP
-  private MediaStream mediaStream;
-  private VideoCapturer videoCapturer;
-  // enableVideo is set to true if video should be rendered and sent.
-  private boolean renderVideo;
-  private VideoTrack localVideoTrack;
-  private VideoTrack remoteVideoTrack;
-  private RtpSender localVideoSender;
-  // enableAudio is set to true if audio should be sent.
-  private boolean enableAudio;
-  private AudioTrack localAudioTrack;
-  private DataChannel dataChannel;
-  private boolean dataChannelEnabled;
-
-  /**
-   * Peer connection parameters.
-   */
-  public static class DataChannelParameters {
-    public final boolean ordered;
-    public final int maxRetransmitTimeMs;
-    public final int maxRetransmits;
-    public final String protocol;
-    public final boolean negotiated;
-    public final int id;
-
-    public DataChannelParameters(boolean ordered, int maxRetransmitTimeMs, int maxRetransmits,
-        String protocol, boolean negotiated, int id) {
-      this.ordered = ordered;
-      this.maxRetransmitTimeMs = maxRetransmitTimeMs;
-      this.maxRetransmits = maxRetransmits;
-      this.protocol = protocol;
-      this.negotiated = negotiated;
-      this.id = id;
-    }
-  }
-
-  /**
-   * Peer connection parameters.
-   */
-  public static class PeerConnectionParameters {
-    public final boolean videoCallEnabled;
-    public final boolean loopback;
-    public final boolean tracing;
-    public final int videoWidth;
-    public final int videoHeight;
-    public final int videoFps;
-    public final int videoMaxBitrate;
-    public final String videoCodec;
-    public final boolean videoCodecHwAcceleration;
-    public final boolean videoFlexfecEnabled;
-    public final int audioStartBitrate;
-    public final String audioCodec;
-    public final boolean noAudioProcessing;
-    public final boolean aecDump;
-    public final boolean useOpenSLES;
-    public final boolean disableBuiltInAEC;
-    public final boolean disableBuiltInAGC;
-    public final boolean disableBuiltInNS;
-    public final boolean enableLevelControl;
-    public final boolean disableWebRtcAGCAndHPF;
-    private final DataChannelParameters dataChannelParameters;
-
-    public PeerConnectionParameters(boolean videoCallEnabled, boolean loopback, boolean tracing,
-        int videoWidth, int videoHeight, int videoFps, int videoMaxBitrate, String videoCodec,
-        boolean videoCodecHwAcceleration, boolean videoFlexfecEnabled, int audioStartBitrate,
-        String audioCodec, boolean noAudioProcessing, boolean aecDump, boolean useOpenSLES,
-        boolean disableBuiltInAEC, boolean disableBuiltInAGC, boolean disableBuiltInNS,
-        boolean enableLevelControl, boolean disableWebRtcAGCAndHPF) {
-      this(videoCallEnabled, loopback, tracing, videoWidth, videoHeight, videoFps, videoMaxBitrate,
-          videoCodec, videoCodecHwAcceleration, videoFlexfecEnabled, audioStartBitrate, audioCodec,
-          noAudioProcessing, aecDump, useOpenSLES, disableBuiltInAEC, disableBuiltInAGC,
-          disableBuiltInNS, enableLevelControl, disableWebRtcAGCAndHPF, null);
-    }
-
-    public PeerConnectionParameters(boolean videoCallEnabled, boolean loopback, boolean tracing,
-        int videoWidth, int videoHeight, int videoFps, int videoMaxBitrate, String videoCodec,
-        boolean videoCodecHwAcceleration, boolean videoFlexfecEnabled, int audioStartBitrate,
-        String audioCodec, boolean noAudioProcessing, boolean aecDump, boolean useOpenSLES,
-        boolean disableBuiltInAEC, boolean disableBuiltInAGC, boolean disableBuiltInNS,
-        boolean enableLevelControl, boolean disableWebRtcAGCAndHPF,
-        DataChannelParameters dataChannelParameters) {
-      this.videoCallEnabled = videoCallEnabled;
-      this.loopback = loopback;
-      this.tracing = tracing;
-      this.videoWidth = videoWidth;
-      this.videoHeight = videoHeight;
-      this.videoFps = videoFps;
-      this.videoMaxBitrate = videoMaxBitrate;
-      this.videoCodec = videoCodec;
-      this.videoFlexfecEnabled = videoFlexfecEnabled;
-      this.videoCodecHwAcceleration = videoCodecHwAcceleration;
-      this.audioStartBitrate = audioStartBitrate;
-      this.audioCodec = audioCodec;
-      this.noAudioProcessing = noAudioProcessing;
-      this.aecDump = aecDump;
-      this.useOpenSLES = useOpenSLES;
-      this.disableBuiltInAEC = disableBuiltInAEC;
-      this.disableBuiltInAGC = disableBuiltInAGC;
-      this.disableBuiltInNS = disableBuiltInNS;
-      this.enableLevelControl = enableLevelControl;
-      this.disableWebRtcAGCAndHPF = disableWebRtcAGCAndHPF;
-      this.dataChannelParameters = dataChannelParameters;
-    }
-  }
-
-  /**
-   * Peer connection events.
-   */
-  public interface PeerConnectionEvents {
-    /**
-     * Callback fired once local SDP is created and set.
-     */
-    void onLocalDescription(final SessionDescription sdp);
-
-    /**
-     * Callback fired once local Ice candidate is generated.
-     */
-    void onIceCandidate(final IceCandidate candidate);
-
-    /**
-     * Callback fired once local ICE candidates are removed.
-     */
-    void onIceCandidatesRemoved(final IceCandidate[] candidates);
-
-    /**
-     * Callback fired once connection is established (IceConnectionState is
-     * CONNECTED).
-     */
-    void onIceConnected();
-
-    /**
-     * Callback fired once connection is closed (IceConnectionState is
-     * DISCONNECTED).
-     */
-    void onIceDisconnected();
-
-    /**
-     * Callback fired once peer connection is closed.
-     */
-    void onPeerConnectionClosed();
-
-    /**
-     * Callback fired once peer connection statistics is ready.
-     */
-    void onPeerConnectionStatsReady(final StatsReport[] reports);
-
-    /**
-     * Callback fired once peer connection error happened.
-     */
-    void onPeerConnectionError(final String description);
-  }
-
-  public PeerConnectionClient() {
-    rootEglBase = EglBase.create();
-  }
-
-  public void setPeerConnectionFactoryOptions(PeerConnectionFactory.Options options) {
-    this.options = options;
-  }
-
-  public void createPeerConnectionFactory(final Context context,
-      final PeerConnectionParameters peerConnectionParameters, final PeerConnectionEvents events) {
-    this.peerConnectionParameters = peerConnectionParameters;
-    this.events = events;
-    videoCallEnabled = peerConnectionParameters.videoCallEnabled;
-    dataChannelEnabled = peerConnectionParameters.dataChannelParameters != null;
-    // Reset variables to initial states.
-    factory = null;
-    peerConnection = null;
-    preferIsac = false;
-    videoCapturerStopped = false;
-    isError = false;
-    queuedRemoteCandidates = null;
-    localSdp = null; // either offer or answer SDP
-    mediaStream = null;
-    videoCapturer = null;
-    renderVideo = true;
-    localVideoTrack = null;
-    remoteVideoTrack = null;
-    localVideoSender = null;
-    enableAudio = true;
-    localAudioTrack = null;
-    statsTimer = new Timer();
-
-    executor.execute(new Runnable() {
-      @Override
-      public void run() {
-        createPeerConnectionFactoryInternal(context);
-      }
-    });
-  }
-
-  public void createPeerConnection(final VideoSink localRender,
-      final VideoRenderer.Callbacks remoteRender, final VideoCapturer videoCapturer,
-      final SignalingParameters signalingParameters) {
-    createPeerConnection(
-        localRender, Collections.singletonList(remoteRender), videoCapturer, signalingParameters);
-  }
-  public void createPeerConnection(final VideoSink localRender,
-      final List<VideoRenderer.Callbacks> remoteRenders, final VideoCapturer videoCapturer,
-      final SignalingParameters signalingParameters) {
-    if (peerConnectionParameters == null) {
-      Log.e(TAG, "Creating peer connection without initializing factory.");
-      return;
-    }
-    this.localRender = localRender;
-    this.remoteRenders = remoteRenders;
-    this.videoCapturer = videoCapturer;
-    this.signalingParameters = signalingParameters;
-    executor.execute(new Runnable() {
-      @Override
-      public void run() {
-        try {
-          createMediaConstraintsInternal();
-          createPeerConnectionInternal();
-        } catch (Exception e) {
-          reportError("Failed to create peer connection: " + e.getMessage());
-          throw e;
-        }
-      }
-    });
-  }
-
-  public void close() {
-    executor.execute(new Runnable() {
-      @Override
-      public void run() {
-        closeInternal();
-      }
-    });
-  }
-
-  public boolean isVideoCallEnabled() {
-    return videoCallEnabled;
-  }
-
-  private void createPeerConnectionFactoryInternal(Context context) {
-    PeerConnectionFactory.initializeInternalTracer();
-    if (peerConnectionParameters.tracing) {
-      PeerConnectionFactory.startInternalTracingCapture(
-          Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator
-          + "webrtc-trace.txt");
-    }
-    Log.d(TAG,
-        "Create peer connection factory. Use video: " + peerConnectionParameters.videoCallEnabled);
-    isError = false;
-
-    // Initialize field trials.
-    String fieldTrials = "";
-    if (peerConnectionParameters.videoFlexfecEnabled) {
-      fieldTrials += VIDEO_FLEXFEC_FIELDTRIAL;
-      Log.d(TAG, "Enable FlexFEC field trial.");
-    }
-    fieldTrials += VIDEO_VP8_INTEL_HW_ENCODER_FIELDTRIAL;
-    if (peerConnectionParameters.disableWebRtcAGCAndHPF) {
-      fieldTrials += DISABLE_WEBRTC_AGC_FIELDTRIAL;
-      Log.d(TAG, "Disable WebRTC AGC field trial.");
-    }
-    fieldTrials += VIDEO_FRAME_EMIT_FIELDTRIAL;
-
-    // Check preferred video codec.
-    preferredVideoCodec = VIDEO_CODEC_VP8;
-    if (videoCallEnabled && peerConnectionParameters.videoCodec != null) {
-      switch (peerConnectionParameters.videoCodec) {
-        case VIDEO_CODEC_VP8:
-          preferredVideoCodec = VIDEO_CODEC_VP8;
-          break;
-        case VIDEO_CODEC_VP9:
-          preferredVideoCodec = VIDEO_CODEC_VP9;
-          break;
-        case VIDEO_CODEC_H264_BASELINE:
-          preferredVideoCodec = VIDEO_CODEC_H264;
-          break;
-        case VIDEO_CODEC_H264_HIGH:
-          // TODO(magjed): Strip High from SDP when selecting Baseline instead of using field trial.
-          fieldTrials += VIDEO_H264_HIGH_PROFILE_FIELDTRIAL;
-          preferredVideoCodec = VIDEO_CODEC_H264;
-          break;
-        default:
-          preferredVideoCodec = VIDEO_CODEC_VP8;
-      }
-    }
-    Log.d(TAG, "Preferred video codec: " + preferredVideoCodec);
-    PeerConnectionFactory.initializeFieldTrials(fieldTrials);
-    Log.d(TAG, "Field trials: " + fieldTrials);
-
-    // Check if ISAC is used by default.
-    preferIsac = peerConnectionParameters.audioCodec != null
-        && peerConnectionParameters.audioCodec.equals(AUDIO_CODEC_ISAC);
-
-    // Enable/disable OpenSL ES playback.
-    if (!peerConnectionParameters.useOpenSLES) {
-      Log.d(TAG, "Disable OpenSL ES audio even if device supports it");
-      WebRtcAudioManager.setBlacklistDeviceForOpenSLESUsage(true /* enable */);
-    } else {
-      Log.d(TAG, "Allow OpenSL ES audio if device supports it");
-      WebRtcAudioManager.setBlacklistDeviceForOpenSLESUsage(false);
-    }
-
-    if (peerConnectionParameters.disableBuiltInAEC) {
-      Log.d(TAG, "Disable built-in AEC even if device supports it");
-      WebRtcAudioUtils.setWebRtcBasedAcousticEchoCanceler(true);
-    } else {
-      Log.d(TAG, "Enable built-in AEC if device supports it");
-      WebRtcAudioUtils.setWebRtcBasedAcousticEchoCanceler(false);
-    }
-
-    if (peerConnectionParameters.disableBuiltInAGC) {
-      Log.d(TAG, "Disable built-in AGC even if device supports it");
-      WebRtcAudioUtils.setWebRtcBasedAutomaticGainControl(true);
-    } else {
-      Log.d(TAG, "Enable built-in AGC if device supports it");
-      WebRtcAudioUtils.setWebRtcBasedAutomaticGainControl(false);
-    }
-
-    if (peerConnectionParameters.disableBuiltInNS) {
-      Log.d(TAG, "Disable built-in NS even if device supports it");
-      WebRtcAudioUtils.setWebRtcBasedNoiseSuppressor(true);
-    } else {
-      Log.d(TAG, "Enable built-in NS if device supports it");
-      WebRtcAudioUtils.setWebRtcBasedNoiseSuppressor(false);
-    }
-
-    // Set audio record error callbacks.
-    WebRtcAudioRecord.setErrorCallback(new WebRtcAudioRecordErrorCallback() {
-      @Override
-      public void onWebRtcAudioRecordInitError(String errorMessage) {
-        Log.e(TAG, "onWebRtcAudioRecordInitError: " + errorMessage);
-        reportError(errorMessage);
-      }
-
-      @Override
-      public void onWebRtcAudioRecordStartError(
-          AudioRecordStartErrorCode errorCode, String errorMessage) {
-        Log.e(TAG, "onWebRtcAudioRecordStartError: " + errorCode + ". " + errorMessage);
-        reportError(errorMessage);
-      }
-
-      @Override
-      public void onWebRtcAudioRecordError(String errorMessage) {
-        Log.e(TAG, "onWebRtcAudioRecordError: " + errorMessage);
-        reportError(errorMessage);
-      }
-    });
-
-    WebRtcAudioTrack.setErrorCallback(new WebRtcAudioTrackErrorCallback() {
-      @Override
-      public void onWebRtcAudioTrackInitError(String errorMessage) {
-        reportError(errorMessage);
-      }
-
-      @Override
-      public void onWebRtcAudioTrackStartError(String errorMessage) {
-        reportError(errorMessage);
-      }
-
-      @Override
-      public void onWebRtcAudioTrackError(String errorMessage) {
-        reportError(errorMessage);
-      }
-    });
-
-    // Create peer connection factory.
-    PeerConnectionFactory.initializeAndroidGlobals(
-        context, peerConnectionParameters.videoCodecHwAcceleration);
-    if (options != null) {
-      Log.d(TAG, "Factory networkIgnoreMask option: " + options.networkIgnoreMask);
-    }
-    factory = new PeerConnectionFactory(options);
-    Log.d(TAG, "Peer connection factory created.");
-  }
-
-  private void createMediaConstraintsInternal() {
-    // Create peer connection constraints.
-    pcConstraints = new MediaConstraints();
-    // Enable DTLS for normal calls and disable for loopback calls.
-    if (peerConnectionParameters.loopback) {
-      pcConstraints.optional.add(
-          new MediaConstraints.KeyValuePair(DTLS_SRTP_KEY_AGREEMENT_CONSTRAINT, "false"));
-    } else {
-      pcConstraints.optional.add(
-          new MediaConstraints.KeyValuePair(DTLS_SRTP_KEY_AGREEMENT_CONSTRAINT, "true"));
-    }
-
-    // Check if there is a camera on device and disable video call if not.
-    if (videoCapturer == null) {
-      Log.w(TAG, "No camera on device. Switch to audio only call.");
-      videoCallEnabled = false;
-    }
-    // Create video constraints if video call is enabled.
-    if (videoCallEnabled) {
-      videoWidth = peerConnectionParameters.videoWidth;
-      videoHeight = peerConnectionParameters.videoHeight;
-      videoFps = peerConnectionParameters.videoFps;
-
-      // If video resolution is not specified, default to HD.
-      if (videoWidth == 0 || videoHeight == 0) {
-        videoWidth = HD_VIDEO_WIDTH;
-        videoHeight = HD_VIDEO_HEIGHT;
-      }
-
-      // If fps is not specified, default to 30.
-      if (videoFps == 0) {
-        videoFps = 30;
-      }
-      Logging.d(TAG, "Capturing format: " + videoWidth + "x" + videoHeight + "@" + videoFps);
-    }
-
-    // Create audio constraints.
-    audioConstraints = new MediaConstraints();
-    // added for audio performance measurements
-    if (peerConnectionParameters.noAudioProcessing) {
-      Log.d(TAG, "Disabling audio processing");
-      audioConstraints.mandatory.add(
-          new MediaConstraints.KeyValuePair(AUDIO_ECHO_CANCELLATION_CONSTRAINT, "false"));
-      audioConstraints.mandatory.add(
-          new MediaConstraints.KeyValuePair(AUDIO_AUTO_GAIN_CONTROL_CONSTRAINT, "false"));
-      audioConstraints.mandatory.add(
-          new MediaConstraints.KeyValuePair(AUDIO_HIGH_PASS_FILTER_CONSTRAINT, "false"));
-      audioConstraints.mandatory.add(
-          new MediaConstraints.KeyValuePair(AUDIO_NOISE_SUPPRESSION_CONSTRAINT, "false"));
-    }
-    if (peerConnectionParameters.enableLevelControl) {
-      Log.d(TAG, "Enabling level control.");
-      audioConstraints.mandatory.add(
-          new MediaConstraints.KeyValuePair(AUDIO_LEVEL_CONTROL_CONSTRAINT, "true"));
-    }
-    // Create SDP constraints.
-    sdpMediaConstraints = new MediaConstraints();
-    sdpMediaConstraints.mandatory.add(
-        new MediaConstraints.KeyValuePair("OfferToReceiveAudio", "true"));
-    if (videoCallEnabled || peerConnectionParameters.loopback) {
-      sdpMediaConstraints.mandatory.add(
-          new MediaConstraints.KeyValuePair("OfferToReceiveVideo", "true"));
-    } else {
-      sdpMediaConstraints.mandatory.add(
-          new MediaConstraints.KeyValuePair("OfferToReceiveVideo", "false"));
-    }
-  }
-
-  private void createPeerConnectionInternal() {
-    if (factory == null || isError) {
-      Log.e(TAG, "Peerconnection factory is not created");
-      return;
-    }
-    Log.d(TAG, "Create peer connection.");
-
-    Log.d(TAG, "PCConstraints: " + pcConstraints.toString());
-    queuedRemoteCandidates = new LinkedList<IceCandidate>();
-
-    if (videoCallEnabled) {
-      factory.setVideoHwAccelerationOptions(
-          rootEglBase.getEglBaseContext(), rootEglBase.getEglBaseContext());
-    }
-
-    PeerConnection.RTCConfiguration rtcConfig =
-        new PeerConnection.RTCConfiguration(signalingParameters.iceServers);
-    // TCP candidates are only useful when connecting to a server that supports
-    // ICE-TCP.
-    rtcConfig.tcpCandidatePolicy = PeerConnection.TcpCandidatePolicy.DISABLED;
-    rtcConfig.bundlePolicy = PeerConnection.BundlePolicy.MAXBUNDLE;
-    rtcConfig.rtcpMuxPolicy = PeerConnection.RtcpMuxPolicy.REQUIRE;
-    rtcConfig.continualGatheringPolicy = PeerConnection.ContinualGatheringPolicy.GATHER_CONTINUALLY;
-    // Use ECDSA encryption.
-    rtcConfig.keyType = PeerConnection.KeyType.ECDSA;
-
-    peerConnection = factory.createPeerConnection(rtcConfig, pcConstraints, pcObserver);
-
-    if (dataChannelEnabled) {
-      DataChannel.Init init = new DataChannel.Init();
-      init.ordered = peerConnectionParameters.dataChannelParameters.ordered;
-      init.negotiated = peerConnectionParameters.dataChannelParameters.negotiated;
-      init.maxRetransmits = peerConnectionParameters.dataChannelParameters.maxRetransmits;
-      init.maxRetransmitTimeMs = peerConnectionParameters.dataChannelParameters.maxRetransmitTimeMs;
-      init.id = peerConnectionParameters.dataChannelParameters.id;
-      init.protocol = peerConnectionParameters.dataChannelParameters.protocol;
-      dataChannel = peerConnection.createDataChannel("ApprtcDemo data", init);
-    }
-    isInitiator = false;
-
-    // Set default WebRTC tracing and INFO libjingle logging.
-    // NOTE: this _must_ happen while |factory| is alive!
-    Logging.enableTracing("logcat:", EnumSet.of(Logging.TraceLevel.TRACE_DEFAULT));
-    Logging.enableLogToDebugOutput(Logging.Severity.LS_INFO);
-
-    mediaStream = factory.createLocalMediaStream("ARDAMS");
-    if (videoCallEnabled) {
-      mediaStream.addTrack(createVideoTrack(videoCapturer));
-    }
-
-    mediaStream.addTrack(createAudioTrack());
-    peerConnection.addStream(mediaStream);
-    if (videoCallEnabled) {
-      findVideoSender();
-    }
-
-    if (peerConnectionParameters.aecDump) {
-      try {
-        aecDumpFileDescriptor =
-            ParcelFileDescriptor.open(new File(Environment.getExternalStorageDirectory().getPath()
-                                          + File.separator + "Download/audio.aecdump"),
-                ParcelFileDescriptor.MODE_READ_WRITE | ParcelFileDescriptor.MODE_CREATE
-                    | ParcelFileDescriptor.MODE_TRUNCATE);
-        factory.startAecDump(aecDumpFileDescriptor.getFd(), -1);
-      } catch (IOException e) {
-        Log.e(TAG, "Can not open aecdump file", e);
-      }
-    }
-
-    Log.d(TAG, "Peer connection created.");
-  }
-
-  private void closeInternal() {
-    if (factory != null && peerConnectionParameters.aecDump) {
-      factory.stopAecDump();
-    }
-    Log.d(TAG, "Closing peer connection.");
-    statsTimer.cancel();
-    if (dataChannel != null) {
-      dataChannel.dispose();
-      dataChannel = null;
-    }
-    if (peerConnection != null) {
-      peerConnection.dispose();
-      peerConnection = null;
-    }
-    Log.d(TAG, "Closing audio source.");
-    if (audioSource != null) {
-      audioSource.dispose();
-      audioSource = null;
-    }
-    Log.d(TAG, "Stopping capture.");
-    if (videoCapturer != null) {
-      try {
-        videoCapturer.stopCapture();
-      } catch (InterruptedException e) {
-        throw new RuntimeException(e);
-      }
-      videoCapturerStopped = true;
-      videoCapturer.dispose();
-      videoCapturer = null;
-    }
-    Log.d(TAG, "Closing video source.");
-    if (videoSource != null) {
-      videoSource.dispose();
-      videoSource = null;
-    }
-    localRender = null;
-    remoteRenders = null;
-    Log.d(TAG, "Closing peer connection factory.");
-    if (factory != null) {
-      factory.dispose();
-      factory = null;
-    }
-    options = null;
-    rootEglBase.release();
-    Log.d(TAG, "Closing peer connection done.");
-    events.onPeerConnectionClosed();
-    PeerConnectionFactory.stopInternalTracingCapture();
-    PeerConnectionFactory.shutdownInternalTracer();
-    events = null;
-  }
-
-  public boolean isHDVideo() {
-    if (!videoCallEnabled) {
-      return false;
-    }
-
-    return videoWidth * videoHeight >= 1280 * 720;
-  }
-
-  public EglBase.Context getRenderContext() {
-    return rootEglBase.getEglBaseContext();
-  }
-
-  private void getStats() {
-    if (peerConnection == null || isError) {
-      return;
-    }
-    boolean success = peerConnection.getStats(new StatsObserver() {
-      @Override
-      public void onComplete(final StatsReport[] reports) {
-        events.onPeerConnectionStatsReady(reports);
-      }
-    }, null);
-    if (!success) {
-      Log.e(TAG, "getStats() returns false!");
-    }
-  }
-
-  public void enableStatsEvents(boolean enable, int periodMs) {
-    if (enable) {
-      try {
-        statsTimer.schedule(new TimerTask() {
-          @Override
-          public void run() {
-            executor.execute(new Runnable() {
-              @Override
-              public void run() {
-                getStats();
-              }
-            });
-          }
-        }, 0, periodMs);
-      } catch (Exception e) {
-        Log.e(TAG, "Can not schedule statistics timer", e);
-      }
-    } else {
-      statsTimer.cancel();
-    }
-  }
-
-  public void setAudioEnabled(final boolean enable) {
-    executor.execute(new Runnable() {
-      @Override
-      public void run() {
-        enableAudio = enable;
-        if (localAudioTrack != null) {
-          localAudioTrack.setEnabled(enableAudio);
-        }
-      }
-    });
-  }
-
-  public void setVideoEnabled(final boolean enable) {
-    executor.execute(new Runnable() {
-      @Override
-      public void run() {
-        renderVideo = enable;
-        if (localVideoTrack != null) {
-          localVideoTrack.setEnabled(renderVideo);
-        }
-        if (remoteVideoTrack != null) {
-          remoteVideoTrack.setEnabled(renderVideo);
-        }
-      }
-    });
-  }
-
-  public void createOffer() {
-    executor.execute(new Runnable() {
-      @Override
-      public void run() {
-        if (peerConnection != null && !isError) {
-          Log.d(TAG, "PC Create OFFER");
-          isInitiator = true;
-          peerConnection.createOffer(sdpObserver, sdpMediaConstraints);
-        }
-      }
-    });
-  }
-
-  public void createAnswer() {
-    executor.execute(new Runnable() {
-      @Override
-      public void run() {
-        if (peerConnection != null && !isError) {
-          Log.d(TAG, "PC create ANSWER");
-          isInitiator = false;
-          peerConnection.createAnswer(sdpObserver, sdpMediaConstraints);
-        }
-      }
-    });
-  }
-
-  public void addRemoteIceCandidate(final IceCandidate candidate) {
-    executor.execute(new Runnable() {
-      @Override
-      public void run() {
-        if (peerConnection != null && !isError) {
-          if (queuedRemoteCandidates != null) {
-            queuedRemoteCandidates.add(candidate);
-          } else {
-            peerConnection.addIceCandidate(candidate);
-          }
-        }
-      }
-    });
-  }
-
-  public void removeRemoteIceCandidates(final IceCandidate[] candidates) {
-    executor.execute(new Runnable() {
-      @Override
-      public void run() {
-        if (peerConnection == null || isError) {
-          return;
-        }
-        // Drain the queued remote candidates if there is any so that
-        // they are processed in the proper order.
-        drainCandidates();
-        peerConnection.removeIceCandidates(candidates);
-      }
-    });
-  }
-
-  public void setRemoteDescription(final SessionDescription sdp) {
-    executor.execute(new Runnable() {
-      @Override
-      public void run() {
-        if (peerConnection == null || isError) {
-          return;
-        }
-        String sdpDescription = sdp.description;
-        if (preferIsac) {
-          sdpDescription = preferCodec(sdpDescription, AUDIO_CODEC_ISAC, true);
-        }
-        if (videoCallEnabled) {
-          sdpDescription = preferCodec(sdpDescription, preferredVideoCodec, false);
-        }
-        if (peerConnectionParameters.audioStartBitrate > 0) {
-          sdpDescription = setStartBitrate(
-              AUDIO_CODEC_OPUS, false, sdpDescription, peerConnectionParameters.audioStartBitrate);
-        }
-        Log.d(TAG, "Set remote SDP.");
-        SessionDescription sdpRemote = new SessionDescription(sdp.type, sdpDescription);
-        peerConnection.setRemoteDescription(sdpObserver, sdpRemote);
-      }
-    });
-  }
-
-  public void stopVideoSource() {
-    executor.execute(new Runnable() {
-      @Override
-      public void run() {
-        if (videoCapturer != null && !videoCapturerStopped) {
-          Log.d(TAG, "Stop video source.");
-          try {
-            videoCapturer.stopCapture();
-          } catch (InterruptedException e) {
-          }
-          videoCapturerStopped = true;
-        }
-      }
-    });
-  }
-
-  public void startVideoSource() {
-    executor.execute(new Runnable() {
-      @Override
-      public void run() {
-        if (videoCapturer != null && videoCapturerStopped) {
-          Log.d(TAG, "Restart video source.");
-          videoCapturer.startCapture(videoWidth, videoHeight, videoFps);
-          videoCapturerStopped = false;
-        }
-      }
-    });
-  }
-
-  public void setVideoMaxBitrate(final Integer maxBitrateKbps) {
-    executor.execute(new Runnable() {
-      @Override
-      public void run() {
-        if (peerConnection == null || localVideoSender == null || isError) {
-          return;
-        }
-        Log.d(TAG, "Requested max video bitrate: " + maxBitrateKbps);
-        if (localVideoSender == null) {
-          Log.w(TAG, "Sender is not ready.");
-          return;
-        }
-
-        RtpParameters parameters = localVideoSender.getParameters();
-        if (parameters.encodings.size() == 0) {
-          Log.w(TAG, "RtpParameters are not ready.");
-          return;
-        }
-
-        for (RtpParameters.Encoding encoding : parameters.encodings) {
-          // Null value means no limit.
-          encoding.maxBitrateBps = maxBitrateKbps == null ? null : maxBitrateKbps * BPS_IN_KBPS;
-        }
-        if (!localVideoSender.setParameters(parameters)) {
-          Log.e(TAG, "RtpSender.setParameters failed.");
-        }
-        Log.d(TAG, "Configured max video bitrate to: " + maxBitrateKbps);
-      }
-    });
-  }
-
-  private void reportError(final String errorMessage) {
-    Log.e(TAG, "Peerconnection error: " + errorMessage);
-    executor.execute(new Runnable() {
-      @Override
-      public void run() {
-        if (!isError) {
-          events.onPeerConnectionError(errorMessage);
-          isError = true;
-        }
-      }
-    });
-  }
-
-  private AudioTrack createAudioTrack() {
-    audioSource = factory.createAudioSource(audioConstraints);
-    localAudioTrack = factory.createAudioTrack(AUDIO_TRACK_ID, audioSource);
-    localAudioTrack.setEnabled(enableAudio);
-    return localAudioTrack;
-  }
-
-  private VideoTrack createVideoTrack(VideoCapturer capturer) {
-    videoSource = factory.createVideoSource(capturer);
-    capturer.startCapture(videoWidth, videoHeight, videoFps);
-
-    localVideoTrack = factory.createVideoTrack(VIDEO_TRACK_ID, videoSource);
-    localVideoTrack.setEnabled(renderVideo);
-    localVideoTrack.addSink(localRender);
-    return localVideoTrack;
-  }
-
-  private void findVideoSender() {
-    for (RtpSender sender : peerConnection.getSenders()) {
-      if (sender.track() != null) {
-        String trackType = sender.track().kind();
-        if (trackType.equals(VIDEO_TRACK_TYPE)) {
-          Log.d(TAG, "Found video sender.");
-          localVideoSender = sender;
-        }
-      }
-    }
-  }
-
-  private static String setStartBitrate(
-      String codec, boolean isVideoCodec, String sdpDescription, int bitrateKbps) {
-    String[] lines = sdpDescription.split("\r\n");
-    int rtpmapLineIndex = -1;
-    boolean sdpFormatUpdated = false;
-    String codecRtpMap = null;
-    // Search for codec rtpmap in format
-    // a=rtpmap:<payload type> <encoding name>/<clock rate> [/<encoding parameters>]
-    String regex = "^a=rtpmap:(\\d+) " + codec + "(/\\d+)+[\r]?$";
-    Pattern codecPattern = Pattern.compile(regex);
-    for (int i = 0; i < lines.length; i++) {
-      Matcher codecMatcher = codecPattern.matcher(lines[i]);
-      if (codecMatcher.matches()) {
-        codecRtpMap = codecMatcher.group(1);
-        rtpmapLineIndex = i;
-        break;
-      }
-    }
-    if (codecRtpMap == null) {
-      Log.w(TAG, "No rtpmap for " + codec + " codec");
-      return sdpDescription;
-    }
-    Log.d(TAG, "Found " + codec + " rtpmap " + codecRtpMap + " at " + lines[rtpmapLineIndex]);
-
-    // Check if a=fmtp string already exist in remote SDP for this codec and
-    // update it with new bitrate parameter.
-    regex = "^a=fmtp:" + codecRtpMap + " \\w+=\\d+.*[\r]?$";
-    codecPattern = Pattern.compile(regex);
-    for (int i = 0; i < lines.length; i++) {
-      Matcher codecMatcher = codecPattern.matcher(lines[i]);
-      if (codecMatcher.matches()) {
-        Log.d(TAG, "Found " + codec + " " + lines[i]);
-        if (isVideoCodec) {
-          lines[i] += "; " + VIDEO_CODEC_PARAM_START_BITRATE + "=" + bitrateKbps;
-        } else {
-          lines[i] += "; " + AUDIO_CODEC_PARAM_BITRATE + "=" + (bitrateKbps * 1000);
-        }
-        Log.d(TAG, "Update remote SDP line: " + lines[i]);
-        sdpFormatUpdated = true;
-        break;
-      }
-    }
-
-    StringBuilder newSdpDescription = new StringBuilder();
-    for (int i = 0; i < lines.length; i++) {
-      newSdpDescription.append(lines[i]).append("\r\n");
-      // Append new a=fmtp line if no such line exist for a codec.
-      if (!sdpFormatUpdated && i == rtpmapLineIndex) {
-        String bitrateSet;
-        if (isVideoCodec) {
-          bitrateSet =
-              "a=fmtp:" + codecRtpMap + " " + VIDEO_CODEC_PARAM_START_BITRATE + "=" + bitrateKbps;
-        } else {
-          bitrateSet = "a=fmtp:" + codecRtpMap + " " + AUDIO_CODEC_PARAM_BITRATE + "="
-              + (bitrateKbps * 1000);
-        }
-        Log.d(TAG, "Add remote SDP line: " + bitrateSet);
-        newSdpDescription.append(bitrateSet).append("\r\n");
-      }
-    }
-    return newSdpDescription.toString();
-  }
-
-  /** Returns the line number containing "m=audio|video", or -1 if no such line exists. */
-  private static int findMediaDescriptionLine(boolean isAudio, String[] sdpLines) {
-    final String mediaDescription = isAudio ? "m=audio " : "m=video ";
-    for (int i = 0; i < sdpLines.length; ++i) {
-      if (sdpLines[i].startsWith(mediaDescription)) {
-        return i;
-      }
-    }
-    return -1;
-  }
-
-  private static String joinString(
-      Iterable<? extends CharSequence> s, String delimiter, boolean delimiterAtEnd) {
-    Iterator<? extends CharSequence> iter = s.iterator();
-    if (!iter.hasNext()) {
-      return "";
-    }
-    StringBuilder buffer = new StringBuilder(iter.next());
-    while (iter.hasNext()) {
-      buffer.append(delimiter).append(iter.next());
-    }
-    if (delimiterAtEnd) {
-      buffer.append(delimiter);
-    }
-    return buffer.toString();
-  }
-
-  private static String movePayloadTypesToFront(List<String> preferredPayloadTypes, String mLine) {
-    // The format of the media description line should be: m=<media> <port> <proto> <fmt> ...
-    final List<String> origLineParts = Arrays.asList(mLine.split(" "));
-    if (origLineParts.size() <= 3) {
-      Log.e(TAG, "Wrong SDP media description format: " + mLine);
-      return null;
-    }
-    final List<String> header = origLineParts.subList(0, 3);
-    final List<String> unpreferredPayloadTypes =
-        new ArrayList<String>(origLineParts.subList(3, origLineParts.size()));
-    unpreferredPayloadTypes.removeAll(preferredPayloadTypes);
-    // Reconstruct the line with |preferredPayloadTypes| moved to the beginning of the payload
-    // types.
-    final List<String> newLineParts = new ArrayList<String>();
-    newLineParts.addAll(header);
-    newLineParts.addAll(preferredPayloadTypes);
-    newLineParts.addAll(unpreferredPayloadTypes);
-    return joinString(newLineParts, " ", false /* delimiterAtEnd */);
-  }
-
-  private static String preferCodec(String sdpDescription, String codec, boolean isAudio) {
-    final String[] lines = sdpDescription.split("\r\n");
-    final int mLineIndex = findMediaDescriptionLine(isAudio, lines);
-    if (mLineIndex == -1) {
-      Log.w(TAG, "No mediaDescription line, so can't prefer " + codec);
-      return sdpDescription;
-    }
-    // A list with all the payload types with name |codec|. The payload types are integers in the
-    // range 96-127, but they are stored as strings here.
-    final List<String> codecPayloadTypes = new ArrayList<String>();
-    // a=rtpmap:<payload type> <encoding name>/<clock rate> [/<encoding parameters>]
-    final Pattern codecPattern = Pattern.compile("^a=rtpmap:(\\d+) " + codec + "(/\\d+)+[\r]?$");
-    for (int i = 0; i < lines.length; ++i) {
-      Matcher codecMatcher = codecPattern.matcher(lines[i]);
-      if (codecMatcher.matches()) {
-        codecPayloadTypes.add(codecMatcher.group(1));
-      }
-    }
-    if (codecPayloadTypes.isEmpty()) {
-      Log.w(TAG, "No payload types with name " + codec);
-      return sdpDescription;
-    }
-
-    final String newMLine = movePayloadTypesToFront(codecPayloadTypes, lines[mLineIndex]);
-    if (newMLine == null) {
-      return sdpDescription;
-    }
-    Log.d(TAG, "Change media description from: " + lines[mLineIndex] + " to " + newMLine);
-    lines[mLineIndex] = newMLine;
-    return joinString(Arrays.asList(lines), "\r\n", true /* delimiterAtEnd */);
-  }
-
-  private void drainCandidates() {
-    if (queuedRemoteCandidates != null) {
-      Log.d(TAG, "Add " + queuedRemoteCandidates.size() + " remote candidates");
-      for (IceCandidate candidate : queuedRemoteCandidates) {
-        peerConnection.addIceCandidate(candidate);
-      }
-      queuedRemoteCandidates = null;
-    }
-  }
-
-  private void switchCameraInternal() {
-    if (videoCapturer instanceof CameraVideoCapturer) {
-      if (!videoCallEnabled || isError || videoCapturer == null) {
-        Log.e(TAG, "Failed to switch camera. Video: " + videoCallEnabled + ". Error : " + isError);
-        return; // No video is sent or only one camera is available or error happened.
-      }
-      Log.d(TAG, "Switch camera");
-      CameraVideoCapturer cameraVideoCapturer = (CameraVideoCapturer) videoCapturer;
-      cameraVideoCapturer.switchCamera(null);
-    } else {
-      Log.d(TAG, "Will not switch camera, video caputurer is not a camera");
-    }
-  }
-
-  public void switchCamera() {
-    executor.execute(new Runnable() {
-      @Override
-      public void run() {
-        switchCameraInternal();
-      }
-    });
-  }
-
-  public void changeCaptureFormat(final int width, final int height, final int framerate) {
-    executor.execute(new Runnable() {
-      @Override
-      public void run() {
-        changeCaptureFormatInternal(width, height, framerate);
-      }
-    });
-  }
-
-  private void changeCaptureFormatInternal(int width, int height, int framerate) {
-    if (!videoCallEnabled || isError || videoCapturer == null) {
-      Log.e(TAG,
-          "Failed to change capture format. Video: " + videoCallEnabled + ". Error : " + isError);
-      return;
-    }
-    Log.d(TAG, "changeCaptureFormat: " + width + "x" + height + "@" + framerate);
-    videoSource.adaptOutputFormat(width, height, framerate);
-  }
-
-  // Implementation detail: observe ICE & stream changes and react accordingly.
-  private class PCObserver implements PeerConnection.Observer {
-    @Override
-    public void onIceCandidate(final IceCandidate candidate) {
-      executor.execute(new Runnable() {
-        @Override
-        public void run() {
-          events.onIceCandidate(candidate);
-        }
-      });
-    }
-
-    @Override
-    public void onIceCandidatesRemoved(final IceCandidate[] candidates) {
-      executor.execute(new Runnable() {
-        @Override
-        public void run() {
-          events.onIceCandidatesRemoved(candidates);
-        }
-      });
-    }
-
-    @Override
-    public void onSignalingChange(PeerConnection.SignalingState newState) {
-      Log.d(TAG, "SignalingState: " + newState);
-    }
-
-    @Override
-    public void onIceConnectionChange(final PeerConnection.IceConnectionState newState) {
-      executor.execute(new Runnable() {
-        @Override
-        public void run() {
-          Log.d(TAG, "IceConnectionState: " + newState);
-          if (newState == IceConnectionState.CONNECTED) {
-            events.onIceConnected();
-          } else if (newState == IceConnectionState.DISCONNECTED) {
-            events.onIceDisconnected();
-          } else if (newState == IceConnectionState.FAILED) {
-            reportError("ICE connection failed.");
-          }
-        }
-      });
-    }
-
-    @Override
-    public void onIceGatheringChange(PeerConnection.IceGatheringState newState) {
-      Log.d(TAG, "IceGatheringState: " + newState);
-    }
-
-    @Override
-    public void onIceConnectionReceivingChange(boolean receiving) {
-      Log.d(TAG, "IceConnectionReceiving changed to " + receiving);
-    }
-
-    @Override
-    public void onAddStream(final MediaStream stream) {
-      executor.execute(new Runnable() {
-        @Override
-        public void run() {
-          if (peerConnection == null || isError) {
-            return;
-          }
-          if (stream.audioTracks.size() > 1 || stream.videoTracks.size() > 1) {
-            reportError("Weird-looking stream: " + stream);
-            return;
-          }
-          if (stream.videoTracks.size() == 1) {
-            remoteVideoTrack = stream.videoTracks.get(0);
-            remoteVideoTrack.setEnabled(renderVideo);
-            for (VideoRenderer.Callbacks remoteRender : remoteRenders) {
-              remoteVideoTrack.addRenderer(new VideoRenderer(remoteRender));
-            }
-          }
-        }
-      });
-    }
-
-    @Override
-    public void onRemoveStream(final MediaStream stream) {
-      executor.execute(new Runnable() {
-        @Override
-        public void run() {
-          remoteVideoTrack = null;
-        }
-      });
-    }
-
-    @Override
-    public void onDataChannel(final DataChannel dc) {
-      Log.d(TAG, "New Data channel " + dc.label());
-
-      if (!dataChannelEnabled)
-        return;
-
-      dc.registerObserver(new DataChannel.Observer() {
-        public void onBufferedAmountChange(long previousAmount) {
-          Log.d(TAG, "Data channel buffered amount changed: " + dc.label() + ": " + dc.state());
-        }
-
-        @Override
-        public void onStateChange() {
-          Log.d(TAG, "Data channel state changed: " + dc.label() + ": " + dc.state());
-        }
-
-        @Override
-        public void onMessage(final DataChannel.Buffer buffer) {
-          if (buffer.binary) {
-            Log.d(TAG, "Received binary msg over " + dc);
-            return;
-          }
-          ByteBuffer data = buffer.data;
-          final byte[] bytes = new byte[data.capacity()];
-          data.get(bytes);
-          String strData = new String(bytes);
-          Log.d(TAG, "Got msg: " + strData + " over " + dc);
-        }
-      });
-    }
-
-    @Override
-    public void onRenegotiationNeeded() {
-      // No need to do anything; AppRTC follows a pre-agreed-upon
-      // signaling/negotiation protocol.
-    }
-
-    @Override
-    public void onAddTrack(final RtpReceiver receiver, final MediaStream[] mediaStreams) {}
-  }
-
-  // Implementation detail: handle offer creation/signaling and answer setting,
-  // as well as adding remote ICE candidates once the answer SDP is set.
-  private class SDPObserver implements SdpObserver {
-    @Override
-    public void onCreateSuccess(final SessionDescription origSdp) {
-      if (localSdp != null) {
-        reportError("Multiple SDP create.");
-        return;
-      }
-      String sdpDescription = origSdp.description;
-      if (preferIsac) {
-        sdpDescription = preferCodec(sdpDescription, AUDIO_CODEC_ISAC, true);
-      }
-      if (videoCallEnabled) {
-        sdpDescription = preferCodec(sdpDescription, preferredVideoCodec, false);
-      }
-      final SessionDescription sdp = new SessionDescription(origSdp.type, sdpDescription);
-      localSdp = sdp;
-      executor.execute(new Runnable() {
-        @Override
-        public void run() {
-          if (peerConnection != null && !isError) {
-            Log.d(TAG, "Set local SDP from " + sdp.type);
-            peerConnection.setLocalDescription(sdpObserver, sdp);
-          }
-        }
-      });
-    }
-
-    @Override
-    public void onSetSuccess() {
-      executor.execute(new Runnable() {
-        @Override
-        public void run() {
-          if (peerConnection == null || isError) {
-            return;
-          }
-          if (isInitiator) {
-            // For offering peer connection we first create offer and set
-            // local SDP, then after receiving answer set remote SDP.
-            if (peerConnection.getRemoteDescription() == null) {
-              // We've just set our local SDP so time to send it.
-              Log.d(TAG, "Local SDP set succesfully");
-              events.onLocalDescription(localSdp);
-            } else {
-              // We've just set remote description, so drain remote
-              // and send local ICE candidates.
-              Log.d(TAG, "Remote SDP set succesfully");
-              drainCandidates();
-            }
-          } else {
-            // For answering peer connection we set remote SDP and then
-            // create answer and set local SDP.
-            if (peerConnection.getLocalDescription() != null) {
-              // We've just set our local SDP so time to send it, drain
-              // remote and send local ICE candidates.
-              Log.d(TAG, "Local SDP set succesfully");
-              events.onLocalDescription(localSdp);
-              drainCandidates();
-            } else {
-              // We've just set remote SDP - do nothing for now -
-              // answer will be created soon.
-              Log.d(TAG, "Remote SDP set succesfully");
-            }
-          }
-        }
-      });
-    }
-
-    @Override
-    public void onCreateFailure(final String error) {
-      reportError("createSDP error: " + error);
-    }
-
-    @Override
-    public void onSetFailure(final String error) {
-      reportError("setSDP error: " + error);
-    }
-  }
-}
diff --git a/examples/androidapp/src/org/appspot/apprtc/RoomParametersFetcher.java b/examples/androidapp/src/org/appspot/apprtc/RoomParametersFetcher.java
deleted file mode 100644
index 1556a69..0000000
--- a/examples/androidapp/src/org/appspot/apprtc/RoomParametersFetcher.java
+++ /dev/null
@@ -1,226 +0,0 @@
-/*
- *  Copyright 2014 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.
- */
-
-package org.appspot.apprtc;
-
-import org.appspot.apprtc.AppRTCClient.SignalingParameters;
-import org.appspot.apprtc.util.AsyncHttpURLConnection;
-import org.appspot.apprtc.util.AsyncHttpURLConnection.AsyncHttpEvents;
-
-import android.util.Log;
-
-import org.json.JSONArray;
-import org.json.JSONException;
-import org.json.JSONObject;
-import org.webrtc.IceCandidate;
-import org.webrtc.PeerConnection;
-import org.webrtc.SessionDescription;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.HttpURLConnection;
-import java.net.URL;
-import java.util.LinkedList;
-import java.util.Scanner;
-
-/**
- * AsyncTask that converts an AppRTC room URL into the set of signaling
- * parameters to use with that room.
- */
-public class RoomParametersFetcher {
-  private static final String TAG = "RoomRTCClient";
-  private static final int TURN_HTTP_TIMEOUT_MS = 5000;
-  private final RoomParametersFetcherEvents events;
-  private final String roomUrl;
-  private final String roomMessage;
-  private AsyncHttpURLConnection httpConnection;
-
-  /**
-   * Room parameters fetcher callbacks.
-   */
-  public interface RoomParametersFetcherEvents {
-    /**
-     * Callback fired once the room's signaling parameters
-     * SignalingParameters are extracted.
-     */
-    void onSignalingParametersReady(final SignalingParameters params);
-
-    /**
-     * Callback for room parameters extraction error.
-     */
-    void onSignalingParametersError(final String description);
-  }
-
-  public RoomParametersFetcher(
-      String roomUrl, String roomMessage, final RoomParametersFetcherEvents events) {
-    this.roomUrl = roomUrl;
-    this.roomMessage = roomMessage;
-    this.events = events;
-  }
-
-  public void makeRequest() {
-    Log.d(TAG, "Connecting to room: " + roomUrl);
-    httpConnection =
-        new AsyncHttpURLConnection("POST", roomUrl, roomMessage, new AsyncHttpEvents() {
-          @Override
-          public void onHttpError(String errorMessage) {
-            Log.e(TAG, "Room connection error: " + errorMessage);
-            events.onSignalingParametersError(errorMessage);
-          }
-
-          @Override
-          public void onHttpComplete(String response) {
-            roomHttpResponseParse(response);
-          }
-        });
-    httpConnection.send();
-  }
-
-  private void roomHttpResponseParse(String response) {
-    Log.d(TAG, "Room response: " + response);
-    try {
-      LinkedList<IceCandidate> iceCandidates = null;
-      SessionDescription offerSdp = null;
-      JSONObject roomJson = new JSONObject(response);
-
-      String result = roomJson.getString("result");
-      if (!result.equals("SUCCESS")) {
-        events.onSignalingParametersError("Room response error: " + result);
-        return;
-      }
-      response = roomJson.getString("params");
-      roomJson = new JSONObject(response);
-      String roomId = roomJson.getString("room_id");
-      String clientId = roomJson.getString("client_id");
-      String wssUrl = roomJson.getString("wss_url");
-      String wssPostUrl = roomJson.getString("wss_post_url");
-      boolean initiator = (roomJson.getBoolean("is_initiator"));
-      if (!initiator) {
-        iceCandidates = new LinkedList<IceCandidate>();
-        String messagesString = roomJson.getString("messages");
-        JSONArray messages = new JSONArray(messagesString);
-        for (int i = 0; i < messages.length(); ++i) {
-          String messageString = messages.getString(i);
-          JSONObject message = new JSONObject(messageString);
-          String messageType = message.getString("type");
-          Log.d(TAG, "GAE->C #" + i + " : " + messageString);
-          if (messageType.equals("offer")) {
-            offerSdp = new SessionDescription(
-                SessionDescription.Type.fromCanonicalForm(messageType), message.getString("sdp"));
-          } else if (messageType.equals("candidate")) {
-            IceCandidate candidate = new IceCandidate(
-                message.getString("id"), message.getInt("label"), message.getString("candidate"));
-            iceCandidates.add(candidate);
-          } else {
-            Log.e(TAG, "Unknown message: " + messageString);
-          }
-        }
-      }
-      Log.d(TAG, "RoomId: " + roomId + ". ClientId: " + clientId);
-      Log.d(TAG, "Initiator: " + initiator);
-      Log.d(TAG, "WSS url: " + wssUrl);
-      Log.d(TAG, "WSS POST url: " + wssPostUrl);
-
-      LinkedList<PeerConnection.IceServer> iceServers =
-          iceServersFromPCConfigJSON(roomJson.getString("pc_config"));
-      boolean isTurnPresent = false;
-      for (PeerConnection.IceServer server : iceServers) {
-        Log.d(TAG, "IceServer: " + server);
-        if (server.uri.startsWith("turn:")) {
-          isTurnPresent = true;
-          break;
-        }
-      }
-      // Request TURN servers.
-      if (!isTurnPresent && !roomJson.optString("ice_server_url").isEmpty()) {
-        LinkedList<PeerConnection.IceServer> turnServers =
-            requestTurnServers(roomJson.getString("ice_server_url"));
-        for (PeerConnection.IceServer turnServer : turnServers) {
-          Log.d(TAG, "TurnServer: " + turnServer);
-          iceServers.add(turnServer);
-        }
-      }
-
-      SignalingParameters params = new SignalingParameters(
-          iceServers, initiator, clientId, wssUrl, wssPostUrl, offerSdp, iceCandidates);
-      events.onSignalingParametersReady(params);
-    } catch (JSONException e) {
-      events.onSignalingParametersError("Room JSON parsing error: " + e.toString());
-    } catch (IOException e) {
-      events.onSignalingParametersError("Room IO error: " + e.toString());
-    }
-  }
-
-  // Requests & returns a TURN ICE Server based on a request URL.  Must be run
-  // off the main thread!
-  private LinkedList<PeerConnection.IceServer> requestTurnServers(String url)
-      throws IOException, JSONException {
-    LinkedList<PeerConnection.IceServer> turnServers = new LinkedList<PeerConnection.IceServer>();
-    Log.d(TAG, "Request TURN from: " + url);
-    HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
-    connection.setDoOutput(true);
-    connection.setRequestProperty("REFERER", "https://appr.tc");
-    connection.setConnectTimeout(TURN_HTTP_TIMEOUT_MS);
-    connection.setReadTimeout(TURN_HTTP_TIMEOUT_MS);
-    int responseCode = connection.getResponseCode();
-    if (responseCode != 200) {
-      throw new IOException("Non-200 response when requesting TURN server from " + url + " : "
-          + connection.getHeaderField(null));
-    }
-    InputStream responseStream = connection.getInputStream();
-    String response = drainStream(responseStream);
-    connection.disconnect();
-    Log.d(TAG, "TURN response: " + response);
-    JSONObject responseJSON = new JSONObject(response);
-    JSONArray iceServers = responseJSON.getJSONArray("iceServers");
-    for (int i = 0; i < iceServers.length(); ++i) {
-      JSONObject server = iceServers.getJSONObject(i);
-      JSONArray turnUrls = server.getJSONArray("urls");
-      String username = server.has("username") ? server.getString("username") : "";
-      String credential = server.has("credential") ? server.getString("credential") : "";
-      for (int j = 0; j < turnUrls.length(); j++) {
-        String turnUrl = turnUrls.getString(j);
-        PeerConnection.IceServer turnServer =
-            PeerConnection.IceServer.builder(turnUrl)
-              .setUsername(username)
-              .setPassword(credential)
-              .createIceServer();
-        turnServers.add(turnServer);
-      }
-    }
-    return turnServers;
-  }
-
-  // Return the list of ICE servers described by a WebRTCPeerConnection
-  // configuration string.
-  private LinkedList<PeerConnection.IceServer> iceServersFromPCConfigJSON(String pcConfig)
-      throws JSONException {
-    JSONObject json = new JSONObject(pcConfig);
-    JSONArray servers = json.getJSONArray("iceServers");
-    LinkedList<PeerConnection.IceServer> ret = new LinkedList<PeerConnection.IceServer>();
-    for (int i = 0; i < servers.length(); ++i) {
-      JSONObject server = servers.getJSONObject(i);
-      String url = server.getString("urls");
-      String credential = server.has("credential") ? server.getString("credential") : "";
-        PeerConnection.IceServer turnServer =
-            PeerConnection.IceServer.builder(url)
-              .setPassword(credential)
-              .createIceServer();
-      ret.add(turnServer);
-    }
-    return ret;
-  }
-
-  // Return the contents of an InputStream as a String.
-  private static String drainStream(InputStream in) {
-    Scanner s = new Scanner(in).useDelimiter("\\A");
-    return s.hasNext() ? s.next() : "";
-  }
-}
diff --git a/examples/androidapp/src/org/appspot/apprtc/SettingsActivity.java b/examples/androidapp/src/org/appspot/apprtc/SettingsActivity.java
deleted file mode 100644
index 43b8a0a..0000000
--- a/examples/androidapp/src/org/appspot/apprtc/SettingsActivity.java
+++ /dev/null
@@ -1,319 +0,0 @@
-/*
- *  Copyright 2014 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.
- */
-
-package org.appspot.apprtc;
-
-import android.app.Activity;
-import android.content.SharedPreferences;
-import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
-import android.os.Bundle;
-import android.preference.ListPreference;
-import android.preference.Preference;
-import org.webrtc.Camera2Enumerator;
-import org.webrtc.voiceengine.WebRtcAudioUtils;
-
-/**
- * Settings activity for AppRTC.
- */
-public class SettingsActivity extends Activity implements OnSharedPreferenceChangeListener {
-  private SettingsFragment settingsFragment;
-  private String keyprefVideoCall;
-  private String keyprefScreencapture;
-  private String keyprefCamera2;
-  private String keyprefResolution;
-  private String keyprefFps;
-  private String keyprefCaptureQualitySlider;
-  private String keyprefMaxVideoBitrateType;
-  private String keyprefMaxVideoBitrateValue;
-  private String keyPrefVideoCodec;
-  private String keyprefHwCodec;
-  private String keyprefCaptureToTexture;
-  private String keyprefFlexfec;
-
-  private String keyprefStartAudioBitrateType;
-  private String keyprefStartAudioBitrateValue;
-  private String keyPrefAudioCodec;
-  private String keyprefNoAudioProcessing;
-  private String keyprefAecDump;
-  private String keyprefOpenSLES;
-  private String keyprefDisableBuiltInAEC;
-  private String keyprefDisableBuiltInAGC;
-  private String keyprefDisableBuiltInNS;
-  private String keyprefEnableLevelControl;
-  private String keyprefDisableWebRtcAGCAndHPF;
-  private String keyprefSpeakerphone;
-
-  private String keyPrefRoomServerUrl;
-  private String keyPrefDisplayHud;
-  private String keyPrefTracing;
-
-  private String keyprefEnableDataChannel;
-  private String keyprefOrdered;
-  private String keyprefMaxRetransmitTimeMs;
-  private String keyprefMaxRetransmits;
-  private String keyprefDataProtocol;
-  private String keyprefNegotiated;
-  private String keyprefDataId;
-
-  @Override
-  protected void onCreate(Bundle savedInstanceState) {
-    super.onCreate(savedInstanceState);
-    keyprefVideoCall = getString(R.string.pref_videocall_key);
-    keyprefScreencapture = getString(R.string.pref_screencapture_key);
-    keyprefCamera2 = getString(R.string.pref_camera2_key);
-    keyprefResolution = getString(R.string.pref_resolution_key);
-    keyprefFps = getString(R.string.pref_fps_key);
-    keyprefCaptureQualitySlider = getString(R.string.pref_capturequalityslider_key);
-    keyprefMaxVideoBitrateType = getString(R.string.pref_maxvideobitrate_key);
-    keyprefMaxVideoBitrateValue = getString(R.string.pref_maxvideobitratevalue_key);
-    keyPrefVideoCodec = getString(R.string.pref_videocodec_key);
-    keyprefHwCodec = getString(R.string.pref_hwcodec_key);
-    keyprefCaptureToTexture = getString(R.string.pref_capturetotexture_key);
-    keyprefFlexfec = getString(R.string.pref_flexfec_key);
-
-    keyprefStartAudioBitrateType = getString(R.string.pref_startaudiobitrate_key);
-    keyprefStartAudioBitrateValue = getString(R.string.pref_startaudiobitratevalue_key);
-    keyPrefAudioCodec = getString(R.string.pref_audiocodec_key);
-    keyprefNoAudioProcessing = getString(R.string.pref_noaudioprocessing_key);
-    keyprefAecDump = getString(R.string.pref_aecdump_key);
-    keyprefOpenSLES = getString(R.string.pref_opensles_key);
-    keyprefDisableBuiltInAEC = getString(R.string.pref_disable_built_in_aec_key);
-    keyprefDisableBuiltInAGC = getString(R.string.pref_disable_built_in_agc_key);
-    keyprefDisableBuiltInNS = getString(R.string.pref_disable_built_in_ns_key);
-    keyprefEnableLevelControl = getString(R.string.pref_enable_level_control_key);
-    keyprefDisableWebRtcAGCAndHPF = getString(R.string.pref_disable_webrtc_agc_and_hpf_key);
-    keyprefSpeakerphone = getString(R.string.pref_speakerphone_key);
-
-    keyprefEnableDataChannel = getString(R.string.pref_enable_datachannel_key);
-    keyprefOrdered = getString(R.string.pref_ordered_key);
-    keyprefMaxRetransmitTimeMs = getString(R.string.pref_max_retransmit_time_ms_key);
-    keyprefMaxRetransmits = getString(R.string.pref_max_retransmits_key);
-    keyprefDataProtocol = getString(R.string.pref_data_protocol_key);
-    keyprefNegotiated = getString(R.string.pref_negotiated_key);
-    keyprefDataId = getString(R.string.pref_data_id_key);
-
-    keyPrefRoomServerUrl = getString(R.string.pref_room_server_url_key);
-    keyPrefDisplayHud = getString(R.string.pref_displayhud_key);
-    keyPrefTracing = getString(R.string.pref_tracing_key);
-
-    // Display the fragment as the main content.
-    settingsFragment = new SettingsFragment();
-    getFragmentManager()
-        .beginTransaction()
-        .replace(android.R.id.content, settingsFragment)
-        .commit();
-  }
-
-  @Override
-  protected void onResume() {
-    super.onResume();
-    // Set summary to be the user-description for the selected value
-    SharedPreferences sharedPreferences =
-        settingsFragment.getPreferenceScreen().getSharedPreferences();
-    sharedPreferences.registerOnSharedPreferenceChangeListener(this);
-    updateSummaryB(sharedPreferences, keyprefVideoCall);
-    updateSummaryB(sharedPreferences, keyprefScreencapture);
-    updateSummaryB(sharedPreferences, keyprefCamera2);
-    updateSummary(sharedPreferences, keyprefResolution);
-    updateSummary(sharedPreferences, keyprefFps);
-    updateSummaryB(sharedPreferences, keyprefCaptureQualitySlider);
-    updateSummary(sharedPreferences, keyprefMaxVideoBitrateType);
-    updateSummaryBitrate(sharedPreferences, keyprefMaxVideoBitrateValue);
-    setVideoBitrateEnable(sharedPreferences);
-    updateSummary(sharedPreferences, keyPrefVideoCodec);
-    updateSummaryB(sharedPreferences, keyprefHwCodec);
-    updateSummaryB(sharedPreferences, keyprefCaptureToTexture);
-    updateSummaryB(sharedPreferences, keyprefFlexfec);
-
-    updateSummary(sharedPreferences, keyprefStartAudioBitrateType);
-    updateSummaryBitrate(sharedPreferences, keyprefStartAudioBitrateValue);
-    setAudioBitrateEnable(sharedPreferences);
-    updateSummary(sharedPreferences, keyPrefAudioCodec);
-    updateSummaryB(sharedPreferences, keyprefNoAudioProcessing);
-    updateSummaryB(sharedPreferences, keyprefAecDump);
-    updateSummaryB(sharedPreferences, keyprefOpenSLES);
-    updateSummaryB(sharedPreferences, keyprefDisableBuiltInAEC);
-    updateSummaryB(sharedPreferences, keyprefDisableBuiltInAGC);
-    updateSummaryB(sharedPreferences, keyprefDisableBuiltInNS);
-    updateSummaryB(sharedPreferences, keyprefEnableLevelControl);
-    updateSummaryB(sharedPreferences, keyprefDisableWebRtcAGCAndHPF);
-    updateSummaryList(sharedPreferences, keyprefSpeakerphone);
-
-    updateSummaryB(sharedPreferences, keyprefEnableDataChannel);
-    updateSummaryB(sharedPreferences, keyprefOrdered);
-    updateSummary(sharedPreferences, keyprefMaxRetransmitTimeMs);
-    updateSummary(sharedPreferences, keyprefMaxRetransmits);
-    updateSummary(sharedPreferences, keyprefDataProtocol);
-    updateSummaryB(sharedPreferences, keyprefNegotiated);
-    updateSummary(sharedPreferences, keyprefDataId);
-    setDataChannelEnable(sharedPreferences);
-
-    updateSummary(sharedPreferences, keyPrefRoomServerUrl);
-    updateSummaryB(sharedPreferences, keyPrefDisplayHud);
-    updateSummaryB(sharedPreferences, keyPrefTracing);
-
-    if (!Camera2Enumerator.isSupported(this)) {
-      Preference camera2Preference = settingsFragment.findPreference(keyprefCamera2);
-
-      camera2Preference.setSummary(getString(R.string.pref_camera2_not_supported));
-      camera2Preference.setEnabled(false);
-    }
-
-    // Disable forcing WebRTC based AEC so it won't affect our value.
-    // Otherwise, if it was enabled, isAcousticEchoCancelerSupported would always return false.
-    WebRtcAudioUtils.setWebRtcBasedAcousticEchoCanceler(false);
-    if (!WebRtcAudioUtils.isAcousticEchoCancelerSupported()) {
-      Preference disableBuiltInAECPreference =
-          settingsFragment.findPreference(keyprefDisableBuiltInAEC);
-
-      disableBuiltInAECPreference.setSummary(getString(R.string.pref_built_in_aec_not_available));
-      disableBuiltInAECPreference.setEnabled(false);
-    }
-
-    WebRtcAudioUtils.setWebRtcBasedAutomaticGainControl(false);
-    if (!WebRtcAudioUtils.isAutomaticGainControlSupported()) {
-      Preference disableBuiltInAGCPreference =
-          settingsFragment.findPreference(keyprefDisableBuiltInAGC);
-
-      disableBuiltInAGCPreference.setSummary(getString(R.string.pref_built_in_agc_not_available));
-      disableBuiltInAGCPreference.setEnabled(false);
-    }
-
-    WebRtcAudioUtils.setWebRtcBasedNoiseSuppressor(false);
-    if (!WebRtcAudioUtils.isNoiseSuppressorSupported()) {
-      Preference disableBuiltInNSPreference =
-          settingsFragment.findPreference(keyprefDisableBuiltInNS);
-
-      disableBuiltInNSPreference.setSummary(getString(R.string.pref_built_in_ns_not_available));
-      disableBuiltInNSPreference.setEnabled(false);
-    }
-  }
-
-  @Override
-  protected void onPause() {
-    super.onPause();
-    SharedPreferences sharedPreferences =
-        settingsFragment.getPreferenceScreen().getSharedPreferences();
-    sharedPreferences.unregisterOnSharedPreferenceChangeListener(this);
-  }
-
-  @Override
-  public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
-    // clang-format off
-    if (key.equals(keyprefResolution)
-        || key.equals(keyprefFps)
-        || key.equals(keyprefMaxVideoBitrateType)
-        || key.equals(keyPrefVideoCodec)
-        || key.equals(keyprefStartAudioBitrateType)
-        || key.equals(keyPrefAudioCodec)
-        || key.equals(keyPrefRoomServerUrl)
-        || key.equals(keyprefMaxRetransmitTimeMs)
-        || key.equals(keyprefMaxRetransmits)
-        || key.equals(keyprefDataProtocol)
-        || key.equals(keyprefDataId)) {
-      updateSummary(sharedPreferences, key);
-    } else if (key.equals(keyprefMaxVideoBitrateValue)
-        || key.equals(keyprefStartAudioBitrateValue)) {
-      updateSummaryBitrate(sharedPreferences, key);
-    } else if (key.equals(keyprefVideoCall)
-        || key.equals(keyprefScreencapture)
-        || key.equals(keyprefCamera2)
-        || key.equals(keyPrefTracing)
-        || key.equals(keyprefCaptureQualitySlider)
-        || key.equals(keyprefHwCodec)
-        || key.equals(keyprefCaptureToTexture)
-        || key.equals(keyprefFlexfec)
-        || key.equals(keyprefNoAudioProcessing)
-        || key.equals(keyprefAecDump)
-        || key.equals(keyprefOpenSLES)
-        || key.equals(keyprefDisableBuiltInAEC)
-        || key.equals(keyprefDisableBuiltInAGC)
-        || key.equals(keyprefDisableBuiltInNS)
-        || key.equals(keyprefEnableLevelControl)
-        || key.equals(keyprefDisableWebRtcAGCAndHPF)
-        || key.equals(keyPrefDisplayHud)
-        || key.equals(keyprefEnableDataChannel)
-        || key.equals(keyprefOrdered)
-        || key.equals(keyprefNegotiated)) {
-      updateSummaryB(sharedPreferences, key);
-    } else if (key.equals(keyprefSpeakerphone)) {
-      updateSummaryList(sharedPreferences, key);
-    }
-    // clang-format on
-    if (key.equals(keyprefMaxVideoBitrateType)) {
-      setVideoBitrateEnable(sharedPreferences);
-    }
-    if (key.equals(keyprefStartAudioBitrateType)) {
-      setAudioBitrateEnable(sharedPreferences);
-    }
-    if (key.equals(keyprefEnableDataChannel)) {
-      setDataChannelEnable(sharedPreferences);
-    }
-  }
-
-  private void updateSummary(SharedPreferences sharedPreferences, String key) {
-    Preference updatedPref = settingsFragment.findPreference(key);
-    // Set summary to be the user-description for the selected value
-    updatedPref.setSummary(sharedPreferences.getString(key, ""));
-  }
-
-  private void updateSummaryBitrate(SharedPreferences sharedPreferences, String key) {
-    Preference updatedPref = settingsFragment.findPreference(key);
-    updatedPref.setSummary(sharedPreferences.getString(key, "") + " kbps");
-  }
-
-  private void updateSummaryB(SharedPreferences sharedPreferences, String key) {
-    Preference updatedPref = settingsFragment.findPreference(key);
-    updatedPref.setSummary(sharedPreferences.getBoolean(key, true)
-            ? getString(R.string.pref_value_enabled)
-            : getString(R.string.pref_value_disabled));
-  }
-
-  private void updateSummaryList(SharedPreferences sharedPreferences, String key) {
-    ListPreference updatedPref = (ListPreference) settingsFragment.findPreference(key);
-    updatedPref.setSummary(updatedPref.getEntry());
-  }
-
-  private void setVideoBitrateEnable(SharedPreferences sharedPreferences) {
-    Preference bitratePreferenceValue =
-        settingsFragment.findPreference(keyprefMaxVideoBitrateValue);
-    String bitrateTypeDefault = getString(R.string.pref_maxvideobitrate_default);
-    String bitrateType =
-        sharedPreferences.getString(keyprefMaxVideoBitrateType, bitrateTypeDefault);
-    if (bitrateType.equals(bitrateTypeDefault)) {
-      bitratePreferenceValue.setEnabled(false);
-    } else {
-      bitratePreferenceValue.setEnabled(true);
-    }
-  }
-
-  private void setAudioBitrateEnable(SharedPreferences sharedPreferences) {
-    Preference bitratePreferenceValue =
-        settingsFragment.findPreference(keyprefStartAudioBitrateValue);
-    String bitrateTypeDefault = getString(R.string.pref_startaudiobitrate_default);
-    String bitrateType =
-        sharedPreferences.getString(keyprefStartAudioBitrateType, bitrateTypeDefault);
-    if (bitrateType.equals(bitrateTypeDefault)) {
-      bitratePreferenceValue.setEnabled(false);
-    } else {
-      bitratePreferenceValue.setEnabled(true);
-    }
-  }
-
-  private void setDataChannelEnable(SharedPreferences sharedPreferences) {
-    boolean enabled = sharedPreferences.getBoolean(keyprefEnableDataChannel, true);
-    settingsFragment.findPreference(keyprefOrdered).setEnabled(enabled);
-    settingsFragment.findPreference(keyprefMaxRetransmitTimeMs).setEnabled(enabled);
-    settingsFragment.findPreference(keyprefMaxRetransmits).setEnabled(enabled);
-    settingsFragment.findPreference(keyprefDataProtocol).setEnabled(enabled);
-    settingsFragment.findPreference(keyprefNegotiated).setEnabled(enabled);
-    settingsFragment.findPreference(keyprefDataId).setEnabled(enabled);
-  }
-}
diff --git a/examples/androidapp/src/org/appspot/apprtc/SettingsFragment.java b/examples/androidapp/src/org/appspot/apprtc/SettingsFragment.java
deleted file mode 100644
index d969bd7..0000000
--- a/examples/androidapp/src/org/appspot/apprtc/SettingsFragment.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- *  Copyright 2014 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.
- */
-
-package org.appspot.apprtc;
-
-import android.os.Bundle;
-import android.preference.PreferenceFragment;
-
-/**
- * Settings fragment for AppRTC.
- */
-public class SettingsFragment extends PreferenceFragment {
-  @Override
-  public void onCreate(Bundle savedInstanceState) {
-    super.onCreate(savedInstanceState);
-    // Load the preferences from an XML resource
-    addPreferencesFromResource(R.xml.preferences);
-  }
-}
diff --git a/examples/androidapp/src/org/appspot/apprtc/TCPChannelClient.java b/examples/androidapp/src/org/appspot/apprtc/TCPChannelClient.java
deleted file mode 100644
index 019a996..0000000
--- a/examples/androidapp/src/org/appspot/apprtc/TCPChannelClient.java
+++ /dev/null
@@ -1,354 +0,0 @@
-/*
- *  Copyright 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.
- */
-
-package org.appspot.apprtc;
-
-import android.util.Log;
-
-import org.webrtc.ThreadUtils;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.io.PrintWriter;
-import java.net.InetAddress;
-import java.net.ServerSocket;
-import java.net.Socket;
-import java.net.UnknownHostException;
-import java.util.concurrent.ExecutorService;
-
-/**
- * Replacement for WebSocketChannelClient for direct communication between two IP addresses. Handles
- * the signaling between the two clients using a TCP connection.
- *
- * <p>All public methods should be called from a looper executor thread
- * passed in a constructor, otherwise exception will be thrown.
- * All events are dispatched on the same thread.
- */
-public class TCPChannelClient {
-  private static final String TAG = "TCPChannelClient";
-
-  private final ExecutorService executor;
-  private final ThreadUtils.ThreadChecker executorThreadCheck;
-  private final TCPChannelEvents eventListener;
-  private TCPSocket socket;
-
-  /**
-   * Callback interface for messages delivered on TCP Connection. All callbacks are invoked from the
-   * looper executor thread.
-   */
-  public interface TCPChannelEvents {
-    void onTCPConnected(boolean server);
-    void onTCPMessage(String message);
-    void onTCPError(String description);
-    void onTCPClose();
-  }
-
-  /**
-   * Initializes the TCPChannelClient. If IP is a local IP address, starts a listening server on
-   * that IP. If not, instead connects to the IP.
-   *
-   * @param eventListener Listener that will receive events from the client.
-   * @param ip IP address to listen on or connect to.
-   * @param port Port to listen on or connect to.
-   */
-  public TCPChannelClient(
-      ExecutorService executor, TCPChannelEvents eventListener, String ip, int port) {
-    this.executor = executor;
-    executorThreadCheck = new ThreadUtils.ThreadChecker();
-    executorThreadCheck.detachThread();
-    this.eventListener = eventListener;
-
-    InetAddress address;
-    try {
-      address = InetAddress.getByName(ip);
-    } catch (UnknownHostException e) {
-      reportError("Invalid IP address.");
-      return;
-    }
-
-    if (address.isAnyLocalAddress()) {
-      socket = new TCPSocketServer(address, port);
-    } else {
-      socket = new TCPSocketClient(address, port);
-    }
-
-    socket.start();
-  }
-
-  /**
-   * Disconnects the client if not already disconnected. This will fire the onTCPClose event.
-   */
-  public void disconnect() {
-    executorThreadCheck.checkIsOnValidThread();
-
-    socket.disconnect();
-  }
-
-  /**
-   * Sends a message on the socket.
-   *
-   * @param message Message to be sent.
-   */
-  public void send(String message) {
-    executorThreadCheck.checkIsOnValidThread();
-
-    socket.send(message);
-  }
-
-  /**
-   * Helper method for firing onTCPError events. Calls onTCPError on the executor thread.
-   */
-  private void reportError(final String message) {
-    Log.e(TAG, "TCP Error: " + message);
-    executor.execute(new Runnable() {
-      @Override
-      public void run() {
-        eventListener.onTCPError(message);
-      }
-    });
-  }
-
-  /**
-   * Base class for server and client sockets. Contains a listening thread that will call
-   * eventListener.onTCPMessage on new messages.
-   */
-  private abstract class TCPSocket extends Thread {
-    // Lock for editing out and rawSocket
-    protected final Object rawSocketLock;
-    private PrintWriter out;
-    private Socket rawSocket;
-
-    /**
-     * Connect to the peer, potentially a slow operation.
-     *
-     * @return Socket connection, null if connection failed.
-     */
-    public abstract Socket connect();
-    /** Returns true if sockets is a server rawSocket. */
-    public abstract boolean isServer();
-
-    TCPSocket() {
-      rawSocketLock = new Object();
-    }
-
-    /**
-     * The listening thread.
-     */
-    @Override
-    public void run() {
-      Log.d(TAG, "Listening thread started...");
-
-      // Receive connection to temporary variable first, so we don't block.
-      Socket tempSocket = connect();
-      BufferedReader in;
-
-      Log.d(TAG, "TCP connection established.");
-
-      synchronized (rawSocketLock) {
-        if (rawSocket != null) {
-          Log.e(TAG, "Socket already existed and will be replaced.");
-        }
-
-        rawSocket = tempSocket;
-
-        // Connecting failed, error has already been reported, just exit.
-        if (rawSocket == null) {
-          return;
-        }
-
-        try {
-          out = new PrintWriter(rawSocket.getOutputStream(), true);
-          in = new BufferedReader(new InputStreamReader(rawSocket.getInputStream()));
-        } catch (IOException e) {
-          reportError("Failed to open IO on rawSocket: " + e.getMessage());
-          return;
-        }
-      }
-
-      Log.v(TAG, "Execute onTCPConnected");
-      executor.execute(new Runnable() {
-        @Override
-        public void run() {
-          Log.v(TAG, "Run onTCPConnected");
-          eventListener.onTCPConnected(isServer());
-        }
-      });
-
-      while (true) {
-        final String message;
-        try {
-          message = in.readLine();
-        } catch (IOException e) {
-          synchronized (rawSocketLock) {
-            // If socket was closed, this is expected.
-            if (rawSocket == null) {
-              break;
-            }
-          }
-
-          reportError("Failed to read from rawSocket: " + e.getMessage());
-          break;
-        }
-
-        // No data received, rawSocket probably closed.
-        if (message == null) {
-          break;
-        }
-
-        executor.execute(new Runnable() {
-          @Override
-          public void run() {
-            Log.v(TAG, "Receive: " + message);
-            eventListener.onTCPMessage(message);
-          }
-        });
-      }
-
-      Log.d(TAG, "Receiving thread exiting...");
-
-      // Close the rawSocket if it is still open.
-      disconnect();
-    }
-
-    /**
-     * Closes the rawSocket if it is still open. Also fires the onTCPClose event.
-     */
-    public void disconnect() {
-      try {
-        synchronized (rawSocketLock) {
-          if (rawSocket != null) {
-            rawSocket.close();
-            rawSocket = null;
-            out = null;
-
-            executor.execute(new Runnable() {
-              @Override
-              public void run() {
-                eventListener.onTCPClose();
-              }
-            });
-          }
-        }
-      } catch (IOException e) {
-        reportError("Failed to close rawSocket: " + e.getMessage());
-      }
-    }
-
-    /**
-     * Sends a message on the socket. Should only be called on the executor thread.
-     */
-    public void send(String message) {
-      Log.v(TAG, "Send: " + message);
-
-      synchronized (rawSocketLock) {
-        if (out == null) {
-          reportError("Sending data on closed socket.");
-          return;
-        }
-
-        out.write(message + "\n");
-        out.flush();
-      }
-    }
-  }
-
-  private class TCPSocketServer extends TCPSocket {
-    // Server socket is also guarded by rawSocketLock.
-    private ServerSocket serverSocket;
-
-    final private InetAddress address;
-    final private int port;
-
-    public TCPSocketServer(InetAddress address, int port) {
-      this.address = address;
-      this.port = port;
-    }
-
-    /** Opens a listening socket and waits for a connection. */
-    @Override
-    public Socket connect() {
-      Log.d(TAG, "Listening on [" + address.getHostAddress() + "]:" + Integer.toString(port));
-
-      final ServerSocket tempSocket;
-      try {
-        tempSocket = new ServerSocket(port, 0, address);
-      } catch (IOException e) {
-        reportError("Failed to create server socket: " + e.getMessage());
-        return null;
-      }
-
-      synchronized (rawSocketLock) {
-        if (serverSocket != null) {
-          Log.e(TAG, "Server rawSocket was already listening and new will be opened.");
-        }
-
-        serverSocket = tempSocket;
-      }
-
-      try {
-        return tempSocket.accept();
-      } catch (IOException e) {
-        reportError("Failed to receive connection: " + e.getMessage());
-        return null;
-      }
-    }
-
-    /** Closes the listening socket and calls super. */
-    @Override
-    public void disconnect() {
-      try {
-        synchronized (rawSocketLock) {
-          if (serverSocket != null) {
-            serverSocket.close();
-            serverSocket = null;
-          }
-        }
-      } catch (IOException e) {
-        reportError("Failed to close server socket: " + e.getMessage());
-      }
-
-      super.disconnect();
-    }
-
-    @Override
-    public boolean isServer() {
-      return true;
-    }
-  }
-
-  private class TCPSocketClient extends TCPSocket {
-    final private InetAddress address;
-    final private int port;
-
-    public TCPSocketClient(InetAddress address, int port) {
-      this.address = address;
-      this.port = port;
-    }
-
-    /** Connects to the peer. */
-    @Override
-    public Socket connect() {
-      Log.d(TAG, "Connecting to [" + address.getHostAddress() + "]:" + Integer.toString(port));
-
-      try {
-        return new Socket(address, port);
-      } catch (IOException e) {
-        reportError("Failed to connect: " + e.getMessage());
-        return null;
-      }
-    }
-
-    @Override
-    public boolean isServer() {
-      return false;
-    }
-  }
-}
diff --git a/examples/androidapp/src/org/appspot/apprtc/UnhandledExceptionHandler.java b/examples/androidapp/src/org/appspot/apprtc/UnhandledExceptionHandler.java
deleted file mode 100644
index 33a4382..0000000
--- a/examples/androidapp/src/org/appspot/apprtc/UnhandledExceptionHandler.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- *  Copyright 2013 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.
- */
-
-package org.appspot.apprtc;
-
-import android.app.Activity;
-import android.app.AlertDialog;
-import android.content.DialogInterface;
-import android.util.Log;
-import android.util.TypedValue;
-import android.widget.ScrollView;
-import android.widget.TextView;
-
-import java.io.PrintWriter;
-import java.io.StringWriter;
-
-/**
- * Singleton helper: install a default unhandled exception handler which shows
- * an informative dialog and kills the app.  Useful for apps whose
- * error-handling consists of throwing RuntimeExceptions.
- * NOTE: almost always more useful to
- * Thread.setDefaultUncaughtExceptionHandler() rather than
- * Thread.setUncaughtExceptionHandler(), to apply to background threads as well.
- */
-public class UnhandledExceptionHandler implements Thread.UncaughtExceptionHandler {
-  private static final String TAG = "AppRTCMobileActivity";
-  private final Activity activity;
-
-  public UnhandledExceptionHandler(final Activity activity) {
-    this.activity = activity;
-  }
-
-  public void uncaughtException(Thread unusedThread, final Throwable e) {
-    activity.runOnUiThread(new Runnable() {
-      @Override
-      public void run() {
-        String title = "Fatal error: " + getTopLevelCauseMessage(e);
-        String msg = getRecursiveStackTrace(e);
-        TextView errorView = new TextView(activity);
-        errorView.setText(msg);
-        errorView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 8);
-        ScrollView scrollingContainer = new ScrollView(activity);
-        scrollingContainer.addView(errorView);
-        Log.e(TAG, title + "\n\n" + msg);
-        DialogInterface.OnClickListener listener = new DialogInterface.OnClickListener() {
-          @Override
-          public void onClick(DialogInterface dialog, int which) {
-            dialog.dismiss();
-            System.exit(1);
-          }
-        };
-        AlertDialog.Builder builder = new AlertDialog.Builder(activity);
-        builder.setTitle(title)
-            .setView(scrollingContainer)
-            .setPositiveButton("Exit", listener)
-            .show();
-      }
-    });
-  }
-
-  // Returns the Message attached to the original Cause of |t|.
-  private static String getTopLevelCauseMessage(Throwable t) {
-    Throwable topLevelCause = t;
-    while (topLevelCause.getCause() != null) {
-      topLevelCause = topLevelCause.getCause();
-    }
-    return topLevelCause.getMessage();
-  }
-
-  // Returns a human-readable String of the stacktrace in |t|, recursively
-  // through all Causes that led to |t|.
-  private static String getRecursiveStackTrace(Throwable t) {
-    StringWriter writer = new StringWriter();
-    t.printStackTrace(new PrintWriter(writer));
-    return writer.toString();
-  }
-}
diff --git a/examples/androidapp/src/org/appspot/apprtc/WebSocketChannelClient.java b/examples/androidapp/src/org/appspot/apprtc/WebSocketChannelClient.java
deleted file mode 100644
index b5e8d99..0000000
--- a/examples/androidapp/src/org/appspot/apprtc/WebSocketChannelClient.java
+++ /dev/null
@@ -1,296 +0,0 @@
-/*
- *  Copyright 2014 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.
- */
-
-package org.appspot.apprtc;
-
-import org.appspot.apprtc.util.AsyncHttpURLConnection;
-import org.appspot.apprtc.util.AsyncHttpURLConnection.AsyncHttpEvents;
-
-import android.os.Handler;
-import android.util.Log;
-
-import de.tavendo.autobahn.WebSocket.WebSocketConnectionObserver;
-import de.tavendo.autobahn.WebSocketConnection;
-import de.tavendo.autobahn.WebSocketException;
-
-import org.json.JSONException;
-import org.json.JSONObject;
-
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.util.LinkedList;
-
-/**
- * WebSocket client implementation.
- *
- * <p>All public methods should be called from a looper executor thread
- * passed in a constructor, otherwise exception will be thrown.
- * All events are dispatched on the same thread.
- */
-
-public class WebSocketChannelClient {
-  private static final String TAG = "WSChannelRTCClient";
-  private static final int CLOSE_TIMEOUT = 1000;
-  private final WebSocketChannelEvents events;
-  private final Handler handler;
-  private WebSocketConnection ws;
-  private WebSocketObserver wsObserver;
-  private String wsServerUrl;
-  private String postServerUrl;
-  private String roomID;
-  private String clientID;
-  private WebSocketConnectionState state;
-  private final Object closeEventLock = new Object();
-  private boolean closeEvent;
-  // WebSocket send queue. Messages are added to the queue when WebSocket
-  // client is not registered and are consumed in register() call.
-  private final LinkedList<String> wsSendQueue;
-
-  /**
-   * Possible WebSocket connection states.
-   */
-  public enum WebSocketConnectionState { NEW, CONNECTED, REGISTERED, CLOSED, ERROR }
-
-  /**
-   * Callback interface for messages delivered on WebSocket.
-   * All events are dispatched from a looper executor thread.
-   */
-  public interface WebSocketChannelEvents {
-    void onWebSocketMessage(final String message);
-    void onWebSocketClose();
-    void onWebSocketError(final String description);
-  }
-
-  public WebSocketChannelClient(Handler handler, WebSocketChannelEvents events) {
-    this.handler = handler;
-    this.events = events;
-    roomID = null;
-    clientID = null;
-    wsSendQueue = new LinkedList<String>();
-    state = WebSocketConnectionState.NEW;
-  }
-
-  public WebSocketConnectionState getState() {
-    return state;
-  }
-
-  public void connect(final String wsUrl, final String postUrl) {
-    checkIfCalledOnValidThread();
-    if (state != WebSocketConnectionState.NEW) {
-      Log.e(TAG, "WebSocket is already connected.");
-      return;
-    }
-    wsServerUrl = wsUrl;
-    postServerUrl = postUrl;
-    closeEvent = false;
-
-    Log.d(TAG, "Connecting WebSocket to: " + wsUrl + ". Post URL: " + postUrl);
-    ws = new WebSocketConnection();
-    wsObserver = new WebSocketObserver();
-    try {
-      ws.connect(new URI(wsServerUrl), wsObserver);
-    } catch (URISyntaxException e) {
-      reportError("URI error: " + e.getMessage());
-    } catch (WebSocketException e) {
-      reportError("WebSocket connection error: " + e.getMessage());
-    }
-  }
-
-  public void register(final String roomID, final String clientID) {
-    checkIfCalledOnValidThread();
-    this.roomID = roomID;
-    this.clientID = clientID;
-    if (state != WebSocketConnectionState.CONNECTED) {
-      Log.w(TAG, "WebSocket register() in state " + state);
-      return;
-    }
-    Log.d(TAG, "Registering WebSocket for room " + roomID + ". ClientID: " + clientID);
-    JSONObject json = new JSONObject();
-    try {
-      json.put("cmd", "register");
-      json.put("roomid", roomID);
-      json.put("clientid", clientID);
-      Log.d(TAG, "C->WSS: " + json.toString());
-      ws.sendTextMessage(json.toString());
-      state = WebSocketConnectionState.REGISTERED;
-      // Send any previously accumulated messages.
-      for (String sendMessage : wsSendQueue) {
-        send(sendMessage);
-      }
-      wsSendQueue.clear();
-    } catch (JSONException e) {
-      reportError("WebSocket register JSON error: " + e.getMessage());
-    }
-  }
-
-  public void send(String message) {
-    checkIfCalledOnValidThread();
-    switch (state) {
-      case NEW:
-      case CONNECTED:
-        // Store outgoing messages and send them after websocket client
-        // is registered.
-        Log.d(TAG, "WS ACC: " + message);
-        wsSendQueue.add(message);
-        return;
-      case ERROR:
-      case CLOSED:
-        Log.e(TAG, "WebSocket send() in error or closed state : " + message);
-        return;
-      case REGISTERED:
-        JSONObject json = new JSONObject();
-        try {
-          json.put("cmd", "send");
-          json.put("msg", message);
-          message = json.toString();
-          Log.d(TAG, "C->WSS: " + message);
-          ws.sendTextMessage(message);
-        } catch (JSONException e) {
-          reportError("WebSocket send JSON error: " + e.getMessage());
-        }
-        break;
-    }
-  }
-
-  // This call can be used to send WebSocket messages before WebSocket
-  // connection is opened.
-  public void post(String message) {
-    checkIfCalledOnValidThread();
-    sendWSSMessage("POST", message);
-  }
-
-  public void disconnect(boolean waitForComplete) {
-    checkIfCalledOnValidThread();
-    Log.d(TAG, "Disconnect WebSocket. State: " + state);
-    if (state == WebSocketConnectionState.REGISTERED) {
-      // Send "bye" to WebSocket server.
-      send("{\"type\": \"bye\"}");
-      state = WebSocketConnectionState.CONNECTED;
-      // Send http DELETE to http WebSocket server.
-      sendWSSMessage("DELETE", "");
-    }
-    // Close WebSocket in CONNECTED or ERROR states only.
-    if (state == WebSocketConnectionState.CONNECTED || state == WebSocketConnectionState.ERROR) {
-      ws.disconnect();
-      state = WebSocketConnectionState.CLOSED;
-
-      // Wait for websocket close event to prevent websocket library from
-      // sending any pending messages to deleted looper thread.
-      if (waitForComplete) {
-        synchronized (closeEventLock) {
-          while (!closeEvent) {
-            try {
-              closeEventLock.wait(CLOSE_TIMEOUT);
-              break;
-            } catch (InterruptedException e) {
-              Log.e(TAG, "Wait error: " + e.toString());
-            }
-          }
-        }
-      }
-    }
-    Log.d(TAG, "Disconnecting WebSocket done.");
-  }
-
-  private void reportError(final String errorMessage) {
-    Log.e(TAG, errorMessage);
-    handler.post(new Runnable() {
-      @Override
-      public void run() {
-        if (state != WebSocketConnectionState.ERROR) {
-          state = WebSocketConnectionState.ERROR;
-          events.onWebSocketError(errorMessage);
-        }
-      }
-    });
-  }
-
-  // Asynchronously send POST/DELETE to WebSocket server.
-  private void sendWSSMessage(final String method, final String message) {
-    String postUrl = postServerUrl + "/" + roomID + "/" + clientID;
-    Log.d(TAG, "WS " + method + " : " + postUrl + " : " + message);
-    AsyncHttpURLConnection httpConnection =
-        new AsyncHttpURLConnection(method, postUrl, message, new AsyncHttpEvents() {
-          @Override
-          public void onHttpError(String errorMessage) {
-            reportError("WS " + method + " error: " + errorMessage);
-          }
-
-          @Override
-          public void onHttpComplete(String response) {}
-        });
-    httpConnection.send();
-  }
-
-  // Helper method for debugging purposes. Ensures that WebSocket method is
-  // called on a looper thread.
-  private void checkIfCalledOnValidThread() {
-    if (Thread.currentThread() != handler.getLooper().getThread()) {
-      throw new IllegalStateException("WebSocket method is not called on valid thread");
-    }
-  }
-
-  private class WebSocketObserver implements WebSocketConnectionObserver {
-    @Override
-    public void onOpen() {
-      Log.d(TAG, "WebSocket connection opened to: " + wsServerUrl);
-      handler.post(new Runnable() {
-        @Override
-        public void run() {
-          state = WebSocketConnectionState.CONNECTED;
-          // Check if we have pending register request.
-          if (roomID != null && clientID != null) {
-            register(roomID, clientID);
-          }
-        }
-      });
-    }
-
-    @Override
-    public void onClose(WebSocketCloseNotification code, String reason) {
-      Log.d(TAG, "WebSocket connection closed. Code: " + code + ". Reason: " + reason + ". State: "
-              + state);
-      synchronized (closeEventLock) {
-        closeEvent = true;
-        closeEventLock.notify();
-      }
-      handler.post(new Runnable() {
-        @Override
-        public void run() {
-          if (state != WebSocketConnectionState.CLOSED) {
-            state = WebSocketConnectionState.CLOSED;
-            events.onWebSocketClose();
-          }
-        }
-      });
-    }
-
-    @Override
-    public void onTextMessage(String payload) {
-      Log.d(TAG, "WSS->C: " + payload);
-      final String message = payload;
-      handler.post(new Runnable() {
-        @Override
-        public void run() {
-          if (state == WebSocketConnectionState.CONNECTED
-              || state == WebSocketConnectionState.REGISTERED) {
-            events.onWebSocketMessage(message);
-          }
-        }
-      });
-    }
-
-    @Override
-    public void onRawTextMessage(byte[] payload) {}
-
-    @Override
-    public void onBinaryMessage(byte[] payload) {}
-  }
-}
diff --git a/examples/androidapp/src/org/appspot/apprtc/WebSocketRTCClient.java b/examples/androidapp/src/org/appspot/apprtc/WebSocketRTCClient.java
deleted file mode 100644
index 3215051..0000000
--- a/examples/androidapp/src/org/appspot/apprtc/WebSocketRTCClient.java
+++ /dev/null
@@ -1,428 +0,0 @@
-/*
- *  Copyright 2014 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.
- */
-
-package org.appspot.apprtc;
-
-import org.appspot.apprtc.RoomParametersFetcher.RoomParametersFetcherEvents;
-import org.appspot.apprtc.WebSocketChannelClient.WebSocketChannelEvents;
-import org.appspot.apprtc.WebSocketChannelClient.WebSocketConnectionState;
-import org.appspot.apprtc.util.AsyncHttpURLConnection;
-import org.appspot.apprtc.util.AsyncHttpURLConnection.AsyncHttpEvents;
-
-import android.os.Handler;
-import android.os.HandlerThread;
-import android.util.Log;
-
-import org.json.JSONArray;
-import org.json.JSONException;
-import org.json.JSONObject;
-import org.webrtc.IceCandidate;
-import org.webrtc.SessionDescription;
-
-/**
- * Negotiates signaling for chatting with https://appr.tc "rooms".
- * Uses the client<->server specifics of the apprtc AppEngine webapp.
- *
- * <p>To use: create an instance of this object (registering a message handler) and
- * call connectToRoom().  Once room connection is established
- * onConnectedToRoom() callback with room parameters is invoked.
- * Messages to other party (with local Ice candidates and answer SDP) can
- * be sent after WebSocket connection is established.
- */
-public class WebSocketRTCClient implements AppRTCClient, WebSocketChannelEvents {
-  private static final String TAG = "WSRTCClient";
-  private static final String ROOM_JOIN = "join";
-  private static final String ROOM_MESSAGE = "message";
-  private static final String ROOM_LEAVE = "leave";
-
-  private enum ConnectionState { NEW, CONNECTED, CLOSED, ERROR }
-
-  private enum MessageType { MESSAGE, LEAVE }
-
-  private final Handler handler;
-  private boolean initiator;
-  private SignalingEvents events;
-  private WebSocketChannelClient wsClient;
-  private ConnectionState roomState;
-  private RoomConnectionParameters connectionParameters;
-  private String messageUrl;
-  private String leaveUrl;
-
-  public WebSocketRTCClient(SignalingEvents events) {
-    this.events = events;
-    roomState = ConnectionState.NEW;
-    final HandlerThread handlerThread = new HandlerThread(TAG);
-    handlerThread.start();
-    handler = new Handler(handlerThread.getLooper());
-  }
-
-  // --------------------------------------------------------------------
-  // AppRTCClient interface implementation.
-  // Asynchronously connect to an AppRTC room URL using supplied connection
-  // parameters, retrieves room parameters and connect to WebSocket server.
-  @Override
-  public void connectToRoom(RoomConnectionParameters connectionParameters) {
-    this.connectionParameters = connectionParameters;
-    handler.post(new Runnable() {
-      @Override
-      public void run() {
-        connectToRoomInternal();
-      }
-    });
-  }
-
-  @Override
-  public void disconnectFromRoom() {
-    handler.post(new Runnable() {
-      @Override
-      public void run() {
-        disconnectFromRoomInternal();
-        handler.getLooper().quit();
-      }
-    });
-  }
-
-  // Connects to room - function runs on a local looper thread.
-  private void connectToRoomInternal() {
-    String connectionUrl = getConnectionUrl(connectionParameters);
-    Log.d(TAG, "Connect to room: " + connectionUrl);
-    roomState = ConnectionState.NEW;
-    wsClient = new WebSocketChannelClient(handler, this);
-
-    RoomParametersFetcherEvents callbacks = new RoomParametersFetcherEvents() {
-      @Override
-      public void onSignalingParametersReady(final SignalingParameters params) {
-        WebSocketRTCClient.this.handler.post(new Runnable() {
-          @Override
-          public void run() {
-            WebSocketRTCClient.this.signalingParametersReady(params);
-          }
-        });
-      }
-
-      @Override
-      public void onSignalingParametersError(String description) {
-        WebSocketRTCClient.this.reportError(description);
-      }
-    };
-
-    new RoomParametersFetcher(connectionUrl, null, callbacks).makeRequest();
-  }
-
-  // Disconnect from room and send bye messages - runs on a local looper thread.
-  private void disconnectFromRoomInternal() {
-    Log.d(TAG, "Disconnect. Room state: " + roomState);
-    if (roomState == ConnectionState.CONNECTED) {
-      Log.d(TAG, "Closing room.");
-      sendPostMessage(MessageType.LEAVE, leaveUrl, null);
-    }
-    roomState = ConnectionState.CLOSED;
-    if (wsClient != null) {
-      wsClient.disconnect(true);
-    }
-  }
-
-  // Helper functions to get connection, post message and leave message URLs
-  private String getConnectionUrl(RoomConnectionParameters connectionParameters) {
-    return connectionParameters.roomUrl + "/" + ROOM_JOIN + "/" + connectionParameters.roomId
-        + getQueryString(connectionParameters);
-  }
-
-  private String getMessageUrl(
-      RoomConnectionParameters connectionParameters, SignalingParameters signalingParameters) {
-    return connectionParameters.roomUrl + "/" + ROOM_MESSAGE + "/" + connectionParameters.roomId
-        + "/" + signalingParameters.clientId + getQueryString(connectionParameters);
-  }
-
-  private String getLeaveUrl(
-      RoomConnectionParameters connectionParameters, SignalingParameters signalingParameters) {
-    return connectionParameters.roomUrl + "/" + ROOM_LEAVE + "/" + connectionParameters.roomId + "/"
-        + signalingParameters.clientId + getQueryString(connectionParameters);
-  }
-
-  private String getQueryString(RoomConnectionParameters connectionParameters) {
-    if (connectionParameters.urlParameters != null) {
-      return "?" + connectionParameters.urlParameters;
-    } else {
-      return "";
-    }
-  }
-
-  // Callback issued when room parameters are extracted. Runs on local
-  // looper thread.
-  private void signalingParametersReady(final SignalingParameters signalingParameters) {
-    Log.d(TAG, "Room connection completed.");
-    if (connectionParameters.loopback
-        && (!signalingParameters.initiator || signalingParameters.offerSdp != null)) {
-      reportError("Loopback room is busy.");
-      return;
-    }
-    if (!connectionParameters.loopback && !signalingParameters.initiator
-        && signalingParameters.offerSdp == null) {
-      Log.w(TAG, "No offer SDP in room response.");
-    }
-    initiator = signalingParameters.initiator;
-    messageUrl = getMessageUrl(connectionParameters, signalingParameters);
-    leaveUrl = getLeaveUrl(connectionParameters, signalingParameters);
-    Log.d(TAG, "Message URL: " + messageUrl);
-    Log.d(TAG, "Leave URL: " + leaveUrl);
-    roomState = ConnectionState.CONNECTED;
-
-    // Fire connection and signaling parameters events.
-    events.onConnectedToRoom(signalingParameters);
-
-    // Connect and register WebSocket client.
-    wsClient.connect(signalingParameters.wssUrl, signalingParameters.wssPostUrl);
-    wsClient.register(connectionParameters.roomId, signalingParameters.clientId);
-  }
-
-  // Send local offer SDP to the other participant.
-  @Override
-  public void sendOfferSdp(final SessionDescription sdp) {
-    handler.post(new Runnable() {
-      @Override
-      public void run() {
-        if (roomState != ConnectionState.CONNECTED) {
-          reportError("Sending offer SDP in non connected state.");
-          return;
-        }
-        JSONObject json = new JSONObject();
-        jsonPut(json, "sdp", sdp.description);
-        jsonPut(json, "type", "offer");
-        sendPostMessage(MessageType.MESSAGE, messageUrl, json.toString());
-        if (connectionParameters.loopback) {
-          // In loopback mode rename this offer to answer and route it back.
-          SessionDescription sdpAnswer = new SessionDescription(
-              SessionDescription.Type.fromCanonicalForm("answer"), sdp.description);
-          events.onRemoteDescription(sdpAnswer);
-        }
-      }
-    });
-  }
-
-  // Send local answer SDP to the other participant.
-  @Override
-  public void sendAnswerSdp(final SessionDescription sdp) {
-    handler.post(new Runnable() {
-      @Override
-      public void run() {
-        if (connectionParameters.loopback) {
-          Log.e(TAG, "Sending answer in loopback mode.");
-          return;
-        }
-        JSONObject json = new JSONObject();
-        jsonPut(json, "sdp", sdp.description);
-        jsonPut(json, "type", "answer");
-        wsClient.send(json.toString());
-      }
-    });
-  }
-
-  // Send Ice candidate to the other participant.
-  @Override
-  public void sendLocalIceCandidate(final IceCandidate candidate) {
-    handler.post(new Runnable() {
-      @Override
-      public void run() {
-        JSONObject json = new JSONObject();
-        jsonPut(json, "type", "candidate");
-        jsonPut(json, "label", candidate.sdpMLineIndex);
-        jsonPut(json, "id", candidate.sdpMid);
-        jsonPut(json, "candidate", candidate.sdp);
-        if (initiator) {
-          // Call initiator sends ice candidates to GAE server.
-          if (roomState != ConnectionState.CONNECTED) {
-            reportError("Sending ICE candidate in non connected state.");
-            return;
-          }
-          sendPostMessage(MessageType.MESSAGE, messageUrl, json.toString());
-          if (connectionParameters.loopback) {
-            events.onRemoteIceCandidate(candidate);
-          }
-        } else {
-          // Call receiver sends ice candidates to websocket server.
-          wsClient.send(json.toString());
-        }
-      }
-    });
-  }
-
-  // Send removed Ice candidates to the other participant.
-  @Override
-  public void sendLocalIceCandidateRemovals(final IceCandidate[] candidates) {
-    handler.post(new Runnable() {
-      @Override
-      public void run() {
-        JSONObject json = new JSONObject();
-        jsonPut(json, "type", "remove-candidates");
-        JSONArray jsonArray = new JSONArray();
-        for (final IceCandidate candidate : candidates) {
-          jsonArray.put(toJsonCandidate(candidate));
-        }
-        jsonPut(json, "candidates", jsonArray);
-        if (initiator) {
-          // Call initiator sends ice candidates to GAE server.
-          if (roomState != ConnectionState.CONNECTED) {
-            reportError("Sending ICE candidate removals in non connected state.");
-            return;
-          }
-          sendPostMessage(MessageType.MESSAGE, messageUrl, json.toString());
-          if (connectionParameters.loopback) {
-            events.onRemoteIceCandidatesRemoved(candidates);
-          }
-        } else {
-          // Call receiver sends ice candidates to websocket server.
-          wsClient.send(json.toString());
-        }
-      }
-    });
-  }
-
-  // --------------------------------------------------------------------
-  // WebSocketChannelEvents interface implementation.
-  // All events are called by WebSocketChannelClient on a local looper thread
-  // (passed to WebSocket client constructor).
-  @Override
-  public void onWebSocketMessage(final String msg) {
-    if (wsClient.getState() != WebSocketConnectionState.REGISTERED) {
-      Log.e(TAG, "Got WebSocket message in non registered state.");
-      return;
-    }
-    try {
-      JSONObject json = new JSONObject(msg);
-      String msgText = json.getString("msg");
-      String errorText = json.optString("error");
-      if (msgText.length() > 0) {
-        json = new JSONObject(msgText);
-        String type = json.optString("type");
-        if (type.equals("candidate")) {
-          events.onRemoteIceCandidate(toJavaCandidate(json));
-        } else if (type.equals("remove-candidates")) {
-          JSONArray candidateArray = json.getJSONArray("candidates");
-          IceCandidate[] candidates = new IceCandidate[candidateArray.length()];
-          for (int i = 0; i < candidateArray.length(); ++i) {
-            candidates[i] = toJavaCandidate(candidateArray.getJSONObject(i));
-          }
-          events.onRemoteIceCandidatesRemoved(candidates);
-        } else if (type.equals("answer")) {
-          if (initiator) {
-            SessionDescription sdp = new SessionDescription(
-                SessionDescription.Type.fromCanonicalForm(type), json.getString("sdp"));
-            events.onRemoteDescription(sdp);
-          } else {
-            reportError("Received answer for call initiator: " + msg);
-          }
-        } else if (type.equals("offer")) {
-          if (!initiator) {
-            SessionDescription sdp = new SessionDescription(
-                SessionDescription.Type.fromCanonicalForm(type), json.getString("sdp"));
-            events.onRemoteDescription(sdp);
-          } else {
-            reportError("Received offer for call receiver: " + msg);
-          }
-        } else if (type.equals("bye")) {
-          events.onChannelClose();
-        } else {
-          reportError("Unexpected WebSocket message: " + msg);
-        }
-      } else {
-        if (errorText != null && errorText.length() > 0) {
-          reportError("WebSocket error message: " + errorText);
-        } else {
-          reportError("Unexpected WebSocket message: " + msg);
-        }
-      }
-    } catch (JSONException e) {
-      reportError("WebSocket message JSON parsing error: " + e.toString());
-    }
-  }
-
-  @Override
-  public void onWebSocketClose() {
-    events.onChannelClose();
-  }
-
-  @Override
-  public void onWebSocketError(String description) {
-    reportError("WebSocket error: " + description);
-  }
-
-  // --------------------------------------------------------------------
-  // Helper functions.
-  private void reportError(final String errorMessage) {
-    Log.e(TAG, errorMessage);
-    handler.post(new Runnable() {
-      @Override
-      public void run() {
-        if (roomState != ConnectionState.ERROR) {
-          roomState = ConnectionState.ERROR;
-          events.onChannelError(errorMessage);
-        }
-      }
-    });
-  }
-
-  // Put a |key|->|value| mapping in |json|.
-  private static void jsonPut(JSONObject json, String key, Object value) {
-    try {
-      json.put(key, value);
-    } catch (JSONException e) {
-      throw new RuntimeException(e);
-    }
-  }
-
-  // Send SDP or ICE candidate to a room server.
-  private void sendPostMessage(
-      final MessageType messageType, final String url, final String message) {
-    String logInfo = url;
-    if (message != null) {
-      logInfo += ". Message: " + message;
-    }
-    Log.d(TAG, "C->GAE: " + logInfo);
-    AsyncHttpURLConnection httpConnection =
-        new AsyncHttpURLConnection("POST", url, message, new AsyncHttpEvents() {
-          @Override
-          public void onHttpError(String errorMessage) {
-            reportError("GAE POST error: " + errorMessage);
-          }
-
-          @Override
-          public void onHttpComplete(String response) {
-            if (messageType == MessageType.MESSAGE) {
-              try {
-                JSONObject roomJson = new JSONObject(response);
-                String result = roomJson.getString("result");
-                if (!result.equals("SUCCESS")) {
-                  reportError("GAE POST error: " + result);
-                }
-              } catch (JSONException e) {
-                reportError("GAE POST JSON error: " + e.toString());
-              }
-            }
-          }
-        });
-    httpConnection.send();
-  }
-
-  // Converts a Java candidate to a JSONObject.
-  private JSONObject toJsonCandidate(final IceCandidate candidate) {
-    JSONObject json = new JSONObject();
-    jsonPut(json, "label", candidate.sdpMLineIndex);
-    jsonPut(json, "id", candidate.sdpMid);
-    jsonPut(json, "candidate", candidate.sdp);
-    return json;
-  }
-
-  // Converts a JSON candidate to a Java object.
-  IceCandidate toJavaCandidate(JSONObject json) throws JSONException {
-    return new IceCandidate(
-        json.getString("id"), json.getInt("label"), json.getString("candidate"));
-  }
-}
diff --git a/examples/androidapp/src/org/appspot/apprtc/util/AppRTCUtils.java b/examples/androidapp/src/org/appspot/apprtc/util/AppRTCUtils.java
deleted file mode 100644
index ee7f8c0..0000000
--- a/examples/androidapp/src/org/appspot/apprtc/util/AppRTCUtils.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- *  Copyright 2014 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.
- */
-
-package org.appspot.apprtc.util;
-
-import android.os.Build;
-import android.util.Log;
-
-/**
- * AppRTCUtils provides helper functions for managing thread safety.
- */
-public final class AppRTCUtils {
-  private AppRTCUtils() {}
-
-  /** Helper method which throws an exception  when an assertion has failed. */
-  public static void assertIsTrue(boolean condition) {
-    if (!condition) {
-      throw new AssertionError("Expected condition to be true");
-    }
-  }
-
-  /** Helper method for building a string of thread information.*/
-  public static String getThreadInfo() {
-    return "@[name=" + Thread.currentThread().getName() + ", id=" + Thread.currentThread().getId()
-        + "]";
-  }
-
-  /** Information about the current build, taken from system properties. */
-  public static void logDeviceInfo(String tag) {
-    Log.d(tag, "Android SDK: " + Build.VERSION.SDK_INT + ", "
-            + "Release: " + Build.VERSION.RELEASE + ", "
-            + "Brand: " + Build.BRAND + ", "
-            + "Device: " + Build.DEVICE + ", "
-            + "Id: " + Build.ID + ", "
-            + "Hardware: " + Build.HARDWARE + ", "
-            + "Manufacturer: " + Build.MANUFACTURER + ", "
-            + "Model: " + Build.MODEL + ", "
-            + "Product: " + Build.PRODUCT);
-  }
-}
diff --git a/examples/androidapp/src/org/appspot/apprtc/util/AsyncHttpURLConnection.java b/examples/androidapp/src/org/appspot/apprtc/util/AsyncHttpURLConnection.java
deleted file mode 100644
index 1f0b8bb..0000000
--- a/examples/androidapp/src/org/appspot/apprtc/util/AsyncHttpURLConnection.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-package org.appspot.apprtc.util;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.net.HttpURLConnection;
-import java.net.SocketTimeoutException;
-import java.net.URL;
-import java.util.Scanner;
-
-/**
- * Asynchronous http requests implementation.
- */
-public class AsyncHttpURLConnection {
-  private static final int HTTP_TIMEOUT_MS = 8000;
-  private static final String HTTP_ORIGIN = "https://appr.tc";
-  private final String method;
-  private final String url;
-  private final String message;
-  private final AsyncHttpEvents events;
-  private String contentType;
-
-  /**
-   * Http requests callbacks.
-   */
-  public interface AsyncHttpEvents {
-    void onHttpError(String errorMessage);
-    void onHttpComplete(String response);
-  }
-
-  public AsyncHttpURLConnection(String method, String url, String message, AsyncHttpEvents events) {
-    this.method = method;
-    this.url = url;
-    this.message = message;
-    this.events = events;
-  }
-
-  public void setContentType(String contentType) {
-    this.contentType = contentType;
-  }
-
-  public void send() {
-    Runnable runHttp = new Runnable() {
-      public void run() {
-        sendHttpMessage();
-      }
-    };
-    new Thread(runHttp).start();
-  }
-
-  private void sendHttpMessage() {
-    try {
-      HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
-      byte[] postData = new byte[0];
-      if (message != null) {
-        postData = message.getBytes("UTF-8");
-      }
-      connection.setRequestMethod(method);
-      connection.setUseCaches(false);
-      connection.setDoInput(true);
-      connection.setConnectTimeout(HTTP_TIMEOUT_MS);
-      connection.setReadTimeout(HTTP_TIMEOUT_MS);
-      // TODO(glaznev) - query request origin from pref_room_server_url_key preferences.
-      connection.addRequestProperty("origin", HTTP_ORIGIN);
-      boolean doOutput = false;
-      if (method.equals("POST")) {
-        doOutput = true;
-        connection.setDoOutput(true);
-        connection.setFixedLengthStreamingMode(postData.length);
-      }
-      if (contentType == null) {
-        connection.setRequestProperty("Content-Type", "text/plain; charset=utf-8");
-      } else {
-        connection.setRequestProperty("Content-Type", contentType);
-      }
-
-      // Send POST request.
-      if (doOutput && postData.length > 0) {
-        OutputStream outStream = connection.getOutputStream();
-        outStream.write(postData);
-        outStream.close();
-      }
-
-      // Get response.
-      int responseCode = connection.getResponseCode();
-      if (responseCode != 200) {
-        events.onHttpError("Non-200 response to " + method + " to URL: " + url + " : "
-            + connection.getHeaderField(null));
-        connection.disconnect();
-        return;
-      }
-      InputStream responseStream = connection.getInputStream();
-      String response = drainStream(responseStream);
-      responseStream.close();
-      connection.disconnect();
-      events.onHttpComplete(response);
-    } catch (SocketTimeoutException e) {
-      events.onHttpError("HTTP " + method + " to " + url + " timeout");
-    } catch (IOException e) {
-      events.onHttpError("HTTP " + method + " to " + url + " error: " + e.getMessage());
-    }
-  }
-
-  // Return the contents of an InputStream as a String.
-  private static String drainStream(InputStream in) {
-    Scanner s = new Scanner(in).useDelimiter("\\A");
-    return s.hasNext() ? s.next() : "";
-  }
-}
diff --git a/examples/androidapp/start_loopback_stubbed_camera_saved_video_out.py b/examples/androidapp/start_loopback_stubbed_camera_saved_video_out.py
deleted file mode 100644
index 491af38..0000000
--- a/examples/androidapp/start_loopback_stubbed_camera_saved_video_out.py
+++ /dev/null
@@ -1,124 +0,0 @@
-# Copyright (c) 2015 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.
-
-from optparse import OptionParser
-import random
-import string
-import subprocess
-import sys
-import time
-
-from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice
-
-def main():
-  parser = OptionParser()
-
-  parser.add_option('--devname', dest='devname', help='The device id')
-
-  parser.add_option(
-      '--videooutsave',
-      dest='videooutsave',
-      help='The path where to save the video out file on local computer')
-
-  parser.add_option(
-      '--videoout',
-      dest='videoout',
-      help='The path where to put the video out file')
-
-  parser.add_option(
-      '--videoout_width',
-      dest='videoout_width',
-      type='int',
-      help='The width for the video out file')
-
-  parser.add_option(
-      '--videoout_height',
-      dest='videoout_height',
-      type='int',
-      help='The height for the video out file')
-
-  parser.add_option(
-      '--videoin',
-      dest='videoin',
-      help='The path where to read input file instead of camera')
-
-  parser.add_option(
-      '--call_length',
-      dest='call_length',
-      type='int',
-      help='The length of the call')
-
-  (options, args) = parser.parse_args()
-
-  print (options, args)
-
-  devname = options.devname
-
-  videoin = options.videoin
-
-  videoout = options.videoout
-  videoout_width = options.videoout_width
-  videoout_height = options.videoout_height
-
-  videooutsave = options.videooutsave
-
-  call_length = options.call_length or 10
-
-  room = ''.join(random.choice(string.ascii_letters + string.digits)
-      for _ in range(8))
-
-  # Delete output video file.
-  if videoout:
-    subprocess.check_call(['adb', '-s', devname, 'shell', 'rm', '-f',
-        videoout])
-
-  device = MonkeyRunner.waitForConnection(2, devname)
-
-  extras = {
-      'org.appspot.apprtc.USE_VALUES_FROM_INTENT': True,
-      'org.appspot.apprtc.AUDIOCODEC': 'OPUS',
-      'org.appspot.apprtc.LOOPBACK': True,
-      'org.appspot.apprtc.VIDEOCODEC': 'VP8',
-      'org.appspot.apprtc.CAPTURETOTEXTURE': False,
-      'org.appspot.apprtc.CAMERA2': False,
-      'org.appspot.apprtc.ROOMID': room}
-
-  if videoin:
-    extras.update({'org.appspot.apprtc.VIDEO_FILE_AS_CAMERA': videoin})
-
-  if videoout:
-    extras.update({
-        'org.appspot.apprtc.SAVE_REMOTE_VIDEO_TO_FILE': videoout,
-        'org.appspot.apprtc.SAVE_REMOTE_VIDEO_TO_FILE_WIDTH': videoout_width,
-        'org.appspot.apprtc.SAVE_REMOTE_VIDEO_TO_FILE_HEIGHT': videoout_height})
-
-  print extras
-
-  device.startActivity(data='https://appr.tc',
-      action='android.intent.action.VIEW',
-      component='org.appspot.apprtc/.ConnectActivity', extras=extras)
-
-  print 'Running a call for %d seconds' % call_length
-  for _ in xrange(call_length):
-    sys.stdout.write('.')
-    sys.stdout.flush()
-    time.sleep(1)
-  print '\nEnding call.'
-
-  # Press back to end the call. Will end on both sides.
-  device.press('KEYCODE_BACK', MonkeyDevice.DOWN_AND_UP)
-
-  if videooutsave:
-    time.sleep(2)
-
-    subprocess.check_call(['adb', '-s', devname, 'pull',
-        videoout, videooutsave])
-
-if __name__ == '__main__':
-  main()
-
diff --git a/examples/androidapp/third_party/autobanh/BUILD.gn b/examples/androidapp/third_party/autobanh/BUILD.gn
deleted file mode 100644
index d5f6b0f..0000000
--- a/examples/androidapp/third_party/autobanh/BUILD.gn
+++ /dev/null
@@ -1,13 +0,0 @@
-# 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.
-
-import("//build/config/android/rules.gni")
-
-android_java_prebuilt("autobanh_java") {
-  jar_path = "lib/autobanh.jar"
-}
diff --git a/examples/androidapp/third_party/autobanh/LICENSE b/examples/androidapp/third_party/autobanh/LICENSE
deleted file mode 100644
index f433b1a..0000000
--- a/examples/androidapp/third_party/autobanh/LICENSE
+++ /dev/null
@@ -1,177 +0,0 @@
-
-                                 Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
diff --git a/examples/androidapp/third_party/autobanh/LICENSE.md b/examples/androidapp/third_party/autobanh/LICENSE.md
deleted file mode 100644
index 2079e90..0000000
--- a/examples/androidapp/third_party/autobanh/LICENSE.md
+++ /dev/null
@@ -1,21 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2014 Cameron Lowell Palmer
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
diff --git a/examples/androidapp/third_party/autobanh/NOTICE b/examples/androidapp/third_party/autobanh/NOTICE
deleted file mode 100644
index 91ed7df..0000000
--- a/examples/androidapp/third_party/autobanh/NOTICE
+++ /dev/null
@@ -1,3 +0,0 @@
-AutobahnAndroid
-Copyright 2011,2012 Tavendo GmbH. Licensed under Apache 2.0
-This product includes software developed at Tavendo GmbH http://www.tavendo.de
diff --git a/examples/androidapp/third_party/autobanh/lib/autobanh.jar b/examples/androidapp/third_party/autobanh/lib/autobanh.jar
deleted file mode 100644
index 5a10b7f..0000000
--- a/examples/androidapp/third_party/autobanh/lib/autobanh.jar
+++ /dev/null
Binary files differ
diff --git a/examples/androidjunit/README b/examples/androidjunit/README
deleted file mode 100644
index 1753f50..0000000
--- a/examples/androidjunit/README
+++ /dev/null
@@ -1,8 +0,0 @@
-This directory contains example JUnit tests for Android AppRTCMobile.
-Many of these test utilize Robolectric to mock Android classes.
-
-To compile:
-ninja -C out/Debug android_junit_tests
-
-To run:
-out/Debug/bin/run_android_junit_tests
diff --git a/examples/androidjunit/src/org/appspot/apprtc/BluetoothManagerTest.java b/examples/androidjunit/src/org/appspot/apprtc/BluetoothManagerTest.java
deleted file mode 100644
index 0d077f3..0000000
--- a/examples/androidjunit/src/org/appspot/apprtc/BluetoothManagerTest.java
+++ /dev/null
@@ -1,271 +0,0 @@
-/*
- *  Copyright 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.
- */
-
-package org.appspot.apprtc;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-import static org.mockito.Mockito.doCallRealMethod;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import android.bluetooth.BluetoothAdapter;
-import android.bluetooth.BluetoothDevice;
-import android.bluetooth.BluetoothHeadset;
-import android.bluetooth.BluetoothProfile;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.media.AudioManager;
-import android.util.Log;
-import java.util.LinkedList;
-import java.util.List;
-import org.appspot.apprtc.AppRTCBluetoothManager.State;
-import org.chromium.testing.local.LocalRobolectricTestRunner;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.annotation.Config;
-import org.robolectric.shadows.ShadowApplication;
-import org.robolectric.shadows.ShadowLog;
-
-/**
- * Verifies basic behavior of the AppRTCBluetoothManager class.
- * Note that the test object uses an AppRTCAudioManager (injected in ctor),
- * but a mocked version is used instead. Hence, the parts "driven" by the AppRTC
- * audio manager are not included in this test.
- */
-@RunWith(LocalRobolectricTestRunner.class)
-@Config(manifest = Config.NONE)
-public class BluetoothManagerTest {
-  private static final String TAG = "BluetoothManagerTest";
-  private static final String BLUETOOTH_TEST_DEVICE_NAME = "BluetoothTestDevice";
-
-  private BroadcastReceiver bluetoothHeadsetStateReceiver;
-  private BluetoothProfile.ServiceListener bluetoothServiceListener;
-  private BluetoothHeadset mockedBluetoothHeadset;
-  private BluetoothDevice mockedBluetoothDevice;
-  private List<BluetoothDevice> mockedBluetoothDeviceList;
-  private AppRTCBluetoothManager bluetoothManager;
-  private AppRTCAudioManager mockedAppRtcAudioManager;
-  private AudioManager mockedAudioManager;
-  private Context context;
-
-  @Before
-  public void setUp() {
-    ShadowLog.stream = System.out;
-    context = ShadowApplication.getInstance().getApplicationContext();
-    mockedAppRtcAudioManager = mock(AppRTCAudioManager.class);
-    mockedAudioManager = mock(AudioManager.class);
-    mockedBluetoothHeadset = mock(BluetoothHeadset.class);
-    mockedBluetoothDevice = mock(BluetoothDevice.class);
-    mockedBluetoothDeviceList = new LinkedList<BluetoothDevice>();
-
-    // Simulate that bluetooth SCO audio is available by default.
-    when(mockedAudioManager.isBluetoothScoAvailableOffCall()).thenReturn(true);
-
-    // Create the test object and override protected methods for this test.
-    bluetoothManager = new AppRTCBluetoothManager(context, mockedAppRtcAudioManager) {
-      @Override
-      protected AudioManager getAudioManager(Context context) {
-        Log.d(TAG, "getAudioManager");
-        return mockedAudioManager;
-      }
-
-      @Override
-      protected void registerReceiver(BroadcastReceiver receiver, IntentFilter filter) {
-        Log.d(TAG, "registerReceiver");
-        if (filter.hasAction(BluetoothHeadset.ACTION_CONNECTION_STATE_CHANGED)
-            && filter.hasAction(BluetoothHeadset.ACTION_AUDIO_STATE_CHANGED)) {
-          // Gives access to the real broadcast receiver so the test can use it.
-          bluetoothHeadsetStateReceiver = receiver;
-        }
-      }
-
-      @Override
-      protected void unregisterReceiver(BroadcastReceiver receiver) {
-        Log.d(TAG, "unregisterReceiver");
-        if (receiver == bluetoothHeadsetStateReceiver) {
-          bluetoothHeadsetStateReceiver = null;
-        }
-      }
-
-      @Override
-      protected boolean getBluetoothProfileProxy(
-          Context context, BluetoothProfile.ServiceListener listener, int profile) {
-        Log.d(TAG, "getBluetoothProfileProxy");
-        if (profile == BluetoothProfile.HEADSET) {
-          // Allows the test to access the real Bluetooth service listener object.
-          bluetoothServiceListener = listener;
-        }
-        return true;
-      }
-
-      @Override
-      protected boolean hasPermission(Context context, String permission) {
-        Log.d(TAG, "hasPermission(" + permission + ")");
-        // Ensure that the client asks for Bluetooth permission.
-        return (permission == android.Manifest.permission.BLUETOOTH);
-      }
-
-      @Override
-      protected void logBluetoothAdapterInfo(BluetoothAdapter localAdapter) {
-        // Do nothing in tests. No need to mock BluetoothAdapter.
-      }
-    };
-  }
-
-  // Verify that Bluetooth service listener for headset profile is properly initialized.
-  @Test
-  public void testBluetoothServiceListenerInitialized() {
-    bluetoothManager.start();
-    assertNotNull(bluetoothServiceListener);
-    verify(mockedAppRtcAudioManager, never()).updateAudioDeviceState();
-  }
-
-  // Verify that broadcast receivers for Bluetooth SCO audio state and Bluetooth headset state
-  // are properly registered and unregistered.
-  @Test
-  public void testBluetoothBroadcastReceiversAreRegistered() {
-    bluetoothManager.start();
-    assertNotNull(bluetoothHeadsetStateReceiver);
-    bluetoothManager.stop();
-    assertNull(bluetoothHeadsetStateReceiver);
-  }
-
-  // Verify that the Bluetooth manager starts and stops with correct states.
-  @Test
-  public void testBluetoothDefaultStartStopStates() {
-    bluetoothManager.start();
-    assertEquals(bluetoothManager.getState(), State.HEADSET_UNAVAILABLE);
-    bluetoothManager.stop();
-    assertEquals(bluetoothManager.getState(), State.UNINITIALIZED);
-  }
-
-  // Verify correct state after receiving BluetoothServiceListener.onServiceConnected()
-  // when no BT device is enabled.
-  @Test
-  public void testBluetoothServiceListenerConnectedWithNoHeadset() {
-    bluetoothManager.start();
-    assertEquals(bluetoothManager.getState(), State.HEADSET_UNAVAILABLE);
-    simulateBluetoothServiceConnectedWithNoConnectedHeadset();
-    verify(mockedAppRtcAudioManager, times(1)).updateAudioDeviceState();
-    assertEquals(bluetoothManager.getState(), State.HEADSET_UNAVAILABLE);
-  }
-
-  // Verify correct state after receiving BluetoothServiceListener.onServiceConnected()
-  // when one emulated (test) BT device is enabled. Android does not support more than
-  // one connected BT headset.
-  @Test
-  public void testBluetoothServiceListenerConnectedWithHeadset() {
-    bluetoothManager.start();
-    assertEquals(bluetoothManager.getState(), State.HEADSET_UNAVAILABLE);
-    simulateBluetoothServiceConnectedWithConnectedHeadset();
-    verify(mockedAppRtcAudioManager, times(1)).updateAudioDeviceState();
-    assertEquals(bluetoothManager.getState(), State.HEADSET_AVAILABLE);
-  }
-
-  // Verify correct state after receiving BluetoothProfile.ServiceListener.onServiceDisconnected().
-  @Test
-  public void testBluetoothServiceListenerDisconnected() {
-    bluetoothManager.start();
-    assertEquals(bluetoothManager.getState(), State.HEADSET_UNAVAILABLE);
-    simulateBluetoothServiceDisconnected();
-    verify(mockedAppRtcAudioManager, times(1)).updateAudioDeviceState();
-    assertEquals(bluetoothManager.getState(), State.HEADSET_UNAVAILABLE);
-  }
-
-  // Verify correct state after BluetoothServiceListener.onServiceConnected() and
-  // the intent indicating that the headset is actually connected. Both these callbacks
-  // results in calls to updateAudioDeviceState() on the AppRTC audio manager.
-  // No BT SCO is enabled here to keep the test limited.
-  @Test
-  public void testBluetoothHeadsetConnected() {
-    bluetoothManager.start();
-    assertEquals(bluetoothManager.getState(), State.HEADSET_UNAVAILABLE);
-    simulateBluetoothServiceConnectedWithConnectedHeadset();
-    simulateBluetoothHeadsetConnected();
-    verify(mockedAppRtcAudioManager, times(2)).updateAudioDeviceState();
-    assertEquals(bluetoothManager.getState(), State.HEADSET_AVAILABLE);
-  }
-
-  // Verify correct state sequence for a case when a BT headset is available,
-  // followed by BT SCO audio being enabled and then stopped.
-  @Test
-  public void testBluetoothScoAudioStartAndStop() {
-    bluetoothManager.start();
-    assertEquals(bluetoothManager.getState(), State.HEADSET_UNAVAILABLE);
-    simulateBluetoothServiceConnectedWithConnectedHeadset();
-    assertEquals(bluetoothManager.getState(), State.HEADSET_AVAILABLE);
-    bluetoothManager.startScoAudio();
-    assertEquals(bluetoothManager.getState(), State.SCO_CONNECTING);
-    simulateBluetoothScoConnectionConnected();
-    assertEquals(bluetoothManager.getState(), State.SCO_CONNECTED);
-    bluetoothManager.stopScoAudio();
-    simulateBluetoothScoConnectionDisconnected();
-    assertEquals(bluetoothManager.getState(), State.SCO_DISCONNECTING);
-    bluetoothManager.stop();
-    assertEquals(bluetoothManager.getState(), State.UNINITIALIZED);
-    verify(mockedAppRtcAudioManager, times(3)).updateAudioDeviceState();
-  }
-
-  /**
-   * Private helper methods.
-   */
-  private void simulateBluetoothServiceConnectedWithNoConnectedHeadset() {
-    mockedBluetoothDeviceList.clear();
-    when(mockedBluetoothHeadset.getConnectedDevices()).thenReturn(mockedBluetoothDeviceList);
-    bluetoothServiceListener.onServiceConnected(BluetoothProfile.HEADSET, mockedBluetoothHeadset);
-    // In real life, the AppRTC audio manager makes this call.
-    bluetoothManager.updateDevice();
-  }
-
-  private void simulateBluetoothServiceConnectedWithConnectedHeadset() {
-    mockedBluetoothDeviceList.clear();
-    mockedBluetoothDeviceList.add(mockedBluetoothDevice);
-    when(mockedBluetoothHeadset.getConnectedDevices()).thenReturn(mockedBluetoothDeviceList);
-    when(mockedBluetoothDevice.getName()).thenReturn(BLUETOOTH_TEST_DEVICE_NAME);
-    bluetoothServiceListener.onServiceConnected(BluetoothProfile.HEADSET, mockedBluetoothHeadset);
-    // In real life, the AppRTC audio manager makes this call.
-    bluetoothManager.updateDevice();
-  }
-
-  private void simulateBluetoothServiceDisconnected() {
-    bluetoothServiceListener.onServiceDisconnected(BluetoothProfile.HEADSET);
-  }
-
-  private void simulateBluetoothHeadsetConnected() {
-    Intent intent = new Intent();
-    intent.setAction(BluetoothHeadset.ACTION_CONNECTION_STATE_CHANGED);
-    intent.putExtra(BluetoothHeadset.EXTRA_STATE, BluetoothHeadset.STATE_CONNECTED);
-    bluetoothHeadsetStateReceiver.onReceive(context, intent);
-  }
-
-  private void simulateBluetoothScoConnectionConnected() {
-    Intent intent = new Intent();
-    intent.setAction(BluetoothHeadset.ACTION_AUDIO_STATE_CHANGED);
-    intent.putExtra(BluetoothHeadset.EXTRA_STATE, BluetoothHeadset.STATE_AUDIO_CONNECTED);
-    bluetoothHeadsetStateReceiver.onReceive(context, intent);
-  }
-
-  private void simulateBluetoothScoConnectionDisconnected() {
-    Intent intent = new Intent();
-    intent.setAction(BluetoothHeadset.ACTION_AUDIO_STATE_CHANGED);
-    intent.putExtra(BluetoothHeadset.EXTRA_STATE, BluetoothHeadset.STATE_AUDIO_DISCONNECTED);
-    bluetoothHeadsetStateReceiver.onReceive(context, intent);
-  }
-}
diff --git a/examples/androidjunit/src/org/appspot/apprtc/DirectRTCClientTest.java b/examples/androidjunit/src/org/appspot/apprtc/DirectRTCClientTest.java
deleted file mode 100644
index 2da8164..0000000
--- a/examples/androidjunit/src/org/appspot/apprtc/DirectRTCClientTest.java
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
- *  Copyright 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.
- */
-
-package org.appspot.apprtc;
-
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.isNotNull;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.timeout;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyNoMoreInteractions;
-
-import org.chromium.testing.local.LocalRobolectricTestRunner;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.annotation.Config;
-import org.robolectric.shadows.ShadowLog;
-import org.webrtc.IceCandidate;
-import org.webrtc.SessionDescription;
-
-/**
- * Test for DirectRTCClient. Test is very simple and only tests the overall sanity of the class
- * behaviour.
- */
-@RunWith(LocalRobolectricTestRunner.class)
-@Config(manifest = Config.NONE)
-public class DirectRTCClientTest {
-  private static final String ROOM_URL = "";
-  private static final boolean LOOPBACK = false;
-
-  private static final String DUMMY_SDP_MID = "sdpMid";
-  private static final String DUMMY_SDP = "sdp";
-
-  public static final int SERVER_WAIT = 100;
-  public static final int NETWORK_TIMEOUT = 1000;
-
-  private DirectRTCClient client;
-  private DirectRTCClient server;
-
-  AppRTCClient.SignalingEvents clientEvents;
-  AppRTCClient.SignalingEvents serverEvents;
-
-  @Before
-  public void setUp() {
-    ShadowLog.stream = System.out;
-
-    clientEvents = mock(AppRTCClient.SignalingEvents.class);
-    serverEvents = mock(AppRTCClient.SignalingEvents.class);
-
-    client = new DirectRTCClient(clientEvents);
-    server = new DirectRTCClient(serverEvents);
-  }
-
-  @Test
-  public void testValidIpPattern() {
-    // Strings that should match the pattern.
-    // clang-format off
-    final String[] ipAddresses = new String[] {
-        "0.0.0.0",
-        "127.0.0.1",
-        "192.168.0.1",
-        "0.0.0.0:8888",
-        "127.0.0.1:8888",
-        "192.168.0.1:8888",
-        "::",
-        "::1",
-        "2001:0db8:85a3:0000:0000:8a2e:0370:7946",
-        "[::]",
-        "[::1]",
-        "[2001:0db8:85a3:0000:0000:8a2e:0370:7946]",
-        "[::]:8888",
-        "[::1]:8888",
-        "[2001:0db8:85a3:0000:0000:8a2e:0370:7946]:8888"
-    };
-    // clang-format on
-
-    for (String ip : ipAddresses) {
-      assertTrue(ip + " didn't match IP_PATTERN even though it should.",
-          DirectRTCClient.IP_PATTERN.matcher(ip).matches());
-    }
-  }
-
-  @Test
-  public void testInvalidIpPattern() {
-    // Strings that shouldn't match the pattern.
-    // clang-format off
-    final String[] invalidIpAddresses = new String[] {
-        "Hello, World!",
-        "aaaa",
-        "1111",
-        "[hello world]",
-        "hello:world"
-    };
-    // clang-format on
-
-    for (String invalidIp : invalidIpAddresses) {
-      assertFalse(invalidIp + " matched IP_PATTERN even though it shouldn't.",
-          DirectRTCClient.IP_PATTERN.matcher(invalidIp).matches());
-    }
-  }
-
-  // TODO(sakal): Replace isNotNull(class) with isNotNull() once Java 8 is used.
-  @SuppressWarnings("deprecation")
-  @Test
-  public void testDirectRTCClient() {
-    server.connectToRoom(new AppRTCClient.RoomConnectionParameters(ROOM_URL, "0.0.0.0", LOOPBACK));
-    try {
-      Thread.sleep(SERVER_WAIT);
-    } catch (InterruptedException e) {
-      fail(e.getMessage());
-    }
-    client.connectToRoom(
-        new AppRTCClient.RoomConnectionParameters(ROOM_URL, "127.0.0.1", LOOPBACK));
-    verify(serverEvents, timeout(NETWORK_TIMEOUT))
-        .onConnectedToRoom(any(AppRTCClient.SignalingParameters.class));
-
-    SessionDescription offerSdp = new SessionDescription(SessionDescription.Type.OFFER, DUMMY_SDP);
-    server.sendOfferSdp(offerSdp);
-    verify(clientEvents, timeout(NETWORK_TIMEOUT))
-        .onConnectedToRoom(any(AppRTCClient.SignalingParameters.class));
-
-    SessionDescription answerSdp =
-        new SessionDescription(SessionDescription.Type.ANSWER, DUMMY_SDP);
-    client.sendAnswerSdp(answerSdp);
-    verify(serverEvents, timeout(NETWORK_TIMEOUT))
-        .onRemoteDescription(isNotNull(SessionDescription.class));
-
-    IceCandidate candidate = new IceCandidate(DUMMY_SDP_MID, 0, DUMMY_SDP);
-    server.sendLocalIceCandidate(candidate);
-    verify(clientEvents, timeout(NETWORK_TIMEOUT))
-        .onRemoteIceCandidate(isNotNull(IceCandidate.class));
-
-    client.sendLocalIceCandidate(candidate);
-    verify(serverEvents, timeout(NETWORK_TIMEOUT))
-        .onRemoteIceCandidate(isNotNull(IceCandidate.class));
-
-    client.disconnectFromRoom();
-    verify(clientEvents, timeout(NETWORK_TIMEOUT)).onChannelClose();
-    verify(serverEvents, timeout(NETWORK_TIMEOUT)).onChannelClose();
-
-    verifyNoMoreInteractions(clientEvents);
-    verifyNoMoreInteractions(serverEvents);
-  }
-}
diff --git a/examples/androidjunit/src/org/appspot/apprtc/TCPChannelClientTest.java b/examples/androidjunit/src/org/appspot/apprtc/TCPChannelClientTest.java
deleted file mode 100644
index 61ffa02..0000000
--- a/examples/androidjunit/src/org/appspot/apprtc/TCPChannelClientTest.java
+++ /dev/null
@@ -1,203 +0,0 @@
-/*
- *  Copyright 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.
- */
-
-package org.appspot.apprtc;
-
-import static org.junit.Assert.fail;
-import static org.mockito.Mockito.timeout;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyNoMoreInteractions;
-
-import org.chromium.base.test.util.DisabledTest;
-import org.chromium.testing.local.LocalRobolectricTestRunner;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.robolectric.annotation.Config;
-import org.robolectric.shadows.ShadowLog;
-
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.TimeUnit;
-
-@RunWith(LocalRobolectricTestRunner.class)
-@Config(manifest = Config.NONE)
-public class TCPChannelClientTest {
-  private static final int PORT = 8888;
-  /**
-   * How long we wait before trying to connect to the server. Chosen quite arbitrarily and
-   * could be made smaller if need be.
-   */
-  private static final int SERVER_WAIT = 10;
-  private static final int CONNECT_TIMEOUT = 100;
-  private static final int SEND_TIMEOUT = 100;
-  private static final int DISCONNECT_TIMEOUT = 100;
-  private static final int TERMINATION_TIMEOUT = 1000;
-  private static final String TEST_MESSAGE_SERVER = "Hello, Server!";
-  private static final String TEST_MESSAGE_CLIENT = "Hello, Client!";
-
-  @Mock TCPChannelClient.TCPChannelEvents serverEvents;
-  @Mock TCPChannelClient.TCPChannelEvents clientEvents;
-
-  private ExecutorService executor;
-  private TCPChannelClient server;
-  private TCPChannelClient client;
-
-  @Before
-  public void setUp() {
-    ShadowLog.stream = System.out;
-
-    MockitoAnnotations.initMocks(this);
-
-    executor = Executors.newSingleThreadExecutor();
-  }
-
-  @After
-  public void tearDown() {
-    verifyNoMoreEvents();
-
-    executeAndWait(new Runnable() {
-      @Override
-      public void run() {
-        client.disconnect();
-        server.disconnect();
-      }
-    });
-
-    // Stop the executor thread
-    executor.shutdown();
-    try {
-      executor.awaitTermination(TERMINATION_TIMEOUT, TimeUnit.MILLISECONDS);
-    } catch (InterruptedException e) {
-      fail(e.getMessage());
-    }
-  }
-
-  @Test
-  public void testConnectIPv4() {
-    setUpIPv4Server();
-    try {
-      Thread.sleep(SERVER_WAIT);
-    } catch (InterruptedException e) {
-      fail(e.getMessage());
-    }
-    setUpIPv4Client();
-
-    verify(serverEvents, timeout(CONNECT_TIMEOUT)).onTCPConnected(true);
-    verify(clientEvents, timeout(CONNECT_TIMEOUT)).onTCPConnected(false);
-  }
-
-  // @Test
-  // Disabled because it fails when IPv6 is not supported on the bot.
-  // TODO(ehmaldonado): Enable when bugs.webrtc.org/6437 is fixed.
-  @DisabledTest
-  public void testConnectIPv6() {
-    setUpIPv6Server();
-    try {
-      Thread.sleep(SERVER_WAIT);
-    } catch (InterruptedException e) {
-      fail(e.getMessage());
-    }
-    setUpIPv6Client();
-
-    verify(serverEvents, timeout(CONNECT_TIMEOUT)).onTCPConnected(true);
-    verify(clientEvents, timeout(CONNECT_TIMEOUT)).onTCPConnected(false);
-  }
-
-  @Test
-  public void testSendData() {
-    testConnectIPv4();
-
-    executeAndWait(new Runnable() {
-      @Override
-      public void run() {
-        client.send(TEST_MESSAGE_SERVER);
-        server.send(TEST_MESSAGE_CLIENT);
-      }
-    });
-
-    verify(serverEvents, timeout(SEND_TIMEOUT)).onTCPMessage(TEST_MESSAGE_SERVER);
-    verify(clientEvents, timeout(SEND_TIMEOUT)).onTCPMessage(TEST_MESSAGE_CLIENT);
-  }
-
-  @Test
-  public void testDisconnectServer() {
-    testConnectIPv4();
-    executeAndWait(new Runnable() {
-      @Override
-      public void run() {
-        server.disconnect();
-      }
-    });
-
-    verify(serverEvents, timeout(DISCONNECT_TIMEOUT)).onTCPClose();
-    verify(clientEvents, timeout(DISCONNECT_TIMEOUT)).onTCPClose();
-  }
-
-  @Test
-  public void testDisconnectClient() {
-    testConnectIPv4();
-    executeAndWait(new Runnable() {
-      @Override
-      public void run() {
-        client.disconnect();
-      }
-    });
-
-    verify(serverEvents, timeout(DISCONNECT_TIMEOUT)).onTCPClose();
-    verify(clientEvents, timeout(DISCONNECT_TIMEOUT)).onTCPClose();
-  }
-
-  private void setUpIPv4Server() {
-    setUpServer("0.0.0.0", PORT);
-  }
-
-  private void setUpIPv4Client() {
-    setUpClient("127.0.0.1", PORT);
-  }
-
-  private void setUpIPv6Server() {
-    setUpServer("::", PORT);
-  }
-
-  private void setUpIPv6Client() {
-    setUpClient("::1", PORT);
-  }
-
-  private void setUpServer(String ip, int port) {
-    server = new TCPChannelClient(executor, serverEvents, ip, port);
-  }
-
-  private void setUpClient(String ip, int port) {
-    client = new TCPChannelClient(executor, clientEvents, ip, port);
-  }
-
-  /**
-   * Verifies no more server or client events have been issued
-   */
-  private void verifyNoMoreEvents() {
-    verifyNoMoreInteractions(serverEvents);
-    verifyNoMoreInteractions(clientEvents);
-  }
-
-  /**
-   * Queues runnable to be run and waits for it to be executed by the executor thread
-   */
-  public void executeAndWait(Runnable runnable) {
-    try {
-      executor.submit(runnable).get();
-    } catch (Exception e) {
-      fail(e.getMessage());
-    }
-  }
-}
diff --git a/examples/androidtests/AndroidManifest.xml b/examples/androidtests/AndroidManifest.xml
deleted file mode 100644
index 7ce02dc..0000000
--- a/examples/androidtests/AndroidManifest.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<!--
- *  Copyright 2017 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.
--->
-
-<manifest
-      xmlns:android="http://schemas.android.com/apk/res/android"
-      xmlns:tools="http://schemas.android.com/tools"
-      package="org.appspot.apprtc.test">
-
-    <uses-permission android:name="android.permission.RUN_INSTRUMENTATION" />
-    <uses-sdk android:minSdkVersion="13" android:targetSdkVersion="21" />
-
-    <application>
-        <uses-library android:name="android.test.runner" />
-    </application>
-
-    <!-- tools:ignore needed for chromium-junit4 tag. crbug.com/640116
-         TODO(sakal): Remove once the tag is no longer needed. -->
-    <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
-        tools:ignore="MissingPrefix"
-        android:targetPackage="org.appspot.apprtc"
-        android:label="Tests for AppRTCMobile"
-        chromium-junit4="true"/>
-</manifest>
diff --git a/examples/androidtests/OWNERS b/examples/androidtests/OWNERS
deleted file mode 100644
index 1894610..0000000
--- a/examples/androidtests/OWNERS
+++ /dev/null
@@ -1,3 +0,0 @@
-sakal@webrtc.org
-
-per-file *.py=kjellander@webrtc.org
diff --git a/examples/androidtests/README b/examples/androidtests/README
deleted file mode 100644
index 49ae6c8..0000000
--- a/examples/androidtests/README
+++ /dev/null
@@ -1,14 +0,0 @@
-This directory contains an example unit test for Android AppRTCMobile.
-
-Example of building & using the app:
-
-- Build Android AppRTCMobile and AppRTCMobile unit test:
-cd <path/to/webrtc>/src
-ninja -C out/Debug AppRTCMobileTest
-
-- Install AppRTCMobile and AppRTCMobileTest:
-adb install -r out/Debug/apks/AppRTCMobile.apk
-adb install -r out/Debug/apks/AppRTCMobileTest.apk
-
-- Run unit tests:
-adb shell am instrument -w org.appspot.apprtc.test/android.test.InstrumentationTestRunner
\ No newline at end of file
diff --git a/examples/androidtests/ant.properties b/examples/androidtests/ant.properties
deleted file mode 100644
index ec7d042..0000000
--- a/examples/androidtests/ant.properties
+++ /dev/null
@@ -1,18 +0,0 @@
-# This file is used to override default values used by the Ant build system.
-#
-# This file must be checked into Version Control Systems, as it is
-# integral to the build system of your project.
-
-# This file is only used by the Ant script.
-
-# You can use this to override default values such as
-#  'source.dir' for the location of your java source folder and
-#  'out.dir' for the location of your output folder.
-
-# You can also use it define how the release builds are signed by declaring
-# the following properties:
-#  'key.store' for the location of your keystore and
-#  'key.alias' for the name of the key to use.
-# The password will be asked during the build when you use the 'release' target.
-
-tested.project.dir=../android
diff --git a/examples/androidtests/build.xml b/examples/androidtests/build.xml
deleted file mode 100644
index 95847b7..0000000
--- a/examples/androidtests/build.xml
+++ /dev/null
@@ -1,92 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project name="AppRTCMobileTest" default="help">
-
-    <!-- The local.properties file is created and updated by the 'android' tool.
-         It contains the path to the SDK. It should *NOT* be checked into
-         Version Control Systems. -->
-    <property file="local.properties" />
-
-    <!-- The ant.properties file can be created by you. It is only edited by the
-         'android' tool to add properties to it.
-         This is the place to change some Ant specific build properties.
-         Here are some properties you may want to change/update:
-
-         source.dir
-             The name of the source directory. Default is 'src'.
-         out.dir
-             The name of the output directory. Default is 'bin'.
-
-         For other overridable properties, look at the beginning of the rules
-         files in the SDK, at tools/ant/build.xml
-
-         Properties related to the SDK location or the project target should
-         be updated using the 'android' tool with the 'update' action.
-
-         This file is an integral part of the build system for your
-         application and should be checked into Version Control Systems.
-
-         -->
-    <property file="ant.properties" />
-
-    <!-- if sdk.dir was not set from one of the property file, then
-         get it from the ANDROID_HOME env var.
-         This must be done before we load project.properties since
-         the proguard config can use sdk.dir -->
-    <property environment="env" />
-    <condition property="sdk.dir" value="${env.ANDROID_SDK_ROOT}">
-        <isset property="env.ANDROID_SDK_ROOT" />
-    </condition>
-
-    <!-- The project.properties file is created and updated by the 'android'
-         tool, as well as ADT.
-
-         This contains project specific properties such as project target, and library
-         dependencies. Lower level build properties are stored in ant.properties
-         (or in .classpath for Eclipse projects).
-
-         This file is an integral part of the build system for your
-         application and should be checked into Version Control Systems. -->
-    <loadproperties srcFile="project.properties" />
-
-    <!-- quick check on sdk.dir -->
-    <fail
-            message="sdk.dir is missing. Make sure to generate local.properties using 'android update project' or to inject it through the ANDROID_HOME environment variable."
-            unless="sdk.dir"
-    />
-
-    <!--
-        Import per project custom build rules if present at the root of the project.
-        This is the place to put custom intermediary targets such as:
-            -pre-build
-            -pre-compile
-            -post-compile (This is typically used for code obfuscation.
-                           Compiled code location: ${out.classes.absolute.dir}
-                           If this is not done in place, override ${out.dex.input.absolute.dir})
-            -post-package
-            -post-build
-            -pre-clean
-    -->
-    <import file="custom_rules.xml" optional="true" />
-
-    <!-- Import the actual build file.
-
-         To customize existing targets, there are two options:
-         - Customize only one target:
-             - copy/paste the target into this file, *before* the
-               <import> task.
-             - customize it to your needs.
-         - Customize the whole content of build.xml
-             - copy/paste the content of the rules files (minus the top node)
-               into this file, replacing the <import> task.
-             - customize to your needs.
-
-         ***********************
-         ****** IMPORTANT ******
-         ***********************
-         In all cases you must update the value of version-tag below to read 'custom' instead of an integer,
-         in order to avoid having your file be overridden by tools such as "android update project"
-    -->
-    <!-- version-tag: 1 -->
-    <import file="${sdk.dir}/tools/ant/build.xml" />
-
-</project>
diff --git a/examples/androidtests/gradle_project_test.py b/examples/androidtests/gradle_project_test.py
deleted file mode 100644
index 1f04960..0000000
--- a/examples/androidtests/gradle_project_test.py
+++ /dev/null
@@ -1,76 +0,0 @@
-#!/usr/bin/env python
-# Copyright (c) 2017 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.
-
-"""
-This scripts tests creating an Android Studio project using the
-generate_gradle.py script and making a debug build using it.
-
-It expect to be given the webrtc output build directory as the first argument
-all other arguments are optional.
-"""
-
-import argparse
-import logging
-import os
-import shutil
-import subprocess
-import sys
-import tempfile
-
-
-SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
-SRC_DIR = os.path.normpath(os.path.join(SCRIPT_DIR, os.pardir, os.pardir,
-                                        os.pardir))
-GENERATE_GRADLE_SCRIPT = os.path.join(SRC_DIR,
-                                      'build/android/gradle/generate_gradle.py')
-GRADLEW_BIN = os.path.join(SCRIPT_DIR, 'third_party/gradle/gradlew')
-
-
-def _RunCommand(argv, cwd=SRC_DIR, **kwargs):
-  logging.info('Running %r', argv)
-  subprocess.check_call(argv, cwd=cwd, **kwargs)
-
-
-def _ParseArgs():
-  parser = argparse.ArgumentParser(
-      description='Test generating Android gradle project.')
-  parser.add_argument('build_dir_android',
-      help='The path to the build directory for Android.')
-  parser.add_argument('--project_dir',
-      help='A temporary directory to put the output.')
-
-  args = parser.parse_args()
-  return args
-
-
-def main():
-  logging.basicConfig(level=logging.INFO)
-  args = _ParseArgs()
-
-  project_dir = args.project_dir
-  if not project_dir:
-    project_dir = tempfile.mkdtemp()
-
-  output_dir = os.path.abspath(args.build_dir_android)
-  project_dir = os.path.abspath(project_dir)
-
-  try:
-    _RunCommand([GENERATE_GRADLE_SCRIPT, '--output-directory', output_dir,
-        '--target', '//webrtc/examples:AppRTCMobile',
-        '--project-dir', project_dir,
-        '--use-gradle-process-resources', '--split-projects', '--canary'])
-    _RunCommand([GRADLEW_BIN, 'assembleDebug'], project_dir)
-  finally:
-    # Do not delete temporary directory if user specified it manually.
-    if not args.project_dir:
-      shutil.rmtree(project_dir, True)
-
-
-if __name__ == '__main__':
-  sys.exit(main())
diff --git a/examples/androidtests/project.properties b/examples/androidtests/project.properties
deleted file mode 100644
index a6ca533..0000000
--- a/examples/androidtests/project.properties
+++ /dev/null
@@ -1,16 +0,0 @@
-# This file is automatically generated by Android Tools.
-# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
-#
-# This file must be checked in Version Control Systems.
-#
-# To customize properties used by the Ant build system edit
-# "ant.properties", and override values to adapt the script to your
-# project structure.
-#
-# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
-#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
-
-# Project target.
-target=android-22
-
-java.compilerargs=-Xlint:all -Werror
diff --git a/examples/androidtests/src/org/appspot/apprtc/test/CallActivityStubbedInputOutputTest.java b/examples/androidtests/src/org/appspot/apprtc/test/CallActivityStubbedInputOutputTest.java
deleted file mode 100644
index a066037..0000000
--- a/examples/androidtests/src/org/appspot/apprtc/test/CallActivityStubbedInputOutputTest.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- *  Copyright 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.
- */
-
-package org.appspot.apprtc.test;
-
-import static android.support.test.espresso.action.ViewActions.click;
-import static android.support.test.espresso.matcher.ViewMatchers.withId;
-import static android.support.test.espresso.Espresso.onView;
-
-import android.content.Context;
-import android.content.Intent;
-import android.net.Uri;
-import android.os.Environment;
-import android.support.test.espresso.IdlingPolicies;
-import android.support.test.filters.LargeTest;
-import android.support.test.rule.ActivityTestRule;
-import android.support.test.runner.AndroidJUnit4;
-import android.support.test.InstrumentationRegistry;
-import java.util.UUID;
-import java.util.concurrent.TimeUnit;
-import org.appspot.apprtc.CallActivity;
-import org.appspot.apprtc.ConnectActivity;
-import org.appspot.apprtc.R;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-/**
- * Used to start a loopback call with video input from file and video output also to file.
- * The test case is a building block in other testing for video quality.
- */
-@RunWith(AndroidJUnit4.class)
-@LargeTest
-public class CallActivityStubbedInputOutputTest {
-  private static final String TAG = "CallActivityStubbedInputOutputTest";
-
-  @Rule
-  public ActivityTestRule<CallActivity> rule = new ActivityTestRule<CallActivity>(
-      CallActivity.class) {
-    @Override
-    protected Intent getActivityIntent() {
-      Context context = InstrumentationRegistry.getContext();
-      Intent intent = new Intent("android.intent.action.VIEW", Uri.parse("http://localhost:9999"));
-
-      intent.putExtra(CallActivity.EXTRA_USE_VALUES_FROM_INTENT, true);
-
-      intent.putExtra(CallActivity.EXTRA_LOOPBACK, true);
-      intent.putExtra(CallActivity.EXTRA_AUDIOCODEC, "OPUS");
-      intent.putExtra(CallActivity.EXTRA_VIDEOCODEC, "VP8");
-      intent.putExtra(CallActivity.EXTRA_CAPTURETOTEXTURE_ENABLED, false);
-      intent.putExtra(CallActivity.EXTRA_CAMERA2, false);
-      intent.putExtra(CallActivity.EXTRA_ROOMID, UUID.randomUUID().toString().substring(0, 8));
-      // TODO false for wstls to disable https, should be option later or if URL is http
-      intent.putExtra(CallActivity.EXTRA_URLPARAMETERS,
-          "debug=loopback&ts=&wshpp=localhost:8089&wstls=false");
-
-      intent.putExtra(CallActivity.EXTRA_VIDEO_FILE_AS_CAMERA,
-          Environment.getExternalStorageDirectory().getAbsolutePath()
-              + "/chromium_tests_root/resources/reference_video_640x360_30fps.y4m");
-
-      intent.putExtra(CallActivity.EXTRA_SAVE_REMOTE_VIDEO_TO_FILE,
-          Environment.getExternalStorageDirectory().getAbsolutePath() + "/output.y4m");
-      intent.putExtra(CallActivity.EXTRA_SAVE_REMOTE_VIDEO_TO_FILE_WIDTH, 640);
-      intent.putExtra(CallActivity.EXTRA_SAVE_REMOTE_VIDEO_TO_FILE_HEIGHT, 360);
-
-      return intent;
-    }
-  };
-
-  @Test
-  public void testLoopback() throws InterruptedException {
-    // The time to write down the data during closing of the program can take a while.
-    IdlingPolicies.setMasterPolicyTimeout(240000, TimeUnit.MILLISECONDS);
-
-    // During the time we sleep it will record video.
-    Thread.sleep(8000);
-
-    // Click on hang-up button.
-    onView(withId(R.id.button_call_disconnect)).perform(click());
-  }
-}
diff --git a/examples/androidtests/src/org/appspot/apprtc/test/PeerConnectionClientTest.java b/examples/androidtests/src/org/appspot/apprtc/test/PeerConnectionClientTest.java
deleted file mode 100644
index dda16ad..0000000
--- a/examples/androidtests/src/org/appspot/apprtc/test/PeerConnectionClientTest.java
+++ /dev/null
@@ -1,683 +0,0 @@
-/*
- *  Copyright 2014 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.
- */
-
-package org.appspot.apprtc.test;
-
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-import android.os.Build;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.SmallTest;
-import android.util.Log;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.TimeUnit;
-import org.appspot.apprtc.AppRTCClient.SignalingParameters;
-import org.appspot.apprtc.PeerConnectionClient;
-import org.appspot.apprtc.PeerConnectionClient.PeerConnectionEvents;
-import org.appspot.apprtc.PeerConnectionClient.PeerConnectionParameters;
-import org.chromium.base.test.BaseJUnit4ClassRunner;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.webrtc.Camera1Enumerator;
-import org.webrtc.Camera2Enumerator;
-import org.webrtc.CameraEnumerator;
-import org.webrtc.IceCandidate;
-import org.webrtc.MediaCodecVideoEncoder;
-import org.webrtc.PeerConnection;
-import org.webrtc.PeerConnectionFactory;
-import org.webrtc.SessionDescription;
-import org.webrtc.StatsReport;
-import org.webrtc.VideoCapturer;
-import org.webrtc.VideoFrame;
-import org.webrtc.VideoRenderer;
-import org.webrtc.VideoSink;
-
-@RunWith(BaseJUnit4ClassRunner.class)
-public class PeerConnectionClientTest implements PeerConnectionEvents {
-  private static final String TAG = "RTCClientTest";
-  private static final int ICE_CONNECTION_WAIT_TIMEOUT = 10000;
-  private static final int WAIT_TIMEOUT = 7000;
-  private static final int CAMERA_SWITCH_ATTEMPTS = 3;
-  private static final int VIDEO_RESTART_ATTEMPTS = 3;
-  private static final int CAPTURE_FORMAT_CHANGE_ATTEMPTS = 3;
-  private static final int VIDEO_RESTART_TIMEOUT = 500;
-  private static final int EXPECTED_VIDEO_FRAMES = 10;
-  private static final String VIDEO_CODEC_VP8 = "VP8";
-  private static final String VIDEO_CODEC_VP9 = "VP9";
-  private static final String VIDEO_CODEC_H264 = "H264";
-  private static final int AUDIO_RUN_TIMEOUT = 1000;
-  private static final String LOCAL_RENDERER_NAME = "Local renderer";
-  private static final String REMOTE_RENDERER_NAME = "Remote renderer";
-
-  private static final int MAX_VIDEO_FPS = 30;
-  private static final int WIDTH_VGA = 640;
-  private static final int HEIGHT_VGA = 480;
-  private static final int WIDTH_QVGA = 320;
-  private static final int HEIGHT_QVGA = 240;
-
-  // The peer connection client is assumed to be thread safe in itself; the
-  // reference is written by the test thread and read by worker threads.
-  private volatile PeerConnectionClient pcClient;
-  private volatile boolean loopback;
-
-  // These are protected by their respective event objects.
-  private ExecutorService signalingExecutor;
-  private boolean isClosed;
-  private boolean isIceConnected;
-  private SessionDescription localSdp;
-  private List<IceCandidate> iceCandidates = new LinkedList<IceCandidate>();
-  private final Object localSdpEvent = new Object();
-  private final Object iceCandidateEvent = new Object();
-  private final Object iceConnectedEvent = new Object();
-  private final Object closeEvent = new Object();
-
-  // Mock renderer implementation.
-  private static class MockRenderer implements VideoRenderer.Callbacks {
-    // These are protected by 'this' since we gets called from worker threads.
-    private String rendererName;
-    private boolean renderFrameCalled = false;
-
-    // Thread-safe in itself.
-    private CountDownLatch doneRendering;
-
-    public MockRenderer(int expectedFrames, String rendererName) {
-      this.rendererName = rendererName;
-      reset(expectedFrames);
-    }
-
-    // Resets render to wait for new amount of video frames.
-    public synchronized void reset(int expectedFrames) {
-      renderFrameCalled = false;
-      doneRendering = new CountDownLatch(expectedFrames);
-    }
-
-    @Override
-    public synchronized void renderFrame(VideoRenderer.I420Frame frame) {
-      if (!renderFrameCalled) {
-        if (rendererName != null) {
-          Log.d(TAG, rendererName + " render frame: " + frame.rotatedWidth() + " x "
-                  + frame.rotatedHeight());
-        } else {
-          Log.d(TAG, "Render frame: " + frame.rotatedWidth() + " x " + frame.rotatedHeight());
-        }
-      }
-      renderFrameCalled = true;
-      VideoRenderer.renderFrameDone(frame);
-      doneRendering.countDown();
-    }
-
-    // This method shouldn't hold any locks or touch member variables since it
-    // blocks.
-    public boolean waitForFramesRendered(int timeoutMs) throws InterruptedException {
-      doneRendering.await(timeoutMs, TimeUnit.MILLISECONDS);
-      return (doneRendering.getCount() <= 0);
-    }
-  }
-
-  // Mock VideoSink implementation.
-  private static class MockSink implements VideoSink {
-    // These are protected by 'this' since we gets called from worker threads.
-    private String rendererName;
-    private boolean renderFrameCalled = false;
-
-    // Thread-safe in itself.
-    private CountDownLatch doneRendering;
-
-    public MockSink(int expectedFrames, String rendererName) {
-      this.rendererName = rendererName;
-      reset(expectedFrames);
-    }
-
-    // Resets render to wait for new amount of video frames.
-    public synchronized void reset(int expectedFrames) {
-      renderFrameCalled = false;
-      doneRendering = new CountDownLatch(expectedFrames);
-    }
-
-    @Override
-    public synchronized void onFrame(VideoFrame frame) {
-      if (!renderFrameCalled) {
-        if (rendererName != null) {
-          Log.d(TAG,
-              rendererName + " render frame: " + frame.getRotatedWidth() + " x "
-                  + frame.getRotatedHeight());
-        } else {
-          Log.d(TAG, "Render frame: " + frame.getRotatedWidth() + " x " + frame.getRotatedHeight());
-        }
-      }
-      renderFrameCalled = true;
-      doneRendering.countDown();
-    }
-
-    // This method shouldn't hold any locks or touch member variables since it
-    // blocks.
-    public boolean waitForFramesRendered(int timeoutMs) throws InterruptedException {
-      doneRendering.await(timeoutMs, TimeUnit.MILLISECONDS);
-      return (doneRendering.getCount() <= 0);
-    }
-  }
-
-  // Peer connection events implementation.
-  @Override
-  public void onLocalDescription(SessionDescription sdp) {
-    Log.d(TAG, "LocalSDP type: " + sdp.type);
-    synchronized (localSdpEvent) {
-      localSdp = sdp;
-      localSdpEvent.notifyAll();
-    }
-  }
-
-  @Override
-  public void onIceCandidate(final IceCandidate candidate) {
-    synchronized (iceCandidateEvent) {
-      Log.d(TAG, "IceCandidate #" + iceCandidates.size() + " : " + candidate.toString());
-      if (loopback) {
-        // Loopback local ICE candidate in a separate thread to avoid adding
-        // remote ICE candidate in a local ICE candidate callback.
-        signalingExecutor.execute(new Runnable() {
-          @Override
-          public void run() {
-            pcClient.addRemoteIceCandidate(candidate);
-          }
-        });
-      }
-      iceCandidates.add(candidate);
-      iceCandidateEvent.notifyAll();
-    }
-  }
-
-  @Override
-  public void onIceCandidatesRemoved(final IceCandidate[] candidates) {
-    // TODO(honghaiz): Add this for tests.
-  }
-
-  @Override
-  public void onIceConnected() {
-    Log.d(TAG, "ICE Connected");
-    synchronized (iceConnectedEvent) {
-      isIceConnected = true;
-      iceConnectedEvent.notifyAll();
-    }
-  }
-
-  @Override
-  public void onIceDisconnected() {
-    Log.d(TAG, "ICE Disconnected");
-    synchronized (iceConnectedEvent) {
-      isIceConnected = false;
-      iceConnectedEvent.notifyAll();
-    }
-  }
-
-  @Override
-  public void onPeerConnectionClosed() {
-    Log.d(TAG, "PeerConnection closed");
-    synchronized (closeEvent) {
-      isClosed = true;
-      closeEvent.notifyAll();
-    }
-  }
-
-  @Override
-  public void onPeerConnectionError(String description) {
-    fail("PC Error: " + description);
-  }
-
-  @Override
-  public void onPeerConnectionStatsReady(StatsReport[] reports) {}
-
-  // Helper wait functions.
-  private boolean waitForLocalSDP(int timeoutMs) throws InterruptedException {
-    synchronized (localSdpEvent) {
-      if (localSdp == null) {
-        localSdpEvent.wait(timeoutMs);
-      }
-      return (localSdp != null);
-    }
-  }
-
-  private boolean waitForIceCandidates(int timeoutMs) throws InterruptedException {
-    synchronized (iceCandidateEvent) {
-      if (iceCandidates.size() == 0) {
-        iceCandidateEvent.wait(timeoutMs);
-      }
-      return (iceCandidates.size() > 0);
-    }
-  }
-
-  private boolean waitForIceConnected(int timeoutMs) throws InterruptedException {
-    synchronized (iceConnectedEvent) {
-      if (!isIceConnected) {
-        iceConnectedEvent.wait(timeoutMs);
-      }
-      if (!isIceConnected) {
-        Log.e(TAG, "ICE connection failure");
-      }
-
-      return isIceConnected;
-    }
-  }
-
-  private boolean waitForPeerConnectionClosed(int timeoutMs) throws InterruptedException {
-    synchronized (closeEvent) {
-      if (!isClosed) {
-        closeEvent.wait(timeoutMs);
-      }
-      return isClosed;
-    }
-  }
-
-  PeerConnectionClient createPeerConnectionClient(MockSink localRenderer,
-      MockRenderer remoteRenderer, PeerConnectionParameters peerConnectionParameters,
-      VideoCapturer videoCapturer) {
-    List<PeerConnection.IceServer> iceServers = new LinkedList<PeerConnection.IceServer>();
-    SignalingParameters signalingParameters =
-        new SignalingParameters(iceServers, true, // iceServers, initiator.
-            null, null, null, // clientId, wssUrl, wssPostUrl.
-            null, null); // offerSdp, iceCandidates.
-
-    PeerConnectionClient client = new PeerConnectionClient();
-    PeerConnectionFactory.Options options = new PeerConnectionFactory.Options();
-    options.networkIgnoreMask = 0;
-    options.disableNetworkMonitor = true;
-    client.setPeerConnectionFactoryOptions(options);
-    client.createPeerConnectionFactory(
-        InstrumentationRegistry.getTargetContext(), peerConnectionParameters, this);
-    client.createPeerConnection(localRenderer, remoteRenderer, videoCapturer, signalingParameters);
-    client.createOffer();
-    return client;
-  }
-
-  private PeerConnectionParameters createParametersForAudioCall() {
-    PeerConnectionParameters peerConnectionParameters = new PeerConnectionParameters(
-        false, /* videoCallEnabled */
-        true, /* loopback */
-        false, /* tracing */
-        // Video codec parameters.
-        0, /* videoWidth */
-        0, /* videoHeight */
-        0, /* videoFps */
-        0, /* videoStartBitrate */
-        "", /* videoCodec */
-        true, /* videoCodecHwAcceleration */
-        false, /* videoFlexfecEnabled */
-        // Audio codec parameters.
-        0, /* audioStartBitrate */
-        "OPUS", /* audioCodec */
-        false, /* noAudioProcessing */
-        false, /* aecDump */
-        false /* useOpenSLES */, false /* disableBuiltInAEC */, false /* disableBuiltInAGC */,
-        false /* disableBuiltInNS */, false /* enableLevelControl */, false /* disableWebRtcAGC */);
-
-    return peerConnectionParameters;
-  }
-
-  private VideoCapturer createCameraCapturer(boolean captureToTexture) {
-    final boolean useCamera2 = captureToTexture
-        && Camera2Enumerator.isSupported(InstrumentationRegistry.getTargetContext());
-
-    CameraEnumerator enumerator;
-    if (useCamera2) {
-      enumerator = new Camera2Enumerator(InstrumentationRegistry.getTargetContext());
-    } else {
-      enumerator = new Camera1Enumerator(captureToTexture);
-    }
-    String deviceName = enumerator.getDeviceNames()[0];
-    return enumerator.createCapturer(deviceName, null);
-  }
-
-  private PeerConnectionParameters createParametersForVideoCall(String videoCodec) {
-    PeerConnectionParameters peerConnectionParameters = new PeerConnectionParameters(
-        true, /* videoCallEnabled */
-        true, /* loopback */
-        false, /* tracing */
-        // Video codec parameters.
-        0, /* videoWidth */
-        0, /* videoHeight */
-        0, /* videoFps */
-        0, /* videoStartBitrate */
-        videoCodec, /* videoCodec */
-        true, /* videoCodecHwAcceleration */
-        false, /* videoFlexfecEnabled */
-        // Audio codec parameters.
-        0, /* audioStartBitrate */
-        "OPUS", /* audioCodec */
-        false, /* noAudioProcessing */
-        false, /* aecDump */
-        false /* useOpenSLES */, false /* disableBuiltInAEC */, false /* disableBuiltInAGC */,
-        false /* disableBuiltInNS */, false /* enableLevelControl */, false /* disableWebRtcAGC */);
-
-    return peerConnectionParameters;
-  }
-
-  @Before
-  public void setUp() {
-    signalingExecutor = Executors.newSingleThreadExecutor();
-  }
-
-  @After
-  public void tearDown() {
-    signalingExecutor.shutdown();
-  }
-
-  @Test
-  @SmallTest
-  public void testSetLocalOfferMakesVideoFlowLocally() throws InterruptedException {
-    Log.d(TAG, "testSetLocalOfferMakesVideoFlowLocally");
-    MockSink localRenderer = new MockSink(EXPECTED_VIDEO_FRAMES, LOCAL_RENDERER_NAME);
-    pcClient = createPeerConnectionClient(localRenderer, new MockRenderer(0, null),
-        createParametersForVideoCall(VIDEO_CODEC_VP8),
-        createCameraCapturer(false /* captureToTexture */));
-
-    // Wait for local SDP and ice candidates set events.
-    assertTrue("Local SDP was not set.", waitForLocalSDP(WAIT_TIMEOUT));
-    assertTrue("ICE candidates were not generated.", waitForIceCandidates(WAIT_TIMEOUT));
-
-    // Check that local video frames were rendered.
-    assertTrue(
-        "Local video frames were not rendered.", localRenderer.waitForFramesRendered(WAIT_TIMEOUT));
-
-    pcClient.close();
-    assertTrue(
-        "PeerConnection close event was not received.", waitForPeerConnectionClosed(WAIT_TIMEOUT));
-    Log.d(TAG, "testSetLocalOfferMakesVideoFlowLocally Done.");
-  }
-
-  private void doLoopbackTest(PeerConnectionParameters parameters, VideoCapturer videoCapturer,
-      boolean decodeToTexture) throws InterruptedException {
-    loopback = true;
-    MockSink localRenderer = null;
-    MockRenderer remoteRenderer = null;
-    if (parameters.videoCallEnabled) {
-      Log.d(TAG, "testLoopback for video " + parameters.videoCodec);
-      localRenderer = new MockSink(EXPECTED_VIDEO_FRAMES, LOCAL_RENDERER_NAME);
-      remoteRenderer = new MockRenderer(EXPECTED_VIDEO_FRAMES, REMOTE_RENDERER_NAME);
-    } else {
-      Log.d(TAG, "testLoopback for audio.");
-    }
-    pcClient = createPeerConnectionClient(localRenderer, remoteRenderer, parameters, videoCapturer);
-
-    // Wait for local SDP, rename it to answer and set as remote SDP.
-    assertTrue("Local SDP was not set.", waitForLocalSDP(WAIT_TIMEOUT));
-    SessionDescription remoteSdp = new SessionDescription(
-        SessionDescription.Type.fromCanonicalForm("answer"), localSdp.description);
-    pcClient.setRemoteDescription(remoteSdp);
-
-    // Wait for ICE connection.
-    assertTrue("ICE connection failure.", waitForIceConnected(ICE_CONNECTION_WAIT_TIMEOUT));
-
-    if (parameters.videoCallEnabled) {
-      // Check that local and remote video frames were rendered.
-      assertTrue("Local video frames were not rendered.",
-          localRenderer.waitForFramesRendered(WAIT_TIMEOUT));
-      assertTrue("Remote video frames were not rendered.",
-          remoteRenderer.waitForFramesRendered(WAIT_TIMEOUT));
-    } else {
-      // For audio just sleep for 1 sec.
-      // TODO(glaznev): check how we can detect that remote audio was rendered.
-      Thread.sleep(AUDIO_RUN_TIMEOUT);
-    }
-
-    pcClient.close();
-    assertTrue(waitForPeerConnectionClosed(WAIT_TIMEOUT));
-    Log.d(TAG, "testLoopback done.");
-  }
-
-  @Test
-  @SmallTest
-  public void testLoopbackAudio() throws InterruptedException {
-    doLoopbackTest(createParametersForAudioCall(), null, false /* decodeToTexture */);
-  }
-
-  @Test
-  @SmallTest
-  public void testLoopbackVp8() throws InterruptedException {
-    doLoopbackTest(createParametersForVideoCall(VIDEO_CODEC_VP8),
-        createCameraCapturer(false /* captureToTexture */), false /* decodeToTexture */);
-  }
-
-  @Test
-  @SmallTest
-  public void testLoopbackVp9() throws InterruptedException {
-    doLoopbackTest(createParametersForVideoCall(VIDEO_CODEC_VP9),
-        createCameraCapturer(false /* captureToTexture */), false /* decodeToTexture */);
-  }
-
-  @Test
-  @SmallTest
-  public void testLoopbackH264() throws InterruptedException {
-    doLoopbackTest(createParametersForVideoCall(VIDEO_CODEC_H264),
-        createCameraCapturer(false /* captureToTexture */), false /* decodeToTexture */);
-  }
-
-  @Test
-  @SmallTest
-  public void testLoopbackVp8DecodeToTexture() throws InterruptedException {
-    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
-      Log.i(TAG, "Decode to textures is not supported, requires SDK version 19.");
-      return;
-    }
-    doLoopbackTest(createParametersForVideoCall(VIDEO_CODEC_VP8),
-        createCameraCapturer(false /* captureToTexture */), true /* decodeToTexture */);
-  }
-
-  @Test
-  @SmallTest
-  public void testLoopbackVp9DecodeToTexture() throws InterruptedException {
-    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
-      Log.i(TAG, "Decode to textures is not supported, requires SDK version 19.");
-      return;
-    }
-    doLoopbackTest(createParametersForVideoCall(VIDEO_CODEC_VP9),
-        createCameraCapturer(false /* captureToTexture */), true /* decodeToTexture */);
-  }
-
-  @Test
-  @SmallTest
-  public void testLoopbackH264DecodeToTexture() throws InterruptedException {
-    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
-      Log.i(TAG, "Decode to textures is not supported, requires SDK version 19.");
-      return;
-    }
-    doLoopbackTest(createParametersForVideoCall(VIDEO_CODEC_H264),
-        createCameraCapturer(false /* captureToTexture */), true /* decodeToTexture */);
-  }
-
-  @Test
-  @SmallTest
-  public void testLoopbackVp8CaptureToTexture() throws InterruptedException {
-    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
-      Log.i(TAG, "Encode to textures is not supported. Requires SDK version 19");
-      return;
-    }
-    // TODO(perkj): If we can always capture to textures, there is no need to check if the
-    // hardware encoder supports to encode from a texture.
-    if (!MediaCodecVideoEncoder.isVp8HwSupportedUsingTextures()) {
-      Log.i(TAG, "VP8 encode to textures is not supported.");
-      return;
-    }
-    doLoopbackTest(createParametersForVideoCall(VIDEO_CODEC_VP8),
-        createCameraCapturer(true /* captureToTexture */), true /* decodeToTexture */);
-  }
-
-  @Test
-  @SmallTest
-  public void testLoopbackH264CaptureToTexture() throws InterruptedException {
-    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
-      Log.i(TAG, "Encode to textures is not supported. Requires KITKAT");
-      return;
-    }
-    // TODO(perkj): If we can always capture to textures, there is no need to check if the
-    // hardware encoder supports to encode from a texture.
-    if (!MediaCodecVideoEncoder.isH264HwSupportedUsingTextures()) {
-      Log.i(TAG, "H264 encode to textures is not supported.");
-      return;
-    }
-    doLoopbackTest(createParametersForVideoCall(VIDEO_CODEC_H264),
-        createCameraCapturer(true /* captureToTexture */), true /* decodeToTexture */);
-  }
-
-  // Checks if default front camera can be switched to back camera and then
-  // again to front camera.
-  @Test
-  @SmallTest
-  public void testCameraSwitch() throws InterruptedException {
-    Log.d(TAG, "testCameraSwitch");
-    loopback = true;
-
-    MockSink localRenderer = new MockSink(EXPECTED_VIDEO_FRAMES, LOCAL_RENDERER_NAME);
-    MockRenderer remoteRenderer = new MockRenderer(EXPECTED_VIDEO_FRAMES, REMOTE_RENDERER_NAME);
-
-    pcClient = createPeerConnectionClient(localRenderer, remoteRenderer,
-        createParametersForVideoCall(VIDEO_CODEC_VP8),
-        createCameraCapturer(false /* captureToTexture */));
-
-    // Wait for local SDP, rename it to answer and set as remote SDP.
-    assertTrue("Local SDP was not set.", waitForLocalSDP(WAIT_TIMEOUT));
-    SessionDescription remoteSdp = new SessionDescription(
-        SessionDescription.Type.fromCanonicalForm("answer"), localSdp.description);
-    pcClient.setRemoteDescription(remoteSdp);
-
-    // Wait for ICE connection.
-    assertTrue("ICE connection failure.", waitForIceConnected(ICE_CONNECTION_WAIT_TIMEOUT));
-
-    // Check that local and remote video frames were rendered.
-    assertTrue("Local video frames were not rendered before camera switch.",
-        localRenderer.waitForFramesRendered(WAIT_TIMEOUT));
-    assertTrue("Remote video frames were not rendered before camera switch.",
-        remoteRenderer.waitForFramesRendered(WAIT_TIMEOUT));
-
-    for (int i = 0; i < CAMERA_SWITCH_ATTEMPTS; i++) {
-      // Try to switch camera
-      pcClient.switchCamera();
-
-      // Reset video renders and check that local and remote video frames
-      // were rendered after camera switch.
-      localRenderer.reset(EXPECTED_VIDEO_FRAMES);
-      remoteRenderer.reset(EXPECTED_VIDEO_FRAMES);
-      assertTrue("Local video frames were not rendered after camera switch.",
-          localRenderer.waitForFramesRendered(WAIT_TIMEOUT));
-      assertTrue("Remote video frames were not rendered after camera switch.",
-          remoteRenderer.waitForFramesRendered(WAIT_TIMEOUT));
-    }
-    pcClient.close();
-    assertTrue(waitForPeerConnectionClosed(WAIT_TIMEOUT));
-    Log.d(TAG, "testCameraSwitch done.");
-  }
-
-  // Checks if video source can be restarted - simulate app goes to
-  // background and back to foreground.
-  @Test
-  @SmallTest
-  public void testVideoSourceRestart() throws InterruptedException {
-    Log.d(TAG, "testVideoSourceRestart");
-    loopback = true;
-
-    MockSink localRenderer = new MockSink(EXPECTED_VIDEO_FRAMES, LOCAL_RENDERER_NAME);
-    MockRenderer remoteRenderer = new MockRenderer(EXPECTED_VIDEO_FRAMES, REMOTE_RENDERER_NAME);
-
-    pcClient = createPeerConnectionClient(localRenderer, remoteRenderer,
-        createParametersForVideoCall(VIDEO_CODEC_VP8),
-        createCameraCapturer(false /* captureToTexture */));
-
-    // Wait for local SDP, rename it to answer and set as remote SDP.
-    assertTrue("Local SDP was not set.", waitForLocalSDP(WAIT_TIMEOUT));
-    SessionDescription remoteSdp = new SessionDescription(
-        SessionDescription.Type.fromCanonicalForm("answer"), localSdp.description);
-    pcClient.setRemoteDescription(remoteSdp);
-
-    // Wait for ICE connection.
-    assertTrue("ICE connection failure.", waitForIceConnected(ICE_CONNECTION_WAIT_TIMEOUT));
-
-    // Check that local and remote video frames were rendered.
-    assertTrue("Local video frames were not rendered before video restart.",
-        localRenderer.waitForFramesRendered(WAIT_TIMEOUT));
-    assertTrue("Remote video frames were not rendered before video restart.",
-        remoteRenderer.waitForFramesRendered(WAIT_TIMEOUT));
-
-    // Stop and then start video source a few times.
-    for (int i = 0; i < VIDEO_RESTART_ATTEMPTS; i++) {
-      pcClient.stopVideoSource();
-      Thread.sleep(VIDEO_RESTART_TIMEOUT);
-      pcClient.startVideoSource();
-
-      // Reset video renders and check that local and remote video frames
-      // were rendered after video restart.
-      localRenderer.reset(EXPECTED_VIDEO_FRAMES);
-      remoteRenderer.reset(EXPECTED_VIDEO_FRAMES);
-      assertTrue("Local video frames were not rendered after video restart.",
-          localRenderer.waitForFramesRendered(WAIT_TIMEOUT));
-      assertTrue("Remote video frames were not rendered after video restart.",
-          remoteRenderer.waitForFramesRendered(WAIT_TIMEOUT));
-    }
-    pcClient.close();
-    assertTrue(waitForPeerConnectionClosed(WAIT_TIMEOUT));
-    Log.d(TAG, "testVideoSourceRestart done.");
-  }
-
-  // Checks if capture format can be changed on fly and decoder can be reset properly.
-  @Test
-  @SmallTest
-  public void testCaptureFormatChange() throws InterruptedException {
-    Log.d(TAG, "testCaptureFormatChange");
-    loopback = true;
-
-    MockSink localRenderer = new MockSink(EXPECTED_VIDEO_FRAMES, LOCAL_RENDERER_NAME);
-    MockRenderer remoteRenderer = new MockRenderer(EXPECTED_VIDEO_FRAMES, REMOTE_RENDERER_NAME);
-
-    pcClient = createPeerConnectionClient(localRenderer, remoteRenderer,
-        createParametersForVideoCall(VIDEO_CODEC_VP8),
-        createCameraCapturer(false /* captureToTexture */));
-
-    // Wait for local SDP, rename it to answer and set as remote SDP.
-    assertTrue("Local SDP was not set.", waitForLocalSDP(WAIT_TIMEOUT));
-    SessionDescription remoteSdp = new SessionDescription(
-        SessionDescription.Type.fromCanonicalForm("answer"), localSdp.description);
-    pcClient.setRemoteDescription(remoteSdp);
-
-    // Wait for ICE connection.
-    assertTrue("ICE connection failure.", waitForIceConnected(ICE_CONNECTION_WAIT_TIMEOUT));
-
-    // Check that local and remote video frames were rendered.
-    assertTrue("Local video frames were not rendered before camera resolution change.",
-        localRenderer.waitForFramesRendered(WAIT_TIMEOUT));
-    assertTrue("Remote video frames were not rendered before camera resolution change.",
-        remoteRenderer.waitForFramesRendered(WAIT_TIMEOUT));
-
-    // Change capture output format a few times.
-    for (int i = 0; i < 2 * CAPTURE_FORMAT_CHANGE_ATTEMPTS; i++) {
-      if (i % 2 == 0) {
-        pcClient.changeCaptureFormat(WIDTH_VGA, HEIGHT_VGA, MAX_VIDEO_FPS);
-      } else {
-        pcClient.changeCaptureFormat(WIDTH_QVGA, HEIGHT_QVGA, MAX_VIDEO_FPS);
-      }
-
-      // Reset video renders and check that local and remote video frames
-      // were rendered after capture format change.
-      localRenderer.reset(EXPECTED_VIDEO_FRAMES);
-      remoteRenderer.reset(EXPECTED_VIDEO_FRAMES);
-      assertTrue("Local video frames were not rendered after capture format change.",
-          localRenderer.waitForFramesRendered(WAIT_TIMEOUT));
-      assertTrue("Remote video frames were not rendered after capture format change.",
-          remoteRenderer.waitForFramesRendered(WAIT_TIMEOUT));
-    }
-
-    pcClient.close();
-    assertTrue(waitForPeerConnectionClosed(WAIT_TIMEOUT));
-    Log.d(TAG, "testCaptureFormatChange done.");
-  }
-}
diff --git a/examples/androidtests/third_party/.gitignore b/examples/androidtests/third_party/.gitignore
deleted file mode 100644
index 52acefb..0000000
--- a/examples/androidtests/third_party/.gitignore
+++ /dev/null
@@ -1,3 +0,0 @@
-# This file is needed for projects that has this directory as a separate Git
-# mirror in DEPS. Without it, a lot is wiped and re-downloaded for each sync.
-/gradle
diff --git a/examples/androidtests/third_party/README.webrtc b/examples/androidtests/third_party/README.webrtc
deleted file mode 100644
index a6ea884..0000000
--- a/examples/androidtests/third_party/README.webrtc
+++ /dev/null
@@ -1,10 +0,0 @@
-The third_party directory contains sources from other projects.
-
-Code in third_party must document the license under which the source is being
-used. If the source itself does not include a license header or file, create
-an entry in this file that refers to reliable documentation of the project's
-license terms on the web (and add a note pointing here in the README file in
-that directory).
-
-<Include table of license information here, once it is available>
-
diff --git a/examples/androidtests/video_quality_loopback_test.py b/examples/androidtests/video_quality_loopback_test.py
deleted file mode 100755
index eed3b9c..0000000
--- a/examples/androidtests/video_quality_loopback_test.py
+++ /dev/null
@@ -1,218 +0,0 @@
-#!/usr/bin/env python
-# Copyright (c) 2017 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.
-
-"""
-This script is the wrapper that starts a loopback call with stubbed video in
-and out. It then analyses the video quality of the output video against the
-reference input video.
-
-It expect to be given the webrtc output build directory as the first argument
-all other arguments are optional.
-
-It assumes you have a Android device plugged in.
-"""
-
-import argparse
-import json
-import logging
-import os
-import shutil
-import subprocess
-import sys
-import tempfile
-import time
-
-
-SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
-SRC_DIR = os.path.normpath(os.path.join(SCRIPT_DIR, os.pardir, os.pardir,
-                                        os.pardir))
-BAD_DEVICES_JSON = os.path.join(SRC_DIR,
-                                os.environ.get('CHROMIUM_OUT_DIR', 'out'),
-                                'bad_devices.json')
-
-
-class Error(Exception):
-  pass
-
-
-class VideoQualityTestError(Error):
-  pass
-
-
-def _RunCommand(argv, cwd=SRC_DIR, **kwargs):
-  logging.info('Running %r', argv)
-  subprocess.check_call(argv, cwd=cwd, **kwargs)
-
-
-def _RunCommandWithOutput(argv, cwd=SRC_DIR, **kwargs):
-  logging.info('Running %r', argv)
-  return subprocess.check_output(argv, cwd=cwd, **kwargs)
-
-
-def _RunBackgroundCommand(argv, cwd=SRC_DIR):
-  logging.info('Running %r', argv)
-  process = subprocess.Popen(argv, cwd=cwd)
-  time.sleep(0.5)
-  status = process.poll()
-  if status:  # is not None or 0
-    raise subprocess.CalledProcessError(status, argv)
-  return process
-
-
-def _ParseArgs():
-  parser = argparse.ArgumentParser(description='Start loopback video analysis.')
-  parser.add_argument('build_dir_android',
-      help='The path to the build directory for Android.')
-  parser.add_argument('--build_dir_x86',
-      help='The path to the build directory for building locally.')
-  parser.add_argument('--temp_dir',
-      help='A temporary directory to put the output.')
-  parser.add_argument('--adb-path', help='Path to adb binary.', default='adb')
-
-  args = parser.parse_args()
-  return args
-
-
-def main():
-  logging.basicConfig(level=logging.INFO)
-
-  args = _ParseArgs()
-
-  build_dir_android = args.build_dir_android
-  build_dir_x86 = args.build_dir_x86
-  temp_dir = args.temp_dir
-  adb_path = args.adb_path
-  if not temp_dir:
-    temp_dir = tempfile.mkdtemp()
-  else:
-    if not os.path.exists(temp_dir):
-      os.makedirs(temp_dir)
-
-  if not build_dir_x86:
-    build_dir_x86 = os.path.join(temp_dir, 'LocalBuild')
-    _RunCommand(['gn', 'gen', build_dir_x86])
-    _RunCommand(['ninja', '-C', build_dir_x86, 'frame_analyzer'])
-
-  tools_dir = os.path.join(SRC_DIR, 'tools_webrtc')
-  toolchain_dir = os.path.join(tools_dir, 'video_quality_toolchain')
-
-  # Download ffmpeg and zxing.
-  download_tools_script = os.path.join(tools_dir, 'download_tools.py')
-  _RunCommand([sys.executable, download_tools_script, toolchain_dir])
-
-  testing_tools_dir = os.path.join(SRC_DIR, 'webrtc', 'rtc_tools', 'testing')
-
-  # Download, extract and build AppRTC.
-  setup_apprtc_script = os.path.join(testing_tools_dir, 'setup_apprtc.py')
-  _RunCommand([sys.executable, setup_apprtc_script, temp_dir])
-
-  # Select an Android device in case multiple are connected
-  try:
-    with open(BAD_DEVICES_JSON) as bad_devices_file:
-      bad_devices = json.load(bad_devices_file)
-  except IOError:
-    if os.environ.get('CHROME_HEADLESS'):
-      logging.warning('Cannot read %r', BAD_DEVICES_JSON)
-    bad_devices = {}
-
-  for line in _RunCommandWithOutput([adb_path, 'devices']).splitlines():
-    if line.endswith('\tdevice'):
-      android_device = line.split('\t')[0]
-      if android_device not in bad_devices:
-        break
-  else:
-    raise VideoQualityTestError('Cannot find any connected Android device.')
-
-  processes = []
-  try:
-    # Start AppRTC Server
-    dev_appserver = os.path.join(temp_dir, 'apprtc', 'temp', 'google-cloud-sdk',
-                                'bin', 'dev_appserver.py')
-    appengine_dir = os.path.join(temp_dir, 'apprtc', 'out', 'app_engine')
-    processes.append(_RunBackgroundCommand([
-        'python', dev_appserver, appengine_dir,
-        '--port=9999', '--admin_port=9998',
-        '--skip_sdk_update_check', '--clear_datastore=yes']))
-
-    # Start Collider
-    collider_path = os.path.join(temp_dir, 'collider', 'collidermain')
-    processes.append(_RunBackgroundCommand([
-        collider_path, '-tls=false', '-port=8089',
-        '-room-server=http://localhost:9999']))
-
-    # Start adb reverse forwarder
-    reverseforwarder_path = os.path.join(
-        SRC_DIR, 'build', 'android', 'adb_reverse_forwarder.py')
-    processes.append(_RunBackgroundCommand([
-        reverseforwarder_path, '--device', android_device,
-        '9999', '9999', '8089', '8089']))
-
-    # Run the Espresso code.
-    test_script = os.path.join(build_dir_android,
-        'bin', 'run_AppRTCMobileTestStubbedVideoIO')
-    _RunCommand([test_script, '--device', android_device])
-
-    # Pull the output video.
-    test_video = os.path.join(temp_dir, 'test_video.y4m')
-    _RunCommand([adb_path, '-s', android_device,
-                'pull', '/sdcard/output.y4m', test_video])
-
-    test_video_yuv = os.path.join(temp_dir, 'test_video.yuv')
-
-    ffmpeg_path = os.path.join(toolchain_dir, 'linux', 'ffmpeg')
-
-    def ConvertVideo(input_video, output_video):
-      _RunCommand([ffmpeg_path, '-y', '-i', input_video, output_video])
-
-    ConvertVideo(test_video, test_video_yuv)
-
-    reference_video = os.path.join(SRC_DIR,
-        'resources', 'reference_video_640x360_30fps.y4m')
-
-    reference_video_yuv = os.path.join(temp_dir,
-        'reference_video_640x360_30fps.yuv')
-
-    ConvertVideo(reference_video, reference_video_yuv)
-
-    # Run compare script.
-    compare_script = os.path.join(SRC_DIR, 'webrtc', 'rtc_tools',
-                                  'compare_videos.py')
-    zxing_path = os.path.join(toolchain_dir, 'linux', 'zxing')
-
-    # The frame_analyzer binary should be built for local computer and not for
-    # Android
-    frame_analyzer = os.path.join(build_dir_x86, 'frame_analyzer')
-
-    frame_width = 640
-    frame_height = 360
-
-    stats_file_ref = os.path.join(temp_dir, 'stats_ref.txt')
-    stats_file_test = os.path.join(temp_dir, 'stats_test.txt')
-
-    _RunCommand([
-        sys.executable, compare_script, '--ref_video', reference_video_yuv,
-        '--test_video', test_video_yuv, '--yuv_frame_width', str(frame_width),
-        '--yuv_frame_height', str(frame_height),
-        '--stats_file_ref', stats_file_ref,
-        '--stats_file_test', stats_file_test,
-        '--frame_analyzer', frame_analyzer,
-        '--ffmpeg_path', ffmpeg_path, '--zxing_path', zxing_path])
-
-  finally:
-    for process in processes:
-      if process:
-        process.terminate()
-        process.wait()
-
-    shutil.rmtree(temp_dir)
-
-
-if __name__ == '__main__':
-  sys.exit(main())
-
diff --git a/examples/objc/AppRTCMobile/ARDAppClient+Internal.h b/examples/objc/AppRTCMobile/ARDAppClient+Internal.h
deleted file mode 100644
index 3cf4040..0000000
--- a/examples/objc/AppRTCMobile/ARDAppClient+Internal.h
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- *  Copyright 2014 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.
- */
-
-#import "ARDAppClient.h"
-
-#import "WebRTC/RTCPeerConnection.h"
-
-#import "ARDRoomServerClient.h"
-#import "ARDSignalingChannel.h"
-#import "ARDTURNClient.h"
-
-@class RTCPeerConnectionFactory;
-
-@interface ARDAppClient () <ARDSignalingChannelDelegate,
-  RTCPeerConnectionDelegate>
-
-// All properties should only be mutated from the main queue.
-@property(nonatomic, strong) id<ARDRoomServerClient> roomServerClient;
-@property(nonatomic, strong) id<ARDSignalingChannel> channel;
-@property(nonatomic, strong) id<ARDSignalingChannel> loopbackChannel;
-@property(nonatomic, strong) id<ARDTURNClient> turnClient;
-
-@property(nonatomic, strong) RTCPeerConnection *peerConnection;
-@property(nonatomic, strong) RTCPeerConnectionFactory *factory;
-@property(nonatomic, strong) NSMutableArray *messageQueue;
-
-@property(nonatomic, assign) BOOL isTurnComplete;
-@property(nonatomic, assign) BOOL hasReceivedSdp;
-@property(nonatomic, readonly) BOOL hasJoinedRoomServerRoom;
-
-@property(nonatomic, strong) NSString *roomId;
-@property(nonatomic, strong) NSString *clientId;
-@property(nonatomic, assign) BOOL isInitiator;
-@property(nonatomic, strong) NSMutableArray *iceServers;
-@property(nonatomic, strong) NSURL *webSocketURL;
-@property(nonatomic, strong) NSURL *webSocketRestURL;
-@property(nonatomic, readonly) BOOL isLoopback;
-
-@property(nonatomic, strong)
-    RTCMediaConstraints *defaultPeerConnectionConstraints;
-
-- (instancetype)initWithRoomServerClient:(id<ARDRoomServerClient>)rsClient
-                        signalingChannel:(id<ARDSignalingChannel>)channel
-                              turnClient:(id<ARDTURNClient>)turnClient
-                                delegate:(id<ARDAppClientDelegate>)delegate;
-
-@end
diff --git a/examples/objc/AppRTCMobile/ARDAppClient.h b/examples/objc/AppRTCMobile/ARDAppClient.h
deleted file mode 100644
index 8c27b34..0000000
--- a/examples/objc/AppRTCMobile/ARDAppClient.h
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- *  Copyright 2014 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.
- */
-
-#import <Foundation/Foundation.h>
-
-#import "WebRTC/RTCCameraVideoCapturer.h"
-#import "WebRTC/RTCPeerConnection.h"
-#import "WebRTC/RTCVideoTrack.h"
-
-typedef NS_ENUM(NSInteger, ARDAppClientState) {
-  // Disconnected from servers.
-  kARDAppClientStateDisconnected,
-  // Connecting to servers.
-  kARDAppClientStateConnecting,
-  // Connected to servers.
-  kARDAppClientStateConnected,
-};
-
-@class ARDAppClient;
-@class ARDSettingsModel;
-@class RTCMediaConstraints;
-
-// The delegate is informed of pertinent events and will be called on the
-// main queue.
-@protocol ARDAppClientDelegate <NSObject>
-
-- (void)appClient:(ARDAppClient *)client
-    didChangeState:(ARDAppClientState)state;
-
-- (void)appClient:(ARDAppClient *)client
-    didChangeConnectionState:(RTCIceConnectionState)state;
-
-- (void)appClient:(ARDAppClient *)client
-    didCreateLocalCapturer:(RTCCameraVideoCapturer *)localCapturer;
-
-- (void)appClient:(ARDAppClient *)client
-    didReceiveLocalVideoTrack:(RTCVideoTrack *)localVideoTrack;
-
-- (void)appClient:(ARDAppClient *)client
-    didReceiveRemoteVideoTrack:(RTCVideoTrack *)remoteVideoTrack;
-
-- (void)appClient:(ARDAppClient *)client
-         didError:(NSError *)error;
-
-- (void)appClient:(ARDAppClient *)client
-      didGetStats:(NSArray *)stats;
-
-@end
-
-// Handles connections to the AppRTC server for a given room. Methods on this
-// class should only be called from the main queue.
-@interface ARDAppClient : NSObject
-
-// If |shouldGetStats| is true, stats will be reported in 1s intervals through
-// the delegate.
-@property(nonatomic, assign) BOOL shouldGetStats;
-@property(nonatomic, readonly) ARDAppClientState state;
-@property(nonatomic, weak) id<ARDAppClientDelegate> delegate;
-// Convenience constructor since all expected use cases will need a delegate
-// in order to receive remote tracks.
-- (instancetype)initWithDelegate:(id<ARDAppClientDelegate>)delegate;
-
-// Establishes a connection with the AppRTC servers for the given room id.
-// |settings| is an object containing settings such as video codec for the call.
-// If |isLoopback| is true, the call will connect to itself.
-- (void)connectToRoomWithId:(NSString *)roomId
-                   settings:(ARDSettingsModel *)settings
-                 isLoopback:(BOOL)isLoopback;
-
-// Disconnects from the AppRTC servers and any connected clients.
-- (void)disconnect;
-
-@end
diff --git a/examples/objc/AppRTCMobile/ARDAppClient.m b/examples/objc/AppRTCMobile/ARDAppClient.m
deleted file mode 100644
index c699381..0000000
--- a/examples/objc/AppRTCMobile/ARDAppClient.m
+++ /dev/null
@@ -1,849 +0,0 @@
-/*
- *  Copyright 2014 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.
- */
-
-#import "ARDAppClient+Internal.h"
-
-#import "WebRTC/RTCAVFoundationVideoSource.h"
-#import "WebRTC/RTCAudioTrack.h"
-#import "WebRTC/RTCCameraVideoCapturer.h"
-#import "WebRTC/RTCConfiguration.h"
-#import "WebRTC/RTCFileLogger.h"
-#import "WebRTC/RTCIceServer.h"
-#import "WebRTC/RTCLogging.h"
-#import "WebRTC/RTCMediaConstraints.h"
-#import "WebRTC/RTCMediaStream.h"
-#import "WebRTC/RTCPeerConnectionFactory.h"
-#import "WebRTC/RTCRtpSender.h"
-#import "WebRTC/RTCTracing.h"
-#import "WebRTC/RTCVideoTrack.h"
-
-#import "ARDAppEngineClient.h"
-#import "ARDJoinResponse.h"
-#import "ARDMessageResponse.h"
-#import "ARDSDPUtils.h"
-#import "ARDSettingsModel.h"
-#import "ARDSignalingMessage.h"
-#import "ARDTURNClient+Internal.h"
-#import "ARDUtilities.h"
-#import "ARDWebSocketChannel.h"
-#import "RTCIceCandidate+JSON.h"
-#import "RTCSessionDescription+JSON.h"
-
-static NSString * const kARDIceServerRequestUrl = @"https://appr.tc/params";
-
-static NSString * const kARDAppClientErrorDomain = @"ARDAppClient";
-static NSInteger const kARDAppClientErrorUnknown = -1;
-static NSInteger const kARDAppClientErrorRoomFull = -2;
-static NSInteger const kARDAppClientErrorCreateSDP = -3;
-static NSInteger const kARDAppClientErrorSetSDP = -4;
-static NSInteger const kARDAppClientErrorInvalidClient = -5;
-static NSInteger const kARDAppClientErrorInvalidRoom = -6;
-static NSString * const kARDMediaStreamId = @"ARDAMS";
-static NSString * const kARDAudioTrackId = @"ARDAMSa0";
-static NSString * const kARDVideoTrackId = @"ARDAMSv0";
-static NSString * const kARDVideoTrackKind = @"video";
-
-// TODO(tkchin): Add these as UI options.
-static BOOL const kARDAppClientEnableTracing = NO;
-static BOOL const kARDAppClientEnableRtcEventLog = YES;
-static int64_t const kARDAppClientAecDumpMaxSizeInBytes = 5e6;  // 5 MB.
-static int64_t const kARDAppClientRtcEventLogMaxSizeInBytes = 5e6;  // 5 MB.
-static int const kKbpsMultiplier = 1000;
-
-// We need a proxy to NSTimer because it causes a strong retain cycle. When
-// using the proxy, |invalidate| must be called before it properly deallocs.
-@interface ARDTimerProxy : NSObject
-
-- (instancetype)initWithInterval:(NSTimeInterval)interval
-                         repeats:(BOOL)repeats
-                    timerHandler:(void (^)(void))timerHandler;
-- (void)invalidate;
-
-@end
-
-@implementation ARDTimerProxy {
-  NSTimer *_timer;
-  void (^_timerHandler)(void);
-}
-
-- (instancetype)initWithInterval:(NSTimeInterval)interval
-                         repeats:(BOOL)repeats
-                    timerHandler:(void (^)(void))timerHandler {
-  NSParameterAssert(timerHandler);
-  if (self = [super init]) {
-    _timerHandler = timerHandler;
-    _timer = [NSTimer scheduledTimerWithTimeInterval:interval
-                                              target:self
-                                            selector:@selector(timerDidFire:)
-                                            userInfo:nil
-                                             repeats:repeats];
-  }
-  return self;
-}
-
-- (void)invalidate {
-  [_timer invalidate];
-}
-
-- (void)timerDidFire:(NSTimer *)timer {
-  _timerHandler();
-}
-
-@end
-
-@implementation ARDAppClient {
-  RTCFileLogger *_fileLogger;
-  ARDTimerProxy *_statsTimer;
-  ARDSettingsModel *_settings;
-  RTCVideoTrack *_localVideoTrack;
-}
-
-@synthesize shouldGetStats = _shouldGetStats;
-@synthesize state = _state;
-@synthesize delegate = _delegate;
-@synthesize roomServerClient = _roomServerClient;
-@synthesize channel = _channel;
-@synthesize loopbackChannel = _loopbackChannel;
-@synthesize turnClient = _turnClient;
-@synthesize peerConnection = _peerConnection;
-@synthesize factory = _factory;
-@synthesize messageQueue = _messageQueue;
-@synthesize isTurnComplete = _isTurnComplete;
-@synthesize hasReceivedSdp  = _hasReceivedSdp;
-@synthesize roomId = _roomId;
-@synthesize clientId = _clientId;
-@synthesize isInitiator = _isInitiator;
-@synthesize iceServers = _iceServers;
-@synthesize webSocketURL = _websocketURL;
-@synthesize webSocketRestURL = _websocketRestURL;
-@synthesize defaultPeerConnectionConstraints =
-    _defaultPeerConnectionConstraints;
-@synthesize isLoopback = _isLoopback;
-
-- (instancetype)init {
-  return [self initWithDelegate:nil];
-}
-
-- (instancetype)initWithDelegate:(id<ARDAppClientDelegate>)delegate {
-  if (self = [super init]) {
-    _roomServerClient = [[ARDAppEngineClient alloc] init];
-    _delegate = delegate;
-    NSURL *turnRequestURL = [NSURL URLWithString:kARDIceServerRequestUrl];
-    _turnClient = [[ARDTURNClient alloc] initWithURL:turnRequestURL];
-    [self configure];
-  }
-  return self;
-}
-
-// TODO(tkchin): Provide signaling channel factory interface so we can recreate
-// channel if we need to on network failure. Also, make this the default public
-// constructor.
-- (instancetype)initWithRoomServerClient:(id<ARDRoomServerClient>)rsClient
-                        signalingChannel:(id<ARDSignalingChannel>)channel
-                              turnClient:(id<ARDTURNClient>)turnClient
-                                delegate:(id<ARDAppClientDelegate>)delegate {
-  NSParameterAssert(rsClient);
-  NSParameterAssert(channel);
-  NSParameterAssert(turnClient);
-  if (self = [super init]) {
-    _roomServerClient = rsClient;
-    _channel = channel;
-    _turnClient = turnClient;
-    _delegate = delegate;
-    [self configure];
-  }
-  return self;
-}
-
-- (void)configure {
-  _factory = [[RTCPeerConnectionFactory alloc] init];
-  _messageQueue = [NSMutableArray array];
-  _iceServers = [NSMutableArray array];
-  _fileLogger = [[RTCFileLogger alloc] init];
-  [_fileLogger start];
-}
-
-- (void)dealloc {
-  self.shouldGetStats = NO;
-  [self disconnect];
-}
-
-- (void)setShouldGetStats:(BOOL)shouldGetStats {
-  if (_shouldGetStats == shouldGetStats) {
-    return;
-  }
-  if (shouldGetStats) {
-    __weak ARDAppClient *weakSelf = self;
-    _statsTimer = [[ARDTimerProxy alloc] initWithInterval:1
-                                                  repeats:YES
-                                             timerHandler:^{
-      ARDAppClient *strongSelf = weakSelf;
-      [strongSelf.peerConnection statsForTrack:nil
-                              statsOutputLevel:RTCStatsOutputLevelDebug
-                             completionHandler:^(NSArray *stats) {
-        dispatch_async(dispatch_get_main_queue(), ^{
-          ARDAppClient *strongSelf = weakSelf;
-          [strongSelf.delegate appClient:strongSelf didGetStats:stats];
-        });
-      }];
-    }];
-  } else {
-    [_statsTimer invalidate];
-    _statsTimer = nil;
-  }
-  _shouldGetStats = shouldGetStats;
-}
-
-- (void)setState:(ARDAppClientState)state {
-  if (_state == state) {
-    return;
-  }
-  _state = state;
-  [_delegate appClient:self didChangeState:_state];
-}
-
-- (void)connectToRoomWithId:(NSString *)roomId
-                   settings:(ARDSettingsModel *)settings
-                 isLoopback:(BOOL)isLoopback {
-  NSParameterAssert(roomId.length);
-  NSParameterAssert(_state == kARDAppClientStateDisconnected);
-  _settings = settings;
-  _isLoopback = isLoopback;
-  self.state = kARDAppClientStateConnecting;
-
-#if defined(WEBRTC_IOS)
-  if (kARDAppClientEnableTracing) {
-    NSString *filePath = [self documentsFilePathForFileName:@"webrtc-trace.txt"];
-    RTCStartInternalCapture(filePath);
-  }
-#endif
-
-  // Request TURN.
-  __weak ARDAppClient *weakSelf = self;
-  [_turnClient requestServersWithCompletionHandler:^(NSArray *turnServers,
-                                                     NSError *error) {
-    if (error) {
-      RTCLogError("Error retrieving TURN servers: %@",
-                  error.localizedDescription);
-    }
-    ARDAppClient *strongSelf = weakSelf;
-    [strongSelf.iceServers addObjectsFromArray:turnServers];
-    strongSelf.isTurnComplete = YES;
-    [strongSelf startSignalingIfReady];
-  }];
-
-  // Join room on room server.
-  [_roomServerClient joinRoomWithRoomId:roomId
-                             isLoopback:isLoopback
-      completionHandler:^(ARDJoinResponse *response, NSError *error) {
-    ARDAppClient *strongSelf = weakSelf;
-    if (error) {
-      [strongSelf.delegate appClient:strongSelf didError:error];
-      return;
-    }
-    NSError *joinError =
-        [[strongSelf class] errorForJoinResultType:response.result];
-    if (joinError) {
-      RTCLogError(@"Failed to join room:%@ on room server.", roomId);
-      [strongSelf disconnect];
-      [strongSelf.delegate appClient:strongSelf didError:joinError];
-      return;
-    }
-    RTCLog(@"Joined room:%@ on room server.", roomId);
-    strongSelf.roomId = response.roomId;
-    strongSelf.clientId = response.clientId;
-    strongSelf.isInitiator = response.isInitiator;
-    for (ARDSignalingMessage *message in response.messages) {
-      if (message.type == kARDSignalingMessageTypeOffer ||
-          message.type == kARDSignalingMessageTypeAnswer) {
-        strongSelf.hasReceivedSdp = YES;
-        [strongSelf.messageQueue insertObject:message atIndex:0];
-      } else {
-        [strongSelf.messageQueue addObject:message];
-      }
-    }
-    strongSelf.webSocketURL = response.webSocketURL;
-    strongSelf.webSocketRestURL = response.webSocketRestURL;
-    [strongSelf registerWithColliderIfReady];
-    [strongSelf startSignalingIfReady];
-  }];
-}
-
-- (void)disconnect {
-  if (_state == kARDAppClientStateDisconnected) {
-    return;
-  }
-  if (self.hasJoinedRoomServerRoom) {
-    [_roomServerClient leaveRoomWithRoomId:_roomId
-                                  clientId:_clientId
-                         completionHandler:nil];
-  }
-  if (_channel) {
-    if (_channel.state == kARDSignalingChannelStateRegistered) {
-      // Tell the other client we're hanging up.
-      ARDByeMessage *byeMessage = [[ARDByeMessage alloc] init];
-      [_channel sendMessage:byeMessage];
-    }
-    // Disconnect from collider.
-    _channel = nil;
-  }
-  _clientId = nil;
-  _roomId = nil;
-  _isInitiator = NO;
-  _hasReceivedSdp = NO;
-  _messageQueue = [NSMutableArray array];
-  _localVideoTrack = nil;
-#if defined(WEBRTC_IOS)
-  [_factory stopAecDump];
-  [_peerConnection stopRtcEventLog];
-#endif
-  [_peerConnection close];
-  _peerConnection = nil;
-  self.state = kARDAppClientStateDisconnected;
-#if defined(WEBRTC_IOS)
-  if (kARDAppClientEnableTracing) {
-    RTCStopInternalCapture();
-  }
-#endif
-}
-
-#pragma mark - ARDSignalingChannelDelegate
-
-- (void)channel:(id<ARDSignalingChannel>)channel
-    didReceiveMessage:(ARDSignalingMessage *)message {
-  switch (message.type) {
-    case kARDSignalingMessageTypeOffer:
-    case kARDSignalingMessageTypeAnswer:
-      // Offers and answers must be processed before any other message, so we
-      // place them at the front of the queue.
-      _hasReceivedSdp = YES;
-      [_messageQueue insertObject:message atIndex:0];
-      break;
-    case kARDSignalingMessageTypeCandidate:
-    case kARDSignalingMessageTypeCandidateRemoval:
-      [_messageQueue addObject:message];
-      break;
-    case kARDSignalingMessageTypeBye:
-      // Disconnects can be processed immediately.
-      [self processSignalingMessage:message];
-      return;
-  }
-  [self drainMessageQueueIfReady];
-}
-
-- (void)channel:(id<ARDSignalingChannel>)channel
-    didChangeState:(ARDSignalingChannelState)state {
-  switch (state) {
-    case kARDSignalingChannelStateOpen:
-      break;
-    case kARDSignalingChannelStateRegistered:
-      break;
-    case kARDSignalingChannelStateClosed:
-    case kARDSignalingChannelStateError:
-      // TODO(tkchin): reconnection scenarios. Right now we just disconnect
-      // completely if the websocket connection fails.
-      [self disconnect];
-      break;
-  }
-}
-
-#pragma mark - RTCPeerConnectionDelegate
-// Callbacks for this delegate occur on non-main thread and need to be
-// dispatched back to main queue as needed.
-
-- (void)peerConnection:(RTCPeerConnection *)peerConnection
-    didChangeSignalingState:(RTCSignalingState)stateChanged {
-  RTCLog(@"Signaling state changed: %ld", (long)stateChanged);
-}
-
-- (void)peerConnection:(RTCPeerConnection *)peerConnection
-          didAddStream:(RTCMediaStream *)stream {
-  dispatch_async(dispatch_get_main_queue(), ^{
-    RTCLog(@"Received %lu video tracks and %lu audio tracks",
-        (unsigned long)stream.videoTracks.count,
-        (unsigned long)stream.audioTracks.count);
-    if (stream.videoTracks.count) {
-      RTCVideoTrack *videoTrack = stream.videoTracks[0];
-      [_delegate appClient:self didReceiveRemoteVideoTrack:videoTrack];
-    }
-  });
-}
-
-- (void)peerConnection:(RTCPeerConnection *)peerConnection
-       didRemoveStream:(RTCMediaStream *)stream {
-  RTCLog(@"Stream was removed.");
-}
-
-- (void)peerConnectionShouldNegotiate:(RTCPeerConnection *)peerConnection {
-  RTCLog(@"WARNING: Renegotiation needed but unimplemented.");
-}
-
-- (void)peerConnection:(RTCPeerConnection *)peerConnection
-    didChangeIceConnectionState:(RTCIceConnectionState)newState {
-  RTCLog(@"ICE state changed: %ld", (long)newState);
-  dispatch_async(dispatch_get_main_queue(), ^{
-    [_delegate appClient:self didChangeConnectionState:newState];
-  });
-}
-
-- (void)peerConnection:(RTCPeerConnection *)peerConnection
-    didChangeIceGatheringState:(RTCIceGatheringState)newState {
-  RTCLog(@"ICE gathering state changed: %ld", (long)newState);
-}
-
-- (void)peerConnection:(RTCPeerConnection *)peerConnection
-    didGenerateIceCandidate:(RTCIceCandidate *)candidate {
-  dispatch_async(dispatch_get_main_queue(), ^{
-    ARDICECandidateMessage *message =
-        [[ARDICECandidateMessage alloc] initWithCandidate:candidate];
-    [self sendSignalingMessage:message];
-  });
-}
-
-- (void)peerConnection:(RTCPeerConnection *)peerConnection
-    didRemoveIceCandidates:(NSArray<RTCIceCandidate *> *)candidates {
-  dispatch_async(dispatch_get_main_queue(), ^{
-    ARDICECandidateRemovalMessage *message =
-        [[ARDICECandidateRemovalMessage alloc]
-            initWithRemovedCandidates:candidates];
-    [self sendSignalingMessage:message];
-  });
-}
-
-- (void)peerConnection:(RTCPeerConnection *)peerConnection
-    didOpenDataChannel:(RTCDataChannel *)dataChannel {
-}
-
-#pragma mark - RTCSessionDescriptionDelegate
-// Callbacks for this delegate occur on non-main thread and need to be
-// dispatched back to main queue as needed.
-
-- (void)peerConnection:(RTCPeerConnection *)peerConnection
-    didCreateSessionDescription:(RTCSessionDescription *)sdp
-                          error:(NSError *)error {
-  dispatch_async(dispatch_get_main_queue(), ^{
-    if (error) {
-      RTCLogError(@"Failed to create session description. Error: %@", error);
-      [self disconnect];
-      NSDictionary *userInfo = @{
-        NSLocalizedDescriptionKey: @"Failed to create session description.",
-      };
-      NSError *sdpError =
-          [[NSError alloc] initWithDomain:kARDAppClientErrorDomain
-                                     code:kARDAppClientErrorCreateSDP
-                                 userInfo:userInfo];
-      [_delegate appClient:self didError:sdpError];
-      return;
-    }
-    // Prefer codec from settings if available.
-    RTCSessionDescription *sdpPreferringCodec =
-        [ARDSDPUtils descriptionForDescription:sdp
-                           preferredVideoCodec:[_settings currentVideoCodecSettingFromStore]];
-    __weak ARDAppClient *weakSelf = self;
-    [_peerConnection setLocalDescription:sdpPreferringCodec
-                       completionHandler:^(NSError *error) {
-      ARDAppClient *strongSelf = weakSelf;
-      [strongSelf peerConnection:strongSelf.peerConnection
-          didSetSessionDescriptionWithError:error];
-    }];
-    ARDSessionDescriptionMessage *message =
-        [[ARDSessionDescriptionMessage alloc]
-            initWithDescription:sdpPreferringCodec];
-    [self sendSignalingMessage:message];
-    [self setMaxBitrateForPeerConnectionVideoSender];
-  });
-}
-
-- (void)peerConnection:(RTCPeerConnection *)peerConnection
-    didSetSessionDescriptionWithError:(NSError *)error {
-  dispatch_async(dispatch_get_main_queue(), ^{
-    if (error) {
-      RTCLogError(@"Failed to set session description. Error: %@", error);
-      [self disconnect];
-      NSDictionary *userInfo = @{
-        NSLocalizedDescriptionKey: @"Failed to set session description.",
-      };
-      NSError *sdpError =
-          [[NSError alloc] initWithDomain:kARDAppClientErrorDomain
-                                     code:kARDAppClientErrorSetSDP
-                                 userInfo:userInfo];
-      [_delegate appClient:self didError:sdpError];
-      return;
-    }
-    // If we're answering and we've just set the remote offer we need to create
-    // an answer and set the local description.
-    if (!_isInitiator && !_peerConnection.localDescription) {
-      RTCMediaConstraints *constraints = [self defaultAnswerConstraints];
-      __weak ARDAppClient *weakSelf = self;
-      [_peerConnection answerForConstraints:constraints
-                          completionHandler:^(RTCSessionDescription *sdp,
-                                              NSError *error) {
-        ARDAppClient *strongSelf = weakSelf;
-        [strongSelf peerConnection:strongSelf.peerConnection
-            didCreateSessionDescription:sdp
-                                  error:error];
-      }];
-    }
-  });
-}
-
-#pragma mark - Private
-
-#if defined(WEBRTC_IOS)
-
-- (NSString *)documentsFilePathForFileName:(NSString *)fileName {
-  NSParameterAssert(fileName.length);
-  NSArray *paths = NSSearchPathForDirectoriesInDomains(
-      NSDocumentDirectory, NSUserDomainMask, YES);
-  NSString *documentsDirPath = paths.firstObject;
-  NSString *filePath =
-      [documentsDirPath stringByAppendingPathComponent:fileName];
-  return filePath;
-}
-
-#endif
-
-- (BOOL)hasJoinedRoomServerRoom {
-  return _clientId.length;
-}
-
-// Begins the peer connection connection process if we have both joined a room
-// on the room server and tried to obtain a TURN server. Otherwise does nothing.
-// A peer connection object will be created with a stream that contains local
-// audio and video capture. If this client is the caller, an offer is created as
-// well, otherwise the client will wait for an offer to arrive.
-- (void)startSignalingIfReady {
-  if (!_isTurnComplete || !self.hasJoinedRoomServerRoom) {
-    return;
-  }
-  self.state = kARDAppClientStateConnected;
-
-  // Create peer connection.
-  RTCMediaConstraints *constraints = [self defaultPeerConnectionConstraints];
-  RTCConfiguration *config = [[RTCConfiguration alloc] init];
-  config.iceServers = _iceServers;
-  _peerConnection = [_factory peerConnectionWithConfiguration:config
-                                                  constraints:constraints
-                                                     delegate:self];
-  // Create AV senders.
-  [self createAudioSender];
-  [self createVideoSender];
-  if (_isInitiator) {
-    // Send offer.
-    __weak ARDAppClient *weakSelf = self;
-    [_peerConnection offerForConstraints:[self defaultOfferConstraints]
-                       completionHandler:^(RTCSessionDescription *sdp,
-                                           NSError *error) {
-      ARDAppClient *strongSelf = weakSelf;
-      [strongSelf peerConnection:strongSelf.peerConnection
-          didCreateSessionDescription:sdp
-                                error:error];
-    }];
-  } else {
-    // Check if we've received an offer.
-    [self drainMessageQueueIfReady];
-  }
-#if defined(WEBRTC_IOS)
-  // Start event log.
-  if (kARDAppClientEnableRtcEventLog) {
-    NSString *filePath = [self documentsFilePathForFileName:@"webrtc-rtceventlog"];
-    if (![_peerConnection startRtcEventLogWithFilePath:filePath
-                                 maxSizeInBytes:kARDAppClientRtcEventLogMaxSizeInBytes]) {
-      RTCLogError(@"Failed to start event logging.");
-    }
-  }
-
-  // Start aecdump diagnostic recording.
-  if ([_settings currentCreateAecDumpSettingFromStore]) {
-    NSString *filePath = [self documentsFilePathForFileName:@"webrtc-audio.aecdump"];
-    if (![_factory startAecDumpWithFilePath:filePath
-                             maxSizeInBytes:kARDAppClientAecDumpMaxSizeInBytes]) {
-      RTCLogError(@"Failed to start aec dump.");
-    }
-  }
-#endif
-}
-
-// Processes the messages that we've received from the room server and the
-// signaling channel. The offer or answer message must be processed before other
-// signaling messages, however they can arrive out of order. Hence, this method
-// only processes pending messages if there is a peer connection object and
-// if we have received either an offer or answer.
-- (void)drainMessageQueueIfReady {
-  if (!_peerConnection || !_hasReceivedSdp) {
-    return;
-  }
-  for (ARDSignalingMessage *message in _messageQueue) {
-    [self processSignalingMessage:message];
-  }
-  [_messageQueue removeAllObjects];
-}
-
-// Processes the given signaling message based on its type.
-- (void)processSignalingMessage:(ARDSignalingMessage *)message {
-  NSParameterAssert(_peerConnection ||
-      message.type == kARDSignalingMessageTypeBye);
-  switch (message.type) {
-    case kARDSignalingMessageTypeOffer:
-    case kARDSignalingMessageTypeAnswer: {
-      ARDSessionDescriptionMessage *sdpMessage =
-          (ARDSessionDescriptionMessage *)message;
-      RTCSessionDescription *description = sdpMessage.sessionDescription;
-      // Prefer codec from settings if available.
-      RTCSessionDescription *sdpPreferringCodec =
-          [ARDSDPUtils descriptionForDescription:description
-                             preferredVideoCodec:[_settings currentVideoCodecSettingFromStore]];
-      __weak ARDAppClient *weakSelf = self;
-      [_peerConnection setRemoteDescription:sdpPreferringCodec
-                          completionHandler:^(NSError *error) {
-        ARDAppClient *strongSelf = weakSelf;
-        [strongSelf peerConnection:strongSelf.peerConnection
-            didSetSessionDescriptionWithError:error];
-      }];
-      break;
-    }
-    case kARDSignalingMessageTypeCandidate: {
-      ARDICECandidateMessage *candidateMessage =
-          (ARDICECandidateMessage *)message;
-      [_peerConnection addIceCandidate:candidateMessage.candidate];
-      break;
-    }
-    case kARDSignalingMessageTypeCandidateRemoval: {
-      ARDICECandidateRemovalMessage *candidateMessage =
-          (ARDICECandidateRemovalMessage *)message;
-      [_peerConnection removeIceCandidates:candidateMessage.candidates];
-      break;
-    }
-    case kARDSignalingMessageTypeBye:
-      // Other client disconnected.
-      // TODO(tkchin): support waiting in room for next client. For now just
-      // disconnect.
-      [self disconnect];
-      break;
-  }
-}
-
-// Sends a signaling message to the other client. The caller will send messages
-// through the room server, whereas the callee will send messages over the
-// signaling channel.
-- (void)sendSignalingMessage:(ARDSignalingMessage *)message {
-  if (_isInitiator) {
-    __weak ARDAppClient *weakSelf = self;
-    [_roomServerClient sendMessage:message
-                         forRoomId:_roomId
-                          clientId:_clientId
-                 completionHandler:^(ARDMessageResponse *response,
-                                     NSError *error) {
-      ARDAppClient *strongSelf = weakSelf;
-      if (error) {
-        [strongSelf.delegate appClient:strongSelf didError:error];
-        return;
-      }
-      NSError *messageError =
-          [[strongSelf class] errorForMessageResultType:response.result];
-      if (messageError) {
-        [strongSelf.delegate appClient:strongSelf didError:messageError];
-        return;
-      }
-    }];
-  } else {
-    [_channel sendMessage:message];
-  }
-}
-
-- (RTCRtpSender *)createVideoSender {
-  RTCRtpSender *sender =
-      [_peerConnection senderWithKind:kRTCMediaStreamTrackKindVideo
-                             streamId:kARDMediaStreamId];
-  _localVideoTrack = [self createLocalVideoTrack];
-  if (_localVideoTrack) {
-    sender.track = _localVideoTrack;
-    [_delegate appClient:self didReceiveLocalVideoTrack:_localVideoTrack];
-  }
-
-  return sender;
-}
-
-- (void)setMaxBitrateForPeerConnectionVideoSender {
-  for (RTCRtpSender *sender in _peerConnection.senders) {
-    if (sender.track != nil) {
-      if ([sender.track.kind isEqualToString:kARDVideoTrackKind]) {
-        [self setMaxBitrate:[_settings currentMaxBitrateSettingFromStore] forVideoSender:sender];
-      }
-    }
-  }
-}
-
-- (void)setMaxBitrate:(NSNumber *)maxBitrate forVideoSender:(RTCRtpSender *)sender {
-  if (maxBitrate.intValue <= 0) {
-    return;
-  }
-
-  RTCRtpParameters *parametersToModify = sender.parameters;
-  for (RTCRtpEncodingParameters *encoding in parametersToModify.encodings) {
-    encoding.maxBitrateBps = @(maxBitrate.intValue * kKbpsMultiplier);
-  }
-  [sender setParameters:parametersToModify];
-}
-
-- (RTCRtpSender *)createAudioSender {
-  RTCMediaConstraints *constraints = [self defaultMediaAudioConstraints];
-  RTCAudioSource *source = [_factory audioSourceWithConstraints:constraints];
-  RTCAudioTrack *track = [_factory audioTrackWithSource:source
-                                                trackId:kARDAudioTrackId];
-  RTCRtpSender *sender =
-      [_peerConnection senderWithKind:kRTCMediaStreamTrackKindAudio
-                             streamId:kARDMediaStreamId];
-  sender.track = track;
-  return sender;
-}
-
-- (RTCVideoTrack *)createLocalVideoTrack {
-  RTCVideoTrack* localVideoTrack = nil;
-  // The iOS simulator doesn't provide any sort of camera capture
-  // support or emulation (http://goo.gl/rHAnC1) so don't bother
-  // trying to open a local stream.
-#if !TARGET_IPHONE_SIMULATOR
-  if (![_settings currentAudioOnlySettingFromStore]) {
-    RTCVideoSource *source = [_factory videoSource];
-    RTCCameraVideoCapturer *capturer = [[RTCCameraVideoCapturer alloc] initWithDelegate:source];
-    [_delegate appClient:self didCreateLocalCapturer:capturer];
-    localVideoTrack =
-        [_factory videoTrackWithSource:source
-                               trackId:kARDVideoTrackId];
-  }
-#endif
-  return localVideoTrack;
-}
-
-#pragma mark - Collider methods
-
-- (void)registerWithColliderIfReady {
-  if (!self.hasJoinedRoomServerRoom) {
-    return;
-  }
-  // Open WebSocket connection.
-  if (!_channel) {
-    _channel =
-        [[ARDWebSocketChannel alloc] initWithURL:_websocketURL
-                                         restURL:_websocketRestURL
-                                        delegate:self];
-    if (_isLoopback) {
-      _loopbackChannel =
-          [[ARDLoopbackWebSocketChannel alloc] initWithURL:_websocketURL
-                                                   restURL:_websocketRestURL];
-    }
-  }
-  [_channel registerForRoomId:_roomId clientId:_clientId];
-  if (_isLoopback) {
-    [_loopbackChannel registerForRoomId:_roomId clientId:@"LOOPBACK_CLIENT_ID"];
-  }
-}
-
-#pragma mark - Defaults
-
- - (RTCMediaConstraints *)defaultMediaAudioConstraints {
-   NSString *valueLevelControl = [_settings currentUseLevelControllerSettingFromStore] ?
-       kRTCMediaConstraintsValueTrue :
-       kRTCMediaConstraintsValueFalse;
-   NSDictionary *mandatoryConstraints = @{ kRTCMediaConstraintsLevelControl : valueLevelControl };
-   RTCMediaConstraints *constraints =
-       [[RTCMediaConstraints alloc] initWithMandatoryConstraints:mandatoryConstraints
-                                             optionalConstraints:nil];
-   return constraints;
-}
-
-- (RTCMediaConstraints *)defaultAnswerConstraints {
-  return [self defaultOfferConstraints];
-}
-
-- (RTCMediaConstraints *)defaultOfferConstraints {
-  NSDictionary *mandatoryConstraints = @{
-    @"OfferToReceiveAudio" : @"true",
-    @"OfferToReceiveVideo" : @"true"
-  };
-  RTCMediaConstraints* constraints =
-      [[RTCMediaConstraints alloc]
-          initWithMandatoryConstraints:mandatoryConstraints
-                   optionalConstraints:nil];
-  return constraints;
-}
-
-- (RTCMediaConstraints *)defaultPeerConnectionConstraints {
-  if (_defaultPeerConnectionConstraints) {
-    return _defaultPeerConnectionConstraints;
-  }
-  NSString *value = _isLoopback ? @"false" : @"true";
-  NSDictionary *optionalConstraints = @{ @"DtlsSrtpKeyAgreement" : value };
-  RTCMediaConstraints* constraints =
-      [[RTCMediaConstraints alloc]
-          initWithMandatoryConstraints:nil
-                   optionalConstraints:optionalConstraints];
-  return constraints;
-}
-
-#pragma mark - Errors
-
-+ (NSError *)errorForJoinResultType:(ARDJoinResultType)resultType {
-  NSError *error = nil;
-  switch (resultType) {
-    case kARDJoinResultTypeSuccess:
-      break;
-    case kARDJoinResultTypeUnknown: {
-      error = [[NSError alloc] initWithDomain:kARDAppClientErrorDomain
-                                         code:kARDAppClientErrorUnknown
-                                     userInfo:@{
-        NSLocalizedDescriptionKey: @"Unknown error.",
-      }];
-      break;
-    }
-    case kARDJoinResultTypeFull: {
-      error = [[NSError alloc] initWithDomain:kARDAppClientErrorDomain
-                                         code:kARDAppClientErrorRoomFull
-                                     userInfo:@{
-        NSLocalizedDescriptionKey: @"Room is full.",
-      }];
-      break;
-    }
-  }
-  return error;
-}
-
-+ (NSError *)errorForMessageResultType:(ARDMessageResultType)resultType {
-  NSError *error = nil;
-  switch (resultType) {
-    case kARDMessageResultTypeSuccess:
-      break;
-    case kARDMessageResultTypeUnknown:
-      error = [[NSError alloc] initWithDomain:kARDAppClientErrorDomain
-                                         code:kARDAppClientErrorUnknown
-                                     userInfo:@{
-        NSLocalizedDescriptionKey: @"Unknown error.",
-      }];
-      break;
-    case kARDMessageResultTypeInvalidClient:
-      error = [[NSError alloc] initWithDomain:kARDAppClientErrorDomain
-                                         code:kARDAppClientErrorInvalidClient
-                                     userInfo:@{
-        NSLocalizedDescriptionKey: @"Invalid client.",
-      }];
-      break;
-    case kARDMessageResultTypeInvalidRoom:
-      error = [[NSError alloc] initWithDomain:kARDAppClientErrorDomain
-                                         code:kARDAppClientErrorInvalidRoom
-                                     userInfo:@{
-        NSLocalizedDescriptionKey: @"Invalid room.",
-      }];
-      break;
-  }
-  return error;
-}
-
-@end
diff --git a/examples/objc/AppRTCMobile/ARDAppEngineClient.h b/examples/objc/AppRTCMobile/ARDAppEngineClient.h
deleted file mode 100644
index 7514f36..0000000
--- a/examples/objc/AppRTCMobile/ARDAppEngineClient.h
+++ /dev/null
@@ -1,14 +0,0 @@
-/*
- *  Copyright 2014 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.
- */
-
-#import "ARDRoomServerClient.h"
-
-@interface ARDAppEngineClient : NSObject <ARDRoomServerClient>
-@end
diff --git a/examples/objc/AppRTCMobile/ARDAppEngineClient.m b/examples/objc/AppRTCMobile/ARDAppEngineClient.m
deleted file mode 100644
index ad7a6c2..0000000
--- a/examples/objc/AppRTCMobile/ARDAppEngineClient.m
+++ /dev/null
@@ -1,179 +0,0 @@
-/*
- *  Copyright 2014 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.
- */
-
-#import "ARDAppEngineClient.h"
-
-#import "WebRTC/RTCLogging.h"
-
-#import "ARDJoinResponse.h"
-#import "ARDMessageResponse.h"
-#import "ARDSignalingMessage.h"
-#import "ARDUtilities.h"
-
-// TODO(tkchin): move these to a configuration object.
-static NSString * const kARDRoomServerHostUrl =
-    @"https://appr.tc";
-static NSString * const kARDRoomServerJoinFormat =
-    @"https://appr.tc/join/%@";
-static NSString * const kARDRoomServerJoinFormatLoopback =
-    @"https://appr.tc/join/%@?debug=loopback";
-static NSString * const kARDRoomServerMessageFormat =
-    @"https://appr.tc/message/%@/%@";
-static NSString * const kARDRoomServerLeaveFormat =
-    @"https://appr.tc/leave/%@/%@";
-
-static NSString * const kARDAppEngineClientErrorDomain = @"ARDAppEngineClient";
-static NSInteger const kARDAppEngineClientErrorBadResponse = -1;
-
-@implementation ARDAppEngineClient
-
-#pragma mark - ARDRoomServerClient
-
-- (void)joinRoomWithRoomId:(NSString *)roomId
-                isLoopback:(BOOL)isLoopback
-         completionHandler:(void (^)(ARDJoinResponse *response,
-                                     NSError *error))completionHandler {
-  NSParameterAssert(roomId.length);
-
-  NSString *urlString = nil;
-  if (isLoopback) {
-    urlString =
-        [NSString stringWithFormat:kARDRoomServerJoinFormatLoopback, roomId];
-  } else {
-    urlString =
-        [NSString stringWithFormat:kARDRoomServerJoinFormat, roomId];
-  }
-
-  NSURL *roomURL = [NSURL URLWithString:urlString];
-  RTCLog(@"Joining room:%@ on room server.", roomId);
-  NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:roomURL];
-  request.HTTPMethod = @"POST";
-  __weak ARDAppEngineClient *weakSelf = self;
-  [NSURLConnection sendAsyncRequest:request
-                  completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
-                    ARDAppEngineClient *strongSelf = weakSelf;
-                    if (error) {
-                      if (completionHandler) {
-                        completionHandler(nil, error);
-                      }
-                      return;
-                    }
-                    ARDJoinResponse *joinResponse = [ARDJoinResponse responseFromJSONData:data];
-                    if (!joinResponse) {
-                      if (completionHandler) {
-                        NSError *error = [[self class] badResponseError];
-                        completionHandler(nil, error);
-                      }
-                      return;
-                    }
-                    if (completionHandler) {
-                      completionHandler(joinResponse, nil);
-                    }
-                  }];
-}
-
-- (void)sendMessage:(ARDSignalingMessage *)message
-            forRoomId:(NSString *)roomId
-             clientId:(NSString *)clientId
-    completionHandler:(void (^)(ARDMessageResponse *response,
-                                NSError *error))completionHandler {
-  NSParameterAssert(message);
-  NSParameterAssert(roomId.length);
-  NSParameterAssert(clientId.length);
-
-  NSData *data = [message JSONData];
-  NSString *urlString =
-      [NSString stringWithFormat:
-          kARDRoomServerMessageFormat, roomId, clientId];
-  NSURL *url = [NSURL URLWithString:urlString];
-  RTCLog(@"C->RS POST: %@", message);
-  NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
-  request.HTTPMethod = @"POST";
-  request.HTTPBody = data;
-  __weak ARDAppEngineClient *weakSelf = self;
-  [NSURLConnection sendAsyncRequest:request
-                  completionHandler:^(NSURLResponse *response,
-                                      NSData *data,
-                                      NSError *error) {
-    ARDAppEngineClient *strongSelf = weakSelf;
-    if (error) {
-      if (completionHandler) {
-        completionHandler(nil, error);
-      }
-      return;
-    }
-    ARDMessageResponse *messageResponse =
-        [ARDMessageResponse responseFromJSONData:data];
-    if (!messageResponse) {
-      if (completionHandler) {
-        NSError *error = [[self class] badResponseError];
-        completionHandler(nil, error);
-      }
-      return;
-    }
-    if (completionHandler) {
-      completionHandler(messageResponse, nil);
-    }
-  }];
-}
-
-- (void)leaveRoomWithRoomId:(NSString *)roomId
-                   clientId:(NSString *)clientId
-          completionHandler:(void (^)(NSError *error))completionHandler {
-  NSParameterAssert(roomId.length);
-  NSParameterAssert(clientId.length);
-
-  NSString *urlString =
-      [NSString stringWithFormat:kARDRoomServerLeaveFormat, roomId, clientId];
-  NSURL *url = [NSURL URLWithString:urlString];
-  NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
-  request.HTTPMethod = @"POST";
-
-  RTCLog(@"C->RS: BYE");
-  __block NSError *error = nil;
-
-  // We want a synchronous request so that we know that we've left the room on
-  // room server before we do any further work.
-  dispatch_semaphore_t sem = dispatch_semaphore_create(0);
-  [NSURLConnection sendAsyncRequest:request
-                  completionHandler:^(NSURLResponse *response, NSData *data, NSError *e) {
-                    if (e) {
-                      error = e;
-                    }
-                    dispatch_semaphore_signal(sem);
-                  }];
-
-  dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);
-  if (error) {
-    RTCLogError(@"Error leaving room %@ on room server: %@", roomId, error.localizedDescription);
-    if (completionHandler) {
-      completionHandler(error);
-    }
-    return;
-  }
-  RTCLog(@"Left room:%@ on room server.", roomId);
-  if (completionHandler) {
-    completionHandler(nil);
-  }
-}
-
-#pragma mark - Private
-
-+ (NSError *)badResponseError {
-  NSError *error =
-      [[NSError alloc] initWithDomain:kARDAppEngineClientErrorDomain
-                                 code:kARDAppEngineClientErrorBadResponse
-                             userInfo:@{
-    NSLocalizedDescriptionKey: @"Error parsing response.",
-  }];
-  return error;
-}
-
-@end
diff --git a/examples/objc/AppRTCMobile/ARDBitrateTracker.h b/examples/objc/AppRTCMobile/ARDBitrateTracker.h
deleted file mode 100644
index 81ac4b4..0000000
--- a/examples/objc/AppRTCMobile/ARDBitrateTracker.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-#import <Foundation/Foundation.h>
-
-/** Class used to estimate bitrate based on byte count. It is expected that
- *  byte count is monotonocially increasing. This class tracks the times that
- *  byte count is updated, and measures the bitrate based on the byte difference
- *  over the interval between updates.
- */
-@interface ARDBitrateTracker : NSObject
-
-/** The bitrate in bits per second. */
-@property(nonatomic, readonly) double bitrate;
-/** The bitrate as a formatted string in bps, Kbps or Mbps. */
-@property(nonatomic, readonly) NSString *bitrateString;
-
-/** Converts the bitrate to a readable format in bps, Kbps or Mbps. */
-+ (NSString *)bitrateStringForBitrate:(double)bitrate;
-/** Updates the tracked bitrate with the new byte count. */
-- (void)updateBitrateWithCurrentByteCount:(NSInteger)byteCount;
-
-@end
diff --git a/examples/objc/AppRTCMobile/ARDBitrateTracker.m b/examples/objc/AppRTCMobile/ARDBitrateTracker.m
deleted file mode 100644
index 8158229..0000000
--- a/examples/objc/AppRTCMobile/ARDBitrateTracker.m
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-#import "ARDBitrateTracker.h"
-
-#import <QuartzCore/QuartzCore.h>
-
-@implementation ARDBitrateTracker {
-  CFTimeInterval _prevTime;
-  NSInteger _prevByteCount;
-}
-
-@synthesize bitrate = _bitrate;
-
-+ (NSString *)bitrateStringForBitrate:(double)bitrate {
-  if (bitrate > 1e6) {
-    return [NSString stringWithFormat:@"%.2fMbps", bitrate * 1e-6];
-  } else if (bitrate > 1e3) {
-    return [NSString stringWithFormat:@"%.0fKbps", bitrate * 1e-3];
-  } else {
-    return [NSString stringWithFormat:@"%.0fbps", bitrate];
-  }
-}
-
-- (NSString *)bitrateString {
-  return [[self class] bitrateStringForBitrate:_bitrate];
-}
-
-- (void)updateBitrateWithCurrentByteCount:(NSInteger)byteCount {
-  CFTimeInterval currentTime = CACurrentMediaTime();
-  if (_prevTime && (byteCount > _prevByteCount)) {
-    _bitrate = (byteCount - _prevByteCount) * 8 / (currentTime - _prevTime);
-  }
-  _prevByteCount = byteCount;
-  _prevTime = currentTime;
-}
-
-@end
diff --git a/examples/objc/AppRTCMobile/ARDCaptureController.h b/examples/objc/AppRTCMobile/ARDCaptureController.h
deleted file mode 100644
index bdae93a..0000000
--- a/examples/objc/AppRTCMobile/ARDCaptureController.h
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- *  Copyright 2017 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/RTCCameraVideoCapturer.h>
-
-@class ARDSettingsModel;
-
-// Controls the camera. Handles starting the capture, switching cameras etc.
-@interface ARDCaptureController : NSObject
-
-- (instancetype)initWithCapturer:(RTCCameraVideoCapturer *)capturer
-                        settings:(ARDSettingsModel *)settings;
-- (void)startCapture;
-- (void)stopCapture;
-- (void)switchCamera;
-
-@end
diff --git a/examples/objc/AppRTCMobile/ARDCaptureController.m b/examples/objc/AppRTCMobile/ARDCaptureController.m
deleted file mode 100644
index da6a37a..0000000
--- a/examples/objc/AppRTCMobile/ARDCaptureController.m
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- *  Copyright 2017 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.
- */
-
-#import "ARDCaptureController.h"
-
-#import "ARDSettingsModel.h"
-
-@implementation ARDCaptureController {
-  RTCCameraVideoCapturer *_capturer;
-  ARDSettingsModel *_settings;
-  BOOL _usingFrontCamera;
-}
-
-- (instancetype)initWithCapturer:(RTCCameraVideoCapturer *)capturer
-                        settings:(ARDSettingsModel *)settings {
-  if ([super init]) {
-    _capturer = capturer;
-    _settings = settings;
-    _usingFrontCamera = YES;
-  }
-
-  return self;
-}
-
-- (void)startCapture {
-  AVCaptureDevicePosition position =
-      _usingFrontCamera ? AVCaptureDevicePositionFront : AVCaptureDevicePositionBack;
-  AVCaptureDevice *device = [self findDeviceForPosition:position];
-  AVCaptureDeviceFormat *format = [self selectFormatForDevice:device];
-  NSInteger fps = [self selectFpsForFormat:format];
-
-  [_capturer startCaptureWithDevice:device format:format fps:fps];
-}
-
-- (void)stopCapture {
-  [_capturer stopCapture];
-}
-
-- (void)switchCamera {
-  _usingFrontCamera = !_usingFrontCamera;
-  [self startCapture];
-}
-
-#pragma mark - Private
-
-- (AVCaptureDevice *)findDeviceForPosition:(AVCaptureDevicePosition)position {
-  NSArray<AVCaptureDevice *> *captureDevices = [RTCCameraVideoCapturer captureDevices];
-  for (AVCaptureDevice *device in captureDevices) {
-    if (device.position == position) {
-      return device;
-    }
-  }
-  return captureDevices[0];
-}
-
-- (AVCaptureDeviceFormat *)selectFormatForDevice:(AVCaptureDevice *)device {
-  NSArray<AVCaptureDeviceFormat *> *formats =
-      [RTCCameraVideoCapturer supportedFormatsForDevice:device];
-  int targetWidth = [_settings currentVideoResolutionWidthFromStore];
-  int targetHeight = [_settings currentVideoResolutionHeightFromStore];
-  AVCaptureDeviceFormat *selectedFormat = nil;
-  int currentDiff = INT_MAX;
-
-  for (AVCaptureDeviceFormat *format in formats) {
-    CMVideoDimensions dimension = CMVideoFormatDescriptionGetDimensions(format.formatDescription);
-    int diff = abs(targetWidth - dimension.width) + abs(targetHeight - dimension.height);
-    if (diff < currentDiff) {
-      selectedFormat = format;
-      currentDiff = diff;
-    }
-  }
-
-  NSAssert(selectedFormat != nil, @"No suitable capture format found.");
-  return selectedFormat;
-}
-
-- (NSInteger)selectFpsForFormat:(AVCaptureDeviceFormat *)format {
-  Float64 maxFramerate = 0;
-  for (AVFrameRateRange *fpsRange in format.videoSupportedFrameRateRanges) {
-    maxFramerate = fmax(maxFramerate, fpsRange.maxFrameRate);
-  }
-  return maxFramerate;
-}
-
-@end
diff --git a/examples/objc/AppRTCMobile/ARDJoinResponse+Internal.h b/examples/objc/AppRTCMobile/ARDJoinResponse+Internal.h
deleted file mode 100644
index b320299..0000000
--- a/examples/objc/AppRTCMobile/ARDJoinResponse+Internal.h
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- *  Copyright 2014 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.
- */
-
-#import "ARDJoinResponse.h"
-
-@interface ARDJoinResponse ()
-
-@property(nonatomic, assign) ARDJoinResultType result;
-@property(nonatomic, assign) BOOL isInitiator;
-@property(nonatomic, strong) NSString *roomId;
-@property(nonatomic, strong) NSString *clientId;
-@property(nonatomic, strong) NSArray *messages;
-@property(nonatomic, strong) NSURL *webSocketURL;
-@property(nonatomic, strong) NSURL *webSocketRestURL;
-
-@end
diff --git a/examples/objc/AppRTCMobile/ARDJoinResponse.h b/examples/objc/AppRTCMobile/ARDJoinResponse.h
deleted file mode 100644
index 2911202..0000000
--- a/examples/objc/AppRTCMobile/ARDJoinResponse.h
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- *  Copyright 2014 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.
- */
-
-#import <Foundation/Foundation.h>
-
-typedef NS_ENUM(NSInteger, ARDJoinResultType) {
-  kARDJoinResultTypeUnknown,
-  kARDJoinResultTypeSuccess,
-  kARDJoinResultTypeFull
-};
-
-// Result of joining a room on the room server.
-@interface ARDJoinResponse : NSObject
-
-@property(nonatomic, readonly) ARDJoinResultType result;
-@property(nonatomic, readonly) BOOL isInitiator;
-@property(nonatomic, readonly) NSString *roomId;
-@property(nonatomic, readonly) NSString *clientId;
-@property(nonatomic, readonly) NSArray *messages;
-@property(nonatomic, readonly) NSURL *webSocketURL;
-@property(nonatomic, readonly) NSURL *webSocketRestURL;
-
-+ (ARDJoinResponse *)responseFromJSONData:(NSData *)data;
-
-@end
diff --git a/examples/objc/AppRTCMobile/ARDJoinResponse.m b/examples/objc/AppRTCMobile/ARDJoinResponse.m
deleted file mode 100644
index 87d58e0..0000000
--- a/examples/objc/AppRTCMobile/ARDJoinResponse.m
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- *  Copyright 2014 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.
- */
-
-#import "ARDJoinResponse+Internal.h"
-
-#import "ARDSignalingMessage.h"
-#import "ARDUtilities.h"
-#import "RTCIceServer+JSON.h"
-
-static NSString const *kARDJoinResultKey = @"result";
-static NSString const *kARDJoinResultParamsKey = @"params";
-static NSString const *kARDJoinInitiatorKey = @"is_initiator";
-static NSString const *kARDJoinRoomIdKey = @"room_id";
-static NSString const *kARDJoinClientIdKey = @"client_id";
-static NSString const *kARDJoinMessagesKey = @"messages";
-static NSString const *kARDJoinWebSocketURLKey = @"wss_url";
-static NSString const *kARDJoinWebSocketRestURLKey = @"wss_post_url";
-
-@implementation ARDJoinResponse
-
-@synthesize result = _result;
-@synthesize isInitiator = _isInitiator;
-@synthesize roomId = _roomId;
-@synthesize clientId = _clientId;
-@synthesize messages = _messages;
-@synthesize webSocketURL = _webSocketURL;
-@synthesize webSocketRestURL = _webSocketRestURL;
-
-+ (ARDJoinResponse *)responseFromJSONData:(NSData *)data {
-  NSDictionary *responseJSON = [NSDictionary dictionaryWithJSONData:data];
-  if (!responseJSON) {
-    return nil;
-  }
-  ARDJoinResponse *response = [[ARDJoinResponse alloc] init];
-  NSString *resultString = responseJSON[kARDJoinResultKey];
-  response.result = [[self class] resultTypeFromString:resultString];
-  NSDictionary *params = responseJSON[kARDJoinResultParamsKey];
-
-  response.isInitiator = [params[kARDJoinInitiatorKey] boolValue];
-  response.roomId = params[kARDJoinRoomIdKey];
-  response.clientId = params[kARDJoinClientIdKey];
-
-  // Parse messages.
-  NSArray *messages = params[kARDJoinMessagesKey];
-  NSMutableArray *signalingMessages =
-      [NSMutableArray arrayWithCapacity:messages.count];
-  for (NSString *message in messages) {
-    ARDSignalingMessage *signalingMessage =
-        [ARDSignalingMessage messageFromJSONString:message];
-    [signalingMessages addObject:signalingMessage];
-  }
-  response.messages = signalingMessages;
-
-  // Parse websocket urls.
-  NSString *webSocketURLString = params[kARDJoinWebSocketURLKey];
-  response.webSocketURL = [NSURL URLWithString:webSocketURLString];
-  NSString *webSocketRestURLString = params[kARDJoinWebSocketRestURLKey];
-  response.webSocketRestURL = [NSURL URLWithString:webSocketRestURLString];
-
-  return response;
-}
-
-#pragma mark - Private
-
-+ (ARDJoinResultType)resultTypeFromString:(NSString *)resultString {
-  ARDJoinResultType result = kARDJoinResultTypeUnknown;
-  if ([resultString isEqualToString:@"SUCCESS"]) {
-    result = kARDJoinResultTypeSuccess;
-  } else if ([resultString isEqualToString:@"FULL"]) {
-    result = kARDJoinResultTypeFull;
-  }
-  return result;
-}
-
-@end
diff --git a/examples/objc/AppRTCMobile/ARDMessageResponse+Internal.h b/examples/objc/AppRTCMobile/ARDMessageResponse+Internal.h
deleted file mode 100644
index 66ee761..0000000
--- a/examples/objc/AppRTCMobile/ARDMessageResponse+Internal.h
+++ /dev/null
@@ -1,17 +0,0 @@
-/*
- *  Copyright 2014 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.
- */
-
-#import "ARDMessageResponse.h"
-
-@interface ARDMessageResponse ()
-
-@property(nonatomic, assign) ARDMessageResultType result;
-
-@end
diff --git a/examples/objc/AppRTCMobile/ARDMessageResponse.h b/examples/objc/AppRTCMobile/ARDMessageResponse.h
deleted file mode 100644
index 65468cd..0000000
--- a/examples/objc/AppRTCMobile/ARDMessageResponse.h
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- *  Copyright 2014 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.
- */
-
-#import <Foundation/Foundation.h>
-
-typedef NS_ENUM(NSInteger, ARDMessageResultType) {
-  kARDMessageResultTypeUnknown,
-  kARDMessageResultTypeSuccess,
-  kARDMessageResultTypeInvalidRoom,
-  kARDMessageResultTypeInvalidClient
-};
-
-@interface ARDMessageResponse : NSObject
-
-@property(nonatomic, readonly) ARDMessageResultType result;
-
-+ (ARDMessageResponse *)responseFromJSONData:(NSData *)data;
-
-@end
diff --git a/examples/objc/AppRTCMobile/ARDMessageResponse.m b/examples/objc/AppRTCMobile/ARDMessageResponse.m
deleted file mode 100644
index 0f5383f..0000000
--- a/examples/objc/AppRTCMobile/ARDMessageResponse.m
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- *  Copyright 2014 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.
- */
-
-#import "ARDMessageResponse+Internal.h"
-
-#import "ARDUtilities.h"
-
-static NSString const *kARDMessageResultKey = @"result";
-
-@implementation ARDMessageResponse
-
-@synthesize result = _result;
-
-+ (ARDMessageResponse *)responseFromJSONData:(NSData *)data {
-  NSDictionary *responseJSON = [NSDictionary dictionaryWithJSONData:data];
-  if (!responseJSON) {
-    return nil;
-  }
-  ARDMessageResponse *response = [[ARDMessageResponse alloc] init];
-  response.result =
-      [[self class] resultTypeFromString:responseJSON[kARDMessageResultKey]];
-  return response;
-}
-
-#pragma mark - Private
-
-+ (ARDMessageResultType)resultTypeFromString:(NSString *)resultString {
-  ARDMessageResultType result = kARDMessageResultTypeUnknown;
-  if ([resultString isEqualToString:@"SUCCESS"]) {
-    result = kARDMessageResultTypeSuccess;
-  } else if ([resultString isEqualToString:@"INVALID_CLIENT"]) {
-    result = kARDMessageResultTypeInvalidClient;
-  } else if ([resultString isEqualToString:@"INVALID_ROOM"]) {
-    result = kARDMessageResultTypeInvalidRoom;
-  }
-  return result;
-}
-
-@end
diff --git a/examples/objc/AppRTCMobile/ARDRoomServerClient.h b/examples/objc/AppRTCMobile/ARDRoomServerClient.h
deleted file mode 100644
index 70694a8..0000000
--- a/examples/objc/AppRTCMobile/ARDRoomServerClient.h
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- *  Copyright 2014 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.
- */
-
-#import <Foundation/Foundation.h>
-
-@class ARDJoinResponse;
-@class ARDMessageResponse;
-@class ARDSignalingMessage;
-
-@protocol ARDRoomServerClient <NSObject>
-
-- (void)joinRoomWithRoomId:(NSString *)roomId
-                isLoopback:(BOOL)isLoopback
-         completionHandler:(void (^)(ARDJoinResponse *response,
-                                     NSError *error))completionHandler;
-
-- (void)sendMessage:(ARDSignalingMessage *)message
-            forRoomId:(NSString *)roomId
-             clientId:(NSString *)clientId
-    completionHandler:(void (^)(ARDMessageResponse *response,
-                                NSError *error))completionHandler;
-
-- (void)leaveRoomWithRoomId:(NSString *)roomId
-                   clientId:(NSString *)clientId
-          completionHandler:(void (^)(NSError *error))completionHandler;
-
-@end
diff --git a/examples/objc/AppRTCMobile/ARDSDPUtils.h b/examples/objc/AppRTCMobile/ARDSDPUtils.h
deleted file mode 100644
index 18795af..0000000
--- a/examples/objc/AppRTCMobile/ARDSDPUtils.h
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-#import <Foundation/Foundation.h>
-
-@class RTCSessionDescription;
-
-@interface ARDSDPUtils : NSObject
-
-// Updates the original SDP description to instead prefer the specified video
-// codec. We do this by placing the specified codec at the beginning of the
-// codec list if it exists in the sdp.
-+ (RTCSessionDescription *)
-    descriptionForDescription:(RTCSessionDescription *)description
-          preferredVideoCodec:(NSString *)codec;
-
-@end
diff --git a/examples/objc/AppRTCMobile/ARDSDPUtils.m b/examples/objc/AppRTCMobile/ARDSDPUtils.m
deleted file mode 100644
index a9442aa..0000000
--- a/examples/objc/AppRTCMobile/ARDSDPUtils.m
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-#import "ARDSDPUtils.h"
-
-#import "WebRTC/RTCLogging.h"
-#import "WebRTC/RTCSessionDescription.h"
-
-@implementation ARDSDPUtils
-
-+ (RTCSessionDescription *)
-    descriptionForDescription:(RTCSessionDescription *)description
-          preferredVideoCodec:(NSString *)codec {
-  NSString *sdpString = description.sdp;
-  NSString *lineSeparator = @"\r\n";
-  NSString *mLineSeparator = @" ";
-  // Copied from PeerConnectionClient.java.
-  // TODO(tkchin): Move this to a shared C++ file.
-  NSMutableArray *lines =
-      [NSMutableArray arrayWithArray:
-          [sdpString componentsSeparatedByString:lineSeparator]];
-  // Find the line starting with "m=video".
-  NSInteger mLineIndex = -1;
-  for (NSInteger i = 0; i < lines.count; ++i) {
-    if ([lines[i] hasPrefix:@"m=video"]) {
-      mLineIndex = i;
-      break;
-    }
-  }
-  if (mLineIndex == -1) {
-    RTCLog(@"No m=video line, so can't prefer %@", codec);
-    return description;
-  }
-  // An array with all payload types with name |codec|. The payload types are
-  // integers in the range 96-127, but they are stored as strings here.
-  NSMutableArray *codecPayloadTypes = [[NSMutableArray alloc] init];
-  // a=rtpmap:<payload type> <encoding name>/<clock rate>
-  // [/<encoding parameters>]
-  NSString *pattern =
-      [NSString stringWithFormat:@"^a=rtpmap:(\\d+) %@(/\\d+)+[\r]?$", codec];
-  NSRegularExpression *regex =
-      [NSRegularExpression regularExpressionWithPattern:pattern
-                                                options:0
-                                                  error:nil];
-  for (NSString *line in lines) {
-    NSTextCheckingResult *codecMatches =
-        [regex firstMatchInString:line
-                          options:0
-                            range:NSMakeRange(0, line.length)];
-    if (codecMatches) {
-      [codecPayloadTypes
-          addObject:[line substringWithRange:[codecMatches rangeAtIndex:1]]];
-    }
-  }
-  if ([codecPayloadTypes count] == 0) {
-    RTCLog(@"No payload types with name %@", codec);
-    return description;
-  }
-  NSArray *origMLineParts =
-      [lines[mLineIndex] componentsSeparatedByString:mLineSeparator];
-  // The format of ML should be: m=<media> <port> <proto> <fmt> ...
-  const int kHeaderLength = 3;
-  if (origMLineParts.count <= kHeaderLength) {
-    RTCLogWarning(@"Wrong SDP media description format: %@", lines[mLineIndex]);
-    return description;
-  }
-  // Split the line into header and payloadTypes.
-  NSRange headerRange = NSMakeRange(0, kHeaderLength);
-  NSRange payloadRange =
-      NSMakeRange(kHeaderLength, origMLineParts.count - kHeaderLength);
-  NSArray *header = [origMLineParts subarrayWithRange:headerRange];
-  NSMutableArray *payloadTypes = [NSMutableArray
-      arrayWithArray:[origMLineParts subarrayWithRange:payloadRange]];
-  // Reconstruct the line with |codecPayloadTypes| moved to the beginning of the
-  // payload types.
-  NSMutableArray *newMLineParts = [NSMutableArray arrayWithCapacity:origMLineParts.count];
-  [newMLineParts addObjectsFromArray:header];
-  [newMLineParts addObjectsFromArray:codecPayloadTypes];
-  [payloadTypes removeObjectsInArray:codecPayloadTypes];
-  [newMLineParts addObjectsFromArray:payloadTypes];
-
-  NSString *newMLine = [newMLineParts componentsJoinedByString:mLineSeparator];
-  [lines replaceObjectAtIndex:mLineIndex
-                   withObject:newMLine];
-
-  NSString *mangledSdpString = [lines componentsJoinedByString:lineSeparator];
-  return [[RTCSessionDescription alloc] initWithType:description.type
-                                                 sdp:mangledSdpString];
-}
-
-@end
diff --git a/examples/objc/AppRTCMobile/ARDSettingsModel+Private.h b/examples/objc/AppRTCMobile/ARDSettingsModel+Private.h
deleted file mode 100644
index 08d863d..0000000
--- a/examples/objc/AppRTCMobile/ARDSettingsModel+Private.h
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- *  Copyright 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.
- */
-
-#import <Foundation/Foundation.h>
-#import "ARDSettingsModel.h"
-
-@class ARDSettingsStore;
-
-NS_ASSUME_NONNULL_BEGIN
-@interface ARDSettingsModel ()
-- (ARDSettingsStore *)settingsStore;
-@end
-NS_ASSUME_NONNULL_END
diff --git a/examples/objc/AppRTCMobile/ARDSettingsModel.h b/examples/objc/AppRTCMobile/ARDSettingsModel.h
deleted file mode 100644
index 8b2679f..0000000
--- a/examples/objc/AppRTCMobile/ARDSettingsModel.h
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- *  Copyright 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.
- */
-
-#import <Foundation/Foundation.h>
-
-NS_ASSUME_NONNULL_BEGIN
-
-/**
- * Model class for user defined settings.
- *
- * Handles storing the settings and provides default values if setting is not
- * set. Also provides list of available options for different settings. Stores
- * for example video codec, video resolution and maximum bitrate.
- */
-@interface ARDSettingsModel : NSObject
-
-/**
- * Returns array of available capture resoultions.
- *
- * The capture resolutions are represented as strings in the following format
- * [width]x[height]
- */
-- (NSArray<NSString *> *)availableVideoResolutions;
-
-/**
- * Returns current video resolution string.
- * If no resolution is in store, default value of 640x480 is returned.
- * When defaulting to value, the default is saved in store for consistency reasons.
- */
-- (NSString *)currentVideoResolutionSettingFromStore;
-- (int)currentVideoResolutionWidthFromStore;
-- (int)currentVideoResolutionHeightFromStore;
-
-/**
- * Stores the provided video resolution string into the store.
- *
- * If the provided resolution is no part of the available video resolutions
- * the store operation will not be executed and NO will be returned.
- * @param resolution the string to be stored.
- * @return YES/NO depending on success.
- */
-- (BOOL)storeVideoResolutionSetting:(NSString *)resolution;
-
-/**
- * Returns array of available video codecs.
- */
-- (NSArray<NSString *> *)availableVideoCodecs;
-
-/**
- * Returns current video codec setting from store if present or default (H264) otherwise.
- */
-- (NSString *)currentVideoCodecSettingFromStore;
-
-/**
- * Stores the provided video codec setting into the store.
- *
- * If the provided video codec is not part of the available video codecs
- * the store operation will not be executed and NO will be returned.
- * @param video codec settings the string to be stored.
- * @return YES/NO depending on success.
- */
-- (BOOL)storeVideoCodecSetting:(NSString *)videoCodec;
-
-/**
- * Returns current max bitrate setting from store if present.
- */
-- (nullable NSNumber *)currentMaxBitrateSettingFromStore;
-
-/**
- * Stores the provided bitrate value into the store.
- *
- * @param bitrate NSNumber representation of the max bitrate value.
- */
-- (void)storeMaxBitrateSetting:(nullable NSNumber *)bitrate;
-
-/**
- * Returns current audio only setting from store if present or default (NO) otherwise.
- */
-- (BOOL)currentAudioOnlySettingFromStore;
-
-/**
- * Stores the provided audio only setting into the store.
- *
- * @param setting the boolean value to be stored.
- */
-- (void)storeAudioOnlySetting:(BOOL)audioOnly;
-
-/**
- * Returns current create AecDump setting from store if present or default (NO) otherwise.
- */
-- (BOOL)currentCreateAecDumpSettingFromStore;
-
-/**
- * Stores the provided create AecDump setting into the store.
- *
- * @param setting the boolean value to be stored.
- */
-- (void)storeCreateAecDumpSetting:(BOOL)createAecDump;
-
-/**
- * Returns current setting whether to use level controller from store if present or default (NO)
- * otherwise.
- */
-- (BOOL)currentUseLevelControllerSettingFromStore;
-
-/**
- * Stores the provided use level controller setting into the store.
- *
- * @param setting the boolean value to be stored.
- */
-- (void)storeUseLevelControllerSetting:(BOOL)useLevelController;
-
-/**
- * Returns current setting whether to use manual audio config from store if present or default (YES)
- * otherwise.
- */
-- (BOOL)currentUseManualAudioConfigSettingFromStore;
-
-/**
- * Stores the provided use manual audio config setting into the store.
- *
- * @param setting the boolean value to be stored.
- */
-- (void)storeUseManualAudioConfigSetting:(BOOL)useManualAudioConfig;
-
-@end
-NS_ASSUME_NONNULL_END
diff --git a/examples/objc/AppRTCMobile/ARDSettingsModel.m b/examples/objc/AppRTCMobile/ARDSettingsModel.m
deleted file mode 100644
index 0d3ca7c..0000000
--- a/examples/objc/AppRTCMobile/ARDSettingsModel.m
+++ /dev/null
@@ -1,182 +0,0 @@
-/*
- *  Copyright 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.
- */
-
-#import "ARDSettingsModel+Private.h"
-#import "ARDSettingsStore.h"
-#import "WebRTC/RTCCameraVideoCapturer.h"
-#import "WebRTC/RTCMediaConstraints.h"
-
-NS_ASSUME_NONNULL_BEGIN
-
-static NSArray<NSString *> *videoCodecsStaticValues() {
-  return @[ @"H264", @"VP8", @"VP9" ];
-}
-
-@interface ARDSettingsModel () {
-  ARDSettingsStore *_settingsStore;
-}
-@end
-
-@implementation ARDSettingsModel
-
-- (NSArray<NSString *> *)availableVideoResolutions {
-  NSMutableSet<NSArray<NSNumber *> *> *resolutions =
-      [[NSMutableSet<NSArray<NSNumber *> *> alloc] init];
-  for (AVCaptureDevice *device in [RTCCameraVideoCapturer captureDevices]) {
-    for (AVCaptureDeviceFormat *format in
-         [RTCCameraVideoCapturer supportedFormatsForDevice:device]) {
-      CMVideoDimensions resolution =
-          CMVideoFormatDescriptionGetDimensions(format.formatDescription);
-      NSArray<NSNumber *> *resolutionObject = @[ @(resolution.width), @(resolution.height) ];
-      [resolutions addObject:resolutionObject];
-    }
-  }
-
-  NSArray<NSArray<NSNumber *> *> *sortedResolutions =
-      [[resolutions allObjects] sortedArrayUsingComparator:^NSComparisonResult(
-                                    NSArray<NSNumber *> *obj1, NSArray<NSNumber *> *obj2) {
-        return obj1.firstObject > obj2.firstObject;
-      }];
-
-  NSMutableArray<NSString *> *resolutionStrings = [[NSMutableArray<NSString *> alloc] init];
-  for (NSArray<NSNumber *> *resolution in sortedResolutions) {
-    NSString *resolutionString =
-        [NSString stringWithFormat:@"%@x%@", resolution.firstObject, resolution.lastObject];
-    [resolutionStrings addObject:resolutionString];
-  }
-
-  return [resolutionStrings copy];
-}
-
-- (NSString *)currentVideoResolutionSettingFromStore {
-  [self registerStoreDefaults];
-  return [[self settingsStore] videoResolution];
-}
-
-- (BOOL)storeVideoResolutionSetting:(NSString *)resolution {
-  if (![[self availableVideoResolutions] containsObject:resolution]) {
-    return NO;
-  }
-  [[self settingsStore] setVideoResolution:resolution];
-  return YES;
-}
-
-- (NSArray<NSString *> *)availableVideoCodecs {
-  return videoCodecsStaticValues();
-}
-
-- (NSString *)currentVideoCodecSettingFromStore {
-  [self registerStoreDefaults];
-  return [[self settingsStore] videoCodec];
-}
-
-- (BOOL)storeVideoCodecSetting:(NSString *)videoCodec {
-  if (![[self availableVideoCodecs] containsObject:videoCodec]) {
-    return NO;
-  }
-  [[self settingsStore] setVideoCodec:videoCodec];
-  return YES;
-}
-
-- (nullable NSNumber *)currentMaxBitrateSettingFromStore {
-  [self registerStoreDefaults];
-  return [[self settingsStore] maxBitrate];
-}
-
-- (void)storeMaxBitrateSetting:(nullable NSNumber *)bitrate {
-  [[self settingsStore] setMaxBitrate:bitrate];
-}
-
-- (BOOL)currentAudioOnlySettingFromStore {
-  return [[self settingsStore] audioOnly];
-}
-
-- (void)storeAudioOnlySetting:(BOOL)audioOnly {
-  [[self settingsStore] setAudioOnly:audioOnly];
-}
-
-- (BOOL)currentCreateAecDumpSettingFromStore {
-  return [[self settingsStore] createAecDump];
-}
-
-- (void)storeCreateAecDumpSetting:(BOOL)createAecDump {
-  [[self settingsStore] setCreateAecDump:createAecDump];
-}
-
-- (BOOL)currentUseLevelControllerSettingFromStore {
-  return [[self settingsStore] useLevelController];
-}
-
-- (void)storeUseLevelControllerSetting:(BOOL)useLevelController {
-  [[self settingsStore] setUseLevelController:useLevelController];
-}
-
-- (BOOL)currentUseManualAudioConfigSettingFromStore {
-  return [[self settingsStore] useManualAudioConfig];
-}
-
-- (void)storeUseManualAudioConfigSetting:(BOOL)useManualAudioConfig {
-  [[self settingsStore] setUseManualAudioConfig:useManualAudioConfig];
-}
-
-#pragma mark - Testable
-
-- (ARDSettingsStore *)settingsStore {
-  if (!_settingsStore) {
-    _settingsStore = [[ARDSettingsStore alloc] init];
-    [self registerStoreDefaults];
-  }
-  return _settingsStore;
-}
-
-- (int)currentVideoResolutionWidthFromStore {
-  NSString *resolution = [self currentVideoResolutionSettingFromStore];
-
-  return [self videoResolutionComponentAtIndex:0 inString:resolution];
-}
-
-- (int)currentVideoResolutionHeightFromStore {
-  NSString *resolution = [self currentVideoResolutionSettingFromStore];
-  return [self videoResolutionComponentAtIndex:1 inString:resolution];
-}
-
-#pragma mark -
-
-- (NSString *)defaultVideoResolutionSetting {
-  return [self availableVideoResolutions][0];
-}
-
-- (NSString *)defaultVideoCodecSetting {
-  return videoCodecsStaticValues()[0];
-}
-
-- (int)videoResolutionComponentAtIndex:(int)index inString:(NSString *)resolution {
-  if (index != 0 && index != 1) {
-    return 0;
-  }
-  NSArray<NSString *> *components = [resolution componentsSeparatedByString:@"x"];
-  if (components.count != 2) {
-    return 0;
-  }
-  return components[index].intValue;
-}
-
-- (void)registerStoreDefaults {
-  [ARDSettingsStore setDefaultsForVideoResolution:[self defaultVideoResolutionSetting]
-                                       videoCodec:[self defaultVideoCodecSetting]
-                                          bitrate:nil
-                                        audioOnly:NO
-                                    createAecDump:NO
-                               useLevelController:NO
-                             useManualAudioConfig:YES];
-}
-
-@end
-NS_ASSUME_NONNULL_END
diff --git a/examples/objc/AppRTCMobile/ARDSettingsStore.h b/examples/objc/AppRTCMobile/ARDSettingsStore.h
deleted file mode 100644
index 3f5f791..0000000
--- a/examples/objc/AppRTCMobile/ARDSettingsStore.h
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- *  Copyright 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.
- */
-
-#import <Foundation/Foundation.h>
-
-NS_ASSUME_NONNULL_BEGIN
-
-/**
- * Light-weight persistent store for user settings.
- *
- * It will persist between application launches and application updates.
- */
-@interface ARDSettingsStore : NSObject
-
-/**
- * Set fallback values in case the setting has not been written by the user.
- * @param dictionary of values to store
- */
-+ (void)setDefaultsForVideoResolution:(NSString *)videoResolution
-                           videoCodec:(NSString *)videoCodec
-                              bitrate:(nullable NSNumber *)bitrate
-                            audioOnly:(BOOL)audioOnly
-                        createAecDump:(BOOL)createAecDump
-                   useLevelController:(BOOL)useLevelController
-                 useManualAudioConfig:(BOOL)useManualAudioConfig;
-
-@property(nonatomic) NSString *videoResolution;
-@property(nonatomic) NSString *videoCodec;
-
-/**
- * Returns current max bitrate number stored in the store.
- */
-- (nullable NSNumber *)maxBitrate;
-
-/**
- * Stores the provided value as maximum bitrate setting.
- * @param value the number to be stored
- */
-- (void)setMaxBitrate:(nullable NSNumber *)value;
-
-@property(nonatomic) BOOL audioOnly;
-@property(nonatomic) BOOL createAecDump;
-@property(nonatomic) BOOL useLevelController;
-@property(nonatomic) BOOL useManualAudioConfig;
-
-@end
-NS_ASSUME_NONNULL_END
diff --git a/examples/objc/AppRTCMobile/ARDSettingsStore.m b/examples/objc/AppRTCMobile/ARDSettingsStore.m
deleted file mode 100644
index 8ccc438..0000000
--- a/examples/objc/AppRTCMobile/ARDSettingsStore.m
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- *  Copyright 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.
- */
-
-#import "ARDSettingsStore.h"
-
-static NSString *const kVideoResolutionKey = @"rtc_video_resolution_key";
-static NSString *const kVideoCodecKey = @"rtc_video_codec_key";
-static NSString *const kBitrateKey = @"rtc_max_bitrate_key";
-static NSString *const kAudioOnlyKey = @"rtc_audio_only_key";
-static NSString *const kCreateAecDumpKey = @"rtc_create_aec_dump_key";
-static NSString *const kUseLevelControllerKey = @"rtc_use_level_controller_key";
-static NSString *const kUseManualAudioConfigKey = @"rtc_use_manual_audio_config_key";
-
-NS_ASSUME_NONNULL_BEGIN
-@interface ARDSettingsStore () {
-  NSUserDefaults *_storage;
-}
-@property(nonatomic, strong, readonly) NSUserDefaults *storage;
-@end
-
-@implementation ARDSettingsStore
-
-+ (void)setDefaultsForVideoResolution:(NSString *)videoResolution
-                           videoCodec:(NSString *)videoCodec
-                              bitrate:(nullable NSNumber *)bitrate
-                            audioOnly:(BOOL)audioOnly
-                        createAecDump:(BOOL)createAecDump
-                   useLevelController:(BOOL)useLevelController
-                 useManualAudioConfig:(BOOL)useManualAudioConfig {
-  NSMutableDictionary<NSString *, id> *defaultsDictionary = [@{
-    kVideoResolutionKey : videoResolution,
-    kVideoCodecKey : videoCodec,
-    kAudioOnlyKey : @(audioOnly),
-    kCreateAecDumpKey : @(createAecDump),
-    kUseLevelControllerKey : @(useLevelController),
-    kUseManualAudioConfigKey : @(useManualAudioConfig)
-  } mutableCopy];
-  if (bitrate) {
-    [defaultsDictionary setObject:bitrate forKey:kBitrateKey];
-  }
-  [[NSUserDefaults standardUserDefaults] registerDefaults:defaultsDictionary];
-}
-
-- (NSUserDefaults *)storage {
-  if (!_storage) {
-    _storage = [NSUserDefaults standardUserDefaults];
-  }
-  return _storage;
-}
-
-- (NSString *)videoResolution {
-  return [self.storage objectForKey:kVideoResolutionKey];
-}
-
-- (void)setVideoResolution:(NSString *)resolution {
-  [self.storage setObject:resolution forKey:kVideoResolutionKey];
-  [self.storage synchronize];
-}
-
-- (NSString *)videoCodec {
-  return [self.storage objectForKey:kVideoCodecKey];
-}
-
-- (void)setVideoCodec:(NSString *)videoCodec {
-  [self.storage setObject:videoCodec forKey:kVideoCodecKey];
-  [self.storage synchronize];
-}
-
-- (nullable NSNumber *)maxBitrate {
-  return [self.storage objectForKey:kBitrateKey];
-}
-
-- (void)setMaxBitrate:(nullable NSNumber *)value {
-  [self.storage setObject:value forKey:kBitrateKey];
-  [self.storage synchronize];
-}
-
-- (BOOL)audioOnly {
-  return [self.storage boolForKey:kAudioOnlyKey];
-}
-
-- (void)setAudioOnly:(BOOL)audioOnly {
-  [self.storage setBool:audioOnly forKey:kAudioOnlyKey];
-  [self.storage synchronize];
-}
-
-- (BOOL)createAecDump {
-  return [self.storage boolForKey:kCreateAecDumpKey];
-}
-
-- (void)setCreateAecDump:(BOOL)createAecDump {
-  [self.storage setBool:createAecDump forKey:kCreateAecDumpKey];
-  [self.storage synchronize];
-}
-
-- (BOOL)useLevelController {
-  return [self.storage boolForKey:kUseLevelControllerKey];
-}
-
-- (void)setUseLevelController:(BOOL)useLevelController {
-  [self.storage setBool:useLevelController forKey:kUseLevelControllerKey];
-  [self.storage synchronize];
-}
-
-- (BOOL)useManualAudioConfig {
-  return [self.storage boolForKey:kUseManualAudioConfigKey];
-}
-
-- (void)setUseManualAudioConfig:(BOOL)useManualAudioConfig {
-  [self.storage setBool:useManualAudioConfig forKey:kUseManualAudioConfigKey];
-  [self.storage synchronize];
-}
-
-@end
-NS_ASSUME_NONNULL_END
diff --git a/examples/objc/AppRTCMobile/ARDSignalingChannel.h b/examples/objc/AppRTCMobile/ARDSignalingChannel.h
deleted file mode 100644
index 70ba2ff..0000000
--- a/examples/objc/AppRTCMobile/ARDSignalingChannel.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- *  Copyright 2014 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.
- */
-
-#import <Foundation/Foundation.h>
-
-#import "ARDSignalingMessage.h"
-
-typedef NS_ENUM(NSInteger, ARDSignalingChannelState) {
-  // State when disconnected.
-  kARDSignalingChannelStateClosed,
-  // State when connection is established but not ready for use.
-  kARDSignalingChannelStateOpen,
-  // State when connection is established and registered.
-  kARDSignalingChannelStateRegistered,
-  // State when connection encounters a fatal error.
-  kARDSignalingChannelStateError
-};
-
-@protocol ARDSignalingChannel;
-@protocol ARDSignalingChannelDelegate <NSObject>
-
-- (void)channel:(id<ARDSignalingChannel>)channel
-    didChangeState:(ARDSignalingChannelState)state;
-
-- (void)channel:(id<ARDSignalingChannel>)channel
-    didReceiveMessage:(ARDSignalingMessage *)message;
-
-@end
-
-@protocol ARDSignalingChannel <NSObject>
-
-@property(nonatomic, readonly) NSString *roomId;
-@property(nonatomic, readonly) NSString *clientId;
-@property(nonatomic, readonly) ARDSignalingChannelState state;
-@property(nonatomic, weak) id<ARDSignalingChannelDelegate> delegate;
-
-// Registers the channel for the given room and client id.
-- (void)registerForRoomId:(NSString *)roomId
-                 clientId:(NSString *)clientId;
-
-// Sends signaling message over the channel.
-- (void)sendMessage:(ARDSignalingMessage *)message;
-
-@end
-
diff --git a/examples/objc/AppRTCMobile/ARDSignalingMessage.h b/examples/objc/AppRTCMobile/ARDSignalingMessage.h
deleted file mode 100644
index e605172..0000000
--- a/examples/objc/AppRTCMobile/ARDSignalingMessage.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- *  Copyright 2014 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.
- */
-
-#import <Foundation/Foundation.h>
-
-#import "WebRTC/RTCIceCandidate.h"
-#import "WebRTC/RTCSessionDescription.h"
-
-typedef enum {
-  kARDSignalingMessageTypeCandidate,
-  kARDSignalingMessageTypeCandidateRemoval,
-  kARDSignalingMessageTypeOffer,
-  kARDSignalingMessageTypeAnswer,
-  kARDSignalingMessageTypeBye,
-} ARDSignalingMessageType;
-
-@interface ARDSignalingMessage : NSObject
-
-@property(nonatomic, readonly) ARDSignalingMessageType type;
-
-+ (ARDSignalingMessage *)messageFromJSONString:(NSString *)jsonString;
-- (NSData *)JSONData;
-
-@end
-
-@interface ARDICECandidateMessage : ARDSignalingMessage
-
-@property(nonatomic, readonly) RTCIceCandidate *candidate;
-
-- (instancetype)initWithCandidate:(RTCIceCandidate *)candidate;
-
-@end
-
-@interface ARDICECandidateRemovalMessage : ARDSignalingMessage
-
-@property(nonatomic, readonly) NSArray<RTCIceCandidate *> *candidates;
-
-- (instancetype)initWithRemovedCandidates:
-    (NSArray<RTCIceCandidate *> *)candidates;
-
-@end
-
-@interface ARDSessionDescriptionMessage : ARDSignalingMessage
-
-@property(nonatomic, readonly) RTCSessionDescription *sessionDescription;
-
-- (instancetype)initWithDescription:(RTCSessionDescription *)description;
-
-@end
-
-@interface ARDByeMessage : ARDSignalingMessage
-@end
diff --git a/examples/objc/AppRTCMobile/ARDSignalingMessage.m b/examples/objc/AppRTCMobile/ARDSignalingMessage.m
deleted file mode 100644
index 3fab185..0000000
--- a/examples/objc/AppRTCMobile/ARDSignalingMessage.m
+++ /dev/null
@@ -1,161 +0,0 @@
-/*
- *  Copyright 2014 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.
- */
-
-#import "ARDSignalingMessage.h"
-
-#import "WebRTC/RTCLogging.h"
-
-#import "ARDUtilities.h"
-#import "RTCIceCandidate+JSON.h"
-#import "RTCSessionDescription+JSON.h"
-
-static NSString * const kARDSignalingMessageTypeKey = @"type";
-static NSString * const kARDTypeValueRemoveCandidates = @"remove-candidates";
-
-@implementation ARDSignalingMessage
-
-@synthesize type = _type;
-
-- (instancetype)initWithType:(ARDSignalingMessageType)type {
-  if (self = [super init]) {
-    _type = type;
-  }
-  return self;
-}
-
-- (NSString *)description {
-  return [[NSString alloc] initWithData:[self JSONData]
-                               encoding:NSUTF8StringEncoding];
-}
-
-+ (ARDSignalingMessage *)messageFromJSONString:(NSString *)jsonString {
-  NSDictionary *values = [NSDictionary dictionaryWithJSONString:jsonString];
-  if (!values) {
-    RTCLogError(@"Error parsing signaling message JSON.");
-    return nil;
-  }
-
-  NSString *typeString = values[kARDSignalingMessageTypeKey];
-  ARDSignalingMessage *message = nil;
-  if ([typeString isEqualToString:@"candidate"]) {
-    RTCIceCandidate *candidate =
-        [RTCIceCandidate candidateFromJSONDictionary:values];
-    message = [[ARDICECandidateMessage alloc] initWithCandidate:candidate];
-  } else if ([typeString isEqualToString:kARDTypeValueRemoveCandidates]) {
-    RTCLogInfo(@"Received remove-candidates message");
-    NSArray<RTCIceCandidate *> *candidates =
-        [RTCIceCandidate candidatesFromJSONDictionary:values];
-    message = [[ARDICECandidateRemovalMessage alloc]
-                  initWithRemovedCandidates:candidates];
-  } else if ([typeString isEqualToString:@"offer"] ||
-             [typeString isEqualToString:@"answer"]) {
-    RTCSessionDescription *description =
-        [RTCSessionDescription descriptionFromJSONDictionary:values];
-    message =
-        [[ARDSessionDescriptionMessage alloc] initWithDescription:description];
-  } else if ([typeString isEqualToString:@"bye"]) {
-    message = [[ARDByeMessage alloc] init];
-  } else {
-    RTCLogError(@"Unexpected type: %@", typeString);
-  }
-  return message;
-}
-
-- (NSData *)JSONData {
-  return nil;
-}
-
-@end
-
-@implementation ARDICECandidateMessage
-
-@synthesize candidate = _candidate;
-
-- (instancetype)initWithCandidate:(RTCIceCandidate *)candidate {
-  if (self = [super initWithType:kARDSignalingMessageTypeCandidate]) {
-    _candidate = candidate;
-  }
-  return self;
-}
-
-- (NSData *)JSONData {
-  return [_candidate JSONData];
-}
-
-@end
-
-@implementation ARDICECandidateRemovalMessage
-
-@synthesize candidates = _candidates;
-
-- (instancetype)initWithRemovedCandidates:(
-    NSArray<RTCIceCandidate *> *)candidates {
-  NSParameterAssert(candidates.count);
-  if (self = [super initWithType:kARDSignalingMessageTypeCandidateRemoval]) {
-    _candidates = candidates;
-  }
-  return self;
-}
-
-- (NSData *)JSONData {
-  return
-      [RTCIceCandidate JSONDataForIceCandidates:_candidates
-                                       withType:kARDTypeValueRemoveCandidates];
-}
-
-@end
-
-@implementation ARDSessionDescriptionMessage
-
-@synthesize sessionDescription = _sessionDescription;
-
-- (instancetype)initWithDescription:(RTCSessionDescription *)description {
-  ARDSignalingMessageType messageType = kARDSignalingMessageTypeOffer;
-  RTCSdpType sdpType = description.type;
-  switch (sdpType) {
-    case RTCSdpTypeOffer:
-      messageType = kARDSignalingMessageTypeOffer;
-      break;
-    case RTCSdpTypeAnswer:
-      messageType = kARDSignalingMessageTypeAnswer;
-      break;
-    case RTCSdpTypePrAnswer:
-      NSAssert(NO, @"Unexpected type: %@",
-          [RTCSessionDescription stringForType:sdpType]);
-      break;
-  }
-  if (self = [super initWithType:messageType]) {
-    _sessionDescription = description;
-  }
-  return self;
-}
-
-- (NSData *)JSONData {
-  return [_sessionDescription JSONData];
-}
-
-@end
-
-@implementation ARDByeMessage
-
-- (instancetype)init {
-  return [super initWithType:kARDSignalingMessageTypeBye];
-}
-
-- (NSData *)JSONData {
-  NSDictionary *message = @{
-    @"type": @"bye"
-  };
-  return [NSJSONSerialization dataWithJSONObject:message
-                                         options:NSJSONWritingPrettyPrinted
-                                           error:NULL];
-}
-
-@end
diff --git a/examples/objc/AppRTCMobile/ARDStatsBuilder.h b/examples/objc/AppRTCMobile/ARDStatsBuilder.h
deleted file mode 100644
index a876b96..0000000
--- a/examples/objc/AppRTCMobile/ARDStatsBuilder.h
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-#import <Foundation/Foundation.h>
-
-@class RTCLegacyStatsReport;
-
-/** Class used to accumulate stats information into a single displayable string.
- */
-@interface ARDStatsBuilder : NSObject
-
-/** String that represents the accumulated stats reports passed into this
- *  class.
- */
-@property(nonatomic, readonly) NSString *statsString;
-
-/** Parses the information in the stats report into an appropriate internal
- *  format used to generate the stats string.
- */
-- (void)parseStatsReport:(RTCLegacyStatsReport *)statsReport;
-
-@end
diff --git a/examples/objc/AppRTCMobile/ARDStatsBuilder.m b/examples/objc/AppRTCMobile/ARDStatsBuilder.m
deleted file mode 100644
index 370b72e..0000000
--- a/examples/objc/AppRTCMobile/ARDStatsBuilder.m
+++ /dev/null
@@ -1,325 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-#import "ARDStatsBuilder.h"
-
-#import "WebRTC/RTCLegacyStatsReport.h"
-
-#import "ARDBitrateTracker.h"
-#import "ARDUtilities.h"
-
-@implementation ARDStatsBuilder {
-  // Connection stats.
-  NSString *_connRecvBitrate;
-  NSString *_connRtt;
-  NSString *_connSendBitrate;
-  NSString *_localCandType;
-  NSString *_remoteCandType;
-  NSString *_transportType;
-
-  // BWE stats.
-  NSString *_actualEncBitrate;
-  NSString *_availableRecvBw;
-  NSString *_availableSendBw;
-  NSString *_targetEncBitrate;
-
-  // Video send stats.
-  NSString *_videoEncodeMs;
-  NSString *_videoInputFps;
-  NSString *_videoInputHeight;
-  NSString *_videoInputWidth;
-  NSString *_videoSendCodec;
-  NSString *_videoSendBitrate;
-  NSString *_videoSendFps;
-  NSString *_videoSendHeight;
-  NSString *_videoSendWidth;
-
-  // QP stats.
-  int _videoQPSum;
-  int _framesEncoded;
-  int _oldVideoQPSum;
-  int _oldFramesEncoded;
-
-  // Video receive stats.
-  NSString *_videoDecodeMs;
-  NSString *_videoDecodedFps;
-  NSString *_videoOutputFps;
-  NSString *_videoRecvBitrate;
-  NSString *_videoRecvFps;
-  NSString *_videoRecvHeight;
-  NSString *_videoRecvWidth;
-
-  // Audio send stats.
-  NSString *_audioSendBitrate;
-  NSString *_audioSendCodec;
-
-  // Audio receive stats.
-  NSString *_audioCurrentDelay;
-  NSString *_audioExpandRate;
-  NSString *_audioRecvBitrate;
-  NSString *_audioRecvCodec;
-
-  // Bitrate trackers.
-  ARDBitrateTracker *_audioRecvBitrateTracker;
-  ARDBitrateTracker *_audioSendBitrateTracker;
-  ARDBitrateTracker *_connRecvBitrateTracker;
-  ARDBitrateTracker *_connSendBitrateTracker;
-  ARDBitrateTracker *_videoRecvBitrateTracker;
-  ARDBitrateTracker *_videoSendBitrateTracker;
-}
-
-- (instancetype)init {
-  if (self = [super init]) {
-    _audioSendBitrateTracker = [[ARDBitrateTracker alloc] init];
-    _audioRecvBitrateTracker = [[ARDBitrateTracker alloc] init];
-    _connSendBitrateTracker = [[ARDBitrateTracker alloc] init];
-    _connRecvBitrateTracker = [[ARDBitrateTracker alloc] init];
-    _videoSendBitrateTracker = [[ARDBitrateTracker alloc] init];
-    _videoRecvBitrateTracker = [[ARDBitrateTracker alloc] init];
-    _videoQPSum = 0;
-    _framesEncoded = 0;
-  }
-  return self;
-}
-
-- (NSString *)statsString {
-  NSMutableString *result = [NSMutableString string];
-  NSString *systemStatsFormat = @"(cpu)%ld%%\n";
-  [result appendString:[NSString stringWithFormat:systemStatsFormat,
-      (long)ARDGetCpuUsagePercentage()]];
-
-  // Connection stats.
-  NSString *connStatsFormat = @"CN %@ms | %@->%@/%@ | (s)%@ | (r)%@\n";
-  [result appendString:[NSString stringWithFormat:connStatsFormat,
-      _connRtt,
-      _localCandType, _remoteCandType, _transportType,
-      _connSendBitrate, _connRecvBitrate]];
-
-  // Video send stats.
-  NSString *videoSendFormat = @"VS (input) %@x%@@%@fps | (sent) %@x%@@%@fps\n"
-                               "VS (enc) %@/%@ | (sent) %@/%@ | %@ms | %@\n"
-                               "AvgQP (past %d encoded frames) = %d\n ";
-  int avgqp = [self calculateAvgQP];
-
-  [result appendString:[NSString stringWithFormat:videoSendFormat,
-      _videoInputWidth, _videoInputHeight, _videoInputFps,
-      _videoSendWidth, _videoSendHeight, _videoSendFps,
-      _actualEncBitrate, _targetEncBitrate,
-      _videoSendBitrate, _availableSendBw,
-      _videoEncodeMs,
-      _videoSendCodec,
-      _framesEncoded - _oldFramesEncoded, avgqp]];
-
-  // Video receive stats.
-  NSString *videoReceiveFormat =
-      @"VR (recv) %@x%@@%@fps | (decoded)%@ | (output)%@fps | %@/%@ | %@ms\n";
-  [result appendString:[NSString stringWithFormat:videoReceiveFormat,
-      _videoRecvWidth, _videoRecvHeight, _videoRecvFps,
-      _videoDecodedFps,
-      _videoOutputFps,
-      _videoRecvBitrate, _availableRecvBw,
-      _videoDecodeMs]];
-
-  // Audio send stats.
-  NSString *audioSendFormat = @"AS %@ | %@\n";
-  [result appendString:[NSString stringWithFormat:audioSendFormat,
-      _audioSendBitrate, _audioSendCodec]];
-
-  // Audio receive stats.
-  NSString *audioReceiveFormat = @"AR %@ | %@ | %@ms | (expandrate)%@";
-  [result appendString:[NSString stringWithFormat:audioReceiveFormat,
-      _audioRecvBitrate, _audioRecvCodec, _audioCurrentDelay,
-      _audioExpandRate]];
-
-  return result;
-}
-
-- (void)parseStatsReport:(RTCLegacyStatsReport *)statsReport {
-  NSString *reportType = statsReport.type;
-  if ([reportType isEqualToString:@"ssrc"] &&
-      [statsReport.reportId rangeOfString:@"ssrc"].location != NSNotFound) {
-    if ([statsReport.reportId rangeOfString:@"send"].location != NSNotFound) {
-      [self parseSendSsrcStatsReport:statsReport];
-    }
-    if ([statsReport.reportId rangeOfString:@"recv"].location != NSNotFound) {
-      [self parseRecvSsrcStatsReport:statsReport];
-    }
-  } else if ([reportType isEqualToString:@"VideoBwe"]) {
-    [self parseBweStatsReport:statsReport];
-  } else if ([reportType isEqualToString:@"googCandidatePair"]) {
-    [self parseConnectionStatsReport:statsReport];
-  }
-}
-
-#pragma mark - Private
-
-- (int)calculateAvgQP {
-  int deltaFramesEncoded = _framesEncoded - _oldFramesEncoded;
-  int deltaQPSum = _videoQPSum - _oldVideoQPSum;
-
-  return deltaFramesEncoded != 0 ? deltaQPSum / deltaFramesEncoded : 0;
-}
-
-- (void)parseBweStatsReport:(RTCLegacyStatsReport *)statsReport {
-  [statsReport.values enumerateKeysAndObjectsUsingBlock:^(
-      NSString *key, NSString *value, BOOL *stop) {
-    if ([key isEqualToString:@"googAvailableSendBandwidth"]) {
-      _availableSendBw =
-          [ARDBitrateTracker bitrateStringForBitrate:value.doubleValue];
-    } else if ([key isEqualToString:@"googAvailableReceiveBandwidth"]) {
-      _availableRecvBw =
-          [ARDBitrateTracker bitrateStringForBitrate:value.doubleValue];
-    } else if ([key isEqualToString:@"googActualEncBitrate"]) {
-      _actualEncBitrate =
-          [ARDBitrateTracker bitrateStringForBitrate:value.doubleValue];
-    } else if ([key isEqualToString:@"googTargetEncBitrate"]) {
-      _targetEncBitrate =
-          [ARDBitrateTracker bitrateStringForBitrate:value.doubleValue];
-    }
-  }];
-}
-
-- (void)parseConnectionStatsReport:(RTCLegacyStatsReport *)statsReport {
-  NSString *activeConnection = statsReport.values[@"googActiveConnection"];
-  if (![activeConnection isEqualToString:@"true"]) {
-    return;
-  }
-  [statsReport.values enumerateKeysAndObjectsUsingBlock:^(
-      NSString *key, NSString *value, BOOL *stop) {
-    if ([key isEqualToString:@"googRtt"]) {
-      _connRtt = value;
-    } else if ([key isEqualToString:@"googLocalCandidateType"]) {
-      _localCandType = value;
-    } else if ([key isEqualToString:@"googRemoteCandidateType"]) {
-      _remoteCandType = value;
-    } else if ([key isEqualToString:@"googTransportType"]) {
-      _transportType = value;
-    } else if ([key isEqualToString:@"bytesReceived"]) {
-      NSInteger byteCount = value.integerValue;
-      [_connRecvBitrateTracker updateBitrateWithCurrentByteCount:byteCount];
-      _connRecvBitrate = _connRecvBitrateTracker.bitrateString;
-    } else if ([key isEqualToString:@"bytesSent"]) {
-      NSInteger byteCount = value.integerValue;
-      [_connSendBitrateTracker updateBitrateWithCurrentByteCount:byteCount];
-      _connSendBitrate = _connSendBitrateTracker.bitrateString;
-    }
-  }];
-}
-
-- (void)parseSendSsrcStatsReport:(RTCLegacyStatsReport *)statsReport {
-  NSDictionary *values = statsReport.values;
-  if ([values objectForKey:@"googFrameRateSent"]) {
-    // Video track.
-    [self parseVideoSendStatsReport:statsReport];
-  } else if ([values objectForKey:@"audioInputLevel"]) {
-    // Audio track.
-    [self parseAudioSendStatsReport:statsReport];
-  }
-}
-
-- (void)parseAudioSendStatsReport:(RTCLegacyStatsReport *)statsReport {
-  [statsReport.values enumerateKeysAndObjectsUsingBlock:^(
-      NSString *key, NSString *value, BOOL *stop) {
-    if ([key isEqualToString:@"googCodecName"]) {
-      _audioSendCodec = value;
-    } else if ([key isEqualToString:@"bytesSent"]) {
-      NSInteger byteCount = value.integerValue;
-      [_audioSendBitrateTracker updateBitrateWithCurrentByteCount:byteCount];
-      _audioSendBitrate = _audioSendBitrateTracker.bitrateString;
-    }
-  }];
-}
-
-- (void)parseVideoSendStatsReport:(RTCLegacyStatsReport *)statsReport {
-  [statsReport.values enumerateKeysAndObjectsUsingBlock:^(
-      NSString *key, NSString *value, BOOL *stop) {
-    if ([key isEqualToString:@"googCodecName"]) {
-      _videoSendCodec = value;
-    } else if ([key isEqualToString:@"googFrameHeightInput"]) {
-      _videoInputHeight = value;
-    } else if ([key isEqualToString:@"googFrameWidthInput"]) {
-      _videoInputWidth = value;
-    } else if ([key isEqualToString:@"googFrameRateInput"]) {
-      _videoInputFps = value;
-    } else if ([key isEqualToString:@"googFrameHeightSent"]) {
-      _videoSendHeight = value;
-    } else if ([key isEqualToString:@"googFrameWidthSent"]) {
-      _videoSendWidth = value;
-    } else if ([key isEqualToString:@"googFrameRateSent"]) {
-      _videoSendFps = value;
-    } else if ([key isEqualToString:@"googAvgEncodeMs"]) {
-      _videoEncodeMs = value;
-    } else if ([key isEqualToString:@"bytesSent"]) {
-      NSInteger byteCount = value.integerValue;
-      [_videoSendBitrateTracker updateBitrateWithCurrentByteCount:byteCount];
-      _videoSendBitrate = _videoSendBitrateTracker.bitrateString;
-    } else if ([key isEqualToString:@"qpSum"]) {
-      _oldVideoQPSum = _videoQPSum;
-      _videoQPSum = value.integerValue;
-    } else if ([key isEqualToString:@"framesEncoded"]) {
-      _oldFramesEncoded = _framesEncoded;
-      _framesEncoded = value.integerValue;
-    }
-  }];
-}
-
-- (void)parseRecvSsrcStatsReport:(RTCLegacyStatsReport *)statsReport {
-  NSDictionary *values = statsReport.values;
-  if ([values objectForKey:@"googFrameWidthReceived"]) {
-    // Video track.
-    [self parseVideoRecvStatsReport:statsReport];
-  } else if ([values objectForKey:@"audioOutputLevel"]) {
-    // Audio track.
-    [self parseAudioRecvStatsReport:statsReport];
-  }
-}
-
-- (void)parseAudioRecvStatsReport:(RTCLegacyStatsReport *)statsReport {
-  [statsReport.values enumerateKeysAndObjectsUsingBlock:^(
-      NSString *key, NSString *value, BOOL *stop) {
-    if ([key isEqualToString:@"googCodecName"]) {
-      _audioRecvCodec = value;
-    } else if ([key isEqualToString:@"bytesReceived"]) {
-      NSInteger byteCount = value.integerValue;
-      [_audioRecvBitrateTracker updateBitrateWithCurrentByteCount:byteCount];
-      _audioRecvBitrate = _audioRecvBitrateTracker.bitrateString;
-    } else if ([key isEqualToString:@"googSpeechExpandRate"]) {
-      _audioExpandRate = value;
-    } else if ([key isEqualToString:@"googCurrentDelayMs"]) {
-      _audioCurrentDelay = value;
-    }
-  }];
-}
-
-- (void)parseVideoRecvStatsReport:(RTCLegacyStatsReport *)statsReport {
-  [statsReport.values enumerateKeysAndObjectsUsingBlock:^(
-      NSString *key, NSString *value, BOOL *stop) {
-    if ([key isEqualToString:@"googFrameHeightReceived"]) {
-      _videoRecvHeight = value;
-    } else if ([key isEqualToString:@"googFrameWidthReceived"]) {
-      _videoRecvWidth = value;
-    } else if ([key isEqualToString:@"googFrameRateReceived"]) {
-      _videoRecvFps = value;
-    } else if ([key isEqualToString:@"googFrameRateDecoded"]) {
-      _videoDecodedFps = value;
-    } else if ([key isEqualToString:@"googFrameRateOutput"]) {
-      _videoOutputFps = value;
-    } else if ([key isEqualToString:@"googDecodeMs"]) {
-      _videoDecodeMs = value;
-    } else if ([key isEqualToString:@"bytesReceived"]) {
-      NSInteger byteCount = value.integerValue;
-      [_videoRecvBitrateTracker updateBitrateWithCurrentByteCount:byteCount];
-      _videoRecvBitrate = _videoRecvBitrateTracker.bitrateString;
-    }
-  }];
-}
-
-@end
-
diff --git a/examples/objc/AppRTCMobile/ARDTURNClient+Internal.h b/examples/objc/AppRTCMobile/ARDTURNClient+Internal.h
deleted file mode 100644
index 3a579f8..0000000
--- a/examples/objc/AppRTCMobile/ARDTURNClient+Internal.h
+++ /dev/null
@@ -1,17 +0,0 @@
-/*
- *  Copyright 2014 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.
- */
-
-#import "ARDTURNClient.h"
-
-@interface ARDTURNClient : NSObject <ARDTURNClient>
-
-- (instancetype)initWithURL:(NSURL *)url;
-
-@end
diff --git a/examples/objc/AppRTCMobile/ARDTURNClient.h b/examples/objc/AppRTCMobile/ARDTURNClient.h
deleted file mode 100644
index 75ccffc..0000000
--- a/examples/objc/AppRTCMobile/ARDTURNClient.h
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- *  Copyright 2014 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.
- */
-
-#import <Foundation/Foundation.h>
-
-@class RTCIceServer;
-
-@protocol ARDTURNClient <NSObject>
-
-// Returns TURN server urls if successful.
-- (void)requestServersWithCompletionHandler:
-    (void (^)(NSArray *turnServers,
-              NSError *error))completionHandler;
-
-@end
diff --git a/examples/objc/AppRTCMobile/ARDTURNClient.m b/examples/objc/AppRTCMobile/ARDTURNClient.m
deleted file mode 100644
index 05f5cd9..0000000
--- a/examples/objc/AppRTCMobile/ARDTURNClient.m
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- *  Copyright 2014 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.
- */
-
-#import "ARDTURNClient+Internal.h"
-
-#import "ARDUtilities.h"
-#import "RTCIceServer+JSON.h"
-
-// TODO(tkchin): move this to a configuration object.
-static NSString *kTURNRefererURLString = @"https://appr.tc";
-static NSString *kARDTURNClientErrorDomain = @"ARDTURNClient";
-static NSInteger kARDTURNClientErrorBadResponse = -1;
-
-@implementation ARDTURNClient {
-  NSURL *_url;
-}
-
-- (instancetype)initWithURL:(NSURL *)url {
-  NSParameterAssert([url absoluteString].length);
-  if (self = [super init]) {
-    _url = url;
-  }
-  return self;
-}
-
-- (void)requestServersWithCompletionHandler:
-    (void (^)(NSArray *turnServers, NSError *error))completionHandler {
-
-  NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:_url];
-  [NSURLConnection sendAsyncRequest:request
-                  completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
-      if (error) {
-        completionHandler(nil, error);
-        return;
-      }
-      NSDictionary *responseDict = [NSDictionary dictionaryWithJSONData:data];
-      NSString *iceServerUrl = responseDict[@"ice_server_url"];
-      [self makeTurnServerRequestToURL:[NSURL URLWithString:iceServerUrl]
-                 WithCompletionHandler:completionHandler];
-    }];
-}
-
-#pragma mark - Private
-
-- (void)makeTurnServerRequestToURL:(NSURL *)url
-             WithCompletionHandler:(void (^)(NSArray *turnServers,
-                                             NSError *error))completionHandler {
-  NSMutableURLRequest *iceServerRequest = [NSMutableURLRequest requestWithURL:url];
-  iceServerRequest.HTTPMethod = @"POST";
-  [iceServerRequest addValue:kTURNRefererURLString forHTTPHeaderField:@"referer"];
-  [NSURLConnection sendAsyncRequest:iceServerRequest
-                  completionHandler:^(NSURLResponse *response,
-                                      NSData *data,
-                                      NSError *error) {
-      if (error) {
-        completionHandler(nil, error);
-        return;
-      }
-      NSDictionary *turnResponseDict = [NSDictionary dictionaryWithJSONData:data];
-      NSMutableArray *turnServers = [NSMutableArray array];
-      [turnResponseDict[@"iceServers"] enumerateObjectsUsingBlock:
-                         ^(NSDictionary *obj, NSUInteger idx, BOOL *stop){
-          [turnServers addObject:[RTCIceServer serverFromJSONDictionary:obj]];
-        }];
-      if (!turnServers) {
-        NSError *responseError =
-          [[NSError alloc] initWithDomain:kARDTURNClientErrorDomain
-                                     code:kARDTURNClientErrorBadResponse
-                                 userInfo:@{
-            NSLocalizedDescriptionKey: @"Bad TURN response.",
-            }];
-        completionHandler(nil, responseError);
-        return;
-      }
-      completionHandler(turnServers, nil);
-    }];
-}
-
-@end
diff --git a/examples/objc/AppRTCMobile/ARDWebSocketChannel.h b/examples/objc/AppRTCMobile/ARDWebSocketChannel.h
deleted file mode 100644
index ffb0b72..0000000
--- a/examples/objc/AppRTCMobile/ARDWebSocketChannel.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- *  Copyright 2014 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.
- */
-
-#import <Foundation/Foundation.h>
-
-#import "ARDSignalingChannel.h"
-
-// Wraps a WebSocket connection to the AppRTC WebSocket server.
-@interface ARDWebSocketChannel : NSObject <ARDSignalingChannel>
-
-- (instancetype)initWithURL:(NSURL *)url
-                    restURL:(NSURL *)restURL
-                   delegate:(id<ARDSignalingChannelDelegate>)delegate;
-
-// Registers with the WebSocket server for the given room and client id once
-// the web socket connection is open.
-- (void)registerForRoomId:(NSString *)roomId
-                 clientId:(NSString *)clientId;
-
-// Sends message over the WebSocket connection if registered, otherwise POSTs to
-// the web socket server instead.
-- (void)sendMessage:(ARDSignalingMessage *)message;
-
-@end
-
-// Loopback mode is used to cause the client to connect to itself for testing.
-// A second web socket connection is established simulating the other client.
-// Any messages received are sent back to the WebSocket server after modifying
-// them as appropriate.
-@interface ARDLoopbackWebSocketChannel : ARDWebSocketChannel
-
-- (instancetype)initWithURL:(NSURL *)url restURL:(NSURL *)restURL;
-
-@end
diff --git a/examples/objc/AppRTCMobile/ARDWebSocketChannel.m b/examples/objc/AppRTCMobile/ARDWebSocketChannel.m
deleted file mode 100644
index 6f60380..0000000
--- a/examples/objc/AppRTCMobile/ARDWebSocketChannel.m
+++ /dev/null
@@ -1,251 +0,0 @@
-/*
- *  Copyright 2014 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.
- */
-
-#import "ARDWebSocketChannel.h"
-
-#import "WebRTC/RTCLogging.h"
-#import "SRWebSocket.h"
-
-#import "ARDSignalingMessage.h"
-#import "ARDUtilities.h"
-
-// TODO(tkchin): move these to a configuration object.
-static NSString const *kARDWSSMessageErrorKey = @"error";
-static NSString const *kARDWSSMessagePayloadKey = @"msg";
-
-@interface ARDWebSocketChannel () <SRWebSocketDelegate>
-@end
-
-@implementation ARDWebSocketChannel {
-  NSURL *_url;
-  NSURL *_restURL;
-  SRWebSocket *_socket;
-}
-
-@synthesize delegate = _delegate;
-@synthesize state = _state;
-@synthesize roomId = _roomId;
-@synthesize clientId = _clientId;
-
-- (instancetype)initWithURL:(NSURL *)url
-                    restURL:(NSURL *)restURL
-                   delegate:(id<ARDSignalingChannelDelegate>)delegate {
-  if (self = [super init]) {
-    _url = url;
-    _restURL = restURL;
-    _delegate = delegate;
-    _socket = [[SRWebSocket alloc] initWithURL:url];
-    _socket.delegate = self;
-    RTCLog(@"Opening WebSocket.");
-    [_socket open];
-  }
-  return self;
-}
-
-- (void)dealloc {
-  [self disconnect];
-}
-
-- (void)setState:(ARDSignalingChannelState)state {
-  if (_state == state) {
-    return;
-  }
-  _state = state;
-  [_delegate channel:self didChangeState:_state];
-}
-
-- (void)registerForRoomId:(NSString *)roomId
-                 clientId:(NSString *)clientId {
-  NSParameterAssert(roomId.length);
-  NSParameterAssert(clientId.length);
-  _roomId = roomId;
-  _clientId = clientId;
-  if (_state == kARDSignalingChannelStateOpen) {
-    [self registerWithCollider];
-  }
-}
-
-- (void)sendMessage:(ARDSignalingMessage *)message {
-  NSParameterAssert(_clientId.length);
-  NSParameterAssert(_roomId.length);
-  NSData *data = [message JSONData];
-  if (_state == kARDSignalingChannelStateRegistered) {
-    NSString *payload =
-        [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
-    NSDictionary *message = @{
-      @"cmd": @"send",
-      @"msg": payload,
-    };
-    NSData *messageJSONObject =
-        [NSJSONSerialization dataWithJSONObject:message
-                                        options:NSJSONWritingPrettyPrinted
-                                          error:nil];
-    NSString *messageString =
-        [[NSString alloc] initWithData:messageJSONObject
-                              encoding:NSUTF8StringEncoding];
-    RTCLog(@"C->WSS: %@", messageString);
-    [_socket send:messageString];
-  } else {
-    NSString *dataString =
-        [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
-    RTCLog(@"C->WSS POST: %@", dataString);
-    NSString *urlString =
-        [NSString stringWithFormat:@"%@/%@/%@",
-            [_restURL absoluteString], _roomId, _clientId];
-    NSURL *url = [NSURL URLWithString:urlString];
-    [NSURLConnection sendAsyncPostToURL:url
-                               withData:data
-                      completionHandler:nil];
-  }
-}
-
-- (void)disconnect {
-  if (_state == kARDSignalingChannelStateClosed ||
-      _state == kARDSignalingChannelStateError) {
-    return;
-  }
-  [_socket close];
-  RTCLog(@"C->WSS DELETE rid:%@ cid:%@", _roomId, _clientId);
-  NSString *urlString =
-      [NSString stringWithFormat:@"%@/%@/%@",
-          [_restURL absoluteString], _roomId, _clientId];
-  NSURL *url = [NSURL URLWithString:urlString];
-  NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
-  request.HTTPMethod = @"DELETE";
-  request.HTTPBody = nil;
-  [NSURLConnection sendAsyncRequest:request completionHandler:nil];
-}
-
-#pragma mark - SRWebSocketDelegate
-
-- (void)webSocketDidOpen:(SRWebSocket *)webSocket {
-  RTCLog(@"WebSocket connection opened.");
-  self.state = kARDSignalingChannelStateOpen;
-  if (_roomId.length && _clientId.length) {
-    [self registerWithCollider];
-  }
-}
-
-- (void)webSocket:(SRWebSocket *)webSocket didReceiveMessage:(id)message {
-  NSString *messageString = message;
-  NSData *messageData = [messageString dataUsingEncoding:NSUTF8StringEncoding];
-  id jsonObject = [NSJSONSerialization JSONObjectWithData:messageData
-                                                  options:0
-                                                    error:nil];
-  if (![jsonObject isKindOfClass:[NSDictionary class]]) {
-    RTCLogError(@"Unexpected message: %@", jsonObject);
-    return;
-  }
-  NSDictionary *wssMessage = jsonObject;
-  NSString *errorString = wssMessage[kARDWSSMessageErrorKey];
-  if (errorString.length) {
-    RTCLogError(@"WSS error: %@", errorString);
-    return;
-  }
-  NSString *payload = wssMessage[kARDWSSMessagePayloadKey];
-  ARDSignalingMessage *signalingMessage =
-      [ARDSignalingMessage messageFromJSONString:payload];
-  RTCLog(@"WSS->C: %@", payload);
-  [_delegate channel:self didReceiveMessage:signalingMessage];
-}
-
-- (void)webSocket:(SRWebSocket *)webSocket didFailWithError:(NSError *)error {
-  RTCLogError(@"WebSocket error: %@", error);
-  self.state = kARDSignalingChannelStateError;
-}
-
-- (void)webSocket:(SRWebSocket *)webSocket
-    didCloseWithCode:(NSInteger)code
-              reason:(NSString *)reason
-            wasClean:(BOOL)wasClean {
-  RTCLog(@"WebSocket closed with code: %ld reason:%@ wasClean:%d",
-      (long)code, reason, wasClean);
-  NSParameterAssert(_state != kARDSignalingChannelStateError);
-  self.state = kARDSignalingChannelStateClosed;
-}
-
-#pragma mark - Private
-
-- (void)registerWithCollider {
-  if (_state == kARDSignalingChannelStateRegistered) {
-    return;
-  }
-  NSParameterAssert(_roomId.length);
-  NSParameterAssert(_clientId.length);
-  NSDictionary *registerMessage = @{
-    @"cmd": @"register",
-    @"roomid" : _roomId,
-    @"clientid" : _clientId,
-  };
-  NSData *message =
-      [NSJSONSerialization dataWithJSONObject:registerMessage
-                                      options:NSJSONWritingPrettyPrinted
-                                        error:nil];
-  NSString *messageString =
-      [[NSString alloc] initWithData:message encoding:NSUTF8StringEncoding];
-  RTCLog(@"Registering on WSS for rid:%@ cid:%@", _roomId, _clientId);
-  // Registration can fail if server rejects it. For example, if the room is
-  // full.
-  [_socket send:messageString];
-  self.state = kARDSignalingChannelStateRegistered;
-}
-
-@end
-
-@interface ARDLoopbackWebSocketChannel () <ARDSignalingChannelDelegate>
-@end
-
-@implementation ARDLoopbackWebSocketChannel
-
-- (instancetype)initWithURL:(NSURL *)url restURL:(NSURL *)restURL {
-  return [super initWithURL:url restURL:restURL delegate:self];
-}
-
-#pragma mark - ARDSignalingChannelDelegate
-
-- (void)channel:(id<ARDSignalingChannel>)channel
-    didReceiveMessage:(ARDSignalingMessage *)message {
-  switch (message.type) {
-    case kARDSignalingMessageTypeOffer: {
-      // Change message to answer, send back to server.
-      ARDSessionDescriptionMessage *sdpMessage =
-          (ARDSessionDescriptionMessage *)message;
-      RTCSessionDescription *description = sdpMessage.sessionDescription;
-      NSString *dsc = description.sdp;
-      dsc = [dsc stringByReplacingOccurrencesOfString:@"offer"
-                                           withString:@"answer"];
-      RTCSessionDescription *answerDescription =
-          [[RTCSessionDescription alloc] initWithType:RTCSdpTypeAnswer sdp:dsc];
-      ARDSignalingMessage *answer =
-          [[ARDSessionDescriptionMessage alloc]
-               initWithDescription:answerDescription];
-      [self sendMessage:answer];
-      break;
-    }
-    case kARDSignalingMessageTypeAnswer:
-      // Should not receive answer in loopback scenario.
-      break;
-    case kARDSignalingMessageTypeCandidate:
-    case kARDSignalingMessageTypeCandidateRemoval:
-      // Send back to server.
-      [self sendMessage:message];
-      break;
-    case kARDSignalingMessageTypeBye:
-      // Nothing to do.
-      return;
-  }
-}
-
-- (void)channel:(id<ARDSignalingChannel>)channel
-    didChangeState:(ARDSignalingChannelState)state {
-}
-
-@end
-
diff --git a/examples/objc/AppRTCMobile/RTCIceCandidate+JSON.h b/examples/objc/AppRTCMobile/RTCIceCandidate+JSON.h
deleted file mode 100644
index d2e5e33..0000000
--- a/examples/objc/AppRTCMobile/RTCIceCandidate+JSON.h
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- *  Copyright 2014 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.
- */
-
-#import "WebRTC/RTCIceCandidate.h"
-
-@interface RTCIceCandidate (JSON)
-
-+ (RTCIceCandidate *)candidateFromJSONDictionary:(NSDictionary *)dictionary;
-+ (NSArray<RTCIceCandidate *> *)candidatesFromJSONDictionary:
-    (NSDictionary *)dictionary;
-+ (NSData *)JSONDataForIceCandidates:(NSArray<RTCIceCandidate *> *)candidates
-                            withType:(NSString *)typeValue;
-- (NSData *)JSONData;
-
-@end
diff --git a/examples/objc/AppRTCMobile/RTCIceCandidate+JSON.m b/examples/objc/AppRTCMobile/RTCIceCandidate+JSON.m
deleted file mode 100644
index b1be7fb..0000000
--- a/examples/objc/AppRTCMobile/RTCIceCandidate+JSON.m
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- *  Copyright 2014 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.
- */
-
-#import "RTCIceCandidate+JSON.h"
-
-#import "WebRTC/RTCLogging.h"
-
-static NSString const *kRTCICECandidateTypeKey = @"type";
-static NSString const *kRTCICECandidateTypeValue = @"candidate";
-static NSString const *kRTCICECandidateMidKey = @"id";
-static NSString const *kRTCICECandidateMLineIndexKey = @"label";
-static NSString const *kRTCICECandidateSdpKey = @"candidate";
-static NSString const *kRTCICECandidatesTypeKey = @"candidates";
-
-
-@implementation RTCIceCandidate (JSON)
-
-+ (RTCIceCandidate *)candidateFromJSONDictionary:(NSDictionary *)dictionary {
-  NSString *mid = dictionary[kRTCICECandidateMidKey];
-  NSString *sdp = dictionary[kRTCICECandidateSdpKey];
-  NSNumber *num = dictionary[kRTCICECandidateMLineIndexKey];
-  NSInteger mLineIndex = [num integerValue];
-  return [[RTCIceCandidate alloc] initWithSdp:sdp
-                                sdpMLineIndex:mLineIndex
-                                       sdpMid:mid];
-}
-
-+ (NSData *)JSONDataForIceCandidates:(NSArray<RTCIceCandidate *> *)candidates
-                            withType:(NSString *)typeValue {
-  NSMutableArray *jsonCandidates =
-      [NSMutableArray arrayWithCapacity:candidates.count];
-  for (RTCIceCandidate *candidate in candidates) {
-    NSDictionary *jsonCandidate = [candidate JSONDictionary];
-    [jsonCandidates addObject:jsonCandidate];
-  }
-  NSDictionary *json = @{
-    kRTCICECandidateTypeKey : typeValue,
-    kRTCICECandidatesTypeKey : jsonCandidates
-  };
-  NSError *error = nil;
-  NSData *data =
-      [NSJSONSerialization dataWithJSONObject:json
-                                      options:NSJSONWritingPrettyPrinted
-                                        error:&error];
-  if (error) {
-    RTCLogError(@"Error serializing JSON: %@", error);
-    return nil;
-  }
-  return data;
-}
-
-+ (NSArray<RTCIceCandidate *> *)candidatesFromJSONDictionary:
-    (NSDictionary *)dictionary {
-  NSArray *jsonCandidates = dictionary[kRTCICECandidatesTypeKey];
-  NSMutableArray<RTCIceCandidate *> *candidates =
-      [NSMutableArray arrayWithCapacity:jsonCandidates.count];
-  for (NSDictionary *jsonCandidate in jsonCandidates) {
-    RTCIceCandidate *candidate =
-        [RTCIceCandidate candidateFromJSONDictionary:jsonCandidate];
-    [candidates addObject:candidate];
-  }
-  return candidates;
-}
-
-- (NSData *)JSONData {
-  NSDictionary *json = @{
-    kRTCICECandidateTypeKey : kRTCICECandidateTypeValue,
-    kRTCICECandidateMLineIndexKey : @(self.sdpMLineIndex),
-    kRTCICECandidateMidKey : self.sdpMid,
-    kRTCICECandidateSdpKey : self.sdp
-  };
-  NSError *error = nil;
-  NSData *data =
-      [NSJSONSerialization dataWithJSONObject:json
-                                      options:NSJSONWritingPrettyPrinted
-                                        error:&error];
-  if (error) {
-    RTCLogError(@"Error serializing JSON: %@", error);
-    return nil;
-  }
-  return data;
-}
-
-- (NSDictionary *)JSONDictionary{
-  NSDictionary *json = @{
-    kRTCICECandidateMLineIndexKey : @(self.sdpMLineIndex),
-    kRTCICECandidateMidKey : self.sdpMid,
-    kRTCICECandidateSdpKey : self.sdp
-  };
-  return json;
-}
-
-@end
diff --git a/examples/objc/AppRTCMobile/RTCIceServer+JSON.h b/examples/objc/AppRTCMobile/RTCIceServer+JSON.h
deleted file mode 100644
index dbc702d..0000000
--- a/examples/objc/AppRTCMobile/RTCIceServer+JSON.h
+++ /dev/null
@@ -1,17 +0,0 @@
-/*
- *  Copyright 2014 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.
- */
-
-#import "WebRTC/RTCIceServer.h"
-
-@interface RTCIceServer (JSON)
-
-+ (RTCIceServer *)serverFromJSONDictionary:(NSDictionary *)dictionary;
-
-@end
diff --git a/examples/objc/AppRTCMobile/RTCIceServer+JSON.m b/examples/objc/AppRTCMobile/RTCIceServer+JSON.m
deleted file mode 100644
index 912b521..0000000
--- a/examples/objc/AppRTCMobile/RTCIceServer+JSON.m
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- *  Copyright 2014 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.
- */
-
-#import "RTCIceServer+JSON.h"
-
-@implementation RTCIceServer (JSON)
-
-+ (RTCIceServer *)serverFromJSONDictionary:(NSDictionary *)dictionary {
-  NSArray *turnUrls = dictionary[@"urls"];
-  NSString *username = dictionary[@"username"] ?: @"";
-  NSString *credential = dictionary[@"credential"] ?: @"";
-  return [[RTCIceServer alloc] initWithURLStrings:turnUrls
-                                         username:username
-                                       credential:credential];
-}
-
-@end
diff --git a/examples/objc/AppRTCMobile/RTCMediaConstraints+JSON.h b/examples/objc/AppRTCMobile/RTCMediaConstraints+JSON.h
deleted file mode 100644
index 74f89a9..0000000
--- a/examples/objc/AppRTCMobile/RTCMediaConstraints+JSON.h
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- *  Copyright 2014 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.
- */
-
-#import "WebRTC/RTCMediaConstraints.h"
-
-@interface RTCMediaConstraints (JSON)
-
-+ (RTCMediaConstraints *)constraintsFromJSONDictionary:
-    (NSDictionary *)dictionary;
-
-@end
-
diff --git a/examples/objc/AppRTCMobile/RTCMediaConstraints+JSON.m b/examples/objc/AppRTCMobile/RTCMediaConstraints+JSON.m
deleted file mode 100644
index c903735..0000000
--- a/examples/objc/AppRTCMobile/RTCMediaConstraints+JSON.m
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- *  Copyright 2014 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.
- */
-
-#import "RTCMediaConstraints+JSON.h"
-
-static NSString const *kRTCMediaConstraintsMandatoryKey = @"mandatory";
-
-@implementation RTCMediaConstraints (JSON)
-
-+ (RTCMediaConstraints *)constraintsFromJSONDictionary:
-    (NSDictionary *)dictionary {
-  NSDictionary *mandatory = dictionary[kRTCMediaConstraintsMandatoryKey];
-  NSMutableDictionary *mandatoryContraints =
-      [NSMutableDictionary dictionaryWithCapacity:[mandatory count]];
-  [mandatory enumerateKeysAndObjectsUsingBlock:^(
-      id key, id obj, BOOL *stop) {
-    mandatoryContraints[key] = obj;
-  }];
-  // TODO(tkchin): figure out json formats for optional constraints.
-  RTCMediaConstraints *constraints =
-      [[RTCMediaConstraints alloc]
-          initWithMandatoryConstraints:mandatoryContraints
-                   optionalConstraints:nil];
-  return constraints;
-}
-
-@end
diff --git a/examples/objc/AppRTCMobile/RTCSessionDescription+JSON.h b/examples/objc/AppRTCMobile/RTCSessionDescription+JSON.h
deleted file mode 100644
index cccff9a..0000000
--- a/examples/objc/AppRTCMobile/RTCSessionDescription+JSON.h
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- *  Copyright 2014 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.
- */
-
-#import "WebRTC/RTCSessionDescription.h"
-
-@interface RTCSessionDescription (JSON)
-
-+ (RTCSessionDescription *)descriptionFromJSONDictionary:
-    (NSDictionary *)dictionary;
-- (NSData *)JSONData;
-
-@end
diff --git a/examples/objc/AppRTCMobile/RTCSessionDescription+JSON.m b/examples/objc/AppRTCMobile/RTCSessionDescription+JSON.m
deleted file mode 100644
index a6059f7..0000000
--- a/examples/objc/AppRTCMobile/RTCSessionDescription+JSON.m
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- *  Copyright 2014 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.
- */
-
-#import "RTCSessionDescription+JSON.h"
-
-static NSString const *kRTCSessionDescriptionTypeKey = @"type";
-static NSString const *kRTCSessionDescriptionSdpKey = @"sdp";
-
-@implementation RTCSessionDescription (JSON)
-
-+ (RTCSessionDescription *)descriptionFromJSONDictionary:
-    (NSDictionary *)dictionary {
-  NSString *typeString = dictionary[kRTCSessionDescriptionTypeKey];
-  RTCSdpType type = [[self class] typeForString:typeString];
-  NSString *sdp = dictionary[kRTCSessionDescriptionSdpKey];
-  return [[RTCSessionDescription alloc] initWithType:type sdp:sdp];
-}
-
-- (NSData *)JSONData {
-  NSString *type = [[self class] stringForType:self.type];
-  NSDictionary *json = @{
-    kRTCSessionDescriptionTypeKey : type,
-    kRTCSessionDescriptionSdpKey : self.sdp
-  };
-  return [NSJSONSerialization dataWithJSONObject:json options:0 error:nil];
-}
-
-@end
diff --git a/examples/objc/AppRTCMobile/common/ARDUtilities.h b/examples/objc/AppRTCMobile/common/ARDUtilities.h
deleted file mode 100644
index 8a5c126..0000000
--- a/examples/objc/AppRTCMobile/common/ARDUtilities.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- *  Copyright 2014 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.
- */
-
-#import <Foundation/Foundation.h>
-
-@interface NSDictionary (ARDUtilites)
-
-// Creates a dictionary with the keys and values in the JSON object.
-+ (NSDictionary *)dictionaryWithJSONString:(NSString *)jsonString;
-+ (NSDictionary *)dictionaryWithJSONData:(NSData *)jsonData;
-
-@end
-
-@interface NSURLConnection (ARDUtilities)
-
-// Issues an asynchronous request that calls back on main queue.
-+ (void)sendAsyncRequest:(NSURLRequest *)request
-       completionHandler:(void (^)(NSURLResponse *response,
-                                   NSData *data,
-                                   NSError *error))completionHandler;
-
-// Posts data to the specified URL.
-+ (void)sendAsyncPostToURL:(NSURL *)url
-                  withData:(NSData *)data
-         completionHandler:(void (^)(BOOL succeeded,
-                                     NSData *data))completionHandler;
-
-@end
-
-NSInteger ARDGetCpuUsagePercentage();
-
diff --git a/examples/objc/AppRTCMobile/common/ARDUtilities.m b/examples/objc/AppRTCMobile/common/ARDUtilities.m
deleted file mode 100644
index 0ae44da..0000000
--- a/examples/objc/AppRTCMobile/common/ARDUtilities.m
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
- *  Copyright 2014 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.
- */
-
-#import "ARDUtilities.h"
-
-#import <mach/mach.h>
-
-#import "WebRTC/RTCLogging.h"
-
-@implementation NSDictionary (ARDUtilites)
-
-+ (NSDictionary *)dictionaryWithJSONString:(NSString *)jsonString {
-  NSParameterAssert(jsonString.length > 0);
-  NSData *data = [jsonString dataUsingEncoding:NSUTF8StringEncoding];
-  NSError *error = nil;
-  NSDictionary *dict =
-      [NSJSONSerialization JSONObjectWithData:data options:0 error:&error];
-  if (error) {
-    RTCLogError(@"Error parsing JSON: %@", error.localizedDescription);
-  }
-  return dict;
-}
-
-+ (NSDictionary *)dictionaryWithJSONData:(NSData *)jsonData {
-  NSError *error = nil;
-  NSDictionary *dict =
-      [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:&error];
-  if (error) {
-    RTCLogError(@"Error parsing JSON: %@", error.localizedDescription);
-  }
-  return dict;
-}
-
-@end
-
-@implementation NSURLConnection (ARDUtilities)
-
-+ (void)sendAsyncRequest:(NSURLRequest *)request
-       completionHandler:(void (^)(NSURLResponse *response,
-                                   NSData *data,
-                                   NSError *error))completionHandler {
-  // Kick off an async request which will call back on main thread.
-  NSURLSession *session = [NSURLSession sharedSession];
-  [[session dataTaskWithRequest:request
-              completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
-                if (completionHandler) {
-                  completionHandler(response, data, error);
-                }
-              }] resume];
-}
-
-// Posts data to the specified URL.
-+ (void)sendAsyncPostToURL:(NSURL *)url
-                  withData:(NSData *)data
-         completionHandler:(void (^)(BOOL succeeded,
-                                     NSData *data))completionHandler {
-  NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
-  request.HTTPMethod = @"POST";
-  request.HTTPBody = data;
-  [[self class] sendAsyncRequest:request
-                completionHandler:^(NSURLResponse *response,
-                                    NSData *data,
-                                    NSError *error) {
-    if (error) {
-      RTCLogError(@"Error posting data: %@", error.localizedDescription);
-      if (completionHandler) {
-        completionHandler(NO, data);
-      }
-      return;
-    }
-    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
-    if (httpResponse.statusCode != 200) {
-      NSString *serverResponse = data.length > 0 ?
-          [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] :
-          nil;
-      RTCLogError(@"Received bad response: %@", serverResponse);
-      if (completionHandler) {
-        completionHandler(NO, data);
-      }
-      return;
-    }
-    if (completionHandler) {
-      completionHandler(YES, data);
-    }
-  }];
-}
-
-@end
-
-NSInteger ARDGetCpuUsagePercentage() {
-  // Create an array of thread ports for the current task.
-  const task_t task = mach_task_self();
-  thread_act_array_t thread_array;
-  mach_msg_type_number_t thread_count;
-  if (task_threads(task, &thread_array, &thread_count) != KERN_SUCCESS) {
-    return -1;
-  }
-
-  // Sum cpu usage from all threads.
-  float cpu_usage_percentage = 0;
-  thread_basic_info_data_t thread_info_data = {};
-  mach_msg_type_number_t thread_info_count;
-  for (size_t i = 0; i < thread_count; ++i) {
-    thread_info_count = THREAD_BASIC_INFO_COUNT;
-    kern_return_t ret = thread_info(thread_array[i],
-                                    THREAD_BASIC_INFO,
-                                    (thread_info_t)&thread_info_data,
-                                    &thread_info_count);
-    if (ret == KERN_SUCCESS) {
-      cpu_usage_percentage +=
-          100.f * (float)thread_info_data.cpu_usage / TH_USAGE_SCALE;
-    }
-  }
-
-  // Dealloc the created array.
-  vm_deallocate(task, (vm_address_t)thread_array,
-                sizeof(thread_act_t) * thread_count);
-  return lroundf(cpu_usage_percentage);
-}
diff --git a/examples/objc/AppRTCMobile/ios/ARDAppDelegate.h b/examples/objc/AppRTCMobile/ios/ARDAppDelegate.h
deleted file mode 100644
index 7eafff8..0000000
--- a/examples/objc/AppRTCMobile/ios/ARDAppDelegate.h
+++ /dev/null
@@ -1,17 +0,0 @@
-/*
- *  Copyright 2013 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.
- */
-
-#import <UIKit/UIKit.h>
-
-// The main application class of the AppRTCMobile iOS app demonstrating
-// interoperability between the Objective C implementation of PeerConnection
-// and the appr.tc demo webapp.
-@interface ARDAppDelegate : NSObject <UIApplicationDelegate>
-@end
diff --git a/examples/objc/AppRTCMobile/ios/ARDAppDelegate.m b/examples/objc/AppRTCMobile/ios/ARDAppDelegate.m
deleted file mode 100644
index 07c83a0..0000000
--- a/examples/objc/AppRTCMobile/ios/ARDAppDelegate.m
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- *  Copyright 2013 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.
- */
-
-#import "ARDAppDelegate.h"
-
-#import "WebRTC/RTCFieldTrials.h"
-#import "WebRTC/RTCLogging.h"
-#import "WebRTC/RTCSSLAdapter.h"
-#import "WebRTC/RTCTracing.h"
-
-#import "ARDMainViewController.h"
-
-@implementation ARDAppDelegate {
-  UIWindow *_window;
-}
-
-#pragma mark - UIApplicationDelegate methods
-
-- (BOOL)application:(UIApplication *)application
-    didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
-  NSDictionary *fieldTrials = @{
-    kRTCFieldTrialH264HighProfileKey: kRTCFieldTrialEnabledValue,
-  };
-  RTCInitFieldTrialDictionary(fieldTrials);
-  RTCInitializeSSL();
-  RTCSetupInternalTracer();
-  _window =  [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
-  [_window makeKeyAndVisible];
-  ARDMainViewController *viewController = [[ARDMainViewController alloc] init];
-
-  UINavigationController *root =
-      [[UINavigationController alloc] initWithRootViewController:viewController];
-  root.navigationBar.translucent = NO;
-  _window.rootViewController = root;
-
-#if defined(NDEBUG)
-  // In debug builds the default level is LS_INFO and in non-debug builds it is
-  // disabled. Continue to log to console in non-debug builds, but only
-  // warnings and errors.
-  RTCSetMinDebugLogLevel(RTCLoggingSeverityWarning);
-#endif
-
-  return YES;
-}
-
-- (void)applicationWillTerminate:(UIApplication *)application {
-  RTCShutdownInternalTracer();
-  RTCCleanupSSL();
-}
-
-@end
diff --git a/examples/objc/AppRTCMobile/ios/ARDMainView.h b/examples/objc/AppRTCMobile/ios/ARDMainView.h
deleted file mode 100644
index c6691c2..0000000
--- a/examples/objc/AppRTCMobile/ios/ARDMainView.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-#import <UIKit/UIKit.h>
-
-@class ARDMainView;
-
-@protocol ARDMainViewDelegate <NSObject>
-
-- (void)mainView:(ARDMainView *)mainView didInputRoom:(NSString *)room isLoopback:(BOOL)isLoopback;
-- (void)mainViewDidToggleAudioLoop:(ARDMainView *)mainView;
-
-@end
-
-// The main view of AppRTCMobile. It contains an input field for entering a room
-// name on apprtc to connect to.
-@interface ARDMainView : UIView
-
-@property(nonatomic, weak) id<ARDMainViewDelegate> delegate;
-// Updates the audio loop button as needed.
-@property(nonatomic, assign) BOOL isAudioLoopPlaying;
-
-@end
diff --git a/examples/objc/AppRTCMobile/ios/ARDMainView.m b/examples/objc/AppRTCMobile/ios/ARDMainView.m
deleted file mode 100644
index fcce3c3..0000000
--- a/examples/objc/AppRTCMobile/ios/ARDMainView.m
+++ /dev/null
@@ -1,205 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-#import "ARDMainView.h"
-
-#import "UIImage+ARDUtilities.h"
-
-static CGFloat const kRoomTextFieldHeight = 40;
-static CGFloat const kRoomTextFieldMargin = 8;
-static CGFloat const kCallControlMargin = 8;
-
-// Helper view that contains a text field and a clear button.
-@interface ARDRoomTextField : UIView <UITextFieldDelegate>
-@property(nonatomic, readonly) NSString *roomText;
-@end
-
-@implementation ARDRoomTextField {
-  UITextField *_roomText;
-}
-
-- (instancetype)initWithFrame:(CGRect)frame {
-  if (self = [super initWithFrame:frame]) {
-    _roomText = [[UITextField alloc] initWithFrame:CGRectZero];
-    _roomText.borderStyle = UITextBorderStyleNone;
-    _roomText.font = [UIFont fontWithName:@"Roboto" size:12];
-    _roomText.placeholder = @"Room name";
-    _roomText.autocorrectionType = UITextAutocorrectionTypeNo;
-    _roomText.autocapitalizationType = UITextAutocapitalizationTypeNone;
-    _roomText.clearButtonMode = UITextFieldViewModeAlways;
-    _roomText.delegate = self;
-    [self addSubview:_roomText];
-
-    // Give rounded corners and a light gray border.
-    self.layer.borderWidth = 1;
-    self.layer.borderColor = [[UIColor lightGrayColor] CGColor];
-    self.layer.cornerRadius = 2;
-  }
-  return self;
-}
-
-- (void)layoutSubviews {
-  _roomText.frame =
-      CGRectMake(kRoomTextFieldMargin, 0, CGRectGetWidth(self.bounds) - kRoomTextFieldMargin,
-                 kRoomTextFieldHeight);
-}
-
-- (CGSize)sizeThatFits:(CGSize)size {
-  size.height = kRoomTextFieldHeight;
-  return size;
-}
-
-- (NSString *)roomText {
-  return _roomText.text;
-}
-
-#pragma mark - UITextFieldDelegate
-
-- (BOOL)textFieldShouldReturn:(UITextField *)textField {
-  // There is no other control that can take focus, so manually resign focus
-  // when return (Join) is pressed to trigger |textFieldDidEndEditing|.
-  [textField resignFirstResponder];
-  return YES;
-}
-
-@end
-
-@implementation ARDMainView {
-  ARDRoomTextField *_roomText;
-  UILabel *_callOptionsLabel;
-  UISwitch *_loopbackSwitch;
-  UILabel *_loopbackLabel;
-  UIButton *_startCallButton;
-  UIButton *_audioLoopButton;
-}
-
-@synthesize delegate = _delegate;
-@synthesize isAudioLoopPlaying = _isAudioLoopPlaying;
-
-- (instancetype)initWithFrame:(CGRect)frame {
-  if (self = [super initWithFrame:frame]) {
-    _roomText = [[ARDRoomTextField alloc] initWithFrame:CGRectZero];
-    [self addSubview:_roomText];
-
-    UIFont *controlFont = [UIFont fontWithName:@"Roboto" size:20];
-    UIColor *controlFontColor = [UIColor colorWithWhite:0 alpha:.6];
-
-    _callOptionsLabel = [[UILabel alloc] initWithFrame:CGRectZero];
-    _callOptionsLabel.text = @"Call Options";
-    _callOptionsLabel.font = controlFont;
-    _callOptionsLabel.textColor = controlFontColor;
-    [_callOptionsLabel sizeToFit];
-    [self addSubview:_callOptionsLabel];
-
-    _loopbackSwitch = [[UISwitch alloc] initWithFrame:CGRectZero];
-    [_loopbackSwitch sizeToFit];
-    [self addSubview:_loopbackSwitch];
-
-    _loopbackLabel = [[UILabel alloc] initWithFrame:CGRectZero];
-    _loopbackLabel.text = @"Loopback mode";
-    _loopbackLabel.font = controlFont;
-    _loopbackLabel.textColor = controlFontColor;
-    [_loopbackLabel sizeToFit];
-    [self addSubview:_loopbackLabel];
-
-    _startCallButton = [UIButton buttonWithType:UIButtonTypeSystem];
-    [_startCallButton setTitle:@"Start call"
-                      forState:UIControlStateNormal];
-    _startCallButton.titleLabel.font = controlFont;
-    [_startCallButton sizeToFit];
-    [_startCallButton addTarget:self
-                         action:@selector(onStartCall:)
-               forControlEvents:UIControlEventTouchUpInside];
-    [self addSubview:_startCallButton];
-
-    // Used to test what happens to sounds when calls are in progress.
-    _audioLoopButton = [UIButton buttonWithType:UIButtonTypeSystem];
-    _audioLoopButton.titleLabel.font = controlFont;
-    [self updateAudioLoopButton];
-    [_audioLoopButton addTarget:self
-                         action:@selector(onToggleAudioLoop:)
-               forControlEvents:UIControlEventTouchUpInside];
-    [self addSubview:_audioLoopButton];
-
-    self.backgroundColor = [UIColor whiteColor];
-  }
-  return self;
-}
-
-- (void)setIsAudioLoopPlaying:(BOOL)isAudioLoopPlaying {
-  if (_isAudioLoopPlaying == isAudioLoopPlaying) {
-    return;
-  }
-  _isAudioLoopPlaying = isAudioLoopPlaying;
-  [self updateAudioLoopButton];
-}
-
-- (void)layoutSubviews {
-  CGRect bounds = self.bounds;
-  CGFloat roomTextWidth = bounds.size.width - 2 * kRoomTextFieldMargin;
-  CGFloat roomTextHeight = [_roomText sizeThatFits:bounds.size].height;
-  _roomText.frame =
-      CGRectMake(kRoomTextFieldMargin, kRoomTextFieldMargin, roomTextWidth, roomTextHeight);
-
-  CGFloat callOptionsLabelTop =
-      CGRectGetMaxY(_roomText.frame) + kCallControlMargin * 4;
-  _callOptionsLabel.frame = CGRectMake(kCallControlMargin,
-                                       callOptionsLabelTop,
-                                       _callOptionsLabel.frame.size.width,
-                                       _callOptionsLabel.frame.size.height);
-
-  CGFloat loopbackModeTop = CGRectGetMaxY(_callOptionsLabel.frame) + kCallControlMargin * 2;
-  CGRect loopbackModeRect = CGRectMake(kCallControlMargin * 3,
-                                       loopbackModeTop,
-                                       _loopbackSwitch.frame.size.width,
-                                       _loopbackSwitch.frame.size.height);
-  _loopbackSwitch.frame = loopbackModeRect;
-  CGFloat loopbackModeLabelCenterX = CGRectGetMaxX(loopbackModeRect) +
-      kCallControlMargin + _loopbackLabel.frame.size.width / 2;
-  _loopbackLabel.center = CGPointMake(loopbackModeLabelCenterX,
-                                      CGRectGetMidY(loopbackModeRect));
-
-  CGFloat audioLoopTop = CGRectGetMaxY(loopbackModeRect) + kCallControlMargin * 3;
-  _audioLoopButton.frame = CGRectMake(kCallControlMargin,
-                                      audioLoopTop,
-                                      _audioLoopButton.frame.size.width,
-                                      _audioLoopButton.frame.size.height);
-
-  CGFloat startCallTop =
-      CGRectGetMaxY(_audioLoopButton.frame) + kCallControlMargin * 3;
-  _startCallButton.frame = CGRectMake(kCallControlMargin,
-                                      startCallTop,
-                                      _startCallButton.frame.size.width,
-                                      _startCallButton.frame.size.height);
-}
-
-#pragma mark - Private
-
-- (void)updateAudioLoopButton {
-  if (_isAudioLoopPlaying) {
-    [_audioLoopButton setTitle:@"Stop sound"
-                      forState:UIControlStateNormal];
-    [_audioLoopButton sizeToFit];
-  } else {
-    [_audioLoopButton setTitle:@"Play sound"
-                      forState:UIControlStateNormal];
-    [_audioLoopButton sizeToFit];
-  }
-}
-
-- (void)onToggleAudioLoop:(id)sender {
-  [_delegate mainViewDidToggleAudioLoop:self];
-}
-
-- (void)onStartCall:(id)sender {
-  [_delegate mainView:self didInputRoom:_roomText.roomText isLoopback:_loopbackSwitch.isOn];
-}
-
-@end
diff --git a/examples/objc/AppRTCMobile/ios/ARDMainViewController.h b/examples/objc/AppRTCMobile/ios/ARDMainViewController.h
deleted file mode 100644
index e5c92dd..0000000
--- a/examples/objc/AppRTCMobile/ios/ARDMainViewController.h
+++ /dev/null
@@ -1,14 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-#import <UIKit/UIKit.h>
-
-@interface ARDMainViewController : UIViewController
-@end
diff --git a/examples/objc/AppRTCMobile/ios/ARDMainViewController.m b/examples/objc/AppRTCMobile/ios/ARDMainViewController.m
deleted file mode 100644
index 174514f..0000000
--- a/examples/objc/AppRTCMobile/ios/ARDMainViewController.m
+++ /dev/null
@@ -1,260 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-#import "ARDMainViewController.h"
-
-#import <AVFoundation/AVFoundation.h>
-
-#import "WebRTC/RTCAudioSession.h"
-#import "WebRTC/RTCAudioSessionConfiguration.h"
-#import "WebRTC/RTCDispatcher.h"
-#import "WebRTC/RTCLogging.h"
-
-
-#import "ARDAppClient.h"
-#import "ARDMainView.h"
-#import "ARDSettingsModel.h"
-#import "ARDSettingsViewController.h"
-#import "ARDVideoCallViewController.h"
-
-static NSString *const barButtonImageString = @"ic_settings_black_24dp.png";
-
-// Launch argument to be passed to indicate that the app should start loopback immediatly
-static NSString *const loopbackLaunchProcessArgument = @"loopback";
-
-@interface ARDMainViewController () <
-    ARDMainViewDelegate,
-    ARDVideoCallViewControllerDelegate,
-    RTCAudioSessionDelegate>
-@end
-
-@implementation ARDMainViewController {
-  ARDMainView *_mainView;
-  AVAudioPlayer *_audioPlayer;
-  BOOL _useManualAudio;
-}
-
-- (void)viewDidLoad {
-  [super viewDidLoad];
-  if ([[[NSProcessInfo processInfo] arguments] containsObject:loopbackLaunchProcessArgument]) {
-    [self mainView:nil didInputRoom:@"" isLoopback:YES];
-  }
-}
-
-- (void)loadView {
-  self.title = @"AppRTC Mobile";
-  _mainView = [[ARDMainView alloc] initWithFrame:CGRectZero];
-  _mainView.delegate = self;
-  self.view = _mainView;
-  [self addSettingsBarButton];
-
-  RTCAudioSessionConfiguration *webRTCConfig =
-      [RTCAudioSessionConfiguration webRTCConfiguration];
-  webRTCConfig.categoryOptions = webRTCConfig.categoryOptions |
-      AVAudioSessionCategoryOptionDefaultToSpeaker;
-  [RTCAudioSessionConfiguration setWebRTCConfiguration:webRTCConfig];
-
-  RTCAudioSession *session = [RTCAudioSession sharedInstance];
-  [session addDelegate:self];
-
-  [self configureAudioSession];
-  [self setupAudioPlayer];
-}
-
-- (void)addSettingsBarButton {
-  UIBarButtonItem *settingsButton =
-      [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:barButtonImageString]
-                                       style:UIBarButtonItemStylePlain
-                                      target:self
-                                      action:@selector(showSettings:)];
-  self.navigationItem.rightBarButtonItem = settingsButton;
-}
-
-+ (NSString *)loopbackRoomString {
-  NSString *loopbackRoomString =
-      [[NSUUID UUID].UUIDString stringByReplacingOccurrencesOfString:@"-" withString:@""];
-  return loopbackRoomString;
-}
-
-#pragma mark - ARDMainViewDelegate
-
-- (void)mainView:(ARDMainView *)mainView didInputRoom:(NSString *)room isLoopback:(BOOL)isLoopback {
-  if (!room.length) {
-    if (isLoopback) {
-      // If this is a loopback call, allow a generated room name.
-      room = [[self class] loopbackRoomString];
-    } else {
-      [self showAlertWithMessage:@"Missing room name."];
-      return;
-    }
-  }
-  // Trim whitespaces.
-  NSCharacterSet *whitespaceSet = [NSCharacterSet whitespaceCharacterSet];
-  NSString *trimmedRoom = [room stringByTrimmingCharactersInSet:whitespaceSet];
-
-  // Check that room name is valid.
-  NSError *error = nil;
-  NSRegularExpressionOptions options = NSRegularExpressionCaseInsensitive;
-  NSRegularExpression *regex =
-      [NSRegularExpression regularExpressionWithPattern:@"\\w+"
-                                                options:options
-                                                  error:&error];
-  if (error) {
-    [self showAlertWithMessage:error.localizedDescription];
-    return;
-  }
-  NSRange matchRange =
-      [regex rangeOfFirstMatchInString:trimmedRoom
-                               options:0
-                                 range:NSMakeRange(0, trimmedRoom.length)];
-  if (matchRange.location == NSNotFound ||
-      matchRange.length != trimmedRoom.length) {
-    [self showAlertWithMessage:@"Invalid room name."];
-    return;
-  }
-
-  ARDSettingsModel *settingsModel = [[ARDSettingsModel alloc] init];
-
-  RTCAudioSession *session = [RTCAudioSession sharedInstance];
-  session.useManualAudio = [settingsModel currentUseManualAudioConfigSettingFromStore];
-  session.isAudioEnabled = NO;
-
-  // Kick off the video call.
-  ARDVideoCallViewController *videoCallViewController =
-      [[ARDVideoCallViewController alloc] initForRoom:trimmedRoom
-                                           isLoopback:isLoopback
-                                             delegate:self];
-  videoCallViewController.modalTransitionStyle =
-      UIModalTransitionStyleCrossDissolve;
-  [self presentViewController:videoCallViewController
-                     animated:YES
-                   completion:nil];
-}
-
-- (void)mainViewDidToggleAudioLoop:(ARDMainView *)mainView {
-  if (mainView.isAudioLoopPlaying) {
-    [_audioPlayer stop];
-  } else {
-    [_audioPlayer play];
-  }
-  mainView.isAudioLoopPlaying = _audioPlayer.playing;
-}
-
-#pragma mark - ARDVideoCallViewControllerDelegate
-
-- (void)viewControllerDidFinish:(ARDVideoCallViewController *)viewController {
-  if (![viewController isBeingDismissed]) {
-    RTCLog(@"Dismissing VC");
-    [self dismissViewControllerAnimated:YES completion:^{
-      [self restartAudioPlayerIfNeeded];
-    }];
-  }
-  RTCAudioSession *session = [RTCAudioSession sharedInstance];
-  session.isAudioEnabled = NO;
-}
-
-#pragma mark - RTCAudioSessionDelegate
-
-- (void)audioSessionDidStartPlayOrRecord:(RTCAudioSession *)session {
-  // Stop playback on main queue and then configure WebRTC.
-  [RTCDispatcher dispatchAsyncOnType:RTCDispatcherTypeMain
-                               block:^{
-    if (_mainView.isAudioLoopPlaying) {
-      RTCLog(@"Stopping audio loop due to WebRTC start.");
-      [_audioPlayer stop];
-    }
-    RTCLog(@"Setting isAudioEnabled to YES.");
-    session.isAudioEnabled = YES;
-  }];
-}
-
-- (void)audioSessionDidStopPlayOrRecord:(RTCAudioSession *)session {
-  // WebRTC is done with the audio session. Restart playback.
-  [RTCDispatcher dispatchAsyncOnType:RTCDispatcherTypeMain
-                               block:^{
-    RTCLog(@"audioSessionDidStopPlayOrRecord");
-    [self restartAudioPlayerIfNeeded];
-  }];
-}
-
-#pragma mark - Private
-- (void)showSettings:(id)sender {
-  ARDSettingsViewController *settingsController =
-      [[ARDSettingsViewController alloc] initWithStyle:UITableViewStyleGrouped
-                                         settingsModel:[[ARDSettingsModel alloc] init]];
-
-  UINavigationController *navigationController =
-      [[UINavigationController alloc] initWithRootViewController:settingsController];
-  [self presentViewControllerAsModal:navigationController];
-}
-
-- (void)presentViewControllerAsModal:(UIViewController *)viewController {
-  [self presentViewController:viewController animated:YES completion:nil];
-}
-
-- (void)configureAudioSession {
-  RTCAudioSessionConfiguration *configuration =
-      [[RTCAudioSessionConfiguration alloc] init];
-  configuration.category = AVAudioSessionCategoryAmbient;
-  configuration.categoryOptions = AVAudioSessionCategoryOptionDuckOthers;
-  configuration.mode = AVAudioSessionModeDefault;
-
-  RTCAudioSession *session = [RTCAudioSession sharedInstance];
-  [session lockForConfiguration];
-  BOOL hasSucceeded = NO;
-  NSError *error = nil;
-  if (session.isActive) {
-    hasSucceeded = [session setConfiguration:configuration error:&error];
-  } else {
-    hasSucceeded = [session setConfiguration:configuration
-                                      active:YES
-                                       error:&error];
-  }
-  if (!hasSucceeded) {
-    RTCLogError(@"Error setting configuration: %@", error.localizedDescription);
-  }
-  [session unlockForConfiguration];
-}
-
-- (void)setupAudioPlayer {
-  NSString *audioFilePath =
-      [[NSBundle mainBundle] pathForResource:@"mozart" ofType:@"mp3"];
-  NSURL *audioFileURL = [NSURL URLWithString:audioFilePath];
-  _audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:audioFileURL
-                                                        error:nil];
-  _audioPlayer.numberOfLoops = -1;
-  _audioPlayer.volume = 1.0;
-  [_audioPlayer prepareToPlay];
-}
-
-- (void)restartAudioPlayerIfNeeded {
-  [self configureAudioSession];
-  if (_mainView.isAudioLoopPlaying && !self.presentedViewController) {
-    RTCLog(@"Starting audio loop due to WebRTC end.");
-    [_audioPlayer play];
-  }
-}
-
-- (void)showAlertWithMessage:(NSString*)message {
-  UIAlertController *alert =
-      [UIAlertController alertControllerWithTitle:nil
-                                          message:message
-                                   preferredStyle:UIAlertControllerStyleAlert];
-
-  UIAlertAction *defaultAction = [UIAlertAction actionWithTitle:@"OK"
-                                                          style:UIAlertActionStyleDefault
-                                                        handler:^(UIAlertAction *action){
-                                                        }];
-
-  [alert addAction:defaultAction];
-  [self presentViewController:alert animated:YES completion:nil];
-}
-
-@end
diff --git a/examples/objc/AppRTCMobile/ios/ARDSettingsViewController.h b/examples/objc/AppRTCMobile/ios/ARDSettingsViewController.h
deleted file mode 100644
index f979655..0000000
--- a/examples/objc/AppRTCMobile/ios/ARDSettingsViewController.h
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- *  Copyright 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.
- */
-
-#import <UIKit/UIKit.h>
-
-@class ARDSettingsModel;
-
-NS_ASSUME_NONNULL_BEGIN
-/**
- * Displays settings options.
- */
-@interface ARDSettingsViewController : UITableViewController
-
-/**
- * Creates new instance.
- *
- * @param style the table view style that should be used
- * @param settingsModel model class for the user settings.
- */
-- (instancetype)initWithStyle:(UITableViewStyle)style
-                settingsModel:(ARDSettingsModel *)settingsModel;
-
-#pragma mark - Unavailable
-
-- (instancetype)initWithStyle:(UITableViewStyle)style NS_UNAVAILABLE;
-- (instancetype)init NS_UNAVAILABLE;
-+ (instancetype) new NS_UNAVAILABLE;
-
-@end
-NS_ASSUME_NONNULL_END
diff --git a/examples/objc/AppRTCMobile/ios/ARDSettingsViewController.m b/examples/objc/AppRTCMobile/ios/ARDSettingsViewController.m
deleted file mode 100644
index fce5df7..0000000
--- a/examples/objc/AppRTCMobile/ios/ARDSettingsViewController.m
+++ /dev/null
@@ -1,369 +0,0 @@
-/*
- *  Copyright 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.
- */
-
-#import "ARDSettingsViewController.h"
-#import "ARDSettingsModel.h"
-
-NS_ASSUME_NONNULL_BEGIN
-
-typedef NS_ENUM(int, ARDSettingsSections) {
-  ARDSettingsSectionAudioSettings = 0,
-  ARDSettingsSectionVideoResolution,
-  ARDSettingsSectionVideoCodec,
-  ARDSettingsSectionBitRate,
-};
-
-typedef NS_ENUM(int, ARDAudioSettingsOptions) {
-  ARDAudioSettingsAudioOnly = 0,
-  ARDAudioSettingsCreateAecDump,
-  ARDAudioSettingsUseLevelController,
-  ARDAudioSettingsUseManualAudioConfig,
-};
-
-@interface ARDSettingsViewController () <UITextFieldDelegate> {
-  ARDSettingsModel *_settingsModel;
-}
-
-@end
-
-@implementation ARDSettingsViewController
-
-- (instancetype)initWithStyle:(UITableViewStyle)style
-                settingsModel:(ARDSettingsModel *)settingsModel {
-  self = [super initWithStyle:style];
-  if (self) {
-    _settingsModel = settingsModel;
-  }
-  return self;
-}
-
-#pragma mark - View lifecycle
-
-- (void)viewDidLoad {
-  [super viewDidLoad];
-  self.title = @"Settings";
-  [self addDoneBarButton];
-}
-
-- (void)viewWillAppear:(BOOL)animated {
-  [super viewWillAppear:animated];
-}
-
-#pragma mark - Data source
-
-- (NSArray<NSString *> *)videoResolutionArray {
-  return [_settingsModel availableVideoResolutions];
-}
-
-- (NSArray<NSString *> *)videoCodecArray {
-  return [_settingsModel availableVideoCodecs];
-}
-
-#pragma mark -
-
-- (void)addDoneBarButton {
-  UIBarButtonItem *barItem =
-      [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone
-                                                    target:self
-                                                    action:@selector(dismissModally:)];
-  self.navigationItem.leftBarButtonItem = barItem;
-}
-
-#pragma mark - Dismissal of view controller
-
-- (void)dismissModally:(id)sender {
-  [self dismissViewControllerAnimated:YES completion:nil];
-}
-
-#pragma mark - Table view data source
-
-- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
-  return 4;
-}
-
-- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
-  switch (section) {
-    case ARDSettingsSectionAudioSettings:
-      return 4;
-    case ARDSettingsSectionVideoResolution:
-      return self.videoResolutionArray.count;
-    case ARDSettingsSectionVideoCodec:
-      return self.videoCodecArray.count;
-    default:
-      return 1;
-  }
-}
-
-#pragma mark - Table view delegate helpers
-
-- (void)removeAllAccessories:(UITableView *)tableView
-                   inSection:(int)section
-{
-  for (int i = 0; i < [tableView numberOfRowsInSection:section]; i++) {
-    NSIndexPath *rowPath = [NSIndexPath indexPathForRow:i inSection:section];
-    UITableViewCell *cell = [tableView cellForRowAtIndexPath:rowPath];
-    cell.accessoryType = UITableViewCellAccessoryNone;
-  }
-}
-
-- (void)tableView:(UITableView *)tableView
-updateListSelectionAtIndexPath:(NSIndexPath *)indexPath
-        inSection:(int)section {
-  [self removeAllAccessories:tableView inSection:section];
-  UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
-  cell.accessoryType = UITableViewCellAccessoryCheckmark;
-  [tableView deselectRowAtIndexPath:indexPath animated:YES];
-}
-
-#pragma mark - Table view delegate
-
-- (nullable NSString *)tableView:(UITableView *)tableView
-         titleForHeaderInSection:(NSInteger)section {
-  switch (section) {
-    case ARDSettingsSectionAudioSettings:
-      return @"Audio";
-    case ARDSettingsSectionVideoResolution:
-      return @"Video resolution";
-    case ARDSettingsSectionVideoCodec:
-      return @"Video codec";
-    case ARDSettingsSectionBitRate:
-      return @"Maximum bitrate";
-    default:
-      return @"";
-  }
-}
-
-- (UITableViewCell *)tableView:(UITableView *)tableView
-         cellForRowAtIndexPath:(NSIndexPath *)indexPath {
-  switch (indexPath.section) {
-    case ARDSettingsSectionAudioSettings:
-      return [self audioSettingsTableViewCellForTableView:tableView atIndexPath:indexPath];
-
-    case ARDSettingsSectionVideoResolution:
-      return [self videoResolutionTableViewCellForTableView:tableView atIndexPath:indexPath];
-
-    case ARDSettingsSectionVideoCodec:
-      return [self videoCodecTableViewCellForTableView:tableView atIndexPath:indexPath];
-
-    case ARDSettingsSectionBitRate:
-      return [self bitrateTableViewCellForTableView:tableView atIndexPath:indexPath];
-
-    default:
-      return [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
-                                    reuseIdentifier:@"identifier"];
-  }
-}
-
-- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
-  switch (indexPath.section) {
-    case ARDSettingsSectionVideoResolution:
-      [self tableView:tableView disSelectVideoResolutionAtIndex:indexPath];
-      break;
-
-    case ARDSettingsSectionVideoCodec:
-      [self tableView:tableView didSelectVideoCodecCellAtIndexPath:indexPath];
-      break;
-  }
-}
-
-#pragma mark - Table view delegate(Video Resolution)
-
-- (UITableViewCell *)videoResolutionTableViewCellForTableView:(UITableView *)tableView
-                                                  atIndexPath:(NSIndexPath *)indexPath {
-  NSString *dequeueIdentifier = @"ARDSettingsVideoResolutionViewCellIdentifier";
-  UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:dequeueIdentifier];
-  if (!cell) {
-    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
-                                  reuseIdentifier:dequeueIdentifier];
-  }
-  NSString *resolution = self.videoResolutionArray[indexPath.row];
-  cell.textLabel.text = resolution;
-  if ([resolution isEqualToString:[_settingsModel currentVideoResolutionSettingFromStore]]) {
-    cell.accessoryType = UITableViewCellAccessoryCheckmark;
-  } else {
-    cell.accessoryType = UITableViewCellAccessoryNone;
-  }
-
-  return cell;
-}
-
-- (void)tableView:(UITableView *)tableView
-    disSelectVideoResolutionAtIndex:(NSIndexPath *)indexPath {
-  [self tableView:tableView
-      updateListSelectionAtIndexPath:indexPath
-                           inSection:ARDSettingsSectionVideoResolution];
-
-  NSString *videoResolution = self.videoResolutionArray[indexPath.row];
-  [_settingsModel storeVideoResolutionSetting:videoResolution];
-}
-
-#pragma mark - Table view delegate(Video Codec)
-
-- (UITableViewCell *)videoCodecTableViewCellForTableView:(UITableView *)tableView
-                                             atIndexPath:(NSIndexPath *)indexPath {
-  NSString *dequeueIdentifier = @"ARDSettingsVideoCodecCellIdentifier";
-  UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:dequeueIdentifier];
-  if (!cell) {
-    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
-                                  reuseIdentifier:dequeueIdentifier];
-  }
-  NSString *codec = self.videoCodecArray[indexPath.row];
-  cell.textLabel.text = codec;
-  if ([codec isEqualToString:[_settingsModel currentVideoCodecSettingFromStore]]) {
-    cell.accessoryType = UITableViewCellAccessoryCheckmark;
-  } else {
-    cell.accessoryType = UITableViewCellAccessoryNone;
-  }
-
-  return cell;
-}
-
-- (void)tableView:(UITableView *)tableView
-    didSelectVideoCodecCellAtIndexPath:(NSIndexPath *)indexPath {
-  [self tableView:tableView
-    updateListSelectionAtIndexPath:indexPath
-        inSection:ARDSettingsSectionVideoCodec];
-
-  NSString *videoCodec = self.videoCodecArray[indexPath.row];
-  [_settingsModel storeVideoCodecSetting:videoCodec];
-}
-
-#pragma mark - Table view delegate(Bitrate)
-
-- (UITableViewCell *)bitrateTableViewCellForTableView:(UITableView *)tableView
-                                          atIndexPath:(NSIndexPath *)indexPath {
-  NSString *dequeueIdentifier = @"ARDSettingsBitrateCellIdentifier";
-  UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:dequeueIdentifier];
-  if (!cell) {
-    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
-                                  reuseIdentifier:dequeueIdentifier];
-
-    UITextField *textField = [[UITextField alloc]
-        initWithFrame:CGRectMake(10, 0, cell.bounds.size.width - 20, cell.bounds.size.height)];
-    NSString *currentMaxBitrate = [_settingsModel currentMaxBitrateSettingFromStore].stringValue;
-    textField.text = currentMaxBitrate;
-    textField.placeholder = @"Enter max bit rate (kbps)";
-    textField.keyboardType = UIKeyboardTypeNumberPad;
-    textField.delegate = self;
-
-    // Numerical keyboards have no return button, we need to add one manually.
-    UIToolbar *numberToolbar =
-        [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, 50)];
-    numberToolbar.items = @[
-      [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace
-                                                    target:nil
-                                                    action:nil],
-      [[UIBarButtonItem alloc] initWithTitle:@"Apply"
-                                       style:UIBarButtonItemStyleDone
-                                      target:self
-                                      action:@selector(numberTextFieldDidEndEditing:)]
-    ];
-    [numberToolbar sizeToFit];
-
-    textField.inputAccessoryView = numberToolbar;
-    [cell addSubview:textField];
-  }
-  return cell;
-}
-
-- (void)numberTextFieldDidEndEditing:(id)sender {
-  [self.view endEditing:YES];
-}
-
-- (void)textFieldDidEndEditing:(UITextField *)textField {
-  NSNumber *bitrateNumber = nil;
-
-  if (textField.text.length != 0) {
-    bitrateNumber = [NSNumber numberWithInteger:textField.text.intValue];
-  }
-
-  [_settingsModel storeMaxBitrateSetting:bitrateNumber];
-}
-
-#pragma mark - Table view delegate(Audio settings)
-
-- (UITableViewCell *)audioSettingsTableViewCellForTableView:(UITableView *)tableView
-                                                atIndexPath:(NSIndexPath *)indexPath {
-  NSString *dequeueIdentifier = @"ARDSettingsAudioSettingsCellIdentifier";
-  UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:dequeueIdentifier];
-  if (!cell) {
-    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
-                                  reuseIdentifier:dequeueIdentifier];
-    cell.selectionStyle = UITableViewCellSelectionStyleNone;
-    UISwitch *switchView = [[UISwitch alloc] initWithFrame:CGRectZero];
-    switchView.tag = indexPath.row;
-    [switchView addTarget:self
-                   action:@selector(audioSettingSwitchChanged:)
-         forControlEvents:UIControlEventValueChanged];
-    cell.accessoryView = switchView;
-  }
-
-  cell.textLabel.text = [self labelForAudioSettingAtIndexPathRow:indexPath.row];
-  UISwitch *switchView = (UISwitch *)cell.accessoryView;
-  switchView.on = [self valueForAudioSettingAtIndexPathRow:indexPath.row];
-
-  return cell;
-}
-
-- (NSString *)labelForAudioSettingAtIndexPathRow:(NSInteger)setting {
-  switch (setting) {
-    case ARDAudioSettingsAudioOnly:
-      return @"Audio only";
-    case ARDAudioSettingsCreateAecDump:
-      return @"Create AecDump";
-    case ARDAudioSettingsUseLevelController:
-      return @"Use level controller";
-    case ARDAudioSettingsUseManualAudioConfig:
-      return @"Use manual audio config";
-    default:
-      return @"";
-  }
-}
-
-- (BOOL)valueForAudioSettingAtIndexPathRow:(NSInteger)setting {
-  switch (setting) {
-    case ARDAudioSettingsAudioOnly:
-      return [_settingsModel currentAudioOnlySettingFromStore];
-    case ARDAudioSettingsCreateAecDump:
-      return [_settingsModel currentCreateAecDumpSettingFromStore];
-    case ARDAudioSettingsUseLevelController:
-      return [_settingsModel currentUseLevelControllerSettingFromStore];
-    case ARDAudioSettingsUseManualAudioConfig:
-      return [_settingsModel currentUseManualAudioConfigSettingFromStore];
-    default:
-      return NO;
-  }
-}
-
-- (void)audioSettingSwitchChanged:(UISwitch *)sender {
-  switch (sender.tag) {
-    case ARDAudioSettingsAudioOnly: {
-      [_settingsModel storeAudioOnlySetting:sender.isOn];
-      break;
-    }
-    case ARDAudioSettingsCreateAecDump: {
-      [_settingsModel storeCreateAecDumpSetting:sender.isOn];
-      break;
-    }
-    case ARDAudioSettingsUseLevelController: {
-      [_settingsModel storeUseLevelControllerSetting:sender.isOn];
-      break;
-    }
-    case ARDAudioSettingsUseManualAudioConfig: {
-      [_settingsModel storeUseManualAudioConfigSetting:sender.isOn];
-      break;
-    }
-    default:
-      break;
-  }
-}
-
-@end
-NS_ASSUME_NONNULL_END
diff --git a/examples/objc/AppRTCMobile/ios/ARDStatsView.h b/examples/objc/AppRTCMobile/ios/ARDStatsView.h
deleted file mode 100644
index 9c86364..0000000
--- a/examples/objc/AppRTCMobile/ios/ARDStatsView.h
+++ /dev/null
@@ -1,17 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-#import <UIKit/UIKit.h>
-
-@interface ARDStatsView : UIView
-
-- (void)setStats:(NSArray *)stats;
-
-@end
diff --git a/examples/objc/AppRTCMobile/ios/ARDStatsView.m b/examples/objc/AppRTCMobile/ios/ARDStatsView.m
deleted file mode 100644
index 39067e0..0000000
--- a/examples/objc/AppRTCMobile/ios/ARDStatsView.m
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-#import "ARDStatsView.h"
-
-#import "WebRTC/RTCLegacyStatsReport.h"
-
-#import "ARDStatsBuilder.h"
-
-@implementation ARDStatsView {
-  UILabel *_statsLabel;
-  ARDStatsBuilder *_statsBuilder;
-}
-
-- (instancetype)initWithFrame:(CGRect)frame {
-  if (self = [super initWithFrame:frame]) {
-    _statsLabel = [[UILabel alloc] initWithFrame:CGRectZero];
-    _statsLabel.numberOfLines = 0;
-    _statsLabel.font = [UIFont fontWithName:@"Roboto" size:12];
-    _statsLabel.adjustsFontSizeToFitWidth = YES;
-    _statsLabel.minimumScaleFactor = 0.6;
-    _statsLabel.textColor = [UIColor greenColor];
-    [self addSubview:_statsLabel];
-    self.backgroundColor = [UIColor colorWithWhite:0 alpha:.6];
-    _statsBuilder = [[ARDStatsBuilder alloc] init];
-  }
-  return self;
-}
-
-- (void)setStats:(NSArray *)stats {
-  for (RTCLegacyStatsReport *report in stats) {
-    [_statsBuilder parseStatsReport:report];
-  }
-  _statsLabel.text = _statsBuilder.statsString;
-}
-
-- (void)layoutSubviews {
-  _statsLabel.frame = self.bounds;
-}
-
-- (CGSize)sizeThatFits:(CGSize)size {
-  return [_statsLabel sizeThatFits:size];
-}
-
-@end
diff --git a/examples/objc/AppRTCMobile/ios/ARDVideoCallView.h b/examples/objc/AppRTCMobile/ios/ARDVideoCallView.h
deleted file mode 100644
index d76805f..0000000
--- a/examples/objc/AppRTCMobile/ios/ARDVideoCallView.h
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-#import <UIKit/UIKit.h>
-
-#import <WebRTC/RTCCameraPreviewView.h>
-#import <WebRTC/RTCVideoRenderer.h>
-
-#import "ARDStatsView.h"
-
-@class ARDVideoCallView;
-@protocol ARDVideoCallViewDelegate <NSObject>
-
-// Called when the camera switch button is pressed.
-- (void)videoCallViewDidSwitchCamera:(ARDVideoCallView *)view;
-
-// Called when the route change button is pressed.
-- (void)videoCallViewDidChangeRoute:(ARDVideoCallView *)view;
-
-// Called when the hangup button is pressed.
-- (void)videoCallViewDidHangup:(ARDVideoCallView *)view;
-
-// Called when stats are enabled by triple tapping.
-- (void)videoCallViewDidEnableStats:(ARDVideoCallView *)view;
-
-@end
-
-// Video call view that shows local and remote video, provides a label to
-// display status, and also a hangup button.
-@interface ARDVideoCallView : UIView
-
-@property(nonatomic, readonly) UILabel *statusLabel;
-@property(nonatomic, readonly) RTCCameraPreviewView *localVideoView;
-@property(nonatomic, readonly) __kindof UIView<RTCVideoRenderer> *remoteVideoView;
-@property(nonatomic, readonly) ARDStatsView *statsView;
-@property(nonatomic, weak) id<ARDVideoCallViewDelegate> delegate;
-
-@end
diff --git a/examples/objc/AppRTCMobile/ios/ARDVideoCallView.m b/examples/objc/AppRTCMobile/ios/ARDVideoCallView.m
deleted file mode 100644
index 2241930..0000000
--- a/examples/objc/AppRTCMobile/ios/ARDVideoCallView.m
+++ /dev/null
@@ -1,203 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-#import "ARDVideoCallView.h"
-
-#import <AVFoundation/AVFoundation.h>
-
-#import <WebRTC/RTCEAGLVideoView.h>
-#import <WebRTC/RTCMTLVideoView.h>
-
-#import "UIImage+ARDUtilities.h"
-
-static CGFloat const kButtonPadding = 16;
-static CGFloat const kButtonSize = 48;
-static CGFloat const kLocalVideoViewSize = 120;
-static CGFloat const kLocalVideoViewPadding = 8;
-static CGFloat const kStatusBarHeight = 20;
-
-@interface ARDVideoCallView () <RTCEAGLVideoViewDelegate>
-@end
-
-@implementation ARDVideoCallView {
-  UIButton *_routeChangeButton;
-  UIButton *_cameraSwitchButton;
-  UIButton *_hangupButton;
-  CGSize _remoteVideoSize;
-}
-
-@synthesize statusLabel = _statusLabel;
-@synthesize localVideoView = _localVideoView;
-@synthesize remoteVideoView = _remoteVideoView;
-@synthesize statsView = _statsView;
-@synthesize delegate = _delegate;
-
-- (instancetype)initWithFrame:(CGRect)frame {
-  if (self = [super initWithFrame:frame]) {
-
-#if defined(RTC_SUPPORTS_METAL)
-    _remoteVideoView = [[RTCMTLVideoView alloc] initWithFrame:CGRectZero];
-#else
-    RTCEAGLVideoView *remoteView = [[RTCEAGLVideoView alloc] initWithFrame:CGRectZero];
-    remoteView.delegate = self;
-    _remoteVideoView = remoteView;
-#endif
-
-    [self addSubview:_remoteVideoView];
-
-    _localVideoView = [[RTCCameraPreviewView alloc] initWithFrame:CGRectZero];
-    [self addSubview:_localVideoView];
-
-    _statsView = [[ARDStatsView alloc] initWithFrame:CGRectZero];
-    _statsView.hidden = YES;
-    [self addSubview:_statsView];
-
-    _routeChangeButton = [UIButton buttonWithType:UIButtonTypeCustom];
-    _routeChangeButton.backgroundColor = [UIColor whiteColor];
-    _routeChangeButton.layer.cornerRadius = kButtonSize / 2;
-    _routeChangeButton.layer.masksToBounds = YES;
-    UIImage *image = [UIImage imageNamed:@"ic_surround_sound_black_24dp.png"];
-    [_routeChangeButton setImage:image forState:UIControlStateNormal];
-    [_routeChangeButton addTarget:self
-                           action:@selector(onRouteChange:)
-                 forControlEvents:UIControlEventTouchUpInside];
-    [self addSubview:_routeChangeButton];
-
-    // TODO(tkchin): don't display this if we can't actually do camera switch.
-    _cameraSwitchButton = [UIButton buttonWithType:UIButtonTypeCustom];
-    _cameraSwitchButton.backgroundColor = [UIColor whiteColor];
-    _cameraSwitchButton.layer.cornerRadius = kButtonSize / 2;
-    _cameraSwitchButton.layer.masksToBounds = YES;
-    image = [UIImage imageNamed:@"ic_switch_video_black_24dp.png"];
-    [_cameraSwitchButton setImage:image forState:UIControlStateNormal];
-    [_cameraSwitchButton addTarget:self
-                      action:@selector(onCameraSwitch:)
-            forControlEvents:UIControlEventTouchUpInside];
-    [self addSubview:_cameraSwitchButton];
-
-    _hangupButton = [UIButton buttonWithType:UIButtonTypeCustom];
-    _hangupButton.backgroundColor = [UIColor redColor];
-    _hangupButton.layer.cornerRadius = kButtonSize / 2;
-    _hangupButton.layer.masksToBounds = YES;
-    image = [UIImage imageForName:@"ic_call_end_black_24dp.png"
-                            color:[UIColor whiteColor]];
-    [_hangupButton setImage:image forState:UIControlStateNormal];
-    [_hangupButton addTarget:self
-                      action:@selector(onHangup:)
-            forControlEvents:UIControlEventTouchUpInside];
-    [self addSubview:_hangupButton];
-
-    _statusLabel = [[UILabel alloc] initWithFrame:CGRectZero];
-    _statusLabel.font = [UIFont fontWithName:@"Roboto" size:16];
-    _statusLabel.textColor = [UIColor whiteColor];
-    [self addSubview:_statusLabel];
-
-    UITapGestureRecognizer *tapRecognizer =
-        [[UITapGestureRecognizer alloc]
-            initWithTarget:self
-                    action:@selector(didTripleTap:)];
-    tapRecognizer.numberOfTapsRequired = 3;
-    [self addGestureRecognizer:tapRecognizer];
-  }
-  return self;
-}
-
-- (void)layoutSubviews {
-  CGRect bounds = self.bounds;
-  if (_remoteVideoSize.width > 0 && _remoteVideoSize.height > 0) {
-    // Aspect fill remote video into bounds.
-    CGRect remoteVideoFrame =
-        AVMakeRectWithAspectRatioInsideRect(_remoteVideoSize, bounds);
-    CGFloat scale = 1;
-    if (remoteVideoFrame.size.width > remoteVideoFrame.size.height) {
-      // Scale by height.
-      scale = bounds.size.height / remoteVideoFrame.size.height;
-    } else {
-      // Scale by width.
-      scale = bounds.size.width / remoteVideoFrame.size.width;
-    }
-    remoteVideoFrame.size.height *= scale;
-    remoteVideoFrame.size.width *= scale;
-    _remoteVideoView.frame = remoteVideoFrame;
-    _remoteVideoView.center =
-        CGPointMake(CGRectGetMidX(bounds), CGRectGetMidY(bounds));
-  } else {
-    _remoteVideoView.frame = bounds;
-  }
-
-  // Aspect fit local video view into a square box.
-  CGRect localVideoFrame =
-      CGRectMake(0, 0, kLocalVideoViewSize, kLocalVideoViewSize);
-  // Place the view in the bottom right.
-  localVideoFrame.origin.x = CGRectGetMaxX(bounds)
-      - localVideoFrame.size.width - kLocalVideoViewPadding;
-  localVideoFrame.origin.y = CGRectGetMaxY(bounds)
-      - localVideoFrame.size.height - kLocalVideoViewPadding;
-  _localVideoView.frame = localVideoFrame;
-
-  // Place stats at the top.
-  CGSize statsSize = [_statsView sizeThatFits:bounds.size];
-  _statsView.frame = CGRectMake(CGRectGetMinX(bounds),
-                                CGRectGetMinY(bounds) + kStatusBarHeight,
-                                statsSize.width, statsSize.height);
-
-  // Place hangup button in the bottom left.
-  _hangupButton.frame =
-      CGRectMake(CGRectGetMinX(bounds) + kButtonPadding,
-                 CGRectGetMaxY(bounds) - kButtonPadding -
-                     kButtonSize,
-                 kButtonSize,
-                 kButtonSize);
-
-  // Place button to the right of hangup button.
-  CGRect cameraSwitchFrame = _hangupButton.frame;
-  cameraSwitchFrame.origin.x =
-      CGRectGetMaxX(cameraSwitchFrame) + kButtonPadding;
-  _cameraSwitchButton.frame = cameraSwitchFrame;
-
-  // Place route button to the right of camera button.
-  CGRect routeChangeFrame = _cameraSwitchButton.frame;
-  routeChangeFrame.origin.x =
-      CGRectGetMaxX(routeChangeFrame) + kButtonPadding;
-  _routeChangeButton.frame = routeChangeFrame;
-
-  [_statusLabel sizeToFit];
-  _statusLabel.center =
-      CGPointMake(CGRectGetMidX(bounds), CGRectGetMidY(bounds));
-}
-
-#pragma mark - RTCEAGLVideoViewDelegate
-
-- (void)videoView:(RTCEAGLVideoView*)videoView didChangeVideoSize:(CGSize)size {
- if (videoView == _remoteVideoView) {
-    _remoteVideoSize = size;
-  }
-  [self setNeedsLayout];
-}
-
-#pragma mark - Private
-
-- (void)onCameraSwitch:(id)sender {
-  [_delegate videoCallViewDidSwitchCamera:self];
-}
-
-- (void)onRouteChange:(id)sender {
-  [_delegate videoCallViewDidChangeRoute:self];
-}
-
-- (void)onHangup:(id)sender {
-  [_delegate videoCallViewDidHangup:self];
-}
-
-- (void)didTripleTap:(UITapGestureRecognizer *)recognizer {
-  [_delegate videoCallViewDidEnableStats:self];
-}
-
-@end
diff --git a/examples/objc/AppRTCMobile/ios/ARDVideoCallViewController.h b/examples/objc/AppRTCMobile/ios/ARDVideoCallViewController.h
deleted file mode 100644
index bdb8747..0000000
--- a/examples/objc/AppRTCMobile/ios/ARDVideoCallViewController.h
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-#import <UIKit/UIKit.h>
-
-@class ARDVideoCallViewController;
-@protocol ARDVideoCallViewControllerDelegate <NSObject>
-
-- (void)viewControllerDidFinish:(ARDVideoCallViewController *)viewController;
-
-@end
-
-@interface ARDVideoCallViewController : UIViewController
-
-@property(nonatomic, weak) id<ARDVideoCallViewControllerDelegate> delegate;
-
-- (instancetype)initForRoom:(NSString *)room
-                 isLoopback:(BOOL)isLoopback
-                   delegate:(id<ARDVideoCallViewControllerDelegate>)delegate;
-
-@end
diff --git a/examples/objc/AppRTCMobile/ios/ARDVideoCallViewController.m b/examples/objc/AppRTCMobile/ios/ARDVideoCallViewController.m
deleted file mode 100644
index ad5bc80..0000000
--- a/examples/objc/AppRTCMobile/ios/ARDVideoCallViewController.m
+++ /dev/null
@@ -1,224 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-#import "ARDVideoCallViewController.h"
-
-#import "WebRTC/RTCAudioSession.h"
-
-#import "ARDAppClient.h"
-#import "ARDCaptureController.h"
-#import "ARDSettingsModel.h"
-#import "ARDVideoCallView.h"
-#import "WebRTC/RTCAVFoundationVideoSource.h"
-#import "WebRTC/RTCDispatcher.h"
-#import "WebRTC/RTCLogging.h"
-#import "WebRTC/RTCMediaConstraints.h"
-
-@interface ARDVideoCallViewController () <ARDAppClientDelegate,
-                                          ARDVideoCallViewDelegate,
-                                          RTCAudioSessionDelegate>
-@property(nonatomic, strong) RTCVideoTrack *remoteVideoTrack;
-@property(nonatomic, readonly) ARDVideoCallView *videoCallView;
-@end
-
-@implementation ARDVideoCallViewController {
-  ARDAppClient *_client;
-  RTCVideoTrack *_remoteVideoTrack;
-  ARDCaptureController *_captureController;
-  AVAudioSessionPortOverride _portOverride;
-}
-
-@synthesize videoCallView = _videoCallView;
-@synthesize remoteVideoTrack = _remoteVideoTrack;
-@synthesize delegate = _delegate;
-
-- (instancetype)initForRoom:(NSString *)room
-                 isLoopback:(BOOL)isLoopback
-                   delegate:(id<ARDVideoCallViewControllerDelegate>)delegate {
-  if (self = [super init]) {
-    ARDSettingsModel *settingsModel = [[ARDSettingsModel alloc] init];
-    _delegate = delegate;
-
-    _client = [[ARDAppClient alloc] initWithDelegate:self];
-    [_client connectToRoomWithId:room settings:settingsModel isLoopback:isLoopback];
-  }
-  return self;
-}
-
-- (void)loadView {
-  _videoCallView = [[ARDVideoCallView alloc] initWithFrame:CGRectZero];
-  _videoCallView.delegate = self;
-  _videoCallView.statusLabel.text =
-      [self statusTextForState:RTCIceConnectionStateNew];
-  self.view = _videoCallView;
-
-  RTCAudioSession *session = [RTCAudioSession sharedInstance];
-  [session addDelegate:self];
-}
-
-#pragma mark - ARDAppClientDelegate
-
-- (void)appClient:(ARDAppClient *)client
-    didChangeState:(ARDAppClientState)state {
-  switch (state) {
-    case kARDAppClientStateConnected:
-      RTCLog(@"Client connected.");
-      break;
-    case kARDAppClientStateConnecting:
-      RTCLog(@"Client connecting.");
-      break;
-    case kARDAppClientStateDisconnected:
-      RTCLog(@"Client disconnected.");
-      [self hangup];
-      break;
-  }
-}
-
-- (void)appClient:(ARDAppClient *)client
-    didChangeConnectionState:(RTCIceConnectionState)state {
-  RTCLog(@"ICE state changed: %ld", (long)state);
-  __weak ARDVideoCallViewController *weakSelf = self;
-  dispatch_async(dispatch_get_main_queue(), ^{
-    ARDVideoCallViewController *strongSelf = weakSelf;
-    strongSelf.videoCallView.statusLabel.text =
-        [strongSelf statusTextForState:state];
-  });
-}
-
-- (void)appClient:(ARDAppClient *)client
-    didCreateLocalCapturer:(RTCCameraVideoCapturer *)localCapturer {
-  _videoCallView.localVideoView.captureSession = localCapturer.captureSession;
-  ARDSettingsModel *settingsModel = [[ARDSettingsModel alloc] init];
-  _captureController =
-      [[ARDCaptureController alloc] initWithCapturer:localCapturer settings:settingsModel];
-  [_captureController startCapture];
-}
-
-- (void)appClient:(ARDAppClient *)client
-    didReceiveLocalVideoTrack:(RTCVideoTrack *)localVideoTrack {
-}
-
-- (void)appClient:(ARDAppClient *)client
-    didReceiveRemoteVideoTrack:(RTCVideoTrack *)remoteVideoTrack {
-  self.remoteVideoTrack = remoteVideoTrack;
-  _videoCallView.statusLabel.hidden = YES;
-}
-
-- (void)appClient:(ARDAppClient *)client
-      didGetStats:(NSArray *)stats {
-  _videoCallView.statsView.stats = stats;
-  [_videoCallView setNeedsLayout];
-}
-
-- (void)appClient:(ARDAppClient *)client
-         didError:(NSError *)error {
-  NSString *message =
-      [NSString stringWithFormat:@"%@", error.localizedDescription];
-  [self hangup];
-  [self showAlertWithMessage:message];
-}
-
-#pragma mark - ARDVideoCallViewDelegate
-
-- (void)videoCallViewDidHangup:(ARDVideoCallView *)view {
-  [self hangup];
-}
-
-- (void)videoCallViewDidSwitchCamera:(ARDVideoCallView *)view {
-  // TODO(tkchin): Rate limit this so you can't tap continously on it.
-  // Probably through an animation.
-  [_captureController switchCamera];
-}
-
-- (void)videoCallViewDidChangeRoute:(ARDVideoCallView *)view {
-  AVAudioSessionPortOverride override = AVAudioSessionPortOverrideNone;
-  if (_portOverride == AVAudioSessionPortOverrideNone) {
-    override = AVAudioSessionPortOverrideSpeaker;
-  }
-  [RTCDispatcher dispatchAsyncOnType:RTCDispatcherTypeAudioSession
-                               block:^{
-    RTCAudioSession *session = [RTCAudioSession sharedInstance];
-    [session lockForConfiguration];
-    NSError *error = nil;
-    if ([session overrideOutputAudioPort:override error:&error]) {
-      _portOverride = override;
-    } else {
-      RTCLogError(@"Error overriding output port: %@",
-                  error.localizedDescription);
-    }
-    [session unlockForConfiguration];
-  }];
-}
-
-- (void)videoCallViewDidEnableStats:(ARDVideoCallView *)view {
-  _client.shouldGetStats = YES;
-  _videoCallView.statsView.hidden = NO;
-}
-
-#pragma mark - RTCAudioSessionDelegate
-
-- (void)audioSession:(RTCAudioSession *)audioSession
-    didDetectPlayoutGlitch:(int64_t)totalNumberOfGlitches {
-  RTCLog(@"Audio session detected glitch, total: %lld", totalNumberOfGlitches);
-}
-
-#pragma mark - Private
-
-- (void)setRemoteVideoTrack:(RTCVideoTrack *)remoteVideoTrack {
-  if (_remoteVideoTrack == remoteVideoTrack) {
-    return;
-  }
-  [_remoteVideoTrack removeRenderer:_videoCallView.remoteVideoView];
-  _remoteVideoTrack = nil;
-  [_videoCallView.remoteVideoView renderFrame:nil];
-  _remoteVideoTrack = remoteVideoTrack;
-  [_remoteVideoTrack addRenderer:_videoCallView.remoteVideoView];
-}
-
-- (void)hangup {
-  self.remoteVideoTrack = nil;
-  _videoCallView.localVideoView.captureSession = nil;
-  [_captureController stopCapture];
-  _captureController = nil;
-  [_client disconnect];
-  [_delegate viewControllerDidFinish:self];
-}
-
-- (NSString *)statusTextForState:(RTCIceConnectionState)state {
-  switch (state) {
-    case RTCIceConnectionStateNew:
-    case RTCIceConnectionStateChecking:
-      return @"Connecting...";
-    case RTCIceConnectionStateConnected:
-    case RTCIceConnectionStateCompleted:
-    case RTCIceConnectionStateFailed:
-    case RTCIceConnectionStateDisconnected:
-    case RTCIceConnectionStateClosed:
-    case RTCIceConnectionStateCount:
-      return nil;
-  }
-}
-
-- (void)showAlertWithMessage:(NSString*)message {
-  UIAlertController *alert =
-      [UIAlertController alertControllerWithTitle:nil
-                                          message:message
-                                   preferredStyle:UIAlertControllerStyleAlert];
-
-  UIAlertAction *defaultAction = [UIAlertAction actionWithTitle:@"OK"
-                                                          style:UIAlertActionStyleDefault
-                                                        handler:^(UIAlertAction *action){
-                                                        }];
-
-  [alert addAction:defaultAction];
-  [self presentViewController:alert animated:YES completion:nil];
-}
-
-@end
diff --git a/examples/objc/AppRTCMobile/ios/AppRTCMobile-Prefix.pch b/examples/objc/AppRTCMobile/ios/AppRTCMobile-Prefix.pch
deleted file mode 100644
index ca0db90..0000000
--- a/examples/objc/AppRTCMobile/ios/AppRTCMobile-Prefix.pch
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- *  Copyright 2013 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.
- */
-
-//
-// Prefix header for all source files of the 'AppRTCMobile' target in the
-// 'AppRTCMobile' project
-//
-
-#import <Availability.h>
-
-#if __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_6_0
-#warning "This project uses features only available in iOS SDK 6.0 and later."
-#endif
-
-#import <Foundation/Foundation.h>
-#import <UIKit/UIKit.h>
diff --git a/examples/objc/AppRTCMobile/ios/Info.plist b/examples/objc/AppRTCMobile/ios/Info.plist
deleted file mode 100644
index 2b382c4..0000000
--- a/examples/objc/AppRTCMobile/ios/Info.plist
+++ /dev/null
@@ -1,104 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
-  <key>BuildMachineOSBuild</key>
-  <string>12E55</string>
-  <key>CFBundleDevelopmentRegion</key>
-  <string>en</string>
-  <key>CFBundleDisplayName</key>
-  <string>AppRTCMobile</string>
-  <key>CFBundleExecutable</key>
-  <string>${EXECUTABLE_NAME}</string>
-  <key>CFBundleIcons</key>
-  <dict>
-    <key>CFBundlePrimaryIcon</key>
-    <dict>
-      <key>CFBundleIconFiles</key>
-      <array>
-        <string>Icon.png</string>
-        <string>Icon-120.png</string>
-        <string>Icon-180.png</string>
-      </array>
-    </dict>
-  </dict>
-  <key>CFBundleIdentifier</key>
-  <string>com.google.AppRTCMobile</string>
-  <key>CFBundleInfoDictionaryVersion</key>
-  <string>6.0</string>
-  <key>CFBundleName</key>
-  <string>${EXECUTABLE_NAME}</string>
-  <key>CFBundlePackageType</key>
-  <string>APPL</string>
-  <key>CFBundleShortVersionString</key>
-  <string>1.0</string>
-  <key>CFBundleSignature</key>
-  <string>????</string>
-  <key>CFBundleSupportedPlatforms</key>
-  <array>
-    <string>iPhoneOS</string>
-  </array>
-  <key>CFBundleVersion</key>
-  <string>1.0</string>
-  <key>UIStatusBarTintParameters</key>
-  <dict>
-    <key>UINavigationBar</key>
-    <dict>
-      <key>Style</key>
-      <string>UIBarStyleDefault</string>
-      <key>Translucent</key>
-      <false/>
-    </dict>
-  </dict>
-  <key>UISupportedInterfaceOrientations</key>
-  <array>
-    <string>UIInterfaceOrientationPortrait</string>
-  </array>
-  <key>UIAppFonts</key>
-  <array>
-    <string>Roboto-Regular.ttf</string>
-  </array>
-  <key>UIBackgroundModes</key>
-  <array>
-    <string>audio</string>
-    <string>voip</string>
-  </array>
-  <key>NSCameraUsageDescription</key>
-  <string>Camera access needed for video calling</string>
-  <key>NSMicrophoneUsageDescription</key>
-  <string>Microphone access needed for video calling</string>
-  <key>UILaunchImages</key>
-  <array>
-    <dict>
-      <key>UILaunchImageMinimumOSVersion</key>
-      <string>7.0</string>
-      <key>UILaunchImageName</key>
-      <string>iPhone5</string>
-      <key>UILaunchImageOrientation</key>
-      <string>Portrait</string>
-      <key>UILaunchImageSize</key>
-      <string>{320, 568}</string>
-    </dict>
-    <dict>
-      <key>UILaunchImageMinimumOSVersion</key>
-      <string>8.0</string>
-      <key>UILaunchImageName</key>
-      <string>iPhone6</string>
-      <key>UILaunchImageOrientation</key>
-      <string>Portrait</string>
-      <key>UILaunchImageSize</key>
-      <string>{375, 667}</string>
-    </dict>
-    <dict>
-      <key>UILaunchImageMinimumOSVersion</key>
-      <string>8.0</string>
-      <key>UILaunchImageName</key>
-      <string>iPhone6p</string>
-      <key>UILaunchImageOrientation</key>
-      <string>Portrait</string>
-      <key>UILaunchImageSize</key>
-      <string>{414, 736}</string>
-    </dict>
-  </array>
-</dict>
-</plist>
diff --git a/examples/objc/AppRTCMobile/ios/UIImage+ARDUtilities.h b/examples/objc/AppRTCMobile/ios/UIImage+ARDUtilities.h
deleted file mode 100644
index d56ba02..0000000
--- a/examples/objc/AppRTCMobile/ios/UIImage+ARDUtilities.h
+++ /dev/null
@@ -1,18 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-#import <UIKit/UIKit.h>
-
-@interface UIImage (ARDUtilities)
-
-// Returns an color tinted version for the given image resource.
-+ (UIImage *)imageForName:(NSString *)name color:(UIColor *)color;
-
-@end
diff --git a/examples/objc/AppRTCMobile/ios/UIImage+ARDUtilities.m b/examples/objc/AppRTCMobile/ios/UIImage+ARDUtilities.m
deleted file mode 100644
index 1bbe8c3..0000000
--- a/examples/objc/AppRTCMobile/ios/UIImage+ARDUtilities.m
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-#import "UIImage+ARDUtilities.h"
-
-@implementation UIImage (ARDUtilities)
-
-+ (UIImage *)imageForName:(NSString *)name color:(UIColor *)color {
-  UIImage *image = [UIImage imageNamed:name];
-  if (!image) {
-    return nil;
-  }
-  UIGraphicsBeginImageContextWithOptions(image.size, NO, 0.0f);
-  [color setFill];
-  CGRect bounds = CGRectMake(0, 0, image.size.width, image.size.height);
-  UIRectFill(bounds);
-  [image drawInRect:bounds blendMode:kCGBlendModeDestinationIn alpha:1.0f];
-  UIImage *coloredImage = UIGraphicsGetImageFromCurrentImageContext();
-  UIGraphicsEndImageContext();
-
-  return coloredImage;
-}
-
-@end
diff --git a/examples/objc/AppRTCMobile/ios/main.m b/examples/objc/AppRTCMobile/ios/main.m
deleted file mode 100644
index 00b83f7..0000000
--- a/examples/objc/AppRTCMobile/ios/main.m
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- *  Copyright 2013 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.
- */
-
-#import <UIKit/UIKit.h>
-
-#import "ARDAppDelegate.h"
-
-int main(int argc, char* argv[]) {
-  @autoreleasepool {
-    return UIApplicationMain(
-        argc, argv, nil, NSStringFromClass([ARDAppDelegate class]));
-  }
-}
diff --git a/examples/objc/AppRTCMobile/ios/resources/Roboto-Regular.ttf b/examples/objc/AppRTCMobile/ios/resources/Roboto-Regular.ttf
deleted file mode 100644
index 0e58508..0000000
--- a/examples/objc/AppRTCMobile/ios/resources/Roboto-Regular.ttf
+++ /dev/null
Binary files differ
diff --git a/examples/objc/AppRTCMobile/ios/resources/iPhone5@2x.png b/examples/objc/AppRTCMobile/ios/resources/iPhone5@2x.png
deleted file mode 100644
index 9d005fd..0000000
--- a/examples/objc/AppRTCMobile/ios/resources/iPhone5@2x.png
+++ /dev/null
Binary files differ
diff --git a/examples/objc/AppRTCMobile/ios/resources/iPhone6@2x.png b/examples/objc/AppRTCMobile/ios/resources/iPhone6@2x.png
deleted file mode 100644
index fce3eb9..0000000
--- a/examples/objc/AppRTCMobile/ios/resources/iPhone6@2x.png
+++ /dev/null
Binary files differ
diff --git a/examples/objc/AppRTCMobile/ios/resources/iPhone6p@3x.png b/examples/objc/AppRTCMobile/ios/resources/iPhone6p@3x.png
deleted file mode 100644
index aee20c2..0000000
--- a/examples/objc/AppRTCMobile/ios/resources/iPhone6p@3x.png
+++ /dev/null
Binary files differ
diff --git a/examples/objc/AppRTCMobile/ios/resources/ic_call_end_black_24dp.png b/examples/objc/AppRTCMobile/ios/resources/ic_call_end_black_24dp.png
deleted file mode 100644
index 531cb0f..0000000
--- a/examples/objc/AppRTCMobile/ios/resources/ic_call_end_black_24dp.png
+++ /dev/null
Binary files differ
diff --git a/examples/objc/AppRTCMobile/ios/resources/ic_call_end_black_24dp@2x.png b/examples/objc/AppRTCMobile/ios/resources/ic_call_end_black_24dp@2x.png
deleted file mode 100644
index 03dd381..0000000
--- a/examples/objc/AppRTCMobile/ios/resources/ic_call_end_black_24dp@2x.png
+++ /dev/null
Binary files differ
diff --git a/examples/objc/AppRTCMobile/ios/resources/ic_clear_black_24dp.png b/examples/objc/AppRTCMobile/ios/resources/ic_clear_black_24dp.png
deleted file mode 100644
index 4ebf8a2..0000000
--- a/examples/objc/AppRTCMobile/ios/resources/ic_clear_black_24dp.png
+++ /dev/null
Binary files differ
diff --git a/examples/objc/AppRTCMobile/ios/resources/ic_clear_black_24dp@2x.png b/examples/objc/AppRTCMobile/ios/resources/ic_clear_black_24dp@2x.png
deleted file mode 100644
index ed2b252..0000000
--- a/examples/objc/AppRTCMobile/ios/resources/ic_clear_black_24dp@2x.png
+++ /dev/null
Binary files differ
diff --git a/examples/objc/AppRTCMobile/ios/resources/ic_settings_black_24dp.png b/examples/objc/AppRTCMobile/ios/resources/ic_settings_black_24dp.png
deleted file mode 100644
index c59419c..0000000
--- a/examples/objc/AppRTCMobile/ios/resources/ic_settings_black_24dp.png
+++ /dev/null
Binary files differ
diff --git a/examples/objc/AppRTCMobile/ios/resources/ic_settings_black_24dp@2x.png b/examples/objc/AppRTCMobile/ios/resources/ic_settings_black_24dp@2x.png
deleted file mode 100644
index e84e188..0000000
--- a/examples/objc/AppRTCMobile/ios/resources/ic_settings_black_24dp@2x.png
+++ /dev/null
Binary files differ
diff --git a/examples/objc/AppRTCMobile/ios/resources/ic_surround_sound_black_24dp.png b/examples/objc/AppRTCMobile/ios/resources/ic_surround_sound_black_24dp.png
deleted file mode 100644
index 8f3343d..0000000
--- a/examples/objc/AppRTCMobile/ios/resources/ic_surround_sound_black_24dp.png
+++ /dev/null
Binary files differ
diff --git a/examples/objc/AppRTCMobile/ios/resources/ic_surround_sound_black_24dp@2x.png b/examples/objc/AppRTCMobile/ios/resources/ic_surround_sound_black_24dp@2x.png
deleted file mode 100644
index 7648804..0000000
--- a/examples/objc/AppRTCMobile/ios/resources/ic_surround_sound_black_24dp@2x.png
+++ /dev/null
Binary files differ
diff --git a/examples/objc/AppRTCMobile/ios/resources/ic_switch_video_black_24dp.png b/examples/objc/AppRTCMobile/ios/resources/ic_switch_video_black_24dp.png
deleted file mode 100644
index 85271c8..0000000
--- a/examples/objc/AppRTCMobile/ios/resources/ic_switch_video_black_24dp.png
+++ /dev/null
Binary files differ
diff --git a/examples/objc/AppRTCMobile/ios/resources/ic_switch_video_black_24dp@2x.png b/examples/objc/AppRTCMobile/ios/resources/ic_switch_video_black_24dp@2x.png
deleted file mode 100644
index 62b13a6..0000000
--- a/examples/objc/AppRTCMobile/ios/resources/ic_switch_video_black_24dp@2x.png
+++ /dev/null
Binary files differ
diff --git a/examples/objc/AppRTCMobile/ios/resources/mozart.mp3 b/examples/objc/AppRTCMobile/ios/resources/mozart.mp3
deleted file mode 100644
index 5981ba3..0000000
--- a/examples/objc/AppRTCMobile/ios/resources/mozart.mp3
+++ /dev/null
Binary files differ
diff --git a/examples/objc/AppRTCMobile/mac/APPRTCAppDelegate.h b/examples/objc/AppRTCMobile/mac/APPRTCAppDelegate.h
deleted file mode 100644
index 95f3594..0000000
--- a/examples/objc/AppRTCMobile/mac/APPRTCAppDelegate.h
+++ /dev/null
@@ -1,14 +0,0 @@
-/*
- *  Copyright 2014 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.
- */
-
-#import <Cocoa/Cocoa.h>
-
-@interface APPRTCAppDelegate : NSObject<NSApplicationDelegate>
-@end
diff --git a/examples/objc/AppRTCMobile/mac/APPRTCAppDelegate.m b/examples/objc/AppRTCMobile/mac/APPRTCAppDelegate.m
deleted file mode 100644
index dd3f192..0000000
--- a/examples/objc/AppRTCMobile/mac/APPRTCAppDelegate.m
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- *  Copyright 2014 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.
- */
-
-#import "APPRTCAppDelegate.h"
-#import "APPRTCViewController.h"
-#import "WebRTC/RTCSSLAdapter.h"
-
-@interface APPRTCAppDelegate () <NSWindowDelegate>
-@end
-
-@implementation APPRTCAppDelegate {
-  APPRTCViewController* _viewController;
-  NSWindow* _window;
-}
-
-#pragma mark - NSApplicationDelegate
-
-- (void)applicationDidFinishLaunching:(NSNotification*)notification {
-  RTCInitializeSSL();
-  NSScreen* screen = [NSScreen mainScreen];
-  NSRect visibleRect = [screen visibleFrame];
-  NSRect windowRect = NSMakeRect(NSMidX(visibleRect),
-                                 NSMidY(visibleRect),
-                                 1320,
-                                 1140);
-  NSUInteger styleMask = NSTitledWindowMask | NSClosableWindowMask;
-  _window = [[NSWindow alloc] initWithContentRect:windowRect
-                                        styleMask:styleMask
-                                          backing:NSBackingStoreBuffered
-                                            defer:NO];
-  _window.delegate = self;
-  [_window makeKeyAndOrderFront:self];
-  [_window makeMainWindow];
-  _viewController = [[APPRTCViewController alloc] initWithNibName:nil
-                                                           bundle:nil];
-  [_window setContentView:[_viewController view]];
-}
-
-#pragma mark - NSWindow
-
-- (void)windowWillClose:(NSNotification*)notification {
-  [_viewController windowWillClose:notification];
-  RTCCleanupSSL();
-  [NSApp terminate:self];
-}
-
-@end
-
diff --git a/examples/objc/AppRTCMobile/mac/APPRTCViewController.h b/examples/objc/AppRTCMobile/mac/APPRTCViewController.h
deleted file mode 100644
index 306ecd9..0000000
--- a/examples/objc/AppRTCMobile/mac/APPRTCViewController.h
+++ /dev/null
@@ -1,17 +0,0 @@
-/*
- *  Copyright 2014 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.
- */
-
-#import <AppKit/AppKit.h>
-
-@interface APPRTCViewController : NSViewController
-
-- (void)windowWillClose:(NSNotification*)notification;
-
-@end
diff --git a/examples/objc/AppRTCMobile/mac/APPRTCViewController.m b/examples/objc/AppRTCMobile/mac/APPRTCViewController.m
deleted file mode 100644
index cb82e88..0000000
--- a/examples/objc/AppRTCMobile/mac/APPRTCViewController.m
+++ /dev/null
@@ -1,439 +0,0 @@
-/*
- *  Copyright 2014 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.
- */
-
-#import "APPRTCViewController.h"
-
-#import <AVFoundation/AVFoundation.h>
-
-#import "WebRTC/RTCMTLNSVideoView.h"
-#import "WebRTC/RTCNSGLVideoView.h"
-#import "WebRTC/RTCVideoTrack.h"
-
-#import "ARDAppClient.h"
-#import "ARDCaptureController.h"
-#import "ARDSettingsModel.h"
-
-static NSUInteger const kContentWidth = 900;
-static NSUInteger const kRoomFieldWidth = 200;
-static NSUInteger const kActionItemHeight = 30;
-static NSUInteger const kBottomViewHeight = 200;
-
-@class APPRTCMainView;
-@protocol APPRTCMainViewDelegate
-
-- (void)appRTCMainView:(APPRTCMainView*)mainView
-        didEnterRoomId:(NSString*)roomId
-              loopback:(BOOL)isLoopback;
-
-@end
-
-@interface APPRTCMainView : NSView
-
-@property(nonatomic, weak) id<APPRTCMainViewDelegate> delegate;
-@property(nonatomic, readonly) NSView<RTCVideoRenderer>* localVideoView;
-@property(nonatomic, readonly) NSView<RTCVideoRenderer>* remoteVideoView;
-
-- (void)displayLogMessage:(NSString*)message;
-
-@end
-
-@interface APPRTCMainView () <NSTextFieldDelegate, RTCNSGLVideoViewDelegate>
-@end
-@implementation APPRTCMainView  {
-  NSScrollView* _scrollView;
-  NSView* _actionItemsView;
-  NSButton* _connectButton;
-  NSButton* _loopbackButton;
-  NSTextField* _roomField;
-  NSTextView* _logView;
-  CGSize _localVideoSize;
-  CGSize _remoteVideoSize;
-}
-
-@synthesize delegate = _delegate;
-@synthesize localVideoView = _localVideoView;
-@synthesize remoteVideoView = _remoteVideoView;
-
-
-- (void)displayLogMessage:(NSString *)message {
-  dispatch_async(dispatch_get_main_queue(), ^{
-    _logView.string =
-        [NSString stringWithFormat:@"%@%@\n", _logView.string, message];
-    NSRange range = NSMakeRange(_logView.string.length, 0);
-    [_logView scrollRangeToVisible:range];
-  });
-}
-
-#pragma mark - Private
-
-- (instancetype)initWithFrame:(NSRect)frame {
-  if (self = [super initWithFrame:frame]) {
-    [self setupViews];
-  }
-  return self;
-}
-
-+ (BOOL)requiresConstraintBasedLayout {
-  return YES;
-}
-
-- (void)updateConstraints {
-  NSParameterAssert(
-      _roomField != nil &&
-      _scrollView != nil &&
-      _remoteVideoView != nil &&
-      _localVideoView != nil &&
-      _actionItemsView!= nil &&
-      _connectButton != nil &&
-      _loopbackButton != nil);
-
-  [self removeConstraints:[self constraints]];
-  NSDictionary* viewsDictionary =
-      NSDictionaryOfVariableBindings(_roomField,
-                                     _scrollView,
-                                     _remoteVideoView,
-                                     _localVideoView,
-                                     _actionItemsView,
-                                     _connectButton,
-                                     _loopbackButton);
-
-  NSSize remoteViewSize = [self remoteVideoViewSize];
-  NSDictionary* metrics = @{
-    @"remoteViewWidth" : @(remoteViewSize.width),
-    @"remoteViewHeight" : @(remoteViewSize.height),
-    @"kBottomViewHeight" : @(kBottomViewHeight),
-    @"localViewHeight" : @(remoteViewSize.height / 3),
-    @"localViewWidth" : @(remoteViewSize.width / 3),
-    @"kRoomFieldWidth" : @(kRoomFieldWidth),
-    @"kActionItemHeight" : @(kActionItemHeight)
-  };
-  // Declare this separately to avoid compiler warning about splitting string
-  // within an NSArray expression.
-  NSString* verticalConstraintLeft =
-      @"V:|-[_remoteVideoView(remoteViewHeight)]-[_scrollView(kBottomViewHeight)]-|";
-  NSString* verticalConstraintRight =
-      @"V:|-[_remoteVideoView(remoteViewHeight)]-[_actionItemsView(kBottomViewHeight)]-|";
-  NSArray* constraintFormats = @[
-      verticalConstraintLeft,
-      verticalConstraintRight,
-      @"H:|-[_remoteVideoView(remoteViewWidth)]-|",
-      @"V:|-[_localVideoView(localViewHeight)]",
-      @"H:|-[_localVideoView(localViewWidth)]",
-      @"H:|-[_scrollView(==_actionItemsView)]-[_actionItemsView]-|"
-  ];
-
-  NSArray* actionItemsConstraints = @[
-      @"H:|-[_roomField(kRoomFieldWidth)]-[_loopbackButton(kRoomFieldWidth)]",
-      @"H:|-[_connectButton(kRoomFieldWidth)]",
-      @"V:|-[_roomField(kActionItemHeight)]-[_connectButton(kActionItemHeight)]",
-      @"V:|-[_loopbackButton(kActionItemHeight)]",
-      ];
-
-  [APPRTCMainView addConstraints:constraintFormats
-                          toView:self
-                 viewsDictionary:viewsDictionary
-                         metrics:metrics];
-  [APPRTCMainView addConstraints:actionItemsConstraints
-                          toView:_actionItemsView
-                 viewsDictionary:viewsDictionary
-                         metrics:metrics];
-  [super updateConstraints];
-}
-
-#pragma mark - Constraints helper
-
-+ (void)addConstraints:(NSArray*)constraints toView:(NSView*)view
-       viewsDictionary:(NSDictionary*)viewsDictionary
-               metrics:(NSDictionary*)metrics {
-  for (NSString* constraintFormat in constraints) {
-    NSArray* constraints =
-    [NSLayoutConstraint constraintsWithVisualFormat:constraintFormat
-                                            options:0
-                                            metrics:metrics
-                                              views:viewsDictionary];
-    for (NSLayoutConstraint* constraint in constraints) {
-      [view addConstraint:constraint];
-    }
-  }
-}
-
-#pragma mark - Control actions
-
-- (void)startCall:(id)sender {
-  NSString* roomString = _roomField.stringValue;
-  // Generate room id for loopback options.
-  if (_loopbackButton.intValue && [roomString isEqualToString:@""]) {
-    roomString = [NSUUID UUID].UUIDString;
-    roomString = [roomString stringByReplacingOccurrencesOfString:@"-" withString:@""];
-  }
-  [self.delegate appRTCMainView:self
-                 didEnterRoomId:roomString
-                       loopback:_loopbackButton.intValue];
-  [self setNeedsUpdateConstraints:YES];
-}
-
-#pragma mark - RTCNSGLVideoViewDelegate
-
-- (void)videoView:(RTCNSGLVideoView*)videoView
-    didChangeVideoSize:(NSSize)size {
-  if (videoView == _remoteVideoView) {
-    _remoteVideoSize = size;
-  } else if (videoView == _localVideoView) {
-    _localVideoSize = size;
-  } else {
-    return;
-  }
-
-  [self setNeedsUpdateConstraints:YES];
-}
-
-#pragma mark - Private
-
-- (void)setupViews {
-  NSParameterAssert([[self subviews] count] == 0);
-
-  _logView = [[NSTextView alloc] initWithFrame:NSZeroRect];
-  [_logView setMinSize:NSMakeSize(0, kBottomViewHeight)];
-  [_logView setMaxSize:NSMakeSize(FLT_MAX, FLT_MAX)];
-  [_logView setVerticallyResizable:YES];
-  [_logView setAutoresizingMask:NSViewWidthSizable];
-  NSTextContainer* textContainer = [_logView textContainer];
-  NSSize containerSize = NSMakeSize(kContentWidth, FLT_MAX);
-  [textContainer setContainerSize:containerSize];
-  [textContainer setWidthTracksTextView:YES];
-  [_logView setEditable:NO];
-
-  [self setupActionItemsView];
-
-  _scrollView = [[NSScrollView alloc] initWithFrame:NSZeroRect];
-  [_scrollView setTranslatesAutoresizingMaskIntoConstraints:NO];
-  [_scrollView setHasVerticalScroller:YES];
-  [_scrollView setDocumentView:_logView];
-  [self addSubview:_scrollView];
-
-// NOTE (daniela): Ignoring Clang diagonstic here.
-// We're performing run time check to make sure class is available on runtime.
-// If not we're providing sensible default.
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wpartial-availability"
-  if ([RTCMTLNSVideoView class] && [RTCMTLNSVideoView isMetalAvailable]) {
-    _remoteVideoView = [[RTCMTLNSVideoView alloc] initWithFrame:NSZeroRect];
-    _localVideoView = [[RTCMTLNSVideoView alloc] initWithFrame:NSZeroRect];
-  }
-#pragma clang diagnostic pop
-  if (_remoteVideoView == nil) {
-    NSOpenGLPixelFormatAttribute attributes[] = {
-      NSOpenGLPFADoubleBuffer,
-      NSOpenGLPFADepthSize, 24,
-      NSOpenGLPFAOpenGLProfile,
-      NSOpenGLProfileVersion3_2Core,
-      0
-    };
-    NSOpenGLPixelFormat* pixelFormat =
-    [[NSOpenGLPixelFormat alloc] initWithAttributes:attributes];
-
-    RTCNSGLVideoView* remote =
-        [[RTCNSGLVideoView alloc] initWithFrame:NSZeroRect pixelFormat:pixelFormat];
-    remote.delegate = self;
-    _remoteVideoView = remote;
-
-    RTCNSGLVideoView* local =
-        [[RTCNSGLVideoView alloc] initWithFrame:NSZeroRect pixelFormat:pixelFormat];
-    local.delegate = self;
-    _localVideoView = local;
-  }
-
-  [_remoteVideoView setTranslatesAutoresizingMaskIntoConstraints:NO];
-  [self addSubview:_remoteVideoView];
-  [_localVideoView setTranslatesAutoresizingMaskIntoConstraints:NO];
-  [self addSubview:_localVideoView];
-}
-
-- (void)setupActionItemsView {
-  _actionItemsView = [[NSView alloc] initWithFrame:NSZeroRect];
-  [_actionItemsView setTranslatesAutoresizingMaskIntoConstraints:NO];
-  [self addSubview:_actionItemsView];
-
-  _roomField = [[NSTextField alloc] initWithFrame:NSZeroRect];
-  [_roomField setTranslatesAutoresizingMaskIntoConstraints:NO];
-  [[_roomField cell] setPlaceholderString: @"Enter AppRTC room id"];
-  [_actionItemsView addSubview:_roomField];
-  [_roomField setEditable:YES];
-
-  _connectButton = [[NSButton alloc] initWithFrame:NSZeroRect];
-  [_connectButton setTranslatesAutoresizingMaskIntoConstraints:NO];
-  _connectButton.title = @"Start call";
-  _connectButton.bezelStyle = NSRoundedBezelStyle;
-  _connectButton.target = self;
-  _connectButton.action = @selector(startCall:);
-  [_actionItemsView addSubview:_connectButton];
-
-  _loopbackButton = [[NSButton alloc] initWithFrame:NSZeroRect];
-  [_loopbackButton setTranslatesAutoresizingMaskIntoConstraints:NO];
-  _loopbackButton.title = @"Loopback";
-  [_loopbackButton setButtonType:NSSwitchButton];
-  [_actionItemsView addSubview:_loopbackButton];
-}
-
-- (NSSize)remoteVideoViewSize {
-  if (!_remoteVideoView.bounds.size.width) {
-    return NSMakeSize(kContentWidth, 0);
-  }
-  NSInteger width = MAX(_remoteVideoView.bounds.size.width, kContentWidth);
-  NSInteger height = (width/16) * 9;
-  return NSMakeSize(width, height);
-}
-
-@end
-
-@interface APPRTCViewController ()
-    <ARDAppClientDelegate, APPRTCMainViewDelegate>
-@property(nonatomic, readonly) APPRTCMainView* mainView;
-@end
-
-@implementation APPRTCViewController {
-  ARDAppClient* _client;
-  RTCVideoTrack* _localVideoTrack;
-  RTCVideoTrack* _remoteVideoTrack;
-  ARDCaptureController* _captureController;
-}
-
-- (void)dealloc {
-  [self disconnect];
-}
-
-- (void)viewDidAppear {
-  [super viewDidAppear];
-  [self displayUsageInstructions];
-}
-
-- (void)loadView {
-  APPRTCMainView* view = [[APPRTCMainView alloc] initWithFrame:NSZeroRect];
-  [view setTranslatesAutoresizingMaskIntoConstraints:NO];
-  view.delegate = self;
-  self.view = view;
-}
-
-- (void)windowWillClose:(NSNotification*)notification {
-  [self disconnect];
-}
-
-#pragma mark - Usage
-
-- (void)displayUsageInstructions {
-  [self.mainView displayLogMessage:
-   @"To start call:\n"
-   @"• Enter AppRTC room id (not neccessary for loopback)\n"
-   @"• Start call"];
-}
-
-#pragma mark - ARDAppClientDelegate
-
-- (void)appClient:(ARDAppClient *)client
-    didChangeState:(ARDAppClientState)state {
-  switch (state) {
-    case kARDAppClientStateConnected:
-      [self.mainView displayLogMessage:@"Client connected."];
-      break;
-    case kARDAppClientStateConnecting:
-      [self.mainView displayLogMessage:@"Client connecting."];
-      break;
-    case kARDAppClientStateDisconnected:
-      [self.mainView displayLogMessage:@"Client disconnected."];
-      [self resetUI];
-      _client = nil;
-      break;
-  }
-}
-
-- (void)appClient:(ARDAppClient *)client
-    didChangeConnectionState:(RTCIceConnectionState)state {
-}
-
-- (void)appClient:(ARDAppClient*)client
-    didCreateLocalCapturer:(RTCCameraVideoCapturer*)localCapturer {
-  _captureController =
-      [[ARDCaptureController alloc] initWithCapturer:localCapturer
-                                            settings:[[ARDSettingsModel alloc] init]];
-  [_captureController startCapture];
-}
-
-- (void)appClient:(ARDAppClient *)client
-    didReceiveLocalVideoTrack:(RTCVideoTrack *)localVideoTrack {
-  _localVideoTrack = localVideoTrack;
-  [_localVideoTrack addRenderer:self.mainView.localVideoView];
-}
-
-- (void)appClient:(ARDAppClient *)client
-    didReceiveRemoteVideoTrack:(RTCVideoTrack *)remoteVideoTrack {
-  _remoteVideoTrack = remoteVideoTrack;
-  [_remoteVideoTrack addRenderer:self.mainView.remoteVideoView];
-}
-
-- (void)appClient:(ARDAppClient *)client
-         didError:(NSError *)error {
-  [self showAlertWithMessage:[NSString stringWithFormat:@"%@", error]];
-  [self disconnect];
-}
-
-- (void)appClient:(ARDAppClient *)client
-      didGetStats:(NSArray *)stats {
-}
-
-#pragma mark - APPRTCMainViewDelegate
-
-- (void)appRTCMainView:(APPRTCMainView*)mainView
-        didEnterRoomId:(NSString*)roomId
-              loopback:(BOOL)isLoopback {
-
-  if ([roomId isEqualToString:@""]) {
-    [self.mainView displayLogMessage:@"Missing room id"];
-    return;
-  }
-
-  [self disconnect];
-  ARDAppClient* client = [[ARDAppClient alloc] initWithDelegate:self];
-  [client connectToRoomWithId:roomId
-                     settings:[[ARDSettingsModel alloc] init]  // Use default settings.
-                   isLoopback:isLoopback];
-  _client = client;
-}
-
-#pragma mark - Private
-
-- (APPRTCMainView*)mainView {
-  return (APPRTCMainView*)self.view;
-}
-
-- (void)showAlertWithMessage:(NSString*)message {
-  dispatch_async(dispatch_get_main_queue(), ^{
-    NSAlert* alert = [[NSAlert alloc] init];
-    [alert setMessageText:message];
-    [alert runModal];
-  });
-}
-
-- (void)resetUI {
-  [_remoteVideoTrack removeRenderer:self.mainView.remoteVideoView];
-  [_localVideoTrack removeRenderer:self.mainView.localVideoView];
-  _remoteVideoTrack = nil;
-  _localVideoTrack = nil;
-  [self.mainView.remoteVideoView renderFrame:nil];
-  [self.mainView.localVideoView renderFrame:nil];
-}
-
-- (void)disconnect {
-  [self resetUI];
-  [_captureController stopCapture];
-  _captureController = nil;
-  [_client disconnect];
-}
-
-@end
diff --git a/examples/objc/AppRTCMobile/mac/Info.plist b/examples/objc/AppRTCMobile/mac/Info.plist
deleted file mode 100644
index 4dcb240..0000000
--- a/examples/objc/AppRTCMobile/mac/Info.plist
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<!DOCTYPE plist PUBLIC "-//Apple/DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
-  <key>CFBundleDevelopmentRegion</key>
-  <string>en</string>
-  <key>CFBundleDisplayName</key>
-  <string>${PRODUCT_NAME}</string>
-  <key>CFBundleExecutable</key>
-  <string>${EXECUTABLE_NAME}</string>
-  <key>CFBundleIdentifier</key>
-  <string>com.Google.${PRODUCT_NAME:rfc1034identifier}</string>
-  <key>CFBundleInfoDictionaryVersion</key>
-  <string>6.0</string>
-  <key>CFBundleName</key>
-  <string>${PRODUCT_NAME}</string>
-  <key>CFBundlePackageType</key>
-  <string>APPL</string>
-  <key>CFBundleShortVersionString</key>
-  <string>1.0</string>
-  <key>CFBundleVersion</key>
-  <string>1.0</string>
-  <key>LSMinimumSystemVersion</key>
-  <string>${MACOSX_DEPLOYMENT_TARGET}</string>
-  <key>NSPrincipalClass</key>
-  <string>NSApplication</string>
-</dict>
-</plist>
\ No newline at end of file
diff --git a/examples/objc/AppRTCMobile/mac/main.m b/examples/objc/AppRTCMobile/mac/main.m
deleted file mode 100644
index 79b17f5..0000000
--- a/examples/objc/AppRTCMobile/mac/main.m
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- *  Copyright 2014 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.
- */
-
-#import <AppKit/AppKit.h>
-
-#import "APPRTCAppDelegate.h"
-
-int main(int argc, char* argv[]) {
-  @autoreleasepool {
-    [NSApplication sharedApplication];
-    APPRTCAppDelegate* delegate = [[APPRTCAppDelegate alloc] init];
-    [NSApp setDelegate:delegate];
-    [NSApp run];
-  }
-}
diff --git a/examples/objc/AppRTCMobile/tests/ARDAppClient_xctest.mm b/examples/objc/AppRTCMobile/tests/ARDAppClient_xctest.mm
deleted file mode 100644
index b6b4822..0000000
--- a/examples/objc/AppRTCMobile/tests/ARDAppClient_xctest.mm
+++ /dev/null
@@ -1,265 +0,0 @@
-/*
- *  Copyright 2014 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.
- */
-
-#import <Foundation/Foundation.h>
-#import <OCMock/OCMock.h>
-#import <QuartzCore/CoreAnimation.h>
-#import <XCTest/XCTest.h>
-
-#include "webrtc/rtc_base/ssladapter.h"
-
-#import "WebRTC/RTCMediaConstraints.h"
-#import "WebRTC/RTCPeerConnectionFactory.h"
-
-#import "ARDAppClient+Internal.h"
-#import "ARDJoinResponse+Internal.h"
-#import "ARDMessageResponse+Internal.h"
-#import "ARDSDPUtils.h"
-#import "ARDSettingsModel.h"
-
-@interface ARDAppClientTest : XCTestCase
-@end
-
-@implementation ARDAppClientTest
-
-#pragma mark - Mock helpers
-
-- (id)mockRoomServerClientForRoomId:(NSString *)roomId
-                           clientId:(NSString *)clientId
-                        isInitiator:(BOOL)isInitiator
-                           messages:(NSArray *)messages
-                     messageHandler:
-    (void (^)(ARDSignalingMessage *))messageHandler {
-  id mockRoomServerClient =
-      [OCMockObject mockForProtocol:@protocol(ARDRoomServerClient)];
-
-  // Successful join response.
-  ARDJoinResponse *joinResponse = [[ARDJoinResponse alloc] init];
-  joinResponse.result = kARDJoinResultTypeSuccess;
-  joinResponse.roomId = roomId;
-  joinResponse.clientId = clientId;
-  joinResponse.isInitiator = isInitiator;
-  joinResponse.messages = messages;
-
-  // Successful message response.
-  ARDMessageResponse *messageResponse = [[ARDMessageResponse alloc] init];
-  messageResponse.result = kARDMessageResultTypeSuccess;
-
-  // Return join response from above on join.
-  [[[mockRoomServerClient stub] andDo:^(NSInvocation *invocation) {
-    __unsafe_unretained void (^completionHandler)(ARDJoinResponse *response,
-                                                  NSError *error);
-    [invocation getArgument:&completionHandler atIndex:4];
-    completionHandler(joinResponse, nil);
-  }] joinRoomWithRoomId:roomId isLoopback:NO completionHandler:[OCMArg any]];
-
-  // Return message response from above on join.
-  [[[mockRoomServerClient stub] andDo:^(NSInvocation *invocation) {
-    __unsafe_unretained ARDSignalingMessage *message;
-    __unsafe_unretained void (^completionHandler)(ARDMessageResponse *response,
-                                                  NSError *error);
-    [invocation getArgument:&message atIndex:2];
-    [invocation getArgument:&completionHandler atIndex:5];
-    messageHandler(message);
-    completionHandler(messageResponse, nil);
-  }] sendMessage:[OCMArg any]
-            forRoomId:roomId
-             clientId:clientId
-    completionHandler:[OCMArg any]];
-
-  // Do nothing on leave.
-  [[[mockRoomServerClient stub] andDo:^(NSInvocation *invocation) {
-    __unsafe_unretained void (^completionHandler)(NSError *error);
-    [invocation getArgument:&completionHandler atIndex:4];
-    if (completionHandler) {
-      completionHandler(nil);
-    }
-  }] leaveRoomWithRoomId:roomId
-                clientId:clientId
-       completionHandler:[OCMArg any]];
-
-  return mockRoomServerClient;
-}
-
-- (id)mockSignalingChannelForRoomId:(NSString *)roomId
-                           clientId:(NSString *)clientId
-                     messageHandler:
-    (void (^)(ARDSignalingMessage *message))messageHandler {
-  id mockSignalingChannel =
-      [OCMockObject niceMockForProtocol:@protocol(ARDSignalingChannel)];
-  [[mockSignalingChannel stub] registerForRoomId:roomId clientId:clientId];
-  [[[mockSignalingChannel stub] andDo:^(NSInvocation *invocation) {
-    __unsafe_unretained ARDSignalingMessage *message;
-    [invocation getArgument:&message atIndex:2];
-    messageHandler(message);
-  }] sendMessage:[OCMArg any]];
-  return mockSignalingChannel;
-}
-
-- (id)mockTURNClient {
-  id mockTURNClient =
-      [OCMockObject mockForProtocol:@protocol(ARDTURNClient)];
-  [[[mockTURNClient stub] andDo:^(NSInvocation *invocation) {
-    // Don't return anything in TURN response.
-    __unsafe_unretained void (^completionHandler)(NSArray *turnServers,
-                                                  NSError *error);
-    [invocation getArgument:&completionHandler atIndex:2];
-    completionHandler([NSArray array], nil);
-  }] requestServersWithCompletionHandler:[OCMArg any]];
-  return mockTURNClient;
-}
-
-- (id)mockSettingsModel {
-  ARDSettingsModel *model = [[ARDSettingsModel alloc] init];
-  id partialMock = [OCMockObject partialMockForObject:model];
-  [[[partialMock stub] andReturn:@[ @"640x480", @"960x540", @"1280x720" ]]
-      availableVideoResolutions];
-
-  return model;
-}
-
-- (ARDAppClient *)createAppClientForRoomId:(NSString *)roomId
-                                  clientId:(NSString *)clientId
-                               isInitiator:(BOOL)isInitiator
-                                  messages:(NSArray *)messages
-                            messageHandler:
-    (void (^)(ARDSignalingMessage *message))messageHandler
-                          connectedHandler:(void (^)(void))connectedHandler
-                    localVideoTrackHandler:(void (^)(void))localVideoTrackHandler {
-  id turnClient = [self mockTURNClient];
-  id signalingChannel = [self mockSignalingChannelForRoomId:roomId
-                                                   clientId:clientId
-                                             messageHandler:messageHandler];
-  id roomServerClient =
-      [self mockRoomServerClientForRoomId:roomId
-                                 clientId:clientId
-                              isInitiator:isInitiator
-                                 messages:messages
-                           messageHandler:messageHandler];
-  id delegate =
-      [OCMockObject niceMockForProtocol:@protocol(ARDAppClientDelegate)];
-  [[[delegate stub] andDo:^(NSInvocation *invocation) {
-    connectedHandler();
-  }] appClient:[OCMArg any]
-      didChangeConnectionState:RTCIceConnectionStateConnected];
-  [[[delegate stub] andDo:^(NSInvocation *invocation) {
-    localVideoTrackHandler();
-  }] appClient:[OCMArg any]
-      didReceiveLocalVideoTrack:[OCMArg any]];
-
-  return [[ARDAppClient alloc] initWithRoomServerClient:roomServerClient
-                                       signalingChannel:signalingChannel
-                                             turnClient:turnClient
-                                               delegate:delegate];
-}
-
-// Tests that an ICE connection is established between two ARDAppClient objects
-// where one is set up as a caller and the other the answerer. Network
-// components are mocked out and messages are relayed directly from object to
-// object. It's expected that both clients reach the
-// RTCIceConnectionStateConnected state within a reasonable amount of time.
-- (void)testSession {
-  // Need block arguments here because we're setting up a callbacks before we
-  // create the clients.
-  ARDAppClient *caller = nil;
-  ARDAppClient *answerer = nil;
-  __block __weak ARDAppClient *weakCaller = nil;
-  __block __weak ARDAppClient *weakAnswerer = nil;
-  NSString *roomId = @"testRoom";
-  NSString *callerId = @"testCallerId";
-  NSString *answererId = @"testAnswererId";
-
-  XCTestExpectation *callerConnectionExpectation =
-      [self expectationWithDescription:@"Caller PC connected."];
-  XCTestExpectation *answererConnectionExpectation =
-      [self expectationWithDescription:@"Answerer PC connected."];
-
-  caller = [self createAppClientForRoomId:roomId
-                                 clientId:callerId
-                              isInitiator:YES
-                                 messages:[NSArray array]
-                           messageHandler:^(ARDSignalingMessage *message) {
-    ARDAppClient *strongAnswerer = weakAnswerer;
-    [strongAnswerer channel:strongAnswerer.channel didReceiveMessage:message];
-  }                      connectedHandler:^{
-    [callerConnectionExpectation fulfill];
-  }                localVideoTrackHandler:^{
-  }];
-  // TODO(tkchin): Figure out why DTLS-SRTP constraint causes thread assertion
-  // crash in Debug.
-  caller.defaultPeerConnectionConstraints =
-      [[RTCMediaConstraints alloc] initWithMandatoryConstraints:nil
-                                            optionalConstraints:nil];
-  weakCaller = caller;
-
-  answerer = [self createAppClientForRoomId:roomId
-                                   clientId:answererId
-                                isInitiator:NO
-                                   messages:[NSArray array]
-                             messageHandler:^(ARDSignalingMessage *message) {
-    ARDAppClient *strongCaller = weakCaller;
-    [strongCaller channel:strongCaller.channel didReceiveMessage:message];
-  }                        connectedHandler:^{
-    [answererConnectionExpectation fulfill];
-  }                  localVideoTrackHandler:^{
-  }];
-  // TODO(tkchin): Figure out why DTLS-SRTP constraint causes thread assertion
-  // crash in Debug.
-  answerer.defaultPeerConnectionConstraints =
-      [[RTCMediaConstraints alloc] initWithMandatoryConstraints:nil
-                                            optionalConstraints:nil];
-  weakAnswerer = answerer;
-
-  // Kick off connection.
-  [caller connectToRoomWithId:roomId settings:[self mockSettingsModel] isLoopback:NO];
-  [answerer connectToRoomWithId:roomId settings:[self mockSettingsModel] isLoopback:NO];
-  [self waitForExpectationsWithTimeout:20 handler:^(NSError *error) {
-    if (error) {
-      XCTFail(@"Expectation failed with error %@.", error);
-    }
-  }];
-}
-
-// Test to see that we get a local video connection
-// Note this will currently pass even when no camera is connected as a local
-// video track is created regardless (Perhaps there should be a test for that...)
-#if !TARGET_IPHONE_SIMULATOR // Expect to fail on simulator due to no camera support
-- (void)testSessionShouldGetLocalVideoTrackCallback {
-  ARDAppClient *caller = nil;
-  NSString *roomId = @"testRoom";
-  NSString *callerId = @"testCallerId";
-
-  XCTestExpectation *localVideoTrackExpectation =
-      [self expectationWithDescription:@"Caller got local video."];
-
-  caller = [self createAppClientForRoomId:roomId
-                                 clientId:callerId
-                              isInitiator:YES
-                                 messages:[NSArray array]
-                           messageHandler:^(ARDSignalingMessage *message) {}
-                         connectedHandler:^{}
-                   localVideoTrackHandler:^{ [localVideoTrackExpectation fulfill]; }];
-  caller.defaultPeerConnectionConstraints =
-      [[RTCMediaConstraints alloc] initWithMandatoryConstraints:nil
-                                          optionalConstraints:nil];
-
-  // Kick off connection.
-  [caller connectToRoomWithId:roomId
-                     settings:[self mockSettingsModel]
-                   isLoopback:NO];
-  [self waitForExpectationsWithTimeout:20 handler:^(NSError *error) {
-    if (error) {
-      XCTFail("Expectation timed out with error: %@.", error);
-    }
-  }];
-}
-#endif
-
-@end
diff --git a/examples/objc/AppRTCMobile/tests/ARDSDPUtils_xctest.mm b/examples/objc/AppRTCMobile/tests/ARDSDPUtils_xctest.mm
deleted file mode 100644
index b94f404..0000000
--- a/examples/objc/AppRTCMobile/tests/ARDSDPUtils_xctest.mm
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- *  Copyright 2017 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.
- */
-
-#import <Foundation/Foundation.h>
-#import <XCTest/XCTest.h>
-
-#import "WebRTC/RTCSessionDescription.h"
-
-#import "ARDSDPUtils.h"
-
-@interface ARDSDPUtilsTest : XCTestCase
-@end
-
-@implementation ARDSDPUtilsTest
-
-- (void)testPreferVideoCodecH264 {
-  NSString *sdp = @("m=video 9 RTP/SAVPF 100 116 117 96 120 97\r\n"
-                    "a=rtpmap:120 H264/90000\r\n"
-                    "a=rtpmap:97 H264/90000\r\n");
-  NSString *expectedSdp = @("m=video 9 RTP/SAVPF 120 97 100 116 117 96\r\n"
-                            "a=rtpmap:120 H264/90000\r\n"
-                            "a=rtpmap:97 H264/90000\r\n");
-  [self preferVideoCodec:@"H264" sdp:sdp expected:expectedSdp];
-}
-
-- (void)testPreferVideoCodecVP8 {
-  NSString *sdp = @("m=video 9 RTP/SAVPF 100 116 117 96 120 97\r\n"
-                    "a=rtpmap:116 VP8/90000\r\n");
-  NSString *expectedSdp = @("m=video 9 RTP/SAVPF 116 100 117 96 120 97\r\n"
-                            "a=rtpmap:116 VP8/90000\r\n");
-  [self preferVideoCodec:@"VP8" sdp:sdp expected:expectedSdp];
-}
-
-- (void)testNoMLine {
-  NSString *sdp = @("a=rtpmap:116 VP8/90000\r\n");
-  [self preferVideoCodec:@"VP8" sdp:sdp expected:sdp];
-}
-
-- (void)testMissingCodec {
-  NSString *sdp = @("m=video 9 RTP/SAVPF 100 116 117 96 120 97\r\n"
-                    "a=rtpmap:116 VP8/90000\r\n");
-  [self preferVideoCodec:@"foo" sdp:sdp expected:sdp];
-}
-
-#pragma mark - Helpers
-
-- (void)preferVideoCodec:(NSString *)codec
-                     sdp:(NSString *)sdp
-                expected:(NSString *)expectedSdp{
-  RTCSessionDescription* desc =
-    [[RTCSessionDescription alloc] initWithType:RTCSdpTypeOffer sdp:sdp];
-  RTCSessionDescription *outputDesc =
-    [ARDSDPUtils descriptionForDescription:desc
-                       preferredVideoCodec:codec];
-  XCTAssertTrue([outputDesc.description rangeOfString:expectedSdp].location != NSNotFound);
-}
-@end
diff --git a/examples/objc/AppRTCMobile/tests/ARDSettingsModel_xctest.mm b/examples/objc/AppRTCMobile/tests/ARDSettingsModel_xctest.mm
deleted file mode 100644
index b44f935..0000000
--- a/examples/objc/AppRTCMobile/tests/ARDSettingsModel_xctest.mm
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- *  Copyright 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.
- */
-
-#import <Foundation/Foundation.h>
-#import <OCMock/OCMock.h>
-#import <XCTest/XCTest.h>
-
-#import "WebRTC/RTCMediaConstraints.h"
-
-#import "ARDSettingsModel+Private.h"
-#import "ARDSettingsStore.h"
-
-
-@interface ARDSettingsModelTests : XCTestCase {
-  ARDSettingsModel *_model;
-}
-@end
-
-@implementation ARDSettingsModelTests
-
-- (id)setupMockStore {
-  id storeMock = [OCMockObject mockForClass:[ARDSettingsStore class]];
-
-  id partialMock = [OCMockObject partialMockForObject:_model];
-  [[[partialMock stub] andReturn:storeMock] settingsStore];
-  [[[partialMock stub] andReturn:@[ @"640x480", @"960x540", @"1280x720" ]]
-      availableVideoResolutions];
-
-  return storeMock;
-}
-
-- (void)setUp {
-  _model = [[ARDSettingsModel alloc] init];
-}
-
-- (void)testRetrievingSetting {
-  id storeMock = [self setupMockStore];
-  [[[storeMock expect] andReturn:@"640x480"] videoResolution];
-  NSString *string = [_model currentVideoResolutionSettingFromStore];
-
-  XCTAssertEqualObjects(string, @"640x480");
-}
-
-- (void)testStoringInvalidConstraintReturnsNo {
-  id storeMock = [self setupMockStore];
-  [([[storeMock stub] andReturn:@"960x480"])videoResolution];
-  XCTAssertFalse([_model storeVideoResolutionSetting:@"960x480"]);
-}
-
-- (void)testWidthConstraintFromStore {
-  id storeMock = [self setupMockStore];
-  [([[storeMock stub] andReturn:@"1270x480"])videoResolution];
-  int width = [_model currentVideoResolutionWidthFromStore];
-
-  XCTAssertEqual(width, 1270);
-}
-
-- (void)testHeightConstraintFromStore {
-  id storeMock = [self setupMockStore];
-  [([[storeMock stub] andReturn:@"960x540"])videoResolution];
-  int height = [_model currentVideoResolutionHeightFromStore];
-
-  XCTAssertEqual(height, 540);
-}
-
-- (void)testConstraintComponentIsNilWhenInvalidConstraintString {
-  id storeMock = [self setupMockStore];
-  [([[storeMock stub] andReturn:@"invalid"])videoResolution];
-  int width = [_model currentVideoResolutionWidthFromStore];
-
-  XCTAssertEqual(width, 0);
-}
-
-- (void)testStoringAudioSetting {
-  id storeMock = [self setupMockStore];
-  [[storeMock expect] setAudioOnly:YES];
-
-  [_model storeAudioOnlySetting:YES];
-  [storeMock verify];
-}
-
-- (void)testReturningDefaultCallOption {
-  id storeMock = [self setupMockStore];
-  [[[storeMock stub] andReturnValue:@YES] useManualAudioConfig];
-
-  XCTAssertTrue([_model currentUseManualAudioConfigSettingFromStore]);
-}
-
-@end
diff --git a/examples/objc/AppRTCMobile/third_party/SocketRocket/LICENSE b/examples/objc/AppRTCMobile/third_party/SocketRocket/LICENSE
deleted file mode 100644
index c01a79c..0000000
--- a/examples/objc/AppRTCMobile/third_party/SocketRocket/LICENSE
+++ /dev/null
@@ -1,15 +0,0 @@
-
-   Copyright 2012 Square Inc.
-
-   Licensed under the Apache License, Version 2.0 (the "License");
-   you may not use this file except in compliance with the License.
-   You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-
diff --git a/examples/objc/AppRTCMobile/third_party/SocketRocket/SRWebSocket.h b/examples/objc/AppRTCMobile/third_party/SocketRocket/SRWebSocket.h
deleted file mode 100644
index 5cce725..0000000
--- a/examples/objc/AppRTCMobile/third_party/SocketRocket/SRWebSocket.h
+++ /dev/null
@@ -1,132 +0,0 @@
-//
-//   Copyright 2012 Square Inc.
-//
-//   Licensed under the Apache License, Version 2.0 (the "License");
-//   you may not use this file except in compliance with the License.
-//   You may obtain a copy of the License at
-//
-//       http://www.apache.org/licenses/LICENSE-2.0
-//
-//   Unless required by applicable law or agreed to in writing, software
-//   distributed under the License is distributed on an "AS IS" BASIS,
-//   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//   See the License for the specific language governing permissions and
-//   limitations under the License.
-//
-
-#import <Foundation/Foundation.h>
-#import <Security/SecCertificate.h>
-
-typedef enum {
-    SR_CONNECTING   = 0,
-    SR_OPEN         = 1,
-    SR_CLOSING      = 2,
-    SR_CLOSED       = 3,
-} SRReadyState;
-
-typedef enum SRStatusCode : NSInteger {
-    SRStatusCodeNormal = 1000,
-    SRStatusCodeGoingAway = 1001,
-    SRStatusCodeProtocolError = 1002,
-    SRStatusCodeUnhandledType = 1003,
-    // 1004 reserved.
-    SRStatusNoStatusReceived = 1005,
-    // 1004-1006 reserved.
-    SRStatusCodeInvalidUTF8 = 1007,
-    SRStatusCodePolicyViolated = 1008,
-    SRStatusCodeMessageTooBig = 1009,
-} SRStatusCode;
-
-@class SRWebSocket;
-
-extern NSString *const SRWebSocketErrorDomain;
-extern NSString *const SRHTTPResponseErrorKey;
-
-#pragma mark - SRWebSocketDelegate
-
-@protocol SRWebSocketDelegate;
-
-#pragma mark - SRWebSocket
-
-@interface SRWebSocket : NSObject <NSStreamDelegate>
-
-@property (nonatomic, weak) id <SRWebSocketDelegate> delegate;
-
-@property (nonatomic, readonly) SRReadyState readyState;
-@property (nonatomic, readonly, retain) NSURL *url;
-
-// This returns the negotiated protocol.
-// It will be nil until after the handshake completes.
-@property (nonatomic, readonly, copy) NSString *protocol;
-
-// Protocols should be an array of strings that turn into Sec-WebSocket-Protocol.
-- (id)initWithURLRequest:(NSURLRequest *)request protocols:(NSArray *)protocols;
-- (id)initWithURLRequest:(NSURLRequest *)request;
-
-// Some helper constructors.
-- (id)initWithURL:(NSURL *)url protocols:(NSArray *)protocols;
-- (id)initWithURL:(NSURL *)url;
-
-// Delegate queue will be dispatch_main_queue by default.
-// You cannot set both OperationQueue and dispatch_queue.
-- (void)setDelegateOperationQueue:(NSOperationQueue*) queue;
-- (void)setDelegateDispatchQueue:(dispatch_queue_t) queue;
-
-// By default, it will schedule itself on +[NSRunLoop SR_networkRunLoop] using defaultModes.
-- (void)scheduleInRunLoop:(NSRunLoop *)aRunLoop forMode:(NSString *)mode;
-- (void)unscheduleFromRunLoop:(NSRunLoop *)aRunLoop forMode:(NSString *)mode;
-
-// SRWebSockets are intended for one-time-use only.  Open should be called once and only once.
-- (void)open;
-
-- (void)close;
-- (void)closeWithCode:(NSInteger)code reason:(NSString *)reason;
-
-// Send a UTF8 String or Data.
-- (void)send:(id)data;
-
-// Send Data (can be nil) in a ping message.
-- (void)sendPing:(NSData *)data;
-
-@end
-
-#pragma mark - SRWebSocketDelegate
-
-@protocol SRWebSocketDelegate <NSObject>
-
-// message will either be an NSString if the server is using text
-// or NSData if the server is using binary.
-- (void)webSocket:(SRWebSocket *)webSocket didReceiveMessage:(id)message;
-
-@optional
-
-- (void)webSocketDidOpen:(SRWebSocket *)webSocket;
-- (void)webSocket:(SRWebSocket *)webSocket didFailWithError:(NSError *)error;
-- (void)webSocket:(SRWebSocket *)webSocket didCloseWithCode:(NSInteger)code reason:(NSString *)reason wasClean:(BOOL)wasClean;
-- (void)webSocket:(SRWebSocket *)webSocket didReceivePong:(NSData *)pongPayload;
-
-@end
-
-#pragma mark - NSURLRequest (CertificateAdditions)
-
-@interface NSURLRequest (CertificateAdditions)
-
-@property (nonatomic, retain, readonly) NSArray *SR_SSLPinnedCertificates;
-
-@end
-
-#pragma mark - NSMutableURLRequest (CertificateAdditions)
-
-@interface NSMutableURLRequest (CertificateAdditions)
-
-@property (nonatomic, retain) NSArray *SR_SSLPinnedCertificates;
-
-@end
-
-#pragma mark - NSRunLoop (SRWebSocket)
-
-@interface NSRunLoop (SRWebSocket)
-
-+ (NSRunLoop *)SR_networkRunLoop;
-
-@end
diff --git a/examples/objc/AppRTCMobile/third_party/SocketRocket/SRWebSocket.m b/examples/objc/AppRTCMobile/third_party/SocketRocket/SRWebSocket.m
deleted file mode 100644
index 45f783f..0000000
--- a/examples/objc/AppRTCMobile/third_party/SocketRocket/SRWebSocket.m
+++ /dev/null
@@ -1,1763 +0,0 @@
-//
-//   Copyright 2012 Square Inc.
-//
-//   Licensed under the Apache License, Version 2.0 (the "License");
-//   you may not use this file except in compliance with the License.
-//   You may obtain a copy of the License at
-//
-//       http://www.apache.org/licenses/LICENSE-2.0
-//
-//   Unless required by applicable law or agreed to in writing, software
-//   distributed under the License is distributed on an "AS IS" BASIS,
-//   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//   See the License for the specific language governing permissions and
-//   limitations under the License.
-//
-
-
-#import "SRWebSocket.h"
-
-#if TARGET_OS_IPHONE
-#define HAS_ICU
-#endif
-
-#ifdef HAS_ICU
-#import <unicode/utf8.h>
-#endif
-
-#if TARGET_OS_IPHONE
-#import <Endian.h>
-#else
-#import <CoreServices/CoreServices.h>
-#endif
-
-#import <CommonCrypto/CommonDigest.h>
-#import <Security/SecRandom.h>
-
-#if OS_OBJECT_USE_OBJC_RETAIN_RELEASE
-#define sr_dispatch_retain(x)
-#define sr_dispatch_release(x)
-#define maybe_bridge(x) ((__bridge void *) x)
-#else
-#define sr_dispatch_retain(x) dispatch_retain(x)
-#define sr_dispatch_release(x) dispatch_release(x)
-#define maybe_bridge(x) (x)
-#endif
-
-#if !__has_feature(objc_arc) 
-#error SocketRocket must be compiled with ARC enabled
-#endif
-
-
-typedef enum  {
-    SROpCodeTextFrame = 0x1,
-    SROpCodeBinaryFrame = 0x2,
-    // 3-7 reserved.
-    SROpCodeConnectionClose = 0x8,
-    SROpCodePing = 0x9,
-    SROpCodePong = 0xA,
-    // B-F reserved.
-} SROpCode;
-
-typedef struct {
-    BOOL fin;
-//  BOOL rsv1;
-//  BOOL rsv2;
-//  BOOL rsv3;
-    uint8_t opcode;
-    BOOL masked;
-    uint64_t payload_length;
-} frame_header;
-
-static NSString *const SRWebSocketAppendToSecKeyString = @"258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
-
-static inline int32_t validate_dispatch_data_partial_string(NSData *data);
-static inline void SRFastLog(NSString *format, ...);
-
-@interface NSData (SRWebSocket)
-
-- (NSString *)stringBySHA1ThenBase64Encoding;
-
-@end
-
-
-@interface NSString (SRWebSocket)
-
-- (NSString *)stringBySHA1ThenBase64Encoding;
-
-@end
-
-
-@interface NSURL (SRWebSocket)
-
-// The origin isn't really applicable for a native application.
-// So instead, just map ws -> http and wss -> https.
-- (NSString *)SR_origin;
-
-@end
-
-
-@interface _SRRunLoopThread : NSThread
-
-@property (nonatomic, readonly) NSRunLoop *runLoop;
-
-@end
-
-
-static NSString *newSHA1String(const char *bytes, size_t length) {
-    uint8_t md[CC_SHA1_DIGEST_LENGTH];
-
-    assert(length >= 0);
-    assert(length <= UINT32_MAX);
-    CC_SHA1(bytes, (CC_LONG)length, md);
-    
-    NSData *data = [NSData dataWithBytes:md length:CC_SHA1_DIGEST_LENGTH];
-    
-    if ([data respondsToSelector:@selector(base64EncodedStringWithOptions:)]) {
-        return [data base64EncodedStringWithOptions:0];
-    }
-    
-    return [data base64Encoding];
-}
-
-@implementation NSData (SRWebSocket)
-
-- (NSString *)stringBySHA1ThenBase64Encoding;
-{
-    return newSHA1String(self.bytes, self.length);
-}
-
-@end
-
-
-@implementation NSString (SRWebSocket)
-
-- (NSString *)stringBySHA1ThenBase64Encoding;
-{
-    return newSHA1String(self.UTF8String, self.length);
-}
-
-@end
-
-NSString *const SRWebSocketErrorDomain = @"SRWebSocketErrorDomain";
-NSString *const SRHTTPResponseErrorKey = @"HTTPResponseStatusCode";
-
-// Returns number of bytes consumed. Returning 0 means you didn't match.
-// Sends bytes to callback handler;
-typedef size_t (^stream_scanner)(NSData *collected_data);
-
-typedef void (^data_callback)(SRWebSocket *webSocket,  NSData *data);
-
-@interface SRIOConsumer : NSObject {
-    stream_scanner _scanner;
-    data_callback _handler;
-    size_t _bytesNeeded;
-    BOOL _readToCurrentFrame;
-    BOOL _unmaskBytes;
-}
-@property (nonatomic, copy, readonly) stream_scanner consumer;
-@property (nonatomic, copy, readonly) data_callback handler;
-@property (nonatomic, assign) size_t bytesNeeded;
-@property (nonatomic, assign, readonly) BOOL readToCurrentFrame;
-@property (nonatomic, assign, readonly) BOOL unmaskBytes;
-
-@end
-
-// This class is not thread-safe, and is expected to always be run on the same queue.
-@interface SRIOConsumerPool : NSObject
-
-- (id)initWithBufferCapacity:(NSUInteger)poolSize;
-
-- (SRIOConsumer *)consumerWithScanner:(stream_scanner)scanner handler:(data_callback)handler bytesNeeded:(size_t)bytesNeeded readToCurrentFrame:(BOOL)readToCurrentFrame unmaskBytes:(BOOL)unmaskBytes;
-- (void)returnConsumer:(SRIOConsumer *)consumer;
-
-@end
-
-@interface SRWebSocket ()  <NSStreamDelegate>
-
-- (void)_writeData:(NSData *)data;
-- (void)_closeWithProtocolError:(NSString *)message;
-- (void)_failWithError:(NSError *)error;
-
-- (void)_disconnect;
-
-- (void)_readFrameNew;
-- (void)_readFrameContinue;
-
-- (void)_pumpScanner;
-
-- (void)_pumpWriting;
-
-- (void)_addConsumerWithScanner:(stream_scanner)consumer callback:(data_callback)callback;
-- (void)_addConsumerWithDataLength:(size_t)dataLength callback:(data_callback)callback readToCurrentFrame:(BOOL)readToCurrentFrame unmaskBytes:(BOOL)unmaskBytes;
-- (void)_addConsumerWithScanner:(stream_scanner)consumer callback:(data_callback)callback dataLength:(size_t)dataLength;
-- (void)_readUntilBytes:(const void *)bytes length:(size_t)length callback:(data_callback)dataHandler;
-- (void)_readUntilHeaderCompleteWithCallback:(data_callback)dataHandler;
-
-- (void)_sendFrameWithOpcode:(SROpCode)opcode data:(id)data;
-
-- (BOOL)_checkHandshake:(CFHTTPMessageRef)httpMessage;
-- (void)_SR_commonInit;
-
-- (void)_initializeStreams;
-- (void)_connect;
-
-@property (nonatomic) SRReadyState readyState;
-
-@property (nonatomic) NSOperationQueue *delegateOperationQueue;
-@property (nonatomic) dispatch_queue_t delegateDispatchQueue;
-
-@end
-
-
-@implementation SRWebSocket {
-    NSInteger _webSocketVersion;
-    
-    NSOperationQueue *_delegateOperationQueue;
-    dispatch_queue_t _delegateDispatchQueue;
-    
-    dispatch_queue_t _workQueue;
-    NSMutableArray *_consumers;
-
-    NSInputStream *_inputStream;
-    NSOutputStream *_outputStream;
-   
-    NSMutableData *_readBuffer;
-    NSUInteger _readBufferOffset;
- 
-    NSMutableData *_outputBuffer;
-    NSUInteger _outputBufferOffset;
-
-    uint8_t _currentFrameOpcode;
-    size_t _currentFrameCount;
-    size_t _readOpCount;
-    uint32_t _currentStringScanPosition;
-    NSMutableData *_currentFrameData;
-    
-    NSString *_closeReason;
-    
-    NSString *_secKey;
-    
-    BOOL _pinnedCertFound;
-    
-    uint8_t _currentReadMaskKey[4];
-    size_t _currentReadMaskOffset;
-
-    BOOL _consumerStopped;
-    
-    BOOL _closeWhenFinishedWriting;
-    BOOL _failed;
-
-    BOOL _secure;
-    NSURLRequest *_urlRequest;
-
-    CFHTTPMessageRef _receivedHTTPHeaders;
-    
-    BOOL _sentClose;
-    BOOL _didFail;
-    int _closeCode;
-    
-    BOOL _isPumping;
-    
-    NSMutableSet *_scheduledRunloops;
-    
-    // We use this to retain ourselves.
-    __strong SRWebSocket *_selfRetain;
-    
-    NSArray *_requestedProtocols;
-    SRIOConsumerPool *_consumerPool;
-}
-
-@synthesize delegate = _delegate;
-@synthesize url = _url;
-@synthesize readyState = _readyState;
-@synthesize protocol = _protocol;
-
-static __strong NSData *CRLFCRLF;
-
-+ (void)initialize;
-{
-    CRLFCRLF = [[NSData alloc] initWithBytes:"\r\n\r\n" length:4];
-}
-
-- (id)initWithURLRequest:(NSURLRequest *)request protocols:(NSArray *)protocols;
-{
-    self = [super init];
-    if (self) {
-        assert(request.URL);
-        _url = request.URL;
-        _urlRequest = request;
-        
-        _requestedProtocols = [protocols copy];
-        
-        [self _SR_commonInit];
-    }
-    
-    return self;
-}
-
-- (id)initWithURLRequest:(NSURLRequest *)request;
-{
-    return [self initWithURLRequest:request protocols:nil];
-}
-
-- (id)initWithURL:(NSURL *)url;
-{
-    return [self initWithURL:url protocols:nil];
-}
-
-- (id)initWithURL:(NSURL *)url protocols:(NSArray *)protocols;
-{
-    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url];    
-    return [self initWithURLRequest:request protocols:protocols];
-}
-
-- (void)_SR_commonInit;
-{
-    
-    NSString *scheme = _url.scheme.lowercaseString;
-    assert([scheme isEqualToString:@"ws"] || [scheme isEqualToString:@"http"] || [scheme isEqualToString:@"wss"] || [scheme isEqualToString:@"https"]);
-    
-    if ([scheme isEqualToString:@"wss"] || [scheme isEqualToString:@"https"]) {
-        _secure = YES;
-    }
-    
-    _readyState = SR_CONNECTING;
-    _consumerStopped = YES;
-    _webSocketVersion = 13;
-    
-    _workQueue = dispatch_queue_create(NULL, DISPATCH_QUEUE_SERIAL);
-    
-    // Going to set a specific on the queue so we can validate we're on the work queue
-    dispatch_queue_set_specific(_workQueue, (__bridge void *)self, maybe_bridge(_workQueue), NULL);
-    
-    _delegateDispatchQueue = dispatch_get_main_queue();
-    sr_dispatch_retain(_delegateDispatchQueue);
-    
-    _readBuffer = [[NSMutableData alloc] init];
-    _outputBuffer = [[NSMutableData alloc] init];
-    
-    _currentFrameData = [[NSMutableData alloc] init];
-
-    _consumers = [[NSMutableArray alloc] init];
-    
-    _consumerPool = [[SRIOConsumerPool alloc] init];
-    
-    _scheduledRunloops = [[NSMutableSet alloc] init];
-    
-    [self _initializeStreams];
-    
-    // default handlers
-}
-
-- (void)assertOnWorkQueue;
-{
-    assert(dispatch_get_specific((__bridge void *)self) == maybe_bridge(_workQueue));
-}
-
-- (void)dealloc
-{
-    _inputStream.delegate = nil;
-    _outputStream.delegate = nil;
-
-    [_inputStream close];
-    [_outputStream close];
-    
-    sr_dispatch_release(_workQueue);
-    _workQueue = NULL;
-    
-    if (_receivedHTTPHeaders) {
-        CFRelease(_receivedHTTPHeaders);
-        _receivedHTTPHeaders = NULL;
-    }
-    
-    if (_delegateDispatchQueue) {
-        sr_dispatch_release(_delegateDispatchQueue);
-        _delegateDispatchQueue = NULL;
-    }
-}
-
-#ifndef NDEBUG
-
-- (void)setReadyState:(SRReadyState)aReadyState;
-{
-    [self willChangeValueForKey:@"readyState"];
-    assert(aReadyState > _readyState);
-    _readyState = aReadyState;
-    [self didChangeValueForKey:@"readyState"];
-}
-
-#endif
-
-- (void)open;
-{
-    assert(_url);
-    NSAssert(_readyState == SR_CONNECTING, @"Cannot call -(void)open on SRWebSocket more than once");
-
-    _selfRetain = self;
-    
-    [self _connect];
-}
-
-// Calls block on delegate queue
-- (void)_performDelegateBlock:(dispatch_block_t)block;
-{
-    if (_delegateOperationQueue) {
-        [_delegateOperationQueue addOperationWithBlock:block];
-    } else {
-        assert(_delegateDispatchQueue);
-        dispatch_async(_delegateDispatchQueue, block);
-    }
-}
-
-- (void)setDelegateDispatchQueue:(dispatch_queue_t)queue;
-{
-    if (queue) {
-        sr_dispatch_retain(queue);
-    }
-    
-    if (_delegateDispatchQueue) {
-        sr_dispatch_release(_delegateDispatchQueue);
-    }
-    
-    _delegateDispatchQueue = queue;
-}
-
-- (BOOL)_checkHandshake:(CFHTTPMessageRef)httpMessage;
-{
-    NSString *acceptHeader = CFBridgingRelease(CFHTTPMessageCopyHeaderFieldValue(httpMessage, CFSTR("Sec-WebSocket-Accept")));
-
-    if (acceptHeader == nil) {
-        return NO;
-    }
-    
-    NSString *concattedString = [_secKey stringByAppendingString:SRWebSocketAppendToSecKeyString];
-    NSString *expectedAccept = [concattedString stringBySHA1ThenBase64Encoding];
-    
-    return [acceptHeader isEqualToString:expectedAccept];
-}
-
-- (void)_HTTPHeadersDidFinish;
-{
-    NSInteger responseCode = CFHTTPMessageGetResponseStatusCode(_receivedHTTPHeaders);
-    
-    if (responseCode >= 400) {
-        SRFastLog(@"Request failed with response code %d", responseCode);
-        [self _failWithError:[NSError errorWithDomain:SRWebSocketErrorDomain code:2132 userInfo:@{NSLocalizedDescriptionKey:[NSString stringWithFormat:@"received bad response code from server %ld", (long)responseCode], SRHTTPResponseErrorKey:@(responseCode)}]];
-        return;
-    }
-    
-    if(![self _checkHandshake:_receivedHTTPHeaders]) {
-        [self _failWithError:[NSError errorWithDomain:SRWebSocketErrorDomain code:2133 userInfo:[NSDictionary dictionaryWithObject:[NSString stringWithFormat:@"Invalid Sec-WebSocket-Accept response"] forKey:NSLocalizedDescriptionKey]]];
-        return;
-    }
-    
-    NSString *negotiatedProtocol = CFBridgingRelease(CFHTTPMessageCopyHeaderFieldValue(_receivedHTTPHeaders, CFSTR("Sec-WebSocket-Protocol")));
-    if (negotiatedProtocol) {
-        // Make sure we requested the protocol
-        if ([_requestedProtocols indexOfObject:negotiatedProtocol] == NSNotFound) {
-            [self _failWithError:[NSError errorWithDomain:SRWebSocketErrorDomain code:2133 userInfo:[NSDictionary dictionaryWithObject:[NSString stringWithFormat:@"Server specified Sec-WebSocket-Protocol that wasn't requested"] forKey:NSLocalizedDescriptionKey]]];
-            return;
-        }
-        
-        _protocol = negotiatedProtocol;
-    }
-    
-    self.readyState = SR_OPEN;
-    
-    if (!_didFail) {
-        [self _readFrameNew];
-    }
-
-    [self _performDelegateBlock:^{
-        if ([self.delegate respondsToSelector:@selector(webSocketDidOpen:)]) {
-            [self.delegate webSocketDidOpen:self];
-        };
-    }];
-}
-
-
-- (void)_readHTTPHeader;
-{
-    if (_receivedHTTPHeaders == NULL) {
-        _receivedHTTPHeaders = CFHTTPMessageCreateEmpty(NULL, NO);
-    }
-                        
-    [self _readUntilHeaderCompleteWithCallback:^(SRWebSocket *self,  NSData *data) {
-        CFHTTPMessageAppendBytes(_receivedHTTPHeaders, (const UInt8 *)data.bytes, data.length);
-        
-        if (CFHTTPMessageIsHeaderComplete(_receivedHTTPHeaders)) {
-            SRFastLog(@"Finished reading headers %@", CFBridgingRelease(CFHTTPMessageCopyAllHeaderFields(_receivedHTTPHeaders)));
-            [self _HTTPHeadersDidFinish];
-        } else {
-            [self _readHTTPHeader];
-        }
-    }];
-}
-
-- (void)didConnect
-{
-    SRFastLog(@"Connected");
-    CFHTTPMessageRef request = CFHTTPMessageCreateRequest(NULL, CFSTR("GET"), (__bridge CFURLRef)_url, kCFHTTPVersion1_1);
-    
-    // Set host first so it defaults
-    CFHTTPMessageSetHeaderFieldValue(request, CFSTR("Host"), (__bridge CFStringRef)(_url.port ? [NSString stringWithFormat:@"%@:%@", _url.host, _url.port] : _url.host));
-        
-    NSMutableData *keyBytes = [[NSMutableData alloc] initWithLength:16];
-    BOOL success = !SecRandomCopyBytes(kSecRandomDefault, keyBytes.length, keyBytes.mutableBytes);
-    assert(success);
-    
-    if ([keyBytes respondsToSelector:@selector(base64EncodedStringWithOptions:)]) {
-        _secKey = [keyBytes base64EncodedStringWithOptions:0];
-    } else {
-        _secKey = [keyBytes base64Encoding];
-    }
-    
-    assert([_secKey length] == 24);
-    
-    CFHTTPMessageSetHeaderFieldValue(request, CFSTR("Upgrade"), CFSTR("websocket"));
-    CFHTTPMessageSetHeaderFieldValue(request, CFSTR("Connection"), CFSTR("Upgrade"));
-    CFHTTPMessageSetHeaderFieldValue(request, CFSTR("Sec-WebSocket-Key"), (__bridge CFStringRef)_secKey);
-    CFHTTPMessageSetHeaderFieldValue(request, CFSTR("Sec-WebSocket-Version"), (__bridge CFStringRef)[NSString stringWithFormat:@"%ld", (long)_webSocketVersion]);
-    
-    CFHTTPMessageSetHeaderFieldValue(request, CFSTR("Origin"), (__bridge CFStringRef)_url.SR_origin);
-    
-    if (_requestedProtocols) {
-        CFHTTPMessageSetHeaderFieldValue(request, CFSTR("Sec-WebSocket-Protocol"), (__bridge CFStringRef)[_requestedProtocols componentsJoinedByString:@", "]);
-    }
-
-    [_urlRequest.allHTTPHeaderFields enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
-        CFHTTPMessageSetHeaderFieldValue(request, (__bridge CFStringRef)key, (__bridge CFStringRef)obj);
-    }];
-
-    NSData *message = CFBridgingRelease(CFHTTPMessageCopySerializedMessage(request));
-    
-    CFRelease(request);
-
-    [self _writeData:message];
-    [self _readHTTPHeader];
-}
-
-- (void)_initializeStreams;
-{
-    assert(_url.port.unsignedIntValue <= UINT32_MAX);
-    uint32_t port = _url.port.unsignedIntValue;
-    if (port == 0) {
-        if (!_secure) {
-            port = 80;
-        } else {
-            port = 443;
-        }
-    }
-    NSString *host = _url.host;
-    
-    CFReadStreamRef readStream = NULL;
-    CFWriteStreamRef writeStream = NULL;
-    
-    CFStreamCreatePairWithSocketToHost(NULL, (__bridge CFStringRef)host, port, &readStream, &writeStream);
-    
-    _outputStream = CFBridgingRelease(writeStream);
-    _inputStream = CFBridgingRelease(readStream);
-    
-    
-    if (_secure) {
-        NSMutableDictionary *SSLOptions = [[NSMutableDictionary alloc] init];
-        
-        [_outputStream setProperty:(__bridge id)kCFStreamSocketSecurityLevelNegotiatedSSL forKey:(__bridge id)kCFStreamPropertySocketSecurityLevel];
-        
-        // If we're using pinned certs, don't validate the certificate chain
-        if ([_urlRequest SR_SSLPinnedCertificates].count) {
-            [SSLOptions setValue:[NSNumber numberWithBool:NO] forKey:(__bridge id)kCFStreamSSLValidatesCertificateChain];
-        }
-        
-#ifdef DEBUG
-        [SSLOptions setValue:[NSNumber numberWithBool:NO] forKey:(__bridge id)kCFStreamSSLValidatesCertificateChain];
-        NSLog(@"SocketRocket: In debug mode.  Allowing connection to any root cert");
-#endif
-        
-        [_outputStream setProperty:SSLOptions
-                            forKey:(__bridge id)kCFStreamPropertySSLSettings];
-    }
-    
-    _inputStream.delegate = self;
-    _outputStream.delegate = self;
-}
-
-- (void)_connect;
-{
-    if (!_scheduledRunloops.count) {
-        [self scheduleInRunLoop:[NSRunLoop SR_networkRunLoop] forMode:NSDefaultRunLoopMode];
-    }
-    
-    
-    [_outputStream open];
-    [_inputStream open];
-}
-
-- (void)scheduleInRunLoop:(NSRunLoop *)aRunLoop forMode:(NSString *)mode;
-{
-    [_outputStream scheduleInRunLoop:aRunLoop forMode:mode];
-    [_inputStream scheduleInRunLoop:aRunLoop forMode:mode];
-    
-    [_scheduledRunloops addObject:@[aRunLoop, mode]];
-}
-
-- (void)unscheduleFromRunLoop:(NSRunLoop *)aRunLoop forMode:(NSString *)mode;
-{
-    [_outputStream removeFromRunLoop:aRunLoop forMode:mode];
-    [_inputStream removeFromRunLoop:aRunLoop forMode:mode];
-    
-    [_scheduledRunloops removeObject:@[aRunLoop, mode]];
-}
-
-- (void)close;
-{
-    [self closeWithCode:SRStatusCodeNormal reason:nil];
-}
-
-- (void)closeWithCode:(NSInteger)code reason:(NSString *)reason;
-{
-    assert(code);
-    dispatch_async(_workQueue, ^{
-        if (self.readyState == SR_CLOSING || self.readyState == SR_CLOSED) {
-            return;
-        }
-        
-        BOOL wasConnecting = self.readyState == SR_CONNECTING;
-        
-        self.readyState = SR_CLOSING;
-        
-        SRFastLog(@"Closing with code %d reason %@", code, reason);
-        
-        if (wasConnecting) {
-            [self _disconnect];
-            return;
-        }
-
-        size_t maxMsgSize = [reason maximumLengthOfBytesUsingEncoding:NSUTF8StringEncoding];
-        NSMutableData *mutablePayload = [[NSMutableData alloc] initWithLength:sizeof(uint16_t) + maxMsgSize];
-        NSData *payload = mutablePayload;
-        
-        ((uint16_t *)mutablePayload.mutableBytes)[0] = EndianU16_BtoN(code);
-        
-        if (reason) {
-            NSRange remainingRange = {0};
-            
-            NSUInteger usedLength = 0;
-            
-            BOOL success = [reason getBytes:(char *)mutablePayload.mutableBytes + sizeof(uint16_t) maxLength:payload.length - sizeof(uint16_t) usedLength:&usedLength encoding:NSUTF8StringEncoding options:NSStringEncodingConversionExternalRepresentation range:NSMakeRange(0, reason.length) remainingRange:&remainingRange];
-            
-            assert(success);
-            assert(remainingRange.length == 0);
-
-            if (usedLength != maxMsgSize) {
-                payload = [payload subdataWithRange:NSMakeRange(0, usedLength + sizeof(uint16_t))];
-            }
-        }
-        
-        
-        [self _sendFrameWithOpcode:SROpCodeConnectionClose data:payload];
-    });
-}
-
-- (void)_closeWithProtocolError:(NSString *)message;
-{
-    // Need to shunt this on the _callbackQueue first to see if they received any messages 
-    [self _performDelegateBlock:^{
-        [self closeWithCode:SRStatusCodeProtocolError reason:message];
-        dispatch_async(_workQueue, ^{
-            [self _disconnect];
-        });
-    }];
-}
-
-- (void)_failWithError:(NSError *)error;
-{
-    dispatch_async(_workQueue, ^{
-        if (self.readyState != SR_CLOSED) {
-            _failed = YES;
-            [self _performDelegateBlock:^{
-                if ([self.delegate respondsToSelector:@selector(webSocket:didFailWithError:)]) {
-                    [self.delegate webSocket:self didFailWithError:error];
-                }
-            }];
-
-            self.readyState = SR_CLOSED;
-            _selfRetain = nil;
-
-            SRFastLog(@"Failing with error %@", error.localizedDescription);
-            
-            [self _disconnect];
-        }
-    });
-}
-
-- (void)_writeData:(NSData *)data;
-{    
-    [self assertOnWorkQueue];
-
-    if (_closeWhenFinishedWriting) {
-            return;
-    }
-    [_outputBuffer appendData:data];
-    [self _pumpWriting];
-}
-
-- (void)send:(id)data;
-{
-    NSAssert(self.readyState != SR_CONNECTING, @"Invalid State: Cannot call send: until connection is open");
-    // TODO: maybe not copy this for performance
-    data = [data copy];
-    dispatch_async(_workQueue, ^{
-        if ([data isKindOfClass:[NSString class]]) {
-            [self _sendFrameWithOpcode:SROpCodeTextFrame data:[(NSString *)data dataUsingEncoding:NSUTF8StringEncoding]];
-        } else if ([data isKindOfClass:[NSData class]]) {
-            [self _sendFrameWithOpcode:SROpCodeBinaryFrame data:data];
-        } else if (data == nil) {
-            [self _sendFrameWithOpcode:SROpCodeTextFrame data:data];
-        } else {
-            assert(NO);
-        }
-    });
-}
-
-- (void)sendPing:(NSData *)data;
-{
-    NSAssert(self.readyState == SR_OPEN, @"Invalid State: Cannot call send: until connection is open");
-    // TODO: maybe not copy this for performance
-    data = [data copy] ?: [NSData data]; // It's okay for a ping to be empty
-    dispatch_async(_workQueue, ^{
-        [self _sendFrameWithOpcode:SROpCodePing data:data];
-    });
-}
-
-- (void)handlePing:(NSData *)pingData;
-{
-    // Need to pingpong this off _callbackQueue first to make sure messages happen in order
-    [self _performDelegateBlock:^{
-        dispatch_async(_workQueue, ^{
-            [self _sendFrameWithOpcode:SROpCodePong data:pingData];
-        });
-    }];
-}
-
-- (void)handlePong:(NSData *)pongData;
-{
-    SRFastLog(@"Received pong");
-    [self _performDelegateBlock:^{
-        if ([self.delegate respondsToSelector:@selector(webSocket:didReceivePong:)]) {
-            [self.delegate webSocket:self didReceivePong:pongData];
-        }
-    }];
-}
-
-- (void)_handleMessage:(id)message
-{
-    SRFastLog(@"Received message");
-    [self _performDelegateBlock:^{
-        [self.delegate webSocket:self didReceiveMessage:message];
-    }];
-}
-
-
-static inline BOOL closeCodeIsValid(int closeCode) {
-    if (closeCode < 1000) {
-        return NO;
-    }
-    
-    if (closeCode >= 1000 && closeCode <= 1011) {
-        if (closeCode == 1004 ||
-            closeCode == 1005 ||
-            closeCode == 1006) {
-            return NO;
-        }
-        return YES;
-    }
-    
-    if (closeCode >= 3000 && closeCode <= 3999) {
-        return YES;
-    }
-    
-    if (closeCode >= 4000 && closeCode <= 4999) {
-        return YES;
-    }
-
-    return NO;
-}
-
-//  Note from RFC:
-//
-//  If there is a body, the first two
-//  bytes of the body MUST be a 2-byte unsigned integer (in network byte
-//  order) representing a status code with value /code/ defined in
-//  Section 7.4.  Following the 2-byte integer the body MAY contain UTF-8
-//  encoded data with value /reason/, the interpretation of which is not
-//  defined by this specification.
-
-- (void)handleCloseWithData:(NSData *)data;
-{
-    size_t dataSize = data.length;
-    __block uint16_t closeCode = 0;
-    
-    SRFastLog(@"Received close frame");
-    
-    if (dataSize == 1) {
-        // TODO handle error
-        [self _closeWithProtocolError:@"Payload for close must be larger than 2 bytes"];
-        return;
-    } else if (dataSize >= 2) {
-        [data getBytes:&closeCode length:sizeof(closeCode)];
-        _closeCode = EndianU16_BtoN(closeCode);
-        if (!closeCodeIsValid(_closeCode)) {
-            [self _closeWithProtocolError:[NSString stringWithFormat:@"Cannot have close code of %d", _closeCode]];
-            return;
-        }
-        if (dataSize > 2) {
-            _closeReason = [[NSString alloc] initWithData:[data subdataWithRange:NSMakeRange(2, dataSize - 2)] encoding:NSUTF8StringEncoding];
-            if (!_closeReason) {
-                [self _closeWithProtocolError:@"Close reason MUST be valid UTF-8"];
-                return;
-            }
-        }
-    } else {
-        _closeCode = SRStatusNoStatusReceived;
-    }
-    
-    [self assertOnWorkQueue];
-    
-    if (self.readyState == SR_OPEN) {
-        [self closeWithCode:1000 reason:nil];
-    }
-    dispatch_async(_workQueue, ^{
-        [self _disconnect];
-    });
-}
-
-- (void)_disconnect;
-{
-    [self assertOnWorkQueue];
-    SRFastLog(@"Trying to disconnect");
-    _closeWhenFinishedWriting = YES;
-    [self _pumpWriting];
-}
-
-- (void)_handleFrameWithData:(NSData *)frameData opCode:(NSInteger)opcode;
-{                
-    // Check that the current data is valid UTF8
-    
-    BOOL isControlFrame = (opcode == SROpCodePing || opcode == SROpCodePong || opcode == SROpCodeConnectionClose);
-    if (!isControlFrame) {
-        [self _readFrameNew];
-    } else {
-        dispatch_async(_workQueue, ^{
-            [self _readFrameContinue];
-        });
-    }
-    
-    switch (opcode) {
-        case SROpCodeTextFrame: {
-            NSString *str = [[NSString alloc] initWithData:frameData encoding:NSUTF8StringEncoding];
-            if (str == nil && frameData) {
-                [self closeWithCode:SRStatusCodeInvalidUTF8 reason:@"Text frames must be valid UTF-8"];
-                dispatch_async(_workQueue, ^{
-                    [self _disconnect];
-                });
-
-                return;
-            }
-            [self _handleMessage:str];
-            break;
-        }
-        case SROpCodeBinaryFrame:
-            [self _handleMessage:[frameData copy]];
-            break;
-        case SROpCodeConnectionClose:
-            [self handleCloseWithData:frameData];
-            break;
-        case SROpCodePing:
-            [self handlePing:frameData];
-            break;
-        case SROpCodePong:
-            [self handlePong:frameData];
-            break;
-        default:
-            [self _closeWithProtocolError:[NSString stringWithFormat:@"Unknown opcode %ld", (long)opcode]];
-            // TODO: Handle invalid opcode
-            break;
-    }
-}
-
-- (void)_handleFrameHeader:(frame_header)frame_header curData:(NSData *)curData;
-{
-    assert(frame_header.opcode != 0);
-    
-    if (self.readyState != SR_OPEN) {
-        return;
-    }
-    
-    
-    BOOL isControlFrame = (frame_header.opcode == SROpCodePing || frame_header.opcode == SROpCodePong || frame_header.opcode == SROpCodeConnectionClose);
-    
-    if (isControlFrame && !frame_header.fin) {
-        [self _closeWithProtocolError:@"Fragmented control frames not allowed"];
-        return;
-    }
-    
-    if (isControlFrame && frame_header.payload_length >= 126) {
-        [self _closeWithProtocolError:@"Control frames cannot have payloads larger than 126 bytes"];
-        return;
-    }
-    
-    if (!isControlFrame) {
-        _currentFrameOpcode = frame_header.opcode;
-        _currentFrameCount += 1;
-    }
-    
-    if (frame_header.payload_length == 0) {
-        if (isControlFrame) {
-            [self _handleFrameWithData:curData opCode:frame_header.opcode];
-        } else {
-            if (frame_header.fin) {
-                [self _handleFrameWithData:_currentFrameData opCode:frame_header.opcode];
-            } else {
-                // TODO add assert that opcode is not a control;
-                [self _readFrameContinue];
-            }
-        }
-    } else {
-        assert(frame_header.payload_length <= SIZE_T_MAX);
-        [self _addConsumerWithDataLength:(size_t)frame_header.payload_length callback:^(SRWebSocket *self, NSData *newData) {
-            if (isControlFrame) {
-                [self _handleFrameWithData:newData opCode:frame_header.opcode];
-            } else {
-                if (frame_header.fin) {
-                    [self _handleFrameWithData:self->_currentFrameData opCode:frame_header.opcode];
-                } else {
-                    // TODO add assert that opcode is not a control;
-                    [self _readFrameContinue];
-                }
-                
-            }
-        } readToCurrentFrame:!isControlFrame unmaskBytes:frame_header.masked];
-    }
-}
-
-/* From RFC:
-
- 0                   1                   2                   3
- 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
- +-+-+-+-+-------+-+-------------+-------------------------------+
- |F|R|R|R| opcode|M| Payload len |    Extended payload length    |
- |I|S|S|S|  (4)  |A|     (7)     |             (16/64)           |
- |N|V|V|V|       |S|             |   (if payload len==126/127)   |
- | |1|2|3|       |K|             |                               |
- +-+-+-+-+-------+-+-------------+ - - - - - - - - - - - - - - - +
- |     Extended payload length continued, if payload len == 127  |
- + - - - - - - - - - - - - - - - +-------------------------------+
- |                               |Masking-key, if MASK set to 1  |
- +-------------------------------+-------------------------------+
- | Masking-key (continued)       |          Payload Data         |
- +-------------------------------- - - - - - - - - - - - - - - - +
- :                     Payload Data continued ...                :
- + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
- |                     Payload Data continued ...                |
- +---------------------------------------------------------------+
- */
-
-static const uint8_t SRFinMask          = 0x80;
-static const uint8_t SROpCodeMask       = 0x0F;
-static const uint8_t SRRsvMask          = 0x70;
-static const uint8_t SRMaskMask         = 0x80;
-static const uint8_t SRPayloadLenMask   = 0x7F;
-
-
-- (void)_readFrameContinue;
-{
-    assert((_currentFrameCount == 0 && _currentFrameOpcode == 0) || (_currentFrameCount > 0 && _currentFrameOpcode > 0));
-
-    [self _addConsumerWithDataLength:2 callback:^(SRWebSocket *self, NSData *data) {
-        __block frame_header header = {0};
-        
-        const uint8_t *headerBuffer = data.bytes;
-        assert(data.length >= 2);
-        
-        if (headerBuffer[0] & SRRsvMask) {
-            [self _closeWithProtocolError:@"Server used RSV bits"];
-            return;
-        }
-        
-        uint8_t receivedOpcode = (SROpCodeMask & headerBuffer[0]);
-        
-        BOOL isControlFrame = (receivedOpcode == SROpCodePing || receivedOpcode == SROpCodePong || receivedOpcode == SROpCodeConnectionClose);
-        
-        if (!isControlFrame && receivedOpcode != 0 && self->_currentFrameCount > 0) {
-            [self _closeWithProtocolError:@"all data frames after the initial data frame must have opcode 0"];
-            return;
-        }
-        
-        if (receivedOpcode == 0 && self->_currentFrameCount == 0) {
-            [self _closeWithProtocolError:@"cannot continue a message"];
-            return;
-        }
-        
-        header.opcode = receivedOpcode == 0 ? self->_currentFrameOpcode : receivedOpcode;
-        
-        header.fin = !!(SRFinMask & headerBuffer[0]);
-        
-        
-        header.masked = !!(SRMaskMask & headerBuffer[1]);
-        header.payload_length = SRPayloadLenMask & headerBuffer[1];
-        
-        headerBuffer = NULL;
-        
-        if (header.masked) {
-            [self _closeWithProtocolError:@"Client must receive unmasked data"];
-        }
-        
-        size_t extra_bytes_needed = header.masked ? sizeof(_currentReadMaskKey) : 0;
-        
-        if (header.payload_length == 126) {
-            extra_bytes_needed += sizeof(uint16_t);
-        } else if (header.payload_length == 127) {
-            extra_bytes_needed += sizeof(uint64_t);
-        }
-        
-        if (extra_bytes_needed == 0) {
-            [self _handleFrameHeader:header curData:self->_currentFrameData];
-        } else {
-            [self _addConsumerWithDataLength:extra_bytes_needed callback:^(SRWebSocket *self, NSData *data) {
-                size_t mapped_size = data.length;
-                const void *mapped_buffer = data.bytes;
-                size_t offset = 0;
-                
-                if (header.payload_length == 126) {
-                    assert(mapped_size >= sizeof(uint16_t));
-                    uint16_t newLen = EndianU16_BtoN(*(uint16_t *)(mapped_buffer));
-                    header.payload_length = newLen;
-                    offset += sizeof(uint16_t);
-                } else if (header.payload_length == 127) {
-                    assert(mapped_size >= sizeof(uint64_t));
-                    header.payload_length = EndianU64_BtoN(*(uint64_t *)(mapped_buffer));
-                    offset += sizeof(uint64_t);
-                } else {
-                    assert(header.payload_length < 126 && header.payload_length >= 0);
-                }
-                
-                
-                if (header.masked) {
-                    assert(mapped_size >= sizeof(_currentReadMaskOffset) + offset);
-                    memcpy(self->_currentReadMaskKey, ((uint8_t *)mapped_buffer) + offset, sizeof(self->_currentReadMaskKey));
-                }
-                
-                [self _handleFrameHeader:header curData:self->_currentFrameData];
-            } readToCurrentFrame:NO unmaskBytes:NO];
-        }
-    } readToCurrentFrame:NO unmaskBytes:NO];
-}
-
-- (void)_readFrameNew;
-{
-    dispatch_async(_workQueue, ^{
-        [_currentFrameData setLength:0];
-        
-        _currentFrameOpcode = 0;
-        _currentFrameCount = 0;
-        _readOpCount = 0;
-        _currentStringScanPosition = 0;
-        
-        [self _readFrameContinue];
-    });
-}
-
-- (void)_pumpWriting;
-{
-    [self assertOnWorkQueue];
-    
-    NSUInteger dataLength = _outputBuffer.length;
-    if (dataLength - _outputBufferOffset > 0 && _outputStream.hasSpaceAvailable) {
-        NSInteger bytesWritten = [_outputStream write:_outputBuffer.bytes + _outputBufferOffset maxLength:dataLength - _outputBufferOffset];
-        if (bytesWritten == -1) {
-            [self _failWithError:[NSError errorWithDomain:SRWebSocketErrorDomain code:2145 userInfo:[NSDictionary dictionaryWithObject:@"Error writing to stream" forKey:NSLocalizedDescriptionKey]]];
-             return;
-        }
-        
-        _outputBufferOffset += bytesWritten;
-        
-        if (_outputBufferOffset > 4096 && _outputBufferOffset > (_outputBuffer.length >> 1)) {
-            _outputBuffer = [[NSMutableData alloc] initWithBytes:(char *)_outputBuffer.bytes + _outputBufferOffset length:_outputBuffer.length - _outputBufferOffset];
-            _outputBufferOffset = 0;
-        }
-    }
-    
-    if (_closeWhenFinishedWriting && 
-        _outputBuffer.length - _outputBufferOffset == 0 && 
-        (_inputStream.streamStatus != NSStreamStatusNotOpen &&
-         _inputStream.streamStatus != NSStreamStatusClosed) &&
-        !_sentClose) {
-        _sentClose = YES;
-            
-        [_outputStream close];
-        [_inputStream close];
-        
-        
-        for (NSArray *runLoop in [_scheduledRunloops copy]) {
-            [self unscheduleFromRunLoop:[runLoop objectAtIndex:0] forMode:[runLoop objectAtIndex:1]];
-        }
-        
-        if (!_failed) {
-            [self _performDelegateBlock:^{
-                if ([self.delegate respondsToSelector:@selector(webSocket:didCloseWithCode:reason:wasClean:)]) {
-                    [self.delegate webSocket:self didCloseWithCode:_closeCode reason:_closeReason wasClean:YES];
-                }
-            }];
-        }
-        
-        _selfRetain = nil;
-    }
-}
-
-- (void)_addConsumerWithScanner:(stream_scanner)consumer callback:(data_callback)callback;
-{
-    [self assertOnWorkQueue];
-    [self _addConsumerWithScanner:consumer callback:callback dataLength:0];
-}
-
-- (void)_addConsumerWithDataLength:(size_t)dataLength callback:(data_callback)callback readToCurrentFrame:(BOOL)readToCurrentFrame unmaskBytes:(BOOL)unmaskBytes;
-{   
-    [self assertOnWorkQueue];
-    assert(dataLength);
-    
-    [_consumers addObject:[_consumerPool consumerWithScanner:nil handler:callback bytesNeeded:dataLength readToCurrentFrame:readToCurrentFrame unmaskBytes:unmaskBytes]];
-    [self _pumpScanner];
-}
-
-- (void)_addConsumerWithScanner:(stream_scanner)consumer callback:(data_callback)callback dataLength:(size_t)dataLength;
-{    
-    [self assertOnWorkQueue];
-    [_consumers addObject:[_consumerPool consumerWithScanner:consumer handler:callback bytesNeeded:dataLength readToCurrentFrame:NO unmaskBytes:NO]];
-    [self _pumpScanner];
-}
-
-
-static const char CRLFCRLFBytes[] = {'\r', '\n', '\r', '\n'};
-
-- (void)_readUntilHeaderCompleteWithCallback:(data_callback)dataHandler;
-{
-    [self _readUntilBytes:CRLFCRLFBytes length:sizeof(CRLFCRLFBytes) callback:dataHandler];
-}
-
-- (void)_readUntilBytes:(const void *)bytes length:(size_t)length callback:(data_callback)dataHandler;
-{
-    // TODO optimize so this can continue from where we last searched
-    stream_scanner consumer = ^size_t(NSData *data) {
-        __block size_t found_size = 0;
-        __block size_t match_count = 0;
-        
-        size_t size = data.length;
-        const unsigned char *buffer = data.bytes;
-        for (size_t i = 0; i < size; i++ ) {
-            if (((const unsigned char *)buffer)[i] == ((const unsigned char *)bytes)[match_count]) {
-                match_count += 1;
-                if (match_count == length) {
-                    found_size = i + 1;
-                    break;
-                }
-            } else {
-                match_count = 0;
-            }
-        }
-        return found_size;
-    };
-    [self _addConsumerWithScanner:consumer callback:dataHandler];
-}
-
-
-// Returns true if did work
-- (BOOL)_innerPumpScanner {
-    
-    BOOL didWork = NO;
-    
-    if (self.readyState >= SR_CLOSING) {
-        return didWork;
-    }
-    
-    if (!_consumers.count) {
-        return didWork;
-    }
-    
-    size_t curSize = _readBuffer.length - _readBufferOffset;
-    if (!curSize) {
-        return didWork;
-    }
-    
-    SRIOConsumer *consumer = [_consumers objectAtIndex:0];
-    
-    size_t bytesNeeded = consumer.bytesNeeded;
-    
-    size_t foundSize = 0;
-    if (consumer.consumer) {
-        NSData *tempView = [NSData dataWithBytesNoCopy:(char *)_readBuffer.bytes + _readBufferOffset length:_readBuffer.length - _readBufferOffset freeWhenDone:NO];  
-        foundSize = consumer.consumer(tempView);
-    } else {
-        assert(consumer.bytesNeeded);
-        if (curSize >= bytesNeeded) {
-            foundSize = bytesNeeded;
-        } else if (consumer.readToCurrentFrame) {
-            foundSize = curSize;
-        }
-    }
-    
-    NSData *slice = nil;
-    if (consumer.readToCurrentFrame || foundSize) {
-        NSRange sliceRange = NSMakeRange(_readBufferOffset, foundSize);
-        slice = [_readBuffer subdataWithRange:sliceRange];
-        
-        _readBufferOffset += foundSize;
-        
-        if (_readBufferOffset > 4096 && _readBufferOffset > (_readBuffer.length >> 1)) {
-            _readBuffer = [[NSMutableData alloc] initWithBytes:(char *)_readBuffer.bytes + _readBufferOffset length:_readBuffer.length - _readBufferOffset];            _readBufferOffset = 0;
-        }
-        
-        if (consumer.unmaskBytes) {
-            NSMutableData *mutableSlice = [slice mutableCopy];
-            
-            NSUInteger len = mutableSlice.length;
-            uint8_t *bytes = mutableSlice.mutableBytes;
-            
-            for (NSUInteger i = 0; i < len; i++) {
-                bytes[i] = bytes[i] ^ _currentReadMaskKey[_currentReadMaskOffset % sizeof(_currentReadMaskKey)];
-                _currentReadMaskOffset += 1;
-            }
-            
-            slice = mutableSlice;
-        }
-        
-        if (consumer.readToCurrentFrame) {
-            [_currentFrameData appendData:slice];
-            
-            _readOpCount += 1;
-            
-            if (_currentFrameOpcode == SROpCodeTextFrame) {
-                // Validate UTF8 stuff.
-                size_t currentDataSize = _currentFrameData.length;
-                if (_currentFrameOpcode == SROpCodeTextFrame && currentDataSize > 0) {
-                    // TODO: Optimize the crap out of this.  Don't really have to copy all the data each time
-                    
-                    size_t scanSize = currentDataSize - _currentStringScanPosition;
-                    
-                    NSData *scan_data = [_currentFrameData subdataWithRange:NSMakeRange(_currentStringScanPosition, scanSize)];
-                    int32_t valid_utf8_size = validate_dispatch_data_partial_string(scan_data);
-                    
-                    if (valid_utf8_size == -1) {
-                        [self closeWithCode:SRStatusCodeInvalidUTF8 reason:@"Text frames must be valid UTF-8"];
-                        dispatch_async(_workQueue, ^{
-                            [self _disconnect];
-                        });
-                        return didWork;
-                    } else {
-                        _currentStringScanPosition += valid_utf8_size;
-                    }
-                } 
-                
-            }
-            
-            consumer.bytesNeeded -= foundSize;
-            
-            if (consumer.bytesNeeded == 0) {
-                [_consumers removeObjectAtIndex:0];
-                consumer.handler(self, nil);
-                [_consumerPool returnConsumer:consumer];
-                didWork = YES;
-            }
-        } else if (foundSize) {
-            [_consumers removeObjectAtIndex:0];
-            consumer.handler(self, slice);
-            [_consumerPool returnConsumer:consumer];
-            didWork = YES;
-        }
-    }
-    return didWork;
-}
-
--(void)_pumpScanner;
-{
-    [self assertOnWorkQueue];
-    
-    if (!_isPumping) {
-        _isPumping = YES;
-    } else {
-        return;
-    }
-    
-    while ([self _innerPumpScanner]) {
-        
-    }
-    
-    _isPumping = NO;
-}
-
-//#define NOMASK
-
-static const size_t SRFrameHeaderOverhead = 32;
-
-- (void)_sendFrameWithOpcode:(SROpCode)opcode data:(id)data;
-{
-    [self assertOnWorkQueue];
-    
-    if (nil == data) {
-        return;
-    }
-    
-    NSAssert([data isKindOfClass:[NSData class]] || [data isKindOfClass:[NSString class]], @"NSString or NSData");
-    
-    size_t payloadLength = [data isKindOfClass:[NSString class]] ? [(NSString *)data lengthOfBytesUsingEncoding:NSUTF8StringEncoding] : [data length];
-        
-    NSMutableData *frame = [[NSMutableData alloc] initWithLength:payloadLength + SRFrameHeaderOverhead];
-    if (!frame) {
-        [self closeWithCode:SRStatusCodeMessageTooBig reason:@"Message too big"];
-        return;
-    }
-    uint8_t *frame_buffer = (uint8_t *)[frame mutableBytes];
-    
-    // set fin
-    frame_buffer[0] = SRFinMask | opcode;
-    
-    BOOL useMask = YES;
-#ifdef NOMASK
-    useMask = NO;
-#endif
-    
-    if (useMask) {
-    // set the mask and header
-        frame_buffer[1] |= SRMaskMask;
-    }
-    
-    size_t frame_buffer_size = 2;
-    
-    const uint8_t *unmasked_payload = NULL;
-    if ([data isKindOfClass:[NSData class]]) {
-        unmasked_payload = (uint8_t *)[data bytes];
-    } else if ([data isKindOfClass:[NSString class]]) {
-        unmasked_payload =  (const uint8_t *)[data UTF8String];
-    } else {
-        return;
-    }
-    
-    if (payloadLength < 126) {
-        frame_buffer[1] |= payloadLength;
-    } else if (payloadLength <= UINT16_MAX) {
-        frame_buffer[1] |= 126;
-        *((uint16_t *)(frame_buffer + frame_buffer_size)) = EndianU16_BtoN((uint16_t)payloadLength);
-        frame_buffer_size += sizeof(uint16_t);
-    } else {
-        frame_buffer[1] |= 127;
-        *((uint64_t *)(frame_buffer + frame_buffer_size)) = EndianU64_BtoN((uint64_t)payloadLength);
-        frame_buffer_size += sizeof(uint64_t);
-    }
-        
-    if (!useMask) {
-        for (size_t i = 0; i < payloadLength; i++) {
-            frame_buffer[frame_buffer_size] = unmasked_payload[i];
-            frame_buffer_size += 1;
-        }
-    } else {
-        uint8_t *mask_key = frame_buffer + frame_buffer_size;
-        BOOL success = !SecRandomCopyBytes(kSecRandomDefault, sizeof(uint32_t), (uint8_t *)mask_key);
-        assert(success);
-        frame_buffer_size += sizeof(uint32_t);
-        
-        // TODO: could probably optimize this with SIMD
-        for (size_t i = 0; i < payloadLength; i++) {
-            frame_buffer[frame_buffer_size] = unmasked_payload[i] ^ mask_key[i % sizeof(uint32_t)];
-            frame_buffer_size += 1;
-        }
-    }
-
-    assert(frame_buffer_size <= [frame length]);
-    frame.length = frame_buffer_size;
-    
-    [self _writeData:frame];
-}
-
-- (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode;
-{
-    if (_secure && !_pinnedCertFound && (eventCode == NSStreamEventHasBytesAvailable || eventCode == NSStreamEventHasSpaceAvailable)) {
-        
-        NSArray *sslCerts = [_urlRequest SR_SSLPinnedCertificates];
-        if (sslCerts) {
-            SecTrustRef secTrust = (__bridge SecTrustRef)[aStream propertyForKey:(__bridge id)kCFStreamPropertySSLPeerTrust];
-            if (secTrust) {
-                NSInteger numCerts = SecTrustGetCertificateCount(secTrust);
-                for (NSInteger i = 0; i < numCerts && !_pinnedCertFound; i++) {
-                    SecCertificateRef cert = SecTrustGetCertificateAtIndex(secTrust, i);
-                    NSData *certData = CFBridgingRelease(SecCertificateCopyData(cert));
-                    
-                    for (id ref in sslCerts) {
-                        SecCertificateRef trustedCert = (__bridge SecCertificateRef)ref;
-                        NSData *trustedCertData = CFBridgingRelease(SecCertificateCopyData(trustedCert));
-                        
-                        if ([trustedCertData isEqualToData:certData]) {
-                            _pinnedCertFound = YES;
-                            break;
-                        }
-                    }
-                }
-            }
-            
-            if (!_pinnedCertFound) {
-                dispatch_async(_workQueue, ^{
-                    [self _failWithError:[NSError errorWithDomain:SRWebSocketErrorDomain code:23556 userInfo:[NSDictionary dictionaryWithObject:[NSString stringWithFormat:@"Invalid server cert"] forKey:NSLocalizedDescriptionKey]]];
-                });
-                return;
-            }
-        }
-    }
-
-    dispatch_async(_workQueue, ^{
-        switch (eventCode) {
-            case NSStreamEventOpenCompleted: {
-                SRFastLog(@"NSStreamEventOpenCompleted %@", aStream);
-                if (self.readyState >= SR_CLOSING) {
-                    return;
-                }
-                assert(_readBuffer);
-                
-                if (self.readyState == SR_CONNECTING && aStream == _inputStream) {
-                    [self didConnect];
-                }
-                [self _pumpWriting];
-                [self _pumpScanner];
-                break;
-            }
-                
-            case NSStreamEventErrorOccurred: {
-                SRFastLog(@"NSStreamEventErrorOccurred %@ %@", aStream, [[aStream streamError] copy]);
-                /// TODO specify error better!
-                [self _failWithError:aStream.streamError];
-                _readBufferOffset = 0;
-                [_readBuffer setLength:0];
-                break;
-                
-            }
-                
-            case NSStreamEventEndEncountered: {
-                [self _pumpScanner];
-                SRFastLog(@"NSStreamEventEndEncountered %@", aStream);
-                if (aStream.streamError) {
-                    [self _failWithError:aStream.streamError];
-                } else {
-                    if (self.readyState != SR_CLOSED) {
-                        self.readyState = SR_CLOSED;
-                        _selfRetain = nil;
-                    }
-
-                    if (!_sentClose && !_failed) {
-                        _sentClose = YES;
-                        // If we get closed in this state it's probably not clean because we should be sending this when we send messages
-                        [self _performDelegateBlock:^{
-                            if ([self.delegate respondsToSelector:@selector(webSocket:didCloseWithCode:reason:wasClean:)]) {
-                                [self.delegate webSocket:self didCloseWithCode:SRStatusCodeGoingAway reason:@"Stream end encountered" wasClean:NO];
-                            }
-                        }];
-                    }
-                }
-                
-                break;
-            }
-                
-            case NSStreamEventHasBytesAvailable: {
-                SRFastLog(@"NSStreamEventHasBytesAvailable %@", aStream);
-                const int bufferSize = 2048;
-                uint8_t buffer[bufferSize];
-                
-                while (_inputStream.hasBytesAvailable) {
-                    NSInteger bytes_read = [_inputStream read:buffer maxLength:bufferSize];
-                    
-                    if (bytes_read > 0) {
-                        [_readBuffer appendBytes:buffer length:bytes_read];
-                    } else if (bytes_read < 0) {
-                        [self _failWithError:_inputStream.streamError];
-                    }
-                    
-                    if (bytes_read != bufferSize) {
-                        break;
-                    }
-                };
-                [self _pumpScanner];
-                break;
-            }
-                
-            case NSStreamEventHasSpaceAvailable: {
-                SRFastLog(@"NSStreamEventHasSpaceAvailable %@", aStream);
-                [self _pumpWriting];
-                break;
-            }
-                
-            default:
-                SRFastLog(@"(default)  %@", aStream);
-                break;
-        }
-    });
-}
-
-@end
-
-
-@implementation SRIOConsumer
-
-@synthesize bytesNeeded = _bytesNeeded;
-@synthesize consumer = _scanner;
-@synthesize handler = _handler;
-@synthesize readToCurrentFrame = _readToCurrentFrame;
-@synthesize unmaskBytes = _unmaskBytes;
-
-- (void)setupWithScanner:(stream_scanner)scanner handler:(data_callback)handler bytesNeeded:(size_t)bytesNeeded readToCurrentFrame:(BOOL)readToCurrentFrame unmaskBytes:(BOOL)unmaskBytes;
-{
-    _scanner = [scanner copy];
-    _handler = [handler copy];
-    _bytesNeeded = bytesNeeded;
-    _readToCurrentFrame = readToCurrentFrame;
-    _unmaskBytes = unmaskBytes;
-    assert(_scanner || _bytesNeeded);
-}
-
-
-@end
-
-
-@implementation SRIOConsumerPool {
-    NSUInteger _poolSize;
-    NSMutableArray *_bufferedConsumers;
-}
-
-- (id)initWithBufferCapacity:(NSUInteger)poolSize;
-{
-    self = [super init];
-    if (self) {
-        _poolSize = poolSize;
-        _bufferedConsumers = [[NSMutableArray alloc] initWithCapacity:poolSize];
-    }
-    return self;
-}
-
-- (id)init
-{
-    return [self initWithBufferCapacity:8];
-}
-
-- (SRIOConsumer *)consumerWithScanner:(stream_scanner)scanner handler:(data_callback)handler bytesNeeded:(size_t)bytesNeeded readToCurrentFrame:(BOOL)readToCurrentFrame unmaskBytes:(BOOL)unmaskBytes;
-{
-    SRIOConsumer *consumer = nil;
-    if (_bufferedConsumers.count) {
-        consumer = [_bufferedConsumers lastObject];
-        [_bufferedConsumers removeLastObject];
-    } else {
-        consumer = [[SRIOConsumer alloc] init];
-    }
-    
-    [consumer setupWithScanner:scanner handler:handler bytesNeeded:bytesNeeded readToCurrentFrame:readToCurrentFrame unmaskBytes:unmaskBytes];
-    
-    return consumer;
-}
-
-- (void)returnConsumer:(SRIOConsumer *)consumer;
-{
-    if (_bufferedConsumers.count < _poolSize) {
-        [_bufferedConsumers addObject:consumer];
-    }
-}
-
-@end
-
-
-@implementation  NSURLRequest (CertificateAdditions)
-
-- (NSArray *)SR_SSLPinnedCertificates;
-{
-    return [NSURLProtocol propertyForKey:@"SR_SSLPinnedCertificates" inRequest:self];
-}
-
-@end
-
-@implementation  NSMutableURLRequest (CertificateAdditions)
-
-- (NSArray *)SR_SSLPinnedCertificates;
-{
-    return [NSURLProtocol propertyForKey:@"SR_SSLPinnedCertificates" inRequest:self];
-}
-
-- (void)setSR_SSLPinnedCertificates:(NSArray *)SR_SSLPinnedCertificates;
-{
-    [NSURLProtocol setProperty:SR_SSLPinnedCertificates forKey:@"SR_SSLPinnedCertificates" inRequest:self];
-}
-
-@end
-
-@implementation NSURL (SRWebSocket)
-
-- (NSString *)SR_origin;
-{
-    NSString *scheme = [self.scheme lowercaseString];
-        
-    if ([scheme isEqualToString:@"wss"]) {
-        scheme = @"https";
-    } else if ([scheme isEqualToString:@"ws"]) {
-        scheme = @"http";
-    }
-    
-    if (self.port) {
-        return [NSString stringWithFormat:@"%@://%@:%@/", scheme, self.host, self.port];
-    } else {
-        return [NSString stringWithFormat:@"%@://%@/", scheme, self.host];
-    }
-}
-
-@end
-
-//#define SR_ENABLE_LOG
-
-static inline void SRFastLog(NSString *format, ...)  {
-#ifdef SR_ENABLE_LOG
-    __block va_list arg_list;
-    va_start (arg_list, format);
-    
-    NSString *formattedString = [[NSString alloc] initWithFormat:format arguments:arg_list];
-    
-    va_end(arg_list);
-    
-    NSLog(@"[SR] %@", formattedString);
-#endif
-}
-
-
-#ifdef HAS_ICU
-
-static inline int32_t validate_dispatch_data_partial_string(NSData *data) {
-    if ([data length] > INT32_MAX) {
-        // INT32_MAX is the limit so long as this Framework is using 32 bit ints everywhere.
-        return -1;
-    }
-
-    int32_t size = (int32_t)[data length];
-
-    const void * contents = [data bytes];
-    const uint8_t *str = (const uint8_t *)contents;
-    
-    UChar32 codepoint = 1;
-    int32_t offset = 0;
-    int32_t lastOffset = 0;
-    while(offset < size && codepoint > 0)  {
-        lastOffset = offset;
-        U8_NEXT(str, offset, size, codepoint);
-    }
-    
-    if (codepoint == -1) {
-        // Check to see if the last byte is valid or whether it was just continuing
-        if (!U8_IS_LEAD(str[lastOffset]) || U8_COUNT_TRAIL_BYTES(str[lastOffset]) + lastOffset < (int32_t)size) {
-            
-            size = -1;
-        } else {
-            uint8_t leadByte = str[lastOffset];
-            U8_MASK_LEAD_BYTE(leadByte, U8_COUNT_TRAIL_BYTES(leadByte));
-            
-            for (int i = lastOffset + 1; i < offset; i++) {
-                if (U8_IS_SINGLE(str[i]) || U8_IS_LEAD(str[i]) || !U8_IS_TRAIL(str[i])) {
-                    size = -1;
-                }
-            }
-            
-            if (size != -1) {
-                size = lastOffset;
-            }
-        }
-    }
-    
-    if (size != -1 && ![[NSString alloc] initWithBytesNoCopy:(char *)[data bytes] length:size encoding:NSUTF8StringEncoding freeWhenDone:NO]) {
-        size = -1;
-    }
-    
-    return size;
-}
-
-#else
-
-// This is a hack, and probably not optimal
-static inline int32_t validate_dispatch_data_partial_string(NSData *data) {
-    static const int maxCodepointSize = 3;
-    
-    for (int i = 0; i < maxCodepointSize; i++) {
-        NSString *str = [[NSString alloc] initWithBytesNoCopy:(char *)data.bytes length:data.length - i encoding:NSUTF8StringEncoding freeWhenDone:NO];
-        if (str) {
-            return data.length - i;
-        }
-    }
-    
-    return -1;
-}
-
-#endif
-
-static _SRRunLoopThread *networkThread = nil;
-static NSRunLoop *networkRunLoop = nil;
-
-@implementation NSRunLoop (SRWebSocket)
-
-+ (NSRunLoop *)SR_networkRunLoop {
-    static dispatch_once_t onceToken;
-    dispatch_once(&onceToken, ^{
-        networkThread = [[_SRRunLoopThread alloc] init];
-        networkThread.name = @"com.squareup.SocketRocket.NetworkThread";
-        [networkThread start];
-        networkRunLoop = networkThread.runLoop;
-    });
-    
-    return networkRunLoop;
-}
-
-@end
-
-
-@implementation _SRRunLoopThread {
-    dispatch_group_t _waitGroup;
-}
-
-@synthesize runLoop = _runLoop;
-
-- (void)dealloc
-{
-    sr_dispatch_release(_waitGroup);
-}
-
-- (id)init
-{
-    self = [super init];
-    if (self) {
-        _waitGroup = dispatch_group_create();
-        dispatch_group_enter(_waitGroup);
-    }
-    return self;
-}
-
-- (void)main;
-{
-    @autoreleasepool {
-        _runLoop = [NSRunLoop currentRunLoop];
-        dispatch_group_leave(_waitGroup);
-        
-        NSTimer *timer = [[NSTimer alloc] initWithFireDate:[NSDate distantFuture] interval:0.0 target:nil selector:nil userInfo:nil repeats:NO];
-        [_runLoop addTimer:timer forMode:NSDefaultRunLoopMode];
-        
-        while ([_runLoop runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]) {
-            
-        }
-        assert(NO);
-    }
-}
-
-- (NSRunLoop *)runLoop;
-{
-    dispatch_group_wait(_waitGroup, DISPATCH_TIME_FOREVER);
-    return _runLoop;
-}
-
-@end
diff --git a/examples/objc/Icon-120.png b/examples/objc/Icon-120.png
deleted file mode 100644
index 938fef4..0000000
--- a/examples/objc/Icon-120.png
+++ /dev/null
Binary files differ
diff --git a/examples/objc/Icon-180.png b/examples/objc/Icon-180.png
deleted file mode 100644
index a5b7609..0000000
--- a/examples/objc/Icon-180.png
+++ /dev/null
Binary files differ
diff --git a/examples/objc/Icon.png b/examples/objc/Icon.png
deleted file mode 100644
index 55773ca..0000000
--- a/examples/objc/Icon.png
+++ /dev/null
Binary files differ
diff --git a/examples/objc/README b/examples/objc/README
deleted file mode 100644
index bfe18b3..0000000
--- a/examples/objc/README
+++ /dev/null
@@ -1,3 +0,0 @@
-This directory contains sample iOS and mac clients for http://apprtc.appspot.com
-
-See ../../app/webrtc/objc/README for information on how to use it.
diff --git a/examples/peerconnection/OWNERS b/examples/peerconnection/OWNERS
deleted file mode 100644
index 0fba125..0000000
--- a/examples/peerconnection/OWNERS
+++ /dev/null
@@ -1 +0,0 @@
-tommi@webrtc.org
diff --git a/examples/peerconnection/client/conductor.cc b/examples/peerconnection/client/conductor.cc
deleted file mode 100644
index 8a1b9a2..0000000
--- a/examples/peerconnection/client/conductor.cc
+++ /dev/null
@@ -1,546 +0,0 @@
-/*
- *  Copyright 2012 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/examples/peerconnection/client/conductor.h"
-
-#include <memory>
-#include <utility>
-#include <vector>
-
-#include "webrtc/api/test/fakeconstraints.h"
-#include "webrtc/examples/peerconnection/client/defaults.h"
-#include "webrtc/media/engine/webrtcvideocapturerfactory.h"
-#include "webrtc/modules/video_capture/video_capture_factory.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/json.h"
-#include "webrtc/rtc_base/logging.h"
-
-// Names used for a IceCandidate JSON object.
-const char kCandidateSdpMidName[] = "sdpMid";
-const char kCandidateSdpMlineIndexName[] = "sdpMLineIndex";
-const char kCandidateSdpName[] = "candidate";
-
-// Names used for a SessionDescription JSON object.
-const char kSessionDescriptionTypeName[] = "type";
-const char kSessionDescriptionSdpName[] = "sdp";
-
-#define DTLS_ON  true
-#define DTLS_OFF false
-
-class DummySetSessionDescriptionObserver
-    : public webrtc::SetSessionDescriptionObserver {
- public:
-  static DummySetSessionDescriptionObserver* Create() {
-    return
-        new rtc::RefCountedObject<DummySetSessionDescriptionObserver>();
-  }
-  virtual void OnSuccess() {
-    LOG(INFO) << __FUNCTION__;
-  }
-  virtual void OnFailure(const std::string& error) {
-    LOG(INFO) << __FUNCTION__ << " " << error;
-  }
-
- protected:
-  DummySetSessionDescriptionObserver() {}
-  ~DummySetSessionDescriptionObserver() {}
-};
-
-Conductor::Conductor(PeerConnectionClient* client, MainWindow* main_wnd)
-  : peer_id_(-1),
-    loopback_(false),
-    client_(client),
-    main_wnd_(main_wnd) {
-  client_->RegisterObserver(this);
-  main_wnd->RegisterObserver(this);
-}
-
-Conductor::~Conductor() {
-  RTC_DCHECK(peer_connection_.get() == NULL);
-}
-
-bool Conductor::connection_active() const {
-  return peer_connection_.get() != NULL;
-}
-
-void Conductor::Close() {
-  client_->SignOut();
-  DeletePeerConnection();
-}
-
-bool Conductor::InitializePeerConnection() {
-  RTC_DCHECK(peer_connection_factory_.get() == NULL);
-  RTC_DCHECK(peer_connection_.get() == NULL);
-
-  peer_connection_factory_  = webrtc::CreatePeerConnectionFactory();
-
-  if (!peer_connection_factory_.get()) {
-    main_wnd_->MessageBox("Error",
-        "Failed to initialize PeerConnectionFactory", true);
-    DeletePeerConnection();
-    return false;
-  }
-
-  if (!CreatePeerConnection(DTLS_ON)) {
-    main_wnd_->MessageBox("Error",
-        "CreatePeerConnection failed", true);
-    DeletePeerConnection();
-  }
-  AddStreams();
-  return peer_connection_.get() != NULL;
-}
-
-bool Conductor::ReinitializePeerConnectionForLoopback() {
-  loopback_ = true;
-  rtc::scoped_refptr<webrtc::StreamCollectionInterface> streams(
-      peer_connection_->local_streams());
-  peer_connection_ = NULL;
-  if (CreatePeerConnection(DTLS_OFF)) {
-    for (size_t i = 0; i < streams->count(); ++i)
-      peer_connection_->AddStream(streams->at(i));
-    peer_connection_->CreateOffer(this, NULL);
-  }
-  return peer_connection_.get() != NULL;
-}
-
-bool Conductor::CreatePeerConnection(bool dtls) {
-  RTC_DCHECK(peer_connection_factory_.get() != NULL);
-  RTC_DCHECK(peer_connection_.get() == NULL);
-
-  webrtc::PeerConnectionInterface::RTCConfiguration config;
-  webrtc::PeerConnectionInterface::IceServer server;
-  server.uri = GetPeerConnectionString();
-  config.servers.push_back(server);
-
-  webrtc::FakeConstraints constraints;
-  if (dtls) {
-    constraints.AddOptional(webrtc::MediaConstraintsInterface::kEnableDtlsSrtp,
-                            "true");
-  } else {
-    constraints.AddOptional(webrtc::MediaConstraintsInterface::kEnableDtlsSrtp,
-                            "false");
-  }
-
-  peer_connection_ = peer_connection_factory_->CreatePeerConnection(
-      config, &constraints, NULL, NULL, this);
-  return peer_connection_.get() != NULL;
-}
-
-void Conductor::DeletePeerConnection() {
-  peer_connection_ = NULL;
-  active_streams_.clear();
-  main_wnd_->StopLocalRenderer();
-  main_wnd_->StopRemoteRenderer();
-  peer_connection_factory_ = NULL;
-  peer_id_ = -1;
-  loopback_ = false;
-}
-
-void Conductor::EnsureStreamingUI() {
-  RTC_DCHECK(peer_connection_.get() != NULL);
-  if (main_wnd_->IsWindow()) {
-    if (main_wnd_->current_ui() != MainWindow::STREAMING)
-      main_wnd_->SwitchToStreamingUI();
-  }
-}
-
-//
-// PeerConnectionObserver implementation.
-//
-
-// Called when a remote stream is added
-void Conductor::OnAddStream(
-    rtc::scoped_refptr<webrtc::MediaStreamInterface> stream) {
-  LOG(INFO) << __FUNCTION__ << " " << stream->label();
-  main_wnd_->QueueUIThreadCallback(NEW_STREAM_ADDED, stream.release());
-}
-
-void Conductor::OnRemoveStream(
-    rtc::scoped_refptr<webrtc::MediaStreamInterface> stream) {
-  LOG(INFO) << __FUNCTION__ << " " << stream->label();
-  main_wnd_->QueueUIThreadCallback(STREAM_REMOVED, stream.release());
-}
-
-void Conductor::OnIceCandidate(const webrtc::IceCandidateInterface* candidate) {
-  LOG(INFO) << __FUNCTION__ << " " << candidate->sdp_mline_index();
-  // For loopback test. To save some connecting delay.
-  if (loopback_) {
-    if (!peer_connection_->AddIceCandidate(candidate)) {
-      LOG(WARNING) << "Failed to apply the received candidate";
-    }
-    return;
-  }
-
-  Json::StyledWriter writer;
-  Json::Value jmessage;
-
-  jmessage[kCandidateSdpMidName] = candidate->sdp_mid();
-  jmessage[kCandidateSdpMlineIndexName] = candidate->sdp_mline_index();
-  std::string sdp;
-  if (!candidate->ToString(&sdp)) {
-    LOG(LS_ERROR) << "Failed to serialize candidate";
-    return;
-  }
-  jmessage[kCandidateSdpName] = sdp;
-  SendMessage(writer.write(jmessage));
-}
-
-//
-// PeerConnectionClientObserver implementation.
-//
-
-void Conductor::OnSignedIn() {
-  LOG(INFO) << __FUNCTION__;
-  main_wnd_->SwitchToPeerList(client_->peers());
-}
-
-void Conductor::OnDisconnected() {
-  LOG(INFO) << __FUNCTION__;
-
-  DeletePeerConnection();
-
-  if (main_wnd_->IsWindow())
-    main_wnd_->SwitchToConnectUI();
-}
-
-void Conductor::OnPeerConnected(int id, const std::string& name) {
-  LOG(INFO) << __FUNCTION__;
-  // Refresh the list if we're showing it.
-  if (main_wnd_->current_ui() == MainWindow::LIST_PEERS)
-    main_wnd_->SwitchToPeerList(client_->peers());
-}
-
-void Conductor::OnPeerDisconnected(int id) {
-  LOG(INFO) << __FUNCTION__;
-  if (id == peer_id_) {
-    LOG(INFO) << "Our peer disconnected";
-    main_wnd_->QueueUIThreadCallback(PEER_CONNECTION_CLOSED, NULL);
-  } else {
-    // Refresh the list if we're showing it.
-    if (main_wnd_->current_ui() == MainWindow::LIST_PEERS)
-      main_wnd_->SwitchToPeerList(client_->peers());
-  }
-}
-
-void Conductor::OnMessageFromPeer(int peer_id, const std::string& message) {
-  RTC_DCHECK(peer_id_ == peer_id || peer_id_ == -1);
-  RTC_DCHECK(!message.empty());
-
-  if (!peer_connection_.get()) {
-    RTC_DCHECK(peer_id_ == -1);
-    peer_id_ = peer_id;
-
-    if (!InitializePeerConnection()) {
-      LOG(LS_ERROR) << "Failed to initialize our PeerConnection instance";
-      client_->SignOut();
-      return;
-    }
-  } else if (peer_id != peer_id_) {
-    RTC_DCHECK(peer_id_ != -1);
-    LOG(WARNING) << "Received a message from unknown peer while already in a "
-                    "conversation with a different peer.";
-    return;
-  }
-
-  Json::Reader reader;
-  Json::Value jmessage;
-  if (!reader.parse(message, jmessage)) {
-    LOG(WARNING) << "Received unknown message. " << message;
-    return;
-  }
-  std::string type;
-  std::string json_object;
-
-  rtc::GetStringFromJsonObject(jmessage, kSessionDescriptionTypeName, &type);
-  if (!type.empty()) {
-    if (type == "offer-loopback") {
-      // This is a loopback call.
-      // Recreate the peerconnection with DTLS disabled.
-      if (!ReinitializePeerConnectionForLoopback()) {
-        LOG(LS_ERROR) << "Failed to initialize our PeerConnection instance";
-        DeletePeerConnection();
-        client_->SignOut();
-      }
-      return;
-    }
-
-    std::string sdp;
-    if (!rtc::GetStringFromJsonObject(jmessage, kSessionDescriptionSdpName,
-                                      &sdp)) {
-      LOG(WARNING) << "Can't parse received session description message.";
-      return;
-    }
-    webrtc::SdpParseError error;
-    webrtc::SessionDescriptionInterface* session_description(
-        webrtc::CreateSessionDescription(type, sdp, &error));
-    if (!session_description) {
-      LOG(WARNING) << "Can't parse received session description message. "
-          << "SdpParseError was: " << error.description;
-      return;
-    }
-    LOG(INFO) << " Received session description :" << message;
-    peer_connection_->SetRemoteDescription(
-        DummySetSessionDescriptionObserver::Create(), session_description);
-    if (session_description->type() ==
-        webrtc::SessionDescriptionInterface::kOffer) {
-      peer_connection_->CreateAnswer(this, NULL);
-    }
-    return;
-  } else {
-    std::string sdp_mid;
-    int sdp_mlineindex = 0;
-    std::string sdp;
-    if (!rtc::GetStringFromJsonObject(jmessage, kCandidateSdpMidName,
-                                      &sdp_mid) ||
-        !rtc::GetIntFromJsonObject(jmessage, kCandidateSdpMlineIndexName,
-                                   &sdp_mlineindex) ||
-        !rtc::GetStringFromJsonObject(jmessage, kCandidateSdpName, &sdp)) {
-      LOG(WARNING) << "Can't parse received message.";
-      return;
-    }
-    webrtc::SdpParseError error;
-    std::unique_ptr<webrtc::IceCandidateInterface> candidate(
-        webrtc::CreateIceCandidate(sdp_mid, sdp_mlineindex, sdp, &error));
-    if (!candidate.get()) {
-      LOG(WARNING) << "Can't parse received candidate message. "
-          << "SdpParseError was: " << error.description;
-      return;
-    }
-    if (!peer_connection_->AddIceCandidate(candidate.get())) {
-      LOG(WARNING) << "Failed to apply the received candidate";
-      return;
-    }
-    LOG(INFO) << " Received candidate :" << message;
-    return;
-  }
-}
-
-void Conductor::OnMessageSent(int err) {
-  // Process the next pending message if any.
-  main_wnd_->QueueUIThreadCallback(SEND_MESSAGE_TO_PEER, NULL);
-}
-
-void Conductor::OnServerConnectionFailure() {
-    main_wnd_->MessageBox("Error", ("Failed to connect to " + server_).c_str(),
-                          true);
-}
-
-//
-// MainWndCallback implementation.
-//
-
-void Conductor::StartLogin(const std::string& server, int port) {
-  if (client_->is_connected())
-    return;
-  server_ = server;
-  client_->Connect(server, port, GetPeerName());
-}
-
-void Conductor::DisconnectFromServer() {
-  if (client_->is_connected())
-    client_->SignOut();
-}
-
-void Conductor::ConnectToPeer(int peer_id) {
-  RTC_DCHECK(peer_id_ == -1);
-  RTC_DCHECK(peer_id != -1);
-
-  if (peer_connection_.get()) {
-    main_wnd_->MessageBox("Error",
-        "We only support connecting to one peer at a time", true);
-    return;
-  }
-
-  if (InitializePeerConnection()) {
-    peer_id_ = peer_id;
-    peer_connection_->CreateOffer(this, NULL);
-  } else {
-    main_wnd_->MessageBox("Error", "Failed to initialize PeerConnection", true);
-  }
-}
-
-std::unique_ptr<cricket::VideoCapturer> Conductor::OpenVideoCaptureDevice() {
-  std::vector<std::string> device_names;
-  {
-    std::unique_ptr<webrtc::VideoCaptureModule::DeviceInfo> info(
-        webrtc::VideoCaptureFactory::CreateDeviceInfo());
-    if (!info) {
-      return nullptr;
-    }
-    int num_devices = info->NumberOfDevices();
-    for (int i = 0; i < num_devices; ++i) {
-      const uint32_t kSize = 256;
-      char name[kSize] = {0};
-      char id[kSize] = {0};
-      if (info->GetDeviceName(i, name, kSize, id, kSize) != -1) {
-        device_names.push_back(name);
-      }
-    }
-  }
-
-  cricket::WebRtcVideoDeviceCapturerFactory factory;
-  std::unique_ptr<cricket::VideoCapturer> capturer;
-  for (const auto& name : device_names) {
-    capturer = factory.Create(cricket::Device(name, 0));
-    if (capturer) {
-      break;
-    }
-  }
-  return capturer;
-}
-
-void Conductor::AddStreams() {
-  if (active_streams_.find(kStreamLabel) != active_streams_.end())
-    return;  // Already added.
-
-  rtc::scoped_refptr<webrtc::AudioTrackInterface> audio_track(
-      peer_connection_factory_->CreateAudioTrack(
-          kAudioLabel, peer_connection_factory_->CreateAudioSource(NULL)));
-
-  rtc::scoped_refptr<webrtc::VideoTrackInterface> video_track(
-      peer_connection_factory_->CreateVideoTrack(
-          kVideoLabel,
-          peer_connection_factory_->CreateVideoSource(OpenVideoCaptureDevice(),
-                                                      NULL)));
-  main_wnd_->StartLocalRenderer(video_track);
-
-  rtc::scoped_refptr<webrtc::MediaStreamInterface> stream =
-      peer_connection_factory_->CreateLocalMediaStream(kStreamLabel);
-
-  stream->AddTrack(audio_track);
-  stream->AddTrack(video_track);
-  if (!peer_connection_->AddStream(stream)) {
-    LOG(LS_ERROR) << "Adding stream to PeerConnection failed";
-  }
-  typedef std::pair<std::string,
-                    rtc::scoped_refptr<webrtc::MediaStreamInterface> >
-      MediaStreamPair;
-  active_streams_.insert(MediaStreamPair(stream->label(), stream));
-  main_wnd_->SwitchToStreamingUI();
-}
-
-void Conductor::DisconnectFromCurrentPeer() {
-  LOG(INFO) << __FUNCTION__;
-  if (peer_connection_.get()) {
-    client_->SendHangUp(peer_id_);
-    DeletePeerConnection();
-  }
-
-  if (main_wnd_->IsWindow())
-    main_wnd_->SwitchToPeerList(client_->peers());
-}
-
-void Conductor::UIThreadCallback(int msg_id, void* data) {
-  switch (msg_id) {
-    case PEER_CONNECTION_CLOSED:
-      LOG(INFO) << "PEER_CONNECTION_CLOSED";
-      DeletePeerConnection();
-
-      RTC_DCHECK(active_streams_.empty());
-
-      if (main_wnd_->IsWindow()) {
-        if (client_->is_connected()) {
-          main_wnd_->SwitchToPeerList(client_->peers());
-        } else {
-          main_wnd_->SwitchToConnectUI();
-        }
-      } else {
-        DisconnectFromServer();
-      }
-      break;
-
-    case SEND_MESSAGE_TO_PEER: {
-      LOG(INFO) << "SEND_MESSAGE_TO_PEER";
-      std::string* msg = reinterpret_cast<std::string*>(data);
-      if (msg) {
-        // For convenience, we always run the message through the queue.
-        // This way we can be sure that messages are sent to the server
-        // in the same order they were signaled without much hassle.
-        pending_messages_.push_back(msg);
-      }
-
-      if (!pending_messages_.empty() && !client_->IsSendingMessage()) {
-        msg = pending_messages_.front();
-        pending_messages_.pop_front();
-
-        if (!client_->SendToPeer(peer_id_, *msg) && peer_id_ != -1) {
-          LOG(LS_ERROR) << "SendToPeer failed";
-          DisconnectFromServer();
-        }
-        delete msg;
-      }
-
-      if (!peer_connection_.get())
-        peer_id_ = -1;
-
-      break;
-    }
-
-    case NEW_STREAM_ADDED: {
-      webrtc::MediaStreamInterface* stream =
-          reinterpret_cast<webrtc::MediaStreamInterface*>(
-          data);
-      webrtc::VideoTrackVector tracks = stream->GetVideoTracks();
-      // Only render the first track.
-      if (!tracks.empty()) {
-        webrtc::VideoTrackInterface* track = tracks[0];
-        main_wnd_->StartRemoteRenderer(track);
-      }
-      stream->Release();
-      break;
-    }
-
-    case STREAM_REMOVED: {
-      // Remote peer stopped sending a stream.
-      webrtc::MediaStreamInterface* stream =
-          reinterpret_cast<webrtc::MediaStreamInterface*>(
-          data);
-      stream->Release();
-      break;
-    }
-
-    default:
-      RTC_NOTREACHED();
-      break;
-  }
-}
-
-void Conductor::OnSuccess(webrtc::SessionDescriptionInterface* desc) {
-  peer_connection_->SetLocalDescription(
-      DummySetSessionDescriptionObserver::Create(), desc);
-
-  std::string sdp;
-  desc->ToString(&sdp);
-
-  // For loopback test. To save some connecting delay.
-  if (loopback_) {
-    // Replace message type from "offer" to "answer"
-    webrtc::SessionDescriptionInterface* session_description(
-        webrtc::CreateSessionDescription("answer", sdp, nullptr));
-    peer_connection_->SetRemoteDescription(
-        DummySetSessionDescriptionObserver::Create(), session_description);
-    return;
-  }
-
-  Json::StyledWriter writer;
-  Json::Value jmessage;
-  jmessage[kSessionDescriptionTypeName] = desc->type();
-  jmessage[kSessionDescriptionSdpName] = sdp;
-  SendMessage(writer.write(jmessage));
-}
-
-void Conductor::OnFailure(const std::string& error) {
-    LOG(LERROR) << error;
-}
-
-void Conductor::SendMessage(const std::string& json_object) {
-  std::string* msg = new std::string(json_object);
-  main_wnd_->QueueUIThreadCallback(SEND_MESSAGE_TO_PEER, msg);
-}
diff --git a/examples/peerconnection/client/conductor.h b/examples/peerconnection/client/conductor.h
deleted file mode 100644
index 0041a9b..0000000
--- a/examples/peerconnection/client/conductor.h
+++ /dev/null
@@ -1,136 +0,0 @@
-/*
- *  Copyright 2012 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_EXAMPLES_PEERCONNECTION_CLIENT_CONDUCTOR_H_
-#define WEBRTC_EXAMPLES_PEERCONNECTION_CLIENT_CONDUCTOR_H_
-
-#include <deque>
-#include <map>
-#include <memory>
-#include <set>
-#include <string>
-
-#include "webrtc/api/mediastreaminterface.h"
-#include "webrtc/api/peerconnectioninterface.h"
-#include "webrtc/examples/peerconnection/client/main_wnd.h"
-#include "webrtc/examples/peerconnection/client/peer_connection_client.h"
-
-namespace webrtc {
-class VideoCaptureModule;
-}  // namespace webrtc
-
-namespace cricket {
-class VideoRenderer;
-}  // namespace cricket
-
-class Conductor
-  : public webrtc::PeerConnectionObserver,
-    public webrtc::CreateSessionDescriptionObserver,
-    public PeerConnectionClientObserver,
-    public MainWndCallback {
- public:
-  enum CallbackID {
-    MEDIA_CHANNELS_INITIALIZED = 1,
-    PEER_CONNECTION_CLOSED,
-    SEND_MESSAGE_TO_PEER,
-    NEW_STREAM_ADDED,
-    STREAM_REMOVED,
-  };
-
-  Conductor(PeerConnectionClient* client, MainWindow* main_wnd);
-
-  bool connection_active() const;
-
-  virtual void Close();
-
- protected:
-  ~Conductor();
-  bool InitializePeerConnection();
-  bool ReinitializePeerConnectionForLoopback();
-  bool CreatePeerConnection(bool dtls);
-  void DeletePeerConnection();
-  void EnsureStreamingUI();
-  void AddStreams();
-  std::unique_ptr<cricket::VideoCapturer> OpenVideoCaptureDevice();
-
-  //
-  // PeerConnectionObserver implementation.
-  //
-
-  void OnSignalingChange(
-      webrtc::PeerConnectionInterface::SignalingState new_state) override{};
-  void OnAddStream(
-      rtc::scoped_refptr<webrtc::MediaStreamInterface> stream) override;
-  void OnRemoveStream(
-      rtc::scoped_refptr<webrtc::MediaStreamInterface> stream) override;
-  void OnDataChannel(
-      rtc::scoped_refptr<webrtc::DataChannelInterface> channel) override {}
-  void OnRenegotiationNeeded() override {}
-  void OnIceConnectionChange(
-      webrtc::PeerConnectionInterface::IceConnectionState new_state) override{};
-  void OnIceGatheringChange(
-      webrtc::PeerConnectionInterface::IceGatheringState new_state) override{};
-  void OnIceCandidate(const webrtc::IceCandidateInterface* candidate) override;
-  void OnIceConnectionReceivingChange(bool receiving) override {}
-
-  //
-  // PeerConnectionClientObserver implementation.
-  //
-
-  void OnSignedIn() override;
-
-  void OnDisconnected() override;
-
-  void OnPeerConnected(int id, const std::string& name) override;
-
-  void OnPeerDisconnected(int id) override;
-
-  void OnMessageFromPeer(int peer_id, const std::string& message) override;
-
-  void OnMessageSent(int err) override;
-
-  void OnServerConnectionFailure() override;
-
-  //
-  // MainWndCallback implementation.
-  //
-
-  void StartLogin(const std::string& server, int port) override;
-
-  void DisconnectFromServer() override;
-
-  void ConnectToPeer(int peer_id) override;
-
-  void DisconnectFromCurrentPeer() override;
-
-  void UIThreadCallback(int msg_id, void* data) override;
-
-  // CreateSessionDescriptionObserver implementation.
-  void OnSuccess(webrtc::SessionDescriptionInterface* desc) override;
-  void OnFailure(const std::string& error) override;
-
- protected:
-  // Send a message to the remote peer.
-  void SendMessage(const std::string& json_object);
-
-  int peer_id_;
-  bool loopback_;
-  rtc::scoped_refptr<webrtc::PeerConnectionInterface> peer_connection_;
-  rtc::scoped_refptr<webrtc::PeerConnectionFactoryInterface>
-      peer_connection_factory_;
-  PeerConnectionClient* client_;
-  MainWindow* main_wnd_;
-  std::deque<std::string*> pending_messages_;
-  std::map<std::string, rtc::scoped_refptr<webrtc::MediaStreamInterface> >
-      active_streams_;
-  std::string server_;
-};
-
-#endif  // WEBRTC_EXAMPLES_PEERCONNECTION_CLIENT_CONDUCTOR_H_
diff --git a/examples/peerconnection/client/defaults.cc b/examples/peerconnection/client/defaults.cc
deleted file mode 100644
index ed8cdb1..0000000
--- a/examples/peerconnection/client/defaults.cc
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- *  Copyright 2012 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/examples/peerconnection/client/defaults.h"
-
-#include <stdlib.h>
-#include <string.h>
-
-#ifdef WIN32
-#include <winsock2.h>
-#else
-#include <unistd.h>
-#endif
-
-#include "webrtc/rtc_base/arraysize.h"
-
-const char kAudioLabel[] = "audio_label";
-const char kVideoLabel[] = "video_label";
-const char kStreamLabel[] = "stream_label";
-const uint16_t kDefaultServerPort = 8888;
-
-std::string GetEnvVarOrDefault(const char* env_var_name,
-                               const char* default_value) {
-  std::string value;
-  const char* env_var = getenv(env_var_name);
-  if (env_var)
-    value = env_var;
-
-  if (value.empty())
-    value = default_value;
-
-  return value;
-}
-
-std::string GetPeerConnectionString() {
-  return GetEnvVarOrDefault("WEBRTC_CONNECT", "stun:stun.l.google.com:19302");
-}
-
-std::string GetDefaultServerName() {
-  return GetEnvVarOrDefault("WEBRTC_SERVER", "localhost");
-}
-
-std::string GetPeerName() {
-  char computer_name[256];
-  std::string ret(GetEnvVarOrDefault("USERNAME", "user"));
-  ret += '@';
-  if (gethostname(computer_name, arraysize(computer_name)) == 0) {
-    ret += computer_name;
-  } else {
-    ret += "host";
-  }
-  return ret;
-}
diff --git a/examples/peerconnection/client/defaults.h b/examples/peerconnection/client/defaults.h
deleted file mode 100644
index f4527c0..0000000
--- a/examples/peerconnection/client/defaults.h
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- *  Copyright 2011 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_EXAMPLES_PEERCONNECTION_CLIENT_DEFAULTS_H_
-#define WEBRTC_EXAMPLES_PEERCONNECTION_CLIENT_DEFAULTS_H_
-
-#include <stdint.h>
-
-#include <string>
-
-extern const char kAudioLabel[];
-extern const char kVideoLabel[];
-extern const char kStreamLabel[];
-extern const uint16_t kDefaultServerPort;
-
-std::string GetEnvVarOrDefault(const char* env_var_name,
-                               const char* default_value);
-std::string GetPeerConnectionString();
-std::string GetDefaultServerName();
-std::string GetPeerName();
-
-#endif  // WEBRTC_EXAMPLES_PEERCONNECTION_CLIENT_DEFAULTS_H_
diff --git a/examples/peerconnection/client/flagdefs.h b/examples/peerconnection/client/flagdefs.h
deleted file mode 100644
index f3dda76..0000000
--- a/examples/peerconnection/client/flagdefs.h
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- *  Copyright 2012 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_EXAMPLES_PEERCONNECTION_CLIENT_FLAGDEFS_H_
-#define WEBRTC_EXAMPLES_PEERCONNECTION_CLIENT_FLAGDEFS_H_
-
-#include "webrtc/rtc_base/flags.h"
-
-extern const uint16_t kDefaultServerPort;  // From defaults.[h|cc]
-
-// Define flags for the peerconnect_client testing tool, in a separate
-// header file so that they can be shared across the different main.cc's
-// for each platform.
-
-DEFINE_bool(help, false, "Prints this message");
-DEFINE_bool(autoconnect, false, "Connect to the server without user "
-                                "intervention.");
-DEFINE_string(server, "localhost", "The server to connect to.");
-DEFINE_int(port, kDefaultServerPort,
-           "The port on which the server is listening.");
-DEFINE_bool(autocall, false, "Call the first available other client on "
-  "the server without user intervention.  Note: this flag should only be set "
-  "to true on one of the two clients.");
-
-#endif  // WEBRTC_EXAMPLES_PEERCONNECTION_CLIENT_FLAGDEFS_H_
diff --git a/examples/peerconnection/client/linux/main.cc b/examples/peerconnection/client/linux/main.cc
deleted file mode 100644
index d57bc98..0000000
--- a/examples/peerconnection/client/linux/main.cc
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- *  Copyright 2012 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 <gtk/gtk.h>
-
-#include "webrtc/examples/peerconnection/client/conductor.h"
-#include "webrtc/examples/peerconnection/client/flagdefs.h"
-#include "webrtc/examples/peerconnection/client/linux/main_wnd.h"
-#include "webrtc/examples/peerconnection/client/peer_connection_client.h"
-
-#include "webrtc/rtc_base/ssladapter.h"
-#include "webrtc/rtc_base/thread.h"
-
-class CustomSocketServer : public rtc::PhysicalSocketServer {
- public:
-  explicit CustomSocketServer(GtkMainWnd* wnd)
-      : wnd_(wnd), conductor_(NULL), client_(NULL) {}
-  virtual ~CustomSocketServer() {}
-
-  void SetMessageQueue(rtc::MessageQueue* queue) override {
-    message_queue_ = queue;
-  }
-
-  void set_client(PeerConnectionClient* client) { client_ = client; }
-  void set_conductor(Conductor* conductor) { conductor_ = conductor; }
-
-  // Override so that we can also pump the GTK message loop.
-  virtual bool Wait(int cms, bool process_io) {
-    // Pump GTK events.
-    // TODO(henrike): We really should move either the socket server or UI to a
-    // different thread.  Alternatively we could look at merging the two loops
-    // by implementing a dispatcher for the socket server and/or use
-    // g_main_context_set_poll_func.
-      while (gtk_events_pending())
-        gtk_main_iteration();
-
-    if (!wnd_->IsWindow() && !conductor_->connection_active() &&
-        client_ != NULL && !client_->is_connected()) {
-      message_queue_->Quit();
-    }
-    return rtc::PhysicalSocketServer::Wait(0/*cms == -1 ? 1 : cms*/,
-                                                 process_io);
-  }
-
- protected:
-  rtc::MessageQueue* message_queue_;
-  GtkMainWnd* wnd_;
-  Conductor* conductor_;
-  PeerConnectionClient* client_;
-};
-
-int main(int argc, char* argv[]) {
-  gtk_init(&argc, &argv);
-  // g_type_init API is deprecated (and does nothing) since glib 2.35.0, see:
-  // https://mail.gnome.org/archives/commits-list/2012-November/msg07809.html
-#if !GLIB_CHECK_VERSION(2, 35, 0)
-    g_type_init();
-#endif
-  // g_thread_init API is deprecated since glib 2.31.0, see release note:
-  // http://mail.gnome.org/archives/gnome-announce-list/2011-October/msg00041.html
-#if !GLIB_CHECK_VERSION(2, 31, 0)
-    g_thread_init(NULL);
-#endif
-
-  rtc::FlagList::SetFlagsFromCommandLine(&argc, argv, true);
-  if (FLAG_help) {
-    rtc::FlagList::Print(NULL, false);
-    return 0;
-  }
-
-  // Abort if the user specifies a port that is outside the allowed
-  // range [1, 65535].
-  if ((FLAG_port < 1) || (FLAG_port > 65535)) {
-    printf("Error: %i is not a valid port.\n", FLAG_port);
-    return -1;
-  }
-
-  GtkMainWnd wnd(FLAG_server, FLAG_port, FLAG_autoconnect, FLAG_autocall);
-  wnd.Create();
-
-  CustomSocketServer socket_server(&wnd);
-  rtc::AutoSocketServerThread thread(&socket_server);
-
-  rtc::InitializeSSL();
-  // Must be constructed after we set the socketserver.
-  PeerConnectionClient client;
-  rtc::scoped_refptr<Conductor> conductor(
-      new rtc::RefCountedObject<Conductor>(&client, &wnd));
-  socket_server.set_client(&client);
-  socket_server.set_conductor(conductor);
-
-  thread.Run();
-
-  // gtk_main();
-  wnd.Destroy();
-
-  // TODO(henrike): Run the Gtk main loop to tear down the connection.
-  /*
-  while (gtk_events_pending()) {
-    gtk_main_iteration();
-  }
-  */
-  rtc::CleanupSSL();
-  return 0;
-}
diff --git a/examples/peerconnection/client/linux/main_wnd.cc b/examples/peerconnection/client/linux/main_wnd.cc
deleted file mode 100644
index d9f32bc..0000000
--- a/examples/peerconnection/client/linux/main_wnd.cc
+++ /dev/null
@@ -1,548 +0,0 @@
-/*
- *  Copyright 2012 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/examples/peerconnection/client/linux/main_wnd.h"
-
-#include <gdk/gdkkeysyms.h>
-#include <gtk/gtk.h>
-#include <stddef.h>
-
-#include "libyuv/convert_from.h"
-#include "webrtc/api/video/i420_buffer.h"
-#include "webrtc/examples/peerconnection/client/defaults.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/stringutils.h"
-
-using rtc::sprintfn;
-
-namespace {
-
-//
-// Simple static functions that simply forward the callback to the
-// GtkMainWnd instance.
-//
-
-gboolean OnDestroyedCallback(GtkWidget* widget, GdkEvent* event,
-                             gpointer data) {
-  reinterpret_cast<GtkMainWnd*>(data)->OnDestroyed(widget, event);
-  return FALSE;
-}
-
-void OnClickedCallback(GtkWidget* widget, gpointer data) {
-  reinterpret_cast<GtkMainWnd*>(data)->OnClicked(widget);
-}
-
-gboolean SimulateButtonClick(gpointer button) {
-  g_signal_emit_by_name(button, "clicked");
-  return false;
-}
-
-gboolean OnKeyPressCallback(GtkWidget* widget, GdkEventKey* key,
-                            gpointer data) {
-  reinterpret_cast<GtkMainWnd*>(data)->OnKeyPress(widget, key);
-  return false;
-}
-
-void OnRowActivatedCallback(GtkTreeView* tree_view, GtkTreePath* path,
-                            GtkTreeViewColumn* column, gpointer data) {
-  reinterpret_cast<GtkMainWnd*>(data)->OnRowActivated(tree_view, path, column);
-}
-
-gboolean SimulateLastRowActivated(gpointer data) {
-  GtkTreeView* tree_view = reinterpret_cast<GtkTreeView*>(data);
-  GtkTreeModel* model = gtk_tree_view_get_model(tree_view);
-
-  // "if iter is NULL, then the number of toplevel nodes is returned."
-  int rows = gtk_tree_model_iter_n_children(model, NULL);
-  GtkTreePath* lastpath = gtk_tree_path_new_from_indices(rows - 1, -1);
-
-  // Select the last item in the list
-  GtkTreeSelection* selection = gtk_tree_view_get_selection(tree_view);
-  gtk_tree_selection_select_path(selection, lastpath);
-
-  // Our TreeView only has one column, so it is column 0.
-  GtkTreeViewColumn* column = gtk_tree_view_get_column(tree_view, 0);
-
-  gtk_tree_view_row_activated(tree_view, lastpath, column);
-
-  gtk_tree_path_free(lastpath);
-  return false;
-}
-
-// Creates a tree view, that we use to display the list of peers.
-void InitializeList(GtkWidget* list) {
-  GtkCellRenderer* renderer = gtk_cell_renderer_text_new();
-  GtkTreeViewColumn* column = gtk_tree_view_column_new_with_attributes(
-      "List Items", renderer, "text", 0, NULL);
-  gtk_tree_view_append_column(GTK_TREE_VIEW(list), column);
-  GtkListStore* store = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_INT);
-  gtk_tree_view_set_model(GTK_TREE_VIEW(list), GTK_TREE_MODEL(store));
-  g_object_unref(store);
-}
-
-// Adds an entry to a tree view.
-void AddToList(GtkWidget* list, const gchar* str, int value) {
-  GtkListStore* store = GTK_LIST_STORE(
-      gtk_tree_view_get_model(GTK_TREE_VIEW(list)));
-
-  GtkTreeIter iter;
-  gtk_list_store_append(store, &iter);
-  gtk_list_store_set(store, &iter, 0, str, 1, value, -1);
-}
-
-struct UIThreadCallbackData {
-  explicit UIThreadCallbackData(MainWndCallback* cb, int id, void* d)
-      : callback(cb), msg_id(id), data(d) {}
-  MainWndCallback* callback;
-  int msg_id;
-  void* data;
-};
-
-gboolean HandleUIThreadCallback(gpointer data) {
-  UIThreadCallbackData* cb_data = reinterpret_cast<UIThreadCallbackData*>(data);
-  cb_data->callback->UIThreadCallback(cb_data->msg_id, cb_data->data);
-  delete cb_data;
-  return false;
-}
-
-gboolean Redraw(gpointer data) {
-  GtkMainWnd* wnd = reinterpret_cast<GtkMainWnd*>(data);
-  wnd->OnRedraw();
-  return false;
-}
-
-gboolean Draw(GtkWidget* widget, cairo_t* cr, gpointer data) {
-  GtkMainWnd* wnd = reinterpret_cast<GtkMainWnd*>(data);
-  wnd->Draw(widget, cr);
-  return false;
-}
-
-}  // namespace
-
-//
-// GtkMainWnd implementation.
-//
-
-GtkMainWnd::GtkMainWnd(const char* server, int port, bool autoconnect,
-                       bool autocall)
-    : window_(NULL), draw_area_(NULL), vbox_(NULL), server_edit_(NULL),
-      port_edit_(NULL), peer_list_(NULL), callback_(NULL),
-      server_(server), autoconnect_(autoconnect), autocall_(autocall) {
-  char buffer[10];
-  sprintfn(buffer, sizeof(buffer), "%i", port);
-  port_ = buffer;
-}
-
-GtkMainWnd::~GtkMainWnd() {
-  RTC_DCHECK(!IsWindow());
-}
-
-void GtkMainWnd::RegisterObserver(MainWndCallback* callback) {
-  callback_ = callback;
-}
-
-bool GtkMainWnd::IsWindow() {
-  return window_ != NULL && GTK_IS_WINDOW(window_);
-}
-
-void GtkMainWnd::MessageBox(const char* caption, const char* text,
-                            bool is_error) {
-  GtkWidget* dialog = gtk_message_dialog_new(GTK_WINDOW(window_),
-      GTK_DIALOG_DESTROY_WITH_PARENT,
-      is_error ? GTK_MESSAGE_ERROR : GTK_MESSAGE_INFO,
-      GTK_BUTTONS_CLOSE, "%s", text);
-  gtk_window_set_title(GTK_WINDOW(dialog), caption);
-  gtk_dialog_run(GTK_DIALOG(dialog));
-  gtk_widget_destroy(dialog);
-}
-
-MainWindow::UI GtkMainWnd::current_ui() {
-  if (vbox_)
-    return CONNECT_TO_SERVER;
-
-  if (peer_list_)
-    return LIST_PEERS;
-
-  return STREAMING;
-}
-
-
-void GtkMainWnd::StartLocalRenderer(webrtc::VideoTrackInterface* local_video) {
-  local_renderer_.reset(new VideoRenderer(this, local_video));
-}
-
-void GtkMainWnd::StopLocalRenderer() {
-  local_renderer_.reset();
-}
-
-void GtkMainWnd::StartRemoteRenderer(
-    webrtc::VideoTrackInterface* remote_video) {
-  remote_renderer_.reset(new VideoRenderer(this, remote_video));
-}
-
-void GtkMainWnd::StopRemoteRenderer() {
-  remote_renderer_.reset();
-}
-
-void GtkMainWnd::QueueUIThreadCallback(int msg_id, void* data) {
-  g_idle_add(HandleUIThreadCallback,
-             new UIThreadCallbackData(callback_, msg_id, data));
-}
-
-bool GtkMainWnd::Create() {
-  RTC_DCHECK(window_ == NULL);
-
-  window_ = gtk_window_new(GTK_WINDOW_TOPLEVEL);
-  if (window_) {
-    gtk_window_set_position(GTK_WINDOW(window_), GTK_WIN_POS_CENTER);
-    gtk_window_set_default_size(GTK_WINDOW(window_), 640, 480);
-    gtk_window_set_title(GTK_WINDOW(window_), "PeerConnection client");
-    g_signal_connect(G_OBJECT(window_), "delete-event",
-                     G_CALLBACK(&OnDestroyedCallback), this);
-    g_signal_connect(window_, "key-press-event", G_CALLBACK(OnKeyPressCallback),
-                     this);
-
-    SwitchToConnectUI();
-  }
-
-  return window_ != NULL;
-}
-
-bool GtkMainWnd::Destroy() {
-  if (!IsWindow())
-    return false;
-
-  gtk_widget_destroy(window_);
-  window_ = NULL;
-
-  return true;
-}
-
-void GtkMainWnd::SwitchToConnectUI() {
-  LOG(INFO) << __FUNCTION__;
-
-  RTC_DCHECK(IsWindow());
-  RTC_DCHECK(vbox_ == NULL);
-
-  gtk_container_set_border_width(GTK_CONTAINER(window_), 10);
-
-  if (peer_list_) {
-    gtk_widget_destroy(peer_list_);
-    peer_list_ = NULL;
-  }
-
-#if GTK_MAJOR_VERSION == 2
-  vbox_ = gtk_vbox_new(FALSE, 5);
-#else
-  vbox_ = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5);
-#endif
-  GtkWidget* valign = gtk_alignment_new(0, 1, 0, 0);
-  gtk_container_add(GTK_CONTAINER(vbox_), valign);
-  gtk_container_add(GTK_CONTAINER(window_), vbox_);
-
-#if GTK_MAJOR_VERSION == 2
-  GtkWidget* hbox = gtk_hbox_new(FALSE, 5);
-#else
-  GtkWidget* hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5);
-#endif
-
-  GtkWidget* label = gtk_label_new("Server");
-  gtk_container_add(GTK_CONTAINER(hbox), label);
-
-  server_edit_ = gtk_entry_new();
-  gtk_entry_set_text(GTK_ENTRY(server_edit_), server_.c_str());
-  gtk_widget_set_size_request(server_edit_, 400, 30);
-  gtk_container_add(GTK_CONTAINER(hbox), server_edit_);
-
-  port_edit_ = gtk_entry_new();
-  gtk_entry_set_text(GTK_ENTRY(port_edit_), port_.c_str());
-  gtk_widget_set_size_request(port_edit_, 70, 30);
-  gtk_container_add(GTK_CONTAINER(hbox), port_edit_);
-
-  GtkWidget* button = gtk_button_new_with_label("Connect");
-  gtk_widget_set_size_request(button, 70, 30);
-  g_signal_connect(button, "clicked", G_CALLBACK(OnClickedCallback), this);
-  gtk_container_add(GTK_CONTAINER(hbox), button);
-
-  GtkWidget* halign = gtk_alignment_new(1, 0, 0, 0);
-  gtk_container_add(GTK_CONTAINER(halign), hbox);
-  gtk_box_pack_start(GTK_BOX(vbox_), halign, FALSE, FALSE, 0);
-
-  gtk_widget_show_all(window_);
-
-  if (autoconnect_)
-    g_idle_add(SimulateButtonClick, button);
-}
-
-void GtkMainWnd::SwitchToPeerList(const Peers& peers) {
-  LOG(INFO) << __FUNCTION__;
-
-  if (!peer_list_) {
-    gtk_container_set_border_width(GTK_CONTAINER(window_), 0);
-    if (vbox_) {
-      gtk_widget_destroy(vbox_);
-      vbox_ = NULL;
-      server_edit_ = NULL;
-      port_edit_ = NULL;
-    } else if (draw_area_) {
-      gtk_widget_destroy(draw_area_);
-      draw_area_ = NULL;
-      draw_buffer_.reset();
-    }
-
-    peer_list_ = gtk_tree_view_new();
-    g_signal_connect(peer_list_, "row-activated",
-                     G_CALLBACK(OnRowActivatedCallback), this);
-    gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(peer_list_), FALSE);
-    InitializeList(peer_list_);
-    gtk_container_add(GTK_CONTAINER(window_), peer_list_);
-    gtk_widget_show_all(window_);
-  } else {
-    GtkListStore* store =
-        GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(peer_list_)));
-    gtk_list_store_clear(store);
-  }
-
-  AddToList(peer_list_, "List of currently connected peers:", -1);
-  for (Peers::const_iterator i = peers.begin(); i != peers.end(); ++i)
-    AddToList(peer_list_, i->second.c_str(), i->first);
-
-  if (autocall_ && peers.begin() != peers.end())
-    g_idle_add(SimulateLastRowActivated, peer_list_);
-}
-
-void GtkMainWnd::SwitchToStreamingUI() {
-  LOG(INFO) << __FUNCTION__;
-
-  RTC_DCHECK(draw_area_ == NULL);
-
-  gtk_container_set_border_width(GTK_CONTAINER(window_), 0);
-  if (peer_list_) {
-    gtk_widget_destroy(peer_list_);
-    peer_list_ = NULL;
-  }
-
-  draw_area_ = gtk_drawing_area_new();
-  gtk_container_add(GTK_CONTAINER(window_), draw_area_);
-  g_signal_connect(G_OBJECT(draw_area_), "draw", G_CALLBACK(&::Draw), this);
-
-  gtk_widget_show_all(window_);
-}
-
-void GtkMainWnd::OnDestroyed(GtkWidget* widget, GdkEvent* event) {
-  callback_->Close();
-  window_ = NULL;
-  draw_area_ = NULL;
-  vbox_ = NULL;
-  server_edit_ = NULL;
-  port_edit_ = NULL;
-  peer_list_ = NULL;
-}
-
-void GtkMainWnd::OnClicked(GtkWidget* widget) {
-  // Make the connect button insensitive, so that it cannot be clicked more than
-  // once.  Now that the connection includes auto-retry, it should not be
-  // necessary to click it more than once.
-  gtk_widget_set_sensitive(widget, false);
-  server_ = gtk_entry_get_text(GTK_ENTRY(server_edit_));
-  port_ = gtk_entry_get_text(GTK_ENTRY(port_edit_));
-  int port = port_.length() ? atoi(port_.c_str()) : 0;
-  callback_->StartLogin(server_, port);
-}
-
-void GtkMainWnd::OnKeyPress(GtkWidget* widget, GdkEventKey* key) {
-  if (key->type == GDK_KEY_PRESS) {
-    switch (key->keyval) {
-#if GTK_MAJOR_VERSION == 2
-      case GDK_Escape:
-#else
-      case GDK_KEY_Escape:
-#endif
-        if (draw_area_) {
-          callback_->DisconnectFromCurrentPeer();
-        } else if (peer_list_) {
-          callback_->DisconnectFromServer();
-        }
-        break;
-
-#if GTK_MAJOR_VERSION == 2
-      case GDK_KP_Enter:
-      case GDK_Return:
-#else
-      case GDK_KEY_KP_Enter:
-      case GDK_KEY_Return:
-#endif
-        if (vbox_) {
-          OnClicked(NULL);
-        } else if (peer_list_) {
-          // OnRowActivated will be called automatically when the user
-          // presses enter.
-        }
-        break;
-
-      default:
-        break;
-    }
-  }
-}
-
-void GtkMainWnd::OnRowActivated(GtkTreeView* tree_view, GtkTreePath* path,
-                                GtkTreeViewColumn* column) {
-  RTC_DCHECK(peer_list_ != NULL);
-  GtkTreeIter iter;
-  GtkTreeModel* model;
-  GtkTreeSelection* selection =
-      gtk_tree_view_get_selection(GTK_TREE_VIEW(tree_view));
-  if (gtk_tree_selection_get_selected(selection, &model, &iter)) {
-     char* text;
-     int id = -1;
-     gtk_tree_model_get(model, &iter, 0, &text, 1, &id,  -1);
-     if (id != -1)
-       callback_->ConnectToPeer(id);
-     g_free(text);
-  }
-}
-
-void GtkMainWnd::OnRedraw() {
-  gdk_threads_enter();
-
-  VideoRenderer* remote_renderer = remote_renderer_.get();
-  if (remote_renderer && remote_renderer->image() != NULL &&
-      draw_area_ != NULL) {
-    width_ = remote_renderer->width();
-    height_ = remote_renderer->height();
-
-    if (!draw_buffer_.get()) {
-      draw_buffer_size_ = (width_ * height_ * 4) * 4;
-      draw_buffer_.reset(new uint8_t[draw_buffer_size_]);
-      gtk_widget_set_size_request(draw_area_, width_ * 2, height_ * 2);
-    }
-
-    const uint32_t* image =
-        reinterpret_cast<const uint32_t*>(remote_renderer->image());
-    uint32_t* scaled = reinterpret_cast<uint32_t*>(draw_buffer_.get());
-    for (int r = 0; r < height_; ++r) {
-      for (int c = 0; c < width_; ++c) {
-        int x = c * 2;
-        scaled[x] = scaled[x + 1] = image[c];
-      }
-
-      uint32_t* prev_line = scaled;
-      scaled += width_ * 2;
-      memcpy(scaled, prev_line, (width_ * 2) * 4);
-
-      image += width_;
-      scaled += width_ * 2;
-    }
-
-    VideoRenderer* local_renderer = local_renderer_.get();
-    if (local_renderer && local_renderer->image()) {
-      image = reinterpret_cast<const uint32_t*>(local_renderer->image());
-      scaled = reinterpret_cast<uint32_t*>(draw_buffer_.get());
-      // Position the local preview on the right side.
-      scaled += (width_ * 2) - (local_renderer->width() / 2);
-      // right margin...
-      scaled -= 10;
-      // ... towards the bottom.
-      scaled += (height_ * width_ * 4) - ((local_renderer->height() / 2) *
-                                          (local_renderer->width() / 2) * 4);
-      // bottom margin...
-      scaled -= (width_ * 2) * 5;
-      for (int r = 0; r < local_renderer->height(); r += 2) {
-        for (int c = 0; c < local_renderer->width(); c += 2) {
-          scaled[c / 2] = image[c + r * local_renderer->width()];
-        }
-        scaled += width_ * 2;
-      }
-    }
-
-#if GTK_MAJOR_VERSION == 2
-    gdk_draw_rgb_32_image(draw_area_->window,
-                          draw_area_->style->fg_gc[GTK_STATE_NORMAL], 0, 0,
-                          width_ * 2, height_ * 2, GDK_RGB_DITHER_MAX,
-                          draw_buffer_.get(), (width_ * 2) * 4);
-#else
-    gtk_widget_queue_draw(draw_area_);
-#endif
-  }
-
-  gdk_threads_leave();
-}
-
-void GtkMainWnd::Draw(GtkWidget* widget, cairo_t* cr) {
-#if GTK_MAJOR_VERSION != 2
-  cairo_format_t format = CAIRO_FORMAT_RGB24;
-  cairo_surface_t* surface = cairo_image_surface_create_for_data(
-      draw_buffer_.get(), format, width_ * 2, height_ * 2,
-      cairo_format_stride_for_width(format, width_ * 2));
-  cairo_set_source_surface(cr, surface, 0, 0);
-  cairo_rectangle(cr, 0, 0, width_ * 2, height_ * 2);
-  cairo_fill(cr);
-  cairo_surface_destroy(surface);
-#else
-  RTC_NOTREACHED();
-#endif
-}
-
-GtkMainWnd::VideoRenderer::VideoRenderer(
-    GtkMainWnd* main_wnd,
-    webrtc::VideoTrackInterface* track_to_render)
-    : width_(0),
-      height_(0),
-      main_wnd_(main_wnd),
-      rendered_track_(track_to_render) {
-  rendered_track_->AddOrUpdateSink(this, rtc::VideoSinkWants());
-}
-
-GtkMainWnd::VideoRenderer::~VideoRenderer() {
-  rendered_track_->RemoveSink(this);
-}
-
-void GtkMainWnd::VideoRenderer::SetSize(int width, int height) {
-  gdk_threads_enter();
-
-  if (width_ == width && height_ == height) {
-    return;
-  }
-
-  width_ = width;
-  height_ = height;
-  image_.reset(new uint8_t[width * height * 4]);
-  gdk_threads_leave();
-}
-
-void GtkMainWnd::VideoRenderer::OnFrame(
-    const webrtc::VideoFrame& video_frame) {
-  gdk_threads_enter();
-
-  rtc::scoped_refptr<webrtc::I420BufferInterface> buffer(
-      video_frame.video_frame_buffer()->ToI420());
-  if (video_frame.rotation() != webrtc::kVideoRotation_0) {
-    buffer = webrtc::I420Buffer::Rotate(*buffer, video_frame.rotation());
-  }
-  SetSize(buffer->width(), buffer->height());
-
-  // The order in the name of libyuv::I420To(ABGR,RGBA) is ambiguous because
-  // it doesn't tell you if it is referring to how it is laid out in memory as
-  // bytes or if endiannes is taken into account.
-  // This was supposed to be a call to libyuv::I420ToRGBA but it was resulting
-  // in a reddish video output (see https://bugs.webrtc.org/6857) because it
-  // was producing an unexpected byte order (ABGR, byte swapped).
-  libyuv::I420ToABGR(buffer->DataY(), buffer->StrideY(),
-                     buffer->DataU(), buffer->StrideU(),
-                     buffer->DataV(), buffer->StrideV(),
-                     image_.get(), width_ * 4,
-                     buffer->width(), buffer->height());
-
-  gdk_threads_leave();
-
-  g_idle_add(Redraw, main_wnd_);
-}
diff --git a/examples/peerconnection/client/linux/main_wnd.h b/examples/peerconnection/client/linux/main_wnd.h
deleted file mode 100644
index 68ed8bf..0000000
--- a/examples/peerconnection/client/linux/main_wnd.h
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
- *  Copyright 2012 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_EXAMPLES_PEERCONNECTION_CLIENT_LINUX_MAIN_WND_H_
-#define WEBRTC_EXAMPLES_PEERCONNECTION_CLIENT_LINUX_MAIN_WND_H_
-
-#include <memory>
-#include <string>
-
-#include "webrtc/examples/peerconnection/client/main_wnd.h"
-#include "webrtc/examples/peerconnection/client/peer_connection_client.h"
-
-// Forward declarations.
-typedef struct _GtkWidget GtkWidget;
-typedef union _GdkEvent GdkEvent;
-typedef struct _GdkEventKey GdkEventKey;
-typedef struct _GtkTreeView GtkTreeView;
-typedef struct _GtkTreePath GtkTreePath;
-typedef struct _GtkTreeViewColumn GtkTreeViewColumn;
-typedef struct _cairo cairo_t;
-
-// Implements the main UI of the peer connection client.
-// This is functionally equivalent to the MainWnd class in the Windows
-// implementation.
-class GtkMainWnd : public MainWindow {
- public:
-  GtkMainWnd(const char* server, int port, bool autoconnect, bool autocall);
-  ~GtkMainWnd();
-
-  virtual void RegisterObserver(MainWndCallback* callback);
-  virtual bool IsWindow();
-  virtual void SwitchToConnectUI();
-  virtual void SwitchToPeerList(const Peers& peers);
-  virtual void SwitchToStreamingUI();
-  virtual void MessageBox(const char* caption, const char* text,
-                          bool is_error);
-  virtual MainWindow::UI current_ui();
-  virtual void StartLocalRenderer(webrtc::VideoTrackInterface* local_video);
-  virtual void StopLocalRenderer();
-  virtual void StartRemoteRenderer(webrtc::VideoTrackInterface* remote_video);
-  virtual void StopRemoteRenderer();
-
-  virtual void QueueUIThreadCallback(int msg_id, void* data);
-
-  // Creates and shows the main window with the |Connect UI| enabled.
-  bool Create();
-
-  // Destroys the window.  When the window is destroyed, it ends the
-  // main message loop.
-  bool Destroy();
-
-  // Callback for when the main window is destroyed.
-  void OnDestroyed(GtkWidget* widget, GdkEvent* event);
-
-  // Callback for when the user clicks the "Connect" button.
-  void OnClicked(GtkWidget* widget);
-
-  // Callback for keystrokes.  Used to capture Esc and Return.
-  void OnKeyPress(GtkWidget* widget, GdkEventKey* key);
-
-  // Callback when the user double clicks a peer in order to initiate a
-  // connection.
-  void OnRowActivated(GtkTreeView* tree_view, GtkTreePath* path,
-                      GtkTreeViewColumn* column);
-
-  void OnRedraw();
-
-  void Draw(GtkWidget* widget, cairo_t* cr);
-
- protected:
-  class VideoRenderer : public rtc::VideoSinkInterface<webrtc::VideoFrame> {
-   public:
-    VideoRenderer(GtkMainWnd* main_wnd,
-                  webrtc::VideoTrackInterface* track_to_render);
-    virtual ~VideoRenderer();
-
-    // VideoSinkInterface implementation
-    void OnFrame(const webrtc::VideoFrame& frame) override;
-
-    const uint8_t* image() const { return image_.get(); }
-
-    int width() const {
-      return width_;
-    }
-
-    int height() const {
-      return height_;
-    }
-
-   protected:
-    void SetSize(int width, int height);
-    std::unique_ptr<uint8_t[]> image_;
-    int width_;
-    int height_;
-    GtkMainWnd* main_wnd_;
-    rtc::scoped_refptr<webrtc::VideoTrackInterface> rendered_track_;
-  };
-
- protected:
-  GtkWidget* window_;  // Our main window.
-  GtkWidget* draw_area_;  // The drawing surface for rendering video streams.
-  GtkWidget* vbox_;  // Container for the Connect UI.
-  GtkWidget* server_edit_;
-  GtkWidget* port_edit_;
-  GtkWidget* peer_list_;  // The list of peers.
-  MainWndCallback* callback_;
-  std::string server_;
-  std::string port_;
-  bool autoconnect_;
-  bool autocall_;
-  std::unique_ptr<VideoRenderer> local_renderer_;
-  std::unique_ptr<VideoRenderer> remote_renderer_;
-  int width_;
-  int height_;
-  std::unique_ptr<uint8_t[]> draw_buffer_;
-  int draw_buffer_size_;
-};
-
-#endif  // WEBRTC_EXAMPLES_PEERCONNECTION_CLIENT_LINUX_MAIN_WND_H_
diff --git a/examples/peerconnection/client/main.cc b/examples/peerconnection/client/main.cc
deleted file mode 100644
index bd69be9..0000000
--- a/examples/peerconnection/client/main.cc
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- *  Copyright 2012 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/examples/peerconnection/client/conductor.h"
-#include "webrtc/examples/peerconnection/client/flagdefs.h"
-#include "webrtc/examples/peerconnection/client/main_wnd.h"
-#include "webrtc/examples/peerconnection/client/peer_connection_client.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/ssladapter.h"
-#include "webrtc/rtc_base/win32socketinit.h"
-#include "webrtc/rtc_base/win32socketserver.h"
-
-int PASCAL wWinMain(HINSTANCE instance, HINSTANCE prev_instance,
-                    wchar_t* cmd_line, int cmd_show) {
-  rtc::EnsureWinsockInit();
-  rtc::Win32SocketServer w32_ss;
-  rtc::Win32Thread w32_thread(&w32_ss);
-  rtc::ThreadManager::Instance()->SetCurrentThread(&w32_thread);
-
-  rtc::WindowsCommandLineArguments win_args;
-  int argc = win_args.argc();
-  char **argv = win_args.argv();
-
-  rtc::FlagList::SetFlagsFromCommandLine(&argc, argv, true);
-  if (FLAG_help) {
-    rtc::FlagList::Print(NULL, false);
-    return 0;
-  }
-
-  // Abort if the user specifies a port that is outside the allowed
-  // range [1, 65535].
-  if ((FLAG_port < 1) || (FLAG_port > 65535)) {
-    printf("Error: %i is not a valid port.\n", FLAG_port);
-    return -1;
-  }
-
-  MainWnd wnd(FLAG_server, FLAG_port, FLAG_autoconnect, FLAG_autocall);
-  if (!wnd.Create()) {
-    RTC_NOTREACHED();
-    return -1;
-  }
-
-  rtc::InitializeSSL();
-  PeerConnectionClient client;
-  rtc::scoped_refptr<Conductor> conductor(
-        new rtc::RefCountedObject<Conductor>(&client, &wnd));
-
-  // Main loop.
-  MSG msg;
-  BOOL gm;
-  while ((gm = ::GetMessage(&msg, NULL, 0, 0)) != 0 && gm != -1) {
-    if (!wnd.PreTranslateMessage(&msg)) {
-      ::TranslateMessage(&msg);
-      ::DispatchMessage(&msg);
-    }
-  }
-
-  if (conductor->connection_active() || client.is_connected()) {
-    while ((conductor->connection_active() || client.is_connected()) &&
-           (gm = ::GetMessage(&msg, NULL, 0, 0)) != 0 && gm != -1) {
-      if (!wnd.PreTranslateMessage(&msg)) {
-        ::TranslateMessage(&msg);
-        ::DispatchMessage(&msg);
-      }
-    }
-  }
-
-  rtc::CleanupSSL();
-  return 0;
-}
diff --git a/examples/peerconnection/client/main_wnd.cc b/examples/peerconnection/client/main_wnd.cc
deleted file mode 100644
index da21c5f..0000000
--- a/examples/peerconnection/client/main_wnd.cc
+++ /dev/null
@@ -1,627 +0,0 @@
-/*
- *  Copyright 2012 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/examples/peerconnection/client/main_wnd.h"
-
-#include <math.h>
-
-#include "libyuv/convert_argb.h"
-#include "webrtc/api/video/i420_buffer.h"
-#include "webrtc/examples/peerconnection/client/defaults.h"
-#include "webrtc/rtc_base/arraysize.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-
-ATOM MainWnd::wnd_class_ = 0;
-const wchar_t MainWnd::kClassName[] = L"WebRTC_MainWnd";
-
-using rtc::sprintfn;
-
-namespace {
-
-const char kConnecting[] = "Connecting... ";
-const char kNoVideoStreams[] = "(no video streams either way)";
-const char kNoIncomingStream[] = "(no incoming video)";
-
-void CalculateWindowSizeForText(HWND wnd, const wchar_t* text,
-                                size_t* width, size_t* height) {
-  HDC dc = ::GetDC(wnd);
-  RECT text_rc = {0};
-  ::DrawText(dc, text, -1, &text_rc, DT_CALCRECT | DT_SINGLELINE);
-  ::ReleaseDC(wnd, dc);
-  RECT client, window;
-  ::GetClientRect(wnd, &client);
-  ::GetWindowRect(wnd, &window);
-
-  *width = text_rc.right - text_rc.left;
-  *width += (window.right - window.left) -
-            (client.right - client.left);
-  *height = text_rc.bottom - text_rc.top;
-  *height += (window.bottom - window.top) -
-             (client.bottom - client.top);
-}
-
-HFONT GetDefaultFont() {
-  static HFONT font = reinterpret_cast<HFONT>(GetStockObject(DEFAULT_GUI_FONT));
-  return font;
-}
-
-std::string GetWindowText(HWND wnd) {
-  char text[MAX_PATH] = {0};
-  ::GetWindowTextA(wnd, &text[0], ARRAYSIZE(text));
-  return text;
-}
-
-void AddListBoxItem(HWND listbox, const std::string& str, LPARAM item_data) {
-  LRESULT index = ::SendMessageA(listbox, LB_ADDSTRING, 0,
-      reinterpret_cast<LPARAM>(str.c_str()));
-  ::SendMessageA(listbox, LB_SETITEMDATA, index, item_data);
-}
-
-}  // namespace
-
-MainWnd::MainWnd(const char* server, int port, bool auto_connect,
-                 bool auto_call)
-  : ui_(CONNECT_TO_SERVER), wnd_(NULL), edit1_(NULL), edit2_(NULL),
-    label1_(NULL), label2_(NULL), button_(NULL), listbox_(NULL),
-    destroyed_(false), callback_(NULL), nested_msg_(NULL),
-    server_(server), auto_connect_(auto_connect), auto_call_(auto_call) {
-  char buffer[10] = {0};
-  sprintfn(buffer, sizeof(buffer), "%i", port);
-  port_ = buffer;
-}
-
-MainWnd::~MainWnd() {
-  RTC_DCHECK(!IsWindow());
-}
-
-bool MainWnd::Create() {
-  RTC_DCHECK(wnd_ == NULL);
-  if (!RegisterWindowClass())
-    return false;
-
-  ui_thread_id_ = ::GetCurrentThreadId();
-  wnd_ = ::CreateWindowExW(WS_EX_OVERLAPPEDWINDOW, kClassName, L"WebRTC",
-      WS_OVERLAPPEDWINDOW | WS_VISIBLE | WS_CLIPCHILDREN,
-      CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
-      NULL, NULL, GetModuleHandle(NULL), this);
-
-  ::SendMessage(wnd_, WM_SETFONT, reinterpret_cast<WPARAM>(GetDefaultFont()),
-                TRUE);
-
-  CreateChildWindows();
-  SwitchToConnectUI();
-
-  return wnd_ != NULL;
-}
-
-bool MainWnd::Destroy() {
-  BOOL ret = FALSE;
-  if (IsWindow()) {
-    ret = ::DestroyWindow(wnd_);
-  }
-
-  return ret != FALSE;
-}
-
-void MainWnd::RegisterObserver(MainWndCallback* callback) {
-  callback_ = callback;
-}
-
-bool MainWnd::IsWindow() {
-  return wnd_ && ::IsWindow(wnd_) != FALSE;
-}
-
-bool MainWnd::PreTranslateMessage(MSG* msg) {
-  bool ret = false;
-  if (msg->message == WM_CHAR) {
-    if (msg->wParam == VK_TAB) {
-      HandleTabbing();
-      ret = true;
-    } else if (msg->wParam == VK_RETURN) {
-      OnDefaultAction();
-      ret = true;
-    } else if (msg->wParam == VK_ESCAPE) {
-      if (callback_) {
-        if (ui_ == STREAMING) {
-          callback_->DisconnectFromCurrentPeer();
-        } else {
-          callback_->DisconnectFromServer();
-        }
-      }
-    }
-  } else if (msg->hwnd == NULL && msg->message == UI_THREAD_CALLBACK) {
-    callback_->UIThreadCallback(static_cast<int>(msg->wParam),
-                                reinterpret_cast<void*>(msg->lParam));
-    ret = true;
-  }
-  return ret;
-}
-
-void MainWnd::SwitchToConnectUI() {
-  RTC_DCHECK(IsWindow());
-  LayoutPeerListUI(false);
-  ui_ = CONNECT_TO_SERVER;
-  LayoutConnectUI(true);
-  ::SetFocus(edit1_);
-
-  if (auto_connect_)
-    ::PostMessage(button_, BM_CLICK, 0, 0);
-}
-
-void MainWnd::SwitchToPeerList(const Peers& peers) {
-  LayoutConnectUI(false);
-
-  ::SendMessage(listbox_, LB_RESETCONTENT, 0, 0);
-
-  AddListBoxItem(listbox_, "List of currently connected peers:", -1);
-  Peers::const_iterator i = peers.begin();
-  for (; i != peers.end(); ++i)
-    AddListBoxItem(listbox_, i->second.c_str(), i->first);
-
-  ui_ = LIST_PEERS;
-  LayoutPeerListUI(true);
-  ::SetFocus(listbox_);
-
-  if (auto_call_ && peers.begin() != peers.end()) {
-    // Get the number of items in the list
-    LRESULT count = ::SendMessage(listbox_, LB_GETCOUNT, 0, 0);
-    if (count != LB_ERR) {
-      // Select the last item in the list
-      LRESULT selection = ::SendMessage(listbox_, LB_SETCURSEL , count - 1, 0);
-      if (selection != LB_ERR)
-        ::PostMessage(wnd_, WM_COMMAND, MAKEWPARAM(GetDlgCtrlID(listbox_),
-                                                   LBN_DBLCLK),
-                      reinterpret_cast<LPARAM>(listbox_));
-    }
-  }
-}
-
-void MainWnd::SwitchToStreamingUI() {
-  LayoutConnectUI(false);
-  LayoutPeerListUI(false);
-  ui_ = STREAMING;
-}
-
-void MainWnd::MessageBox(const char* caption, const char* text, bool is_error) {
-  DWORD flags = MB_OK;
-  if (is_error)
-    flags |= MB_ICONERROR;
-
-  ::MessageBoxA(handle(), text, caption, flags);
-}
-
-
-void MainWnd::StartLocalRenderer(webrtc::VideoTrackInterface* local_video) {
-  local_renderer_.reset(new VideoRenderer(handle(), 1, 1, local_video));
-}
-
-void MainWnd::StopLocalRenderer() {
-  local_renderer_.reset();
-}
-
-void MainWnd::StartRemoteRenderer(webrtc::VideoTrackInterface* remote_video) {
-  remote_renderer_.reset(new VideoRenderer(handle(), 1, 1, remote_video));
-}
-
-void MainWnd::StopRemoteRenderer() {
-  remote_renderer_.reset();
-}
-
-void MainWnd::QueueUIThreadCallback(int msg_id, void* data) {
-  ::PostThreadMessage(ui_thread_id_, UI_THREAD_CALLBACK,
-      static_cast<WPARAM>(msg_id), reinterpret_cast<LPARAM>(data));
-}
-
-void MainWnd::OnPaint() {
-  PAINTSTRUCT ps;
-  ::BeginPaint(handle(), &ps);
-
-  RECT rc;
-  ::GetClientRect(handle(), &rc);
-
-  VideoRenderer* local_renderer = local_renderer_.get();
-  VideoRenderer* remote_renderer = remote_renderer_.get();
-  if (ui_ == STREAMING && remote_renderer && local_renderer) {
-    AutoLock<VideoRenderer> local_lock(local_renderer);
-    AutoLock<VideoRenderer> remote_lock(remote_renderer);
-
-    const BITMAPINFO& bmi = remote_renderer->bmi();
-    int height = abs(bmi.bmiHeader.biHeight);
-    int width = bmi.bmiHeader.biWidth;
-
-    const uint8_t* image = remote_renderer->image();
-    if (image != NULL) {
-      HDC dc_mem = ::CreateCompatibleDC(ps.hdc);
-      ::SetStretchBltMode(dc_mem, HALFTONE);
-
-      // Set the map mode so that the ratio will be maintained for us.
-      HDC all_dc[] = { ps.hdc, dc_mem };
-      for (int i = 0; i < arraysize(all_dc); ++i) {
-        SetMapMode(all_dc[i], MM_ISOTROPIC);
-        SetWindowExtEx(all_dc[i], width, height, NULL);
-        SetViewportExtEx(all_dc[i], rc.right, rc.bottom, NULL);
-      }
-
-      HBITMAP bmp_mem = ::CreateCompatibleBitmap(ps.hdc, rc.right, rc.bottom);
-      HGDIOBJ bmp_old = ::SelectObject(dc_mem, bmp_mem);
-
-      POINT logical_area = { rc.right, rc.bottom };
-      DPtoLP(ps.hdc, &logical_area, 1);
-
-      HBRUSH brush = ::CreateSolidBrush(RGB(0, 0, 0));
-      RECT logical_rect = {0, 0, logical_area.x, logical_area.y };
-      ::FillRect(dc_mem, &logical_rect, brush);
-      ::DeleteObject(brush);
-
-      int x = (logical_area.x / 2) - (width / 2);
-      int y = (logical_area.y / 2) - (height / 2);
-
-      StretchDIBits(dc_mem, x, y, width, height,
-                    0, 0, width, height, image, &bmi, DIB_RGB_COLORS, SRCCOPY);
-
-      if ((rc.right - rc.left) > 200 && (rc.bottom - rc.top) > 200) {
-        const BITMAPINFO& bmi = local_renderer->bmi();
-        image = local_renderer->image();
-        int thumb_width = bmi.bmiHeader.biWidth / 4;
-        int thumb_height = abs(bmi.bmiHeader.biHeight) / 4;
-        StretchDIBits(dc_mem,
-            logical_area.x - thumb_width - 10,
-            logical_area.y - thumb_height - 10,
-            thumb_width, thumb_height,
-            0, 0, bmi.bmiHeader.biWidth, -bmi.bmiHeader.biHeight,
-            image, &bmi, DIB_RGB_COLORS, SRCCOPY);
-      }
-
-      BitBlt(ps.hdc, 0, 0, logical_area.x, logical_area.y,
-             dc_mem, 0, 0, SRCCOPY);
-
-      // Cleanup.
-      ::SelectObject(dc_mem, bmp_old);
-      ::DeleteObject(bmp_mem);
-      ::DeleteDC(dc_mem);
-    } else {
-      // We're still waiting for the video stream to be initialized.
-      HBRUSH brush = ::CreateSolidBrush(RGB(0, 0, 0));
-      ::FillRect(ps.hdc, &rc, brush);
-      ::DeleteObject(brush);
-
-      HGDIOBJ old_font = ::SelectObject(ps.hdc, GetDefaultFont());
-      ::SetTextColor(ps.hdc, RGB(0xff, 0xff, 0xff));
-      ::SetBkMode(ps.hdc, TRANSPARENT);
-
-      std::string text(kConnecting);
-      if (!local_renderer->image()) {
-        text += kNoVideoStreams;
-      } else {
-        text += kNoIncomingStream;
-      }
-      ::DrawTextA(ps.hdc, text.c_str(), -1, &rc,
-          DT_SINGLELINE | DT_CENTER | DT_VCENTER);
-      ::SelectObject(ps.hdc, old_font);
-    }
-  } else {
-    HBRUSH brush = ::CreateSolidBrush(::GetSysColor(COLOR_WINDOW));
-    ::FillRect(ps.hdc, &rc, brush);
-    ::DeleteObject(brush);
-  }
-
-  ::EndPaint(handle(), &ps);
-}
-
-void MainWnd::OnDestroyed() {
-  PostQuitMessage(0);
-}
-
-void MainWnd::OnDefaultAction() {
-  if (!callback_)
-    return;
-  if (ui_ == CONNECT_TO_SERVER) {
-    std::string server(GetWindowText(edit1_));
-    std::string port_str(GetWindowText(edit2_));
-    int port = port_str.length() ? atoi(port_str.c_str()) : 0;
-    callback_->StartLogin(server, port);
-  } else if (ui_ == LIST_PEERS) {
-    LRESULT sel = ::SendMessage(listbox_, LB_GETCURSEL, 0, 0);
-    if (sel != LB_ERR) {
-      LRESULT peer_id = ::SendMessage(listbox_, LB_GETITEMDATA, sel, 0);
-      if (peer_id != -1 && callback_) {
-        callback_->ConnectToPeer(peer_id);
-      }
-    }
-  } else {
-    MessageBoxA(wnd_, "OK!", "Yeah", MB_OK);
-  }
-}
-
-bool MainWnd::OnMessage(UINT msg, WPARAM wp, LPARAM lp, LRESULT* result) {
-  switch (msg) {
-    case WM_ERASEBKGND:
-      *result = TRUE;
-      return true;
-
-    case WM_PAINT:
-      OnPaint();
-      return true;
-
-    case WM_SETFOCUS:
-      if (ui_ == CONNECT_TO_SERVER) {
-        SetFocus(edit1_);
-      } else if (ui_ == LIST_PEERS) {
-        SetFocus(listbox_);
-      }
-      return true;
-
-    case WM_SIZE:
-      if (ui_ == CONNECT_TO_SERVER) {
-        LayoutConnectUI(true);
-      } else if (ui_ == LIST_PEERS) {
-        LayoutPeerListUI(true);
-      }
-      break;
-
-    case WM_CTLCOLORSTATIC:
-      *result = reinterpret_cast<LRESULT>(GetSysColorBrush(COLOR_WINDOW));
-      return true;
-
-    case WM_COMMAND:
-      if (button_ == reinterpret_cast<HWND>(lp)) {
-        if (BN_CLICKED == HIWORD(wp))
-          OnDefaultAction();
-      } else if (listbox_ == reinterpret_cast<HWND>(lp)) {
-        if (LBN_DBLCLK == HIWORD(wp)) {
-          OnDefaultAction();
-        }
-      }
-      return true;
-
-    case WM_CLOSE:
-      if (callback_)
-        callback_->Close();
-      break;
-  }
-  return false;
-}
-
-// static
-LRESULT CALLBACK MainWnd::WndProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp) {
-  MainWnd* me = reinterpret_cast<MainWnd*>(
-      ::GetWindowLongPtr(hwnd, GWLP_USERDATA));
-  if (!me && WM_CREATE == msg) {
-    CREATESTRUCT* cs = reinterpret_cast<CREATESTRUCT*>(lp);
-    me = reinterpret_cast<MainWnd*>(cs->lpCreateParams);
-    me->wnd_ = hwnd;
-    ::SetWindowLongPtr(hwnd, GWLP_USERDATA, reinterpret_cast<LONG_PTR>(me));
-  }
-
-  LRESULT result = 0;
-  if (me) {
-    void* prev_nested_msg = me->nested_msg_;
-    me->nested_msg_ = &msg;
-
-    bool handled = me->OnMessage(msg, wp, lp, &result);
-    if (WM_NCDESTROY == msg) {
-      me->destroyed_ = true;
-    } else if (!handled) {
-      result = ::DefWindowProc(hwnd, msg, wp, lp);
-    }
-
-    if (me->destroyed_ && prev_nested_msg == NULL) {
-      me->OnDestroyed();
-      me->wnd_ = NULL;
-      me->destroyed_ = false;
-    }
-
-    me->nested_msg_ = prev_nested_msg;
-  } else {
-    result = ::DefWindowProc(hwnd, msg, wp, lp);
-  }
-
-  return result;
-}
-
-// static
-bool MainWnd::RegisterWindowClass() {
-  if (wnd_class_)
-    return true;
-
-  WNDCLASSEX wcex = { sizeof(WNDCLASSEX) };
-  wcex.style = CS_DBLCLKS;
-  wcex.hInstance = GetModuleHandle(NULL);
-  wcex.hbrBackground = reinterpret_cast<HBRUSH>(COLOR_WINDOW + 1);
-  wcex.hCursor = ::LoadCursor(NULL, IDC_ARROW);
-  wcex.lpfnWndProc = &WndProc;
-  wcex.lpszClassName = kClassName;
-  wnd_class_ = ::RegisterClassEx(&wcex);
-  RTC_DCHECK(wnd_class_ != 0);
-  return wnd_class_ != 0;
-}
-
-void MainWnd::CreateChildWindow(HWND* wnd, MainWnd::ChildWindowID id,
-                                const wchar_t* class_name, DWORD control_style,
-                                DWORD ex_style) {
-  if (::IsWindow(*wnd))
-    return;
-
-  // Child windows are invisible at first, and shown after being resized.
-  DWORD style = WS_CHILD | control_style;
-  *wnd = ::CreateWindowEx(ex_style, class_name, L"", style,
-                          100, 100, 100, 100, wnd_,
-                          reinterpret_cast<HMENU>(id),
-                          GetModuleHandle(NULL), NULL);
-  RTC_DCHECK(::IsWindow(*wnd) != FALSE);
-  ::SendMessage(*wnd, WM_SETFONT, reinterpret_cast<WPARAM>(GetDefaultFont()),
-                TRUE);
-}
-
-void MainWnd::CreateChildWindows() {
-  // Create the child windows in tab order.
-  CreateChildWindow(&label1_, LABEL1_ID, L"Static", ES_CENTER | ES_READONLY, 0);
-  CreateChildWindow(&edit1_, EDIT_ID, L"Edit",
-                    ES_LEFT | ES_NOHIDESEL | WS_TABSTOP, WS_EX_CLIENTEDGE);
-  CreateChildWindow(&label2_, LABEL2_ID, L"Static", ES_CENTER | ES_READONLY, 0);
-  CreateChildWindow(&edit2_, EDIT_ID, L"Edit",
-                    ES_LEFT | ES_NOHIDESEL | WS_TABSTOP, WS_EX_CLIENTEDGE);
-  CreateChildWindow(&button_, BUTTON_ID, L"Button", BS_CENTER | WS_TABSTOP, 0);
-
-  CreateChildWindow(&listbox_, LISTBOX_ID, L"ListBox",
-                    LBS_HASSTRINGS | LBS_NOTIFY, WS_EX_CLIENTEDGE);
-
-  ::SetWindowTextA(edit1_, server_.c_str());
-  ::SetWindowTextA(edit2_, port_.c_str());
-}
-
-void MainWnd::LayoutConnectUI(bool show) {
-  struct Windows {
-    HWND wnd;
-    const wchar_t* text;
-    size_t width;
-    size_t height;
-  } windows[] = {
-    { label1_, L"Server" },
-    { edit1_, L"XXXyyyYYYgggXXXyyyYYYggg" },
-    { label2_, L":" },
-    { edit2_, L"XyXyX" },
-    { button_, L"Connect" },
-  };
-
-  if (show) {
-    const size_t kSeparator = 5;
-    size_t total_width = (ARRAYSIZE(windows) - 1) * kSeparator;
-
-    for (size_t i = 0; i < ARRAYSIZE(windows); ++i) {
-      CalculateWindowSizeForText(windows[i].wnd, windows[i].text,
-                                 &windows[i].width, &windows[i].height);
-      total_width += windows[i].width;
-    }
-
-    RECT rc;
-    ::GetClientRect(wnd_, &rc);
-    size_t x = (rc.right / 2) - (total_width / 2);
-    size_t y = rc.bottom / 2;
-    for (size_t i = 0; i < ARRAYSIZE(windows); ++i) {
-      size_t top = y - (windows[i].height / 2);
-      ::MoveWindow(windows[i].wnd, static_cast<int>(x), static_cast<int>(top),
-                   static_cast<int>(windows[i].width),
-                   static_cast<int>(windows[i].height),
-                   TRUE);
-      x += kSeparator + windows[i].width;
-      if (windows[i].text[0] != 'X')
-        ::SetWindowText(windows[i].wnd, windows[i].text);
-      ::ShowWindow(windows[i].wnd, SW_SHOWNA);
-    }
-  } else {
-    for (size_t i = 0; i < ARRAYSIZE(windows); ++i) {
-      ::ShowWindow(windows[i].wnd, SW_HIDE);
-    }
-  }
-}
-
-void MainWnd::LayoutPeerListUI(bool show) {
-  if (show) {
-    RECT rc;
-    ::GetClientRect(wnd_, &rc);
-    ::MoveWindow(listbox_, 0, 0, rc.right, rc.bottom, TRUE);
-    ::ShowWindow(listbox_, SW_SHOWNA);
-  } else {
-    ::ShowWindow(listbox_, SW_HIDE);
-    InvalidateRect(wnd_, NULL, TRUE);
-  }
-}
-
-void MainWnd::HandleTabbing() {
-  bool shift = ((::GetAsyncKeyState(VK_SHIFT) & 0x8000) != 0);
-  UINT next_cmd = shift ? GW_HWNDPREV : GW_HWNDNEXT;
-  UINT loop_around_cmd = shift ? GW_HWNDLAST : GW_HWNDFIRST;
-  HWND focus = GetFocus(), next;
-  do {
-    next = ::GetWindow(focus, next_cmd);
-    if (IsWindowVisible(next) &&
-        (GetWindowLong(next, GWL_STYLE) & WS_TABSTOP)) {
-      break;
-    }
-
-    if (!next) {
-      next = ::GetWindow(focus, loop_around_cmd);
-      if (IsWindowVisible(next) &&
-          (GetWindowLong(next, GWL_STYLE) & WS_TABSTOP)) {
-        break;
-      }
-    }
-    focus = next;
-  } while (true);
-  ::SetFocus(next);
-}
-
-//
-// MainWnd::VideoRenderer
-//
-
-MainWnd::VideoRenderer::VideoRenderer(
-    HWND wnd, int width, int height,
-    webrtc::VideoTrackInterface* track_to_render)
-    : wnd_(wnd), rendered_track_(track_to_render) {
-  ::InitializeCriticalSection(&buffer_lock_);
-  ZeroMemory(&bmi_, sizeof(bmi_));
-  bmi_.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
-  bmi_.bmiHeader.biPlanes = 1;
-  bmi_.bmiHeader.biBitCount = 32;
-  bmi_.bmiHeader.biCompression = BI_RGB;
-  bmi_.bmiHeader.biWidth = width;
-  bmi_.bmiHeader.biHeight = -height;
-  bmi_.bmiHeader.biSizeImage = width * height *
-                              (bmi_.bmiHeader.biBitCount >> 3);
-  rendered_track_->AddOrUpdateSink(this, rtc::VideoSinkWants());
-}
-
-MainWnd::VideoRenderer::~VideoRenderer() {
-  rendered_track_->RemoveSink(this);
-  ::DeleteCriticalSection(&buffer_lock_);
-}
-
-void MainWnd::VideoRenderer::SetSize(int width, int height) {
-  AutoLock<VideoRenderer> lock(this);
-
-  if (width == bmi_.bmiHeader.biWidth && height == bmi_.bmiHeader.biHeight) {
-    return;
-  }
-
-  bmi_.bmiHeader.biWidth = width;
-  bmi_.bmiHeader.biHeight = -height;
-  bmi_.bmiHeader.biSizeImage = width * height *
-                               (bmi_.bmiHeader.biBitCount >> 3);
-  image_.reset(new uint8_t[bmi_.bmiHeader.biSizeImage]);
-}
-
-void MainWnd::VideoRenderer::OnFrame(
-    const webrtc::VideoFrame& video_frame) {
-
-  {
-    AutoLock<VideoRenderer> lock(this);
-
-    rtc::scoped_refptr<webrtc::I420BufferInterface> buffer(
-        video_frame.video_frame_buffer()->ToI420());
-    if (video_frame.rotation() != webrtc::kVideoRotation_0) {
-      buffer = webrtc::I420Buffer::Rotate(*buffer, video_frame.rotation());
-    }
-
-    SetSize(buffer->width(), buffer->height());
-
-    RTC_DCHECK(image_.get() != NULL);
-    libyuv::I420ToARGB(buffer->DataY(), buffer->StrideY(),
-                       buffer->DataU(), buffer->StrideU(),
-                       buffer->DataV(), buffer->StrideV(),
-                       image_.get(),
-                       bmi_.bmiHeader.biWidth *
-                           bmi_.bmiHeader.biBitCount / 8,
-                       buffer->width(), buffer->height());
-  }
-  InvalidateRect(wnd_, NULL, TRUE);
-}
diff --git a/examples/peerconnection/client/main_wnd.h b/examples/peerconnection/client/main_wnd.h
deleted file mode 100644
index 18f56a7..0000000
--- a/examples/peerconnection/client/main_wnd.h
+++ /dev/null
@@ -1,201 +0,0 @@
-/*
- *  Copyright 2012 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_EXAMPLES_PEERCONNECTION_CLIENT_MAIN_WND_H_
-#define WEBRTC_EXAMPLES_PEERCONNECTION_CLIENT_MAIN_WND_H_
-
-#include <map>
-#include <memory>
-#include <string>
-
-#include "webrtc/api/mediastreaminterface.h"
-#include "webrtc/api/video/video_frame.h"
-#include "webrtc/examples/peerconnection/client/peer_connection_client.h"
-#include "webrtc/media/base/mediachannel.h"
-#include "webrtc/media/base/videocommon.h"
-#include "webrtc/rtc_base/win32.h"
-
-class MainWndCallback {
- public:
-  virtual void StartLogin(const std::string& server, int port) = 0;
-  virtual void DisconnectFromServer() = 0;
-  virtual void ConnectToPeer(int peer_id) = 0;
-  virtual void DisconnectFromCurrentPeer() = 0;
-  virtual void UIThreadCallback(int msg_id, void* data) = 0;
-  virtual void Close() = 0;
- protected:
-  virtual ~MainWndCallback() {}
-};
-
-// Pure virtual interface for the main window.
-class MainWindow {
- public:
-  virtual ~MainWindow() {}
-
-  enum UI {
-    CONNECT_TO_SERVER,
-    LIST_PEERS,
-    STREAMING,
-  };
-
-  virtual void RegisterObserver(MainWndCallback* callback) = 0;
-
-  virtual bool IsWindow() = 0;
-  virtual void MessageBox(const char* caption, const char* text,
-                          bool is_error) = 0;
-
-  virtual UI current_ui() = 0;
-
-  virtual void SwitchToConnectUI() = 0;
-  virtual void SwitchToPeerList(const Peers& peers) = 0;
-  virtual void SwitchToStreamingUI() = 0;
-
-  virtual void StartLocalRenderer(webrtc::VideoTrackInterface* local_video) = 0;
-  virtual void StopLocalRenderer() = 0;
-  virtual void StartRemoteRenderer(
-      webrtc::VideoTrackInterface* remote_video) = 0;
-  virtual void StopRemoteRenderer() = 0;
-
-  virtual void QueueUIThreadCallback(int msg_id, void* data) = 0;
-};
-
-#ifdef WIN32
-
-class MainWnd : public MainWindow {
- public:
-  static const wchar_t kClassName[];
-
-  enum WindowMessages {
-    UI_THREAD_CALLBACK = WM_APP + 1,
-  };
-
-  MainWnd(const char* server, int port, bool auto_connect, bool auto_call);
-  ~MainWnd();
-
-  bool Create();
-  bool Destroy();
-  bool PreTranslateMessage(MSG* msg);
-
-  virtual void RegisterObserver(MainWndCallback* callback);
-  virtual bool IsWindow();
-  virtual void SwitchToConnectUI();
-  virtual void SwitchToPeerList(const Peers& peers);
-  virtual void SwitchToStreamingUI();
-  virtual void MessageBox(const char* caption, const char* text,
-                          bool is_error);
-  virtual UI current_ui() { return ui_; }
-
-  virtual void StartLocalRenderer(webrtc::VideoTrackInterface* local_video);
-  virtual void StopLocalRenderer();
-  virtual void StartRemoteRenderer(webrtc::VideoTrackInterface* remote_video);
-  virtual void StopRemoteRenderer();
-
-  virtual void QueueUIThreadCallback(int msg_id, void* data);
-
-  HWND handle() const { return wnd_; }
-
-  class VideoRenderer : public rtc::VideoSinkInterface<webrtc::VideoFrame> {
-   public:
-    VideoRenderer(HWND wnd, int width, int height,
-                  webrtc::VideoTrackInterface* track_to_render);
-    virtual ~VideoRenderer();
-
-    void Lock() {
-      ::EnterCriticalSection(&buffer_lock_);
-    }
-
-    void Unlock() {
-      ::LeaveCriticalSection(&buffer_lock_);
-    }
-
-    // VideoSinkInterface implementation
-    void OnFrame(const webrtc::VideoFrame& frame) override;
-
-    const BITMAPINFO& bmi() const { return bmi_; }
-    const uint8_t* image() const { return image_.get(); }
-
-   protected:
-    void SetSize(int width, int height);
-
-    enum {
-      SET_SIZE,
-      RENDER_FRAME,
-    };
-
-    HWND wnd_;
-    BITMAPINFO bmi_;
-    std::unique_ptr<uint8_t[]> image_;
-    CRITICAL_SECTION buffer_lock_;
-    rtc::scoped_refptr<webrtc::VideoTrackInterface> rendered_track_;
-  };
-
-  // A little helper class to make sure we always to proper locking and
-  // unlocking when working with VideoRenderer buffers.
-  template <typename T>
-  class AutoLock {
-   public:
-    explicit AutoLock(T* obj) : obj_(obj) { obj_->Lock(); }
-    ~AutoLock() { obj_->Unlock(); }
-   protected:
-    T* obj_;
-  };
-
- protected:
-  enum ChildWindowID {
-    EDIT_ID = 1,
-    BUTTON_ID,
-    LABEL1_ID,
-    LABEL2_ID,
-    LISTBOX_ID,
-  };
-
-  void OnPaint();
-  void OnDestroyed();
-
-  void OnDefaultAction();
-
-  bool OnMessage(UINT msg, WPARAM wp, LPARAM lp, LRESULT* result);
-
-  static LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp);
-  static bool RegisterWindowClass();
-
-  void CreateChildWindow(HWND* wnd, ChildWindowID id, const wchar_t* class_name,
-                         DWORD control_style, DWORD ex_style);
-  void CreateChildWindows();
-
-  void LayoutConnectUI(bool show);
-  void LayoutPeerListUI(bool show);
-
-  void HandleTabbing();
-
- private:
-  std::unique_ptr<VideoRenderer> local_renderer_;
-  std::unique_ptr<VideoRenderer> remote_renderer_;
-  UI ui_;
-  HWND wnd_;
-  DWORD ui_thread_id_;
-  HWND edit1_;
-  HWND edit2_;
-  HWND label1_;
-  HWND label2_;
-  HWND button_;
-  HWND listbox_;
-  bool destroyed_;
-  void* nested_msg_;
-  MainWndCallback* callback_;
-  static ATOM wnd_class_;
-  std::string server_;
-  std::string port_;
-  bool auto_connect_;
-  bool auto_call_;
-};
-#endif  // WIN32
-
-#endif  // WEBRTC_EXAMPLES_PEERCONNECTION_CLIENT_MAIN_WND_H_
diff --git a/examples/peerconnection/client/peer_connection_client.cc b/examples/peerconnection/client/peer_connection_client.cc
deleted file mode 100644
index 24ae5e5..0000000
--- a/examples/peerconnection/client/peer_connection_client.cc
+++ /dev/null
@@ -1,513 +0,0 @@
-/*
- *  Copyright 2012 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/examples/peerconnection/client/peer_connection_client.h"
-
-#include "webrtc/examples/peerconnection/client/defaults.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/nethelpers.h"
-#include "webrtc/rtc_base/stringutils.h"
-
-#ifdef WIN32
-#include "webrtc/rtc_base/win32socketserver.h"
-#endif
-
-using rtc::sprintfn;
-
-namespace {
-
-// This is our magical hangup signal.
-const char kByeMessage[] = "BYE";
-// Delay between server connection retries, in milliseconds
-const int kReconnectDelay = 2000;
-
-rtc::AsyncSocket* CreateClientSocket(int family) {
-#ifdef WIN32
-  rtc::Win32Socket* sock = new rtc::Win32Socket();
-  sock->CreateT(family, SOCK_STREAM);
-  return sock;
-#elif defined(WEBRTC_POSIX)
-  rtc::Thread* thread = rtc::Thread::Current();
-  RTC_DCHECK(thread != NULL);
-  return thread->socketserver()->CreateAsyncSocket(family, SOCK_STREAM);
-#else
-#error Platform not supported.
-#endif
-}
-
-}  // namespace
-
-PeerConnectionClient::PeerConnectionClient()
-  : callback_(NULL),
-    resolver_(NULL),
-    state_(NOT_CONNECTED),
-    my_id_(-1) {
-}
-
-PeerConnectionClient::~PeerConnectionClient() {
-}
-
-void PeerConnectionClient::InitSocketSignals() {
-  RTC_DCHECK(control_socket_.get() != NULL);
-  RTC_DCHECK(hanging_get_.get() != NULL);
-  control_socket_->SignalCloseEvent.connect(this,
-      &PeerConnectionClient::OnClose);
-  hanging_get_->SignalCloseEvent.connect(this,
-      &PeerConnectionClient::OnClose);
-  control_socket_->SignalConnectEvent.connect(this,
-      &PeerConnectionClient::OnConnect);
-  hanging_get_->SignalConnectEvent.connect(this,
-      &PeerConnectionClient::OnHangingGetConnect);
-  control_socket_->SignalReadEvent.connect(this,
-      &PeerConnectionClient::OnRead);
-  hanging_get_->SignalReadEvent.connect(this,
-      &PeerConnectionClient::OnHangingGetRead);
-}
-
-int PeerConnectionClient::id() const {
-  return my_id_;
-}
-
-bool PeerConnectionClient::is_connected() const {
-  return my_id_ != -1;
-}
-
-const Peers& PeerConnectionClient::peers() const {
-  return peers_;
-}
-
-void PeerConnectionClient::RegisterObserver(
-    PeerConnectionClientObserver* callback) {
-  RTC_DCHECK(!callback_);
-  callback_ = callback;
-}
-
-void PeerConnectionClient::Connect(const std::string& server, int port,
-                                   const std::string& client_name) {
-  RTC_DCHECK(!server.empty());
-  RTC_DCHECK(!client_name.empty());
-
-  if (state_ != NOT_CONNECTED) {
-    LOG(WARNING)
-        << "The client must not be connected before you can call Connect()";
-    callback_->OnServerConnectionFailure();
-    return;
-  }
-
-  if (server.empty() || client_name.empty()) {
-    callback_->OnServerConnectionFailure();
-    return;
-  }
-
-  if (port <= 0)
-    port = kDefaultServerPort;
-
-  server_address_.SetIP(server);
-  server_address_.SetPort(port);
-  client_name_ = client_name;
-
-  if (server_address_.IsUnresolvedIP()) {
-    state_ = RESOLVING;
-    resolver_ = new rtc::AsyncResolver();
-    resolver_->SignalDone.connect(this, &PeerConnectionClient::OnResolveResult);
-    resolver_->Start(server_address_);
-  } else {
-    DoConnect();
-  }
-}
-
-void PeerConnectionClient::OnResolveResult(
-    rtc::AsyncResolverInterface* resolver) {
-  if (resolver_->GetError() != 0) {
-    callback_->OnServerConnectionFailure();
-    resolver_->Destroy(false);
-    resolver_ = NULL;
-    state_ = NOT_CONNECTED;
-  } else {
-    server_address_ = resolver_->address();
-    DoConnect();
-  }
-}
-
-void PeerConnectionClient::DoConnect() {
-  control_socket_.reset(CreateClientSocket(server_address_.ipaddr().family()));
-  hanging_get_.reset(CreateClientSocket(server_address_.ipaddr().family()));
-  InitSocketSignals();
-  char buffer[1024];
-  sprintfn(buffer, sizeof(buffer),
-           "GET /sign_in?%s HTTP/1.0\r\n\r\n", client_name_.c_str());
-  onconnect_data_ = buffer;
-
-  bool ret = ConnectControlSocket();
-  if (ret)
-    state_ = SIGNING_IN;
-  if (!ret) {
-    callback_->OnServerConnectionFailure();
-  }
-}
-
-bool PeerConnectionClient::SendToPeer(int peer_id, const std::string& message) {
-  if (state_ != CONNECTED)
-    return false;
-
-  RTC_DCHECK(is_connected());
-  RTC_DCHECK(control_socket_->GetState() == rtc::Socket::CS_CLOSED);
-  if (!is_connected() || peer_id == -1)
-    return false;
-
-  char headers[1024];
-  sprintfn(headers, sizeof(headers),
-      "POST /message?peer_id=%i&to=%i HTTP/1.0\r\n"
-      "Content-Length: %i\r\n"
-      "Content-Type: text/plain\r\n"
-      "\r\n",
-      my_id_, peer_id, message.length());
-  onconnect_data_ = headers;
-  onconnect_data_ += message;
-  return ConnectControlSocket();
-}
-
-bool PeerConnectionClient::SendHangUp(int peer_id) {
-  return SendToPeer(peer_id, kByeMessage);
-}
-
-bool PeerConnectionClient::IsSendingMessage() {
-  return state_ == CONNECTED &&
-         control_socket_->GetState() != rtc::Socket::CS_CLOSED;
-}
-
-bool PeerConnectionClient::SignOut() {
-  if (state_ == NOT_CONNECTED || state_ == SIGNING_OUT)
-    return true;
-
-  if (hanging_get_->GetState() != rtc::Socket::CS_CLOSED)
-    hanging_get_->Close();
-
-  if (control_socket_->GetState() == rtc::Socket::CS_CLOSED) {
-    state_ = SIGNING_OUT;
-
-    if (my_id_ != -1) {
-      char buffer[1024];
-      sprintfn(buffer, sizeof(buffer),
-          "GET /sign_out?peer_id=%i HTTP/1.0\r\n\r\n", my_id_);
-      onconnect_data_ = buffer;
-      return ConnectControlSocket();
-    } else {
-      // Can occur if the app is closed before we finish connecting.
-      return true;
-    }
-  } else {
-    state_ = SIGNING_OUT_WAITING;
-  }
-
-  return true;
-}
-
-void PeerConnectionClient::Close() {
-  control_socket_->Close();
-  hanging_get_->Close();
-  onconnect_data_.clear();
-  peers_.clear();
-  if (resolver_ != NULL) {
-    resolver_->Destroy(false);
-    resolver_ = NULL;
-  }
-  my_id_ = -1;
-  state_ = NOT_CONNECTED;
-}
-
-bool PeerConnectionClient::ConnectControlSocket() {
-  RTC_DCHECK(control_socket_->GetState() == rtc::Socket::CS_CLOSED);
-  int err = control_socket_->Connect(server_address_);
-  if (err == SOCKET_ERROR) {
-    Close();
-    return false;
-  }
-  return true;
-}
-
-void PeerConnectionClient::OnConnect(rtc::AsyncSocket* socket) {
-  RTC_DCHECK(!onconnect_data_.empty());
-  size_t sent = socket->Send(onconnect_data_.c_str(), onconnect_data_.length());
-  RTC_DCHECK(sent == onconnect_data_.length());
-  onconnect_data_.clear();
-}
-
-void PeerConnectionClient::OnHangingGetConnect(rtc::AsyncSocket* socket) {
-  char buffer[1024];
-  sprintfn(buffer, sizeof(buffer),
-           "GET /wait?peer_id=%i HTTP/1.0\r\n\r\n", my_id_);
-  int len = static_cast<int>(strlen(buffer));
-  int sent = socket->Send(buffer, len);
-  RTC_DCHECK(sent == len);
-}
-
-void PeerConnectionClient::OnMessageFromPeer(int peer_id,
-                                             const std::string& message) {
-  if (message.length() == (sizeof(kByeMessage) - 1) &&
-      message.compare(kByeMessage) == 0) {
-    callback_->OnPeerDisconnected(peer_id);
-  } else {
-    callback_->OnMessageFromPeer(peer_id, message);
-  }
-}
-
-bool PeerConnectionClient::GetHeaderValue(const std::string& data,
-                                          size_t eoh,
-                                          const char* header_pattern,
-                                          size_t* value) {
-  RTC_DCHECK(value != NULL);
-  size_t found = data.find(header_pattern);
-  if (found != std::string::npos && found < eoh) {
-    *value = atoi(&data[found + strlen(header_pattern)]);
-    return true;
-  }
-  return false;
-}
-
-bool PeerConnectionClient::GetHeaderValue(const std::string& data, size_t eoh,
-                                          const char* header_pattern,
-                                          std::string* value) {
-  RTC_DCHECK(value != NULL);
-  size_t found = data.find(header_pattern);
-  if (found != std::string::npos && found < eoh) {
-    size_t begin = found + strlen(header_pattern);
-    size_t end = data.find("\r\n", begin);
-    if (end == std::string::npos)
-      end = eoh;
-    value->assign(data.substr(begin, end - begin));
-    return true;
-  }
-  return false;
-}
-
-bool PeerConnectionClient::ReadIntoBuffer(rtc::AsyncSocket* socket,
-                                          std::string* data,
-                                          size_t* content_length) {
-  char buffer[0xffff];
-  do {
-    int bytes = socket->Recv(buffer, sizeof(buffer), nullptr);
-    if (bytes <= 0)
-      break;
-    data->append(buffer, bytes);
-  } while (true);
-
-  bool ret = false;
-  size_t i = data->find("\r\n\r\n");
-  if (i != std::string::npos) {
-    LOG(INFO) << "Headers received";
-    if (GetHeaderValue(*data, i, "\r\nContent-Length: ", content_length)) {
-      size_t total_response_size = (i + 4) + *content_length;
-      if (data->length() >= total_response_size) {
-        ret = true;
-        std::string should_close;
-        const char kConnection[] = "\r\nConnection: ";
-        if (GetHeaderValue(*data, i, kConnection, &should_close) &&
-            should_close.compare("close") == 0) {
-          socket->Close();
-          // Since we closed the socket, there was no notification delivered
-          // to us.  Compensate by letting ourselves know.
-          OnClose(socket, 0);
-        }
-      } else {
-        // We haven't received everything.  Just continue to accept data.
-      }
-    } else {
-      LOG(LS_ERROR) << "No content length field specified by the server.";
-    }
-  }
-  return ret;
-}
-
-void PeerConnectionClient::OnRead(rtc::AsyncSocket* socket) {
-  size_t content_length = 0;
-  if (ReadIntoBuffer(socket, &control_data_, &content_length)) {
-    size_t peer_id = 0, eoh = 0;
-    bool ok = ParseServerResponse(control_data_, content_length, &peer_id,
-                                  &eoh);
-    if (ok) {
-      if (my_id_ == -1) {
-        // First response.  Let's store our server assigned ID.
-        RTC_DCHECK(state_ == SIGNING_IN);
-        my_id_ = static_cast<int>(peer_id);
-        RTC_DCHECK(my_id_ != -1);
-
-        // The body of the response will be a list of already connected peers.
-        if (content_length) {
-          size_t pos = eoh + 4;
-          while (pos < control_data_.size()) {
-            size_t eol = control_data_.find('\n', pos);
-            if (eol == std::string::npos)
-              break;
-            int id = 0;
-            std::string name;
-            bool connected;
-            if (ParseEntry(control_data_.substr(pos, eol - pos), &name, &id,
-                           &connected) && id != my_id_) {
-              peers_[id] = name;
-              callback_->OnPeerConnected(id, name);
-            }
-            pos = eol + 1;
-          }
-        }
-        RTC_DCHECK(is_connected());
-        callback_->OnSignedIn();
-      } else if (state_ == SIGNING_OUT) {
-        Close();
-        callback_->OnDisconnected();
-      } else if (state_ == SIGNING_OUT_WAITING) {
-        SignOut();
-      }
-    }
-
-    control_data_.clear();
-
-    if (state_ == SIGNING_IN) {
-      RTC_DCHECK(hanging_get_->GetState() == rtc::Socket::CS_CLOSED);
-      state_ = CONNECTED;
-      hanging_get_->Connect(server_address_);
-    }
-  }
-}
-
-void PeerConnectionClient::OnHangingGetRead(rtc::AsyncSocket* socket) {
-  LOG(INFO) << __FUNCTION__;
-  size_t content_length = 0;
-  if (ReadIntoBuffer(socket, &notification_data_, &content_length)) {
-    size_t peer_id = 0, eoh = 0;
-    bool ok = ParseServerResponse(notification_data_, content_length,
-                                  &peer_id, &eoh);
-
-    if (ok) {
-      // Store the position where the body begins.
-      size_t pos = eoh + 4;
-
-      if (my_id_ == static_cast<int>(peer_id)) {
-        // A notification about a new member or a member that just
-        // disconnected.
-        int id = 0;
-        std::string name;
-        bool connected = false;
-        if (ParseEntry(notification_data_.substr(pos), &name, &id,
-                       &connected)) {
-          if (connected) {
-            peers_[id] = name;
-            callback_->OnPeerConnected(id, name);
-          } else {
-            peers_.erase(id);
-            callback_->OnPeerDisconnected(id);
-          }
-        }
-      } else {
-        OnMessageFromPeer(static_cast<int>(peer_id),
-                          notification_data_.substr(pos));
-      }
-    }
-
-    notification_data_.clear();
-  }
-
-  if (hanging_get_->GetState() == rtc::Socket::CS_CLOSED &&
-      state_ == CONNECTED) {
-    hanging_get_->Connect(server_address_);
-  }
-}
-
-bool PeerConnectionClient::ParseEntry(const std::string& entry,
-                                      std::string* name,
-                                      int* id,
-                                      bool* connected) {
-  RTC_DCHECK(name != NULL);
-  RTC_DCHECK(id != NULL);
-  RTC_DCHECK(connected != NULL);
-  RTC_DCHECK(!entry.empty());
-
-  *connected = false;
-  size_t separator = entry.find(',');
-  if (separator != std::string::npos) {
-    *id = atoi(&entry[separator + 1]);
-    name->assign(entry.substr(0, separator));
-    separator = entry.find(',', separator + 1);
-    if (separator != std::string::npos) {
-      *connected = atoi(&entry[separator + 1]) ? true : false;
-    }
-  }
-  return !name->empty();
-}
-
-int PeerConnectionClient::GetResponseStatus(const std::string& response) {
-  int status = -1;
-  size_t pos = response.find(' ');
-  if (pos != std::string::npos)
-    status = atoi(&response[pos + 1]);
-  return status;
-}
-
-bool PeerConnectionClient::ParseServerResponse(const std::string& response,
-                                               size_t content_length,
-                                               size_t* peer_id,
-                                               size_t* eoh) {
-  int status = GetResponseStatus(response.c_str());
-  if (status != 200) {
-    LOG(LS_ERROR) << "Received error from server";
-    Close();
-    callback_->OnDisconnected();
-    return false;
-  }
-
-  *eoh = response.find("\r\n\r\n");
-  RTC_DCHECK(*eoh != std::string::npos);
-  if (*eoh == std::string::npos)
-    return false;
-
-  *peer_id = -1;
-
-  // See comment in peer_channel.cc for why we use the Pragma header and
-  // not e.g. "X-Peer-Id".
-  GetHeaderValue(response, *eoh, "\r\nPragma: ", peer_id);
-
-  return true;
-}
-
-void PeerConnectionClient::OnClose(rtc::AsyncSocket* socket, int err) {
-  LOG(INFO) << __FUNCTION__;
-
-  socket->Close();
-
-#ifdef WIN32
-  if (err != WSAECONNREFUSED) {
-#else
-  if (err != ECONNREFUSED) {
-#endif
-    if (socket == hanging_get_.get()) {
-      if (state_ == CONNECTED) {
-        hanging_get_->Close();
-        hanging_get_->Connect(server_address_);
-      }
-    } else {
-      callback_->OnMessageSent(err);
-    }
-  } else {
-    if (socket == control_socket_.get()) {
-      LOG(WARNING) << "Connection refused; retrying in 2 seconds";
-      rtc::Thread::Current()->PostDelayed(RTC_FROM_HERE, kReconnectDelay, this,
-                                          0);
-    } else {
-      Close();
-      callback_->OnDisconnected();
-    }
-  }
-}
-
-void PeerConnectionClient::OnMessage(rtc::Message* msg) {
-  // ignore msg; there is currently only one supported message ("retry")
-  DoConnect();
-}
diff --git a/examples/peerconnection/client/peer_connection_client.h b/examples/peerconnection/client/peer_connection_client.h
deleted file mode 100644
index a4bdf66..0000000
--- a/examples/peerconnection/client/peer_connection_client.h
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- *  Copyright 2011 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_EXAMPLES_PEERCONNECTION_CLIENT_PEER_CONNECTION_CLIENT_H_
-#define WEBRTC_EXAMPLES_PEERCONNECTION_CLIENT_PEER_CONNECTION_CLIENT_H_
-
-#include <map>
-#include <memory>
-#include <string>
-
-#include "webrtc/rtc_base/nethelpers.h"
-#include "webrtc/rtc_base/physicalsocketserver.h"
-#include "webrtc/rtc_base/signalthread.h"
-#include "webrtc/rtc_base/sigslot.h"
-
-typedef std::map<int, std::string> Peers;
-
-struct PeerConnectionClientObserver {
-  virtual void OnSignedIn() = 0;  // Called when we're logged on.
-  virtual void OnDisconnected() = 0;
-  virtual void OnPeerConnected(int id, const std::string& name) = 0;
-  virtual void OnPeerDisconnected(int peer_id) = 0;
-  virtual void OnMessageFromPeer(int peer_id, const std::string& message) = 0;
-  virtual void OnMessageSent(int err) = 0;
-  virtual void OnServerConnectionFailure() = 0;
-
- protected:
-  virtual ~PeerConnectionClientObserver() {}
-};
-
-class PeerConnectionClient : public sigslot::has_slots<>,
-                             public rtc::MessageHandler {
- public:
-  enum State {
-    NOT_CONNECTED,
-    RESOLVING,
-    SIGNING_IN,
-    CONNECTED,
-    SIGNING_OUT_WAITING,
-    SIGNING_OUT,
-  };
-
-  PeerConnectionClient();
-  ~PeerConnectionClient();
-
-  int id() const;
-  bool is_connected() const;
-  const Peers& peers() const;
-
-  void RegisterObserver(PeerConnectionClientObserver* callback);
-
-  void Connect(const std::string& server, int port,
-               const std::string& client_name);
-
-  bool SendToPeer(int peer_id, const std::string& message);
-  bool SendHangUp(int peer_id);
-  bool IsSendingMessage();
-
-  bool SignOut();
-
-  // implements the MessageHandler interface
-  void OnMessage(rtc::Message* msg);
-
- protected:
-  void DoConnect();
-  void Close();
-  void InitSocketSignals();
-  bool ConnectControlSocket();
-  void OnConnect(rtc::AsyncSocket* socket);
-  void OnHangingGetConnect(rtc::AsyncSocket* socket);
-  void OnMessageFromPeer(int peer_id, const std::string& message);
-
-  // Quick and dirty support for parsing HTTP header values.
-  bool GetHeaderValue(const std::string& data, size_t eoh,
-                      const char* header_pattern, size_t* value);
-
-  bool GetHeaderValue(const std::string& data, size_t eoh,
-                      const char* header_pattern, std::string* value);
-
-  // Returns true if the whole response has been read.
-  bool ReadIntoBuffer(rtc::AsyncSocket* socket, std::string* data,
-                      size_t* content_length);
-
-  void OnRead(rtc::AsyncSocket* socket);
-
-  void OnHangingGetRead(rtc::AsyncSocket* socket);
-
-  // Parses a single line entry in the form "<name>,<id>,<connected>"
-  bool ParseEntry(const std::string& entry, std::string* name, int* id,
-                  bool* connected);
-
-  int GetResponseStatus(const std::string& response);
-
-  bool ParseServerResponse(const std::string& response, size_t content_length,
-                           size_t* peer_id, size_t* eoh);
-
-  void OnClose(rtc::AsyncSocket* socket, int err);
-
-  void OnResolveResult(rtc::AsyncResolverInterface* resolver);
-
-  PeerConnectionClientObserver* callback_;
-  rtc::SocketAddress server_address_;
-  rtc::AsyncResolver* resolver_;
-  std::unique_ptr<rtc::AsyncSocket> control_socket_;
-  std::unique_ptr<rtc::AsyncSocket> hanging_get_;
-  std::string onconnect_data_;
-  std::string control_data_;
-  std::string notification_data_;
-  std::string client_name_;
-  Peers peers_;
-  State state_;
-  int my_id_;
-};
-
-#endif  // WEBRTC_EXAMPLES_PEERCONNECTION_CLIENT_PEER_CONNECTION_CLIENT_H_
diff --git a/examples/peerconnection/server/data_socket.cc b/examples/peerconnection/server/data_socket.cc
deleted file mode 100644
index 60e40a6..0000000
--- a/examples/peerconnection/server/data_socket.cc
+++ /dev/null
@@ -1,293 +0,0 @@
-/*
- *  Copyright 2011 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/examples/peerconnection/server/data_socket.h"
-
-#include <ctype.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#if defined(WEBRTC_POSIX)
-#include <unistd.h>
-#endif
-
-#include "webrtc/examples/peerconnection/server/utils.h"
-
-static const char kHeaderTerminator[] = "\r\n\r\n";
-static const int kHeaderTerminatorLength = sizeof(kHeaderTerminator) - 1;
-
-// static
-const char DataSocket::kCrossOriginAllowHeaders[] =
-    "Access-Control-Allow-Origin: *\r\n"
-    "Access-Control-Allow-Credentials: true\r\n"
-    "Access-Control-Allow-Methods: POST, GET, OPTIONS\r\n"
-    "Access-Control-Allow-Headers: Content-Type, "
-        "Content-Length, Connection, Cache-Control\r\n"
-    "Access-Control-Expose-Headers: Content-Length, X-Peer-Id\r\n";
-
-#if defined(WIN32)
-class WinsockInitializer {
-  static WinsockInitializer singleton;
-
-  WinsockInitializer() {
-    WSADATA data;
-    WSAStartup(MAKEWORD(1, 0), &data);
-  }
-
- public:
-  ~WinsockInitializer() { WSACleanup(); }
-};
-WinsockInitializer WinsockInitializer::singleton;
-#endif
-
-//
-// SocketBase
-//
-
-bool SocketBase::Create() {
-  assert(!valid());
-  socket_ = ::socket(AF_INET, SOCK_STREAM, 0);
-  return valid();
-}
-
-void SocketBase::Close() {
-  if (socket_ != INVALID_SOCKET) {
-    closesocket(socket_);
-    socket_ = INVALID_SOCKET;
-  }
-}
-
-//
-// DataSocket
-//
-
-std::string DataSocket::request_arguments() const {
-  size_t args = request_path_.find('?');
-  if (args != std::string::npos)
-    return request_path_.substr(args + 1);
-  return "";
-}
-
-bool DataSocket::PathEquals(const char* path) const {
-  assert(path);
-  size_t args = request_path_.find('?');
-  if (args != std::string::npos)
-    return request_path_.substr(0, args).compare(path) == 0;
-  return request_path_.compare(path) == 0;
-}
-
-bool DataSocket::OnDataAvailable(bool* close_socket) {
-  assert(valid());
-  char buffer[0xfff] = {0};
-  int bytes = recv(socket_, buffer, sizeof(buffer), 0);
-  if (bytes == SOCKET_ERROR || bytes == 0) {
-    *close_socket = true;
-    return false;
-  }
-
-  *close_socket = false;
-
-  bool ret = true;
-  if (headers_received()) {
-    if (method_ != POST) {
-      // unexpectedly received data.
-      ret = false;
-    } else {
-      data_.append(buffer, bytes);
-    }
-  } else {
-    request_headers_.append(buffer, bytes);
-    size_t found = request_headers_.find(kHeaderTerminator);
-    if (found != std::string::npos) {
-      data_ = request_headers_.substr(found + kHeaderTerminatorLength);
-      request_headers_.resize(found + kHeaderTerminatorLength);
-      ret = ParseHeaders();
-    }
-  }
-  return ret;
-}
-
-bool DataSocket::Send(const std::string& data) const {
-  return send(socket_, data.data(), static_cast<int>(data.length()), 0) !=
-      SOCKET_ERROR;
-}
-
-bool DataSocket::Send(const std::string& status, bool connection_close,
-                      const std::string& content_type,
-                      const std::string& extra_headers,
-                      const std::string& data) const {
-  assert(valid());
-  assert(!status.empty());
-  std::string buffer("HTTP/1.1 " + status + "\r\n");
-
-  buffer += "Server: PeerConnectionTestServer/0.1\r\n"
-            "Cache-Control: no-cache\r\n";
-
-  if (connection_close)
-    buffer += "Connection: close\r\n";
-
-  if (!content_type.empty())
-    buffer += "Content-Type: " + content_type + "\r\n";
-
-  buffer += "Content-Length: " + int2str(static_cast<int>(data.size())) +
-            "\r\n";
-
-  if (!extra_headers.empty()) {
-    buffer += extra_headers;
-    // Extra headers are assumed to have a separator per header.
-  }
-
-  buffer += kCrossOriginAllowHeaders;
-
-  buffer += "\r\n";
-  buffer += data;
-
-  return Send(buffer);
-}
-
-void DataSocket::Clear() {
-  method_ = INVALID;
-  content_length_ = 0;
-  content_type_.clear();
-  request_path_.clear();
-  request_headers_.clear();
-  data_.clear();
-}
-
-bool DataSocket::ParseHeaders() {
-  assert(!request_headers_.empty());
-  assert(method_ == INVALID);
-  size_t i = request_headers_.find("\r\n");
-  if (i == std::string::npos)
-    return false;
-
-  if (!ParseMethodAndPath(request_headers_.data(), i))
-    return false;
-
-  assert(method_ != INVALID);
-  assert(!request_path_.empty());
-
-  if (method_ == POST) {
-    const char* headers = request_headers_.data() + i + 2;
-    size_t len = request_headers_.length() - i - 2;
-    if (!ParseContentLengthAndType(headers, len))
-      return false;
-  }
-
-  return true;
-}
-
-bool DataSocket::ParseMethodAndPath(const char* begin, size_t len) {
-  struct {
-    const char* method_name;
-    size_t method_name_len;
-    RequestMethod id;
-  } supported_methods[] = {
-    { "GET", 3, GET },
-    { "POST", 4, POST },
-    { "OPTIONS", 7, OPTIONS },
-  };
-
-  const char* path = NULL;
-  for (size_t i = 0; i < ARRAYSIZE(supported_methods); ++i) {
-    if (len > supported_methods[i].method_name_len &&
-        isspace(begin[supported_methods[i].method_name_len]) &&
-        strncmp(begin, supported_methods[i].method_name,
-                supported_methods[i].method_name_len) == 0) {
-      method_ = supported_methods[i].id;
-      path = begin + supported_methods[i].method_name_len;
-      break;
-    }
-  }
-
-  const char* end = begin + len;
-  if (!path || path >= end)
-    return false;
-
-  ++path;
-  begin = path;
-  while (!isspace(*path) && path < end)
-    ++path;
-
-  request_path_.assign(begin, path - begin);
-
-  return true;
-}
-
-bool DataSocket::ParseContentLengthAndType(const char* headers, size_t length) {
-  assert(content_length_ == 0);
-  assert(content_type_.empty());
-
-  const char* end = headers + length;
-  while (headers && headers < end) {
-    if (!isspace(headers[0])) {
-      static const char kContentLength[] = "Content-Length:";
-      static const char kContentType[] = "Content-Type:";
-      if ((headers + ARRAYSIZE(kContentLength)) < end &&
-          strncmp(headers, kContentLength,
-                  ARRAYSIZE(kContentLength) - 1) == 0) {
-        headers += ARRAYSIZE(kContentLength) - 1;
-        while (headers[0] == ' ')
-          ++headers;
-        content_length_ = atoi(headers);
-      } else if ((headers + ARRAYSIZE(kContentType)) < end &&
-                 strncmp(headers, kContentType,
-                         ARRAYSIZE(kContentType) - 1) == 0) {
-        headers += ARRAYSIZE(kContentType) - 1;
-        while (headers[0] == ' ')
-          ++headers;
-        const char* type_end = strstr(headers, "\r\n");
-        if (type_end == NULL)
-          type_end = end;
-        content_type_.assign(headers, type_end);
-      }
-    } else {
-      ++headers;
-    }
-    headers = strstr(headers, "\r\n");
-    if (headers)
-      headers += 2;
-  }
-
-  return !content_type_.empty() && content_length_ != 0;
-}
-
-//
-// ListeningSocket
-//
-
-bool ListeningSocket::Listen(unsigned short port) {
-  assert(valid());
-  int enabled = 1;
-  setsockopt(socket_, SOL_SOCKET, SO_REUSEADDR,
-      reinterpret_cast<const char*>(&enabled), sizeof(enabled));
-  struct sockaddr_in addr = {0};
-  addr.sin_family = AF_INET;
-  addr.sin_addr.s_addr = htonl(INADDR_ANY);
-  addr.sin_port = htons(port);
-  if (bind(socket_, reinterpret_cast<const sockaddr*>(&addr),
-           sizeof(addr)) == SOCKET_ERROR) {
-    printf("bind failed\n");
-    return false;
-  }
-  return listen(socket_, 5) != SOCKET_ERROR;
-}
-
-DataSocket* ListeningSocket::Accept() const {
-  assert(valid());
-  struct sockaddr_in addr = {0};
-  socklen_t size = sizeof(addr);
-  NativeSocket client =
-      accept(socket_, reinterpret_cast<sockaddr*>(&addr), &size);
-  if (client == INVALID_SOCKET)
-    return NULL;
-
-  return new DataSocket(client);
-}
diff --git a/examples/peerconnection/server/data_socket.h b/examples/peerconnection/server/data_socket.h
deleted file mode 100644
index 6350dcf..0000000
--- a/examples/peerconnection/server/data_socket.h
+++ /dev/null
@@ -1,152 +0,0 @@
-/*
- *  Copyright 2011 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_EXAMPLES_PEERCONNECTION_SERVER_DATA_SOCKET_H_
-#define WEBRTC_EXAMPLES_PEERCONNECTION_SERVER_DATA_SOCKET_H_
-
-#ifdef WIN32
-#include <winsock2.h>
-typedef int socklen_t;
-typedef SOCKET NativeSocket;
-#else
-#include <netinet/in.h>
-#include <sys/select.h>
-#include <sys/socket.h>
-#define closesocket close
-typedef int NativeSocket;
-
-#ifndef SOCKET_ERROR
-#define SOCKET_ERROR (-1)
-#endif
-
-#ifndef INVALID_SOCKET
-#define INVALID_SOCKET  static_cast<NativeSocket>(-1)
-#endif
-#endif
-
-#include <string>
-
-class SocketBase {
- public:
-  SocketBase() : socket_(INVALID_SOCKET) { }
-  explicit SocketBase(NativeSocket socket) : socket_(socket) { }
-  ~SocketBase() { Close(); }
-
-  NativeSocket socket() const { return socket_; }
-  bool valid() const { return socket_ != INVALID_SOCKET; }
-
-  bool Create();
-  void Close();
-
- protected:
-  NativeSocket socket_;
-};
-
-// Represents an HTTP server socket.
-class DataSocket : public SocketBase {
- public:
-  enum RequestMethod {
-    INVALID,
-    GET,
-    POST,
-    OPTIONS,
-  };
-
-  explicit DataSocket(NativeSocket socket)
-      : SocketBase(socket),
-        method_(INVALID),
-        content_length_(0) {
-  }
-
-  ~DataSocket() {
-  }
-
-  static const char kCrossOriginAllowHeaders[];
-
-  bool headers_received() const { return method_ != INVALID; }
-
-  RequestMethod method() const { return method_; }
-
-  const std::string& request_path() const { return request_path_; }
-  std::string request_arguments() const;
-
-  const std::string& data() const { return data_; }
-
-  const std::string& content_type() const { return content_type_; }
-
-  size_t content_length() const { return content_length_; }
-
-  bool request_received() const {
-    return headers_received() && (method_ != POST || data_received());
-  }
-
-  bool data_received() const {
-    return method_ != POST || data_.length() >= content_length_;
-  }
-
-  // Checks if the request path (minus arguments) matches a given path.
-  bool PathEquals(const char* path) const;
-
-  // Called when we have received some data from clients.
-  // Returns false if an error occurred.
-  bool OnDataAvailable(bool* close_socket);
-
-  // Send a raw buffer of bytes.
-  bool Send(const std::string& data) const;
-
-  // Send an HTTP response.  The |status| should start with a valid HTTP
-  // response code, followed by a string.  E.g. "200 OK".
-  // If |connection_close| is set to true, an extra "Connection: close" HTTP
-  // header will be included.  |content_type| is the mime content type, not
-  // including the "Content-Type: " string.
-  // |extra_headers| should be either empty or a list of headers where each
-  // header terminates with "\r\n".
-  // |data| is the body of the message.  It's length will be specified via
-  // a "Content-Length" header.
-  bool Send(const std::string& status, bool connection_close,
-            const std::string& content_type,
-            const std::string& extra_headers, const std::string& data) const;
-
-  // Clears all held state and prepares the socket for receiving a new request.
-  void Clear();
-
- protected:
-  // A fairly relaxed HTTP header parser.  Parses the method, path and
-  // content length (POST only) of a request.
-  // Returns true if a valid request was received and no errors occurred.
-  bool ParseHeaders();
-
-  // Figures out whether the request is a GET or POST and what path is
-  // being requested.
-  bool ParseMethodAndPath(const char* begin, size_t len);
-
-  // Determines the length of the body and it's mime type.
-  bool ParseContentLengthAndType(const char* headers, size_t length);
-
- protected:
-  RequestMethod method_;
-  size_t content_length_;
-  std::string content_type_;
-  std::string request_path_;
-  std::string request_headers_;
-  std::string data_;
-};
-
-// The server socket.  Accepts connections and generates DataSocket instances
-// for each new connection.
-class ListeningSocket : public SocketBase {
- public:
-  ListeningSocket() {}
-
-  bool Listen(unsigned short port);
-  DataSocket* Accept() const;
-};
-
-#endif  // WEBRTC_EXAMPLES_PEERCONNECTION_SERVER_DATA_SOCKET_H_
diff --git a/examples/peerconnection/server/main.cc b/examples/peerconnection/server/main.cc
deleted file mode 100644
index bd52e67..0000000
--- a/examples/peerconnection/server/main.cc
+++ /dev/null
@@ -1,180 +0,0 @@
-/*
- *  Copyright 2011 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 <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include <vector>
-
-#include "webrtc/examples/peerconnection/server/data_socket.h"
-#include "webrtc/examples/peerconnection/server/peer_channel.h"
-#include "webrtc/examples/peerconnection/server/utils.h"
-#include "webrtc/rtc_tools/simple_command_line_parser.h"
-
-static const size_t kMaxConnections = (FD_SETSIZE - 2);
-
-void HandleBrowserRequest(DataSocket* ds, bool* quit) {
-  assert(ds && ds->valid());
-  assert(quit);
-
-  const std::string& path = ds->request_path();
-
-  *quit = (path.compare("/quit") == 0);
-
-  if (*quit) {
-    ds->Send("200 OK", true, "text/html", "",
-             "<html><body>Quitting...</body></html>");
-  } else if (ds->method() == DataSocket::OPTIONS) {
-    // We'll get this when a browsers do cross-resource-sharing requests.
-    // The headers to allow cross-origin script support will be set inside
-    // Send.
-    ds->Send("200 OK", true, "", "", "");
-  } else {
-    // Here we could write some useful output back to the browser depending on
-    // the path.
-    printf("Received an invalid request: %s\n", ds->request_path().c_str());
-    ds->Send("500 Sorry", true, "text/html", "",
-             "<html><body>Sorry, not yet implemented</body></html>");
-  }
-}
-
-int main(int argc, char** argv) {
-  std::string program_name = argv[0];
-  std::string usage = "Example usage: " + program_name + " --port=8888";
-  webrtc::test::CommandLineParser parser;
-  parser.Init(argc, argv);
-  parser.SetUsageMessage(usage);
-  parser.SetFlag("port", "8888");
-  parser.SetFlag("help", "false");
-  parser.ProcessFlags();
-
-  if (parser.GetFlag("help") == "true") {
-    parser.PrintUsageMessage();
-    return 0;
-  }
-
-  int port = strtol((parser.GetFlag("port")).c_str(), NULL, 10);
-
-  // Abort if the user specifies a port that is outside the allowed
-  // range [1, 65535].
-  if ((port < 1) || (port > 65535)) {
-    printf("Error: %i is not a valid port.\n", port);
-    return -1;
-  }
-
-  ListeningSocket listener;
-  if (!listener.Create()) {
-    printf("Failed to create server socket\n");
-    return -1;
-  } else if (!listener.Listen(port)) {
-    printf("Failed to listen on server socket\n");
-    return -1;
-  }
-
-  printf("Server listening on port %i\n", port);
-
-  PeerChannel clients;
-  typedef std::vector<DataSocket*> SocketArray;
-  SocketArray sockets;
-  bool quit = false;
-  while (!quit) {
-    fd_set socket_set;
-    FD_ZERO(&socket_set);
-    if (listener.valid())
-      FD_SET(listener.socket(), &socket_set);
-
-    for (SocketArray::iterator i = sockets.begin(); i != sockets.end(); ++i)
-      FD_SET((*i)->socket(), &socket_set);
-
-    struct timeval timeout = { 10, 0 };
-    if (select(FD_SETSIZE, &socket_set, NULL, NULL, &timeout) == SOCKET_ERROR) {
-      printf("select failed\n");
-      break;
-    }
-
-    for (SocketArray::iterator i = sockets.begin(); i != sockets.end(); ++i) {
-      DataSocket* s = *i;
-      bool socket_done = true;
-      if (FD_ISSET(s->socket(), &socket_set)) {
-        if (s->OnDataAvailable(&socket_done) && s->request_received()) {
-          ChannelMember* member = clients.Lookup(s);
-          if (member || PeerChannel::IsPeerConnection(s)) {
-            if (!member) {
-              if (s->PathEquals("/sign_in")) {
-                clients.AddMember(s);
-              } else {
-                printf("No member found for: %s\n",
-                    s->request_path().c_str());
-                s->Send("500 Error", true, "text/plain", "",
-                        "Peer most likely gone.");
-              }
-            } else if (member->is_wait_request(s)) {
-              // no need to do anything.
-              socket_done = false;
-            } else {
-              ChannelMember* target = clients.IsTargetedRequest(s);
-              if (target) {
-                member->ForwardRequestToPeer(s, target);
-              } else if (s->PathEquals("/sign_out")) {
-                s->Send("200 OK", true, "text/plain", "", "");
-              } else {
-                printf("Couldn't find target for request: %s\n",
-                    s->request_path().c_str());
-                s->Send("500 Error", true, "text/plain", "",
-                        "Peer most likely gone.");
-              }
-            }
-          } else {
-            HandleBrowserRequest(s, &quit);
-            if (quit) {
-              printf("Quitting...\n");
-              FD_CLR(listener.socket(), &socket_set);
-              listener.Close();
-              clients.CloseAll();
-            }
-          }
-        }
-      } else {
-        socket_done = false;
-      }
-
-      if (socket_done) {
-        printf("Disconnecting socket\n");
-        clients.OnClosing(s);
-        assert(s->valid());  // Close must not have been called yet.
-        FD_CLR(s->socket(), &socket_set);
-        delete (*i);
-        i = sockets.erase(i);
-        if (i == sockets.end())
-          break;
-      }
-    }
-
-    clients.CheckForTimeout();
-
-    if (FD_ISSET(listener.socket(), &socket_set)) {
-      DataSocket* s = listener.Accept();
-      if (sockets.size() >= kMaxConnections) {
-        delete s;  // sorry, that's all we can take.
-        printf("Connection limit reached\n");
-      } else {
-        sockets.push_back(s);
-        printf("New connection...\n");
-      }
-    }
-  }
-
-  for (SocketArray::iterator i = sockets.begin(); i != sockets.end(); ++i)
-    delete (*i);
-  sockets.clear();
-
-  return 0;
-}
diff --git a/examples/peerconnection/server/peer_channel.cc b/examples/peerconnection/server/peer_channel.cc
deleted file mode 100644
index 5a0585b..0000000
--- a/examples/peerconnection/server/peer_channel.cc
+++ /dev/null
@@ -1,364 +0,0 @@
-/*
- *  Copyright 2011 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/examples/peerconnection/server/peer_channel.h"
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include <algorithm>
-
-#include "webrtc/examples/peerconnection/server/data_socket.h"
-#include "webrtc/examples/peerconnection/server/utils.h"
-#include "webrtc/rtc_base/stringencode.h"
-#include "webrtc/rtc_base/stringutils.h"
-
-using rtc::sprintfn;
-
-// Set to the peer id of the originator when messages are being
-// exchanged between peers, but set to the id of the receiving peer
-// itself when notifications are sent from the server about the state
-// of other peers.
-//
-// WORKAROUND: Since support for CORS varies greatly from one browser to the
-// next, we don't use a custom name for our peer-id header (originally it was
-// "X-Peer-Id: ").  Instead, we use a "simple header", "Pragma" which should
-// always be exposed to CORS requests.  There is a special CORS header devoted
-// to exposing proprietary headers (Access-Control-Expose-Headers), however
-// at this point it is not working correctly in some popular browsers.
-static const char kPeerIdHeader[] = "Pragma: ";
-
-static const char* kRequestPaths[] = {
-  "/wait", "/sign_out", "/message",
-};
-
-enum RequestPathIndex {
-  kWait,
-  kSignOut,
-  kMessage,
-};
-
-const size_t kMaxNameLength = 512;
-
-//
-// ChannelMember
-//
-
-int ChannelMember::s_member_id_ = 0;
-
-ChannelMember::ChannelMember(DataSocket* socket)
-  : waiting_socket_(NULL), id_(++s_member_id_),
-    connected_(true), timestamp_(time(NULL)) {
-  assert(socket);
-  assert(socket->method() == DataSocket::GET);
-  assert(socket->PathEquals("/sign_in"));
-  name_ = rtc::s_url_decode(socket->request_arguments());
-  if (name_.empty())
-    name_ = "peer_" + int2str(id_);
-  else if (name_.length() > kMaxNameLength)
-    name_.resize(kMaxNameLength);
-
-  std::replace(name_.begin(), name_.end(), ',', '_');
-}
-
-ChannelMember::~ChannelMember() {
-}
-
-bool ChannelMember::is_wait_request(DataSocket* ds) const {
-  return ds && ds->PathEquals(kRequestPaths[kWait]);
-}
-
-bool ChannelMember::TimedOut() {
-  return waiting_socket_ == NULL && (time(NULL) - timestamp_) > 30;
-}
-
-std::string ChannelMember::GetPeerIdHeader() const {
-  std::string ret(kPeerIdHeader + int2str(id_) + "\r\n");
-  return ret;
-}
-
-bool ChannelMember::NotifyOfOtherMember(const ChannelMember& other) {
-  assert(&other != this);
-  QueueResponse("200 OK", "text/plain", GetPeerIdHeader(),
-                other.GetEntry());
-  return true;
-}
-
-// Returns a string in the form "name,id,connected\n".
-std::string ChannelMember::GetEntry() const {
-  assert(name_.length() <= kMaxNameLength);
-
-  // name, 11-digit int, 1-digit bool, newline, null
-  char entry[kMaxNameLength + 15];
-  sprintfn(entry, sizeof(entry), "%s,%d,%d\n",
-           name_.substr(0, kMaxNameLength).c_str(), id_, connected_);
-  return entry;
-}
-
-void ChannelMember::ForwardRequestToPeer(DataSocket* ds, ChannelMember* peer) {
-  assert(peer);
-  assert(ds);
-
-  std::string extra_headers(GetPeerIdHeader());
-
-  if (peer == this) {
-    ds->Send("200 OK", true, ds->content_type(), extra_headers,
-             ds->data());
-  } else {
-    printf("Client %s sending to %s\n",
-        name_.c_str(), peer->name().c_str());
-    peer->QueueResponse("200 OK", ds->content_type(), extra_headers,
-                        ds->data());
-    ds->Send("200 OK", true, "text/plain", "", "");
-  }
-}
-
-void ChannelMember::OnClosing(DataSocket* ds) {
-  if (ds == waiting_socket_) {
-    waiting_socket_ = NULL;
-    timestamp_ = time(NULL);
-  }
-}
-
-void ChannelMember::QueueResponse(const std::string& status,
-                                  const std::string& content_type,
-                                  const std::string& extra_headers,
-                                  const std::string& data) {
-  if (waiting_socket_) {
-    assert(queue_.size() == 0);
-    assert(waiting_socket_->method() == DataSocket::GET);
-    bool ok = waiting_socket_->Send(status, true, content_type, extra_headers,
-                                    data);
-    if (!ok) {
-      printf("Failed to deliver data to waiting socket\n");
-    }
-    waiting_socket_ = NULL;
-    timestamp_ = time(NULL);
-  } else {
-    QueuedResponse qr;
-    qr.status = status;
-    qr.content_type = content_type;
-    qr.extra_headers = extra_headers;
-    qr.data = data;
-    queue_.push(qr);
-  }
-}
-
-void ChannelMember::SetWaitingSocket(DataSocket* ds) {
-  assert(ds->method() == DataSocket::GET);
-  if (ds && !queue_.empty()) {
-    assert(waiting_socket_ == NULL);
-    const QueuedResponse& response = queue_.front();
-    ds->Send(response.status, true, response.content_type,
-             response.extra_headers, response.data);
-    queue_.pop();
-  } else {
-    waiting_socket_ = ds;
-  }
-}
-
-//
-// PeerChannel
-//
-
-// static
-bool PeerChannel::IsPeerConnection(const DataSocket* ds) {
-  assert(ds);
-  return (ds->method() == DataSocket::POST && ds->content_length() > 0) ||
-         (ds->method() == DataSocket::GET && ds->PathEquals("/sign_in"));
-}
-
-ChannelMember* PeerChannel::Lookup(DataSocket* ds) const {
-  assert(ds);
-
-  if (ds->method() != DataSocket::GET && ds->method() != DataSocket::POST)
-    return NULL;
-
-  size_t i = 0;
-  for (; i < ARRAYSIZE(kRequestPaths); ++i) {
-    if (ds->PathEquals(kRequestPaths[i]))
-      break;
-  }
-
-  if (i == ARRAYSIZE(kRequestPaths))
-    return NULL;
-
-  std::string args(ds->request_arguments());
-  static const char kPeerId[] = "peer_id=";
-  size_t found = args.find(kPeerId);
-  if (found == std::string::npos)
-    return NULL;
-
-  int id = atoi(&args[found + ARRAYSIZE(kPeerId) - 1]);
-  Members::const_iterator iter = members_.begin();
-  for (; iter != members_.end(); ++iter) {
-    if (id == (*iter)->id()) {
-      if (i == kWait)
-        (*iter)->SetWaitingSocket(ds);
-      if (i == kSignOut)
-        (*iter)->set_disconnected();
-      return *iter;
-    }
-  }
-
-  return NULL;
-}
-
-ChannelMember* PeerChannel::IsTargetedRequest(const DataSocket* ds) const {
-  assert(ds);
-  // Regardless of GET or POST, we look for the peer_id parameter
-  // only in the request_path.
-  const std::string& path = ds->request_path();
-  size_t args = path.find('?');
-  if (args == std::string::npos)
-    return NULL;
-  size_t found;
-  const char kTargetPeerIdParam[] = "to=";
-  do {
-    found = path.find(kTargetPeerIdParam, args);
-    if (found == std::string::npos)
-      return NULL;
-    if (found == (args + 1) || path[found - 1] == '&') {
-      found += ARRAYSIZE(kTargetPeerIdParam) - 1;
-      break;
-    }
-    args = found + ARRAYSIZE(kTargetPeerIdParam) - 1;
-  } while (true);
-  int id = atoi(&path[found]);
-  Members::const_iterator i = members_.begin();
-  for (; i != members_.end(); ++i) {
-    if ((*i)->id() == id) {
-      return *i;
-    }
-  }
-  return NULL;
-}
-
-bool PeerChannel::AddMember(DataSocket* ds) {
-  assert(IsPeerConnection(ds));
-  ChannelMember* new_guy = new ChannelMember(ds);
-  Members failures;
-  BroadcastChangedState(*new_guy, &failures);
-  HandleDeliveryFailures(&failures);
-  members_.push_back(new_guy);
-
-  printf("New member added (total=%s): %s\n",
-      size_t2str(members_.size()).c_str(), new_guy->name().c_str());
-
-  // Let the newly connected peer know about other members of the channel.
-  std::string content_type;
-  std::string response = BuildResponseForNewMember(*new_guy, &content_type);
-  ds->Send("200 Added", true, content_type, new_guy->GetPeerIdHeader(),
-           response);
-  return true;
-}
-
-void PeerChannel::CloseAll() {
-  Members::const_iterator i = members_.begin();
-  for (; i != members_.end(); ++i) {
-    (*i)->QueueResponse("200 OK", "text/plain", "", "Server shutting down");
-  }
-  DeleteAll();
-}
-
-void PeerChannel::OnClosing(DataSocket* ds) {
-  for (Members::iterator i = members_.begin(); i != members_.end(); ++i) {
-    ChannelMember* m = (*i);
-    m->OnClosing(ds);
-    if (!m->connected()) {
-      i = members_.erase(i);
-      Members failures;
-      BroadcastChangedState(*m, &failures);
-      HandleDeliveryFailures(&failures);
-      delete m;
-      if (i == members_.end())
-        break;
-    }
-  }
-  printf("Total connected: %s\n", size_t2str(members_.size()).c_str());
-}
-
-void PeerChannel::CheckForTimeout() {
-  for (Members::iterator i = members_.begin(); i != members_.end(); ++i) {
-    ChannelMember* m = (*i);
-    if (m->TimedOut()) {
-      printf("Timeout: %s\n", m->name().c_str());
-      m->set_disconnected();
-      i = members_.erase(i);
-      Members failures;
-      BroadcastChangedState(*m, &failures);
-      HandleDeliveryFailures(&failures);
-      delete m;
-      if (i == members_.end())
-        break;
-    }
-  }
-}
-
-void PeerChannel::DeleteAll() {
-  for (Members::iterator i = members_.begin(); i != members_.end(); ++i)
-    delete (*i);
-  members_.clear();
-}
-
-void PeerChannel::BroadcastChangedState(const ChannelMember& member,
-                                        Members* delivery_failures) {
-  // This function should be called prior to DataSocket::Close().
-  assert(delivery_failures);
-
-  if (!member.connected()) {
-    printf("Member disconnected: %s\n", member.name().c_str());
-  }
-
-  Members::iterator i = members_.begin();
-  for (; i != members_.end(); ++i) {
-    if (&member != (*i)) {
-      if (!(*i)->NotifyOfOtherMember(member)) {
-        (*i)->set_disconnected();
-        delivery_failures->push_back(*i);
-        i = members_.erase(i);
-        if (i == members_.end())
-          break;
-      }
-    }
-  }
-}
-
-void PeerChannel::HandleDeliveryFailures(Members* failures) {
-  assert(failures);
-
-  while (!failures->empty()) {
-    Members::iterator i = failures->begin();
-    ChannelMember* member = *i;
-    assert(!member->connected());
-    failures->erase(i);
-    BroadcastChangedState(*member, failures);
-    delete member;
-  }
-}
-
-// Builds a simple list of "name,id\n" entries for each member.
-std::string PeerChannel::BuildResponseForNewMember(const ChannelMember& member,
-                                                   std::string* content_type) {
-  assert(content_type);
-
-  *content_type = "text/plain";
-  // The peer itself will always be the first entry.
-  std::string response(member.GetEntry());
-  for (Members::iterator i = members_.begin(); i != members_.end(); ++i) {
-    if (member.id() != (*i)->id()) {
-      assert((*i)->connected());
-      response += (*i)->GetEntry();
-    }
-  }
-
-  return response;
-}
diff --git a/examples/peerconnection/server/peer_channel.h b/examples/peerconnection/server/peer_channel.h
deleted file mode 100644
index 3d51db2..0000000
--- a/examples/peerconnection/server/peer_channel.h
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- *  Copyright 2011 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_EXAMPLES_PEERCONNECTION_SERVER_PEER_CHANNEL_H_
-#define WEBRTC_EXAMPLES_PEERCONNECTION_SERVER_PEER_CHANNEL_H_
-
-#include <time.h>
-
-#include <queue>
-#include <string>
-#include <vector>
-
-class DataSocket;
-
-// Represents a single peer connected to the server.
-class ChannelMember {
- public:
-  explicit ChannelMember(DataSocket* socket);
-  ~ChannelMember();
-
-  bool connected() const { return connected_; }
-  int id() const { return id_; }
-  void set_disconnected() { connected_ = false; }
-  bool is_wait_request(DataSocket* ds) const;
-  const std::string& name() const { return name_; }
-
-  bool TimedOut();
-
-  std::string GetPeerIdHeader() const;
-
-  bool NotifyOfOtherMember(const ChannelMember& other);
-
-  // Returns a string in the form "name,id\n".
-  std::string GetEntry() const;
-
-  void ForwardRequestToPeer(DataSocket* ds, ChannelMember* peer);
-
-  void OnClosing(DataSocket* ds);
-
-  void QueueResponse(const std::string& status, const std::string& content_type,
-                     const std::string& extra_headers, const std::string& data);
-
-  void SetWaitingSocket(DataSocket* ds);
-
- protected:
-  struct QueuedResponse {
-    std::string status, content_type, extra_headers, data;
-  };
-
-  DataSocket* waiting_socket_;
-  int id_;
-  bool connected_;
-  time_t timestamp_;
-  std::string name_;
-  std::queue<QueuedResponse> queue_;
-  static int s_member_id_;
-};
-
-// Manages all currently connected peers.
-class PeerChannel {
- public:
-  typedef std::vector<ChannelMember*> Members;
-
-  PeerChannel() {
-  }
-
-  ~PeerChannel() {
-    DeleteAll();
-  }
-
-  const Members& members() const { return members_; }
-
-  // Returns true if the request should be treated as a new ChannelMember
-  // request.  Otherwise the request is not peerconnection related.
-  static bool IsPeerConnection(const DataSocket* ds);
-
-  // Finds a connected peer that's associated with the |ds| socket.
-  ChannelMember* Lookup(DataSocket* ds) const;
-
-  // Checks if the request has a "peer_id" parameter and if so, looks up the
-  // peer for which the request is targeted at.
-  ChannelMember* IsTargetedRequest(const DataSocket* ds) const;
-
-  // Adds a new ChannelMember instance to the list of connected peers and
-  // associates it with the socket.
-  bool AddMember(DataSocket* ds);
-
-  // Closes all connections and sends a "shutting down" message to all
-  // connected peers.
-  void CloseAll();
-
-  // Called when a socket was determined to be closing by the peer (or if the
-  // connection went dead).
-  void OnClosing(DataSocket* ds);
-
-  void CheckForTimeout();
-
- protected:
-  void DeleteAll();
-  void BroadcastChangedState(const ChannelMember& member,
-                             Members* delivery_failures);
-  void HandleDeliveryFailures(Members* failures);
-
-  // Builds a simple list of "name,id\n" entries for each member.
-  std::string BuildResponseForNewMember(const ChannelMember& member,
-                                        std::string* content_type);
-
- protected:
-  Members members_;
-};
-
-#endif  // WEBRTC_EXAMPLES_PEERCONNECTION_SERVER_PEER_CHANNEL_H_
diff --git a/examples/peerconnection/server/server_test.html b/examples/peerconnection/server/server_test.html
deleted file mode 100644
index 0a165f1..0000000
--- a/examples/peerconnection/server/server_test.html
+++ /dev/null
@@ -1,237 +0,0 @@
-<html>
-<head>
-<title>PeerConnection server test page</title>
-
-<script>
-var request = null;
-var hangingGet = null;
-var localName;
-var server;
-var my_id = -1;
-var other_peers = {};
-var message_counter = 0;
-
-function trace(txt) {
-  var elem = document.getElementById("debug");
-  elem.innerHTML += txt + "<br>";
-}
-
-function handleServerNotification(data) {
-  trace("Server notification: " + data);
-  var parsed = data.split(',');
-  if (parseInt(parsed[2]) != 0)
-    other_peers[parseInt(parsed[1])] = parsed[0];
-}
-
-function handlePeerMessage(peer_id, data) {
-  ++message_counter;
-  var str = "Message from '" + other_peers[peer_id] + "'&nbsp;";
-  str += "<span id='toggle_" + message_counter + "' onclick='toggleMe(this);' ";
-  str += "style='cursor: pointer'>+</span><br>";
-  str += "<blockquote id='msg_" + message_counter + "' style='display:none'>";
-  str += data + "</blockquote>";
-  trace(str);
-  if (document.getElementById("loopback").checked) {
-    if (data.search("offer") != -1) {
-      // In loopback mode, if DTLS is enabled, notify the client to disable it.
-      // Otherwise replace the offer with an answer.
-      if (data.search("fingerprint") != -1)
-        data = data.replace("offer", "offer-loopback");
-      else
-        data = data.replace("offer", "answer");
-    }
-    sendToPeer(peer_id, data);
-  }
-}
-
-function GetIntHeader(r, name) {
-  var val = r.getResponseHeader(name);
-  return val != null && val.length ? parseInt(val) : -1;
-}
-
-function hangingGetCallback() {
-  try {
-    if (hangingGet.readyState != 4)
-      return;
-    if (hangingGet.status != 200) {
-      trace("server error: " + hangingGet.statusText);
-      disconnect();
-    } else {
-      var peer_id = GetIntHeader(hangingGet, "Pragma");
-      if (peer_id == my_id) {
-        handleServerNotification(hangingGet.responseText);
-      } else {
-        handlePeerMessage(peer_id, hangingGet.responseText);
-      }
-    }
-
-    if (hangingGet) {
-      hangingGet.abort();
-      hangingGet = null;
-    }
-
-    if (my_id != -1)
-      window.setTimeout(startHangingGet, 0);
-  } catch (e) {
-    trace("Hanging get error: " + e.description);
-  }
-}
-
-function startHangingGet() {
-  try {
-    hangingGet = new XMLHttpRequest();
-    hangingGet.onreadystatechange = hangingGetCallback;
-    hangingGet.ontimeout = onHangingGetTimeout;
-    hangingGet.open("GET", server + "/wait?peer_id=" + my_id, true);
-    hangingGet.send();  
-  } catch (e) {
-    trace("error" + e.description);
-  }
-}
-
-function onHangingGetTimeout() {
-  trace("hanging get timeout. issuing again.");
-  hangingGet.abort();
-  hangingGet = null;
-  if (my_id != -1)
-    window.setTimeout(startHangingGet, 0);
-}
-
-function signInCallback() {
-  try {
-    if (request.readyState == 4) {
-      if (request.status == 200) {
-        var peers = request.responseText.split("\n");
-        my_id = parseInt(peers[0].split(',')[1]);
-        trace("My id: " + my_id);
-        for (var i = 1; i < peers.length; ++i) {
-          if (peers[i].length > 0) {
-            trace("Peer " + i + ": " + peers[i]);
-            var parsed = peers[i].split(',');
-            other_peers[parseInt(parsed[1])] = parsed[0];
-          }
-        }
-        startHangingGet();
-        request = null;
-      }
-    }
-  } catch (e) {
-    trace("error: " + e.description);
-  }
-}
-
-function signIn() {
-  try {
-    request = new XMLHttpRequest();
-    request.onreadystatechange = signInCallback;
-    request.open("GET", server + "/sign_in?" + localName, true);
-    request.send();
-  } catch (e) {
-    trace("error: " + e.description);
-  }
-}
-
-function sendToPeer(peer_id, data) {
-  if (my_id == -1) {
-    alert("Not connected");
-    return;
-  }
-  if (peer_id == my_id) {
-    alert("Can't send a message to oneself :)");
-    return;
-  }
-  var r = new XMLHttpRequest();
-  r.open("POST", server + "/message?peer_id=" + my_id + "&to=" + peer_id,
-         false);
-  r.setRequestHeader("Content-Type", "text/plain");
-  r.send(data);
-  r = null;
-}
-
-function connect() {
-  localName = document.getElementById("local").value.toLowerCase();
-  server = document.getElementById("server").value.toLowerCase();
-  if (localName.length == 0) {
-    alert("I need a name please.");
-    document.getElementById("local").focus();
-  } else {
-    document.getElementById("connect").disabled = true;
-    document.getElementById("disconnect").disabled = false;
-    document.getElementById("send").disabled = false;
-    signIn();
-  }
-}
-
-function disconnect() {
-  if (request) {
-    request.abort();
-    request = null;
-  }
-  
-  if (hangingGet) {
-    hangingGet.abort();
-    hangingGet = null;
-  }
-
-  if (my_id != -1) {
-    request = new XMLHttpRequest();
-    request.open("GET", server + "/sign_out?peer_id=" + my_id, false);
-    request.send();
-    request = null;
-    my_id = -1;
-  }
-
-  document.getElementById("connect").disabled = false;
-  document.getElementById("disconnect").disabled = true;
-  document.getElementById("send").disabled = true;
-}
-
-window.onbeforeunload = disconnect;
-
-function send() {
-  var text = document.getElementById("message").value;
-  var peer_id = parseInt(document.getElementById("peer_id").value);
-  if (!text.length || peer_id == 0) {
-    alert("No text supplied or invalid peer id");
-  } else {
-    sendToPeer(peer_id, text);
-  }
-}
-
-function toggleMe(obj) {
-  var id = obj.id.replace("toggle", "msg");
-  var t = document.getElementById(id);
-  if (obj.innerText == "+") {
-    obj.innerText = "-";
-    t.style.display = "block";
-  } else {
-    obj.innerText = "+";
-    t.style.display = "none";
-  }
-}
-
-</script>
-
-</head>
-<body>
-Server: <input type="text" id="server" value="http://localhost:8888" /><br>
-<input type="checkbox" id="loopback" checked="checked"/> Loopback (just send
-received messages right back)<br>
-Your name: <input type="text" id="local" value="my_name"/>
-<button id="connect" onclick="connect();">Connect</button>
-<button disabled="true" id="disconnect"
-        onclick="disconnect();">Disconnect</button>
-<br>
-<table><tr><td>
-Target peer id: <input type="text" id="peer_id" size="3"/></td><td>
-Message: <input type="text" id="message"/></td><td>
-<button disabled="true" id="send" onclick="send();">Send</button>
-</td></tr></table>
-<button onclick="document.getElementById('debug').innerHTML='';">
-Clear log</button>
-
-<pre id="debug">
-</pre>
-<br><hr>
-</body>
-</html>
diff --git a/examples/peerconnection/server/utils.cc b/examples/peerconnection/server/utils.cc
deleted file mode 100644
index 85f5f9e..0000000
--- a/examples/peerconnection/server/utils.cc
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- *  Copyright 2011 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/examples/peerconnection/server/utils.h"
-
-#include <stdio.h>
-
-#include "webrtc/rtc_base/stringencode.h"
-
-using rtc::ToString;
-
-std::string int2str(int i) {
-  return ToString<int>(i);
-}
-
-std::string size_t2str(size_t i) {
-  return ToString<size_t>(i);
-}
diff --git a/examples/peerconnection/server/utils.h b/examples/peerconnection/server/utils.h
deleted file mode 100644
index fd875f5..0000000
--- a/examples/peerconnection/server/utils.h
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- *  Copyright 2011 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_EXAMPLES_PEERCONNECTION_SERVER_UTILS_H_
-#define WEBRTC_EXAMPLES_PEERCONNECTION_SERVER_UTILS_H_
-
-#include <assert.h>
-#include <string>
-
-#ifndef ARRAYSIZE
-#define ARRAYSIZE(x) (sizeof(x) / sizeof(x[0]))
-#endif
-
-std::string int2str(int i);
-std::string size_t2str(size_t i);
-
-#endif  // WEBRTC_EXAMPLES_PEERCONNECTION_SERVER_UTILS_H_
diff --git a/examples/relayserver/relayserver_main.cc b/examples/relayserver/relayserver_main.cc
deleted file mode 100644
index 02f5438..0000000
--- a/examples/relayserver/relayserver_main.cc
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- *  Copyright 2004 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 <iostream>  // NOLINT
-#include <memory>
-
-#include "webrtc/p2p/base/relayserver.h"
-#include "webrtc/rtc_base/thread.h"
-
-int main(int argc, char **argv) {
-  if (argc != 3) {
-    std::cerr << "usage: relayserver internal-address external-address"
-              << std::endl;
-    return 1;
-  }
-
-  rtc::SocketAddress int_addr;
-  if (!int_addr.FromString(argv[1])) {
-    std::cerr << "Unable to parse IP address: " << argv[1];
-    return 1;
-  }
-
-  rtc::SocketAddress ext_addr;
-  if (!ext_addr.FromString(argv[2])) {
-    std::cerr << "Unable to parse IP address: " << argv[2];
-    return 1;
-  }
-
-  rtc::Thread *pthMain = rtc::Thread::Current();
-
-  std::unique_ptr<rtc::AsyncUDPSocket> int_socket(
-      rtc::AsyncUDPSocket::Create(pthMain->socketserver(), int_addr));
-  if (!int_socket) {
-    std::cerr << "Failed to create a UDP socket bound at"
-              << int_addr.ToString() << std::endl;
-    return 1;
-  }
-
-  std::unique_ptr<rtc::AsyncUDPSocket> ext_socket(
-      rtc::AsyncUDPSocket::Create(pthMain->socketserver(), ext_addr));
-  if (!ext_socket) {
-    std::cerr << "Failed to create a UDP socket bound at"
-              << ext_addr.ToString() << std::endl;
-    return 1;
-  }
-
-  cricket::RelayServer server(pthMain);
-  server.AddInternalSocket(int_socket.get());
-  server.AddExternalSocket(ext_socket.get());
-
-  std::cout << "Listening internally at " << int_addr.ToString() << std::endl;
-  std::cout << "Listening externally at " << ext_addr.ToString() << std::endl;
-
-  pthMain->Run();
-  return 0;
-}
diff --git a/examples/stunprober/main.cc b/examples/stunprober/main.cc
deleted file mode 100644
index 8c3b424..0000000
--- a/examples/stunprober/main.cc
+++ /dev/null
@@ -1,140 +0,0 @@
-/*
- *  Copyright 2015 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 <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include <iostream>
-#include <map>
-#include <memory>
-
-#include "webrtc/p2p/base/basicpacketsocketfactory.h"
-#include "webrtc/p2p/stunprober/stunprober.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/flags.h"
-#include "webrtc/rtc_base/helpers.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/nethelpers.h"
-#include "webrtc/rtc_base/network.h"
-#include "webrtc/rtc_base/ssladapter.h"
-#include "webrtc/rtc_base/stringutils.h"
-#include "webrtc/rtc_base/thread.h"
-#include "webrtc/rtc_base/timeutils.h"
-
-using stunprober::StunProber;
-using stunprober::AsyncCallback;
-
-DEFINE_bool(help, false, "Prints this message");
-DEFINE_int(interval, 10, "Interval of consecutive stun pings in milliseconds");
-DEFINE_bool(shared_socket, false, "Share socket mode for different remote IPs");
-DEFINE_int(pings_per_ip,
-           10,
-           "Number of consecutive stun pings to send for each IP");
-DEFINE_int(timeout,
-           1000,
-           "Milliseconds of wait after the last ping sent before exiting");
-DEFINE_string(
-    servers,
-    "stun.l.google.com:19302,stun1.l.google.com:19302,stun2.l.google.com:19302",
-    "Comma separated STUN server addresses with ports");
-
-namespace {
-
-const char* PrintNatType(stunprober::NatType type) {
-  switch (type) {
-    case stunprober::NATTYPE_NONE:
-      return "Not behind a NAT";
-    case stunprober::NATTYPE_UNKNOWN:
-      return "Unknown NAT type";
-    case stunprober::NATTYPE_SYMMETRIC:
-      return "Symmetric NAT";
-    case stunprober::NATTYPE_NON_SYMMETRIC:
-      return "Non-Symmetric NAT";
-    default:
-      return "Invalid";
-  }
-}
-
-void PrintStats(StunProber* prober) {
-  StunProber::Stats stats;
-  if (!prober->GetStats(&stats)) {
-    LOG(LS_WARNING) << "Results are inconclusive.";
-    return;
-  }
-
-  LOG(LS_INFO) << "Shared Socket Mode: " << stats.shared_socket_mode;
-  LOG(LS_INFO) << "Requests sent: " << stats.num_request_sent;
-  LOG(LS_INFO) << "Responses received: " << stats.num_response_received;
-  LOG(LS_INFO) << "Target interval (ns): " << stats.target_request_interval_ns;
-  LOG(LS_INFO) << "Actual interval (ns): " << stats.actual_request_interval_ns;
-  LOG(LS_INFO) << "NAT Type: " << PrintNatType(stats.nat_type);
-  LOG(LS_INFO) << "Host IP: " << stats.host_ip;
-  LOG(LS_INFO) << "Server-reflexive ips: ";
-  for (auto& ip : stats.srflx_addrs) {
-    LOG(LS_INFO) << "\t" << ip;
-  }
-
-  LOG(LS_INFO) << "Success Precent: " << stats.success_percent;
-  LOG(LS_INFO) << "Response Latency:" << stats.average_rtt_ms;
-}
-
-void StopTrial(rtc::Thread* thread, StunProber* prober, int result) {
-  thread->Quit();
-  if (prober) {
-    LOG(LS_INFO) << "Result: " << result;
-    if (result == StunProber::SUCCESS) {
-      PrintStats(prober);
-    }
-  }
-}
-
-}  // namespace
-
-int main(int argc, char** argv) {
-  rtc::FlagList::SetFlagsFromCommandLine(&argc, argv, true);
-  if (FLAG_help) {
-    rtc::FlagList::Print(nullptr, false);
-    return 0;
-  }
-
-  std::vector<rtc::SocketAddress> server_addresses;
-  std::istringstream servers(FLAG_servers);
-  std::string server;
-  while (getline(servers, server, ',')) {
-    rtc::SocketAddress addr;
-    if (!addr.FromString(server)) {
-      LOG(LS_ERROR) << "Parsing " << server << " failed.";
-      return -1;
-    }
-    server_addresses.push_back(addr);
-  }
-
-  rtc::InitializeSSL();
-  rtc::InitRandom(rtc::Time32());
-  rtc::Thread* thread = rtc::ThreadManager::Instance()->WrapCurrentThread();
-  std::unique_ptr<rtc::BasicPacketSocketFactory> socket_factory(
-      new rtc::BasicPacketSocketFactory());
-  std::unique_ptr<rtc::BasicNetworkManager> network_manager(
-      new rtc::BasicNetworkManager());
-  rtc::NetworkManager::NetworkList networks;
-  network_manager->GetNetworks(&networks);
-  StunProber* prober =
-      new StunProber(socket_factory.get(), rtc::Thread::Current(), networks);
-  auto finish_callback = [thread](StunProber* prober, int result) {
-    StopTrial(thread, prober, result);
-  };
-  prober->Start(server_addresses, FLAG_shared_socket, FLAG_interval,
-                FLAG_pings_per_ip, FLAG_timeout,
-                AsyncCallback(finish_callback));
-  thread->Run();
-  delete prober;
-  return 0;
-}
diff --git a/examples/stunserver/stunserver_main.cc b/examples/stunserver/stunserver_main.cc
deleted file mode 100644
index b084606..0000000
--- a/examples/stunserver/stunserver_main.cc
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- *  Copyright 2004 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.
- */
-
-#if defined(WEBRTC_POSIX)
-#include <errno.h>
-#endif  // WEBRTC_POSIX
-
-#include <iostream>
-
-#include "webrtc/p2p/base/stunserver.h"
-#include "webrtc/rtc_base/thread.h"
-
-using cricket::StunServer;
-
-int main(int argc, char* argv[]) {
-  if (argc != 2) {
-    std::cerr << "usage: stunserver address" << std::endl;
-    return 1;
-  }
-
-  rtc::SocketAddress server_addr;
-  if (!server_addr.FromString(argv[1])) {
-    std::cerr << "Unable to parse IP address: " << argv[1];
-    return 1;
-  }
-
-  rtc::Thread *pthMain = rtc::Thread::Current();
-
-  rtc::AsyncUDPSocket* server_socket =
-      rtc::AsyncUDPSocket::Create(pthMain->socketserver(), server_addr);
-  if (!server_socket) {
-    std::cerr << "Failed to create a UDP socket" << std::endl;
-    return 1;
-  }
-
-  StunServer* server = new StunServer(server_socket);
-
-  std::cout << "Listening at " << server_addr.ToString() << std::endl;
-
-  pthMain->Run();
-
-  delete server;
-  return 0;
-}
diff --git a/examples/turnserver/turnserver_main.cc b/examples/turnserver/turnserver_main.cc
deleted file mode 100644
index c232ce9..0000000
--- a/examples/turnserver/turnserver_main.cc
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- *  Copyright 2012 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 <iostream>  // NOLINT
-
-#include "webrtc/p2p/base/basicpacketsocketfactory.h"
-#include "webrtc/p2p/base/turnserver.h"
-#include "webrtc/rtc_base/asyncudpsocket.h"
-#include "webrtc/rtc_base/optionsfile.h"
-#include "webrtc/rtc_base/stringencode.h"
-#include "webrtc/rtc_base/thread.h"
-
-static const char kSoftware[] = "libjingle TurnServer";
-
-class TurnFileAuth : public cricket::TurnAuthInterface {
- public:
-  explicit TurnFileAuth(const std::string& path) : file_(path) {
-    file_.Load();
-  }
-  virtual bool GetKey(const std::string& username, const std::string& realm,
-                      std::string* key) {
-    // File is stored as lines of <username>=<HA1>.
-    // Generate HA1 via "echo -n "<username>:<realm>:<password>" | md5sum"
-    std::string hex;
-    bool ret = file_.GetStringValue(username, &hex);
-    if (ret) {
-      char buf[32];
-      size_t len = rtc::hex_decode(buf, sizeof(buf), hex);
-      *key = std::string(buf, len);
-    }
-    return ret;
-  }
- private:
-  rtc::OptionsFile file_;
-};
-
-int main(int argc, char **argv) {
-  if (argc != 5) {
-    std::cerr << "usage: turnserver int-addr ext-ip realm auth-file"
-              << std::endl;
-    return 1;
-  }
-
-  rtc::SocketAddress int_addr;
-  if (!int_addr.FromString(argv[1])) {
-    std::cerr << "Unable to parse IP address: " << argv[1] << std::endl;
-    return 1;
-  }
-
-  rtc::IPAddress ext_addr;
-  if (!IPFromString(argv[2], &ext_addr)) {
-    std::cerr << "Unable to parse IP address: " << argv[2] << std::endl;
-    return 1;
-  }
-
-  rtc::Thread* main = rtc::Thread::Current();
-  rtc::AsyncUDPSocket* int_socket =
-      rtc::AsyncUDPSocket::Create(main->socketserver(), int_addr);
-  if (!int_socket) {
-    std::cerr << "Failed to create a UDP socket bound at"
-              << int_addr.ToString() << std::endl;
-    return 1;
-  }
-
-  cricket::TurnServer server(main);
-  TurnFileAuth auth(argv[4]);
-  server.set_realm(argv[3]);
-  server.set_software(kSoftware);
-  server.set_auth_hook(&auth);
-  server.AddInternalSocket(int_socket, cricket::PROTO_UDP);
-  server.SetExternalSocketFactory(new rtc::BasicPacketSocketFactory(),
-                                  rtc::SocketAddress(ext_addr, 0));
-
-  std::cout << "Listening internally at " << int_addr.ToString() << std::endl;
-
-  main->Run();
-  return 0;
-}
diff --git a/examples/unityplugin/ANDROID_INSTRUCTION b/examples/unityplugin/ANDROID_INSTRUCTION
deleted file mode 100644
index 7f69faa..0000000
--- a/examples/unityplugin/ANDROID_INSTRUCTION
+++ /dev/null
@@ -1,37 +0,0 @@
-Instruction of Running webrtc_unity_plugin on Android Unity
-
-1. On Linux machine, compile target webrtc_unity_plugin.
-   Checkout WebRTC codebase: fetch --no-hooks webrtc_android
-   If you already have a checkout for linux, add target_os=”android” into .gclient file.
-      Run gclient sync
-   Modify files src/build/android/android_only_jni_exports.lst and src/build/android/android_only_explicit_jni_exports.lst to expose all functions. Namely, change "global" section to "*", and remove "local" section. Otherwise, Unity C# code will not be able to access the functions defined in the plugin. If you do this step after you create a build folder, you may have to clean and recreate the build folder.
-      Run gn args out/Android, and again set target_os=”android” in the args.gn
-      Run ninja -C out/Android webrtc_unity_plugin
-
-2. On Linux machine, compile target libwebrtc_unity under webrtc checkout. This is the java code for webrtc to work on Android.
-
-3. Copy libwebrtc_unity.jar and libwebrtc_unity_plugin.so into Unity project folder, under Assets/Plugins/Android folder.
-
-4. Rename libwebrtc_unity_plugin.so to libjingle_peerconnection_so.so. Again, this is hacky, and the purpose is to let the java code in libwebrtc.jar to find their JNI implementation. And simultaneously, in your C# wrapper script for the native plugin libjingle_peerconnection_so.so, the dll_path should be set to “jingle_peerconnection_so”.
-
-5. In the Unity Main Scene’s Start method, write the following code to initialize the Java environment for webrtc (otherwise, webrtc will not be able to access audio device or camera from C++ code):
-
-#if UNITY_ANDROID
-        AndroidJavaClass playerClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
-        AndroidJavaObject activity = playerClass.GetStatic<AndroidJavaObject>("currentActivity");
-        AndroidJavaClass webrtcClass = new AndroidJavaClass("org.webrtc.PeerConnectionFactory");
-        if (webrtcClass != null)
-        {
-            webrtcClass.CallStatic("initializeAndroidGlobals", new object[2] { activity, false });
-        }
-#endif
-
-6. Compile the unity project into an APK, and decompile the apk using apktool that you can download from https://ibotpeaches.github.io/Apktool/
-    Run apktool d apkname.apk.
-Then copy the AndroidManifest.xml in the decompiled folder to the Assets/Plugins/Android folder, and add two lines:
-  <uses-permission android:name="android.permission.RECORD_AUDIO" />
-  <uses-permission android:name="android.permission.CAMERA" />
-
-  The purpose of using apktool is to get a well-written android manifest xml file. If you know how to write manifest file from scratch, you can skip using apktool.
-
-7. Compile the unity project into an APK again and deploy it to an android device.
diff --git a/examples/unityplugin/DEPS b/examples/unityplugin/DEPS
deleted file mode 100644
index ede414b..0000000
--- a/examples/unityplugin/DEPS
+++ /dev/null
@@ -1,3 +0,0 @@
-include_rules = [
-  "+webrtc/sdk",
-]
diff --git a/examples/unityplugin/OWNERS b/examples/unityplugin/OWNERS
deleted file mode 100644
index 61ea9a9..0000000
--- a/examples/unityplugin/OWNERS
+++ /dev/null
@@ -1 +0,0 @@
-gyzhou@chromium.org
diff --git a/examples/unityplugin/README b/examples/unityplugin/README
deleted file mode 100644
index 5f26b89..0000000
--- a/examples/unityplugin/README
+++ /dev/null
@@ -1,309 +0,0 @@
-This directory contains an example Unity native plugin for Windows OS and Android.
-
-The APIs use Platform Invoke (P/Invoke) technology as required by Unity native plugin.
-This plugin dll can also be used by Windows C# applications other than Unity.
-
-For detailed build instruction on Android, see ANDROID_INSTRUCTION
-
-An example of wrapping native plugin into a C# managed class in Unity is given as following:
-
-using System;
-using System.Collections.Generic;
-using System.Runtime.InteropServices;
-
-namespace SimplePeerConnectionM {
-  // A class for ice candidate.
-  public class IceCandidate {
-    public IceCandidate(string candidate, int sdpMlineIndex, string sdpMid) {
-      mCandidate = candidate;
-      mSdpMlineIndex = sdpMlineIndex;
-      mSdpMid = sdpMid;
-    }
-    string mCandidate;
-    int mSdpMlineIndex;
-    string mSdpMid;
-
-    public string Candidate {
-      get { return mCandidate; }
-      set { mCandidate = value; }
-    }
-
-    public int SdpMlineIndex {
-      get { return mSdpMlineIndex; }
-      set { mSdpMlineIndex = value; }
-    }
-
-    public string SdpMid {
-      get { return mSdpMid; }
-      set { mSdpMid = value; }
-    }
-  }
-
-  // A managed wrapper up class for the native c style peer connection APIs.
-  public class PeerConnectionM {
-    private const string dllPath = "webrtc_unity_plugin";
-
-    //create a peerconnection with turn servers
-    [DllImport(dllPath, CallingConvention = CallingConvention.Cdecl)]
-    private static extern int CreatePeerConnection(string[] turnUrls, int noOfUrls,
-        string username, string credential);
-
-    [DllImport(dllPath, CallingConvention = CallingConvention.Cdecl)]
-    private static extern bool ClosePeerConnection(int peerConnectionId);
-
-    [DllImport(dllPath, CallingConvention = CallingConvention.Cdecl)]
-    private static extern bool AddStream(int peerConnectionId, bool audioOnly);
-
-    [DllImport(dllPath, CallingConvention = CallingConvention.Cdecl)]
-    private static extern bool AddDataChannel(int peerConnectionId);
-
-    [DllImport(dllPath, CallingConvention = CallingConvention.Cdecl)]
-    private static extern bool CreateOffer(int peerConnectionId);
-
-    [DllImport(dllPath, CallingConvention = CallingConvention.Cdecl)]
-    private static extern bool CreateAnswer(int peerConnectionId);
-
-    [DllImport(dllPath, CallingConvention = CallingConvention.Cdecl)]
-    private static extern bool SendDataViaDataChannel(int peerConnectionId, string data);
-
-    [DllImport(dllPath, CallingConvention = CallingConvention.Cdecl)]
-    private static extern bool SetAudioControl(int peerConnectionId, bool isMute, bool isRecord);
-
-    [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
-    private delegate void LocalDataChannelReadyInternalDelegate();
-    public delegate void LocalDataChannelReadyDelegate(int id);
-    [DllImport(dllPath, CallingConvention = CallingConvention.Cdecl)]
-    private static extern bool RegisterOnLocalDataChannelReady(
-        int peerConnectionId, LocalDataChannelReadyInternalDelegate callback);
-
-    [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
-    private delegate void DataFromDataChannelReadyInternalDelegate(string s);
-    public delegate void DataFromDataChannelReadyDelegate(int id, string s);
-    [DllImport(dllPath, CallingConvention = CallingConvention.Cdecl)]
-    private static extern bool RegisterOnDataFromDataChannelReady(
-        int peerConnectionId, DataFromDataChannelReadyInternalDelegate callback);
-
-    [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
-    private delegate void FailureMessageInternalDelegate(string msg);
-    public delegate void FailureMessageDelegate(int id, string msg);
-    [DllImport(dllPath, CallingConvention = CallingConvention.Cdecl)]
-    private static extern bool RegisterOnFailure(int peerConnectionId,
-        FailureMessageInternalDelegate callback);
-
-    [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
-    private delegate void AudioBusReadyInternalDelegate(IntPtr data, int bitsPerSample,
-        int sampleRate, int numberOfChannels, int numberOfFrames);
-    public delegate void AudioBusReadyDelegate(int id, IntPtr data, int bitsPerSample,
-        int sampleRate, int numberOfChannels, int numberOfFrames);
-    [DllImport(dllPath, CallingConvention = CallingConvention.Cdecl)]
-    private static extern bool RegisterOnAudioBusReady(int peerConnectionId,
-        AudioBusReadyInternalDelegate callback);
-
-    // Video callbacks.
-    [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
-    private delegate void I420FrameReadyInternalDelegate(
-        IntPtr dataY, IntPtr dataU, IntPtr dataV,
-        int strideY, int strideU, int strideV,
-        uint width, uint height);
-    public delegate void I420FrameReadyDelegate(int id,
-        IntPtr dataY, IntPtr dataU, IntPtr dataV,
-        int strideY, int strideU, int strideV,
-        uint width, uint height);
-    [DllImport(dllPath, CallingConvention = CallingConvention.Cdecl)]
-    private static extern bool RegisterOnLocalI420FrameReady(int peerConnectionId,
-        I420FrameReadyInternalDelegate callback);
-    [DllImport(dllPath, CallingConvention = CallingConvention.Cdecl)]
-    private static extern bool RegisterOnRemoteI420FrameReady(int peerConnectionId,
-        I420FrameReadyInternalDelegate callback);
-
-    [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
-    private delegate void LocalSdpReadytoSendInternalDelegate(string type, string sdp);
-    public delegate void LocalSdpReadytoSendDelegate(int id, string type, string sdp);
-    [DllImport(dllPath, CallingConvention = CallingConvention.Cdecl)]
-    private static extern bool RegisterOnLocalSdpReadytoSend(int peerConnectionId,
-        LocalSdpReadytoSendInternalDelegate callback);
-
-    [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
-    private delegate void IceCandiateReadytoSendInternalDelegate(
-        string candidate, int sdpMlineIndex, string sdpMid);
-    public delegate void IceCandiateReadytoSendDelegate(
-        int id, string candidate, int sdpMlineIndex, string sdpMid);
-    [DllImport(dllPath, CallingConvention = CallingConvention.Cdecl)]
-    private static extern bool RegisterOnIceCandiateReadytoSend(
-        int peerConnectionId, IceCandiateReadytoSendInternalDelegate callback);
-
-    [DllImport(dllPath, CallingConvention = CallingConvention.Cdecl)]
-    private static extern bool SetRemoteDescription(int peerConnectionId, string type, string sdp);
-
-    [DllImport(dllPath, CallingConvention = CallingConvention.Cdecl)]
-    private static extern bool AddIceCandidate(int peerConnectionId, string sdp,
-      int sdpMlineindex, string sdpMid);
-
-    public PeerConnectionM(List<string> turnUrls, string username, string credential) {
-      string[] urls = turnUrls != null ? turnUrls.ToArray() : null;
-      int length = turnUrls != null ? turnUrls.Count : 0;
-      mPeerConnectionId = CreatePeerConnection(urls, length, username, credential);
-      RegisterCallbacks();
-    }
-
-    public void ClosePeerConnection() {
-      ClosePeerConnection(mPeerConnectionId);
-      mPeerConnectionId = -1;
-    }
-
-    // Return -1 if Peerconnection is not available.
-    public int GetUniqueId() {
-      return mPeerConnectionId;
-    }
-
-    public void AddStream(bool audioOnly) {
-      AddStream(mPeerConnectionId, audioOnly);
-    }
-
-    public void AddDataChannel() {
-      AddDataChannel(mPeerConnectionId);
-    }
-
-    public void CreateOffer() {
-      CreateOffer(mPeerConnectionId);
-    }
-
-    public void CreateAnswer() {
-      CreateAnswer(mPeerConnectionId);
-    }
-
-    public void SendDataViaDataChannel(string data) {
-      SendDataViaDataChannel(mPeerConnectionId, data);
-    }
-
-    public void SetAudioControl(bool isMute, bool isRecord) {
-      SetAudioControl(mPeerConnectionId, isMute, isRecord);
-    }
-
-    public void SetRemoteDescription(string type, string sdp) {
-      SetRemoteDescription(mPeerConnectionId, type, sdp);
-    }
-
-    public void AddIceCandidate(string candidate, int sdpMlineindex, string sdpMid) {
-      AddIceCandidate(mPeerConnectionId, candidate, sdpMlineindex, sdpMid);
-    }
-
-    private void RegisterCallbacks() {
-      localDataChannelReadyDelegate = new LocalDataChannelReadyInternalDelegate(
-          RaiseLocalDataChannelReady);
-      RegisterOnLocalDataChannelReady(mPeerConnectionId, localDataChannelReadyDelegate);
-
-      dataFromDataChannelReadyDelegate = new DataFromDataChannelReadyInternalDelegate(
-          RaiseDataFromDataChannelReady);
-      RegisterOnDataFromDataChannelReady(mPeerConnectionId, dataFromDataChannelReadyDelegate);
-
-      failureMessageDelegate = new FailureMessageInternalDelegate(RaiseFailureMessage);
-      RegisterOnFailure(mPeerConnectionId, failureMessageDelegate);
-
-      audioBusReadyDelegate = new AudioBusReadyInternalDelegate(RaiseAudioBusReady);
-      RegisterOnAudioBusReady(mPeerConnectionId, audioBusReadyDelegate);
-
-      localI420FrameReadyDelegate = new I420FrameReadyInternalDelegate(
-        RaiseLocalVideoFrameReady);
-      RegisterOnLocalI420FrameReady(mPeerConnectionId, localI420FrameReadyDelegate);
-
-      remoteI420FrameReadyDelegate = new I420FrameReadyInternalDelegate(
-        RaiseRemoteVideoFrameReady);
-      RegisterOnRemoteI420FrameReady(mPeerConnectionId, remoteI420FrameReadyDelegate);
-
-      localSdpReadytoSendDelegate = new LocalSdpReadytoSendInternalDelegate(
-        RaiseLocalSdpReadytoSend);
-      RegisterOnLocalSdpReadytoSend(mPeerConnectionId, localSdpReadytoSendDelegate);
-
-      iceCandiateReadytoSendDelegate =
-          new IceCandiateReadytoSendInternalDelegate(RaiseIceCandiateReadytoSend);
-      RegisterOnIceCandiateReadytoSend(
-          mPeerConnectionId, iceCandiateReadytoSendDelegate);
-    }
-
-    private void RaiseLocalDataChannelReady() {
-      if (OnLocalDataChannelReady != null)
-        OnLocalDataChannelReady(mPeerConnectionId);
-    }
-
-    private void RaiseDataFromDataChannelReady(string data) {
-      if (OnDataFromDataChannelReady != null)
-        OnDataFromDataChannelReady(mPeerConnectionId, data);
-    }
-
-    private void RaiseFailureMessage(string msg) {
-      if (OnFailureMessage != null)
-        OnFailureMessage(mPeerConnectionId, msg);
-    }
-
-    private void RaiseAudioBusReady(IntPtr data, int bitsPerSample,
-      int sampleRate, int numberOfChannels, int numberOfFrames) {
-      if (OnAudioBusReady != null)
-        OnAudioBusReady(mPeerConnectionId, data, bitsPerSample, sampleRate,
-            numberOfChannels, numberOfFrames);
-    }
-
-    private void RaiseLocalVideoFrameReady(
-        IntPtr dataY, IntPtr dataU, IntPtr dataV,
-        int strideY, int strideU, int strideV,
-        uint width, uint height) {
-      if (OnLocalVideoFrameReady != null)
-        OnLocalVideoFrameReady(mPeerConnectionId, dataY, dataU, dataV, strideY, strideU, strideV,
-          width, height);
-    }
-
-    private void RaiseRemoteVideoFrameReady(
-       IntPtr dataY, IntPtr dataU, IntPtr dataV,
-       int strideY, int strideU, int strideV,
-       uint width, uint height) {
-      if (OnRemoteVideoFrameReady != null)
-        OnRemoteVideoFrameReady(mPeerConnectionId, dataY, dataU, dataV, strideY, strideU, strideV,
-          width, height);
-    }
-
-
-    private void RaiseLocalSdpReadytoSend(string type, string sdp) {
-      if (OnLocalSdpReadytoSend != null)
-        OnLocalSdpReadytoSend(mPeerConnectionId, type, sdp);
-    }
-
-    private void RaiseIceCandiateReadytoSend(string candidate, int sdpMlineIndex, string sdpMid) {
-      if (OnIceCandiateReadytoSend != null)
-        OnIceCandiateReadytoSend(mPeerConnectionId, candidate, sdpMlineIndex, sdpMid);
-    }
-
-    public void AddQueuedIceCandidate(List<IceCandidate> iceCandidateQueue) {
-      if (iceCandidateQueue != null) {
-        foreach (IceCandidate ic in iceCandidateQueue) {
-          AddIceCandidate(mPeerConnectionId, ic.Candidate, ic.SdpMlineIndex, ic.SdpMid);
-        }
-      }
-    }
-
-    private LocalDataChannelReadyInternalDelegate localDataChannelReadyDelegate = null;
-    public event LocalDataChannelReadyDelegate OnLocalDataChannelReady;
-
-    private DataFromDataChannelReadyInternalDelegate dataFromDataChannelReadyDelegate = null;
-    public event DataFromDataChannelReadyDelegate OnDataFromDataChannelReady;
-
-    private FailureMessageInternalDelegate failureMessageDelegate = null;
-    public event FailureMessageDelegate OnFailureMessage;
-
-    private AudioBusReadyInternalDelegate audioBusReadyDelegate = null;
-    public event AudioBusReadyDelegate OnAudioBusReady;
-
-    private I420FrameReadyInternalDelegate localI420FrameReadyDelegate = null;
-    public event I420FrameReadyDelegate OnLocalVideoFrameReady;
-
-    private I420FrameReadyInternalDelegate remoteI420FrameReadyDelegate = null;
-    public event I420FrameReadyDelegate OnRemoteVideoFrameReady;
-
-    private LocalSdpReadytoSendInternalDelegate localSdpReadytoSendDelegate = null;
-    public event LocalSdpReadytoSendDelegate OnLocalSdpReadytoSend;
-
-    private IceCandiateReadytoSendInternalDelegate iceCandiateReadytoSendDelegate = null;
-    public event IceCandiateReadytoSendDelegate OnIceCandiateReadytoSend;
-
-    private int mPeerConnectionId = -1;
-  }
-}
diff --git a/examples/unityplugin/classreferenceholder.cc b/examples/unityplugin/classreferenceholder.cc
deleted file mode 100644
index b009ce4..0000000
--- a/examples/unityplugin/classreferenceholder.cc
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- *  Copyright 2015 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/examples/unityplugin/classreferenceholder.h"
-
-#include <utility>
-
-#include "webrtc/sdk/android/src/jni/jni_helpers.h"
-
-namespace unity_plugin {
-
-// ClassReferenceHolder holds global reference to Java classes in app/webrtc.
-class ClassReferenceHolder {
- public:
-  explicit ClassReferenceHolder(JNIEnv* jni);
-  ~ClassReferenceHolder();
-
-  void FreeReferences(JNIEnv* jni);
-  jclass GetClass(const std::string& name);
-
-  void LoadClass(JNIEnv* jni, const std::string& name);
-
- private:
-  std::map<std::string, jclass> classes_;
-};
-
-// Allocated in LoadGlobalClassReferenceHolder(),
-// freed in FreeGlobalClassReferenceHolder().
-static ClassReferenceHolder* g_class_reference_holder = nullptr;
-
-void LoadGlobalClassReferenceHolder() {
-  RTC_CHECK(g_class_reference_holder == nullptr);
-  g_class_reference_holder = new ClassReferenceHolder(webrtc::jni::GetEnv());
-}
-
-void FreeGlobalClassReferenceHolder() {
-  g_class_reference_holder->FreeReferences(
-      webrtc::jni::AttachCurrentThreadIfNeeded());
-  delete g_class_reference_holder;
-  g_class_reference_holder = nullptr;
-}
-
-ClassReferenceHolder::ClassReferenceHolder(JNIEnv* jni) {
-  LoadClass(jni, "org/webrtc/UnityUtility");
-}
-
-ClassReferenceHolder::~ClassReferenceHolder() {
-  RTC_CHECK(classes_.empty()) << "Must call FreeReferences() before dtor!";
-}
-
-void ClassReferenceHolder::FreeReferences(JNIEnv* jni) {
-  for (std::map<std::string, jclass>::const_iterator it = classes_.begin();
-       it != classes_.end(); ++it) {
-    jni->DeleteGlobalRef(it->second);
-  }
-  classes_.clear();
-}
-
-jclass ClassReferenceHolder::GetClass(const std::string& name) {
-  std::map<std::string, jclass>::iterator it = classes_.find(name);
-  RTC_CHECK(it != classes_.end()) << "Unexpected GetClass() call for: " << name;
-  return it->second;
-}
-
-void ClassReferenceHolder::LoadClass(JNIEnv* jni, const std::string& name) {
-  jclass localRef = jni->FindClass(name.c_str());
-  CHECK_EXCEPTION(jni) << "error during FindClass: " << name;
-  RTC_CHECK(localRef) << name;
-  jclass globalRef = reinterpret_cast<jclass>(jni->NewGlobalRef(localRef));
-  CHECK_EXCEPTION(jni) << "error during NewGlobalRef: " << name;
-  RTC_CHECK(globalRef) << name;
-  bool inserted = classes_.insert(std::make_pair(name, globalRef)).second;
-  RTC_CHECK(inserted) << "Duplicate class name: " << name;
-}
-
-// Returns a global reference guaranteed to be valid for the lifetime of the
-// process.
-jclass FindClass(JNIEnv* jni, const char* name) {
-  return g_class_reference_holder->GetClass(name);
-}
-
-}  // namespace unity_plugin
diff --git a/examples/unityplugin/classreferenceholder.h b/examples/unityplugin/classreferenceholder.h
deleted file mode 100644
index 7d9a71b..0000000
--- a/examples/unityplugin/classreferenceholder.h
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-// This is a supplement of webrtc::jni::ClassReferenceHolder.
-// The purpose of this ClassReferenceHolder is to load the example
-// specific java class into JNI c++ side, so that our c++ code can
-// call those java functions.
-
-#ifndef WEBRTC_EXAMPLES_UNITYPLUGIN_CLASSREFERENCEHOLDER_H_
-#define WEBRTC_EXAMPLES_UNITYPLUGIN_CLASSREFERENCEHOLDER_H_
-
-#include <jni.h>
-#include <map>
-#include <string>
-#include <vector>
-
-namespace unity_plugin {
-
-// LoadGlobalClassReferenceHolder must be called in JNI_OnLoad.
-void LoadGlobalClassReferenceHolder();
-// FreeGlobalClassReferenceHolder must be called in JNI_UnLoad.
-void FreeGlobalClassReferenceHolder();
-
-// Returns a global reference guaranteed to be valid for the lifetime of the
-// process.
-jclass FindClass(JNIEnv* jni, const char* name);
-
-}  // namespace unity_plugin
-
-#endif  // WEBRTC_EXAMPLES_UNITYPLUGIN_CLASSREFERENCEHOLDER_H_
diff --git a/examples/unityplugin/java/src/org/webrtc/UnityUtility.java b/examples/unityplugin/java/src/org/webrtc/UnityUtility.java
deleted file mode 100644
index b16d20a..0000000
--- a/examples/unityplugin/java/src/org/webrtc/UnityUtility.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- *  Copyright 2017 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.
- */
-
-package org.webrtc;
-
-import android.content.Context;
-import java.util.List;
-
-public class UnityUtility {
-  private static final String VIDEO_CAPTURER_THREAD_NAME = "VideoCapturerThread";
-
-  public static SurfaceTextureHelper LoadSurfaceTextureHelper() {
-    final SurfaceTextureHelper surfaceTextureHelper =
-        SurfaceTextureHelper.create(VIDEO_CAPTURER_THREAD_NAME, null);
-    return surfaceTextureHelper;
-  }
-
-  private static boolean useCamera2() {
-    return Camera2Enumerator.isSupported(ContextUtils.getApplicationContext());
-  }
-
-  private static VideoCapturer createCameraCapturer(CameraEnumerator enumerator) {
-    final String[] deviceNames = enumerator.getDeviceNames();
-
-    for (String deviceName : deviceNames) {
-      if (enumerator.isFrontFacing(deviceName)) {
-        VideoCapturer videoCapturer = enumerator.createCapturer(deviceName, null);
-
-        if (videoCapturer != null) {
-          return videoCapturer;
-        }
-      }
-    }
-
-    return null;
-  }
-
-  public static VideoCapturer LinkCamera(
-      long nativeTrackSource, SurfaceTextureHelper surfaceTextureHelper) {
-    VideoCapturer capturer =
-        createCameraCapturer(new Camera2Enumerator(ContextUtils.getApplicationContext()));
-
-    VideoCapturer.CapturerObserver capturerObserver =
-        new AndroidVideoTrackSourceObserver(nativeTrackSource);
-
-    capturer.initialize(
-        surfaceTextureHelper, ContextUtils.getApplicationContext(), capturerObserver);
-
-    capturer.startCapture(720, 480, 30);
-    return capturer;
-  }
-
-  public static void StopCamera(VideoCapturer camera) throws InterruptedException {
-    camera.stopCapture();
-    camera.dispose();
-  }
-}
diff --git a/examples/unityplugin/jni_onload.cc b/examples/unityplugin/jni_onload.cc
deleted file mode 100644
index 558dcfb..0000000
--- a/examples/unityplugin/jni_onload.cc
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- *  Copyright 2015 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 <jni.h>
-#undef JNIEXPORT
-#define JNIEXPORT __attribute__((visibility("default")))
-
-#include "webrtc/examples/unityplugin/classreferenceholder.h"
-#include "webrtc/rtc_base/ssladapter.h"
-#include "webrtc/sdk/android/src/jni/classreferenceholder.h"
-#include "webrtc/sdk/android/src/jni/jni_helpers.h"
-
-namespace webrtc {
-namespace jni {
-
-extern "C" jint JNIEXPORT JNICALL JNI_OnLoad(JavaVM* jvm, void* reserved) {
-  jint ret = InitGlobalJniVariables(jvm);
-  RTC_DCHECK_GE(ret, 0);
-  if (ret < 0)
-    return -1;
-
-  RTC_CHECK(rtc::InitializeSSL()) << "Failed to InitializeSSL()";
-  LoadGlobalClassReferenceHolder();
-  unity_plugin::LoadGlobalClassReferenceHolder();
-
-  return ret;
-}
-
-extern "C" void JNIEXPORT JNICALL JNI_OnUnLoad(JavaVM* jvm, void* reserved) {
-  FreeGlobalClassReferenceHolder();
-  unity_plugin::FreeGlobalClassReferenceHolder();
-  RTC_CHECK(rtc::CleanupSSL()) << "Failed to CleanupSSL()";
-}
-
-}  // namespace jni
-}  // namespace webrtc
diff --git a/examples/unityplugin/simple_peer_connection.cc b/examples/unityplugin/simple_peer_connection.cc
deleted file mode 100644
index 3f3f3fb..0000000
--- a/examples/unityplugin/simple_peer_connection.cc
+++ /dev/null
@@ -1,565 +0,0 @@
-/*
- *  Copyright (c) 2017 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/examples/unityplugin/simple_peer_connection.h"
-
-#include <utility>
-
-#include "webrtc/api/test/fakeconstraints.h"
-#include "webrtc/api/videosourceproxy.h"
-#include "webrtc/media/engine/webrtcvideocapturerfactory.h"
-#include "webrtc/modules/video_capture/video_capture_factory.h"
-
-#if defined(WEBRTC_ANDROID)
-#include "webrtc/examples/unityplugin/classreferenceholder.h"
-#include "webrtc/sdk/android/src/jni/androidvideotracksource.h"
-#include "webrtc/sdk/android/src/jni/jni_helpers.h"
-#endif
-
-// Names used for media stream labels.
-const char kAudioLabel[] = "audio_label";
-const char kVideoLabel[] = "video_label";
-const char kStreamLabel[] = "stream_label";
-
-namespace {
-static int g_peer_count = 0;
-static std::unique_ptr<rtc::Thread> g_worker_thread;
-static std::unique_ptr<rtc::Thread> g_signaling_thread;
-static rtc::scoped_refptr<webrtc::PeerConnectionFactoryInterface>
-    g_peer_connection_factory;
-#if defined(WEBRTC_ANDROID)
-// Android case: the video track does not own the capturer, and it
-// relies on the app to dispose the capturer when the peerconnection
-// shuts down.
-static jobject g_camera = nullptr;
-#endif
-
-std::string GetEnvVarOrDefault(const char* env_var_name,
-                               const char* default_value) {
-  std::string value;
-  const char* env_var = getenv(env_var_name);
-  if (env_var)
-    value = env_var;
-
-  if (value.empty())
-    value = default_value;
-
-  return value;
-}
-
-std::string GetPeerConnectionString() {
-  return GetEnvVarOrDefault("WEBRTC_CONNECT", "stun:stun.l.google.com:19302");
-}
-
-class DummySetSessionDescriptionObserver
-    : public webrtc::SetSessionDescriptionObserver {
- public:
-  static DummySetSessionDescriptionObserver* Create() {
-    return new rtc::RefCountedObject<DummySetSessionDescriptionObserver>();
-  }
-  virtual void OnSuccess() { LOG(INFO) << __FUNCTION__; }
-  virtual void OnFailure(const std::string& error) {
-    LOG(INFO) << __FUNCTION__ << " " << error;
-  }
-
- protected:
-  DummySetSessionDescriptionObserver() {}
-  ~DummySetSessionDescriptionObserver() {}
-};
-
-}  // namespace
-
-bool SimplePeerConnection::InitializePeerConnection(const char** turn_urls,
-                                                    const int no_of_urls,
-                                                    const char* username,
-                                                    const char* credential,
-                                                    bool is_receiver) {
-  RTC_DCHECK(peer_connection_.get() == nullptr);
-
-  if (g_peer_connection_factory == nullptr) {
-    g_worker_thread.reset(new rtc::Thread());
-    g_worker_thread->Start();
-    g_signaling_thread.reset(new rtc::Thread());
-    g_signaling_thread->Start();
-
-    g_peer_connection_factory = webrtc::CreatePeerConnectionFactory(
-        g_worker_thread.get(), g_worker_thread.get(), g_signaling_thread.get(),
-        nullptr, nullptr, nullptr);
-  }
-  if (!g_peer_connection_factory.get()) {
-    DeletePeerConnection();
-    return false;
-  }
-
-  g_peer_count++;
-  if (!CreatePeerConnection(turn_urls, no_of_urls, username, credential,
-                            is_receiver)) {
-    DeletePeerConnection();
-    return false;
-  }
-  return peer_connection_.get() != nullptr;
-}
-
-bool SimplePeerConnection::CreatePeerConnection(const char** turn_urls,
-                                                const int no_of_urls,
-                                                const char* username,
-                                                const char* credential,
-                                                bool is_receiver) {
-  RTC_DCHECK(g_peer_connection_factory.get() != nullptr);
-  RTC_DCHECK(peer_connection_.get() == nullptr);
-
-  local_video_observer_.reset(new VideoObserver());
-  remote_video_observer_.reset(new VideoObserver());
-
-  // Add the turn server.
-  if (turn_urls != nullptr) {
-    if (no_of_urls > 0) {
-      webrtc::PeerConnectionInterface::IceServer turn_server;
-      for (int i = 0; i < no_of_urls; i++) {
-        std::string url(turn_urls[i]);
-        if (url.length() > 0)
-          turn_server.urls.push_back(turn_urls[i]);
-      }
-
-      std::string user_name(username);
-      if (user_name.length() > 0)
-        turn_server.username = username;
-
-      std::string password(credential);
-      if (password.length() > 0)
-        turn_server.password = credential;
-
-      config_.servers.push_back(turn_server);
-    }
-  }
-
-  // Add the stun server.
-  webrtc::PeerConnectionInterface::IceServer stun_server;
-  stun_server.uri = GetPeerConnectionString();
-  config_.servers.push_back(stun_server);
-
-  webrtc::FakeConstraints constraints;
-  constraints.SetAllowDtlsSctpDataChannels();
-
-  if (is_receiver) {
-    constraints.SetMandatoryReceiveAudio(true);
-    constraints.SetMandatoryReceiveVideo(true);
-  }
-
-  peer_connection_ = g_peer_connection_factory->CreatePeerConnection(
-      config_, &constraints, nullptr, nullptr, this);
-
-  return peer_connection_.get() != nullptr;
-}
-
-void SimplePeerConnection::DeletePeerConnection() {
-  g_peer_count--;
-
-#if defined(WEBRTC_ANDROID)
-  if (g_camera) {
-    JNIEnv* env = webrtc::jni::GetEnv();
-    jclass pc_factory_class =
-        unity_plugin::FindClass(env, "org/webrtc/UnityUtility");
-    jmethodID stop_camera_method = webrtc::jni::GetStaticMethodID(
-        env, pc_factory_class, "StopCamera", "(Lorg/webrtc/VideoCapturer;)V");
-
-    env->CallStaticVoidMethod(pc_factory_class, stop_camera_method, g_camera);
-    CHECK_EXCEPTION(env);
-
-    g_camera = nullptr;
-  }
-#endif
-
-  CloseDataChannel();
-  peer_connection_ = nullptr;
-  active_streams_.clear();
-
-  if (g_peer_count == 0) {
-    g_peer_connection_factory = nullptr;
-    g_signaling_thread.reset();
-    g_worker_thread.reset();
-  }
-}
-
-bool SimplePeerConnection::CreateOffer() {
-  if (!peer_connection_.get())
-    return false;
-
-  peer_connection_->CreateOffer(this, nullptr);
-  return true;
-}
-
-bool SimplePeerConnection::CreateAnswer() {
-  if (!peer_connection_.get())
-    return false;
-
-  peer_connection_->CreateAnswer(this, nullptr);
-  return true;
-}
-
-void SimplePeerConnection::OnSuccess(
-    webrtc::SessionDescriptionInterface* desc) {
-  peer_connection_->SetLocalDescription(
-      DummySetSessionDescriptionObserver::Create(), desc);
-
-  std::string sdp;
-  desc->ToString(&sdp);
-
-  if (OnLocalSdpReady)
-    OnLocalSdpReady(desc->type().c_str(), sdp.c_str());
-}
-
-void SimplePeerConnection::OnFailure(const std::string& error) {
-  LOG(LERROR) << error;
-
-  if (OnFailureMessage)
-    OnFailureMessage(error.c_str());
-}
-
-void SimplePeerConnection::OnIceCandidate(
-    const webrtc::IceCandidateInterface* candidate) {
-  LOG(INFO) << __FUNCTION__ << " " << candidate->sdp_mline_index();
-
-  std::string sdp;
-  if (!candidate->ToString(&sdp)) {
-    LOG(LS_ERROR) << "Failed to serialize candidate";
-    return;
-  }
-
-  if (OnIceCandiateReady)
-    OnIceCandiateReady(sdp.c_str(), candidate->sdp_mline_index(),
-                       candidate->sdp_mid().c_str());
-}
-
-void SimplePeerConnection::RegisterOnLocalI420FrameReady(
-    I420FRAMEREADY_CALLBACK callback) {
-  if (local_video_observer_)
-    local_video_observer_->SetVideoCallback(callback);
-}
-
-void SimplePeerConnection::RegisterOnRemoteI420FrameReady(
-    I420FRAMEREADY_CALLBACK callback) {
-  if (remote_video_observer_)
-    remote_video_observer_->SetVideoCallback(callback);
-}
-
-void SimplePeerConnection::RegisterOnLocalDataChannelReady(
-    LOCALDATACHANNELREADY_CALLBACK callback) {
-  OnLocalDataChannelReady = callback;
-}
-
-void SimplePeerConnection::RegisterOnDataFromDataChannelReady(
-    DATAFROMEDATECHANNELREADY_CALLBACK callback) {
-  OnDataFromDataChannelReady = callback;
-}
-
-void SimplePeerConnection::RegisterOnFailure(FAILURE_CALLBACK callback) {
-  OnFailureMessage = callback;
-}
-
-void SimplePeerConnection::RegisterOnAudioBusReady(
-    AUDIOBUSREADY_CALLBACK callback) {
-  OnAudioReady = callback;
-}
-
-void SimplePeerConnection::RegisterOnLocalSdpReadytoSend(
-    LOCALSDPREADYTOSEND_CALLBACK callback) {
-  OnLocalSdpReady = callback;
-}
-
-void SimplePeerConnection::RegisterOnIceCandiateReadytoSend(
-    ICECANDIDATEREADYTOSEND_CALLBACK callback) {
-  OnIceCandiateReady = callback;
-}
-
-bool SimplePeerConnection::SetRemoteDescription(const char* type,
-                                                const char* sdp) {
-  if (!peer_connection_)
-    return false;
-
-  std::string remote_desc(sdp);
-  std::string sdp_type(type);
-  webrtc::SdpParseError error;
-  webrtc::SessionDescriptionInterface* session_description(
-      webrtc::CreateSessionDescription(sdp_type, remote_desc, &error));
-  if (!session_description) {
-    LOG(WARNING) << "Can't parse received session description message. "
-                 << "SdpParseError was: " << error.description;
-    return false;
-  }
-  LOG(INFO) << " Received session description :" << remote_desc;
-  peer_connection_->SetRemoteDescription(
-      DummySetSessionDescriptionObserver::Create(), session_description);
-
-  return true;
-}
-
-bool SimplePeerConnection::AddIceCandidate(const char* candidate,
-                                           const int sdp_mlineindex,
-                                           const char* sdp_mid) {
-  if (!peer_connection_)
-    return false;
-
-  webrtc::SdpParseError error;
-  std::unique_ptr<webrtc::IceCandidateInterface> ice_candidate(
-      webrtc::CreateIceCandidate(sdp_mid, sdp_mlineindex, candidate, &error));
-  if (!ice_candidate.get()) {
-    LOG(WARNING) << "Can't parse received candidate message. "
-                 << "SdpParseError was: " << error.description;
-    return false;
-  }
-  if (!peer_connection_->AddIceCandidate(ice_candidate.get())) {
-    LOG(WARNING) << "Failed to apply the received candidate";
-    return false;
-  }
-  LOG(INFO) << " Received candidate :" << candidate;
-  return true;
-}
-
-void SimplePeerConnection::SetAudioControl(bool is_mute, bool is_record) {
-  is_mute_audio_ = is_mute;
-  is_record_audio_ = is_record;
-
-  SetAudioControl();
-}
-
-void SimplePeerConnection::SetAudioControl() {
-  if (!remote_stream_)
-    return;
-  webrtc::AudioTrackVector tracks = remote_stream_->GetAudioTracks();
-  if (tracks.empty())
-    return;
-
-  webrtc::AudioTrackInterface* audio_track = tracks[0];
-  std::string id = audio_track->id();
-  if (is_record_audio_)
-    audio_track->AddSink(this);
-  else
-    audio_track->RemoveSink(this);
-
-  for (auto& track : tracks) {
-    if (is_mute_audio_)
-      track->set_enabled(false);
-    else
-      track->set_enabled(true);
-  }
-}
-
-void SimplePeerConnection::OnAddStream(
-    rtc::scoped_refptr<webrtc::MediaStreamInterface> stream) {
-  LOG(INFO) << __FUNCTION__ << " " << stream->label();
-  remote_stream_ = stream;
-  if (remote_video_observer_ && !remote_stream_->GetVideoTracks().empty()) {
-    remote_stream_->GetVideoTracks()[0]->AddOrUpdateSink(
-        remote_video_observer_.get(), rtc::VideoSinkWants());
-  }
-  SetAudioControl();
-}
-
-std::unique_ptr<cricket::VideoCapturer>
-SimplePeerConnection::OpenVideoCaptureDevice() {
-  std::vector<std::string> device_names;
-  {
-    std::unique_ptr<webrtc::VideoCaptureModule::DeviceInfo> info(
-        webrtc::VideoCaptureFactory::CreateDeviceInfo());
-    if (!info) {
-      return nullptr;
-    }
-    int num_devices = info->NumberOfDevices();
-    for (int i = 0; i < num_devices; ++i) {
-      const uint32_t kSize = 256;
-      char name[kSize] = {0};
-      char id[kSize] = {0};
-      if (info->GetDeviceName(i, name, kSize, id, kSize) != -1) {
-        device_names.push_back(name);
-      }
-    }
-  }
-
-  cricket::WebRtcVideoDeviceCapturerFactory factory;
-  std::unique_ptr<cricket::VideoCapturer> capturer;
-  for (const auto& name : device_names) {
-    capturer = factory.Create(cricket::Device(name, 0));
-    if (capturer) {
-      break;
-    }
-  }
-  return capturer;
-}
-
-void SimplePeerConnection::AddStreams(bool audio_only) {
-  if (active_streams_.find(kStreamLabel) != active_streams_.end())
-    return;  // Already added.
-
-  rtc::scoped_refptr<webrtc::MediaStreamInterface> stream =
-      g_peer_connection_factory->CreateLocalMediaStream(kStreamLabel);
-
-  rtc::scoped_refptr<webrtc::AudioTrackInterface> audio_track(
-      g_peer_connection_factory->CreateAudioTrack(
-          kAudioLabel, g_peer_connection_factory->CreateAudioSource(nullptr)));
-  std::string id = audio_track->id();
-  stream->AddTrack(audio_track);
-
-  if (!audio_only) {
-#if defined(WEBRTC_ANDROID)
-    JNIEnv* env = webrtc::jni::GetEnv();
-    jclass pc_factory_class =
-        unity_plugin::FindClass(env, "org/webrtc/UnityUtility");
-    jmethodID load_texture_helper_method = webrtc::jni::GetStaticMethodID(
-        env, pc_factory_class, "LoadSurfaceTextureHelper",
-        "()Lorg/webrtc/SurfaceTextureHelper;");
-    jobject texture_helper = env->CallStaticObjectMethod(
-        pc_factory_class, load_texture_helper_method);
-    CHECK_EXCEPTION(env);
-    RTC_DCHECK(texture_helper != nullptr)
-        << "Cannot get the Surface Texture Helper.";
-
-    rtc::scoped_refptr<AndroidVideoTrackSource> source(
-        new rtc::RefCountedObject<AndroidVideoTrackSource>(
-            g_signaling_thread.get(), env, texture_helper, false));
-    rtc::scoped_refptr<webrtc::VideoTrackSourceProxy> proxy_source =
-        webrtc::VideoTrackSourceProxy::Create(g_signaling_thread.get(),
-                                              g_worker_thread.get(), source);
-
-    // link with VideoCapturer (Camera);
-    jmethodID link_camera_method = webrtc::jni::GetStaticMethodID(
-        env, pc_factory_class, "LinkCamera",
-        "(JLorg/webrtc/SurfaceTextureHelper;)Lorg/webrtc/VideoCapturer;");
-    jobject camera_tmp =
-        env->CallStaticObjectMethod(pc_factory_class, link_camera_method,
-                                    (jlong)proxy_source.get(), texture_helper);
-    CHECK_EXCEPTION(env);
-    g_camera = (jobject)env->NewGlobalRef(camera_tmp);
-
-    rtc::scoped_refptr<webrtc::VideoTrackInterface> video_track(
-        g_peer_connection_factory->CreateVideoTrack(kVideoLabel,
-                                                    proxy_source.release()));
-    stream->AddTrack(video_track);
-#else
-    std::unique_ptr<cricket::VideoCapturer> capture = OpenVideoCaptureDevice();
-    if (capture) {
-      rtc::scoped_refptr<webrtc::VideoTrackInterface> video_track(
-          g_peer_connection_factory->CreateVideoTrack(
-              kVideoLabel, g_peer_connection_factory->CreateVideoSource(
-                               std::move(capture), nullptr)));
-
-      stream->AddTrack(video_track);
-    }
-#endif
-    if (local_video_observer_ && !stream->GetVideoTracks().empty()) {
-      stream->GetVideoTracks()[0]->AddOrUpdateSink(local_video_observer_.get(),
-                                                   rtc::VideoSinkWants());
-    }
-  }
-
-  if (!peer_connection_->AddStream(stream)) {
-    LOG(LS_ERROR) << "Adding stream to PeerConnection failed";
-  }
-
-  typedef std::pair<std::string,
-                    rtc::scoped_refptr<webrtc::MediaStreamInterface>>
-      MediaStreamPair;
-  active_streams_.insert(MediaStreamPair(stream->label(), stream));
-}
-
-bool SimplePeerConnection::CreateDataChannel() {
-  struct webrtc::DataChannelInit init;
-  init.ordered = true;
-  init.reliable = true;
-  data_channel_ = peer_connection_->CreateDataChannel("Hello", &init);
-  if (data_channel_.get()) {
-    data_channel_->RegisterObserver(this);
-    LOG(LS_INFO) << "Succeeds to create data channel";
-    return true;
-  } else {
-    LOG(LS_INFO) << "Fails to create data channel";
-    return false;
-  }
-}
-
-void SimplePeerConnection::CloseDataChannel() {
-  if (data_channel_.get()) {
-    data_channel_->UnregisterObserver();
-    data_channel_->Close();
-  }
-  data_channel_ = nullptr;
-}
-
-bool SimplePeerConnection::SendDataViaDataChannel(const std::string& data) {
-  if (!data_channel_.get()) {
-    LOG(LS_INFO) << "Data channel is not established";
-    return false;
-  }
-  webrtc::DataBuffer buffer(data);
-  data_channel_->Send(buffer);
-  return true;
-}
-
-// Peerconnection observer
-void SimplePeerConnection::OnDataChannel(
-    rtc::scoped_refptr<webrtc::DataChannelInterface> channel) {
-  channel->RegisterObserver(this);
-}
-
-void SimplePeerConnection::OnStateChange() {
-  if (data_channel_) {
-    webrtc::DataChannelInterface::DataState state = data_channel_->state();
-    if (state == webrtc::DataChannelInterface::kOpen) {
-      if (OnLocalDataChannelReady)
-        OnLocalDataChannelReady();
-      LOG(LS_INFO) << "Data channel is open";
-    }
-  }
-}
-
-//  A data buffer was successfully received.
-void SimplePeerConnection::OnMessage(const webrtc::DataBuffer& buffer) {
-  size_t size = buffer.data.size();
-  char* msg = new char[size + 1];
-  memcpy(msg, buffer.data.data(), size);
-  msg[size] = 0;
-  if (OnDataFromDataChannelReady)
-    OnDataFromDataChannelReady(msg);
-  delete[] msg;
-}
-
-// AudioTrackSinkInterface implementation.
-void SimplePeerConnection::OnData(const void* audio_data,
-                                  int bits_per_sample,
-                                  int sample_rate,
-                                  size_t number_of_channels,
-                                  size_t number_of_frames) {
-  if (OnAudioReady)
-    OnAudioReady(audio_data, bits_per_sample, sample_rate,
-                 static_cast<int>(number_of_channels),
-                 static_cast<int>(number_of_frames));
-}
-
-std::vector<uint32_t> SimplePeerConnection::GetRemoteAudioTrackSsrcs() {
-  std::vector<rtc::scoped_refptr<webrtc::RtpReceiverInterface>> receivers =
-      peer_connection_->GetReceivers();
-
-  std::vector<uint32_t> ssrcs;
-  for (const auto& receiver : receivers) {
-    if (receiver->media_type() != cricket::MEDIA_TYPE_AUDIO)
-      continue;
-
-    std::vector<webrtc::RtpEncodingParameters> params =
-        receiver->GetParameters().encodings;
-
-    for (const auto& param : params) {
-      uint32_t ssrc = param.ssrc.value_or(0);
-      if (ssrc > 0)
-        ssrcs.push_back(ssrc);
-    }
-  }
-
-  return ssrcs;
-}
diff --git a/examples/unityplugin/simple_peer_connection.h b/examples/unityplugin/simple_peer_connection.h
deleted file mode 100644
index 15961d8..0000000
--- a/examples/unityplugin/simple_peer_connection.h
+++ /dev/null
@@ -1,136 +0,0 @@
-/*
- *  Copyright (c) 2017 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_EXAMPLES_UNITYPLUGIN_SIMPLE_PEER_CONNECTION_H_
-#define WEBRTC_EXAMPLES_UNITYPLUGIN_SIMPLE_PEER_CONNECTION_H_
-
-#include <map>
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "webrtc/api/datachannelinterface.h"
-#include "webrtc/api/mediastreaminterface.h"
-#include "webrtc/api/peerconnectioninterface.h"
-#include "webrtc/examples/unityplugin/unity_plugin_apis.h"
-#include "webrtc/examples/unityplugin/video_observer.h"
-
-class SimplePeerConnection : public webrtc::PeerConnectionObserver,
-                             public webrtc::CreateSessionDescriptionObserver,
-                             public webrtc::DataChannelObserver,
-                             public webrtc::AudioTrackSinkInterface {
- public:
-  SimplePeerConnection() {}
-  ~SimplePeerConnection() {}
-
-  bool InitializePeerConnection(const char** turn_urls,
-                                const int no_of_urls,
-                                const char* username,
-                                const char* credential,
-                                bool is_receiver);
-  void DeletePeerConnection();
-  void AddStreams(bool audio_only);
-  bool CreateDataChannel();
-  bool CreateOffer();
-  bool CreateAnswer();
-  bool SendDataViaDataChannel(const std::string& data);
-  void SetAudioControl(bool is_mute, bool is_record);
-
-  // Register callback functions.
-  void RegisterOnLocalI420FrameReady(I420FRAMEREADY_CALLBACK callback);
-  void RegisterOnRemoteI420FrameReady(I420FRAMEREADY_CALLBACK callback);
-  void RegisterOnLocalDataChannelReady(LOCALDATACHANNELREADY_CALLBACK callback);
-  void RegisterOnDataFromDataChannelReady(
-      DATAFROMEDATECHANNELREADY_CALLBACK callback);
-  void RegisterOnFailure(FAILURE_CALLBACK callback);
-  void RegisterOnAudioBusReady(AUDIOBUSREADY_CALLBACK callback);
-  void RegisterOnLocalSdpReadytoSend(LOCALSDPREADYTOSEND_CALLBACK callback);
-  void RegisterOnIceCandiateReadytoSend(
-      ICECANDIDATEREADYTOSEND_CALLBACK callback);
-  bool SetRemoteDescription(const char* type, const char* sdp);
-  bool AddIceCandidate(const char* sdp,
-                       const int sdp_mlineindex,
-                       const char* sdp_mid);
-
- protected:
-  // create a peerconneciton and add the turn servers info to the configuration.
-  bool CreatePeerConnection(const char** turn_urls,
-                            const int no_of_urls,
-                            const char* username,
-                            const char* credential,
-                            bool is_receiver);
-  void CloseDataChannel();
-  std::unique_ptr<cricket::VideoCapturer> OpenVideoCaptureDevice();
-  void SetAudioControl();
-
-  // PeerConnectionObserver implementation.
-  void OnSignalingChange(
-      webrtc::PeerConnectionInterface::SignalingState new_state) override {}
-  void OnAddStream(
-      rtc::scoped_refptr<webrtc::MediaStreamInterface> stream) override;
-  void OnRemoveStream(
-      rtc::scoped_refptr<webrtc::MediaStreamInterface> stream) override {}
-  void OnDataChannel(
-      rtc::scoped_refptr<webrtc::DataChannelInterface> channel) override;
-  void OnRenegotiationNeeded() override {}
-  void OnIceConnectionChange(
-      webrtc::PeerConnectionInterface::IceConnectionState new_state) override {}
-  void OnIceGatheringChange(
-      webrtc::PeerConnectionInterface::IceGatheringState new_state) override {}
-  void OnIceCandidate(const webrtc::IceCandidateInterface* candidate) override;
-  void OnIceConnectionReceivingChange(bool receiving) override {}
-
-  // CreateSessionDescriptionObserver implementation.
-  void OnSuccess(webrtc::SessionDescriptionInterface* desc) override;
-  void OnFailure(const std::string& error) override;
-
-  // DataChannelObserver implementation.
-  void OnStateChange() override;
-  void OnMessage(const webrtc::DataBuffer& buffer) override;
-
-  // AudioTrackSinkInterface implementation.
-  void OnData(const void* audio_data,
-              int bits_per_sample,
-              int sample_rate,
-              size_t number_of_channels,
-              size_t number_of_frames) override;
-
-  // Get remote audio tracks ssrcs.
-  std::vector<uint32_t> GetRemoteAudioTrackSsrcs();
-
- private:
-  rtc::scoped_refptr<webrtc::PeerConnectionInterface> peer_connection_;
-  rtc::scoped_refptr<webrtc::DataChannelInterface> data_channel_;
-  std::map<std::string, rtc::scoped_refptr<webrtc::MediaStreamInterface> >
-      active_streams_;
-
-  std::unique_ptr<VideoObserver> local_video_observer_;
-  std::unique_ptr<VideoObserver> remote_video_observer_;
-
-  webrtc::MediaStreamInterface* remote_stream_ = nullptr;
-  webrtc::PeerConnectionInterface::RTCConfiguration config_;
-
-  LOCALDATACHANNELREADY_CALLBACK OnLocalDataChannelReady = nullptr;
-  DATAFROMEDATECHANNELREADY_CALLBACK OnDataFromDataChannelReady = nullptr;
-  FAILURE_CALLBACK OnFailureMessage = nullptr;
-  AUDIOBUSREADY_CALLBACK OnAudioReady = nullptr;
-
-  LOCALSDPREADYTOSEND_CALLBACK OnLocalSdpReady = nullptr;
-  ICECANDIDATEREADYTOSEND_CALLBACK OnIceCandiateReady = nullptr;
-
-  bool is_mute_audio_ = false;
-  bool is_record_audio_ = false;
-
-  // disallow copy-and-assign
-  SimplePeerConnection(const SimplePeerConnection&) = delete;
-  SimplePeerConnection& operator=(const SimplePeerConnection&) = delete;
-};
-
-#endif  // WEBRTC_EXAMPLES_UNITYPLUGIN_SIMPLE_PEER_CONNECTION_H_
diff --git a/examples/unityplugin/unity_plugin_apis.cc b/examples/unityplugin/unity_plugin_apis.cc
deleted file mode 100644
index 08b3347..0000000
--- a/examples/unityplugin/unity_plugin_apis.cc
+++ /dev/null
@@ -1,195 +0,0 @@
-/*
- *  Copyright (c) 2017 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/examples/unityplugin/unity_plugin_apis.h"
-
-#include <map>
-#include <string>
-
-#include "webrtc/examples/unityplugin/simple_peer_connection.h"
-
-namespace {
-static int g_peer_connection_id = 1;
-static std::map<int, rtc::scoped_refptr<SimplePeerConnection>>
-    g_peer_connection_map;
-}  // namespace
-
-int CreatePeerConnection(const char** turn_urls,
-                         const int no_of_urls,
-                         const char* username,
-                         const char* credential) {
-  g_peer_connection_map[g_peer_connection_id] =
-      new rtc::RefCountedObject<SimplePeerConnection>();
-
-  if (!g_peer_connection_map[g_peer_connection_id]->InitializePeerConnection(
-          turn_urls, no_of_urls, username, credential, false))
-    return -1;
-
-  return g_peer_connection_id++;
-}
-
-bool ClosePeerConnection(int peer_connection_id) {
-  if (!g_peer_connection_map.count(peer_connection_id))
-    return false;
-
-  g_peer_connection_map[peer_connection_id]->DeletePeerConnection();
-  g_peer_connection_map.erase(peer_connection_id);
-  return true;
-}
-
-bool AddStream(int peer_connection_id, bool audio_only) {
-  if (!g_peer_connection_map.count(peer_connection_id))
-    return false;
-
-  g_peer_connection_map[peer_connection_id]->AddStreams(audio_only);
-  return true;
-}
-
-bool AddDataChannel(int peer_connection_id) {
-  if (!g_peer_connection_map.count(peer_connection_id))
-    return false;
-
-  return g_peer_connection_map[peer_connection_id]->CreateDataChannel();
-}
-
-bool CreateOffer(int peer_connection_id) {
-  if (!g_peer_connection_map.count(peer_connection_id))
-    return false;
-
-  return g_peer_connection_map[peer_connection_id]->CreateOffer();
-}
-
-bool CreateAnswer(int peer_connection_id) {
-  if (!g_peer_connection_map.count(peer_connection_id))
-    return false;
-
-  return g_peer_connection_map[peer_connection_id]->CreateAnswer();
-}
-
-bool SendDataViaDataChannel(int peer_connection_id, const char* data) {
-  if (!g_peer_connection_map.count(peer_connection_id))
-    return false;
-
-  std::string s(data);
-  g_peer_connection_map[peer_connection_id]->SendDataViaDataChannel(s);
-
-  return true;
-}
-
-bool SetAudioControl(int peer_connection_id, bool is_mute, bool is_record) {
-  if (!g_peer_connection_map.count(peer_connection_id))
-    return false;
-
-  g_peer_connection_map[peer_connection_id]->SetAudioControl(is_mute,
-                                                             is_record);
-  return true;
-}
-
-bool SetRemoteDescription(int peer_connection_id,
-                          const char* type,
-                          const char* sdp) {
-  if (!g_peer_connection_map.count(peer_connection_id))
-    return false;
-
-  return g_peer_connection_map[peer_connection_id]->SetRemoteDescription(type,
-                                                                         sdp);
-}
-
-bool AddIceCandidate(const int peer_connection_id,
-                     const char* candidate,
-                     const int sdp_mlineindex,
-                     const char* sdp_mid) {
-  if (!g_peer_connection_map.count(peer_connection_id))
-    return false;
-
-  return g_peer_connection_map[peer_connection_id]->AddIceCandidate(
-      candidate, sdp_mlineindex, sdp_mid);
-}
-
-// Register callback functions.
-bool RegisterOnLocalI420FrameReady(int peer_connection_id,
-                                   I420FRAMEREADY_CALLBACK callback) {
-  if (!g_peer_connection_map.count(peer_connection_id))
-    return false;
-
-  g_peer_connection_map[peer_connection_id]->RegisterOnLocalI420FrameReady(
-      callback);
-  return true;
-}
-
-bool RegisterOnRemoteI420FrameReady(int peer_connection_id,
-                                    I420FRAMEREADY_CALLBACK callback) {
-  if (!g_peer_connection_map.count(peer_connection_id))
-    return false;
-
-  g_peer_connection_map[peer_connection_id]->RegisterOnRemoteI420FrameReady(
-      callback);
-  return true;
-}
-
-bool RegisterOnLocalDataChannelReady(int peer_connection_id,
-                                     LOCALDATACHANNELREADY_CALLBACK callback) {
-  if (!g_peer_connection_map.count(peer_connection_id))
-    return false;
-
-  g_peer_connection_map[peer_connection_id]->RegisterOnLocalDataChannelReady(
-      callback);
-  return true;
-}
-
-bool RegisterOnDataFromDataChannelReady(
-    int peer_connection_id,
-    DATAFROMEDATECHANNELREADY_CALLBACK callback) {
-  if (!g_peer_connection_map.count(peer_connection_id))
-    return false;
-
-  g_peer_connection_map[peer_connection_id]->RegisterOnDataFromDataChannelReady(
-      callback);
-  return true;
-}
-
-bool RegisterOnFailure(int peer_connection_id, FAILURE_CALLBACK callback) {
-  if (!g_peer_connection_map.count(peer_connection_id))
-    return false;
-
-  g_peer_connection_map[peer_connection_id]->RegisterOnFailure(callback);
-  return true;
-}
-
-bool RegisterOnAudioBusReady(int peer_connection_id,
-                             AUDIOBUSREADY_CALLBACK callback) {
-  if (!g_peer_connection_map.count(peer_connection_id))
-    return false;
-
-  g_peer_connection_map[peer_connection_id]->RegisterOnAudioBusReady(callback);
-  return true;
-}
-
-// Singnaling channel related functions.
-bool RegisterOnLocalSdpReadytoSend(int peer_connection_id,
-                                   LOCALSDPREADYTOSEND_CALLBACK callback) {
-  if (!g_peer_connection_map.count(peer_connection_id))
-    return false;
-
-  g_peer_connection_map[peer_connection_id]->RegisterOnLocalSdpReadytoSend(
-      callback);
-  return true;
-}
-
-bool RegisterOnIceCandiateReadytoSend(
-    int peer_connection_id,
-    ICECANDIDATEREADYTOSEND_CALLBACK callback) {
-  if (!g_peer_connection_map.count(peer_connection_id))
-    return false;
-
-  g_peer_connection_map[peer_connection_id]->RegisterOnIceCandiateReadytoSend(
-      callback);
-  return true;
-}
diff --git a/examples/unityplugin/unity_plugin_apis.h b/examples/unityplugin/unity_plugin_apis.h
deleted file mode 100644
index 529c7d2..0000000
--- a/examples/unityplugin/unity_plugin_apis.h
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- *  Copyright (c) 2017 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.
- */
-
-// This file provides an example of unity native plugin APIs.
-
-#ifndef WEBRTC_EXAMPLES_UNITYPLUGIN_UNITY_PLUGIN_APIS_H_
-#define WEBRTC_EXAMPLES_UNITYPLUGIN_UNITY_PLUGIN_APIS_H_
-
-#include <stdint.h>
-
-// Definitions of callback functions.
-typedef void (*I420FRAMEREADY_CALLBACK)(const uint8_t* data_y,
-                                        const uint8_t* data_u,
-                                        const uint8_t* data_v,
-                                        int stride_y,
-                                        int stride_u,
-                                        int stride_v,
-                                        uint32_t width,
-                                        uint32_t height);
-typedef void (*LOCALDATACHANNELREADY_CALLBACK)();
-typedef void (*DATAFROMEDATECHANNELREADY_CALLBACK)(const char* msg);
-typedef void (*FAILURE_CALLBACK)(const char* msg);
-typedef void (*LOCALSDPREADYTOSEND_CALLBACK)(const char* type, const char* sdp);
-typedef void (*ICECANDIDATEREADYTOSEND_CALLBACK)(const char* candidate,
-                                                 const int sdp_mline_index,
-                                                 const char* sdp_mid);
-typedef void (*AUDIOBUSREADY_CALLBACK)(const void* audio_data,
-                                       int bits_per_sample,
-                                       int sample_rate,
-                                       int number_of_channels,
-                                       int number_of_frames);
-
-#if defined(WEBRTC_WIN)
-#define WEBRTC_PLUGIN_API __declspec(dllexport)
-#elif defined(WEBRTC_ANDROID)
-#define WEBRTC_PLUGIN_API __attribute__((visibility("default")))
-#endif
-extern "C" {
-// Create a peerconnection and return a unique peer connection id.
-WEBRTC_PLUGIN_API int CreatePeerConnection(const char** turn_urls,
-                                           const int no_of_urls,
-                                           const char* username,
-                                           const char* credential);
-// Close a peerconnection.
-WEBRTC_PLUGIN_API bool ClosePeerConnection(int peer_connection_id);
-// Add a audio stream. If audio_only is true, the stream only has an audio
-// track and no video track.
-WEBRTC_PLUGIN_API bool AddStream(int peer_connection_id, bool audio_only);
-// Add a data channel to peer connection.
-WEBRTC_PLUGIN_API bool AddDataChannel(int peer_connection_id);
-// Create a peer connection offer.
-WEBRTC_PLUGIN_API bool CreateOffer(int peer_connection_id);
-// Create a peer connection answer.
-WEBRTC_PLUGIN_API bool CreateAnswer(int peer_connection_id);
-// Send data through data channel.
-WEBRTC_PLUGIN_API bool SendDataViaDataChannel(int peer_connection_id,
-                                              const char* data);
-// Set audio control. If is_mute=true, no audio will playout. If is_record=true,
-// AUDIOBUSREADY_CALLBACK will be called every 10 ms.
-WEBRTC_PLUGIN_API bool SetAudioControl(int peer_connection_id,
-                                       bool is_mute,
-                                       bool is_record);
-// Set remote sdp.
-WEBRTC_PLUGIN_API bool SetRemoteDescription(int peer_connection_id,
-                                            const char* type,
-                                            const char* sdp);
-// Add ice candidate.
-WEBRTC_PLUGIN_API bool AddIceCandidate(const int peer_connection_id,
-                                       const char* candidate,
-                                       const int sdp_mlineindex,
-                                       const char* sdp_mid);
-
-// Register callback functions.
-WEBRTC_PLUGIN_API bool RegisterOnLocalI420FrameReady(
-    int peer_connection_id,
-    I420FRAMEREADY_CALLBACK callback);
-WEBRTC_PLUGIN_API bool RegisterOnRemoteI420FrameReady(
-    int peer_connection_id,
-    I420FRAMEREADY_CALLBACK callback);
-WEBRTC_PLUGIN_API bool RegisterOnLocalDataChannelReady(
-    int peer_connection_id,
-    LOCALDATACHANNELREADY_CALLBACK callback);
-WEBRTC_PLUGIN_API bool RegisterOnDataFromDataChannelReady(
-    int peer_connection_id,
-    DATAFROMEDATECHANNELREADY_CALLBACK callback);
-WEBRTC_PLUGIN_API bool RegisterOnFailure(int peer_connection_id,
-                                         FAILURE_CALLBACK callback);
-WEBRTC_PLUGIN_API bool RegisterOnAudioBusReady(int peer_connection_id,
-                                               AUDIOBUSREADY_CALLBACK callback);
-WEBRTC_PLUGIN_API bool RegisterOnLocalSdpReadytoSend(
-    int peer_connection_id,
-    LOCALSDPREADYTOSEND_CALLBACK callback);
-WEBRTC_PLUGIN_API bool RegisterOnIceCandiateReadytoSend(
-    int peer_connection_id,
-    ICECANDIDATEREADYTOSEND_CALLBACK callback);
-}
-
-#endif  // WEBRTC_EXAMPLES_UNITYPLUGIN_UNITY_PLUGIN_APIS_H_
diff --git a/examples/unityplugin/video_observer.cc b/examples/unityplugin/video_observer.cc
deleted file mode 100644
index 4f3bd56..0000000
--- a/examples/unityplugin/video_observer.cc
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- *  Copyright (c) 2017 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/examples/unityplugin/video_observer.h"
-
-void VideoObserver::SetVideoCallback(I420FRAMEREADY_CALLBACK callback) {
-  std::lock_guard<std::mutex> lock(mutex);
-  OnI420FrameReady = callback;
-}
-
-void VideoObserver::OnFrame(const webrtc::VideoFrame& frame) {
-  std::unique_lock<std::mutex> lock(mutex);
-  rtc::scoped_refptr<webrtc::PlanarYuvBuffer> buffer(
-      frame.video_frame_buffer()->ToI420());
-  if (OnI420FrameReady) {
-    OnI420FrameReady(buffer->DataY(), buffer->DataU(), buffer->DataV(),
-                     buffer->StrideY(), buffer->StrideU(), buffer->StrideV(),
-                     frame.width(), frame.height());
-  }
-}
diff --git a/examples/unityplugin/video_observer.h b/examples/unityplugin/video_observer.h
deleted file mode 100644
index 9c3c7c6..0000000
--- a/examples/unityplugin/video_observer.h
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- *  Copyright (c) 2017 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_EXAMPLES_UNITYPLUGIN_VIDEO_OBSERVER_H_
-#define WEBRTC_EXAMPLES_UNITYPLUGIN_VIDEO_OBSERVER_H_
-
-#include <mutex>
-
-#include "webrtc/api/mediastreaminterface.h"
-#include "webrtc/examples/unityplugin/unity_plugin_apis.h"
-#include "webrtc/media/base/videosinkinterface.h"
-
-class VideoObserver : public rtc::VideoSinkInterface<webrtc::VideoFrame> {
- public:
-  VideoObserver() {}
-  ~VideoObserver() {}
-  void SetVideoCallback(I420FRAMEREADY_CALLBACK callback);
-
- protected:
-  // VideoSinkInterface implementation
-  void OnFrame(const webrtc::VideoFrame& frame) override;
-
- private:
-  I420FRAMEREADY_CALLBACK OnI420FrameReady = nullptr;
-  std::mutex mutex;
-};
-
-#endif  // WEBRTC_EXAMPLES_UNITYPLUGIN_VIDEO_OBSERVER_H_
diff --git a/logging/BUILD.gn b/logging/BUILD.gn
deleted file mode 100644
index 18d6084..0000000
--- a/logging/BUILD.gn
+++ /dev/null
@@ -1,196 +0,0 @@
-# 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.
-
-import("../webrtc.gni")
-import("//third_party/protobuf/proto_library.gni")
-if (is_android) {
-  import("//build/config/android/config.gni")
-  import("//build/config/android/rules.gni")
-}
-
-group("logging") {
-  public_deps = [
-    ":rtc_event_log_impl",
-  ]
-  if (rtc_enable_protobuf) {
-    public_deps += [ ":rtc_event_log_parser" ]
-  }
-}
-
-rtc_source_set("rtc_event_log_api") {
-  sources = [
-    "rtc_event_log/rtc_event_log.h",
-    "rtc_event_log/rtc_event_log_factory_interface.h",
-    "rtc_event_log/rtc_stream_config.cc",
-    "rtc_event_log/rtc_stream_config.h",
-  ]
-  deps = [
-    "..:webrtc_common",
-    "../api:libjingle_peerconnection_api",
-    "../call:video_stream_api",
-    "../rtc_base:rtc_base_approved",
-  ]
-}
-
-rtc_static_library("rtc_event_log_impl") {
-  sources = [
-    "rtc_event_log/rtc_event_log.cc",
-    "rtc_event_log/rtc_event_log_factory.cc",
-    "rtc_event_log/rtc_event_log_factory.h",
-  ]
-
-  defines = []
-
-  deps = [
-    ":rtc_event_log_api",
-    "..:webrtc_common",
-    "../modules/audio_coding:audio_network_adaptor",
-    "../modules/remote_bitrate_estimator:remote_bitrate_estimator",
-    "../modules/rtp_rtcp",
-    "../rtc_base:protobuf_utils",
-    "../rtc_base:rtc_base_approved",
-    "../rtc_base:rtc_task_queue",
-    "../rtc_base:sequenced_task_checker",
-    "../system_wrappers",
-  ]
-
-  if (rtc_enable_protobuf) {
-    defines += [ "ENABLE_RTC_EVENT_LOG" ]
-    deps += [ ":rtc_event_log_proto" ]
-  }
-  if (!build_with_chromium && is_clang) {
-    # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-    suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-  }
-}
-
-if (rtc_enable_protobuf) {
-  proto_library("rtc_event_log_proto") {
-    sources = [
-      "rtc_event_log/rtc_event_log.proto",
-    ]
-    proto_out_dir = "webrtc/logging/rtc_event_log"
-  }
-
-  rtc_static_library("rtc_event_log_parser") {
-    sources = [
-      "rtc_event_log/rtc_event_log_parser.cc",
-      "rtc_event_log/rtc_event_log_parser.h",
-    ]
-
-    public_deps = [
-      ":rtc_event_log_api",
-      ":rtc_event_log_proto",
-      "..:webrtc_common",
-      "../modules/audio_coding:audio_network_adaptor",
-      "../modules/remote_bitrate_estimator:remote_bitrate_estimator",
-      "../modules/rtp_rtcp:rtp_rtcp",
-      "../system_wrappers",
-    ]
-
-    if (!build_with_chromium && is_clang) {
-      # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-    }
-    deps = [
-      "../call:video_stream_api",
-      "../rtc_base:protobuf_utils",
-      "../rtc_base:rtc_base_approved",
-    ]
-  }
-
-  if (rtc_include_tests) {
-    rtc_source_set("rtc_event_log_tests") {
-      testonly = true
-      sources = [
-        "rtc_event_log/rtc_event_log_unittest.cc",
-        "rtc_event_log/rtc_event_log_unittest_helper.cc",
-        "rtc_event_log/rtc_event_log_unittest_helper.h",
-      ]
-      deps = [
-        ":rtc_event_log_impl",
-        ":rtc_event_log_parser",
-        "../call",
-        "../modules/audio_coding:audio_network_adaptor",
-        "../modules/remote_bitrate_estimator:remote_bitrate_estimator",
-        "../modules/rtp_rtcp",
-        "../rtc_base:rtc_base_approved",
-        "../rtc_base:rtc_base_tests_utils",
-        "../system_wrappers:metrics_default",
-        "../test:test_support",
-        "//testing/gmock",
-        "//testing/gtest",
-      ]
-      if (!build_with_chromium && is_clang) {
-        # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-        suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-      }
-    }
-    rtc_test("rtc_event_log2rtp_dump") {
-      testonly = true
-      sources = [
-        "rtc_event_log/rtc_event_log2rtp_dump.cc",
-      ]
-      deps = [
-        ":rtc_event_log_api",
-        ":rtc_event_log_impl",
-        ":rtc_event_log_parser",
-        "../modules/rtp_rtcp:rtp_rtcp",
-        "../rtc_base:rtc_base_approved",
-        "../system_wrappers:field_trial_default",
-        "../system_wrappers:metrics_default",
-        "../test:rtp_test_utils",
-      ]
-      if (!build_with_chromium && is_clang) {
-        # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-        suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-      }
-    }
-  }
-  if (rtc_include_tests) {
-    rtc_executable("rtc_event_log2text") {
-      testonly = true
-      sources = [
-        "rtc_event_log/rtc_event_log2text.cc",
-      ]
-      deps = [
-        ":rtc_event_log_api",
-        ":rtc_event_log_impl",
-        ":rtc_event_log_parser",
-        "../call:video_stream_api",
-        "../rtc_base:rtc_base_approved",
-
-        # TODO(kwiberg): Remove this dependency.
-        "../api/audio_codecs:audio_codecs_api",
-        "../modules/rtp_rtcp:rtp_rtcp",
-      ]
-      if (!build_with_chromium && is_clang) {
-        # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-        suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-      }
-    }
-  }
-  if (rtc_include_tests) {
-    rtc_executable("rtc_event_log2stats") {
-      testonly = true
-      sources = [
-        "rtc_event_log/rtc_event_log2stats.cc",
-      ]
-      deps = [
-        ":rtc_event_log_api",
-        ":rtc_event_log_impl",
-        ":rtc_event_log_proto",
-        "../rtc_base:rtc_base_approved",
-      ]
-      if (!build_with_chromium && is_clang) {
-        # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-        suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-      }
-    }
-  }
-}
diff --git a/logging/OWNERS b/logging/OWNERS
deleted file mode 100644
index 492fb7a..0000000
--- a/logging/OWNERS
+++ /dev/null
@@ -1,3 +0,0 @@
-skvlad@webrtc.org
-stefan@webrtc.org
-terelius@webrtc.org
diff --git a/logging/rtc_event_log/DEPS b/logging/rtc_event_log/DEPS
deleted file mode 100644
index f0ae6d1..0000000
--- a/logging/rtc_event_log/DEPS
+++ /dev/null
@@ -1,7 +0,0 @@
-include_rules = [
-  "+webrtc/call",
-  "+webrtc/modules/audio_coding/audio_network_adaptor",
-  "+webrtc/modules/remote_bitrate_estimator/include",
-  "+webrtc/modules/rtp_rtcp",
-  "+webrtc/system_wrappers",
-]
diff --git a/logging/rtc_event_log/mock/mock_rtc_event_log.h b/logging/rtc_event_log/mock/mock_rtc_event_log.h
deleted file mode 100644
index cb31d8f..0000000
--- a/logging/rtc_event_log/mock/mock_rtc_event_log.h
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- *  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_LOGGING_RTC_EVENT_LOG_MOCK_MOCK_RTC_EVENT_LOG_H_
-#define WEBRTC_LOGGING_RTC_EVENT_LOG_MOCK_MOCK_RTC_EVENT_LOG_H_
-
-#include <string>
-
-#include "webrtc/logging/rtc_event_log/rtc_event_log.h"
-#include "webrtc/modules/audio_coding/audio_network_adaptor/include/audio_network_adaptor.h"
-#include "webrtc/test/gmock.h"
-
-namespace webrtc {
-
-class MockRtcEventLog : public RtcEventLog {
- public:
-  MOCK_METHOD2(StartLogging,
-               bool(const std::string& file_name, int64_t max_size_bytes));
-
-  MOCK_METHOD2(StartLogging,
-               bool(rtc::PlatformFile log_file, int64_t max_size_bytes));
-
-  MOCK_METHOD0(StopLogging, void());
-
-  MOCK_METHOD1(LogVideoReceiveStreamConfig,
-               void(const rtclog::StreamConfig& config));
-
-  MOCK_METHOD1(LogVideoSendStreamConfig,
-               void(const rtclog::StreamConfig& config));
-
-  MOCK_METHOD1(LogAudioReceiveStreamConfig,
-               void(const rtclog::StreamConfig& config));
-
-  MOCK_METHOD1(LogAudioSendStreamConfig,
-               void(const rtclog::StreamConfig& config));
-
-  MOCK_METHOD3(LogRtpHeader,
-               void(PacketDirection direction,
-                    const uint8_t* header,
-                    size_t packet_length));
-
-  MOCK_METHOD4(LogRtpHeader,
-               void(PacketDirection direction,
-                    const uint8_t* header,
-                    size_t packet_length,
-                    int probe_cluster_id));
-
-  MOCK_METHOD3(LogRtcpPacket,
-               void(PacketDirection direction,
-                    const uint8_t* packet,
-                    size_t length));
-
-  MOCK_METHOD1(LogAudioPlayout, void(uint32_t ssrc));
-
-  MOCK_METHOD3(LogLossBasedBweUpdate,
-               void(int32_t bitrate_bps,
-                    uint8_t fraction_loss,
-                    int32_t total_packets));
-
-  MOCK_METHOD2(LogDelayBasedBweUpdate,
-               void(int32_t bitrate_bps, BandwidthUsage detector_state));
-
-  MOCK_METHOD1(LogAudioNetworkAdaptation,
-               void(const AudioEncoderRuntimeConfig& config));
-
-  MOCK_METHOD4(LogProbeClusterCreated,
-               void(int id, int bitrate_bps, int min_probes, int min_bytes));
-
-  MOCK_METHOD2(LogProbeResultSuccess, void(int id, int bitrate_bps));
-  MOCK_METHOD2(LogProbeResultFailure,
-               void(int id, ProbeFailureReason failure_reason));
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_LOGGING_RTC_EVENT_LOG_MOCK_MOCK_RTC_EVENT_LOG_H_
diff --git a/logging/rtc_event_log/rtc_event_log.cc b/logging/rtc_event_log/rtc_event_log.cc
deleted file mode 100644
index 7c295aa..0000000
--- a/logging/rtc_event_log/rtc_event_log.cc
+++ /dev/null
@@ -1,849 +0,0 @@
-/*
- *  Copyright (c) 2015 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/logging/rtc_event_log/rtc_event_log.h"
-
-#include <atomic>
-#include <deque>
-#include <functional>
-#include <limits>
-#include <memory>
-#include <utility>
-#include <vector>
-
-#include "webrtc/modules/audio_coding/audio_network_adaptor/include/audio_network_adaptor.h"
-#include "webrtc/modules/remote_bitrate_estimator/include/bwe_defines.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
-#include "webrtc/modules/rtp_rtcp/source/byte_io.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/app.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/bye.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/common_header.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/extended_jitter_report.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/extended_reports.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/psfb.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/receiver_report.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/rtpfb.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/sdes.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/sender_report.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/event.h"
-#include "webrtc/rtc_base/ignore_wundef.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/protobuf_utils.h"
-#include "webrtc/rtc_base/ptr_util.h"
-#include "webrtc/rtc_base/sequenced_task_checker.h"
-#include "webrtc/rtc_base/task_queue.h"
-#include "webrtc/rtc_base/thread_annotations.h"
-#include "webrtc/rtc_base/timeutils.h"
-#include "webrtc/system_wrappers/include/file_wrapper.h"
-#include "webrtc/typedefs.h"
-
-#ifdef ENABLE_RTC_EVENT_LOG
-// *.pb.h files are generated at build-time by the protobuf compiler.
-RTC_PUSH_IGNORING_WUNDEF()
-#ifdef WEBRTC_ANDROID_PLATFORM_BUILD
-#include "external/webrtc/webrtc/logging/rtc_event_log/rtc_event_log.pb.h"
-#else
-#include "webrtc/logging/rtc_event_log/rtc_event_log.pb.h"
-#endif
-RTC_POP_IGNORING_WUNDEF()
-#endif
-
-namespace webrtc {
-
-#ifdef ENABLE_RTC_EVENT_LOG
-
-namespace {
-const int kEventsInHistory = 10000;
-
-bool IsConfigEvent(const rtclog::Event& event) {
-  rtclog::Event_EventType event_type = event.type();
-  return event_type == rtclog::Event::VIDEO_RECEIVER_CONFIG_EVENT ||
-         event_type == rtclog::Event::VIDEO_SENDER_CONFIG_EVENT ||
-         event_type == rtclog::Event::AUDIO_RECEIVER_CONFIG_EVENT ||
-         event_type == rtclog::Event::AUDIO_SENDER_CONFIG_EVENT;
-}
-
-// TODO(eladalon): This class exists because C++11 doesn't allow transferring a
-// unique_ptr to a lambda (a copy constructor is required). We should get
-// rid of this when we move to C++14.
-template <typename T>
-class ResourceOwningTask final : public rtc::QueuedTask {
- public:
-  ResourceOwningTask(std::unique_ptr<T> resource,
-                     std::function<void(std::unique_ptr<T>)> handler)
-      : resource_(std::move(resource)), handler_(handler) {}
-
-  bool Run() override {
-    handler_(std::move(resource_));
-    return true;
-  }
-
- private:
-  std::unique_ptr<T> resource_;
-  std::function<void(std::unique_ptr<T>)> handler_;
-};
-}  // namespace
-
-class RtcEventLogImpl final : public RtcEventLog {
-  friend std::unique_ptr<RtcEventLog> RtcEventLog::Create();
-
- public:
-  ~RtcEventLogImpl() override;
-
-  bool StartLogging(const std::string& file_name,
-                    int64_t max_size_bytes) override;
-  bool StartLogging(rtc::PlatformFile platform_file,
-                    int64_t max_size_bytes) override;
-  void StopLogging() override;
-  void LogVideoReceiveStreamConfig(const rtclog::StreamConfig& config) override;
-  void LogVideoSendStreamConfig(const rtclog::StreamConfig& config) override;
-  void LogAudioReceiveStreamConfig(const rtclog::StreamConfig& config) override;
-  void LogAudioSendStreamConfig(const rtclog::StreamConfig& config) override;
-  void LogRtpHeader(PacketDirection direction,
-                    const uint8_t* header,
-                    size_t packet_length) override;
-  void LogRtpHeader(PacketDirection direction,
-                    const uint8_t* header,
-                    size_t packet_length,
-                    int probe_cluster_id) override;
-  void LogRtcpPacket(PacketDirection direction,
-                     const uint8_t* packet,
-                     size_t length) override;
-  void LogAudioPlayout(uint32_t ssrc) override;
-  void LogLossBasedBweUpdate(int32_t bitrate_bps,
-                             uint8_t fraction_loss,
-                             int32_t total_packets) override;
-  void LogDelayBasedBweUpdate(int32_t bitrate_bps,
-                              BandwidthUsage detector_state) override;
-  void LogAudioNetworkAdaptation(
-      const AudioEncoderRuntimeConfig& config) override;
-  void LogProbeClusterCreated(int id,
-                              int bitrate_bps,
-                              int min_probes,
-                              int min_bytes) override;
-  void LogProbeResultSuccess(int id, int bitrate_bps) override;
-  void LogProbeResultFailure(int id,
-                             ProbeFailureReason failure_reason) override;
-
- private:
-  void StartLoggingInternal(std::unique_ptr<FileWrapper> file,
-                            int64_t max_size_bytes);
-
-  RtcEventLogImpl();  // Creation is done by RtcEventLog::Create.
-
-  void StoreEvent(std::unique_ptr<rtclog::Event> event);
-  void LogProbeResult(int id,
-                      rtclog::BweProbeResult::ResultType result,
-                      int bitrate_bps);
-
-  // Appends an event to the output protobuf string, returning true on success.
-  // Fails and returns false in case the limit on output size prevents the
-  // event from being added; in this case, the output string is left unchanged.
-  bool AppendEventToString(rtclog::Event* event,
-                           ProtoString* output_string) RTC_WARN_UNUSED_RESULT;
-
-  void LogToMemory(std::unique_ptr<rtclog::Event> event);
-
-  void StartLogFile();
-  void LogToFile(std::unique_ptr<rtclog::Event> event);
-  void StopLogFile(int64_t stop_time);
-
-  // Observe a limit on the number of concurrent logs, so as not to run into
-  // OS-imposed limits on open files and/or threads/task-queues.
-  // TODO(eladalon): Known issue - there's a race over |log_count_|.
-  static std::atomic<int> log_count_;
-
-  // Make sure that the event log is "managed" - created/destroyed, as well
-  // as started/stopped - from the same thread/task-queue.
-  rtc::SequencedTaskChecker owner_sequence_checker_;
-
-  // History containing all past configuration events.
-  std::vector<std::unique_ptr<rtclog::Event>> config_history_
-      RTC_ACCESS_ON(task_queue_);
-
-  // History containing the most recent (non-configuration) events (~10s).
-  std::deque<std::unique_ptr<rtclog::Event>> history_
-      RTC_ACCESS_ON(task_queue_);
-
-  std::unique_ptr<FileWrapper> file_ RTC_ACCESS_ON(task_queue_);
-
-  size_t max_size_bytes_ RTC_ACCESS_ON(task_queue_);
-  size_t written_bytes_ RTC_ACCESS_ON(task_queue_);
-
-  // Keep this last to ensure it destructs first, or else tasks living on the
-  // queue might access other members after they've been torn down.
-  rtc::TaskQueue task_queue_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(RtcEventLogImpl);
-};
-
-namespace {
-// The functions in this namespace convert enums from the runtime format
-// that the rest of the WebRtc project can use, to the corresponding
-// serialized enum which is defined by the protobuf.
-
-rtclog::VideoReceiveConfig_RtcpMode ConvertRtcpMode(RtcpMode rtcp_mode) {
-  switch (rtcp_mode) {
-    case RtcpMode::kCompound:
-      return rtclog::VideoReceiveConfig::RTCP_COMPOUND;
-    case RtcpMode::kReducedSize:
-      return rtclog::VideoReceiveConfig::RTCP_REDUCEDSIZE;
-    case RtcpMode::kOff:
-      RTC_NOTREACHED();
-      return rtclog::VideoReceiveConfig::RTCP_COMPOUND;
-  }
-  RTC_NOTREACHED();
-  return rtclog::VideoReceiveConfig::RTCP_COMPOUND;
-}
-
-rtclog::DelayBasedBweUpdate::DetectorState ConvertDetectorState(
-    BandwidthUsage state) {
-  switch (state) {
-    case BandwidthUsage::kBwNormal:
-      return rtclog::DelayBasedBweUpdate::BWE_NORMAL;
-    case BandwidthUsage::kBwUnderusing:
-      return rtclog::DelayBasedBweUpdate::BWE_UNDERUSING;
-    case BandwidthUsage::kBwOverusing:
-      return rtclog::DelayBasedBweUpdate::BWE_OVERUSING;
-  }
-  RTC_NOTREACHED();
-  return rtclog::DelayBasedBweUpdate::BWE_NORMAL;
-}
-
-rtclog::BweProbeResult::ResultType ConvertProbeResultType(
-    ProbeFailureReason failure_reason) {
-  switch (failure_reason) {
-    case kInvalidSendReceiveInterval:
-      return rtclog::BweProbeResult::INVALID_SEND_RECEIVE_INTERVAL;
-    case kInvalidSendReceiveRatio:
-      return rtclog::BweProbeResult::INVALID_SEND_RECEIVE_RATIO;
-    case kTimeout:
-      return rtclog::BweProbeResult::TIMEOUT;
-  }
-  RTC_NOTREACHED();
-  return rtclog::BweProbeResult::SUCCESS;
-}
-
-}  // namespace
-
-std::atomic<int> RtcEventLogImpl::log_count_(0);
-
-RtcEventLogImpl::RtcEventLogImpl()
-    : file_(FileWrapper::Create()),
-      max_size_bytes_(std::numeric_limits<decltype(max_size_bytes_)>::max()),
-      written_bytes_(0),
-      task_queue_("rtc_event_log") {}
-
-RtcEventLogImpl::~RtcEventLogImpl() {
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&owner_sequence_checker_);
-
-  // If we're logging to the file, this will stop that. Blocking function.
-  StopLogging();
-
-  int count = std::atomic_fetch_sub(&RtcEventLogImpl::log_count_, 1) - 1;
-  RTC_DCHECK_GE(count, 0);
-}
-
-bool RtcEventLogImpl::StartLogging(const std::string& file_name,
-                                   int64_t max_size_bytes) {
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&owner_sequence_checker_);
-
-  auto file = rtc::WrapUnique<FileWrapper>(FileWrapper::Create());
-  if (!file->OpenFile(file_name.c_str(), false)) {
-    LOG(LS_ERROR) << "Can't open file. WebRTC event log not started.";
-    return false;
-  }
-
-  StartLoggingInternal(std::move(file), max_size_bytes);
-
-  return true;
-}
-
-bool RtcEventLogImpl::StartLogging(rtc::PlatformFile platform_file,
-                                   int64_t max_size_bytes) {
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&owner_sequence_checker_);
-
-  auto file = rtc::WrapUnique<FileWrapper>(FileWrapper::Create());
-  FILE* file_handle = rtc::FdopenPlatformFileForWriting(platform_file);
-  if (!file_handle) {
-    LOG(LS_ERROR) << "Can't open file. WebRTC event log not started.";
-    // Even though we failed to open a FILE*, the platform_file is still open
-    // and needs to be closed.
-    if (!rtc::ClosePlatformFile(platform_file)) {
-      LOG(LS_ERROR) << "Can't close file.";
-    }
-    return false;
-  }
-  if (!file->OpenFromFileHandle(file_handle)) {
-    LOG(LS_ERROR) << "Can't open file. WebRTC event log not started.";
-    return false;
-  }
-
-  StartLoggingInternal(std::move(file), max_size_bytes);
-
-  return true;
-}
-
-void RtcEventLogImpl::StopLogging() {
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&owner_sequence_checker_);
-
-  LOG(LS_INFO) << "Stopping WebRTC event log.";
-
-  const int64_t stop_time = rtc::TimeMicros();
-
-  rtc::Event file_finished(true, false);
-
-  task_queue_.PostTask([this, stop_time, &file_finished]() {
-    RTC_DCHECK_RUN_ON(&task_queue_);
-    if (file_->is_open()) {
-      StopLogFile(stop_time);
-    }
-    file_finished.Set();
-  });
-
-  file_finished.Wait(rtc::Event::kForever);
-
-  LOG(LS_INFO) << "WebRTC event log successfully stopped.";
-}
-
-void RtcEventLogImpl::LogVideoReceiveStreamConfig(
-    const rtclog::StreamConfig& config) {
-  std::unique_ptr<rtclog::Event> event(new rtclog::Event());
-  event->set_timestamp_us(rtc::TimeMicros());
-  event->set_type(rtclog::Event::VIDEO_RECEIVER_CONFIG_EVENT);
-
-  rtclog::VideoReceiveConfig* receiver_config =
-      event->mutable_video_receiver_config();
-  receiver_config->set_remote_ssrc(config.remote_ssrc);
-  receiver_config->set_local_ssrc(config.local_ssrc);
-
-  // TODO(perkj): Add field for rsid.
-  receiver_config->set_rtcp_mode(ConvertRtcpMode(config.rtcp_mode));
-  receiver_config->set_remb(config.remb);
-
-  for (const auto& e : config.rtp_extensions) {
-    rtclog::RtpHeaderExtension* extension =
-        receiver_config->add_header_extensions();
-    extension->set_name(e.uri);
-    extension->set_id(e.id);
-  }
-
-  for (const auto& d : config.codecs) {
-    rtclog::DecoderConfig* decoder = receiver_config->add_decoders();
-    decoder->set_name(d.payload_name);
-    decoder->set_payload_type(d.payload_type);
-    if (d.rtx_payload_type != 0) {
-      rtclog::RtxMap* rtx = receiver_config->add_rtx_map();
-      rtx->set_payload_type(d.payload_type);
-      rtx->mutable_config()->set_rtx_ssrc(config.rtx_ssrc);
-      rtx->mutable_config()->set_rtx_payload_type(d.rtx_payload_type);
-    }
-  }
-  StoreEvent(std::move(event));
-}
-
-void RtcEventLogImpl::LogVideoSendStreamConfig(
-    const rtclog::StreamConfig& config) {
-  std::unique_ptr<rtclog::Event> event(new rtclog::Event());
-  event->set_timestamp_us(rtc::TimeMicros());
-  event->set_type(rtclog::Event::VIDEO_SENDER_CONFIG_EVENT);
-
-  rtclog::VideoSendConfig* sender_config = event->mutable_video_sender_config();
-
-  // TODO(perkj): rtclog::VideoSendConfig should only contain one SSRC.
-  sender_config->add_ssrcs(config.local_ssrc);
-  if (config.rtx_ssrc != 0) {
-    sender_config->add_rtx_ssrcs(config.rtx_ssrc);
-  }
-
-  for (const auto& e : config.rtp_extensions) {
-    rtclog::RtpHeaderExtension* extension =
-        sender_config->add_header_extensions();
-    extension->set_name(e.uri);
-    extension->set_id(e.id);
-  }
-
-  // TODO(perkj): rtclog::VideoSendConfig should contain many possible codec
-  // configurations.
-  for (const auto& codec : config.codecs) {
-    sender_config->set_rtx_payload_type(codec.rtx_payload_type);
-    rtclog::EncoderConfig* encoder = sender_config->mutable_encoder();
-    encoder->set_name(codec.payload_name);
-    encoder->set_payload_type(codec.payload_type);
-
-    if (config.codecs.size() > 1) {
-      LOG(WARNING) << "LogVideoSendStreamConfig currently only supports one "
-                   << "codec. Logging codec :" << codec.payload_name;
-      break;
-    }
-  }
-
-  StoreEvent(std::move(event));
-}
-
-void RtcEventLogImpl::LogAudioReceiveStreamConfig(
-    const rtclog::StreamConfig& config) {
-  std::unique_ptr<rtclog::Event> event(new rtclog::Event());
-  event->set_timestamp_us(rtc::TimeMicros());
-  event->set_type(rtclog::Event::AUDIO_RECEIVER_CONFIG_EVENT);
-
-  rtclog::AudioReceiveConfig* receiver_config =
-      event->mutable_audio_receiver_config();
-  receiver_config->set_remote_ssrc(config.remote_ssrc);
-  receiver_config->set_local_ssrc(config.local_ssrc);
-
-  for (const auto& e : config.rtp_extensions) {
-    rtclog::RtpHeaderExtension* extension =
-        receiver_config->add_header_extensions();
-    extension->set_name(e.uri);
-    extension->set_id(e.id);
-  }
-  StoreEvent(std::move(event));
-}
-
-void RtcEventLogImpl::LogAudioSendStreamConfig(
-    const rtclog::StreamConfig& config) {
-  std::unique_ptr<rtclog::Event> event(new rtclog::Event());
-  event->set_timestamp_us(rtc::TimeMicros());
-  event->set_type(rtclog::Event::AUDIO_SENDER_CONFIG_EVENT);
-
-  rtclog::AudioSendConfig* sender_config = event->mutable_audio_sender_config();
-
-  sender_config->set_ssrc(config.local_ssrc);
-
-  for (const auto& e : config.rtp_extensions) {
-    rtclog::RtpHeaderExtension* extension =
-        sender_config->add_header_extensions();
-    extension->set_name(e.uri);
-    extension->set_id(e.id);
-  }
-
-  StoreEvent(std::move(event));
-}
-
-void RtcEventLogImpl::LogRtpHeader(PacketDirection direction,
-                                   const uint8_t* header,
-                                   size_t packet_length) {
-  LogRtpHeader(direction, header, packet_length, PacedPacketInfo::kNotAProbe);
-}
-
-void RtcEventLogImpl::LogRtpHeader(PacketDirection direction,
-                                   const uint8_t* header,
-                                   size_t packet_length,
-                                   int probe_cluster_id) {
-  // Read header length (in bytes) from packet data.
-  if (packet_length < 12u) {
-    return;  // Don't read outside the packet.
-  }
-  const bool x = (header[0] & 0x10) != 0;
-  const uint8_t cc = header[0] & 0x0f;
-  size_t header_length = 12u + cc * 4u;
-
-  if (x) {
-    if (packet_length < 12u + cc * 4u + 4u) {
-      return;  // Don't read outside the packet.
-    }
-    size_t x_len = ByteReader<uint16_t>::ReadBigEndian(header + 14 + cc * 4);
-    header_length += (x_len + 1) * 4;
-  }
-
-  std::unique_ptr<rtclog::Event> rtp_event(new rtclog::Event());
-  rtp_event->set_timestamp_us(rtc::TimeMicros());
-  rtp_event->set_type(rtclog::Event::RTP_EVENT);
-  rtp_event->mutable_rtp_packet()->set_incoming(direction == kIncomingPacket);
-  rtp_event->mutable_rtp_packet()->set_packet_length(packet_length);
-  rtp_event->mutable_rtp_packet()->set_header(header, header_length);
-  if (probe_cluster_id != PacedPacketInfo::kNotAProbe)
-    rtp_event->mutable_rtp_packet()->set_probe_cluster_id(probe_cluster_id);
-  StoreEvent(std::move(rtp_event));
-}
-
-void RtcEventLogImpl::LogRtcpPacket(PacketDirection direction,
-                                    const uint8_t* packet,
-                                    size_t length) {
-  std::unique_ptr<rtclog::Event> rtcp_event(new rtclog::Event());
-  rtcp_event->set_timestamp_us(rtc::TimeMicros());
-  rtcp_event->set_type(rtclog::Event::RTCP_EVENT);
-  rtcp_event->mutable_rtcp_packet()->set_incoming(direction == kIncomingPacket);
-
-  rtcp::CommonHeader header;
-  const uint8_t* block_begin = packet;
-  const uint8_t* packet_end = packet + length;
-  RTC_DCHECK(length <= IP_PACKET_SIZE);
-  uint8_t buffer[IP_PACKET_SIZE];
-  uint32_t buffer_length = 0;
-  while (block_begin < packet_end) {
-    if (!header.Parse(block_begin, packet_end - block_begin)) {
-      break;  // Incorrect message header.
-    }
-    const uint8_t* next_block = header.NextPacket();
-    uint32_t block_size = next_block - block_begin;
-    switch (header.type()) {
-      case rtcp::SenderReport::kPacketType:
-      case rtcp::ReceiverReport::kPacketType:
-      case rtcp::Bye::kPacketType:
-      case rtcp::ExtendedJitterReport::kPacketType:
-      case rtcp::Rtpfb::kPacketType:
-      case rtcp::Psfb::kPacketType:
-      case rtcp::ExtendedReports::kPacketType:
-        // We log sender reports, receiver reports, bye messages
-        // inter-arrival jitter, third-party loss reports, payload-specific
-        // feedback and extended reports.
-        memcpy(buffer + buffer_length, block_begin, block_size);
-        buffer_length += block_size;
-        break;
-      case rtcp::Sdes::kPacketType:
-      case rtcp::App::kPacketType:
-      default:
-        // We don't log sender descriptions, application defined messages
-        // or message blocks of unknown type.
-        break;
-    }
-
-    block_begin += block_size;
-  }
-  rtcp_event->mutable_rtcp_packet()->set_packet_data(buffer, buffer_length);
-  StoreEvent(std::move(rtcp_event));
-}
-
-void RtcEventLogImpl::LogAudioPlayout(uint32_t ssrc) {
-  std::unique_ptr<rtclog::Event> event(new rtclog::Event());
-  event->set_timestamp_us(rtc::TimeMicros());
-  event->set_type(rtclog::Event::AUDIO_PLAYOUT_EVENT);
-  auto playout_event = event->mutable_audio_playout_event();
-  playout_event->set_local_ssrc(ssrc);
-  StoreEvent(std::move(event));
-}
-
-void RtcEventLogImpl::LogLossBasedBweUpdate(int32_t bitrate_bps,
-                                            uint8_t fraction_loss,
-                                            int32_t total_packets) {
-  std::unique_ptr<rtclog::Event> event(new rtclog::Event());
-  event->set_timestamp_us(rtc::TimeMicros());
-  event->set_type(rtclog::Event::LOSS_BASED_BWE_UPDATE);
-  auto bwe_event = event->mutable_loss_based_bwe_update();
-  bwe_event->set_bitrate_bps(bitrate_bps);
-  bwe_event->set_fraction_loss(fraction_loss);
-  bwe_event->set_total_packets(total_packets);
-  StoreEvent(std::move(event));
-}
-
-void RtcEventLogImpl::LogDelayBasedBweUpdate(int32_t bitrate_bps,
-                                             BandwidthUsage detector_state) {
-  std::unique_ptr<rtclog::Event> event(new rtclog::Event());
-  event->set_timestamp_us(rtc::TimeMicros());
-  event->set_type(rtclog::Event::DELAY_BASED_BWE_UPDATE);
-  auto bwe_event = event->mutable_delay_based_bwe_update();
-  bwe_event->set_bitrate_bps(bitrate_bps);
-  bwe_event->set_detector_state(ConvertDetectorState(detector_state));
-  StoreEvent(std::move(event));
-}
-
-void RtcEventLogImpl::LogAudioNetworkAdaptation(
-    const AudioEncoderRuntimeConfig& config) {
-  std::unique_ptr<rtclog::Event> event(new rtclog::Event());
-  event->set_timestamp_us(rtc::TimeMicros());
-  event->set_type(rtclog::Event::AUDIO_NETWORK_ADAPTATION_EVENT);
-  auto audio_network_adaptation = event->mutable_audio_network_adaptation();
-  if (config.bitrate_bps)
-    audio_network_adaptation->set_bitrate_bps(*config.bitrate_bps);
-  if (config.frame_length_ms)
-    audio_network_adaptation->set_frame_length_ms(*config.frame_length_ms);
-  if (config.uplink_packet_loss_fraction) {
-    audio_network_adaptation->set_uplink_packet_loss_fraction(
-        *config.uplink_packet_loss_fraction);
-  }
-  if (config.enable_fec)
-    audio_network_adaptation->set_enable_fec(*config.enable_fec);
-  if (config.enable_dtx)
-    audio_network_adaptation->set_enable_dtx(*config.enable_dtx);
-  if (config.num_channels)
-    audio_network_adaptation->set_num_channels(*config.num_channels);
-  StoreEvent(std::move(event));
-}
-
-void RtcEventLogImpl::LogProbeClusterCreated(int id,
-                                             int bitrate_bps,
-                                             int min_probes,
-                                             int min_bytes) {
-  std::unique_ptr<rtclog::Event> event(new rtclog::Event());
-  event->set_timestamp_us(rtc::TimeMicros());
-  event->set_type(rtclog::Event::BWE_PROBE_CLUSTER_CREATED_EVENT);
-
-  auto probe_cluster = event->mutable_probe_cluster();
-  probe_cluster->set_id(id);
-  probe_cluster->set_bitrate_bps(bitrate_bps);
-  probe_cluster->set_min_packets(min_probes);
-  probe_cluster->set_min_bytes(min_bytes);
-  StoreEvent(std::move(event));
-}
-
-void RtcEventLogImpl::LogProbeResultSuccess(int id, int bitrate_bps) {
-  LogProbeResult(id, rtclog::BweProbeResult::SUCCESS, bitrate_bps);
-}
-
-void RtcEventLogImpl::LogProbeResultFailure(int id,
-                                            ProbeFailureReason failure_reason) {
-  rtclog::BweProbeResult::ResultType result =
-      ConvertProbeResultType(failure_reason);
-  LogProbeResult(id, result, -1);
-}
-
-void RtcEventLogImpl::LogProbeResult(int id,
-                                     rtclog::BweProbeResult::ResultType result,
-                                     int bitrate_bps) {
-  std::unique_ptr<rtclog::Event> event(new rtclog::Event());
-  event->set_timestamp_us(rtc::TimeMicros());
-  event->set_type(rtclog::Event::BWE_PROBE_RESULT_EVENT);
-
-  auto probe_result = event->mutable_probe_result();
-  probe_result->set_id(id);
-  probe_result->set_result(result);
-  if (result == rtclog::BweProbeResult::SUCCESS)
-    probe_result->set_bitrate_bps(bitrate_bps);
-  StoreEvent(std::move(event));
-}
-
-void RtcEventLogImpl::StartLoggingInternal(std::unique_ptr<FileWrapper> file,
-                                           int64_t max_size_bytes) {
-  LOG(LS_INFO) << "Starting WebRTC event log.";
-
-  max_size_bytes = (max_size_bytes <= 0)
-                       ? std::numeric_limits<decltype(max_size_bytes)>::max()
-                       : max_size_bytes;
-  auto file_handler = [this,
-                       max_size_bytes](std::unique_ptr<FileWrapper> file) {
-    RTC_DCHECK_RUN_ON(&task_queue_);
-    if (!file_->is_open()) {
-      max_size_bytes_ = max_size_bytes;
-      file_ = std::move(file);
-      StartLogFile();
-    } else {
-      // Already started. Ignore message and close file handle.
-      file->CloseFile();
-    }
-  };
-  task_queue_.PostTask(rtc::MakeUnique<ResourceOwningTask<FileWrapper>>(
-      std::move(file), file_handler));
-}
-
-void RtcEventLogImpl::StoreEvent(std::unique_ptr<rtclog::Event> event) {
-  RTC_DCHECK(event);
-
-  auto event_handler = [this](std::unique_ptr<rtclog::Event> rtclog_event) {
-    RTC_DCHECK_RUN_ON(&task_queue_);
-    if (file_->is_open()) {
-      LogToFile(std::move(rtclog_event));
-    } else {
-      LogToMemory(std::move(rtclog_event));
-    }
-  };
-
-  task_queue_.PostTask(rtc::MakeUnique<ResourceOwningTask<rtclog::Event>>(
-      std::move(event), event_handler));
-}
-
-bool RtcEventLogImpl::AppendEventToString(rtclog::Event* event,
-                                          ProtoString* output_string) {
-  RTC_DCHECK_RUN_ON(&task_queue_);
-
-  // Even though we're only serializing a single event during this call, what
-  // we intend to get is a list of events, with a tag and length preceding
-  // each actual event. To produce that, we serialize a list of a single event.
-  // If we later serialize additional events, the resulting ProtoString will
-  // be a proper concatenation of all those events.
-
-  rtclog::EventStream event_stream;
-  event_stream.add_stream();
-
-  // As a tweak, we swap the new event into the event-stream, write that to
-  // file, then swap back. This saves on some copying.
-  rtclog::Event* output_event = event_stream.mutable_stream(0);
-  output_event->Swap(event);
-
-  bool appended;
-  size_t potential_new_size =
-      written_bytes_ + output_string->size() + event_stream.ByteSize();
-  if (potential_new_size <= max_size_bytes_) {
-    event_stream.AppendToString(output_string);
-    appended = true;
-  } else {
-    appended = false;
-  }
-
-  // When the function returns, the original Event will be unchanged.
-  output_event->Swap(event);
-
-  return appended;
-}
-
-void RtcEventLogImpl::LogToMemory(std::unique_ptr<rtclog::Event> event) {
-  RTC_DCHECK_RUN_ON(&task_queue_);
-  RTC_DCHECK(!file_->is_open());
-
-  if (IsConfigEvent(*event.get())) {
-    config_history_.push_back(std::move(event));
-  } else {
-    history_.push_back(std::move(event));
-    if (history_.size() > kEventsInHistory) {
-      history_.pop_front();
-    }
-  }
-}
-
-void RtcEventLogImpl::StartLogFile() {
-  RTC_DCHECK_RUN_ON(&task_queue_);
-  RTC_DCHECK(file_->is_open());
-
-  ProtoString output_string;
-
-  // Create and serialize the LOG_START event.
-  // The timestamp used will correspond to when logging has started. The log
-  // may contain events earlier than the LOG_START event. (In general, the
-  // timestamps in the log are not monotonic.)
-  rtclog::Event start_event;
-  start_event.set_timestamp_us(rtc::TimeMicros());
-  start_event.set_type(rtclog::Event::LOG_START);
-  bool appended = AppendEventToString(&start_event, &output_string);
-
-  // Serialize the config information for all old streams, including streams
-  // which were already logged to previous files.
-  for (auto& event : config_history_) {
-    if (!appended) {
-      break;
-    }
-    appended = AppendEventToString(event.get(), &output_string);
-  }
-
-  // Serialize the events in the event queue.
-  while (appended && !history_.empty()) {
-    appended = AppendEventToString(history_.front().get(), &output_string);
-    if (appended) {
-      // Known issue - if writing to the file fails, these events will have
-      // been lost. If we try to open a new file, these events will be missing
-      // from it.
-      history_.pop_front();
-    }
-  }
-
-  // Write to file.
-  if (!file_->Write(output_string.data(), output_string.size())) {
-    LOG(LS_ERROR) << "FileWrapper failed to write WebRtcEventLog file.";
-    // The current FileWrapper implementation closes the file on error.
-    RTC_DCHECK(!file_->is_open());
-    return;
-  }
-  written_bytes_ += output_string.size();
-
-  if (!appended) {
-    RTC_DCHECK(file_->is_open());
-    StopLogFile(rtc::TimeMicros());
-  }
-}
-
-void RtcEventLogImpl::LogToFile(std::unique_ptr<rtclog::Event> event) {
-  RTC_DCHECK_RUN_ON(&task_queue_);
-  RTC_DCHECK(file_->is_open());
-
-  ProtoString output_string;
-
-  bool appended = AppendEventToString(event.get(), &output_string);
-
-  if (IsConfigEvent(*event.get())) {
-    config_history_.push_back(std::move(event));
-  }
-
-  if (!appended) {
-    RTC_DCHECK(file_->is_open());
-    history_.push_back(std::move(event));
-    StopLogFile(rtc::TimeMicros());
-    return;
-  }
-
-  // Write string to file.
-  if (file_->Write(output_string.data(), output_string.size())) {
-    written_bytes_ += output_string.size();
-  } else {
-    LOG(LS_ERROR) << "FileWrapper failed to write WebRtcEventLog file.";
-    // The current FileWrapper implementation closes the file on error.
-    RTC_DCHECK(!file_->is_open());
-  }
-}
-
-void RtcEventLogImpl::StopLogFile(int64_t stop_time) {
-  RTC_DCHECK_RUN_ON(&task_queue_);
-  RTC_DCHECK(file_->is_open());
-
-  ProtoString output_string;
-
-  rtclog::Event end_event;
-  end_event.set_timestamp_us(stop_time);
-  end_event.set_type(rtclog::Event::LOG_END);
-  bool appended = AppendEventToString(&end_event, &output_string);
-
-  if (appended) {
-    if (!file_->Write(output_string.data(), output_string.size())) {
-      LOG(LS_ERROR) << "FileWrapper failed to write WebRtcEventLog file.";
-      // The current FileWrapper implementation closes the file on error.
-      RTC_DCHECK(!file_->is_open());
-    }
-    written_bytes_ += output_string.size();
-  }
-
-  max_size_bytes_ = std::numeric_limits<decltype(max_size_bytes_)>::max();
-  written_bytes_ = 0;
-
-  file_->CloseFile();
-  RTC_DCHECK(!file_->is_open());
-}
-
-bool RtcEventLog::ParseRtcEventLog(const std::string& file_name,
-                                   rtclog::EventStream* result) {
-  char tmp_buffer[1024];
-  int bytes_read = 0;
-  std::unique_ptr<FileWrapper> dump_file(FileWrapper::Create());
-  if (!dump_file->OpenFile(file_name.c_str(), true)) {
-    return false;
-  }
-  ProtoString dump_buffer;
-  while ((bytes_read = dump_file->Read(tmp_buffer, sizeof(tmp_buffer))) > 0) {
-    dump_buffer.append(tmp_buffer, bytes_read);
-  }
-  dump_file->CloseFile();
-  return result->ParseFromString(dump_buffer);
-}
-
-#endif  // ENABLE_RTC_EVENT_LOG
-
-// RtcEventLog member functions.
-std::unique_ptr<RtcEventLog> RtcEventLog::Create() {
-#ifdef ENABLE_RTC_EVENT_LOG
-  // TODO(eladalon): Known issue - there's a race over |log_count_| here.
-  constexpr int kMaxLogCount = 5;
-  int count = 1 + std::atomic_fetch_add(&RtcEventLogImpl::log_count_, 1);
-  if (count > kMaxLogCount) {
-    LOG(LS_WARNING) << "Denied creation of additional WebRTC event logs. "
-                    << count - 1 << " logs open already.";
-    std::atomic_fetch_sub(&RtcEventLogImpl::log_count_, 1);
-    return std::unique_ptr<RtcEventLog>(new RtcEventLogNullImpl());
-  }
-  return std::unique_ptr<RtcEventLog>(new RtcEventLogImpl());
-#else
-  return CreateNull();
-#endif  // ENABLE_RTC_EVENT_LOG
-}
-
-std::unique_ptr<RtcEventLog> RtcEventLog::CreateNull() {
-  return std::unique_ptr<RtcEventLog>(new RtcEventLogNullImpl());
-}
-
-}  // namespace webrtc
diff --git a/logging/rtc_event_log/rtc_event_log.h b/logging/rtc_event_log/rtc_event_log.h
deleted file mode 100644
index 40d8989..0000000
--- a/logging/rtc_event_log/rtc_event_log.h
+++ /dev/null
@@ -1,206 +0,0 @@
-/*
- *  Copyright (c) 2015 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_LOGGING_RTC_EVENT_LOG_RTC_EVENT_LOG_H_
-#define WEBRTC_LOGGING_RTC_EVENT_LOG_RTC_EVENT_LOG_H_
-
-#include <memory>
-#include <string>
-#include <vector>
-
-// TODO(eladalon): Get rid of this later in the CL-stack.
-#include "webrtc/api/rtpparameters.h"
-#include "webrtc/common_types.h"
-// TODO(eladalon): Get rid of this later in the CL-stack.
-#include "webrtc/logging/rtc_event_log/rtc_stream_config.h"
-#include "webrtc/rtc_base/platform_file.h"
-
-namespace webrtc {
-
-namespace rtclog {
-class EventStream;  // Storage class automatically generated from protobuf.
-}  // namespace rtclog
-
-class Clock;
-struct AudioEncoderRuntimeConfig;
-
-enum class MediaType;
-enum class BandwidthUsage;
-
-enum PacketDirection { kIncomingPacket = 0, kOutgoingPacket };
-enum ProbeFailureReason {
-  kInvalidSendReceiveInterval,
-  kInvalidSendReceiveRatio,
-  kTimeout
-};
-
-class RtcEventLog {
- public:
-  virtual ~RtcEventLog() {}
-
-  // Factory method to create an RtcEventLog object.
-  static std::unique_ptr<RtcEventLog> Create();
-  // TODO(nisse): webrtc::Clock is deprecated. Delete this method and
-  // above forward declaration of Clock when
-  // webrtc/system_wrappers/include/clock.h is deleted.
-  static std::unique_ptr<RtcEventLog> Create(const Clock* clock) {
-    return Create();
-  }
-
-  // Create an RtcEventLog object that does nothing.
-  static std::unique_ptr<RtcEventLog> CreateNull();
-
-  // Starts logging a maximum of max_size_bytes bytes to the specified file.
-  // If the file already exists it will be overwritten.
-  // If max_size_bytes <= 0, logging will be active until StopLogging is called.
-  // The function has no effect and returns false if we can't start a new log
-  // e.g. because we are already logging or the file cannot be opened.
-  virtual bool StartLogging(const std::string& file_name,
-                            int64_t max_size_bytes) = 0;
-
-  // Same as above. The RtcEventLog takes ownership of the file if the call
-  // is successful, i.e. if it returns true.
-  virtual bool StartLogging(rtc::PlatformFile platform_file,
-                            int64_t max_size_bytes) = 0;
-
-  // Deprecated. Pass an explicit file size limit.
-  RTC_DEPRECATED bool StartLogging(const std::string& file_name) {
-    return StartLogging(file_name, 10000000);
-  }
-
-  // Deprecated. Pass an explicit file size limit.
-  RTC_DEPRECATED bool StartLogging(rtc::PlatformFile platform_file) {
-    return StartLogging(platform_file, 10000000);
-  }
-
-  // Stops logging to file and waits until the file has been closed, after
-  // which it would be permissible to read and/or modify it.
-  virtual void StopLogging() = 0;
-
-  // Logs configuration information for a video receive stream.
-  virtual void LogVideoReceiveStreamConfig(
-      const rtclog::StreamConfig& config) = 0;
-
-  // Logs configuration information for a video send stream.
-  virtual void LogVideoSendStreamConfig(const rtclog::StreamConfig& config) = 0;
-
-  // Logs configuration information for an audio receive stream.
-  virtual void LogAudioReceiveStreamConfig(
-      const rtclog::StreamConfig& config) = 0;
-
-  // Logs configuration information for an audio send stream.
-  virtual void LogAudioSendStreamConfig(const rtclog::StreamConfig& config) = 0;
-
-  // Logs the header of an incoming or outgoing RTP packet. packet_length
-  // is the total length of the packet, including both header and payload.
-  virtual void LogRtpHeader(PacketDirection direction,
-                            const uint8_t* header,
-                            size_t packet_length) = 0;
-
-  // Same as above but used on the sender side to log packets that are part of
-  // a probe cluster.
-  virtual void LogRtpHeader(PacketDirection direction,
-                            const uint8_t* header,
-                            size_t packet_length,
-                            int probe_cluster_id) = 0;
-
-  // Logs an incoming or outgoing RTCP packet.
-  virtual void LogRtcpPacket(PacketDirection direction,
-                             const uint8_t* packet,
-                             size_t length) = 0;
-
-  // Logs an audio playout event.
-  virtual void LogAudioPlayout(uint32_t ssrc) = 0;
-
-  // Logs a bitrate update from the bandwidth estimator based on packet loss.
-  virtual void LogLossBasedBweUpdate(int32_t bitrate_bps,
-                                     uint8_t fraction_loss,
-                                     int32_t total_packets) = 0;
-
-  // Logs a bitrate update from the bandwidth estimator based on delay changes.
-  virtual void LogDelayBasedBweUpdate(int32_t bitrate_bps,
-                                      BandwidthUsage detector_state) = 0;
-
-  // Logs audio encoder re-configuration driven by audio network adaptor.
-  virtual void LogAudioNetworkAdaptation(
-      const AudioEncoderRuntimeConfig& config) = 0;
-
-  // Logs when a probe cluster is created.
-  virtual void LogProbeClusterCreated(int id,
-                                      int bitrate_bps,
-                                      int min_probes,
-                                      int min_bytes) = 0;
-
-  // Logs the result of a successful probing attempt.
-  virtual void LogProbeResultSuccess(int id, int bitrate_bps) = 0;
-
-  // Logs the result of an unsuccessful probing attempt.
-  virtual void LogProbeResultFailure(int id,
-                                     ProbeFailureReason failure_reason) = 0;
-
-  // Reads an RtcEventLog file and returns true when reading was successful.
-  // The result is stored in the given EventStream object.
-  // The order of the events in the EventStream is implementation defined.
-  // The current implementation writes a LOG_START event, then the old
-  // configurations, then the remaining events in timestamp order and finally
-  // a LOG_END event. However, this might change without further notice.
-  // TODO(terelius): Change result type to a vector?
-  static bool ParseRtcEventLog(const std::string& file_name,
-                               rtclog::EventStream* result);
-};
-
-// No-op implementation is used if flag is not set, or in tests.
-class RtcEventLogNullImpl : public RtcEventLog {
- public:
-  bool StartLogging(const std::string& file_name,
-                    int64_t max_size_bytes) override {
-    return false;
-  }
-  bool StartLogging(rtc::PlatformFile platform_file,
-                    int64_t max_size_bytes) override {
-    return false;
-  }
-  void StopLogging() override {}
-  void LogVideoReceiveStreamConfig(
-      const rtclog::StreamConfig& config) override {}
-  void LogVideoSendStreamConfig(const rtclog::StreamConfig& config) override {}
-  void LogAudioReceiveStreamConfig(
-      const rtclog::StreamConfig& config) override {}
-  void LogAudioSendStreamConfig(const rtclog::StreamConfig& config) override {}
-  void LogRtpHeader(PacketDirection direction,
-                    const uint8_t* header,
-                    size_t packet_length) override {}
-  void LogRtpHeader(PacketDirection direction,
-                    const uint8_t* header,
-                    size_t packet_length,
-                    int probe_cluster_id) override {}
-  void LogRtcpPacket(PacketDirection direction,
-                     const uint8_t* packet,
-                     size_t length) override {}
-  void LogAudioPlayout(uint32_t ssrc) override {}
-  void LogLossBasedBweUpdate(int32_t bitrate_bps,
-                             uint8_t fraction_loss,
-                             int32_t total_packets) override {}
-  void LogDelayBasedBweUpdate(int32_t bitrate_bps,
-                              BandwidthUsage detector_state) override {}
-  void LogAudioNetworkAdaptation(
-      const AudioEncoderRuntimeConfig& config) override {}
-  void LogProbeClusterCreated(int id,
-                              int bitrate_bps,
-                              int min_probes,
-                              int min_bytes) override{};
-  void LogProbeResultSuccess(int id, int bitrate_bps) override{};
-  void LogProbeResultFailure(int id,
-                             ProbeFailureReason failure_reason) override{};
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_LOGGING_RTC_EVENT_LOG_RTC_EVENT_LOG_H_
diff --git a/logging/rtc_event_log/rtc_event_log.proto b/logging/rtc_event_log/rtc_event_log.proto
deleted file mode 100644
index b9053ae..0000000
--- a/logging/rtc_event_log/rtc_event_log.proto
+++ /dev/null
@@ -1,316 +0,0 @@
-syntax = "proto2";
-option optimize_for = LITE_RUNTIME;
-package webrtc.rtclog;
-
-enum MediaType {
-  ANY = 0;
-  AUDIO = 1;
-  VIDEO = 2;
-  DATA = 3;
-}
-
-// This is the main message to dump to a file, it can contain multiple event
-// messages, but it is possible to append multiple EventStreams (each with a
-// single event) to a file.
-// This has the benefit that there's no need to keep all data in memory.
-message EventStream {
-  repeated Event stream = 1;
-}
-
-message Event {
-  // required - Elapsed wallclock time in us since the start of the log.
-  optional int64 timestamp_us = 1;
-
-  // The different types of events that can occur, the UNKNOWN_EVENT entry
-  // is added in case future EventTypes are added, in that case old code will
-  // receive the new events as UNKNOWN_EVENT.
-  enum EventType {
-    UNKNOWN_EVENT = 0;
-    LOG_START = 1;
-    LOG_END = 2;
-    RTP_EVENT = 3;
-    RTCP_EVENT = 4;
-    AUDIO_PLAYOUT_EVENT = 5;
-    LOSS_BASED_BWE_UPDATE = 6;
-    DELAY_BASED_BWE_UPDATE = 7;
-    VIDEO_RECEIVER_CONFIG_EVENT = 8;
-    VIDEO_SENDER_CONFIG_EVENT = 9;
-    AUDIO_RECEIVER_CONFIG_EVENT = 10;
-    AUDIO_SENDER_CONFIG_EVENT = 11;
-    AUDIO_NETWORK_ADAPTATION_EVENT = 16;
-    BWE_PROBE_CLUSTER_CREATED_EVENT = 17;
-    BWE_PROBE_RESULT_EVENT = 18;
-  }
-
-  // required - Indicates the type of this event
-  optional EventType type = 2;
-
-  oneof subtype {
-    // required if type == RTP_EVENT
-    RtpPacket rtp_packet = 3;
-
-    // required if type == RTCP_EVENT
-    RtcpPacket rtcp_packet = 4;
-
-    // required if type == AUDIO_PLAYOUT_EVENT
-    AudioPlayoutEvent audio_playout_event = 5;
-
-    // required if type == LOSS_BASED_BWE_UPDATE
-    LossBasedBweUpdate loss_based_bwe_update = 6;
-
-    // required if type == DELAY_BASED_BWE_UPDATE
-    DelayBasedBweUpdate delay_based_bwe_update = 7;
-
-    // required if type == VIDEO_RECEIVER_CONFIG_EVENT
-    VideoReceiveConfig video_receiver_config = 8;
-
-    // required if type == VIDEO_SENDER_CONFIG_EVENT
-    VideoSendConfig video_sender_config = 9;
-
-    // required if type == AUDIO_RECEIVER_CONFIG_EVENT
-    AudioReceiveConfig audio_receiver_config = 10;
-
-    // required if type == AUDIO_SENDER_CONFIG_EVENT
-    AudioSendConfig audio_sender_config = 11;
-
-    // required if type == AUDIO_NETWORK_ADAPTATION_EVENT
-    AudioNetworkAdaptation audio_network_adaptation = 16;
-
-    // required if type == BWE_PROBE_CLUSTER_CREATED_EVENT
-    BweProbeCluster probe_cluster = 17;
-
-    // required if type == BWE_PROBE_RESULT_EVENT
-    BweProbeResult probe_result = 18;
-  }
-}
-
-message RtpPacket {
-  // required - True if the packet is incoming w.r.t. the user logging the data
-  optional bool incoming = 1;
-
-  optional MediaType type = 2 [deprecated = true];
-
-  // required - The size of the packet including both payload and header.
-  optional uint32 packet_length = 3;
-
-  // required - The RTP header only.
-  optional bytes header = 4;
-
-  // optional - The probe cluster id.
-  optional uint32 probe_cluster_id = 5;
-
-  // Do not add code to log user payload data without a privacy review!
-}
-
-message RtcpPacket {
-  // required - True if the packet is incoming w.r.t. the user logging the data
-  optional bool incoming = 1;
-
-  optional MediaType type = 2 [deprecated = true];
-
-  // required - The whole packet including both payload and header.
-  optional bytes packet_data = 3;
-}
-
-message AudioPlayoutEvent {
-  // TODO(ivoc): Rename, we currently use the "remote" ssrc, i.e. identifying
-  // the receive stream, while local_ssrc identifies the send stream, if any.
-  // required - The SSRC of the audio stream associated with the playout event.
-  optional uint32 local_ssrc = 2;
-}
-
-message LossBasedBweUpdate {
-  // required - Bandwidth estimate (in bps) after the update.
-  optional int32 bitrate_bps = 1;
-
-  // required - Fraction of lost packets since last receiver report
-  // computed as floor( 256 * (#lost_packets / #total_packets) ).
-  // The possible values range from 0 to 255.
-  optional uint32 fraction_loss = 2;
-
-  // TODO(terelius): Is this really needed? Remove or make optional?
-  // required - Total number of packets that the BWE update is based on.
-  optional int32 total_packets = 3;
-}
-
-message DelayBasedBweUpdate {
-  enum DetectorState {
-    BWE_NORMAL = 0;
-    BWE_UNDERUSING = 1;
-    BWE_OVERUSING = 2;
-  }
-
-  // required - Bandwidth estimate (in bps) after the update.
-  optional int32 bitrate_bps = 1;
-
-  // required - The state of the overuse detector.
-  optional DetectorState detector_state = 2;
-}
-
-// TODO(terelius): Video and audio streams could in principle share SSRC,
-// so identifying a stream based only on SSRC might not work.
-// It might be better to use a combination of SSRC and media type
-// or SSRC and port number, but for now we will rely on SSRC only.
-message VideoReceiveConfig {
-  // required - Synchronization source (stream identifier) to be received.
-  optional uint32 remote_ssrc = 1;
-  // required - Sender SSRC used for sending RTCP (such as receiver reports).
-  optional uint32 local_ssrc = 2;
-
-  // Compound mode is described by RFC 4585 and reduced-size
-  // RTCP mode is described by RFC 5506.
-  enum RtcpMode {
-    RTCP_COMPOUND = 1;
-    RTCP_REDUCEDSIZE = 2;
-  }
-  // required - RTCP mode to use.
-  optional RtcpMode rtcp_mode = 3;
-
-  // required - Receiver estimated maximum bandwidth.
-  optional bool remb = 4;
-
-  // Map from video RTP payload type -> RTX config.
-  repeated RtxMap rtx_map = 5;
-
-  // RTP header extensions used for the received stream.
-  repeated RtpHeaderExtension header_extensions = 6;
-
-  // List of decoders associated with the stream.
-  repeated DecoderConfig decoders = 7;
-}
-
-// Maps decoder names to payload types.
-message DecoderConfig {
-  // required
-  optional string name = 1;
-
-  // required
-  optional int32 payload_type = 2;
-}
-
-// Maps RTP header extension names to numerical IDs.
-message RtpHeaderExtension {
-  // required
-  optional string name = 1;
-
-  // required
-  optional int32 id = 2;
-}
-
-// RTX settings for incoming video payloads that may be received.
-// RTX is disabled if there's no config present.
-message RtxConfig {
-  // required - SSRC to use for the RTX stream.
-  optional uint32 rtx_ssrc = 1;
-
-  // required - Payload type to use for the RTX stream.
-  optional int32 rtx_payload_type = 2;
-}
-
-message RtxMap {
-  // required
-  optional int32 payload_type = 1;
-
-  // required
-  optional RtxConfig config = 2;
-}
-
-message VideoSendConfig {
-  // Synchronization source (stream identifier) for outgoing stream.
-  // One stream can have several ssrcs for e.g. simulcast.
-  // At least one ssrc is required.
-  repeated uint32 ssrcs = 1;
-
-  // RTP header extensions used for the outgoing stream.
-  repeated RtpHeaderExtension header_extensions = 2;
-
-  // List of SSRCs for retransmitted packets.
-  repeated uint32 rtx_ssrcs = 3;
-
-  // required if rtx_ssrcs is used - Payload type for retransmitted packets.
-  optional int32 rtx_payload_type = 4;
-
-  // required - Encoder associated with the stream.
-  optional EncoderConfig encoder = 5;
-}
-
-// Maps encoder names to payload types.
-message EncoderConfig {
-  // required
-  optional string name = 1;
-
-  // required
-  optional int32 payload_type = 2;
-}
-
-message AudioReceiveConfig {
-  // required - Synchronization source (stream identifier) to be received.
-  optional uint32 remote_ssrc = 1;
-
-  // required - Sender SSRC used for sending RTCP (such as receiver reports).
-  optional uint32 local_ssrc = 2;
-
-  // RTP header extensions used for the received audio stream.
-  repeated RtpHeaderExtension header_extensions = 3;
-}
-
-message AudioSendConfig {
-  // required - Synchronization source (stream identifier) for outgoing stream.
-  optional uint32 ssrc = 1;
-
-  // RTP header extensions used for the outgoing audio stream.
-  repeated RtpHeaderExtension header_extensions = 2;
-}
-
-message AudioNetworkAdaptation {
-  // Bit rate that the audio encoder is operating at.
-  optional int32 bitrate_bps = 1;
-
-  // Frame length that each encoded audio packet consists of.
-  optional int32 frame_length_ms = 2;
-
-  // Packet loss fraction that the encoder's forward error correction (FEC) is
-  // optimized for.
-  optional float uplink_packet_loss_fraction = 3;
-
-  // Whether forward error correction (FEC) is turned on or off.
-  optional bool enable_fec = 4;
-
-  // Whether discontinuous transmission (DTX) is turned on or off.
-  optional bool enable_dtx = 5;
-
-  // Number of audio channels that each encoded packet consists of.
-  optional uint32 num_channels = 6;
-}
-
-message BweProbeCluster {
-  // required - The id of this probe cluster.
-  optional uint32 id = 1;
-
-  // required - The bitrate in bps that this probe cluster is meant to probe.
-  optional uint64 bitrate_bps = 2;
-
-  // required - The minimum number of packets used to probe the given bitrate.
-  optional uint32 min_packets = 3;
-
-  // required - The minimum number of bytes used to probe the given bitrate.
-  optional uint32 min_bytes = 4;
-}
-
-message BweProbeResult {
-  // required - The id of this probe cluster.
-  optional uint32 id = 1;
-
-  enum ResultType {
-    SUCCESS = 0;
-    INVALID_SEND_RECEIVE_INTERVAL = 1;
-    INVALID_SEND_RECEIVE_RATIO = 2;
-    TIMEOUT = 3;
-  }
-
-  // required - The result of this probing attempt.
-  optional ResultType result = 2;
-
-  // optional - but required if result == SUCCESS. The resulting bitrate in bps.
-  optional uint64 bitrate_bps = 3;
-}
diff --git a/logging/rtc_event_log/rtc_event_log2rtp_dump.cc b/logging/rtc_event_log/rtc_event_log2rtp_dump.cc
deleted file mode 100644
index 06b250d..0000000
--- a/logging/rtc_event_log/rtc_event_log2rtp_dump.cc
+++ /dev/null
@@ -1,207 +0,0 @@
-/*
- *  Copyright (c) 2015 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 <string.h>
-
-#include <iostream>
-#include <memory>
-#include <sstream>
-#include <string>
-
-#include "webrtc/logging/rtc_event_log/rtc_event_log.h"
-#include "webrtc/logging/rtc_event_log/rtc_event_log_parser.h"
-#include "webrtc/modules/rtp_rtcp/source/byte_io.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_utility.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/flags.h"
-#include "webrtc/test/rtp_file_writer.h"
-
-namespace {
-
-using MediaType = webrtc::ParsedRtcEventLog::MediaType;
-
-DEFINE_bool(
-    audio,
-    true,
-    "Use --noaudio to exclude audio packets from the converted RTPdump file.");
-DEFINE_bool(
-    video,
-    true,
-    "Use --novideo to exclude video packets from the converted RTPdump file.");
-DEFINE_bool(
-    data,
-    true,
-    "Use --nodata to exclude data packets from the converted RTPdump file.");
-DEFINE_bool(
-    rtp,
-    true,
-    "Use --nortp to exclude RTP packets from the converted RTPdump file.");
-DEFINE_bool(
-    rtcp,
-    true,
-    "Use --nortcp to exclude RTCP packets from the converted RTPdump file.");
-DEFINE_string(ssrc,
-              "",
-              "Store only packets with this SSRC (decimal or hex, the latter "
-              "starting with 0x).");
-DEFINE_bool(help, false, "Prints this message.");
-
-// Parses the input string for a valid SSRC. If a valid SSRC is found, it is
-// written to the output variable |ssrc|, and true is returned. Otherwise,
-// false is returned.
-// The empty string must be validated as true, because it is the default value
-// of the command-line flag. In this case, no value is written to the output
-// variable.
-bool ParseSsrc(std::string str, uint32_t* ssrc) {
-  // If the input string starts with 0x or 0X it indicates a hexadecimal number.
-  auto read_mode = std::dec;
-  if (str.size() > 2 &&
-      (str.substr(0, 2) == "0x" || str.substr(0, 2) == "0X")) {
-    read_mode = std::hex;
-    str = str.substr(2);
-  }
-  std::stringstream ss(str);
-  ss >> read_mode >> *ssrc;
-  return str.empty() || (!ss.fail() && ss.eof());
-}
-
-}  // namespace
-
-// This utility will convert a stored event log to the rtpdump format.
-int main(int argc, char* argv[]) {
-  std::string program_name = argv[0];
-  std::string usage =
-      "Tool for converting an RtcEventLog file to an RTP dump file.\n"
-      "Run " +
-      program_name +
-      " --help for usage.\n"
-      "Example usage:\n" +
-      program_name + " input.rel output.rtp\n";
-  if (rtc::FlagList::SetFlagsFromCommandLine(&argc, argv, true) ||
-      FLAG_help || argc != 3) {
-    std::cout << usage;
-    if (FLAG_help) {
-      rtc::FlagList::Print(nullptr, false);
-      return 0;
-    }
-    return 1;
-  }
-
-  std::string input_file = argv[1];
-  std::string output_file = argv[2];
-
-  uint32_t ssrc_filter = 0;
-  if (strlen(FLAG_ssrc) > 0)
-    RTC_CHECK(ParseSsrc(FLAG_ssrc, &ssrc_filter))
-        << "Flag verification has failed.";
-
-  webrtc::ParsedRtcEventLog parsed_stream;
-  if (!parsed_stream.ParseFile(input_file)) {
-    std::cerr << "Error while parsing input file: " << input_file << std::endl;
-    return -1;
-  }
-
-  std::unique_ptr<webrtc::test::RtpFileWriter> rtp_writer(
-      webrtc::test::RtpFileWriter::Create(
-          webrtc::test::RtpFileWriter::FileFormat::kRtpDump, output_file));
-
-  if (!rtp_writer.get()) {
-    std::cerr << "Error while opening output file: " << output_file
-              << std::endl;
-    return -1;
-  }
-
-  std::cout << "Found " << parsed_stream.GetNumberOfEvents()
-            << " events in the input file." << std::endl;
-  int rtp_counter = 0, rtcp_counter = 0;
-  bool header_only = false;
-  for (size_t i = 0; i < parsed_stream.GetNumberOfEvents(); i++) {
-    // The parsed_stream will assert if the protobuf event is missing
-    // some required fields and we attempt to access them. We could consider
-    // a softer failure option, but it does not seem useful to generate
-    // RTP dumps based on broken event logs.
-    if (FLAG_rtp &&
-        parsed_stream.GetEventType(i) == webrtc::ParsedRtcEventLog::RTP_EVENT) {
-      webrtc::test::RtpPacket packet;
-      webrtc::PacketDirection direction;
-      parsed_stream.GetRtpHeader(i, &direction, packet.data, &packet.length,
-                                 &packet.original_length);
-      if (packet.original_length > packet.length)
-        header_only = true;
-      packet.time_ms = parsed_stream.GetTimestamp(i) / 1000;
-
-      webrtc::RtpUtility::RtpHeaderParser rtp_parser(packet.data,
-                                                     packet.length);
-
-      // TODO(terelius): Maybe add a flag to dump outgoing traffic instead?
-      if (direction == webrtc::kOutgoingPacket)
-        continue;
-
-      webrtc::RTPHeader parsed_header;
-      rtp_parser.Parse(&parsed_header);
-      MediaType media_type =
-          parsed_stream.GetMediaType(parsed_header.ssrc, direction);
-      if (!FLAG_audio && media_type == MediaType::AUDIO)
-        continue;
-      if (!FLAG_video && media_type == MediaType::VIDEO)
-        continue;
-      if (!FLAG_data && media_type == MediaType::DATA)
-        continue;
-      if (strlen(FLAG_ssrc) > 0) {
-        const uint32_t packet_ssrc =
-            webrtc::ByteReader<uint32_t>::ReadBigEndian(
-                reinterpret_cast<const uint8_t*>(packet.data + 8));
-        if (packet_ssrc != ssrc_filter)
-          continue;
-      }
-
-      rtp_writer->WritePacket(&packet);
-      rtp_counter++;
-    }
-    if (FLAG_rtcp && parsed_stream.GetEventType(i) ==
-                         webrtc::ParsedRtcEventLog::RTCP_EVENT) {
-      webrtc::test::RtpPacket packet;
-      webrtc::PacketDirection direction;
-      parsed_stream.GetRtcpPacket(i, &direction, packet.data, &packet.length);
-      // For RTCP packets the original_length should be set to 0 in the
-      // RTPdump format.
-      packet.original_length = 0;
-      packet.time_ms = parsed_stream.GetTimestamp(i) / 1000;
-
-      // TODO(terelius): Maybe add a flag to dump outgoing traffic instead?
-      if (direction == webrtc::kOutgoingPacket)
-        continue;
-
-      // Note that |packet_ssrc| is the sender SSRC. An RTCP message may contain
-      // report blocks for many streams, thus several SSRCs and they doen't
-      // necessarily have to be of the same media type.
-      const uint32_t packet_ssrc = webrtc::ByteReader<uint32_t>::ReadBigEndian(
-          reinterpret_cast<const uint8_t*>(packet.data + 4));
-      MediaType media_type = parsed_stream.GetMediaType(packet_ssrc, direction);
-      if (!FLAG_audio && media_type == MediaType::AUDIO)
-        continue;
-      if (!FLAG_video && media_type == MediaType::VIDEO)
-        continue;
-      if (!FLAG_data && media_type == MediaType::DATA)
-        continue;
-      if (strlen(FLAG_ssrc) > 0) {
-        if (packet_ssrc != ssrc_filter)
-          continue;
-      }
-
-      rtp_writer->WritePacket(&packet);
-      rtcp_counter++;
-    }
-  }
-  std::cout << "Wrote " << rtp_counter << (header_only ? " header-only" : "")
-            << " RTP packets and " << rtcp_counter << " RTCP packets to the "
-            << "output file." << std::endl;
-  return 0;
-}
diff --git a/logging/rtc_event_log/rtc_event_log2stats.cc b/logging/rtc_event_log/rtc_event_log2stats.cc
deleted file mode 100644
index 36fa1e3..0000000
--- a/logging/rtc_event_log/rtc_event_log2stats.cc
+++ /dev/null
@@ -1,257 +0,0 @@
-/*
- *  Copyright (c) 2017 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 <inttypes.h>
-#include <stdio.h>
-
-#include <fstream>
-#include <iostream>
-#include <map>
-#include <string>
-#include <tuple>
-#include <utility>
-#include <vector>
-
-#include "webrtc/logging/rtc_event_log/rtc_event_log.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/flags.h"
-#include "webrtc/rtc_base/ignore_wundef.h"
-#include "webrtc/rtc_base/logging.h"
-
-// Files generated at build-time by the protobuf compiler.
-RTC_PUSH_IGNORING_WUNDEF()
-#ifdef WEBRTC_ANDROID_PLATFORM_BUILD
-#include "external/webrtc/webrtc/logging/rtc_event_log/rtc_event_log.pb.h"
-#else
-#include "webrtc/logging/rtc_event_log/rtc_event_log.pb.h"
-#endif
-RTC_POP_IGNORING_WUNDEF()
-
-namespace {
-
-DEFINE_bool(help, false, "Prints this message.");
-
-struct Stats {
-  int count = 0;
-  size_t total_size = 0;
-};
-
-// We are duplicating some parts of the parser here because we want to get
-// access to raw protobuf events.
-std::pair<uint64_t, bool> ParseVarInt(std::istream& stream) {
-  uint64_t varint = 0;
-  for (size_t bytes_read = 0; bytes_read < 10; ++bytes_read) {
-    // The most significant bit of each byte is 0 if it is the last byte in
-    // the varint and 1 otherwise. Thus, we take the 7 least significant bits
-    // of each byte and shift them 7 bits for each byte read previously to get
-    // the (unsigned) integer.
-    int byte = stream.get();
-    if (stream.eof()) {
-      return std::make_pair(varint, false);
-    }
-    RTC_DCHECK_GE(byte, 0);
-    RTC_DCHECK_LE(byte, 255);
-    varint |= static_cast<uint64_t>(byte & 0x7F) << (7 * bytes_read);
-    if ((byte & 0x80) == 0) {
-      return std::make_pair(varint, true);
-    }
-  }
-  return std::make_pair(varint, false);
-}
-
-bool ParseEvents(const std::string& filename,
-                 std::vector<webrtc::rtclog::Event>* events) {
-  std::ifstream stream(filename, std::ios_base::in | std::ios_base::binary);
-  if (!stream.good() || !stream.is_open()) {
-    LOG(LS_WARNING) << "Could not open file for reading.";
-    return false;
-  }
-
-  const size_t kMaxEventSize = (1u << 16) - 1;
-  std::vector<char> tmp_buffer(kMaxEventSize);
-  uint64_t tag;
-  uint64_t message_length;
-  bool success;
-
-  RTC_DCHECK(stream.good());
-
-  while (1) {
-    // Check whether we have reached end of file.
-    stream.peek();
-    if (stream.eof()) {
-      return true;
-    }
-
-    // Read the next message tag. The tag number is defined as
-    // (fieldnumber << 3) | wire_type. In our case, the field number is
-    // supposed to be 1 and the wire type for an length-delimited field is 2.
-    const uint64_t kExpectedTag = (1 << 3) | 2;
-    std::tie(tag, success) = ParseVarInt(stream);
-    if (!success) {
-      LOG(LS_WARNING) << "Missing field tag from beginning of protobuf event.";
-      return false;
-    } else if (tag != kExpectedTag) {
-      LOG(LS_WARNING) << "Unexpected field tag at beginning of protobuf event.";
-      return false;
-    }
-
-    // Read the length field.
-    std::tie(message_length, success) = ParseVarInt(stream);
-    if (!success) {
-      LOG(LS_WARNING) << "Missing message length after protobuf field tag.";
-      return false;
-    } else if (message_length > kMaxEventSize) {
-      LOG(LS_WARNING) << "Protobuf message length is too large.";
-      return false;
-    }
-
-    // Read the next protobuf event to a temporary char buffer.
-    stream.read(tmp_buffer.data(), message_length);
-    if (stream.gcount() != static_cast<int>(message_length)) {
-      LOG(LS_WARNING) << "Failed to read protobuf message from file.";
-      return false;
-    }
-
-    // Parse the protobuf event from the buffer.
-    webrtc::rtclog::Event event;
-    if (!event.ParseFromArray(tmp_buffer.data(), message_length)) {
-      LOG(LS_WARNING) << "Failed to parse protobuf message.";
-      return false;
-    }
-    events->push_back(event);
-  }
-}
-
-// TODO(terelius): Should this be placed in some utility file instead?
-std::string EventTypeToString(webrtc::rtclog::Event::EventType event_type) {
-  switch (event_type) {
-    case webrtc::rtclog::Event::UNKNOWN_EVENT:
-      return "UNKNOWN_EVENT";
-    case webrtc::rtclog::Event::LOG_START:
-      return "LOG_START";
-    case webrtc::rtclog::Event::LOG_END:
-      return "LOG_END";
-    case webrtc::rtclog::Event::RTP_EVENT:
-      return "RTP_EVENT";
-    case webrtc::rtclog::Event::RTCP_EVENT:
-      return "RTCP_EVENT";
-    case webrtc::rtclog::Event::AUDIO_PLAYOUT_EVENT:
-      return "AUDIO_PLAYOUT_EVENT";
-    case webrtc::rtclog::Event::LOSS_BASED_BWE_UPDATE:
-      return "LOSS_BASED_BWE_UPDATE";
-    case webrtc::rtclog::Event::DELAY_BASED_BWE_UPDATE:
-      return "DELAY_BASED_BWE_UPDATE";
-    case webrtc::rtclog::Event::VIDEO_RECEIVER_CONFIG_EVENT:
-      return "VIDEO_RECV_CONFIG";
-    case webrtc::rtclog::Event::VIDEO_SENDER_CONFIG_EVENT:
-      return "VIDEO_SEND_CONFIG";
-    case webrtc::rtclog::Event::AUDIO_RECEIVER_CONFIG_EVENT:
-      return "AUDIO_RECV_CONFIG";
-    case webrtc::rtclog::Event::AUDIO_SENDER_CONFIG_EVENT:
-      return "AUDIO_SEND_CONFIG";
-    case webrtc::rtclog::Event::AUDIO_NETWORK_ADAPTATION_EVENT:
-      return "AUDIO_NETWORK_ADAPTATION";
-    case webrtc::rtclog::Event::BWE_PROBE_CLUSTER_CREATED_EVENT:
-      return "BWE_PROBE_CREATED";
-    case webrtc::rtclog::Event::BWE_PROBE_RESULT_EVENT:
-      return "BWE_PROBE_RESULT";
-  }
-  RTC_NOTREACHED();
-  return "UNKNOWN_EVENT";
-}
-
-}  // namespace
-
-// This utility will print basic information about each packet to stdout.
-// Note that parser will assert if the protobuf event is missing some required
-// fields and we attempt to access them. We don't handle this at the moment.
-int main(int argc, char* argv[]) {
-  std::string program_name = argv[0];
-  std::string usage =
-      "Tool for file usage statistics from an RtcEventLog.\n"
-      "Run " +
-      program_name +
-      " --help for usage.\n"
-      "Example usage:\n" +
-      program_name + " input.rel\n";
-  if (rtc::FlagList::SetFlagsFromCommandLine(&argc, argv, true) ||
-      FLAG_help || argc != 2) {
-    std::cout << usage;
-    if (FLAG_help) {
-      rtc::FlagList::Print(nullptr, false);
-      return 0;
-    }
-    return 1;
-  }
-  std::string file_name = argv[1];
-
-  std::vector<webrtc::rtclog::Event> events;
-  if (!ParseEvents(file_name, &events)) {
-    LOG(LS_ERROR) << "Failed to parse event log.";
-    return -1;
-  }
-
-  // Get file size
-  FILE* file = fopen(file_name.c_str(), "rb");
-  fseek(file, 0L, SEEK_END);
-  int64_t file_size = ftell(file);
-  fclose(file);
-
-  // We are deliberately using low level protobuf functions to get the stats
-  // since the convenience functions in the parser would CHECK that the events
-  // are well formed.
-  std::map<webrtc::rtclog::Event::EventType, Stats> stats;
-  int malformed_events = 0;
-  size_t malformed_event_size = 0;
-  size_t accumulated_event_size = 0;
-  for (const webrtc::rtclog::Event& event : events) {
-    size_t serialized_size = event.ByteSize();
-    // When the event is written on the disk, it is part of an EventStream
-    // object. The event stream will prepend a 1 byte field number/wire type,
-    // and a varint encoding (base 128) of the event length.
-    serialized_size =
-        1 + (1 + (serialized_size > 127) + (serialized_size > 16383)) +
-        serialized_size;
-
-    if (event.has_type() && event.has_timestamp_us()) {
-      stats[event.type()].count++;
-      stats[event.type()].total_size += serialized_size;
-    } else {
-      // The event is missing the type or the timestamp field.
-      malformed_events++;
-      malformed_event_size += serialized_size;
-    }
-    accumulated_event_size += serialized_size;
-  }
-
-  printf("Type                  \tCount\tTotal size\tAverage size\tPercent\n");
-  printf(
-      "-----------------------------------------------------------------------"
-      "\n");
-  for (const auto it : stats) {
-    printf("%-22s\t%5d\t%10zu\t%12.2lf\t%7.2lf\n",
-           EventTypeToString(it.first).c_str(), it.second.count,
-           it.second.total_size,
-           static_cast<double>(it.second.total_size) / it.second.count,
-           static_cast<double>(it.second.total_size) / file_size * 100);
-  }
-  if (malformed_events != 0) {
-    printf("%-22s\t%5d\t%10zu\t%12.2lf\t%7.2lf\n", "MALFORMED",
-           malformed_events, malformed_event_size,
-           static_cast<double>(malformed_event_size) / malformed_events,
-           static_cast<double>(malformed_event_size) / file_size * 100);
-  }
-  if (file_size - accumulated_event_size != 0) {
-    printf("WARNING: %" PRId64 " bytes not accounted for\n",
-           file_size - accumulated_event_size);
-  }
-
-  return 0;
-}
diff --git a/logging/rtc_event_log/rtc_event_log2text.cc b/logging/rtc_event_log/rtc_event_log2text.cc
deleted file mode 100644
index 0f9d674..0000000
--- a/logging/rtc_event_log/rtc_event_log2text.cc
+++ /dev/null
@@ -1,575 +0,0 @@
-/*
- *  Copyright (c) 2017 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 <string.h>
-
-#include <iostream>
-#include <map>
-#include <sstream>
-#include <string>
-#include <utility>  // pair
-
-#include "webrtc/call/video_config.h"
-#include "webrtc/common_types.h"
-#include "webrtc/logging/rtc_event_log/rtc_event_log_parser.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/bye.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/common_header.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/extended_reports.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/fir.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/nack.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/pli.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/rapid_resync_request.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/receiver_report.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/remb.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/sdes.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/sender_report.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/tmmbn.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/tmmbr.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/transport_feedback.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_header_extensions.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_utility.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/flags.h"
-
-namespace {
-
-DEFINE_bool(config, true, "Use --noconfig to exclude stream configurations.");
-DEFINE_bool(incoming, true, "Use --noincoming to exclude incoming packets.");
-DEFINE_bool(outgoing, true, "Use --nooutgoing to exclude packets.");
-// TODO(terelius): Note that the media type doesn't work with outgoing packets.
-DEFINE_bool(audio, true, "Use --noaudio to exclude audio packets.");
-// TODO(terelius): Note that the media type doesn't work with outgoing packets.
-DEFINE_bool(video, true, "Use --novideo to exclude video packets.");
-// TODO(terelius): Note that the media type doesn't work with outgoing packets.
-DEFINE_bool(data, true, "Use --nodata to exclude data packets.");
-DEFINE_bool(rtp, true, "Use --nortp to exclude RTP packets.");
-DEFINE_bool(rtcp, true, "Use --nortcp to exclude RTCP packets.");
-// TODO(terelius): Allow a list of SSRCs.
-DEFINE_string(ssrc,
-              "",
-              "Print only packets with this SSRC (decimal or hex, the latter "
-              "starting with 0x).");
-DEFINE_bool(help, false, "Prints this message.");
-
-using MediaType = webrtc::ParsedRtcEventLog::MediaType;
-
-static uint32_t filtered_ssrc = 0;
-
-// Parses the input string for a valid SSRC. If a valid SSRC is found, it is
-// written to the static global variable |filtered_ssrc|, and true is returned.
-// Otherwise, false is returned.
-// The empty string must be validated as true, because it is the default value
-// of the command-line flag. In this case, no value is written to the output
-// variable.
-bool ParseSsrc(std::string str) {
-  // If the input string starts with 0x or 0X it indicates a hexadecimal number.
-  auto read_mode = std::dec;
-  if (str.size() > 2 &&
-      (str.substr(0, 2) == "0x" || str.substr(0, 2) == "0X")) {
-    read_mode = std::hex;
-    str = str.substr(2);
-  }
-  std::stringstream ss(str);
-  ss >> read_mode >> filtered_ssrc;
-  return str.empty() || (!ss.fail() && ss.eof());
-}
-
-bool ExcludePacket(webrtc::PacketDirection direction,
-                   MediaType media_type,
-                   uint32_t packet_ssrc) {
-  if (!FLAG_outgoing && direction == webrtc::kOutgoingPacket)
-    return true;
-  if (!FLAG_incoming && direction == webrtc::kIncomingPacket)
-    return true;
-  if (!FLAG_audio && media_type == MediaType::AUDIO)
-    return true;
-  if (!FLAG_video && media_type == MediaType::VIDEO)
-    return true;
-  if (!FLAG_data && media_type == MediaType::DATA)
-    return true;
-  if (strlen(FLAG_ssrc) > 0 && packet_ssrc != filtered_ssrc)
-    return true;
-  return false;
-}
-
-const char* StreamInfo(webrtc::PacketDirection direction,
-                       MediaType media_type) {
-  if (direction == webrtc::kOutgoingPacket) {
-    if (media_type == MediaType::AUDIO)
-      return "(out,audio)";
-    else if (media_type == MediaType::VIDEO)
-      return "(out,video)";
-    else if (media_type == MediaType::DATA)
-      return "(out,data)";
-    else
-      return "(out)";
-  }
-  if (direction == webrtc::kIncomingPacket) {
-    if (media_type == MediaType::AUDIO)
-      return "(in,audio)";
-    else if (media_type == MediaType::VIDEO)
-      return "(in,video)";
-    else if (media_type == MediaType::DATA)
-      return "(in,data)";
-    else
-      return "(in)";
-  }
-  return "(unknown)";
-}
-
-// Return default values for header extensions, to use on streams without stored
-// mapping data. Currently this only applies to audio streams, since the mapping
-// is not stored in the event log.
-// TODO(ivoc): Remove this once this mapping is stored in the event log for
-//             audio streams. Tracking bug: webrtc:6399
-webrtc::RtpHeaderExtensionMap GetDefaultHeaderExtensionMap() {
-  webrtc::RtpHeaderExtensionMap default_map;
-  default_map.Register<webrtc::AudioLevel>(
-      webrtc::RtpExtension::kAudioLevelDefaultId);
-  default_map.Register<webrtc::TransmissionOffset>(
-      webrtc::RtpExtension::kTimestampOffsetDefaultId);
-  default_map.Register<webrtc::AbsoluteSendTime>(
-      webrtc::RtpExtension::kAbsSendTimeDefaultId);
-  default_map.Register<webrtc::VideoOrientation>(
-      webrtc::RtpExtension::kVideoRotationDefaultId);
-  default_map.Register<webrtc::VideoContentTypeExtension>(
-      webrtc::RtpExtension::kVideoContentTypeDefaultId);
-  default_map.Register<webrtc::VideoTimingExtension>(
-      webrtc::RtpExtension::kVideoTimingDefaultId);
-  default_map.Register<webrtc::TransportSequenceNumber>(
-      webrtc::RtpExtension::kTransportSequenceNumberDefaultId);
-  default_map.Register<webrtc::PlayoutDelayLimits>(
-      webrtc::RtpExtension::kPlayoutDelayDefaultId);
-  return default_map;
-}
-
-void PrintSenderReport(const webrtc::ParsedRtcEventLog& parsed_stream,
-                       const webrtc::rtcp::CommonHeader& rtcp_block,
-                       uint64_t log_timestamp,
-                       webrtc::PacketDirection direction) {
-  webrtc::rtcp::SenderReport sr;
-  if (!sr.Parse(rtcp_block))
-    return;
-  MediaType media_type =
-      parsed_stream.GetMediaType(sr.sender_ssrc(), direction);
-  if (ExcludePacket(direction, media_type, sr.sender_ssrc()))
-    return;
-  std::cout << log_timestamp << "\t"
-            << "RTCP_SR" << StreamInfo(direction, media_type)
-            << "\tssrc=" << sr.sender_ssrc()
-            << "\ttimestamp=" << sr.rtp_timestamp() << std::endl;
-}
-
-void PrintReceiverReport(const webrtc::ParsedRtcEventLog& parsed_stream,
-                         const webrtc::rtcp::CommonHeader& rtcp_block,
-                         uint64_t log_timestamp,
-                         webrtc::PacketDirection direction) {
-  webrtc::rtcp::ReceiverReport rr;
-  if (!rr.Parse(rtcp_block))
-    return;
-  MediaType media_type =
-      parsed_stream.GetMediaType(rr.sender_ssrc(), direction);
-  if (ExcludePacket(direction, media_type, rr.sender_ssrc()))
-    return;
-  std::cout << log_timestamp << "\t"
-            << "RTCP_RR" << StreamInfo(direction, media_type)
-            << "\tssrc=" << rr.sender_ssrc() << std::endl;
-}
-
-void PrintXr(const webrtc::ParsedRtcEventLog& parsed_stream,
-             const webrtc::rtcp::CommonHeader& rtcp_block,
-             uint64_t log_timestamp,
-             webrtc::PacketDirection direction) {
-  webrtc::rtcp::ExtendedReports xr;
-  if (!xr.Parse(rtcp_block))
-    return;
-  MediaType media_type =
-      parsed_stream.GetMediaType(xr.sender_ssrc(), direction);
-  if (ExcludePacket(direction, media_type, xr.sender_ssrc()))
-    return;
-  std::cout << log_timestamp << "\t"
-            << "RTCP_XR" << StreamInfo(direction, media_type)
-            << "\tssrc=" << xr.sender_ssrc() << std::endl;
-}
-
-void PrintSdes(const webrtc::rtcp::CommonHeader& rtcp_block,
-               uint64_t log_timestamp,
-               webrtc::PacketDirection direction) {
-  std::cout << log_timestamp << "\t"
-            << "RTCP_SDES" << StreamInfo(direction, MediaType::ANY)
-            << std::endl;
-  RTC_NOTREACHED() << "SDES should have been redacted when writing the log";
-}
-
-void PrintBye(const webrtc::ParsedRtcEventLog& parsed_stream,
-              const webrtc::rtcp::CommonHeader& rtcp_block,
-              uint64_t log_timestamp,
-              webrtc::PacketDirection direction) {
-  webrtc::rtcp::Bye bye;
-  if (!bye.Parse(rtcp_block))
-    return;
-  MediaType media_type =
-      parsed_stream.GetMediaType(bye.sender_ssrc(), direction);
-  if (ExcludePacket(direction, media_type, bye.sender_ssrc()))
-    return;
-  std::cout << log_timestamp << "\t"
-            << "RTCP_BYE" << StreamInfo(direction, media_type)
-            << "\tssrc=" << bye.sender_ssrc() << std::endl;
-}
-
-void PrintRtpFeedback(const webrtc::ParsedRtcEventLog& parsed_stream,
-                      const webrtc::rtcp::CommonHeader& rtcp_block,
-                      uint64_t log_timestamp,
-                      webrtc::PacketDirection direction) {
-  switch (rtcp_block.fmt()) {
-    case webrtc::rtcp::Nack::kFeedbackMessageType: {
-      webrtc::rtcp::Nack nack;
-      if (!nack.Parse(rtcp_block))
-        return;
-      MediaType media_type =
-          parsed_stream.GetMediaType(nack.sender_ssrc(), direction);
-      if (ExcludePacket(direction, media_type, nack.sender_ssrc()))
-        return;
-      std::cout << log_timestamp << "\t"
-                << "RTCP_NACK" << StreamInfo(direction, media_type)
-                << "\tssrc=" << nack.sender_ssrc() << std::endl;
-      break;
-    }
-    case webrtc::rtcp::Tmmbr::kFeedbackMessageType: {
-      webrtc::rtcp::Tmmbr tmmbr;
-      if (!tmmbr.Parse(rtcp_block))
-        return;
-      MediaType media_type =
-          parsed_stream.GetMediaType(tmmbr.sender_ssrc(), direction);
-      if (ExcludePacket(direction, media_type, tmmbr.sender_ssrc()))
-        return;
-      std::cout << log_timestamp << "\t"
-                << "RTCP_TMMBR" << StreamInfo(direction, media_type)
-                << "\tssrc=" << tmmbr.sender_ssrc() << std::endl;
-      break;
-    }
-    case webrtc::rtcp::Tmmbn::kFeedbackMessageType: {
-      webrtc::rtcp::Tmmbn tmmbn;
-      if (!tmmbn.Parse(rtcp_block))
-        return;
-      MediaType media_type =
-          parsed_stream.GetMediaType(tmmbn.sender_ssrc(), direction);
-      if (ExcludePacket(direction, media_type, tmmbn.sender_ssrc()))
-        return;
-      std::cout << log_timestamp << "\t"
-                << "RTCP_TMMBN" << StreamInfo(direction, media_type)
-                << "\tssrc=" << tmmbn.sender_ssrc() << std::endl;
-      break;
-    }
-    case webrtc::rtcp::RapidResyncRequest::kFeedbackMessageType: {
-      webrtc::rtcp::RapidResyncRequest sr_req;
-      if (!sr_req.Parse(rtcp_block))
-        return;
-      MediaType media_type =
-          parsed_stream.GetMediaType(sr_req.sender_ssrc(), direction);
-      if (ExcludePacket(direction, media_type, sr_req.sender_ssrc()))
-        return;
-      std::cout << log_timestamp << "\t"
-                << "RTCP_SRREQ" << StreamInfo(direction, media_type)
-                << "\tssrc=" << sr_req.sender_ssrc() << std::endl;
-      break;
-    }
-    case webrtc::rtcp::TransportFeedback::kFeedbackMessageType: {
-      webrtc::rtcp::TransportFeedback transport_feedback;
-      if (!transport_feedback.Parse(rtcp_block))
-        return;
-      MediaType media_type = parsed_stream.GetMediaType(
-          transport_feedback.sender_ssrc(), direction);
-      if (ExcludePacket(direction, media_type,
-                        transport_feedback.sender_ssrc()))
-        return;
-      std::cout << log_timestamp << "\t"
-                << "RTCP_NEWFB" << StreamInfo(direction, media_type)
-                << "\tssrc=" << transport_feedback.sender_ssrc() << std::endl;
-      break;
-    }
-    default:
-      break;
-  }
-}
-
-void PrintPsFeedback(const webrtc::ParsedRtcEventLog& parsed_stream,
-                     const webrtc::rtcp::CommonHeader& rtcp_block,
-                     uint64_t log_timestamp,
-                     webrtc::PacketDirection direction) {
-  switch (rtcp_block.fmt()) {
-    case webrtc::rtcp::Pli::kFeedbackMessageType: {
-      webrtc::rtcp::Pli pli;
-      if (!pli.Parse(rtcp_block))
-        return;
-      MediaType media_type =
-          parsed_stream.GetMediaType(pli.sender_ssrc(), direction);
-      if (ExcludePacket(direction, media_type, pli.sender_ssrc()))
-        return;
-      std::cout << log_timestamp << "\t"
-                << "RTCP_PLI" << StreamInfo(direction, media_type)
-                << "\tssrc=" << pli.sender_ssrc() << std::endl;
-      break;
-    }
-    case webrtc::rtcp::Fir::kFeedbackMessageType: {
-      webrtc::rtcp::Fir fir;
-      if (!fir.Parse(rtcp_block))
-        return;
-      MediaType media_type =
-          parsed_stream.GetMediaType(fir.sender_ssrc(), direction);
-      if (ExcludePacket(direction, media_type, fir.sender_ssrc()))
-        return;
-      std::cout << log_timestamp << "\t"
-                << "RTCP_FIR" << StreamInfo(direction, media_type)
-                << "\tssrc=" << fir.sender_ssrc() << std::endl;
-      break;
-    }
-    case webrtc::rtcp::Remb::kFeedbackMessageType: {
-      webrtc::rtcp::Remb remb;
-      if (!remb.Parse(rtcp_block))
-        return;
-      MediaType media_type =
-          parsed_stream.GetMediaType(remb.sender_ssrc(), direction);
-      if (ExcludePacket(direction, media_type, remb.sender_ssrc()))
-        return;
-      std::cout << log_timestamp << "\t"
-                << "RTCP_REMB" << StreamInfo(direction, media_type)
-                << "\tssrc=" << remb.sender_ssrc() << std::endl;
-      break;
-    }
-    default:
-      break;
-  }
-}
-
-}  // namespace
-
-// This utility will print basic information about each packet to stdout.
-// Note that parser will assert if the protobuf event is missing some required
-// fields and we attempt to access them. We don't handle this at the moment.
-int main(int argc, char* argv[]) {
-  std::string program_name = argv[0];
-  std::string usage =
-      "Tool for printing packet information from an RtcEventLog as text.\n"
-      "Run " +
-      program_name +
-      " --help for usage.\n"
-      "Example usage:\n" +
-      program_name + " input.rel\n";
-  if (rtc::FlagList::SetFlagsFromCommandLine(&argc, argv, true) ||
-      FLAG_help || argc != 2) {
-    std::cout << usage;
-    if (FLAG_help) {
-      rtc::FlagList::Print(nullptr, false);
-      return 0;
-    }
-    return 1;
-  }
-  std::string input_file = argv[1];
-
-  if (strlen(FLAG_ssrc) > 0)
-    RTC_CHECK(ParseSsrc(FLAG_ssrc)) << "Flag verification has failed.";
-
-  webrtc::RtpHeaderExtensionMap default_map = GetDefaultHeaderExtensionMap();
-
-  webrtc::ParsedRtcEventLog parsed_stream;
-  if (!parsed_stream.ParseFile(input_file)) {
-    std::cerr << "Error while parsing input file: " << input_file << std::endl;
-    return -1;
-  }
-
-  for (size_t i = 0; i < parsed_stream.GetNumberOfEvents(); i++) {
-    if (FLAG_config && FLAG_video && FLAG_incoming &&
-        parsed_stream.GetEventType(i) ==
-            webrtc::ParsedRtcEventLog::VIDEO_RECEIVER_CONFIG_EVENT) {
-      webrtc::rtclog::StreamConfig config =
-          parsed_stream.GetVideoReceiveConfig(i);
-      std::cout << parsed_stream.GetTimestamp(i) << "\tVIDEO_RECV_CONFIG"
-                << "\tssrc=" << config.remote_ssrc
-                << "\tfeedback_ssrc=" << config.local_ssrc;
-      std::cout << "\textensions={";
-      for (const auto& extension : config.rtp_extensions) {
-        std::cout << extension.ToString() << ",";
-      }
-      std::cout << "}";
-      std::cout << "\tcodecs={";
-      for (const auto& codec : config.codecs) {
-        std::cout << "{name: " << codec.payload_name
-                  << ", payload_type: " << codec.payload_type
-                  << ", rtx_payload_type: " << codec.rtx_payload_type << "}";
-      }
-      std::cout << "}" << std::endl;
-    }
-    if (FLAG_config && FLAG_video && FLAG_outgoing &&
-        parsed_stream.GetEventType(i) ==
-            webrtc::ParsedRtcEventLog::VIDEO_SENDER_CONFIG_EVENT) {
-      std::vector<webrtc::rtclog::StreamConfig> configs =
-          parsed_stream.GetVideoSendConfig(i);
-      for (const auto& config : configs) {
-        std::cout << parsed_stream.GetTimestamp(i) << "\tVIDEO_SEND_CONFIG";
-        std::cout << "\tssrcs=" << config.local_ssrc;
-        std::cout << "\trtx_ssrcs=" << config.rtx_ssrc;
-        std::cout << "\textensions={";
-        for (const auto& extension : config.rtp_extensions) {
-          std::cout << extension.ToString() << ",";
-        }
-        std::cout << "}";
-        std::cout << "\tcodecs={";
-        for (const auto& codec : config.codecs) {
-          std::cout << "{name: " << codec.payload_name
-                    << ", payload_type: " << codec.payload_type
-                    << ", rtx_payload_type: " << codec.rtx_payload_type << "}";
-        }
-        std::cout << "}" << std::endl;
-      }
-    }
-    if (FLAG_config && FLAG_audio && FLAG_incoming &&
-        parsed_stream.GetEventType(i) ==
-            webrtc::ParsedRtcEventLog::AUDIO_RECEIVER_CONFIG_EVENT) {
-      webrtc::rtclog::StreamConfig config =
-          parsed_stream.GetAudioReceiveConfig(i);
-      std::cout << parsed_stream.GetTimestamp(i) << "\tAUDIO_RECV_CONFIG"
-                << "\tssrc=" << config.remote_ssrc
-                << "\tfeedback_ssrc=" << config.local_ssrc;
-      std::cout << "\textensions={";
-      for (const auto& extension : config.rtp_extensions) {
-        std::cout << extension.ToString() << ",";
-      }
-      std::cout << "}";
-      std::cout << "\tcodecs={";
-      for (const auto& codec : config.codecs) {
-        std::cout << "{name: " << codec.payload_name
-                  << ", payload_type: " << codec.payload_type
-                  << ", rtx_payload_type: " << codec.rtx_payload_type << "}";
-      }
-      std::cout << "}" << std::endl;
-    }
-    if (FLAG_config && FLAG_audio && FLAG_outgoing &&
-        parsed_stream.GetEventType(i) ==
-            webrtc::ParsedRtcEventLog::AUDIO_SENDER_CONFIG_EVENT) {
-      webrtc::rtclog::StreamConfig config = parsed_stream.GetAudioSendConfig(i);
-      std::cout << parsed_stream.GetTimestamp(i) << "\tAUDIO_SEND_CONFIG"
-                << "\tssrc=" << config.local_ssrc;
-      std::cout << "\textensions={";
-      for (const auto& extension : config.rtp_extensions) {
-        std::cout << extension.ToString() << ",";
-      }
-      std::cout << "}";
-      std::cout << "\tcodecs={";
-      for (const auto& codec : config.codecs) {
-        std::cout << "{name: " << codec.payload_name
-                  << ", payload_type: " << codec.payload_type
-                  << ", rtx_payload_type: " << codec.rtx_payload_type << "}";
-      }
-      std::cout << "}" << std::endl;
-    }
-    if (FLAG_rtp &&
-        parsed_stream.GetEventType(i) == webrtc::ParsedRtcEventLog::RTP_EVENT) {
-      size_t header_length;
-      size_t total_length;
-      uint8_t header[IP_PACKET_SIZE];
-      webrtc::PacketDirection direction;
-      webrtc::RtpHeaderExtensionMap* extension_map = parsed_stream.GetRtpHeader(
-          i, &direction, header, &header_length, &total_length);
-
-      if (extension_map == nullptr)
-        extension_map = &default_map;
-
-      // Parse header to get SSRC and RTP time.
-      webrtc::RtpUtility::RtpHeaderParser rtp_parser(header, header_length);
-      webrtc::RTPHeader parsed_header;
-      rtp_parser.Parse(&parsed_header, extension_map);
-      MediaType media_type =
-          parsed_stream.GetMediaType(parsed_header.ssrc, direction);
-
-      if (ExcludePacket(direction, media_type, parsed_header.ssrc))
-        continue;
-
-      std::cout << parsed_stream.GetTimestamp(i) << "\tRTP"
-                << StreamInfo(direction, media_type)
-                << "\tssrc=" << parsed_header.ssrc
-                << "\ttimestamp=" << parsed_header.timestamp;
-      if (parsed_header.extension.hasAbsoluteSendTime) {
-        std::cout << "\tAbsSendTime="
-                  << parsed_header.extension.absoluteSendTime;
-      }
-      if (parsed_header.extension.hasVideoContentType) {
-        std::cout << "\tContentType="
-                  << static_cast<int>(parsed_header.extension.videoContentType);
-      }
-      if (parsed_header.extension.hasVideoRotation) {
-        std::cout << "\tRotation="
-                  << static_cast<int>(parsed_header.extension.videoRotation);
-      }
-      if (parsed_header.extension.hasTransportSequenceNumber) {
-        std::cout << "\tTransportSeq="
-                  << parsed_header.extension.transportSequenceNumber;
-      }
-      if (parsed_header.extension.hasTransmissionTimeOffset) {
-        std::cout << "\tTransmTimeOffset="
-                  << parsed_header.extension.transmissionTimeOffset;
-      }
-      if (parsed_header.extension.hasAudioLevel) {
-        std::cout << "\tAudioLevel=" << parsed_header.extension.audioLevel;
-      }
-      std::cout << std::endl;
-    }
-    if (FLAG_rtcp && parsed_stream.GetEventType(i) ==
-                         webrtc::ParsedRtcEventLog::RTCP_EVENT) {
-      size_t length;
-      uint8_t packet[IP_PACKET_SIZE];
-      webrtc::PacketDirection direction;
-      parsed_stream.GetRtcpPacket(i, &direction, packet, &length);
-
-      webrtc::rtcp::CommonHeader rtcp_block;
-      const uint8_t* packet_end = packet + length;
-      for (const uint8_t* next_block = packet; next_block != packet_end;
-           next_block = rtcp_block.NextPacket()) {
-        ptrdiff_t remaining_blocks_size = packet_end - next_block;
-        RTC_DCHECK_GT(remaining_blocks_size, 0);
-        if (!rtcp_block.Parse(next_block, remaining_blocks_size)) {
-          break;
-        }
-
-        uint64_t log_timestamp = parsed_stream.GetTimestamp(i);
-        switch (rtcp_block.type()) {
-          case webrtc::rtcp::SenderReport::kPacketType:
-            PrintSenderReport(parsed_stream, rtcp_block, log_timestamp,
-                              direction);
-            break;
-          case webrtc::rtcp::ReceiverReport::kPacketType:
-            PrintReceiverReport(parsed_stream, rtcp_block, log_timestamp,
-                                direction);
-            break;
-          case webrtc::rtcp::Sdes::kPacketType:
-            PrintSdes(rtcp_block, log_timestamp, direction);
-            break;
-          case webrtc::rtcp::ExtendedReports::kPacketType:
-            PrintXr(parsed_stream, rtcp_block, log_timestamp, direction);
-            break;
-          case webrtc::rtcp::Bye::kPacketType:
-            PrintBye(parsed_stream, rtcp_block, log_timestamp, direction);
-            break;
-          case webrtc::rtcp::Rtpfb::kPacketType:
-            PrintRtpFeedback(parsed_stream, rtcp_block, log_timestamp,
-                             direction);
-            break;
-          case webrtc::rtcp::Psfb::kPacketType:
-            PrintPsFeedback(parsed_stream, rtcp_block, log_timestamp,
-                            direction);
-            break;
-          default:
-            break;
-        }
-      }
-    }
-  }
-  return 0;
-}
diff --git a/logging/rtc_event_log/rtc_event_log_factory.cc b/logging/rtc_event_log/rtc_event_log_factory.cc
deleted file mode 100644
index 4a826fb..0000000
--- a/logging/rtc_event_log/rtc_event_log_factory.cc
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- *  Copyright 2017 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/logging/rtc_event_log/rtc_event_log_factory.h"
-
-#include "webrtc/logging/rtc_event_log/rtc_event_log.h"
-
-namespace webrtc {
-
-std::unique_ptr<RtcEventLog> RtcEventLogFactory::CreateRtcEventLog() {
-  return RtcEventLog::Create();
-}
-
-std::unique_ptr<RtcEventLogFactoryInterface> CreateRtcEventLogFactory() {
-  return std::unique_ptr<RtcEventLogFactoryInterface>(new RtcEventLogFactory());
-}
-
-}  // namespace webrtc
diff --git a/logging/rtc_event_log/rtc_event_log_factory.h b/logging/rtc_event_log/rtc_event_log_factory.h
deleted file mode 100644
index 53a18c6..0000000
--- a/logging/rtc_event_log/rtc_event_log_factory.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- *  Copyright 2017 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_LOGGING_RTC_EVENT_LOG_RTC_EVENT_LOG_FACTORY_H_
-#define WEBRTC_LOGGING_RTC_EVENT_LOG_RTC_EVENT_LOG_FACTORY_H_
-
-#include <memory>
-
-#include "webrtc/logging/rtc_event_log/rtc_event_log_factory_interface.h"
-
-namespace webrtc {
-
-class RtcEventLogFactory : public RtcEventLogFactoryInterface {
- public:
-  ~RtcEventLogFactory() override {}
-
-  std::unique_ptr<RtcEventLog> CreateRtcEventLog() override;
-};
-
-std::unique_ptr<RtcEventLogFactoryInterface> CreateRtcEventLogFactory();
-}  // namespace webrtc
-
-#endif  // WEBRTC_LOGGING_RTC_EVENT_LOG_RTC_EVENT_LOG_FACTORY_H_
diff --git a/logging/rtc_event_log/rtc_event_log_factory_interface.h b/logging/rtc_event_log/rtc_event_log_factory_interface.h
deleted file mode 100644
index e3b7a67..0000000
--- a/logging/rtc_event_log/rtc_event_log_factory_interface.h
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- *  Copyright 2017 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_LOGGING_RTC_EVENT_LOG_RTC_EVENT_LOG_FACTORY_INTERFACE_H_
-#define WEBRTC_LOGGING_RTC_EVENT_LOG_RTC_EVENT_LOG_FACTORY_INTERFACE_H_
-
-#include <memory>
-
-#include "webrtc/logging/rtc_event_log/rtc_event_log.h"
-
-namespace webrtc {
-
-// This interface exists to allow webrtc to be optionally built without
-// RtcEventLog support. A PeerConnectionFactory is constructed with an
-// RtcEventLogFactoryInterface, which may or may not be null.
-class RtcEventLogFactoryInterface {
- public:
-  virtual ~RtcEventLogFactoryInterface() {}
-
-  virtual std::unique_ptr<RtcEventLog> CreateRtcEventLog() = 0;
-};
-
-std::unique_ptr<RtcEventLogFactoryInterface> CreateRtcEventLogFactory();
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_LOGGING_RTC_EVENT_LOG_RTC_EVENT_LOG_FACTORY_INTERFACE_H_
diff --git a/logging/rtc_event_log/rtc_event_log_parser.cc b/logging/rtc_event_log/rtc_event_log_parser.cc
deleted file mode 100644
index a7237ee..0000000
--- a/logging/rtc_event_log/rtc_event_log_parser.cc
+++ /dev/null
@@ -1,657 +0,0 @@
-/*
- *  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/logging/rtc_event_log/rtc_event_log_parser.h"
-
-#include <stdint.h>
-#include <string.h>
-
-#include <algorithm>
-#include <fstream>
-#include <istream>
-#include <map>
-#include <utility>
-
-#include "webrtc/logging/rtc_event_log/rtc_event_log.h"
-#include "webrtc/modules/audio_coding/audio_network_adaptor/include/audio_network_adaptor.h"
-#include "webrtc/modules/remote_bitrate_estimator/include/bwe_defines.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/protobuf_utils.h"
-
-namespace webrtc {
-
-namespace {
-RtcpMode GetRuntimeRtcpMode(rtclog::VideoReceiveConfig::RtcpMode rtcp_mode) {
-  switch (rtcp_mode) {
-    case rtclog::VideoReceiveConfig::RTCP_COMPOUND:
-      return RtcpMode::kCompound;
-    case rtclog::VideoReceiveConfig::RTCP_REDUCEDSIZE:
-      return RtcpMode::kReducedSize;
-  }
-  RTC_NOTREACHED();
-  return RtcpMode::kOff;
-}
-
-ParsedRtcEventLog::EventType GetRuntimeEventType(
-    rtclog::Event::EventType event_type) {
-  switch (event_type) {
-    case rtclog::Event::UNKNOWN_EVENT:
-      return ParsedRtcEventLog::EventType::UNKNOWN_EVENT;
-    case rtclog::Event::LOG_START:
-      return ParsedRtcEventLog::EventType::LOG_START;
-    case rtclog::Event::LOG_END:
-      return ParsedRtcEventLog::EventType::LOG_END;
-    case rtclog::Event::RTP_EVENT:
-      return ParsedRtcEventLog::EventType::RTP_EVENT;
-    case rtclog::Event::RTCP_EVENT:
-      return ParsedRtcEventLog::EventType::RTCP_EVENT;
-    case rtclog::Event::AUDIO_PLAYOUT_EVENT:
-      return ParsedRtcEventLog::EventType::AUDIO_PLAYOUT_EVENT;
-    case rtclog::Event::LOSS_BASED_BWE_UPDATE:
-      return ParsedRtcEventLog::EventType::LOSS_BASED_BWE_UPDATE;
-    case rtclog::Event::DELAY_BASED_BWE_UPDATE:
-      return ParsedRtcEventLog::EventType::DELAY_BASED_BWE_UPDATE;
-    case rtclog::Event::VIDEO_RECEIVER_CONFIG_EVENT:
-      return ParsedRtcEventLog::EventType::VIDEO_RECEIVER_CONFIG_EVENT;
-    case rtclog::Event::VIDEO_SENDER_CONFIG_EVENT:
-      return ParsedRtcEventLog::EventType::VIDEO_SENDER_CONFIG_EVENT;
-    case rtclog::Event::AUDIO_RECEIVER_CONFIG_EVENT:
-      return ParsedRtcEventLog::EventType::AUDIO_RECEIVER_CONFIG_EVENT;
-    case rtclog::Event::AUDIO_SENDER_CONFIG_EVENT:
-      return ParsedRtcEventLog::EventType::AUDIO_SENDER_CONFIG_EVENT;
-    case rtclog::Event::AUDIO_NETWORK_ADAPTATION_EVENT:
-      return ParsedRtcEventLog::EventType::AUDIO_NETWORK_ADAPTATION_EVENT;
-    case rtclog::Event::BWE_PROBE_CLUSTER_CREATED_EVENT:
-      return ParsedRtcEventLog::EventType::BWE_PROBE_CLUSTER_CREATED_EVENT;
-    case rtclog::Event::BWE_PROBE_RESULT_EVENT:
-      return ParsedRtcEventLog::EventType::BWE_PROBE_RESULT_EVENT;
-  }
-  RTC_NOTREACHED();
-  return ParsedRtcEventLog::EventType::UNKNOWN_EVENT;
-}
-
-BandwidthUsage GetRuntimeDetectorState(
-    rtclog::DelayBasedBweUpdate::DetectorState detector_state) {
-  switch (detector_state) {
-    case rtclog::DelayBasedBweUpdate::BWE_NORMAL:
-      return BandwidthUsage::kBwNormal;
-    case rtclog::DelayBasedBweUpdate::BWE_UNDERUSING:
-      return BandwidthUsage::kBwUnderusing;
-    case rtclog::DelayBasedBweUpdate::BWE_OVERUSING:
-      return BandwidthUsage::kBwOverusing;
-  }
-  RTC_NOTREACHED();
-  return BandwidthUsage::kBwNormal;
-}
-
-std::pair<uint64_t, bool> ParseVarInt(std::istream& stream) {
-  uint64_t varint = 0;
-  for (size_t bytes_read = 0; bytes_read < 10; ++bytes_read) {
-    // The most significant bit of each byte is 0 if it is the last byte in
-    // the varint and 1 otherwise. Thus, we take the 7 least significant bits
-    // of each byte and shift them 7 bits for each byte read previously to get
-    // the (unsigned) integer.
-    int byte = stream.get();
-    if (stream.eof()) {
-      return std::make_pair(varint, false);
-    }
-    RTC_DCHECK_GE(byte, 0);
-    RTC_DCHECK_LE(byte, 255);
-    varint |= static_cast<uint64_t>(byte & 0x7F) << (7 * bytes_read);
-    if ((byte & 0x80) == 0) {
-      return std::make_pair(varint, true);
-    }
-  }
-  return std::make_pair(varint, false);
-}
-
-void GetHeaderExtensions(
-    std::vector<RtpExtension>* header_extensions,
-    const RepeatedPtrField<rtclog::RtpHeaderExtension>&
-    proto_header_extensions) {
-  header_extensions->clear();
-  for (auto& p : proto_header_extensions) {
-    RTC_CHECK(p.has_name());
-    RTC_CHECK(p.has_id());
-    const std::string& name = p.name();
-    int id = p.id();
-    header_extensions->push_back(RtpExtension(name, id));
-  }
-}
-
-}  // namespace
-
-bool ParsedRtcEventLog::ParseFile(const std::string& filename) {
-  std::ifstream file(filename, std::ios_base::in | std::ios_base::binary);
-  if (!file.good() || !file.is_open()) {
-    LOG(LS_WARNING) << "Could not open file for reading.";
-    return false;
-  }
-
-  return ParseStream(file);
-}
-
-bool ParsedRtcEventLog::ParseString(const std::string& s) {
-  std::istringstream stream(s, std::ios_base::in | std::ios_base::binary);
-  return ParseStream(stream);
-}
-
-bool ParsedRtcEventLog::ParseStream(std::istream& stream) {
-  events_.clear();
-  const size_t kMaxEventSize = (1u << 16) - 1;
-  std::vector<char> tmp_buffer(kMaxEventSize);
-  uint64_t tag;
-  uint64_t message_length;
-  bool success;
-
-  RTC_DCHECK(stream.good());
-
-  while (1) {
-    // Check whether we have reached end of file.
-    stream.peek();
-    if (stream.eof()) {
-      // Process all extensions maps for faster look-up later.
-      for (auto& event_stream : streams_) {
-        rtp_extensions_maps_[StreamId(event_stream.ssrc,
-                                      event_stream.direction)] =
-            &event_stream.rtp_extensions_map;
-      }
-      return true;
-    }
-
-    // Read the next message tag. The tag number is defined as
-    // (fieldnumber << 3) | wire_type. In our case, the field number is
-    // supposed to be 1 and the wire type for an
-    // length-delimited field is 2.
-    const uint64_t kExpectedTag = (1 << 3) | 2;
-    std::tie(tag, success) = ParseVarInt(stream);
-    if (!success) {
-      LOG(LS_WARNING) << "Missing field tag from beginning of protobuf event.";
-      return false;
-    } else if (tag != kExpectedTag) {
-      LOG(LS_WARNING) << "Unexpected field tag at beginning of protobuf event.";
-      return false;
-    }
-
-    // Read the length field.
-    std::tie(message_length, success) = ParseVarInt(stream);
-    if (!success) {
-      LOG(LS_WARNING) << "Missing message length after protobuf field tag.";
-      return false;
-    } else if (message_length > kMaxEventSize) {
-      LOG(LS_WARNING) << "Protobuf message length is too large.";
-      return false;
-    }
-
-    // Read the next protobuf event to a temporary char buffer.
-    stream.read(tmp_buffer.data(), message_length);
-    if (stream.gcount() != static_cast<int>(message_length)) {
-      LOG(LS_WARNING) << "Failed to read protobuf message from file.";
-      return false;
-    }
-
-    // Parse the protobuf event from the buffer.
-    rtclog::Event event;
-    if (!event.ParseFromArray(tmp_buffer.data(), message_length)) {
-      LOG(LS_WARNING) << "Failed to parse protobuf message.";
-      return false;
-    }
-
-    EventType type = GetRuntimeEventType(event.type());
-    switch (type) {
-      case VIDEO_RECEIVER_CONFIG_EVENT: {
-        rtclog::StreamConfig config = GetVideoReceiveConfig(event);
-        streams_.emplace_back(config.remote_ssrc, MediaType::VIDEO,
-                              kIncomingPacket,
-                              RtpHeaderExtensionMap(config.rtp_extensions));
-        streams_.emplace_back(config.local_ssrc, MediaType::VIDEO,
-                              kOutgoingPacket,
-                              RtpHeaderExtensionMap(config.rtp_extensions));
-        break;
-      }
-      case VIDEO_SENDER_CONFIG_EVENT: {
-        std::vector<rtclog::StreamConfig> configs = GetVideoSendConfig(event);
-        for (size_t i = 0; i < configs.size(); i++) {
-          streams_.emplace_back(
-              configs[i].local_ssrc, MediaType::VIDEO, kOutgoingPacket,
-              RtpHeaderExtensionMap(configs[i].rtp_extensions));
-
-          streams_.emplace_back(
-              configs[i].rtx_ssrc, MediaType::VIDEO, kOutgoingPacket,
-              RtpHeaderExtensionMap(configs[i].rtp_extensions));
-        }
-        break;
-      }
-      case AUDIO_RECEIVER_CONFIG_EVENT: {
-        rtclog::StreamConfig config = GetAudioReceiveConfig(event);
-        streams_.emplace_back(config.remote_ssrc, MediaType::AUDIO,
-                              kIncomingPacket,
-                              RtpHeaderExtensionMap(config.rtp_extensions));
-        streams_.emplace_back(config.local_ssrc, MediaType::AUDIO,
-                              kOutgoingPacket,
-                              RtpHeaderExtensionMap(config.rtp_extensions));
-        break;
-      }
-      case AUDIO_SENDER_CONFIG_EVENT: {
-        rtclog::StreamConfig config = GetAudioSendConfig(event);
-        streams_.emplace_back(config.local_ssrc, MediaType::AUDIO,
-                              kOutgoingPacket,
-                              RtpHeaderExtensionMap(config.rtp_extensions));
-        break;
-      }
-      default:
-        break;
-    }
-
-    events_.push_back(event);
-  }
-}
-
-size_t ParsedRtcEventLog::GetNumberOfEvents() const {
-  return events_.size();
-}
-
-int64_t ParsedRtcEventLog::GetTimestamp(size_t index) const {
-  RTC_CHECK_LT(index, GetNumberOfEvents());
-  const rtclog::Event& event = events_[index];
-  RTC_CHECK(event.has_timestamp_us());
-  return event.timestamp_us();
-}
-
-ParsedRtcEventLog::EventType ParsedRtcEventLog::GetEventType(
-    size_t index) const {
-  RTC_CHECK_LT(index, GetNumberOfEvents());
-  const rtclog::Event& event = events_[index];
-  RTC_CHECK(event.has_type());
-  return GetRuntimeEventType(event.type());
-}
-
-// The header must have space for at least IP_PACKET_SIZE bytes.
-webrtc::RtpHeaderExtensionMap* ParsedRtcEventLog::GetRtpHeader(
-    size_t index,
-    PacketDirection* incoming,
-    uint8_t* header,
-    size_t* header_length,
-    size_t* total_length) const {
-  RTC_CHECK_LT(index, GetNumberOfEvents());
-  const rtclog::Event& event = events_[index];
-  RTC_CHECK(event.has_type());
-  RTC_CHECK_EQ(event.type(), rtclog::Event::RTP_EVENT);
-  RTC_CHECK(event.has_rtp_packet());
-  const rtclog::RtpPacket& rtp_packet = event.rtp_packet();
-  // Get direction of packet.
-  RTC_CHECK(rtp_packet.has_incoming());
-  if (incoming != nullptr) {
-    *incoming = rtp_packet.incoming() ? kIncomingPacket : kOutgoingPacket;
-  }
-  // Get packet length.
-  RTC_CHECK(rtp_packet.has_packet_length());
-  if (total_length != nullptr) {
-    *total_length = rtp_packet.packet_length();
-  }
-  // Get header length.
-  RTC_CHECK(rtp_packet.has_header());
-  if (header_length != nullptr) {
-    *header_length = rtp_packet.header().size();
-  }
-  // Get header contents.
-  if (header != nullptr) {
-    const size_t kMinRtpHeaderSize = 12;
-    RTC_CHECK_GE(rtp_packet.header().size(), kMinRtpHeaderSize);
-    RTC_CHECK_LE(rtp_packet.header().size(),
-                 static_cast<size_t>(IP_PACKET_SIZE));
-    memcpy(header, rtp_packet.header().data(), rtp_packet.header().size());
-    uint32_t ssrc = ByteReader<uint32_t>::ReadBigEndian(header + 8);
-    StreamId stream_id(
-        ssrc, rtp_packet.incoming() ? kIncomingPacket : kOutgoingPacket);
-    auto it = rtp_extensions_maps_.find(stream_id);
-    if (it != rtp_extensions_maps_.end()) {
-      return it->second;
-    }
-  }
-  return nullptr;
-}
-
-// The packet must have space for at least IP_PACKET_SIZE bytes.
-void ParsedRtcEventLog::GetRtcpPacket(size_t index,
-                                      PacketDirection* incoming,
-                                      uint8_t* packet,
-                                      size_t* length) const {
-  RTC_CHECK_LT(index, GetNumberOfEvents());
-  const rtclog::Event& event = events_[index];
-  RTC_CHECK(event.has_type());
-  RTC_CHECK_EQ(event.type(), rtclog::Event::RTCP_EVENT);
-  RTC_CHECK(event.has_rtcp_packet());
-  const rtclog::RtcpPacket& rtcp_packet = event.rtcp_packet();
-  // Get direction of packet.
-  RTC_CHECK(rtcp_packet.has_incoming());
-  if (incoming != nullptr) {
-    *incoming = rtcp_packet.incoming() ? kIncomingPacket : kOutgoingPacket;
-  }
-  // Get packet length.
-  RTC_CHECK(rtcp_packet.has_packet_data());
-  if (length != nullptr) {
-    *length = rtcp_packet.packet_data().size();
-  }
-  // Get packet contents.
-  if (packet != nullptr) {
-    RTC_CHECK_LE(rtcp_packet.packet_data().size(),
-                 static_cast<unsigned>(IP_PACKET_SIZE));
-    memcpy(packet, rtcp_packet.packet_data().data(),
-           rtcp_packet.packet_data().size());
-  }
-}
-
-rtclog::StreamConfig ParsedRtcEventLog::GetVideoReceiveConfig(
-    size_t index) const {
-  RTC_CHECK_LT(index, GetNumberOfEvents());
-  return GetVideoReceiveConfig(events_[index]);
-}
-
-rtclog::StreamConfig ParsedRtcEventLog::GetVideoReceiveConfig(
-    const rtclog::Event& event) const {
-  rtclog::StreamConfig config;
-  RTC_CHECK(event.has_type());
-  RTC_CHECK_EQ(event.type(), rtclog::Event::VIDEO_RECEIVER_CONFIG_EVENT);
-  RTC_CHECK(event.has_video_receiver_config());
-  const rtclog::VideoReceiveConfig& receiver_config =
-      event.video_receiver_config();
-  // Get SSRCs.
-  RTC_CHECK(receiver_config.has_remote_ssrc());
-  config.remote_ssrc = receiver_config.remote_ssrc();
-  RTC_CHECK(receiver_config.has_local_ssrc());
-  config.local_ssrc = receiver_config.local_ssrc();
-  config.rtx_ssrc = 0;
-  // Get RTCP settings.
-  RTC_CHECK(receiver_config.has_rtcp_mode());
-  config.rtcp_mode = GetRuntimeRtcpMode(receiver_config.rtcp_mode());
-  RTC_CHECK(receiver_config.has_remb());
-  config.remb = receiver_config.remb();
-
-  // Get RTX map.
-  std::map<uint32_t, const rtclog::RtxConfig> rtx_map;
-  for (int i = 0; i < receiver_config.rtx_map_size(); i++) {
-    const rtclog::RtxMap& map = receiver_config.rtx_map(i);
-    RTC_CHECK(map.has_payload_type());
-    RTC_CHECK(map.has_config());
-    RTC_CHECK(map.config().has_rtx_ssrc());
-    RTC_CHECK(map.config().has_rtx_payload_type());
-    rtx_map.insert(std::make_pair(map.payload_type(), map.config()));
-  }
-
-  // Get header extensions.
-  GetHeaderExtensions(&config.rtp_extensions,
-                      receiver_config.header_extensions());
-  // Get decoders.
-  config.codecs.clear();
-  for (int i = 0; i < receiver_config.decoders_size(); i++) {
-    RTC_CHECK(receiver_config.decoders(i).has_name());
-    RTC_CHECK(receiver_config.decoders(i).has_payload_type());
-    int rtx_payload_type = 0;
-    auto rtx_it = rtx_map.find(receiver_config.decoders(i).payload_type());
-    if (rtx_it != rtx_map.end()) {
-      rtx_payload_type = rtx_it->second.rtx_payload_type();
-      if (config.rtx_ssrc != 0 &&
-          config.rtx_ssrc != rtx_it->second.rtx_ssrc()) {
-        LOG(LS_WARNING)
-            << "RtcEventLog protobuf contained different SSRCs for "
-               "different received RTX payload types. Will only use "
-               "rtx_ssrc = "
-            << config.rtx_ssrc << ".";
-      } else {
-        config.rtx_ssrc = rtx_it->second.rtx_ssrc();
-      }
-    }
-    config.codecs.emplace_back(receiver_config.decoders(i).name(),
-                               receiver_config.decoders(i).payload_type(),
-                               rtx_payload_type);
-  }
-  return config;
-}
-
-std::vector<rtclog::StreamConfig> ParsedRtcEventLog::GetVideoSendConfig(
-    size_t index) const {
-  RTC_CHECK_LT(index, GetNumberOfEvents());
-  return GetVideoSendConfig(events_[index]);
-}
-
-std::vector<rtclog::StreamConfig> ParsedRtcEventLog::GetVideoSendConfig(
-    const rtclog::Event& event) const {
-  std::vector<rtclog::StreamConfig> configs;
-  RTC_CHECK(event.has_type());
-  RTC_CHECK_EQ(event.type(), rtclog::Event::VIDEO_SENDER_CONFIG_EVENT);
-  RTC_CHECK(event.has_video_sender_config());
-  const rtclog::VideoSendConfig& sender_config = event.video_sender_config();
-  if (sender_config.rtx_ssrcs_size() > 0 &&
-      sender_config.ssrcs_size() != sender_config.rtx_ssrcs_size()) {
-    LOG(WARNING) << "VideoSendConfig is configured for RTX but the number of "
-                    "SSRCs doesn't match the number of RTX SSRCs.";
-  }
-  configs.resize(sender_config.ssrcs_size());
-  for (int i = 0; i < sender_config.ssrcs_size(); i++) {
-    // Get SSRCs.
-    configs[i].local_ssrc = sender_config.ssrcs(i);
-    if (sender_config.rtx_ssrcs_size() > 0 &&
-        i < sender_config.rtx_ssrcs_size()) {
-      RTC_CHECK(sender_config.has_rtx_payload_type());
-      configs[i].rtx_ssrc = sender_config.rtx_ssrcs(i);
-    }
-    // Get header extensions.
-    GetHeaderExtensions(&configs[i].rtp_extensions,
-                        sender_config.header_extensions());
-
-    // Get the codec.
-    RTC_CHECK(sender_config.has_encoder());
-    RTC_CHECK(sender_config.encoder().has_name());
-    RTC_CHECK(sender_config.encoder().has_payload_type());
-    configs[i].codecs.emplace_back(
-        sender_config.encoder().name(), sender_config.encoder().payload_type(),
-        sender_config.has_rtx_payload_type() ? sender_config.rtx_payload_type()
-                                             : 0);
-  }
-  return configs;
-}
-
-rtclog::StreamConfig ParsedRtcEventLog::GetAudioReceiveConfig(
-    size_t index) const {
-  RTC_CHECK_LT(index, GetNumberOfEvents());
-  return GetAudioReceiveConfig(events_[index]);
-}
-
-rtclog::StreamConfig ParsedRtcEventLog::GetAudioReceiveConfig(
-    const rtclog::Event& event) const {
-  rtclog::StreamConfig config;
-  RTC_CHECK(event.has_type());
-  RTC_CHECK_EQ(event.type(), rtclog::Event::AUDIO_RECEIVER_CONFIG_EVENT);
-  RTC_CHECK(event.has_audio_receiver_config());
-  const rtclog::AudioReceiveConfig& receiver_config =
-      event.audio_receiver_config();
-  // Get SSRCs.
-  RTC_CHECK(receiver_config.has_remote_ssrc());
-  config.remote_ssrc = receiver_config.remote_ssrc();
-  RTC_CHECK(receiver_config.has_local_ssrc());
-  config.local_ssrc = receiver_config.local_ssrc();
-  // Get header extensions.
-  GetHeaderExtensions(&config.rtp_extensions,
-                      receiver_config.header_extensions());
-  return config;
-}
-
-rtclog::StreamConfig ParsedRtcEventLog::GetAudioSendConfig(size_t index) const {
-  RTC_CHECK_LT(index, GetNumberOfEvents());
-  return GetAudioSendConfig(events_[index]);
-}
-
-rtclog::StreamConfig ParsedRtcEventLog::GetAudioSendConfig(
-    const rtclog::Event& event) const {
-  rtclog::StreamConfig config;
-  RTC_CHECK(event.has_type());
-  RTC_CHECK_EQ(event.type(), rtclog::Event::AUDIO_SENDER_CONFIG_EVENT);
-  RTC_CHECK(event.has_audio_sender_config());
-  const rtclog::AudioSendConfig& sender_config = event.audio_sender_config();
-  // Get SSRCs.
-  RTC_CHECK(sender_config.has_ssrc());
-  config.local_ssrc = sender_config.ssrc();
-  // Get header extensions.
-  GetHeaderExtensions(&config.rtp_extensions,
-                      sender_config.header_extensions());
-  return config;
-}
-
-void ParsedRtcEventLog::GetAudioPlayout(size_t index, uint32_t* ssrc) const {
-  RTC_CHECK_LT(index, GetNumberOfEvents());
-  const rtclog::Event& event = events_[index];
-  RTC_CHECK(event.has_type());
-  RTC_CHECK_EQ(event.type(), rtclog::Event::AUDIO_PLAYOUT_EVENT);
-  RTC_CHECK(event.has_audio_playout_event());
-  const rtclog::AudioPlayoutEvent& loss_event = event.audio_playout_event();
-  RTC_CHECK(loss_event.has_local_ssrc());
-  if (ssrc != nullptr) {
-    *ssrc = loss_event.local_ssrc();
-  }
-}
-
-void ParsedRtcEventLog::GetLossBasedBweUpdate(size_t index,
-                                              int32_t* bitrate_bps,
-                                              uint8_t* fraction_loss,
-                                              int32_t* total_packets) const {
-  RTC_CHECK_LT(index, GetNumberOfEvents());
-  const rtclog::Event& event = events_[index];
-  RTC_CHECK(event.has_type());
-  RTC_CHECK_EQ(event.type(), rtclog::Event::LOSS_BASED_BWE_UPDATE);
-  RTC_CHECK(event.has_loss_based_bwe_update());
-  const rtclog::LossBasedBweUpdate& loss_event = event.loss_based_bwe_update();
-  RTC_CHECK(loss_event.has_bitrate_bps());
-  if (bitrate_bps != nullptr) {
-    *bitrate_bps = loss_event.bitrate_bps();
-  }
-  RTC_CHECK(loss_event.has_fraction_loss());
-  if (fraction_loss != nullptr) {
-    *fraction_loss = loss_event.fraction_loss();
-  }
-  RTC_CHECK(loss_event.has_total_packets());
-  if (total_packets != nullptr) {
-    *total_packets = loss_event.total_packets();
-  }
-}
-
-ParsedRtcEventLog::BweDelayBasedUpdate
-ParsedRtcEventLog::GetDelayBasedBweUpdate(size_t index) const {
-  RTC_CHECK_LT(index, GetNumberOfEvents());
-  const rtclog::Event& event = events_[index];
-  RTC_CHECK(event.has_type());
-  RTC_CHECK_EQ(event.type(), rtclog::Event::DELAY_BASED_BWE_UPDATE);
-  RTC_CHECK(event.has_delay_based_bwe_update());
-  const rtclog::DelayBasedBweUpdate& delay_event =
-      event.delay_based_bwe_update();
-
-  BweDelayBasedUpdate res;
-  res.timestamp = GetTimestamp(index);
-  RTC_CHECK(delay_event.has_bitrate_bps());
-  res.bitrate_bps = delay_event.bitrate_bps();
-  RTC_CHECK(delay_event.has_detector_state());
-  res.detector_state = GetRuntimeDetectorState(delay_event.detector_state());
-  return res;
-}
-
-void ParsedRtcEventLog::GetAudioNetworkAdaptation(
-    size_t index,
-    AudioEncoderRuntimeConfig* config) const {
-  RTC_CHECK_LT(index, GetNumberOfEvents());
-  const rtclog::Event& event = events_[index];
-  RTC_CHECK(event.has_type());
-  RTC_CHECK_EQ(event.type(), rtclog::Event::AUDIO_NETWORK_ADAPTATION_EVENT);
-  RTC_CHECK(event.has_audio_network_adaptation());
-  const rtclog::AudioNetworkAdaptation& ana_event =
-      event.audio_network_adaptation();
-  if (ana_event.has_bitrate_bps())
-    config->bitrate_bps = rtc::Optional<int>(ana_event.bitrate_bps());
-  if (ana_event.has_enable_fec())
-    config->enable_fec = rtc::Optional<bool>(ana_event.enable_fec());
-  if (ana_event.has_enable_dtx())
-    config->enable_dtx = rtc::Optional<bool>(ana_event.enable_dtx());
-  if (ana_event.has_frame_length_ms())
-    config->frame_length_ms = rtc::Optional<int>(ana_event.frame_length_ms());
-  if (ana_event.has_num_channels())
-    config->num_channels = rtc::Optional<size_t>(ana_event.num_channels());
-  if (ana_event.has_uplink_packet_loss_fraction())
-    config->uplink_packet_loss_fraction =
-        rtc::Optional<float>(ana_event.uplink_packet_loss_fraction());
-}
-
-ParsedRtcEventLog::BweProbeClusterCreatedEvent
-ParsedRtcEventLog::GetBweProbeClusterCreated(size_t index) const {
-  RTC_CHECK_LT(index, GetNumberOfEvents());
-  const rtclog::Event& event = events_[index];
-  RTC_CHECK(event.has_type());
-  RTC_CHECK_EQ(event.type(), rtclog::Event::BWE_PROBE_CLUSTER_CREATED_EVENT);
-  RTC_CHECK(event.has_probe_cluster());
-  const rtclog::BweProbeCluster& pcc_event = event.probe_cluster();
-  BweProbeClusterCreatedEvent res;
-  res.timestamp = GetTimestamp(index);
-  RTC_CHECK(pcc_event.has_id());
-  res.id = pcc_event.id();
-  RTC_CHECK(pcc_event.has_bitrate_bps());
-  res.bitrate_bps = pcc_event.bitrate_bps();
-  RTC_CHECK(pcc_event.has_min_packets());
-  res.min_packets = pcc_event.min_packets();
-  RTC_CHECK(pcc_event.has_min_bytes());
-  res.min_bytes = pcc_event.min_bytes();
-  return res;
-}
-
-ParsedRtcEventLog::BweProbeResultEvent ParsedRtcEventLog::GetBweProbeResult(
-    size_t index) const {
-  RTC_CHECK_LT(index, GetNumberOfEvents());
-  const rtclog::Event& event = events_[index];
-  RTC_CHECK(event.has_type());
-  RTC_CHECK_EQ(event.type(), rtclog::Event::BWE_PROBE_RESULT_EVENT);
-  RTC_CHECK(event.has_probe_result());
-  const rtclog::BweProbeResult& pr_event = event.probe_result();
-  BweProbeResultEvent res;
-  res.timestamp = GetTimestamp(index);
-  RTC_CHECK(pr_event.has_id());
-  res.id = pr_event.id();
-
-  RTC_CHECK(pr_event.has_result());
-  if (pr_event.result() == rtclog::BweProbeResult::SUCCESS) {
-    RTC_CHECK(pr_event.has_bitrate_bps());
-    res.bitrate_bps = rtc::Optional<uint64_t>(pr_event.bitrate_bps());
-  } else if (pr_event.result() ==
-             rtclog::BweProbeResult::INVALID_SEND_RECEIVE_INTERVAL) {
-    res.failure_reason =
-        rtc::Optional<ProbeFailureReason>(kInvalidSendReceiveInterval);
-  } else if (pr_event.result() ==
-             rtclog::BweProbeResult::INVALID_SEND_RECEIVE_RATIO) {
-    res.failure_reason =
-        rtc::Optional<ProbeFailureReason>(kInvalidSendReceiveRatio);
-  } else if (pr_event.result() == rtclog::BweProbeResult::TIMEOUT) {
-    res.failure_reason = rtc::Optional<ProbeFailureReason>(kTimeout);
-  } else {
-    RTC_NOTREACHED();
-  }
-
-  return res;
-}
-
-// Returns the MediaType for registered SSRCs. Search from the end to use last
-// registered types first.
-ParsedRtcEventLog::MediaType ParsedRtcEventLog::GetMediaType(
-    uint32_t ssrc,
-    PacketDirection direction) const {
-  for (auto rit = streams_.rbegin(); rit != streams_.rend(); ++rit) {
-    if (rit->ssrc == ssrc && rit->direction == direction)
-      return rit->media_type;
-  }
-  return MediaType::ANY;
-}
-}  // namespace webrtc
diff --git a/logging/rtc_event_log/rtc_event_log_parser.h b/logging/rtc_event_log/rtc_event_log_parser.h
deleted file mode 100644
index 1c2390b..0000000
--- a/logging/rtc_event_log/rtc_event_log_parser.h
+++ /dev/null
@@ -1,212 +0,0 @@
-/*
- *  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_LOGGING_RTC_EVENT_LOG_RTC_EVENT_LOG_PARSER_H_
-#define WEBRTC_LOGGING_RTC_EVENT_LOG_RTC_EVENT_LOG_PARSER_H_
-
-#include <map>
-#include <string>
-#include <utility>  // pair
-#include <vector>
-
-#include "webrtc/call/video_receive_stream.h"
-#include "webrtc/call/video_send_stream.h"
-#include "webrtc/logging/rtc_event_log/rtc_event_log.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_header_extension_map.h"
-#include "webrtc/modules/rtp_rtcp/source/byte_io.h"
-#include "webrtc/rtc_base/ignore_wundef.h"
-
-// Files generated at build-time by the protobuf compiler.
-RTC_PUSH_IGNORING_WUNDEF()
-#ifdef WEBRTC_ANDROID_PLATFORM_BUILD
-#include "external/webrtc/webrtc/logging/rtc_event_log/rtc_event_log.pb.h"
-#else
-#include "webrtc/logging/rtc_event_log/rtc_event_log.pb.h"
-#endif
-RTC_POP_IGNORING_WUNDEF()
-
-namespace webrtc {
-
-enum class MediaType;
-
-class ParsedRtcEventLog {
-  friend class RtcEventLogTestHelper;
-
- public:
-  struct BweProbeClusterCreatedEvent {
-    uint64_t timestamp;
-    uint32_t id;
-    uint64_t bitrate_bps;
-    uint32_t min_packets;
-    uint32_t min_bytes;
-  };
-
-  struct BweProbeResultEvent {
-    uint64_t timestamp;
-    uint32_t id;
-    rtc::Optional<uint64_t> bitrate_bps;
-    rtc::Optional<ProbeFailureReason> failure_reason;
-  };
-
-  struct BweDelayBasedUpdate {
-    uint64_t timestamp;
-    int32_t bitrate_bps;
-    BandwidthUsage detector_state;
-  };
-
-  enum EventType {
-    UNKNOWN_EVENT = 0,
-    LOG_START = 1,
-    LOG_END = 2,
-    RTP_EVENT = 3,
-    RTCP_EVENT = 4,
-    AUDIO_PLAYOUT_EVENT = 5,
-    LOSS_BASED_BWE_UPDATE = 6,
-    DELAY_BASED_BWE_UPDATE = 7,
-    VIDEO_RECEIVER_CONFIG_EVENT = 8,
-    VIDEO_SENDER_CONFIG_EVENT = 9,
-    AUDIO_RECEIVER_CONFIG_EVENT = 10,
-    AUDIO_SENDER_CONFIG_EVENT = 11,
-    AUDIO_NETWORK_ADAPTATION_EVENT = 16,
-    BWE_PROBE_CLUSTER_CREATED_EVENT = 17,
-    BWE_PROBE_RESULT_EVENT = 18
-  };
-
-  enum class MediaType { ANY, AUDIO, VIDEO, DATA };
-
-  // Reads an RtcEventLog file and returns true if parsing was successful.
-  bool ParseFile(const std::string& file_name);
-
-  // Reads an RtcEventLog from a string and returns true if successful.
-  bool ParseString(const std::string& s);
-
-  // Reads an RtcEventLog from an istream and returns true if successful.
-  bool ParseStream(std::istream& stream);
-
-  // Returns the number of events in an EventStream.
-  size_t GetNumberOfEvents() const;
-
-  // Reads the arrival timestamp (in microseconds) from a rtclog::Event.
-  int64_t GetTimestamp(size_t index) const;
-
-  // Reads the event type of the rtclog::Event at |index|.
-  EventType GetEventType(size_t index) const;
-
-  // Reads the header, direction, header length and packet length from the RTP
-  // event at |index|, and stores the values in the corresponding output
-  // parameters. Each output parameter can be set to nullptr if that value
-  // isn't needed.
-  // NB: The header must have space for at least IP_PACKET_SIZE bytes.
-  // Returns: a pointer to a header extensions map acquired from parsing
-  // corresponding Audio/Video Sender/Receiver config events.
-  // Warning: if the same SSRC is reused by both video and audio streams during
-  // call, extensions maps may be incorrect (the last one would be returned).
-  webrtc::RtpHeaderExtensionMap* GetRtpHeader(size_t index,
-                                              PacketDirection* incoming,
-                                              uint8_t* header,
-                                              size_t* header_length,
-                                              size_t* total_length) const;
-
-  // Reads packet, direction and packet length from the RTCP event at |index|,
-  // and stores the values in the corresponding output parameters.
-  // Each output parameter can be set to nullptr if that value isn't needed.
-  // NB: The packet must have space for at least IP_PACKET_SIZE bytes.
-  void GetRtcpPacket(size_t index,
-                     PacketDirection* incoming,
-                     uint8_t* packet,
-                     size_t* length) const;
-
-  // Reads a video receive config event to a StreamConfig struct.
-  // Only the fields that are stored in the protobuf will be written.
-  rtclog::StreamConfig GetVideoReceiveConfig(size_t index) const;
-
-  // Reads a video send config event to a StreamConfig struct. If the proto
-  // contains multiple SSRCs and RTX SSRCs (this used to be the case for
-  // simulcast streams) then we return one StreamConfig per SSRC,RTX_SSRC pair.
-  // Only the fields that are stored in the protobuf will be written.
-  std::vector<rtclog::StreamConfig> GetVideoSendConfig(size_t index) const;
-
-  // Reads a audio receive config event to a StreamConfig struct.
-  // Only the fields that are stored in the protobuf will be written.
-  rtclog::StreamConfig GetAudioReceiveConfig(size_t index) const;
-
-  // Reads a config event to a StreamConfig struct.
-  // Only the fields that are stored in the protobuf will be written.
-  rtclog::StreamConfig GetAudioSendConfig(size_t index) const;
-
-  // Reads the SSRC from the audio playout event at |index|. The SSRC is stored
-  // in the output parameter ssrc. The output parameter can be set to nullptr
-  // and in that case the function only asserts that the event is well formed.
-  void GetAudioPlayout(size_t index, uint32_t* ssrc) const;
-
-  // Reads bitrate, fraction loss (as defined in RFC 1889) and total number of
-  // expected packets from the loss based BWE event at |index| and stores the
-  // values in
-  // the corresponding output parameters. Each output parameter can be set to
-  // nullptr if that
-  // value isn't needed.
-  void GetLossBasedBweUpdate(size_t index,
-                             int32_t* bitrate_bps,
-                             uint8_t* fraction_loss,
-                             int32_t* total_packets) const;
-
-  // Reads bitrate and detector_state from the delay based BWE event at |index|
-  // and stores the values in the corresponding output parameters. Each output
-  // parameter can be set to nullptr if that
-  // value isn't needed.
-  BweDelayBasedUpdate GetDelayBasedBweUpdate(size_t index) const;
-
-  // Reads a audio network adaptation event to a (non-NULL)
-  // AudioEncoderRuntimeConfig struct. Only the fields that are
-  // stored in the protobuf will be written.
-  void GetAudioNetworkAdaptation(size_t index,
-                                 AudioEncoderRuntimeConfig* config) const;
-
-  BweProbeClusterCreatedEvent GetBweProbeClusterCreated(size_t index) const;
-
-  BweProbeResultEvent GetBweProbeResult(size_t index) const;
-
-  MediaType GetMediaType(uint32_t ssrc, PacketDirection direction) const;
-
- private:
-  rtclog::StreamConfig GetVideoReceiveConfig(const rtclog::Event& event) const;
-  std::vector<rtclog::StreamConfig> GetVideoSendConfig(
-      const rtclog::Event& event) const;
-  rtclog::StreamConfig GetAudioReceiveConfig(const rtclog::Event& event) const;
-  rtclog::StreamConfig GetAudioSendConfig(const rtclog::Event& event) const;
-
-  std::vector<rtclog::Event> events_;
-
-  struct Stream {
-    Stream(uint32_t ssrc,
-           MediaType media_type,
-           webrtc::PacketDirection direction,
-           webrtc::RtpHeaderExtensionMap map)
-        : ssrc(ssrc),
-          media_type(media_type),
-          direction(direction),
-          rtp_extensions_map(map) {}
-    uint32_t ssrc;
-    MediaType media_type;
-    webrtc::PacketDirection direction;
-    webrtc::RtpHeaderExtensionMap rtp_extensions_map;
-  };
-
-  // All configured streams found in the event log.
-  std::vector<Stream> streams_;
-
-  // To find configured extensions map for given stream, what are needed to
-  // parse a header.
-  typedef std::pair<uint32_t, webrtc::PacketDirection> StreamId;
-  std::map<StreamId, webrtc::RtpHeaderExtensionMap*> rtp_extensions_maps_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_LOGGING_RTC_EVENT_LOG_RTC_EVENT_LOG_PARSER_H_
diff --git a/logging/rtc_event_log/rtc_event_log_unittest.cc b/logging/rtc_event_log/rtc_event_log_unittest.cc
deleted file mode 100644
index e908ccd..0000000
--- a/logging/rtc_event_log/rtc_event_log_unittest.cc
+++ /dev/null
@@ -1,876 +0,0 @@
-/*
- *  Copyright (c) 2015 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 <map>
-#include <memory>
-#include <string>
-#include <utility>
-#include <vector>
-
-#include "webrtc/call/call.h"
-#include "webrtc/logging/rtc_event_log/rtc_event_log.h"
-#include "webrtc/logging/rtc_event_log/rtc_event_log_parser.h"
-#include "webrtc/logging/rtc_event_log/rtc_event_log_unittest_helper.h"
-#include "webrtc/modules/audio_coding/audio_network_adaptor/include/audio_network_adaptor.h"
-#include "webrtc/modules/remote_bitrate_estimator/include/bwe_defines.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_header_extension_map.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/sender_report.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_header_extensions.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_packet_to_send.h"
-#include "webrtc/rtc_base/buffer.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/fakeclock.h"
-#include "webrtc/rtc_base/random.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/testsupport/fileutils.h"
-
-// Files generated at build-time by the protobuf compiler.
-#ifdef WEBRTC_ANDROID_PLATFORM_BUILD
-#include "external/webrtc/webrtc/logging/rtc_event_log/rtc_event_log.pb.h"
-#else
-#include "webrtc/logging/rtc_event_log/rtc_event_log.pb.h"
-#endif
-
-namespace webrtc {
-
-namespace {
-
-const RTPExtensionType kExtensionTypes[] = {
-    RTPExtensionType::kRtpExtensionTransmissionTimeOffset,
-    RTPExtensionType::kRtpExtensionAudioLevel,
-    RTPExtensionType::kRtpExtensionAbsoluteSendTime,
-    RTPExtensionType::kRtpExtensionVideoRotation,
-    RTPExtensionType::kRtpExtensionTransportSequenceNumber};
-const char* kExtensionNames[] = {
-    RtpExtension::kTimestampOffsetUri, RtpExtension::kAudioLevelUri,
-    RtpExtension::kAbsSendTimeUri, RtpExtension::kVideoRotationUri,
-    RtpExtension::kTransportSequenceNumberUri};
-const size_t kNumExtensions = 5;
-
-void PrintActualEvents(const ParsedRtcEventLog& parsed_log) {
-  std::map<int, size_t> actual_event_counts;
-  for (size_t i = 0; i < parsed_log.GetNumberOfEvents(); i++) {
-    actual_event_counts[parsed_log.GetEventType(i)]++;
-  }
-  printf("Actual events: ");
-  for (auto kv : actual_event_counts) {
-    printf("%d_count = %zu, ", kv.first, kv.second);
-  }
-  printf("\n");
-  for (size_t i = 0; i < parsed_log.GetNumberOfEvents(); i++) {
-    printf("%4d ", parsed_log.GetEventType(i));
-  }
-  printf("\n");
-}
-
-void PrintExpectedEvents(size_t rtp_count,
-                         size_t rtcp_count,
-                         size_t playout_count,
-                         size_t bwe_loss_count) {
-  printf(
-      "Expected events: rtp_count = %zu, rtcp_count = %zu,"
-      "playout_count = %zu, bwe_loss_count = %zu\n",
-      rtp_count, rtcp_count, playout_count, bwe_loss_count);
-  size_t rtcp_index = 1, playout_index = 1, bwe_loss_index = 1;
-  printf("strt  cfg  cfg ");
-  for (size_t i = 1; i <= rtp_count; i++) {
-    printf(" rtp ");
-    if (i * rtcp_count >= rtcp_index * rtp_count) {
-      printf("rtcp ");
-      rtcp_index++;
-    }
-    if (i * playout_count >= playout_index * rtp_count) {
-      printf("play ");
-      playout_index++;
-    }
-    if (i * bwe_loss_count >= bwe_loss_index * rtp_count) {
-      printf("loss ");
-      bwe_loss_index++;
-    }
-  }
-  printf("end \n");
-}
-}  // namespace
-
-/*
- * Bit number i of extension_bitvector is set to indicate the
- * presence of extension number i from kExtensionTypes / kExtensionNames.
- * The least significant bit extension_bitvector has number 0.
- */
-RtpPacketToSend GenerateRtpPacket(const RtpHeaderExtensionMap* extensions,
-                                  uint32_t csrcs_count,
-                                  size_t packet_size,
-                                  Random* prng) {
-  RTC_CHECK_GE(packet_size, 16 + 4 * csrcs_count + 4 * kNumExtensions);
-
-  std::vector<uint32_t> csrcs;
-  for (unsigned i = 0; i < csrcs_count; i++) {
-    csrcs.push_back(prng->Rand<uint32_t>());
-  }
-
-  RtpPacketToSend rtp_packet(extensions, packet_size);
-  rtp_packet.SetPayloadType(prng->Rand(127));
-  rtp_packet.SetMarker(prng->Rand<bool>());
-  rtp_packet.SetSequenceNumber(prng->Rand<uint16_t>());
-  rtp_packet.SetSsrc(prng->Rand<uint32_t>());
-  rtp_packet.SetTimestamp(prng->Rand<uint32_t>());
-  rtp_packet.SetCsrcs(csrcs);
-
-  rtp_packet.SetExtension<TransmissionOffset>(prng->Rand(0x00ffffff));
-  rtp_packet.SetExtension<AudioLevel>(prng->Rand<bool>(), prng->Rand(127));
-  rtp_packet.SetExtension<AbsoluteSendTime>(prng->Rand(0x00ffffff));
-  rtp_packet.SetExtension<VideoOrientation>(prng->Rand(2));
-  rtp_packet.SetExtension<TransportSequenceNumber>(prng->Rand<uint16_t>());
-
-  size_t payload_size = packet_size - rtp_packet.headers_size();
-  uint8_t* payload = rtp_packet.AllocatePayload(payload_size);
-  for (size_t i = 0; i < payload_size; i++) {
-    payload[i] = prng->Rand<uint8_t>();
-  }
-  return rtp_packet;
-}
-
-rtc::Buffer GenerateRtcpPacket(Random* prng) {
-  rtcp::ReportBlock report_block;
-  report_block.SetMediaSsrc(prng->Rand<uint32_t>());  // Remote SSRC.
-  report_block.SetFractionLost(prng->Rand(50));
-
-  rtcp::SenderReport sender_report;
-  sender_report.SetSenderSsrc(prng->Rand<uint32_t>());
-  sender_report.SetNtp(NtpTime(prng->Rand<uint32_t>(), prng->Rand<uint32_t>()));
-  sender_report.SetPacketCount(prng->Rand<uint32_t>());
-  sender_report.AddReportBlock(report_block);
-
-  return sender_report.Build();
-}
-
-void GenerateVideoReceiveConfig(uint32_t extensions_bitvector,
-                                rtclog::StreamConfig* config,
-                                Random* prng) {
-  // Add SSRCs for the stream.
-  config->remote_ssrc = prng->Rand<uint32_t>();
-  config->local_ssrc = prng->Rand<uint32_t>();
-  // Add extensions and settings for RTCP.
-  config->rtcp_mode =
-      prng->Rand<bool>() ? RtcpMode::kCompound : RtcpMode::kReducedSize;
-  config->remb = prng->Rand<bool>();
-  config->rtx_ssrc = prng->Rand<uint32_t>();
-  config->codecs.emplace_back(prng->Rand<bool>() ? "VP8" : "H264",
-                              prng->Rand(1, 127), prng->Rand(1, 127));
-  // Add header extensions.
-  for (unsigned i = 0; i < kNumExtensions; i++) {
-    if (extensions_bitvector & (1u << i)) {
-      config->rtp_extensions.emplace_back(kExtensionNames[i],
-                                          prng->Rand<int>());
-    }
-  }
-}
-
-void GenerateVideoSendConfig(uint32_t extensions_bitvector,
-                             rtclog::StreamConfig* config,
-                             Random* prng) {
-  config->codecs.emplace_back(prng->Rand<bool>() ? "VP8" : "H264",
-                              prng->Rand(1, 127), prng->Rand(1, 127));
-  config->local_ssrc = prng->Rand<uint32_t>();
-  config->rtx_ssrc = prng->Rand<uint32_t>();
-  // Add header extensions.
-  for (unsigned i = 0; i < kNumExtensions; i++) {
-    if (extensions_bitvector & (1u << i)) {
-      config->rtp_extensions.push_back(
-          RtpExtension(kExtensionNames[i], prng->Rand<int>()));
-    }
-  }
-}
-
-void GenerateAudioReceiveConfig(uint32_t extensions_bitvector,
-                                rtclog::StreamConfig* config,
-                                Random* prng) {
-  // Add SSRCs for the stream.
-  config->remote_ssrc = prng->Rand<uint32_t>();
-  config->local_ssrc = prng->Rand<uint32_t>();
-  // Add header extensions.
-  for (unsigned i = 0; i < kNumExtensions; i++) {
-    if (extensions_bitvector & (1u << i)) {
-      config->rtp_extensions.push_back(
-          RtpExtension(kExtensionNames[i], prng->Rand<int>()));
-    }
-  }
-}
-
-void GenerateAudioSendConfig(uint32_t extensions_bitvector,
-                             rtclog::StreamConfig* config,
-                             Random* prng) {
-  // Add SSRC to the stream.
-  config->local_ssrc = prng->Rand<uint32_t>();
-  // Add header extensions.
-  for (unsigned i = 0; i < kNumExtensions; i++) {
-    if (extensions_bitvector & (1u << i)) {
-      config->rtp_extensions.push_back(
-          RtpExtension(kExtensionNames[i], prng->Rand<int>()));
-    }
-  }
-}
-
-void GenerateAudioNetworkAdaptation(uint32_t extensions_bitvector,
-                                    AudioEncoderRuntimeConfig* config,
-                                    Random* prng) {
-  config->bitrate_bps = rtc::Optional<int>(prng->Rand(0, 3000000));
-  config->enable_fec = rtc::Optional<bool>(prng->Rand<bool>());
-  config->enable_dtx = rtc::Optional<bool>(prng->Rand<bool>());
-  config->frame_length_ms = rtc::Optional<int>(prng->Rand(10, 120));
-  config->num_channels = rtc::Optional<size_t>(prng->Rand(1, 2));
-  config->uplink_packet_loss_fraction =
-      rtc::Optional<float>(prng->Rand<float>());
-}
-
-// Test for the RtcEventLog class. Dumps some RTP packets and other events
-// to disk, then reads them back to see if they match.
-void LogSessionAndReadBack(size_t rtp_count,
-                           size_t rtcp_count,
-                           size_t playout_count,
-                           size_t bwe_loss_count,
-                           uint32_t extensions_bitvector,
-                           uint32_t csrcs_count,
-                           unsigned int random_seed) {
-  ASSERT_LE(rtcp_count, rtp_count);
-  ASSERT_LE(playout_count, rtp_count);
-  ASSERT_LE(bwe_loss_count, rtp_count);
-  std::vector<RtpPacketToSend> rtp_packets;
-  std::vector<rtc::Buffer> rtcp_packets;
-  std::vector<uint32_t> playout_ssrcs;
-  std::vector<std::pair<int32_t, uint8_t> > bwe_loss_updates;
-
-  rtclog::StreamConfig receiver_config;
-  rtclog::StreamConfig sender_config;
-
-  Random prng(random_seed);
-
-  // Initialize rtp header extensions to be used in generated rtp packets.
-  RtpHeaderExtensionMap extensions;
-  for (unsigned i = 0; i < kNumExtensions; i++) {
-    if (extensions_bitvector & (1u << i)) {
-      extensions.Register(kExtensionTypes[i], i + 1);
-    }
-  }
-  // Create rtp_count RTP packets containing random data.
-  for (size_t i = 0; i < rtp_count; i++) {
-    size_t packet_size = prng.Rand(1000, 1100);
-    rtp_packets.push_back(
-        GenerateRtpPacket(&extensions, csrcs_count, packet_size, &prng));
-  }
-  // Create rtcp_count RTCP packets containing random data.
-  for (size_t i = 0; i < rtcp_count; i++) {
-    rtcp_packets.push_back(GenerateRtcpPacket(&prng));
-  }
-  // Create playout_count random SSRCs to use when logging AudioPlayout events.
-  for (size_t i = 0; i < playout_count; i++) {
-    playout_ssrcs.push_back(prng.Rand<uint32_t>());
-  }
-  // Create bwe_loss_count random bitrate updates for LossBasedBwe.
-  for (size_t i = 0; i < bwe_loss_count; i++) {
-    bwe_loss_updates.push_back(
-        std::make_pair(prng.Rand<int32_t>(), prng.Rand<uint8_t>()));
-  }
-  // Create configurations for the video streams.
-  GenerateVideoReceiveConfig(extensions_bitvector, &receiver_config, &prng);
-  GenerateVideoSendConfig(extensions_bitvector, &sender_config, &prng);
-  const int config_count = 2;
-
-  // Find the name of the current test, in order to use it as a temporary
-  // filename.
-  auto test_info = ::testing::UnitTest::GetInstance()->current_test_info();
-  const std::string temp_filename =
-      test::OutputPath() + test_info->test_case_name() + test_info->name();
-
-  // When log_dumper goes out of scope, it causes the log file to be flushed
-  // to disk.
-  {
-    rtc::ScopedFakeClock fake_clock;
-    fake_clock.SetTimeMicros(prng.Rand<uint32_t>());
-    std::unique_ptr<RtcEventLog> log_dumper(RtcEventLog::Create());
-    log_dumper->LogVideoReceiveStreamConfig(receiver_config);
-    fake_clock.AdvanceTimeMicros(prng.Rand(1, 1000));
-    log_dumper->LogVideoSendStreamConfig(sender_config);
-    fake_clock.AdvanceTimeMicros(prng.Rand(1, 1000));
-    size_t rtcp_index = 1;
-    size_t playout_index = 1;
-    size_t bwe_loss_index = 1;
-    for (size_t i = 1; i <= rtp_count; i++) {
-      log_dumper->LogRtpHeader(
-          (i % 2 == 0) ? kIncomingPacket : kOutgoingPacket,
-          rtp_packets[i - 1].data(), rtp_packets[i - 1].size());
-      fake_clock.AdvanceTimeMicros(prng.Rand(1, 1000));
-      if (i * rtcp_count >= rtcp_index * rtp_count) {
-        log_dumper->LogRtcpPacket(
-            (rtcp_index % 2 == 0) ? kIncomingPacket : kOutgoingPacket,
-            rtcp_packets[rtcp_index - 1].data(),
-            rtcp_packets[rtcp_index - 1].size());
-        rtcp_index++;
-        fake_clock.AdvanceTimeMicros(prng.Rand(1, 1000));
-      }
-      if (i * playout_count >= playout_index * rtp_count) {
-        log_dumper->LogAudioPlayout(playout_ssrcs[playout_index - 1]);
-        playout_index++;
-        fake_clock.AdvanceTimeMicros(prng.Rand(1, 1000));
-      }
-      if (i * bwe_loss_count >= bwe_loss_index * rtp_count) {
-        log_dumper->LogLossBasedBweUpdate(
-            bwe_loss_updates[bwe_loss_index - 1].first,
-            bwe_loss_updates[bwe_loss_index - 1].second, i);
-        bwe_loss_index++;
-        fake_clock.AdvanceTimeMicros(prng.Rand(1, 1000));
-      }
-      if (i == rtp_count / 2) {
-        log_dumper->StartLogging(temp_filename, 10000000);
-        fake_clock.AdvanceTimeMicros(prng.Rand(1, 1000));
-      }
-    }
-    log_dumper->StopLogging();
-  }
-
-  // Read the generated file from disk.
-  ParsedRtcEventLog parsed_log;
-
-  ASSERT_TRUE(parsed_log.ParseFile(temp_filename));
-
-  // Verify that what we read back from the event log is the same as
-  // what we wrote down. For RTCP we log the full packets, but for
-  // RTP we should only log the header.
-  const size_t event_count = config_count + playout_count + bwe_loss_count +
-                             rtcp_count + rtp_count + 2;
-  EXPECT_GE(1000u, event_count);  // The events must fit in the message queue.
-  EXPECT_EQ(event_count, parsed_log.GetNumberOfEvents());
-  if (event_count != parsed_log.GetNumberOfEvents()) {
-    // Print the expected and actual event types for easier debugging.
-    PrintActualEvents(parsed_log);
-    PrintExpectedEvents(rtp_count, rtcp_count, playout_count, bwe_loss_count);
-  }
-  RtcEventLogTestHelper::VerifyLogStartEvent(parsed_log, 0);
-  RtcEventLogTestHelper::VerifyVideoReceiveStreamConfig(parsed_log, 1,
-                                                        receiver_config);
-  RtcEventLogTestHelper::VerifyVideoSendStreamConfig(parsed_log, 2,
-                                                     sender_config);
-  size_t event_index = config_count + 1;
-  size_t rtcp_index = 1;
-  size_t playout_index = 1;
-  size_t bwe_loss_index = 1;
-  for (size_t i = 1; i <= rtp_count; i++) {
-    RtcEventLogTestHelper::VerifyRtpEvent(
-        parsed_log, event_index,
-        (i % 2 == 0) ? kIncomingPacket : kOutgoingPacket,
-        rtp_packets[i - 1].data(), rtp_packets[i - 1].headers_size(),
-        rtp_packets[i - 1].size());
-    event_index++;
-    if (i * rtcp_count >= rtcp_index * rtp_count) {
-      RtcEventLogTestHelper::VerifyRtcpEvent(
-          parsed_log, event_index,
-          rtcp_index % 2 == 0 ? kIncomingPacket : kOutgoingPacket,
-          rtcp_packets[rtcp_index - 1].data(),
-          rtcp_packets[rtcp_index - 1].size());
-      event_index++;
-      rtcp_index++;
-    }
-    if (i * playout_count >= playout_index * rtp_count) {
-      RtcEventLogTestHelper::VerifyPlayoutEvent(
-          parsed_log, event_index, playout_ssrcs[playout_index - 1]);
-      event_index++;
-      playout_index++;
-    }
-    if (i * bwe_loss_count >= bwe_loss_index * rtp_count) {
-      RtcEventLogTestHelper::VerifyBweLossEvent(
-          parsed_log, event_index, bwe_loss_updates[bwe_loss_index - 1].first,
-          bwe_loss_updates[bwe_loss_index - 1].second, i);
-      event_index++;
-      bwe_loss_index++;
-    }
-  }
-
-  // Clean up temporary file - can be pretty slow.
-  remove(temp_filename.c_str());
-}
-
-TEST(RtcEventLogTest, LogSessionAndReadBack) {
-  // Log 5 RTP, 2 RTCP, 0 playout events and 0 BWE events
-  // with no header extensions or CSRCS.
-  LogSessionAndReadBack(5, 2, 0, 0, 0, 0, 321);
-
-  // Enable AbsSendTime and TransportSequenceNumbers.
-  uint32_t extensions = 0;
-  for (uint32_t i = 0; i < kNumExtensions; i++) {
-    if (kExtensionTypes[i] == RTPExtensionType::kRtpExtensionAbsoluteSendTime ||
-        kExtensionTypes[i] ==
-            RTPExtensionType::kRtpExtensionTransportSequenceNumber) {
-      extensions |= 1u << i;
-    }
-  }
-  LogSessionAndReadBack(8, 2, 0, 0, extensions, 0, 3141592653u);
-
-  extensions = (1u << kNumExtensions) - 1;  // Enable all header extensions.
-  LogSessionAndReadBack(9, 2, 3, 2, extensions, 2, 2718281828u);
-
-  // Try all combinations of header extensions and up to 2 CSRCS.
-  for (extensions = 0; extensions < (1u << kNumExtensions); extensions++) {
-    for (uint32_t csrcs_count = 0; csrcs_count < 3; csrcs_count++) {
-      LogSessionAndReadBack(5 + extensions,   // Number of RTP packets.
-                            2 + csrcs_count,  // Number of RTCP packets.
-                            3 + csrcs_count,  // Number of playout events.
-                            1 + csrcs_count,  // Number of BWE loss events.
-                            extensions,       // Bit vector choosing extensions.
-                            csrcs_count,      // Number of contributing sources.
-                            extensions * 3 + csrcs_count + 1);  // Random seed.
-    }
-  }
-}
-
-TEST(RtcEventLogTest, LogEventAndReadBack) {
-  Random prng(987654321);
-
-  // Create one RTP and one RTCP packet containing random data.
-  size_t packet_size = prng.Rand(1000, 1100);
-  RtpPacketToSend rtp_packet =
-      GenerateRtpPacket(nullptr, 0, packet_size, &prng);
-  rtc::Buffer rtcp_packet = GenerateRtcpPacket(&prng);
-
-  // Find the name of the current test, in order to use it as a temporary
-  // filename.
-  auto test_info = ::testing::UnitTest::GetInstance()->current_test_info();
-  const std::string temp_filename =
-      test::OutputPath() + test_info->test_case_name() + test_info->name();
-
-  // Add RTP, start logging, add RTCP and then stop logging
-  rtc::ScopedFakeClock fake_clock;
-  fake_clock.SetTimeMicros(prng.Rand<uint32_t>());
-  std::unique_ptr<RtcEventLog> log_dumper(RtcEventLog::Create());
-
-  log_dumper->LogRtpHeader(kIncomingPacket, rtp_packet.data(),
-                           rtp_packet.size());
-  fake_clock.AdvanceTimeMicros(prng.Rand(1, 1000));
-
-  log_dumper->StartLogging(temp_filename, 10000000);
-  fake_clock.AdvanceTimeMicros(prng.Rand(1, 1000));
-
-  log_dumper->LogRtcpPacket(kOutgoingPacket, rtcp_packet.data(),
-                            rtcp_packet.size());
-  fake_clock.AdvanceTimeMicros(prng.Rand(1, 1000));
-
-  log_dumper->StopLogging();
-
-  // Read the generated file from disk.
-  ParsedRtcEventLog parsed_log;
-  ASSERT_TRUE(parsed_log.ParseFile(temp_filename));
-
-  // Verify that what we read back from the event log is the same as
-  // what we wrote down.
-  EXPECT_EQ(4u, parsed_log.GetNumberOfEvents());
-
-  RtcEventLogTestHelper::VerifyLogStartEvent(parsed_log, 0);
-
-  RtcEventLogTestHelper::VerifyRtpEvent(
-      parsed_log, 1, kIncomingPacket, rtp_packet.data(),
-      rtp_packet.headers_size(), rtp_packet.size());
-
-  RtcEventLogTestHelper::VerifyRtcpEvent(
-      parsed_log, 2, kOutgoingPacket, rtcp_packet.data(), rtcp_packet.size());
-
-  RtcEventLogTestHelper::VerifyLogEndEvent(parsed_log, 3);
-
-  // Clean up temporary file - can be pretty slow.
-  remove(temp_filename.c_str());
-}
-
-TEST(RtcEventLogTest, LogLossBasedBweUpdateAndReadBack) {
-  Random prng(1234);
-
-  // Generate a random packet loss event.
-  int32_t bitrate = prng.Rand(0, 10000000);
-  uint8_t fraction_lost = prng.Rand<uint8_t>();
-  int32_t total_packets = prng.Rand(1, 1000);
-
-  // Find the name of the current test, in order to use it as a temporary
-  // filename.
-  auto test_info = ::testing::UnitTest::GetInstance()->current_test_info();
-  const std::string temp_filename =
-      test::OutputPath() + test_info->test_case_name() + test_info->name();
-
-  // Start logging, add the packet loss event and then stop logging.
-  rtc::ScopedFakeClock fake_clock;
-  fake_clock.SetTimeMicros(prng.Rand<uint32_t>());
-  std::unique_ptr<RtcEventLog> log_dumper(RtcEventLog::Create());
-  log_dumper->StartLogging(temp_filename, 10000000);
-  fake_clock.AdvanceTimeMicros(prng.Rand(1, 1000));
-  log_dumper->LogLossBasedBweUpdate(bitrate, fraction_lost, total_packets);
-  fake_clock.AdvanceTimeMicros(prng.Rand(1, 1000));
-  log_dumper->StopLogging();
-
-  // Read the generated file from disk.
-  ParsedRtcEventLog parsed_log;
-  ASSERT_TRUE(parsed_log.ParseFile(temp_filename));
-
-  // Verify that what we read back from the event log is the same as
-  // what we wrote down.
-  EXPECT_EQ(3u, parsed_log.GetNumberOfEvents());
-  RtcEventLogTestHelper::VerifyLogStartEvent(parsed_log, 0);
-  RtcEventLogTestHelper::VerifyBweLossEvent(parsed_log, 1, bitrate,
-                                            fraction_lost, total_packets);
-  RtcEventLogTestHelper::VerifyLogEndEvent(parsed_log, 2);
-
-  // Clean up temporary file - can be pretty slow.
-  remove(temp_filename.c_str());
-}
-
-TEST(RtcEventLogTest, LogDelayBasedBweUpdateAndReadBack) {
-  Random prng(1234);
-
-  // Generate 3 random packet delay event.
-  int32_t bitrate1 = prng.Rand(0, 10000000);
-  int32_t bitrate2 = prng.Rand(0, 10000000);
-  int32_t bitrate3 = prng.Rand(0, 10000000);
-
-  // Find the name of the current test, in order to use it as a temporary
-  // filename.
-  auto test_info = ::testing::UnitTest::GetInstance()->current_test_info();
-  const std::string temp_filename =
-      test::OutputPath() + test_info->test_case_name() + test_info->name();
-
-  // Start logging, add the packet delay events and then stop logging.
-  rtc::ScopedFakeClock fake_clock;
-  fake_clock.SetTimeMicros(prng.Rand<uint32_t>());
-  std::unique_ptr<RtcEventLog> log_dumper(RtcEventLog::Create());
-  log_dumper->StartLogging(temp_filename, 10000000);
-  fake_clock.AdvanceTimeMicros(prng.Rand(1, 1000));
-  log_dumper->LogDelayBasedBweUpdate(bitrate1, BandwidthUsage::kBwNormal);
-  fake_clock.AdvanceTimeMicros(prng.Rand(1, 1000));
-  log_dumper->LogDelayBasedBweUpdate(bitrate2, BandwidthUsage::kBwOverusing);
-  fake_clock.AdvanceTimeMicros(prng.Rand(1, 1000));
-  log_dumper->LogDelayBasedBweUpdate(bitrate3, BandwidthUsage::kBwUnderusing);
-  fake_clock.AdvanceTimeMicros(prng.Rand(1, 1000));
-  log_dumper->StopLogging();
-
-  // Read the generated file from disk.
-  ParsedRtcEventLog parsed_log;
-  ASSERT_TRUE(parsed_log.ParseFile(temp_filename));
-
-  // Verify that what we read back from the event log is the same as
-  // what we wrote down.
-  EXPECT_EQ(5u, parsed_log.GetNumberOfEvents());
-  RtcEventLogTestHelper::VerifyLogStartEvent(parsed_log, 0);
-  RtcEventLogTestHelper::VerifyBweDelayEvent(parsed_log, 1, bitrate1,
-                                             BandwidthUsage::kBwNormal);
-  RtcEventLogTestHelper::VerifyBweDelayEvent(parsed_log, 2, bitrate2,
-                                             BandwidthUsage::kBwOverusing);
-  RtcEventLogTestHelper::VerifyBweDelayEvent(parsed_log, 3, bitrate3,
-                                             BandwidthUsage::kBwUnderusing);
-  RtcEventLogTestHelper::VerifyLogEndEvent(parsed_log, 4);
-
-  // Clean up temporary file - can be pretty slow.
-  remove(temp_filename.c_str());
-}
-
-TEST(RtcEventLogTest, LogProbeClusterCreatedAndReadBack) {
-  Random prng(794613);
-
-  int bitrate_bps0 = prng.Rand(0, 10000000);
-  int bitrate_bps1 = prng.Rand(0, 10000000);
-  int bitrate_bps2 = prng.Rand(0, 10000000);
-  int min_probes0 = prng.Rand(0, 100);
-  int min_probes1 = prng.Rand(0, 100);
-  int min_probes2 = prng.Rand(0, 100);
-  int min_bytes0 = prng.Rand(0, 10000);
-  int min_bytes1 = prng.Rand(0, 10000);
-  int min_bytes2 = prng.Rand(0, 10000);
-
-  // Find the name of the current test, in order to use it as a temporary
-  // filename.
-  auto test_info = ::testing::UnitTest::GetInstance()->current_test_info();
-  const std::string temp_filename =
-      test::OutputPath() + test_info->test_case_name() + test_info->name();
-
-  rtc::ScopedFakeClock fake_clock;
-  fake_clock.SetTimeMicros(prng.Rand<uint32_t>());
-  std::unique_ptr<RtcEventLog> log_dumper(RtcEventLog::Create());
-
-  log_dumper->StartLogging(temp_filename, 10000000);
-  log_dumper->LogProbeClusterCreated(0, bitrate_bps0, min_probes0, min_bytes0);
-  fake_clock.AdvanceTimeMicros(prng.Rand(1, 1000));
-  log_dumper->LogProbeClusterCreated(1, bitrate_bps1, min_probes1, min_bytes1);
-  fake_clock.AdvanceTimeMicros(prng.Rand(1, 1000));
-  log_dumper->LogProbeClusterCreated(2, bitrate_bps2, min_probes2, min_bytes2);
-  fake_clock.AdvanceTimeMicros(prng.Rand(1, 1000));
-  log_dumper->StopLogging();
-
-  // Read the generated file from disk.
-  ParsedRtcEventLog parsed_log;
-  ASSERT_TRUE(parsed_log.ParseFile(temp_filename));
-
-  // Verify that what we read back from the event log is the same as
-  // what we wrote down.
-  EXPECT_EQ(5u, parsed_log.GetNumberOfEvents());
-  RtcEventLogTestHelper::VerifyLogStartEvent(parsed_log, 0);
-  RtcEventLogTestHelper::VerifyBweProbeCluster(parsed_log, 1, 0, bitrate_bps0,
-                                               min_probes0, min_bytes0);
-  RtcEventLogTestHelper::VerifyBweProbeCluster(parsed_log, 2, 1, bitrate_bps1,
-                                               min_probes1, min_bytes1);
-  RtcEventLogTestHelper::VerifyBweProbeCluster(parsed_log, 3, 2, bitrate_bps2,
-                                               min_probes2, min_bytes2);
-  RtcEventLogTestHelper::VerifyLogEndEvent(parsed_log, 4);
-
-  // Clean up temporary file - can be pretty slow.
-  remove(temp_filename.c_str());
-}
-
-TEST(RtcEventLogTest, LogProbeResultSuccessAndReadBack) {
-  Random prng(192837);
-
-  int bitrate_bps0 = prng.Rand(0, 10000000);
-  int bitrate_bps1 = prng.Rand(0, 10000000);
-  int bitrate_bps2 = prng.Rand(0, 10000000);
-
-  // Find the name of the current test, in order to use it as a temporary
-  // filename.
-  auto test_info = ::testing::UnitTest::GetInstance()->current_test_info();
-  const std::string temp_filename =
-      test::OutputPath() + test_info->test_case_name() + test_info->name();
-
-  rtc::ScopedFakeClock fake_clock;
-  fake_clock.SetTimeMicros(prng.Rand<uint32_t>());
-  std::unique_ptr<RtcEventLog> log_dumper(RtcEventLog::Create());
-
-  log_dumper->StartLogging(temp_filename, 10000000);
-  log_dumper->LogProbeResultSuccess(0, bitrate_bps0);
-  fake_clock.AdvanceTimeMicros(prng.Rand(1, 1000));
-  log_dumper->LogProbeResultSuccess(1, bitrate_bps1);
-  fake_clock.AdvanceTimeMicros(prng.Rand(1, 1000));
-  log_dumper->LogProbeResultSuccess(2, bitrate_bps2);
-  fake_clock.AdvanceTimeMicros(prng.Rand(1, 1000));
-  log_dumper->StopLogging();
-
-  // Read the generated file from disk.
-  ParsedRtcEventLog parsed_log;
-  ASSERT_TRUE(parsed_log.ParseFile(temp_filename));
-
-  // Verify that what we read back from the event log is the same as
-  // what we wrote down.
-  EXPECT_EQ(5u, parsed_log.GetNumberOfEvents());
-  RtcEventLogTestHelper::VerifyLogStartEvent(parsed_log, 0);
-  RtcEventLogTestHelper::VerifyProbeResultSuccess(parsed_log, 1, 0,
-                                                  bitrate_bps0);
-  RtcEventLogTestHelper::VerifyProbeResultSuccess(parsed_log, 2, 1,
-                                                  bitrate_bps1);
-  RtcEventLogTestHelper::VerifyProbeResultSuccess(parsed_log, 3, 2,
-                                                  bitrate_bps2);
-  RtcEventLogTestHelper::VerifyLogEndEvent(parsed_log, 4);
-
-  // Clean up temporary file - can be pretty slow.
-  remove(temp_filename.c_str());
-}
-
-TEST(RtcEventLogTest, LogProbeResultFailureAndReadBack) {
-  Random prng(192837);
-
-  // Find the name of the current test, in order to use it as a temporary
-  // filename.
-  auto test_info = ::testing::UnitTest::GetInstance()->current_test_info();
-  const std::string temp_filename =
-      test::OutputPath() + test_info->test_case_name() + test_info->name();
-
-  rtc::ScopedFakeClock fake_clock;
-  fake_clock.SetTimeMicros(prng.Rand<uint32_t>());
-  std::unique_ptr<RtcEventLog> log_dumper(RtcEventLog::Create());
-
-  log_dumper->StartLogging(temp_filename, 10000000);
-  log_dumper->LogProbeResultFailure(
-      0, ProbeFailureReason::kInvalidSendReceiveInterval);
-  fake_clock.AdvanceTimeMicros(prng.Rand(1, 1000));
-  log_dumper->LogProbeResultFailure(
-      1, ProbeFailureReason::kInvalidSendReceiveRatio);
-  fake_clock.AdvanceTimeMicros(prng.Rand(1, 1000));
-  log_dumper->LogProbeResultFailure(2, ProbeFailureReason::kTimeout);
-  fake_clock.AdvanceTimeMicros(prng.Rand(1, 1000));
-  log_dumper->StopLogging();
-
-  // Read the generated file from disk.
-  ParsedRtcEventLog parsed_log;
-  ASSERT_TRUE(parsed_log.ParseFile(temp_filename));
-
-  // Verify that what we read back from the event log is the same as
-  // what we wrote down.
-  EXPECT_EQ(5u, parsed_log.GetNumberOfEvents());
-  RtcEventLogTestHelper::VerifyLogStartEvent(parsed_log, 0);
-  RtcEventLogTestHelper::VerifyProbeResultFailure(
-      parsed_log, 1, 0, ProbeFailureReason::kInvalidSendReceiveInterval);
-  RtcEventLogTestHelper::VerifyProbeResultFailure(
-      parsed_log, 2, 1, ProbeFailureReason::kInvalidSendReceiveRatio);
-  RtcEventLogTestHelper::VerifyProbeResultFailure(parsed_log, 3, 2,
-                                                  ProbeFailureReason::kTimeout);
-  RtcEventLogTestHelper::VerifyLogEndEvent(parsed_log, 4);
-
-  // Clean up temporary file - can be pretty slow.
-  remove(temp_filename.c_str());
-}
-
-class ConfigReadWriteTest {
- public:
-  ConfigReadWriteTest() : prng(987654321) {}
-  virtual ~ConfigReadWriteTest() {}
-  virtual void GenerateConfig(uint32_t extensions_bitvector) = 0;
-  virtual void VerifyConfig(const ParsedRtcEventLog& parsed_log,
-                            size_t index) = 0;
-  virtual void LogConfig(RtcEventLog* event_log) = 0;
-
-  void DoTest() {
-    // Find the name of the current test, in order to use it as a temporary
-    // filename.
-    auto test_info = ::testing::UnitTest::GetInstance()->current_test_info();
-    const std::string temp_filename =
-        test::OutputPath() + test_info->test_case_name() + test_info->name();
-
-    // Use all extensions.
-    uint32_t extensions_bitvector = (1u << kNumExtensions) - 1;
-    GenerateConfig(extensions_bitvector);
-
-    // Log a single config event and stop logging.
-    rtc::ScopedFakeClock fake_clock;
-    fake_clock.SetTimeMicros(prng.Rand<uint32_t>());
-    std::unique_ptr<RtcEventLog> log_dumper(RtcEventLog::Create());
-
-    log_dumper->StartLogging(temp_filename, 10000000);
-    LogConfig(log_dumper.get());
-    log_dumper->StopLogging();
-
-    // Read the generated file from disk.
-    ParsedRtcEventLog parsed_log;
-    ASSERT_TRUE(parsed_log.ParseFile(temp_filename));
-
-    // Check the generated number of events.
-    EXPECT_EQ(3u, parsed_log.GetNumberOfEvents());
-
-    RtcEventLogTestHelper::VerifyLogStartEvent(parsed_log, 0);
-
-    // Verify that the parsed config struct matches the one that was logged.
-    VerifyConfig(parsed_log, 1);
-
-    RtcEventLogTestHelper::VerifyLogEndEvent(parsed_log, 2);
-
-    // Clean up temporary file - can be pretty slow.
-    remove(temp_filename.c_str());
-  }
-  Random prng;
-};
-
-class AudioReceiveConfigReadWriteTest : public ConfigReadWriteTest {
- public:
-  void GenerateConfig(uint32_t extensions_bitvector) override {
-    GenerateAudioReceiveConfig(extensions_bitvector, &config, &prng);
-  }
-  void LogConfig(RtcEventLog* event_log) override {
-    event_log->LogAudioReceiveStreamConfig(config);
-  }
-  void VerifyConfig(const ParsedRtcEventLog& parsed_log,
-                    size_t index) override {
-    RtcEventLogTestHelper::VerifyAudioReceiveStreamConfig(parsed_log, index,
-                                                          config);
-  }
-  rtclog::StreamConfig config;
-};
-
-class AudioSendConfigReadWriteTest : public ConfigReadWriteTest {
- public:
-  AudioSendConfigReadWriteTest() {}
-  void GenerateConfig(uint32_t extensions_bitvector) override {
-    GenerateAudioSendConfig(extensions_bitvector, &config, &prng);
-  }
-  void LogConfig(RtcEventLog* event_log) override {
-    event_log->LogAudioSendStreamConfig(config);
-  }
-  void VerifyConfig(const ParsedRtcEventLog& parsed_log,
-                    size_t index) override {
-    RtcEventLogTestHelper::VerifyAudioSendStreamConfig(parsed_log, index,
-                                                       config);
-  }
-  rtclog::StreamConfig config;
-};
-
-class VideoReceiveConfigReadWriteTest : public ConfigReadWriteTest {
- public:
-  VideoReceiveConfigReadWriteTest() {}
-  void GenerateConfig(uint32_t extensions_bitvector) override {
-    GenerateVideoReceiveConfig(extensions_bitvector, &config, &prng);
-  }
-  void LogConfig(RtcEventLog* event_log) override {
-    event_log->LogVideoReceiveStreamConfig(config);
-  }
-  void VerifyConfig(const ParsedRtcEventLog& parsed_log,
-                    size_t index) override {
-    RtcEventLogTestHelper::VerifyVideoReceiveStreamConfig(parsed_log, index,
-                                                          config);
-  }
-  rtclog::StreamConfig config;
-};
-
-class VideoSendConfigReadWriteTest : public ConfigReadWriteTest {
- public:
-  VideoSendConfigReadWriteTest() {}
-  void GenerateConfig(uint32_t extensions_bitvector) override {
-    GenerateVideoSendConfig(extensions_bitvector, &config, &prng);
-  }
-  void LogConfig(RtcEventLog* event_log) override {
-    event_log->LogVideoSendStreamConfig(config);
-  }
-  void VerifyConfig(const ParsedRtcEventLog& parsed_log,
-                    size_t index) override {
-    RtcEventLogTestHelper::VerifyVideoSendStreamConfig(parsed_log, index,
-                                                       config);
-  }
-  rtclog::StreamConfig config;
-};
-
-class AudioNetworkAdaptationReadWriteTest : public ConfigReadWriteTest {
- public:
-  void GenerateConfig(uint32_t extensions_bitvector) override {
-    GenerateAudioNetworkAdaptation(extensions_bitvector, &config, &prng);
-  }
-  void LogConfig(RtcEventLog* event_log) override {
-    event_log->LogAudioNetworkAdaptation(config);
-  }
-  void VerifyConfig(const ParsedRtcEventLog& parsed_log,
-                    size_t index) override {
-    RtcEventLogTestHelper::VerifyAudioNetworkAdaptation(parsed_log, index,
-                                                        config);
-  }
-  AudioEncoderRuntimeConfig config;
-};
-
-TEST(RtcEventLogTest, LogAudioReceiveConfig) {
-  AudioReceiveConfigReadWriteTest test;
-  test.DoTest();
-}
-
-TEST(RtcEventLogTest, LogAudioSendConfig) {
-  AudioSendConfigReadWriteTest test;
-  test.DoTest();
-}
-
-TEST(RtcEventLogTest, LogVideoReceiveConfig) {
-  VideoReceiveConfigReadWriteTest test;
-  test.DoTest();
-}
-
-TEST(RtcEventLogTest, LogVideoSendConfig) {
-  VideoSendConfigReadWriteTest test;
-  test.DoTest();
-}
-
-TEST(RtcEventLogTest, LogAudioNetworkAdaptation) {
-  AudioNetworkAdaptationReadWriteTest test;
-  test.DoTest();
-}
-
-}  // namespace webrtc
diff --git a/logging/rtc_event_log/rtc_event_log_unittest_helper.cc b/logging/rtc_event_log/rtc_event_log_unittest_helper.cc
deleted file mode 100644
index 9d98855..0000000
--- a/logging/rtc_event_log/rtc_event_log_unittest_helper.cc
+++ /dev/null
@@ -1,573 +0,0 @@
-/*
- *  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/logging/rtc_event_log/rtc_event_log_unittest_helper.h"
-
-#include <string.h>
-
-#include <string>
-#include <vector>
-
-#include "webrtc/modules/audio_coding/audio_network_adaptor/include/audio_network_adaptor.h"
-#include "webrtc/modules/remote_bitrate_estimator/include/bwe_defines.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/testsupport/fileutils.h"
-
-// Files generated at build-time by the protobuf compiler.
-#ifdef WEBRTC_ANDROID_PLATFORM_BUILD
-#include "external/webrtc/webrtc/logging/rtc_event_log/rtc_event_log.pb.h"
-#else
-#include "webrtc/logging/rtc_event_log/rtc_event_log.pb.h"
-#endif
-
-namespace webrtc {
-
-namespace {
-
-BandwidthUsage GetRuntimeDetectorState(
-    rtclog::DelayBasedBweUpdate::DetectorState detector_state) {
-  switch (detector_state) {
-    case rtclog::DelayBasedBweUpdate::BWE_NORMAL:
-      return BandwidthUsage::kBwNormal;
-    case rtclog::DelayBasedBweUpdate::BWE_UNDERUSING:
-      return BandwidthUsage::kBwUnderusing;
-    case rtclog::DelayBasedBweUpdate::BWE_OVERUSING:
-      return BandwidthUsage::kBwOverusing;
-  }
-  RTC_NOTREACHED();
-  return BandwidthUsage::kBwNormal;
-}
-
-rtclog::BweProbeResult::ResultType GetProbeResultType(
-    ProbeFailureReason failure_reason) {
-  switch (failure_reason) {
-    case kInvalidSendReceiveInterval:
-      return rtclog::BweProbeResult::INVALID_SEND_RECEIVE_INTERVAL;
-    case kInvalidSendReceiveRatio:
-      return rtclog::BweProbeResult::INVALID_SEND_RECEIVE_RATIO;
-    case kTimeout:
-      return rtclog::BweProbeResult::TIMEOUT;
-  }
-  RTC_NOTREACHED();
-  return rtclog::BweProbeResult::SUCCESS;
-}
-}  // namespace
-
-// Checks that the event has a timestamp, a type and exactly the data field
-// corresponding to the type.
-::testing::AssertionResult IsValidBasicEvent(const rtclog::Event& event) {
-  if (!event.has_timestamp_us()) {
-    return ::testing::AssertionFailure() << "Event has no timestamp";
-  }
-  if (!event.has_type()) {
-    return ::testing::AssertionFailure() << "Event has no event type";
-  }
-  rtclog::Event_EventType type = event.type();
-  if ((type == rtclog::Event::RTP_EVENT) != event.has_rtp_packet()) {
-    return ::testing::AssertionFailure()
-           << "Event of type " << type << " has "
-           << (event.has_rtp_packet() ? "" : "no ") << "RTP packet";
-  }
-  if ((type == rtclog::Event::RTCP_EVENT) != event.has_rtcp_packet()) {
-    return ::testing::AssertionFailure()
-           << "Event of type " << type << " has "
-           << (event.has_rtcp_packet() ? "" : "no ") << "RTCP packet";
-  }
-  if ((type == rtclog::Event::LOSS_BASED_BWE_UPDATE) !=
-      event.has_loss_based_bwe_update()) {
-    return ::testing::AssertionFailure()
-           << "Event of type " << type << " has "
-           << (event.has_loss_based_bwe_update() ? "" : "no ") << "loss update";
-  }
-  if ((type == rtclog::Event::DELAY_BASED_BWE_UPDATE) !=
-      event.has_delay_based_bwe_update()) {
-    return ::testing::AssertionFailure()
-           << "Event of type " << type << " has "
-           << (event.has_delay_based_bwe_update() ? "" : "no ")
-           << "delay update";
-  }
-  if ((type == rtclog::Event::AUDIO_PLAYOUT_EVENT) !=
-      event.has_audio_playout_event()) {
-    return ::testing::AssertionFailure()
-           << "Event of type " << type << " has "
-           << (event.has_audio_playout_event() ? "" : "no ")
-           << "audio_playout event";
-  }
-  if ((type == rtclog::Event::VIDEO_RECEIVER_CONFIG_EVENT) !=
-      event.has_video_receiver_config()) {
-    return ::testing::AssertionFailure()
-           << "Event of type " << type << " has "
-           << (event.has_video_receiver_config() ? "" : "no ")
-           << "receiver config";
-  }
-  if ((type == rtclog::Event::VIDEO_SENDER_CONFIG_EVENT) !=
-      event.has_video_sender_config()) {
-    return ::testing::AssertionFailure()
-           << "Event of type " << type << " has "
-           << (event.has_video_sender_config() ? "" : "no ") << "sender config";
-  }
-  if ((type == rtclog::Event::AUDIO_RECEIVER_CONFIG_EVENT) !=
-      event.has_audio_receiver_config()) {
-    return ::testing::AssertionFailure()
-           << "Event of type " << type << " has "
-           << (event.has_audio_receiver_config() ? "" : "no ")
-           << "audio receiver config";
-  }
-  if ((type == rtclog::Event::AUDIO_SENDER_CONFIG_EVENT) !=
-      event.has_audio_sender_config()) {
-    return ::testing::AssertionFailure()
-           << "Event of type " << type << " has "
-           << (event.has_audio_sender_config() ? "" : "no ")
-           << "audio sender config";
-  }
-  if ((type == rtclog::Event::AUDIO_NETWORK_ADAPTATION_EVENT) !=
-      event.has_audio_network_adaptation()) {
-    return ::testing::AssertionFailure()
-           << "Event of type " << type << " has "
-           << (event.has_audio_network_adaptation() ? "" : "no ")
-           << "audio network adaptation";
-  }
-  if ((type == rtclog::Event::BWE_PROBE_CLUSTER_CREATED_EVENT) !=
-      event.has_probe_cluster()) {
-    return ::testing::AssertionFailure()
-           << "Event of type " << type << " has "
-           << (event.has_probe_cluster() ? "" : "no ") << "bwe probe cluster";
-  }
-  if ((type == rtclog::Event::BWE_PROBE_RESULT_EVENT) !=
-      event.has_probe_result()) {
-    return ::testing::AssertionFailure()
-           << "Event of type " << type << " has "
-           << (event.has_probe_result() ? "" : "no ") << "bwe probe result";
-  }
-  return ::testing::AssertionSuccess();
-}
-
-void VerifyStreamConfigsAreEqual(const rtclog::StreamConfig& config_1,
-                                 const rtclog::StreamConfig& config_2) {
-  EXPECT_EQ(config_1.remote_ssrc, config_2.remote_ssrc);
-  EXPECT_EQ(config_1.local_ssrc, config_2.local_ssrc);
-  EXPECT_EQ(config_1.rtx_ssrc, config_2.rtx_ssrc);
-  EXPECT_EQ(config_1.rtcp_mode, config_2.rtcp_mode);
-  EXPECT_EQ(config_1.remb, config_2.remb);
-
-  ASSERT_EQ(config_1.rtp_extensions.size(), config_2.rtp_extensions.size());
-  for (size_t i = 0; i < config_2.rtp_extensions.size(); i++) {
-    EXPECT_EQ(config_1.rtp_extensions[i].uri, config_2.rtp_extensions[i].uri);
-    EXPECT_EQ(config_1.rtp_extensions[i].id, config_2.rtp_extensions[i].id);
-  }
-  ASSERT_EQ(config_1.codecs.size(), config_2.codecs.size());
-  for (size_t i = 0; i < config_2.codecs.size(); i++) {
-    EXPECT_EQ(config_1.codecs[i].payload_name, config_2.codecs[i].payload_name);
-    EXPECT_EQ(config_1.codecs[i].payload_type, config_2.codecs[i].payload_type);
-    EXPECT_EQ(config_1.codecs[i].rtx_payload_type,
-              config_2.codecs[i].rtx_payload_type);
-  }
-}
-
-void RtcEventLogTestHelper::VerifyVideoReceiveStreamConfig(
-    const ParsedRtcEventLog& parsed_log,
-    size_t index,
-    const rtclog::StreamConfig& config) {
-  const rtclog::Event& event = parsed_log.events_[index];
-  ASSERT_TRUE(IsValidBasicEvent(event));
-  ASSERT_EQ(rtclog::Event::VIDEO_RECEIVER_CONFIG_EVENT, event.type());
-  const rtclog::VideoReceiveConfig& receiver_config =
-      event.video_receiver_config();
-  // Check SSRCs.
-  ASSERT_TRUE(receiver_config.has_remote_ssrc());
-  EXPECT_EQ(config.remote_ssrc, receiver_config.remote_ssrc());
-  ASSERT_TRUE(receiver_config.has_local_ssrc());
-  EXPECT_EQ(config.local_ssrc, receiver_config.local_ssrc());
-  // Check RTCP settings.
-  ASSERT_TRUE(receiver_config.has_rtcp_mode());
-  if (config.rtcp_mode == RtcpMode::kCompound) {
-    EXPECT_EQ(rtclog::VideoReceiveConfig::RTCP_COMPOUND,
-              receiver_config.rtcp_mode());
-  } else {
-    EXPECT_EQ(rtclog::VideoReceiveConfig::RTCP_REDUCEDSIZE,
-              receiver_config.rtcp_mode());
-  }
-  ASSERT_TRUE(receiver_config.has_remb());
-  EXPECT_EQ(config.remb, receiver_config.remb());
-  // Check RTX map.
-  for (const rtclog::RtxMap& rtx_map : receiver_config.rtx_map()) {
-    ASSERT_TRUE(rtx_map.has_payload_type());
-    ASSERT_TRUE(rtx_map.has_config());
-    const rtclog::RtxConfig& rtx_config = rtx_map.config();
-    ASSERT_TRUE(rtx_config.has_rtx_ssrc());
-    ASSERT_TRUE(rtx_config.has_rtx_payload_type());
-
-    EXPECT_EQ(config.rtx_ssrc, rtx_config.rtx_ssrc());
-    auto codec_found =
-        std::find_if(config.codecs.begin(), config.codecs.end(),
-                     [&rtx_map](const rtclog::StreamConfig::Codec& codec) {
-                       return rtx_map.payload_type() == codec.payload_type;
-                     });
-    ASSERT_TRUE(codec_found != config.codecs.end());
-    EXPECT_EQ(rtx_config.rtx_payload_type(), codec_found->rtx_payload_type);
-  }
-  // Check header extensions.
-  ASSERT_EQ(static_cast<int>(config.rtp_extensions.size()),
-            receiver_config.header_extensions_size());
-  for (int i = 0; i < receiver_config.header_extensions_size(); i++) {
-    ASSERT_TRUE(receiver_config.header_extensions(i).has_name());
-    ASSERT_TRUE(receiver_config.header_extensions(i).has_id());
-    const std::string& name = receiver_config.header_extensions(i).name();
-    int id = receiver_config.header_extensions(i).id();
-    EXPECT_EQ(config.rtp_extensions[i].id, id);
-    EXPECT_EQ(config.rtp_extensions[i].uri, name);
-  }
-  // Check decoders.
-  ASSERT_EQ(static_cast<int>(config.codecs.size()),
-            receiver_config.decoders_size());
-  for (int i = 0; i < receiver_config.decoders_size(); i++) {
-    ASSERT_TRUE(receiver_config.decoders(i).has_name());
-    ASSERT_TRUE(receiver_config.decoders(i).has_payload_type());
-    const std::string& decoder_name = receiver_config.decoders(i).name();
-    int decoder_type = receiver_config.decoders(i).payload_type();
-    EXPECT_EQ(config.codecs[i].payload_name, decoder_name);
-    EXPECT_EQ(config.codecs[i].payload_type, decoder_type);
-  }
-
-  // Check consistency of the parser.
-  rtclog::StreamConfig parsed_config = parsed_log.GetVideoReceiveConfig(index);
-  VerifyStreamConfigsAreEqual(config, parsed_config);
-}
-
-void RtcEventLogTestHelper::VerifyVideoSendStreamConfig(
-    const ParsedRtcEventLog& parsed_log,
-    size_t index,
-    const rtclog::StreamConfig& config) {
-  const rtclog::Event& event = parsed_log.events_[index];
-  ASSERT_TRUE(IsValidBasicEvent(event));
-  ASSERT_EQ(rtclog::Event::VIDEO_SENDER_CONFIG_EVENT, event.type());
-  const rtclog::VideoSendConfig& sender_config = event.video_sender_config();
-
-  EXPECT_EQ(config.local_ssrc, sender_config.ssrcs(0));
-  EXPECT_EQ(config.rtx_ssrc, sender_config.rtx_ssrcs(0));
-
-  // Check header extensions.
-  ASSERT_EQ(static_cast<int>(config.rtp_extensions.size()),
-            sender_config.header_extensions_size());
-  for (int i = 0; i < sender_config.header_extensions_size(); i++) {
-    ASSERT_TRUE(sender_config.header_extensions(i).has_name());
-    ASSERT_TRUE(sender_config.header_extensions(i).has_id());
-    const std::string& name = sender_config.header_extensions(i).name();
-    int id = sender_config.header_extensions(i).id();
-    EXPECT_EQ(config.rtp_extensions[i].id, id);
-    EXPECT_EQ(config.rtp_extensions[i].uri, name);
-  }
-  // Check encoder.
-  ASSERT_TRUE(sender_config.has_encoder());
-  ASSERT_TRUE(sender_config.encoder().has_name());
-  ASSERT_TRUE(sender_config.encoder().has_payload_type());
-  EXPECT_EQ(config.codecs[0].payload_name, sender_config.encoder().name());
-  EXPECT_EQ(config.codecs[0].payload_type,
-            sender_config.encoder().payload_type());
-
-  EXPECT_EQ(config.codecs[0].rtx_payload_type,
-            sender_config.rtx_payload_type());
-
-  // Check consistency of the parser.
-  std::vector<rtclog::StreamConfig> parsed_configs =
-      parsed_log.GetVideoSendConfig(index);
-  ASSERT_EQ(1u, parsed_configs.size());
-  VerifyStreamConfigsAreEqual(config, parsed_configs[0]);
-}
-
-void RtcEventLogTestHelper::VerifyAudioReceiveStreamConfig(
-    const ParsedRtcEventLog& parsed_log,
-    size_t index,
-    const rtclog::StreamConfig& config) {
-  const rtclog::Event& event = parsed_log.events_[index];
-  ASSERT_TRUE(IsValidBasicEvent(event));
-  ASSERT_EQ(rtclog::Event::AUDIO_RECEIVER_CONFIG_EVENT, event.type());
-  const rtclog::AudioReceiveConfig& receiver_config =
-      event.audio_receiver_config();
-  // Check SSRCs.
-  ASSERT_TRUE(receiver_config.has_remote_ssrc());
-  EXPECT_EQ(config.remote_ssrc, receiver_config.remote_ssrc());
-  ASSERT_TRUE(receiver_config.has_local_ssrc());
-  EXPECT_EQ(config.local_ssrc, receiver_config.local_ssrc());
-  // Check header extensions.
-  ASSERT_EQ(static_cast<int>(config.rtp_extensions.size()),
-            receiver_config.header_extensions_size());
-  for (int i = 0; i < receiver_config.header_extensions_size(); i++) {
-    ASSERT_TRUE(receiver_config.header_extensions(i).has_name());
-    ASSERT_TRUE(receiver_config.header_extensions(i).has_id());
-    const std::string& name = receiver_config.header_extensions(i).name();
-    int id = receiver_config.header_extensions(i).id();
-    EXPECT_EQ(config.rtp_extensions[i].id, id);
-    EXPECT_EQ(config.rtp_extensions[i].uri, name);
-  }
-
-  // Check consistency of the parser.
-  rtclog::StreamConfig parsed_config = parsed_log.GetAudioReceiveConfig(index);
-  EXPECT_EQ(config.remote_ssrc, parsed_config.remote_ssrc);
-  EXPECT_EQ(config.local_ssrc, parsed_config.local_ssrc);
-  // Check header extensions.
-  EXPECT_EQ(config.rtp_extensions.size(), parsed_config.rtp_extensions.size());
-  for (size_t i = 0; i < parsed_config.rtp_extensions.size(); i++) {
-    EXPECT_EQ(config.rtp_extensions[i].uri,
-              parsed_config.rtp_extensions[i].uri);
-    EXPECT_EQ(config.rtp_extensions[i].id, parsed_config.rtp_extensions[i].id);
-  }
-}
-
-void RtcEventLogTestHelper::VerifyAudioSendStreamConfig(
-    const ParsedRtcEventLog& parsed_log,
-    size_t index,
-    const rtclog::StreamConfig& config) {
-  const rtclog::Event& event = parsed_log.events_[index];
-  ASSERT_TRUE(IsValidBasicEvent(event));
-  ASSERT_EQ(rtclog::Event::AUDIO_SENDER_CONFIG_EVENT, event.type());
-  const rtclog::AudioSendConfig& sender_config = event.audio_sender_config();
-  // Check SSRCs.
-  EXPECT_EQ(config.local_ssrc, sender_config.ssrc());
-  // Check header extensions.
-  ASSERT_EQ(static_cast<int>(config.rtp_extensions.size()),
-            sender_config.header_extensions_size());
-  for (int i = 0; i < sender_config.header_extensions_size(); i++) {
-    ASSERT_TRUE(sender_config.header_extensions(i).has_name());
-    ASSERT_TRUE(sender_config.header_extensions(i).has_id());
-    const std::string& name = sender_config.header_extensions(i).name();
-    int id = sender_config.header_extensions(i).id();
-    EXPECT_EQ(config.rtp_extensions[i].id, id);
-    EXPECT_EQ(config.rtp_extensions[i].uri, name);
-  }
-
-  // Check consistency of the parser.
-  rtclog::StreamConfig parsed_config = parsed_log.GetAudioSendConfig(index);
-  VerifyStreamConfigsAreEqual(config, parsed_config);
-}
-
-void RtcEventLogTestHelper::VerifyRtpEvent(const ParsedRtcEventLog& parsed_log,
-                                           size_t index,
-                                           PacketDirection direction,
-                                           const uint8_t* header,
-                                           size_t header_size,
-                                           size_t total_size) {
-  const rtclog::Event& event = parsed_log.events_[index];
-  ASSERT_TRUE(IsValidBasicEvent(event));
-  ASSERT_EQ(rtclog::Event::RTP_EVENT, event.type());
-  const rtclog::RtpPacket& rtp_packet = event.rtp_packet();
-  ASSERT_TRUE(rtp_packet.has_incoming());
-  EXPECT_EQ(direction == kIncomingPacket, rtp_packet.incoming());
-  ASSERT_TRUE(rtp_packet.has_packet_length());
-  EXPECT_EQ(total_size, rtp_packet.packet_length());
-  ASSERT_TRUE(rtp_packet.has_header());
-  ASSERT_EQ(header_size, rtp_packet.header().size());
-  for (size_t i = 0; i < header_size; i++) {
-    EXPECT_EQ(header[i], static_cast<uint8_t>(rtp_packet.header()[i]));
-  }
-
-  // Check consistency of the parser.
-  PacketDirection parsed_direction;
-  uint8_t parsed_header[1500];
-  size_t parsed_header_size, parsed_total_size;
-  parsed_log.GetRtpHeader(index, &parsed_direction, parsed_header,
-                          &parsed_header_size, &parsed_total_size);
-  EXPECT_EQ(direction, parsed_direction);
-  ASSERT_EQ(header_size, parsed_header_size);
-  EXPECT_EQ(0, std::memcmp(header, parsed_header, header_size));
-  EXPECT_EQ(total_size, parsed_total_size);
-}
-
-void RtcEventLogTestHelper::VerifyRtcpEvent(const ParsedRtcEventLog& parsed_log,
-                                            size_t index,
-                                            PacketDirection direction,
-                                            const uint8_t* packet,
-                                            size_t total_size) {
-  const rtclog::Event& event = parsed_log.events_[index];
-  ASSERT_TRUE(IsValidBasicEvent(event));
-  ASSERT_EQ(rtclog::Event::RTCP_EVENT, event.type());
-  const rtclog::RtcpPacket& rtcp_packet = event.rtcp_packet();
-  ASSERT_TRUE(rtcp_packet.has_incoming());
-  EXPECT_EQ(direction == kIncomingPacket, rtcp_packet.incoming());
-  ASSERT_TRUE(rtcp_packet.has_packet_data());
-  ASSERT_EQ(total_size, rtcp_packet.packet_data().size());
-  for (size_t i = 0; i < total_size; i++) {
-    EXPECT_EQ(packet[i], static_cast<uint8_t>(rtcp_packet.packet_data()[i]));
-  }
-
-  // Check consistency of the parser.
-  PacketDirection parsed_direction;
-  uint8_t parsed_packet[1500];
-  size_t parsed_total_size;
-  parsed_log.GetRtcpPacket(index, &parsed_direction, parsed_packet,
-                           &parsed_total_size);
-  EXPECT_EQ(direction, parsed_direction);
-  ASSERT_EQ(total_size, parsed_total_size);
-  EXPECT_EQ(0, std::memcmp(packet, parsed_packet, total_size));
-}
-
-void RtcEventLogTestHelper::VerifyPlayoutEvent(
-    const ParsedRtcEventLog& parsed_log,
-    size_t index,
-    uint32_t ssrc) {
-  const rtclog::Event& event = parsed_log.events_[index];
-  ASSERT_TRUE(IsValidBasicEvent(event));
-  ASSERT_EQ(rtclog::Event::AUDIO_PLAYOUT_EVENT, event.type());
-  const rtclog::AudioPlayoutEvent& playout_event = event.audio_playout_event();
-  ASSERT_TRUE(playout_event.has_local_ssrc());
-  EXPECT_EQ(ssrc, playout_event.local_ssrc());
-
-  // Check consistency of the parser.
-  uint32_t parsed_ssrc;
-  parsed_log.GetAudioPlayout(index, &parsed_ssrc);
-  EXPECT_EQ(ssrc, parsed_ssrc);
-}
-
-void RtcEventLogTestHelper::VerifyBweLossEvent(
-    const ParsedRtcEventLog& parsed_log,
-    size_t index,
-    int32_t bitrate,
-    uint8_t fraction_loss,
-    int32_t total_packets) {
-  const rtclog::Event& event = parsed_log.events_[index];
-  ASSERT_TRUE(IsValidBasicEvent(event));
-  ASSERT_EQ(rtclog::Event::LOSS_BASED_BWE_UPDATE, event.type());
-  const rtclog::LossBasedBweUpdate& bwe_event = event.loss_based_bwe_update();
-  ASSERT_TRUE(bwe_event.has_bitrate_bps());
-  EXPECT_EQ(bitrate, bwe_event.bitrate_bps());
-  ASSERT_TRUE(bwe_event.has_fraction_loss());
-  EXPECT_EQ(fraction_loss, bwe_event.fraction_loss());
-  ASSERT_TRUE(bwe_event.has_total_packets());
-  EXPECT_EQ(total_packets, bwe_event.total_packets());
-
-  // Check consistency of the parser.
-  int32_t parsed_bitrate;
-  uint8_t parsed_fraction_loss;
-  int32_t parsed_total_packets;
-  parsed_log.GetLossBasedBweUpdate(
-      index, &parsed_bitrate, &parsed_fraction_loss, &parsed_total_packets);
-  EXPECT_EQ(bitrate, parsed_bitrate);
-  EXPECT_EQ(fraction_loss, parsed_fraction_loss);
-  EXPECT_EQ(total_packets, parsed_total_packets);
-}
-
-void RtcEventLogTestHelper::VerifyBweDelayEvent(
-    const ParsedRtcEventLog& parsed_log,
-    size_t index,
-    int32_t bitrate,
-    BandwidthUsage detector_state) {
-  const rtclog::Event& event = parsed_log.events_[index];
-  ASSERT_TRUE(IsValidBasicEvent(event));
-  ASSERT_EQ(rtclog::Event::DELAY_BASED_BWE_UPDATE, event.type());
-  const rtclog::DelayBasedBweUpdate& bwe_event = event.delay_based_bwe_update();
-  ASSERT_TRUE(bwe_event.has_bitrate_bps());
-  EXPECT_EQ(bitrate, bwe_event.bitrate_bps());
-  ASSERT_TRUE(bwe_event.has_detector_state());
-  EXPECT_EQ(detector_state,
-            GetRuntimeDetectorState(bwe_event.detector_state()));
-
-  // Check consistency of the parser.
-  ParsedRtcEventLog::BweDelayBasedUpdate res =
-      parsed_log.GetDelayBasedBweUpdate(index);
-  EXPECT_EQ(res.bitrate_bps, bitrate);
-  EXPECT_EQ(res.detector_state, detector_state);
-}
-
-void RtcEventLogTestHelper::VerifyAudioNetworkAdaptation(
-    const ParsedRtcEventLog& parsed_log,
-    size_t index,
-    const AudioEncoderRuntimeConfig& config) {
-  AudioEncoderRuntimeConfig parsed_config;
-  parsed_log.GetAudioNetworkAdaptation(index, &parsed_config);
-  EXPECT_EQ(config.bitrate_bps, parsed_config.bitrate_bps);
-  EXPECT_EQ(config.enable_dtx, parsed_config.enable_dtx);
-  EXPECT_EQ(config.enable_fec, parsed_config.enable_fec);
-  EXPECT_EQ(config.frame_length_ms, parsed_config.frame_length_ms);
-  EXPECT_EQ(config.num_channels, parsed_config.num_channels);
-  EXPECT_EQ(config.uplink_packet_loss_fraction,
-            parsed_config.uplink_packet_loss_fraction);
-}
-
-void RtcEventLogTestHelper::VerifyLogStartEvent(
-    const ParsedRtcEventLog& parsed_log,
-    size_t index) {
-  const rtclog::Event& event = parsed_log.events_[index];
-  ASSERT_TRUE(IsValidBasicEvent(event));
-  EXPECT_EQ(rtclog::Event::LOG_START, event.type());
-}
-
-void RtcEventLogTestHelper::VerifyLogEndEvent(
-    const ParsedRtcEventLog& parsed_log,
-    size_t index) {
-  const rtclog::Event& event = parsed_log.events_[index];
-  ASSERT_TRUE(IsValidBasicEvent(event));
-  EXPECT_EQ(rtclog::Event::LOG_END, event.type());
-}
-
-void RtcEventLogTestHelper::VerifyBweProbeCluster(
-    const ParsedRtcEventLog& parsed_log,
-    size_t index,
-    uint32_t id,
-    uint32_t bitrate_bps,
-    uint32_t min_probes,
-    uint32_t min_bytes) {
-  const rtclog::Event& event = parsed_log.events_[index];
-  ASSERT_TRUE(IsValidBasicEvent(event));
-  EXPECT_EQ(rtclog::Event::BWE_PROBE_CLUSTER_CREATED_EVENT, event.type());
-
-  const rtclog::BweProbeCluster& bwe_event = event.probe_cluster();
-  ASSERT_TRUE(bwe_event.has_id());
-  EXPECT_EQ(id, bwe_event.id());
-  ASSERT_TRUE(bwe_event.has_bitrate_bps());
-  EXPECT_EQ(bitrate_bps, bwe_event.bitrate_bps());
-  ASSERT_TRUE(bwe_event.has_min_packets());
-  EXPECT_EQ(min_probes, bwe_event.min_packets());
-  ASSERT_TRUE(bwe_event.has_min_bytes());
-  EXPECT_EQ(min_bytes, bwe_event.min_bytes());
-
-  // TODO(philipel): Verify the parser when parsing has been implemented.
-}
-
-void RtcEventLogTestHelper::VerifyProbeResultSuccess(
-    const ParsedRtcEventLog& parsed_log,
-    size_t index,
-    uint32_t id,
-    uint32_t bitrate_bps) {
-  const rtclog::Event& event = parsed_log.events_[index];
-  ASSERT_TRUE(IsValidBasicEvent(event));
-  EXPECT_EQ(rtclog::Event::BWE_PROBE_RESULT_EVENT, event.type());
-
-  const rtclog::BweProbeResult& bwe_event = event.probe_result();
-  ASSERT_TRUE(bwe_event.has_id());
-  EXPECT_EQ(id, bwe_event.id());
-  ASSERT_TRUE(bwe_event.has_bitrate_bps());
-  EXPECT_EQ(bitrate_bps, bwe_event.bitrate_bps());
-  ASSERT_TRUE(bwe_event.has_result());
-  EXPECT_EQ(rtclog::BweProbeResult::SUCCESS, bwe_event.result());
-
-  // TODO(philipel): Verify the parser when parsing has been implemented.
-}
-
-void RtcEventLogTestHelper::VerifyProbeResultFailure(
-    const ParsedRtcEventLog& parsed_log,
-    size_t index,
-    uint32_t id,
-    ProbeFailureReason failure_reason) {
-  const rtclog::Event& event = parsed_log.events_[index];
-  ASSERT_TRUE(IsValidBasicEvent(event));
-  EXPECT_EQ(rtclog::Event::BWE_PROBE_RESULT_EVENT, event.type());
-
-  const rtclog::BweProbeResult& bwe_event = event.probe_result();
-  ASSERT_TRUE(bwe_event.has_id());
-  EXPECT_EQ(id, bwe_event.id());
-  ASSERT_TRUE(bwe_event.has_result());
-  EXPECT_EQ(GetProbeResultType(failure_reason), bwe_event.result());
-  ASSERT_FALSE(bwe_event.has_bitrate_bps());
-
-  // TODO(philipel): Verify the parser when parsing has been implemented.
-}
-
-}  // namespace webrtc
diff --git a/logging/rtc_event_log/rtc_event_log_unittest_helper.h b/logging/rtc_event_log/rtc_event_log_unittest_helper.h
deleted file mode 100644
index 04aa6bf..0000000
--- a/logging/rtc_event_log/rtc_event_log_unittest_helper.h
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- *  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_LOGGING_RTC_EVENT_LOG_RTC_EVENT_LOG_UNITTEST_HELPER_H_
-#define WEBRTC_LOGGING_RTC_EVENT_LOG_RTC_EVENT_LOG_UNITTEST_HELPER_H_
-
-#include "webrtc/call/call.h"
-#include "webrtc/logging/rtc_event_log/rtc_event_log_parser.h"
-
-namespace webrtc {
-
-class RtcEventLogTestHelper {
- public:
-  static void VerifyVideoReceiveStreamConfig(
-      const ParsedRtcEventLog& parsed_log,
-      size_t index,
-      const rtclog::StreamConfig& config);
-  static void VerifyVideoSendStreamConfig(const ParsedRtcEventLog& parsed_log,
-                                          size_t index,
-                                          const rtclog::StreamConfig& config);
-  static void VerifyAudioReceiveStreamConfig(
-      const ParsedRtcEventLog& parsed_log,
-      size_t index,
-      const rtclog::StreamConfig& config);
-  static void VerifyAudioSendStreamConfig(const ParsedRtcEventLog& parsed_log,
-                                          size_t index,
-                                          const rtclog::StreamConfig& config);
-  static void VerifyRtpEvent(const ParsedRtcEventLog& parsed_log,
-                             size_t index,
-                             PacketDirection direction,
-                             const uint8_t* header,
-                             size_t header_size,
-                             size_t total_size);
-  static void VerifyRtcpEvent(const ParsedRtcEventLog& parsed_log,
-                              size_t index,
-                              PacketDirection direction,
-                              const uint8_t* packet,
-                              size_t total_size);
-  static void VerifyPlayoutEvent(const ParsedRtcEventLog& parsed_log,
-                                 size_t index,
-                                 uint32_t ssrc);
-  static void VerifyBweLossEvent(const ParsedRtcEventLog& parsed_log,
-                                 size_t index,
-                                 int32_t bitrate,
-                                 uint8_t fraction_loss,
-                                 int32_t total_packets);
-  static void VerifyBweDelayEvent(const ParsedRtcEventLog& parsed_log,
-                                  size_t index,
-                                  int32_t bitrate,
-                                  BandwidthUsage detector_state);
-
-  static void VerifyAudioNetworkAdaptation(
-      const ParsedRtcEventLog& parsed_log,
-      size_t index,
-      const AudioEncoderRuntimeConfig& config);
-
-  static void VerifyLogStartEvent(const ParsedRtcEventLog& parsed_log,
-                                  size_t index);
-  static void VerifyLogEndEvent(const ParsedRtcEventLog& parsed_log,
-                                size_t index);
-
-  static void VerifyBweProbeCluster(const ParsedRtcEventLog& parsed_log,
-                                    size_t index,
-                                    uint32_t id,
-                                    uint32_t bitrate_bps,
-                                    uint32_t min_probes,
-                                    uint32_t min_bytes);
-
-  static void VerifyProbeResultSuccess(const ParsedRtcEventLog& parsed_log,
-                                       size_t index,
-                                       uint32_t id,
-                                       uint32_t bitrate_bps);
-
-  static void VerifyProbeResultFailure(const ParsedRtcEventLog& parsed_log,
-                                       size_t index,
-                                       uint32_t id,
-                                       ProbeFailureReason failure_reason);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_LOGGING_RTC_EVENT_LOG_RTC_EVENT_LOG_UNITTEST_HELPER_H_
diff --git a/logging/rtc_event_log/rtc_stream_config.cc b/logging/rtc_event_log/rtc_stream_config.cc
deleted file mode 100644
index c6e5cb9..0000000
--- a/logging/rtc_event_log/rtc_stream_config.cc
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- *  Copyright (c) 2017 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/logging/rtc_event_log/rtc_stream_config.h"
-
-namespace webrtc {
-namespace rtclog {
-
-StreamConfig::StreamConfig() {}
-
-StreamConfig::~StreamConfig() {}
-
-StreamConfig::Codec::Codec(const std::string& payload_name,
-                           int payload_type,
-                           int rtx_payload_type)
-        : payload_name(payload_name),
-          payload_type(payload_type),
-          rtx_payload_type(rtx_payload_type) {}
-
-
-}  // namespace rtclog
-}  // namespace webrtc
diff --git a/logging/rtc_event_log/rtc_stream_config.h b/logging/rtc_event_log/rtc_stream_config.h
deleted file mode 100644
index 4a09873..0000000
--- a/logging/rtc_event_log/rtc_stream_config.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- *  Copyright (c) 2017 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_LOGGING_RTC_EVENT_LOG_RTC_STREAM_CONFIG_H_
-#define WEBRTC_LOGGING_RTC_EVENT_LOG_RTC_STREAM_CONFIG_H_
-
-#include <string>
-#include <vector>
-
-#include "webrtc/api/rtpparameters.h"
-#include "webrtc/common_types.h"
-
-namespace webrtc {
-namespace rtclog {
-
-struct StreamConfig {
-  StreamConfig();
-  ~StreamConfig();
-
-  uint32_t local_ssrc = 0;
-  uint32_t remote_ssrc = 0;
-  uint32_t rtx_ssrc = 0;
-  std::string rsid;
-
-  bool remb = false;
-  std::vector<RtpExtension> rtp_extensions;
-
-  RtcpMode rtcp_mode = RtcpMode::kReducedSize;
-
-  struct Codec {
-    Codec(const std::string& payload_name,
-          int payload_type,
-          int rtx_payload_type);
-
-    std::string payload_name;
-    int payload_type;
-    int rtx_payload_type;
-  };
-
-  std::vector<Codec> codecs;
-};
-
-}  // namespace rtclog
-}  // namespace webrtc
-
-#endif  // WEBRTC_LOGGING_RTC_EVENT_LOG_RTC_STREAM_CONFIG_H_
diff --git a/media/BUILD.gn b/media/BUILD.gn
deleted file mode 100644
index 26d6625..0000000
--- a/media/BUILD.gn
+++ /dev/null
@@ -1,543 +0,0 @@
-# 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.
-
-import("//build/config/linux/pkg_config.gni")
-import("../webrtc.gni")
-
-group("media") {
-  public_deps = [
-    ":rtc_media",
-    ":rtc_media_base",
-  ]
-}
-
-config("rtc_media_defines_config") {
-  defines = [
-    "HAVE_WEBRTC_VIDEO",
-    "HAVE_WEBRTC_VOICE",
-  ]
-}
-
-config("rtc_media_warnings_config") {
-  # GN orders flags on a target before flags from configs. The default config
-  # adds these flags so to cancel them out they need to come from a config and
-  # cannot be on the target directly.
-  if (!is_win) {
-    cflags = [ "-Wno-deprecated-declarations" ]
-  }
-}
-
-rtc_source_set("rtc_h264_profile_id") {
-  sources = [
-    "base/h264_profile_level_id.cc",
-    "base/h264_profile_level_id.h",
-  ]
-
-  if (!build_with_chromium && is_clang) {
-    # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-    suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-  }
-
-  deps = [
-    "..:webrtc_common",
-    "../api:optional",
-    "../rtc_base:rtc_base",
-    "../rtc_base:rtc_base_approved",
-  ]
-}
-
-rtc_static_library("rtc_media_base") {
-  # TODO(kjellander): Remove (bugs.webrtc.org/6828)
-  # Enabling GN check triggers cyclic dependency error:
-  #   :rtc_media_base ->
-  #   ../pc:rtc_pc_base ->
-  #   :rtc_data ->
-  #   :rtc_media_base
-  check_includes = false
-  defines = []
-  libs = []
-  deps = []
-  public_deps = []
-  sources = [
-    "base/adaptedvideotracksource.cc",
-    "base/adaptedvideotracksource.h",
-    "base/audiosource.h",
-    "base/codec.cc",
-    "base/codec.h",
-    "base/cryptoparams.h",
-    "base/device.h",
-    "base/mediachannel.h",
-    "base/mediaconstants.cc",
-    "base/mediaconstants.h",
-    "base/mediaengine.cc",
-    "base/mediaengine.h",
-    "base/rtpdataengine.cc",
-    "base/rtpdataengine.h",
-    "base/rtputils.cc",
-    "base/rtputils.h",
-    "base/streamparams.cc",
-    "base/streamparams.h",
-    "base/turnutils.cc",
-    "base/turnutils.h",
-    "base/videoadapter.cc",
-    "base/videoadapter.h",
-    "base/videobroadcaster.cc",
-    "base/videobroadcaster.h",
-    "base/videocapturer.cc",
-    "base/videocapturer.h",
-    "base/videocapturerfactory.h",
-    "base/videocommon.cc",
-    "base/videocommon.h",
-    "base/videosourcebase.cc",
-    "base/videosourcebase.h",
-
-    # TODO(aleloi): add "base/videosinkinterface.h"
-    "base/videosourceinterface.cc",
-
-    # TODO(aleloi): add "base/videosourceinterface.h"
-  ]
-
-  if (!build_with_chromium && is_clang) {
-    # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-    suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-  }
-
-  include_dirs = []
-  if (rtc_build_libyuv) {
-    deps += [ "$rtc_libyuv_dir" ]
-    public_deps += [ "$rtc_libyuv_dir" ]
-  } else {
-    # Need to add a directory normally exported by libyuv.
-    include_dirs += [ "$rtc_libyuv_dir/include" ]
-  }
-
-  deps += [
-    "..:webrtc_common",
-    "../api:libjingle_peerconnection_api",
-    "../p2p",
-    "../rtc_base:rtc_base",
-    "../rtc_base:rtc_base_approved",
-  ]
-
-  public_deps += [ ":rtc_h264_profile_id" ]
-
-  if (is_nacl) {
-    deps += [ "//native_client_sdk/src/libraries/nacl_io" ]
-  }
-}
-
-rtc_static_library("rtc_audio_video") {
-  defines = []
-  libs = []
-  deps = []
-  sources = [
-    "engine/adm_helpers.cc",
-    "engine/adm_helpers.h",
-    "engine/apm_helpers.cc",
-    "engine/apm_helpers.h",
-    "engine/constants.h",
-    "engine/internaldecoderfactory.cc",
-    "engine/internaldecoderfactory.h",
-    "engine/internalencoderfactory.cc",
-    "engine/internalencoderfactory.h",
-    "engine/nullwebrtcvideoengine.h",
-    "engine/payload_type_mapper.cc",
-    "engine/payload_type_mapper.h",
-    "engine/scopedvideodecoder.cc",
-    "engine/scopedvideodecoder.h",
-    "engine/scopedvideoencoder.cc",
-    "engine/scopedvideoencoder.h",
-    "engine/simulcast.cc",
-    "engine/simulcast.h",
-    "engine/simulcast_encoder_adapter.cc",
-    "engine/simulcast_encoder_adapter.h",
-    "engine/videodecodersoftwarefallbackwrapper.cc",
-    "engine/videodecodersoftwarefallbackwrapper.h",
-    "engine/videoencodersoftwarefallbackwrapper.cc",
-    "engine/videoencodersoftwarefallbackwrapper.h",
-    "engine/webrtccommon.h",
-    "engine/webrtcmediaengine.cc",
-    "engine/webrtcmediaengine.h",
-    "engine/webrtcvideocapturer.cc",
-    "engine/webrtcvideocapturer.h",
-    "engine/webrtcvideocapturerfactory.cc",
-    "engine/webrtcvideocapturerfactory.h",
-    "engine/webrtcvideodecoderfactory.h",
-    "engine/webrtcvideoencoderfactory.h",
-    "engine/webrtcvideoengine.cc",
-    "engine/webrtcvideoengine.h",
-    "engine/webrtcvoe.h",
-    "engine/webrtcvoiceengine.cc",
-    "engine/webrtcvoiceengine.h",
-  ]
-
-  configs += [ ":rtc_media_warnings_config" ]
-
-  if (!build_with_chromium && is_clang) {
-    # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-    suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-  }
-
-  if (is_win) {
-    cflags = [
-      "/wd4245",  # conversion from "int" to "size_t", signed/unsigned mismatch.
-      "/wd4267",  # conversion from "size_t" to "int", possible loss of data.
-      "/wd4389",  # signed/unsigned mismatch.
-    ]
-  }
-
-  if (rtc_enable_intelligibility_enhancer) {
-    defines += [ "WEBRTC_INTELLIGIBILITY_ENHANCER=1" ]
-  } else {
-    defines += [ "WEBRTC_INTELLIGIBILITY_ENHANCER=0" ]
-  }
-
-  if (rtc_opus_support_120ms_ptime) {
-    defines += [ "WEBRTC_OPUS_SUPPORT_120MS_PTIME=1" ]
-  } else {
-    defines += [ "WEBRTC_OPUS_SUPPORT_120MS_PTIME=0" ]
-  }
-
-  include_dirs = []
-  if (rtc_build_libyuv) {
-    deps += [ "$rtc_libyuv_dir" ]
-    public_deps = [
-      "$rtc_libyuv_dir",
-    ]
-  } else {
-    # Need to add a directory normally exported by libyuv.
-    include_dirs += [ "$rtc_libyuv_dir/include" ]
-  }
-
-  public_configs = []
-  if (build_with_chromium) {
-    deps += [ "../modules/video_capture:video_capture" ]
-  } else {
-    public_configs += [ ":rtc_media_defines_config" ]
-    deps += [ "../modules/video_capture:video_capture_internal_impl" ]
-  }
-  if (rtc_enable_protobuf) {
-    deps += [ "../modules/audio_processing/aec_dump:aec_dump_impl" ]
-  } else {
-    deps += [ "../modules/audio_processing/aec_dump:null_aec_dump_factory" ]
-  }
-  deps += [
-    ":rtc_media_base",
-    "..:webrtc_common",
-    "../api:call_api",
-    "../api:libjingle_peerconnection_api",
-    "../api:optional",
-    "../api:transport_api",
-    "../api:video_frame_api",
-    "../api/audio_codecs:audio_codecs_api",
-    "../api/audio_codecs:builtin_audio_decoder_factory",
-    "../api/audio_codecs:builtin_audio_encoder_factory",
-    "../api/video_codecs:video_codecs_api",
-    "../call",
-    "../call:video_stream_api",
-    "../common_video:common_video",
-    "../modules/audio_coding:rent_a_codec",
-    "../modules/audio_device:audio_device",
-    "../modules/audio_mixer:audio_mixer_impl",
-    "../modules/audio_processing:audio_processing",
-    "../modules/audio_processing/aec_dump",
-    "../modules/video_capture:video_capture_module",
-    "../modules/video_coding",
-    "../modules/video_coding:webrtc_h264",
-    "../modules/video_coding:webrtc_vp8",
-    "../modules/video_coding:webrtc_vp9",
-    "../p2p:rtc_p2p",
-    "../pc:rtc_pc_base",
-    "../rtc_base:rtc_base",
-    "../rtc_base:rtc_base_approved",
-    "../rtc_base:rtc_task_queue",
-    "../rtc_base:sequenced_task_checker",
-    "../system_wrappers",
-    "../video",
-    "../voice_engine",
-  ]
-}
-
-rtc_static_library("rtc_data") {
-  defines = []
-  deps = []
-
-  if (rtc_enable_sctp) {
-    sources = [
-      "sctp/sctptransport.cc",
-      "sctp/sctptransport.h",
-      "sctp/sctptransportinternal.h",
-    ]
-  }
-
-  configs += [ ":rtc_media_warnings_config" ]
-
-  if (!build_with_chromium && is_clang) {
-    # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-    suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-  }
-
-  if (is_win) {
-    cflags = [
-      "/wd4245",  # conversion from "int" to "size_t", signed/unsigned mismatch.
-      "/wd4267",  # conversion from "size_t" to "int", possible loss of data.
-      "/wd4389",  # signed/unsigned mismatch.
-    ]
-  }
-
-  if (rtc_enable_sctp && rtc_build_usrsctp) {
-    include_dirs = [
-      # TODO(jiayl): move this into the public_configs of
-      # //third_party/usrsctp/BUILD.gn.
-      "//third_party/usrsctp/usrsctplib",
-    ]
-    deps += [ "//third_party/usrsctp" ]
-  }
-
-  deps += [
-    ":rtc_media_base",
-    "..:webrtc_common",
-    "../api:call_api",
-    "../api:transport_api",
-    "../p2p:rtc_p2p",
-    "../rtc_base:rtc_base",
-    "../rtc_base:rtc_base_approved",
-    "../system_wrappers",
-  ]
-}
-
-rtc_source_set("rtc_media") {
-  public_deps = [
-    ":rtc_audio_video",
-    ":rtc_data",
-  ]
-}
-
-if (rtc_include_tests) {
-  config("rtc_unittest_main_config") {
-    # GN orders flags on a target before flags from configs. The default config
-    # adds -Wall, and this flag have to be after -Wall -- so they need to
-    # come from a config and can"t be on the target directly.
-    if (is_clang && is_ios) {
-      cflags = [ "-Wno-unused-variable" ]
-    }
-  }
-
-  rtc_source_set("rtc_media_tests_utils") {
-    testonly = true
-
-    include_dirs = []
-    public_deps = []
-    deps = [
-      "../call:video_stream_api",
-      "../modules/audio_coding:rent_a_codec",
-      "../modules/audio_processing:audio_processing",
-      "../modules/rtp_rtcp:rtp_rtcp",
-      "../p2p:rtc_p2p",
-    ]
-    sources = [
-      "base/fakemediaengine.h",
-      "base/fakenetworkinterface.h",
-      "base/fakertp.cc",
-      "base/fakertp.h",
-      "base/fakevideocapturer.h",
-      "base/fakevideorenderer.h",
-      "base/test/mock_mediachannel.h",
-      "base/testutils.cc",
-      "base/testutils.h",
-      "engine/fakewebrtccall.cc",
-      "engine/fakewebrtccall.h",
-      "engine/fakewebrtcdeviceinfo.h",
-      "engine/fakewebrtcvcmfactory.h",
-      "engine/fakewebrtcvideocapturemodule.h",
-      "engine/fakewebrtcvideoengine.h",
-      "engine/fakewebrtcvoiceengine.h",
-    ]
-
-    configs += [ ":rtc_unittest_main_config" ]
-
-    if (rtc_build_libyuv) {
-      deps += [ "$rtc_libyuv_dir" ]
-      public_deps += [ "$rtc_libyuv_dir" ]
-    } else {
-      # Need to add a directory normally exported by libyuv.
-      include_dirs += [ "$rtc_libyuv_dir/include" ]
-    }
-
-    if (!build_with_chromium && is_clang) {
-      # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-    }
-
-    deps += [
-      ":rtc_media",
-      ":rtc_media_base",
-      "..:webrtc_common",
-      "../api:call_api",
-      "../api:video_frame_api",
-      "../api/video_codecs:video_codecs_api",
-      "../call:call_interfaces",
-      "../rtc_base:rtc_base",
-      "../rtc_base:rtc_base_approved",
-      "../rtc_base:rtc_base_tests_utils",
-      "../test:test_support",
-      "//testing/gtest",
-    ]
-    public_deps += [ "//testing/gmock" ]
-  }
-
-  config("rtc_media_unittests_config") {
-    # GN orders flags on a target before flags from configs. The default config
-    # adds -Wall, and this flag have to be after -Wall -- so they need to
-    # come from a config and can"t be on the target directly.
-    # TODO(kjellander): Make the code compile without disabling these flags.
-    # See https://bugs.webrtc.org/3307.
-    if (is_clang && is_win) {
-      cflags = [
-        # See https://bugs.chromium.org/p/webrtc/issues/detail?id=6266
-        # for -Wno-sign-compare
-        "-Wno-sign-compare",
-      ]
-    }
-    if (!is_win) {
-      cflags = [ "-Wno-sign-compare" ]
-    }
-  }
-
-  rtc_media_unittests_resources = [
-    "../../resources/media/captured-320x240-2s-48.frames",
-    "../../resources/media/faces.1280x720_P420.yuv",
-    "../../resources/media/faces_I420.jpg",
-    "../../resources/media/faces_I422.jpg",
-    "../../resources/media/faces_I444.jpg",
-    "../../resources/media/faces_I411.jpg",
-    "../../resources/media/faces_I400.jpg",
-  ]
-
-  if (is_ios) {
-    bundle_data("rtc_media_unittests_bundle_data") {
-      testonly = true
-      sources = rtc_media_unittests_resources
-      outputs = [
-        "{{bundle_resources_dir}}/{{source_file_part}}",
-      ]
-    }
-  }
-
-  rtc_test("rtc_media_unittests") {
-    testonly = true
-
-    defines = []
-    deps = [
-      "../pc:rtc_pc",
-      "../test:field_trial",
-    ]
-    sources = [
-      "base/codec_unittest.cc",
-      "base/rtpdataengine_unittest.cc",
-      "base/rtputils_unittest.cc",
-      "base/streamparams_unittest.cc",
-      "base/turnutils_unittest.cc",
-      "base/videoadapter_unittest.cc",
-      "base/videobroadcaster_unittest.cc",
-      "base/videocapturer_unittest.cc",
-      "base/videocommon_unittest.cc",
-      "base/videoengine_unittest.h",
-      "engine/apm_helpers_unittest.cc",
-      "engine/internaldecoderfactory_unittest.cc",
-      "engine/nullwebrtcvideoengine_unittest.cc",
-      "engine/payload_type_mapper_unittest.cc",
-      "engine/simulcast_encoder_adapter_unittest.cc",
-      "engine/simulcast_unittest.cc",
-      "engine/videodecodersoftwarefallbackwrapper_unittest.cc",
-      "engine/videoencodersoftwarefallbackwrapper_unittest.cc",
-      "engine/webrtcmediaengine_unittest.cc",
-      "engine/webrtcvideocapturer_unittest.cc",
-      "engine/webrtcvideoencoderfactory_unittest.cc",
-      "engine/webrtcvideoengine_unittest.cc",
-    ]
-
-    # TODO(kthelgason): Reenable this test on iOS.
-    # See bugs.webrtc.org/5569
-    if (!is_ios) {
-      sources += [ "engine/webrtcvoiceengine_unittest.cc" ]
-    }
-
-    if (rtc_enable_sctp) {
-      sources += [ "sctp/sctptransport_unittest.cc" ]
-    }
-
-    configs += [ ":rtc_media_unittests_config" ]
-
-    if (rtc_use_h264) {
-      defines += [ "WEBRTC_USE_H264" ]
-    }
-
-    if (rtc_opus_support_120ms_ptime) {
-      defines += [ "WEBRTC_OPUS_SUPPORT_120MS_PTIME=1" ]
-    } else {
-      defines += [ "WEBRTC_OPUS_SUPPORT_120MS_PTIME=0" ]
-    }
-
-    if (is_win) {
-      cflags = [
-        "/wd4245",  # conversion from int to size_t, signed/unsigned mismatch.
-        "/wd4373",  # virtual function override.
-        "/wd4389",  # signed/unsigned mismatch.
-      ]
-    }
-
-    if (!build_with_chromium && is_clang) {
-      suppressed_configs += [
-        "//build/config/clang:extra_warnings",
-
-        # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-        "//build/config/clang:find_bad_constructs",
-      ]
-    }
-
-    data = rtc_media_unittests_resources
-
-    if (is_android) {
-      deps += [ "//testing/android/native_test:native_test_support" ]
-      shard_timeout = 900
-    }
-
-    if (is_ios) {
-      deps += [ ":rtc_media_unittests_bundle_data" ]
-    }
-
-    deps += [
-      ":rtc_media",
-      ":rtc_media_base",
-      ":rtc_media_tests_utils",
-      "../api:video_frame_api",
-      "../api/audio_codecs:builtin_audio_decoder_factory",
-      "../api/audio_codecs:builtin_audio_encoder_factory",
-      "../api/video_codecs:video_codecs_api",
-      "../audio",
-      "../call:call_interfaces",
-      "../common_video:common_video",
-      "../logging:rtc_event_log_api",
-      "../modules/audio_device:mock_audio_device",
-      "../modules/audio_processing:audio_processing",
-      "../modules/video_coding:simulcast_test_utility",
-      "../modules/video_coding:video_coding_utility",
-      "../modules/video_coding:webrtc_vp8",
-      "../p2p:p2p_test_utils",
-      "../rtc_base:rtc_base",
-      "../rtc_base:rtc_base_approved",
-      "../rtc_base:rtc_base_tests_main",
-      "../rtc_base:rtc_base_tests_utils",
-      "../system_wrappers:metrics_default",
-      "../test:audio_codec_mocks",
-      "../test:test_support",
-      "../voice_engine:voice_engine",
-    ]
-  }
-}
diff --git a/media/DEPS b/media/DEPS
deleted file mode 100644
index 3d3dce4..0000000
--- a/media/DEPS
+++ /dev/null
@@ -1,25 +0,0 @@
-include_rules = [
-  "+webrtc/api",
-  "+webrtc/call",
-  "+webrtc/common_video",
-  "+webrtc/logging/rtc_event_log",
-  "+webrtc/modules/audio_coding",
-  "+webrtc/modules/audio_device",
-  "+webrtc/modules/audio_mixer",
-  "+webrtc/modules/audio_processing",
-  "+webrtc/modules/rtp_rtcp",
-  "+webrtc/modules/video_capture",
-  "+webrtc/modules/video_coding",
-  "+webrtc/p2p",
-  "+webrtc/pc",
-  "+webrtc/sound",
-  "+webrtc/system_wrappers",
-  "+webrtc/voice_engine",
-  "+usrsctplib",
-]
-
-specific_include_rules = {
-  "win32devicemanager\.cc": [
-    "+third_party/logitech/files/logitechquickcam.h",
-  ],
-}
diff --git a/media/OWNERS b/media/OWNERS
deleted file mode 100644
index ef58929..0000000
--- a/media/OWNERS
+++ /dev/null
@@ -1,12 +0,0 @@
-magjed@webrtc.org
-mflodman@webrtc.org
-pbos@webrtc.org
-perkj@webrtc.org
-pthatcher@webrtc.org
-solenberg@webrtc.org
-deadbeef@webrtc.org
-
-# These are for the common case of adding or renaming files. If you're doing
-# structural changes, please get a review from a reviewer in this file.
-per-file *.gn=*
-per-file *.gni=*
diff --git a/media/base/adaptedvideotracksource.cc b/media/base/adaptedvideotracksource.cc
deleted file mode 100644
index 9513be8..0000000
--- a/media/base/adaptedvideotracksource.cc
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- *  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/media/base/adaptedvideotracksource.h"
-
-#include "webrtc/api/video/i420_buffer.h"
-
-namespace rtc {
-
-AdaptedVideoTrackSource::AdaptedVideoTrackSource() {
-  thread_checker_.DetachFromThread();
-}
-
-AdaptedVideoTrackSource::AdaptedVideoTrackSource(int required_alignment)
-    : video_adapter_(required_alignment) {
-  thread_checker_.DetachFromThread();
-}
-
-bool AdaptedVideoTrackSource::GetStats(Stats* stats) {
-  rtc::CritScope lock(&stats_crit_);
-
-  if (!stats_) {
-    return false;
-  }
-
-  *stats = *stats_;
-  return true;
-}
-
-void AdaptedVideoTrackSource::OnFrame(const webrtc::VideoFrame& frame) {
-  rtc::scoped_refptr<webrtc::VideoFrameBuffer> buffer(
-      frame.video_frame_buffer());
-  /* Note that this is a "best effort" approach to
-     wants.rotation_applied; apply_rotation_ can change from false to
-     true between the check of apply_rotation() and the call to
-     broadcaster_.OnFrame(), in which case we generate a frame with
-     pending rotation despite some sink with wants.rotation_applied ==
-     true was just added. The VideoBroadcaster enforces
-     synchronization for us in this case, by not passing the frame on
-     to sinks which don't want it. */
-  if (apply_rotation() && frame.rotation() != webrtc::kVideoRotation_0 &&
-      buffer->type() == webrtc::VideoFrameBuffer::Type::kI420) {
-    /* Apply pending rotation. */
-    broadcaster_.OnFrame(webrtc::VideoFrame(
-        webrtc::I420Buffer::Rotate(*buffer->GetI420(), frame.rotation()),
-        webrtc::kVideoRotation_0, frame.timestamp_us()));
-  } else {
-    broadcaster_.OnFrame(frame);
-  }
-}
-
-void AdaptedVideoTrackSource::AddOrUpdateSink(
-    rtc::VideoSinkInterface<webrtc::VideoFrame>* sink,
-    const rtc::VideoSinkWants& wants) {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-
-  broadcaster_.AddOrUpdateSink(sink, wants);
-  OnSinkWantsChanged(broadcaster_.wants());
-}
-
-void AdaptedVideoTrackSource::RemoveSink(
-    rtc::VideoSinkInterface<webrtc::VideoFrame>* sink) {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-
-  broadcaster_.RemoveSink(sink);
-  OnSinkWantsChanged(broadcaster_.wants());
-}
-
-bool AdaptedVideoTrackSource::apply_rotation() {
-  return broadcaster_.wants().rotation_applied;
-}
-
-void AdaptedVideoTrackSource::OnSinkWantsChanged(
-    const rtc::VideoSinkWants& wants) {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  video_adapter_.OnResolutionFramerateRequest(
-      wants.target_pixel_count, wants.max_pixel_count, wants.max_framerate_fps);
-}
-
-bool AdaptedVideoTrackSource::AdaptFrame(int width,
-                                         int height,
-                                         int64_t time_us,
-                                         int* out_width,
-                                         int* out_height,
-                                         int* crop_width,
-                                         int* crop_height,
-                                         int* crop_x,
-                                         int* crop_y) {
-  {
-    rtc::CritScope lock(&stats_crit_);
-    stats_ = rtc::Optional<Stats>({width, height});
-  }
-
-  if (!broadcaster_.frame_wanted()) {
-    return false;
-  }
-
-  if (!video_adapter_.AdaptFrameResolution(
-          width, height, time_us * rtc::kNumNanosecsPerMicrosec,
-          crop_width, crop_height, out_width, out_height)) {
-    // VideoAdapter dropped the frame.
-    return false;
-  }
-
-  *crop_x = (width - *crop_width) / 2;
-  *crop_y = (height - *crop_height) / 2;
-  return true;
-}
-
-}  // namespace rtc
diff --git a/media/base/adaptedvideotracksource.h b/media/base/adaptedvideotracksource.h
deleted file mode 100644
index 7189996..0000000
--- a/media/base/adaptedvideotracksource.h
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- *  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_MEDIA_BASE_ADAPTEDVIDEOTRACKSOURCE_H_
-#define WEBRTC_MEDIA_BASE_ADAPTEDVIDEOTRACKSOURCE_H_
-
-#include "webrtc/api/mediastreaminterface.h"
-#include "webrtc/api/notifier.h"
-#include "webrtc/media/base/videoadapter.h"
-#include "webrtc/media/base/videobroadcaster.h"
-
-namespace rtc {
-
-// Base class for sources which needs video adaptation, e.g., video
-// capture sources. Sinks must be added and removed on one and only
-// one thread, while AdaptFrame and OnFrame may be called on any
-// thread.
-class AdaptedVideoTrackSource
-    : public webrtc::Notifier<webrtc::VideoTrackSourceInterface> {
- public:
-  AdaptedVideoTrackSource();
-
- protected:
-  // Allows derived classes to initialize |video_adapter_| with a custom
-  // alignment.
-  AdaptedVideoTrackSource(int required_alignment);
-  // Checks the apply_rotation() flag. If the frame needs rotation, and it is a
-  // plain memory frame, it is rotated. Subclasses producing native frames must
-  // handle apply_rotation() themselves.
-  void OnFrame(const webrtc::VideoFrame& frame);
-
-  // Reports the appropriate frame size after adaptation. Returns true
-  // if a frame is wanted. Returns false if there are no interested
-  // sinks, or if the VideoAdapter decides to drop the frame.
-  bool AdaptFrame(int width,
-                  int height,
-                  int64_t time_us,
-                  int* out_width,
-                  int* out_height,
-                  int* crop_width,
-                  int* crop_height,
-                  int* crop_x,
-                  int* crop_y);
-
-  // Returns the current value of the apply_rotation flag, derived
-  // from the VideoSinkWants of registered sinks. The value is derived
-  // from sinks' wants, in AddOrUpdateSink and RemoveSink. Beware that
-  // when using this method from a different thread, the value may
-  // become stale before it is used.
-  bool apply_rotation();
-
-  cricket::VideoAdapter* video_adapter() { return &video_adapter_; }
-
- private:
-  // Implements rtc::VideoSourceInterface.
-  void AddOrUpdateSink(rtc::VideoSinkInterface<webrtc::VideoFrame>* sink,
-                       const rtc::VideoSinkWants& wants) override;
-  void RemoveSink(rtc::VideoSinkInterface<webrtc::VideoFrame>* sink) override;
-
-  // Part of VideoTrackSourceInterface.
-  bool GetStats(Stats* stats) override;
-
-  void OnSinkWantsChanged(const rtc::VideoSinkWants& wants);
-
-  rtc::ThreadChecker thread_checker_;
-
-  cricket::VideoAdapter video_adapter_;
-
-  rtc::CriticalSection stats_crit_;
-  rtc::Optional<Stats> stats_ RTC_GUARDED_BY(stats_crit_);
-
-  VideoBroadcaster broadcaster_;
-};
-
-}  // namespace rtc
-
-#endif  // WEBRTC_MEDIA_BASE_ADAPTEDVIDEOTRACKSOURCE_H_
diff --git a/media/base/audiosource.h b/media/base/audiosource.h
deleted file mode 100644
index 97743bc..0000000
--- a/media/base/audiosource.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- *  Copyright (c) 2013 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_MEDIA_BASE_AUDIOSOURCE_H_
-#define WEBRTC_MEDIA_BASE_AUDIOSOURCE_H_
-
-#include <cstddef>
-
-namespace cricket {
-
-// Abstract interface for providing the audio data.
-// TODO(deadbeef): Rename this to AudioSourceInterface, and rename
-// webrtc::AudioSourceInterface to AudioTrackSourceInterface.
-class AudioSource {
- public:
-  class Sink {
-   public:
-    // Callback to receive data from the AudioSource.
-    virtual void OnData(const void* audio_data,
-                        int bits_per_sample,
-                        int sample_rate,
-                        size_t number_of_channels,
-                        size_t number_of_frames) = 0;
-
-    // Called when the AudioSource is going away.
-    virtual void OnClose() = 0;
-
-   protected:
-    virtual ~Sink() {}
-  };
-
-  // Sets a sink to the AudioSource. There can be only one sink connected
-  // to the source at a time.
-  virtual void SetSink(Sink* sink) = 0;
-
- protected:
-  virtual ~AudioSource() {}
-};
-
-}  // namespace cricket
-
-#endif  // WEBRTC_MEDIA_BASE_AUDIOSOURCE_H_
diff --git a/media/base/codec.cc b/media/base/codec.cc
deleted file mode 100644
index a949402..0000000
--- a/media/base/codec.cc
+++ /dev/null
@@ -1,362 +0,0 @@
-/*
- *  Copyright (c) 2004 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/media/base/codec.h"
-
-#include <algorithm>
-#include <sstream>
-
-#include "webrtc/media/base/h264_profile_level_id.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/stringencode.h"
-#include "webrtc/rtc_base/stringutils.h"
-
-namespace cricket {
-
-static bool IsSameH264Profile(const CodecParameterMap& params1,
-                              const CodecParameterMap& params2) {
-  const rtc::Optional<webrtc::H264::ProfileLevelId> profile_level_id =
-      webrtc::H264::ParseSdpProfileLevelId(params1);
-  const rtc::Optional<webrtc::H264::ProfileLevelId> other_profile_level_id =
-      webrtc::H264::ParseSdpProfileLevelId(params2);
-  // Compare H264 profiles, but not levels.
-  return profile_level_id && other_profile_level_id &&
-         profile_level_id->profile == other_profile_level_id->profile;
-}
-
-bool FeedbackParam::operator==(const FeedbackParam& other) const {
-  return _stricmp(other.id().c_str(), id().c_str()) == 0 &&
-      _stricmp(other.param().c_str(), param().c_str()) == 0;
-}
-
-bool FeedbackParams::operator==(const FeedbackParams& other) const {
-  return params_ == other.params_;
-}
-
-bool FeedbackParams::Has(const FeedbackParam& param) const {
-  return std::find(params_.begin(), params_.end(), param) != params_.end();
-}
-
-void FeedbackParams::Add(const FeedbackParam& param) {
-  if (param.id().empty()) {
-    return;
-  }
-  if (Has(param)) {
-    // Param already in |this|.
-    return;
-  }
-  params_.push_back(param);
-  RTC_CHECK(!HasDuplicateEntries());
-}
-
-void FeedbackParams::Intersect(const FeedbackParams& from) {
-  std::vector<FeedbackParam>::iterator iter_to = params_.begin();
-  while (iter_to != params_.end()) {
-    if (!from.Has(*iter_to)) {
-      iter_to = params_.erase(iter_to);
-    } else {
-      ++iter_to;
-    }
-  }
-}
-
-bool FeedbackParams::HasDuplicateEntries() const {
-  for (std::vector<FeedbackParam>::const_iterator iter = params_.begin();
-       iter != params_.end(); ++iter) {
-    for (std::vector<FeedbackParam>::const_iterator found = iter + 1;
-         found != params_.end(); ++found) {
-      if (*found == *iter) {
-        return true;
-      }
-    }
-  }
-  return false;
-}
-
-Codec::Codec(int id, const std::string& name, int clockrate)
-    : id(id), name(name), clockrate(clockrate) {}
-
-Codec::Codec() : id(0), clockrate(0) {}
-
-Codec::Codec(const Codec& c) = default;
-Codec::Codec(Codec&& c) = default;
-Codec::~Codec() = default;
-Codec& Codec::operator=(const Codec& c) = default;
-Codec& Codec::operator=(Codec&& c) = default;
-
-bool Codec::operator==(const Codec& c) const {
-  return this->id == c.id &&  // id is reserved in objective-c
-         name == c.name && clockrate == c.clockrate && params == c.params &&
-         feedback_params == c.feedback_params;
-}
-
-bool Codec::Matches(const Codec& codec) const {
-  // Match the codec id/name based on the typical static/dynamic name rules.
-  // Matching is case-insensitive.
-  const int kMaxStaticPayloadId = 95;
-  return (id <= kMaxStaticPayloadId || codec.id <= kMaxStaticPayloadId)
-             ? (id == codec.id)
-             : (_stricmp(name.c_str(), codec.name.c_str()) == 0);
-}
-
-bool Codec::GetParam(const std::string& name, std::string* out) const {
-  CodecParameterMap::const_iterator iter = params.find(name);
-  if (iter == params.end())
-    return false;
-  *out = iter->second;
-  return true;
-}
-
-bool Codec::GetParam(const std::string& name, int* out) const {
-  CodecParameterMap::const_iterator iter = params.find(name);
-  if (iter == params.end())
-    return false;
-  return rtc::FromString(iter->second, out);
-}
-
-void Codec::SetParam(const std::string& name, const std::string& value) {
-  params[name] = value;
-}
-
-void Codec::SetParam(const std::string& name, int value)  {
-  params[name] = rtc::ToString(value);
-}
-
-bool Codec::RemoveParam(const std::string& name) {
-  return params.erase(name) == 1;
-}
-
-void Codec::AddFeedbackParam(const FeedbackParam& param) {
-  feedback_params.Add(param);
-}
-
-bool Codec::HasFeedbackParam(const FeedbackParam& param) const {
-  return feedback_params.Has(param);
-}
-
-void Codec::IntersectFeedbackParams(const Codec& other) {
-  feedback_params.Intersect(other.feedback_params);
-}
-
-webrtc::RtpCodecParameters Codec::ToCodecParameters() const {
-  webrtc::RtpCodecParameters codec_params;
-  codec_params.payload_type = id;
-  codec_params.name = name;
-  codec_params.clock_rate = rtc::Optional<int>(clockrate);
-  return codec_params;
-}
-
-AudioCodec::AudioCodec(int id,
-                       const std::string& name,
-                       int clockrate,
-                       int bitrate,
-                       size_t channels)
-    : Codec(id, name, clockrate), bitrate(bitrate), channels(channels) {}
-
-AudioCodec::AudioCodec() : Codec(), bitrate(0), channels(0) {
-}
-
-AudioCodec::AudioCodec(const AudioCodec& c) = default;
-AudioCodec::AudioCodec(AudioCodec&& c) = default;
-AudioCodec& AudioCodec::operator=(const AudioCodec& c) = default;
-AudioCodec& AudioCodec::operator=(AudioCodec&& c) = default;
-
-bool AudioCodec::operator==(const AudioCodec& c) const {
-  return bitrate == c.bitrate && channels == c.channels && Codec::operator==(c);
-}
-
-bool AudioCodec::Matches(const AudioCodec& codec) const {
-  // If a nonzero clockrate is specified, it must match the actual clockrate.
-  // If a nonzero bitrate is specified, it must match the actual bitrate,
-  // unless the codec is VBR (0), where we just force the supplied value.
-  // The number of channels must match exactly, with the exception
-  // that channels=0 is treated synonymously as channels=1, per RFC
-  // 4566 section 6: " [The channels] parameter is OPTIONAL and may be
-  // omitted if the number of channels is one."
-  // Preference is ignored.
-  // TODO(juberti): Treat a zero clockrate as 8000Hz, the RTP default clockrate.
-  return Codec::Matches(codec) &&
-      ((codec.clockrate == 0 /*&& clockrate == 8000*/) ||
-          clockrate == codec.clockrate) &&
-      (codec.bitrate == 0 || bitrate <= 0 || bitrate == codec.bitrate) &&
-      ((codec.channels < 2 && channels < 2) || channels == codec.channels);
-}
-
-std::string AudioCodec::ToString() const {
-  std::ostringstream os;
-  os << "AudioCodec[" << id << ":" << name << ":" << clockrate << ":" << bitrate
-     << ":" << channels << "]";
-  return os.str();
-}
-
-webrtc::RtpCodecParameters AudioCodec::ToCodecParameters() const {
-  webrtc::RtpCodecParameters codec_params = Codec::ToCodecParameters();
-  codec_params.num_channels = rtc::Optional<int>(static_cast<int>(channels));
-  codec_params.kind = MEDIA_TYPE_AUDIO;
-  return codec_params;
-}
-
-std::string VideoCodec::ToString() const {
-  std::ostringstream os;
-  os << "VideoCodec[" << id << ":" << name << "]";
-  return os.str();
-}
-
-webrtc::RtpCodecParameters VideoCodec::ToCodecParameters() const {
-  webrtc::RtpCodecParameters codec_params = Codec::ToCodecParameters();
-  codec_params.kind = MEDIA_TYPE_VIDEO;
-  return codec_params;
-}
-
-VideoCodec::VideoCodec(int id, const std::string& name)
-    : Codec(id, name, kVideoCodecClockrate) {
-  SetDefaultParameters();
-}
-
-VideoCodec::VideoCodec(const std::string& name) : VideoCodec(0 /* id */, name) {
-  SetDefaultParameters();
-}
-
-VideoCodec::VideoCodec() : Codec() {
-  clockrate = kVideoCodecClockrate;
-}
-
-VideoCodec::VideoCodec(const VideoCodec& c) = default;
-VideoCodec::VideoCodec(VideoCodec&& c) = default;
-VideoCodec& VideoCodec::operator=(const VideoCodec& c) = default;
-VideoCodec& VideoCodec::operator=(VideoCodec&& c) = default;
-
-void VideoCodec::SetDefaultParameters() {
-  if (_stricmp(kH264CodecName, name.c_str()) == 0) {
-    // This default is set for all H.264 codecs created because
-    // that was the default before packetization mode support was added.
-    // TODO(hta): Move this to the places that create VideoCodecs from
-    // SDP or from knowledge of implementation capabilities.
-    SetParam(kH264FmtpPacketizationMode, "1");
-  }
-}
-
-bool VideoCodec::operator==(const VideoCodec& c) const {
-  return Codec::operator==(c);
-}
-
-bool VideoCodec::Matches(const VideoCodec& other) const {
-  if (!Codec::Matches(other))
-    return false;
-  if (CodecNamesEq(name.c_str(), kH264CodecName))
-    return IsSameH264Profile(params, other.params);
-  return true;
-}
-
-VideoCodec VideoCodec::CreateRtxCodec(int rtx_payload_type,
-                                      int associated_payload_type) {
-  VideoCodec rtx_codec(rtx_payload_type, kRtxCodecName);
-  rtx_codec.SetParam(kCodecParamAssociatedPayloadType, associated_payload_type);
-  return rtx_codec;
-}
-
-VideoCodec::CodecType VideoCodec::GetCodecType() const {
-  const char* payload_name = name.c_str();
-  if (_stricmp(payload_name, kRedCodecName) == 0) {
-    return CODEC_RED;
-  }
-  if (_stricmp(payload_name, kUlpfecCodecName) == 0) {
-    return CODEC_ULPFEC;
-  }
-  if (_stricmp(payload_name, kFlexfecCodecName) == 0) {
-    return CODEC_FLEXFEC;
-  }
-  if (_stricmp(payload_name, kRtxCodecName) == 0) {
-    return CODEC_RTX;
-  }
-
-  return CODEC_VIDEO;
-}
-
-bool VideoCodec::ValidateCodecFormat() const {
-  if (id < 0 || id > 127) {
-    LOG(LS_ERROR) << "Codec with invalid payload type: " << ToString();
-    return false;
-  }
-  if (GetCodecType() != CODEC_VIDEO) {
-    return true;
-  }
-
-  // Video validation from here on.
-  int min_bitrate = -1;
-  int max_bitrate = -1;
-  if (GetParam(kCodecParamMinBitrate, &min_bitrate) &&
-      GetParam(kCodecParamMaxBitrate, &max_bitrate)) {
-    if (max_bitrate < min_bitrate) {
-      LOG(LS_ERROR) << "Codec with max < min bitrate: " << ToString();
-      return false;
-    }
-  }
-  return true;
-}
-
-DataCodec::DataCodec(int id, const std::string& name)
-    : Codec(id, name, kDataCodecClockrate) {}
-
-DataCodec::DataCodec() : Codec() {
-  clockrate = kDataCodecClockrate;
-}
-
-DataCodec::DataCodec(const DataCodec& c) = default;
-DataCodec::DataCodec(DataCodec&& c) = default;
-DataCodec& DataCodec::operator=(const DataCodec& c) = default;
-DataCodec& DataCodec::operator=(DataCodec&& c) = default;
-
-std::string DataCodec::ToString() const {
-  std::ostringstream os;
-  os << "DataCodec[" << id << ":" << name << "]";
-  return os.str();
-}
-
-bool HasNack(const Codec& codec) {
-  return codec.HasFeedbackParam(
-      FeedbackParam(kRtcpFbParamNack, kParamValueEmpty));
-}
-
-bool HasRemb(const Codec& codec) {
-  return codec.HasFeedbackParam(
-      FeedbackParam(kRtcpFbParamRemb, kParamValueEmpty));
-}
-
-bool HasTransportCc(const Codec& codec) {
-  return codec.HasFeedbackParam(
-      FeedbackParam(kRtcpFbParamTransportCc, kParamValueEmpty));
-}
-
-bool CodecNamesEq(const std::string& name1, const std::string& name2) {
-  return CodecNamesEq(name1.c_str(), name2.c_str());
-}
-
-bool CodecNamesEq(const char* name1, const char* name2) {
-  return _stricmp(name1, name2) == 0;
-}
-
-const VideoCodec* FindMatchingCodec(
-    const std::vector<VideoCodec>& supported_codecs,
-    const VideoCodec& codec) {
-  for (const VideoCodec& supported_codec : supported_codecs) {
-    if (!CodecNamesEq(codec.name, supported_codec.name))
-      continue;
-    if (CodecNamesEq(codec.name.c_str(), kH264CodecName) &&
-        !IsSameH264Profile(codec.params, supported_codec.params)) {
-      continue;
-    }
-    return &supported_codec;
-  }
-  return nullptr;
-}
-
-}  // namespace cricket
diff --git a/media/base/codec.h b/media/base/codec.h
deleted file mode 100644
index 5e49785..0000000
--- a/media/base/codec.h
+++ /dev/null
@@ -1,257 +0,0 @@
-/*
- *  Copyright (c) 2004 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_MEDIA_BASE_CODEC_H_
-#define WEBRTC_MEDIA_BASE_CODEC_H_
-
-#include <map>
-#include <set>
-#include <string>
-#include <vector>
-
-#include "webrtc/api/rtpparameters.h"
-#include "webrtc/common_types.h"
-#include "webrtc/media/base/mediaconstants.h"
-
-namespace cricket {
-
-typedef std::map<std::string, std::string> CodecParameterMap;
-
-class FeedbackParam {
- public:
-  FeedbackParam() = default;
-  FeedbackParam(const std::string& id, const std::string& param)
-      : id_(id),
-        param_(param) {
-  }
-  explicit FeedbackParam(const std::string& id)
-      : id_(id),
-        param_(kParamValueEmpty) {
-  }
-  bool operator==(const FeedbackParam& other) const;
-
-  const std::string& id() const { return id_; }
-  const std::string& param() const { return param_; }
-
- private:
-  std::string id_;  // e.g. "nack", "ccm"
-  std::string param_;  // e.g. "", "rpsi", "fir"
-};
-
-class FeedbackParams {
- public:
-  bool operator==(const FeedbackParams& other) const;
-
-  bool Has(const FeedbackParam& param) const;
-  void Add(const FeedbackParam& param);
-
-  void Intersect(const FeedbackParams& from);
-
-  const std::vector<FeedbackParam>& params() const { return params_; }
- private:
-  bool HasDuplicateEntries() const;
-
-  std::vector<FeedbackParam> params_;
-};
-
-struct Codec {
-  int id;
-  std::string name;
-  int clockrate;
-  CodecParameterMap params;
-  FeedbackParams feedback_params;
-
-  virtual ~Codec();
-
-  // Indicates if this codec is compatible with the specified codec.
-  bool Matches(const Codec& codec) const;
-
-  // Find the parameter for |name| and write the value to |out|.
-  bool GetParam(const std::string& name, std::string* out) const;
-  bool GetParam(const std::string& name, int* out) const;
-
-  void SetParam(const std::string& name, const std::string& value);
-  void SetParam(const std::string& name, int value);
-
-  // It is safe to input a non-existent parameter.
-  // Returns true if the parameter existed, false if it did not exist.
-  bool RemoveParam(const std::string& name);
-
-  bool HasFeedbackParam(const FeedbackParam& param) const;
-  void AddFeedbackParam(const FeedbackParam& param);
-
-  // Filter |this| feedbacks params such that only those shared by both |this|
-  // and |other| are kept.
-  void IntersectFeedbackParams(const Codec& other);
-
-  virtual webrtc::RtpCodecParameters ToCodecParameters() const;
-
-  Codec& operator=(const Codec& c);
-  Codec& operator=(Codec&& c);
-
-  bool operator==(const Codec& c) const;
-
-  bool operator!=(const Codec& c) const {
-    return !(*this == c);
-  }
-
- protected:
-  // A Codec can't be created without a subclass.
-  // Creates a codec with the given parameters.
-  Codec(int id, const std::string& name, int clockrate);
-  // Creates an empty codec.
-  Codec();
-  Codec(const Codec& c);
-  Codec(Codec&& c);
-};
-
-struct AudioCodec : public Codec {
-  int bitrate;
-  size_t channels;
-
-  // Creates a codec with the given parameters.
-  AudioCodec(int id,
-             const std::string& name,
-             int clockrate,
-             int bitrate,
-             size_t channels);
-  // Creates an empty codec.
-  AudioCodec();
-  AudioCodec(const AudioCodec& c);
-  AudioCodec(AudioCodec&& c);
-  virtual ~AudioCodec() = default;
-
-  // Indicates if this codec is compatible with the specified codec.
-  bool Matches(const AudioCodec& codec) const;
-
-  std::string ToString() const;
-
-  webrtc::RtpCodecParameters ToCodecParameters() const override;
-
-  AudioCodec& operator=(const AudioCodec& c);
-  AudioCodec& operator=(AudioCodec&& c);
-
-  bool operator==(const AudioCodec& c) const;
-
-  bool operator!=(const AudioCodec& c) const {
-    return !(*this == c);
-  }
-};
-
-inline std::ostream& operator<<(std::ostream& os, const AudioCodec& ac) {
-  os << "{id: " << ac.id;
-  os << ", name: " << ac.name;
-  os << ", clockrate: " << ac.clockrate;
-  os << ", bitrate: " << ac.bitrate;
-  os << ", channels: " << ac.channels;
-  os << ", params: {";
-  const char* sep = "";
-  for (const auto& kv : ac.params) {
-    os << sep << kv.first << ": " << kv.second;
-    sep = ", ";
-  }
-  os << "}, feedback_params: {";
-  sep = "";
-  for (const FeedbackParam& fp : ac.feedback_params.params()) {
-    os << sep << fp.id() << ": " << fp.param();
-    sep = ", ";
-  }
-  os << "}}";
-  return os;
-}
-
-struct VideoCodec : public Codec {
-  // Creates a codec with the given parameters.
-  VideoCodec(int id, const std::string& name);
-  // Creates a codec with the given name and empty id.
-  explicit VideoCodec(const std::string& name);
-  // Creates an empty codec.
-  VideoCodec();
-  VideoCodec(const VideoCodec& c);
-  VideoCodec(VideoCodec&& c);
-  virtual ~VideoCodec() = default;
-
-  // Indicates if this video codec is the same as the other video codec, e.g. if
-  // they are both VP8 or VP9, or if they are both H264 with the same H264
-  // profile. H264 levels however are not compared.
-  bool Matches(const VideoCodec& codec) const;
-
-  std::string ToString() const;
-
-  webrtc::RtpCodecParameters ToCodecParameters() const override;
-
-  VideoCodec& operator=(const VideoCodec& c);
-  VideoCodec& operator=(VideoCodec&& c);
-
-  bool operator==(const VideoCodec& c) const;
-
-  bool operator!=(const VideoCodec& c) const {
-    return !(*this == c);
-  }
-
-  static VideoCodec CreateRtxCodec(int rtx_payload_type,
-                                   int associated_payload_type);
-
-  enum CodecType {
-    CODEC_VIDEO,
-    CODEC_RED,
-    CODEC_ULPFEC,
-    CODEC_FLEXFEC,
-    CODEC_RTX,
-  };
-
-  CodecType GetCodecType() const;
-  // Validates a VideoCodec's payload type, dimensions and bitrates etc. If they
-  // don't make sense (such as max < min bitrate), and error is logged and
-  // ValidateCodecFormat returns false.
-  bool ValidateCodecFormat() const;
-
- private:
-  void SetDefaultParameters();
-};
-
-struct DataCodec : public Codec {
-  DataCodec(int id, const std::string& name);
-  DataCodec();
-  DataCodec(const DataCodec& c);
-  DataCodec(DataCodec&& c);
-  virtual ~DataCodec() = default;
-
-  DataCodec& operator=(const DataCodec& c);
-  DataCodec& operator=(DataCodec&& c);
-
-  std::string ToString() const;
-};
-
-// Get the codec setting associated with |payload_type|. If there
-// is no codec associated with that payload type it returns nullptr.
-template <class Codec>
-const Codec* FindCodecById(const std::vector<Codec>& codecs, int payload_type) {
-  for (const auto& codec : codecs) {
-    if (codec.id == payload_type)
-      return &codec;
-  }
-  return nullptr;
-}
-
-bool CodecNamesEq(const std::string& name1, const std::string& name2);
-bool CodecNamesEq(const char* name1, const char* name2);
-bool HasNack(const Codec& codec);
-bool HasRemb(const Codec& codec);
-bool HasTransportCc(const Codec& codec);
-// Returns the first codec in |supported_codecs| that matches |codec|, or
-// nullptr if no codec matches.
-const VideoCodec* FindMatchingCodec(
-    const std::vector<VideoCodec>& supported_codecs,
-    const VideoCodec& codec);
-
-}  // namespace cricket
-
-#endif  // WEBRTC_MEDIA_BASE_CODEC_H_
diff --git a/media/base/codec_unittest.cc b/media/base/codec_unittest.cc
deleted file mode 100644
index 26966bb..0000000
--- a/media/base/codec_unittest.cc
+++ /dev/null
@@ -1,327 +0,0 @@
-/*
- *  Copyright (c) 2009 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/media/base/codec.h"
-#include "webrtc/rtc_base/gunit.h"
-
-using cricket::AudioCodec;
-using cricket::Codec;
-using cricket::DataCodec;
-using cricket::FeedbackParam;
-using cricket::VideoCodec;
-using cricket::kCodecParamAssociatedPayloadType;
-using cricket::kCodecParamMaxBitrate;
-using cricket::kCodecParamMinBitrate;
-
-class TestCodec : public Codec {
- public:
-  TestCodec(int id, const std::string name, int clockrate)
-      : Codec(id, name, clockrate) {}
-  TestCodec() : Codec() {}
-  TestCodec(const TestCodec& c) : Codec(c) {}
-};
-
-TEST(CodecTest, TestCodecOperators) {
-  TestCodec c0(96, "D", 1000);
-  c0.SetParam("a", 1);
-
-  TestCodec c1 = c0;
-  EXPECT_TRUE(c1 == c0);
-
-  int param_value0;
-  int param_value1;
-  EXPECT_TRUE(c0.GetParam("a", &param_value0));
-  EXPECT_TRUE(c1.GetParam("a", &param_value1));
-  EXPECT_EQ(param_value0, param_value1);
-
-  c1.id = 86;
-  EXPECT_TRUE(c0 != c1);
-
-  c1 = c0;
-  c1.name = "x";
-  EXPECT_TRUE(c0 != c1);
-
-  c1 = c0;
-  c1.clockrate = 2000;
-  EXPECT_TRUE(c0 != c1);
-
-  c1 = c0;
-  c1.SetParam("a", 2);
-  EXPECT_TRUE(c0 != c1);
-
-  TestCodec c5;
-  TestCodec c6(0, "", 0);
-  EXPECT_TRUE(c5 == c6);
-}
-
-TEST(CodecTest, TestAudioCodecOperators) {
-  AudioCodec c0(96, "A", 44100, 20000, 2);
-  AudioCodec c1(95, "A", 44100, 20000, 2);
-  AudioCodec c2(96, "x", 44100, 20000, 2);
-  AudioCodec c3(96, "A", 48000, 20000, 2);
-  AudioCodec c4(96, "A", 44100, 10000, 2);
-  AudioCodec c5(96, "A", 44100, 20000, 1);
-  EXPECT_NE(c0, c1);
-  EXPECT_NE(c0, c2);
-  EXPECT_NE(c0, c3);
-  EXPECT_NE(c0, c4);
-  EXPECT_NE(c0, c5);
-
-  AudioCodec c7;
-  AudioCodec c8(0, "", 0, 0, 0);
-  AudioCodec c9 = c0;
-  EXPECT_EQ(c8, c7);
-  EXPECT_NE(c9, c7);
-  EXPECT_EQ(c9, c0);
-
-  AudioCodec c10(c0);
-  AudioCodec c11(c0);
-  AudioCodec c12(c0);
-  AudioCodec c13(c0);
-  c10.params["x"] = "abc";
-  c11.params["x"] = "def";
-  c12.params["y"] = "abc";
-  c13.params["x"] = "abc";
-  EXPECT_NE(c10, c0);
-  EXPECT_NE(c11, c0);
-  EXPECT_NE(c11, c10);
-  EXPECT_NE(c12, c0);
-  EXPECT_NE(c12, c10);
-  EXPECT_NE(c12, c11);
-  EXPECT_EQ(c13, c10);
-}
-
-TEST(CodecTest, TestAudioCodecMatches) {
-  // Test a codec with a static payload type.
-  AudioCodec c0(95, "A", 44100, 20000, 1);
-  EXPECT_TRUE(c0.Matches(AudioCodec(95, "", 44100, 20000, 1)));
-  EXPECT_TRUE(c0.Matches(AudioCodec(95, "", 44100, 20000, 0)));
-  EXPECT_TRUE(c0.Matches(AudioCodec(95, "", 44100, 0, 0)));
-  EXPECT_TRUE(c0.Matches(AudioCodec(95, "", 0, 0, 0)));
-  EXPECT_FALSE(c0.Matches(AudioCodec(96, "", 44100, 20000, 1)));
-  EXPECT_FALSE(c0.Matches(AudioCodec(95, "", 55100, 20000, 1)));
-  EXPECT_FALSE(c0.Matches(AudioCodec(95, "", 44100, 30000, 1)));
-  EXPECT_FALSE(c0.Matches(AudioCodec(95, "", 44100, 20000, 2)));
-  EXPECT_FALSE(c0.Matches(AudioCodec(95, "", 55100, 30000, 2)));
-
-  // Test a codec with a dynamic payload type.
-  AudioCodec c1(96, "A", 44100, 20000, 1);
-  EXPECT_TRUE(c1.Matches(AudioCodec(96, "A", 0, 0, 0)));
-  EXPECT_TRUE(c1.Matches(AudioCodec(97, "A", 0, 0, 0)));
-  EXPECT_TRUE(c1.Matches(AudioCodec(96, "a", 0, 0, 0)));
-  EXPECT_TRUE(c1.Matches(AudioCodec(97, "a", 0, 0, 0)));
-  EXPECT_FALSE(c1.Matches(AudioCodec(95, "A", 0, 0, 0)));
-  EXPECT_FALSE(c1.Matches(AudioCodec(96, "", 44100, 20000, 2)));
-  EXPECT_FALSE(c1.Matches(AudioCodec(96, "A", 55100, 30000, 1)));
-
-  // Test a codec with a dynamic payload type, and auto bitrate.
-  AudioCodec c2(97, "A", 16000, 0, 1);
-  // Use default bitrate.
-  EXPECT_TRUE(c2.Matches(AudioCodec(97, "A", 16000, 0, 1)));
-  EXPECT_TRUE(c2.Matches(AudioCodec(97, "A", 16000, 0, 0)));
-  // Use explicit bitrate.
-  EXPECT_TRUE(c2.Matches(AudioCodec(97, "A", 16000, 32000, 1)));
-  // Backward compatibility with clients that might send "-1" (for default).
-  EXPECT_TRUE(c2.Matches(AudioCodec(97, "A", 16000, -1, 1)));
-
-  // Stereo doesn't match channels = 0.
-  AudioCodec c3(96, "A", 44100, 20000, 2);
-  EXPECT_TRUE(c3.Matches(AudioCodec(96, "A", 44100, 20000, 2)));
-  EXPECT_FALSE(c3.Matches(AudioCodec(96, "A", 44100, 20000, 1)));
-  EXPECT_FALSE(c3.Matches(AudioCodec(96, "A", 44100, 20000, 0)));
-}
-
-TEST(CodecTest, TestVideoCodecOperators) {
-  VideoCodec c0(96, "V");
-  VideoCodec c1(95, "V");
-  VideoCodec c2(96, "x");
-
-  EXPECT_TRUE(c0 != c1);
-  EXPECT_TRUE(c0 != c2);
-
-  VideoCodec c7;
-  VideoCodec c8(0, "");
-  VideoCodec c9 = c0;
-  EXPECT_TRUE(c8 == c7);
-  EXPECT_TRUE(c9 != c7);
-  EXPECT_TRUE(c9 == c0);
-
-  VideoCodec c10(c0);
-  VideoCodec c11(c0);
-  VideoCodec c12(c0);
-  VideoCodec c13(c0);
-  c10.params["x"] = "abc";
-  c11.params["x"] = "def";
-  c12.params["y"] = "abc";
-  c13.params["x"] = "abc";
-  EXPECT_TRUE(c10 != c0);
-  EXPECT_TRUE(c11 != c0);
-  EXPECT_TRUE(c11 != c10);
-  EXPECT_TRUE(c12 != c0);
-  EXPECT_TRUE(c12 != c10);
-  EXPECT_TRUE(c12 != c11);
-  EXPECT_TRUE(c13 == c10);
-}
-
-TEST(CodecTest, TestVideoCodecMatches) {
-  // Test a codec with a static payload type.
-  VideoCodec c0(95, "V");
-  EXPECT_TRUE(c0.Matches(VideoCodec(95, "")));
-  EXPECT_FALSE(c0.Matches(VideoCodec(96, "")));
-
-  // Test a codec with a dynamic payload type.
-  VideoCodec c1(96, "V");
-  EXPECT_TRUE(c1.Matches(VideoCodec(96, "V")));
-  EXPECT_TRUE(c1.Matches(VideoCodec(97, "V")));
-  EXPECT_TRUE(c1.Matches(VideoCodec(96, "v")));
-  EXPECT_TRUE(c1.Matches(VideoCodec(97, "v")));
-  EXPECT_FALSE(c1.Matches(VideoCodec(96, "")));
-  EXPECT_FALSE(c1.Matches(VideoCodec(95, "V")));
-}
-
-TEST(CodecTest, TestDataCodecMatches) {
-  // Test a codec with a static payload type.
-  DataCodec c0(95, "D");
-  EXPECT_TRUE(c0.Matches(DataCodec(95, "")));
-  EXPECT_FALSE(c0.Matches(DataCodec(96, "")));
-
-  // Test a codec with a dynamic payload type.
-  DataCodec c1(96, "D");
-  EXPECT_TRUE(c1.Matches(DataCodec(96, "D")));
-  EXPECT_TRUE(c1.Matches(DataCodec(97, "D")));
-  EXPECT_TRUE(c1.Matches(DataCodec(96, "d")));
-  EXPECT_TRUE(c1.Matches(DataCodec(97, "d")));
-  EXPECT_FALSE(c1.Matches(DataCodec(96, "")));
-  EXPECT_FALSE(c1.Matches(DataCodec(95, "D")));
-}
-
-TEST(CodecTest, TestSetParamGetParamAndRemoveParam) {
-  AudioCodec codec;
-  codec.SetParam("a", "1");
-  codec.SetParam("b", "x");
-
-  int int_value = 0;
-  EXPECT_TRUE(codec.GetParam("a", &int_value));
-  EXPECT_EQ(1, int_value);
-  EXPECT_FALSE(codec.GetParam("b", &int_value));
-  EXPECT_FALSE(codec.GetParam("c", &int_value));
-
-  std::string str_value;
-  EXPECT_TRUE(codec.GetParam("a", &str_value));
-  EXPECT_EQ("1", str_value);
-  EXPECT_TRUE(codec.GetParam("b", &str_value));
-  EXPECT_EQ("x", str_value);
-  EXPECT_FALSE(codec.GetParam("c", &str_value));
-  EXPECT_TRUE(codec.RemoveParam("a"));
-  EXPECT_FALSE(codec.RemoveParam("c"));
-}
-
-TEST(CodecTest, TestIntersectFeedbackParams) {
-  const FeedbackParam a1("a", "1");
-  const FeedbackParam b2("b", "2");
-  const FeedbackParam b3("b", "3");
-  const FeedbackParam c3("c", "3");
-  TestCodec c1;
-  c1.AddFeedbackParam(a1); // Only match with c2.
-  c1.AddFeedbackParam(b2); // Same param different values.
-  c1.AddFeedbackParam(c3); // Not in c2.
-  TestCodec c2;
-  c2.AddFeedbackParam(a1);
-  c2.AddFeedbackParam(b3);
-
-  c1.IntersectFeedbackParams(c2);
-  EXPECT_TRUE(c1.HasFeedbackParam(a1));
-  EXPECT_FALSE(c1.HasFeedbackParam(b2));
-  EXPECT_FALSE(c1.HasFeedbackParam(c3));
-}
-
-TEST(CodecTest, TestGetCodecType) {
-  // Codec type comparison should be case insenstive on names.
-  const VideoCodec codec(96, "V");
-  const VideoCodec rtx_codec(96, "rTx");
-  const VideoCodec ulpfec_codec(96, "ulpFeC");
-  const VideoCodec flexfec_codec(96, "FlExFeC-03");
-  const VideoCodec red_codec(96, "ReD");
-  EXPECT_EQ(VideoCodec::CODEC_VIDEO, codec.GetCodecType());
-  EXPECT_EQ(VideoCodec::CODEC_RTX, rtx_codec.GetCodecType());
-  EXPECT_EQ(VideoCodec::CODEC_ULPFEC, ulpfec_codec.GetCodecType());
-  EXPECT_EQ(VideoCodec::CODEC_FLEXFEC, flexfec_codec.GetCodecType());
-  EXPECT_EQ(VideoCodec::CODEC_RED, red_codec.GetCodecType());
-}
-
-TEST(CodecTest, TestCreateRtxCodec) {
-  VideoCodec rtx_codec = VideoCodec::CreateRtxCodec(96, 120);
-  EXPECT_EQ(96, rtx_codec.id);
-  EXPECT_EQ(VideoCodec::CODEC_RTX, rtx_codec.GetCodecType());
-  int associated_payload_type;
-  ASSERT_TRUE(rtx_codec.GetParam(kCodecParamAssociatedPayloadType,
-                                 &associated_payload_type));
-  EXPECT_EQ(120, associated_payload_type);
-}
-
-TEST(CodecTest, TestValidateCodecFormat) {
-  const VideoCodec codec(96, "V");
-  ASSERT_TRUE(codec.ValidateCodecFormat());
-
-  // Accept 0-127 as payload types.
-  VideoCodec low_payload_type = codec;
-  low_payload_type.id = 0;
-  VideoCodec high_payload_type = codec;
-  high_payload_type.id = 127;
-  ASSERT_TRUE(low_payload_type.ValidateCodecFormat());
-  EXPECT_TRUE(high_payload_type.ValidateCodecFormat());
-
-  // Reject negative payloads.
-  VideoCodec negative_payload_type = codec;
-  negative_payload_type.id = -1;
-  EXPECT_FALSE(negative_payload_type.ValidateCodecFormat());
-
-  // Reject too-high payloads.
-  VideoCodec too_high_payload_type = codec;
-  too_high_payload_type.id = 128;
-  EXPECT_FALSE(too_high_payload_type.ValidateCodecFormat());
-
-  // Reject codecs with min bitrate > max bitrate.
-  VideoCodec incorrect_bitrates = codec;
-  incorrect_bitrates.params[kCodecParamMinBitrate] = "100";
-  incorrect_bitrates.params[kCodecParamMaxBitrate] = "80";
-  EXPECT_FALSE(incorrect_bitrates.ValidateCodecFormat());
-
-  // Accept min bitrate == max bitrate.
-  VideoCodec equal_bitrates = codec;
-  equal_bitrates.params[kCodecParamMinBitrate] = "100";
-  equal_bitrates.params[kCodecParamMaxBitrate] = "100";
-  EXPECT_TRUE(equal_bitrates.ValidateCodecFormat());
-
-  // Accept min bitrate < max bitrate.
-  VideoCodec different_bitrates = codec;
-  different_bitrates.params[kCodecParamMinBitrate] = "99";
-  different_bitrates.params[kCodecParamMaxBitrate] = "100";
-  EXPECT_TRUE(different_bitrates.ValidateCodecFormat());
-}
-
-TEST(CodecTest, TestToCodecParameters) {
-  const VideoCodec v(96, "V");
-  webrtc::RtpCodecParameters codec_params_1 = v.ToCodecParameters();
-  EXPECT_EQ(96, codec_params_1.payload_type);
-  EXPECT_EQ(cricket::MEDIA_TYPE_VIDEO, codec_params_1.kind);
-  EXPECT_EQ("V", codec_params_1.name);
-  EXPECT_EQ(rtc::Optional<int>(cricket::kVideoCodecClockrate),
-            codec_params_1.clock_rate);
-  EXPECT_EQ(rtc::Optional<int>(), codec_params_1.num_channels);
-
-  const AudioCodec a(97, "A", 44100, 20000, 2);
-  webrtc::RtpCodecParameters codec_params_2 = a.ToCodecParameters();
-  EXPECT_EQ(97, codec_params_2.payload_type);
-  EXPECT_EQ(cricket::MEDIA_TYPE_AUDIO, codec_params_2.kind);
-  EXPECT_EQ("A", codec_params_2.name);
-  EXPECT_EQ(rtc::Optional<int>(44100), codec_params_2.clock_rate);
-  EXPECT_EQ(rtc::Optional<int>(2), codec_params_2.num_channels);
-}
diff --git a/media/base/cryptoparams.h b/media/base/cryptoparams.h
deleted file mode 100644
index 84c883d..0000000
--- a/media/base/cryptoparams.h
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- *  Copyright (c) 2004 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_MEDIA_BASE_CRYPTOPARAMS_H_
-#define WEBRTC_MEDIA_BASE_CRYPTOPARAMS_H_
-
-#include <string>
-
-namespace cricket {
-
-// Parameters for SRTP negotiation, as described in RFC 4568.
-struct CryptoParams {
-  CryptoParams() : tag(0) {}
-  CryptoParams(int t,
-               const std::string& cs,
-               const std::string& kp,
-               const std::string& sp)
-      : tag(t), cipher_suite(cs), key_params(kp), session_params(sp) {}
-
-  bool Matches(const CryptoParams& params) const {
-    return (tag == params.tag && cipher_suite == params.cipher_suite);
-  }
-
-  int tag;
-  std::string cipher_suite;
-  std::string key_params;
-  std::string session_params;
-};
-
-}  // namespace cricket
-
-#endif  // WEBRTC_MEDIA_BASE_CRYPTOPARAMS_H_
diff --git a/media/base/device.h b/media/base/device.h
deleted file mode 100644
index 7eb630f..0000000
--- a/media/base/device.h
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- *  Copyright (c) 2014 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_MEDIA_BASE_DEVICE_H_
-#define WEBRTC_MEDIA_BASE_DEVICE_H_
-
-#include "webrtc/rtc_base/stringencode.h"
-
-namespace cricket {
-
-// Used to represent an audio or video capture or render device.
-struct Device {
-  Device() {}
-  Device(const std::string& name, int id)
-      : name(name),
-        id(rtc::ToString(id)) {
-  }
-  Device(const std::string& name, const std::string& id)
-      : name(name), id(id) {}
-
-  std::string name;
-  std::string id;
-};
-
-}  // namespace cricket
-
-#endif  // WEBRTC_MEDIA_BASE_DEVICE_H_
diff --git a/media/base/fakemediaengine.h b/media/base/fakemediaengine.h
deleted file mode 100644
index 921623c..0000000
--- a/media/base/fakemediaengine.h
+++ /dev/null
@@ -1,981 +0,0 @@
-/*
- *  Copyright (c) 2004 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_MEDIA_BASE_FAKEMEDIAENGINE_H_
-#define WEBRTC_MEDIA_BASE_FAKEMEDIAENGINE_H_
-
-#include <list>
-#include <map>
-#include <memory>
-#include <set>
-#include <string>
-#include <vector>
-
-#include "webrtc/api/call/audio_sink.h"
-#include "webrtc/media/base/audiosource.h"
-#include "webrtc/media/base/mediaengine.h"
-#include "webrtc/media/base/rtputils.h"
-#include "webrtc/media/base/streamparams.h"
-#include "webrtc/media/engine/webrtcvideoengine.h"
-#include "webrtc/modules/audio_processing/include/audio_processing.h"
-#include "webrtc/p2p/base/sessiondescription.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/copyonwritebuffer.h"
-#include "webrtc/rtc_base/networkroute.h"
-#include "webrtc/rtc_base/ptr_util.h"
-#include "webrtc/rtc_base/stringutils.h"
-
-using webrtc::RtpExtension;
-
-namespace cricket {
-
-class FakeMediaEngine;
-class FakeVideoEngine;
-class FakeVoiceEngine;
-
-// A common helper class that handles sending and receiving RTP/RTCP packets.
-template <class Base> class RtpHelper : public Base {
- public:
-  RtpHelper()
-      : sending_(false),
-        playout_(false),
-        fail_set_send_codecs_(false),
-        fail_set_recv_codecs_(false),
-        send_ssrc_(0),
-        ready_to_send_(false),
-        transport_overhead_per_packet_(0),
-        num_network_route_changes_(0) {}
-  virtual ~RtpHelper() = default;
-  const std::vector<RtpExtension>& recv_extensions() {
-    return recv_extensions_;
-  }
-  const std::vector<RtpExtension>& send_extensions() {
-    return send_extensions_;
-  }
-  bool sending() const { return sending_; }
-  bool playout() const { return playout_; }
-  const std::list<std::string>& rtp_packets() const { return rtp_packets_; }
-  const std::list<std::string>& rtcp_packets() const { return rtcp_packets_; }
-
-  bool SendRtp(const void* data,
-               size_t len,
-               const rtc::PacketOptions& options) {
-    if (!sending_) {
-      return false;
-    }
-    rtc::CopyOnWriteBuffer packet(reinterpret_cast<const uint8_t*>(data), len,
-                                  kMaxRtpPacketLen);
-    return Base::SendPacket(&packet, options);
-  }
-  bool SendRtcp(const void* data, size_t len) {
-    rtc::CopyOnWriteBuffer packet(reinterpret_cast<const uint8_t*>(data), len,
-                                  kMaxRtpPacketLen);
-    return Base::SendRtcp(&packet, rtc::PacketOptions());
-  }
-
-  bool CheckRtp(const void* data, size_t len) {
-    bool success = !rtp_packets_.empty();
-    if (success) {
-      std::string packet = rtp_packets_.front();
-      rtp_packets_.pop_front();
-      success = (packet == std::string(static_cast<const char*>(data), len));
-    }
-    return success;
-  }
-  bool CheckRtcp(const void* data, size_t len) {
-    bool success = !rtcp_packets_.empty();
-    if (success) {
-      std::string packet = rtcp_packets_.front();
-      rtcp_packets_.pop_front();
-      success = (packet == std::string(static_cast<const char*>(data), len));
-    }
-    return success;
-  }
-  bool CheckNoRtp() { return rtp_packets_.empty(); }
-  bool CheckNoRtcp() { return rtcp_packets_.empty(); }
-  void set_fail_set_send_codecs(bool fail) { fail_set_send_codecs_ = fail; }
-  void set_fail_set_recv_codecs(bool fail) { fail_set_recv_codecs_ = fail; }
-  virtual bool AddSendStream(const StreamParams& sp) {
-    if (std::find(send_streams_.begin(), send_streams_.end(), sp) !=
-        send_streams_.end()) {
-      return false;
-    }
-    send_streams_.push_back(sp);
-    rtp_send_parameters_[sp.first_ssrc()] =
-        CreateRtpParametersWithOneEncoding();
-    return true;
-  }
-  virtual bool RemoveSendStream(uint32_t ssrc) {
-    auto parameters_iterator = rtp_send_parameters_.find(ssrc);
-    if (parameters_iterator != rtp_send_parameters_.end()) {
-      rtp_send_parameters_.erase(parameters_iterator);
-    }
-    return RemoveStreamBySsrc(&send_streams_, ssrc);
-  }
-  virtual bool AddRecvStream(const StreamParams& sp) {
-    if (std::find(receive_streams_.begin(), receive_streams_.end(), sp) !=
-        receive_streams_.end()) {
-      return false;
-    }
-    receive_streams_.push_back(sp);
-    rtp_receive_parameters_[sp.first_ssrc()] =
-        CreateRtpParametersWithOneEncoding();
-    return true;
-  }
-  virtual bool RemoveRecvStream(uint32_t ssrc) {
-    auto parameters_iterator = rtp_receive_parameters_.find(ssrc);
-    if (parameters_iterator != rtp_receive_parameters_.end()) {
-      rtp_receive_parameters_.erase(parameters_iterator);
-    }
-    return RemoveStreamBySsrc(&receive_streams_, ssrc);
-  }
-
-  virtual webrtc::RtpParameters GetRtpSendParameters(uint32_t ssrc) const {
-    auto parameters_iterator = rtp_send_parameters_.find(ssrc);
-    if (parameters_iterator != rtp_send_parameters_.end()) {
-      return parameters_iterator->second;
-    }
-    return webrtc::RtpParameters();
-  }
-  virtual bool SetRtpSendParameters(uint32_t ssrc,
-                                    const webrtc::RtpParameters& parameters) {
-    auto parameters_iterator = rtp_send_parameters_.find(ssrc);
-    if (parameters_iterator != rtp_send_parameters_.end()) {
-      parameters_iterator->second = parameters;
-      return true;
-    }
-    // Replicate the behavior of the real media channel: return false
-    // when setting parameters for unknown SSRCs.
-    return false;
-  }
-
-  virtual webrtc::RtpParameters GetRtpReceiveParameters(uint32_t ssrc) const {
-    auto parameters_iterator = rtp_receive_parameters_.find(ssrc);
-    if (parameters_iterator != rtp_receive_parameters_.end()) {
-      return parameters_iterator->second;
-    }
-    return webrtc::RtpParameters();
-  }
-  virtual bool SetRtpReceiveParameters(
-      uint32_t ssrc,
-      const webrtc::RtpParameters& parameters) {
-    auto parameters_iterator = rtp_receive_parameters_.find(ssrc);
-    if (parameters_iterator != rtp_receive_parameters_.end()) {
-      parameters_iterator->second = parameters;
-      return true;
-    }
-    // Replicate the behavior of the real media channel: return false
-    // when setting parameters for unknown SSRCs.
-    return false;
-  }
-
-  bool IsStreamMuted(uint32_t ssrc) const {
-    bool ret = muted_streams_.find(ssrc) != muted_streams_.end();
-    // If |ssrc = 0| check if the first send stream is muted.
-    if (!ret && ssrc == 0 && !send_streams_.empty()) {
-      return muted_streams_.find(send_streams_[0].first_ssrc()) !=
-             muted_streams_.end();
-    }
-    return ret;
-  }
-  const std::vector<StreamParams>& send_streams() const {
-    return send_streams_;
-  }
-  const std::vector<StreamParams>& recv_streams() const {
-    return receive_streams_;
-  }
-  bool HasRecvStream(uint32_t ssrc) const {
-    return GetStreamBySsrc(receive_streams_, ssrc) != nullptr;
-  }
-  bool HasSendStream(uint32_t ssrc) const {
-    return GetStreamBySsrc(send_streams_, ssrc) != nullptr;
-  }
-  // TODO(perkj): This is to support legacy unit test that only check one
-  // sending stream.
-  uint32_t send_ssrc() const {
-    if (send_streams_.empty())
-      return 0;
-    return send_streams_[0].first_ssrc();
-  }
-
-  // TODO(perkj): This is to support legacy unit test that only check one
-  // sending stream.
-  const std::string rtcp_cname() {
-    if (send_streams_.empty())
-      return "";
-    return send_streams_[0].cname;
-  }
-  const RtcpParameters& send_rtcp_parameters() { return send_rtcp_parameters_; }
-  const RtcpParameters& recv_rtcp_parameters() { return recv_rtcp_parameters_; }
-
-  bool ready_to_send() const {
-    return ready_to_send_;
-  }
-
-  int transport_overhead_per_packet() const {
-    return transport_overhead_per_packet_;
-  }
-
-  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;
-  }
-
- protected:
-  bool MuteStream(uint32_t ssrc, bool mute) {
-    if (!HasSendStream(ssrc) && ssrc != 0) {
-      return false;
-    }
-    if (mute) {
-      muted_streams_.insert(ssrc);
-    } else {
-      muted_streams_.erase(ssrc);
-    }
-    return true;
-  }
-  bool set_sending(bool send) {
-    sending_ = send;
-    return true;
-  }
-  void set_playout(bool playout) { playout_ = playout; }
-  bool SetRecvRtpHeaderExtensions(const std::vector<RtpExtension>& extensions) {
-    recv_extensions_ = extensions;
-    return true;
-  }
-  bool SetSendRtpHeaderExtensions(const std::vector<RtpExtension>& extensions) {
-    send_extensions_ = extensions;
-    return true;
-  }
-  void set_send_rtcp_parameters(const RtcpParameters& params) {
-    send_rtcp_parameters_ = params;
-  }
-  void set_recv_rtcp_parameters(const RtcpParameters& params) {
-    recv_rtcp_parameters_ = params;
-  }
-  virtual void OnPacketReceived(rtc::CopyOnWriteBuffer* packet,
-                                const rtc::PacketTime& packet_time) {
-    rtp_packets_.push_back(std::string(packet->data<char>(), packet->size()));
-  }
-  virtual void OnRtcpReceived(rtc::CopyOnWriteBuffer* packet,
-                              const rtc::PacketTime& packet_time) {
-    rtcp_packets_.push_back(std::string(packet->data<char>(), packet->size()));
-  }
-  virtual void OnReadyToSend(bool ready) {
-    ready_to_send_ = ready;
-  }
-  virtual void OnTransportOverheadChanged(int transport_overhead_per_packet) {
-    transport_overhead_per_packet_ = transport_overhead_per_packet;
-  }
-
-  virtual void OnNetworkRouteChanged(const std::string& transport_name,
-                                     const rtc::NetworkRoute& network_route) {
-    last_network_route_ = network_route;
-    ++num_network_route_changes_;
-  }
-  bool fail_set_send_codecs() const { return fail_set_send_codecs_; }
-  bool fail_set_recv_codecs() const { return fail_set_recv_codecs_; }
-
- private:
-  bool sending_;
-  bool playout_;
-  std::vector<RtpExtension> recv_extensions_;
-  std::vector<RtpExtension> send_extensions_;
-  std::list<std::string> rtp_packets_;
-  std::list<std::string> rtcp_packets_;
-  std::vector<StreamParams> send_streams_;
-  std::vector<StreamParams> receive_streams_;
-  RtcpParameters send_rtcp_parameters_;
-  RtcpParameters recv_rtcp_parameters_;
-  std::set<uint32_t> muted_streams_;
-  std::map<uint32_t, webrtc::RtpParameters> rtp_send_parameters_;
-  std::map<uint32_t, webrtc::RtpParameters> rtp_receive_parameters_;
-  bool fail_set_send_codecs_;
-  bool fail_set_recv_codecs_;
-  uint32_t send_ssrc_;
-  std::string rtcp_cname_;
-  bool ready_to_send_;
-  int transport_overhead_per_packet_;
-  rtc::NetworkRoute last_network_route_;
-  int num_network_route_changes_;
-};
-
-class FakeVoiceMediaChannel : public RtpHelper<VoiceMediaChannel> {
- public:
-  struct DtmfInfo {
-    DtmfInfo(uint32_t ssrc, int event_code, int duration)
-        : ssrc(ssrc),
-          event_code(event_code),
-          duration(duration) {}
-    uint32_t ssrc;
-    int event_code;
-    int duration;
-  };
-  explicit FakeVoiceMediaChannel(FakeVoiceEngine* engine,
-                                 const AudioOptions& options)
-      : engine_(engine), max_bps_(-1) {
-    output_scalings_[0] = 1.0;  // For default channel.
-    SetOptions(options);
-  }
-  ~FakeVoiceMediaChannel();
-  const std::vector<AudioCodec>& recv_codecs() const { return recv_codecs_; }
-  const std::vector<AudioCodec>& send_codecs() const { return send_codecs_; }
-  const std::vector<AudioCodec>& codecs() const { return send_codecs(); }
-  const std::vector<DtmfInfo>& dtmf_info_queue() const {
-    return dtmf_info_queue_;
-  }
-  const AudioOptions& options() const { return options_; }
-  int max_bps() const { return max_bps_; }
-  virtual bool SetSendParameters(const AudioSendParameters& params) {
-    set_send_rtcp_parameters(params.rtcp);
-    return (SetSendCodecs(params.codecs) &&
-            SetSendRtpHeaderExtensions(params.extensions) &&
-            SetMaxSendBandwidth(params.max_bandwidth_bps) &&
-            SetOptions(params.options));
-  }
-
-  virtual bool SetRecvParameters(const AudioRecvParameters& params) {
-    set_recv_rtcp_parameters(params.rtcp);
-    return (SetRecvCodecs(params.codecs) &&
-            SetRecvRtpHeaderExtensions(params.extensions));
-  }
-
-  virtual void SetPlayout(bool playout) { set_playout(playout); }
-  virtual void SetSend(bool send) { set_sending(send); }
-  virtual bool SetAudioSend(uint32_t ssrc,
-                            bool enable,
-                            const AudioOptions* options,
-                            AudioSource* source) {
-    if (!SetLocalSource(ssrc, source)) {
-      return false;
-    }
-    if (!RtpHelper<VoiceMediaChannel>::MuteStream(ssrc, !enable)) {
-      return false;
-    }
-    if (enable && options) {
-      return SetOptions(*options);
-    }
-    return true;
-  }
-
-  bool HasSource(uint32_t ssrc) const {
-    return local_sinks_.find(ssrc) != local_sinks_.end();
-  }
-
-  virtual bool AddRecvStream(const StreamParams& sp) {
-    if (!RtpHelper<VoiceMediaChannel>::AddRecvStream(sp))
-      return false;
-    output_scalings_[sp.first_ssrc()] = 1.0;
-    return true;
-  }
-  virtual bool RemoveRecvStream(uint32_t ssrc) {
-    if (!RtpHelper<VoiceMediaChannel>::RemoveRecvStream(ssrc))
-      return false;
-    output_scalings_.erase(ssrc);
-    return true;
-  }
-
-  virtual bool GetActiveStreams(AudioInfo::StreamList* streams) { return true; }
-  virtual int GetOutputLevel() { return 0; }
-
-  virtual bool CanInsertDtmf() {
-    for (std::vector<AudioCodec>::const_iterator it = send_codecs_.begin();
-         it != send_codecs_.end(); ++it) {
-      // Find the DTMF telephone event "codec".
-      if (_stricmp(it->name.c_str(), "telephone-event") == 0) {
-        return true;
-      }
-    }
-    return false;
-  }
-  virtual bool InsertDtmf(uint32_t ssrc,
-                          int event_code,
-                          int duration) {
-    dtmf_info_queue_.push_back(DtmfInfo(ssrc, event_code, duration));
-    return true;
-  }
-
-  virtual bool SetOutputVolume(uint32_t ssrc, double volume) {
-    if (0 == ssrc) {
-      std::map<uint32_t, double>::iterator it;
-      for (it = output_scalings_.begin(); it != output_scalings_.end(); ++it) {
-        it->second = volume;
-      }
-      return true;
-    } else if (output_scalings_.find(ssrc) != output_scalings_.end()) {
-      output_scalings_[ssrc] = volume;
-      return true;
-    }
-    return false;
-  }
-  bool GetOutputVolume(uint32_t ssrc, double* volume) {
-    if (output_scalings_.find(ssrc) == output_scalings_.end())
-      return false;
-    *volume = output_scalings_[ssrc];
-    return true;
-  }
-
-  virtual bool GetStats(VoiceMediaInfo* info) { return false; }
-
-  virtual void SetRawAudioSink(
-      uint32_t ssrc,
-      std::unique_ptr<webrtc::AudioSinkInterface> sink) {
-    sink_ = std::move(sink);
-  }
-
-  virtual std::vector<webrtc::RtpSource> GetSources(uint32_t ssrc) const {
-    return std::vector<webrtc::RtpSource>();
-  }
-
- private:
-  class VoiceChannelAudioSink : public AudioSource::Sink {
-   public:
-    explicit VoiceChannelAudioSink(AudioSource* source) : source_(source) {
-      source_->SetSink(this);
-    }
-    virtual ~VoiceChannelAudioSink() {
-      if (source_) {
-        source_->SetSink(nullptr);
-      }
-    }
-    void OnData(const void* audio_data,
-                int bits_per_sample,
-                int sample_rate,
-                size_t number_of_channels,
-                size_t number_of_frames) override {}
-    void OnClose() override { source_ = nullptr; }
-    AudioSource* source() const { return source_; }
-
-   private:
-    AudioSource* source_;
-  };
-
-  bool SetRecvCodecs(const std::vector<AudioCodec>& codecs) {
-    if (fail_set_recv_codecs()) {
-      // Fake the failure in SetRecvCodecs.
-      return false;
-    }
-    recv_codecs_ = codecs;
-    return true;
-  }
-  bool SetSendCodecs(const std::vector<AudioCodec>& codecs) {
-    if (fail_set_send_codecs()) {
-      // Fake the failure in SetSendCodecs.
-      return false;
-    }
-    send_codecs_ = codecs;
-    return true;
-  }
-  bool SetMaxSendBandwidth(int bps) {
-    max_bps_ = bps;
-    return true;
-  }
-  bool SetOptions(const AudioOptions& options) {
-    // Does a "merge" of current options and set options.
-    options_.SetAll(options);
-    return true;
-  }
-  bool SetLocalSource(uint32_t ssrc, AudioSource* source) {
-    auto it = local_sinks_.find(ssrc);
-    if (source) {
-      if (it != local_sinks_.end()) {
-        RTC_CHECK(it->second->source() == source);
-      } else {
-        local_sinks_.insert(
-            std::make_pair(ssrc, new VoiceChannelAudioSink(source)));
-      }
-    } else {
-      if (it != local_sinks_.end()) {
-        delete it->second;
-        local_sinks_.erase(it);
-      }
-    }
-    return true;
-  }
-
-  FakeVoiceEngine* engine_;
-  std::vector<AudioCodec> recv_codecs_;
-  std::vector<AudioCodec> send_codecs_;
-  std::map<uint32_t, double> output_scalings_;
-  std::vector<DtmfInfo> dtmf_info_queue_;
-  AudioOptions options_;
-  std::map<uint32_t, VoiceChannelAudioSink*> local_sinks_;
-  std::unique_ptr<webrtc::AudioSinkInterface> sink_;
-  int max_bps_;
-};
-
-// A helper function to compare the FakeVoiceMediaChannel::DtmfInfo.
-inline bool CompareDtmfInfo(const FakeVoiceMediaChannel::DtmfInfo& info,
-                            uint32_t ssrc,
-                            int event_code,
-                            int duration) {
-  return (info.duration == duration && info.event_code == event_code &&
-          info.ssrc == ssrc);
-}
-
-class FakeVideoMediaChannel : public RtpHelper<VideoMediaChannel> {
- public:
-  FakeVideoMediaChannel(FakeVideoEngine* engine, const VideoOptions& options)
-      : engine_(engine), max_bps_(-1) {
-    SetOptions(options);
-  }
-
-  ~FakeVideoMediaChannel();
-
-  const std::vector<VideoCodec>& recv_codecs() const { return recv_codecs_; }
-  const std::vector<VideoCodec>& send_codecs() const { return send_codecs_; }
-  const std::vector<VideoCodec>& codecs() const { return send_codecs(); }
-  bool rendering() const { return playout(); }
-  const VideoOptions& options() const { return options_; }
-  const std::map<uint32_t, rtc::VideoSinkInterface<webrtc::VideoFrame>*>&
-  sinks() const {
-    return sinks_;
-  }
-  int max_bps() const { return max_bps_; }
-  bool SetSendParameters(const VideoSendParameters& params) override {
-    set_send_rtcp_parameters(params.rtcp);
-    return (SetSendCodecs(params.codecs) &&
-            SetSendRtpHeaderExtensions(params.extensions) &&
-            SetMaxSendBandwidth(params.max_bandwidth_bps));
-  }
-  bool SetRecvParameters(const VideoRecvParameters& params) override {
-    set_recv_rtcp_parameters(params.rtcp);
-    return (SetRecvCodecs(params.codecs) &&
-            SetRecvRtpHeaderExtensions(params.extensions));
-  }
-  bool AddSendStream(const StreamParams& sp) override {
-    return RtpHelper<VideoMediaChannel>::AddSendStream(sp);
-  }
-  bool RemoveSendStream(uint32_t ssrc) override {
-    return RtpHelper<VideoMediaChannel>::RemoveSendStream(ssrc);
-  }
-
-  bool GetSendCodec(VideoCodec* send_codec) override {
-    if (send_codecs_.empty()) {
-      return false;
-    }
-    *send_codec = send_codecs_[0];
-    return true;
-  }
-  bool SetSink(uint32_t ssrc,
-               rtc::VideoSinkInterface<webrtc::VideoFrame>* sink) override {
-    if (ssrc != 0 && sinks_.find(ssrc) == sinks_.end()) {
-      return false;
-    }
-    if (ssrc != 0) {
-      sinks_[ssrc] = sink;
-    }
-    return true;
-  }
-  bool HasSink(uint32_t ssrc) const {
-    return sinks_.find(ssrc) != sinks_.end() && sinks_.at(ssrc) != nullptr;
-  }
-
-  bool SetSend(bool send) override { return set_sending(send); }
-  bool SetVideoSend(
-      uint32_t ssrc,
-      bool enable,
-      const VideoOptions* options,
-      rtc::VideoSourceInterface<webrtc::VideoFrame>* source) override {
-    if (!RtpHelper<VideoMediaChannel>::MuteStream(ssrc, !enable)) {
-      return false;
-    }
-    if (enable && options) {
-      if (!SetOptions(*options)) {
-        return false;
-      }
-    }
-    sources_[ssrc] = source;
-    return true;
-  }
-
-  bool HasSource(uint32_t ssrc) const {
-    return sources_.find(ssrc) != sources_.end() &&
-           sources_.at(ssrc) != nullptr;
-  }
-  bool AddRecvStream(const StreamParams& sp) override {
-    if (!RtpHelper<VideoMediaChannel>::AddRecvStream(sp))
-      return false;
-    sinks_[sp.first_ssrc()] = NULL;
-    return true;
-  }
-  bool RemoveRecvStream(uint32_t ssrc) override {
-    if (!RtpHelper<VideoMediaChannel>::RemoveRecvStream(ssrc))
-      return false;
-    sinks_.erase(ssrc);
-    return true;
-  }
-
-  void FillBitrateInfo(BandwidthEstimationInfo* bwe_info) override {}
-  bool GetStats(VideoMediaInfo* info) override { return false; }
-
- private:
-  bool SetRecvCodecs(const std::vector<VideoCodec>& codecs) {
-    if (fail_set_recv_codecs()) {
-      // Fake the failure in SetRecvCodecs.
-      return false;
-    }
-    recv_codecs_ = codecs;
-    return true;
-  }
-  bool SetSendCodecs(const std::vector<VideoCodec>& codecs) {
-    if (fail_set_send_codecs()) {
-      // Fake the failure in SetSendCodecs.
-      return false;
-    }
-    send_codecs_ = codecs;
-
-    return true;
-  }
-  bool SetOptions(const VideoOptions& options) {
-    options_ = options;
-    return true;
-  }
-  bool SetMaxSendBandwidth(int bps) {
-    max_bps_ = bps;
-    return true;
-  }
-
-  FakeVideoEngine* engine_;
-  std::vector<VideoCodec> recv_codecs_;
-  std::vector<VideoCodec> send_codecs_;
-  std::map<uint32_t, rtc::VideoSinkInterface<webrtc::VideoFrame>*> sinks_;
-  std::map<uint32_t, rtc::VideoSourceInterface<webrtc::VideoFrame>*> sources_;
-  VideoOptions options_;
-  int max_bps_;
-};
-
-// Dummy option class, needed for the DataTraits abstraction in
-// channel_unittest.c.
-class DataOptions {};
-
-class FakeDataMediaChannel : public RtpHelper<DataMediaChannel> {
- public:
-  explicit FakeDataMediaChannel(void* unused, const DataOptions& options)
-      : send_blocked_(false), max_bps_(-1) {}
-  ~FakeDataMediaChannel() {}
-  const std::vector<DataCodec>& recv_codecs() const { return recv_codecs_; }
-  const std::vector<DataCodec>& send_codecs() const { return send_codecs_; }
-  const std::vector<DataCodec>& codecs() const { return send_codecs(); }
-  int max_bps() const { return max_bps_; }
-
-  virtual bool SetSendParameters(const DataSendParameters& params) {
-    set_send_rtcp_parameters(params.rtcp);
-    return (SetSendCodecs(params.codecs) &&
-            SetMaxSendBandwidth(params.max_bandwidth_bps));
-  }
-  virtual bool SetRecvParameters(const DataRecvParameters& params) {
-    set_recv_rtcp_parameters(params.rtcp);
-    return SetRecvCodecs(params.codecs);
-  }
-  virtual bool SetSend(bool send) { return set_sending(send); }
-  virtual bool SetReceive(bool receive) {
-    set_playout(receive);
-    return true;
-  }
-  virtual bool AddRecvStream(const StreamParams& sp) {
-    if (!RtpHelper<DataMediaChannel>::AddRecvStream(sp))
-      return false;
-    return true;
-  }
-  virtual bool RemoveRecvStream(uint32_t ssrc) {
-    if (!RtpHelper<DataMediaChannel>::RemoveRecvStream(ssrc))
-      return false;
-    return true;
-  }
-
-  virtual bool SendData(const SendDataParams& params,
-                        const rtc::CopyOnWriteBuffer& payload,
-                        SendDataResult* result) {
-    if (send_blocked_) {
-      *result = SDR_BLOCK;
-      return false;
-    } else {
-      last_sent_data_params_ = params;
-      last_sent_data_ = std::string(payload.data<char>(), payload.size());
-      return true;
-    }
-  }
-
-  SendDataParams last_sent_data_params() { return last_sent_data_params_; }
-  std::string last_sent_data() { return last_sent_data_; }
-  bool is_send_blocked() { return send_blocked_; }
-  void set_send_blocked(bool blocked) { send_blocked_ = blocked; }
-
- private:
-  bool SetRecvCodecs(const std::vector<DataCodec>& codecs) {
-    if (fail_set_recv_codecs()) {
-      // Fake the failure in SetRecvCodecs.
-      return false;
-    }
-    recv_codecs_ = codecs;
-    return true;
-  }
-  bool SetSendCodecs(const std::vector<DataCodec>& codecs) {
-    if (fail_set_send_codecs()) {
-      // Fake the failure in SetSendCodecs.
-      return false;
-    }
-    send_codecs_ = codecs;
-    return true;
-  }
-  bool SetMaxSendBandwidth(int bps) {
-    max_bps_ = bps;
-    return true;
-  }
-
-  std::vector<DataCodec> recv_codecs_;
-  std::vector<DataCodec> send_codecs_;
-  SendDataParams last_sent_data_params_;
-  std::string last_sent_data_;
-  bool send_blocked_;
-  int max_bps_;
-};
-
-// A base class for all of the shared parts between FakeVoiceEngine
-// and FakeVideoEngine.
-class FakeBaseEngine {
- public:
-  FakeBaseEngine()
-      : options_changed_(false),
-        fail_create_channel_(false) {}
-  void set_fail_create_channel(bool fail) { fail_create_channel_ = fail; }
-
-  RtpCapabilities GetCapabilities() const { return capabilities_; }
-  void set_rtp_header_extensions(const std::vector<RtpExtension>& extensions) {
-    capabilities_.header_extensions = extensions;
-  }
-
-  void set_rtp_header_extensions(
-      const std::vector<cricket::RtpHeaderExtension>& extensions) {
-    for (const cricket::RtpHeaderExtension& ext : extensions) {
-      RtpExtension webrtc_ext;
-      webrtc_ext.uri = ext.uri;
-      webrtc_ext.id = ext.id;
-      capabilities_.header_extensions.push_back(webrtc_ext);
-    }
-  }
-
- protected:
-  // Flag used by optionsmessagehandler_unittest for checking whether any
-  // relevant setting has been updated.
-  // TODO(thaloun): Replace with explicit checks of before & after values.
-  bool options_changed_;
-  bool fail_create_channel_;
-  RtpCapabilities capabilities_;
-};
-
-class FakeVoiceEngine : public FakeBaseEngine {
- public:
-  FakeVoiceEngine() {
-    // Add a fake audio codec. Note that the name must not be "" as there are
-    // sanity checks against that.
-    codecs_.push_back(AudioCodec(101, "fake_audio_codec", 0, 0, 1));
-  }
-  void Init() {}
-  rtc::scoped_refptr<webrtc::AudioState> GetAudioState() const {
-    return rtc::scoped_refptr<webrtc::AudioState>();
-  }
-
-  VoiceMediaChannel* CreateChannel(webrtc::Call* call,
-                                   const MediaConfig& config,
-                                   const AudioOptions& options) {
-    if (fail_create_channel_) {
-      return nullptr;
-    }
-
-    FakeVoiceMediaChannel* ch = new FakeVoiceMediaChannel(this, options);
-    channels_.push_back(ch);
-    return ch;
-  }
-  FakeVoiceMediaChannel* GetChannel(size_t index) {
-    return (channels_.size() > index) ? channels_[index] : NULL;
-  }
-  void UnregisterChannel(VoiceMediaChannel* channel) {
-    channels_.erase(std::find(channels_.begin(), channels_.end(), channel));
-  }
-
-  // TODO(ossu): For proper testing, These should either individually settable
-  //             or the voice engine should reference mockable factories.
-  const std::vector<AudioCodec>& send_codecs() { return codecs_; }
-  const std::vector<AudioCodec>& recv_codecs() { return codecs_; }
-  void SetCodecs(const std::vector<AudioCodec>& codecs) { codecs_ = codecs; }
-
-  int GetInputLevel() { return 0; }
-
-  bool StartAecDump(rtc::PlatformFile file, int64_t max_size_bytes) {
-    return false;
-  }
-
-  void StopAecDump() {}
-
-  bool StartRtcEventLog(rtc::PlatformFile file, int64_t max_size_bytes) {
-    return false;
-  }
-
-  void StopRtcEventLog() {}
-
- private:
-  std::vector<FakeVoiceMediaChannel*> channels_;
-  std::vector<AudioCodec> codecs_;
-
-  friend class FakeMediaEngine;
-};
-
-class FakeVideoEngine : public FakeBaseEngine {
- public:
-  FakeVideoEngine() : capture_(false) {
-    // Add a fake video codec. Note that the name must not be "" as there are
-    // sanity checks against that.
-    codecs_.push_back(VideoCodec(0, "fake_video_codec"));
-  }
-
-  bool SetOptions(const VideoOptions& options) {
-    options_ = options;
-    options_changed_ = true;
-    return true;
-  }
-
-  VideoMediaChannel* CreateChannel(webrtc::Call* call,
-                                   const MediaConfig& config,
-                                   const VideoOptions& options) {
-    if (fail_create_channel_) {
-      return nullptr;
-    }
-
-    FakeVideoMediaChannel* ch = new FakeVideoMediaChannel(this, options);
-    channels_.emplace_back(ch);
-    return ch;
-  }
-
-  FakeVideoMediaChannel* GetChannel(size_t index) {
-    return (channels_.size() > index) ? channels_[index] : nullptr;
-  }
-
-  void UnregisterChannel(VideoMediaChannel* channel) {
-    auto it = std::find(channels_.begin(), channels_.end(), channel);
-    RTC_DCHECK(it != channels_.end());
-    channels_.erase(it);
-  }
-
-  const std::vector<VideoCodec>& codecs() const { return codecs_; }
-
-  void SetCodecs(const std::vector<VideoCodec> codecs) { codecs_ = codecs; }
-
-  bool SetCapture(bool capture) {
-    capture_ = capture;
-    return true;
-  }
-
- private:
-  std::vector<FakeVideoMediaChannel*> channels_;
-  std::vector<VideoCodec> codecs_;
-  bool capture_;
-  VideoOptions options_;
-
-  friend class FakeMediaEngine;
-};
-
-class FakeMediaEngine :
-    public CompositeMediaEngine<FakeVoiceEngine, FakeVideoEngine> {
- public:
-  FakeMediaEngine()
-      : CompositeMediaEngine<FakeVoiceEngine, FakeVideoEngine>(std::tuple<>(),
-                                                               std::tuple<>()) {
-  }
-
-  virtual ~FakeMediaEngine() {}
-
-  void SetAudioCodecs(const std::vector<AudioCodec>& codecs) {
-    voice().SetCodecs(codecs);
-  }
-  void SetVideoCodecs(const std::vector<VideoCodec>& codecs) {
-    video().SetCodecs(codecs);
-  }
-
-  void SetAudioRtpHeaderExtensions(
-      const std::vector<RtpExtension>& extensions) {
-    voice().set_rtp_header_extensions(extensions);
-  }
-  void SetVideoRtpHeaderExtensions(
-      const std::vector<RtpExtension>& extensions) {
-    video().set_rtp_header_extensions(extensions);
-  }
-
-  void SetAudioRtpHeaderExtensions(
-      const std::vector<cricket::RtpHeaderExtension>& extensions) {
-    voice().set_rtp_header_extensions(extensions);
-  }
-  void SetVideoRtpHeaderExtensions(
-      const std::vector<cricket::RtpHeaderExtension>& extensions) {
-    video().set_rtp_header_extensions(extensions);
-  }
-
-  FakeVoiceMediaChannel* GetVoiceChannel(size_t index) {
-    return voice().GetChannel(index);
-  }
-  FakeVideoMediaChannel* GetVideoChannel(size_t index) {
-    return video().GetChannel(index);
-  }
-
-  bool capture() const { return video().capture_; }
-  bool options_changed() const { return video().options_changed_; }
-  void clear_options_changed() { video().options_changed_ = false; }
-  void set_fail_create_channel(bool fail) {
-    voice().set_fail_create_channel(fail);
-    video().set_fail_create_channel(fail);
-  }
-};
-
-// Have to come afterwards due to declaration order
-inline FakeVoiceMediaChannel::~FakeVoiceMediaChannel() {
-  if (engine_) {
-    engine_->UnregisterChannel(this);
-  }
-}
-
-inline FakeVideoMediaChannel::~FakeVideoMediaChannel() {
-  if (engine_) {
-    engine_->UnregisterChannel(this);
-  }
-}
-
-class FakeDataEngine : public DataEngineInterface {
- public:
-  FakeDataEngine(){};
-
-  virtual DataMediaChannel* CreateChannel(const MediaConfig& config) {
-    FakeDataMediaChannel* ch = new FakeDataMediaChannel(this, DataOptions());
-    channels_.push_back(ch);
-    return ch;
-  }
-
-  FakeDataMediaChannel* GetChannel(size_t index) {
-    return (channels_.size() > index) ? channels_[index] : NULL;
-  }
-
-  void UnregisterChannel(DataMediaChannel* channel) {
-    channels_.erase(std::find(channels_.begin(), channels_.end(), channel));
-  }
-
-  virtual void SetDataCodecs(const std::vector<DataCodec>& data_codecs) {
-    data_codecs_ = data_codecs;
-  }
-
-  virtual const std::vector<DataCodec>& data_codecs() { return data_codecs_; }
-
- private:
-  std::vector<FakeDataMediaChannel*> channels_;
-  std::vector<DataCodec> data_codecs_;
-};
-
-}  // namespace cricket
-
-#endif  // WEBRTC_MEDIA_BASE_FAKEMEDIAENGINE_H_
diff --git a/media/base/fakenetworkinterface.h b/media/base/fakenetworkinterface.h
deleted file mode 100644
index a6a40ed..0000000
--- a/media/base/fakenetworkinterface.h
+++ /dev/null
@@ -1,227 +0,0 @@
-/*
- *  Copyright (c) 2004 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_MEDIA_BASE_FAKENETWORKINTERFACE_H_
-#define WEBRTC_MEDIA_BASE_FAKENETWORKINTERFACE_H_
-
-#include <map>
-#include <vector>
-
-#include "webrtc/media/base/mediachannel.h"
-#include "webrtc/media/base/rtputils.h"
-#include "webrtc/rtc_base/byteorder.h"
-#include "webrtc/rtc_base/copyonwritebuffer.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/dscp.h"
-#include "webrtc/rtc_base/messagehandler.h"
-#include "webrtc/rtc_base/messagequeue.h"
-#include "webrtc/rtc_base/thread.h"
-
-namespace cricket {
-
-// Fake NetworkInterface that sends/receives RTP/RTCP packets.
-class FakeNetworkInterface : public MediaChannel::NetworkInterface,
-                             public rtc::MessageHandler {
- public:
-  FakeNetworkInterface()
-      : thread_(rtc::Thread::Current()),
-        dest_(NULL),
-        conf_(false),
-        sendbuf_size_(-1),
-        recvbuf_size_(-1),
-        dscp_(rtc::DSCP_NO_CHANGE) {
-  }
-
-  void SetDestination(MediaChannel* dest) { dest_ = dest; }
-
-  // Conference mode is a mode where instead of simply forwarding the packets,
-  // the transport will send multiple copies of the packet with the specified
-  // SSRCs. This allows us to simulate receiving media from multiple sources.
-  void SetConferenceMode(bool conf, const std::vector<uint32_t>& ssrcs) {
-    rtc::CritScope cs(&crit_);
-    conf_ = conf;
-    conf_sent_ssrcs_ = ssrcs;
-  }
-
-  int NumRtpBytes() {
-    rtc::CritScope cs(&crit_);
-    int bytes = 0;
-    for (size_t i = 0; i < rtp_packets_.size(); ++i) {
-      bytes += static_cast<int>(rtp_packets_[i].size());
-    }
-    return bytes;
-  }
-
-  int NumRtpBytes(uint32_t ssrc) {
-    rtc::CritScope cs(&crit_);
-    int bytes = 0;
-    GetNumRtpBytesAndPackets(ssrc, &bytes, NULL);
-    return bytes;
-  }
-
-  int NumRtpPackets() {
-    rtc::CritScope cs(&crit_);
-    return static_cast<int>(rtp_packets_.size());
-  }
-
-  int NumRtpPackets(uint32_t ssrc) {
-    rtc::CritScope cs(&crit_);
-    int packets = 0;
-    GetNumRtpBytesAndPackets(ssrc, NULL, &packets);
-    return packets;
-  }
-
-  int NumSentSsrcs() {
-    rtc::CritScope cs(&crit_);
-    return static_cast<int>(sent_ssrcs_.size());
-  }
-
-  // Note: callers are responsible for deleting the returned buffer.
-  const rtc::CopyOnWriteBuffer* GetRtpPacket(int index) {
-    rtc::CritScope cs(&crit_);
-    if (index >= NumRtpPackets()) {
-      return NULL;
-    }
-    return new rtc::CopyOnWriteBuffer(rtp_packets_[index]);
-  }
-
-  int NumRtcpPackets() {
-    rtc::CritScope cs(&crit_);
-    return static_cast<int>(rtcp_packets_.size());
-  }
-
-  // Note: callers are responsible for deleting the returned buffer.
-  const rtc::CopyOnWriteBuffer* GetRtcpPacket(int index) {
-    rtc::CritScope cs(&crit_);
-    if (index >= NumRtcpPackets()) {
-      return NULL;
-    }
-    return new rtc::CopyOnWriteBuffer(rtcp_packets_[index]);
-  }
-
-  int sendbuf_size() const { return sendbuf_size_; }
-  int recvbuf_size() const { return recvbuf_size_; }
-  rtc::DiffServCodePoint dscp() const { return dscp_; }
-
- protected:
-  virtual bool SendPacket(rtc::CopyOnWriteBuffer* packet,
-                          const rtc::PacketOptions& options) {
-    rtc::CritScope cs(&crit_);
-
-    uint32_t cur_ssrc = 0;
-    if (!GetRtpSsrc(packet->data(), packet->size(), &cur_ssrc)) {
-      return false;
-    }
-    sent_ssrcs_[cur_ssrc]++;
-
-    rtp_packets_.push_back(*packet);
-    if (conf_) {
-      for (size_t i = 0; i < conf_sent_ssrcs_.size(); ++i) {
-        if (!SetRtpSsrc(packet->data(), packet->size(),
-                        conf_sent_ssrcs_[i])) {
-          return false;
-        }
-        PostMessage(ST_RTP, *packet);
-      }
-    } else {
-      PostMessage(ST_RTP, *packet);
-    }
-    return true;
-  }
-
-  virtual bool SendRtcp(rtc::CopyOnWriteBuffer* packet,
-                        const rtc::PacketOptions& options) {
-    rtc::CritScope cs(&crit_);
-    rtcp_packets_.push_back(*packet);
-    if (!conf_) {
-      // don't worry about RTCP in conf mode for now
-      PostMessage(ST_RTCP, *packet);
-    }
-    return true;
-  }
-
-  virtual int SetOption(SocketType type, rtc::Socket::Option opt,
-                        int option) {
-    if (opt == rtc::Socket::OPT_SNDBUF) {
-      sendbuf_size_ = option;
-    } else if (opt == rtc::Socket::OPT_RCVBUF) {
-      recvbuf_size_ = option;
-    } else if (opt == rtc::Socket::OPT_DSCP) {
-      dscp_ = static_cast<rtc::DiffServCodePoint>(option);
-    }
-    return 0;
-  }
-
-  void PostMessage(int id, const rtc::CopyOnWriteBuffer& packet) {
-    thread_->Post(RTC_FROM_HERE, this, id, rtc::WrapMessageData(packet));
-  }
-
-  virtual void OnMessage(rtc::Message* msg) {
-    rtc::TypedMessageData<rtc::CopyOnWriteBuffer>* msg_data =
-        static_cast<rtc::TypedMessageData<rtc::CopyOnWriteBuffer>*>(
-            msg->pdata);
-    if (dest_) {
-      if (msg->message_id == ST_RTP) {
-        dest_->OnPacketReceived(&msg_data->data(),
-                                rtc::CreatePacketTime(0));
-      } else {
-        dest_->OnRtcpReceived(&msg_data->data(),
-                              rtc::CreatePacketTime(0));
-      }
-    }
-    delete msg_data;
-  }
-
- private:
-  void GetNumRtpBytesAndPackets(uint32_t ssrc, int* bytes, int* packets) {
-    if (bytes) {
-      *bytes = 0;
-    }
-    if (packets) {
-      *packets = 0;
-    }
-    uint32_t cur_ssrc = 0;
-    for (size_t i = 0; i < rtp_packets_.size(); ++i) {
-      if (!GetRtpSsrc(rtp_packets_[i].data(), rtp_packets_[i].size(),
-                      &cur_ssrc)) {
-        return;
-      }
-      if (ssrc == cur_ssrc) {
-        if (bytes) {
-          *bytes += static_cast<int>(rtp_packets_[i].size());
-        }
-        if (packets) {
-          ++(*packets);
-        }
-      }
-    }
-  }
-
-  rtc::Thread* thread_;
-  MediaChannel* dest_;
-  bool conf_;
-  // The ssrcs used in sending out packets in conference mode.
-  std::vector<uint32_t> conf_sent_ssrcs_;
-  // Map to track counts of packets that have been sent per ssrc.
-  // This includes packets that are dropped.
-  std::map<uint32_t, uint32_t> sent_ssrcs_;
-  // Map to track packet-number that needs to be dropped per ssrc.
-  std::map<uint32_t, std::set<uint32_t> > drop_map_;
-  rtc::CriticalSection crit_;
-  std::vector<rtc::CopyOnWriteBuffer> rtp_packets_;
-  std::vector<rtc::CopyOnWriteBuffer> rtcp_packets_;
-  int sendbuf_size_;
-  int recvbuf_size_;
-  rtc::DiffServCodePoint dscp_;
-};
-
-}  // namespace cricket
-
-#endif  // WEBRTC_MEDIA_BASE_FAKENETWORKINTERFACE_H_
diff --git a/media/base/fakertp.cc b/media/base/fakertp.cc
deleted file mode 100644
index 1c67d87..0000000
--- a/media/base/fakertp.cc
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- *  Copyright (c) 2017 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 <algorithm>
-
-#include "webrtc/media/base/fakertp.h"
-#include "webrtc/rtc_base/gunit.h"
-
-void CompareHeaderExtensions(const char* packet1, size_t packet1_size,
-    const char* packet2, size_t packet2_size,
-    const std::vector<int> encrypted_headers, bool expect_equal) {
-  // Sanity check: packets must be large enough to contain the RTP header and
-  // extensions header.
-  RTC_CHECK_GE(packet1_size, 12 + 4);
-  RTC_CHECK_GE(packet2_size, 12 + 4);
-  // RTP extension headers are the same.
-  EXPECT_EQ(0, memcmp(packet1 + 12, packet2 + 12, 4));
-  // Check for one-byte header extensions.
-  EXPECT_EQ('\xBE', packet1[12]);
-  EXPECT_EQ('\xDE', packet1[13]);
-  // Determine position and size of extension headers.
-  size_t extension_words = packet1[14] << 8 | packet1[15];
-  const char* extension_data1 = packet1 + 12 + 4;
-  const char* extension_end1 = extension_data1 + extension_words * 4;
-  const char* extension_data2 = packet2 + 12 + 4;
-  // Sanity check: packets must be large enough to contain the RTP header
-  // extensions.
-  RTC_CHECK_GE(packet1_size, 12 + 4 + extension_words * 4);
-  RTC_CHECK_GE(packet2_size, 12 + 4 + extension_words * 4);
-  while (extension_data1 < extension_end1) {
-    uint8_t id = (*extension_data1 & 0xf0) >> 4;
-    uint8_t len = (*extension_data1 & 0x0f) +1;
-    extension_data1++;
-    extension_data2++;
-    EXPECT_LE(extension_data1, extension_end1);
-    if (id == 15) {
-      // Finished parsing.
-      break;
-    }
-
-    // The header extension doesn't get encrypted if the id is not in the
-    // list of header extensions to encrypt.
-    if (expect_equal ||
-        std::find(encrypted_headers.begin(), encrypted_headers.end(), id)
-            == encrypted_headers.end()) {
-      EXPECT_EQ(0, memcmp(extension_data1, extension_data2, len));
-    } else {
-      EXPECT_NE(0, memcmp(extension_data1, extension_data2, len));
-    }
-
-    extension_data1 += len;
-    extension_data2 += len;
-    // Skip padding.
-    while (extension_data1 < extension_end1 && *extension_data1 == 0) {
-      extension_data1++;
-      extension_data2++;
-    }
-  }
-}
diff --git a/media/base/fakertp.h b/media/base/fakertp.h
deleted file mode 100644
index 88419a5..0000000
--- a/media/base/fakertp.h
+++ /dev/null
@@ -1,138 +0,0 @@
-/*
- *  Copyright (c) 2004 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.
- */
-
-// Fake RTP and RTCP packets to use in unit tests.
-
-#ifndef WEBRTC_MEDIA_BASE_FAKERTP_H_
-#define WEBRTC_MEDIA_BASE_FAKERTP_H_
-
-#include <vector>
-
-// A typical PCMU RTP packet.
-// PT=0, SN=1, TS=0, SSRC=1
-// all data FF
-static const unsigned char kPcmuFrame[] = {
-  0x80, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
-  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-};
-
-// A typical PCMU RTP packet with header extensions.
-// PT=0, SN=1, TS=0, SSRC=1
-// all data FF
-static const unsigned char kPcmuFrameWithExtensions[] = {
-  0x90, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
-  // RFC 5285, section 4.2. One-Byte Header.
-  0xBE, 0xDE,
-  // Header extension length 6 * 32 bits.
-  0x00, 0x06,
-  // 8 bytes header id 1.
-  0x17, 0x41, 0x42, 0x73, 0xA4, 0x75, 0x26, 0x27, 0x48,
-  // 3 bytes header id 2.
-  0x22, 0x00, 0x00, 0xC8,
-  // 1 byte header id 3.
-  0x30, 0x8E,
-  // 7 bytes header id 4.
-  0x46, 0x55, 0x99, 0x63, 0x86, 0xB3, 0x95, 0xFB,
-  // 1 byte header padding.
-  0x00,
-  // Payload data.
-  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-};
-
-// A typical Receiver Report RTCP packet.
-// PT=RR, LN=1, SSRC=1
-// send SSRC=2, all other fields 0
-static const unsigned char kRtcpReport[] = {
-  0x80, 0xc9, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01,
-  0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
-};
-
-// PT = 97, TS = 0, Seq = 1, SSRC = 2
-// H264 - NRI = 1, Type = 1, bit stream = FF
-
-static const unsigned char kH264Packet[] = {
-  0x80, 0x61, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02,
-  0x21, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-  0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
-};
-
-// PT= 101, SN=2, TS=3, SSRC = 4
-static const unsigned char kDataPacket[] = {
-  0x80, 0x65, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04,
-  0x00, 0x00, 0x00, 0x00,
-  0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
-};
-
-// This expects both packets to be based on kPcmuFrameWithExtensions.
-// Header extensions with an id in "encrypted_headers" are expected to be
-// different in the packets unless "expect_equal" is set to "true".
-void CompareHeaderExtensions(const char* packet1, size_t packet1_size,
-    const char* packet2, size_t packet2_size,
-    const std::vector<int> encrypted_headers, bool expect_equal);
-
-#endif  // WEBRTC_MEDIA_BASE_FAKERTP_H_
diff --git a/media/base/fakevideocapturer.h b/media/base/fakevideocapturer.h
deleted file mode 100644
index f5148df..0000000
--- a/media/base/fakevideocapturer.h
+++ /dev/null
@@ -1,152 +0,0 @@
-/*
- *  Copyright (c) 2004 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_MEDIA_BASE_FAKEVIDEOCAPTURER_H_
-#define WEBRTC_MEDIA_BASE_FAKEVIDEOCAPTURER_H_
-
-#include <string.h>
-
-#include <memory>
-#include <vector>
-
-#include "webrtc/api/video/i420_buffer.h"
-#include "webrtc/api/video/video_frame.h"
-#include "webrtc/media/base/videocapturer.h"
-#include "webrtc/media/base/videocommon.h"
-#include "webrtc/rtc_base/timeutils.h"
-
-namespace cricket {
-
-// Fake video capturer that allows the test to manually pump in frames.
-class FakeVideoCapturer : public cricket::VideoCapturer {
- public:
-  explicit FakeVideoCapturer(bool is_screencast)
-      : running_(false),
-        initial_timestamp_(rtc::TimeNanos()),
-        next_timestamp_(rtc::kNumNanosecsPerMillisec),
-        is_screencast_(is_screencast),
-        rotation_(webrtc::kVideoRotation_0) {
-    // Default supported formats. Use ResetSupportedFormats to over write.
-    std::vector<cricket::VideoFormat> formats;
-    formats.push_back(cricket::VideoFormat(1280, 720,
-        cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420));
-    formats.push_back(cricket::VideoFormat(640, 480,
-        cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420));
-    formats.push_back(cricket::VideoFormat(320, 240,
-        cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420));
-    formats.push_back(cricket::VideoFormat(160, 120,
-        cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420));
-    formats.push_back(cricket::VideoFormat(1280, 720,
-        cricket::VideoFormat::FpsToInterval(60), cricket::FOURCC_I420));
-    ResetSupportedFormats(formats);
-  }
-  FakeVideoCapturer() : FakeVideoCapturer(false) {}
-
-  ~FakeVideoCapturer() {
-    SignalDestroyed(this);
-  }
-
-  void ResetSupportedFormats(const std::vector<cricket::VideoFormat>& formats) {
-    SetSupportedFormats(formats);
-  }
-  bool CaptureFrame() {
-    if (!GetCaptureFormat()) {
-      return false;
-    }
-    return CaptureCustomFrame(GetCaptureFormat()->width,
-                              GetCaptureFormat()->height,
-                              GetCaptureFormat()->interval,
-                              GetCaptureFormat()->fourcc);
-  }
-  bool CaptureCustomFrame(int width, int height, uint32_t fourcc) {
-    // Default to 30fps.
-    return CaptureCustomFrame(width, height, rtc::kNumNanosecsPerSec / 30,
-                              fourcc);
-  }
-  bool CaptureCustomFrame(int width,
-                          int height,
-                          int64_t timestamp_interval,
-                          uint32_t fourcc) {
-    if (!running_) {
-      return false;
-    }
-    RTC_CHECK(fourcc == FOURCC_I420);
-    RTC_CHECK(width > 0);
-    RTC_CHECK(height > 0);
-
-    int adapted_width;
-    int adapted_height;
-    int crop_width;
-    int crop_height;
-    int crop_x;
-    int crop_y;
-
-    // TODO(nisse): It's a bit silly to have this logic in a fake
-    // class. Child classes of VideoCapturer are expected to call
-    // AdaptFrame, and the test case
-    // VideoCapturerTest.SinkWantsMaxPixelAndMaxPixelCountStepUp
-    // depends on this.
-    if (AdaptFrame(width, height,
-                   next_timestamp_ / rtc::kNumNanosecsPerMicrosec,
-                   next_timestamp_ / rtc::kNumNanosecsPerMicrosec,
-                   &adapted_width, &adapted_height, &crop_width, &crop_height,
-                   &crop_x, &crop_y, nullptr)) {
-      rtc::scoped_refptr<webrtc::I420Buffer> buffer(
-          webrtc::I420Buffer::Create(adapted_width, adapted_height));
-      buffer->InitializeData();
-
-      OnFrame(webrtc::VideoFrame(
-                  buffer, rotation_,
-                  next_timestamp_ / rtc::kNumNanosecsPerMicrosec),
-              width, height);
-    }
-    next_timestamp_ += timestamp_interval;
-
-    return true;
-  }
-
-  sigslot::signal1<FakeVideoCapturer*> SignalDestroyed;
-
-  cricket::CaptureState Start(const cricket::VideoFormat& format) override {
-    SetCaptureFormat(&format);
-    running_ = true;
-    SetCaptureState(cricket::CS_RUNNING);
-    return cricket::CS_RUNNING;
-  }
-  void Stop() override {
-    running_ = false;
-    SetCaptureFormat(NULL);
-    SetCaptureState(cricket::CS_STOPPED);
-  }
-  bool IsRunning() override { return running_; }
-  bool IsScreencast() const override { return is_screencast_; }
-  bool GetPreferredFourccs(std::vector<uint32_t>* fourccs) override {
-    fourccs->push_back(cricket::FOURCC_I420);
-    fourccs->push_back(cricket::FOURCC_MJPG);
-    return true;
-  }
-
-  void SetRotation(webrtc::VideoRotation rotation) {
-    rotation_ = rotation;
-  }
-
-  webrtc::VideoRotation GetRotation() { return rotation_; }
-
- private:
-  bool running_;
-  int64_t initial_timestamp_;
-  int64_t next_timestamp_;
-  const bool is_screencast_;
-  webrtc::VideoRotation rotation_;
-};
-
-}  // namespace cricket
-
-#endif  // WEBRTC_MEDIA_BASE_FAKEVIDEOCAPTURER_H_
diff --git a/media/base/fakevideorenderer.h b/media/base/fakevideorenderer.h
deleted file mode 100644
index a6753d2..0000000
--- a/media/base/fakevideorenderer.h
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- *  Copyright (c) 2011 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_MEDIA_BASE_FAKEVIDEORENDERER_H_
-#define WEBRTC_MEDIA_BASE_FAKEVIDEORENDERER_H_
-
-#include "webrtc/api/video/video_frame.h"
-#include "webrtc/media/base/videosinkinterface.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/logging.h"
-
-namespace cricket {
-
-// Faked video renderer that has a callback for actions on rendering.
-class FakeVideoRenderer : public rtc::VideoSinkInterface<webrtc::VideoFrame> {
- public:
-  FakeVideoRenderer()
-      : errors_(0),
-        width_(0),
-        height_(0),
-        rotation_(webrtc::kVideoRotation_0),
-        timestamp_us_(0),
-        num_rendered_frames_(0),
-        black_frame_(false) {}
-
-  virtual void OnFrame(const webrtc::VideoFrame& frame) {
-    rtc::CritScope cs(&crit_);
-    // TODO(zhurunz) Check with VP8 team to see if we can remove this
-    // tolerance on Y values. Some unit tests produce Y values close
-    // to 16 rather than close to zero, for supposedly black frames.
-    // Largest value observed is 34, e.g., running
-    // PeerConnectionIntegrationTest.SendAndReceive16To9AspectRatio.
-    black_frame_ = CheckFrameColorYuv(0, 48, 128, 128, 128, 128, &frame);
-    // Treat unexpected frame size as error.
-    ++num_rendered_frames_;
-    width_ = frame.width();
-    height_ = frame.height();
-    rotation_ = frame.rotation();
-    timestamp_us_ = frame.timestamp_us();
-  }
-
-  int errors() const { return errors_; }
-  int width() const {
-    rtc::CritScope cs(&crit_);
-    return width_;
-  }
-  int height() const {
-    rtc::CritScope cs(&crit_);
-    return height_;
-  }
-  webrtc::VideoRotation rotation() const {
-    rtc::CritScope cs(&crit_);
-    return rotation_;
-  }
-
-  int64_t timestamp_us() const {
-    rtc::CritScope cs(&crit_);
-    return timestamp_us_;
-  }
-  int num_rendered_frames() const {
-    rtc::CritScope cs(&crit_);
-    return num_rendered_frames_;
-  }
-  bool black_frame() const {
-    rtc::CritScope cs(&crit_);
-    return black_frame_;
-  }
-
- private:
-  static bool CheckFrameColorYuv(uint8_t y_min,
-                                 uint8_t y_max,
-                                 uint8_t u_min,
-                                 uint8_t u_max,
-                                 uint8_t v_min,
-                                 uint8_t v_max,
-                                 const webrtc::VideoFrame* frame) {
-    if (!frame || !frame->video_frame_buffer()) {
-      return false;
-    }
-    rtc::scoped_refptr<const webrtc::I420BufferInterface> i420_buffer =
-        frame->video_frame_buffer()->ToI420();
-    // Y
-    int y_width = frame->width();
-    int y_height = frame->height();
-    const uint8_t* y_plane = i420_buffer->DataY();
-    const uint8_t* y_pos = y_plane;
-    int32_t y_pitch = i420_buffer->StrideY();
-    for (int i = 0; i < y_height; ++i) {
-      for (int j = 0; j < y_width; ++j) {
-        uint8_t y_value = *(y_pos + j);
-        if (y_value < y_min || y_value > y_max) {
-          return false;
-        }
-      }
-      y_pos += y_pitch;
-    }
-    // U and V
-    int chroma_width = i420_buffer->ChromaWidth();
-    int chroma_height = i420_buffer->ChromaHeight();
-    const uint8_t* u_plane = i420_buffer->DataU();
-    const uint8_t* v_plane = i420_buffer->DataV();
-    const uint8_t* u_pos = u_plane;
-    const uint8_t* v_pos = v_plane;
-    int32_t u_pitch = i420_buffer->StrideU();
-    int32_t v_pitch = i420_buffer->StrideV();
-    for (int i = 0; i < chroma_height; ++i) {
-      for (int j = 0; j < chroma_width; ++j) {
-        uint8_t u_value = *(u_pos + j);
-        if (u_value < u_min || u_value > u_max) {
-          return false;
-        }
-        uint8_t v_value = *(v_pos + j);
-        if (v_value < v_min || v_value > v_max) {
-          return false;
-        }
-      }
-      u_pos += u_pitch;
-      v_pos += v_pitch;
-    }
-    return true;
-  }
-
-  int errors_;
-  int width_;
-  int height_;
-  webrtc::VideoRotation rotation_;
-  int64_t timestamp_us_;
-  int num_rendered_frames_;
-  bool black_frame_;
-  rtc::CriticalSection crit_;
-};
-
-}  // namespace cricket
-
-#endif  // WEBRTC_MEDIA_BASE_FAKEVIDEORENDERER_H_
diff --git a/media/base/h264_profile_level_id.cc b/media/base/h264_profile_level_id.cc
deleted file mode 100644
index 3f43a30..0000000
--- a/media/base/h264_profile_level_id.cc
+++ /dev/null
@@ -1,299 +0,0 @@
-/*
- *  Copyright (c) 2017 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/media/base/h264_profile_level_id.h"
-
-#include <cstdio>
-#include <cstdlib>
-#include <cstring>
-
-#include "webrtc/rtc_base/arraysize.h"
-
-namespace webrtc {
-namespace H264 {
-
-namespace {
-
-const char kProfileLevelId[] = "profile-level-id";
-const char kLevelAsymmetryAllowed[] = "level-asymmetry-allowed";
-
-// For level_idc=11 and profile_idc=0x42, 0x4D, or 0x58, the constraint set3
-// flag specifies if level 1b or level 1.1 is used.
-const uint8_t kConstraintSet3Flag = 0x10;
-
-// Convert a string of 8 characters into a byte where the positions containing
-// character c will have their bit set. For example, c = 'x', str = "x1xx0000"
-// will return 0b10110000. constexpr is used so that the pattern table in
-// kProfilePatterns is statically initialized.
-constexpr uint8_t ByteMaskString(char c, const char (&str)[9]) {
-  return (str[0] == c) << 7 | (str[1] == c) << 6 | (str[2] == c) << 5 |
-         (str[3] == c) << 4 | (str[4] == c) << 3 | (str[5] == c) << 2 |
-         (str[6] == c) << 1 | (str[7] == c) << 0;
-}
-
-// Class for matching bit patterns such as "x1xx0000" where 'x' is allowed to be
-// either 0 or 1.
-class BitPattern {
- public:
-  explicit constexpr BitPattern(const char (&str)[9])
-      : mask_(~ByteMaskString('x', str)),
-        masked_value_(ByteMaskString('1', str)) {}
-
-  bool IsMatch(uint8_t value) const { return masked_value_ == (value & mask_); }
-
- private:
-  const uint8_t mask_;
-  const uint8_t masked_value_;
-};
-
-// Table for converting between profile_idc/profile_iop to H264::Profile.
-struct ProfilePattern {
-  const uint8_t profile_idc;
-  const BitPattern profile_iop;
-  const Profile profile;
-};
-
-// This is from https://tools.ietf.org/html/rfc6184#section-8.1.
-constexpr ProfilePattern kProfilePatterns[] = {
-    {0x42, BitPattern("x1xx0000"), kProfileConstrainedBaseline},
-    {0x4D, BitPattern("1xxx0000"), kProfileConstrainedBaseline},
-    {0x58, BitPattern("11xx0000"), kProfileConstrainedBaseline},
-    {0x42, BitPattern("x0xx0000"), kProfileBaseline},
-    {0x58, BitPattern("10xx0000"), kProfileBaseline},
-    {0x4D, BitPattern("0x0x0000"), kProfileMain},
-    {0x64, BitPattern("00000000"), kProfileHigh},
-    {0x64, BitPattern("00001100"), kProfileConstrainedHigh}};
-
-// Compare H264 levels and handle the level 1b case.
-bool IsLess(Level a, Level b) {
-  if (a == kLevel1_b)
-    return b != kLevel1 && b != kLevel1_b;
-  if (b == kLevel1_b)
-    return a == kLevel1;
-  return a < b;
-}
-
-Level Min(Level a, Level b) {
-  return IsLess(a, b) ? a : b;
-}
-
-bool IsLevelAsymmetryAllowed(const CodecParameterMap& params) {
-  const auto it = params.find(kLevelAsymmetryAllowed);
-  return it != params.end() && strcmp(it->second.c_str(), "1") == 0;
-}
-
-struct LevelConstraint {
-  const int max_macroblocks_per_second;
-  const int max_macroblock_frame_size;
-  const webrtc::H264::Level level;
-};
-
-// This is from ITU-T H.264 (02/2016) Table A-1 – Level limits.
-static constexpr LevelConstraint kLevelConstraints[] = {
-    {1485, 99, webrtc::H264::kLevel1},
-    {1485, 99, webrtc::H264::kLevel1_b},
-    {3000, 396, webrtc::H264::kLevel1_1},
-    {6000, 396, webrtc::H264::kLevel1_2},
-    {11880, 396, webrtc::H264::kLevel1_3},
-    {11880, 396, webrtc::H264::kLevel2},
-    {19800, 792, webrtc::H264::kLevel2_1},
-    {20250, 1620, webrtc::H264::kLevel2_2},
-    {40500, 1620, webrtc::H264::kLevel3},
-    {108000, 3600, webrtc::H264::kLevel3_1},
-    {216000, 5120, webrtc::H264::kLevel3_2},
-    {245760, 8192, webrtc::H264::kLevel4},
-    {245760, 8192, webrtc::H264::kLevel4_1},
-    {522240, 8704, webrtc::H264::kLevel4_2},
-    {589824, 22080, webrtc::H264::kLevel5},
-    {983040, 3684, webrtc::H264::kLevel5_1},
-    {2073600, 3684, webrtc::H264::kLevel5_2},
-};
-
-}  // anonymous namespace
-
-rtc::Optional<ProfileLevelId> ParseProfileLevelId(const char* str) {
-  // The string should consist of 3 bytes in hexadecimal format.
-  if (strlen(str) != 6u)
-    return rtc::Optional<ProfileLevelId>();
-  const uint32_t profile_level_id_numeric = strtol(str, nullptr, 16);
-  if (profile_level_id_numeric == 0)
-    return rtc::Optional<ProfileLevelId>();
-
-  // Separate into three bytes.
-  const uint8_t level_idc =
-      static_cast<uint8_t>(profile_level_id_numeric & 0xFF);
-  const uint8_t profile_iop =
-      static_cast<uint8_t>((profile_level_id_numeric >> 8) & 0xFF);
-  const uint8_t profile_idc =
-      static_cast<uint8_t>((profile_level_id_numeric >> 16) & 0xFF);
-
-  // Parse level based on level_idc and constraint set 3 flag.
-  Level level;
-  switch (level_idc) {
-    case kLevel1_1:
-      level = (profile_iop & kConstraintSet3Flag) != 0 ? kLevel1_b : kLevel1_1;
-      break;
-    case kLevel1:
-    case kLevel1_2:
-    case kLevel1_3:
-    case kLevel2:
-    case kLevel2_1:
-    case kLevel2_2:
-    case kLevel3:
-    case kLevel3_1:
-    case kLevel3_2:
-    case kLevel4:
-    case kLevel4_1:
-    case kLevel4_2:
-    case kLevel5:
-    case kLevel5_1:
-    case kLevel5_2:
-      level = static_cast<Level>(level_idc);
-      break;
-    default:
-      // Unrecognized level_idc.
-      return rtc::Optional<ProfileLevelId>();
-  }
-
-  // Parse profile_idc/profile_iop into a Profile enum.
-  for (const ProfilePattern& pattern : kProfilePatterns) {
-    if (profile_idc == pattern.profile_idc &&
-        pattern.profile_iop.IsMatch(profile_iop)) {
-      return rtc::Optional<ProfileLevelId>({pattern.profile, level});
-    }
-  }
-
-  // Unrecognized profile_idc/profile_iop combination.
-  return rtc::Optional<ProfileLevelId>();
-}
-
-rtc::Optional<Level> SupportedLevel(int max_frame_pixel_count, float max_fps) {
-  static const int kPixelsPerMacroblock = 16 * 16;
-
-  for (int i = arraysize(kLevelConstraints) - 1; i >= 0; --i) {
-    const LevelConstraint& level_constraint = kLevelConstraints[i];
-    if (level_constraint.max_macroblock_frame_size * kPixelsPerMacroblock <=
-            max_frame_pixel_count &&
-        level_constraint.max_macroblocks_per_second <=
-            max_fps * level_constraint.max_macroblock_frame_size) {
-      return rtc::Optional<Level>(level_constraint.level);
-    }
-  }
-
-  // No level supported.
-  return rtc::Optional<Level>();
-}
-
-rtc::Optional<ProfileLevelId> ParseSdpProfileLevelId(
-    const CodecParameterMap& params) {
-  // TODO(magjed): The default should really be kProfileBaseline and kLevel1
-  // according to the spec: https://tools.ietf.org/html/rfc6184#section-8.1. In
-  // order to not break backwards compatibility with older versions of WebRTC
-  // where external codecs don't have any parameters, use
-  // kProfileConstrainedBaseline kLevel3_1 instead. This workaround will only be
-  // done in an interim period to allow external clients to update their code.
-  // http://crbug/webrtc/6337.
-  static const ProfileLevelId kDefaultProfileLevelId(
-      kProfileConstrainedBaseline, kLevel3_1);
-
-  const auto profile_level_id_it = params.find(kProfileLevelId);
-  return (profile_level_id_it == params.end())
-             ? rtc::Optional<ProfileLevelId>(kDefaultProfileLevelId)
-             : ParseProfileLevelId(profile_level_id_it->second.c_str());
-}
-
-rtc::Optional<std::string> ProfileLevelIdToString(
-    const ProfileLevelId& profile_level_id) {
-  // Handle special case level == 1b.
-  if (profile_level_id.level == kLevel1_b) {
-    switch (profile_level_id.profile) {
-      case kProfileConstrainedBaseline:
-        return rtc::Optional<std::string>("42f00b");
-      case kProfileBaseline:
-        return rtc::Optional<std::string>("42100b");
-      case kProfileMain:
-        return rtc::Optional<std::string>("4d100b");
-      // Level 1b is not allowed for other profiles.
-      default:
-        return rtc::Optional<std::string>();
-    }
-  }
-
-  const char* profile_idc_iop_string;
-  switch (profile_level_id.profile) {
-    case kProfileConstrainedBaseline:
-      profile_idc_iop_string = "42e0";
-      break;
-    case kProfileBaseline:
-      profile_idc_iop_string = "4200";
-      break;
-    case kProfileMain:
-      profile_idc_iop_string = "4d00";
-      break;
-    case kProfileConstrainedHigh:
-      profile_idc_iop_string = "640c";
-      break;
-    case kProfileHigh:
-      profile_idc_iop_string = "6400";
-      break;
-    // Unrecognized profile.
-    default:
-      return rtc::Optional<std::string>();
-  }
-
-  char str[7];
-  snprintf(str, 7u, "%s%02x", profile_idc_iop_string, profile_level_id.level);
-  return rtc::Optional<std::string>(str);
-}
-
-// Set level according to https://tools.ietf.org/html/rfc6184#section-8.2.2.
-void GenerateProfileLevelIdForAnswer(
-    const CodecParameterMap& local_supported_params,
-    const CodecParameterMap& remote_offered_params,
-    CodecParameterMap* answer_params) {
-  // If both local and remote haven't set profile-level-id, they are both using
-  // the default profile. In this case, don't set profile-level-id in answer
-  // either.
-  if (!local_supported_params.count(kProfileLevelId) &&
-      !remote_offered_params.count(kProfileLevelId)) {
-    return;
-  }
-
-  // Parse profile-level-ids.
-  const rtc::Optional<ProfileLevelId> local_profile_level_id =
-      ParseSdpProfileLevelId(local_supported_params);
-  const rtc::Optional<ProfileLevelId> remote_profile_level_id =
-      ParseSdpProfileLevelId(remote_offered_params);
-  // The local and remote codec must have valid and equal H264 Profiles.
-  RTC_DCHECK(local_profile_level_id);
-  RTC_DCHECK(remote_profile_level_id);
-  RTC_DCHECK_EQ(local_profile_level_id->profile,
-                remote_profile_level_id->profile);
-
-  // Parse level information.
-  const bool level_asymmetry_allowed =
-      IsLevelAsymmetryAllowed(local_supported_params) &&
-      IsLevelAsymmetryAllowed(remote_offered_params);
-  const Level local_level = local_profile_level_id->level;
-  const Level remote_level = remote_profile_level_id->level;
-  const Level min_level = Min(local_level, remote_level);
-
-  // Determine answer level. When level asymmetry is not allowed, level upgrade
-  // is not allowed, i.e., the level in the answer must be equal to or lower
-  // than the level in the offer.
-  const Level answer_level = level_asymmetry_allowed ? local_level : min_level;
-
-  // Set the resulting profile-level-id in the answer parameters.
-  (*answer_params)[kProfileLevelId] = *ProfileLevelIdToString(
-      ProfileLevelId(local_profile_level_id->profile, answer_level));
-}
-
-}  // namespace H264
-}  // namespace webrtc
diff --git a/media/base/h264_profile_level_id.h b/media/base/h264_profile_level_id.h
deleted file mode 100644
index acbb84e..0000000
--- a/media/base/h264_profile_level_id.h
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- *  Copyright (c) 2017 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_MEDIA_BASE_H264_PROFILE_LEVEL_ID_H_
-#define WEBRTC_MEDIA_BASE_H264_PROFILE_LEVEL_ID_H_
-
-#include <map>
-#include <string>
-
-#include "webrtc/api/optional.h"
-#include "webrtc/common_types.h"
-
-namespace webrtc {
-namespace H264 {
-
-// Map containting SDP codec parameters.
-typedef std::map<std::string, std::string> CodecParameterMap;
-
-// All values are equal to ten times the level number, except level 1b which is
-// special.
-enum Level {
-  kLevel1_b = 0,
-  kLevel1 = 10,
-  kLevel1_1 = 11,
-  kLevel1_2 = 12,
-  kLevel1_3 = 13,
-  kLevel2 = 20,
-  kLevel2_1 = 21,
-  kLevel2_2 = 22,
-  kLevel3 = 30,
-  kLevel3_1 = 31,
-  kLevel3_2 = 32,
-  kLevel4 = 40,
-  kLevel4_1 = 41,
-  kLevel4_2 = 42,
-  kLevel5 = 50,
-  kLevel5_1 = 51,
-  kLevel5_2 = 52
-};
-
-struct ProfileLevelId {
-  ProfileLevelId(Profile profile, Level level)
-      : profile(profile), level(level) {}
-  Profile profile;
-  Level level;
-};
-
-// Parse profile level id that is represented as a string of 3 hex bytes.
-// Nothing will be returned if the string is not a recognized H264
-// profile level id.
-rtc::Optional<ProfileLevelId> ParseProfileLevelId(const char* str);
-
-// Parse profile level id that is represented as a string of 3 hex bytes
-// contained in an SDP key-value map. A default profile level id will be
-// returned if the profile-level-id key is missing. Nothing will be returned if
-// the key is present but the string is invalid.
-rtc::Optional<ProfileLevelId> ParseSdpProfileLevelId(
-    const CodecParameterMap& params);
-
-// Given that a decoder supports up to a given frame size (in pixels) at up to a
-// given number of frames per second, return the highest H.264 level where it
-// can guarantee that it will be able to support all valid encoded streams that
-// are within that level.
-rtc::Optional<Level> SupportedLevel(int max_frame_pixel_count, float max_fps);
-
-// Returns canonical string representation as three hex bytes of the profile
-// level id, or returns nothing for invalid profile level ids.
-rtc::Optional<std::string> ProfileLevelIdToString(
-    const ProfileLevelId& profile_level_id);
-
-// Generate codec parameters that will be used as answer in an SDP negotiation
-// based on local supported parameters and remote offered parameters. Both
-// |local_supported_params|, |remote_offered_params|, and |answer_params|
-// represent sendrecv media descriptions, i.e they are a mix of both encode and
-// decode capabilities. In theory, when the profile in |local_supported_params|
-// represent a strict superset of the profile in |remote_offered_params|, we
-// could limit the profile in |answer_params| to the profile in
-// |remote_offered_params|. However, to simplify the code, each supported H264
-// profile should be listed explicitly in the list of local supported codecs,
-// even if they are redundant. Then each local codec in the list should be
-// tested one at a time against the remote codec, and only when the profiles are
-// equal should this function be called. Therefore, this function does not need
-// to handle profile intersection, and the profile of |local_supported_params|
-// and |remote_offered_params| must be equal before calling this function. The
-// parameters that are used when negotiating are the level part of
-// profile-level-id and level-asymmetry-allowed.
-void GenerateProfileLevelIdForAnswer(
-    const CodecParameterMap& local_supported_params,
-    const CodecParameterMap& remote_offered_params,
-    CodecParameterMap* answer_params);
-
-}  // namespace H264
-}  // namespace webrtc
-
-#endif  // WEBRTC_MEDIA_BASE_H264_PROFILE_LEVEL_ID_H_
diff --git a/media/base/mediachannel.h b/media/base/mediachannel.h
deleted file mode 100644
index 7e7b815..0000000
--- a/media/base/mediachannel.h
+++ /dev/null
@@ -1,1257 +0,0 @@
-/*
- *  Copyright (c) 2004 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_MEDIA_BASE_MEDIACHANNEL_H_
-#define WEBRTC_MEDIA_BASE_MEDIACHANNEL_H_
-
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "webrtc/api/audio_codecs/audio_encoder.h"
-#include "webrtc/api/optional.h"
-#include "webrtc/api/rtpparameters.h"
-#include "webrtc/api/rtpreceiverinterface.h"
-#include "webrtc/api/video/video_timing.h"
-#include "webrtc/call/video_config.h"
-#include "webrtc/media/base/codec.h"
-#include "webrtc/media/base/mediaconstants.h"
-#include "webrtc/media/base/streamparams.h"
-#include "webrtc/media/base/videosinkinterface.h"
-#include "webrtc/media/base/videosourceinterface.h"
-#include "webrtc/rtc_base/basictypes.h"
-#include "webrtc/rtc_base/buffer.h"
-#include "webrtc/rtc_base/copyonwritebuffer.h"
-#include "webrtc/rtc_base/dscp.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/networkroute.h"
-#include "webrtc/rtc_base/sigslot.h"
-#include "webrtc/rtc_base/socket.h"
-#include "webrtc/rtc_base/window.h"
-// TODO(juberti): re-evaluate this include
-#include "webrtc/pc/audiomonitor.h"
-
-namespace rtc {
-class RateLimiter;
-class Timing;
-}
-
-namespace webrtc {
-class AudioSinkInterface;
-class VideoFrame;
-}
-
-namespace cricket {
-
-class AudioSource;
-class VideoCapturer;
-struct RtpHeader;
-struct VideoFormat;
-
-const int kScreencastDefaultFps = 5;
-
-template <class T>
-static std::string ToStringIfSet(const char* key, const rtc::Optional<T>& val) {
-  std::string str;
-  if (val) {
-    str = key;
-    str += ": ";
-    str += val ? rtc::ToString(*val) : "";
-    str += ", ";
-  }
-  return str;
-}
-
-template <class T>
-static std::string VectorToString(const std::vector<T>& vals) {
-    std::ostringstream ost;
-    ost << "[";
-    for (size_t i = 0; i < vals.size(); ++i) {
-      if (i > 0) {
-        ost << ", ";
-      }
-      ost << vals[i].ToString();
-    }
-    ost << "]";
-    return ost.str();
-}
-
-// Construction-time settings, passed on when creating
-// MediaChannels.
-struct MediaConfig {
-  // Set DSCP value on packets. This flag comes from the
-  // PeerConnection constraint 'googDscp'.
-  bool enable_dscp = false;
-
-  // Video-specific config.
-  struct Video {
-    // Enable WebRTC CPU Overuse Detection. This flag comes from the
-    // PeerConnection constraint 'googCpuOveruseDetection'.
-    bool enable_cpu_overuse_detection = true;
-
-    // Enable WebRTC suspension of video. No video frames will be sent
-    // when the bitrate is below the configured minimum bitrate. This
-    // flag comes from the PeerConnection constraint
-    // 'googSuspendBelowMinBitrate', and WebRtcVideoChannel copies it
-    // to VideoSendStream::Config::suspend_below_min_bitrate.
-    bool suspend_below_min_bitrate = false;
-
-    // Set to true if the renderer has an algorithm of frame selection.
-    // If the value is true, then WebRTC will hand over a frame as soon as
-    // possible without delay, and rendering smoothness is completely the duty
-    // of the renderer;
-    // If the value is false, then WebRTC is responsible to delay frame release
-    // in order to increase rendering smoothness.
-    //
-    // This flag comes from PeerConnection's RtcConfiguration, but is
-    // currently only set by the command line flag
-    // 'disable-rtc-smoothness-algorithm'.
-    // WebRtcVideoChannel::AddRecvStream copies it to the created
-    // WebRtcVideoReceiveStream, where it is returned by the
-    // SmoothsRenderedFrames method. This method is used by the
-    // VideoReceiveStream, where the value is passed on to the
-    // IncomingVideoStream constructor.
-    bool disable_prerenderer_smoothing = false;
-
-    // Enables periodic bandwidth probing in application-limited region.
-    bool periodic_alr_bandwidth_probing = false;
-  } video;
-
-  bool operator==(const MediaConfig& o) const {
-    return enable_dscp == o.enable_dscp &&
-           video.enable_cpu_overuse_detection ==
-               o.video.enable_cpu_overuse_detection &&
-           video.suspend_below_min_bitrate ==
-               o.video.suspend_below_min_bitrate &&
-           video.disable_prerenderer_smoothing ==
-               o.video.disable_prerenderer_smoothing &&
-           video.periodic_alr_bandwidth_probing ==
-               o.video.periodic_alr_bandwidth_probing;
-  }
-
-  bool operator!=(const MediaConfig& o) const { return !(*this == o); }
-};
-
-// Options that can be applied to a VoiceMediaChannel or a VoiceMediaEngine.
-// Used to be flags, but that makes it hard to selectively apply options.
-// We are moving all of the setting of options to structs like this,
-// but some things currently still use flags.
-struct AudioOptions {
-  void SetAll(const AudioOptions& change) {
-    SetFrom(&echo_cancellation, change.echo_cancellation);
-    SetFrom(&auto_gain_control, change.auto_gain_control);
-    SetFrom(&noise_suppression, change.noise_suppression);
-    SetFrom(&highpass_filter, change.highpass_filter);
-    SetFrom(&stereo_swapping, change.stereo_swapping);
-    SetFrom(&audio_jitter_buffer_max_packets,
-            change.audio_jitter_buffer_max_packets);
-    SetFrom(&audio_jitter_buffer_fast_accelerate,
-            change.audio_jitter_buffer_fast_accelerate);
-    SetFrom(&typing_detection, change.typing_detection);
-    SetFrom(&aecm_generate_comfort_noise, change.aecm_generate_comfort_noise);
-    SetFrom(&adjust_agc_delta, change.adjust_agc_delta);
-    SetFrom(&experimental_agc, change.experimental_agc);
-    SetFrom(&extended_filter_aec, change.extended_filter_aec);
-    SetFrom(&delay_agnostic_aec, change.delay_agnostic_aec);
-    SetFrom(&experimental_ns, change.experimental_ns);
-    SetFrom(&intelligibility_enhancer, change.intelligibility_enhancer);
-    SetFrom(&level_control, change.level_control);
-    SetFrom(&residual_echo_detector, change.residual_echo_detector);
-    SetFrom(&tx_agc_target_dbov, change.tx_agc_target_dbov);
-    SetFrom(&tx_agc_digital_compression_gain,
-            change.tx_agc_digital_compression_gain);
-    SetFrom(&tx_agc_limiter, change.tx_agc_limiter);
-    SetFrom(&recording_sample_rate, change.recording_sample_rate);
-    SetFrom(&playout_sample_rate, change.playout_sample_rate);
-    SetFrom(&combined_audio_video_bwe, change.combined_audio_video_bwe);
-    SetFrom(&audio_network_adaptor, change.audio_network_adaptor);
-    SetFrom(&audio_network_adaptor_config, change.audio_network_adaptor_config);
-    SetFrom(&level_control_initial_peak_level_dbfs,
-            change.level_control_initial_peak_level_dbfs);
-  }
-
-  bool operator==(const AudioOptions& o) const {
-    return echo_cancellation == o.echo_cancellation &&
-           auto_gain_control == o.auto_gain_control &&
-           noise_suppression == o.noise_suppression &&
-           highpass_filter == o.highpass_filter &&
-           stereo_swapping == o.stereo_swapping &&
-           audio_jitter_buffer_max_packets ==
-               o.audio_jitter_buffer_max_packets &&
-           audio_jitter_buffer_fast_accelerate ==
-               o.audio_jitter_buffer_fast_accelerate &&
-           typing_detection == o.typing_detection &&
-           aecm_generate_comfort_noise == o.aecm_generate_comfort_noise &&
-           experimental_agc == o.experimental_agc &&
-           extended_filter_aec == o.extended_filter_aec &&
-           delay_agnostic_aec == o.delay_agnostic_aec &&
-           experimental_ns == o.experimental_ns &&
-           intelligibility_enhancer == o.intelligibility_enhancer &&
-           level_control == o.level_control &&
-           residual_echo_detector == o.residual_echo_detector &&
-           adjust_agc_delta == o.adjust_agc_delta &&
-           tx_agc_target_dbov == o.tx_agc_target_dbov &&
-           tx_agc_digital_compression_gain ==
-               o.tx_agc_digital_compression_gain &&
-           tx_agc_limiter == o.tx_agc_limiter &&
-           recording_sample_rate == o.recording_sample_rate &&
-           playout_sample_rate == o.playout_sample_rate &&
-           combined_audio_video_bwe == o.combined_audio_video_bwe &&
-           audio_network_adaptor == o.audio_network_adaptor &&
-           audio_network_adaptor_config == o.audio_network_adaptor_config &&
-           level_control_initial_peak_level_dbfs ==
-               o.level_control_initial_peak_level_dbfs;
-  }
-  bool operator!=(const AudioOptions& o) const { return !(*this == o); }
-
-  std::string ToString() const {
-    std::ostringstream ost;
-    ost << "AudioOptions {";
-    ost << ToStringIfSet("aec", echo_cancellation);
-    ost << ToStringIfSet("agc", auto_gain_control);
-    ost << ToStringIfSet("ns", noise_suppression);
-    ost << ToStringIfSet("hf", highpass_filter);
-    ost << ToStringIfSet("swap", stereo_swapping);
-    ost << ToStringIfSet("audio_jitter_buffer_max_packets",
-                         audio_jitter_buffer_max_packets);
-    ost << ToStringIfSet("audio_jitter_buffer_fast_accelerate",
-                         audio_jitter_buffer_fast_accelerate);
-    ost << ToStringIfSet("typing", typing_detection);
-    ost << ToStringIfSet("comfort_noise", aecm_generate_comfort_noise);
-    ost << ToStringIfSet("agc_delta", adjust_agc_delta);
-    ost << ToStringIfSet("experimental_agc", experimental_agc);
-    ost << ToStringIfSet("extended_filter_aec", extended_filter_aec);
-    ost << ToStringIfSet("delay_agnostic_aec", delay_agnostic_aec);
-    ost << ToStringIfSet("experimental_ns", experimental_ns);
-    ost << ToStringIfSet("intelligibility_enhancer", intelligibility_enhancer);
-    ost << ToStringIfSet("level_control", level_control);
-    ost << ToStringIfSet("level_control_initial_peak_level_dbfs",
-                         level_control_initial_peak_level_dbfs);
-    ost << ToStringIfSet("residual_echo_detector", residual_echo_detector);
-    ost << ToStringIfSet("tx_agc_target_dbov", tx_agc_target_dbov);
-    ost << ToStringIfSet("tx_agc_digital_compression_gain",
-        tx_agc_digital_compression_gain);
-    ost << ToStringIfSet("tx_agc_limiter", tx_agc_limiter);
-    ost << ToStringIfSet("recording_sample_rate", recording_sample_rate);
-    ost << ToStringIfSet("playout_sample_rate", playout_sample_rate);
-    ost << ToStringIfSet("combined_audio_video_bwe", combined_audio_video_bwe);
-    ost << ToStringIfSet("audio_network_adaptor", audio_network_adaptor);
-    // The adaptor config is a serialized proto buffer and therefore not human
-    // readable. So we comment out the following line.
-    // ost << ToStringIfSet("audio_network_adaptor_config",
-    //     audio_network_adaptor_config);
-    ost << "}";
-    return ost.str();
-  }
-
-  // Audio processing that attempts to filter away the output signal from
-  // later inbound pickup.
-  rtc::Optional<bool> echo_cancellation;
-  // Audio processing to adjust the sensitivity of the local mic dynamically.
-  rtc::Optional<bool> auto_gain_control;
-  // Audio processing to filter out background noise.
-  rtc::Optional<bool> noise_suppression;
-  // Audio processing to remove background noise of lower frequencies.
-  rtc::Optional<bool> highpass_filter;
-  // Audio processing to swap the left and right channels.
-  rtc::Optional<bool> stereo_swapping;
-  // Audio receiver jitter buffer (NetEq) max capacity in number of packets.
-  rtc::Optional<int> audio_jitter_buffer_max_packets;
-  // Audio receiver jitter buffer (NetEq) fast accelerate mode.
-  rtc::Optional<bool> audio_jitter_buffer_fast_accelerate;
-  // Audio processing to detect typing.
-  rtc::Optional<bool> typing_detection;
-  rtc::Optional<bool> aecm_generate_comfort_noise;
-  rtc::Optional<int> adjust_agc_delta;
-  rtc::Optional<bool> experimental_agc;
-  rtc::Optional<bool> extended_filter_aec;
-  rtc::Optional<bool> delay_agnostic_aec;
-  rtc::Optional<bool> experimental_ns;
-  rtc::Optional<bool> intelligibility_enhancer;
-  rtc::Optional<bool> level_control;
-  // Specifies an optional initialization value for the level controller.
-  rtc::Optional<float> level_control_initial_peak_level_dbfs;
-  // Note that tx_agc_* only applies to non-experimental AGC.
-  rtc::Optional<bool> residual_echo_detector;
-  rtc::Optional<uint16_t> tx_agc_target_dbov;
-  rtc::Optional<uint16_t> tx_agc_digital_compression_gain;
-  rtc::Optional<bool> tx_agc_limiter;
-  rtc::Optional<uint32_t> recording_sample_rate;
-  rtc::Optional<uint32_t> playout_sample_rate;
-  // Enable combined audio+bandwidth BWE.
-  // TODO(pthatcher): This flag is set from the
-  // "googCombinedAudioVideoBwe", but not used anywhere. So delete it,
-  // and check if any other AudioOptions members are unused.
-  rtc::Optional<bool> combined_audio_video_bwe;
-  // Enable audio network adaptor.
-  rtc::Optional<bool> audio_network_adaptor;
-  // Config string for audio network adaptor.
-  rtc::Optional<std::string> audio_network_adaptor_config;
-
- private:
-  template <typename T>
-  static void SetFrom(rtc::Optional<T>* s, const rtc::Optional<T>& o) {
-    if (o) {
-      *s = o;
-    }
-  }
-};
-
-// Options that can be applied to a VideoMediaChannel or a VideoMediaEngine.
-// Used to be flags, but that makes it hard to selectively apply options.
-// We are moving all of the setting of options to structs like this,
-// but some things currently still use flags.
-struct VideoOptions {
-  void SetAll(const VideoOptions& change) {
-    SetFrom(&video_noise_reduction, change.video_noise_reduction);
-    SetFrom(&screencast_min_bitrate_kbps, change.screencast_min_bitrate_kbps);
-    SetFrom(&is_screencast, change.is_screencast);
-  }
-
-  bool operator==(const VideoOptions& o) const {
-    return video_noise_reduction == o.video_noise_reduction &&
-           screencast_min_bitrate_kbps == o.screencast_min_bitrate_kbps &&
-           is_screencast == o.is_screencast;
-  }
-  bool operator!=(const VideoOptions& o) const { return !(*this == o); }
-
-  std::string ToString() const {
-    std::ostringstream ost;
-    ost << "VideoOptions {";
-    ost << ToStringIfSet("noise reduction", video_noise_reduction);
-    ost << ToStringIfSet("screencast min bitrate kbps",
-                         screencast_min_bitrate_kbps);
-    ost << ToStringIfSet("is_screencast ", is_screencast);
-    ost << "}";
-    return ost.str();
-  }
-
-  // Enable denoising? This flag comes from the getUserMedia
-  // constraint 'googNoiseReduction', and WebRtcVideoEngine passes it
-  // on to the codec options. Disabled by default.
-  rtc::Optional<bool> video_noise_reduction;
-  // Force screencast to use a minimum bitrate. This flag comes from
-  // the PeerConnection constraint 'googScreencastMinBitrate'. It is
-  // copied to the encoder config by WebRtcVideoChannel.
-  rtc::Optional<int> screencast_min_bitrate_kbps;
-  // Set by screencast sources. Implies selection of encoding settings
-  // suitable for screencast. Most likely not the right way to do
-  // things, e.g., screencast of a text document and screencast of a
-  // youtube video have different needs.
-  rtc::Optional<bool> is_screencast;
-
- private:
-  template <typename T>
-  static void SetFrom(rtc::Optional<T>* s, const rtc::Optional<T>& o) {
-    if (o) {
-      *s = o;
-    }
-  }
-};
-
-// TODO(isheriff): Remove this once client usage is fixed to use RtpExtension.
-struct RtpHeaderExtension {
-  RtpHeaderExtension() : id(0) {}
-  RtpHeaderExtension(const std::string& uri, int id) : uri(uri), id(id) {}
-
-  std::string ToString() const {
-    std::ostringstream ost;
-    ost << "{";
-    ost << "uri: " << uri;
-    ost << ", id: " << id;
-    ost << "}";
-    return ost.str();
-  }
-
-  std::string uri;
-  int id;
-};
-
-class MediaChannel : public sigslot::has_slots<> {
- public:
-  class NetworkInterface {
-   public:
-    enum SocketType { ST_RTP, ST_RTCP };
-    virtual bool SendPacket(rtc::CopyOnWriteBuffer* packet,
-                            const rtc::PacketOptions& options) = 0;
-    virtual bool SendRtcp(rtc::CopyOnWriteBuffer* packet,
-                          const rtc::PacketOptions& options) = 0;
-    virtual int SetOption(SocketType type, rtc::Socket::Option opt,
-                          int option) = 0;
-    virtual ~NetworkInterface() {}
-  };
-
-  explicit MediaChannel(const MediaConfig& config)
-      : enable_dscp_(config.enable_dscp), network_interface_(NULL) {}
-  MediaChannel() : enable_dscp_(false), network_interface_(NULL) {}
-  virtual ~MediaChannel() {}
-
-  // Sets the abstract interface class for sending RTP/RTCP data.
-  virtual void SetInterface(NetworkInterface *iface) {
-    rtc::CritScope cs(&network_interface_crit_);
-    network_interface_ = iface;
-    SetDscp(enable_dscp_ ? PreferredDscp() : rtc::DSCP_DEFAULT);
-  }
-  virtual rtc::DiffServCodePoint PreferredDscp() const {
-    return rtc::DSCP_DEFAULT;
-  }
-  // Called when a RTP packet is received.
-  virtual void OnPacketReceived(rtc::CopyOnWriteBuffer* packet,
-                                const rtc::PacketTime& packet_time) = 0;
-  // Called when a RTCP packet is received.
-  virtual void OnRtcpReceived(rtc::CopyOnWriteBuffer* packet,
-                              const rtc::PacketTime& packet_time) = 0;
-  // 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 rtc::NetworkRoute& network_route) = 0;
-  // Called when the rtp transport overhead changed.
-  virtual void OnTransportOverheadChanged(
-      int transport_overhead_per_packet) = 0;
-  // Creates a new outgoing media stream with SSRCs and CNAME as described
-  // by sp.
-  virtual bool AddSendStream(const StreamParams& sp) = 0;
-  // Removes an outgoing media stream.
-  // ssrc must be the first SSRC of the media stream if the stream uses
-  // multiple SSRCs.
-  virtual bool RemoveSendStream(uint32_t ssrc) = 0;
-  // Creates a new incoming media stream with SSRCs and CNAME as described
-  // by sp.
-  virtual bool AddRecvStream(const StreamParams& sp) = 0;
-  // Removes an incoming media stream.
-  // ssrc must be the first SSRC of the media stream if the stream uses
-  // multiple SSRCs.
-  virtual bool RemoveRecvStream(uint32_t ssrc) = 0;
-
-  // Returns the absoulte sendtime extension id value from media channel.
-  virtual int GetRtpSendTimeExtnId() const {
-    return -1;
-  }
-
-  // Base method to send packet using NetworkInterface.
-  bool SendPacket(rtc::CopyOnWriteBuffer* packet,
-                  const rtc::PacketOptions& options) {
-    return DoSendPacket(packet, false, options);
-  }
-
-  bool SendRtcp(rtc::CopyOnWriteBuffer* packet,
-                const rtc::PacketOptions& options) {
-    return DoSendPacket(packet, true, options);
-  }
-
-  int SetOption(NetworkInterface::SocketType type,
-                rtc::Socket::Option opt,
-                int option) {
-    rtc::CritScope cs(&network_interface_crit_);
-    if (!network_interface_)
-      return -1;
-
-    return network_interface_->SetOption(type, opt, option);
-  }
-
- private:
-  // This method sets DSCP |value| on both RTP and RTCP channels.
-  int SetDscp(rtc::DiffServCodePoint value) {
-    int ret;
-    ret = SetOption(NetworkInterface::ST_RTP,
-                    rtc::Socket::OPT_DSCP,
-                    value);
-    if (ret == 0) {
-      ret = SetOption(NetworkInterface::ST_RTCP,
-                      rtc::Socket::OPT_DSCP,
-                      value);
-    }
-    return ret;
-  }
-
-  bool DoSendPacket(rtc::CopyOnWriteBuffer* packet,
-                    bool rtcp,
-                    const rtc::PacketOptions& options) {
-    rtc::CritScope cs(&network_interface_crit_);
-    if (!network_interface_)
-      return false;
-
-    return (!rtcp) ? network_interface_->SendPacket(packet, options)
-                   : network_interface_->SendRtcp(packet, options);
-  }
-
-  const bool enable_dscp_;
-  // |network_interface_| can be accessed from the worker_thread and
-  // from any MediaEngine threads. This critical section is to protect accessing
-  // of network_interface_ object.
-  rtc::CriticalSection network_interface_crit_;
-  NetworkInterface* network_interface_;
-};
-
-// The stats information is structured as follows:
-// Media are represented by either MediaSenderInfo or MediaReceiverInfo.
-// Media contains a vector of SSRC infos that are exclusively used by this
-// media. (SSRCs shared between media streams can't be represented.)
-
-// Information about an SSRC.
-// This data may be locally recorded, or received in an RTCP SR or RR.
-struct SsrcSenderInfo {
-  SsrcSenderInfo()
-      : ssrc(0),
-    timestamp(0) {
-  }
-  uint32_t ssrc;
-  double timestamp;  // NTP timestamp, represented as seconds since epoch.
-};
-
-struct SsrcReceiverInfo {
-  SsrcReceiverInfo()
-      : ssrc(0),
-        timestamp(0) {
-  }
-  uint32_t ssrc;
-  double timestamp;
-};
-
-struct MediaSenderInfo {
-  MediaSenderInfo()
-      : bytes_sent(0),
-        packets_sent(0),
-        packets_lost(0),
-        fraction_lost(0.0),
-        rtt_ms(0) {
-  }
-  void add_ssrc(const SsrcSenderInfo& stat) {
-    local_stats.push_back(stat);
-  }
-  // Temporary utility function for call sites that only provide SSRC.
-  // As more info is added into SsrcSenderInfo, this function should go away.
-  void add_ssrc(uint32_t ssrc) {
-    SsrcSenderInfo stat;
-    stat.ssrc = ssrc;
-    add_ssrc(stat);
-  }
-  // Utility accessor for clients that are only interested in ssrc numbers.
-  std::vector<uint32_t> ssrcs() const {
-    std::vector<uint32_t> retval;
-    for (std::vector<SsrcSenderInfo>::const_iterator it = local_stats.begin();
-         it != local_stats.end(); ++it) {
-      retval.push_back(it->ssrc);
-    }
-    return retval;
-  }
-  // Utility accessor for clients that make the assumption only one ssrc
-  // exists per media.
-  // This will eventually go away.
-  uint32_t ssrc() const {
-    if (local_stats.size() > 0) {
-      return local_stats[0].ssrc;
-    } else {
-      return 0;
-    }
-  }
-  int64_t bytes_sent;
-  int packets_sent;
-  int packets_lost;
-  float fraction_lost;
-  int64_t rtt_ms;
-  std::string codec_name;
-  rtc::Optional<int> codec_payload_type;
-  std::vector<SsrcSenderInfo> local_stats;
-  std::vector<SsrcReceiverInfo> remote_stats;
-};
-
-struct MediaReceiverInfo {
-  MediaReceiverInfo()
-      : bytes_rcvd(0),
-        packets_rcvd(0),
-        packets_lost(0),
-        fraction_lost(0.0) {
-  }
-  void add_ssrc(const SsrcReceiverInfo& stat) {
-    local_stats.push_back(stat);
-  }
-  // Temporary utility function for call sites that only provide SSRC.
-  // As more info is added into SsrcSenderInfo, this function should go away.
-  void add_ssrc(uint32_t ssrc) {
-    SsrcReceiverInfo stat;
-    stat.ssrc = ssrc;
-    add_ssrc(stat);
-  }
-  std::vector<uint32_t> ssrcs() const {
-    std::vector<uint32_t> retval;
-    for (std::vector<SsrcReceiverInfo>::const_iterator it = local_stats.begin();
-         it != local_stats.end(); ++it) {
-      retval.push_back(it->ssrc);
-    }
-    return retval;
-  }
-  // Utility accessor for clients that make the assumption only one ssrc
-  // exists per media.
-  // This will eventually go away.
-  uint32_t ssrc() const {
-    if (local_stats.size() > 0) {
-      return local_stats[0].ssrc;
-    } else {
-      return 0;
-    }
-  }
-
-  int64_t bytes_rcvd;
-  int packets_rcvd;
-  int packets_lost;
-  float fraction_lost;
-  std::string codec_name;
-  rtc::Optional<int> codec_payload_type;
-  std::vector<SsrcReceiverInfo> local_stats;
-  std::vector<SsrcSenderInfo> remote_stats;
-};
-
-struct VoiceSenderInfo : public MediaSenderInfo {
-  VoiceSenderInfo()
-      : ext_seqnum(0),
-        jitter_ms(0),
-        audio_level(0),
-        total_input_energy(0.0),
-        total_input_duration(0.0),
-        aec_quality_min(0.0),
-        echo_delay_median_ms(0),
-        echo_delay_std_ms(0),
-        echo_return_loss(0),
-        echo_return_loss_enhancement(0),
-        residual_echo_likelihood(0.0f),
-        residual_echo_likelihood_recent_max(0.0f),
-        typing_noise_detected(false) {}
-
-  int ext_seqnum;
-  int jitter_ms;
-  int audio_level;
-  // See description of "totalAudioEnergy" in the WebRTC stats spec:
-  // https://w3c.github.io/webrtc-stats/#dom-rtcmediastreamtrackstats-totalaudioenergy
-  double total_input_energy;
-  double total_input_duration;
-  float aec_quality_min;
-  int echo_delay_median_ms;
-  int echo_delay_std_ms;
-  int echo_return_loss;
-  int echo_return_loss_enhancement;
-  float residual_echo_likelihood;
-  float residual_echo_likelihood_recent_max;
-  bool typing_noise_detected;
-  webrtc::ANAStats ana_statistics;
-};
-
-struct VoiceReceiverInfo : public MediaReceiverInfo {
-  VoiceReceiverInfo()
-      : ext_seqnum(0),
-        jitter_ms(0),
-        jitter_buffer_ms(0),
-        jitter_buffer_preferred_ms(0),
-        delay_estimate_ms(0),
-        audio_level(0),
-        total_output_energy(0.0),
-        total_samples_received(0),
-        total_output_duration(0.0),
-        concealed_samples(0),
-        expand_rate(0),
-        speech_expand_rate(0),
-        secondary_decoded_rate(0),
-        secondary_discarded_rate(0),
-        accelerate_rate(0),
-        preemptive_expand_rate(0),
-        decoding_calls_to_silence_generator(0),
-        decoding_calls_to_neteq(0),
-        decoding_normal(0),
-        decoding_plc(0),
-        decoding_cng(0),
-        decoding_plc_cng(0),
-        decoding_muted_output(0),
-        capture_start_ntp_time_ms(-1) {}
-
-  int ext_seqnum;
-  int jitter_ms;
-  int jitter_buffer_ms;
-  int jitter_buffer_preferred_ms;
-  int delay_estimate_ms;
-  int audio_level;
-  // See description of "totalAudioEnergy" in the WebRTC stats spec:
-  // https://w3c.github.io/webrtc-stats/#dom-rtcmediastreamtrackstats-totalaudioenergy
-  double total_output_energy;
-  // See description of "totalSamplesReceived" in the WebRTC stats spec:
-  // https://w3c.github.io/webrtc-stats/#dom-rtcmediastreamtrackstats-totalsamplesreceived
-  uint64_t total_samples_received;
-  // See description of "totalSamplesDuration" in the WebRTC stats spec:
-  // https://w3c.github.io/webrtc-stats/#dom-rtcmediastreamtrackstats-totalsamplesduration
-  double total_output_duration;
-  // See description of "concealedSamples" in the WebRTC stats spec:
-  // https://w3c.github.io/webrtc-stats/#dom-rtcmediastreamtrackstats-concealedsamples
-  uint64_t concealed_samples;
-  // fraction of synthesized audio inserted through expansion.
-  float expand_rate;
-  // fraction of synthesized speech inserted through expansion.
-  float speech_expand_rate;
-  // fraction of data out of secondary decoding, including FEC and RED.
-  float secondary_decoded_rate;
-  // Fraction of secondary data, including FEC and RED, that is discarded.
-  // Discarding of secondary data can be caused by the reception of the primary
-  // data, obsoleting the secondary data. It can also be caused by early
-  // or late arrival of secondary data. This metric is the percentage of
-  // discarded secondary data since last query of receiver info.
-  float secondary_discarded_rate;
-  // Fraction of data removed through time compression.
-  float accelerate_rate;
-  // Fraction of data inserted through time stretching.
-  float preemptive_expand_rate;
-  int decoding_calls_to_silence_generator;
-  int decoding_calls_to_neteq;
-  int decoding_normal;
-  int decoding_plc;
-  int decoding_cng;
-  int decoding_plc_cng;
-  int decoding_muted_output;
-  // Estimated capture start time in NTP time in ms.
-  int64_t capture_start_ntp_time_ms;
-};
-
-struct VideoSenderInfo : public MediaSenderInfo {
-  VideoSenderInfo()
-      : packets_cached(0),
-        firs_rcvd(0),
-        plis_rcvd(0),
-        nacks_rcvd(0),
-        send_frame_width(0),
-        send_frame_height(0),
-        framerate_input(0),
-        framerate_sent(0),
-        nominal_bitrate(0),
-        preferred_bitrate(0),
-        adapt_reason(0),
-        adapt_changes(0),
-        avg_encode_ms(0),
-        encode_usage_percent(0),
-        frames_encoded(0),
-        content_type(webrtc::VideoContentType::UNSPECIFIED) {}
-
-  std::vector<SsrcGroup> ssrc_groups;
-  // TODO(hbos): Move this to |VideoMediaInfo::send_codecs|?
-  std::string encoder_implementation_name;
-  int packets_cached;
-  int firs_rcvd;
-  int plis_rcvd;
-  int nacks_rcvd;
-  int send_frame_width;
-  int send_frame_height;
-  int framerate_input;
-  int framerate_sent;
-  int nominal_bitrate;
-  int preferred_bitrate;
-  int adapt_reason;
-  int adapt_changes;
-  int avg_encode_ms;
-  int encode_usage_percent;
-  uint32_t frames_encoded;
-  rtc::Optional<uint64_t> qp_sum;
-  webrtc::VideoContentType content_type;
-};
-
-struct VideoReceiverInfo : public MediaReceiverInfo {
-  VideoReceiverInfo()
-      : packets_concealed(0),
-        firs_sent(0),
-        plis_sent(0),
-        nacks_sent(0),
-        frame_width(0),
-        frame_height(0),
-        framerate_rcvd(0),
-        framerate_decoded(0),
-        framerate_output(0),
-        framerate_render_input(0),
-        framerate_render_output(0),
-        frames_received(0),
-        frames_decoded(0),
-        frames_rendered(0),
-        interframe_delay_max_ms(-1),
-        content_type(webrtc::VideoContentType::UNSPECIFIED),
-        decode_ms(0),
-        max_decode_ms(0),
-        jitter_buffer_ms(0),
-        min_playout_delay_ms(0),
-        render_delay_ms(0),
-        target_delay_ms(0),
-        current_delay_ms(0),
-        capture_start_ntp_time_ms(-1) {}
-
-  std::vector<SsrcGroup> ssrc_groups;
-  // TODO(hbos): Move this to |VideoMediaInfo::receive_codecs|?
-  std::string decoder_implementation_name;
-  int packets_concealed;
-  int firs_sent;
-  int plis_sent;
-  int nacks_sent;
-  int frame_width;
-  int frame_height;
-  int framerate_rcvd;
-  int framerate_decoded;
-  int framerate_output;
-  // Framerate as sent to the renderer.
-  int framerate_render_input;
-  // Framerate that the renderer reports.
-  int framerate_render_output;
-  uint32_t frames_received;
-  uint32_t frames_decoded;
-  uint32_t frames_rendered;
-  rtc::Optional<uint64_t> qp_sum;
-  int64_t interframe_delay_max_ms;
-
-  webrtc::VideoContentType content_type;
-
-  // All stats below are gathered per-VideoReceiver, but some will be correlated
-  // across MediaStreamTracks.  NOTE(hta): when sinking stats into per-SSRC
-  // structures, reflect this in the new layout.
-
-  // Current frame decode latency.
-  int decode_ms;
-  // Maximum observed frame decode latency.
-  int max_decode_ms;
-  // Jitter (network-related) latency.
-  int jitter_buffer_ms;
-  // Requested minimum playout latency.
-  int min_playout_delay_ms;
-  // Requested latency to account for rendering delay.
-  int render_delay_ms;
-  // Target overall delay: network+decode+render, accounting for
-  // min_playout_delay_ms.
-  int target_delay_ms;
-  // Current overall delay, possibly ramping towards target_delay_ms.
-  int current_delay_ms;
-
-  // Estimated capture start time in NTP time in ms.
-  int64_t capture_start_ntp_time_ms;
-
-  // Timing frame info: all important timestamps for a full lifetime of a
-  // single 'timing frame'.
-  rtc::Optional<webrtc::TimingFrameInfo> timing_frame_info;
-};
-
-struct DataSenderInfo : public MediaSenderInfo {
-  DataSenderInfo()
-      : ssrc(0) {
-  }
-
-  uint32_t ssrc;
-};
-
-struct DataReceiverInfo : public MediaReceiverInfo {
-  DataReceiverInfo()
-      : ssrc(0) {
-  }
-
-  uint32_t ssrc;
-};
-
-struct BandwidthEstimationInfo {
-  BandwidthEstimationInfo()
-      : available_send_bandwidth(0),
-        available_recv_bandwidth(0),
-        target_enc_bitrate(0),
-        actual_enc_bitrate(0),
-        retransmit_bitrate(0),
-        transmit_bitrate(0),
-        bucket_delay(0) {
-  }
-
-  int available_send_bandwidth;
-  int available_recv_bandwidth;
-  int target_enc_bitrate;
-  int actual_enc_bitrate;
-  int retransmit_bitrate;
-  int transmit_bitrate;
-  int64_t bucket_delay;
-};
-
-// Maps from payload type to |RtpCodecParameters|.
-typedef std::map<int, webrtc::RtpCodecParameters> RtpCodecParametersMap;
-
-struct VoiceMediaInfo {
-  void Clear() {
-    senders.clear();
-    receivers.clear();
-    send_codecs.clear();
-    receive_codecs.clear();
-  }
-  std::vector<VoiceSenderInfo> senders;
-  std::vector<VoiceReceiverInfo> receivers;
-  RtpCodecParametersMap send_codecs;
-  RtpCodecParametersMap receive_codecs;
-};
-
-struct VideoMediaInfo {
-  void Clear() {
-    senders.clear();
-    receivers.clear();
-    bw_estimations.clear();
-    send_codecs.clear();
-    receive_codecs.clear();
-  }
-  std::vector<VideoSenderInfo> senders;
-  std::vector<VideoReceiverInfo> receivers;
-  // Deprecated.
-  // TODO(holmer): Remove once upstream projects no longer use this.
-  std::vector<BandwidthEstimationInfo> bw_estimations;
-  RtpCodecParametersMap send_codecs;
-  RtpCodecParametersMap receive_codecs;
-};
-
-struct DataMediaInfo {
-  void Clear() {
-    senders.clear();
-    receivers.clear();
-  }
-  std::vector<DataSenderInfo> senders;
-  std::vector<DataReceiverInfo> receivers;
-};
-
-struct RtcpParameters {
-  bool reduced_size = false;
-};
-
-template <class Codec>
-struct RtpParameters {
-  virtual std::string ToString() const {
-    std::ostringstream ost;
-    ost << "{";
-    ost << "codecs: " << VectorToString(codecs) << ", ";
-    ost << "extensions: " << VectorToString(extensions);
-    ost << "}";
-    return ost.str();
-  }
-
-  std::vector<Codec> codecs;
-  std::vector<webrtc::RtpExtension> extensions;
-  // TODO(pthatcher): Add streams.
-  RtcpParameters rtcp;
-  virtual ~RtpParameters() = default;
-};
-
-// TODO(deadbeef): Rename to RtpSenderParameters, since they're intended to
-// encapsulate all the parameters needed for an RtpSender.
-template <class Codec>
-struct RtpSendParameters : RtpParameters<Codec> {
-  std::string ToString() const override {
-    std::ostringstream ost;
-    ost << "{";
-    ost << "codecs: " << VectorToString(this->codecs) << ", ";
-    ost << "extensions: " << VectorToString(this->extensions) << ", ";
-    ost << "max_bandwidth_bps: " << max_bandwidth_bps << ", ";
-    ost << "}";
-    return ost.str();
-  }
-
-  int max_bandwidth_bps = -1;
-};
-
-struct AudioSendParameters : RtpSendParameters<AudioCodec> {
-  std::string ToString() const override {
-    std::ostringstream ost;
-    ost << "{";
-    ost << "codecs: " << VectorToString(this->codecs) << ", ";
-    ost << "extensions: " << VectorToString(this->extensions) << ", ";
-    ost << "max_bandwidth_bps: " << max_bandwidth_bps << ", ";
-    ost << "options: " << options.ToString();
-    ost << "}";
-    return ost.str();
-  }
-
-  AudioOptions options;
-};
-
-struct AudioRecvParameters : RtpParameters<AudioCodec> {
-};
-
-class VoiceMediaChannel : public MediaChannel {
- public:
-  enum Error {
-    ERROR_NONE = 0,                       // No error.
-    ERROR_OTHER,                          // Other errors.
-    ERROR_REC_DEVICE_OPEN_FAILED = 100,   // Could not open mic.
-    ERROR_REC_DEVICE_MUTED,               // Mic was muted by OS.
-    ERROR_REC_DEVICE_SILENT,              // No background noise picked up.
-    ERROR_REC_DEVICE_SATURATION,          // Mic input is clipping.
-    ERROR_REC_DEVICE_REMOVED,             // Mic was removed while active.
-    ERROR_REC_RUNTIME_ERROR,              // Processing is encountering errors.
-    ERROR_REC_SRTP_ERROR,                 // Generic SRTP failure.
-    ERROR_REC_SRTP_AUTH_FAILED,           // Failed to authenticate packets.
-    ERROR_REC_TYPING_NOISE_DETECTED,      // Typing noise is detected.
-    ERROR_PLAY_DEVICE_OPEN_FAILED = 200,  // Could not open playout.
-    ERROR_PLAY_DEVICE_MUTED,              // Playout muted by OS.
-    ERROR_PLAY_DEVICE_REMOVED,            // Playout removed while active.
-    ERROR_PLAY_RUNTIME_ERROR,             // Errors in voice processing.
-    ERROR_PLAY_SRTP_ERROR,                // Generic SRTP failure.
-    ERROR_PLAY_SRTP_AUTH_FAILED,          // Failed to authenticate packets.
-    ERROR_PLAY_SRTP_REPLAY,               // Packet replay detected.
-  };
-
-  VoiceMediaChannel() {}
-  explicit VoiceMediaChannel(const MediaConfig& config)
-      : MediaChannel(config) {}
-  virtual ~VoiceMediaChannel() {}
-  virtual bool SetSendParameters(const AudioSendParameters& params) = 0;
-  virtual bool SetRecvParameters(const AudioRecvParameters& params) = 0;
-  virtual webrtc::RtpParameters GetRtpSendParameters(uint32_t ssrc) const = 0;
-  virtual bool SetRtpSendParameters(
-      uint32_t ssrc,
-      const webrtc::RtpParameters& parameters) = 0;
-  // Get the receive parameters for the incoming stream identified by |ssrc|.
-  // If |ssrc| is 0, retrieve the receive parameters for the default receive
-  // stream, which is used when SSRCs are not signaled. Note that calling with
-  // an |ssrc| of 0 will return encoding parameters with an unset |ssrc|
-  // member.
-  virtual webrtc::RtpParameters GetRtpReceiveParameters(
-      uint32_t ssrc) const = 0;
-  virtual bool SetRtpReceiveParameters(
-      uint32_t ssrc,
-      const webrtc::RtpParameters& parameters) = 0;
-  // Starts or stops playout of received audio.
-  virtual void SetPlayout(bool playout) = 0;
-  // Starts or stops sending (and potentially capture) of local audio.
-  virtual void SetSend(bool send) = 0;
-  // Configure stream for sending.
-  virtual bool SetAudioSend(uint32_t ssrc,
-                            bool enable,
-                            const AudioOptions* options,
-                            AudioSource* source) = 0;
-  // Gets current energy levels for all incoming streams.
-  virtual bool GetActiveStreams(AudioInfo::StreamList* actives) = 0;
-  // Get the current energy level of the stream sent to the speaker.
-  virtual int GetOutputLevel() = 0;
-  // Set speaker output volume of the specified ssrc.
-  virtual bool SetOutputVolume(uint32_t ssrc, double volume) = 0;
-  // Returns if the telephone-event has been negotiated.
-  virtual bool CanInsertDtmf() = 0;
-  // Send a DTMF |event|. The DTMF out-of-band signal will be used.
-  // The |ssrc| should be either 0 or a valid send stream ssrc.
-  // The valid value for the |event| are 0 to 15 which corresponding to
-  // DTMF event 0-9, *, #, A-D.
-  virtual bool InsertDtmf(uint32_t ssrc, int event, int duration) = 0;
-  // Gets quality stats for the channel.
-  virtual bool GetStats(VoiceMediaInfo* info) = 0;
-
-  virtual void SetRawAudioSink(
-      uint32_t ssrc,
-      std::unique_ptr<webrtc::AudioSinkInterface> sink) = 0;
-
-  virtual std::vector<webrtc::RtpSource> GetSources(uint32_t ssrc) const = 0;
-};
-
-// TODO(deadbeef): Rename to VideoSenderParameters, since they're intended to
-// encapsulate all the parameters needed for a video RtpSender.
-struct VideoSendParameters : RtpSendParameters<VideoCodec> {
-  // Use conference mode? This flag comes from the remote
-  // description's SDP line 'a=x-google-flag:conference', copied over
-  // by VideoChannel::SetRemoteContent_w, and ultimately used by
-  // conference mode screencast logic in
-  // WebRtcVideoChannel::WebRtcVideoSendStream::CreateVideoEncoderConfig.
-  // The special screencast behaviour is disabled by default.
-  bool conference_mode = false;
-};
-
-// TODO(deadbeef): Rename to VideoReceiverParameters, since they're intended to
-// encapsulate all the parameters needed for a video RtpReceiver.
-struct VideoRecvParameters : RtpParameters<VideoCodec> {
-};
-
-class VideoMediaChannel : public MediaChannel {
- public:
-  enum Error {
-    ERROR_NONE = 0,                       // No error.
-    ERROR_OTHER,                          // Other errors.
-    ERROR_REC_DEVICE_OPEN_FAILED = 100,   // Could not open camera.
-    ERROR_REC_DEVICE_NO_DEVICE,           // No camera.
-    ERROR_REC_DEVICE_IN_USE,              // Device is in already use.
-    ERROR_REC_DEVICE_REMOVED,             // Device is removed.
-    ERROR_REC_SRTP_ERROR,                 // Generic sender SRTP failure.
-    ERROR_REC_SRTP_AUTH_FAILED,           // Failed to authenticate packets.
-    ERROR_REC_CPU_MAX_CANT_DOWNGRADE,     // Can't downgrade capture anymore.
-    ERROR_PLAY_SRTP_ERROR = 200,          // Generic receiver SRTP failure.
-    ERROR_PLAY_SRTP_AUTH_FAILED,          // Failed to authenticate packets.
-    ERROR_PLAY_SRTP_REPLAY,               // Packet replay detected.
-  };
-
-  VideoMediaChannel() {}
-  explicit VideoMediaChannel(const MediaConfig& config)
-      : MediaChannel(config) {}
-  virtual ~VideoMediaChannel() {}
-
-  virtual bool SetSendParameters(const VideoSendParameters& params) = 0;
-  virtual bool SetRecvParameters(const VideoRecvParameters& params) = 0;
-  virtual webrtc::RtpParameters GetRtpSendParameters(uint32_t ssrc) const = 0;
-  virtual bool SetRtpSendParameters(
-      uint32_t ssrc,
-      const webrtc::RtpParameters& parameters) = 0;
-  // Get the receive parameters for the incoming stream identified by |ssrc|.
-  // If |ssrc| is 0, retrieve the receive parameters for the default receive
-  // stream, which is used when SSRCs are not signaled. Note that calling with
-  // an |ssrc| of 0 will return encoding parameters with an unset |ssrc|
-  // member.
-  virtual webrtc::RtpParameters GetRtpReceiveParameters(
-      uint32_t ssrc) const = 0;
-  virtual bool SetRtpReceiveParameters(
-      uint32_t ssrc,
-      const webrtc::RtpParameters& parameters) = 0;
-  // Gets the currently set codecs/payload types to be used for outgoing media.
-  virtual bool GetSendCodec(VideoCodec* send_codec) = 0;
-  // Starts or stops transmission (and potentially capture) of local video.
-  virtual bool SetSend(bool send) = 0;
-  // Configure stream for sending and register a source.
-  // The |ssrc| must correspond to a registered send stream.
-  virtual bool SetVideoSend(
-      uint32_t ssrc,
-      bool enable,
-      const VideoOptions* options,
-      rtc::VideoSourceInterface<webrtc::VideoFrame>* source) = 0;
-  // Sets the sink object to be used for the specified stream.
-  // If SSRC is 0, the sink is used for the 'default' stream.
-  virtual bool SetSink(uint32_t ssrc,
-                       rtc::VideoSinkInterface<webrtc::VideoFrame>* sink) = 0;
-  // This fills the "bitrate parts" (rtx, video bitrate) of the
-  // BandwidthEstimationInfo, since that part that isn't possible to get
-  // through webrtc::Call::GetStats, as they are statistics of the send
-  // streams.
-  // TODO(holmer): We should change this so that either BWE graphs doesn't
-  // need access to bitrates of the streams, or change the (RTC)StatsCollector
-  // so that it's getting the send stream stats separately by calling
-  // GetStats(), and merges with BandwidthEstimationInfo by itself.
-  virtual void FillBitrateInfo(BandwidthEstimationInfo* bwe_info) = 0;
-  // Gets quality stats for the channel.
-  virtual bool GetStats(VideoMediaInfo* info) = 0;
-};
-
-enum DataMessageType {
-  // Chrome-Internal use only.  See SctpDataMediaChannel for the actual PPID
-  // values.
-  DMT_NONE = 0,
-  DMT_CONTROL = 1,
-  DMT_BINARY = 2,
-  DMT_TEXT = 3,
-};
-
-// Info about data received in DataMediaChannel.  For use in
-// DataMediaChannel::SignalDataReceived and in all of the signals that
-// signal fires, on up the chain.
-struct ReceiveDataParams {
-  // The in-packet stream indentifier.
-  // RTP data channels use SSRCs, SCTP data channels use SIDs.
-  union {
-    uint32_t ssrc;
-    int sid;
-  };
-  // The type of message (binary, text, or control).
-  DataMessageType type;
-  // A per-stream value incremented per packet in the stream.
-  int seq_num;
-  // A per-stream value monotonically increasing with time.
-  int timestamp;
-
-  ReceiveDataParams() : sid(0), type(DMT_TEXT), seq_num(0), timestamp(0) {}
-};
-
-struct SendDataParams {
-  // The in-packet stream indentifier.
-  // RTP data channels use SSRCs, SCTP data channels use SIDs.
-  union {
-    uint32_t ssrc;
-    int sid;
-  };
-  // The type of message (binary, text, or control).
-  DataMessageType type;
-
-  // For SCTP, whether to send messages flagged as ordered or not.
-  // If false, messages can be received out of order.
-  bool ordered;
-  // For SCTP, whether the messages are sent reliably or not.
-  // If false, messages may be lost.
-  bool reliable;
-  // For SCTP, if reliable == false, provide partial reliability by
-  // resending up to this many times.  Either count or millis
-  // is supported, not both at the same time.
-  int max_rtx_count;
-  // For SCTP, if reliable == false, provide partial reliability by
-  // resending for up to this many milliseconds.  Either count or millis
-  // is supported, not both at the same time.
-  int max_rtx_ms;
-
-  SendDataParams()
-      : sid(0),
-        type(DMT_TEXT),
-        // TODO(pthatcher): Make these true by default?
-        ordered(false),
-        reliable(false),
-        max_rtx_count(0),
-        max_rtx_ms(0) {}
-};
-
-enum SendDataResult { SDR_SUCCESS, SDR_ERROR, SDR_BLOCK };
-
-struct DataSendParameters : RtpSendParameters<DataCodec> {
-  std::string ToString() const {
-    std::ostringstream ost;
-    // Options and extensions aren't used.
-    ost << "{";
-    ost << "codecs: " << VectorToString(codecs) << ", ";
-    ost << "max_bandwidth_bps: " << max_bandwidth_bps;
-    ost << "}";
-    return ost.str();
-  }
-};
-
-struct DataRecvParameters : RtpParameters<DataCodec> {
-};
-
-class DataMediaChannel : public MediaChannel {
- public:
-  enum Error {
-    ERROR_NONE = 0,                       // No error.
-    ERROR_OTHER,                          // Other errors.
-    ERROR_SEND_SRTP_ERROR = 200,          // Generic SRTP failure.
-    ERROR_SEND_SRTP_AUTH_FAILED,          // Failed to authenticate packets.
-    ERROR_RECV_SRTP_ERROR,                // Generic SRTP failure.
-    ERROR_RECV_SRTP_AUTH_FAILED,          // Failed to authenticate packets.
-    ERROR_RECV_SRTP_REPLAY,               // Packet replay detected.
-  };
-
-  DataMediaChannel() {}
-  DataMediaChannel(const MediaConfig& config) : MediaChannel(config) {}
-  virtual ~DataMediaChannel() {}
-
-  virtual bool SetSendParameters(const DataSendParameters& params) = 0;
-  virtual bool SetRecvParameters(const DataRecvParameters& params) = 0;
-
-  // TODO(pthatcher): Implement this.
-  virtual bool GetStats(DataMediaInfo* info) { return true; }
-
-  virtual bool SetSend(bool send) = 0;
-  virtual bool SetReceive(bool receive) = 0;
-
-  virtual void OnNetworkRouteChanged(const std::string& transport_name,
-                                     const rtc::NetworkRoute& network_route) {}
-
-  virtual bool SendData(
-      const SendDataParams& params,
-      const rtc::CopyOnWriteBuffer& payload,
-      SendDataResult* result = NULL) = 0;
-  // Signals when data is received (params, data, len)
-  sigslot::signal3<const ReceiveDataParams&,
-                   const char*,
-                   size_t> SignalDataReceived;
-  // Signal when the media channel is ready to send the stream. Arguments are:
-  //     writable(bool)
-  sigslot::signal1<bool> SignalReadyToSend;
-};
-
-}  // namespace cricket
-
-#endif  // WEBRTC_MEDIA_BASE_MEDIACHANNEL_H_
diff --git a/media/base/mediaconstants.cc b/media/base/mediaconstants.cc
deleted file mode 100644
index 759c183..0000000
--- a/media/base/mediaconstants.cc
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- *  Copyright (c) 2012 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/media/base/mediaconstants.h"
-
-#include <string>
-
-namespace cricket {
-
-const int kVideoCodecClockrate = 90000;
-const int kDataCodecClockrate = 90000;
-const int kDataMaxBandwidth = 30720;  // bps
-
-const float kHighSystemCpuThreshold = 0.85f;
-const float kLowSystemCpuThreshold = 0.65f;
-const float kProcessCpuThreshold = 0.10f;
-
-const char kRtxCodecName[] = "rtx";
-const char kRedCodecName[] = "red";
-const char kUlpfecCodecName[] = "ulpfec";
-
-// TODO(brandtr): Change this to 'flexfec' when we are confident that the
-// header format is not changing anymore.
-const char kFlexfecCodecName[] = "flexfec-03";
-
-// draft-ietf-payload-flexible-fec-scheme-02.txt
-const char kFlexfecFmtpRepairWindow[] = "repair-window";
-
-const char kCodecParamAssociatedPayloadType[] = "apt";
-
-const char kOpusCodecName[] = "opus";
-const char kIsacCodecName[] = "ISAC";
-const char kL16CodecName[]  = "L16";
-const char kG722CodecName[] = "G722";
-const char kIlbcCodecName[] = "ILBC";
-const char kPcmuCodecName[] = "PCMU";
-const char kPcmaCodecName[] = "PCMA";
-const char kCnCodecName[]   = "CN";
-const char kDtmfCodecName[] = "telephone-event";
-
-// draft-spittka-payload-rtp-opus-03.txt
-const char kCodecParamPTime[] = "ptime";
-const char kCodecParamMaxPTime[] = "maxptime";
-const char kCodecParamMinPTime[] = "minptime";
-const char kCodecParamSPropStereo[] = "sprop-stereo";
-const char kCodecParamStereo[] = "stereo";
-const char kCodecParamUseInbandFec[] = "useinbandfec";
-const char kCodecParamUseDtx[] = "usedtx";
-const char kCodecParamMaxAverageBitrate[] = "maxaveragebitrate";
-const char kCodecParamMaxPlaybackRate[] = "maxplaybackrate";
-
-const char kCodecParamSctpProtocol[] = "protocol";
-const char kCodecParamSctpStreams[] = "streams";
-
-const char kParamValueTrue[] = "1";
-const char kParamValueEmpty[] = "";
-
-const int kOpusDefaultMaxPTime = 120;
-const int kOpusDefaultPTime = 20;
-const int kOpusDefaultMinPTime = 3;
-const int kOpusDefaultSPropStereo = 0;
-const int kOpusDefaultStereo = 0;
-const int kOpusDefaultUseInbandFec = 0;
-const int kOpusDefaultUseDtx = 0;
-const int kOpusDefaultMaxPlaybackRate = 48000;
-
-const int kPreferredMaxPTime = 120;
-const int kPreferredMinPTime = 10;
-const int kPreferredSPropStereo = 0;
-const int kPreferredStereo = 0;
-const int kPreferredUseInbandFec = 0;
-
-const char kRtcpFbParamNack[] = "nack";
-const char kRtcpFbNackParamPli[] = "pli";
-const char kRtcpFbParamRemb[] = "goog-remb";
-const char kRtcpFbParamTransportCc[] = "transport-cc";
-
-const char kRtcpFbParamCcm[] = "ccm";
-const char kRtcpFbCcmParamFir[] = "fir";
-const char kCodecParamMaxBitrate[] = "x-google-max-bitrate";
-const char kCodecParamMinBitrate[] = "x-google-min-bitrate";
-const char kCodecParamStartBitrate[] = "x-google-start-bitrate";
-const char kCodecParamMaxQuantization[] = "x-google-max-quantization";
-const char kCodecParamPort[] = "x-google-port";
-
-const int kGoogleRtpDataCodecPlType = 109;
-const char kGoogleRtpDataCodecName[] = "google-data";
-
-const int kGoogleSctpDataCodecPlType = 108;
-const char kGoogleSctpDataCodecName[] = "google-sctp-data";
-
-const char kComfortNoiseCodecName[] = "CN";
-
-const char kVp8CodecName[] = "VP8";
-const char kVp9CodecName[] = "VP9";
-const char kH264CodecName[] = "H264";
-
-// RFC 6184 RTP Payload Format for H.264 video
-const char kH264FmtpProfileLevelId[] = "profile-level-id";
-const char kH264FmtpLevelAsymmetryAllowed[] = "level-asymmetry-allowed";
-const char kH264FmtpPacketizationMode[] = "packetization-mode";
-const char kH264FmtpSpropParameterSets[] = "sprop-parameter-sets";
-const char kH264ProfileLevelConstrainedBaseline[] = "42e01f";
-
-const int kDefaultVideoMaxFramerate = 60;
-}  // namespace cricket
diff --git a/media/base/mediaconstants.h b/media/base/mediaconstants.h
deleted file mode 100644
index 44d8c7e..0000000
--- a/media/base/mediaconstants.h
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
- *  Copyright (c) 2012 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_MEDIA_BASE_MEDIACONSTANTS_H_
-#define WEBRTC_MEDIA_BASE_MEDIACONSTANTS_H_
-
-#include <string>
-
-// This file contains constants related to media.
-
-namespace cricket {
-
-extern const int kVideoCodecClockrate;
-extern const int kDataCodecClockrate;
-extern const int kDataMaxBandwidth;  // bps
-
-// Default CPU thresholds.
-extern const float kHighSystemCpuThreshold;
-extern const float kLowSystemCpuThreshold;
-extern const float kProcessCpuThreshold;
-
-extern const char kRtxCodecName[];
-extern const char kRedCodecName[];
-extern const char kUlpfecCodecName[];
-extern const char kFlexfecCodecName[];
-
-extern const char kFlexfecFmtpRepairWindow[];
-
-// Codec parameters
-extern const char kCodecParamAssociatedPayloadType[];
-
-extern const char kOpusCodecName[];
-extern const char kIsacCodecName[];
-extern const char kL16CodecName[];
-extern const char kG722CodecName[];
-extern const char kIlbcCodecName[];
-extern const char kPcmuCodecName[];
-extern const char kPcmaCodecName[];
-extern const char kCnCodecName[];
-extern const char kDtmfCodecName[];
-
-// Attribute parameters
-extern const char kCodecParamPTime[];
-extern const char kCodecParamMaxPTime[];
-// fmtp parameters
-extern const char kCodecParamMinPTime[];
-extern const char kCodecParamSPropStereo[];
-extern const char kCodecParamStereo[];
-extern const char kCodecParamUseInbandFec[];
-extern const char kCodecParamUseDtx[];
-extern const char kCodecParamMaxAverageBitrate[];
-extern const char kCodecParamMaxPlaybackRate[];
-extern const char kCodecParamSctpProtocol[];
-extern const char kCodecParamSctpStreams[];
-
-extern const char kParamValueTrue[];
-// Parameters are stored as parameter/value pairs. For parameters who do not
-// have a value, |kParamValueEmpty| should be used as value.
-extern const char kParamValueEmpty[];
-
-// opus parameters.
-// Default value for maxptime according to
-// http://tools.ietf.org/html/draft-spittka-payload-rtp-opus-03
-extern const int kOpusDefaultMaxPTime;
-extern const int kOpusDefaultPTime;
-extern const int kOpusDefaultMinPTime;
-extern const int kOpusDefaultSPropStereo;
-extern const int kOpusDefaultStereo;
-extern const int kOpusDefaultUseInbandFec;
-extern const int kOpusDefaultUseDtx;
-extern const int kOpusDefaultMaxPlaybackRate;
-
-// Prefered values in this code base. Note that they may differ from the default
-// values in http://tools.ietf.org/html/draft-spittka-payload-rtp-opus-03
-// Only frames larger or equal to 10 ms are currently supported in this code
-// base.
-extern const int kPreferredMaxPTime;
-extern const int kPreferredMinPTime;
-extern const int kPreferredSPropStereo;
-extern const int kPreferredStereo;
-extern const int kPreferredUseInbandFec;
-
-// rtcp-fb messages according to RFC 4585
-extern const char kRtcpFbParamNack[];
-extern const char kRtcpFbNackParamPli[];
-// rtcp-fb messages according to
-// http://tools.ietf.org/html/draft-alvestrand-rmcat-remb-00
-extern const char kRtcpFbParamRemb[];
-// rtcp-fb messages according to
-// https://tools.ietf.org/html/draft-holmer-rmcat-transport-wide-cc-extensions-01
-extern const char kRtcpFbParamTransportCc[];
-// ccm submessages according to RFC 5104
-extern const char kRtcpFbParamCcm[];
-extern const char kRtcpFbCcmParamFir[];
-// Google specific parameters
-extern const char kCodecParamMaxBitrate[];
-extern const char kCodecParamMinBitrate[];
-extern const char kCodecParamStartBitrate[];
-extern const char kCodecParamMaxQuantization[];
-extern const char kCodecParamPort[];
-
-// We put the data codec names here so callers of DataEngine::CreateChannel
-// don't have to import rtpdataengine.h to get the codec names they want to
-// pass in.
-extern const int kGoogleRtpDataCodecPlType;
-extern const char kGoogleRtpDataCodecName[];
-
-// TODO(pthatcher): Find an id that won't conflict with anything.  On
-// the other hand, it really shouldn't matter since the id won't be
-// used on the wire.
-extern const int kGoogleSctpDataCodecPlType;
-extern const char kGoogleSctpDataCodecName[];
-
-extern const char kComfortNoiseCodecName[];
-
-extern const char kVp8CodecName[];
-extern const char kVp9CodecName[];
-extern const char kH264CodecName[];
-
-// RFC 6184 RTP Payload Format for H.264 video
-extern const char kH264FmtpProfileLevelId[];
-extern const char kH264FmtpLevelAsymmetryAllowed[];
-extern const char kH264FmtpPacketizationMode[];
-extern const char kH264FmtpSpropParameterSets[];
-extern const char kH264ProfileLevelConstrainedBaseline[];
-
-extern const int kDefaultVideoMaxFramerate;
-}  // namespace cricket
-
-#endif  // WEBRTC_MEDIA_BASE_MEDIACONSTANTS_H_
diff --git a/media/base/mediaengine.cc b/media/base/mediaengine.cc
deleted file mode 100644
index fda7fac..0000000
--- a/media/base/mediaengine.cc
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- *  Copyright (c) 2004 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/media/base/mediaengine.h"
-
-#if !defined(DISABLE_MEDIA_ENGINE_FACTORY)
-
-#if defined(HAVE_WEBRTC_VOICE) && defined(HAVE_WEBRTC_VIDEO)
-#include "webrtc/media/engine/webrtcmediaengine.h"
-#endif  // HAVE_WEBRTC_VOICE && HAVE_WEBRTC_VIDEO
-
-namespace cricket {
-
-MediaEngineFactory::MediaEngineCreateFunction
-    MediaEngineFactory::create_function_ = NULL;
-
-MediaEngineFactory::MediaEngineCreateFunction
-    MediaEngineFactory::SetCreateFunction(MediaEngineCreateFunction function) {
-  MediaEngineCreateFunction old_function = create_function_;
-  create_function_ = function;
-  return old_function;
-}
-
-};  // namespace cricket
-
-#endif  // DISABLE_MEDIA_ENGINE_FACTORY
-
-namespace cricket {
-
-webrtc::RtpParameters CreateRtpParametersWithOneEncoding() {
-  webrtc::RtpParameters parameters;
-  webrtc::RtpEncodingParameters encoding;
-  parameters.encodings.push_back(encoding);
-  return parameters;
-}
-
-};  // namespace cricket
diff --git a/media/base/mediaengine.h b/media/base/mediaengine.h
deleted file mode 100644
index 52a55f9..0000000
--- a/media/base/mediaengine.h
+++ /dev/null
@@ -1,186 +0,0 @@
-/*
- *  Copyright (c) 2004 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_MEDIA_BASE_MEDIAENGINE_H_
-#define WEBRTC_MEDIA_BASE_MEDIAENGINE_H_
-
-#if defined(WEBRTC_MAC) && !defined(WEBRTC_IOS)
-#include <CoreAudio/CoreAudio.h>
-#endif
-
-#include <string>
-#include <vector>
-
-#include "webrtc/api/audio_codecs/audio_decoder_factory.h"
-#include "webrtc/api/audio_codecs/audio_encoder_factory.h"
-#include "webrtc/api/rtpparameters.h"
-#include "webrtc/call/audio_state.h"
-#include "webrtc/media/base/codec.h"
-#include "webrtc/media/base/mediachannel.h"
-#include "webrtc/media/base/videocommon.h"
-#include "webrtc/rtc_base/fileutils.h"
-
-#if defined(GOOGLE_CHROME_BUILD) || defined(CHROMIUM_BUILD)
-#define DISABLE_MEDIA_ENGINE_FACTORY
-#endif
-
-namespace webrtc {
-class AudioDeviceModule;
-class AudioMixer;
-class AudioProcessing;
-class Call;
-}
-
-namespace cricket {
-
-struct RtpCapabilities {
-  std::vector<webrtc::RtpExtension> header_extensions;
-};
-
-// MediaEngineInterface is an abstraction of a media engine which can be
-// subclassed to support different media componentry backends.
-// It supports voice and video operations in the same class to facilitate
-// proper synchronization between both media types.
-class MediaEngineInterface {
- public:
-  virtual ~MediaEngineInterface() {}
-
-  // Initialization
-  // Starts the engine.
-  virtual bool Init() = 0;
-  // TODO(solenberg): Remove once VoE API refactoring is done.
-  virtual rtc::scoped_refptr<webrtc::AudioState> GetAudioState() const = 0;
-
-  // MediaChannel creation
-  // Creates a voice media channel. Returns NULL on failure.
-  virtual VoiceMediaChannel* CreateChannel(webrtc::Call* call,
-                                           const MediaConfig& config,
-                                           const AudioOptions& options) = 0;
-  // Creates a video media channel, paired with the specified voice channel.
-  // Returns NULL on failure.
-  virtual VideoMediaChannel* CreateVideoChannel(
-      webrtc::Call* call,
-      const MediaConfig& config,
-      const VideoOptions& options) = 0;
-
-  // Gets the current microphone level, as a value between 0 and 10.
-  virtual int GetInputLevel() = 0;
-
-  virtual const std::vector<AudioCodec>& audio_send_codecs() = 0;
-  virtual const std::vector<AudioCodec>& audio_recv_codecs() = 0;
-  virtual RtpCapabilities GetAudioCapabilities() = 0;
-  virtual std::vector<VideoCodec> video_codecs() = 0;
-  virtual RtpCapabilities GetVideoCapabilities() = 0;
-
-  // Starts AEC dump using existing file, a maximum file size in bytes can be
-  // specified. Logging is stopped just before the size limit is exceeded.
-  // If max_size_bytes is set to a value <= 0, no limit will be used.
-  virtual bool StartAecDump(rtc::PlatformFile file, int64_t max_size_bytes) = 0;
-
-  // Stops recording AEC dump.
-  virtual void StopAecDump() = 0;
-};
-
-
-#if !defined(DISABLE_MEDIA_ENGINE_FACTORY)
-class MediaEngineFactory {
- public:
-  typedef cricket::MediaEngineInterface* (*MediaEngineCreateFunction)();
-  // Creates a media engine, using either the compiled system default or the
-  // creation function specified in SetCreateFunction, if specified.
-  static MediaEngineInterface* Create();
-  // Sets the function used when calling Create. If unset, the compiled system
-  // default will be used. Returns the old create function, or NULL if one
-  // wasn't set. Likewise, NULL can be used as the |function| parameter to
-  // reset to the default behavior.
-  static MediaEngineCreateFunction SetCreateFunction(
-      MediaEngineCreateFunction function);
- private:
-  static MediaEngineCreateFunction create_function_;
-};
-#endif
-
-// CompositeMediaEngine constructs a MediaEngine from separate
-// voice and video engine classes.
-template <class VOICE, class VIDEO>
-class CompositeMediaEngine : public MediaEngineInterface {
- public:
-  template <class... Args1, class... Args2>
-  CompositeMediaEngine(std::tuple<Args1...> first_args,
-                       std::tuple<Args2...> second_args)
-      : engines_(std::piecewise_construct,
-                 std::move(first_args),
-                 std::move(second_args)) {}
-
-  virtual ~CompositeMediaEngine() {}
-  virtual bool Init() {
-    voice().Init();
-    return true;
-  }
-
-  virtual rtc::scoped_refptr<webrtc::AudioState> GetAudioState() const {
-    return voice().GetAudioState();
-  }
-  virtual VoiceMediaChannel* CreateChannel(webrtc::Call* call,
-                                           const MediaConfig& config,
-                                           const AudioOptions& options) {
-    return voice().CreateChannel(call, config, options);
-  }
-  virtual VideoMediaChannel* CreateVideoChannel(webrtc::Call* call,
-                                                const MediaConfig& config,
-                                                const VideoOptions& options) {
-    return video().CreateChannel(call, config, options);
-  }
-
-  virtual int GetInputLevel() { return voice().GetInputLevel(); }
-  virtual const std::vector<AudioCodec>& audio_send_codecs() {
-    return voice().send_codecs();
-  }
-  virtual const std::vector<AudioCodec>& audio_recv_codecs() {
-    return voice().recv_codecs();
-  }
-  virtual RtpCapabilities GetAudioCapabilities() {
-    return voice().GetCapabilities();
-  }
-  virtual std::vector<VideoCodec> video_codecs() { return video().codecs(); }
-  virtual RtpCapabilities GetVideoCapabilities() {
-    return video().GetCapabilities();
-  }
-
-  virtual bool StartAecDump(rtc::PlatformFile file, int64_t max_size_bytes) {
-    return voice().StartAecDump(file, max_size_bytes);
-  }
-
-  virtual void StopAecDump() { voice().StopAecDump(); }
-
- protected:
-  VOICE& voice() { return engines_.first; }
-  VIDEO& video() { return engines_.second; }
-  const VOICE& voice() const { return engines_.first; }
-  const VIDEO& video() const { return engines_.second; }
-
- private:
-  std::pair<VOICE, VIDEO> engines_;
-};
-
-enum DataChannelType { DCT_NONE = 0, DCT_RTP = 1, DCT_SCTP = 2, DCT_QUIC = 3 };
-
-class DataEngineInterface {
- public:
-  virtual ~DataEngineInterface() {}
-  virtual DataMediaChannel* CreateChannel(const MediaConfig& config) = 0;
-  virtual const std::vector<DataCodec>& data_codecs() = 0;
-};
-
-webrtc::RtpParameters CreateRtpParametersWithOneEncoding();
-
-}  // namespace cricket
-
-#endif  // WEBRTC_MEDIA_BASE_MEDIAENGINE_H_
diff --git a/media/base/rtpdataengine.cc b/media/base/rtpdataengine.cc
deleted file mode 100644
index d7aa32f..0000000
--- a/media/base/rtpdataengine.cc
+++ /dev/null
@@ -1,350 +0,0 @@
-/*
- *  Copyright (c) 2012 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/media/base/rtpdataengine.h"
-
-#include "webrtc/media/base/codec.h"
-#include "webrtc/media/base/mediaconstants.h"
-#include "webrtc/media/base/rtputils.h"
-#include "webrtc/media/base/streamparams.h"
-#include "webrtc/rtc_base/copyonwritebuffer.h"
-#include "webrtc/rtc_base/helpers.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/ratelimiter.h"
-#include "webrtc/rtc_base/sanitizer.h"
-#include "webrtc/rtc_base/stringutils.h"
-
-namespace cricket {
-
-// We want to avoid IP fragmentation.
-static const size_t kDataMaxRtpPacketLen = 1200U;
-// We reserve space after the RTP header for future wiggle room.
-static const unsigned char kReservedSpace[] = {
-  0x00, 0x00, 0x00, 0x00
-};
-
-// Amount of overhead SRTP may take.  We need to leave room in the
-// buffer for it, otherwise SRTP will fail later.  If SRTP ever uses
-// more than this, we need to increase this number.
-static const size_t kMaxSrtpHmacOverhead = 16;
-
-RtpDataEngine::RtpDataEngine() {
-  data_codecs_.push_back(
-      DataCodec(kGoogleRtpDataCodecPlType, kGoogleRtpDataCodecName));
-}
-
-DataMediaChannel* RtpDataEngine::CreateChannel(
-    const MediaConfig& config) {
-  return new RtpDataMediaChannel(config);
-}
-
-static const DataCodec* FindCodecByName(const std::vector<DataCodec>& codecs,
-                                        const std::string& name) {
-  for (const DataCodec& codec : codecs) {
-    if (_stricmp(name.c_str(), codec.name.c_str()) == 0)
-      return &codec;
-  }
-  return nullptr;
-}
-
-RtpDataMediaChannel::RtpDataMediaChannel(const MediaConfig& config)
-    : DataMediaChannel(config) {
-  Construct();
-}
-
-void RtpDataMediaChannel::Construct() {
-  sending_ = false;
-  receiving_ = false;
-  send_limiter_.reset(new rtc::RateLimiter(kDataMaxBandwidth / 8, 1.0));
-}
-
-
-RtpDataMediaChannel::~RtpDataMediaChannel() {
-  std::map<uint32_t, RtpClock*>::const_iterator iter;
-  for (iter = rtp_clock_by_send_ssrc_.begin();
-       iter != rtp_clock_by_send_ssrc_.end();
-       ++iter) {
-    delete iter->second;
-  }
-}
-
-void RTC_NO_SANITIZE("float-cast-overflow")  // bugs.webrtc.org/8204
-RtpClock::Tick(double now, int* seq_num, uint32_t* timestamp) {
-  *seq_num = ++last_seq_num_;
-  *timestamp = timestamp_offset_ + static_cast<uint32_t>(now * clockrate_);
-  // UBSan: 5.92374e+10 is outside the range of representable values of type
-  // 'unsigned int'
-}
-
-const DataCodec* FindUnknownCodec(const std::vector<DataCodec>& codecs) {
-  DataCodec data_codec(kGoogleRtpDataCodecPlType, kGoogleRtpDataCodecName);
-  std::vector<DataCodec>::const_iterator iter;
-  for (iter = codecs.begin(); iter != codecs.end(); ++iter) {
-    if (!iter->Matches(data_codec)) {
-      return &(*iter);
-    }
-  }
-  return NULL;
-}
-
-const DataCodec* FindKnownCodec(const std::vector<DataCodec>& codecs) {
-  DataCodec data_codec(kGoogleRtpDataCodecPlType, kGoogleRtpDataCodecName);
-  std::vector<DataCodec>::const_iterator iter;
-  for (iter = codecs.begin(); iter != codecs.end(); ++iter) {
-    if (iter->Matches(data_codec)) {
-      return &(*iter);
-    }
-  }
-  return NULL;
-}
-
-bool RtpDataMediaChannel::SetRecvCodecs(const std::vector<DataCodec>& codecs) {
-  const DataCodec* unknown_codec = FindUnknownCodec(codecs);
-  if (unknown_codec) {
-    LOG(LS_WARNING) << "Failed to SetRecvCodecs because of unknown codec: "
-                    << unknown_codec->ToString();
-    return false;
-  }
-
-  recv_codecs_ = codecs;
-  return true;
-}
-
-bool RtpDataMediaChannel::SetSendCodecs(const std::vector<DataCodec>& codecs) {
-  const DataCodec* known_codec = FindKnownCodec(codecs);
-  if (!known_codec) {
-    LOG(LS_WARNING) <<
-        "Failed to SetSendCodecs because there is no known codec.";
-    return false;
-  }
-
-  send_codecs_ = codecs;
-  return true;
-}
-
-bool RtpDataMediaChannel::SetSendParameters(const DataSendParameters& params) {
-  return (SetSendCodecs(params.codecs) &&
-          SetMaxSendBandwidth(params.max_bandwidth_bps));
-}
-
-bool RtpDataMediaChannel::SetRecvParameters(const DataRecvParameters& params) {
-  return SetRecvCodecs(params.codecs);
-}
-
-bool RtpDataMediaChannel::AddSendStream(const StreamParams& stream) {
-  if (!stream.has_ssrcs()) {
-    return false;
-  }
-
-  if (GetStreamBySsrc(send_streams_, stream.first_ssrc())) {
-    LOG(LS_WARNING) << "Not adding data send stream '" << stream.id
-                    << "' with ssrc=" << stream.first_ssrc()
-                    << " because stream already exists.";
-    return false;
-  }
-
-  send_streams_.push_back(stream);
-  // TODO(pthatcher): This should be per-stream, not per-ssrc.
-  // And we should probably allow more than one per stream.
-  rtp_clock_by_send_ssrc_[stream.first_ssrc()] = new RtpClock(
-      kDataCodecClockrate,
-      rtc::CreateRandomNonZeroId(), rtc::CreateRandomNonZeroId());
-
-  LOG(LS_INFO) << "Added data send stream '" << stream.id
-               << "' with ssrc=" << stream.first_ssrc();
-  return true;
-}
-
-bool RtpDataMediaChannel::RemoveSendStream(uint32_t ssrc) {
-  if (!GetStreamBySsrc(send_streams_, ssrc)) {
-    return false;
-  }
-
-  RemoveStreamBySsrc(&send_streams_, ssrc);
-  delete rtp_clock_by_send_ssrc_[ssrc];
-  rtp_clock_by_send_ssrc_.erase(ssrc);
-  return true;
-}
-
-bool RtpDataMediaChannel::AddRecvStream(const StreamParams& stream) {
-  if (!stream.has_ssrcs()) {
-    return false;
-  }
-
-  if (GetStreamBySsrc(recv_streams_, stream.first_ssrc())) {
-    LOG(LS_WARNING) << "Not adding data recv stream '" << stream.id
-                    << "' with ssrc=" << stream.first_ssrc()
-                    << " because stream already exists.";
-    return false;
-  }
-
-  recv_streams_.push_back(stream);
-  LOG(LS_INFO) << "Added data recv stream '" << stream.id
-               << "' with ssrc=" << stream.first_ssrc();
-  return true;
-}
-
-bool RtpDataMediaChannel::RemoveRecvStream(uint32_t ssrc) {
-  RemoveStreamBySsrc(&recv_streams_, ssrc);
-  return true;
-}
-
-void RtpDataMediaChannel::OnPacketReceived(
-    rtc::CopyOnWriteBuffer* packet, const rtc::PacketTime& packet_time) {
-  RtpHeader header;
-  if (!GetRtpHeader(packet->cdata(), packet->size(), &header)) {
-    // Don't want to log for every corrupt packet.
-    // LOG(LS_WARNING) << "Could not read rtp header from packet of length "
-    //                 << packet->length() << ".";
-    return;
-  }
-
-  size_t header_length;
-  if (!GetRtpHeaderLen(packet->cdata(), packet->size(), &header_length)) {
-    // Don't want to log for every corrupt packet.
-    // LOG(LS_WARNING) << "Could not read rtp header"
-    //                 << length from packet of length "
-    //                 << packet->length() << ".";
-    return;
-  }
-  const char* data =
-      packet->cdata<char>() + header_length + sizeof(kReservedSpace);
-  size_t data_len = packet->size() - header_length - sizeof(kReservedSpace);
-
-  if (!receiving_) {
-    LOG(LS_WARNING) << "Not receiving packet "
-                    << header.ssrc << ":" << header.seq_num
-                    << " before SetReceive(true) called.";
-    return;
-  }
-
-  if (!FindCodecById(recv_codecs_, header.payload_type)) {
-    // For bundling, this will be logged for every message.
-    // So disable this logging.
-    // LOG(LS_WARNING) << "Not receiving packet "
-    //                << header.ssrc << ":" << header.seq_num
-    //                << " (" << data_len << ")"
-    //                << " because unknown payload id: " << header.payload_type;
-    return;
-  }
-
-  if (!GetStreamBySsrc(recv_streams_, header.ssrc)) {
-    LOG(LS_WARNING) << "Received packet for unknown ssrc: " << header.ssrc;
-    return;
-  }
-
-  // Uncomment this for easy debugging.
-  // const auto* found_stream = GetStreamBySsrc(recv_streams_, header.ssrc);
-  // LOG(LS_INFO) << "Received packet"
-  //              << " groupid=" << found_stream.groupid
-  //              << ", ssrc=" << header.ssrc
-  //              << ", seqnum=" << header.seq_num
-  //              << ", timestamp=" << header.timestamp
-  //              << ", len=" << data_len;
-
-  ReceiveDataParams params;
-  params.ssrc = header.ssrc;
-  params.seq_num = header.seq_num;
-  params.timestamp = header.timestamp;
-  SignalDataReceived(params, data, data_len);
-}
-
-bool RtpDataMediaChannel::SetMaxSendBandwidth(int bps) {
-  if (bps <= 0) {
-    bps = kDataMaxBandwidth;
-  }
-  send_limiter_.reset(new rtc::RateLimiter(bps / 8, 1.0));
-  LOG(LS_INFO) << "RtpDataMediaChannel::SetSendBandwidth to " << bps << "bps.";
-  return true;
-}
-
-bool RtpDataMediaChannel::SendData(
-    const SendDataParams& params,
-    const rtc::CopyOnWriteBuffer& payload,
-    SendDataResult* result) {
-  if (result) {
-    // If we return true, we'll set this to SDR_SUCCESS.
-    *result = SDR_ERROR;
-  }
-  if (!sending_) {
-    LOG(LS_WARNING) << "Not sending packet with ssrc=" << params.ssrc
-                    << " len=" << payload.size() << " before SetSend(true).";
-    return false;
-  }
-
-  if (params.type != cricket::DMT_TEXT) {
-    LOG(LS_WARNING) << "Not sending data because binary type is unsupported.";
-    return false;
-  }
-
-  const StreamParams* found_stream =
-      GetStreamBySsrc(send_streams_, params.ssrc);
-  if (!found_stream) {
-    LOG(LS_WARNING) << "Not sending data because ssrc is unknown: "
-                    << params.ssrc;
-    return false;
-  }
-
-  const DataCodec* found_codec =
-      FindCodecByName(send_codecs_, kGoogleRtpDataCodecName);
-  if (!found_codec) {
-    LOG(LS_WARNING) << "Not sending data because codec is unknown: "
-                    << kGoogleRtpDataCodecName;
-    return false;
-  }
-
-  size_t packet_len = (kMinRtpPacketLen + sizeof(kReservedSpace) +
-                       payload.size() + kMaxSrtpHmacOverhead);
-  if (packet_len > kDataMaxRtpPacketLen) {
-    return false;
-  }
-
-  double now =
-      rtc::TimeMicros() / static_cast<double>(rtc::kNumMicrosecsPerSec);
-
-  if (!send_limiter_->CanUse(packet_len, now)) {
-    LOG(LS_VERBOSE) << "Dropped data packet of len=" << packet_len
-                    << "; already sent " << send_limiter_->used_in_period()
-                    << "/" << send_limiter_->max_per_period();
-    return false;
-  }
-
-  RtpHeader header;
-  header.payload_type = found_codec->id;
-  header.ssrc = params.ssrc;
-  rtp_clock_by_send_ssrc_[header.ssrc]->Tick(
-      now, &header.seq_num, &header.timestamp);
-
-  rtc::CopyOnWriteBuffer packet(kMinRtpPacketLen, packet_len);
-  if (!SetRtpHeader(packet.data(), packet.size(), header)) {
-    return false;
-  }
-  packet.AppendData(kReservedSpace);
-  packet.AppendData(payload);
-
-  LOG(LS_VERBOSE) << "Sent RTP data packet: "
-                  << " stream=" << found_stream->id << " ssrc=" << header.ssrc
-                  << ", seqnum=" << header.seq_num
-                  << ", timestamp=" << header.timestamp
-                  << ", len=" << payload.size();
-
-  MediaChannel::SendPacket(&packet, rtc::PacketOptions());
-  send_limiter_->Use(packet_len, now);
-  if (result) {
-    *result = SDR_SUCCESS;
-  }
-  return true;
-}
-
-rtc::DiffServCodePoint RtpDataMediaChannel::PreferredDscp() const {
-  return rtc::DSCP_AF41;
-}
-
-}  // namespace cricket
diff --git a/media/base/rtpdataengine.h b/media/base/rtpdataengine.h
deleted file mode 100644
index ca43494..0000000
--- a/media/base/rtpdataengine.h
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- *  Copyright (c) 2012 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_MEDIA_BASE_RTPDATAENGINE_H_
-#define WEBRTC_MEDIA_BASE_RTPDATAENGINE_H_
-
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "webrtc/media/base/mediachannel.h"
-#include "webrtc/media/base/mediaconstants.h"
-#include "webrtc/media/base/mediaengine.h"
-
-namespace cricket {
-
-struct DataCodec;
-
-class RtpDataEngine : public DataEngineInterface {
- public:
-  RtpDataEngine();
-
-  virtual DataMediaChannel* CreateChannel(const MediaConfig& config);
-
-  virtual const std::vector<DataCodec>& data_codecs() {
-    return data_codecs_;
-  }
-
- private:
-  std::vector<DataCodec> data_codecs_;
-};
-
-// Keep track of sequence number and timestamp of an RTP stream.  The
-// sequence number starts with a "random" value and increments.  The
-// timestamp starts with a "random" value and increases monotonically
-// according to the clockrate.
-class RtpClock {
- public:
-  RtpClock(int clockrate, uint16_t first_seq_num, uint32_t timestamp_offset)
-      : clockrate_(clockrate),
-        last_seq_num_(first_seq_num),
-        timestamp_offset_(timestamp_offset) {}
-
-  // Given the current time (in number of seconds which must be
-  // monotonically increasing), Return the next sequence number and
-  // timestamp.
-  void Tick(double now, int* seq_num, uint32_t* timestamp);
-
- private:
-  int clockrate_;
-  uint16_t last_seq_num_;
-  uint32_t timestamp_offset_;
-};
-
-class RtpDataMediaChannel : public DataMediaChannel {
- public:
-  RtpDataMediaChannel(const MediaConfig& config);
-  virtual ~RtpDataMediaChannel();
-
-  virtual bool SetSendParameters(const DataSendParameters& params);
-  virtual bool SetRecvParameters(const DataRecvParameters& params);
-  virtual bool AddSendStream(const StreamParams& sp);
-  virtual bool RemoveSendStream(uint32_t ssrc);
-  virtual bool AddRecvStream(const StreamParams& sp);
-  virtual bool RemoveRecvStream(uint32_t ssrc);
-  virtual bool SetSend(bool send) {
-    sending_ = send;
-    return true;
-  }
-  virtual bool SetReceive(bool receive) {
-    receiving_ = receive;
-    return true;
-  }
-  virtual void OnPacketReceived(rtc::CopyOnWriteBuffer* packet,
-                                const rtc::PacketTime& packet_time);
-  virtual void OnRtcpReceived(rtc::CopyOnWriteBuffer* packet,
-                              const rtc::PacketTime& packet_time) {}
-  virtual void OnReadyToSend(bool ready) {}
-  virtual void OnTransportOverheadChanged(int transport_overhead_per_packet) {}
-  virtual bool SendData(
-    const SendDataParams& params,
-    const rtc::CopyOnWriteBuffer& payload,
-    SendDataResult* result);
-  virtual rtc::DiffServCodePoint PreferredDscp() const;
-
- private:
-  void Construct();
-  bool SetMaxSendBandwidth(int bps);
-  bool SetSendCodecs(const std::vector<DataCodec>& codecs);
-  bool SetRecvCodecs(const std::vector<DataCodec>& codecs);
-
-  bool sending_;
-  bool receiving_;
-  std::vector<DataCodec> send_codecs_;
-  std::vector<DataCodec> recv_codecs_;
-  std::vector<StreamParams> send_streams_;
-  std::vector<StreamParams> recv_streams_;
-  std::map<uint32_t, RtpClock*> rtp_clock_by_send_ssrc_;
-  std::unique_ptr<rtc::RateLimiter> send_limiter_;
-};
-
-}  // namespace cricket
-
-#endif  // WEBRTC_MEDIA_BASE_RTPDATAENGINE_H_
diff --git a/media/base/rtpdataengine_unittest.cc b/media/base/rtpdataengine_unittest.cc
deleted file mode 100644
index a06040a..0000000
--- a/media/base/rtpdataengine_unittest.cc
+++ /dev/null
@@ -1,377 +0,0 @@
-/*
- *  Copyright (c) 2012 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 <memory>
-#include <string>
-
-#include "webrtc/media/base/fakenetworkinterface.h"
-#include "webrtc/media/base/mediaconstants.h"
-#include "webrtc/media/base/rtpdataengine.h"
-#include "webrtc/media/base/rtputils.h"
-#include "webrtc/rtc_base/copyonwritebuffer.h"
-#include "webrtc/rtc_base/gunit.h"
-#include "webrtc/rtc_base/helpers.h"
-#include "webrtc/rtc_base/ssladapter.h"
-
-class FakeDataReceiver : public sigslot::has_slots<> {
- public:
-  FakeDataReceiver() : has_received_data_(false) {}
-
-  void OnDataReceived(
-      const cricket::ReceiveDataParams& params,
-      const char* data, size_t len) {
-    has_received_data_ = true;
-    last_received_data_ = std::string(data, len);
-    last_received_data_len_ = len;
-    last_received_data_params_ = params;
-  }
-
-  bool has_received_data() const { return has_received_data_; }
-  std::string last_received_data() const { return last_received_data_; }
-  size_t last_received_data_len() const { return last_received_data_len_; }
-  cricket::ReceiveDataParams last_received_data_params() const {
-    return last_received_data_params_;
-  }
-
- private:
-  bool has_received_data_;
-  std::string last_received_data_;
-  size_t last_received_data_len_;
-  cricket::ReceiveDataParams last_received_data_params_;
-};
-
-class RtpDataMediaChannelTest : public testing::Test {
- protected:
-  virtual void SetUp() {
-    // Seed needed for each test to satisfy expectations.
-    iface_.reset(new cricket::FakeNetworkInterface());
-    dme_.reset(CreateEngine());
-    receiver_.reset(new FakeDataReceiver());
-  }
-
-  void SetNow(double now) {
-    clock_.SetTimeNanos(now * rtc::kNumNanosecsPerSec);
-  }
-
-  cricket::RtpDataEngine* CreateEngine() {
-    cricket::RtpDataEngine* dme = new cricket::RtpDataEngine();
-    return dme;
-  }
-
-  cricket::RtpDataMediaChannel* CreateChannel() {
-    return CreateChannel(dme_.get());
-  }
-
-  cricket::RtpDataMediaChannel* CreateChannel(cricket::RtpDataEngine* dme) {
-    cricket::MediaConfig config;
-    cricket::RtpDataMediaChannel* channel =
-        static_cast<cricket::RtpDataMediaChannel*>(dme->CreateChannel(config));
-    channel->SetInterface(iface_.get());
-    channel->SignalDataReceived.connect(
-        receiver_.get(), &FakeDataReceiver::OnDataReceived);
-    return channel;
-  }
-
-  FakeDataReceiver* receiver() {
-    return receiver_.get();
-  }
-
-  bool HasReceivedData() {
-    return receiver_->has_received_data();
-  }
-
-  std::string GetReceivedData() {
-    return receiver_->last_received_data();
-  }
-
-  size_t GetReceivedDataLen() {
-    return receiver_->last_received_data_len();
-  }
-
-  cricket::ReceiveDataParams GetReceivedDataParams() {
-    return receiver_->last_received_data_params();
-  }
-
-  bool HasSentData(int count) {
-    return (iface_->NumRtpPackets() > count);
-  }
-
-  std::string GetSentData(int index) {
-    // Assume RTP header of length 12
-    std::unique_ptr<const rtc::CopyOnWriteBuffer> packet(
-        iface_->GetRtpPacket(index));
-    if (packet->size() > 12) {
-      return std::string(packet->data<char>() + 12, packet->size() - 12);
-    } else {
-      return "";
-    }
-  }
-
-  cricket::RtpHeader GetSentDataHeader(int index) {
-    std::unique_ptr<const rtc::CopyOnWriteBuffer> packet(
-        iface_->GetRtpPacket(index));
-    cricket::RtpHeader header;
-    GetRtpHeader(packet->data(), packet->size(), &header);
-    return header;
-  }
-
- private:
-  std::unique_ptr<cricket::RtpDataEngine> dme_;
-  rtc::ScopedFakeClock clock_;
-  std::unique_ptr<cricket::FakeNetworkInterface> iface_;
-  std::unique_ptr<FakeDataReceiver> receiver_;
-};
-
-TEST_F(RtpDataMediaChannelTest, SetUnknownCodecs) {
-  std::unique_ptr<cricket::RtpDataMediaChannel> dmc(CreateChannel());
-
-  cricket::DataCodec known_codec;
-  known_codec.id = 103;
-  known_codec.name = "google-data";
-  cricket::DataCodec unknown_codec;
-  unknown_codec.id = 104;
-  unknown_codec.name = "unknown-data";
-
-  cricket::DataSendParameters send_parameters_known;
-  send_parameters_known.codecs.push_back(known_codec);
-  cricket::DataRecvParameters recv_parameters_known;
-  recv_parameters_known.codecs.push_back(known_codec);
-
-  cricket::DataSendParameters send_parameters_unknown;
-  send_parameters_unknown.codecs.push_back(unknown_codec);
-  cricket::DataRecvParameters recv_parameters_unknown;
-  recv_parameters_unknown.codecs.push_back(unknown_codec);
-
-  cricket::DataSendParameters send_parameters_mixed;
-  send_parameters_mixed.codecs.push_back(known_codec);
-  send_parameters_mixed.codecs.push_back(unknown_codec);
-  cricket::DataRecvParameters recv_parameters_mixed;
-  recv_parameters_mixed.codecs.push_back(known_codec);
-  recv_parameters_mixed.codecs.push_back(unknown_codec);
-
-  EXPECT_TRUE(dmc->SetSendParameters(send_parameters_known));
-  EXPECT_FALSE(dmc->SetSendParameters(send_parameters_unknown));
-  EXPECT_TRUE(dmc->SetSendParameters(send_parameters_mixed));
-  EXPECT_TRUE(dmc->SetRecvParameters(recv_parameters_known));
-  EXPECT_FALSE(dmc->SetRecvParameters(recv_parameters_unknown));
-  EXPECT_FALSE(dmc->SetRecvParameters(recv_parameters_mixed));
-}
-
-TEST_F(RtpDataMediaChannelTest, AddRemoveSendStream) {
-  std::unique_ptr<cricket::RtpDataMediaChannel> dmc(CreateChannel());
-
-  cricket::StreamParams stream1;
-  stream1.add_ssrc(41);
-  EXPECT_TRUE(dmc->AddSendStream(stream1));
-  cricket::StreamParams stream2;
-  stream2.add_ssrc(42);
-  EXPECT_TRUE(dmc->AddSendStream(stream2));
-
-  EXPECT_TRUE(dmc->RemoveSendStream(41));
-  EXPECT_TRUE(dmc->RemoveSendStream(42));
-  EXPECT_FALSE(dmc->RemoveSendStream(43));
-}
-
-TEST_F(RtpDataMediaChannelTest, AddRemoveRecvStream) {
-  std::unique_ptr<cricket::RtpDataMediaChannel> dmc(CreateChannel());
-
-  cricket::StreamParams stream1;
-  stream1.add_ssrc(41);
-  EXPECT_TRUE(dmc->AddRecvStream(stream1));
-  cricket::StreamParams stream2;
-  stream2.add_ssrc(42);
-  EXPECT_TRUE(dmc->AddRecvStream(stream2));
-  EXPECT_FALSE(dmc->AddRecvStream(stream2));
-
-  EXPECT_TRUE(dmc->RemoveRecvStream(41));
-  EXPECT_TRUE(dmc->RemoveRecvStream(42));
-}
-
-TEST_F(RtpDataMediaChannelTest, SendData) {
-  std::unique_ptr<cricket::RtpDataMediaChannel> dmc(CreateChannel());
-
-  cricket::SendDataParams params;
-  params.ssrc = 42;
-  unsigned char data[] = "food";
-  rtc::CopyOnWriteBuffer payload(data, 4);
-  unsigned char padded_data[] = {
-    0x00, 0x00, 0x00, 0x00,
-    'f', 'o', 'o', 'd',
-  };
-  cricket::SendDataResult result;
-
-  // Not sending
-  EXPECT_FALSE(dmc->SendData(params, payload, &result));
-  EXPECT_EQ(cricket::SDR_ERROR, result);
-  EXPECT_FALSE(HasSentData(0));
-  ASSERT_TRUE(dmc->SetSend(true));
-
-  // Unknown stream name.
-  EXPECT_FALSE(dmc->SendData(params, payload, &result));
-  EXPECT_EQ(cricket::SDR_ERROR, result);
-  EXPECT_FALSE(HasSentData(0));
-
-  cricket::StreamParams stream;
-  stream.add_ssrc(42);
-  ASSERT_TRUE(dmc->AddSendStream(stream));
-
-  // Unknown codec;
-  EXPECT_FALSE(dmc->SendData(params, payload, &result));
-  EXPECT_EQ(cricket::SDR_ERROR, result);
-  EXPECT_FALSE(HasSentData(0));
-
-  cricket::DataCodec codec;
-  codec.id = 103;
-  codec.name = cricket::kGoogleRtpDataCodecName;
-  cricket::DataSendParameters parameters;
-  parameters.codecs.push_back(codec);
-  ASSERT_TRUE(dmc->SetSendParameters(parameters));
-
-  // Length too large;
-  std::string x10000(10000, 'x');
-  EXPECT_FALSE(dmc->SendData(
-      params, rtc::CopyOnWriteBuffer(x10000.data(), x10000.length()), &result));
-  EXPECT_EQ(cricket::SDR_ERROR, result);
-  EXPECT_FALSE(HasSentData(0));
-
-  // Finally works!
-  EXPECT_TRUE(dmc->SendData(params, payload, &result));
-  EXPECT_EQ(cricket::SDR_SUCCESS, result);
-  ASSERT_TRUE(HasSentData(0));
-  EXPECT_EQ(sizeof(padded_data), GetSentData(0).length());
-  EXPECT_EQ(0, memcmp(
-      padded_data, GetSentData(0).data(), sizeof(padded_data)));
-  cricket::RtpHeader header0 = GetSentDataHeader(0);
-  EXPECT_NE(0, header0.seq_num);
-  EXPECT_NE(0U, header0.timestamp);
-  EXPECT_EQ(header0.ssrc, 42U);
-  EXPECT_EQ(header0.payload_type, 103);
-
-  // Should bump timestamp by 180000 because the clock rate is 90khz.
-  SetNow(2);
-
-  EXPECT_TRUE(dmc->SendData(params, payload, &result));
-  ASSERT_TRUE(HasSentData(1));
-  EXPECT_EQ(sizeof(padded_data), GetSentData(1).length());
-  EXPECT_EQ(0, memcmp(
-      padded_data, GetSentData(1).data(), sizeof(padded_data)));
-  cricket::RtpHeader header1 = GetSentDataHeader(1);
-  EXPECT_EQ(header1.ssrc, 42U);
-  EXPECT_EQ(header1.payload_type, 103);
-  EXPECT_EQ(static_cast<uint16_t>(header0.seq_num + 1),
-            static_cast<uint16_t>(header1.seq_num));
-  EXPECT_EQ(header0.timestamp + 180000, header1.timestamp);
-}
-
-TEST_F(RtpDataMediaChannelTest, SendDataRate) {
-  std::unique_ptr<cricket::RtpDataMediaChannel> dmc(CreateChannel());
-
-  ASSERT_TRUE(dmc->SetSend(true));
-
-  cricket::DataCodec codec;
-  codec.id = 103;
-  codec.name = cricket::kGoogleRtpDataCodecName;
-  cricket::DataSendParameters parameters;
-  parameters.codecs.push_back(codec);
-  ASSERT_TRUE(dmc->SetSendParameters(parameters));
-
-  cricket::StreamParams stream;
-  stream.add_ssrc(42);
-  ASSERT_TRUE(dmc->AddSendStream(stream));
-
-  cricket::SendDataParams params;
-  params.ssrc = 42;
-  unsigned char data[] = "food";
-  rtc::CopyOnWriteBuffer payload(data, 4);
-  cricket::SendDataResult result;
-
-  // With rtp overhead of 32 bytes, each one of our packets is 36
-  // bytes, or 288 bits.  So, a limit of 872bps will allow 3 packets,
-  // but not four.
-  parameters.max_bandwidth_bps = 872;
-  ASSERT_TRUE(dmc->SetSendParameters(parameters));
-
-  EXPECT_TRUE(dmc->SendData(params, payload, &result));
-  EXPECT_TRUE(dmc->SendData(params, payload, &result));
-  EXPECT_TRUE(dmc->SendData(params, payload, &result));
-  EXPECT_FALSE(dmc->SendData(params, payload, &result));
-  EXPECT_FALSE(dmc->SendData(params, payload, &result));
-
-  SetNow(0.9);
-  EXPECT_FALSE(dmc->SendData(params, payload, &result));
-
-  SetNow(1.1);
-  EXPECT_TRUE(dmc->SendData(params, payload, &result));
-  EXPECT_TRUE(dmc->SendData(params, payload, &result));
-  SetNow(1.9);
-  EXPECT_TRUE(dmc->SendData(params, payload, &result));
-
-  SetNow(2.2);
-  EXPECT_TRUE(dmc->SendData(params, payload, &result));
-  EXPECT_TRUE(dmc->SendData(params, payload, &result));
-  EXPECT_TRUE(dmc->SendData(params, payload, &result));
-  EXPECT_FALSE(dmc->SendData(params, payload, &result));
-}
-
-TEST_F(RtpDataMediaChannelTest, ReceiveData) {
-  // PT= 103, SN=2, TS=3, SSRC = 4, data = "abcde"
-  unsigned char data[] = {
-    0x80, 0x67, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x2A,
-    0x00, 0x00, 0x00, 0x00,
-    'a', 'b', 'c', 'd', 'e'
-  };
-  rtc::CopyOnWriteBuffer packet(data, sizeof(data));
-
-  std::unique_ptr<cricket::RtpDataMediaChannel> dmc(CreateChannel());
-
-  // SetReceived not called.
-  dmc->OnPacketReceived(&packet, rtc::PacketTime());
-  EXPECT_FALSE(HasReceivedData());
-
-  dmc->SetReceive(true);
-
-  // Unknown payload id
-  dmc->OnPacketReceived(&packet, rtc::PacketTime());
-  EXPECT_FALSE(HasReceivedData());
-
-  cricket::DataCodec codec;
-  codec.id = 103;
-  codec.name = cricket::kGoogleRtpDataCodecName;
-  cricket::DataRecvParameters parameters;
-  parameters.codecs.push_back(codec);
-  ASSERT_TRUE(dmc->SetRecvParameters(parameters));
-
-  // Unknown stream
-  dmc->OnPacketReceived(&packet, rtc::PacketTime());
-  EXPECT_FALSE(HasReceivedData());
-
-  cricket::StreamParams stream;
-  stream.add_ssrc(42);
-  ASSERT_TRUE(dmc->AddRecvStream(stream));
-
-  // Finally works!
-  dmc->OnPacketReceived(&packet, rtc::PacketTime());
-  EXPECT_TRUE(HasReceivedData());
-  EXPECT_EQ("abcde", GetReceivedData());
-  EXPECT_EQ(5U, GetReceivedDataLen());
-}
-
-TEST_F(RtpDataMediaChannelTest, InvalidRtpPackets) {
-  unsigned char data[] = {
-    0x80, 0x65, 0x00, 0x02
-  };
-  rtc::CopyOnWriteBuffer packet(data, sizeof(data));
-
-  std::unique_ptr<cricket::RtpDataMediaChannel> dmc(CreateChannel());
-
-  // Too short
-  dmc->OnPacketReceived(&packet, rtc::PacketTime());
-  EXPECT_FALSE(HasReceivedData());
-}
diff --git a/media/base/rtputils.cc b/media/base/rtputils.cc
deleted file mode 100644
index ea1c919..0000000
--- a/media/base/rtputils.cc
+++ /dev/null
@@ -1,473 +0,0 @@
-/*
- *  Copyright (c) 2011 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/media/base/rtputils.h"
-
-// PacketTimeUpdateParams is defined in asyncpacketsocket.h.
-// TODO(sergeyu): Find more appropriate place for PacketTimeUpdateParams.
-#include "webrtc/media/base/turnutils.h"
-#include "webrtc/rtc_base/asyncpacketsocket.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/messagedigest.h"
-
-namespace cricket {
-
-static const uint8_t kRtpVersion = 2;
-static const size_t kRtpFlagsOffset = 0;
-static const size_t kRtpPayloadTypeOffset = 1;
-static const size_t kRtpSeqNumOffset = 2;
-static const size_t kRtpTimestampOffset = 4;
-static const size_t kRtpSsrcOffset = 8;
-static const size_t kRtcpPayloadTypeOffset = 1;
-static const size_t kRtpExtensionHeaderLen = 4;
-static const size_t kAbsSendTimeExtensionLen = 3;
-static const size_t kOneByteExtensionHeaderLen = 1;
-
-namespace {
-
-// Fake auth tag written by the sender when external authentication is enabled.
-// HMAC in packet will be compared against this value before updating packet
-// with actual HMAC value.
-static const uint8_t kFakeAuthTag[10] = {
-    0xba, 0xdd, 0xba, 0xdd, 0xba, 0xdd, 0xba, 0xdd, 0xba, 0xdd
-};
-
-void UpdateAbsSendTimeExtensionValue(uint8_t* extension_data,
-                                     size_t length,
-                                     uint64_t time_us) {
-  // Absolute send time in RTP streams.
-  //
-  // The absolute send time is signaled to the receiver in-band using the
-  // general mechanism for RTP header extensions [RFC5285]. The payload
-  // of this extension (the transmitted value) is a 24-bit unsigned integer
-  // containing the sender's current time in seconds as a fixed point number
-  // with 18 bits fractional part.
-  //
-  // The form of the absolute send time extension block:
-  //
-  //    0                   1                   2                   3
-  //    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
-  //   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-  //   |  ID   | len=2 |              absolute send time               |
-  //   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-  if (length != kAbsSendTimeExtensionLen) {
-    RTC_NOTREACHED();
-    return;
-  }
-
-  // Convert microseconds to a 6.18 fixed point value in seconds.
-  uint32_t send_time = ((time_us << 18) / 1000000) & 0x00FFFFFF;
-  extension_data[0] = static_cast<uint8_t>(send_time >> 16);
-  extension_data[1] = static_cast<uint8_t>(send_time >> 8);
-  extension_data[2] = static_cast<uint8_t>(send_time);
-}
-
-// Assumes |length| is actual packet length + tag length. Updates HMAC at end of
-// the RTP packet.
-void UpdateRtpAuthTag(uint8_t* rtp,
-                      size_t length,
-                      const rtc::PacketTimeUpdateParams& packet_time_params) {
-  // If there is no key, return.
-  if (packet_time_params.srtp_auth_key.empty()) {
-    return;
-  }
-
-  size_t tag_length = packet_time_params.srtp_auth_tag_len;
-
-  // ROC (rollover counter) is at the beginning of the auth tag.
-  const size_t kRocLength = 4;
-  if (tag_length < kRocLength || tag_length > length) {
-    RTC_NOTREACHED();
-    return;
-  }
-
-  uint8_t* auth_tag = rtp + (length - tag_length);
-
-  // We should have a fake HMAC value @ auth_tag.
-  RTC_DCHECK_EQ(0, memcmp(auth_tag, kFakeAuthTag, tag_length));
-
-  // Copy ROC after end of rtp packet.
-  memcpy(auth_tag, &packet_time_params.srtp_packet_index, kRocLength);
-  // Authentication of a RTP packet will have RTP packet + ROC size.
-  size_t auth_required_length = length - tag_length + kRocLength;
-
-  uint8_t output[64];
-  size_t result = rtc::ComputeHmac(
-      rtc::DIGEST_SHA_1, &packet_time_params.srtp_auth_key[0],
-      packet_time_params.srtp_auth_key.size(), rtp,
-      auth_required_length, output, sizeof(output));
-
-  if (result < tag_length) {
-    RTC_NOTREACHED();
-    return;
-  }
-
-  // Copy HMAC from output to packet. This is required as auth tag length
-  // may not be equal to the actual HMAC length.
-  memcpy(auth_tag, output, tag_length);
-}
-
-}
-
-bool GetUint8(const void* data, size_t offset, int* value) {
-  if (!data || !value) {
-    return false;
-  }
-  *value = *(static_cast<const uint8_t*>(data) + offset);
-  return true;
-}
-
-bool GetUint16(const void* data, size_t offset, int* value) {
-  if (!data || !value) {
-    return false;
-  }
-  *value = static_cast<int>(
-      rtc::GetBE16(static_cast<const uint8_t*>(data) + offset));
-  return true;
-}
-
-bool GetUint32(const void* data, size_t offset, uint32_t* value) {
-  if (!data || !value) {
-    return false;
-  }
-  *value = rtc::GetBE32(static_cast<const uint8_t*>(data) + offset);
-  return true;
-}
-
-bool SetUint8(void* data, size_t offset, uint8_t value) {
-  if (!data) {
-    return false;
-  }
-  rtc::Set8(data, offset, value);
-  return true;
-}
-
-bool SetUint16(void* data, size_t offset, uint16_t value) {
-  if (!data) {
-    return false;
-  }
-  rtc::SetBE16(static_cast<uint8_t*>(data) + offset, value);
-  return true;
-}
-
-bool SetUint32(void* data, size_t offset, uint32_t value) {
-  if (!data) {
-    return false;
-  }
-  rtc::SetBE32(static_cast<uint8_t*>(data) + offset, value);
-  return true;
-}
-
-bool GetRtpFlags(const void* data, size_t len, int* value) {
-  if (len < kMinRtpPacketLen) {
-    return false;
-  }
-  return GetUint8(data, kRtpFlagsOffset, value);
-}
-
-bool GetRtpPayloadType(const void* data, size_t len, int* value) {
-  if (len < kMinRtpPacketLen) {
-    return false;
-  }
-  if (!GetUint8(data, kRtpPayloadTypeOffset, value)) {
-    return false;
-  }
-  *value &= 0x7F;
-  return true;
-}
-
-bool GetRtpSeqNum(const void* data, size_t len, int* value) {
-  if (len < kMinRtpPacketLen) {
-    return false;
-  }
-  return GetUint16(data, kRtpSeqNumOffset, value);
-}
-
-bool GetRtpTimestamp(const void* data, size_t len, uint32_t* value) {
-  if (len < kMinRtpPacketLen) {
-    return false;
-  }
-  return GetUint32(data, kRtpTimestampOffset, value);
-}
-
-bool GetRtpSsrc(const void* data, size_t len, uint32_t* value) {
-  if (len < kMinRtpPacketLen) {
-    return false;
-  }
-  return GetUint32(data, kRtpSsrcOffset, value);
-}
-
-bool GetRtpHeaderLen(const void* data, size_t len, size_t* value) {
-  if (!data || len < kMinRtpPacketLen || !value) return false;
-  const uint8_t* header = static_cast<const uint8_t*>(data);
-  // Get base header size + length of CSRCs (not counting extension yet).
-  size_t header_size = kMinRtpPacketLen + (header[0] & 0xF) * sizeof(uint32_t);
-  if (len < header_size) return false;
-  // If there's an extension, read and add in the extension size.
-  if (header[0] & 0x10) {
-    if (len < header_size + sizeof(uint32_t))
-      return false;
-    header_size +=
-        ((rtc::GetBE16(header + header_size + 2) + 1) * sizeof(uint32_t));
-    if (len < header_size) return false;
-  }
-  *value = header_size;
-  return true;
-}
-
-bool GetRtpHeader(const void* data, size_t len, RtpHeader* header) {
-  return (GetRtpPayloadType(data, len, &(header->payload_type)) &&
-          GetRtpSeqNum(data, len, &(header->seq_num)) &&
-          GetRtpTimestamp(data, len, &(header->timestamp)) &&
-          GetRtpSsrc(data, len, &(header->ssrc)));
-}
-
-bool GetRtcpType(const void* data, size_t len, int* value) {
-  if (len < kMinRtcpPacketLen) {
-    return false;
-  }
-  return GetUint8(data, kRtcpPayloadTypeOffset, value);
-}
-
-// This method returns SSRC first of RTCP packet, except if packet is SDES.
-// TODO(mallinath) - Fully implement RFC 5506. This standard doesn't restrict
-// to send non-compound packets only to feedback messages.
-bool GetRtcpSsrc(const void* data, size_t len, uint32_t* value) {
-  // Packet should be at least of 8 bytes, to get SSRC from a RTCP packet.
-  if (!data || len < kMinRtcpPacketLen + 4 || !value) return false;
-  int pl_type;
-  if (!GetRtcpType(data, len, &pl_type)) return false;
-  // SDES packet parsing is not supported.
-  if (pl_type == kRtcpTypeSDES) return false;
-  *value = rtc::GetBE32(static_cast<const uint8_t*>(data) + 4);
-  return true;
-}
-
-bool SetRtpSsrc(void* data, size_t len, uint32_t value) {
-  return SetUint32(data, kRtpSsrcOffset, value);
-}
-
-// Assumes version 2, no padding, no extensions, no csrcs.
-bool SetRtpHeader(void* data, size_t len, const RtpHeader& header) {
-  if (!IsValidRtpPayloadType(header.payload_type) ||
-      header.seq_num < 0 || header.seq_num > UINT16_MAX) {
-    return false;
-  }
-  return (SetUint8(data, kRtpFlagsOffset, kRtpVersion << 6) &&
-          SetUint8(data, kRtpPayloadTypeOffset, header.payload_type & 0x7F) &&
-          SetUint16(data, kRtpSeqNumOffset,
-                    static_cast<uint16_t>(header.seq_num)) &&
-          SetUint32(data, kRtpTimestampOffset, header.timestamp) &&
-          SetRtpSsrc(data, len, header.ssrc));
-}
-
-bool IsRtpPacket(const void* data, size_t len) {
-  if (len < kMinRtpPacketLen)
-    return false;
-
-  return (static_cast<const uint8_t*>(data)[0] >> 6) == kRtpVersion;
-}
-
-bool IsValidRtpPayloadType(int payload_type) {
-  return payload_type >= 0 && payload_type <= 127;
-}
-
-bool IsValidRtpRtcpPacketSize(bool rtcp, size_t size) {
-  return (rtcp ? size >= kMinRtcpPacketLen : size >= kMinRtpPacketLen) &&
-         size <= kMaxRtpPacketLen;
-}
-
-const char* RtpRtcpStringLiteral(bool rtcp) {
-  return rtcp ? "RTCP" : "RTP";
-}
-
-bool ValidateRtpHeader(const uint8_t* rtp,
-                       size_t length,
-                       size_t* header_length) {
-  if (header_length) {
-    *header_length = 0;
-  }
-
-  if (length < kMinRtpPacketLen) {
-    return false;
-  }
-
-  size_t cc_count = rtp[0] & 0x0F;
-  size_t header_length_without_extension = kMinRtpPacketLen + 4 * cc_count;
-  if (header_length_without_extension > length) {
-    return false;
-  }
-
-  // If extension bit is not set, we are done with header processing, as input
-  // length is verified above.
-  if (!(rtp[0] & 0x10)) {
-    if (header_length)
-      *header_length = header_length_without_extension;
-
-    return true;
-  }
-
-  rtp += header_length_without_extension;
-
-  if (header_length_without_extension + kRtpExtensionHeaderLen > length) {
-    return false;
-  }
-
-  // Getting extension profile length.
-  // Length is in 32 bit words.
-  uint16_t extension_length_in_32bits = rtc::GetBE16(rtp + 2);
-  size_t extension_length = extension_length_in_32bits * 4;
-
-  size_t rtp_header_length = extension_length +
-                             header_length_without_extension +
-                             kRtpExtensionHeaderLen;
-
-  // Verify input length against total header size.
-  if (rtp_header_length > length) {
-    return false;
-  }
-
-  if (header_length) {
-    *header_length = rtp_header_length;
-  }
-  return true;
-}
-
-// ValidateRtpHeader() must be called before this method to make sure, we have
-// a sane rtp packet.
-bool UpdateRtpAbsSendTimeExtension(uint8_t* rtp,
-                                   size_t length,
-                                   int extension_id,
-                                   uint64_t time_us) {
-  //  0                   1                   2                   3
-  //  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
-  // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-  // |V=2|P|X|  CC   |M|     PT      |       sequence number         |
-  // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-  // |                           timestamp                           |
-  // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-  // |           synchronization source (SSRC) identifier            |
-  // +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
-  // |            contributing source (CSRC) identifiers             |
-  // |                             ....                              |
-  // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-
-  // Return if extension bit is not set.
-  if (!(rtp[0] & 0x10)) {
-    return true;
-  }
-
-  size_t cc_count = rtp[0] & 0x0F;
-  size_t header_length_without_extension = kMinRtpPacketLen + 4 * cc_count;
-
-  rtp += header_length_without_extension;
-
-  // Getting extension profile ID and length.
-  uint16_t profile_id = rtc::GetBE16(rtp);
-  // Length is in 32 bit words.
-  uint16_t extension_length_in_32bits = rtc::GetBE16(rtp + 2);
-  size_t extension_length = extension_length_in_32bits * 4;
-
-  rtp += kRtpExtensionHeaderLen;  // Moving past extension header.
-
-  bool found = false;
-  // WebRTC is using one byte header extension.
-  // TODO(mallinath) - Handle two byte header extension.
-  if (profile_id == 0xBEDE) {  // OneByte extension header
-    //  0
-    //  0 1 2 3 4 5 6 7
-    // +-+-+-+-+-+-+-+-+
-    // |  ID   |length |
-    // +-+-+-+-+-+-+-+-+
-
-    //  0                   1                   2                   3
-    //  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
-    // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-    // |       0xBE    |    0xDE       |           length=3            |
-    // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-    // |  ID   | L=0   |     data      |  ID   |  L=1  |   data...
-    // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-    //       ...data   |    0 (pad)    |    0 (pad)    |  ID   | L=3   |
-    // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-    // |                          data                                 |
-    // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-    const uint8_t* extension_start = rtp;
-    const uint8_t* extension_end = extension_start + extension_length;
-
-    while (rtp < extension_end) {
-      const int id = (*rtp & 0xF0) >> 4;
-      const size_t length = (*rtp & 0x0F) + 1;
-      if (rtp + kOneByteExtensionHeaderLen + length > extension_end) {
-        return false;
-      }
-      // The 4-bit length is the number minus one of data bytes of this header
-      // extension element following the one-byte header.
-      if (id == extension_id) {
-        UpdateAbsSendTimeExtensionValue(rtp + kOneByteExtensionHeaderLen,
-                                        length, time_us);
-        found = true;
-        break;
-      }
-      rtp += kOneByteExtensionHeaderLen + length;
-      // Counting padding bytes.
-      while ((rtp < extension_end) && (*rtp == 0)) {
-        ++rtp;
-      }
-    }
-  }
-  return found;
-}
-
-bool ApplyPacketOptions(uint8_t* data,
-                        size_t length,
-                        const rtc::PacketTimeUpdateParams& packet_time_params,
-                        uint64_t time_us) {
-  RTC_DCHECK(data);
-  RTC_DCHECK(length);
-
-  // if there is no valid |rtp_sendtime_extension_id| and |srtp_auth_key| in
-  // PacketOptions, nothing to be updated in this packet.
-  if (packet_time_params.rtp_sendtime_extension_id == -1 &&
-      packet_time_params.srtp_auth_key.empty()) {
-    return true;
-  }
-
-  // If there is a srtp auth key present then the packet must be an RTP packet.
-  // RTP packet may have been wrapped in a TURN Channel Data or TURN send
-  // indication.
-  size_t rtp_start_pos;
-  size_t rtp_length;
-  if (!UnwrapTurnPacket(data, length, &rtp_start_pos, &rtp_length)) {
-    RTC_NOTREACHED();
-    return false;
-  }
-
-  // Making sure we have a valid RTP packet at the end.
-  if (!IsRtpPacket(data + rtp_start_pos, rtp_length) ||
-      !ValidateRtpHeader(data + rtp_start_pos, rtp_length, nullptr)) {
-    RTC_NOTREACHED();
-    return false;
-  }
-
-  uint8_t* start = data + rtp_start_pos;
-  // If packet option has non default value (-1) for sendtime extension id,
-  // then we should parse the rtp packet to update the timestamp. Otherwise
-  // just calculate HMAC and update packet with it.
-  if (packet_time_params.rtp_sendtime_extension_id != -1) {
-    UpdateRtpAbsSendTimeExtension(start, rtp_length,
-                                  packet_time_params.rtp_sendtime_extension_id,
-                                  time_us);
-  }
-
-  UpdateRtpAuthTag(start, rtp_length, packet_time_params);
-  return true;
-}
-
-}  // namespace cricket
diff --git a/media/base/rtputils.h b/media/base/rtputils.h
deleted file mode 100644
index a823cf7..0000000
--- a/media/base/rtputils.h
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- *  Copyright (c) 2011 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_MEDIA_BASE_RTPUTILS_H_
-#define WEBRTC_MEDIA_BASE_RTPUTILS_H_
-
-#include "webrtc/rtc_base/byteorder.h"
-
-namespace rtc {
-struct PacketTimeUpdateParams;
-}  // namespace rtc
-
-namespace cricket {
-
-const size_t kMinRtpPacketLen = 12;
-const size_t kMaxRtpPacketLen = 2048;
-const size_t kMinRtcpPacketLen = 4;
-
-struct RtpHeader {
-  int payload_type;
-  int seq_num;
-  uint32_t timestamp;
-  uint32_t ssrc;
-};
-
-enum RtcpTypes {
-  kRtcpTypeSR = 200,      // Sender report payload type.
-  kRtcpTypeRR = 201,      // Receiver report payload type.
-  kRtcpTypeSDES = 202,    // SDES payload type.
-  kRtcpTypeBye = 203,     // BYE payload type.
-  kRtcpTypeApp = 204,     // APP payload type.
-  kRtcpTypeRTPFB = 205,   // Transport layer Feedback message payload type.
-  kRtcpTypePSFB = 206,    // Payload-specific Feedback message payload type.
-};
-
-bool GetRtpPayloadType(const void* data, size_t len, int* value);
-bool GetRtpSeqNum(const void* data, size_t len, int* value);
-bool GetRtpTimestamp(const void* data, size_t len, uint32_t* value);
-bool GetRtpSsrc(const void* data, size_t len, uint32_t* value);
-bool GetRtpHeaderLen(const void* data, size_t len, size_t* value);
-bool GetRtcpType(const void* data, size_t len, int* value);
-bool GetRtcpSsrc(const void* data, size_t len, uint32_t* value);
-bool GetRtpHeader(const void* data, size_t len, RtpHeader* header);
-
-bool SetRtpSsrc(void* data, size_t len, uint32_t value);
-// Assumes version 2, no padding, no extensions, no csrcs.
-bool SetRtpHeader(void* data, size_t len, const RtpHeader& header);
-
-bool IsRtpPacket(const void* data, size_t len);
-
-// True if |payload type| is 0-127.
-bool IsValidRtpPayloadType(int payload_type);
-
-// True if |size| is appropriate for the indicated packet type.
-bool IsValidRtpRtcpPacketSize(bool rtcp, size_t size);
-
-// TODO(zstein): Consider using an enum instead of a bool to differentiate
-// between RTP and RTCP.
-// Returns "RTCP" or "RTP" according to |rtcp|.
-const char* RtpRtcpStringLiteral(bool rtcp);
-
-// Verifies that a packet has a valid RTP header.
-bool ValidateRtpHeader(const uint8_t* rtp,
-                       size_t length,
-                       size_t* header_length);
-
-// Helper method which updates the absolute send time extension if present.
-bool UpdateRtpAbsSendTimeExtension(uint8_t* rtp,
-                                   size_t length,
-                                   int extension_id,
-                                   uint64_t time_us);
-
-// Applies specified |options| to the packet. It updates the absolute send time
-// extension header if it is present present then updates HMAC.
-bool ApplyPacketOptions(uint8_t* data,
-                        size_t length,
-                        const rtc::PacketTimeUpdateParams& packet_time_params,
-                        uint64_t time_us);
-
-
-}  // namespace cricket
-
-#endif  // WEBRTC_MEDIA_BASE_RTPUTILS_H_
diff --git a/media/base/rtputils_unittest.cc b/media/base/rtputils_unittest.cc
deleted file mode 100644
index 2a998ea..0000000
--- a/media/base/rtputils_unittest.cc
+++ /dev/null
@@ -1,351 +0,0 @@
-/*
- *  Copyright (c) 2004 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/media/base/rtputils.h"
-#include "webrtc/media/base/fakertp.h"
-#include "webrtc/rtc_base/asyncpacketsocket.h"
-#include "webrtc/rtc_base/gunit.h"
-
-namespace cricket {
-
-static const uint8_t kRtpPacketWithMarker[] = {
-    0x80, 0x80, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01
-};
-// 3 CSRCs (0x01020304, 0x12345678, 0xAABBCCDD)
-// Extension (0xBEDE, 0x1122334455667788)
-static const uint8_t kRtpPacketWithMarkerAndCsrcAndExtension[] = {
-    0x93, 0x80, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
-    0x01, 0x02, 0x03, 0x04, 0x12, 0x34, 0x56, 0x78, 0xAA, 0xBB, 0xCC, 0xDD,
-    0xBE, 0xDE, 0x00, 0x02, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88
-};
-static const uint8_t kInvalidPacket[] = { 0x80, 0x00 };
-static const uint8_t kInvalidPacketWithCsrc[] = {
-    0x83, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
-    0x01, 0x02, 0x03, 0x04, 0x12, 0x34, 0x56, 0x78, 0xAA, 0xBB, 0xCC
-};
-static const uint8_t kInvalidPacketWithCsrcAndExtension1[] = {
-    0x93, 0x80, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
-    0x01, 0x02, 0x03, 0x04, 0x12, 0x34, 0x56, 0x78, 0xAA, 0xBB, 0xCC, 0xDD,
-    0xBE, 0xDE, 0x00
-};
-static const uint8_t kInvalidPacketWithCsrcAndExtension2[] = {
-    0x93, 0x80, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
-    0x01, 0x02, 0x03, 0x04, 0x12, 0x34, 0x56, 0x78, 0xAA, 0xBB, 0xCC, 0xDD,
-    0xBE, 0xDE, 0x00, 0x02, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77
-};
-
-// PT = 206, FMT = 1, Sender SSRC  = 0x1111, Media SSRC = 0x1111
-// No FCI information is needed for PLI.
-static const uint8_t kNonCompoundRtcpPliFeedbackPacket[] = {
-    0x81, 0xCE, 0x00, 0x0C, 0x00, 0x00, 0x11, 0x11, 0x00, 0x00, 0x11, 0x11
-};
-
-// Packet has only mandatory fixed RTCP header
-// PT = 204, SSRC = 0x1111
-static const uint8_t kNonCompoundRtcpAppPacket[] = {
-    0x81, 0xCC, 0x00, 0x0C, 0x00, 0x00, 0x11, 0x11
-};
-
-// PT = 202, Source count = 0
-static const uint8_t kNonCompoundRtcpSDESPacket[] = {
-    0x80, 0xCA, 0x00, 0x00
-};
-
-static uint8_t kFakeTag[4] = { 0xba, 0xdd, 0xba, 0xdd };
-static uint8_t kTestKey[] = "12345678901234567890";
-static uint8_t kTestAstValue[3] = { 0xaa, 0xbb, 0xcc };
-
-// Valid rtp Message with 2 byte header extension.
-static uint8_t kRtpMsgWith2ByteExtnHeader[] = {
-  0x90, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00,
-  0xAA, 0xBB, 0xCC, 0XDD,  // SSRC
-  0x10, 0x00, 0x00, 0x01,  // 2 Byte header extension
-  0x01, 0x00, 0x00, 0x00
-};
-
-// RTP packet with single byte extension header of length 4 bytes.
-// Extension id = 3 and length = 3
-static uint8_t kRtpMsgWithAbsSendTimeExtension[] = {
-  0x90, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00,
-  0xBE, 0xDE, 0x00, 0x02,
-  0x22, 0x00, 0x02, 0x1c,
-  0x32, 0xaa, 0xbb, 0xcc,
-};
-
-// Index of AbsSendTimeExtn data in message |kRtpMsgWithAbsSendTimeExtension|.
-static const int kAstIndexInRtpMsg = 21;
-
-TEST(RtpUtilsTest, GetRtp) {
-  EXPECT_TRUE(IsRtpPacket(kPcmuFrame, sizeof(kPcmuFrame)));
-
-  int pt;
-  EXPECT_TRUE(GetRtpPayloadType(kPcmuFrame, sizeof(kPcmuFrame), &pt));
-  EXPECT_EQ(0, pt);
-  EXPECT_TRUE(GetRtpPayloadType(kRtpPacketWithMarker,
-                                sizeof(kRtpPacketWithMarker), &pt));
-  EXPECT_EQ(0, pt);
-
-  int seq_num;
-  EXPECT_TRUE(GetRtpSeqNum(kPcmuFrame, sizeof(kPcmuFrame), &seq_num));
-  EXPECT_EQ(1, seq_num);
-
-  uint32_t ts;
-  EXPECT_TRUE(GetRtpTimestamp(kPcmuFrame, sizeof(kPcmuFrame), &ts));
-  EXPECT_EQ(0u, ts);
-
-  uint32_t ssrc;
-  EXPECT_TRUE(GetRtpSsrc(kPcmuFrame, sizeof(kPcmuFrame), &ssrc));
-  EXPECT_EQ(1u, ssrc);
-
-  RtpHeader header;
-  EXPECT_TRUE(GetRtpHeader(kPcmuFrame, sizeof(kPcmuFrame), &header));
-  EXPECT_EQ(0, header.payload_type);
-  EXPECT_EQ(1, header.seq_num);
-  EXPECT_EQ(0u, header.timestamp);
-  EXPECT_EQ(1u, header.ssrc);
-
-  EXPECT_FALSE(GetRtpPayloadType(kInvalidPacket, sizeof(kInvalidPacket), &pt));
-  EXPECT_FALSE(GetRtpSeqNum(kInvalidPacket, sizeof(kInvalidPacket), &seq_num));
-  EXPECT_FALSE(GetRtpTimestamp(kInvalidPacket, sizeof(kInvalidPacket), &ts));
-  EXPECT_FALSE(GetRtpSsrc(kInvalidPacket, sizeof(kInvalidPacket), &ssrc));
-}
-
-TEST(RtpUtilsTest, SetRtpHeader) {
-  uint8_t packet[] = {
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
-  };
-
-  RtpHeader header = { 9, 1111, 2222u, 3333u };
-  EXPECT_TRUE(SetRtpHeader(packet, sizeof(packet), header));
-
-  // Bits: 10 0 0 0000
-  EXPECT_EQ(128u, packet[0]);
-  size_t len;
-  EXPECT_TRUE(GetRtpHeaderLen(packet, sizeof(packet), &len));
-  EXPECT_EQ(12U, len);
-  EXPECT_TRUE(GetRtpHeader(packet, sizeof(packet), &header));
-  EXPECT_EQ(9, header.payload_type);
-  EXPECT_EQ(1111, header.seq_num);
-  EXPECT_EQ(2222u, header.timestamp);
-  EXPECT_EQ(3333u, header.ssrc);
-}
-
-TEST(RtpUtilsTest, GetRtpHeaderLen) {
-  size_t len;
-  EXPECT_TRUE(GetRtpHeaderLen(kPcmuFrame, sizeof(kPcmuFrame), &len));
-  EXPECT_EQ(12U, len);
-
-  EXPECT_TRUE(GetRtpHeaderLen(kRtpPacketWithMarkerAndCsrcAndExtension,
-                              sizeof(kRtpPacketWithMarkerAndCsrcAndExtension),
-                              &len));
-  EXPECT_EQ(sizeof(kRtpPacketWithMarkerAndCsrcAndExtension), len);
-
-  EXPECT_FALSE(GetRtpHeaderLen(kInvalidPacket, sizeof(kInvalidPacket), &len));
-  EXPECT_FALSE(GetRtpHeaderLen(kInvalidPacketWithCsrc,
-                               sizeof(kInvalidPacketWithCsrc), &len));
-  EXPECT_FALSE(GetRtpHeaderLen(kInvalidPacketWithCsrcAndExtension1,
-                               sizeof(kInvalidPacketWithCsrcAndExtension1),
-                               &len));
-  EXPECT_FALSE(GetRtpHeaderLen(kInvalidPacketWithCsrcAndExtension2,
-                               sizeof(kInvalidPacketWithCsrcAndExtension2),
-                               &len));
-}
-
-TEST(RtpUtilsTest, GetRtcp) {
-  int pt;
-  EXPECT_TRUE(GetRtcpType(kRtcpReport, sizeof(kRtcpReport), &pt));
-  EXPECT_EQ(0xc9, pt);
-
-  EXPECT_FALSE(GetRtcpType(kInvalidPacket, sizeof(kInvalidPacket), &pt));
-
-  uint32_t ssrc;
-  EXPECT_TRUE(GetRtcpSsrc(kNonCompoundRtcpPliFeedbackPacket,
-                          sizeof(kNonCompoundRtcpPliFeedbackPacket),
-                          &ssrc));
-  EXPECT_TRUE(GetRtcpSsrc(kNonCompoundRtcpAppPacket,
-                          sizeof(kNonCompoundRtcpAppPacket),
-                          &ssrc));
-  EXPECT_FALSE(GetRtcpSsrc(kNonCompoundRtcpSDESPacket,
-                           sizeof(kNonCompoundRtcpSDESPacket),
-                           &ssrc));
-}
-
-// Invalid RTP packets.
-TEST(RtpUtilsTest, InvalidRtpHeader) {
-  // Rtp message with invalid length.
-  const uint8_t kRtpMsgWithInvalidLength[] = {
-      0x94, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-      0xAA, 0xBB, 0xCC, 0XDD,  // SSRC
-      0xDD, 0xCC, 0xBB, 0xAA,  // Only 1 CSRC, but CC count is 4.
-  };
-  EXPECT_FALSE(ValidateRtpHeader(kRtpMsgWithInvalidLength,
-                                 sizeof(kRtpMsgWithInvalidLength), nullptr));
-
-  // Rtp message with single byte header extension, invalid extension length.
-  const uint8_t kRtpMsgWithInvalidExtnLength[] = {
-      0x90, 0x00, 0x00, 0x00,
-      0x00, 0x00, 0x00, 0x00,
-      0x00, 0x00, 0x00, 0x00,
-      0xBE, 0xDE, 0x0A, 0x00,  // Extn length - 0x0A00
-  };
-  EXPECT_FALSE(ValidateRtpHeader(kRtpMsgWithInvalidExtnLength,
-                                 sizeof(kRtpMsgWithInvalidExtnLength),
-                                 nullptr));
-}
-
-// Valid RTP packet with a 2byte header extension.
-TEST(RtpUtilsTest, Valid2ByteExtnHdrRtpMessage) {
-  EXPECT_TRUE(ValidateRtpHeader(kRtpMsgWith2ByteExtnHeader,
-                                sizeof(kRtpMsgWith2ByteExtnHeader), nullptr));
-}
-
-// Valid RTP packet which has 1 byte header AbsSendTime extension in it.
-TEST(RtpUtilsTest, ValidRtpPacketWithAbsSendTimeExtension) {
-  EXPECT_TRUE(ValidateRtpHeader(kRtpMsgWithAbsSendTimeExtension,
-                                sizeof(kRtpMsgWithAbsSendTimeExtension),
-                                nullptr));
-}
-
-// Verify handling of a 2 byte extension header RTP messsage. Currently these
-// messages are not supported.
-TEST(RtpUtilsTest, UpdateAbsSendTimeExtensionIn2ByteHeaderExtn) {
-  std::vector<uint8_t> data(
-      kRtpMsgWith2ByteExtnHeader,
-      kRtpMsgWith2ByteExtnHeader + sizeof(kRtpMsgWith2ByteExtnHeader));
-  EXPECT_FALSE(UpdateRtpAbsSendTimeExtension(&data[0], data.size(), 3, 0));
-}
-
-// Verify finding an extension ID in the TURN send indication message.
-TEST(RtpUtilsTest, UpdateAbsSendTimeExtensionInTurnSendIndication) {
-  // A valid STUN indication message with a valid RTP header in data attribute
-  // payload field and no extension bit set.
-  uint8_t message_without_extension[] = {
-      0x00, 0x16, 0x00, 0x18,  // length of
-      0x21, 0x12, 0xA4, 0x42,  // magic cookie
-      '0',  '1',  '2',  '3',   // transaction id
-      '4',  '5',  '6',  '7',
-      '8',  '9',  'a',  'b',
-      0x00, 0x20, 0x00, 0x04,  // Mapped address.
-      0x00, 0x00, 0x00, 0x00,
-      0x00, 0x13, 0x00, 0x0C,  // Data attribute.
-      0x80, 0x00, 0x00, 0x00,  // RTP packet.
-      0x00, 0x00, 0x00, 0x00,
-      0x00, 0x00, 0x00, 0x00,
-  };
-  EXPECT_TRUE(UpdateRtpAbsSendTimeExtension(
-      message_without_extension, sizeof(message_without_extension), 3, 0));
-
-  // A valid STUN indication message with a valid RTP header and a extension
-  // header.
-  uint8_t message[] = {
-      0x00, 0x16, 0x00, 0x24,  // length of
-      0x21, 0x12, 0xA4, 0x42,  // magic cookie
-      '0',  '1',  '2',  '3',   // transaction id
-      '4',  '5',  '6',  '7',
-      '8',  '9',  'a',  'b',
-      0x00, 0x20, 0x00, 0x04,  // Mapped address.
-      0x00, 0x00, 0x00, 0x00,
-      0x00, 0x13, 0x00, 0x18,  // Data attribute.
-      0x90, 0x00, 0x00, 0x00,  // RTP packet.
-      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBE, 0xDE,
-      0x00, 0x02, 0x22, 0xaa, 0xbb, 0xcc, 0x32, 0xaa, 0xbb, 0xcc,
-  };
-  EXPECT_TRUE(UpdateRtpAbsSendTimeExtension(message, sizeof(message), 3, 0));
-}
-
-// Test without any packet options variables set. This method should return
-// without HMAC value in the packet.
-TEST(RtpUtilsTest, ApplyPacketOptionsWithDefaultValues) {
-  rtc::PacketTimeUpdateParams packet_time_params;
-  std::vector<uint8_t> rtp_packet(kRtpMsgWithAbsSendTimeExtension,
-                                  kRtpMsgWithAbsSendTimeExtension +
-                                      sizeof(kRtpMsgWithAbsSendTimeExtension));
-  rtp_packet.insert(rtp_packet.end(), kFakeTag, kFakeTag + sizeof(kFakeTag));
-  EXPECT_TRUE(ApplyPacketOptions(&rtp_packet[0], rtp_packet.size(),
-                                 packet_time_params, 0));
-
-  // Making sure HMAC wasn't updated..
-  EXPECT_EQ(0, memcmp(&rtp_packet[sizeof(kRtpMsgWithAbsSendTimeExtension)],
-                      kFakeTag, 4));
-
-  // Verify AbsouluteSendTime extension field wasn't modified.
-  EXPECT_EQ(0, memcmp(&rtp_packet[kAstIndexInRtpMsg], kTestAstValue,
-                      sizeof(kTestAstValue)));
-}
-
-// Veirfy HMAC is updated when packet option parameters are set.
-TEST(RtpUtilsTest, ApplyPacketOptionsWithAuthParams) {
-  rtc::PacketTimeUpdateParams packet_time_params;
-  packet_time_params.srtp_auth_key.assign(kTestKey,
-                                          kTestKey + sizeof(kTestKey));
-  packet_time_params.srtp_auth_tag_len = 4;
-
-  std::vector<uint8_t> rtp_packet(kRtpMsgWithAbsSendTimeExtension,
-                                  kRtpMsgWithAbsSendTimeExtension +
-                                      sizeof(kRtpMsgWithAbsSendTimeExtension));
-  rtp_packet.insert(rtp_packet.end(), kFakeTag, kFakeTag + sizeof(kFakeTag));
-  EXPECT_TRUE(ApplyPacketOptions(&rtp_packet[0], rtp_packet.size(),
-                                 packet_time_params, 0));
-
-  uint8_t kExpectedTag[] = {0xc1, 0x7a, 0x8c, 0xa0};
-  EXPECT_EQ(0, memcmp(&rtp_packet[sizeof(kRtpMsgWithAbsSendTimeExtension)],
-                      kExpectedTag, sizeof(kExpectedTag)));
-
-  // Verify AbsouluteSendTime extension field is not modified.
-  EXPECT_EQ(0, memcmp(&rtp_packet[kAstIndexInRtpMsg], kTestAstValue,
-                      sizeof(kTestAstValue)));
-}
-
-// Verify finding an extension ID in a raw rtp message.
-TEST(RtpUtilsTest, UpdateAbsSendTimeExtensionInRtpPacket) {
-  std::vector<uint8_t> rtp_packet(kRtpMsgWithAbsSendTimeExtension,
-                                  kRtpMsgWithAbsSendTimeExtension +
-                                      sizeof(kRtpMsgWithAbsSendTimeExtension));
-
-  EXPECT_TRUE(UpdateRtpAbsSendTimeExtension(&rtp_packet[0], rtp_packet.size(),
-                                            3, 51183266));
-
-  // Verify that the timestamp was updated.
-  const uint8_t kExpectedTimestamp[3] = {0xcc, 0xbb, 0xaa};
-  EXPECT_EQ(0, memcmp(&rtp_packet[kAstIndexInRtpMsg], kExpectedTimestamp,
-                      sizeof(kExpectedTimestamp)));
-}
-
-// Verify we update both AbsSendTime extension header and HMAC.
-TEST(RtpUtilsTest, ApplyPacketOptionsWithAuthParamsAndAbsSendTime) {
-  rtc::PacketTimeUpdateParams packet_time_params;
-  packet_time_params.srtp_auth_key.assign(kTestKey,
-                                          kTestKey + sizeof(kTestKey));
-  packet_time_params.srtp_auth_tag_len = 4;
-  packet_time_params.rtp_sendtime_extension_id = 3;
-  // 3 is also present in the test message.
-
-  std::vector<uint8_t> rtp_packet(kRtpMsgWithAbsSendTimeExtension,
-                                  kRtpMsgWithAbsSendTimeExtension +
-                                      sizeof(kRtpMsgWithAbsSendTimeExtension));
-  rtp_packet.insert(rtp_packet.end(), kFakeTag, kFakeTag + sizeof(kFakeTag));
-  EXPECT_TRUE(ApplyPacketOptions(&rtp_packet[0], rtp_packet.size(),
-                                 packet_time_params, 51183266));
-
-  const uint8_t kExpectedTag[] = {0x81, 0xd1, 0x2c, 0x0e};
-  EXPECT_EQ(0, memcmp(&rtp_packet[sizeof(kRtpMsgWithAbsSendTimeExtension)],
-                      kExpectedTag, sizeof(kExpectedTag)));
-
-  // Verify that the timestamp was updated.
-  const uint8_t kExpectedTimestamp[3] = {0xcc, 0xbb, 0xaa};
-  EXPECT_EQ(0, memcmp(&rtp_packet[kAstIndexInRtpMsg], kExpectedTimestamp,
-                      sizeof(kExpectedTimestamp)));
-}
-
-
-}  // namespace cricket
diff --git a/media/base/streamparams.cc b/media/base/streamparams.cc
deleted file mode 100644
index 2bbf045..0000000
--- a/media/base/streamparams.cc
+++ /dev/null
@@ -1,268 +0,0 @@
-/*
- *  Copyright (c) 2011 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/media/base/streamparams.h"
-
-#include <list>
-#include <sstream>
-
-namespace cricket {
-namespace {
-// NOTE: There is no check here for duplicate streams, so check before
-// adding.
-void AddStream(std::vector<StreamParams>* streams, const StreamParams& stream) {
-  streams->push_back(stream);
-}
-}
-
-const char kFecSsrcGroupSemantics[] = "FEC";
-const char kFecFrSsrcGroupSemantics[] = "FEC-FR";
-const char kFidSsrcGroupSemantics[] = "FID";
-const char kSimSsrcGroupSemantics[] = "SIM";
-
-bool GetStream(const StreamParamsVec& streams,
-               const StreamSelector& selector,
-               StreamParams* stream_out) {
-  const StreamParams* found = GetStream(streams, selector);
-  if (found && stream_out)
-    *stream_out = *found;
-  return found != nullptr;
-}
-
-bool MediaStreams::GetAudioStream(
-    const StreamSelector& selector, StreamParams* stream) {
-  return GetStream(audio_, selector, stream);
-}
-
-bool MediaStreams::GetVideoStream(
-    const StreamSelector& selector, StreamParams* stream) {
-  return GetStream(video_, selector, stream);
-}
-
-bool MediaStreams::GetDataStream(
-    const StreamSelector& selector, StreamParams* stream) {
-  return GetStream(data_, selector, stream);
-}
-
-void MediaStreams::CopyFrom(const MediaStreams& streams) {
-  audio_ = streams.audio_;
-  video_ = streams.video_;
-  data_ = streams.data_;
-}
-
-void MediaStreams::AddAudioStream(const StreamParams& stream) {
-  AddStream(&audio_, stream);
-}
-
-void MediaStreams::AddVideoStream(const StreamParams& stream) {
-  AddStream(&video_, stream);
-}
-
-void MediaStreams::AddDataStream(const StreamParams& stream) {
-  AddStream(&data_, stream);
-}
-
-bool MediaStreams::RemoveAudioStream(
-    const StreamSelector& selector) {
-  return RemoveStream(&audio_, selector);
-}
-
-bool MediaStreams::RemoveVideoStream(
-    const StreamSelector& selector) {
-  return RemoveStream(&video_, selector);
-}
-
-bool MediaStreams::RemoveDataStream(
-    const StreamSelector& selector) {
-  return RemoveStream(&data_, selector);
-}
-
-static std::string SsrcsToString(const std::vector<uint32_t>& ssrcs) {
-  std::ostringstream ost;
-  ost << "ssrcs:[";
-  for (std::vector<uint32_t>::const_iterator it = ssrcs.begin();
-       it != ssrcs.end(); ++it) {
-    if (it != ssrcs.begin()) {
-      ost << ",";
-    }
-    ost << *it;
-  }
-  ost << "]";
-  return ost.str();
-}
-
-bool SsrcGroup::has_semantics(const std::string& semantics_in) const {
-  return (semantics == semantics_in && ssrcs.size() > 0);
-}
-
-std::string SsrcGroup::ToString() const {
-  std::ostringstream ost;
-  ost << "{";
-  ost << "semantics:" << semantics << ";";
-  ost << SsrcsToString(ssrcs);
-  ost << "}";
-  return ost.str();
-}
-
-std::string StreamParams::ToString() const {
-  std::ostringstream ost;
-  ost << "{";
-  if (!groupid.empty()) {
-    ost << "groupid:" << groupid << ";";
-  }
-  if (!id.empty()) {
-    ost << "id:" << id << ";";
-  }
-  ost << SsrcsToString(ssrcs) << ";";
-  ost << "ssrc_groups:";
-  for (std::vector<SsrcGroup>::const_iterator it = ssrc_groups.begin();
-       it != ssrc_groups.end(); ++it) {
-    if (it != ssrc_groups.begin()) {
-      ost << ",";
-    }
-    ost << it->ToString();
-  }
-  ost << ";";
-  if (!type.empty()) {
-    ost << "type:" << type << ";";
-  }
-  if (!display.empty()) {
-    ost << "display:" << display << ";";
-  }
-  if (!cname.empty()) {
-    ost << "cname:" << cname << ";";
-  }
-  if (!sync_label.empty()) {
-    ost << "sync_label:" << sync_label;
-  }
-  ost << "}";
-  return ost.str();
-}
-void StreamParams::GetPrimarySsrcs(std::vector<uint32_t>* ssrcs) const {
-  const SsrcGroup* sim_group = get_ssrc_group(kSimSsrcGroupSemantics);
-  if (sim_group == NULL) {
-    ssrcs->push_back(first_ssrc());
-  } else {
-    for (size_t i = 0; i < sim_group->ssrcs.size(); ++i) {
-      ssrcs->push_back(sim_group->ssrcs[i]);
-    }
-  }
-}
-
-void StreamParams::GetFidSsrcs(const std::vector<uint32_t>& primary_ssrcs,
-                               std::vector<uint32_t>* fid_ssrcs) const {
-  for (size_t i = 0; i < primary_ssrcs.size(); ++i) {
-    uint32_t fid_ssrc;
-    if (GetFidSsrc(primary_ssrcs[i], &fid_ssrc)) {
-      fid_ssrcs->push_back(fid_ssrc);
-    }
-  }
-}
-
-bool StreamParams::AddSecondarySsrc(const std::string& semantics,
-                                    uint32_t primary_ssrc,
-                                    uint32_t secondary_ssrc) {
-  if (!has_ssrc(primary_ssrc)) {
-    return false;
-  }
-
-  ssrcs.push_back(secondary_ssrc);
-  std::vector<uint32_t> ssrc_vector;
-  ssrc_vector.push_back(primary_ssrc);
-  ssrc_vector.push_back(secondary_ssrc);
-  SsrcGroup ssrc_group = SsrcGroup(semantics, ssrc_vector);
-  ssrc_groups.push_back(ssrc_group);
-  return true;
-}
-
-bool StreamParams::GetSecondarySsrc(const std::string& semantics,
-                                    uint32_t primary_ssrc,
-                                    uint32_t* secondary_ssrc) const {
-  for (std::vector<SsrcGroup>::const_iterator it = ssrc_groups.begin();
-       it != ssrc_groups.end(); ++it) {
-    if (it->has_semantics(semantics) &&
-          it->ssrcs.size() >= 2 &&
-          it->ssrcs[0] == primary_ssrc) {
-      *secondary_ssrc = it->ssrcs[1];
-      return true;
-    }
-  }
-  return false;
-}
-
-bool IsOneSsrcStream(const StreamParams& sp) {
-  if (sp.ssrcs.size() == 1 && sp.ssrc_groups.empty()) {
-    return true;
-  }
-  const SsrcGroup* fid_group = sp.get_ssrc_group(kFidSsrcGroupSemantics);
-  const SsrcGroup* fecfr_group = sp.get_ssrc_group(kFecFrSsrcGroupSemantics);
-  if (sp.ssrcs.size() == 2) {
-    if (fid_group != nullptr && sp.ssrcs == fid_group->ssrcs) {
-      return true;
-    }
-    if (fecfr_group != nullptr && sp.ssrcs == fecfr_group->ssrcs) {
-      return true;
-    }
-  }
-  if (sp.ssrcs.size() == 3) {
-    if (fid_group == nullptr || fecfr_group == nullptr) {
-      return false;
-    }
-    if (sp.ssrcs[0] != fid_group->ssrcs[0] ||
-        sp.ssrcs[0] != fecfr_group->ssrcs[0]) {
-      return false;
-    }
-    // We do not check for FlexFEC over RTX,
-    // as this combination is not supported.
-    if (sp.ssrcs[1] == fid_group->ssrcs[1] &&
-        sp.ssrcs[2] == fecfr_group->ssrcs[1]) {
-      return true;
-    }
-    if (sp.ssrcs[1] == fecfr_group->ssrcs[1] &&
-        sp.ssrcs[2] == fid_group->ssrcs[1]) {
-      return true;
-    }
-  }
-  return false;
-}
-
-static void RemoveFirst(std::list<uint32_t>* ssrcs, uint32_t value) {
-  std::list<uint32_t>::iterator it =
-      std::find(ssrcs->begin(), ssrcs->end(), value);
-  if (it != ssrcs->end()) {
-    ssrcs->erase(it);
-  }
-}
-
-bool IsSimulcastStream(const StreamParams& sp) {
-  const SsrcGroup* const sg = sp.get_ssrc_group(kSimSsrcGroupSemantics);
-  if (sg == NULL || sg->ssrcs.size() < 2) {
-    return false;
-  }
-  // Start with all StreamParams SSRCs. Remove simulcast SSRCs (from sg) and
-  // RTX SSRCs. If we still have SSRCs left, we don't know what they're for.
-  // Also we remove first-found SSRCs only. So duplicates should lead to errors.
-  std::list<uint32_t> sp_ssrcs(sp.ssrcs.begin(), sp.ssrcs.end());
-  for (size_t i = 0; i < sg->ssrcs.size(); ++i) {
-    RemoveFirst(&sp_ssrcs, sg->ssrcs[i]);
-  }
-  for (size_t i = 0; i < sp.ssrc_groups.size(); ++i) {
-    const SsrcGroup& group = sp.ssrc_groups[i];
-    if (group.semantics.compare(kFidSsrcGroupSemantics) != 0 ||
-        group.ssrcs.size() != 2) {
-      continue;
-    }
-    RemoveFirst(&sp_ssrcs, group.ssrcs[1]);
-  }
-  // If there's SSRCs left that we don't know how to handle, we bail out.
-  return sp_ssrcs.size() == 0;
-}
-
-}  // namespace cricket
diff --git a/media/base/streamparams.h b/media/base/streamparams.h
deleted file mode 100644
index 1fc8134..0000000
--- a/media/base/streamparams.h
+++ /dev/null
@@ -1,332 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-// This file contains structures for describing SSRCs from a media source such
-// as a MediaStreamTrack when it is sent across an RTP session. Multiple media
-// sources may be sent across the same RTP session, each of them will be
-// described by one StreamParams object
-// SsrcGroup is used to describe the relationship between the SSRCs that
-// are used for this media source.
-// E.x: Consider a source that is sent as 3 simulcast streams
-// Let the simulcast elements have SSRC 10, 20, 30.
-// Let each simulcast element use FEC and let the protection packets have
-// SSRC 11,21,31.
-// To describe this 4 SsrcGroups are needed,
-// StreamParams would then contain ssrc = {10,11,20,21,30,31} and
-// ssrc_groups = {{SIM,{10,20,30}, {FEC,{10,11}, {FEC, {20,21}, {FEC {30,31}}}
-// Please see RFC 5576.
-
-#ifndef WEBRTC_MEDIA_BASE_STREAMPARAMS_H_
-#define WEBRTC_MEDIA_BASE_STREAMPARAMS_H_
-
-#include <stdint.h>
-
-#include <algorithm>
-#include <set>
-#include <string>
-#include <vector>
-
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace cricket {
-
-extern const char kFecSsrcGroupSemantics[];
-extern const char kFecFrSsrcGroupSemantics[];
-extern const char kFidSsrcGroupSemantics[];
-extern const char kSimSsrcGroupSemantics[];
-
-struct SsrcGroup {
-  SsrcGroup(const std::string& usage, const std::vector<uint32_t>& ssrcs)
-      : semantics(usage), ssrcs(ssrcs) {}
-
-  bool operator==(const SsrcGroup& other) const {
-    return (semantics == other.semantics && ssrcs == other.ssrcs);
-  }
-  bool operator!=(const SsrcGroup &other) const {
-    return !(*this == other);
-  }
-
-  bool has_semantics(const std::string& semantics) const;
-
-  std::string ToString() const;
-
-  std::string semantics;  // e.g FIX, FEC, SIM.
-  std::vector<uint32_t> ssrcs;  // SSRCs of this type.
-};
-
-struct StreamParams {
-  static StreamParams CreateLegacy(uint32_t ssrc) {
-    StreamParams stream;
-    stream.ssrcs.push_back(ssrc);
-    return stream;
-  }
-
-  bool operator==(const StreamParams& other) const {
-    return (groupid == other.groupid &&
-            id == other.id &&
-            ssrcs == other.ssrcs &&
-            ssrc_groups == other.ssrc_groups &&
-            type == other.type &&
-            display == other.display &&
-            cname == other.cname &&
-            sync_label == other.sync_label);
-  }
-  bool operator!=(const StreamParams &other) const {
-    return !(*this == other);
-  }
-
-  uint32_t first_ssrc() const {
-    if (ssrcs.empty()) {
-      return 0;
-    }
-
-    return ssrcs[0];
-  }
-  bool has_ssrcs() const {
-    return !ssrcs.empty();
-  }
-  bool has_ssrc(uint32_t ssrc) const {
-    return std::find(ssrcs.begin(), ssrcs.end(), ssrc) != ssrcs.end();
-  }
-  void add_ssrc(uint32_t ssrc) { ssrcs.push_back(ssrc); }
-  bool has_ssrc_groups() const {
-    return !ssrc_groups.empty();
-  }
-  bool has_ssrc_group(const std::string& semantics) const {
-    return (get_ssrc_group(semantics) != NULL);
-  }
-  const SsrcGroup* get_ssrc_group(const std::string& semantics) const {
-    for (std::vector<SsrcGroup>::const_iterator it = ssrc_groups.begin();
-         it != ssrc_groups.end(); ++it) {
-      if (it->has_semantics(semantics)) {
-        return &(*it);
-      }
-    }
-    return NULL;
-  }
-
-  // Convenience function to add an FID ssrc for a primary_ssrc
-  // that's already been added.
-  bool AddFidSsrc(uint32_t primary_ssrc, uint32_t fid_ssrc) {
-    return AddSecondarySsrc(kFidSsrcGroupSemantics, primary_ssrc, fid_ssrc);
-  }
-
-  // Convenience function to lookup the FID ssrc for a primary_ssrc.
-  // Returns false if primary_ssrc not found or FID not defined for it.
-  bool GetFidSsrc(uint32_t primary_ssrc, uint32_t* fid_ssrc) const {
-    return GetSecondarySsrc(kFidSsrcGroupSemantics, primary_ssrc, fid_ssrc);
-  }
-
-  // Convenience function to add an FEC-FR ssrc for a primary_ssrc
-  // that's already been added.
-  bool AddFecFrSsrc(uint32_t primary_ssrc, uint32_t fecfr_ssrc) {
-    return AddSecondarySsrc(kFecFrSsrcGroupSemantics, primary_ssrc, fecfr_ssrc);
-  }
-
-  // Convenience function to lookup the FEC-FR ssrc for a primary_ssrc.
-  // Returns false if primary_ssrc not found or FEC-FR not defined for it.
-  bool GetFecFrSsrc(uint32_t primary_ssrc, uint32_t* fecfr_ssrc) const {
-    return GetSecondarySsrc(kFecFrSsrcGroupSemantics, primary_ssrc, fecfr_ssrc);
-  }
-
-  // Convenience to get all the SIM SSRCs if there are SIM ssrcs, or
-  // the first SSRC otherwise.
-  void GetPrimarySsrcs(std::vector<uint32_t>* ssrcs) const;
-
-  // Convenience to get all the FID SSRCs for the given primary ssrcs.
-  // If a given primary SSRC does not have a FID SSRC, the list of FID
-  // SSRCS will be smaller than the list of primary SSRCs.
-  void GetFidSsrcs(const std::vector<uint32_t>& primary_ssrcs,
-                   std::vector<uint32_t>* fid_ssrcs) const;
-
-  std::string ToString() const;
-
-  // Resource of the MUC jid of the participant of with this stream.
-  // For 1:1 calls, should be left empty (which means remote streams
-  // and local streams should not be mixed together).
-  std::string groupid;
-  // Unique per-groupid, not across all groupids
-  std::string id;
-  std::vector<uint32_t> ssrcs;         // All SSRCs for this source
-  std::vector<SsrcGroup> ssrc_groups;  // e.g. FID, FEC, SIM
-  // Examples: "camera", "screencast"
-  std::string type;
-  // Friendly name describing stream
-  std::string display;
-  std::string cname;  // RTCP CNAME
-  std::string sync_label;  // Friendly name of cname.
-
- private:
-  bool AddSecondarySsrc(const std::string& semantics,
-                        uint32_t primary_ssrc,
-                        uint32_t secondary_ssrc);
-  bool GetSecondarySsrc(const std::string& semantics,
-                        uint32_t primary_ssrc,
-                        uint32_t* secondary_ssrc) const;
-};
-
-// A Stream can be selected by either groupid+id or ssrc.
-struct StreamSelector {
-  explicit StreamSelector(uint32_t ssrc) : ssrc(ssrc) {}
-
-  StreamSelector(const std::string& groupid,
-                 const std::string& streamid) :
-      ssrc(0),
-      groupid(groupid),
-      streamid(streamid) {
-  }
-
-  bool Matches(const StreamParams& stream) const {
-    if (ssrc == 0) {
-      return stream.groupid == groupid && stream.id == streamid;
-    } else {
-      return stream.has_ssrc(ssrc);
-    }
-  }
-
-  uint32_t ssrc;
-  std::string groupid;
-  std::string streamid;
-};
-
-typedef std::vector<StreamParams> StreamParamsVec;
-
-// A collection of audio and video and data streams. Most of the
-// methods are merely for convenience. Many of these methods are keyed
-// by ssrc, which is the source identifier in the RTP spec
-// (http://tools.ietf.org/html/rfc3550).
-// TODO(pthatcher):  Add basic unit test for these.
-// See https://code.google.com/p/webrtc/issues/detail?id=4107
-struct MediaStreams {
- public:
-  MediaStreams() {}
-  void CopyFrom(const MediaStreams& sources);
-
-  bool empty() const {
-    return audio_.empty() && video_.empty() && data_.empty();
-  }
-
-  std::vector<StreamParams>* mutable_audio() { return &audio_; }
-  std::vector<StreamParams>* mutable_video() { return &video_; }
-  std::vector<StreamParams>* mutable_data() { return &data_; }
-  const std::vector<StreamParams>& audio() const { return audio_; }
-  const std::vector<StreamParams>& video() const { return video_; }
-  const std::vector<StreamParams>& data() const { return data_; }
-
-  // Gets a stream, returning true if found.
-  bool GetAudioStream(
-      const StreamSelector& selector, StreamParams* stream);
-  bool GetVideoStream(
-      const StreamSelector& selector, StreamParams* stream);
-  bool GetDataStream(
-      const StreamSelector& selector, StreamParams* stream);
-  // Adds a stream.
-  void AddAudioStream(const StreamParams& stream);
-  void AddVideoStream(const StreamParams& stream);
-  void AddDataStream(const StreamParams& stream);
-  // Removes a stream, returning true if found and removed.
-  bool RemoveAudioStream(const StreamSelector& selector);
-  bool RemoveVideoStream(const StreamSelector& selector);
-  bool RemoveDataStream(const StreamSelector& selector);
-
- private:
-  std::vector<StreamParams> audio_;
-  std::vector<StreamParams> video_;
-  std::vector<StreamParams> data_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(MediaStreams);
-};
-
-template <class Condition>
-const StreamParams* GetStream(const StreamParamsVec& streams,
-                              Condition condition) {
-  StreamParamsVec::const_iterator found =
-      std::find_if(streams.begin(), streams.end(), condition);
-  return found == streams.end() ? nullptr : &(*found);
-}
-
-template <class Condition>
-StreamParams* GetStream(StreamParamsVec& streams, Condition condition) {
-  StreamParamsVec::iterator found =
-      std::find_if(streams.begin(), streams.end(), condition);
-  return found == streams.end() ? nullptr : &(*found);
-}
-
-inline const StreamParams* GetStreamBySsrc(const StreamParamsVec& streams,
-                                           uint32_t ssrc) {
-  return GetStream(streams,
-      [&ssrc](const StreamParams& sp) { return sp.has_ssrc(ssrc); });
-}
-
-inline const StreamParams* GetStreamByIds(const StreamParamsVec& streams,
-                                          const std::string& groupid,
-                                          const std::string& id) {
-  return GetStream(streams, [&groupid, &id](const StreamParams& sp) {
-    return sp.groupid == groupid && sp.id == id;
-  });
-}
-
-inline StreamParams* GetStreamByIds(StreamParamsVec& streams,
-                                    const std::string& groupid,
-                                    const std::string& id) {
-  return GetStream(streams,
-      [&groupid, &id](const StreamParams& sp) {
-        return sp.groupid == groupid && sp.id == id;
-      });
-}
-
-inline const StreamParams* GetStream(const StreamParamsVec& streams,
-                                     const StreamSelector& selector) {
-  return GetStream(streams,
-      [&selector](const StreamParams& sp) { return selector.Matches(sp); });
-}
-
-template <class Condition>
-bool RemoveStream(StreamParamsVec* streams, Condition condition) {
-  auto iter(std::remove_if(streams->begin(), streams->end(), condition));
-  if (iter == streams->end())
-    return false;
-  streams->erase(iter, streams->end());
-  return true;
-}
-
-// Removes the stream from streams. Returns true if a stream is
-// found and removed.
-inline bool RemoveStream(StreamParamsVec* streams,
-                  const StreamSelector& selector) {
-  return RemoveStream(streams,
-      [&selector](const StreamParams& sp) { return selector.Matches(sp); });
-}
-inline bool RemoveStreamBySsrc(StreamParamsVec* streams, uint32_t ssrc) {
-  return RemoveStream(streams,
-      [&ssrc](const StreamParams& sp) { return sp.has_ssrc(ssrc); });
-}
-inline bool RemoveStreamByIds(StreamParamsVec* streams,
-                              const std::string& groupid,
-                              const std::string& id) {
-  return RemoveStream(streams,
-      [&groupid, &id](const StreamParams& sp) {
-        return sp.groupid == groupid && sp.id == id;
-      });
-}
-
-// Checks if |sp| defines parameters for a single primary stream. There may
-// be an RTX stream or a FlexFEC stream (or both) associated with the primary
-// stream. Leaving as non-static so we can test this function.
-bool IsOneSsrcStream(const StreamParams& sp);
-
-// Checks if |sp| defines parameters for one Simulcast stream. There may be RTX
-// streams associated with the simulcast streams. Leaving as non-static so we
-// can test this function.
-bool IsSimulcastStream(const StreamParams& sp);
-
-}  // namespace cricket
-
-#endif  // WEBRTC_MEDIA_BASE_STREAMPARAMS_H_
diff --git a/media/base/streamparams_unittest.cc b/media/base/streamparams_unittest.cc
deleted file mode 100644
index 9dc034c..0000000
--- a/media/base/streamparams_unittest.cc
+++ /dev/null
@@ -1,310 +0,0 @@
-/*
- *  Copyright (c) 2012 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/media/base/streamparams.h"
-#include "webrtc/media/base/testutils.h"
-#include "webrtc/rtc_base/arraysize.h"
-#include "webrtc/rtc_base/gunit.h"
-
-static const uint32_t kSsrcs1[] = {1};
-static const uint32_t kSsrcs2[] = {1, 2};
-static const uint32_t kSsrcs3[] = {1, 2, 3};
-static const uint32_t kRtxSsrcs3[] = {4, 5, 6};
-
-static cricket::StreamParams CreateStreamParamsWithSsrcGroup(
-    const std::string& semantics,
-    const uint32_t ssrcs_in[],
-    size_t len) {
-  cricket::StreamParams stream;
-  std::vector<uint32_t> ssrcs(ssrcs_in, ssrcs_in + len);
-  cricket::SsrcGroup sg(semantics, ssrcs);
-  stream.ssrcs = ssrcs;
-  stream.ssrc_groups.push_back(sg);
-  return stream;
-}
-
-TEST(SsrcGroup, EqualNotEqual) {
-  cricket::SsrcGroup ssrc_groups[] = {
-    cricket::SsrcGroup("ABC", MAKE_VECTOR(kSsrcs1)),
-    cricket::SsrcGroup("ABC", MAKE_VECTOR(kSsrcs2)),
-    cricket::SsrcGroup("Abc", MAKE_VECTOR(kSsrcs2)),
-    cricket::SsrcGroup("abc", MAKE_VECTOR(kSsrcs2)),
-  };
-
-  for (size_t i = 0; i < arraysize(ssrc_groups); ++i) {
-    for (size_t j = 0; j < arraysize(ssrc_groups); ++j) {
-      EXPECT_EQ((ssrc_groups[i] == ssrc_groups[j]), (i == j));
-      EXPECT_EQ((ssrc_groups[i] != ssrc_groups[j]), (i != j));
-    }
-  }
-}
-
-TEST(SsrcGroup, HasSemantics) {
-  cricket::SsrcGroup sg1("ABC", MAKE_VECTOR(kSsrcs1));
-  EXPECT_TRUE(sg1.has_semantics("ABC"));
-
-  cricket::SsrcGroup sg2("Abc", MAKE_VECTOR(kSsrcs1));
-  EXPECT_FALSE(sg2.has_semantics("ABC"));
-
-  cricket::SsrcGroup sg3("abc", MAKE_VECTOR(kSsrcs1));
-  EXPECT_FALSE(sg3.has_semantics("ABC"));
-}
-
-TEST(SsrcGroup, ToString) {
-  cricket::SsrcGroup sg1("ABC", MAKE_VECTOR(kSsrcs1));
-  EXPECT_STREQ("{semantics:ABC;ssrcs:[1]}", sg1.ToString().c_str());
-}
-
-TEST(StreamParams, CreateLegacy) {
-  const uint32_t ssrc = 7;
-  cricket::StreamParams one_sp = cricket::StreamParams::CreateLegacy(ssrc);
-  EXPECT_EQ(1U, one_sp.ssrcs.size());
-  EXPECT_EQ(ssrc, one_sp.first_ssrc());
-  EXPECT_TRUE(one_sp.has_ssrcs());
-  EXPECT_TRUE(one_sp.has_ssrc(ssrc));
-  EXPECT_FALSE(one_sp.has_ssrc(ssrc+1));
-  EXPECT_FALSE(one_sp.has_ssrc_groups());
-  EXPECT_EQ(0U, one_sp.ssrc_groups.size());
-}
-
-TEST(StreamParams, HasSsrcGroup) {
-  cricket::StreamParams sp =
-      CreateStreamParamsWithSsrcGroup("XYZ", kSsrcs2, arraysize(kSsrcs2));
-  EXPECT_EQ(2U, sp.ssrcs.size());
-  EXPECT_EQ(kSsrcs2[0], sp.first_ssrc());
-  EXPECT_TRUE(sp.has_ssrcs());
-  EXPECT_TRUE(sp.has_ssrc(kSsrcs2[0]));
-  EXPECT_TRUE(sp.has_ssrc(kSsrcs2[1]));
-  EXPECT_TRUE(sp.has_ssrc_group("XYZ"));
-  EXPECT_EQ(1U, sp.ssrc_groups.size());
-  EXPECT_EQ(2U, sp.ssrc_groups[0].ssrcs.size());
-  EXPECT_EQ(kSsrcs2[0], sp.ssrc_groups[0].ssrcs[0]);
-  EXPECT_EQ(kSsrcs2[1], sp.ssrc_groups[0].ssrcs[1]);
-}
-
-TEST(StreamParams, GetSsrcGroup) {
-  cricket::StreamParams sp =
-      CreateStreamParamsWithSsrcGroup("XYZ", kSsrcs2, arraysize(kSsrcs2));
-  EXPECT_EQ(NULL, sp.get_ssrc_group("xyz"));
-  EXPECT_EQ(&sp.ssrc_groups[0], sp.get_ssrc_group("XYZ"));
-}
-
-TEST(StreamParams, EqualNotEqual) {
-  cricket::StreamParams l1 = cricket::StreamParams::CreateLegacy(1);
-  cricket::StreamParams l2 = cricket::StreamParams::CreateLegacy(2);
-  cricket::StreamParams sg1 =
-      CreateStreamParamsWithSsrcGroup("ABC", kSsrcs1, arraysize(kSsrcs1));
-  cricket::StreamParams sg2 =
-      CreateStreamParamsWithSsrcGroup("ABC", kSsrcs2, arraysize(kSsrcs2));
-  cricket::StreamParams sg3 =
-      CreateStreamParamsWithSsrcGroup("Abc", kSsrcs2, arraysize(kSsrcs2));
-  cricket::StreamParams sg4 =
-      CreateStreamParamsWithSsrcGroup("abc", kSsrcs2, arraysize(kSsrcs2));
-  cricket::StreamParams sps[] = {l1, l2, sg1, sg2, sg3, sg4};
-
-  for (size_t i = 0; i < arraysize(sps); ++i) {
-    for (size_t j = 0; j < arraysize(sps); ++j) {
-      EXPECT_EQ((sps[i] == sps[j]), (i == j));
-      EXPECT_EQ((sps[i] != sps[j]), (i != j));
-    }
-  }
-}
-
-TEST(StreamParams, FidFunctions) {
-  uint32_t fid_ssrc;
-
-  cricket::StreamParams sp = cricket::StreamParams::CreateLegacy(1);
-  EXPECT_FALSE(sp.AddFidSsrc(10, 20));
-  EXPECT_TRUE(sp.AddFidSsrc(1, 2));
-  EXPECT_TRUE(sp.GetFidSsrc(1, &fid_ssrc));
-  EXPECT_EQ(2u, fid_ssrc);
-  EXPECT_FALSE(sp.GetFidSsrc(15, &fid_ssrc));
-
-  sp.add_ssrc(20);
-  EXPECT_TRUE(sp.AddFidSsrc(20, 30));
-  EXPECT_TRUE(sp.GetFidSsrc(20, &fid_ssrc));
-  EXPECT_EQ(30u, fid_ssrc);
-
-  // Manually create SsrcGroup to test bounds-checking
-  // in GetSecondarySsrc. We construct an invalid StreamParams
-  // for this.
-  std::vector<uint32_t> fid_vector;
-  fid_vector.push_back(13);
-  cricket::SsrcGroup invalid_fid_group(cricket::kFidSsrcGroupSemantics,
-                                        fid_vector);
-  cricket::StreamParams sp_invalid;
-  sp_invalid.add_ssrc(13);
-  sp_invalid.ssrc_groups.push_back(invalid_fid_group);
-  EXPECT_FALSE(sp_invalid.GetFidSsrc(13, &fid_ssrc));
-}
-
-TEST(StreamParams, GetPrimaryAndFidSsrcs) {
-  cricket::StreamParams sp;
-  sp.ssrcs.push_back(1);
-  sp.ssrcs.push_back(2);
-  sp.ssrcs.push_back(3);
-
-  std::vector<uint32_t> primary_ssrcs;
-  sp.GetPrimarySsrcs(&primary_ssrcs);
-  std::vector<uint32_t> fid_ssrcs;
-  sp.GetFidSsrcs(primary_ssrcs, &fid_ssrcs);
-  ASSERT_EQ(1u, primary_ssrcs.size());
-  EXPECT_EQ(1u, primary_ssrcs[0]);
-  ASSERT_EQ(0u, fid_ssrcs.size());
-
-  sp.ssrc_groups.push_back(
-      cricket::SsrcGroup(cricket::kSimSsrcGroupSemantics, sp.ssrcs));
-  sp.AddFidSsrc(1, 10);
-  sp.AddFidSsrc(2, 20);
-
-  primary_ssrcs.clear();
-  sp.GetPrimarySsrcs(&primary_ssrcs);
-  fid_ssrcs.clear();
-  sp.GetFidSsrcs(primary_ssrcs, &fid_ssrcs);
-  ASSERT_EQ(3u, primary_ssrcs.size());
-  EXPECT_EQ(1u, primary_ssrcs[0]);
-  EXPECT_EQ(2u, primary_ssrcs[1]);
-  EXPECT_EQ(3u, primary_ssrcs[2]);
-  ASSERT_EQ(2u, fid_ssrcs.size());
-  EXPECT_EQ(10u, fid_ssrcs[0]);
-  EXPECT_EQ(20u, fid_ssrcs[1]);
-}
-
-TEST(StreamParams, FecFrFunctions) {
-  uint32_t fecfr_ssrc;
-
-  cricket::StreamParams sp = cricket::StreamParams::CreateLegacy(1);
-  EXPECT_FALSE(sp.AddFecFrSsrc(10, 20));
-  EXPECT_TRUE(sp.AddFecFrSsrc(1, 2));
-  EXPECT_TRUE(sp.GetFecFrSsrc(1, &fecfr_ssrc));
-  EXPECT_EQ(2u, fecfr_ssrc);
-  EXPECT_FALSE(sp.GetFecFrSsrc(15, &fecfr_ssrc));
-
-  sp.add_ssrc(20);
-  EXPECT_TRUE(sp.AddFecFrSsrc(20, 30));
-  EXPECT_TRUE(sp.GetFecFrSsrc(20, &fecfr_ssrc));
-  EXPECT_EQ(30u, fecfr_ssrc);
-
-  // Manually create SsrcGroup to test bounds-checking
-  // in GetSecondarySsrc. We construct an invalid StreamParams
-  // for this.
-  std::vector<uint32_t> fecfr_vector;
-  fecfr_vector.push_back(13);
-  cricket::SsrcGroup invalid_fecfr_group(cricket::kFecFrSsrcGroupSemantics,
-                                         fecfr_vector);
-  cricket::StreamParams sp_invalid;
-  sp_invalid.add_ssrc(13);
-  sp_invalid.ssrc_groups.push_back(invalid_fecfr_group);
-  EXPECT_FALSE(sp_invalid.GetFecFrSsrc(13, &fecfr_ssrc));
-}
-
-TEST(StreamParams, ToString) {
-  cricket::StreamParams sp =
-      CreateStreamParamsWithSsrcGroup("XYZ", kSsrcs2, arraysize(kSsrcs2));
-  EXPECT_STREQ("{ssrcs:[1,2];ssrc_groups:{semantics:XYZ;ssrcs:[1,2]};}",
-               sp.ToString().c_str());
-}
-
-TEST(StreamParams, TestIsOneSsrcStream_LegacyStream) {
-  EXPECT_TRUE(
-      cricket::IsOneSsrcStream(cricket::StreamParams::CreateLegacy(13)));
-}
-
-TEST(StreamParams, TestIsOneSsrcStream_SingleRtxStream) {
-  cricket::StreamParams stream;
-  stream.add_ssrc(13);
-  EXPECT_TRUE(stream.AddFidSsrc(13, 14));
-  EXPECT_TRUE(cricket::IsOneSsrcStream(stream));
-}
-
-TEST(StreamParams, TestIsOneSsrcStream_SingleFlexfecStream) {
-  cricket::StreamParams stream;
-  stream.add_ssrc(13);
-  EXPECT_TRUE(stream.AddFecFrSsrc(13, 14));
-  EXPECT_TRUE(cricket::IsOneSsrcStream(stream));
-}
-
-TEST(StreamParams, TestIsOneSsrcStream_SingleFlexfecAndRtxStream) {
-  cricket::StreamParams stream;
-  stream.add_ssrc(13);
-  EXPECT_TRUE(stream.AddFecFrSsrc(13, 14));
-  EXPECT_TRUE(stream.AddFidSsrc(13, 15));
-  EXPECT_TRUE(cricket::IsOneSsrcStream(stream));
-}
-
-TEST(StreamParams, TestIsOneSsrcStream_SimulcastStream) {
-  EXPECT_FALSE(cricket::IsOneSsrcStream(
-      cricket::CreateSimStreamParams("cname", MAKE_VECTOR(kSsrcs2))));
-  EXPECT_FALSE(cricket::IsOneSsrcStream(
-      cricket::CreateSimStreamParams("cname", MAKE_VECTOR(kSsrcs3))));
-}
-
-TEST(StreamParams, TestIsOneSsrcStream_SimRtxStream) {
-  cricket::StreamParams stream =
-      cricket::CreateSimWithRtxStreamParams("cname",
-                                            MAKE_VECTOR(kSsrcs3),
-                                            MAKE_VECTOR(kRtxSsrcs3));
-  EXPECT_FALSE(cricket::IsOneSsrcStream(stream));
-}
-
-TEST(StreamParams, TestIsSimulcastStream_LegacyStream) {
-  EXPECT_FALSE(
-      cricket::IsSimulcastStream(cricket::StreamParams::CreateLegacy(13)));
-}
-
-TEST(StreamParams, TestIsSimulcastStream_SingleRtxStream) {
-  cricket::StreamParams stream;
-  stream.add_ssrc(13);
-  EXPECT_TRUE(stream.AddFidSsrc(13, 14));
-  EXPECT_FALSE(cricket::IsSimulcastStream(stream));
-}
-
-TEST(StreamParams, TestIsSimulcastStream_SimulcastStream) {
-  EXPECT_TRUE(cricket::IsSimulcastStream(
-      cricket::CreateSimStreamParams("cname", MAKE_VECTOR(kSsrcs2))));
-  EXPECT_TRUE(cricket::IsSimulcastStream(
-      cricket::CreateSimStreamParams("cname", MAKE_VECTOR(kSsrcs3))));
-}
-
-TEST(StreamParams, TestIsSimulcastStream_SimRtxStream) {
-  cricket::StreamParams stream =
-      cricket::CreateSimWithRtxStreamParams("cname",
-                                            MAKE_VECTOR(kSsrcs3),
-                                            MAKE_VECTOR(kRtxSsrcs3));
-  EXPECT_TRUE(cricket::IsSimulcastStream(stream));
-}
-
-TEST(StreamParams, TestIsSimulcastStream_InvalidStreams) {
-  // stream1 has extra non-sim, non-fid ssrc.
-  cricket::StreamParams stream1 =
-      cricket::CreateSimWithRtxStreamParams("cname",
-                                            MAKE_VECTOR(kSsrcs3),
-                                            MAKE_VECTOR(kRtxSsrcs3));
-  stream1.add_ssrc(25);
-  EXPECT_FALSE(cricket::IsSimulcastStream(stream1));
-
-  // stream2 has invalid fid-group (no primary).
-  cricket::StreamParams stream2;
-  stream2.add_ssrc(13);
-  EXPECT_TRUE(stream2.AddFidSsrc(13, 14));
-  std::remove(stream2.ssrcs.begin(), stream2.ssrcs.end(), 13u);
-  EXPECT_FALSE(cricket::IsSimulcastStream(stream2));
-
-  // stream3 has two SIM groups.
-  cricket::StreamParams stream3 =
-      cricket::CreateSimStreamParams("cname", MAKE_VECTOR(kSsrcs2));
-  std::vector<uint32_t> sim_ssrcs = MAKE_VECTOR(kRtxSsrcs3);
-  cricket::SsrcGroup sg(cricket::kSimSsrcGroupSemantics, sim_ssrcs);
-  for (size_t i = 0; i < sim_ssrcs.size(); i++) {
-    stream3.add_ssrc(sim_ssrcs[i]);
-  }
-  stream3.ssrc_groups.push_back(sg);
-  EXPECT_FALSE(cricket::IsSimulcastStream(stream3));
-}
diff --git a/media/base/test/mock_mediachannel.h b/media/base/test/mock_mediachannel.h
deleted file mode 100644
index 2d49d47..0000000
--- a/media/base/test/mock_mediachannel.h
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- *  Copyright 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_MEDIA_BASE_TEST_MOCK_MEDIACHANNEL_H_
-#define WEBRTC_MEDIA_BASE_TEST_MOCK_MEDIACHANNEL_H_
-
-#include "webrtc/media/base/fakemediaengine.h"
-#include "webrtc/test/gmock.h"
-
-namespace webrtc {
-
-class MockVideoMediaChannel : public cricket::FakeVideoMediaChannel {
- public:
-  MockVideoMediaChannel()
-      : cricket::FakeVideoMediaChannel(nullptr, cricket::VideoOptions()) {}
-  MOCK_METHOD1(GetStats, bool(cricket::VideoMediaInfo*));
-};
-
-class MockVoiceMediaChannel : public cricket::FakeVoiceMediaChannel {
- public:
-  MockVoiceMediaChannel()
-      : cricket::FakeVoiceMediaChannel(nullptr, cricket::AudioOptions()) {}
-  MOCK_METHOD1(GetStats, bool(cricket::VoiceMediaInfo*));
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MEDIA_BASE_TEST_MOCK_MEDIACHANNEL_H_
diff --git a/media/base/testutils.cc b/media/base/testutils.cc
deleted file mode 100644
index ac40df8..0000000
--- a/media/base/testutils.cc
+++ /dev/null
@@ -1,172 +0,0 @@
-/*
- *  Copyright (c) 2004 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/media/base/testutils.h"
-
-#include <math.h>
-#include <algorithm>
-#include <memory>
-
-#include "webrtc/api/video/video_frame.h"
-#include "webrtc/media/base/videocapturer.h"
-#include "webrtc/rtc_base/bytebuffer.h"
-#include "webrtc/rtc_base/fileutils.h"
-#include "webrtc/rtc_base/gunit.h"
-#include "webrtc/rtc_base/pathutils.h"
-#include "webrtc/rtc_base/stream.h"
-#include "webrtc/rtc_base/stringutils.h"
-#include "webrtc/rtc_base/testutils.h"
-
-namespace cricket {
-
-/////////////////////////////////////////////////////////////////////////
-// Implementation of RawRtpPacket
-/////////////////////////////////////////////////////////////////////////
-void RawRtpPacket::WriteToByteBuffer(uint32_t in_ssrc,
-                                     rtc::ByteBufferWriter* buf) const {
-  if (!buf) return;
-
-  buf->WriteUInt8(ver_to_cc);
-  buf->WriteUInt8(m_to_pt);
-  buf->WriteUInt16(sequence_number);
-  buf->WriteUInt32(timestamp);
-  buf->WriteUInt32(in_ssrc);
-  buf->WriteBytes(payload, sizeof(payload));
-}
-
-bool RawRtpPacket::ReadFromByteBuffer(rtc::ByteBufferReader* buf) {
-  if (!buf) return false;
-
-  bool ret = true;
-  ret &= buf->ReadUInt8(&ver_to_cc);
-  ret &= buf->ReadUInt8(&m_to_pt);
-  ret &= buf->ReadUInt16(&sequence_number);
-  ret &= buf->ReadUInt32(&timestamp);
-  ret &= buf->ReadUInt32(&ssrc);
-  ret &= buf->ReadBytes(payload, sizeof(payload));
-  return ret;
-}
-
-bool RawRtpPacket::SameExceptSeqNumTimestampSsrc(const RawRtpPacket& packet,
-                                                 uint16_t seq,
-                                                 uint32_t ts,
-                                                 uint32_t ssc) const {
-  return sequence_number == seq &&
-      timestamp == ts &&
-      ver_to_cc == packet.ver_to_cc &&
-      m_to_pt == packet.m_to_pt &&
-      ssrc == ssc &&
-      0 == memcmp(payload, packet.payload, sizeof(payload));
-}
-
-/////////////////////////////////////////////////////////////////////////
-// Implementation of RawRtcpPacket
-/////////////////////////////////////////////////////////////////////////
-void RawRtcpPacket::WriteToByteBuffer(rtc::ByteBufferWriter *buf) const {
-  if (!buf) return;
-
-  buf->WriteUInt8(ver_to_count);
-  buf->WriteUInt8(type);
-  buf->WriteUInt16(length);
-  buf->WriteBytes(payload, sizeof(payload));
-}
-
-bool RawRtcpPacket::ReadFromByteBuffer(rtc::ByteBufferReader* buf) {
-  if (!buf) return false;
-
-  bool ret = true;
-  ret &= buf->ReadUInt8(&ver_to_count);
-  ret &= buf->ReadUInt8(&type);
-  ret &= buf->ReadUInt16(&length);
-  ret &= buf->ReadBytes(payload, sizeof(payload));
-  return ret;
-}
-
-bool RawRtcpPacket::EqualsTo(const RawRtcpPacket& packet) const {
-  return ver_to_count == packet.ver_to_count &&
-      type == packet.type &&
-      length == packet.length &&
-      0 == memcmp(payload, packet.payload, sizeof(payload));
-}
-
-// Implementation of VideoCaptureListener.
-VideoCapturerListener::VideoCapturerListener(VideoCapturer* capturer)
-    : capturer_(capturer),
-      last_capture_state_(CS_STARTING),
-      frame_count_(0),
-      frame_width_(0),
-      frame_height_(0),
-      resolution_changed_(false) {
-  capturer->SignalStateChange.connect(this,
-      &VideoCapturerListener::OnStateChange);
-  capturer->AddOrUpdateSink(this, rtc::VideoSinkWants());
-}
-
-VideoCapturerListener::~VideoCapturerListener() {
-  capturer_->RemoveSink(this);
-}
-
-void VideoCapturerListener::OnStateChange(VideoCapturer* capturer,
-                                          CaptureState result) {
-  last_capture_state_ = result;
-}
-
-void VideoCapturerListener::OnFrame(const webrtc::VideoFrame& frame) {
-  ++frame_count_;
-  if (1 == frame_count_) {
-    frame_width_ = frame.width();
-    frame_height_ = frame.height();
-  } else if (frame_width_ != frame.width() || frame_height_ != frame.height()) {
-    resolution_changed_ = true;
-  }
-}
-
-cricket::StreamParams CreateSimStreamParams(
-    const std::string& cname,
-    const std::vector<uint32_t>& ssrcs) {
-  cricket::StreamParams sp;
-  cricket::SsrcGroup sg(cricket::kSimSsrcGroupSemantics, ssrcs);
-  sp.ssrcs = ssrcs;
-  sp.ssrc_groups.push_back(sg);
-  sp.cname = cname;
-  return sp;
-}
-
-// There should be an rtx_ssrc per ssrc.
-cricket::StreamParams CreateSimWithRtxStreamParams(
-    const std::string& cname,
-    const std::vector<uint32_t>& ssrcs,
-    const std::vector<uint32_t>& rtx_ssrcs) {
-  cricket::StreamParams sp = CreateSimStreamParams(cname, ssrcs);
-  for (size_t i = 0; i < ssrcs.size(); ++i) {
-    sp.ssrcs.push_back(rtx_ssrcs[i]);
-    std::vector<uint32_t> fid_ssrcs;
-    fid_ssrcs.push_back(ssrcs[i]);
-    fid_ssrcs.push_back(rtx_ssrcs[i]);
-    cricket::SsrcGroup fid_group(cricket::kFidSsrcGroupSemantics, fid_ssrcs);
-    sp.ssrc_groups.push_back(fid_group);
-  }
-  return sp;
-}
-
-cricket::StreamParams CreatePrimaryWithFecFrStreamParams(
-    const std::string& cname,
-    uint32_t primary_ssrc,
-    uint32_t flexfec_ssrc) {
-  cricket::StreamParams sp;
-  cricket::SsrcGroup sg(cricket::kFecFrSsrcGroupSemantics,
-                        {primary_ssrc, flexfec_ssrc});
-  sp.ssrcs = {primary_ssrc};
-  sp.ssrc_groups.push_back(sg);
-  sp.cname = cname;
-  return sp;
-}
-
-}  // namespace cricket
diff --git a/media/base/testutils.h b/media/base/testutils.h
deleted file mode 100644
index a7cb216..0000000
--- a/media/base/testutils.h
+++ /dev/null
@@ -1,151 +0,0 @@
-/*
- *  Copyright (c) 2004 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_MEDIA_BASE_TESTUTILS_H_
-#define WEBRTC_MEDIA_BASE_TESTUTILS_H_
-
-#include <string>
-#include <vector>
-
-#include "webrtc/media/base/mediachannel.h"
-#include "webrtc/media/base/videocapturer.h"
-#include "webrtc/media/base/videocommon.h"
-#include "webrtc/rtc_base/arraysize.h"
-#include "webrtc/rtc_base/basictypes.h"
-#include "webrtc/rtc_base/sigslot.h"
-#include "webrtc/rtc_base/window.h"
-
-namespace rtc {
-class ByteBufferReader;
-class ByteBufferWriter;
-class StreamInterface;
-}
-
-namespace webrtc {
-class VideoFrame;
-}
-
-namespace cricket {
-
-// Returns size of 420 image with rounding on chroma for odd sizes.
-#define I420_SIZE(w, h) (w * h + (((w + 1) / 2) * ((h + 1) / 2)) * 2)
-// Returns size of ARGB image.
-#define ARGB_SIZE(w, h) (w * h * 4)
-
-template <class T> inline std::vector<T> MakeVector(const T a[], size_t s) {
-  return std::vector<T>(a, a + s);
-}
-#define MAKE_VECTOR(a) cricket::MakeVector(a, arraysize(a))
-
-struct RtpDumpPacket;
-class RtpDumpWriter;
-
-struct RawRtpPacket {
-  void WriteToByteBuffer(uint32_t in_ssrc, rtc::ByteBufferWriter* buf) const;
-  bool ReadFromByteBuffer(rtc::ByteBufferReader* buf);
-  // Check if this packet is the same as the specified packet except the
-  // sequence number and timestamp, which should be the same as the specified
-  // parameters.
-  bool SameExceptSeqNumTimestampSsrc(const RawRtpPacket& packet,
-                                     uint16_t seq,
-                                     uint32_t ts,
-                                     uint32_t ssc) const;
-  int size() const { return 28; }
-
-  uint8_t ver_to_cc;
-  uint8_t m_to_pt;
-  uint16_t sequence_number;
-  uint32_t timestamp;
-  uint32_t ssrc;
-  char payload[16];
-};
-
-struct RawRtcpPacket {
-  void WriteToByteBuffer(rtc::ByteBufferWriter* buf) const;
-  bool ReadFromByteBuffer(rtc::ByteBufferReader* buf);
-  bool EqualsTo(const RawRtcpPacket& packet) const;
-
-  uint8_t ver_to_count;
-  uint8_t type;
-  uint16_t length;
-  char payload[16];
-};
-
-// Test helper for testing VideoCapturer implementations.
-class VideoCapturerListener
-    : public sigslot::has_slots<>,
-      public rtc::VideoSinkInterface<webrtc::VideoFrame> {
- public:
-  explicit VideoCapturerListener(VideoCapturer* cap);
-  ~VideoCapturerListener();
-
-  CaptureState last_capture_state() const { return last_capture_state_; }
-  int frame_count() const { return frame_count_; }
-  int frame_width() const { return frame_width_; }
-  int frame_height() const { return frame_height_; }
-  bool resolution_changed() const { return resolution_changed_; }
-
-  void OnStateChange(VideoCapturer* capturer, CaptureState state);
-  void OnFrame(const webrtc::VideoFrame& frame) override;
-
- private:
-  VideoCapturer* capturer_;
-  CaptureState last_capture_state_;
-  int frame_count_;
-  int frame_width_;
-  int frame_height_;
-  bool resolution_changed_;
-};
-
-class VideoMediaErrorCatcher : public sigslot::has_slots<> {
- public:
-  VideoMediaErrorCatcher() : ssrc_(0), error_(VideoMediaChannel::ERROR_NONE) { }
-  uint32_t ssrc() const { return ssrc_; }
-  VideoMediaChannel::Error error() const { return error_; }
-  void OnError(uint32_t ssrc, VideoMediaChannel::Error error) {
-    ssrc_ = ssrc;
-    error_ = error;
-  }
- private:
-  uint32_t ssrc_;
-  VideoMediaChannel::Error error_;
-};
-
-// Checks whether |codecs| contains |codec|; checks using Codec::Matches().
-template <class C>
-bool ContainsMatchingCodec(const std::vector<C>& codecs, const C& codec) {
-  typename std::vector<C>::const_iterator it;
-  for (it = codecs.begin(); it != codecs.end(); ++it) {
-    if (it->Matches(codec)) {
-      return true;
-    }
-  }
-  return false;
-}
-
-// Create Simulcast StreamParams with given |ssrcs| and |cname|.
-cricket::StreamParams CreateSimStreamParams(const std::string& cname,
-                                            const std::vector<uint32_t>& ssrcs);
-// Create Simulcast stream with given |ssrcs| and |rtx_ssrcs|.
-// The number of |rtx_ssrcs| must match number of |ssrcs|.
-cricket::StreamParams CreateSimWithRtxStreamParams(
-    const std::string& cname,
-    const std::vector<uint32_t>& ssrcs,
-    const std::vector<uint32_t>& rtx_ssrcs);
-
-// Create StreamParams with single primary SSRC and corresponding FlexFEC SSRC.
-cricket::StreamParams CreatePrimaryWithFecFrStreamParams(
-    const std::string& cname,
-    uint32_t primary_ssrc,
-    uint32_t flexfec_ssrc);
-
-}  // namespace cricket
-
-#endif  // WEBRTC_MEDIA_BASE_TESTUTILS_H_
diff --git a/media/base/turnutils.cc b/media/base/turnutils.cc
deleted file mode 100644
index f1daec4..0000000
--- a/media/base/turnutils.cc
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- *  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/media/base/turnutils.h"
-
-#include "webrtc/p2p/base/stun.h"
-#include "webrtc/rtc_base/byteorder.h"
-#include "webrtc/rtc_base/checks.h"
-
-namespace cricket {
-
-namespace {
-
-const size_t kTurnChannelHeaderLength = 4;
-
-bool IsTurnChannelData(const uint8_t* data, size_t length) {
-  return length >= kTurnChannelHeaderLength && ((*data & 0xC0) == 0x40);
-}
-
-bool IsTurnSendIndicationPacket(const uint8_t* data, size_t length) {
-  if (length < kStunHeaderSize) {
-    return false;
-  }
-
-  uint16_t type = rtc::GetBE16(data);
-  return (type == TURN_SEND_INDICATION);
-}
-
-}  // namespace
-
-bool UnwrapTurnPacket(const uint8_t* packet,
-                      size_t packet_size,
-                      size_t* content_position,
-                      size_t* content_size) {
-  if (IsTurnChannelData(packet, packet_size)) {
-    // Turn Channel Message header format.
-    //   0                   1                   2                   3
-    //  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
-    // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-    // |         Channel Number        |            Length             |
-    // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-    // |                                                               |
-    // /                       Application Data                        /
-    // /                                                               /
-    // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-    size_t length = rtc::GetBE16(&packet[2]);
-    if (length + kTurnChannelHeaderLength > packet_size) {
-      return false;
-    }
-
-    *content_position = kTurnChannelHeaderLength;
-    *content_size = length;
-    return true;
-  }
-
-  if (IsTurnSendIndicationPacket(packet, packet_size)) {
-    // Validate STUN message length.
-    const size_t stun_message_length = rtc::GetBE16(&packet[2]);
-    if (stun_message_length + kStunHeaderSize != packet_size) {
-      return false;
-    }
-
-    // First skip mandatory stun header which is of 20 bytes.
-    size_t pos = kStunHeaderSize;
-    // Loop through STUN attributes until we find STUN DATA attribute.
-    while (pos < packet_size) {
-      // Keep reading STUN attributes until we hit DATA attribute.
-      // Attribute will be a TLV structure.
-      // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-      // |         Type                  |            Length             |
-      // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-      // |                         Value (variable)                ....
-      // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-      // The value in the length field MUST contain the length of the Value
-      // part of the attribute, prior to padding, measured in bytes.  Since
-      // STUN aligns attributes on 32-bit boundaries, attributes whose content
-      // is not a multiple of 4 bytes are padded with 1, 2, or 3 bytes of
-      // padding so that its value contains a multiple of 4 bytes.  The
-      // padding bits are ignored, and may be any value.
-      uint16_t attr_type, attr_length;
-      const int kAttrHeaderLength = sizeof(attr_type) + sizeof(attr_length);
-
-      if (packet_size < pos + kAttrHeaderLength) {
-        return false;
-      }
-
-      // Getting attribute type and length.
-      attr_type = rtc::GetBE16(&packet[pos]);
-      attr_length = rtc::GetBE16(&packet[pos + sizeof(attr_type)]);
-
-      pos += kAttrHeaderLength;  // Skip STUN_DATA_ATTR header.
-
-      // Checking for bogus attribute length.
-      if (pos + attr_length > packet_size) {
-        return false;
-      }
-
-      if (attr_type == STUN_ATTR_DATA) {
-        *content_position = pos;
-        *content_size = attr_length;
-        return true;
-      }
-
-      pos += attr_length;
-      if ((attr_length % 4) != 0) {
-        pos += (4 - (attr_length % 4));
-      }
-    }
-
-    // There is no data attribute present in the message.
-    return false;
-  }
-
-  // This is not a TURN packet.
-  *content_position = 0;
-  *content_size = packet_size;
-  return true;
-}
-
-}  // namespace cricket
diff --git a/media/base/turnutils.h b/media/base/turnutils.h
deleted file mode 100644
index 09daffe..0000000
--- a/media/base/turnutils.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- *  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_MEDIA_BASE_TURNUTILS_H_
-#define WEBRTC_MEDIA_BASE_TURNUTILS_H_
-
-#include <cstddef>
-#include <cstdint>
-
-namespace cricket {
-
-struct PacketOptions;
-
-// Finds data location within a TURN Channel Message or TURN Send Indication
-// message.
-bool UnwrapTurnPacket(const uint8_t* packet,
-                      size_t packet_size,
-                      size_t* content_position,
-                      size_t* content_size);
-
-}  // namespace cricket
-
-#endif  // WEBRTC_MEDIA_BASE_TURNUTILS_H_
diff --git a/media/base/turnutils_unittest.cc b/media/base/turnutils_unittest.cc
deleted file mode 100644
index 72b1f7b..0000000
--- a/media/base/turnutils_unittest.cc
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- *  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/media/base/turnutils.h"
-
-#include <stddef.h>
-
-#include "webrtc/rtc_base/gunit.h"
-
-namespace cricket {
-
-// Invalid TURN send indication messages. Messages are proper STUN
-// messages with incorrect values in attributes.
-TEST(TurnUtilsTest, InvalidTurnSendIndicationMessages) {
-  size_t content_pos = SIZE_MAX;
-  size_t content_size = SIZE_MAX;
-
-  // Stun Indication message with Zero length
-  uint8_t kTurnSendIndicationMsgWithNoAttributes[] = {
-      0x00, 0x16, 0x00, 0x00,  // Zero length
-      0x21, 0x12, 0xA4, 0x42,  // magic cookie
-      '0',  '1',  '2',  '3',   // transaction id
-      '4',  '5',  '6',  '7',  '8', '9', 'a', 'b',
-  };
-  EXPECT_FALSE(UnwrapTurnPacket(kTurnSendIndicationMsgWithNoAttributes,
-                                sizeof(kTurnSendIndicationMsgWithNoAttributes),
-                                &content_pos, &content_size));
-  EXPECT_EQ(SIZE_MAX, content_pos);
-  EXPECT_EQ(SIZE_MAX, content_size);
-
-  // Stun Send Indication message with invalid length in stun header.
-  const uint8_t kTurnSendIndicationMsgWithInvalidLength[] = {
-      0x00, 0x16, 0xFF, 0x00,  // length of 0xFF00
-      0x21, 0x12, 0xA4, 0x42,  // magic cookie
-      '0',  '1',  '2',  '3',   // transaction id
-      '4',  '5',  '6',  '7',  '8', '9', 'a', 'b',
-  };
-  EXPECT_FALSE(UnwrapTurnPacket(kTurnSendIndicationMsgWithInvalidLength,
-                                sizeof(kTurnSendIndicationMsgWithInvalidLength),
-                                &content_pos, &content_size));
-  EXPECT_EQ(SIZE_MAX, content_pos);
-  EXPECT_EQ(SIZE_MAX, content_size);
-
-  // Stun Send Indication message with no DATA attribute in message.
-  const uint8_t kTurnSendIndicatinMsgWithNoDataAttribute[] = {
-      0x00, 0x16, 0x00, 0x08,  // length of
-      0x21, 0x12, 0xA4, 0x42,  // magic cookie
-      '0',  '1',  '2',  '3',   // transaction id
-      '4',  '5',  '6',  '7',  '8',  '9', 'a',  'b',
-      0x00, 0x20, 0x00, 0x04,  // Mapped address.
-      0x00, 0x00, 0x00, 0x00,
-  };
-  EXPECT_FALSE(
-      UnwrapTurnPacket(kTurnSendIndicatinMsgWithNoDataAttribute,
-                       sizeof(kTurnSendIndicatinMsgWithNoDataAttribute),
-                       &content_pos, &content_size));
-  EXPECT_EQ(SIZE_MAX, content_pos);
-  EXPECT_EQ(SIZE_MAX, content_size);
-}
-
-// Valid TURN Send Indication messages.
-TEST(TurnUtilsTest, ValidTurnSendIndicationMessage) {
-  size_t content_pos = SIZE_MAX;
-  size_t content_size = SIZE_MAX;
-  // A valid STUN indication message with a valid RTP header in data attribute
-  // payload field and no extension bit set.
-  const uint8_t kTurnSendIndicationMsgWithoutRtpExtension[] = {
-      0x00, 0x16, 0x00, 0x18,  // length of
-      0x21, 0x12, 0xA4, 0x42,  // magic cookie
-      '0',  '1',  '2',  '3',   // transaction id
-      '4',  '5',  '6',  '7',  '8',  '9',  'a',  'b',
-      0x00, 0x20, 0x00, 0x04,  // Mapped address.
-      0x00, 0x00, 0x00, 0x00,
-      0x00, 0x13, 0x00, 0x0C,  // Data attribute.
-      0x80, 0x00, 0x00, 0x00,  // RTP packet.
-      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  };
-  EXPECT_TRUE(UnwrapTurnPacket(
-      kTurnSendIndicationMsgWithoutRtpExtension,
-      sizeof(kTurnSendIndicationMsgWithoutRtpExtension), &content_pos,
-      &content_size));
-  EXPECT_EQ(12U, content_size);
-  EXPECT_EQ(32U, content_pos);
-}
-
-// Verify that parsing of valid TURN Channel Messages.
-TEST(TurnUtilsTest, ValidTurnChannelMessages) {
-  const uint8_t kTurnChannelMsgWithRtpPacket[] = {
-      0x40, 0x00, 0x00, 0x0C,
-      0x80, 0x00, 0x00, 0x00,  // RTP packet.
-      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  };
-
-  size_t content_pos = 0, content_size = 0;
-  EXPECT_TRUE(UnwrapTurnPacket(
-      kTurnChannelMsgWithRtpPacket,
-      sizeof(kTurnChannelMsgWithRtpPacket), &content_pos, &content_size));
-  EXPECT_EQ(12U, content_size);
-  EXPECT_EQ(4U, content_pos);
-}
-
-TEST(TurnUtilsTest, ChannelMessageZeroLength) {
-  const uint8_t kTurnChannelMsgWithZeroLength[] = {0x40, 0x00, 0x00, 0x00};
-  size_t content_pos = SIZE_MAX;
-  size_t content_size = SIZE_MAX;
-  EXPECT_TRUE(UnwrapTurnPacket(kTurnChannelMsgWithZeroLength,
-                               sizeof(kTurnChannelMsgWithZeroLength),
-                               &content_pos, &content_size));
-  EXPECT_EQ(4, content_pos);
-  EXPECT_EQ(0, content_size);
-}
-
-}  // namespace cricket
diff --git a/media/base/videoadapter.cc b/media/base/videoadapter.cc
deleted file mode 100644
index 45868b6..0000000
--- a/media/base/videoadapter.cc
+++ /dev/null
@@ -1,277 +0,0 @@
-/*
- *  Copyright (c) 2010 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/media/base/videoadapter.h"
-
-#include <algorithm>
-#include <cmath>
-#include <cstdlib>
-#include <limits>
-
-#include "webrtc/api/optional.h"
-#include "webrtc/media/base/mediaconstants.h"
-#include "webrtc/media/base/videocommon.h"
-#include "webrtc/rtc_base/arraysize.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-
-namespace {
-struct Fraction {
-  int numerator;
-  int denominator;
-
-  // Determines number of output pixels if both width and height of an input of
-  // |input_pixels| pixels is scaled with the fraction numerator / denominator.
-  int scale_pixel_count(int input_pixels) {
-    return (numerator * numerator * input_pixels) / (denominator * denominator);
-  }
-};
-
-// Round |value_to_round| to a multiple of |multiple|. Prefer rounding upwards,
-// but never more than |max_value|.
-int roundUp(int value_to_round, int multiple, int max_value) {
-  const int rounded_value =
-      (value_to_round + multiple - 1) / multiple * multiple;
-  return rounded_value <= max_value ? rounded_value
-                                    : (max_value / multiple * multiple);
-}
-
-// Generates a scale factor that makes |input_pixels| close to |target_pixels|,
-// but no higher than |max_pixels|.
-Fraction FindScale(int input_pixels, int target_pixels, int max_pixels) {
-  // This function only makes sense for a positive target.
-  RTC_DCHECK_GT(target_pixels, 0);
-  RTC_DCHECK_GT(max_pixels, 0);
-  RTC_DCHECK_GE(max_pixels, target_pixels);
-
-  // Don't scale up original.
-  if (target_pixels >= input_pixels)
-    return Fraction{1, 1};
-
-  Fraction current_scale = Fraction{1, 1};
-  Fraction best_scale = Fraction{1, 1};
-  // The minimum (absolute) difference between the number of output pixels and
-  // the target pixel count.
-  int min_pixel_diff = std::numeric_limits<int>::max();
-  if (input_pixels <= max_pixels) {
-    // Start condition for 1/1 case, if it is less than max.
-    min_pixel_diff = std::abs(input_pixels - target_pixels);
-  }
-
-  // Alternately scale down by 2/3 and 3/4. This results in fractions which are
-  // effectively scalable. For instance, starting at 1280x720 will result in
-  // the series (3/4) => 960x540, (1/2) => 640x360, (3/8) => 480x270,
-  // (1/4) => 320x180, (3/16) => 240x125, (1/8) => 160x90.
-  while (current_scale.scale_pixel_count(input_pixels) > target_pixels) {
-    if (current_scale.numerator % 3 == 0 &&
-        current_scale.denominator % 2 == 0) {
-      // Multiply by 2/3.
-      current_scale.numerator /= 3;
-      current_scale.denominator /= 2;
-    } else {
-      // Multiply by 3/4.
-      current_scale.numerator *= 3;
-      current_scale.denominator *= 4;
-    }
-
-    int output_pixels = current_scale.scale_pixel_count(input_pixels);
-    if (output_pixels <= max_pixels) {
-      int diff = std::abs(target_pixels - output_pixels);
-      if (diff < min_pixel_diff) {
-        min_pixel_diff = diff;
-        best_scale = current_scale;
-      }
-    }
-  }
-
-  return best_scale;
-}
-}  // namespace
-
-namespace cricket {
-
-VideoAdapter::VideoAdapter(int required_resolution_alignment)
-    : frames_in_(0),
-      frames_out_(0),
-      frames_scaled_(0),
-      adaption_changes_(0),
-      previous_width_(0),
-      previous_height_(0),
-      required_resolution_alignment_(required_resolution_alignment),
-      resolution_request_target_pixel_count_(std::numeric_limits<int>::max()),
-      resolution_request_max_pixel_count_(std::numeric_limits<int>::max()),
-      max_framerate_request_(std::numeric_limits<int>::max()) {}
-
-VideoAdapter::VideoAdapter() : VideoAdapter(1) {}
-
-VideoAdapter::~VideoAdapter() {}
-
-bool VideoAdapter::KeepFrame(int64_t in_timestamp_ns) {
-  rtc::CritScope cs(&critical_section_);
-  if (max_framerate_request_ <= 0)
-    return false;
-
-  int64_t frame_interval_ns =
-      requested_format_ ? requested_format_->interval : 0;
-
-  // If |max_framerate_request_| is not set, it will default to maxint, which
-  // will lead to a frame_interval_ns rounded to 0.
-  frame_interval_ns = std::max<int64_t>(
-      frame_interval_ns, rtc::kNumNanosecsPerSec / max_framerate_request_);
-
-  if (frame_interval_ns <= 0) {
-    // Frame rate throttling not enabled.
-    return true;
-  }
-
-  if (next_frame_timestamp_ns_) {
-    // Time until next frame should be outputted.
-    const int64_t time_until_next_frame_ns =
-        (*next_frame_timestamp_ns_ - in_timestamp_ns);
-
-    // Continue if timestamp is within expected range.
-    if (std::abs(time_until_next_frame_ns) < 2 * frame_interval_ns) {
-      // Drop if a frame shouldn't be outputted yet.
-      if (time_until_next_frame_ns > 0)
-        return false;
-      // Time to output new frame.
-      *next_frame_timestamp_ns_ += frame_interval_ns;
-      return true;
-    }
-  }
-
-  // First timestamp received or timestamp is way outside expected range, so
-  // reset. Set first timestamp target to just half the interval to prefer
-  // keeping frames in case of jitter.
-  next_frame_timestamp_ns_ =
-      rtc::Optional<int64_t>(in_timestamp_ns + frame_interval_ns / 2);
-  return true;
-}
-
-bool VideoAdapter::AdaptFrameResolution(int in_width,
-                                        int in_height,
-                                        int64_t in_timestamp_ns,
-                                        int* cropped_width,
-                                        int* cropped_height,
-                                        int* out_width,
-                                        int* out_height) {
-  rtc::CritScope cs(&critical_section_);
-  ++frames_in_;
-
-  // The max output pixel count is the minimum of the requests from
-  // OnOutputFormatRequest and OnResolutionRequest.
-  int max_pixel_count = resolution_request_max_pixel_count_;
-  if (requested_format_) {
-    max_pixel_count = std::min(
-        max_pixel_count, requested_format_->width * requested_format_->height);
-  }
-  int target_pixel_count =
-      std::min(resolution_request_target_pixel_count_, max_pixel_count);
-
-  // Drop the input frame if necessary.
-  if (max_pixel_count <= 0 || !KeepFrame(in_timestamp_ns)) {
-    // Show VAdapt log every 90 frames dropped. (3 seconds)
-    if ((frames_in_ - frames_out_) % 90 == 0) {
-      // TODO(fbarchard): Reduce to LS_VERBOSE when adapter info is not needed
-      // in default calls.
-      LOG(LS_INFO) << "VAdapt Drop Frame: scaled " << frames_scaled_
-                   << " / out " << frames_out_
-                   << " / in " << frames_in_
-                   << " Changes: " << adaption_changes_
-                   << " Input: " << in_width
-                   << "x" << in_height
-                   << " timestamp: " << in_timestamp_ns
-                   << " Output: i"
-                   << (requested_format_ ? requested_format_->interval : 0);
-    }
-
-    // Drop frame.
-    return false;
-  }
-
-  // Calculate how the input should be cropped.
-  if (!requested_format_ ||
-      requested_format_->width == 0 || requested_format_->height == 0) {
-    *cropped_width = in_width;
-    *cropped_height = in_height;
-  } else {
-    // Adjust |requested_format_| orientation to match input.
-    if ((in_width > in_height) !=
-        (requested_format_->width > requested_format_->height)) {
-      std::swap(requested_format_->width, requested_format_->height);
-    }
-    const float requested_aspect =
-        requested_format_->width /
-        static_cast<float>(requested_format_->height);
-    *cropped_width =
-        std::min(in_width, static_cast<int>(in_height * requested_aspect));
-    *cropped_height =
-        std::min(in_height, static_cast<int>(in_width / requested_aspect));
-  }
-  const Fraction scale = FindScale((*cropped_width) * (*cropped_height),
-                                   target_pixel_count, max_pixel_count);
-  // Adjust cropping slightly to get even integer output size and a perfect
-  // scale factor. Make sure the resulting dimensions are aligned correctly
-  // to be nice to hardware encoders.
-  *cropped_width =
-      roundUp(*cropped_width,
-              scale.denominator * required_resolution_alignment_, in_width);
-  *cropped_height =
-      roundUp(*cropped_height,
-              scale.denominator * required_resolution_alignment_, in_height);
-  RTC_DCHECK_EQ(0, *cropped_width % scale.denominator);
-  RTC_DCHECK_EQ(0, *cropped_height % scale.denominator);
-
-  // Calculate final output size.
-  *out_width = *cropped_width / scale.denominator * scale.numerator;
-  *out_height = *cropped_height / scale.denominator * scale.numerator;
-  RTC_DCHECK_EQ(0, *out_width % required_resolution_alignment_);
-  RTC_DCHECK_EQ(0, *out_height % required_resolution_alignment_);
-
-  ++frames_out_;
-  if (scale.numerator != scale.denominator)
-    ++frames_scaled_;
-
-  if (previous_width_ && (previous_width_ != *out_width ||
-                          previous_height_ != *out_height)) {
-    ++adaption_changes_;
-    LOG(LS_INFO) << "Frame size changed: scaled " << frames_scaled_ << " / out "
-                 << frames_out_ << " / in " << frames_in_
-                 << " Changes: " << adaption_changes_ << " Input: " << in_width
-                 << "x" << in_height
-                 << " Scale: " << scale.numerator << "/" << scale.denominator
-                 << " Output: " << *out_width << "x" << *out_height << " i"
-                 << (requested_format_ ? requested_format_->interval : 0);
-  }
-
-  previous_width_ = *out_width;
-  previous_height_ = *out_height;
-
-  return true;
-}
-
-void VideoAdapter::OnOutputFormatRequest(const VideoFormat& format) {
-  rtc::CritScope cs(&critical_section_);
-  requested_format_ = rtc::Optional<VideoFormat>(format);
-  next_frame_timestamp_ns_ = rtc::Optional<int64_t>();
-}
-
-void VideoAdapter::OnResolutionFramerateRequest(
-    const rtc::Optional<int>& target_pixel_count,
-    int max_pixel_count,
-    int max_framerate_fps) {
-  rtc::CritScope cs(&critical_section_);
-  resolution_request_max_pixel_count_ = max_pixel_count;
-  resolution_request_target_pixel_count_ =
-      target_pixel_count.value_or(resolution_request_max_pixel_count_);
-  max_framerate_request_ = max_framerate_fps;
-}
-
-}  // namespace cricket
diff --git a/media/base/videoadapter.h b/media/base/videoadapter.h
deleted file mode 100644
index aa786af..0000000
--- a/media/base/videoadapter.h
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- *  Copyright (c) 2010 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_MEDIA_BASE_VIDEOADAPTER_H_
-#define WEBRTC_MEDIA_BASE_VIDEOADAPTER_H_
-
-#include "webrtc/api/optional.h"
-#include "webrtc/media/base/videocommon.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/criticalsection.h"
-
-namespace cricket {
-
-// VideoAdapter adapts an input video frame to an output frame based on the
-// specified input and output formats. The adaptation includes dropping frames
-// to reduce frame rate and scaling frames.
-// VideoAdapter is thread safe.
-class VideoAdapter {
- public:
-  VideoAdapter();
-  // The output frames will have height and width that is divisible by
-  // |required_resolution_alignment|.
-  explicit VideoAdapter(int required_resolution_alignment);
-  virtual ~VideoAdapter();
-
-  // Return the adapted resolution and cropping parameters given the
-  // input resolution. The input frame should first be cropped, then
-  // scaled to the final output resolution. Returns true if the frame
-  // should be adapted, and false if it should be dropped.
-  bool AdaptFrameResolution(int in_width,
-                            int in_height,
-                            int64_t in_timestamp_ns,
-                            int* cropped_width,
-                            int* cropped_height,
-                            int* out_width,
-                            int* out_height);
-
-  // Requests the output frame size and frame interval from
-  // |AdaptFrameResolution| to not be larger than |format|. Also, the input
-  // frame size will be cropped to match the requested aspect ratio. The
-  // requested aspect ratio is orientation agnostic and will be adjusted to
-  // maintain the input orientation, so it doesn't matter if e.g. 1280x720 or
-  // 720x1280 is requested.
-  void OnOutputFormatRequest(const VideoFormat& format);
-
-  // Requests the output frame size from |AdaptFrameResolution| to have as close
-  // as possible to |target_pixel_count| pixels (if set) but no more than
-  // |max_pixel_count|.
-  // |max_framerate_fps| is essentially analogous to |max_pixel_count|, but for
-  // framerate rather than resolution.
-  // Set |max_pixel_count| and/or |max_framerate_fps| to
-  // std::numeric_limit<int>::max() if no upper limit is desired.
-  void OnResolutionFramerateRequest(
-      const rtc::Optional<int>& target_pixel_count,
-      int max_pixel_count,
-      int max_framerate_fps);
-
- private:
-  // Determine if frame should be dropped based on input fps and requested fps.
-  bool KeepFrame(int64_t in_timestamp_ns);
-
-  int frames_in_;         // Number of input frames.
-  int frames_out_;        // Number of output frames.
-  int frames_scaled_;     // Number of frames scaled.
-  int adaption_changes_;  // Number of changes in scale factor.
-  int previous_width_;    // Previous adapter output width.
-  int previous_height_;   // Previous adapter output height.
-  // Resolution must be divisible by this factor.
-  const int required_resolution_alignment_;
-  // The target timestamp for the next frame based on requested format.
-  rtc::Optional<int64_t> next_frame_timestamp_ns_
-      RTC_GUARDED_BY(critical_section_);
-
-  // Max number of pixels requested via calls to OnOutputFormatRequest,
-  // OnResolutionRequest respectively.
-  // The adapted output format is the minimum of these.
-  rtc::Optional<VideoFormat> requested_format_
-      RTC_GUARDED_BY(critical_section_);
-  int resolution_request_target_pixel_count_ RTC_GUARDED_BY(critical_section_);
-  int resolution_request_max_pixel_count_ RTC_GUARDED_BY(critical_section_);
-  int max_framerate_request_ RTC_GUARDED_BY(critical_section_);
-
-  // The critical section to protect the above variables.
-  rtc::CriticalSection critical_section_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(VideoAdapter);
-};
-
-}  // namespace cricket
-
-#endif  // WEBRTC_MEDIA_BASE_VIDEOADAPTER_H_
diff --git a/media/base/videoadapter_unittest.cc b/media/base/videoadapter_unittest.cc
deleted file mode 100644
index d3a66c1..0000000
--- a/media/base/videoadapter_unittest.cc
+++ /dev/null
@@ -1,1099 +0,0 @@
-/*
- *  Copyright (c) 2010 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 <limits.h>  // For INT_MAX
-
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "webrtc/media/base/fakevideocapturer.h"
-#include "webrtc/media/base/mediachannel.h"
-#include "webrtc/media/base/testutils.h"
-#include "webrtc/media/base/videoadapter.h"
-#include "webrtc/rtc_base/gunit.h"
-#include "webrtc/rtc_base/logging.h"
-
-namespace cricket {
-namespace {
-const int kDefaultFps = 30;
-}  // namespace
-
-class VideoAdapterTest : public testing::Test {
- public:
-  virtual void SetUp() {
-    capturer_.reset(new FakeVideoCapturer);
-    capture_format_ = capturer_->GetSupportedFormats()->at(0);
-    capture_format_.interval = VideoFormat::FpsToInterval(kDefaultFps);
-
-    listener_.reset(new VideoCapturerListener(&adapter_));
-    capturer_->AddOrUpdateSink(listener_.get(), rtc::VideoSinkWants());
-  }
-
-  virtual void TearDown() {
-    // Explicitly disconnect the VideoCapturer before to avoid data races
-    // (frames delivered to VideoCapturerListener while it's being destructed).
-    capturer_->RemoveSink(listener_.get());
-  }
-
- protected:
-  class VideoCapturerListener
-      : public rtc::VideoSinkInterface<webrtc::VideoFrame> {
-   public:
-    struct Stats {
-      int captured_frames;
-      int dropped_frames;
-      bool last_adapt_was_no_op;
-
-      int cropped_width;
-      int cropped_height;
-      int out_width;
-      int out_height;
-    };
-
-    explicit VideoCapturerListener(VideoAdapter* adapter)
-        : video_adapter_(adapter),
-          cropped_width_(0),
-          cropped_height_(0),
-          out_width_(0),
-          out_height_(0),
-          captured_frames_(0),
-          dropped_frames_(0),
-          last_adapt_was_no_op_(false) {}
-
-    void OnFrame(const webrtc::VideoFrame& frame) {
-      rtc::CritScope lock(&crit_);
-      const int in_width = frame.width();
-      const int in_height = frame.height();
-      int cropped_width;
-      int cropped_height;
-      int out_width;
-      int out_height;
-      if (video_adapter_->AdaptFrameResolution(
-              in_width, in_height,
-              frame.timestamp_us() * rtc::kNumNanosecsPerMicrosec,
-              &cropped_width, &cropped_height, &out_width, &out_height)) {
-        cropped_width_ = cropped_width;
-        cropped_height_ = cropped_height;
-        out_width_ = out_width;
-        out_height_ = out_height;
-        last_adapt_was_no_op_ =
-            (in_width == cropped_width && in_height == cropped_height &&
-             in_width == out_width && in_height == out_height);
-      } else {
-        ++dropped_frames_;
-      }
-      ++captured_frames_;
-    }
-
-    Stats GetStats() {
-      rtc::CritScope lock(&crit_);
-      Stats stats;
-      stats.captured_frames = captured_frames_;
-      stats.dropped_frames = dropped_frames_;
-      stats.last_adapt_was_no_op = last_adapt_was_no_op_;
-      stats.cropped_width = cropped_width_;
-      stats.cropped_height = cropped_height_;
-      stats.out_width = out_width_;
-      stats.out_height = out_height_;
-      return stats;
-    }
-
-   private:
-    rtc::CriticalSection crit_;
-    VideoAdapter* video_adapter_;
-    int cropped_width_;
-    int cropped_height_;
-    int out_width_;
-    int out_height_;
-    int captured_frames_;
-    int dropped_frames_;
-    bool last_adapt_was_no_op_;
-  };
-
-
-  void VerifyAdaptedResolution(const VideoCapturerListener::Stats& stats,
-                               int cropped_width,
-                               int cropped_height,
-                               int out_width,
-                               int out_height) {
-    EXPECT_EQ(cropped_width, stats.cropped_width);
-    EXPECT_EQ(cropped_height, stats.cropped_height);
-    EXPECT_EQ(out_width, stats.out_width);
-    EXPECT_EQ(out_height, stats.out_height);
-  }
-
-  std::unique_ptr<FakeVideoCapturer> capturer_;
-  VideoAdapter adapter_;
-  int cropped_width_;
-  int cropped_height_;
-  int out_width_;
-  int out_height_;
-  std::unique_ptr<VideoCapturerListener> listener_;
-  VideoFormat capture_format_;
-};
-
-// Do not adapt the frame rate or the resolution. Expect no frame drop, no
-// cropping, and no resolution change.
-TEST_F(VideoAdapterTest, AdaptNothing) {
-  EXPECT_EQ(CS_RUNNING, capturer_->Start(capture_format_));
-  for (int i = 0; i < 10; ++i)
-    capturer_->CaptureFrame();
-
-  // Verify no frame drop and no resolution change.
-  VideoCapturerListener::Stats stats = listener_->GetStats();
-  EXPECT_GE(stats.captured_frames, 10);
-  EXPECT_EQ(0, stats.dropped_frames);
-  VerifyAdaptedResolution(stats, capture_format_.width, capture_format_.height,
-                          capture_format_.width, capture_format_.height);
-  EXPECT_TRUE(stats.last_adapt_was_no_op);
-}
-
-TEST_F(VideoAdapterTest, AdaptZeroInterval) {
-  VideoFormat format = capturer_->GetSupportedFormats()->at(0);
-  format.interval = 0;
-  adapter_.OnOutputFormatRequest(format);
-  EXPECT_EQ(CS_RUNNING, capturer_->Start(capture_format_));
-  for (int i = 0; i < 10; ++i)
-    capturer_->CaptureFrame();
-
-  // Verify no crash and that frames aren't dropped.
-  VideoCapturerListener::Stats stats = listener_->GetStats();
-  EXPECT_GE(stats.captured_frames, 10);
-  EXPECT_EQ(0, stats.dropped_frames);
-  VerifyAdaptedResolution(stats, capture_format_.width, capture_format_.height,
-                          capture_format_.width, capture_format_.height);
-}
-
-// Adapt the frame rate to be half of the capture rate at the beginning. Expect
-// the number of dropped frames to be half of the number the captured frames.
-TEST_F(VideoAdapterTest, AdaptFramerateToHalf) {
-  VideoFormat request_format = capture_format_;
-  request_format.interval *= 2;
-  adapter_.OnOutputFormatRequest(request_format);
-  EXPECT_EQ(CS_RUNNING, capturer_->Start(capture_format_));
-
-  // Capture 10 frames and verify that every other frame is dropped. The first
-  // frame should not be dropped.
-  capturer_->CaptureFrame();
-  EXPECT_GE(listener_->GetStats().captured_frames, 1);
-  EXPECT_EQ(0, listener_->GetStats().dropped_frames);
-
-  capturer_->CaptureFrame();
-  EXPECT_GE(listener_->GetStats().captured_frames, 2);
-  EXPECT_EQ(1, listener_->GetStats().dropped_frames);
-
-  capturer_->CaptureFrame();
-  EXPECT_GE(listener_->GetStats().captured_frames, 3);
-  EXPECT_EQ(1, listener_->GetStats().dropped_frames);
-
-  capturer_->CaptureFrame();
-  EXPECT_GE(listener_->GetStats().captured_frames, 4);
-  EXPECT_EQ(2, listener_->GetStats().dropped_frames);
-
-  capturer_->CaptureFrame();
-  EXPECT_GE(listener_->GetStats().captured_frames, 5);
-  EXPECT_EQ(2, listener_->GetStats().dropped_frames);
-
-  capturer_->CaptureFrame();
-  EXPECT_GE(listener_->GetStats().captured_frames, 6);
-  EXPECT_EQ(3, listener_->GetStats().dropped_frames);
-
-  capturer_->CaptureFrame();
-  EXPECT_GE(listener_->GetStats().captured_frames, 7);
-  EXPECT_EQ(3, listener_->GetStats().dropped_frames);
-
-  capturer_->CaptureFrame();
-  EXPECT_GE(listener_->GetStats().captured_frames, 8);
-  EXPECT_EQ(4, listener_->GetStats().dropped_frames);
-
-  capturer_->CaptureFrame();
-  EXPECT_GE(listener_->GetStats().captured_frames, 9);
-  EXPECT_EQ(4, listener_->GetStats().dropped_frames);
-
-  capturer_->CaptureFrame();
-  EXPECT_GE(listener_->GetStats().captured_frames, 10);
-  EXPECT_EQ(5, listener_->GetStats().dropped_frames);
-}
-
-// Adapt the frame rate to be two thirds of the capture rate at the beginning.
-// Expect the number of dropped frames to be one thirds of the number the
-// captured frames.
-TEST_F(VideoAdapterTest, AdaptFramerateToTwoThirds) {
-  VideoFormat request_format = capture_format_;
-  request_format.interval = request_format.interval * 3 / 2;
-  adapter_.OnOutputFormatRequest(request_format);
-  EXPECT_EQ(CS_RUNNING, capturer_->Start(capture_format_));
-
-  // Capture 10 frames and verify that every third frame is dropped. The first
-  // frame should not be dropped.
-  capturer_->CaptureFrame();
-  EXPECT_GE(listener_->GetStats().captured_frames, 1);
-  EXPECT_EQ(0, listener_->GetStats().dropped_frames);
-
-  capturer_->CaptureFrame();
-  EXPECT_GE(listener_->GetStats().captured_frames, 2);
-  EXPECT_EQ(0, listener_->GetStats().dropped_frames);
-
-  capturer_->CaptureFrame();
-  EXPECT_GE(listener_->GetStats().captured_frames, 3);
-  EXPECT_EQ(1, listener_->GetStats().dropped_frames);
-
-  capturer_->CaptureFrame();
-  EXPECT_GE(listener_->GetStats().captured_frames, 4);
-  EXPECT_EQ(1, listener_->GetStats().dropped_frames);
-
-  capturer_->CaptureFrame();
-  EXPECT_GE(listener_->GetStats().captured_frames, 5);
-  EXPECT_EQ(1, listener_->GetStats().dropped_frames);
-
-  capturer_->CaptureFrame();
-  EXPECT_GE(listener_->GetStats().captured_frames, 6);
-  EXPECT_EQ(2, listener_->GetStats().dropped_frames);
-
-  capturer_->CaptureFrame();
-  EXPECT_GE(listener_->GetStats().captured_frames, 7);
-  EXPECT_EQ(2, listener_->GetStats().dropped_frames);
-
-  capturer_->CaptureFrame();
-  EXPECT_GE(listener_->GetStats().captured_frames, 8);
-  EXPECT_EQ(2, listener_->GetStats().dropped_frames);
-
-  capturer_->CaptureFrame();
-  EXPECT_GE(listener_->GetStats().captured_frames, 9);
-  EXPECT_EQ(3, listener_->GetStats().dropped_frames);
-
-  capturer_->CaptureFrame();
-  EXPECT_GE(listener_->GetStats().captured_frames, 10);
-  EXPECT_EQ(3, listener_->GetStats().dropped_frames);
-}
-
-// Request frame rate twice as high as captured frame rate. Expect no frame
-// drop.
-TEST_F(VideoAdapterTest, AdaptFramerateHighLimit) {
-  VideoFormat request_format = capture_format_;
-  request_format.interval /= 2;
-  adapter_.OnOutputFormatRequest(request_format);
-  EXPECT_EQ(CS_RUNNING, capturer_->Start(capture_format_));
-  for (int i = 0; i < 10; ++i)
-    capturer_->CaptureFrame();
-
-  // Verify no frame drop.
-  EXPECT_EQ(0, listener_->GetStats().dropped_frames);
-}
-
-// After the first timestamp, add a big offset to the timestamps. Expect that
-// the adapter is conservative and resets to the new offset and does not drop
-// any frame.
-TEST_F(VideoAdapterTest, AdaptFramerateTimestampOffset) {
-  const int64_t capture_interval = VideoFormat::FpsToInterval(kDefaultFps);
-  adapter_.OnOutputFormatRequest(
-      VideoFormat(640, 480, capture_interval, cricket::FOURCC_ANY));
-
-  const int64_t first_timestamp = 0;
-  adapter_.AdaptFrameResolution(640, 480, first_timestamp,
-                                &cropped_width_, &cropped_height_,
-                                &out_width_, &out_height_);
-  EXPECT_GT(out_width_, 0);
-  EXPECT_GT(out_height_, 0);
-
-  const int64_t big_offset = -987654321LL * 1000;
-  const int64_t second_timestamp = big_offset;
-  adapter_.AdaptFrameResolution(640, 480, second_timestamp,
-                                &cropped_width_, &cropped_height_,
-                                &out_width_, &out_height_);
-  EXPECT_GT(out_width_, 0);
-  EXPECT_GT(out_height_, 0);
-
-  const int64_t third_timestamp = big_offset + capture_interval;
-  adapter_.AdaptFrameResolution(640, 480, third_timestamp,
-                                &cropped_width_, &cropped_height_,
-                                &out_width_, &out_height_);
-  EXPECT_GT(out_width_, 0);
-  EXPECT_GT(out_height_, 0);
-}
-
-// Request 30 fps and send 30 fps with jitter. Expect that no frame is dropped.
-TEST_F(VideoAdapterTest, AdaptFramerateTimestampJitter) {
-  const int64_t capture_interval = VideoFormat::FpsToInterval(kDefaultFps);
-  adapter_.OnOutputFormatRequest(
-      VideoFormat(640, 480, capture_interval, cricket::FOURCC_ANY));
-
-  adapter_.AdaptFrameResolution(640, 480, capture_interval * 0 / 10,
-                                &cropped_width_, &cropped_height_,
-                                &out_width_, &out_height_);
-  EXPECT_GT(out_width_, 0);
-  EXPECT_GT(out_height_, 0);
-
-  adapter_.AdaptFrameResolution(640, 480, capture_interval * 10 / 10 - 1,
-                                &cropped_width_, &cropped_height_,
-                                &out_width_, &out_height_);
-  EXPECT_GT(out_width_, 0);
-  EXPECT_GT(out_height_, 0);
-
-  adapter_.AdaptFrameResolution(640, 480, capture_interval * 25 / 10,
-                                &cropped_width_, &cropped_height_,
-                                &out_width_, &out_height_);
-  EXPECT_GT(out_width_, 0);
-  EXPECT_GT(out_height_, 0);
-
-  adapter_.AdaptFrameResolution(640, 480, capture_interval * 30 / 10,
-                                &cropped_width_, &cropped_height_,
-                                &out_width_, &out_height_);
-  EXPECT_GT(out_width_, 0);
-  EXPECT_GT(out_height_, 0);
-
-  adapter_.AdaptFrameResolution(640, 480, capture_interval * 35 / 10,
-                                &cropped_width_, &cropped_height_,
-                                &out_width_, &out_height_);
-  EXPECT_GT(out_width_, 0);
-  EXPECT_GT(out_height_, 0);
-
-  adapter_.AdaptFrameResolution(640, 480, capture_interval * 50 / 10,
-                                &cropped_width_, &cropped_height_,
-                                &out_width_, &out_height_);
-  EXPECT_GT(out_width_, 0);
-  EXPECT_GT(out_height_, 0);
-}
-
-// Adapt the frame rate to be half of the capture rate after capturing no less
-// than 10 frames. Expect no frame dropped before adaptation and frame dropped
-// after adaptation.
-TEST_F(VideoAdapterTest, AdaptFramerateOntheFly) {
-  VideoFormat request_format = capture_format_;
-  adapter_.OnOutputFormatRequest(request_format);
-  EXPECT_EQ(CS_RUNNING, capturer_->Start(capture_format_));
-  for (int i = 0; i < 10; ++i)
-    capturer_->CaptureFrame();
-
-  // Verify no frame drop before adaptation.
-  EXPECT_EQ(0, listener_->GetStats().dropped_frames);
-
-  // Adapat the frame rate.
-  request_format.interval *= 2;
-  adapter_.OnOutputFormatRequest(request_format);
-
-  for (int i = 0; i < 20; ++i)
-    capturer_->CaptureFrame();
-
-  // Verify frame drop after adaptation.
-  EXPECT_GT(listener_->GetStats().dropped_frames, 0);
-}
-
-// Do not adapt the frame rate or the resolution. Expect no frame drop, no
-// cropping, and no resolution change.
-TEST_F(VideoAdapterTest, OnFramerateRequestMax) {
-  adapter_.OnResolutionFramerateRequest(rtc::Optional<int>(),
-                                        std::numeric_limits<int>::max(),
-                                        std::numeric_limits<int>::max());
-
-  EXPECT_EQ(CS_RUNNING, capturer_->Start(capture_format_));
-  for (int i = 0; i < 10; ++i)
-    capturer_->CaptureFrame();
-
-  // Verify no frame drop and no resolution change.
-  VideoCapturerListener::Stats stats = listener_->GetStats();
-  EXPECT_GE(stats.captured_frames, 10);
-  EXPECT_EQ(0, stats.dropped_frames);
-  VerifyAdaptedResolution(stats, capture_format_.width, capture_format_.height,
-                          capture_format_.width, capture_format_.height);
-  EXPECT_TRUE(stats.last_adapt_was_no_op);
-}
-
-TEST_F(VideoAdapterTest, OnFramerateRequestZero) {
-  adapter_.OnResolutionFramerateRequest(rtc::Optional<int>(),
-                                        std::numeric_limits<int>::max(), 0);
-  EXPECT_EQ(CS_RUNNING, capturer_->Start(capture_format_));
-  for (int i = 0; i < 10; ++i)
-    capturer_->CaptureFrame();
-
-  // Verify no crash and that frames aren't dropped.
-  VideoCapturerListener::Stats stats = listener_->GetStats();
-  EXPECT_GE(stats.captured_frames, 10);
-  EXPECT_EQ(10, stats.dropped_frames);
-}
-
-// Adapt the frame rate to be half of the capture rate at the beginning. Expect
-// the number of dropped frames to be half of the number the captured frames.
-TEST_F(VideoAdapterTest, OnFramerateRequestHalf) {
-  adapter_.OnResolutionFramerateRequest(
-      rtc::Optional<int>(), std::numeric_limits<int>::max(), kDefaultFps / 2);
-  EXPECT_EQ(CS_RUNNING, capturer_->Start(capture_format_));
-  for (int i = 0; i < 10; ++i)
-    capturer_->CaptureFrame();
-
-  // Verify no crash and that frames aren't dropped.
-  VideoCapturerListener::Stats stats = listener_->GetStats();
-  EXPECT_GE(stats.captured_frames, 10);
-  EXPECT_EQ(5, stats.dropped_frames);
-  VerifyAdaptedResolution(stats, capture_format_.width, capture_format_.height,
-                          capture_format_.width, capture_format_.height);
-}
-
-// Set a very high output pixel resolution. Expect no cropping or resolution
-// change.
-TEST_F(VideoAdapterTest, AdaptFrameResolutionHighLimit) {
-  VideoFormat output_format = capture_format_;
-  output_format.width *= 10;
-  output_format.height *= 10;
-  adapter_.OnOutputFormatRequest(output_format);
-  EXPECT_TRUE(adapter_.AdaptFrameResolution(
-      capture_format_.width, capture_format_.height, 0,
-      &cropped_width_, &cropped_height_,
-      &out_width_, &out_height_));
-  EXPECT_EQ(capture_format_.width, cropped_width_);
-  EXPECT_EQ(capture_format_.height, cropped_height_);
-  EXPECT_EQ(capture_format_.width, out_width_);
-  EXPECT_EQ(capture_format_.height, out_height_);
-}
-
-// Adapt the frame resolution to be the same as capture resolution. Expect no
-// cropping or resolution change.
-TEST_F(VideoAdapterTest, AdaptFrameResolutionIdentical) {
-  adapter_.OnOutputFormatRequest(capture_format_);
-  EXPECT_TRUE(adapter_.AdaptFrameResolution(
-      capture_format_.width, capture_format_.height, 0,
-      &cropped_width_, &cropped_height_,
-      &out_width_, &out_height_));
-  EXPECT_EQ(capture_format_.width, cropped_width_);
-  EXPECT_EQ(capture_format_.height, cropped_height_);
-  EXPECT_EQ(capture_format_.width, out_width_);
-  EXPECT_EQ(capture_format_.height, out_height_);
-}
-
-// Adapt the frame resolution to be a quarter of the capture resolution. Expect
-// no cropping, but a resolution change.
-TEST_F(VideoAdapterTest, AdaptFrameResolutionQuarter) {
-  VideoFormat request_format = capture_format_;
-  request_format.width /= 2;
-  request_format.height /= 2;
-  adapter_.OnOutputFormatRequest(request_format);
-  EXPECT_TRUE(adapter_.AdaptFrameResolution(
-      capture_format_.width, capture_format_.height, 0,
-      &cropped_width_, &cropped_height_,
-      &out_width_, &out_height_));
-  EXPECT_EQ(capture_format_.width, cropped_width_);
-  EXPECT_EQ(capture_format_.height, cropped_height_);
-  EXPECT_EQ(request_format.width, out_width_);
-  EXPECT_EQ(request_format.height, out_height_);
-}
-
-// Adapt the pixel resolution to 0. Expect frame drop.
-TEST_F(VideoAdapterTest, AdaptFrameResolutionDrop) {
-  VideoFormat output_format = capture_format_;
-  output_format.width = 0;
-  output_format.height = 0;
-  adapter_.OnOutputFormatRequest(output_format);
-  EXPECT_FALSE(adapter_.AdaptFrameResolution(
-      capture_format_.width, capture_format_.height, 0,
-      &cropped_width_, &cropped_height_,
-      &out_width_, &out_height_));
-}
-
-// Adapt the frame resolution to be a quarter of the capture resolution at the
-// beginning. Expect no cropping but a resolution change.
-TEST_F(VideoAdapterTest, AdaptResolution) {
-  VideoFormat request_format = capture_format_;
-  request_format.width /= 2;
-  request_format.height /= 2;
-  adapter_.OnOutputFormatRequest(request_format);
-  EXPECT_EQ(CS_RUNNING, capturer_->Start(capture_format_));
-  for (int i = 0; i < 10; ++i)
-    capturer_->CaptureFrame();
-
-  // Verify no frame drop, no cropping, and resolution change.
-  VideoCapturerListener::Stats stats = listener_->GetStats();
-  EXPECT_EQ(0, stats.dropped_frames);
-  VerifyAdaptedResolution(stats, capture_format_.width, capture_format_.height,
-                          request_format.width, request_format.height);
-}
-
-// Adapt the frame resolution to be a quarter of the capture resolution after
-// capturing no less than 10 frames. Expect no resolution change before
-// adaptation and resolution change after adaptation.
-TEST_F(VideoAdapterTest, AdaptResolutionOnTheFly) {
-  VideoFormat request_format = capture_format_;
-  adapter_.OnOutputFormatRequest(request_format);
-  EXPECT_EQ(CS_RUNNING, capturer_->Start(capture_format_));
-  for (int i = 0; i < 10; ++i)
-    capturer_->CaptureFrame();
-
-  // Verify no resolution change before adaptation.
-  VerifyAdaptedResolution(listener_->GetStats(),
-                          capture_format_.width, capture_format_.height,
-                          request_format.width, request_format.height);
-
-  // Adapt the frame resolution.
-  request_format.width /= 2;
-  request_format.height /= 2;
-  adapter_.OnOutputFormatRequest(request_format);
-  for (int i = 0; i < 10; ++i)
-    capturer_->CaptureFrame();
-
-  // Verify resolution change after adaptation.
-  VerifyAdaptedResolution(listener_->GetStats(),
-                          capture_format_.width, capture_format_.height,
-                          request_format.width, request_format.height);
-}
-
-// Drop all frames.
-TEST_F(VideoAdapterTest, DropAllFrames) {
-  VideoFormat format;  // with resolution 0x0.
-  adapter_.OnOutputFormatRequest(format);
-  EXPECT_EQ(CS_RUNNING, capturer_->Start(capture_format_));
-  for (int i = 0; i < 10; ++i)
-    capturer_->CaptureFrame();
-
-  // Verify all frames are dropped.
-  VideoCapturerListener::Stats stats = listener_->GetStats();
-  EXPECT_GE(stats.captured_frames, 10);
-  EXPECT_EQ(stats.captured_frames, stats.dropped_frames);
-}
-
-TEST_F(VideoAdapterTest, TestOnOutputFormatRequest) {
-  VideoFormat format(640, 400, 0, 0);
-  EXPECT_TRUE(adapter_.AdaptFrameResolution(640, 400, 0,
-                                            &cropped_width_, &cropped_height_,
-                                            &out_width_, &out_height_));
-  EXPECT_EQ(640, cropped_width_);
-  EXPECT_EQ(400, cropped_height_);
-  EXPECT_EQ(640, out_width_);
-  EXPECT_EQ(400, out_height_);
-
-  // Format request 640x400.
-  format.height = 400;
-  adapter_.OnOutputFormatRequest(format);
-  EXPECT_TRUE(adapter_.AdaptFrameResolution(640, 400, 0,
-                                            &cropped_width_, &cropped_height_,
-                                            &out_width_, &out_height_));
-  EXPECT_EQ(640, cropped_width_);
-  EXPECT_EQ(400, cropped_height_);
-  EXPECT_EQ(640, out_width_);
-  EXPECT_EQ(400, out_height_);
-
-  // Request 1280x720, higher than input, but aspect 16:9. Expect cropping but
-  // no scaling.
-  format.width = 1280;
-  format.height = 720;
-  adapter_.OnOutputFormatRequest(format);
-  EXPECT_TRUE(adapter_.AdaptFrameResolution(640, 400, 0,
-                                            &cropped_width_, &cropped_height_,
-                                            &out_width_, &out_height_));
-  EXPECT_EQ(640, cropped_width_);
-  EXPECT_EQ(360, cropped_height_);
-  EXPECT_EQ(640, out_width_);
-  EXPECT_EQ(360, out_height_);
-
-  // Request 0x0.
-  format.width = 0;
-  format.height = 0;
-  adapter_.OnOutputFormatRequest(format);
-  EXPECT_FALSE(adapter_.AdaptFrameResolution(640, 400, 0,
-                                             &cropped_width_, &cropped_height_,
-                                             &out_width_, &out_height_));
-
-  // Request 320x200. Expect scaling, but no cropping.
-  format.width = 320;
-  format.height = 200;
-  adapter_.OnOutputFormatRequest(format);
-  EXPECT_TRUE(adapter_.AdaptFrameResolution(640, 400, 0,
-                                            &cropped_width_, &cropped_height_,
-                                            &out_width_, &out_height_));
-  EXPECT_EQ(640, cropped_width_);
-  EXPECT_EQ(400, cropped_height_);
-  EXPECT_EQ(320, out_width_);
-  EXPECT_EQ(200, out_height_);
-
-  // Request resolution close to 2/3 scale. Expect adapt down. Scaling to 2/3
-  // is not optimized and not allowed, therefore 1/2 scaling will be used
-  // instead.
-  format.width = 424;
-  format.height = 265;
-  adapter_.OnOutputFormatRequest(format);
-  EXPECT_TRUE(adapter_.AdaptFrameResolution(640, 400, 0,
-                                            &cropped_width_, &cropped_height_,
-                                            &out_width_, &out_height_));
-  EXPECT_EQ(640, cropped_width_);
-  EXPECT_EQ(400, cropped_height_);
-  EXPECT_EQ(320, out_width_);
-  EXPECT_EQ(200, out_height_);
-
-  // Request resolution of 3 / 8. Expect adapt down.
-  format.width = 640 * 3 / 8;
-  format.height = 400 * 3 / 8;
-  adapter_.OnOutputFormatRequest(format);
-  EXPECT_TRUE(adapter_.AdaptFrameResolution(640, 400, 0,
-                                            &cropped_width_, &cropped_height_,
-                                            &out_width_, &out_height_));
-  EXPECT_EQ(640, cropped_width_);
-  EXPECT_EQ(400, cropped_height_);
-  EXPECT_EQ(640 * 3 / 8, out_width_);
-  EXPECT_EQ(400 * 3 / 8, out_height_);
-
-  // Switch back up. Expect adapt.
-  format.width = 320;
-  format.height = 200;
-  adapter_.OnOutputFormatRequest(format);
-  EXPECT_TRUE(adapter_.AdaptFrameResolution(640, 400, 0,
-                                            &cropped_width_, &cropped_height_,
-                                            &out_width_, &out_height_));
-  EXPECT_EQ(640, cropped_width_);
-  EXPECT_EQ(400, cropped_height_);
-  EXPECT_EQ(320, out_width_);
-  EXPECT_EQ(200, out_height_);
-
-  // Format request 480x300.
-  format.width = 480;
-  format.height = 300;
-  adapter_.OnOutputFormatRequest(format);
-  EXPECT_TRUE(adapter_.AdaptFrameResolution(640, 400, 0,
-                                            &cropped_width_, &cropped_height_,
-                                            &out_width_, &out_height_));
-  EXPECT_EQ(640, cropped_width_);
-  EXPECT_EQ(400, cropped_height_);
-  EXPECT_EQ(480, out_width_);
-  EXPECT_EQ(300, out_height_);
-}
-
-TEST_F(VideoAdapterTest, TestViewRequestPlusCameraSwitch) {
-  // Start at HD.
-  VideoFormat format(1280, 720, 0, 0);
-  EXPECT_TRUE(adapter_.AdaptFrameResolution(1280, 720, 0,
-                                            &cropped_width_, &cropped_height_,
-                                            &out_width_, &out_height_));
-  EXPECT_EQ(1280, cropped_width_);
-  EXPECT_EQ(720, cropped_height_);
-  EXPECT_EQ(1280, out_width_);
-  EXPECT_EQ(720, out_height_);
-
-  // Format request for VGA.
-  format.width = 640;
-  format.height = 360;
-  adapter_.OnOutputFormatRequest(format);
-  EXPECT_TRUE(adapter_.AdaptFrameResolution(1280, 720, 0,
-                                            &cropped_width_, &cropped_height_,
-                                            &out_width_, &out_height_));
-  EXPECT_EQ(1280, cropped_width_);
-  EXPECT_EQ(720, cropped_height_);
-  EXPECT_EQ(640, out_width_);
-  EXPECT_EQ(360, out_height_);
-
-  // Now, the camera reopens at VGA.
-  // Both the frame and the output format should be 640x360.
-  EXPECT_TRUE(adapter_.AdaptFrameResolution(640, 360, 0,
-                                            &cropped_width_, &cropped_height_,
-                                            &out_width_, &out_height_));
-  EXPECT_EQ(640, cropped_width_);
-  EXPECT_EQ(360, cropped_height_);
-  EXPECT_EQ(640, out_width_);
-  EXPECT_EQ(360, out_height_);
-
-  // And another view request comes in for 640x360, which should have no
-  // real impact.
-  adapter_.OnOutputFormatRequest(format);
-  EXPECT_TRUE(adapter_.AdaptFrameResolution(640, 360, 0,
-                                            &cropped_width_, &cropped_height_,
-                                            &out_width_, &out_height_));
-  EXPECT_EQ(640, cropped_width_);
-  EXPECT_EQ(360, cropped_height_);
-  EXPECT_EQ(640, out_width_);
-  EXPECT_EQ(360, out_height_);
-}
-
-TEST_F(VideoAdapterTest, TestVGAWidth) {
-  // Reqeuested Output format is 640x360.
-  VideoFormat format(640, 360, 0, FOURCC_I420);
-  adapter_.OnOutputFormatRequest(format);
-
-  EXPECT_TRUE(adapter_.AdaptFrameResolution(640, 480, 0,
-                                            &cropped_width_, &cropped_height_,
-                                            &out_width_, &out_height_));
-  // Expect cropping.
-  EXPECT_EQ(640, cropped_width_);
-  EXPECT_EQ(360, cropped_height_);
-  EXPECT_EQ(640, out_width_);
-  EXPECT_EQ(360, out_height_);
-
-  // But if frames come in at 640x360, we shouldn't adapt them down.
-  EXPECT_TRUE(adapter_.AdaptFrameResolution(640, 360, 0,
-                                            &cropped_width_, &cropped_height_,
-                                            &out_width_, &out_height_));
-  EXPECT_EQ(640, cropped_width_);
-  EXPECT_EQ(360, cropped_height_);
-  EXPECT_EQ(640, out_width_);
-  EXPECT_EQ(360, out_height_);
-
-  EXPECT_TRUE(adapter_.AdaptFrameResolution(640, 480, 0,
-                                            &cropped_width_, &cropped_height_,
-                                            &out_width_, &out_height_));
-  EXPECT_EQ(640, cropped_width_);
-  EXPECT_EQ(360, cropped_height_);
-  EXPECT_EQ(640, out_width_);
-  EXPECT_EQ(360, out_height_);
-}
-
-TEST_F(VideoAdapterTest, TestOnResolutionRequestInSmallSteps) {
-  EXPECT_TRUE(adapter_.AdaptFrameResolution(1280, 720, 0,
-                                            &cropped_width_, &cropped_height_,
-                                            &out_width_, &out_height_));
-  EXPECT_EQ(1280, cropped_width_);
-  EXPECT_EQ(720, cropped_height_);
-  EXPECT_EQ(1280, out_width_);
-  EXPECT_EQ(720, out_height_);
-
-  // Adapt down one step.
-  adapter_.OnResolutionFramerateRequest(rtc::Optional<int>(), 1280 * 720 - 1,
-                                        std::numeric_limits<int>::max());
-  EXPECT_TRUE(adapter_.AdaptFrameResolution(1280, 720, 0,
-                                            &cropped_width_, &cropped_height_,
-                                            &out_width_, &out_height_));
-  EXPECT_EQ(1280, cropped_width_);
-  EXPECT_EQ(720, cropped_height_);
-  EXPECT_EQ(960, out_width_);
-  EXPECT_EQ(540, out_height_);
-
-  // Adapt down one step more.
-  adapter_.OnResolutionFramerateRequest(rtc::Optional<int>(), 960 * 540 - 1,
-                                        std::numeric_limits<int>::max());
-  EXPECT_TRUE(adapter_.AdaptFrameResolution(1280, 720, 0,
-                                            &cropped_width_, &cropped_height_,
-                                            &out_width_, &out_height_));
-  EXPECT_EQ(1280, cropped_width_);
-  EXPECT_EQ(720, cropped_height_);
-  EXPECT_EQ(640, out_width_);
-  EXPECT_EQ(360, out_height_);
-
-  // Adapt down one step more.
-  adapter_.OnResolutionFramerateRequest(rtc::Optional<int>(), 640 * 360 - 1,
-                                        std::numeric_limits<int>::max());
-  EXPECT_TRUE(adapter_.AdaptFrameResolution(1280, 720, 0,
-                                            &cropped_width_, &cropped_height_,
-                                            &out_width_, &out_height_));
-  EXPECT_EQ(1280, cropped_width_);
-  EXPECT_EQ(720, cropped_height_);
-  EXPECT_EQ(480, out_width_);
-  EXPECT_EQ(270, out_height_);
-
-  // Adapt up one step.
-  adapter_.OnResolutionFramerateRequest(rtc::Optional<int>(640 * 360),
-                                        960 * 540,
-                                        std::numeric_limits<int>::max());
-  EXPECT_TRUE(adapter_.AdaptFrameResolution(1280, 720, 0,
-                                            &cropped_width_, &cropped_height_,
-                                            &out_width_, &out_height_));
-  EXPECT_EQ(1280, cropped_width_);
-  EXPECT_EQ(720, cropped_height_);
-  EXPECT_EQ(640, out_width_);
-  EXPECT_EQ(360, out_height_);
-
-  // Adapt up one step more.
-  adapter_.OnResolutionFramerateRequest(rtc::Optional<int>(960 * 540),
-                                        1280 * 720,
-                                        std::numeric_limits<int>::max());
-  EXPECT_TRUE(adapter_.AdaptFrameResolution(1280, 720, 0,
-                                            &cropped_width_, &cropped_height_,
-                                            &out_width_, &out_height_));
-  EXPECT_EQ(1280, cropped_width_);
-  EXPECT_EQ(720, cropped_height_);
-  EXPECT_EQ(960, out_width_);
-  EXPECT_EQ(540, out_height_);
-
-  // Adapt up one step more.
-  adapter_.OnResolutionFramerateRequest(rtc::Optional<int>(1280 * 720),
-                                        1920 * 1080,
-                                        std::numeric_limits<int>::max());
-  EXPECT_TRUE(adapter_.AdaptFrameResolution(1280, 720, 0,
-                                            &cropped_width_, &cropped_height_,
-                                            &out_width_, &out_height_));
-  EXPECT_EQ(1280, cropped_width_);
-  EXPECT_EQ(720, cropped_height_);
-  EXPECT_EQ(1280, out_width_);
-  EXPECT_EQ(720, out_height_);
-}
-
-TEST_F(VideoAdapterTest, TestOnResolutionRequestMaxZero) {
-  EXPECT_TRUE(adapter_.AdaptFrameResolution(1280, 720, 0,
-                                            &cropped_width_, &cropped_height_,
-                                            &out_width_, &out_height_));
-  EXPECT_EQ(1280, cropped_width_);
-  EXPECT_EQ(720, cropped_height_);
-  EXPECT_EQ(1280, out_width_);
-  EXPECT_EQ(720, out_height_);
-
-  adapter_.OnResolutionFramerateRequest(rtc::Optional<int>(), 0,
-                                        std::numeric_limits<int>::max());
-  EXPECT_FALSE(adapter_.AdaptFrameResolution(1280, 720, 0,
-                                             &cropped_width_, &cropped_height_,
-                                             &out_width_, &out_height_));
-}
-
-TEST_F(VideoAdapterTest, TestOnResolutionRequestInLargeSteps) {
-  // Large step down.
-  adapter_.OnResolutionFramerateRequest(rtc::Optional<int>(), 640 * 360 - 1,
-                                        std::numeric_limits<int>::max());
-  EXPECT_TRUE(adapter_.AdaptFrameResolution(1280, 720, 0,
-                                            &cropped_width_, &cropped_height_,
-                                            &out_width_, &out_height_));
-  EXPECT_EQ(1280, cropped_width_);
-  EXPECT_EQ(720, cropped_height_);
-  EXPECT_EQ(480, out_width_);
-  EXPECT_EQ(270, out_height_);
-
-  // Large step up.
-  adapter_.OnResolutionFramerateRequest(rtc::Optional<int>(1280 * 720),
-                                        1920 * 1080,
-                                        std::numeric_limits<int>::max());
-  EXPECT_TRUE(adapter_.AdaptFrameResolution(1280, 720, 0,
-                                            &cropped_width_, &cropped_height_,
-                                            &out_width_, &out_height_));
-  EXPECT_EQ(1280, cropped_width_);
-  EXPECT_EQ(720, cropped_height_);
-  EXPECT_EQ(1280, out_width_);
-  EXPECT_EQ(720, out_height_);
-}
-
-TEST_F(VideoAdapterTest, TestOnOutputFormatRequestCapsMaxResolution) {
-  adapter_.OnResolutionFramerateRequest(rtc::Optional<int>(), 640 * 360 - 1,
-                                        std::numeric_limits<int>::max());
-  EXPECT_TRUE(adapter_.AdaptFrameResolution(1280, 720, 0,
-                                            &cropped_width_, &cropped_height_,
-                                            &out_width_, &out_height_));
-  EXPECT_EQ(1280, cropped_width_);
-  EXPECT_EQ(720, cropped_height_);
-  EXPECT_EQ(480, out_width_);
-  EXPECT_EQ(270, out_height_);
-
-  VideoFormat new_format(640, 360, 0, FOURCC_I420);
-  adapter_.OnOutputFormatRequest(new_format);
-  EXPECT_TRUE(adapter_.AdaptFrameResolution(1280, 720, 0,
-                                            &cropped_width_, &cropped_height_,
-                                            &out_width_, &out_height_));
-  EXPECT_EQ(1280, cropped_width_);
-  EXPECT_EQ(720, cropped_height_);
-  EXPECT_EQ(480, out_width_);
-  EXPECT_EQ(270, out_height_);
-
-  adapter_.OnResolutionFramerateRequest(rtc::Optional<int>(), 960 * 720,
-                                        std::numeric_limits<int>::max());
-  EXPECT_TRUE(adapter_.AdaptFrameResolution(1280, 720, 0,
-                                            &cropped_width_, &cropped_height_,
-                                            &out_width_, &out_height_));
-  EXPECT_EQ(1280, cropped_width_);
-  EXPECT_EQ(720, cropped_height_);
-  EXPECT_EQ(640, out_width_);
-  EXPECT_EQ(360, out_height_);
-}
-
-TEST_F(VideoAdapterTest, TestOnResolutionRequestReset) {
-  EXPECT_TRUE(adapter_.AdaptFrameResolution(1280, 720, 0,
-                                            &cropped_width_, &cropped_height_,
-                                            &out_width_, &out_height_));
-  EXPECT_EQ(1280, cropped_width_);
-  EXPECT_EQ(720, cropped_height_);
-  EXPECT_EQ(1280, out_width_);
-  EXPECT_EQ(720, out_height_);
-
-  adapter_.OnResolutionFramerateRequest(rtc::Optional<int>(), 640 * 360 - 1,
-                                        std::numeric_limits<int>::max());
-  EXPECT_TRUE(adapter_.AdaptFrameResolution(1280, 720, 0,
-                                            &cropped_width_, &cropped_height_,
-                                            &out_width_, &out_height_));
-  EXPECT_EQ(1280, cropped_width_);
-  EXPECT_EQ(720, cropped_height_);
-  EXPECT_EQ(480, out_width_);
-  EXPECT_EQ(270, out_height_);
-
-  adapter_.OnResolutionFramerateRequest(rtc::Optional<int>(),
-                                        std::numeric_limits<int>::max(),
-                                        std::numeric_limits<int>::max());
-  EXPECT_TRUE(adapter_.AdaptFrameResolution(1280, 720, 0,
-                                            &cropped_width_, &cropped_height_,
-                                            &out_width_, &out_height_));
-  EXPECT_EQ(1280, cropped_width_);
-  EXPECT_EQ(720, cropped_height_);
-  EXPECT_EQ(1280, out_width_);
-  EXPECT_EQ(720, out_height_);
-}
-
-TEST_F(VideoAdapterTest, TestCroppingWithResolutionRequest) {
-  // Ask for 640x360 (16:9 aspect).
-  adapter_.OnOutputFormatRequest(VideoFormat(640, 360, 0, FOURCC_I420));
-  // Send 640x480 (4:3 aspect).
-  EXPECT_TRUE(adapter_.AdaptFrameResolution(640, 480, 0,
-                                            &cropped_width_, &cropped_height_,
-                                            &out_width_, &out_height_));
-  // Expect cropping to 16:9 format and no scaling.
-  EXPECT_EQ(640, cropped_width_);
-  EXPECT_EQ(360, cropped_height_);
-  EXPECT_EQ(640, out_width_);
-  EXPECT_EQ(360, out_height_);
-
-  // Adapt down one step.
-  adapter_.OnResolutionFramerateRequest(rtc::Optional<int>(), 640 * 360 - 1,
-                                        std::numeric_limits<int>::max());
-  // Expect cropping to 16:9 format and 3/4 scaling.
-  EXPECT_TRUE(adapter_.AdaptFrameResolution(640, 480, 0,
-                                            &cropped_width_, &cropped_height_,
-                                            &out_width_, &out_height_));
-  EXPECT_EQ(640, cropped_width_);
-  EXPECT_EQ(360, cropped_height_);
-  EXPECT_EQ(480, out_width_);
-  EXPECT_EQ(270, out_height_);
-
-  // Adapt down one step more.
-  adapter_.OnResolutionFramerateRequest(rtc::Optional<int>(), 480 * 270 - 1,
-                                        std::numeric_limits<int>::max());
-  // Expect cropping to 16:9 format and 1/2 scaling.
-  EXPECT_TRUE(adapter_.AdaptFrameResolution(640, 480, 0,
-                                            &cropped_width_, &cropped_height_,
-                                            &out_width_, &out_height_));
-  EXPECT_EQ(640, cropped_width_);
-  EXPECT_EQ(360, cropped_height_);
-  EXPECT_EQ(320, out_width_);
-  EXPECT_EQ(180, out_height_);
-
-  // Adapt up one step.
-  adapter_.OnResolutionFramerateRequest(rtc::Optional<int>(480 * 270),
-                                        640 * 360,
-                                        std::numeric_limits<int>::max());
-  // Expect cropping to 16:9 format and 3/4 scaling.
-  EXPECT_TRUE(adapter_.AdaptFrameResolution(640, 480, 0,
-                                            &cropped_width_, &cropped_height_,
-                                            &out_width_, &out_height_));
-  EXPECT_EQ(640, cropped_width_);
-  EXPECT_EQ(360, cropped_height_);
-  EXPECT_EQ(480, out_width_);
-  EXPECT_EQ(270, out_height_);
-
-  // Adapt up one step more.
-  adapter_.OnResolutionFramerateRequest(rtc::Optional<int>(640 * 360),
-                                        960 * 540,
-                                        std::numeric_limits<int>::max());
-  // Expect cropping to 16:9 format and no scaling.
-  EXPECT_TRUE(adapter_.AdaptFrameResolution(640, 480, 0,
-                                            &cropped_width_, &cropped_height_,
-                                            &out_width_, &out_height_));
-  EXPECT_EQ(640, cropped_width_);
-  EXPECT_EQ(360, cropped_height_);
-  EXPECT_EQ(640, out_width_);
-  EXPECT_EQ(360, out_height_);
-
-  // Try to adapt up one step more.
-  adapter_.OnResolutionFramerateRequest(rtc::Optional<int>(960 * 540),
-                                        1280 * 720,
-                                        std::numeric_limits<int>::max());
-  // Expect cropping to 16:9 format and no scaling.
-  EXPECT_TRUE(adapter_.AdaptFrameResolution(640, 480, 0,
-                                            &cropped_width_, &cropped_height_,
-                                            &out_width_, &out_height_));
-  EXPECT_EQ(640, cropped_width_);
-  EXPECT_EQ(360, cropped_height_);
-  EXPECT_EQ(640, out_width_);
-  EXPECT_EQ(360, out_height_);
-}
-
-TEST_F(VideoAdapterTest, TestCroppingOddResolution) {
-  // Ask for 640x360 (16:9 aspect), with 3/16 scaling.
-  adapter_.OnOutputFormatRequest(
-      VideoFormat(640, 360, 0, FOURCC_I420));
-  adapter_.OnResolutionFramerateRequest(rtc::Optional<int>(),
-                                        640 * 360 * 3 / 16 * 3 / 16,
-                                        std::numeric_limits<int>::max());
-
-  // Send 640x480 (4:3 aspect).
-  EXPECT_TRUE(adapter_.AdaptFrameResolution(640, 480, 0,
-                                            &cropped_width_, &cropped_height_,
-                                            &out_width_, &out_height_));
-
-  // Instead of getting the exact aspect ratio with cropped resolution 640x360,
-  // the resolution should be adjusted to get a perfect scale factor instead.
-  EXPECT_EQ(640, cropped_width_);
-  EXPECT_EQ(368, cropped_height_);
-  EXPECT_EQ(120, out_width_);
-  EXPECT_EQ(69, out_height_);
-}
-
-TEST_F(VideoAdapterTest, TestAdaptToVerySmallResolution) {
-  // Ask for 1920x1080 (16:9 aspect), with 1/16 scaling.
-  const int w = 1920;
-  const int h = 1080;
-  adapter_.OnOutputFormatRequest(VideoFormat(w, h, 0, FOURCC_I420));
-  adapter_.OnResolutionFramerateRequest(rtc::Optional<int>(),
-                                        w * h * 1 / 16 * 1 / 16,
-                                        std::numeric_limits<int>::max());
-
-  // Send 1920x1080 (16:9 aspect).
-  EXPECT_TRUE(adapter_.AdaptFrameResolution(
-      w, h, 0, &cropped_width_, &cropped_height_, &out_width_, &out_height_));
-
-  // Instead of getting the exact aspect ratio with cropped resolution 1920x1080
-  // the resolution should be adjusted to get a perfect scale factor instead.
-  EXPECT_EQ(1920, cropped_width_);
-  EXPECT_EQ(1072, cropped_height_);
-  EXPECT_EQ(120, out_width_);
-  EXPECT_EQ(67, out_height_);
-
-  // Adapt back up one step to 3/32.
-  adapter_.OnResolutionFramerateRequest(
-      rtc::Optional<int>(w * h * 3 / 32 * 3 / 32), w * h * 1 / 8 * 1 / 8,
-      std::numeric_limits<int>::max());
-
-  // Send 1920x1080 (16:9 aspect).
-  EXPECT_TRUE(adapter_.AdaptFrameResolution(
-      w, h, 0, &cropped_width_, &cropped_height_, &out_width_, &out_height_));
-
-  EXPECT_EQ(180, out_width_);
-  EXPECT_EQ(99, out_height_);
-}
-
-TEST_F(VideoAdapterTest, AdaptFrameResolutionDropWithResolutionRequest) {
-  VideoFormat output_format = capture_format_;
-  output_format.width = 0;
-  output_format.height = 0;
-  adapter_.OnOutputFormatRequest(output_format);
-  EXPECT_FALSE(adapter_.AdaptFrameResolution(
-      capture_format_.width, capture_format_.height, 0,
-      &cropped_width_, &cropped_height_,
-      &out_width_, &out_height_));
-
-  adapter_.OnResolutionFramerateRequest(rtc::Optional<int>(960 * 540),
-                                        std::numeric_limits<int>::max(),
-                                        std::numeric_limits<int>::max());
-
-  // Still expect all frames to be dropped
-  EXPECT_FALSE(adapter_.AdaptFrameResolution(
-      capture_format_.width, capture_format_.height, 0,
-      &cropped_width_, &cropped_height_,
-      &out_width_, &out_height_));
-
-  adapter_.OnResolutionFramerateRequest(rtc::Optional<int>(), 640 * 480 - 1,
-                                        std::numeric_limits<int>::max());
-
-  // Still expect all frames to be dropped
-  EXPECT_FALSE(adapter_.AdaptFrameResolution(
-      capture_format_.width, capture_format_.height, 0,
-      &cropped_width_, &cropped_height_,
-      &out_width_, &out_height_));
-}
-
-// Test that we will adapt to max given a target pixel count close to max.
-TEST_F(VideoAdapterTest, TestAdaptToMax) {
-  adapter_.OnOutputFormatRequest(VideoFormat(640, 360, 0, FOURCC_I420));
-  adapter_.OnResolutionFramerateRequest(
-      rtc::Optional<int>(640 * 360 - 1) /* target */,
-      std::numeric_limits<int>::max(), std::numeric_limits<int>::max());
-
-  EXPECT_TRUE(adapter_.AdaptFrameResolution(640, 360, 0, &cropped_width_,
-                                            &cropped_height_, &out_width_,
-                                            &out_height_));
-  EXPECT_EQ(640, out_width_);
-  EXPECT_EQ(360, out_height_);
-}
-}  // namespace cricket
diff --git a/media/base/videobroadcaster.cc b/media/base/videobroadcaster.cc
deleted file mode 100644
index 8bd65c4..0000000
--- a/media/base/videobroadcaster.cc
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- *  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/media/base/videobroadcaster.h"
-
-#include <limits>
-
-#include "webrtc/api/video/i420_buffer.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-
-namespace rtc {
-
-VideoBroadcaster::VideoBroadcaster() {
-  thread_checker_.DetachFromThread();
-}
-
-void VideoBroadcaster::AddOrUpdateSink(
-    VideoSinkInterface<webrtc::VideoFrame>* sink,
-    const VideoSinkWants& wants) {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  RTC_DCHECK(sink != nullptr);
-  rtc::CritScope cs(&sinks_and_wants_lock_);
-  VideoSourceBase::AddOrUpdateSink(sink, wants);
-  UpdateWants();
-}
-
-void VideoBroadcaster::RemoveSink(
-    VideoSinkInterface<webrtc::VideoFrame>* sink) {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  RTC_DCHECK(sink != nullptr);
-  rtc::CritScope cs(&sinks_and_wants_lock_);
-  VideoSourceBase::RemoveSink(sink);
-  UpdateWants();
-}
-
-bool VideoBroadcaster::frame_wanted() const {
-  rtc::CritScope cs(&sinks_and_wants_lock_);
-  return !sink_pairs().empty();
-}
-
-VideoSinkWants VideoBroadcaster::wants() const {
-  rtc::CritScope cs(&sinks_and_wants_lock_);
-  return current_wants_;
-}
-
-void VideoBroadcaster::OnFrame(const webrtc::VideoFrame& frame) {
-  rtc::CritScope cs(&sinks_and_wants_lock_);
-  for (auto& sink_pair : sink_pairs()) {
-    if (sink_pair.wants.rotation_applied &&
-        frame.rotation() != webrtc::kVideoRotation_0) {
-      // Calls to OnFrame are not synchronized with changes to the sink wants.
-      // When rotation_applied is set to true, one or a few frames may get here
-      // with rotation still pending. Protect sinks that don't expect any
-      // pending rotation.
-      LOG(LS_VERBOSE) << "Discarding frame with unexpected rotation.";
-      continue;
-    }
-    if (sink_pair.wants.black_frames) {
-      sink_pair.sink->OnFrame(webrtc::VideoFrame(
-          GetBlackFrameBuffer(frame.width(), frame.height()), frame.rotation(),
-          frame.timestamp_us()));
-    } else {
-      sink_pair.sink->OnFrame(frame);
-    }
-  }
-}
-
-void VideoBroadcaster::UpdateWants() {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-
-  VideoSinkWants wants;
-  wants.rotation_applied = false;
-  for (auto& sink : sink_pairs()) {
-    // wants.rotation_applied == ANY(sink.wants.rotation_applied)
-    if (sink.wants.rotation_applied) {
-      wants.rotation_applied = true;
-    }
-    // wants.max_pixel_count == MIN(sink.wants.max_pixel_count)
-    if (sink.wants.max_pixel_count < wants.max_pixel_count) {
-      wants.max_pixel_count = sink.wants.max_pixel_count;
-    }
-    // Select the minimum requested target_pixel_count, if any, of all sinks so
-    // that we don't over utilize the resources for any one.
-    // TODO(sprang): Consider using the median instead, since the limit can be
-    // expressed by max_pixel_count.
-    if (sink.wants.target_pixel_count &&
-        (!wants.target_pixel_count ||
-         (*sink.wants.target_pixel_count < *wants.target_pixel_count))) {
-      wants.target_pixel_count = sink.wants.target_pixel_count;
-    }
-    // Select the minimum for the requested max framerates.
-    if (sink.wants.max_framerate_fps < wants.max_framerate_fps) {
-      wants.max_framerate_fps = sink.wants.max_framerate_fps;
-    }
-  }
-
-  if (wants.target_pixel_count &&
-      *wants.target_pixel_count >= wants.max_pixel_count) {
-    wants.target_pixel_count.emplace(wants.max_pixel_count);
-  }
-  current_wants_ = wants;
-}
-
-const rtc::scoped_refptr<webrtc::VideoFrameBuffer>&
-VideoBroadcaster::GetBlackFrameBuffer(int width, int height) {
-  if (!black_frame_buffer_ || black_frame_buffer_->width() != width ||
-      black_frame_buffer_->height() != height) {
-    rtc::scoped_refptr<webrtc::I420Buffer> buffer =
-        webrtc::I420Buffer::Create(width, height);
-    webrtc::I420Buffer::SetBlack(buffer.get());
-    black_frame_buffer_ = buffer;
-  }
-
-  return black_frame_buffer_;
-}
-
-}  // namespace rtc
diff --git a/media/base/videobroadcaster.h b/media/base/videobroadcaster.h
deleted file mode 100644
index 32fefdd..0000000
--- a/media/base/videobroadcaster.h
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- *  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_MEDIA_BASE_VIDEOBROADCASTER_H_
-#define WEBRTC_MEDIA_BASE_VIDEOBROADCASTER_H_
-
-#include <memory>
-#include <utility>
-#include <vector>
-
-#include "webrtc/api/video/video_frame.h"
-#include "webrtc/media/base/videosinkinterface.h"
-#include "webrtc/media/base/videosourcebase.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/thread_checker.h"
-
-namespace rtc {
-
-// VideoBroadcaster broadcast video frames to sinks and combines
-// VideoSinkWants from its sinks. It does that by implementing
-// rtc::VideoSourceInterface and rtc::VideoSinkInterface.
-// Sinks must be added and removed on one and only one thread.
-// Video frames can be broadcasted on any thread. I.e VideoBroadcaster::OnFrame
-// can be called on any thread.
-class VideoBroadcaster : public VideoSourceBase,
-                         public VideoSinkInterface<webrtc::VideoFrame> {
- public:
-  VideoBroadcaster();
-  void AddOrUpdateSink(VideoSinkInterface<webrtc::VideoFrame>* sink,
-                       const VideoSinkWants& wants) override;
-  void RemoveSink(VideoSinkInterface<webrtc::VideoFrame>* sink) override;
-
-  // Returns true if the next frame will be delivered to at least one sink.
-  bool frame_wanted() const;
-
-  // Returns VideoSinkWants a source is requested to fulfill. They are
-  // aggregated by all VideoSinkWants from all sinks.
-  VideoSinkWants wants() const;
-
-  // This method ensures that if a sink sets rotation_applied == true,
-  // it will never receive a frame with pending rotation. Our caller
-  // may pass in frames without precise synchronization with changes
-  // to the VideoSinkWants.
-  void OnFrame(const webrtc::VideoFrame& frame) override;
-
- protected:
-  void UpdateWants() RTC_EXCLUSIVE_LOCKS_REQUIRED(sinks_and_wants_lock_);
-  const rtc::scoped_refptr<webrtc::VideoFrameBuffer>& GetBlackFrameBuffer(
-      int width,
-      int height) RTC_EXCLUSIVE_LOCKS_REQUIRED(sinks_and_wants_lock_);
-
-  ThreadChecker thread_checker_;
-  rtc::CriticalSection sinks_and_wants_lock_;
-
-  VideoSinkWants current_wants_ RTC_GUARDED_BY(sinks_and_wants_lock_);
-  rtc::scoped_refptr<webrtc::VideoFrameBuffer> black_frame_buffer_;
-};
-
-}  // namespace rtc
-
-#endif  // WEBRTC_MEDIA_BASE_VIDEOBROADCASTER_H_
diff --git a/media/base/videobroadcaster_unittest.cc b/media/base/videobroadcaster_unittest.cc
deleted file mode 100644
index 5e934e7..0000000
--- a/media/base/videobroadcaster_unittest.cc
+++ /dev/null
@@ -1,193 +0,0 @@
-/*
- *  Copyright 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/media/base/videobroadcaster.h"
-#include "webrtc/api/video/i420_buffer.h"
-#include "webrtc/api/video/video_frame.h"
-#include "webrtc/media/base/fakevideorenderer.h"
-#include "webrtc/rtc_base/gunit.h"
-
-using rtc::VideoBroadcaster;
-using rtc::VideoSinkWants;
-using cricket::FakeVideoRenderer;
-
-
-TEST(VideoBroadcasterTest, frame_wanted) {
-  VideoBroadcaster broadcaster;
-  EXPECT_FALSE(broadcaster.frame_wanted());
-
-  FakeVideoRenderer sink;
-  broadcaster.AddOrUpdateSink(&sink, rtc::VideoSinkWants());
-  EXPECT_TRUE(broadcaster.frame_wanted());
-
-  broadcaster.RemoveSink(&sink);
-  EXPECT_FALSE(broadcaster.frame_wanted());
-}
-
-TEST(VideoBroadcasterTest, OnFrame) {
-  VideoBroadcaster broadcaster;
-
-  FakeVideoRenderer sink1;
-  FakeVideoRenderer sink2;
-  broadcaster.AddOrUpdateSink(&sink1, rtc::VideoSinkWants());
-  broadcaster.AddOrUpdateSink(&sink2, rtc::VideoSinkWants());
-  static int kWidth = 100;
-  static int kHeight = 50;
-
-  rtc::scoped_refptr<webrtc::I420Buffer> buffer(
-      webrtc::I420Buffer::Create(kWidth, kHeight));
-  // Initialize, to avoid warnings on use of initialized values.
-  webrtc::I420Buffer::SetBlack(buffer);
-
-  webrtc::VideoFrame frame(buffer, webrtc::kVideoRotation_0, 0);
-
-  broadcaster.OnFrame(frame);
-  EXPECT_EQ(1, sink1.num_rendered_frames());
-  EXPECT_EQ(1, sink2.num_rendered_frames());
-
-  broadcaster.RemoveSink(&sink1);
-  broadcaster.OnFrame(frame);
-  EXPECT_EQ(1, sink1.num_rendered_frames());
-  EXPECT_EQ(2, sink2.num_rendered_frames());
-
-  broadcaster.AddOrUpdateSink(&sink1, rtc::VideoSinkWants());
-  broadcaster.OnFrame(frame);
-  EXPECT_EQ(2, sink1.num_rendered_frames());
-  EXPECT_EQ(3, sink2.num_rendered_frames());
-}
-
-TEST(VideoBroadcasterTest, AppliesRotationIfAnySinkWantsRotationApplied) {
-  VideoBroadcaster broadcaster;
-  EXPECT_FALSE(broadcaster.wants().rotation_applied);
-
-  FakeVideoRenderer sink1;
-  VideoSinkWants wants1;
-  wants1.rotation_applied = false;
-
-  broadcaster.AddOrUpdateSink(&sink1, wants1);
-  EXPECT_FALSE(broadcaster.wants().rotation_applied);
-
-  FakeVideoRenderer sink2;
-  VideoSinkWants wants2;
-  wants2.rotation_applied = true;
-
-  broadcaster.AddOrUpdateSink(&sink2, wants2);
-  EXPECT_TRUE(broadcaster.wants().rotation_applied);
-
-  broadcaster.RemoveSink(&sink2);
-  EXPECT_FALSE(broadcaster.wants().rotation_applied);
-}
-
-TEST(VideoBroadcasterTest, AppliesMinOfSinkWantsMaxPixelCount) {
-  VideoBroadcaster broadcaster;
-  EXPECT_EQ(std::numeric_limits<int>::max(),
-            broadcaster.wants().max_pixel_count);
-
-  FakeVideoRenderer sink1;
-  VideoSinkWants wants1;
-  wants1.max_pixel_count = 1280 * 720;
-
-  broadcaster.AddOrUpdateSink(&sink1, wants1);
-  EXPECT_EQ(1280 * 720, broadcaster.wants().max_pixel_count);
-
-  FakeVideoRenderer sink2;
-  VideoSinkWants wants2;
-  wants2.max_pixel_count = 640 * 360;
-  broadcaster.AddOrUpdateSink(&sink2, wants2);
-  EXPECT_EQ(640 * 360, broadcaster.wants().max_pixel_count);
-
-  broadcaster.RemoveSink(&sink2);
-  EXPECT_EQ(1280 * 720, broadcaster.wants().max_pixel_count);
-}
-
-TEST(VideoBroadcasterTest, AppliesMinOfSinkWantsMaxAndTargetPixelCount) {
-  VideoBroadcaster broadcaster;
-  EXPECT_TRUE(!broadcaster.wants().target_pixel_count);
-
-  FakeVideoRenderer sink1;
-  VideoSinkWants wants1;
-  wants1.target_pixel_count = rtc::Optional<int>(1280 * 720);
-
-  broadcaster.AddOrUpdateSink(&sink1, wants1);
-  EXPECT_EQ(1280 * 720, *broadcaster.wants().target_pixel_count);
-
-  FakeVideoRenderer sink2;
-  VideoSinkWants wants2;
-  wants2.target_pixel_count = rtc::Optional<int>(640 * 360);
-  broadcaster.AddOrUpdateSink(&sink2, wants2);
-  EXPECT_EQ(640 * 360, *broadcaster.wants().target_pixel_count);
-
-  broadcaster.RemoveSink(&sink2);
-  EXPECT_EQ(1280 * 720, *broadcaster.wants().target_pixel_count);
-}
-
-TEST(VideoBroadcasterTest, AppliesMinOfSinkWantsMaxFramerate) {
-  VideoBroadcaster broadcaster;
-  EXPECT_EQ(std::numeric_limits<int>::max(),
-            broadcaster.wants().max_framerate_fps);
-
-  FakeVideoRenderer sink1;
-  VideoSinkWants wants1;
-  wants1.max_framerate_fps = 30;
-
-  broadcaster.AddOrUpdateSink(&sink1, wants1);
-  EXPECT_EQ(30, broadcaster.wants().max_framerate_fps);
-
-  FakeVideoRenderer sink2;
-  VideoSinkWants wants2;
-  wants2.max_framerate_fps = 15;
-  broadcaster.AddOrUpdateSink(&sink2, wants2);
-  EXPECT_EQ(15, broadcaster.wants().max_framerate_fps);
-
-  broadcaster.RemoveSink(&sink2);
-  EXPECT_EQ(30, broadcaster.wants().max_framerate_fps);
-}
-
-TEST(VideoBroadcasterTest, SinkWantsBlackFrames) {
-  VideoBroadcaster broadcaster;
-  EXPECT_TRUE(!broadcaster.wants().black_frames);
-
-  FakeVideoRenderer sink1;
-  VideoSinkWants wants1;
-  wants1.black_frames = true;
-  broadcaster.AddOrUpdateSink(&sink1, wants1);
-
-  FakeVideoRenderer sink2;
-  VideoSinkWants wants2;
-  wants2.black_frames = false;
-  broadcaster.AddOrUpdateSink(&sink2, wants2);
-
-  rtc::scoped_refptr<webrtc::I420Buffer> buffer(
-      webrtc::I420Buffer::Create(100, 200));
-  // Makes it not all black.
-  buffer->InitializeData();
-
-  webrtc::VideoFrame frame1(buffer, webrtc::kVideoRotation_0,
-                            10 /* timestamp_us */);
-  broadcaster.OnFrame(frame1);
-  EXPECT_TRUE(sink1.black_frame());
-  EXPECT_EQ(10, sink1.timestamp_us());
-  EXPECT_FALSE(sink2.black_frame());
-  EXPECT_EQ(10, sink2.timestamp_us());
-
-  // Switch the sink wants.
-  wants1.black_frames = false;
-  broadcaster.AddOrUpdateSink(&sink1, wants1);
-  wants2.black_frames = true;
-  broadcaster.AddOrUpdateSink(&sink2, wants2);
-
-  webrtc::VideoFrame frame2(buffer, webrtc::kVideoRotation_0,
-                            30 /* timestamp_us */);
-  broadcaster.OnFrame(frame2);
-  EXPECT_FALSE(sink1.black_frame());
-  EXPECT_EQ(30, sink1.timestamp_us());
-  EXPECT_TRUE(sink2.black_frame());
-  EXPECT_EQ(30, sink2.timestamp_us());
-}
diff --git a/media/base/videocapturer.cc b/media/base/videocapturer.cc
deleted file mode 100644
index b65eeec..0000000
--- a/media/base/videocapturer.cc
+++ /dev/null
@@ -1,373 +0,0 @@
-/*
- *  Copyright (c) 2010 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.
- */
-
-// Implementation file of class VideoCapturer.
-
-#include "webrtc/media/base/videocapturer.h"
-
-#include <algorithm>
-
-#include "webrtc/api/video/i420_buffer.h"
-#include "webrtc/api/video/video_frame.h"
-#include "webrtc/rtc_base/logging.h"
-
-namespace cricket {
-
-namespace {
-
-static const int64_t kMaxDistance = ~(static_cast<int64_t>(1) << 63);
-#ifdef WEBRTC_LINUX
-static const int kYU12Penalty = 16;  // Needs to be higher than MJPG index.
-#endif
-
-}  // namespace
-
-/////////////////////////////////////////////////////////////////////
-// Implementation of class VideoCapturer
-/////////////////////////////////////////////////////////////////////
-VideoCapturer::VideoCapturer() : apply_rotation_(false) {
-  thread_checker_.DetachFromThread();
-  Construct();
-}
-
-void VideoCapturer::Construct() {
-  enable_camera_list_ = false;
-  capture_state_ = CS_STOPPED;
-  scaled_width_ = 0;
-  scaled_height_ = 0;
-  enable_video_adapter_ = true;
-}
-
-const std::vector<VideoFormat>* VideoCapturer::GetSupportedFormats() const {
-  return &filtered_supported_formats_;
-}
-
-bool VideoCapturer::StartCapturing(const VideoFormat& capture_format) {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  CaptureState result = Start(capture_format);
-  const bool success = (result == CS_RUNNING) || (result == CS_STARTING);
-  if (!success) {
-    return false;
-  }
-  if (result == CS_RUNNING) {
-    SetCaptureState(result);
-  }
-  return true;
-}
-
-void VideoCapturer::SetSupportedFormats(
-    const std::vector<VideoFormat>& formats) {
-  // This method is OK to call during initialization on a separate thread.
-  RTC_DCHECK(capture_state_ == CS_STOPPED ||
-             thread_checker_.CalledOnValidThread());
-  supported_formats_ = formats;
-  UpdateFilteredSupportedFormats();
-}
-
-bool VideoCapturer::GetBestCaptureFormat(const VideoFormat& format,
-                                         VideoFormat* best_format) {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  // TODO(fbarchard): Directly support max_format.
-  UpdateFilteredSupportedFormats();
-  const std::vector<VideoFormat>* supported_formats = GetSupportedFormats();
-
-  if (supported_formats->empty()) {
-    return false;
-  }
-  LOG(LS_INFO) << " Capture Requested " << format.ToString();
-  int64_t best_distance = kMaxDistance;
-  std::vector<VideoFormat>::const_iterator best = supported_formats->end();
-  std::vector<VideoFormat>::const_iterator i;
-  for (i = supported_formats->begin(); i != supported_formats->end(); ++i) {
-    int64_t distance = GetFormatDistance(format, *i);
-    // TODO(fbarchard): Reduce to LS_VERBOSE if/when camera capture is
-    // relatively bug free.
-    LOG(LS_INFO) << " Supported " << i->ToString() << " distance " << distance;
-    if (distance < best_distance) {
-      best_distance = distance;
-      best = i;
-    }
-  }
-  if (supported_formats->end() == best) {
-    LOG(LS_ERROR) << " No acceptable camera format found";
-    return false;
-  }
-
-  if (best_format) {
-    best_format->width = best->width;
-    best_format->height = best->height;
-    best_format->fourcc = best->fourcc;
-    best_format->interval = best->interval;
-    LOG(LS_INFO) << " Best " << best_format->ToString() << " Interval "
-                 << best_format->interval << " distance " << best_distance;
-  }
-  return true;
-}
-
-void VideoCapturer::ConstrainSupportedFormats(const VideoFormat& max_format) {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  max_format_.reset(new VideoFormat(max_format));
-  LOG(LS_VERBOSE) << " ConstrainSupportedFormats " << max_format.ToString();
-  UpdateFilteredSupportedFormats();
-}
-
-bool VideoCapturer::GetInputSize(int* width, int* height) {
-  rtc::CritScope cs(&frame_stats_crit_);
-  if (!input_size_valid_) {
-    return false;
-  }
-  *width = input_width_;
-  *height = input_height_;
-
-  return true;
-}
-
-void VideoCapturer::RemoveSink(
-    rtc::VideoSinkInterface<webrtc::VideoFrame>* sink) {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  broadcaster_.RemoveSink(sink);
-  OnSinkWantsChanged(broadcaster_.wants());
-}
-
-void VideoCapturer::AddOrUpdateSink(
-    rtc::VideoSinkInterface<webrtc::VideoFrame>* sink,
-    const rtc::VideoSinkWants& wants) {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  broadcaster_.AddOrUpdateSink(sink, wants);
-  OnSinkWantsChanged(broadcaster_.wants());
-}
-
-void VideoCapturer::OnSinkWantsChanged(const rtc::VideoSinkWants& wants) {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  apply_rotation_ = wants.rotation_applied;
-
-  if (video_adapter()) {
-    video_adapter()->OnResolutionFramerateRequest(wants.target_pixel_count,
-                                                  wants.max_pixel_count,
-                                                  wants.max_framerate_fps);
-  }
-}
-
-bool VideoCapturer::AdaptFrame(int width,
-                               int height,
-                               int64_t camera_time_us,
-                               int64_t system_time_us,
-                               int* out_width,
-                               int* out_height,
-                               int* crop_width,
-                               int* crop_height,
-                               int* crop_x,
-                               int* crop_y,
-                               int64_t* translated_camera_time_us) {
-  if (translated_camera_time_us) {
-    *translated_camera_time_us =
-        timestamp_aligner_.TranslateTimestamp(camera_time_us, system_time_us);
-  }
-  if (!broadcaster_.frame_wanted()) {
-    return false;
-  }
-
-  if (enable_video_adapter_ && !IsScreencast()) {
-    if (!video_adapter_.AdaptFrameResolution(
-            width, height, camera_time_us * rtc::kNumNanosecsPerMicrosec,
-            crop_width, crop_height, out_width, out_height)) {
-      // VideoAdapter dropped the frame.
-      return false;
-    }
-    *crop_x = (width - *crop_width) / 2;
-    *crop_y = (height - *crop_height) / 2;
-  } else {
-    *out_width = width;
-    *out_height = height;
-    *crop_width = width;
-    *crop_height = height;
-    *crop_x = 0;
-    *crop_y = 0;
-  }
-
-  return true;
-}
-
-void VideoCapturer::OnFrame(const webrtc::VideoFrame& frame,
-                            int orig_width,
-                            int orig_height) {
-  // For a child class which implements rotation itself, we should
-  // always have apply_rotation_ == false or frame.rotation() == 0.
-  // Except possibly during races where apply_rotation_ is changed
-  // mid-stream.
-  if (apply_rotation_ && frame.rotation() != webrtc::kVideoRotation_0) {
-    rtc::scoped_refptr<webrtc::VideoFrameBuffer> buffer(
-        frame.video_frame_buffer());
-    if (buffer->type() != webrtc::VideoFrameBuffer::Type::kI420) {
-      // Sources producing non-I420 frames must handle apply_rotation
-      // themselves. But even if they do, we may occasionally end up
-      // in this case, for frames in flight at the time
-      // applied_rotation is set to true. In that case, we just drop
-      // the frame.
-      LOG(LS_WARNING) << "Non-I420 frame requiring rotation. Discarding.";
-      return;
-    }
-    broadcaster_.OnFrame(webrtc::VideoFrame(
-        webrtc::I420Buffer::Rotate(*buffer->GetI420(), frame.rotation()),
-        webrtc::kVideoRotation_0, frame.timestamp_us()));
-  } else {
-    broadcaster_.OnFrame(frame);
-  }
-  UpdateInputSize(orig_width, orig_height);
-}
-
-void VideoCapturer::SetCaptureState(CaptureState state) {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  if (state == capture_state_) {
-    // Don't trigger a state changed callback if the state hasn't changed.
-    return;
-  }
-  capture_state_ = state;
-  SignalStateChange(this, capture_state_);
-}
-
-// Get the distance between the supported and desired formats.
-// Prioritization is done according to this algorithm:
-// 1) Width closeness. If not same, we prefer wider.
-// 2) Height closeness. If not same, we prefer higher.
-// 3) Framerate closeness. If not same, we prefer faster.
-// 4) Compression. If desired format has a specific fourcc, we need exact match;
-//                otherwise, we use preference.
-int64_t VideoCapturer::GetFormatDistance(const VideoFormat& desired,
-                                         const VideoFormat& supported) {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  int64_t distance = kMaxDistance;
-
-  // Check fourcc.
-  uint32_t supported_fourcc = CanonicalFourCC(supported.fourcc);
-  int64_t delta_fourcc = kMaxDistance;
-  if (FOURCC_ANY == desired.fourcc) {
-    // Any fourcc is OK for the desired. Use preference to find best fourcc.
-    std::vector<uint32_t> preferred_fourccs;
-    if (!GetPreferredFourccs(&preferred_fourccs)) {
-      return distance;
-    }
-
-    for (size_t i = 0; i < preferred_fourccs.size(); ++i) {
-      if (supported_fourcc == CanonicalFourCC(preferred_fourccs[i])) {
-        delta_fourcc = i;
-#ifdef WEBRTC_LINUX
-        // For HD avoid YU12 which is a software conversion and has 2 bugs
-        // b/7326348 b/6960899.  Reenable when fixed.
-        if (supported.height >= 720 && (supported_fourcc == FOURCC_YU12 ||
-                                        supported_fourcc == FOURCC_YV12)) {
-          delta_fourcc += kYU12Penalty;
-        }
-#endif
-        break;
-      }
-    }
-  } else if (supported_fourcc == CanonicalFourCC(desired.fourcc)) {
-    delta_fourcc = 0;  // Need exact match.
-  }
-
-  if (kMaxDistance == delta_fourcc) {
-    // Failed to match fourcc.
-    return distance;
-  }
-
-  // Check resolution and fps.
-  int desired_width = desired.width;
-  int desired_height = desired.height;
-  int64_t delta_w = supported.width - desired_width;
-  float supported_fps = VideoFormat::IntervalToFpsFloat(supported.interval);
-  float delta_fps =
-      supported_fps - VideoFormat::IntervalToFpsFloat(desired.interval);
-  // Check height of supported height compared to height we would like it to be.
-  int64_t aspect_h = desired_width
-                         ? supported.width * desired_height / desired_width
-                         : desired_height;
-  int64_t delta_h = supported.height - aspect_h;
-
-  distance = 0;
-  // Set high penalty if the supported format is lower than the desired format.
-  // 3x means we would prefer down to down to 3/4, than up to double.
-  // But we'd prefer up to double than down to 1/2.  This is conservative,
-  // strongly avoiding going down in resolution, similar to
-  // the old method, but not completely ruling it out in extreme situations.
-  // It also ignores framerate, which is often very low at high resolutions.
-  // TODO(fbarchard): Improve logic to use weighted factors.
-  static const int kDownPenalty = -3;
-  if (delta_w < 0) {
-    delta_w = delta_w * kDownPenalty;
-  }
-  if (delta_h < 0) {
-    delta_h = delta_h * kDownPenalty;
-  }
-  // Require camera fps to be at least 80% of what is requested if resolution
-  // matches.
-  // Require camera fps to be at least 96% of what is requested, or higher,
-  // if resolution differs. 96% allows for slight variations in fps. e.g. 29.97
-  if (delta_fps < 0) {
-    float min_desirable_fps = delta_w ?
-    VideoFormat::IntervalToFpsFloat(desired.interval) * 28.f / 30.f :
-    VideoFormat::IntervalToFpsFloat(desired.interval) * 23.f / 30.f;
-    delta_fps = -delta_fps;
-    if (supported_fps < min_desirable_fps) {
-      distance |= static_cast<int64_t>(1) << 62;
-    } else {
-      distance |= static_cast<int64_t>(1) << 15;
-    }
-  }
-  int64_t idelta_fps = static_cast<int>(delta_fps);
-
-  // 12 bits for width and height and 8 bits for fps and fourcc.
-  distance |=
-      (delta_w << 28) | (delta_h << 16) | (idelta_fps << 8) | delta_fourcc;
-
-  return distance;
-}
-
-void VideoCapturer::UpdateFilteredSupportedFormats() {
-  filtered_supported_formats_.clear();
-  filtered_supported_formats_ = supported_formats_;
-  if (!max_format_) {
-    return;
-  }
-  std::vector<VideoFormat>::iterator iter = filtered_supported_formats_.begin();
-  while (iter != filtered_supported_formats_.end()) {
-    if (ShouldFilterFormat(*iter)) {
-      iter = filtered_supported_formats_.erase(iter);
-    } else {
-      ++iter;
-    }
-  }
-  if (filtered_supported_formats_.empty()) {
-    // The device only captures at resolutions higher than |max_format_| this
-    // indicates that |max_format_| should be ignored as it is better to capture
-    // at too high a resolution than to not capture at all.
-    filtered_supported_formats_ = supported_formats_;
-  }
-}
-
-bool VideoCapturer::ShouldFilterFormat(const VideoFormat& format) const {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  if (!enable_camera_list_) {
-    return false;
-  }
-  return format.width > max_format_->width ||
-         format.height > max_format_->height;
-}
-
-void VideoCapturer::UpdateInputSize(int width, int height) {
-  // Update stats protected from fetches from different thread.
-  rtc::CritScope cs(&frame_stats_crit_);
-
-  input_size_valid_ = true;
-  input_width_ = width;
-  input_height_ = height;
-}
-
-}  // namespace cricket
diff --git a/media/base/videocapturer.h b/media/base/videocapturer.h
deleted file mode 100644
index 10c5df9..0000000
--- a/media/base/videocapturer.h
+++ /dev/null
@@ -1,289 +0,0 @@
-/*
- *  Copyright (c) 2010 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.
- */
-
-// Declaration of abstract class VideoCapturer
-
-#ifndef WEBRTC_MEDIA_BASE_VIDEOCAPTURER_H_
-#define WEBRTC_MEDIA_BASE_VIDEOCAPTURER_H_
-
-#include <stdint.h>
-
-#include <algorithm>
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "webrtc/media/base/videoadapter.h"
-#include "webrtc/media/base/videobroadcaster.h"
-#include "webrtc/media/base/videocommon.h"
-#include "webrtc/media/base/videosourceinterface.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/sigslot.h"
-#include "webrtc/rtc_base/thread_checker.h"
-#include "webrtc/rtc_base/timestampaligner.h"
-
-namespace webrtc {
-class VideoFrame;
-}
-
-namespace cricket {
-
-// Current state of the capturer.
-enum CaptureState {
-  CS_STOPPED,    // The capturer has been stopped or hasn't started yet.
-  CS_STARTING,   // The capturer is in the process of starting. Note, it may
-                 // still fail to start.
-  CS_RUNNING,    // The capturer has been started successfully and is now
-                 // capturing.
-  CS_FAILED,     // The capturer failed to start.
-};
-
-// VideoCapturer is an abstract class that defines the interfaces for video
-// capturing. The subclasses implement the video capturer for various types of
-// capturers and various platforms.
-//
-// The captured frames may need to be adapted (for example, cropping).
-// Video adaptation is built into and enabled by default. After a frame has
-// been captured from the device, it is sent to the video adapter, then out to
-// the sinks.
-//
-// Programming model:
-//   Create an object of a subclass of VideoCapturer
-//   Initialize
-//   SignalStateChange.connect()
-//   AddOrUpdateSink()
-//   Find the capture format for Start() by either calling GetSupportedFormats()
-//   and selecting one of the supported or calling GetBestCaptureFormat().
-//   video_adapter()->OnOutputFormatRequest(desired_encoding_format)
-//   Start()
-//   GetCaptureFormat() optionally
-//   Stop()
-//
-// Assumption:
-//   The Start() and Stop() methods are called by a single thread (E.g., the
-//   media engine thread). Hence, the VideoCapture subclasses dont need to be
-//   thread safe.
-//
-class VideoCapturer : public sigslot::has_slots<>,
-                      public rtc::VideoSourceInterface<webrtc::VideoFrame> {
- public:
-  VideoCapturer();
-
-  virtual ~VideoCapturer() {}
-
-  // Gets the id of the underlying device, which is available after the capturer
-  // is initialized. Can be used to determine if two capturers reference the
-  // same device.
-  const std::string& GetId() const { return id_; }
-
-  // Get the capture formats supported by the video capturer. The supported
-  // formats are non empty after the device has been opened successfully.
-  const std::vector<VideoFormat>* GetSupportedFormats() const;
-
-  // Get the best capture format for the desired format. The best format is the
-  // same as one of the supported formats except that the frame interval may be
-  // different. If the application asks for 16x9 and the camera does not support
-  // 16x9 HD or the application asks for 16x10, we find the closest 4x3 and then
-  // crop; Otherwise, we find what the application asks for. Note that we assume
-  // that for HD, the desired format is always 16x9. The subclasses can override
-  // the default implementation.
-  // Parameters
-  //   desired: the input desired format. If desired.fourcc is not kAnyFourcc,
-  //            the best capture format has the exactly same fourcc. Otherwise,
-  //            the best capture format uses a fourcc in GetPreferredFourccs().
-  //   best_format: the output of the best capture format.
-  // Return false if there is no such a best format, that is, the desired format
-  // is not supported.
-  virtual bool GetBestCaptureFormat(const VideoFormat& desired,
-                                    VideoFormat* best_format);
-
-  // TODO(hellner): deprecate (make private) the Start API in favor of this one.
-  //                Also remove CS_STARTING as it is implied by the return
-  //                value of StartCapturing().
-  bool StartCapturing(const VideoFormat& capture_format);
-  // Start the video capturer with the specified capture format.
-  // Parameter
-  //   capture_format: The caller got this parameter by either calling
-  //                   GetSupportedFormats() and selecting one of the supported
-  //                   or calling GetBestCaptureFormat().
-  // Return
-  //   CS_STARTING:  The capturer is trying to start. Success or failure will
-  //                 be notified via the |SignalStateChange| callback.
-  //   CS_RUNNING:   if the capturer is started and capturing.
-  //   CS_FAILED:    if the capturer failes to start..
-  //   CS_NO_DEVICE: if the capturer has no device and fails to start.
-  virtual CaptureState Start(const VideoFormat& capture_format) = 0;
-
-  // Get the current capture format, which is set by the Start() call.
-  // Note that the width and height of the captured frames may differ from the
-  // capture format. For example, the capture format is HD but the captured
-  // frames may be smaller than HD.
-  const VideoFormat* GetCaptureFormat() const {
-    return capture_format_.get();
-  }
-
-  // Stop the video capturer.
-  virtual void Stop() = 0;
-  // Check if the video capturer is running.
-  virtual bool IsRunning() = 0;
-  CaptureState capture_state() const {
-    return capture_state_;
-  }
-
-  virtual bool apply_rotation() { return apply_rotation_; }
-
-  // Returns true if the capturer is screencasting. This can be used to
-  // implement screencast specific behavior.
-  virtual bool IsScreencast() const = 0;
-
-  // Caps the VideoCapturer's format according to max_format. It can e.g. be
-  // used to prevent cameras from capturing at a resolution or framerate that
-  // the capturer is capable of but not performing satisfactorily at.
-  // The capping is an upper bound for each component of the capturing format.
-  // The fourcc component is ignored.
-  void ConstrainSupportedFormats(const VideoFormat& max_format);
-
-  void set_enable_camera_list(bool enable_camera_list) {
-    enable_camera_list_ = enable_camera_list;
-  }
-  bool enable_camera_list() {
-    return enable_camera_list_;
-  }
-
-  // Signal all capture state changes that are not a direct result of calling
-  // Start().
-  sigslot::signal2<VideoCapturer*, CaptureState> SignalStateChange;
-
-  // If true, run video adaptation. By default, video adaptation is enabled
-  // and users must call video_adapter()->OnOutputFormatRequest()
-  // to receive frames.
-  bool enable_video_adapter() const { return enable_video_adapter_; }
-  void set_enable_video_adapter(bool enable_video_adapter) {
-    enable_video_adapter_ = enable_video_adapter;
-  }
-
-  bool GetInputSize(int* width, int* height);
-
-  // Implements VideoSourceInterface
-  void AddOrUpdateSink(rtc::VideoSinkInterface<webrtc::VideoFrame>* sink,
-                       const rtc::VideoSinkWants& wants) override;
-  void RemoveSink(rtc::VideoSinkInterface<webrtc::VideoFrame>* sink) override;
-
- protected:
-  // OnSinkWantsChanged can be overridden to change the default behavior
-  // when a sink changes its VideoSinkWants by calling AddOrUpdateSink.
-  virtual void OnSinkWantsChanged(const rtc::VideoSinkWants& wants);
-
-  // Reports the appropriate frame size after adaptation. Returns true
-  // if a frame is wanted. Returns false if there are no interested
-  // sinks, or if the VideoAdapter decides to drop the frame.
-
-  // This function also implements timestamp translation/filtering.
-  // |camera_time_ns| is the camera's timestamp for the captured
-  // frame; it is expected to have good accuracy, but it may use an
-  // arbitrary epoch and a small possibly free-running with a frequency
-  // slightly different from the system clock. |system_time_us| is the
-  // monotonic system time (in the same scale as rtc::TimeMicros) when
-  // the frame was captured; the application is expected to read the
-  // system time as soon as possible after frame capture, but it may
-  // suffer scheduling jitter or poor system clock resolution. The
-  // output |translated_camera_time_us| is a combined timestamp,
-  // taking advantage of the supposedly higher accuracy in the camera
-  // timestamp, but using the same epoch and frequency as system time.
-  bool AdaptFrame(int width,
-                  int height,
-                  int64_t camera_time_us,
-                  int64_t system_time_us,
-                  int* out_width,
-                  int* out_height,
-                  int* crop_width,
-                  int* crop_height,
-                  int* crop_x,
-                  int* crop_y,
-                  int64_t* translated_camera_time_us);
-
-  // Called when a frame has been captured and converted to a
-  // VideoFrame. OnFrame can be called directly by an implementation
-  // that does not use SignalFrameCaptured or OnFrameCaptured. The
-  // orig_width and orig_height are used only to produce stats.
-  void OnFrame(const webrtc::VideoFrame& frame,
-               int orig_width,
-               int orig_height);
-
-  VideoAdapter* video_adapter() { return &video_adapter_; }
-
-  void SetCaptureState(CaptureState state);
-
-  // subclasses override this virtual method to provide a vector of fourccs, in
-  // order of preference, that are expected by the media engine.
-  virtual bool GetPreferredFourccs(std::vector<uint32_t>* fourccs) = 0;
-
-  // mutators to set private attributes
-  void SetId(const std::string& id) {
-    id_ = id;
-  }
-
-  void SetCaptureFormat(const VideoFormat* format) {
-    capture_format_.reset(format ? new VideoFormat(*format) : NULL);
-  }
-
-  void SetSupportedFormats(const std::vector<VideoFormat>& formats);
-
- private:
-  void Construct();
-  // Get the distance between the desired format and the supported format.
-  // Return the max distance if they mismatch. See the implementation for
-  // details.
-  int64_t GetFormatDistance(const VideoFormat& desired,
-                            const VideoFormat& supported);
-
-  // Updates filtered_supported_formats_ so that it contains the formats in
-  // supported_formats_ that fulfill all applied restrictions.
-  void UpdateFilteredSupportedFormats();
-  // Returns true if format doesn't fulfill all applied restrictions.
-  bool ShouldFilterFormat(const VideoFormat& format) const;
-
-  void UpdateInputSize(int width, int height);
-
-  rtc::ThreadChecker thread_checker_;
-  std::string id_;
-  CaptureState capture_state_;
-  std::unique_ptr<VideoFormat> capture_format_;
-  std::vector<VideoFormat> supported_formats_;
-  std::unique_ptr<VideoFormat> max_format_;
-  std::vector<VideoFormat> filtered_supported_formats_;
-
-  bool enable_camera_list_;
-  int scaled_width_;  // Current output size from ComputeScale.
-  int scaled_height_;
-
-  rtc::VideoBroadcaster broadcaster_;
-  bool enable_video_adapter_;
-  VideoAdapter video_adapter_;
-
-  rtc::CriticalSection frame_stats_crit_;
-  // The captured frame size before potential adapation.
-  bool input_size_valid_ RTC_GUARDED_BY(frame_stats_crit_) = false;
-  int input_width_ RTC_GUARDED_BY(frame_stats_crit_);
-  int input_height_ RTC_GUARDED_BY(frame_stats_crit_);
-
-  // Whether capturer should apply rotation to the frame before
-  // passing it on to the registered sinks.
-  bool apply_rotation_;
-
-  // State for the timestamp translation.
-  rtc::TimestampAligner timestamp_aligner_;
-  RTC_DISALLOW_COPY_AND_ASSIGN(VideoCapturer);
-};
-
-}  // namespace cricket
-
-#endif  // WEBRTC_MEDIA_BASE_VIDEOCAPTURER_H_
diff --git a/media/base/videocapturer_unittest.cc b/media/base/videocapturer_unittest.cc
deleted file mode 100644
index 402682e..0000000
--- a/media/base/videocapturer_unittest.cc
+++ /dev/null
@@ -1,786 +0,0 @@
-/*
- *  Copyright (c) 2008 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 <stdio.h>
-
-#include <memory>
-#include <vector>
-
-#include "webrtc/media/base/fakevideocapturer.h"
-#include "webrtc/media/base/fakevideorenderer.h"
-#include "webrtc/media/base/testutils.h"
-#include "webrtc/media/base/videocapturer.h"
-#include "webrtc/rtc_base/gunit.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/thread.h"
-
-using cricket::FakeVideoCapturer;
-
-namespace {
-
-const int kMsCallbackWait = 500;
-// For HD only the height matters.
-const int kMinHdHeight = 720;
-
-}  // namespace
-
-class VideoCapturerTest
-    : public sigslot::has_slots<>,
-      public testing::Test {
- public:
-  VideoCapturerTest()
-      : capture_state_(cricket::CS_STOPPED), num_state_changes_(0) {
-    InitCapturer(false);
-  }
-
- protected:
-  void InitCapturer(bool is_screencast) {
-    capturer_ = std::unique_ptr<FakeVideoCapturer>(
-        new FakeVideoCapturer(is_screencast));
-    capturer_->SignalStateChange.connect(this,
-                                         &VideoCapturerTest::OnStateChange);
-    capturer_->AddOrUpdateSink(&renderer_, rtc::VideoSinkWants());
-  }
-  void InitScreencast() { InitCapturer(true); }
-
-  void OnStateChange(cricket::VideoCapturer*,
-                     cricket::CaptureState capture_state) {
-    capture_state_ = capture_state;
-    ++num_state_changes_;
-  }
-  cricket::CaptureState capture_state() { return capture_state_; }
-  int num_state_changes() { return num_state_changes_; }
-
-  std::unique_ptr<cricket::FakeVideoCapturer> capturer_;
-  cricket::CaptureState capture_state_;
-  int num_state_changes_;
-  cricket::FakeVideoRenderer renderer_;
-  bool expects_rotation_applied_;
-};
-
-TEST_F(VideoCapturerTest, CaptureState) {
-  EXPECT_TRUE(capturer_->enable_video_adapter());
-  EXPECT_EQ(cricket::CS_RUNNING, capturer_->Start(cricket::VideoFormat(
-      640,
-      480,
-      cricket::VideoFormat::FpsToInterval(30),
-      cricket::FOURCC_I420)));
-  EXPECT_TRUE(capturer_->IsRunning());
-  EXPECT_EQ_WAIT(cricket::CS_RUNNING, capture_state(), kMsCallbackWait);
-  EXPECT_EQ(1, num_state_changes());
-  capturer_->Stop();
-  EXPECT_EQ_WAIT(cricket::CS_STOPPED, capture_state(), kMsCallbackWait);
-  EXPECT_EQ(2, num_state_changes());
-  capturer_->Stop();
-  rtc::Thread::Current()->ProcessMessages(100);
-  EXPECT_EQ(2, num_state_changes());
-}
-
-TEST_F(VideoCapturerTest, ScreencastScaledOddWidth) {
-  InitScreencast();
-
-  int kWidth = 1281;
-  int kHeight = 720;
-
-  std::vector<cricket::VideoFormat> formats;
-  formats.push_back(cricket::VideoFormat(kWidth, kHeight,
-                                         cricket::VideoFormat::FpsToInterval(5),
-                                         cricket::FOURCC_I420));
-  capturer_->ResetSupportedFormats(formats);
-
-  EXPECT_EQ(cricket::CS_RUNNING,
-            capturer_->Start(cricket::VideoFormat(
-                kWidth, kHeight, cricket::VideoFormat::FpsToInterval(30),
-                cricket::FOURCC_I420)));
-  EXPECT_TRUE(capturer_->IsRunning());
-  EXPECT_EQ(0, renderer_.num_rendered_frames());
-  EXPECT_TRUE(capturer_->CaptureFrame());
-  EXPECT_EQ(1, renderer_.num_rendered_frames());
-  EXPECT_EQ(kWidth, renderer_.width());
-  EXPECT_EQ(kHeight, renderer_.height());
-}
-
-TEST_F(VideoCapturerTest, TestRotationAppliedBySource) {
-  int kWidth = 800;
-  int kHeight = 400;
-  int frame_count = 0;
-
-  std::vector<cricket::VideoFormat> formats;
-  formats.push_back(cricket::VideoFormat(kWidth, kHeight,
-                                         cricket::VideoFormat::FpsToInterval(5),
-                                         cricket::FOURCC_I420));
-
-  capturer_->ResetSupportedFormats(formats);
-  rtc::VideoSinkWants wants;
-  // |capturer_| should compensate rotation.
-  wants.rotation_applied = true;
-  capturer_->AddOrUpdateSink(&renderer_, wants);
-
-  // capturer_ should compensate rotation as default.
-  EXPECT_EQ(cricket::CS_RUNNING,
-            capturer_->Start(cricket::VideoFormat(
-                kWidth, kHeight, cricket::VideoFormat::FpsToInterval(30),
-                cricket::FOURCC_I420)));
-  EXPECT_TRUE(capturer_->IsRunning());
-  EXPECT_EQ(0, renderer_.num_rendered_frames());
-
-  // If the frame's rotation is compensated anywhere in the pipeline based on
-  // the rotation information, the renderer should be given the right dimension
-  // such that the frame could be rendered.
-
-  capturer_->SetRotation(webrtc::kVideoRotation_90);
-  EXPECT_TRUE(capturer_->CaptureFrame());
-  EXPECT_EQ(++frame_count, renderer_.num_rendered_frames());
-  // Swapped width and height
-  EXPECT_EQ(kWidth, renderer_.height());
-  EXPECT_EQ(kHeight, renderer_.width());
-  EXPECT_EQ(webrtc::kVideoRotation_0, renderer_.rotation());
-
-  capturer_->SetRotation(webrtc::kVideoRotation_270);
-  EXPECT_TRUE(capturer_->CaptureFrame());
-  EXPECT_EQ(++frame_count, renderer_.num_rendered_frames());
-  // Swapped width and height
-  EXPECT_EQ(kWidth, renderer_.height());
-  EXPECT_EQ(kHeight, renderer_.width());
-  EXPECT_EQ(webrtc::kVideoRotation_0, renderer_.rotation());
-
-  capturer_->SetRotation(webrtc::kVideoRotation_180);
-  EXPECT_TRUE(capturer_->CaptureFrame());
-  EXPECT_EQ(++frame_count, renderer_.num_rendered_frames());
-  // Back to normal width and height
-  EXPECT_EQ(kWidth, renderer_.width());
-  EXPECT_EQ(kHeight, renderer_.height());
-  EXPECT_EQ(webrtc::kVideoRotation_0, renderer_.rotation());
-}
-
-TEST_F(VideoCapturerTest, TestRotationAppliedBySinkByDefault) {
-  int kWidth = 800;
-  int kHeight = 400;
-
-  std::vector<cricket::VideoFormat> formats;
-  formats.push_back(cricket::VideoFormat(kWidth, kHeight,
-                                         cricket::VideoFormat::FpsToInterval(5),
-                                         cricket::FOURCC_I420));
-
-  capturer_->ResetSupportedFormats(formats);
-
-  EXPECT_EQ(cricket::CS_RUNNING,
-            capturer_->Start(cricket::VideoFormat(
-                kWidth, kHeight, cricket::VideoFormat::FpsToInterval(30),
-                cricket::FOURCC_I420)));
-  EXPECT_TRUE(capturer_->IsRunning());
-  EXPECT_EQ(0, renderer_.num_rendered_frames());
-
-  // If the frame's rotation is compensated anywhere in the pipeline, the frame
-  // won't have its original dimension out from capturer. Since the renderer
-  // here has the same dimension as the capturer, it will skip that frame as the
-  // resolution won't match anymore.
-
-  int frame_count = 0;
-  capturer_->SetRotation(webrtc::kVideoRotation_0);
-  EXPECT_TRUE(capturer_->CaptureFrame());
-  EXPECT_EQ(++frame_count, renderer_.num_rendered_frames());
-  EXPECT_EQ(capturer_->GetRotation(), renderer_.rotation());
-
-  capturer_->SetRotation(webrtc::kVideoRotation_90);
-  EXPECT_TRUE(capturer_->CaptureFrame());
-  EXPECT_EQ(++frame_count, renderer_.num_rendered_frames());
-  EXPECT_EQ(capturer_->GetRotation(), renderer_.rotation());
-
-  capturer_->SetRotation(webrtc::kVideoRotation_180);
-  EXPECT_TRUE(capturer_->CaptureFrame());
-  EXPECT_EQ(++frame_count, renderer_.num_rendered_frames());
-  EXPECT_EQ(capturer_->GetRotation(), renderer_.rotation());
-
-  capturer_->SetRotation(webrtc::kVideoRotation_270);
-  EXPECT_TRUE(capturer_->CaptureFrame());
-  EXPECT_EQ(++frame_count, renderer_.num_rendered_frames());
-  EXPECT_EQ(capturer_->GetRotation(), renderer_.rotation());
-}
-
-TEST_F(VideoCapturerTest, TestRotationAppliedBySourceWhenDifferentWants) {
-  int kWidth = 800;
-  int kHeight = 400;
-
-  std::vector<cricket::VideoFormat> formats;
-  formats.push_back(cricket::VideoFormat(kWidth, kHeight,
-                                         cricket::VideoFormat::FpsToInterval(5),
-                                         cricket::FOURCC_I420));
-
-  capturer_->ResetSupportedFormats(formats);
-  rtc::VideoSinkWants wants;
-  // capturer_ should not compensate rotation.
-  wants.rotation_applied = false;
-  capturer_->AddOrUpdateSink(&renderer_, wants);
-
-  EXPECT_EQ(cricket::CS_RUNNING,
-            capturer_->Start(cricket::VideoFormat(
-                kWidth, kHeight, cricket::VideoFormat::FpsToInterval(30),
-                cricket::FOURCC_I420)));
-  EXPECT_TRUE(capturer_->IsRunning());
-  EXPECT_EQ(0, renderer_.num_rendered_frames());
-
-  int frame_count = 0;
-  capturer_->SetRotation(webrtc::kVideoRotation_90);
-  EXPECT_TRUE(capturer_->CaptureFrame());
-  EXPECT_EQ(++frame_count, renderer_.num_rendered_frames());
-  EXPECT_EQ(capturer_->GetRotation(), renderer_.rotation());
-
-  // Add another sink that wants frames to be rotated.
-  cricket::FakeVideoRenderer renderer2;
-  wants.rotation_applied = true;
-  capturer_->AddOrUpdateSink(&renderer2, wants);
-
-  EXPECT_TRUE(capturer_->CaptureFrame());
-  EXPECT_EQ(++frame_count, renderer_.num_rendered_frames());
-  EXPECT_EQ(1, renderer2.num_rendered_frames());
-  EXPECT_EQ(webrtc::kVideoRotation_0, renderer_.rotation());
-  EXPECT_EQ(webrtc::kVideoRotation_0, renderer2.rotation());
-}
-
-// TODO(nisse): This test doesn't quite fit here. It tests two things:
-// Aggregation of VideoSinkWants, which is the responsibility of
-// VideoBroadcaster, and translation of VideoSinkWants to actual
-// resolution, which is the responsibility of the VideoAdapter.
-TEST_F(VideoCapturerTest, SinkWantsMaxPixelAndMaxPixelCountStepUp) {
-  EXPECT_EQ(cricket::CS_RUNNING,
-            capturer_->Start(cricket::VideoFormat(
-                1280, 720, cricket::VideoFormat::FpsToInterval(30),
-                cricket::FOURCC_I420)));
-  EXPECT_TRUE(capturer_->IsRunning());
-
-  EXPECT_EQ(0, renderer_.num_rendered_frames());
-  EXPECT_TRUE(capturer_->CaptureFrame());
-  EXPECT_EQ(1, renderer_.num_rendered_frames());
-  EXPECT_EQ(1280, renderer_.width());
-  EXPECT_EQ(720, renderer_.height());
-
-  // Request a lower resolution. The output resolution will have a resolution
-  // with less than or equal to |wants.max_pixel_count| depending on how the
-  // capturer can scale the input frame size.
-  rtc::VideoSinkWants wants;
-  wants.max_pixel_count = 1280 * 720 * 3 / 5;
-  capturer_->AddOrUpdateSink(&renderer_, wants);
-  EXPECT_TRUE(capturer_->CaptureFrame());
-  EXPECT_EQ(2, renderer_.num_rendered_frames());
-  EXPECT_EQ(960, renderer_.width());
-  EXPECT_EQ(540, renderer_.height());
-
-  // Request a lower resolution.
-  wants.max_pixel_count = (renderer_.width() * renderer_.height() * 3) / 5;
-  capturer_->AddOrUpdateSink(&renderer_, wants);
-  EXPECT_TRUE(capturer_->CaptureFrame());
-  EXPECT_EQ(3, renderer_.num_rendered_frames());
-  EXPECT_EQ(640, renderer_.width());
-  EXPECT_EQ(360, renderer_.height());
-
-  // Adding a new renderer should not affect resolution.
-  cricket::FakeVideoRenderer renderer2;
-  capturer_->AddOrUpdateSink(&renderer2, rtc::VideoSinkWants());
-  EXPECT_TRUE(capturer_->CaptureFrame());
-  EXPECT_EQ(4, renderer_.num_rendered_frames());
-  EXPECT_EQ(640, renderer_.width());
-  EXPECT_EQ(360, renderer_.height());
-  EXPECT_EQ(1, renderer2.num_rendered_frames());
-  EXPECT_EQ(640, renderer2.width());
-  EXPECT_EQ(360, renderer2.height());
-
-  // Request higher resolution.
-  wants.target_pixel_count.emplace((wants.max_pixel_count * 5) / 3);
-  wants.max_pixel_count = wants.max_pixel_count * 4;
-  capturer_->AddOrUpdateSink(&renderer_, wants);
-  EXPECT_TRUE(capturer_->CaptureFrame());
-  EXPECT_EQ(5, renderer_.num_rendered_frames());
-  EXPECT_EQ(960, renderer_.width());
-  EXPECT_EQ(540, renderer_.height());
-  EXPECT_EQ(2, renderer2.num_rendered_frames());
-  EXPECT_EQ(960, renderer2.width());
-  EXPECT_EQ(540, renderer2.height());
-
-  // Updating with no wants should not affect resolution.
-  capturer_->AddOrUpdateSink(&renderer2, rtc::VideoSinkWants());
-  EXPECT_TRUE(capturer_->CaptureFrame());
-  EXPECT_EQ(6, renderer_.num_rendered_frames());
-  EXPECT_EQ(960, renderer_.width());
-  EXPECT_EQ(540, renderer_.height());
-  EXPECT_EQ(3, renderer2.num_rendered_frames());
-  EXPECT_EQ(960, renderer2.width());
-  EXPECT_EQ(540, renderer2.height());
-
-  // But resetting the wants should reset the resolution to what the camera is
-  // opened with.
-  capturer_->AddOrUpdateSink(&renderer_, rtc::VideoSinkWants());
-  EXPECT_TRUE(capturer_->CaptureFrame());
-  EXPECT_EQ(7, renderer_.num_rendered_frames());
-  EXPECT_EQ(1280, renderer_.width());
-  EXPECT_EQ(720, renderer_.height());
-  EXPECT_EQ(4, renderer2.num_rendered_frames());
-  EXPECT_EQ(1280, renderer2.width());
-  EXPECT_EQ(720, renderer2.height());
-}
-
-TEST_F(VideoCapturerTest, TestFourccMatch) {
-  cricket::VideoFormat desired(640, 480,
-                               cricket::VideoFormat::FpsToInterval(30),
-                               cricket::FOURCC_ANY);
-  cricket::VideoFormat best;
-  EXPECT_TRUE(capturer_->GetBestCaptureFormat(desired, &best));
-  EXPECT_EQ(640, best.width);
-  EXPECT_EQ(480, best.height);
-  EXPECT_EQ(cricket::VideoFormat::FpsToInterval(30), best.interval);
-
-  desired.fourcc = cricket::FOURCC_MJPG;
-  EXPECT_FALSE(capturer_->GetBestCaptureFormat(desired, &best));
-
-  desired.fourcc = cricket::FOURCC_I420;
-  EXPECT_TRUE(capturer_->GetBestCaptureFormat(desired, &best));
-}
-
-TEST_F(VideoCapturerTest, TestResolutionMatch) {
-  cricket::VideoFormat desired(1920, 1080,
-                               cricket::VideoFormat::FpsToInterval(30),
-                               cricket::FOURCC_ANY);
-  cricket::VideoFormat best;
-  // Ask for 1920x1080. Get HD 1280x720 which is the highest.
-  EXPECT_TRUE(capturer_->GetBestCaptureFormat(desired, &best));
-  EXPECT_EQ(1280, best.width);
-  EXPECT_EQ(720, best.height);
-  EXPECT_EQ(cricket::VideoFormat::FpsToInterval(30), best.interval);
-
-  desired.width = 360;
-  desired.height = 250;
-  // Ask for a little higher than QVGA. Get QVGA.
-  EXPECT_TRUE(capturer_->GetBestCaptureFormat(desired, &best));
-  EXPECT_EQ(320, best.width);
-  EXPECT_EQ(240, best.height);
-  EXPECT_EQ(cricket::VideoFormat::FpsToInterval(30), best.interval);
-
-  desired.width = 480;
-  desired.height = 270;
-  // Ask for HVGA. Get VGA.
-  EXPECT_TRUE(capturer_->GetBestCaptureFormat(desired, &best));
-  EXPECT_EQ(640, best.width);
-  EXPECT_EQ(480, best.height);
-  EXPECT_EQ(cricket::VideoFormat::FpsToInterval(30), best.interval);
-
-  desired.width = 320;
-  desired.height = 240;
-  // Ask for QVGA. Get QVGA.
-  EXPECT_TRUE(capturer_->GetBestCaptureFormat(desired, &best));
-  EXPECT_EQ(320, best.width);
-  EXPECT_EQ(240, best.height);
-  EXPECT_EQ(cricket::VideoFormat::FpsToInterval(30), best.interval);
-
-  desired.width = 80;
-  desired.height = 60;
-  // Ask for lower than QQVGA. Get QQVGA, which is the lowest.
-  EXPECT_TRUE(capturer_->GetBestCaptureFormat(desired, &best));
-  EXPECT_EQ(160, best.width);
-  EXPECT_EQ(120, best.height);
-  EXPECT_EQ(cricket::VideoFormat::FpsToInterval(30), best.interval);
-}
-
-TEST_F(VideoCapturerTest, TestHDResolutionMatch) {
-  // Add some HD formats typical of a mediocre HD webcam.
-  std::vector<cricket::VideoFormat> formats;
-  formats.push_back(cricket::VideoFormat(320, 240,
-      cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420));
-  formats.push_back(cricket::VideoFormat(640, 480,
-      cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420));
-  formats.push_back(cricket::VideoFormat(960, 544,
-      cricket::VideoFormat::FpsToInterval(24), cricket::FOURCC_I420));
-  formats.push_back(cricket::VideoFormat(1280, 720,
-      cricket::VideoFormat::FpsToInterval(15), cricket::FOURCC_I420));
-  formats.push_back(cricket::VideoFormat(2592, 1944,
-      cricket::VideoFormat::FpsToInterval(7), cricket::FOURCC_I420));
-  capturer_->ResetSupportedFormats(formats);
-
-  cricket::VideoFormat desired(960, 720,
-                               cricket::VideoFormat::FpsToInterval(30),
-                               cricket::FOURCC_ANY);
-  cricket::VideoFormat best;
-  // Ask for 960x720 30 fps. Get qHD 24 fps
-  EXPECT_TRUE(capturer_->GetBestCaptureFormat(desired, &best));
-  EXPECT_EQ(960, best.width);
-  EXPECT_EQ(544, best.height);
-  EXPECT_EQ(cricket::VideoFormat::FpsToInterval(24), best.interval);
-
-  desired.width = 960;
-  desired.height = 544;
-  desired.interval = cricket::VideoFormat::FpsToInterval(30);
-  // Ask for qHD 30 fps. Get qHD 24 fps
-  EXPECT_TRUE(capturer_->GetBestCaptureFormat(desired, &best));
-  EXPECT_EQ(960, best.width);
-  EXPECT_EQ(544, best.height);
-  EXPECT_EQ(cricket::VideoFormat::FpsToInterval(24), best.interval);
-
-  desired.width = 360;
-  desired.height = 250;
-  desired.interval = cricket::VideoFormat::FpsToInterval(30);
-  // Ask for a little higher than QVGA. Get QVGA.
-  EXPECT_TRUE(capturer_->GetBestCaptureFormat(desired, &best));
-  EXPECT_EQ(320, best.width);
-  EXPECT_EQ(240, best.height);
-  EXPECT_EQ(cricket::VideoFormat::FpsToInterval(30), best.interval);
-
-  desired.width = 480;
-  desired.height = 270;
-  // Ask for HVGA. Get VGA.
-  EXPECT_TRUE(capturer_->GetBestCaptureFormat(desired, &best));
-  EXPECT_EQ(640, best.width);
-  EXPECT_EQ(480, best.height);
-  EXPECT_EQ(cricket::VideoFormat::FpsToInterval(30), best.interval);
-
-  desired.width = 320;
-  desired.height = 240;
-  // Ask for QVGA. Get QVGA.
-  EXPECT_TRUE(capturer_->GetBestCaptureFormat(desired, &best));
-  EXPECT_EQ(320, best.width);
-  EXPECT_EQ(240, best.height);
-  EXPECT_EQ(cricket::VideoFormat::FpsToInterval(30), best.interval);
-
-  desired.width = 160;
-  desired.height = 120;
-  // Ask for lower than QVGA. Get QVGA, which is the lowest.
-  EXPECT_TRUE(capturer_->GetBestCaptureFormat(desired, &best));
-  EXPECT_EQ(320, best.width);
-  EXPECT_EQ(240, best.height);
-  EXPECT_EQ(cricket::VideoFormat::FpsToInterval(30), best.interval);
-
-  desired.width = 1280;
-  desired.height = 720;
-  // Ask for HD. 720p fps is too low. Get VGA which has 30 fps.
-  EXPECT_TRUE(capturer_->GetBestCaptureFormat(desired, &best));
-  EXPECT_EQ(640, best.width);
-  EXPECT_EQ(480, best.height);
-  EXPECT_EQ(cricket::VideoFormat::FpsToInterval(30), best.interval);
-
-  desired.width = 1280;
-  desired.height = 720;
-  desired.interval = cricket::VideoFormat::FpsToInterval(15);
-  // Ask for HD 15 fps. Fps matches. Get HD
-  EXPECT_TRUE(capturer_->GetBestCaptureFormat(desired, &best));
-  EXPECT_EQ(1280, best.width);
-  EXPECT_EQ(720, best.height);
-  EXPECT_EQ(cricket::VideoFormat::FpsToInterval(15), best.interval);
-
-  desired.width = 1920;
-  desired.height = 1080;
-  desired.interval = cricket::VideoFormat::FpsToInterval(30);
-  // Ask for 1080p. Fps of HD formats is too low. Get VGA which can do 30 fps.
-  EXPECT_TRUE(capturer_->GetBestCaptureFormat(desired, &best));
-  EXPECT_EQ(640, best.width);
-  EXPECT_EQ(480, best.height);
-  EXPECT_EQ(cricket::VideoFormat::FpsToInterval(30), best.interval);
-}
-
-// Some cameras support 320x240 and 320x640. Verify we choose 320x240.
-TEST_F(VideoCapturerTest, TestStrangeFormats) {
-  std::vector<cricket::VideoFormat> supported_formats;
-  supported_formats.push_back(cricket::VideoFormat(320, 240,
-      cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420));
-  supported_formats.push_back(cricket::VideoFormat(320, 640,
-      cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420));
-  capturer_->ResetSupportedFormats(supported_formats);
-
-  std::vector<cricket::VideoFormat> required_formats;
-  required_formats.push_back(cricket::VideoFormat(320, 240,
-      cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420));
-  required_formats.push_back(cricket::VideoFormat(320, 200,
-      cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420));
-  required_formats.push_back(cricket::VideoFormat(320, 180,
-      cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420));
-  cricket::VideoFormat best;
-  for (size_t i = 0; i < required_formats.size(); ++i) {
-    EXPECT_TRUE(capturer_->GetBestCaptureFormat(required_formats[i], &best));
-    EXPECT_EQ(320, best.width);
-    EXPECT_EQ(240, best.height);
-  }
-
-  supported_formats.clear();
-  supported_formats.push_back(cricket::VideoFormat(320, 640,
-      cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420));
-  supported_formats.push_back(cricket::VideoFormat(320, 240,
-      cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420));
-  capturer_->ResetSupportedFormats(supported_formats);
-
-  for (size_t i = 0; i < required_formats.size(); ++i) {
-    EXPECT_TRUE(capturer_->GetBestCaptureFormat(required_formats[i], &best));
-    EXPECT_EQ(320, best.width);
-    EXPECT_EQ(240, best.height);
-  }
-}
-
-// Some cameras only have very low fps. Verify we choose something sensible.
-TEST_F(VideoCapturerTest, TestPoorFpsFormats) {
-  // all formats are low framerate
-  std::vector<cricket::VideoFormat> supported_formats;
-  supported_formats.push_back(cricket::VideoFormat(320, 240,
-      cricket::VideoFormat::FpsToInterval(10), cricket::FOURCC_I420));
-  supported_formats.push_back(cricket::VideoFormat(640, 480,
-      cricket::VideoFormat::FpsToInterval(7), cricket::FOURCC_I420));
-  supported_formats.push_back(cricket::VideoFormat(1280, 720,
-      cricket::VideoFormat::FpsToInterval(2), cricket::FOURCC_I420));
-  capturer_->ResetSupportedFormats(supported_formats);
-
-  std::vector<cricket::VideoFormat> required_formats;
-  required_formats.push_back(cricket::VideoFormat(320, 240,
-      cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420));
-  required_formats.push_back(cricket::VideoFormat(640, 480,
-      cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420));
-  cricket::VideoFormat best;
-  for (size_t i = 0; i < required_formats.size(); ++i) {
-    EXPECT_TRUE(capturer_->GetBestCaptureFormat(required_formats[i], &best));
-    EXPECT_EQ(required_formats[i].width, best.width);
-    EXPECT_EQ(required_formats[i].height, best.height);
-  }
-
-  // Increase framerate of 320x240. Expect low fps VGA avoided.
-  supported_formats.clear();
-  supported_formats.push_back(cricket::VideoFormat(320, 240,
-      cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420));
-  supported_formats.push_back(cricket::VideoFormat(640, 480,
-      cricket::VideoFormat::FpsToInterval(7), cricket::FOURCC_I420));
-  supported_formats.push_back(cricket::VideoFormat(1280, 720,
-      cricket::VideoFormat::FpsToInterval(2), cricket::FOURCC_I420));
-  capturer_->ResetSupportedFormats(supported_formats);
-
-  for (size_t i = 0; i < required_formats.size(); ++i) {
-    EXPECT_TRUE(capturer_->GetBestCaptureFormat(required_formats[i], &best));
-    EXPECT_EQ(320, best.width);
-    EXPECT_EQ(240, best.height);
-  }
-}
-
-// Some cameras support same size with different frame rates. Verify we choose
-// the frame rate properly.
-TEST_F(VideoCapturerTest, TestSameSizeDifferentFpsFormats) {
-  std::vector<cricket::VideoFormat> supported_formats;
-  supported_formats.push_back(cricket::VideoFormat(320, 240,
-      cricket::VideoFormat::FpsToInterval(10), cricket::FOURCC_I420));
-  supported_formats.push_back(cricket::VideoFormat(320, 240,
-      cricket::VideoFormat::FpsToInterval(20), cricket::FOURCC_I420));
-  supported_formats.push_back(cricket::VideoFormat(320, 240,
-      cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420));
-  capturer_->ResetSupportedFormats(supported_formats);
-
-  std::vector<cricket::VideoFormat> required_formats = supported_formats;
-  cricket::VideoFormat best;
-  for (size_t i = 0; i < required_formats.size(); ++i) {
-    EXPECT_TRUE(capturer_->GetBestCaptureFormat(required_formats[i], &best));
-    EXPECT_EQ(320, best.width);
-    EXPECT_EQ(240, best.height);
-    EXPECT_EQ(required_formats[i].interval, best.interval);
-  }
-}
-
-// Some cameras support the correct resolution but at a lower fps than
-// we'd like. This tests we get the expected resolution and fps.
-TEST_F(VideoCapturerTest, TestFpsFormats) {
-  // We have VGA but low fps. Choose VGA, not HD
-  std::vector<cricket::VideoFormat> supported_formats;
-  supported_formats.push_back(cricket::VideoFormat(1280, 720,
-      cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420));
-  supported_formats.push_back(cricket::VideoFormat(640, 480,
-      cricket::VideoFormat::FpsToInterval(15), cricket::FOURCC_I420));
-  supported_formats.push_back(cricket::VideoFormat(640, 400,
-      cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420));
-  supported_formats.push_back(cricket::VideoFormat(640, 360,
-      cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420));
-  capturer_->ResetSupportedFormats(supported_formats);
-
-  std::vector<cricket::VideoFormat> required_formats;
-  required_formats.push_back(cricket::VideoFormat(640, 480,
-      cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_ANY));
-  required_formats.push_back(cricket::VideoFormat(640, 480,
-      cricket::VideoFormat::FpsToInterval(20), cricket::FOURCC_ANY));
-  required_formats.push_back(cricket::VideoFormat(640, 480,
-      cricket::VideoFormat::FpsToInterval(10), cricket::FOURCC_ANY));
-  cricket::VideoFormat best;
-
-  // Expect 30 fps to choose 30 fps format.
-  EXPECT_TRUE(capturer_->GetBestCaptureFormat(required_formats[0], &best));
-  EXPECT_EQ(640, best.width);
-  EXPECT_EQ(400, best.height);
-  EXPECT_EQ(cricket::VideoFormat::FpsToInterval(30), best.interval);
-
-  // Expect 20 fps to choose 30 fps format.
-  EXPECT_TRUE(capturer_->GetBestCaptureFormat(required_formats[1], &best));
-  EXPECT_EQ(640, best.width);
-  EXPECT_EQ(400, best.height);
-  EXPECT_EQ(cricket::VideoFormat::FpsToInterval(30), best.interval);
-
-  // Expect 10 fps to choose 15 fps format and set fps to 15.
-  EXPECT_TRUE(capturer_->GetBestCaptureFormat(required_formats[2], &best));
-  EXPECT_EQ(640, best.width);
-  EXPECT_EQ(480, best.height);
-  EXPECT_EQ(cricket::VideoFormat::FpsToInterval(15), best.interval);
-
-  // We have VGA 60 fps and 15 fps. Choose best fps.
-  supported_formats.clear();
-  supported_formats.push_back(cricket::VideoFormat(1280, 720,
-      cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420));
-  supported_formats.push_back(cricket::VideoFormat(640, 480,
-      cricket::VideoFormat::FpsToInterval(60), cricket::FOURCC_MJPG));
-  supported_formats.push_back(cricket::VideoFormat(640, 480,
-      cricket::VideoFormat::FpsToInterval(15), cricket::FOURCC_I420));
-  supported_formats.push_back(cricket::VideoFormat(640, 400,
-      cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420));
-  supported_formats.push_back(cricket::VideoFormat(640, 360,
-      cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420));
-  capturer_->ResetSupportedFormats(supported_formats);
-
-  // Expect 30 fps to choose 60 fps format and will set best fps to 60.
-  EXPECT_TRUE(capturer_->GetBestCaptureFormat(required_formats[0], &best));
-  EXPECT_EQ(640, best.width);
-  EXPECT_EQ(480, best.height);
-  EXPECT_EQ(cricket::VideoFormat::FpsToInterval(60), best.interval);
-
-  // Expect 20 fps to choose 60 fps format, and will set best fps to 60.
-  EXPECT_TRUE(capturer_->GetBestCaptureFormat(required_formats[1], &best));
-  EXPECT_EQ(640, best.width);
-  EXPECT_EQ(480, best.height);
-  EXPECT_EQ(cricket::VideoFormat::FpsToInterval(60), best.interval);
-
-  // Expect 10 fps to choose 15 fps.
-  EXPECT_TRUE(capturer_->GetBestCaptureFormat(required_formats[2], &best));
-  EXPECT_EQ(640, best.width);
-  EXPECT_EQ(480, best.height);
-  EXPECT_EQ(cricket::VideoFormat::FpsToInterval(15), best.interval);
-}
-
-TEST_F(VideoCapturerTest, TestRequest16x10_9) {
-  std::vector<cricket::VideoFormat> supported_formats;
-  // We do not support HD, expect 4x3 for 4x3, 16x10, and 16x9 requests.
-  supported_formats.push_back(cricket::VideoFormat(640, 480,
-      cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420));
-  supported_formats.push_back(cricket::VideoFormat(640, 400,
-      cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420));
-  supported_formats.push_back(cricket::VideoFormat(640, 360,
-      cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420));
-  capturer_->ResetSupportedFormats(supported_formats);
-
-  std::vector<cricket::VideoFormat> required_formats = supported_formats;
-  cricket::VideoFormat best;
-  // Expect 4x3, 16x10, and 16x9 requests are respected.
-  for (size_t i = 0; i < required_formats.size(); ++i) {
-    EXPECT_TRUE(capturer_->GetBestCaptureFormat(required_formats[i], &best));
-    EXPECT_EQ(required_formats[i].width, best.width);
-    EXPECT_EQ(required_formats[i].height, best.height);
-  }
-
-  // We do not support 16x9 HD, expect 4x3 for 4x3, 16x10, and 16x9 requests.
-  supported_formats.clear();
-  supported_formats.push_back(cricket::VideoFormat(960, 720,
-      cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420));
-  supported_formats.push_back(cricket::VideoFormat(640, 480,
-      cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420));
-  supported_formats.push_back(cricket::VideoFormat(640, 400,
-      cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420));
-  supported_formats.push_back(cricket::VideoFormat(640, 360,
-      cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420));
-  capturer_->ResetSupportedFormats(supported_formats);
-
-  // Expect 4x3, 16x10, and 16x9 requests are respected.
-  for (size_t i = 0; i < required_formats.size(); ++i) {
-    EXPECT_TRUE(capturer_->GetBestCaptureFormat(required_formats[i], &best));
-    EXPECT_EQ(required_formats[i].width, best.width);
-    EXPECT_EQ(required_formats[i].height, best.height);
-  }
-
-  // We support 16x9HD, Expect 4x3, 16x10, and 16x9 requests are respected.
-  supported_formats.clear();
-  supported_formats.push_back(cricket::VideoFormat(1280, 720,
-      cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420));
-  supported_formats.push_back(cricket::VideoFormat(640, 480,
-      cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420));
-  supported_formats.push_back(cricket::VideoFormat(640, 400,
-      cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420));
-  supported_formats.push_back(cricket::VideoFormat(640, 360,
-      cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420));
-  capturer_->ResetSupportedFormats(supported_formats);
-
-  // Expect 4x3 for 4x3 and 16x10 requests.
-  for (size_t i = 0; i < required_formats.size() - 1; ++i) {
-    EXPECT_TRUE(capturer_->GetBestCaptureFormat(required_formats[i], &best));
-    EXPECT_EQ(required_formats[i].width, best.width);
-    EXPECT_EQ(required_formats[i].height, best.height);
-  }
-
-  // Expect 16x9 for 16x9 request.
-  EXPECT_TRUE(capturer_->GetBestCaptureFormat(required_formats[2], &best));
-  EXPECT_EQ(640, best.width);
-  EXPECT_EQ(360, best.height);
-}
-
-bool HdFormatInList(const std::vector<cricket::VideoFormat>& formats) {
-  for (std::vector<cricket::VideoFormat>::const_iterator found =
-           formats.begin(); found != formats.end(); ++found) {
-    if (found->height >= kMinHdHeight) {
-      return true;
-    }
-  }
-  return false;
-}
-
-TEST_F(VideoCapturerTest, Whitelist) {
-  // The definition of HD only applies to the height. Set the HD width to the
-  // smallest legal number to document this fact in this test.
-  const int kMinHdWidth = 1;
-  cricket::VideoFormat hd_format(kMinHdWidth,
-                                 kMinHdHeight,
-                                 cricket::VideoFormat::FpsToInterval(30),
-                                 cricket::FOURCC_I420);
-  cricket::VideoFormat vga_format(640, 480,
-                                  cricket::VideoFormat::FpsToInterval(30),
-                                  cricket::FOURCC_I420);
-  std::vector<cricket::VideoFormat> formats = *capturer_->GetSupportedFormats();
-  formats.push_back(hd_format);
-
-  // Enable whitelist. Expect HD not in list.
-  capturer_->set_enable_camera_list(true);
-  capturer_->ResetSupportedFormats(formats);
-  EXPECT_TRUE(HdFormatInList(*capturer_->GetSupportedFormats()));
-  capturer_->ConstrainSupportedFormats(vga_format);
-  EXPECT_FALSE(HdFormatInList(*capturer_->GetSupportedFormats()));
-
-  // Disable whitelist. Expect HD in list.
-  capturer_->set_enable_camera_list(false);
-  capturer_->ResetSupportedFormats(formats);
-  EXPECT_TRUE(HdFormatInList(*capturer_->GetSupportedFormats()));
-  capturer_->ConstrainSupportedFormats(vga_format);
-  EXPECT_TRUE(HdFormatInList(*capturer_->GetSupportedFormats()));
-}
-
-TEST_F(VideoCapturerTest, BlacklistAllFormats) {
-  cricket::VideoFormat vga_format(640, 480,
-                                  cricket::VideoFormat::FpsToInterval(30),
-                                  cricket::FOURCC_I420);
-  std::vector<cricket::VideoFormat> supported_formats;
-  // Mock a device that only supports HD formats.
-  supported_formats.push_back(cricket::VideoFormat(1280, 720,
-      cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420));
-  supported_formats.push_back(cricket::VideoFormat(1920, 1080,
-      cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420));
-  capturer_->ResetSupportedFormats(supported_formats);
-  EXPECT_EQ(2u, capturer_->GetSupportedFormats()->size());
-  // Now, enable the list, which would exclude both formats. However, since
-  // only HD formats are available, we refuse to filter at all, so we don't
-  // break this camera.
-  capturer_->set_enable_camera_list(true);
-  capturer_->ConstrainSupportedFormats(vga_format);
-  EXPECT_EQ(2u, capturer_->GetSupportedFormats()->size());
-  // To make sure it's not just the camera list being broken, add in VGA and
-  // try again. This time, only the VGA format should be there.
-  supported_formats.push_back(vga_format);
-  capturer_->ResetSupportedFormats(supported_formats);
-  ASSERT_EQ(1u, capturer_->GetSupportedFormats()->size());
-  EXPECT_EQ(vga_format.height, capturer_->GetSupportedFormats()->at(0).height);
-}
diff --git a/media/base/videocapturerfactory.h b/media/base/videocapturerfactory.h
deleted file mode 100644
index b6f886b..0000000
--- a/media/base/videocapturerfactory.h
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- *  Copyright (c) 2014 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_MEDIA_BASE_VIDEOCAPTURERFACTORY_H_
-#define WEBRTC_MEDIA_BASE_VIDEOCAPTURERFACTORY_H_
-
-#include <memory>
-
-#include "webrtc/media/base/device.h"
-
-namespace cricket {
-
-class VideoCapturer;
-
-class VideoDeviceCapturerFactory {
- public:
-  VideoDeviceCapturerFactory() {}
-  virtual ~VideoDeviceCapturerFactory() {}
-
-  virtual std::unique_ptr<VideoCapturer> Create(const Device& device) = 0;
-};
-
-}  // namespace cricket
-
-#endif  // WEBRTC_MEDIA_BASE_VIDEOCAPTURERFACTORY_H_
diff --git a/media/base/videocommon.cc b/media/base/videocommon.cc
deleted file mode 100644
index 4bc0267..0000000
--- a/media/base/videocommon.cc
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- *  Copyright (c) 2010 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/media/base/videocommon.h"
-
-#include <limits.h>  // For INT_MAX
-#include <math.h>
-#include <sstream>
-
-#include "webrtc/rtc_base/arraysize.h"
-
-namespace cricket {
-
-struct FourCCAliasEntry {
-  uint32_t alias;
-  uint32_t canonical;
-};
-
-static const FourCCAliasEntry kFourCCAliases[] = {
-  {FOURCC_IYUV, FOURCC_I420},
-  {FOURCC_YU16, FOURCC_I422},
-  {FOURCC_YU24, FOURCC_I444},
-  {FOURCC_YUYV, FOURCC_YUY2},
-  {FOURCC_YUVS, FOURCC_YUY2},
-  {FOURCC_HDYC, FOURCC_UYVY},
-  {FOURCC_2VUY, FOURCC_UYVY},
-  {FOURCC_JPEG, FOURCC_MJPG},  // Note: JPEG has DHT while MJPG does not.
-  {FOURCC_DMB1, FOURCC_MJPG},
-  {FOURCC_BA81, FOURCC_BGGR},
-  {FOURCC_RGB3, FOURCC_RAW},
-  {FOURCC_BGR3, FOURCC_24BG},
-  {FOURCC_CM32, FOURCC_BGRA},
-  {FOURCC_CM24, FOURCC_RAW},
-};
-
-uint32_t CanonicalFourCC(uint32_t fourcc) {
-  for (uint32_t i = 0; i < arraysize(kFourCCAliases); ++i) {
-    if (kFourCCAliases[i].alias == fourcc) {
-      return kFourCCAliases[i].canonical;
-    }
-  }
-  // Not an alias, so return it as-is.
-  return fourcc;
-}
-
-// The C++ standard requires a namespace-scope definition of static const
-// integral types even when they are initialized in the declaration (see
-// [class.static.data]/4), but MSVC with /Ze is non-conforming and treats that
-// as a multiply defined symbol error. See Also:
-// http://msdn.microsoft.com/en-us/library/34h23df8.aspx
-#ifndef _MSC_EXTENSIONS
-const int64_t VideoFormat::kMinimumInterval;  // Initialized in header.
-#endif
-
-std::string VideoFormat::ToString() const {
-  std::string fourcc_name = GetFourccName(fourcc) + " ";
-  for (std::string::const_iterator i = fourcc_name.begin();
-      i < fourcc_name.end(); ++i) {
-    // Test character is printable; Avoid isprint() which asserts on negatives.
-    if (*i < 32 || *i >= 127) {
-      fourcc_name = "";
-      break;
-    }
-  }
-
-  std::ostringstream ss;
-  ss << fourcc_name << width << "x" << height << "x"
-     << IntervalToFpsFloat(interval);
-  return ss.str();
-}
-
-}  // namespace cricket
diff --git a/media/base/videocommon.h b/media/base/videocommon.h
deleted file mode 100644
index 10ad383..0000000
--- a/media/base/videocommon.h
+++ /dev/null
@@ -1,229 +0,0 @@
-/*
- *  Copyright (c) 2004 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.
- */
-
-// Common definition for video, including fourcc and VideoFormat.
-
-#ifndef WEBRTC_MEDIA_BASE_VIDEOCOMMON_H_  // NOLINT
-#define WEBRTC_MEDIA_BASE_VIDEOCOMMON_H_
-
-#include <stdint.h>
-
-#include <string>
-
-#include "webrtc/rtc_base/timeutils.h"
-
-namespace cricket {
-
-// TODO(janahan): For now, a hard-coded ssrc is used as the video ssrc.
-// This is because when the video frame is passed to the mediaprocessor for
-// processing, it doesn't have the correct ssrc. Since currently only Tx
-// Video processing is supported, this is ok. When we switch over to trigger
-// from capturer, this should be fixed and this const removed.
-const uint32_t kDummyVideoSsrc = 0xFFFFFFFF;
-
-// Minimum interval is 10k fps.
-#define FPS_TO_INTERVAL(fps) \
-    (fps ? rtc::kNumNanosecsPerSec / fps : \
-    rtc::kNumNanosecsPerSec / 10000)
-
-//////////////////////////////////////////////////////////////////////////////
-// Definition of FourCC codes
-//////////////////////////////////////////////////////////////////////////////
-// Convert four characters to a FourCC code.
-// Needs to be a macro otherwise the OS X compiler complains when the kFormat*
-// constants are used in a switch.
-#define FOURCC(a, b, c, d)                                        \
-  ((static_cast<uint32_t>(a)) | (static_cast<uint32_t>(b) << 8) | \
-   (static_cast<uint32_t>(c) << 16) | (static_cast<uint32_t>(d) << 24))
-// Some pages discussing FourCC codes:
-//   http://www.fourcc.org/yuv.php
-//   http://v4l2spec.bytesex.org/spec/book1.htm
-//   http://developer.apple.com/quicktime/icefloe/dispatch020.html
-//   http://msdn.microsoft.com/library/windows/desktop/dd206750.aspx#nv12
-//   http://people.xiph.org/~xiphmont/containers/nut/nut4cc.txt
-
-// FourCC codes grouped according to implementation efficiency.
-// Primary formats should convert in 1 efficient step.
-// Secondary formats are converted in 2 steps.
-// Auxilliary formats call primary converters.
-enum FourCC {
-  // 9 Primary YUV formats: 5 planar, 2 biplanar, 2 packed.
-  FOURCC_I420 = FOURCC('I', '4', '2', '0'),
-  FOURCC_I422 = FOURCC('I', '4', '2', '2'),
-  FOURCC_I444 = FOURCC('I', '4', '4', '4'),
-  FOURCC_I411 = FOURCC('I', '4', '1', '1'),
-  FOURCC_I400 = FOURCC('I', '4', '0', '0'),
-  FOURCC_NV21 = FOURCC('N', 'V', '2', '1'),
-  FOURCC_NV12 = FOURCC('N', 'V', '1', '2'),
-  FOURCC_YUY2 = FOURCC('Y', 'U', 'Y', '2'),
-  FOURCC_UYVY = FOURCC('U', 'Y', 'V', 'Y'),
-
-  // 2 Secondary YUV formats: row biplanar.
-  FOURCC_M420 = FOURCC('M', '4', '2', '0'),
-
-  // 9 Primary RGB formats: 4 32 bpp, 2 24 bpp, 3 16 bpp.
-  FOURCC_ARGB = FOURCC('A', 'R', 'G', 'B'),
-  FOURCC_BGRA = FOURCC('B', 'G', 'R', 'A'),
-  FOURCC_ABGR = FOURCC('A', 'B', 'G', 'R'),
-  FOURCC_24BG = FOURCC('2', '4', 'B', 'G'),
-  FOURCC_RAW  = FOURCC('r', 'a', 'w', ' '),
-  FOURCC_RGBA = FOURCC('R', 'G', 'B', 'A'),
-  FOURCC_RGBP = FOURCC('R', 'G', 'B', 'P'),  // bgr565.
-  FOURCC_RGBO = FOURCC('R', 'G', 'B', 'O'),  // abgr1555.
-  FOURCC_R444 = FOURCC('R', '4', '4', '4'),  // argb4444.
-
-  // 4 Secondary RGB formats: 4 Bayer Patterns.
-  FOURCC_RGGB = FOURCC('R', 'G', 'G', 'B'),
-  FOURCC_BGGR = FOURCC('B', 'G', 'G', 'R'),
-  FOURCC_GRBG = FOURCC('G', 'R', 'B', 'G'),
-  FOURCC_GBRG = FOURCC('G', 'B', 'R', 'G'),
-
-  // 1 Primary Compressed YUV format.
-  FOURCC_MJPG = FOURCC('M', 'J', 'P', 'G'),
-
-  // 5 Auxiliary YUV variations: 3 with U and V planes are swapped, 1 Alias.
-  FOURCC_YV12 = FOURCC('Y', 'V', '1', '2'),
-  FOURCC_YV16 = FOURCC('Y', 'V', '1', '6'),
-  FOURCC_YV24 = FOURCC('Y', 'V', '2', '4'),
-  FOURCC_YU12 = FOURCC('Y', 'U', '1', '2'),  // Linux version of I420.
-  FOURCC_J420 = FOURCC('J', '4', '2', '0'),
-  FOURCC_J400 = FOURCC('J', '4', '0', '0'),
-
-  // 14 Auxiliary aliases.  CanonicalFourCC() maps these to canonical fourcc.
-  FOURCC_IYUV = FOURCC('I', 'Y', 'U', 'V'),  // Alias for I420.
-  FOURCC_YU16 = FOURCC('Y', 'U', '1', '6'),  // Alias for I422.
-  FOURCC_YU24 = FOURCC('Y', 'U', '2', '4'),  // Alias for I444.
-  FOURCC_YUYV = FOURCC('Y', 'U', 'Y', 'V'),  // Alias for YUY2.
-  FOURCC_YUVS = FOURCC('y', 'u', 'v', 's'),  // Alias for YUY2 on Mac.
-  FOURCC_HDYC = FOURCC('H', 'D', 'Y', 'C'),  // Alias for UYVY.
-  FOURCC_2VUY = FOURCC('2', 'v', 'u', 'y'),  // Alias for UYVY on Mac.
-  FOURCC_JPEG = FOURCC('J', 'P', 'E', 'G'),  // Alias for MJPG.
-  FOURCC_DMB1 = FOURCC('d', 'm', 'b', '1'),  // Alias for MJPG on Mac.
-  FOURCC_BA81 = FOURCC('B', 'A', '8', '1'),  // Alias for BGGR.
-  FOURCC_RGB3 = FOURCC('R', 'G', 'B', '3'),  // Alias for RAW.
-  FOURCC_BGR3 = FOURCC('B', 'G', 'R', '3'),  // Alias for 24BG.
-  FOURCC_CM32 = FOURCC(0, 0, 0, 32),  // Alias for BGRA kCMPixelFormat_32ARGB
-  FOURCC_CM24 = FOURCC(0, 0, 0, 24),  // Alias for RAW kCMPixelFormat_24RGB
-
-  // 1 Auxiliary compressed YUV format set aside for capturer.
-  FOURCC_H264 = FOURCC('H', '2', '6', '4'),
-};
-
-// Match any fourcc.
-
-// We move this out of the enum because using it in many places caused
-// the compiler to get grumpy, presumably since the above enum is
-// backed by an int.
-static const uint32_t FOURCC_ANY = 0xFFFFFFFF;
-
-// Converts fourcc aliases into canonical ones.
-uint32_t CanonicalFourCC(uint32_t fourcc);
-
-// Get FourCC code as a string.
-inline std::string GetFourccName(uint32_t fourcc) {
-  std::string name;
-  name.push_back(static_cast<char>(fourcc & 0xFF));
-  name.push_back(static_cast<char>((fourcc >> 8) & 0xFF));
-  name.push_back(static_cast<char>((fourcc >> 16) & 0xFF));
-  name.push_back(static_cast<char>((fourcc >> 24) & 0xFF));
-  return name;
-}
-
-//////////////////////////////////////////////////////////////////////////////
-// Definition of VideoFormat.
-//////////////////////////////////////////////////////////////////////////////
-
-// VideoFormat with Plain Old Data for global variables.
-struct VideoFormatPod {
-  int width;  // Number of pixels.
-  int height;  // Number of pixels.
-  int64_t interval;  // Nanoseconds.
-  uint32_t fourcc;  // Color space. FOURCC_ANY means that any color space is OK.
-};
-
-struct VideoFormat : VideoFormatPod {
-  static const int64_t kMinimumInterval =
-      rtc::kNumNanosecsPerSec / 10000;  // 10k fps.
-
-  VideoFormat() {
-    Construct(0, 0, 0, 0);
-  }
-
-  VideoFormat(int w, int h, int64_t interval_ns, uint32_t cc) {
-    Construct(w, h, interval_ns, cc);
-  }
-
-  explicit VideoFormat(const VideoFormatPod& format) {
-    Construct(format.width, format.height, format.interval, format.fourcc);
-  }
-
-  void Construct(int w, int h, int64_t interval_ns, uint32_t cc) {
-    width = w;
-    height = h;
-    interval = interval_ns;
-    fourcc = cc;
-  }
-
-  static int64_t FpsToInterval(int fps) {
-    return fps ? rtc::kNumNanosecsPerSec / fps : kMinimumInterval;
-  }
-
-  static int IntervalToFps(int64_t interval) {
-    if (!interval) {
-      return 0;
-    }
-    return static_cast<int>(rtc::kNumNanosecsPerSec / interval);
-  }
-
-  static float IntervalToFpsFloat(int64_t interval) {
-    if (!interval) {
-      return 0.f;
-    }
-    return static_cast<float>(rtc::kNumNanosecsPerSec) /
-        static_cast<float>(interval);
-  }
-
-  bool operator==(const VideoFormat& format) const {
-    return width == format.width && height == format.height &&
-        interval == format.interval && fourcc == format.fourcc;
-  }
-
-  bool operator!=(const VideoFormat& format) const {
-    return !(*this == format);
-  }
-
-  bool operator<(const VideoFormat& format) const {
-    return (fourcc < format.fourcc) ||
-        (fourcc == format.fourcc && width < format.width) ||
-        (fourcc == format.fourcc && width == format.width &&
-            height < format.height) ||
-        (fourcc == format.fourcc && width == format.width &&
-            height == format.height && interval > format.interval);
-  }
-
-  int framerate() const { return IntervalToFps(interval); }
-
-  // Check if both width and height are 0.
-  bool IsSize0x0() const { return 0 == width && 0 == height; }
-
-  // Check if this format is less than another one by comparing the resolution
-  // and frame rate.
-  bool IsPixelRateLess(const VideoFormat& format) const {
-    return width * height * framerate() <
-        format.width * format.height * format.framerate();
-  }
-
-  // Get a string presentation in the form of "fourcc width x height x fps"
-  std::string ToString() const;
-};
-
-}  // namespace cricket
-
-#endif  // WEBRTC_MEDIA_BASE_VIDEOCOMMON_H_  // NOLINT
diff --git a/media/base/videocommon_unittest.cc b/media/base/videocommon_unittest.cc
deleted file mode 100644
index 8430b80..0000000
--- a/media/base/videocommon_unittest.cc
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- *  Copyright (c) 2008 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/media/base/videocommon.h"
-#include "webrtc/rtc_base/gunit.h"
-
-namespace cricket {
-
-TEST(VideoCommonTest, TestCanonicalFourCC) {
-  // Canonical fourccs are not changed.
-  EXPECT_EQ(FOURCC_I420, CanonicalFourCC(FOURCC_I420));
-  // The special FOURCC_ANY value is not changed.
-  EXPECT_EQ(FOURCC_ANY, CanonicalFourCC(FOURCC_ANY));
-  // Aliases are translated to the canonical equivalent.
-  EXPECT_EQ(FOURCC_I420, CanonicalFourCC(FOURCC_IYUV));
-  EXPECT_EQ(FOURCC_I422, CanonicalFourCC(FOURCC_YU16));
-  EXPECT_EQ(FOURCC_I444, CanonicalFourCC(FOURCC_YU24));
-  EXPECT_EQ(FOURCC_YUY2, CanonicalFourCC(FOURCC_YUYV));
-  EXPECT_EQ(FOURCC_YUY2, CanonicalFourCC(FOURCC_YUVS));
-  EXPECT_EQ(FOURCC_UYVY, CanonicalFourCC(FOURCC_HDYC));
-  EXPECT_EQ(FOURCC_UYVY, CanonicalFourCC(FOURCC_2VUY));
-  EXPECT_EQ(FOURCC_MJPG, CanonicalFourCC(FOURCC_JPEG));
-  EXPECT_EQ(FOURCC_MJPG, CanonicalFourCC(FOURCC_DMB1));
-  EXPECT_EQ(FOURCC_BGGR, CanonicalFourCC(FOURCC_BA81));
-  EXPECT_EQ(FOURCC_RAW, CanonicalFourCC(FOURCC_RGB3));
-  EXPECT_EQ(FOURCC_24BG, CanonicalFourCC(FOURCC_BGR3));
-  EXPECT_EQ(FOURCC_BGRA, CanonicalFourCC(FOURCC_CM32));
-  EXPECT_EQ(FOURCC_RAW, CanonicalFourCC(FOURCC_CM24));
-}
-
-// Test conversion between interval and fps
-TEST(VideoCommonTest, TestVideoFormatFps) {
-  EXPECT_EQ(VideoFormat::kMinimumInterval, VideoFormat::FpsToInterval(0));
-  EXPECT_EQ(rtc::kNumNanosecsPerSec / 20, VideoFormat::FpsToInterval(20));
-  EXPECT_EQ(20, VideoFormat::IntervalToFps(rtc::kNumNanosecsPerSec / 20));
-  EXPECT_EQ(0, VideoFormat::IntervalToFps(0));
-}
-
-// Test IsSize0x0
-TEST(VideoCommonTest, TestVideoFormatIsSize0x0) {
-  VideoFormat format;
-  EXPECT_TRUE(format.IsSize0x0());
-  format.width = 320;
-  EXPECT_FALSE(format.IsSize0x0());
-}
-
-// Test ToString: print fourcc when it is printable.
-TEST(VideoCommonTest, TestVideoFormatToString) {
-  VideoFormat format;
-  EXPECT_EQ("0x0x0", format.ToString());
-
-  format.fourcc = FOURCC_I420;
-  format.width = 640;
-  format.height = 480;
-  format.interval = VideoFormat::FpsToInterval(20);
-  EXPECT_EQ("I420 640x480x20", format.ToString());
-
-  format.fourcc = FOURCC_ANY;
-  format.width = 640;
-  format.height = 480;
-  format.interval = VideoFormat::FpsToInterval(20);
-  EXPECT_EQ("640x480x20", format.ToString());
-}
-
-// Test comparison.
-TEST(VideoCommonTest, TestVideoFormatCompare) {
-  VideoFormat format(640, 480, VideoFormat::FpsToInterval(20), FOURCC_I420);
-  VideoFormat format2;
-  EXPECT_NE(format, format2);
-
-  // Same pixelrate, different fourcc.
-  format2 = format;
-  format2.fourcc = FOURCC_YUY2;
-  EXPECT_NE(format, format2);
-  EXPECT_FALSE(format.IsPixelRateLess(format2) ||
-               format2.IsPixelRateLess(format2));
-
-  format2 = format;
-  format2.interval /= 2;
-  EXPECT_TRUE(format.IsPixelRateLess(format2));
-
-  format2 = format;
-  format2.width *= 2;
-  EXPECT_TRUE(format.IsPixelRateLess(format2));
-}
-
-}  // namespace cricket
diff --git a/media/base/videoengine_unittest.h b/media/base/videoengine_unittest.h
deleted file mode 100644
index 64fda56..0000000
--- a/media/base/videoengine_unittest.h
+++ /dev/null
@@ -1,946 +0,0 @@
-/*
- *  Copyright (c) 2014 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_MEDIA_BASE_VIDEOENGINE_UNITTEST_H_  // NOLINT
-#define WEBRTC_MEDIA_BASE_VIDEOENGINE_UNITTEST_H_
-
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "webrtc/call/call.h"
-#include "webrtc/logging/rtc_event_log/rtc_event_log.h"
-#include "webrtc/media/base/fakenetworkinterface.h"
-#include "webrtc/media/base/fakevideocapturer.h"
-#include "webrtc/media/base/fakevideorenderer.h"
-#include "webrtc/media/base/mediachannel.h"
-#include "webrtc/media/base/streamparams.h"
-#include "webrtc/media/engine/fakewebrtccall.h"
-#include "webrtc/rtc_base/bytebuffer.h"
-#include "webrtc/rtc_base/gunit.h"
-#include "webrtc/rtc_base/timeutils.h"
-
-#define EXPECT_FRAME_WAIT(c, w, h, t) \
-  EXPECT_EQ_WAIT((c), renderer_.num_rendered_frames(), (t)); \
-  EXPECT_EQ((w), renderer_.width()); \
-  EXPECT_EQ((h), renderer_.height()); \
-  EXPECT_EQ(0, renderer_.errors()); \
-
-#define EXPECT_FRAME_ON_RENDERER_WAIT(r, c, w, h, t) \
-  EXPECT_EQ_WAIT((c), (r).num_rendered_frames(), (t)); \
-  EXPECT_EQ((w), (r).width()); \
-  EXPECT_EQ((h), (r).height()); \
-  EXPECT_EQ(0, (r).errors()); \
-
-#define EXPECT_GT_FRAME_ON_RENDERER_WAIT(r, c, w, h, t) \
-  EXPECT_TRUE_WAIT((r).num_rendered_frames() >= (c) && \
-                   (w) == (r).width() && \
-                   (h) == (r).height(), (t)); \
-  EXPECT_EQ(0, (r).errors());
-
-static const uint32_t kTimeout = 5000U;
-static const uint32_t kDefaultReceiveSsrc = 0;
-static const uint32_t kSsrc = 1234u;
-static const uint32_t kRtxSsrc = 4321u;
-static const uint32_t kSsrcs4[] = {1, 2, 3, 4};
-static const int kVideoWidth = 640;
-static const int kVideoHeight = 360;
-static const int kFramerate = 30;
-
-inline bool IsEqualCodec(const cricket::VideoCodec& a,
-                         const cricket::VideoCodec& b) {
-  return a.id == b.id && a.name == b.name;
-}
-
-template<class E, class C>
-class VideoMediaChannelTest : public testing::Test,
-                              public sigslot::has_slots<> {
- protected:
-  VideoMediaChannelTest<E, C>()
-      : call_(webrtc::Call::Create(webrtc::Call::Config(&event_log_))),
-        engine_(nullptr /* external_encoder_factory */,
-                nullptr /* external_decoder_factory */) {}
-
-  virtual cricket::VideoCodec DefaultCodec() = 0;
-
-  virtual cricket::StreamParams DefaultSendStreamParams() {
-    return cricket::StreamParams::CreateLegacy(kSsrc);
-  }
-
-  virtual void SetUp() {
-    cricket::MediaConfig media_config;
-    // Disabling cpu overuse detection actually disables quality scaling too; it
-    // implies DegradationPreference kMaintainResolution. Automatic scaling
-    // needs to be disabled, otherwise, tests which check the size of received
-    // frames become flaky.
-    media_config.video.enable_cpu_overuse_detection = false;
-    channel_.reset(engine_.CreateChannel(call_.get(), media_config,
-                                         cricket::VideoOptions()));
-    channel_->OnReadyToSend(true);
-    EXPECT_TRUE(channel_.get() != NULL);
-    network_interface_.SetDestination(channel_.get());
-    channel_->SetInterface(&network_interface_);
-    media_error_ = cricket::VideoMediaChannel::ERROR_NONE;
-    cricket::VideoRecvParameters parameters;
-    parameters.codecs = engine_.codecs();
-    channel_->SetRecvParameters(parameters);
-    EXPECT_TRUE(channel_->AddSendStream(DefaultSendStreamParams()));
-    video_capturer_.reset(CreateFakeVideoCapturer());
-    cricket::VideoFormat format(640, 480,
-                                cricket::VideoFormat::FpsToInterval(kFramerate),
-                                cricket::FOURCC_I420);
-    EXPECT_EQ(cricket::CS_RUNNING, video_capturer_->Start(format));
-    EXPECT_TRUE(
-        channel_->SetVideoSend(kSsrc, true, nullptr, video_capturer_.get()));
-  }
-
-  virtual cricket::FakeVideoCapturer* CreateFakeVideoCapturer() {
-    return new cricket::FakeVideoCapturer();
-  }
-
-  // Utility method to setup an additional stream to send and receive video.
-  // Used to test send and recv between two streams.
-  void SetUpSecondStream() {
-    SetUpSecondStreamWithNoRecv();
-    // Setup recv for second stream.
-    EXPECT_TRUE(channel_->AddRecvStream(
-        cricket::StreamParams::CreateLegacy(kSsrc + 2)));
-    // Make the second renderer available for use by a new stream.
-    EXPECT_TRUE(channel_->SetSink(kSsrc + 2, &renderer2_));
-  }
-  // Setup an additional stream just to send video. Defer add recv stream.
-  // This is required if you want to test unsignalled recv of video rtp packets.
-  void SetUpSecondStreamWithNoRecv() {
-    // SetUp() already added kSsrc make sure duplicate SSRCs cant be added.
-    EXPECT_TRUE(channel_->AddRecvStream(
-        cricket::StreamParams::CreateLegacy(kSsrc)));
-    EXPECT_TRUE(channel_->SetSink(kSsrc, &renderer_));
-    EXPECT_FALSE(channel_->AddSendStream(
-        cricket::StreamParams::CreateLegacy(kSsrc)));
-    EXPECT_TRUE(channel_->AddSendStream(
-        cricket::StreamParams::CreateLegacy(kSsrc + 2)));
-    // We dont add recv for the second stream.
-
-    // Setup the receive and renderer for second stream after send.
-    video_capturer_2_.reset(CreateFakeVideoCapturer());
-    cricket::VideoFormat format(640, 480,
-                                cricket::VideoFormat::FpsToInterval(kFramerate),
-                                cricket::FOURCC_I420);
-    EXPECT_EQ(cricket::CS_RUNNING, video_capturer_2_->Start(format));
-
-    EXPECT_TRUE(channel_->SetVideoSend(kSsrc + 2, true, nullptr,
-                                       video_capturer_2_.get()));
-  }
-  virtual void TearDown() {
-    channel_.reset();
-  }
-  bool SetDefaultCodec() {
-    return SetOneCodec(DefaultCodec());
-  }
-
-  bool SetOneCodec(int pt, const char* name) {
-    return SetOneCodec(cricket::VideoCodec(pt, name));
-  }
-  bool SetOneCodec(const cricket::VideoCodec& codec) {
-    cricket::VideoFormat capture_format(
-        kVideoWidth, kVideoHeight,
-        cricket::VideoFormat::FpsToInterval(kFramerate), cricket::FOURCC_I420);
-
-    if (video_capturer_) {
-      EXPECT_EQ(cricket::CS_RUNNING, video_capturer_->Start(capture_format));
-    }
-    if (video_capturer_2_) {
-      EXPECT_EQ(cricket::CS_RUNNING, video_capturer_2_->Start(capture_format));
-    }
-
-    bool sending = channel_->sending();
-    bool success = SetSend(false);
-    if (success) {
-      cricket::VideoSendParameters parameters;
-      parameters.codecs.push_back(codec);
-      success = channel_->SetSendParameters(parameters);
-    }
-    if (success) {
-      success = SetSend(sending);
-    }
-    return success;
-  }
-  bool SetSend(bool send) {
-    return channel_->SetSend(send);
-  }
-  int DrainOutgoingPackets() {
-    int packets = 0;
-    do {
-      packets = NumRtpPackets();
-      // 100 ms should be long enough.
-      rtc::Thread::Current()->ProcessMessages(100);
-    } while (NumRtpPackets() > packets);
-    return NumRtpPackets();
-  }
-  bool SendFrame() {
-    if (video_capturer_2_) {
-      video_capturer_2_->CaptureFrame();
-    }
-    return video_capturer_.get() &&
-        video_capturer_->CaptureFrame();
-  }
-  bool WaitAndSendFrame(int wait_ms) {
-    bool ret = rtc::Thread::Current()->ProcessMessages(wait_ms);
-    ret &= SendFrame();
-    return ret;
-  }
-  // Sends frames and waits for the decoder to be fully initialized.
-  // Returns the number of frames that were sent.
-  int WaitForDecoder() {
-#if defined(HAVE_OPENMAX)
-    // Send enough frames for the OpenMAX decoder to continue processing, and
-    // return the number of frames sent.
-    // Send frames for a full kTimeout's worth of 15fps video.
-    int frame_count = 0;
-    while (frame_count < static_cast<int>(kTimeout) / 66) {
-      EXPECT_TRUE(WaitAndSendFrame(66));
-      ++frame_count;
-    }
-    return frame_count;
-#else
-    return 0;
-#endif
-  }
-  bool SendCustomVideoFrame(int w, int h) {
-    if (!video_capturer_.get()) return false;
-    return video_capturer_->CaptureCustomFrame(w, h, cricket::FOURCC_I420);
-  }
-  int NumRtpBytes() {
-    return network_interface_.NumRtpBytes();
-  }
-  int NumRtpBytes(uint32_t ssrc) {
-    return network_interface_.NumRtpBytes(ssrc);
-  }
-  int NumRtpPackets() {
-    return network_interface_.NumRtpPackets();
-  }
-  int NumRtpPackets(uint32_t ssrc) {
-    return network_interface_.NumRtpPackets(ssrc);
-  }
-  int NumSentSsrcs() {
-    return network_interface_.NumSentSsrcs();
-  }
-  const rtc::CopyOnWriteBuffer* GetRtpPacket(int index) {
-    return network_interface_.GetRtpPacket(index);
-  }
-  int NumRtcpPackets() {
-    return network_interface_.NumRtcpPackets();
-  }
-  const rtc::CopyOnWriteBuffer* GetRtcpPacket(int index) {
-    return network_interface_.GetRtcpPacket(index);
-  }
-  static int GetPayloadType(const rtc::CopyOnWriteBuffer* p) {
-    int pt = -1;
-    ParseRtpPacket(p, NULL, &pt, NULL, NULL, NULL, NULL);
-    return pt;
-  }
-  static bool ParseRtpPacket(const rtc::CopyOnWriteBuffer* p,
-                             bool* x,
-                             int* pt,
-                             int* seqnum,
-                             uint32_t* tstamp,
-                             uint32_t* ssrc,
-                             std::string* payload) {
-    rtc::ByteBufferReader buf(p->data<char>(), p->size());
-    uint8_t u08 = 0;
-    uint16_t u16 = 0;
-    uint32_t u32 = 0;
-
-    // Read X and CC fields.
-    if (!buf.ReadUInt8(&u08)) return false;
-    bool extension = ((u08 & 0x10) != 0);
-    uint8_t cc = (u08 & 0x0F);
-    if (x) *x = extension;
-
-    // Read PT field.
-    if (!buf.ReadUInt8(&u08)) return false;
-    if (pt) *pt = (u08 & 0x7F);
-
-    // Read Sequence Number field.
-    if (!buf.ReadUInt16(&u16)) return false;
-    if (seqnum) *seqnum = u16;
-
-    // Read Timestamp field.
-    if (!buf.ReadUInt32(&u32)) return false;
-    if (tstamp) *tstamp = u32;
-
-    // Read SSRC field.
-    if (!buf.ReadUInt32(&u32)) return false;
-    if (ssrc) *ssrc = u32;
-
-    // Skip CSRCs.
-    for (uint8_t i = 0; i < cc; ++i) {
-      if (!buf.ReadUInt32(&u32)) return false;
-    }
-
-    // Skip extension header.
-    if (extension) {
-      // Read Profile-specific extension header ID
-      if (!buf.ReadUInt16(&u16)) return false;
-
-      // Read Extension header length
-      if (!buf.ReadUInt16(&u16)) return false;
-      uint16_t ext_header_len = u16;
-
-      // Read Extension header
-      for (uint16_t i = 0; i < ext_header_len; ++i) {
-        if (!buf.ReadUInt32(&u32)) return false;
-      }
-    }
-
-    if (payload) {
-      return buf.ReadString(payload, buf.Length());
-    }
-    return true;
-  }
-
-  // Parse all RTCP packet, from start_index to stop_index, and count how many
-  // FIR (PT=206 and FMT=4 according to RFC 5104). If successful, set the count
-  // and return true.
-  bool CountRtcpFir(int start_index, int stop_index, int* fir_count) {
-    int count = 0;
-    for (int i = start_index; i < stop_index; ++i) {
-      std::unique_ptr<const rtc::CopyOnWriteBuffer> p(GetRtcpPacket(i));
-      rtc::ByteBufferReader buf(p->data<char>(), p->size());
-      size_t total_len = 0;
-      // The packet may be a compound RTCP packet.
-      while (total_len < p->size()) {
-        // Read FMT, type and length.
-        uint8_t fmt = 0;
-        uint8_t type = 0;
-        uint16_t length = 0;
-        if (!buf.ReadUInt8(&fmt)) return false;
-        fmt &= 0x1F;
-        if (!buf.ReadUInt8(&type)) return false;
-        if (!buf.ReadUInt16(&length)) return false;
-        buf.Consume(length * 4);  // Skip RTCP data.
-        total_len += (length + 1) * 4;
-        if ((192 == type) || ((206 == type) && (4 == fmt))) {
-          ++count;
-        }
-      }
-    }
-
-    if (fir_count) {
-      *fir_count = count;
-    }
-    return true;
-  }
-
-  void OnVideoChannelError(uint32_t ssrc,
-                           cricket::VideoMediaChannel::Error error) {
-    media_error_ = error;
-  }
-
-  // Test that SetSend works.
-  void SetSend() {
-    EXPECT_FALSE(channel_->sending());
-    EXPECT_TRUE(
-        channel_->SetVideoSend(kSsrc, true, nullptr, video_capturer_.get()));
-    EXPECT_TRUE(SetOneCodec(DefaultCodec()));
-    EXPECT_FALSE(channel_->sending());
-    EXPECT_TRUE(SetSend(true));
-    EXPECT_TRUE(channel_->sending());
-    EXPECT_TRUE(SendFrame());
-    EXPECT_TRUE_WAIT(NumRtpPackets() > 0, kTimeout);
-    EXPECT_TRUE(SetSend(false));
-    EXPECT_FALSE(channel_->sending());
-  }
-  // Test that SetSend fails without codecs being set.
-  void SetSendWithoutCodecs() {
-    EXPECT_FALSE(channel_->sending());
-    EXPECT_FALSE(SetSend(true));
-    EXPECT_FALSE(channel_->sending());
-  }
-  // Test that we properly set the send and recv buffer sizes by the time
-  // SetSend is called.
-  void SetSendSetsTransportBufferSizes() {
-    EXPECT_TRUE(SetOneCodec(DefaultCodec()));
-    EXPECT_TRUE(SetSend(true));
-    EXPECT_EQ(64 * 1024, network_interface_.sendbuf_size());
-    EXPECT_EQ(64 * 1024, network_interface_.recvbuf_size());
-  }
-  // Tests that we can send frames and the right payload type is used.
-  void Send(const cricket::VideoCodec& codec) {
-    EXPECT_TRUE(SetOneCodec(codec));
-    EXPECT_TRUE(SetSend(true));
-    EXPECT_TRUE(SendFrame());
-    EXPECT_TRUE_WAIT(NumRtpPackets() > 0, kTimeout);
-    std::unique_ptr<const rtc::CopyOnWriteBuffer> p(GetRtpPacket(0));
-    EXPECT_EQ(codec.id, GetPayloadType(p.get()));
-  }
-  // Tests that we can send and receive frames.
-  void SendAndReceive(const cricket::VideoCodec& codec) {
-    EXPECT_TRUE(SetOneCodec(codec));
-    EXPECT_TRUE(SetSend(true));
-    EXPECT_TRUE(channel_->SetSink(kDefaultReceiveSsrc, &renderer_));
-    EXPECT_EQ(0, renderer_.num_rendered_frames());
-    EXPECT_TRUE(SendFrame());
-    EXPECT_FRAME_WAIT(1, kVideoWidth, kVideoHeight, kTimeout);
-    std::unique_ptr<const rtc::CopyOnWriteBuffer> p(GetRtpPacket(0));
-    EXPECT_EQ(codec.id, GetPayloadType(p.get()));
-  }
-  void SendReceiveManyAndGetStats(const cricket::VideoCodec& codec,
-                                  int duration_sec, int fps) {
-    EXPECT_TRUE(SetOneCodec(codec));
-    EXPECT_TRUE(SetSend(true));
-    EXPECT_TRUE(channel_->SetSink(kDefaultReceiveSsrc, &renderer_));
-    EXPECT_EQ(0, renderer_.num_rendered_frames());
-    for (int i = 0; i < duration_sec; ++i) {
-      for (int frame = 1; frame <= fps; ++frame) {
-        EXPECT_TRUE(WaitAndSendFrame(1000 / fps));
-        EXPECT_FRAME_WAIT(frame + i * fps, kVideoWidth, kVideoHeight, kTimeout);
-      }
-    }
-    std::unique_ptr<const rtc::CopyOnWriteBuffer> p(GetRtpPacket(0));
-    EXPECT_EQ(codec.id, GetPayloadType(p.get()));
-  }
-
-  // Test that stats work properly for a 1-1 call.
-  void GetStats() {
-    const int kDurationSec = 3;
-    const int kFps = 10;
-    SendReceiveManyAndGetStats(DefaultCodec(), kDurationSec, kFps);
-
-    cricket::VideoMediaInfo info;
-    EXPECT_TRUE(channel_->GetStats(&info));
-
-    ASSERT_EQ(1U, info.senders.size());
-    // TODO(whyuan): bytes_sent and bytes_rcvd are different. Are both payload?
-    // For webrtc, bytes_sent does not include the RTP header length.
-    EXPECT_GT(info.senders[0].bytes_sent, 0);
-    EXPECT_EQ(NumRtpPackets(), info.senders[0].packets_sent);
-    EXPECT_EQ(0.0, info.senders[0].fraction_lost);
-    ASSERT_TRUE(info.senders[0].codec_payload_type);
-    EXPECT_EQ(DefaultCodec().id, *info.senders[0].codec_payload_type);
-    EXPECT_EQ(0, info.senders[0].firs_rcvd);
-    EXPECT_EQ(0, info.senders[0].plis_rcvd);
-    EXPECT_EQ(0, info.senders[0].nacks_rcvd);
-    EXPECT_EQ(kVideoWidth, info.senders[0].send_frame_width);
-    EXPECT_EQ(kVideoHeight, info.senders[0].send_frame_height);
-    EXPECT_GT(info.senders[0].framerate_input, 0);
-    EXPECT_GT(info.senders[0].framerate_sent, 0);
-
-    EXPECT_EQ(1U, info.send_codecs.count(DefaultCodec().id));
-    EXPECT_EQ(DefaultCodec().ToCodecParameters(),
-              info.send_codecs[DefaultCodec().id]);
-
-    ASSERT_EQ(1U, info.receivers.size());
-    EXPECT_EQ(1U, info.senders[0].ssrcs().size());
-    EXPECT_EQ(1U, info.receivers[0].ssrcs().size());
-    EXPECT_EQ(info.senders[0].ssrcs()[0], info.receivers[0].ssrcs()[0]);
-    ASSERT_TRUE(info.receivers[0].codec_payload_type);
-    EXPECT_EQ(DefaultCodec().id, *info.receivers[0].codec_payload_type);
-    EXPECT_EQ(NumRtpBytes(), info.receivers[0].bytes_rcvd);
-    EXPECT_EQ(NumRtpPackets(), info.receivers[0].packets_rcvd);
-    EXPECT_EQ(0.0, info.receivers[0].fraction_lost);
-    EXPECT_EQ(0, info.receivers[0].packets_lost);
-    // TODO(asapersson): Not set for webrtc. Handle missing stats.
-    // EXPECT_EQ(0, info.receivers[0].packets_concealed);
-    EXPECT_EQ(0, info.receivers[0].firs_sent);
-    EXPECT_EQ(0, info.receivers[0].plis_sent);
-    EXPECT_EQ(0, info.receivers[0].nacks_sent);
-    EXPECT_EQ(kVideoWidth, info.receivers[0].frame_width);
-    EXPECT_EQ(kVideoHeight, info.receivers[0].frame_height);
-    EXPECT_GT(info.receivers[0].framerate_rcvd, 0);
-    EXPECT_GT(info.receivers[0].framerate_decoded, 0);
-    EXPECT_GT(info.receivers[0].framerate_output, 0);
-
-    EXPECT_EQ(1U, info.receive_codecs.count(DefaultCodec().id));
-    EXPECT_EQ(DefaultCodec().ToCodecParameters(),
-              info.receive_codecs[DefaultCodec().id]);
-  }
-
-  cricket::VideoSenderInfo GetSenderStats(size_t i) {
-    cricket::VideoMediaInfo info;
-    EXPECT_TRUE(channel_->GetStats(&info));
-    return info.senders[i];
-  }
-
-  cricket::VideoReceiverInfo GetReceiverStats(size_t i) {
-    cricket::VideoMediaInfo info;
-    EXPECT_TRUE(channel_->GetStats(&info));
-    return info.receivers[i];
-  }
-
-  // Test that stats work properly for a conf call with multiple recv streams.
-  void GetStatsMultipleRecvStreams() {
-    cricket::FakeVideoRenderer renderer1, renderer2;
-    EXPECT_TRUE(SetOneCodec(DefaultCodec()));
-    cricket::VideoSendParameters parameters;
-    parameters.codecs.push_back(DefaultCodec());
-    parameters.conference_mode = true;
-    EXPECT_TRUE(channel_->SetSendParameters(parameters));
-    EXPECT_TRUE(SetSend(true));
-    EXPECT_TRUE(channel_->AddRecvStream(
-        cricket::StreamParams::CreateLegacy(1)));
-    EXPECT_TRUE(channel_->AddRecvStream(
-        cricket::StreamParams::CreateLegacy(2)));
-    EXPECT_TRUE(channel_->SetSink(1, &renderer1));
-    EXPECT_TRUE(channel_->SetSink(2, &renderer2));
-    EXPECT_EQ(0, renderer1.num_rendered_frames());
-    EXPECT_EQ(0, renderer2.num_rendered_frames());
-    std::vector<uint32_t> ssrcs;
-    ssrcs.push_back(1);
-    ssrcs.push_back(2);
-    network_interface_.SetConferenceMode(true, ssrcs);
-    EXPECT_TRUE(SendFrame());
-    EXPECT_FRAME_ON_RENDERER_WAIT(renderer1, 1, kVideoWidth, kVideoHeight,
-                                  kTimeout);
-    EXPECT_FRAME_ON_RENDERER_WAIT(renderer2, 1, kVideoWidth, kVideoHeight,
-                                  kTimeout);
-
-    EXPECT_TRUE(channel_->SetSend(false));
-
-    cricket::VideoMediaInfo info;
-    EXPECT_TRUE(channel_->GetStats(&info));
-    ASSERT_EQ(1U, info.senders.size());
-    // TODO(whyuan): bytes_sent and bytes_rcvd are different. Are both payload?
-    // For webrtc, bytes_sent does not include the RTP header length.
-    EXPECT_GT(GetSenderStats(0).bytes_sent, 0);
-    EXPECT_EQ_WAIT(NumRtpPackets(), GetSenderStats(0).packets_sent, kTimeout);
-    EXPECT_EQ(kVideoWidth, GetSenderStats(0).send_frame_width);
-    EXPECT_EQ(kVideoHeight, GetSenderStats(0).send_frame_height);
-
-    ASSERT_EQ(2U, info.receivers.size());
-    for (size_t i = 0; i < info.receivers.size(); ++i) {
-      EXPECT_EQ(1U, GetReceiverStats(i).ssrcs().size());
-      EXPECT_EQ(i + 1, GetReceiverStats(i).ssrcs()[0]);
-      EXPECT_EQ_WAIT(NumRtpBytes(), GetReceiverStats(i).bytes_rcvd, kTimeout);
-      EXPECT_EQ_WAIT(NumRtpPackets(), GetReceiverStats(i).packets_rcvd,
-                     kTimeout);
-      EXPECT_EQ_WAIT(kVideoWidth, GetReceiverStats(i).frame_width, kTimeout);
-      EXPECT_EQ_WAIT(kVideoHeight, GetReceiverStats(i).frame_height, kTimeout);
-    }
-  }
-  // Test that stats work properly for a conf call with multiple send streams.
-  void GetStatsMultipleSendStreams() {
-    // Normal setup; note that we set the SSRC explicitly to ensure that
-    // it will come first in the senders map.
-    EXPECT_TRUE(SetOneCodec(DefaultCodec()));
-    cricket::VideoSendParameters parameters;
-    parameters.codecs.push_back(DefaultCodec());
-    parameters.conference_mode = true;
-    EXPECT_TRUE(channel_->SetSendParameters(parameters));
-    EXPECT_TRUE(channel_->AddRecvStream(
-        cricket::StreamParams::CreateLegacy(kSsrc)));
-    EXPECT_TRUE(channel_->SetSink(kSsrc, &renderer_));
-    EXPECT_TRUE(SetSend(true));
-    EXPECT_TRUE(SendFrame());
-    EXPECT_TRUE_WAIT(NumRtpPackets() > 0, kTimeout);
-    EXPECT_FRAME_WAIT(1, kVideoWidth, kVideoHeight, kTimeout);
-
-    // Add an additional capturer, and hook up a renderer to receive it.
-    cricket::FakeVideoRenderer renderer2;
-    std::unique_ptr<cricket::FakeVideoCapturer> capturer(
-        CreateFakeVideoCapturer());
-    const int kTestWidth = 160;
-    const int kTestHeight = 120;
-    cricket::VideoFormat format(kTestWidth, kTestHeight,
-                                cricket::VideoFormat::FpsToInterval(5),
-                                cricket::FOURCC_I420);
-    EXPECT_EQ(cricket::CS_RUNNING, capturer->Start(format));
-    EXPECT_TRUE(channel_->AddSendStream(
-        cricket::StreamParams::CreateLegacy(5678)));
-    EXPECT_TRUE(channel_->SetVideoSend(5678, true, nullptr, capturer.get()));
-    EXPECT_TRUE(channel_->AddRecvStream(
-        cricket::StreamParams::CreateLegacy(5678)));
-    EXPECT_TRUE(channel_->SetSink(5678, &renderer2));
-    EXPECT_TRUE(capturer->CaptureCustomFrame(
-        kTestWidth, kTestHeight, cricket::FOURCC_I420));
-    EXPECT_FRAME_ON_RENDERER_WAIT(
-        renderer2, 1, kTestWidth, kTestHeight, kTimeout);
-
-    // Get stats, and make sure they are correct for two senders. We wait until
-    // the number of expected packets have been sent to avoid races where we
-    // check stats before it has been updated.
-    cricket::VideoMediaInfo info;
-    for (uint32_t i = 0; i < kTimeout; ++i) {
-      rtc::Thread::Current()->ProcessMessages(1);
-      EXPECT_TRUE(channel_->GetStats(&info));
-      ASSERT_EQ(2U, info.senders.size());
-      if (info.senders[0].packets_sent + info.senders[1].packets_sent ==
-          NumRtpPackets()) {
-        // Stats have been updated for both sent frames, expectations can be
-        // checked now.
-        break;
-      }
-    }
-    EXPECT_EQ(NumRtpPackets(),
-              info.senders[0].packets_sent + info.senders[1].packets_sent)
-        << "Timed out while waiting for packet counts for all sent packets.";
-    EXPECT_EQ(1U, info.senders[0].ssrcs().size());
-    EXPECT_EQ(1234U, info.senders[0].ssrcs()[0]);
-    EXPECT_EQ(kVideoWidth, info.senders[0].send_frame_width);
-    EXPECT_EQ(kVideoHeight, info.senders[0].send_frame_height);
-    EXPECT_EQ(1U, info.senders[1].ssrcs().size());
-    EXPECT_EQ(5678U, info.senders[1].ssrcs()[0]);
-    EXPECT_EQ(kTestWidth, info.senders[1].send_frame_width);
-    EXPECT_EQ(kTestHeight, info.senders[1].send_frame_height);
-    // The capturer must be unregistered here as it runs out of it's scope next.
-    channel_->SetVideoSend(5678, true, nullptr, nullptr);
-  }
-
-  // Test that we can set the bandwidth.
-  void SetSendBandwidth() {
-    cricket::VideoSendParameters parameters;
-    parameters.codecs.push_back(DefaultCodec());
-    parameters.max_bandwidth_bps = -1;  // <= 0 means unlimited.
-    EXPECT_TRUE(channel_->SetSendParameters(parameters));
-    parameters.max_bandwidth_bps = 128 * 1024;
-    EXPECT_TRUE(channel_->SetSendParameters(parameters));
-  }
-  // Test that we can set the SSRC for the default send source.
-  void SetSendSsrc() {
-    EXPECT_TRUE(SetDefaultCodec());
-    EXPECT_TRUE(SetSend(true));
-    EXPECT_TRUE(SendFrame());
-    EXPECT_TRUE_WAIT(NumRtpPackets() > 0, kTimeout);
-    uint32_t ssrc = 0;
-    std::unique_ptr<const rtc::CopyOnWriteBuffer> p(GetRtpPacket(0));
-    ParseRtpPacket(p.get(), NULL, NULL, NULL, NULL, &ssrc, NULL);
-    EXPECT_EQ(kSsrc, ssrc);
-    // Packets are being paced out, so these can mismatch between the first and
-    // second call to NumRtpPackets until pending packets are paced out.
-    EXPECT_EQ_WAIT(NumRtpPackets(), NumRtpPackets(ssrc), kTimeout);
-    EXPECT_EQ_WAIT(NumRtpBytes(), NumRtpBytes(ssrc), kTimeout);
-    EXPECT_EQ(1, NumSentSsrcs());
-    EXPECT_EQ(0, NumRtpPackets(kSsrc - 1));
-    EXPECT_EQ(0, NumRtpBytes(kSsrc - 1));
-  }
-  // Test that we can set the SSRC even after codecs are set.
-  void SetSendSsrcAfterSetCodecs() {
-    // Remove stream added in Setup.
-    EXPECT_TRUE(channel_->RemoveSendStream(kSsrc));
-    EXPECT_TRUE(SetDefaultCodec());
-    EXPECT_TRUE(channel_->AddSendStream(
-        cricket::StreamParams::CreateLegacy(999)));
-    EXPECT_TRUE(
-        channel_->SetVideoSend(999u, true, nullptr, video_capturer_.get()));
-    EXPECT_TRUE(SetSend(true));
-    EXPECT_TRUE(WaitAndSendFrame(0));
-    EXPECT_TRUE_WAIT(NumRtpPackets() > 0, kTimeout);
-    uint32_t ssrc = 0;
-    std::unique_ptr<const rtc::CopyOnWriteBuffer> p(GetRtpPacket(0));
-    ParseRtpPacket(p.get(), NULL, NULL, NULL, NULL, &ssrc, NULL);
-    EXPECT_EQ(999u, ssrc);
-    // Packets are being paced out, so these can mismatch between the first and
-    // second call to NumRtpPackets until pending packets are paced out.
-    EXPECT_EQ_WAIT(NumRtpPackets(), NumRtpPackets(ssrc), kTimeout);
-    EXPECT_EQ_WAIT(NumRtpBytes(), NumRtpBytes(ssrc), kTimeout);
-    EXPECT_EQ(1, NumSentSsrcs());
-    EXPECT_EQ(0, NumRtpPackets(kSsrc));
-    EXPECT_EQ(0, NumRtpBytes(kSsrc));
-  }
-  // Test that we can set the default video renderer before and after
-  // media is received.
-  void SetSink() {
-    uint8_t data1[] = {
-        0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
-
-    rtc::CopyOnWriteBuffer packet1(data1, sizeof(data1));
-    rtc::SetBE32(packet1.data() + 8, kSsrc);
-    channel_->SetSink(kDefaultReceiveSsrc, NULL);
-    EXPECT_TRUE(SetDefaultCodec());
-    EXPECT_TRUE(SetSend(true));
-    EXPECT_EQ(0, renderer_.num_rendered_frames());
-    channel_->OnPacketReceived(&packet1, rtc::PacketTime());
-    EXPECT_TRUE(channel_->SetSink(kDefaultReceiveSsrc, &renderer_));
-    EXPECT_TRUE(SendFrame());
-    EXPECT_FRAME_WAIT(1, kVideoWidth, kVideoHeight, kTimeout);
-  }
-
-  // Tests empty StreamParams is rejected.
-  void RejectEmptyStreamParams() {
-    // Remove the send stream that was added during Setup.
-    EXPECT_TRUE(channel_->RemoveSendStream(kSsrc));
-
-    cricket::StreamParams empty;
-    EXPECT_FALSE(channel_->AddSendStream(empty));
-    EXPECT_TRUE(channel_->AddSendStream(
-        cricket::StreamParams::CreateLegacy(789u)));
-  }
-
-  // Tests setting up and configuring a send stream.
-  void AddRemoveSendStreams() {
-    EXPECT_TRUE(SetOneCodec(DefaultCodec()));
-    EXPECT_TRUE(SetSend(true));
-    EXPECT_TRUE(channel_->SetSink(kDefaultReceiveSsrc, &renderer_));
-    EXPECT_TRUE(SendFrame());
-    EXPECT_FRAME_WAIT(1, kVideoWidth, kVideoHeight, kTimeout);
-    EXPECT_GT(NumRtpPackets(), 0);
-    uint32_t ssrc = 0;
-    size_t last_packet = NumRtpPackets() - 1;
-    std::unique_ptr<const rtc::CopyOnWriteBuffer>
-        p(GetRtpPacket(static_cast<int>(last_packet)));
-    ParseRtpPacket(p.get(), NULL, NULL, NULL, NULL, &ssrc, NULL);
-    EXPECT_EQ(kSsrc, ssrc);
-
-    // Remove the send stream that was added during Setup.
-    EXPECT_TRUE(channel_->RemoveSendStream(kSsrc));
-    int rtp_packets = NumRtpPackets();
-
-    EXPECT_TRUE(channel_->AddSendStream(
-        cricket::StreamParams::CreateLegacy(789u)));
-    EXPECT_TRUE(
-        channel_->SetVideoSend(789u, true, nullptr, video_capturer_.get()));
-    EXPECT_EQ(rtp_packets, NumRtpPackets());
-    // Wait 30ms to guarantee the engine does not drop the frame.
-    EXPECT_TRUE(WaitAndSendFrame(30));
-    EXPECT_TRUE_WAIT(NumRtpPackets() > rtp_packets, kTimeout);
-
-    last_packet = NumRtpPackets() - 1;
-    p.reset(GetRtpPacket(static_cast<int>(last_packet)));
-    ParseRtpPacket(p.get(), NULL, NULL, NULL, NULL, &ssrc, NULL);
-    EXPECT_EQ(789u, ssrc);
-  }
-
-  // Tests the behavior of incoming streams in a conference scenario.
-  void SimulateConference() {
-    cricket::FakeVideoRenderer renderer1, renderer2;
-    EXPECT_TRUE(SetDefaultCodec());
-    cricket::VideoSendParameters parameters;
-    parameters.codecs.push_back(DefaultCodec());
-    parameters.conference_mode = true;
-    EXPECT_TRUE(channel_->SetSendParameters(parameters));
-    EXPECT_TRUE(SetSend(true));
-    EXPECT_TRUE(channel_->AddRecvStream(
-        cricket::StreamParams::CreateLegacy(1)));
-    EXPECT_TRUE(channel_->AddRecvStream(
-        cricket::StreamParams::CreateLegacy(2)));
-    EXPECT_TRUE(channel_->SetSink(1, &renderer1));
-    EXPECT_TRUE(channel_->SetSink(2, &renderer2));
-    EXPECT_EQ(0, renderer1.num_rendered_frames());
-    EXPECT_EQ(0, renderer2.num_rendered_frames());
-    std::vector<uint32_t> ssrcs;
-    ssrcs.push_back(1);
-    ssrcs.push_back(2);
-    network_interface_.SetConferenceMode(true, ssrcs);
-    EXPECT_TRUE(SendFrame());
-    EXPECT_FRAME_ON_RENDERER_WAIT(renderer1, 1, kVideoWidth, kVideoHeight,
-                                  kTimeout);
-    EXPECT_FRAME_ON_RENDERER_WAIT(renderer2, 1, kVideoWidth, kVideoHeight,
-                                  kTimeout);
-
-    std::unique_ptr<const rtc::CopyOnWriteBuffer> p(GetRtpPacket(0));
-    EXPECT_EQ(DefaultCodec().id, GetPayloadType(p.get()));
-    EXPECT_EQ(kVideoWidth, renderer1.width());
-    EXPECT_EQ(kVideoHeight, renderer1.height());
-    EXPECT_EQ(kVideoWidth, renderer2.width());
-    EXPECT_EQ(kVideoHeight, renderer2.height());
-    EXPECT_TRUE(channel_->RemoveRecvStream(2));
-    EXPECT_TRUE(channel_->RemoveRecvStream(1));
-  }
-
-  // Tests that we can add and remove capturers and frames are sent out properly
-  void AddRemoveCapturer() {
-    cricket::VideoCodec codec = DefaultCodec();
-    const int time_between_send_ms =
-        cricket::VideoFormat::FpsToInterval(kFramerate);
-    EXPECT_TRUE(SetOneCodec(codec));
-    EXPECT_TRUE(SetSend(true));
-    EXPECT_TRUE(channel_->SetSink(kDefaultReceiveSsrc, &renderer_));
-    EXPECT_EQ(0, renderer_.num_rendered_frames());
-    EXPECT_TRUE(SendFrame());
-    EXPECT_FRAME_WAIT(1, kVideoWidth, kVideoHeight, kTimeout);
-    std::unique_ptr<cricket::FakeVideoCapturer> capturer(
-        CreateFakeVideoCapturer());
-
-    // TODO(nisse): This testcase fails if we don't configure
-    // screencast. It's unclear why, I see nothing obvious in this
-    // test which is related to screencast logic.
-    cricket::VideoOptions video_options;
-    video_options.is_screencast = rtc::Optional<bool>(true);
-    channel_->SetVideoSend(kSsrc, true, &video_options, nullptr);
-
-    cricket::VideoFormat format(480, 360,
-                                cricket::VideoFormat::FpsToInterval(30),
-                                cricket::FOURCC_I420);
-    EXPECT_EQ(cricket::CS_RUNNING, capturer->Start(format));
-    // All capturers start generating frames with the same timestamp. ViE does
-    // not allow the same timestamp to be used. Capture one frame before
-    // associating the capturer with the channel.
-    EXPECT_TRUE(capturer->CaptureCustomFrame(format.width, format.height,
-                                             cricket::FOURCC_I420));
-
-    int captured_frames = 1;
-    for (int iterations = 0; iterations < 2; ++iterations) {
-      EXPECT_TRUE(channel_->SetVideoSend(kSsrc, true, nullptr, capturer.get()));
-      rtc::Thread::Current()->ProcessMessages(time_between_send_ms);
-      EXPECT_TRUE(capturer->CaptureCustomFrame(format.width, format.height,
-                                               cricket::FOURCC_I420));
-      ++captured_frames;
-      // Wait until frame of right size is captured.
-      EXPECT_TRUE_WAIT(renderer_.num_rendered_frames() >= captured_frames &&
-                       format.width == renderer_.width() &&
-                       format.height == renderer_.height() &&
-                       !renderer_.black_frame(), kTimeout);
-      EXPECT_GE(renderer_.num_rendered_frames(), captured_frames);
-      EXPECT_EQ(format.width, renderer_.width());
-      EXPECT_EQ(format.height, renderer_.height());
-      captured_frames = renderer_.num_rendered_frames() + 1;
-      EXPECT_FALSE(renderer_.black_frame());
-      EXPECT_TRUE(channel_->SetVideoSend(kSsrc, true, nullptr, nullptr));
-      // Make sure a black frame is generated within the specified timeout.
-      // The black frame should be the resolution of the previous frame to
-      // prevent expensive encoder reconfigurations.
-      EXPECT_TRUE_WAIT(renderer_.num_rendered_frames() >= captured_frames &&
-                       format.width == renderer_.width() &&
-                       format.height == renderer_.height() &&
-                       renderer_.black_frame(), kTimeout);
-      EXPECT_GE(renderer_.num_rendered_frames(), captured_frames);
-      EXPECT_EQ(format.width, renderer_.width());
-      EXPECT_EQ(format.height, renderer_.height());
-      EXPECT_TRUE(renderer_.black_frame());
-
-      // The black frame has the same timestamp as the next frame since it's
-      // timestamp is set to the last frame's timestamp + interval. WebRTC will
-      // not render a frame with the same timestamp so capture another frame
-      // with the frame capturer to increment the next frame's timestamp.
-      EXPECT_TRUE(capturer->CaptureCustomFrame(format.width, format.height,
-                                               cricket::FOURCC_I420));
-    }
-  }
-
-  // Tests that if SetVideoSend is called with a NULL capturer after the
-  // capturer was already removed, the application doesn't crash (and no black
-  // frame is sent).
-  void RemoveCapturerWithoutAdd() {
-    EXPECT_TRUE(SetOneCodec(DefaultCodec()));
-    EXPECT_TRUE(SetSend(true));
-    EXPECT_TRUE(channel_->SetSink(kDefaultReceiveSsrc, &renderer_));
-    EXPECT_EQ(0, renderer_.num_rendered_frames());
-    EXPECT_TRUE(SendFrame());
-    EXPECT_FRAME_WAIT(1, kVideoWidth, kVideoHeight, kTimeout);
-    // Wait for one frame so they don't get dropped because we send frames too
-    // tightly.
-    rtc::Thread::Current()->ProcessMessages(30);
-    // Remove the capturer.
-    EXPECT_TRUE(channel_->SetVideoSend(kSsrc, true, nullptr, nullptr));
-
-    // No capturer was added, so this SetVideoSend shouldn't do anything.
-    EXPECT_TRUE(channel_->SetVideoSend(kSsrc, true, nullptr, nullptr));
-    rtc::Thread::Current()->ProcessMessages(300);
-    // Verify no more frames were sent.
-    EXPECT_EQ(1, renderer_.num_rendered_frames());
-  }
-
-  // Tests that we can add and remove capturer as unique sources.
-  void AddRemoveCapturerMultipleSources() {
-    // WebRTC implementation will drop frames if pushed to quickly. Wait the
-    // interval time to avoid that.
-    // WebRTC implementation will drop frames if pushed to quickly. Wait the
-    // interval time to avoid that.
-    // Set up the stream associated with the engine.
-    EXPECT_TRUE(channel_->AddRecvStream(
-        cricket::StreamParams::CreateLegacy(kSsrc)));
-    EXPECT_TRUE(channel_->SetSink(kSsrc, &renderer_));
-    cricket::VideoFormat capture_format;  // default format
-    capture_format.interval = cricket::VideoFormat::FpsToInterval(kFramerate);
-    // Set up additional stream 1.
-    cricket::FakeVideoRenderer renderer1;
-    EXPECT_FALSE(channel_->SetSink(1, &renderer1));
-    EXPECT_TRUE(channel_->AddRecvStream(
-        cricket::StreamParams::CreateLegacy(1)));
-    EXPECT_TRUE(channel_->SetSink(1, &renderer1));
-    EXPECT_TRUE(channel_->AddSendStream(
-        cricket::StreamParams::CreateLegacy(1)));
-    std::unique_ptr<cricket::FakeVideoCapturer> capturer1(
-        CreateFakeVideoCapturer());
-    EXPECT_EQ(cricket::CS_RUNNING, capturer1->Start(capture_format));
-    // Set up additional stream 2.
-    cricket::FakeVideoRenderer renderer2;
-    EXPECT_FALSE(channel_->SetSink(2, &renderer2));
-    EXPECT_TRUE(channel_->AddRecvStream(
-        cricket::StreamParams::CreateLegacy(2)));
-    EXPECT_TRUE(channel_->SetSink(2, &renderer2));
-    EXPECT_TRUE(channel_->AddSendStream(
-        cricket::StreamParams::CreateLegacy(2)));
-    std::unique_ptr<cricket::FakeVideoCapturer> capturer2(
-        CreateFakeVideoCapturer());
-    EXPECT_EQ(cricket::CS_RUNNING, capturer2->Start(capture_format));
-    // State for all the streams.
-    EXPECT_TRUE(SetOneCodec(DefaultCodec()));
-    // A limitation in the lmi implementation requires that SetVideoSend() is
-    // called after SetOneCodec().
-    // TODO(hellner): this seems like an unnecessary constraint, fix it.
-    EXPECT_TRUE(channel_->SetVideoSend(1, true, nullptr, capturer1.get()));
-    EXPECT_TRUE(channel_->SetVideoSend(2, true, nullptr, capturer2.get()));
-    EXPECT_TRUE(SetSend(true));
-    // Test capturer associated with engine.
-    const int kTestWidth = 160;
-    const int kTestHeight = 120;
-    EXPECT_TRUE(capturer1->CaptureCustomFrame(
-        kTestWidth, kTestHeight, cricket::FOURCC_I420));
-    EXPECT_FRAME_ON_RENDERER_WAIT(
-        renderer1, 1, kTestWidth, kTestHeight, kTimeout);
-    // Capture a frame with additional capturer2, frames should be received
-    EXPECT_TRUE(capturer2->CaptureCustomFrame(
-        kTestWidth, kTestHeight, cricket::FOURCC_I420));
-    EXPECT_FRAME_ON_RENDERER_WAIT(
-        renderer2, 1, kTestWidth, kTestHeight, kTimeout);
-    // Successfully remove the capturer.
-    EXPECT_TRUE(channel_->SetVideoSend(kSsrc, true, nullptr, nullptr));
-    // The capturers must be unregistered here as it runs out of it's scope
-    // next.
-    EXPECT_TRUE(channel_->SetVideoSend(1, true, nullptr, nullptr));
-    EXPECT_TRUE(channel_->SetVideoSend(2, true, nullptr, nullptr));
-  }
-
-  // Test that multiple send streams can be created and deleted properly.
-  void MultipleSendStreams() {
-    // Remove stream added in Setup. I.e. remove stream corresponding to default
-    // channel.
-    EXPECT_TRUE(channel_->RemoveSendStream(kSsrc));
-    const unsigned int kSsrcsSize = sizeof(kSsrcs4)/sizeof(kSsrcs4[0]);
-    for (unsigned int i = 0; i < kSsrcsSize; ++i) {
-      EXPECT_TRUE(channel_->AddSendStream(
-          cricket::StreamParams::CreateLegacy(kSsrcs4[i])));
-    }
-    // Delete one of the non default channel streams, let the destructor delete
-    // the remaining ones.
-    EXPECT_TRUE(channel_->RemoveSendStream(kSsrcs4[kSsrcsSize - 1]));
-    // Stream should already be deleted.
-    EXPECT_FALSE(channel_->RemoveSendStream(kSsrcs4[kSsrcsSize - 1]));
-  }
-
-  // Two streams one channel tests.
-
-  // Tests that we can send and receive frames.
-  void TwoStreamsSendAndReceive(const cricket::VideoCodec& codec) {
-    SetUpSecondStream();
-    // Test sending and receiving on first stream.
-    SendAndReceive(codec);
-    // Test sending and receiving on second stream.
-    EXPECT_EQ_WAIT(1, renderer2_.num_rendered_frames(), kTimeout);
-    EXPECT_GT(NumRtpPackets(), 0);
-    EXPECT_EQ(1, renderer2_.num_rendered_frames());
-  }
-
-  webrtc::RtcEventLogNullImpl event_log_;
-  const std::unique_ptr<webrtc::Call> call_;
-  E engine_;
-  std::unique_ptr<cricket::FakeVideoCapturer> video_capturer_;
-  std::unique_ptr<cricket::FakeVideoCapturer> video_capturer_2_;
-  std::unique_ptr<C> channel_;
-  cricket::FakeNetworkInterface network_interface_;
-  cricket::FakeVideoRenderer renderer_;
-  cricket::VideoMediaChannel::Error media_error_;
-
-  // Used by test cases where 2 streams are run on the same channel.
-  cricket::FakeVideoRenderer renderer2_;
-};
-
-#endif  // WEBRTC_MEDIA_BASE_VIDEOENGINE_UNITTEST_H_  NOLINT
diff --git a/media/base/videosinkinterface.h b/media/base/videosinkinterface.h
deleted file mode 100644
index f8b20b0..0000000
--- a/media/base/videosinkinterface.h
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- *  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_MEDIA_BASE_VIDEOSINKINTERFACE_H_
-#define WEBRTC_MEDIA_BASE_VIDEOSINKINTERFACE_H_
-
-// TODO(nisse): Consider moving this interface (and possibly
-// VideoSourceInterface too) from media/base to common_video, to
-// reduce dependency cycles.
-namespace rtc {
-
-template <typename VideoFrameT>
-class VideoSinkInterface {
- public:
-  virtual ~VideoSinkInterface() {}
-
-  virtual void OnFrame(const VideoFrameT& frame) = 0;
-};
-
-}  // namespace rtc
-
-#endif  // WEBRTC_MEDIA_BASE_VIDEOSINKINTERFACE_H_
diff --git a/media/base/videosourcebase.cc b/media/base/videosourcebase.cc
deleted file mode 100644
index 222adc4..0000000
--- a/media/base/videosourcebase.cc
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- *  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/media/base/videosourcebase.h"
-
-#include "webrtc/rtc_base/checks.h"
-
-namespace rtc {
-
-VideoSourceBase::VideoSourceBase() {
-  thread_checker_.DetachFromThread();
-}
-
-void VideoSourceBase::AddOrUpdateSink(
-    VideoSinkInterface<webrtc::VideoFrame>* sink,
-    const VideoSinkWants& wants) {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  RTC_DCHECK(sink != nullptr);
-
-  SinkPair* sink_pair = FindSinkPair(sink);
-  if (!sink_pair) {
-    sinks_.push_back(SinkPair(sink, wants));
-  } else {
-    sink_pair->wants = wants;
-  }
-}
-
-void VideoSourceBase::RemoveSink(VideoSinkInterface<webrtc::VideoFrame>* sink) {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  RTC_DCHECK(sink != nullptr);
-  RTC_DCHECK(FindSinkPair(sink));
-  sinks_.erase(std::remove_if(sinks_.begin(), sinks_.end(),
-                              [sink](const SinkPair& sink_pair) {
-                                return sink_pair.sink == sink;
-                              }),
-               sinks_.end());
-}
-
-VideoSourceBase::SinkPair* VideoSourceBase::FindSinkPair(
-    const VideoSinkInterface<webrtc::VideoFrame>* sink) {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  auto sink_pair_it = std::find_if(
-      sinks_.begin(), sinks_.end(),
-      [sink](const SinkPair& sink_pair) { return sink_pair.sink == sink; });
-  if (sink_pair_it != sinks_.end()) {
-    return &*sink_pair_it;
-  }
-  return nullptr;
-}
-
-}  // namespace rtc
diff --git a/media/base/videosourcebase.h b/media/base/videosourcebase.h
deleted file mode 100644
index c83abb5..0000000
--- a/media/base/videosourcebase.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- *  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_MEDIA_BASE_VIDEOSOURCEBASE_H_
-#define WEBRTC_MEDIA_BASE_VIDEOSOURCEBASE_H_
-
-#include <vector>
-
-#include "webrtc/api/video/video_frame.h"
-#include "webrtc/media/base/videosourceinterface.h"
-#include "webrtc/rtc_base/thread_checker.h"
-
-namespace rtc {
-
-// VideoSourceBase is not thread safe.
-class VideoSourceBase : public VideoSourceInterface<webrtc::VideoFrame> {
- public:
-  VideoSourceBase();
-  void AddOrUpdateSink(VideoSinkInterface<webrtc::VideoFrame>* sink,
-                       const VideoSinkWants& wants) override;
-  void RemoveSink(VideoSinkInterface<webrtc::VideoFrame>* sink) override;
-
- protected:
-  struct SinkPair {
-    SinkPair(VideoSinkInterface<webrtc::VideoFrame>* sink, VideoSinkWants wants)
-        : sink(sink), wants(wants) {}
-    VideoSinkInterface<webrtc::VideoFrame>* sink;
-    VideoSinkWants wants;
-  };
-  SinkPair* FindSinkPair(const VideoSinkInterface<webrtc::VideoFrame>* sink);
-
-  const std::vector<SinkPair>& sink_pairs() const { return sinks_; }
-  ThreadChecker thread_checker_;
-
- private:
-  std::vector<SinkPair> sinks_;
-};
-
-}  // namespace rtc
-
-#endif  // WEBRTC_MEDIA_BASE_VIDEOSOURCEBASE_H_
diff --git a/media/base/videosourceinterface.cc b/media/base/videosourceinterface.cc
deleted file mode 100644
index 2c69da3..0000000
--- a/media/base/videosourceinterface.cc
+++ /dev/null
@@ -1,17 +0,0 @@
-/*
- *  Copyright (c) 2017 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/media/base/videosourceinterface.h"
-namespace rtc {
-
-VideoSinkWants::VideoSinkWants() = default;
-VideoSinkWants::~VideoSinkWants() = default;
-
-}  // namespace rtc
diff --git a/media/base/videosourceinterface.h b/media/base/videosourceinterface.h
deleted file mode 100644
index 551a6ea..0000000
--- a/media/base/videosourceinterface.h
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- *  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_MEDIA_BASE_VIDEOSOURCEINTERFACE_H_
-#define WEBRTC_MEDIA_BASE_VIDEOSOURCEINTERFACE_H_
-
-#include "webrtc/api/optional.h"
-#include "webrtc/media/base/videosinkinterface.h"
-
-namespace rtc {
-
-// VideoSinkWants is used for notifying the source of properties a video frame
-// should have when it is delivered to a certain sink.
-struct VideoSinkWants {
-  VideoSinkWants();
-  ~VideoSinkWants();
-  // Tells the source whether the sink wants frames with rotation applied.
-  // By default, any rotation must be applied by the sink.
-  bool rotation_applied = false;
-
-  // Tells the source that the sink only wants black frames.
-  bool black_frames = false;
-
-  // Tells the source the maximum number of pixels the sink wants.
-  int max_pixel_count = std::numeric_limits<int>::max();
-  // Tells the source the desired number of pixels the sinks wants. This will
-  // typically be used when stepping the resolution up again when conditions
-  // have improved after an earlier downgrade. The source should select the
-  // closest resolution to this pixel count, but if max_pixel_count is set, it
-  // still sets the absolute upper bound.
-  rtc::Optional<int> target_pixel_count;
-  // Tells the source the maximum framerate the sink wants.
-  int max_framerate_fps = std::numeric_limits<int>::max();
-};
-
-template <typename VideoFrameT>
-class VideoSourceInterface {
- public:
-  virtual void AddOrUpdateSink(VideoSinkInterface<VideoFrameT>* sink,
-                               const VideoSinkWants& wants) = 0;
-  // RemoveSink must guarantee that at the time the method returns,
-  // there is no current and no future calls to VideoSinkInterface::OnFrame.
-  virtual void RemoveSink(VideoSinkInterface<VideoFrameT>* sink) = 0;
-
- protected:
-  virtual ~VideoSourceInterface() {}
-};
-
-}  // namespace rtc
-#endif  // WEBRTC_MEDIA_BASE_VIDEOSOURCEINTERFACE_H_
diff --git a/media/engine/adm_helpers.cc b/media/engine/adm_helpers.cc
deleted file mode 100644
index 7902889..0000000
--- a/media/engine/adm_helpers.cc
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- *  Copyright (c) 2017 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/media/engine/adm_helpers.h"
-
-#include "webrtc/modules/audio_device/include/audio_device.h"
-#include "webrtc/rtc_base/logging.h"
-
-namespace webrtc {
-namespace adm_helpers {
-
-// On Windows Vista and newer, Microsoft introduced the concept of "Default
-// Communications Device". This means that there are two types of default
-// devices (old Wave Audio style default and Default Communications Device).
-//
-// On Windows systems which only support Wave Audio style default, uses either
-// -1 or 0 to select the default device.
-//
-// Using a #define for AUDIO_DEVICE since we will call *different* versions of
-// the ADM functions, depending on the ID type.
-#if defined(WEBRTC_WIN)
-#define AUDIO_DEVICE_ID \
-    (AudioDeviceModule::WindowsDeviceType::kDefaultCommunicationDevice)
-#else
-#define AUDIO_DEVICE_ID (0u)
-#endif  // defined(WEBRTC_WIN)
-
-void SetRecordingDevice(AudioDeviceModule* adm) {
-  RTC_DCHECK(adm);
-
-  // Save recording status and stop recording.
-  const bool was_recording = adm->Recording();
-  if (was_recording && adm->StopRecording() != 0) {
-    LOG(LS_ERROR) << "Unable to stop recording.";
-    return;
-  }
-
-  // Set device and stereo mode.
-  if (adm->SetRecordingChannel(AudioDeviceModule::kChannelBoth) != 0) {
-    LOG(LS_ERROR) << "Unable to set recording channel to kChannelBoth.";
-  }
-  if (adm->SetRecordingDevice(AUDIO_DEVICE_ID) != 0) {
-    LOG(LS_ERROR) << "Unable to set recording device.";
-    return;
-  }
-
-  // Init microphone, so user can do volume settings etc.
-  if (adm->InitMicrophone() != 0) {
-    LOG(LS_ERROR) << "Unable to access microphone.";
-  }
-
-  // Set number of channels
-  bool available = false;
-  if (adm->StereoRecordingIsAvailable(&available) != 0) {
-    LOG(LS_ERROR) << "Failed to query stereo recording.";
-  }
-  if (adm->SetStereoRecording(available) != 0) {
-    LOG(LS_ERROR) << "Failed to set stereo recording mode.";
-  }
-
-  // Restore recording if it was enabled already when calling this function.
-  if (was_recording) {
-    if (adm->InitRecording() != 0) {
-      LOG(LS_ERROR) << "Failed to initialize recording.";
-      return;
-    }
-    if (adm->StartRecording() != 0) {
-      LOG(LS_ERROR) << "Failed to start recording.";
-      return;
-    }
-  }
-
-  LOG(LS_INFO) << "Set recording device.";
-}
-
-void SetPlayoutDevice(AudioDeviceModule* adm) {
-  RTC_DCHECK(adm);
-
-  // Save playing status and stop playout.
-  const bool was_playing = adm->Playing();
-  if (was_playing && adm->StopPlayout() != 0) {
-    LOG(LS_ERROR) << "Unable to stop playout.";
-  }
-
-  // Set device.
-  if (adm->SetPlayoutDevice(AUDIO_DEVICE_ID) != 0) {
-    LOG(LS_ERROR) << "Unable to set playout device.";
-    return;
-  }
-
-  // Init speaker, so user can do volume settings etc.
-  if (adm->InitSpeaker() != 0) {
-    LOG(LS_ERROR) << "Unable to access speaker.";
-  }
-
-  // Set number of channels
-  bool available = false;
-  if (adm->StereoPlayoutIsAvailable(&available) != 0) {
-    LOG(LS_ERROR) << "Failed to query stereo playout.";
-  }
-  if (adm->SetStereoPlayout(available) != 0) {
-    LOG(LS_ERROR) << "Failed to set stereo playout mode.";
-  }
-
-  // Restore recording if it was enabled already when calling this function.
-  if (was_playing) {
-    if (adm->InitPlayout() != 0) {
-      LOG(LS_ERROR) << "Failed to initialize playout.";
-      return;
-    }
-    if (adm->StartPlayout() != 0) {
-      LOG(LS_ERROR) << "Failed to start playout.";
-      return;
-    }
-  }
-
-  LOG(LS_INFO) << "Set playout device.";
-}
-
-}  // namespace adm_helpers
-}  // namespace webrtc
diff --git a/media/engine/adm_helpers.h b/media/engine/adm_helpers.h
deleted file mode 100644
index 1a3eb45..0000000
--- a/media/engine/adm_helpers.h
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- *  Copyright (c) 2017 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_MEDIA_ENGINE_ADM_HELPERS_H_
-#define WEBRTC_MEDIA_ENGINE_ADM_HELPERS_H_
-
-#include "webrtc/common_types.h"
-
-namespace webrtc {
-
-class AudioDeviceModule;
-
-namespace adm_helpers {
-
-void SetRecordingDevice(AudioDeviceModule* adm);
-void SetPlayoutDevice(AudioDeviceModule* adm);
-
-}  // namespace adm_helpers
-}  // namespace webrtc
-
-#endif  // WEBRTC_MEDIA_ENGINE_ADM_HELPERS_H_
diff --git a/media/engine/apm_helpers.cc b/media/engine/apm_helpers.cc
deleted file mode 100644
index 784b47c..0000000
--- a/media/engine/apm_helpers.cc
+++ /dev/null
@@ -1,170 +0,0 @@
-/*
- *  Copyright (c) 2017 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/media/engine/apm_helpers.h"
-
-#include "webrtc/modules/audio_device/include/audio_device.h"
-#include "webrtc/modules/audio_processing/include/audio_processing.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/voice_engine/transmit_mixer.h"
-
-namespace webrtc {
-namespace apm_helpers {
-
-AgcConfig GetAgcConfig(AudioProcessing* apm) {
-  RTC_DCHECK(apm);
-  AgcConfig result;
-  result.targetLeveldBOv = apm->gain_control()->target_level_dbfs();
-  result.digitalCompressionGaindB = apm->gain_control()->compression_gain_db();
-  result.limiterEnable = apm->gain_control()->is_limiter_enabled();
-  return result;
-}
-
-void SetAgcConfig(AudioProcessing* apm,
-                  const AgcConfig& config) {
-  RTC_DCHECK(apm);
-  GainControl* gc = apm->gain_control();
-  if (gc->set_target_level_dbfs(config.targetLeveldBOv) != 0) {
-    LOG(LS_ERROR) << "Failed to set target level: " << config.targetLeveldBOv;
-  }
-  if (gc->set_compression_gain_db(config.digitalCompressionGaindB) != 0) {
-    LOG(LS_ERROR) << "Failed to set compression gain: "
-                  << config.digitalCompressionGaindB;
-  }
-  if (gc->enable_limiter(config.limiterEnable) != 0) {
-    LOG(LS_ERROR) << "Failed to set limiter on/off: " << config.limiterEnable;
-  }
-}
-
-void SetAgcStatus(AudioProcessing* apm,
-                  AudioDeviceModule* adm,
-                  bool enable) {
-  RTC_DCHECK(apm);
-  RTC_DCHECK(adm);
-#if defined(WEBRTC_IOS) || defined(WEBRTC_ANDROID)
-  GainControl::Mode agc_mode = GainControl::kFixedDigital;
-#else
-  GainControl::Mode agc_mode = GainControl::kAdaptiveAnalog;
-#endif
-  GainControl* gc = apm->gain_control();
-  if (gc->set_mode(agc_mode) != 0) {
-    LOG(LS_ERROR) << "Failed to set AGC mode: " << agc_mode;
-    return;
-  }
-  if (gc->Enable(enable) != 0) {
-    LOG(LS_ERROR) << "Failed to enable/disable AGC: " << enable;
-    return;
-  }
-  // Set AGC state in the ADM when adaptive AGC mode has been selected.
-  if (adm->SetAGC(enable && agc_mode == GainControl::kAdaptiveAnalog) != 0) {
-    LOG(LS_ERROR) << "Failed to set AGC mode in ADM: " << enable;
-    return;
-  }
-  LOG(LS_INFO) << "AGC set to " << enable << " with mode " << agc_mode;
-}
-
-void SetEcStatus(AudioProcessing* apm,
-                 bool enable,
-                 EcModes mode) {
-  RTC_DCHECK(apm);
-  RTC_DCHECK(mode == kEcConference || mode == kEcAecm) << "mode: " << mode;
-  EchoCancellation* ec = apm->echo_cancellation();
-  EchoControlMobile* ecm = apm->echo_control_mobile();
-  if (mode == kEcConference) {
-    // Disable the AECM before enabling the AEC.
-    if (enable && ecm->is_enabled() && ecm->Enable(false) != 0) {
-      LOG(LS_ERROR) << "Failed to disable AECM.";
-      return;
-    }
-    if (ec->Enable(enable) != 0) {
-      LOG(LS_ERROR) << "Failed to enable/disable AEC: " << enable;
-      return;
-    }
-    if (ec->set_suppression_level(EchoCancellation::kHighSuppression)
-        != 0) {
-      LOG(LS_ERROR) << "Failed to set high AEC aggressiveness.";
-      return;
-    }
-  } else {
-    // Disable the AEC before enabling the AECM.
-    if (enable && ec->is_enabled() && ec->Enable(false) != 0) {
-      LOG(LS_ERROR) << "Failed to disable AEC.";
-      return;
-    }
-    if (ecm->Enable(enable) != 0) {
-      LOG(LS_ERROR) << "Failed to enable/disable AECM: " << enable;
-      return;
-    }
-  }
-  LOG(LS_INFO) << "Echo control set to " << enable << " with mode " << mode;
-}
-
-void SetEcMetricsStatus(AudioProcessing* apm, bool enable) {
-  RTC_DCHECK(apm);
-  if ((apm->echo_cancellation()->enable_metrics(enable) != 0) ||
-      (apm->echo_cancellation()->enable_delay_logging(enable) != 0)) {
-    LOG(LS_ERROR) << "Failed to enable/disable EC metrics: " << enable;
-    return;
-  }
-  LOG(LS_INFO) << "EC metrics set to " << enable;
-}
-
-void SetAecmMode(AudioProcessing* apm, bool enable) {
-  RTC_DCHECK(apm);
-  EchoControlMobile* ecm = apm->echo_control_mobile();
-  RTC_DCHECK_EQ(EchoControlMobile::kSpeakerphone, ecm->routing_mode());
-  if (ecm->enable_comfort_noise(enable) != 0) {
-    LOG(LS_ERROR) << "Failed to enable/disable CNG: " << enable;
-    return;
-  }
-  LOG(LS_INFO) << "CNG set to " << enable;
-}
-
-void SetNsStatus(AudioProcessing* apm, bool enable) {
-  RTC_DCHECK(apm);
-  NoiseSuppression* ns = apm->noise_suppression();
-  if (ns->set_level(NoiseSuppression::kHigh) != 0) {
-    LOG(LS_ERROR) << "Failed to set high NS level.";
-    return;
-  }
-  if (ns->Enable(enable) != 0) {
-    LOG(LS_ERROR) << "Failed to enable/disable NS: " << enable;
-    return;
-  }
-  LOG(LS_INFO) << "NS set to " << enable;
-}
-
-void SetTypingDetectionStatus(AudioProcessing* apm, bool enable) {
-  RTC_DCHECK(apm);
-#if WEBRTC_VOICE_ENGINE_TYPING_DETECTION
-  // Typing detection takes place in TransmitMixer::PrepareDemux() and
-  // TransmitMixer::TypingDetection(). The typing detection algorithm takes as
-  // input two booleans:
-  //   1. A signal whether a key was pressed during the audio frame.
-  //   2. Whether VAD is active or not.
-  // TransmitMixer will not even call the detector if APM has set kVadUnknown in
-  // the audio frame after near end processing, so enabling/disabling VAD is
-  // sufficient for turning typing detection on/off.
-  // TODO(solenberg): Rather than relying on a side effect, consider forcing the
-  //                  feature on/off in TransmitMixer.
-  VoiceDetection* vd = apm->voice_detection();
-  if (vd->Enable(enable)) {
-    LOG(LS_ERROR) << "Failed to enable/disable VAD: " << enable;
-    return;
-  }
-  if (vd->set_likelihood(VoiceDetection::kVeryLowLikelihood)) {
-    LOG(LS_ERROR) << "Failed to set low VAD likelihood.";
-    return;
-  }
-  LOG(LS_INFO) << "VAD set to " << enable << " for typing detection.";
-#endif
-}
-}  // namespace apm_helpers
-}  // namespace webrtc
diff --git a/media/engine/apm_helpers.h b/media/engine/apm_helpers.h
deleted file mode 100644
index eff7133..0000000
--- a/media/engine/apm_helpers.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- *  Copyright (c) 2017 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_MEDIA_ENGINE_APM_HELPERS_H_
-#define WEBRTC_MEDIA_ENGINE_APM_HELPERS_H_
-
-namespace webrtc {
-
-class AudioProcessing;
-class AudioDeviceModule;
-
-enum EcModes {
-  kEcConference,     // Conferencing default (aggressive AEC).
-  kEcAecm,           // AEC mobile.
-};
-
-struct AgcConfig {
-  unsigned short targetLeveldBOv;
-  unsigned short digitalCompressionGaindB;
-  bool limiterEnable;
-};
-
-namespace apm_helpers {
-
-AgcConfig GetAgcConfig(AudioProcessing* apm);
-void SetAgcConfig(AudioProcessing* apm,
-                  const AgcConfig& config);
-void SetAgcStatus(AudioProcessing* apm,
-                  AudioDeviceModule* adm,
-                  bool enable);
-void SetEcStatus(AudioProcessing* apm,
-                 bool enable,
-                 EcModes mode);
-void SetEcMetricsStatus(AudioProcessing* apm, bool enable);
-void SetAecmMode(AudioProcessing* apm, bool enable_cng);
-void SetNsStatus(AudioProcessing* apm, bool enable);
-void SetTypingDetectionStatus(AudioProcessing* apm, bool enable);
-
-}  // namespace apm_helpers
-}  // namespace webrtc
-
-#endif  // WEBRTC_MEDIA_ENGINE_APM_HELPERS_H_
diff --git a/media/engine/apm_helpers_unittest.cc b/media/engine/apm_helpers_unittest.cc
deleted file mode 100644
index a869903..0000000
--- a/media/engine/apm_helpers_unittest.cc
+++ /dev/null
@@ -1,291 +0,0 @@
-/*
- *  Copyright (c) 2017 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/media/engine/apm_helpers.h"
-
-#include "webrtc/media/engine/webrtcvoe.h"
-#include "webrtc/modules/audio_device/include/mock_audio_device.h"
-#include "webrtc/modules/audio_processing/include/audio_processing.h"
-#include "webrtc/test/gmock.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/mock_audio_decoder_factory.h"
-#include "webrtc/voice_engine/transmit_mixer.h"
-
-namespace webrtc {
-namespace {
-
-constexpr AgcConfig kDefaultAgcConfig = { 3, 9, true };
-
-struct TestHelper {
-  TestHelper() {
-    // Reply with a 10ms timer every time TimeUntilNextProcess is called to
-    // avoid entering a tight loop on the process thread.
-    EXPECT_CALL(mock_audio_device_, TimeUntilNextProcess())
-        .WillRepeatedly(testing::Return(10));
-
-    // This replicates the conditions from voe_auto_test.
-    Config config;
-    config.Set<ExperimentalAgc>(new ExperimentalAgc(false));
-    apm_ = rtc::scoped_refptr<AudioProcessing>(AudioProcessing::Create(config));
-    EXPECT_EQ(0, voe_wrapper_.base()->Init(
-                     &mock_audio_device_, apm_,
-                     MockAudioDecoderFactory::CreateEmptyFactory()));
-  }
-
-  AudioProcessing* apm() { return apm_.get(); }
-
-  const AudioProcessing* apm() const { return apm_.get(); }
-
-  test::MockAudioDeviceModule* adm() {
-    return &mock_audio_device_;
-  }
-
-  voe::TransmitMixer* transmit_mixer() {
-    return voe_wrapper_.base()->transmit_mixer();
-  }
-
-  bool GetEcMetricsStatus() const {
-    EchoCancellation* ec = apm()->echo_cancellation();
-    bool metrics_enabled = ec->are_metrics_enabled();
-    EXPECT_EQ(metrics_enabled, ec->is_delay_logging_enabled());
-    return metrics_enabled;
-  }
-
-  bool CanGetEcMetrics() const {
-    EchoCancellation* ec = apm()->echo_cancellation();
-    EchoCancellation::Metrics metrics;
-    int metrics_result = ec->GetMetrics(&metrics);
-    int median = 0;
-    int std = 0;
-    float fraction = 0;
-    int delay_metrics_result = ec->GetDelayMetrics(&median, &std, &fraction);
-    return metrics_result == AudioProcessing::kNoError &&
-           delay_metrics_result == AudioProcessing::kNoError;
-  }
-
- private:
-  testing::NiceMock<test::MockAudioDeviceModule> mock_audio_device_;
-  cricket::VoEWrapper voe_wrapper_;
-  rtc::scoped_refptr<AudioProcessing> apm_;
-};
-}  // namespace
-
-TEST(ApmHelpersTest, AgcConfig_DefaultConfiguration) {
-  TestHelper helper;
-  AgcConfig agc_config =
-      apm_helpers::GetAgcConfig(helper.apm());
-
-  EXPECT_EQ(kDefaultAgcConfig.targetLeveldBOv, agc_config.targetLeveldBOv);
-  EXPECT_EQ(kDefaultAgcConfig.digitalCompressionGaindB,
-            agc_config.digitalCompressionGaindB);
-  EXPECT_EQ(kDefaultAgcConfig.limiterEnable, agc_config.limiterEnable);
-}
-
-TEST(ApmHelpersTest, AgcConfig_GetAndSet) {
-  const AgcConfig agc_config = { 11, 17, false };
-
-  TestHelper helper;
-  apm_helpers::SetAgcConfig(helper.apm(), agc_config);
-  AgcConfig actual_config =
-      apm_helpers::GetAgcConfig(helper.apm());
-
-  EXPECT_EQ(agc_config.digitalCompressionGaindB,
-            actual_config.digitalCompressionGaindB);
-  EXPECT_EQ(agc_config.limiterEnable,
-            actual_config.limiterEnable);
-  EXPECT_EQ(agc_config.targetLeveldBOv,
-            actual_config.targetLeveldBOv);
-}
-
-TEST(ApmHelpersTest, AgcStatus_DefaultMode) {
-  TestHelper helper;
-  GainControl* gc = helper.apm()->gain_control();
-#if defined(TARGET_IPHONE_SIMULATOR) && TARGET_IPHONE_SIMULATOR
-  EXPECT_FALSE(gc->is_enabled());
-  EXPECT_EQ(GainControl::kAdaptiveDigital, gc->mode());
-#elif defined(WEBRTC_IOS) || defined(WEBRTC_ANDROID)
-  EXPECT_FALSE(gc->is_enabled());
-  EXPECT_EQ(GainControl::kFixedDigital, gc->mode());
-#else
-  EXPECT_TRUE(gc->is_enabled());
-  EXPECT_EQ(GainControl::kAdaptiveAnalog, gc->mode());
-#endif
-}
-
-TEST(ApmHelpersTest, AgcStatus_EnableDisable) {
-  TestHelper helper;
-  GainControl* gc = helper.apm()->gain_control();
-#if defined(WEBRTC_IOS) || defined(WEBRTC_ANDROID)
-  apm_helpers::SetAgcStatus(helper.apm(), helper.adm(), false);
-  EXPECT_FALSE(gc->is_enabled());
-  EXPECT_EQ(GainControl::kFixedDigital, gc->mode());
-
-  apm_helpers::SetAgcStatus(helper.apm(), helper.adm(), true);
-  EXPECT_TRUE(gc->is_enabled());
-  EXPECT_EQ(GainControl::kFixedDigital, gc->mode());
-#else
-  EXPECT_CALL(*helper.adm(), SetAGC(false)).WillOnce(testing::Return(0));
-  apm_helpers::SetAgcStatus(helper.apm(), helper.adm(), false);
-  EXPECT_FALSE(gc->is_enabled());
-  EXPECT_EQ(GainControl::kAdaptiveAnalog, gc->mode());
-
-  EXPECT_CALL(*helper.adm(), SetAGC(true)).WillOnce(testing::Return(0));
-  apm_helpers::SetAgcStatus(helper.apm(), helper.adm(), true);
-  EXPECT_TRUE(gc->is_enabled());
-  EXPECT_EQ(GainControl::kAdaptiveAnalog, gc->mode());
-#endif
-}
-
-TEST(ApmHelpersTest, EcStatus_DefaultMode) {
-  TestHelper helper;
-  EchoCancellation* ec = helper.apm()->echo_cancellation();
-  EchoControlMobile* ecm = helper.apm()->echo_control_mobile();
-  EXPECT_FALSE(ec->is_enabled());
-  EXPECT_FALSE(ecm->is_enabled());
-}
-
-TEST(ApmHelpersTest, EcStatus_EnableDisable) {
-  TestHelper helper;
-  EchoCancellation* ec = helper.apm()->echo_cancellation();
-  EchoControlMobile* ecm = helper.apm()->echo_control_mobile();
-
-  apm_helpers::SetEcStatus(helper.apm(), true, kEcAecm);
-  EXPECT_FALSE(ec->is_enabled());
-  EXPECT_TRUE(ecm->is_enabled());
-
-  apm_helpers::SetEcStatus(helper.apm(), false, kEcAecm);
-  EXPECT_FALSE(ec->is_enabled());
-  EXPECT_FALSE(ecm->is_enabled());
-
-  apm_helpers::SetEcStatus(helper.apm(), true, kEcConference);
-  EXPECT_TRUE(ec->is_enabled());
-  EXPECT_FALSE(ecm->is_enabled());
-  EXPECT_EQ(EchoCancellation::kHighSuppression, ec->suppression_level());
-
-  apm_helpers::SetEcStatus(helper.apm(), false, kEcConference);
-  EXPECT_FALSE(ec->is_enabled());
-  EXPECT_FALSE(ecm->is_enabled());
-  EXPECT_EQ(EchoCancellation::kHighSuppression, ec->suppression_level());
-
-  apm_helpers::SetEcStatus(helper.apm(), true, kEcAecm);
-  EXPECT_FALSE(ec->is_enabled());
-  EXPECT_TRUE(ecm->is_enabled());
-}
-
-TEST(ApmHelpersTest, EcMetrics_DefaultMode) {
-  TestHelper helper;
-  apm_helpers::SetEcStatus(helper.apm(), true, kEcConference);
-  EXPECT_TRUE(helper.GetEcMetricsStatus());
-}
-
-TEST(ApmHelpersTest, EcMetrics_CanEnableDisable) {
-  TestHelper helper;
-  apm_helpers::SetEcStatus(helper.apm(), true, kEcConference);
-
-  apm_helpers::SetEcMetricsStatus(helper.apm(), true);
-  EXPECT_TRUE(helper.GetEcMetricsStatus());
-  apm_helpers::SetEcMetricsStatus(helper.apm(), false);
-  EXPECT_FALSE(helper.GetEcMetricsStatus());
-}
-
-TEST(ApmHelpersTest, EcMetrics_NoStatsUnlessEcMetricsAndEcEnabled) {
-  TestHelper helper;
-  EXPECT_FALSE(helper.CanGetEcMetrics());
-
-  apm_helpers::SetEcMetricsStatus(helper.apm(), true);
-  EXPECT_FALSE(helper.CanGetEcMetrics());
-
-  apm_helpers::SetEcStatus(helper.apm(), true, kEcConference);
-  EXPECT_TRUE(helper.CanGetEcMetrics());
-
-  apm_helpers::SetEcMetricsStatus(helper.apm(), false);
-  EXPECT_FALSE(helper.CanGetEcMetrics());
-}
-
-TEST(ApmHelpersTest, AecmMode_DefaultMode) {
-  TestHelper helper;
-  EchoControlMobile* ecm = helper.apm()->echo_control_mobile();
-  EXPECT_EQ(EchoControlMobile::kSpeakerphone, ecm->routing_mode());
-  EXPECT_TRUE(ecm->is_comfort_noise_enabled());
-}
-
-TEST(ApmHelpersTest, AecmMode_EnableDisableCng) {
-  TestHelper helper;
-  EchoControlMobile* ecm = helper.apm()->echo_control_mobile();
-  apm_helpers::SetAecmMode(helper.apm(), false);
-  EXPECT_FALSE(ecm->is_comfort_noise_enabled());
-  apm_helpers::SetAecmMode(helper.apm(), true);
-  EXPECT_TRUE(ecm->is_comfort_noise_enabled());
-}
-
-TEST(ApmHelpersTest, NsStatus_DefaultMode) {
-  TestHelper helper;
-  NoiseSuppression* ns = helper.apm()->noise_suppression();
-  EXPECT_EQ(NoiseSuppression::kModerate, ns->level());
-  EXPECT_FALSE(ns->is_enabled());
-}
-
-TEST(ApmHelpersTest, NsStatus_EnableDisable) {
-  TestHelper helper;
-  NoiseSuppression* ns = helper.apm()->noise_suppression();
-  apm_helpers::SetNsStatus(helper.apm(), true);
-  EXPECT_EQ(NoiseSuppression::kHigh, ns->level());
-  EXPECT_TRUE(ns->is_enabled());
-  apm_helpers::SetNsStatus(helper.apm(), false);
-  EXPECT_EQ(NoiseSuppression::kHigh, ns->level());
-  EXPECT_FALSE(ns->is_enabled());
-}
-
-TEST(ApmHelpersTest, TypingDetectionStatus_DefaultMode) {
-  TestHelper helper;
-  VoiceDetection* vd = helper.apm()->voice_detection();
-  EXPECT_FALSE(vd->is_enabled());
-}
-
-// TODO(kthelgason): Reenable this test on simulator.
-// See bugs.webrtc.org/5569
-#if defined(TARGET_IPHONE_SIMULATOR) && TARGET_IPHONE_SIMULATOR
-#define MAYBE_TypingDetectionStatus_EnableDisable DISABLED_TypingDetectionStatus_EnableDisable
-#else
-#define MAYBE_TypingDetectionStatus_EnableDisable TypingDetectionStatus_EnableDisable
-#endif
-TEST(ApmHelpersTest, MAYBE_TypingDetectionStatus_EnableDisable) {
-  TestHelper helper;
-  VoiceDetection* vd = helper.apm()->voice_detection();
-  apm_helpers::SetTypingDetectionStatus(helper.apm(), true);
-  EXPECT_TRUE(vd->is_enabled());
-  apm_helpers::SetTypingDetectionStatus(helper.apm(), false);
-  EXPECT_FALSE(vd->is_enabled());
-}
-
-// TODO(solenberg): Move this test to a better place - added here for the sake
-// of duplicating all relevant tests from audio_processing_test.cc.
-TEST(ApmHelpersTest, HighPassFilter_DefaultMode) {
-  TestHelper helper;
-  EXPECT_TRUE(helper.apm()->high_pass_filter()->is_enabled());
-}
-
-// TODO(solenberg): Move this test to a better place - added here for the sake
-// of duplicating all relevant tests from audio_processing_test.cc.
-TEST(ApmHelpersTest, StereoSwapping_DefaultMode) {
-  TestHelper helper;
-  EXPECT_FALSE(helper.transmit_mixer()->IsStereoChannelSwappingEnabled());
-}
-
-// TODO(solenberg): Move this test to a better place - added here for the sake
-// of duplicating all relevant tests from audio_processing_test.cc.
-TEST(ApmHelpersTest, StereoSwapping_EnableDisable) {
-  TestHelper helper;
-  helper.transmit_mixer()->EnableStereoChannelSwapping(true);
-  EXPECT_TRUE(helper.transmit_mixer()->IsStereoChannelSwappingEnabled());
-  helper.transmit_mixer()->EnableStereoChannelSwapping(false);
-  EXPECT_FALSE(helper.transmit_mixer()->IsStereoChannelSwappingEnabled());
-}
-}  // namespace webrtc
diff --git a/media/engine/constants.h b/media/engine/constants.h
deleted file mode 100644
index 19d06a1..0000000
--- a/media/engine/constants.h
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- *  Copyright (c) 2014 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_MEDIA_ENGINE_CONSTANTS_H_
-#define WEBRTC_MEDIA_ENGINE_CONSTANTS_H_
-
-namespace cricket {
-
-extern const int kVideoMtu;
-extern const int kVideoRtpBufferSize;
-
-extern const char kH264CodecName[];
-
-extern const int kMinVideoBitrateKbps;
-
-}  // namespace cricket
-
-#endif  // WEBRTC_MEDIA_ENGINE_CONSTANTS_H_
diff --git a/media/engine/fakewebrtccall.cc b/media/engine/fakewebrtccall.cc
deleted file mode 100644
index 8081819..0000000
--- a/media/engine/fakewebrtccall.cc
+++ /dev/null
@@ -1,637 +0,0 @@
-/*
- *  Copyright (c) 2015 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/media/engine/fakewebrtccall.h"
-
-#include <algorithm>
-#include <utility>
-
-#include "webrtc/api/call/audio_sink.h"
-#include "webrtc/media/base/rtputils.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/gunit.h"
-#include "webrtc/rtc_base/platform_file.h"
-
-namespace cricket {
-FakeAudioSendStream::FakeAudioSendStream(
-    int id, const webrtc::AudioSendStream::Config& config)
-    : id_(id), config_(config) {
-  RTC_DCHECK(config.voe_channel_id != -1);
-}
-
-void FakeAudioSendStream::Reconfigure(
-    const webrtc::AudioSendStream::Config& config) {
-  config_ = config;
-}
-
-const webrtc::AudioSendStream::Config&
-    FakeAudioSendStream::GetConfig() const {
-  return config_;
-}
-
-void FakeAudioSendStream::SetStats(
-    const webrtc::AudioSendStream::Stats& stats) {
-  stats_ = stats;
-}
-
-FakeAudioSendStream::TelephoneEvent
-    FakeAudioSendStream::GetLatestTelephoneEvent() const {
-  return latest_telephone_event_;
-}
-
-bool FakeAudioSendStream::SendTelephoneEvent(int payload_type,
-                                             int payload_frequency, int event,
-                                             int duration_ms) {
-  latest_telephone_event_.payload_type = payload_type;
-  latest_telephone_event_.payload_frequency = payload_frequency;
-  latest_telephone_event_.event_code = event;
-  latest_telephone_event_.duration_ms = duration_ms;
-  return true;
-}
-
-void FakeAudioSendStream::SetMuted(bool muted) {
-  muted_ = muted;
-}
-
-webrtc::AudioSendStream::Stats FakeAudioSendStream::GetStats() const {
-  return stats_;
-}
-
-FakeAudioReceiveStream::FakeAudioReceiveStream(
-    int id, const webrtc::AudioReceiveStream::Config& config)
-    : id_(id), config_(config) {
-  RTC_DCHECK(config.voe_channel_id != -1);
-}
-
-const webrtc::AudioReceiveStream::Config&
-    FakeAudioReceiveStream::GetConfig() const {
-  return config_;
-}
-
-void FakeAudioReceiveStream::SetStats(
-    const webrtc::AudioReceiveStream::Stats& stats) {
-  stats_ = stats;
-}
-
-bool FakeAudioReceiveStream::VerifyLastPacket(const uint8_t* data,
-                                              size_t length) const {
-  return last_packet_ == rtc::Buffer(data, length);
-}
-
-bool FakeAudioReceiveStream::DeliverRtp(const uint8_t* packet,
-                                        size_t length,
-                                        const webrtc::PacketTime& packet_time) {
-  ++received_packets_;
-  last_packet_.SetData(packet, length);
-  return true;
-}
-
-webrtc::AudioReceiveStream::Stats FakeAudioReceiveStream::GetStats() const {
-  return stats_;
-}
-
-void FakeAudioReceiveStream::SetSink(
-    std::unique_ptr<webrtc::AudioSinkInterface> sink) {
-  sink_ = std::move(sink);
-}
-
-void FakeAudioReceiveStream::SetGain(float gain) {
-  gain_ = gain;
-}
-
-FakeVideoSendStream::FakeVideoSendStream(
-    webrtc::VideoSendStream::Config config,
-    webrtc::VideoEncoderConfig encoder_config)
-    : sending_(false),
-      config_(std::move(config)),
-      codec_settings_set_(false),
-      resolution_scaling_enabled_(false),
-      framerate_scaling_enabled_(false),
-      source_(nullptr),
-      num_swapped_frames_(0) {
-  RTC_DCHECK(config.encoder_settings.encoder != NULL);
-  ReconfigureVideoEncoder(std::move(encoder_config));
-}
-
-FakeVideoSendStream::~FakeVideoSendStream() {
-  if (source_)
-    source_->RemoveSink(this);
-}
-
-const webrtc::VideoSendStream::Config& FakeVideoSendStream::GetConfig() const {
-  return config_;
-}
-
-const webrtc::VideoEncoderConfig& FakeVideoSendStream::GetEncoderConfig()
-    const {
-  return encoder_config_;
-}
-
-const std::vector<webrtc::VideoStream>& FakeVideoSendStream::GetVideoStreams()
-    const {
-  return video_streams_;
-}
-
-bool FakeVideoSendStream::IsSending() const {
-  return sending_;
-}
-
-bool FakeVideoSendStream::GetVp8Settings(
-    webrtc::VideoCodecVP8* settings) const {
-  if (!codec_settings_set_) {
-    return false;
-  }
-
-  *settings = vpx_settings_.vp8;
-  return true;
-}
-
-bool FakeVideoSendStream::GetVp9Settings(
-    webrtc::VideoCodecVP9* settings) const {
-  if (!codec_settings_set_) {
-    return false;
-  }
-
-  *settings = vpx_settings_.vp9;
-  return true;
-}
-
-int FakeVideoSendStream::GetNumberOfSwappedFrames() const {
-  return num_swapped_frames_;
-}
-
-int FakeVideoSendStream::GetLastWidth() const {
-  return last_frame_->width();
-}
-
-int FakeVideoSendStream::GetLastHeight() const {
-  return last_frame_->height();
-}
-
-int64_t FakeVideoSendStream::GetLastTimestamp() const {
-  RTC_DCHECK(last_frame_->ntp_time_ms() == 0);
-  return last_frame_->render_time_ms();
-}
-
-void FakeVideoSendStream::OnFrame(const webrtc::VideoFrame& frame) {
-  ++num_swapped_frames_;
-  if (!last_frame_ ||
-      frame.width() != last_frame_->width() ||
-      frame.height() != last_frame_->height() ||
-      frame.rotation() != last_frame_->rotation()) {
-    video_streams_ = encoder_config_.video_stream_factory->CreateEncoderStreams(
-        frame.width(), frame.height(), encoder_config_);
-  }
-  last_frame_ = rtc::Optional<webrtc::VideoFrame>(frame);
-}
-
-void FakeVideoSendStream::SetStats(
-    const webrtc::VideoSendStream::Stats& stats) {
-  stats_ = stats;
-}
-
-webrtc::VideoSendStream::Stats FakeVideoSendStream::GetStats() {
-  return stats_;
-}
-
-void FakeVideoSendStream::EnableEncodedFrameRecording(
-    const std::vector<rtc::PlatformFile>& files,
-    size_t byte_limit) {
-  for (rtc::PlatformFile file : files)
-    rtc::ClosePlatformFile(file);
-}
-
-void FakeVideoSendStream::ReconfigureVideoEncoder(
-    webrtc::VideoEncoderConfig config) {
-  int width, height;
-  if (last_frame_) {
-    width = last_frame_->width();
-    height = last_frame_->height();
-  } else {
-    width = height = 0;
-  }
-  video_streams_ = config.video_stream_factory->CreateEncoderStreams(
-      width, height, config);
-  if (config.encoder_specific_settings != NULL) {
-    if (config_.encoder_settings.payload_name == "VP8") {
-      config.encoder_specific_settings->FillVideoCodecVp8(&vpx_settings_.vp8);
-      if (!video_streams_.empty()) {
-        vpx_settings_.vp8.numberOfTemporalLayers = static_cast<unsigned char>(
-            video_streams_.back().temporal_layer_thresholds_bps.size() + 1);
-      }
-    } else if (config_.encoder_settings.payload_name == "VP9") {
-      config.encoder_specific_settings->FillVideoCodecVp9(&vpx_settings_.vp9);
-      if (!video_streams_.empty()) {
-        vpx_settings_.vp9.numberOfTemporalLayers = static_cast<unsigned char>(
-            video_streams_.back().temporal_layer_thresholds_bps.size() + 1);
-      }
-    } else {
-      ADD_FAILURE() << "Unsupported encoder payload: "
-                    << config_.encoder_settings.payload_name;
-    }
-  }
-  codec_settings_set_ = config.encoder_specific_settings != NULL;
-  encoder_config_ = std::move(config);
-  ++num_encoder_reconfigurations_;
-}
-
-void FakeVideoSendStream::Start() {
-  sending_ = true;
-}
-
-void FakeVideoSendStream::Stop() {
-  sending_ = false;
-}
-
-void FakeVideoSendStream::SetSource(
-    rtc::VideoSourceInterface<webrtc::VideoFrame>* source,
-    const webrtc::VideoSendStream::DegradationPreference&
-        degradation_preference) {
-  RTC_DCHECK(source != source_);
-  if (source_)
-    source_->RemoveSink(this);
-  source_ = source;
-  switch (degradation_preference) {
-    case DegradationPreference::kMaintainFramerate:
-      resolution_scaling_enabled_ = true;
-      framerate_scaling_enabled_ = false;
-      break;
-    case DegradationPreference::kMaintainResolution:
-      resolution_scaling_enabled_ = false;
-      framerate_scaling_enabled_ = true;
-      break;
-    case DegradationPreference::kBalanced:
-      resolution_scaling_enabled_ = true;
-      framerate_scaling_enabled_ = true;
-      break;
-    case DegradationPreference::kDegradationDisabled:
-      resolution_scaling_enabled_ = false;
-      framerate_scaling_enabled_ = false;
-      break;
-  }
-  if (source)
-    source->AddOrUpdateSink(this, resolution_scaling_enabled_
-                                      ? sink_wants_
-                                      : rtc::VideoSinkWants());
-}
-
-void FakeVideoSendStream::InjectVideoSinkWants(
-    const rtc::VideoSinkWants& wants) {
-  sink_wants_ = wants;
-  source_->AddOrUpdateSink(this, wants);
-}
-
-FakeVideoReceiveStream::FakeVideoReceiveStream(
-    webrtc::VideoReceiveStream::Config config)
-    : config_(std::move(config)), receiving_(false) {}
-
-const webrtc::VideoReceiveStream::Config& FakeVideoReceiveStream::GetConfig()
-    const {
-  return config_;
-}
-
-bool FakeVideoReceiveStream::IsReceiving() const {
-  return receiving_;
-}
-
-void FakeVideoReceiveStream::InjectFrame(const webrtc::VideoFrame& frame) {
-  config_.renderer->OnFrame(frame);
-}
-
-webrtc::VideoReceiveStream::Stats FakeVideoReceiveStream::GetStats() const {
-  return stats_;
-}
-
-void FakeVideoReceiveStream::Start() {
-  receiving_ = true;
-}
-
-void FakeVideoReceiveStream::Stop() {
-  receiving_ = false;
-}
-
-void FakeVideoReceiveStream::SetStats(
-    const webrtc::VideoReceiveStream::Stats& stats) {
-  stats_ = stats;
-}
-
-void FakeVideoReceiveStream::EnableEncodedFrameRecording(rtc::PlatformFile file,
-                                                         size_t byte_limit) {
-  rtc::ClosePlatformFile(file);
-}
-
-void FakeVideoReceiveStream::AddSecondarySink(
-    webrtc::RtpPacketSinkInterface* sink) {}
-
-void FakeVideoReceiveStream::RemoveSecondarySink(
-    const webrtc::RtpPacketSinkInterface* sink) {}
-
-FakeFlexfecReceiveStream::FakeFlexfecReceiveStream(
-    const webrtc::FlexfecReceiveStream::Config& config)
-    : config_(config) {}
-
-const webrtc::FlexfecReceiveStream::Config&
-FakeFlexfecReceiveStream::GetConfig() const {
-  return config_;
-}
-
-// TODO(brandtr): Implement when the stats have been designed.
-webrtc::FlexfecReceiveStream::Stats FakeFlexfecReceiveStream::GetStats() const {
-  return webrtc::FlexfecReceiveStream::Stats();
-}
-
-void FakeFlexfecReceiveStream::OnRtpPacket(const webrtc::RtpPacketReceived&) {
-  RTC_NOTREACHED() << "Not implemented.";
-}
-
-FakeCall::FakeCall(const webrtc::Call::Config& config)
-    : config_(config),
-      audio_network_state_(webrtc::kNetworkUp),
-      video_network_state_(webrtc::kNetworkUp),
-      num_created_send_streams_(0),
-      num_created_receive_streams_(0),
-      audio_transport_overhead_(0),
-      video_transport_overhead_(0) {}
-
-FakeCall::~FakeCall() {
-  EXPECT_EQ(0u, video_send_streams_.size());
-  EXPECT_EQ(0u, audio_send_streams_.size());
-  EXPECT_EQ(0u, video_receive_streams_.size());
-  EXPECT_EQ(0u, audio_receive_streams_.size());
-}
-
-webrtc::Call::Config FakeCall::GetConfig() const {
-  return config_;
-}
-
-const std::vector<FakeVideoSendStream*>& FakeCall::GetVideoSendStreams() {
-  return video_send_streams_;
-}
-
-const std::vector<FakeVideoReceiveStream*>& FakeCall::GetVideoReceiveStreams() {
-  return video_receive_streams_;
-}
-
-const std::vector<FakeAudioSendStream*>& FakeCall::GetAudioSendStreams() {
-  return audio_send_streams_;
-}
-
-const FakeAudioSendStream* FakeCall::GetAudioSendStream(uint32_t ssrc) {
-  for (const auto* p : GetAudioSendStreams()) {
-    if (p->GetConfig().rtp.ssrc == ssrc) {
-      return p;
-    }
-  }
-  return nullptr;
-}
-
-const std::vector<FakeAudioReceiveStream*>& FakeCall::GetAudioReceiveStreams() {
-  return audio_receive_streams_;
-}
-
-const FakeAudioReceiveStream* FakeCall::GetAudioReceiveStream(uint32_t ssrc) {
-  for (const auto* p : GetAudioReceiveStreams()) {
-    if (p->GetConfig().rtp.remote_ssrc == ssrc) {
-      return p;
-    }
-  }
-  return nullptr;
-}
-
-const std::vector<FakeFlexfecReceiveStream*>&
-FakeCall::GetFlexfecReceiveStreams() {
-  return flexfec_receive_streams_;
-}
-
-webrtc::NetworkState FakeCall::GetNetworkState(webrtc::MediaType media) const {
-  switch (media) {
-    case webrtc::MediaType::AUDIO:
-      return audio_network_state_;
-    case webrtc::MediaType::VIDEO:
-      return video_network_state_;
-    case webrtc::MediaType::DATA:
-    case webrtc::MediaType::ANY:
-      ADD_FAILURE() << "GetNetworkState called with unknown parameter.";
-      return webrtc::kNetworkDown;
-  }
-  // Even though all the values for the enum class are listed above,the compiler
-  // will emit a warning as the method may be called with a value outside of the
-  // valid enum range, unless this case is also handled.
-  ADD_FAILURE() << "GetNetworkState called with unknown parameter.";
-  return webrtc::kNetworkDown;
-}
-
-webrtc::AudioSendStream* FakeCall::CreateAudioSendStream(
-    const webrtc::AudioSendStream::Config& config) {
-  FakeAudioSendStream* fake_stream = new FakeAudioSendStream(next_stream_id_++,
-                                                             config);
-  audio_send_streams_.push_back(fake_stream);
-  ++num_created_send_streams_;
-  return fake_stream;
-}
-
-void FakeCall::DestroyAudioSendStream(webrtc::AudioSendStream* send_stream) {
-  auto it = std::find(audio_send_streams_.begin(),
-                      audio_send_streams_.end(),
-                      static_cast<FakeAudioSendStream*>(send_stream));
-  if (it == audio_send_streams_.end()) {
-    ADD_FAILURE() << "DestroyAudioSendStream called with unknown parameter.";
-  } else {
-    delete *it;
-    audio_send_streams_.erase(it);
-  }
-}
-
-webrtc::AudioReceiveStream* FakeCall::CreateAudioReceiveStream(
-    const webrtc::AudioReceiveStream::Config& config) {
-  audio_receive_streams_.push_back(new FakeAudioReceiveStream(next_stream_id_++,
-                                                              config));
-  ++num_created_receive_streams_;
-  return audio_receive_streams_.back();
-}
-
-void FakeCall::DestroyAudioReceiveStream(
-    webrtc::AudioReceiveStream* receive_stream) {
-  auto it = std::find(audio_receive_streams_.begin(),
-                      audio_receive_streams_.end(),
-                      static_cast<FakeAudioReceiveStream*>(receive_stream));
-  if (it == audio_receive_streams_.end()) {
-    ADD_FAILURE() << "DestroyAudioReceiveStream called with unknown parameter.";
-  } else {
-    delete *it;
-    audio_receive_streams_.erase(it);
-  }
-}
-
-webrtc::VideoSendStream* FakeCall::CreateVideoSendStream(
-    webrtc::VideoSendStream::Config config,
-    webrtc::VideoEncoderConfig encoder_config) {
-  FakeVideoSendStream* fake_stream =
-      new FakeVideoSendStream(std::move(config), std::move(encoder_config));
-  video_send_streams_.push_back(fake_stream);
-  ++num_created_send_streams_;
-  return fake_stream;
-}
-
-void FakeCall::DestroyVideoSendStream(webrtc::VideoSendStream* send_stream) {
-  auto it = std::find(video_send_streams_.begin(),
-                      video_send_streams_.end(),
-                      static_cast<FakeVideoSendStream*>(send_stream));
-  if (it == video_send_streams_.end()) {
-    ADD_FAILURE() << "DestroyVideoSendStream called with unknown parameter.";
-  } else {
-    delete *it;
-    video_send_streams_.erase(it);
-  }
-}
-
-webrtc::VideoReceiveStream* FakeCall::CreateVideoReceiveStream(
-    webrtc::VideoReceiveStream::Config config) {
-  video_receive_streams_.push_back(
-      new FakeVideoReceiveStream(std::move(config)));
-  ++num_created_receive_streams_;
-  return video_receive_streams_.back();
-}
-
-void FakeCall::DestroyVideoReceiveStream(
-    webrtc::VideoReceiveStream* receive_stream) {
-  auto it = std::find(video_receive_streams_.begin(),
-                      video_receive_streams_.end(),
-                      static_cast<FakeVideoReceiveStream*>(receive_stream));
-  if (it == video_receive_streams_.end()) {
-    ADD_FAILURE() << "DestroyVideoReceiveStream called with unknown parameter.";
-  } else {
-    delete *it;
-    video_receive_streams_.erase(it);
-  }
-}
-
-webrtc::FlexfecReceiveStream* FakeCall::CreateFlexfecReceiveStream(
-    const webrtc::FlexfecReceiveStream::Config& config) {
-  FakeFlexfecReceiveStream* fake_stream = new FakeFlexfecReceiveStream(config);
-  flexfec_receive_streams_.push_back(fake_stream);
-  ++num_created_receive_streams_;
-  return fake_stream;
-}
-
-void FakeCall::DestroyFlexfecReceiveStream(
-    webrtc::FlexfecReceiveStream* receive_stream) {
-  auto it = std::find(flexfec_receive_streams_.begin(),
-                      flexfec_receive_streams_.end(),
-                      static_cast<FakeFlexfecReceiveStream*>(receive_stream));
-  if (it == flexfec_receive_streams_.end()) {
-    ADD_FAILURE()
-        << "DestroyFlexfecReceiveStream called with unknown parameter.";
-  } else {
-    delete *it;
-    flexfec_receive_streams_.erase(it);
-  }
-}
-
-webrtc::PacketReceiver* FakeCall::Receiver() {
-  return this;
-}
-
-FakeCall::DeliveryStatus FakeCall::DeliverPacket(
-    webrtc::MediaType media_type,
-    const uint8_t* packet,
-    size_t length,
-    const webrtc::PacketTime& packet_time) {
-  EXPECT_GE(length, 12u);
-  RTC_DCHECK(media_type == webrtc::MediaType::AUDIO ||
-             media_type == webrtc::MediaType::VIDEO);
-
-  uint32_t ssrc;
-  if (!GetRtpSsrc(packet, length, &ssrc))
-    return DELIVERY_PACKET_ERROR;
-
-  if (media_type == webrtc::MediaType::VIDEO) {
-    for (auto receiver : video_receive_streams_) {
-      if (receiver->GetConfig().rtp.remote_ssrc == ssrc)
-        return DELIVERY_OK;
-    }
-  }
-  if (media_type == webrtc::MediaType::AUDIO) {
-    for (auto receiver : audio_receive_streams_) {
-      if (receiver->GetConfig().rtp.remote_ssrc == ssrc) {
-        receiver->DeliverRtp(packet, length, packet_time);
-        return DELIVERY_OK;
-      }
-    }
-  }
-  return DELIVERY_UNKNOWN_SSRC;
-}
-
-void FakeCall::SetStats(const webrtc::Call::Stats& stats) {
-  stats_ = stats;
-}
-
-int FakeCall::GetNumCreatedSendStreams() const {
-  return num_created_send_streams_;
-}
-
-int FakeCall::GetNumCreatedReceiveStreams() const {
-  return num_created_receive_streams_;
-}
-
-webrtc::Call::Stats FakeCall::GetStats() const {
-  return stats_;
-}
-
-void FakeCall::SetBitrateConfig(
-    const webrtc::Call::Config::BitrateConfig& bitrate_config) {
-  config_.bitrate_config = bitrate_config;
-}
-
-void FakeCall::SetBitrateConfigMask(
-    const webrtc::Call::Config::BitrateConfigMask& mask) {
-  // TODO(zstein): not implemented
-}
-
-void FakeCall::SignalChannelNetworkState(webrtc::MediaType media,
-                                         webrtc::NetworkState state) {
-  switch (media) {
-    case webrtc::MediaType::AUDIO:
-      audio_network_state_ = state;
-      break;
-    case webrtc::MediaType::VIDEO:
-      video_network_state_ = state;
-      break;
-    case webrtc::MediaType::DATA:
-    case webrtc::MediaType::ANY:
-      ADD_FAILURE()
-          << "SignalChannelNetworkState called with unknown parameter.";
-  }
-}
-
-void FakeCall::OnTransportOverheadChanged(webrtc::MediaType media,
-                                          int transport_overhead_per_packet) {
-  switch (media) {
-    case webrtc::MediaType::AUDIO:
-      audio_transport_overhead_ = transport_overhead_per_packet;
-      break;
-    case webrtc::MediaType::VIDEO:
-      video_transport_overhead_ = transport_overhead_per_packet;
-      break;
-    case webrtc::MediaType::DATA:
-    case webrtc::MediaType::ANY:
-      ADD_FAILURE()
-          << "SignalChannelNetworkState called with unknown parameter.";
-  }
-}
-
-void FakeCall::OnSentPacket(const rtc::SentPacket& sent_packet) {
-  last_sent_packet_ = sent_packet;
-  if (sent_packet.packet_id >= 0) {
-    last_sent_nonnegative_packet_id_ = sent_packet.packet_id;
-  }
-}
-
-}  // namespace cricket
diff --git a/media/engine/fakewebrtccall.h b/media/engine/fakewebrtccall.h
deleted file mode 100644
index 0b4496b..0000000
--- a/media/engine/fakewebrtccall.h
+++ /dev/null
@@ -1,328 +0,0 @@
-/*
- *  Copyright (c) 2015 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.
- */
-
-// This file contains fake implementations, for use in unit tests, of the
-// following classes:
-//
-//   webrtc::Call
-//   webrtc::AudioSendStream
-//   webrtc::AudioReceiveStream
-//   webrtc::VideoSendStream
-//   webrtc::VideoReceiveStream
-
-#ifndef WEBRTC_MEDIA_ENGINE_FAKEWEBRTCCALL_H_
-#define WEBRTC_MEDIA_ENGINE_FAKEWEBRTCCALL_H_
-
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "webrtc/api/video/video_frame.h"
-#include "webrtc/call/audio_receive_stream.h"
-#include "webrtc/call/audio_send_stream.h"
-#include "webrtc/call/call.h"
-#include "webrtc/call/flexfec_receive_stream.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_packet_received.h"
-#include "webrtc/rtc_base/buffer.h"
-#include "webrtc/call/video_receive_stream.h"
-#include "webrtc/call/video_send_stream.h"
-
-namespace cricket {
-class FakeAudioSendStream final : public webrtc::AudioSendStream {
- public:
-  struct TelephoneEvent {
-    int payload_type = -1;
-    int payload_frequency = -1;
-    int event_code = 0;
-    int duration_ms = 0;
-  };
-
-  explicit FakeAudioSendStream(
-      int id, const webrtc::AudioSendStream::Config& config);
-
-  int id() const { return id_; }
-  const webrtc::AudioSendStream::Config& GetConfig() const override;
-  void SetStats(const webrtc::AudioSendStream::Stats& stats);
-  TelephoneEvent GetLatestTelephoneEvent() const;
-  bool IsSending() const { return sending_; }
-  bool muted() const { return muted_; }
-
- private:
-  // webrtc::AudioSendStream implementation.
-  void Reconfigure(const webrtc::AudioSendStream::Config& config) override;
-
-  void Start() override { sending_ = true; }
-  void Stop() override { sending_ = false; }
-
-  bool SendTelephoneEvent(int payload_type, int payload_frequency, int event,
-                          int duration_ms) override;
-  void SetMuted(bool muted) override;
-  webrtc::AudioSendStream::Stats GetStats() const override;
-
-  int id_ = -1;
-  TelephoneEvent latest_telephone_event_;
-  webrtc::AudioSendStream::Config config_;
-  webrtc::AudioSendStream::Stats stats_;
-  bool sending_ = false;
-  bool muted_ = false;
-};
-
-class FakeAudioReceiveStream final : public webrtc::AudioReceiveStream {
- public:
-  explicit FakeAudioReceiveStream(
-      int id, const webrtc::AudioReceiveStream::Config& config);
-
-  int id() const { return id_; }
-  const webrtc::AudioReceiveStream::Config& GetConfig() const;
-  void SetStats(const webrtc::AudioReceiveStream::Stats& stats);
-  int received_packets() const { return received_packets_; }
-  bool VerifyLastPacket(const uint8_t* data, size_t length) const;
-  const webrtc::AudioSinkInterface* sink() const { return sink_.get(); }
-  float gain() const { return gain_; }
-  bool DeliverRtp(const uint8_t* packet,
-                  size_t length,
-                  const webrtc::PacketTime& packet_time);
-  bool started() const { return started_; }
-
- private:
-  // webrtc::AudioReceiveStream implementation.
-  void Start() override { started_ = true; }
-  void Stop() override { started_ = false; }
-
-  webrtc::AudioReceiveStream::Stats GetStats() const override;
-  int GetOutputLevel() const override { return 0; }
-  void SetSink(std::unique_ptr<webrtc::AudioSinkInterface> sink) override;
-  void SetGain(float gain) override;
-  std::vector<webrtc::RtpSource> GetSources() const override {
-    return std::vector<webrtc::RtpSource>();
-  }
-
-  int id_ = -1;
-  webrtc::AudioReceiveStream::Config config_;
-  webrtc::AudioReceiveStream::Stats stats_;
-  int received_packets_ = 0;
-  std::unique_ptr<webrtc::AudioSinkInterface> sink_;
-  float gain_ = 1.0f;
-  rtc::Buffer last_packet_;
-  bool started_ = false;
-};
-
-class FakeVideoSendStream final
-    : public webrtc::VideoSendStream,
-      public rtc::VideoSinkInterface<webrtc::VideoFrame> {
- public:
-  FakeVideoSendStream(webrtc::VideoSendStream::Config config,
-                      webrtc::VideoEncoderConfig encoder_config);
-  ~FakeVideoSendStream() override;
-  const webrtc::VideoSendStream::Config& GetConfig() const;
-  const webrtc::VideoEncoderConfig& GetEncoderConfig() const;
-  const std::vector<webrtc::VideoStream>& GetVideoStreams() const;
-
-  bool IsSending() const;
-  bool GetVp8Settings(webrtc::VideoCodecVP8* settings) const;
-  bool GetVp9Settings(webrtc::VideoCodecVP9* settings) const;
-
-  int GetNumberOfSwappedFrames() const;
-  int GetLastWidth() const;
-  int GetLastHeight() const;
-  int64_t GetLastTimestamp() const;
-  void SetStats(const webrtc::VideoSendStream::Stats& stats);
-  int num_encoder_reconfigurations() const {
-    return num_encoder_reconfigurations_;
-  }
-
-  void EnableEncodedFrameRecording(const std::vector<rtc::PlatformFile>& files,
-                                   size_t byte_limit) override;
-
-  bool resolution_scaling_enabled() const {
-    return resolution_scaling_enabled_;
-  }
-  bool framerate_scaling_enabled() const { return framerate_scaling_enabled_; }
-  void InjectVideoSinkWants(const rtc::VideoSinkWants& wants);
-
-  rtc::VideoSourceInterface<webrtc::VideoFrame>* source() const {
-    return source_;
-  }
-
- private:
-  // rtc::VideoSinkInterface<VideoFrame> implementation.
-  void OnFrame(const webrtc::VideoFrame& frame) override;
-
-  // webrtc::VideoSendStream implementation.
-  void Start() override;
-  void Stop() override;
-  void SetSource(rtc::VideoSourceInterface<webrtc::VideoFrame>* source,
-                 const webrtc::VideoSendStream::DegradationPreference&
-                     degradation_preference) override;
-  webrtc::VideoSendStream::Stats GetStats() override;
-  void ReconfigureVideoEncoder(webrtc::VideoEncoderConfig config) override;
-
-  bool sending_;
-  webrtc::VideoSendStream::Config config_;
-  webrtc::VideoEncoderConfig encoder_config_;
-  std::vector<webrtc::VideoStream> video_streams_;
-  rtc::VideoSinkWants sink_wants_;
-
-  bool codec_settings_set_;
-  union VpxSettings {
-    webrtc::VideoCodecVP8 vp8;
-    webrtc::VideoCodecVP9 vp9;
-  } vpx_settings_;
-  bool resolution_scaling_enabled_;
-  bool framerate_scaling_enabled_;
-  rtc::VideoSourceInterface<webrtc::VideoFrame>* source_;
-  int num_swapped_frames_;
-  rtc::Optional<webrtc::VideoFrame> last_frame_;
-  webrtc::VideoSendStream::Stats stats_;
-  int num_encoder_reconfigurations_ = 0;
-};
-
-class FakeVideoReceiveStream final : public webrtc::VideoReceiveStream {
- public:
-  explicit FakeVideoReceiveStream(webrtc::VideoReceiveStream::Config config);
-
-  const webrtc::VideoReceiveStream::Config& GetConfig() const;
-
-  bool IsReceiving() const;
-
-  void InjectFrame(const webrtc::VideoFrame& frame);
-
-  void SetStats(const webrtc::VideoReceiveStream::Stats& stats);
-
-  void EnableEncodedFrameRecording(rtc::PlatformFile file,
-                                   size_t byte_limit) override;
-
-  void AddSecondarySink(webrtc::RtpPacketSinkInterface* sink) override;
-  void RemoveSecondarySink(const webrtc::RtpPacketSinkInterface* sink) override;
-
- private:
-  // webrtc::VideoReceiveStream implementation.
-  void Start() override;
-  void Stop() override;
-
-  webrtc::VideoReceiveStream::Stats GetStats() const override;
-
-  webrtc::VideoReceiveStream::Config config_;
-  bool receiving_;
-  webrtc::VideoReceiveStream::Stats stats_;
-};
-
-class FakeFlexfecReceiveStream final : public webrtc::FlexfecReceiveStream {
- public:
-  explicit FakeFlexfecReceiveStream(
-      const webrtc::FlexfecReceiveStream::Config& config);
-
-  const webrtc::FlexfecReceiveStream::Config& GetConfig() const override;
-
- private:
-  webrtc::FlexfecReceiveStream::Stats GetStats() const override;
-
-  void OnRtpPacket(const webrtc::RtpPacketReceived& packet) override;
-
-  webrtc::FlexfecReceiveStream::Config config_;
-};
-
-class FakeCall final : public webrtc::Call, public webrtc::PacketReceiver {
- public:
-  explicit FakeCall(const webrtc::Call::Config& config);
-  ~FakeCall() override;
-
-  webrtc::Call::Config GetConfig() const;
-  const std::vector<FakeVideoSendStream*>& GetVideoSendStreams();
-  const std::vector<FakeVideoReceiveStream*>& GetVideoReceiveStreams();
-
-  const std::vector<FakeAudioSendStream*>& GetAudioSendStreams();
-  const FakeAudioSendStream* GetAudioSendStream(uint32_t ssrc);
-  const std::vector<FakeAudioReceiveStream*>& GetAudioReceiveStreams();
-  const FakeAudioReceiveStream* GetAudioReceiveStream(uint32_t ssrc);
-
-  const std::vector<FakeFlexfecReceiveStream*>& GetFlexfecReceiveStreams();
-
-  rtc::SentPacket last_sent_packet() const { return last_sent_packet_; }
-
-  // This is useful if we care about the last media packet (with id populated)
-  // but not the last ICE packet (with -1 ID).
-  int last_sent_nonnegative_packet_id() const {
-    return last_sent_nonnegative_packet_id_;
-  }
-
-  webrtc::NetworkState GetNetworkState(webrtc::MediaType media) const;
-  int GetNumCreatedSendStreams() const;
-  int GetNumCreatedReceiveStreams() const;
-  void SetStats(const webrtc::Call::Stats& stats);
-
- private:
-  webrtc::AudioSendStream* CreateAudioSendStream(
-      const webrtc::AudioSendStream::Config& config) override;
-  void DestroyAudioSendStream(webrtc::AudioSendStream* send_stream) override;
-
-  webrtc::AudioReceiveStream* CreateAudioReceiveStream(
-      const webrtc::AudioReceiveStream::Config& config) override;
-  void DestroyAudioReceiveStream(
-      webrtc::AudioReceiveStream* receive_stream) override;
-
-  webrtc::VideoSendStream* CreateVideoSendStream(
-      webrtc::VideoSendStream::Config config,
-      webrtc::VideoEncoderConfig encoder_config) override;
-  void DestroyVideoSendStream(webrtc::VideoSendStream* send_stream) override;
-
-  webrtc::VideoReceiveStream* CreateVideoReceiveStream(
-      webrtc::VideoReceiveStream::Config config) override;
-  void DestroyVideoReceiveStream(
-      webrtc::VideoReceiveStream* receive_stream) override;
-
-  webrtc::FlexfecReceiveStream* CreateFlexfecReceiveStream(
-      const webrtc::FlexfecReceiveStream::Config& config) override;
-  void DestroyFlexfecReceiveStream(
-      webrtc::FlexfecReceiveStream* receive_stream) override;
-
-  webrtc::PacketReceiver* Receiver() override;
-
-  DeliveryStatus DeliverPacket(webrtc::MediaType media_type,
-                               const uint8_t* packet,
-                               size_t length,
-                               const webrtc::PacketTime& packet_time) override;
-
-  webrtc::Call::Stats GetStats() const override;
-
-  void SetBitrateConfig(
-      const webrtc::Call::Config::BitrateConfig& bitrate_config) override;
-  void SetBitrateConfigMask(
-      const webrtc::Call::Config::BitrateConfigMask& mask) override;
-  void OnNetworkRouteChanged(const std::string& transport_name,
-                             const rtc::NetworkRoute& network_route) override {}
-  void SignalChannelNetworkState(webrtc::MediaType media,
-                                 webrtc::NetworkState state) override;
-  void OnTransportOverheadChanged(webrtc::MediaType media,
-                                  int transport_overhead_per_packet) override;
-  void OnSentPacket(const rtc::SentPacket& sent_packet) override;
-
-  webrtc::Call::Config config_;
-  webrtc::NetworkState audio_network_state_;
-  webrtc::NetworkState video_network_state_;
-  rtc::SentPacket last_sent_packet_;
-  int last_sent_nonnegative_packet_id_ = -1;
-  int next_stream_id_ = 665;
-  webrtc::Call::Stats stats_;
-  std::vector<FakeVideoSendStream*> video_send_streams_;
-  std::vector<FakeAudioSendStream*> audio_send_streams_;
-  std::vector<FakeVideoReceiveStream*> video_receive_streams_;
-  std::vector<FakeAudioReceiveStream*> audio_receive_streams_;
-  std::vector<FakeFlexfecReceiveStream*> flexfec_receive_streams_;
-
-  int num_created_send_streams_;
-  int num_created_receive_streams_;
-
-  int audio_transport_overhead_;
-  int video_transport_overhead_;
-};
-
-}  // namespace cricket
-#endif  // WEBRTC_MEDIA_ENGINE_FAKEWEBRTCCALL_H_
diff --git a/media/engine/fakewebrtcdeviceinfo.h b/media/engine/fakewebrtcdeviceinfo.h
deleted file mode 100644
index 38f9810..0000000
--- a/media/engine/fakewebrtcdeviceinfo.h
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- *  Copyright (c) 2004 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_MEDIA_ENGINE_FAKEWEBRTCDEVICEINFO_H_
-#define WEBRTC_MEDIA_ENGINE_FAKEWEBRTCDEVICEINFO_H_
-
-#include <vector>
-
-#include "webrtc/media/engine/webrtcvideocapturer.h"
-#include "webrtc/rtc_base/stringutils.h"
-
-// Fake class for mocking out webrtc::VideoCaptureModule::DeviceInfo.
-class FakeWebRtcDeviceInfo : public webrtc::VideoCaptureModule::DeviceInfo {
- public:
-  struct Device {
-    Device(const std::string& n, const std::string& i) : name(n), id(i) {}
-    std::string name;
-    std::string id;
-    std::string product;
-    std::vector<webrtc::VideoCaptureCapability> caps;
-  };
-  FakeWebRtcDeviceInfo() {}
-  void AddDevice(const std::string& device_name, const std::string& device_id) {
-    devices_.push_back(Device(device_name, device_id));
-  }
-  void AddCapability(const std::string& device_id,
-                     const webrtc::VideoCaptureCapability& cap) {
-    Device* dev = GetDeviceById(
-        reinterpret_cast<const char*>(device_id.c_str()));
-    if (!dev) return;
-    dev->caps.push_back(cap);
-  }
-  virtual uint32_t NumberOfDevices() {
-    return static_cast<int>(devices_.size());
-  }
-  virtual int32_t GetDeviceName(uint32_t device_num,
-                                char* device_name,
-                                uint32_t device_name_len,
-                                char* device_id,
-                                uint32_t device_id_len,
-                                char* product_id,
-                                uint32_t product_id_len) {
-    Device* dev = GetDeviceByIndex(device_num);
-    if (!dev) return -1;
-    rtc::strcpyn(reinterpret_cast<char*>(device_name), device_name_len,
-                       dev->name.c_str());
-    rtc::strcpyn(reinterpret_cast<char*>(device_id), device_id_len,
-                       dev->id.c_str());
-    if (product_id) {
-      rtc::strcpyn(reinterpret_cast<char*>(product_id), product_id_len,
-                         dev->product.c_str());
-    }
-    return 0;
-  }
-  virtual int32_t NumberOfCapabilities(const char* device_id) {
-    Device* dev = GetDeviceById(device_id);
-    if (!dev) return -1;
-    return static_cast<int32_t>(dev->caps.size());
-  }
-  virtual int32_t GetCapability(const char* device_id,
-                                const uint32_t device_cap_num,
-                                webrtc::VideoCaptureCapability& cap) {
-    Device* dev = GetDeviceById(device_id);
-    if (!dev) return -1;
-    if (device_cap_num >= dev->caps.size()) return -1;
-    cap = dev->caps[device_cap_num];
-    return 0;
-  }
-  virtual int32_t GetOrientation(const char* device_id,
-                                 webrtc::VideoRotation& rotation) {
-    return -1;  // not implemented
-  }
-  virtual int32_t GetBestMatchedCapability(
-      const char* device_id,
-      const webrtc::VideoCaptureCapability& requested,
-      webrtc::VideoCaptureCapability& resulting) {
-    return -1;  // not implemented
-  }
-  virtual int32_t DisplayCaptureSettingsDialogBox(
-      const char* device_id, const char* dialog_title,
-      void* parent, uint32_t x, uint32_t y) {
-    return -1;  // not implemented
-  }
-
-  Device* GetDeviceByIndex(size_t num) {
-    return (num < devices_.size()) ? &devices_[num] : NULL;
-  }
-  Device* GetDeviceById(const char* device_id) {
-    for (size_t i = 0; i < devices_.size(); ++i) {
-      if (devices_[i].id == reinterpret_cast<const char*>(device_id)) {
-        return &devices_[i];
-      }
-    }
-    return NULL;
-  }
-
- private:
-  std::vector<Device> devices_;
-};
-
-#endif  // WEBRTC_MEDIA_ENGINE_FAKEWEBRTCDEVICEINFO_H_
diff --git a/media/engine/fakewebrtcvcmfactory.h b/media/engine/fakewebrtcvcmfactory.h
deleted file mode 100644
index 3124cd8..0000000
--- a/media/engine/fakewebrtcvcmfactory.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- *  Copyright (c) 2004 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_MEDIA_ENGINE_FAKEWEBRTCVCMFACTORY_H_
-#define WEBRTC_MEDIA_ENGINE_FAKEWEBRTCVCMFACTORY_H_
-
-#include <vector>
-
-#include "webrtc/media/engine/fakewebrtcdeviceinfo.h"
-#include "webrtc/media/engine/fakewebrtcvideocapturemodule.h"
-#include "webrtc/media/engine/webrtcvideocapturer.h"
-
-// Factory class to allow the fakes above to be injected into
-// WebRtcVideoCapturer.
-class FakeWebRtcVcmFactory : public cricket::WebRtcVcmFactoryInterface {
- public:
-  virtual rtc::scoped_refptr<webrtc::VideoCaptureModule> Create(
-      const char* device_id) {
-    if (!device_info.GetDeviceById(device_id)) return NULL;
-    rtc::scoped_refptr<FakeWebRtcVideoCaptureModule> module(
-        new rtc::RefCountedObject<FakeWebRtcVideoCaptureModule>(this));
-    modules.push_back(module);
-    return module;
-  }
-  virtual webrtc::VideoCaptureModule::DeviceInfo* CreateDeviceInfo() {
-    return &device_info;
-  }
-  virtual void DestroyDeviceInfo(webrtc::VideoCaptureModule::DeviceInfo* info) {
-  }
-  void OnDestroyed(webrtc::VideoCaptureModule* module) {
-    std::remove(modules.begin(), modules.end(), module);
-  }
-  FakeWebRtcDeviceInfo device_info;
-  std::vector<rtc::scoped_refptr<FakeWebRtcVideoCaptureModule>> modules;
-};
-
-FakeWebRtcVideoCaptureModule::~FakeWebRtcVideoCaptureModule() {
-  if (factory_)
-    factory_->OnDestroyed(this);
-}
-
-#endif  // WEBRTC_MEDIA_ENGINE_FAKEWEBRTCVCMFACTORY_H_
diff --git a/media/engine/fakewebrtcvideocapturemodule.h b/media/engine/fakewebrtcvideocapturemodule.h
deleted file mode 100644
index 0d52999..0000000
--- a/media/engine/fakewebrtcvideocapturemodule.h
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- *  Copyright (c) 2004 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_MEDIA_ENGINE_FAKEWEBRTCVIDEOCAPTUREMODULE_H_
-#define WEBRTC_MEDIA_ENGINE_FAKEWEBRTCVIDEOCAPTUREMODULE_H_
-
-#include <vector>
-
-#include "webrtc/api/video/i420_buffer.h"
-#include "webrtc/media/base/testutils.h"
-#include "webrtc/media/engine/webrtcvideocapturer.h"
-
-class FakeWebRtcVcmFactory;
-
-// Fake class for mocking out webrtc::VideoCaptureModule.
-class FakeWebRtcVideoCaptureModule : public webrtc::VideoCaptureModule {
- public:
-  FakeWebRtcVideoCaptureModule(FakeWebRtcVcmFactory* factory)
-      : factory_(factory),
-        callback_(NULL),
-        running_(false) {
-  }
-  ~FakeWebRtcVideoCaptureModule();
-  void RegisterCaptureDataCallback(
-      rtc::VideoSinkInterface<webrtc::VideoFrame>* callback) override {
-    callback_ = callback;
-  }
-  void DeRegisterCaptureDataCallback() override { callback_ = NULL; }
-  int32_t StartCapture(const webrtc::VideoCaptureCapability& cap) override {
-    if (running_) return -1;
-    cap_ = cap;
-    running_ = true;
-    return 0;
-  }
-  int32_t StopCapture() override {
-    running_ = false;
-    return 0;
-  }
-  const char* CurrentDeviceName() const override {
-    return NULL;  // not implemented
-  }
-  bool CaptureStarted() override { return running_; }
-  int32_t CaptureSettings(webrtc::VideoCaptureCapability& settings) override {
-    if (!running_) return -1;
-    settings = cap_;
-    return 0;
-  }
-
-  int32_t SetCaptureRotation(webrtc::VideoRotation rotation) override {
-    return -1;  // not implemented
-  }
-  bool SetApplyRotation(bool enable) override {
-    return true;  // ignored
-  }
-  bool GetApplyRotation() override {
-    return true;  // Rotation compensation is turned on.
-  }
-  void SendFrame(int w, int h) {
-    if (!running_) return;
-
-    rtc::scoped_refptr<webrtc::I420Buffer> buffer =
-        webrtc::I420Buffer::Create(w, h);
-    // Initialize memory to satisfy DrMemory tests. See
-    // https://bugs.chromium.org/p/libyuv/issues/detail?id=377
-    buffer->InitializeData();
-    if (callback_) {
-      callback_->OnFrame(
-          webrtc::VideoFrame(buffer, 0, 0, webrtc::kVideoRotation_0));
-    }
-  }
-
-  const webrtc::VideoCaptureCapability& cap() const {
-    return cap_;
-  }
-
- private:
-  FakeWebRtcVcmFactory* factory_;
-  rtc::VideoSinkInterface<webrtc::VideoFrame>* callback_;
-  bool running_;
-  webrtc::VideoCaptureCapability cap_;
-};
-
-#endif  // WEBRTC_MEDIA_ENGINE_FAKEWEBRTCVIDEOCAPTUREMODULE_H_
diff --git a/media/engine/fakewebrtcvideoengine.h b/media/engine/fakewebrtcvideoengine.h
deleted file mode 100644
index e9afc76..0000000
--- a/media/engine/fakewebrtcvideoengine.h
+++ /dev/null
@@ -1,260 +0,0 @@
-/*
- *  Copyright (c) 2010 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_MEDIA_ENGINE_FAKEWEBRTCVIDEOENGINE_H_
-#define WEBRTC_MEDIA_ENGINE_FAKEWEBRTCVIDEOENGINE_H_
-
-#include <map>
-#include <set>
-#include <vector>
-#include <string>
-
-#include "webrtc/api/video_codecs/video_decoder.h"
-#include "webrtc/api/video_codecs/video_encoder.h"
-#include "webrtc/media/base/codec.h"
-#include "webrtc/media/engine/webrtcvideodecoderfactory.h"
-#include "webrtc/media/engine/webrtcvideoencoderfactory.h"
-#include "webrtc/modules/video_coding/include/video_error_codes.h"
-#include "webrtc/rtc_base/basictypes.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/gunit.h"
-#include "webrtc/rtc_base/stringutils.h"
-#include "webrtc/rtc_base/thread_annotations.h"
-
-namespace cricket {
-static const int kEventTimeoutMs = 10000;
-
-// Fake class for mocking out webrtc::VideoDecoder
-class FakeWebRtcVideoDecoder : public webrtc::VideoDecoder {
- public:
-  FakeWebRtcVideoDecoder() : num_frames_received_(0) {}
-
-  virtual int32_t InitDecode(const webrtc::VideoCodec*, int32_t) {
-    return WEBRTC_VIDEO_CODEC_OK;
-  }
-
-  virtual int32_t Decode(const webrtc::EncodedImage&,
-                         bool,
-                         const webrtc::RTPFragmentationHeader*,
-                         const webrtc::CodecSpecificInfo*,
-                         int64_t) {
-    num_frames_received_++;
-    return WEBRTC_VIDEO_CODEC_OK;
-  }
-
-  virtual int32_t RegisterDecodeCompleteCallback(
-      webrtc::DecodedImageCallback*) {
-    return WEBRTC_VIDEO_CODEC_OK;
-  }
-
-  virtual int32_t Release() { return WEBRTC_VIDEO_CODEC_OK; }
-
-  int GetNumFramesReceived() const {
-    return num_frames_received_;
-  }
-
- private:
-  int num_frames_received_;
-};
-
-// Fake class for mocking out WebRtcVideoDecoderFactory.
-class FakeWebRtcVideoDecoderFactory : public WebRtcVideoDecoderFactory {
- public:
-  FakeWebRtcVideoDecoderFactory()
-      : num_created_decoders_(0) {
-  }
-
-  virtual webrtc::VideoDecoder* CreateVideoDecoder(
-      webrtc::VideoCodecType type) {
-    if (supported_codec_types_.count(type) == 0) {
-      return NULL;
-    }
-    FakeWebRtcVideoDecoder* decoder = new FakeWebRtcVideoDecoder();
-    decoders_.push_back(decoder);
-    num_created_decoders_++;
-    return decoder;
-  }
-
-  virtual webrtc::VideoDecoder* CreateVideoDecoderWithParams(
-      webrtc::VideoCodecType type,
-      VideoDecoderParams params) {
-    params_.push_back(params);
-    return CreateVideoDecoder(type);
-  }
-
-  virtual void DestroyVideoDecoder(webrtc::VideoDecoder* decoder) {
-    decoders_.erase(
-        std::remove(decoders_.begin(), decoders_.end(), decoder),
-        decoders_.end());
-    delete decoder;
-  }
-
-  void AddSupportedVideoCodecType(webrtc::VideoCodecType type) {
-    supported_codec_types_.insert(type);
-  }
-
-  int GetNumCreatedDecoders() {
-    return num_created_decoders_;
-  }
-
-  const std::vector<FakeWebRtcVideoDecoder*>& decoders() {
-    return decoders_;
-  }
-
-  const std::vector<VideoDecoderParams>& params() { return params_; }
-
- private:
-  std::set<webrtc::VideoCodecType> supported_codec_types_;
-  std::vector<FakeWebRtcVideoDecoder*> decoders_;
-  int num_created_decoders_;
-  std::vector<VideoDecoderParams> params_;
-};
-
-// Fake class for mocking out webrtc::VideoEnoder
-class FakeWebRtcVideoEncoder : public webrtc::VideoEncoder {
- public:
-  FakeWebRtcVideoEncoder()
-      : init_encode_event_(false, false), num_frames_encoded_(0) {}
-
-  int32_t InitEncode(const webrtc::VideoCodec* codecSettings,
-                     int32_t numberOfCores,
-                     size_t maxPayloadSize) override {
-    rtc::CritScope lock(&crit_);
-    codec_settings_ = *codecSettings;
-    init_encode_event_.Set();
-    return WEBRTC_VIDEO_CODEC_OK;
-  }
-
-  bool WaitForInitEncode() { return init_encode_event_.Wait(kEventTimeoutMs); }
-
-  webrtc::VideoCodec GetCodecSettings() {
-    rtc::CritScope lock(&crit_);
-    return codec_settings_;
-  }
-
-  int32_t Encode(const webrtc::VideoFrame& inputImage,
-                 const webrtc::CodecSpecificInfo* codecSpecificInfo,
-                 const std::vector<webrtc::FrameType>* frame_types) override {
-    rtc::CritScope lock(&crit_);
-    ++num_frames_encoded_;
-    init_encode_event_.Set();
-    return WEBRTC_VIDEO_CODEC_OK;
-  }
-
-  int32_t RegisterEncodeCompleteCallback(
-      webrtc::EncodedImageCallback* callback) override {
-    return WEBRTC_VIDEO_CODEC_OK;
-  }
-
-  int32_t Release() override { return WEBRTC_VIDEO_CODEC_OK; }
-
-  int32_t SetChannelParameters(uint32_t packetLoss, int64_t rtt) override {
-    return WEBRTC_VIDEO_CODEC_OK;
-  }
-
-  int32_t SetRateAllocation(const webrtc::BitrateAllocation& allocation,
-                            uint32_t framerate) override {
-    return WEBRTC_VIDEO_CODEC_OK;
-  }
-
-  int GetNumEncodedFrames() {
-    rtc::CritScope lock(&crit_);
-    return num_frames_encoded_;
-  }
-
- private:
-  rtc::CriticalSection crit_;
-  rtc::Event init_encode_event_;
-  int num_frames_encoded_ RTC_GUARDED_BY(crit_);
-  webrtc::VideoCodec codec_settings_ RTC_GUARDED_BY(crit_);
-};
-
-// Fake class for mocking out WebRtcVideoEncoderFactory.
-class FakeWebRtcVideoEncoderFactory : public WebRtcVideoEncoderFactory {
- public:
-  FakeWebRtcVideoEncoderFactory()
-      : created_video_encoder_event_(false, false),
-        num_created_encoders_(0),
-        encoders_have_internal_sources_(false) {}
-
-  webrtc::VideoEncoder* CreateVideoEncoder(
-      const cricket::VideoCodec& codec) override {
-    rtc::CritScope lock(&crit_);
-    if (!FindMatchingCodec(codecs_, codec))
-      return nullptr;
-    FakeWebRtcVideoEncoder* encoder = new FakeWebRtcVideoEncoder();
-    encoders_.push_back(encoder);
-    num_created_encoders_++;
-    created_video_encoder_event_.Set();
-    return encoder;
-  }
-
-  bool WaitForCreatedVideoEncoders(int num_encoders) {
-    int64_t start_offset_ms = rtc::TimeMillis();
-    int64_t wait_time = kEventTimeoutMs;
-    do {
-      if (GetNumCreatedEncoders() >= num_encoders)
-        return true;
-      wait_time = kEventTimeoutMs - (rtc::TimeMillis() - start_offset_ms);
-    } while (wait_time > 0 && created_video_encoder_event_.Wait(wait_time));
-    return false;
-  }
-
-  void DestroyVideoEncoder(webrtc::VideoEncoder* encoder) override {
-    rtc::CritScope lock(&crit_);
-    encoders_.erase(
-        std::remove(encoders_.begin(), encoders_.end(), encoder),
-        encoders_.end());
-    delete encoder;
-  }
-
-  const std::vector<cricket::VideoCodec>& supported_codecs() const override {
-    return codecs_;
-  }
-
-  bool EncoderTypeHasInternalSource(
-      webrtc::VideoCodecType type) const override {
-    return encoders_have_internal_sources_;
-  }
-
-  void set_encoders_have_internal_sources(bool internal_source) {
-    encoders_have_internal_sources_ = internal_source;
-  }
-
-  void AddSupportedVideoCodec(const cricket::VideoCodec& codec) {
-    codecs_.push_back(codec);
-  }
-
-  void AddSupportedVideoCodecType(const std::string& name) {
-    codecs_.push_back(cricket::VideoCodec(name));
-  }
-
-  int GetNumCreatedEncoders() {
-    rtc::CritScope lock(&crit_);
-    return num_created_encoders_;
-  }
-
-  const std::vector<FakeWebRtcVideoEncoder*> encoders() {
-    rtc::CritScope lock(&crit_);
-    return encoders_;
-  }
-
- private:
-  rtc::CriticalSection crit_;
-  rtc::Event created_video_encoder_event_;
-  std::vector<cricket::VideoCodec> codecs_;
-  std::vector<FakeWebRtcVideoEncoder*> encoders_ RTC_GUARDED_BY(crit_);
-  int num_created_encoders_ RTC_GUARDED_BY(crit_);
-  bool encoders_have_internal_sources_;
-};
-
-}  // namespace cricket
-
-#endif  // WEBRTC_MEDIA_ENGINE_FAKEWEBRTCVIDEOENGINE_H_
diff --git a/media/engine/fakewebrtcvoiceengine.h b/media/engine/fakewebrtcvoiceengine.h
deleted file mode 100644
index 13df1fc..0000000
--- a/media/engine/fakewebrtcvoiceengine.h
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
- *  Copyright (c) 2010 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_MEDIA_ENGINE_FAKEWEBRTCVOICEENGINE_H_
-#define WEBRTC_MEDIA_ENGINE_FAKEWEBRTCVOICEENGINE_H_
-
-#include <map>
-#include <vector>
-
-#include "webrtc/media/engine/webrtcvoe.h"
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-namespace voe {
-class TransmitMixer;
-}  // namespace voe
-}  // namespace webrtc
-
-namespace cricket {
-
-#define WEBRTC_CHECK_CHANNEL(channel) \
-  if (channels_.find(channel) == channels_.end()) return -1;
-
-#define WEBRTC_STUB(method, args) \
-  int method args override { return 0; }
-
-#define WEBRTC_FUNC(method, args) int method args override
-
-class FakeWebRtcVoiceEngine : public webrtc::VoEBase {
- public:
-  struct Channel {
-    std::vector<webrtc::CodecInst> recv_codecs;
-    size_t neteq_capacity = 0;
-    bool neteq_fast_accelerate = false;
-  };
-
-  explicit FakeWebRtcVoiceEngine(webrtc::voe::TransmitMixer* transmit_mixer)
-      : transmit_mixer_(transmit_mixer) {}
-  ~FakeWebRtcVoiceEngine() override {
-    RTC_CHECK(channels_.empty());
-  }
-
-  bool IsInited() const { return inited_; }
-  int GetLastChannel() const { return last_channel_; }
-  int GetNumChannels() const { return static_cast<int>(channels_.size()); }
-  void set_fail_create_channel(bool fail_create_channel) {
-    fail_create_channel_ = fail_create_channel;
-  }
-
-  WEBRTC_STUB(Release, ());
-
-  // webrtc::VoEBase
-  WEBRTC_STUB(RegisterVoiceEngineObserver, (
-      webrtc::VoiceEngineObserver& observer));
-  WEBRTC_STUB(DeRegisterVoiceEngineObserver, ());
-  WEBRTC_FUNC(Init,
-              (webrtc::AudioDeviceModule* adm,
-               webrtc::AudioProcessing* audioproc,
-               const rtc::scoped_refptr<webrtc::AudioDecoderFactory>&
-                   decoder_factory)) {
-    inited_ = true;
-    return 0;
-  }
-  WEBRTC_FUNC(Terminate, ()) {
-    inited_ = false;
-    return 0;
-  }
-  webrtc::AudioDeviceModule* audio_device_module() override {
-    return nullptr;
-  }
-  webrtc::voe::TransmitMixer* transmit_mixer() override {
-    return transmit_mixer_;
-  }
-  WEBRTC_FUNC(CreateChannel, ()) {
-    return CreateChannel(webrtc::VoEBase::ChannelConfig());
-  }
-  WEBRTC_FUNC(CreateChannel, (const webrtc::VoEBase::ChannelConfig& config)) {
-    if (fail_create_channel_) {
-      return -1;
-    }
-    Channel* ch = new Channel();
-    ch->neteq_capacity = config.acm_config.neteq_config.max_packets_in_buffer;
-    ch->neteq_fast_accelerate =
-        config.acm_config.neteq_config.enable_fast_accelerate;
-    channels_[++last_channel_] = ch;
-    return last_channel_;
-  }
-  WEBRTC_FUNC(DeleteChannel, (int channel)) {
-    WEBRTC_CHECK_CHANNEL(channel);
-    delete channels_[channel];
-    channels_.erase(channel);
-    return 0;
-  }
-  WEBRTC_STUB(StartReceive, (int channel));
-  WEBRTC_STUB(StartPlayout, (int channel));
-  WEBRTC_STUB(StartSend, (int channel));
-  WEBRTC_STUB(StopReceive, (int channel));
-  WEBRTC_STUB(StopPlayout, (int channel));
-  WEBRTC_STUB(StopSend, (int channel));
-  WEBRTC_STUB(GetVersion, (char version[1024]));
-  WEBRTC_STUB(LastError, ());
-  WEBRTC_STUB(AssociateSendChannel, (int channel,
-                                     int accociate_send_channel));
-
-  size_t GetNetEqCapacity() const {
-    auto ch = channels_.find(last_channel_);
-    RTC_DCHECK(ch != channels_.end());
-    return ch->second->neteq_capacity;
-  }
-  bool GetNetEqFastAccelerate() const {
-    auto ch = channels_.find(last_channel_);
-    RTC_CHECK(ch != channels_.end());
-    return ch->second->neteq_fast_accelerate;
-  }
-
- private:
-  bool inited_ = false;
-  int last_channel_ = -1;
-  std::map<int, Channel*> channels_;
-  bool fail_create_channel_ = false;
-  webrtc::voe::TransmitMixer* transmit_mixer_ = nullptr;
-
-  RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(FakeWebRtcVoiceEngine);
-};
-
-}  // namespace cricket
-
-#endif  // WEBRTC_MEDIA_ENGINE_FAKEWEBRTCVOICEENGINE_H_
diff --git a/media/engine/internaldecoderfactory.cc b/media/engine/internaldecoderfactory.cc
deleted file mode 100644
index 7a1c099..0000000
--- a/media/engine/internaldecoderfactory.cc
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- *  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/media/engine/internaldecoderfactory.h"
-
-#include <utility>
-
-#include "webrtc/modules/video_coding/codecs/h264/include/h264.h"
-#include "webrtc/modules/video_coding/codecs/vp8/include/vp8.h"
-#include "webrtc/modules/video_coding/codecs/vp9/include/vp9.h"
-#include "webrtc/rtc_base/logging.h"
-
-namespace cricket {
-
-namespace {
-
-// Video decoder class to be used for unknown codecs. Doesn't support decoding
-// but logs messages to LS_ERROR.
-class NullVideoDecoder : public webrtc::VideoDecoder {
- public:
-  int32_t InitDecode(const webrtc::VideoCodec* codec_settings,
-                     int32_t number_of_cores) override {
-    LOG(LS_ERROR) << "Can't initialize NullVideoDecoder.";
-    return WEBRTC_VIDEO_CODEC_OK;
-  }
-
-  int32_t Decode(const webrtc::EncodedImage& input_image,
-                 bool missing_frames,
-                 const webrtc::RTPFragmentationHeader* fragmentation,
-                 const webrtc::CodecSpecificInfo* codec_specific_info,
-                 int64_t render_time_ms) override {
-    LOG(LS_ERROR) << "The NullVideoDecoder doesn't support decoding.";
-    return WEBRTC_VIDEO_CODEC_OK;
-  }
-
-  int32_t RegisterDecodeCompleteCallback(
-      webrtc::DecodedImageCallback* callback) override {
-    LOG(LS_ERROR)
-        << "Can't register decode complete callback on NullVideoDecoder.";
-    return WEBRTC_VIDEO_CODEC_OK;
-  }
-
-  int32_t Release() override { return WEBRTC_VIDEO_CODEC_OK; }
-
-  const char* ImplementationName() const override { return "NullVideoDecoder"; }
-};
-
-}  // anonymous namespace
-
-InternalDecoderFactory::InternalDecoderFactory() {}
-
-InternalDecoderFactory::~InternalDecoderFactory() {}
-
-// WebRtcVideoDecoderFactory implementation.
-webrtc::VideoDecoder* InternalDecoderFactory::CreateVideoDecoder(
-    webrtc::VideoCodecType type) {
-  switch (type) {
-    case webrtc::kVideoCodecH264:
-      if (webrtc::H264Decoder::IsSupported())
-        return webrtc::H264Decoder::Create();
-      // This could happen in a software-fallback for a codec type only
-      // supported externally (e.g. H.264 on iOS or Android) or in current usage
-      // in WebRtcVideoEngine if the external decoder fails to be created.
-      LOG(LS_ERROR) << "Unable to create an H.264 decoder fallback. "
-                    << "Decoding of this stream will be broken.";
-      return new NullVideoDecoder();
-    case webrtc::kVideoCodecVP8:
-      return webrtc::VP8Decoder::Create();
-    case webrtc::kVideoCodecVP9:
-      RTC_DCHECK(webrtc::VP9Decoder::IsSupported());
-      return webrtc::VP9Decoder::Create();
-    default:
-      LOG(LS_ERROR) << "Creating NullVideoDecoder for unsupported codec.";
-      return new NullVideoDecoder();
-  }
-}
-
-void InternalDecoderFactory::DestroyVideoDecoder(
-    webrtc::VideoDecoder* decoder) {
-  delete decoder;
-}
-
-}  // namespace cricket
diff --git a/media/engine/internaldecoderfactory.h b/media/engine/internaldecoderfactory.h
deleted file mode 100644
index 20ceecc..0000000
--- a/media/engine/internaldecoderfactory.h
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- *  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_MEDIA_ENGINE_INTERNALDECODERFACTORY_H_
-#define WEBRTC_MEDIA_ENGINE_INTERNALDECODERFACTORY_H_
-
-#include <vector>
-
-#include "webrtc/media/engine/webrtcvideodecoderfactory.h"
-
-namespace cricket {
-
-class InternalDecoderFactory : public WebRtcVideoDecoderFactory {
- public:
-  InternalDecoderFactory();
-  virtual ~InternalDecoderFactory();
-
-  // WebRtcVideoDecoderFactory implementation.
-  webrtc::VideoDecoder* CreateVideoDecoder(
-      webrtc::VideoCodecType type) override;
-
-  void DestroyVideoDecoder(webrtc::VideoDecoder* decoder) override;
-};
-
-}  // namespace cricket
-
-#endif  // WEBRTC_MEDIA_ENGINE_INTERNALDECODERFACTORY_H_
diff --git a/media/engine/internaldecoderfactory_unittest.cc b/media/engine/internaldecoderfactory_unittest.cc
deleted file mode 100644
index bf1ca50..0000000
--- a/media/engine/internaldecoderfactory_unittest.cc
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- *  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/media/engine/internaldecoderfactory.h"
-
-#include "webrtc/test/gtest.h"
-
-TEST(InternalDecoderFactory, TestVP8) {
-  cricket::InternalDecoderFactory factory;
-  webrtc::VideoDecoder* decoder =
-      factory.CreateVideoDecoder(webrtc::kVideoCodecVP8);
-  EXPECT_TRUE(decoder);
-  factory.DestroyVideoDecoder(decoder);
-}
diff --git a/media/engine/internalencoderfactory.cc b/media/engine/internalencoderfactory.cc
deleted file mode 100644
index 004db79..0000000
--- a/media/engine/internalencoderfactory.cc
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- *  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/media/engine/internalencoderfactory.h"
-
-#include <utility>
-
-#include "webrtc/modules/video_coding/codecs/h264/include/h264.h"
-#include "webrtc/modules/video_coding/codecs/vp8/include/vp8.h"
-#include "webrtc/modules/video_coding/codecs/vp9/include/vp9.h"
-#include "webrtc/system_wrappers/include/field_trial.h"
-
-namespace cricket {
-
-namespace {
-
-// If this field trial is enabled, the "flexfec-03" codec will be advertised
-// as being supported by the InternalEncoderFactory. This means that
-// "flexfec-03" will appear in the default SDP offer, and we therefore need to
-// be ready to receive FlexFEC packets from the remote. It also means that
-// FlexFEC SSRCs will be generated by MediaSession and added as "a=ssrc:" and
-// "a=ssrc-group:" lines in the local SDP.
-bool IsFlexfecAdvertisedFieldTrialEnabled() {
-  return webrtc::field_trial::IsEnabled("WebRTC-FlexFEC-03-Advertised");
-}
-
-}  // namespace
-
-InternalEncoderFactory::InternalEncoderFactory() {
-  supported_codecs_.push_back(cricket::VideoCodec(kVp8CodecName));
-  if (webrtc::VP9Encoder::IsSupported())
-    supported_codecs_.push_back(cricket::VideoCodec(kVp9CodecName));
-  if (webrtc::H264Encoder::IsSupported()) {
-    cricket::VideoCodec codec(kH264CodecName);
-    // TODO(magjed): Move setting these parameters into webrtc::H264Encoder
-    // instead.
-    codec.SetParam(kH264FmtpProfileLevelId,
-                   kH264ProfileLevelConstrainedBaseline);
-    codec.SetParam(kH264FmtpLevelAsymmetryAllowed, "1");
-    supported_codecs_.push_back(std::move(codec));
-  }
-
-  supported_codecs_.push_back(cricket::VideoCodec(kRedCodecName));
-  supported_codecs_.push_back(cricket::VideoCodec(kUlpfecCodecName));
-
-  if (IsFlexfecAdvertisedFieldTrialEnabled()) {
-    cricket::VideoCodec flexfec_codec(kFlexfecCodecName);
-    // This value is currently arbitrarily set to 10 seconds. (The unit
-    // is microseconds.) This parameter MUST be present in the SDP, but
-    // we never use the actual value anywhere in our code however.
-    // TODO(brandtr): Consider honouring this value in the sender and receiver.
-    flexfec_codec.SetParam(kFlexfecFmtpRepairWindow, "10000000");
-    flexfec_codec.AddFeedbackParam(
-        FeedbackParam(kRtcpFbParamTransportCc, kParamValueEmpty));
-    flexfec_codec.AddFeedbackParam(
-        FeedbackParam(kRtcpFbParamRemb, kParamValueEmpty));
-    supported_codecs_.push_back(flexfec_codec);
-  }
-}
-
-InternalEncoderFactory::~InternalEncoderFactory() {}
-
-// WebRtcVideoEncoderFactory implementation.
-webrtc::VideoEncoder* InternalEncoderFactory::CreateVideoEncoder(
-    const cricket::VideoCodec& codec) {
-  const webrtc::VideoCodecType codec_type =
-      webrtc::PayloadStringToCodecType(codec.name);
-  switch (codec_type) {
-    case webrtc::kVideoCodecH264:
-      return webrtc::H264Encoder::Create(codec);
-    case webrtc::kVideoCodecVP8:
-      return webrtc::VP8Encoder::Create();
-    case webrtc::kVideoCodecVP9:
-      return webrtc::VP9Encoder::Create();
-    default:
-      return nullptr;
-  }
-}
-
-const std::vector<cricket::VideoCodec>&
-InternalEncoderFactory::supported_codecs() const {
-  return supported_codecs_;
-}
-
-void InternalEncoderFactory::DestroyVideoEncoder(
-    webrtc::VideoEncoder* encoder) {
-  delete encoder;
-}
-
-}  // namespace cricket
diff --git a/media/engine/internalencoderfactory.h b/media/engine/internalencoderfactory.h
deleted file mode 100644
index cfc6101..0000000
--- a/media/engine/internalencoderfactory.h
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- *  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_MEDIA_ENGINE_INTERNALENCODERFACTORY_H_
-#define WEBRTC_MEDIA_ENGINE_INTERNALENCODERFACTORY_H_
-
-#include <vector>
-
-#include "webrtc/media/engine/webrtcvideoencoderfactory.h"
-
-namespace cricket {
-
-class InternalEncoderFactory : public WebRtcVideoEncoderFactory {
- public:
-  InternalEncoderFactory();
-  virtual ~InternalEncoderFactory();
-
-  // WebRtcVideoEncoderFactory implementation.
-  webrtc::VideoEncoder* CreateVideoEncoder(
-      const cricket::VideoCodec& codec) override;
-  const std::vector<cricket::VideoCodec>& supported_codecs() const override;
-  void DestroyVideoEncoder(webrtc::VideoEncoder* encoder) override;
-
- private:
-  std::vector<cricket::VideoCodec> supported_codecs_;
-};
-
-}  // namespace cricket
-
-#endif  // WEBRTC_MEDIA_ENGINE_INTERNALENCODERFACTORY_H_
diff --git a/media/engine/nullwebrtcvideoengine.h b/media/engine/nullwebrtcvideoengine.h
deleted file mode 100644
index 9c687b9..0000000
--- a/media/engine/nullwebrtcvideoengine.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- *  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_MEDIA_ENGINE_NULLWEBRTCVIDEOENGINE_H_
-#define WEBRTC_MEDIA_ENGINE_NULLWEBRTCVIDEOENGINE_H_
-
-#include <vector>
-
-#include "webrtc/media/base/mediachannel.h"
-#include "webrtc/media/base/mediaengine.h"
-
-namespace webrtc {
-
-class Call;
-
-}  // namespace webrtc
-
-
-namespace cricket {
-
-class VideoMediaChannel;
-class WebRtcVideoDecoderFactory;
-class WebRtcVideoEncoderFactory;
-
-// Video engine implementation that does nothing and can be used in
-// CompositeMediaEngine.
-class NullWebRtcVideoEngine {
- public:
-  std::vector<VideoCodec> codecs() const { return std::vector<VideoCodec>(); }
-
-  RtpCapabilities GetCapabilities() const { return RtpCapabilities(); }
-
-  VideoMediaChannel* CreateChannel(webrtc::Call* call,
-                                   const MediaConfig& config,
-                                   const VideoOptions& options) {
-    return nullptr;
-  }
-};
-
-}  // namespace cricket
-
-#endif  // WEBRTC_MEDIA_ENGINE_NULLWEBRTCVIDEOENGINE_H_
diff --git a/media/engine/nullwebrtcvideoengine_unittest.cc b/media/engine/nullwebrtcvideoengine_unittest.cc
deleted file mode 100644
index 5fa7b01..0000000
--- a/media/engine/nullwebrtcvideoengine_unittest.cc
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- *  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/media/engine/nullwebrtcvideoengine.h"
-#include "webrtc/media/engine/webrtcvoiceengine.h"
-#include "webrtc/modules/audio_processing/include/audio_processing.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/mock_audio_decoder_factory.h"
-#include "webrtc/test/mock_audio_encoder_factory.h"
-
-namespace cricket {
-
-class WebRtcMediaEngineNullVideo
-    : public CompositeMediaEngine<WebRtcVoiceEngine, NullWebRtcVideoEngine> {
- public:
-  WebRtcMediaEngineNullVideo(
-      webrtc::AudioDeviceModule* adm,
-      const rtc::scoped_refptr<webrtc::AudioEncoderFactory>&
-          audio_encoder_factory,
-      const rtc::scoped_refptr<webrtc::AudioDecoderFactory>&
-          audio_decoder_factory)
-      : CompositeMediaEngine<WebRtcVoiceEngine, NullWebRtcVideoEngine>(
-            std::forward_as_tuple(adm,
-                                  audio_encoder_factory,
-                                  audio_decoder_factory,
-                                  nullptr,
-                                  webrtc::AudioProcessing::Create()),
-            std::forward_as_tuple()) {}
-};
-
-// Simple test to check if NullWebRtcVideoEngine implements the methods
-// required by CompositeMediaEngine.
-TEST(NullWebRtcVideoEngineTest, CheckInterface) {
-  WebRtcMediaEngineNullVideo engine(
-      nullptr, webrtc::MockAudioEncoderFactory::CreateUnusedFactory(),
-      webrtc::MockAudioDecoderFactory::CreateUnusedFactory());
-  EXPECT_TRUE(engine.Init());
-}
-
-}  // namespace cricket
diff --git a/media/engine/payload_type_mapper.cc b/media/engine/payload_type_mapper.cc
deleted file mode 100644
index 1dbc431..0000000
--- a/media/engine/payload_type_mapper.cc
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- *  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/media/engine/payload_type_mapper.h"
-
-#include "webrtc/api/audio_codecs/audio_format.h"
-#include "webrtc/common_types.h"
-#include "webrtc/media/base/mediaconstants.h"
-
-namespace cricket {
-
-webrtc::SdpAudioFormat AudioCodecToSdpAudioFormat(const AudioCodec& ac) {
-  return webrtc::SdpAudioFormat(ac.name, ac.clockrate, ac.channels, ac.params);
-}
-
-PayloadTypeMapper::PayloadTypeMapper()
-    // RFC 3551 reserves payload type numbers in the range 96-127 exclusively
-    // for dynamic assignment. Once those are used up, it is recommended that
-    // payload types unassigned by the RFC are used for dynamic payload type
-    // mapping, before any static payload ids. At this point, we only support
-    // mapping within the exclusive range.
-    : next_unused_payload_type_(96),
-      max_payload_type_(127),
-      mappings_({
-          // Static payload type assignments according to RFC 3551.
-          {{"PCMU",   8000, 1}, 0},
-          {{"GSM",    8000, 1}, 3},
-          {{"G723",   8000, 1}, 4},
-          {{"DVI4",   8000, 1}, 5},
-          {{"DVI4",  16000, 1}, 6},
-          {{"LPC",    8000, 1}, 7},
-          {{"PCMA",   8000, 1}, 8},
-          {{"G722",   8000, 1}, 9},
-          {{"L16",   44100, 2}, 10},
-          {{"L16",   44100, 1}, 11},
-          {{"QCELP",  8000, 1}, 12},
-          {{"CN",     8000, 1}, 13},
-          // RFC 4566 is a bit ambiguous on the contents of the "encoding
-          // parameters" field, which, for audio, encodes the number of
-          // channels. It is "optional and may be omitted if the number of
-          // channels is one". Does that necessarily imply that an omitted
-          // encoding parameter means one channel?  Since RFC 3551 doesn't
-          // specify a value for this parameter for MPA, I've included both 0
-          // and 1 here, to increase the chances it will be correctly used if
-          // someone implements an MPEG audio encoder/decoder.
-          {{"MPA",   90000, 0}, 14},
-          {{"MPA",   90000, 1}, 14},
-          {{"G728",   8000, 1}, 15},
-          {{"DVI4",  11025, 1}, 16},
-          {{"DVI4",  22050, 1}, 17},
-          {{"G729",   8000, 1}, 18},
-
-          // Payload type assignments currently used by WebRTC.
-          // Includes data to reduce collisions (and thus reassignments)
-          {{kGoogleRtpDataCodecName, 0, 0}, kGoogleRtpDataCodecPlType},
-          {{kIlbcCodecName,    8000, 1}, 102},
-          {{kIsacCodecName,   16000, 1}, 103},
-          {{kIsacCodecName,   32000, 1}, 104},
-          {{kCnCodecName,     16000, 1}, 105},
-          {{kCnCodecName,     32000, 1}, 106},
-          {{kGoogleSctpDataCodecName, 0, 0}, kGoogleSctpDataCodecPlType},
-          {{kOpusCodecName,   48000, 2,
-              {{"minptime", "10"}, {"useinbandfec", "1"}}}, 111},
-          // TODO(solenberg): Remove the hard coded 16k,32k,48k DTMF once we
-          // assign payload types dynamically for send side as well.
-          {{kDtmfCodecName,   48000, 1}, 110},
-          {{kDtmfCodecName,   32000, 1}, 112},
-          {{kDtmfCodecName,   16000, 1}, 113},
-          {{kDtmfCodecName,    8000, 1}, 126}}) {
-  // TODO(ossu): Try to keep this as change-proof as possible until we're able
-  // to remove the payload type constants from everywhere in the code.
-  for (const auto& mapping : mappings_) {
-    used_payload_types_.insert(mapping.second);
-  }
-}
-
-PayloadTypeMapper::~PayloadTypeMapper() = default;
-
-rtc::Optional<int> PayloadTypeMapper::GetMappingFor(
-    const webrtc::SdpAudioFormat& format) {
-  auto iter = mappings_.find(format);
-  if (iter != mappings_.end())
-    return rtc::Optional<int>(iter->second);
-
-  for (; next_unused_payload_type_ <= max_payload_type_;
-       ++next_unused_payload_type_) {
-    int payload_type = next_unused_payload_type_;
-    if (used_payload_types_.find(payload_type) == used_payload_types_.end()) {
-      used_payload_types_.insert(payload_type);
-      mappings_[format] = payload_type;
-      ++next_unused_payload_type_;
-      return rtc::Optional<int>(payload_type);
-    }
-  }
-
-  return rtc::Optional<int>();
-}
-
-rtc::Optional<int> PayloadTypeMapper::FindMappingFor(
-    const webrtc::SdpAudioFormat& format) const {
-  auto iter = mappings_.find(format);
-  if (iter != mappings_.end())
-    return rtc::Optional<int>(iter->second);
-
-  return rtc::Optional<int>();
-}
-
-rtc::Optional<AudioCodec> PayloadTypeMapper::ToAudioCodec(
-    const webrtc::SdpAudioFormat& format) {
-  // TODO(ossu): We can safely set bitrate to zero here, since that field is
-  // not presented in the SDP. It is used to ferry around some target bitrate
-  // values for certain codecs (ISAC and Opus) and in ways it really
-  // shouldn't. It should be removed once we no longer use CodecInsts in the
-  // ACM or NetEq.
-  auto opt_payload_type = GetMappingFor(format);
-  if (opt_payload_type) {
-    AudioCodec codec(*opt_payload_type, format.name, format.clockrate_hz, 0,
-                     format.num_channels);
-    codec.params = format.parameters;
-    return rtc::Optional<AudioCodec>(std::move(codec));
-  }
-
-  return rtc::Optional<AudioCodec>();
-}
-
-bool PayloadTypeMapper::SdpAudioFormatOrdering::operator()(
-    const webrtc::SdpAudioFormat& a,
-    const webrtc::SdpAudioFormat& b) const {
-  if (a.clockrate_hz == b.clockrate_hz) {
-    if (a.num_channels == b.num_channels) {
-      int name_cmp = STR_CASE_CMP(a.name.c_str(), b.name.c_str());
-      if (name_cmp == 0)
-        return a.parameters < b.parameters;
-      return name_cmp < 0;
-    }
-    return a.num_channels < b.num_channels;
-  }
-  return a.clockrate_hz < b.clockrate_hz;
-}
-
-}  // namespace cricket
diff --git a/media/engine/payload_type_mapper.h b/media/engine/payload_type_mapper.h
deleted file mode 100644
index 128f557..0000000
--- a/media/engine/payload_type_mapper.h
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- *  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_MEDIA_ENGINE_PAYLOAD_TYPE_MAPPER_H_
-#define WEBRTC_MEDIA_ENGINE_PAYLOAD_TYPE_MAPPER_H_
-
-#include <map>
-#include <set>
-
-#include "webrtc/api/audio_codecs/audio_format.h"
-#include "webrtc/api/optional.h"
-#include "webrtc/media/base/codec.h"
-
-namespace cricket {
-
-webrtc::SdpAudioFormat AudioCodecToSdpAudioFormat(const AudioCodec& ac);
-
-class PayloadTypeMapper {
- public:
-  PayloadTypeMapper();
-  ~PayloadTypeMapper();
-
-  // Finds the current payload type for |format| or assigns a new one, if no
-  // current mapping exists. Will return an empty value if it was unable to
-  // create a mapping, i.e. if all dynamic payload type ids have been used up.
-  rtc::Optional<int> GetMappingFor(const webrtc::SdpAudioFormat& format);
-
-  // Finds the current payload type for |format|, if any. Returns an empty value
-  // if no payload type mapping exists for the format.
-  rtc::Optional<int> FindMappingFor(const webrtc::SdpAudioFormat& format) const;
-
-  // Like GetMappingFor, but fills in an AudioCodec structure with the necessary
-  // information instead.
-  rtc::Optional<AudioCodec> ToAudioCodec(const webrtc::SdpAudioFormat& format);
-
- private:
-  struct SdpAudioFormatOrdering {
-    bool operator()(const webrtc::SdpAudioFormat& a,
-                    const webrtc::SdpAudioFormat& b) const;
-  };
-
-  int next_unused_payload_type_;
-  int max_payload_type_;
-  std::map<webrtc::SdpAudioFormat, int, SdpAudioFormatOrdering> mappings_;
-  std::set<int> used_payload_types_;
-};
-
-}  // namespace cricket
-#endif  // WEBRTC_MEDIA_ENGINE_PAYLOAD_TYPE_MAPPER_H_
diff --git a/media/engine/payload_type_mapper_unittest.cc b/media/engine/payload_type_mapper_unittest.cc
deleted file mode 100644
index 628eb0c..0000000
--- a/media/engine/payload_type_mapper_unittest.cc
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
- *  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 <set>
-#include <string>
-
-#include "webrtc/media/engine/payload_type_mapper.h"
-#include "webrtc/test/gtest.h"
-
-namespace cricket {
-
-class PayloadTypeMapperTest : public testing::Test {
- public:
-  // TODO(ossu): These are to work around missing comparison operators in
-  // rtc::Optional. They should be removed once Optional has been updated.
-  int FindMapping(const webrtc::SdpAudioFormat& format) {
-    auto opt_mapping = mapper_.FindMappingFor(format);
-    if (opt_mapping)
-      return *opt_mapping;
-    return -1;
-  }
-
-  int GetMapping(const webrtc::SdpAudioFormat& format) {
-    auto opt_mapping = mapper_.GetMappingFor(format);
-    if (opt_mapping)
-      return *opt_mapping;
-    return -1;
-  }
-
- protected:
-  PayloadTypeMapper mapper_;
-};
-
-TEST_F(PayloadTypeMapperTest, StaticPayloadTypes) {
-  EXPECT_EQ(0,  FindMapping({"pcmu",   8000, 1}));
-  EXPECT_EQ(3,  FindMapping({"gsm",    8000, 1}));
-  EXPECT_EQ(4,  FindMapping({"g723",   8000, 1}));
-  EXPECT_EQ(5,  FindMapping({"dvi4",   8000, 1}));
-  EXPECT_EQ(6,  FindMapping({"dvi4",  16000, 1}));
-  EXPECT_EQ(7,  FindMapping({"lpc",    8000, 1}));
-  EXPECT_EQ(8,  FindMapping({"pcma",   8000, 1}));
-  EXPECT_EQ(9,  FindMapping({"g722",   8000, 1}));
-  EXPECT_EQ(10, FindMapping({"l16",   44100, 2}));
-  EXPECT_EQ(11, FindMapping({"l16",   44100, 1}));
-  EXPECT_EQ(12, FindMapping({"qcelp",  8000, 1}));
-  EXPECT_EQ(13, FindMapping({"cn",     8000, 1}));
-  EXPECT_EQ(14, FindMapping({"mpa",   90000, 0}));
-  EXPECT_EQ(14, FindMapping({"mpa",   90000, 1}));
-  EXPECT_EQ(15, FindMapping({"g728",   8000, 1}));
-  EXPECT_EQ(16, FindMapping({"dvi4",  11025, 1}));
-  EXPECT_EQ(17, FindMapping({"dvi4",  22050, 1}));
-  EXPECT_EQ(18, FindMapping({"g729",   8000, 1}));
-}
-
-TEST_F(PayloadTypeMapperTest, WebRTCPayloadTypes) {
-  // Tests that the payload mapper knows about the audio and data formats we've
-  // been using in WebRTC, with their hard coded values.
-  auto data_mapping = [this] (const char *name) {
-    return FindMapping({name, 0, 0});
-  };
-  EXPECT_EQ(kGoogleRtpDataCodecPlType, data_mapping(kGoogleRtpDataCodecName));
-  EXPECT_EQ(kGoogleSctpDataCodecPlType, data_mapping(kGoogleSctpDataCodecName));
-
-  EXPECT_EQ(102, FindMapping({kIlbcCodecName,  8000, 1}));
-  EXPECT_EQ(103, FindMapping({kIsacCodecName, 16000, 1}));
-  EXPECT_EQ(104, FindMapping({kIsacCodecName, 32000, 1}));
-  EXPECT_EQ(105, FindMapping({kCnCodecName,   16000, 1}));
-  EXPECT_EQ(106, FindMapping({kCnCodecName,   32000, 1}));
-  EXPECT_EQ(111, FindMapping({kOpusCodecName, 48000, 2,
-        {{"minptime", "10"}, {"useinbandfec", "1"}}}));
-  // TODO(solenberg): Remove 16k, 32k, 48k DTMF checks once these payload types
-  // are dynamically assigned.
-  EXPECT_EQ(110, FindMapping({kDtmfCodecName, 48000, 1}));
-  EXPECT_EQ(112, FindMapping({kDtmfCodecName, 32000, 1}));
-  EXPECT_EQ(113, FindMapping({kDtmfCodecName, 16000, 1}));
-  EXPECT_EQ(126, FindMapping({kDtmfCodecName, 8000, 1}));
-}
-
-TEST_F(PayloadTypeMapperTest, ValidDynamicPayloadTypes) {
-  // RFC 3551 says:
-  // "This profile reserves payload type numbers in the range 96-127
-  // exclusively for dynamic assignment.  Applications SHOULD first use
-  // values in this range for dynamic payload types.  Those applications
-  // which need to define more than 32 dynamic payload types MAY bind
-  // codes below 96, in which case it is RECOMMENDED that unassigned
-  // payload type numbers be used first.  However, the statically assigned
-  // payload types are default bindings and MAY be dynamically bound to
-  // new encodings if needed."
-
-  // Tests that the payload mapper uses values in the dynamic payload type range
-  // (96 - 127) before any others and that the values returned are all valid.
-  bool has_been_below_96 = false;
-  std::set<int> used_payload_types;
-  for (int i = 0; i != 256; ++i) {
-    std::string format_name = "unknown_format_" + std::to_string(i);
-    webrtc::SdpAudioFormat format(format_name.c_str(), i*100, (i % 2) + 1);
-    auto opt_payload_type = mapper_.GetMappingFor(format);
-    bool mapper_is_full = false;
-
-    // There's a limited number of slots for payload types. We're fine with not
-    // being able to map them all.
-    if (opt_payload_type) {
-      int payload_type = *opt_payload_type;
-      EXPECT_FALSE(mapper_is_full) << "Mapping should not fail sporadically";
-      EXPECT_EQ(used_payload_types.find(payload_type), used_payload_types.end())
-          << "Payload types must not be reused";
-      used_payload_types.insert(payload_type);
-      EXPECT_GE(payload_type, 0) << "Negative payload types are invalid";
-      EXPECT_LE(payload_type, 127) << "Payload types above 127 are invalid";
-      EXPECT_FALSE(payload_type >= 96 && has_been_below_96);
-      if (payload_type < 96)
-        has_been_below_96 = true;
-
-      EXPECT_EQ(payload_type, FindMapping(format))
-          << "Mapping must be permanent after successful call to "
-             "GetMappingFor";
-      EXPECT_EQ(payload_type, GetMapping(format))
-          << "Subsequent calls to GetMappingFor must return the same value";
-    } else {
-      mapper_is_full = true;
-    }
-  }
-
-  // Also, we must've been able to map at least one dynamic payload type.
-  EXPECT_FALSE(used_payload_types.empty())
-      << "Mapper must support at least one user-defined payload type";
-}
-
-TEST_F(PayloadTypeMapperTest, ToAudioCodec) {
-  webrtc::SdpAudioFormat format("unknown_format", 4711, 17);
-  auto opt_payload_type = mapper_.GetMappingFor(format);
-  EXPECT_TRUE(opt_payload_type);
-  auto opt_audio_codec = mapper_.ToAudioCodec(format);
-  EXPECT_TRUE(opt_audio_codec);
-
-  if (opt_payload_type && opt_audio_codec) {
-    int payload_type        = *opt_payload_type;
-    const AudioCodec& codec = *opt_audio_codec;
-
-    EXPECT_EQ(codec.id, payload_type);
-    EXPECT_EQ(codec.name, format.name);
-    EXPECT_EQ(codec.clockrate, format.clockrate_hz);
-    EXPECT_EQ(codec.channels, format.num_channels);
-    EXPECT_EQ(codec.params, format.parameters);
-  }
-}
-
-}  // namespace cricket
diff --git a/media/engine/scopedvideodecoder.cc b/media/engine/scopedvideodecoder.cc
deleted file mode 100644
index b328286..0000000
--- a/media/engine/scopedvideodecoder.cc
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- *  Copyright (c) 2017 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/media/engine/scopedvideodecoder.h"
-
-#include <vector>
-
-#include "webrtc/api/video_codecs/video_decoder.h"
-
-namespace cricket {
-
-namespace {
-
-class ScopedVideoDecoder : public webrtc::VideoDecoder {
- public:
-  ScopedVideoDecoder(WebRtcVideoDecoderFactory* factory,
-                     webrtc::VideoDecoder* decoder);
-
-  int32_t InitDecode(const webrtc::VideoCodec* codec_settings,
-                     int32_t number_of_cores) override;
-  int32_t RegisterDecodeCompleteCallback(
-      webrtc::DecodedImageCallback* callback) override;
-  int32_t Release() override;
-  int32_t Decode(const webrtc::EncodedImage& input_image,
-                 bool missing_frames,
-                 const webrtc::RTPFragmentationHeader* fragmentation,
-                 const webrtc::CodecSpecificInfo* codec_specific_info,
-                 int64_t render_time_ms) override;
-  bool PrefersLateDecoding() const override;
-  const char* ImplementationName() const override;
-
-  ~ScopedVideoDecoder() override;
-
- private:
-  WebRtcVideoDecoderFactory* factory_;
-  webrtc::VideoDecoder* decoder_;
-};
-
-ScopedVideoDecoder::ScopedVideoDecoder(WebRtcVideoDecoderFactory* factory,
-                                       webrtc::VideoDecoder* decoder)
-    : factory_(factory), decoder_(decoder) {}
-
-int32_t ScopedVideoDecoder::InitDecode(const webrtc::VideoCodec* codec_settings,
-                                       int32_t number_of_cores) {
-  return decoder_->InitDecode(codec_settings, number_of_cores);
-}
-
-int32_t ScopedVideoDecoder::RegisterDecodeCompleteCallback(
-    webrtc::DecodedImageCallback* callback) {
-  return decoder_->RegisterDecodeCompleteCallback(callback);
-}
-
-int32_t ScopedVideoDecoder::Release() {
-  return decoder_->Release();
-}
-
-int32_t ScopedVideoDecoder::Decode(
-    const webrtc::EncodedImage& input_image,
-    bool missing_frames,
-    const webrtc::RTPFragmentationHeader* fragmentation,
-    const webrtc::CodecSpecificInfo* codec_specific_info,
-    int64_t render_time_ms) {
-  return decoder_->Decode(input_image, missing_frames, fragmentation,
-                          codec_specific_info, render_time_ms);
-}
-
-bool ScopedVideoDecoder::PrefersLateDecoding() const {
-  return decoder_->PrefersLateDecoding();
-}
-
-const char* ScopedVideoDecoder::ImplementationName() const {
-  return decoder_->ImplementationName();
-}
-
-ScopedVideoDecoder::~ScopedVideoDecoder() {
-  factory_->DestroyVideoDecoder(decoder_);
-}
-
-}  // namespace
-
-std::unique_ptr<webrtc::VideoDecoder> CreateScopedVideoDecoder(
-    WebRtcVideoDecoderFactory* factory,
-    const VideoCodec& codec,
-    VideoDecoderParams params) {
-  webrtc::VideoDecoder* decoder =
-      factory->CreateVideoDecoderWithParams(codec, params);
-  if (!decoder)
-    return nullptr;
-  return std::unique_ptr<webrtc::VideoDecoder>(
-      new ScopedVideoDecoder(factory, decoder));
-}
-
-}  // namespace cricket
diff --git a/media/engine/scopedvideodecoder.h b/media/engine/scopedvideodecoder.h
deleted file mode 100644
index c76c9fc..0000000
--- a/media/engine/scopedvideodecoder.h
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- *  Copyright (c) 2017 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_MEDIA_ENGINE_SCOPEDVIDEODECODER_H_
-#define WEBRTC_MEDIA_ENGINE_SCOPEDVIDEODECODER_H_
-
-#include <memory>
-
-#include "webrtc/media/engine/webrtcvideodecoderfactory.h"
-
-namespace cricket {
-
-// Helper function that creates a webrtc::VideoDecoder held by an
-// std::unique_ptr instead of having to be deleted through
-// WebRtcVideoDecoderFactory::DestroyVideoDecoder. The factory passed in must
-// outlive the returned encoder.
-// TODO(andersc): This helper function will be deleted once
-// cricket::WebRtcVideoDecoderFactory is deprecated, see
-// https://bugs.chromium.org/p/webrtc/issues/detail?id=7925 for more info.
-std::unique_ptr<webrtc::VideoDecoder> CreateScopedVideoDecoder(
-    cricket::WebRtcVideoDecoderFactory* factory,
-    const VideoCodec& codec,
-    VideoDecoderParams params);
-
-}  // namespace cricket
-
-#endif  // WEBRTC_MEDIA_ENGINE_SCOPEDVIDEODECODER_H_
diff --git a/media/engine/scopedvideoencoder.cc b/media/engine/scopedvideoencoder.cc
deleted file mode 100644
index 0c07d8c..0000000
--- a/media/engine/scopedvideoencoder.cc
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
- *  Copyright (c) 2017 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/media/engine/scopedvideoencoder.h"
-
-#include <vector>
-
-#include "webrtc/api/video_codecs/video_encoder.h"
-
-namespace cricket {
-
-namespace {
-
-class ScopedVideoEncoder : public webrtc::VideoEncoder {
- public:
-  ScopedVideoEncoder(WebRtcVideoEncoderFactory* factory,
-                     webrtc::VideoEncoder* encoder);
-
-  int32_t InitEncode(const webrtc::VideoCodec* codec_settings,
-                     int32_t number_of_cores,
-                     size_t max_payload_size) override;
-  int32_t RegisterEncodeCompleteCallback(
-      webrtc::EncodedImageCallback* callback) override;
-  int32_t Release() override;
-  int32_t Encode(const webrtc::VideoFrame& frame,
-                 const webrtc::CodecSpecificInfo* codec_specific_info,
-                 const std::vector<webrtc::FrameType>* frame_types) override;
-  int32_t SetChannelParameters(uint32_t packet_loss, int64_t rtt) override;
-  int32_t SetRates(uint32_t bitrate, uint32_t framerate) override;
-  int32_t SetRateAllocation(const webrtc::BitrateAllocation& allocation,
-                            uint32_t framerate) override;
-  ScalingSettings GetScalingSettings() const override;
-  int32_t SetPeriodicKeyFrames(bool enable) override;
-  bool SupportsNativeHandle() const override;
-  const char* ImplementationName() const override;
-
-  ~ScopedVideoEncoder() override;
-
- private:
-  WebRtcVideoEncoderFactory* factory_;
-  webrtc::VideoEncoder* encoder_;
-};
-
-ScopedVideoEncoder::ScopedVideoEncoder(WebRtcVideoEncoderFactory* factory,
-                                       webrtc::VideoEncoder* encoder)
-    : factory_(factory), encoder_(encoder) {}
-
-int32_t ScopedVideoEncoder::InitEncode(const webrtc::VideoCodec* codec_settings,
-                                       int32_t number_of_cores,
-                                       size_t max_payload_size) {
-  return encoder_->InitEncode(codec_settings, number_of_cores,
-                              max_payload_size);
-}
-
-int32_t ScopedVideoEncoder::RegisterEncodeCompleteCallback(
-    webrtc::EncodedImageCallback* callback) {
-  return encoder_->RegisterEncodeCompleteCallback(callback);
-}
-
-int32_t ScopedVideoEncoder::Release() {
-  return encoder_->Release();
-}
-
-int32_t ScopedVideoEncoder::Encode(
-    const webrtc::VideoFrame& frame,
-    const webrtc::CodecSpecificInfo* codec_specific_info,
-    const std::vector<webrtc::FrameType>* frame_types) {
-  return encoder_->Encode(frame, codec_specific_info, frame_types);
-}
-
-int32_t ScopedVideoEncoder::SetChannelParameters(uint32_t packet_loss,
-                                                 int64_t rtt) {
-  return encoder_->SetChannelParameters(packet_loss, rtt);
-}
-
-int32_t ScopedVideoEncoder::SetRates(uint32_t bitrate, uint32_t framerate) {
-  return encoder_->SetRates(bitrate, framerate);
-}
-
-int32_t ScopedVideoEncoder::SetRateAllocation(
-    const webrtc::BitrateAllocation& allocation,
-    uint32_t framerate) {
-  return encoder_->SetRateAllocation(allocation, framerate);
-}
-
-webrtc::VideoEncoder::ScalingSettings ScopedVideoEncoder::GetScalingSettings()
-    const {
-  return encoder_->GetScalingSettings();
-}
-
-int32_t ScopedVideoEncoder::SetPeriodicKeyFrames(bool enable) {
-  return encoder_->SetPeriodicKeyFrames(enable);
-}
-
-bool ScopedVideoEncoder::SupportsNativeHandle() const {
-  return encoder_->SupportsNativeHandle();
-}
-
-const char* ScopedVideoEncoder::ImplementationName() const {
-  return encoder_->ImplementationName();
-}
-
-ScopedVideoEncoder::~ScopedVideoEncoder() {
-  factory_->DestroyVideoEncoder(encoder_);
-}
-
-}  // namespace
-
-std::unique_ptr<webrtc::VideoEncoder> CreateScopedVideoEncoder(
-    WebRtcVideoEncoderFactory* factory,
-    const VideoCodec& codec) {
-  webrtc::VideoEncoder* encoder = factory->CreateVideoEncoder(codec);
-  if (!encoder)
-    return nullptr;
-  return std::unique_ptr<webrtc::VideoEncoder>(
-      new ScopedVideoEncoder(factory, encoder));
-}
-
-}  // namespace cricket
diff --git a/media/engine/scopedvideoencoder.h b/media/engine/scopedvideoencoder.h
deleted file mode 100644
index f0ff40f..0000000
--- a/media/engine/scopedvideoencoder.h
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- *  Copyright (c) 2017 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_MEDIA_ENGINE_SCOPEDVIDEOENCODER_H_
-#define WEBRTC_MEDIA_ENGINE_SCOPEDVIDEOENCODER_H_
-
-#include <memory>
-
-#include "webrtc/media/engine/webrtcvideoencoderfactory.h"
-
-namespace cricket {
-
-// Helper function that creates a webrtc::VideoEncoder held by an
-// std::unique_ptr instead of having to be deleted through
-// WebRtcVideoEncoderFactory::DestroyVideoEncoder. The factory passed in must
-// outlive the returned encoder.
-// TODO(magjed): This helper function will be deleted once
-// cricket::WebRtcVideoEncoderFactory is deprecated, see
-// https://bugs.chromium.org/p/webrtc/issues/detail?id=7925 for more info.
-std::unique_ptr<webrtc::VideoEncoder> CreateScopedVideoEncoder(
-    cricket::WebRtcVideoEncoderFactory* factory,
-    const VideoCodec& codec);
-
-}  // namespace cricket
-
-#endif  // WEBRTC_MEDIA_ENGINE_SCOPEDVIDEOENCODER_H_
diff --git a/media/engine/simulcast.cc b/media/engine/simulcast.cc
deleted file mode 100644
index f25eaf9..0000000
--- a/media/engine/simulcast.cc
+++ /dev/null
@@ -1,335 +0,0 @@
-/*
- *  Copyright (c) 2014 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 <stdio.h>
-
-#include "webrtc/media/base/streamparams.h"
-#include "webrtc/media/engine/constants.h"
-#include "webrtc/media/engine/simulcast.h"
-#include "webrtc/rtc_base/arraysize.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/system_wrappers/include/field_trial.h"
-
-namespace cricket {
-
-struct SimulcastFormat {
-  int width;
-  int height;
-  // The maximum number of simulcast layers can be used for
-  // resolutions at |widthxheigh|.
-  size_t max_layers;
-  // The maximum bitrate for encoding stream at |widthxheight|, when we are
-  // not sending the next higher spatial stream.
-  int max_bitrate_kbps;
-  // The target bitrate for encoding stream at |widthxheight|, when this layer
-  // is not the highest layer (i.e., when we are sending another higher spatial
-  // stream).
-  int target_bitrate_kbps;
-  // The minimum bitrate needed for encoding stream at |widthxheight|.
-  int min_bitrate_kbps;
-};
-
-// These tables describe from which resolution we can use how many
-// simulcast layers at what bitrates (maximum, target, and minimum).
-// Important!! Keep this table from high resolution to low resolution.
-const SimulcastFormat kSimulcastFormats[] = {
-  {1920, 1080, 3, 5000, 4000, 800},
-  {1280, 720, 3,  2500, 2500, 600},
-  {960, 540, 3, 900, 900, 450},
-  {640, 360, 2, 700, 500, 150},
-  {480, 270, 2, 450, 350, 150},
-  {320, 180, 1, 200, 150, 30},
-  {0, 0, 1, 200, 150, 30}
-};
-
-const int kMaxScreenshareSimulcastStreams = 2;
-
-// Multiway: Number of temporal layers for each simulcast stream, for maximum
-// possible number of simulcast streams |kMaxSimulcastStreams|. The array
-// goes from lowest resolution at position 0 to highest resolution.
-// For example, first three elements correspond to say: QVGA, VGA, WHD.
-static const int
-    kDefaultConferenceNumberOfTemporalLayers[webrtc::kMaxSimulcastStreams] =
-    {3, 3, 3, 3};
-
-void GetSimulcastSsrcs(const StreamParams& sp, std::vector<uint32_t>* ssrcs) {
-  const SsrcGroup* sim_group = sp.get_ssrc_group(kSimSsrcGroupSemantics);
-  if (sim_group) {
-    ssrcs->insert(
-        ssrcs->end(), sim_group->ssrcs.begin(), sim_group->ssrcs.end());
-  }
-}
-
-void MaybeExchangeWidthHeight(int* width, int* height) {
-  // |kSimulcastFormats| assumes |width| >= |height|. If not, exchange them
-  // before comparing.
-  if (*width < *height) {
-    int temp = *width;
-    *width = *height;
-    *height = temp;
-  }
-}
-
-int FindSimulcastFormatIndex(int width, int height) {
-  MaybeExchangeWidthHeight(&width, &height);
-
-  for (uint32_t i = 0; i < arraysize(kSimulcastFormats); ++i) {
-    if (width * height >=
-        kSimulcastFormats[i].width * kSimulcastFormats[i].height) {
-      return i;
-    }
-  }
-  return -1;
-}
-
-int FindSimulcastFormatIndex(int width, int height, size_t max_layers) {
-  MaybeExchangeWidthHeight(&width, &height);
-
-  for (uint32_t i = 0; i < arraysize(kSimulcastFormats); ++i) {
-    if (width * height >=
-            kSimulcastFormats[i].width * kSimulcastFormats[i].height &&
-        max_layers == kSimulcastFormats[i].max_layers) {
-      return i;
-    }
-  }
-  return -1;
-}
-
-// Simulcast stream width and height must both be dividable by
-// |2 ^ simulcast_layers - 1|.
-int NormalizeSimulcastSize(int size, size_t simulcast_layers) {
-  const int base2_exponent = static_cast<int>(simulcast_layers) - 1;
-  return ((size >> base2_exponent) << base2_exponent);
-}
-
-size_t FindSimulcastMaxLayers(int width, int height) {
-  int index = FindSimulcastFormatIndex(width, height);
-  if (index == -1) {
-    return -1;
-  }
-  return kSimulcastFormats[index].max_layers;
-}
-
-// TODO(marpan): Investigate if we should return 0 instead of -1 in
-// FindSimulcast[Max/Target/Min]Bitrate functions below, since the
-// codec struct max/min/targeBitrates are unsigned.
-int FindSimulcastMaxBitrateBps(int width, int height) {
-  const int format_index = FindSimulcastFormatIndex(width, height);
-  if (format_index == -1) {
-    return -1;
-  }
-  return kSimulcastFormats[format_index].max_bitrate_kbps * 1000;
-}
-
-int FindSimulcastTargetBitrateBps(int width, int height) {
-  const int format_index = FindSimulcastFormatIndex(width, height);
-  if (format_index == -1) {
-    return -1;
-  }
-  return kSimulcastFormats[format_index].target_bitrate_kbps * 1000;
-}
-
-int FindSimulcastMinBitrateBps(int width, int height) {
-  const int format_index = FindSimulcastFormatIndex(width, height);
-  if (format_index == -1) {
-    return -1;
-  }
-  return kSimulcastFormats[format_index].min_bitrate_kbps * 1000;
-}
-
-bool SlotSimulcastMaxResolution(size_t max_layers, int* width, int* height) {
-  int index = FindSimulcastFormatIndex(*width, *height, max_layers);
-  if (index == -1) {
-    LOG(LS_ERROR) << "SlotSimulcastMaxResolution";
-    return false;
-  }
-
-  *width = kSimulcastFormats[index].width;
-  *height = kSimulcastFormats[index].height;
-  LOG(LS_INFO) << "SlotSimulcastMaxResolution to width:" << *width
-               << " height:" << *height;
-  return true;
-}
-
-int GetTotalMaxBitrateBps(const std::vector<webrtc::VideoStream>& streams) {
-  int total_max_bitrate_bps = 0;
-  for (size_t s = 0; s < streams.size() - 1; ++s) {
-    total_max_bitrate_bps += streams[s].target_bitrate_bps;
-  }
-  total_max_bitrate_bps += streams.back().max_bitrate_bps;
-  return total_max_bitrate_bps;
-}
-
-std::vector<webrtc::VideoStream> GetSimulcastConfig(size_t max_streams,
-                                                    int width,
-                                                    int height,
-                                                    int max_bitrate_bps,
-                                                    int max_qp,
-                                                    int max_framerate,
-                                                    bool is_screencast) {
-  size_t num_simulcast_layers;
-  if (is_screencast) {
-    if (UseSimulcastScreenshare()) {
-      num_simulcast_layers =
-          std::min<int>(max_streams, kMaxScreenshareSimulcastStreams);
-    } else {
-      num_simulcast_layers = 1;
-    }
-  } else {
-    num_simulcast_layers = FindSimulcastMaxLayers(width, height);
-  }
-
-  if (num_simulcast_layers > max_streams) {
-    // If the number of SSRCs in the group differs from our target
-    // number of simulcast streams for current resolution, switch down
-    // to a resolution that matches our number of SSRCs.
-    if (!SlotSimulcastMaxResolution(max_streams, &width, &height)) {
-      return std::vector<webrtc::VideoStream>();
-    }
-    num_simulcast_layers = max_streams;
-  }
-  std::vector<webrtc::VideoStream> streams;
-  streams.resize(num_simulcast_layers);
-
-  if (is_screencast) {
-    ScreenshareLayerConfig config = ScreenshareLayerConfig::GetDefault();
-    // For legacy screenshare in conference mode, tl0 and tl1 bitrates are
-    // piggybacked on the VideoCodec struct as target and max bitrates,
-    // respectively. See eg. webrtc::VP8EncoderImpl::SetRates().
-    streams[0].width = width;
-    streams[0].height = height;
-    streams[0].max_qp = max_qp;
-    streams[0].max_framerate = 5;
-    streams[0].min_bitrate_bps = kMinVideoBitrateKbps * 1000;
-    streams[0].target_bitrate_bps = config.tl0_bitrate_kbps * 1000;
-    streams[0].max_bitrate_bps = config.tl1_bitrate_kbps * 1000;
-    streams[0].temporal_layer_thresholds_bps.clear();
-    streams[0].temporal_layer_thresholds_bps.push_back(config.tl0_bitrate_kbps *
-                                                       1000);
-
-    // With simulcast enabled, add another spatial layer. This one will have a
-    // more normal layout, with the regular 3 temporal layer pattern and no fps
-    // restrictions. The base simulcast stream will still use legacy setup.
-    if (num_simulcast_layers == kMaxScreenshareSimulcastStreams) {
-      // Add optional upper simulcast layer.
-      // Lowest temporal layers of a 3 layer setup will have 40% of the total
-      // bitrate allocation for that stream. Make sure the gap between the
-      // target of the lower stream and first temporal layer of the higher one
-      // is at most 2x the bitrate, so that upswitching is not hampered by
-      // stalled bitrate estimates.
-      int max_bitrate_bps = 2 * ((streams[0].target_bitrate_bps * 10) / 4);
-      // Cap max bitrate so it isn't overly high for the given resolution.
-      max_bitrate_bps = std::min<int>(
-          max_bitrate_bps, FindSimulcastMaxBitrateBps(width, height));
-
-      streams[1].width = width;
-      streams[1].height = height;
-      streams[1].max_qp = max_qp;
-      streams[1].max_framerate = max_framerate;
-      // Three temporal layers means two thresholds.
-      streams[1].temporal_layer_thresholds_bps.resize(2);
-      streams[1].min_bitrate_bps = streams[0].target_bitrate_bps * 2;
-      streams[1].target_bitrate_bps = max_bitrate_bps;
-      streams[1].max_bitrate_bps = max_bitrate_bps;
-    }
-  } else {
-    // Format width and height has to be divisible by |2 ^ number_streams - 1|.
-    width = NormalizeSimulcastSize(width, num_simulcast_layers);
-    height = NormalizeSimulcastSize(height, num_simulcast_layers);
-
-    // Add simulcast sub-streams from lower resolution to higher resolutions.
-    // Add simulcast streams, from highest resolution (|s| = number_streams -1)
-    // to lowest resolution at |s| = 0.
-    for (size_t s = num_simulcast_layers - 1;; --s) {
-      streams[s].width = width;
-      streams[s].height = height;
-      // TODO(pbos): Fill actual temporal-layer bitrate thresholds.
-      streams[s].max_qp = max_qp;
-      streams[s].temporal_layer_thresholds_bps.resize(
-          kDefaultConferenceNumberOfTemporalLayers[s] - 1);
-      streams[s].max_bitrate_bps = FindSimulcastMaxBitrateBps(width, height);
-      streams[s].target_bitrate_bps =
-          FindSimulcastTargetBitrateBps(width, height);
-      streams[s].min_bitrate_bps = FindSimulcastMinBitrateBps(width, height);
-      streams[s].max_framerate = max_framerate;
-
-      width /= 2;
-      height /= 2;
-
-      if (s == 0)
-        break;
-    }
-
-    // Spend additional bits to boost the max stream.
-    int bitrate_left_bps = max_bitrate_bps - GetTotalMaxBitrateBps(streams);
-    if (bitrate_left_bps > 0) {
-      streams.back().max_bitrate_bps += bitrate_left_bps;
-    }
-  }
-
-  return streams;
-}
-
-static const int kScreenshareMinBitrateKbps = 50;
-static const int kScreenshareMaxBitrateKbps = 6000;
-static const int kScreenshareDefaultTl0BitrateKbps = 200;
-static const int kScreenshareDefaultTl1BitrateKbps = 1000;
-
-static const char* kScreencastLayerFieldTrialName =
-    "WebRTC-ScreenshareLayerRates";
-static const char* kSimulcastScreenshareFieldTrialName =
-    "WebRTC-SimulcastScreenshare";
-
-ScreenshareLayerConfig::ScreenshareLayerConfig(int tl0_bitrate, int tl1_bitrate)
-    : tl0_bitrate_kbps(tl0_bitrate), tl1_bitrate_kbps(tl1_bitrate) {
-}
-
-ScreenshareLayerConfig ScreenshareLayerConfig::GetDefault() {
-  std::string group =
-      webrtc::field_trial::FindFullName(kScreencastLayerFieldTrialName);
-
-  ScreenshareLayerConfig config(kScreenshareDefaultTl0BitrateKbps,
-                                kScreenshareDefaultTl1BitrateKbps);
-  if (!group.empty() && !FromFieldTrialGroup(group, &config)) {
-    LOG(LS_WARNING) << "Unable to parse WebRTC-ScreenshareLayerRates"
-                       " field trial group: '" << group << "'.";
-  }
-  return config;
-}
-
-bool ScreenshareLayerConfig::FromFieldTrialGroup(
-    const std::string& group,
-    ScreenshareLayerConfig* config) {
-  // Parse field trial group name, containing bitrates for tl0 and tl1.
-  int tl0_bitrate;
-  int tl1_bitrate;
-  if (sscanf(group.c_str(), "%d-%d", &tl0_bitrate, &tl1_bitrate) != 2) {
-    return false;
-  }
-
-  // Sanity check.
-  if (tl0_bitrate < kScreenshareMinBitrateKbps ||
-      tl0_bitrate > kScreenshareMaxBitrateKbps ||
-      tl1_bitrate < kScreenshareMinBitrateKbps ||
-      tl1_bitrate > kScreenshareMaxBitrateKbps || tl0_bitrate > tl1_bitrate) {
-    return false;
-  }
-
-  config->tl0_bitrate_kbps = tl0_bitrate;
-  config->tl1_bitrate_kbps = tl1_bitrate;
-
-  return true;
-}
-
-bool UseSimulcastScreenshare() {
-  return webrtc::field_trial::IsEnabled(kSimulcastScreenshareFieldTrialName);
-}
-
-}  // namespace cricket
diff --git a/media/engine/simulcast.h b/media/engine/simulcast.h
deleted file mode 100644
index 81668e4..0000000
--- a/media/engine/simulcast.h
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- *  Copyright (c) 2014 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_MEDIA_ENGINE_SIMULCAST_H_
-#define WEBRTC_MEDIA_ENGINE_SIMULCAST_H_
-
-#include <vector>
-
-#include "webrtc/call/video_config.h"
-#include "webrtc/rtc_base/basictypes.h"
-
-namespace cricket {
-struct StreamParams;
-
-// TODO(sprang): Remove this, as we're moving away from temporal layer mode.
-// Config for use with screen cast when temporal layers are enabled.
-struct ScreenshareLayerConfig {
- public:
-  ScreenshareLayerConfig(int tl0_bitrate, int tl1_bitrate);
-
-  // Bitrates, for temporal layers 0 and 1.
-  int tl0_bitrate_kbps;
-  int tl1_bitrate_kbps;
-
-  static ScreenshareLayerConfig GetDefault();
-
-  // Parse bitrate from group name on format "(tl0_bitrate)-(tl1_bitrate)",
-  // eg. "100-1000" for the default rates.
-  static bool FromFieldTrialGroup(const std::string& group,
-                                  ScreenshareLayerConfig* config);
-};
-
-// TODO(pthatcher): Write unit tests just for these functions,
-// independent of WebrtcVideoEngine.
-
-int GetTotalMaxBitrateBps(const std::vector<webrtc::VideoStream>& streams);
-
-// Get the ssrcs of the SIM group from the stream params.
-void GetSimulcastSsrcs(const StreamParams& sp, std::vector<uint32_t>* ssrcs);
-
-// Get simulcast settings.
-// TODO(sprang): Remove default parameter when it's not longer referenced.
-std::vector<webrtc::VideoStream> GetSimulcastConfig(size_t max_streams,
-                                                    int width,
-                                                    int height,
-                                                    int max_bitrate_bps,
-                                                    int max_qp,
-                                                    int max_framerate,
-                                                    bool is_screencast = false);
-
-bool UseSimulcastScreenshare();
-
-}  // namespace cricket
-
-#endif  // WEBRTC_MEDIA_ENGINE_SIMULCAST_H_
diff --git a/media/engine/simulcast_encoder_adapter.cc b/media/engine/simulcast_encoder_adapter.cc
deleted file mode 100644
index af84b85..0000000
--- a/media/engine/simulcast_encoder_adapter.cc
+++ /dev/null
@@ -1,538 +0,0 @@
-/*
- *  Copyright (c) 2014 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/media/engine/simulcast_encoder_adapter.h"
-
-#include <algorithm>
-
-// NOTE(ajm): Path provided by gyp.
-#include "libyuv/scale.h"  // NOLINT
-
-#include "webrtc/api/video/i420_buffer.h"
-#include "webrtc/media/engine/scopedvideoencoder.h"
-#include "webrtc/modules/video_coding/codecs/vp8/screenshare_layers.h"
-#include "webrtc/modules/video_coding/codecs/vp8/simulcast_rate_allocator.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/system_wrappers/include/clock.h"
-
-namespace {
-
-const unsigned int kDefaultMinQp = 2;
-const unsigned int kDefaultMaxQp = 56;
-// Max qp for lowest spatial resolution when doing simulcast.
-const unsigned int kLowestResMaxQp = 45;
-
-uint32_t SumStreamMaxBitrate(int streams, const webrtc::VideoCodec& codec) {
-  uint32_t bitrate_sum = 0;
-  for (int i = 0; i < streams; ++i) {
-    bitrate_sum += codec.simulcastStream[i].maxBitrate;
-  }
-  return bitrate_sum;
-}
-
-int NumberOfStreams(const webrtc::VideoCodec& codec) {
-  int streams =
-      codec.numberOfSimulcastStreams < 1 ? 1 : codec.numberOfSimulcastStreams;
-  uint32_t simulcast_max_bitrate = SumStreamMaxBitrate(streams, codec);
-  if (simulcast_max_bitrate == 0) {
-    streams = 1;
-  }
-  return streams;
-}
-
-bool ValidSimulcastResolutions(const webrtc::VideoCodec& codec,
-                               int num_streams) {
-  if (codec.width != codec.simulcastStream[num_streams - 1].width ||
-      codec.height != codec.simulcastStream[num_streams - 1].height) {
-    return false;
-  }
-  for (int i = 0; i < num_streams; ++i) {
-    if (codec.width * codec.simulcastStream[i].height !=
-        codec.height * codec.simulcastStream[i].width) {
-      return false;
-    }
-  }
-  return true;
-}
-
-int VerifyCodec(const webrtc::VideoCodec* inst) {
-  if (inst == nullptr) {
-    return WEBRTC_VIDEO_CODEC_ERR_PARAMETER;
-  }
-  if (inst->maxFramerate < 1) {
-    return WEBRTC_VIDEO_CODEC_ERR_PARAMETER;
-  }
-  // allow zero to represent an unspecified maxBitRate
-  if (inst->maxBitrate > 0 && inst->startBitrate > inst->maxBitrate) {
-    return WEBRTC_VIDEO_CODEC_ERR_PARAMETER;
-  }
-  if (inst->width <= 1 || inst->height <= 1) {
-    return WEBRTC_VIDEO_CODEC_ERR_PARAMETER;
-  }
-  if (inst->VP8().automaticResizeOn && inst->numberOfSimulcastStreams > 1) {
-    return WEBRTC_VIDEO_CODEC_ERR_PARAMETER;
-  }
-  return WEBRTC_VIDEO_CODEC_OK;
-}
-
-// An EncodedImageCallback implementation that forwards on calls to a
-// SimulcastEncoderAdapter, but with the stream index it's registered with as
-// the first parameter to Encoded.
-class AdapterEncodedImageCallback : public webrtc::EncodedImageCallback {
- public:
-  AdapterEncodedImageCallback(webrtc::SimulcastEncoderAdapter* adapter,
-                              size_t stream_idx)
-      : adapter_(adapter), stream_idx_(stream_idx) {}
-
-  EncodedImageCallback::Result OnEncodedImage(
-      const webrtc::EncodedImage& encoded_image,
-      const webrtc::CodecSpecificInfo* codec_specific_info,
-      const webrtc::RTPFragmentationHeader* fragmentation) override {
-    return adapter_->OnEncodedImage(stream_idx_, encoded_image,
-                                    codec_specific_info, fragmentation);
-  }
-
- private:
-  webrtc::SimulcastEncoderAdapter* const adapter_;
-  const size_t stream_idx_;
-};
-
-// Utility class used to adapt the simulcast id as reported by the temporal
-// layers factory, since each sub-encoder will report stream 0.
-class TemporalLayersFactoryAdapter : public webrtc::TemporalLayersFactory {
- public:
-  TemporalLayersFactoryAdapter(int adapted_simulcast_id,
-                               const TemporalLayersFactory& tl_factory)
-      : adapted_simulcast_id_(adapted_simulcast_id), tl_factory_(tl_factory) {}
-  ~TemporalLayersFactoryAdapter() override {}
-  webrtc::TemporalLayers* Create(int simulcast_id,
-                                 int temporal_layers,
-                                 uint8_t initial_tl0_pic_idx) const override {
-    return tl_factory_.Create(adapted_simulcast_id_, temporal_layers,
-                              initial_tl0_pic_idx);
-  }
-
-  const int adapted_simulcast_id_;
-  const TemporalLayersFactory& tl_factory_;
-};
-
-}  // namespace
-
-namespace webrtc {
-
-SimulcastEncoderAdapter::SimulcastEncoderAdapter(
-    cricket::WebRtcVideoEncoderFactory* factory)
-    : inited_(0),
-      factory_(factory),
-      encoded_complete_callback_(nullptr),
-      implementation_name_("SimulcastEncoderAdapter") {
-  // The adapter is typically created on the worker thread, but operated on
-  // the encoder task queue.
-  encoder_queue_.Detach();
-
-  memset(&codec_, 0, sizeof(webrtc::VideoCodec));
-}
-
-SimulcastEncoderAdapter::~SimulcastEncoderAdapter() {
-  RTC_DCHECK(!Initialized());
-  DestroyStoredEncoders();
-}
-
-int SimulcastEncoderAdapter::Release() {
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&encoder_queue_);
-
-  while (!streaminfos_.empty()) {
-    std::unique_ptr<VideoEncoder> encoder =
-        std::move(streaminfos_.back().encoder);
-    encoder->Release();
-    // Even though it seems very unlikely, there are no guarantees that the
-    // encoder will not call back after being Release()'d. Therefore, we disable
-    // the callbacks here.
-    encoder->RegisterEncodeCompleteCallback(nullptr);
-    streaminfos_.pop_back();  // Deletes callback adapter.
-    stored_encoders_.push(std::move(encoder));
-  }
-
-  // It's legal to move the encoder to another queue now.
-  encoder_queue_.Detach();
-
-  rtc::AtomicOps::ReleaseStore(&inited_, 0);
-
-  return WEBRTC_VIDEO_CODEC_OK;
-}
-
-int SimulcastEncoderAdapter::InitEncode(const VideoCodec* inst,
-                                        int number_of_cores,
-                                        size_t max_payload_size) {
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&encoder_queue_);
-
-  if (number_of_cores < 1) {
-    return WEBRTC_VIDEO_CODEC_ERR_PARAMETER;
-  }
-
-  int ret = VerifyCodec(inst);
-  if (ret < 0) {
-    return ret;
-  }
-
-  ret = Release();
-  if (ret < 0) {
-    return ret;
-  }
-
-  int number_of_streams = NumberOfStreams(*inst);
-  RTC_DCHECK_LE(number_of_streams, kMaxSimulcastStreams);
-  const bool doing_simulcast = (number_of_streams > 1);
-
-  if (doing_simulcast && !ValidSimulcastResolutions(*inst, number_of_streams)) {
-    return WEBRTC_VIDEO_CODEC_ERR_PARAMETER;
-  }
-
-  codec_ = *inst;
-  SimulcastRateAllocator rate_allocator(codec_, nullptr);
-  BitrateAllocation allocation = rate_allocator.GetAllocation(
-      codec_.startBitrate * 1000, codec_.maxFramerate);
-  std::vector<uint32_t> start_bitrates;
-  for (int i = 0; i < kMaxSimulcastStreams; ++i) {
-    uint32_t stream_bitrate = allocation.GetSpatialLayerSum(i) / 1000;
-    start_bitrates.push_back(stream_bitrate);
-  }
-
-  std::string implementation_name;
-  // Create |number_of_streams| of encoder instances and init them.
-  for (int i = 0; i < number_of_streams; ++i) {
-    VideoCodec stream_codec;
-    uint32_t start_bitrate_kbps = start_bitrates[i];
-    if (!doing_simulcast) {
-      stream_codec = codec_;
-      stream_codec.numberOfSimulcastStreams = 1;
-    } else {
-      // Cap start bitrate to the min bitrate in order to avoid strange codec
-      // behavior. Since sending sending will be false, this should not matter.
-      start_bitrate_kbps =
-          std::max(codec_.simulcastStream[i].minBitrate, start_bitrate_kbps);
-      bool highest_resolution_stream = (i == (number_of_streams - 1));
-      PopulateStreamCodec(codec_, i, start_bitrate_kbps,
-                          highest_resolution_stream, &stream_codec);
-    }
-    TemporalLayersFactoryAdapter tl_factory_adapter(i,
-                                                    *codec_.VP8()->tl_factory);
-    stream_codec.VP8()->tl_factory = &tl_factory_adapter;
-
-    // TODO(ronghuawu): Remove once this is handled in VP8EncoderImpl.
-    if (stream_codec.qpMax < kDefaultMinQp) {
-      stream_codec.qpMax = kDefaultMaxQp;
-    }
-
-    // If an existing encoder instance exists, reuse it.
-    // TODO(brandtr): Set initial RTP state (e.g., picture_id/tl0_pic_idx) here,
-    // when we start storing that state outside the encoder wrappers.
-    std::unique_ptr<VideoEncoder> encoder;
-    if (!stored_encoders_.empty()) {
-      encoder = std::move(stored_encoders_.top());
-      stored_encoders_.pop();
-    } else {
-      encoder = CreateScopedVideoEncoder(factory_, cricket::VideoCodec("VP8"));
-    }
-
-    ret = encoder->InitEncode(&stream_codec, number_of_cores, max_payload_size);
-    if (ret < 0) {
-      // Explicitly destroy the current encoder; because we haven't registered a
-      // StreamInfo for it yet, Release won't do anything about it.
-      encoder.reset();
-      Release();
-      return ret;
-    }
-    std::unique_ptr<EncodedImageCallback> callback(
-        new AdapterEncodedImageCallback(this, i));
-    encoder->RegisterEncodeCompleteCallback(callback.get());
-    streaminfos_.emplace_back(std::move(encoder), std::move(callback),
-                              stream_codec.width, stream_codec.height,
-                              start_bitrate_kbps > 0);
-
-    if (i != 0) {
-      implementation_name += ", ";
-    }
-    implementation_name += streaminfos_[i].encoder->ImplementationName();
-  }
-
-  if (doing_simulcast) {
-    implementation_name_ =
-        "SimulcastEncoderAdapter (" + implementation_name + ")";
-  } else {
-    implementation_name_ = implementation_name;
-  }
-
-  // To save memory, don't store encoders that we don't use.
-  DestroyStoredEncoders();
-
-  rtc::AtomicOps::ReleaseStore(&inited_, 1);
-
-  return WEBRTC_VIDEO_CODEC_OK;
-}
-
-int SimulcastEncoderAdapter::Encode(
-    const VideoFrame& input_image,
-    const CodecSpecificInfo* codec_specific_info,
-    const std::vector<FrameType>* frame_types) {
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&encoder_queue_);
-
-  if (!Initialized()) {
-    return WEBRTC_VIDEO_CODEC_UNINITIALIZED;
-  }
-  if (encoded_complete_callback_ == nullptr) {
-    return WEBRTC_VIDEO_CODEC_UNINITIALIZED;
-  }
-
-  // All active streams should generate a key frame if
-  // a key frame is requested by any stream.
-  bool send_key_frame = false;
-  if (frame_types) {
-    for (size_t i = 0; i < frame_types->size(); ++i) {
-      if (frame_types->at(i) == kVideoFrameKey) {
-        send_key_frame = true;
-        break;
-      }
-    }
-  }
-  for (size_t stream_idx = 0; stream_idx < streaminfos_.size(); ++stream_idx) {
-    if (streaminfos_[stream_idx].key_frame_request &&
-        streaminfos_[stream_idx].send_stream) {
-      send_key_frame = true;
-      break;
-    }
-  }
-
-  int src_width = input_image.width();
-  int src_height = input_image.height();
-  for (size_t stream_idx = 0; stream_idx < streaminfos_.size(); ++stream_idx) {
-    // Don't encode frames in resolutions that we don't intend to send.
-    if (!streaminfos_[stream_idx].send_stream) {
-      continue;
-    }
-
-    std::vector<FrameType> stream_frame_types;
-    if (send_key_frame) {
-      stream_frame_types.push_back(kVideoFrameKey);
-      streaminfos_[stream_idx].key_frame_request = false;
-    } else {
-      stream_frame_types.push_back(kVideoFrameDelta);
-    }
-
-    int dst_width = streaminfos_[stream_idx].width;
-    int dst_height = streaminfos_[stream_idx].height;
-    // If scaling isn't required, because the input resolution
-    // matches the destination or the input image is empty (e.g.
-    // a keyframe request for encoders with internal camera
-    // sources) or the source image has a native handle, pass the image on
-    // directly. Otherwise, we'll scale it to match what the encoder expects
-    // (below).
-    // For texture frames, the underlying encoder is expected to be able to
-    // correctly sample/scale the source texture.
-    // TODO(perkj): ensure that works going forward, and figure out how this
-    // affects webrtc:5683.
-    if ((dst_width == src_width && dst_height == src_height) ||
-        input_image.video_frame_buffer()->type() ==
-            VideoFrameBuffer::Type::kNative) {
-      int ret = streaminfos_[stream_idx].encoder->Encode(
-          input_image, codec_specific_info, &stream_frame_types);
-      if (ret != WEBRTC_VIDEO_CODEC_OK) {
-        return ret;
-      }
-    } else {
-      rtc::scoped_refptr<I420Buffer> dst_buffer =
-          I420Buffer::Create(dst_width, dst_height);
-      rtc::scoped_refptr<I420BufferInterface> src_buffer =
-          input_image.video_frame_buffer()->ToI420();
-      libyuv::I420Scale(src_buffer->DataY(), src_buffer->StrideY(),
-                        src_buffer->DataU(), src_buffer->StrideU(),
-                        src_buffer->DataV(), src_buffer->StrideV(), src_width,
-                        src_height, dst_buffer->MutableDataY(),
-                        dst_buffer->StrideY(), dst_buffer->MutableDataU(),
-                        dst_buffer->StrideU(), dst_buffer->MutableDataV(),
-                        dst_buffer->StrideV(), dst_width, dst_height,
-                        libyuv::kFilterBilinear);
-
-      int ret = streaminfos_[stream_idx].encoder->Encode(
-          VideoFrame(dst_buffer, input_image.timestamp(),
-                     input_image.render_time_ms(), webrtc::kVideoRotation_0),
-          codec_specific_info, &stream_frame_types);
-      if (ret != WEBRTC_VIDEO_CODEC_OK) {
-        return ret;
-      }
-    }
-  }
-
-  return WEBRTC_VIDEO_CODEC_OK;
-}
-
-int SimulcastEncoderAdapter::RegisterEncodeCompleteCallback(
-    EncodedImageCallback* callback) {
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&encoder_queue_);
-  encoded_complete_callback_ = callback;
-  return WEBRTC_VIDEO_CODEC_OK;
-}
-
-int SimulcastEncoderAdapter::SetChannelParameters(uint32_t packet_loss,
-                                                  int64_t rtt) {
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&encoder_queue_);
-  for (size_t stream_idx = 0; stream_idx < streaminfos_.size(); ++stream_idx) {
-    streaminfos_[stream_idx].encoder->SetChannelParameters(packet_loss, rtt);
-  }
-  return WEBRTC_VIDEO_CODEC_OK;
-}
-
-int SimulcastEncoderAdapter::SetRateAllocation(const BitrateAllocation& bitrate,
-                                               uint32_t new_framerate) {
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&encoder_queue_);
-
-  if (!Initialized()) {
-    return WEBRTC_VIDEO_CODEC_UNINITIALIZED;
-  }
-
-  if (new_framerate < 1) {
-    return WEBRTC_VIDEO_CODEC_ERR_PARAMETER;
-  }
-
-  if (codec_.maxBitrate > 0 && bitrate.get_sum_kbps() > codec_.maxBitrate) {
-    return WEBRTC_VIDEO_CODEC_ERR_PARAMETER;
-  }
-
-  if (bitrate.get_sum_bps() > 0) {
-    // Make sure the bitrate fits the configured min bitrates. 0 is a special
-    // value that means paused, though, so leave it alone.
-    if (bitrate.get_sum_kbps() < codec_.minBitrate) {
-      return WEBRTC_VIDEO_CODEC_ERR_PARAMETER;
-    }
-
-    if (codec_.numberOfSimulcastStreams > 0 &&
-        bitrate.get_sum_kbps() < codec_.simulcastStream[0].minBitrate) {
-      return WEBRTC_VIDEO_CODEC_ERR_PARAMETER;
-    }
-  }
-
-  codec_.maxFramerate = new_framerate;
-
-  for (size_t stream_idx = 0; stream_idx < streaminfos_.size(); ++stream_idx) {
-    uint32_t stream_bitrate_kbps =
-        bitrate.GetSpatialLayerSum(stream_idx) / 1000;
-
-    // Need a key frame if we have not sent this stream before.
-    if (stream_bitrate_kbps > 0 && !streaminfos_[stream_idx].send_stream) {
-      streaminfos_[stream_idx].key_frame_request = true;
-    }
-    streaminfos_[stream_idx].send_stream = stream_bitrate_kbps > 0;
-
-    // Slice the temporal layers out of the full allocation and pass it on to
-    // the encoder handling the current simulcast stream.
-    BitrateAllocation stream_allocation;
-    for (int i = 0; i < kMaxTemporalStreams; ++i) {
-      stream_allocation.SetBitrate(0, i, bitrate.GetBitrate(stream_idx, i));
-    }
-    streaminfos_[stream_idx].encoder->SetRateAllocation(stream_allocation,
-                                                        new_framerate);
-  }
-
-  return WEBRTC_VIDEO_CODEC_OK;
-}
-
-// TODO(brandtr): Add task checker to this member function, when all encoder
-// callbacks are coming in on the encoder queue.
-EncodedImageCallback::Result SimulcastEncoderAdapter::OnEncodedImage(
-    size_t stream_idx,
-    const EncodedImage& encodedImage,
-    const CodecSpecificInfo* codecSpecificInfo,
-    const RTPFragmentationHeader* fragmentation) {
-  CodecSpecificInfo stream_codec_specific = *codecSpecificInfo;
-  stream_codec_specific.codec_name = implementation_name_.c_str();
-  CodecSpecificInfoVP8* vp8Info = &(stream_codec_specific.codecSpecific.VP8);
-  vp8Info->simulcastIdx = stream_idx;
-
-  return encoded_complete_callback_->OnEncodedImage(
-      encodedImage, &stream_codec_specific, fragmentation);
-}
-
-void SimulcastEncoderAdapter::PopulateStreamCodec(
-    const webrtc::VideoCodec& inst,
-    int stream_index,
-    uint32_t start_bitrate_kbps,
-    bool highest_resolution_stream,
-    webrtc::VideoCodec* stream_codec) {
-  *stream_codec = inst;
-
-  // Stream specific settings.
-  stream_codec->VP8()->numberOfTemporalLayers =
-      inst.simulcastStream[stream_index].numberOfTemporalLayers;
-  stream_codec->numberOfSimulcastStreams = 0;
-  stream_codec->width = inst.simulcastStream[stream_index].width;
-  stream_codec->height = inst.simulcastStream[stream_index].height;
-  stream_codec->maxBitrate = inst.simulcastStream[stream_index].maxBitrate;
-  stream_codec->minBitrate = inst.simulcastStream[stream_index].minBitrate;
-  stream_codec->qpMax = inst.simulcastStream[stream_index].qpMax;
-  // Settings that are based on stream/resolution.
-  const bool lowest_resolution_stream = (stream_index == 0);
-  if (lowest_resolution_stream) {
-    // Settings for lowest spatial resolutions.
-    stream_codec->qpMax = kLowestResMaxQp;
-  }
-  if (!highest_resolution_stream) {
-    // For resolutions below CIF, set the codec |complexity| parameter to
-    // kComplexityHigher, which maps to cpu_used = -4.
-    int pixels_per_frame = stream_codec->width * stream_codec->height;
-    if (pixels_per_frame < 352 * 288) {
-      stream_codec->VP8()->complexity = webrtc::kComplexityHigher;
-    }
-    // Turn off denoising for all streams but the highest resolution.
-    stream_codec->VP8()->denoisingOn = false;
-  }
-  // TODO(ronghuawu): what to do with targetBitrate.
-
-  stream_codec->startBitrate = start_bitrate_kbps;
-}
-
-bool SimulcastEncoderAdapter::Initialized() const {
-  return rtc::AtomicOps::AcquireLoad(&inited_) == 1;
-}
-
-void SimulcastEncoderAdapter::DestroyStoredEncoders() {
-  while (!stored_encoders_.empty()) {
-    stored_encoders_.pop();
-  }
-}
-
-bool SimulcastEncoderAdapter::SupportsNativeHandle() const {
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&encoder_queue_);
-  // We should not be calling this method before streaminfos_ are configured.
-  RTC_DCHECK(!streaminfos_.empty());
-  for (const auto& streaminfo : streaminfos_) {
-    if (!streaminfo.encoder->SupportsNativeHandle()) {
-      return false;
-    }
-  }
-  return true;
-}
-
-VideoEncoder::ScalingSettings SimulcastEncoderAdapter::GetScalingSettings()
-    const {
-  // TODO(brandtr): Investigate why the sequence checker below fails on mac.
-  // RTC_DCHECK_CALLED_SEQUENTIALLY(&encoder_queue_);
-  // Turn off quality scaling for simulcast.
-  if (!Initialized() || NumberOfStreams(codec_) != 1) {
-    return VideoEncoder::ScalingSettings(false);
-  }
-  return streaminfos_[0].encoder->GetScalingSettings();
-}
-
-const char* SimulcastEncoderAdapter::ImplementationName() const {
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&encoder_queue_);
-  return implementation_name_.c_str();
-}
-
-}  // namespace webrtc
diff --git a/media/engine/simulcast_encoder_adapter.h b/media/engine/simulcast_encoder_adapter.h
deleted file mode 100644
index 03576f6..0000000
--- a/media/engine/simulcast_encoder_adapter.h
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- *  Copyright (c) 2014 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_MEDIA_ENGINE_SIMULCAST_ENCODER_ADAPTER_H_
-#define WEBRTC_MEDIA_ENGINE_SIMULCAST_ENCODER_ADAPTER_H_
-
-#include <memory>
-#include <stack>
-#include <string>
-#include <utility>
-#include <vector>
-
-#include "webrtc/media/engine/webrtcvideoencoderfactory.h"
-#include "webrtc/modules/video_coding/codecs/vp8/include/vp8.h"
-#include "webrtc/rtc_base/atomicops.h"
-#include "webrtc/rtc_base/sequenced_task_checker.h"
-
-namespace webrtc {
-
-class SimulcastRateAllocator;
-
-// SimulcastEncoderAdapter implements simulcast support by creating multiple
-// webrtc::VideoEncoder instances with the given VideoEncoderFactory.
-// The object is created and destroyed on the worker thread, but all public
-// interfaces should be called from the encoder task queue.
-class SimulcastEncoderAdapter : public VP8Encoder {
- public:
-  explicit SimulcastEncoderAdapter(cricket::WebRtcVideoEncoderFactory* factory);
-  virtual ~SimulcastEncoderAdapter();
-
-  // Implements VideoEncoder.
-  int Release() override;
-  int InitEncode(const VideoCodec* inst,
-                 int number_of_cores,
-                 size_t max_payload_size) override;
-  int Encode(const VideoFrame& input_image,
-             const CodecSpecificInfo* codec_specific_info,
-             const std::vector<FrameType>* frame_types) override;
-  int RegisterEncodeCompleteCallback(EncodedImageCallback* callback) override;
-  int SetChannelParameters(uint32_t packet_loss, int64_t rtt) override;
-  int SetRateAllocation(const BitrateAllocation& bitrate,
-                        uint32_t new_framerate) override;
-
-  // Eventual handler for the contained encoders' EncodedImageCallbacks, but
-  // called from an internal helper that also knows the correct stream
-  // index.
-  EncodedImageCallback::Result OnEncodedImage(
-      size_t stream_idx,
-      const EncodedImage& encoded_image,
-      const CodecSpecificInfo* codec_specific_info,
-      const RTPFragmentationHeader* fragmentation);
-
-  VideoEncoder::ScalingSettings GetScalingSettings() const override;
-
-  bool SupportsNativeHandle() const override;
-  const char* ImplementationName() const override;
-
- private:
-  struct StreamInfo {
-    StreamInfo(std::unique_ptr<VideoEncoder> encoder,
-               std::unique_ptr<EncodedImageCallback> callback,
-               uint16_t width,
-               uint16_t height,
-               bool send_stream)
-        : encoder(std::move(encoder)),
-          callback(std::move(callback)),
-          width(width),
-          height(height),
-          key_frame_request(false),
-          send_stream(send_stream) {}
-    std::unique_ptr<VideoEncoder> encoder;
-    std::unique_ptr<EncodedImageCallback> callback;
-    uint16_t width;
-    uint16_t height;
-    bool key_frame_request;
-    bool send_stream;
-  };
-
-  // Populate the codec settings for each simulcast stream.
-  static void PopulateStreamCodec(const webrtc::VideoCodec& inst,
-                                  int stream_index,
-                                  uint32_t start_bitrate_kbps,
-                                  bool highest_resolution_stream,
-                                  webrtc::VideoCodec* stream_codec);
-
-  bool Initialized() const;
-
-  void DestroyStoredEncoders();
-
-  volatile int inited_;  // Accessed atomically.
-  cricket::WebRtcVideoEncoderFactory* const factory_;
-  VideoCodec codec_;
-  std::vector<StreamInfo> streaminfos_;
-  EncodedImageCallback* encoded_complete_callback_;
-  std::string implementation_name_;
-
-  // Used for checking the single-threaded access of the encoder interface.
-  rtc::SequencedTaskChecker encoder_queue_;
-
-  // Store encoders in between calls to Release and InitEncode, so they don't
-  // have to be recreated. Remaining encoders are destroyed by the destructor.
-  std::stack<std::unique_ptr<VideoEncoder>> stored_encoders_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MEDIA_ENGINE_SIMULCAST_ENCODER_ADAPTER_H_
diff --git a/media/engine/simulcast_encoder_adapter_unittest.cc b/media/engine/simulcast_encoder_adapter_unittest.cc
deleted file mode 100644
index 7865e5f..0000000
--- a/media/engine/simulcast_encoder_adapter_unittest.cc
+++ /dev/null
@@ -1,824 +0,0 @@
-/*
- *  Copyright (c) 2014 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 <array>
-#include <memory>
-#include <vector>
-
-#include "webrtc/common_video/include/video_frame_buffer.h"
-#include "webrtc/media/engine/simulcast_encoder_adapter.h"
-#include "webrtc/modules/video_coding/codecs/vp8/simulcast_test_utility.h"
-#include "webrtc/modules/video_coding/include/video_codec_interface.h"
-#include "webrtc/test/gmock.h"
-
-namespace webrtc {
-namespace testing {
-
-class TestSimulcastEncoderAdapter : public TestVp8Simulcast {
- public:
-  TestSimulcastEncoderAdapter() : factory_(new Vp8EncoderFactory()) {}
-
- protected:
-  class Vp8EncoderFactory : public cricket::WebRtcVideoEncoderFactory {
-   public:
-    Vp8EncoderFactory() {
-      supported_codecs_.push_back(cricket::VideoCodec("VP8"));
-    }
-
-    const std::vector<cricket::VideoCodec>& supported_codecs() const override {
-      return supported_codecs_;
-    }
-
-    VideoEncoder* CreateVideoEncoder(
-        const cricket::VideoCodec& codec) override {
-      return VP8Encoder::Create();
-    }
-
-    void DestroyVideoEncoder(VideoEncoder* encoder) override { delete encoder; }
-
-    virtual ~Vp8EncoderFactory() {}
-
-   private:
-    std::vector<cricket::VideoCodec> supported_codecs_;
-  };
-
-  VP8Encoder* CreateEncoder() override {
-    return new SimulcastEncoderAdapter(factory_.get());
-  }
-  VP8Decoder* CreateDecoder() override { return VP8Decoder::Create(); }
-
- private:
-  std::unique_ptr<Vp8EncoderFactory> factory_;
-};
-
-TEST_F(TestSimulcastEncoderAdapter, TestKeyFrameRequestsOnAllStreams) {
-  TestVp8Simulcast::TestKeyFrameRequestsOnAllStreams();
-}
-
-TEST_F(TestSimulcastEncoderAdapter, TestPaddingAllStreams) {
-  TestVp8Simulcast::TestPaddingAllStreams();
-}
-
-TEST_F(TestSimulcastEncoderAdapter, TestPaddingTwoStreams) {
-  TestVp8Simulcast::TestPaddingTwoStreams();
-}
-
-TEST_F(TestSimulcastEncoderAdapter, TestPaddingTwoStreamsOneMaxedOut) {
-  TestVp8Simulcast::TestPaddingTwoStreamsOneMaxedOut();
-}
-
-TEST_F(TestSimulcastEncoderAdapter, TestPaddingOneStream) {
-  TestVp8Simulcast::TestPaddingOneStream();
-}
-
-TEST_F(TestSimulcastEncoderAdapter, TestPaddingOneStreamTwoMaxedOut) {
-  TestVp8Simulcast::TestPaddingOneStreamTwoMaxedOut();
-}
-
-TEST_F(TestSimulcastEncoderAdapter, TestSendAllStreams) {
-  TestVp8Simulcast::TestSendAllStreams();
-}
-
-TEST_F(TestSimulcastEncoderAdapter, TestDisablingStreams) {
-  TestVp8Simulcast::TestDisablingStreams();
-}
-
-TEST_F(TestSimulcastEncoderAdapter, TestSwitchingToOneStream) {
-  TestVp8Simulcast::TestSwitchingToOneStream();
-}
-
-TEST_F(TestSimulcastEncoderAdapter, TestSwitchingToOneOddStream) {
-  TestVp8Simulcast::TestSwitchingToOneOddStream();
-}
-
-TEST_F(TestSimulcastEncoderAdapter, TestStrideEncodeDecode) {
-  TestVp8Simulcast::TestStrideEncodeDecode();
-}
-
-TEST_F(TestSimulcastEncoderAdapter, TestSaptioTemporalLayers333PatternEncoder) {
-  TestVp8Simulcast::TestSaptioTemporalLayers333PatternEncoder();
-}
-
-TEST_F(TestSimulcastEncoderAdapter, TestSpatioTemporalLayers321PatternEncoder) {
-  TestVp8Simulcast::TestSpatioTemporalLayers321PatternEncoder();
-}
-
-class MockVideoEncoder : public VideoEncoder {
- public:
-  // TODO(nisse): Valid overrides commented out, because the gmock
-  // methods don't use any override declarations, and we want to avoid
-  // warnings from -Winconsistent-missing-override. See
-  // http://crbug.com/428099.
-  int32_t InitEncode(const VideoCodec* codecSettings,
-                     int32_t numberOfCores,
-                     size_t maxPayloadSize) /* override */ {
-    codec_ = *codecSettings;
-    return init_encode_return_value_;
-  }
-
-  MOCK_METHOD3(
-      Encode,
-      int32_t(const VideoFrame& inputImage,
-              const CodecSpecificInfo* codecSpecificInfo,
-              const std::vector<FrameType>* frame_types) /* override */);
-
-  int32_t RegisterEncodeCompleteCallback(
-      EncodedImageCallback* callback) /* override */ {
-    callback_ = callback;
-    return 0;
-  }
-
-  MOCK_METHOD0(Release, int32_t());
-
-  int32_t SetRateAllocation(const BitrateAllocation& bitrate_allocation,
-                            uint32_t framerate) {
-    last_set_bitrate_ = bitrate_allocation;
-    return 0;
-  }
-
-  MOCK_METHOD2(SetChannelParameters, int32_t(uint32_t packetLoss, int64_t rtt));
-
-  bool SupportsNativeHandle() const /* override */ {
-    return supports_native_handle_;
-  }
-
-  virtual ~MockVideoEncoder() {}
-
-  const VideoCodec& codec() const { return codec_; }
-
-  void SendEncodedImage(int width, int height) {
-    // Sends a fake image of the given width/height.
-    EncodedImage image;
-    image._encodedWidth = width;
-    image._encodedHeight = height;
-    CodecSpecificInfo codec_specific_info;
-    memset(&codec_specific_info, 0, sizeof(codec_specific_info));
-    callback_->OnEncodedImage(image, &codec_specific_info, nullptr);
-  }
-
-  void set_supports_native_handle(bool enabled) {
-    supports_native_handle_ = enabled;
-  }
-
-  void set_init_encode_return_value(int32_t value) {
-    init_encode_return_value_ = value;
-  }
-
-  BitrateAllocation last_set_bitrate() const { return last_set_bitrate_; }
-
-  MOCK_CONST_METHOD0(ImplementationName, const char*());
-
- private:
-  bool supports_native_handle_ = false;
-  int32_t init_encode_return_value_ = 0;
-  BitrateAllocation last_set_bitrate_;
-
-  VideoCodec codec_;
-  EncodedImageCallback* callback_;
-};
-
-class MockVideoEncoderFactory : public cricket::WebRtcVideoEncoderFactory {
- public:
-  MockVideoEncoderFactory() {
-    supported_codecs_.push_back(cricket::VideoCodec("VP8"));
-  }
-
-  const std::vector<cricket::VideoCodec>& supported_codecs() const override {
-    return supported_codecs_;
-  }
-
-  VideoEncoder* CreateVideoEncoder(const cricket::VideoCodec& codec) override {
-    MockVideoEncoder* encoder = new ::testing::NiceMock<MockVideoEncoder>();
-    encoder->set_init_encode_return_value(init_encode_return_value_);
-    const char* encoder_name = encoder_names_.empty()
-                                   ? "codec_implementation_name"
-                                   : encoder_names_[encoders_.size()];
-    ON_CALL(*encoder, ImplementationName()).WillByDefault(Return(encoder_name));
-    encoders_.push_back(encoder);
-    return encoder;
-  }
-
-  void DestroyVideoEncoder(VideoEncoder* encoder) override {
-    for (size_t i = 0; i < encoders_.size(); ++i) {
-      if (encoders_[i] == encoder) {
-        encoders_.erase(encoders_.begin() + i);
-        break;
-      }
-    }
-    delete encoder;
-  }
-
-  virtual ~MockVideoEncoderFactory() {}
-
-  const std::vector<MockVideoEncoder*>& encoders() const { return encoders_; }
-  void SetEncoderNames(const std::vector<const char*>& encoder_names) {
-    encoder_names_ = encoder_names;
-  }
-  void set_init_encode_return_value(int32_t value) {
-    init_encode_return_value_ = value;
-  }
-
- private:
-  std::vector<cricket::VideoCodec> supported_codecs_;
-  int32_t init_encode_return_value_ = 0;
-  std::vector<MockVideoEncoder*> encoders_;
-  std::vector<const char*> encoder_names_;
-};
-
-class TestSimulcastEncoderAdapterFakeHelper {
- public:
-  TestSimulcastEncoderAdapterFakeHelper()
-      : factory_(new MockVideoEncoderFactory()) {}
-
-  // Can only be called once as the SimulcastEncoderAdapter will take the
-  // ownership of |factory_|.
-  VP8Encoder* CreateMockEncoderAdapter() {
-    return new SimulcastEncoderAdapter(factory_.get());
-  }
-
-  void ExpectCallSetChannelParameters(uint32_t packetLoss, int64_t rtt) {
-    EXPECT_TRUE(!factory_->encoders().empty());
-    for (size_t i = 0; i < factory_->encoders().size(); ++i) {
-      EXPECT_CALL(*factory_->encoders()[i],
-                  SetChannelParameters(packetLoss, rtt))
-          .Times(1);
-    }
-  }
-
-  MockVideoEncoderFactory* factory() { return factory_.get(); }
-
- private:
-  std::unique_ptr<MockVideoEncoderFactory> factory_;
-};
-
-static const int kTestTemporalLayerProfile[3] = {3, 2, 1};
-
-class TestSimulcastEncoderAdapterFake : public ::testing::Test,
-                                        public EncodedImageCallback {
- public:
-  TestSimulcastEncoderAdapterFake()
-      : helper_(new TestSimulcastEncoderAdapterFakeHelper()),
-        adapter_(helper_->CreateMockEncoderAdapter()),
-        last_encoded_image_width_(-1),
-        last_encoded_image_height_(-1),
-        last_encoded_image_simulcast_index_(-1) {}
-  virtual ~TestSimulcastEncoderAdapterFake() {
-    if (adapter_) {
-      adapter_->Release();
-    }
-  }
-
-  Result OnEncodedImage(const EncodedImage& encoded_image,
-                        const CodecSpecificInfo* codec_specific_info,
-                        const RTPFragmentationHeader* fragmentation) override {
-    last_encoded_image_width_ = encoded_image._encodedWidth;
-    last_encoded_image_height_ = encoded_image._encodedHeight;
-    if (codec_specific_info) {
-      last_encoded_image_simulcast_index_ =
-          codec_specific_info->codecSpecific.VP8.simulcastIdx;
-    }
-    return Result(Result::OK, encoded_image._timeStamp);
-  }
-
-  bool GetLastEncodedImageInfo(int* out_width,
-                               int* out_height,
-                               int* out_simulcast_index) {
-    if (last_encoded_image_width_ == -1) {
-      return false;
-    }
-    *out_width = last_encoded_image_width_;
-    *out_height = last_encoded_image_height_;
-    *out_simulcast_index = last_encoded_image_simulcast_index_;
-    return true;
-  }
-
-  void SetupCodec() {
-    TestVp8Simulcast::DefaultSettings(
-        &codec_, static_cast<const int*>(kTestTemporalLayerProfile));
-    rate_allocator_.reset(new SimulcastRateAllocator(codec_, nullptr));
-    tl_factory_.SetListener(rate_allocator_.get());
-    codec_.VP8()->tl_factory = &tl_factory_;
-    EXPECT_EQ(0, adapter_->InitEncode(&codec_, 1, 1200));
-    adapter_->RegisterEncodeCompleteCallback(this);
-  }
-
-  void VerifyCodec(const VideoCodec& ref, int stream_index) {
-    const VideoCodec& target =
-        helper_->factory()->encoders()[stream_index]->codec();
-    EXPECT_EQ(ref.codecType, target.codecType);
-    EXPECT_EQ(0, strcmp(ref.plName, target.plName));
-    EXPECT_EQ(ref.plType, target.plType);
-    EXPECT_EQ(ref.width, target.width);
-    EXPECT_EQ(ref.height, target.height);
-    EXPECT_EQ(ref.startBitrate, target.startBitrate);
-    EXPECT_EQ(ref.maxBitrate, target.maxBitrate);
-    EXPECT_EQ(ref.minBitrate, target.minBitrate);
-    EXPECT_EQ(ref.maxFramerate, target.maxFramerate);
-    EXPECT_EQ(ref.VP8().pictureLossIndicationOn,
-              target.VP8().pictureLossIndicationOn);
-    EXPECT_EQ(ref.VP8().complexity, target.VP8().complexity);
-    EXPECT_EQ(ref.VP8().resilience, target.VP8().resilience);
-    EXPECT_EQ(ref.VP8().numberOfTemporalLayers,
-              target.VP8().numberOfTemporalLayers);
-    EXPECT_EQ(ref.VP8().denoisingOn, target.VP8().denoisingOn);
-    EXPECT_EQ(ref.VP8().errorConcealmentOn, target.VP8().errorConcealmentOn);
-    EXPECT_EQ(ref.VP8().automaticResizeOn, target.VP8().automaticResizeOn);
-    EXPECT_EQ(ref.VP8().frameDroppingOn, target.VP8().frameDroppingOn);
-    EXPECT_EQ(ref.VP8().keyFrameInterval, target.VP8().keyFrameInterval);
-    EXPECT_EQ(ref.qpMax, target.qpMax);
-    EXPECT_EQ(0, target.numberOfSimulcastStreams);
-    EXPECT_EQ(ref.mode, target.mode);
-
-    // No need to compare simulcastStream as numberOfSimulcastStreams should
-    // always be 0.
-  }
-
-  void InitRefCodec(int stream_index, VideoCodec* ref_codec) {
-    *ref_codec = codec_;
-    ref_codec->VP8()->numberOfTemporalLayers =
-        kTestTemporalLayerProfile[stream_index];
-    ref_codec->VP8()->tl_factory = &tl_factory_;
-    ref_codec->width = codec_.simulcastStream[stream_index].width;
-    ref_codec->height = codec_.simulcastStream[stream_index].height;
-    ref_codec->maxBitrate = codec_.simulcastStream[stream_index].maxBitrate;
-    ref_codec->minBitrate = codec_.simulcastStream[stream_index].minBitrate;
-    ref_codec->qpMax = codec_.simulcastStream[stream_index].qpMax;
-  }
-
-  void VerifyCodecSettings() {
-    EXPECT_EQ(3u, helper_->factory()->encoders().size());
-    VideoCodec ref_codec;
-
-    // stream 0, the lowest resolution stream.
-    InitRefCodec(0, &ref_codec);
-    ref_codec.qpMax = 45;
-    ref_codec.VP8()->complexity = webrtc::kComplexityHigher;
-    ref_codec.VP8()->denoisingOn = false;
-    ref_codec.startBitrate = 100;  // Should equal to the target bitrate.
-    VerifyCodec(ref_codec, 0);
-
-    // stream 1
-    InitRefCodec(1, &ref_codec);
-    ref_codec.VP8()->denoisingOn = false;
-    // The start bitrate (300kbit) minus what we have for the lower layers
-    // (100kbit).
-    ref_codec.startBitrate = 200;
-    VerifyCodec(ref_codec, 1);
-
-    // stream 2, the biggest resolution stream.
-    InitRefCodec(2, &ref_codec);
-    // We don't have enough bits to send this, so the adapter should have
-    // configured it to use the min bitrate for this layer (600kbit) but turn
-    // off sending.
-    ref_codec.startBitrate = 600;
-    VerifyCodec(ref_codec, 2);
-  }
-
- protected:
-  std::unique_ptr<TestSimulcastEncoderAdapterFakeHelper> helper_;
-  std::unique_ptr<VP8Encoder> adapter_;
-  VideoCodec codec_;
-  int last_encoded_image_width_;
-  int last_encoded_image_height_;
-  int last_encoded_image_simulcast_index_;
-  TemporalLayersFactory tl_factory_;
-  std::unique_ptr<SimulcastRateAllocator> rate_allocator_;
-};
-
-TEST_F(TestSimulcastEncoderAdapterFake, InitEncode) {
-  SetupCodec();
-  VerifyCodecSettings();
-}
-
-TEST_F(TestSimulcastEncoderAdapterFake, ReleaseWithoutInitEncode) {
-  EXPECT_EQ(0, adapter_->Release());
-}
-
-TEST_F(TestSimulcastEncoderAdapterFake, Reinit) {
-  SetupCodec();
-  EXPECT_EQ(0, adapter_->Release());
-
-  EXPECT_EQ(0, adapter_->InitEncode(&codec_, 1, 1200));
-}
-
-TEST_F(TestSimulcastEncoderAdapterFake, SetChannelParameters) {
-  SetupCodec();
-  const uint32_t packetLoss = 5;
-  const int64_t rtt = 30;
-  helper_->ExpectCallSetChannelParameters(packetLoss, rtt);
-  adapter_->SetChannelParameters(packetLoss, rtt);
-}
-
-TEST_F(TestSimulcastEncoderAdapterFake, EncodedCallbackForDifferentEncoders) {
-  SetupCodec();
-
-  // Set bitrates so that we send all layers.
-  adapter_->SetRateAllocation(rate_allocator_->GetAllocation(1200, 30), 30);
-
-  // At this point, the simulcast encoder adapter should have 3 streams: HD,
-  // quarter HD, and quarter quarter HD. We're going to mostly ignore the exact
-  // resolutions, to test that the adapter forwards on the correct resolution
-  // and simulcast index values, going only off the encoder that generates the
-  // image.
-  std::vector<MockVideoEncoder*> encoders = helper_->factory()->encoders();
-  ASSERT_EQ(3u, encoders.size());
-  encoders[0]->SendEncodedImage(1152, 704);
-  int width;
-  int height;
-  int simulcast_index;
-  EXPECT_TRUE(GetLastEncodedImageInfo(&width, &height, &simulcast_index));
-  EXPECT_EQ(1152, width);
-  EXPECT_EQ(704, height);
-  EXPECT_EQ(0, simulcast_index);
-
-  encoders[1]->SendEncodedImage(300, 620);
-  EXPECT_TRUE(GetLastEncodedImageInfo(&width, &height, &simulcast_index));
-  EXPECT_EQ(300, width);
-  EXPECT_EQ(620, height);
-  EXPECT_EQ(1, simulcast_index);
-
-  encoders[2]->SendEncodedImage(120, 240);
-  EXPECT_TRUE(GetLastEncodedImageInfo(&width, &height, &simulcast_index));
-  EXPECT_EQ(120, width);
-  EXPECT_EQ(240, height);
-  EXPECT_EQ(2, simulcast_index);
-}
-
-// This test verifies that the underlying encoders are reused, when the adapter
-// is reinited with different number of simulcast streams. It further checks
-// that the allocated encoders are reused in the same order as before, starting
-// with the lowest stream.
-TEST_F(TestSimulcastEncoderAdapterFake, ReusesEncodersInOrder) {
-  // Set up common settings for three streams.
-  TestVp8Simulcast::DefaultSettings(
-      &codec_, static_cast<const int*>(kTestTemporalLayerProfile));
-  rate_allocator_.reset(new SimulcastRateAllocator(codec_, nullptr));
-  tl_factory_.SetListener(rate_allocator_.get());
-  codec_.VP8()->tl_factory = &tl_factory_;
-  adapter_->RegisterEncodeCompleteCallback(this);
-
-  // Input data.
-  rtc::scoped_refptr<VideoFrameBuffer> buffer(I420Buffer::Create(1280, 720));
-  VideoFrame input_frame(buffer, 100, 1000, kVideoRotation_180);
-  std::vector<FrameType> frame_types;
-
-  // Encode with three streams.
-  EXPECT_EQ(0, adapter_->InitEncode(&codec_, 1, 1200));
-  VerifyCodecSettings();
-  std::vector<MockVideoEncoder*> original_encoders =
-      helper_->factory()->encoders();
-  ASSERT_EQ(3u, original_encoders.size());
-  EXPECT_CALL(*original_encoders[0], Encode(_, _, _))
-      .WillOnce(Return(WEBRTC_VIDEO_CODEC_OK));
-  EXPECT_CALL(*original_encoders[1], Encode(_, _, _))
-      .WillOnce(Return(WEBRTC_VIDEO_CODEC_OK));
-  EXPECT_CALL(*original_encoders[2], Encode(_, _, _))
-      .WillOnce(Return(WEBRTC_VIDEO_CODEC_OK));
-  frame_types.resize(3, kVideoFrameKey);
-  EXPECT_EQ(0, adapter_->Encode(input_frame, nullptr, &frame_types));
-  EXPECT_CALL(*original_encoders[0], Release())
-      .WillOnce(Return(WEBRTC_VIDEO_CODEC_OK));
-  EXPECT_CALL(*original_encoders[1], Release())
-      .WillOnce(Return(WEBRTC_VIDEO_CODEC_OK));
-  EXPECT_CALL(*original_encoders[2], Release())
-      .WillOnce(Return(WEBRTC_VIDEO_CODEC_OK));
-  EXPECT_EQ(0, adapter_->Release());
-
-  // Encode with two streams.
-  codec_.width /= 2;
-  codec_.height /= 2;
-  codec_.numberOfSimulcastStreams = 2;
-  EXPECT_EQ(0, adapter_->InitEncode(&codec_, 1, 1200));
-  std::vector<MockVideoEncoder*> new_encoders = helper_->factory()->encoders();
-  ASSERT_EQ(2u, new_encoders.size());
-  ASSERT_EQ(original_encoders[0], new_encoders[0]);
-  EXPECT_CALL(*original_encoders[0], Encode(_, _, _))
-      .WillOnce(Return(WEBRTC_VIDEO_CODEC_OK));
-  ASSERT_EQ(original_encoders[1], new_encoders[1]);
-  EXPECT_CALL(*original_encoders[1], Encode(_, _, _))
-      .WillOnce(Return(WEBRTC_VIDEO_CODEC_OK));
-  frame_types.resize(2, kVideoFrameKey);
-  EXPECT_EQ(0, adapter_->Encode(input_frame, nullptr, &frame_types));
-  EXPECT_CALL(*original_encoders[0], Release())
-      .WillOnce(Return(WEBRTC_VIDEO_CODEC_OK));
-  EXPECT_CALL(*original_encoders[1], Release())
-      .WillOnce(Return(WEBRTC_VIDEO_CODEC_OK));
-  EXPECT_EQ(0, adapter_->Release());
-
-  // Encode with single stream.
-  codec_.width /= 2;
-  codec_.height /= 2;
-  codec_.numberOfSimulcastStreams = 1;
-  EXPECT_EQ(0, adapter_->InitEncode(&codec_, 1, 1200));
-  new_encoders = helper_->factory()->encoders();
-  ASSERT_EQ(1u, new_encoders.size());
-  ASSERT_EQ(original_encoders[0], new_encoders[0]);
-  EXPECT_CALL(*original_encoders[0], Encode(_, _, _))
-      .WillOnce(Return(WEBRTC_VIDEO_CODEC_OK));
-  frame_types.resize(1, kVideoFrameKey);
-  EXPECT_EQ(0, adapter_->Encode(input_frame, nullptr, &frame_types));
-  EXPECT_CALL(*original_encoders[0], Release())
-      .WillOnce(Return(WEBRTC_VIDEO_CODEC_OK));
-  EXPECT_EQ(0, adapter_->Release());
-
-  // Encode with three streams, again.
-  codec_.width *= 4;
-  codec_.height *= 4;
-  codec_.numberOfSimulcastStreams = 3;
-  EXPECT_EQ(0, adapter_->InitEncode(&codec_, 1, 1200));
-  new_encoders = helper_->factory()->encoders();
-  ASSERT_EQ(3u, new_encoders.size());
-  // The first encoder is reused.
-  ASSERT_EQ(original_encoders[0], new_encoders[0]);
-  EXPECT_CALL(*original_encoders[0], Encode(_, _, _))
-      .WillOnce(Return(WEBRTC_VIDEO_CODEC_OK));
-  // The second and third encoders are new.
-  EXPECT_CALL(*new_encoders[1], Encode(_, _, _))
-      .WillOnce(Return(WEBRTC_VIDEO_CODEC_OK));
-  EXPECT_CALL(*new_encoders[2], Encode(_, _, _))
-      .WillOnce(Return(WEBRTC_VIDEO_CODEC_OK));
-  frame_types.resize(3, kVideoFrameKey);
-  EXPECT_EQ(0, adapter_->Encode(input_frame, nullptr, &frame_types));
-  EXPECT_CALL(*original_encoders[0], Release())
-      .WillOnce(Return(WEBRTC_VIDEO_CODEC_OK));
-  EXPECT_CALL(*new_encoders[1], Release())
-      .WillOnce(Return(WEBRTC_VIDEO_CODEC_OK));
-  EXPECT_CALL(*new_encoders[2], Release())
-      .WillOnce(Return(WEBRTC_VIDEO_CODEC_OK));
-  EXPECT_EQ(0, adapter_->Release());
-}
-
-TEST_F(TestSimulcastEncoderAdapterFake, DoesNotLeakEncoders) {
-  SetupCodec();
-  VerifyCodecSettings();
-
-  EXPECT_EQ(3u, helper_->factory()->encoders().size());
-
-  // The adapter should destroy all encoders it has allocated. Since
-  // |helper_->factory()| is owned by |adapter_|, however, we need to rely on
-  // lsan to find leaks here.
-  EXPECT_EQ(0, adapter_->Release());
-  adapter_.reset();
-}
-
-// This test verifies that an adapter reinit with the same codec settings as
-// before does not change the underlying encoder codec settings.
-TEST_F(TestSimulcastEncoderAdapterFake, ReinitDoesNotReorderEncoderSettings) {
-  SetupCodec();
-  VerifyCodecSettings();
-
-  // Capture current codec settings.
-  std::vector<MockVideoEncoder*> encoders = helper_->factory()->encoders();
-  ASSERT_EQ(3u, encoders.size());
-  std::array<VideoCodec, 3> codecs_before;
-  for (int i = 0; i < 3; ++i) {
-    codecs_before[i] = encoders[i]->codec();
-  }
-
-  // Reinitialize and verify that the new codec settings are the same.
-  EXPECT_EQ(0, adapter_->Release());
-  EXPECT_EQ(0, adapter_->InitEncode(&codec_, 1, 1200));
-  for (int i = 0; i < 3; ++i) {
-    const VideoCodec& codec_before = codecs_before[i];
-    const VideoCodec& codec_after = encoders[i]->codec();
-
-    // webrtc::VideoCodec does not implement operator==.
-    EXPECT_EQ(codec_before.codecType, codec_after.codecType);
-    EXPECT_EQ(codec_before.plType, codec_after.plType);
-    EXPECT_EQ(codec_before.width, codec_after.width);
-    EXPECT_EQ(codec_before.height, codec_after.height);
-    EXPECT_EQ(codec_before.startBitrate, codec_after.startBitrate);
-    EXPECT_EQ(codec_before.maxBitrate, codec_after.maxBitrate);
-    EXPECT_EQ(codec_before.minBitrate, codec_after.minBitrate);
-    EXPECT_EQ(codec_before.targetBitrate, codec_after.targetBitrate);
-    EXPECT_EQ(codec_before.maxFramerate, codec_after.maxFramerate);
-    EXPECT_EQ(codec_before.qpMax, codec_after.qpMax);
-    EXPECT_EQ(codec_before.numberOfSimulcastStreams,
-              codec_after.numberOfSimulcastStreams);
-    EXPECT_EQ(codec_before.mode, codec_after.mode);
-    EXPECT_EQ(codec_before.expect_encode_from_texture,
-              codec_after.expect_encode_from_texture);
-  }
-}
-
-// This test is similar to the one above, except that it tests the simulcastIdx
-// from the CodecSpecificInfo that is connected to an encoded frame. The
-// PayloadRouter demuxes the incoming encoded frames on different RTP modules
-// using the simulcastIdx, so it's important that there is no corresponding
-// encoder reordering in between adapter reinits as this would lead to PictureID
-// discontinuities.
-TEST_F(TestSimulcastEncoderAdapterFake, ReinitDoesNotReorderFrameSimulcastIdx) {
-  SetupCodec();
-  adapter_->SetRateAllocation(rate_allocator_->GetAllocation(1200, 30), 30);
-  VerifyCodecSettings();
-
-  // Send frames on all streams.
-  std::vector<MockVideoEncoder*> encoders = helper_->factory()->encoders();
-  ASSERT_EQ(3u, encoders.size());
-  encoders[0]->SendEncodedImage(1152, 704);
-  int width;
-  int height;
-  int simulcast_index;
-  EXPECT_TRUE(GetLastEncodedImageInfo(&width, &height, &simulcast_index));
-  EXPECT_EQ(0, simulcast_index);
-
-  encoders[1]->SendEncodedImage(300, 620);
-  EXPECT_TRUE(GetLastEncodedImageInfo(&width, &height, &simulcast_index));
-  EXPECT_EQ(1, simulcast_index);
-
-  encoders[2]->SendEncodedImage(120, 240);
-  EXPECT_TRUE(GetLastEncodedImageInfo(&width, &height, &simulcast_index));
-  EXPECT_EQ(2, simulcast_index);
-
-  // Reinitialize.
-  EXPECT_EQ(0, adapter_->Release());
-  EXPECT_EQ(0, adapter_->InitEncode(&codec_, 1, 1200));
-  adapter_->SetRateAllocation(rate_allocator_->GetAllocation(1200, 30), 30);
-
-  // Verify that the same encoder sends out frames on the same simulcast index.
-  encoders[0]->SendEncodedImage(1152, 704);
-  EXPECT_TRUE(GetLastEncodedImageInfo(&width, &height, &simulcast_index));
-  EXPECT_EQ(0, simulcast_index);
-
-  encoders[1]->SendEncodedImage(300, 620);
-  EXPECT_TRUE(GetLastEncodedImageInfo(&width, &height, &simulcast_index));
-  EXPECT_EQ(1, simulcast_index);
-
-  encoders[2]->SendEncodedImage(120, 240);
-  EXPECT_TRUE(GetLastEncodedImageInfo(&width, &height, &simulcast_index));
-  EXPECT_EQ(2, simulcast_index);
-}
-
-TEST_F(TestSimulcastEncoderAdapterFake, SupportsNativeHandleForSingleStreams) {
-  TestVp8Simulcast::DefaultSettings(
-      &codec_, static_cast<const int*>(kTestTemporalLayerProfile));
-  codec_.VP8()->tl_factory = &tl_factory_;
-  codec_.numberOfSimulcastStreams = 1;
-  EXPECT_EQ(0, adapter_->InitEncode(&codec_, 1, 1200));
-  adapter_->RegisterEncodeCompleteCallback(this);
-  ASSERT_EQ(1u, helper_->factory()->encoders().size());
-  helper_->factory()->encoders()[0]->set_supports_native_handle(true);
-  EXPECT_TRUE(adapter_->SupportsNativeHandle());
-  helper_->factory()->encoders()[0]->set_supports_native_handle(false);
-  EXPECT_FALSE(adapter_->SupportsNativeHandle());
-}
-
-TEST_F(TestSimulcastEncoderAdapterFake, SetRatesUnderMinBitrate) {
-  TestVp8Simulcast::DefaultSettings(
-      &codec_, static_cast<const int*>(kTestTemporalLayerProfile));
-  codec_.VP8()->tl_factory = &tl_factory_;
-  codec_.minBitrate = 50;
-  codec_.numberOfSimulcastStreams = 1;
-  EXPECT_EQ(0, adapter_->InitEncode(&codec_, 1, 1200));
-  rate_allocator_.reset(new SimulcastRateAllocator(codec_, nullptr));
-
-  // Above min should be respected.
-  BitrateAllocation target_bitrate =
-      rate_allocator_->GetAllocation(codec_.minBitrate * 1000, 30);
-  adapter_->SetRateAllocation(target_bitrate, 30);
-  EXPECT_EQ(target_bitrate,
-            helper_->factory()->encoders()[0]->last_set_bitrate());
-
-  // Below min but non-zero should be replaced with the min bitrate.
-  BitrateAllocation too_low_bitrate =
-      rate_allocator_->GetAllocation((codec_.minBitrate - 1) * 1000, 30);
-  adapter_->SetRateAllocation(too_low_bitrate, 30);
-  EXPECT_EQ(target_bitrate,
-            helper_->factory()->encoders()[0]->last_set_bitrate());
-
-  // Zero should be passed on as is, since it means "pause".
-  adapter_->SetRateAllocation(BitrateAllocation(), 30);
-  EXPECT_EQ(BitrateAllocation(),
-            helper_->factory()->encoders()[0]->last_set_bitrate());
-}
-
-TEST_F(TestSimulcastEncoderAdapterFake, SupportsImplementationName) {
-  EXPECT_STREQ("SimulcastEncoderAdapter", adapter_->ImplementationName());
-  TestVp8Simulcast::DefaultSettings(
-      &codec_, static_cast<const int*>(kTestTemporalLayerProfile));
-  codec_.VP8()->tl_factory = &tl_factory_;
-  std::vector<const char*> encoder_names;
-  encoder_names.push_back("codec1");
-  encoder_names.push_back("codec2");
-  encoder_names.push_back("codec3");
-  helper_->factory()->SetEncoderNames(encoder_names);
-  EXPECT_EQ(0, adapter_->InitEncode(&codec_, 1, 1200));
-  EXPECT_STREQ("SimulcastEncoderAdapter (codec1, codec2, codec3)",
-               adapter_->ImplementationName());
-
-  // Single streams should not expose "SimulcastEncoderAdapter" in name.
-  EXPECT_EQ(0, adapter_->Release());
-  codec_.numberOfSimulcastStreams = 1;
-  EXPECT_EQ(0, adapter_->InitEncode(&codec_, 1, 1200));
-  adapter_->RegisterEncodeCompleteCallback(this);
-  ASSERT_EQ(1u, helper_->factory()->encoders().size());
-  EXPECT_STREQ("codec1", adapter_->ImplementationName());
-}
-
-TEST_F(TestSimulcastEncoderAdapterFake,
-       SupportsNativeHandleForMultipleStreams) {
-  TestVp8Simulcast::DefaultSettings(
-      &codec_, static_cast<const int*>(kTestTemporalLayerProfile));
-  codec_.VP8()->tl_factory = &tl_factory_;
-  codec_.numberOfSimulcastStreams = 3;
-  EXPECT_EQ(0, adapter_->InitEncode(&codec_, 1, 1200));
-  adapter_->RegisterEncodeCompleteCallback(this);
-  ASSERT_EQ(3u, helper_->factory()->encoders().size());
-  for (MockVideoEncoder* encoder : helper_->factory()->encoders())
-    encoder->set_supports_native_handle(true);
-  // If one encoder doesn't support it, then overall support is disabled.
-  helper_->factory()->encoders()[0]->set_supports_native_handle(false);
-  EXPECT_FALSE(adapter_->SupportsNativeHandle());
-  // Once all do, then the adapter claims support.
-  helper_->factory()->encoders()[0]->set_supports_native_handle(true);
-  EXPECT_TRUE(adapter_->SupportsNativeHandle());
-}
-
-// TODO(nisse): Reuse definition in webrtc/test/fake_texture_handle.h.
-class FakeNativeBuffer : public VideoFrameBuffer {
- public:
-  FakeNativeBuffer(int width, int height) : width_(width), height_(height) {}
-
-  Type type() const override { return Type::kNative; }
-  int width() const override { return width_; }
-  int height() const override { return height_; }
-
-  rtc::scoped_refptr<I420BufferInterface> ToI420() override {
-    RTC_NOTREACHED();
-    return nullptr;
-  }
-
- private:
-  const int width_;
-  const int height_;
-};
-
-TEST_F(TestSimulcastEncoderAdapterFake,
-       NativeHandleForwardingForMultipleStreams) {
-  TestVp8Simulcast::DefaultSettings(
-      &codec_, static_cast<const int*>(kTestTemporalLayerProfile));
-  codec_.VP8()->tl_factory = &tl_factory_;
-  codec_.numberOfSimulcastStreams = 3;
-  // High start bitrate, so all streams are enabled.
-  codec_.startBitrate = 3000;
-  EXPECT_EQ(0, adapter_->InitEncode(&codec_, 1, 1200));
-  adapter_->RegisterEncodeCompleteCallback(this);
-  ASSERT_EQ(3u, helper_->factory()->encoders().size());
-  for (MockVideoEncoder* encoder : helper_->factory()->encoders())
-    encoder->set_supports_native_handle(true);
-  EXPECT_TRUE(adapter_->SupportsNativeHandle());
-
-  rtc::scoped_refptr<VideoFrameBuffer> buffer(
-      new rtc::RefCountedObject<FakeNativeBuffer>(1280, 720));
-  VideoFrame input_frame(buffer, 100, 1000, kVideoRotation_180);
-  // Expect calls with the given video frame verbatim, since it's a texture
-  // frame and can't otherwise be modified/resized.
-  for (MockVideoEncoder* encoder : helper_->factory()->encoders())
-    EXPECT_CALL(*encoder, Encode(::testing::Ref(input_frame), _, _)).Times(1);
-  std::vector<FrameType> frame_types(3, kVideoFrameKey);
-  EXPECT_EQ(0, adapter_->Encode(input_frame, nullptr, &frame_types));
-}
-
-TEST_F(TestSimulcastEncoderAdapterFake, TestFailureReturnCodesFromEncodeCalls) {
-  TestVp8Simulcast::DefaultSettings(
-      &codec_, static_cast<const int*>(kTestTemporalLayerProfile));
-  codec_.VP8()->tl_factory = &tl_factory_;
-  codec_.numberOfSimulcastStreams = 3;
-  EXPECT_EQ(0, adapter_->InitEncode(&codec_, 1, 1200));
-  adapter_->RegisterEncodeCompleteCallback(this);
-  ASSERT_EQ(3u, helper_->factory()->encoders().size());
-  // Tell the 2nd encoder to request software fallback.
-  EXPECT_CALL(*helper_->factory()->encoders()[1], Encode(_, _, _))
-      .WillOnce(Return(WEBRTC_VIDEO_CODEC_FALLBACK_SOFTWARE));
-
-  // Send a fake frame and assert the return is software fallback.
-  rtc::scoped_refptr<I420Buffer> input_buffer =
-      I420Buffer::Create(kDefaultWidth, kDefaultHeight);
-  input_buffer->InitializeData();
-  VideoFrame input_frame(input_buffer, 0, 0, webrtc::kVideoRotation_0);
-  std::vector<FrameType> frame_types(3, kVideoFrameKey);
-  EXPECT_EQ(WEBRTC_VIDEO_CODEC_FALLBACK_SOFTWARE,
-            adapter_->Encode(input_frame, nullptr, &frame_types));
-}
-
-TEST_F(TestSimulcastEncoderAdapterFake, TestInitFailureCleansUpEncoders) {
-  TestVp8Simulcast::DefaultSettings(
-      &codec_, static_cast<const int*>(kTestTemporalLayerProfile));
-  codec_.VP8()->tl_factory = &tl_factory_;
-  codec_.numberOfSimulcastStreams = 3;
-  helper_->factory()->set_init_encode_return_value(
-      WEBRTC_VIDEO_CODEC_FALLBACK_SOFTWARE);
-  EXPECT_EQ(WEBRTC_VIDEO_CODEC_FALLBACK_SOFTWARE,
-            adapter_->InitEncode(&codec_, 1, 1200));
-  EXPECT_TRUE(helper_->factory()->encoders().empty());
-}
-
-}  // namespace testing
-}  // namespace webrtc
diff --git a/media/engine/simulcast_unittest.cc b/media/engine/simulcast_unittest.cc
deleted file mode 100644
index 8377d4f..0000000
--- a/media/engine/simulcast_unittest.cc
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- *  Copyright (c) 2014 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 <string>
-
-#include "webrtc/media/engine/simulcast.h"
-#include "webrtc/test/gtest.h"
-
-namespace cricket {
-
-class ScreenshareLayerConfigTest : public testing::Test,
-                                   protected ScreenshareLayerConfig {
- public:
-  ScreenshareLayerConfigTest() : ScreenshareLayerConfig(0, 0) {}
-
-  void ExpectParsingFails(const std::string& group) {
-    ScreenshareLayerConfig config(100, 1000);
-    EXPECT_FALSE(FromFieldTrialGroup(group, &config));
-  }
-};
-
-TEST_F(ScreenshareLayerConfigTest, UsesDefaultBitrateConfigForDefaultGroup) {
-  ExpectParsingFails("");
-}
-
-TEST_F(ScreenshareLayerConfigTest, UsesDefaultConfigForInvalidBitrates) {
-  ExpectParsingFails("-");
-  ExpectParsingFails("1-");
-  ExpectParsingFails("-1");
-  ExpectParsingFails("-12");
-  ExpectParsingFails("12-");
-  ExpectParsingFails("booh!");
-  ExpectParsingFails("1-b");
-  ExpectParsingFails("a-2");
-  ExpectParsingFails("49-1000");
-  ExpectParsingFails("50-6001");
-  ExpectParsingFails("100-99");
-  ExpectParsingFails("1002003004005006-99");
-  ExpectParsingFails("99-1002003004005006");
-}
-
-TEST_F(ScreenshareLayerConfigTest, ParsesValidBitrateConfig) {
-  ScreenshareLayerConfig config(100, 1000);
-  EXPECT_TRUE(ScreenshareLayerConfig::FromFieldTrialGroup("101-1001", &config));
-  EXPECT_EQ(101, config.tl0_bitrate_kbps);
-  EXPECT_EQ(1001, config.tl1_bitrate_kbps);
-}
-
-}  // namespace cricket
diff --git a/media/engine/videodecodersoftwarefallbackwrapper.cc b/media/engine/videodecodersoftwarefallbackwrapper.cc
deleted file mode 100644
index 0e7632b..0000000
--- a/media/engine/videodecodersoftwarefallbackwrapper.cc
+++ /dev/null
@@ -1,147 +0,0 @@
-/*
- *  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/media/engine/videodecodersoftwarefallbackwrapper.h"
-
-#include <string>
-
-#include "webrtc/media/engine/internaldecoderfactory.h"
-#include "webrtc/modules/video_coding/include/video_error_codes.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/trace_event.h"
-
-namespace webrtc {
-
-VideoDecoderSoftwareFallbackWrapper::VideoDecoderSoftwareFallbackWrapper(
-    VideoCodecType codec_type,
-    std::unique_ptr<VideoDecoder> decoder)
-    : codec_type_(codec_type),
-      decoder_(std::move(decoder)),
-      decoder_initialized_(false),
-      callback_(nullptr) {}
-
-int32_t VideoDecoderSoftwareFallbackWrapper::InitDecode(
-    const VideoCodec* codec_settings,
-    int32_t number_of_cores) {
-  RTC_DCHECK(!fallback_decoder_) << "Fallback decoder should never be "
-                                    "initialized here, it should've been "
-                                    "released.";
-  codec_settings_ = *codec_settings;
-  number_of_cores_ = number_of_cores;
-  int32_t ret = decoder_->InitDecode(codec_settings, number_of_cores);
-  if (ret != WEBRTC_VIDEO_CODEC_FALLBACK_SOFTWARE) {
-    decoder_initialized_ = (ret == WEBRTC_VIDEO_CODEC_OK);
-    return ret;
-  }
-  decoder_initialized_ = false;
-
-  // Try to initialize fallback decoder.
-  if (InitFallbackDecoder())
-    return WEBRTC_VIDEO_CODEC_OK;
-  return ret;
-}
-
-bool VideoDecoderSoftwareFallbackWrapper::InitFallbackDecoder() {
-  RTC_CHECK(codec_type_ != kVideoCodecUnknown)
-      << "Decoder requesting fallback to codec not supported in software.";
-  LOG(LS_WARNING) << "Decoder falling back to software decoding.";
-  cricket::InternalDecoderFactory internal_decoder_factory;
-  fallback_decoder_.reset(
-      internal_decoder_factory.CreateVideoDecoder(codec_type_));
-  if (fallback_decoder_->InitDecode(&codec_settings_, number_of_cores_) !=
-      WEBRTC_VIDEO_CODEC_OK) {
-    LOG(LS_ERROR) << "Failed to initialize software-decoder fallback.";
-    fallback_decoder_.reset();
-    return false;
-  }
-  if (callback_)
-    fallback_decoder_->RegisterDecodeCompleteCallback(callback_);
-  fallback_implementation_name_ =
-      std::string(fallback_decoder_->ImplementationName()) +
-      " (fallback from: " + decoder_->ImplementationName() + ")";
-  return true;
-}
-
-int32_t VideoDecoderSoftwareFallbackWrapper::Decode(
-    const EncodedImage& input_image,
-    bool missing_frames,
-    const RTPFragmentationHeader* fragmentation,
-    const CodecSpecificInfo* codec_specific_info,
-    int64_t render_time_ms) {
-    TRACE_EVENT0("webrtc", "VideoDecoderSoftwareFallbackWrapper::Decode");
-  // Try initializing and decoding with the provided decoder on every keyframe
-  // or when there's no fallback decoder. This is the normal case.
-  if (!fallback_decoder_ || input_image._frameType == kVideoFrameKey) {
-    int32_t ret = WEBRTC_VIDEO_CODEC_FALLBACK_SOFTWARE;
-    // Try reinitializing the decoder if it had failed before.
-    if (!decoder_initialized_) {
-      decoder_initialized_ =
-          decoder_->InitDecode(&codec_settings_, number_of_cores_) ==
-          WEBRTC_VIDEO_CODEC_OK;
-    }
-    if (decoder_initialized_) {
-      ret = decoder_->Decode(input_image, missing_frames, fragmentation,
-                             codec_specific_info, render_time_ms);
-    }
-    if (ret == WEBRTC_VIDEO_CODEC_OK) {
-      if (fallback_decoder_) {
-        // Decode OK -> stop using fallback decoder.
-        LOG(LS_WARNING)
-            << "Decode OK, no longer using the software fallback decoder.";
-        fallback_decoder_->Release();
-        fallback_decoder_.reset();
-        return WEBRTC_VIDEO_CODEC_OK;
-      }
-    }
-    if (ret != WEBRTC_VIDEO_CODEC_FALLBACK_SOFTWARE)
-      return ret;
-    if (!fallback_decoder_) {
-      // Try to initialize fallback decoder.
-      if (!InitFallbackDecoder())
-        return ret;
-    }
-  }
-  return fallback_decoder_->Decode(input_image, missing_frames, fragmentation,
-                                   codec_specific_info, render_time_ms);
-}
-
-int32_t VideoDecoderSoftwareFallbackWrapper::RegisterDecodeCompleteCallback(
-    DecodedImageCallback* callback) {
-  callback_ = callback;
-  int32_t ret = decoder_->RegisterDecodeCompleteCallback(callback);
-  if (fallback_decoder_)
-    return fallback_decoder_->RegisterDecodeCompleteCallback(callback);
-  return ret;
-}
-
-int32_t VideoDecoderSoftwareFallbackWrapper::Release() {
-  if (fallback_decoder_) {
-    LOG(LS_INFO) << "Releasing software fallback decoder.";
-    fallback_decoder_->Release();
-    fallback_decoder_.reset();
-  }
-  decoder_initialized_ = false;
-  return decoder_->Release();
-}
-
-bool VideoDecoderSoftwareFallbackWrapper::PrefersLateDecoding() const {
-  if (fallback_decoder_)
-    return fallback_decoder_->PrefersLateDecoding();
-  return decoder_->PrefersLateDecoding();
-}
-
-const char* VideoDecoderSoftwareFallbackWrapper::ImplementationName() const {
-  if (fallback_decoder_)
-    return fallback_implementation_name_.c_str();
-  return decoder_->ImplementationName();
-}
-
-}  // namespace webrtc
diff --git a/media/engine/videodecodersoftwarefallbackwrapper.h b/media/engine/videodecodersoftwarefallbackwrapper.h
deleted file mode 100644
index d6c3e0e..0000000
--- a/media/engine/videodecodersoftwarefallbackwrapper.h
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- *  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_MEDIA_ENGINE_VIDEODECODERSOFTWAREFALLBACKWRAPPER_H_
-#define WEBRTC_MEDIA_ENGINE_VIDEODECODERSOFTWAREFALLBACKWRAPPER_H_
-
-#include <memory>
-#include <string>
-
-#include "webrtc/api/video_codecs/video_decoder.h"
-
-namespace webrtc {
-
-// Class used to wrap external VideoDecoders to provide a fallback option on
-// software decoding when a hardware decoder fails to decode a stream due to
-// hardware restrictions, such as max resolution.
-class VideoDecoderSoftwareFallbackWrapper : public VideoDecoder {
- public:
-  VideoDecoderSoftwareFallbackWrapper(VideoCodecType codec_type,
-                                      std::unique_ptr<VideoDecoder> decoder);
-
-  int32_t InitDecode(const VideoCodec* codec_settings,
-                     int32_t number_of_cores) override;
-
-  int32_t Decode(const EncodedImage& input_image,
-                 bool missing_frames,
-                 const RTPFragmentationHeader* fragmentation,
-                 const CodecSpecificInfo* codec_specific_info,
-                 int64_t render_time_ms) override;
-
-  int32_t RegisterDecodeCompleteCallback(
-      DecodedImageCallback* callback) override;
-
-  int32_t Release() override;
-  bool PrefersLateDecoding() const override;
-
-  const char* ImplementationName() const override;
-
- private:
-  bool InitFallbackDecoder();
-
-  const VideoCodecType codec_type_;
-  std::unique_ptr<VideoDecoder> decoder_;
-  bool decoder_initialized_;
-
-  VideoCodec codec_settings_;
-  int32_t number_of_cores_;
-  std::string fallback_implementation_name_;
-  std::unique_ptr<VideoDecoder> fallback_decoder_;
-  DecodedImageCallback* callback_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MEDIA_ENGINE_VIDEODECODERSOFTWAREFALLBACKWRAPPER_H_
diff --git a/media/engine/videodecodersoftwarefallbackwrapper_unittest.cc b/media/engine/videodecodersoftwarefallbackwrapper_unittest.cc
deleted file mode 100644
index 84a6a59..0000000
--- a/media/engine/videodecodersoftwarefallbackwrapper_unittest.cc
+++ /dev/null
@@ -1,208 +0,0 @@
-/*
- *  Copyright (c) 2015 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/media/engine/videodecodersoftwarefallbackwrapper.h"
-#include "webrtc/api/video_codecs/video_decoder.h"
-#include "webrtc/modules/video_coding/include/video_error_codes.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-class VideoDecoderSoftwareFallbackWrapperTest : public ::testing::Test {
- protected:
-  VideoDecoderSoftwareFallbackWrapperTest()
-      : fake_decoder_(new CountingFakeDecoder()),
-        fallback_wrapper_(kVideoCodecVP8,
-                          std::unique_ptr<VideoDecoder>(fake_decoder_)) {}
-
-  class CountingFakeDecoder : public VideoDecoder {
-   public:
-    int32_t InitDecode(const VideoCodec* codec_settings,
-                       int32_t number_of_cores) override {
-      ++init_decode_count_;
-      return init_decode_return_code_;
-    }
-
-    int32_t Decode(const EncodedImage& input_image,
-                   bool missing_frames,
-                   const RTPFragmentationHeader* fragmentation,
-                   const CodecSpecificInfo* codec_specific_info,
-                   int64_t render_time_ms) override {
-      ++decode_count_;
-      return decode_return_code_;
-    }
-
-    int32_t RegisterDecodeCompleteCallback(
-        DecodedImageCallback* callback) override {
-      decode_complete_callback_ = callback;
-      return WEBRTC_VIDEO_CODEC_OK;
-    }
-
-    int32_t Release() override {
-      ++release_count_;
-      return WEBRTC_VIDEO_CODEC_OK;
-    }
-
-    const char* ImplementationName() const override {
-      return "fake-decoder";
-    }
-
-    int init_decode_count_ = 0;
-    int decode_count_ = 0;
-    int32_t init_decode_return_code_ = WEBRTC_VIDEO_CODEC_OK;
-    int32_t decode_return_code_ = WEBRTC_VIDEO_CODEC_OK;
-    DecodedImageCallback* decode_complete_callback_ = nullptr;
-    int release_count_ = 0;
-    int reset_count_ = 0;
-  };
-  // |fake_decoder_| is owned and released by |fallback_wrapper_|.
-  CountingFakeDecoder* fake_decoder_;
-  VideoDecoderSoftwareFallbackWrapper fallback_wrapper_;
-};
-
-TEST_F(VideoDecoderSoftwareFallbackWrapperTest, InitializesDecoder) {
-  VideoCodec codec = {};
-  fallback_wrapper_.InitDecode(&codec, 2);
-  EXPECT_EQ(1, fake_decoder_->init_decode_count_);
-
-  EncodedImage encoded_image;
-  encoded_image._frameType = kVideoFrameKey;
-  fallback_wrapper_.Decode(encoded_image, false, nullptr, nullptr, -1);
-  EXPECT_EQ(1, fake_decoder_->init_decode_count_)
-      << "Initialized decoder should not be reinitialized.";
-  EXPECT_EQ(1, fake_decoder_->decode_count_);
-}
-
-TEST_F(VideoDecoderSoftwareFallbackWrapperTest,
-       UsesFallbackDecoderAfterOnInitDecodeFailure) {
-  VideoCodec codec = {};
-  fake_decoder_->init_decode_return_code_ =
-      WEBRTC_VIDEO_CODEC_FALLBACK_SOFTWARE;
-  fallback_wrapper_.InitDecode(&codec, 2);
-  EXPECT_EQ(1, fake_decoder_->init_decode_count_);
-
-  EncodedImage encoded_image;
-  encoded_image._frameType = kVideoFrameKey;
-  fallback_wrapper_.Decode(encoded_image, false, nullptr, nullptr, -1);
-  EXPECT_EQ(2, fake_decoder_->init_decode_count_)
-      << "Should have attempted reinitializing the fallback decoder on "
-         "keyframe.";
-  // Unfortunately faking a VP8 frame is hard. Rely on no Decode -> using SW
-  // decoder.
-  EXPECT_EQ(0, fake_decoder_->decode_count_)
-      << "Decoder used even though no InitDecode had succeeded.";
-}
-
-TEST_F(VideoDecoderSoftwareFallbackWrapperTest,
-       CanRecoverFromSoftwareFallback) {
-  VideoCodec codec = {};
-  fallback_wrapper_.InitDecode(&codec, 2);
-  // Unfortunately faking a VP8 frame is hard. Rely on no Decode -> using SW
-  // decoder.
-  fake_decoder_->decode_return_code_ = WEBRTC_VIDEO_CODEC_FALLBACK_SOFTWARE;
-  EncodedImage encoded_image;
-  fallback_wrapper_.Decode(encoded_image, false, nullptr, nullptr, -1);
-  EXPECT_EQ(1, fake_decoder_->decode_count_);
-
-  // Fail -> fake_decoder shouldn't be used anymore.
-  fallback_wrapper_.Decode(encoded_image, false, nullptr, nullptr, -1);
-  EXPECT_EQ(1, fake_decoder_->decode_count_)
-      << "Decoder used even though fallback should be active.";
-
-  // Should be able to recover on a keyframe.
-  encoded_image._frameType = kVideoFrameKey;
-  fake_decoder_->decode_return_code_ = WEBRTC_VIDEO_CODEC_OK;
-  fallback_wrapper_.Decode(encoded_image, false, nullptr, nullptr, -1);
-  EXPECT_EQ(2, fake_decoder_->decode_count_)
-      << "Wrapper did not try to decode a keyframe using registered decoder.";
-
-  encoded_image._frameType = kVideoFrameDelta;
-  fallback_wrapper_.Decode(encoded_image, false, nullptr, nullptr, -1);
-  EXPECT_EQ(3, fake_decoder_->decode_count_)
-      << "Decoder not used on future delta frames.";
-}
-
-TEST_F(VideoDecoderSoftwareFallbackWrapperTest, DoesNotFallbackOnEveryError) {
-  VideoCodec codec = {};
-  fallback_wrapper_.InitDecode(&codec, 2);
-  fake_decoder_->decode_return_code_ = WEBRTC_VIDEO_CODEC_ERROR;
-  EncodedImage encoded_image;
-  EXPECT_EQ(
-      fake_decoder_->decode_return_code_,
-      fallback_wrapper_.Decode(encoded_image, false, nullptr, nullptr, -1));
-  EXPECT_EQ(1, fake_decoder_->decode_count_);
-
-  fallback_wrapper_.Decode(encoded_image, false, nullptr, nullptr, -1);
-  EXPECT_EQ(2, fake_decoder_->decode_count_)
-      << "Decoder should be active even though previous decode failed.";
-}
-
-TEST_F(VideoDecoderSoftwareFallbackWrapperTest, ForwardsReleaseCall) {
-  VideoCodec codec = {};
-  fallback_wrapper_.InitDecode(&codec, 2);
-  fallback_wrapper_.Release();
-  EXPECT_EQ(1, fake_decoder_->release_count_);
-
-  fake_decoder_->decode_return_code_ = WEBRTC_VIDEO_CODEC_FALLBACK_SOFTWARE;
-  EncodedImage encoded_image;
-  fallback_wrapper_.Decode(encoded_image, false, nullptr, nullptr, -1);
-  EXPECT_EQ(1, fake_decoder_->release_count_)
-      << "Decoder should not be released during fallback.";
-  fallback_wrapper_.Release();
-  EXPECT_EQ(2, fake_decoder_->release_count_);
-}
-
-// TODO(pbos): Fake a VP8 frame well enough to actually receive a callback from
-// the software decoder.
-TEST_F(VideoDecoderSoftwareFallbackWrapperTest,
-       ForwardsRegisterDecodeCompleteCallback) {
-  class FakeDecodedImageCallback : public DecodedImageCallback {
-    int32_t Decoded(VideoFrame& decodedImage) override { return 0; }
-    int32_t Decoded(
-        webrtc::VideoFrame& decodedImage, int64_t decode_time_ms) override {
-      RTC_NOTREACHED();
-      return -1;
-    }
-    void Decoded(webrtc::VideoFrame& decodedImage,
-                 rtc::Optional<int32_t> decode_time_ms,
-                 rtc::Optional<uint8_t> qp) override {
-      RTC_NOTREACHED();
-    }
-  } callback, callback2;
-
-  VideoCodec codec = {};
-  fallback_wrapper_.InitDecode(&codec, 2);
-  fallback_wrapper_.RegisterDecodeCompleteCallback(&callback);
-  EXPECT_EQ(&callback, fake_decoder_->decode_complete_callback_);
-
-  fake_decoder_->decode_return_code_ = WEBRTC_VIDEO_CODEC_FALLBACK_SOFTWARE;
-  EncodedImage encoded_image;
-  fallback_wrapper_.Decode(encoded_image, false, nullptr, nullptr, -1);
-  fallback_wrapper_.RegisterDecodeCompleteCallback(&callback2);
-  EXPECT_EQ(&callback2, fake_decoder_->decode_complete_callback_);
-}
-
-TEST_F(VideoDecoderSoftwareFallbackWrapperTest,
-       ReportsFallbackImplementationName) {
-  VideoCodec codec = {};
-  fallback_wrapper_.InitDecode(&codec, 2);
-
-  fake_decoder_->decode_return_code_ = WEBRTC_VIDEO_CODEC_FALLBACK_SOFTWARE;
-  EncodedImage encoded_image;
-  fallback_wrapper_.Decode(encoded_image, false, nullptr, nullptr, -1);
-  // Hard coded expected value since libvpx is the software implementation name
-  // for VP8. Change accordingly if the underlying implementation does.
-  EXPECT_STREQ("libvpx (fallback from: fake-decoder)",
-               fallback_wrapper_.ImplementationName());
-  fallback_wrapper_.Release();
-}
-
-}  // namespace webrtc
diff --git a/media/engine/videoencodersoftwarefallbackwrapper.cc b/media/engine/videoencodersoftwarefallbackwrapper.cc
deleted file mode 100644
index 7e2a678..0000000
--- a/media/engine/videoencodersoftwarefallbackwrapper.cc
+++ /dev/null
@@ -1,372 +0,0 @@
-/*
- *  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/media/engine/videoencodersoftwarefallbackwrapper.h"
-
-#include "webrtc/media/base/h264_profile_level_id.h"
-#include "webrtc/media/engine/internalencoderfactory.h"
-#include "webrtc/modules/video_coding/include/video_error_codes.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/timeutils.h"
-#include "webrtc/system_wrappers/include/field_trial.h"
-
-namespace webrtc {
-namespace {
-const char kVp8ForceFallbackEncoderFieldTrial[] =
-    "WebRTC-VP8-Forced-Fallback-Encoder";
-
-bool EnableForcedFallback(const cricket::VideoCodec& codec) {
-  if (!webrtc::field_trial::IsEnabled(kVp8ForceFallbackEncoderFieldTrial))
-    return false;
-
-  return (PayloadStringToCodecType(codec.name) == kVideoCodecVP8);
-}
-
-bool IsForcedFallbackPossible(const VideoCodec& codec_settings) {
-  return codec_settings.codecType == kVideoCodecVP8 &&
-         codec_settings.numberOfSimulcastStreams <= 1 &&
-         codec_settings.VP8().numberOfTemporalLayers == 1;
-}
-
-void GetForcedFallbackParamsFromFieldTrialGroup(uint32_t* param_low_kbps,
-                                                uint32_t* param_high_kbps,
-                                                int64_t* param_min_low_ms) {
-  RTC_DCHECK(param_low_kbps);
-  RTC_DCHECK(param_high_kbps);
-  RTC_DCHECK(param_min_low_ms);
-  std::string group =
-      webrtc::field_trial::FindFullName(kVp8ForceFallbackEncoderFieldTrial);
-  if (group.empty())
-    return;
-
-  int low_kbps;
-  int high_kbps;
-  int min_low_ms;
-  int min_pixels;
-  if (sscanf(group.c_str(), "Enabled-%d,%d,%d,%d", &low_kbps, &high_kbps,
-             &min_low_ms, &min_pixels) != 4) {
-    LOG(LS_WARNING) << "Invalid number of forced fallback parameters provided.";
-    return;
-  }
-  if (min_low_ms <= 0 || min_pixels <= 0 || low_kbps <= 0 ||
-      high_kbps <= low_kbps) {
-    LOG(LS_WARNING) << "Invalid forced fallback parameter value provided.";
-    return;
-  }
-  *param_low_kbps = low_kbps;
-  *param_high_kbps = high_kbps;
-  *param_min_low_ms = min_low_ms;
-}
-}  // namespace
-
-VideoEncoderSoftwareFallbackWrapper::VideoEncoderSoftwareFallbackWrapper(
-    const cricket::VideoCodec& codec,
-    std::unique_ptr<webrtc::VideoEncoder> encoder)
-    : number_of_cores_(0),
-      max_payload_size_(0),
-      rates_set_(false),
-      framerate_(0),
-      channel_parameters_set_(false),
-      packet_loss_(0),
-      rtt_(0),
-      codec_(codec),
-      encoder_(std::move(encoder)),
-      callback_(nullptr),
-      forced_fallback_possible_(EnableForcedFallback(codec)) {
-  if (forced_fallback_possible_) {
-    GetForcedFallbackParamsFromFieldTrialGroup(&forced_fallback_.low_kbps,
-                                               &forced_fallback_.high_kbps,
-                                               &forced_fallback_.min_low_ms);
-  }
-}
-
-bool VideoEncoderSoftwareFallbackWrapper::InitFallbackEncoder() {
-  LOG(LS_WARNING) << "Encoder falling back to software encoding.";
-  MaybeModifyCodecForFallback();
-  cricket::InternalEncoderFactory internal_factory;
-  if (!FindMatchingCodec(internal_factory.supported_codecs(), codec_)) {
-    LOG(LS_WARNING)
-        << "Encoder requesting fallback to codec not supported in software.";
-    return false;
-  }
-  fallback_encoder_.reset(internal_factory.CreateVideoEncoder(codec_));
-  if (fallback_encoder_->InitEncode(&codec_settings_, number_of_cores_,
-                                    max_payload_size_) !=
-      WEBRTC_VIDEO_CODEC_OK) {
-    LOG(LS_ERROR) << "Failed to initialize software-encoder fallback.";
-    fallback_encoder_->Release();
-    fallback_encoder_.reset();
-    return false;
-  }
-  // Replay callback, rates, and channel parameters.
-  if (callback_)
-    fallback_encoder_->RegisterEncodeCompleteCallback(callback_);
-  if (rates_set_)
-    fallback_encoder_->SetRateAllocation(bitrate_allocation_, framerate_);
-  if (channel_parameters_set_)
-    fallback_encoder_->SetChannelParameters(packet_loss_, rtt_);
-
-  fallback_implementation_name_ =
-      std::string(fallback_encoder_->ImplementationName()) +
-      " (fallback from: " + encoder_->ImplementationName() + ")";
-  // Since we're switching to the fallback encoder, Release the real encoder. It
-  // may be re-initialized via InitEncode later, and it will continue to get
-  // Set calls for rates and channel parameters in the meantime.
-  encoder_->Release();
-  return true;
-}
-
-int32_t VideoEncoderSoftwareFallbackWrapper::InitEncode(
-    const VideoCodec* codec_settings,
-    int32_t number_of_cores,
-    size_t max_payload_size) {
-  // Store settings, in case we need to dynamically switch to the fallback
-  // encoder after a failed Encode call.
-  codec_settings_ = *codec_settings;
-  number_of_cores_ = number_of_cores;
-  max_payload_size_ = max_payload_size;
-  // Clear stored rate/channel parameters.
-  rates_set_ = false;
-  channel_parameters_set_ = false;
-  ValidateSettingsForForcedFallback();
-
-  // Try to reinit forced software codec if it is in use.
-  if (TryReInitForcedFallbackEncoder()) {
-    return WEBRTC_VIDEO_CODEC_OK;
-  }
-  forced_fallback_.Reset();
-
-  int32_t ret =
-      encoder_->InitEncode(codec_settings, number_of_cores, max_payload_size);
-  if (ret == WEBRTC_VIDEO_CODEC_OK || codec_.name.empty()) {
-    if (fallback_encoder_) {
-      LOG(LS_WARNING)
-          << "InitEncode OK, no longer using the software fallback encoder.";
-      fallback_encoder_->Release();
-    }
-    fallback_encoder_.reset();
-    if (callback_)
-      encoder_->RegisterEncodeCompleteCallback(callback_);
-    return ret;
-  }
-  // Try to instantiate software codec.
-  if (InitFallbackEncoder()) {
-    return WEBRTC_VIDEO_CODEC_OK;
-  }
-  // Software encoder failed, use original return code.
-  return ret;
-}
-
-int32_t VideoEncoderSoftwareFallbackWrapper::RegisterEncodeCompleteCallback(
-    EncodedImageCallback* callback) {
-  callback_ = callback;
-  int32_t ret = encoder_->RegisterEncodeCompleteCallback(callback);
-  if (fallback_encoder_)
-    return fallback_encoder_->RegisterEncodeCompleteCallback(callback);
-  return ret;
-}
-
-int32_t VideoEncoderSoftwareFallbackWrapper::Release() {
-  // If the fallback_encoder_ is non-null, it means it was created via
-  // InitFallbackEncoder which has Release()d encoder_, so we should only ever
-  // need to Release() whichever one is active.
-  if (fallback_encoder_)
-    return fallback_encoder_->Release();
-  return encoder_->Release();
-}
-
-int32_t VideoEncoderSoftwareFallbackWrapper::Encode(
-    const VideoFrame& frame,
-    const CodecSpecificInfo* codec_specific_info,
-    const std::vector<FrameType>* frame_types) {
-  if (TryReleaseForcedFallbackEncoder()) {
-    // Frame may have been converted from kNative to kI420 during fallback.
-    if (encoder_->SupportsNativeHandle() &&
-        frame.video_frame_buffer()->type() != VideoFrameBuffer::Type::kNative) {
-      LOG(LS_WARNING) << "Encoder supports native frames, dropping one frame "
-                      << "to avoid possible reconfig due to format change.";
-      return WEBRTC_VIDEO_CODEC_ERROR;
-    }
-  }
-  if (fallback_encoder_)
-    return fallback_encoder_->Encode(frame, codec_specific_info, frame_types);
-  int32_t ret = encoder_->Encode(frame, codec_specific_info, frame_types);
-  // If requested, try a software fallback.
-  bool fallback_requested =
-      (ret == WEBRTC_VIDEO_CODEC_FALLBACK_SOFTWARE) ||
-      (ret == WEBRTC_VIDEO_CODEC_OK && RequestForcedFallback());
-  if (fallback_requested && InitFallbackEncoder()) {
-    // Fallback was successful.
-    if (ret == WEBRTC_VIDEO_CODEC_FALLBACK_SOFTWARE)
-      forced_fallback_.Reset();  // Not a forced fallback.
-    if (frame.video_frame_buffer()->type() == VideoFrameBuffer::Type::kNative &&
-        !fallback_encoder_->SupportsNativeHandle()) {
-      LOG(LS_WARNING) << "Fallback encoder doesn't support native frames, "
-                      << "dropping one frame.";
-      return WEBRTC_VIDEO_CODEC_ERROR;
-    }
-
-    // Start using the fallback with this frame.
-    return fallback_encoder_->Encode(frame, codec_specific_info, frame_types);
-  }
-  return ret;
-}
-
-int32_t VideoEncoderSoftwareFallbackWrapper::SetChannelParameters(
-    uint32_t packet_loss,
-    int64_t rtt) {
-  channel_parameters_set_ = true;
-  packet_loss_ = packet_loss;
-  rtt_ = rtt;
-  int32_t ret = encoder_->SetChannelParameters(packet_loss, rtt);
-  if (fallback_encoder_)
-    return fallback_encoder_->SetChannelParameters(packet_loss, rtt);
-  return ret;
-}
-
-int32_t VideoEncoderSoftwareFallbackWrapper::SetRateAllocation(
-    const BitrateAllocation& bitrate_allocation,
-    uint32_t framerate) {
-  rates_set_ = true;
-  bitrate_allocation_ = bitrate_allocation;
-  framerate_ = framerate;
-  int32_t ret = encoder_->SetRateAllocation(bitrate_allocation_, framerate);
-  if (fallback_encoder_)
-    return fallback_encoder_->SetRateAllocation(bitrate_allocation_, framerate);
-  return ret;
-}
-
-bool VideoEncoderSoftwareFallbackWrapper::SupportsNativeHandle() const {
-  if (fallback_encoder_)
-    return fallback_encoder_->SupportsNativeHandle();
-  return encoder_->SupportsNativeHandle();
-}
-
-VideoEncoder::ScalingSettings
-VideoEncoderSoftwareFallbackWrapper::GetScalingSettings() const {
-  if (forced_fallback_possible_ && fallback_encoder_)
-    return fallback_encoder_->GetScalingSettings();
-  return encoder_->GetScalingSettings();
-}
-
-const char *VideoEncoderSoftwareFallbackWrapper::ImplementationName() const {
-  if (fallback_encoder_)
-    return fallback_encoder_->ImplementationName();
-  return encoder_->ImplementationName();
-}
-
-bool VideoEncoderSoftwareFallbackWrapper::IsForcedFallbackActive() const {
-  return (forced_fallback_possible_ && fallback_encoder_ &&
-          forced_fallback_.start_ms);
-}
-
-bool VideoEncoderSoftwareFallbackWrapper::RequestForcedFallback() {
-  if (!forced_fallback_possible_ || fallback_encoder_ || !rates_set_)
-    return false;
-
-  // No fallback encoder.
-  return forced_fallback_.ShouldStart(bitrate_allocation_.get_sum_kbps(),
-                                      codec_settings_);
-}
-
-bool VideoEncoderSoftwareFallbackWrapper::TryReleaseForcedFallbackEncoder() {
-  if (!IsForcedFallbackActive())
-    return false;
-
-  if (!forced_fallback_.ShouldStop(bitrate_allocation_.get_sum_kbps(),
-                                   codec_settings_)) {
-    return false;
-  }
-
-  // Release the forced fallback encoder.
-  if (encoder_->InitEncode(&codec_settings_, number_of_cores_,
-                           max_payload_size_) == WEBRTC_VIDEO_CODEC_OK) {
-    LOG(LS_INFO) << "Stop forced SW encoder fallback, max bitrate exceeded.";
-    fallback_encoder_->Release();
-    fallback_encoder_.reset();
-    forced_fallback_.Reset();
-    return true;
-  }
-  return false;
-}
-
-bool VideoEncoderSoftwareFallbackWrapper::TryReInitForcedFallbackEncoder() {
-  if (!IsForcedFallbackActive())
-    return false;
-
-  // Encoder reconfigured.
-  if (!forced_fallback_.IsValid(codec_settings_)) {
-    LOG(LS_INFO) << "Stop forced SW encoder fallback, max pixels exceeded.";
-    return false;
-  }
-  // Settings valid, reinitialize the forced fallback encoder.
-  if (fallback_encoder_->InitEncode(&codec_settings_, number_of_cores_,
-                                    max_payload_size_) !=
-      WEBRTC_VIDEO_CODEC_OK) {
-    LOG(LS_ERROR) << "Failed to init forced SW encoder fallback.";
-    return false;
-  }
-  return true;
-}
-
-void VideoEncoderSoftwareFallbackWrapper::ValidateSettingsForForcedFallback() {
-  if (!forced_fallback_possible_)
-    return;
-
-  if (!IsForcedFallbackPossible(codec_settings_)) {
-    if (IsForcedFallbackActive()) {
-      fallback_encoder_->Release();
-      fallback_encoder_.reset();
-    }
-    LOG(LS_INFO) << "Disable forced_fallback_possible_ due to settings.";
-    forced_fallback_possible_ = false;
-  }
-}
-
-bool VideoEncoderSoftwareFallbackWrapper::ForcedFallbackParams::ShouldStart(
-    uint32_t bitrate_kbps,
-    const VideoCodec& codec) {
-  if (bitrate_kbps > low_kbps || !IsValid(codec)) {
-    start_ms.reset();
-    return false;
-  }
-
-  // Has bitrate been below |low_kbps| for long enough duration.
-  int64_t now_ms = rtc::TimeMillis();
-  if (!start_ms)
-    start_ms.emplace(now_ms);
-
-  if ((now_ms - *start_ms) >= min_low_ms) {
-    LOG(LS_INFO) << "Request forced SW encoder fallback.";
-    // In case the request fails, update time to avoid too frequent requests.
-    start_ms.emplace(now_ms);
-    return true;
-  }
-  return false;
-}
-
-bool VideoEncoderSoftwareFallbackWrapper::ForcedFallbackParams::ShouldStop(
-    uint32_t bitrate_kbps,
-    const VideoCodec& codec) const {
-  return bitrate_kbps >= high_kbps &&
-         (codec.width * codec.height >= kMinPixelsStop);
-}
-
-void VideoEncoderSoftwareFallbackWrapper::MaybeModifyCodecForFallback() {
-  // We have a specific case for H264 ConstrainedBaseline because that is the
-  // only supported profile in Sw fallback.
-  if (!cricket::CodecNamesEq(codec_.name.c_str(), cricket::kH264CodecName))
-    return;
-  codec_.SetParam(cricket::kH264FmtpProfileLevelId,
-                  cricket::kH264ProfileLevelConstrainedBaseline);
-}
-
-}  // namespace webrtc
diff --git a/media/engine/videoencodersoftwarefallbackwrapper.h b/media/engine/videoencodersoftwarefallbackwrapper.h
deleted file mode 100644
index 8dec2f5..0000000
--- a/media/engine/videoencodersoftwarefallbackwrapper.h
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- *  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_MEDIA_ENGINE_VIDEOENCODERSOFTWAREFALLBACKWRAPPER_H_
-#define WEBRTC_MEDIA_ENGINE_VIDEOENCODERSOFTWAREFALLBACKWRAPPER_H_
-
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "webrtc/api/video_codecs/video_encoder.h"
-#include "webrtc/media/base/codec.h"
-
-namespace webrtc {
-
-// Class used to wrap external VideoEncoders to provide a fallback option on
-// software encoding when a hardware encoder fails to encode a stream due to
-// hardware restrictions, such as max resolution.
-class VideoEncoderSoftwareFallbackWrapper : public VideoEncoder {
- public:
-  VideoEncoderSoftwareFallbackWrapper(
-      const cricket::VideoCodec& codec,
-      std::unique_ptr<webrtc::VideoEncoder> encoder);
-
-  int32_t InitEncode(const VideoCodec* codec_settings,
-                     int32_t number_of_cores,
-                     size_t max_payload_size) override;
-
-  int32_t RegisterEncodeCompleteCallback(
-      EncodedImageCallback* callback) override;
-
-  int32_t Release() override;
-  int32_t Encode(const VideoFrame& frame,
-                 const CodecSpecificInfo* codec_specific_info,
-                 const std::vector<FrameType>* frame_types) override;
-  int32_t SetChannelParameters(uint32_t packet_loss, int64_t rtt) override;
-  int32_t SetRateAllocation(const BitrateAllocation& bitrate_allocation,
-                            uint32_t framerate) override;
-  bool SupportsNativeHandle() const override;
-  ScalingSettings GetScalingSettings() const override;
-  const char *ImplementationName() const override;
-
- private:
-  bool InitFallbackEncoder();
-
-  // If |forced_fallback_possible_| is true:
-  // The forced fallback is requested if the target bitrate is below |low_kbps|
-  // for more than |min_low_ms| and the input video resolution is not larger
-  // than |kMaxPixelsStart|.
-  // If the bitrate is above |high_kbps| and the resolution is not smaller than
-  // |kMinPixelsStop|, the forced fallback is requested to immediately be
-  // stopped.
-  class ForcedFallbackParams {
-   public:
-    bool ShouldStart(uint32_t bitrate_kbps, const VideoCodec& codec);
-    bool ShouldStop(uint32_t bitrate_kbps, const VideoCodec& codec) const;
-    void Reset() { start_ms.reset(); }
-    bool IsValid(const VideoCodec& codec) const {
-      return codec.width * codec.height <= kMaxPixelsStart;
-    }
-    rtc::Optional<int64_t> start_ms;  // Set when bitrate is below |low_kbps|.
-    uint32_t low_kbps = 100;
-    uint32_t high_kbps = 150;
-    int64_t min_low_ms = 10000;
-    const int kMaxPixelsStart = 320 * 240;
-    const int kMinPixelsStop = 320 * 180;
-  };
-
-  bool RequestForcedFallback();
-  bool TryReleaseForcedFallbackEncoder();
-  bool TryReInitForcedFallbackEncoder();
-  void ValidateSettingsForForcedFallback();
-  bool IsForcedFallbackActive() const;
-  void MaybeModifyCodecForFallback();
-
-  // Settings used in the last InitEncode call and used if a dynamic fallback to
-  // software is required.
-  VideoCodec codec_settings_;
-  int32_t number_of_cores_;
-  size_t max_payload_size_;
-
-  // The last bitrate/framerate set, and a flag for noting they are set.
-  bool rates_set_;
-  BitrateAllocation bitrate_allocation_;
-  uint32_t framerate_;
-
-  // The last channel parameters set, and a flag for noting they are set.
-  bool channel_parameters_set_;
-  uint32_t packet_loss_;
-  int64_t rtt_;
-
-  cricket::VideoCodec codec_;
-  std::unique_ptr<webrtc::VideoEncoder> encoder_;
-
-  std::unique_ptr<webrtc::VideoEncoder> fallback_encoder_;
-  std::string fallback_implementation_name_;
-  EncodedImageCallback* callback_;
-
-  bool forced_fallback_possible_;
-  ForcedFallbackParams forced_fallback_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MEDIA_ENGINE_VIDEOENCODERSOFTWAREFALLBACKWRAPPER_H_
diff --git a/media/engine/videoencodersoftwarefallbackwrapper_unittest.cc b/media/engine/videoencodersoftwarefallbackwrapper_unittest.cc
deleted file mode 100644
index f8521ab..0000000
--- a/media/engine/videoencodersoftwarefallbackwrapper_unittest.cc
+++ /dev/null
@@ -1,647 +0,0 @@
-/*
- *  Copyright (c) 2015 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/media/engine/videoencodersoftwarefallbackwrapper.h"
-
-#include <utility>
-
-#include "webrtc/api/video/i420_buffer.h"
-#include "webrtc/modules/video_coding/codecs/vp8/simulcast_rate_allocator.h"
-#include "webrtc/modules/video_coding/codecs/vp8/temporal_layers.h"
-#include "webrtc/modules/video_coding/include/video_codec_interface.h"
-#include "webrtc/modules/video_coding/include/video_error_codes.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/fakeclock.h"
-#include "webrtc/test/field_trial.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-namespace {
-const int kWidth = 320;
-const int kHeight = 240;
-const int kNumCores = 2;
-const uint32_t kFramerate = 30;
-const size_t kMaxPayloadSize = 800;
-const int kDefaultMinPixelsPerFrame = 320 * 180;
-}  // namespace
-
-class VideoEncoderSoftwareFallbackWrapperTest : public ::testing::Test {
- protected:
-  VideoEncoderSoftwareFallbackWrapperTest()
-      : VideoEncoderSoftwareFallbackWrapperTest("") {}
-  explicit VideoEncoderSoftwareFallbackWrapperTest(
-      const std::string& field_trials)
-      : override_field_trials_(field_trials),
-        fake_encoder_(new CountingFakeEncoder()),
-        fallback_wrapper_(cricket::VideoCodec("VP8"),
-                          std::unique_ptr<VideoEncoder>(fake_encoder_)) {}
-
-  class CountingFakeEncoder : public VideoEncoder {
-   public:
-    int32_t InitEncode(const VideoCodec* codec_settings,
-                       int32_t number_of_cores,
-                       size_t max_payload_size) override {
-      ++init_encode_count_;
-      return init_encode_return_code_;
-    }
-    int32_t Encode(const VideoFrame& frame,
-                   const CodecSpecificInfo* codec_specific_info,
-                   const std::vector<FrameType>* frame_types) override {
-      ++encode_count_;
-      if (encode_complete_callback_ &&
-          encode_return_code_ == WEBRTC_VIDEO_CODEC_OK) {
-        CodecSpecificInfo info;
-        info.codec_name = ImplementationName();
-        encode_complete_callback_->OnEncodedImage(EncodedImage(), &info,
-                                                  nullptr);
-      }
-      return encode_return_code_;
-    }
-
-    int32_t RegisterEncodeCompleteCallback(
-        EncodedImageCallback* callback) override {
-      encode_complete_callback_ = callback;
-      return WEBRTC_VIDEO_CODEC_OK;
-    }
-
-    int32_t Release() override {
-      ++release_count_;
-      return WEBRTC_VIDEO_CODEC_OK;
-    }
-
-    int32_t SetChannelParameters(uint32_t packet_loss, int64_t rtt) override {
-      ++set_channel_parameters_count_;
-      return WEBRTC_VIDEO_CODEC_OK;
-    }
-
-    int32_t SetRateAllocation(const BitrateAllocation& bitrate_allocation,
-                              uint32_t framerate) override {
-      ++set_rates_count_;
-      return WEBRTC_VIDEO_CODEC_OK;
-    }
-
-    bool SupportsNativeHandle() const override {
-      ++supports_native_handle_count_;
-      return supports_native_handle_;
-    }
-
-    const char* ImplementationName() const override {
-      return "fake-encoder";
-    }
-
-    VideoEncoder::ScalingSettings GetScalingSettings() const override {
-      return VideoEncoder::ScalingSettings(true);
-    }
-
-    int init_encode_count_ = 0;
-    int32_t init_encode_return_code_ = WEBRTC_VIDEO_CODEC_OK;
-    int32_t encode_return_code_ = WEBRTC_VIDEO_CODEC_OK;
-    int encode_count_ = 0;
-    EncodedImageCallback* encode_complete_callback_ = nullptr;
-    int release_count_ = 0;
-    int set_channel_parameters_count_ = 0;
-    int set_rates_count_ = 0;
-    mutable int supports_native_handle_count_ = 0;
-    bool supports_native_handle_ = false;
-  };
-
-  class FakeEncodedImageCallback : public EncodedImageCallback {
-   public:
-    Result OnEncodedImage(
-        const EncodedImage& encoded_image,
-        const CodecSpecificInfo* codec_specific_info,
-        const RTPFragmentationHeader* fragmentation) override {
-      ++callback_count_;
-      last_codec_name_ = codec_specific_info->codec_name;
-      return Result(Result::OK, callback_count_);
-    }
-    int callback_count_ = 0;
-    std::string last_codec_name_;
-  };
-
-  void UtilizeFallbackEncoder();
-  void FallbackFromEncodeRequest();
-  void EncodeFrame();
-  void EncodeFrame(int expected_ret);
-  void CheckLastEncoderName(const char* expected_name) {
-    EXPECT_STREQ(expected_name, callback_.last_codec_name_.c_str());
-  }
-
-  test::ScopedFieldTrials override_field_trials_;
-  FakeEncodedImageCallback callback_;
-  // |fake_encoder_| is owned and released by |fallback_wrapper_|.
-  CountingFakeEncoder* fake_encoder_;
-  VideoEncoderSoftwareFallbackWrapper fallback_wrapper_;
-  VideoCodec codec_ = {};
-  std::unique_ptr<VideoFrame> frame_;
-  std::unique_ptr<SimulcastRateAllocator> rate_allocator_;
-};
-
-void VideoEncoderSoftwareFallbackWrapperTest::EncodeFrame() {
-  EncodeFrame(WEBRTC_VIDEO_CODEC_OK);
-}
-
-void VideoEncoderSoftwareFallbackWrapperTest::EncodeFrame(int expected_ret) {
-  rtc::scoped_refptr<I420Buffer> buffer =
-      I420Buffer::Create(codec_.width, codec_.height);
-  I420Buffer::SetBlack(buffer);
-  std::vector<FrameType> types(1, kVideoFrameKey);
-
-  frame_.reset(new VideoFrame(buffer, 0, 0, webrtc::kVideoRotation_0));
-  EXPECT_EQ(expected_ret, fallback_wrapper_.Encode(*frame_, nullptr, &types));
-}
-
-void VideoEncoderSoftwareFallbackWrapperTest::UtilizeFallbackEncoder() {
-  fallback_wrapper_.RegisterEncodeCompleteCallback(&callback_);
-  EXPECT_EQ(&callback_, fake_encoder_->encode_complete_callback_);
-
-  // Register with failing fake encoder. Should succeed with VP8 fallback.
-  codec_.codecType = kVideoCodecVP8;
-  codec_.maxFramerate = kFramerate;
-  codec_.width = kWidth;
-  codec_.height = kHeight;
-  codec_.VP8()->numberOfTemporalLayers = 1;
-  std::unique_ptr<TemporalLayersFactory> tl_factory(
-      new TemporalLayersFactory());
-  codec_.VP8()->tl_factory = tl_factory.get();
-  rate_allocator_.reset(
-      new SimulcastRateAllocator(codec_, std::move(tl_factory)));
-
-  fake_encoder_->init_encode_return_code_ = WEBRTC_VIDEO_CODEC_ERROR;
-  EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK,
-            fallback_wrapper_.InitEncode(&codec_, kNumCores, kMaxPayloadSize));
-  EXPECT_EQ(
-      WEBRTC_VIDEO_CODEC_OK,
-      fallback_wrapper_.SetRateAllocation(
-          rate_allocator_->GetAllocation(300000, kFramerate), kFramerate));
-
-  int callback_count = callback_.callback_count_;
-  int encode_count = fake_encoder_->encode_count_;
-  EncodeFrame();
-  EXPECT_EQ(encode_count, fake_encoder_->encode_count_);
-  EXPECT_EQ(callback_count + 1, callback_.callback_count_);
-}
-
-void VideoEncoderSoftwareFallbackWrapperTest::FallbackFromEncodeRequest() {
-  fallback_wrapper_.RegisterEncodeCompleteCallback(&callback_);
-  codec_.codecType = kVideoCodecVP8;
-  codec_.maxFramerate = kFramerate;
-  codec_.width = kWidth;
-  codec_.height = kHeight;
-  codec_.VP8()->numberOfTemporalLayers = 1;
-  std::unique_ptr<TemporalLayersFactory> tl_factory(
-      new TemporalLayersFactory());
-  codec_.VP8()->tl_factory = tl_factory.get();
-  rate_allocator_.reset(
-      new SimulcastRateAllocator(codec_, std::move(tl_factory)));
-  fallback_wrapper_.InitEncode(&codec_, 2, kMaxPayloadSize);
-  EXPECT_EQ(
-      WEBRTC_VIDEO_CODEC_OK,
-      fallback_wrapper_.SetRateAllocation(
-          rate_allocator_->GetAllocation(300000, kFramerate), kFramerate));
-  EXPECT_EQ(1, fake_encoder_->init_encode_count_);
-
-  // Have the non-fallback encoder request a software fallback.
-  fake_encoder_->encode_return_code_ = WEBRTC_VIDEO_CODEC_FALLBACK_SOFTWARE;
-  int callback_count = callback_.callback_count_;
-  int encode_count = fake_encoder_->encode_count_;
-  EncodeFrame();
-  // Single encode request, which returned failure.
-  EXPECT_EQ(encode_count + 1, fake_encoder_->encode_count_);
-  EXPECT_EQ(callback_count + 1, callback_.callback_count_);
-}
-
-TEST_F(VideoEncoderSoftwareFallbackWrapperTest, InitializesEncoder) {
-  VideoCodec codec = {};
-  fallback_wrapper_.InitEncode(&codec, 2, kMaxPayloadSize);
-  EXPECT_EQ(1, fake_encoder_->init_encode_count_);
-}
-
-TEST_F(VideoEncoderSoftwareFallbackWrapperTest, EncodeRequestsFallback) {
-  FallbackFromEncodeRequest();
-  // After fallback, further encodes shouldn't hit the fake encoder.
-  int encode_count = fake_encoder_->encode_count_;
-  EncodeFrame();
-  EXPECT_EQ(encode_count, fake_encoder_->encode_count_);
-}
-
-TEST_F(VideoEncoderSoftwareFallbackWrapperTest, CanUtilizeFallbackEncoder) {
-  UtilizeFallbackEncoder();
-  EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK, fallback_wrapper_.Release());
-}
-
-TEST_F(VideoEncoderSoftwareFallbackWrapperTest,
-       InternalEncoderReleasedDuringFallback) {
-  EXPECT_EQ(0, fake_encoder_->release_count_);
-  UtilizeFallbackEncoder();
-  EXPECT_EQ(1, fake_encoder_->release_count_);
-  EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK, fallback_wrapper_.Release());
-  // No extra release when the fallback is released.
-  EXPECT_EQ(1, fake_encoder_->release_count_);
-}
-
-TEST_F(VideoEncoderSoftwareFallbackWrapperTest,
-       InternalEncoderNotEncodingDuringFallback) {
-  UtilizeFallbackEncoder();
-  int encode_count = fake_encoder_->encode_count_;
-  EncodeFrame();
-  EXPECT_EQ(encode_count, fake_encoder_->encode_count_);
-
-  EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK, fallback_wrapper_.Release());
-}
-
-TEST_F(VideoEncoderSoftwareFallbackWrapperTest,
-       CanRegisterCallbackWhileUsingFallbackEncoder) {
-  UtilizeFallbackEncoder();
-  // Registering an encode-complete callback should still work when fallback
-  // encoder is being used.
-  FakeEncodedImageCallback callback2;
-  fallback_wrapper_.RegisterEncodeCompleteCallback(&callback2);
-  EXPECT_EQ(&callback2, fake_encoder_->encode_complete_callback_);
-
-  // Encoding a frame using the fallback should arrive at the new callback.
-  std::vector<FrameType> types(1, kVideoFrameKey);
-  frame_->set_timestamp(frame_->timestamp() + 1000);
-  EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK,
-            fallback_wrapper_.Encode(*frame_, nullptr, &types));
-
-  EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK, fallback_wrapper_.Release());
-}
-
-TEST_F(VideoEncoderSoftwareFallbackWrapperTest,
-       SetChannelParametersForwardedDuringFallback) {
-  UtilizeFallbackEncoder();
-  EXPECT_EQ(0, fake_encoder_->set_channel_parameters_count_);
-  fallback_wrapper_.SetChannelParameters(1, 1);
-  EXPECT_EQ(1, fake_encoder_->set_channel_parameters_count_);
-  EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK, fallback_wrapper_.Release());
-}
-
-TEST_F(VideoEncoderSoftwareFallbackWrapperTest,
-       SetRatesForwardedDuringFallback) {
-  UtilizeFallbackEncoder();
-  EXPECT_EQ(1, fake_encoder_->set_rates_count_);
-  fallback_wrapper_.SetRateAllocation(BitrateAllocation(), 1);
-  EXPECT_EQ(2, fake_encoder_->set_rates_count_);
-  EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK, fallback_wrapper_.Release());
-}
-
-TEST_F(VideoEncoderSoftwareFallbackWrapperTest,
-       SupportsNativeHandleForwardedWithoutFallback) {
-  fallback_wrapper_.SupportsNativeHandle();
-  EXPECT_EQ(1, fake_encoder_->supports_native_handle_count_);
-}
-
-TEST_F(VideoEncoderSoftwareFallbackWrapperTest,
-       SupportsNativeHandleNotForwardedDuringFallback) {
-  UtilizeFallbackEncoder();
-  fallback_wrapper_.SupportsNativeHandle();
-  EXPECT_EQ(0, fake_encoder_->supports_native_handle_count_);
-  EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK, fallback_wrapper_.Release());
-}
-
-TEST_F(VideoEncoderSoftwareFallbackWrapperTest, ReportsImplementationName) {
-  codec_.width = kWidth;
-  codec_.height = kHeight;
-  fallback_wrapper_.RegisterEncodeCompleteCallback(&callback_);
-  fallback_wrapper_.InitEncode(&codec_, kNumCores, kMaxPayloadSize);
-  EncodeFrame();
-  CheckLastEncoderName("fake-encoder");
-}
-
-TEST_F(VideoEncoderSoftwareFallbackWrapperTest,
-       ReportsFallbackImplementationName) {
-  UtilizeFallbackEncoder();
-  // Hard coded expected value since libvpx is the software implementation name
-  // for VP8. Change accordingly if the underlying implementation does.
-  CheckLastEncoderName("libvpx");
-}
-
-namespace {
-const int kLowKbps = 220;
-const int kHighKbps = 300;
-const int kMinLowDurationMs = 4000;
-const int kMinPixelsPerFrame = 1;
-const int kMinPixelsStop = 320 * 180;
-const std::string kFieldTrial = "WebRTC-VP8-Forced-Fallback-Encoder";
-}  // namespace
-
-class ForcedFallbackTest : public VideoEncoderSoftwareFallbackWrapperTest {
- public:
-  ForcedFallbackTest(const std::string& field_trials)
-      : VideoEncoderSoftwareFallbackWrapperTest(field_trials) {}
-
-  ~ForcedFallbackTest() override {}
-
- protected:
-  void SetUp() override {
-    clock_.SetTimeMicros(1234);
-    ConfigureVp8Codec();
-    EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK, fallback_wrapper_.InitEncode(
-                                         &codec_, kNumCores, kMaxPayloadSize));
-    EXPECT_EQ(1, fake_encoder_->init_encode_count_);
-  }
-
-  void TearDown() override {
-    EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK, fallback_wrapper_.Release());
-  }
-
-  void ConfigureVp8Codec() {
-    fallback_wrapper_.RegisterEncodeCompleteCallback(&callback_);
-    std::unique_ptr<TemporalLayersFactory> tl_factory(
-        new TemporalLayersFactory());
-    codec_.codecType = kVideoCodecVP8;
-    codec_.maxFramerate = kFramerate;
-    codec_.width = kWidth;
-    codec_.height = kHeight;
-    codec_.VP8()->numberOfTemporalLayers = 1;
-    codec_.VP8()->automaticResizeOn = true;
-    codec_.VP8()->frameDroppingOn = true;
-    codec_.VP8()->tl_factory = tl_factory.get();
-    rate_allocator_.reset(
-        new SimulcastRateAllocator(codec_, std::move(tl_factory)));
-  }
-
-  void SetRateAllocation(uint32_t bitrate_kbps) {
-    EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK, fallback_wrapper_.SetRateAllocation(
-                                         rate_allocator_->GetAllocation(
-                                             bitrate_kbps * 1000, kFramerate),
-                                         kFramerate));
-  }
-
-  void EncodeFrameAndVerifyLastName(const char* expected_name) {
-    EncodeFrameAndVerifyLastName(expected_name, WEBRTC_VIDEO_CODEC_OK);
-  }
-
-  void EncodeFrameAndVerifyLastName(const char* expected_name,
-                                    int expected_ret) {
-    EncodeFrame(expected_ret);
-    CheckLastEncoderName(expected_name);
-  }
-
-  rtc::ScopedFakeClock clock_;
-};
-
-class ForcedFallbackTestEnabled : public ForcedFallbackTest {
- public:
-  ForcedFallbackTestEnabled()
-      : ForcedFallbackTest(kFieldTrial + "/Enabled-" +
-                           std::to_string(kLowKbps) + "," +
-                           std::to_string(kHighKbps) + "," +
-                           std::to_string(kMinLowDurationMs) + "," +
-                           std::to_string(kMinPixelsPerFrame) + "/") {}
-};
-
-class ForcedFallbackTestDisabled : public ForcedFallbackTest {
- public:
-  ForcedFallbackTestDisabled()
-      : ForcedFallbackTest(kFieldTrial + "/Disabled/") {}
-};
-
-TEST_F(ForcedFallbackTestDisabled, NoFallbackWithoutFieldTrial) {
-  // Bitrate at low threshold.
-  SetRateAllocation(kLowKbps);
-  EncodeFrameAndVerifyLastName("fake-encoder");
-  // Duration passed, expect no fallback.
-  clock_.AdvanceTime(rtc::TimeDelta::FromMilliseconds(kMinLowDurationMs));
-  EncodeFrameAndVerifyLastName("fake-encoder");
-}
-
-TEST_F(ForcedFallbackTestEnabled, FallbackIfAtLowLimit) {
-  // Bitrate at low threshold.
-  SetRateAllocation(kLowKbps);
-  EncodeFrameAndVerifyLastName("fake-encoder");
-  // Duration passed, expect fallback.
-  clock_.AdvanceTime(rtc::TimeDelta::FromMilliseconds(kMinLowDurationMs));
-  EncodeFrameAndVerifyLastName("libvpx");
-}
-
-TEST_F(ForcedFallbackTestEnabled, NoFallbackIfNotAtLowLimit) {
-  // Bitrate above low threshold.
-  SetRateAllocation(kLowKbps + 1);
-  EncodeFrameAndVerifyLastName("fake-encoder");
-  // Duration passed, expect no fallback.
-  clock_.AdvanceTime(rtc::TimeDelta::FromMilliseconds(kMinLowDurationMs));
-  EncodeFrameAndVerifyLastName("fake-encoder");
-}
-
-TEST_F(ForcedFallbackTestEnabled, NoFallbackIfResolutionIsTooLarge) {
-  // Resolution above max pixels.
-  codec_.width += 1;
-  EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK,
-            fallback_wrapper_.InitEncode(&codec_, kNumCores, kMaxPayloadSize));
-  // Bitrate at low threshold.
-  SetRateAllocation(kLowKbps);
-  EncodeFrameAndVerifyLastName("fake-encoder");
-  // Duration passed, expect no fallback.
-  clock_.AdvanceTime(rtc::TimeDelta::FromMilliseconds(kMinLowDurationMs));
-  EncodeFrameAndVerifyLastName("fake-encoder");
-}
-
-TEST_F(ForcedFallbackTestEnabled, FallbackIfMinDurationPassed) {
-  // Bitrate at low threshold.
-  SetRateAllocation(kLowKbps);
-  EncodeFrameAndVerifyLastName("fake-encoder");
-  // Duration not passed, expect no fallback.
-  clock_.AdvanceTime(rtc::TimeDelta::FromMilliseconds(kMinLowDurationMs - 1));
-  EncodeFrameAndVerifyLastName("fake-encoder");
-  // Duration passed, expect fallback.
-  clock_.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1));
-  EncodeFrameAndVerifyLastName("libvpx");
-}
-
-TEST_F(ForcedFallbackTestEnabled, FallbackStartTimeResetIfAboveLowLimit) {
-  // Bitrate at low threshold, start time set.
-  SetRateAllocation(kLowKbps);
-  EncodeFrameAndVerifyLastName("fake-encoder");
-  // Duration not passed, expect no fallback.
-  clock_.AdvanceTime(rtc::TimeDelta::FromMilliseconds(kMinLowDurationMs - 1));
-  EncodeFrameAndVerifyLastName("fake-encoder");
-
-  // Bitrate above low threshold, start time reset.
-  SetRateAllocation(kLowKbps + 1);
-  clock_.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1));
-  EncodeFrameAndVerifyLastName("fake-encoder");
-
-  // Bitrate at low threshold, start time set.
-  SetRateAllocation(kLowKbps);
-  EncodeFrameAndVerifyLastName("fake-encoder");
-  // Duration not passed, expect no fallback.
-  clock_.AdvanceTime(rtc::TimeDelta::FromMilliseconds(kMinLowDurationMs - 1));
-  EncodeFrameAndVerifyLastName("fake-encoder");
-  // Duration passed, expect fallback.
-  clock_.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1));
-  EncodeFrameAndVerifyLastName("libvpx");
-}
-
-TEST_F(ForcedFallbackTestEnabled, FallbackEndsIfAtHighLimit) {
-  // Bitrate at low threshold.
-  SetRateAllocation(kLowKbps);
-  EncodeFrameAndVerifyLastName("fake-encoder");
-  // Duration passed, expect fallback.
-  clock_.AdvanceTime(rtc::TimeDelta::FromMilliseconds(kMinLowDurationMs));
-  EncodeFrameAndVerifyLastName("libvpx");
-  // Bitrate below high threshold, expect fallback.
-  SetRateAllocation(kHighKbps - 1);
-  EncodeFrameAndVerifyLastName("libvpx");
-  // Bitrate at high threshold, expect fallback ended.
-  SetRateAllocation(kHighKbps);
-  EncodeFrameAndVerifyLastName("fake-encoder");
-}
-
-TEST_F(ForcedFallbackTestEnabled, MultipleStartEndFallback) {
-  const int kNumRuns = 5;
-  for (int i = 0; i < kNumRuns; ++i) {
-    // Bitrate at low threshold.
-    SetRateAllocation(kLowKbps);
-    EncodeFrameAndVerifyLastName("fake-encoder");
-    // Duration passed, expect fallback.
-    clock_.AdvanceTime(rtc::TimeDelta::FromMilliseconds(kMinLowDurationMs));
-    EncodeFrameAndVerifyLastName("libvpx");
-    // Bitrate at high threshold, expect fallback ended.
-    SetRateAllocation(kHighKbps);
-    EncodeFrameAndVerifyLastName("fake-encoder");
-  }
-}
-
-TEST_F(ForcedFallbackTestEnabled, DropsFirstNonNativeFrameAfterFallbackEnds) {
-  fake_encoder_->supports_native_handle_ = true;
-
-  // Bitrate at low threshold.
-  SetRateAllocation(kLowKbps);
-  EncodeFrameAndVerifyLastName("fake-encoder");
-  // Duration passed, expect fallback.
-  clock_.AdvanceTime(rtc::TimeDelta::FromMilliseconds(kMinLowDurationMs));
-  EncodeFrameAndVerifyLastName("libvpx");
-  // Bitrate at high threshold, fallback should be ended but first non-native
-  // frame dropped (i.e. frame not encoded).
-  SetRateAllocation(kHighKbps);
-  EncodeFrameAndVerifyLastName("libvpx", WEBRTC_VIDEO_CODEC_ERROR);
-  // Next frame should be encoded.
-  EncodeFrameAndVerifyLastName("fake-encoder");
-}
-
-TEST_F(ForcedFallbackTestEnabled, FallbackIsKeptWhenInitEncodeIsCalled) {
-  // Bitrate below low threshold.
-  SetRateAllocation(kLowKbps - 1);
-  EncodeFrameAndVerifyLastName("fake-encoder");
-  // Duration passed, expect fallback.
-  clock_.AdvanceTime(rtc::TimeDelta::FromMilliseconds(kMinLowDurationMs));
-  EncodeFrameAndVerifyLastName("libvpx");
-
-  // Re-initialize encoder, still expect fallback.
-  EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK,
-            fallback_wrapper_.InitEncode(&codec_, kNumCores, kMaxPayloadSize));
-  EXPECT_EQ(1, fake_encoder_->init_encode_count_);  // No change.
-  SetRateAllocation(kLowKbps);
-  EncodeFrameAndVerifyLastName("libvpx");
-}
-
-TEST_F(ForcedFallbackTestEnabled, FallbackIsEndedWhenResolutionIsTooLarge) {
-  // Bitrate below low threshold.
-  SetRateAllocation(kLowKbps - 1);
-  EncodeFrameAndVerifyLastName("fake-encoder");
-  // Duration passed, expect fallback.
-  clock_.AdvanceTime(rtc::TimeDelta::FromMilliseconds(kMinLowDurationMs));
-  EncodeFrameAndVerifyLastName("libvpx");
-
-  // Re-initialize encoder with a larger resolution, expect no fallback.
-  codec_.width += 1;
-  EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK,
-            fallback_wrapper_.InitEncode(&codec_, kNumCores, kMaxPayloadSize));
-  EXPECT_EQ(2, fake_encoder_->init_encode_count_);
-  SetRateAllocation(kLowKbps);
-  EncodeFrameAndVerifyLastName("fake-encoder");
-}
-
-TEST_F(ForcedFallbackTestEnabled, FallbackIsEndedForNonValidSettings) {
-  // Bitrate below low threshold.
-  SetRateAllocation(kLowKbps - 1);
-  EncodeFrameAndVerifyLastName("fake-encoder");
-  // Duration passed, expect fallback.
-  clock_.AdvanceTime(rtc::TimeDelta::FromMilliseconds(kMinLowDurationMs));
-  EncodeFrameAndVerifyLastName("libvpx");
-
-  // Re-initialize encoder with invalid setting, expect no fallback.
-  codec_.VP8()->numberOfTemporalLayers = 2;
-  EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK,
-            fallback_wrapper_.InitEncode(&codec_, kNumCores, kMaxPayloadSize));
-  EXPECT_EQ(2, fake_encoder_->init_encode_count_);
-  SetRateAllocation(kLowKbps);
-  EncodeFrameAndVerifyLastName("fake-encoder");
-
-  // Re-initialize encoder with valid setting but fallback disabled from now on.
-  codec_.VP8()->numberOfTemporalLayers = 1;
-  EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK,
-            fallback_wrapper_.InitEncode(&codec_, kNumCores, kMaxPayloadSize));
-  EXPECT_EQ(3, fake_encoder_->init_encode_count_);
-  // Bitrate at low threshold.
-  SetRateAllocation(kLowKbps);
-  EncodeFrameAndVerifyLastName("fake-encoder");
-  // Duration passed, expect no fallback.
-  clock_.AdvanceTime(rtc::TimeDelta::FromMilliseconds(kMinLowDurationMs));
-  EncodeFrameAndVerifyLastName("fake-encoder");
-}
-
-TEST_F(ForcedFallbackTestEnabled, GetScaleSettingsWithoutFallback) {
-  // Bitrate at low threshold.
-  SetRateAllocation(kLowKbps);
-  EncodeFrameAndVerifyLastName("fake-encoder");
-  // Default min pixels per frame should be used.
-  const auto settings = fallback_wrapper_.GetScalingSettings();
-  EXPECT_TRUE(settings.enabled);
-  EXPECT_EQ(kDefaultMinPixelsPerFrame, settings.min_pixels_per_frame);
-}
-
-TEST_F(ForcedFallbackTestEnabled, GetScaleSettingsWithFallback) {
-  // Bitrate at low threshold.
-  SetRateAllocation(kLowKbps);
-  EncodeFrameAndVerifyLastName("fake-encoder");
-  // Duration passed, expect fallback.
-  clock_.AdvanceTime(rtc::TimeDelta::FromMilliseconds(kMinLowDurationMs));
-  EncodeFrameAndVerifyLastName("libvpx");
-  // Configured min pixels per frame should be used.
-  const auto settings = fallback_wrapper_.GetScalingSettings();
-  EXPECT_TRUE(settings.enabled);
-  EXPECT_EQ(kMinPixelsPerFrame, settings.min_pixels_per_frame);
-}
-
-TEST_F(ForcedFallbackTestEnabled, FallbackIsKeptIfResolutionIsTooSmall) {
-  // Bitrate at low threshold.
-  SetRateAllocation(kLowKbps);
-  EncodeFrameAndVerifyLastName("fake-encoder");
-  // Duration passed, expect fallback.
-  clock_.AdvanceTime(rtc::TimeDelta::FromMilliseconds(kMinLowDurationMs));
-  EncodeFrameAndVerifyLastName("libvpx");
-
-  // Re-initialize encoder with a resolution less than |kMinPixelsStop|.
-  codec_.height = kMinPixelsStop / codec_.width - 1;
-  EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK,
-            fallback_wrapper_.InitEncode(&codec_, kNumCores, kMaxPayloadSize));
-  EXPECT_EQ(1, fake_encoder_->init_encode_count_);  // No change
-  SetRateAllocation(kHighKbps - 1);
-  EncodeFrameAndVerifyLastName("libvpx");
-  // Bitrate at high threshold but resolution too small for fallback to end.
-  SetRateAllocation(kHighKbps);
-  EncodeFrameAndVerifyLastName("libvpx");
-
-  // Re-initialize encoder with a resolution equal to |kMinPixelsStop|.
-  codec_.height++;
-  EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK,
-            fallback_wrapper_.InitEncode(&codec_, kNumCores, kMaxPayloadSize));
-  EXPECT_EQ(1, fake_encoder_->init_encode_count_);  // No change
-  SetRateAllocation(kHighKbps - 1);
-  EncodeFrameAndVerifyLastName("libvpx");
-  // Bitrate at high threshold and resolution large enough for fallback to end.
-  SetRateAllocation(kHighKbps);
-  EncodeFrameAndVerifyLastName("fake-encoder");
-}
-
-}  // namespace webrtc
diff --git a/media/engine/webrtccommon.h b/media/engine/webrtccommon.h
deleted file mode 100644
index 21fc192..0000000
--- a/media/engine/webrtccommon.h
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- *  Copyright (c) 2004 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_MEDIA_ENGINE_WEBRTCCOMMON_H_
-#define WEBRTC_MEDIA_ENGINE_WEBRTCCOMMON_H_
-
-#include "webrtc/common_types.h"
-
-namespace cricket {
-
-// Tracing helpers, for easy logging when WebRTC calls fail.
-// Example: "LOG_RTCERR1(StartSend, channel);" produces the trace
-//          "StartSend(1) failed, err=XXXX"
-// The method GetLastEngineError must be defined in the calling scope.
-#define LOG_RTCERR0(func) \
-    LOG_RTCERR0_EX(func, GetLastEngineError())
-#define LOG_RTCERR1(func, a1) \
-    LOG_RTCERR1_EX(func, a1, GetLastEngineError())
-#define LOG_RTCERR2(func, a1, a2) \
-    LOG_RTCERR2_EX(func, a1, a2, GetLastEngineError())
-#define LOG_RTCERR3(func, a1, a2, a3) \
-    LOG_RTCERR3_EX(func, a1, a2, a3, GetLastEngineError())
-#define LOG_RTCERR4(func, a1, a2, a3, a4) \
-    LOG_RTCERR4_EX(func, a1, a2, a3, a4, GetLastEngineError())
-#define LOG_RTCERR5(func, a1, a2, a3, a4, a5) \
-    LOG_RTCERR5_EX(func, a1, a2, a3, a4, a5, GetLastEngineError())
-#define LOG_RTCERR6(func, a1, a2, a3, a4, a5, a6) \
-    LOG_RTCERR6_EX(func, a1, a2, a3, a4, a5, a6, GetLastEngineError())
-#define LOG_RTCERR0_EX(func, err) LOG(LS_WARNING) \
-    << "" << #func << "() failed, err=" << err
-#define LOG_RTCERR1_EX(func, a1, err) LOG(LS_WARNING) \
-    << "" << #func << "(" << a1 << ") failed, err=" << err
-#define LOG_RTCERR2_EX(func, a1, a2, err) LOG(LS_WARNING) \
-    << "" << #func << "(" << a1 << ", " << a2 << ") failed, err=" \
-    << err
-#define LOG_RTCERR3_EX(func, a1, a2, a3, err) LOG(LS_WARNING) \
-    << "" << #func << "(" << a1 << ", " << a2 << ", " << a3 \
-    << ") failed, err=" << err
-#define LOG_RTCERR4_EX(func, a1, a2, a3, a4, err) LOG(LS_WARNING) \
-    << "" << #func << "(" << a1 << ", " << a2 << ", " << a3 \
-    << ", " << a4 << ") failed, err=" << err
-#define LOG_RTCERR5_EX(func, a1, a2, a3, a4, a5, err) LOG(LS_WARNING) \
-    << "" << #func << "(" << a1 << ", " << a2 << ", " << a3 \
-    << ", " << a4 << ", " << a5 << ") failed, err=" << err
-#define LOG_RTCERR6_EX(func, a1, a2, a3, a4, a5, a6, err) LOG(LS_WARNING) \
-    << "" << #func << "(" << a1 << ", " << a2 << ", " << a3 \
-    << ", " << a4 << ", " << a5 << ", " << a6 << ") failed, err=" << err
-
-}  // namespace cricket
-
-#endif  // WEBRTC_MEDIA_ENGINE_WEBRTCCOMMON_H_
diff --git a/media/engine/webrtcmediaengine.cc b/media/engine/webrtcmediaengine.cc
deleted file mode 100644
index 3a61ad7..0000000
--- a/media/engine/webrtcmediaengine.cc
+++ /dev/null
@@ -1,234 +0,0 @@
-/*
- *  Copyright (c) 2014 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/media/engine/webrtcmediaengine.h"
-
-#include <algorithm>
-
-#include "webrtc/api/audio_codecs/builtin_audio_decoder_factory.h"
-#include "webrtc/api/audio_codecs/builtin_audio_encoder_factory.h"
-#include "webrtc/media/engine/webrtcvoiceengine.h"
-
-#ifdef HAVE_WEBRTC_VIDEO
-#include "webrtc/media/engine/webrtcvideoengine.h"
-#else
-#include "webrtc/media/engine/nullwebrtcvideoengine.h"
-#endif
-
-namespace cricket {
-
-namespace {
-
-MediaEngineInterface* CreateWebRtcMediaEngine(
-    webrtc::AudioDeviceModule* adm,
-    const rtc::scoped_refptr<webrtc::AudioEncoderFactory>&
-        audio_encoder_factory,
-    const rtc::scoped_refptr<webrtc::AudioDecoderFactory>&
-        audio_decoder_factory,
-    WebRtcVideoEncoderFactory* video_encoder_factory,
-    WebRtcVideoDecoderFactory* video_decoder_factory,
-    rtc::scoped_refptr<webrtc::AudioMixer> audio_mixer,
-    rtc::scoped_refptr<webrtc::AudioProcessing> audio_processing) {
-#ifdef HAVE_WEBRTC_VIDEO
-  typedef WebRtcVideoEngine VideoEngine;
-  std::tuple<WebRtcVideoEncoderFactory*, WebRtcVideoDecoderFactory*> video_args(
-      video_encoder_factory, video_decoder_factory);
-#else
-  typedef NullWebRtcVideoEngine VideoEngine;
-  std::tuple<> video_args;
-#endif
-  return new CompositeMediaEngine<WebRtcVoiceEngine, VideoEngine>(
-      std::forward_as_tuple(adm, audio_encoder_factory, audio_decoder_factory,
-                            audio_mixer, audio_processing),
-      std::move(video_args));
-}
-
-}  // namespace
-
-// TODO(ossu): Backwards-compatible interface. Will be deprecated once the
-// audio decoder factory is fully plumbed and used throughout WebRTC.
-// See: crbug.com/webrtc/6000
-MediaEngineInterface* WebRtcMediaEngineFactory::Create(
-    webrtc::AudioDeviceModule* adm,
-    WebRtcVideoEncoderFactory* video_encoder_factory,
-    WebRtcVideoDecoderFactory* video_decoder_factory) {
-  return CreateWebRtcMediaEngine(
-      adm, webrtc::CreateBuiltinAudioEncoderFactory(),
-      webrtc::CreateBuiltinAudioDecoderFactory(), video_encoder_factory,
-      video_decoder_factory, nullptr, webrtc::AudioProcessing::Create());
-}
-
-MediaEngineInterface* WebRtcMediaEngineFactory::Create(
-    webrtc::AudioDeviceModule* adm,
-    const rtc::scoped_refptr<webrtc::AudioDecoderFactory>&
-        audio_decoder_factory,
-    WebRtcVideoEncoderFactory* video_encoder_factory,
-    WebRtcVideoDecoderFactory* video_decoder_factory) {
-  return CreateWebRtcMediaEngine(
-      adm, webrtc::CreateBuiltinAudioEncoderFactory(), audio_decoder_factory,
-      video_encoder_factory, video_decoder_factory, nullptr,
-      webrtc::AudioProcessing::Create());
-}
-
-// Used by PeerConnectionFactory to create a media engine passed into
-// ChannelManager.
-MediaEngineInterface* WebRtcMediaEngineFactory::Create(
-    webrtc::AudioDeviceModule* adm,
-    const rtc::scoped_refptr<webrtc::AudioDecoderFactory>&
-        audio_decoder_factory,
-    WebRtcVideoEncoderFactory* video_encoder_factory,
-    WebRtcVideoDecoderFactory* video_decoder_factory,
-    rtc::scoped_refptr<webrtc::AudioMixer> audio_mixer,
-    rtc::scoped_refptr<webrtc::AudioProcessing> audio_processing) {
-  return CreateWebRtcMediaEngine(
-      adm, webrtc::CreateBuiltinAudioEncoderFactory(), audio_decoder_factory,
-      video_encoder_factory, video_decoder_factory, audio_mixer,
-      audio_processing);
-}
-
-MediaEngineInterface* WebRtcMediaEngineFactory::Create(
-    webrtc::AudioDeviceModule* adm,
-    const rtc::scoped_refptr<webrtc::AudioEncoderFactory>&
-        audio_encoder_factory,
-    const rtc::scoped_refptr<webrtc::AudioDecoderFactory>&
-        audio_decoder_factory,
-    WebRtcVideoEncoderFactory* video_encoder_factory,
-    WebRtcVideoDecoderFactory* video_decoder_factory) {
-  return CreateWebRtcMediaEngine(
-      adm, audio_encoder_factory, audio_decoder_factory, video_encoder_factory,
-      video_decoder_factory, nullptr, webrtc::AudioProcessing::Create());
-}
-
-MediaEngineInterface* WebRtcMediaEngineFactory::Create(
-    webrtc::AudioDeviceModule* adm,
-    const rtc::scoped_refptr<webrtc::AudioEncoderFactory>&
-        audio_encoder_factory,
-    const rtc::scoped_refptr<webrtc::AudioDecoderFactory>&
-        audio_decoder_factory,
-    WebRtcVideoEncoderFactory* video_encoder_factory,
-    WebRtcVideoDecoderFactory* video_decoder_factory,
-    rtc::scoped_refptr<webrtc::AudioMixer> audio_mixer,
-    rtc::scoped_refptr<webrtc::AudioProcessing> audio_processing) {
-  return CreateWebRtcMediaEngine(
-      adm, audio_encoder_factory, audio_decoder_factory, video_encoder_factory,
-      video_decoder_factory, audio_mixer, audio_processing);
-}
-
-namespace {
-// Remove mutually exclusive extensions with lower priority.
-void DiscardRedundantExtensions(
-    std::vector<webrtc::RtpExtension>* extensions,
-    rtc::ArrayView<const char* const> extensions_decreasing_prio) {
-  RTC_DCHECK(extensions);
-  bool found = false;
-  for (const char* uri : extensions_decreasing_prio) {
-    auto it = std::find_if(
-        extensions->begin(), extensions->end(),
-        [uri](const webrtc::RtpExtension& rhs) { return rhs.uri == uri; });
-    if (it != extensions->end()) {
-      if (found) {
-        extensions->erase(it);
-      }
-      found = true;
-    }
-  }
-}
-}  // namespace
-
-bool ValidateRtpExtensions(
-    const std::vector<webrtc::RtpExtension>& extensions) {
-  bool id_used[14] = {false};
-  for (const auto& extension : extensions) {
-    if (extension.id <= 0 || extension.id >= 15) {
-      LOG(LS_ERROR) << "Bad RTP extension ID: " << extension.ToString();
-      return false;
-    }
-    if (id_used[extension.id - 1]) {
-      LOG(LS_ERROR) << "Duplicate RTP extension ID: " << extension.ToString();
-      return false;
-    }
-    id_used[extension.id - 1] = true;
-  }
-  return true;
-}
-
-std::vector<webrtc::RtpExtension> FilterRtpExtensions(
-    const std::vector<webrtc::RtpExtension>& extensions,
-    bool (*supported)(const std::string&),
-    bool filter_redundant_extensions) {
-  RTC_DCHECK(ValidateRtpExtensions(extensions));
-  RTC_DCHECK(supported);
-  std::vector<webrtc::RtpExtension> result;
-
-  // Ignore any extensions that we don't recognize.
-  for (const auto& extension : extensions) {
-    if (supported(extension.uri)) {
-      result.push_back(extension);
-    } else {
-      LOG(LS_WARNING) << "Unsupported RTP extension: " << extension.ToString();
-    }
-  }
-
-  // Sort by name, ascending (prioritise encryption), so that we don't reset
-  // extensions if they were specified in a different order (also allows us
-  // to use std::unique below).
-  std::sort(result.begin(), result.end(),
-            [](const webrtc::RtpExtension& rhs,
-               const webrtc::RtpExtension& lhs) {
-                return rhs.encrypt == lhs.encrypt ? rhs.uri < lhs.uri
-                                                  : rhs.encrypt > lhs.encrypt;
-              });
-
-  // Remove unnecessary extensions (used on send side).
-  if (filter_redundant_extensions) {
-    auto it = std::unique(
-        result.begin(), result.end(),
-        [](const webrtc::RtpExtension& rhs, const webrtc::RtpExtension& lhs) {
-          return rhs.uri == lhs.uri && rhs.encrypt == lhs.encrypt;
-        });
-    result.erase(it, result.end());
-
-    // Keep just the highest priority extension of any in the following list.
-    static const char* const kBweExtensionPriorities[] = {
-        webrtc::RtpExtension::kTransportSequenceNumberUri,
-        webrtc::RtpExtension::kAbsSendTimeUri,
-        webrtc::RtpExtension::kTimestampOffsetUri};
-    DiscardRedundantExtensions(&result, kBweExtensionPriorities);
-  }
-
-  return result;
-}
-
-webrtc::Call::Config::BitrateConfig GetBitrateConfigForCodec(
-    const Codec& codec) {
-  webrtc::Call::Config::BitrateConfig config;
-  int bitrate_kbps = 0;
-  if (codec.GetParam(kCodecParamMinBitrate, &bitrate_kbps) &&
-      bitrate_kbps > 0) {
-    config.min_bitrate_bps = bitrate_kbps * 1000;
-  } else {
-    config.min_bitrate_bps = 0;
-  }
-  if (codec.GetParam(kCodecParamStartBitrate, &bitrate_kbps) &&
-      bitrate_kbps > 0) {
-    config.start_bitrate_bps = bitrate_kbps * 1000;
-  } else {
-    // Do not reconfigure start bitrate unless it's specified and positive.
-    config.start_bitrate_bps = -1;
-  }
-  if (codec.GetParam(kCodecParamMaxBitrate, &bitrate_kbps) &&
-      bitrate_kbps > 0) {
-    config.max_bitrate_bps = bitrate_kbps * 1000;
-  } else {
-    config.max_bitrate_bps = -1;
-  }
-  return config;
-}
-}  // namespace cricket
diff --git a/media/engine/webrtcmediaengine.h b/media/engine/webrtcmediaengine.h
deleted file mode 100644
index 8740917..0000000
--- a/media/engine/webrtcmediaengine.h
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- *  Copyright (c) 2011 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_MEDIA_ENGINE_WEBRTCMEDIAENGINE_H_
-#define WEBRTC_MEDIA_ENGINE_WEBRTCMEDIAENGINE_H_
-
-#include <string>
-#include <vector>
-
-#include "webrtc/call/call.h"
-#include "webrtc/media/base/mediaengine.h"
-
-namespace webrtc {
-class AudioDecoderFactory;
-class AudioDeviceModule;
-class AudioMixer;
-class AudioProcessing;
-}
-namespace cricket {
-class WebRtcVideoDecoderFactory;
-class WebRtcVideoEncoderFactory;
-}
-
-namespace cricket {
-
-class WebRtcMediaEngineFactory {
- public:
-  // These Create methods may be called on any thread, though the engine is
-  // only expected to be used on one thread, internally called the "worker
-  // thread". This is the thread Init must be called on.
-
-  // TODO(ossu): Backwards-compatible interface. Will be deprecated once the
-  // audio decoder factory is fully plumbed and used throughout WebRTC.
-  // See: crbug.com/webrtc/6000
-  static MediaEngineInterface* Create(
-      webrtc::AudioDeviceModule* adm,
-      WebRtcVideoEncoderFactory* video_encoder_factory,
-      WebRtcVideoDecoderFactory* video_decoder_factory);
-
-  // TODO(deadbeef): Change these to return an std::unique_ptr<>, to indicate
-  // that the caller owns the returned object.
-  static MediaEngineInterface* Create(
-      webrtc::AudioDeviceModule* adm,
-      const rtc::scoped_refptr<webrtc::AudioDecoderFactory>&
-          audio_decoder_factory,
-      WebRtcVideoEncoderFactory* video_encoder_factory,
-      WebRtcVideoDecoderFactory* video_decoder_factory);
-
-  static MediaEngineInterface* Create(
-      webrtc::AudioDeviceModule* adm,
-      const rtc::scoped_refptr<webrtc::AudioDecoderFactory>&
-          audio_decoder_factory,
-      WebRtcVideoEncoderFactory* video_encoder_factory,
-      WebRtcVideoDecoderFactory* video_decoder_factory,
-      rtc::scoped_refptr<webrtc::AudioMixer> audio_mixer,
-      rtc::scoped_refptr<webrtc::AudioProcessing> apm);
-
-  static MediaEngineInterface* Create(
-      webrtc::AudioDeviceModule* adm,
-      const rtc::scoped_refptr<webrtc::AudioEncoderFactory>&
-          audio_encoder_factory,
-      const rtc::scoped_refptr<webrtc::AudioDecoderFactory>&
-          audio_decoder_factory,
-      WebRtcVideoEncoderFactory* video_encoder_factory,
-      WebRtcVideoDecoderFactory* video_decoder_factory);
-
-  static MediaEngineInterface* Create(
-      webrtc::AudioDeviceModule* adm,
-      const rtc::scoped_refptr<webrtc::AudioEncoderFactory>&
-          audio_encoder_factory,
-      const rtc::scoped_refptr<webrtc::AudioDecoderFactory>&
-          audio_decoder_factory,
-      WebRtcVideoEncoderFactory* video_encoder_factory,
-      WebRtcVideoDecoderFactory* video_decoder_factory,
-      rtc::scoped_refptr<webrtc::AudioMixer> audio_mixer,
-      rtc::scoped_refptr<webrtc::AudioProcessing> apm);
-};
-
-// Verify that extension IDs are within 1-byte extension range and are not
-// overlapping.
-bool ValidateRtpExtensions(const std::vector<webrtc::RtpExtension>& extensions);
-
-// Discard any extensions not validated by the 'supported' predicate. Duplicate
-// extensions are removed if 'filter_redundant_extensions' is set, and also any
-// mutually exclusive extensions (see implementation for details) are removed.
-std::vector<webrtc::RtpExtension> FilterRtpExtensions(
-    const std::vector<webrtc::RtpExtension>& extensions,
-    bool (*supported)(const std::string&),
-    bool filter_redundant_extensions);
-
-webrtc::Call::Config::BitrateConfig GetBitrateConfigForCodec(
-    const Codec& codec);
-
-}  // namespace cricket
-
-#endif  // WEBRTC_MEDIA_ENGINE_WEBRTCMEDIAENGINE_H_
diff --git a/media/engine/webrtcmediaengine_unittest.cc b/media/engine/webrtcmediaengine_unittest.cc
deleted file mode 100644
index d22a8da..0000000
--- a/media/engine/webrtcmediaengine_unittest.cc
+++ /dev/null
@@ -1,250 +0,0 @@
-/*
- *  Copyright (c) 2015 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/api/audio_codecs/builtin_audio_decoder_factory.h"
-#include "webrtc/api/audio_codecs/builtin_audio_encoder_factory.h"
-#include "webrtc/media/engine/webrtcmediaengine.h"
-#include "webrtc/test/gtest.h"
-
-using webrtc::RtpExtension;
-
-namespace cricket {
-namespace {
-
-std::vector<RtpExtension> MakeUniqueExtensions() {
-  std::vector<RtpExtension> result;
-  char name[] = "a";
-  for (int i = 0; i < 7; ++i) {
-    result.push_back(RtpExtension(name, 1 + i));
-    name[0]++;
-    result.push_back(RtpExtension(name, 14 - i));
-    name[0]++;
-  }
-  return result;
-}
-
-std::vector<RtpExtension> MakeRedundantExtensions() {
-  std::vector<RtpExtension> result;
-  char name[] = "a";
-  for (int i = 0; i < 7; ++i) {
-    result.push_back(RtpExtension(name, 1 + i));
-    result.push_back(RtpExtension(name, 14 - i));
-    name[0]++;
-  }
-  return result;
-}
-
-bool SupportedExtensions1(const std::string& name) {
-  return name == "c" || name == "i";
-}
-
-bool SupportedExtensions2(const std::string& name) {
-  return name != "a" && name != "n";
-}
-
-bool IsSorted(const std::vector<webrtc::RtpExtension>& extensions) {
-  const std::string* last = nullptr;
-  for (const auto& extension : extensions) {
-    if (last && *last > extension.uri) {
-      return false;
-    }
-    last = &extension.uri;
-  }
-  return true;
-}
-}  // namespace
-
-TEST(WebRtcMediaEngineTest, ValidateRtpExtensions_EmptyList) {
-  std::vector<RtpExtension> extensions;
-  EXPECT_TRUE(ValidateRtpExtensions(extensions));
-}
-
-TEST(WebRtcMediaEngineTest, ValidateRtpExtensions_AllGood) {
-  std::vector<RtpExtension> extensions = MakeUniqueExtensions();
-  EXPECT_TRUE(ValidateRtpExtensions(extensions));
-}
-
-TEST(WebRtcMediaEngineTest, ValidateRtpExtensions_OutOfRangeId_Low) {
-  std::vector<RtpExtension> extensions = MakeUniqueExtensions();
-  extensions.push_back(RtpExtension("foo", 0));
-  EXPECT_FALSE(ValidateRtpExtensions(extensions));
-}
-
-TEST(WebRtcMediaEngineTest, ValidateRtpExtensions_OutOfRangeId_High) {
-  std::vector<RtpExtension> extensions = MakeUniqueExtensions();
-  extensions.push_back(RtpExtension("foo", 15));
-  EXPECT_FALSE(ValidateRtpExtensions(extensions));
-}
-
-TEST(WebRtcMediaEngineTest, ValidateRtpExtensions_OverlappingIds_StartOfSet) {
-  std::vector<RtpExtension> extensions = MakeUniqueExtensions();
-  extensions.push_back(RtpExtension("foo", 1));
-  EXPECT_FALSE(ValidateRtpExtensions(extensions));
-}
-
-TEST(WebRtcMediaEngineTest, ValidateRtpExtensions_OverlappingIds_EndOfSet) {
-  std::vector<RtpExtension> extensions = MakeUniqueExtensions();
-  extensions.push_back(RtpExtension("foo", 14));
-  EXPECT_FALSE(ValidateRtpExtensions(extensions));
-}
-
-TEST(WebRtcMediaEngineTest, FilterRtpExtensions_EmptyList) {
-  std::vector<RtpExtension> extensions;
-  std::vector<webrtc::RtpExtension> filtered =
-      FilterRtpExtensions(extensions, SupportedExtensions1, true);
-  EXPECT_EQ(0, filtered.size());
-}
-
-TEST(WebRtcMediaEngineTest, FilterRtpExtensions_IncludeOnlySupported) {
-  std::vector<RtpExtension> extensions = MakeUniqueExtensions();
-  std::vector<webrtc::RtpExtension> filtered =
-      FilterRtpExtensions(extensions, SupportedExtensions1, false);
-  EXPECT_EQ(2, filtered.size());
-  EXPECT_EQ("c", filtered[0].uri);
-  EXPECT_EQ("i", filtered[1].uri);
-}
-
-TEST(WebRtcMediaEngineTest, FilterRtpExtensions_SortedByName_1) {
-  std::vector<RtpExtension> extensions = MakeUniqueExtensions();
-  std::vector<webrtc::RtpExtension> filtered =
-      FilterRtpExtensions(extensions, SupportedExtensions2, false);
-  EXPECT_EQ(12, filtered.size());
-  EXPECT_TRUE(IsSorted(filtered));
-}
-
-TEST(WebRtcMediaEngineTest, FilterRtpExtensions_SortedByName_2) {
-  std::vector<RtpExtension> extensions = MakeUniqueExtensions();
-  std::vector<webrtc::RtpExtension> filtered =
-      FilterRtpExtensions(extensions, SupportedExtensions2, true);
-  EXPECT_EQ(12, filtered.size());
-  EXPECT_TRUE(IsSorted(filtered));
-}
-
-TEST(WebRtcMediaEngineTest, FilterRtpExtensions_DontRemoveRedundant) {
-  std::vector<RtpExtension> extensions = MakeRedundantExtensions();
-  std::vector<webrtc::RtpExtension> filtered =
-      FilterRtpExtensions(extensions, SupportedExtensions2, false);
-  EXPECT_EQ(12, filtered.size());
-  EXPECT_TRUE(IsSorted(filtered));
-  EXPECT_EQ(filtered[0].uri, filtered[1].uri);
-}
-
-TEST(WebRtcMediaEngineTest, FilterRtpExtensions_RemoveRedundant) {
-  std::vector<RtpExtension> extensions = MakeRedundantExtensions();
-  std::vector<webrtc::RtpExtension> filtered =
-      FilterRtpExtensions(extensions, SupportedExtensions2, true);
-  EXPECT_EQ(6, filtered.size());
-  EXPECT_TRUE(IsSorted(filtered));
-  EXPECT_NE(filtered[0].uri, filtered[1].uri);
-}
-
-TEST(WebRtcMediaEngineTest, FilterRtpExtensions_RemoveRedundantEncrypted_1) {
-  std::vector<RtpExtension> extensions;
-  extensions.push_back(webrtc::RtpExtension("b", 1));
-  extensions.push_back(webrtc::RtpExtension("b", 2, true));
-  extensions.push_back(webrtc::RtpExtension("c", 3));
-  extensions.push_back(webrtc::RtpExtension("b", 4));
-  std::vector<webrtc::RtpExtension> filtered =
-      FilterRtpExtensions(extensions, SupportedExtensions2, true);
-  EXPECT_EQ(3, filtered.size());
-  EXPECT_TRUE(IsSorted(filtered));
-  EXPECT_EQ(filtered[0].uri, filtered[1].uri);
-  EXPECT_NE(filtered[0].encrypt, filtered[1].encrypt);
-  EXPECT_NE(filtered[0].uri, filtered[2].uri);
-  EXPECT_NE(filtered[1].uri, filtered[2].uri);
-}
-
-TEST(WebRtcMediaEngineTest, FilterRtpExtensions_RemoveRedundantEncrypted_2) {
-  std::vector<RtpExtension> extensions;
-  extensions.push_back(webrtc::RtpExtension("b", 1, true));
-  extensions.push_back(webrtc::RtpExtension("b", 2));
-  extensions.push_back(webrtc::RtpExtension("c", 3));
-  extensions.push_back(webrtc::RtpExtension("b", 4));
-  std::vector<webrtc::RtpExtension> filtered =
-      FilterRtpExtensions(extensions, SupportedExtensions2, true);
-  EXPECT_EQ(3, filtered.size());
-  EXPECT_TRUE(IsSorted(filtered));
-  EXPECT_EQ(filtered[0].uri, filtered[1].uri);
-  EXPECT_NE(filtered[0].encrypt, filtered[1].encrypt);
-  EXPECT_NE(filtered[0].uri, filtered[2].uri);
-  EXPECT_NE(filtered[1].uri, filtered[2].uri);
-}
-
-TEST(WebRtcMediaEngineTest, FilterRtpExtensions_RemoveRedundantBwe_1) {
-  std::vector<RtpExtension> extensions;
-  extensions.push_back(
-      RtpExtension(RtpExtension::kTransportSequenceNumberUri, 3));
-  extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 9));
-  extensions.push_back(RtpExtension(RtpExtension::kAbsSendTimeUri, 6));
-  extensions.push_back(
-      RtpExtension(RtpExtension::kTransportSequenceNumberUri, 1));
-  extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 14));
-  std::vector<webrtc::RtpExtension> filtered =
-      FilterRtpExtensions(extensions, SupportedExtensions2, true);
-  EXPECT_EQ(1, filtered.size());
-  EXPECT_EQ(RtpExtension::kTransportSequenceNumberUri, filtered[0].uri);
-}
-
-TEST(WebRtcMediaEngineTest, FilterRtpExtensions_RemoveRedundantBweEncrypted_1) {
-  std::vector<RtpExtension> extensions;
-  extensions.push_back(
-      RtpExtension(RtpExtension::kTransportSequenceNumberUri, 3));
-  extensions.push_back(
-      RtpExtension(RtpExtension::kTransportSequenceNumberUri, 4, true));
-  extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 9));
-  extensions.push_back(RtpExtension(RtpExtension::kAbsSendTimeUri, 6));
-  extensions.push_back(
-      RtpExtension(RtpExtension::kTransportSequenceNumberUri, 1));
-  extensions.push_back(
-      RtpExtension(RtpExtension::kTransportSequenceNumberUri, 2, true));
-  extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 14));
-  std::vector<webrtc::RtpExtension> filtered =
-      FilterRtpExtensions(extensions, SupportedExtensions2, true);
-  EXPECT_EQ(2, filtered.size());
-  EXPECT_EQ(RtpExtension::kTransportSequenceNumberUri, filtered[0].uri);
-  EXPECT_EQ(RtpExtension::kTransportSequenceNumberUri, filtered[1].uri);
-  EXPECT_NE(filtered[0].encrypt, filtered[1].encrypt);
-}
-
-TEST(WebRtcMediaEngineTest, FilterRtpExtensions_RemoveRedundantBwe_2) {
-  std::vector<RtpExtension> extensions;
-  extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 1));
-  extensions.push_back(RtpExtension(RtpExtension::kAbsSendTimeUri, 14));
-  extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 7));
-  std::vector<webrtc::RtpExtension> filtered =
-      FilterRtpExtensions(extensions, SupportedExtensions2, true);
-  EXPECT_EQ(1, filtered.size());
-  EXPECT_EQ(RtpExtension::kAbsSendTimeUri, filtered[0].uri);
-}
-
-TEST(WebRtcMediaEngineTest, FilterRtpExtensions_RemoveRedundantBwe_3) {
-  std::vector<RtpExtension> extensions;
-  extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 2));
-  extensions.push_back(RtpExtension(RtpExtension::kTimestampOffsetUri, 14));
-  std::vector<webrtc::RtpExtension> filtered =
-      FilterRtpExtensions(extensions, SupportedExtensions2, true);
-  EXPECT_EQ(1, filtered.size());
-  EXPECT_EQ(RtpExtension::kTimestampOffsetUri, filtered[0].uri);
-}
-
-TEST(WebRtcMediaEngineFactoryTest, CreateOldApi) {
-  std::unique_ptr<MediaEngineInterface> engine(
-      WebRtcMediaEngineFactory::Create(nullptr, nullptr, nullptr));
-  EXPECT_TRUE(engine);
-}
-
-TEST(WebRtcMediaEngineFactoryTest, CreateWithBuiltinDecoders) {
-  std::unique_ptr<MediaEngineInterface> engine(WebRtcMediaEngineFactory::Create(
-      nullptr, webrtc::CreateBuiltinAudioEncoderFactory(),
-      webrtc::CreateBuiltinAudioDecoderFactory(), nullptr, nullptr));
-  EXPECT_TRUE(engine);
-}
-
-}  // namespace cricket
diff --git a/media/engine/webrtcvideocapturer.cc b/media/engine/webrtcvideocapturer.cc
deleted file mode 100644
index 9b872fb..0000000
--- a/media/engine/webrtcvideocapturer.cc
+++ /dev/null
@@ -1,342 +0,0 @@
-/*
- *  Copyright (c) 2011 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/media/engine/webrtcvideocapturer.h"
-
-#include "webrtc/rtc_base/arraysize.h"
-#include "webrtc/rtc_base/bind.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/safe_conversions.h"
-#include "webrtc/rtc_base/thread.h"
-#include "webrtc/rtc_base/timeutils.h"
-
-#include "webrtc/modules/video_capture/video_capture_factory.h"
-#include "webrtc/rtc_base/win32.h"  // Need this to #include the impl files.
-#include "webrtc/system_wrappers/include/field_trial.h"
-
-namespace cricket {
-
-namespace {
-struct kVideoFourCCEntry {
-  uint32_t fourcc;
-  webrtc::VideoType webrtc_type;
-};
-
-// This indicates our format preferences and defines a mapping between
-// webrtc::RawVideoType (from video_capture_defines.h) to our FOURCCs.
-kVideoFourCCEntry kSupportedFourCCs[] = {
-    {FOURCC_I420, webrtc::VideoType::kI420},   // 12 bpp, no conversion.
-    {FOURCC_YV12, webrtc::VideoType::kYV12},   // 12 bpp, no conversion.
-    {FOURCC_YUY2, webrtc::VideoType::kYUY2},   // 16 bpp, fast conversion.
-    {FOURCC_UYVY, webrtc::VideoType::kUYVY},   // 16 bpp, fast conversion.
-    {FOURCC_NV12, webrtc::VideoType::kNV12},   // 12 bpp, fast conversion.
-    {FOURCC_NV21, webrtc::VideoType::kNV21},   // 12 bpp, fast conversion.
-    {FOURCC_MJPG, webrtc::VideoType::kMJPEG},  // compressed, slow conversion.
-    {FOURCC_ARGB, webrtc::VideoType::kARGB},   // 32 bpp, slow conversion.
-    {FOURCC_24BG, webrtc::VideoType::kRGB24},  // 24 bpp, slow conversion.
-};
-
-bool CapabilityToFormat(const webrtc::VideoCaptureCapability& cap,
-                        VideoFormat* format) {
-  uint32_t fourcc = 0;
-  for (size_t i = 0; i < arraysize(kSupportedFourCCs); ++i) {
-    if (kSupportedFourCCs[i].webrtc_type == cap.videoType) {
-      fourcc = kSupportedFourCCs[i].fourcc;
-      break;
-    }
-  }
-  if (fourcc == 0) {
-    return false;
-  }
-
-  format->fourcc = fourcc;
-  format->width = cap.width;
-  format->height = cap.height;
-  format->interval = VideoFormat::FpsToInterval(cap.maxFPS);
-  return true;
-}
-
-bool FormatToCapability(const VideoFormat& format,
-                        webrtc::VideoCaptureCapability* cap) {
-  webrtc::VideoType webrtc_type = webrtc::VideoType::kUnknown;
-  for (size_t i = 0; i < arraysize(kSupportedFourCCs); ++i) {
-    if (kSupportedFourCCs[i].fourcc == format.fourcc) {
-      webrtc_type = kSupportedFourCCs[i].webrtc_type;
-      break;
-    }
-  }
-  if (webrtc_type == webrtc::VideoType::kUnknown) {
-    return false;
-  }
-
-  cap->width = format.width;
-  cap->height = format.height;
-  cap->maxFPS = VideoFormat::IntervalToFps(format.interval);
-  cap->videoType = webrtc_type;
-  cap->interlaced = false;
-  return true;
-}
-
-}  // namespace
-
-class WebRtcVcmFactory : public WebRtcVcmFactoryInterface {
- public:
-  virtual rtc::scoped_refptr<webrtc::VideoCaptureModule> Create(
-      const char* device) {
-    return webrtc::VideoCaptureFactory::Create(device);
-  }
-  virtual webrtc::VideoCaptureModule::DeviceInfo* CreateDeviceInfo() {
-    return webrtc::VideoCaptureFactory::CreateDeviceInfo();
-  }
-  virtual void DestroyDeviceInfo(webrtc::VideoCaptureModule::DeviceInfo* info) {
-    delete info;
-  }
-};
-
-///////////////////////////////////////////////////////////////////////////
-// Implementation of class WebRtcVideoCapturer
-///////////////////////////////////////////////////////////////////////////
-
-WebRtcVideoCapturer::WebRtcVideoCapturer()
-    : factory_(new WebRtcVcmFactory),
-      module_(nullptr),
-      captured_frames_(0),
-      start_thread_(nullptr) {}
-
-WebRtcVideoCapturer::WebRtcVideoCapturer(WebRtcVcmFactoryInterface* factory)
-    : factory_(factory),
-      module_(nullptr),
-      captured_frames_(0),
-      start_thread_(nullptr) {}
-
-WebRtcVideoCapturer::~WebRtcVideoCapturer() {}
-
-bool WebRtcVideoCapturer::Init(const Device& device) {
-  RTC_DCHECK(!start_thread_);
-  if (module_) {
-    LOG(LS_ERROR) << "The capturer is already initialized";
-    return false;
-  }
-
-  webrtc::VideoCaptureModule::DeviceInfo* info = factory_->CreateDeviceInfo();
-  if (!info) {
-    return false;
-  }
-
-  // Find the desired camera, by name.
-  // In the future, comparing IDs will be more robust.
-  // TODO(juberti): Figure what's needed to allow this.
-  int num_cams = info->NumberOfDevices();
-  char vcm_id[256] = "";
-  bool found = false;
-  for (int index = 0; index < num_cams; ++index) {
-    char vcm_name[256];
-    if (info->GetDeviceName(index, vcm_name, arraysize(vcm_name), vcm_id,
-                            arraysize(vcm_id)) != -1) {
-      if (device.name == reinterpret_cast<char*>(vcm_name)) {
-        found = true;
-        break;
-      }
-    }
-  }
-  if (!found) {
-    LOG(LS_WARNING) << "Failed to find capturer for id: " << device.id;
-    factory_->DestroyDeviceInfo(info);
-    return false;
-  }
-
-  // Enumerate the supported formats.
-  // TODO(juberti): Find out why this starts/stops the camera...
-  std::vector<VideoFormat> supported;
-  int32_t num_caps = info->NumberOfCapabilities(vcm_id);
-  for (int32_t i = 0; i < num_caps; ++i) {
-    webrtc::VideoCaptureCapability cap;
-    if (info->GetCapability(vcm_id, i, cap) != -1) {
-      VideoFormat format;
-      if (CapabilityToFormat(cap, &format)) {
-        supported.push_back(format);
-      } else {
-        LOG(LS_WARNING) << "Ignoring unsupported WebRTC capture format "
-                        << static_cast<int>(cap.videoType);
-      }
-    }
-  }
-  factory_->DestroyDeviceInfo(info);
-
-  if (supported.empty()) {
-    LOG(LS_ERROR) << "Failed to find usable formats for id: " << device.id;
-    return false;
-  }
-
-  module_ = factory_->Create(vcm_id);
-  if (!module_) {
-    LOG(LS_ERROR) << "Failed to create capturer for id: " << device.id;
-    return false;
-  }
-
-  // It is safe to change member attributes now.
-  SetId(device.id);
-  SetSupportedFormats(supported);
-
-  return true;
-}
-
-bool WebRtcVideoCapturer::Init(
-    const rtc::scoped_refptr<webrtc::VideoCaptureModule>& module) {
-  RTC_DCHECK(!start_thread_);
-  if (module_) {
-    LOG(LS_ERROR) << "The capturer is already initialized";
-    return false;
-  }
-  if (!module) {
-    LOG(LS_ERROR) << "Invalid VCM supplied";
-    return false;
-  }
-  // TODO(juberti): Set id and formats.
-  module_ = module;
-  return true;
-}
-
-bool WebRtcVideoCapturer::GetBestCaptureFormat(const VideoFormat& desired,
-                                               VideoFormat* best_format) {
-  if (!best_format) {
-    return false;
-  }
-
-  if (!VideoCapturer::GetBestCaptureFormat(desired, best_format)) {
-    // We maybe using a manually injected VCM which doesn't support enum.
-    // Use the desired format as the best format.
-    best_format->width = desired.width;
-    best_format->height = desired.height;
-    best_format->fourcc = FOURCC_I420;
-    best_format->interval = desired.interval;
-    LOG(LS_INFO) << "Failed to find best capture format,"
-                 << " fall back to the requested format "
-                 << best_format->ToString();
-  }
-  return true;
-}
-void WebRtcVideoCapturer::OnSinkWantsChanged(const rtc::VideoSinkWants& wants) {
-  // Can't take lock here as this will cause deadlock with
-  // OnIncomingCapturedFrame. In fact, the whole method, including methods it
-  // calls, can't take lock.
-  RTC_DCHECK(module_);
-
-  if (webrtc::field_trial::FindFullName("WebRTC-CVO").find("Disabled") == 0)
-    return;
-
-  VideoCapturer::OnSinkWantsChanged(wants);
-  bool result = module_->SetApplyRotation(wants.rotation_applied);
-  RTC_CHECK(result);
-
-  return;
-}
-
-CaptureState WebRtcVideoCapturer::Start(const VideoFormat& capture_format) {
-  if (!module_) {
-    LOG(LS_ERROR) << "The capturer has not been initialized";
-    return CS_FAILED;
-  }
-  if (start_thread_) {
-    LOG(LS_ERROR) << "The capturer is already running";
-    RTC_DCHECK(start_thread_->IsCurrent())
-        << "Trying to start capturer on different threads";
-    return CS_FAILED;
-  }
-
-  start_thread_ = rtc::Thread::Current();
-  captured_frames_ = 0;
-
-  SetCaptureFormat(&capture_format);
-
-  webrtc::VideoCaptureCapability cap;
-  if (!FormatToCapability(capture_format, &cap)) {
-    LOG(LS_ERROR) << "Invalid capture format specified";
-    return CS_FAILED;
-  }
-
-  int64_t start = rtc::TimeMillis();
-  module_->RegisterCaptureDataCallback(this);
-  if (module_->StartCapture(cap) != 0) {
-    LOG(LS_ERROR) << "Camera '" << GetId() << "' failed to start";
-    module_->DeRegisterCaptureDataCallback();
-    SetCaptureFormat(nullptr);
-    start_thread_ = nullptr;
-    return CS_FAILED;
-  }
-
-  LOG(LS_INFO) << "Camera '" << GetId() << "' started with format "
-               << capture_format.ToString() << ", elapsed time "
-               << rtc::TimeSince(start) << " ms";
-
-  SetCaptureState(CS_RUNNING);
-  return CS_STARTING;
-}
-
-void WebRtcVideoCapturer::Stop() {
-  if (!start_thread_) {
-    LOG(LS_ERROR) << "The capturer is already stopped";
-    return;
-  }
-  RTC_DCHECK(start_thread_);
-  RTC_DCHECK(start_thread_->IsCurrent());
-  if (IsRunning()) {
-    // The module is responsible for OnIncomingCapturedFrame being called, if
-    // we stop it we will get no further callbacks.
-    module_->StopCapture();
-  }
-  module_->DeRegisterCaptureDataCallback();
-
-  // TODO(juberti): Determine if the VCM exposes any drop stats we can use.
-  double drop_ratio = 0.0;
-  LOG(LS_INFO) << "Camera '" << GetId() << "' stopped after capturing "
-               << captured_frames_ << " frames and dropping "
-               << drop_ratio << "%";
-
-  SetCaptureFormat(NULL);
-  start_thread_ = nullptr;
-  SetCaptureState(CS_STOPPED);
-}
-
-bool WebRtcVideoCapturer::IsRunning() {
-  return (module_ != NULL && module_->CaptureStarted());
-}
-
-bool WebRtcVideoCapturer::GetPreferredFourccs(std::vector<uint32_t>* fourccs) {
-  if (!fourccs) {
-    return false;
-  }
-
-  fourccs->clear();
-  for (size_t i = 0; i < arraysize(kSupportedFourCCs); ++i) {
-    fourccs->push_back(kSupportedFourCCs[i].fourcc);
-  }
-  return true;
-}
-
-void WebRtcVideoCapturer::OnFrame(
-    const webrtc::VideoFrame& sample) {
-  // This can only happen between Start() and Stop().
-  RTC_DCHECK(start_thread_);
-
-  ++captured_frames_;
-  // Log the size and pixel aspect ratio of the first captured frame.
-  if (1 == captured_frames_) {
-    LOG(LS_INFO) << "Captured frame size "
-                 << sample.width() << "x" << sample.height()
-                 << ". Expected format " << GetCaptureFormat()->ToString();
-  }
-
-  VideoCapturer::OnFrame(sample, sample.width(), sample.height());
-}
-
-}  // namespace cricket
diff --git a/media/engine/webrtcvideocapturer.h b/media/engine/webrtcvideocapturer.h
deleted file mode 100644
index 6fbfcf2..0000000
--- a/media/engine/webrtcvideocapturer.h
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- *  Copyright (c) 2004 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_MEDIA_ENGINE_WEBRTCVIDEOCAPTURER_H_
-#define WEBRTC_MEDIA_ENGINE_WEBRTCVIDEOCAPTURER_H_
-
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "webrtc/common_video/libyuv/include/webrtc_libyuv.h"
-#include "webrtc/media/base/device.h"
-#include "webrtc/media/base/videocapturer.h"
-#include "webrtc/modules/video_capture/video_capture.h"
-#include "webrtc/rtc_base/asyncinvoker.h"
-#include "webrtc/rtc_base/messagehandler.h"
-#include "webrtc/rtc_base/scoped_ref_ptr.h"
-
-namespace cricket {
-
-// Factory to allow injection of a VCM impl into WebRtcVideoCapturer.
-// DeviceInfos do not have a Release() and therefore need an explicit Destroy().
-class WebRtcVcmFactoryInterface {
- public:
-  virtual ~WebRtcVcmFactoryInterface() {}
-  virtual rtc::scoped_refptr<webrtc::VideoCaptureModule> Create(
-      const char* device) = 0;
-  virtual webrtc::VideoCaptureModule::DeviceInfo* CreateDeviceInfo() = 0;
-  virtual void DestroyDeviceInfo(
-      webrtc::VideoCaptureModule::DeviceInfo* info) = 0;
-};
-
-// WebRTC-based implementation of VideoCapturer.
-class WebRtcVideoCapturer : public VideoCapturer,
-                            public rtc::VideoSinkInterface<webrtc::VideoFrame> {
- public:
-  WebRtcVideoCapturer();
-  explicit WebRtcVideoCapturer(WebRtcVcmFactoryInterface* factory);
-  virtual ~WebRtcVideoCapturer();
-
-  bool Init(const Device& device);
-  bool Init(const rtc::scoped_refptr<webrtc::VideoCaptureModule>& module);
-
-  // Override virtual methods of the parent class VideoCapturer.
-  bool GetBestCaptureFormat(const VideoFormat& desired,
-                            VideoFormat* best_format) override;
-  CaptureState Start(const VideoFormat& capture_format) override;
-  void Stop() override;
-  bool IsRunning() override;
-  bool IsScreencast() const override { return false; }
-
- protected:
-  void OnSinkWantsChanged(const rtc::VideoSinkWants& wants) override;
-  // Override virtual methods of the parent class VideoCapturer.
-  bool GetPreferredFourccs(std::vector<uint32_t>* fourccs) override;
-
- private:
-  // Callback when a frame is captured by camera.
-  void OnFrame(const webrtc::VideoFrame& frame) override;
-
-  // Used to signal captured frames on the same thread as invoked Start().
-  // With WebRTC's current VideoCapturer implementations, this will mean a
-  // thread hop, but in other implementations (e.g. Chrome) it will be called
-  // directly from OnIncomingCapturedFrame.
-  // TODO(tommi): Remove this workaround when we've updated the WebRTC capturers
-  // to follow the same contract.
-  void SignalFrameCapturedOnStartThread(const webrtc::VideoFrame& frame);
-
-  std::unique_ptr<WebRtcVcmFactoryInterface> factory_;
-  rtc::scoped_refptr<webrtc::VideoCaptureModule> module_;
-  int captured_frames_;
-  std::vector<uint8_t> capture_buffer_;
-  rtc::Thread* start_thread_;  // Set in Start(), unset in Stop();
-};
-
-}  // namespace cricket
-
-#endif  // WEBRTC_MEDIA_WEBRTC_WEBRTCVIDEOCAPTURER_H_
diff --git a/media/engine/webrtcvideocapturer_unittest.cc b/media/engine/webrtcvideocapturer_unittest.cc
deleted file mode 100644
index a4414f1..0000000
--- a/media/engine/webrtcvideocapturer_unittest.cc
+++ /dev/null
@@ -1,136 +0,0 @@
-/*
- *  Copyright (c) 2004 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.
- */
-
-#ifdef HAVE_WEBRTC_VIDEO
-
-#include <stdio.h>
-
-#include <memory>
-#include <vector>
-
-#include "webrtc/media/base/testutils.h"
-#include "webrtc/media/base/videocommon.h"
-#include "webrtc/media/engine/fakewebrtcvcmfactory.h"
-#include "webrtc/media/engine/webrtcvideocapturer.h"
-#include "webrtc/rtc_base/gunit.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/stringutils.h"
-#include "webrtc/rtc_base/thread.h"
-
-using cricket::VideoFormat;
-
-static const std::string kTestDeviceName = "JuberTech FakeCam Q123";
-static const std::string kTestDeviceId = "foo://bar/baz";
-const VideoFormat kDefaultVideoFormat =
-    VideoFormat(640, 400, VideoFormat::FpsToInterval(30), cricket::FOURCC_ANY);
-
-class WebRtcVideoCapturerTest : public testing::Test {
- public:
-  WebRtcVideoCapturerTest()
-      : factory_(new FakeWebRtcVcmFactory),
-        capturer_(new cricket::WebRtcVideoCapturer(factory_)) {
-    factory_->device_info.AddDevice(kTestDeviceName, kTestDeviceId);
-    // add a VGA/I420 capability
-    webrtc::VideoCaptureCapability vga;
-    vga.width = 640;
-    vga.height = 480;
-    vga.maxFPS = 30;
-    vga.videoType = webrtc::VideoType::kI420;
-    factory_->device_info.AddCapability(kTestDeviceId, vga);
-  }
-
- protected:
-  FakeWebRtcVcmFactory* factory_;  // owned by capturer_
-  std::unique_ptr<cricket::WebRtcVideoCapturer> capturer_;
-};
-
-TEST_F(WebRtcVideoCapturerTest, TestNotOpened) {
-  EXPECT_EQ("", capturer_->GetId());
-  EXPECT_TRUE(capturer_->GetSupportedFormats()->empty());
-  EXPECT_TRUE(capturer_->GetCaptureFormat() == NULL);
-  EXPECT_FALSE(capturer_->IsRunning());
-}
-
-TEST_F(WebRtcVideoCapturerTest, TestBadInit) {
-  EXPECT_FALSE(capturer_->Init(cricket::Device("bad-name", "bad-id")));
-  EXPECT_FALSE(capturer_->IsRunning());
-}
-
-TEST_F(WebRtcVideoCapturerTest, TestInit) {
-  EXPECT_TRUE(capturer_->Init(cricket::Device(kTestDeviceName, kTestDeviceId)));
-  EXPECT_EQ(kTestDeviceId, capturer_->GetId());
-  EXPECT_TRUE(NULL != capturer_->GetSupportedFormats());
-  ASSERT_EQ(1U, capturer_->GetSupportedFormats()->size());
-  EXPECT_EQ(640, (*capturer_->GetSupportedFormats())[0].width);
-  EXPECT_EQ(480, (*capturer_->GetSupportedFormats())[0].height);
-  EXPECT_TRUE(capturer_->GetCaptureFormat() == NULL);  // not started yet
-  EXPECT_FALSE(capturer_->IsRunning());
-}
-
-TEST_F(WebRtcVideoCapturerTest, TestInitVcm) {
-  EXPECT_TRUE(capturer_->Init(factory_->Create(
-      reinterpret_cast<const char*>(kTestDeviceId.c_str()))));
-}
-
-TEST_F(WebRtcVideoCapturerTest, TestCapture) {
-  EXPECT_TRUE(capturer_->Init(cricket::Device(kTestDeviceName, kTestDeviceId)));
-  cricket::VideoCapturerListener listener(capturer_.get());
-  cricket::VideoFormat format(
-      capturer_->GetSupportedFormats()->at(0));
-  EXPECT_EQ(cricket::CS_STARTING, capturer_->Start(format));
-  EXPECT_TRUE(capturer_->IsRunning());
-  ASSERT_TRUE(capturer_->GetCaptureFormat() != NULL);
-  EXPECT_EQ(format, *capturer_->GetCaptureFormat());
-  EXPECT_EQ_WAIT(cricket::CS_RUNNING, listener.last_capture_state(), 1000);
-  factory_->modules[0]->SendFrame(640, 480);
-  EXPECT_TRUE_WAIT(listener.frame_count() > 0, 5000);
-  EXPECT_EQ(640, listener.frame_width());
-  EXPECT_EQ(480, listener.frame_height());
-  EXPECT_EQ(cricket::CS_FAILED, capturer_->Start(format));
-  capturer_->Stop();
-  EXPECT_FALSE(capturer_->IsRunning());
-  EXPECT_TRUE(capturer_->GetCaptureFormat() == NULL);
-  EXPECT_EQ_WAIT(cricket::CS_STOPPED, listener.last_capture_state(), 1000);
-}
-
-TEST_F(WebRtcVideoCapturerTest, TestCaptureVcm) {
-  EXPECT_TRUE(capturer_->Init(factory_->Create(
-      reinterpret_cast<const char*>(kTestDeviceId.c_str()))));
-  cricket::VideoCapturerListener listener(capturer_.get());
-  EXPECT_TRUE(capturer_->GetSupportedFormats()->empty());
-  VideoFormat format;
-  EXPECT_TRUE(capturer_->GetBestCaptureFormat(kDefaultVideoFormat, &format));
-  EXPECT_EQ(kDefaultVideoFormat.width, format.width);
-  EXPECT_EQ(kDefaultVideoFormat.height, format.height);
-  EXPECT_EQ(kDefaultVideoFormat.interval, format.interval);
-  EXPECT_EQ(cricket::FOURCC_I420, format.fourcc);
-  EXPECT_EQ(cricket::CS_STARTING, capturer_->Start(format));
-  EXPECT_TRUE(capturer_->IsRunning());
-  ASSERT_TRUE(capturer_->GetCaptureFormat() != NULL);
-  EXPECT_EQ(format, *capturer_->GetCaptureFormat());
-  EXPECT_EQ_WAIT(cricket::CS_RUNNING, listener.last_capture_state(), 1000);
-  factory_->modules[0]->SendFrame(640, 480);
-  EXPECT_TRUE_WAIT(listener.frame_count() > 0, 5000);
-  EXPECT_EQ(640, listener.frame_width());
-  EXPECT_EQ(480, listener.frame_height());
-  EXPECT_EQ(cricket::CS_FAILED, capturer_->Start(format));
-  capturer_->Stop();
-  EXPECT_FALSE(capturer_->IsRunning());
-  EXPECT_TRUE(capturer_->GetCaptureFormat() == NULL);
-}
-
-TEST_F(WebRtcVideoCapturerTest, TestCaptureWithoutInit) {
-  cricket::VideoFormat format;
-  EXPECT_EQ(cricket::CS_FAILED, capturer_->Start(format));
-  EXPECT_TRUE(capturer_->GetCaptureFormat() == NULL);
-  EXPECT_FALSE(capturer_->IsRunning());
-}
-
-#endif  // HAVE_WEBRTC_VIDEO
diff --git a/media/engine/webrtcvideocapturerfactory.cc b/media/engine/webrtcvideocapturerfactory.cc
deleted file mode 100644
index 6ee361a..0000000
--- a/media/engine/webrtcvideocapturerfactory.cc
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- *  Copyright (c) 2004 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 <memory>
-
-#include "webrtc/media/engine/webrtcvideocapturer.h"
-#include "webrtc/media/engine/webrtcvideocapturerfactory.h"
-
-namespace cricket {
-
-std::unique_ptr<VideoCapturer> WebRtcVideoDeviceCapturerFactory::Create(
-    const Device& device) {
-#ifdef HAVE_WEBRTC_VIDEO
-  std::unique_ptr<WebRtcVideoCapturer> capturer(
-      new WebRtcVideoCapturer());
-  if (!capturer->Init(device)) {
-    return std::unique_ptr<VideoCapturer>();
-  }
-  return std::move(capturer);
-#else
-  return std::unique_ptr<VideoCapturer>();
-#endif
-}
-
-}  // namespace cricket
diff --git a/media/engine/webrtcvideocapturerfactory.h b/media/engine/webrtcvideocapturerfactory.h
deleted file mode 100644
index c1f91b7..0000000
--- a/media/engine/webrtcvideocapturerfactory.h
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- *  Copyright (c) 2014 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.
- */
-
-// TODO(pthatcher): Rename file to match class name.
-#ifndef WEBRTC_MEDIA_ENGINE_WEBRTCVIDEOCAPTURERFACTORY_H_
-#define WEBRTC_MEDIA_ENGINE_WEBRTCVIDEOCAPTURERFACTORY_H_
-
-#include "webrtc/media/base/videocapturerfactory.h"
-
-namespace cricket {
-
-// Creates instances of cricket::WebRtcVideoCapturer.
-class WebRtcVideoDeviceCapturerFactory : public VideoDeviceCapturerFactory {
- public:
-  std::unique_ptr<VideoCapturer> Create(const Device& device) override;
-};
-
-}  // namespace cricket
-
-#endif  // WEBRTC_MEDIA_ENGINE_WEBRTCVIDEOCAPTURERFACTORY_H_
diff --git a/media/engine/webrtcvideodecoderfactory.h b/media/engine/webrtcvideodecoderfactory.h
deleted file mode 100644
index e4d1c98..0000000
--- a/media/engine/webrtcvideodecoderfactory.h
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- *  Copyright (c) 2013 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_MEDIA_ENGINE_WEBRTCVIDEODECODERFACTORY_H_
-#define WEBRTC_MEDIA_ENGINE_WEBRTCVIDEODECODERFACTORY_H_
-
-#include "webrtc/common_types.h"
-#include "webrtc/media/base/codec.h"
-#include "webrtc/rtc_base/refcount.h"
-
-namespace webrtc {
-class VideoDecoder;
-}
-
-namespace cricket {
-
-struct VideoDecoderParams {
-  std::string receive_stream_id;
-};
-
-// Deprecated. Use webrtc::VideoDecoderFactory instead.
-// https://bugs.chromium.org/p/webrtc/issues/detail?id=7925
-class WebRtcVideoDecoderFactory {
- public:
-  // Caller takes the ownership of the returned object and it should be released
-  // by calling DestroyVideoDecoder().
-  virtual webrtc::VideoDecoder* CreateVideoDecoderWithParams(
-      const VideoCodec& codec,
-      VideoDecoderParams params) {
-    // Default implementation that delegates to old version in order to preserve
-    // backwards-compatability.
-    webrtc::VideoCodecType type = webrtc::PayloadStringToCodecType(codec.name);
-    return CreateVideoDecoderWithParams(type, params);
-  }
-  // DEPRECATED.
-  // These methods should not be used by new code and will eventually be
-  // removed. See http://crbug.com/webrtc/8140.
-  virtual webrtc::VideoDecoder* CreateVideoDecoder(
-      webrtc::VideoCodecType type) {
-    RTC_NOTREACHED();
-    return nullptr;
-  };
-
-  virtual webrtc::VideoDecoder* CreateVideoDecoderWithParams(
-      webrtc::VideoCodecType type,
-      VideoDecoderParams params) {
-    return CreateVideoDecoder(type);
-  }
-  virtual ~WebRtcVideoDecoderFactory() {}
-
-  virtual void DestroyVideoDecoder(webrtc::VideoDecoder* decoder) = 0;
-};
-
-}  // namespace cricket
-
-#endif  // WEBRTC_MEDIA_ENGINE_WEBRTCVIDEODECODERFACTORY_H_
diff --git a/media/engine/webrtcvideoencoderfactory.h b/media/engine/webrtcvideoencoderfactory.h
deleted file mode 100644
index 284f1ef..0000000
--- a/media/engine/webrtcvideoencoderfactory.h
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- *  Copyright (c) 2013 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_MEDIA_ENGINE_WEBRTCVIDEOENCODERFACTORY_H_
-#define WEBRTC_MEDIA_ENGINE_WEBRTCVIDEOENCODERFACTORY_H_
-
-#include <vector>
-
-#include "webrtc/common_types.h"
-#include "webrtc/media/base/codec.h"
-
-namespace webrtc {
-class VideoEncoder;
-}
-
-namespace cricket {
-
-// Deprecated. Use webrtc::VideoEncoderFactory instead.
-// https://bugs.chromium.org/p/webrtc/issues/detail?id=7925
-class WebRtcVideoEncoderFactory {
- public:
-  virtual ~WebRtcVideoEncoderFactory() {}
-
-  // Caller takes the ownership of the returned object and it should be released
-  // by calling DestroyVideoEncoder().
-  virtual webrtc::VideoEncoder* CreateVideoEncoder(
-      const cricket::VideoCodec& codec) = 0;
-
-  // Returns a list of supported codecs in order of preference.
-  virtual const std::vector<cricket::VideoCodec>& supported_codecs() const = 0;
-
-  // Returns true if encoders created by this factory of the given codec type
-  // will use internal camera sources, meaning that they don't require/expect
-  // frames to be delivered via webrtc::VideoEncoder::Encode.
-  virtual bool EncoderTypeHasInternalSource(webrtc::VideoCodecType type) const {
-    return false;
-  }
-
-  virtual void DestroyVideoEncoder(webrtc::VideoEncoder* encoder) = 0;
-};
-
-}  // namespace cricket
-
-#endif  // WEBRTC_MEDIA_ENGINE_WEBRTCVIDEOENCODERFACTORY_H_
diff --git a/media/engine/webrtcvideoencoderfactory_unittest.cc b/media/engine/webrtcvideoencoderfactory_unittest.cc
deleted file mode 100644
index 5d3c9ab..0000000
--- a/media/engine/webrtcvideoencoderfactory_unittest.cc
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- *  Copyright (c) 2017 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/media/engine/webrtcvideoencoderfactory.h"
-
-#include "webrtc/test/gtest.h"
-
-class WebRtcVideoEncoderFactoryForTest
-    : public cricket::WebRtcVideoEncoderFactory {
- public:
-  WebRtcVideoEncoderFactoryForTest() {
-    codecs_.push_back(cricket::VideoCodec("H264"));
-    codecs_.push_back(cricket::VideoCodec("VP8"));
-  }
-
-  webrtc::VideoEncoder* CreateVideoEncoder(
-      const cricket::VideoCodec& codec) override {
-    return nullptr;
-  }
-
-  const std::vector<cricket::VideoCodec>& supported_codecs() const override {
-    return codecs_;
-  }
-
-  void DestroyVideoEncoder(webrtc::VideoEncoder* encoder) override {}
-
-  std::vector<cricket::VideoCodec> codecs_;
-};
-
-TEST(WebRtcVideoEncoderFactoryTest, TestMultipleCallsToSupportedCodecs) {
-  WebRtcVideoEncoderFactoryForTest factory;
-  EXPECT_EQ(2u, factory.supported_codecs().size());
-  EXPECT_EQ("H264", factory.supported_codecs()[0].name);
-  EXPECT_EQ("VP8", factory.supported_codecs()[1].name);
-
-  // The codec list doesn't grow when called repeatedly.
-  EXPECT_EQ(2u, factory.supported_codecs().size());
-}
diff --git a/media/engine/webrtcvideoengine.cc b/media/engine/webrtcvideoengine.cc
deleted file mode 100644
index 26b9397..0000000
--- a/media/engine/webrtcvideoengine.cc
+++ /dev/null
@@ -1,2690 +0,0 @@
-/*
- *  Copyright (c) 2014 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/media/engine/webrtcvideoengine.h"
-
-#include <stdio.h>
-#include <algorithm>
-#include <set>
-#include <string>
-#include <utility>
-
-#include "webrtc/api/video/i420_buffer.h"
-#include "webrtc/api/video_codecs/sdp_video_format.h"
-#include "webrtc/api/video_codecs/video_decoder.h"
-#include "webrtc/api/video_codecs/video_decoder_factory.h"
-#include "webrtc/api/video_codecs/video_encoder.h"
-#include "webrtc/api/video_codecs/video_encoder_factory.h"
-#include "webrtc/call/call.h"
-#include "webrtc/common_video/h264/profile_level_id.h"
-#include "webrtc/media/engine/constants.h"
-#include "webrtc/media/engine/internaldecoderfactory.h"
-#include "webrtc/media/engine/internalencoderfactory.h"
-#include "webrtc/media/engine/scopedvideodecoder.h"
-#include "webrtc/media/engine/scopedvideoencoder.h"
-#include "webrtc/media/engine/simulcast.h"
-#include "webrtc/media/engine/simulcast_encoder_adapter.h"
-#include "webrtc/media/engine/videodecodersoftwarefallbackwrapper.h"
-#include "webrtc/media/engine/videoencodersoftwarefallbackwrapper.h"
-#include "webrtc/media/engine/webrtcmediaengine.h"
-#include "webrtc/media/engine/webrtcvideoencoderfactory.h"
-#include "webrtc/media/engine/webrtcvoiceengine.h"
-#include "webrtc/rtc_base/copyonwritebuffer.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/stringutils.h"
-#include "webrtc/rtc_base/timeutils.h"
-#include "webrtc/rtc_base/trace_event.h"
-#include "webrtc/system_wrappers/include/field_trial.h"
-
-using DegradationPreference = webrtc::VideoSendStream::DegradationPreference;
-
-namespace cricket {
-// This class represents all encoders, i.e. both internal and external. It
-// serves as a temporary adapter between WebRtcVideoEncoderFactory* and the new
-// factory interface that is being developed.
-// TODO(magjed): Remove once WebRtcVideoEncoderFactory* is deprecated and
-// webrtc:7925 is fixed.
-class EncoderFactoryAdapter {
- public:
-  struct AllocatedEncoder {
-    AllocatedEncoder() = default;
-    AllocatedEncoder(std::unique_ptr<webrtc::VideoEncoder> encoder,
-                     bool is_hardware_accelerated,
-                     bool has_internal_source);
-
-    std::unique_ptr<webrtc::VideoEncoder> encoder;
-    bool is_hardware_accelerated;
-    bool has_internal_source;
-  };
-
-  virtual ~EncoderFactoryAdapter() {}
-
-  virtual AllocatedEncoder CreateVideoEncoder(
-      const VideoCodec& codec,
-      bool is_conference_mode_screenshare) const = 0;
-
-  virtual std::vector<VideoCodec> GetSupportedCodecs() const = 0;
-};
-
-class DecoderFactoryAdapter {
- public:
-  virtual ~DecoderFactoryAdapter() {}
-
-  virtual std::unique_ptr<webrtc::VideoDecoder> CreateVideoDecoder(
-      const VideoCodec& codec,
-      const VideoDecoderParams& decoder_params) const = 0;
-};
-
-namespace {
-
-std::vector<VideoCodec> AssignPayloadTypesAndAddAssociatedRtxCodecs(
-    const std::vector<VideoCodec>& input_codecs);
-
-// Wraps cricket::WebRtcVideoEncoderFactory* into common EncoderFactoryAdapter
-// interface.
-// TODO(magjed): Remove once WebRtcVideoEncoderFactory* is deprecated and
-// webrtc:7925 is fixed.
-class CricketEncoderFactoryAdapter : public EncoderFactoryAdapter {
- public:
-  explicit CricketEncoderFactoryAdapter(
-      WebRtcVideoEncoderFactory* external_encoder_factory)
-      : internal_encoder_factory_(new InternalEncoderFactory()),
-        external_encoder_factory_(external_encoder_factory) {}
-
- private:
-  explicit CricketEncoderFactoryAdapter(
-      const CricketEncoderFactoryAdapter& other)
-      : CricketEncoderFactoryAdapter(other.external_encoder_factory_) {}
-
-  AllocatedEncoder CreateVideoEncoder(
-      const VideoCodec& codec,
-      bool is_conference_mode_screenshare) const override;
-
-  std::vector<VideoCodec> GetSupportedCodecs() const override;
-
-  const std::unique_ptr<WebRtcVideoEncoderFactory> internal_encoder_factory_;
-  WebRtcVideoEncoderFactory* const external_encoder_factory_;
-};
-
-class CricketDecoderFactoryAdapter : public DecoderFactoryAdapter {
- public:
-  explicit CricketDecoderFactoryAdapter(
-      WebRtcVideoDecoderFactory* external_decoder_factory)
-      : internal_decoder_factory_(new InternalDecoderFactory()),
-        external_decoder_factory_(external_decoder_factory) {}
-
- private:
-  explicit CricketDecoderFactoryAdapter(
-      const CricketDecoderFactoryAdapter& other)
-      : CricketDecoderFactoryAdapter(other.external_decoder_factory_) {}
-
-  std::unique_ptr<webrtc::VideoDecoder> CreateVideoDecoder(
-      const VideoCodec& codec,
-      const VideoDecoderParams& decoder_params) const override;
-
-  const std::unique_ptr<WebRtcVideoDecoderFactory> internal_decoder_factory_;
-  WebRtcVideoDecoderFactory* const external_decoder_factory_;
-};
-
-// Wraps webrtc::VideoEncoderFactory into common EncoderFactoryAdapter
-// interface.
-class WebRtcEncoderFactoryAdapter : public EncoderFactoryAdapter {
- public:
-  explicit WebRtcEncoderFactoryAdapter(
-      std::unique_ptr<webrtc::VideoEncoderFactory> encoder_factory)
-      : encoder_factory_(std::move(encoder_factory)) {}
-
- private:
-  AllocatedEncoder CreateVideoEncoder(
-      const VideoCodec& codec,
-      bool is_conference_mode_screenshare) const override {
-    if (!encoder_factory_)
-      return AllocatedEncoder();
-    const webrtc::SdpVideoFormat format(codec.name, codec.params);
-    const webrtc::VideoEncoderFactory::CodecInfo info =
-        encoder_factory_->QueryVideoEncoder(format);
-    return AllocatedEncoder(encoder_factory_->CreateVideoEncoder(format),
-                            info.is_hardware_accelerated,
-                            info.has_internal_source);
-  }
-
-  std::vector<VideoCodec> GetSupportedCodecs() const override {
-    if (!encoder_factory_)
-      return std::vector<VideoCodec>();
-    std::vector<VideoCodec> codecs;
-    for (const webrtc::SdpVideoFormat& format :
-         encoder_factory_->GetSupportedFormats()) {
-      VideoCodec codec;
-      codec.name = format.name;
-      codec.params = format.parameters;
-      codecs.push_back(codec);
-    }
-    return AssignPayloadTypesAndAddAssociatedRtxCodecs(codecs);
-  }
-
-  std::unique_ptr<webrtc::VideoEncoderFactory> encoder_factory_;
-};
-
-// Wraps webrtc::VideoDecoderFactory into common DecoderFactoryAdapter
-// interface.
-class WebRtcDecoderFactoryAdapter : public DecoderFactoryAdapter {
- public:
-  explicit WebRtcDecoderFactoryAdapter(
-      std::unique_ptr<webrtc::VideoDecoderFactory> decoder_factory)
-      : decoder_factory_(std::move(decoder_factory)) {}
-
- private:
-  std::unique_ptr<webrtc::VideoDecoder> CreateVideoDecoder(
-      const VideoCodec& codec,
-      const VideoDecoderParams& decoder_params) const override {
-    return decoder_factory_
-               ? decoder_factory_->CreateVideoDecoder(
-                     webrtc::SdpVideoFormat(codec.name, codec.params))
-               : nullptr;
-  }
-
-  std::unique_ptr<webrtc::VideoDecoderFactory> decoder_factory_;
-};
-
-// If this field trial is enabled, we will enable sending FlexFEC and disable
-// sending ULPFEC whenever the former has been negotiated in the SDPs.
-bool IsFlexfecFieldTrialEnabled() {
-  return webrtc::field_trial::IsEnabled("WebRTC-FlexFEC-03");
-}
-
-// If this field trial is enabled, the "flexfec-03" codec may have been
-// advertised as being supported in the local SDP. That means that we must be
-// ready to receive FlexFEC packets. See internalencoderfactory.cc.
-bool IsFlexfecAdvertisedFieldTrialEnabled() {
-  return webrtc::field_trial::IsEnabled("WebRTC-FlexFEC-03-Advertised");
-}
-
-void AddDefaultFeedbackParams(VideoCodec* codec) {
-  codec->AddFeedbackParam(FeedbackParam(kRtcpFbParamCcm, kRtcpFbCcmParamFir));
-  codec->AddFeedbackParam(FeedbackParam(kRtcpFbParamNack, kParamValueEmpty));
-  codec->AddFeedbackParam(FeedbackParam(kRtcpFbParamNack, kRtcpFbNackParamPli));
-  codec->AddFeedbackParam(FeedbackParam(kRtcpFbParamRemb, kParamValueEmpty));
-  codec->AddFeedbackParam(
-      FeedbackParam(kRtcpFbParamTransportCc, kParamValueEmpty));
-}
-
-static std::string CodecVectorToString(const std::vector<VideoCodec>& codecs) {
-  std::stringstream out;
-  out << '{';
-  for (size_t i = 0; i < codecs.size(); ++i) {
-    out << codecs[i].ToString();
-    if (i != codecs.size() - 1) {
-      out << ", ";
-    }
-  }
-  out << '}';
-  return out.str();
-}
-
-static bool ValidateCodecFormats(const std::vector<VideoCodec>& codecs) {
-  bool has_video = false;
-  for (size_t i = 0; i < codecs.size(); ++i) {
-    if (!codecs[i].ValidateCodecFormat()) {
-      return false;
-    }
-    if (codecs[i].GetCodecType() == VideoCodec::CODEC_VIDEO) {
-      has_video = true;
-    }
-  }
-  if (!has_video) {
-    LOG(LS_ERROR) << "Setting codecs without a video codec is invalid: "
-                  << CodecVectorToString(codecs);
-    return false;
-  }
-  return true;
-}
-
-static bool ValidateStreamParams(const StreamParams& sp) {
-  if (sp.ssrcs.empty()) {
-    LOG(LS_ERROR) << "No SSRCs in stream parameters: " << sp.ToString();
-    return false;
-  }
-
-  std::vector<uint32_t> primary_ssrcs;
-  sp.GetPrimarySsrcs(&primary_ssrcs);
-  std::vector<uint32_t> rtx_ssrcs;
-  sp.GetFidSsrcs(primary_ssrcs, &rtx_ssrcs);
-  for (uint32_t rtx_ssrc : rtx_ssrcs) {
-    bool rtx_ssrc_present = false;
-    for (uint32_t sp_ssrc : sp.ssrcs) {
-      if (sp_ssrc == rtx_ssrc) {
-        rtx_ssrc_present = true;
-        break;
-      }
-    }
-    if (!rtx_ssrc_present) {
-      LOG(LS_ERROR) << "RTX SSRC '" << rtx_ssrc
-                    << "' missing from StreamParams ssrcs: " << sp.ToString();
-      return false;
-    }
-  }
-  if (!rtx_ssrcs.empty() && primary_ssrcs.size() != rtx_ssrcs.size()) {
-    LOG(LS_ERROR)
-        << "RTX SSRCs exist, but don't cover all SSRCs (unsupported): "
-        << sp.ToString();
-    return false;
-  }
-
-  return true;
-}
-
-// Returns true if the given codec is disallowed from doing simulcast.
-bool IsCodecBlacklistedForSimulcast(const std::string& codec_name) {
-  return CodecNamesEq(codec_name, kH264CodecName) ||
-         CodecNamesEq(codec_name, kVp9CodecName);
-}
-
-// The selected thresholds for QVGA and VGA corresponded to a QP around 10.
-// The change in QP declined above the selected bitrates.
-static int GetMaxDefaultVideoBitrateKbps(int width, int height) {
-  if (width * height <= 320 * 240) {
-    return 600;
-  } else if (width * height <= 640 * 480) {
-    return 1700;
-  } else if (width * height <= 960 * 540) {
-    return 2000;
-  } else {
-    return 2500;
-  }
-}
-
-bool GetVp9LayersFromFieldTrialGroup(int* num_spatial_layers,
-                                     int* num_temporal_layers) {
-  std::string group = webrtc::field_trial::FindFullName("WebRTC-SupportVP9SVC");
-  if (group.empty())
-    return false;
-
-  if (sscanf(group.c_str(), "EnabledByFlag_%dSL%dTL", num_spatial_layers,
-             num_temporal_layers) != 2) {
-    return false;
-  }
-  const int kMaxSpatialLayers = 2;
-  if (*num_spatial_layers > kMaxSpatialLayers || *num_spatial_layers < 1)
-    return false;
-
-  const int kMaxTemporalLayers = 3;
-  if (*num_temporal_layers > kMaxTemporalLayers || *num_temporal_layers < 1)
-    return false;
-
-  return true;
-}
-
-int GetDefaultVp9SpatialLayers() {
-  int num_sl;
-  int num_tl;
-  if (GetVp9LayersFromFieldTrialGroup(&num_sl, &num_tl)) {
-    return num_sl;
-  }
-  return 1;
-}
-
-int GetDefaultVp9TemporalLayers() {
-  int num_sl;
-  int num_tl;
-  if (GetVp9LayersFromFieldTrialGroup(&num_sl, &num_tl)) {
-    return num_tl;
-  }
-  return 1;
-}
-}  // namespace
-
-// Constants defined in webrtc/media/engine/constants.h
-// TODO(pbos): Move these to a separate constants.cc file.
-const int kMinVideoBitrateKbps = 30;
-
-const int kVideoMtu = 1200;
-const int kVideoRtpBufferSize = 65536;
-
-// This constant is really an on/off, lower-level configurable NACK history
-// duration hasn't been implemented.
-static const int kNackHistoryMs = 1000;
-
-static const int kDefaultRtcpReceiverReportSsrc = 1;
-
-// Minimum time interval for logging stats.
-static const int64_t kStatsLogIntervalMs = 10000;
-
-rtc::scoped_refptr<webrtc::VideoEncoderConfig::EncoderSpecificSettings>
-WebRtcVideoChannel::WebRtcVideoSendStream::ConfigureVideoEncoderSettings(
-    const VideoCodec& codec) {
-  RTC_DCHECK_RUN_ON(&thread_checker_);
-  bool is_screencast = parameters_.options.is_screencast.value_or(false);
-  // No automatic resizing when using simulcast or screencast.
-  bool automatic_resize =
-      !is_screencast && parameters_.config.rtp.ssrcs.size() == 1;
-  bool frame_dropping = !is_screencast;
-  bool denoising;
-  bool codec_default_denoising = false;
-  if (is_screencast) {
-    denoising = false;
-  } else {
-    // Use codec default if video_noise_reduction is unset.
-    codec_default_denoising = !parameters_.options.video_noise_reduction;
-    denoising = parameters_.options.video_noise_reduction.value_or(false);
-  }
-
-  if (CodecNamesEq(codec.name, kH264CodecName)) {
-    webrtc::VideoCodecH264 h264_settings =
-        webrtc::VideoEncoder::GetDefaultH264Settings();
-    h264_settings.frameDroppingOn = frame_dropping;
-    return new rtc::RefCountedObject<
-        webrtc::VideoEncoderConfig::H264EncoderSpecificSettings>(h264_settings);
-  }
-  if (CodecNamesEq(codec.name, kVp8CodecName)) {
-    webrtc::VideoCodecVP8 vp8_settings =
-        webrtc::VideoEncoder::GetDefaultVp8Settings();
-    vp8_settings.automaticResizeOn = automatic_resize;
-    // VP8 denoising is enabled by default.
-    vp8_settings.denoisingOn = codec_default_denoising ? true : denoising;
-    vp8_settings.frameDroppingOn = frame_dropping;
-    return new rtc::RefCountedObject<
-        webrtc::VideoEncoderConfig::Vp8EncoderSpecificSettings>(vp8_settings);
-  }
-  if (CodecNamesEq(codec.name, kVp9CodecName)) {
-    webrtc::VideoCodecVP9 vp9_settings =
-        webrtc::VideoEncoder::GetDefaultVp9Settings();
-    if (is_screencast) {
-      // TODO(asapersson): Set to 2 for now since there is a DCHECK in
-      // VideoSendStream::ReconfigureVideoEncoder.
-      vp9_settings.numberOfSpatialLayers = 2;
-    } else {
-      vp9_settings.numberOfSpatialLayers = GetDefaultVp9SpatialLayers();
-    }
-    // VP9 denoising is disabled by default.
-    vp9_settings.denoisingOn = codec_default_denoising ? true : denoising;
-    vp9_settings.frameDroppingOn = frame_dropping;
-    vp9_settings.automaticResizeOn = automatic_resize;
-    return new rtc::RefCountedObject<
-        webrtc::VideoEncoderConfig::Vp9EncoderSpecificSettings>(vp9_settings);
-  }
-  return nullptr;
-}
-
-DefaultUnsignalledSsrcHandler::DefaultUnsignalledSsrcHandler()
-    : default_sink_(nullptr) {}
-
-UnsignalledSsrcHandler::Action DefaultUnsignalledSsrcHandler::OnUnsignalledSsrc(
-    WebRtcVideoChannel* channel,
-    uint32_t ssrc) {
-  rtc::Optional<uint32_t> default_recv_ssrc =
-      channel->GetDefaultReceiveStreamSsrc();
-
-  if (default_recv_ssrc) {
-    LOG(LS_INFO) << "Destroying old default receive stream for SSRC=" << ssrc
-                 << ".";
-    channel->RemoveRecvStream(*default_recv_ssrc);
-  }
-
-  StreamParams sp;
-  sp.ssrcs.push_back(ssrc);
-  LOG(LS_INFO) << "Creating default receive stream for SSRC=" << ssrc << ".";
-  if (!channel->AddRecvStream(sp, true)) {
-    LOG(LS_WARNING) << "Could not create default receive stream.";
-  }
-
-  channel->SetSink(ssrc, default_sink_);
-  return kDeliverPacket;
-}
-
-rtc::VideoSinkInterface<webrtc::VideoFrame>*
-DefaultUnsignalledSsrcHandler::GetDefaultSink() const {
-  return default_sink_;
-}
-
-void DefaultUnsignalledSsrcHandler::SetDefaultSink(
-    WebRtcVideoChannel* channel,
-    rtc::VideoSinkInterface<webrtc::VideoFrame>* sink) {
-  default_sink_ = sink;
-  rtc::Optional<uint32_t> default_recv_ssrc =
-      channel->GetDefaultReceiveStreamSsrc();
-  if (default_recv_ssrc) {
-    channel->SetSink(*default_recv_ssrc, default_sink_);
-  }
-}
-
-WebRtcVideoEngine::WebRtcVideoEngine(
-    WebRtcVideoEncoderFactory* external_video_encoder_factory,
-    WebRtcVideoDecoderFactory* external_video_decoder_factory)
-    : decoder_factory_(
-          new CricketDecoderFactoryAdapter(external_video_decoder_factory)),
-      encoder_factory_(
-          new CricketEncoderFactoryAdapter(external_video_encoder_factory)) {
-  LOG(LS_INFO) << "WebRtcVideoEngine::WebRtcVideoEngine()";
-}
-
-WebRtcVideoEngine::WebRtcVideoEngine(
-    std::unique_ptr<webrtc::VideoEncoderFactory> video_encoder_factory,
-    std::unique_ptr<webrtc::VideoDecoderFactory> video_decoder_factory)
-    : decoder_factory_(
-          new WebRtcDecoderFactoryAdapter(std::move(video_decoder_factory))),
-      encoder_factory_(
-          new WebRtcEncoderFactoryAdapter(std::move(video_encoder_factory))) {
-  LOG(LS_INFO) << "WebRtcVideoEngine::WebRtcVideoEngine()";
-}
-
-WebRtcVideoEngine::~WebRtcVideoEngine() {
-  LOG(LS_INFO) << "WebRtcVideoEngine::~WebRtcVideoEngine";
-}
-
-WebRtcVideoChannel* WebRtcVideoEngine::CreateChannel(
-    webrtc::Call* call,
-    const MediaConfig& config,
-    const VideoOptions& options) {
-  LOG(LS_INFO) << "CreateChannel. Options: " << options.ToString();
-  return new WebRtcVideoChannel(call, config, options, encoder_factory_.get(),
-                                decoder_factory_.get());
-}
-
-std::vector<VideoCodec> WebRtcVideoEngine::codecs() const {
-  return encoder_factory_->GetSupportedCodecs();
-}
-
-RtpCapabilities WebRtcVideoEngine::GetCapabilities() const {
-  RtpCapabilities capabilities;
-  capabilities.header_extensions.push_back(
-      webrtc::RtpExtension(webrtc::RtpExtension::kTimestampOffsetUri,
-                           webrtc::RtpExtension::kTimestampOffsetDefaultId));
-  capabilities.header_extensions.push_back(
-      webrtc::RtpExtension(webrtc::RtpExtension::kAbsSendTimeUri,
-                           webrtc::RtpExtension::kAbsSendTimeDefaultId));
-  capabilities.header_extensions.push_back(
-      webrtc::RtpExtension(webrtc::RtpExtension::kVideoRotationUri,
-                           webrtc::RtpExtension::kVideoRotationDefaultId));
-  capabilities.header_extensions.push_back(webrtc::RtpExtension(
-      webrtc::RtpExtension::kTransportSequenceNumberUri,
-      webrtc::RtpExtension::kTransportSequenceNumberDefaultId));
-  capabilities.header_extensions.push_back(
-      webrtc::RtpExtension(webrtc::RtpExtension::kPlayoutDelayUri,
-                           webrtc::RtpExtension::kPlayoutDelayDefaultId));
-  capabilities.header_extensions.push_back(
-      webrtc::RtpExtension(webrtc::RtpExtension::kVideoContentTypeUri,
-                           webrtc::RtpExtension::kVideoContentTypeDefaultId));
-  capabilities.header_extensions.push_back(
-        webrtc::RtpExtension(webrtc::RtpExtension::kVideoTimingUri,
-                             webrtc::RtpExtension::kVideoTimingDefaultId));
-  return capabilities;
-}
-
-namespace {
-// This function will assign dynamic payload types (in the range [96, 127]) to
-// the input codecs, and also add associated RTX codecs for recognized codecs
-// (VP8, VP9, H264, and RED). It will also add default feedback params to the
-// codecs.
-std::vector<VideoCodec> AssignPayloadTypesAndAddAssociatedRtxCodecs(
-    const std::vector<VideoCodec>& input_codecs) {
-  static const int kFirstDynamicPayloadType = 96;
-  static const int kLastDynamicPayloadType = 127;
-  int payload_type = kFirstDynamicPayloadType;
-  std::vector<VideoCodec> output_codecs;
-  for (VideoCodec codec : input_codecs) {
-    codec.id = payload_type;
-    if (codec.name != kRedCodecName && codec.name != kUlpfecCodecName &&
-        codec.name != kFlexfecCodecName) {
-      AddDefaultFeedbackParams(&codec);
-    }
-    output_codecs.push_back(codec);
-
-    // Increment payload type.
-    ++payload_type;
-    if (payload_type > kLastDynamicPayloadType)
-      break;
-
-    // Add associated RTX codec for recognized codecs.
-    // TODO(deadbeef): Should we add RTX codecs for external codecs whose names
-    // we don't recognize?
-    if (CodecNamesEq(codec.name, kVp8CodecName) ||
-        CodecNamesEq(codec.name, kVp9CodecName) ||
-        CodecNamesEq(codec.name, kH264CodecName) ||
-        CodecNamesEq(codec.name, kRedCodecName)) {
-      output_codecs.push_back(
-          VideoCodec::CreateRtxCodec(payload_type, codec.id));
-
-      // Increment payload type.
-      ++payload_type;
-      if (payload_type > kLastDynamicPayloadType)
-        break;
-    }
-  }
-  return output_codecs;
-}
-}  // namespace
-
-std::vector<VideoCodec> CricketEncoderFactoryAdapter::GetSupportedCodecs()
-    const {
-  std::vector<VideoCodec> codecs = InternalEncoderFactory().supported_codecs();
-  LOG(LS_INFO) << "Internally supported codecs: "
-               << CodecVectorToString(codecs);
-
-  // Add external codecs.
-  if (external_encoder_factory_ != nullptr) {
-    const std::vector<VideoCodec>& external_codecs =
-        external_encoder_factory_->supported_codecs();
-    for (const VideoCodec& codec : external_codecs) {
-      // Don't add same codec twice.
-      if (!FindMatchingCodec(codecs, codec))
-        codecs.push_back(codec);
-    }
-    LOG(LS_INFO) << "Codecs supported by the external encoder factory: "
-                 << CodecVectorToString(external_codecs);
-  }
-
-  return AssignPayloadTypesAndAddAssociatedRtxCodecs(codecs);
-}
-
-WebRtcVideoChannel::WebRtcVideoChannel(
-    webrtc::Call* call,
-    const MediaConfig& config,
-    const VideoOptions& options,
-    const EncoderFactoryAdapter* encoder_factory,
-    const DecoderFactoryAdapter* decoder_factory)
-    : VideoMediaChannel(config),
-      call_(call),
-      unsignalled_ssrc_handler_(&default_unsignalled_ssrc_handler_),
-      video_config_(config.video),
-      encoder_factory_(encoder_factory),
-      decoder_factory_(decoder_factory),
-      default_send_options_(options),
-      last_stats_log_ms_(-1) {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-
-  rtcp_receiver_report_ssrc_ = kDefaultRtcpReceiverReportSsrc;
-  sending_ = false;
-  recv_codecs_ = MapCodecs(encoder_factory_->GetSupportedCodecs());
-  recv_flexfec_payload_type_ = recv_codecs_.front().flexfec_payload_type;
-}
-
-WebRtcVideoChannel::~WebRtcVideoChannel() {
-  for (auto& kv : send_streams_)
-    delete kv.second;
-  for (auto& kv : receive_streams_)
-    delete kv.second;
-}
-
-rtc::Optional<WebRtcVideoChannel::VideoCodecSettings>
-WebRtcVideoChannel::SelectSendVideoCodec(
-    const std::vector<VideoCodecSettings>& remote_mapped_codecs) const {
-  const std::vector<VideoCodec> local_supported_codecs =
-      encoder_factory_->GetSupportedCodecs();
-  // Select the first remote codec that is supported locally.
-  for (const VideoCodecSettings& remote_mapped_codec : remote_mapped_codecs) {
-    // For H264, we will limit the encode level to the remote offered level
-    // regardless if level asymmetry is allowed or not. This is strictly not
-    // following the spec in https://tools.ietf.org/html/rfc6184#section-8.2.2
-    // since we should limit the encode level to the lower of local and remote
-    // level when level asymmetry is not allowed.
-    if (FindMatchingCodec(local_supported_codecs, remote_mapped_codec.codec))
-      return rtc::Optional<VideoCodecSettings>(remote_mapped_codec);
-  }
-  // No remote codec was supported.
-  return rtc::Optional<VideoCodecSettings>();
-}
-
-bool WebRtcVideoChannel::NonFlexfecReceiveCodecsHaveChanged(
-    std::vector<VideoCodecSettings> before,
-    std::vector<VideoCodecSettings> after) {
-  if (before.size() != after.size()) {
-    return true;
-  }
-
-  // The receive codec order doesn't matter, so we sort the codecs before
-  // comparing. This is necessary because currently the
-  // only way to change the send codec is to munge SDP, which causes
-  // the receive codec list to change order, which causes the streams
-  // to be recreates which causes a "blink" of black video.  In order
-  // to support munging the SDP in this way without recreating receive
-  // streams, we ignore the order of the received codecs so that
-  // changing the order doesn't cause this "blink".
-  auto comparison =
-      [](const VideoCodecSettings& codec1, const VideoCodecSettings& codec2) {
-        return codec1.codec.id > codec2.codec.id;
-      };
-  std::sort(before.begin(), before.end(), comparison);
-  std::sort(after.begin(), after.end(), comparison);
-
-  // Changes in FlexFEC payload type are handled separately in
-  // WebRtcVideoChannel::GetChangedRecvParameters, so disregard FlexFEC in the
-  // comparison here.
-  return !std::equal(before.begin(), before.end(), after.begin(),
-                     VideoCodecSettings::EqualsDisregardingFlexfec);
-}
-
-bool WebRtcVideoChannel::GetChangedSendParameters(
-    const VideoSendParameters& params,
-    ChangedSendParameters* changed_params) const {
-  if (!ValidateCodecFormats(params.codecs) ||
-      !ValidateRtpExtensions(params.extensions)) {
-    return false;
-  }
-
-  // Select one of the remote codecs that will be used as send codec.
-  rtc::Optional<VideoCodecSettings> selected_send_codec =
-      SelectSendVideoCodec(MapCodecs(params.codecs));
-
-  if (!selected_send_codec) {
-    LOG(LS_ERROR) << "No video codecs supported.";
-    return false;
-  }
-
-  // Never enable sending FlexFEC, unless we are in the experiment.
-  if (!IsFlexfecFieldTrialEnabled()) {
-    if (selected_send_codec->flexfec_payload_type != -1) {
-      LOG(LS_INFO) << "Remote supports flexfec-03, but we will not send since "
-                   << "WebRTC-FlexFEC-03 field trial is not enabled.";
-    }
-    selected_send_codec->flexfec_payload_type = -1;
-  }
-
-  if (!send_codec_ || *selected_send_codec != *send_codec_)
-    changed_params->codec = selected_send_codec;
-
-  // Handle RTP header extensions.
-  std::vector<webrtc::RtpExtension> filtered_extensions = FilterRtpExtensions(
-      params.extensions, webrtc::RtpExtension::IsSupportedForVideo, true);
-  if (!send_rtp_extensions_ || (*send_rtp_extensions_ != filtered_extensions)) {
-    changed_params->rtp_header_extensions =
-        rtc::Optional<std::vector<webrtc::RtpExtension>>(filtered_extensions);
-  }
-
-  // Handle max bitrate.
-  if (params.max_bandwidth_bps != send_params_.max_bandwidth_bps &&
-      params.max_bandwidth_bps >= -1) {
-    // 0 or -1 uncaps max bitrate.
-    // TODO(pbos): Reconsider how 0 should be treated. It is not mentioned as a
-    // special value and might very well be used for stopping sending.
-    changed_params->max_bandwidth_bps = rtc::Optional<int>(
-        params.max_bandwidth_bps == 0 ? -1 : params.max_bandwidth_bps);
-  }
-
-  // Handle conference mode.
-  if (params.conference_mode != send_params_.conference_mode) {
-    changed_params->conference_mode =
-        rtc::Optional<bool>(params.conference_mode);
-  }
-
-  // Handle RTCP mode.
-  if (params.rtcp.reduced_size != send_params_.rtcp.reduced_size) {
-    changed_params->rtcp_mode = rtc::Optional<webrtc::RtcpMode>(
-        params.rtcp.reduced_size ? webrtc::RtcpMode::kReducedSize
-                                 : webrtc::RtcpMode::kCompound);
-  }
-
-  return true;
-}
-
-rtc::DiffServCodePoint WebRtcVideoChannel::PreferredDscp() const {
-  return rtc::DSCP_AF41;
-}
-
-bool WebRtcVideoChannel::SetSendParameters(const VideoSendParameters& params) {
-  TRACE_EVENT0("webrtc", "WebRtcVideoChannel::SetSendParameters");
-  LOG(LS_INFO) << "SetSendParameters: " << params.ToString();
-  ChangedSendParameters changed_params;
-  if (!GetChangedSendParameters(params, &changed_params)) {
-    return false;
-  }
-
-  if (changed_params.codec) {
-    const VideoCodecSettings& codec_settings = *changed_params.codec;
-    send_codec_ = rtc::Optional<VideoCodecSettings>(codec_settings);
-    LOG(LS_INFO) << "Using codec: " << codec_settings.codec.ToString();
-  }
-
-  if (changed_params.rtp_header_extensions) {
-    send_rtp_extensions_ = changed_params.rtp_header_extensions;
-  }
-
-  if (changed_params.codec || changed_params.max_bandwidth_bps) {
-    if (params.max_bandwidth_bps == -1) {
-      // Unset the global max bitrate (max_bitrate_bps) if max_bandwidth_bps is
-      // -1, which corresponds to no "b=AS" attribute in SDP. Note that the
-      // global max bitrate may be set below in GetBitrateConfigForCodec, from
-      // the codec max bitrate.
-      // TODO(pbos): This should be reconsidered (codec max bitrate should
-      // probably not affect global call max bitrate).
-      bitrate_config_.max_bitrate_bps = -1;
-    }
-    if (send_codec_) {
-      // TODO(holmer): Changing the codec parameters shouldn't necessarily mean
-      // that we change the min/max of bandwidth estimation. Reevaluate this.
-      bitrate_config_ = GetBitrateConfigForCodec(send_codec_->codec);
-      if (!changed_params.codec) {
-        // If the codec isn't changing, set the start bitrate to -1 which means
-        // "unchanged" so that BWE isn't affected.
-        bitrate_config_.start_bitrate_bps = -1;
-      }
-    }
-    if (params.max_bandwidth_bps >= 0) {
-      // Note that max_bandwidth_bps intentionally takes priority over the
-      // bitrate config for the codec. This allows FEC to be applied above the
-      // codec target bitrate.
-      // TODO(pbos): Figure out whether b=AS means max bitrate for this
-      // WebRtcVideoChannel (in which case we're good), or per sender (SSRC),
-      // in which case this should not set a Call::BitrateConfig but rather
-      // reconfigure all senders.
-      bitrate_config_.max_bitrate_bps =
-          params.max_bandwidth_bps == 0 ? -1 : params.max_bandwidth_bps;
-    }
-    call_->SetBitrateConfig(bitrate_config_);
-  }
-
-  {
-    rtc::CritScope stream_lock(&stream_crit_);
-    for (auto& kv : send_streams_) {
-      kv.second->SetSendParameters(changed_params);
-    }
-    if (changed_params.codec || changed_params.rtcp_mode) {
-      // Update receive feedback parameters from new codec or RTCP mode.
-      LOG(LS_INFO)
-          << "SetFeedbackOptions on all the receive streams because the send "
-             "codec or RTCP mode has changed.";
-      for (auto& kv : receive_streams_) {
-        RTC_DCHECK(kv.second != nullptr);
-        kv.second->SetFeedbackParameters(
-            HasNack(send_codec_->codec), HasRemb(send_codec_->codec),
-            HasTransportCc(send_codec_->codec),
-            params.rtcp.reduced_size ? webrtc::RtcpMode::kReducedSize
-                                     : webrtc::RtcpMode::kCompound);
-      }
-    }
-  }
-  send_params_ = params;
-  return true;
-}
-
-webrtc::RtpParameters WebRtcVideoChannel::GetRtpSendParameters(
-    uint32_t ssrc) const {
-  rtc::CritScope stream_lock(&stream_crit_);
-  auto it = send_streams_.find(ssrc);
-  if (it == send_streams_.end()) {
-    LOG(LS_WARNING) << "Attempting to get RTP send parameters for stream "
-                    << "with ssrc " << ssrc << " which doesn't exist.";
-    return webrtc::RtpParameters();
-  }
-
-  webrtc::RtpParameters rtp_params = it->second->GetRtpParameters();
-  // Need to add the common list of codecs to the send stream-specific
-  // RTP parameters.
-  for (const VideoCodec& codec : send_params_.codecs) {
-    rtp_params.codecs.push_back(codec.ToCodecParameters());
-  }
-  return rtp_params;
-}
-
-bool WebRtcVideoChannel::SetRtpSendParameters(
-    uint32_t ssrc,
-    const webrtc::RtpParameters& parameters) {
-  TRACE_EVENT0("webrtc", "WebRtcVideoChannel::SetRtpSendParameters");
-  rtc::CritScope stream_lock(&stream_crit_);
-  auto it = send_streams_.find(ssrc);
-  if (it == send_streams_.end()) {
-    LOG(LS_ERROR) << "Attempting to set RTP send parameters for stream "
-                  << "with ssrc " << ssrc << " which doesn't exist.";
-    return false;
-  }
-
-  // TODO(deadbeef): Handle setting parameters with a list of codecs in a
-  // different order (which should change the send codec).
-  webrtc::RtpParameters current_parameters = GetRtpSendParameters(ssrc);
-  if (current_parameters.codecs != parameters.codecs) {
-    LOG(LS_ERROR) << "Using SetParameters to change the set of codecs "
-                  << "is not currently supported.";
-    return false;
-  }
-
-  return it->second->SetRtpParameters(parameters);
-}
-
-webrtc::RtpParameters WebRtcVideoChannel::GetRtpReceiveParameters(
-    uint32_t ssrc) const {
-  webrtc::RtpParameters rtp_params;
-  rtc::CritScope stream_lock(&stream_crit_);
-  // SSRC of 0 represents an unsignaled receive stream.
-  if (ssrc == 0) {
-    if (!default_unsignalled_ssrc_handler_.GetDefaultSink()) {
-      LOG(LS_WARNING) << "Attempting to get RTP parameters for the default, "
-                         "unsignaled video receive stream, but not yet "
-                         "configured to receive such a stream.";
-      return rtp_params;
-    }
-    rtp_params.encodings.emplace_back();
-  } else {
-    auto it = receive_streams_.find(ssrc);
-    if (it == receive_streams_.end()) {
-      LOG(LS_WARNING) << "Attempting to get RTP receive parameters for stream "
-                      << "with SSRC " << ssrc << " which doesn't exist.";
-      return webrtc::RtpParameters();
-    }
-    // TODO(deadbeef): Return stream-specific parameters, beyond just SSRC.
-    rtp_params.encodings.emplace_back();
-    rtp_params.encodings[0].ssrc = it->second->GetFirstPrimarySsrc();
-  }
-
-  // Add codecs, which any stream is prepared to receive.
-  for (const VideoCodec& codec : recv_params_.codecs) {
-    rtp_params.codecs.push_back(codec.ToCodecParameters());
-  }
-  return rtp_params;
-}
-
-bool WebRtcVideoChannel::SetRtpReceiveParameters(
-    uint32_t ssrc,
-    const webrtc::RtpParameters& parameters) {
-  TRACE_EVENT0("webrtc", "WebRtcVideoChannel::SetRtpReceiveParameters");
-  rtc::CritScope stream_lock(&stream_crit_);
-
-  // SSRC of 0 represents an unsignaled receive stream.
-  if (ssrc == 0) {
-    if (!default_unsignalled_ssrc_handler_.GetDefaultSink()) {
-      LOG(LS_WARNING) << "Attempting to set RTP parameters for the default, "
-                         "unsignaled video receive stream, but not yet "
-                         "configured to receive such a stream.";
-      return false;
-    }
-  } else {
-    auto it = receive_streams_.find(ssrc);
-    if (it == receive_streams_.end()) {
-      LOG(LS_WARNING) << "Attempting to set RTP receive parameters for stream "
-                      << "with SSRC " << ssrc << " which doesn't exist.";
-      return false;
-    }
-  }
-
-  webrtc::RtpParameters current_parameters = GetRtpReceiveParameters(ssrc);
-  if (current_parameters != parameters) {
-    LOG(LS_ERROR) << "Changing the RTP receive parameters is currently "
-                  << "unsupported.";
-    return false;
-  }
-  return true;
-}
-
-bool WebRtcVideoChannel::GetChangedRecvParameters(
-    const VideoRecvParameters& params,
-    ChangedRecvParameters* changed_params) const {
-  if (!ValidateCodecFormats(params.codecs) ||
-      !ValidateRtpExtensions(params.extensions)) {
-    return false;
-  }
-
-  // Handle receive codecs.
-  const std::vector<VideoCodecSettings> mapped_codecs =
-      MapCodecs(params.codecs);
-  if (mapped_codecs.empty()) {
-    LOG(LS_ERROR) << "SetRecvParameters called without any video codecs.";
-    return false;
-  }
-
-  // Verify that every mapped codec is supported locally.
-  const std::vector<VideoCodec> local_supported_codecs =
-      encoder_factory_->GetSupportedCodecs();
-  for (const VideoCodecSettings& mapped_codec : mapped_codecs) {
-    if (!FindMatchingCodec(local_supported_codecs, mapped_codec.codec)) {
-      LOG(LS_ERROR) << "SetRecvParameters called with unsupported video codec: "
-                    << mapped_codec.codec.ToString();
-      return false;
-    }
-  }
-
-  if (NonFlexfecReceiveCodecsHaveChanged(recv_codecs_, mapped_codecs)) {
-    changed_params->codec_settings =
-        rtc::Optional<std::vector<VideoCodecSettings>>(mapped_codecs);
-  }
-
-  // Handle RTP header extensions.
-  std::vector<webrtc::RtpExtension> filtered_extensions = FilterRtpExtensions(
-      params.extensions, webrtc::RtpExtension::IsSupportedForVideo, false);
-  if (filtered_extensions != recv_rtp_extensions_) {
-    changed_params->rtp_header_extensions =
-        rtc::Optional<std::vector<webrtc::RtpExtension>>(filtered_extensions);
-  }
-
-  int flexfec_payload_type = mapped_codecs.front().flexfec_payload_type;
-  if (flexfec_payload_type != recv_flexfec_payload_type_) {
-    changed_params->flexfec_payload_type =
-        rtc::Optional<int>(flexfec_payload_type);
-  }
-
-  return true;
-}
-
-bool WebRtcVideoChannel::SetRecvParameters(const VideoRecvParameters& params) {
-  TRACE_EVENT0("webrtc", "WebRtcVideoChannel::SetRecvParameters");
-  LOG(LS_INFO) << "SetRecvParameters: " << params.ToString();
-  ChangedRecvParameters changed_params;
-  if (!GetChangedRecvParameters(params, &changed_params)) {
-    return false;
-  }
-  if (changed_params.flexfec_payload_type) {
-    LOG(LS_INFO) << "Changing FlexFEC payload type (recv) from "
-                 << recv_flexfec_payload_type_ << " to "
-                 << *changed_params.flexfec_payload_type;
-    recv_flexfec_payload_type_ = *changed_params.flexfec_payload_type;
-  }
-  if (changed_params.rtp_header_extensions) {
-    recv_rtp_extensions_ = *changed_params.rtp_header_extensions;
-  }
-  if (changed_params.codec_settings) {
-    LOG(LS_INFO) << "Changing recv codecs from "
-                 << CodecSettingsVectorToString(recv_codecs_) << " to "
-                 << CodecSettingsVectorToString(*changed_params.codec_settings);
-    recv_codecs_ = *changed_params.codec_settings;
-  }
-
-  {
-    rtc::CritScope stream_lock(&stream_crit_);
-    for (auto& kv : receive_streams_) {
-      kv.second->SetRecvParameters(changed_params);
-    }
-  }
-  recv_params_ = params;
-  return true;
-}
-
-std::string WebRtcVideoChannel::CodecSettingsVectorToString(
-    const std::vector<VideoCodecSettings>& codecs) {
-  std::stringstream out;
-  out << '{';
-  for (size_t i = 0; i < codecs.size(); ++i) {
-    out << codecs[i].codec.ToString();
-    if (i != codecs.size() - 1) {
-      out << ", ";
-    }
-  }
-  out << '}';
-  return out.str();
-}
-
-bool WebRtcVideoChannel::GetSendCodec(VideoCodec* codec) {
-  if (!send_codec_) {
-    LOG(LS_VERBOSE) << "GetSendCodec: No send codec set.";
-    return false;
-  }
-  *codec = send_codec_->codec;
-  return true;
-}
-
-bool WebRtcVideoChannel::SetSend(bool send) {
-  TRACE_EVENT0("webrtc", "WebRtcVideoChannel::SetSend");
-  LOG(LS_VERBOSE) << "SetSend: " << (send ? "true" : "false");
-  if (send && !send_codec_) {
-    LOG(LS_ERROR) << "SetSend(true) called before setting codec.";
-    return false;
-  }
-  {
-    rtc::CritScope stream_lock(&stream_crit_);
-    for (const auto& kv : send_streams_) {
-      kv.second->SetSend(send);
-    }
-  }
-  sending_ = send;
-  return true;
-}
-
-// TODO(nisse): The enable argument was used for mute logic which has
-// been moved to VideoBroadcaster. So remove the argument from this
-// method.
-bool WebRtcVideoChannel::SetVideoSend(
-    uint32_t ssrc,
-    bool enable,
-    const VideoOptions* options,
-    rtc::VideoSourceInterface<webrtc::VideoFrame>* source) {
-  TRACE_EVENT0("webrtc", "SetVideoSend");
-  RTC_DCHECK(ssrc != 0);
-  LOG(LS_INFO) << "SetVideoSend (ssrc= " << ssrc << ", enable = " << enable
-               << ", options: " << (options ? options->ToString() : "nullptr")
-               << ", source = " << (source ? "(source)" : "nullptr") << ")";
-
-  rtc::CritScope stream_lock(&stream_crit_);
-  const auto& kv = send_streams_.find(ssrc);
-  if (kv == send_streams_.end()) {
-    // Allow unknown ssrc only if source is null.
-    RTC_CHECK(source == nullptr);
-    LOG(LS_ERROR) << "No sending stream on ssrc " << ssrc;
-    return false;
-  }
-
-  return kv->second->SetVideoSend(enable, options, source);
-}
-
-bool WebRtcVideoChannel::ValidateSendSsrcAvailability(
-    const StreamParams& sp) const {
-  for (uint32_t ssrc : sp.ssrcs) {
-    if (send_ssrcs_.find(ssrc) != send_ssrcs_.end()) {
-      LOG(LS_ERROR) << "Send stream with SSRC '" << ssrc << "' already exists.";
-      return false;
-    }
-  }
-  return true;
-}
-
-bool WebRtcVideoChannel::ValidateReceiveSsrcAvailability(
-    const StreamParams& sp) const {
-  for (uint32_t ssrc : sp.ssrcs) {
-    if (receive_ssrcs_.find(ssrc) != receive_ssrcs_.end()) {
-      LOG(LS_ERROR) << "Receive stream with SSRC '" << ssrc
-                    << "' already exists.";
-      return false;
-    }
-  }
-  return true;
-}
-
-bool WebRtcVideoChannel::AddSendStream(const StreamParams& sp) {
-  LOG(LS_INFO) << "AddSendStream: " << sp.ToString();
-  if (!ValidateStreamParams(sp))
-    return false;
-
-  rtc::CritScope stream_lock(&stream_crit_);
-
-  if (!ValidateSendSsrcAvailability(sp))
-    return false;
-
-  for (uint32_t used_ssrc : sp.ssrcs)
-    send_ssrcs_.insert(used_ssrc);
-
-  webrtc::VideoSendStream::Config config(this);
-  config.suspend_below_min_bitrate = video_config_.suspend_below_min_bitrate;
-  config.periodic_alr_bandwidth_probing =
-      video_config_.periodic_alr_bandwidth_probing;
-  WebRtcVideoSendStream* stream = new WebRtcVideoSendStream(
-      call_, sp, std::move(config), default_send_options_, encoder_factory_,
-      video_config_.enable_cpu_overuse_detection,
-      bitrate_config_.max_bitrate_bps, send_codec_, send_rtp_extensions_,
-      send_params_);
-
-  uint32_t ssrc = sp.first_ssrc();
-  RTC_DCHECK(ssrc != 0);
-  send_streams_[ssrc] = stream;
-
-  if (rtcp_receiver_report_ssrc_ == kDefaultRtcpReceiverReportSsrc) {
-    rtcp_receiver_report_ssrc_ = ssrc;
-    LOG(LS_INFO) << "SetLocalSsrc on all the receive streams because we added "
-                    "a send stream.";
-    for (auto& kv : receive_streams_)
-      kv.second->SetLocalSsrc(ssrc);
-  }
-  if (sending_) {
-    stream->SetSend(true);
-  }
-
-  return true;
-}
-
-bool WebRtcVideoChannel::RemoveSendStream(uint32_t ssrc) {
-  LOG(LS_INFO) << "RemoveSendStream: " << ssrc;
-
-  WebRtcVideoSendStream* removed_stream;
-  {
-    rtc::CritScope stream_lock(&stream_crit_);
-    std::map<uint32_t, WebRtcVideoSendStream*>::iterator it =
-        send_streams_.find(ssrc);
-    if (it == send_streams_.end()) {
-      return false;
-    }
-
-    for (uint32_t old_ssrc : it->second->GetSsrcs())
-      send_ssrcs_.erase(old_ssrc);
-
-    removed_stream = it->second;
-    send_streams_.erase(it);
-
-    // Switch receiver report SSRCs, the one in use is no longer valid.
-    if (rtcp_receiver_report_ssrc_ == ssrc) {
-      rtcp_receiver_report_ssrc_ = send_streams_.empty()
-                                       ? kDefaultRtcpReceiverReportSsrc
-                                       : send_streams_.begin()->first;
-      LOG(LS_INFO) << "SetLocalSsrc on all the receive streams because the "
-                      "previous local SSRC was removed.";
-
-      for (auto& kv : receive_streams_) {
-        kv.second->SetLocalSsrc(rtcp_receiver_report_ssrc_);
-      }
-    }
-  }
-
-  delete removed_stream;
-
-  return true;
-}
-
-void WebRtcVideoChannel::DeleteReceiveStream(
-    WebRtcVideoChannel::WebRtcVideoReceiveStream* stream) {
-  for (uint32_t old_ssrc : stream->GetSsrcs())
-    receive_ssrcs_.erase(old_ssrc);
-  delete stream;
-}
-
-bool WebRtcVideoChannel::AddRecvStream(const StreamParams& sp) {
-  return AddRecvStream(sp, false);
-}
-
-bool WebRtcVideoChannel::AddRecvStream(const StreamParams& sp,
-                                       bool default_stream) {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-
-  LOG(LS_INFO) << "AddRecvStream" << (default_stream ? " (default stream)" : "")
-               << ": " << sp.ToString();
-  if (!ValidateStreamParams(sp))
-    return false;
-
-  uint32_t ssrc = sp.first_ssrc();
-  RTC_DCHECK(ssrc != 0);  // TODO(pbos): Is this ever valid?
-
-  rtc::CritScope stream_lock(&stream_crit_);
-  // Remove running stream if this was a default stream.
-  const auto& prev_stream = receive_streams_.find(ssrc);
-  if (prev_stream != receive_streams_.end()) {
-    if (default_stream || !prev_stream->second->IsDefaultStream()) {
-      LOG(LS_ERROR) << "Receive stream for SSRC '" << ssrc
-                    << "' already exists.";
-      return false;
-    }
-    DeleteReceiveStream(prev_stream->second);
-    receive_streams_.erase(prev_stream);
-  }
-
-  if (!ValidateReceiveSsrcAvailability(sp))
-    return false;
-
-  for (uint32_t used_ssrc : sp.ssrcs)
-    receive_ssrcs_.insert(used_ssrc);
-
-  webrtc::VideoReceiveStream::Config config(this);
-  webrtc::FlexfecReceiveStream::Config flexfec_config(this);
-  ConfigureReceiverRtp(&config, &flexfec_config, sp);
-
-  config.disable_prerenderer_smoothing =
-      video_config_.disable_prerenderer_smoothing;
-  config.sync_group = sp.sync_label;
-
-  receive_streams_[ssrc] = new WebRtcVideoReceiveStream(
-      call_, sp, std::move(config), decoder_factory_, default_stream,
-      recv_codecs_, flexfec_config);
-
-  return true;
-}
-
-void WebRtcVideoChannel::ConfigureReceiverRtp(
-    webrtc::VideoReceiveStream::Config* config,
-    webrtc::FlexfecReceiveStream::Config* flexfec_config,
-    const StreamParams& sp) const {
-  uint32_t ssrc = sp.first_ssrc();
-
-  config->rtp.remote_ssrc = ssrc;
-  config->rtp.local_ssrc = rtcp_receiver_report_ssrc_;
-
-  // TODO(pbos): This protection is against setting the same local ssrc as
-  // remote which is not permitted by the lower-level API. RTCP requires a
-  // corresponding sender SSRC. Figure out what to do when we don't have
-  // (receive-only) or know a good local SSRC.
-  if (config->rtp.remote_ssrc == config->rtp.local_ssrc) {
-    if (config->rtp.local_ssrc != kDefaultRtcpReceiverReportSsrc) {
-      config->rtp.local_ssrc = kDefaultRtcpReceiverReportSsrc;
-    } else {
-      config->rtp.local_ssrc = kDefaultRtcpReceiverReportSsrc + 1;
-    }
-  }
-
-  // Whether or not the receive stream sends reduced size RTCP is determined
-  // by the send params.
-  // TODO(deadbeef): Once we change "send_params" to "sender_params" and
-  // "recv_params" to "receiver_params", we should get this out of
-  // receiver_params_.
-  config->rtp.rtcp_mode = send_params_.rtcp.reduced_size
-                              ? webrtc::RtcpMode::kReducedSize
-                              : webrtc::RtcpMode::kCompound;
-
-  config->rtp.remb = send_codec_ ? HasRemb(send_codec_->codec) : false;
-  config->rtp.transport_cc =
-      send_codec_ ? HasTransportCc(send_codec_->codec) : false;
-
-  sp.GetFidSsrc(ssrc, &config->rtp.rtx_ssrc);
-
-  config->rtp.extensions = recv_rtp_extensions_;
-
-  // TODO(brandtr): Generalize when we add support for multistream protection.
-  flexfec_config->payload_type = recv_flexfec_payload_type_;
-  if (IsFlexfecAdvertisedFieldTrialEnabled() &&
-      sp.GetFecFrSsrc(ssrc, &flexfec_config->remote_ssrc)) {
-    flexfec_config->protected_media_ssrcs = {ssrc};
-    flexfec_config->local_ssrc = config->rtp.local_ssrc;
-    flexfec_config->rtcp_mode = config->rtp.rtcp_mode;
-    // TODO(brandtr): We should be spec-compliant and set |transport_cc| here
-    // based on the rtcp-fb for the FlexFEC codec, not the media codec.
-    flexfec_config->transport_cc = config->rtp.transport_cc;
-    flexfec_config->rtp_header_extensions = config->rtp.extensions;
-  }
-}
-
-bool WebRtcVideoChannel::RemoveRecvStream(uint32_t ssrc) {
-  LOG(LS_INFO) << "RemoveRecvStream: " << ssrc;
-  if (ssrc == 0) {
-    LOG(LS_ERROR) << "RemoveRecvStream with 0 ssrc is not supported.";
-    return false;
-  }
-
-  rtc::CritScope stream_lock(&stream_crit_);
-  std::map<uint32_t, WebRtcVideoReceiveStream*>::iterator stream =
-      receive_streams_.find(ssrc);
-  if (stream == receive_streams_.end()) {
-    LOG(LS_ERROR) << "Stream not found for ssrc: " << ssrc;
-    return false;
-  }
-  DeleteReceiveStream(stream->second);
-  receive_streams_.erase(stream);
-
-  return true;
-}
-
-bool WebRtcVideoChannel::SetSink(
-    uint32_t ssrc,
-    rtc::VideoSinkInterface<webrtc::VideoFrame>* sink) {
-  LOG(LS_INFO) << "SetSink: ssrc:" << ssrc << " "
-               << (sink ? "(ptr)" : "nullptr");
-  if (ssrc == 0) {
-    // Do not hold |stream_crit_| here, since SetDefaultSink will call
-    // WebRtcVideoChannel::GetDefaultReceiveStreamSsrc().
-    default_unsignalled_ssrc_handler_.SetDefaultSink(this, sink);
-    return true;
-  }
-
-  rtc::CritScope stream_lock(&stream_crit_);
-  std::map<uint32_t, WebRtcVideoReceiveStream*>::iterator it =
-      receive_streams_.find(ssrc);
-  if (it == receive_streams_.end()) {
-    return false;
-  }
-
-  it->second->SetSink(sink);
-  return true;
-}
-
-bool WebRtcVideoChannel::GetStats(VideoMediaInfo* info) {
-  TRACE_EVENT0("webrtc", "WebRtcVideoChannel::GetStats");
-
-  // Log stats periodically.
-  bool log_stats = false;
-  int64_t now_ms = rtc::TimeMillis();
-  if (last_stats_log_ms_ == -1 ||
-      now_ms - last_stats_log_ms_ > kStatsLogIntervalMs) {
-    last_stats_log_ms_ = now_ms;
-    log_stats = true;
-  }
-
-  info->Clear();
-  FillSenderStats(info, log_stats);
-  FillReceiverStats(info, log_stats);
-  FillSendAndReceiveCodecStats(info);
-  // TODO(holmer): We should either have rtt available as a metric on
-  // VideoSend/ReceiveStreams, or we should remove rtt from VideoSenderInfo.
-  webrtc::Call::Stats stats = call_->GetStats();
-  if (stats.rtt_ms != -1) {
-    for (size_t i = 0; i < info->senders.size(); ++i) {
-      info->senders[i].rtt_ms = stats.rtt_ms;
-    }
-  }
-
-  if (log_stats)
-    LOG(LS_INFO) << stats.ToString(now_ms);
-
-  return true;
-}
-
-void WebRtcVideoChannel::FillSenderStats(VideoMediaInfo* video_media_info,
-                                          bool log_stats) {
-  rtc::CritScope stream_lock(&stream_crit_);
-  for (std::map<uint32_t, WebRtcVideoSendStream*>::iterator it =
-           send_streams_.begin();
-       it != send_streams_.end(); ++it) {
-    video_media_info->senders.push_back(
-        it->second->GetVideoSenderInfo(log_stats));
-  }
-}
-
-void WebRtcVideoChannel::FillReceiverStats(VideoMediaInfo* video_media_info,
-                                            bool log_stats) {
-  rtc::CritScope stream_lock(&stream_crit_);
-  for (std::map<uint32_t, WebRtcVideoReceiveStream*>::iterator it =
-           receive_streams_.begin();
-       it != receive_streams_.end(); ++it) {
-    video_media_info->receivers.push_back(
-        it->second->GetVideoReceiverInfo(log_stats));
-  }
-}
-
-void WebRtcVideoChannel::FillBitrateInfo(BandwidthEstimationInfo* bwe_info) {
-  rtc::CritScope stream_lock(&stream_crit_);
-  for (std::map<uint32_t, WebRtcVideoSendStream*>::iterator stream =
-           send_streams_.begin();
-       stream != send_streams_.end(); ++stream) {
-    stream->second->FillBitrateInfo(bwe_info);
-  }
-}
-
-void WebRtcVideoChannel::FillSendAndReceiveCodecStats(
-    VideoMediaInfo* video_media_info) {
-  for (const VideoCodec& codec : send_params_.codecs) {
-    webrtc::RtpCodecParameters codec_params = codec.ToCodecParameters();
-    video_media_info->send_codecs.insert(
-        std::make_pair(codec_params.payload_type, std::move(codec_params)));
-  }
-  for (const VideoCodec& codec : recv_params_.codecs) {
-    webrtc::RtpCodecParameters codec_params = codec.ToCodecParameters();
-    video_media_info->receive_codecs.insert(
-        std::make_pair(codec_params.payload_type, std::move(codec_params)));
-  }
-}
-
-void WebRtcVideoChannel::OnPacketReceived(
-    rtc::CopyOnWriteBuffer* packet,
-    const rtc::PacketTime& packet_time) {
-  const webrtc::PacketTime webrtc_packet_time(packet_time.timestamp,
-                                              packet_time.not_before);
-  const webrtc::PacketReceiver::DeliveryStatus delivery_result =
-      call_->Receiver()->DeliverPacket(
-          webrtc::MediaType::VIDEO,
-          packet->cdata(), packet->size(),
-          webrtc_packet_time);
-  switch (delivery_result) {
-    case webrtc::PacketReceiver::DELIVERY_OK:
-      return;
-    case webrtc::PacketReceiver::DELIVERY_PACKET_ERROR:
-      return;
-    case webrtc::PacketReceiver::DELIVERY_UNKNOWN_SSRC:
-      break;
-  }
-
-  uint32_t ssrc = 0;
-  if (!GetRtpSsrc(packet->cdata(), packet->size(), &ssrc)) {
-    return;
-  }
-
-  int payload_type = 0;
-  if (!GetRtpPayloadType(packet->cdata(), packet->size(), &payload_type)) {
-    return;
-  }
-
-  // See if this payload_type is registered as one that usually gets its own
-  // SSRC (RTX) or at least is safe to drop either way (FEC). If it is, and
-  // it wasn't handled above by DeliverPacket, that means we don't know what
-  // stream it associates with, and we shouldn't ever create an implicit channel
-  // for these.
-  for (auto& codec : recv_codecs_) {
-    if (payload_type == codec.rtx_payload_type ||
-        payload_type == codec.ulpfec.red_rtx_payload_type ||
-        payload_type == codec.ulpfec.ulpfec_payload_type) {
-      return;
-    }
-  }
-  if (payload_type == recv_flexfec_payload_type_) {
-    return;
-  }
-
-  switch (unsignalled_ssrc_handler_->OnUnsignalledSsrc(this, ssrc)) {
-    case UnsignalledSsrcHandler::kDropPacket:
-      return;
-    case UnsignalledSsrcHandler::kDeliverPacket:
-      break;
-  }
-
-  if (call_->Receiver()->DeliverPacket(
-          webrtc::MediaType::VIDEO,
-          packet->cdata(), packet->size(),
-          webrtc_packet_time) != webrtc::PacketReceiver::DELIVERY_OK) {
-    LOG(LS_WARNING) << "Failed to deliver RTP packet on re-delivery.";
-    return;
-  }
-}
-
-void WebRtcVideoChannel::OnRtcpReceived(
-    rtc::CopyOnWriteBuffer* packet,
-    const rtc::PacketTime& packet_time) {
-  const webrtc::PacketTime webrtc_packet_time(packet_time.timestamp,
-                                              packet_time.not_before);
-  // TODO(pbos): Check webrtc::PacketReceiver::DELIVERY_OK once we deliver
-  // for both audio and video on the same path. Since BundleFilter doesn't
-  // filter RTCP anymore incoming RTCP packets could've been going to audio (so
-  // logging failures spam the log).
-  call_->Receiver()->DeliverPacket(
-      webrtc::MediaType::VIDEO,
-      packet->cdata(), packet->size(),
-      webrtc_packet_time);
-}
-
-void WebRtcVideoChannel::OnReadyToSend(bool ready) {
-  LOG(LS_VERBOSE) << "OnReadyToSend: " << (ready ? "Ready." : "Not ready.");
-  call_->SignalChannelNetworkState(
-      webrtc::MediaType::VIDEO,
-      ready ? webrtc::kNetworkUp : webrtc::kNetworkDown);
-}
-
-void WebRtcVideoChannel::OnNetworkRouteChanged(
-    const std::string& transport_name,
-    const rtc::NetworkRoute& network_route) {
-  call_->OnNetworkRouteChanged(transport_name, network_route);
-}
-
-void WebRtcVideoChannel::OnTransportOverheadChanged(
-    int transport_overhead_per_packet) {
-  call_->OnTransportOverheadChanged(webrtc::MediaType::VIDEO,
-                                    transport_overhead_per_packet);
-}
-
-void WebRtcVideoChannel::SetInterface(NetworkInterface* iface) {
-  MediaChannel::SetInterface(iface);
-  // Set the RTP recv/send buffer to a bigger size
-  MediaChannel::SetOption(NetworkInterface::ST_RTP,
-                          rtc::Socket::OPT_RCVBUF,
-                          kVideoRtpBufferSize);
-
-  // Speculative change to increase the outbound socket buffer size.
-  // In b/15152257, we are seeing a significant number of packets discarded
-  // due to lack of socket buffer space, although it's not yet clear what the
-  // ideal value should be.
-  MediaChannel::SetOption(NetworkInterface::ST_RTP,
-                          rtc::Socket::OPT_SNDBUF,
-                          kVideoRtpBufferSize);
-}
-
-rtc::Optional<uint32_t> WebRtcVideoChannel::GetDefaultReceiveStreamSsrc() {
-  rtc::CritScope stream_lock(&stream_crit_);
-  rtc::Optional<uint32_t> ssrc;
-  for (auto it = receive_streams_.begin(); it != receive_streams_.end(); ++it) {
-    if (it->second->IsDefaultStream()) {
-      ssrc.emplace(it->first);
-      break;
-    }
-  }
-  return ssrc;
-}
-
-bool WebRtcVideoChannel::SendRtp(const uint8_t* data,
-                                 size_t len,
-                                 const webrtc::PacketOptions& options) {
-  rtc::CopyOnWriteBuffer packet(data, len, kMaxRtpPacketLen);
-  rtc::PacketOptions rtc_options;
-  rtc_options.packet_id = options.packet_id;
-  return MediaChannel::SendPacket(&packet, rtc_options);
-}
-
-bool WebRtcVideoChannel::SendRtcp(const uint8_t* data, size_t len) {
-  rtc::CopyOnWriteBuffer packet(data, len, kMaxRtpPacketLen);
-  return MediaChannel::SendRtcp(&packet, rtc::PacketOptions());
-}
-
-WebRtcVideoChannel::WebRtcVideoSendStream::VideoSendStreamParameters::
-    VideoSendStreamParameters(
-        webrtc::VideoSendStream::Config config,
-        const VideoOptions& options,
-        int max_bitrate_bps,
-        const rtc::Optional<VideoCodecSettings>& codec_settings)
-    : config(std::move(config)),
-      options(options),
-      max_bitrate_bps(max_bitrate_bps),
-      conference_mode(false),
-      codec_settings(codec_settings) {}
-
-EncoderFactoryAdapter::AllocatedEncoder::AllocatedEncoder(
-    std::unique_ptr<webrtc::VideoEncoder> encoder,
-    bool is_hardware_accelerated,
-    bool has_internal_source)
-    : encoder(std::move(encoder)),
-      is_hardware_accelerated(is_hardware_accelerated),
-      has_internal_source(has_internal_source) {}
-
-WebRtcVideoChannel::WebRtcVideoSendStream::WebRtcVideoSendStream(
-    webrtc::Call* call,
-    const StreamParams& sp,
-    webrtc::VideoSendStream::Config config,
-    const VideoOptions& options,
-    const EncoderFactoryAdapter* encoder_factory,
-    bool enable_cpu_overuse_detection,
-    int max_bitrate_bps,
-    const rtc::Optional<VideoCodecSettings>& codec_settings,
-    const rtc::Optional<std::vector<webrtc::RtpExtension>>& rtp_extensions,
-    // TODO(deadbeef): Don't duplicate information between send_params,
-    // rtp_extensions, options, etc.
-    const VideoSendParameters& send_params)
-    : worker_thread_(rtc::Thread::Current()),
-      ssrcs_(sp.ssrcs),
-      ssrc_groups_(sp.ssrc_groups),
-      call_(call),
-      enable_cpu_overuse_detection_(enable_cpu_overuse_detection),
-      source_(nullptr),
-      encoder_factory_(encoder_factory),
-      stream_(nullptr),
-      encoder_sink_(nullptr),
-      parameters_(std::move(config), options, max_bitrate_bps, codec_settings),
-      rtp_parameters_(CreateRtpParametersWithOneEncoding()),
-      sending_(false) {
-  parameters_.config.rtp.max_packet_size = kVideoMtu;
-  parameters_.conference_mode = send_params.conference_mode;
-
-  sp.GetPrimarySsrcs(&parameters_.config.rtp.ssrcs);
-
-  // ValidateStreamParams should prevent this from happening.
-  RTC_CHECK(!parameters_.config.rtp.ssrcs.empty());
-  rtp_parameters_.encodings[0].ssrc =
-      rtc::Optional<uint32_t>(parameters_.config.rtp.ssrcs[0]);
-
-  // RTX.
-  sp.GetFidSsrcs(parameters_.config.rtp.ssrcs,
-                 &parameters_.config.rtp.rtx.ssrcs);
-
-  // FlexFEC SSRCs.
-  // TODO(brandtr): This code needs to be generalized when we add support for
-  // multistream protection.
-  if (IsFlexfecFieldTrialEnabled()) {
-    uint32_t flexfec_ssrc;
-    bool flexfec_enabled = false;
-    for (uint32_t primary_ssrc : parameters_.config.rtp.ssrcs) {
-      if (sp.GetFecFrSsrc(primary_ssrc, &flexfec_ssrc)) {
-        if (flexfec_enabled) {
-          LOG(LS_INFO) << "Multiple FlexFEC streams in local SDP, but "
-                          "our implementation only supports a single FlexFEC "
-                          "stream. Will not enable FlexFEC for proposed "
-                          "stream with SSRC: "
-                       << flexfec_ssrc << ".";
-          continue;
-        }
-
-        flexfec_enabled = true;
-        parameters_.config.rtp.flexfec.ssrc = flexfec_ssrc;
-        parameters_.config.rtp.flexfec.protected_media_ssrcs = {primary_ssrc};
-      }
-    }
-  }
-
-  parameters_.config.rtp.c_name = sp.cname;
-  if (rtp_extensions) {
-    parameters_.config.rtp.extensions = *rtp_extensions;
-  }
-  parameters_.config.rtp.rtcp_mode = send_params.rtcp.reduced_size
-                                         ? webrtc::RtcpMode::kReducedSize
-                                         : webrtc::RtcpMode::kCompound;
-  if (codec_settings) {
-    bool force_encoder_allocation = false;
-    SetCodec(*codec_settings, force_encoder_allocation);
-  }
-}
-
-WebRtcVideoChannel::WebRtcVideoSendStream::~WebRtcVideoSendStream() {
-  if (stream_ != NULL) {
-    call_->DestroyVideoSendStream(stream_);
-  }
-  // Release |allocated_encoder_|.
-  allocated_encoder_.reset();
-}
-
-bool WebRtcVideoChannel::WebRtcVideoSendStream::SetVideoSend(
-    bool enable,
-    const VideoOptions* options,
-    rtc::VideoSourceInterface<webrtc::VideoFrame>* source) {
-  TRACE_EVENT0("webrtc", "WebRtcVideoSendStream::SetVideoSend");
-  RTC_DCHECK_RUN_ON(&thread_checker_);
-
-  // Ignore |options| pointer if |enable| is false.
-  bool options_present = enable && options;
-
-  if (options_present) {
-    VideoOptions old_options = parameters_.options;
-    parameters_.options.SetAll(*options);
-    if (parameters_.options.is_screencast.value_or(false) !=
-            old_options.is_screencast.value_or(false) &&
-        parameters_.codec_settings) {
-      // If screen content settings change, we may need to recreate the codec
-      // instance so that the correct type is used.
-
-      bool force_encoder_allocation = true;
-      SetCodec(*parameters_.codec_settings, force_encoder_allocation);
-      // Mark screenshare parameter as being updated, then test for any other
-      // changes that may require codec reconfiguration.
-      old_options.is_screencast = options->is_screencast;
-    }
-    if (parameters_.options != old_options) {
-      ReconfigureEncoder();
-    }
-  }
-
-  if (source_ && stream_) {
-    stream_->SetSource(nullptr, DegradationPreference::kDegradationDisabled);
-  }
-  // Switch to the new source.
-  source_ = source;
-  if (source && stream_) {
-    stream_->SetSource(this, GetDegradationPreference());
-  }
-  return true;
-}
-
-webrtc::VideoSendStream::DegradationPreference
-WebRtcVideoChannel::WebRtcVideoSendStream::GetDegradationPreference() const {
-  // Do not adapt resolution for screen content as this will likely
-  // result in blurry and unreadable text.
-  // |this| acts like a VideoSource to make sure SinkWants are handled on the
-  // correct thread.
-  DegradationPreference degradation_preference;
-  if (!enable_cpu_overuse_detection_) {
-    degradation_preference = DegradationPreference::kDegradationDisabled;
-  } else {
-    if (parameters_.options.is_screencast.value_or(false)) {
-      degradation_preference = DegradationPreference::kMaintainResolution;
-    } else if (webrtc::field_trial::IsEnabled(
-                   "WebRTC-Video-BalancedDegradation")) {
-      degradation_preference = DegradationPreference::kBalanced;
-    } else {
-      degradation_preference = DegradationPreference::kMaintainFramerate;
-    }
-  }
-  return degradation_preference;
-}
-
-const std::vector<uint32_t>&
-WebRtcVideoChannel::WebRtcVideoSendStream::GetSsrcs() const {
-  return ssrcs_;
-}
-
-EncoderFactoryAdapter::AllocatedEncoder
-CricketEncoderFactoryAdapter::CreateVideoEncoder(
-    const VideoCodec& codec,
-    bool is_conference_mode_screenshare) const {
-  // Try creating external encoder.
-  if (external_encoder_factory_ != nullptr &&
-      FindMatchingCodec(external_encoder_factory_->supported_codecs(), codec)) {
-    std::unique_ptr<webrtc::VideoEncoder> external_encoder;
-    if (CodecNamesEq(codec.name.c_str(), kVp8CodecName)) {
-      // If it's a codec type we can simulcast, create a wrapped encoder.
-      external_encoder = std::unique_ptr<webrtc::VideoEncoder>(
-          new webrtc::SimulcastEncoderAdapter(external_encoder_factory_));
-    } else {
-      external_encoder =
-          CreateScopedVideoEncoder(external_encoder_factory_, codec);
-    }
-    if (external_encoder) {
-      std::unique_ptr<webrtc::VideoEncoder> internal_encoder(
-          new webrtc::VideoEncoderSoftwareFallbackWrapper(
-              codec, std::move(external_encoder)));
-      const webrtc::VideoCodecType codec_type =
-          webrtc::PayloadStringToCodecType(codec.name);
-      const bool has_internal_source =
-          external_encoder_factory_->EncoderTypeHasInternalSource(codec_type);
-      return AllocatedEncoder(std::move(internal_encoder),
-                              true /* is_hardware_accelerated */,
-                              has_internal_source);
-    }
-  }
-
-  // Try creating internal encoder.
-  std::unique_ptr<webrtc::VideoEncoder> internal_encoder;
-  if (FindMatchingCodec(internal_encoder_factory_->supported_codecs(), codec)) {
-    if (CodecNamesEq(codec.name.c_str(), kVp8CodecName) &&
-        is_conference_mode_screenshare && UseSimulcastScreenshare()) {
-      // TODO(sprang): Remove this adapter once libvpx supports simulcast with
-      // same-resolution substreams.
-      internal_encoder = std::unique_ptr<webrtc::VideoEncoder>(
-          new webrtc::SimulcastEncoderAdapter(internal_encoder_factory_.get()));
-    } else {
-      internal_encoder = std::unique_ptr<webrtc::VideoEncoder>(
-          internal_encoder_factory_->CreateVideoEncoder(codec));
-    }
-    return AllocatedEncoder(std::move(internal_encoder),
-                            false /* is_hardware_accelerated */,
-                            false /* has_internal_source */);
-  }
-
-  // This shouldn't happen, we should not be trying to create something we don't
-  // support.
-  RTC_NOTREACHED();
-  return AllocatedEncoder();
-}
-
-void WebRtcVideoChannel::WebRtcVideoSendStream::SetCodec(
-    const VideoCodecSettings& codec_settings,
-    bool force_encoder_allocation) {
-  RTC_DCHECK_RUN_ON(&thread_checker_);
-  parameters_.encoder_config = CreateVideoEncoderConfig(codec_settings.codec);
-  RTC_DCHECK_GT(parameters_.encoder_config.number_of_streams, 0);
-
-  // Do not re-create encoders of the same type. We can't overwrite
-  // |allocated_encoder_| immediately, because we need to release it after the
-  // RecreateWebRtcStream() call.
-  std::unique_ptr<webrtc::VideoEncoder> new_encoder;
-  if (force_encoder_allocation || !allocated_encoder_ ||
-      allocated_codec_ != codec_settings.codec) {
-    const bool is_conference_mode_screenshare =
-        parameters_.encoder_config.content_type ==
-            webrtc::VideoEncoderConfig::ContentType::kScreen &&
-        parameters_.conference_mode;
-    EncoderFactoryAdapter::AllocatedEncoder new_allocated_encoder =
-        encoder_factory_->CreateVideoEncoder(codec_settings.codec,
-                                             is_conference_mode_screenshare);
-    new_encoder = std::unique_ptr<webrtc::VideoEncoder>(
-        std::move(new_allocated_encoder.encoder));
-    parameters_.config.encoder_settings.encoder = new_encoder.get();
-    parameters_.config.encoder_settings.full_overuse_time =
-        new_allocated_encoder.is_hardware_accelerated;
-    parameters_.config.encoder_settings.internal_source =
-        new_allocated_encoder.has_internal_source;
-  } else {
-    new_encoder = std::move(allocated_encoder_);
-  }
-  parameters_.config.encoder_settings.payload_name = codec_settings.codec.name;
-  parameters_.config.encoder_settings.payload_type = codec_settings.codec.id;
-  parameters_.config.rtp.ulpfec = codec_settings.ulpfec;
-  parameters_.config.rtp.flexfec.payload_type =
-      codec_settings.flexfec_payload_type;
-
-  // Set RTX payload type if RTX is enabled.
-  if (!parameters_.config.rtp.rtx.ssrcs.empty()) {
-    if (codec_settings.rtx_payload_type == -1) {
-      LOG(LS_WARNING) << "RTX SSRCs configured but there's no configured RTX "
-                         "payload type. Ignoring.";
-      parameters_.config.rtp.rtx.ssrcs.clear();
-    } else {
-      parameters_.config.rtp.rtx.payload_type = codec_settings.rtx_payload_type;
-    }
-  }
-
-  parameters_.config.rtp.nack.rtp_history_ms =
-      HasNack(codec_settings.codec) ? kNackHistoryMs : 0;
-
-  parameters_.codec_settings =
-      rtc::Optional<WebRtcVideoChannel::VideoCodecSettings>(codec_settings);
-
-  LOG(LS_INFO) << "RecreateWebRtcStream (send) because of SetCodec.";
-  RecreateWebRtcStream();
-  allocated_encoder_ = std::move(new_encoder);
-  allocated_codec_ = codec_settings.codec;
-}
-
-void WebRtcVideoChannel::WebRtcVideoSendStream::SetSendParameters(
-    const ChangedSendParameters& params) {
-  RTC_DCHECK_RUN_ON(&thread_checker_);
-  // |recreate_stream| means construction-time parameters have changed and the
-  // sending stream needs to be reset with the new config.
-  bool recreate_stream = false;
-  if (params.rtcp_mode) {
-    parameters_.config.rtp.rtcp_mode = *params.rtcp_mode;
-    recreate_stream = true;
-  }
-  if (params.rtp_header_extensions) {
-    parameters_.config.rtp.extensions = *params.rtp_header_extensions;
-    recreate_stream = true;
-  }
-  if (params.max_bandwidth_bps) {
-    parameters_.max_bitrate_bps = *params.max_bandwidth_bps;
-    ReconfigureEncoder();
-  }
-  if (params.conference_mode) {
-    parameters_.conference_mode = *params.conference_mode;
-  }
-
-  // Set codecs and options.
-  if (params.codec) {
-    bool force_encoder_allocation = false;
-    SetCodec(*params.codec, force_encoder_allocation);
-    recreate_stream = false;  // SetCodec has already recreated the stream.
-  } else if (params.conference_mode && parameters_.codec_settings) {
-    bool force_encoder_allocation = false;
-    SetCodec(*parameters_.codec_settings, force_encoder_allocation);
-    recreate_stream = false;  // SetCodec has already recreated the stream.
-  }
-  if (recreate_stream) {
-    LOG(LS_INFO) << "RecreateWebRtcStream (send) because of SetSendParameters";
-    RecreateWebRtcStream();
-  }
-}
-
-bool WebRtcVideoChannel::WebRtcVideoSendStream::SetRtpParameters(
-    const webrtc::RtpParameters& new_parameters) {
-  RTC_DCHECK_RUN_ON(&thread_checker_);
-  if (!ValidateRtpParameters(new_parameters)) {
-    return false;
-  }
-
-  bool reconfigure_encoder = new_parameters.encodings[0].max_bitrate_bps !=
-                             rtp_parameters_.encodings[0].max_bitrate_bps;
-  rtp_parameters_ = new_parameters;
-  // Codecs are currently handled at the WebRtcVideoChannel level.
-  rtp_parameters_.codecs.clear();
-  if (reconfigure_encoder) {
-    ReconfigureEncoder();
-  }
-  // Encoding may have been activated/deactivated.
-  UpdateSendState();
-  return true;
-}
-
-webrtc::RtpParameters
-WebRtcVideoChannel::WebRtcVideoSendStream::GetRtpParameters() const {
-  RTC_DCHECK_RUN_ON(&thread_checker_);
-  return rtp_parameters_;
-}
-
-bool WebRtcVideoChannel::WebRtcVideoSendStream::ValidateRtpParameters(
-    const webrtc::RtpParameters& rtp_parameters) {
-  RTC_DCHECK_RUN_ON(&thread_checker_);
-  if (rtp_parameters.encodings.size() != 1) {
-    LOG(LS_ERROR)
-        << "Attempted to set RtpParameters without exactly one encoding";
-    return false;
-  }
-  if (rtp_parameters.encodings[0].ssrc != rtp_parameters_.encodings[0].ssrc) {
-    LOG(LS_ERROR) << "Attempted to set RtpParameters with modified SSRC";
-    return false;
-  }
-  return true;
-}
-
-void WebRtcVideoChannel::WebRtcVideoSendStream::UpdateSendState() {
-  RTC_DCHECK_RUN_ON(&thread_checker_);
-  // TODO(deadbeef): Need to handle more than one encoding in the future.
-  RTC_DCHECK(rtp_parameters_.encodings.size() == 1u);
-  if (sending_ && rtp_parameters_.encodings[0].active) {
-    RTC_DCHECK(stream_ != nullptr);
-    stream_->Start();
-  } else {
-    if (stream_ != nullptr) {
-      stream_->Stop();
-    }
-  }
-}
-
-webrtc::VideoEncoderConfig
-WebRtcVideoChannel::WebRtcVideoSendStream::CreateVideoEncoderConfig(
-    const VideoCodec& codec) const {
-  RTC_DCHECK_RUN_ON(&thread_checker_);
-  webrtc::VideoEncoderConfig encoder_config;
-  bool is_screencast = parameters_.options.is_screencast.value_or(false);
-  if (is_screencast) {
-    encoder_config.min_transmit_bitrate_bps =
-        1000 * parameters_.options.screencast_min_bitrate_kbps.value_or(0);
-    encoder_config.content_type =
-        webrtc::VideoEncoderConfig::ContentType::kScreen;
-  } else {
-    encoder_config.min_transmit_bitrate_bps = 0;
-    encoder_config.content_type =
-        webrtc::VideoEncoderConfig::ContentType::kRealtimeVideo;
-  }
-
-  // By default, the stream count for the codec configuration should match the
-  // number of negotiated ssrcs. But if the codec is blacklisted for simulcast
-  // or a screencast (and not in simulcast screenshare experiment), only
-  // configure a single stream.
-  encoder_config.number_of_streams = parameters_.config.rtp.ssrcs.size();
-  if (IsCodecBlacklistedForSimulcast(codec.name) ||
-      (is_screencast &&
-       (!UseSimulcastScreenshare() || !parameters_.conference_mode))) {
-    encoder_config.number_of_streams = 1;
-  }
-
-  int stream_max_bitrate = parameters_.max_bitrate_bps;
-  if (rtp_parameters_.encodings[0].max_bitrate_bps) {
-    stream_max_bitrate =
-        webrtc::MinPositive(*(rtp_parameters_.encodings[0].max_bitrate_bps),
-                            parameters_.max_bitrate_bps);
-  }
-
-  int codec_max_bitrate_kbps;
-  if (codec.GetParam(kCodecParamMaxBitrate, &codec_max_bitrate_kbps)) {
-    stream_max_bitrate = codec_max_bitrate_kbps * 1000;
-  }
-  encoder_config.max_bitrate_bps = stream_max_bitrate;
-
-  int max_qp = kDefaultQpMax;
-  codec.GetParam(kCodecParamMaxQuantization, &max_qp);
-  encoder_config.video_stream_factory =
-      new rtc::RefCountedObject<EncoderStreamFactory>(
-          codec.name, max_qp, kDefaultVideoMaxFramerate, is_screencast,
-          parameters_.conference_mode);
-  return encoder_config;
-}
-
-void WebRtcVideoChannel::WebRtcVideoSendStream::ReconfigureEncoder() {
-  RTC_DCHECK_RUN_ON(&thread_checker_);
-  if (!stream_) {
-    // The webrtc::VideoSendStream |stream_| has not yet been created but other
-    // parameters has changed.
-    return;
-  }
-
-  RTC_DCHECK_GT(parameters_.encoder_config.number_of_streams, 0);
-
-  RTC_CHECK(parameters_.codec_settings);
-  VideoCodecSettings codec_settings = *parameters_.codec_settings;
-
-  webrtc::VideoEncoderConfig encoder_config =
-      CreateVideoEncoderConfig(codec_settings.codec);
-
-  encoder_config.encoder_specific_settings = ConfigureVideoEncoderSettings(
-      codec_settings.codec);
-
-  stream_->ReconfigureVideoEncoder(encoder_config.Copy());
-
-  encoder_config.encoder_specific_settings = NULL;
-
-  parameters_.encoder_config = std::move(encoder_config);
-}
-
-void WebRtcVideoChannel::WebRtcVideoSendStream::SetSend(bool send) {
-  RTC_DCHECK_RUN_ON(&thread_checker_);
-  sending_ = send;
-  UpdateSendState();
-}
-
-void WebRtcVideoChannel::WebRtcVideoSendStream::RemoveSink(
-    rtc::VideoSinkInterface<webrtc::VideoFrame>* sink) {
-  RTC_DCHECK_RUN_ON(&thread_checker_);
-  RTC_DCHECK(encoder_sink_ == sink);
-  encoder_sink_ = nullptr;
-  source_->RemoveSink(sink);
-}
-
-void WebRtcVideoChannel::WebRtcVideoSendStream::AddOrUpdateSink(
-    rtc::VideoSinkInterface<webrtc::VideoFrame>* sink,
-    const rtc::VideoSinkWants& wants) {
-  if (worker_thread_ == rtc::Thread::Current()) {
-    // AddOrUpdateSink is called on |worker_thread_| if this is the first
-    // registration of |sink|.
-    RTC_DCHECK_RUN_ON(&thread_checker_);
-    encoder_sink_ = sink;
-    source_->AddOrUpdateSink(encoder_sink_, wants);
-  } else {
-    // Subsequent calls to AddOrUpdateSink will happen on the encoder task
-    // queue.
-    invoker_.AsyncInvoke<void>(
-        RTC_FROM_HERE, worker_thread_, [this, sink, wants] {
-          RTC_DCHECK_RUN_ON(&thread_checker_);
-          // |sink| may be invalidated after this task was posted since
-          // RemoveSink is called on the worker thread.
-          bool encoder_sink_valid = (sink == encoder_sink_);
-          if (source_ && encoder_sink_valid) {
-            source_->AddOrUpdateSink(encoder_sink_, wants);
-          }
-        });
-  }
-}
-
-VideoSenderInfo WebRtcVideoChannel::WebRtcVideoSendStream::GetVideoSenderInfo(
-    bool log_stats) {
-  VideoSenderInfo info;
-  RTC_DCHECK_RUN_ON(&thread_checker_);
-  for (uint32_t ssrc : parameters_.config.rtp.ssrcs)
-    info.add_ssrc(ssrc);
-
-  if (parameters_.codec_settings) {
-    info.codec_name = parameters_.codec_settings->codec.name;
-    info.codec_payload_type = rtc::Optional<int>(
-        parameters_.codec_settings->codec.id);
-  }
-
-  if (stream_ == NULL)
-    return info;
-
-  webrtc::VideoSendStream::Stats stats = stream_->GetStats();
-
-  if (log_stats)
-    LOG(LS_INFO) << stats.ToString(rtc::TimeMillis());
-
-  info.adapt_changes = stats.number_of_cpu_adapt_changes;
-  info.adapt_reason =
-      stats.cpu_limited_resolution ? ADAPTREASON_CPU : ADAPTREASON_NONE;
-
-  // Get bandwidth limitation info from stream_->GetStats().
-  // Input resolution (output from video_adapter) can be further scaled down or
-  // higher video layer(s) can be dropped due to bitrate constraints.
-  // Note, adapt_changes only include changes from the video_adapter.
-  if (stats.bw_limited_resolution)
-    info.adapt_reason |= ADAPTREASON_BANDWIDTH;
-
-  info.encoder_implementation_name = stats.encoder_implementation_name;
-  info.ssrc_groups = ssrc_groups_;
-  info.framerate_input = stats.input_frame_rate;
-  info.framerate_sent = stats.encode_frame_rate;
-  info.avg_encode_ms = stats.avg_encode_time_ms;
-  info.encode_usage_percent = stats.encode_usage_percent;
-  info.frames_encoded = stats.frames_encoded;
-  info.qp_sum = stats.qp_sum;
-
-  info.nominal_bitrate = stats.media_bitrate_bps;
-  info.preferred_bitrate = stats.preferred_media_bitrate_bps;
-
-  info.content_type = stats.content_type;
-
-  info.send_frame_width = 0;
-  info.send_frame_height = 0;
-  for (std::map<uint32_t, webrtc::VideoSendStream::StreamStats>::iterator it =
-           stats.substreams.begin();
-       it != stats.substreams.end(); ++it) {
-    // TODO(pbos): Wire up additional stats, such as padding bytes.
-    webrtc::VideoSendStream::StreamStats stream_stats = it->second;
-    info.bytes_sent += stream_stats.rtp_stats.transmitted.payload_bytes +
-                       stream_stats.rtp_stats.transmitted.header_bytes +
-                       stream_stats.rtp_stats.transmitted.padding_bytes;
-    info.packets_sent += stream_stats.rtp_stats.transmitted.packets;
-    info.packets_lost += stream_stats.rtcp_stats.packets_lost;
-    if (stream_stats.width > info.send_frame_width)
-      info.send_frame_width = stream_stats.width;
-    if (stream_stats.height > info.send_frame_height)
-      info.send_frame_height = stream_stats.height;
-    info.firs_rcvd += stream_stats.rtcp_packet_type_counts.fir_packets;
-    info.nacks_rcvd += stream_stats.rtcp_packet_type_counts.nack_packets;
-    info.plis_rcvd += stream_stats.rtcp_packet_type_counts.pli_packets;
-  }
-
-  if (!stats.substreams.empty()) {
-    // TODO(pbos): Report fraction lost per SSRC.
-    webrtc::VideoSendStream::StreamStats first_stream_stats =
-        stats.substreams.begin()->second;
-    info.fraction_lost =
-        static_cast<float>(first_stream_stats.rtcp_stats.fraction_lost) /
-        (1 << 8);
-  }
-
-  return info;
-}
-
-void WebRtcVideoChannel::WebRtcVideoSendStream::FillBitrateInfo(
-    BandwidthEstimationInfo* bwe_info) {
-  RTC_DCHECK_RUN_ON(&thread_checker_);
-  if (stream_ == NULL) {
-    return;
-  }
-  webrtc::VideoSendStream::Stats stats = stream_->GetStats();
-  for (std::map<uint32_t, webrtc::VideoSendStream::StreamStats>::iterator it =
-           stats.substreams.begin();
-       it != stats.substreams.end(); ++it) {
-    bwe_info->transmit_bitrate += it->second.total_bitrate_bps;
-    bwe_info->retransmit_bitrate += it->second.retransmit_bitrate_bps;
-  }
-  bwe_info->target_enc_bitrate += stats.target_media_bitrate_bps;
-  bwe_info->actual_enc_bitrate += stats.media_bitrate_bps;
-}
-
-void WebRtcVideoChannel::WebRtcVideoSendStream::RecreateWebRtcStream() {
-  RTC_DCHECK_RUN_ON(&thread_checker_);
-  if (stream_ != NULL) {
-    call_->DestroyVideoSendStream(stream_);
-  }
-
-  RTC_CHECK(parameters_.codec_settings);
-  RTC_DCHECK_EQ((parameters_.encoder_config.content_type ==
-                 webrtc::VideoEncoderConfig::ContentType::kScreen),
-                parameters_.options.is_screencast.value_or(false))
-      << "encoder content type inconsistent with screencast option";
-  parameters_.encoder_config.encoder_specific_settings =
-      ConfigureVideoEncoderSettings(parameters_.codec_settings->codec);
-
-  webrtc::VideoSendStream::Config config = parameters_.config.Copy();
-  if (!config.rtp.rtx.ssrcs.empty() && config.rtp.rtx.payload_type == -1) {
-    LOG(LS_WARNING) << "RTX SSRCs configured but there's no configured RTX "
-                       "payload type the set codec. Ignoring RTX.";
-    config.rtp.rtx.ssrcs.clear();
-  }
-  stream_ = call_->CreateVideoSendStream(std::move(config),
-                                         parameters_.encoder_config.Copy());
-
-  parameters_.encoder_config.encoder_specific_settings = NULL;
-
-  if (source_) {
-    stream_->SetSource(this, GetDegradationPreference());
-  }
-
-  // Call stream_->Start() if necessary conditions are met.
-  UpdateSendState();
-}
-
-WebRtcVideoChannel::WebRtcVideoReceiveStream::WebRtcVideoReceiveStream(
-    webrtc::Call* call,
-    const StreamParams& sp,
-    webrtc::VideoReceiveStream::Config config,
-    const DecoderFactoryAdapter* decoder_factory,
-    bool default_stream,
-    const std::vector<VideoCodecSettings>& recv_codecs,
-    const webrtc::FlexfecReceiveStream::Config& flexfec_config)
-    : call_(call),
-      stream_params_(sp),
-      stream_(NULL),
-      default_stream_(default_stream),
-      config_(std::move(config)),
-      flexfec_config_(flexfec_config),
-      flexfec_stream_(nullptr),
-      decoder_factory_(decoder_factory),
-      sink_(NULL),
-      first_frame_timestamp_(-1),
-      estimated_remote_start_ntp_time_ms_(0) {
-  config_.renderer = this;
-  DecoderMap old_decoders;
-  ConfigureCodecs(recv_codecs, &old_decoders);
-  ConfigureFlexfecCodec(flexfec_config.payload_type);
-  MaybeRecreateWebRtcFlexfecStream();
-  RecreateWebRtcVideoStream();
-  RTC_DCHECK(old_decoders.empty());
-}
-
-WebRtcVideoChannel::WebRtcVideoReceiveStream::~WebRtcVideoReceiveStream() {
-  if (flexfec_stream_) {
-    MaybeDissociateFlexfecFromVideo();
-    call_->DestroyFlexfecReceiveStream(flexfec_stream_);
-  }
-  call_->DestroyVideoReceiveStream(stream_);
-  allocated_decoders_.clear();
-}
-
-const std::vector<uint32_t>&
-WebRtcVideoChannel::WebRtcVideoReceiveStream::GetSsrcs() const {
-  return stream_params_.ssrcs;
-}
-
-rtc::Optional<uint32_t>
-WebRtcVideoChannel::WebRtcVideoReceiveStream::GetFirstPrimarySsrc() const {
-  std::vector<uint32_t> primary_ssrcs;
-  stream_params_.GetPrimarySsrcs(&primary_ssrcs);
-
-  if (primary_ssrcs.empty()) {
-    LOG(LS_WARNING) << "Empty primary ssrcs vector, returning empty optional";
-    return rtc::Optional<uint32_t>();
-  } else {
-    return rtc::Optional<uint32_t>(primary_ssrcs[0]);
-  }
-}
-
-std::unique_ptr<webrtc::VideoDecoder>
-CricketDecoderFactoryAdapter::CreateVideoDecoder(
-    const VideoCodec& codec,
-    const VideoDecoderParams& decoder_params) const {
-  if (external_decoder_factory_ != nullptr) {
-    std::unique_ptr<webrtc::VideoDecoder> external_decoder =
-        CreateScopedVideoDecoder(external_decoder_factory_, codec,
-                                 decoder_params);
-    if (external_decoder) {
-      webrtc::VideoCodecType type =
-          webrtc::PayloadStringToCodecType(codec.name);
-      std::unique_ptr<webrtc::VideoDecoder> internal_decoder(
-          new webrtc::VideoDecoderSoftwareFallbackWrapper(
-              type, std::move(external_decoder)));
-      return internal_decoder;
-    }
-  }
-
-  std::unique_ptr<webrtc::VideoDecoder> internal_decoder(
-      internal_decoder_factory_->CreateVideoDecoderWithParams(codec,
-                                                              decoder_params));
-  return internal_decoder;
-}
-
-void WebRtcVideoChannel::WebRtcVideoReceiveStream::ConfigureCodecs(
-    const std::vector<VideoCodecSettings>& recv_codecs,
-    DecoderMap* old_decoders) {
-  *old_decoders = std::move(allocated_decoders_);
-  config_.decoders.clear();
-  config_.rtp.rtx_associated_payload_types.clear();
-  for (const auto& recv_codec : recv_codecs) {
-    webrtc::SdpVideoFormat video_format(recv_codec.codec.name,
-                                        recv_codec.codec.params);
-    std::unique_ptr<webrtc::VideoDecoder> new_decoder;
-
-    auto it = old_decoders->find(video_format);
-    if (it != old_decoders->end()) {
-      new_decoder = std::move(it->second);
-      old_decoders->erase(it);
-    }
-
-    if (!new_decoder) {
-      new_decoder = decoder_factory_->CreateVideoDecoder(recv_codec.codec,
-                                                         {stream_params_.id});
-    }
-
-    webrtc::VideoReceiveStream::Decoder decoder;
-    decoder.decoder = new_decoder.get();
-    decoder.payload_type = recv_codec.codec.id;
-    decoder.payload_name = recv_codec.codec.name;
-    decoder.codec_params = recv_codec.codec.params;
-    config_.decoders.push_back(decoder);
-    config_.rtp.rtx_associated_payload_types[recv_codec.rtx_payload_type] =
-        recv_codec.codec.id;
-
-    const bool did_insert =
-        allocated_decoders_
-            .insert(std::make_pair(video_format, std::move(new_decoder)))
-            .second;
-    RTC_CHECK(did_insert);
-  }
-
-  config_.rtp.ulpfec = recv_codecs.front().ulpfec;
-
-  config_.rtp.nack.rtp_history_ms =
-      HasNack(recv_codecs.begin()->codec) ? kNackHistoryMs : 0;
-  if (config_.rtp.ulpfec.red_rtx_payload_type != -1) {
-    config_.rtp
-        .rtx_associated_payload_types[config_.rtp.ulpfec.red_rtx_payload_type] =
-        config_.rtp.ulpfec.red_payload_type;
-  }
-}
-
-void WebRtcVideoChannel::WebRtcVideoReceiveStream::ConfigureFlexfecCodec(
-    int flexfec_payload_type) {
-  flexfec_config_.payload_type = flexfec_payload_type;
-}
-
-void WebRtcVideoChannel::WebRtcVideoReceiveStream::SetLocalSsrc(
-    uint32_t local_ssrc) {
-  // TODO(pbos): Consider turning this sanity check into a RTC_DCHECK. You
-  // should not be able to create a sender with the same SSRC as a receiver, but
-  // right now this can't be done due to unittests depending on receiving what
-  // they are sending from the same MediaChannel.
-  if (local_ssrc == config_.rtp.remote_ssrc) {
-    LOG(LS_INFO) << "Ignoring call to SetLocalSsrc because parameters are "
-                    "unchanged; local_ssrc=" << local_ssrc;
-    return;
-  }
-
-  config_.rtp.local_ssrc = local_ssrc;
-  flexfec_config_.local_ssrc = local_ssrc;
-  LOG(LS_INFO)
-      << "RecreateWebRtcStream (recv) because of SetLocalSsrc; local_ssrc="
-      << local_ssrc;
-  MaybeRecreateWebRtcFlexfecStream();
-  RecreateWebRtcVideoStream();
-}
-
-void WebRtcVideoChannel::WebRtcVideoReceiveStream::SetFeedbackParameters(
-    bool nack_enabled,
-    bool remb_enabled,
-    bool transport_cc_enabled,
-    webrtc::RtcpMode rtcp_mode) {
-  int nack_history_ms = nack_enabled ? kNackHistoryMs : 0;
-  if (config_.rtp.nack.rtp_history_ms == nack_history_ms &&
-      config_.rtp.remb == remb_enabled &&
-      config_.rtp.transport_cc == transport_cc_enabled &&
-      config_.rtp.rtcp_mode == rtcp_mode) {
-    LOG(LS_INFO)
-        << "Ignoring call to SetFeedbackParameters because parameters are "
-           "unchanged; nack="
-        << nack_enabled << ", remb=" << remb_enabled
-        << ", transport_cc=" << transport_cc_enabled;
-    return;
-  }
-  config_.rtp.remb = remb_enabled;
-  config_.rtp.nack.rtp_history_ms = nack_history_ms;
-  config_.rtp.transport_cc = transport_cc_enabled;
-  config_.rtp.rtcp_mode = rtcp_mode;
-  // TODO(brandtr): We should be spec-compliant and set |transport_cc| here
-  // based on the rtcp-fb for the FlexFEC codec, not the media codec.
-  flexfec_config_.transport_cc = config_.rtp.transport_cc;
-  flexfec_config_.rtcp_mode = config_.rtp.rtcp_mode;
-  LOG(LS_INFO)
-      << "RecreateWebRtcStream (recv) because of SetFeedbackParameters; nack="
-      << nack_enabled << ", remb=" << remb_enabled
-      << ", transport_cc=" << transport_cc_enabled;
-  MaybeRecreateWebRtcFlexfecStream();
-  RecreateWebRtcVideoStream();
-}
-
-void WebRtcVideoChannel::WebRtcVideoReceiveStream::SetRecvParameters(
-    const ChangedRecvParameters& params) {
-  bool video_needs_recreation = false;
-  bool flexfec_needs_recreation = false;
-  DecoderMap old_decoders;
-  if (params.codec_settings) {
-    ConfigureCodecs(*params.codec_settings, &old_decoders);
-    video_needs_recreation = true;
-  }
-  if (params.rtp_header_extensions) {
-    config_.rtp.extensions = *params.rtp_header_extensions;
-    flexfec_config_.rtp_header_extensions = *params.rtp_header_extensions;
-    video_needs_recreation = true;
-    flexfec_needs_recreation = true;
-  }
-  if (params.flexfec_payload_type) {
-    ConfigureFlexfecCodec(*params.flexfec_payload_type);
-    flexfec_needs_recreation = true;
-  }
-  if (flexfec_needs_recreation) {
-    LOG(LS_INFO) << "MaybeRecreateWebRtcFlexfecStream (recv) because of "
-                    "SetRecvParameters";
-    MaybeRecreateWebRtcFlexfecStream();
-  }
-  if (video_needs_recreation) {
-    LOG(LS_INFO)
-        << "RecreateWebRtcVideoStream (recv) because of SetRecvParameters";
-    RecreateWebRtcVideoStream();
-  }
-}
-
-void WebRtcVideoChannel::WebRtcVideoReceiveStream::
-    RecreateWebRtcVideoStream() {
-  if (stream_) {
-    MaybeDissociateFlexfecFromVideo();
-    call_->DestroyVideoReceiveStream(stream_);
-    stream_ = nullptr;
-  }
-  webrtc::VideoReceiveStream::Config config = config_.Copy();
-  config.rtp.protected_by_flexfec = (flexfec_stream_ != nullptr);
-  stream_ = call_->CreateVideoReceiveStream(std::move(config));
-  MaybeAssociateFlexfecWithVideo();
-  stream_->Start();
-}
-
-void WebRtcVideoChannel::WebRtcVideoReceiveStream::
-    MaybeRecreateWebRtcFlexfecStream() {
-  if (flexfec_stream_) {
-    MaybeDissociateFlexfecFromVideo();
-    call_->DestroyFlexfecReceiveStream(flexfec_stream_);
-    flexfec_stream_ = nullptr;
-  }
-  if (flexfec_config_.IsCompleteAndEnabled()) {
-    flexfec_stream_ = call_->CreateFlexfecReceiveStream(flexfec_config_);
-    MaybeAssociateFlexfecWithVideo();
-  }
-}
-
-void WebRtcVideoChannel::WebRtcVideoReceiveStream::
-    MaybeAssociateFlexfecWithVideo() {
-  if (stream_ && flexfec_stream_) {
-    stream_->AddSecondarySink(flexfec_stream_);
-  }
-}
-
-void WebRtcVideoChannel::WebRtcVideoReceiveStream::
-    MaybeDissociateFlexfecFromVideo() {
-  if (stream_ && flexfec_stream_) {
-    stream_->RemoveSecondarySink(flexfec_stream_);
-  }
-}
-
-void WebRtcVideoChannel::WebRtcVideoReceiveStream::OnFrame(
-    const webrtc::VideoFrame& frame) {
-  rtc::CritScope crit(&sink_lock_);
-
-  if (first_frame_timestamp_ < 0)
-    first_frame_timestamp_ = frame.timestamp();
-  int64_t rtp_time_elapsed_since_first_frame =
-      (timestamp_wraparound_handler_.Unwrap(frame.timestamp()) -
-       first_frame_timestamp_);
-  int64_t elapsed_time_ms = rtp_time_elapsed_since_first_frame /
-                            (cricket::kVideoCodecClockrate / 1000);
-  if (frame.ntp_time_ms() > 0)
-    estimated_remote_start_ntp_time_ms_ = frame.ntp_time_ms() - elapsed_time_ms;
-
-  if (sink_ == NULL) {
-    LOG(LS_WARNING) << "VideoReceiveStream not connected to a VideoSink.";
-    return;
-  }
-
-  sink_->OnFrame(frame);
-}
-
-bool WebRtcVideoChannel::WebRtcVideoReceiveStream::IsDefaultStream() const {
-  return default_stream_;
-}
-
-void WebRtcVideoChannel::WebRtcVideoReceiveStream::SetSink(
-    rtc::VideoSinkInterface<webrtc::VideoFrame>* sink) {
-  rtc::CritScope crit(&sink_lock_);
-  sink_ = sink;
-}
-
-std::string
-WebRtcVideoChannel::WebRtcVideoReceiveStream::GetCodecNameFromPayloadType(
-    int payload_type) {
-  for (const webrtc::VideoReceiveStream::Decoder& decoder : config_.decoders) {
-    if (decoder.payload_type == payload_type) {
-      return decoder.payload_name;
-    }
-  }
-  return "";
-}
-
-VideoReceiverInfo
-WebRtcVideoChannel::WebRtcVideoReceiveStream::GetVideoReceiverInfo(
-    bool log_stats) {
-  VideoReceiverInfo info;
-  info.ssrc_groups = stream_params_.ssrc_groups;
-  info.add_ssrc(config_.rtp.remote_ssrc);
-  webrtc::VideoReceiveStream::Stats stats = stream_->GetStats();
-  info.decoder_implementation_name = stats.decoder_implementation_name;
-  if (stats.current_payload_type != -1) {
-    info.codec_payload_type = rtc::Optional<int>(
-        stats.current_payload_type);
-  }
-  info.bytes_rcvd = stats.rtp_stats.transmitted.payload_bytes +
-                    stats.rtp_stats.transmitted.header_bytes +
-                    stats.rtp_stats.transmitted.padding_bytes;
-  info.packets_rcvd = stats.rtp_stats.transmitted.packets;
-  info.packets_lost = stats.rtcp_stats.packets_lost;
-  info.fraction_lost =
-      static_cast<float>(stats.rtcp_stats.fraction_lost) / (1 << 8);
-
-  info.framerate_rcvd = stats.network_frame_rate;
-  info.framerate_decoded = stats.decode_frame_rate;
-  info.framerate_output = stats.render_frame_rate;
-  info.frame_width = stats.width;
-  info.frame_height = stats.height;
-
-  {
-    rtc::CritScope frame_cs(&sink_lock_);
-    info.capture_start_ntp_time_ms = estimated_remote_start_ntp_time_ms_;
-  }
-
-  info.decode_ms = stats.decode_ms;
-  info.max_decode_ms = stats.max_decode_ms;
-  info.current_delay_ms = stats.current_delay_ms;
-  info.target_delay_ms = stats.target_delay_ms;
-  info.jitter_buffer_ms = stats.jitter_buffer_ms;
-  info.min_playout_delay_ms = stats.min_playout_delay_ms;
-  info.render_delay_ms = stats.render_delay_ms;
-  info.frames_received = stats.frame_counts.key_frames +
-                         stats.frame_counts.delta_frames;
-  info.frames_decoded = stats.frames_decoded;
-  info.frames_rendered = stats.frames_rendered;
-  info.qp_sum = stats.qp_sum;
-
-  info.interframe_delay_max_ms = stats.interframe_delay_max_ms;
-
-  info.content_type = stats.content_type;
-
-  info.codec_name = GetCodecNameFromPayloadType(stats.current_payload_type);
-
-  info.firs_sent = stats.rtcp_packet_type_counts.fir_packets;
-  info.plis_sent = stats.rtcp_packet_type_counts.pli_packets;
-  info.nacks_sent = stats.rtcp_packet_type_counts.nack_packets;
-
-  info.timing_frame_info = stats.timing_frame_info;
-
-  if (log_stats)
-    LOG(LS_INFO) << stats.ToString(rtc::TimeMillis());
-
-  return info;
-}
-
-WebRtcVideoChannel::VideoCodecSettings::VideoCodecSettings()
-    : flexfec_payload_type(-1), rtx_payload_type(-1) {}
-
-bool WebRtcVideoChannel::VideoCodecSettings::operator==(
-    const WebRtcVideoChannel::VideoCodecSettings& other) const {
-  return codec == other.codec && ulpfec == other.ulpfec &&
-         flexfec_payload_type == other.flexfec_payload_type &&
-         rtx_payload_type == other.rtx_payload_type;
-}
-
-bool WebRtcVideoChannel::VideoCodecSettings::EqualsDisregardingFlexfec(
-    const WebRtcVideoChannel::VideoCodecSettings& a,
-    const WebRtcVideoChannel::VideoCodecSettings& b) {
-  return a.codec == b.codec && a.ulpfec == b.ulpfec &&
-         a.rtx_payload_type == b.rtx_payload_type;
-}
-
-bool WebRtcVideoChannel::VideoCodecSettings::operator!=(
-    const WebRtcVideoChannel::VideoCodecSettings& other) const {
-  return !(*this == other);
-}
-
-std::vector<WebRtcVideoChannel::VideoCodecSettings>
-WebRtcVideoChannel::MapCodecs(const std::vector<VideoCodec>& codecs) {
-  RTC_DCHECK(!codecs.empty());
-
-  std::vector<VideoCodecSettings> video_codecs;
-  std::map<int, bool> payload_used;
-  std::map<int, VideoCodec::CodecType> payload_codec_type;
-  // |rtx_mapping| maps video payload type to rtx payload type.
-  std::map<int, int> rtx_mapping;
-
-  webrtc::UlpfecConfig ulpfec_config;
-  int flexfec_payload_type = -1;
-
-  for (size_t i = 0; i < codecs.size(); ++i) {
-    const VideoCodec& in_codec = codecs[i];
-    int payload_type = in_codec.id;
-
-    if (payload_used[payload_type]) {
-      LOG(LS_ERROR) << "Payload type already registered: "
-                    << in_codec.ToString();
-      return std::vector<VideoCodecSettings>();
-    }
-    payload_used[payload_type] = true;
-    payload_codec_type[payload_type] = in_codec.GetCodecType();
-
-    switch (in_codec.GetCodecType()) {
-      case VideoCodec::CODEC_RED: {
-        // RED payload type, should not have duplicates.
-        RTC_DCHECK_EQ(-1, ulpfec_config.red_payload_type);
-        ulpfec_config.red_payload_type = in_codec.id;
-        continue;
-      }
-
-      case VideoCodec::CODEC_ULPFEC: {
-        // ULPFEC payload type, should not have duplicates.
-        RTC_DCHECK_EQ(-1, ulpfec_config.ulpfec_payload_type);
-        ulpfec_config.ulpfec_payload_type = in_codec.id;
-        continue;
-      }
-
-      case VideoCodec::CODEC_FLEXFEC: {
-        // FlexFEC payload type, should not have duplicates.
-        RTC_DCHECK_EQ(-1, flexfec_payload_type);
-        flexfec_payload_type = in_codec.id;
-        continue;
-      }
-
-      case VideoCodec::CODEC_RTX: {
-        int associated_payload_type;
-        if (!in_codec.GetParam(kCodecParamAssociatedPayloadType,
-                               &associated_payload_type) ||
-            !IsValidRtpPayloadType(associated_payload_type)) {
-          LOG(LS_ERROR)
-              << "RTX codec with invalid or no associated payload type: "
-              << in_codec.ToString();
-          return std::vector<VideoCodecSettings>();
-        }
-        rtx_mapping[associated_payload_type] = in_codec.id;
-        continue;
-      }
-
-      case VideoCodec::CODEC_VIDEO:
-        break;
-    }
-
-    video_codecs.push_back(VideoCodecSettings());
-    video_codecs.back().codec = in_codec;
-  }
-
-  // One of these codecs should have been a video codec. Only having FEC
-  // parameters into this code is a logic error.
-  RTC_DCHECK(!video_codecs.empty());
-
-  for (std::map<int, int>::const_iterator it = rtx_mapping.begin();
-       it != rtx_mapping.end();
-       ++it) {
-    if (!payload_used[it->first]) {
-      LOG(LS_ERROR) << "RTX mapped to payload not in codec list.";
-      return std::vector<VideoCodecSettings>();
-    }
-    if (payload_codec_type[it->first] != VideoCodec::CODEC_VIDEO &&
-        payload_codec_type[it->first] != VideoCodec::CODEC_RED) {
-      LOG(LS_ERROR) << "RTX not mapped to regular video codec or RED codec.";
-      return std::vector<VideoCodecSettings>();
-    }
-
-    if (it->first == ulpfec_config.red_payload_type) {
-      ulpfec_config.red_rtx_payload_type = it->second;
-    }
-  }
-
-  for (size_t i = 0; i < video_codecs.size(); ++i) {
-    video_codecs[i].ulpfec = ulpfec_config;
-    video_codecs[i].flexfec_payload_type = flexfec_payload_type;
-    if (rtx_mapping[video_codecs[i].codec.id] != 0 &&
-        rtx_mapping[video_codecs[i].codec.id] !=
-            ulpfec_config.red_payload_type) {
-      video_codecs[i].rtx_payload_type = rtx_mapping[video_codecs[i].codec.id];
-    }
-  }
-
-  return video_codecs;
-}
-
-EncoderStreamFactory::EncoderStreamFactory(std::string codec_name,
-                                           int max_qp,
-                                           int max_framerate,
-                                           bool is_screencast,
-                                           bool conference_mode)
-    : codec_name_(codec_name),
-      max_qp_(max_qp),
-      max_framerate_(max_framerate),
-      is_screencast_(is_screencast),
-      conference_mode_(conference_mode) {}
-
-std::vector<webrtc::VideoStream> EncoderStreamFactory::CreateEncoderStreams(
-    int width,
-    int height,
-    const webrtc::VideoEncoderConfig& encoder_config) {
-  if (is_screencast_ &&
-      (!conference_mode_ || !cricket::UseSimulcastScreenshare())) {
-    RTC_DCHECK_EQ(1, encoder_config.number_of_streams);
-  }
-  if (encoder_config.number_of_streams > 1 ||
-      (CodecNamesEq(codec_name_, kVp8CodecName) && is_screencast_ &&
-       conference_mode_)) {
-    return GetSimulcastConfig(encoder_config.number_of_streams, width, height,
-                              encoder_config.max_bitrate_bps, max_qp_,
-                              max_framerate_, is_screencast_);
-  }
-
-  // For unset max bitrates set default bitrate for non-simulcast.
-  int max_bitrate_bps =
-      (encoder_config.max_bitrate_bps > 0)
-          ? encoder_config.max_bitrate_bps
-          : GetMaxDefaultVideoBitrateKbps(width, height) * 1000;
-
-  webrtc::VideoStream stream;
-  stream.width = width;
-  stream.height = height;
-  stream.max_framerate = max_framerate_;
-  stream.min_bitrate_bps = kMinVideoBitrateKbps * 1000;
-  stream.target_bitrate_bps = stream.max_bitrate_bps = max_bitrate_bps;
-  stream.max_qp = max_qp_;
-
-  if (CodecNamesEq(codec_name_, kVp9CodecName) && !is_screencast_) {
-    stream.temporal_layer_thresholds_bps.resize(GetDefaultVp9TemporalLayers() -
-                                                1);
-  }
-
-  std::vector<webrtc::VideoStream> streams;
-  streams.push_back(stream);
-  return streams;
-}
-
-}  // namespace cricket
diff --git a/media/engine/webrtcvideoengine.h b/media/engine/webrtcvideoengine.h
deleted file mode 100644
index ff55059..0000000
--- a/media/engine/webrtcvideoengine.h
+++ /dev/null
@@ -1,537 +0,0 @@
-/*
- *  Copyright (c) 2014 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_MEDIA_ENGINE_WEBRTCVIDEOENGINE_H_
-#define WEBRTC_MEDIA_ENGINE_WEBRTCVIDEOENGINE_H_
-
-#include <map>
-#include <memory>
-#include <set>
-#include <string>
-#include <vector>
-
-#include "webrtc/api/call/transport.h"
-#include "webrtc/api/optional.h"
-#include "webrtc/api/video/video_frame.h"
-#include "webrtc/api/video_codecs/sdp_video_format.h"
-#include "webrtc/call/call.h"
-#include "webrtc/call/flexfec_receive_stream.h"
-#include "webrtc/call/video_receive_stream.h"
-#include "webrtc/call/video_send_stream.h"
-#include "webrtc/media/base/mediaengine.h"
-#include "webrtc/media/base/videosinkinterface.h"
-#include "webrtc/media/base/videosourceinterface.h"
-#include "webrtc/media/engine/webrtcvideodecoderfactory.h"
-#include "webrtc/media/engine/webrtcvideoencoderfactory.h"
-#include "webrtc/rtc_base/asyncinvoker.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/networkroute.h"
-#include "webrtc/rtc_base/thread_annotations.h"
-#include "webrtc/rtc_base/thread_checker.h"
-
-namespace webrtc {
-class VideoDecoder;
-class VideoDecoderFactory;
-class VideoEncoder;
-class VideoEncoderFactory;
-struct MediaConfig;
-}
-
-namespace rtc {
-class Thread;
-}  // namespace rtc
-
-namespace cricket {
-
-class DecoderFactoryAdapter;
-class EncoderFactoryAdapter;
-class VideoCapturer;
-class VideoProcessor;
-class VideoRenderer;
-class VoiceMediaChannel;
-class WebRtcDecoderObserver;
-class WebRtcEncoderObserver;
-class WebRtcLocalStreamInfo;
-class WebRtcRenderAdapter;
-class WebRtcVideoChannel;
-class WebRtcVideoChannelRecvInfo;
-class WebRtcVideoChannelSendInfo;
-class WebRtcVoiceEngine;
-class WebRtcVoiceMediaChannel;
-
-struct Device;
-
-class UnsignalledSsrcHandler {
- public:
-  enum Action {
-    kDropPacket,
-    kDeliverPacket,
-  };
-  virtual Action OnUnsignalledSsrc(WebRtcVideoChannel* channel,
-                                   uint32_t ssrc) = 0;
-  virtual ~UnsignalledSsrcHandler() = default;
-};
-
-// TODO(pbos): Remove, use external handlers only.
-class DefaultUnsignalledSsrcHandler : public UnsignalledSsrcHandler {
- public:
-  DefaultUnsignalledSsrcHandler();
-  Action OnUnsignalledSsrc(WebRtcVideoChannel* channel,
-                           uint32_t ssrc) override;
-
-  rtc::VideoSinkInterface<webrtc::VideoFrame>* GetDefaultSink() const;
-  void SetDefaultSink(WebRtcVideoChannel* channel,
-                      rtc::VideoSinkInterface<webrtc::VideoFrame>* sink);
-
-  virtual ~DefaultUnsignalledSsrcHandler() = default;
-
- private:
-  rtc::VideoSinkInterface<webrtc::VideoFrame>* default_sink_;
-};
-
-// WebRtcVideoEngine is used for the new native WebRTC Video API (webrtc:1667).
-class WebRtcVideoEngine {
- public:
-  // Video engine does not take ownership of the video codec factories and the
-  // caller needs to make sure they outlive the video engine. Internal SW video
-  // codecs will be added on top of the external codecs.
-  WebRtcVideoEngine(WebRtcVideoEncoderFactory* external_video_encoder_factory,
-                    WebRtcVideoDecoderFactory* external_video_decoder_factory);
-
-  // These video codec factories represents all video codecs, i.e. both software
-  // and external hardware codecs.
-  WebRtcVideoEngine(
-      std::unique_ptr<webrtc::VideoEncoderFactory> video_encoder_factory,
-      std::unique_ptr<webrtc::VideoDecoderFactory> video_decoder_factory);
-
-  virtual ~WebRtcVideoEngine();
-
-  WebRtcVideoChannel* CreateChannel(webrtc::Call* call,
-                                    const MediaConfig& config,
-                                    const VideoOptions& options);
-
-  std::vector<VideoCodec> codecs() const;
-  RtpCapabilities GetCapabilities() const;
-
- private:
-  const std::unique_ptr<DecoderFactoryAdapter> decoder_factory_;
-  const std::unique_ptr<EncoderFactoryAdapter> encoder_factory_;
-};
-
-class WebRtcVideoChannel : public VideoMediaChannel, public webrtc::Transport {
- public:
-  WebRtcVideoChannel(webrtc::Call* call,
-                     const MediaConfig& config,
-                     const VideoOptions& options,
-                     const EncoderFactoryAdapter* encoder_factory,
-                     const DecoderFactoryAdapter* decoder_factory);
-  ~WebRtcVideoChannel() override;
-
-  // VideoMediaChannel implementation
-  rtc::DiffServCodePoint PreferredDscp() const override;
-
-  bool SetSendParameters(const VideoSendParameters& params) override;
-  bool SetRecvParameters(const VideoRecvParameters& params) override;
-  webrtc::RtpParameters GetRtpSendParameters(uint32_t ssrc) const override;
-  bool SetRtpSendParameters(uint32_t ssrc,
-                            const webrtc::RtpParameters& parameters) override;
-  webrtc::RtpParameters GetRtpReceiveParameters(uint32_t ssrc) const override;
-  bool SetRtpReceiveParameters(
-      uint32_t ssrc,
-      const webrtc::RtpParameters& parameters) override;
-  bool GetSendCodec(VideoCodec* send_codec) override;
-  bool SetSend(bool send) override;
-  bool SetVideoSend(
-      uint32_t ssrc,
-      bool enable,
-      const VideoOptions* options,
-      rtc::VideoSourceInterface<webrtc::VideoFrame>* source) override;
-  bool AddSendStream(const StreamParams& sp) override;
-  bool RemoveSendStream(uint32_t ssrc) override;
-  bool AddRecvStream(const StreamParams& sp) override;
-  bool AddRecvStream(const StreamParams& sp, bool default_stream);
-  bool RemoveRecvStream(uint32_t ssrc) override;
-  bool SetSink(uint32_t ssrc,
-               rtc::VideoSinkInterface<webrtc::VideoFrame>* sink) override;
-  void FillBitrateInfo(BandwidthEstimationInfo* bwe_info) override;
-  bool GetStats(VideoMediaInfo* info) override;
-
-  void OnPacketReceived(rtc::CopyOnWriteBuffer* packet,
-                        const rtc::PacketTime& packet_time) override;
-  void OnRtcpReceived(rtc::CopyOnWriteBuffer* packet,
-                      const rtc::PacketTime& packet_time) override;
-  void OnReadyToSend(bool ready) override;
-  void OnNetworkRouteChanged(const std::string& transport_name,
-                             const rtc::NetworkRoute& network_route) override;
-  void OnTransportOverheadChanged(int transport_overhead_per_packet) override;
-  void SetInterface(NetworkInterface* iface) override;
-
-  // Implemented for VideoMediaChannelTest.
-  bool sending() const { return sending_; }
-
-  rtc::Optional<uint32_t> GetDefaultReceiveStreamSsrc();
-
-  // AdaptReason is used for expressing why a WebRtcVideoSendStream request
-  // a lower input frame size than the currently configured camera input frame
-  // size. There can be more than one reason OR:ed together.
-  enum AdaptReason {
-    ADAPTREASON_NONE = 0,
-    ADAPTREASON_CPU = 1,
-    ADAPTREASON_BANDWIDTH = 2,
-  };
-
-  static constexpr int kDefaultQpMax = 56;
-
- private:
-  class WebRtcVideoReceiveStream;
-  struct VideoCodecSettings {
-    VideoCodecSettings();
-
-    // Checks if all members of |*this| are equal to the corresponding members
-    // of |other|.
-    bool operator==(const VideoCodecSettings& other) const;
-    bool operator!=(const VideoCodecSettings& other) const;
-
-    // Checks if all members of |a|, except |flexfec_payload_type|, are equal
-    // to the corresponding members of |b|.
-    static bool EqualsDisregardingFlexfec(const VideoCodecSettings& a,
-                                          const VideoCodecSettings& b);
-
-    VideoCodec codec;
-    webrtc::UlpfecConfig ulpfec;
-    int flexfec_payload_type;
-    int rtx_payload_type;
-  };
-
-  struct ChangedSendParameters {
-    // These optionals are unset if not changed.
-    rtc::Optional<VideoCodecSettings> codec;
-    rtc::Optional<std::vector<webrtc::RtpExtension>> rtp_header_extensions;
-    rtc::Optional<int> max_bandwidth_bps;
-    rtc::Optional<bool> conference_mode;
-    rtc::Optional<webrtc::RtcpMode> rtcp_mode;
-  };
-
-  struct ChangedRecvParameters {
-    // These optionals are unset if not changed.
-    rtc::Optional<std::vector<VideoCodecSettings>> codec_settings;
-    rtc::Optional<std::vector<webrtc::RtpExtension>> rtp_header_extensions;
-    // Keep track of the FlexFEC payload type separately from |codec_settings|.
-    // This allows us to recreate the FlexfecReceiveStream separately from the
-    // VideoReceiveStream when the FlexFEC payload type is changed.
-    rtc::Optional<int> flexfec_payload_type;
-  };
-
-  bool GetChangedSendParameters(const VideoSendParameters& params,
-                                ChangedSendParameters* changed_params) const;
-  bool GetChangedRecvParameters(const VideoRecvParameters& params,
-                                ChangedRecvParameters* changed_params) const;
-
-  void SetMaxSendBandwidth(int bps);
-
-  void ConfigureReceiverRtp(
-      webrtc::VideoReceiveStream::Config* config,
-      webrtc::FlexfecReceiveStream::Config* flexfec_config,
-      const StreamParams& sp) const;
-  bool ValidateSendSsrcAvailability(const StreamParams& sp) const
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(stream_crit_);
-  bool ValidateReceiveSsrcAvailability(const StreamParams& sp) const
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(stream_crit_);
-  void DeleteReceiveStream(WebRtcVideoReceiveStream* stream)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(stream_crit_);
-
-  static std::string CodecSettingsVectorToString(
-      const std::vector<VideoCodecSettings>& codecs);
-
-  // Wrapper for the sender part.
-  class WebRtcVideoSendStream
-      : public rtc::VideoSourceInterface<webrtc::VideoFrame> {
-   public:
-    WebRtcVideoSendStream(
-        webrtc::Call* call,
-        const StreamParams& sp,
-        webrtc::VideoSendStream::Config config,
-        const VideoOptions& options,
-        const EncoderFactoryAdapter* encoder_factory,
-        bool enable_cpu_overuse_detection,
-        int max_bitrate_bps,
-        const rtc::Optional<VideoCodecSettings>& codec_settings,
-        const rtc::Optional<std::vector<webrtc::RtpExtension>>& rtp_extensions,
-        const VideoSendParameters& send_params);
-    virtual ~WebRtcVideoSendStream();
-
-    void SetSendParameters(const ChangedSendParameters& send_params);
-    bool SetRtpParameters(const webrtc::RtpParameters& parameters);
-    webrtc::RtpParameters GetRtpParameters() const;
-
-    // Implements rtc::VideoSourceInterface<webrtc::VideoFrame>.
-    // WebRtcVideoSendStream acts as a source to the webrtc::VideoSendStream
-    // in |stream_|. This is done to proxy VideoSinkWants from the encoder to
-    // the worker thread.
-    void AddOrUpdateSink(rtc::VideoSinkInterface<webrtc::VideoFrame>* sink,
-                         const rtc::VideoSinkWants& wants) override;
-    void RemoveSink(rtc::VideoSinkInterface<webrtc::VideoFrame>* sink) override;
-
-    bool SetVideoSend(bool mute,
-                      const VideoOptions* options,
-                      rtc::VideoSourceInterface<webrtc::VideoFrame>* source);
-
-    void SetSend(bool send);
-
-    const std::vector<uint32_t>& GetSsrcs() const;
-    VideoSenderInfo GetVideoSenderInfo(bool log_stats);
-    void FillBitrateInfo(BandwidthEstimationInfo* bwe_info);
-
-   private:
-    // Parameters needed to reconstruct the underlying stream.
-    // webrtc::VideoSendStream doesn't support setting a lot of options on the
-    // fly, so when those need to be changed we tear down and reconstruct with
-    // similar parameters depending on which options changed etc.
-    struct VideoSendStreamParameters {
-      VideoSendStreamParameters(
-          webrtc::VideoSendStream::Config config,
-          const VideoOptions& options,
-          int max_bitrate_bps,
-          const rtc::Optional<VideoCodecSettings>& codec_settings);
-      webrtc::VideoSendStream::Config config;
-      VideoOptions options;
-      int max_bitrate_bps;
-      bool conference_mode;
-      rtc::Optional<VideoCodecSettings> codec_settings;
-      // Sent resolutions + bitrates etc. by the underlying VideoSendStream,
-      // typically changes when setting a new resolution or reconfiguring
-      // bitrates.
-      webrtc::VideoEncoderConfig encoder_config;
-    };
-
-    rtc::scoped_refptr<webrtc::VideoEncoderConfig::EncoderSpecificSettings>
-    ConfigureVideoEncoderSettings(const VideoCodec& codec);
-    void SetCodec(const VideoCodecSettings& codec,
-                  bool force_encoder_allocation);
-    void RecreateWebRtcStream();
-    webrtc::VideoEncoderConfig CreateVideoEncoderConfig(
-        const VideoCodec& codec) const;
-    void ReconfigureEncoder();
-    bool ValidateRtpParameters(const webrtc::RtpParameters& parameters);
-
-    // Calls Start or Stop according to whether or not |sending_| is true,
-    // and whether or not the encoding in |rtp_parameters_| is active.
-    void UpdateSendState();
-
-    webrtc::VideoSendStream::DegradationPreference GetDegradationPreference()
-        const RTC_EXCLUSIVE_LOCKS_REQUIRED(&thread_checker_);
-
-    rtc::ThreadChecker thread_checker_;
-    rtc::AsyncInvoker invoker_;
-    rtc::Thread* worker_thread_;
-    const std::vector<uint32_t> ssrcs_ RTC_ACCESS_ON(&thread_checker_);
-    const std::vector<SsrcGroup> ssrc_groups_ RTC_ACCESS_ON(&thread_checker_);
-    webrtc::Call* const call_;
-    const bool enable_cpu_overuse_detection_;
-    rtc::VideoSourceInterface<webrtc::VideoFrame>* source_
-        RTC_ACCESS_ON(&thread_checker_);
-    const EncoderFactoryAdapter* const encoder_factory_
-        RTC_ACCESS_ON(&thread_checker_);
-
-    webrtc::VideoSendStream* stream_ RTC_ACCESS_ON(&thread_checker_);
-    rtc::VideoSinkInterface<webrtc::VideoFrame>* encoder_sink_
-        RTC_ACCESS_ON(&thread_checker_);
-    // Contains settings that are the same for all streams in the MediaChannel,
-    // such as codecs, header extensions, and the global bitrate limit for the
-    // entire channel.
-    VideoSendStreamParameters parameters_ RTC_ACCESS_ON(&thread_checker_);
-    // Contains settings that are unique for each stream, such as max_bitrate.
-    // Does *not* contain codecs, however.
-    // TODO(skvlad): Move ssrcs_ and ssrc_groups_ into rtp_parameters_.
-    // TODO(skvlad): Combine parameters_ and rtp_parameters_ once we have only
-    // one stream per MediaChannel.
-    webrtc::RtpParameters rtp_parameters_ RTC_ACCESS_ON(&thread_checker_);
-    std::unique_ptr<webrtc::VideoEncoder> allocated_encoder_
-        RTC_ACCESS_ON(&thread_checker_);
-    VideoCodec allocated_codec_ RTC_ACCESS_ON(&thread_checker_);
-
-    bool sending_ RTC_ACCESS_ON(&thread_checker_);
-  };
-
-  // Wrapper for the receiver part, contains configs etc. that are needed to
-  // reconstruct the underlying VideoReceiveStream.
-  class WebRtcVideoReceiveStream
-      : public rtc::VideoSinkInterface<webrtc::VideoFrame> {
-   public:
-    WebRtcVideoReceiveStream(
-        webrtc::Call* call,
-        const StreamParams& sp,
-        webrtc::VideoReceiveStream::Config config,
-        const DecoderFactoryAdapter* decoder_factory,
-        bool default_stream,
-        const std::vector<VideoCodecSettings>& recv_codecs,
-        const webrtc::FlexfecReceiveStream::Config& flexfec_config);
-    ~WebRtcVideoReceiveStream();
-
-    const std::vector<uint32_t>& GetSsrcs() const;
-    rtc::Optional<uint32_t> GetFirstPrimarySsrc() const;
-
-    void SetLocalSsrc(uint32_t local_ssrc);
-    // TODO(deadbeef): Move these feedback parameters into the recv parameters.
-    void SetFeedbackParameters(bool nack_enabled,
-                               bool remb_enabled,
-                               bool transport_cc_enabled,
-                               webrtc::RtcpMode rtcp_mode);
-    void SetRecvParameters(const ChangedRecvParameters& recv_params);
-
-    void OnFrame(const webrtc::VideoFrame& frame) override;
-    bool IsDefaultStream() const;
-
-    void SetSink(rtc::VideoSinkInterface<webrtc::VideoFrame>* sink);
-
-    VideoReceiverInfo GetVideoReceiverInfo(bool log_stats);
-
-   private:
-    struct SdpVideoFormatCompare {
-      bool operator()(const webrtc::SdpVideoFormat& lhs,
-                      const webrtc::SdpVideoFormat& rhs) const {
-        return std::tie(lhs.name, lhs.parameters) <
-               std::tie(rhs.name, rhs.parameters);
-      }
-    };
-    typedef std::map<webrtc::SdpVideoFormat,
-                     std::unique_ptr<webrtc::VideoDecoder>,
-                     SdpVideoFormatCompare>
-        DecoderMap;
-
-    void RecreateWebRtcVideoStream();
-    void MaybeRecreateWebRtcFlexfecStream();
-
-    void MaybeAssociateFlexfecWithVideo();
-    void MaybeDissociateFlexfecFromVideo();
-
-    void ConfigureCodecs(const std::vector<VideoCodecSettings>& recv_codecs,
-                         DecoderMap* old_codecs);
-    void ConfigureFlexfecCodec(int flexfec_payload_type);
-
-    std::string GetCodecNameFromPayloadType(int payload_type);
-
-    webrtc::Call* const call_;
-    StreamParams stream_params_;
-
-    // Both |stream_| and |flexfec_stream_| are managed by |this|. They are
-    // destroyed by calling call_->DestroyVideoReceiveStream and
-    // call_->DestroyFlexfecReceiveStream, respectively.
-    webrtc::VideoReceiveStream* stream_;
-    const bool default_stream_;
-    webrtc::VideoReceiveStream::Config config_;
-    webrtc::FlexfecReceiveStream::Config flexfec_config_;
-    webrtc::FlexfecReceiveStream* flexfec_stream_;
-
-    const DecoderFactoryAdapter* decoder_factory_;
-    DecoderMap allocated_decoders_;
-
-    rtc::CriticalSection sink_lock_;
-    rtc::VideoSinkInterface<webrtc::VideoFrame>* sink_
-        RTC_GUARDED_BY(sink_lock_);
-    // Expands remote RTP timestamps to int64_t to be able to estimate how long
-    // the stream has been running.
-    rtc::TimestampWrapAroundHandler timestamp_wraparound_handler_
-        RTC_GUARDED_BY(sink_lock_);
-    int64_t first_frame_timestamp_ RTC_GUARDED_BY(sink_lock_);
-    // Start NTP time is estimated as current remote NTP time (estimated from
-    // RTCP) minus the elapsed time, as soon as remote NTP time is available.
-    int64_t estimated_remote_start_ntp_time_ms_ RTC_GUARDED_BY(sink_lock_);
-  };
-
-  void Construct(webrtc::Call* call, WebRtcVideoEngine* engine);
-
-  bool SendRtp(const uint8_t* data,
-               size_t len,
-               const webrtc::PacketOptions& options) override;
-  bool SendRtcp(const uint8_t* data, size_t len) override;
-
-  static std::vector<VideoCodecSettings> MapCodecs(
-      const std::vector<VideoCodec>& codecs);
-  // Select what video codec will be used for sending, i.e. what codec is used
-  // for local encoding, based on supported remote codecs. The first remote
-  // codec that is supported locally will be selected.
-  rtc::Optional<VideoCodecSettings> SelectSendVideoCodec(
-      const std::vector<VideoCodecSettings>& remote_mapped_codecs) const;
-
-  static bool NonFlexfecReceiveCodecsHaveChanged(
-      std::vector<VideoCodecSettings> before,
-      std::vector<VideoCodecSettings> after);
-
-  void FillSenderStats(VideoMediaInfo* info, bool log_stats);
-  void FillReceiverStats(VideoMediaInfo* info, bool log_stats);
-  void FillBandwidthEstimationStats(const webrtc::Call::Stats& stats,
-                                    VideoMediaInfo* info);
-  void FillSendAndReceiveCodecStats(VideoMediaInfo* video_media_info);
-
-  rtc::ThreadChecker thread_checker_;
-
-  uint32_t rtcp_receiver_report_ssrc_;
-  bool sending_;
-  webrtc::Call* const call_;
-
-  DefaultUnsignalledSsrcHandler default_unsignalled_ssrc_handler_;
-  UnsignalledSsrcHandler* const unsignalled_ssrc_handler_;
-
-  const MediaConfig::Video video_config_;
-
-  rtc::CriticalSection stream_crit_;
-  // Using primary-ssrc (first ssrc) as key.
-  std::map<uint32_t, WebRtcVideoSendStream*> send_streams_
-      RTC_GUARDED_BY(stream_crit_);
-  std::map<uint32_t, WebRtcVideoReceiveStream*> receive_streams_
-      RTC_GUARDED_BY(stream_crit_);
-  std::set<uint32_t> send_ssrcs_ RTC_GUARDED_BY(stream_crit_);
-  std::set<uint32_t> receive_ssrcs_ RTC_GUARDED_BY(stream_crit_);
-
-  rtc::Optional<VideoCodecSettings> send_codec_;
-  rtc::Optional<std::vector<webrtc::RtpExtension>> send_rtp_extensions_;
-
-  const EncoderFactoryAdapter* const encoder_factory_;
-  const DecoderFactoryAdapter* const decoder_factory_;
-  std::vector<VideoCodecSettings> recv_codecs_;
-  std::vector<webrtc::RtpExtension> recv_rtp_extensions_;
-  // See reason for keeping track of the FlexFEC payload type separately in
-  // comment in WebRtcVideoChannel::ChangedRecvParameters.
-  int recv_flexfec_payload_type_;
-  webrtc::Call::Config::BitrateConfig bitrate_config_;
-  // TODO(deadbeef): Don't duplicate information between
-  // send_params/recv_params, rtp_extensions, options, etc.
-  VideoSendParameters send_params_;
-  VideoOptions default_send_options_;
-  VideoRecvParameters recv_params_;
-  int64_t last_stats_log_ms_;
-};
-
-class EncoderStreamFactory
-    : public webrtc::VideoEncoderConfig::VideoStreamFactoryInterface {
- public:
-  EncoderStreamFactory(std::string codec_name,
-                       int max_qp,
-                       int max_framerate,
-                       bool is_screencast,
-                       bool conference_mode);
-
- private:
-  std::vector<webrtc::VideoStream> CreateEncoderStreams(
-      int width,
-      int height,
-      const webrtc::VideoEncoderConfig& encoder_config) override;
-
-  const std::string codec_name_;
-  const int max_qp_;
-  const int max_framerate_;
-  const bool is_screencast_;
-  const bool conference_mode_;
-};
-
-}  // namespace cricket
-
-#endif  // WEBRTC_MEDIA_ENGINE_WEBRTCVIDEOENGINE_H_
diff --git a/media/engine/webrtcvideoengine_unittest.cc b/media/engine/webrtcvideoengine_unittest.cc
deleted file mode 100644
index 195f757..0000000
--- a/media/engine/webrtcvideoengine_unittest.cc
+++ /dev/null
@@ -1,4787 +0,0 @@
-/*
- *  Copyright (c) 2004 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 <algorithm>
-#include <map>
-#include <memory>
-#include <vector>
-
-#include "webrtc/api/video_codecs/sdp_video_format.h"
-#include "webrtc/api/video_codecs/video_decoder_factory.h"
-#include "webrtc/api/video_codecs/video_encoder.h"
-#include "webrtc/api/video_codecs/video_encoder_factory.h"
-#include "webrtc/call/flexfec_receive_stream.h"
-#include "webrtc/common_video/h264/profile_level_id.h"
-#include "webrtc/logging/rtc_event_log/rtc_event_log.h"
-#include "webrtc/media/base/mediaconstants.h"
-#include "webrtc/media/base/rtputils.h"
-#include "webrtc/media/base/testutils.h"
-#include "webrtc/media/base/videoengine_unittest.h"
-#include "webrtc/media/engine/constants.h"
-#include "webrtc/media/engine/fakewebrtccall.h"
-#include "webrtc/media/engine/fakewebrtcvideoengine.h"
-#include "webrtc/media/engine/simulcast.h"
-#include "webrtc/media/engine/webrtcvideoengine.h"
-#include "webrtc/media/engine/webrtcvoiceengine.h"
-#include "webrtc/rtc_base/arraysize.h"
-#include "webrtc/rtc_base/gunit.h"
-#include "webrtc/rtc_base/stringutils.h"
-#include "webrtc/test/field_trial.h"
-#include "webrtc/test/gmock.h"
-
-using webrtc::RtpExtension;
-
-namespace {
-static const int kDefaultQpMax = 56;
-
-static const uint8_t kRedRtxPayloadType = 125;
-
-static const uint32_t kSsrcs1[] = {1};
-static const uint32_t kSsrcs3[] = {1, 2, 3};
-static const uint32_t kRtxSsrcs1[] = {4};
-static const uint32_t kFlexfecSsrc = 5;
-static const uint32_t kIncomingUnsignalledSsrc = 0xC0FFEE;
-static const uint32_t kDefaultRecvSsrc = 0;
-
-static const char kUnsupportedExtensionName[] =
-    "urn:ietf:params:rtp-hdrext:unsupported";
-
-cricket::VideoCodec RemoveFeedbackParams(cricket::VideoCodec&& codec) {
-  codec.feedback_params = cricket::FeedbackParams();
-  return codec;
-}
-
-void VerifyCodecHasDefaultFeedbackParams(const cricket::VideoCodec& codec) {
-  EXPECT_TRUE(codec.HasFeedbackParam(cricket::FeedbackParam(
-      cricket::kRtcpFbParamNack, cricket::kParamValueEmpty)));
-  EXPECT_TRUE(codec.HasFeedbackParam(cricket::FeedbackParam(
-      cricket::kRtcpFbParamNack, cricket::kRtcpFbNackParamPli)));
-  EXPECT_TRUE(codec.HasFeedbackParam(cricket::FeedbackParam(
-      cricket::kRtcpFbParamRemb, cricket::kParamValueEmpty)));
-  EXPECT_TRUE(codec.HasFeedbackParam(cricket::FeedbackParam(
-      cricket::kRtcpFbParamTransportCc, cricket::kParamValueEmpty)));
-  EXPECT_TRUE(codec.HasFeedbackParam(cricket::FeedbackParam(
-      cricket::kRtcpFbParamCcm, cricket::kRtcpFbCcmParamFir)));
-}
-
-// Return true if any codec in |codecs| is an RTX codec with associated payload
-// type |payload_type|.
-bool HasRtxCodec(const std::vector<cricket::VideoCodec>& codecs,
-                 int payload_type) {
-  for (const cricket::VideoCodec& codec : codecs) {
-    int associated_payload_type;
-    if (cricket::CodecNamesEq(codec.name.c_str(), "rtx") &&
-        codec.GetParam(cricket::kCodecParamAssociatedPayloadType,
-                       &associated_payload_type) &&
-        associated_payload_type == payload_type) {
-      return true;
-    }
-  }
-  return false;
-}
-
-// TODO(nisse): Duplicated in call.cc.
-const int* FindKeyByValue(const std::map<int, int>& m, int v) {
-  for (const auto& kv : m) {
-    if (kv.second == v)
-      return &kv.first;
-  }
-  return nullptr;
-}
-
-bool HasRtxReceiveAssociation(
-    const webrtc::VideoReceiveStream::Config& config,
-    int payload_type) {
-  return FindKeyByValue(config.rtp.rtx_associated_payload_types,
-                        payload_type) != nullptr;
-}
-
-// Check that there's an Rtx payload type for each decoder.
-bool VerifyRtxReceiveAssociations(
-    const webrtc::VideoReceiveStream::Config& config) {
-  for (const auto& decoder : config.decoders) {
-    if (!HasRtxReceiveAssociation(config, decoder.payload_type))
-      return false;
-  }
-  return true;
-}
-
-rtc::scoped_refptr<webrtc::VideoFrameBuffer> CreateBlackFrameBuffer(
-    int width,
-    int height) {
-  rtc::scoped_refptr<webrtc::I420Buffer> buffer =
-      webrtc::I420Buffer::Create(width, height);
-  webrtc::I420Buffer::SetBlack(buffer);
-  return buffer;
-}
-
-void VerifySendStreamHasRtxTypes(const webrtc::VideoSendStream::Config& config,
-                                 const std::map<int, int>& rtx_types) {
-  std::map<int, int>::const_iterator it;
-  it = rtx_types.find(config.encoder_settings.payload_type);
-  EXPECT_TRUE(it != rtx_types.end() &&
-              it->second == config.rtp.rtx.payload_type);
-
-  if (config.rtp.ulpfec.red_rtx_payload_type != -1) {
-    it = rtx_types.find(config.rtp.ulpfec.red_payload_type);
-    EXPECT_TRUE(it != rtx_types.end() &&
-                it->second == config.rtp.ulpfec.red_rtx_payload_type);
-  }
-}
-
-cricket::MediaConfig GetMediaConfig() {
-  cricket::MediaConfig media_config;
-  media_config.video.enable_cpu_overuse_detection = false;
-  return media_config;
-}
-
-}  // namespace
-
-namespace cricket {
-class WebRtcVideoEngineTest : public ::testing::Test {
- public:
-  WebRtcVideoEngineTest() : WebRtcVideoEngineTest("") {}
-  explicit WebRtcVideoEngineTest(const char* field_trials)
-      : override_field_trials_(field_trials),
-        call_(webrtc::Call::Create(webrtc::Call::Config(&event_log_))),
-        engine_(&encoder_factory_, &decoder_factory_) {
-    std::vector<VideoCodec> engine_codecs = engine_.codecs();
-    RTC_DCHECK(!engine_codecs.empty());
-    bool codec_set = false;
-    for (const cricket::VideoCodec& codec : engine_codecs) {
-      if (codec.name == "rtx") {
-        int associated_payload_type;
-        if (codec.GetParam(kCodecParamAssociatedPayloadType,
-                           &associated_payload_type)) {
-          default_apt_rtx_types_[associated_payload_type] = codec.id;
-        }
-      } else if (!codec_set && codec.name != "red" && codec.name != "ulpfec") {
-        default_codec_ = codec;
-        codec_set = true;
-      }
-    }
-
-    RTC_DCHECK(codec_set);
-  }
-
- protected:
-  // Find the codec in the engine with the given name. The codec must be
-  // present.
-  cricket::VideoCodec GetEngineCodec(const std::string& name);
-
-  VideoMediaChannel* SetUpForExternalEncoderFactory();
-
-  VideoMediaChannel* SetUpForExternalDecoderFactory(
-      const std::vector<VideoCodec>& codecs);
-
-  void TestExtendedEncoderOveruse(bool use_external_encoder);
-
-  webrtc::test::ScopedFieldTrials override_field_trials_;
-  webrtc::RtcEventLogNullImpl event_log_;
-  // Used in WebRtcVideoEngineVoiceTest, but defined here so it's properly
-  // initialized when the constructor is called.
-  std::unique_ptr<webrtc::Call> call_;
-  // TODO(magjed): Update all tests to use new video codec factories once the
-  // old factories are deprecated,
-  // https://bugs.chromium.org/p/webrtc/issues/detail?id=7925.
-  cricket::FakeWebRtcVideoEncoderFactory encoder_factory_;
-  cricket::FakeWebRtcVideoDecoderFactory decoder_factory_;
-  WebRtcVideoEngine engine_;
-  VideoCodec default_codec_;
-  std::map<int, int> default_apt_rtx_types_;
-};
-
-TEST_F(WebRtcVideoEngineTest, AnnouncesVp9AccordingToBuildFlags) {
-  bool claims_vp9_support = false;
-  for (const cricket::VideoCodec& codec : engine_.codecs()) {
-    if (codec.name == "VP9") {
-      claims_vp9_support = true;
-      break;
-    }
-  }
-#if defined(RTC_DISABLE_VP9)
-  EXPECT_FALSE(claims_vp9_support);
-#else
-  EXPECT_TRUE(claims_vp9_support);
-#endif  // defined(RTC_DISABLE_VP9)
-}
-
-TEST_F(WebRtcVideoEngineTest, DefaultRtxCodecHasAssociatedPayloadTypeSet) {
-  std::vector<VideoCodec> engine_codecs = engine_.codecs();
-  for (size_t i = 0; i < engine_codecs.size(); ++i) {
-    if (engine_codecs[i].name != kRtxCodecName)
-      continue;
-    int associated_payload_type;
-    EXPECT_TRUE(engine_codecs[i].GetParam(kCodecParamAssociatedPayloadType,
-                                          &associated_payload_type));
-    EXPECT_EQ(default_codec_.id, associated_payload_type);
-    return;
-  }
-  FAIL() << "No RTX codec found among default codecs.";
-}
-
-TEST_F(WebRtcVideoEngineTest, SupportsTimestampOffsetHeaderExtension) {
-  RtpCapabilities capabilities = engine_.GetCapabilities();
-  ASSERT_FALSE(capabilities.header_extensions.empty());
-  for (const RtpExtension& extension : capabilities.header_extensions) {
-    if (extension.uri == RtpExtension::kTimestampOffsetUri) {
-      EXPECT_EQ(RtpExtension::kTimestampOffsetDefaultId, extension.id);
-      return;
-    }
-  }
-  FAIL() << "Timestamp offset extension not in header-extension list.";
-}
-
-TEST_F(WebRtcVideoEngineTest, SupportsAbsoluteSenderTimeHeaderExtension) {
-  RtpCapabilities capabilities = engine_.GetCapabilities();
-  ASSERT_FALSE(capabilities.header_extensions.empty());
-  for (const RtpExtension& extension : capabilities.header_extensions) {
-    if (extension.uri == RtpExtension::kAbsSendTimeUri) {
-      EXPECT_EQ(RtpExtension::kAbsSendTimeDefaultId, extension.id);
-      return;
-    }
-  }
-  FAIL() << "Absolute Sender Time extension not in header-extension list.";
-}
-
-TEST_F(WebRtcVideoEngineTest, SupportsTransportSequenceNumberHeaderExtension) {
-  RtpCapabilities capabilities = engine_.GetCapabilities();
-  ASSERT_FALSE(capabilities.header_extensions.empty());
-  for (const RtpExtension& extension : capabilities.header_extensions) {
-    if (extension.uri == RtpExtension::kTransportSequenceNumberUri) {
-      EXPECT_EQ(RtpExtension::kTransportSequenceNumberDefaultId, extension.id);
-      return;
-    }
-  }
-  FAIL() << "Transport sequence number extension not in header-extension list.";
-}
-
-TEST_F(WebRtcVideoEngineTest, SupportsVideoRotationHeaderExtension) {
-  RtpCapabilities capabilities = engine_.GetCapabilities();
-  ASSERT_FALSE(capabilities.header_extensions.empty());
-  for (const RtpExtension& extension : capabilities.header_extensions) {
-    if (extension.uri == RtpExtension::kVideoRotationUri) {
-      EXPECT_EQ(RtpExtension::kVideoRotationDefaultId, extension.id);
-      return;
-    }
-  }
-  FAIL() << "Video Rotation extension not in header-extension list.";
-}
-
-TEST_F(WebRtcVideoEngineTest, CVOSetHeaderExtensionBeforeCapturer) {
-  // Allocate the capturer first to prevent early destruction before channel's
-  // dtor is called.
-  cricket::FakeVideoCapturer capturer;
-
-  encoder_factory_.AddSupportedVideoCodecType("VP8");
-
-  std::unique_ptr<VideoMediaChannel> channel(SetUpForExternalEncoderFactory());
-  EXPECT_TRUE(channel->AddSendStream(StreamParams::CreateLegacy(kSsrc)));
-
-  // Add CVO extension.
-  const int id = 1;
-  cricket::VideoSendParameters parameters;
-  parameters.codecs.push_back(GetEngineCodec("VP8"));
-  parameters.extensions.push_back(
-      RtpExtension(RtpExtension::kVideoRotationUri, id));
-  EXPECT_TRUE(channel->SetSendParameters(parameters));
-
-  // Set capturer.
-  EXPECT_TRUE(channel->SetVideoSend(kSsrc, true, nullptr, &capturer));
-
-  // Verify capturer has turned off applying rotation.
-  EXPECT_FALSE(capturer.apply_rotation());
-
-  // Verify removing header extension turns on applying rotation.
-  parameters.extensions.clear();
-  EXPECT_TRUE(channel->SetSendParameters(parameters));
-  EXPECT_TRUE(capturer.apply_rotation());
-}
-
-TEST_F(WebRtcVideoEngineTest, CVOSetHeaderExtensionBeforeAddSendStream) {
-  // Allocate the capturer first to prevent early destruction before channel's
-  // dtor is called.
-  cricket::FakeVideoCapturer capturer;
-
-  encoder_factory_.AddSupportedVideoCodecType("VP8");
-
-  std::unique_ptr<VideoMediaChannel> channel(SetUpForExternalEncoderFactory());
-  // Add CVO extension.
-  const int id = 1;
-  cricket::VideoSendParameters parameters;
-  parameters.codecs.push_back(GetEngineCodec("VP8"));
-  parameters.extensions.push_back(
-      RtpExtension(RtpExtension::kVideoRotationUri, id));
-  EXPECT_TRUE(channel->SetSendParameters(parameters));
-  EXPECT_TRUE(channel->AddSendStream(StreamParams::CreateLegacy(kSsrc)));
-
-  // Set capturer.
-  EXPECT_TRUE(channel->SetVideoSend(kSsrc, true, nullptr, &capturer));
-
-  // Verify capturer has turned off applying rotation.
-  EXPECT_FALSE(capturer.apply_rotation());
-}
-
-TEST_F(WebRtcVideoEngineTest, CVOSetHeaderExtensionAfterCapturer) {
-  cricket::FakeVideoCapturer capturer;
-
-  encoder_factory_.AddSupportedVideoCodecType("VP8");
-  encoder_factory_.AddSupportedVideoCodecType("VP9");
-
-  std::unique_ptr<VideoMediaChannel> channel(SetUpForExternalEncoderFactory());
-  EXPECT_TRUE(channel->AddSendStream(StreamParams::CreateLegacy(kSsrc)));
-
-  // Set capturer.
-  EXPECT_TRUE(channel->SetVideoSend(kSsrc, true, nullptr, &capturer));
-
-  // Verify capturer has turned on applying rotation.
-  EXPECT_TRUE(capturer.apply_rotation());
-
-  // Add CVO extension.
-  const int id = 1;
-  cricket::VideoSendParameters parameters;
-  parameters.codecs.push_back(GetEngineCodec("VP8"));
-  parameters.codecs.push_back(GetEngineCodec("VP9"));
-  parameters.extensions.push_back(
-      RtpExtension(RtpExtension::kVideoRotationUri, id));
-  // Also remove the first codec to trigger a codec change as well.
-  parameters.codecs.erase(parameters.codecs.begin());
-  EXPECT_TRUE(channel->SetSendParameters(parameters));
-
-  // Verify capturer has turned off applying rotation.
-  EXPECT_FALSE(capturer.apply_rotation());
-
-  // Verify removing header extension turns on applying rotation.
-  parameters.extensions.clear();
-  EXPECT_TRUE(channel->SetSendParameters(parameters));
-  EXPECT_TRUE(capturer.apply_rotation());
-}
-
-TEST_F(WebRtcVideoEngineTest, SetSendFailsBeforeSettingCodecs) {
-  std::unique_ptr<VideoMediaChannel> channel(
-      engine_.CreateChannel(call_.get(), GetMediaConfig(), VideoOptions()));
-
-  EXPECT_TRUE(channel->AddSendStream(StreamParams::CreateLegacy(123)));
-
-  EXPECT_FALSE(channel->SetSend(true))
-      << "Channel should not start without codecs.";
-  EXPECT_TRUE(channel->SetSend(false))
-      << "Channel should be stoppable even without set codecs.";
-}
-
-TEST_F(WebRtcVideoEngineTest, GetStatsWithoutSendCodecsSetDoesNotCrash) {
-  std::unique_ptr<VideoMediaChannel> channel(
-      engine_.CreateChannel(call_.get(), GetMediaConfig(), VideoOptions()));
-  EXPECT_TRUE(channel->AddSendStream(StreamParams::CreateLegacy(123)));
-  VideoMediaInfo info;
-  channel->GetStats(&info);
-}
-
-TEST_F(WebRtcVideoEngineTest, UseExternalFactoryForVp8WhenSupported) {
-  encoder_factory_.AddSupportedVideoCodecType("VP8");
-
-  std::unique_ptr<VideoMediaChannel> channel(SetUpForExternalEncoderFactory());
-  channel->OnReadyToSend(true);
-
-  EXPECT_TRUE(
-      channel->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc)));
-  EXPECT_EQ(0, encoder_factory_.GetNumCreatedEncoders());
-  EXPECT_TRUE(channel->SetSend(true));
-  cricket::FakeVideoCapturer capturer;
-  EXPECT_TRUE(channel->SetVideoSend(kSsrc, true, nullptr, &capturer));
-  EXPECT_EQ(cricket::CS_RUNNING,
-            capturer.Start(capturer.GetSupportedFormats()->front()));
-  EXPECT_TRUE(capturer.CaptureFrame());
-  // Sending one frame will have allocate the encoder.
-  ASSERT_TRUE(encoder_factory_.WaitForCreatedVideoEncoders(1));
-  EXPECT_TRUE_WAIT(encoder_factory_.encoders()[0]->GetNumEncodedFrames() > 0,
-                   kTimeout);
-
-  int num_created_encoders = encoder_factory_.GetNumCreatedEncoders();
-  EXPECT_EQ(num_created_encoders, 1);
-
-  // Setting codecs of the same type should not reallocate any encoders
-  // (expecting a no-op).
-  cricket::VideoSendParameters parameters;
-  parameters.codecs.push_back(GetEngineCodec("VP8"));
-  EXPECT_TRUE(channel->SetSendParameters(parameters));
-  EXPECT_EQ(num_created_encoders, encoder_factory_.GetNumCreatedEncoders());
-
-  // Remove stream previously added to free the external encoder instance.
-  EXPECT_TRUE(channel->RemoveSendStream(kSsrc));
-  EXPECT_EQ(0u, encoder_factory_.encoders().size());
-}
-
-// Test that when an external encoder factory supports a codec we don't
-// internally support, we still add an RTX codec for it.
-// TODO(deadbeef): Currently this test is only effective if WebRTC is
-// built with no internal H264 support. This test should be updated
-// if/when we start adding RTX codecs for unrecognized codec names.
-TEST_F(WebRtcVideoEngineTest, RtxCodecAddedForExternalCodec) {
-  using webrtc::H264::ProfileLevelIdToString;
-  using webrtc::H264::ProfileLevelId;
-  using webrtc::H264::kLevel1;
-  cricket::VideoCodec h264_constrained_baseline("H264");
-  h264_constrained_baseline.params[kH264FmtpProfileLevelId] =
-      *ProfileLevelIdToString(
-          ProfileLevelId(webrtc::H264::kProfileConstrainedBaseline, kLevel1));
-  cricket::VideoCodec h264_constrained_high("H264");
-  h264_constrained_high.params[kH264FmtpProfileLevelId] =
-      *ProfileLevelIdToString(
-          ProfileLevelId(webrtc::H264::kProfileConstrainedHigh, kLevel1));
-  cricket::VideoCodec h264_high("H264");
-  h264_high.params[kH264FmtpProfileLevelId] = *ProfileLevelIdToString(
-      ProfileLevelId(webrtc::H264::kProfileHigh, kLevel1));
-
-  encoder_factory_.AddSupportedVideoCodec(h264_constrained_baseline);
-  encoder_factory_.AddSupportedVideoCodec(h264_constrained_high);
-  encoder_factory_.AddSupportedVideoCodec(h264_high);
-
-  // First figure out what payload types the test codecs got assigned.
-  const std::vector<cricket::VideoCodec> codecs = engine_.codecs();
-  // Now search for RTX codecs for them. Expect that they all have associated
-  // RTX codecs.
-  EXPECT_TRUE(HasRtxCodec(
-      codecs, FindMatchingCodec(codecs, h264_constrained_baseline)->id));
-  EXPECT_TRUE(HasRtxCodec(
-      codecs, FindMatchingCodec(codecs, h264_constrained_high)->id));
-  EXPECT_TRUE(HasRtxCodec(
-      codecs, FindMatchingCodec(codecs, h264_high)->id));
-}
-
-void WebRtcVideoEngineTest::TestExtendedEncoderOveruse(
-    bool use_external_encoder) {
-  std::unique_ptr<VideoMediaChannel> channel;
-  FakeCall* fake_call = new FakeCall(webrtc::Call::Config(&event_log_));
-  call_.reset(fake_call);
-  if (use_external_encoder) {
-    encoder_factory_.AddSupportedVideoCodecType("VP8");
-    channel.reset(SetUpForExternalEncoderFactory());
-  } else {
-    channel.reset(
-        engine_.CreateChannel(call_.get(), GetMediaConfig(), VideoOptions()));
-  }
-  ASSERT_TRUE(
-      channel->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc)));
-  cricket::VideoSendParameters parameters;
-  parameters.codecs.push_back(GetEngineCodec("VP8"));
-  EXPECT_TRUE(channel->SetSendParameters(parameters));
-  EXPECT_TRUE(channel->SetSend(true));
-  FakeVideoSendStream* stream = fake_call->GetVideoSendStreams()[0];
-
-  EXPECT_EQ(use_external_encoder,
-            stream->GetConfig().encoder_settings.full_overuse_time);
-  // Remove stream previously added to free the external encoder instance.
-  EXPECT_TRUE(channel->RemoveSendStream(kSsrc));
-}
-
-TEST_F(WebRtcVideoEngineTest, EnablesFullEncoderTimeForExternalEncoders) {
-  TestExtendedEncoderOveruse(true);
-}
-
-TEST_F(WebRtcVideoEngineTest, DisablesFullEncoderTimeForNonExternalEncoders) {
-  TestExtendedEncoderOveruse(false);
-}
-
-#if !defined(RTC_DISABLE_VP9)
-TEST_F(WebRtcVideoEngineTest, CanConstructDecoderForVp9EncoderFactory) {
-  encoder_factory_.AddSupportedVideoCodecType("VP9");
-
-  std::unique_ptr<VideoMediaChannel> channel(SetUpForExternalEncoderFactory());
-
-  EXPECT_TRUE(
-      channel->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc)));
-}
-#endif  // !defined(RTC_DISABLE_VP9)
-
-TEST_F(WebRtcVideoEngineTest, PropagatesInputFrameTimestamp) {
-  encoder_factory_.AddSupportedVideoCodecType("VP8");
-  FakeCall* fake_call = new FakeCall(webrtc::Call::Config(&event_log_));
-  call_.reset(fake_call);
-  std::unique_ptr<VideoMediaChannel> channel(SetUpForExternalEncoderFactory());
-
-  EXPECT_TRUE(
-      channel->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc)));
-
-  FakeVideoCapturer capturer;
-  EXPECT_TRUE(channel->SetVideoSend(kSsrc, true, nullptr, &capturer));
-  capturer.Start(cricket::VideoFormat(1280, 720,
-                                      cricket::VideoFormat::FpsToInterval(60),
-                                      cricket::FOURCC_I420));
-  channel->SetSend(true);
-
-  FakeVideoSendStream* stream = fake_call->GetVideoSendStreams()[0];
-
-  EXPECT_TRUE(capturer.CaptureFrame());
-  int64_t last_timestamp = stream->GetLastTimestamp();
-  for (int i = 0; i < 10; i++) {
-    EXPECT_TRUE(capturer.CaptureFrame());
-    int64_t timestamp = stream->GetLastTimestamp();
-    int64_t interval = timestamp - last_timestamp;
-
-    // Precision changes from nanosecond to millisecond.
-    // Allow error to be no more than 1.
-    EXPECT_NEAR(cricket::VideoFormat::FpsToInterval(60) / 1E6, interval, 1);
-
-    last_timestamp = timestamp;
-  }
-
-  capturer.Start(cricket::VideoFormat(1280, 720,
-                                      cricket::VideoFormat::FpsToInterval(30),
-                                      cricket::FOURCC_I420));
-
-  EXPECT_TRUE(capturer.CaptureFrame());
-  last_timestamp = stream->GetLastTimestamp();
-  for (int i = 0; i < 10; i++) {
-    EXPECT_TRUE(capturer.CaptureFrame());
-    int64_t timestamp = stream->GetLastTimestamp();
-    int64_t interval = timestamp - last_timestamp;
-
-    // Precision changes from nanosecond to millisecond.
-    // Allow error to be no more than 1.
-    EXPECT_NEAR(cricket::VideoFormat::FpsToInterval(30) / 1E6, interval, 1);
-
-    last_timestamp = timestamp;
-  }
-
-  // Remove stream previously added to free the external encoder instance.
-  EXPECT_TRUE(channel->RemoveSendStream(kSsrc));
-}
-
-cricket::VideoCodec WebRtcVideoEngineTest::GetEngineCodec(
-    const std::string& name) {
-  for (const cricket::VideoCodec& engine_codec : engine_.codecs()) {
-    if (CodecNamesEq(name, engine_codec.name))
-      return engine_codec;
-  }
-  // This point should never be reached.
-  ADD_FAILURE() << "Unrecognized codec name: " << name;
-  return cricket::VideoCodec();
-}
-
-VideoMediaChannel* WebRtcVideoEngineTest::SetUpForExternalEncoderFactory() {
-  VideoMediaChannel* channel =
-      engine_.CreateChannel(call_.get(), GetMediaConfig(), VideoOptions());
-  cricket::VideoSendParameters parameters;
-  // We need to look up the codec in the engine to get the correct payload type.
-  for (const VideoCodec& codec : encoder_factory_.supported_codecs())
-    parameters.codecs.push_back(GetEngineCodec(codec.name));
-
-  EXPECT_TRUE(channel->SetSendParameters(parameters));
-
-  return channel;
-}
-
-VideoMediaChannel* WebRtcVideoEngineTest::SetUpForExternalDecoderFactory(
-    const std::vector<VideoCodec>& codecs) {
-  VideoMediaChannel* channel =
-      engine_.CreateChannel(call_.get(), GetMediaConfig(), VideoOptions());
-  cricket::VideoRecvParameters parameters;
-  parameters.codecs = codecs;
-  EXPECT_TRUE(channel->SetRecvParameters(parameters));
-
-  return channel;
-}
-
-TEST_F(WebRtcVideoEngineTest, UsesSimulcastAdapterForVp8Factories) {
-  encoder_factory_.AddSupportedVideoCodecType("VP8");
-
-  std::unique_ptr<VideoMediaChannel> channel(SetUpForExternalEncoderFactory());
-
-  std::vector<uint32_t> ssrcs = MAKE_VECTOR(kSsrcs3);
-
-  EXPECT_TRUE(
-      channel->AddSendStream(CreateSimStreamParams("cname", ssrcs)));
-  EXPECT_TRUE(channel->SetSend(true));
-
-  cricket::FakeVideoCapturer capturer;
-  EXPECT_TRUE(channel->SetVideoSend(ssrcs.front(), true, nullptr, &capturer));
-  EXPECT_EQ(cricket::CS_RUNNING,
-            capturer.Start(capturer.GetSupportedFormats()->front()));
-  EXPECT_TRUE(capturer.CaptureFrame());
-
-  ASSERT_TRUE(encoder_factory_.WaitForCreatedVideoEncoders(2));
-
-  // Verify that encoders are configured for simulcast through adapter
-  // (increasing resolution and only configured to send one stream each).
-  int prev_width = -1;
-  for (size_t i = 0; i < encoder_factory_.encoders().size(); ++i) {
-    ASSERT_TRUE(encoder_factory_.encoders()[i]->WaitForInitEncode());
-    webrtc::VideoCodec codec_settings =
-        encoder_factory_.encoders()[i]->GetCodecSettings();
-    EXPECT_EQ(0, codec_settings.numberOfSimulcastStreams);
-    EXPECT_GT(codec_settings.width, prev_width);
-    prev_width = codec_settings.width;
-  }
-
-  EXPECT_TRUE(channel->SetVideoSend(ssrcs.front(), true, nullptr, nullptr));
-
-  channel.reset();
-  ASSERT_EQ(0u, encoder_factory_.encoders().size());
-}
-
-TEST_F(WebRtcVideoEngineTest, ChannelWithExternalH264CanChangeToInternalVp8) {
-  encoder_factory_.AddSupportedVideoCodecType("H264");
-
-  std::unique_ptr<VideoMediaChannel> channel(SetUpForExternalEncoderFactory());
-
-  EXPECT_TRUE(
-      channel->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc)));
-  ASSERT_EQ(1u, encoder_factory_.encoders().size());
-
-  cricket::VideoSendParameters parameters;
-  parameters.codecs.push_back(GetEngineCodec("VP8"));
-  EXPECT_TRUE(channel->SetSendParameters(parameters));
-  ASSERT_EQ(0u, encoder_factory_.encoders().size());
-}
-
-TEST_F(WebRtcVideoEngineTest,
-       DontUseExternalEncoderFactoryForUnsupportedCodecs) {
-  encoder_factory_.AddSupportedVideoCodecType("H264");
-
-  std::unique_ptr<VideoMediaChannel> channel(
-      engine_.CreateChannel(call_.get(), GetMediaConfig(), VideoOptions()));
-  cricket::VideoSendParameters parameters;
-  parameters.codecs.push_back(GetEngineCodec("VP8"));
-  EXPECT_TRUE(channel->SetSendParameters(parameters));
-
-  EXPECT_TRUE(
-      channel->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc)));
-  // Make sure DestroyVideoEncoder was called on the factory.
-  ASSERT_EQ(0u, encoder_factory_.encoders().size());
-}
-
-TEST_F(WebRtcVideoEngineTest,
-       UsesSimulcastAdapterForVp8WithCombinedVP8AndH264Factory) {
-  encoder_factory_.AddSupportedVideoCodecType("VP8");
-  encoder_factory_.AddSupportedVideoCodecType("H264");
-
-  std::unique_ptr<VideoMediaChannel> channel(
-      engine_.CreateChannel(call_.get(), GetMediaConfig(), VideoOptions()));
-  cricket::VideoSendParameters parameters;
-  parameters.codecs.push_back(GetEngineCodec("VP8"));
-  EXPECT_TRUE(channel->SetSendParameters(parameters));
-
-  std::vector<uint32_t> ssrcs = MAKE_VECTOR(kSsrcs3);
-
-  EXPECT_TRUE(
-      channel->AddSendStream(CreateSimStreamParams("cname", ssrcs)));
-  EXPECT_TRUE(channel->SetSend(true));
-
-  // Send a fake frame, or else the media engine will configure the simulcast
-  // encoder adapter at a low-enough size that it'll only create a single
-  // encoder layer.
-  cricket::FakeVideoCapturer capturer;
-  EXPECT_TRUE(channel->SetVideoSend(ssrcs.front(), true, nullptr, &capturer));
-  EXPECT_EQ(cricket::CS_RUNNING,
-            capturer.Start(capturer.GetSupportedFormats()->front()));
-  EXPECT_TRUE(capturer.CaptureFrame());
-
-  ASSERT_TRUE(encoder_factory_.WaitForCreatedVideoEncoders(2));
-  ASSERT_TRUE(encoder_factory_.encoders()[0]->WaitForInitEncode());
-  EXPECT_EQ(webrtc::kVideoCodecVP8,
-            encoder_factory_.encoders()[0]->GetCodecSettings().codecType);
-
-  channel.reset();
-  // Make sure DestroyVideoEncoder was called on the factory.
-  EXPECT_EQ(0u, encoder_factory_.encoders().size());
-}
-
-TEST_F(WebRtcVideoEngineTest,
-       DestroysNonSimulcastEncoderFromCombinedVP8AndH264Factory) {
-  encoder_factory_.AddSupportedVideoCodecType("VP8");
-  encoder_factory_.AddSupportedVideoCodecType("H264");
-
-  std::unique_ptr<VideoMediaChannel> channel(
-      engine_.CreateChannel(call_.get(), GetMediaConfig(), VideoOptions()));
-  cricket::VideoSendParameters parameters;
-  parameters.codecs.push_back(GetEngineCodec("H264"));
-  EXPECT_TRUE(channel->SetSendParameters(parameters));
-
-  EXPECT_TRUE(
-      channel->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc)));
-  ASSERT_EQ(1u, encoder_factory_.encoders().size());
-
-  // Send a frame of 720p. This should trigger a "real" encoder initialization.
-  cricket::VideoFormat format(
-      1280, 720, cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420);
-  cricket::FakeVideoCapturer capturer;
-  EXPECT_TRUE(channel->SetVideoSend(kSsrc, true, nullptr, &capturer));
-  EXPECT_EQ(cricket::CS_RUNNING, capturer.Start(format));
-  EXPECT_TRUE(capturer.CaptureFrame());
-  ASSERT_TRUE(encoder_factory_.encoders()[0]->WaitForInitEncode());
-  EXPECT_EQ(webrtc::kVideoCodecH264,
-            encoder_factory_.encoders()[0]->GetCodecSettings().codecType);
-
-  channel.reset();
-  // Make sure DestroyVideoEncoder was called on the factory.
-  ASSERT_EQ(0u, encoder_factory_.encoders().size());
-}
-
-TEST_F(WebRtcVideoEngineTest, SimulcastDisabledForH264) {
-  encoder_factory_.AddSupportedVideoCodecType("H264");
-
-  std::unique_ptr<VideoMediaChannel> channel(SetUpForExternalEncoderFactory());
-
-  const std::vector<uint32_t> ssrcs = MAKE_VECTOR(kSsrcs3);
-  EXPECT_TRUE(
-      channel->AddSendStream(cricket::CreateSimStreamParams("cname", ssrcs)));
-
-  // Send a frame of 720p. This should trigger a "real" encoder initialization.
-  cricket::VideoFormat format(
-      1280, 720, cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420);
-  cricket::FakeVideoCapturer capturer;
-  EXPECT_TRUE(channel->SetVideoSend(ssrcs[0], true, nullptr, &capturer));
-  EXPECT_EQ(cricket::CS_RUNNING, capturer.Start(format));
-  EXPECT_TRUE(capturer.CaptureFrame());
-
-  ASSERT_EQ(1u, encoder_factory_.encoders().size());
-  FakeWebRtcVideoEncoder* encoder = encoder_factory_.encoders()[0];
-  ASSERT_TRUE(encoder_factory_.encoders()[0]->WaitForInitEncode());
-  EXPECT_EQ(webrtc::kVideoCodecH264, encoder->GetCodecSettings().codecType);
-  EXPECT_EQ(1u, encoder->GetCodecSettings().numberOfSimulcastStreams);
-  EXPECT_TRUE(channel->SetVideoSend(ssrcs[0], true, nullptr, nullptr));
-}
-
-// Test that the FlexFEC field trial properly alters the output of
-// WebRtcVideoEngine::codecs(), for an existing |engine_| object.
-//
-// TODO(brandtr): Remove this test, when the FlexFEC field trial is gone.
-TEST_F(WebRtcVideoEngineTest,
-       Flexfec03SupportedAsInternalCodecBehindFieldTrial) {
-  auto is_flexfec = [](const VideoCodec& codec) {
-    if (codec.name == "flexfec-03")
-      return true;
-    return false;
-  };
-
-  // FlexFEC is not active without field trial.
-  const std::vector<VideoCodec> codecs_before = engine_.codecs();
-  EXPECT_EQ(codecs_before.end(), std::find_if(codecs_before.begin(),
-                                              codecs_before.end(), is_flexfec));
-
-  // FlexFEC is active with field trial.
-  webrtc::test::ScopedFieldTrials override_field_trials_(
-      "WebRTC-FlexFEC-03-Advertised/Enabled/");
-  const std::vector<VideoCodec> codecs_after = engine_.codecs();
-  EXPECT_NE(codecs_after.end(),
-            std::find_if(codecs_after.begin(), codecs_after.end(), is_flexfec));
-}
-
-// Test that external codecs are added to the end of the supported codec list.
-TEST_F(WebRtcVideoEngineTest, ReportSupportedExternalCodecs) {
-  encoder_factory_.AddSupportedVideoCodecType("FakeExternalCodec");
-
-  std::vector<cricket::VideoCodec> codecs(engine_.codecs());
-  ASSERT_GE(codecs.size(), 2u);
-  cricket::VideoCodec internal_codec = codecs.front();
-  cricket::VideoCodec external_codec = codecs.back();
-
-  // The external codec will appear last in the vector.
-  EXPECT_EQ("VP8", internal_codec.name);
-  EXPECT_EQ("FakeExternalCodec", external_codec.name);
-}
-
-// Test that an external codec that was added after the engine was initialized
-// does show up in the codec list after it was added.
-TEST_F(WebRtcVideoEngineTest, ReportSupportedExternalCodecsWithAddedCodec) {
-  // Set up external encoder factory with first codec, and initialize engine.
-  encoder_factory_.AddSupportedVideoCodecType("FakeExternalCodec1");
-
-  // The first external codec will appear last in the vector.
-  std::vector<cricket::VideoCodec> codecs_before(engine_.codecs());
-  EXPECT_EQ("FakeExternalCodec1", codecs_before.back().name);
-
-  // Add second codec.
-  encoder_factory_.AddSupportedVideoCodecType("FakeExternalCodec2");
-  std::vector<cricket::VideoCodec> codecs_after(engine_.codecs());
-  EXPECT_EQ(codecs_before.size() + 1, codecs_after.size());
-  EXPECT_EQ("FakeExternalCodec2", codecs_after.back().name);
-}
-
-TEST_F(WebRtcVideoEngineTest, RegisterExternalDecodersIfSupported) {
-  decoder_factory_.AddSupportedVideoCodecType(webrtc::kVideoCodecVP8);
-  cricket::VideoRecvParameters parameters;
-  parameters.codecs.push_back(GetEngineCodec("VP8"));
-
-  std::unique_ptr<VideoMediaChannel> channel(
-      SetUpForExternalDecoderFactory(parameters.codecs));
-
-  EXPECT_TRUE(
-      channel->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc)));
-  ASSERT_EQ(1u, decoder_factory_.decoders().size());
-
-  // Setting codecs of the same type should not reallocate the decoder.
-  EXPECT_TRUE(channel->SetRecvParameters(parameters));
-  EXPECT_EQ(1, decoder_factory_.GetNumCreatedDecoders());
-
-  // Remove stream previously added to free the external decoder instance.
-  EXPECT_TRUE(channel->RemoveRecvStream(kSsrc));
-  EXPECT_EQ(0u, decoder_factory_.decoders().size());
-}
-
-// Verifies that we can set up decoders that are not internally supported.
-TEST_F(WebRtcVideoEngineTest, RegisterExternalH264DecoderIfSupported) {
-  // TODO(pbos): Do not assume that encoder/decoder support is symmetric. We
-  // can't even query the WebRtcVideoDecoderFactory for supported codecs.
-  // For now we add a FakeWebRtcVideoEncoderFactory to add H264 to supported
-  // codecs.
-  encoder_factory_.AddSupportedVideoCodecType("H264");
-  decoder_factory_.AddSupportedVideoCodecType(webrtc::kVideoCodecH264);
-  std::vector<cricket::VideoCodec> codecs;
-  codecs.push_back(GetEngineCodec("H264"));
-
-  std::unique_ptr<VideoMediaChannel> channel(
-      SetUpForExternalDecoderFactory(codecs));
-
-  EXPECT_TRUE(
-      channel->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc)));
-  ASSERT_EQ(1u, decoder_factory_.decoders().size());
-}
-
-class MockVideoEncoderFactory : public webrtc::VideoEncoderFactory {
- public:
-  MOCK_CONST_METHOD0(GetSupportedFormats,
-                     std::vector<webrtc::SdpVideoFormat>());
-  MOCK_CONST_METHOD1(QueryVideoEncoder,
-                     CodecInfo(const webrtc::SdpVideoFormat&));
-
-  // We need to proxy to a return type that is copyable.
-  std::unique_ptr<webrtc::VideoEncoder> CreateVideoEncoder(
-      const webrtc::SdpVideoFormat& format) {
-    return std::unique_ptr<webrtc::VideoEncoder>(
-        CreateVideoEncoderProxy(format));
-  }
-  MOCK_METHOD1(CreateVideoEncoderProxy,
-               webrtc::VideoEncoder*(const webrtc::SdpVideoFormat&));
-
-  MOCK_METHOD0(Die, void());
-  ~MockVideoEncoderFactory() { Die(); }
-};
-
-class MockVideoDecoderFactory : public webrtc::VideoDecoderFactory {
- public:
-  MOCK_CONST_METHOD0(GetSupportedFormats,
-                     std::vector<webrtc::SdpVideoFormat>());
-
-  // We need to proxy to a return type that is copyable.
-  std::unique_ptr<webrtc::VideoDecoder> CreateVideoDecoder(
-      const webrtc::SdpVideoFormat& format) {
-    return std::unique_ptr<webrtc::VideoDecoder>(
-        CreateVideoDecoderProxy(format));
-  }
-  MOCK_METHOD1(CreateVideoDecoderProxy,
-               webrtc::VideoDecoder*(const webrtc::SdpVideoFormat&));
-
-  MOCK_METHOD0(Die, void());
-  ~MockVideoDecoderFactory() { Die(); }
-};
-
-TEST(WebRtcVideoEngineNewVideoCodecFactoryTest, NullFactories) {
-  std::unique_ptr<webrtc::VideoEncoderFactory> encoder_factory;
-  std::unique_ptr<webrtc::VideoDecoderFactory> decoder_factory;
-  WebRtcVideoEngine engine(std::move(encoder_factory),
-                           std::move(decoder_factory));
-  EXPECT_EQ(0u, engine.codecs().size());
-}
-
-TEST(WebRtcVideoEngineNewVideoCodecFactoryTest, EmptyFactories) {
-  // |engine| take ownership of the factories.
-  MockVideoEncoderFactory* encoder_factory = new MockVideoEncoderFactory();
-  MockVideoDecoderFactory* decoder_factory = new MockVideoDecoderFactory();
-  WebRtcVideoEngine engine(
-      (std::unique_ptr<webrtc::VideoEncoderFactory>(encoder_factory)),
-      (std::unique_ptr<webrtc::VideoDecoderFactory>(decoder_factory)));
-  EXPECT_CALL(*encoder_factory, GetSupportedFormats());
-  EXPECT_EQ(0u, engine.codecs().size());
-  EXPECT_CALL(*encoder_factory, Die());
-  EXPECT_CALL(*decoder_factory, Die());
-}
-
-// Test full behavior in the video engine when video codec factories of the new
-// type are injected supporting the single codec Vp8. Check the returned codecs
-// from the engine and that we will create a Vp8 encoder and decoder using the
-// new factories.
-TEST(WebRtcVideoEngineNewVideoCodecFactoryTest, Vp8) {
-  // |engine| take ownership of the factories.
-  MockVideoEncoderFactory* encoder_factory = new MockVideoEncoderFactory();
-  MockVideoDecoderFactory* decoder_factory = new MockVideoDecoderFactory();
-  WebRtcVideoEngine engine(
-      (std::unique_ptr<webrtc::VideoEncoderFactory>(encoder_factory)),
-      (std::unique_ptr<webrtc::VideoDecoderFactory>(decoder_factory)));
-  const webrtc::SdpVideoFormat vp8_format("VP8");
-  const std::vector<webrtc::SdpVideoFormat> supported_formats = {vp8_format};
-  EXPECT_CALL(*encoder_factory, GetSupportedFormats())
-      .WillRepeatedly(testing::Return(supported_formats));
-
-  // Verify the codecs from the engine.
-  const std::vector<VideoCodec> engine_codecs = engine.codecs();
-  // Verify an RTX codec has been added correctly.
-  EXPECT_EQ(2u, engine_codecs.size());
-  EXPECT_EQ("VP8", engine_codecs.at(0).name);
-  EXPECT_EQ("rtx", engine_codecs.at(1).name);
-  int associated_payload_type;
-  EXPECT_TRUE(engine_codecs.at(1).GetParam(
-      cricket::kCodecParamAssociatedPayloadType, &associated_payload_type));
-  EXPECT_EQ(engine_codecs.at(0).id, associated_payload_type);
-  // Verify default parameters has been added to the VP8 codec.
-  VerifyCodecHasDefaultFeedbackParams(engine_codecs.at(0));
-
-  // Mock encoder creation. |engine| take ownership of the encoder.
-  webrtc::VideoEncoderFactory::CodecInfo codec_info;
-  codec_info.is_hardware_accelerated = false;
-  codec_info.has_internal_source = false;
-  const webrtc::SdpVideoFormat format("VP8");
-  EXPECT_CALL(*encoder_factory, QueryVideoEncoder(format))
-      .WillRepeatedly(testing::Return(codec_info));
-  FakeWebRtcVideoEncoder* const encoder = new FakeWebRtcVideoEncoder();
-  EXPECT_CALL(*encoder_factory, CreateVideoEncoderProxy(format))
-      .WillOnce(testing::Return(encoder));
-
-  // Mock decoder creation. |engine| take ownership of the decoder.
-  FakeWebRtcVideoDecoder* const decoder = new FakeWebRtcVideoDecoder();
-  EXPECT_CALL(*decoder_factory, CreateVideoDecoderProxy(format))
-      .WillOnce(testing::Return(decoder));
-
-  // Create a call.
-  webrtc::RtcEventLogNullImpl event_log;
-  std::unique_ptr<webrtc::Call> call(
-      webrtc::Call::Create(webrtc::Call::Config(&event_log)));
-
-  // Create send channel.
-  const int send_ssrc = 123;
-  std::unique_ptr<VideoMediaChannel> send_channel(
-      engine.CreateChannel(call.get(), GetMediaConfig(), VideoOptions()));
-  cricket::VideoSendParameters send_parameters;
-  send_parameters.codecs.push_back(engine_codecs.at(0));
-  EXPECT_TRUE(send_channel->SetSendParameters(send_parameters));
-  send_channel->OnReadyToSend(true);
-  EXPECT_TRUE(
-      send_channel->AddSendStream(StreamParams::CreateLegacy(send_ssrc)));
-  EXPECT_TRUE(send_channel->SetSend(true));
-
-  // Create recv channel.
-  const int recv_ssrc = 321;
-  std::unique_ptr<VideoMediaChannel> recv_channel(
-      engine.CreateChannel(call.get(), GetMediaConfig(), VideoOptions()));
-  cricket::VideoRecvParameters recv_parameters;
-  recv_parameters.codecs.push_back(engine_codecs.at(0));
-  EXPECT_TRUE(recv_channel->SetRecvParameters(recv_parameters));
-  EXPECT_TRUE(recv_channel->AddRecvStream(
-      cricket::StreamParams::CreateLegacy(recv_ssrc)));
-
-  // Remove streams previously added to free the encoder and decoder instance.
-  EXPECT_CALL(*encoder_factory, Die());
-  EXPECT_CALL(*decoder_factory, Die());
-  EXPECT_TRUE(send_channel->RemoveSendStream(send_ssrc));
-  EXPECT_TRUE(recv_channel->RemoveRecvStream(recv_ssrc));
-}
-
-class WebRtcVideoChannelBaseTest
-    : public VideoMediaChannelTest<WebRtcVideoEngine, WebRtcVideoChannel> {
- protected:
-  typedef VideoMediaChannelTest<WebRtcVideoEngine, WebRtcVideoChannel> Base;
-
-  cricket::VideoCodec GetEngineCodec(const std::string& name) {
-    for (const cricket::VideoCodec& engine_codec : engine_.codecs()) {
-      if (CodecNamesEq(name, engine_codec.name))
-        return engine_codec;
-    }
-    // This point should never be reached.
-    ADD_FAILURE() << "Unrecognized codec name: " << name;
-    return cricket::VideoCodec();
-  }
-
-  cricket::VideoCodec DefaultCodec() override { return GetEngineCodec("VP8"); }
-};
-
-// Verifies that id given in stream params is passed to the decoder factory.
-TEST_F(WebRtcVideoEngineTest, StreamParamsIdPassedToDecoderFactory) {
-  decoder_factory_.AddSupportedVideoCodecType(webrtc::kVideoCodecVP8);
-  cricket::VideoRecvParameters parameters;
-  parameters.codecs.push_back(GetEngineCodec("VP8"));
-
-  std::unique_ptr<VideoMediaChannel> channel(
-      SetUpForExternalDecoderFactory(parameters.codecs));
-
-  StreamParams sp = cricket::StreamParams::CreateLegacy(kSsrc);
-  sp.id = "FakeStreamParamsId";
-  EXPECT_TRUE(channel->AddRecvStream(sp));
-  EXPECT_EQ(1u, decoder_factory_.decoders().size());
-
-  std::vector<cricket::VideoDecoderParams> params = decoder_factory_.params();
-  ASSERT_EQ(1u, params.size());
-  EXPECT_EQ(sp.id, params[0].receive_stream_id);
-}
-
-TEST_F(WebRtcVideoEngineTest, DISABLED_RecreatesEncoderOnContentTypeChange) {
-  encoder_factory_.AddSupportedVideoCodecType("VP8");
-  std::unique_ptr<FakeCall> fake_call(
-      new FakeCall(webrtc::Call::Config(&event_log_)));
-  std::unique_ptr<VideoMediaChannel> channel(SetUpForExternalEncoderFactory());
-  ASSERT_TRUE(
-      channel->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc)));
-  cricket::VideoCodec codec = GetEngineCodec("VP8");
-  cricket::VideoSendParameters parameters;
-  parameters.codecs.push_back(codec);
-  channel->OnReadyToSend(true);
-  channel->SetSend(true);
-  ASSERT_TRUE(channel->SetSendParameters(parameters));
-
-  cricket::FakeVideoCapturer capturer;
-  VideoOptions options;
-  EXPECT_TRUE(channel->SetVideoSend(kSsrc, true, &options, &capturer));
-
-  EXPECT_EQ(cricket::CS_RUNNING,
-            capturer.Start(capturer.GetSupportedFormats()->front()));
-  EXPECT_TRUE(capturer.CaptureFrame());
-  ASSERT_TRUE(encoder_factory_.WaitForCreatedVideoEncoders(1));
-  EXPECT_EQ(webrtc::kRealtimeVideo,
-            encoder_factory_.encoders().back()->GetCodecSettings().mode);
-
-  EXPECT_TRUE(channel->SetVideoSend(kSsrc, true, &options, &capturer));
-  EXPECT_TRUE(capturer.CaptureFrame());
-  // No change in content type, keep current encoder.
-  EXPECT_EQ(1, encoder_factory_.GetNumCreatedEncoders());
-
-  options.is_screencast.emplace(true);
-  EXPECT_TRUE(channel->SetVideoSend(kSsrc, true, &options, &capturer));
-  EXPECT_TRUE(capturer.CaptureFrame());
-  // Change to screen content, recreate encoder. For the simulcast encoder
-  // adapter case, this will result in two calls since InitEncode triggers a
-  // a new instance.
-  ASSERT_TRUE(encoder_factory_.WaitForCreatedVideoEncoders(2));
-  EXPECT_EQ(webrtc::kScreensharing,
-            encoder_factory_.encoders().back()->GetCodecSettings().mode);
-
-  EXPECT_TRUE(channel->SetVideoSend(kSsrc, true, &options, &capturer));
-  EXPECT_TRUE(capturer.CaptureFrame());
-  // Still screen content, no need to update encoder.
-  EXPECT_EQ(2, encoder_factory_.GetNumCreatedEncoders());
-
-  options.is_screencast.emplace(false);
-  options.video_noise_reduction.emplace(false);
-  EXPECT_TRUE(channel->SetVideoSend(kSsrc, true, &options, &capturer));
-  // Change back to regular video content, update encoder. Also change
-  // a non |is_screencast| option just to verify it doesn't affect recreation.
-  EXPECT_TRUE(capturer.CaptureFrame());
-  ASSERT_TRUE(encoder_factory_.WaitForCreatedVideoEncoders(3));
-  EXPECT_EQ(webrtc::kRealtimeVideo,
-            encoder_factory_.encoders().back()->GetCodecSettings().mode);
-
-  // Remove stream previously added to free the external encoder instance.
-  EXPECT_TRUE(channel->RemoveSendStream(kSsrc));
-  EXPECT_EQ(0u, encoder_factory_.encoders().size());
-}
-
-#define WEBRTC_BASE_TEST(test) \
-  TEST_F(WebRtcVideoChannelBaseTest, test) { Base::test(); }
-
-#define WEBRTC_DISABLED_BASE_TEST(test) \
-  TEST_F(WebRtcVideoChannelBaseTest, DISABLED_##test) { Base::test(); }
-
-WEBRTC_BASE_TEST(SetSend);
-WEBRTC_BASE_TEST(SetSendWithoutCodecs);
-WEBRTC_BASE_TEST(SetSendSetsTransportBufferSizes);
-
-WEBRTC_BASE_TEST(GetStats);
-WEBRTC_BASE_TEST(GetStatsMultipleRecvStreams);
-WEBRTC_BASE_TEST(GetStatsMultipleSendStreams);
-
-WEBRTC_BASE_TEST(SetSendBandwidth);
-
-WEBRTC_BASE_TEST(SetSendSsrc);
-WEBRTC_BASE_TEST(SetSendSsrcAfterSetCodecs);
-
-WEBRTC_BASE_TEST(SetSink);
-
-WEBRTC_BASE_TEST(AddRemoveSendStreams);
-
-WEBRTC_BASE_TEST(SimulateConference);
-
-WEBRTC_DISABLED_BASE_TEST(AddRemoveCapturer);
-
-WEBRTC_BASE_TEST(RemoveCapturerWithoutAdd);
-
-WEBRTC_BASE_TEST(AddRemoveCapturerMultipleSources);
-
-WEBRTC_BASE_TEST(RejectEmptyStreamParams);
-
-WEBRTC_BASE_TEST(MultipleSendStreams);
-
-TEST_F(WebRtcVideoChannelBaseTest, SendAndReceiveVp8Vga) {
-  SendAndReceive(GetEngineCodec("VP8"));
-}
-
-TEST_F(WebRtcVideoChannelBaseTest, SendAndReceiveVp8Qvga) {
-  SendAndReceive(GetEngineCodec("VP8"));
-}
-
-TEST_F(WebRtcVideoChannelBaseTest, SendAndReceiveVp8SvcQqvga) {
-  SendAndReceive(GetEngineCodec("VP8"));
-}
-
-TEST_F(WebRtcVideoChannelBaseTest, TwoStreamsSendAndReceive) {
-  // Set a high bitrate to not be downscaled by VP8 due to low initial start
-  // bitrates. This currently happens at <250k, and two streams sharing 300k
-  // initially will use QVGA instead of VGA.
-  // TODO(pbos): Set up the quality scaler so that both senders reliably start
-  // at QVGA, then verify that instead.
-  cricket::VideoCodec codec = GetEngineCodec("VP8");
-  codec.params[kCodecParamStartBitrate] = "1000000";
-  Base::TwoStreamsSendAndReceive(codec);
-}
-
-class WebRtcVideoChannelTest : public WebRtcVideoEngineTest {
- public:
-  WebRtcVideoChannelTest() : WebRtcVideoChannelTest("") {}
-  explicit WebRtcVideoChannelTest(const char* field_trials)
-      : WebRtcVideoEngineTest(field_trials), last_ssrc_(0) {}
-  void SetUp() override {
-    fake_call_.reset(new FakeCall(webrtc::Call::Config(&event_log_)));
-    channel_.reset(engine_.CreateChannel(fake_call_.get(), GetMediaConfig(),
-                                         VideoOptions()));
-    channel_->OnReadyToSend(true);
-    last_ssrc_ = 123;
-    send_parameters_.codecs = engine_.codecs();
-    recv_parameters_.codecs = engine_.codecs();
-    ASSERT_TRUE(channel_->SetSendParameters(send_parameters_));
-  }
-
- protected:
-  FakeVideoSendStream* AddSendStream() {
-    return AddSendStream(StreamParams::CreateLegacy(++last_ssrc_));
-  }
-
-  FakeVideoSendStream* AddSendStream(const StreamParams& sp) {
-    size_t num_streams = fake_call_->GetVideoSendStreams().size();
-    EXPECT_TRUE(channel_->AddSendStream(sp));
-    std::vector<FakeVideoSendStream*> streams =
-        fake_call_->GetVideoSendStreams();
-    EXPECT_EQ(num_streams + 1, streams.size());
-    return streams[streams.size() - 1];
-  }
-
-  std::vector<FakeVideoSendStream*> GetFakeSendStreams() {
-    return fake_call_->GetVideoSendStreams();
-  }
-
-  FakeVideoReceiveStream* AddRecvStream() {
-    return AddRecvStream(StreamParams::CreateLegacy(++last_ssrc_));
-  }
-
-  FakeVideoReceiveStream* AddRecvStream(const StreamParams& sp) {
-    size_t num_streams = fake_call_->GetVideoReceiveStreams().size();
-    EXPECT_TRUE(channel_->AddRecvStream(sp));
-    std::vector<FakeVideoReceiveStream*> streams =
-        fake_call_->GetVideoReceiveStreams();
-    EXPECT_EQ(num_streams + 1, streams.size());
-    return streams[streams.size() - 1];
-  }
-
-  void SetSendCodecsShouldWorkForBitrates(const char* min_bitrate_kbps,
-                                          int expected_min_bitrate_bps,
-                                          const char* start_bitrate_kbps,
-                                          int expected_start_bitrate_bps,
-                                          const char* max_bitrate_kbps,
-                                          int expected_max_bitrate_bps) {
-    auto& codecs = send_parameters_.codecs;
-    codecs.clear();
-    codecs.push_back(GetEngineCodec("VP8"));
-    codecs[0].params[kCodecParamMinBitrate] = min_bitrate_kbps;
-    codecs[0].params[kCodecParamStartBitrate] = start_bitrate_kbps;
-    codecs[0].params[kCodecParamMaxBitrate] = max_bitrate_kbps;
-    EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
-
-    EXPECT_EQ(expected_min_bitrate_bps,
-              fake_call_->GetConfig().bitrate_config.min_bitrate_bps);
-    EXPECT_EQ(expected_start_bitrate_bps,
-              fake_call_->GetConfig().bitrate_config.start_bitrate_bps);
-    EXPECT_EQ(expected_max_bitrate_bps,
-              fake_call_->GetConfig().bitrate_config.max_bitrate_bps);
-  }
-
-  void TestSetSendRtpHeaderExtensions(const std::string& ext_uri) {
-    // Enable extension.
-    const int id = 1;
-    cricket::VideoSendParameters parameters = send_parameters_;
-    parameters.extensions.push_back(RtpExtension(ext_uri, id));
-    EXPECT_TRUE(channel_->SetSendParameters(parameters));
-    FakeVideoSendStream* send_stream =
-        AddSendStream(cricket::StreamParams::CreateLegacy(123));
-
-    // Verify the send extension id.
-    ASSERT_EQ(1u, send_stream->GetConfig().rtp.extensions.size());
-    EXPECT_EQ(id, send_stream->GetConfig().rtp.extensions[0].id);
-    EXPECT_EQ(ext_uri, send_stream->GetConfig().rtp.extensions[0].uri);
-    // Verify call with same set of extensions returns true.
-    EXPECT_TRUE(channel_->SetSendParameters(parameters));
-    // Verify that SetSendRtpHeaderExtensions doesn't implicitly add them for
-    // receivers.
-    EXPECT_TRUE(AddRecvStream(cricket::StreamParams::CreateLegacy(123))
-                    ->GetConfig()
-                    .rtp.extensions.empty());
-
-    // Verify that existing RTP header extensions can be removed.
-    EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
-    ASSERT_EQ(1u, fake_call_->GetVideoSendStreams().size());
-    send_stream = fake_call_->GetVideoSendStreams()[0];
-    EXPECT_TRUE(send_stream->GetConfig().rtp.extensions.empty());
-
-    // Verify that adding receive RTP header extensions adds them for existing
-    // streams.
-    EXPECT_TRUE(channel_->SetSendParameters(parameters));
-    send_stream = fake_call_->GetVideoSendStreams()[0];
-    ASSERT_EQ(1u, send_stream->GetConfig().rtp.extensions.size());
-    EXPECT_EQ(id, send_stream->GetConfig().rtp.extensions[0].id);
-    EXPECT_EQ(ext_uri, send_stream->GetConfig().rtp.extensions[0].uri);
-  }
-
-  void TestSetRecvRtpHeaderExtensions(const std::string& ext_uri) {
-    // Enable extension.
-    const int id = 1;
-    cricket::VideoRecvParameters parameters = recv_parameters_;
-    parameters.extensions.push_back(RtpExtension(ext_uri, id));
-    EXPECT_TRUE(channel_->SetRecvParameters(parameters));
-
-    FakeVideoReceiveStream* recv_stream =
-        AddRecvStream(cricket::StreamParams::CreateLegacy(123));
-
-    // Verify the recv extension id.
-    ASSERT_EQ(1u, recv_stream->GetConfig().rtp.extensions.size());
-    EXPECT_EQ(id, recv_stream->GetConfig().rtp.extensions[0].id);
-    EXPECT_EQ(ext_uri, recv_stream->GetConfig().rtp.extensions[0].uri);
-    // Verify call with same set of extensions returns true.
-    EXPECT_TRUE(channel_->SetRecvParameters(parameters));
-
-    // Verify that SetRecvRtpHeaderExtensions doesn't implicitly add them for
-    // senders.
-    EXPECT_TRUE(AddSendStream(cricket::StreamParams::CreateLegacy(123))
-                    ->GetConfig()
-                    .rtp.extensions.empty());
-
-    // Verify that existing RTP header extensions can be removed.
-    EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
-    ASSERT_EQ(1u, fake_call_->GetVideoReceiveStreams().size());
-    recv_stream = fake_call_->GetVideoReceiveStreams()[0];
-    EXPECT_TRUE(recv_stream->GetConfig().rtp.extensions.empty());
-
-    // Verify that adding receive RTP header extensions adds them for existing
-    // streams.
-    EXPECT_TRUE(channel_->SetRecvParameters(parameters));
-    recv_stream = fake_call_->GetVideoReceiveStreams()[0];
-    ASSERT_EQ(1u, recv_stream->GetConfig().rtp.extensions.size());
-    EXPECT_EQ(id, recv_stream->GetConfig().rtp.extensions[0].id);
-    EXPECT_EQ(ext_uri, recv_stream->GetConfig().rtp.extensions[0].uri);
-  }
-
-  void TestExtensionFilter(const std::vector<std::string>& extensions,
-                           const std::string& expected_extension) {
-    cricket::VideoSendParameters parameters = send_parameters_;
-    int expected_id = -1;
-    int id = 1;
-    for (const std::string& extension : extensions) {
-      if (extension == expected_extension)
-        expected_id = id;
-      parameters.extensions.push_back(RtpExtension(extension, id++));
-    }
-    EXPECT_TRUE(channel_->SetSendParameters(parameters));
-    FakeVideoSendStream* send_stream =
-        AddSendStream(cricket::StreamParams::CreateLegacy(123));
-
-    // Verify that only one of them has been set, and that it is the one with
-    // highest priority (transport sequence number).
-    ASSERT_EQ(1u, send_stream->GetConfig().rtp.extensions.size());
-    EXPECT_EQ(expected_id, send_stream->GetConfig().rtp.extensions[0].id);
-    EXPECT_EQ(expected_extension,
-              send_stream->GetConfig().rtp.extensions[0].uri);
-  }
-
-  void TestDegradationPreference(bool resolution_scaling_enabled,
-                                 bool fps_scaling_enabled);
-
-  void TestCpuAdaptation(bool enable_overuse, bool is_screenshare);
-  void TestReceiverLocalSsrcConfiguration(bool receiver_first);
-  void TestReceiveUnsignaledSsrcPacket(uint8_t payload_type,
-                                       bool expect_created_receive_stream);
-
-  FakeVideoSendStream* SetDenoisingOption(
-      uint32_t ssrc,
-      cricket::FakeVideoCapturer* capturer,
-      bool enabled) {
-    cricket::VideoOptions options;
-    options.video_noise_reduction = rtc::Optional<bool>(enabled);
-    EXPECT_TRUE(channel_->SetVideoSend(ssrc, true, &options, capturer));
-    // Options only take effect on the next frame.
-    EXPECT_TRUE(capturer->CaptureFrame());
-
-    return fake_call_->GetVideoSendStreams().back();
-  }
-
-  FakeVideoSendStream* SetUpSimulcast(bool enabled, bool with_rtx) {
-    const int kRtxSsrcOffset = 0xDEADBEEF;
-    last_ssrc_ += 3;
-    std::vector<uint32_t> ssrcs;
-    std::vector<uint32_t> rtx_ssrcs;
-    uint32_t num_streams = enabled ? 3 : 1;
-    for (uint32_t i = 0; i < num_streams; ++i) {
-      uint32_t ssrc = last_ssrc_ + i;
-      ssrcs.push_back(ssrc);
-      if (with_rtx) {
-        rtx_ssrcs.push_back(ssrc + kRtxSsrcOffset);
-      }
-    }
-    if (with_rtx) {
-      return AddSendStream(
-          cricket::CreateSimWithRtxStreamParams("cname", ssrcs, rtx_ssrcs));
-    }
-    return AddSendStream(CreateSimStreamParams("cname", ssrcs));
-  }
-
-  int GetMaxEncoderBitrate() {
-    std::vector<FakeVideoSendStream*> streams =
-        fake_call_->GetVideoSendStreams();
-    EXPECT_EQ(1u, streams.size());
-    FakeVideoSendStream* stream = streams[streams.size() - 1];
-    EXPECT_EQ(1, stream->GetEncoderConfig().number_of_streams);
-    return stream->GetVideoStreams()[0].max_bitrate_bps;
-  }
-
-  void SetAndExpectMaxBitrate(int global_max,
-                              int stream_max,
-                              int expected_encoder_bitrate) {
-    VideoSendParameters limited_send_params = send_parameters_;
-    limited_send_params.max_bandwidth_bps = global_max;
-    EXPECT_TRUE(channel_->SetSendParameters(limited_send_params));
-    webrtc::RtpParameters parameters =
-        channel_->GetRtpSendParameters(last_ssrc_);
-    EXPECT_EQ(1UL, parameters.encodings.size());
-    parameters.encodings[0].max_bitrate_bps = rtc::Optional<int>(stream_max);
-    EXPECT_TRUE(channel_->SetRtpSendParameters(last_ssrc_, parameters));
-    // Read back the parameteres and verify they have the correct value
-    parameters = channel_->GetRtpSendParameters(last_ssrc_);
-    EXPECT_EQ(1UL, parameters.encodings.size());
-    EXPECT_EQ(rtc::Optional<int>(stream_max),
-              parameters.encodings[0].max_bitrate_bps);
-    // Verify that the new value propagated down to the encoder
-    EXPECT_EQ(expected_encoder_bitrate, GetMaxEncoderBitrate());
-  }
-
-  std::unique_ptr<FakeCall> fake_call_;
-  std::unique_ptr<VideoMediaChannel> channel_;
-  cricket::VideoSendParameters send_parameters_;
-  cricket::VideoRecvParameters recv_parameters_;
-  uint32_t last_ssrc_;
-};
-
-TEST_F(WebRtcVideoChannelTest, SetsSyncGroupFromSyncLabel) {
-  const uint32_t kVideoSsrc = 123;
-  const std::string kSyncLabel = "AvSyncLabel";
-
-  cricket::StreamParams sp = cricket::StreamParams::CreateLegacy(kVideoSsrc);
-  sp.sync_label = kSyncLabel;
-  EXPECT_TRUE(channel_->AddRecvStream(sp));
-
-  EXPECT_EQ(1, fake_call_->GetVideoReceiveStreams().size());
-  EXPECT_EQ(kSyncLabel,
-            fake_call_->GetVideoReceiveStreams()[0]->GetConfig().sync_group)
-      << "SyncGroup should be set based on sync_label";
-}
-
-TEST_F(WebRtcVideoChannelTest, RecvStreamWithSimAndRtx) {
-  cricket::VideoSendParameters parameters;
-  parameters.codecs = engine_.codecs();
-  EXPECT_TRUE(channel_->SetSendParameters(parameters));
-  EXPECT_TRUE(channel_->SetSend(true));
-  parameters.conference_mode = true;
-  EXPECT_TRUE(channel_->SetSendParameters(parameters));
-
-  // Send side.
-  const std::vector<uint32_t> ssrcs = MAKE_VECTOR(kSsrcs1);
-  const std::vector<uint32_t> rtx_ssrcs = MAKE_VECTOR(kRtxSsrcs1);
-  FakeVideoSendStream* send_stream = AddSendStream(
-      cricket::CreateSimWithRtxStreamParams("cname", ssrcs, rtx_ssrcs));
-
-  ASSERT_EQ(rtx_ssrcs.size(), send_stream->GetConfig().rtp.rtx.ssrcs.size());
-  for (size_t i = 0; i < rtx_ssrcs.size(); ++i)
-    EXPECT_EQ(rtx_ssrcs[i], send_stream->GetConfig().rtp.rtx.ssrcs[i]);
-
-  // Receiver side.
-  FakeVideoReceiveStream* recv_stream = AddRecvStream(
-      cricket::CreateSimWithRtxStreamParams("cname", ssrcs, rtx_ssrcs));
-  EXPECT_FALSE(
-      recv_stream->GetConfig().rtp.rtx_associated_payload_types.empty());
-  EXPECT_TRUE(VerifyRtxReceiveAssociations(recv_stream->GetConfig()))
-      << "RTX should be mapped for all decoders/payload types.";
-  EXPECT_TRUE(HasRtxReceiveAssociation(recv_stream->GetConfig(),
-                                          GetEngineCodec("red").id))
-      << "RTX should be mapped for the RED payload type";
-
-  EXPECT_EQ(rtx_ssrcs[0], recv_stream->GetConfig().rtp.rtx_ssrc);
-}
-
-TEST_F(WebRtcVideoChannelTest, RecvStreamWithRtx) {
-  // Setup one channel with an associated RTX stream.
-  cricket::StreamParams params =
-      cricket::StreamParams::CreateLegacy(kSsrcs1[0]);
-  params.AddFidSsrc(kSsrcs1[0], kRtxSsrcs1[0]);
-  FakeVideoReceiveStream* recv_stream = AddRecvStream(params);
-  EXPECT_EQ(kRtxSsrcs1[0], recv_stream->GetConfig().rtp.rtx_ssrc);
-
-  EXPECT_TRUE(VerifyRtxReceiveAssociations(recv_stream->GetConfig()))
-      << "RTX should be mapped for all decoders/payload types.";
-  EXPECT_TRUE(HasRtxReceiveAssociation(recv_stream->GetConfig(),
-                                          GetEngineCodec("red").id))
-      << "RTX should be mapped for the RED payload type";
-}
-
-TEST_F(WebRtcVideoChannelTest, RecvStreamNoRtx) {
-  // Setup one channel without an associated RTX stream.
-  cricket::StreamParams params =
-      cricket::StreamParams::CreateLegacy(kSsrcs1[0]);
-  FakeVideoReceiveStream* recv_stream = AddRecvStream(params);
-  ASSERT_EQ(0U, recv_stream->GetConfig().rtp.rtx_ssrc);
-}
-
-TEST_F(WebRtcVideoChannelTest, NoHeaderExtesionsByDefault) {
-  FakeVideoSendStream* send_stream =
-      AddSendStream(cricket::StreamParams::CreateLegacy(kSsrcs1[0]));
-  ASSERT_TRUE(send_stream->GetConfig().rtp.extensions.empty());
-
-  FakeVideoReceiveStream* recv_stream =
-      AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrcs1[0]));
-  ASSERT_TRUE(recv_stream->GetConfig().rtp.extensions.empty());
-}
-
-// Test support for RTP timestamp offset header extension.
-TEST_F(WebRtcVideoChannelTest, SendRtpTimestampOffsetHeaderExtensions) {
-  TestSetSendRtpHeaderExtensions(RtpExtension::kTimestampOffsetUri);
-}
-
-TEST_F(WebRtcVideoChannelTest, RecvRtpTimestampOffsetHeaderExtensions) {
-  TestSetRecvRtpHeaderExtensions(RtpExtension::kTimestampOffsetUri);
-}
-
-// Test support for absolute send time header extension.
-TEST_F(WebRtcVideoChannelTest, SendAbsoluteSendTimeHeaderExtensions) {
-  TestSetSendRtpHeaderExtensions(RtpExtension::kAbsSendTimeUri);
-}
-
-TEST_F(WebRtcVideoChannelTest, RecvAbsoluteSendTimeHeaderExtensions) {
-  TestSetRecvRtpHeaderExtensions(RtpExtension::kAbsSendTimeUri);
-}
-
-TEST_F(WebRtcVideoChannelTest, FiltersExtensionsPicksTransportSeqNum) {
-  // Enable three redundant extensions.
-  std::vector<std::string> extensions;
-  extensions.push_back(RtpExtension::kAbsSendTimeUri);
-  extensions.push_back(RtpExtension::kTimestampOffsetUri);
-  extensions.push_back(RtpExtension::kTransportSequenceNumberUri);
-  TestExtensionFilter(extensions, RtpExtension::kTransportSequenceNumberUri);
-}
-
-TEST_F(WebRtcVideoChannelTest, FiltersExtensionsPicksAbsSendTime) {
-  // Enable two redundant extensions.
-  std::vector<std::string> extensions;
-  extensions.push_back(RtpExtension::kAbsSendTimeUri);
-  extensions.push_back(RtpExtension::kTimestampOffsetUri);
-  TestExtensionFilter(extensions, RtpExtension::kAbsSendTimeUri);
-}
-
-// Test support for transport sequence number header extension.
-TEST_F(WebRtcVideoChannelTest, SendTransportSequenceNumberHeaderExtensions) {
-  TestSetSendRtpHeaderExtensions(RtpExtension::kTransportSequenceNumberUri);
-}
-TEST_F(WebRtcVideoChannelTest, RecvTransportSequenceNumberHeaderExtensions) {
-  TestSetRecvRtpHeaderExtensions(RtpExtension::kTransportSequenceNumberUri);
-}
-
-// Test support for video rotation header extension.
-TEST_F(WebRtcVideoChannelTest, SendVideoRotationHeaderExtensions) {
-  TestSetSendRtpHeaderExtensions(RtpExtension::kVideoRotationUri);
-}
-TEST_F(WebRtcVideoChannelTest, RecvVideoRotationHeaderExtensions) {
-  TestSetRecvRtpHeaderExtensions(RtpExtension::kVideoRotationUri);
-}
-
-TEST_F(WebRtcVideoChannelTest, IdenticalSendExtensionsDoesntRecreateStream) {
-  const int kAbsSendTimeId = 1;
-  const int kVideoRotationId = 2;
-  send_parameters_.extensions.push_back(
-      RtpExtension(RtpExtension::kAbsSendTimeUri, kAbsSendTimeId));
-  send_parameters_.extensions.push_back(
-      RtpExtension(RtpExtension::kVideoRotationUri, kVideoRotationId));
-
-  EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
-  FakeVideoSendStream* send_stream =
-      AddSendStream(cricket::StreamParams::CreateLegacy(123));
-
-  EXPECT_EQ(1, fake_call_->GetNumCreatedSendStreams());
-  ASSERT_EQ(2u, send_stream->GetConfig().rtp.extensions.size());
-
-  // Setting the same extensions (even if in different order) shouldn't
-  // reallocate the stream.
-  std::reverse(send_parameters_.extensions.begin(),
-               send_parameters_.extensions.end());
-  EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
-
-  EXPECT_EQ(1, fake_call_->GetNumCreatedSendStreams());
-
-  // Setting different extensions should recreate the stream.
-  send_parameters_.extensions.resize(1);
-  EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
-
-  EXPECT_EQ(2, fake_call_->GetNumCreatedSendStreams());
-}
-
-TEST_F(WebRtcVideoChannelTest, IdenticalRecvExtensionsDoesntRecreateStream) {
-  const int kTOffsetId = 1;
-  const int kAbsSendTimeId = 2;
-  const int kVideoRotationId = 3;
-  recv_parameters_.extensions.push_back(
-      RtpExtension(RtpExtension::kAbsSendTimeUri, kAbsSendTimeId));
-  recv_parameters_.extensions.push_back(
-      RtpExtension(RtpExtension::kTimestampOffsetUri, kTOffsetId));
-  recv_parameters_.extensions.push_back(
-      RtpExtension(RtpExtension::kVideoRotationUri, kVideoRotationId));
-
-  EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
-  FakeVideoReceiveStream* recv_stream =
-      AddRecvStream(cricket::StreamParams::CreateLegacy(123));
-
-  EXPECT_EQ(1, fake_call_->GetNumCreatedReceiveStreams());
-  ASSERT_EQ(3u, recv_stream->GetConfig().rtp.extensions.size());
-
-  // Setting the same extensions (even if in different order) shouldn't
-  // reallocate the stream.
-  std::reverse(recv_parameters_.extensions.begin(),
-               recv_parameters_.extensions.end());
-  EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
-
-  EXPECT_EQ(1, fake_call_->GetNumCreatedReceiveStreams());
-
-  // Setting different extensions should recreate the stream.
-  recv_parameters_.extensions.resize(1);
-  EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
-
-  EXPECT_EQ(2, fake_call_->GetNumCreatedReceiveStreams());
-}
-
-TEST_F(WebRtcVideoChannelTest,
-       SetSendRtpHeaderExtensionsExcludeUnsupportedExtensions) {
-  const int kUnsupportedId = 1;
-  const int kTOffsetId = 2;
-
-  send_parameters_.extensions.push_back(
-      RtpExtension(kUnsupportedExtensionName, kUnsupportedId));
-  send_parameters_.extensions.push_back(
-      RtpExtension(RtpExtension::kTimestampOffsetUri, kTOffsetId));
-  EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
-  FakeVideoSendStream* send_stream =
-      AddSendStream(cricket::StreamParams::CreateLegacy(123));
-
-  // Only timestamp offset extension is set to send stream,
-  // unsupported rtp extension is ignored.
-  ASSERT_EQ(1u, send_stream->GetConfig().rtp.extensions.size());
-  EXPECT_STREQ(RtpExtension::kTimestampOffsetUri,
-               send_stream->GetConfig().rtp.extensions[0].uri.c_str());
-}
-
-TEST_F(WebRtcVideoChannelTest,
-       SetRecvRtpHeaderExtensionsExcludeUnsupportedExtensions) {
-  const int kUnsupportedId = 1;
-  const int kTOffsetId = 2;
-
-  recv_parameters_.extensions.push_back(
-      RtpExtension(kUnsupportedExtensionName, kUnsupportedId));
-  recv_parameters_.extensions.push_back(
-      RtpExtension(RtpExtension::kTimestampOffsetUri, kTOffsetId));
-  EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
-  FakeVideoReceiveStream* recv_stream =
-      AddRecvStream(cricket::StreamParams::CreateLegacy(123));
-
-  // Only timestamp offset extension is set to receive stream,
-  // unsupported rtp extension is ignored.
-  ASSERT_EQ(1u, recv_stream->GetConfig().rtp.extensions.size());
-  EXPECT_STREQ(RtpExtension::kTimestampOffsetUri,
-               recv_stream->GetConfig().rtp.extensions[0].uri.c_str());
-}
-
-TEST_F(WebRtcVideoChannelTest, SetSendRtpHeaderExtensionsRejectsIncorrectIds) {
-  const int kIncorrectIds[] = {-2, -1, 0, 15, 16};
-  for (size_t i = 0; i < arraysize(kIncorrectIds); ++i) {
-    send_parameters_.extensions.push_back(
-        RtpExtension(RtpExtension::kTimestampOffsetUri, kIncorrectIds[i]));
-    EXPECT_FALSE(channel_->SetSendParameters(send_parameters_))
-        << "Bad extension id '" << kIncorrectIds[i] << "' accepted.";
-  }
-}
-
-TEST_F(WebRtcVideoChannelTest, SetRecvRtpHeaderExtensionsRejectsIncorrectIds) {
-  const int kIncorrectIds[] = {-2, -1, 0, 15, 16};
-  for (size_t i = 0; i < arraysize(kIncorrectIds); ++i) {
-    recv_parameters_.extensions.push_back(
-        RtpExtension(RtpExtension::kTimestampOffsetUri, kIncorrectIds[i]));
-    EXPECT_FALSE(channel_->SetRecvParameters(recv_parameters_))
-        << "Bad extension id '" << kIncorrectIds[i] << "' accepted.";
-  }
-}
-
-TEST_F(WebRtcVideoChannelTest, SetSendRtpHeaderExtensionsRejectsDuplicateIds) {
-  const int id = 1;
-  send_parameters_.extensions.push_back(
-      RtpExtension(RtpExtension::kTimestampOffsetUri, id));
-  send_parameters_.extensions.push_back(
-      RtpExtension(RtpExtension::kAbsSendTimeUri, id));
-  EXPECT_FALSE(channel_->SetSendParameters(send_parameters_));
-
-  // Duplicate entries are also not supported.
-  send_parameters_.extensions.clear();
-  send_parameters_.extensions.push_back(
-      RtpExtension(RtpExtension::kTimestampOffsetUri, id));
-  send_parameters_.extensions.push_back(send_parameters_.extensions.back());
-  EXPECT_FALSE(channel_->SetSendParameters(send_parameters_));
-}
-
-TEST_F(WebRtcVideoChannelTest, SetRecvRtpHeaderExtensionsRejectsDuplicateIds) {
-  const int id = 1;
-  recv_parameters_.extensions.push_back(
-      RtpExtension(RtpExtension::kTimestampOffsetUri, id));
-  recv_parameters_.extensions.push_back(
-      RtpExtension(RtpExtension::kAbsSendTimeUri, id));
-  EXPECT_FALSE(channel_->SetRecvParameters(recv_parameters_));
-
-  // Duplicate entries are also not supported.
-  recv_parameters_.extensions.clear();
-  recv_parameters_.extensions.push_back(
-      RtpExtension(RtpExtension::kTimestampOffsetUri, id));
-  recv_parameters_.extensions.push_back(recv_parameters_.extensions.back());
-  EXPECT_FALSE(channel_->SetRecvParameters(recv_parameters_));
-}
-
-TEST_F(WebRtcVideoChannelTest, AddRecvStreamOnlyUsesOneReceiveStream) {
-  EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
-  EXPECT_EQ(1u, fake_call_->GetVideoReceiveStreams().size());
-}
-
-TEST_F(WebRtcVideoChannelTest, RtcpIsCompoundByDefault) {
-  FakeVideoReceiveStream* stream = AddRecvStream();
-  EXPECT_EQ(webrtc::RtcpMode::kCompound, stream->GetConfig().rtp.rtcp_mode);
-}
-
-TEST_F(WebRtcVideoChannelTest, RembIsEnabledByDefault) {
-  FakeVideoReceiveStream* stream = AddRecvStream();
-  EXPECT_TRUE(stream->GetConfig().rtp.remb);
-}
-
-TEST_F(WebRtcVideoChannelTest, TransportCcIsEnabledByDefault) {
-  FakeVideoReceiveStream* stream = AddRecvStream();
-  EXPECT_TRUE(stream->GetConfig().rtp.transport_cc);
-}
-
-TEST_F(WebRtcVideoChannelTest, RembCanBeEnabledAndDisabled) {
-  FakeVideoReceiveStream* stream = AddRecvStream();
-  EXPECT_TRUE(stream->GetConfig().rtp.remb);
-
-  // Verify that REMB is turned off when send(!) codecs without REMB are set.
-  cricket::VideoSendParameters parameters;
-  parameters.codecs.push_back(RemoveFeedbackParams(GetEngineCodec("VP8")));
-  EXPECT_TRUE(parameters.codecs[0].feedback_params.params().empty());
-  EXPECT_TRUE(channel_->SetSendParameters(parameters));
-  stream = fake_call_->GetVideoReceiveStreams()[0];
-  EXPECT_FALSE(stream->GetConfig().rtp.remb);
-
-  // Verify that REMB is turned on when setting default codecs since the
-  // default codecs have REMB enabled.
-  parameters.codecs = engine_.codecs();
-  EXPECT_TRUE(channel_->SetSendParameters(parameters));
-  stream = fake_call_->GetVideoReceiveStreams()[0];
-  EXPECT_TRUE(stream->GetConfig().rtp.remb);
-}
-
-TEST_F(WebRtcVideoChannelTest, TransportCcCanBeEnabledAndDisabled) {
-  FakeVideoReceiveStream* stream = AddRecvStream();
-  EXPECT_TRUE(stream->GetConfig().rtp.transport_cc);
-
-  // Verify that transport cc feedback is turned off when send(!) codecs without
-  // transport cc feedback are set.
-  cricket::VideoSendParameters parameters;
-  parameters.codecs.push_back(RemoveFeedbackParams(GetEngineCodec("VP8")));
-  EXPECT_TRUE(parameters.codecs[0].feedback_params.params().empty());
-  EXPECT_TRUE(channel_->SetSendParameters(parameters));
-  stream = fake_call_->GetVideoReceiveStreams()[0];
-  EXPECT_FALSE(stream->GetConfig().rtp.transport_cc);
-
-  // Verify that transport cc feedback is turned on when setting default codecs
-  // since the default codecs have transport cc feedback enabled.
-  parameters.codecs = engine_.codecs();
-  EXPECT_TRUE(channel_->SetSendParameters(parameters));
-  stream = fake_call_->GetVideoReceiveStreams()[0];
-  EXPECT_TRUE(stream->GetConfig().rtp.transport_cc);
-}
-
-TEST_F(WebRtcVideoChannelTest, NackIsEnabledByDefault) {
-  VerifyCodecHasDefaultFeedbackParams(default_codec_);
-
-  cricket::VideoSendParameters parameters;
-  parameters.codecs = engine_.codecs();
-  EXPECT_TRUE(channel_->SetSendParameters(parameters));
-  EXPECT_TRUE(channel_->SetSend(true));
-
-  // Send side.
-  FakeVideoSendStream* send_stream =
-      AddSendStream(cricket::StreamParams::CreateLegacy(1));
-  EXPECT_GT(send_stream->GetConfig().rtp.nack.rtp_history_ms, 0);
-
-  // Receiver side.
-  FakeVideoReceiveStream* recv_stream =
-      AddRecvStream(cricket::StreamParams::CreateLegacy(1));
-  EXPECT_GT(recv_stream->GetConfig().rtp.nack.rtp_history_ms, 0);
-
-  // Nack history size should match between sender and receiver.
-  EXPECT_EQ(send_stream->GetConfig().rtp.nack.rtp_history_ms,
-            recv_stream->GetConfig().rtp.nack.rtp_history_ms);
-}
-
-TEST_F(WebRtcVideoChannelTest, NackCanBeEnabledAndDisabled) {
-  FakeVideoSendStream* send_stream = AddSendStream();
-  FakeVideoReceiveStream* recv_stream = AddRecvStream();
-
-  EXPECT_GT(recv_stream->GetConfig().rtp.nack.rtp_history_ms, 0);
-  EXPECT_GT(send_stream->GetConfig().rtp.nack.rtp_history_ms, 0);
-
-  // Verify that NACK is turned off when send(!) codecs without NACK are set.
-  cricket::VideoSendParameters parameters;
-  parameters.codecs.push_back(RemoveFeedbackParams(GetEngineCodec("VP8")));
-  EXPECT_TRUE(parameters.codecs[0].feedback_params.params().empty());
-  EXPECT_TRUE(channel_->SetSendParameters(parameters));
-  recv_stream = fake_call_->GetVideoReceiveStreams()[0];
-  EXPECT_EQ(0, recv_stream->GetConfig().rtp.nack.rtp_history_ms);
-  send_stream = fake_call_->GetVideoSendStreams()[0];
-  EXPECT_EQ(0, send_stream->GetConfig().rtp.nack.rtp_history_ms);
-
-  // Verify that NACK is turned on when setting default codecs since the
-  // default codecs have NACK enabled.
-  parameters.codecs = engine_.codecs();
-  EXPECT_TRUE(channel_->SetSendParameters(parameters));
-  recv_stream = fake_call_->GetVideoReceiveStreams()[0];
-  EXPECT_GT(recv_stream->GetConfig().rtp.nack.rtp_history_ms, 0);
-  send_stream = fake_call_->GetVideoSendStreams()[0];
-  EXPECT_GT(send_stream->GetConfig().rtp.nack.rtp_history_ms, 0);
-}
-
-// This test verifies that new frame sizes reconfigures encoders even though not
-// (yet) sending. The purpose of this is to permit encoding as quickly as
-// possible once we start sending. Likely the frames being input are from the
-// same source that will be sent later, which just means that we're ready
-// earlier.
-TEST_F(WebRtcVideoChannelTest, ReconfiguresEncodersWhenNotSending) {
-  cricket::VideoSendParameters parameters;
-  parameters.codecs.push_back(GetEngineCodec("VP8"));
-  ASSERT_TRUE(channel_->SetSendParameters(parameters));
-  channel_->SetSend(false);
-
-  FakeVideoSendStream* stream = AddSendStream();
-
-  // No frames entered.
-  std::vector<webrtc::VideoStream> streams = stream->GetVideoStreams();
-  EXPECT_EQ(0u, streams[0].width);
-  EXPECT_EQ(0u, streams[0].height);
-
-  cricket::FakeVideoCapturer capturer;
-  EXPECT_TRUE(channel_->SetVideoSend(last_ssrc_, true, nullptr, &capturer));
-  VideoFormat capture_format = capturer.GetSupportedFormats()->front();
-  EXPECT_EQ(cricket::CS_RUNNING, capturer.Start(capture_format));
-  EXPECT_TRUE(capturer.CaptureFrame());
-
-  // Frame entered, should be reconfigured to new dimensions.
-  streams = stream->GetVideoStreams();
-  EXPECT_EQ(capture_format.width, streams[0].width);
-  EXPECT_EQ(capture_format.height, streams[0].height);
-
-  EXPECT_TRUE(channel_->SetVideoSend(last_ssrc_, true, nullptr, nullptr));
-}
-
-TEST_F(WebRtcVideoChannelTest, UsesCorrectSettingsForScreencast) {
-  static const int kScreenshareMinBitrateKbps = 800;
-  cricket::VideoCodec codec = GetEngineCodec("VP8");
-  cricket::VideoSendParameters parameters;
-  parameters.codecs.push_back(codec);
-  EXPECT_TRUE(channel_->SetSendParameters(parameters));
-  AddSendStream();
-
-  cricket::FakeVideoCapturer capturer;
-  VideoOptions min_bitrate_options;
-  min_bitrate_options.screencast_min_bitrate_kbps =
-      rtc::Optional<int>(kScreenshareMinBitrateKbps);
-  EXPECT_TRUE(channel_->SetVideoSend(last_ssrc_, true, &min_bitrate_options,
-                                     &capturer));
-  cricket::VideoFormat capture_format_hd =
-      capturer.GetSupportedFormats()->front();
-  EXPECT_EQ(1280, capture_format_hd.width);
-  EXPECT_EQ(720, capture_format_hd.height);
-  EXPECT_EQ(cricket::CS_RUNNING, capturer.Start(capture_format_hd));
-
-  EXPECT_TRUE(channel_->SetSend(true));
-
-  EXPECT_TRUE(capturer.CaptureFrame());
-  ASSERT_EQ(1u, fake_call_->GetVideoSendStreams().size());
-  FakeVideoSendStream* send_stream = fake_call_->GetVideoSendStreams().front();
-
-  EXPECT_EQ(1, send_stream->GetNumberOfSwappedFrames());
-
-  // Verify non-screencast settings.
-  webrtc::VideoEncoderConfig encoder_config =
-      send_stream->GetEncoderConfig().Copy();
-  EXPECT_EQ(webrtc::VideoEncoderConfig::ContentType::kRealtimeVideo,
-            encoder_config.content_type);
-  std::vector<webrtc::VideoStream> streams = send_stream->GetVideoStreams();
-  EXPECT_EQ(capture_format_hd.width, streams.front().width);
-  EXPECT_EQ(capture_format_hd.height, streams.front().height);
-  EXPECT_EQ(0, encoder_config.min_transmit_bitrate_bps)
-      << "Non-screenshare shouldn't use min-transmit bitrate.";
-
-  EXPECT_TRUE(channel_->SetVideoSend(last_ssrc_, true, nullptr, nullptr));
-  EXPECT_EQ(1, send_stream->GetNumberOfSwappedFrames());
-  VideoOptions screencast_options;
-  screencast_options.is_screencast = rtc::Optional<bool>(true);
-  EXPECT_TRUE(
-      channel_->SetVideoSend(last_ssrc_, true, &screencast_options, &capturer));
-  EXPECT_TRUE(capturer.CaptureFrame());
-  // Send stream recreated after option change.
-  ASSERT_EQ(2, fake_call_->GetNumCreatedSendStreams());
-  send_stream = fake_call_->GetVideoSendStreams().front();
-  EXPECT_EQ(1, send_stream->GetNumberOfSwappedFrames());
-
-  // Verify screencast settings.
-  encoder_config = send_stream->GetEncoderConfig().Copy();
-  EXPECT_EQ(webrtc::VideoEncoderConfig::ContentType::kScreen,
-            encoder_config.content_type);
-  EXPECT_EQ(kScreenshareMinBitrateKbps * 1000,
-            encoder_config.min_transmit_bitrate_bps);
-
-  streams = send_stream->GetVideoStreams();
-  EXPECT_EQ(capture_format_hd.width, streams.front().width);
-  EXPECT_EQ(capture_format_hd.height, streams.front().height);
-  EXPECT_TRUE(streams[0].temporal_layer_thresholds_bps.empty());
-  EXPECT_TRUE(channel_->SetVideoSend(last_ssrc_, true, nullptr, nullptr));
-}
-
-TEST_F(WebRtcVideoChannelTest,
-       ConferenceModeScreencastConfiguresTemporalLayer) {
-  static const int kConferenceScreencastTemporalBitrateBps =
-      ScreenshareLayerConfig::GetDefault().tl0_bitrate_kbps * 1000;
-  send_parameters_.conference_mode = true;
-  channel_->SetSendParameters(send_parameters_);
-
-  AddSendStream();
-  VideoOptions options;
-  options.is_screencast = rtc::Optional<bool>(true);
-  cricket::FakeVideoCapturer capturer;
-  EXPECT_TRUE(channel_->SetVideoSend(last_ssrc_, true, &options, &capturer));
-  cricket::VideoFormat capture_format_hd =
-      capturer.GetSupportedFormats()->front();
-  EXPECT_EQ(cricket::CS_RUNNING, capturer.Start(capture_format_hd));
-
-  EXPECT_TRUE(channel_->SetSend(true));
-
-  EXPECT_TRUE(capturer.CaptureFrame());
-  ASSERT_EQ(1u, fake_call_->GetVideoSendStreams().size());
-  FakeVideoSendStream* send_stream = fake_call_->GetVideoSendStreams().front();
-
-  webrtc::VideoEncoderConfig encoder_config =
-      send_stream->GetEncoderConfig().Copy();
-
-  // Verify screencast settings.
-  encoder_config = send_stream->GetEncoderConfig().Copy();
-  EXPECT_EQ(webrtc::VideoEncoderConfig::ContentType::kScreen,
-            encoder_config.content_type);
-
-  std::vector<webrtc::VideoStream> streams = send_stream->GetVideoStreams();
-  ASSERT_EQ(1u, streams.size());
-  ASSERT_EQ(1u, streams[0].temporal_layer_thresholds_bps.size());
-  EXPECT_EQ(kConferenceScreencastTemporalBitrateBps,
-            streams[0].temporal_layer_thresholds_bps[0]);
-
-  EXPECT_TRUE(channel_->SetVideoSend(last_ssrc_, true, nullptr, nullptr));
-}
-
-TEST_F(WebRtcVideoChannelTest, SuspendBelowMinBitrateDisabledByDefault) {
-  FakeVideoSendStream* stream = AddSendStream();
-  EXPECT_FALSE(stream->GetConfig().suspend_below_min_bitrate);
-}
-
-TEST_F(WebRtcVideoChannelTest, SetMediaConfigSuspendBelowMinBitrate) {
-  MediaConfig media_config = GetMediaConfig();
-  media_config.video.suspend_below_min_bitrate = true;
-
-  channel_.reset(
-      engine_.CreateChannel(fake_call_.get(), media_config, VideoOptions()));
-  channel_->OnReadyToSend(true);
-
-  channel_->SetSendParameters(send_parameters_);
-
-  FakeVideoSendStream* stream = AddSendStream();
-  EXPECT_TRUE(stream->GetConfig().suspend_below_min_bitrate);
-
-  media_config.video.suspend_below_min_bitrate = false;
-  channel_.reset(
-      engine_.CreateChannel(fake_call_.get(), media_config, VideoOptions()));
-  channel_->OnReadyToSend(true);
-
-  channel_->SetSendParameters(send_parameters_);
-
-  stream = AddSendStream();
-  EXPECT_FALSE(stream->GetConfig().suspend_below_min_bitrate);
-}
-
-TEST_F(WebRtcVideoChannelTest, Vp8DenoisingEnabledByDefault) {
-  FakeVideoSendStream* stream = AddSendStream();
-  webrtc::VideoCodecVP8 vp8_settings;
-  ASSERT_TRUE(stream->GetVp8Settings(&vp8_settings)) << "No VP8 config set.";
-  EXPECT_TRUE(vp8_settings.denoisingOn);
-}
-
-TEST_F(WebRtcVideoChannelTest, VerifyVp8SpecificSettings) {
-  cricket::VideoSendParameters parameters;
-  parameters.codecs.push_back(GetEngineCodec("VP8"));
-  ASSERT_TRUE(channel_->SetSendParameters(parameters));
-
-  // Single-stream settings should apply with RTX as well (verifies that we
-  // check number of regular SSRCs and not StreamParams::ssrcs which contains
-  // both RTX and regular SSRCs).
-  FakeVideoSendStream* stream = SetUpSimulcast(false, true);
-
-  cricket::FakeVideoCapturer capturer;
-  EXPECT_EQ(cricket::CS_RUNNING,
-            capturer.Start(capturer.GetSupportedFormats()->front()));
-  EXPECT_TRUE(channel_->SetVideoSend(last_ssrc_, true, nullptr, &capturer));
-  channel_->SetSend(true);
-
-  EXPECT_TRUE(capturer.CaptureFrame());
-
-  webrtc::VideoCodecVP8 vp8_settings;
-  ASSERT_TRUE(stream->GetVp8Settings(&vp8_settings)) << "No VP8 config set.";
-  EXPECT_TRUE(vp8_settings.denoisingOn)
-      << "VP8 denoising should be on by default.";
-
-  stream = SetDenoisingOption(last_ssrc_, &capturer, false);
-
-  ASSERT_TRUE(stream->GetVp8Settings(&vp8_settings)) << "No VP8 config set.";
-  EXPECT_FALSE(vp8_settings.denoisingOn);
-  EXPECT_TRUE(vp8_settings.automaticResizeOn);
-  EXPECT_TRUE(vp8_settings.frameDroppingOn);
-
-  stream = SetDenoisingOption(last_ssrc_, &capturer, true);
-
-  ASSERT_TRUE(stream->GetVp8Settings(&vp8_settings)) << "No VP8 config set.";
-  EXPECT_TRUE(vp8_settings.denoisingOn);
-  EXPECT_TRUE(vp8_settings.automaticResizeOn);
-  EXPECT_TRUE(vp8_settings.frameDroppingOn);
-
-  EXPECT_TRUE(channel_->SetVideoSend(last_ssrc_, true, nullptr, nullptr));
-  stream = SetUpSimulcast(true, false);
-  EXPECT_TRUE(channel_->SetVideoSend(last_ssrc_, true, nullptr, &capturer));
-  channel_->SetSend(true);
-  EXPECT_TRUE(capturer.CaptureFrame());
-
-  EXPECT_EQ(3, stream->GetVideoStreams().size());
-  ASSERT_TRUE(stream->GetVp8Settings(&vp8_settings)) << "No VP8 config set.";
-  // Autmatic resize off when using simulcast.
-  EXPECT_FALSE(vp8_settings.automaticResizeOn);
-  EXPECT_TRUE(vp8_settings.frameDroppingOn);
-
-  // In screen-share mode, denoising is forced off and simulcast disabled.
-  VideoOptions options;
-  options.is_screencast = rtc::Optional<bool>(true);
-  EXPECT_TRUE(channel_->SetVideoSend(last_ssrc_, true, &options, &capturer));
-
-  stream = SetDenoisingOption(last_ssrc_, &capturer, false);
-
-  EXPECT_EQ(1, stream->GetVideoStreams().size());
-  ASSERT_TRUE(stream->GetVp8Settings(&vp8_settings)) << "No VP8 config set.";
-  EXPECT_FALSE(vp8_settings.denoisingOn);
-  // Resizing and frame dropping always off for screen sharing.
-  EXPECT_FALSE(vp8_settings.automaticResizeOn);
-  EXPECT_FALSE(vp8_settings.frameDroppingOn);
-
-  stream = SetDenoisingOption(last_ssrc_, &capturer, true);
-
-  ASSERT_TRUE(stream->GetVp8Settings(&vp8_settings)) << "No VP8 config set.";
-  EXPECT_FALSE(vp8_settings.denoisingOn);
-  EXPECT_FALSE(vp8_settings.automaticResizeOn);
-  EXPECT_FALSE(vp8_settings.frameDroppingOn);
-
-  EXPECT_TRUE(channel_->SetVideoSend(last_ssrc_, true, nullptr, nullptr));
-}
-
-// Test that setting the same options doesn't result in the encoder being
-// reconfigured.
-TEST_F(WebRtcVideoChannelTest, SetIdenticalOptionsDoesntReconfigureEncoder) {
-  VideoOptions options;
-  cricket::FakeVideoCapturer capturer;
-
-  AddSendStream();
-  EXPECT_EQ(cricket::CS_RUNNING,
-            capturer.Start(capturer.GetSupportedFormats()->front()));
-  cricket::VideoSendParameters parameters;
-  parameters.codecs.push_back(GetEngineCodec("VP8"));
-  ASSERT_TRUE(channel_->SetSendParameters(parameters));
-  FakeVideoSendStream* send_stream = fake_call_->GetVideoSendStreams().front();
-
-  EXPECT_TRUE(channel_->SetVideoSend(last_ssrc_, true, &options, &capturer));
-  EXPECT_TRUE(channel_->SetVideoSend(last_ssrc_, true, &options, &capturer));
-  EXPECT_TRUE(capturer.CaptureFrame());
-  // Expect 1 reconfigurations at this point from the initial configuration.
-  EXPECT_EQ(1, send_stream->num_encoder_reconfigurations());
-
-  // Set the options one more time and expect no additional reconfigurations.
-  EXPECT_TRUE(channel_->SetVideoSend(last_ssrc_, true, &options, &capturer));
-  EXPECT_EQ(1, send_stream->num_encoder_reconfigurations());
-
-  // Change |options| and expect 2 reconfigurations.
-  options.video_noise_reduction = rtc::Optional<bool>(true);
-  EXPECT_TRUE(channel_->SetVideoSend(last_ssrc_, true, &options, &capturer));
-  EXPECT_EQ(2, send_stream->num_encoder_reconfigurations());
-
-  EXPECT_TRUE(channel_->SetVideoSend(last_ssrc_, true, nullptr, nullptr));
-}
-
-class Vp9SettingsTest : public WebRtcVideoChannelTest {
- public:
-  Vp9SettingsTest() : Vp9SettingsTest("") {}
-  explicit Vp9SettingsTest(const char* field_trials)
-      : WebRtcVideoChannelTest(field_trials) {
-    encoder_factory_.AddSupportedVideoCodecType("VP9");
-  }
-  virtual ~Vp9SettingsTest() {}
-
- protected:
-  void TearDown() override {
-    // Remove references to encoder_factory_ since this will be destroyed
-    // before channel_ and engine_.
-    ASSERT_TRUE(channel_->SetSendParameters(send_parameters_));
-  }
-};
-
-TEST_F(Vp9SettingsTest, VerifyVp9SpecificSettings) {
-  cricket::VideoSendParameters parameters;
-  parameters.codecs.push_back(GetEngineCodec("VP9"));
-  ASSERT_TRUE(channel_->SetSendParameters(parameters));
-
-  FakeVideoSendStream* stream = SetUpSimulcast(false, false);
-
-  cricket::FakeVideoCapturer capturer;
-  EXPECT_EQ(cricket::CS_RUNNING,
-            capturer.Start(capturer.GetSupportedFormats()->front()));
-  EXPECT_TRUE(channel_->SetVideoSend(last_ssrc_, true, nullptr, &capturer));
-  channel_->SetSend(true);
-
-  EXPECT_TRUE(capturer.CaptureFrame());
-
-  webrtc::VideoCodecVP9 vp9_settings;
-  ASSERT_TRUE(stream->GetVp9Settings(&vp9_settings)) << "No VP9 config set.";
-  EXPECT_TRUE(vp9_settings.denoisingOn)
-      << "VP9 denoising should be on by default.";
-
-  stream = SetDenoisingOption(last_ssrc_, &capturer, false);
-
-  ASSERT_TRUE(stream->GetVp9Settings(&vp9_settings)) << "No VP9 config set.";
-  EXPECT_FALSE(vp9_settings.denoisingOn);
-  // Frame dropping always on for real time video.
-  EXPECT_TRUE(vp9_settings.frameDroppingOn);
-
-  stream = SetDenoisingOption(last_ssrc_, &capturer, true);
-
-  ASSERT_TRUE(stream->GetVp9Settings(&vp9_settings)) << "No VP9 config set.";
-  EXPECT_TRUE(vp9_settings.denoisingOn);
-  EXPECT_TRUE(vp9_settings.frameDroppingOn);
-
-  // In screen-share mode, denoising is forced off.
-  VideoOptions options;
-  options.is_screencast = rtc::Optional<bool>(true);
-  EXPECT_TRUE(channel_->SetVideoSend(last_ssrc_, true, &options, &capturer));
-
-  stream = SetDenoisingOption(last_ssrc_, &capturer, false);
-
-  ASSERT_TRUE(stream->GetVp9Settings(&vp9_settings)) << "No VP9 config set.";
-  EXPECT_FALSE(vp9_settings.denoisingOn);
-  // Frame dropping always off for screen sharing.
-  EXPECT_FALSE(vp9_settings.frameDroppingOn);
-
-  stream = SetDenoisingOption(last_ssrc_, &capturer, false);
-
-  ASSERT_TRUE(stream->GetVp9Settings(&vp9_settings)) << "No VP9 config set.";
-  EXPECT_FALSE(vp9_settings.denoisingOn);
-  EXPECT_FALSE(vp9_settings.frameDroppingOn);
-
-  EXPECT_TRUE(channel_->SetVideoSend(last_ssrc_, true, nullptr, nullptr));
-}
-
-class Vp9SettingsTestWithFieldTrial : public Vp9SettingsTest {
- public:
-  explicit Vp9SettingsTestWithFieldTrial(const char* field_trials)
-      : Vp9SettingsTest(field_trials) {}
-
- protected:
-  void VerifySettings(int num_spatial_layers, int num_temporal_layers) {
-    cricket::VideoSendParameters parameters;
-    parameters.codecs.push_back(GetEngineCodec("VP9"));
-    ASSERT_TRUE(channel_->SetSendParameters(parameters));
-
-    FakeVideoSendStream* stream = SetUpSimulcast(false, false);
-
-    cricket::FakeVideoCapturer capturer;
-    EXPECT_EQ(cricket::CS_RUNNING,
-              capturer.Start(capturer.GetSupportedFormats()->front()));
-    EXPECT_TRUE(channel_->SetVideoSend(last_ssrc_, true, nullptr, &capturer));
-    channel_->SetSend(true);
-
-    EXPECT_TRUE(capturer.CaptureFrame());
-
-    webrtc::VideoCodecVP9 vp9_settings;
-    ASSERT_TRUE(stream->GetVp9Settings(&vp9_settings)) << "No VP9 config set.";
-    EXPECT_EQ(num_spatial_layers, vp9_settings.numberOfSpatialLayers);
-    EXPECT_EQ(num_temporal_layers, vp9_settings.numberOfTemporalLayers);
-
-    EXPECT_TRUE(channel_->SetVideoSend(last_ssrc_, true, nullptr, nullptr));
-  }
-};
-
-class Vp9SettingsTestWithNoFlag : public Vp9SettingsTestWithFieldTrial {
- public:
-  Vp9SettingsTestWithNoFlag() : Vp9SettingsTestWithFieldTrial("") {}
-};
-
-TEST_F(Vp9SettingsTestWithNoFlag, VerifySettings) {
-  const int kNumSpatialLayers = 1;
-  const int kNumTemporalLayers = 1;
-  VerifySettings(kNumSpatialLayers, kNumTemporalLayers);
-}
-
-class Vp9SettingsTestWithInvalidFlag : public Vp9SettingsTestWithFieldTrial {
- public:
-  Vp9SettingsTestWithInvalidFlag()
-      : Vp9SettingsTestWithFieldTrial("WebRTC-SupportVP9SVC/Default/") {}
-};
-
-TEST_F(Vp9SettingsTestWithInvalidFlag, VerifySettings) {
-  const int kNumSpatialLayers = 1;
-  const int kNumTemporalLayers = 1;
-  VerifySettings(kNumSpatialLayers, kNumTemporalLayers);
-}
-
-class Vp9SettingsTestWith2SL3TLFlag : public Vp9SettingsTestWithFieldTrial {
- public:
-  Vp9SettingsTestWith2SL3TLFlag()
-      : Vp9SettingsTestWithFieldTrial(
-            "WebRTC-SupportVP9SVC/EnabledByFlag_2SL3TL/") {}
-};
-
-TEST_F(Vp9SettingsTestWith2SL3TLFlag, VerifySettings) {
-  const int kNumSpatialLayers = 2;
-  const int kNumTemporalLayers = 3;
-  VerifySettings(kNumSpatialLayers, kNumTemporalLayers);
-}
-
-TEST_F(WebRtcVideoChannelTest,
-       BalancedDegradationPreferenceNotSupportedWithoutFieldtrial) {
-  webrtc::test::ScopedFieldTrials override_field_trials_(
-      "WebRTC-Video-BalancedDegradation/Disabled/");
-  const bool kResolutionScalingEnabled = true;
-  const bool kFpsScalingEnabled = false;
-  TestDegradationPreference(kResolutionScalingEnabled, kFpsScalingEnabled);
-}
-
-TEST_F(WebRtcVideoChannelTest,
-       BalancedDegradationPreferenceSupportedBehindFieldtrial) {
-  webrtc::test::ScopedFieldTrials override_field_trials_(
-      "WebRTC-Video-BalancedDegradation/Enabled/");
-  const bool kResolutionScalingEnabled = true;
-  const bool kFpsScalingEnabled = true;
-  TestDegradationPreference(kResolutionScalingEnabled, kFpsScalingEnabled);
-}
-
-TEST_F(WebRtcVideoChannelTest, AdaptsOnOveruse) {
-  TestCpuAdaptation(true, false);
-}
-
-TEST_F(WebRtcVideoChannelTest, DoesNotAdaptOnOveruseWhenDisabled) {
-  TestCpuAdaptation(false, false);
-}
-
-TEST_F(WebRtcVideoChannelTest, DoesNotAdaptOnOveruseWhenScreensharing) {
-  TestCpuAdaptation(true, true);
-}
-
-TEST_F(WebRtcVideoChannelTest, AdaptsOnOveruseAndChangeResolution) {
-  cricket::VideoCodec codec = GetEngineCodec("VP8");
-  cricket::VideoSendParameters parameters;
-  parameters.codecs.push_back(codec);
-
-  MediaConfig media_config = GetMediaConfig();
-  channel_.reset(
-      engine_.CreateChannel(fake_call_.get(), media_config, VideoOptions()));
-  channel_->OnReadyToSend(true);
-  ASSERT_TRUE(channel_->SetSendParameters(parameters));
-
-  AddSendStream();
-
-  cricket::FakeVideoCapturer capturer;
-  ASSERT_TRUE(channel_->SetVideoSend(last_ssrc_, true, nullptr, &capturer));
-  ASSERT_EQ(cricket::CS_RUNNING,
-            capturer.Start(capturer.GetSupportedFormats()->front()));
-  ASSERT_TRUE(channel_->SetSend(true));
-
-  ASSERT_EQ(1u, fake_call_->GetVideoSendStreams().size());
-  FakeVideoSendStream* send_stream = fake_call_->GetVideoSendStreams().front();
-
-  EXPECT_TRUE(capturer.CaptureCustomFrame(1280, 720, cricket::FOURCC_I420));
-  EXPECT_EQ(1, send_stream->GetNumberOfSwappedFrames());
-  EXPECT_EQ(1280, send_stream->GetLastWidth());
-  EXPECT_EQ(720, send_stream->GetLastHeight());
-
-  // Trigger overuse.
-  rtc::VideoSinkWants wants;
-  wants.max_pixel_count =
-      send_stream->GetLastWidth() * send_stream->GetLastHeight() - 1;
-  send_stream->InjectVideoSinkWants(wants);
-  EXPECT_TRUE(capturer.CaptureCustomFrame(1280, 720, cricket::FOURCC_I420));
-  EXPECT_EQ(2, send_stream->GetNumberOfSwappedFrames());
-  EXPECT_EQ(1280 * 3 / 4, send_stream->GetLastWidth());
-  EXPECT_EQ(720 * 3 / 4, send_stream->GetLastHeight());
-
-  // Trigger overuse again.
-  wants.max_pixel_count =
-      send_stream->GetLastWidth() * send_stream->GetLastHeight() - 1;
-  send_stream->InjectVideoSinkWants(wants);
-  EXPECT_TRUE(capturer.CaptureCustomFrame(1280, 720, cricket::FOURCC_I420));
-  EXPECT_EQ(3, send_stream->GetNumberOfSwappedFrames());
-  EXPECT_EQ(1280 * 2 / 4, send_stream->GetLastWidth());
-  EXPECT_EQ(720 * 2 / 4, send_stream->GetLastHeight());
-
-  // Change input resolution.
-  EXPECT_TRUE(capturer.CaptureCustomFrame(1284, 724, cricket::FOURCC_I420));
-  EXPECT_EQ(4, send_stream->GetNumberOfSwappedFrames());
-  EXPECT_EQ(1284 / 2, send_stream->GetLastWidth());
-  EXPECT_EQ(724 / 2, send_stream->GetLastHeight());
-
-  // Trigger underuse which should go back up in resolution.
-  int current_pixel_count =
-      send_stream->GetLastWidth() * send_stream->GetLastHeight();
-  // Cap the max to 4x the pixel count (assuming max 1/2 x 1/2 scale downs)
-  // of the current stream, so we don't take too large steps.
-  wants.max_pixel_count = current_pixel_count * 4;
-  // Default step down is 3/5 pixel count, so go up by 5/3.
-  wants.target_pixel_count = rtc::Optional<int>((current_pixel_count * 5) / 3);
-  send_stream->InjectVideoSinkWants(wants);
-  EXPECT_TRUE(capturer.CaptureCustomFrame(1284, 724, cricket::FOURCC_I420));
-  EXPECT_EQ(5, send_stream->GetNumberOfSwappedFrames());
-  EXPECT_EQ(1284 * 3 / 4, send_stream->GetLastWidth());
-  EXPECT_EQ(724 * 3 / 4, send_stream->GetLastHeight());
-
-  // Trigger underuse again, should go back up to full resolution.
-  current_pixel_count =
-      send_stream->GetLastWidth() * send_stream->GetLastHeight();
-  wants.max_pixel_count = current_pixel_count * 4;
-  wants.target_pixel_count = rtc::Optional<int>((current_pixel_count * 5) / 3);
-  send_stream->InjectVideoSinkWants(wants);
-  EXPECT_TRUE(capturer.CaptureCustomFrame(1284, 724, cricket::FOURCC_I420));
-  EXPECT_EQ(6, send_stream->GetNumberOfSwappedFrames());
-  EXPECT_EQ(1284, send_stream->GetLastWidth());
-  EXPECT_EQ(724, send_stream->GetLastHeight());
-
-  EXPECT_TRUE(channel_->SetVideoSend(last_ssrc_, true, nullptr, nullptr));
-}
-
-TEST_F(WebRtcVideoChannelTest, PreviousAdaptationDoesNotApplyToScreenshare) {
-  cricket::VideoCodec codec = GetEngineCodec("VP8");
-  cricket::VideoSendParameters parameters;
-  parameters.codecs.push_back(codec);
-
-  MediaConfig media_config = GetMediaConfig();
-  media_config.video.enable_cpu_overuse_detection = true;
-  channel_.reset(
-      engine_.CreateChannel(fake_call_.get(), media_config, VideoOptions()));
-  channel_->OnReadyToSend(true);
-  ASSERT_TRUE(channel_->SetSendParameters(parameters));
-
-  AddSendStream();
-
-  cricket::FakeVideoCapturer capturer;
-  ASSERT_EQ(cricket::CS_RUNNING,
-            capturer.Start(capturer.GetSupportedFormats()->front()));
-  ASSERT_TRUE(channel_->SetSend(true));
-  cricket::VideoOptions camera_options;
-  camera_options.is_screencast = rtc::Optional<bool>(false);
-  channel_->SetVideoSend(last_ssrc_, true /* enable */, &camera_options,
-                         &capturer);
-
-  ASSERT_EQ(1u, fake_call_->GetVideoSendStreams().size());
-  FakeVideoSendStream* send_stream = fake_call_->GetVideoSendStreams().front();
-
-  EXPECT_TRUE(capturer.CaptureCustomFrame(1280, 720, cricket::FOURCC_I420));
-  EXPECT_EQ(1, send_stream->GetNumberOfSwappedFrames());
-  EXPECT_EQ(1280, send_stream->GetLastWidth());
-  EXPECT_EQ(720, send_stream->GetLastHeight());
-
-  // Trigger overuse.
-  rtc::VideoSinkWants wants;
-  wants.max_pixel_count =
-      send_stream->GetLastWidth() * send_stream->GetLastHeight() - 1;
-  send_stream->InjectVideoSinkWants(wants);
-  EXPECT_TRUE(capturer.CaptureCustomFrame(1280, 720, cricket::FOURCC_I420));
-  EXPECT_EQ(2, send_stream->GetNumberOfSwappedFrames());
-  EXPECT_EQ(1280 * 3 / 4, send_stream->GetLastWidth());
-  EXPECT_EQ(720 * 3 / 4, send_stream->GetLastHeight());
-
-  // Switch to screen share. Expect no CPU adaptation.
-  cricket::FakeVideoCapturer screen_share(true);
-  ASSERT_EQ(cricket::CS_RUNNING,
-            screen_share.Start(screen_share.GetSupportedFormats()->front()));
-  cricket::VideoOptions screenshare_options;
-  screenshare_options.is_screencast = rtc::Optional<bool>(true);
-  channel_->SetVideoSend(last_ssrc_, true /* enable */, &screenshare_options,
-                         &screen_share);
-  EXPECT_TRUE(screen_share.CaptureCustomFrame(1284, 724, cricket::FOURCC_I420));
-  ASSERT_EQ(2, fake_call_->GetNumCreatedSendStreams());
-  send_stream = fake_call_->GetVideoSendStreams().front();
-  EXPECT_EQ(1, send_stream->GetNumberOfSwappedFrames());
-  EXPECT_EQ(1284, send_stream->GetLastWidth());
-  EXPECT_EQ(724, send_stream->GetLastHeight());
-
-  // Switch back to the normal capturer. Expect the frame to be CPU adapted.
-  channel_->SetVideoSend(last_ssrc_, true /* enable */, &camera_options,
-                         &capturer);
-  send_stream = fake_call_->GetVideoSendStreams().front();
-  // We have a new fake send stream, so it doesn't remember the old sink wants.
-  // In practice, it will be populated from
-  // VideoStreamEncoder::VideoSourceProxy::SetSource(), so simulate that here.
-  send_stream->InjectVideoSinkWants(wants);
-  EXPECT_TRUE(capturer.CaptureCustomFrame(1280, 720, cricket::FOURCC_I420));
-  ASSERT_EQ(3, fake_call_->GetNumCreatedSendStreams());
-  send_stream = fake_call_->GetVideoSendStreams().front();
-  EXPECT_EQ(1, send_stream->GetNumberOfSwappedFrames());
-  EXPECT_EQ(1280 * 3 / 4, send_stream->GetLastWidth());
-  EXPECT_EQ(720 * 3 / 4, send_stream->GetLastHeight());
-
-  EXPECT_TRUE(channel_->SetVideoSend(last_ssrc_, true, nullptr, nullptr));
-}
-
-// TODO(asapersson): Remove this test when the balanced field trial is removed.
-void WebRtcVideoChannelTest::TestDegradationPreference(
-    bool resolution_scaling_enabled,
-    bool fps_scaling_enabled) {
-  cricket::VideoCodec codec = GetEngineCodec("VP8");
-  cricket::VideoSendParameters parameters;
-  parameters.codecs.push_back(codec);
-
-  MediaConfig media_config = GetMediaConfig();
-  media_config.video.enable_cpu_overuse_detection = true;
-  channel_.reset(
-      engine_.CreateChannel(fake_call_.get(), media_config, VideoOptions()));
-  channel_->OnReadyToSend(true);
-
-  EXPECT_TRUE(channel_->SetSendParameters(parameters));
-
-  AddSendStream();
-
-  cricket::FakeVideoCapturer capturer;
-  VideoOptions options;
-  EXPECT_TRUE(channel_->SetVideoSend(last_ssrc_, true, &options, &capturer));
-  cricket::VideoFormat capture_format = capturer.GetSupportedFormats()->front();
-  EXPECT_EQ(cricket::CS_RUNNING, capturer.Start(capture_format));
-
-  EXPECT_TRUE(channel_->SetSend(true));
-
-  FakeVideoSendStream* send_stream = fake_call_->GetVideoSendStreams().front();
-  EXPECT_EQ(resolution_scaling_enabled,
-            send_stream->resolution_scaling_enabled());
-  EXPECT_EQ(fps_scaling_enabled, send_stream->framerate_scaling_enabled());
-
-  EXPECT_TRUE(channel_->SetVideoSend(last_ssrc_, true, nullptr, nullptr));
-}
-
-void WebRtcVideoChannelTest::TestCpuAdaptation(bool enable_overuse,
-                                               bool is_screenshare) {
-  const int kDefaultFps = 30;
-  cricket::VideoCodec codec = GetEngineCodec("VP8");
-  cricket::VideoSendParameters parameters;
-  parameters.codecs.push_back(codec);
-
-  MediaConfig media_config = GetMediaConfig();
-  if (enable_overuse) {
-    media_config.video.enable_cpu_overuse_detection = true;
-  }
-  channel_.reset(
-      engine_.CreateChannel(fake_call_.get(), media_config, VideoOptions()));
-  channel_->OnReadyToSend(true);
-
-  EXPECT_TRUE(channel_->SetSendParameters(parameters));
-
-  AddSendStream();
-
-  cricket::FakeVideoCapturer capturer;
-  VideoOptions options;
-  options.is_screencast = rtc::Optional<bool>(is_screenshare);
-  EXPECT_TRUE(channel_->SetVideoSend(last_ssrc_, true, &options, &capturer));
-  cricket::VideoFormat capture_format = capturer.GetSupportedFormats()->front();
-  capture_format.interval = rtc::kNumNanosecsPerSec / kDefaultFps;
-  EXPECT_EQ(cricket::CS_RUNNING, capturer.Start(capture_format));
-
-  EXPECT_TRUE(channel_->SetSend(true));
-
-  FakeVideoSendStream* send_stream = fake_call_->GetVideoSendStreams().front();
-
-  if (!enable_overuse) {
-    EXPECT_FALSE(send_stream->resolution_scaling_enabled());
-    EXPECT_FALSE(send_stream->framerate_scaling_enabled());
-    EXPECT_EQ(is_screenshare, send_stream->framerate_scaling_enabled());
-
-    EXPECT_TRUE(capturer.CaptureFrame());
-    EXPECT_EQ(1, send_stream->GetNumberOfSwappedFrames());
-
-    EXPECT_EQ(capture_format.width, send_stream->GetLastWidth());
-    EXPECT_EQ(capture_format.height, send_stream->GetLastHeight());
-
-    EXPECT_TRUE(channel_->SetVideoSend(last_ssrc_, true, nullptr, nullptr));
-    return;
-  }
-
-  if (is_screenshare) {
-    EXPECT_FALSE(send_stream->resolution_scaling_enabled());
-    EXPECT_TRUE(send_stream->framerate_scaling_enabled());
-  } else {
-    EXPECT_TRUE(send_stream->resolution_scaling_enabled());
-    EXPECT_FALSE(send_stream->framerate_scaling_enabled());
-  }
-
-  // Trigger overuse.
-  ASSERT_EQ(1u, fake_call_->GetVideoSendStreams().size());
-
-  rtc::VideoSinkWants wants;
-  if (is_screenshare) {
-    wants.max_framerate_fps = (kDefaultFps * 2) / 3;
-  } else {
-    wants.max_pixel_count = capture_format.width * capture_format.height - 1;
-  }
-  send_stream->InjectVideoSinkWants(wants);
-
-  for (int i = 0; i < kDefaultFps; ++i)
-    EXPECT_TRUE(capturer.CaptureFrame());
-
-  if (is_screenshare) {
-    // Drops every third frame.
-    EXPECT_EQ(kDefaultFps * 2 / 3, send_stream->GetNumberOfSwappedFrames());
-    EXPECT_EQ(send_stream->GetLastWidth(), capture_format.width);
-    EXPECT_EQ(send_stream->GetLastHeight(), capture_format.height);
-  } else {
-    EXPECT_EQ(kDefaultFps, send_stream->GetNumberOfSwappedFrames());
-    EXPECT_LT(send_stream->GetLastWidth(), capture_format.width);
-    EXPECT_LT(send_stream->GetLastHeight(), capture_format.height);
-  }
-
-  // Trigger underuse which should go back to normal resolution.
-  int last_pixel_count =
-      send_stream->GetLastWidth() * send_stream->GetLastHeight();
-  if (is_screenshare) {
-    wants.max_framerate_fps = kDefaultFps;
-  } else {
-    wants.max_pixel_count = last_pixel_count * 4;
-    wants.target_pixel_count.emplace((last_pixel_count * 5) / 3);
-  }
-  send_stream->InjectVideoSinkWants(wants);
-
-  for (int i = 0; i < kDefaultFps; ++i)
-    EXPECT_TRUE(capturer.CaptureFrame());
-
-  if (is_screenshare) {
-    EXPECT_EQ(kDefaultFps + (kDefaultFps * 2 / 3),
-              send_stream->GetNumberOfSwappedFrames());
-  } else {
-    EXPECT_EQ(kDefaultFps * 2, send_stream->GetNumberOfSwappedFrames());
-  }
-
-  EXPECT_EQ(capture_format.width, send_stream->GetLastWidth());
-  EXPECT_EQ(capture_format.height, send_stream->GetLastHeight());
-
-  EXPECT_TRUE(channel_->SetVideoSend(last_ssrc_, true, nullptr, nullptr));
-}
-
-TEST_F(WebRtcVideoChannelTest, EstimatesNtpStartTimeCorrectly) {
-  // Start at last timestamp to verify that wraparounds are estimated correctly.
-  static const uint32_t kInitialTimestamp = 0xFFFFFFFFu;
-  static const int64_t kInitialNtpTimeMs = 1247891230;
-  static const int kFrameOffsetMs = 20;
-  EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
-
-  FakeVideoReceiveStream* stream = AddRecvStream();
-  cricket::FakeVideoRenderer renderer;
-  EXPECT_TRUE(channel_->SetSink(last_ssrc_, &renderer));
-
-  webrtc::VideoFrame video_frame(CreateBlackFrameBuffer(4, 4),
-                                 kInitialTimestamp, 0,
-                                 webrtc::kVideoRotation_0);
-  // Initial NTP time is not available on the first frame, but should still be
-  // able to be estimated.
-  stream->InjectFrame(video_frame);
-
-  EXPECT_EQ(1, renderer.num_rendered_frames());
-
-  // This timestamp is kInitialTimestamp (-1) + kFrameOffsetMs * 90, which
-  // triggers a constant-overflow warning, hence we're calculating it explicitly
-  // here.
-  video_frame.set_timestamp(kFrameOffsetMs * 90 - 1);
-  video_frame.set_ntp_time_ms(kInitialNtpTimeMs + kFrameOffsetMs);
-  stream->InjectFrame(video_frame);
-
-  EXPECT_EQ(2, renderer.num_rendered_frames());
-
-  // Verify that NTP time has been correctly deduced.
-  cricket::VideoMediaInfo info;
-  ASSERT_TRUE(channel_->GetStats(&info));
-  ASSERT_EQ(1u, info.receivers.size());
-  EXPECT_EQ(kInitialNtpTimeMs, info.receivers[0].capture_start_ntp_time_ms);
-}
-
-TEST_F(WebRtcVideoChannelTest, SetDefaultSendCodecs) {
-  ASSERT_TRUE(channel_->SetSendParameters(send_parameters_));
-
-  VideoCodec codec;
-  EXPECT_TRUE(channel_->GetSendCodec(&codec));
-  EXPECT_TRUE(codec.Matches(engine_.codecs()[0]));
-
-  // Using a RTX setup to verify that the default RTX payload type is good.
-  const std::vector<uint32_t> ssrcs = MAKE_VECTOR(kSsrcs1);
-  const std::vector<uint32_t> rtx_ssrcs = MAKE_VECTOR(kRtxSsrcs1);
-  FakeVideoSendStream* stream = AddSendStream(
-      cricket::CreateSimWithRtxStreamParams("cname", ssrcs, rtx_ssrcs));
-  webrtc::VideoSendStream::Config config = stream->GetConfig().Copy();
-
-  // Make sure NACK and FEC are enabled on the correct payload types.
-  EXPECT_EQ(1000, config.rtp.nack.rtp_history_ms);
-  EXPECT_EQ(GetEngineCodec("ulpfec").id, config.rtp.ulpfec.ulpfec_payload_type);
-  EXPECT_EQ(GetEngineCodec("red").id, config.rtp.ulpfec.red_payload_type);
-
-  EXPECT_EQ(1u, config.rtp.rtx.ssrcs.size());
-  EXPECT_EQ(kRtxSsrcs1[0], config.rtp.rtx.ssrcs[0]);
-  VerifySendStreamHasRtxTypes(config, default_apt_rtx_types_);
-  // TODO(juberti): Check RTCP, PLI, TMMBR.
-}
-
-// The following four tests ensures that FlexFEC is not activated by default
-// when the field trials are not enabled.
-// TODO(brandtr): Remove or update these tests when FlexFEC _is_ enabled by
-// default.
-TEST_F(WebRtcVideoChannelTest,
-       FlexfecSendCodecWithoutSsrcNotExposedByDefault) {
-  FakeVideoSendStream* stream = AddSendStream();
-  webrtc::VideoSendStream::Config config = stream->GetConfig().Copy();
-
-  EXPECT_EQ(-1, config.rtp.flexfec.payload_type);
-  EXPECT_EQ(0U, config.rtp.flexfec.ssrc);
-  EXPECT_TRUE(config.rtp.flexfec.protected_media_ssrcs.empty());
-}
-
-TEST_F(WebRtcVideoChannelTest, FlexfecSendCodecWithSsrcNotExposedByDefault) {
-  FakeVideoSendStream* stream = AddSendStream(
-      CreatePrimaryWithFecFrStreamParams("cname", kSsrcs1[0], kFlexfecSsrc));
-  webrtc::VideoSendStream::Config config = stream->GetConfig().Copy();
-
-  EXPECT_EQ(-1, config.rtp.flexfec.payload_type);
-  EXPECT_EQ(0U, config.rtp.flexfec.ssrc);
-  EXPECT_TRUE(config.rtp.flexfec.protected_media_ssrcs.empty());
-}
-
-TEST_F(WebRtcVideoChannelTest,
-       FlexfecRecvCodecWithoutSsrcNotExposedByDefault) {
-  AddRecvStream();
-
-  const std::vector<FakeFlexfecReceiveStream*>& streams =
-      fake_call_->GetFlexfecReceiveStreams();
-  EXPECT_TRUE(streams.empty());
-}
-
-TEST_F(WebRtcVideoChannelTest, FlexfecRecvCodecWithSsrcNotExposedByDefault) {
-  AddRecvStream(
-      CreatePrimaryWithFecFrStreamParams("cname", kSsrcs1[0], kFlexfecSsrc));
-
-  const std::vector<FakeFlexfecReceiveStream*>& streams =
-      fake_call_->GetFlexfecReceiveStreams();
-  EXPECT_TRUE(streams.empty());
-}
-
-// TODO(brandtr): When FlexFEC is no longer behind a field trial, merge all
-// tests that use this test fixture into the corresponding "non-field trial"
-// tests.
-class WebRtcVideoChannelFlexfecRecvTest : public WebRtcVideoChannelTest {
- public:
-  WebRtcVideoChannelFlexfecRecvTest()
-      : WebRtcVideoChannelTest("WebRTC-FlexFEC-03-Advertised/Enabled/") {}
-};
-
-TEST_F(WebRtcVideoChannelFlexfecRecvTest,
-       DefaultFlexfecCodecHasTransportCcAndRembFeedbackParam) {
-  EXPECT_TRUE(cricket::HasTransportCc(GetEngineCodec("flexfec-03")));
-  EXPECT_TRUE(cricket::HasRemb(GetEngineCodec("flexfec-03")));
-}
-
-TEST_F(WebRtcVideoChannelFlexfecRecvTest, SetDefaultRecvCodecsWithoutSsrc) {
-  AddRecvStream();
-
-  const std::vector<FakeFlexfecReceiveStream*>& streams =
-      fake_call_->GetFlexfecReceiveStreams();
-  EXPECT_TRUE(streams.empty());
-}
-
-TEST_F(WebRtcVideoChannelFlexfecRecvTest, SetDefaultRecvCodecsWithSsrc) {
-  AddRecvStream(
-      CreatePrimaryWithFecFrStreamParams("cname", kSsrcs1[0], kFlexfecSsrc));
-
-  const std::vector<FakeFlexfecReceiveStream*>& streams =
-      fake_call_->GetFlexfecReceiveStreams();
-  ASSERT_EQ(1U, streams.size());
-  const FakeFlexfecReceiveStream* stream = streams.front();
-  const webrtc::FlexfecReceiveStream::Config& config = stream->GetConfig();
-  EXPECT_EQ(GetEngineCodec("flexfec-03").id, config.payload_type);
-  EXPECT_EQ(kFlexfecSsrc, config.remote_ssrc);
-  ASSERT_EQ(1U, config.protected_media_ssrcs.size());
-  EXPECT_EQ(kSsrcs1[0], config.protected_media_ssrcs[0]);
-}
-
-TEST_F(WebRtcVideoChannelFlexfecRecvTest,
-       EnablingFlexfecDoesNotRecreateVideoReceiveStream) {
-  cricket::VideoRecvParameters recv_parameters;
-  recv_parameters.codecs.push_back(GetEngineCodec("VP8"));
-  ASSERT_TRUE(channel_->SetRecvParameters(recv_parameters));
-
-  AddRecvStream(
-      CreatePrimaryWithFecFrStreamParams("cname", kSsrcs1[0], kFlexfecSsrc));
-  EXPECT_EQ(1, fake_call_->GetNumCreatedReceiveStreams());
-  EXPECT_EQ(1U, fake_call_->GetVideoReceiveStreams().size());
-
-  // Enable FlexFEC.
-  recv_parameters.codecs.push_back(GetEngineCodec("flexfec-03"));
-  ASSERT_TRUE(channel_->SetRecvParameters(recv_parameters));
-  EXPECT_EQ(2, fake_call_->GetNumCreatedReceiveStreams())
-      << "Enabling FlexFEC should create FlexfecReceiveStream.";
-  EXPECT_EQ(1U, fake_call_->GetVideoReceiveStreams().size())
-      << "Enabling FlexFEC should not create VideoReceiveStream.";
-  EXPECT_EQ(1U, fake_call_->GetFlexfecReceiveStreams().size())
-      << "Enabling FlexFEC should create a single FlexfecReceiveStream.";
-}
-
-TEST_F(WebRtcVideoChannelFlexfecRecvTest,
-       DisablingFlexfecDoesNotRecreateVideoReceiveStream) {
-  cricket::VideoRecvParameters recv_parameters;
-  recv_parameters.codecs.push_back(GetEngineCodec("VP8"));
-  recv_parameters.codecs.push_back(GetEngineCodec("flexfec-03"));
-  ASSERT_TRUE(channel_->SetRecvParameters(recv_parameters));
-
-  AddRecvStream(
-      CreatePrimaryWithFecFrStreamParams("cname", kSsrcs1[0], kFlexfecSsrc));
-  EXPECT_EQ(2, fake_call_->GetNumCreatedReceiveStreams());
-  EXPECT_EQ(1U, fake_call_->GetVideoReceiveStreams().size());
-  EXPECT_EQ(1U, fake_call_->GetFlexfecReceiveStreams().size());
-
-  // Disable FlexFEC.
-  recv_parameters.codecs.clear();
-  recv_parameters.codecs.push_back(GetEngineCodec("VP8"));
-  ASSERT_TRUE(channel_->SetRecvParameters(recv_parameters));
-  EXPECT_EQ(2, fake_call_->GetNumCreatedReceiveStreams())
-      << "Disabling FlexFEC should not recreate VideoReceiveStream.";
-  EXPECT_EQ(1U, fake_call_->GetVideoReceiveStreams().size())
-      << "Disabling FlexFEC should not destroy VideoReceiveStream.";
-  EXPECT_TRUE(fake_call_->GetFlexfecReceiveStreams().empty())
-      << "Disabling FlexFEC should destroy FlexfecReceiveStream.";
-}
-
-// TODO(brandtr): When FlexFEC is no longer behind a field trial, merge all
-// tests that use this test fixture into the corresponding "non-field trial"
-// tests.
-class WebRtcVideoChannelFlexfecSendRecvTest : public WebRtcVideoChannelTest {
- public:
-  WebRtcVideoChannelFlexfecSendRecvTest()
-      : WebRtcVideoChannelTest(
-            "WebRTC-FlexFEC-03-Advertised/Enabled/WebRTC-FlexFEC-03/Enabled/") {
-  }
-};
-
-TEST_F(WebRtcVideoChannelFlexfecSendRecvTest,
-       SetDefaultSendCodecsWithoutSsrc) {
-  FakeVideoSendStream* stream = AddSendStream();
-  webrtc::VideoSendStream::Config config = stream->GetConfig().Copy();
-
-  EXPECT_EQ(GetEngineCodec("flexfec-03").id, config.rtp.flexfec.payload_type);
-  EXPECT_EQ(0U, config.rtp.flexfec.ssrc);
-  EXPECT_TRUE(config.rtp.flexfec.protected_media_ssrcs.empty());
-}
-
-TEST_F(WebRtcVideoChannelFlexfecSendRecvTest, SetDefaultSendCodecsWithSsrc) {
-  FakeVideoSendStream* stream = AddSendStream(
-      CreatePrimaryWithFecFrStreamParams("cname", kSsrcs1[0], kFlexfecSsrc));
-  webrtc::VideoSendStream::Config config = stream->GetConfig().Copy();
-
-  EXPECT_EQ(GetEngineCodec("flexfec-03").id, config.rtp.flexfec.payload_type);
-  EXPECT_EQ(kFlexfecSsrc, config.rtp.flexfec.ssrc);
-  ASSERT_EQ(1U, config.rtp.flexfec.protected_media_ssrcs.size());
-  EXPECT_EQ(kSsrcs1[0], config.rtp.flexfec.protected_media_ssrcs[0]);
-}
-
-TEST_F(WebRtcVideoChannelTest, SetSendCodecsWithoutFec) {
-  cricket::VideoSendParameters parameters;
-  parameters.codecs.push_back(GetEngineCodec("VP8"));
-  ASSERT_TRUE(channel_->SetSendParameters(parameters));
-
-  FakeVideoSendStream* stream = AddSendStream();
-  webrtc::VideoSendStream::Config config = stream->GetConfig().Copy();
-
-  EXPECT_EQ(-1, config.rtp.ulpfec.ulpfec_payload_type);
-  EXPECT_EQ(-1, config.rtp.ulpfec.red_payload_type);
-}
-
-TEST_F(WebRtcVideoChannelFlexfecSendRecvTest, SetSendCodecsWithoutFec) {
-  cricket::VideoSendParameters parameters;
-  parameters.codecs.push_back(GetEngineCodec("VP8"));
-  ASSERT_TRUE(channel_->SetSendParameters(parameters));
-
-  FakeVideoSendStream* stream = AddSendStream();
-  webrtc::VideoSendStream::Config config = stream->GetConfig().Copy();
-
-  EXPECT_EQ(-1, config.rtp.flexfec.payload_type);
-}
-
-TEST_F(WebRtcVideoChannelFlexfecRecvTest, SetRecvCodecsWithFec) {
-  AddRecvStream(
-      CreatePrimaryWithFecFrStreamParams("cname", kSsrcs1[0], kFlexfecSsrc));
-
-  cricket::VideoRecvParameters recv_parameters;
-  recv_parameters.codecs.push_back(GetEngineCodec("VP8"));
-  recv_parameters.codecs.push_back(GetEngineCodec("flexfec-03"));
-  ASSERT_TRUE(channel_->SetRecvParameters(recv_parameters));
-
-  const std::vector<FakeFlexfecReceiveStream*>& flexfec_streams =
-      fake_call_->GetFlexfecReceiveStreams();
-  ASSERT_EQ(1U, flexfec_streams.size());
-  const FakeFlexfecReceiveStream* flexfec_stream = flexfec_streams.front();
-  const webrtc::FlexfecReceiveStream::Config& flexfec_stream_config =
-      flexfec_stream->GetConfig();
-  EXPECT_EQ(GetEngineCodec("flexfec-03").id,
-            flexfec_stream_config.payload_type);
-  EXPECT_EQ(kFlexfecSsrc, flexfec_stream_config.remote_ssrc);
-  ASSERT_EQ(1U, flexfec_stream_config.protected_media_ssrcs.size());
-  EXPECT_EQ(kSsrcs1[0], flexfec_stream_config.protected_media_ssrcs[0]);
-  const std::vector<FakeVideoReceiveStream*>& video_streams =
-      fake_call_->GetVideoReceiveStreams();
-  const FakeVideoReceiveStream* video_stream = video_streams.front();
-  const webrtc::VideoReceiveStream::Config& video_stream_config =
-      video_stream->GetConfig();
-  EXPECT_EQ(video_stream_config.rtp.local_ssrc,
-            flexfec_stream_config.local_ssrc);
-  EXPECT_EQ(video_stream_config.rtp.rtcp_mode, flexfec_stream_config.rtcp_mode);
-  EXPECT_EQ(video_stream_config.rtcp_send_transport,
-            flexfec_stream_config.rtcp_send_transport);
-  // TODO(brandtr): Update this EXPECT when we set |transport_cc| in a
-  // spec-compliant way.
-  EXPECT_EQ(video_stream_config.rtp.transport_cc,
-            flexfec_stream_config.transport_cc);
-  EXPECT_EQ(video_stream_config.rtp.rtcp_mode, flexfec_stream_config.rtcp_mode);
-  EXPECT_EQ(video_stream_config.rtp.extensions,
-            flexfec_stream_config.rtp_header_extensions);
-}
-
-// We should not send FlexFEC, even if we advertise it, unless the right
-// field trial is set.
-// TODO(brandtr): Remove when FlexFEC is enabled by default.
-TEST_F(WebRtcVideoChannelFlexfecRecvTest,
-       SetSendCodecsWithoutSsrcWithFecDoesNotEnableFec) {
-  cricket::VideoSendParameters parameters;
-  parameters.codecs.push_back(GetEngineCodec("VP8"));
-  parameters.codecs.push_back(GetEngineCodec("flexfec-03"));
-  ASSERT_TRUE(channel_->SetSendParameters(parameters));
-
-  FakeVideoSendStream* stream = AddSendStream();
-  webrtc::VideoSendStream::Config config = stream->GetConfig().Copy();
-
-  EXPECT_EQ(-1, config.rtp.flexfec.payload_type);
-  EXPECT_EQ(0, config.rtp.flexfec.ssrc);
-  EXPECT_TRUE(config.rtp.flexfec.protected_media_ssrcs.empty());
-}
-
-TEST_F(WebRtcVideoChannelFlexfecRecvTest,
-       SetSendCodecsWithSsrcWithFecDoesNotEnableFec) {
-  cricket::VideoSendParameters parameters;
-  parameters.codecs.push_back(GetEngineCodec("VP8"));
-  parameters.codecs.push_back(GetEngineCodec("flexfec-03"));
-  ASSERT_TRUE(channel_->SetSendParameters(parameters));
-
-  FakeVideoSendStream* stream = AddSendStream(
-      CreatePrimaryWithFecFrStreamParams("cname", kSsrcs1[0], kFlexfecSsrc));
-  webrtc::VideoSendStream::Config config = stream->GetConfig().Copy();
-
-  EXPECT_EQ(-1, config.rtp.flexfec.payload_type);
-  EXPECT_EQ(0, config.rtp.flexfec.ssrc);
-  EXPECT_TRUE(config.rtp.flexfec.protected_media_ssrcs.empty());
-}
-
-TEST_F(WebRtcVideoChannelTest,
-       SetSendCodecRejectsRtxWithoutAssociatedPayloadType) {
-  const int kUnusedPayloadType = 127;
-  EXPECT_FALSE(FindCodecById(engine_.codecs(), kUnusedPayloadType));
-
-  cricket::VideoSendParameters parameters;
-  cricket::VideoCodec rtx_codec(kUnusedPayloadType, "rtx");
-  parameters.codecs.push_back(rtx_codec);
-  EXPECT_FALSE(channel_->SetSendParameters(parameters))
-      << "RTX codec without associated payload type should be rejected.";
-}
-
-TEST_F(WebRtcVideoChannelTest,
-       SetSendCodecRejectsRtxWithoutMatchingVideoCodec) {
-  const int kUnusedPayloadType1 = 126;
-  const int kUnusedPayloadType2 = 127;
-  EXPECT_FALSE(FindCodecById(engine_.codecs(), kUnusedPayloadType1));
-  EXPECT_FALSE(FindCodecById(engine_.codecs(), kUnusedPayloadType2));
-  {
-    cricket::VideoCodec rtx_codec = cricket::VideoCodec::CreateRtxCodec(
-        kUnusedPayloadType1, GetEngineCodec("VP8").id);
-    cricket::VideoSendParameters parameters;
-    parameters.codecs.push_back(GetEngineCodec("VP8"));
-    parameters.codecs.push_back(rtx_codec);
-    ASSERT_TRUE(channel_->SetSendParameters(parameters));
-  }
-  {
-    cricket::VideoCodec rtx_codec = cricket::VideoCodec::CreateRtxCodec(
-        kUnusedPayloadType1, kUnusedPayloadType2);
-    cricket::VideoSendParameters parameters;
-    parameters.codecs.push_back(GetEngineCodec("VP8"));
-    parameters.codecs.push_back(rtx_codec);
-    EXPECT_FALSE(channel_->SetSendParameters(parameters))
-        << "RTX without matching video codec should be rejected.";
-  }
-}
-
-TEST_F(WebRtcVideoChannelTest, SetSendCodecsWithChangedRtxPayloadType) {
-  const int kUnusedPayloadType1 = 126;
-  const int kUnusedPayloadType2 = 127;
-  EXPECT_FALSE(FindCodecById(engine_.codecs(), kUnusedPayloadType1));
-  EXPECT_FALSE(FindCodecById(engine_.codecs(), kUnusedPayloadType2));
-
-  // SSRCs for RTX.
-  cricket::StreamParams params =
-      cricket::StreamParams::CreateLegacy(kSsrcs1[0]);
-  params.AddFidSsrc(kSsrcs1[0], kRtxSsrcs1[0]);
-  AddSendStream(params);
-
-  // Original payload type for RTX.
-  cricket::VideoSendParameters parameters;
-  parameters.codecs.push_back(GetEngineCodec("VP8"));
-  cricket::VideoCodec rtx_codec(kUnusedPayloadType1, "rtx");
-  rtx_codec.SetParam("apt", GetEngineCodec("VP8").id);
-  parameters.codecs.push_back(rtx_codec);
-  EXPECT_TRUE(channel_->SetSendParameters(parameters));
-  ASSERT_EQ(1U, fake_call_->GetVideoSendStreams().size());
-  const webrtc::VideoSendStream::Config& config_before =
-      fake_call_->GetVideoSendStreams()[0]->GetConfig();
-  EXPECT_EQ(kUnusedPayloadType1, config_before.rtp.rtx.payload_type);
-  ASSERT_EQ(1U, config_before.rtp.rtx.ssrcs.size());
-  EXPECT_EQ(kRtxSsrcs1[0], config_before.rtp.rtx.ssrcs[0]);
-
-  // Change payload type for RTX.
-  parameters.codecs[1].id = kUnusedPayloadType2;
-  EXPECT_TRUE(channel_->SetSendParameters(parameters));
-  ASSERT_EQ(1U, fake_call_->GetVideoSendStreams().size());
-  const webrtc::VideoSendStream::Config& config_after =
-      fake_call_->GetVideoSendStreams()[0]->GetConfig();
-  EXPECT_EQ(kUnusedPayloadType2, config_after.rtp.rtx.payload_type);
-  ASSERT_EQ(1U, config_after.rtp.rtx.ssrcs.size());
-  EXPECT_EQ(kRtxSsrcs1[0], config_after.rtp.rtx.ssrcs[0]);
-}
-
-TEST_F(WebRtcVideoChannelTest, SetSendCodecsWithoutFecDisablesFec) {
-  cricket::VideoSendParameters parameters;
-  parameters.codecs.push_back(GetEngineCodec("VP8"));
-  parameters.codecs.push_back(GetEngineCodec("ulpfec"));
-  ASSERT_TRUE(channel_->SetSendParameters(parameters));
-
-  FakeVideoSendStream* stream = AddSendStream();
-  webrtc::VideoSendStream::Config config = stream->GetConfig().Copy();
-
-  EXPECT_EQ(GetEngineCodec("ulpfec").id, config.rtp.ulpfec.ulpfec_payload_type);
-
-  parameters.codecs.pop_back();
-  ASSERT_TRUE(channel_->SetSendParameters(parameters));
-  stream = fake_call_->GetVideoSendStreams()[0];
-  ASSERT_TRUE(stream != nullptr);
-  config = stream->GetConfig().Copy();
-  EXPECT_EQ(-1, config.rtp.ulpfec.ulpfec_payload_type)
-      << "SetSendCodec without ULPFEC should disable current ULPFEC.";
-}
-
-TEST_F(WebRtcVideoChannelFlexfecSendRecvTest,
-       SetSendCodecsWithoutFecDisablesFec) {
-  cricket::VideoSendParameters parameters;
-  parameters.codecs.push_back(GetEngineCodec("VP8"));
-  parameters.codecs.push_back(GetEngineCodec("flexfec-03"));
-  ASSERT_TRUE(channel_->SetSendParameters(parameters));
-
-  FakeVideoSendStream* stream = AddSendStream(
-      CreatePrimaryWithFecFrStreamParams("cname", kSsrcs1[0], kFlexfecSsrc));
-  webrtc::VideoSendStream::Config config = stream->GetConfig().Copy();
-
-  EXPECT_EQ(GetEngineCodec("flexfec-03").id, config.rtp.flexfec.payload_type);
-  EXPECT_EQ(kFlexfecSsrc, config.rtp.flexfec.ssrc);
-  ASSERT_EQ(1U, config.rtp.flexfec.protected_media_ssrcs.size());
-  EXPECT_EQ(kSsrcs1[0], config.rtp.flexfec.protected_media_ssrcs[0]);
-
-  parameters.codecs.pop_back();
-  ASSERT_TRUE(channel_->SetSendParameters(parameters));
-  stream = fake_call_->GetVideoSendStreams()[0];
-  ASSERT_TRUE(stream != nullptr);
-  config = stream->GetConfig().Copy();
-  EXPECT_EQ(-1, config.rtp.flexfec.payload_type)
-      << "SetSendCodec without FlexFEC should disable current FlexFEC.";
-}
-
-TEST_F(WebRtcVideoChannelTest, SetSendCodecsChangesExistingStreams) {
-  cricket::VideoSendParameters parameters;
-  cricket::VideoCodec codec(100, "VP8");
-  codec.SetParam(kCodecParamMaxQuantization, kDefaultQpMax);
-  parameters.codecs.push_back(codec);
-
-  ASSERT_TRUE(channel_->SetSendParameters(parameters));
-  channel_->SetSend(true);
-
-  FakeVideoSendStream* stream = AddSendStream();
-  cricket::FakeVideoCapturer capturer;
-  EXPECT_TRUE(channel_->SetVideoSend(last_ssrc_, true, nullptr, &capturer));
-
-  std::vector<webrtc::VideoStream> streams = stream->GetVideoStreams();
-  EXPECT_EQ(kDefaultQpMax, streams[0].max_qp);
-
-  parameters.codecs.clear();
-  codec.SetParam(kCodecParamMaxQuantization, kDefaultQpMax + 1);
-  parameters.codecs.push_back(codec);
-  ASSERT_TRUE(channel_->SetSendParameters(parameters));
-  streams = fake_call_->GetVideoSendStreams()[0]->GetVideoStreams();
-  EXPECT_EQ(kDefaultQpMax + 1, streams[0].max_qp);
-  EXPECT_TRUE(channel_->SetVideoSend(last_ssrc_, true, nullptr, nullptr));
-}
-
-TEST_F(WebRtcVideoChannelTest, SetSendCodecsWithBitrates) {
-  SetSendCodecsShouldWorkForBitrates("100", 100000, "150", 150000, "200",
-                                     200000);
-}
-
-TEST_F(WebRtcVideoChannelTest, SetSendCodecsWithHighMaxBitrate) {
-  SetSendCodecsShouldWorkForBitrates("", 0, "", -1, "10000", 10000000);
-  std::vector<webrtc::VideoStream> streams = AddSendStream()->GetVideoStreams();
-  ASSERT_EQ(1u, streams.size());
-  EXPECT_EQ(10000000, streams[0].max_bitrate_bps);
-}
-
-TEST_F(WebRtcVideoChannelTest,
-       SetSendCodecsWithoutBitratesUsesCorrectDefaults) {
-  SetSendCodecsShouldWorkForBitrates(
-      "", 0, "", -1, "", -1);
-}
-
-TEST_F(WebRtcVideoChannelTest, SetSendCodecsCapsMinAndStartBitrate) {
-  SetSendCodecsShouldWorkForBitrates("-1", 0, "-100", -1, "", -1);
-}
-
-TEST_F(WebRtcVideoChannelTest, SetSendCodecsRejectsMaxLessThanMinBitrate) {
-  send_parameters_.codecs[0].params[kCodecParamMinBitrate] = "300";
-  send_parameters_.codecs[0].params[kCodecParamMaxBitrate] = "200";
-  EXPECT_FALSE(channel_->SetSendParameters(send_parameters_));
-}
-
-// Test that when both the codec-specific bitrate params and max_bandwidth_bps
-// are present in the same send parameters, the settings are combined correctly.
-TEST_F(WebRtcVideoChannelTest, SetSendCodecsWithBitratesAndMaxSendBandwidth) {
-  send_parameters_.codecs[0].params[kCodecParamMinBitrate] = "100";
-  send_parameters_.codecs[0].params[kCodecParamStartBitrate] = "200";
-  send_parameters_.codecs[0].params[kCodecParamMaxBitrate] = "300";
-  send_parameters_.max_bandwidth_bps = 400000;
-  EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
-  EXPECT_EQ(100000, fake_call_->GetConfig().bitrate_config.min_bitrate_bps);
-  EXPECT_EQ(200000, fake_call_->GetConfig().bitrate_config.start_bitrate_bps);
-  // We expect max_bandwidth_bps to take priority, if set.
-  EXPECT_EQ(400000, fake_call_->GetConfig().bitrate_config.max_bitrate_bps);
-
-  // Decrease max_bandwidth_bps.
-  send_parameters_.max_bandwidth_bps = 350000;
-  EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
-  EXPECT_EQ(100000, fake_call_->GetConfig().bitrate_config.min_bitrate_bps);
-  // Since the codec isn't changing, start_bitrate_bps should be -1.
-  EXPECT_EQ(-1, fake_call_->GetConfig().bitrate_config.start_bitrate_bps);
-  EXPECT_EQ(350000, fake_call_->GetConfig().bitrate_config.max_bitrate_bps);
-
-  // Now try again with the values flipped around.
-  send_parameters_.codecs[0].params[kCodecParamMaxBitrate] = "400";
-  send_parameters_.max_bandwidth_bps = 300000;
-  EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
-  EXPECT_EQ(100000, fake_call_->GetConfig().bitrate_config.min_bitrate_bps);
-  EXPECT_EQ(200000, fake_call_->GetConfig().bitrate_config.start_bitrate_bps);
-  EXPECT_EQ(300000, fake_call_->GetConfig().bitrate_config.max_bitrate_bps);
-
-  // If we change the codec max, max_bandwidth_bps should still apply.
-  send_parameters_.codecs[0].params[kCodecParamMaxBitrate] = "350";
-  EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
-  EXPECT_EQ(100000, fake_call_->GetConfig().bitrate_config.min_bitrate_bps);
-  EXPECT_EQ(200000, fake_call_->GetConfig().bitrate_config.start_bitrate_bps);
-  EXPECT_EQ(300000, fake_call_->GetConfig().bitrate_config.max_bitrate_bps);
-}
-
-TEST_F(WebRtcVideoChannelTest,
-       SetMaxSendBandwidthShouldPreserveOtherBitrates) {
-  SetSendCodecsShouldWorkForBitrates("100", 100000, "150", 150000, "200",
-                                     200000);
-  send_parameters_.max_bandwidth_bps = 300000;
-  EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
-  EXPECT_EQ(100000, fake_call_->GetConfig().bitrate_config.min_bitrate_bps)
-      << "Setting max bitrate should keep previous min bitrate.";
-  EXPECT_EQ(-1, fake_call_->GetConfig().bitrate_config.start_bitrate_bps)
-      << "Setting max bitrate should not reset start bitrate.";
-  EXPECT_EQ(300000, fake_call_->GetConfig().bitrate_config.max_bitrate_bps);
-}
-
-TEST_F(WebRtcVideoChannelTest, SetMaxSendBandwidthShouldBeRemovable) {
-  send_parameters_.max_bandwidth_bps = 300000;
-  EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
-  EXPECT_EQ(300000, fake_call_->GetConfig().bitrate_config.max_bitrate_bps);
-  // -1 means to disable max bitrate (set infinite).
-  send_parameters_.max_bandwidth_bps = -1;
-  EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
-  EXPECT_EQ(-1, fake_call_->GetConfig().bitrate_config.max_bitrate_bps)
-      << "Setting zero max bitrate did not reset start bitrate.";
-}
-
-TEST_F(WebRtcVideoChannelTest, SetMaxSendBandwidthAndAddSendStream) {
-  send_parameters_.max_bandwidth_bps = 99999;
-  FakeVideoSendStream* stream = AddSendStream();
-  ASSERT_TRUE(channel_->SetSendParameters(send_parameters_));
-  EXPECT_EQ(send_parameters_.max_bandwidth_bps,
-            fake_call_->GetConfig().bitrate_config.max_bitrate_bps);
-  ASSERT_EQ(1u, stream->GetVideoStreams().size());
-  EXPECT_EQ(send_parameters_.max_bandwidth_bps,
-            stream->GetVideoStreams()[0].max_bitrate_bps);
-
-  send_parameters_.max_bandwidth_bps = 77777;
-  ASSERT_TRUE(channel_->SetSendParameters(send_parameters_));
-  EXPECT_EQ(send_parameters_.max_bandwidth_bps,
-            fake_call_->GetConfig().bitrate_config.max_bitrate_bps);
-  EXPECT_EQ(send_parameters_.max_bandwidth_bps,
-            stream->GetVideoStreams()[0].max_bitrate_bps);
-}
-
-TEST_F(WebRtcVideoChannelTest, SetMaxSendBitrateCanIncreaseSenderBitrate) {
-  cricket::VideoSendParameters parameters;
-  parameters.codecs.push_back(GetEngineCodec("VP8"));
-  ASSERT_TRUE(channel_->SetSendParameters(parameters));
-  channel_->SetSend(true);
-
-  FakeVideoSendStream* stream = AddSendStream();
-
-  cricket::FakeVideoCapturer capturer;
-  EXPECT_TRUE(channel_->SetVideoSend(last_ssrc_, true, nullptr, &capturer));
-  EXPECT_EQ(cricket::CS_RUNNING,
-            capturer.Start(capturer.GetSupportedFormats()->front()));
-
-  std::vector<webrtc::VideoStream> streams = stream->GetVideoStreams();
-  int initial_max_bitrate_bps = streams[0].max_bitrate_bps;
-  EXPECT_GT(initial_max_bitrate_bps, 0);
-
-  parameters.max_bandwidth_bps = initial_max_bitrate_bps * 2;
-  EXPECT_TRUE(channel_->SetSendParameters(parameters));
-  // Insert a frame to update the encoder config.
-  EXPECT_TRUE(capturer.CaptureFrame());
-  streams = stream->GetVideoStreams();
-  EXPECT_EQ(initial_max_bitrate_bps * 2, streams[0].max_bitrate_bps);
-  EXPECT_TRUE(channel_->SetVideoSend(last_ssrc_, true, nullptr, nullptr));
-}
-
-TEST_F(WebRtcVideoChannelTest,
-       SetMaxSendBitrateCanIncreaseSimulcastSenderBitrate) {
-  cricket::VideoSendParameters parameters;
-  parameters.codecs.push_back(GetEngineCodec("VP8"));
-  ASSERT_TRUE(channel_->SetSendParameters(parameters));
-  channel_->SetSend(true);
-
-  FakeVideoSendStream* stream = AddSendStream(
-      cricket::CreateSimStreamParams("cname", MAKE_VECTOR(kSsrcs3)));
-
-  // Send a frame to make sure this scales up to >1 stream (simulcast).
-  cricket::FakeVideoCapturer capturer;
-  EXPECT_TRUE(channel_->SetVideoSend(kSsrcs3[0], true, nullptr, &capturer));
-  EXPECT_EQ(cricket::CS_RUNNING,
-            capturer.Start(capturer.GetSupportedFormats()->front()));
-  EXPECT_TRUE(capturer.CaptureFrame());
-
-  std::vector<webrtc::VideoStream> streams = stream->GetVideoStreams();
-  ASSERT_GT(streams.size(), 1u)
-      << "Without simulcast this test doesn't make sense.";
-  int initial_max_bitrate_bps = GetTotalMaxBitrateBps(streams);
-  EXPECT_GT(initial_max_bitrate_bps, 0);
-
-  parameters.max_bandwidth_bps = initial_max_bitrate_bps * 2;
-  EXPECT_TRUE(channel_->SetSendParameters(parameters));
-  // Insert a frame to update the encoder config.
-  EXPECT_TRUE(capturer.CaptureFrame());
-  streams = stream->GetVideoStreams();
-  int increased_max_bitrate_bps = GetTotalMaxBitrateBps(streams);
-  EXPECT_EQ(initial_max_bitrate_bps * 2, increased_max_bitrate_bps);
-
-  EXPECT_TRUE(channel_->SetVideoSend(kSsrcs3[0], true, nullptr, nullptr));
-}
-
-TEST_F(WebRtcVideoChannelTest, SetSendCodecsWithMaxQuantization) {
-  static const char* kMaxQuantization = "21";
-  cricket::VideoSendParameters parameters;
-  parameters.codecs.push_back(GetEngineCodec("VP8"));
-  parameters.codecs[0].params[kCodecParamMaxQuantization] = kMaxQuantization;
-  EXPECT_TRUE(channel_->SetSendParameters(parameters));
-  EXPECT_EQ(static_cast<unsigned int>(atoi(kMaxQuantization)),
-            AddSendStream()->GetVideoStreams().back().max_qp);
-
-  VideoCodec codec;
-  EXPECT_TRUE(channel_->GetSendCodec(&codec));
-  EXPECT_EQ(kMaxQuantization, codec.params[kCodecParamMaxQuantization]);
-}
-
-TEST_F(WebRtcVideoChannelTest, SetSendCodecsRejectBadPayloadTypes) {
-  // TODO(pbos): Should we only allow the dynamic range?
-  static const int kIncorrectPayloads[] = {-2, -1, 128, 129};
-  cricket::VideoSendParameters parameters;
-  parameters.codecs.push_back(GetEngineCodec("VP8"));
-  for (size_t i = 0; i < arraysize(kIncorrectPayloads); ++i) {
-    parameters.codecs[0].id = kIncorrectPayloads[i];
-    EXPECT_FALSE(channel_->SetSendParameters(parameters))
-        << "Bad payload type '" << kIncorrectPayloads[i] << "' accepted.";
-  }
-}
-
-TEST_F(WebRtcVideoChannelTest, SetSendCodecsAcceptAllValidPayloadTypes) {
-  cricket::VideoSendParameters parameters;
-  parameters.codecs.push_back(GetEngineCodec("VP8"));
-  for (int payload_type = 96; payload_type <= 127; ++payload_type) {
-    parameters.codecs[0].id = payload_type;
-    EXPECT_TRUE(channel_->SetSendParameters(parameters))
-        << "Payload type '" << payload_type << "' rejected.";
-  }
-}
-
-// Test that setting the a different set of codecs but with an identical front
-// codec doesn't result in the stream being recreated.
-// This may happen when a subsequent negotiation includes fewer codecs, as a
-// result of one of the codecs being rejected.
-TEST_F(WebRtcVideoChannelTest,
-       SetSendCodecsIdenticalFirstCodecDoesntRecreateStream) {
-  cricket::VideoSendParameters parameters1;
-  parameters1.codecs.push_back(GetEngineCodec("VP8"));
-  parameters1.codecs.push_back(GetEngineCodec("VP9"));
-  EXPECT_TRUE(channel_->SetSendParameters(parameters1));
-
-  AddSendStream();
-  EXPECT_EQ(1, fake_call_->GetNumCreatedSendStreams());
-
-  cricket::VideoSendParameters parameters2;
-  parameters2.codecs.push_back(GetEngineCodec("VP8"));
-  EXPECT_TRUE(channel_->SetSendParameters(parameters2));
-  EXPECT_EQ(1, fake_call_->GetNumCreatedSendStreams());
-}
-
-TEST_F(WebRtcVideoChannelTest, SetRecvCodecsWithOnlyVp8) {
-  cricket::VideoRecvParameters parameters;
-  parameters.codecs.push_back(GetEngineCodec("VP8"));
-  EXPECT_TRUE(channel_->SetRecvParameters(parameters));
-}
-
-// Test that we set our inbound RTX codecs properly.
-TEST_F(WebRtcVideoChannelTest, SetRecvCodecsWithRtx) {
-  const int kUnusedPayloadType1 = 126;
-  const int kUnusedPayloadType2 = 127;
-  EXPECT_FALSE(FindCodecById(engine_.codecs(), kUnusedPayloadType1));
-  EXPECT_FALSE(FindCodecById(engine_.codecs(), kUnusedPayloadType2));
-
-  cricket::VideoRecvParameters parameters;
-  parameters.codecs.push_back(GetEngineCodec("VP8"));
-  cricket::VideoCodec rtx_codec(kUnusedPayloadType1, "rtx");
-  parameters.codecs.push_back(rtx_codec);
-  EXPECT_FALSE(channel_->SetRecvParameters(parameters))
-      << "RTX codec without associated payload should be rejected.";
-
-  parameters.codecs[1].SetParam("apt", kUnusedPayloadType2);
-  EXPECT_FALSE(channel_->SetRecvParameters(parameters))
-      << "RTX codec with invalid associated payload type should be rejected.";
-
-  parameters.codecs[1].SetParam("apt", GetEngineCodec("VP8").id);
-  EXPECT_TRUE(channel_->SetRecvParameters(parameters));
-
-  cricket::VideoCodec rtx_codec2(kUnusedPayloadType2, "rtx");
-  rtx_codec2.SetParam("apt", rtx_codec.id);
-  parameters.codecs.push_back(rtx_codec2);
-
-  EXPECT_FALSE(channel_->SetRecvParameters(parameters)) <<
-      "RTX codec with another RTX as associated payload type should be "
-      "rejected.";
-}
-
-TEST_F(WebRtcVideoChannelTest, SetRecvCodecsWithChangedRtxPayloadType) {
-  const int kUnusedPayloadType1 = 126;
-  const int kUnusedPayloadType2 = 127;
-  EXPECT_FALSE(FindCodecById(engine_.codecs(), kUnusedPayloadType1));
-  EXPECT_FALSE(FindCodecById(engine_.codecs(), kUnusedPayloadType2));
-
-  // SSRCs for RTX.
-  cricket::StreamParams params =
-      cricket::StreamParams::CreateLegacy(kSsrcs1[0]);
-  params.AddFidSsrc(kSsrcs1[0], kRtxSsrcs1[0]);
-  AddRecvStream(params);
-
-  // Original payload type for RTX.
-  cricket::VideoRecvParameters parameters;
-  parameters.codecs.push_back(GetEngineCodec("VP8"));
-  cricket::VideoCodec rtx_codec(kUnusedPayloadType1, "rtx");
-  rtx_codec.SetParam("apt", GetEngineCodec("VP8").id);
-  parameters.codecs.push_back(rtx_codec);
-  EXPECT_TRUE(channel_->SetRecvParameters(parameters));
-  ASSERT_EQ(1U, fake_call_->GetVideoReceiveStreams().size());
-  const webrtc::VideoReceiveStream::Config& config_before =
-      fake_call_->GetVideoReceiveStreams()[0]->GetConfig();
-  EXPECT_EQ(1U, config_before.rtp.rtx_associated_payload_types.size());
-  const int* payload_type_before = FindKeyByValue(
-      config_before.rtp.rtx_associated_payload_types, GetEngineCodec("VP8").id);
-  ASSERT_NE(payload_type_before, nullptr);
-  EXPECT_EQ(kUnusedPayloadType1, *payload_type_before);
-  EXPECT_EQ(kRtxSsrcs1[0], config_before.rtp.rtx_ssrc);
-
-  // Change payload type for RTX.
-  parameters.codecs[1].id = kUnusedPayloadType2;
-  EXPECT_TRUE(channel_->SetRecvParameters(parameters));
-  ASSERT_EQ(1U, fake_call_->GetVideoReceiveStreams().size());
-  const webrtc::VideoReceiveStream::Config& config_after =
-      fake_call_->GetVideoReceiveStreams()[0]->GetConfig();
-  EXPECT_EQ(1U, config_after.rtp.rtx_associated_payload_types.size());
-  const int* payload_type_after = FindKeyByValue(
-      config_after.rtp.rtx_associated_payload_types, GetEngineCodec("VP8").id);
-  ASSERT_NE(payload_type_after, nullptr);
-  EXPECT_EQ(kUnusedPayloadType2, *payload_type_after);
-  EXPECT_EQ(kRtxSsrcs1[0], config_after.rtp.rtx_ssrc);
-}
-
-TEST_F(WebRtcVideoChannelTest, SetRecvCodecsDifferentPayloadType) {
-  cricket::VideoRecvParameters parameters;
-  parameters.codecs.push_back(GetEngineCodec("VP8"));
-  parameters.codecs[0].id = 99;
-  EXPECT_TRUE(channel_->SetRecvParameters(parameters));
-}
-
-TEST_F(WebRtcVideoChannelTest, SetRecvCodecsAcceptDefaultCodecs) {
-  cricket::VideoRecvParameters parameters;
-  parameters.codecs = engine_.codecs();
-  EXPECT_TRUE(channel_->SetRecvParameters(parameters));
-
-  FakeVideoReceiveStream* stream = AddRecvStream();
-  const webrtc::VideoReceiveStream::Config& config = stream->GetConfig();
-  EXPECT_EQ(engine_.codecs()[0].name, config.decoders[0].payload_name);
-  EXPECT_EQ(engine_.codecs()[0].id, config.decoders[0].payload_type);
-}
-
-TEST_F(WebRtcVideoChannelTest, SetRecvCodecsRejectUnsupportedCodec) {
-  cricket::VideoRecvParameters parameters;
-  parameters.codecs.push_back(GetEngineCodec("VP8"));
-  parameters.codecs.push_back(VideoCodec(101, "WTF3"));
-  EXPECT_FALSE(channel_->SetRecvParameters(parameters));
-}
-
-TEST_F(WebRtcVideoChannelTest, SetRecvCodecsAcceptsMultipleVideoCodecs) {
-  cricket::VideoRecvParameters parameters;
-  parameters.codecs.push_back(GetEngineCodec("VP8"));
-  parameters.codecs.push_back(GetEngineCodec("VP9"));
-  EXPECT_TRUE(channel_->SetRecvParameters(parameters));
-}
-
-TEST_F(WebRtcVideoChannelTest, SetRecvCodecsWithoutFecDisablesFec) {
-  cricket::VideoSendParameters send_parameters;
-  send_parameters.codecs.push_back(GetEngineCodec("VP8"));
-  send_parameters.codecs.push_back(GetEngineCodec("red"));
-  send_parameters.codecs.push_back(GetEngineCodec("ulpfec"));
-  ASSERT_TRUE(channel_->SetSendParameters(send_parameters));
-
-  FakeVideoReceiveStream* stream = AddRecvStream();
-
-  EXPECT_EQ(GetEngineCodec("ulpfec").id,
-            stream->GetConfig().rtp.ulpfec.ulpfec_payload_type);
-
-  cricket::VideoRecvParameters recv_parameters;
-  recv_parameters.codecs.push_back(GetEngineCodec("VP8"));
-  ASSERT_TRUE(channel_->SetRecvParameters(recv_parameters));
-  stream = fake_call_->GetVideoReceiveStreams()[0];
-  ASSERT_TRUE(stream != nullptr);
-  EXPECT_EQ(-1, stream->GetConfig().rtp.ulpfec.ulpfec_payload_type)
-      << "SetSendCodec without ULPFEC should disable current ULPFEC.";
-}
-
-TEST_F(WebRtcVideoChannelFlexfecRecvTest, SetRecvParamsWithoutFecDisablesFec) {
-  AddRecvStream(
-      CreatePrimaryWithFecFrStreamParams("cname", kSsrcs1[0], kFlexfecSsrc));
-  const std::vector<FakeFlexfecReceiveStream*>& streams =
-      fake_call_->GetFlexfecReceiveStreams();
-
-  ASSERT_EQ(1U, streams.size());
-  const FakeFlexfecReceiveStream* stream = streams.front();
-  EXPECT_EQ(GetEngineCodec("flexfec-03").id, stream->GetConfig().payload_type);
-  EXPECT_EQ(kFlexfecSsrc, stream->GetConfig().remote_ssrc);
-  ASSERT_EQ(1U, stream->GetConfig().protected_media_ssrcs.size());
-  EXPECT_EQ(kSsrcs1[0], stream->GetConfig().protected_media_ssrcs[0]);
-
-  cricket::VideoRecvParameters recv_parameters;
-  recv_parameters.codecs.push_back(GetEngineCodec("VP8"));
-  ASSERT_TRUE(channel_->SetRecvParameters(recv_parameters));
-  EXPECT_TRUE(streams.empty())
-      << "SetSendCodec without FlexFEC should disable current FlexFEC.";
-}
-
-TEST_F(WebRtcVideoChannelTest, SetSendParamsWithFecEnablesFec) {
-  FakeVideoReceiveStream* stream = AddRecvStream();
-  EXPECT_EQ(GetEngineCodec("ulpfec").id,
-            stream->GetConfig().rtp.ulpfec.ulpfec_payload_type);
-
-  cricket::VideoRecvParameters recv_parameters;
-  recv_parameters.codecs.push_back(GetEngineCodec("VP8"));
-  recv_parameters.codecs.push_back(GetEngineCodec("red"));
-  recv_parameters.codecs.push_back(GetEngineCodec("ulpfec"));
-  ASSERT_TRUE(channel_->SetRecvParameters(recv_parameters));
-  stream = fake_call_->GetVideoReceiveStreams()[0];
-  ASSERT_TRUE(stream != nullptr);
-  EXPECT_EQ(GetEngineCodec("ulpfec").id,
-            stream->GetConfig().rtp.ulpfec.ulpfec_payload_type)
-      << "ULPFEC should be enabled on the receive stream.";
-
-  cricket::VideoSendParameters send_parameters;
-  send_parameters.codecs.push_back(GetEngineCodec("VP8"));
-  send_parameters.codecs.push_back(GetEngineCodec("red"));
-  send_parameters.codecs.push_back(GetEngineCodec("ulpfec"));
-  ASSERT_TRUE(channel_->SetSendParameters(send_parameters));
-  stream = fake_call_->GetVideoReceiveStreams()[0];
-  EXPECT_EQ(GetEngineCodec("ulpfec").id,
-            stream->GetConfig().rtp.ulpfec.ulpfec_payload_type)
-      << "ULPFEC should be enabled on the receive stream.";
-}
-
-TEST_F(WebRtcVideoChannelFlexfecSendRecvTest,
-       SetSendRecvParamsWithFecEnablesFec) {
-  AddRecvStream(
-      CreatePrimaryWithFecFrStreamParams("cname", kSsrcs1[0], kFlexfecSsrc));
-  const std::vector<FakeFlexfecReceiveStream*>& streams =
-      fake_call_->GetFlexfecReceiveStreams();
-
-  cricket::VideoRecvParameters recv_parameters;
-  recv_parameters.codecs.push_back(GetEngineCodec("VP8"));
-  recv_parameters.codecs.push_back(GetEngineCodec("flexfec-03"));
-  ASSERT_TRUE(channel_->SetRecvParameters(recv_parameters));
-  ASSERT_EQ(1U, streams.size());
-  const FakeFlexfecReceiveStream* stream_with_recv_params = streams.front();
-  EXPECT_EQ(GetEngineCodec("flexfec-03").id,
-            stream_with_recv_params->GetConfig().payload_type);
-  EXPECT_EQ(kFlexfecSsrc, stream_with_recv_params->GetConfig().remote_ssrc);
-  EXPECT_EQ(1U,
-            stream_with_recv_params->GetConfig().protected_media_ssrcs.size());
-  EXPECT_EQ(kSsrcs1[0],
-            stream_with_recv_params->GetConfig().protected_media_ssrcs[0]);
-
-  cricket::VideoSendParameters send_parameters;
-  send_parameters.codecs.push_back(GetEngineCodec("VP8"));
-  send_parameters.codecs.push_back(GetEngineCodec("flexfec-03"));
-  ASSERT_TRUE(channel_->SetSendParameters(send_parameters));
-  ASSERT_EQ(1U, streams.size());
-  const FakeFlexfecReceiveStream* stream_with_send_params = streams.front();
-  EXPECT_EQ(GetEngineCodec("flexfec-03").id,
-            stream_with_send_params->GetConfig().payload_type);
-  EXPECT_EQ(kFlexfecSsrc, stream_with_send_params->GetConfig().remote_ssrc);
-  EXPECT_EQ(1U,
-            stream_with_send_params->GetConfig().protected_media_ssrcs.size());
-  EXPECT_EQ(kSsrcs1[0],
-            stream_with_send_params->GetConfig().protected_media_ssrcs[0]);
-}
-
-TEST_F(WebRtcVideoChannelTest, SetRecvCodecsRejectDuplicateFecPayloads) {
-  cricket::VideoRecvParameters parameters;
-  parameters.codecs.push_back(GetEngineCodec("VP8"));
-  parameters.codecs.push_back(GetEngineCodec("red"));
-  parameters.codecs[1].id = parameters.codecs[0].id;
-  EXPECT_FALSE(channel_->SetRecvParameters(parameters));
-}
-
-TEST_F(WebRtcVideoChannelFlexfecRecvTest,
-       SetRecvCodecsRejectDuplicateFecPayloads) {
-  cricket::VideoRecvParameters parameters;
-  parameters.codecs.push_back(GetEngineCodec("VP8"));
-  parameters.codecs.push_back(GetEngineCodec("flexfec-03"));
-  parameters.codecs[1].id = parameters.codecs[0].id;
-  EXPECT_FALSE(channel_->SetRecvParameters(parameters));
-}
-
-TEST_F(WebRtcVideoChannelTest, SetRecvCodecsRejectDuplicateCodecPayloads) {
-  cricket::VideoRecvParameters parameters;
-  parameters.codecs.push_back(GetEngineCodec("VP8"));
-  parameters.codecs.push_back(GetEngineCodec("VP9"));
-  parameters.codecs[1].id = parameters.codecs[0].id;
-  EXPECT_FALSE(channel_->SetRecvParameters(parameters));
-}
-
-TEST_F(WebRtcVideoChannelTest,
-       SetRecvCodecsAcceptSameCodecOnMultiplePayloadTypes) {
-  cricket::VideoRecvParameters parameters;
-  parameters.codecs.push_back(GetEngineCodec("VP8"));
-  parameters.codecs.push_back(GetEngineCodec("VP8"));
-  parameters.codecs[1].id += 1;
-  EXPECT_TRUE(channel_->SetRecvParameters(parameters));
-}
-
-// Test that setting the same codecs but with a different order
-// doesn't result in the stream being recreated.
-TEST_F(WebRtcVideoChannelTest,
-       SetRecvCodecsDifferentOrderDoesntRecreateStream) {
-  cricket::VideoRecvParameters parameters1;
-  parameters1.codecs.push_back(GetEngineCodec("VP8"));
-  parameters1.codecs.push_back(GetEngineCodec("red"));
-  EXPECT_TRUE(channel_->SetRecvParameters(parameters1));
-
-  AddRecvStream(cricket::StreamParams::CreateLegacy(123));
-  EXPECT_EQ(1, fake_call_->GetNumCreatedReceiveStreams());
-
-  cricket::VideoRecvParameters parameters2;
-  parameters2.codecs.push_back(GetEngineCodec("red"));
-  parameters2.codecs.push_back(GetEngineCodec("VP8"));
-  EXPECT_TRUE(channel_->SetRecvParameters(parameters2));
-  EXPECT_EQ(1, fake_call_->GetNumCreatedReceiveStreams());
-}
-
-TEST_F(WebRtcVideoChannelTest, SendStreamNotSendingByDefault) {
-  EXPECT_FALSE(AddSendStream()->IsSending());
-}
-
-TEST_F(WebRtcVideoChannelTest, ReceiveStreamReceivingByDefault) {
-  EXPECT_TRUE(AddRecvStream()->IsReceiving());
-}
-
-TEST_F(WebRtcVideoChannelTest, SetSend) {
-  FakeVideoSendStream* stream = AddSendStream();
-  EXPECT_FALSE(stream->IsSending());
-
-  // false->true
-  EXPECT_TRUE(channel_->SetSend(true));
-  EXPECT_TRUE(stream->IsSending());
-  // true->true
-  EXPECT_TRUE(channel_->SetSend(true));
-  EXPECT_TRUE(stream->IsSending());
-  // true->false
-  EXPECT_TRUE(channel_->SetSend(false));
-  EXPECT_FALSE(stream->IsSending());
-  // false->false
-  EXPECT_TRUE(channel_->SetSend(false));
-  EXPECT_FALSE(stream->IsSending());
-
-  EXPECT_TRUE(channel_->SetSend(true));
-  FakeVideoSendStream* new_stream = AddSendStream();
-  EXPECT_TRUE(new_stream->IsSending())
-      << "Send stream created after SetSend(true) not sending initially.";
-}
-
-// This test verifies DSCP settings are properly applied on video media channel.
-TEST_F(WebRtcVideoChannelTest, TestSetDscpOptions) {
-  std::unique_ptr<cricket::FakeNetworkInterface> network_interface(
-      new cricket::FakeNetworkInterface);
-  MediaConfig config;
-  std::unique_ptr<VideoMediaChannel> channel;
-
-  channel.reset(engine_.CreateChannel(call_.get(), config, VideoOptions()));
-  channel->SetInterface(network_interface.get());
-  // Default value when DSCP is disabled should be DSCP_DEFAULT.
-  EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface->dscp());
-
-  config.enable_dscp = true;
-  channel.reset(engine_.CreateChannel(call_.get(), config, VideoOptions()));
-  channel->SetInterface(network_interface.get());
-  EXPECT_EQ(rtc::DSCP_AF41, network_interface->dscp());
-
-  // Verify that setting the option to false resets the
-  // DiffServCodePoint.
-  config.enable_dscp = false;
-  channel.reset(engine_.CreateChannel(call_.get(), config, VideoOptions()));
-  channel->SetInterface(network_interface.get());
-  EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface->dscp());
-}
-
-// This test verifies that the RTCP reduced size mode is properly applied to
-// send video streams.
-TEST_F(WebRtcVideoChannelTest, TestSetSendRtcpReducedSize) {
-  // Create stream, expecting that default mode is "compound".
-  FakeVideoSendStream* stream1 = AddSendStream();
-  EXPECT_EQ(webrtc::RtcpMode::kCompound, stream1->GetConfig().rtp.rtcp_mode);
-
-  // Now enable reduced size mode.
-  send_parameters_.rtcp.reduced_size = true;
-  EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
-  stream1 = fake_call_->GetVideoSendStreams()[0];
-  EXPECT_EQ(webrtc::RtcpMode::kReducedSize, stream1->GetConfig().rtp.rtcp_mode);
-
-  // Create a new stream and ensure it picks up the reduced size mode.
-  FakeVideoSendStream* stream2 = AddSendStream();
-  EXPECT_EQ(webrtc::RtcpMode::kReducedSize, stream2->GetConfig().rtp.rtcp_mode);
-}
-
-// This test verifies that the RTCP reduced size mode is properly applied to
-// receive video streams.
-TEST_F(WebRtcVideoChannelTest, TestSetRecvRtcpReducedSize) {
-  // Create stream, expecting that default mode is "compound".
-  FakeVideoReceiveStream* stream1 = AddRecvStream();
-  EXPECT_EQ(webrtc::RtcpMode::kCompound, stream1->GetConfig().rtp.rtcp_mode);
-
-  // Now enable reduced size mode.
-  // TODO(deadbeef): Once "recv_parameters" becomes "receiver_parameters",
-  // the reduced_size flag should come from that.
-  send_parameters_.rtcp.reduced_size = true;
-  EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
-  stream1 = fake_call_->GetVideoReceiveStreams()[0];
-  EXPECT_EQ(webrtc::RtcpMode::kReducedSize, stream1->GetConfig().rtp.rtcp_mode);
-
-  // Create a new stream and ensure it picks up the reduced size mode.
-  FakeVideoReceiveStream* stream2 = AddRecvStream();
-  EXPECT_EQ(webrtc::RtcpMode::kReducedSize, stream2->GetConfig().rtp.rtcp_mode);
-}
-
-TEST_F(WebRtcVideoChannelTest, OnReadyToSendSignalsNetworkState) {
-  EXPECT_EQ(webrtc::kNetworkUp,
-            fake_call_->GetNetworkState(webrtc::MediaType::VIDEO));
-  EXPECT_EQ(webrtc::kNetworkUp,
-            fake_call_->GetNetworkState(webrtc::MediaType::AUDIO));
-
-  channel_->OnReadyToSend(false);
-  EXPECT_EQ(webrtc::kNetworkDown,
-            fake_call_->GetNetworkState(webrtc::MediaType::VIDEO));
-  EXPECT_EQ(webrtc::kNetworkUp,
-            fake_call_->GetNetworkState(webrtc::MediaType::AUDIO));
-
-  channel_->OnReadyToSend(true);
-  EXPECT_EQ(webrtc::kNetworkUp,
-            fake_call_->GetNetworkState(webrtc::MediaType::VIDEO));
-  EXPECT_EQ(webrtc::kNetworkUp,
-            fake_call_->GetNetworkState(webrtc::MediaType::AUDIO));
-}
-
-TEST_F(WebRtcVideoChannelTest, GetStatsReportsSentCodecName) {
-  cricket::VideoSendParameters parameters;
-  parameters.codecs.push_back(GetEngineCodec("VP8"));
-  EXPECT_TRUE(channel_->SetSendParameters(parameters));
-
-  AddSendStream();
-
-  cricket::VideoMediaInfo info;
-  ASSERT_TRUE(channel_->GetStats(&info));
-  EXPECT_EQ("VP8", info.senders[0].codec_name);
-}
-
-TEST_F(WebRtcVideoChannelTest, GetStatsReportsEncoderImplementationName) {
-  FakeVideoSendStream* stream = AddSendStream();
-  webrtc::VideoSendStream::Stats stats;
-  stats.encoder_implementation_name = "encoder_implementation_name";
-  stream->SetStats(stats);
-
-  cricket::VideoMediaInfo info;
-  ASSERT_TRUE(channel_->GetStats(&info));
-  EXPECT_EQ(stats.encoder_implementation_name,
-            info.senders[0].encoder_implementation_name);
-}
-
-TEST_F(WebRtcVideoChannelTest, GetStatsReportsCpuOveruseMetrics) {
-  FakeVideoSendStream* stream = AddSendStream();
-  webrtc::VideoSendStream::Stats stats;
-  stats.avg_encode_time_ms = 13;
-  stats.encode_usage_percent = 42;
-  stream->SetStats(stats);
-
-  cricket::VideoMediaInfo info;
-  ASSERT_TRUE(channel_->GetStats(&info));
-  EXPECT_EQ(stats.avg_encode_time_ms, info.senders[0].avg_encode_ms);
-  EXPECT_EQ(stats.encode_usage_percent, info.senders[0].encode_usage_percent);
-}
-
-TEST_F(WebRtcVideoChannelTest, GetStatsReportsFramesEncoded) {
-  FakeVideoSendStream* stream = AddSendStream();
-  webrtc::VideoSendStream::Stats stats;
-  stats.frames_encoded = 13;
-  stream->SetStats(stats);
-
-  cricket::VideoMediaInfo info;
-  ASSERT_TRUE(channel_->GetStats(&info));
-  EXPECT_EQ(stats.frames_encoded, info.senders[0].frames_encoded);
-}
-
-TEST_F(WebRtcVideoChannelTest, GetStatsReportsQpSum) {
-  FakeVideoSendStream* stream = AddSendStream();
-  webrtc::VideoSendStream::Stats stats;
-  stats.qp_sum = rtc::Optional<uint64_t>(13);
-  stream->SetStats(stats);
-
-  cricket::VideoMediaInfo info;
-  ASSERT_TRUE(channel_->GetStats(&info));
-  EXPECT_EQ(stats.qp_sum, info.senders[0].qp_sum);
-}
-
-TEST_F(WebRtcVideoChannelTest, GetStatsReportsUpperResolution) {
-  FakeVideoSendStream* stream = AddSendStream();
-  webrtc::VideoSendStream::Stats stats;
-  stats.substreams[17].width = 123;
-  stats.substreams[17].height = 40;
-  stats.substreams[42].width = 80;
-  stats.substreams[42].height = 31;
-  stats.substreams[11].width = 20;
-  stats.substreams[11].height = 90;
-  stream->SetStats(stats);
-
-  cricket::VideoMediaInfo info;
-  ASSERT_TRUE(channel_->GetStats(&info));
-  ASSERT_EQ(1u, info.senders.size());
-  EXPECT_EQ(123, info.senders[0].send_frame_width);
-  EXPECT_EQ(90, info.senders[0].send_frame_height);
-}
-
-TEST_F(WebRtcVideoChannelTest, GetStatsReportsPreferredBitrate) {
-  FakeVideoSendStream* stream = AddSendStream();
-  webrtc::VideoSendStream::Stats stats;
-  stats.preferred_media_bitrate_bps = 5;
-  stream->SetStats(stats);
-
-  cricket::VideoMediaInfo info;
-  ASSERT_TRUE(channel_->GetStats(&info));
-  ASSERT_EQ(1u, info.senders.size());
-  EXPECT_EQ(5, info.senders[0].preferred_bitrate);
-}
-
-TEST_F(WebRtcVideoChannelTest, GetStatsReportsCpuAdaptationStats) {
-  FakeVideoSendStream* stream = AddSendStream();
-  webrtc::VideoSendStream::Stats stats;
-  stats.number_of_cpu_adapt_changes = 2;
-  stats.cpu_limited_resolution = true;
-  stream->SetStats(stats);
-
-  cricket::VideoMediaInfo info;
-  EXPECT_TRUE(channel_->GetStats(&info));
-  ASSERT_EQ(1U, info.senders.size());
-  EXPECT_EQ(WebRtcVideoChannel::ADAPTREASON_CPU, info.senders[0].adapt_reason);
-  EXPECT_EQ(stats.number_of_cpu_adapt_changes, info.senders[0].adapt_changes);
-}
-
-TEST_F(WebRtcVideoChannelTest, GetStatsReportsAdaptationAndBandwidthStats) {
-  FakeVideoSendStream* stream = AddSendStream();
-  webrtc::VideoSendStream::Stats stats;
-  stats.number_of_cpu_adapt_changes = 2;
-  stats.cpu_limited_resolution = true;
-  stats.bw_limited_resolution = true;
-  stream->SetStats(stats);
-
-  cricket::VideoMediaInfo info;
-  EXPECT_TRUE(channel_->GetStats(&info));
-  ASSERT_EQ(1U, info.senders.size());
-  EXPECT_EQ(WebRtcVideoChannel::ADAPTREASON_CPU |
-                WebRtcVideoChannel::ADAPTREASON_BANDWIDTH,
-            info.senders[0].adapt_reason);
-  EXPECT_EQ(stats.number_of_cpu_adapt_changes, info.senders[0].adapt_changes);
-}
-
-TEST_F(WebRtcVideoChannelTest,
-       GetStatsTranslatesBandwidthLimitedResolutionCorrectly) {
-  FakeVideoSendStream* stream = AddSendStream();
-  webrtc::VideoSendStream::Stats stats;
-  stats.bw_limited_resolution = true;
-  stream->SetStats(stats);
-
-  cricket::VideoMediaInfo info;
-  EXPECT_TRUE(channel_->GetStats(&info));
-  ASSERT_EQ(1U, info.senders.size());
-  EXPECT_EQ(WebRtcVideoChannel::ADAPTREASON_BANDWIDTH,
-            info.senders[0].adapt_reason);
-}
-
-TEST_F(WebRtcVideoChannelTest,
-       GetStatsTranslatesSendRtcpPacketTypesCorrectly) {
-  FakeVideoSendStream* stream = AddSendStream();
-  webrtc::VideoSendStream::Stats stats;
-  stats.substreams[17].rtcp_packet_type_counts.fir_packets = 2;
-  stats.substreams[17].rtcp_packet_type_counts.nack_packets = 3;
-  stats.substreams[17].rtcp_packet_type_counts.pli_packets = 4;
-
-  stats.substreams[42].rtcp_packet_type_counts.fir_packets = 5;
-  stats.substreams[42].rtcp_packet_type_counts.nack_packets = 7;
-  stats.substreams[42].rtcp_packet_type_counts.pli_packets = 9;
-
-  stream->SetStats(stats);
-
-  cricket::VideoMediaInfo info;
-  ASSERT_TRUE(channel_->GetStats(&info));
-  EXPECT_EQ(7, info.senders[0].firs_rcvd);
-  EXPECT_EQ(10, info.senders[0].nacks_rcvd);
-  EXPECT_EQ(13, info.senders[0].plis_rcvd);
-}
-
-TEST_F(WebRtcVideoChannelTest,
-       GetStatsTranslatesReceiveRtcpPacketTypesCorrectly) {
-  FakeVideoReceiveStream* stream = AddRecvStream();
-  webrtc::VideoReceiveStream::Stats stats;
-  stats.rtcp_packet_type_counts.fir_packets = 2;
-  stats.rtcp_packet_type_counts.nack_packets = 3;
-  stats.rtcp_packet_type_counts.pli_packets = 4;
-  stream->SetStats(stats);
-
-  cricket::VideoMediaInfo info;
-  ASSERT_TRUE(channel_->GetStats(&info));
-  EXPECT_EQ(stats.rtcp_packet_type_counts.fir_packets,
-            info.receivers[0].firs_sent);
-  EXPECT_EQ(stats.rtcp_packet_type_counts.nack_packets,
-            info.receivers[0].nacks_sent);
-  EXPECT_EQ(stats.rtcp_packet_type_counts.pli_packets,
-            info.receivers[0].plis_sent);
-}
-
-TEST_F(WebRtcVideoChannelTest, GetStatsTranslatesDecodeStatsCorrectly) {
-  FakeVideoReceiveStream* stream = AddRecvStream();
-  webrtc::VideoReceiveStream::Stats stats;
-  stats.decoder_implementation_name = "decoder_implementation_name";
-  stats.decode_ms = 2;
-  stats.max_decode_ms = 3;
-  stats.current_delay_ms = 4;
-  stats.target_delay_ms = 5;
-  stats.jitter_buffer_ms = 6;
-  stats.min_playout_delay_ms = 7;
-  stats.render_delay_ms = 8;
-  stats.width = 9;
-  stats.height = 10;
-  stats.frame_counts.key_frames = 11;
-  stats.frame_counts.delta_frames = 12;
-  stats.frames_rendered = 13;
-  stats.frames_decoded = 14;
-  stats.qp_sum = rtc::Optional<uint64_t>(15);
-  stream->SetStats(stats);
-
-  cricket::VideoMediaInfo info;
-  ASSERT_TRUE(channel_->GetStats(&info));
-  EXPECT_EQ(stats.decoder_implementation_name,
-            info.receivers[0].decoder_implementation_name);
-  EXPECT_EQ(stats.decode_ms, info.receivers[0].decode_ms);
-  EXPECT_EQ(stats.max_decode_ms, info.receivers[0].max_decode_ms);
-  EXPECT_EQ(stats.current_delay_ms, info.receivers[0].current_delay_ms);
-  EXPECT_EQ(stats.target_delay_ms, info.receivers[0].target_delay_ms);
-  EXPECT_EQ(stats.jitter_buffer_ms, info.receivers[0].jitter_buffer_ms);
-  EXPECT_EQ(stats.min_playout_delay_ms, info.receivers[0].min_playout_delay_ms);
-  EXPECT_EQ(stats.render_delay_ms, info.receivers[0].render_delay_ms);
-  EXPECT_EQ(stats.width, info.receivers[0].frame_width);
-  EXPECT_EQ(stats.height, info.receivers[0].frame_height);
-  EXPECT_EQ(stats.frame_counts.key_frames + stats.frame_counts.delta_frames,
-            info.receivers[0].frames_received);
-  EXPECT_EQ(stats.frames_rendered, info.receivers[0].frames_rendered);
-  EXPECT_EQ(stats.frames_decoded, info.receivers[0].frames_decoded);
-  EXPECT_EQ(stats.qp_sum, info.receivers[0].qp_sum);
-}
-
-TEST_F(WebRtcVideoChannelTest, GetStatsTranslatesReceivePacketStatsCorrectly) {
-  FakeVideoReceiveStream* stream = AddRecvStream();
-  webrtc::VideoReceiveStream::Stats stats;
-  stats.rtp_stats.transmitted.payload_bytes = 2;
-  stats.rtp_stats.transmitted.header_bytes = 3;
-  stats.rtp_stats.transmitted.padding_bytes = 4;
-  stats.rtp_stats.transmitted.packets = 5;
-  stats.rtcp_stats.packets_lost = 6;
-  stats.rtcp_stats.fraction_lost = 7;
-  stream->SetStats(stats);
-
-  cricket::VideoMediaInfo info;
-  ASSERT_TRUE(channel_->GetStats(&info));
-  EXPECT_EQ(stats.rtp_stats.transmitted.payload_bytes +
-                stats.rtp_stats.transmitted.header_bytes +
-                stats.rtp_stats.transmitted.padding_bytes,
-            info.receivers[0].bytes_rcvd);
-  EXPECT_EQ(stats.rtp_stats.transmitted.packets,
-            info.receivers[0].packets_rcvd);
-  EXPECT_EQ(stats.rtcp_stats.packets_lost, info.receivers[0].packets_lost);
-  EXPECT_EQ(static_cast<float>(stats.rtcp_stats.fraction_lost) / (1 << 8),
-            info.receivers[0].fraction_lost);
-}
-
-TEST_F(WebRtcVideoChannelTest, TranslatesCallStatsCorrectly) {
-  AddSendStream();
-  AddSendStream();
-  webrtc::Call::Stats stats;
-  stats.rtt_ms = 123;
-  fake_call_->SetStats(stats);
-
-  cricket::VideoMediaInfo info;
-  ASSERT_TRUE(channel_->GetStats(&info));
-  ASSERT_EQ(2u, info.senders.size());
-  EXPECT_EQ(stats.rtt_ms, info.senders[0].rtt_ms);
-  EXPECT_EQ(stats.rtt_ms, info.senders[1].rtt_ms);
-}
-
-TEST_F(WebRtcVideoChannelTest, TranslatesSenderBitrateStatsCorrectly) {
-  FakeVideoSendStream* stream = AddSendStream();
-  webrtc::VideoSendStream::Stats stats;
-  stats.target_media_bitrate_bps = 156;
-  stats.media_bitrate_bps = 123;
-  stats.substreams[17].total_bitrate_bps = 1;
-  stats.substreams[17].retransmit_bitrate_bps = 2;
-  stats.substreams[42].total_bitrate_bps = 3;
-  stats.substreams[42].retransmit_bitrate_bps = 4;
-  stream->SetStats(stats);
-
-  FakeVideoSendStream* stream2 = AddSendStream();
-  webrtc::VideoSendStream::Stats stats2;
-  stats2.target_media_bitrate_bps = 200;
-  stats2.media_bitrate_bps = 321;
-  stats2.substreams[13].total_bitrate_bps = 5;
-  stats2.substreams[13].retransmit_bitrate_bps = 6;
-  stats2.substreams[21].total_bitrate_bps = 7;
-  stats2.substreams[21].retransmit_bitrate_bps = 8;
-  stream2->SetStats(stats2);
-
-  cricket::VideoMediaInfo info;
-  ASSERT_TRUE(channel_->GetStats(&info));
-  ASSERT_EQ(2u, info.senders.size());
-  BandwidthEstimationInfo bwe_info;
-  channel_->FillBitrateInfo(&bwe_info);
-  // Assuming stream and stream2 corresponds to senders[0] and [1] respectively
-  // is OK as std::maps are sorted and AddSendStream() gives increasing SSRCs.
-  EXPECT_EQ(stats.media_bitrate_bps, info.senders[0].nominal_bitrate);
-  EXPECT_EQ(stats2.media_bitrate_bps, info.senders[1].nominal_bitrate);
-  EXPECT_EQ(stats.target_media_bitrate_bps + stats2.target_media_bitrate_bps,
-            bwe_info.target_enc_bitrate);
-  EXPECT_EQ(stats.media_bitrate_bps + stats2.media_bitrate_bps,
-            bwe_info.actual_enc_bitrate);
-  EXPECT_EQ(1 + 3 + 5 + 7, bwe_info.transmit_bitrate)
-      << "Bandwidth stats should take all streams into account.";
-  EXPECT_EQ(2 + 4 + 6 + 8, bwe_info.retransmit_bitrate)
-      << "Bandwidth stats should take all streams into account.";
-}
-
-TEST_F(WebRtcVideoChannelTest, DefaultReceiveStreamReconfiguresToUseRtx) {
-  EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
-
-  const std::vector<uint32_t> ssrcs = MAKE_VECTOR(kSsrcs1);
-  const std::vector<uint32_t> rtx_ssrcs = MAKE_VECTOR(kRtxSsrcs1);
-
-  ASSERT_EQ(0u, fake_call_->GetVideoReceiveStreams().size());
-  const size_t kDataLength = 12;
-  uint8_t data[kDataLength];
-  memset(data, 0, sizeof(data));
-  rtc::SetBE32(&data[8], ssrcs[0]);
-  rtc::CopyOnWriteBuffer packet(data, kDataLength);
-  rtc::PacketTime packet_time;
-  channel_->OnPacketReceived(&packet, packet_time);
-
-  ASSERT_EQ(1u, fake_call_->GetVideoReceiveStreams().size())
-      << "No default receive stream created.";
-  FakeVideoReceiveStream* recv_stream = fake_call_->GetVideoReceiveStreams()[0];
-  EXPECT_EQ(0u, recv_stream->GetConfig().rtp.rtx_ssrc)
-      << "Default receive stream should not have configured RTX";
-
-  EXPECT_TRUE(channel_->AddRecvStream(
-      cricket::CreateSimWithRtxStreamParams("cname", ssrcs, rtx_ssrcs)));
-  ASSERT_EQ(1u, fake_call_->GetVideoReceiveStreams().size())
-      << "AddRecvStream should have reconfigured, not added a new receiver.";
-  recv_stream = fake_call_->GetVideoReceiveStreams()[0];
-  EXPECT_FALSE(
-      recv_stream->GetConfig().rtp.rtx_associated_payload_types.empty());
-  EXPECT_TRUE(VerifyRtxReceiveAssociations(recv_stream->GetConfig()))
-      << "RTX should be mapped for all decoders/payload types.";
-  EXPECT_TRUE(HasRtxReceiveAssociation(recv_stream->GetConfig(),
-                                          GetEngineCodec("red").id))
-      << "RTX should be mapped also for the RED payload type";
-  EXPECT_EQ(rtx_ssrcs[0], recv_stream->GetConfig().rtp.rtx_ssrc);
-}
-
-TEST_F(WebRtcVideoChannelTest, RejectsAddingStreamsWithMissingSsrcsForRtx) {
-  EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
-
-  const std::vector<uint32_t> ssrcs = MAKE_VECTOR(kSsrcs1);
-  const std::vector<uint32_t> rtx_ssrcs = MAKE_VECTOR(kRtxSsrcs1);
-
-  StreamParams sp =
-      cricket::CreateSimWithRtxStreamParams("cname", ssrcs, rtx_ssrcs);
-  sp.ssrcs = ssrcs;  // Without RTXs, this is the important part.
-
-  EXPECT_FALSE(channel_->AddSendStream(sp));
-  EXPECT_FALSE(channel_->AddRecvStream(sp));
-}
-
-TEST_F(WebRtcVideoChannelTest, RejectsAddingStreamsWithOverlappingRtxSsrcs) {
-  EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
-
-  const std::vector<uint32_t> ssrcs = MAKE_VECTOR(kSsrcs1);
-  const std::vector<uint32_t> rtx_ssrcs = MAKE_VECTOR(kRtxSsrcs1);
-
-  StreamParams sp =
-      cricket::CreateSimWithRtxStreamParams("cname", ssrcs, rtx_ssrcs);
-
-  EXPECT_TRUE(channel_->AddSendStream(sp));
-  EXPECT_TRUE(channel_->AddRecvStream(sp));
-
-  // The RTX SSRC is already used in previous streams, using it should fail.
-  sp = cricket::StreamParams::CreateLegacy(rtx_ssrcs[0]);
-  EXPECT_FALSE(channel_->AddSendStream(sp));
-  EXPECT_FALSE(channel_->AddRecvStream(sp));
-
-  // After removing the original stream this should be fine to add (makes sure
-  // that RTX ssrcs are not forever taken).
-  EXPECT_TRUE(channel_->RemoveSendStream(ssrcs[0]));
-  EXPECT_TRUE(channel_->RemoveRecvStream(ssrcs[0]));
-  EXPECT_TRUE(channel_->AddSendStream(sp));
-  EXPECT_TRUE(channel_->AddRecvStream(sp));
-}
-
-TEST_F(WebRtcVideoChannelTest,
-       RejectsAddingStreamsWithOverlappingSimulcastSsrcs) {
-  static const uint32_t kFirstStreamSsrcs[] = {1, 2, 3};
-  static const uint32_t kOverlappingStreamSsrcs[] = {4, 3, 5};
-  EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
-
-  StreamParams sp =
-      cricket::CreateSimStreamParams("cname", MAKE_VECTOR(kFirstStreamSsrcs));
-
-  EXPECT_TRUE(channel_->AddSendStream(sp));
-  EXPECT_TRUE(channel_->AddRecvStream(sp));
-
-  // One of the SSRCs is already used in previous streams, using it should fail.
-  sp = cricket::CreateSimStreamParams("cname",
-                                      MAKE_VECTOR(kOverlappingStreamSsrcs));
-  EXPECT_FALSE(channel_->AddSendStream(sp));
-  EXPECT_FALSE(channel_->AddRecvStream(sp));
-
-  // After removing the original stream this should be fine to add (makes sure
-  // that RTX ssrcs are not forever taken).
-  EXPECT_TRUE(channel_->RemoveSendStream(kFirstStreamSsrcs[0]));
-  EXPECT_TRUE(channel_->RemoveRecvStream(kFirstStreamSsrcs[0]));
-  EXPECT_TRUE(channel_->AddSendStream(sp));
-  EXPECT_TRUE(channel_->AddRecvStream(sp));
-}
-
-TEST_F(WebRtcVideoChannelTest, ReportsSsrcGroupsInStats) {
-  EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
-
-  static const uint32_t kSenderSsrcs[] = {4, 7, 10};
-  static const uint32_t kSenderRtxSsrcs[] = {5, 8, 11};
-
-  StreamParams sender_sp = cricket::CreateSimWithRtxStreamParams(
-      "cname", MAKE_VECTOR(kSenderSsrcs), MAKE_VECTOR(kSenderRtxSsrcs));
-
-  EXPECT_TRUE(channel_->AddSendStream(sender_sp));
-
-  static const uint32_t kReceiverSsrcs[] = {3};
-  static const uint32_t kReceiverRtxSsrcs[] = {2};
-
-  StreamParams receiver_sp = cricket::CreateSimWithRtxStreamParams(
-      "cname", MAKE_VECTOR(kReceiverSsrcs), MAKE_VECTOR(kReceiverRtxSsrcs));
-  EXPECT_TRUE(channel_->AddRecvStream(receiver_sp));
-
-  cricket::VideoMediaInfo info;
-  ASSERT_TRUE(channel_->GetStats(&info));
-
-  ASSERT_EQ(1u, info.senders.size());
-  ASSERT_EQ(1u, info.receivers.size());
-
-  EXPECT_NE(sender_sp.ssrc_groups, receiver_sp.ssrc_groups);
-  EXPECT_EQ(sender_sp.ssrc_groups, info.senders[0].ssrc_groups);
-  EXPECT_EQ(receiver_sp.ssrc_groups, info.receivers[0].ssrc_groups);
-}
-
-TEST_F(WebRtcVideoChannelTest, MapsReceivedPayloadTypeToCodecName) {
-  FakeVideoReceiveStream* stream = AddRecvStream();
-  webrtc::VideoReceiveStream::Stats stats;
-  cricket::VideoMediaInfo info;
-
-  // Report no codec name before receiving.
-  stream->SetStats(stats);
-  ASSERT_TRUE(channel_->GetStats(&info));
-  EXPECT_STREQ("", info.receivers[0].codec_name.c_str());
-
-  // Report VP8 if we're receiving it.
-  stats.current_payload_type = GetEngineCodec("VP8").id;
-  stream->SetStats(stats);
-  ASSERT_TRUE(channel_->GetStats(&info));
-  EXPECT_STREQ(kVp8CodecName, info.receivers[0].codec_name.c_str());
-
-  // Report no codec name for unknown playload types.
-  stats.current_payload_type = 3;
-  stream->SetStats(stats);
-  ASSERT_TRUE(channel_->GetStats(&info));
-  EXPECT_STREQ("", info.receivers[0].codec_name.c_str());
-}
-
-void WebRtcVideoChannelTest::TestReceiveUnsignaledSsrcPacket(
-    uint8_t payload_type,
-    bool expect_created_receive_stream) {
-  // kRedRtxPayloadType must currently be unused.
-  EXPECT_FALSE(FindCodecById(engine_.codecs(), kRedRtxPayloadType));
-
-  // Add a RED RTX codec.
-  VideoCodec red_rtx_codec =
-      VideoCodec::CreateRtxCodec(kRedRtxPayloadType, GetEngineCodec("red").id);
-  recv_parameters_.codecs.push_back(red_rtx_codec);
-  EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
-
-  ASSERT_EQ(0u, fake_call_->GetVideoReceiveStreams().size());
-  const size_t kDataLength = 12;
-  uint8_t data[kDataLength];
-  memset(data, 0, sizeof(data));
-
-  rtc::Set8(data, 1, payload_type);
-  rtc::SetBE32(&data[8], kIncomingUnsignalledSsrc);
-  rtc::CopyOnWriteBuffer packet(data, kDataLength);
-  rtc::PacketTime packet_time;
-  channel_->OnPacketReceived(&packet, packet_time);
-
-  if (expect_created_receive_stream) {
-    EXPECT_EQ(1u, fake_call_->GetVideoReceiveStreams().size())
-        << "Should have created a receive stream for payload type: "
-        << payload_type;
-  } else {
-    EXPECT_EQ(0u, fake_call_->GetVideoReceiveStreams().size())
-        << "Shouldn't have created a receive stream for payload type: "
-        << payload_type;
-  }
-}
-
-TEST_F(WebRtcVideoChannelTest, Vp8PacketCreatesUnsignalledStream) {
-  TestReceiveUnsignaledSsrcPacket(GetEngineCodec("VP8").id,
-                                  true /* expect_created_receive_stream */);
-}
-
-TEST_F(WebRtcVideoChannelTest, Vp9PacketCreatesUnsignalledStream) {
-  TestReceiveUnsignaledSsrcPacket(GetEngineCodec("VP9").id,
-                                  true /* expect_created_receive_stream */);
-}
-
-TEST_F(WebRtcVideoChannelTest, RtxPacketDoesntCreateUnsignalledStream) {
-  const cricket::VideoCodec vp8 = GetEngineCodec("VP8");
-  const int rtx_vp8_payload_type = default_apt_rtx_types_[vp8.id];
-  TestReceiveUnsignaledSsrcPacket(rtx_vp8_payload_type,
-                                  false /* expect_created_receive_stream */);
-}
-
-TEST_F(WebRtcVideoChannelTest, UlpfecPacketDoesntCreateUnsignalledStream) {
-  TestReceiveUnsignaledSsrcPacket(GetEngineCodec("ulpfec").id,
-                                  false /* expect_created_receive_stream */);
-}
-
-TEST_F(WebRtcVideoChannelFlexfecRecvTest,
-       FlexfecPacketDoesntCreateUnsignalledStream) {
-  TestReceiveUnsignaledSsrcPacket(GetEngineCodec("flexfec-03").id,
-                                  false /* expect_created_receive_stream */);
-}
-
-TEST_F(WebRtcVideoChannelTest, RedRtxPacketDoesntCreateUnsignalledStream) {
-  TestReceiveUnsignaledSsrcPacket(kRedRtxPayloadType,
-                                  false /* expect_created_receive_stream */);
-}
-
-// Test that receiving any unsignalled SSRC works even if it changes.
-// The first unsignalled SSRC received will create a default receive stream.
-// Any different unsignalled SSRC received will replace the default.
-TEST_F(WebRtcVideoChannelTest, ReceiveDifferentUnsignaledSsrc) {
-  // Allow receiving VP8, VP9, H264 (if enabled).
-  cricket::VideoRecvParameters parameters;
-  parameters.codecs.push_back(GetEngineCodec("VP8"));
-  parameters.codecs.push_back(GetEngineCodec("VP9"));
-
-#if defined(WEBRTC_USE_H264)
-  cricket::VideoCodec H264codec(126, "H264");
-  parameters.codecs.push_back(H264codec);
-#endif
-
-  EXPECT_TRUE(channel_->SetRecvParameters(parameters));
-  // No receive streams yet.
-  ASSERT_EQ(0u, fake_call_->GetVideoReceiveStreams().size());
-  cricket::FakeVideoRenderer renderer;
-  EXPECT_TRUE(channel_->SetSink(kDefaultRecvSsrc, &renderer));
-
-  // Receive VP8 packet on first SSRC.
-  uint8_t data[kMinRtpPacketLen];
-  cricket::RtpHeader rtpHeader;
-  rtpHeader.payload_type = GetEngineCodec("VP8").id;
-  rtpHeader.seq_num = rtpHeader.timestamp = 0;
-  rtpHeader.ssrc = kIncomingUnsignalledSsrc+1;
-  cricket::SetRtpHeader(data, sizeof(data), rtpHeader);
-  rtc::CopyOnWriteBuffer packet(data, sizeof(data));
-  rtc::PacketTime packet_time;
-  channel_->OnPacketReceived(&packet, packet_time);
-  // VP8 packet should create default receive stream.
-  ASSERT_EQ(1u, fake_call_->GetVideoReceiveStreams().size());
-  FakeVideoReceiveStream* recv_stream =
-    fake_call_->GetVideoReceiveStreams()[0];
-  EXPECT_EQ(rtpHeader.ssrc, recv_stream->GetConfig().rtp.remote_ssrc);
-  // Verify that the receive stream sinks to a renderer.
-  webrtc::VideoFrame video_frame(CreateBlackFrameBuffer(4, 4), 100, 0,
-                                 webrtc::kVideoRotation_0);
-  recv_stream->InjectFrame(video_frame);
-  EXPECT_EQ(1, renderer.num_rendered_frames());
-
-  // Receive VP9 packet on second SSRC.
-  rtpHeader.payload_type = GetEngineCodec("VP9").id;
-  rtpHeader.ssrc = kIncomingUnsignalledSsrc+2;
-  cricket::SetRtpHeader(data, sizeof(data), rtpHeader);
-  rtc::CopyOnWriteBuffer packet2(data, sizeof(data));
-  channel_->OnPacketReceived(&packet2, packet_time);
-  // VP9 packet should replace the default receive SSRC.
-  ASSERT_EQ(1u, fake_call_->GetVideoReceiveStreams().size());
-  recv_stream = fake_call_->GetVideoReceiveStreams()[0];
-  EXPECT_EQ(rtpHeader.ssrc, recv_stream->GetConfig().rtp.remote_ssrc);
-  // Verify that the receive stream sinks to a renderer.
-  webrtc::VideoFrame video_frame2(CreateBlackFrameBuffer(4, 4), 200, 0,
-                                  webrtc::kVideoRotation_0);
-  recv_stream->InjectFrame(video_frame2);
-  EXPECT_EQ(2, renderer.num_rendered_frames());
-
-#if defined(WEBRTC_USE_H264)
-  // Receive H264 packet on third SSRC.
-  rtpHeader.payload_type = 126;
-  rtpHeader.ssrc = kIncomingUnsignalledSsrc+3;
-  cricket::SetRtpHeader(data, sizeof(data), rtpHeader);
-  rtc::CopyOnWriteBuffer packet3(data, sizeof(data));
-  channel_->OnPacketReceived(&packet3, packet_time);
-  // H264 packet should replace the default receive SSRC.
-  ASSERT_EQ(1u, fake_call_->GetVideoReceiveStreams().size());
-  recv_stream = fake_call_->GetVideoReceiveStreams()[0];
-  EXPECT_EQ(rtpHeader.ssrc, recv_stream->GetConfig().rtp.remote_ssrc);
-  // Verify that the receive stream sinks to a renderer.
-  webrtc::VideoFrame video_frame3(CreateBlackFrameBuffer(4, 4), 300, 0,
-                                  webrtc::kVideoRotation_0);
-  recv_stream->InjectFrame(video_frame3);
-  EXPECT_EQ(3, renderer.num_rendered_frames());
-#endif
-}
-
-// This test verifies that when a new default stream is created for a new
-// unsignaled SSRC, the new stream does not overwrite any old stream that had
-// been the default receive stream before being properly signaled.
-TEST_F(WebRtcVideoChannelTest,
-       NewUnsignaledStreamDoesNotDestroyPreviouslyUnsignaledStream) {
-  cricket::VideoRecvParameters parameters;
-  parameters.codecs.push_back(GetEngineCodec("VP8"));
-  ASSERT_TRUE(channel_->SetRecvParameters(parameters));
-
-  // No streams signaled and no packets received, so we should not have any
-  // stream objects created yet.
-  EXPECT_EQ(0u, fake_call_->GetVideoReceiveStreams().size());
-
-  // Receive packet on an unsignaled SSRC.
-  uint8_t data[kMinRtpPacketLen];
-  cricket::RtpHeader rtp_header;
-  rtp_header.payload_type = GetEngineCodec("VP8").id;
-  rtp_header.seq_num = rtp_header.timestamp = 0;
-  rtp_header.ssrc = kSsrcs3[0];
-  cricket::SetRtpHeader(data, sizeof(data), rtp_header);
-  rtc::CopyOnWriteBuffer packet(data, sizeof(data));
-  rtc::PacketTime packet_time;
-  channel_->OnPacketReceived(&packet, packet_time);
-  // Default receive stream should be created.
-  ASSERT_EQ(1u, fake_call_->GetVideoReceiveStreams().size());
-  FakeVideoReceiveStream* recv_stream0 =
-      fake_call_->GetVideoReceiveStreams()[0];
-  EXPECT_EQ(kSsrcs3[0], recv_stream0->GetConfig().rtp.remote_ssrc);
-
-  // Signal the SSRC.
-  EXPECT_TRUE(
-      channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrcs3[0])));
-  ASSERT_EQ(1u, fake_call_->GetVideoReceiveStreams().size());
-  recv_stream0 = fake_call_->GetVideoReceiveStreams()[0];
-  EXPECT_EQ(kSsrcs3[0], recv_stream0->GetConfig().rtp.remote_ssrc);
-
-  // Receive packet on a different unsignaled SSRC.
-  rtp_header.ssrc = kSsrcs3[1];
-  cricket::SetRtpHeader(data, sizeof(data), rtp_header);
-  packet.SetData(data, sizeof(data));
-  channel_->OnPacketReceived(&packet, packet_time);
-  // New default receive stream should be created, but old stream should remain.
-  ASSERT_EQ(2u, fake_call_->GetVideoReceiveStreams().size());
-  EXPECT_EQ(recv_stream0, fake_call_->GetVideoReceiveStreams()[0]);
-  FakeVideoReceiveStream* recv_stream1 =
-      fake_call_->GetVideoReceiveStreams()[1];
-  EXPECT_EQ(kSsrcs3[1], recv_stream1->GetConfig().rtp.remote_ssrc);
-}
-
-TEST_F(WebRtcVideoChannelTest, CanSentMaxBitrateForExistingStream) {
-  AddSendStream();
-
-  cricket::FakeVideoCapturer capturer;
-  EXPECT_TRUE(channel_->SetVideoSend(last_ssrc_, true, nullptr, &capturer));
-  cricket::VideoFormat capture_format_hd =
-      capturer.GetSupportedFormats()->front();
-  EXPECT_EQ(1280, capture_format_hd.width);
-  EXPECT_EQ(720, capture_format_hd.height);
-  EXPECT_EQ(cricket::CS_RUNNING, capturer.Start(capture_format_hd));
-  EXPECT_TRUE(channel_->SetSend(true));
-  capturer.CaptureFrame();
-
-  int default_encoder_bitrate = GetMaxEncoderBitrate();
-  EXPECT_GT(default_encoder_bitrate, 1000);
-
-  // TODO(skvlad): Resolve the inconsistency between the interpretation
-  // of the global bitrate limit for audio and video:
-  // - Audio: max_bandwidth_bps = 0 - fail the operation,
-  //          max_bandwidth_bps = -1 - remove the bandwidth limit
-  // - Video: max_bandwidth_bps = 0 - remove the bandwidth limit,
-  //          max_bandwidth_bps = -1 - remove the bandwidth limit
-
-  SetAndExpectMaxBitrate(1000, 0, 1000);
-  SetAndExpectMaxBitrate(1000, 800, 800);
-  SetAndExpectMaxBitrate(600, 800, 600);
-  SetAndExpectMaxBitrate(0, 800, 800);
-  SetAndExpectMaxBitrate(0, 0, default_encoder_bitrate);
-
-  EXPECT_TRUE(channel_->SetVideoSend(last_ssrc_, true, nullptr, nullptr));
-}
-
-TEST_F(WebRtcVideoChannelTest, CannotSetMaxBitrateForNonexistentStream) {
-  webrtc::RtpParameters nonexistent_parameters =
-      channel_->GetRtpSendParameters(last_ssrc_);
-  EXPECT_EQ(0, nonexistent_parameters.encodings.size());
-
-  nonexistent_parameters.encodings.push_back(webrtc::RtpEncodingParameters());
-  EXPECT_FALSE(
-      channel_->SetRtpSendParameters(last_ssrc_, nonexistent_parameters));
-}
-
-TEST_F(WebRtcVideoChannelTest,
-       CannotSetRtpSendParametersWithIncorrectNumberOfEncodings) {
-  // This test verifies that setting RtpParameters succeeds only if
-  // the structure contains exactly one encoding.
-  // TODO(skvlad): Update this test when we start supporting setting parameters
-  // for each encoding individually.
-
-  AddSendStream();
-  webrtc::RtpParameters parameters = channel_->GetRtpSendParameters(last_ssrc_);
-  // Two or more encodings should result in failure.
-  parameters.encodings.push_back(webrtc::RtpEncodingParameters());
-  EXPECT_FALSE(channel_->SetRtpSendParameters(last_ssrc_, parameters));
-  // Zero encodings should also fail.
-  parameters.encodings.clear();
-  EXPECT_FALSE(channel_->SetRtpSendParameters(last_ssrc_, parameters));
-}
-
-// Changing the SSRC through RtpParameters is not allowed.
-TEST_F(WebRtcVideoChannelTest, CannotSetSsrcInRtpSendParameters) {
-  AddSendStream();
-  webrtc::RtpParameters parameters = channel_->GetRtpSendParameters(last_ssrc_);
-  parameters.encodings[0].ssrc = rtc::Optional<uint32_t>(0xdeadbeef);
-  EXPECT_FALSE(channel_->SetRtpSendParameters(last_ssrc_, parameters));
-}
-
-// Test that a stream will not be sending if its encoding is made inactive
-// through SetRtpSendParameters.
-// TODO(deadbeef): Update this test when we start supporting setting parameters
-// for each encoding individually.
-TEST_F(WebRtcVideoChannelTest, SetRtpSendParametersEncodingsActive) {
-  FakeVideoSendStream* stream = AddSendStream();
-  EXPECT_TRUE(channel_->SetSend(true));
-  EXPECT_TRUE(stream->IsSending());
-
-  // Get current parameters and change "active" to false.
-  webrtc::RtpParameters parameters = channel_->GetRtpSendParameters(last_ssrc_);
-  ASSERT_EQ(1u, parameters.encodings.size());
-  ASSERT_TRUE(parameters.encodings[0].active);
-  parameters.encodings[0].active = false;
-  EXPECT_TRUE(channel_->SetRtpSendParameters(last_ssrc_, parameters));
-  EXPECT_FALSE(stream->IsSending());
-
-  // Now change it back to active and verify we resume sending.
-  parameters.encodings[0].active = true;
-  EXPECT_TRUE(channel_->SetRtpSendParameters(last_ssrc_, parameters));
-  EXPECT_TRUE(stream->IsSending());
-}
-
-// Test that if a stream is reconfigured (due to a codec change or other
-// change) while its encoding is still inactive, it doesn't start sending.
-TEST_F(WebRtcVideoChannelTest,
-       InactiveStreamDoesntStartSendingWhenReconfigured) {
-  // Set an initial codec list, which will be modified later.
-  cricket::VideoSendParameters parameters1;
-  parameters1.codecs.push_back(GetEngineCodec("VP8"));
-  parameters1.codecs.push_back(GetEngineCodec("VP9"));
-  EXPECT_TRUE(channel_->SetSendParameters(parameters1));
-
-  FakeVideoSendStream* stream = AddSendStream();
-  EXPECT_TRUE(channel_->SetSend(true));
-  EXPECT_TRUE(stream->IsSending());
-
-  // Get current parameters and change "active" to false.
-  webrtc::RtpParameters parameters = channel_->GetRtpSendParameters(last_ssrc_);
-  ASSERT_EQ(1u, parameters.encodings.size());
-  ASSERT_TRUE(parameters.encodings[0].active);
-  parameters.encodings[0].active = false;
-  EXPECT_EQ(1u, GetFakeSendStreams().size());
-  EXPECT_EQ(1, fake_call_->GetNumCreatedSendStreams());
-  EXPECT_TRUE(channel_->SetRtpSendParameters(last_ssrc_, parameters));
-  EXPECT_FALSE(stream->IsSending());
-
-  // Reorder the codec list, causing the stream to be reconfigured.
-  cricket::VideoSendParameters parameters2;
-  parameters2.codecs.push_back(GetEngineCodec("VP9"));
-  parameters2.codecs.push_back(GetEngineCodec("VP8"));
-  EXPECT_TRUE(channel_->SetSendParameters(parameters2));
-  auto new_streams = GetFakeSendStreams();
-  // Assert that a new underlying stream was created due to the codec change.
-  // Otherwise, this test isn't testing what it set out to test.
-  EXPECT_EQ(1u, GetFakeSendStreams().size());
-  EXPECT_EQ(2, fake_call_->GetNumCreatedSendStreams());
-
-  // Verify that we still are not sending anything, due to the inactive
-  // encoding.
-  EXPECT_FALSE(new_streams[0]->IsSending());
-}
-
-// Test that GetRtpSendParameters returns the currently configured codecs.
-TEST_F(WebRtcVideoChannelTest, GetRtpSendParametersCodecs) {
-  AddSendStream();
-  cricket::VideoSendParameters parameters;
-  parameters.codecs.push_back(GetEngineCodec("VP8"));
-  parameters.codecs.push_back(GetEngineCodec("VP9"));
-  EXPECT_TRUE(channel_->SetSendParameters(parameters));
-
-  webrtc::RtpParameters rtp_parameters =
-      channel_->GetRtpSendParameters(last_ssrc_);
-  ASSERT_EQ(2u, rtp_parameters.codecs.size());
-  EXPECT_EQ(GetEngineCodec("VP8").ToCodecParameters(),
-            rtp_parameters.codecs[0]);
-  EXPECT_EQ(GetEngineCodec("VP9").ToCodecParameters(),
-            rtp_parameters.codecs[1]);
-}
-
-// Test that RtpParameters for send stream has one encoding and it has
-// the correct SSRC.
-TEST_F(WebRtcVideoChannelTest, GetRtpSendParametersSsrc) {
-  AddSendStream();
-
-  webrtc::RtpParameters rtp_parameters =
-      channel_->GetRtpSendParameters(last_ssrc_);
-  ASSERT_EQ(1u, rtp_parameters.encodings.size());
-  EXPECT_EQ(rtc::Optional<uint32_t>(last_ssrc_),
-            rtp_parameters.encodings[0].ssrc);
-}
-
-// Test that if we set/get parameters multiple times, we get the same results.
-TEST_F(WebRtcVideoChannelTest, SetAndGetRtpSendParameters) {
-  AddSendStream();
-  cricket::VideoSendParameters parameters;
-  parameters.codecs.push_back(GetEngineCodec("VP8"));
-  parameters.codecs.push_back(GetEngineCodec("VP9"));
-  EXPECT_TRUE(channel_->SetSendParameters(parameters));
-
-  webrtc::RtpParameters initial_params =
-      channel_->GetRtpSendParameters(last_ssrc_);
-
-  // We should be able to set the params we just got.
-  EXPECT_TRUE(channel_->SetRtpSendParameters(last_ssrc_, initial_params));
-
-  // ... And this shouldn't change the params returned by GetRtpSendParameters.
-  EXPECT_EQ(initial_params, channel_->GetRtpSendParameters(last_ssrc_));
-}
-
-// Test that GetRtpReceiveParameters returns the currently configured codecs.
-TEST_F(WebRtcVideoChannelTest, GetRtpReceiveParametersCodecs) {
-  AddRecvStream();
-  cricket::VideoRecvParameters parameters;
-  parameters.codecs.push_back(GetEngineCodec("VP8"));
-  parameters.codecs.push_back(GetEngineCodec("VP9"));
-  EXPECT_TRUE(channel_->SetRecvParameters(parameters));
-
-  webrtc::RtpParameters rtp_parameters =
-      channel_->GetRtpReceiveParameters(last_ssrc_);
-  ASSERT_EQ(2u, rtp_parameters.codecs.size());
-  EXPECT_EQ(GetEngineCodec("VP8").ToCodecParameters(),
-            rtp_parameters.codecs[0]);
-  EXPECT_EQ(GetEngineCodec("VP9").ToCodecParameters(),
-            rtp_parameters.codecs[1]);
-}
-
-#if defined(WEBRTC_USE_H264)
-TEST_F(WebRtcVideoChannelTest, GetRtpReceiveFmtpSprop) {
-#else
-TEST_F(WebRtcVideoChannelTest, DISABLED_GetRtpReceiveFmtpSprop) {
-#endif
-  cricket::VideoRecvParameters parameters;
-  cricket::VideoCodec kH264sprop1(101, "H264");
-  kH264sprop1.SetParam(kH264FmtpSpropParameterSets, "uvw");
-  parameters.codecs.push_back(kH264sprop1);
-  cricket::VideoCodec kH264sprop2(102, "H264");
-  kH264sprop2.SetParam(kH264FmtpSpropParameterSets, "xyz");
-  parameters.codecs.push_back(kH264sprop2);
-  EXPECT_TRUE(channel_->SetRecvParameters(parameters));
-
-  FakeVideoReceiveStream* recv_stream = AddRecvStream();
-  const webrtc::VideoReceiveStream::Config& cfg = recv_stream->GetConfig();
-  webrtc::RtpParameters rtp_parameters =
-      channel_->GetRtpReceiveParameters(last_ssrc_);
-  ASSERT_EQ(2u, rtp_parameters.codecs.size());
-  EXPECT_EQ(kH264sprop1.ToCodecParameters(), rtp_parameters.codecs[0]);
-  ASSERT_EQ(2u, cfg.decoders.size());
-  EXPECT_EQ(101, cfg.decoders[0].payload_type);
-  EXPECT_EQ("H264", cfg.decoders[0].payload_name);
-  const auto it0 =
-      cfg.decoders[0].codec_params.find(kH264FmtpSpropParameterSets);
-  ASSERT_TRUE(it0 != cfg.decoders[0].codec_params.end());
-  EXPECT_EQ("uvw", it0->second);
-
-  EXPECT_EQ(102, cfg.decoders[1].payload_type);
-  EXPECT_EQ("H264", cfg.decoders[1].payload_name);
-  const auto it1 =
-      cfg.decoders[1].codec_params.find(kH264FmtpSpropParameterSets);
-  ASSERT_TRUE(it1 != cfg.decoders[1].codec_params.end());
-  EXPECT_EQ("xyz", it1->second);
-}
-
-// Test that RtpParameters for receive stream has one encoding and it has
-// the correct SSRC.
-TEST_F(WebRtcVideoChannelTest, GetRtpReceiveParametersSsrc) {
-  AddRecvStream();
-
-  webrtc::RtpParameters rtp_parameters =
-      channel_->GetRtpReceiveParameters(last_ssrc_);
-  ASSERT_EQ(1u, rtp_parameters.encodings.size());
-  EXPECT_EQ(rtc::Optional<uint32_t>(last_ssrc_),
-            rtp_parameters.encodings[0].ssrc);
-}
-
-// Test that if we set/get parameters multiple times, we get the same results.
-TEST_F(WebRtcVideoChannelTest, SetAndGetRtpReceiveParameters) {
-  AddRecvStream();
-  cricket::VideoRecvParameters parameters;
-  parameters.codecs.push_back(GetEngineCodec("VP8"));
-  parameters.codecs.push_back(GetEngineCodec("VP9"));
-  EXPECT_TRUE(channel_->SetRecvParameters(parameters));
-
-  webrtc::RtpParameters initial_params =
-      channel_->GetRtpReceiveParameters(last_ssrc_);
-
-  // We should be able to set the params we just got.
-  EXPECT_TRUE(channel_->SetRtpReceiveParameters(last_ssrc_, initial_params));
-
-  // ... And this shouldn't change the params returned by
-  // GetRtpReceiveParameters.
-  EXPECT_EQ(initial_params, channel_->GetRtpReceiveParameters(last_ssrc_));
-}
-
-// Test that GetRtpReceiveParameters returns parameters correctly when SSRCs
-// aren't signaled. It should always return an empty "RtpEncodingParameters",
-// even after a packet is received and the unsignaled SSRC is known.
-TEST_F(WebRtcVideoChannelTest, GetRtpReceiveParametersWithUnsignaledSsrc) {
-  // Call necessary methods to configure receiving a default stream as
-  // soon as it arrives.
-  cricket::VideoRecvParameters parameters;
-  parameters.codecs.push_back(GetEngineCodec("VP8"));
-  parameters.codecs.push_back(GetEngineCodec("VP9"));
-  EXPECT_TRUE(channel_->SetRecvParameters(parameters));
-
-  // Call GetRtpReceiveParameters before configured to receive an unsignaled
-  // stream. Should return nothing.
-  EXPECT_EQ(webrtc::RtpParameters(), channel_->GetRtpReceiveParameters(0));
-
-  // Set a sink for an unsignaled stream.
-  cricket::FakeVideoRenderer renderer;
-  // Value of "0" means "unsignaled stream".
-  EXPECT_TRUE(channel_->SetSink(0, &renderer));
-
-  // Call GetRtpReceiveParameters before the SSRC is known. Value of "0"
-  // in this method means "unsignaled stream".
-  webrtc::RtpParameters rtp_parameters = channel_->GetRtpReceiveParameters(0);
-  ASSERT_EQ(1u, rtp_parameters.encodings.size());
-  EXPECT_FALSE(rtp_parameters.encodings[0].ssrc);
-
-  // Receive VP8 packet.
-  uint8_t data[kMinRtpPacketLen];
-  cricket::RtpHeader rtpHeader;
-  rtpHeader.payload_type = GetEngineCodec("VP8").id;
-  rtpHeader.seq_num = rtpHeader.timestamp = 0;
-  rtpHeader.ssrc = kIncomingUnsignalledSsrc;
-  cricket::SetRtpHeader(data, sizeof(data), rtpHeader);
-  rtc::CopyOnWriteBuffer packet(data, sizeof(data));
-  rtc::PacketTime packet_time;
-  channel_->OnPacketReceived(&packet, packet_time);
-
-  // The |ssrc| member should still be unset.
-  rtp_parameters = channel_->GetRtpReceiveParameters(0);
-  ASSERT_EQ(1u, rtp_parameters.encodings.size());
-  EXPECT_FALSE(rtp_parameters.encodings[0].ssrc);
-}
-
-void WebRtcVideoChannelTest::TestReceiverLocalSsrcConfiguration(
-    bool receiver_first) {
-  EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
-
-  const uint32_t kSenderSsrc = 0xC0FFEE;
-  const uint32_t kSecondSenderSsrc = 0xBADCAFE;
-  const uint32_t kReceiverSsrc = 0x4711;
-  const uint32_t kExpectedDefaultReceiverSsrc = 1;
-
-  if (receiver_first) {
-    AddRecvStream(StreamParams::CreateLegacy(kReceiverSsrc));
-    std::vector<FakeVideoReceiveStream*> receive_streams =
-        fake_call_->GetVideoReceiveStreams();
-    ASSERT_EQ(1u, receive_streams.size());
-    // Default local SSRC when we have no sender.
-    EXPECT_EQ(kExpectedDefaultReceiverSsrc,
-              receive_streams[0]->GetConfig().rtp.local_ssrc);
-  }
-  AddSendStream(StreamParams::CreateLegacy(kSenderSsrc));
-  if (!receiver_first)
-    AddRecvStream(StreamParams::CreateLegacy(kReceiverSsrc));
-  std::vector<FakeVideoReceiveStream*> receive_streams =
-      fake_call_->GetVideoReceiveStreams();
-  ASSERT_EQ(1u, receive_streams.size());
-  EXPECT_EQ(kSenderSsrc, receive_streams[0]->GetConfig().rtp.local_ssrc);
-
-  // Removing first sender should fall back to another (in this case the second)
-  // local send stream's SSRC.
-  AddSendStream(StreamParams::CreateLegacy(kSecondSenderSsrc));
-  ASSERT_TRUE(channel_->RemoveSendStream(kSenderSsrc));
-  receive_streams =
-      fake_call_->GetVideoReceiveStreams();
-  ASSERT_EQ(1u, receive_streams.size());
-  EXPECT_EQ(kSecondSenderSsrc, receive_streams[0]->GetConfig().rtp.local_ssrc);
-
-  // Removing the last sender should fall back to default local SSRC.
-  ASSERT_TRUE(channel_->RemoveSendStream(kSecondSenderSsrc));
-  receive_streams =
-      fake_call_->GetVideoReceiveStreams();
-  ASSERT_EQ(1u, receive_streams.size());
-  EXPECT_EQ(kExpectedDefaultReceiverSsrc,
-            receive_streams[0]->GetConfig().rtp.local_ssrc);
-}
-
-TEST_F(WebRtcVideoChannelTest, ConfiguresLocalSsrc) {
-  TestReceiverLocalSsrcConfiguration(false);
-}
-
-TEST_F(WebRtcVideoChannelTest, ConfiguresLocalSsrcOnExistingReceivers) {
-  TestReceiverLocalSsrcConfiguration(true);
-}
-
-class WebRtcVideoChannelSimulcastTest : public testing::Test {
- public:
-  WebRtcVideoChannelSimulcastTest()
-      : fake_call_(webrtc::Call::Config(&event_log_)),
-        engine_(&encoder_factory_, &decoder_factory_),
-        last_ssrc_(0) {}
-
-  void SetUp() override {
-    channel_.reset(
-        engine_.CreateChannel(&fake_call_, GetMediaConfig(), VideoOptions()));
-    channel_->OnReadyToSend(true);
-    last_ssrc_ = 123;
-  }
-
- protected:
-  void VerifySimulcastSettings(const VideoCodec& codec,
-                               int capture_width,
-                               int capture_height,
-                               size_t num_configured_streams,
-                               size_t expected_num_streams,
-                               bool screenshare,
-                               bool conference_mode) {
-    cricket::VideoSendParameters parameters;
-    parameters.codecs.push_back(codec);
-    parameters.conference_mode = conference_mode;
-    ASSERT_TRUE(channel_->SetSendParameters(parameters));
-
-    std::vector<uint32_t> ssrcs = MAKE_VECTOR(kSsrcs3);
-    RTC_DCHECK(num_configured_streams <= ssrcs.size());
-    ssrcs.resize(num_configured_streams);
-
-    AddSendStream(CreateSimStreamParams("cname", ssrcs));
-    // Send a full-size frame to trigger a stream reconfiguration to use all
-    // expected simulcast layers.
-    cricket::FakeVideoCapturer capturer;
-    VideoOptions options;
-    if (screenshare)
-      options.is_screencast = rtc::Optional<bool>(screenshare);
-    EXPECT_TRUE(
-        channel_->SetVideoSend(ssrcs.front(), true, &options, &capturer));
-    // Fetch the latest stream since SetVideoSend() may recreate it if the
-    // screen content setting is changed.
-    FakeVideoSendStream* stream = fake_call_.GetVideoSendStreams().front();
-    EXPECT_EQ(cricket::CS_RUNNING, capturer.Start(cricket::VideoFormat(
-                                       capture_width, capture_height,
-                                       cricket::VideoFormat::FpsToInterval(30),
-                                       cricket::FOURCC_I420)));
-    channel_->SetSend(true);
-    EXPECT_TRUE(capturer.CaptureFrame());
-
-    std::vector<webrtc::VideoStream> video_streams = stream->GetVideoStreams();
-    ASSERT_EQ(expected_num_streams, video_streams.size());
-
-    std::vector<webrtc::VideoStream> expected_streams;
-    if (conference_mode) {
-      expected_streams = GetSimulcastConfig(
-          num_configured_streams, capture_width, capture_height, 0,
-          kDefaultQpMax, kDefaultVideoMaxFramerate, screenshare);
-      if (screenshare) {
-        for (const webrtc::VideoStream& stream : expected_streams) {
-          // Never scale screen content.
-          EXPECT_EQ(stream.width, capture_width);
-          EXPECT_EQ(stream.height, capture_height);
-        }
-      }
-    } else {
-      webrtc::VideoStream stream;
-      stream.width = capture_width;
-      stream.height = capture_height;
-      stream.max_framerate = kDefaultVideoMaxFramerate;
-      stream.min_bitrate_bps = cricket::kMinVideoBitrateKbps * 1000;
-      int max_bitrate_kbps;
-      if (capture_width * capture_height <= 320 * 240) {
-        max_bitrate_kbps = 600;
-      } else if (capture_width * capture_height <= 640 * 480) {
-        max_bitrate_kbps = 1700;
-      } else if (capture_width * capture_height <= 960 * 540) {
-        max_bitrate_kbps = 2000;
-      } else {
-        max_bitrate_kbps = 2500;
-      }
-      stream.target_bitrate_bps = stream.max_bitrate_bps =
-          max_bitrate_kbps * 1000;
-      stream.max_qp = kDefaultQpMax;
-      expected_streams.push_back(stream);
-    }
-
-    ASSERT_EQ(expected_streams.size(), video_streams.size());
-
-    size_t num_streams = video_streams.size();
-    int total_max_bitrate_bps = 0;
-    for (size_t i = 0; i < num_streams; ++i) {
-      EXPECT_EQ(expected_streams[i].width, video_streams[i].width);
-      EXPECT_EQ(expected_streams[i].height, video_streams[i].height);
-
-      EXPECT_GT(video_streams[i].max_framerate, 0);
-      EXPECT_EQ(expected_streams[i].max_framerate,
-                video_streams[i].max_framerate);
-
-      EXPECT_GT(video_streams[i].min_bitrate_bps, 0);
-      EXPECT_EQ(expected_streams[i].min_bitrate_bps,
-                video_streams[i].min_bitrate_bps);
-
-      EXPECT_GT(video_streams[i].target_bitrate_bps, 0);
-      EXPECT_EQ(expected_streams[i].target_bitrate_bps,
-                video_streams[i].target_bitrate_bps);
-
-      EXPECT_GT(video_streams[i].max_bitrate_bps, 0);
-      EXPECT_EQ(expected_streams[i].max_bitrate_bps,
-                video_streams[i].max_bitrate_bps);
-
-      EXPECT_GT(video_streams[i].max_qp, 0);
-      EXPECT_EQ(expected_streams[i].max_qp, video_streams[i].max_qp);
-
-      EXPECT_EQ(!conference_mode,
-                expected_streams[i].temporal_layer_thresholds_bps.empty());
-      EXPECT_EQ(expected_streams[i].temporal_layer_thresholds_bps,
-                video_streams[i].temporal_layer_thresholds_bps);
-
-      if (i == num_streams - 1) {
-        total_max_bitrate_bps += video_streams[i].max_bitrate_bps;
-      } else {
-        total_max_bitrate_bps += video_streams[i].target_bitrate_bps;
-      }
-    }
-
-    EXPECT_TRUE(channel_->SetVideoSend(ssrcs.front(), true, nullptr, nullptr));
-  }
-
-  FakeVideoSendStream* AddSendStream() {
-    return AddSendStream(StreamParams::CreateLegacy(last_ssrc_++));
-  }
-
-  FakeVideoSendStream* AddSendStream(const StreamParams& sp) {
-    size_t num_streams =
-        fake_call_.GetVideoSendStreams().size();
-    EXPECT_TRUE(channel_->AddSendStream(sp));
-    std::vector<FakeVideoSendStream*> streams =
-        fake_call_.GetVideoSendStreams();
-    EXPECT_EQ(num_streams + 1, streams.size());
-    return streams[streams.size() - 1];
-  }
-
-  std::vector<FakeVideoSendStream*> GetFakeSendStreams() {
-    return fake_call_.GetVideoSendStreams();
-  }
-
-  FakeVideoReceiveStream* AddRecvStream() {
-    return AddRecvStream(StreamParams::CreateLegacy(last_ssrc_++));
-  }
-
-  FakeVideoReceiveStream* AddRecvStream(const StreamParams& sp) {
-    size_t num_streams =
-        fake_call_.GetVideoReceiveStreams().size();
-    EXPECT_TRUE(channel_->AddRecvStream(sp));
-    std::vector<FakeVideoReceiveStream*> streams =
-        fake_call_.GetVideoReceiveStreams();
-    EXPECT_EQ(num_streams + 1, streams.size());
-    return streams[streams.size() - 1];
-  }
-
-  webrtc::RtcEventLogNullImpl event_log_;
-  FakeCall fake_call_;
-  cricket::FakeWebRtcVideoEncoderFactory encoder_factory_;
-  cricket::FakeWebRtcVideoDecoderFactory decoder_factory_;
-  WebRtcVideoEngine engine_;
-  std::unique_ptr<VideoMediaChannel> channel_;
-  uint32_t last_ssrc_;
-};
-
-TEST_F(WebRtcVideoChannelSimulcastTest, SetSendCodecsWith2SimulcastStreams) {
-  VerifySimulcastSettings(cricket::VideoCodec("VP8"), 640, 360, 2, 2, false,
-                          true);
-}
-
-TEST_F(WebRtcVideoChannelSimulcastTest, SetSendCodecsWith3SimulcastStreams) {
-  VerifySimulcastSettings(cricket::VideoCodec("VP8"), 1280, 720, 3, 3, false,
-                          true);
-}
-
-// Test that we normalize send codec format size in simulcast.
-TEST_F(WebRtcVideoChannelSimulcastTest, SetSendCodecsWithOddSizeInSimulcast) {
-  VerifySimulcastSettings(cricket::VideoCodec("VP8"), 541, 271, 2, 2, false,
-                          true);
-}
-
-TEST_F(WebRtcVideoChannelSimulcastTest, SetSendCodecsForScreenshare) {
-  VerifySimulcastSettings(cricket::VideoCodec("VP8"), 1280, 720, 3, 1, true,
-                          false);
-}
-
-TEST_F(WebRtcVideoChannelSimulcastTest,
-       SetSendCodecsForConferenceModeScreenshare) {
-  VerifySimulcastSettings(cricket::VideoCodec("VP8"), 1280, 720, 3, 1, true,
-                          true);
-}
-
-TEST_F(WebRtcVideoChannelSimulcastTest, SetSendCodecsForSimulcastScreenshare) {
-  webrtc::test::ScopedFieldTrials override_field_trials_(
-      "WebRTC-SimulcastScreenshare/Enabled/");
-  VerifySimulcastSettings(cricket::VideoCodec("VP8"), 1280, 720, 3, 2, true,
-                          true);
-}
-
-TEST_F(WebRtcVideoChannelSimulcastTest,
-       NoSimulcastScreenshareWithoutConference) {
-  webrtc::test::ScopedFieldTrials override_field_trials_(
-      "WebRTC-SimulcastScreenshare/Enabled/");
-  VerifySimulcastSettings(cricket::VideoCodec("VP8"), 1280, 720, 3, 1, true,
-                          false);
-}
-
-}  // namespace cricket
diff --git a/media/engine/webrtcvoe.h b/media/engine/webrtcvoe.h
deleted file mode 100644
index 79f0ed6..0000000
--- a/media/engine/webrtcvoe.h
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- *  Copyright (c) 2004 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_MEDIA_ENGINE_WEBRTCVOE_H_
-#define WEBRTC_MEDIA_ENGINE_WEBRTCVOE_H_
-
-#include <memory>
-
-#include "webrtc/media/engine/webrtccommon.h"
-
-#include "webrtc/common_types.h"
-#include "webrtc/modules/audio_device/include/audio_device.h"
-#include "webrtc/voice_engine/include/voe_base.h"
-#include "webrtc/voice_engine/include/voe_codec.h"
-#include "webrtc/voice_engine/include/voe_errors.h"
-
-namespace cricket {
-// automatically handles lifetime of WebRtc VoiceEngine
-class scoped_voe_engine {
- public:
-  explicit scoped_voe_engine(webrtc::VoiceEngine* e) : ptr(e) {}
-  // RTC_DCHECK, to ensure that there are no leaks at shutdown
-  ~scoped_voe_engine() {
-    if (ptr) {
-      const bool success = webrtc::VoiceEngine::Delete(ptr);
-      RTC_DCHECK(success);
-    }
-  }
-  // Releases the current pointer.
-  void reset() {
-    if (ptr) {
-      const bool success = webrtc::VoiceEngine::Delete(ptr);
-      RTC_DCHECK(success);
-      ptr = NULL;
-    }
-  }
-  webrtc::VoiceEngine* get() const { return ptr; }
- private:
-  webrtc::VoiceEngine* ptr;
-};
-
-// unique_ptr-like class to handle obtaining and releasing WebRTC interface
-// pointers.
-template<class T>
-class scoped_voe_ptr {
- public:
-  explicit scoped_voe_ptr(const scoped_voe_engine& e)
-      : ptr(T::GetInterface(e.get())) {}
-  explicit scoped_voe_ptr(T* p) : ptr(p) {}
-  ~scoped_voe_ptr() { if (ptr) ptr->Release(); }
-  T* operator->() const { return ptr; }
-  T* get() const { return ptr; }
-
-  // Releases the current pointer.
-  void reset() {
-    if (ptr) {
-      ptr->Release();
-      ptr = NULL;
-    }
-  }
-
- private:
-  T* ptr;
-};
-
-// Utility class for aggregating the various WebRTC interface.
-// Fake implementations can also be injected for testing.
-class VoEWrapper {
- public:
-  VoEWrapper()
-      : engine_(webrtc::VoiceEngine::Create()), base_(engine_) {
-  }
-  VoEWrapper(webrtc::VoEBase* base)
-      : engine_(NULL), base_(base) {
-  }
-  ~VoEWrapper() {}
-  webrtc::VoiceEngine* engine() const { return engine_.get(); }
-  webrtc::VoEBase* base() const { return base_.get(); }
-  int error() { return base_->LastError(); }
-
- private:
-  scoped_voe_engine engine_;
-  scoped_voe_ptr<webrtc::VoEBase> base_;
-};
-}  // namespace cricket
-
-#endif  // WEBRTC_MEDIA_ENGINE_WEBRTCVOE_H_
diff --git a/media/engine/webrtcvoiceengine.cc b/media/engine/webrtcvoiceengine.cc
deleted file mode 100644
index d202106..0000000
--- a/media/engine/webrtcvoiceengine.cc
+++ /dev/null
@@ -1,2386 +0,0 @@
-/*
- *  Copyright (c) 2004 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.
- */
-
-#ifdef HAVE_WEBRTC_VOICE
-
-#include "webrtc/media/engine/webrtcvoiceengine.h"
-
-#include <algorithm>
-#include <cstdio>
-#include <functional>
-#include <string>
-#include <vector>
-
-#include "webrtc/api/call/audio_sink.h"
-#include "webrtc/media/base/audiosource.h"
-#include "webrtc/media/base/mediaconstants.h"
-#include "webrtc/media/base/streamparams.h"
-#include "webrtc/media/engine/adm_helpers.h"
-#include "webrtc/media/engine/apm_helpers.h"
-#include "webrtc/media/engine/payload_type_mapper.h"
-#include "webrtc/media/engine/webrtcmediaengine.h"
-#include "webrtc/media/engine/webrtcvoe.h"
-#include "webrtc/modules/audio_mixer/audio_mixer_impl.h"
-#include "webrtc/modules/audio_processing/aec_dump/aec_dump_factory.h"
-#include "webrtc/modules/audio_processing/include/audio_processing.h"
-#include "webrtc/rtc_base/arraysize.h"
-#include "webrtc/rtc_base/base64.h"
-#include "webrtc/rtc_base/byteorder.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/helpers.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/race_checker.h"
-#include "webrtc/rtc_base/stringencode.h"
-#include "webrtc/rtc_base/stringutils.h"
-#include "webrtc/rtc_base/trace_event.h"
-#include "webrtc/system_wrappers/include/field_trial.h"
-#include "webrtc/system_wrappers/include/metrics.h"
-#include "webrtc/system_wrappers/include/trace.h"
-#include "webrtc/voice_engine/transmit_mixer.h"
-
-namespace cricket {
-namespace {
-
-constexpr size_t kMaxUnsignaledRecvStreams = 4;
-
-const int kDefaultTraceFilter = webrtc::kTraceNone | webrtc::kTraceTerseInfo |
-                                webrtc::kTraceWarning | webrtc::kTraceError |
-                                webrtc::kTraceCritical;
-const int kElevatedTraceFilter = kDefaultTraceFilter | webrtc::kTraceStateInfo |
-                                 webrtc::kTraceInfo;
-
-constexpr int kNackRtpHistoryMs = 5000;
-
-// Check to verify that the define for the intelligibility enhancer is properly
-// set.
-#if !defined(WEBRTC_INTELLIGIBILITY_ENHANCER) || \
-    (WEBRTC_INTELLIGIBILITY_ENHANCER != 0 &&     \
-     WEBRTC_INTELLIGIBILITY_ENHANCER != 1)
-#error "Set WEBRTC_INTELLIGIBILITY_ENHANCER to either 0 or 1"
-#endif
-
-// For SendSideBwe, Opus bitrate should be in the range between 6000 and 32000.
-const int kOpusMinBitrateBps = 6000;
-const int kOpusBitrateFbBps = 32000;
-
-// Default audio dscp value.
-// See http://tools.ietf.org/html/rfc2474 for details.
-// See also http://tools.ietf.org/html/draft-jennings-rtcweb-qos-00
-const rtc::DiffServCodePoint kAudioDscpValue = rtc::DSCP_EF;
-
-// Constants from voice_engine_defines.h.
-const int kMinTelephoneEventCode = 0;           // RFC4733 (Section 2.3.1)
-const int kMaxTelephoneEventCode = 255;
-
-const int kMinPayloadType = 0;
-const int kMaxPayloadType = 127;
-
-class ProxySink : public webrtc::AudioSinkInterface {
- public:
-  ProxySink(AudioSinkInterface* sink) : sink_(sink) { RTC_DCHECK(sink); }
-
-  void OnData(const Data& audio) override { sink_->OnData(audio); }
-
- private:
-  webrtc::AudioSinkInterface* sink_;
-};
-
-bool ValidateStreamParams(const StreamParams& sp) {
-  if (sp.ssrcs.empty()) {
-    LOG(LS_ERROR) << "No SSRCs in stream parameters: " << sp.ToString();
-    return false;
-  }
-  if (sp.ssrcs.size() > 1) {
-    LOG(LS_ERROR) << "Multiple SSRCs in stream parameters: " << sp.ToString();
-    return false;
-  }
-  return true;
-}
-
-// Dumps an AudioCodec in RFC 2327-ish format.
-std::string ToString(const AudioCodec& codec) {
-  std::stringstream ss;
-  ss << codec.name << "/" << codec.clockrate << "/" << codec.channels;
-  if (!codec.params.empty()) {
-    ss << " {";
-    for (const auto& param : codec.params) {
-      ss << " " << param.first << "=" << param.second;
-    }
-    ss << " }";
-  }
-  ss << " (" << codec.id << ")";
-  return ss.str();
-}
-
-bool IsCodec(const AudioCodec& codec, const char* ref_name) {
-  return (_stricmp(codec.name.c_str(), ref_name) == 0);
-}
-
-bool FindCodec(const std::vector<AudioCodec>& codecs,
-               const AudioCodec& codec,
-               AudioCodec* found_codec) {
-  for (const AudioCodec& c : codecs) {
-    if (c.Matches(codec)) {
-      if (found_codec != NULL) {
-        *found_codec = c;
-      }
-      return true;
-    }
-  }
-  return false;
-}
-
-bool VerifyUniquePayloadTypes(const std::vector<AudioCodec>& codecs) {
-  if (codecs.empty()) {
-    return true;
-  }
-  std::vector<int> payload_types;
-  for (const AudioCodec& codec : codecs) {
-    payload_types.push_back(codec.id);
-  }
-  std::sort(payload_types.begin(), payload_types.end());
-  auto it = std::unique(payload_types.begin(), payload_types.end());
-  return it == payload_types.end();
-}
-
-rtc::Optional<std::string> GetAudioNetworkAdaptorConfig(
-    const AudioOptions& options) {
-  if (options.audio_network_adaptor && *options.audio_network_adaptor &&
-      options.audio_network_adaptor_config) {
-    // Turn on audio network adaptor only when |options_.audio_network_adaptor|
-    // equals true and |options_.audio_network_adaptor_config| has a value.
-    return options.audio_network_adaptor_config;
-  }
-  return rtc::Optional<std::string>();
-}
-
-webrtc::AudioState::Config MakeAudioStateConfig(
-    VoEWrapper* voe_wrapper,
-    rtc::scoped_refptr<webrtc::AudioMixer> audio_mixer,
-    rtc::scoped_refptr<webrtc::AudioProcessing> audio_processing) {
-  webrtc::AudioState::Config config;
-  config.voice_engine = voe_wrapper->engine();
-  if (audio_mixer) {
-    config.audio_mixer = audio_mixer;
-  } else {
-    config.audio_mixer = webrtc::AudioMixerImpl::Create();
-  }
-  config.audio_processing = audio_processing;
-  return config;
-}
-
-// |max_send_bitrate_bps| is the bitrate from "b=" in SDP.
-// |rtp_max_bitrate_bps| is the bitrate from RtpSender::SetParameters.
-rtc::Optional<int> ComputeSendBitrate(int max_send_bitrate_bps,
-                                      rtc::Optional<int> rtp_max_bitrate_bps,
-                                      const webrtc::AudioCodecSpec& spec) {
-  // If application-configured bitrate is set, take minimum of that and SDP
-  // bitrate.
-  const int bps =
-      rtp_max_bitrate_bps
-          ? webrtc::MinPositive(max_send_bitrate_bps, *rtp_max_bitrate_bps)
-          : max_send_bitrate_bps;
-  if (bps <= 0) {
-    return rtc::Optional<int>(spec.info.default_bitrate_bps);
-  }
-
-  if (bps < spec.info.min_bitrate_bps) {
-    // If codec is not multi-rate and |bps| is less than the fixed bitrate then
-    // fail. If codec is not multi-rate and |bps| exceeds or equal the fixed
-    // bitrate then ignore.
-    LOG(LS_ERROR) << "Failed to set codec " << spec.format.name
-                  << " to bitrate " << bps << " bps"
-                  << ", requires at least " << spec.info.min_bitrate_bps
-                  << " bps.";
-    return rtc::Optional<int>();
-  }
-
-  if (spec.info.HasFixedBitrate()) {
-    return rtc::Optional<int>(spec.info.default_bitrate_bps);
-  } else {
-    // If codec is multi-rate then just set the bitrate.
-    return rtc::Optional<int>(std::min(bps, spec.info.max_bitrate_bps));
-  }
-}
-
-}  // namespace
-
-WebRtcVoiceEngine::WebRtcVoiceEngine(
-    webrtc::AudioDeviceModule* adm,
-    const rtc::scoped_refptr<webrtc::AudioEncoderFactory>& encoder_factory,
-    const rtc::scoped_refptr<webrtc::AudioDecoderFactory>& decoder_factory,
-    rtc::scoped_refptr<webrtc::AudioMixer> audio_mixer,
-    rtc::scoped_refptr<webrtc::AudioProcessing> audio_processing)
-    : WebRtcVoiceEngine(adm,
-                        encoder_factory,
-                        decoder_factory,
-                        audio_mixer,
-                        audio_processing,
-                        nullptr) {}
-
-WebRtcVoiceEngine::WebRtcVoiceEngine(
-    webrtc::AudioDeviceModule* adm,
-    const rtc::scoped_refptr<webrtc::AudioEncoderFactory>& encoder_factory,
-    const rtc::scoped_refptr<webrtc::AudioDecoderFactory>& decoder_factory,
-    rtc::scoped_refptr<webrtc::AudioMixer> audio_mixer,
-    rtc::scoped_refptr<webrtc::AudioProcessing> audio_processing,
-    VoEWrapper* voe_wrapper)
-    : adm_(adm),
-      encoder_factory_(encoder_factory),
-      decoder_factory_(decoder_factory),
-      audio_mixer_(audio_mixer),
-      apm_(audio_processing),
-      voe_wrapper_(voe_wrapper) {
-  // This may be called from any thread, so detach thread checkers.
-  worker_thread_checker_.DetachFromThread();
-  signal_thread_checker_.DetachFromThread();
-  LOG(LS_INFO) << "WebRtcVoiceEngine::WebRtcVoiceEngine";
-  RTC_DCHECK(decoder_factory);
-  RTC_DCHECK(encoder_factory);
-  RTC_DCHECK(audio_processing);
-  // The rest of our initialization will happen in Init.
-}
-
-WebRtcVoiceEngine::~WebRtcVoiceEngine() {
-  RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-  LOG(LS_INFO) << "WebRtcVoiceEngine::~WebRtcVoiceEngine";
-  if (initialized_) {
-    StopAecDump();
-    voe_wrapper_->base()->Terminate();
-    webrtc::Trace::SetTraceCallback(nullptr);
-  }
-}
-
-void WebRtcVoiceEngine::Init() {
-  RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-  LOG(LS_INFO) << "WebRtcVoiceEngine::Init";
-
-  // TaskQueue expects to be created/destroyed on the same thread.
-  low_priority_worker_queue_.reset(
-      new rtc::TaskQueue("rtc-low-prio", rtc::TaskQueue::Priority::LOW));
-
-  // VoEWrapper needs to be created on the worker thread. It's expected to be
-  // null here unless it's being injected for testing.
-  if (!voe_wrapper_) {
-    voe_wrapper_.reset(new VoEWrapper());
-  }
-
-  // Load our audio codec lists.
-  LOG(LS_INFO) << "Supported send codecs in order of preference:";
-  send_codecs_ = CollectCodecs(encoder_factory_->GetSupportedEncoders());
-  for (const AudioCodec& codec : send_codecs_) {
-    LOG(LS_INFO) << ToString(codec);
-  }
-
-  LOG(LS_INFO) << "Supported recv codecs in order of preference:";
-  recv_codecs_ = CollectCodecs(decoder_factory_->GetSupportedDecoders());
-  for (const AudioCodec& codec : recv_codecs_) {
-    LOG(LS_INFO) << ToString(codec);
-  }
-
-  channel_config_.enable_voice_pacing = true;
-
-  // Temporarily turn logging level up for the Init() call.
-  webrtc::Trace::SetTraceCallback(this);
-  webrtc::Trace::set_level_filter(kElevatedTraceFilter);
-  LOG(LS_INFO) << webrtc::VoiceEngine::GetVersionString();
-  RTC_CHECK_EQ(0,
-               voe_wrapper_->base()->Init(adm_.get(), apm(), decoder_factory_));
-  webrtc::Trace::set_level_filter(kDefaultTraceFilter);
-
-  // No ADM supplied? Get the default one from VoE.
-  if (!adm_) {
-    adm_ = voe_wrapper_->base()->audio_device_module();
-  }
-  RTC_DCHECK(adm_);
-
-  transmit_mixer_ = voe_wrapper_->base()->transmit_mixer();
-  RTC_DCHECK(transmit_mixer_);
-
-  // Save the default AGC configuration settings. This must happen before
-  // calling ApplyOptions or the default will be overwritten.
-  default_agc_config_ = webrtc::apm_helpers::GetAgcConfig(apm());
-
-  // Set default engine options.
-  {
-    AudioOptions options;
-    options.echo_cancellation = rtc::Optional<bool>(true);
-    options.auto_gain_control = rtc::Optional<bool>(true);
-    options.noise_suppression = rtc::Optional<bool>(true);
-    options.highpass_filter = rtc::Optional<bool>(true);
-    options.stereo_swapping = rtc::Optional<bool>(false);
-    options.audio_jitter_buffer_max_packets = rtc::Optional<int>(50);
-    options.audio_jitter_buffer_fast_accelerate = rtc::Optional<bool>(false);
-    options.typing_detection = rtc::Optional<bool>(true);
-    options.adjust_agc_delta = rtc::Optional<int>(0);
-    options.experimental_agc = rtc::Optional<bool>(false);
-    options.extended_filter_aec = rtc::Optional<bool>(false);
-    options.delay_agnostic_aec = rtc::Optional<bool>(false);
-    options.experimental_ns = rtc::Optional<bool>(false);
-    options.intelligibility_enhancer = rtc::Optional<bool>(false);
-    options.level_control = rtc::Optional<bool>(false);
-    options.residual_echo_detector = rtc::Optional<bool>(true);
-    bool error = ApplyOptions(options);
-    RTC_DCHECK(error);
-  }
-
-  // Set default audio devices.
-#if !defined(WEBRTC_IOS)
-  webrtc::adm_helpers::SetRecordingDevice(adm_);
-  apm()->Initialize();
-  webrtc::adm_helpers::SetPlayoutDevice(adm_);
-#endif  // !WEBRTC_IOS
-
-  // May be null for VoE injected for testing.
-  if (voe()->engine()) {
-    audio_state_ = webrtc::AudioState::Create(
-        MakeAudioStateConfig(voe(), audio_mixer_, apm_));
-  }
-
-  initialized_ = true;
-}
-
-rtc::scoped_refptr<webrtc::AudioState>
-    WebRtcVoiceEngine::GetAudioState() const {
-  RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-  return audio_state_;
-}
-
-VoiceMediaChannel* WebRtcVoiceEngine::CreateChannel(
-    webrtc::Call* call,
-    const MediaConfig& config,
-    const AudioOptions& options) {
-  RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-  return new WebRtcVoiceMediaChannel(this, config, options, call);
-}
-
-bool WebRtcVoiceEngine::ApplyOptions(const AudioOptions& options_in) {
-  RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-  LOG(LS_INFO) << "WebRtcVoiceEngine::ApplyOptions: " << options_in.ToString();
-  AudioOptions options = options_in;  // The options are modified below.
-
-  // Set and adjust echo canceller options.
-  // kEcConference is AEC with high suppression.
-  webrtc::EcModes ec_mode = webrtc::kEcConference;
-  if (options.aecm_generate_comfort_noise) {
-    LOG(LS_VERBOSE) << "Comfort noise explicitly set to "
-                    << *options.aecm_generate_comfort_noise
-                    << " (default is false).";
-  }
-
-#if defined(WEBRTC_IOS)
-  // On iOS, VPIO provides built-in EC.
-  options.echo_cancellation = rtc::Optional<bool>(false);
-  options.extended_filter_aec = rtc::Optional<bool>(false);
-  LOG(LS_INFO) << "Always disable AEC on iOS. Use built-in instead.";
-#elif defined(ANDROID)
-  ec_mode = webrtc::kEcAecm;
-  options.extended_filter_aec = rtc::Optional<bool>(false);
-#endif
-
-  // Delay Agnostic AEC automatically turns on EC if not set except on iOS
-  // where the feature is not supported.
-  bool use_delay_agnostic_aec = false;
-#if !defined(WEBRTC_IOS)
-  if (options.delay_agnostic_aec) {
-    use_delay_agnostic_aec = *options.delay_agnostic_aec;
-    if (use_delay_agnostic_aec) {
-      options.echo_cancellation = rtc::Optional<bool>(true);
-      options.extended_filter_aec = rtc::Optional<bool>(true);
-      ec_mode = webrtc::kEcConference;
-    }
-  }
-#endif
-
-// Set and adjust noise suppressor options.
-#if defined(WEBRTC_IOS)
-  // On iOS, VPIO provides built-in NS.
-  options.noise_suppression = rtc::Optional<bool>(false);
-  options.typing_detection = rtc::Optional<bool>(false);
-  options.experimental_ns = rtc::Optional<bool>(false);
-  LOG(LS_INFO) << "Always disable NS on iOS. Use built-in instead.";
-#elif defined(ANDROID)
-  options.typing_detection = rtc::Optional<bool>(false);
-  options.experimental_ns = rtc::Optional<bool>(false);
-#endif
-
-// Set and adjust gain control options.
-#if defined(WEBRTC_IOS)
-  // On iOS, VPIO provides built-in AGC.
-  options.auto_gain_control = rtc::Optional<bool>(false);
-  options.experimental_agc = rtc::Optional<bool>(false);
-  LOG(LS_INFO) << "Always disable AGC on iOS. Use built-in instead.";
-#elif defined(ANDROID)
-  options.experimental_agc = rtc::Optional<bool>(false);
-#endif
-
-#if defined(WEBRTC_IOS) || defined(WEBRTC_ANDROID)
-  // Turn off the gain control if specified by the field trial. The purpose of the field trial is to reduce the amount of resampling performed inside the audio processing module on mobile platforms by whenever possible turning off the fixed AGC mode and the high-pass filter. (https://bugs.chromium.org/p/webrtc/issues/detail?id=6181).
-  if (webrtc::field_trial::IsEnabled(
-          "WebRTC-Audio-MinimizeResamplingOnMobile")) {
-    options.auto_gain_control = rtc::Optional<bool>(false);
-    LOG(LS_INFO) << "Disable AGC according to field trial.";
-    if (!(options.noise_suppression.value_or(false) or
-          options.echo_cancellation.value_or(false))) {
-      // If possible, turn off the high-pass filter.
-      LOG(LS_INFO) << "Disable high-pass filter in response to field trial.";
-      options.highpass_filter = rtc::Optional<bool>(false);
-    }
-  }
-#endif
-
-#if (WEBRTC_INTELLIGIBILITY_ENHANCER == 0)
-  // Hardcode the intelligibility enhancer to be off.
-  options.intelligibility_enhancer = rtc::Optional<bool>(false);
-#endif
-
-  if (options.echo_cancellation) {
-    // Check if platform supports built-in EC. Currently only supported on
-    // Android and in combination with Java based audio layer.
-    // TODO(henrika): investigate possibility to support built-in EC also
-    // in combination with Open SL ES audio.
-    const bool built_in_aec = adm()->BuiltInAECIsAvailable();
-    if (built_in_aec) {
-      // Built-in EC exists on this device and use_delay_agnostic_aec is not
-      // overriding it. Enable/Disable it according to the echo_cancellation
-      // audio option.
-      const bool enable_built_in_aec =
-          *options.echo_cancellation && !use_delay_agnostic_aec;
-      if (adm()->EnableBuiltInAEC(enable_built_in_aec) == 0 &&
-          enable_built_in_aec) {
-        // Disable internal software EC if built-in EC is enabled,
-        // i.e., replace the software EC with the built-in EC.
-        options.echo_cancellation = rtc::Optional<bool>(false);
-        LOG(LS_INFO) << "Disabling EC since built-in EC will be used instead";
-      }
-    }
-    webrtc::apm_helpers::SetEcStatus(
-        apm(), *options.echo_cancellation, ec_mode);
-#if !defined(ANDROID)
-    webrtc::apm_helpers::SetEcMetricsStatus(apm(), *options.echo_cancellation);
-#endif
-    if (ec_mode == webrtc::kEcAecm) {
-      bool cn = options.aecm_generate_comfort_noise.value_or(false);
-      webrtc::apm_helpers::SetAecmMode(apm(), cn);
-    }
-  }
-
-  if (options.auto_gain_control) {
-    bool built_in_agc_avaliable = adm()->BuiltInAGCIsAvailable();
-    if (built_in_agc_avaliable) {
-      if (adm()->EnableBuiltInAGC(*options.auto_gain_control) == 0 &&
-          *options.auto_gain_control) {
-        // Disable internal software AGC if built-in AGC is enabled,
-        // i.e., replace the software AGC with the built-in AGC.
-        options.auto_gain_control = rtc::Optional<bool>(false);
-        LOG(LS_INFO) << "Disabling AGC since built-in AGC will be used instead";
-      }
-    }
-    webrtc::apm_helpers::SetAgcStatus(apm(), adm(), *options.auto_gain_control);
-  }
-
-  if (options.tx_agc_target_dbov || options.tx_agc_digital_compression_gain ||
-      options.tx_agc_limiter || options.adjust_agc_delta) {
-    // Override default_agc_config_. Generally, an unset option means "leave
-    // the VoE bits alone" in this function, so we want whatever is set to be
-    // stored as the new "default". If we didn't, then setting e.g.
-    // tx_agc_target_dbov would reset digital compression gain and limiter
-    // settings.
-    // Also, if we don't update default_agc_config_, then adjust_agc_delta
-    // would be an offset from the original values, and not whatever was set
-    // explicitly.
-    default_agc_config_.targetLeveldBOv = options.tx_agc_target_dbov.value_or(
-        default_agc_config_.targetLeveldBOv);
-    default_agc_config_.digitalCompressionGaindB =
-        options.tx_agc_digital_compression_gain.value_or(
-            default_agc_config_.digitalCompressionGaindB);
-    default_agc_config_.limiterEnable =
-        options.tx_agc_limiter.value_or(default_agc_config_.limiterEnable);
-
-    webrtc::AgcConfig config = default_agc_config_;
-    if (options.adjust_agc_delta) {
-      config.targetLeveldBOv -= *options.adjust_agc_delta;
-      LOG(LS_INFO) << "Adjusting AGC level from default -"
-                   << default_agc_config_.targetLeveldBOv << "dB to -"
-                   << config.targetLeveldBOv << "dB";
-    }
-    webrtc::apm_helpers::SetAgcConfig(apm(), config);
-  }
-
-  if (options.intelligibility_enhancer) {
-    intelligibility_enhancer_ = options.intelligibility_enhancer;
-  }
-  if (intelligibility_enhancer_ && *intelligibility_enhancer_) {
-    LOG(LS_INFO) << "Enabling NS when Intelligibility Enhancer is active.";
-    options.noise_suppression = intelligibility_enhancer_;
-  }
-
-  if (options.noise_suppression) {
-    if (adm()->BuiltInNSIsAvailable()) {
-      bool builtin_ns =
-          *options.noise_suppression &&
-          !(intelligibility_enhancer_ && *intelligibility_enhancer_);
-      if (adm()->EnableBuiltInNS(builtin_ns) == 0 && builtin_ns) {
-        // Disable internal software NS if built-in NS is enabled,
-        // i.e., replace the software NS with the built-in NS.
-        options.noise_suppression = rtc::Optional<bool>(false);
-        LOG(LS_INFO) << "Disabling NS since built-in NS will be used instead";
-      }
-    }
-    webrtc::apm_helpers::SetNsStatus(apm(), *options.noise_suppression);
-  }
-
-  if (options.stereo_swapping) {
-    LOG(LS_INFO) << "Stereo swapping enabled? " << *options.stereo_swapping;
-    transmit_mixer()->EnableStereoChannelSwapping(*options.stereo_swapping);
-  }
-
-  if (options.audio_jitter_buffer_max_packets) {
-    LOG(LS_INFO) << "NetEq capacity is "
-                 << *options.audio_jitter_buffer_max_packets;
-    channel_config_.acm_config.neteq_config.max_packets_in_buffer =
-        std::max(20, *options.audio_jitter_buffer_max_packets);
-  }
-  if (options.audio_jitter_buffer_fast_accelerate) {
-    LOG(LS_INFO) << "NetEq fast mode? "
-                 << *options.audio_jitter_buffer_fast_accelerate;
-    channel_config_.acm_config.neteq_config.enable_fast_accelerate =
-        *options.audio_jitter_buffer_fast_accelerate;
-  }
-
-  if (options.typing_detection) {
-    LOG(LS_INFO) << "Typing detection is enabled? "
-                 << *options.typing_detection;
-    webrtc::apm_helpers::SetTypingDetectionStatus(
-        apm(), *options.typing_detection);
-  }
-
-  webrtc::Config config;
-
-  if (options.delay_agnostic_aec)
-    delay_agnostic_aec_ = options.delay_agnostic_aec;
-  if (delay_agnostic_aec_) {
-    LOG(LS_INFO) << "Delay agnostic aec is enabled? " << *delay_agnostic_aec_;
-    config.Set<webrtc::DelayAgnostic>(
-        new webrtc::DelayAgnostic(*delay_agnostic_aec_));
-  }
-
-  if (options.extended_filter_aec) {
-    extended_filter_aec_ = options.extended_filter_aec;
-  }
-  if (extended_filter_aec_) {
-    LOG(LS_INFO) << "Extended filter aec is enabled? " << *extended_filter_aec_;
-    config.Set<webrtc::ExtendedFilter>(
-        new webrtc::ExtendedFilter(*extended_filter_aec_));
-  }
-
-  if (options.experimental_ns) {
-    experimental_ns_ = options.experimental_ns;
-  }
-  if (experimental_ns_) {
-    LOG(LS_INFO) << "Experimental ns is enabled? " << *experimental_ns_;
-    config.Set<webrtc::ExperimentalNs>(
-        new webrtc::ExperimentalNs(*experimental_ns_));
-  }
-
-  if (intelligibility_enhancer_) {
-    LOG(LS_INFO) << "Intelligibility Enhancer is enabled? "
-                 << *intelligibility_enhancer_;
-    config.Set<webrtc::Intelligibility>(
-        new webrtc::Intelligibility(*intelligibility_enhancer_));
-  }
-
-  if (options.level_control) {
-    level_control_ = options.level_control;
-  }
-
-  webrtc::AudioProcessing::Config apm_config = apm()->GetConfig();
-
-  LOG(LS_INFO) << "Level control: "
-               << (!!level_control_ ? *level_control_ : -1);
-  if (level_control_) {
-    apm_config.level_controller.enabled = *level_control_;
-    if (options.level_control_initial_peak_level_dbfs) {
-      apm_config.level_controller.initial_peak_level_dbfs =
-          *options.level_control_initial_peak_level_dbfs;
-    }
-  }
-
-  if (options.highpass_filter) {
-    apm_config.high_pass_filter.enabled = *options.highpass_filter;
-  }
-
-  if (options.residual_echo_detector) {
-    apm_config.residual_echo_detector.enabled = *options.residual_echo_detector;
-  }
-
-  apm()->SetExtraOptions(config);
-  apm()->ApplyConfig(apm_config);
-
-  if (options.recording_sample_rate) {
-    LOG(LS_INFO) << "Recording sample rate is "
-                 << *options.recording_sample_rate;
-    if (adm()->SetRecordingSampleRate(*options.recording_sample_rate)) {
-      LOG_RTCERR1(SetRecordingSampleRate, *options.recording_sample_rate);
-    }
-  }
-
-  if (options.playout_sample_rate) {
-    LOG(LS_INFO) << "Playout sample rate is " << *options.playout_sample_rate;
-    if (adm()->SetPlayoutSampleRate(*options.playout_sample_rate)) {
-      LOG_RTCERR1(SetPlayoutSampleRate, *options.playout_sample_rate);
-    }
-  }
-  return true;
-}
-
-// TODO(solenberg): Remove, once AudioMonitor is gone.
-int WebRtcVoiceEngine::GetInputLevel() {
-  RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-  int8_t level = transmit_mixer()->AudioLevel();
-  RTC_DCHECK_LE(0, level);
-  return level;
-}
-
-const std::vector<AudioCodec>& WebRtcVoiceEngine::send_codecs() const {
-  RTC_DCHECK(signal_thread_checker_.CalledOnValidThread());
-  return send_codecs_;
-}
-
-const std::vector<AudioCodec>& WebRtcVoiceEngine::recv_codecs() const {
-  RTC_DCHECK(signal_thread_checker_.CalledOnValidThread());
-  return recv_codecs_;
-}
-
-RtpCapabilities WebRtcVoiceEngine::GetCapabilities() const {
-  RTC_DCHECK(signal_thread_checker_.CalledOnValidThread());
-  RtpCapabilities capabilities;
-  capabilities.header_extensions.push_back(
-      webrtc::RtpExtension(webrtc::RtpExtension::kAudioLevelUri,
-                           webrtc::RtpExtension::kAudioLevelDefaultId));
-  if (webrtc::field_trial::IsEnabled("WebRTC-Audio-SendSideBwe")) {
-    capabilities.header_extensions.push_back(webrtc::RtpExtension(
-        webrtc::RtpExtension::kTransportSequenceNumberUri,
-        webrtc::RtpExtension::kTransportSequenceNumberDefaultId));
-  }
-  return capabilities;
-}
-
-int WebRtcVoiceEngine::GetLastEngineError() {
-  RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-  return voe_wrapper_->error();
-}
-
-void WebRtcVoiceEngine::Print(webrtc::TraceLevel level, const char* trace,
-                              int length) {
-  // Note: This callback can happen on any thread!
-  rtc::LoggingSeverity sev = rtc::LS_VERBOSE;
-  if (level == webrtc::kTraceError || level == webrtc::kTraceCritical)
-    sev = rtc::LS_ERROR;
-  else if (level == webrtc::kTraceWarning)
-    sev = rtc::LS_WARNING;
-  else if (level == webrtc::kTraceStateInfo || level == webrtc::kTraceInfo)
-    sev = rtc::LS_INFO;
-  else if (level == webrtc::kTraceTerseInfo)
-    sev = rtc::LS_INFO;
-
-  // Skip past boilerplate prefix text.
-  if (length < 72) {
-    std::string msg(trace, length);
-    LOG(LS_ERROR) << "Malformed webrtc log message: ";
-    LOG_V(sev) << msg;
-  } else {
-    std::string msg(trace + 71, length - 72);
-    LOG_V(sev) << "webrtc: " << msg;
-  }
-}
-
-void WebRtcVoiceEngine::RegisterChannel(WebRtcVoiceMediaChannel* channel) {
-  RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-  RTC_DCHECK(channel);
-  channels_.push_back(channel);
-}
-
-void WebRtcVoiceEngine::UnregisterChannel(WebRtcVoiceMediaChannel* channel) {
-  RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-  auto it = std::find(channels_.begin(), channels_.end(), channel);
-  RTC_DCHECK(it != channels_.end());
-  channels_.erase(it);
-}
-
-bool WebRtcVoiceEngine::StartAecDump(rtc::PlatformFile file,
-                                     int64_t max_size_bytes) {
-  RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-  auto aec_dump = webrtc::AecDumpFactory::Create(
-      file, max_size_bytes, low_priority_worker_queue_.get());
-  if (!aec_dump) {
-    return false;
-  }
-  apm()->AttachAecDump(std::move(aec_dump));
-  return true;
-}
-
-void WebRtcVoiceEngine::StartAecDump(const std::string& filename) {
-  RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-
-  auto aec_dump = webrtc::AecDumpFactory::Create(
-      filename, -1, low_priority_worker_queue_.get());
-  if (aec_dump) {
-    apm()->AttachAecDump(std::move(aec_dump));
-  }
-}
-
-void WebRtcVoiceEngine::StopAecDump() {
-  RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-  apm()->DetachAecDump();
-}
-
-int WebRtcVoiceEngine::CreateVoEChannel() {
-  RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-  return voe_wrapper_->base()->CreateChannel(channel_config_);
-}
-
-webrtc::AudioDeviceModule* WebRtcVoiceEngine::adm() {
-  RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-  RTC_DCHECK(adm_);
-  return adm_;
-}
-
-webrtc::AudioProcessing* WebRtcVoiceEngine::apm() const {
-  RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-  return apm_.get();
-}
-
-webrtc::voe::TransmitMixer* WebRtcVoiceEngine::transmit_mixer() {
-  RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-  RTC_DCHECK(transmit_mixer_);
-  return transmit_mixer_;
-}
-
-AudioCodecs WebRtcVoiceEngine::CollectCodecs(
-    const std::vector<webrtc::AudioCodecSpec>& specs) const {
-  PayloadTypeMapper mapper;
-  AudioCodecs out;
-
-  // Only generate CN payload types for these clockrates:
-  std::map<int, bool, std::greater<int>> generate_cn = {{ 8000,  false },
-                                                        { 16000, false },
-                                                        { 32000, false }};
-  // Only generate telephone-event payload types for these clockrates:
-  std::map<int, bool, std::greater<int>> generate_dtmf = {{ 8000,  false },
-                                                          { 16000, false },
-                                                          { 32000, false },
-                                                          { 48000, false }};
-
-  auto map_format = [&mapper](const webrtc::SdpAudioFormat& format,
-                              AudioCodecs* out) {
-    rtc::Optional<AudioCodec> opt_codec = mapper.ToAudioCodec(format);
-    if (opt_codec) {
-      if (out) {
-        out->push_back(*opt_codec);
-      }
-    } else {
-      LOG(LS_ERROR) << "Unable to assign payload type to format: " << format;
-    }
-
-    return opt_codec;
-  };
-
-  for (const auto& spec : specs) {
-    // We need to do some extra stuff before adding the main codecs to out.
-    rtc::Optional<AudioCodec> opt_codec = map_format(spec.format, nullptr);
-    if (opt_codec) {
-      AudioCodec& codec = *opt_codec;
-      if (spec.info.supports_network_adaption) {
-        codec.AddFeedbackParam(
-            FeedbackParam(kRtcpFbParamTransportCc, kParamValueEmpty));
-      }
-
-      if (spec.info.allow_comfort_noise) {
-        // Generate a CN entry if the decoder allows it and we support the
-        // clockrate.
-        auto cn = generate_cn.find(spec.format.clockrate_hz);
-        if (cn != generate_cn.end()) {
-          cn->second = true;
-        }
-      }
-
-      // Generate a telephone-event entry if we support the clockrate.
-      auto dtmf = generate_dtmf.find(spec.format.clockrate_hz);
-      if (dtmf != generate_dtmf.end()) {
-        dtmf->second = true;
-      }
-
-      out.push_back(codec);
-    }
-  }
-
-  // Add CN codecs after "proper" audio codecs.
-  for (const auto& cn : generate_cn) {
-    if (cn.second) {
-      map_format({kCnCodecName, cn.first, 1}, &out);
-    }
-  }
-
-  // Add telephone-event codecs last.
-  for (const auto& dtmf : generate_dtmf) {
-    if (dtmf.second) {
-      map_format({kDtmfCodecName, dtmf.first, 1}, &out);
-    }
-  }
-
-  return out;
-}
-
-class WebRtcVoiceMediaChannel::WebRtcAudioSendStream
-    : public AudioSource::Sink {
- public:
-  WebRtcAudioSendStream(
-      int ch,
-      webrtc::AudioTransport* voe_audio_transport,
-      uint32_t ssrc,
-      const std::string& c_name,
-      const rtc::Optional<webrtc::AudioSendStream::Config::SendCodecSpec>&
-          send_codec_spec,
-      const std::vector<webrtc::RtpExtension>& extensions,
-      int max_send_bitrate_bps,
-      const rtc::Optional<std::string>& audio_network_adaptor_config,
-      webrtc::Call* call,
-      webrtc::Transport* send_transport,
-      const rtc::scoped_refptr<webrtc::AudioEncoderFactory>& encoder_factory)
-      : voe_audio_transport_(voe_audio_transport),
-        call_(call),
-        config_(send_transport),
-        send_side_bwe_with_overhead_(
-            webrtc::field_trial::IsEnabled("WebRTC-SendSideBwe-WithOverhead")),
-        max_send_bitrate_bps_(max_send_bitrate_bps),
-        rtp_parameters_(CreateRtpParametersWithOneEncoding()) {
-    RTC_DCHECK_GE(ch, 0);
-    // TODO(solenberg): Once we're not using FakeWebRtcVoiceEngine anymore:
-    // RTC_DCHECK(voe_audio_transport);
-    RTC_DCHECK(call);
-    RTC_DCHECK(encoder_factory);
-    config_.rtp.ssrc = ssrc;
-    config_.rtp.c_name = c_name;
-    config_.voe_channel_id = ch;
-    config_.rtp.extensions = extensions;
-    config_.audio_network_adaptor_config = audio_network_adaptor_config;
-    config_.encoder_factory = encoder_factory;
-    rtp_parameters_.encodings[0].ssrc = rtc::Optional<uint32_t>(ssrc);
-
-    if (send_codec_spec) {
-      UpdateSendCodecSpec(*send_codec_spec);
-    }
-
-    stream_ = call_->CreateAudioSendStream(config_);
-  }
-
-  ~WebRtcAudioSendStream() override {
-    RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-    ClearSource();
-    call_->DestroyAudioSendStream(stream_);
-  }
-
-  void SetSendCodecSpec(
-      const webrtc::AudioSendStream::Config::SendCodecSpec& send_codec_spec) {
-    UpdateSendCodecSpec(send_codec_spec);
-    ReconfigureAudioSendStream();
-  }
-
-  void SetRtpExtensions(const std::vector<webrtc::RtpExtension>& extensions) {
-    RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-    config_.rtp.extensions = extensions;
-    ReconfigureAudioSendStream();
-  }
-
-  void SetAudioNetworkAdaptorConfig(
-      const rtc::Optional<std::string>& audio_network_adaptor_config) {
-    RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-    if (config_.audio_network_adaptor_config == audio_network_adaptor_config) {
-      return;
-    }
-    config_.audio_network_adaptor_config = audio_network_adaptor_config;
-    UpdateAllowedBitrateRange();
-    ReconfigureAudioSendStream();
-  }
-
-  bool SetMaxSendBitrate(int bps) {
-    RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-    RTC_DCHECK(config_.send_codec_spec);
-    RTC_DCHECK(audio_codec_spec_);
-    auto send_rate = ComputeSendBitrate(
-        bps, rtp_parameters_.encodings[0].max_bitrate_bps, *audio_codec_spec_);
-
-    if (!send_rate) {
-      return false;
-    }
-
-    max_send_bitrate_bps_ = bps;
-
-    if (send_rate != config_.send_codec_spec->target_bitrate_bps) {
-      config_.send_codec_spec->target_bitrate_bps = send_rate;
-      ReconfigureAudioSendStream();
-    }
-    return true;
-  }
-
-  bool SendTelephoneEvent(int payload_type, int payload_freq, int event,
-                          int duration_ms) {
-    RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-    RTC_DCHECK(stream_);
-    return stream_->SendTelephoneEvent(payload_type, payload_freq, event,
-                                       duration_ms);
-  }
-
-  void SetSend(bool send) {
-    RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-    send_ = send;
-    UpdateSendState();
-  }
-
-  void SetMuted(bool muted) {
-    RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-    RTC_DCHECK(stream_);
-    stream_->SetMuted(muted);
-    muted_ = muted;
-  }
-
-  bool muted() const {
-    RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-    return muted_;
-  }
-
-  webrtc::AudioSendStream::Stats GetStats() const {
-    RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-    RTC_DCHECK(stream_);
-    return stream_->GetStats();
-  }
-
-  // Starts the sending by setting ourselves as a sink to the AudioSource to
-  // get data callbacks.
-  // This method is called on the libjingle worker thread.
-  // TODO(xians): Make sure Start() is called only once.
-  void SetSource(AudioSource* source) {
-    RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-    RTC_DCHECK(source);
-    if (source_) {
-      RTC_DCHECK(source_ == source);
-      return;
-    }
-    source->SetSink(this);
-    source_ = source;
-    UpdateSendState();
-  }
-
-  // Stops sending by setting the sink of the AudioSource to nullptr. No data
-  // callback will be received after this method.
-  // This method is called on the libjingle worker thread.
-  void ClearSource() {
-    RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-    if (source_) {
-      source_->SetSink(nullptr);
-      source_ = nullptr;
-    }
-    UpdateSendState();
-  }
-
-  // AudioSource::Sink implementation.
-  // This method is called on the audio thread.
-  void OnData(const void* audio_data,
-              int bits_per_sample,
-              int sample_rate,
-              size_t number_of_channels,
-              size_t number_of_frames) override {
-    RTC_CHECK_RUNS_SERIALIZED(&audio_capture_race_checker_);
-    RTC_DCHECK(voe_audio_transport_);
-    voe_audio_transport_->PushCaptureData(config_.voe_channel_id, audio_data,
-                                          bits_per_sample, sample_rate,
-                                          number_of_channels, number_of_frames);
-  }
-
-  // Callback from the |source_| when it is going away. In case Start() has
-  // never been called, this callback won't be triggered.
-  void OnClose() override {
-    RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-    // Set |source_| to nullptr to make sure no more callback will get into
-    // the source.
-    source_ = nullptr;
-    UpdateSendState();
-  }
-
-  // Accessor to the VoE channel ID.
-  int channel() const {
-    RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-    return config_.voe_channel_id;
-  }
-
-  const webrtc::RtpParameters& rtp_parameters() const {
-    return rtp_parameters_;
-  }
-
-  bool ValidateRtpParameters(const webrtc::RtpParameters& rtp_parameters) {
-    if (rtp_parameters.encodings.size() != 1) {
-      LOG(LS_ERROR)
-          << "Attempted to set RtpParameters without exactly one encoding";
-      return false;
-    }
-    if (rtp_parameters.encodings[0].ssrc != rtp_parameters_.encodings[0].ssrc) {
-      LOG(LS_ERROR) << "Attempted to set RtpParameters with modified SSRC";
-      return false;
-    }
-    return true;
-  }
-
-  bool SetRtpParameters(const webrtc::RtpParameters& parameters) {
-    if (!ValidateRtpParameters(parameters)) {
-      return false;
-    }
-
-    rtc::Optional<int> send_rate;
-    if (audio_codec_spec_) {
-      send_rate = ComputeSendBitrate(max_send_bitrate_bps_,
-                                     parameters.encodings[0].max_bitrate_bps,
-                                     *audio_codec_spec_);
-      if (!send_rate) {
-        return false;
-      }
-    }
-
-    const rtc::Optional<int> old_rtp_max_bitrate =
-        rtp_parameters_.encodings[0].max_bitrate_bps;
-
-    rtp_parameters_ = parameters;
-
-    if (rtp_parameters_.encodings[0].max_bitrate_bps != old_rtp_max_bitrate) {
-      // Reconfigure AudioSendStream with new bit rate.
-      if (send_rate) {
-        config_.send_codec_spec->target_bitrate_bps = send_rate;
-      }
-      UpdateAllowedBitrateRange();
-      ReconfigureAudioSendStream();
-    } else {
-      // parameters.encodings[0].active could have changed.
-      UpdateSendState();
-    }
-    return true;
-  }
-
- private:
-  void UpdateSendState() {
-    RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-    RTC_DCHECK(stream_);
-    RTC_DCHECK_EQ(1UL, rtp_parameters_.encodings.size());
-    if (send_ && source_ != nullptr && rtp_parameters_.encodings[0].active) {
-      stream_->Start();
-    } else {  // !send || source_ = nullptr
-      stream_->Stop();
-    }
-  }
-
-  void UpdateAllowedBitrateRange() {
-    RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-    const bool is_opus =
-        config_.send_codec_spec &&
-        !STR_CASE_CMP(config_.send_codec_spec->format.name.c_str(),
-                      kOpusCodecName);
-    if (is_opus && webrtc::field_trial::IsEnabled("WebRTC-Audio-SendSideBwe")) {
-      config_.min_bitrate_bps = kOpusMinBitrateBps;
-
-      // This means that when RtpParameters is reset, we may change the
-      // encoder's bit rate immediately (through ReconfigureAudioSendStream()),
-      // meanwhile change the cap to the output of BWE.
-      config_.max_bitrate_bps =
-          rtp_parameters_.encodings[0].max_bitrate_bps
-              ? *rtp_parameters_.encodings[0].max_bitrate_bps
-              : kOpusBitrateFbBps;
-
-      // TODO(mflodman): Keep testing this and set proper values.
-      // Note: This is an early experiment currently only supported by Opus.
-      if (send_side_bwe_with_overhead_) {
-        const int max_packet_size_ms =
-            WEBRTC_OPUS_SUPPORT_120MS_PTIME ? 120 : 60;
-
-        // OverheadPerPacket = Ipv4(20B) + UDP(8B) + SRTP(10B) + RTP(12)
-        constexpr int kOverheadPerPacket = 20 + 8 + 10 + 12;
-
-        int min_overhead_bps =
-            kOverheadPerPacket * 8 * 1000 / max_packet_size_ms;
-
-        // We assume that |config_.max_bitrate_bps| before the next line is
-        // a hard limit on the payload bitrate, so we add min_overhead_bps to
-        // it to ensure that, when overhead is deducted, the payload rate
-        // never goes beyond the limit.
-        // Note: this also means that if a higher overhead is forced, we
-        // cannot reach the limit.
-        // TODO(minyue): Reconsider this when the signaling to BWE is done
-        // through a dedicated API.
-        config_.max_bitrate_bps += min_overhead_bps;
-
-        // In contrast to max_bitrate_bps, we let min_bitrate_bps always be
-        // reachable.
-        config_.min_bitrate_bps += min_overhead_bps;
-      }
-    }
-  }
-
-  void UpdateSendCodecSpec(
-      const webrtc::AudioSendStream::Config::SendCodecSpec& send_codec_spec) {
-    RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-    config_.rtp.nack.rtp_history_ms =
-        send_codec_spec.nack_enabled ? kNackRtpHistoryMs : 0;
-    config_.send_codec_spec =
-        rtc::Optional<webrtc::AudioSendStream::Config::SendCodecSpec>(
-            send_codec_spec);
-    auto info =
-        config_.encoder_factory->QueryAudioEncoder(send_codec_spec.format);
-    RTC_DCHECK(info);
-    // If a specific target bitrate has been set for the stream, use that as
-    // the new default bitrate when computing send bitrate.
-    if (send_codec_spec.target_bitrate_bps) {
-      info->default_bitrate_bps = std::max(
-          info->min_bitrate_bps,
-          std::min(info->max_bitrate_bps, *send_codec_spec.target_bitrate_bps));
-    }
-
-    audio_codec_spec_.emplace(
-        webrtc::AudioCodecSpec{send_codec_spec.format, *info});
-
-    config_.send_codec_spec->target_bitrate_bps = ComputeSendBitrate(
-        max_send_bitrate_bps_, rtp_parameters_.encodings[0].max_bitrate_bps,
-        *audio_codec_spec_);
-
-    UpdateAllowedBitrateRange();
-  }
-
-  void ReconfigureAudioSendStream() {
-    RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-    RTC_DCHECK(stream_);
-    stream_->Reconfigure(config_);
-  }
-
-  rtc::ThreadChecker worker_thread_checker_;
-  rtc::RaceChecker audio_capture_race_checker_;
-  webrtc::AudioTransport* const voe_audio_transport_ = nullptr;
-  webrtc::Call* call_ = nullptr;
-  webrtc::AudioSendStream::Config config_;
-  const bool send_side_bwe_with_overhead_;
-  // The stream is owned by WebRtcAudioSendStream and may be reallocated if
-  // configuration changes.
-  webrtc::AudioSendStream* stream_ = nullptr;
-
-  // Raw pointer to AudioSource owned by LocalAudioTrackHandler.
-  // PeerConnection will make sure invalidating the pointer before the object
-  // goes away.
-  AudioSource* source_ = nullptr;
-  bool send_ = false;
-  bool muted_ = false;
-  int max_send_bitrate_bps_;
-  webrtc::RtpParameters rtp_parameters_;
-  rtc::Optional<webrtc::AudioCodecSpec> audio_codec_spec_;
-
-  RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(WebRtcAudioSendStream);
-};
-
-class WebRtcVoiceMediaChannel::WebRtcAudioReceiveStream {
- public:
-  WebRtcAudioReceiveStream(
-      int ch,
-      uint32_t remote_ssrc,
-      uint32_t local_ssrc,
-      bool use_transport_cc,
-      bool use_nack,
-      const std::string& sync_group,
-      const std::vector<webrtc::RtpExtension>& extensions,
-      webrtc::Call* call,
-      webrtc::Transport* rtcp_send_transport,
-      const rtc::scoped_refptr<webrtc::AudioDecoderFactory>& decoder_factory,
-      const std::map<int, webrtc::SdpAudioFormat>& decoder_map)
-      : call_(call), config_() {
-    RTC_DCHECK_GE(ch, 0);
-    RTC_DCHECK(call);
-    config_.rtp.remote_ssrc = remote_ssrc;
-    config_.rtp.local_ssrc = local_ssrc;
-    config_.rtp.transport_cc = use_transport_cc;
-    config_.rtp.nack.rtp_history_ms = use_nack ? kNackRtpHistoryMs : 0;
-    config_.rtp.extensions = extensions;
-    config_.rtcp_send_transport = rtcp_send_transport;
-    config_.voe_channel_id = ch;
-    config_.sync_group = sync_group;
-    config_.decoder_factory = decoder_factory;
-    config_.decoder_map = decoder_map;
-    RecreateAudioReceiveStream();
-  }
-
-  ~WebRtcAudioReceiveStream() {
-    RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-    call_->DestroyAudioReceiveStream(stream_);
-  }
-
-  void RecreateAudioReceiveStream(uint32_t local_ssrc) {
-    RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-    config_.rtp.local_ssrc = local_ssrc;
-    RecreateAudioReceiveStream();
-  }
-
-  void RecreateAudioReceiveStream(bool use_transport_cc, bool use_nack) {
-    RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-    config_.rtp.transport_cc = use_transport_cc;
-    config_.rtp.nack.rtp_history_ms = use_nack ? kNackRtpHistoryMs : 0;
-    RecreateAudioReceiveStream();
-  }
-
-  void RecreateAudioReceiveStream(
-      const std::vector<webrtc::RtpExtension>& extensions) {
-    RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-    config_.rtp.extensions = extensions;
-    RecreateAudioReceiveStream();
-  }
-
-  // Set a new payload type -> decoder map.
-  void RecreateAudioReceiveStream(
-      const std::map<int, webrtc::SdpAudioFormat>& decoder_map) {
-    RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-    config_.decoder_map = decoder_map;
-    RecreateAudioReceiveStream();
-  }
-
-  void MaybeRecreateAudioReceiveStream(const std::string& sync_group) {
-    RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-    if (config_.sync_group != sync_group) {
-      config_.sync_group = sync_group;
-      RecreateAudioReceiveStream();
-    }
-  }
-
-  webrtc::AudioReceiveStream::Stats GetStats() const {
-    RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-    RTC_DCHECK(stream_);
-    return stream_->GetStats();
-  }
-
-  int GetOutputLevel() const {
-    RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-    RTC_DCHECK(stream_);
-    return stream_->GetOutputLevel();
-  }
-
-  int channel() const {
-    RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-    return config_.voe_channel_id;
-  }
-
-  void SetRawAudioSink(std::unique_ptr<webrtc::AudioSinkInterface> sink) {
-    RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-    stream_->SetSink(std::move(sink));
-  }
-
-  void SetOutputVolume(double volume) {
-    RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-    stream_->SetGain(volume);
-  }
-
-  void SetPlayout(bool playout) {
-    RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-    RTC_DCHECK(stream_);
-    if (playout) {
-      LOG(LS_INFO) << "Starting playout for channel #" << channel();
-      stream_->Start();
-    } else {
-      LOG(LS_INFO) << "Stopping playout for channel #" << channel();
-      stream_->Stop();
-    }
-    playout_ = playout;
-  }
-
-  std::vector<webrtc::RtpSource> GetSources() {
-    RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-    RTC_DCHECK(stream_);
-    return stream_->GetSources();
-  }
-
- private:
-  void RecreateAudioReceiveStream() {
-    RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-    if (stream_) {
-      call_->DestroyAudioReceiveStream(stream_);
-    }
-    stream_ = call_->CreateAudioReceiveStream(config_);
-    RTC_CHECK(stream_);
-    SetPlayout(playout_);
-  }
-
-  rtc::ThreadChecker worker_thread_checker_;
-  webrtc::Call* call_ = nullptr;
-  webrtc::AudioReceiveStream::Config config_;
-  // The stream is owned by WebRtcAudioReceiveStream and may be reallocated if
-  // configuration changes.
-  webrtc::AudioReceiveStream* stream_ = nullptr;
-  bool playout_ = false;
-
-  RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(WebRtcAudioReceiveStream);
-};
-
-WebRtcVoiceMediaChannel::WebRtcVoiceMediaChannel(WebRtcVoiceEngine* engine,
-                                                 const MediaConfig& config,
-                                                 const AudioOptions& options,
-                                                 webrtc::Call* call)
-    : VoiceMediaChannel(config), engine_(engine), call_(call) {
-  LOG(LS_VERBOSE) << "WebRtcVoiceMediaChannel::WebRtcVoiceMediaChannel";
-  RTC_DCHECK(call);
-  engine->RegisterChannel(this);
-  SetOptions(options);
-}
-
-WebRtcVoiceMediaChannel::~WebRtcVoiceMediaChannel() {
-  RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-  LOG(LS_VERBOSE) << "WebRtcVoiceMediaChannel::~WebRtcVoiceMediaChannel";
-  // TODO(solenberg): Should be able to delete the streams directly, without
-  //                  going through RemoveNnStream(), once stream objects handle
-  //                  all (de)configuration.
-  while (!send_streams_.empty()) {
-    RemoveSendStream(send_streams_.begin()->first);
-  }
-  while (!recv_streams_.empty()) {
-    RemoveRecvStream(recv_streams_.begin()->first);
-  }
-  engine()->UnregisterChannel(this);
-}
-
-rtc::DiffServCodePoint WebRtcVoiceMediaChannel::PreferredDscp() const {
-  return kAudioDscpValue;
-}
-
-bool WebRtcVoiceMediaChannel::SetSendParameters(
-    const AudioSendParameters& params) {
-  TRACE_EVENT0("webrtc", "WebRtcVoiceMediaChannel::SetSendParameters");
-  RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-  LOG(LS_INFO) << "WebRtcVoiceMediaChannel::SetSendParameters: "
-               << params.ToString();
-  // TODO(pthatcher): Refactor this to be more clean now that we have
-  // all the information at once.
-
-  if (!SetSendCodecs(params.codecs)) {
-    return false;
-  }
-
-  if (!ValidateRtpExtensions(params.extensions)) {
-    return false;
-  }
-  std::vector<webrtc::RtpExtension> filtered_extensions =
-      FilterRtpExtensions(params.extensions,
-                          webrtc::RtpExtension::IsSupportedForAudio, true);
-  if (send_rtp_extensions_ != filtered_extensions) {
-    send_rtp_extensions_.swap(filtered_extensions);
-    for (auto& it : send_streams_) {
-      it.second->SetRtpExtensions(send_rtp_extensions_);
-    }
-  }
-
-  if (!SetMaxSendBitrate(params.max_bandwidth_bps)) {
-    return false;
-  }
-  return SetOptions(params.options);
-}
-
-bool WebRtcVoiceMediaChannel::SetRecvParameters(
-    const AudioRecvParameters& params) {
-  TRACE_EVENT0("webrtc", "WebRtcVoiceMediaChannel::SetRecvParameters");
-  RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-  LOG(LS_INFO) << "WebRtcVoiceMediaChannel::SetRecvParameters: "
-               << params.ToString();
-  // TODO(pthatcher): Refactor this to be more clean now that we have
-  // all the information at once.
-
-  if (!SetRecvCodecs(params.codecs)) {
-    return false;
-  }
-
-  if (!ValidateRtpExtensions(params.extensions)) {
-    return false;
-  }
-  std::vector<webrtc::RtpExtension> filtered_extensions =
-      FilterRtpExtensions(params.extensions,
-                          webrtc::RtpExtension::IsSupportedForAudio, false);
-  if (recv_rtp_extensions_ != filtered_extensions) {
-    recv_rtp_extensions_.swap(filtered_extensions);
-    for (auto& it : recv_streams_) {
-      it.second->RecreateAudioReceiveStream(recv_rtp_extensions_);
-    }
-  }
-  return true;
-}
-
-webrtc::RtpParameters WebRtcVoiceMediaChannel::GetRtpSendParameters(
-    uint32_t ssrc) const {
-  RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-  auto it = send_streams_.find(ssrc);
-  if (it == send_streams_.end()) {
-    LOG(LS_WARNING) << "Attempting to get RTP send parameters for stream "
-                    << "with ssrc " << ssrc << " which doesn't exist.";
-    return webrtc::RtpParameters();
-  }
-
-  webrtc::RtpParameters rtp_params = it->second->rtp_parameters();
-  // Need to add the common list of codecs to the send stream-specific
-  // RTP parameters.
-  for (const AudioCodec& codec : send_codecs_) {
-    rtp_params.codecs.push_back(codec.ToCodecParameters());
-  }
-  return rtp_params;
-}
-
-bool WebRtcVoiceMediaChannel::SetRtpSendParameters(
-    uint32_t ssrc,
-    const webrtc::RtpParameters& parameters) {
-  RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-  auto it = send_streams_.find(ssrc);
-  if (it == send_streams_.end()) {
-    LOG(LS_WARNING) << "Attempting to set RTP send parameters for stream "
-                    << "with ssrc " << ssrc << " which doesn't exist.";
-    return false;
-  }
-
-  // TODO(deadbeef): Handle setting parameters with a list of codecs in a
-  // different order (which should change the send codec).
-  webrtc::RtpParameters current_parameters = GetRtpSendParameters(ssrc);
-  if (current_parameters.codecs != parameters.codecs) {
-    LOG(LS_ERROR) << "Using SetParameters to change the set of codecs "
-                  << "is not currently supported.";
-    return false;
-  }
-
-  // TODO(minyue): The following legacy actions go into
-  // |WebRtcAudioSendStream::SetRtpParameters()| which is called at the end,
-  // though there are two difference:
-  // 1. |WebRtcVoiceMediaChannel::SetChannelSendParameters()| only calls
-  // |SetSendCodec| while |WebRtcAudioSendStream::SetRtpParameters()| calls
-  // |SetSendCodecs|. The outcome should be the same.
-  // 2. AudioSendStream can be recreated.
-
-  // Codecs are handled at the WebRtcVoiceMediaChannel level.
-  webrtc::RtpParameters reduced_params = parameters;
-  reduced_params.codecs.clear();
-  return it->second->SetRtpParameters(reduced_params);
-}
-
-webrtc::RtpParameters WebRtcVoiceMediaChannel::GetRtpReceiveParameters(
-    uint32_t ssrc) const {
-  RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-  webrtc::RtpParameters rtp_params;
-  // SSRC of 0 represents the default receive stream.
-  if (ssrc == 0) {
-    if (!default_sink_) {
-      LOG(LS_WARNING) << "Attempting to get RTP parameters for the default, "
-                         "unsignaled audio receive stream, but not yet "
-                         "configured to receive such a stream.";
-      return rtp_params;
-    }
-    rtp_params.encodings.emplace_back();
-  } else {
-    auto it = recv_streams_.find(ssrc);
-    if (it == recv_streams_.end()) {
-      LOG(LS_WARNING) << "Attempting to get RTP receive parameters for stream "
-                      << "with ssrc " << ssrc << " which doesn't exist.";
-      return webrtc::RtpParameters();
-    }
-    rtp_params.encodings.emplace_back();
-    // TODO(deadbeef): Return stream-specific parameters.
-    rtp_params.encodings[0].ssrc = rtc::Optional<uint32_t>(ssrc);
-  }
-
-  for (const AudioCodec& codec : recv_codecs_) {
-    rtp_params.codecs.push_back(codec.ToCodecParameters());
-  }
-  return rtp_params;
-}
-
-bool WebRtcVoiceMediaChannel::SetRtpReceiveParameters(
-    uint32_t ssrc,
-    const webrtc::RtpParameters& parameters) {
-  RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-  // SSRC of 0 represents the default receive stream.
-  if (ssrc == 0) {
-    if (!default_sink_) {
-      LOG(LS_WARNING) << "Attempting to set RTP parameters for the default, "
-                         "unsignaled audio receive stream, but not yet "
-                         "configured to receive such a stream.";
-      return false;
-    }
-  } else {
-    auto it = recv_streams_.find(ssrc);
-    if (it == recv_streams_.end()) {
-      LOG(LS_WARNING) << "Attempting to set RTP receive parameters for stream "
-                      << "with ssrc " << ssrc << " which doesn't exist.";
-      return false;
-    }
-  }
-
-  webrtc::RtpParameters current_parameters = GetRtpReceiveParameters(ssrc);
-  if (current_parameters != parameters) {
-    LOG(LS_ERROR) << "Changing the RTP receive parameters is currently "
-                  << "unsupported.";
-    return false;
-  }
-  return true;
-}
-
-bool WebRtcVoiceMediaChannel::SetOptions(const AudioOptions& options) {
-  RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-  LOG(LS_INFO) << "Setting voice channel options: "
-               << options.ToString();
-
-  // We retain all of the existing options, and apply the given ones
-  // on top.  This means there is no way to "clear" options such that
-  // they go back to the engine default.
-  options_.SetAll(options);
-  if (!engine()->ApplyOptions(options_)) {
-    LOG(LS_WARNING) <<
-        "Failed to apply engine options during channel SetOptions.";
-    return false;
-  }
-
-  rtc::Optional<std::string> audio_network_adaptor_config =
-      GetAudioNetworkAdaptorConfig(options_);
-  for (auto& it : send_streams_) {
-    it.second->SetAudioNetworkAdaptorConfig(audio_network_adaptor_config);
-  }
-
-  LOG(LS_INFO) << "Set voice channel options. Current options: "
-               << options_.ToString();
-  return true;
-}
-
-bool WebRtcVoiceMediaChannel::SetRecvCodecs(
-    const std::vector<AudioCodec>& codecs) {
-  RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-
-  // Set the payload types to be used for incoming media.
-  LOG(LS_INFO) << "Setting receive voice codecs.";
-
-  if (!VerifyUniquePayloadTypes(codecs)) {
-    LOG(LS_ERROR) << "Codec payload types overlap.";
-    return false;
-  }
-
-  // Create a payload type -> SdpAudioFormat map with all the decoders. Fail
-  // unless the factory claims to support all decoders.
-  std::map<int, webrtc::SdpAudioFormat> decoder_map;
-  for (const AudioCodec& codec : codecs) {
-    // Log a warning if a codec's payload type is changing. This used to be
-    // treated as an error. It's abnormal, but not really illegal.
-    AudioCodec old_codec;
-    if (FindCodec(recv_codecs_, codec, &old_codec) &&
-        old_codec.id != codec.id) {
-      LOG(LS_WARNING) << codec.name << " mapped to a second payload type ("
-                      << codec.id << ", was already mapped to " << old_codec.id
-                      << ")";
-    }
-    auto format = AudioCodecToSdpAudioFormat(codec);
-    if (!IsCodec(codec, "cn") && !IsCodec(codec, "telephone-event") &&
-        !engine()->decoder_factory_->IsSupportedDecoder(format)) {
-      LOG(LS_ERROR) << "Unsupported codec: " << format;
-      return false;
-    }
-    // We allow adding new codecs but don't allow changing the payload type of
-    // codecs that are already configured since we might already be receiving
-    // packets with that payload type. See RFC3264, Section 8.3.2.
-    // TODO(deadbeef): Also need to check for clashes with previously mapped
-    // payload types, and not just currently mapped ones. For example, this
-    // should be illegal:
-    // 1. {100: opus/48000/2, 101: ISAC/16000}
-    // 2. {100: opus/48000/2}
-    // 3. {100: opus/48000/2, 101: ISAC/32000}
-    // Though this check really should happen at a higher level, since this
-    // conflict could happen between audio and video codecs.
-    auto existing = decoder_map_.find(codec.id);
-    if (existing != decoder_map_.end() && !existing->second.Matches(format)) {
-      LOG(LS_ERROR) << "Attempting to use payload type " << codec.id << " for "
-                    << codec.name << ", but it is already used for "
-                    << existing->second.name;
-      return false;
-    }
-    decoder_map.insert({codec.id, std::move(format)});
-  }
-
-  if (decoder_map == decoder_map_) {
-    // There's nothing new to configure.
-    return true;
-  }
-
-  if (playout_) {
-    // Receive codecs can not be changed while playing. So we temporarily
-    // pause playout.
-    ChangePlayout(false);
-  }
-
-  decoder_map_ = std::move(decoder_map);
-  for (auto& kv : recv_streams_) {
-    kv.second->RecreateAudioReceiveStream(decoder_map_);
-  }
-  recv_codecs_ = codecs;
-
-  if (desired_playout_ && !playout_) {
-    ChangePlayout(desired_playout_);
-  }
-  return true;
-}
-
-// Utility function called from SetSendParameters() to extract current send
-// codec settings from the given list of codecs (originally from SDP). Both send
-// and receive streams may be reconfigured based on the new settings.
-bool WebRtcVoiceMediaChannel::SetSendCodecs(
-    const std::vector<AudioCodec>& codecs) {
-  RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-  dtmf_payload_type_ = rtc::Optional<int>();
-  dtmf_payload_freq_ = -1;
-
-  // Validate supplied codecs list.
-  for (const AudioCodec& codec : codecs) {
-    // TODO(solenberg): Validate more aspects of input - that payload types
-    //                  don't overlap, remove redundant/unsupported codecs etc -
-    //                  the same way it is done for RtpHeaderExtensions.
-    if (codec.id < kMinPayloadType || codec.id > kMaxPayloadType) {
-      LOG(LS_WARNING) << "Codec payload type out of range: " << ToString(codec);
-      return false;
-    }
-  }
-
-  // Find PT of telephone-event codec with lowest clockrate, as a fallback, in
-  // case we don't have a DTMF codec with a rate matching the send codec's, or
-  // if this function returns early.
-  std::vector<AudioCodec> dtmf_codecs;
-  for (const AudioCodec& codec : codecs) {
-    if (IsCodec(codec, kDtmfCodecName)) {
-      dtmf_codecs.push_back(codec);
-      if (!dtmf_payload_type_ || codec.clockrate < dtmf_payload_freq_) {
-        dtmf_payload_type_ = rtc::Optional<int>(codec.id);
-        dtmf_payload_freq_ = codec.clockrate;
-      }
-    }
-  }
-
-  // Scan through the list to figure out the codec to use for sending.
-  rtc::Optional<webrtc::AudioSendStream::Config::SendCodecSpec> send_codec_spec;
-  webrtc::Call::Config::BitrateConfig bitrate_config;
-  rtc::Optional<webrtc::AudioCodecInfo> voice_codec_info;
-  for (const AudioCodec& voice_codec : codecs) {
-    if (!(IsCodec(voice_codec, kCnCodecName) ||
-          IsCodec(voice_codec, kDtmfCodecName) ||
-          IsCodec(voice_codec, kRedCodecName))) {
-      webrtc::SdpAudioFormat format(voice_codec.name, voice_codec.clockrate,
-                                    voice_codec.channels, voice_codec.params);
-
-      voice_codec_info = engine()->encoder_factory_->QueryAudioEncoder(format);
-      if (!voice_codec_info) {
-        LOG(LS_WARNING) << "Unknown codec " << ToString(voice_codec);
-        continue;
-      }
-
-      send_codec_spec =
-          rtc::Optional<webrtc::AudioSendStream::Config::SendCodecSpec>(
-              {voice_codec.id, format});
-      if (voice_codec.bitrate > 0) {
-        send_codec_spec->target_bitrate_bps =
-            rtc::Optional<int>(voice_codec.bitrate);
-      }
-      send_codec_spec->transport_cc_enabled = HasTransportCc(voice_codec);
-      send_codec_spec->nack_enabled = HasNack(voice_codec);
-      bitrate_config = GetBitrateConfigForCodec(voice_codec);
-      break;
-    }
-  }
-
-  if (!send_codec_spec) {
-    return false;
-  }
-
-  RTC_DCHECK(voice_codec_info);
-  if (voice_codec_info->allow_comfort_noise) {
-    // Loop through the codecs list again to find the CN codec.
-    // TODO(solenberg): Break out into a separate function?
-    for (const AudioCodec& cn_codec : codecs) {
-      if (IsCodec(cn_codec, kCnCodecName) &&
-          cn_codec.clockrate == send_codec_spec->format.clockrate_hz) {
-        switch (cn_codec.clockrate) {
-          case 8000:
-          case 16000:
-          case 32000:
-            send_codec_spec->cng_payload_type = rtc::Optional<int>(cn_codec.id);
-            break;
-          default:
-            LOG(LS_WARNING) << "CN frequency " << cn_codec.clockrate
-                            << " not supported.";
-            break;
-        }
-        break;
-      }
-    }
-
-    // Find the telephone-event PT exactly matching the preferred send codec.
-    for (const AudioCodec& dtmf_codec : dtmf_codecs) {
-      if (dtmf_codec.clockrate == send_codec_spec->format.clockrate_hz) {
-        dtmf_payload_type_ = rtc::Optional<int>(dtmf_codec.id);
-        dtmf_payload_freq_ = dtmf_codec.clockrate;
-        break;
-      }
-    }
-  }
-
-  if (send_codec_spec_ != send_codec_spec) {
-    send_codec_spec_ = std::move(send_codec_spec);
-    // Apply new settings to all streams.
-    for (const auto& kv : send_streams_) {
-      kv.second->SetSendCodecSpec(*send_codec_spec_);
-    }
-  } else {
-    // If the codec isn't changing, set the start bitrate to -1 which means
-    // "unchanged" so that BWE isn't affected.
-    bitrate_config.start_bitrate_bps = -1;
-  }
-  call_->SetBitrateConfig(bitrate_config);
-
-  // Check if the transport cc feedback or NACK status has changed on the
-  // preferred send codec, and in that case reconfigure all receive streams.
-  if (recv_transport_cc_enabled_ != send_codec_spec_->transport_cc_enabled ||
-      recv_nack_enabled_ != send_codec_spec_->nack_enabled) {
-    LOG(LS_INFO) << "Recreate all the receive streams because the send "
-                    "codec has changed.";
-    recv_transport_cc_enabled_ = send_codec_spec_->transport_cc_enabled;
-    recv_nack_enabled_ = send_codec_spec_->nack_enabled;
-    for (auto& kv : recv_streams_) {
-      kv.second->RecreateAudioReceiveStream(recv_transport_cc_enabled_,
-                                            recv_nack_enabled_);
-    }
-  }
-
-  send_codecs_ = codecs;
-  return true;
-}
-
-void WebRtcVoiceMediaChannel::SetPlayout(bool playout) {
-  desired_playout_ = playout;
-  return ChangePlayout(desired_playout_);
-}
-
-void WebRtcVoiceMediaChannel::ChangePlayout(bool playout) {
-  TRACE_EVENT0("webrtc", "WebRtcVoiceMediaChannel::ChangePlayout");
-  RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-  if (playout_ == playout) {
-    return;
-  }
-
-  for (const auto& kv : recv_streams_) {
-    kv.second->SetPlayout(playout);
-  }
-  playout_ = playout;
-}
-
-void WebRtcVoiceMediaChannel::SetSend(bool send) {
-  TRACE_EVENT0("webrtc", "WebRtcVoiceMediaChannel::SetSend");
-  if (send_ == send) {
-    return;
-  }
-
-  // Apply channel specific options, and initialize the ADM for recording (this
-  // may take time on some platforms, e.g. Android).
-  if (send) {
-    engine()->ApplyOptions(options_);
-
-    // InitRecording() may return an error if the ADM is already recording.
-    if (!engine()->adm()->RecordingIsInitialized() &&
-        !engine()->adm()->Recording()) {
-      if (engine()->adm()->InitRecording() != 0) {
-        LOG(LS_WARNING) << "Failed to initialize recording";
-      }
-    }
-  }
-
-  // Change the settings on each send channel.
-  for (auto& kv : send_streams_) {
-    kv.second->SetSend(send);
-  }
-
-  send_ = send;
-}
-
-bool WebRtcVoiceMediaChannel::SetAudioSend(uint32_t ssrc,
-                                           bool enable,
-                                           const AudioOptions* options,
-                                           AudioSource* source) {
-  RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-  // TODO(solenberg): The state change should be fully rolled back if any one of
-  //                  these calls fail.
-  if (!SetLocalSource(ssrc, source)) {
-    return false;
-  }
-  if (!MuteStream(ssrc, !enable)) {
-    return false;
-  }
-  if (enable && options) {
-    return SetOptions(*options);
-  }
-  return true;
-}
-
-int WebRtcVoiceMediaChannel::CreateVoEChannel() {
-  int id = engine()->CreateVoEChannel();
-  if (id == -1) {
-    LOG_RTCERR0(CreateVoEChannel);
-    return -1;
-  }
-
-  return id;
-}
-
-bool WebRtcVoiceMediaChannel::DeleteVoEChannel(int channel) {
-  if (engine()->voe()->base()->DeleteChannel(channel) == -1) {
-    LOG_RTCERR1(DeleteChannel, channel);
-    return false;
-  }
-  return true;
-}
-
-bool WebRtcVoiceMediaChannel::AddSendStream(const StreamParams& sp) {
-  TRACE_EVENT0("webrtc", "WebRtcVoiceMediaChannel::AddSendStream");
-  RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-  LOG(LS_INFO) << "AddSendStream: " << sp.ToString();
-
-  uint32_t ssrc = sp.first_ssrc();
-  RTC_DCHECK(0 != ssrc);
-
-  if (GetSendChannelId(ssrc) != -1) {
-    LOG(LS_ERROR) << "Stream already exists with ssrc " << ssrc;
-    return false;
-  }
-
-  // Create a new channel for sending audio data.
-  int channel = CreateVoEChannel();
-  if (channel == -1) {
-    return false;
-  }
-
-  // Save the channel to send_streams_, so that RemoveSendStream() can still
-  // delete the channel in case failure happens below.
-  webrtc::AudioTransport* audio_transport =
-      engine()->voe()->base()->audio_transport();
-
-  rtc::Optional<std::string> audio_network_adaptor_config =
-      GetAudioNetworkAdaptorConfig(options_);
-  WebRtcAudioSendStream* stream = new WebRtcAudioSendStream(
-      channel, audio_transport, ssrc, sp.cname, send_codec_spec_,
-      send_rtp_extensions_, max_send_bitrate_bps_, audio_network_adaptor_config,
-      call_, this, engine()->encoder_factory_);
-  send_streams_.insert(std::make_pair(ssrc, stream));
-
-  // At this point the stream's local SSRC has been updated. If it is the first
-  // send stream, make sure that all the receive streams are updated with the
-  // same SSRC in order to send receiver reports.
-  if (send_streams_.size() == 1) {
-    receiver_reports_ssrc_ = ssrc;
-    for (const auto& kv : recv_streams_) {
-      // TODO(solenberg): Allow applications to set the RTCP SSRC of receive
-      // streams instead, so we can avoid recreating the streams here.
-      kv.second->RecreateAudioReceiveStream(ssrc);
-    }
-  }
-
-  send_streams_[ssrc]->SetSend(send_);
-  return true;
-}
-
-bool WebRtcVoiceMediaChannel::RemoveSendStream(uint32_t ssrc) {
-  TRACE_EVENT0("webrtc", "WebRtcVoiceMediaChannel::RemoveSendStream");
-  RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-  LOG(LS_INFO) << "RemoveSendStream: " << ssrc;
-
-  auto it = send_streams_.find(ssrc);
-  if (it == send_streams_.end()) {
-    LOG(LS_WARNING) << "Try to remove stream with ssrc " << ssrc
-                    << " which doesn't exist.";
-    return false;
-  }
-
-  it->second->SetSend(false);
-
-  // TODO(solenberg): If we're removing the receiver_reports_ssrc_ stream, find
-  // the first active send stream and use that instead, reassociating receive
-  // streams.
-
-  // Clean up and delete the send stream+channel.
-  int channel = it->second->channel();
-  LOG(LS_INFO) << "Removing audio send stream " << ssrc
-               << " with VoiceEngine channel #" << channel << ".";
-  delete it->second;
-  send_streams_.erase(it);
-  if (!DeleteVoEChannel(channel)) {
-    return false;
-  }
-  if (send_streams_.empty()) {
-    SetSend(false);
-  }
-  return true;
-}
-
-bool WebRtcVoiceMediaChannel::AddRecvStream(const StreamParams& sp) {
-  TRACE_EVENT0("webrtc", "WebRtcVoiceMediaChannel::AddRecvStream");
-  RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-  LOG(LS_INFO) << "AddRecvStream: " << sp.ToString();
-
-  if (!ValidateStreamParams(sp)) {
-    return false;
-  }
-
-  const uint32_t ssrc = sp.first_ssrc();
-  if (ssrc == 0) {
-    LOG(LS_WARNING) << "AddRecvStream with ssrc==0 is not supported.";
-    return false;
-  }
-
-  // If this stream was previously received unsignaled, we promote it, possibly
-  // recreating the AudioReceiveStream, if sync_label has changed.
-  if (MaybeDeregisterUnsignaledRecvStream(ssrc)) {
-    recv_streams_[ssrc]->MaybeRecreateAudioReceiveStream(sp.sync_label);
-    return true;
-  }
-
-  if (GetReceiveChannelId(ssrc) != -1) {
-    LOG(LS_ERROR) << "Stream already exists with ssrc " << ssrc;
-    return false;
-  }
-
-  // Create a new channel for receiving audio data.
-  const int channel = CreateVoEChannel();
-  if (channel == -1) {
-    return false;
-  }
-
-  recv_streams_.insert(std::make_pair(
-      ssrc,
-      new WebRtcAudioReceiveStream(
-          channel, ssrc, receiver_reports_ssrc_, recv_transport_cc_enabled_,
-          recv_nack_enabled_, sp.sync_label, recv_rtp_extensions_, call_, this,
-          engine()->decoder_factory_, decoder_map_)));
-  recv_streams_[ssrc]->SetPlayout(playout_);
-
-  return true;
-}
-
-bool WebRtcVoiceMediaChannel::RemoveRecvStream(uint32_t ssrc) {
-  TRACE_EVENT0("webrtc", "WebRtcVoiceMediaChannel::RemoveRecvStream");
-  RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-  LOG(LS_INFO) << "RemoveRecvStream: " << ssrc;
-
-  const auto it = recv_streams_.find(ssrc);
-  if (it == recv_streams_.end()) {
-    LOG(LS_WARNING) << "Try to remove stream with ssrc " << ssrc
-                    << " which doesn't exist.";
-    return false;
-  }
-
-  MaybeDeregisterUnsignaledRecvStream(ssrc);
-
-  const int channel = it->second->channel();
-
-  // Clean up and delete the receive stream+channel.
-  LOG(LS_INFO) << "Removing audio receive stream " << ssrc
-               << " with VoiceEngine channel #" << channel << ".";
-  it->second->SetRawAudioSink(nullptr);
-  delete it->second;
-  recv_streams_.erase(it);
-  return DeleteVoEChannel(channel);
-}
-
-bool WebRtcVoiceMediaChannel::SetLocalSource(uint32_t ssrc,
-                                             AudioSource* source) {
-  auto it = send_streams_.find(ssrc);
-  if (it == send_streams_.end()) {
-    if (source) {
-      // Return an error if trying to set a valid source with an invalid ssrc.
-      LOG(LS_ERROR) << "SetLocalSource failed with ssrc " << ssrc;
-      return false;
-    }
-
-    // The channel likely has gone away, do nothing.
-    return true;
-  }
-
-  if (source) {
-    it->second->SetSource(source);
-  } else {
-    it->second->ClearSource();
-  }
-
-  return true;
-}
-
-// TODO(solenberg): Remove, once AudioMonitor is gone.
-bool WebRtcVoiceMediaChannel::GetActiveStreams(
-    AudioInfo::StreamList* actives) {
-  RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-  actives->clear();
-  for (const auto& ch : recv_streams_) {
-    int level = ch.second->GetOutputLevel();
-    if (level > 0) {
-      actives->push_back(std::make_pair(ch.first, level));
-    }
-  }
-  return true;
-}
-
-// TODO(solenberg): Remove, once AudioMonitor is gone.
-int WebRtcVoiceMediaChannel::GetOutputLevel() {
-  RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-  int highest = 0;
-  for (const auto& ch : recv_streams_) {
-    highest = std::max(ch.second->GetOutputLevel(), highest);
-  }
-  return highest;
-}
-
-bool WebRtcVoiceMediaChannel::SetOutputVolume(uint32_t ssrc, double volume) {
-  RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-  std::vector<uint32_t> ssrcs(1, ssrc);
-  // SSRC of 0 represents the default receive stream.
-  if (ssrc == 0) {
-    default_recv_volume_ = volume;
-    ssrcs = unsignaled_recv_ssrcs_;
-  }
-  for (uint32_t ssrc : ssrcs) {
-    const auto it = recv_streams_.find(ssrc);
-    if (it == recv_streams_.end()) {
-      LOG(LS_WARNING) << "SetOutputVolume: no recv stream " << ssrc;
-      return false;
-    }
-    it->second->SetOutputVolume(volume);
-    LOG(LS_INFO) << "SetOutputVolume() to " << volume
-                 << " for recv stream with ssrc " << ssrc;
-  }
-  return true;
-}
-
-bool WebRtcVoiceMediaChannel::CanInsertDtmf() {
-  return dtmf_payload_type_ ? true : false;
-}
-
-bool WebRtcVoiceMediaChannel::InsertDtmf(uint32_t ssrc, int event,
-                                         int duration) {
-  RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-  LOG(LS_INFO) << "WebRtcVoiceMediaChannel::InsertDtmf";
-  if (!dtmf_payload_type_) {
-    return false;
-  }
-
-  // Figure out which WebRtcAudioSendStream to send the event on.
-  auto it = ssrc != 0 ? send_streams_.find(ssrc) : send_streams_.begin();
-  if (it == send_streams_.end()) {
-    LOG(LS_WARNING) << "The specified ssrc " << ssrc << " is not in use.";
-    return false;
-  }
-  if (event < kMinTelephoneEventCode ||
-      event > kMaxTelephoneEventCode) {
-    LOG(LS_WARNING) << "DTMF event code " << event << " out of range.";
-    return false;
-  }
-  RTC_DCHECK_NE(-1, dtmf_payload_freq_);
-  return it->second->SendTelephoneEvent(*dtmf_payload_type_, dtmf_payload_freq_,
-                                        event, duration);
-}
-
-void WebRtcVoiceMediaChannel::OnPacketReceived(
-    rtc::CopyOnWriteBuffer* packet, const rtc::PacketTime& packet_time) {
-  RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-
-  const webrtc::PacketTime webrtc_packet_time(packet_time.timestamp,
-                                              packet_time.not_before);
-  webrtc::PacketReceiver::DeliveryStatus delivery_result =
-      call_->Receiver()->DeliverPacket(webrtc::MediaType::AUDIO,
-                                       packet->cdata(), packet->size(),
-                                       webrtc_packet_time);
-  if (delivery_result != webrtc::PacketReceiver::DELIVERY_UNKNOWN_SSRC) {
-    return;
-  }
-
-  // Create an unsignaled receive stream for this previously not received ssrc.
-  // If there already is N unsignaled receive streams, delete the oldest.
-  // See: https://bugs.chromium.org/p/webrtc/issues/detail?id=5208
-  uint32_t ssrc = 0;
-  if (!GetRtpSsrc(packet->cdata(), packet->size(), &ssrc)) {
-    return;
-  }
-  RTC_DCHECK(std::find(unsignaled_recv_ssrcs_.begin(),
-      unsignaled_recv_ssrcs_.end(), ssrc) == unsignaled_recv_ssrcs_.end());
-
-  // Add new stream.
-  StreamParams sp;
-  sp.ssrcs.push_back(ssrc);
-  LOG(LS_INFO) << "Creating unsignaled receive stream for SSRC=" << ssrc;
-  if (!AddRecvStream(sp)) {
-    LOG(LS_WARNING) << "Could not create unsignaled receive stream.";
-    return;
-  }
-  unsignaled_recv_ssrcs_.push_back(ssrc);
-  RTC_HISTOGRAM_COUNTS_LINEAR(
-      "WebRTC.Audio.NumOfUnsignaledStreams", unsignaled_recv_ssrcs_.size(), 1,
-      100, 101);
-
-  // Remove oldest unsignaled stream, if we have too many.
-  if (unsignaled_recv_ssrcs_.size() > kMaxUnsignaledRecvStreams) {
-    uint32_t remove_ssrc = unsignaled_recv_ssrcs_.front();
-    LOG(LS_INFO) << "Removing unsignaled receive stream with SSRC="
-                 << remove_ssrc;
-    RemoveRecvStream(remove_ssrc);
-  }
-  RTC_DCHECK_GE(kMaxUnsignaledRecvStreams, unsignaled_recv_ssrcs_.size());
-
-  SetOutputVolume(ssrc, default_recv_volume_);
-
-  // The default sink can only be attached to one stream at a time, so we hook
-  // it up to the *latest* unsignaled stream we've seen, in order to support the
-  // case where the SSRC of one unsignaled stream changes.
-  if (default_sink_) {
-    for (uint32_t drop_ssrc : unsignaled_recv_ssrcs_) {
-      auto it = recv_streams_.find(drop_ssrc);
-      it->second->SetRawAudioSink(nullptr);
-    }
-    std::unique_ptr<webrtc::AudioSinkInterface> proxy_sink(
-        new ProxySink(default_sink_.get()));
-    SetRawAudioSink(ssrc, std::move(proxy_sink));
-  }
-
-  delivery_result = call_->Receiver()->DeliverPacket(webrtc::MediaType::AUDIO,
-                                                     packet->cdata(),
-                                                     packet->size(),
-                                                     webrtc_packet_time);
-  RTC_DCHECK_NE(webrtc::PacketReceiver::DELIVERY_UNKNOWN_SSRC, delivery_result);
-}
-
-void WebRtcVoiceMediaChannel::OnRtcpReceived(
-    rtc::CopyOnWriteBuffer* packet, const rtc::PacketTime& packet_time) {
-  RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-
-  // Forward packet to Call as well.
-  const webrtc::PacketTime webrtc_packet_time(packet_time.timestamp,
-                                              packet_time.not_before);
-  call_->Receiver()->DeliverPacket(webrtc::MediaType::AUDIO,
-      packet->cdata(), packet->size(), webrtc_packet_time);
-}
-
-void WebRtcVoiceMediaChannel::OnNetworkRouteChanged(
-    const std::string& transport_name,
-    const rtc::NetworkRoute& network_route) {
-  call_->OnNetworkRouteChanged(transport_name, network_route);
-}
-
-bool WebRtcVoiceMediaChannel::MuteStream(uint32_t ssrc, bool muted) {
-  RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-  const auto it = send_streams_.find(ssrc);
-  if (it == send_streams_.end()) {
-    LOG(LS_WARNING) << "The specified ssrc " << ssrc << " is not in use.";
-    return false;
-  }
-  it->second->SetMuted(muted);
-
-  // TODO(solenberg):
-  // We set the AGC to mute state only when all the channels are muted.
-  // This implementation is not ideal, instead we should signal the AGC when
-  // the mic channel is muted/unmuted. We can't do it today because there
-  // is no good way to know which stream is mapping to the mic channel.
-  bool all_muted = muted;
-  for (const auto& kv : send_streams_) {
-    all_muted = all_muted && kv.second->muted();
-  }
-  engine()->apm()->set_output_will_be_muted(all_muted);
-
-  return true;
-}
-
-bool WebRtcVoiceMediaChannel::SetMaxSendBitrate(int bps) {
-  LOG(LS_INFO) << "WebRtcVoiceMediaChannel::SetMaxSendBitrate.";
-  max_send_bitrate_bps_ = bps;
-  bool success = true;
-  for (const auto& kv : send_streams_) {
-    if (!kv.second->SetMaxSendBitrate(max_send_bitrate_bps_)) {
-      success = false;
-    }
-  }
-  return success;
-}
-
-void WebRtcVoiceMediaChannel::OnReadyToSend(bool ready) {
-  RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-  LOG(LS_VERBOSE) << "OnReadyToSend: " << (ready ? "Ready." : "Not ready.");
-  call_->SignalChannelNetworkState(
-      webrtc::MediaType::AUDIO,
-      ready ? webrtc::kNetworkUp : webrtc::kNetworkDown);
-}
-
-void WebRtcVoiceMediaChannel::OnTransportOverheadChanged(
-    int transport_overhead_per_packet) {
-  RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-  call_->OnTransportOverheadChanged(webrtc::MediaType::AUDIO,
-                                    transport_overhead_per_packet);
-}
-
-bool WebRtcVoiceMediaChannel::GetStats(VoiceMediaInfo* info) {
-  TRACE_EVENT0("webrtc", "WebRtcVoiceMediaChannel::GetStats");
-  RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-  RTC_DCHECK(info);
-
-  // Get SSRC and stats for each sender.
-  RTC_DCHECK_EQ(info->senders.size(), 0U);
-  for (const auto& stream : send_streams_) {
-    webrtc::AudioSendStream::Stats stats = stream.second->GetStats();
-    VoiceSenderInfo sinfo;
-    sinfo.add_ssrc(stats.local_ssrc);
-    sinfo.bytes_sent = stats.bytes_sent;
-    sinfo.packets_sent = stats.packets_sent;
-    sinfo.packets_lost = stats.packets_lost;
-    sinfo.fraction_lost = stats.fraction_lost;
-    sinfo.codec_name = stats.codec_name;
-    sinfo.codec_payload_type = stats.codec_payload_type;
-    sinfo.ext_seqnum = stats.ext_seqnum;
-    sinfo.jitter_ms = stats.jitter_ms;
-    sinfo.rtt_ms = stats.rtt_ms;
-    sinfo.audio_level = stats.audio_level;
-    sinfo.total_input_energy = stats.total_input_energy;
-    sinfo.total_input_duration = stats.total_input_duration;
-    sinfo.aec_quality_min = stats.aec_quality_min;
-    sinfo.echo_delay_median_ms = stats.echo_delay_median_ms;
-    sinfo.echo_delay_std_ms = stats.echo_delay_std_ms;
-    sinfo.echo_return_loss = stats.echo_return_loss;
-    sinfo.echo_return_loss_enhancement = stats.echo_return_loss_enhancement;
-    sinfo.residual_echo_likelihood = stats.residual_echo_likelihood;
-    sinfo.residual_echo_likelihood_recent_max =
-        stats.residual_echo_likelihood_recent_max;
-    sinfo.typing_noise_detected = (send_ ? stats.typing_noise_detected : false);
-    sinfo.ana_statistics = stats.ana_statistics;
-    info->senders.push_back(sinfo);
-  }
-
-  // Get SSRC and stats for each receiver.
-  RTC_DCHECK_EQ(info->receivers.size(), 0U);
-  for (const auto& stream : recv_streams_) {
-    webrtc::AudioReceiveStream::Stats stats = stream.second->GetStats();
-    VoiceReceiverInfo rinfo;
-    rinfo.add_ssrc(stats.remote_ssrc);
-    rinfo.bytes_rcvd = stats.bytes_rcvd;
-    rinfo.packets_rcvd = stats.packets_rcvd;
-    rinfo.packets_lost = stats.packets_lost;
-    rinfo.fraction_lost = stats.fraction_lost;
-    rinfo.codec_name = stats.codec_name;
-    rinfo.codec_payload_type = stats.codec_payload_type;
-    rinfo.ext_seqnum = stats.ext_seqnum;
-    rinfo.jitter_ms = stats.jitter_ms;
-    rinfo.jitter_buffer_ms = stats.jitter_buffer_ms;
-    rinfo.jitter_buffer_preferred_ms = stats.jitter_buffer_preferred_ms;
-    rinfo.delay_estimate_ms = stats.delay_estimate_ms;
-    rinfo.audio_level = stats.audio_level;
-    rinfo.total_output_energy = stats.total_output_energy;
-    rinfo.total_samples_received = stats.total_samples_received;
-    rinfo.total_output_duration = stats.total_output_duration;
-    rinfo.concealed_samples = stats.concealed_samples;
-    rinfo.expand_rate = stats.expand_rate;
-    rinfo.speech_expand_rate = stats.speech_expand_rate;
-    rinfo.secondary_decoded_rate = stats.secondary_decoded_rate;
-    rinfo.secondary_discarded_rate = stats.secondary_discarded_rate;
-    rinfo.accelerate_rate = stats.accelerate_rate;
-    rinfo.preemptive_expand_rate = stats.preemptive_expand_rate;
-    rinfo.decoding_calls_to_silence_generator =
-        stats.decoding_calls_to_silence_generator;
-    rinfo.decoding_calls_to_neteq = stats.decoding_calls_to_neteq;
-    rinfo.decoding_normal = stats.decoding_normal;
-    rinfo.decoding_plc = stats.decoding_plc;
-    rinfo.decoding_cng = stats.decoding_cng;
-    rinfo.decoding_plc_cng = stats.decoding_plc_cng;
-    rinfo.decoding_muted_output = stats.decoding_muted_output;
-    rinfo.capture_start_ntp_time_ms = stats.capture_start_ntp_time_ms;
-    info->receivers.push_back(rinfo);
-  }
-
-  // Get codec info
-  for (const AudioCodec& codec : send_codecs_) {
-    webrtc::RtpCodecParameters codec_params = codec.ToCodecParameters();
-    info->send_codecs.insert(
-        std::make_pair(codec_params.payload_type, std::move(codec_params)));
-  }
-  for (const AudioCodec& codec : recv_codecs_) {
-    webrtc::RtpCodecParameters codec_params = codec.ToCodecParameters();
-    info->receive_codecs.insert(
-        std::make_pair(codec_params.payload_type, std::move(codec_params)));
-  }
-
-  return true;
-}
-
-void WebRtcVoiceMediaChannel::SetRawAudioSink(
-    uint32_t ssrc,
-    std::unique_ptr<webrtc::AudioSinkInterface> sink) {
-  RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-  LOG(LS_VERBOSE) << "WebRtcVoiceMediaChannel::SetRawAudioSink: ssrc:" << ssrc
-                  << " " << (sink ? "(ptr)" : "NULL");
-  if (ssrc == 0) {
-    if (!unsignaled_recv_ssrcs_.empty()) {
-      std::unique_ptr<webrtc::AudioSinkInterface> proxy_sink(
-          sink ? new ProxySink(sink.get()) : nullptr);
-      SetRawAudioSink(unsignaled_recv_ssrcs_.back(), std::move(proxy_sink));
-    }
-    default_sink_ = std::move(sink);
-    return;
-  }
-  const auto it = recv_streams_.find(ssrc);
-  if (it == recv_streams_.end()) {
-    LOG(LS_WARNING) << "SetRawAudioSink: no recv stream " << ssrc;
-    return;
-  }
-  it->second->SetRawAudioSink(std::move(sink));
-}
-
-std::vector<webrtc::RtpSource> WebRtcVoiceMediaChannel::GetSources(
-    uint32_t ssrc) const {
-  auto it = recv_streams_.find(ssrc);
-  RTC_DCHECK(it != recv_streams_.end())
-      << "Attempting to get contributing sources for SSRC:" << ssrc
-      << " which doesn't exist.";
-  return it->second->GetSources();
-}
-
-int WebRtcVoiceMediaChannel::GetReceiveChannelId(uint32_t ssrc) const {
-  RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-  const auto it = recv_streams_.find(ssrc);
-  if (it != recv_streams_.end()) {
-    return it->second->channel();
-  }
-  return -1;
-}
-
-int WebRtcVoiceMediaChannel::GetSendChannelId(uint32_t ssrc) const {
-  RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-  const auto it = send_streams_.find(ssrc);
-  if (it != send_streams_.end()) {
-    return it->second->channel();
-  }
-  return -1;
-}
-
-bool WebRtcVoiceMediaChannel::
-    MaybeDeregisterUnsignaledRecvStream(uint32_t ssrc) {
-  RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-  auto it = std::find(unsignaled_recv_ssrcs_.begin(),
-                      unsignaled_recv_ssrcs_.end(),
-                      ssrc);
-  if (it != unsignaled_recv_ssrcs_.end()) {
-    unsignaled_recv_ssrcs_.erase(it);
-    return true;
-  }
-  return false;
-}
-}  // namespace cricket
-
-#endif  // HAVE_WEBRTC_VOICE
diff --git a/media/engine/webrtcvoiceengine.h b/media/engine/webrtcvoiceengine.h
deleted file mode 100644
index a42459a..0000000
--- a/media/engine/webrtcvoiceengine.h
+++ /dev/null
@@ -1,311 +0,0 @@
-/*
- *  Copyright (c) 2004 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_MEDIA_ENGINE_WEBRTCVOICEENGINE_H_
-#define WEBRTC_MEDIA_ENGINE_WEBRTCVOICEENGINE_H_
-
-#include <map>
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "webrtc/api/audio_codecs/audio_encoder_factory.h"
-#include "webrtc/api/rtpreceiverinterface.h"
-#include "webrtc/call/audio_state.h"
-#include "webrtc/call/call.h"
-#include "webrtc/media/base/rtputils.h"
-#include "webrtc/media/engine/apm_helpers.h"
-#include "webrtc/media/engine/webrtccommon.h"
-#include "webrtc/media/engine/webrtcvoe.h"
-#include "webrtc/modules/audio_processing/include/audio_processing.h"
-#include "webrtc/pc/channel.h"
-#include "webrtc/rtc_base/buffer.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/networkroute.h"
-#include "webrtc/rtc_base/scoped_ref_ptr.h"
-#include "webrtc/rtc_base/task_queue.h"
-#include "webrtc/rtc_base/thread_checker.h"
-
-namespace webrtc {
-namespace voe {
-class TransmitMixer;
-}  // namespace voe
-}  // namespace webrtc
-
-namespace cricket {
-
-class AudioDeviceModule;
-class AudioMixer;
-class AudioSource;
-class VoEWrapper;
-class WebRtcVoiceMediaChannel;
-
-// WebRtcVoiceEngine is a class to be used with CompositeMediaEngine.
-// It uses the WebRtc VoiceEngine library for audio handling.
-class WebRtcVoiceEngine final : public webrtc::TraceCallback  {
-  friend class WebRtcVoiceMediaChannel;
- public:
-  WebRtcVoiceEngine(
-      webrtc::AudioDeviceModule* adm,
-      const rtc::scoped_refptr<webrtc::AudioEncoderFactory>& encoder_factory,
-      const rtc::scoped_refptr<webrtc::AudioDecoderFactory>& decoder_factory,
-      rtc::scoped_refptr<webrtc::AudioMixer> audio_mixer,
-      rtc::scoped_refptr<webrtc::AudioProcessing> audio_processing);
-  // Dependency injection for testing.
-  WebRtcVoiceEngine(
-      webrtc::AudioDeviceModule* adm,
-      const rtc::scoped_refptr<webrtc::AudioEncoderFactory>& encoder_factory,
-      const rtc::scoped_refptr<webrtc::AudioDecoderFactory>& decoder_factory,
-      rtc::scoped_refptr<webrtc::AudioMixer> audio_mixer,
-      rtc::scoped_refptr<webrtc::AudioProcessing> audio_processing,
-      VoEWrapper* voe_wrapper);
-  ~WebRtcVoiceEngine() override;
-
-  // Does initialization that needs to occur on the worker thread.
-  void Init();
-
-  rtc::scoped_refptr<webrtc::AudioState> GetAudioState() const;
-  VoiceMediaChannel* CreateChannel(webrtc::Call* call,
-                                   const MediaConfig& config,
-                                   const AudioOptions& options);
-
-  int GetInputLevel();
-
-  const std::vector<AudioCodec>& send_codecs() const;
-  const std::vector<AudioCodec>& recv_codecs() const;
-  RtpCapabilities GetCapabilities() const;
-
-  // For tracking WebRtc channels. Needed because we have to pause them
-  // all when switching devices.
-  // May only be called by WebRtcVoiceMediaChannel.
-  void RegisterChannel(WebRtcVoiceMediaChannel* channel);
-  void UnregisterChannel(WebRtcVoiceMediaChannel* channel);
-
-  VoEWrapper* voe() { return voe_wrapper_.get(); }
-  int GetLastEngineError();
-
-  // Starts AEC dump using an existing file. A maximum file size in bytes can be
-  // specified. When the maximum file size is reached, logging is stopped and
-  // the file is closed. If max_size_bytes is set to <= 0, no limit will be
-  // used.
-  bool StartAecDump(rtc::PlatformFile file, int64_t max_size_bytes);
-
-  // Stops AEC dump.
-  void StopAecDump();
-
-  const webrtc::AudioProcessing::Config GetApmConfigForTest() const {
-    return apm()->GetConfig();
-  }
-
- private:
-  // Every option that is "set" will be applied. Every option not "set" will be
-  // ignored. This allows us to selectively turn on and off different options
-  // easily at any time.
-  bool ApplyOptions(const AudioOptions& options);
-
-  // webrtc::TraceCallback:
-  void Print(webrtc::TraceLevel level, const char* trace, int length) override;
-
-  void StartAecDump(const std::string& filename);
-  int CreateVoEChannel();
-
-  std::unique_ptr<rtc::TaskQueue> low_priority_worker_queue_;
-
-  webrtc::AudioDeviceModule* adm();
-  webrtc::AudioProcessing* apm() const;
-  webrtc::voe::TransmitMixer* transmit_mixer();
-
-  AudioCodecs CollectCodecs(
-      const std::vector<webrtc::AudioCodecSpec>& specs) const;
-
-  rtc::ThreadChecker signal_thread_checker_;
-  rtc::ThreadChecker worker_thread_checker_;
-
-  // The audio device manager.
-  rtc::scoped_refptr<webrtc::AudioDeviceModule> adm_;
-  rtc::scoped_refptr<webrtc::AudioEncoderFactory> encoder_factory_;
-  rtc::scoped_refptr<webrtc::AudioDecoderFactory> decoder_factory_;
-  rtc::scoped_refptr<webrtc::AudioMixer> audio_mixer_;
-  // Reference to the APM, owned by VoE.
-  rtc::scoped_refptr<webrtc::AudioProcessing> apm_;
-  // Reference to the TransmitMixer, owned by VoE.
-  webrtc::voe::TransmitMixer* transmit_mixer_ = nullptr;
-  // The primary instance of WebRtc VoiceEngine.
-  std::unique_ptr<VoEWrapper> voe_wrapper_;
-  rtc::scoped_refptr<webrtc::AudioState> audio_state_;
-  std::vector<AudioCodec> send_codecs_;
-  std::vector<AudioCodec> recv_codecs_;
-  std::vector<WebRtcVoiceMediaChannel*> channels_;
-  webrtc::VoEBase::ChannelConfig channel_config_;
-  bool is_dumping_aec_ = false;
-  bool initialized_ = false;
-
-  webrtc::AgcConfig default_agc_config_;
-  // Cache received extended_filter_aec, delay_agnostic_aec, experimental_ns
-  // level controller, and intelligibility_enhancer values, and apply them
-  // in case they are missing in the audio options. We need to do this because
-  // SetExtraOptions() will revert to defaults for options which are not
-  // provided.
-  rtc::Optional<bool> extended_filter_aec_;
-  rtc::Optional<bool> delay_agnostic_aec_;
-  rtc::Optional<bool> experimental_ns_;
-  rtc::Optional<bool> intelligibility_enhancer_;
-  rtc::Optional<bool> level_control_;
-
-  RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(WebRtcVoiceEngine);
-};
-
-// WebRtcVoiceMediaChannel is an implementation of VoiceMediaChannel that uses
-// WebRtc Voice Engine.
-class WebRtcVoiceMediaChannel final : public VoiceMediaChannel,
-                                      public webrtc::Transport {
- public:
-  WebRtcVoiceMediaChannel(WebRtcVoiceEngine* engine,
-                          const MediaConfig& config,
-                          const AudioOptions& options,
-                          webrtc::Call* call);
-  ~WebRtcVoiceMediaChannel() override;
-
-  const AudioOptions& options() const { return options_; }
-
-  rtc::DiffServCodePoint PreferredDscp() const override;
-
-  bool SetSendParameters(const AudioSendParameters& params) override;
-  bool SetRecvParameters(const AudioRecvParameters& params) override;
-  webrtc::RtpParameters GetRtpSendParameters(uint32_t ssrc) const override;
-  bool SetRtpSendParameters(uint32_t ssrc,
-                            const webrtc::RtpParameters& parameters) override;
-  webrtc::RtpParameters GetRtpReceiveParameters(uint32_t ssrc) const override;
-  bool SetRtpReceiveParameters(
-      uint32_t ssrc,
-      const webrtc::RtpParameters& parameters) override;
-
-  void SetPlayout(bool playout) override;
-  void SetSend(bool send) override;
-  bool SetAudioSend(uint32_t ssrc,
-                    bool enable,
-                    const AudioOptions* options,
-                    AudioSource* source) override;
-  bool AddSendStream(const StreamParams& sp) override;
-  bool RemoveSendStream(uint32_t ssrc) override;
-  bool AddRecvStream(const StreamParams& sp) override;
-  bool RemoveRecvStream(uint32_t ssrc) override;
-  bool GetActiveStreams(AudioInfo::StreamList* actives) override;
-  int GetOutputLevel() override;
-  // SSRC=0 will apply the new volume to current and future unsignaled streams.
-  bool SetOutputVolume(uint32_t ssrc, double volume) override;
-
-  bool CanInsertDtmf() override;
-  bool InsertDtmf(uint32_t ssrc, int event, int duration) override;
-
-  void OnPacketReceived(rtc::CopyOnWriteBuffer* packet,
-                        const rtc::PacketTime& packet_time) override;
-  void OnRtcpReceived(rtc::CopyOnWriteBuffer* packet,
-                      const rtc::PacketTime& packet_time) override;
-  void OnNetworkRouteChanged(const std::string& transport_name,
-                             const rtc::NetworkRoute& network_route) override;
-  void OnReadyToSend(bool ready) override;
-  void OnTransportOverheadChanged(int transport_overhead_per_packet) override;
-  bool GetStats(VoiceMediaInfo* info) override;
-
-  // SSRC=0 will set the audio sink on the latest unsignaled stream, future or
-  // current. Only one stream at a time will use the sink.
-  void SetRawAudioSink(
-      uint32_t ssrc,
-      std::unique_ptr<webrtc::AudioSinkInterface> sink) override;
-
-  std::vector<webrtc::RtpSource> GetSources(uint32_t ssrc) const override;
-
-  // implements Transport interface
-  bool SendRtp(const uint8_t* data,
-               size_t len,
-               const webrtc::PacketOptions& options) override {
-    rtc::CopyOnWriteBuffer packet(data, len, kMaxRtpPacketLen);
-    rtc::PacketOptions rtc_options;
-    rtc_options.packet_id = options.packet_id;
-    return VoiceMediaChannel::SendPacket(&packet, rtc_options);
-  }
-
-  bool SendRtcp(const uint8_t* data, size_t len) override {
-    rtc::CopyOnWriteBuffer packet(data, len, kMaxRtpPacketLen);
-    return VoiceMediaChannel::SendRtcp(&packet, rtc::PacketOptions());
-  }
-
-  int GetReceiveChannelId(uint32_t ssrc) const;
-  int GetSendChannelId(uint32_t ssrc) const;
-
- private:
-  bool SetOptions(const AudioOptions& options);
-  bool SetRecvCodecs(const std::vector<AudioCodec>& codecs);
-  bool SetSendCodecs(const std::vector<AudioCodec>& codecs);
-  bool SetLocalSource(uint32_t ssrc, AudioSource* source);
-  bool MuteStream(uint32_t ssrc, bool mute);
-
-  WebRtcVoiceEngine* engine() { return engine_; }
-  int GetLastEngineError() { return engine()->GetLastEngineError(); }
-  void ChangePlayout(bool playout);
-  int CreateVoEChannel();
-  bool DeleteVoEChannel(int channel);
-  bool SetMaxSendBitrate(int bps);
-  bool ValidateRtpParameters(const webrtc::RtpParameters& parameters);
-  void SetupRecording();
-  // Check if 'ssrc' is an unsignaled stream, and if so mark it as not being
-  // unsignaled anymore (i.e. it is now removed, or signaled), and return true.
-  bool MaybeDeregisterUnsignaledRecvStream(uint32_t ssrc);
-
-  rtc::ThreadChecker worker_thread_checker_;
-
-  WebRtcVoiceEngine* const engine_ = nullptr;
-  std::vector<AudioCodec> send_codecs_;
-
-  // TODO(kwiberg): decoder_map_ and recv_codecs_ store the exact same
-  // information, in slightly different formats. Eliminate recv_codecs_.
-  std::map<int, webrtc::SdpAudioFormat> decoder_map_;
-  std::vector<AudioCodec> recv_codecs_;
-
-  int max_send_bitrate_bps_ = 0;
-  AudioOptions options_;
-  rtc::Optional<int> dtmf_payload_type_;
-  int dtmf_payload_freq_ = -1;
-  bool recv_transport_cc_enabled_ = false;
-  bool recv_nack_enabled_ = false;
-  bool desired_playout_ = false;
-  bool playout_ = false;
-  bool send_ = false;
-  webrtc::Call* const call_ = nullptr;
-
-  // Queue of unsignaled SSRCs; oldest at the beginning.
-  std::vector<uint32_t> unsignaled_recv_ssrcs_;
-
-  // Volume for unsignaled streams, which may be set before the stream exists.
-  double default_recv_volume_ = 1.0;
-  // Sink for latest unsignaled stream - may be set before the stream exists.
-  std::unique_ptr<webrtc::AudioSinkInterface> default_sink_;
-  // Default SSRC to use for RTCP receiver reports in case of no signaled
-  // send streams. See: https://code.google.com/p/webrtc/issues/detail?id=4740
-  // and https://code.google.com/p/chromium/issues/detail?id=547661
-  uint32_t receiver_reports_ssrc_ = 0xFA17FA17u;
-
-  class WebRtcAudioSendStream;
-  std::map<uint32_t, WebRtcAudioSendStream*> send_streams_;
-  std::vector<webrtc::RtpExtension> send_rtp_extensions_;
-
-  class WebRtcAudioReceiveStream;
-  std::map<uint32_t, WebRtcAudioReceiveStream*> recv_streams_;
-  std::vector<webrtc::RtpExtension> recv_rtp_extensions_;
-
-  rtc::Optional<webrtc::AudioSendStream::Config::SendCodecSpec>
-      send_codec_spec_;
-
-  RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(WebRtcVoiceMediaChannel);
-};
-}  // namespace cricket
-
-#endif  // WEBRTC_MEDIA_ENGINE_WEBRTCVOICEENGINE_H_
diff --git a/media/engine/webrtcvoiceengine_unittest.cc b/media/engine/webrtcvoiceengine_unittest.cc
deleted file mode 100644
index edb861e..0000000
--- a/media/engine/webrtcvoiceengine_unittest.cc
+++ /dev/null
@@ -1,3537 +0,0 @@
-/*
- *  Copyright (c) 2008 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 <memory>
-
-#include "webrtc/api/audio_codecs/builtin_audio_decoder_factory.h"
-#include "webrtc/api/audio_codecs/builtin_audio_encoder_factory.h"
-#include "webrtc/call/call.h"
-#include "webrtc/logging/rtc_event_log/rtc_event_log.h"
-#include "webrtc/media/base/fakemediaengine.h"
-#include "webrtc/media/base/fakenetworkinterface.h"
-#include "webrtc/media/base/fakertp.h"
-#include "webrtc/media/base/mediaconstants.h"
-#include "webrtc/media/engine/fakewebrtccall.h"
-#include "webrtc/media/engine/fakewebrtcvoiceengine.h"
-#include "webrtc/media/engine/webrtcvoiceengine.h"
-#include "webrtc/modules/audio_device/include/mock_audio_device.h"
-#include "webrtc/modules/audio_processing/include/mock_audio_processing.h"
-#include "webrtc/pc/channel.h"
-#include "webrtc/rtc_base/arraysize.h"
-#include "webrtc/rtc_base/byteorder.h"
-#include "webrtc/rtc_base/safe_conversions.h"
-#include "webrtc/rtc_base/scoped_ref_ptr.h"
-#include "webrtc/test/field_trial.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/mock_audio_decoder_factory.h"
-#include "webrtc/test/mock_audio_encoder_factory.h"
-#include "webrtc/voice_engine/transmit_mixer.h"
-
-using testing::_;
-using testing::ContainerEq;
-using testing::Return;
-using testing::ReturnPointee;
-using testing::SaveArg;
-using testing::StrictMock;
-
-namespace {
-
-constexpr uint32_t kMaxUnsignaledRecvStreams = 4;
-
-const cricket::AudioCodec kPcmuCodec(0, "PCMU", 8000, 64000, 1);
-const cricket::AudioCodec kIsacCodec(103, "ISAC", 16000, 32000, 1);
-const cricket::AudioCodec kOpusCodec(111, "opus", 48000, 32000, 2);
-const cricket::AudioCodec kG722CodecVoE(9, "G722", 16000, 64000, 1);
-const cricket::AudioCodec kG722CodecSdp(9, "G722", 8000, 64000, 1);
-const cricket::AudioCodec kCn8000Codec(13, "CN", 8000, 0, 1);
-const cricket::AudioCodec kCn16000Codec(105, "CN", 16000, 0, 1);
-const cricket::AudioCodec
-    kTelephoneEventCodec1(106, "telephone-event", 8000, 0, 1);
-const cricket::AudioCodec
-    kTelephoneEventCodec2(107, "telephone-event", 32000, 0, 1);
-
-const uint32_t kSsrc0 = 0;
-const uint32_t kSsrc1 = 1;
-const uint32_t kSsrcX = 0x99;
-const uint32_t kSsrcY = 0x17;
-const uint32_t kSsrcZ = 0x42;
-const uint32_t kSsrcW = 0x02;
-const uint32_t kSsrcs4[] = { 11, 200, 30, 44 };
-
-constexpr int kRtpHistoryMs = 5000;
-
-class FakeVoEWrapper : public cricket::VoEWrapper {
- public:
-  explicit FakeVoEWrapper(cricket::FakeWebRtcVoiceEngine* engine)
-      : cricket::VoEWrapper(engine) {
-  }
-};
-
-class MockTransmitMixer : public webrtc::voe::TransmitMixer {
- public:
-  MockTransmitMixer() = default;
-  virtual ~MockTransmitMixer() = default;
-
-  MOCK_METHOD1(EnableStereoChannelSwapping, void(bool enable));
-};
-
-void AdmSetupExpectations(webrtc::test::MockAudioDeviceModule* adm) {
-  RTC_DCHECK(adm);
-  EXPECT_CALL(*adm, AddRef()).WillOnce(Return(0));
-  EXPECT_CALL(*adm, Release()).WillOnce(Return(0));
-#if !defined(WEBRTC_IOS)
-  EXPECT_CALL(*adm, Recording()).WillOnce(Return(false));
-  EXPECT_CALL(*adm, SetRecordingChannel(webrtc::AudioDeviceModule::
-      ChannelType::kChannelBoth)).WillOnce(Return(0));
-#if defined(WEBRTC_WIN)
-  EXPECT_CALL(*adm, SetRecordingDevice(
-      testing::Matcher<webrtc::AudioDeviceModule::WindowsDeviceType>(
-          webrtc::AudioDeviceModule::kDefaultCommunicationDevice)))
-              .WillOnce(Return(0));
-#else
-  EXPECT_CALL(*adm, SetRecordingDevice(0)).WillOnce(Return(0));
-#endif  // #if defined(WEBRTC_WIN)
-  EXPECT_CALL(*adm, InitMicrophone()).WillOnce(Return(0));
-  EXPECT_CALL(*adm, StereoRecordingIsAvailable(testing::_)).WillOnce(Return(0));
-  EXPECT_CALL(*adm, SetStereoRecording(false)).WillOnce(Return(0));
-  EXPECT_CALL(*adm, Playing()).WillOnce(Return(false));
-#if defined(WEBRTC_WIN)
-  EXPECT_CALL(*adm, SetPlayoutDevice(
-      testing::Matcher<webrtc::AudioDeviceModule::WindowsDeviceType>(
-          webrtc::AudioDeviceModule::kDefaultCommunicationDevice)))
-              .WillOnce(Return(0));
-#else
-  EXPECT_CALL(*adm, SetPlayoutDevice(0)).WillOnce(Return(0));
-#endif  // #if defined(WEBRTC_WIN)
-  EXPECT_CALL(*adm, InitSpeaker()).WillOnce(Return(0));
-  EXPECT_CALL(*adm, StereoPlayoutIsAvailable(testing::_)).WillOnce(Return(0));
-  EXPECT_CALL(*adm, SetStereoPlayout(false)).WillOnce(Return(0));
-#endif  // #if !defined(WEBRTC_IOS)
-  EXPECT_CALL(*adm, BuiltInAECIsAvailable()).WillOnce(Return(false));
-  EXPECT_CALL(*adm, BuiltInAGCIsAvailable()).WillOnce(Return(false));
-  EXPECT_CALL(*adm, BuiltInNSIsAvailable()).WillOnce(Return(false));
-  EXPECT_CALL(*adm, SetAGC(true)).WillOnce(Return(0));
-}
-}  // namespace
-
-// Tests that our stub library "works".
-TEST(WebRtcVoiceEngineTestStubLibrary, StartupShutdown) {
-  StrictMock<webrtc::test::MockAudioDeviceModule> adm;
-  AdmSetupExpectations(&adm);
-  rtc::scoped_refptr<StrictMock<webrtc::test::MockAudioProcessing>> apm =
-      new rtc::RefCountedObject<
-          StrictMock<webrtc::test::MockAudioProcessing>>();
-  webrtc::AudioProcessing::Config apm_config;
-  EXPECT_CALL(*apm, GetConfig()).WillRepeatedly(ReturnPointee(&apm_config));
-  EXPECT_CALL(*apm, ApplyConfig(_)).WillRepeatedly(SaveArg<0>(&apm_config));
-  EXPECT_CALL(*apm, SetExtraOptions(testing::_));
-  EXPECT_CALL(*apm, Initialize()).WillOnce(Return(0));
-  EXPECT_CALL(*apm, DetachAecDump());
-  StrictMock<MockTransmitMixer> transmit_mixer;
-  EXPECT_CALL(transmit_mixer, EnableStereoChannelSwapping(false));
-  cricket::FakeWebRtcVoiceEngine voe(&transmit_mixer);
-  EXPECT_FALSE(voe.IsInited());
-  {
-    cricket::WebRtcVoiceEngine engine(
-        &adm, webrtc::MockAudioEncoderFactory::CreateUnusedFactory(),
-        webrtc::MockAudioDecoderFactory::CreateUnusedFactory(), nullptr, apm,
-        new FakeVoEWrapper(&voe));
-    engine.Init();
-    EXPECT_TRUE(voe.IsInited());
-  }
-  EXPECT_FALSE(voe.IsInited());
-}
-
-class FakeAudioSink : public webrtc::AudioSinkInterface {
- public:
-  void OnData(const Data& audio) override {}
-};
-
-class FakeAudioSource : public cricket::AudioSource {
-  void SetSink(Sink* sink) override {}
-};
-
-class WebRtcVoiceEngineTestFake : public testing::Test {
- public:
-  WebRtcVoiceEngineTestFake() : WebRtcVoiceEngineTestFake("") {}
-
-  explicit WebRtcVoiceEngineTestFake(const char* field_trials)
-      : apm_(new rtc::RefCountedObject<
-             StrictMock<webrtc::test::MockAudioProcessing>>()),
-        apm_gc_(*apm_->gain_control()),
-        apm_ec_(*apm_->echo_cancellation()),
-        apm_ns_(*apm_->noise_suppression()),
-        apm_vd_(*apm_->voice_detection()),
-        call_(webrtc::Call::Config(&event_log_)),
-        voe_(&transmit_mixer_),
-        override_field_trials_(field_trials) {
-    // AudioDeviceModule.
-    AdmSetupExpectations(&adm_);
-    // AudioProcessing.
-    EXPECT_CALL(*apm_, GetConfig()).WillRepeatedly(ReturnPointee(&apm_config_));
-    EXPECT_CALL(*apm_, ApplyConfig(_)).WillRepeatedly(SaveArg<0>(&apm_config_));
-    EXPECT_CALL(*apm_, SetExtraOptions(testing::_));
-    EXPECT_CALL(*apm_, Initialize()).WillOnce(Return(0));
-    EXPECT_CALL(*apm_, DetachAecDump());
-    // Default Options.
-    EXPECT_CALL(apm_ec_, Enable(true)).WillOnce(Return(0));
-    EXPECT_CALL(apm_ec_, enable_metrics(true)).WillOnce(Return(0));
-    EXPECT_CALL(apm_gc_, Enable(true)).WillOnce(Return(0));
-    EXPECT_CALL(apm_ns_, Enable(true)).WillOnce(Return(0));
-    EXPECT_CALL(apm_vd_, Enable(true)).WillOnce(Return(0));
-    EXPECT_CALL(transmit_mixer_, EnableStereoChannelSwapping(false));
-    // Init does not overwrite default AGC config.
-    EXPECT_CALL(apm_gc_, target_level_dbfs()).WillOnce(Return(1));
-    EXPECT_CALL(apm_gc_, compression_gain_db()).WillRepeatedly(Return(5));
-    EXPECT_CALL(apm_gc_, is_limiter_enabled()).WillRepeatedly(Return(true));
-    EXPECT_CALL(apm_gc_, set_target_level_dbfs(1)).WillOnce(Return(0));
-    EXPECT_CALL(apm_gc_, set_compression_gain_db(5)).WillRepeatedly(Return(0));
-    EXPECT_CALL(apm_gc_, enable_limiter(true)).WillRepeatedly(Return(0));
-    // TODO(kwiberg): We should use mock factories here, but a bunch of
-    // the tests here probe the specific set of codecs provided by the builtin
-    // factories. Those tests should probably be moved elsewhere.
-    auto encoder_factory = webrtc::CreateBuiltinAudioEncoderFactory();
-    auto decoder_factory = webrtc::CreateBuiltinAudioDecoderFactory();
-    engine_.reset(new cricket::WebRtcVoiceEngine(&adm_, encoder_factory,
-                                                 decoder_factory, nullptr, apm_,
-                                                 new FakeVoEWrapper(&voe_)));
-    engine_->Init();
-    send_parameters_.codecs.push_back(kPcmuCodec);
-    recv_parameters_.codecs.push_back(kPcmuCodec);
-    // Default Options.
-    EXPECT_TRUE(IsHighPassFilterEnabled());
-  }
-
-  bool SetupChannel() {
-    EXPECT_CALL(*apm_, SetExtraOptions(testing::_));
-    channel_ = engine_->CreateChannel(&call_, cricket::MediaConfig(),
-                                      cricket::AudioOptions());
-    return (channel_ != nullptr);
-  }
-
-  bool SetupRecvStream() {
-    if (!SetupChannel()) {
-      return false;
-    }
-    return AddRecvStream(kSsrcX);
-  }
-
-  bool SetupSendStream() {
-    if (!SetupChannel()) {
-      return false;
-    }
-    if (!channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrcX))) {
-      return false;
-    }
-    EXPECT_CALL(*apm_, set_output_will_be_muted(false));
-    return channel_->SetAudioSend(kSsrcX, true, nullptr, &fake_source_);
-  }
-
-  bool AddRecvStream(uint32_t ssrc) {
-    EXPECT_TRUE(channel_);
-    return channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(ssrc));
-  }
-
-  void SetupForMultiSendStream() {
-    EXPECT_TRUE(SetupSendStream());
-    // Remove stream added in Setup.
-    EXPECT_TRUE(call_.GetAudioSendStream(kSsrcX));
-    EXPECT_TRUE(channel_->RemoveSendStream(kSsrcX));
-    // Verify the channel does not exist.
-    EXPECT_FALSE(call_.GetAudioSendStream(kSsrcX));
-  }
-
-  void DeliverPacket(const void* data, int len) {
-    rtc::CopyOnWriteBuffer packet(reinterpret_cast<const uint8_t*>(data), len);
-    channel_->OnPacketReceived(&packet, rtc::PacketTime());
-  }
-
-  void TearDown() override {
-    delete channel_;
-  }
-
-  const cricket::FakeAudioSendStream& GetSendStream(uint32_t ssrc) {
-    const auto* send_stream = call_.GetAudioSendStream(ssrc);
-    EXPECT_TRUE(send_stream);
-    return *send_stream;
-  }
-
-  const cricket::FakeAudioReceiveStream& GetRecvStream(uint32_t ssrc) {
-    const auto* recv_stream = call_.GetAudioReceiveStream(ssrc);
-    EXPECT_TRUE(recv_stream);
-    return *recv_stream;
-  }
-
-  const webrtc::AudioSendStream::Config& GetSendStreamConfig(uint32_t ssrc) {
-    return GetSendStream(ssrc).GetConfig();
-  }
-
-  const webrtc::AudioReceiveStream::Config& GetRecvStreamConfig(uint32_t ssrc) {
-    return GetRecvStream(ssrc).GetConfig();
-  }
-
-  void SetSend(bool enable) {
-    ASSERT_TRUE(channel_);
-    if (enable) {
-      EXPECT_CALL(adm_, RecordingIsInitialized()).WillOnce(Return(false));
-      EXPECT_CALL(adm_, Recording()).WillOnce(Return(false));
-      EXPECT_CALL(adm_, InitRecording()).WillOnce(Return(0));
-      EXPECT_CALL(*apm_, SetExtraOptions(testing::_));
-    }
-    channel_->SetSend(enable);
-  }
-
-  void SetSendParameters(const cricket::AudioSendParameters& params) {
-    EXPECT_CALL(*apm_, SetExtraOptions(testing::_));
-    ASSERT_TRUE(channel_);
-    EXPECT_TRUE(channel_->SetSendParameters(params));
-  }
-
-  void SetAudioSend(uint32_t ssrc, bool enable, cricket::AudioSource* source,
-                    const cricket::AudioOptions* options = nullptr) {
-    EXPECT_CALL(*apm_, set_output_will_be_muted(!enable));
-    ASSERT_TRUE(channel_);
-    if (enable && options) {
-      EXPECT_CALL(*apm_, SetExtraOptions(testing::_));
-    }
-    EXPECT_TRUE(channel_->SetAudioSend(ssrc, enable, options, source));
-  }
-
-  void TestInsertDtmf(uint32_t ssrc, bool caller,
-                      const cricket::AudioCodec& codec) {
-    EXPECT_TRUE(SetupChannel());
-    if (caller) {
-      // If this is a caller, local description will be applied and add the
-      // send stream.
-      EXPECT_TRUE(channel_->AddSendStream(
-          cricket::StreamParams::CreateLegacy(kSsrcX)));
-    }
-
-    // Test we can only InsertDtmf when the other side supports telephone-event.
-    SetSendParameters(send_parameters_);
-    SetSend(true);
-    EXPECT_FALSE(channel_->CanInsertDtmf());
-    EXPECT_FALSE(channel_->InsertDtmf(ssrc, 1, 111));
-    send_parameters_.codecs.push_back(codec);
-    SetSendParameters(send_parameters_);
-    EXPECT_TRUE(channel_->CanInsertDtmf());
-
-    if (!caller) {
-      // If this is callee, there's no active send channel yet.
-      EXPECT_FALSE(channel_->InsertDtmf(ssrc, 2, 123));
-      EXPECT_TRUE(channel_->AddSendStream(
-          cricket::StreamParams::CreateLegacy(kSsrcX)));
-    }
-
-    // Check we fail if the ssrc is invalid.
-    EXPECT_FALSE(channel_->InsertDtmf(-1, 1, 111));
-
-    // Test send.
-    cricket::FakeAudioSendStream::TelephoneEvent telephone_event =
-        GetSendStream(kSsrcX).GetLatestTelephoneEvent();
-    EXPECT_EQ(-1, telephone_event.payload_type);
-    EXPECT_TRUE(channel_->InsertDtmf(ssrc, 2, 123));
-    telephone_event = GetSendStream(kSsrcX).GetLatestTelephoneEvent();
-    EXPECT_EQ(codec.id, telephone_event.payload_type);
-    EXPECT_EQ(codec.clockrate, telephone_event.payload_frequency);
-    EXPECT_EQ(2, telephone_event.event_code);
-    EXPECT_EQ(123, telephone_event.duration_ms);
-  }
-
-  // Test that send bandwidth is set correctly.
-  // |codec| is the codec under test.
-  // |max_bitrate| is a parameter to set to SetMaxSendBandwidth().
-  // |expected_result| is the expected result from SetMaxSendBandwidth().
-  // |expected_bitrate| is the expected audio bitrate afterward.
-  void TestMaxSendBandwidth(const cricket::AudioCodec& codec,
-                            int max_bitrate,
-                            bool expected_result,
-                            int expected_bitrate) {
-    cricket::AudioSendParameters parameters;
-    parameters.codecs.push_back(codec);
-    parameters.max_bandwidth_bps = max_bitrate;
-    if (expected_result) {
-      SetSendParameters(parameters);
-    } else {
-      EXPECT_FALSE(channel_->SetSendParameters(parameters));
-    }
-    EXPECT_EQ(expected_bitrate, GetCodecBitrate(kSsrcX));
-  }
-
-  // Sets the per-stream maximum bitrate limit for the specified SSRC.
-  bool SetMaxBitrateForStream(int32_t ssrc, int bitrate) {
-    webrtc::RtpParameters parameters = channel_->GetRtpSendParameters(ssrc);
-    EXPECT_EQ(1UL, parameters.encodings.size());
-
-    parameters.encodings[0].max_bitrate_bps = rtc::Optional<int>(bitrate);
-    return channel_->SetRtpSendParameters(ssrc, parameters);
-  }
-
-  void SetGlobalMaxBitrate(const cricket::AudioCodec& codec, int bitrate) {
-    cricket::AudioSendParameters send_parameters;
-    send_parameters.codecs.push_back(codec);
-    send_parameters.max_bandwidth_bps = bitrate;
-    SetSendParameters(send_parameters);
-  }
-
-  void CheckSendCodecBitrate(int32_t ssrc,
-                             const char expected_name[],
-                             int expected_bitrate) {
-    const auto& spec = GetSendStreamConfig(ssrc).send_codec_spec;
-    EXPECT_EQ(expected_name, spec->format.name);
-    EXPECT_EQ(expected_bitrate, spec->target_bitrate_bps);
-  }
-
-  rtc::Optional<int> GetCodecBitrate(int32_t ssrc) {
-    return GetSendStreamConfig(ssrc).send_codec_spec->target_bitrate_bps;
-  }
-
-  const rtc::Optional<std::string>& GetAudioNetworkAdaptorConfig(int32_t ssrc) {
-    return GetSendStreamConfig(ssrc).audio_network_adaptor_config;
-  }
-
-  void SetAndExpectMaxBitrate(const cricket::AudioCodec& codec,
-                              int global_max,
-                              int stream_max,
-                              bool expected_result,
-                              int expected_codec_bitrate) {
-    // Clear the bitrate limit from the previous test case.
-    EXPECT_TRUE(SetMaxBitrateForStream(kSsrcX, -1));
-
-    // Attempt to set the requested bitrate limits.
-    SetGlobalMaxBitrate(codec, global_max);
-    EXPECT_EQ(expected_result, SetMaxBitrateForStream(kSsrcX, stream_max));
-
-    // Verify that reading back the parameters gives results
-    // consistent with the Set() result.
-    webrtc::RtpParameters resulting_parameters =
-        channel_->GetRtpSendParameters(kSsrcX);
-    EXPECT_EQ(1UL, resulting_parameters.encodings.size());
-    EXPECT_EQ(expected_result ? stream_max : -1,
-              resulting_parameters.encodings[0].max_bitrate_bps);
-
-    // Verify that the codec settings have the expected bitrate.
-    EXPECT_EQ(expected_codec_bitrate, GetCodecBitrate(kSsrcX));
-  }
-
-  void SetSendCodecsShouldWorkForBitrates(const char* min_bitrate_kbps,
-                                          int expected_min_bitrate_bps,
-                                          const char* start_bitrate_kbps,
-                                          int expected_start_bitrate_bps,
-                                          const char* max_bitrate_kbps,
-                                          int expected_max_bitrate_bps) {
-    EXPECT_TRUE(SetupSendStream());
-    auto& codecs = send_parameters_.codecs;
-    codecs.clear();
-    codecs.push_back(kOpusCodec);
-    codecs[0].params[cricket::kCodecParamMinBitrate] = min_bitrate_kbps;
-    codecs[0].params[cricket::kCodecParamStartBitrate] = start_bitrate_kbps;
-    codecs[0].params[cricket::kCodecParamMaxBitrate] = max_bitrate_kbps;
-    SetSendParameters(send_parameters_);
-
-    EXPECT_EQ(expected_min_bitrate_bps,
-              call_.GetConfig().bitrate_config.min_bitrate_bps);
-    EXPECT_EQ(expected_start_bitrate_bps,
-              call_.GetConfig().bitrate_config.start_bitrate_bps);
-    EXPECT_EQ(expected_max_bitrate_bps,
-              call_.GetConfig().bitrate_config.max_bitrate_bps);
-  }
-
-  void TestSetSendRtpHeaderExtensions(const std::string& ext) {
-    EXPECT_TRUE(SetupSendStream());
-
-    // Ensure extensions are off by default.
-    EXPECT_EQ(0u, GetSendStreamConfig(kSsrcX).rtp.extensions.size());
-
-    // Ensure unknown extensions won't cause an error.
-    send_parameters_.extensions.push_back(
-        webrtc::RtpExtension("urn:ietf:params:unknownextention", 1));
-    SetSendParameters(send_parameters_);
-    EXPECT_EQ(0u, GetSendStreamConfig(kSsrcX).rtp.extensions.size());
-
-    // Ensure extensions stay off with an empty list of headers.
-    send_parameters_.extensions.clear();
-    SetSendParameters(send_parameters_);
-    EXPECT_EQ(0u, GetSendStreamConfig(kSsrcX).rtp.extensions.size());
-
-    // Ensure extension is set properly.
-    const int id = 1;
-    send_parameters_.extensions.push_back(webrtc::RtpExtension(ext, id));
-    SetSendParameters(send_parameters_);
-    EXPECT_EQ(1u, GetSendStreamConfig(kSsrcX).rtp.extensions.size());
-    EXPECT_EQ(ext, GetSendStreamConfig(kSsrcX).rtp.extensions[0].uri);
-    EXPECT_EQ(id, GetSendStreamConfig(kSsrcX).rtp.extensions[0].id);
-
-    // Ensure extension is set properly on new stream.
-    EXPECT_TRUE(channel_->AddSendStream(
-        cricket::StreamParams::CreateLegacy(kSsrcY)));
-    EXPECT_NE(call_.GetAudioSendStream(kSsrcX),
-              call_.GetAudioSendStream(kSsrcY));
-    EXPECT_EQ(1u, GetSendStreamConfig(kSsrcY).rtp.extensions.size());
-    EXPECT_EQ(ext, GetSendStreamConfig(kSsrcY).rtp.extensions[0].uri);
-    EXPECT_EQ(id, GetSendStreamConfig(kSsrcY).rtp.extensions[0].id);
-
-    // Ensure all extensions go back off with an empty list.
-    send_parameters_.codecs.push_back(kPcmuCodec);
-    send_parameters_.extensions.clear();
-    SetSendParameters(send_parameters_);
-    EXPECT_EQ(0u, GetSendStreamConfig(kSsrcX).rtp.extensions.size());
-    EXPECT_EQ(0u, GetSendStreamConfig(kSsrcY).rtp.extensions.size());
-  }
-
-  void TestSetRecvRtpHeaderExtensions(const std::string& ext) {
-    EXPECT_TRUE(SetupRecvStream());
-
-    // Ensure extensions are off by default.
-    EXPECT_EQ(0u, GetRecvStreamConfig(kSsrcX).rtp.extensions.size());
-
-    // Ensure unknown extensions won't cause an error.
-    recv_parameters_.extensions.push_back(
-        webrtc::RtpExtension("urn:ietf:params:unknownextention", 1));
-    EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
-    EXPECT_EQ(0u, GetRecvStreamConfig(kSsrcX).rtp.extensions.size());
-
-    // Ensure extensions stay off with an empty list of headers.
-    recv_parameters_.extensions.clear();
-    EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
-    EXPECT_EQ(0u, GetRecvStreamConfig(kSsrcX).rtp.extensions.size());
-
-    // Ensure extension is set properly.
-    const int id = 2;
-    recv_parameters_.extensions.push_back(webrtc::RtpExtension(ext, id));
-    EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
-    EXPECT_EQ(1u, GetRecvStreamConfig(kSsrcX).rtp.extensions.size());
-    EXPECT_EQ(ext, GetRecvStreamConfig(kSsrcX).rtp.extensions[0].uri);
-    EXPECT_EQ(id, GetRecvStreamConfig(kSsrcX).rtp.extensions[0].id);
-
-    // Ensure extension is set properly on new stream.
-    EXPECT_TRUE(AddRecvStream(kSsrcY));
-    EXPECT_NE(call_.GetAudioReceiveStream(kSsrcX),
-              call_.GetAudioReceiveStream(kSsrcY));
-    EXPECT_EQ(1u, GetRecvStreamConfig(kSsrcY).rtp.extensions.size());
-    EXPECT_EQ(ext, GetRecvStreamConfig(kSsrcY).rtp.extensions[0].uri);
-    EXPECT_EQ(id, GetRecvStreamConfig(kSsrcY).rtp.extensions[0].id);
-
-    // Ensure all extensions go back off with an empty list.
-    recv_parameters_.extensions.clear();
-    EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
-    EXPECT_EQ(0u, GetRecvStreamConfig(kSsrcX).rtp.extensions.size());
-    EXPECT_EQ(0u, GetRecvStreamConfig(kSsrcY).rtp.extensions.size());
-  }
-
-  webrtc::AudioSendStream::Stats GetAudioSendStreamStats() const {
-    webrtc::AudioSendStream::Stats stats;
-    stats.local_ssrc = 12;
-    stats.bytes_sent = 345;
-    stats.packets_sent = 678;
-    stats.packets_lost = 9012;
-    stats.fraction_lost = 34.56f;
-    stats.codec_name = "codec_name_send";
-    stats.codec_payload_type = rtc::Optional<int>(42);
-    stats.ext_seqnum = 789;
-    stats.jitter_ms = 12;
-    stats.rtt_ms = 345;
-    stats.audio_level = 678;
-    stats.aec_quality_min = 9.01f;
-    stats.echo_delay_median_ms = 234;
-    stats.echo_delay_std_ms = 567;
-    stats.echo_return_loss = 890;
-    stats.echo_return_loss_enhancement = 1234;
-    stats.residual_echo_likelihood = 0.432f;
-    stats.residual_echo_likelihood_recent_max = 0.6f;
-    stats.ana_statistics.bitrate_action_counter = rtc::Optional<uint32_t>(321);
-    stats.ana_statistics.channel_action_counter = rtc::Optional<uint32_t>(432);
-    stats.ana_statistics.dtx_action_counter = rtc::Optional<uint32_t>(543);
-    stats.ana_statistics.fec_action_counter = rtc::Optional<uint32_t>(654);
-    stats.ana_statistics.frame_length_increase_counter =
-        rtc::Optional<uint32_t>(765);
-    stats.ana_statistics.frame_length_decrease_counter =
-        rtc::Optional<uint32_t>(876);
-    stats.ana_statistics.uplink_packet_loss_fraction =
-        rtc::Optional<float>(987.0);
-    stats.typing_noise_detected = true;
-    return stats;
-  }
-  void SetAudioSendStreamStats() {
-    for (auto* s : call_.GetAudioSendStreams()) {
-      s->SetStats(GetAudioSendStreamStats());
-    }
-  }
-  void VerifyVoiceSenderInfo(const cricket::VoiceSenderInfo& info,
-                             bool is_sending) {
-    const auto stats = GetAudioSendStreamStats();
-    EXPECT_EQ(info.ssrc(), stats.local_ssrc);
-    EXPECT_EQ(info.bytes_sent, stats.bytes_sent);
-    EXPECT_EQ(info.packets_sent, stats.packets_sent);
-    EXPECT_EQ(info.packets_lost, stats.packets_lost);
-    EXPECT_EQ(info.fraction_lost, stats.fraction_lost);
-    EXPECT_EQ(info.codec_name, stats.codec_name);
-    EXPECT_EQ(info.codec_payload_type, stats.codec_payload_type);
-    EXPECT_EQ(info.ext_seqnum, stats.ext_seqnum);
-    EXPECT_EQ(info.jitter_ms, stats.jitter_ms);
-    EXPECT_EQ(info.rtt_ms, stats.rtt_ms);
-    EXPECT_EQ(info.audio_level, stats.audio_level);
-    EXPECT_EQ(info.aec_quality_min, stats.aec_quality_min);
-    EXPECT_EQ(info.echo_delay_median_ms, stats.echo_delay_median_ms);
-    EXPECT_EQ(info.echo_delay_std_ms, stats.echo_delay_std_ms);
-    EXPECT_EQ(info.echo_return_loss, stats.echo_return_loss);
-    EXPECT_EQ(info.echo_return_loss_enhancement,
-              stats.echo_return_loss_enhancement);
-    EXPECT_EQ(info.residual_echo_likelihood, stats.residual_echo_likelihood);
-    EXPECT_EQ(info.residual_echo_likelihood_recent_max,
-              stats.residual_echo_likelihood_recent_max);
-    EXPECT_EQ(info.ana_statistics.bitrate_action_counter,
-              stats.ana_statistics.bitrate_action_counter);
-    EXPECT_EQ(info.ana_statistics.channel_action_counter,
-              stats.ana_statistics.channel_action_counter);
-    EXPECT_EQ(info.ana_statistics.dtx_action_counter,
-              stats.ana_statistics.dtx_action_counter);
-    EXPECT_EQ(info.ana_statistics.fec_action_counter,
-              stats.ana_statistics.fec_action_counter);
-    EXPECT_EQ(info.ana_statistics.frame_length_increase_counter,
-              stats.ana_statistics.frame_length_increase_counter);
-    EXPECT_EQ(info.ana_statistics.frame_length_decrease_counter,
-              stats.ana_statistics.frame_length_decrease_counter);
-    EXPECT_EQ(info.ana_statistics.uplink_packet_loss_fraction,
-              stats.ana_statistics.uplink_packet_loss_fraction);
-    EXPECT_EQ(info.typing_noise_detected,
-              stats.typing_noise_detected && is_sending);
-  }
-
-  webrtc::AudioReceiveStream::Stats GetAudioReceiveStreamStats() const {
-    webrtc::AudioReceiveStream::Stats stats;
-    stats.remote_ssrc = 123;
-    stats.bytes_rcvd = 456;
-    stats.packets_rcvd = 768;
-    stats.packets_lost = 101;
-    stats.fraction_lost = 23.45f;
-    stats.codec_name = "codec_name_recv";
-    stats.codec_payload_type = rtc::Optional<int>(42);
-    stats.ext_seqnum = 678;
-    stats.jitter_ms = 901;
-    stats.jitter_buffer_ms = 234;
-    stats.jitter_buffer_preferred_ms = 567;
-    stats.delay_estimate_ms = 890;
-    stats.audio_level = 1234;
-    stats.total_samples_received = 5678901;
-    stats.concealed_samples = 234;
-    stats.expand_rate = 5.67f;
-    stats.speech_expand_rate = 8.90f;
-    stats.secondary_decoded_rate = 1.23f;
-    stats.secondary_discarded_rate = 0.12f;
-    stats.accelerate_rate = 4.56f;
-    stats.preemptive_expand_rate = 7.89f;
-    stats.decoding_calls_to_silence_generator = 12;
-    stats.decoding_calls_to_neteq = 345;
-    stats.decoding_normal = 67890;
-    stats.decoding_plc = 1234;
-    stats.decoding_cng = 5678;
-    stats.decoding_plc_cng = 9012;
-    stats.decoding_muted_output = 3456;
-    stats.capture_start_ntp_time_ms = 7890;
-    return stats;
-  }
-  void SetAudioReceiveStreamStats() {
-    for (auto* s : call_.GetAudioReceiveStreams()) {
-      s->SetStats(GetAudioReceiveStreamStats());
-    }
-  }
-  void VerifyVoiceReceiverInfo(const cricket::VoiceReceiverInfo& info) {
-    const auto stats = GetAudioReceiveStreamStats();
-    EXPECT_EQ(info.ssrc(), stats.remote_ssrc);
-    EXPECT_EQ(info.bytes_rcvd, stats.bytes_rcvd);
-    EXPECT_EQ(info.packets_rcvd, stats.packets_rcvd);
-    EXPECT_EQ(info.packets_lost, stats.packets_lost);
-    EXPECT_EQ(info.fraction_lost, stats.fraction_lost);
-    EXPECT_EQ(info.codec_name, stats.codec_name);
-    EXPECT_EQ(info.codec_payload_type, stats.codec_payload_type);
-    EXPECT_EQ(info.ext_seqnum, stats.ext_seqnum);
-    EXPECT_EQ(info.jitter_ms, stats.jitter_ms);
-    EXPECT_EQ(info.jitter_buffer_ms, stats.jitter_buffer_ms);
-    EXPECT_EQ(info.jitter_buffer_preferred_ms,
-              stats.jitter_buffer_preferred_ms);
-    EXPECT_EQ(info.delay_estimate_ms, stats.delay_estimate_ms);
-    EXPECT_EQ(info.audio_level, stats.audio_level);
-    EXPECT_EQ(info.total_samples_received, stats.total_samples_received);
-    EXPECT_EQ(info.concealed_samples, stats.concealed_samples);
-    EXPECT_EQ(info.expand_rate, stats.expand_rate);
-    EXPECT_EQ(info.speech_expand_rate, stats.speech_expand_rate);
-    EXPECT_EQ(info.secondary_decoded_rate, stats.secondary_decoded_rate);
-    EXPECT_EQ(info.secondary_discarded_rate, stats.secondary_discarded_rate);
-    EXPECT_EQ(info.accelerate_rate, stats.accelerate_rate);
-    EXPECT_EQ(info.preemptive_expand_rate, stats.preemptive_expand_rate);
-    EXPECT_EQ(info.decoding_calls_to_silence_generator,
-              stats.decoding_calls_to_silence_generator);
-    EXPECT_EQ(info.decoding_calls_to_neteq, stats.decoding_calls_to_neteq);
-    EXPECT_EQ(info.decoding_normal, stats.decoding_normal);
-    EXPECT_EQ(info.decoding_plc, stats.decoding_plc);
-    EXPECT_EQ(info.decoding_cng, stats.decoding_cng);
-    EXPECT_EQ(info.decoding_plc_cng, stats.decoding_plc_cng);
-    EXPECT_EQ(info.decoding_muted_output, stats.decoding_muted_output);
-    EXPECT_EQ(info.capture_start_ntp_time_ms, stats.capture_start_ntp_time_ms);
-  }
-  void VerifyVoiceSendRecvCodecs(const cricket::VoiceMediaInfo& info) const {
-    EXPECT_EQ(send_parameters_.codecs.size(), info.send_codecs.size());
-    for (const cricket::AudioCodec& codec : send_parameters_.codecs) {
-      ASSERT_EQ(info.send_codecs.count(codec.id), 1U);
-      EXPECT_EQ(info.send_codecs.find(codec.id)->second,
-                codec.ToCodecParameters());
-    }
-    EXPECT_EQ(recv_parameters_.codecs.size(), info.receive_codecs.size());
-    for (const cricket::AudioCodec& codec : recv_parameters_.codecs) {
-      ASSERT_EQ(info.receive_codecs.count(codec.id), 1U);
-      EXPECT_EQ(info.receive_codecs.find(codec.id)->second,
-                codec.ToCodecParameters());
-    }
-  }
-
-  bool IsHighPassFilterEnabled() {
-    return engine_->GetApmConfigForTest().high_pass_filter.enabled;
-  }
-
- protected:
-  StrictMock<webrtc::test::MockAudioDeviceModule> adm_;
-  rtc::scoped_refptr<StrictMock<webrtc::test::MockAudioProcessing>> apm_;
-  webrtc::test::MockGainControl& apm_gc_;
-  webrtc::test::MockEchoCancellation& apm_ec_;
-  webrtc::test::MockNoiseSuppression& apm_ns_;
-  webrtc::test::MockVoiceDetection& apm_vd_;
-  StrictMock<MockTransmitMixer> transmit_mixer_;
-  webrtc::RtcEventLogNullImpl event_log_;
-  cricket::FakeCall call_;
-  cricket::FakeWebRtcVoiceEngine voe_;
-  std::unique_ptr<cricket::WebRtcVoiceEngine> engine_;
-  cricket::VoiceMediaChannel* channel_ = nullptr;
-  cricket::AudioSendParameters send_parameters_;
-  cricket::AudioRecvParameters recv_parameters_;
-  FakeAudioSource fake_source_;
-  webrtc::AudioProcessing::Config apm_config_;
-
- private:
-  webrtc::test::ScopedFieldTrials override_field_trials_;
-};
-
-// Tests that we can create and destroy a channel.
-TEST_F(WebRtcVoiceEngineTestFake, CreateChannel) {
-  EXPECT_TRUE(SetupChannel());
-}
-
-// Test that we can add a send stream and that it has the correct defaults.
-TEST_F(WebRtcVoiceEngineTestFake, CreateSendStream) {
-  EXPECT_TRUE(SetupChannel());
-  EXPECT_TRUE(
-      channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrcX)));
-  const webrtc::AudioSendStream::Config& config = GetSendStreamConfig(kSsrcX);
-  EXPECT_EQ(kSsrcX, config.rtp.ssrc);
-  EXPECT_EQ("", config.rtp.c_name);
-  EXPECT_EQ(0u, config.rtp.extensions.size());
-  EXPECT_EQ(static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_),
-            config.send_transport);
-}
-
-// Test that we can add a receive stream and that it has the correct defaults.
-TEST_F(WebRtcVoiceEngineTestFake, CreateRecvStream) {
-  EXPECT_TRUE(SetupChannel());
-  EXPECT_TRUE(AddRecvStream(kSsrcX));
-  const webrtc::AudioReceiveStream::Config& config =
-      GetRecvStreamConfig(kSsrcX);
-  EXPECT_EQ(kSsrcX, config.rtp.remote_ssrc);
-  EXPECT_EQ(0xFA17FA17, config.rtp.local_ssrc);
-  EXPECT_FALSE(config.rtp.transport_cc);
-  EXPECT_EQ(0u, config.rtp.extensions.size());
-  EXPECT_EQ(static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_),
-            config.rtcp_send_transport);
-  EXPECT_EQ("", config.sync_group);
-}
-
-TEST_F(WebRtcVoiceEngineTestFake, OpusSupportsTransportCc) {
-  const std::vector<cricket::AudioCodec>& codecs = engine_->send_codecs();
-  bool opus_found = false;
-  for (cricket::AudioCodec codec : codecs) {
-    if (codec.name == "opus") {
-      EXPECT_TRUE(HasTransportCc(codec));
-      opus_found = true;
-    }
-  }
-  EXPECT_TRUE(opus_found);
-}
-
-// Test that we set our inbound codecs properly, including changing PT.
-TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecs) {
-  EXPECT_TRUE(SetupChannel());
-  cricket::AudioRecvParameters parameters;
-  parameters.codecs.push_back(kIsacCodec);
-  parameters.codecs.push_back(kPcmuCodec);
-  parameters.codecs.push_back(kTelephoneEventCodec1);
-  parameters.codecs.push_back(kTelephoneEventCodec2);
-  parameters.codecs[0].id = 106;  // collide with existing CN 32k
-  parameters.codecs[2].id = 126;
-  EXPECT_TRUE(channel_->SetRecvParameters(parameters));
-  EXPECT_TRUE(AddRecvStream(kSsrcX));
-  EXPECT_THAT(GetRecvStreamConfig(kSsrcX).decoder_map,
-              (ContainerEq<std::map<int, webrtc::SdpAudioFormat>>(
-                  {{0, {"PCMU", 8000, 1}},
-                   {106, {"ISAC", 16000, 1}},
-                   {126, {"telephone-event", 8000, 1}},
-                   {107, {"telephone-event", 32000, 1}}})));
-}
-
-// Test that we fail to set an unknown inbound codec.
-TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsUnsupportedCodec) {
-  EXPECT_TRUE(SetupChannel());
-  cricket::AudioRecvParameters parameters;
-  parameters.codecs.push_back(kIsacCodec);
-  parameters.codecs.push_back(cricket::AudioCodec(127, "XYZ", 32000, 0, 1));
-  EXPECT_FALSE(channel_->SetRecvParameters(parameters));
-}
-
-// Test that we fail if we have duplicate types in the inbound list.
-TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsDuplicatePayloadType) {
-  EXPECT_TRUE(SetupChannel());
-  cricket::AudioRecvParameters parameters;
-  parameters.codecs.push_back(kIsacCodec);
-  parameters.codecs.push_back(kCn16000Codec);
-  parameters.codecs[1].id = kIsacCodec.id;
-  EXPECT_FALSE(channel_->SetRecvParameters(parameters));
-}
-
-// Test that we can decode OPUS without stereo parameters.
-TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpusNoStereo) {
-  EXPECT_TRUE(SetupChannel());
-  cricket::AudioRecvParameters parameters;
-  parameters.codecs.push_back(kIsacCodec);
-  parameters.codecs.push_back(kPcmuCodec);
-  parameters.codecs.push_back(kOpusCodec);
-  EXPECT_TRUE(channel_->SetRecvParameters(parameters));
-  EXPECT_TRUE(AddRecvStream(kSsrcX));
-  EXPECT_THAT(GetRecvStreamConfig(kSsrcX).decoder_map,
-              (ContainerEq<std::map<int, webrtc::SdpAudioFormat>>(
-                  {{0, {"PCMU", 8000, 1}},
-                   {103, {"ISAC", 16000, 1}},
-                   {111, {"opus", 48000, 2}}})));
-}
-
-// Test that we can decode OPUS with stereo = 0.
-TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus0Stereo) {
-  EXPECT_TRUE(SetupChannel());
-  cricket::AudioRecvParameters parameters;
-  parameters.codecs.push_back(kIsacCodec);
-  parameters.codecs.push_back(kPcmuCodec);
-  parameters.codecs.push_back(kOpusCodec);
-  parameters.codecs[2].params["stereo"] = "0";
-  EXPECT_TRUE(channel_->SetRecvParameters(parameters));
-  EXPECT_TRUE(AddRecvStream(kSsrcX));
-  EXPECT_THAT(GetRecvStreamConfig(kSsrcX).decoder_map,
-              (ContainerEq<std::map<int, webrtc::SdpAudioFormat>>(
-                  {{0, {"PCMU", 8000, 1}},
-                   {103, {"ISAC", 16000, 1}},
-                   {111, {"opus", 48000, 2, {{"stereo", "0"}}}}})));
-}
-
-// Test that we can decode OPUS with stereo = 1.
-TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithOpus1Stereo) {
-  EXPECT_TRUE(SetupChannel());
-  cricket::AudioRecvParameters parameters;
-  parameters.codecs.push_back(kIsacCodec);
-  parameters.codecs.push_back(kPcmuCodec);
-  parameters.codecs.push_back(kOpusCodec);
-  parameters.codecs[2].params["stereo"] = "1";
-  EXPECT_TRUE(channel_->SetRecvParameters(parameters));
-  EXPECT_TRUE(AddRecvStream(kSsrcX));
-  EXPECT_THAT(GetRecvStreamConfig(kSsrcX).decoder_map,
-              (ContainerEq<std::map<int, webrtc::SdpAudioFormat>>(
-                  {{0, {"PCMU", 8000, 1}},
-                   {103, {"ISAC", 16000, 1}},
-                   {111, {"opus", 48000, 2, {{"stereo", "1"}}}}})));
-}
-
-// Test that changes to recv codecs are applied to all streams.
-TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWithMultipleStreams) {
-  EXPECT_TRUE(SetupChannel());
-  cricket::AudioRecvParameters parameters;
-  parameters.codecs.push_back(kIsacCodec);
-  parameters.codecs.push_back(kPcmuCodec);
-  parameters.codecs.push_back(kTelephoneEventCodec1);
-  parameters.codecs.push_back(kTelephoneEventCodec2);
-  parameters.codecs[0].id = 106;  // collide with existing CN 32k
-  parameters.codecs[2].id = 126;
-  EXPECT_TRUE(channel_->SetRecvParameters(parameters));
-  for (const auto& ssrc : {kSsrcX, kSsrcY}) {
-    EXPECT_TRUE(AddRecvStream(ssrc));
-    EXPECT_THAT(GetRecvStreamConfig(ssrc).decoder_map,
-                (ContainerEq<std::map<int, webrtc::SdpAudioFormat>>(
-                    {{0, {"PCMU", 8000, 1}},
-                     {106, {"ISAC", 16000, 1}},
-                     {126, {"telephone-event", 8000, 1}},
-                     {107, {"telephone-event", 32000, 1}}})));
-  }
-}
-
-TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsAfterAddingStreams) {
-  EXPECT_TRUE(SetupRecvStream());
-  cricket::AudioRecvParameters parameters;
-  parameters.codecs.push_back(kIsacCodec);
-  parameters.codecs[0].id = 106;  // collide with existing CN 32k
-  EXPECT_TRUE(channel_->SetRecvParameters(parameters));
-
-  const auto& dm = GetRecvStreamConfig(kSsrcX).decoder_map;
-  ASSERT_EQ(1, dm.count(106));
-  EXPECT_EQ(webrtc::SdpAudioFormat("isac", 16000, 1), dm.at(106));
-}
-
-// Test that we can apply the same set of codecs again while playing.
-TEST_F(WebRtcVoiceEngineTestFake, SetRecvCodecsWhilePlaying) {
-  EXPECT_TRUE(SetupRecvStream());
-  cricket::AudioRecvParameters parameters;
-  parameters.codecs.push_back(kIsacCodec);
-  parameters.codecs.push_back(kCn16000Codec);
-  EXPECT_TRUE(channel_->SetRecvParameters(parameters));
-  channel_->SetPlayout(true);
-  EXPECT_TRUE(channel_->SetRecvParameters(parameters));
-
-  // Remapping a payload type to a different codec should fail.
-  parameters.codecs[0] = kOpusCodec;
-  parameters.codecs[0].id = kIsacCodec.id;
-  EXPECT_FALSE(channel_->SetRecvParameters(parameters));
-  EXPECT_TRUE(GetRecvStream(kSsrcX).started());
-}
-
-// Test that we can add a codec while playing.
-TEST_F(WebRtcVoiceEngineTestFake, AddRecvCodecsWhilePlaying) {
-  EXPECT_TRUE(SetupRecvStream());
-  cricket::AudioRecvParameters parameters;
-  parameters.codecs.push_back(kIsacCodec);
-  parameters.codecs.push_back(kCn16000Codec);
-  EXPECT_TRUE(channel_->SetRecvParameters(parameters));
-  channel_->SetPlayout(true);
-
-  parameters.codecs.push_back(kOpusCodec);
-  EXPECT_TRUE(channel_->SetRecvParameters(parameters));
-  EXPECT_TRUE(GetRecvStream(kSsrcX).started());
-}
-
-// Test that we accept adding the same codec with a different payload type.
-// See: https://bugs.chromium.org/p/webrtc/issues/detail?id=5847
-TEST_F(WebRtcVoiceEngineTestFake, ChangeRecvCodecPayloadType) {
-  EXPECT_TRUE(SetupRecvStream());
-  cricket::AudioRecvParameters parameters;
-  parameters.codecs.push_back(kIsacCodec);
-  EXPECT_TRUE(channel_->SetRecvParameters(parameters));
-
-  ++parameters.codecs[0].id;
-  EXPECT_TRUE(channel_->SetRecvParameters(parameters));
-}
-
-TEST_F(WebRtcVoiceEngineTestFake, SetSendBandwidthAuto) {
-  EXPECT_TRUE(SetupSendStream());
-
-  // Test that when autobw is enabled, bitrate is kept as the default
-  // value. autobw is enabled for the following tests because the target
-  // bitrate is <= 0.
-
-  // ISAC, default bitrate == 32000.
-  TestMaxSendBandwidth(kIsacCodec, 0, true, 32000);
-
-  // PCMU, default bitrate == 64000.
-  TestMaxSendBandwidth(kPcmuCodec, -1, true, 64000);
-
-  // opus, default bitrate == 32000 in mono.
-  TestMaxSendBandwidth(kOpusCodec, -1, true, 32000);
-}
-
-TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCaller) {
-  EXPECT_TRUE(SetupSendStream());
-
-  // ISAC, default bitrate == 32000.
-  TestMaxSendBandwidth(kIsacCodec, 16000, true, 16000);
-  // Rates above the max (56000) should be capped.
-  TestMaxSendBandwidth(kIsacCodec, 100000, true, 32000);
-
-  // opus, default bitrate == 64000.
-  TestMaxSendBandwidth(kOpusCodec, 96000, true, 96000);
-  TestMaxSendBandwidth(kOpusCodec, 48000, true, 48000);
-  // Rates above the max (510000) should be capped.
-  TestMaxSendBandwidth(kOpusCodec, 600000, true, 510000);
-}
-
-TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthFixedRateAsCaller) {
-  EXPECT_TRUE(SetupSendStream());
-
-  // Test that we can only set a maximum bitrate for a fixed-rate codec
-  // if it's bigger than the fixed rate.
-
-  // PCMU, fixed bitrate == 64000.
-  TestMaxSendBandwidth(kPcmuCodec, 0, true, 64000);
-  TestMaxSendBandwidth(kPcmuCodec, 1, false, 64000);
-  TestMaxSendBandwidth(kPcmuCodec, 128000, true, 64000);
-  TestMaxSendBandwidth(kPcmuCodec, 32000, false, 64000);
-  TestMaxSendBandwidth(kPcmuCodec, 64000, true, 64000);
-  TestMaxSendBandwidth(kPcmuCodec, 63999, false, 64000);
-  TestMaxSendBandwidth(kPcmuCodec, 64001, true, 64000);
-}
-
-TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthMultiRateAsCallee) {
-  EXPECT_TRUE(SetupChannel());
-  const int kDesiredBitrate = 128000;
-  cricket::AudioSendParameters parameters;
-  parameters.codecs = engine_->send_codecs();
-  parameters.max_bandwidth_bps = kDesiredBitrate;
-  SetSendParameters(parameters);
-
-  EXPECT_TRUE(channel_->AddSendStream(
-      cricket::StreamParams::CreateLegacy(kSsrcX)));
-
-  EXPECT_EQ(kDesiredBitrate, GetCodecBitrate(kSsrcX));
-}
-
-// Test that bitrate cannot be set for CBR codecs.
-// Bitrate is ignored if it is higher than the fixed bitrate.
-// Bitrate less then the fixed bitrate is an error.
-TEST_F(WebRtcVoiceEngineTestFake, SetMaxSendBandwidthCbr) {
-  EXPECT_TRUE(SetupSendStream());
-
-  // PCMU, default bitrate == 64000.
-  SetSendParameters(send_parameters_);
-  EXPECT_EQ(64000, GetCodecBitrate(kSsrcX));
-
-  send_parameters_.max_bandwidth_bps = 128000;
-  SetSendParameters(send_parameters_);
-  EXPECT_EQ(64000, GetCodecBitrate(kSsrcX));
-
-  send_parameters_.max_bandwidth_bps = 128;
-  EXPECT_FALSE(channel_->SetSendParameters(send_parameters_));
-  EXPECT_EQ(64000, GetCodecBitrate(kSsrcX));
-}
-
-// Test that the per-stream bitrate limit and the global
-// bitrate limit both apply.
-TEST_F(WebRtcVoiceEngineTestFake, SetMaxBitratePerStream) {
-  EXPECT_TRUE(SetupSendStream());
-
-  // opus, default bitrate == 32000.
-  SetAndExpectMaxBitrate(kOpusCodec, 0, 0, true, 32000);
-  SetAndExpectMaxBitrate(kOpusCodec, 48000, 0, true, 48000);
-  SetAndExpectMaxBitrate(kOpusCodec, 48000, 64000, true, 48000);
-  SetAndExpectMaxBitrate(kOpusCodec, 64000, 48000, true, 48000);
-
-  // CBR codecs allow both maximums to exceed the bitrate.
-  SetAndExpectMaxBitrate(kPcmuCodec, 0, 0, true, 64000);
-  SetAndExpectMaxBitrate(kPcmuCodec, 64001, 0, true, 64000);
-  SetAndExpectMaxBitrate(kPcmuCodec, 0, 64001, true, 64000);
-  SetAndExpectMaxBitrate(kPcmuCodec, 64001, 64001, true, 64000);
-
-  // CBR codecs don't allow per stream maximums to be too low.
-  SetAndExpectMaxBitrate(kPcmuCodec, 0, 63999, false, 64000);
-  SetAndExpectMaxBitrate(kPcmuCodec, 64001, 63999, false, 64000);
-}
-
-// Test that an attempt to set RtpParameters for a stream that does not exist
-// fails.
-TEST_F(WebRtcVoiceEngineTestFake, CannotSetMaxBitrateForNonexistentStream) {
-  EXPECT_TRUE(SetupChannel());
-  webrtc::RtpParameters nonexistent_parameters =
-      channel_->GetRtpSendParameters(kSsrcX);
-  EXPECT_EQ(0, nonexistent_parameters.encodings.size());
-
-  nonexistent_parameters.encodings.push_back(webrtc::RtpEncodingParameters());
-  EXPECT_FALSE(channel_->SetRtpSendParameters(kSsrcX, nonexistent_parameters));
-}
-
-TEST_F(WebRtcVoiceEngineTestFake,
-       CannotSetRtpSendParametersWithIncorrectNumberOfEncodings) {
-  // This test verifies that setting RtpParameters succeeds only if
-  // the structure contains exactly one encoding.
-  // TODO(skvlad): Update this test when we start supporting setting parameters
-  // for each encoding individually.
-
-  EXPECT_TRUE(SetupSendStream());
-  webrtc::RtpParameters parameters = channel_->GetRtpSendParameters(kSsrcX);
-  // Two or more encodings should result in failure.
-  parameters.encodings.push_back(webrtc::RtpEncodingParameters());
-  EXPECT_FALSE(channel_->SetRtpSendParameters(kSsrcX, parameters));
-  // Zero encodings should also fail.
-  parameters.encodings.clear();
-  EXPECT_FALSE(channel_->SetRtpSendParameters(kSsrcX, parameters));
-}
-
-// Changing the SSRC through RtpParameters is not allowed.
-TEST_F(WebRtcVoiceEngineTestFake, CannotSetSsrcInRtpSendParameters) {
-  EXPECT_TRUE(SetupSendStream());
-  webrtc::RtpParameters parameters = channel_->GetRtpSendParameters(kSsrcX);
-  parameters.encodings[0].ssrc = rtc::Optional<uint32_t>(0xdeadbeef);
-  EXPECT_FALSE(channel_->SetRtpSendParameters(kSsrcX, parameters));
-}
-
-// Test that a stream will not be sending if its encoding is made
-// inactive through SetRtpSendParameters.
-TEST_F(WebRtcVoiceEngineTestFake, SetRtpParametersEncodingsActive) {
-  EXPECT_TRUE(SetupSendStream());
-  SetSend(true);
-  EXPECT_TRUE(GetSendStream(kSsrcX).IsSending());
-  // Get current parameters and change "active" to false.
-  webrtc::RtpParameters parameters = channel_->GetRtpSendParameters(kSsrcX);
-  ASSERT_EQ(1u, parameters.encodings.size());
-  ASSERT_TRUE(parameters.encodings[0].active);
-  parameters.encodings[0].active = false;
-  EXPECT_TRUE(channel_->SetRtpSendParameters(kSsrcX, parameters));
-  EXPECT_FALSE(GetSendStream(kSsrcX).IsSending());
-
-  // Now change it back to active and verify we resume sending.
-  parameters.encodings[0].active = true;
-  EXPECT_TRUE(channel_->SetRtpSendParameters(kSsrcX, parameters));
-  EXPECT_TRUE(GetSendStream(kSsrcX).IsSending());
-}
-
-// Test that SetRtpSendParameters configures the correct encoding channel for
-// each SSRC.
-TEST_F(WebRtcVoiceEngineTestFake, RtpParametersArePerStream) {
-  SetupForMultiSendStream();
-  // Create send streams.
-  for (uint32_t ssrc : kSsrcs4) {
-    EXPECT_TRUE(
-        channel_->AddSendStream(cricket::StreamParams::CreateLegacy(ssrc)));
-  }
-  // Configure one stream to be limited by the stream config, another to be
-  // limited by the global max, and the third one with no per-stream limit
-  // (still subject to the global limit).
-  SetGlobalMaxBitrate(kOpusCodec, 32000);
-  EXPECT_TRUE(SetMaxBitrateForStream(kSsrcs4[0], 24000));
-  EXPECT_TRUE(SetMaxBitrateForStream(kSsrcs4[1], 48000));
-  EXPECT_TRUE(SetMaxBitrateForStream(kSsrcs4[2], -1));
-
-  EXPECT_EQ(24000, GetCodecBitrate(kSsrcs4[0]));
-  EXPECT_EQ(32000, GetCodecBitrate(kSsrcs4[1]));
-  EXPECT_EQ(32000, GetCodecBitrate(kSsrcs4[2]));
-
-  // Remove the global cap; the streams should switch to their respective
-  // maximums (or remain unchanged if there was no other limit on them.)
-  SetGlobalMaxBitrate(kOpusCodec, -1);
-  EXPECT_EQ(24000, GetCodecBitrate(kSsrcs4[0]));
-  EXPECT_EQ(48000, GetCodecBitrate(kSsrcs4[1]));
-  EXPECT_EQ(32000, GetCodecBitrate(kSsrcs4[2]));
-}
-
-// Test that GetRtpSendParameters returns the currently configured codecs.
-TEST_F(WebRtcVoiceEngineTestFake, GetRtpSendParametersCodecs) {
-  EXPECT_TRUE(SetupSendStream());
-  cricket::AudioSendParameters parameters;
-  parameters.codecs.push_back(kIsacCodec);
-  parameters.codecs.push_back(kPcmuCodec);
-  SetSendParameters(parameters);
-
-  webrtc::RtpParameters rtp_parameters = channel_->GetRtpSendParameters(kSsrcX);
-  ASSERT_EQ(2u, rtp_parameters.codecs.size());
-  EXPECT_EQ(kIsacCodec.ToCodecParameters(), rtp_parameters.codecs[0]);
-  EXPECT_EQ(kPcmuCodec.ToCodecParameters(), rtp_parameters.codecs[1]);
-}
-
-// Test that GetRtpSendParameters returns an SSRC.
-TEST_F(WebRtcVoiceEngineTestFake, GetRtpSendParametersSsrc) {
-  EXPECT_TRUE(SetupSendStream());
-  webrtc::RtpParameters rtp_parameters = channel_->GetRtpSendParameters(kSsrcX);
-  ASSERT_EQ(1u, rtp_parameters.encodings.size());
-  EXPECT_EQ(kSsrcX, rtp_parameters.encodings[0].ssrc);
-}
-
-// Test that if we set/get parameters multiple times, we get the same results.
-TEST_F(WebRtcVoiceEngineTestFake, SetAndGetRtpSendParameters) {
-  EXPECT_TRUE(SetupSendStream());
-  cricket::AudioSendParameters parameters;
-  parameters.codecs.push_back(kIsacCodec);
-  parameters.codecs.push_back(kPcmuCodec);
-  SetSendParameters(parameters);
-
-  webrtc::RtpParameters initial_params = channel_->GetRtpSendParameters(kSsrcX);
-
-  // We should be able to set the params we just got.
-  EXPECT_TRUE(channel_->SetRtpSendParameters(kSsrcX, initial_params));
-
-  // ... And this shouldn't change the params returned by GetRtpSendParameters.
-  webrtc::RtpParameters new_params = channel_->GetRtpSendParameters(kSsrcX);
-  EXPECT_EQ(initial_params, channel_->GetRtpSendParameters(kSsrcX));
-}
-
-// Test that max_bitrate_bps in send stream config gets updated correctly when
-// SetRtpSendParameters is called.
-TEST_F(WebRtcVoiceEngineTestFake, SetRtpSendParameterUpdatesMaxBitrate) {
-  webrtc::test::ScopedFieldTrials override_field_trials(
-      "WebRTC-Audio-SendSideBwe/Enabled/");
-  EXPECT_TRUE(SetupSendStream());
-  cricket::AudioSendParameters send_parameters;
-  send_parameters.codecs.push_back(kOpusCodec);
-  SetSendParameters(send_parameters);
-
-  webrtc::RtpParameters rtp_parameters = channel_->GetRtpSendParameters(kSsrcX);
-  // Expect empty on parameters.encodings[0].max_bitrate_bps;
-  EXPECT_FALSE(rtp_parameters.encodings[0].max_bitrate_bps);
-
-  constexpr int kMaxBitrateBps = 6000;
-  rtp_parameters.encodings[0].max_bitrate_bps =
-      rtc::Optional<int>(kMaxBitrateBps);
-  EXPECT_TRUE(channel_->SetRtpSendParameters(kSsrcX, rtp_parameters));
-
-  const int max_bitrate = GetSendStreamConfig(kSsrcX).max_bitrate_bps;
-  EXPECT_EQ(max_bitrate, kMaxBitrateBps);
-}
-
-// Test that GetRtpReceiveParameters returns the currently configured codecs.
-TEST_F(WebRtcVoiceEngineTestFake, GetRtpReceiveParametersCodecs) {
-  EXPECT_TRUE(SetupRecvStream());
-  cricket::AudioRecvParameters parameters;
-  parameters.codecs.push_back(kIsacCodec);
-  parameters.codecs.push_back(kPcmuCodec);
-  EXPECT_TRUE(channel_->SetRecvParameters(parameters));
-
-  webrtc::RtpParameters rtp_parameters =
-      channel_->GetRtpReceiveParameters(kSsrcX);
-  ASSERT_EQ(2u, rtp_parameters.codecs.size());
-  EXPECT_EQ(kIsacCodec.ToCodecParameters(), rtp_parameters.codecs[0]);
-  EXPECT_EQ(kPcmuCodec.ToCodecParameters(), rtp_parameters.codecs[1]);
-}
-
-// Test that GetRtpReceiveParameters returns an SSRC.
-TEST_F(WebRtcVoiceEngineTestFake, GetRtpReceiveParametersSsrc) {
-  EXPECT_TRUE(SetupRecvStream());
-  webrtc::RtpParameters rtp_parameters =
-      channel_->GetRtpReceiveParameters(kSsrcX);
-  ASSERT_EQ(1u, rtp_parameters.encodings.size());
-  EXPECT_EQ(kSsrcX, rtp_parameters.encodings[0].ssrc);
-}
-
-// Test that if we set/get parameters multiple times, we get the same results.
-TEST_F(WebRtcVoiceEngineTestFake, SetAndGetRtpReceiveParameters) {
-  EXPECT_TRUE(SetupRecvStream());
-  cricket::AudioRecvParameters parameters;
-  parameters.codecs.push_back(kIsacCodec);
-  parameters.codecs.push_back(kPcmuCodec);
-  EXPECT_TRUE(channel_->SetRecvParameters(parameters));
-
-  webrtc::RtpParameters initial_params =
-      channel_->GetRtpReceiveParameters(kSsrcX);
-
-  // We should be able to set the params we just got.
-  EXPECT_TRUE(channel_->SetRtpReceiveParameters(kSsrcX, initial_params));
-
-  // ... And this shouldn't change the params returned by
-  // GetRtpReceiveParameters.
-  webrtc::RtpParameters new_params = channel_->GetRtpReceiveParameters(kSsrcX);
-  EXPECT_EQ(initial_params, channel_->GetRtpReceiveParameters(kSsrcX));
-}
-
-// Test that GetRtpReceiveParameters returns parameters correctly when SSRCs
-// aren't signaled. It should return an empty "RtpEncodingParameters" when
-// configured to receive an unsignaled stream and no packets have been received
-// yet, and start returning the SSRC once a packet has been received.
-TEST_F(WebRtcVoiceEngineTestFake, GetRtpReceiveParametersWithUnsignaledSsrc) {
-  ASSERT_TRUE(SetupChannel());
-  // Call necessary methods to configure receiving a default stream as
-  // soon as it arrives.
-  cricket::AudioRecvParameters parameters;
-  parameters.codecs.push_back(kIsacCodec);
-  parameters.codecs.push_back(kPcmuCodec);
-  EXPECT_TRUE(channel_->SetRecvParameters(parameters));
-
-  // Call GetRtpReceiveParameters before configured to receive an unsignaled
-  // stream. Should return nothing.
-  EXPECT_EQ(webrtc::RtpParameters(), channel_->GetRtpReceiveParameters(0));
-
-  // Set a sink for an unsignaled stream.
-  std::unique_ptr<FakeAudioSink> fake_sink(new FakeAudioSink());
-  // Value of "0" means "unsignaled stream".
-  channel_->SetRawAudioSink(0, std::move(fake_sink));
-
-  // Call GetRtpReceiveParameters before the SSRC is known. Value of "0"
-  // in this method means "unsignaled stream".
-  webrtc::RtpParameters rtp_parameters = channel_->GetRtpReceiveParameters(0);
-  ASSERT_EQ(1u, rtp_parameters.encodings.size());
-  EXPECT_FALSE(rtp_parameters.encodings[0].ssrc);
-
-  // Receive PCMU packet (SSRC=1).
-  DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
-
-  // The |ssrc| member should still be unset.
-  rtp_parameters = channel_->GetRtpReceiveParameters(0);
-  ASSERT_EQ(1u, rtp_parameters.encodings.size());
-  EXPECT_FALSE(rtp_parameters.encodings[0].ssrc);
-}
-
-// Test that we apply codecs properly.
-TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecs) {
-  EXPECT_TRUE(SetupSendStream());
-  cricket::AudioSendParameters parameters;
-  parameters.codecs.push_back(kIsacCodec);
-  parameters.codecs.push_back(kPcmuCodec);
-  parameters.codecs.push_back(kCn8000Codec);
-  parameters.codecs[0].id = 96;
-  parameters.codecs[0].bitrate = 22000;
-  SetSendParameters(parameters);
-  const auto& send_codec_spec = *GetSendStreamConfig(kSsrcX).send_codec_spec;
-  EXPECT_EQ(96, send_codec_spec.payload_type);
-  EXPECT_EQ(22000, send_codec_spec.target_bitrate_bps);
-  EXPECT_STRCASEEQ("ISAC", send_codec_spec.format.name.c_str());
-  EXPECT_NE(send_codec_spec.format.clockrate_hz, 8000);
-  EXPECT_EQ(rtc::Optional<int>(), send_codec_spec.cng_payload_type);
-  EXPECT_FALSE(channel_->CanInsertDtmf());
-}
-
-// Test that WebRtcVoiceEngine reconfigures, rather than recreates its
-// AudioSendStream.
-TEST_F(WebRtcVoiceEngineTestFake, DontRecreateSendStream) {
-  EXPECT_TRUE(SetupSendStream());
-  cricket::AudioSendParameters parameters;
-  parameters.codecs.push_back(kIsacCodec);
-  parameters.codecs.push_back(kPcmuCodec);
-  parameters.codecs.push_back(kCn8000Codec);
-  parameters.codecs[0].id = 96;
-  parameters.codecs[0].bitrate = 48000;
-  const int initial_num = call_.GetNumCreatedSendStreams();
-  SetSendParameters(parameters);
-  EXPECT_EQ(initial_num, call_.GetNumCreatedSendStreams());
-  // Calling SetSendCodec again with same codec which is already set.
-  // In this case media channel shouldn't send codec to VoE.
-  SetSendParameters(parameters);
-  EXPECT_EQ(initial_num, call_.GetNumCreatedSendStreams());
-}
-
-// TODO(ossu): Revisit if these tests need to be here, now that these kinds of
-// tests should be available in AudioEncoderOpusTest.
-
-// Test that if clockrate is not 48000 for opus, we fail.
-TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBadClockrate) {
-  EXPECT_TRUE(SetupSendStream());
-  cricket::AudioSendParameters parameters;
-  parameters.codecs.push_back(kOpusCodec);
-  parameters.codecs[0].bitrate = 0;
-  parameters.codecs[0].clockrate = 50000;
-  EXPECT_FALSE(channel_->SetSendParameters(parameters));
-}
-
-// Test that if channels=0 for opus, we fail.
-TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0ChannelsNoStereo) {
-  EXPECT_TRUE(SetupSendStream());
-  cricket::AudioSendParameters parameters;
-  parameters.codecs.push_back(kOpusCodec);
-  parameters.codecs[0].bitrate = 0;
-  parameters.codecs[0].channels = 0;
-  EXPECT_FALSE(channel_->SetSendParameters(parameters));
-}
-
-// Test that if channels=0 for opus, we fail.
-TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad0Channels1Stereo) {
-  EXPECT_TRUE(SetupSendStream());
-  cricket::AudioSendParameters parameters;
-  parameters.codecs.push_back(kOpusCodec);
-  parameters.codecs[0].bitrate = 0;
-  parameters.codecs[0].channels = 0;
-  parameters.codecs[0].params["stereo"] = "1";
-  EXPECT_FALSE(channel_->SetSendParameters(parameters));
-}
-
-// Test that if channel is 1 for opus and there's no stereo, we fail.
-TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpus1ChannelNoStereo) {
-  EXPECT_TRUE(SetupSendStream());
-  cricket::AudioSendParameters parameters;
-  parameters.codecs.push_back(kOpusCodec);
-  parameters.codecs[0].bitrate = 0;
-  parameters.codecs[0].channels = 1;
-  EXPECT_FALSE(channel_->SetSendParameters(parameters));
-}
-
-// Test that if channel is 1 for opus and stereo=0, we fail.
-TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel0Stereo) {
-  EXPECT_TRUE(SetupSendStream());
-  cricket::AudioSendParameters parameters;
-  parameters.codecs.push_back(kOpusCodec);
-  parameters.codecs[0].bitrate = 0;
-  parameters.codecs[0].channels = 1;
-  parameters.codecs[0].params["stereo"] = "0";
-  EXPECT_FALSE(channel_->SetSendParameters(parameters));
-}
-
-// Test that if channel is 1 for opus and stereo=1, we fail.
-TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusBad1Channel1Stereo) {
-  EXPECT_TRUE(SetupSendStream());
-  cricket::AudioSendParameters parameters;
-  parameters.codecs.push_back(kOpusCodec);
-  parameters.codecs[0].bitrate = 0;
-  parameters.codecs[0].channels = 1;
-  parameters.codecs[0].params["stereo"] = "1";
-  EXPECT_FALSE(channel_->SetSendParameters(parameters));
-}
-
-// Test that with bitrate=0 and no stereo, bitrate is 32000.
-TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0BitrateNoStereo) {
-  EXPECT_TRUE(SetupSendStream());
-  cricket::AudioSendParameters parameters;
-  parameters.codecs.push_back(kOpusCodec);
-  parameters.codecs[0].bitrate = 0;
-  SetSendParameters(parameters);
-  CheckSendCodecBitrate(kSsrcX, "opus", 32000);
-}
-
-// Test that with bitrate=0 and stereo=0, bitrate is 32000.
-TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate0Stereo) {
-  EXPECT_TRUE(SetupSendStream());
-  cricket::AudioSendParameters parameters;
-  parameters.codecs.push_back(kOpusCodec);
-  parameters.codecs[0].bitrate = 0;
-  parameters.codecs[0].params["stereo"] = "0";
-  SetSendParameters(parameters);
-  CheckSendCodecBitrate(kSsrcX, "opus", 32000);
-}
-
-// Test that with bitrate=invalid and stereo=0, bitrate is 32000.
-TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate0Stereo) {
-  EXPECT_TRUE(SetupSendStream());
-  cricket::AudioSendParameters parameters;
-  parameters.codecs.push_back(kOpusCodec);
-  parameters.codecs[0].params["stereo"] = "0";
-  // bitrate that's out of the range between 6000 and 510000 will be clamped.
-  parameters.codecs[0].bitrate = 5999;
-  SetSendParameters(parameters);
-  CheckSendCodecBitrate(kSsrcX, "opus", 6000);
-
-  parameters.codecs[0].bitrate = 510001;
-  SetSendParameters(parameters);
-  CheckSendCodecBitrate(kSsrcX, "opus", 510000);
-}
-
-// Test that with bitrate=0 and stereo=1, bitrate is 64000.
-TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGood0Bitrate1Stereo) {
-  EXPECT_TRUE(SetupSendStream());
-  cricket::AudioSendParameters parameters;
-  parameters.codecs.push_back(kOpusCodec);
-  parameters.codecs[0].bitrate = 0;
-  parameters.codecs[0].params["stereo"] = "1";
-  SetSendParameters(parameters);
-  CheckSendCodecBitrate(kSsrcX, "opus", 64000);
-}
-
-// Test that with bitrate=invalid and stereo=1, bitrate is 64000.
-TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodXBitrate1Stereo) {
-  EXPECT_TRUE(SetupSendStream());
-  cricket::AudioSendParameters parameters;
-  parameters.codecs.push_back(kOpusCodec);
-  parameters.codecs[0].params["stereo"] = "1";
-  // bitrate that's out of the range between 6000 and 510000 will be clamped.
-  parameters.codecs[0].bitrate = 5999;
-  SetSendParameters(parameters);
-  CheckSendCodecBitrate(kSsrcX, "opus", 6000);
-
-  parameters.codecs[0].bitrate = 510001;
-  SetSendParameters(parameters);
-  CheckSendCodecBitrate(kSsrcX, "opus", 510000);
-}
-
-// Test that with bitrate=N and stereo unset, bitrate is N.
-TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoStereo) {
-  EXPECT_TRUE(SetupSendStream());
-  cricket::AudioSendParameters parameters;
-  parameters.codecs.push_back(kOpusCodec);
-  parameters.codecs[0].bitrate = 96000;
-  SetSendParameters(parameters);
-  const auto& spec = *GetSendStreamConfig(kSsrcX).send_codec_spec;
-  EXPECT_EQ(111, spec.payload_type);
-  EXPECT_EQ(96000, spec.target_bitrate_bps);
-  EXPECT_EQ("opus", spec.format.name);
-  EXPECT_EQ(2, spec.format.num_channels);
-  EXPECT_EQ(48000, spec.format.clockrate_hz);
-}
-
-// Test that with bitrate=N and stereo=0, bitrate is N.
-TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate0Stereo) {
-  EXPECT_TRUE(SetupSendStream());
-  cricket::AudioSendParameters parameters;
-  parameters.codecs.push_back(kOpusCodec);
-  parameters.codecs[0].bitrate = 30000;
-  parameters.codecs[0].params["stereo"] = "0";
-  SetSendParameters(parameters);
-  CheckSendCodecBitrate(kSsrcX, "opus", 30000);
-}
-
-// Test that with bitrate=N and without any parameters, bitrate is N.
-TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrateNoParameters) {
-  EXPECT_TRUE(SetupSendStream());
-  cricket::AudioSendParameters parameters;
-  parameters.codecs.push_back(kOpusCodec);
-  parameters.codecs[0].bitrate = 30000;
-  SetSendParameters(parameters);
-  CheckSendCodecBitrate(kSsrcX, "opus", 30000);
-}
-
-// Test that with bitrate=N and stereo=1, bitrate is N.
-TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecOpusGoodNBitrate1Stereo) {
-  EXPECT_TRUE(SetupSendStream());
-  cricket::AudioSendParameters parameters;
-  parameters.codecs.push_back(kOpusCodec);
-  parameters.codecs[0].bitrate = 30000;
-  parameters.codecs[0].params["stereo"] = "1";
-  SetSendParameters(parameters);
-  CheckSendCodecBitrate(kSsrcX, "opus", 30000);
-}
-
-TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsWithBitrates) {
-  SetSendCodecsShouldWorkForBitrates("100", 100000, "150", 150000, "200",
-                                     200000);
-}
-
-TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsWithHighMaxBitrate) {
-  SetSendCodecsShouldWorkForBitrates("", 0, "", -1, "10000", 10000000);
-}
-
-TEST_F(WebRtcVoiceEngineTestFake,
-       SetSendCodecsWithoutBitratesUsesCorrectDefaults) {
-  SetSendCodecsShouldWorkForBitrates("", 0, "", -1, "", -1);
-}
-
-TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCapsMinAndStartBitrate) {
-  SetSendCodecsShouldWorkForBitrates("-1", 0, "-100", -1, "", -1);
-}
-
-TEST_F(WebRtcVoiceEngineTestFake,
-       SetMaxSendBandwidthForAudioDoesntAffectBwe) {
-  SetSendCodecsShouldWorkForBitrates("100", 100000, "150", 150000, "200",
-                                     200000);
-  send_parameters_.max_bandwidth_bps = 100000;
-  SetSendParameters(send_parameters_);
-  EXPECT_EQ(100000, call_.GetConfig().bitrate_config.min_bitrate_bps)
-      << "Setting max bitrate should keep previous min bitrate.";
-  EXPECT_EQ(-1, call_.GetConfig().bitrate_config.start_bitrate_bps)
-      << "Setting max bitrate should not reset start bitrate.";
-  EXPECT_EQ(200000, call_.GetConfig().bitrate_config.max_bitrate_bps);
-}
-
-// Test that we can enable NACK with opus as caller.
-TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCaller) {
-  EXPECT_TRUE(SetupSendStream());
-  cricket::AudioSendParameters parameters;
-  parameters.codecs.push_back(kOpusCodec);
-  parameters.codecs[0].AddFeedbackParam(
-      cricket::FeedbackParam(cricket::kRtcpFbParamNack,
-                             cricket::kParamValueEmpty));
-  EXPECT_EQ(0, GetSendStreamConfig(kSsrcX).rtp.nack.rtp_history_ms);
-  SetSendParameters(parameters);
-  EXPECT_EQ(kRtpHistoryMs, GetSendStreamConfig(kSsrcX).rtp.nack.rtp_history_ms);
-}
-
-// Test that we can enable NACK with opus as callee.
-TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackAsCallee) {
-  EXPECT_TRUE(SetupRecvStream());
-  cricket::AudioSendParameters parameters;
-  parameters.codecs.push_back(kOpusCodec);
-  parameters.codecs[0].AddFeedbackParam(
-      cricket::FeedbackParam(cricket::kRtcpFbParamNack,
-                             cricket::kParamValueEmpty));
-  EXPECT_EQ(0, GetRecvStreamConfig(kSsrcX).rtp.nack.rtp_history_ms);
-  SetSendParameters(parameters);
-  // NACK should be enabled even with no send stream.
-  EXPECT_EQ(kRtpHistoryMs, GetRecvStreamConfig(kSsrcX).rtp.nack.rtp_history_ms);
-
-  EXPECT_TRUE(channel_->AddSendStream(
-      cricket::StreamParams::CreateLegacy(kSsrcX)));
-  EXPECT_EQ(kRtpHistoryMs, GetSendStreamConfig(kSsrcX).rtp.nack.rtp_history_ms);
-}
-
-// Test that we can enable NACK on receive streams.
-TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecEnableNackRecvStreams) {
-  EXPECT_TRUE(SetupSendStream());
-  EXPECT_TRUE(AddRecvStream(kSsrcY));
-  cricket::AudioSendParameters parameters;
-  parameters.codecs.push_back(kOpusCodec);
-  parameters.codecs[0].AddFeedbackParam(
-      cricket::FeedbackParam(cricket::kRtcpFbParamNack,
-                             cricket::kParamValueEmpty));
-  EXPECT_EQ(0, GetSendStreamConfig(kSsrcX).rtp.nack.rtp_history_ms);
-  EXPECT_EQ(0, GetRecvStreamConfig(kSsrcY).rtp.nack.rtp_history_ms);
-  SetSendParameters(parameters);
-  EXPECT_EQ(kRtpHistoryMs, GetSendStreamConfig(kSsrcX).rtp.nack.rtp_history_ms);
-  EXPECT_EQ(kRtpHistoryMs, GetRecvStreamConfig(kSsrcY).rtp.nack.rtp_history_ms);
-}
-
-// Test that we can disable NACK.
-TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNack) {
-  EXPECT_TRUE(SetupSendStream());
-  cricket::AudioSendParameters parameters;
-  parameters.codecs.push_back(kOpusCodec);
-  parameters.codecs[0].AddFeedbackParam(
-      cricket::FeedbackParam(cricket::kRtcpFbParamNack,
-                             cricket::kParamValueEmpty));
-  SetSendParameters(parameters);
-  EXPECT_EQ(kRtpHistoryMs, GetSendStreamConfig(kSsrcX).rtp.nack.rtp_history_ms);
-
-  parameters.codecs.clear();
-  parameters.codecs.push_back(kOpusCodec);
-  SetSendParameters(parameters);
-  EXPECT_EQ(0, GetSendStreamConfig(kSsrcX).rtp.nack.rtp_history_ms);
-}
-
-// Test that we can disable NACK on receive streams.
-TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecDisableNackRecvStreams) {
-  EXPECT_TRUE(SetupSendStream());
-  EXPECT_TRUE(AddRecvStream(kSsrcY));
-  cricket::AudioSendParameters parameters;
-  parameters.codecs.push_back(kOpusCodec);
-  parameters.codecs[0].AddFeedbackParam(
-      cricket::FeedbackParam(cricket::kRtcpFbParamNack,
-                             cricket::kParamValueEmpty));
-  SetSendParameters(parameters);
-  EXPECT_EQ(kRtpHistoryMs, GetSendStreamConfig(kSsrcX).rtp.nack.rtp_history_ms);
-  EXPECT_EQ(kRtpHistoryMs, GetRecvStreamConfig(kSsrcY).rtp.nack.rtp_history_ms);
-
-  parameters.codecs.clear();
-  parameters.codecs.push_back(kOpusCodec);
-  SetSendParameters(parameters);
-  EXPECT_EQ(0, GetSendStreamConfig(kSsrcX).rtp.nack.rtp_history_ms);
-  EXPECT_EQ(0, GetRecvStreamConfig(kSsrcY).rtp.nack.rtp_history_ms);
-}
-
-// Test that NACK is enabled on a new receive stream.
-TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamEnableNack) {
-  EXPECT_TRUE(SetupSendStream());
-  cricket::AudioSendParameters parameters;
-  parameters.codecs.push_back(kIsacCodec);
-  parameters.codecs.push_back(kCn16000Codec);
-  parameters.codecs[0].AddFeedbackParam(
-      cricket::FeedbackParam(cricket::kRtcpFbParamNack,
-                             cricket::kParamValueEmpty));
-  SetSendParameters(parameters);
-  EXPECT_EQ(kRtpHistoryMs, GetSendStreamConfig(kSsrcX).rtp.nack.rtp_history_ms);
-
-  EXPECT_TRUE(AddRecvStream(kSsrcY));
-  EXPECT_EQ(kRtpHistoryMs, GetRecvStreamConfig(kSsrcY).rtp.nack.rtp_history_ms);
-  EXPECT_TRUE(AddRecvStream(kSsrcZ));
-  EXPECT_EQ(kRtpHistoryMs, GetRecvStreamConfig(kSsrcZ).rtp.nack.rtp_history_ms);
-}
-
-TEST_F(WebRtcVoiceEngineTestFake, TransportCcCanBeEnabledAndDisabled) {
-  EXPECT_TRUE(SetupChannel());
-  cricket::AudioSendParameters send_parameters;
-  send_parameters.codecs.push_back(kOpusCodec);
-  EXPECT_TRUE(send_parameters.codecs[0].feedback_params.params().empty());
-  SetSendParameters(send_parameters);
-
-  cricket::AudioRecvParameters recv_parameters;
-  recv_parameters.codecs.push_back(kIsacCodec);
-  EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters));
-  EXPECT_TRUE(AddRecvStream(kSsrcX));
-  ASSERT_TRUE(call_.GetAudioReceiveStream(kSsrcX) != nullptr);
-  EXPECT_FALSE(
-      call_.GetAudioReceiveStream(kSsrcX)->GetConfig().rtp.transport_cc);
-
-  send_parameters.codecs = engine_->send_codecs();
-  SetSendParameters(send_parameters);
-  ASSERT_TRUE(call_.GetAudioReceiveStream(kSsrcX) != nullptr);
-  EXPECT_TRUE(
-      call_.GetAudioReceiveStream(kSsrcX)->GetConfig().rtp.transport_cc);
-}
-
-// Test that we can switch back and forth between Opus and ISAC with CN.
-TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsIsacOpusSwitching) {
-  EXPECT_TRUE(SetupSendStream());
-
-  cricket::AudioSendParameters opus_parameters;
-  opus_parameters.codecs.push_back(kOpusCodec);
-  SetSendParameters(opus_parameters);
-  {
-    const auto& spec = *GetSendStreamConfig(kSsrcX).send_codec_spec;
-    EXPECT_EQ(111, spec.payload_type);
-    EXPECT_STRCASEEQ("opus", spec.format.name.c_str());
-  }
-
-  cricket::AudioSendParameters isac_parameters;
-  isac_parameters.codecs.push_back(kIsacCodec);
-  isac_parameters.codecs.push_back(kCn16000Codec);
-  isac_parameters.codecs.push_back(kOpusCodec);
-  SetSendParameters(isac_parameters);
-  {
-    const auto& spec = *GetSendStreamConfig(kSsrcX).send_codec_spec;
-    EXPECT_EQ(103, spec.payload_type);
-    EXPECT_STRCASEEQ("ISAC", spec.format.name.c_str());
-  }
-
-  SetSendParameters(opus_parameters);
-  {
-    const auto& spec = *GetSendStreamConfig(kSsrcX).send_codec_spec;
-    EXPECT_EQ(111, spec.payload_type);
-    EXPECT_STRCASEEQ("opus", spec.format.name.c_str());
-  }
-}
-
-// Test that we handle various ways of specifying bitrate.
-TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsBitrate) {
-  EXPECT_TRUE(SetupSendStream());
-  cricket::AudioSendParameters parameters;
-  parameters.codecs.push_back(kIsacCodec);  // bitrate == 32000
-  SetSendParameters(parameters);
-  {
-    const auto& spec = *GetSendStreamConfig(kSsrcX).send_codec_spec;
-    EXPECT_EQ(103, spec.payload_type);
-    EXPECT_STRCASEEQ("ISAC", spec.format.name.c_str());
-    EXPECT_EQ(32000, spec.target_bitrate_bps);
-  }
-
-  parameters.codecs[0].bitrate = 0;         // bitrate == default
-  SetSendParameters(parameters);
-  {
-    const auto& spec = *GetSendStreamConfig(kSsrcX).send_codec_spec;
-    EXPECT_EQ(103, spec.payload_type);
-    EXPECT_STRCASEEQ("ISAC", spec.format.name.c_str());
-    EXPECT_EQ(32000, spec.target_bitrate_bps);
-  }
-  parameters.codecs[0].bitrate = 28000;     // bitrate == 28000
-  SetSendParameters(parameters);
-  {
-    const auto& spec = *GetSendStreamConfig(kSsrcX).send_codec_spec;
-    EXPECT_EQ(103, spec.payload_type);
-    EXPECT_STRCASEEQ("ISAC", spec.format.name.c_str());
-    EXPECT_EQ(28000, spec.target_bitrate_bps);
-  }
-
-  parameters.codecs[0] = kPcmuCodec;        // bitrate == 64000
-  SetSendParameters(parameters);
-  {
-    const auto& spec = *GetSendStreamConfig(kSsrcX).send_codec_spec;
-    EXPECT_EQ(0, spec.payload_type);
-    EXPECT_STRCASEEQ("PCMU", spec.format.name.c_str());
-    EXPECT_EQ(64000, spec.target_bitrate_bps);
-  }
-
-  parameters.codecs[0].bitrate = 0;         // bitrate == default
-  SetSendParameters(parameters);
-  {
-    const auto& spec = *GetSendStreamConfig(kSsrcX).send_codec_spec;
-    EXPECT_EQ(0, spec.payload_type);
-    EXPECT_STREQ("PCMU", spec.format.name.c_str());
-    EXPECT_EQ(64000, spec.target_bitrate_bps);
-  }
-
-  parameters.codecs[0] = kOpusCodec;
-  parameters.codecs[0].bitrate = 0;         // bitrate == default
-  SetSendParameters(parameters);
-  {
-    const auto& spec = *GetSendStreamConfig(kSsrcX).send_codec_spec;
-    EXPECT_EQ(111, spec.payload_type);
-    EXPECT_STREQ("opus", spec.format.name.c_str());
-    EXPECT_EQ(32000, spec.target_bitrate_bps);
-  }
-}
-
-// Test that we fail if no codecs are specified.
-TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsNoCodecs) {
-  EXPECT_TRUE(SetupSendStream());
-  cricket::AudioSendParameters parameters;
-  EXPECT_FALSE(channel_->SetSendParameters(parameters));
-}
-
-// Test that we can set send codecs even with telephone-event codec as the first
-// one on the list.
-TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsDTMFOnTop) {
-  EXPECT_TRUE(SetupSendStream());
-  cricket::AudioSendParameters parameters;
-  parameters.codecs.push_back(kTelephoneEventCodec1);
-  parameters.codecs.push_back(kIsacCodec);
-  parameters.codecs.push_back(kPcmuCodec);
-  parameters.codecs[0].id = 98;  // DTMF
-  parameters.codecs[1].id = 96;
-  SetSendParameters(parameters);
-  const auto& spec = *GetSendStreamConfig(kSsrcX).send_codec_spec;
-  EXPECT_EQ(96, spec.payload_type);
-  EXPECT_STRCASEEQ("ISAC", spec.format.name.c_str());
-  EXPECT_TRUE(channel_->CanInsertDtmf());
-}
-
-// Test that payload type range is limited for telephone-event codec.
-TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsDTMFPayloadTypeOutOfRange) {
-  EXPECT_TRUE(SetupSendStream());
-  cricket::AudioSendParameters parameters;
-  parameters.codecs.push_back(kTelephoneEventCodec2);
-  parameters.codecs.push_back(kIsacCodec);
-  parameters.codecs[0].id = 0;  // DTMF
-  parameters.codecs[1].id = 96;
-  SetSendParameters(parameters);
-  EXPECT_TRUE(channel_->CanInsertDtmf());
-  parameters.codecs[0].id = 128;  // DTMF
-  EXPECT_FALSE(channel_->SetSendParameters(parameters));
-  EXPECT_FALSE(channel_->CanInsertDtmf());
-  parameters.codecs[0].id = 127;
-  SetSendParameters(parameters);
-  EXPECT_TRUE(channel_->CanInsertDtmf());
-  parameters.codecs[0].id = -1;  // DTMF
-  EXPECT_FALSE(channel_->SetSendParameters(parameters));
-  EXPECT_FALSE(channel_->CanInsertDtmf());
-}
-
-// Test that we can set send codecs even with CN codec as the first
-// one on the list.
-TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNOnTop) {
-  EXPECT_TRUE(SetupSendStream());
-  cricket::AudioSendParameters parameters;
-  parameters.codecs.push_back(kCn16000Codec);
-  parameters.codecs.push_back(kIsacCodec);
-  parameters.codecs.push_back(kPcmuCodec);
-  parameters.codecs[0].id = 98;  // wideband CN
-  parameters.codecs[1].id = 96;
-  SetSendParameters(parameters);
-  const auto& send_codec_spec = *GetSendStreamConfig(kSsrcX).send_codec_spec;
-  EXPECT_EQ(96, send_codec_spec.payload_type);
-  EXPECT_STRCASEEQ("ISAC", send_codec_spec.format.name.c_str());
-  EXPECT_EQ(98, send_codec_spec.cng_payload_type);
-}
-
-// Test that we set VAD and DTMF types correctly as caller.
-TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCaller) {
-  EXPECT_TRUE(SetupSendStream());
-  cricket::AudioSendParameters parameters;
-  parameters.codecs.push_back(kIsacCodec);
-  parameters.codecs.push_back(kPcmuCodec);
-  // TODO(juberti): cn 32000
-  parameters.codecs.push_back(kCn16000Codec);
-  parameters.codecs.push_back(kCn8000Codec);
-  parameters.codecs.push_back(kTelephoneEventCodec1);
-  parameters.codecs[0].id = 96;
-  parameters.codecs[2].id = 97;  // wideband CN
-  parameters.codecs[4].id = 98;  // DTMF
-  SetSendParameters(parameters);
-  const auto& send_codec_spec = *GetSendStreamConfig(kSsrcX).send_codec_spec;
-  EXPECT_EQ(96, send_codec_spec.payload_type);
-  EXPECT_STRCASEEQ("ISAC", send_codec_spec.format.name.c_str());
-  EXPECT_EQ(1, send_codec_spec.format.num_channels);
-  EXPECT_EQ(97, send_codec_spec.cng_payload_type);
-  EXPECT_TRUE(channel_->CanInsertDtmf());
-}
-
-// Test that we set VAD and DTMF types correctly as callee.
-TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNandDTMFAsCallee) {
-  EXPECT_TRUE(SetupChannel());
-  cricket::AudioSendParameters parameters;
-  parameters.codecs.push_back(kIsacCodec);
-  parameters.codecs.push_back(kPcmuCodec);
-  // TODO(juberti): cn 32000
-  parameters.codecs.push_back(kCn16000Codec);
-  parameters.codecs.push_back(kCn8000Codec);
-  parameters.codecs.push_back(kTelephoneEventCodec2);
-  parameters.codecs[0].id = 96;
-  parameters.codecs[2].id = 97;  // wideband CN
-  parameters.codecs[4].id = 98;  // DTMF
-  SetSendParameters(parameters);
-  EXPECT_TRUE(channel_->AddSendStream(
-      cricket::StreamParams::CreateLegacy(kSsrcX)));
-
-  const auto& send_codec_spec = *GetSendStreamConfig(kSsrcX).send_codec_spec;
-  EXPECT_EQ(96, send_codec_spec.payload_type);
-  EXPECT_STRCASEEQ("ISAC", send_codec_spec.format.name.c_str());
-  EXPECT_EQ(1, send_codec_spec.format.num_channels);
-  EXPECT_EQ(97, send_codec_spec.cng_payload_type);
-  EXPECT_TRUE(channel_->CanInsertDtmf());
-}
-
-// Test that we only apply VAD if we have a CN codec that matches the
-// send codec clockrate.
-TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCNNoMatch) {
-  EXPECT_TRUE(SetupSendStream());
-  cricket::AudioSendParameters parameters;
-  // Set ISAC(16K) and CN(16K). VAD should be activated.
-  parameters.codecs.push_back(kIsacCodec);
-  parameters.codecs.push_back(kCn16000Codec);
-  parameters.codecs[1].id = 97;
-  SetSendParameters(parameters);
-  {
-    const auto& send_codec_spec = *GetSendStreamConfig(kSsrcX).send_codec_spec;
-    EXPECT_STRCASEEQ("ISAC", send_codec_spec.format.name.c_str());
-    EXPECT_EQ(1, send_codec_spec.format.num_channels);
-    EXPECT_EQ(97, send_codec_spec.cng_payload_type);
-  }
-  // Set PCMU(8K) and CN(16K). VAD should not be activated.
-  parameters.codecs[0] = kPcmuCodec;
-  SetSendParameters(parameters);
-  {
-    const auto& send_codec_spec = *GetSendStreamConfig(kSsrcX).send_codec_spec;
-    EXPECT_STRCASEEQ("PCMU", send_codec_spec.format.name.c_str());
-    EXPECT_EQ(rtc::Optional<int>(), send_codec_spec.cng_payload_type);
-  }
-  // Set PCMU(8K) and CN(8K). VAD should be activated.
-  parameters.codecs[1] = kCn8000Codec;
-  SetSendParameters(parameters);
-  {
-    const auto& send_codec_spec = *GetSendStreamConfig(kSsrcX).send_codec_spec;
-    EXPECT_STRCASEEQ("PCMU", send_codec_spec.format.name.c_str());
-    EXPECT_EQ(1, send_codec_spec.format.num_channels);
-    EXPECT_EQ(13, send_codec_spec.cng_payload_type);
-  }
-  // Set ISAC(16K) and CN(8K). VAD should not be activated.
-  parameters.codecs[0] = kIsacCodec;
-  SetSendParameters(parameters);
-  {
-    const auto& send_codec_spec = *GetSendStreamConfig(kSsrcX).send_codec_spec;
-    EXPECT_STRCASEEQ("ISAC", send_codec_spec.format.name.c_str());
-    EXPECT_EQ(rtc::Optional<int>(), send_codec_spec.cng_payload_type);
-  }
-}
-
-// Test that we perform case-insensitive matching of codec names.
-TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsCaseInsensitive) {
-  EXPECT_TRUE(SetupSendStream());
-  cricket::AudioSendParameters parameters;
-  parameters.codecs.push_back(kIsacCodec);
-  parameters.codecs.push_back(kPcmuCodec);
-  parameters.codecs.push_back(kCn16000Codec);
-  parameters.codecs.push_back(kCn8000Codec);
-  parameters.codecs.push_back(kTelephoneEventCodec1);
-  parameters.codecs[0].name = "iSaC";
-  parameters.codecs[0].id = 96;
-  parameters.codecs[2].id = 97;  // wideband CN
-  parameters.codecs[4].id = 98;  // DTMF
-  SetSendParameters(parameters);
-  const auto& send_codec_spec = *GetSendStreamConfig(kSsrcX).send_codec_spec;
-  EXPECT_EQ(96, send_codec_spec.payload_type);
-  EXPECT_STRCASEEQ("ISAC", send_codec_spec.format.name.c_str());
-  EXPECT_EQ(1, send_codec_spec.format.num_channels);
-  EXPECT_EQ(97, send_codec_spec.cng_payload_type);
-  EXPECT_TRUE(channel_->CanInsertDtmf());
-}
-
-class WebRtcVoiceEngineWithSendSideBweTest : public WebRtcVoiceEngineTestFake {
- public:
-  WebRtcVoiceEngineWithSendSideBweTest()
-      : WebRtcVoiceEngineTestFake("WebRTC-Audio-SendSideBwe/Enabled/") {}
-};
-
-TEST_F(WebRtcVoiceEngineWithSendSideBweTest,
-       SupportsTransportSequenceNumberHeaderExtension) {
-  cricket::RtpCapabilities capabilities = engine_->GetCapabilities();
-  ASSERT_FALSE(capabilities.header_extensions.empty());
-  for (const webrtc::RtpExtension& extension : capabilities.header_extensions) {
-    if (extension.uri == webrtc::RtpExtension::kTransportSequenceNumberUri) {
-      EXPECT_EQ(webrtc::RtpExtension::kTransportSequenceNumberDefaultId,
-                extension.id);
-      return;
-    }
-  }
-  FAIL() << "Transport sequence number extension not in header-extension list.";
-}
-
-// Test support for audio level header extension.
-TEST_F(WebRtcVoiceEngineTestFake, SendAudioLevelHeaderExtensions) {
-  TestSetSendRtpHeaderExtensions(webrtc::RtpExtension::kAudioLevelUri);
-}
-TEST_F(WebRtcVoiceEngineTestFake, RecvAudioLevelHeaderExtensions) {
-  TestSetRecvRtpHeaderExtensions(webrtc::RtpExtension::kAudioLevelUri);
-}
-
-// Test support for transport sequence number header extension.
-TEST_F(WebRtcVoiceEngineTestFake, SendTransportSequenceNumberHeaderExtensions) {
-  TestSetSendRtpHeaderExtensions(
-      webrtc::RtpExtension::kTransportSequenceNumberUri);
-}
-TEST_F(WebRtcVoiceEngineTestFake, RecvTransportSequenceNumberHeaderExtensions) {
-  TestSetRecvRtpHeaderExtensions(
-      webrtc::RtpExtension::kTransportSequenceNumberUri);
-}
-
-// Test that we can create a channel and start sending on it.
-TEST_F(WebRtcVoiceEngineTestFake, Send) {
-  EXPECT_TRUE(SetupSendStream());
-  SetSendParameters(send_parameters_);
-  SetSend(true);
-  EXPECT_TRUE(GetSendStream(kSsrcX).IsSending());
-  SetSend(false);
-  EXPECT_FALSE(GetSendStream(kSsrcX).IsSending());
-}
-
-// Test that a channel will send if and only if it has a source and is enabled
-// for sending.
-TEST_F(WebRtcVoiceEngineTestFake, SendStateWithAndWithoutSource) {
-  EXPECT_TRUE(SetupSendStream());
-  SetSendParameters(send_parameters_);
-  SetAudioSend(kSsrcX, true, nullptr);
-  SetSend(true);
-  EXPECT_FALSE(GetSendStream(kSsrcX).IsSending());
-  SetAudioSend(kSsrcX, true, &fake_source_);
-  EXPECT_TRUE(GetSendStream(kSsrcX).IsSending());
-  SetAudioSend(kSsrcX, true, nullptr);
-  EXPECT_FALSE(GetSendStream(kSsrcX).IsSending());
-}
-
-// Test that a channel is muted/unmuted.
-TEST_F(WebRtcVoiceEngineTestFake, SendStateMuteUnmute) {
-  EXPECT_TRUE(SetupSendStream());
-  SetSendParameters(send_parameters_);
-  EXPECT_FALSE(GetSendStream(kSsrcX).muted());
-  SetAudioSend(kSsrcX, true, nullptr);
-  EXPECT_FALSE(GetSendStream(kSsrcX).muted());
-  SetAudioSend(kSsrcX, false, nullptr);
-  EXPECT_TRUE(GetSendStream(kSsrcX).muted());
-}
-
-// Test that SetSendParameters() does not alter a stream's send state.
-TEST_F(WebRtcVoiceEngineTestFake, SendStateWhenStreamsAreRecreated) {
-  EXPECT_TRUE(SetupSendStream());
-  EXPECT_FALSE(GetSendStream(kSsrcX).IsSending());
-
-  // Turn on sending.
-  SetSend(true);
-  EXPECT_TRUE(GetSendStream(kSsrcX).IsSending());
-
-  // Changing RTP header extensions will recreate the AudioSendStream.
-  send_parameters_.extensions.push_back(
-      webrtc::RtpExtension(webrtc::RtpExtension::kAudioLevelUri, 12));
-  SetSendParameters(send_parameters_);
-  EXPECT_TRUE(GetSendStream(kSsrcX).IsSending());
-
-  // Turn off sending.
-  SetSend(false);
-  EXPECT_FALSE(GetSendStream(kSsrcX).IsSending());
-
-  // Changing RTP header extensions will recreate the AudioSendStream.
-  send_parameters_.extensions.clear();
-  SetSendParameters(send_parameters_);
-  EXPECT_FALSE(GetSendStream(kSsrcX).IsSending());
-}
-
-// Test that we can create a channel and start playing out on it.
-TEST_F(WebRtcVoiceEngineTestFake, Playout) {
-  EXPECT_TRUE(SetupRecvStream());
-  EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
-  channel_->SetPlayout(true);
-  EXPECT_TRUE(GetRecvStream(kSsrcX).started());
-  channel_->SetPlayout(false);
-  EXPECT_FALSE(GetRecvStream(kSsrcX).started());
-}
-
-// Test that we can add and remove send streams.
-TEST_F(WebRtcVoiceEngineTestFake, CreateAndDeleteMultipleSendStreams) {
-  SetupForMultiSendStream();
-
-  // Set the global state for sending.
-  SetSend(true);
-
-  for (uint32_t ssrc : kSsrcs4) {
-    EXPECT_TRUE(channel_->AddSendStream(
-        cricket::StreamParams::CreateLegacy(ssrc)));
-    SetAudioSend(ssrc, true, &fake_source_);
-    // Verify that we are in a sending state for all the created streams.
-    EXPECT_TRUE(GetSendStream(ssrc).IsSending());
-  }
-  EXPECT_EQ(arraysize(kSsrcs4), call_.GetAudioSendStreams().size());
-
-  // Delete the send streams.
-  for (uint32_t ssrc : kSsrcs4) {
-    EXPECT_TRUE(channel_->RemoveSendStream(ssrc));
-    EXPECT_FALSE(call_.GetAudioSendStream(ssrc));
-    EXPECT_FALSE(channel_->RemoveSendStream(ssrc));
-  }
-  EXPECT_EQ(0u, call_.GetAudioSendStreams().size());
-}
-
-// Test SetSendCodecs correctly configure the codecs in all send streams.
-TEST_F(WebRtcVoiceEngineTestFake, SetSendCodecsWithMultipleSendStreams) {
-  SetupForMultiSendStream();
-
-  // Create send streams.
-  for (uint32_t ssrc : kSsrcs4) {
-    EXPECT_TRUE(channel_->AddSendStream(
-        cricket::StreamParams::CreateLegacy(ssrc)));
-  }
-
-  cricket::AudioSendParameters parameters;
-  // Set ISAC(16K) and CN(16K). VAD should be activated.
-  parameters.codecs.push_back(kIsacCodec);
-  parameters.codecs.push_back(kCn16000Codec);
-  parameters.codecs[1].id = 97;
-  SetSendParameters(parameters);
-
-  // Verify ISAC and VAD are corrected configured on all send channels.
-  for (uint32_t ssrc : kSsrcs4) {
-    ASSERT_TRUE(call_.GetAudioSendStream(ssrc) != nullptr);
-    const auto& send_codec_spec =
-        *call_.GetAudioSendStream(ssrc)->GetConfig().send_codec_spec;
-    EXPECT_STRCASEEQ("ISAC", send_codec_spec.format.name.c_str());
-    EXPECT_EQ(1, send_codec_spec.format.num_channels);
-    EXPECT_EQ(97, send_codec_spec.cng_payload_type);
-  }
-
-  // Change to PCMU(8K) and CN(16K).
-  parameters.codecs[0] = kPcmuCodec;
-  SetSendParameters(parameters);
-  for (uint32_t ssrc : kSsrcs4) {
-    ASSERT_TRUE(call_.GetAudioSendStream(ssrc) != nullptr);
-    const auto& send_codec_spec =
-        *call_.GetAudioSendStream(ssrc)->GetConfig().send_codec_spec;
-    EXPECT_STRCASEEQ("PCMU", send_codec_spec.format.name.c_str());
-    EXPECT_EQ(rtc::Optional<int>(), send_codec_spec.cng_payload_type);
-  }
-}
-
-// Test we can SetSend on all send streams correctly.
-TEST_F(WebRtcVoiceEngineTestFake, SetSendWithMultipleSendStreams) {
-  SetupForMultiSendStream();
-
-  // Create the send channels and they should be a "not sending" date.
-  for (uint32_t ssrc : kSsrcs4) {
-    EXPECT_TRUE(channel_->AddSendStream(
-        cricket::StreamParams::CreateLegacy(ssrc)));
-    SetAudioSend(ssrc, true, &fake_source_);
-    EXPECT_FALSE(GetSendStream(ssrc).IsSending());
-  }
-
-  // Set the global state for starting sending.
-  SetSend(true);
-  for (uint32_t ssrc : kSsrcs4) {
-    // Verify that we are in a sending state for all the send streams.
-    EXPECT_TRUE(GetSendStream(ssrc).IsSending());
-  }
-
-  // Set the global state for stopping sending.
-  SetSend(false);
-  for (uint32_t ssrc : kSsrcs4) {
-    // Verify that we are in a stop state for all the send streams.
-    EXPECT_FALSE(GetSendStream(ssrc).IsSending());
-  }
-}
-
-// Test we can set the correct statistics on all send streams.
-TEST_F(WebRtcVoiceEngineTestFake, GetStatsWithMultipleSendStreams) {
-  SetupForMultiSendStream();
-
-  // Create send streams.
-  for (uint32_t ssrc : kSsrcs4) {
-    EXPECT_TRUE(channel_->AddSendStream(
-        cricket::StreamParams::CreateLegacy(ssrc)));
-  }
-
-  // Create a receive stream to check that none of the send streams end up in
-  // the receive stream stats.
-  EXPECT_TRUE(AddRecvStream(kSsrcY));
-
-  // We need send codec to be set to get all stats.
-  SetSendParameters(send_parameters_);
-  EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
-  SetAudioSendStreamStats();
-
-  // Check stats for the added streams.
-  {
-    cricket::VoiceMediaInfo info;
-    EXPECT_EQ(true, channel_->GetStats(&info));
-
-    // We have added 4 send streams. We should see empty stats for all.
-    EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
-    for (const auto& sender : info.senders) {
-      VerifyVoiceSenderInfo(sender, false);
-    }
-    VerifyVoiceSendRecvCodecs(info);
-
-    // We have added one receive stream. We should see empty stats.
-    EXPECT_EQ(info.receivers.size(), 1u);
-    EXPECT_EQ(info.receivers[0].ssrc(), 0);
-  }
-
-  // Remove the kSsrcY stream. No receiver stats.
-  {
-    cricket::VoiceMediaInfo info;
-    EXPECT_TRUE(channel_->RemoveRecvStream(kSsrcY));
-    EXPECT_EQ(true, channel_->GetStats(&info));
-    EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
-    EXPECT_EQ(0u, info.receivers.size());
-  }
-
-  // Deliver a new packet - a default receive stream should be created and we
-  // should see stats again.
-  {
-    cricket::VoiceMediaInfo info;
-    DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
-    SetAudioReceiveStreamStats();
-    EXPECT_EQ(true, channel_->GetStats(&info));
-    EXPECT_EQ(static_cast<size_t>(arraysize(kSsrcs4)), info.senders.size());
-    EXPECT_EQ(1u, info.receivers.size());
-    VerifyVoiceReceiverInfo(info.receivers[0]);
-    VerifyVoiceSendRecvCodecs(info);
-  }
-}
-
-// Test that we can add and remove receive streams, and do proper send/playout.
-// We can receive on multiple streams while sending one stream.
-TEST_F(WebRtcVoiceEngineTestFake, PlayoutWithMultipleStreams) {
-  EXPECT_TRUE(SetupSendStream());
-
-  // Start playout without a receive stream.
-  SetSendParameters(send_parameters_);
-  channel_->SetPlayout(true);
-
-  // Adding another stream should enable playout on the new stream only.
-  EXPECT_TRUE(AddRecvStream(kSsrcY));
-  SetSend(true);
-  EXPECT_TRUE(GetSendStream(kSsrcX).IsSending());
-
-  // Make sure only the new stream is played out.
-  EXPECT_TRUE(GetRecvStream(kSsrcY).started());
-
-  // Adding yet another stream should have stream 2 and 3 enabled for playout.
-  EXPECT_TRUE(AddRecvStream(kSsrcZ));
-  EXPECT_TRUE(GetRecvStream(kSsrcY).started());
-  EXPECT_TRUE(GetRecvStream(kSsrcZ).started());
-
-  // Stop sending.
-  SetSend(false);
-  EXPECT_FALSE(GetSendStream(kSsrcX).IsSending());
-
-  // Stop playout.
-  channel_->SetPlayout(false);
-  EXPECT_FALSE(GetRecvStream(kSsrcY).started());
-  EXPECT_FALSE(GetRecvStream(kSsrcZ).started());
-
-  // Restart playout and make sure recv streams are played out.
-  channel_->SetPlayout(true);
-  EXPECT_TRUE(GetRecvStream(kSsrcY).started());
-  EXPECT_TRUE(GetRecvStream(kSsrcZ).started());
-
-  // Now remove the recv streams.
-  EXPECT_TRUE(channel_->RemoveRecvStream(kSsrcZ));
-  EXPECT_TRUE(channel_->RemoveRecvStream(kSsrcY));
-}
-
-// Test that we can create a channel configured for Codian bridges,
-// and start sending on it.
-TEST_F(WebRtcVoiceEngineTestFake, CodianSend) {
-  EXPECT_TRUE(SetupSendStream());
-  send_parameters_.options.adjust_agc_delta = rtc::Optional<int>(-10);
-  EXPECT_CALL(apm_gc_,
-              set_target_level_dbfs(11)).Times(2).WillRepeatedly(Return(0));
-  SetSendParameters(send_parameters_);
-  SetSend(true);
-  EXPECT_TRUE(GetSendStream(kSsrcX).IsSending());
-  SetSend(false);
-  EXPECT_FALSE(GetSendStream(kSsrcX).IsSending());
-}
-
-TEST_F(WebRtcVoiceEngineTestFake, TxAgcConfigViaOptions) {
-  EXPECT_TRUE(SetupSendStream());
-  EXPECT_CALL(adm_,
-              BuiltInAGCIsAvailable()).Times(2).WillRepeatedly(Return(false));
-  EXPECT_CALL(adm_, SetAGC(true)).Times(2).WillRepeatedly(Return(0));
-  EXPECT_CALL(apm_gc_, Enable(true)).Times(2).WillOnce(Return(0));
-  send_parameters_.options.tx_agc_target_dbov = rtc::Optional<uint16_t>(3);
-  send_parameters_.options.tx_agc_digital_compression_gain =
-      rtc::Optional<uint16_t>(9);
-  send_parameters_.options.tx_agc_limiter = rtc::Optional<bool>(true);
-  send_parameters_.options.auto_gain_control = rtc::Optional<bool>(true);
-  EXPECT_CALL(apm_gc_, set_target_level_dbfs(3)).WillOnce(Return(0));
-  EXPECT_CALL(apm_gc_, set_compression_gain_db(9)).WillRepeatedly(Return(0));
-  EXPECT_CALL(apm_gc_, enable_limiter(true)).WillRepeatedly(Return(0));
-  SetSendParameters(send_parameters_);
-
-  // Check interaction with adjust_agc_delta. Both should be respected, for
-  // backwards compatibility.
-  send_parameters_.options.adjust_agc_delta = rtc::Optional<int>(-10);
-  EXPECT_CALL(apm_gc_, set_target_level_dbfs(13)).WillOnce(Return(0));
-  SetSendParameters(send_parameters_);
-}
-
-TEST_F(WebRtcVoiceEngineTestFake, SampleRatesViaOptions) {
-  EXPECT_TRUE(SetupSendStream());
-  EXPECT_CALL(adm_, SetRecordingSampleRate(48000)).WillOnce(Return(0));
-  EXPECT_CALL(adm_, SetPlayoutSampleRate(44100)).WillOnce(Return(0));
-  send_parameters_.options.recording_sample_rate =
-      rtc::Optional<uint32_t>(48000);
-  send_parameters_.options.playout_sample_rate = rtc::Optional<uint32_t>(44100);
-  SetSendParameters(send_parameters_);
-}
-
-TEST_F(WebRtcVoiceEngineTestFake, SetAudioNetworkAdaptorViaOptions) {
-  EXPECT_TRUE(SetupSendStream());
-  send_parameters_.options.audio_network_adaptor = rtc::Optional<bool>(true);
-  send_parameters_.options.audio_network_adaptor_config =
-      rtc::Optional<std::string>("1234");
-  SetSendParameters(send_parameters_);
-  EXPECT_EQ(send_parameters_.options.audio_network_adaptor_config,
-            GetAudioNetworkAdaptorConfig(kSsrcX));
-}
-
-TEST_F(WebRtcVoiceEngineTestFake, AudioSendResetAudioNetworkAdaptor) {
-  EXPECT_TRUE(SetupSendStream());
-  send_parameters_.options.audio_network_adaptor = rtc::Optional<bool>(true);
-  send_parameters_.options.audio_network_adaptor_config =
-      rtc::Optional<std::string>("1234");
-  SetSendParameters(send_parameters_);
-  EXPECT_EQ(send_parameters_.options.audio_network_adaptor_config,
-            GetAudioNetworkAdaptorConfig(kSsrcX));
-  cricket::AudioOptions options;
-  options.audio_network_adaptor = rtc::Optional<bool>(false);
-  SetAudioSend(kSsrcX, true, nullptr, &options);
-  EXPECT_EQ(rtc::Optional<std::string>(), GetAudioNetworkAdaptorConfig(kSsrcX));
-}
-
-TEST_F(WebRtcVoiceEngineTestFake, AudioNetworkAdaptorNotGetOverridden) {
-  EXPECT_TRUE(SetupSendStream());
-  send_parameters_.options.audio_network_adaptor = rtc::Optional<bool>(true);
-  send_parameters_.options.audio_network_adaptor_config =
-      rtc::Optional<std::string>("1234");
-  SetSendParameters(send_parameters_);
-  EXPECT_EQ(send_parameters_.options.audio_network_adaptor_config,
-            GetAudioNetworkAdaptorConfig(kSsrcX));
-  const int initial_num = call_.GetNumCreatedSendStreams();
-  cricket::AudioOptions options;
-  options.audio_network_adaptor = rtc::Optional<bool>();
-  // Unvalued |options.audio_network_adaptor|.should not reset audio network
-  // adaptor.
-  SetAudioSend(kSsrcX, true, nullptr, &options);
-  // AudioSendStream not expected to be recreated.
-  EXPECT_EQ(initial_num, call_.GetNumCreatedSendStreams());
-  EXPECT_EQ(send_parameters_.options.audio_network_adaptor_config,
-            GetAudioNetworkAdaptorConfig(kSsrcX));
-}
-
-class WebRtcVoiceEngineWithSendSideBweWithOverheadTest
-    : public WebRtcVoiceEngineTestFake {
- public:
-  WebRtcVoiceEngineWithSendSideBweWithOverheadTest()
-      : WebRtcVoiceEngineTestFake(
-            "WebRTC-Audio-SendSideBwe/Enabled/WebRTC-SendSideBwe-WithOverhead/"
-            "Enabled/") {}
-};
-
-TEST_F(WebRtcVoiceEngineWithSendSideBweWithOverheadTest, MinAndMaxBitrate) {
-  EXPECT_TRUE(SetupSendStream());
-  cricket::AudioSendParameters parameters;
-  parameters.codecs.push_back(kOpusCodec);
-  SetSendParameters(parameters);
-  const int initial_num = call_.GetNumCreatedSendStreams();
-  EXPECT_EQ(initial_num, call_.GetNumCreatedSendStreams());
-
-  // OverheadPerPacket = Ipv4(20B) + UDP(8B) + SRTP(10B) + RTP(12)
-  constexpr int kOverheadPerPacket = 20 + 8 + 10 + 12;
-  constexpr int kOpusMaxPtimeMs = WEBRTC_OPUS_SUPPORT_120MS_PTIME ? 120 : 60;
-  constexpr int kMinOverheadBps =
-      kOverheadPerPacket * 8 * 1000 / kOpusMaxPtimeMs;
-
-  constexpr int kOpusMinBitrateBps = 6000;
-  EXPECT_EQ(kOpusMinBitrateBps + kMinOverheadBps,
-            GetSendStreamConfig(kSsrcX).min_bitrate_bps);
-  constexpr int kOpusBitrateFbBps = 32000;
-  EXPECT_EQ(kOpusBitrateFbBps + kMinOverheadBps,
-            GetSendStreamConfig(kSsrcX).max_bitrate_bps);
-
-  parameters.options.audio_network_adaptor = rtc::Optional<bool>(true);
-  parameters.options.audio_network_adaptor_config =
-      rtc::Optional<std::string>("1234");
-  SetSendParameters(parameters);
-
-  constexpr int kMinOverheadWithAnaBps =
-      kOverheadPerPacket * 8 * 1000 / kOpusMaxPtimeMs;
-
-  EXPECT_EQ(kOpusMinBitrateBps + kMinOverheadWithAnaBps,
-            GetSendStreamConfig(kSsrcX).min_bitrate_bps);
-
-  EXPECT_EQ(kOpusBitrateFbBps + kMinOverheadWithAnaBps,
-            GetSendStreamConfig(kSsrcX).max_bitrate_bps);
-}
-
-// This test is similar to
-// WebRtcVoiceEngineTestFake.SetRtpSendParameterUpdatesMaxBitrate but with an
-// additional field trial.
-TEST_F(WebRtcVoiceEngineWithSendSideBweWithOverheadTest,
-       SetRtpSendParameterUpdatesMaxBitrate) {
-  EXPECT_TRUE(SetupSendStream());
-  cricket::AudioSendParameters send_parameters;
-  send_parameters.codecs.push_back(kOpusCodec);
-  SetSendParameters(send_parameters);
-
-  webrtc::RtpParameters rtp_parameters = channel_->GetRtpSendParameters(kSsrcX);
-  // Expect empty on parameters.encodings[0].max_bitrate_bps;
-  EXPECT_FALSE(rtp_parameters.encodings[0].max_bitrate_bps);
-
-  constexpr int kMaxBitrateBps = 6000;
-  rtp_parameters.encodings[0].max_bitrate_bps =
-      rtc::Optional<int>(kMaxBitrateBps);
-  EXPECT_TRUE(channel_->SetRtpSendParameters(kSsrcX, rtp_parameters));
-
-  const int max_bitrate = GetSendStreamConfig(kSsrcX).max_bitrate_bps;
-#if WEBRTC_OPUS_SUPPORT_120MS_PTIME
-  constexpr int kMinOverhead = 3333;
-#else
-  constexpr int kMinOverhead = 6666;
-#endif
-  EXPECT_EQ(max_bitrate, kMaxBitrateBps + kMinOverhead);
-}
-
-// Test that we can set the outgoing SSRC properly.
-// SSRC is set in SetupSendStream() by calling AddSendStream.
-TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrc) {
-  EXPECT_TRUE(SetupSendStream());
-  EXPECT_TRUE(call_.GetAudioSendStream(kSsrcX));
-}
-
-TEST_F(WebRtcVoiceEngineTestFake, GetStats) {
-  // Setup. We need send codec to be set to get all stats.
-  EXPECT_TRUE(SetupSendStream());
-  // SetupSendStream adds a send stream with kSsrcX, so the receive
-  // stream has to use a different SSRC.
-  EXPECT_TRUE(AddRecvStream(kSsrcY));
-  SetSendParameters(send_parameters_);
-  EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
-  SetAudioSendStreamStats();
-
-  // Check stats for the added streams.
-  {
-    cricket::VoiceMediaInfo info;
-    EXPECT_EQ(true, channel_->GetStats(&info));
-
-    // We have added one send stream. We should see the stats we've set.
-    EXPECT_EQ(1u, info.senders.size());
-    VerifyVoiceSenderInfo(info.senders[0], false);
-    // We have added one receive stream. We should see empty stats.
-    EXPECT_EQ(info.receivers.size(), 1u);
-    EXPECT_EQ(info.receivers[0].ssrc(), 0);
-  }
-
-  // Start sending - this affects some reported stats.
-  {
-    cricket::VoiceMediaInfo info;
-    SetSend(true);
-    EXPECT_EQ(true, channel_->GetStats(&info));
-    VerifyVoiceSenderInfo(info.senders[0], true);
-    VerifyVoiceSendRecvCodecs(info);
-  }
-
-  // Remove the kSsrcY stream. No receiver stats.
-  {
-    cricket::VoiceMediaInfo info;
-    EXPECT_TRUE(channel_->RemoveRecvStream(kSsrcY));
-    EXPECT_EQ(true, channel_->GetStats(&info));
-    EXPECT_EQ(1u, info.senders.size());
-    EXPECT_EQ(0u, info.receivers.size());
-  }
-
-  // Deliver a new packet - a default receive stream should be created and we
-  // should see stats again.
-  {
-    cricket::VoiceMediaInfo info;
-    DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
-    SetAudioReceiveStreamStats();
-    EXPECT_EQ(true, channel_->GetStats(&info));
-    EXPECT_EQ(1u, info.senders.size());
-    EXPECT_EQ(1u, info.receivers.size());
-    VerifyVoiceReceiverInfo(info.receivers[0]);
-    VerifyVoiceSendRecvCodecs(info);
-  }
-}
-
-// Test that we can set the outgoing SSRC properly with multiple streams.
-// SSRC is set in SetupSendStream() by calling AddSendStream.
-TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcWithMultipleStreams) {
-  EXPECT_TRUE(SetupSendStream());
-  EXPECT_TRUE(call_.GetAudioSendStream(kSsrcX));
-  EXPECT_TRUE(AddRecvStream(kSsrcY));
-  EXPECT_EQ(kSsrcX, GetRecvStreamConfig(kSsrcY).rtp.local_ssrc);
-}
-
-// Test that the local SSRC is the same on sending and receiving channels if the
-// receive channel is created before the send channel.
-TEST_F(WebRtcVoiceEngineTestFake, SetSendSsrcAfterCreatingReceiveChannel) {
-  EXPECT_TRUE(SetupChannel());
-  EXPECT_TRUE(AddRecvStream(kSsrcY));
-  EXPECT_TRUE(channel_->AddSendStream(
-      cricket::StreamParams::CreateLegacy(kSsrcX)));
-  EXPECT_TRUE(call_.GetAudioSendStream(kSsrcX));
-  EXPECT_EQ(kSsrcX, GetRecvStreamConfig(kSsrcY).rtp.local_ssrc);
-}
-
-// Test that we can properly receive packets.
-TEST_F(WebRtcVoiceEngineTestFake, Recv) {
-  EXPECT_TRUE(SetupChannel());
-  EXPECT_TRUE(AddRecvStream(1));
-  DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
-
-  EXPECT_TRUE(GetRecvStream(1).VerifyLastPacket(kPcmuFrame,
-                                                sizeof(kPcmuFrame)));
-}
-
-// Test that we can properly receive packets on multiple streams.
-TEST_F(WebRtcVoiceEngineTestFake, RecvWithMultipleStreams) {
-  EXPECT_TRUE(SetupChannel());
-  const uint32_t ssrc1 = 1;
-  const uint32_t ssrc2 = 2;
-  const uint32_t ssrc3 = 3;
-  EXPECT_TRUE(AddRecvStream(ssrc1));
-  EXPECT_TRUE(AddRecvStream(ssrc2));
-  EXPECT_TRUE(AddRecvStream(ssrc3));
-  // Create packets with the right SSRCs.
-  unsigned char packets[4][sizeof(kPcmuFrame)];
-  for (size_t i = 0; i < arraysize(packets); ++i) {
-    memcpy(packets[i], kPcmuFrame, sizeof(kPcmuFrame));
-    rtc::SetBE32(packets[i] + 8, static_cast<uint32_t>(i));
-  }
-
-  const cricket::FakeAudioReceiveStream& s1 = GetRecvStream(ssrc1);
-  const cricket::FakeAudioReceiveStream& s2 = GetRecvStream(ssrc2);
-  const cricket::FakeAudioReceiveStream& s3 = GetRecvStream(ssrc3);
-
-  EXPECT_EQ(s1.received_packets(), 0);
-  EXPECT_EQ(s2.received_packets(), 0);
-  EXPECT_EQ(s3.received_packets(), 0);
-
-  DeliverPacket(packets[0], sizeof(packets[0]));
-  EXPECT_EQ(s1.received_packets(), 0);
-  EXPECT_EQ(s2.received_packets(), 0);
-  EXPECT_EQ(s3.received_packets(), 0);
-
-  DeliverPacket(packets[1], sizeof(packets[1]));
-  EXPECT_EQ(s1.received_packets(), 1);
-  EXPECT_TRUE(s1.VerifyLastPacket(packets[1], sizeof(packets[1])));
-  EXPECT_EQ(s2.received_packets(), 0);
-  EXPECT_EQ(s3.received_packets(), 0);
-
-  DeliverPacket(packets[2], sizeof(packets[2]));
-  EXPECT_EQ(s1.received_packets(), 1);
-  EXPECT_EQ(s2.received_packets(), 1);
-  EXPECT_TRUE(s2.VerifyLastPacket(packets[2], sizeof(packets[2])));
-  EXPECT_EQ(s3.received_packets(), 0);
-
-  DeliverPacket(packets[3], sizeof(packets[3]));
-  EXPECT_EQ(s1.received_packets(), 1);
-  EXPECT_EQ(s2.received_packets(), 1);
-  EXPECT_EQ(s3.received_packets(), 1);
-  EXPECT_TRUE(s3.VerifyLastPacket(packets[3], sizeof(packets[3])));
-
-  EXPECT_TRUE(channel_->RemoveRecvStream(ssrc3));
-  EXPECT_TRUE(channel_->RemoveRecvStream(ssrc2));
-  EXPECT_TRUE(channel_->RemoveRecvStream(ssrc1));
-}
-
-// Test that receiving on an unsignaled stream works (a stream is created).
-TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignaled) {
-  EXPECT_TRUE(SetupChannel());
-  EXPECT_EQ(0, call_.GetAudioReceiveStreams().size());
-
-  DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
-
-  EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
-  EXPECT_TRUE(GetRecvStream(kSsrc1).VerifyLastPacket(kPcmuFrame,
-                                                     sizeof(kPcmuFrame)));
-}
-
-// Test that receiving N unsignaled stream works (streams will be created), and
-// that packets are forwarded to them all.
-TEST_F(WebRtcVoiceEngineTestFake, RecvMultipleUnsignaled) {
-  EXPECT_TRUE(SetupChannel());
-  unsigned char packet[sizeof(kPcmuFrame)];
-  memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame));
-
-  // Note that SSRC = 0 is not supported.
-  for (uint32_t ssrc = 1; ssrc < (1 + kMaxUnsignaledRecvStreams); ++ssrc) {
-    rtc::SetBE32(&packet[8], ssrc);
-    DeliverPacket(packet, sizeof(packet));
-
-    // Verify we have one new stream for each loop iteration.
-    EXPECT_EQ(ssrc, call_.GetAudioReceiveStreams().size());
-    EXPECT_EQ(1, GetRecvStream(ssrc).received_packets());
-    EXPECT_TRUE(GetRecvStream(ssrc).VerifyLastPacket(packet, sizeof(packet)));
-  }
-
-  // Sending on the same SSRCs again should not create new streams.
-  for (uint32_t ssrc = 1; ssrc < (1 + kMaxUnsignaledRecvStreams); ++ssrc) {
-    rtc::SetBE32(&packet[8], ssrc);
-    DeliverPacket(packet, sizeof(packet));
-
-    EXPECT_EQ(kMaxUnsignaledRecvStreams, call_.GetAudioReceiveStreams().size());
-    EXPECT_EQ(2, GetRecvStream(ssrc).received_packets());
-    EXPECT_TRUE(GetRecvStream(ssrc).VerifyLastPacket(packet, sizeof(packet)));
-  }
-
-  // Send on another SSRC, the oldest unsignaled stream (SSRC=1) is replaced.
-  constexpr uint32_t kAnotherSsrc = 667;
-  rtc::SetBE32(&packet[8], kAnotherSsrc);
-  DeliverPacket(packet, sizeof(packet));
-
-  const auto& streams = call_.GetAudioReceiveStreams();
-  EXPECT_EQ(kMaxUnsignaledRecvStreams, streams.size());
-  size_t i = 0;
-  for (uint32_t ssrc = 2; ssrc < (1 + kMaxUnsignaledRecvStreams); ++ssrc, ++i) {
-    EXPECT_EQ(ssrc, streams[i]->GetConfig().rtp.remote_ssrc);
-    EXPECT_EQ(2, streams[i]->received_packets());
-  }
-  EXPECT_EQ(kAnotherSsrc, streams[i]->GetConfig().rtp.remote_ssrc);
-  EXPECT_EQ(1, streams[i]->received_packets());
-  // Sanity check that we've checked all streams.
-  EXPECT_EQ(kMaxUnsignaledRecvStreams, (i + 1));
-}
-
-// Test that a default channel is created even after a signaled stream has been
-// added, and that this stream will get any packets for unknown SSRCs.
-TEST_F(WebRtcVoiceEngineTestFake, RecvUnsignaledAfterSignaled) {
-  EXPECT_TRUE(SetupChannel());
-  unsigned char packet[sizeof(kPcmuFrame)];
-  memcpy(packet, kPcmuFrame, sizeof(kPcmuFrame));
-
-  // Add a known stream, send packet and verify we got it.
-  const uint32_t signaled_ssrc = 1;
-  rtc::SetBE32(&packet[8], signaled_ssrc);
-  EXPECT_TRUE(AddRecvStream(signaled_ssrc));
-  DeliverPacket(packet, sizeof(packet));
-  EXPECT_TRUE(GetRecvStream(signaled_ssrc).VerifyLastPacket(
-      packet, sizeof(packet)));
-  EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
-
-  // Note that the first unknown SSRC cannot be 0, because we only support
-  // creating receive streams for SSRC!=0.
-  const uint32_t unsignaled_ssrc = 7011;
-  rtc::SetBE32(&packet[8], unsignaled_ssrc);
-  DeliverPacket(packet, sizeof(packet));
-  EXPECT_TRUE(GetRecvStream(unsignaled_ssrc).VerifyLastPacket(
-      packet, sizeof(packet)));
-  EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
-
-  DeliverPacket(packet, sizeof(packet));
-  EXPECT_EQ(2, GetRecvStream(unsignaled_ssrc).received_packets());
-
-  rtc::SetBE32(&packet[8], signaled_ssrc);
-  DeliverPacket(packet, sizeof(packet));
-  EXPECT_EQ(2, GetRecvStream(signaled_ssrc).received_packets());
-  EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
-}
-
-// Two tests to verify that adding a receive stream with the same SSRC as a
-// previously added unsignaled stream will only recreate underlying stream
-// objects if the stream parameters have changed.
-TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamAfterUnsignaled_NoRecreate) {
-  EXPECT_TRUE(SetupChannel());
-
-  // Spawn unsignaled stream with SSRC=1.
-  DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
-  EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
-  EXPECT_TRUE(GetRecvStream(1).VerifyLastPacket(kPcmuFrame,
-                                                sizeof(kPcmuFrame)));
-
-  // Verify that the underlying stream object in Call is not recreated when a
-  // stream with SSRC=1 is added.
-  const auto& streams = call_.GetAudioReceiveStreams();
-  EXPECT_EQ(1, streams.size());
-  int audio_receive_stream_id = streams.front()->id();
-  EXPECT_TRUE(AddRecvStream(1));
-  EXPECT_EQ(1, streams.size());
-  EXPECT_EQ(audio_receive_stream_id, streams.front()->id());
-}
-
-TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamAfterUnsignaled_Recreate) {
-  EXPECT_TRUE(SetupChannel());
-
-  // Spawn unsignaled stream with SSRC=1.
-  DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
-  EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
-  EXPECT_TRUE(GetRecvStream(1).VerifyLastPacket(kPcmuFrame,
-                                                sizeof(kPcmuFrame)));
-
-  // Verify that the underlying stream object in Call *is* recreated when a
-  // stream with SSRC=1 is added, and which has changed stream parameters.
-  const auto& streams = call_.GetAudioReceiveStreams();
-  EXPECT_EQ(1, streams.size());
-  int audio_receive_stream_id = streams.front()->id();
-  cricket::StreamParams stream_params;
-  stream_params.ssrcs.push_back(1);
-  stream_params.sync_label = "sync_label";
-  EXPECT_TRUE(channel_->AddRecvStream(stream_params));
-  EXPECT_EQ(1, streams.size());
-  EXPECT_NE(audio_receive_stream_id, streams.front()->id());
-}
-
-// Test that we properly handle failures to add a receive stream.
-TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamFail) {
-  EXPECT_TRUE(SetupChannel());
-  voe_.set_fail_create_channel(true);
-  EXPECT_FALSE(AddRecvStream(2));
-}
-
-// Test that we properly handle failures to add a send stream.
-TEST_F(WebRtcVoiceEngineTestFake, AddSendStreamFail) {
-  EXPECT_TRUE(SetupChannel());
-  voe_.set_fail_create_channel(true);
-  EXPECT_FALSE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(2)));
-}
-
-// Test that AddRecvStream creates new stream.
-TEST_F(WebRtcVoiceEngineTestFake, AddRecvStream) {
-  EXPECT_TRUE(SetupRecvStream());
-  int channel_num = voe_.GetLastChannel();
-  EXPECT_TRUE(AddRecvStream(1));
-  EXPECT_NE(channel_num, voe_.GetLastChannel());
-}
-
-// Test that after adding a recv stream, we do not decode more codecs than
-// those previously passed into SetRecvCodecs.
-TEST_F(WebRtcVoiceEngineTestFake, AddRecvStreamUnsupportedCodec) {
-  EXPECT_TRUE(SetupSendStream());
-  cricket::AudioRecvParameters parameters;
-  parameters.codecs.push_back(kIsacCodec);
-  parameters.codecs.push_back(kPcmuCodec);
-  EXPECT_TRUE(channel_->SetRecvParameters(parameters));
-  EXPECT_TRUE(AddRecvStream(kSsrcX));
-  EXPECT_THAT(GetRecvStreamConfig(kSsrcX).decoder_map,
-              (ContainerEq<std::map<int, webrtc::SdpAudioFormat>>(
-                  {{0, {"PCMU", 8000, 1}}, {103, {"ISAC", 16000, 1}}})));
-}
-
-// Test that we properly clean up any streams that were added, even if
-// not explicitly removed.
-TEST_F(WebRtcVoiceEngineTestFake, StreamCleanup) {
-  EXPECT_TRUE(SetupSendStream());
-  SetSendParameters(send_parameters_);
-  EXPECT_TRUE(AddRecvStream(1));
-  EXPECT_TRUE(AddRecvStream(2));
-  EXPECT_EQ(3, voe_.GetNumChannels());  // default channel + 2 added
-  delete channel_;
-  channel_ = NULL;
-  EXPECT_EQ(0, voe_.GetNumChannels());
-}
-
-TEST_F(WebRtcVoiceEngineTestFake, TestAddRecvStreamFailWithZeroSsrc) {
-  EXPECT_TRUE(SetupSendStream());
-  EXPECT_FALSE(AddRecvStream(0));
-}
-
-TEST_F(WebRtcVoiceEngineTestFake, TestNoLeakingWhenAddRecvStreamFail) {
-  EXPECT_TRUE(SetupChannel());
-  EXPECT_TRUE(AddRecvStream(1));
-  // Manually delete channel to simulate a failure.
-  int channel = voe_.GetLastChannel();
-  EXPECT_EQ(0, voe_.DeleteChannel(channel));
-  // Add recv stream 2 should work.
-  EXPECT_TRUE(AddRecvStream(2));
-  int new_channel = voe_.GetLastChannel();
-  EXPECT_NE(channel, new_channel);
-  // The last created channel is deleted too.
-  EXPECT_EQ(0, voe_.DeleteChannel(new_channel));
-}
-
-// Test the InsertDtmf on default send stream as caller.
-TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCaller) {
-  TestInsertDtmf(0, true, kTelephoneEventCodec1);
-}
-
-// Test the InsertDtmf on default send stream as callee
-TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnDefaultSendStreamAsCallee) {
-  TestInsertDtmf(0, false, kTelephoneEventCodec2);
-}
-
-// Test the InsertDtmf on specified send stream as caller.
-TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCaller) {
-  TestInsertDtmf(kSsrcX, true, kTelephoneEventCodec2);
-}
-
-// Test the InsertDtmf on specified send stream as callee.
-TEST_F(WebRtcVoiceEngineTestFake, InsertDtmfOnSendStreamAsCallee) {
-  TestInsertDtmf(kSsrcX, false, kTelephoneEventCodec1);
-}
-
-TEST_F(WebRtcVoiceEngineTestFake, SetAudioOptions) {
-  EXPECT_TRUE(SetupSendStream());
-  EXPECT_CALL(adm_,
-              BuiltInAECIsAvailable()).Times(9).WillRepeatedly(Return(false));
-  EXPECT_CALL(adm_,
-              BuiltInAGCIsAvailable()).Times(4).WillRepeatedly(Return(false));
-  EXPECT_CALL(adm_,
-              BuiltInNSIsAvailable()).Times(2).WillRepeatedly(Return(false));
-
-  EXPECT_EQ(50, voe_.GetNetEqCapacity());
-  EXPECT_FALSE(voe_.GetNetEqFastAccelerate());
-
-  // Nothing set in AudioOptions, so everything should be as default.
-  send_parameters_.options = cricket::AudioOptions();
-  SetSendParameters(send_parameters_);
-  EXPECT_TRUE(IsHighPassFilterEnabled());
-  EXPECT_EQ(50, voe_.GetNetEqCapacity());
-  EXPECT_FALSE(voe_.GetNetEqFastAccelerate());
-
-  // Turn echo cancellation off
-  EXPECT_CALL(apm_ec_, Enable(false)).WillOnce(Return(0));
-  EXPECT_CALL(apm_ec_, enable_metrics(false)).WillOnce(Return(0));
-  send_parameters_.options.echo_cancellation = rtc::Optional<bool>(false);
-  SetSendParameters(send_parameters_);
-
-  // Turn echo cancellation back on, with settings, and make sure
-  // nothing else changed.
-  EXPECT_CALL(apm_ec_, Enable(true)).WillOnce(Return(0));
-  EXPECT_CALL(apm_ec_, enable_metrics(true)).WillOnce(Return(0));
-  send_parameters_.options.echo_cancellation = rtc::Optional<bool>(true);
-  SetSendParameters(send_parameters_);
-
-  // Turn on delay agnostic aec and make sure nothing change w.r.t. echo
-  // control.
-  EXPECT_CALL(apm_ec_, Enable(true)).WillOnce(Return(0));
-  EXPECT_CALL(apm_ec_, enable_metrics(true)).WillOnce(Return(0));
-  send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(true);
-  SetSendParameters(send_parameters_);
-
-  // Turn off echo cancellation and delay agnostic aec.
-  EXPECT_CALL(apm_ec_, Enable(false)).WillOnce(Return(0));
-  EXPECT_CALL(apm_ec_, enable_metrics(false)).WillOnce(Return(0));
-  send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(false);
-  send_parameters_.options.extended_filter_aec = rtc::Optional<bool>(false);
-  send_parameters_.options.echo_cancellation = rtc::Optional<bool>(false);
-  SetSendParameters(send_parameters_);
-
-  // Turning delay agnostic aec back on should also turn on echo cancellation.
-  EXPECT_CALL(apm_ec_, Enable(true)).WillOnce(Return(0));
-  EXPECT_CALL(apm_ec_, enable_metrics(true)).WillOnce(Return(0));
-  send_parameters_.options.delay_agnostic_aec = rtc::Optional<bool>(true);
-  SetSendParameters(send_parameters_);
-
-  // Turn off AGC
-  EXPECT_CALL(adm_, SetAGC(false)).WillOnce(Return(0));
-  EXPECT_CALL(apm_ec_, Enable(true)).WillOnce(Return(0));
-  EXPECT_CALL(apm_ec_, enable_metrics(true)).WillOnce(Return(0));
-  EXPECT_CALL(apm_gc_, Enable(false)).WillOnce(Return(0));
-  send_parameters_.options.auto_gain_control = rtc::Optional<bool>(false);
-  SetSendParameters(send_parameters_);
-
-  // Turn AGC back on
-  EXPECT_CALL(adm_, SetAGC(true)).WillOnce(Return(0));
-  EXPECT_CALL(apm_ec_, Enable(true)).WillOnce(Return(0));
-  EXPECT_CALL(apm_ec_, enable_metrics(true)).WillOnce(Return(0));
-  EXPECT_CALL(apm_gc_, Enable(true)).WillOnce(Return(0));
-  send_parameters_.options.auto_gain_control = rtc::Optional<bool>(true);
-  send_parameters_.options.adjust_agc_delta = rtc::Optional<int>();
-  SetSendParameters(send_parameters_);
-
-  // Turn off other options (and stereo swapping on).
-  EXPECT_CALL(adm_, SetAGC(true)).WillOnce(Return(0));
-  EXPECT_CALL(apm_ec_, Enable(true)).WillOnce(Return(0));
-  EXPECT_CALL(apm_ec_, enable_metrics(true)).WillOnce(Return(0));
-  EXPECT_CALL(apm_gc_, Enable(true)).WillOnce(Return(0));
-  EXPECT_CALL(apm_ns_, Enable(false)).WillOnce(Return(0));
-  EXPECT_CALL(apm_vd_, Enable(false)).WillOnce(Return(0));
-  EXPECT_CALL(transmit_mixer_, EnableStereoChannelSwapping(true));
-  send_parameters_.options.noise_suppression = rtc::Optional<bool>(false);
-  send_parameters_.options.highpass_filter = rtc::Optional<bool>(false);
-  send_parameters_.options.typing_detection = rtc::Optional<bool>(false);
-  send_parameters_.options.stereo_swapping = rtc::Optional<bool>(true);
-  SetSendParameters(send_parameters_);
-  EXPECT_FALSE(IsHighPassFilterEnabled());
-
-  // Set options again to ensure it has no impact.
-  EXPECT_CALL(adm_, SetAGC(true)).WillOnce(Return(0));
-  EXPECT_CALL(apm_ec_, Enable(true)).WillOnce(Return(0));
-  EXPECT_CALL(apm_ec_, enable_metrics(true)).WillOnce(Return(0));
-  EXPECT_CALL(apm_gc_, Enable(true)).WillOnce(Return(0));
-  EXPECT_CALL(apm_ns_, Enable(false)).WillOnce(Return(0));
-  EXPECT_CALL(apm_vd_, Enable(false)).WillOnce(Return(0));
-  EXPECT_CALL(transmit_mixer_, EnableStereoChannelSwapping(true));
-  SetSendParameters(send_parameters_);
-}
-
-TEST_F(WebRtcVoiceEngineTestFake, SetOptionOverridesViaChannels) {
-  EXPECT_TRUE(SetupSendStream());
-  EXPECT_CALL(adm_,
-              BuiltInAECIsAvailable()).Times(8).WillRepeatedly(Return(false));
-  EXPECT_CALL(adm_,
-              BuiltInAGCIsAvailable()).Times(8).WillRepeatedly(Return(false));
-  EXPECT_CALL(adm_,
-              BuiltInNSIsAvailable()).Times(8).WillRepeatedly(Return(false));
-  EXPECT_CALL(adm_,
-              RecordingIsInitialized()).Times(2).WillRepeatedly(Return(false));
-  EXPECT_CALL(adm_, Recording()).Times(2).WillRepeatedly(Return(false));
-  EXPECT_CALL(adm_, InitRecording()).Times(2).WillRepeatedly(Return(0));
-  webrtc::AudioProcessing::Config apm_config;
-  EXPECT_CALL(*apm_, GetConfig())
-      .Times(10)
-      .WillRepeatedly(ReturnPointee(&apm_config));
-  EXPECT_CALL(*apm_, ApplyConfig(_))
-      .Times(10)
-      .WillRepeatedly(SaveArg<0>(&apm_config));
-  EXPECT_CALL(*apm_, SetExtraOptions(testing::_)).Times(10);
-
-  std::unique_ptr<cricket::WebRtcVoiceMediaChannel> channel1(
-      static_cast<cricket::WebRtcVoiceMediaChannel*>(engine_->CreateChannel(
-          &call_, cricket::MediaConfig(), cricket::AudioOptions())));
-  std::unique_ptr<cricket::WebRtcVoiceMediaChannel> channel2(
-      static_cast<cricket::WebRtcVoiceMediaChannel*>(engine_->CreateChannel(
-          &call_, cricket::MediaConfig(), cricket::AudioOptions())));
-
-  // Have to add a stream to make SetSend work.
-  cricket::StreamParams stream1;
-  stream1.ssrcs.push_back(1);
-  channel1->AddSendStream(stream1);
-  cricket::StreamParams stream2;
-  stream2.ssrcs.push_back(2);
-  channel2->AddSendStream(stream2);
-
-  // AEC and AGC and NS
-  cricket::AudioSendParameters parameters_options_all = send_parameters_;
-  parameters_options_all.options.echo_cancellation = rtc::Optional<bool>(true);
-  parameters_options_all.options.auto_gain_control = rtc::Optional<bool>(true);
-  parameters_options_all.options.noise_suppression = rtc::Optional<bool>(true);
-  EXPECT_CALL(adm_, SetAGC(true)).Times(2).WillRepeatedly(Return(0));
-  EXPECT_CALL(apm_ec_, Enable(true)).Times(2).WillRepeatedly(Return(0));
-  EXPECT_CALL(apm_ec_, enable_metrics(true)).Times(2).WillRepeatedly(Return(0));
-  EXPECT_CALL(apm_gc_, Enable(true)).Times(2).WillRepeatedly(Return(0));
-  EXPECT_CALL(apm_ns_, Enable(true)).Times(2).WillRepeatedly(Return(0));
-  EXPECT_TRUE(channel1->SetSendParameters(parameters_options_all));
-  EXPECT_EQ(parameters_options_all.options, channel1->options());
-  EXPECT_TRUE(channel2->SetSendParameters(parameters_options_all));
-  EXPECT_EQ(parameters_options_all.options, channel2->options());
-
-  // unset NS
-  cricket::AudioSendParameters parameters_options_no_ns = send_parameters_;
-  parameters_options_no_ns.options.noise_suppression =
-      rtc::Optional<bool>(false);
-  EXPECT_CALL(adm_, SetAGC(true)).WillOnce(Return(0));
-  EXPECT_CALL(apm_ec_, Enable(true)).WillOnce(Return(0));
-  EXPECT_CALL(apm_ec_, enable_metrics(true)).WillOnce(Return(0));
-  EXPECT_CALL(apm_gc_, Enable(true)).WillOnce(Return(0));
-  EXPECT_CALL(apm_ns_, Enable(false)).WillOnce(Return(0));
-  EXPECT_TRUE(channel1->SetSendParameters(parameters_options_no_ns));
-  cricket::AudioOptions expected_options = parameters_options_all.options;
-  expected_options.echo_cancellation = rtc::Optional<bool>(true);
-  expected_options.auto_gain_control = rtc::Optional<bool>(true);
-  expected_options.noise_suppression = rtc::Optional<bool>(false);
-  EXPECT_EQ(expected_options, channel1->options());
-
-  // unset AGC
-  cricket::AudioSendParameters parameters_options_no_agc = send_parameters_;
-  parameters_options_no_agc.options.auto_gain_control =
-      rtc::Optional<bool>(false);
-  EXPECT_CALL(adm_, SetAGC(false)).WillOnce(Return(0));
-  EXPECT_CALL(apm_ec_, Enable(true)).WillOnce(Return(0));
-  EXPECT_CALL(apm_ec_, enable_metrics(true)).WillOnce(Return(0));
-  EXPECT_CALL(apm_gc_, Enable(false)).WillOnce(Return(0));
-  EXPECT_CALL(apm_ns_, Enable(true)).WillOnce(Return(0));
-  EXPECT_TRUE(channel2->SetSendParameters(parameters_options_no_agc));
-  expected_options.echo_cancellation = rtc::Optional<bool>(true);
-  expected_options.auto_gain_control = rtc::Optional<bool>(false);
-  expected_options.noise_suppression = rtc::Optional<bool>(true);
-  EXPECT_EQ(expected_options, channel2->options());
-
-  EXPECT_CALL(adm_, SetAGC(true)).WillOnce(Return(0));
-  EXPECT_CALL(apm_ec_, Enable(true)).WillOnce(Return(0));
-  EXPECT_CALL(apm_ec_, enable_metrics(true)).WillOnce(Return(0));
-  EXPECT_CALL(apm_gc_, Enable(true)).WillOnce(Return(0));
-  EXPECT_CALL(apm_ns_, Enable(true)).WillOnce(Return(0));
-  EXPECT_TRUE(channel_->SetSendParameters(parameters_options_all));
-
-  EXPECT_CALL(adm_, SetAGC(true)).WillOnce(Return(0));
-  EXPECT_CALL(apm_ec_, Enable(true)).WillOnce(Return(0));
-  EXPECT_CALL(apm_ec_, enable_metrics(true)).WillOnce(Return(0));
-  EXPECT_CALL(apm_gc_, Enable(true)).WillOnce(Return(0));
-  EXPECT_CALL(apm_ns_, Enable(false)).WillOnce(Return(0));
-  channel1->SetSend(true);
-
-  EXPECT_CALL(adm_, SetAGC(false)).WillOnce(Return(0));
-  EXPECT_CALL(apm_ec_, Enable(true)).WillOnce(Return(0));
-  EXPECT_CALL(apm_ec_, enable_metrics(true)).WillOnce(Return(0));
-  EXPECT_CALL(apm_gc_, Enable(false)).WillOnce(Return(0));
-  EXPECT_CALL(apm_ns_, Enable(true)).WillOnce(Return(0));
-  channel2->SetSend(true);
-
-  // Make sure settings take effect while we are sending.
-  cricket::AudioSendParameters parameters_options_no_agc_nor_ns =
-      send_parameters_;
-  parameters_options_no_agc_nor_ns.options.auto_gain_control =
-      rtc::Optional<bool>(false);
-  parameters_options_no_agc_nor_ns.options.noise_suppression =
-      rtc::Optional<bool>(false);
-  EXPECT_CALL(adm_, SetAGC(false)).WillOnce(Return(0));
-  EXPECT_CALL(apm_ec_, Enable(true)).WillOnce(Return(0));
-  EXPECT_CALL(apm_ec_, enable_metrics(true)).WillOnce(Return(0));
-  EXPECT_CALL(apm_gc_, Enable(false)).WillOnce(Return(0));
-  EXPECT_CALL(apm_ns_, Enable(false)).WillOnce(Return(0));
-  EXPECT_TRUE(channel2->SetSendParameters(parameters_options_no_agc_nor_ns));
-  expected_options.echo_cancellation = rtc::Optional<bool>(true);
-  expected_options.auto_gain_control = rtc::Optional<bool>(false);
-  expected_options.noise_suppression = rtc::Optional<bool>(false);
-  EXPECT_EQ(expected_options, channel2->options());
-}
-
-// This test verifies DSCP settings are properly applied on voice media channel.
-TEST_F(WebRtcVoiceEngineTestFake, TestSetDscpOptions) {
-  EXPECT_TRUE(SetupSendStream());
-  cricket::FakeNetworkInterface network_interface;
-  cricket::MediaConfig config;
-  std::unique_ptr<cricket::VoiceMediaChannel> channel;
-
-  webrtc::AudioProcessing::Config apm_config;
-  EXPECT_CALL(*apm_, GetConfig())
-      .Times(3)
-      .WillRepeatedly(ReturnPointee(&apm_config));
-  EXPECT_CALL(*apm_, ApplyConfig(_))
-      .Times(3)
-      .WillRepeatedly(SaveArg<0>(&apm_config));
-  EXPECT_CALL(*apm_, SetExtraOptions(testing::_)).Times(3);
-
-  channel.reset(
-      engine_->CreateChannel(&call_, config, cricket::AudioOptions()));
-  channel->SetInterface(&network_interface);
-  // Default value when DSCP is disabled should be DSCP_DEFAULT.
-  EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface.dscp());
-
-  config.enable_dscp = true;
-  channel.reset(
-      engine_->CreateChannel(&call_, config, cricket::AudioOptions()));
-  channel->SetInterface(&network_interface);
-  EXPECT_EQ(rtc::DSCP_EF, network_interface.dscp());
-
-  // Verify that setting the option to false resets the
-  // DiffServCodePoint.
-  config.enable_dscp = false;
-  channel.reset(
-      engine_->CreateChannel(&call_, config, cricket::AudioOptions()));
-  channel->SetInterface(&network_interface);
-  // Default value when DSCP is disabled should be DSCP_DEFAULT.
-  EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface.dscp());
-
-  channel->SetInterface(nullptr);
-}
-
-TEST_F(WebRtcVoiceEngineTestFake, TestGetReceiveChannelId) {
-  EXPECT_TRUE(SetupChannel());
-  cricket::WebRtcVoiceMediaChannel* media_channel =
-        static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
-  EXPECT_EQ(-1, media_channel->GetReceiveChannelId(0));
-  EXPECT_TRUE(AddRecvStream(kSsrcX));
-  int channel_id = voe_.GetLastChannel();
-  EXPECT_EQ(channel_id, media_channel->GetReceiveChannelId(kSsrcX));
-  EXPECT_EQ(-1, media_channel->GetReceiveChannelId(kSsrcY));
-  EXPECT_TRUE(AddRecvStream(kSsrcY));
-  int channel_id2 = voe_.GetLastChannel();
-  EXPECT_EQ(channel_id2, media_channel->GetReceiveChannelId(kSsrcY));
-}
-
-TEST_F(WebRtcVoiceEngineTestFake, TestGetSendChannelId) {
-  EXPECT_TRUE(SetupChannel());
-  cricket::WebRtcVoiceMediaChannel* media_channel =
-        static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
-  EXPECT_EQ(-1, media_channel->GetSendChannelId(0));
-  EXPECT_TRUE(channel_->AddSendStream(
-      cricket::StreamParams::CreateLegacy(kSsrcX)));
-  int channel_id = voe_.GetLastChannel();
-  EXPECT_EQ(channel_id, media_channel->GetSendChannelId(kSsrcX));
-  EXPECT_EQ(-1, media_channel->GetSendChannelId(kSsrcY));
-  EXPECT_TRUE(channel_->AddSendStream(
-      cricket::StreamParams::CreateLegacy(kSsrcY)));
-  int channel_id2 = voe_.GetLastChannel();
-  EXPECT_EQ(channel_id2, media_channel->GetSendChannelId(kSsrcY));
-}
-
-TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolume) {
-  EXPECT_TRUE(SetupChannel());
-  EXPECT_FALSE(channel_->SetOutputVolume(kSsrcY, 0.5));
-  cricket::StreamParams stream;
-  stream.ssrcs.push_back(kSsrcY);
-  EXPECT_TRUE(channel_->AddRecvStream(stream));
-  EXPECT_DOUBLE_EQ(1, GetRecvStream(kSsrcY).gain());
-  EXPECT_TRUE(channel_->SetOutputVolume(kSsrcY, 3));
-  EXPECT_DOUBLE_EQ(3, GetRecvStream(kSsrcY).gain());
-}
-
-TEST_F(WebRtcVoiceEngineTestFake, SetOutputVolumeUnsignaledRecvStream) {
-  EXPECT_TRUE(SetupChannel());
-
-  // Spawn an unsignaled stream by sending a packet - gain should be 1.
-  DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
-  EXPECT_DOUBLE_EQ(1, GetRecvStream(kSsrc1).gain());
-
-  // Should remember the volume "2" which will be set on new unsignaled streams,
-  // and also set the gain to 2 on existing unsignaled streams.
-  EXPECT_TRUE(channel_->SetOutputVolume(kSsrc0, 2));
-  EXPECT_DOUBLE_EQ(2, GetRecvStream(kSsrc1).gain());
-
-  // Spawn an unsignaled stream by sending a packet - gain should be 2.
-  unsigned char pcmuFrame2[sizeof(kPcmuFrame)];
-  memcpy(pcmuFrame2, kPcmuFrame, sizeof(kPcmuFrame));
-  rtc::SetBE32(&pcmuFrame2[8], kSsrcX);
-  DeliverPacket(pcmuFrame2, sizeof(pcmuFrame2));
-  EXPECT_DOUBLE_EQ(2, GetRecvStream(kSsrcX).gain());
-
-  // Setting gain with SSRC=0 should affect all unsignaled streams.
-  EXPECT_TRUE(channel_->SetOutputVolume(kSsrc0, 3));
-  if (kMaxUnsignaledRecvStreams > 1) {
-    EXPECT_DOUBLE_EQ(3, GetRecvStream(kSsrc1).gain());
-  }
-  EXPECT_DOUBLE_EQ(3, GetRecvStream(kSsrcX).gain());
-
-  // Setting gain on an individual stream affects only that.
-  EXPECT_TRUE(channel_->SetOutputVolume(kSsrcX, 4));
-  if (kMaxUnsignaledRecvStreams > 1) {
-    EXPECT_DOUBLE_EQ(3, GetRecvStream(kSsrc1).gain());
-  }
-  EXPECT_DOUBLE_EQ(4, GetRecvStream(kSsrcX).gain());
-}
-
-TEST_F(WebRtcVoiceEngineTestFake, SetsSyncGroupFromSyncLabel) {
-  const uint32_t kAudioSsrc = 123;
-  const std::string kSyncLabel = "AvSyncLabel";
-
-  EXPECT_TRUE(SetupSendStream());
-  cricket::StreamParams sp = cricket::StreamParams::CreateLegacy(kAudioSsrc);
-  sp.sync_label = kSyncLabel;
-  // Creating two channels to make sure that sync label is set properly for both
-  // the default voice channel and following ones.
-  EXPECT_TRUE(channel_->AddRecvStream(sp));
-  sp.ssrcs[0] += 1;
-  EXPECT_TRUE(channel_->AddRecvStream(sp));
-
-  ASSERT_EQ(2, call_.GetAudioReceiveStreams().size());
-  EXPECT_EQ(kSyncLabel,
-            call_.GetAudioReceiveStream(kAudioSsrc)->GetConfig().sync_group)
-      << "SyncGroup should be set based on sync_label";
-  EXPECT_EQ(kSyncLabel,
-            call_.GetAudioReceiveStream(kAudioSsrc + 1)->GetConfig().sync_group)
-      << "SyncGroup should be set based on sync_label";
-}
-
-// TODO(solenberg): Remove, once recv streams are configured through Call.
-//                  (This is then covered by TestSetRecvRtpHeaderExtensions.)
-TEST_F(WebRtcVoiceEngineTestFake, ConfiguresAudioReceiveStreamRtpExtensions) {
-  // Test that setting the header extensions results in the expected state
-  // changes on an associated Call.
-  std::vector<uint32_t> ssrcs;
-  ssrcs.push_back(223);
-  ssrcs.push_back(224);
-
-  EXPECT_TRUE(SetupSendStream());
-  SetSendParameters(send_parameters_);
-  for (uint32_t ssrc : ssrcs) {
-    EXPECT_TRUE(channel_->AddRecvStream(
-        cricket::StreamParams::CreateLegacy(ssrc)));
-  }
-
-  EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
-  for (uint32_t ssrc : ssrcs) {
-    const auto* s = call_.GetAudioReceiveStream(ssrc);
-    EXPECT_NE(nullptr, s);
-    EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
-  }
-
-  // Set up receive extensions.
-  cricket::RtpCapabilities capabilities = engine_->GetCapabilities();
-  cricket::AudioRecvParameters recv_parameters;
-  recv_parameters.extensions = capabilities.header_extensions;
-  channel_->SetRecvParameters(recv_parameters);
-  EXPECT_EQ(2, call_.GetAudioReceiveStreams().size());
-  for (uint32_t ssrc : ssrcs) {
-    const auto* s = call_.GetAudioReceiveStream(ssrc);
-    EXPECT_NE(nullptr, s);
-    const auto& s_exts = s->GetConfig().rtp.extensions;
-    EXPECT_EQ(capabilities.header_extensions.size(), s_exts.size());
-    for (const auto& e_ext : capabilities.header_extensions) {
-      for (const auto& s_ext : s_exts) {
-        if (e_ext.id == s_ext.id) {
-          EXPECT_EQ(e_ext.uri, s_ext.uri);
-        }
-      }
-    }
-  }
-
-  // Disable receive extensions.
-  channel_->SetRecvParameters(cricket::AudioRecvParameters());
-  for (uint32_t ssrc : ssrcs) {
-    const auto* s = call_.GetAudioReceiveStream(ssrc);
-    EXPECT_NE(nullptr, s);
-    EXPECT_EQ(0, s->GetConfig().rtp.extensions.size());
-  }
-}
-
-TEST_F(WebRtcVoiceEngineTestFake, DeliverAudioPacket_Call) {
-  // Test that packets are forwarded to the Call when configured accordingly.
-  const uint32_t kAudioSsrc = 1;
-  rtc::CopyOnWriteBuffer kPcmuPacket(kPcmuFrame, sizeof(kPcmuFrame));
-  static const unsigned char kRtcp[] = {
-    0x80, 0xc9, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02,
-    0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
-  };
-  rtc::CopyOnWriteBuffer kRtcpPacket(kRtcp, sizeof(kRtcp));
-
-  EXPECT_TRUE(SetupSendStream());
-  cricket::WebRtcVoiceMediaChannel* media_channel =
-      static_cast<cricket::WebRtcVoiceMediaChannel*>(channel_);
-  SetSendParameters(send_parameters_);
-  EXPECT_TRUE(media_channel->AddRecvStream(
-      cricket::StreamParams::CreateLegacy(kAudioSsrc)));
-
-  EXPECT_EQ(1, call_.GetAudioReceiveStreams().size());
-  const cricket::FakeAudioReceiveStream* s =
-      call_.GetAudioReceiveStream(kAudioSsrc);
-  EXPECT_EQ(0, s->received_packets());
-  channel_->OnPacketReceived(&kPcmuPacket, rtc::PacketTime());
-  EXPECT_EQ(1, s->received_packets());
-  channel_->OnRtcpReceived(&kRtcpPacket, rtc::PacketTime());
-  EXPECT_EQ(2, s->received_packets());
-}
-
-// All receive channels should be associated with the first send channel,
-// since they do not send RTCP SR.
-TEST_F(WebRtcVoiceEngineTestFake, AssociateFirstSendChannel_SendCreatedFirst) {
-  EXPECT_TRUE(SetupSendStream());
-  EXPECT_TRUE(AddRecvStream(kSsrcY));
-  EXPECT_EQ(kSsrcX, GetRecvStreamConfig(kSsrcY).rtp.local_ssrc);
-  EXPECT_TRUE(channel_->AddSendStream(
-      cricket::StreamParams::CreateLegacy(kSsrcZ)));
-  EXPECT_EQ(kSsrcX, GetRecvStreamConfig(kSsrcY).rtp.local_ssrc);
-  EXPECT_TRUE(AddRecvStream(kSsrcW));
-  EXPECT_EQ(kSsrcX, GetRecvStreamConfig(kSsrcW).rtp.local_ssrc);
-}
-
-TEST_F(WebRtcVoiceEngineTestFake, AssociateFirstSendChannel_RecvCreatedFirst) {
-  EXPECT_TRUE(SetupRecvStream());
-  EXPECT_EQ(0xFA17FA17u, GetRecvStreamConfig(kSsrcX).rtp.local_ssrc);
-  EXPECT_TRUE(channel_->AddSendStream(
-      cricket::StreamParams::CreateLegacy(kSsrcY)));
-  EXPECT_EQ(kSsrcY, GetRecvStreamConfig(kSsrcX).rtp.local_ssrc);
-  EXPECT_TRUE(AddRecvStream(kSsrcZ));
-  EXPECT_EQ(kSsrcY, GetRecvStreamConfig(kSsrcZ).rtp.local_ssrc);
-  EXPECT_TRUE(channel_->AddSendStream(
-      cricket::StreamParams::CreateLegacy(kSsrcW)));
-  EXPECT_EQ(kSsrcY, GetRecvStreamConfig(kSsrcX).rtp.local_ssrc);
-  EXPECT_EQ(kSsrcY, GetRecvStreamConfig(kSsrcZ).rtp.local_ssrc);
-}
-
-TEST_F(WebRtcVoiceEngineTestFake, SetRawAudioSink) {
-  EXPECT_TRUE(SetupChannel());
-  std::unique_ptr<FakeAudioSink> fake_sink_1(new FakeAudioSink());
-  std::unique_ptr<FakeAudioSink> fake_sink_2(new FakeAudioSink());
-
-  // Setting the sink before a recv stream exists should do nothing.
-  channel_->SetRawAudioSink(kSsrcX, std::move(fake_sink_1));
-  EXPECT_TRUE(AddRecvStream(kSsrcX));
-  EXPECT_EQ(nullptr, GetRecvStream(kSsrcX).sink());
-
-  // Now try actually setting the sink.
-  channel_->SetRawAudioSink(kSsrcX, std::move(fake_sink_2));
-  EXPECT_NE(nullptr, GetRecvStream(kSsrcX).sink());
-
-  // Now try resetting it.
-  channel_->SetRawAudioSink(kSsrcX, nullptr);
-  EXPECT_EQ(nullptr, GetRecvStream(kSsrcX).sink());
-}
-
-TEST_F(WebRtcVoiceEngineTestFake, SetRawAudioSinkUnsignaledRecvStream) {
-  EXPECT_TRUE(SetupChannel());
-  std::unique_ptr<FakeAudioSink> fake_sink_1(new FakeAudioSink());
-  std::unique_ptr<FakeAudioSink> fake_sink_2(new FakeAudioSink());
-  std::unique_ptr<FakeAudioSink> fake_sink_3(new FakeAudioSink());
-  std::unique_ptr<FakeAudioSink> fake_sink_4(new FakeAudioSink());
-
-  // Should be able to set a default sink even when no stream exists.
-  channel_->SetRawAudioSink(0, std::move(fake_sink_1));
-
-  // Spawn an unsignaled stream by sending a packet - it should be assigned the
-  // default sink.
-  DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
-  EXPECT_NE(nullptr, GetRecvStream(kSsrc1).sink());
-
-  // Try resetting the default sink.
-  channel_->SetRawAudioSink(kSsrc0, nullptr);
-  EXPECT_EQ(nullptr, GetRecvStream(kSsrc1).sink());
-
-  // Try setting the default sink while the default stream exists.
-  channel_->SetRawAudioSink(kSsrc0, std::move(fake_sink_2));
-  EXPECT_NE(nullptr, GetRecvStream(kSsrc1).sink());
-
-  // If we remove and add a default stream, it should get the same sink.
-  EXPECT_TRUE(channel_->RemoveRecvStream(kSsrc1));
-  DeliverPacket(kPcmuFrame, sizeof(kPcmuFrame));
-  EXPECT_NE(nullptr, GetRecvStream(kSsrc1).sink());
-
-  // Spawn another unsignaled stream - it should be assigned the default sink
-  // and the previous unsignaled stream should lose it.
-  unsigned char pcmuFrame2[sizeof(kPcmuFrame)];
-  memcpy(pcmuFrame2, kPcmuFrame, sizeof(kPcmuFrame));
-  rtc::SetBE32(&pcmuFrame2[8], kSsrcX);
-  DeliverPacket(pcmuFrame2, sizeof(pcmuFrame2));
-  if (kMaxUnsignaledRecvStreams > 1) {
-    EXPECT_EQ(nullptr, GetRecvStream(kSsrc1).sink());
-  }
-  EXPECT_NE(nullptr, GetRecvStream(kSsrcX).sink());
-
-  // Reset the default sink - the second unsignaled stream should lose it.
-  channel_->SetRawAudioSink(kSsrc0, nullptr);
-  if (kMaxUnsignaledRecvStreams > 1) {
-    EXPECT_EQ(nullptr, GetRecvStream(kSsrc1).sink());
-  }
-  EXPECT_EQ(nullptr, GetRecvStream(kSsrcX).sink());
-
-  // Try setting the default sink while two streams exists.
-  channel_->SetRawAudioSink(kSsrc0, std::move(fake_sink_3));
-  if (kMaxUnsignaledRecvStreams > 1) {
-    EXPECT_EQ(nullptr, GetRecvStream(kSsrc1).sink());
-  }
-  EXPECT_NE(nullptr, GetRecvStream(kSsrcX).sink());
-
-  // Try setting the sink for the first unsignaled stream using its known SSRC.
-  channel_->SetRawAudioSink(kSsrc1, std::move(fake_sink_4));
-  if (kMaxUnsignaledRecvStreams > 1) {
-    EXPECT_NE(nullptr, GetRecvStream(kSsrc1).sink());
-  }
-  EXPECT_NE(nullptr, GetRecvStream(kSsrcX).sink());
-  if (kMaxUnsignaledRecvStreams > 1) {
-    EXPECT_NE(GetRecvStream(kSsrc1).sink(), GetRecvStream(kSsrcX).sink());
-  }
-}
-
-// Test that, just like the video channel, the voice channel communicates the
-// network state to the call.
-TEST_F(WebRtcVoiceEngineTestFake, OnReadyToSendSignalsNetworkState) {
-  EXPECT_TRUE(SetupChannel());
-
-  EXPECT_EQ(webrtc::kNetworkUp,
-            call_.GetNetworkState(webrtc::MediaType::AUDIO));
-  EXPECT_EQ(webrtc::kNetworkUp,
-            call_.GetNetworkState(webrtc::MediaType::VIDEO));
-
-  channel_->OnReadyToSend(false);
-  EXPECT_EQ(webrtc::kNetworkDown,
-            call_.GetNetworkState(webrtc::MediaType::AUDIO));
-  EXPECT_EQ(webrtc::kNetworkUp,
-            call_.GetNetworkState(webrtc::MediaType::VIDEO));
-
-  channel_->OnReadyToSend(true);
-  EXPECT_EQ(webrtc::kNetworkUp,
-            call_.GetNetworkState(webrtc::MediaType::AUDIO));
-  EXPECT_EQ(webrtc::kNetworkUp,
-            call_.GetNetworkState(webrtc::MediaType::VIDEO));
-}
-
-// Test that playout is still started after changing parameters
-TEST_F(WebRtcVoiceEngineTestFake, PreservePlayoutWhenRecreateRecvStream) {
-  SetupRecvStream();
-  channel_->SetPlayout(true);
-  EXPECT_TRUE(GetRecvStream(kSsrcX).started());
-
-  // Changing RTP header extensions will recreate the AudioReceiveStream.
-  cricket::AudioRecvParameters parameters;
-  parameters.extensions.push_back(
-      webrtc::RtpExtension(webrtc::RtpExtension::kAudioLevelUri, 12));
-  channel_->SetRecvParameters(parameters);
-
-  EXPECT_TRUE(GetRecvStream(kSsrcX).started());
-}
-
-// Tests that the library initializes and shuts down properly.
-TEST(WebRtcVoiceEngineTest, StartupShutdown) {
-  // If the VoiceEngine wants to gather available codecs early, that's fine but
-  // we never want it to create a decoder at this stage.
-  rtc::scoped_refptr<webrtc::AudioProcessing> apm =
-      webrtc::AudioProcessing::Create();
-  cricket::WebRtcVoiceEngine engine(
-      nullptr, webrtc::MockAudioEncoderFactory::CreateUnusedFactory(),
-      webrtc::MockAudioDecoderFactory::CreateUnusedFactory(), nullptr, apm);
-  engine.Init();
-  webrtc::RtcEventLogNullImpl event_log;
-  std::unique_ptr<webrtc::Call> call(
-      webrtc::Call::Create(webrtc::Call::Config(&event_log)));
-  cricket::VoiceMediaChannel* channel = engine.CreateChannel(
-      call.get(), cricket::MediaConfig(), cricket::AudioOptions());
-  EXPECT_TRUE(channel != nullptr);
-  delete channel;
-}
-
-// Tests that reference counting on the external ADM is correct.
-TEST(WebRtcVoiceEngineTest, StartupShutdownWithExternalADM) {
-  testing::NiceMock<webrtc::test::MockAudioDeviceModule> adm;
-  EXPECT_CALL(adm, AddRef()).Times(3).WillRepeatedly(Return(0));
-  EXPECT_CALL(adm, Release()).Times(3).WillRepeatedly(Return(0));
-  // Return 100ms just in case this function gets called.  If we don't,
-  // we could enter a tight loop since the mock would return 0.
-  EXPECT_CALL(adm, TimeUntilNextProcess()).WillRepeatedly(Return(100));
-  {
-    rtc::scoped_refptr<webrtc::AudioProcessing> apm =
-        webrtc::AudioProcessing::Create();
-    cricket::WebRtcVoiceEngine engine(
-        &adm, webrtc::MockAudioEncoderFactory::CreateUnusedFactory(),
-        webrtc::MockAudioDecoderFactory::CreateUnusedFactory(), nullptr, apm);
-    engine.Init();
-    webrtc::RtcEventLogNullImpl event_log;
-    std::unique_ptr<webrtc::Call> call(
-        webrtc::Call::Create(webrtc::Call::Config(&event_log)));
-    cricket::VoiceMediaChannel* channel = engine.CreateChannel(
-        call.get(), cricket::MediaConfig(), cricket::AudioOptions());
-    EXPECT_TRUE(channel != nullptr);
-    delete channel;
-  }
-}
-
-// Verify the payload id of common audio codecs, including CN, ISAC, and G722.
-TEST(WebRtcVoiceEngineTest, HasCorrectPayloadTypeMapping) {
-  // TODO(ossu): Why are the payload types of codecs with non-static payload
-  // type assignments checked here? It shouldn't really matter.
-  rtc::scoped_refptr<webrtc::AudioProcessing> apm =
-      webrtc::AudioProcessing::Create();
-  cricket::WebRtcVoiceEngine engine(
-      nullptr, webrtc::MockAudioEncoderFactory::CreateUnusedFactory(),
-      webrtc::MockAudioDecoderFactory::CreateUnusedFactory(), nullptr, apm);
-  engine.Init();
-  for (const cricket::AudioCodec& codec : engine.send_codecs()) {
-    auto is_codec = [&codec](const char* name, int clockrate = 0) {
-      return STR_CASE_CMP(codec.name.c_str(), name) == 0 &&
-             (clockrate == 0 || codec.clockrate == clockrate);
-    };
-    if (is_codec("CN", 16000)) {
-      EXPECT_EQ(105, codec.id);
-    } else if (is_codec("CN", 32000)) {
-      EXPECT_EQ(106, codec.id);
-    } else if (is_codec("ISAC", 16000)) {
-      EXPECT_EQ(103, codec.id);
-    } else if (is_codec("ISAC", 32000)) {
-      EXPECT_EQ(104, codec.id);
-    } else if (is_codec("G722", 8000)) {
-      EXPECT_EQ(9, codec.id);
-    } else if (is_codec("telephone-event", 8000)) {
-      EXPECT_EQ(126, codec.id);
-    // TODO(solenberg): 16k, 32k, 48k DTMF should be dynamically assigned.
-    // Remove these checks once both send and receive side assigns payload types
-    // dynamically.
-    } else if (is_codec("telephone-event", 16000)) {
-      EXPECT_EQ(113, codec.id);
-    } else if (is_codec("telephone-event", 32000)) {
-      EXPECT_EQ(112, codec.id);
-    } else if (is_codec("telephone-event", 48000)) {
-      EXPECT_EQ(110, codec.id);
-    } else if (is_codec("opus")) {
-      EXPECT_EQ(111, codec.id);
-      ASSERT_TRUE(codec.params.find("minptime") != codec.params.end());
-      EXPECT_EQ("10", codec.params.find("minptime")->second);
-      ASSERT_TRUE(codec.params.find("useinbandfec") != codec.params.end());
-      EXPECT_EQ("1", codec.params.find("useinbandfec")->second);
-    }
-  }
-}
-
-// Tests that VoE supports at least 32 channels
-TEST(WebRtcVoiceEngineTest, Has32Channels) {
-  rtc::scoped_refptr<webrtc::AudioProcessing> apm =
-      webrtc::AudioProcessing::Create();
-  cricket::WebRtcVoiceEngine engine(
-      nullptr, webrtc::MockAudioEncoderFactory::CreateUnusedFactory(),
-      webrtc::MockAudioDecoderFactory::CreateUnusedFactory(), nullptr, apm);
-  engine.Init();
-  webrtc::RtcEventLogNullImpl event_log;
-  std::unique_ptr<webrtc::Call> call(
-      webrtc::Call::Create(webrtc::Call::Config(&event_log)));
-
-  cricket::VoiceMediaChannel* channels[32];
-  int num_channels = 0;
-  while (num_channels < arraysize(channels)) {
-    cricket::VoiceMediaChannel* channel = engine.CreateChannel(
-        call.get(), cricket::MediaConfig(), cricket::AudioOptions());
-    if (!channel)
-      break;
-    channels[num_channels++] = channel;
-  }
-
-  int expected = arraysize(channels);
-  EXPECT_EQ(expected, num_channels);
-
-  while (num_channels > 0) {
-    delete channels[--num_channels];
-  }
-}
-
-// Test that we set our preferred codecs properly.
-TEST(WebRtcVoiceEngineTest, SetRecvCodecs) {
-  // TODO(ossu): I'm not sure of the intent of this test. It's either:
-  // - Check that our builtin codecs are usable by Channel.
-  // - The codecs provided by the engine is usable by Channel.
-  // It does not check that the codecs in the RecvParameters are actually
-  // what we sent in - though it's probably reasonable to expect so, if
-  // SetRecvParameters returns true.
-  // I think it will become clear once audio decoder injection is completed.
-  rtc::scoped_refptr<webrtc::AudioProcessing> apm =
-      webrtc::AudioProcessing::Create();
-  cricket::WebRtcVoiceEngine engine(
-      nullptr, webrtc::MockAudioEncoderFactory::CreateUnusedFactory(),
-      webrtc::CreateBuiltinAudioDecoderFactory(), nullptr, apm);
-  engine.Init();
-  webrtc::RtcEventLogNullImpl event_log;
-  std::unique_ptr<webrtc::Call> call(
-      webrtc::Call::Create(webrtc::Call::Config(&event_log)));
-  cricket::WebRtcVoiceMediaChannel channel(&engine, cricket::MediaConfig(),
-                                           cricket::AudioOptions(), call.get());
-  cricket::AudioRecvParameters parameters;
-  parameters.codecs = engine.recv_codecs();
-  EXPECT_TRUE(channel.SetRecvParameters(parameters));
-}
-
-TEST(WebRtcVoiceEngineTest, CollectRecvCodecs) {
-  std::vector<webrtc::AudioCodecSpec> specs;
-  webrtc::AudioCodecSpec spec1{{"codec1", 48000, 2, {{"param1", "value1"}}},
-                               {48000, 2, 16000, 10000, 20000}};
-  spec1.info.allow_comfort_noise = false;
-  spec1.info.supports_network_adaption = true;
-  specs.push_back(spec1);
-  webrtc::AudioCodecSpec spec2{{"codec2", 32000, 1}, {32000, 1, 32000}};
-  spec2.info.allow_comfort_noise = false;
-  specs.push_back(spec2);
-  specs.push_back(webrtc::AudioCodecSpec{
-      {"codec3", 16000, 1, {{"param1", "value1b"}, {"param2", "value2"}}},
-      {16000, 1, 13300}});
-  specs.push_back(
-      webrtc::AudioCodecSpec{{"codec4", 8000, 1}, {8000, 1, 64000}});
-  specs.push_back(
-      webrtc::AudioCodecSpec{{"codec5", 8000, 2}, {8000, 1, 64000}});
-
-  rtc::scoped_refptr<webrtc::MockAudioEncoderFactory> unused_encoder_factory =
-      webrtc::MockAudioEncoderFactory::CreateUnusedFactory();
-  rtc::scoped_refptr<webrtc::MockAudioDecoderFactory> mock_decoder_factory =
-      new rtc::RefCountedObject<webrtc::MockAudioDecoderFactory>;
-  EXPECT_CALL(*mock_decoder_factory.get(), GetSupportedDecoders())
-      .WillOnce(Return(specs));
-
-  rtc::scoped_refptr<webrtc::AudioProcessing> apm =
-      webrtc::AudioProcessing::Create();
-  cricket::WebRtcVoiceEngine engine(nullptr, unused_encoder_factory,
-                                    mock_decoder_factory, nullptr, apm);
-  engine.Init();
-  auto codecs = engine.recv_codecs();
-  EXPECT_EQ(11, codecs.size());
-
-  // Rather than just ASSERTing that there are enough codecs, ensure that we can
-  // check the actual values safely, to provide better test results.
-  auto get_codec =
-      [&codecs](size_t index) -> const cricket::AudioCodec& {
-        static const cricket::AudioCodec missing_codec(0, "<missing>", 0, 0, 0);
-        if (codecs.size() > index)
-          return codecs[index];
-        return missing_codec;
-      };
-
-  // Ensure the general codecs are generated first and in order.
-  for (size_t i = 0; i != specs.size(); ++i) {
-    EXPECT_EQ(specs[i].format.name, get_codec(i).name);
-    EXPECT_EQ(specs[i].format.clockrate_hz, get_codec(i).clockrate);
-    EXPECT_EQ(specs[i].format.num_channels, get_codec(i).channels);
-    EXPECT_EQ(specs[i].format.parameters, get_codec(i).params);
-  }
-
-  // Find the index of a codec, or -1 if not found, so that we can easily check
-  // supplementary codecs are ordered after the general codecs.
-  auto find_codec =
-      [&codecs](const webrtc::SdpAudioFormat& format) -> int {
-        for (size_t i = 0; i != codecs.size(); ++i) {
-          const cricket::AudioCodec& codec = codecs[i];
-          if (STR_CASE_CMP(codec.name.c_str(), format.name.c_str()) == 0 &&
-              codec.clockrate == format.clockrate_hz &&
-              codec.channels == format.num_channels) {
-            return rtc::checked_cast<int>(i);
-          }
-        }
-        return -1;
-      };
-
-  // Ensure all supplementary codecs are generated last. Their internal ordering
-  // is not important.
-  // Without this cast, the comparison turned unsigned and, thus, failed for -1.
-  const int num_specs = static_cast<int>(specs.size());
-  EXPECT_GE(find_codec({"cn", 8000, 1}), num_specs);
-  EXPECT_GE(find_codec({"cn", 16000, 1}), num_specs);
-  EXPECT_EQ(find_codec({"cn", 32000, 1}), -1);
-  EXPECT_GE(find_codec({"telephone-event", 8000, 1}), num_specs);
-  EXPECT_GE(find_codec({"telephone-event", 16000, 1}), num_specs);
-  EXPECT_GE(find_codec({"telephone-event", 32000, 1}), num_specs);
-  EXPECT_GE(find_codec({"telephone-event", 48000, 1}), num_specs);
-}
diff --git a/media/sctp/sctptransport.cc b/media/sctp/sctptransport.cc
deleted file mode 100644
index 2dcc339..0000000
--- a/media/sctp/sctptransport.cc
+++ /dev/null
@@ -1,1089 +0,0 @@
-/*
- *  Copyright (c) 2012 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 <errno.h>
-namespace {
-// Some ERRNO values get re-#defined to WSA* equivalents in some talk/
-// headers. We save the original ones in an enum.
-enum PreservedErrno {
-  SCTP_EINPROGRESS = EINPROGRESS,
-  SCTP_EWOULDBLOCK = EWOULDBLOCK
-};
-}
-
-#include "webrtc/media/sctp/sctptransport.h"
-
-#include <stdarg.h>
-#include <stdio.h>
-
-#include <memory>
-#include <sstream>
-
-#include "usrsctplib/usrsctp.h"
-#include "webrtc/media/base/codec.h"
-#include "webrtc/media/base/mediaconstants.h"
-#include "webrtc/media/base/streamparams.h"
-#include "webrtc/p2p/base/dtlstransportinternal.h"  // For PF_NORMAL
-#include "webrtc/rtc_base/arraysize.h"
-#include "webrtc/rtc_base/copyonwritebuffer.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/helpers.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/safe_conversions.h"
-#include "webrtc/rtc_base/thread_checker.h"
-#include "webrtc/rtc_base/trace_event.h"
-
-namespace {
-
-// The biggest SCTP packet. Starting from a 'safe' wire MTU value of 1280,
-// take off 80 bytes for DTLS/TURN/TCP/IP overhead.
-static constexpr size_t kSctpMtu = 1200;
-
-// The size of the SCTP association send buffer.  256kB, the usrsctp default.
-static constexpr int kSendBufferSize = 262144;
-
-// Set the initial value of the static SCTP Data Engines reference count.
-int g_usrsctp_usage_count = 0;
-rtc::GlobalLockPod g_usrsctp_lock_;
-
-// DataMessageType is used for the SCTP "Payload Protocol Identifier", as
-// defined in http://tools.ietf.org/html/rfc4960#section-14.4
-//
-// For the list of IANA approved values see:
-// http://www.iana.org/assignments/sctp-parameters/sctp-parameters.xml
-// The value is not used by SCTP itself. It indicates the protocol running
-// on top of SCTP.
-enum PayloadProtocolIdentifier {
-  PPID_NONE = 0,  // No protocol is specified.
-  // Matches the PPIDs in mozilla source and
-  // https://datatracker.ietf.org/doc/draft-ietf-rtcweb-data-protocol Sec. 9
-  // They're not yet assigned by IANA.
-  PPID_CONTROL = 50,
-  PPID_BINARY_PARTIAL = 52,
-  PPID_BINARY_LAST = 53,
-  PPID_TEXT_PARTIAL = 54,
-  PPID_TEXT_LAST = 51
-};
-
-typedef std::set<uint32_t> StreamSet;
-
-// Returns a comma-separated, human-readable list of the stream IDs in 's'
-std::string ListStreams(const StreamSet& s) {
-  std::stringstream result;
-  bool first = true;
-  for (StreamSet::const_iterator it = s.begin(); it != s.end(); ++it) {
-    if (!first) {
-      result << ", " << *it;
-    } else {
-      result << *it;
-      first = false;
-    }
-  }
-  return result.str();
-}
-
-// Returns a pipe-separated, human-readable list of the SCTP_STREAM_RESET
-// flags in 'flags'
-std::string ListFlags(int flags) {
-  std::stringstream result;
-  bool first = true;
-// Skip past the first 12 chars (strlen("SCTP_STREAM_"))
-#define MAKEFLAG(X) \
-  { X, #X + 12 }
-  struct flaginfo_t {
-    int value;
-    const char* name;
-  } flaginfo[] = {MAKEFLAG(SCTP_STREAM_RESET_INCOMING_SSN),
-                  MAKEFLAG(SCTP_STREAM_RESET_OUTGOING_SSN),
-                  MAKEFLAG(SCTP_STREAM_RESET_DENIED),
-                  MAKEFLAG(SCTP_STREAM_RESET_FAILED),
-                  MAKEFLAG(SCTP_STREAM_CHANGE_DENIED)};
-#undef MAKEFLAG
-  for (uint32_t i = 0; i < arraysize(flaginfo); ++i) {
-    if (flags & flaginfo[i].value) {
-      if (!first)
-        result << " | ";
-      result << flaginfo[i].name;
-      first = false;
-    }
-  }
-  return result.str();
-}
-
-// Returns a comma-separated, human-readable list of the integers in 'array'.
-// All 'num_elems' of them.
-std::string ListArray(const uint16_t* array, int num_elems) {
-  std::stringstream result;
-  for (int i = 0; i < num_elems; ++i) {
-    if (i) {
-      result << ", " << array[i];
-    } else {
-      result << array[i];
-    }
-  }
-  return result.str();
-}
-
-// Helper for logging SCTP messages.
-void DebugSctpPrintf(const char* format, ...) {
-#if RTC_DCHECK_IS_ON
-  char s[255];
-  va_list ap;
-  va_start(ap, format);
-  vsnprintf(s, sizeof(s), format, ap);
-  LOG(LS_INFO) << "SCTP: " << s;
-  va_end(ap);
-#endif
-}
-
-// Get the PPID to use for the terminating fragment of this type.
-PayloadProtocolIdentifier GetPpid(cricket::DataMessageType type) {
-  switch (type) {
-    default:
-    case cricket::DMT_NONE:
-      return PPID_NONE;
-    case cricket::DMT_CONTROL:
-      return PPID_CONTROL;
-    case cricket::DMT_BINARY:
-      return PPID_BINARY_LAST;
-    case cricket::DMT_TEXT:
-      return PPID_TEXT_LAST;
-  }
-}
-
-bool GetDataMediaType(PayloadProtocolIdentifier ppid,
-                      cricket::DataMessageType* dest) {
-  RTC_DCHECK(dest != NULL);
-  switch (ppid) {
-    case PPID_BINARY_PARTIAL:
-    case PPID_BINARY_LAST:
-      *dest = cricket::DMT_BINARY;
-      return true;
-
-    case PPID_TEXT_PARTIAL:
-    case PPID_TEXT_LAST:
-      *dest = cricket::DMT_TEXT;
-      return true;
-
-    case PPID_CONTROL:
-      *dest = cricket::DMT_CONTROL;
-      return true;
-
-    case PPID_NONE:
-      *dest = cricket::DMT_NONE;
-      return true;
-
-    default:
-      return false;
-  }
-}
-
-// Log the packet in text2pcap format, if log level is at LS_VERBOSE.
-void VerboseLogPacket(const void* data, size_t length, int direction) {
-  if (LOG_CHECK_LEVEL(LS_VERBOSE) && length > 0) {
-    char* dump_buf;
-    // Some downstream project uses an older version of usrsctp that expects
-    // a non-const "void*" as first parameter when dumping the packet, so we
-    // need to cast the const away here to avoid a compiler error.
-    if ((dump_buf = usrsctp_dumppacket(const_cast<void*>(data), length,
-                                       direction)) != NULL) {
-      LOG(LS_VERBOSE) << dump_buf;
-      usrsctp_freedumpbuffer(dump_buf);
-    }
-  }
-}
-
-}  // namespace
-
-namespace cricket {
-
-// Handles global init/deinit, and mapping from usrsctp callbacks to
-// SctpTransport calls.
-class SctpTransport::UsrSctpWrapper {
- public:
-  static void InitializeUsrSctp() {
-    LOG(LS_INFO) << __FUNCTION__;
-    // First argument is udp_encapsulation_port, which is not releveant for our
-    // AF_CONN use of sctp.
-    usrsctp_init(0, &UsrSctpWrapper::OnSctpOutboundPacket, &DebugSctpPrintf);
-
-    // To turn on/off detailed SCTP debugging. You will also need to have the
-    // SCTP_DEBUG cpp defines flag.
-    // usrsctp_sysctl_set_sctp_debug_on(SCTP_DEBUG_ALL);
-
-    // TODO(ldixon): Consider turning this on/off.
-    usrsctp_sysctl_set_sctp_ecn_enable(0);
-
-    // This is harmless, but we should find out when the library default
-    // changes.
-    int send_size = usrsctp_sysctl_get_sctp_sendspace();
-    if (send_size != kSendBufferSize) {
-      LOG(LS_ERROR) << "Got different send size than expected: " << send_size;
-    }
-
-    // TODO(ldixon): Consider turning this on/off.
-    // This is not needed right now (we don't do dynamic address changes):
-    // If SCTP Auto-ASCONF is enabled, the peer is informed automatically
-    // when a new address is added or removed. This feature is enabled by
-    // default.
-    // usrsctp_sysctl_set_sctp_auto_asconf(0);
-
-    // TODO(ldixon): Consider turning this on/off.
-    // Add a blackhole sysctl. Setting it to 1 results in no ABORTs
-    // being sent in response to INITs, setting it to 2 results
-    // in no ABORTs being sent for received OOTB packets.
-    // This is similar to the TCP sysctl.
-    //
-    // See: http://lakerest.net/pipermail/sctp-coders/2012-January/009438.html
-    // See: http://svnweb.freebsd.org/base?view=revision&revision=229805
-    // usrsctp_sysctl_set_sctp_blackhole(2);
-
-    // Set the number of default outgoing streams. This is the number we'll
-    // send in the SCTP INIT message.
-    usrsctp_sysctl_set_sctp_nr_outgoing_streams_default(kMaxSctpStreams);
-  }
-
-  static void UninitializeUsrSctp() {
-    LOG(LS_INFO) << __FUNCTION__;
-    // usrsctp_finish() may fail if it's called too soon after the transports
-    // are
-    // closed. Wait and try again until it succeeds for up to 3 seconds.
-    for (size_t i = 0; i < 300; ++i) {
-      if (usrsctp_finish() == 0) {
-        return;
-      }
-
-      rtc::Thread::SleepMs(10);
-    }
-    LOG(LS_ERROR) << "Failed to shutdown usrsctp.";
-  }
-
-  static void IncrementUsrSctpUsageCount() {
-    rtc::GlobalLockScope lock(&g_usrsctp_lock_);
-    if (!g_usrsctp_usage_count) {
-      InitializeUsrSctp();
-    }
-    ++g_usrsctp_usage_count;
-  }
-
-  static void DecrementUsrSctpUsageCount() {
-    rtc::GlobalLockScope lock(&g_usrsctp_lock_);
-    --g_usrsctp_usage_count;
-    if (!g_usrsctp_usage_count) {
-      UninitializeUsrSctp();
-    }
-  }
-
-  // This is the callback usrsctp uses when there's data to send on the network
-  // that has been wrapped appropriatly for the SCTP protocol.
-  static int OnSctpOutboundPacket(void* addr,
-                                  void* data,
-                                  size_t length,
-                                  uint8_t tos,
-                                  uint8_t set_df) {
-    SctpTransport* transport = static_cast<SctpTransport*>(addr);
-    LOG(LS_VERBOSE) << "global OnSctpOutboundPacket():"
-                    << "addr: " << addr << "; length: " << length
-                    << "; tos: " << std::hex << static_cast<int>(tos)
-                    << "; set_df: " << std::hex << static_cast<int>(set_df);
-
-    VerboseLogPacket(data, length, SCTP_DUMP_OUTBOUND);
-    // Note: We have to copy the data; the caller will delete it.
-    rtc::CopyOnWriteBuffer buf(reinterpret_cast<uint8_t*>(data), length);
-    // TODO(deadbeef): Why do we need an AsyncInvoke here? We're already on the
-    // right thread and don't need to unwind the stack.
-    transport->invoker_.AsyncInvoke<void>(
-        RTC_FROM_HERE, transport->network_thread_,
-        rtc::Bind(&SctpTransport::OnPacketFromSctpToNetwork, transport, buf));
-    return 0;
-  }
-
-  // This is the callback called from usrsctp when data has been received, after
-  // a packet has been interpreted and parsed by usrsctp and found to contain
-  // payload data. It is called by a usrsctp thread. It is assumed this function
-  // will free the memory used by 'data'.
-  static int OnSctpInboundPacket(struct socket* sock,
-                                 union sctp_sockstore addr,
-                                 void* data,
-                                 size_t length,
-                                 struct sctp_rcvinfo rcv,
-                                 int flags,
-                                 void* ulp_info) {
-    SctpTransport* transport = static_cast<SctpTransport*>(ulp_info);
-    // Post data to the transport's receiver thread (copying it).
-    // TODO(ldixon): Unclear if copy is needed as this method is responsible for
-    // memory cleanup. But this does simplify code.
-    const PayloadProtocolIdentifier ppid =
-        static_cast<PayloadProtocolIdentifier>(
-            rtc::HostToNetwork32(rcv.rcv_ppid));
-    DataMessageType type = DMT_NONE;
-    if (!GetDataMediaType(ppid, &type) && !(flags & MSG_NOTIFICATION)) {
-      // It's neither a notification nor a recognized data packet.  Drop it.
-      LOG(LS_ERROR) << "Received an unknown PPID " << ppid
-                    << " on an SCTP packet.  Dropping.";
-    } else {
-      rtc::CopyOnWriteBuffer buffer;
-      ReceiveDataParams params;
-      buffer.SetData(reinterpret_cast<uint8_t*>(data), length);
-      params.sid = rcv.rcv_sid;
-      params.seq_num = rcv.rcv_ssn;
-      params.timestamp = rcv.rcv_tsn;
-      params.type = type;
-      // The ownership of the packet transfers to |invoker_|. Using
-      // CopyOnWriteBuffer is the most convenient way to do this.
-      transport->invoker_.AsyncInvoke<void>(
-          RTC_FROM_HERE, transport->network_thread_,
-          rtc::Bind(&SctpTransport::OnInboundPacketFromSctpToChannel, transport,
-                    buffer, params, flags));
-    }
-    free(data);
-    return 1;
-  }
-
-  static SctpTransport* GetTransportFromSocket(struct socket* sock) {
-    struct sockaddr* addrs = nullptr;
-    int naddrs = usrsctp_getladdrs(sock, 0, &addrs);
-    if (naddrs <= 0 || addrs[0].sa_family != AF_CONN) {
-      return nullptr;
-    }
-    // usrsctp_getladdrs() returns the addresses bound to this socket, which
-    // contains the SctpTransport* as sconn_addr.  Read the pointer,
-    // then free the list of addresses once we have the pointer.  We only open
-    // AF_CONN sockets, and they should all have the sconn_addr set to the
-    // pointer that created them, so [0] is as good as any other.
-    struct sockaddr_conn* sconn =
-        reinterpret_cast<struct sockaddr_conn*>(&addrs[0]);
-    SctpTransport* transport =
-        reinterpret_cast<SctpTransport*>(sconn->sconn_addr);
-    usrsctp_freeladdrs(addrs);
-
-    return transport;
-  }
-
-  static int SendThresholdCallback(struct socket* sock, uint32_t sb_free) {
-    // Fired on our I/O thread. SctpTransport::OnPacketReceived() gets
-    // a packet containing acknowledgments, which goes into usrsctp_conninput,
-    // and then back here.
-    SctpTransport* transport = GetTransportFromSocket(sock);
-    if (!transport) {
-      LOG(LS_ERROR)
-          << "SendThresholdCallback: Failed to get transport for socket "
-          << sock;
-      return 0;
-    }
-    transport->OnSendThresholdCallback();
-    return 0;
-  }
-};
-
-SctpTransport::SctpTransport(rtc::Thread* network_thread,
-                             rtc::PacketTransportInternal* channel)
-    : network_thread_(network_thread),
-      transport_channel_(channel),
-      was_ever_writable_(channel->writable()) {
-  RTC_DCHECK(network_thread_);
-  RTC_DCHECK(transport_channel_);
-  RTC_DCHECK_RUN_ON(network_thread_);
-  ConnectTransportChannelSignals();
-}
-
-SctpTransport::~SctpTransport() {
-  // Close abruptly; no reset procedure.
-  CloseSctpSocket();
-}
-
-void SctpTransport::SetTransportChannel(rtc::PacketTransportInternal* channel) {
-  RTC_DCHECK_RUN_ON(network_thread_);
-  RTC_DCHECK(channel);
-  DisconnectTransportChannelSignals();
-  transport_channel_ = channel;
-  ConnectTransportChannelSignals();
-  if (!was_ever_writable_ && channel->writable()) {
-    was_ever_writable_ = true;
-    // New channel is writable, now we can start the SCTP connection if Start
-    // was called already.
-    if (started_) {
-      RTC_DCHECK(!sock_);
-      Connect();
-    }
-  }
-}
-
-bool SctpTransport::Start(int local_sctp_port, int remote_sctp_port) {
-  RTC_DCHECK_RUN_ON(network_thread_);
-  if (local_sctp_port == -1) {
-    local_sctp_port = kSctpDefaultPort;
-  }
-  if (remote_sctp_port == -1) {
-    remote_sctp_port = kSctpDefaultPort;
-  }
-  if (started_) {
-    if (local_sctp_port != local_port_ || remote_sctp_port != remote_port_) {
-      LOG(LS_ERROR) << "Can't change SCTP port after SCTP association formed.";
-      return false;
-    }
-    return true;
-  }
-  local_port_ = local_sctp_port;
-  remote_port_ = remote_sctp_port;
-  started_ = true;
-  RTC_DCHECK(!sock_);
-  // Only try to connect if the DTLS channel has been writable before
-  // (indicating that the DTLS handshake is complete).
-  if (was_ever_writable_) {
-    return Connect();
-  }
-  return true;
-}
-
-bool SctpTransport::OpenStream(int sid) {
-  RTC_DCHECK_RUN_ON(network_thread_);
-  if (sid > kMaxSctpSid) {
-    LOG(LS_WARNING) << debug_name_ << "->OpenStream(...): "
-                    << "Not adding data stream "
-                    << "with sid=" << sid << " because sid is too high.";
-    return false;
-  } else if (open_streams_.find(sid) != open_streams_.end()) {
-    LOG(LS_WARNING) << debug_name_ << "->OpenStream(...): "
-                    << "Not adding data stream "
-                    << "with sid=" << sid << " because stream is already open.";
-    return false;
-  } else if (queued_reset_streams_.find(sid) != queued_reset_streams_.end() ||
-             sent_reset_streams_.find(sid) != sent_reset_streams_.end()) {
-    LOG(LS_WARNING) << debug_name_ << "->OpenStream(...): "
-                    << "Not adding data stream "
-                    << " with sid=" << sid
-                    << " because stream is still closing.";
-    return false;
-  }
-
-  open_streams_.insert(sid);
-  return true;
-}
-
-bool SctpTransport::ResetStream(int sid) {
-  RTC_DCHECK_RUN_ON(network_thread_);
-  StreamSet::iterator found = open_streams_.find(sid);
-  if (found == open_streams_.end()) {
-    LOG(LS_WARNING) << debug_name_ << "->ResetStream(" << sid << "): "
-                    << "stream not found.";
-    return false;
-  } else {
-    LOG(LS_VERBOSE) << debug_name_ << "->ResetStream(" << sid << "): "
-                    << "Removing and queuing RE-CONFIG chunk.";
-    open_streams_.erase(found);
-  }
-
-  // SCTP won't let you have more than one stream reset pending at a time, but
-  // you can close multiple streams in a single reset.  So, we keep an internal
-  // queue of streams-to-reset, and send them as one reset message in
-  // SendQueuedStreamResets().
-  queued_reset_streams_.insert(sid);
-
-  // Signal our stream-reset logic that it should try to send now, if it can.
-  SendQueuedStreamResets();
-
-  // The stream will actually get removed when we get the acknowledgment.
-  return true;
-}
-
-bool SctpTransport::SendData(const SendDataParams& params,
-                             const rtc::CopyOnWriteBuffer& payload,
-                             SendDataResult* result) {
-  RTC_DCHECK_RUN_ON(network_thread_);
-  if (result) {
-    // Preset |result| to assume an error.  If SendData succeeds, we'll
-    // overwrite |*result| once more at the end.
-    *result = SDR_ERROR;
-  }
-
-  if (!sock_) {
-    LOG(LS_WARNING) << debug_name_ << "->SendData(...): "
-                    << "Not sending packet with sid=" << params.sid
-                    << " len=" << payload.size() << " before Start().";
-    return false;
-  }
-
-  if (params.type != DMT_CONTROL &&
-      open_streams_.find(params.sid) == open_streams_.end()) {
-    LOG(LS_WARNING) << debug_name_ << "->SendData(...): "
-                    << "Not sending data because sid is unknown: "
-                    << params.sid;
-    return false;
-  }
-
-  // Send data using SCTP.
-  ssize_t send_res = 0;  // result from usrsctp_sendv.
-  struct sctp_sendv_spa spa = {0};
-  spa.sendv_flags |= SCTP_SEND_SNDINFO_VALID;
-  spa.sendv_sndinfo.snd_sid = params.sid;
-  spa.sendv_sndinfo.snd_ppid = rtc::HostToNetwork32(GetPpid(params.type));
-
-  // Ordered implies reliable.
-  if (!params.ordered) {
-    spa.sendv_sndinfo.snd_flags |= SCTP_UNORDERED;
-    if (params.max_rtx_count >= 0 || params.max_rtx_ms == 0) {
-      spa.sendv_flags |= SCTP_SEND_PRINFO_VALID;
-      spa.sendv_prinfo.pr_policy = SCTP_PR_SCTP_RTX;
-      spa.sendv_prinfo.pr_value = params.max_rtx_count;
-    } else {
-      spa.sendv_flags |= SCTP_SEND_PRINFO_VALID;
-      spa.sendv_prinfo.pr_policy = SCTP_PR_SCTP_TTL;
-      spa.sendv_prinfo.pr_value = params.max_rtx_ms;
-    }
-  }
-
-  // We don't fragment.
-  send_res = usrsctp_sendv(
-      sock_, payload.data(), static_cast<size_t>(payload.size()), NULL, 0, &spa,
-      rtc::checked_cast<socklen_t>(sizeof(spa)), SCTP_SENDV_SPA, 0);
-  if (send_res < 0) {
-    if (errno == SCTP_EWOULDBLOCK) {
-      *result = SDR_BLOCK;
-      ready_to_send_data_ = false;
-      LOG(LS_INFO) << debug_name_ << "->SendData(...): EWOULDBLOCK returned";
-    } else {
-      LOG_ERRNO(LS_ERROR) << "ERROR:" << debug_name_ << "->SendData(...): "
-                          << " usrsctp_sendv: ";
-    }
-    return false;
-  }
-  if (result) {
-    // Only way out now is success.
-    *result = SDR_SUCCESS;
-  }
-  return true;
-}
-
-bool SctpTransport::ReadyToSendData() {
-  RTC_DCHECK_RUN_ON(network_thread_);
-  return ready_to_send_data_;
-}
-
-void SctpTransport::ConnectTransportChannelSignals() {
-  RTC_DCHECK_RUN_ON(network_thread_);
-  transport_channel_->SignalWritableState.connect(
-      this, &SctpTransport::OnWritableState);
-  transport_channel_->SignalReadPacket.connect(this,
-                                               &SctpTransport::OnPacketRead);
-}
-
-void SctpTransport::DisconnectTransportChannelSignals() {
-  RTC_DCHECK_RUN_ON(network_thread_);
-  transport_channel_->SignalWritableState.disconnect(this);
-  transport_channel_->SignalReadPacket.disconnect(this);
-}
-
-bool SctpTransport::Connect() {
-  RTC_DCHECK_RUN_ON(network_thread_);
-  LOG(LS_VERBOSE) << debug_name_ << "->Connect().";
-
-  // If we already have a socket connection (which shouldn't ever happen), just
-  // return.
-  RTC_DCHECK(!sock_);
-  if (sock_) {
-    LOG(LS_ERROR) << debug_name_ << "->Connect(): Ignored as socket "
-                                    "is already established.";
-    return true;
-  }
-
-  // If no socket (it was closed) try to start it again. This can happen when
-  // the socket we are connecting to closes, does an sctp shutdown handshake,
-  // or behaves unexpectedly causing us to perform a CloseSctpSocket.
-  if (!OpenSctpSocket()) {
-    return false;
-  }
-
-  // Note: conversion from int to uint16_t happens on assignment.
-  sockaddr_conn local_sconn = GetSctpSockAddr(local_port_);
-  if (usrsctp_bind(sock_, reinterpret_cast<sockaddr*>(&local_sconn),
-                   sizeof(local_sconn)) < 0) {
-    LOG_ERRNO(LS_ERROR) << debug_name_
-                        << "->Connect(): " << ("Failed usrsctp_bind");
-    CloseSctpSocket();
-    return false;
-  }
-
-  // Note: conversion from int to uint16_t happens on assignment.
-  sockaddr_conn remote_sconn = GetSctpSockAddr(remote_port_);
-  int connect_result = usrsctp_connect(
-      sock_, reinterpret_cast<sockaddr*>(&remote_sconn), sizeof(remote_sconn));
-  if (connect_result < 0 && errno != SCTP_EINPROGRESS) {
-    LOG_ERRNO(LS_ERROR) << debug_name_ << "->Connect(): "
-                        << "Failed usrsctp_connect. got errno=" << errno
-                        << ", but wanted " << SCTP_EINPROGRESS;
-    CloseSctpSocket();
-    return false;
-  }
-  // Set the MTU and disable MTU discovery.
-  // We can only do this after usrsctp_connect or it has no effect.
-  sctp_paddrparams params = {{0}};
-  memcpy(&params.spp_address, &remote_sconn, sizeof(remote_sconn));
-  params.spp_flags = SPP_PMTUD_DISABLE;
-  params.spp_pathmtu = kSctpMtu;
-  if (usrsctp_setsockopt(sock_, IPPROTO_SCTP, SCTP_PEER_ADDR_PARAMS, &params,
-                         sizeof(params))) {
-    LOG_ERRNO(LS_ERROR) << debug_name_ << "->Connect(): "
-                        << "Failed to set SCTP_PEER_ADDR_PARAMS.";
-  }
-  // Since this is a fresh SCTP association, we'll always start out with empty
-  // queues, so "ReadyToSendData" should be true.
-  SetReadyToSendData();
-  return true;
-}
-
-bool SctpTransport::OpenSctpSocket() {
-  RTC_DCHECK_RUN_ON(network_thread_);
-  if (sock_) {
-    LOG(LS_WARNING) << debug_name_ << "->OpenSctpSocket(): "
-                    << "Ignoring attempt to re-create existing socket.";
-    return false;
-  }
-
-  UsrSctpWrapper::IncrementUsrSctpUsageCount();
-
-  // If kSendBufferSize isn't reflective of reality, we log an error, but we
-  // still have to do something reasonable here.  Look up what the buffer's
-  // real size is and set our threshold to something reasonable.
-  static const int kSendThreshold = usrsctp_sysctl_get_sctp_sendspace() / 2;
-
-  sock_ = usrsctp_socket(
-      AF_CONN, SOCK_STREAM, IPPROTO_SCTP, &UsrSctpWrapper::OnSctpInboundPacket,
-      &UsrSctpWrapper::SendThresholdCallback, kSendThreshold, this);
-  if (!sock_) {
-    LOG_ERRNO(LS_ERROR) << debug_name_ << "->OpenSctpSocket(): "
-                        << "Failed to create SCTP socket.";
-    UsrSctpWrapper::DecrementUsrSctpUsageCount();
-    return false;
-  }
-
-  if (!ConfigureSctpSocket()) {
-    usrsctp_close(sock_);
-    sock_ = nullptr;
-    UsrSctpWrapper::DecrementUsrSctpUsageCount();
-    return false;
-  }
-  // Register this class as an address for usrsctp. This is used by SCTP to
-  // direct the packets received (by the created socket) to this class.
-  usrsctp_register_address(this);
-  return true;
-}
-
-bool SctpTransport::ConfigureSctpSocket() {
-  RTC_DCHECK_RUN_ON(network_thread_);
-  RTC_DCHECK(sock_);
-  // Make the socket non-blocking. Connect, close, shutdown etc will not block
-  // the thread waiting for the socket operation to complete.
-  if (usrsctp_set_non_blocking(sock_, 1) < 0) {
-    LOG_ERRNO(LS_ERROR) << debug_name_ << "->ConfigureSctpSocket(): "
-                        << "Failed to set SCTP to non blocking.";
-    return false;
-  }
-
-  // This ensures that the usrsctp close call deletes the association. This
-  // prevents usrsctp from calling OnSctpOutboundPacket with references to
-  // this class as the address.
-  linger linger_opt;
-  linger_opt.l_onoff = 1;
-  linger_opt.l_linger = 0;
-  if (usrsctp_setsockopt(sock_, SOL_SOCKET, SO_LINGER, &linger_opt,
-                         sizeof(linger_opt))) {
-    LOG_ERRNO(LS_ERROR) << debug_name_ << "->ConfigureSctpSocket(): "
-                        << "Failed to set SO_LINGER.";
-    return false;
-  }
-
-  // Enable stream ID resets.
-  struct sctp_assoc_value stream_rst;
-  stream_rst.assoc_id = SCTP_ALL_ASSOC;
-  stream_rst.assoc_value = 1;
-  if (usrsctp_setsockopt(sock_, IPPROTO_SCTP, SCTP_ENABLE_STREAM_RESET,
-                         &stream_rst, sizeof(stream_rst))) {
-    LOG_ERRNO(LS_ERROR) << debug_name_ << "->ConfigureSctpSocket(): "
-
-                        << "Failed to set SCTP_ENABLE_STREAM_RESET.";
-    return false;
-  }
-
-  // Nagle.
-  uint32_t nodelay = 1;
-  if (usrsctp_setsockopt(sock_, IPPROTO_SCTP, SCTP_NODELAY, &nodelay,
-                         sizeof(nodelay))) {
-    LOG_ERRNO(LS_ERROR) << debug_name_ << "->ConfigureSctpSocket(): "
-                        << "Failed to set SCTP_NODELAY.";
-    return false;
-  }
-
-  // Subscribe to SCTP event notifications.
-  int event_types[] = {SCTP_ASSOC_CHANGE, SCTP_PEER_ADDR_CHANGE,
-                       SCTP_SEND_FAILED_EVENT, SCTP_SENDER_DRY_EVENT,
-                       SCTP_STREAM_RESET_EVENT};
-  struct sctp_event event = {0};
-  event.se_assoc_id = SCTP_ALL_ASSOC;
-  event.se_on = 1;
-  for (size_t i = 0; i < arraysize(event_types); i++) {
-    event.se_type = event_types[i];
-    if (usrsctp_setsockopt(sock_, IPPROTO_SCTP, SCTP_EVENT, &event,
-                           sizeof(event)) < 0) {
-      LOG_ERRNO(LS_ERROR) << debug_name_ << "->ConfigureSctpSocket(): "
-
-                          << "Failed to set SCTP_EVENT type: " << event.se_type;
-      return false;
-    }
-  }
-  return true;
-}
-
-void SctpTransport::CloseSctpSocket() {
-  RTC_DCHECK_RUN_ON(network_thread_);
-  if (sock_) {
-    // We assume that SO_LINGER option is set to close the association when
-    // close is called. This means that any pending packets in usrsctp will be
-    // discarded instead of being sent.
-    usrsctp_close(sock_);
-    sock_ = nullptr;
-    usrsctp_deregister_address(this);
-    UsrSctpWrapper::DecrementUsrSctpUsageCount();
-    ready_to_send_data_ = false;
-  }
-}
-
-bool SctpTransport::SendQueuedStreamResets() {
-  RTC_DCHECK_RUN_ON(network_thread_);
-  if (!sent_reset_streams_.empty() || queued_reset_streams_.empty()) {
-    return true;
-  }
-
-  LOG(LS_VERBOSE) << "SendQueuedStreamResets[" << debug_name_ << "]: Sending ["
-                  << ListStreams(queued_reset_streams_) << "], Open: ["
-                  << ListStreams(open_streams_) << "], Sent: ["
-                  << ListStreams(sent_reset_streams_) << "]";
-
-  const size_t num_streams = queued_reset_streams_.size();
-  const size_t num_bytes =
-      sizeof(struct sctp_reset_streams) + (num_streams * sizeof(uint16_t));
-
-  std::vector<uint8_t> reset_stream_buf(num_bytes, 0);
-  struct sctp_reset_streams* resetp =
-      reinterpret_cast<sctp_reset_streams*>(&reset_stream_buf[0]);
-  resetp->srs_assoc_id = SCTP_ALL_ASSOC;
-  resetp->srs_flags = SCTP_STREAM_RESET_INCOMING | SCTP_STREAM_RESET_OUTGOING;
-  resetp->srs_number_streams = rtc::checked_cast<uint16_t>(num_streams);
-  int result_idx = 0;
-  for (StreamSet::iterator it = queued_reset_streams_.begin();
-       it != queued_reset_streams_.end(); ++it) {
-    resetp->srs_stream_list[result_idx++] = *it;
-  }
-
-  int ret =
-      usrsctp_setsockopt(sock_, IPPROTO_SCTP, SCTP_RESET_STREAMS, resetp,
-                         rtc::checked_cast<socklen_t>(reset_stream_buf.size()));
-  if (ret < 0) {
-    LOG_ERRNO(LS_ERROR) << debug_name_ << "->SendQueuedStreamResets(): "
-                                          "Failed to send a stream reset for "
-                        << num_streams << " streams";
-    return false;
-  }
-
-  // sent_reset_streams_ is empty, and all the queued_reset_streams_ go into
-  // it now.
-  queued_reset_streams_.swap(sent_reset_streams_);
-  return true;
-}
-
-void SctpTransport::SetReadyToSendData() {
-  RTC_DCHECK_RUN_ON(network_thread_);
-  if (!ready_to_send_data_) {
-    ready_to_send_data_ = true;
-    SignalReadyToSendData();
-  }
-}
-
-void SctpTransport::OnWritableState(rtc::PacketTransportInternal* transport) {
-  RTC_DCHECK_RUN_ON(network_thread_);
-  RTC_DCHECK_EQ(transport_channel_, transport);
-  if (!was_ever_writable_ && transport->writable()) {
-    was_ever_writable_ = true;
-    if (started_) {
-      Connect();
-    }
-  }
-}
-
-// Called by network interface when a packet has been received.
-void SctpTransport::OnPacketRead(rtc::PacketTransportInternal* transport,
-                                 const char* data,
-                                 size_t len,
-                                 const rtc::PacketTime& packet_time,
-                                 int flags) {
-  RTC_DCHECK_RUN_ON(network_thread_);
-  RTC_DCHECK_EQ(transport_channel_, transport);
-  TRACE_EVENT0("webrtc", "SctpTransport::OnPacketRead");
-
-  if (flags & PF_SRTP_BYPASS) {
-    // We are only interested in SCTP packets.
-    return;
-  }
-
-  LOG(LS_VERBOSE) << debug_name_ << "->OnPacketRead(...): "
-                  << " length=" << len << ", started: " << started_;
-  // Only give receiving packets to usrsctp after if connected. This enables two
-  // peers to each make a connect call, but for them not to receive an INIT
-  // packet before they have called connect; least the last receiver of the INIT
-  // packet will have called connect, and a connection will be established.
-  if (sock_) {
-    // Pass received packet to SCTP stack. Once processed by usrsctp, the data
-    // will be will be given to the global OnSctpInboundData, and then,
-    // marshalled by the AsyncInvoker.
-    VerboseLogPacket(data, len, SCTP_DUMP_INBOUND);
-    usrsctp_conninput(this, data, len, 0);
-  } else {
-    // TODO(ldixon): Consider caching the packet for very slightly better
-    // reliability.
-  }
-}
-
-void SctpTransport::OnSendThresholdCallback() {
-  RTC_DCHECK_RUN_ON(network_thread_);
-  SetReadyToSendData();
-}
-
-sockaddr_conn SctpTransport::GetSctpSockAddr(int port) {
-  sockaddr_conn sconn = {0};
-  sconn.sconn_family = AF_CONN;
-#ifdef HAVE_SCONN_LEN
-  sconn.sconn_len = sizeof(sockaddr_conn);
-#endif
-  // Note: conversion from int to uint16_t happens here.
-  sconn.sconn_port = rtc::HostToNetwork16(port);
-  sconn.sconn_addr = this;
-  return sconn;
-}
-
-void SctpTransport::OnPacketFromSctpToNetwork(
-    const rtc::CopyOnWriteBuffer& buffer) {
-  RTC_DCHECK_RUN_ON(network_thread_);
-  if (buffer.size() > (kSctpMtu)) {
-    LOG(LS_ERROR) << debug_name_ << "->OnPacketFromSctpToNetwork(...): "
-                  << "SCTP seems to have made a packet that is bigger "
-                  << "than its official MTU: " << buffer.size() << " vs max of "
-                  << kSctpMtu;
-  }
-  TRACE_EVENT0("webrtc", "SctpTransport::OnPacketFromSctpToNetwork");
-
-  // Don't create noise by trying to send a packet when the DTLS channel isn't
-  // even writable.
-  if (!transport_channel_->writable()) {
-    return;
-  }
-
-  // Bon voyage.
-  transport_channel_->SendPacket(buffer.data<char>(), buffer.size(),
-                                 rtc::PacketOptions(), PF_NORMAL);
-}
-
-void SctpTransport::OnInboundPacketFromSctpToChannel(
-    const rtc::CopyOnWriteBuffer& buffer,
-    ReceiveDataParams params,
-    int flags) {
-  RTC_DCHECK_RUN_ON(network_thread_);
-  LOG(LS_VERBOSE) << debug_name_ << "->OnInboundPacketFromSctpToChannel(...): "
-                  << "Received SCTP data:"
-                  << " sid=" << params.sid
-                  << " notification: " << (flags & MSG_NOTIFICATION)
-                  << " length=" << buffer.size();
-  // Sending a packet with data == NULL (no data) is SCTPs "close the
-  // connection" message. This sets sock_ = NULL;
-  if (!buffer.size() || !buffer.data()) {
-    LOG(LS_INFO) << debug_name_ << "->OnInboundPacketFromSctpToChannel(...): "
-                                   "No data, closing.";
-    return;
-  }
-  if (flags & MSG_NOTIFICATION) {
-    OnNotificationFromSctp(buffer);
-  } else {
-    OnDataFromSctpToChannel(params, buffer);
-  }
-}
-
-void SctpTransport::OnDataFromSctpToChannel(
-    const ReceiveDataParams& params,
-    const rtc::CopyOnWriteBuffer& buffer) {
-  RTC_DCHECK_RUN_ON(network_thread_);
-  LOG(LS_VERBOSE) << debug_name_ << "->OnDataFromSctpToChannel(...): "
-                  << "Posting with length: " << buffer.size() << " on stream "
-                  << params.sid;
-  // Reports all received messages to upper layers, no matter whether the sid
-  // is known.
-  SignalDataReceived(params, buffer);
-}
-
-void SctpTransport::OnNotificationFromSctp(
-    const rtc::CopyOnWriteBuffer& buffer) {
-  RTC_DCHECK_RUN_ON(network_thread_);
-  const sctp_notification& notification =
-      reinterpret_cast<const sctp_notification&>(*buffer.data());
-  RTC_DCHECK(notification.sn_header.sn_length == buffer.size());
-
-  // TODO(ldixon): handle notifications appropriately.
-  switch (notification.sn_header.sn_type) {
-    case SCTP_ASSOC_CHANGE:
-      LOG(LS_VERBOSE) << "SCTP_ASSOC_CHANGE";
-      OnNotificationAssocChange(notification.sn_assoc_change);
-      break;
-    case SCTP_REMOTE_ERROR:
-      LOG(LS_INFO) << "SCTP_REMOTE_ERROR";
-      break;
-    case SCTP_SHUTDOWN_EVENT:
-      LOG(LS_INFO) << "SCTP_SHUTDOWN_EVENT";
-      break;
-    case SCTP_ADAPTATION_INDICATION:
-      LOG(LS_INFO) << "SCTP_ADAPTATION_INDICATION";
-      break;
-    case SCTP_PARTIAL_DELIVERY_EVENT:
-      LOG(LS_INFO) << "SCTP_PARTIAL_DELIVERY_EVENT";
-      break;
-    case SCTP_AUTHENTICATION_EVENT:
-      LOG(LS_INFO) << "SCTP_AUTHENTICATION_EVENT";
-      break;
-    case SCTP_SENDER_DRY_EVENT:
-      LOG(LS_VERBOSE) << "SCTP_SENDER_DRY_EVENT";
-      SetReadyToSendData();
-      break;
-    // TODO(ldixon): Unblock after congestion.
-    case SCTP_NOTIFICATIONS_STOPPED_EVENT:
-      LOG(LS_INFO) << "SCTP_NOTIFICATIONS_STOPPED_EVENT";
-      break;
-    case SCTP_SEND_FAILED_EVENT:
-      LOG(LS_INFO) << "SCTP_SEND_FAILED_EVENT";
-      break;
-    case SCTP_STREAM_RESET_EVENT:
-      OnStreamResetEvent(&notification.sn_strreset_event);
-      break;
-    case SCTP_ASSOC_RESET_EVENT:
-      LOG(LS_INFO) << "SCTP_ASSOC_RESET_EVENT";
-      break;
-    case SCTP_STREAM_CHANGE_EVENT:
-      LOG(LS_INFO) << "SCTP_STREAM_CHANGE_EVENT";
-      // An acknowledgment we get after our stream resets have gone through,
-      // if they've failed.  We log the message, but don't react -- we don't
-      // keep around the last-transmitted set of SSIDs we wanted to close for
-      // error recovery.  It doesn't seem likely to occur, and if so, likely
-      // harmless within the lifetime of a single SCTP association.
-      break;
-    default:
-      LOG(LS_WARNING) << "Unknown SCTP event: "
-                      << notification.sn_header.sn_type;
-      break;
-  }
-}
-
-void SctpTransport::OnNotificationAssocChange(const sctp_assoc_change& change) {
-  RTC_DCHECK_RUN_ON(network_thread_);
-  switch (change.sac_state) {
-    case SCTP_COMM_UP:
-      LOG(LS_VERBOSE) << "Association change SCTP_COMM_UP";
-      break;
-    case SCTP_COMM_LOST:
-      LOG(LS_INFO) << "Association change SCTP_COMM_LOST";
-      break;
-    case SCTP_RESTART:
-      LOG(LS_INFO) << "Association change SCTP_RESTART";
-      break;
-    case SCTP_SHUTDOWN_COMP:
-      LOG(LS_INFO) << "Association change SCTP_SHUTDOWN_COMP";
-      break;
-    case SCTP_CANT_STR_ASSOC:
-      LOG(LS_INFO) << "Association change SCTP_CANT_STR_ASSOC";
-      break;
-    default:
-      LOG(LS_INFO) << "Association change UNKNOWN";
-      break;
-  }
-}
-
-void SctpTransport::OnStreamResetEvent(
-    const struct sctp_stream_reset_event* evt) {
-  RTC_DCHECK_RUN_ON(network_thread_);
-  // A stream reset always involves two RE-CONFIG chunks for us -- we always
-  // simultaneously reset a sid's sequence number in both directions.  The
-  // requesting side transmits a RE-CONFIG chunk and waits for the peer to send
-  // one back.  Both sides get this SCTP_STREAM_RESET_EVENT when they receive
-  // RE-CONFIGs.
-  const int num_sids = (evt->strreset_length - sizeof(*evt)) /
-                       sizeof(evt->strreset_stream_list[0]);
-  LOG(LS_VERBOSE) << "SCTP_STREAM_RESET_EVENT(" << debug_name_
-                  << "): Flags = 0x" << std::hex << evt->strreset_flags << " ("
-                  << ListFlags(evt->strreset_flags) << ")";
-  LOG(LS_VERBOSE) << "Assoc = " << evt->strreset_assoc_id << ", Streams = ["
-                  << ListArray(evt->strreset_stream_list, num_sids)
-                  << "], Open: [" << ListStreams(open_streams_) << "], Q'd: ["
-                  << ListStreams(queued_reset_streams_) << "], Sent: ["
-                  << ListStreams(sent_reset_streams_) << "]";
-
-  // If both sides try to reset some streams at the same time (even if they're
-  // disjoint sets), we can get reset failures.
-  if (evt->strreset_flags & SCTP_STREAM_RESET_FAILED) {
-    // OK, just try again.  The stream IDs sent over when the RESET_FAILED flag
-    // is set seem to be garbage values.  Ignore them.
-    queued_reset_streams_.insert(sent_reset_streams_.begin(),
-                                 sent_reset_streams_.end());
-    sent_reset_streams_.clear();
-
-  } else if (evt->strreset_flags & SCTP_STREAM_RESET_INCOMING_SSN) {
-    // Each side gets an event for each direction of a stream.  That is,
-    // closing sid k will make each side receive INCOMING and OUTGOING reset
-    // events for k.  As per RFC6525, Section 5, paragraph 2, each side will
-    // get an INCOMING event first.
-    for (int i = 0; i < num_sids; i++) {
-      const int stream_id = evt->strreset_stream_list[i];
-
-      // See if this stream ID was closed by our peer or ourselves.
-      StreamSet::iterator it = sent_reset_streams_.find(stream_id);
-
-      // The reset was requested locally.
-      if (it != sent_reset_streams_.end()) {
-        LOG(LS_VERBOSE) << "SCTP_STREAM_RESET_EVENT(" << debug_name_
-                        << "): local sid " << stream_id << " acknowledged.";
-        sent_reset_streams_.erase(it);
-
-      } else if ((it = open_streams_.find(stream_id)) != open_streams_.end()) {
-        // The peer requested the reset.
-        LOG(LS_VERBOSE) << "SCTP_STREAM_RESET_EVENT(" << debug_name_
-                        << "): closing sid " << stream_id;
-        open_streams_.erase(it);
-        SignalStreamClosedRemotely(stream_id);
-
-      } else if ((it = queued_reset_streams_.find(stream_id)) !=
-                 queued_reset_streams_.end()) {
-        // The peer requested the reset, but there was a local reset
-        // queued.
-        LOG(LS_VERBOSE) << "SCTP_STREAM_RESET_EVENT(" << debug_name_
-                        << "): double-sided close for sid " << stream_id;
-        // Both sides want the stream closed, and the peer got to send the
-        // RE-CONFIG first.  Treat it like the local Remove(Send|Recv)Stream
-        // finished quickly.
-        queued_reset_streams_.erase(it);
-
-      } else {
-        // This stream is unknown.  Sometimes this can be from an
-        // RESET_FAILED-related retransmit.
-        LOG(LS_VERBOSE) << "SCTP_STREAM_RESET_EVENT(" << debug_name_
-                        << "): Unknown sid " << stream_id;
-      }
-    }
-  }
-
-  // Always try to send the queued RESET because this call indicates that the
-  // last local RESET or remote RESET has made some progress.
-  SendQueuedStreamResets();
-}
-
-}  // namespace cricket
diff --git a/media/sctp/sctptransport.h b/media/sctp/sctptransport.h
deleted file mode 100644
index 8733603..0000000
--- a/media/sctp/sctptransport.h
+++ /dev/null
@@ -1,193 +0,0 @@
-/*
- *  Copyright (c) 2012 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_MEDIA_SCTP_SCTPTRANSPORT_H_
-#define WEBRTC_MEDIA_SCTP_SCTPTRANSPORT_H_
-
-#include <errno.h>
-
-#include <memory>  // for unique_ptr.
-#include <set>
-#include <string>
-#include <vector>
-
-#include "webrtc/rtc_base/asyncinvoker.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/copyonwritebuffer.h"
-#include "webrtc/rtc_base/sigslot.h"
-#include "webrtc/rtc_base/thread.h"
-// For SendDataParams/ReceiveDataParams.
-#include "webrtc/media/base/mediachannel.h"
-#include "webrtc/media/sctp/sctptransportinternal.h"
-
-// Defined by "usrsctplib/usrsctp.h"
-struct sockaddr_conn;
-struct sctp_assoc_change;
-struct sctp_stream_reset_event;
-// Defined by <sys/socket.h>
-struct socket;
-namespace cricket {
-
-// Holds data to be passed on to a channel.
-struct SctpInboundPacket;
-
-// From channel calls, data flows like this:
-// [network thread (although it can in princple be another thread)]
-//  1.  SctpTransport::SendData(data)
-//  2.  usrsctp_sendv(data)
-// [network thread returns; sctp thread then calls the following]
-//  3.  OnSctpOutboundPacket(wrapped_data)
-// [sctp thread returns having async invoked on the network thread]
-//  4.  SctpTransport::OnPacketFromSctpToNetwork(wrapped_data)
-//  5.  TransportChannel::SendPacket(wrapped_data)
-//  6.  ... across network ... a packet is sent back ...
-//  7.  SctpTransport::OnPacketReceived(wrapped_data)
-//  8.  usrsctp_conninput(wrapped_data)
-// [network thread returns; sctp thread then calls the following]
-//  9.  OnSctpInboundData(data)
-// [sctp thread returns having async invoked on the network thread]
-//  10. SctpTransport::OnInboundPacketFromSctpToChannel(inboundpacket)
-//  11. SctpTransport::OnDataFromSctpToChannel(data)
-//  12. SctpTransport::SignalDataReceived(data)
-// [from the same thread, methods registered/connected to
-//  SctpTransport are called with the recieved data]
-// TODO(zhihuang): Rename "channel" to "transport" on network-level.
-class SctpTransport : public SctpTransportInternal,
-                      public sigslot::has_slots<> {
- public:
-  // |network_thread| is where packets will be processed and callbacks from
-  // this transport will be posted, and is the only thread on which public
-  // methods can be called.
-  // |channel| is required (must not be null).
-  SctpTransport(rtc::Thread* network_thread,
-                rtc::PacketTransportInternal* channel);
-  ~SctpTransport() override;
-
-  // SctpTransportInternal overrides (see sctptransportinternal.h for comments).
-  void SetTransportChannel(rtc::PacketTransportInternal* channel) override;
-  bool Start(int local_port, int remote_port) override;
-  bool OpenStream(int sid) override;
-  bool ResetStream(int sid) override;
-  bool SendData(const SendDataParams& params,
-                const rtc::CopyOnWriteBuffer& payload,
-                SendDataResult* result = nullptr) override;
-  bool ReadyToSendData() override;
-  void set_debug_name_for_testing(const char* debug_name) override {
-    debug_name_ = debug_name;
-  }
-
-  // Exposed to allow Post call from c-callbacks.
-  // TODO(deadbeef): Remove this or at least make it return a const pointer.
-  rtc::Thread* network_thread() const { return network_thread_; }
-
- private:
-  void ConnectTransportChannelSignals();
-  void DisconnectTransportChannelSignals();
-
-  // Creates the socket and connects.
-  bool Connect();
-
-  // Returns false when opening the socket failed.
-  bool OpenSctpSocket();
-  // Helpet method to set socket options.
-  bool ConfigureSctpSocket();
-  // Sets |sock_ |to nullptr.
-  void CloseSctpSocket();
-
-  // Sends a SCTP_RESET_STREAM for all streams in closing_ssids_.
-  bool SendQueuedStreamResets();
-
-  // Sets the "ready to send" flag and fires signal if needed.
-  void SetReadyToSendData();
-
-  // Callbacks from DTLS channel.
-  void OnWritableState(rtc::PacketTransportInternal* transport);
-  virtual void OnPacketRead(rtc::PacketTransportInternal* transport,
-                            const char* data,
-                            size_t len,
-                            const rtc::PacketTime& packet_time,
-                            int flags);
-
-  // Methods related to usrsctp callbacks.
-  void OnSendThresholdCallback();
-  sockaddr_conn GetSctpSockAddr(int port);
-
-  // Called using |invoker_| to send packet on the network.
-  void OnPacketFromSctpToNetwork(const rtc::CopyOnWriteBuffer& buffer);
-  // Called using |invoker_| to decide what to do with the packet.
-  // The |flags| parameter is used by SCTP to distinguish notification packets
-  // from other types of packets.
-  void OnInboundPacketFromSctpToChannel(const rtc::CopyOnWriteBuffer& buffer,
-                                        ReceiveDataParams params,
-                                        int flags);
-  void OnDataFromSctpToChannel(const ReceiveDataParams& params,
-                               const rtc::CopyOnWriteBuffer& buffer);
-  void OnNotificationFromSctp(const rtc::CopyOnWriteBuffer& buffer);
-  void OnNotificationAssocChange(const sctp_assoc_change& change);
-
-  void OnStreamResetEvent(const struct sctp_stream_reset_event* evt);
-
-  // Responsible for marshalling incoming data to the channels listeners, and
-  // outgoing data to the network interface.
-  rtc::Thread* network_thread_;
-  // Helps pass inbound/outbound packets asynchronously to the network thread.
-  rtc::AsyncInvoker invoker_;
-  // Underlying DTLS channel.
-  rtc::PacketTransportInternal* transport_channel_;
-  bool was_ever_writable_ = false;
-  int local_port_ = kSctpDefaultPort;
-  int remote_port_ = kSctpDefaultPort;
-  struct socket* sock_ = nullptr;  // The socket created by usrsctp_socket(...).
-
-  // Has Start been called? Don't create SCTP socket until it has.
-  bool started_ = false;
-  // Are we ready to queue data (SCTP socket created, and not blocked due to
-  // congestion control)? Different than |transport_channel_|'s "ready to
-  // send".
-  bool ready_to_send_data_ = false;
-
-  typedef std::set<uint32_t> StreamSet;
-  // When a data channel opens a stream, it goes into open_streams_.  When we
-  // want to close it, the stream's ID goes into queued_reset_streams_.  When
-  // we actually transmit a RE-CONFIG chunk with that stream ID, the ID goes
-  // into sent_reset_streams_.  When we get a response RE-CONFIG chunk back
-  // acknowledging the reset, we remove the stream ID from
-  // sent_reset_streams_.  We use sent_reset_streams_ to differentiate
-  // between acknowledgment RE-CONFIG and peer-initiated RE-CONFIGs.
-  StreamSet open_streams_;
-  StreamSet queued_reset_streams_;
-  StreamSet sent_reset_streams_;
-
-  // A static human-readable name for debugging messages.
-  const char* debug_name_ = "SctpTransport";
-  // Hides usrsctp interactions from this header file.
-  class UsrSctpWrapper;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(SctpTransport);
-};
-
-class SctpTransportFactory : public SctpTransportInternalFactory {
- public:
-  explicit SctpTransportFactory(rtc::Thread* network_thread)
-      : network_thread_(network_thread) {}
-
-  std::unique_ptr<SctpTransportInternal> CreateSctpTransport(
-      rtc::PacketTransportInternal* channel) override {
-    return std::unique_ptr<SctpTransportInternal>(
-        new SctpTransport(network_thread_, channel));
-  }
-
- private:
-  rtc::Thread* network_thread_;
-};
-
-}  // namespace cricket
-
-#endif  // WEBRTC_MEDIA_SCTP_SCTPTRANSPORT_H_
diff --git a/media/sctp/sctptransport_unittest.cc b/media/sctp/sctptransport_unittest.cc
deleted file mode 100644
index b2d7848..0000000
--- a/media/sctp/sctptransport_unittest.cc
+++ /dev/null
@@ -1,581 +0,0 @@
-/*
- *  Copyright (c) 2013 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 <errno.h>
-#include <stdarg.h>
-#include <stdio.h>
-
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "webrtc/media/sctp/sctptransport.h"
-#include "webrtc/p2p/base/fakedtlstransport.h"
-#include "webrtc/rtc_base/bind.h"
-#include "webrtc/rtc_base/copyonwritebuffer.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/gunit.h"
-#include "webrtc/rtc_base/helpers.h"
-#include "webrtc/rtc_base/ssladapter.h"
-#include "webrtc/rtc_base/thread.h"
-
-namespace {
-static const int kDefaultTimeout = 10000;  // 10 seconds.
-// Use ports other than the default 5000 for testing.
-static const int kTransport1Port = 5001;
-static const int kTransport2Port = 5002;
-}
-
-namespace cricket {
-
-// This is essentially a buffer to hold recieved data. It stores only the last
-// received data. Calling OnDataReceived twice overwrites old data with the
-// newer one.
-// TODO(ldixon): Implement constraints, and allow new data to be added to old
-// instead of replacing it.
-class SctpFakeDataReceiver : public sigslot::has_slots<> {
- public:
-  SctpFakeDataReceiver() : received_(false) {}
-
-  void Clear() {
-    received_ = false;
-    last_data_ = "";
-    last_params_ = ReceiveDataParams();
-  }
-
-  void OnDataReceived(const ReceiveDataParams& params,
-                      const rtc::CopyOnWriteBuffer& data) {
-    received_ = true;
-    last_data_ = std::string(data.data<char>(), data.size());
-    last_params_ = params;
-  }
-
-  bool received() const { return received_; }
-  std::string last_data() const { return last_data_; }
-  ReceiveDataParams last_params() const { return last_params_; }
-
- private:
-  bool received_;
-  std::string last_data_;
-  ReceiveDataParams last_params_;
-};
-
-class SignalReadyToSendObserver : public sigslot::has_slots<> {
- public:
-  SignalReadyToSendObserver() : signaled_(false) {}
-
-  void OnSignaled() { signaled_ = true; }
-
-  bool IsSignaled() { return signaled_; }
-
- private:
-  bool signaled_;
-};
-
-class SignalTransportClosedObserver : public sigslot::has_slots<> {
- public:
-  SignalTransportClosedObserver() {}
-  void BindSelf(SctpTransport* transport) {
-    transport->SignalStreamClosedRemotely.connect(
-        this, &SignalTransportClosedObserver::OnStreamClosed);
-  }
-  void OnStreamClosed(int stream) { streams_.push_back(stream); }
-
-  int StreamCloseCount(int stream) {
-    return std::count(streams_.begin(), streams_.end(), stream);
-  }
-
-  bool WasStreamClosed(int stream) {
-    return std::find(streams_.begin(), streams_.end(), stream) !=
-           streams_.end();
-  }
-
- private:
-  std::vector<int> streams_;
-};
-
-class SignalTransportClosedReopener : public sigslot::has_slots<> {
- public:
-  SignalTransportClosedReopener(SctpTransport* transport, SctpTransport* peer)
-      : transport_(transport), peer_(peer) {}
-
-  void OnStreamClosed(int stream) {
-    transport_->OpenStream(stream);
-    peer_->OpenStream(stream);
-    streams_.push_back(stream);
-  }
-
-  int StreamCloseCount(int stream) {
-    return std::count(streams_.begin(), streams_.end(), stream);
-  }
-
- private:
-  SctpTransport* transport_;
-  SctpTransport* peer_;
-  std::vector<int> streams_;
-};
-
-// SCTP Data Engine testing framework.
-class SctpTransportTest : public testing::Test, public sigslot::has_slots<> {
- protected:
-  // usrsctp uses the NSS random number generator on non-Android platforms,
-  // so we need to initialize SSL.
-  static void SetUpTestCase() {}
-
-  void SetupConnectedTransportsWithTwoStreams() {
-    SetupConnectedTransportsWithTwoStreams(kTransport1Port, kTransport2Port);
-  }
-
-  void SetupConnectedTransportsWithTwoStreams(int port1, int port2) {
-    fake_dtls1_.reset(new FakeDtlsTransport("fake dtls 1", 0));
-    fake_dtls2_.reset(new FakeDtlsTransport("fake dtls 2", 0));
-    recv1_.reset(new SctpFakeDataReceiver());
-    recv2_.reset(new SctpFakeDataReceiver());
-    transport1_.reset(CreateTransport(fake_dtls1_.get(), recv1_.get()));
-    transport1_->set_debug_name_for_testing("transport1");
-    transport1_->SignalReadyToSendData.connect(
-        this, &SctpTransportTest::OnChan1ReadyToSend);
-    transport2_.reset(CreateTransport(fake_dtls2_.get(), recv2_.get()));
-    transport2_->set_debug_name_for_testing("transport2");
-    transport2_->SignalReadyToSendData.connect(
-        this, &SctpTransportTest::OnChan2ReadyToSend);
-    // Setup two connected transports ready to send and receive.
-    bool asymmetric = false;
-    fake_dtls1_->SetDestination(fake_dtls2_.get(), asymmetric);
-
-    LOG(LS_VERBOSE) << "Transport setup ----------------------------- ";
-    AddStream(1);
-    AddStream(2);
-
-    LOG(LS_VERBOSE) << "Connect the transports -----------------------------";
-    // Both transports need to have started (with matching ports) for an
-    // association to be formed.
-    transport1_->Start(port1, port2);
-    transport2_->Start(port2, port1);
-  }
-
-  bool AddStream(int sid) {
-    bool ret = true;
-    ret = ret && transport1_->OpenStream(sid);
-    ret = ret && transport2_->OpenStream(sid);
-    return ret;
-  }
-
-  SctpTransport* CreateTransport(FakeDtlsTransport* fake_dtls,
-                                 SctpFakeDataReceiver* recv) {
-    SctpTransport* transport =
-        new SctpTransport(rtc::Thread::Current(), fake_dtls);
-    // When data is received, pass it to the SctpFakeDataReceiver.
-    transport->SignalDataReceived.connect(
-        recv, &SctpFakeDataReceiver::OnDataReceived);
-    return transport;
-  }
-
-  bool SendData(SctpTransport* chan,
-                int sid,
-                const std::string& msg,
-                SendDataResult* result) {
-    SendDataParams params;
-    params.sid = sid;
-
-    return chan->SendData(params, rtc::CopyOnWriteBuffer(&msg[0], msg.length()),
-                          result);
-  }
-
-  bool ReceivedData(const SctpFakeDataReceiver* recv,
-                    int sid,
-                    const std::string& msg) {
-    return (recv->received() && recv->last_params().sid == sid &&
-            recv->last_data() == msg);
-  }
-
-  bool ProcessMessagesUntilIdle() {
-    rtc::Thread* thread = rtc::Thread::Current();
-    while (!thread->empty()) {
-      rtc::Message msg;
-      if (thread->Get(&msg, rtc::Thread::kForever)) {
-        thread->Dispatch(&msg);
-      }
-    }
-    return !thread->IsQuitting();
-  }
-
-  SctpTransport* transport1() { return transport1_.get(); }
-  SctpTransport* transport2() { return transport2_.get(); }
-  SctpFakeDataReceiver* receiver1() { return recv1_.get(); }
-  SctpFakeDataReceiver* receiver2() { return recv2_.get(); }
-  FakeDtlsTransport* fake_dtls1() { return fake_dtls1_.get(); }
-  FakeDtlsTransport* fake_dtls2() { return fake_dtls2_.get(); }
-
-  int transport1_ready_to_send_count() {
-    return transport1_ready_to_send_count_;
-  }
-  int transport2_ready_to_send_count() {
-    return transport2_ready_to_send_count_;
-  }
-
- private:
-  std::unique_ptr<FakeDtlsTransport> fake_dtls1_;
-  std::unique_ptr<FakeDtlsTransport> fake_dtls2_;
-  std::unique_ptr<SctpFakeDataReceiver> recv1_;
-  std::unique_ptr<SctpFakeDataReceiver> recv2_;
-  std::unique_ptr<SctpTransport> transport1_;
-  std::unique_ptr<SctpTransport> transport2_;
-
-  int transport1_ready_to_send_count_ = 0;
-  int transport2_ready_to_send_count_ = 0;
-
-  void OnChan1ReadyToSend() { ++transport1_ready_to_send_count_; }
-  void OnChan2ReadyToSend() { ++transport2_ready_to_send_count_; }
-};
-
-// Test that data can be sent end-to-end when an SCTP transport starts with one
-// transport channel (which is unwritable), and then switches to another
-// channel. A common scenario due to how BUNDLE works.
-TEST_F(SctpTransportTest, SwitchTransportChannel) {
-  FakeDtlsTransport black_hole("black hole", 0);
-  FakeDtlsTransport fake_dtls1("fake dtls 1", 0);
-  FakeDtlsTransport fake_dtls2("fake dtls 2", 0);
-  SctpFakeDataReceiver recv1;
-  SctpFakeDataReceiver recv2;
-
-  // Construct transport1 with the "black hole" channel.
-  std::unique_ptr<SctpTransport> transport1(
-      CreateTransport(&black_hole, &recv1));
-  std::unique_ptr<SctpTransport> transport2(
-      CreateTransport(&fake_dtls2, &recv2));
-
-  // Add a stream.
-  transport1->OpenStream(1);
-  transport2->OpenStream(1);
-
-  // Tell them both to start (though transport1_ is connected to black_hole).
-  transport1->Start(kTransport1Port, kTransport2Port);
-  transport2->Start(kTransport2Port, kTransport1Port);
-
-  // Switch transport1_ to the normal fake_dtls1_ channel.
-  transport1->SetTransportChannel(&fake_dtls1);
-
-  // Connect the two fake DTLS channels.
-  bool asymmetric = false;
-  fake_dtls1.SetDestination(&fake_dtls2, asymmetric);
-
-  // Make sure we end up able to send data.
-  SendDataResult result;
-  ASSERT_TRUE(SendData(transport1.get(), 1, "foo", &result));
-  ASSERT_TRUE(SendData(transport2.get(), 1, "bar", &result));
-  EXPECT_TRUE_WAIT(ReceivedData(&recv2, 1, "foo"), kDefaultTimeout);
-  EXPECT_TRUE_WAIT(ReceivedData(&recv1, 1, "bar"), kDefaultTimeout);
-}
-
-// Calling Start twice shouldn't do anything bad, if with the same parameters.
-TEST_F(SctpTransportTest, DuplicateStartCallsIgnored) {
-  SetupConnectedTransportsWithTwoStreams();
-  EXPECT_TRUE(transport1()->Start(kTransport1Port, kTransport2Port));
-
-  // Make sure we can still send/recv data.
-  SendDataResult result;
-  ASSERT_TRUE(SendData(transport1(), 1, "foo", &result));
-  ASSERT_TRUE(SendData(transport2(), 1, "bar", &result));
-  EXPECT_TRUE_WAIT(ReceivedData(receiver2(), 1, "foo"), kDefaultTimeout);
-  EXPECT_TRUE_WAIT(ReceivedData(receiver1(), 1, "bar"), kDefaultTimeout);
-}
-
-// Calling Start a second time with a different port should fail.
-TEST_F(SctpTransportTest, CallingStartWithDifferentPortFails) {
-  SetupConnectedTransportsWithTwoStreams();
-  EXPECT_FALSE(transport1()->Start(kTransport1Port, 1234));
-  EXPECT_FALSE(transport1()->Start(1234, kTransport2Port));
-}
-
-// A value of -1 for the local/remote port should be treated as the default
-// (5000).
-TEST_F(SctpTransportTest, NegativeOnePortTreatedAsDefault) {
-  FakeDtlsTransport fake_dtls1("fake dtls 1", 0);
-  FakeDtlsTransport fake_dtls2("fake dtls 2", 0);
-  SctpFakeDataReceiver recv1;
-  SctpFakeDataReceiver recv2;
-  std::unique_ptr<SctpTransport> transport1(
-      CreateTransport(&fake_dtls1, &recv1));
-  std::unique_ptr<SctpTransport> transport2(
-      CreateTransport(&fake_dtls2, &recv2));
-
-  // Add a stream.
-  transport1->OpenStream(1);
-  transport2->OpenStream(1);
-
-  // Tell them both to start, giving one transport the default port and the
-  // other transport -1.
-  transport1->Start(kSctpDefaultPort, kSctpDefaultPort);
-  transport2->Start(-1, -1);
-
-  // Connect the two fake DTLS channels.
-  bool asymmetric = false;
-  fake_dtls1.SetDestination(&fake_dtls2, asymmetric);
-
-  // Make sure we end up able to send data.
-  SendDataResult result;
-  ASSERT_TRUE(SendData(transport1.get(), 1, "foo", &result));
-  ASSERT_TRUE(SendData(transport2.get(), 1, "bar", &result));
-  EXPECT_TRUE_WAIT(ReceivedData(&recv2, 1, "foo"), kDefaultTimeout);
-  EXPECT_TRUE_WAIT(ReceivedData(&recv1, 1, "bar"), kDefaultTimeout);
-}
-
-TEST_F(SctpTransportTest, OpenStreamWithAlreadyOpenedStreamFails) {
-  FakeDtlsTransport fake_dtls("fake dtls", 0);
-  SctpFakeDataReceiver recv;
-  std::unique_ptr<SctpTransport> transport(CreateTransport(&fake_dtls, &recv));
-  EXPECT_TRUE(transport->OpenStream(1));
-  EXPECT_FALSE(transport->OpenStream(1));
-}
-
-TEST_F(SctpTransportTest, ResetStreamWithAlreadyResetStreamFails) {
-  FakeDtlsTransport fake_dtls("fake dtls", 0);
-  SctpFakeDataReceiver recv;
-  std::unique_ptr<SctpTransport> transport(CreateTransport(&fake_dtls, &recv));
-  EXPECT_TRUE(transport->OpenStream(1));
-  EXPECT_TRUE(transport->ResetStream(1));
-  EXPECT_FALSE(transport->ResetStream(1));
-}
-
-// Test that SignalReadyToSendData is fired after Start has been called and the
-// DTLS channel is writable.
-TEST_F(SctpTransportTest, SignalReadyToSendDataAfterDtlsWritable) {
-  FakeDtlsTransport fake_dtls("fake dtls", 0);
-  SctpFakeDataReceiver recv;
-  std::unique_ptr<SctpTransport> transport(CreateTransport(&fake_dtls, &recv));
-
-  SignalReadyToSendObserver signal_observer;
-  transport->SignalReadyToSendData.connect(
-      &signal_observer, &SignalReadyToSendObserver::OnSignaled);
-
-  transport->Start(kSctpDefaultPort, kSctpDefaultPort);
-  fake_dtls.SetWritable(true);
-  EXPECT_TRUE_WAIT(signal_observer.IsSignaled(), kDefaultTimeout);
-}
-
-// Test that after an SCTP socket's buffer is filled, SignalReadyToSendData
-// is fired after it begins to be drained.
-TEST_F(SctpTransportTest, SignalReadyToSendDataAfterBlocked) {
-  SetupConnectedTransportsWithTwoStreams();
-  // Wait for initial SCTP association to be formed.
-  EXPECT_EQ_WAIT(1, transport1_ready_to_send_count(), kDefaultTimeout);
-  // Make the fake transport unwritable so that messages pile up for the SCTP
-  // socket.
-  fake_dtls1()->SetWritable(false);
-  // Send messages until we get EWOULDBLOCK.
-  static const int kMaxMessages = 1024;
-  SendDataParams params;
-  params.sid = 1;
-  rtc::CopyOnWriteBuffer buf(1024);
-  memset(buf.data<uint8_t>(), 0, 1024);
-  SendDataResult result;
-  int message_count;
-  for (message_count = 0; message_count < kMaxMessages; ++message_count) {
-    if (!transport1()->SendData(params, buf, &result) && result == SDR_BLOCK) {
-      break;
-    }
-  }
-  ASSERT_NE(kMaxMessages, message_count)
-      << "Sent max number of messages without getting SDR_BLOCK?";
-  // Make sure the ready-to-send count hasn't changed.
-  EXPECT_EQ(1, transport1_ready_to_send_count());
-  // Make the transport writable again and expect a "SignalReadyToSendData" at
-  // some point.
-  fake_dtls1()->SetWritable(true);
-  EXPECT_EQ_WAIT(2, transport1_ready_to_send_count(), kDefaultTimeout);
-}
-
-TEST_F(SctpTransportTest, SendData) {
-  SetupConnectedTransportsWithTwoStreams();
-
-  SendDataResult result;
-  LOG(LS_VERBOSE)
-      << "transport1 sending: 'hello?' -----------------------------";
-  ASSERT_TRUE(SendData(transport1(), 1, "hello?", &result));
-  EXPECT_EQ(SDR_SUCCESS, result);
-  EXPECT_TRUE_WAIT(ReceivedData(receiver2(), 1, "hello?"), kDefaultTimeout);
-  LOG(LS_VERBOSE) << "recv2.received=" << receiver2()->received()
-                  << ", recv2.last_params.sid="
-                  << receiver2()->last_params().sid
-                  << ", recv2.last_params.timestamp="
-                  << receiver2()->last_params().timestamp
-                  << ", recv2.last_params.seq_num="
-                  << receiver2()->last_params().seq_num
-                  << ", recv2.last_data=" << receiver2()->last_data();
-
-  LOG(LS_VERBOSE)
-      << "transport2 sending: 'hi transport1' -----------------------------";
-  ASSERT_TRUE(SendData(transport2(), 2, "hi transport1", &result));
-  EXPECT_EQ(SDR_SUCCESS, result);
-  EXPECT_TRUE_WAIT(ReceivedData(receiver1(), 2, "hi transport1"),
-                   kDefaultTimeout);
-  LOG(LS_VERBOSE) << "recv1.received=" << receiver1()->received()
-                  << ", recv1.last_params.sid="
-                  << receiver1()->last_params().sid
-                  << ", recv1.last_params.timestamp="
-                  << receiver1()->last_params().timestamp
-                  << ", recv1.last_params.seq_num="
-                  << receiver1()->last_params().seq_num
-                  << ", recv1.last_data=" << receiver1()->last_data();
-}
-
-// Sends a lot of large messages at once and verifies SDR_BLOCK is returned.
-TEST_F(SctpTransportTest, SendDataBlocked) {
-  SetupConnectedTransportsWithTwoStreams();
-
-  SendDataResult result;
-  SendDataParams params;
-  params.sid = 1;
-
-  std::vector<char> buffer(1024 * 64, 0);
-
-  for (size_t i = 0; i < 100; ++i) {
-    transport1()->SendData(
-        params, rtc::CopyOnWriteBuffer(&buffer[0], buffer.size()), &result);
-    if (result == SDR_BLOCK)
-      break;
-  }
-
-  EXPECT_EQ(SDR_BLOCK, result);
-}
-
-// Trying to send data for a nonexistent stream should fail.
-TEST_F(SctpTransportTest, SendDataWithNonexistentStreamFails) {
-  SetupConnectedTransportsWithTwoStreams();
-  SendDataResult result;
-  EXPECT_FALSE(SendData(transport2(), 123, "some data", &result));
-  EXPECT_EQ(SDR_ERROR, result);
-}
-
-TEST_F(SctpTransportTest, SendDataHighPorts) {
-  SetupConnectedTransportsWithTwoStreams(32768, 32769);
-
-  SendDataResult result;
-  ASSERT_TRUE(SendData(transport1(), 1, "hello?", &result));
-  EXPECT_EQ(SDR_SUCCESS, result);
-  EXPECT_TRUE_WAIT(ReceivedData(receiver2(), 1, "hello?"), kDefaultTimeout);
-
-  ASSERT_TRUE(SendData(transport2(), 2, "hi transport1", &result));
-  EXPECT_EQ(SDR_SUCCESS, result);
-  EXPECT_TRUE_WAIT(ReceivedData(receiver1(), 2, "hi transport1"),
-                   kDefaultTimeout);
-}
-
-TEST_F(SctpTransportTest, ClosesRemoteStream) {
-  SetupConnectedTransportsWithTwoStreams();
-  SignalTransportClosedObserver transport1_sig_receiver,
-      transport2_sig_receiver;
-  transport1_sig_receiver.BindSelf(transport1());
-  transport2_sig_receiver.BindSelf(transport2());
-
-  SendDataResult result;
-  ASSERT_TRUE(SendData(transport1(), 1, "hello?", &result));
-  EXPECT_EQ(SDR_SUCCESS, result);
-  EXPECT_TRUE_WAIT(ReceivedData(receiver2(), 1, "hello?"), kDefaultTimeout);
-  ASSERT_TRUE(SendData(transport2(), 2, "hi transport1", &result));
-  EXPECT_EQ(SDR_SUCCESS, result);
-  EXPECT_TRUE_WAIT(ReceivedData(receiver1(), 2, "hi transport1"),
-                   kDefaultTimeout);
-
-  // Close transport 1.  Transport 2 should notify us.
-  transport1()->ResetStream(1);
-  EXPECT_TRUE_WAIT(transport2_sig_receiver.WasStreamClosed(1), kDefaultTimeout);
-}
-
-TEST_F(SctpTransportTest, ClosesTwoRemoteStreams) {
-  SetupConnectedTransportsWithTwoStreams();
-  AddStream(3);
-  SignalTransportClosedObserver transport1_sig_receiver,
-      transport2_sig_receiver;
-  transport1_sig_receiver.BindSelf(transport1());
-  transport2_sig_receiver.BindSelf(transport2());
-
-  SendDataResult result;
-  ASSERT_TRUE(SendData(transport1(), 1, "hello?", &result));
-  EXPECT_EQ(SDR_SUCCESS, result);
-  EXPECT_TRUE_WAIT(ReceivedData(receiver2(), 1, "hello?"), kDefaultTimeout);
-  ASSERT_TRUE(SendData(transport2(), 2, "hi transport1", &result));
-  EXPECT_EQ(SDR_SUCCESS, result);
-  EXPECT_TRUE_WAIT(ReceivedData(receiver1(), 2, "hi transport1"),
-                   kDefaultTimeout);
-
-  // Close two streams on one side.
-  transport2()->ResetStream(2);
-  transport2()->ResetStream(3);
-  EXPECT_TRUE_WAIT(transport1_sig_receiver.WasStreamClosed(2), kDefaultTimeout);
-  EXPECT_TRUE_WAIT(transport1_sig_receiver.WasStreamClosed(3), kDefaultTimeout);
-}
-
-TEST_F(SctpTransportTest, ClosesStreamsOnBothSides) {
-  SetupConnectedTransportsWithTwoStreams();
-  AddStream(3);
-  AddStream(4);
-  SignalTransportClosedObserver transport1_sig_receiver,
-      transport2_sig_receiver;
-  transport1_sig_receiver.BindSelf(transport1());
-  transport2_sig_receiver.BindSelf(transport2());
-
-  SendDataResult result;
-  ASSERT_TRUE(SendData(transport1(), 1, "hello?", &result));
-  EXPECT_EQ(SDR_SUCCESS, result);
-  EXPECT_TRUE_WAIT(ReceivedData(receiver2(), 1, "hello?"), kDefaultTimeout);
-  ASSERT_TRUE(SendData(transport2(), 2, "hi transport1", &result));
-  EXPECT_EQ(SDR_SUCCESS, result);
-  EXPECT_TRUE_WAIT(ReceivedData(receiver1(), 2, "hi transport1"),
-                   kDefaultTimeout);
-
-  // Close one stream on transport1(), while closing three streams on
-  // transport2().  They will conflict (only one side can close anything at a
-  // time, apparently).  Test the resolution of the conflict.
-  transport1()->ResetStream(1);
-
-  transport2()->ResetStream(2);
-  transport2()->ResetStream(3);
-  transport2()->ResetStream(4);
-  EXPECT_TRUE_WAIT(transport2_sig_receiver.WasStreamClosed(1), kDefaultTimeout);
-  EXPECT_TRUE_WAIT(transport1_sig_receiver.WasStreamClosed(2), kDefaultTimeout);
-  EXPECT_TRUE_WAIT(transport1_sig_receiver.WasStreamClosed(3), kDefaultTimeout);
-  EXPECT_TRUE_WAIT(transport1_sig_receiver.WasStreamClosed(4), kDefaultTimeout);
-}
-
-TEST_F(SctpTransportTest, RefusesHighNumberedTransports) {
-  SetupConnectedTransportsWithTwoStreams();
-  EXPECT_TRUE(AddStream(kMaxSctpSid));
-  EXPECT_FALSE(AddStream(kMaxSctpSid + 1));
-}
-
-// Flaky, see webrtc:4453.
-TEST_F(SctpTransportTest, DISABLED_ReusesAStream) {
-  // Shut down transport 1, then open it up again for reuse.
-  SetupConnectedTransportsWithTwoStreams();
-  SendDataResult result;
-  SignalTransportClosedObserver transport2_sig_receiver;
-  transport2_sig_receiver.BindSelf(transport2());
-
-  ASSERT_TRUE(SendData(transport1(), 1, "hello?", &result));
-  EXPECT_EQ(SDR_SUCCESS, result);
-  EXPECT_TRUE_WAIT(ReceivedData(receiver2(), 1, "hello?"), kDefaultTimeout);
-
-  transport1()->ResetStream(1);
-  EXPECT_TRUE_WAIT(transport2_sig_receiver.WasStreamClosed(1), kDefaultTimeout);
-  // Transport 1 is gone now.
-
-  // Create a new transport 1.
-  AddStream(1);
-  ASSERT_TRUE(SendData(transport1(), 1, "hi?", &result));
-  EXPECT_EQ(SDR_SUCCESS, result);
-  EXPECT_TRUE_WAIT(ReceivedData(receiver2(), 1, "hi?"), kDefaultTimeout);
-  transport1()->ResetStream(1);
-  EXPECT_TRUE_WAIT(transport2_sig_receiver.StreamCloseCount(1) == 2,
-                   kDefaultTimeout);
-}
-
-}  // namespace cricket
diff --git a/media/sctp/sctptransportinternal.h b/media/sctp/sctptransportinternal.h
deleted file mode 100644
index 620fdd6..0000000
--- a/media/sctp/sctptransportinternal.h
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
- *  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_MEDIA_SCTP_SCTPTRANSPORTINTERNAL_H_
-#define WEBRTC_MEDIA_SCTP_SCTPTRANSPORTINTERNAL_H_
-
-// TODO(deadbeef): Move SCTP code out of media/, and make it not depend on
-// anything in media/.
-
-#include <memory>  // for unique_ptr
-#include <string>
-#include <vector>
-
-#include "webrtc/rtc_base/copyonwritebuffer.h"
-#include "webrtc/rtc_base/thread.h"
-// For SendDataParams/ReceiveDataParams.
-// TODO(deadbeef): Use something else for SCTP. It's confusing that we use an
-// SSRC field for SID.
-#include "webrtc/media/base/mediachannel.h"
-#include "webrtc/p2p/base/packettransportinternal.h"
-
-namespace cricket {
-
-// The number of outgoing streams that we'll negotiate. Since stream IDs (SIDs)
-// are 0-based, the highest usable SID is 1023.
-//
-// It's recommended to use the maximum of 65535 in:
-// https://tools.ietf.org/html/draft-ietf-rtcweb-data-channel-13#section-6.2
-// However, we use 1024 in order to save memory. usrsctp allocates 104 bytes
-// for each pair of incoming/outgoing streams (on a 64-bit system), so 65535
-// streams would waste ~6MB.
-//
-// Note: "max" and "min" here are inclusive.
-constexpr uint16_t kMaxSctpStreams = 1024;
-constexpr uint16_t kMaxSctpSid = kMaxSctpStreams - 1;
-constexpr uint16_t kMinSctpSid = 0;
-
-// This is the default SCTP port to use. It is passed along the wire and the
-// connectee and connector must be using the same port. It is not related to the
-// ports at the IP level. (Corresponds to: sockaddr_conn.sconn_port in
-// usrsctp.h)
-const int kSctpDefaultPort = 5000;
-
-// Abstract SctpTransport interface for use internally (by
-// PeerConnection/WebRtcSession/etc.). Exists to allow mock/fake SctpTransports
-// to be created.
-class SctpTransportInternal {
- public:
-  virtual ~SctpTransportInternal() {}
-
-  // Changes what underlying DTLS channel is uses. Used when switching which
-  // bundled transport the SctpTransport uses.
-  // Assumes |channel| is non-null.
-  virtual void SetTransportChannel(rtc::PacketTransportInternal* channel) = 0;
-
-  // When Start is called, connects as soon as possible; this can be called
-  // before DTLS completes, in which case the connection will begin when DTLS
-  // completes. This method can be called multiple times, though not if either
-  // of the ports are changed.
-  //
-  // |local_sctp_port| and |remote_sctp_port| are passed along the wire and the
-  // listener and connector must be using the same port. They are not related
-  // to the ports at the IP level. If set to -1, we default to
-  // kSctpDefaultPort.
-  //
-  // TODO(deadbeef): Add remote max message size as parameter to Start, once we
-  // start supporting it.
-  // TODO(deadbeef): Support calling Start with different local/remote ports
-  // and create a new association? Not clear if this is something we need to
-  // support though. See: https://github.com/w3c/webrtc-pc/issues/979
-  virtual bool Start(int local_sctp_port, int remote_sctp_port) = 0;
-
-  // NOTE: Initially there was a "Stop" method here, but it was never used, so
-  // it was removed.
-
-  // Informs SctpTransport that |sid| will start being used. Returns false if
-  // it is impossible to use |sid|, or if it's already in use.
-  // Until calling this, can't send data using |sid|.
-  // TODO(deadbeef): Actually implement the "returns false if |sid| can't be
-  // used" part. See:
-  // https://bugs.chromium.org/p/chromium/issues/detail?id=619849
-  virtual bool OpenStream(int sid) = 0;
-  // The inverse of OpenStream. When this method returns, the reset process may
-  // have not finished but it will have begun.
-  // TODO(deadbeef): We need a way to tell when it's done. See:
-  // https://bugs.chromium.org/p/webrtc/issues/detail?id=4453
-  virtual bool ResetStream(int sid) = 0;
-  // Send data down this channel (will be wrapped as SCTP packets then given to
-  // usrsctp that will then post the network interface).
-  // Returns true iff successful data somewhere on the send-queue/network.
-  // Uses |params.ssrc| as the SCTP sid.
-  virtual bool SendData(const SendDataParams& params,
-                        const rtc::CopyOnWriteBuffer& payload,
-                        SendDataResult* result = nullptr) = 0;
-
-  // Indicates when the SCTP socket is created and not blocked by congestion
-  // control. This changes to false when SDR_BLOCK is returned from SendData,
-  // and
-  // changes to true when SignalReadyToSendData is fired. The underlying DTLS/
-  // ICE channels may be unwritable while ReadyToSendData is true, because data
-  // can still be queued in usrsctp.
-  virtual bool ReadyToSendData() = 0;
-
-  sigslot::signal0<> SignalReadyToSendData;
-  // ReceiveDataParams includes SID, seq num, timestamp, etc. CopyOnWriteBuffer
-  // contains message payload.
-  sigslot::signal2<const ReceiveDataParams&, const rtc::CopyOnWriteBuffer&>
-      SignalDataReceived;
-  // Parameter is SID of closed stream.
-  sigslot::signal1<int> SignalStreamClosedRemotely;
-
-  // Helper for debugging.
-  virtual void set_debug_name_for_testing(const char* debug_name) = 0;
-};
-
-// Factory class which can be used to allow fake SctpTransports to be injected
-// for testing. Or, theoretically, SctpTransportInternal implementations that
-// use something other than usrsctp.
-class SctpTransportInternalFactory {
- public:
-  virtual ~SctpTransportInternalFactory() {}
-
-  // Create an SCTP transport using |channel| for the underlying transport.
-  virtual std::unique_ptr<SctpTransportInternal> CreateSctpTransport(
-      rtc::PacketTransportInternal* channel) = 0;
-};
-
-}  // namespace cricket
-
-#endif  // WEBRTC_MEDIA_SCTP_SCTPTRANSPORTINTERNAL_H_
diff --git a/modules/BUILD.gn b/modules/BUILD.gn
deleted file mode 100644
index ead7855..0000000
--- a/modules/BUILD.gn
+++ /dev/null
@@ -1,267 +0,0 @@
-# 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.
-
-import("../webrtc.gni")
-import("audio_coding/audio_coding.gni")
-
-group("modules") {
-  public_deps = [
-    "audio_coding",
-    "audio_conference_mixer",
-    "audio_device",
-    "audio_mixer",
-    "audio_processing",
-    "bitrate_controller",
-    "congestion_controller",
-    "desktop_capture",
-    "media_file",
-    "pacing",
-    "remote_bitrate_estimator",
-    "rtp_rtcp",
-    "utility",
-    "video_coding",
-    "video_processing",
-  ]
-}
-
-rtc_source_set("module_api") {
-  sources = [
-    "include/module.h",
-    "include/module_common_types.h",
-  ]
-  deps = [
-    "..:webrtc_common",
-    "../api:optional",
-    "../api:video_frame_api",
-    "../rtc_base:rtc_base_approved",
-  ]
-}
-
-if (rtc_include_tests) {
-  modules_tests_resources = [
-    "../../resources/audio_coding/testfile32kHz.pcm",
-    "../../resources/audio_coding/teststereo32kHz.pcm",
-    "../../resources/foreman_cif.yuv",
-    "../../resources/paris_qcif.yuv",
-  ]
-
-  if (is_ios) {
-    bundle_data("modules_tests_bundle_data") {
-      testonly = true
-      sources = modules_tests_resources
-      outputs = [
-        "{{bundle_resources_dir}}/{{source_file_part}}",
-      ]
-    }
-  }
-
-  rtc_test("modules_tests") {
-    testonly = true
-
-    deps = [
-      "../test:test_main",
-      "../test:video_test_common",
-      "audio_coding:audio_coding_modules_tests",
-      "desktop_capture:desktop_capture_modules_tests",
-      "rtp_rtcp:rtp_rtcp_modules_tests",
-      "video_coding:video_coding_modules_tests",
-      "//testing/gmock",
-      "//testing/gtest",
-    ]
-
-    data = modules_tests_resources
-
-    if (is_android) {
-      deps += [
-        # NOTE(brandtr): Including Java classes seems only to be possible from
-        # rtc_test targets. Therefore we include this target here, instead of
-        # in video_coding_modules_tests, where it is actually used.
-        "../sdk/android:libjingle_peerconnection_java",
-        "//testing/android/native_test:native_test_native_code",
-      ]
-      shard_timeout = 900
-    }
-
-    if (is_ios) {
-      deps += [ ":modules_tests_bundle_data" ]
-    }
-
-    if (!build_with_chromium && is_clang) {
-      # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-    }
-    if (is_win) {
-      cflags = [
-        # TODO(phoglund): get rid of 4373 supression when
-        # http://code.google.com/p/webrtc/issues/detail?id=261 is solved.
-        # legacy warning for ignoring const / volatile in signatures.
-        "/wd4373",
-      ]
-    }
-  }
-
-  modules_unittests_resources = [
-    "../../resources/att-downlink.rx",
-    "../../resources/att-uplink.rx",
-    "../../resources/audio_coding/neteq_opus.rtp",
-    "../../resources/audio_coding/neteq_universal_new.rtp",
-    "../../resources/audio_coding/speech_mono_16kHz.pcm",
-    "../../resources/audio_coding/speech_mono_32_48kHz.pcm",
-    "../../resources/audio_coding/testfile32kHz.pcm",
-    "../../resources/audio_coding/teststereo32kHz.pcm",
-    "../../resources/audio_device/audio_short16.pcm",
-    "../../resources/audio_device/audio_short44.pcm",
-    "../../resources/audio_device/audio_short48.pcm",
-    "../../resources/audio_processing/agc/agc_audio.pcm",
-    "../../resources/audio_processing/agc/agc_no_circular_buffer.dat",
-    "../../resources/audio_processing/agc/agc_pitch_gain.dat",
-    "../../resources/audio_processing/agc/agc_pitch_lag.dat",
-    "../../resources/audio_processing/agc/agc_spectral_peak.dat",
-    "../../resources/audio_processing/agc/agc_vad.dat",
-    "../../resources/audio_processing/agc/agc_voicing_prob.dat",
-    "../../resources/audio_processing/agc/agc_with_circular_buffer.dat",
-    "../../resources/audio_processing/output_data_fixed.pb",
-    "../../resources/audio_processing/output_data_float.pb",
-    "../../resources/audio_processing/output_data_mac.pb",
-    "../../resources/audio_processing/transient/ajm-macbook-1-spke16m.pcm",
-    "../../resources/audio_processing/transient/audio16kHz.pcm",
-    "../../resources/audio_processing/transient/audio32kHz.pcm",
-    "../../resources/audio_processing/transient/audio48kHz.pcm",
-    "../../resources/audio_processing/transient/audio8kHz.pcm",
-    "../../resources/audio_processing/transient/detect16kHz.dat",
-    "../../resources/audio_processing/transient/detect32kHz.dat",
-    "../../resources/audio_processing/transient/detect48kHz.dat",
-    "../../resources/audio_processing/transient/detect8kHz.dat",
-    "../../resources/audio_processing/transient/double-utils.dat",
-    "../../resources/audio_processing/transient/float-utils.dat",
-    "../../resources/audio_processing/transient/suppressed16kHz.pcm",
-    "../../resources/audio_processing/transient/suppressed32kHz.pcm",
-    "../../resources/audio_processing/transient/suppressed8kHz.pcm",
-    "../../resources/audio_processing/transient/wpd0.dat",
-    "../../resources/audio_processing/transient/wpd1.dat",
-    "../../resources/audio_processing/transient/wpd2.dat",
-    "../../resources/audio_processing/transient/wpd3.dat",
-    "../../resources/audio_processing/transient/wpd4.dat",
-    "../../resources/audio_processing/transient/wpd5.dat",
-    "../../resources/audio_processing/transient/wpd6.dat",
-    "../../resources/audio_processing/transient/wpd7.dat",
-    "../../resources/deflicker_before_cif_short.yuv",
-    "../../resources/far16_stereo.pcm",
-    "../../resources/far32_stereo.pcm",
-    "../../resources/far44_stereo.pcm",
-    "../../resources/far48_stereo.pcm",
-    "../../resources/far8_stereo.pcm",
-    "../../resources/foremanColorEnhanced_cif_short.yuv",
-    "../../resources/foreman_cif.yuv",
-    "../../resources/foreman_cif_short.yuv",
-    "../../resources/near16_stereo.pcm",
-    "../../resources/near32_stereo.pcm",
-    "../../resources/near44_stereo.pcm",
-    "../../resources/near48_stereo.pcm",
-    "../../resources/near8_stereo.pcm",
-    "../../resources/ref03.aecdump",
-    "../../resources/remote_bitrate_estimator/VideoSendersTest_BweTest_IncreasingChoke1_0_AST.bin",
-    "../../resources/remote_bitrate_estimator/VideoSendersTest_BweTest_IncreasingChoke1_0_TOF.bin",
-    "../../resources/remote_bitrate_estimator/VideoSendersTest_BweTest_IncreasingChoke1_1_AST.bin",
-    "../../resources/remote_bitrate_estimator/VideoSendersTest_BweTest_IncreasingChoke1_1_TOF.bin",
-    "../../resources/remote_bitrate_estimator/VideoSendersTest_BweTest_IncreasingChoke2_0_AST.bin",
-    "../../resources/remote_bitrate_estimator/VideoSendersTest_BweTest_IncreasingChoke2_0_TOF.bin",
-    "../../resources/remote_bitrate_estimator/VideoSendersTest_BweTest_IncreasingChoke2_1_AST.bin",
-    "../../resources/remote_bitrate_estimator/VideoSendersTest_BweTest_IncreasingChoke2_1_TOF.bin",
-    "../../resources/remote_bitrate_estimator/VideoSendersTest_BweTest_IncreasingDelay1_0_AST.bin",
-    "../../resources/remote_bitrate_estimator/VideoSendersTest_BweTest_IncreasingDelay1_0_TOF.bin",
-    "../../resources/remote_bitrate_estimator/VideoSendersTest_BweTest_IncreasingLoss1_0_AST.bin",
-    "../../resources/remote_bitrate_estimator/VideoSendersTest_BweTest_IncreasingLoss1_0_TOF.bin",
-    "../../resources/remote_bitrate_estimator/VideoSendersTest_BweTest_Multi1_1_AST.bin",
-    "../../resources/remote_bitrate_estimator/VideoSendersTest_BweTest_Multi1_1_TOF.bin",
-    "../../resources/remote_bitrate_estimator/VideoSendersTest_BweTest_SteadyChoke_0_AST.bin",
-    "../../resources/remote_bitrate_estimator/VideoSendersTest_BweTest_SteadyChoke_0_TOF.bin",
-    "../../resources/remote_bitrate_estimator/VideoSendersTest_BweTest_SteadyChoke_1_AST.bin",
-    "../../resources/remote_bitrate_estimator/VideoSendersTest_BweTest_SteadyChoke_1_TOF.bin",
-    "../../resources/remote_bitrate_estimator/VideoSendersTest_BweTest_SteadyDelay_0_AST.bin",
-    "../../resources/remote_bitrate_estimator/VideoSendersTest_BweTest_SteadyDelay_0_TOF.bin",
-    "../../resources/remote_bitrate_estimator/VideoSendersTest_BweTest_SteadyLoss_0_AST.bin",
-    "../../resources/remote_bitrate_estimator/VideoSendersTest_BweTest_SteadyLoss_0_TOF.bin",
-    "../../resources/remote_bitrate_estimator/VideoSendersTest_BweTest_UnlimitedSpeed_0_AST.bin",
-    "../../resources/remote_bitrate_estimator/VideoSendersTest_BweTest_UnlimitedSpeed_0_TOF.bin",
-    "../../resources/short_mixed_mono_48.dat",
-    "../../resources/short_mixed_mono_48_arm.dat",
-    "../../resources/short_mixed_mono_48.pcm",
-    "../../resources/short_mixed_stereo_48.dat",
-    "../../resources/short_mixed_stereo_48.pcm",
-    "../../resources/sprint-downlink.rx",
-    "../../resources/sprint-uplink.rx",
-    "../../resources/synthetic-trace.rx",
-    "../../resources/tmobile-downlink.rx",
-    "../../resources/tmobile-uplink.rx",
-    "../../resources/verizon3g-downlink.rx",
-    "../../resources/verizon3g-uplink.rx",
-    "../../resources/verizon4g-downlink.rx",
-    "../../resources/verizon4g-uplink.rx",
-    "../../resources/voice_engine/audio_tiny48.wav",
-  ]
-  if (is_ios) {
-    bundle_data("modules_unittests_bundle_data") {
-      testonly = true
-      sources = modules_unittests_resources
-      outputs = [
-        "{{bundle_resources_dir}}/{{source_file_part}}",
-      ]
-    }
-  }
-
-  rtc_test("modules_unittests") {
-    testonly = true
-    defines = []
-    sources = [
-      "module_common_types_unittest.cc",
-    ]
-
-    if (!build_with_chromium && is_clang) {
-      # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-    }
-
-    deps = [
-      ":module_api",
-      "../test:test_main",
-      "audio_coding:audio_coding_unittests",
-      "audio_conference_mixer:audio_conference_mixer_unittests",
-      "audio_device:audio_device_unittests",
-      "audio_mixer:audio_mixer_unittests",
-      "audio_processing:audio_processing_unittests",
-      "bitrate_controller:bitrate_controller_unittests",
-      "congestion_controller:congestion_controller_unittests",
-      "desktop_capture:desktop_capture_unittests",
-      "media_file:media_file_unittests",
-      "pacing:pacing_unittests",
-      "remote_bitrate_estimator:remote_bitrate_estimator_unittests",
-      "rtp_rtcp:rtp_rtcp_unittests",
-      "utility:utility_unittests",
-      "video_capture",
-      "video_coding:video_coding_unittests",
-      "video_processing:video_processing_unittests",
-    ]
-
-    data = modules_unittests_resources
-
-    if (is_android) {
-      deps += [
-        "../sdk/android:libjingle_peerconnection_java",
-        "//testing/android/native_test:native_test_support",
-      ]
-      shard_timeout = 900
-    }
-    if (is_ios) {
-      info_plist = "../test/ios/Info.plist"
-      deps += [ ":modules_unittests_bundle_data" ]
-      configs += [ "..:common_objc" ]
-      ldflags = [ "-ObjC" ]
-    }
-  }
-}
diff --git a/modules/OWNERS b/modules/OWNERS
deleted file mode 100644
index 353039c..0000000
--- a/modules/OWNERS
+++ /dev/null
@@ -1,4 +0,0 @@
-# These are for the common case of adding or renaming files. If you're doing
-# structural changes, please get a review from a reviewer in this file.
-per-file *.gn=*
-per-file *.gni=*
diff --git a/modules/audio_coding/BUILD.gn b/modules/audio_coding/BUILD.gn
deleted file mode 100644
index d415098..0000000
--- a/modules/audio_coding/BUILD.gn
+++ /dev/null
@@ -1,2282 +0,0 @@
-# Copyright (c) 2014 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.
-
-import("../../webrtc.gni")
-import("audio_coding.gni")
-import("//build/config/arm.gni")
-import("//third_party/protobuf/proto_library.gni")
-
-audio_codec_deps = [
-  ":cng",
-  ":g711",
-  ":pcm16b",
-]
-if (rtc_include_ilbc) {
-  audio_codec_deps += [ ":ilbc" ]
-}
-if (rtc_include_opus) {
-  audio_codec_deps += [ ":webrtc_opus" ]
-}
-if (!build_with_mozilla) {
-  if (current_cpu == "arm") {
-    audio_codec_deps += [ ":isac_fix" ]
-  } else {
-    audio_codec_deps += [ ":isac" ]
-  }
-  audio_codec_deps += [ ":g722" ]
-}
-if (!build_with_mozilla && !build_with_chromium) {
-  audio_codec_deps += [ ":red" ]
-}
-audio_coding_deps = audio_codec_deps + [
-                      "../..:webrtc_common",
-                      "../../common_audio",
-                      "../../system_wrappers",
-                    ]
-
-rtc_static_library("audio_format_conversion") {
-  sources = [
-    "codecs/audio_format_conversion.cc",
-    "codecs/audio_format_conversion.h",
-  ]
-  deps = [
-    "../..:webrtc_common",
-    "../../api:array_view",
-    "../../api:optional",
-    "../../api/audio_codecs:audio_codecs_api",
-    "../../rtc_base:rtc_base_approved",
-  ]
-}
-
-rtc_static_library("rent_a_codec") {
-  sources = [
-    "acm2/acm_codec_database.cc",
-    "acm2/acm_codec_database.h",
-    "acm2/rent_a_codec.cc",
-    "acm2/rent_a_codec.h",
-  ]
-  deps = [
-           "../../api:array_view",
-           "../../api:optional",
-           "../../api/audio_codecs:audio_codecs_api",
-           "../..:webrtc_common",
-           "../../rtc_base:protobuf_utils",
-           "../../rtc_base:rtc_base_approved",
-           "../../system_wrappers",
-           ":audio_coding_module_typedefs",
-           ":isac_common",
-           ":isac_fix_c",
-           ":neteq_decoder_enum",
-         ] + audio_codec_deps
-
-  defines = audio_codec_defines
-}
-
-config("audio_coding_config") {
-  include_dirs = [
-    "include",
-    "../include",
-  ]
-}
-
-rtc_source_set("audio_coding_module_typedefs") {
-  sources = [
-    "include/audio_coding_module_typedefs.h",
-  ]
-  deps = [
-    "..:module_api",
-    "../..:webrtc_common",
-  ]
-}
-
-rtc_static_library("audio_coding") {
-  sources = [
-    "acm2/acm_receiver.cc",
-    "acm2/acm_receiver.h",
-    "acm2/acm_resampler.cc",
-    "acm2/acm_resampler.h",
-    "acm2/audio_coding_module.cc",
-    "acm2/call_statistics.cc",
-    "acm2/call_statistics.h",
-    "acm2/codec_manager.cc",
-    "acm2/codec_manager.h",
-    "include/audio_coding_module.h",
-  ]
-
-  defines = []
-
-  public_configs = [ ":audio_coding_config" ]
-
-  if (rtc_include_opus) {
-    public_deps = [
-      ":webrtc_opus",
-    ]
-  }
-
-  if (is_win) {
-    cflags = [
-      # TODO(kjellander): Bug 261: fix this warning.
-      "/wd4373",  # virtual function override.
-    ]
-  }
-
-  deps = audio_coding_deps + [
-           "..:module_api",
-           "../../api:array_view",
-           "../../api/audio_codecs:audio_codecs_api",
-           "../../api/audio_codecs:builtin_audio_decoder_factory",
-           ":audio_coding_module_typedefs",
-           ":neteq",
-           ":rent_a_codec",
-           "../../rtc_base:rtc_base_approved",
-           "../../api:optional",
-           "../../logging:rtc_event_log_api",
-         ]
-  defines = audio_coding_defines
-}
-
-rtc_static_library("legacy_encoded_audio_frame") {
-  sources = [
-    "codecs/legacy_encoded_audio_frame.cc",
-    "codecs/legacy_encoded_audio_frame.h",
-  ]
-  deps = [
-    "../../api:array_view",
-    "../../api/audio_codecs:audio_codecs_api",
-    "../../rtc_base:rtc_base_approved",
-  ]
-}
-
-config("cng_config") {
-  include_dirs = [
-    "../../..",
-    "codecs/cng/include",
-  ]
-}
-
-rtc_static_library("cng") {
-  sources = [
-    "codecs/cng/audio_encoder_cng.cc",
-    "codecs/cng/audio_encoder_cng.h",
-    "codecs/cng/webrtc_cng.cc",
-    "codecs/cng/webrtc_cng.h",
-  ]
-
-  public_configs = [ ":cng_config" ]
-
-  deps = [
-    "../..:webrtc_common",
-    "../../api:array_view",
-    "../../api/audio_codecs:audio_codecs_api",
-    "../../common_audio",
-    "../../rtc_base:rtc_base_approved",
-  ]
-}
-
-config("red_config") {
-  include_dirs = [ "codecs/red" ]
-}
-
-rtc_static_library("red") {
-  sources = [
-    "codecs/red/audio_encoder_copy_red.cc",
-    "codecs/red/audio_encoder_copy_red.h",
-  ]
-
-  public_configs = [ ":red_config" ]
-
-  deps = [
-    "../../api/audio_codecs:audio_codecs_api",
-    "../../common_audio",
-    "../../rtc_base:rtc_base_approved",
-  ]
-}
-
-config("g711_config") {
-  include_dirs = [
-    "../../..",
-    "codecs/g711/include",
-  ]
-}
-
-rtc_static_library("g711") {
-  sources = [
-    "codecs/g711/audio_decoder_pcm.cc",
-    "codecs/g711/audio_decoder_pcm.h",
-    "codecs/g711/audio_encoder_pcm.cc",
-    "codecs/g711/audio_encoder_pcm.h",
-  ]
-
-  public_configs = [ ":g711_config" ]
-
-  deps = [
-    ":legacy_encoded_audio_frame",
-    "../..:webrtc_common",
-    "../../api/audio_codecs:audio_codecs_api",
-    "../../rtc_base:rtc_base_approved",
-  ]
-  public_deps = [
-    ":g711_c",
-  ]
-}
-
-rtc_source_set("g711_c") {
-  visibility = [ ":*" ]  # Only targets in this file can depend on this.
-  sources = [
-    "codecs/g711/g711.c",
-    "codecs/g711/g711.h",
-    "codecs/g711/g711_interface.c",
-    "codecs/g711/g711_interface.h",
-  ]
-  deps = [
-    "../..:webrtc_common",
-  ]
-}
-
-config("g722_config") {
-  include_dirs = [
-    "../../..",
-    "codecs/g722/include",
-  ]
-}
-
-rtc_static_library("g722") {
-  sources = [
-    "codecs/g722/audio_decoder_g722.cc",
-    "codecs/g722/audio_decoder_g722.h",
-    "codecs/g722/audio_encoder_g722.cc",
-    "codecs/g722/audio_encoder_g722.h",
-  ]
-
-  public_configs = [ ":g722_config" ]
-
-  deps = [
-    ":legacy_encoded_audio_frame",
-    "../..:webrtc_common",
-    "../../api/audio_codecs:audio_codecs_api",
-    "../../api/audio_codecs/g722:audio_encoder_g722_config",
-    "../../rtc_base:rtc_base_approved",
-  ]
-  public_deps = [
-    ":g722_c",
-  ]
-}
-
-rtc_source_set("g722_c") {
-  visibility = [ ":*" ]  # Only targets in this file can depend on this.
-  sources = [
-    "codecs/g722/g722_decode.c",
-    "codecs/g722/g722_enc_dec.h",
-    "codecs/g722/g722_encode.c",
-    "codecs/g722/g722_interface.c",
-    "codecs/g722/g722_interface.h",
-  ]
-  deps = [
-    "../..:webrtc_common",
-  ]
-}
-
-config("ilbc_config") {
-  include_dirs = [
-    "../../..",
-    "codecs/ilbc/include",
-  ]
-}
-
-rtc_static_library("ilbc") {
-  sources = [
-    "codecs/ilbc/audio_decoder_ilbc.cc",
-    "codecs/ilbc/audio_decoder_ilbc.h",
-    "codecs/ilbc/audio_encoder_ilbc.cc",
-    "codecs/ilbc/audio_encoder_ilbc.h",
-  ]
-
-  public_configs = [ ":ilbc_config" ]
-
-  deps = [
-    ":legacy_encoded_audio_frame",
-    "../..:webrtc_common",
-    "../../api/audio_codecs:audio_codecs_api",
-    "../../api/audio_codecs/ilbc:audio_encoder_ilbc_config",
-    "../../common_audio",
-    "../../rtc_base:rtc_base_approved",
-  ]
-  public_deps = [
-    ":ilbc_c",
-  ]
-}
-
-rtc_source_set("ilbc_c") {
-  visibility = [ ":*" ]  # Only targets in this file can depend on this.
-  sources = [
-    "codecs/ilbc/abs_quant.c",
-    "codecs/ilbc/abs_quant.h",
-    "codecs/ilbc/abs_quant_loop.c",
-    "codecs/ilbc/abs_quant_loop.h",
-    "codecs/ilbc/augmented_cb_corr.c",
-    "codecs/ilbc/augmented_cb_corr.h",
-    "codecs/ilbc/bw_expand.c",
-    "codecs/ilbc/bw_expand.h",
-    "codecs/ilbc/cb_construct.c",
-    "codecs/ilbc/cb_construct.h",
-    "codecs/ilbc/cb_mem_energy.c",
-    "codecs/ilbc/cb_mem_energy.h",
-    "codecs/ilbc/cb_mem_energy_augmentation.c",
-    "codecs/ilbc/cb_mem_energy_augmentation.h",
-    "codecs/ilbc/cb_mem_energy_calc.c",
-    "codecs/ilbc/cb_mem_energy_calc.h",
-    "codecs/ilbc/cb_search.c",
-    "codecs/ilbc/cb_search.h",
-    "codecs/ilbc/cb_search_core.c",
-    "codecs/ilbc/cb_search_core.h",
-    "codecs/ilbc/cb_update_best_index.c",
-    "codecs/ilbc/cb_update_best_index.h",
-    "codecs/ilbc/chebyshev.c",
-    "codecs/ilbc/chebyshev.h",
-    "codecs/ilbc/comp_corr.c",
-    "codecs/ilbc/comp_corr.h",
-    "codecs/ilbc/constants.c",
-    "codecs/ilbc/constants.h",
-    "codecs/ilbc/create_augmented_vec.c",
-    "codecs/ilbc/create_augmented_vec.h",
-    "codecs/ilbc/decode.c",
-    "codecs/ilbc/decode.h",
-    "codecs/ilbc/decode_residual.c",
-    "codecs/ilbc/decode_residual.h",
-    "codecs/ilbc/decoder_interpolate_lsf.c",
-    "codecs/ilbc/decoder_interpolate_lsf.h",
-    "codecs/ilbc/defines.h",
-    "codecs/ilbc/do_plc.c",
-    "codecs/ilbc/do_plc.h",
-    "codecs/ilbc/encode.c",
-    "codecs/ilbc/encode.h",
-    "codecs/ilbc/energy_inverse.c",
-    "codecs/ilbc/energy_inverse.h",
-    "codecs/ilbc/enh_upsample.c",
-    "codecs/ilbc/enh_upsample.h",
-    "codecs/ilbc/enhancer.c",
-    "codecs/ilbc/enhancer.h",
-    "codecs/ilbc/enhancer_interface.c",
-    "codecs/ilbc/enhancer_interface.h",
-    "codecs/ilbc/filtered_cb_vecs.c",
-    "codecs/ilbc/filtered_cb_vecs.h",
-    "codecs/ilbc/frame_classify.c",
-    "codecs/ilbc/frame_classify.h",
-    "codecs/ilbc/gain_dequant.c",
-    "codecs/ilbc/gain_dequant.h",
-    "codecs/ilbc/gain_quant.c",
-    "codecs/ilbc/gain_quant.h",
-    "codecs/ilbc/get_cd_vec.c",
-    "codecs/ilbc/get_cd_vec.h",
-    "codecs/ilbc/get_lsp_poly.c",
-    "codecs/ilbc/get_lsp_poly.h",
-    "codecs/ilbc/get_sync_seq.c",
-    "codecs/ilbc/get_sync_seq.h",
-    "codecs/ilbc/hp_input.c",
-    "codecs/ilbc/hp_input.h",
-    "codecs/ilbc/hp_output.c",
-    "codecs/ilbc/hp_output.h",
-    "codecs/ilbc/ilbc.c",
-    "codecs/ilbc/ilbc.h",
-    "codecs/ilbc/index_conv_dec.c",
-    "codecs/ilbc/index_conv_dec.h",
-    "codecs/ilbc/index_conv_enc.c",
-    "codecs/ilbc/index_conv_enc.h",
-    "codecs/ilbc/init_decode.c",
-    "codecs/ilbc/init_decode.h",
-    "codecs/ilbc/init_encode.c",
-    "codecs/ilbc/init_encode.h",
-    "codecs/ilbc/interpolate.c",
-    "codecs/ilbc/interpolate.h",
-    "codecs/ilbc/interpolate_samples.c",
-    "codecs/ilbc/interpolate_samples.h",
-    "codecs/ilbc/lpc_encode.c",
-    "codecs/ilbc/lpc_encode.h",
-    "codecs/ilbc/lsf_check.c",
-    "codecs/ilbc/lsf_check.h",
-    "codecs/ilbc/lsf_interpolate_to_poly_dec.c",
-    "codecs/ilbc/lsf_interpolate_to_poly_dec.h",
-    "codecs/ilbc/lsf_interpolate_to_poly_enc.c",
-    "codecs/ilbc/lsf_interpolate_to_poly_enc.h",
-    "codecs/ilbc/lsf_to_lsp.c",
-    "codecs/ilbc/lsf_to_lsp.h",
-    "codecs/ilbc/lsf_to_poly.c",
-    "codecs/ilbc/lsf_to_poly.h",
-    "codecs/ilbc/lsp_to_lsf.c",
-    "codecs/ilbc/lsp_to_lsf.h",
-    "codecs/ilbc/my_corr.c",
-    "codecs/ilbc/my_corr.h",
-    "codecs/ilbc/nearest_neighbor.c",
-    "codecs/ilbc/nearest_neighbor.h",
-    "codecs/ilbc/pack_bits.c",
-    "codecs/ilbc/pack_bits.h",
-    "codecs/ilbc/poly_to_lsf.c",
-    "codecs/ilbc/poly_to_lsf.h",
-    "codecs/ilbc/poly_to_lsp.c",
-    "codecs/ilbc/poly_to_lsp.h",
-    "codecs/ilbc/refiner.c",
-    "codecs/ilbc/refiner.h",
-    "codecs/ilbc/simple_interpolate_lsf.c",
-    "codecs/ilbc/simple_interpolate_lsf.h",
-    "codecs/ilbc/simple_lpc_analysis.c",
-    "codecs/ilbc/simple_lpc_analysis.h",
-    "codecs/ilbc/simple_lsf_dequant.c",
-    "codecs/ilbc/simple_lsf_dequant.h",
-    "codecs/ilbc/simple_lsf_quant.c",
-    "codecs/ilbc/simple_lsf_quant.h",
-    "codecs/ilbc/smooth.c",
-    "codecs/ilbc/smooth.h",
-    "codecs/ilbc/smooth_out_data.c",
-    "codecs/ilbc/smooth_out_data.h",
-    "codecs/ilbc/sort_sq.c",
-    "codecs/ilbc/sort_sq.h",
-    "codecs/ilbc/split_vq.c",
-    "codecs/ilbc/split_vq.h",
-    "codecs/ilbc/state_construct.c",
-    "codecs/ilbc/state_construct.h",
-    "codecs/ilbc/state_search.c",
-    "codecs/ilbc/state_search.h",
-    "codecs/ilbc/swap_bytes.c",
-    "codecs/ilbc/swap_bytes.h",
-    "codecs/ilbc/unpack_bits.c",
-    "codecs/ilbc/unpack_bits.h",
-    "codecs/ilbc/vq3.c",
-    "codecs/ilbc/vq3.h",
-    "codecs/ilbc/vq4.c",
-    "codecs/ilbc/vq4.h",
-    "codecs/ilbc/window32_w32.c",
-    "codecs/ilbc/window32_w32.h",
-    "codecs/ilbc/xcorr_coef.c",
-    "codecs/ilbc/xcorr_coef.h",
-  ]
-
-  public_configs = [ ":ilbc_config" ]
-
-  deps = [
-    "../..:webrtc_common",
-    "../../api/audio_codecs:audio_codecs_api",
-    "../../common_audio",
-    "../../rtc_base:rtc_base_approved",
-  ]
-}
-
-rtc_static_library("isac_common") {
-  sources = [
-    "codecs/isac/audio_encoder_isac_t.h",
-    "codecs/isac/audio_encoder_isac_t_impl.h",
-    "codecs/isac/locked_bandwidth_info.cc",
-    "codecs/isac/locked_bandwidth_info.h",
-  ]
-  deps = [
-    "../..:webrtc_common",
-    "../../api/audio_codecs:audio_codecs_api",
-    "../../rtc_base:rtc_base_approved",
-  ]
-}
-
-config("isac_config") {
-  include_dirs = [
-    "../../..",
-    "codecs/isac/main/include",
-  ]
-}
-
-rtc_static_library("isac") {
-  sources = [
-    "codecs/isac/main/include/audio_decoder_isac.h",
-    "codecs/isac/main/include/audio_encoder_isac.h",
-    "codecs/isac/main/source/audio_decoder_isac.cc",
-    "codecs/isac/main/source/audio_encoder_isac.cc",
-  ]
-
-  deps = [
-    ":isac_common",
-    "../../api/audio_codecs:audio_codecs_api",
-  ]
-  public_deps = [
-    ":isac_c",
-  ]
-}
-
-rtc_static_library("isac_c") {
-  visibility = [ ":*" ]  # Only targets in this file can depend on this.
-  sources = [
-    "codecs/isac/main/include/isac.h",
-    "codecs/isac/main/source/arith_routines.c",
-    "codecs/isac/main/source/arith_routines.h",
-    "codecs/isac/main/source/arith_routines_hist.c",
-    "codecs/isac/main/source/arith_routines_logist.c",
-    "codecs/isac/main/source/bandwidth_estimator.c",
-    "codecs/isac/main/source/bandwidth_estimator.h",
-    "codecs/isac/main/source/codec.h",
-    "codecs/isac/main/source/crc.c",
-    "codecs/isac/main/source/crc.h",
-    "codecs/isac/main/source/decode.c",
-    "codecs/isac/main/source/decode_bwe.c",
-    "codecs/isac/main/source/encode.c",
-    "codecs/isac/main/source/encode_lpc_swb.c",
-    "codecs/isac/main/source/encode_lpc_swb.h",
-    "codecs/isac/main/source/entropy_coding.c",
-    "codecs/isac/main/source/entropy_coding.h",
-    "codecs/isac/main/source/fft.c",
-    "codecs/isac/main/source/fft.h",
-    "codecs/isac/main/source/filter_functions.c",
-    "codecs/isac/main/source/filterbank_tables.c",
-    "codecs/isac/main/source/filterbank_tables.h",
-    "codecs/isac/main/source/filterbanks.c",
-    "codecs/isac/main/source/intialize.c",
-    "codecs/isac/main/source/isac.c",
-    "codecs/isac/main/source/isac_float_type.h",
-    "codecs/isac/main/source/lattice.c",
-    "codecs/isac/main/source/lpc_analysis.c",
-    "codecs/isac/main/source/lpc_analysis.h",
-    "codecs/isac/main/source/lpc_gain_swb_tables.c",
-    "codecs/isac/main/source/lpc_gain_swb_tables.h",
-    "codecs/isac/main/source/lpc_shape_swb12_tables.c",
-    "codecs/isac/main/source/lpc_shape_swb12_tables.h",
-    "codecs/isac/main/source/lpc_shape_swb16_tables.c",
-    "codecs/isac/main/source/lpc_shape_swb16_tables.h",
-    "codecs/isac/main/source/lpc_tables.c",
-    "codecs/isac/main/source/lpc_tables.h",
-    "codecs/isac/main/source/os_specific_inline.h",
-    "codecs/isac/main/source/pitch_estimator.c",
-    "codecs/isac/main/source/pitch_estimator.h",
-    "codecs/isac/main/source/pitch_filter.c",
-    "codecs/isac/main/source/pitch_gain_tables.c",
-    "codecs/isac/main/source/pitch_gain_tables.h",
-    "codecs/isac/main/source/pitch_lag_tables.c",
-    "codecs/isac/main/source/pitch_lag_tables.h",
-    "codecs/isac/main/source/settings.h",
-    "codecs/isac/main/source/spectrum_ar_model_tables.c",
-    "codecs/isac/main/source/spectrum_ar_model_tables.h",
-    "codecs/isac/main/source/structs.h",
-    "codecs/isac/main/source/transform.c",
-  ]
-
-  if (is_linux) {
-    libs = [ "m" ]
-  }
-
-  public_configs = [ ":isac_config" ]
-
-  deps = [
-    ":isac_common",
-    "../..:webrtc_common",
-    "../../common_audio",
-    "../../rtc_base:compile_assert_c",
-    "../../rtc_base:rtc_base_approved",
-  ]
-}
-
-config("isac_fix_config") {
-  include_dirs = [
-    "../../..",
-    "codecs/isac/fix/include",
-  ]
-}
-
-rtc_static_library("isac_fix") {
-  sources = [
-    "codecs/isac/fix/source/audio_decoder_isacfix.cc",
-    "codecs/isac/fix/source/audio_encoder_isacfix.cc",
-  ]
-
-  public_configs = [ ":isac_fix_config" ]
-
-  deps = [
-    ":isac_common",
-    "../../api/audio_codecs:audio_codecs_api",
-    "../../common_audio",
-    "../../system_wrappers",
-  ]
-  public_deps = [
-    ":isac_fix_c",
-  ]
-
-  if (rtc_build_with_neon) {
-    deps += [ ":isac_neon" ]
-  }
-}
-
-rtc_source_set("isac_fix_common") {
-  visibility = [ ":*" ]  # Only targets in this file can depend on this.
-  sources = [
-    "codecs/isac/fix/source/codec.h",
-    "codecs/isac/fix/source/fft.c",
-    "codecs/isac/fix/source/fft.h",
-    "codecs/isac/fix/source/settings.h",
-  ]
-  public_configs = [ ":isac_fix_config" ]
-}
-
-rtc_source_set("isac_fix_c_arm_asm") {
-  sources = []
-  if (current_cpu == "arm" && arm_version >= 7) {
-    sources += [
-      "codecs/isac/fix/source/lattice_armv7.S",
-      "codecs/isac/fix/source/pitch_filter_armv6.S",
-    ]
-  }
-}
-
-rtc_source_set("isac_fix_c") {
-  visibility = [ ":*" ]  # Only targets in this file can depend on this.
-  sources = [
-    "codecs/isac/fix/include/audio_decoder_isacfix.h",
-    "codecs/isac/fix/include/audio_encoder_isacfix.h",
-    "codecs/isac/fix/include/isacfix.h",
-    "codecs/isac/fix/source/arith_routines.c",
-    "codecs/isac/fix/source/arith_routines_hist.c",
-    "codecs/isac/fix/source/arith_routines_logist.c",
-    "codecs/isac/fix/source/arith_routins.h",
-    "codecs/isac/fix/source/bandwidth_estimator.c",
-    "codecs/isac/fix/source/bandwidth_estimator.h",
-    "codecs/isac/fix/source/decode.c",
-    "codecs/isac/fix/source/decode_bwe.c",
-    "codecs/isac/fix/source/decode_plc.c",
-    "codecs/isac/fix/source/encode.c",
-    "codecs/isac/fix/source/entropy_coding.c",
-    "codecs/isac/fix/source/entropy_coding.h",
-    "codecs/isac/fix/source/filterbank_tables.c",
-    "codecs/isac/fix/source/filterbank_tables.h",
-    "codecs/isac/fix/source/filterbanks.c",
-    "codecs/isac/fix/source/filters.c",
-    "codecs/isac/fix/source/initialize.c",
-    "codecs/isac/fix/source/isac_fix_type.h",
-    "codecs/isac/fix/source/isacfix.c",
-    "codecs/isac/fix/source/lattice.c",
-    "codecs/isac/fix/source/lattice_c.c",
-    "codecs/isac/fix/source/lpc_masking_model.c",
-    "codecs/isac/fix/source/lpc_masking_model.h",
-    "codecs/isac/fix/source/lpc_tables.c",
-    "codecs/isac/fix/source/lpc_tables.h",
-    "codecs/isac/fix/source/pitch_estimator.c",
-    "codecs/isac/fix/source/pitch_estimator.h",
-    "codecs/isac/fix/source/pitch_estimator_c.c",
-    "codecs/isac/fix/source/pitch_filter.c",
-    "codecs/isac/fix/source/pitch_filter_c.c",
-    "codecs/isac/fix/source/pitch_gain_tables.c",
-    "codecs/isac/fix/source/pitch_gain_tables.h",
-    "codecs/isac/fix/source/pitch_lag_tables.c",
-    "codecs/isac/fix/source/pitch_lag_tables.h",
-    "codecs/isac/fix/source/spectrum_ar_model_tables.c",
-    "codecs/isac/fix/source/spectrum_ar_model_tables.h",
-    "codecs/isac/fix/source/structs.h",
-    "codecs/isac/fix/source/transform.c",
-    "codecs/isac/fix/source/transform_tables.c",
-  ]
-
-  public_configs = [ ":isac_fix_config" ]
-
-  deps = [
-    ":isac_common",
-    "../..:webrtc_common",
-    "../../api/audio_codecs:audio_codecs_api",
-    "../../common_audio",
-    "../../rtc_base:compile_assert_c",
-    "../../rtc_base:rtc_base_approved",
-    "../../system_wrappers",
-  ]
-
-  public_deps = [
-    ":isac_fix_common",
-  ]
-
-  if (rtc_build_with_neon) {
-    deps += [ ":isac_neon" ]
-  }
-
-  if (current_cpu == "arm" && arm_version >= 7) {
-    sources -= [
-      "codecs/isac/fix/source/lattice_c.c",
-      "codecs/isac/fix/source/pitch_filter_c.c",
-    ]
-    deps += [ ":isac_fix_c_arm_asm" ]
-  }
-
-  if (current_cpu == "mipsel") {
-    sources += [
-      "codecs/isac/fix/source/entropy_coding_mips.c",
-      "codecs/isac/fix/source/filters_mips.c",
-      "codecs/isac/fix/source/lattice_mips.c",
-      "codecs/isac/fix/source/pitch_estimator_mips.c",
-      "codecs/isac/fix/source/transform_mips.c",
-    ]
-    sources -= [
-      "codecs/isac/fix/source/lattice_c.c",
-      "codecs/isac/fix/source/pitch_estimator_c.c",
-    ]
-    if (mips_dsp_rev > 0) {
-      sources += [ "codecs/isac/fix/source/filterbanks_mips.c" ]
-    }
-    if (mips_dsp_rev > 1) {
-      sources += [
-        "codecs/isac/fix/source/lpc_masking_model_mips.c",
-        "codecs/isac/fix/source/pitch_filter_mips.c",
-      ]
-      sources -= [ "codecs/isac/fix/source/pitch_filter_c.c" ]
-    }
-  }
-}
-
-if (rtc_build_with_neon) {
-  rtc_static_library("isac_neon") {
-    sources = [
-      "codecs/isac/fix/source/entropy_coding_neon.c",
-      "codecs/isac/fix/source/filterbanks_neon.c",
-      "codecs/isac/fix/source/filters_neon.c",
-      "codecs/isac/fix/source/lattice_neon.c",
-      "codecs/isac/fix/source/transform_neon.c",
-    ]
-
-    if (current_cpu != "arm64") {
-      # Enable compilation for the NEON instruction set. This is needed
-      # since //build/config/arm.gni only enables NEON for iOS, not Android.
-      # This provides the same functionality as webrtc/build/arm_neon.gypi.
-      suppressed_configs += [ "//build/config/compiler:compiler_arm_fpu" ]
-      cflags = [ "-mfpu=neon" ]
-    }
-
-    # Disable LTO on NEON targets due to compiler bug.
-    # TODO(fdegans): Enable this. See crbug.com/408997.
-    if (rtc_use_lto) {
-      cflags -= [
-        "-flto",
-        "-ffat-lto-objects",
-      ]
-    }
-
-    deps = [
-      ":isac_fix_common",
-      "../../common_audio",
-      "../../rtc_base:rtc_base_approved",
-    ]
-  }
-}
-
-config("pcm16b_config") {
-  include_dirs = [
-    "../../..",
-    "codecs/pcm16b/include",
-  ]
-}
-
-rtc_static_library("pcm16b") {
-  sources = [
-    "codecs/pcm16b/audio_decoder_pcm16b.cc",
-    "codecs/pcm16b/audio_decoder_pcm16b.h",
-    "codecs/pcm16b/audio_encoder_pcm16b.cc",
-    "codecs/pcm16b/audio_encoder_pcm16b.h",
-    "codecs/pcm16b/pcm16b_common.cc",
-    "codecs/pcm16b/pcm16b_common.h",
-  ]
-
-  deps = [
-    ":g711",
-    ":legacy_encoded_audio_frame",
-    "../..:webrtc_common",
-    "../../api/audio_codecs:audio_codecs_api",
-    "../../rtc_base:rtc_base_approved",
-  ]
-  public_deps = [
-    ":pcm16b_c",
-  ]
-  public_configs = [ ":pcm16b_config" ]
-}
-
-rtc_source_set("pcm16b_c") {
-  visibility = [ ":*" ]  # Only targets in this file can depend on this.
-  sources = [
-    "codecs/pcm16b/pcm16b.c",
-    "codecs/pcm16b/pcm16b.h",
-  ]
-
-  public_configs = [ ":pcm16b_config" ]
-  deps = [
-    "../..:webrtc_common",
-  ]
-}
-
-config("opus_config") {
-  include_dirs = [ "../../.." ]
-}
-
-rtc_static_library("webrtc_opus") {
-  sources = [
-    "codecs/opus/audio_decoder_opus.cc",
-    "codecs/opus/audio_decoder_opus.h",
-    "codecs/opus/audio_encoder_opus.cc",
-    "codecs/opus/audio_encoder_opus.h",
-  ]
-
-  deps = [
-    ":audio_network_adaptor",
-    "../..:webrtc_common",
-    "../../api:optional",
-    "../../api/audio_codecs:audio_codecs_api",
-    "../../api/audio_codecs/opus:audio_encoder_opus_config",
-    "../../common_audio",
-    "../../rtc_base:rtc_base_approved",
-    "../../rtc_base:rtc_numerics",
-    "../../system_wrappers",
-  ]
-  public_deps = [
-    ":webrtc_opus_c",
-    "../../rtc_base:protobuf_utils",
-  ]
-
-  defines = audio_codec_defines
-
-  if (rtc_build_opus) {
-    public_deps += [ rtc_opus_dir ]
-  } else if (build_with_mozilla) {
-    include_dirs = [ getenv("DIST") + "/include/opus" ]
-  }
-}
-
-rtc_source_set("webrtc_opus_c") {
-  visibility = [ ":*" ]  # Only targets in this file can depend on this.
-  sources = [
-    "codecs/opus/opus_inst.h",
-    "codecs/opus/opus_interface.c",
-    "codecs/opus/opus_interface.h",
-  ]
-
-  defines = audio_coding_defines
-
-  if (rtc_build_opus) {
-    public_deps = [
-      rtc_opus_dir,
-    ]
-  } else if (build_with_mozilla) {
-    include_dirs = [ getenv("DIST") + "/include/opus" ]
-  }
-
-  deps = [
-    "../..:webrtc_common",
-    "../../rtc_base:rtc_base_approved",
-  ]
-}
-
-if (rtc_enable_protobuf) {
-  proto_library("ana_debug_dump_proto") {
-    sources = [
-      "audio_network_adaptor/debug_dump.proto",
-    ]
-    deps = [
-      ":ana_config_proto",
-    ]
-    proto_out_dir = "webrtc/modules/audio_coding/audio_network_adaptor"
-  }
-  proto_library("ana_config_proto") {
-    sources = [
-      "audio_network_adaptor/config.proto",
-    ]
-    proto_out_dir = "webrtc/modules/audio_coding/audio_network_adaptor"
-  }
-}
-
-rtc_static_library("audio_network_adaptor_config") {
-  sources = [
-    "audio_network_adaptor/audio_network_adaptor_config.cc",
-    "audio_network_adaptor/include/audio_network_adaptor_config.h",
-  ]
-  deps = [
-    "../../api:optional",
-  ]
-}
-
-rtc_static_library("audio_network_adaptor") {
-  sources = [
-    "audio_network_adaptor/audio_network_adaptor_impl.cc",
-    "audio_network_adaptor/audio_network_adaptor_impl.h",
-    "audio_network_adaptor/bitrate_controller.cc",
-    "audio_network_adaptor/bitrate_controller.h",
-    "audio_network_adaptor/channel_controller.cc",
-    "audio_network_adaptor/channel_controller.h",
-    "audio_network_adaptor/controller.cc",
-    "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/event_log_writer.cc",
-    "audio_network_adaptor/event_log_writer.h",
-    "audio_network_adaptor/fec_controller_plr_based.cc",
-    "audio_network_adaptor/fec_controller_plr_based.h",
-    "audio_network_adaptor/fec_controller_rplr_based.cc",
-    "audio_network_adaptor/fec_controller_rplr_based.h",
-    "audio_network_adaptor/frame_length_controller.cc",
-    "audio_network_adaptor/frame_length_controller.h",
-    "audio_network_adaptor/include/audio_network_adaptor.h",
-    "audio_network_adaptor/util/threshold_curve.h",
-  ]
-
-  public_deps = [
-    ":audio_network_adaptor_config",
-  ]
-
-  deps = [
-    "../..:webrtc_common",
-    "../../api:optional",
-    "../../api/audio_codecs:audio_codecs_api",
-    "../../common_audio",
-    "../../logging:rtc_event_log_api",
-    "../../rtc_base:protobuf_utils",
-    "../../rtc_base:rtc_base_approved",
-    "../../system_wrappers",
-  ]
-
-  if (rtc_enable_protobuf) {
-    deps += [
-      ":ana_config_proto",
-      ":ana_debug_dump_proto",
-    ]
-  }
-
-  if (!build_with_chromium && is_clang) {
-    # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-    suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-  }
-}
-
-rtc_source_set("neteq_decoder_enum") {
-  sources = [
-    "neteq/neteq_decoder_enum.cc",
-    "neteq/neteq_decoder_enum.h",
-  ]
-  deps = [
-    "../../api:optional",
-    "../../api/audio_codecs:audio_codecs_api",
-    "../../rtc_base:rtc_base_approved",
-  ]
-}
-
-rtc_static_library("neteq") {
-  sources = [
-    "neteq/accelerate.cc",
-    "neteq/accelerate.h",
-    "neteq/audio_decoder_impl.cc",
-    "neteq/audio_decoder_impl.h",
-    "neteq/audio_multi_vector.cc",
-    "neteq/audio_multi_vector.h",
-    "neteq/audio_vector.cc",
-    "neteq/audio_vector.h",
-    "neteq/background_noise.cc",
-    "neteq/background_noise.h",
-    "neteq/buffer_level_filter.cc",
-    "neteq/buffer_level_filter.h",
-    "neteq/comfort_noise.cc",
-    "neteq/comfort_noise.h",
-    "neteq/cross_correlation.cc",
-    "neteq/cross_correlation.h",
-    "neteq/decision_logic.cc",
-    "neteq/decision_logic.h",
-    "neteq/decision_logic_fax.cc",
-    "neteq/decision_logic_fax.h",
-    "neteq/decision_logic_normal.cc",
-    "neteq/decision_logic_normal.h",
-    "neteq/decoder_database.cc",
-    "neteq/decoder_database.h",
-    "neteq/defines.h",
-    "neteq/delay_manager.cc",
-    "neteq/delay_manager.h",
-    "neteq/delay_peak_detector.cc",
-    "neteq/delay_peak_detector.h",
-    "neteq/dsp_helper.cc",
-    "neteq/dsp_helper.h",
-    "neteq/dtmf_buffer.cc",
-    "neteq/dtmf_buffer.h",
-    "neteq/dtmf_tone_generator.cc",
-    "neteq/dtmf_tone_generator.h",
-    "neteq/expand.cc",
-    "neteq/expand.h",
-    "neteq/include/neteq.h",
-    "neteq/merge.cc",
-    "neteq/merge.h",
-    "neteq/nack_tracker.cc",
-    "neteq/nack_tracker.h",
-    "neteq/neteq.cc",
-    "neteq/neteq_impl.cc",
-    "neteq/neteq_impl.h",
-    "neteq/normal.cc",
-    "neteq/normal.h",
-    "neteq/packet.cc",
-    "neteq/packet.h",
-    "neteq/packet_buffer.cc",
-    "neteq/packet_buffer.h",
-    "neteq/post_decode_vad.cc",
-    "neteq/post_decode_vad.h",
-    "neteq/preemptive_expand.cc",
-    "neteq/preemptive_expand.h",
-    "neteq/random_vector.cc",
-    "neteq/random_vector.h",
-    "neteq/red_payload_splitter.cc",
-    "neteq/red_payload_splitter.h",
-    "neteq/rtcp.cc",
-    "neteq/rtcp.h",
-    "neteq/statistics_calculator.cc",
-    "neteq/statistics_calculator.h",
-    "neteq/sync_buffer.cc",
-    "neteq/sync_buffer.h",
-    "neteq/tick_timer.cc",
-    "neteq/tick_timer.h",
-    "neteq/time_stretch.cc",
-    "neteq/time_stretch.h",
-    "neteq/timestamp_scaler.cc",
-    "neteq/timestamp_scaler.h",
-  ]
-
-  deps = [
-    ":audio_coding_module_typedefs",
-    ":cng",
-    ":g711",
-    ":isac_fix",
-    ":neteq_decoder_enum",
-    ":pcm16b",
-    "..:module_api",
-    "../..:webrtc_common",
-    "../../api:optional",
-    "../../api/audio_codecs:audio_codecs_api",
-    "../../common_audio",
-    "../../rtc_base:gtest_prod",
-    "../../rtc_base:rtc_base_approved",
-    "../../system_wrappers",
-  ]
-
-  defines = []
-
-  if (rtc_include_ilbc) {
-    defines += [ "WEBRTC_CODEC_ILBC" ]
-    deps += [ ":ilbc" ]
-  }
-  if (rtc_include_opus) {
-    defines += [ "WEBRTC_CODEC_OPUS" ]
-    deps += [ ":webrtc_opus" ]
-  }
-  if (!build_with_mozilla) {
-    if (current_cpu == "arm") {
-      defines += [ "WEBRTC_CODEC_ISACFX" ]
-      deps += [ ":isac_fix" ]
-    } else {
-      defines += [ "WEBRTC_CODEC_ISAC" ]
-      deps += [ ":isac" ]
-    }
-    defines += [ "WEBRTC_CODEC_G722" ]
-    deps += [ ":g722" ]
-  }
-}
-
-# Although providing only test support, this target must be outside of the
-# rtc_include_tests conditional. The reason is that it supports fuzzer tests
-# that ultimately are built and run as a part of the Chromium ecosystem, which
-# does not set the rtc_include_tests flag.
-rtc_source_set("neteq_tools_minimal") {
-  sources = [
-    "neteq/tools/audio_sink.cc",
-    "neteq/tools/audio_sink.h",
-    "neteq/tools/encode_neteq_input.cc",
-    "neteq/tools/encode_neteq_input.h",
-    "neteq/tools/neteq_input.cc",
-    "neteq/tools/neteq_input.h",
-    "neteq/tools/neteq_test.cc",
-    "neteq/tools/neteq_test.h",
-    "neteq/tools/packet.cc",
-    "neteq/tools/packet.h",
-    "neteq/tools/packet_source.cc",
-    "neteq/tools/packet_source.h",
-  ]
-
-  if (!build_with_chromium && is_clang) {
-    # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-    suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-  }
-
-  deps = [
-    ":neteq",
-    "..:module_api",
-    "../..:webrtc_common",
-    "../../api:optional",
-    "../../api/audio_codecs:audio_codecs_api",
-    "../../api/audio_codecs:builtin_audio_decoder_factory",
-    "../../rtc_base:rtc_base_approved",
-    "../rtp_rtcp",
-  ]
-}
-
-rtc_source_set("neteq_test_tools") {
-  testonly = true
-  sources = [
-    "neteq/tools/audio_checksum.h",
-    "neteq/tools/audio_loop.cc",
-    "neteq/tools/audio_loop.h",
-    "neteq/tools/constant_pcm_packet_source.cc",
-    "neteq/tools/constant_pcm_packet_source.h",
-    "neteq/tools/output_audio_file.h",
-    "neteq/tools/output_wav_file.h",
-    "neteq/tools/rtp_file_source.cc",
-    "neteq/tools/rtp_file_source.h",
-    "neteq/tools/rtp_generator.cc",
-    "neteq/tools/rtp_generator.h",
-  ]
-
-  public_configs = [ ":neteq_tools_config" ]
-
-  if (!build_with_chromium && is_clang) {
-    # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-    suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-  }
-
-  deps = [
-    ":pcm16b",
-    "..:module_api",
-    "../..:webrtc_common",
-    "../../api:array_view",
-    "../../common_audio",
-    "../../rtc_base:rtc_base_approved",
-    "../../rtc_base:rtc_base_tests_utils",
-    "../../test:rtp_test_utils",
-    "../rtp_rtcp",
-  ]
-
-  public_deps = [
-    ":neteq_tools",
-    ":neteq_tools_minimal",
-  ]
-
-  if (rtc_enable_protobuf) {
-    sources += [
-      "neteq/tools/neteq_packet_source_input.cc",
-      "neteq/tools/neteq_packet_source_input.h",
-    ]
-    deps += [ ":rtc_event_log_source" ]
-  }
-}
-
-config("neteq_tools_config") {
-  include_dirs = [ "tools" ]
-}
-
-rtc_source_set("neteq_tools") {
-  sources = [
-    "neteq/tools/fake_decode_from_file.cc",
-    "neteq/tools/fake_decode_from_file.h",
-    "neteq/tools/input_audio_file.cc",
-    "neteq/tools/input_audio_file.h",
-    "neteq/tools/neteq_delay_analyzer.cc",
-    "neteq/tools/neteq_delay_analyzer.h",
-    "neteq/tools/neteq_replacement_input.cc",
-    "neteq/tools/neteq_replacement_input.h",
-    "neteq/tools/resample_input_audio_file.cc",
-    "neteq/tools/resample_input_audio_file.h",
-  ]
-
-  public_configs = [ ":neteq_tools_config" ]
-
-  if (!build_with_chromium && is_clang) {
-    # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-    suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-  }
-
-  deps = [
-    "../..:webrtc_common",
-    "../../api:array_view",
-    "../../api:optional",
-    "../../api/audio_codecs:audio_codecs_api",
-    "../../common_audio",
-    "../../rtc_base:rtc_base_approved",
-    "../rtp_rtcp",
-  ]
-
-  public_deps = [
-    ":neteq_tools_minimal",
-  ]
-}
-
-if (rtc_enable_protobuf) {
-  rtc_static_library("rtc_event_log_source") {
-    testonly = true
-
-    # TODO(kjellander): Remove (bugs.webrtc.org/6828)
-    # Needs call.h to be moved to webrtc/api first.
-    check_includes = false
-
-    sources = [
-      "neteq/tools/rtc_event_log_source.cc",
-      "neteq/tools/rtc_event_log_source.h",
-    ]
-
-    if (!build_with_chromium && is_clang) {
-      # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-    }
-
-    deps = [
-      "../../logging:rtc_event_log_parser",
-      "../../rtc_base:rtc_base_approved",
-    ]
-    public_deps = [
-      "../../logging:rtc_event_log_proto",
-    ]
-  }
-}
-
-if (rtc_include_tests) {
-  group("audio_coding_tests") {
-    testonly = true
-    public_deps = [
-      ":RTPchange",
-      ":RTPencode",
-      ":RTPjitter",
-      ":RTPtimeshift",
-      ":acm_receive_test",
-      ":acm_send_test",
-      ":audio_codec_speed_tests",
-      ":audio_decoder_unittests",
-      ":audio_decoder_unittests",
-      ":delay_test",
-      ":g711_test",
-      ":g722_test",
-      ":ilbc_test",
-      ":insert_packet_with_timing",
-      ":isac_api_test",
-      ":isac_fix_test",
-      ":isac_switch_samprate_test",
-      ":isac_test",
-      ":neteq_ilbc_quality_test",
-      ":neteq_isac_quality_test",
-      ":neteq_opus_quality_test",
-      ":neteq_pcmu_quality_test",
-      ":neteq_speed_test",
-      ":rtp_analyze",
-      ":rtpcat",
-      ":webrtc_opus_fec_test",
-    ]
-    if (rtc_enable_protobuf) {
-      public_deps += [ ":neteq_rtpplay" ]
-    }
-  }
-
-  rtc_source_set("audio_coding_modules_tests") {
-    testonly = true
-
-    # Skip restricting visibility on mobile platforms since the tests on those
-    # gets additional generated targets which would require many lines here to
-    # cover (which would be confusing to read and hard to maintain).
-    if (!is_android && !is_ios) {
-      visibility = [ "..:modules_tests" ]
-    }
-    sources = [
-      "test/ACMTest.h",
-      "test/APITest.cc",
-      "test/APITest.h",
-      "test/Channel.cc",
-      "test/Channel.h",
-      "test/EncodeDecodeTest.cc",
-      "test/EncodeDecodeTest.h",
-      "test/PCMFile.cc",
-      "test/PCMFile.h",
-      "test/PacketLossTest.cc",
-      "test/PacketLossTest.h",
-      "test/RTPFile.cc",
-      "test/RTPFile.h",
-      "test/TestAllCodecs.cc",
-      "test/TestAllCodecs.h",
-      "test/TestRedFec.cc",
-      "test/TestRedFec.h",
-      "test/TestStereo.cc",
-      "test/TestStereo.h",
-      "test/TestVADDTX.cc",
-      "test/TestVADDTX.h",
-      "test/Tester.cc",
-      "test/TwoWayCommunication.cc",
-      "test/TwoWayCommunication.h",
-      "test/iSACTest.cc",
-      "test/iSACTest.h",
-      "test/opus_test.cc",
-      "test/opus_test.h",
-      "test/target_delay_unittest.cc",
-      "test/utility.cc",
-      "test/utility.h",
-    ]
-    deps = [
-      ":audio_coding",
-      ":audio_coding_module_typedefs",
-      ":audio_format_conversion",
-      ":pcm16b_c",
-      "..:module_api",
-      "../..:webrtc_common",
-      "../../api:optional",
-      "../../api/audio_codecs:builtin_audio_decoder_factory",
-      "../../rtc_base:rtc_base_approved",
-      "../../system_wrappers:system_wrappers",
-      "../../test:test_support",
-    ]
-    defines = audio_coding_defines
-    if (is_win) {
-      cflags = [
-        # TODO(kjellander): bugs.webrtc.org/261: Fix this warning.
-        "/wd4373",  # virtual function override.
-      ]
-    }
-    if (!build_with_chromium && is_clang) {
-      # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-    }
-  }
-
-  rtc_source_set("audio_coding_perf_tests") {
-    testonly = true
-
-    # Skip restricting visibility on mobile platforms since the tests on those
-    # gets additional generated targets which would require many lines here to
-    # cover (which would be confusing to read and hard to maintain).
-    if (!is_android && !is_ios) {
-      visibility = [ "../..:webrtc_perf_tests" ]
-    }
-    sources = [
-      "codecs/opus/opus_complexity_unittest.cc",
-      "neteq/test/neteq_performance_unittest.cc",
-    ]
-    deps = [
-      ":neteq_test_support",
-      ":neteq_test_tools",
-      ":webrtc_opus",
-      "../..:webrtc_common",
-      "../../rtc_base:protobuf_utils",
-      "../../rtc_base:rtc_base_approved",
-      "../../system_wrappers:system_wrappers",
-      "../../test:test_support",
-    ]
-
-    if (!build_with_chromium && is_clang) {
-      # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-    }
-  }
-
-  rtc_source_set("acm_receive_test") {
-    testonly = true
-    sources = [
-      "acm2/acm_receive_test.cc",
-      "acm2/acm_receive_test.h",
-    ]
-
-    defines = audio_coding_defines
-
-    deps = audio_coding_deps + [
-             ":audio_coding",
-             ":audio_format_conversion",
-             "../../api/audio_codecs:audio_codecs_api",
-             "../../api/audio_codecs:builtin_audio_decoder_factory",
-             ":neteq_tools",
-             "../../rtc_base:rtc_base_approved",
-             "../../test:test_support",
-             "//testing/gtest",
-           ]
-  }
-
-  rtc_source_set("acm_send_test") {
-    testonly = true
-    sources = [
-      "acm2/acm_send_test.cc",
-      "acm2/acm_send_test.h",
-    ]
-
-    defines = audio_coding_defines
-
-    deps = audio_coding_deps + [
-             ":audio_coding",
-             ":neteq_tools",
-             "../../api/audio_codecs:audio_codecs_api",
-             "../../rtc_base:rtc_base_approved",
-             "../../test:test_support",
-             "//testing/gtest",
-           ]
-  }
-
-  rtc_executable("delay_test") {
-    testonly = true
-    sources = [
-      "test/Channel.cc",
-      "test/Channel.h",
-      "test/PCMFile.cc",
-      "test/PCMFile.h",
-      "test/delay_test.cc",
-      "test/utility.cc",
-      "test/utility.h",
-    ]
-
-    deps = [
-      ":audio_coding",
-      ":audio_coding_module_typedefs",
-      ":audio_format_conversion",
-      "..:module_api",
-      "../../:webrtc_common",
-      "../../api:optional",
-      "../../rtc_base:rtc_base_approved",
-      "../../system_wrappers",
-      "../../system_wrappers:system_wrappers_default",
-      "../../test:test_support",
-      "../rtp_rtcp",
-      "//testing/gtest",
-    ]
-  }  # delay_test
-
-  rtc_executable("insert_packet_with_timing") {
-    testonly = true
-    sources = [
-      "test/Channel.cc",
-      "test/Channel.h",
-      "test/PCMFile.cc",
-      "test/PCMFile.h",
-      "test/insert_packet_with_timing.cc",
-    ]
-
-    if (!build_with_chromium && is_clang) {
-      # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-    }
-
-    deps = [
-      ":audio_coding",
-      ":audio_format_conversion",
-      "..:module_api",
-      "../../:webrtc_common",
-      "../../api:optional",
-      "../../rtc_base:rtc_base_approved",
-      "../../system_wrappers",
-      "../../system_wrappers:system_wrappers_default",
-      "../../test:test_support",
-      "../rtp_rtcp",
-      "//testing/gtest",
-    ]
-  }  # insert_packet_with_timing
-
-  audio_decoder_unittests_resources =
-      [ "../../../resources/audio_coding/testfile32kHz.pcm" ]
-
-  if (is_ios) {
-    bundle_data("audio_decoder_unittests_bundle_data") {
-      testonly = true
-      sources = audio_decoder_unittests_resources
-      outputs = [
-        "{{bundle_resources_dir}}/{{source_file_part}}",
-      ]
-    }
-  }
-
-  rtc_test("audio_decoder_unittests") {
-    testonly = true
-    sources = [
-      "neteq/audio_decoder_unittest.cc",
-    ]
-
-    if (!build_with_chromium && is_clang) {
-      # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-    }
-
-    deps = []
-
-    defines = neteq_defines
-
-    deps += audio_coding_deps
-    deps += [
-      ":ilbc",
-      ":isac",
-      ":isac_fix",
-      ":neteq",
-      ":neteq_tools",
-      "../../api/audio_codecs:audio_codecs_api",
-      "../../api/audio_codecs/opus:audio_encoder_opus",
-      "../../common_audio",
-      "../../rtc_base:protobuf_utils",
-      "../../test:test_main",
-      "//testing/gtest",
-    ]
-
-    data = audio_decoder_unittests_resources
-
-    if (is_android) {
-      deps += [ "//testing/android/native_test:native_test_native_code" ]
-      shard_timeout = 900
-    }
-    if (is_ios) {
-      deps += [ ":audio_decoder_unittests_bundle_data" ]
-    }
-  }  # audio_decoder_unittests
-
-  if (rtc_enable_protobuf) {
-    proto_library("neteq_unittest_proto") {
-      sources = [
-        "neteq/neteq_unittest.proto",
-      ]
-      proto_out_dir = "webrtc/modules/audio_coding/neteq"
-    }
-
-    rtc_test("neteq_rtpplay") {
-      testonly = true
-      defines = []
-      deps = [
-        "..:module_api",
-      ]
-      sources = [
-        "neteq/tools/neteq_rtpplay.cc",
-      ]
-
-      if (!build_with_chromium && is_clang) {
-        # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-        suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-      }
-
-      if (is_win) {
-        cflags = [
-          # TODO(kjellander): bugs.webrtc.org/261: Fix this warning.
-          "/wd4373",  # virtual function override.
-        ]
-      }
-
-      deps += [
-        ":neteq",
-        ":neteq_test_tools",
-        "../..:webrtc_common",
-        "../../rtc_base:rtc_base_approved",
-        "../../system_wrappers:system_wrappers_default",
-        "../../test:test_support",
-      ]
-    }
-  }
-
-  audio_codec_speed_tests_resources = [
-    "//resources/audio_coding/music_stereo_48kHz.pcm",
-    "//resources/audio_coding/speech_mono_16kHz.pcm",
-    "//resources/audio_coding/speech_mono_32_48kHz.pcm",
-  ]
-
-  if (is_ios) {
-    bundle_data("audio_codec_speed_tests_data") {
-      testonly = true
-      sources = audio_codec_speed_tests_resources
-      outputs = [
-        "{{bundle_resources_dir}}/{{source_file_part}}",
-      ]
-    }
-  }
-
-  rtc_test("audio_codec_speed_tests") {
-    testonly = true
-    defines = []
-    deps = []
-    sources = [
-      "codecs/isac/fix/test/isac_speed_test.cc",
-      "codecs/opus/opus_speed_test.cc",
-      "codecs/tools/audio_codec_speed_test.cc",
-      "codecs/tools/audio_codec_speed_test.h",
-    ]
-
-    if (!build_with_chromium && is_clang) {
-      # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-    }
-
-    data = audio_codec_speed_tests_resources
-
-    if (is_android) {
-      deps += [ "//testing/android/native_test:native_test_native_code" ]
-      shard_timeout = 900
-    }
-
-    if (is_ios) {
-      deps += [ ":audio_codec_speed_tests_data" ]
-    }
-
-    deps += [
-      ":isac_fix",
-      ":webrtc_opus",
-      "../..:webrtc_common",
-      "../../api:libjingle_peerconnection_api",
-      "../../rtc_base:rtc_base_approved",
-      "../../system_wrappers:metrics_default",
-      "../../system_wrappers:system_wrappers_default",
-      "../../test:field_trial",
-      "../../test:test_main",
-      "../audio_processing",
-      "//testing/gtest",
-    ]
-  }
-
-  rtc_source_set("neteq_test_support") {
-    testonly = true
-    sources = [
-      "neteq/tools/neteq_external_decoder_test.cc",
-      "neteq/tools/neteq_external_decoder_test.h",
-      "neteq/tools/neteq_performance_test.cc",
-      "neteq/tools/neteq_performance_test.h",
-    ]
-
-    if (!build_with_chromium && is_clang) {
-      # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-    }
-
-    deps = [
-      ":neteq",
-      ":neteq_test_tools",
-      ":pcm16b",
-      "..:module_api",
-      "../..:webrtc_common",
-      "../../api/audio_codecs:audio_codecs_api",
-      "../../api/audio_codecs:builtin_audio_decoder_factory",
-      "../../rtc_base:rtc_base_approved",
-      "../../system_wrappers",
-      "../../test:test_support",
-      "//testing/gtest",
-    ]
-  }
-
-  rtc_source_set("neteq_quality_test_support") {
-    testonly = true
-    sources = [
-      "neteq/tools/neteq_quality_test.cc",
-      "neteq/tools/neteq_quality_test.h",
-    ]
-
-    if (!build_with_chromium && is_clang) {
-      # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-    }
-
-    deps = [
-      ":neteq",
-      ":neteq_test_tools",
-      "..:module_api",
-      "../..:webrtc_common",
-      "../../api/audio_codecs:builtin_audio_decoder_factory",
-      "../../rtc_base:rtc_base_approved",
-      "../../test:test_support",
-      "//testing/gtest",
-    ]
-  }
-
-  rtc_source_set("neteq_test_tools_deprecated") {
-    testonly = true
-    sources = [
-      "neteq/test/NETEQTEST_DummyRTPpacket.cc",
-      "neteq/test/NETEQTEST_DummyRTPpacket.h",
-      "neteq/test/NETEQTEST_RTPpacket.cc",
-      "neteq/test/NETEQTEST_RTPpacket.h",
-    ]
-
-    deps = [
-      ":cng",
-      ":g711",
-      ":g722",
-      ":ilbc",
-      ":isac",
-      ":pcm16b",
-      "..:module_api",
-      "../..:webrtc_common",
-      "//testing/gtest",
-    ]
-
-    include_dirs = [
-      "neteq/include",
-      "neteq/test",
-      "../../",
-    ]
-
-    if (is_win) {
-      cflags = [
-        # Disable warnings to enable Win64 build, issue 1323.
-        "/wd4267",  # size_t to int truncation
-      ]
-    }
-  }
-
-  config("RTPencode_config") {
-    defines = [
-      "CODEC_ILBC",
-      "CODEC_PCM16B",
-      "CODEC_G711",
-      "CODEC_G722",
-      "CODEC_ISAC",
-      "CODEC_PCM16B_WB",
-      "CODEC_ISAC_SWB",
-      "CODEC_PCM16B_32KHZ",
-      "CODEC_PCM16B_48KHZ",
-      "CODEC_CNGCODEC8",
-      "CODEC_CNGCODEC16",
-      "CODEC_CNGCODEC32",
-      "CODEC_ATEVENT_DECODE",
-      "CODEC_RED",
-      "CODEC_OPUS",
-    ]
-  }
-
-  rtc_executable("RTPencode") {
-    testonly = true
-
-    deps = [
-      # TODO(hlundin): Make RTPencode use ACM to encode files.
-      ":cng",
-      ":g711",
-      ":g722",
-      ":ilbc",
-      ":isac",
-      ":neteq",
-      ":neteq_test_tools_deprecated",
-      ":pcm16b",
-      ":webrtc_opus",
-      "../..:webrtc_common",
-      "../../common_audio",
-      "../../rtc_base:rtc_base_approved",
-      "../../system_wrappers:metrics_default",
-      "../../test:field_trial",
-    ]
-
-    configs += [ ":RTPencode_config" ]
-
-    sources = [
-      "neteq/test/PayloadTypes.h",
-      "neteq/test/RTPencode.cc",
-    ]
-
-    include_dirs = [
-      "neteq/include",
-      "neteq/test",
-    ]
-
-    if (is_win) {
-      cflags = [
-        # Disable warnings to enable Win64 build, issue 1323.
-        "/wd4267",  # size_t to int truncation
-      ]
-    }
-  }
-
-  rtc_executable("RTPchange") {
-    testonly = true
-
-    sources = [
-      "neteq/test/RTPchange.cc",
-    ]
-
-    deps = [
-      ":neteq_test_tools_deprecated",
-    ]
-  }
-
-  rtc_executable("rtpcat") {
-    testonly = true
-
-    sources = [
-      "neteq/tools/rtpcat.cc",
-    ]
-
-    deps = [
-      "../../rtc_base:rtc_base_approved",
-      "../../system_wrappers:system_wrappers_default",
-      "../../test:rtp_test_utils",
-      "//testing/gtest",
-    ]
-  }
-
-  rtc_executable("RTPtimeshift") {
-    testonly = true
-
-    sources = [
-      "neteq/test/RTPtimeshift.cc",
-    ]
-
-    deps = [
-      ":neteq_test_tools_deprecated",
-      "../../test:test_support",
-      "//testing/gtest",
-    ]
-  }
-
-  rtc_executable("RTPjitter") {
-    testonly = true
-    deps = [
-      "../..:webrtc_common",
-      "../../rtc_base:rtc_base_approved",
-      "../../test:test_support",
-      "//testing/gtest",
-    ]
-    sources = [
-      "neteq/test/RTPjitter.cc",
-    ]
-  }
-
-  rtc_executable("rtp_analyze") {
-    testonly = true
-
-    sources = [
-      "neteq/tools/rtp_analyze.cc",
-    ]
-
-    deps = [
-      ":neteq",
-      ":neteq_test_tools",
-      ":pcm16b",
-      "../../rtc_base:rtc_base_approved",
-      "../../system_wrappers:system_wrappers_default",
-      "//testing/gtest",
-    ]
-
-    if (!build_with_chromium && is_clang) {
-      # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-    }
-  }
-
-  rtc_executable("neteq_opus_quality_test") {
-    testonly = true
-
-    sources = [
-      "neteq/test/neteq_opus_quality_test.cc",
-    ]
-
-    deps = [
-      ":neteq",
-      ":neteq_quality_test_support",
-      ":neteq_tools",
-      ":webrtc_opus",
-      "../../rtc_base:rtc_base_approved",
-      "../../test:test_main",
-      "//testing/gtest",
-    ]
-  }
-
-  rtc_executable("neteq_speed_test") {
-    testonly = true
-
-    sources = [
-      "neteq/test/neteq_speed_test.cc",
-    ]
-
-    deps = [
-      ":neteq",
-      ":neteq_test_support",
-      "../..:webrtc_common",
-      "../../rtc_base:rtc_base_approved",
-      "../../system_wrappers:system_wrappers_default",
-      "../../test:test_support",
-    ]
-  }
-
-  rtc_executable("neteq_ilbc_quality_test") {
-    testonly = true
-
-    sources = [
-      "neteq/test/neteq_ilbc_quality_test.cc",
-    ]
-
-    deps = [
-      ":ilbc",
-      ":neteq",
-      ":neteq_quality_test_support",
-      ":neteq_tools",
-      "../..:webrtc_common",
-      "../../rtc_base:rtc_base_approved",
-      "../../system_wrappers:system_wrappers_default",
-      "../../test:test_main",
-      "//testing/gtest",
-    ]
-  }
-
-  rtc_executable("neteq_isac_quality_test") {
-    testonly = true
-
-    sources = [
-      "neteq/test/neteq_isac_quality_test.cc",
-    ]
-
-    deps = [
-      ":isac_fix",
-      ":neteq",
-      ":neteq_quality_test_support",
-      "../../rtc_base:rtc_base_approved",
-      "../../test:test_main",
-      "//testing/gtest",
-    ]
-  }
-
-  rtc_executable("neteq_pcmu_quality_test") {
-    testonly = true
-
-    sources = [
-      "neteq/test/neteq_pcmu_quality_test.cc",
-    ]
-
-    deps = [
-      ":g711",
-      ":neteq",
-      ":neteq_quality_test_support",
-      "../../rtc_base:rtc_base_approved",
-      "../../test:test_main",
-      "//testing/gtest",
-    ]
-  }
-
-  rtc_executable("isac_fix_test") {
-    testonly = true
-
-    sources = [
-      "codecs/isac/fix/test/kenny.cc",
-    ]
-
-    deps = [
-      ":isac_fix",
-      "../../test:test_support",
-    ]
-
-    data = [
-      "../../../resources/speech_and_misc_wb.pcm",
-    ]
-
-    if (is_win) {
-      cflags = [
-        # Disable warnings to enable Win64 build, issue 1323.
-        "/wd4267",  # size_t to int truncation
-      ]
-    }
-  }
-
-  config("isac_test_warnings_config") {
-    if (is_win && is_clang) {
-      cflags = [
-        # Disable warnings failing when compiling with Clang on Windows.
-        # https://bugs.chromium.org/p/webrtc/issues/detail?id=5366
-        "-Wno-format",
-      ]
-    }
-  }
-
-  rtc_source_set("isac_test_util") {
-    testonly = true
-    sources = [
-      "codecs/isac/main/util/utility.c",
-    ]
-  }
-
-  rtc_executable("isac_test") {
-    testonly = true
-
-    sources = [
-      "codecs/isac/main/test/simpleKenny.c",
-    ]
-
-    include_dirs = [
-      "codecs/isac/main/include",
-      "codecs/isac/main/test",
-      "codecs/isac/main/util",
-    ]
-
-    deps = [
-      ":isac",
-      ":isac_test_util",
-      "../../rtc_base:rtc_base_approved",
-    ]
-
-    configs += [ ":isac_test_warnings_config" ]
-  }
-
-  rtc_executable("g711_test") {
-    testonly = true
-
-    sources = [
-      "codecs/g711/test/testG711.cc",
-    ]
-
-    deps = [
-      ":g711",
-    ]
-  }
-
-  rtc_executable("g722_test") {
-    testonly = true
-
-    sources = [
-      "codecs/g722/test/testG722.cc",
-    ]
-
-    deps = [
-      ":g722",
-      "../..:webrtc_common",
-    ]
-  }
-
-  rtc_executable("isac_api_test") {
-    testonly = true
-
-    sources = [
-      "codecs/isac/main/test/ReleaseTest-API/ReleaseTest-API.cc",
-    ]
-
-    deps = [
-      ":isac",
-      ":isac_test_util",
-      "../../rtc_base:rtc_base_approved",
-    ]
-
-    include_dirs = [
-      "codecs/isac/main/include",
-      "codecs/isac/main/test",
-      "codecs/isac/main/util",
-    ]
-  }
-
-  rtc_executable("isac_switch_samprate_test") {
-    testonly = true
-
-    sources = [
-      "codecs/isac/main/test/SwitchingSampRate/SwitchingSampRate.cc",
-    ]
-
-    deps = [
-      ":isac",
-      ":isac_test_util",
-    ]
-
-    include_dirs = [
-      "codecs/isac/main/include",
-      "codecs/isac/main/test",
-      "codecs/isac/main/util",
-      "../../common_audio/signal_processing/include",
-    ]
-  }
-
-  rtc_executable("ilbc_test") {
-    testonly = true
-
-    sources = [
-      "codecs/ilbc/test/iLBC_test.c",
-    ]
-
-    deps = [
-      ":ilbc",
-    ]
-  }
-
-  rtc_executable("webrtc_opus_fec_test") {
-    testonly = true
-
-    sources = [
-      "codecs/opus/opus_fec_test.cc",
-    ]
-
-    deps = [
-      ":webrtc_opus",
-      "../../common_audio",
-      "../../rtc_base:rtc_base_approved",
-      "../../test:test_main",
-      "//testing/gtest",
-    ]
-
-    if (!build_with_chromium && is_clang) {
-      # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-    }
-  }
-
-  rtc_source_set("audio_coding_unittests") {
-    testonly = true
-
-    # Skip restricting visibility on mobile platforms since the tests on those
-    # gets additional generated targets which would require many lines here to
-    # cover (which would be confusing to read and hard to maintain).
-    if (!is_android && !is_ios) {
-      visibility = [ "..:modules_unittests" ]
-    }
-    sources = [
-      "acm2/acm_receiver_unittest.cc",
-      "acm2/audio_coding_module_unittest.cc",
-      "acm2/call_statistics_unittest.cc",
-      "acm2/codec_manager_unittest.cc",
-      "acm2/rent_a_codec_unittest.cc",
-      "audio_network_adaptor/audio_network_adaptor_impl_unittest.cc",
-      "audio_network_adaptor/bitrate_controller_unittest.cc",
-      "audio_network_adaptor/channel_controller_unittest.cc",
-      "audio_network_adaptor/controller_manager_unittest.cc",
-      "audio_network_adaptor/dtx_controller_unittest.cc",
-      "audio_network_adaptor/event_log_writer_unittest.cc",
-      "audio_network_adaptor/fec_controller_plr_based_unittest.cc",
-      "audio_network_adaptor/fec_controller_rplr_based_unittest.cc",
-      "audio_network_adaptor/frame_length_controller_unittest.cc",
-      "audio_network_adaptor/mock/mock_controller.h",
-      "audio_network_adaptor/mock/mock_controller_manager.h",
-      "audio_network_adaptor/util/threshold_curve_unittest.cc",
-      "codecs/builtin_audio_decoder_factory_unittest.cc",
-      "codecs/builtin_audio_encoder_factory_unittest.cc",
-      "codecs/cng/audio_encoder_cng_unittest.cc",
-      "codecs/cng/cng_unittest.cc",
-      "codecs/ilbc/ilbc_unittest.cc",
-      "codecs/isac/fix/source/filterbanks_unittest.cc",
-      "codecs/isac/fix/source/filters_unittest.cc",
-      "codecs/isac/fix/source/lpc_masking_model_unittest.cc",
-      "codecs/isac/fix/source/transform_unittest.cc",
-      "codecs/isac/main/source/audio_encoder_isac_unittest.cc",
-      "codecs/isac/main/source/isac_unittest.cc",
-      "codecs/isac/unittest.cc",
-      "codecs/legacy_encoded_audio_frame_unittest.cc",
-      "codecs/opus/audio_encoder_opus_unittest.cc",
-      "codecs/opus/opus_unittest.cc",
-      "codecs/red/audio_encoder_copy_red_unittest.cc",
-      "neteq/audio_multi_vector_unittest.cc",
-      "neteq/audio_vector_unittest.cc",
-      "neteq/background_noise_unittest.cc",
-      "neteq/buffer_level_filter_unittest.cc",
-      "neteq/comfort_noise_unittest.cc",
-      "neteq/decision_logic_unittest.cc",
-      "neteq/decoder_database_unittest.cc",
-      "neteq/delay_manager_unittest.cc",
-      "neteq/delay_peak_detector_unittest.cc",
-      "neteq/dsp_helper_unittest.cc",
-      "neteq/dtmf_buffer_unittest.cc",
-      "neteq/dtmf_tone_generator_unittest.cc",
-      "neteq/expand_unittest.cc",
-      "neteq/merge_unittest.cc",
-      "neteq/mock/mock_buffer_level_filter.h",
-      "neteq/mock/mock_decoder_database.h",
-      "neteq/mock/mock_delay_manager.h",
-      "neteq/mock/mock_delay_peak_detector.h",
-      "neteq/mock/mock_dtmf_buffer.h",
-      "neteq/mock/mock_dtmf_tone_generator.h",
-      "neteq/mock/mock_expand.h",
-      "neteq/mock/mock_external_decoder_pcm16b.h",
-      "neteq/mock/mock_packet_buffer.h",
-      "neteq/mock/mock_red_payload_splitter.h",
-      "neteq/mock/mock_statistics_calculator.h",
-      "neteq/nack_tracker_unittest.cc",
-      "neteq/neteq_external_decoder_unittest.cc",
-      "neteq/neteq_impl_unittest.cc",
-      "neteq/neteq_network_stats_unittest.cc",
-      "neteq/neteq_stereo_unittest.cc",
-      "neteq/neteq_unittest.cc",
-      "neteq/normal_unittest.cc",
-      "neteq/packet_buffer_unittest.cc",
-      "neteq/post_decode_vad_unittest.cc",
-      "neteq/random_vector_unittest.cc",
-      "neteq/red_payload_splitter_unittest.cc",
-      "neteq/sync_buffer_unittest.cc",
-      "neteq/tick_timer_unittest.cc",
-      "neteq/time_stretch_unittest.cc",
-      "neteq/timestamp_scaler_unittest.cc",
-      "neteq/tools/input_audio_file_unittest.cc",
-      "neteq/tools/packet_unittest.cc",
-    ]
-
-    deps = [
-      ":acm_receive_test",
-      ":acm_send_test",
-      ":audio_coding",
-      ":audio_coding_module_typedefs",
-      ":audio_format_conversion",
-      ":audio_network_adaptor",
-      ":cng",
-      ":g711",
-      ":ilbc",
-      ":isac",
-      ":isac_c",
-      ":isac_fix",
-      ":legacy_encoded_audio_frame",
-      ":neteq",
-      ":neteq_test_support",
-      ":neteq_test_tools",
-      ":pcm16b",
-      ":red",
-      ":rent_a_codec",
-      ":webrtc_opus",
-      "..:module_api",
-      "../..:webrtc_common",
-      "../../api/audio_codecs:audio_codecs_api",
-      "../../api/audio_codecs:builtin_audio_decoder_factory",
-      "../../api/audio_codecs:builtin_audio_encoder_factory",
-      "../../common_audio",
-      "../../rtc_base:protobuf_utils",
-      "../../rtc_base:rtc_base",
-      "../../rtc_base:rtc_base_approved",
-      "../../rtc_base:rtc_base_tests_utils",
-      "../../system_wrappers:system_wrappers",
-      "../../test:audio_codec_mocks",
-      "../../test:field_trial",
-      "../../test:rtp_test_utils",
-      "../../test:test_common",
-      "../../test:test_support",
-      "//testing/gmock",
-      "//testing/gtest",
-    ]
-
-    defines = audio_coding_defines
-
-    if (rtc_enable_protobuf) {
-      defines += [ "WEBRTC_NETEQ_UNITTEST_BITEXACT" ]
-      deps += [
-        ":ana_config_proto",
-        ":neteq_unittest_proto",
-      ]
-    }
-
-    if (!build_with_chromium && is_clang) {
-      # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-    }
-  }
-}
-
-# For backwards compatibility only! Use
-# webrtc/api/audio_codecs:audio_codecs_api instead.
-# TODO(kwiberg): Remove this.
-rtc_source_set("audio_decoder_interface") {
-  sources = [
-    "codecs/audio_decoder.h",
-  ]
-  deps = [
-    "../../api/audio_codecs:audio_codecs_api",
-  ]
-}
-
-# For backwards compatibility only! Use
-# webrtc/api/audio_codecs:audio_codecs_api instead.
-# TODO(ossu): Remove this.
-rtc_source_set("audio_encoder_interface") {
-  sources = [
-    "codecs/audio_encoder.h",
-  ]
-  deps = [
-    "../../api/audio_codecs:audio_codecs_api",
-  ]
-}
-
-# For backwards compatibility only! Use
-# webrtc/api/audio_codecs:builtin_audio_decoder_factory instead.
-# TODO(kwiberg): Remove this.
-rtc_source_set("builtin_audio_decoder_factory") {
-  sources = [
-    "codecs/builtin_audio_decoder_factory.h",
-  ]
-  deps = [
-    "../../api/audio_codecs:builtin_audio_decoder_factory",
-  ]
-}
-
-# For backwards compatibility only! Use
-# webrtc/api/audio_codecs:builtin_audio_decoder_factory instead.
-# TODO(ossu): Remove this.
-rtc_source_set("builtin_audio_encoder_factory") {
-  sources = [
-    "codecs/builtin_audio_encoder_factory.h",
-  ]
-  deps = [
-    "../../api/audio_codecs:builtin_audio_encoder_factory",
-  ]
-}
diff --git a/modules/audio_coding/DEPS b/modules/audio_coding/DEPS
deleted file mode 100644
index 3a745ff..0000000
--- a/modules/audio_coding/DEPS
+++ /dev/null
@@ -1,7 +0,0 @@
-include_rules = [
-  "+webrtc/call",
-  "+webrtc/common_audio",
-  "+webrtc/logging/rtc_event_log",
-  "+webrtc/audio_coding/neteq/neteq_unittest.pb.h",  # Different path.
-  "+webrtc/system_wrappers",
-]
diff --git a/modules/audio_coding/OWNERS b/modules/audio_coding/OWNERS
deleted file mode 100644
index c1adc56..0000000
--- a/modules/audio_coding/OWNERS
+++ /dev/null
@@ -1,11 +0,0 @@
-turaj@webrtc.org
-henrik.lundin@webrtc.org
-kwiberg@webrtc.org
-minyue@webrtc.org
-jan.skoglund@webrtc.org
-ossu@webrtc.org
-
-# These are for the common case of adding or renaming files. If you're doing
-# structural changes, please get a review from a reviewer in this file.
-per-file *.gn=*
-per-file *.gni=*
diff --git a/modules/audio_coding/acm2/acm_codec_database.cc b/modules/audio_coding/acm2/acm_codec_database.cc
deleted file mode 100644
index 7bd8ee7..0000000
--- a/modules/audio_coding/acm2/acm_codec_database.cc
+++ /dev/null
@@ -1,349 +0,0 @@
-/*
- *  Copyright (c) 2012 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.
- */
-
-/*
- * This file generates databases with information about all supported audio
- * codecs.
- */
-
-// TODO(tlegrand): Change constant input pointers in all functions to constant
-// references, where appropriate.
-#include "webrtc/modules/audio_coding/acm2/acm_codec_database.h"
-
-#include <assert.h>
-
-#include "webrtc/rtc_base/checks.h"
-
-#if ((defined WEBRTC_CODEC_ISAC) && (defined WEBRTC_CODEC_ISACFX))
-#error iSAC and iSACFX codecs cannot be enabled at the same time
-#endif
-
-namespace webrtc {
-
-namespace acm2 {
-
-namespace {
-
-// Checks if the bitrate is valid for iSAC.
-bool IsISACRateValid(int rate) {
-  return (rate == -1) || ((rate <= 56000) && (rate >= 10000));
-}
-
-// Checks if the bitrate is valid for iLBC.
-bool IsILBCRateValid(int rate, int frame_size_samples) {
-  if (((frame_size_samples == 240) || (frame_size_samples == 480)) &&
-      (rate == 13300)) {
-    return true;
-  } else if (((frame_size_samples == 160) || (frame_size_samples == 320)) &&
-      (rate == 15200)) {
-    return true;
-  } else {
-    return false;
-  }
-}
-
-// Checks if the bitrate is valid for Opus.
-bool IsOpusRateValid(int rate) {
-  return (rate >= 6000) && (rate <= 510000);
-}
-
-}  // namespace
-
-// Not yet used payload-types.
-// 83,  82,  81, 80, 79,  78,  77,  76,  75,  74,  73,  72,  71,  70,  69, 68,
-// 67, 66, 65
-
-const CodecInst ACMCodecDB::database_[] = {
-#if (defined(WEBRTC_CODEC_ISAC) || defined(WEBRTC_CODEC_ISACFX))
-  {103, "ISAC", 16000, 480, 1, 32000},
-# if (defined(WEBRTC_CODEC_ISAC))
-  {104, "ISAC", 32000, 960, 1, 56000},
-# endif
-#endif
-  // Mono
-  {107, "L16", 8000, 80, 1, 128000},
-  {108, "L16", 16000, 160, 1, 256000},
-  {109, "L16", 32000, 320, 1, 512000},
-  // Stereo
-  {111, "L16", 8000, 80, 2, 128000},
-  {112, "L16", 16000, 160, 2, 256000},
-  {113, "L16", 32000, 320, 2, 512000},
-  // G.711, PCM mu-law and A-law.
-  // Mono
-  {0, "PCMU", 8000, 160, 1, 64000},
-  {8, "PCMA", 8000, 160, 1, 64000},
-  // Stereo
-  {110, "PCMU", 8000, 160, 2, 64000},
-  {118, "PCMA", 8000, 160, 2, 64000},
-#ifdef WEBRTC_CODEC_ILBC
-  {102, "ILBC", 8000, 240, 1, 13300},
-#endif
-#ifdef WEBRTC_CODEC_G722
-  // Mono
-  {9, "G722", 16000, 320, 1, 64000},
-  // Stereo
-  {119, "G722", 16000, 320, 2, 64000},
-#endif
-#ifdef WEBRTC_CODEC_OPUS
-  // Opus internally supports 48, 24, 16, 12, 8 kHz.
-  // Mono and stereo.
-  {120, "opus", 48000, 960, 2, 64000},
-#endif
-  // Comfort noise for four different sampling frequencies.
-  {13, "CN", 8000, 240, 1, 0},
-  {98, "CN", 16000, 480, 1, 0},
-  {99, "CN", 32000, 960, 1, 0},
-#ifdef ENABLE_48000_HZ
-  {100, "CN", 48000, 1440, 1, 0},
-#endif
-  {106, "telephone-event", 8000, 240, 1, 0},
-  {114, "telephone-event", 16000, 240, 1, 0},
-  {115, "telephone-event", 32000, 240, 1, 0},
-  {116, "telephone-event", 48000, 240, 1, 0},
-#ifdef WEBRTC_CODEC_RED
-  {127, "red", 8000, 0, 1, 0},
-#endif
-  // To prevent compile errors due to trailing commas.
-  {-1, "Null", -1, -1, 0, -1}
-};
-
-// Create database with all codec settings at compile time.
-// Each entry needs the following parameters in the given order:
-// Number of allowed packet sizes, a vector with the allowed packet sizes,
-// Basic block samples, max number of channels that are supported.
-const ACMCodecDB::CodecSettings ACMCodecDB::codec_settings_[] = {
-#if (defined(WEBRTC_CODEC_ISAC) || defined(WEBRTC_CODEC_ISACFX))
-    {2, {480, 960}, 0, 1},
-# if (defined(WEBRTC_CODEC_ISAC))
-    {1, {960}, 0, 1},
-# endif
-#endif
-    // Mono
-    {4, {80, 160, 240, 320}, 0, 2},
-    {4, {160, 320, 480, 640}, 0, 2},
-    {2, {320, 640}, 0, 2},
-    // Stereo
-    {4, {80, 160, 240, 320}, 0, 2},
-    {4, {160, 320, 480, 640}, 0, 2},
-    {2, {320, 640}, 0, 2},
-    // G.711, PCM mu-law and A-law.
-    // Mono
-    {6, {80, 160, 240, 320, 400, 480}, 0, 2},
-    {6, {80, 160, 240, 320, 400, 480}, 0, 2},
-    // Stereo
-    {6, {80, 160, 240, 320, 400, 480}, 0, 2},
-    {6, {80, 160, 240, 320, 400, 480}, 0, 2},
-#ifdef WEBRTC_CODEC_ILBC
-    {4, {160, 240, 320, 480}, 0, 1},
-#endif
-#ifdef WEBRTC_CODEC_G722
-    // Mono
-    {6, {160, 320, 480, 640, 800, 960}, 0, 2},
-    // Stereo
-    {6, {160, 320, 480, 640, 800, 960}, 0, 2},
-#endif
-#ifdef WEBRTC_CODEC_OPUS
-    // Opus supports frames shorter than 10ms,
-    // but it doesn't help us to use them.
-    // Mono and stereo.
-#if WEBRTC_OPUS_SUPPORT_120MS_PTIME
-    {5, {480, 960, 1920, 2880, 5760}, 0, 2},
-#else
-    {4, {480, 960, 1920, 2880}, 0, 2},
-#endif
-#endif
-    // Comfort noise for three different sampling frequencies.
-    {1, {240}, 240, 1},
-    {1, {480}, 480, 1},
-    {1, {960}, 960, 1},
-// TODO(solenberg): What is this flag? It is never set in the build files.
-#ifdef ENABLE_48000_HZ
-    {1, {1440}, 1440, 1},
-#endif
-    {1, {240}, 240, 1},
-    {1, {240}, 240, 1},
-    {1, {240}, 240, 1},
-    {1, {240}, 240, 1},
-#ifdef WEBRTC_CODEC_RED
-    {1, {0}, 0, 1},
-#endif
-    // To prevent compile errors due to trailing commas.
-    {-1, {-1}, -1, 0}
-};
-
-// Create a database of all NetEQ decoders at compile time.
-const NetEqDecoder ACMCodecDB::neteq_decoders_[] = {
-#if (defined(WEBRTC_CODEC_ISAC) || defined(WEBRTC_CODEC_ISACFX))
-    NetEqDecoder::kDecoderISAC,
-# if (defined(WEBRTC_CODEC_ISAC))
-    NetEqDecoder::kDecoderISACswb,
-# endif
-#endif
-    // Mono
-    NetEqDecoder::kDecoderPCM16B, NetEqDecoder::kDecoderPCM16Bwb,
-    NetEqDecoder::kDecoderPCM16Bswb32kHz,
-    // Stereo
-    NetEqDecoder::kDecoderPCM16B_2ch, NetEqDecoder::kDecoderPCM16Bwb_2ch,
-    NetEqDecoder::kDecoderPCM16Bswb32kHz_2ch,
-    // G.711, PCM mu-las and A-law.
-    // Mono
-    NetEqDecoder::kDecoderPCMu, NetEqDecoder::kDecoderPCMa,
-    // Stereo
-    NetEqDecoder::kDecoderPCMu_2ch, NetEqDecoder::kDecoderPCMa_2ch,
-#ifdef WEBRTC_CODEC_ILBC
-    NetEqDecoder::kDecoderILBC,
-#endif
-#ifdef WEBRTC_CODEC_G722
-    // Mono
-    NetEqDecoder::kDecoderG722,
-    // Stereo
-    NetEqDecoder::kDecoderG722_2ch,
-#endif
-#ifdef WEBRTC_CODEC_OPUS
-    // Mono and stereo.
-    NetEqDecoder::kDecoderOpus,
-#endif
-    // Comfort noise for three different sampling frequencies.
-    NetEqDecoder::kDecoderCNGnb, NetEqDecoder::kDecoderCNGwb,
-    NetEqDecoder::kDecoderCNGswb32kHz,
-#ifdef ENABLE_48000_HZ
-    NetEqDecoder::kDecoderCNGswb48kHz,
-#endif
-    NetEqDecoder::kDecoderAVT,
-    NetEqDecoder::kDecoderAVT16kHz,
-    NetEqDecoder::kDecoderAVT32kHz,
-    NetEqDecoder::kDecoderAVT48kHz,
-#ifdef WEBRTC_CODEC_RED
-    NetEqDecoder::kDecoderRED,
-#endif
-};
-
-// Enumerator for error codes when asking for codec database id.
-enum {
-  kInvalidCodec = -10,
-  kInvalidPayloadtype = -30,
-  kInvalidPacketSize = -40,
-  kInvalidRate = -50
-};
-
-// Gets the codec id number from the database. If there is some mismatch in
-// the codec settings, the function will return an error code.
-// NOTE! The first mismatch found will generate the return value.
-int ACMCodecDB::CodecNumber(const CodecInst& codec_inst) {
-  // Look for a matching codec in the database.
-  int codec_id = CodecId(codec_inst);
-
-  // Checks if we found a matching codec.
-  if (codec_id == -1) {
-    return kInvalidCodec;
-  }
-
-  // Checks the validity of payload type
-  if (!RentACodec::IsPayloadTypeValid(codec_inst.pltype)) {
-    return kInvalidPayloadtype;
-  }
-
-  // Comfort Noise is special case, packet-size & rate is not checked.
-  if (STR_CASE_CMP(database_[codec_id].plname, "CN") == 0) {
-    return codec_id;
-  }
-
-  // RED is special case, packet-size & rate is not checked.
-  if (STR_CASE_CMP(database_[codec_id].plname, "red") == 0) {
-    return codec_id;
-  }
-
-  // Checks the validity of packet size.
-  if (codec_settings_[codec_id].num_packet_sizes > 0) {
-    bool packet_size_ok = false;
-    int i;
-    int packet_size_samples;
-    for (i = 0; i < codec_settings_[codec_id].num_packet_sizes; i++) {
-      packet_size_samples =
-          codec_settings_[codec_id].packet_sizes_samples[i];
-      if (codec_inst.pacsize == packet_size_samples) {
-        packet_size_ok = true;
-        break;
-      }
-    }
-
-    if (!packet_size_ok) {
-      return kInvalidPacketSize;
-    }
-  }
-
-  if (codec_inst.pacsize < 1) {
-    return kInvalidPacketSize;
-  }
-
-  // Check the validity of rate. Codecs with multiple rates have their own
-  // function for this.
-  if (STR_CASE_CMP("isac", codec_inst.plname) == 0) {
-    return IsISACRateValid(codec_inst.rate) ? codec_id : kInvalidRate;
-  } else if (STR_CASE_CMP("ilbc", codec_inst.plname) == 0) {
-    return IsILBCRateValid(codec_inst.rate, codec_inst.pacsize)
-        ? codec_id : kInvalidRate;
-  } else if (STR_CASE_CMP("opus", codec_inst.plname) == 0) {
-    return IsOpusRateValid(codec_inst.rate)
-        ? codec_id : kInvalidRate;
-  }
-
-  return database_[codec_id].rate == codec_inst.rate ? codec_id : kInvalidRate;
-}
-
-// Looks for a matching payload name, frequency, and channels in the
-// codec list. Need to check all three since some codecs have several codec
-// entries with different frequencies and/or channels.
-// Does not check other codec settings, such as payload type and packet size.
-// Returns the id of the codec, or -1 if no match is found.
-int ACMCodecDB::CodecId(const CodecInst& codec_inst) {
-  return (CodecId(codec_inst.plname, codec_inst.plfreq,
-                  codec_inst.channels));
-}
-
-int ACMCodecDB::CodecId(const char* payload_name,
-                        int frequency,
-                        size_t channels) {
-  for (const CodecInst& ci : RentACodec::Database()) {
-    bool name_match = false;
-    bool frequency_match = false;
-    bool channels_match = false;
-
-    // Payload name, sampling frequency and number of channels need to match.
-    // NOTE! If |frequency| is -1, the frequency is not applicable, and is
-    // always treated as true, like for RED.
-    name_match = (STR_CASE_CMP(ci.plname, payload_name) == 0);
-    frequency_match = (frequency == ci.plfreq) || (frequency == -1);
-    // The number of channels must match for all codecs but Opus.
-    if (STR_CASE_CMP(payload_name, "opus") != 0) {
-      channels_match = (channels == ci.channels);
-    } else {
-      // For opus we just check that number of channels is valid.
-      channels_match = (channels == 1 || channels == 2);
-    }
-
-    if (name_match && frequency_match && channels_match) {
-      // We have found a matching codec in the list.
-      return &ci - RentACodec::Database().data();
-    }
-  }
-
-  // We didn't find a matching codec.
-  return -1;
-}
-// Gets codec id number from database for the receiver.
-int ACMCodecDB::ReceiverCodecNumber(const CodecInst& codec_inst) {
-  // Look for a matching codec in the database.
-  return CodecId(codec_inst);
-}
-
-}  // namespace acm2
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/acm2/acm_codec_database.h b/modules/audio_coding/acm2/acm_codec_database.h
deleted file mode 100644
index d586cb9..0000000
--- a/modules/audio_coding/acm2/acm_codec_database.h
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- *  Copyright (c) 2012 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.
- */
-
-/*
- * This file generates databases with information about all supported audio
- * codecs.
- */
-
-#ifndef WEBRTC_MODULES_AUDIO_CODING_ACM2_ACM_CODEC_DATABASE_H_
-#define WEBRTC_MODULES_AUDIO_CODING_ACM2_ACM_CODEC_DATABASE_H_
-
-#include "webrtc/common_types.h"
-#include "webrtc/modules/audio_coding/acm2/rent_a_codec.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-namespace acm2 {
-
-// TODO(tlegrand): replace class ACMCodecDB with a namespace.
-class ACMCodecDB {
- public:
-  // kMaxNumCodecs - Maximum number of codecs that can be activated in one
-  //                 build.
-  // kMaxNumPacketSize - Maximum number of allowed packet sizes for one codec.
-  // These might need to be increased if adding a new codec to the database
-  static const int kMaxNumCodecs =  50;
-  static const int kMaxNumPacketSize = 6;
-
-  // Codec specific settings
-  //
-  // num_packet_sizes     - number of allowed packet sizes.
-  // packet_sizes_samples - list of the allowed packet sizes.
-  // basic_block_samples  - assigned a value different from 0 if the codec
-  //                        requires to be fed with a specific number of samples
-  //                        that can be different from packet size.
-  // channel_support      - number of channels supported to encode;
-  //                        1 = mono, 2 = stereo, etc.
-  struct CodecSettings {
-    int num_packet_sizes;
-    int packet_sizes_samples[kMaxNumPacketSize];
-    int basic_block_samples;
-    size_t channel_support;
-  };
-
-  // Returns codec id from database, given the information received in the input
-  // [codec_inst].
-  // Input:
-  //   [codec_inst] - Information about the codec for which we require the
-  //                  database id.
-  // Return:
-  //   codec id if successful, otherwise < 0.
-  static int CodecNumber(const CodecInst& codec_inst);
-  static int CodecId(const CodecInst& codec_inst);
-  static int CodecId(const char* payload_name, int frequency, size_t channels);
-  static int ReceiverCodecNumber(const CodecInst& codec_inst);
-
-  // Databases with information about the supported codecs
-  // database_ - stored information about all codecs: payload type, name,
-  //             sampling frequency, packet size in samples, default channel
-  //             support, and default rate.
-  // codec_settings_ - stored codec settings: number of allowed packet sizes,
-  //                   a vector with the allowed packet sizes, basic block
-  //                   samples, and max number of channels that are supported.
-  // neteq_decoders_ - list of supported decoders in NetEQ.
-  static const CodecInst database_[kMaxNumCodecs];
-  static const CodecSettings codec_settings_[kMaxNumCodecs];
-  static const NetEqDecoder neteq_decoders_[kMaxNumCodecs];
-};
-
-}  // namespace acm2
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_CODING_ACM2_ACM_CODEC_DATABASE_H_
diff --git a/modules/audio_coding/acm2/acm_receive_test.cc b/modules/audio_coding/acm2/acm_receive_test.cc
deleted file mode 100644
index 1eae859..0000000
--- a/modules/audio_coding/acm2/acm_receive_test.cc
+++ /dev/null
@@ -1,243 +0,0 @@
-/*
- *  Copyright (c) 2014 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/acm2/acm_receive_test.h"
-
-#include <assert.h>
-#include <stdio.h>
-
-#include <memory>
-
-#include "webrtc/api/audio_codecs/builtin_audio_decoder_factory.h"
-#include "webrtc/modules/audio_coding/codecs/audio_format_conversion.h"
-#include "webrtc/modules/audio_coding/include/audio_coding_module.h"
-#include "webrtc/modules/audio_coding/neteq/tools/audio_sink.h"
-#include "webrtc/modules/audio_coding/neteq/tools/packet.h"
-#include "webrtc/modules/audio_coding/neteq/tools/packet_source.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-namespace test {
-
-namespace {
-// Returns true if the codec should be registered, otherwise false. Changes
-// the number of channels for the Opus codec to always be 1.
-bool ModifyAndUseThisCodec(CodecInst* codec_param) {
-  if (STR_CASE_CMP(codec_param->plname, "CN") == 0 &&
-      codec_param->plfreq == 48000)
-    return false;  // Skip 48 kHz comfort noise.
-
-  if (STR_CASE_CMP(codec_param->plname, "telephone-event") == 0)
-    return false;  // Skip DTFM.
-
-  return true;
-}
-
-// Remaps payload types from ACM's default to those used in the resource file
-// neteq_universal_new.rtp. Returns true if the codec should be registered,
-// otherwise false. The payload types are set as follows (all are mono codecs):
-// PCMu = 0;
-// PCMa = 8;
-// Comfort noise 8 kHz = 13
-// Comfort noise 16 kHz = 98
-// Comfort noise 32 kHz = 99
-// iLBC = 102
-// iSAC wideband = 103
-// iSAC super-wideband = 104
-// AVT/DTMF = 106
-// RED = 117
-// PCM16b 8 kHz = 93
-// PCM16b 16 kHz = 94
-// PCM16b 32 kHz = 95
-// G.722 = 94
-bool RemapPltypeAndUseThisCodec(const char* plname,
-                                int plfreq,
-                                size_t channels,
-                                int* pltype) {
-  if (channels != 1)
-    return false;  // Don't use non-mono codecs.
-
-  // Re-map pltypes to those used in the NetEq test files.
-  if (STR_CASE_CMP(plname, "PCMU") == 0 && plfreq == 8000) {
-    *pltype = 0;
-  } else if (STR_CASE_CMP(plname, "PCMA") == 0 && plfreq == 8000) {
-    *pltype = 8;
-  } else if (STR_CASE_CMP(plname, "CN") == 0 && plfreq == 8000) {
-    *pltype = 13;
-  } else if (STR_CASE_CMP(plname, "CN") == 0 && plfreq == 16000) {
-    *pltype = 98;
-  } else if (STR_CASE_CMP(plname, "CN") == 0 && plfreq == 32000) {
-    *pltype = 99;
-  } else if (STR_CASE_CMP(plname, "ILBC") == 0) {
-    *pltype = 102;
-  } else if (STR_CASE_CMP(plname, "ISAC") == 0 && plfreq == 16000) {
-    *pltype = 103;
-  } else if (STR_CASE_CMP(plname, "ISAC") == 0 && plfreq == 32000) {
-    *pltype = 104;
-  } else if (STR_CASE_CMP(plname, "telephone-event") == 0 && plfreq == 8000) {
-    *pltype = 106;
-  } else if (STR_CASE_CMP(plname, "telephone-event") == 0 && plfreq == 16000) {
-    *pltype = 114;
-  } else if (STR_CASE_CMP(plname, "telephone-event") == 0 && plfreq == 32000) {
-    *pltype = 115;
-  } else if (STR_CASE_CMP(plname, "telephone-event") == 0 && plfreq == 48000) {
-    *pltype = 116;
-  } else if (STR_CASE_CMP(plname, "red") == 0) {
-    *pltype = 117;
-  } else if (STR_CASE_CMP(plname, "L16") == 0 && plfreq == 8000) {
-    *pltype = 93;
-  } else if (STR_CASE_CMP(plname, "L16") == 0 && plfreq == 16000) {
-    *pltype = 94;
-  } else if (STR_CASE_CMP(plname, "L16") == 0 && plfreq == 32000) {
-    *pltype = 95;
-  } else if (STR_CASE_CMP(plname, "G722") == 0) {
-    *pltype = 9;
-  } else {
-    // Don't use any other codecs.
-    return false;
-  }
-  return true;
-}
-
-AudioCodingModule::Config MakeAcmConfig(
-    Clock* clock,
-    rtc::scoped_refptr<AudioDecoderFactory> decoder_factory) {
-  AudioCodingModule::Config config;
-  config.id = 0;
-  config.clock = clock;
-  config.decoder_factory = std::move(decoder_factory);
-  return config;
-}
-
-}  // namespace
-
-AcmReceiveTestOldApi::AcmReceiveTestOldApi(
-    PacketSource* packet_source,
-    AudioSink* audio_sink,
-    int output_freq_hz,
-    NumOutputChannels exptected_output_channels,
-    rtc::scoped_refptr<AudioDecoderFactory> decoder_factory)
-    : clock_(0),
-      acm_(webrtc::AudioCodingModule::Create(
-          MakeAcmConfig(&clock_, std::move(decoder_factory)))),
-      packet_source_(packet_source),
-      audio_sink_(audio_sink),
-      output_freq_hz_(output_freq_hz),
-      exptected_output_channels_(exptected_output_channels) {}
-
-AcmReceiveTestOldApi::~AcmReceiveTestOldApi() = default;
-
-void AcmReceiveTestOldApi::RegisterDefaultCodecs() {
-  CodecInst my_codec_param;
-  for (int n = 0; n < acm_->NumberOfCodecs(); n++) {
-    ASSERT_EQ(0, acm_->Codec(n, &my_codec_param)) << "Failed to get codec.";
-    if (ModifyAndUseThisCodec(&my_codec_param)) {
-      ASSERT_EQ(true,
-                acm_->RegisterReceiveCodec(my_codec_param.pltype,
-                                           CodecInstToSdp(my_codec_param)))
-          << "Couldn't register receive codec.\n";
-    }
-  }
-}
-
-void AcmReceiveTestOldApi::RegisterNetEqTestCodecs() {
-  CodecInst my_codec_param;
-  for (int n = 0; n < acm_->NumberOfCodecs(); n++) {
-    ASSERT_EQ(0, acm_->Codec(n, &my_codec_param)) << "Failed to get codec.";
-    if (!ModifyAndUseThisCodec(&my_codec_param)) {
-      // Skip this codec.
-      continue;
-    }
-
-    if (RemapPltypeAndUseThisCodec(my_codec_param.plname,
-                                   my_codec_param.plfreq,
-                                   my_codec_param.channels,
-                                   &my_codec_param.pltype)) {
-      ASSERT_EQ(true,
-                acm_->RegisterReceiveCodec(my_codec_param.pltype,
-                                           CodecInstToSdp(my_codec_param)))
-          << "Couldn't register receive codec.\n";
-    }
-  }
-}
-
-void AcmReceiveTestOldApi::Run() {
-  for (std::unique_ptr<Packet> packet(packet_source_->NextPacket()); packet;
-       packet = packet_source_->NextPacket()) {
-    // Pull audio until time to insert packet.
-    while (clock_.TimeInMilliseconds() < packet->time_ms()) {
-      AudioFrame output_frame;
-      bool muted;
-      EXPECT_EQ(0,
-                acm_->PlayoutData10Ms(output_freq_hz_, &output_frame, &muted));
-      ASSERT_EQ(output_freq_hz_, output_frame.sample_rate_hz_);
-      ASSERT_FALSE(muted);
-      const size_t samples_per_block =
-          static_cast<size_t>(output_freq_hz_ * 10 / 1000);
-      EXPECT_EQ(samples_per_block, output_frame.samples_per_channel_);
-      if (exptected_output_channels_ != kArbitraryChannels) {
-        if (output_frame.speech_type_ == webrtc::AudioFrame::kPLC) {
-          // Don't check number of channels for PLC output, since each test run
-          // usually starts with a short period of mono PLC before decoding the
-          // first packet.
-        } else {
-          EXPECT_EQ(exptected_output_channels_, output_frame.num_channels_);
-        }
-      }
-      ASSERT_TRUE(audio_sink_->WriteAudioFrame(output_frame));
-      clock_.AdvanceTimeMilliseconds(10);
-      AfterGetAudio();
-    }
-
-    // Insert packet after converting from RTPHeader to WebRtcRTPHeader.
-    WebRtcRTPHeader header;
-    header.header = packet->header();
-    header.frameType = kAudioFrameSpeech;
-    memset(&header.type.Audio, 0, sizeof(RTPAudioHeader));
-    EXPECT_EQ(0,
-              acm_->IncomingPacket(
-                  packet->payload(),
-                  static_cast<int32_t>(packet->payload_length_bytes()),
-                  header))
-        << "Failure when inserting packet:" << std::endl
-        << "  PT = " << static_cast<int>(header.header.payloadType) << std::endl
-        << "  TS = " << header.header.timestamp << std::endl
-        << "  SN = " << header.header.sequenceNumber;
-  }
-}
-
-AcmReceiveTestToggleOutputFreqOldApi::AcmReceiveTestToggleOutputFreqOldApi(
-    PacketSource* packet_source,
-    AudioSink* audio_sink,
-    int output_freq_hz_1,
-    int output_freq_hz_2,
-    int toggle_period_ms,
-    NumOutputChannels exptected_output_channels)
-    : AcmReceiveTestOldApi(packet_source,
-                           audio_sink,
-                           output_freq_hz_1,
-                           exptected_output_channels,
-                           CreateBuiltinAudioDecoderFactory()),
-      output_freq_hz_1_(output_freq_hz_1),
-      output_freq_hz_2_(output_freq_hz_2),
-      toggle_period_ms_(toggle_period_ms),
-      last_toggle_time_ms_(clock_.TimeInMilliseconds()) {}
-
-void AcmReceiveTestToggleOutputFreqOldApi::AfterGetAudio() {
-  if (clock_.TimeInMilliseconds() >= last_toggle_time_ms_ + toggle_period_ms_) {
-    output_freq_hz_ = (output_freq_hz_ == output_freq_hz_1_)
-                          ? output_freq_hz_2_
-                          : output_freq_hz_1_;
-    last_toggle_time_ms_ = clock_.TimeInMilliseconds();
-  }
-}
-
-}  // namespace test
-}  // namespace webrtc
diff --git a/modules/audio_coding/acm2/acm_receive_test.h b/modules/audio_coding/acm2/acm_receive_test.h
deleted file mode 100644
index c7faa56..0000000
--- a/modules/audio_coding/acm2/acm_receive_test.h
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- *  Copyright (c) 2014 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_ACM2_ACM_RECEIVE_TEST_H_
-#define WEBRTC_MODULES_AUDIO_CODING_ACM2_ACM_RECEIVE_TEST_H_
-
-#include <memory>
-#include <string>
-
-#include "webrtc/api/audio_codecs/audio_decoder_factory.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/scoped_ref_ptr.h"
-#include "webrtc/system_wrappers/include/clock.h"
-
-namespace webrtc {
-class AudioCodingModule;
-class AudioDecoder;
-struct CodecInst;
-
-namespace test {
-class AudioSink;
-class PacketSource;
-
-class AcmReceiveTestOldApi {
- public:
-  enum NumOutputChannels {
-    kArbitraryChannels = 0,
-    kMonoOutput = 1,
-    kStereoOutput = 2
-  };
-
-  AcmReceiveTestOldApi(PacketSource* packet_source,
-                       AudioSink* audio_sink,
-                       int output_freq_hz,
-                       NumOutputChannels exptected_output_channels,
-                       rtc::scoped_refptr<AudioDecoderFactory> decoder_factory);
-  virtual ~AcmReceiveTestOldApi();
-
-  // Registers the codecs with default parameters from ACM.
-  void RegisterDefaultCodecs();
-
-  // Registers codecs with payload types matching the pre-encoded NetEq test
-  // files.
-  void RegisterNetEqTestCodecs();
-
-  // Runs the test and returns true if successful.
-  void Run();
-
-  AudioCodingModule* get_acm() { return acm_.get(); }
-
- protected:
-  // Method is called after each block of output audio is received from ACM.
-  virtual void AfterGetAudio() {}
-
-  SimulatedClock clock_;
-  std::unique_ptr<AudioCodingModule> acm_;
-  PacketSource* packet_source_;
-  AudioSink* audio_sink_;
-  int output_freq_hz_;
-  NumOutputChannels exptected_output_channels_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(AcmReceiveTestOldApi);
-};
-
-// This test toggles the output frequency every |toggle_period_ms|. The test
-// starts with |output_freq_hz_1|. Except for the toggling, it does the same
-// thing as AcmReceiveTestOldApi.
-class AcmReceiveTestToggleOutputFreqOldApi : public AcmReceiveTestOldApi {
- public:
-  AcmReceiveTestToggleOutputFreqOldApi(
-      PacketSource* packet_source,
-      AudioSink* audio_sink,
-      int output_freq_hz_1,
-      int output_freq_hz_2,
-      int toggle_period_ms,
-      NumOutputChannels exptected_output_channels);
-
- protected:
-  void AfterGetAudio() override;
-
-  const int output_freq_hz_1_;
-  const int output_freq_hz_2_;
-  const int toggle_period_ms_;
-  int64_t last_toggle_time_ms_;
-};
-
-}  // namespace test
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_AUDIO_CODING_ACM2_ACM_RECEIVE_TEST_H_
diff --git a/modules/audio_coding/acm2/acm_receiver.cc b/modules/audio_coding/acm2/acm_receiver.cc
deleted file mode 100644
index 8912eaa..0000000
--- a/modules/audio_coding/acm2/acm_receiver.cc
+++ /dev/null
@@ -1,406 +0,0 @@
-/*
- *  Copyright (c) 2013 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/acm2/acm_receiver.h"
-
-#include <stdlib.h>  // malloc
-
-#include <algorithm>  // sort
-#include <vector>
-
-#include "webrtc/api/audio_codecs/audio_decoder.h"
-#include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
-#include "webrtc/common_types.h"
-#include "webrtc/modules/audio_coding/acm2/acm_resampler.h"
-#include "webrtc/modules/audio_coding/acm2/call_statistics.h"
-#include "webrtc/modules/audio_coding/acm2/rent_a_codec.h"
-#include "webrtc/modules/audio_coding/neteq/include/neteq.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/format_macros.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/safe_conversions.h"
-#include "webrtc/system_wrappers/include/clock.h"
-
-namespace webrtc {
-
-namespace acm2 {
-
-AcmReceiver::AcmReceiver(const AudioCodingModule::Config& config)
-    : last_audio_buffer_(new int16_t[AudioFrame::kMaxDataSizeSamples]),
-      neteq_(NetEq::Create(config.neteq_config, config.decoder_factory)),
-      clock_(config.clock),
-      resampled_last_output_frame_(true) {
-  RTC_DCHECK(clock_);
-  memset(last_audio_buffer_.get(), 0, AudioFrame::kMaxDataSizeSamples);
-}
-
-AcmReceiver::~AcmReceiver() = default;
-
-int AcmReceiver::SetMinimumDelay(int delay_ms) {
-  if (neteq_->SetMinimumDelay(delay_ms))
-    return 0;
-  LOG(LERROR) << "AcmReceiver::SetExtraDelay " << delay_ms;
-  return -1;
-}
-
-int AcmReceiver::SetMaximumDelay(int delay_ms) {
-  if (neteq_->SetMaximumDelay(delay_ms))
-    return 0;
-  LOG(LERROR) << "AcmReceiver::SetExtraDelay " << delay_ms;
-  return -1;
-}
-
-int AcmReceiver::LeastRequiredDelayMs() const {
-  return neteq_->LeastRequiredDelayMs();
-}
-
-rtc::Optional<int> AcmReceiver::last_packet_sample_rate_hz() const {
-  rtc::CritScope lock(&crit_sect_);
-  return last_packet_sample_rate_hz_;
-}
-
-int AcmReceiver::last_output_sample_rate_hz() const {
-  return neteq_->last_output_sample_rate_hz();
-}
-
-int AcmReceiver::InsertPacket(const WebRtcRTPHeader& rtp_header,
-                              rtc::ArrayView<const uint8_t> incoming_payload) {
-  uint32_t receive_timestamp = 0;
-  const RTPHeader* header = &rtp_header.header;  // Just a shorthand.
-
-  if (incoming_payload.empty()) {
-    neteq_->InsertEmptyPacket(rtp_header.header);
-    return 0;
-  }
-
-  {
-    rtc::CritScope lock(&crit_sect_);
-
-    const rtc::Optional<CodecInst> ci =
-        RtpHeaderToDecoder(*header, incoming_payload[0]);
-    if (!ci) {
-      LOG_F(LS_ERROR) << "Payload-type "
-                      << static_cast<int>(header->payloadType)
-                      << " is not registered.";
-      return -1;
-    }
-    receive_timestamp = NowInTimestamp(ci->plfreq);
-
-    if (STR_CASE_CMP(ci->plname, "cn") == 0) {
-      if (last_audio_decoder_ && last_audio_decoder_->channels > 1) {
-        // This is a CNG and the audio codec is not mono, so skip pushing in
-        // packets into NetEq.
-        return 0;
-      }
-    } else {
-      last_audio_decoder_ = ci;
-      last_audio_format_ = neteq_->GetDecoderFormat(ci->pltype);
-      RTC_DCHECK(last_audio_format_);
-      last_packet_sample_rate_hz_ = rtc::Optional<int>(ci->plfreq);
-    }
-  }  // |crit_sect_| is released.
-
-  if (neteq_->InsertPacket(rtp_header.header, incoming_payload,
-                           receive_timestamp) < 0) {
-    LOG(LERROR) << "AcmReceiver::InsertPacket "
-                << static_cast<int>(header->payloadType)
-                << " Failed to insert packet";
-    return -1;
-  }
-  return 0;
-}
-
-int AcmReceiver::GetAudio(int desired_freq_hz,
-                          AudioFrame* audio_frame,
-                          bool* muted) {
-  RTC_DCHECK(muted);
-  // Accessing members, take the lock.
-  rtc::CritScope lock(&crit_sect_);
-
-  if (neteq_->GetAudio(audio_frame, muted) != NetEq::kOK) {
-    LOG(LERROR) << "AcmReceiver::GetAudio - NetEq Failed.";
-    return -1;
-  }
-
-  const int current_sample_rate_hz = neteq_->last_output_sample_rate_hz();
-
-  // Update if resampling is required.
-  const bool need_resampling =
-      (desired_freq_hz != -1) && (current_sample_rate_hz != desired_freq_hz);
-
-  if (need_resampling && !resampled_last_output_frame_) {
-    // Prime the resampler with the last frame.
-    int16_t temp_output[AudioFrame::kMaxDataSizeSamples];
-    int samples_per_channel_int = resampler_.Resample10Msec(
-        last_audio_buffer_.get(), current_sample_rate_hz, desired_freq_hz,
-        audio_frame->num_channels_, AudioFrame::kMaxDataSizeSamples,
-        temp_output);
-    if (samples_per_channel_int < 0) {
-      LOG(LERROR) << "AcmReceiver::GetAudio - "
-                     "Resampling last_audio_buffer_ failed.";
-      return -1;
-    }
-  }
-
-  // TODO(henrik.lundin) Glitches in the output may appear if the output rate
-  // from NetEq changes. See WebRTC issue 3923.
-  if (need_resampling) {
-    // TODO(yujo): handle this more efficiently for muted frames.
-    int samples_per_channel_int = resampler_.Resample10Msec(
-        audio_frame->data(), current_sample_rate_hz, desired_freq_hz,
-        audio_frame->num_channels_, AudioFrame::kMaxDataSizeSamples,
-        audio_frame->mutable_data());
-    if (samples_per_channel_int < 0) {
-      LOG(LERROR) << "AcmReceiver::GetAudio - Resampling audio_buffer_ failed.";
-      return -1;
-    }
-    audio_frame->samples_per_channel_ =
-        static_cast<size_t>(samples_per_channel_int);
-    audio_frame->sample_rate_hz_ = desired_freq_hz;
-    RTC_DCHECK_EQ(
-        audio_frame->sample_rate_hz_,
-        rtc::dchecked_cast<int>(audio_frame->samples_per_channel_ * 100));
-    resampled_last_output_frame_ = true;
-  } else {
-    resampled_last_output_frame_ = false;
-    // We might end up here ONLY if codec is changed.
-  }
-
-  // Store current audio in |last_audio_buffer_| for next time.
-  memcpy(last_audio_buffer_.get(), audio_frame->data(),
-         sizeof(int16_t) * audio_frame->samples_per_channel_ *
-             audio_frame->num_channels_);
-
-  call_stats_.DecodedByNetEq(audio_frame->speech_type_, *muted);
-  return 0;
-}
-
-void AcmReceiver::SetCodecs(const std::map<int, SdpAudioFormat>& codecs) {
-  neteq_->SetCodecs(codecs);
-}
-
-int32_t AcmReceiver::AddCodec(int acm_codec_id,
-                              uint8_t payload_type,
-                              size_t channels,
-                              int /*sample_rate_hz*/,
-                              AudioDecoder* audio_decoder,
-                              const std::string& name) {
-  // TODO(kwiberg): This function has been ignoring the |sample_rate_hz|
-  // argument for a long time. Arguably, it should simply be removed.
-
-  const auto neteq_decoder = [acm_codec_id, channels]() -> NetEqDecoder {
-    if (acm_codec_id == -1)
-      return NetEqDecoder::kDecoderArbitrary;  // External decoder.
-    const rtc::Optional<RentACodec::CodecId> cid =
-        RentACodec::CodecIdFromIndex(acm_codec_id);
-    RTC_DCHECK(cid) << "Invalid codec index: " << acm_codec_id;
-    const rtc::Optional<NetEqDecoder> ned =
-        RentACodec::NetEqDecoderFromCodecId(*cid, channels);
-    RTC_DCHECK(ned) << "Invalid codec ID: " << static_cast<int>(*cid);
-    return *ned;
-  }();
-  const rtc::Optional<SdpAudioFormat> new_format =
-      NetEqDecoderToSdpAudioFormat(neteq_decoder);
-
-  rtc::CritScope lock(&crit_sect_);
-
-  const auto old_format = neteq_->GetDecoderFormat(payload_type);
-  if (old_format && new_format && *old_format == *new_format) {
-    // Re-registering the same codec. Do nothing and return.
-    return 0;
-  }
-
-  if (neteq_->RemovePayloadType(payload_type) != NetEq::kOK) {
-    LOG(LERROR) << "Cannot remove payload " << static_cast<int>(payload_type);
-    return -1;
-  }
-
-  int ret_val;
-  if (!audio_decoder) {
-    ret_val = neteq_->RegisterPayloadType(neteq_decoder, name, payload_type);
-  } else {
-    ret_val = neteq_->RegisterExternalDecoder(
-        audio_decoder, neteq_decoder, name, payload_type);
-  }
-  if (ret_val != NetEq::kOK) {
-    LOG(LERROR) << "AcmReceiver::AddCodec " << acm_codec_id
-                << static_cast<int>(payload_type)
-                << " channels: " << channels;
-    return -1;
-  }
-  return 0;
-}
-
-bool AcmReceiver::AddCodec(int rtp_payload_type,
-                           const SdpAudioFormat& audio_format) {
-  const auto old_format = neteq_->GetDecoderFormat(rtp_payload_type);
-  if (old_format && *old_format == audio_format) {
-    // Re-registering the same codec. Do nothing and return.
-    return true;
-  }
-
-  if (neteq_->RemovePayloadType(rtp_payload_type) != NetEq::kOK) {
-    LOG(LERROR) << "AcmReceiver::AddCodec: Could not remove existing decoder"
-                   " for payload type "
-                << rtp_payload_type;
-    return false;
-  }
-
-  const bool success =
-      neteq_->RegisterPayloadType(rtp_payload_type, audio_format);
-  if (!success) {
-    LOG(LERROR) << "AcmReceiver::AddCodec failed for payload type "
-                << rtp_payload_type << ", decoder format " << audio_format;
-  }
-  return success;
-}
-
-void AcmReceiver::FlushBuffers() {
-  neteq_->FlushBuffers();
-}
-
-void AcmReceiver::RemoveAllCodecs() {
-  rtc::CritScope lock(&crit_sect_);
-  neteq_->RemoveAllPayloadTypes();
-  last_audio_decoder_ = rtc::Optional<CodecInst>();
-  last_audio_format_ = rtc::Optional<SdpAudioFormat>();
-  last_packet_sample_rate_hz_ = rtc::Optional<int>();
-}
-
-int AcmReceiver::RemoveCodec(uint8_t payload_type) {
-  rtc::CritScope lock(&crit_sect_);
-  if (neteq_->RemovePayloadType(payload_type) != NetEq::kOK) {
-    LOG(LERROR) << "AcmReceiver::RemoveCodec "
-                << static_cast<int>(payload_type);
-    return -1;
-  }
-  if (last_audio_decoder_ && payload_type == last_audio_decoder_->pltype) {
-    last_audio_decoder_ = rtc::Optional<CodecInst>();
-    last_audio_format_ = rtc::Optional<SdpAudioFormat>();
-    last_packet_sample_rate_hz_ = rtc::Optional<int>();
-  }
-  return 0;
-}
-
-rtc::Optional<uint32_t> AcmReceiver::GetPlayoutTimestamp() {
-  return neteq_->GetPlayoutTimestamp();
-}
-
-int AcmReceiver::FilteredCurrentDelayMs() const {
-  return neteq_->FilteredCurrentDelayMs();
-}
-
-int AcmReceiver::LastAudioCodec(CodecInst* codec) const {
-  rtc::CritScope lock(&crit_sect_);
-  if (!last_audio_decoder_) {
-    return -1;
-  }
-  *codec = *last_audio_decoder_;
-  return 0;
-}
-
-rtc::Optional<SdpAudioFormat> AcmReceiver::LastAudioFormat() const {
-  rtc::CritScope lock(&crit_sect_);
-  return last_audio_format_;
-}
-
-void AcmReceiver::GetNetworkStatistics(NetworkStatistics* acm_stat) {
-  NetEqNetworkStatistics neteq_stat;
-  // NetEq function always returns zero, so we don't check the return value.
-  neteq_->NetworkStatistics(&neteq_stat);
-
-  acm_stat->currentBufferSize = neteq_stat.current_buffer_size_ms;
-  acm_stat->preferredBufferSize = neteq_stat.preferred_buffer_size_ms;
-  acm_stat->jitterPeaksFound = neteq_stat.jitter_peaks_found ? true : false;
-  acm_stat->currentPacketLossRate = neteq_stat.packet_loss_rate;
-  acm_stat->currentExpandRate = neteq_stat.expand_rate;
-  acm_stat->currentSpeechExpandRate = neteq_stat.speech_expand_rate;
-  acm_stat->currentPreemptiveRate = neteq_stat.preemptive_rate;
-  acm_stat->currentAccelerateRate = neteq_stat.accelerate_rate;
-  acm_stat->currentSecondaryDecodedRate = neteq_stat.secondary_decoded_rate;
-  acm_stat->currentSecondaryDiscardedRate = neteq_stat.secondary_discarded_rate;
-  acm_stat->clockDriftPPM = neteq_stat.clockdrift_ppm;
-  acm_stat->addedSamples = neteq_stat.added_zero_samples;
-  acm_stat->meanWaitingTimeMs = neteq_stat.mean_waiting_time_ms;
-  acm_stat->medianWaitingTimeMs = neteq_stat.median_waiting_time_ms;
-  acm_stat->minWaitingTimeMs = neteq_stat.min_waiting_time_ms;
-  acm_stat->maxWaitingTimeMs = neteq_stat.max_waiting_time_ms;
-
-  NetEqLifetimeStatistics neteq_lifetime_stat = neteq_->GetLifetimeStatistics();
-  acm_stat->totalSamplesReceived = neteq_lifetime_stat.total_samples_received;
-  acm_stat->concealedSamples = neteq_lifetime_stat.concealed_samples;
-}
-
-int AcmReceiver::DecoderByPayloadType(uint8_t payload_type,
-                                      CodecInst* codec) const {
-  rtc::CritScope lock(&crit_sect_);
-  const rtc::Optional<CodecInst> ci = neteq_->GetDecoder(payload_type);
-  if (ci) {
-    *codec = *ci;
-    return 0;
-  } else {
-    LOG(LERROR) << "AcmReceiver::DecoderByPayloadType "
-                << static_cast<int>(payload_type);
-    return -1;
-  }
-}
-
-int AcmReceiver::EnableNack(size_t max_nack_list_size) {
-  neteq_->EnableNack(max_nack_list_size);
-  return 0;
-}
-
-void AcmReceiver::DisableNack() {
-  neteq_->DisableNack();
-}
-
-std::vector<uint16_t> AcmReceiver::GetNackList(
-    int64_t round_trip_time_ms) const {
-  return neteq_->GetNackList(round_trip_time_ms);
-}
-
-void AcmReceiver::ResetInitialDelay() {
-  neteq_->SetMinimumDelay(0);
-  // TODO(turajs): Should NetEq Buffer be flushed?
-}
-
-const rtc::Optional<CodecInst> AcmReceiver::RtpHeaderToDecoder(
-    const RTPHeader& rtp_header,
-    uint8_t first_payload_byte) const {
-  const rtc::Optional<CodecInst> ci =
-      neteq_->GetDecoder(rtp_header.payloadType);
-  if (ci && STR_CASE_CMP(ci->plname, "red") == 0) {
-    // This is a RED packet. Get the payload of the audio codec.
-    return neteq_->GetDecoder(first_payload_byte & 0x7f);
-  } else {
-    return ci;
-  }
-}
-
-uint32_t AcmReceiver::NowInTimestamp(int decoder_sampling_rate) const {
-  // Down-cast the time to (32-6)-bit since we only care about
-  // the least significant bits. (32-6) bits cover 2^(32-6) = 67108864 ms.
-  // We masked 6 most significant bits of 32-bit so there is no overflow in
-  // the conversion from milliseconds to timestamp.
-  const uint32_t now_in_ms = static_cast<uint32_t>(
-      clock_->TimeInMilliseconds() & 0x03ffffff);
-  return static_cast<uint32_t>(
-      (decoder_sampling_rate / 1000) * now_in_ms);
-}
-
-void AcmReceiver::GetDecodingCallStatistics(
-    AudioDecodingCallStats* stats) const {
-  rtc::CritScope lock(&crit_sect_);
-  *stats = call_stats_.GetDecodingStatistics();
-}
-
-}  // namespace acm2
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/acm2/acm_receiver.h b/modules/audio_coding/acm2/acm_receiver.h
deleted file mode 100644
index 93ff89c..0000000
--- a/modules/audio_coding/acm2/acm_receiver.h
+++ /dev/null
@@ -1,294 +0,0 @@
-/*
- *  Copyright (c) 2013 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_ACM2_ACM_RECEIVER_H_
-#define WEBRTC_MODULES_AUDIO_CODING_ACM2_ACM_RECEIVER_H_
-
-#include <map>
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "webrtc/api/array_view.h"
-#include "webrtc/api/optional.h"
-#include "webrtc/common_audio/vad/include/webrtc_vad.h"
-#include "webrtc/modules/audio_coding/acm2/acm_resampler.h"
-#include "webrtc/modules/audio_coding/acm2/call_statistics.h"
-#include "webrtc/modules/audio_coding/include/audio_coding_module.h"
-#include "webrtc/modules/audio_coding/neteq/include/neteq.h"
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/thread_annotations.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-struct CodecInst;
-class NetEq;
-
-namespace acm2 {
-
-class AcmReceiver {
- public:
-  // Constructor of the class
-  explicit AcmReceiver(const AudioCodingModule::Config& config);
-
-  // Destructor of the class.
-  ~AcmReceiver();
-
-  //
-  // Inserts a payload with its associated RTP-header into NetEq.
-  //
-  // Input:
-  //   - rtp_header           : RTP header for the incoming payload containing
-  //                            information about payload type, sequence number,
-  //                            timestamp, SSRC and marker bit.
-  //   - incoming_payload     : Incoming audio payload.
-  //   - length_payload       : Length of incoming audio payload in bytes.
-  //
-  // Return value             : 0 if OK.
-  //                           <0 if NetEq returned an error.
-  //
-  int InsertPacket(const WebRtcRTPHeader& rtp_header,
-                   rtc::ArrayView<const uint8_t> incoming_payload);
-
-  //
-  // Asks NetEq for 10 milliseconds of decoded audio.
-  //
-  // Input:
-  //   -desired_freq_hz       : specifies the sampling rate [Hz] of the output
-  //                            audio. If set -1 indicates to resampling is
-  //                            is required and the audio returned at the
-  //                            sampling rate of the decoder.
-  //
-  // Output:
-  //   -audio_frame           : an audio frame were output data and
-  //                            associated parameters are written to.
-  //   -muted                 : if true, the sample data in audio_frame is not
-  //                            populated, and must be interpreted as all zero.
-  //
-  // Return value             : 0 if OK.
-  //                           -1 if NetEq returned an error.
-  //
-  int GetAudio(int desired_freq_hz, AudioFrame* audio_frame, bool* muted);
-
-  // Replace the current set of decoders with the specified set.
-  void SetCodecs(const std::map<int, SdpAudioFormat>& codecs);
-
-  //
-  // Adds a new codec to the NetEq codec database.
-  //
-  // Input:
-  //   - acm_codec_id        : ACM codec ID; -1 means external decoder.
-  //   - payload_type        : payload type.
-  //   - sample_rate_hz      : sample rate.
-  //   - audio_decoder       : pointer to a decoder object. If it's null, then
-  //                           NetEq will internally create a decoder object
-  //                           based on the value of |acm_codec_id| (which
-  //                           mustn't be -1). Otherwise, NetEq will use the
-  //                           given decoder for the given payload type. NetEq
-  //                           won't take ownership of the decoder; it's up to
-  //                           the caller to delete it when it's no longer
-  //                           needed.
-  //
-  //                           Providing an existing decoder object here is
-  //                           necessary for external decoders, but may also be
-  //                           used for built-in decoders if NetEq doesn't have
-  //                           all the info it needs to construct them properly
-  //                           (e.g. iSAC, where the decoder needs to be paired
-  //                           with an encoder).
-  //
-  // Return value             : 0 if OK.
-  //                           <0 if NetEq returned an error.
-  //
-  int AddCodec(int acm_codec_id,
-               uint8_t payload_type,
-               size_t channels,
-               int sample_rate_hz,
-               AudioDecoder* audio_decoder,
-               const std::string& name);
-
-  // Adds a new decoder to the NetEq codec database. Returns true iff
-  // successful.
-  bool AddCodec(int rtp_payload_type, const SdpAudioFormat& audio_format);
-
-  //
-  // Sets a minimum delay for packet buffer. The given delay is maintained,
-  // unless channel condition dictates a higher delay.
-  //
-  // Input:
-  //   - delay_ms             : minimum delay in milliseconds.
-  //
-  // Return value             : 0 if OK.
-  //                           <0 if NetEq returned an error.
-  //
-  int SetMinimumDelay(int delay_ms);
-
-  //
-  // Sets a maximum delay [ms] for the packet buffer. The target delay does not
-  // exceed the given value, even if channel condition requires so.
-  //
-  // Input:
-  //   - delay_ms             : maximum delay in milliseconds.
-  //
-  // Return value             : 0 if OK.
-  //                           <0 if NetEq returned an error.
-  //
-  int SetMaximumDelay(int delay_ms);
-
-  //
-  // Get least required delay computed based on channel conditions. Note that
-  // this is before applying any user-defined limits (specified by calling
-  // (SetMinimumDelay() and/or SetMaximumDelay()).
-  //
-  int LeastRequiredDelayMs() const;
-
-  //
-  // Resets the initial delay to zero.
-  //
-  void ResetInitialDelay();
-
-  // Returns the sample rate of the decoder associated with the last incoming
-  // packet. If no packet of a registered non-CNG codec has been received, the
-  // return value is empty. Also, if the decoder was unregistered since the last
-  // packet was inserted, the return value is empty.
-  rtc::Optional<int> last_packet_sample_rate_hz() const;
-
-  // Returns last_output_sample_rate_hz from the NetEq instance.
-  int last_output_sample_rate_hz() const;
-
-  //
-  // Get the current network statistics from NetEq.
-  //
-  // Output:
-  //   - statistics           : The current network statistics.
-  //
-  void GetNetworkStatistics(NetworkStatistics* statistics);
-
-  //
-  // Flushes the NetEq packet and speech buffers.
-  //
-  void FlushBuffers();
-
-  //
-  // Removes a payload-type from the NetEq codec database.
-  //
-  // Input:
-  //   - payload_type         : the payload-type to be removed.
-  //
-  // Return value             : 0 if OK.
-  //                           -1 if an error occurred.
-  //
-  int RemoveCodec(uint8_t payload_type);
-
-  //
-  // Remove all registered codecs.
-  //
-  void RemoveAllCodecs();
-
-  // Returns the RTP timestamp for the last sample delivered by GetAudio().
-  // The return value will be empty if no valid timestamp is available.
-  rtc::Optional<uint32_t> GetPlayoutTimestamp();
-
-  // Returns the current total delay from NetEq (packet buffer and sync buffer)
-  // in ms, with smoothing applied to even out short-time fluctuations due to
-  // jitter. The packet buffer part of the delay is not updated during DTX/CNG
-  // periods.
-  //
-  int FilteredCurrentDelayMs() const;
-
-  //
-  // Get the audio codec associated with the last non-CNG/non-DTMF received
-  // payload. If no non-CNG/non-DTMF packet is received -1 is returned,
-  // otherwise return 0.
-  //
-  int LastAudioCodec(CodecInst* codec) const;
-
-  rtc::Optional<SdpAudioFormat> LastAudioFormat() const;
-
-  //
-  // Get a decoder given its registered payload-type.
-  //
-  // Input:
-  //    -payload_type         : the payload-type of the codec to be retrieved.
-  //
-  // Output:
-  //    -codec                : codec associated with the given payload-type.
-  //
-  // Return value             : 0 if succeeded.
-  //                           -1 if failed, e.g. given payload-type is not
-  //                              registered.
-  //
-  int DecoderByPayloadType(uint8_t payload_type,
-                           CodecInst* codec) const;
-
-  //
-  // Enable NACK and set the maximum size of the NACK list. If NACK is already
-  // enabled then the maximum NACK list size is modified accordingly.
-  //
-  // Input:
-  //    -max_nack_list_size  : maximum NACK list size
-  //                           should be positive (none zero) and less than or
-  //                           equal to |Nack::kNackListSizeLimit|
-  // Return value
-  //                         : 0 if succeeded.
-  //                          -1 if failed
-  //
-  int EnableNack(size_t max_nack_list_size);
-
-  // Disable NACK.
-  void DisableNack();
-
-  //
-  // Get a list of packets to be retransmitted.
-  //
-  // Input:
-  //    -round_trip_time_ms : estimate of the round-trip-time (in milliseconds).
-  // Return value           : list of packets to be retransmitted.
-  //
-  std::vector<uint16_t> GetNackList(int64_t round_trip_time_ms) const;
-
-  //
-  // Get statistics of calls to GetAudio().
-  void GetDecodingCallStatistics(AudioDecodingCallStats* stats) const;
-
- private:
-  struct Decoder {
-    int acm_codec_id;
-    uint8_t payload_type;
-    // This field is meaningful for codecs where both mono and
-    // stereo versions are registered under the same ID.
-    size_t channels;
-    int sample_rate_hz;
-  };
-
-  const rtc::Optional<CodecInst> RtpHeaderToDecoder(const RTPHeader& rtp_header,
-                                                    uint8_t first_payload_byte)
-      const RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_sect_);
-
-  uint32_t NowInTimestamp(int decoder_sampling_rate) const;
-
-  rtc::CriticalSection crit_sect_;
-  rtc::Optional<CodecInst> last_audio_decoder_ RTC_GUARDED_BY(crit_sect_);
-  rtc::Optional<SdpAudioFormat> last_audio_format_ RTC_GUARDED_BY(crit_sect_);
-  ACMResampler resampler_ RTC_GUARDED_BY(crit_sect_);
-  std::unique_ptr<int16_t[]> last_audio_buffer_ RTC_GUARDED_BY(crit_sect_);
-  CallStatistics call_stats_ RTC_GUARDED_BY(crit_sect_);
-  const std::unique_ptr<NetEq> neteq_;  // NetEq is thread-safe; no lock needed.
-  const Clock* const clock_;
-  bool resampled_last_output_frame_ RTC_GUARDED_BY(crit_sect_);
-  rtc::Optional<int> last_packet_sample_rate_hz_ RTC_GUARDED_BY(crit_sect_);
-};
-
-}  // namespace acm2
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_CODING_ACM2_ACM_RECEIVER_H_
diff --git a/modules/audio_coding/acm2/acm_receiver_unittest.cc b/modules/audio_coding/acm2/acm_receiver_unittest.cc
deleted file mode 100644
index 4026c5b..0000000
--- a/modules/audio_coding/acm2/acm_receiver_unittest.cc
+++ /dev/null
@@ -1,508 +0,0 @@
-/*
- *  Copyright (c) 2013 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/acm2/acm_receiver.h"
-
-#include <algorithm>  // std::min
-#include <memory>
-
-#include "webrtc/api/audio_codecs/builtin_audio_decoder_factory.h"
-#include "webrtc/modules/audio_coding/acm2/rent_a_codec.h"
-#include "webrtc/modules/audio_coding/include/audio_coding_module.h"
-#include "webrtc/modules/audio_coding/neteq/tools/rtp_generator.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/safe_conversions.h"
-#include "webrtc/system_wrappers/include/clock.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/testsupport/fileutils.h"
-
-namespace webrtc {
-
-namespace acm2 {
-namespace {
-
-bool CodecsEqual(const CodecInst& codec_a, const CodecInst& codec_b) {
-    if (strcmp(codec_a.plname, codec_b.plname) != 0 ||
-        codec_a.plfreq != codec_b.plfreq ||
-        codec_a.pltype != codec_b.pltype ||
-        codec_b.channels != codec_a.channels)
-      return false;
-    return true;
-}
-
-struct CodecIdInst {
-  explicit CodecIdInst(RentACodec::CodecId codec_id) {
-    const auto codec_ix = RentACodec::CodecIndexFromId(codec_id);
-    EXPECT_TRUE(codec_ix);
-    id = *codec_ix;
-    const auto codec_inst = RentACodec::CodecInstById(codec_id);
-    EXPECT_TRUE(codec_inst);
-    inst = *codec_inst;
-  }
-  int id;
-  CodecInst inst;
-};
-
-}  // namespace
-
-class AcmReceiverTestOldApi : public AudioPacketizationCallback,
-                              public ::testing::Test {
- protected:
-  AcmReceiverTestOldApi()
-      : timestamp_(0),
-        packet_sent_(false),
-        last_packet_send_timestamp_(timestamp_),
-        last_frame_type_(kEmptyFrame) {
-    config_.decoder_factory = CreateBuiltinAudioDecoderFactory();
-  }
-
-  ~AcmReceiverTestOldApi() {}
-
-  void SetUp() override {
-    acm_.reset(AudioCodingModule::Create(config_));
-    receiver_.reset(new AcmReceiver(config_));
-    ASSERT_TRUE(receiver_.get() != NULL);
-    ASSERT_TRUE(acm_.get() != NULL);
-    codecs_ = RentACodec::Database();
-
-    acm_->InitializeReceiver();
-    acm_->RegisterTransportCallback(this);
-
-    rtp_header_.header.sequenceNumber = 0;
-    rtp_header_.header.timestamp = 0;
-    rtp_header_.header.markerBit = false;
-    rtp_header_.header.ssrc = 0x12345678;  // Arbitrary.
-    rtp_header_.header.numCSRCs = 0;
-    rtp_header_.header.payloadType = 0;
-    rtp_header_.frameType = kAudioFrameSpeech;
-    rtp_header_.type.Audio.isCNG = false;
-  }
-
-  void TearDown() override {}
-
-  void InsertOnePacketOfSilence(int codec_id) {
-    CodecInst codec =
-        *RentACodec::CodecInstById(*RentACodec::CodecIdFromIndex(codec_id));
-    if (timestamp_ == 0) {  // This is the first time inserting audio.
-      ASSERT_EQ(0, acm_->RegisterSendCodec(codec));
-    } else {
-      auto current_codec = acm_->SendCodec();
-      ASSERT_TRUE(current_codec);
-      if (!CodecsEqual(codec, *current_codec))
-        ASSERT_EQ(0, acm_->RegisterSendCodec(codec));
-    }
-    AudioFrame frame;
-    // Frame setup according to the codec.
-    frame.sample_rate_hz_ = codec.plfreq;
-    frame.samples_per_channel_ = codec.plfreq / 100;  // 10 ms.
-    frame.num_channels_ = codec.channels;
-    frame.Mute();
-    packet_sent_ = false;
-    last_packet_send_timestamp_ = timestamp_;
-    while (!packet_sent_) {
-      frame.timestamp_ = timestamp_;
-      timestamp_ += frame.samples_per_channel_;
-      ASSERT_GE(acm_->Add10MsData(frame), 0);
-    }
-  }
-
-  template <size_t N>
-  void AddSetOfCodecs(const RentACodec::CodecId(&ids)[N]) {
-    for (auto id : ids) {
-      const auto i = RentACodec::CodecIndexFromId(id);
-      ASSERT_TRUE(i);
-      ASSERT_EQ(0, receiver_->AddCodec(*i, codecs_[*i].pltype,
-                                       codecs_[*i].channels, codecs_[*i].plfreq,
-                                       nullptr, codecs_[*i].plname));
-    }
-  }
-
-  int SendData(FrameType frame_type,
-               uint8_t payload_type,
-               uint32_t timestamp,
-               const uint8_t* payload_data,
-               size_t payload_len_bytes,
-               const RTPFragmentationHeader* fragmentation) override {
-    if (frame_type == kEmptyFrame)
-      return 0;
-
-    rtp_header_.header.payloadType = payload_type;
-    rtp_header_.frameType = frame_type;
-    if (frame_type == kAudioFrameSpeech)
-      rtp_header_.type.Audio.isCNG = false;
-    else
-      rtp_header_.type.Audio.isCNG = true;
-    rtp_header_.header.timestamp = timestamp;
-
-    int ret_val = receiver_->InsertPacket(
-        rtp_header_,
-        rtc::ArrayView<const uint8_t>(payload_data, payload_len_bytes));
-    if (ret_val < 0) {
-      assert(false);
-      return -1;
-    }
-    rtp_header_.header.sequenceNumber++;
-    packet_sent_ = true;
-    last_frame_type_ = frame_type;
-    return 0;
-  }
-
-  AudioCodingModule::Config config_;
-  std::unique_ptr<AcmReceiver> receiver_;
-  rtc::ArrayView<const CodecInst> codecs_;
-  std::unique_ptr<AudioCodingModule> acm_;
-  WebRtcRTPHeader rtp_header_;
-  uint32_t timestamp_;
-  bool packet_sent_;  // Set when SendData is called reset when inserting audio.
-  uint32_t last_packet_send_timestamp_;
-  FrameType last_frame_type_;
-};
-
-#if defined(WEBRTC_ANDROID)
-#define MAYBE_AddCodecGetCodec DISABLED_AddCodecGetCodec
-#else
-#define MAYBE_AddCodecGetCodec AddCodecGetCodec
-#endif
-TEST_F(AcmReceiverTestOldApi, MAYBE_AddCodecGetCodec) {
-  // Add codec.
-  for (size_t n = 0; n < codecs_.size(); ++n) {
-    if (n & 0x1) {  // Just add codecs with odd index.
-      EXPECT_EQ(
-          0, receiver_->AddCodec(n, codecs_[n].pltype, codecs_[n].channels,
-                                 codecs_[n].plfreq, NULL, codecs_[n].plname));
-    }
-  }
-  // Get codec and compare.
-  for (size_t n = 0; n < codecs_.size(); ++n) {
-    CodecInst my_codec;
-    if (n & 0x1) {
-      // Codecs with odd index should match the reference.
-      EXPECT_EQ(0, receiver_->DecoderByPayloadType(codecs_[n].pltype,
-                                                   &my_codec));
-      EXPECT_TRUE(CodecsEqual(codecs_[n], my_codec));
-    } else {
-      // Codecs with even index are not registered.
-      EXPECT_EQ(-1, receiver_->DecoderByPayloadType(codecs_[n].pltype,
-                                                    &my_codec));
-    }
-  }
-}
-
-#if defined(WEBRTC_ANDROID)
-#define MAYBE_AddCodecChangePayloadType DISABLED_AddCodecChangePayloadType
-#else
-#define MAYBE_AddCodecChangePayloadType AddCodecChangePayloadType
-#endif
-TEST_F(AcmReceiverTestOldApi, MAYBE_AddCodecChangePayloadType) {
-  const CodecIdInst codec1(RentACodec::CodecId::kPCMA);
-  CodecInst codec2 = codec1.inst;
-  ++codec2.pltype;
-  CodecInst test_codec;
-
-  // Register the same codec with different payloads.
-  EXPECT_EQ(0, receiver_->AddCodec(codec1.id, codec1.inst.pltype,
-                                   codec1.inst.channels, codec1.inst.plfreq,
-                                   nullptr, codec1.inst.plname));
-  EXPECT_EQ(0, receiver_->AddCodec(codec1.id, codec2.pltype, codec2.channels,
-                                   codec2.plfreq, NULL, codec2.plname));
-
-  // Both payload types should exist.
-  EXPECT_EQ(0,
-            receiver_->DecoderByPayloadType(codec1.inst.pltype, &test_codec));
-  EXPECT_EQ(true, CodecsEqual(codec1.inst, test_codec));
-  EXPECT_EQ(0, receiver_->DecoderByPayloadType(codec2.pltype, &test_codec));
-  EXPECT_EQ(true, CodecsEqual(codec2, test_codec));
-}
-
-#if defined(WEBRTC_ANDROID)
-#define MAYBE_AddCodecChangeCodecId DISABLED_AddCodecChangeCodecId
-#else
-#define MAYBE_AddCodecChangeCodecId AddCodecChangeCodecId
-#endif
-TEST_F(AcmReceiverTestOldApi, AddCodecChangeCodecId) {
-  const CodecIdInst codec1(RentACodec::CodecId::kPCMU);
-  CodecIdInst codec2(RentACodec::CodecId::kPCMA);
-  codec2.inst.pltype = codec1.inst.pltype;
-  CodecInst test_codec;
-
-  // Register the same payload type with different codec ID.
-  EXPECT_EQ(0, receiver_->AddCodec(codec1.id, codec1.inst.pltype,
-                                   codec1.inst.channels, codec1.inst.plfreq,
-                                   nullptr, codec1.inst.plname));
-  EXPECT_EQ(0, receiver_->AddCodec(codec2.id, codec2.inst.pltype,
-                                   codec2.inst.channels, codec2.inst.plfreq,
-                                   nullptr, codec2.inst.plname));
-
-  // Make sure that the last codec is used.
-  EXPECT_EQ(0,
-            receiver_->DecoderByPayloadType(codec2.inst.pltype, &test_codec));
-  EXPECT_EQ(true, CodecsEqual(codec2.inst, test_codec));
-}
-
-#if defined(WEBRTC_ANDROID)
-#define MAYBE_AddCodecRemoveCodec DISABLED_AddCodecRemoveCodec
-#else
-#define MAYBE_AddCodecRemoveCodec AddCodecRemoveCodec
-#endif
-TEST_F(AcmReceiverTestOldApi, MAYBE_AddCodecRemoveCodec) {
-  const CodecIdInst codec(RentACodec::CodecId::kPCMA);
-  const int payload_type = codec.inst.pltype;
-  EXPECT_EQ(
-      0, receiver_->AddCodec(codec.id, codec.inst.pltype, codec.inst.channels,
-                             codec.inst.plfreq, nullptr, codec.inst.plname));
-
-  // Remove non-existing codec should not fail. ACM1 legacy.
-  EXPECT_EQ(0, receiver_->RemoveCodec(payload_type + 1));
-
-  // Remove an existing codec.
-  EXPECT_EQ(0, receiver_->RemoveCodec(payload_type));
-
-  // Ask for the removed codec, must fail.
-  CodecInst ci;
-  EXPECT_EQ(-1, receiver_->DecoderByPayloadType(payload_type, &ci));
-}
-
-#if defined(WEBRTC_ANDROID)
-#define MAYBE_SampleRate DISABLED_SampleRate
-#else
-#define MAYBE_SampleRate SampleRate
-#endif
-TEST_F(AcmReceiverTestOldApi, MAYBE_SampleRate) {
-  const RentACodec::CodecId kCodecId[] = {RentACodec::CodecId::kISAC,
-                                          RentACodec::CodecId::kISACSWB};
-  AddSetOfCodecs(kCodecId);
-
-  AudioFrame frame;
-  const int kOutSampleRateHz = 8000;  // Different than codec sample rate.
-  for (const auto codec_id : kCodecId) {
-    const CodecIdInst codec(codec_id);
-    const int num_10ms_frames = codec.inst.pacsize / (codec.inst.plfreq / 100);
-    InsertOnePacketOfSilence(codec.id);
-    for (int k = 0; k < num_10ms_frames; ++k) {
-      bool muted;
-      EXPECT_EQ(0, receiver_->GetAudio(kOutSampleRateHz, &frame, &muted));
-    }
-    EXPECT_EQ(codec.inst.plfreq, receiver_->last_output_sample_rate_hz());
-  }
-}
-
-class AcmReceiverTestFaxModeOldApi : public AcmReceiverTestOldApi {
- protected:
-  AcmReceiverTestFaxModeOldApi() {
-    config_.neteq_config.playout_mode = kPlayoutFax;
-  }
-
-  void RunVerifyAudioFrame(RentACodec::CodecId codec_id) {
-    // Make sure "fax mode" is enabled. This will avoid delay changes unless the
-    // packet-loss concealment is made. We do this in order to make the
-    // timestamp increments predictable; in normal mode, NetEq may decide to do
-    // accelerate or pre-emptive expand operations after some time, offsetting
-    // the timestamp.
-    EXPECT_EQ(kPlayoutFax, config_.neteq_config.playout_mode);
-
-    const RentACodec::CodecId kCodecId[] = {codec_id};
-    AddSetOfCodecs(kCodecId);
-
-    const CodecIdInst codec(codec_id);
-    const int output_sample_rate_hz = codec.inst.plfreq;
-    const size_t output_channels = codec.inst.channels;
-    const size_t samples_per_ms = rtc::checked_cast<size_t>(
-        rtc::CheckedDivExact(output_sample_rate_hz, 1000));
-    const int num_10ms_frames = rtc::CheckedDivExact(
-        codec.inst.pacsize, rtc::checked_cast<int>(10 * samples_per_ms));
-    const AudioFrame::VADActivity expected_vad_activity =
-        output_sample_rate_hz > 16000 ? AudioFrame::kVadActive
-                                      : AudioFrame::kVadPassive;
-
-    // Expect the first output timestamp to be 5*fs/8000 samples before the
-    // first inserted timestamp (because of NetEq's look-ahead). (This value is
-    // defined in Expand::overlap_length_.)
-    uint32_t expected_output_ts = last_packet_send_timestamp_ -
-        rtc::CheckedDivExact(5 * output_sample_rate_hz, 8000);
-
-    AudioFrame frame;
-    bool muted;
-    EXPECT_EQ(0, receiver_->GetAudio(output_sample_rate_hz, &frame, &muted));
-    // Expect timestamp = 0 before first packet is inserted.
-    EXPECT_EQ(0u, frame.timestamp_);
-    for (int i = 0; i < 5; ++i) {
-      InsertOnePacketOfSilence(codec.id);
-      for (int k = 0; k < num_10ms_frames; ++k) {
-        EXPECT_EQ(0,
-                  receiver_->GetAudio(output_sample_rate_hz, &frame, &muted));
-        EXPECT_EQ(expected_output_ts, frame.timestamp_);
-        expected_output_ts += 10 * samples_per_ms;
-        EXPECT_EQ(10 * samples_per_ms, frame.samples_per_channel_);
-        EXPECT_EQ(output_sample_rate_hz, frame.sample_rate_hz_);
-        EXPECT_EQ(output_channels, frame.num_channels_);
-        EXPECT_EQ(AudioFrame::kNormalSpeech, frame.speech_type_);
-        EXPECT_EQ(expected_vad_activity, frame.vad_activity_);
-        EXPECT_FALSE(muted);
-      }
-    }
-  }
-};
-
-#if defined(WEBRTC_ANDROID)
-#define MAYBE_VerifyAudioFramePCMU DISABLED_VerifyAudioFramePCMU
-#else
-#define MAYBE_VerifyAudioFramePCMU VerifyAudioFramePCMU
-#endif
-TEST_F(AcmReceiverTestFaxModeOldApi, MAYBE_VerifyAudioFramePCMU) {
-  RunVerifyAudioFrame(RentACodec::CodecId::kPCMU);
-}
-
-#if defined(WEBRTC_ANDROID)
-#define MAYBE_VerifyAudioFrameISAC DISABLED_VerifyAudioFrameISAC
-#else
-#define MAYBE_VerifyAudioFrameISAC VerifyAudioFrameISAC
-#endif
-TEST_F(AcmReceiverTestFaxModeOldApi, MAYBE_VerifyAudioFrameISAC) {
-  RunVerifyAudioFrame(RentACodec::CodecId::kISAC);
-}
-
-#if defined(WEBRTC_ANDROID)
-#define MAYBE_VerifyAudioFrameOpus DISABLED_VerifyAudioFrameOpus
-#else
-#define MAYBE_VerifyAudioFrameOpus VerifyAudioFrameOpus
-#endif
-TEST_F(AcmReceiverTestFaxModeOldApi, MAYBE_VerifyAudioFrameOpus) {
-  RunVerifyAudioFrame(RentACodec::CodecId::kOpus);
-}
-
-#if defined(WEBRTC_ANDROID)
-#define MAYBE_PostdecodingVad DISABLED_PostdecodingVad
-#else
-#define MAYBE_PostdecodingVad PostdecodingVad
-#endif
-TEST_F(AcmReceiverTestOldApi, MAYBE_PostdecodingVad) {
-  EXPECT_TRUE(config_.neteq_config.enable_post_decode_vad);
-  const CodecIdInst codec(RentACodec::CodecId::kPCM16Bwb);
-  ASSERT_EQ(
-      0, receiver_->AddCodec(codec.id, codec.inst.pltype, codec.inst.channels,
-                             codec.inst.plfreq, nullptr, ""));
-  const int kNumPackets = 5;
-  const int num_10ms_frames = codec.inst.pacsize / (codec.inst.plfreq / 100);
-  AudioFrame frame;
-  for (int n = 0; n < kNumPackets; ++n) {
-    InsertOnePacketOfSilence(codec.id);
-    for (int k = 0; k < num_10ms_frames; ++k) {
-      bool muted;
-      ASSERT_EQ(0, receiver_->GetAudio(codec.inst.plfreq, &frame, &muted));
-    }
-  }
-  EXPECT_EQ(AudioFrame::kVadPassive, frame.vad_activity_);
-}
-
-class AcmReceiverTestPostDecodeVadPassiveOldApi : public AcmReceiverTestOldApi {
- protected:
-  AcmReceiverTestPostDecodeVadPassiveOldApi() {
-    config_.neteq_config.enable_post_decode_vad = false;
-  }
-};
-
-#if defined(WEBRTC_ANDROID)
-#define MAYBE_PostdecodingVad DISABLED_PostdecodingVad
-#else
-#define MAYBE_PostdecodingVad PostdecodingVad
-#endif
-TEST_F(AcmReceiverTestPostDecodeVadPassiveOldApi, MAYBE_PostdecodingVad) {
-  EXPECT_FALSE(config_.neteq_config.enable_post_decode_vad);
-  const CodecIdInst codec(RentACodec::CodecId::kPCM16Bwb);
-  ASSERT_EQ(
-      0, receiver_->AddCodec(codec.id, codec.inst.pltype, codec.inst.channels,
-                             codec.inst.plfreq, nullptr, ""));
-  const int kNumPackets = 5;
-  const int num_10ms_frames = codec.inst.pacsize / (codec.inst.plfreq / 100);
-  AudioFrame frame;
-  for (int n = 0; n < kNumPackets; ++n) {
-    InsertOnePacketOfSilence(codec.id);
-    for (int k = 0; k < num_10ms_frames; ++k) {
-      bool muted;
-      ASSERT_EQ(0, receiver_->GetAudio(codec.inst.plfreq, &frame, &muted));
-    }
-  }
-  EXPECT_EQ(AudioFrame::kVadUnknown, frame.vad_activity_);
-}
-
-#if defined(WEBRTC_ANDROID)
-#define MAYBE_LastAudioCodec DISABLED_LastAudioCodec
-#else
-#define MAYBE_LastAudioCodec LastAudioCodec
-#endif
-#if defined(WEBRTC_CODEC_ISAC)
-TEST_F(AcmReceiverTestOldApi, MAYBE_LastAudioCodec) {
-  const RentACodec::CodecId kCodecId[] = {
-      RentACodec::CodecId::kISAC, RentACodec::CodecId::kPCMA,
-      RentACodec::CodecId::kISACSWB, RentACodec::CodecId::kPCM16Bswb32kHz};
-  AddSetOfCodecs(kCodecId);
-
-  const RentACodec::CodecId kCngId[] = {
-      // Not including full-band.
-      RentACodec::CodecId::kCNNB, RentACodec::CodecId::kCNWB,
-      RentACodec::CodecId::kCNSWB};
-  AddSetOfCodecs(kCngId);
-
-  // Register CNG at sender side.
-  for (auto id : kCngId)
-    ASSERT_EQ(0, acm_->RegisterSendCodec(CodecIdInst(id).inst));
-
-  CodecInst codec;
-  // No audio payload is received.
-  EXPECT_EQ(-1, receiver_->LastAudioCodec(&codec));
-
-  // Start with sending DTX.
-  ASSERT_EQ(0, acm_->SetVAD(true, true, VADVeryAggr));
-  packet_sent_ = false;
-  InsertOnePacketOfSilence(CodecIdInst(kCodecId[0]).id);  // Enough to test
-                                                          // with one codec.
-  ASSERT_TRUE(packet_sent_);
-  EXPECT_EQ(kAudioFrameCN, last_frame_type_);
-
-  // Has received, only, DTX. Last Audio codec is undefined.
-  EXPECT_EQ(-1, receiver_->LastAudioCodec(&codec));
-  EXPECT_FALSE(receiver_->last_packet_sample_rate_hz());
-
-  for (auto id : kCodecId) {
-    const CodecIdInst c(id);
-
-    // Set DTX off to send audio payload.
-    acm_->SetVAD(false, false, VADAggr);
-    packet_sent_ = false;
-    InsertOnePacketOfSilence(c.id);
-
-    // Sanity check if Actually an audio payload received, and it should be
-    // of type "speech."
-    ASSERT_TRUE(packet_sent_);
-    ASSERT_EQ(kAudioFrameSpeech, last_frame_type_);
-    EXPECT_EQ(rtc::Optional<int>(c.inst.plfreq),
-              receiver_->last_packet_sample_rate_hz());
-
-    // Set VAD on to send DTX. Then check if the "Last Audio codec" returns
-    // the expected codec.
-    acm_->SetVAD(true, true, VADAggr);
-
-    // Do as many encoding until a DTX is sent.
-    while (last_frame_type_ != kAudioFrameCN) {
-      packet_sent_ = false;
-      InsertOnePacketOfSilence(c.id);
-      ASSERT_TRUE(packet_sent_);
-    }
-    EXPECT_EQ(rtc::Optional<int>(c.inst.plfreq),
-              receiver_->last_packet_sample_rate_hz());
-    EXPECT_EQ(0, receiver_->LastAudioCodec(&codec));
-    EXPECT_TRUE(CodecsEqual(c.inst, codec));
-  }
-}
-#endif
-
-}  // namespace acm2
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/acm2/acm_resampler.cc b/modules/audio_coding/acm2/acm_resampler.cc
deleted file mode 100644
index 555263a..0000000
--- a/modules/audio_coding/acm2/acm_resampler.cc
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- *  Copyright (c) 2012 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/acm2/acm_resampler.h"
-
-#include <assert.h>
-#include <string.h>
-
-#include "webrtc/common_audio/resampler/include/resampler.h"
-#include "webrtc/rtc_base/logging.h"
-
-namespace webrtc {
-namespace acm2 {
-
-ACMResampler::ACMResampler() {
-}
-
-ACMResampler::~ACMResampler() {
-}
-
-int ACMResampler::Resample10Msec(const int16_t* in_audio,
-                                 int in_freq_hz,
-                                 int out_freq_hz,
-                                 size_t num_audio_channels,
-                                 size_t out_capacity_samples,
-                                 int16_t* out_audio) {
-  size_t in_length = in_freq_hz * num_audio_channels / 100;
-  if (in_freq_hz == out_freq_hz) {
-    if (out_capacity_samples < in_length) {
-      assert(false);
-      return -1;
-    }
-    memcpy(out_audio, in_audio, in_length * sizeof(int16_t));
-    return static_cast<int>(in_length / num_audio_channels);
-  }
-
-  if (resampler_.InitializeIfNeeded(in_freq_hz, out_freq_hz,
-                                    num_audio_channels) != 0) {
-    LOG(LS_ERROR) << "InitializeIfNeeded(" << in_freq_hz << ", " << out_freq_hz
-                  << ", " << num_audio_channels << ") failed.";
-    return -1;
-  }
-
-  int out_length =
-      resampler_.Resample(in_audio, in_length, out_audio, out_capacity_samples);
-  if (out_length == -1) {
-    LOG(LS_ERROR) << "Resample(" << in_audio << ", " << in_length << ", "
-                  << out_audio << ", " << out_capacity_samples << ") failed.";
-    return -1;
-  }
-
-  return static_cast<int>(out_length / num_audio_channels);
-}
-
-}  // namespace acm2
-}  // namespace webrtc
diff --git a/modules/audio_coding/acm2/acm_resampler.h b/modules/audio_coding/acm2/acm_resampler.h
deleted file mode 100644
index 268db8b..0000000
--- a/modules/audio_coding/acm2/acm_resampler.h
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- *  Copyright (c) 2012 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_ACM2_ACM_RESAMPLER_H_
-#define WEBRTC_MODULES_AUDIO_CODING_ACM2_ACM_RESAMPLER_H_
-
-#include "webrtc/common_audio/resampler/include/push_resampler.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-namespace acm2 {
-
-class ACMResampler {
- public:
-  ACMResampler();
-  ~ACMResampler();
-
-  int Resample10Msec(const int16_t* in_audio,
-                     int in_freq_hz,
-                     int out_freq_hz,
-                     size_t num_audio_channels,
-                     size_t out_capacity_samples,
-                     int16_t* out_audio);
-
- private:
-  PushResampler<int16_t> resampler_;
-};
-
-}  // namespace acm2
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_CODING_ACM2_ACM_RESAMPLER_H_
diff --git a/modules/audio_coding/acm2/acm_send_test.cc b/modules/audio_coding/acm2/acm_send_test.cc
deleted file mode 100644
index a88ba7d..0000000
--- a/modules/audio_coding/acm2/acm_send_test.cc
+++ /dev/null
@@ -1,160 +0,0 @@
-/*
- *  Copyright (c) 2014 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/acm2/acm_send_test.h"
-
-#include <assert.h>
-#include <stdio.h>
-#include <string.h>
-
-#include "webrtc/api/audio_codecs/audio_encoder.h"
-#include "webrtc/modules/audio_coding/include/audio_coding_module.h"
-#include "webrtc/modules/audio_coding/neteq/tools/input_audio_file.h"
-#include "webrtc/modules/audio_coding/neteq/tools/packet.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-namespace test {
-
-AcmSendTestOldApi::AcmSendTestOldApi(InputAudioFile* audio_source,
-                                     int source_rate_hz,
-                                     int test_duration_ms)
-    : clock_(0),
-      acm_(webrtc::AudioCodingModule::Create(0, &clock_)),
-      audio_source_(audio_source),
-      source_rate_hz_(source_rate_hz),
-      input_block_size_samples_(
-          static_cast<size_t>(source_rate_hz_ * kBlockSizeMs / 1000)),
-      codec_registered_(false),
-      test_duration_ms_(test_duration_ms),
-      frame_type_(kAudioFrameSpeech),
-      payload_type_(0),
-      timestamp_(0),
-      sequence_number_(0) {
-  input_frame_.sample_rate_hz_ = source_rate_hz_;
-  input_frame_.num_channels_ = 1;
-  input_frame_.samples_per_channel_ = input_block_size_samples_;
-  assert(input_block_size_samples_ * input_frame_.num_channels_ <=
-         AudioFrame::kMaxDataSizeSamples);
-  acm_->RegisterTransportCallback(this);
-}
-
-AcmSendTestOldApi::~AcmSendTestOldApi() = default;
-
-bool AcmSendTestOldApi::RegisterCodec(const char* payload_name,
-                                      int sampling_freq_hz,
-                                      int channels,
-                                      int payload_type,
-                                      int frame_size_samples) {
-  CodecInst codec;
-  RTC_CHECK_EQ(0, AudioCodingModule::Codec(payload_name, &codec,
-                                           sampling_freq_hz, channels));
-  codec.pltype = payload_type;
-  codec.pacsize = frame_size_samples;
-  codec_registered_ = (acm_->RegisterSendCodec(codec) == 0);
-  input_frame_.num_channels_ = channels;
-  assert(input_block_size_samples_ * input_frame_.num_channels_ <=
-         AudioFrame::kMaxDataSizeSamples);
-  return codec_registered_;
-}
-
-bool AcmSendTestOldApi::RegisterExternalCodec(
-    AudioEncoder* external_speech_encoder) {
-  acm_->RegisterExternalSendCodec(external_speech_encoder);
-  input_frame_.num_channels_ = external_speech_encoder->NumChannels();
-  assert(input_block_size_samples_ * input_frame_.num_channels_ <=
-         AudioFrame::kMaxDataSizeSamples);
-  return codec_registered_ = true;
-}
-
-std::unique_ptr<Packet> AcmSendTestOldApi::NextPacket() {
-  assert(codec_registered_);
-  if (filter_.test(static_cast<size_t>(payload_type_))) {
-    // This payload type should be filtered out. Since the payload type is the
-    // same throughout the whole test run, no packet at all will be delivered.
-    // We can just as well signal that the test is over by returning NULL.
-    return nullptr;
-  }
-  // Insert audio and process until one packet is produced.
-  while (clock_.TimeInMilliseconds() < test_duration_ms_) {
-    clock_.AdvanceTimeMilliseconds(kBlockSizeMs);
-    RTC_CHECK(audio_source_->Read(input_block_size_samples_,
-                                  input_frame_.mutable_data()));
-    if (input_frame_.num_channels_ > 1) {
-      InputAudioFile::DuplicateInterleaved(input_frame_.data(),
-                                           input_block_size_samples_,
-                                           input_frame_.num_channels_,
-                                           input_frame_.mutable_data());
-    }
-    data_to_send_ = false;
-    RTC_CHECK_GE(acm_->Add10MsData(input_frame_), 0);
-    input_frame_.timestamp_ += static_cast<uint32_t>(input_block_size_samples_);
-    if (data_to_send_) {
-      // Encoded packet received.
-      return CreatePacket();
-    }
-  }
-  // Test ended.
-  return nullptr;
-}
-
-// This method receives the callback from ACM when a new packet is produced.
-int32_t AcmSendTestOldApi::SendData(
-    FrameType frame_type,
-    uint8_t payload_type,
-    uint32_t timestamp,
-    const uint8_t* payload_data,
-    size_t payload_len_bytes,
-    const RTPFragmentationHeader* fragmentation) {
-  // Store the packet locally.
-  frame_type_ = frame_type;
-  payload_type_ = payload_type;
-  timestamp_ = timestamp;
-  last_payload_vec_.assign(payload_data, payload_data + payload_len_bytes);
-  assert(last_payload_vec_.size() == payload_len_bytes);
-  data_to_send_ = true;
-  return 0;
-}
-
-std::unique_ptr<Packet> AcmSendTestOldApi::CreatePacket() {
-  const size_t kRtpHeaderSize = 12;
-  size_t allocated_bytes = last_payload_vec_.size() + kRtpHeaderSize;
-  uint8_t* packet_memory = new uint8_t[allocated_bytes];
-  // Populate the header bytes.
-  packet_memory[0] = 0x80;
-  packet_memory[1] = static_cast<uint8_t>(payload_type_);
-  packet_memory[2] = (sequence_number_ >> 8) & 0xFF;
-  packet_memory[3] = (sequence_number_) & 0xFF;
-  packet_memory[4] = (timestamp_ >> 24) & 0xFF;
-  packet_memory[5] = (timestamp_ >> 16) & 0xFF;
-  packet_memory[6] = (timestamp_ >> 8) & 0xFF;
-  packet_memory[7] = timestamp_ & 0xFF;
-  // Set SSRC to 0x12345678.
-  packet_memory[8] = 0x12;
-  packet_memory[9] = 0x34;
-  packet_memory[10] = 0x56;
-  packet_memory[11] = 0x78;
-
-  ++sequence_number_;
-
-  // Copy the payload data.
-  memcpy(packet_memory + kRtpHeaderSize,
-         &last_payload_vec_[0],
-         last_payload_vec_.size());
-  std::unique_ptr<Packet> packet(
-      new Packet(packet_memory, allocated_bytes, clock_.TimeInMilliseconds()));
-  RTC_DCHECK(packet);
-  RTC_DCHECK(packet->valid_header());
-  return packet;
-}
-
-}  // namespace test
-}  // namespace webrtc
diff --git a/modules/audio_coding/acm2/acm_send_test.h b/modules/audio_coding/acm2/acm_send_test.h
deleted file mode 100644
index b451e99..0000000
--- a/modules/audio_coding/acm2/acm_send_test.h
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- *  Copyright (c) 2014 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_ACM2_ACM_SEND_TEST_H_
-#define WEBRTC_MODULES_AUDIO_CODING_ACM2_ACM_SEND_TEST_H_
-
-#include <memory>
-#include <vector>
-
-#include "webrtc/modules/audio_coding/include/audio_coding_module.h"
-#include "webrtc/modules/audio_coding/neteq/tools/packet_source.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/system_wrappers/include/clock.h"
-
-namespace webrtc {
-class AudioEncoder;
-
-namespace test {
-class InputAudioFile;
-class Packet;
-
-class AcmSendTestOldApi : public AudioPacketizationCallback,
-                          public PacketSource {
- public:
-  AcmSendTestOldApi(InputAudioFile* audio_source,
-                    int source_rate_hz,
-                    int test_duration_ms);
-  ~AcmSendTestOldApi() override;
-
-  // Registers the send codec. Returns true on success, false otherwise.
-  bool RegisterCodec(const char* payload_name,
-                     int sampling_freq_hz,
-                     int channels,
-                     int payload_type,
-                     int frame_size_samples);
-
-  // Registers an external send codec. Returns true on success, false otherwise.
-  bool RegisterExternalCodec(AudioEncoder* external_speech_encoder);
-
-  // Inherited from PacketSource.
-  std::unique_ptr<Packet> NextPacket() override;
-
-  // Inherited from AudioPacketizationCallback.
-  int32_t SendData(FrameType frame_type,
-                   uint8_t payload_type,
-                   uint32_t timestamp,
-                   const uint8_t* payload_data,
-                   size_t payload_len_bytes,
-                   const RTPFragmentationHeader* fragmentation) override;
-
-  AudioCodingModule* acm() { return acm_.get(); }
-
- private:
-  static const int kBlockSizeMs = 10;
-
-  // Creates a Packet object from the last packet produced by ACM (and received
-  // through the SendData method as a callback).
-  std::unique_ptr<Packet> CreatePacket();
-
-  SimulatedClock clock_;
-  std::unique_ptr<AudioCodingModule> acm_;
-  InputAudioFile* audio_source_;
-  int source_rate_hz_;
-  const size_t input_block_size_samples_;
-  AudioFrame input_frame_;
-  bool codec_registered_;
-  int test_duration_ms_;
-  // The following member variables are set whenever SendData() is called.
-  FrameType frame_type_;
-  int payload_type_;
-  uint32_t timestamp_;
-  uint16_t sequence_number_;
-  std::vector<uint8_t> last_payload_vec_;
-  bool data_to_send_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(AcmSendTestOldApi);
-};
-
-}  // namespace test
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_AUDIO_CODING_ACM2_ACM_SEND_TEST_H_
diff --git a/modules/audio_coding/acm2/audio_coding_module.cc b/modules/audio_coding/acm2/audio_coding_module.cc
deleted file mode 100644
index 0244882..0000000
--- a/modules/audio_coding/acm2/audio_coding_module.cc
+++ /dev/null
@@ -1,1382 +0,0 @@
-/*
- *  Copyright (c) 2012 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/include/audio_coding_module.h"
-
-#include <algorithm>
-
-#include "webrtc/api/audio_codecs/builtin_audio_decoder_factory.h"
-#include "webrtc/modules/audio_coding/acm2/acm_receiver.h"
-#include "webrtc/modules/audio_coding/acm2/acm_resampler.h"
-#include "webrtc/modules/audio_coding/acm2/codec_manager.h"
-#include "webrtc/modules/audio_coding/acm2/rent_a_codec.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/safe_conversions.h"
-#include "webrtc/system_wrappers/include/metrics.h"
-
-namespace webrtc {
-
-namespace {
-
-struct EncoderFactory {
-  AudioEncoder* external_speech_encoder = nullptr;
-  acm2::CodecManager codec_manager;
-  acm2::RentACodec rent_a_codec;
-};
-
-class AudioCodingModuleImpl final : public AudioCodingModule {
- public:
-  explicit AudioCodingModuleImpl(const AudioCodingModule::Config& config);
-  ~AudioCodingModuleImpl() override;
-
-  /////////////////////////////////////////
-  //   Sender
-  //
-
-  // Can be called multiple times for Codec, CNG, RED.
-  int RegisterSendCodec(const CodecInst& send_codec) override;
-
-  void RegisterExternalSendCodec(
-      AudioEncoder* external_speech_encoder) override;
-
-  void ModifyEncoder(rtc::FunctionView<void(std::unique_ptr<AudioEncoder>*)>
-                         modifier) override;
-
-  void QueryEncoder(
-      rtc::FunctionView<void(const AudioEncoder*)> query) override;
-
-  // Get current send codec.
-  rtc::Optional<CodecInst> SendCodec() const override;
-
-  // Get current send frequency.
-  int SendFrequency() const override;
-
-  // Sets the bitrate to the specified value in bits/sec. In case the codec does
-  // not support the requested value it will choose an appropriate value
-  // instead.
-  void SetBitRate(int bitrate_bps) override;
-
-  // Register a transport callback which will be
-  // called to deliver the encoded buffers.
-  int RegisterTransportCallback(AudioPacketizationCallback* transport) override;
-
-  // Add 10 ms of raw (PCM) audio data to the encoder.
-  int Add10MsData(const AudioFrame& audio_frame) override;
-
-  /////////////////////////////////////////
-  // (RED) Redundant Coding
-  //
-
-  // Configure RED status i.e. on/off.
-  int SetREDStatus(bool enable_red) override;
-
-  // Get RED status.
-  bool REDStatus() const override;
-
-  /////////////////////////////////////////
-  // (FEC) Forward Error Correction (codec internal)
-  //
-
-  // Configure FEC status i.e. on/off.
-  int SetCodecFEC(bool enabled_codec_fec) override;
-
-  // Get FEC status.
-  bool CodecFEC() const override;
-
-  // Set target packet loss rate
-  int SetPacketLossRate(int loss_rate) override;
-
-  /////////////////////////////////////////
-  //   (VAD) Voice Activity Detection
-  //   and
-  //   (CNG) Comfort Noise Generation
-  //
-
-  int SetVAD(bool enable_dtx = true,
-             bool enable_vad = false,
-             ACMVADMode mode = VADNormal) override;
-
-  int VAD(bool* dtx_enabled,
-          bool* vad_enabled,
-          ACMVADMode* mode) const override;
-
-  int RegisterVADCallback(ACMVADCallback* vad_callback) override;
-
-  /////////////////////////////////////////
-  //   Receiver
-  //
-
-  // Initialize receiver, resets codec database etc.
-  int InitializeReceiver() override;
-
-  // Get current receive frequency.
-  int ReceiveFrequency() const override;
-
-  // Get current playout frequency.
-  int PlayoutFrequency() const override;
-
-  void SetReceiveCodecs(const std::map<int, SdpAudioFormat>& codecs) override;
-
-  bool RegisterReceiveCodec(int rtp_payload_type,
-                            const SdpAudioFormat& audio_format) override;
-
-  int RegisterReceiveCodec(const CodecInst& receive_codec) override;
-  int RegisterReceiveCodec(
-      const CodecInst& receive_codec,
-      rtc::FunctionView<std::unique_ptr<AudioDecoder>()> isac_factory) override;
-
-  int RegisterExternalReceiveCodec(int rtp_payload_type,
-                                   AudioDecoder* external_decoder,
-                                   int sample_rate_hz,
-                                   int num_channels,
-                                   const std::string& name) override;
-
-  // Get current received codec.
-  int ReceiveCodec(CodecInst* current_codec) const override;
-
-  rtc::Optional<SdpAudioFormat> ReceiveFormat() const override;
-
-  // Incoming packet from network parsed and ready for decode.
-  int IncomingPacket(const uint8_t* incoming_payload,
-                     const size_t payload_length,
-                     const WebRtcRTPHeader& rtp_info) override;
-
-  // Incoming payloads, without rtp-info, the rtp-info will be created in ACM.
-  // One usage for this API is when pre-encoded files are pushed in ACM.
-  int IncomingPayload(const uint8_t* incoming_payload,
-                      const size_t payload_length,
-                      uint8_t payload_type,
-                      uint32_t timestamp) override;
-
-  // Minimum playout delay.
-  int SetMinimumPlayoutDelay(int time_ms) override;
-
-  // Maximum playout delay.
-  int SetMaximumPlayoutDelay(int time_ms) override;
-
-  // Smallest latency NetEq will maintain.
-  int LeastRequiredDelayMs() const override;
-
-  RTC_DEPRECATED int32_t PlayoutTimestamp(uint32_t* timestamp) override;
-
-  rtc::Optional<uint32_t> PlayoutTimestamp() override;
-
-  int FilteredCurrentDelayMs() const override;
-
-  // Get 10 milliseconds of raw audio data to play out, and
-  // automatic resample to the requested frequency if > 0.
-  int PlayoutData10Ms(int desired_freq_hz,
-                      AudioFrame* audio_frame,
-                      bool* muted) override;
-  int PlayoutData10Ms(int desired_freq_hz, AudioFrame* audio_frame) override;
-
-  /////////////////////////////////////////
-  //   Statistics
-  //
-
-  int GetNetworkStatistics(NetworkStatistics* statistics) override;
-
-  int SetOpusApplication(OpusApplicationMode application) override;
-
-  // If current send codec is Opus, informs it about the maximum playback rate
-  // the receiver will render.
-  int SetOpusMaxPlaybackRate(int frequency_hz) override;
-
-  int EnableOpusDtx() override;
-
-  int DisableOpusDtx() override;
-
-  int UnregisterReceiveCodec(uint8_t payload_type) override;
-
-  int EnableNack(size_t max_nack_list_size) override;
-
-  void DisableNack() override;
-
-  std::vector<uint16_t> GetNackList(int64_t round_trip_time_ms) const override;
-
-  void GetDecodingCallStatistics(AudioDecodingCallStats* stats) const override;
-
-  ANAStats GetANAStats() const override;
-
- private:
-  struct InputData {
-    uint32_t input_timestamp;
-    const int16_t* audio;
-    size_t length_per_channel;
-    size_t audio_channel;
-    // If a re-mix is required (up or down), this buffer will store a re-mixed
-    // version of the input.
-    int16_t buffer[WEBRTC_10MS_PCM_AUDIO];
-  };
-
-  // This member class writes values to the named UMA histogram, but only if
-  // the value has changed since the last time (and always for the first call).
-  class ChangeLogger {
-   public:
-    explicit ChangeLogger(const std::string& histogram_name)
-        : histogram_name_(histogram_name) {}
-    // Logs the new value if it is different from the last logged value, or if
-    // this is the first call.
-    void MaybeLog(int value);
-
-   private:
-    int last_value_ = 0;
-    int first_time_ = true;
-    const std::string histogram_name_;
-  };
-
-  int RegisterReceiveCodecUnlocked(
-      const CodecInst& codec,
-      rtc::FunctionView<std::unique_ptr<AudioDecoder>()> isac_factory)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(acm_crit_sect_);
-
-  int Add10MsDataInternal(const AudioFrame& audio_frame, InputData* input_data)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(acm_crit_sect_);
-  int Encode(const InputData& input_data)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(acm_crit_sect_);
-
-  int InitializeReceiverSafe() RTC_EXCLUSIVE_LOCKS_REQUIRED(acm_crit_sect_);
-
-  bool HaveValidEncoder(const char* caller_name) const
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(acm_crit_sect_);
-
-  // Preprocessing of input audio, including resampling and down-mixing if
-  // required, before pushing audio into encoder's buffer.
-  //
-  // in_frame: input audio-frame
-  // ptr_out: pointer to output audio_frame. If no preprocessing is required
-  //          |ptr_out| will be pointing to |in_frame|, otherwise pointing to
-  //          |preprocess_frame_|.
-  //
-  // Return value:
-  //   -1: if encountering an error.
-  //    0: otherwise.
-  int PreprocessToAddData(const AudioFrame& in_frame,
-                          const AudioFrame** ptr_out)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(acm_crit_sect_);
-
-  // Change required states after starting to receive the codec corresponding
-  // to |index|.
-  int UpdateUponReceivingCodec(int index);
-
-  rtc::CriticalSection acm_crit_sect_;
-  rtc::Buffer encode_buffer_ RTC_GUARDED_BY(acm_crit_sect_);
-  int id_;  // TODO(henrik.lundin) Make const.
-  uint32_t expected_codec_ts_ RTC_GUARDED_BY(acm_crit_sect_);
-  uint32_t expected_in_ts_ RTC_GUARDED_BY(acm_crit_sect_);
-  acm2::ACMResampler resampler_ RTC_GUARDED_BY(acm_crit_sect_);
-  acm2::AcmReceiver receiver_;  // AcmReceiver has it's own internal lock.
-  ChangeLogger bitrate_logger_ RTC_GUARDED_BY(acm_crit_sect_);
-
-  std::unique_ptr<EncoderFactory> encoder_factory_
-      RTC_GUARDED_BY(acm_crit_sect_);
-
-  // Current encoder stack, either obtained from
-  // encoder_factory_->rent_a_codec.RentEncoderStack or provided by a call to
-  // RegisterEncoder.
-  std::unique_ptr<AudioEncoder> encoder_stack_ RTC_GUARDED_BY(acm_crit_sect_);
-
-  std::unique_ptr<AudioDecoder> isac_decoder_16k_
-      RTC_GUARDED_BY(acm_crit_sect_);
-  std::unique_ptr<AudioDecoder> isac_decoder_32k_
-      RTC_GUARDED_BY(acm_crit_sect_);
-
-  // This is to keep track of CN instances where we can send DTMFs.
-  uint8_t previous_pltype_ RTC_GUARDED_BY(acm_crit_sect_);
-
-  // Used when payloads are pushed into ACM without any RTP info
-  // One example is when pre-encoded bit-stream is pushed from
-  // a file.
-  // IMPORTANT: this variable is only used in IncomingPayload(), therefore,
-  // no lock acquired when interacting with this variable. If it is going to
-  // be used in other methods, locks need to be taken.
-  std::unique_ptr<WebRtcRTPHeader> aux_rtp_header_;
-
-  bool receiver_initialized_ RTC_GUARDED_BY(acm_crit_sect_);
-
-  AudioFrame preprocess_frame_ RTC_GUARDED_BY(acm_crit_sect_);
-  bool first_10ms_data_ RTC_GUARDED_BY(acm_crit_sect_);
-
-  bool first_frame_ RTC_GUARDED_BY(acm_crit_sect_);
-  uint32_t last_timestamp_ RTC_GUARDED_BY(acm_crit_sect_);
-  uint32_t last_rtp_timestamp_ RTC_GUARDED_BY(acm_crit_sect_);
-
-  rtc::CriticalSection callback_crit_sect_;
-  AudioPacketizationCallback* packetization_callback_
-      RTC_GUARDED_BY(callback_crit_sect_);
-  ACMVADCallback* vad_callback_ RTC_GUARDED_BY(callback_crit_sect_);
-
-  int codec_histogram_bins_log_[static_cast<size_t>(
-      AudioEncoder::CodecType::kMaxLoggedAudioCodecTypes)];
-  int number_of_consecutive_empty_packets_;
-};
-
-// Adds a codec usage sample to the histogram.
-void UpdateCodecTypeHistogram(size_t codec_type) {
-  RTC_HISTOGRAM_ENUMERATION(
-      "WebRTC.Audio.Encoder.CodecType", static_cast<int>(codec_type),
-      static_cast<int>(
-          webrtc::AudioEncoder::CodecType::kMaxLoggedAudioCodecTypes));
-}
-
-// Stereo-to-mono can be used as in-place.
-int DownMix(const AudioFrame& frame,
-            size_t length_out_buff,
-            int16_t* out_buff) {
-  RTC_DCHECK_EQ(frame.num_channels_, 2);
-  RTC_DCHECK_GE(length_out_buff, frame.samples_per_channel_);
-
-  if (!frame.muted()) {
-    const int16_t* frame_data = frame.data();
-    for (size_t n = 0; n < frame.samples_per_channel_; ++n) {
-      out_buff[n] = static_cast<int16_t>(
-          (static_cast<int32_t>(frame_data[2 * n]) +
-           static_cast<int32_t>(frame_data[2 * n + 1])) >> 1);
-    }
-  } else {
-    std::fill(out_buff, out_buff + frame.samples_per_channel_, 0);
-  }
-  return 0;
-}
-
-// Mono-to-stereo can be used as in-place.
-int UpMix(const AudioFrame& frame, size_t length_out_buff, int16_t* out_buff) {
-  RTC_DCHECK_EQ(frame.num_channels_, 1);
-  RTC_DCHECK_GE(length_out_buff, 2 * frame.samples_per_channel_);
-
-  if (!frame.muted()) {
-    const int16_t* frame_data = frame.data();
-    for (size_t n = frame.samples_per_channel_; n != 0; --n) {
-      size_t i = n - 1;
-      int16_t sample = frame_data[i];
-      out_buff[2 * i + 1] = sample;
-      out_buff[2 * i] = sample;
-    }
-  } else {
-    std::fill(out_buff, out_buff + frame.samples_per_channel_ * 2, 0);
-  }
-  return 0;
-}
-
-void ConvertEncodedInfoToFragmentationHeader(
-    const AudioEncoder::EncodedInfo& info,
-    RTPFragmentationHeader* frag) {
-  if (info.redundant.empty()) {
-    frag->fragmentationVectorSize = 0;
-    return;
-  }
-
-  frag->VerifyAndAllocateFragmentationHeader(
-      static_cast<uint16_t>(info.redundant.size()));
-  frag->fragmentationVectorSize = static_cast<uint16_t>(info.redundant.size());
-  size_t offset = 0;
-  for (size_t i = 0; i < info.redundant.size(); ++i) {
-    frag->fragmentationOffset[i] = offset;
-    offset += info.redundant[i].encoded_bytes;
-    frag->fragmentationLength[i] = info.redundant[i].encoded_bytes;
-    frag->fragmentationTimeDiff[i] = rtc::dchecked_cast<uint16_t>(
-        info.encoded_timestamp - info.redundant[i].encoded_timestamp);
-    frag->fragmentationPlType[i] = info.redundant[i].payload_type;
-  }
-}
-
-// Wraps a raw AudioEncoder pointer. The idea is that you can put one of these
-// in a unique_ptr, to protect the contained raw pointer from being deleted
-// when the unique_ptr expires. (This is of course a bad idea in general, but
-// backwards compatibility.)
-class RawAudioEncoderWrapper final : public AudioEncoder {
- public:
-  RawAudioEncoderWrapper(AudioEncoder* enc) : enc_(enc) {}
-  int SampleRateHz() const override { return enc_->SampleRateHz(); }
-  size_t NumChannels() const override { return enc_->NumChannels(); }
-  int RtpTimestampRateHz() const override { return enc_->RtpTimestampRateHz(); }
-  size_t Num10MsFramesInNextPacket() const override {
-    return enc_->Num10MsFramesInNextPacket();
-  }
-  size_t Max10MsFramesInAPacket() const override {
-    return enc_->Max10MsFramesInAPacket();
-  }
-  int GetTargetBitrate() const override { return enc_->GetTargetBitrate(); }
-  EncodedInfo EncodeImpl(uint32_t rtp_timestamp,
-                         rtc::ArrayView<const int16_t> audio,
-                         rtc::Buffer* encoded) override {
-    return enc_->Encode(rtp_timestamp, audio, encoded);
-  }
-  void Reset() override { return enc_->Reset(); }
-  bool SetFec(bool enable) override { return enc_->SetFec(enable); }
-  bool SetDtx(bool enable) override { return enc_->SetDtx(enable); }
-  bool SetApplication(Application application) override {
-    return enc_->SetApplication(application);
-  }
-  void SetMaxPlaybackRate(int frequency_hz) override {
-    return enc_->SetMaxPlaybackRate(frequency_hz);
-  }
-
- private:
-  AudioEncoder* enc_;
-};
-
-// Return false on error.
-bool CreateSpeechEncoderIfNecessary(EncoderFactory* ef) {
-  auto* sp = ef->codec_manager.GetStackParams();
-  if (sp->speech_encoder) {
-    // Do nothing; we already have a speech encoder.
-  } else if (ef->codec_manager.GetCodecInst()) {
-    RTC_DCHECK(!ef->external_speech_encoder);
-    // We have no speech encoder, but we have a specification for making one.
-    std::unique_ptr<AudioEncoder> enc =
-        ef->rent_a_codec.RentEncoder(*ef->codec_manager.GetCodecInst());
-    if (!enc)
-      return false;  // Encoder spec was bad.
-    sp->speech_encoder = std::move(enc);
-  } else if (ef->external_speech_encoder) {
-    RTC_DCHECK(!ef->codec_manager.GetCodecInst());
-    // We have an external speech encoder.
-    sp->speech_encoder = std::unique_ptr<AudioEncoder>(
-        new RawAudioEncoderWrapper(ef->external_speech_encoder));
-  }
-  return true;
-}
-
-void AudioCodingModuleImpl::ChangeLogger::MaybeLog(int value) {
-  if (value != last_value_ || first_time_) {
-    first_time_ = false;
-    last_value_ = value;
-    RTC_HISTOGRAM_COUNTS_SPARSE_100(histogram_name_, value);
-  }
-}
-
-AudioCodingModuleImpl::AudioCodingModuleImpl(
-    const AudioCodingModule::Config& config)
-    : id_(config.id),
-      expected_codec_ts_(0xD87F3F9F),
-      expected_in_ts_(0xD87F3F9F),
-      receiver_(config),
-      bitrate_logger_("WebRTC.Audio.TargetBitrateInKbps"),
-      encoder_factory_(new EncoderFactory),
-      encoder_stack_(nullptr),
-      previous_pltype_(255),
-      receiver_initialized_(false),
-      first_10ms_data_(false),
-      first_frame_(true),
-      packetization_callback_(NULL),
-      vad_callback_(NULL),
-      codec_histogram_bins_log_(),
-      number_of_consecutive_empty_packets_(0) {
-  if (InitializeReceiverSafe() < 0) {
-    LOG(LS_ERROR) << "Cannot initialize receiver";
-  }
-  LOG(LS_INFO) << "Created";
-}
-
-AudioCodingModuleImpl::~AudioCodingModuleImpl() = default;
-
-int32_t AudioCodingModuleImpl::Encode(const InputData& input_data) {
-  AudioEncoder::EncodedInfo encoded_info;
-  uint8_t previous_pltype;
-
-  // Check if there is an encoder before.
-  if (!HaveValidEncoder("Process"))
-    return -1;
-
-  if(!first_frame_) {
-    RTC_DCHECK(IsNewerTimestamp(input_data.input_timestamp, last_timestamp_))
-        << "Time should not move backwards";
-  }
-
-  // Scale the timestamp to the codec's RTP timestamp rate.
-  uint32_t rtp_timestamp =
-      first_frame_ ? input_data.input_timestamp
-                   : last_rtp_timestamp_ +
-                         rtc::CheckedDivExact(
-                             input_data.input_timestamp - last_timestamp_,
-                             static_cast<uint32_t>(rtc::CheckedDivExact(
-                                 encoder_stack_->SampleRateHz(),
-                                 encoder_stack_->RtpTimestampRateHz())));
-  last_timestamp_ = input_data.input_timestamp;
-  last_rtp_timestamp_ = rtp_timestamp;
-  first_frame_ = false;
-
-  // Clear the buffer before reuse - encoded data will get appended.
-  encode_buffer_.Clear();
-  encoded_info = encoder_stack_->Encode(
-      rtp_timestamp, rtc::ArrayView<const int16_t>(
-                         input_data.audio, input_data.audio_channel *
-                                               input_data.length_per_channel),
-      &encode_buffer_);
-
-  bitrate_logger_.MaybeLog(encoder_stack_->GetTargetBitrate() / 1000);
-  if (encode_buffer_.size() == 0 && !encoded_info.send_even_if_empty) {
-    // Not enough data.
-    return 0;
-  }
-  previous_pltype = previous_pltype_;  // Read it while we have the critsect.
-
-  // Log codec type to histogram once every 500 packets.
-  if (encoded_info.encoded_bytes == 0) {
-    ++number_of_consecutive_empty_packets_;
-  } else {
-    size_t codec_type = static_cast<size_t>(encoded_info.encoder_type);
-    codec_histogram_bins_log_[codec_type] +=
-        number_of_consecutive_empty_packets_ + 1;
-    number_of_consecutive_empty_packets_ = 0;
-    if (codec_histogram_bins_log_[codec_type] >= 500) {
-      codec_histogram_bins_log_[codec_type] -= 500;
-      UpdateCodecTypeHistogram(codec_type);
-    }
-  }
-
-  RTPFragmentationHeader my_fragmentation;
-  ConvertEncodedInfoToFragmentationHeader(encoded_info, &my_fragmentation);
-  FrameType frame_type;
-  if (encode_buffer_.size() == 0 && encoded_info.send_even_if_empty) {
-    frame_type = kEmptyFrame;
-    encoded_info.payload_type = previous_pltype;
-  } else {
-    RTC_DCHECK_GT(encode_buffer_.size(), 0);
-    frame_type = encoded_info.speech ? kAudioFrameSpeech : kAudioFrameCN;
-  }
-
-  {
-    rtc::CritScope lock(&callback_crit_sect_);
-    if (packetization_callback_) {
-      packetization_callback_->SendData(
-          frame_type, encoded_info.payload_type, encoded_info.encoded_timestamp,
-          encode_buffer_.data(), encode_buffer_.size(),
-          my_fragmentation.fragmentationVectorSize > 0 ? &my_fragmentation
-                                                       : nullptr);
-    }
-
-    if (vad_callback_) {
-      // Callback with VAD decision.
-      vad_callback_->InFrameType(frame_type);
-    }
-  }
-  previous_pltype_ = encoded_info.payload_type;
-  return static_cast<int32_t>(encode_buffer_.size());
-}
-
-/////////////////////////////////////////
-//   Sender
-//
-
-// Can be called multiple times for Codec, CNG, RED.
-int AudioCodingModuleImpl::RegisterSendCodec(const CodecInst& send_codec) {
-  rtc::CritScope lock(&acm_crit_sect_);
-  if (!encoder_factory_->codec_manager.RegisterEncoder(send_codec)) {
-    return -1;
-  }
-  if (encoder_factory_->codec_manager.GetCodecInst()) {
-    encoder_factory_->external_speech_encoder = nullptr;
-  }
-  if (!CreateSpeechEncoderIfNecessary(encoder_factory_.get())) {
-    return -1;
-  }
-  auto* sp = encoder_factory_->codec_manager.GetStackParams();
-  if (sp->speech_encoder)
-    encoder_stack_ = encoder_factory_->rent_a_codec.RentEncoderStack(sp);
-  return 0;
-}
-
-void AudioCodingModuleImpl::RegisterExternalSendCodec(
-    AudioEncoder* external_speech_encoder) {
-  rtc::CritScope lock(&acm_crit_sect_);
-  encoder_factory_->codec_manager.UnsetCodecInst();
-  encoder_factory_->external_speech_encoder = external_speech_encoder;
-  RTC_CHECK(CreateSpeechEncoderIfNecessary(encoder_factory_.get()));
-  auto* sp = encoder_factory_->codec_manager.GetStackParams();
-  RTC_CHECK(sp->speech_encoder);
-  encoder_stack_ = encoder_factory_->rent_a_codec.RentEncoderStack(sp);
-}
-
-void AudioCodingModuleImpl::ModifyEncoder(
-    rtc::FunctionView<void(std::unique_ptr<AudioEncoder>*)> modifier) {
-  rtc::CritScope lock(&acm_crit_sect_);
-
-  // Wipe the encoder factory, so that everything that relies on it will fail.
-  // We don't want the complexity of supporting swapping back and forth.
-  if (encoder_factory_) {
-    encoder_factory_.reset();
-    RTC_CHECK(!encoder_stack_);  // Ensure we hadn't started using the factory.
-  }
-
-  modifier(&encoder_stack_);
-}
-
-void AudioCodingModuleImpl::QueryEncoder(
-    rtc::FunctionView<void(const AudioEncoder*)> query) {
-  rtc::CritScope lock(&acm_crit_sect_);
-  query(encoder_stack_.get());
-}
-
-// Get current send codec.
-rtc::Optional<CodecInst> AudioCodingModuleImpl::SendCodec() const {
-  rtc::CritScope lock(&acm_crit_sect_);
-  if (encoder_factory_) {
-    auto* ci = encoder_factory_->codec_manager.GetCodecInst();
-    if (ci) {
-      return rtc::Optional<CodecInst>(*ci);
-    }
-    CreateSpeechEncoderIfNecessary(encoder_factory_.get());
-    const std::unique_ptr<AudioEncoder>& enc =
-        encoder_factory_->codec_manager.GetStackParams()->speech_encoder;
-    if (enc) {
-      return rtc::Optional<CodecInst>(
-          acm2::CodecManager::ForgeCodecInst(enc.get()));
-    }
-    return rtc::Optional<CodecInst>();
-  } else {
-    return encoder_stack_
-               ? rtc::Optional<CodecInst>(
-                     acm2::CodecManager::ForgeCodecInst(encoder_stack_.get()))
-               : rtc::Optional<CodecInst>();
-  }
-}
-
-// Get current send frequency.
-int AudioCodingModuleImpl::SendFrequency() const {
-  rtc::CritScope lock(&acm_crit_sect_);
-
-  if (!encoder_stack_) {
-    LOG(LS_ERROR) << "SendFrequency Failed, no codec is registered";
-    return -1;
-  }
-
-  return encoder_stack_->SampleRateHz();
-}
-
-void AudioCodingModuleImpl::SetBitRate(int bitrate_bps) {
-  rtc::CritScope lock(&acm_crit_sect_);
-  if (encoder_stack_) {
-    encoder_stack_->OnReceivedUplinkBandwidth(bitrate_bps,
-                                              rtc::Optional<int64_t>());
-  }
-}
-
-// Register a transport callback which will be called to deliver
-// the encoded buffers.
-int AudioCodingModuleImpl::RegisterTransportCallback(
-    AudioPacketizationCallback* transport) {
-  rtc::CritScope lock(&callback_crit_sect_);
-  packetization_callback_ = transport;
-  return 0;
-}
-
-// Add 10MS of raw (PCM) audio data to the encoder.
-int AudioCodingModuleImpl::Add10MsData(const AudioFrame& audio_frame) {
-  InputData input_data;
-  rtc::CritScope lock(&acm_crit_sect_);
-  int r = Add10MsDataInternal(audio_frame, &input_data);
-  return r < 0 ? r : Encode(input_data);
-}
-
-int AudioCodingModuleImpl::Add10MsDataInternal(const AudioFrame& audio_frame,
-                                               InputData* input_data) {
-  if (audio_frame.samples_per_channel_ == 0) {
-    assert(false);
-    LOG(LS_ERROR) << "Cannot Add 10 ms audio, payload length is zero";
-    return -1;
-  }
-
-  if (audio_frame.sample_rate_hz_ > 48000) {
-    assert(false);
-    LOG(LS_ERROR) << "Cannot Add 10 ms audio, input frequency not valid";
-    return -1;
-  }
-
-  // If the length and frequency matches. We currently just support raw PCM.
-  if (static_cast<size_t>(audio_frame.sample_rate_hz_ / 100) !=
-      audio_frame.samples_per_channel_) {
-    LOG(LS_ERROR)
-        << "Cannot Add 10 ms audio, input frequency and length doesn't match";
-    return -1;
-  }
-
-  if (audio_frame.num_channels_ != 1 && audio_frame.num_channels_ != 2) {
-    LOG(LS_ERROR) << "Cannot Add 10 ms audio, invalid number of channels.";
-    return -1;
-  }
-
-  // Do we have a codec registered?
-  if (!HaveValidEncoder("Add10MsData")) {
-    return -1;
-  }
-
-  const AudioFrame* ptr_frame;
-  // Perform a resampling, also down-mix if it is required and can be
-  // performed before resampling (a down mix prior to resampling will take
-  // place if both primary and secondary encoders are mono and input is in
-  // stereo).
-  if (PreprocessToAddData(audio_frame, &ptr_frame) < 0) {
-    return -1;
-  }
-
-  // Check whether we need an up-mix or down-mix?
-  const size_t current_num_channels = encoder_stack_->NumChannels();
-  const bool same_num_channels =
-      ptr_frame->num_channels_ == current_num_channels;
-
-  if (!same_num_channels) {
-    if (ptr_frame->num_channels_ == 1) {
-      if (UpMix(*ptr_frame, WEBRTC_10MS_PCM_AUDIO, input_data->buffer) < 0)
-        return -1;
-    } else {
-      if (DownMix(*ptr_frame, WEBRTC_10MS_PCM_AUDIO, input_data->buffer) < 0)
-        return -1;
-    }
-  }
-
-  // When adding data to encoders this pointer is pointing to an audio buffer
-  // with correct number of channels.
-  const int16_t* ptr_audio = ptr_frame->data();
-
-  // For pushing data to primary, point the |ptr_audio| to correct buffer.
-  if (!same_num_channels)
-    ptr_audio = input_data->buffer;
-
-  // TODO(yujo): Skip encode of muted frames.
-  input_data->input_timestamp = ptr_frame->timestamp_;
-  input_data->audio = ptr_audio;
-  input_data->length_per_channel = ptr_frame->samples_per_channel_;
-  input_data->audio_channel = current_num_channels;
-
-  return 0;
-}
-
-// Perform a resampling and down-mix if required. We down-mix only if
-// encoder is mono and input is stereo. In case of dual-streaming, both
-// encoders has to be mono for down-mix to take place.
-// |*ptr_out| will point to the pre-processed audio-frame. If no pre-processing
-// is required, |*ptr_out| points to |in_frame|.
-// TODO(yujo): Make this more efficient for muted frames.
-int AudioCodingModuleImpl::PreprocessToAddData(const AudioFrame& in_frame,
-                                               const AudioFrame** ptr_out) {
-  const bool resample =
-      in_frame.sample_rate_hz_ != encoder_stack_->SampleRateHz();
-
-  // This variable is true if primary codec and secondary codec (if exists)
-  // are both mono and input is stereo.
-  // TODO(henrik.lundin): This condition should probably be
-  //   in_frame.num_channels_ > encoder_stack_->NumChannels()
-  const bool down_mix =
-      in_frame.num_channels_ == 2 && encoder_stack_->NumChannels() == 1;
-
-  if (!first_10ms_data_) {
-    expected_in_ts_ = in_frame.timestamp_;
-    expected_codec_ts_ = in_frame.timestamp_;
-    first_10ms_data_ = true;
-  } else if (in_frame.timestamp_ != expected_in_ts_) {
-    LOG(LS_WARNING) << "Unexpected input timestamp: " << in_frame.timestamp_
-                    << ", expected: " << expected_in_ts_;
-    expected_codec_ts_ +=
-        (in_frame.timestamp_ - expected_in_ts_) *
-        static_cast<uint32_t>(
-            static_cast<double>(encoder_stack_->SampleRateHz()) /
-            static_cast<double>(in_frame.sample_rate_hz_));
-    expected_in_ts_ = in_frame.timestamp_;
-  }
-
-
-  if (!down_mix && !resample) {
-    // No pre-processing is required.
-    if (expected_in_ts_ == expected_codec_ts_) {
-      // If we've never resampled, we can use the input frame as-is
-      *ptr_out = &in_frame;
-    } else {
-      // Otherwise we'll need to alter the timestamp. Since in_frame is const,
-      // we'll have to make a copy of it.
-      preprocess_frame_.CopyFrom(in_frame);
-      preprocess_frame_.timestamp_ = expected_codec_ts_;
-      *ptr_out = &preprocess_frame_;
-    }
-
-    expected_in_ts_ += static_cast<uint32_t>(in_frame.samples_per_channel_);
-    expected_codec_ts_ += static_cast<uint32_t>(in_frame.samples_per_channel_);
-    return 0;
-  }
-
-  *ptr_out = &preprocess_frame_;
-  preprocess_frame_.num_channels_ = in_frame.num_channels_;
-  int16_t audio[WEBRTC_10MS_PCM_AUDIO];
-  const int16_t* src_ptr_audio = in_frame.data();
-  if (down_mix) {
-    // If a resampling is required the output of a down-mix is written into a
-    // local buffer, otherwise, it will be written to the output frame.
-    int16_t* dest_ptr_audio = resample ?
-        audio : preprocess_frame_.mutable_data();
-    if (DownMix(in_frame, WEBRTC_10MS_PCM_AUDIO, dest_ptr_audio) < 0)
-      return -1;
-    preprocess_frame_.num_channels_ = 1;
-    // Set the input of the resampler is the down-mixed signal.
-    src_ptr_audio = audio;
-  }
-
-  preprocess_frame_.timestamp_ = expected_codec_ts_;
-  preprocess_frame_.samples_per_channel_ = in_frame.samples_per_channel_;
-  preprocess_frame_.sample_rate_hz_ = in_frame.sample_rate_hz_;
-  // If it is required, we have to do a resampling.
-  if (resample) {
-    // The result of the resampler is written to output frame.
-    int16_t* dest_ptr_audio = preprocess_frame_.mutable_data();
-
-    int samples_per_channel = resampler_.Resample10Msec(
-        src_ptr_audio, in_frame.sample_rate_hz_, encoder_stack_->SampleRateHz(),
-        preprocess_frame_.num_channels_, AudioFrame::kMaxDataSizeSamples,
-        dest_ptr_audio);
-
-    if (samples_per_channel < 0) {
-      LOG(LS_ERROR) << "Cannot add 10 ms audio, resampling failed";
-      return -1;
-    }
-    preprocess_frame_.samples_per_channel_ =
-        static_cast<size_t>(samples_per_channel);
-    preprocess_frame_.sample_rate_hz_ = encoder_stack_->SampleRateHz();
-  }
-
-  expected_codec_ts_ +=
-      static_cast<uint32_t>(preprocess_frame_.samples_per_channel_);
-  expected_in_ts_ += static_cast<uint32_t>(in_frame.samples_per_channel_);
-
-  return 0;
-}
-
-/////////////////////////////////////////
-//   (RED) Redundant Coding
-//
-
-bool AudioCodingModuleImpl::REDStatus() const {
-  rtc::CritScope lock(&acm_crit_sect_);
-  return encoder_factory_->codec_manager.GetStackParams()->use_red;
-}
-
-// Configure RED status i.e on/off.
-int AudioCodingModuleImpl::SetREDStatus(bool enable_red) {
-#ifdef WEBRTC_CODEC_RED
-  rtc::CritScope lock(&acm_crit_sect_);
-  CreateSpeechEncoderIfNecessary(encoder_factory_.get());
-  if (!encoder_factory_->codec_manager.SetCopyRed(enable_red)) {
-    return -1;
-  }
-  auto* sp = encoder_factory_->codec_manager.GetStackParams();
-  if (sp->speech_encoder)
-    encoder_stack_ = encoder_factory_->rent_a_codec.RentEncoderStack(sp);
-  return 0;
-#else
-  LOG(LS_WARNING) << "  WEBRTC_CODEC_RED is undefined";
-  return -1;
-#endif
-}
-
-/////////////////////////////////////////
-//   (FEC) Forward Error Correction (codec internal)
-//
-
-bool AudioCodingModuleImpl::CodecFEC() const {
-  rtc::CritScope lock(&acm_crit_sect_);
-  return encoder_factory_->codec_manager.GetStackParams()->use_codec_fec;
-}
-
-int AudioCodingModuleImpl::SetCodecFEC(bool enable_codec_fec) {
-  rtc::CritScope lock(&acm_crit_sect_);
-  CreateSpeechEncoderIfNecessary(encoder_factory_.get());
-  if (!encoder_factory_->codec_manager.SetCodecFEC(enable_codec_fec)) {
-    return -1;
-  }
-  auto* sp = encoder_factory_->codec_manager.GetStackParams();
-  if (sp->speech_encoder)
-    encoder_stack_ = encoder_factory_->rent_a_codec.RentEncoderStack(sp);
-  if (enable_codec_fec) {
-    return sp->use_codec_fec ? 0 : -1;
-  } else {
-    RTC_DCHECK(!sp->use_codec_fec);
-    return 0;
-  }
-}
-
-int AudioCodingModuleImpl::SetPacketLossRate(int loss_rate) {
-  rtc::CritScope lock(&acm_crit_sect_);
-  if (HaveValidEncoder("SetPacketLossRate")) {
-    encoder_stack_->OnReceivedUplinkPacketLossFraction(loss_rate / 100.0);
-  }
-  return 0;
-}
-
-/////////////////////////////////////////
-//   (VAD) Voice Activity Detection
-//
-int AudioCodingModuleImpl::SetVAD(bool enable_dtx,
-                                  bool enable_vad,
-                                  ACMVADMode mode) {
-  // Note: |enable_vad| is not used; VAD is enabled based on the DTX setting.
-  RTC_DCHECK_EQ(enable_dtx, enable_vad);
-  rtc::CritScope lock(&acm_crit_sect_);
-  CreateSpeechEncoderIfNecessary(encoder_factory_.get());
-  if (!encoder_factory_->codec_manager.SetVAD(enable_dtx, mode)) {
-    return -1;
-  }
-  auto* sp = encoder_factory_->codec_manager.GetStackParams();
-  if (sp->speech_encoder)
-    encoder_stack_ = encoder_factory_->rent_a_codec.RentEncoderStack(sp);
-  return 0;
-}
-
-// Get VAD/DTX settings.
-int AudioCodingModuleImpl::VAD(bool* dtx_enabled, bool* vad_enabled,
-                               ACMVADMode* mode) const {
-  rtc::CritScope lock(&acm_crit_sect_);
-  const auto* sp = encoder_factory_->codec_manager.GetStackParams();
-  *dtx_enabled = *vad_enabled = sp->use_cng;
-  *mode = sp->vad_mode;
-  return 0;
-}
-
-/////////////////////////////////////////
-//   Receiver
-//
-
-int AudioCodingModuleImpl::InitializeReceiver() {
-  rtc::CritScope lock(&acm_crit_sect_);
-  return InitializeReceiverSafe();
-}
-
-// Initialize receiver, resets codec database etc.
-int AudioCodingModuleImpl::InitializeReceiverSafe() {
-  // If the receiver is already initialized then we want to destroy any
-  // existing decoders. After a call to this function, we should have a clean
-  // start-up.
-  if (receiver_initialized_)
-    receiver_.RemoveAllCodecs();
-  receiver_.ResetInitialDelay();
-  receiver_.SetMinimumDelay(0);
-  receiver_.SetMaximumDelay(0);
-  receiver_.FlushBuffers();
-
-  receiver_initialized_ = true;
-  return 0;
-}
-
-// Get current receive frequency.
-int AudioCodingModuleImpl::ReceiveFrequency() const {
-  const auto last_packet_sample_rate = receiver_.last_packet_sample_rate_hz();
-  return last_packet_sample_rate ? *last_packet_sample_rate
-                                 : receiver_.last_output_sample_rate_hz();
-}
-
-// Get current playout frequency.
-int AudioCodingModuleImpl::PlayoutFrequency() const {
-  return receiver_.last_output_sample_rate_hz();
-}
-
-void AudioCodingModuleImpl::SetReceiveCodecs(
-    const std::map<int, SdpAudioFormat>& codecs) {
-  rtc::CritScope lock(&acm_crit_sect_);
-  receiver_.SetCodecs(codecs);
-}
-
-bool AudioCodingModuleImpl::RegisterReceiveCodec(
-    int rtp_payload_type,
-    const SdpAudioFormat& audio_format) {
-  rtc::CritScope lock(&acm_crit_sect_);
-  RTC_DCHECK(receiver_initialized_);
-
-  if (!acm2::RentACodec::IsPayloadTypeValid(rtp_payload_type)) {
-    LOG_F(LS_ERROR) << "Invalid payload-type " << rtp_payload_type
-                    << " for decoder.";
-    return false;
-  }
-
-  return receiver_.AddCodec(rtp_payload_type, audio_format);
-}
-
-int AudioCodingModuleImpl::RegisterReceiveCodec(const CodecInst& codec) {
-  rtc::CritScope lock(&acm_crit_sect_);
-  auto* ef = encoder_factory_.get();
-  return RegisterReceiveCodecUnlocked(
-      codec, [&] { return ef->rent_a_codec.RentIsacDecoder(codec.plfreq); });
-}
-
-int AudioCodingModuleImpl::RegisterReceiveCodec(
-    const CodecInst& codec,
-    rtc::FunctionView<std::unique_ptr<AudioDecoder>()> isac_factory) {
-  rtc::CritScope lock(&acm_crit_sect_);
-  return RegisterReceiveCodecUnlocked(codec, isac_factory);
-}
-
-int AudioCodingModuleImpl::RegisterReceiveCodecUnlocked(
-    const CodecInst& codec,
-    rtc::FunctionView<std::unique_ptr<AudioDecoder>()> isac_factory) {
-  RTC_DCHECK(receiver_initialized_);
-  if (codec.channels > 2) {
-    LOG_F(LS_ERROR) << "Unsupported number of channels: " << codec.channels;
-    return -1;
-  }
-
-  auto codec_id = acm2::RentACodec::CodecIdByParams(codec.plname, codec.plfreq,
-                                                    codec.channels);
-  if (!codec_id) {
-    LOG_F(LS_ERROR) << "Wrong codec params to be registered as receive codec";
-    return -1;
-  }
-  auto codec_index = acm2::RentACodec::CodecIndexFromId(*codec_id);
-  RTC_CHECK(codec_index) << "Invalid codec ID: " << static_cast<int>(*codec_id);
-
-  // Check if the payload-type is valid.
-  if (!acm2::RentACodec::IsPayloadTypeValid(codec.pltype)) {
-    LOG_F(LS_ERROR) << "Invalid payload type " << codec.pltype << " for "
-                    << codec.plname;
-    return -1;
-  }
-
-  AudioDecoder* isac_decoder = nullptr;
-  if (STR_CASE_CMP(codec.plname, "isac") == 0) {
-    std::unique_ptr<AudioDecoder>& saved_isac_decoder =
-        codec.plfreq == 16000 ? isac_decoder_16k_ : isac_decoder_32k_;
-    if (!saved_isac_decoder) {
-      saved_isac_decoder = isac_factory();
-    }
-    isac_decoder = saved_isac_decoder.get();
-  }
-  return receiver_.AddCodec(*codec_index, codec.pltype, codec.channels,
-                            codec.plfreq, isac_decoder, codec.plname);
-}
-
-int AudioCodingModuleImpl::RegisterExternalReceiveCodec(
-    int rtp_payload_type,
-    AudioDecoder* external_decoder,
-    int sample_rate_hz,
-    int num_channels,
-    const std::string& name) {
-  rtc::CritScope lock(&acm_crit_sect_);
-  RTC_DCHECK(receiver_initialized_);
-  if (num_channels > 2 || num_channels < 0) {
-    LOG_F(LS_ERROR) << "Unsupported number of channels: " << num_channels;
-    return -1;
-  }
-
-  // Check if the payload-type is valid.
-  if (!acm2::RentACodec::IsPayloadTypeValid(rtp_payload_type)) {
-    LOG_F(LS_ERROR) << "Invalid payload-type " << rtp_payload_type
-                    << " for external decoder.";
-    return -1;
-  }
-
-  return receiver_.AddCodec(-1 /* external */, rtp_payload_type, num_channels,
-                            sample_rate_hz, external_decoder, name);
-}
-
-// Get current received codec.
-int AudioCodingModuleImpl::ReceiveCodec(CodecInst* current_codec) const {
-  rtc::CritScope lock(&acm_crit_sect_);
-  return receiver_.LastAudioCodec(current_codec);
-}
-
-rtc::Optional<SdpAudioFormat> AudioCodingModuleImpl::ReceiveFormat() const {
-  rtc::CritScope lock(&acm_crit_sect_);
-  return receiver_.LastAudioFormat();
-}
-
-// Incoming packet from network parsed and ready for decode.
-int AudioCodingModuleImpl::IncomingPacket(const uint8_t* incoming_payload,
-                                          const size_t payload_length,
-                                          const WebRtcRTPHeader& rtp_header) {
-  RTC_DCHECK_EQ(payload_length == 0, incoming_payload == nullptr);
-  return receiver_.InsertPacket(
-      rtp_header,
-      rtc::ArrayView<const uint8_t>(incoming_payload, payload_length));
-}
-
-// Minimum playout delay (Used for lip-sync).
-int AudioCodingModuleImpl::SetMinimumPlayoutDelay(int time_ms) {
-  if ((time_ms < 0) || (time_ms > 10000)) {
-    LOG(LS_ERROR) << "Delay must be in the range of 0-1000 milliseconds.";
-    return -1;
-  }
-  return receiver_.SetMinimumDelay(time_ms);
-}
-
-int AudioCodingModuleImpl::SetMaximumPlayoutDelay(int time_ms) {
-  if ((time_ms < 0) || (time_ms > 10000)) {
-    LOG(LS_ERROR) << "Delay must be in the range of 0-1000 milliseconds.";
-    return -1;
-  }
-  return receiver_.SetMaximumDelay(time_ms);
-}
-
-// Get 10 milliseconds of raw audio data to play out.
-// Automatic resample to the requested frequency.
-int AudioCodingModuleImpl::PlayoutData10Ms(int desired_freq_hz,
-                                           AudioFrame* audio_frame,
-                                           bool* muted) {
-  // GetAudio always returns 10 ms, at the requested sample rate.
-  if (receiver_.GetAudio(desired_freq_hz, audio_frame, muted) != 0) {
-    LOG(LS_ERROR) << "PlayoutData failed, RecOut Failed";
-    return -1;
-  }
-  audio_frame->id_ = id_;
-  return 0;
-}
-
-int AudioCodingModuleImpl::PlayoutData10Ms(int desired_freq_hz,
-                                           AudioFrame* audio_frame) {
-  bool muted;
-  int ret = PlayoutData10Ms(desired_freq_hz, audio_frame, &muted);
-  RTC_DCHECK(!muted);
-  return ret;
-}
-
-/////////////////////////////////////////
-//   Statistics
-//
-
-// TODO(turajs) change the return value to void. Also change the corresponding
-// NetEq function.
-int AudioCodingModuleImpl::GetNetworkStatistics(NetworkStatistics* statistics) {
-  receiver_.GetNetworkStatistics(statistics);
-  return 0;
-}
-
-int AudioCodingModuleImpl::RegisterVADCallback(ACMVADCallback* vad_callback) {
-  LOG(LS_VERBOSE) << "RegisterVADCallback()";
-  rtc::CritScope lock(&callback_crit_sect_);
-  vad_callback_ = vad_callback;
-  return 0;
-}
-
-// TODO(kwiberg): Remove this method, and have callers call IncomingPacket
-// instead. The translation logic and state belong with them, not with
-// AudioCodingModuleImpl.
-int AudioCodingModuleImpl::IncomingPayload(const uint8_t* incoming_payload,
-                                           size_t payload_length,
-                                           uint8_t payload_type,
-                                           uint32_t timestamp) {
-  // We are not acquiring any lock when interacting with |aux_rtp_header_| no
-  // other method uses this member variable.
-  if (!aux_rtp_header_) {
-    // This is the first time that we are using |dummy_rtp_header_|
-    // so we have to create it.
-    aux_rtp_header_.reset(new WebRtcRTPHeader);
-    aux_rtp_header_->header.payloadType = payload_type;
-    // Don't matter in this case.
-    aux_rtp_header_->header.ssrc = 0;
-    aux_rtp_header_->header.markerBit = false;
-    // Start with random numbers.
-    aux_rtp_header_->header.sequenceNumber = 0x1234;  // Arbitrary.
-    aux_rtp_header_->type.Audio.channel = 1;
-  }
-
-  aux_rtp_header_->header.timestamp = timestamp;
-  IncomingPacket(incoming_payload, payload_length, *aux_rtp_header_);
-  // Get ready for the next payload.
-  aux_rtp_header_->header.sequenceNumber++;
-  return 0;
-}
-
-int AudioCodingModuleImpl::SetOpusApplication(OpusApplicationMode application) {
-  rtc::CritScope lock(&acm_crit_sect_);
-  if (!HaveValidEncoder("SetOpusApplication")) {
-    return -1;
-  }
-  AudioEncoder::Application app;
-  switch (application) {
-    case kVoip:
-      app = AudioEncoder::Application::kSpeech;
-      break;
-    case kAudio:
-      app = AudioEncoder::Application::kAudio;
-      break;
-    default:
-      FATAL();
-      return 0;
-  }
-  return encoder_stack_->SetApplication(app) ? 0 : -1;
-}
-
-// Informs Opus encoder of the maximum playback rate the receiver will render.
-int AudioCodingModuleImpl::SetOpusMaxPlaybackRate(int frequency_hz) {
-  rtc::CritScope lock(&acm_crit_sect_);
-  if (!HaveValidEncoder("SetOpusMaxPlaybackRate")) {
-    return -1;
-  }
-  encoder_stack_->SetMaxPlaybackRate(frequency_hz);
-  return 0;
-}
-
-int AudioCodingModuleImpl::EnableOpusDtx() {
-  rtc::CritScope lock(&acm_crit_sect_);
-  if (!HaveValidEncoder("EnableOpusDtx")) {
-    return -1;
-  }
-  return encoder_stack_->SetDtx(true) ? 0 : -1;
-}
-
-int AudioCodingModuleImpl::DisableOpusDtx() {
-  rtc::CritScope lock(&acm_crit_sect_);
-  if (!HaveValidEncoder("DisableOpusDtx")) {
-    return -1;
-  }
-  return encoder_stack_->SetDtx(false) ? 0 : -1;
-}
-
-int32_t AudioCodingModuleImpl::PlayoutTimestamp(uint32_t* timestamp) {
-  rtc::Optional<uint32_t> ts = PlayoutTimestamp();
-  if (!ts)
-    return -1;
-  *timestamp = *ts;
-  return 0;
-}
-
-rtc::Optional<uint32_t> AudioCodingModuleImpl::PlayoutTimestamp() {
-  return receiver_.GetPlayoutTimestamp();
-}
-
-int AudioCodingModuleImpl::FilteredCurrentDelayMs() const {
-  return receiver_.FilteredCurrentDelayMs();
-}
-
-bool AudioCodingModuleImpl::HaveValidEncoder(const char* caller_name) const {
-  if (!encoder_stack_) {
-    LOG(LS_ERROR) << caller_name << " failed: No send codec is registered.";
-    return false;
-  }
-  return true;
-}
-
-int AudioCodingModuleImpl::UnregisterReceiveCodec(uint8_t payload_type) {
-  return receiver_.RemoveCodec(payload_type);
-}
-
-int AudioCodingModuleImpl::EnableNack(size_t max_nack_list_size) {
-  return receiver_.EnableNack(max_nack_list_size);
-}
-
-void AudioCodingModuleImpl::DisableNack() {
-  receiver_.DisableNack();
-}
-
-std::vector<uint16_t> AudioCodingModuleImpl::GetNackList(
-    int64_t round_trip_time_ms) const {
-  return receiver_.GetNackList(round_trip_time_ms);
-}
-
-int AudioCodingModuleImpl::LeastRequiredDelayMs() const {
-  return receiver_.LeastRequiredDelayMs();
-}
-
-void AudioCodingModuleImpl::GetDecodingCallStatistics(
-      AudioDecodingCallStats* call_stats) const {
-  receiver_.GetDecodingCallStatistics(call_stats);
-}
-
-ANAStats AudioCodingModuleImpl::GetANAStats() const {
-  rtc::CritScope lock(&acm_crit_sect_);
-  if (encoder_stack_)
-    return encoder_stack_->GetANAStats();
-  // If no encoder is set, return default stats.
-  return ANAStats();
-}
-
-}  // namespace
-
-AudioCodingModule::Config::Config()
-    : id(0), neteq_config(), clock(Clock::GetRealTimeClock()) {
-  // Post-decode VAD is disabled by default in NetEq, however, Audio
-  // Conference Mixer relies on VAD decisions and fails without them.
-  neteq_config.enable_post_decode_vad = true;
-}
-
-AudioCodingModule::Config::Config(const Config&) = default;
-AudioCodingModule::Config::~Config() = default;
-
-// Create module
-AudioCodingModule* AudioCodingModule::Create(int id) {
-  Config config;
-  config.id = id;
-  config.clock = Clock::GetRealTimeClock();
-  config.decoder_factory = CreateBuiltinAudioDecoderFactory();
-  return Create(config);
-}
-
-AudioCodingModule* AudioCodingModule::Create(int id, Clock* clock) {
-  Config config;
-  config.id = id;
-  config.clock = clock;
-  config.decoder_factory = CreateBuiltinAudioDecoderFactory();
-  return Create(config);
-}
-
-AudioCodingModule* AudioCodingModule::Create(const Config& config) {
-  if (!config.decoder_factory) {
-    // TODO(ossu): Backwards compatibility. Will be removed after a deprecation
-    // cycle.
-    Config config_copy = config;
-    config_copy.decoder_factory = CreateBuiltinAudioDecoderFactory();
-    return new AudioCodingModuleImpl(config_copy);
-  }
-  return new AudioCodingModuleImpl(config);
-}
-
-int AudioCodingModule::NumberOfCodecs() {
-  return static_cast<int>(acm2::RentACodec::NumberOfCodecs());
-}
-
-int AudioCodingModule::Codec(int list_id, CodecInst* codec) {
-  auto codec_id = acm2::RentACodec::CodecIdFromIndex(list_id);
-  if (!codec_id)
-    return -1;
-  auto ci = acm2::RentACodec::CodecInstById(*codec_id);
-  if (!ci)
-    return -1;
-  *codec = *ci;
-  return 0;
-}
-
-int AudioCodingModule::Codec(const char* payload_name,
-                             CodecInst* codec,
-                             int sampling_freq_hz,
-                             size_t channels) {
-  rtc::Optional<CodecInst> ci = acm2::RentACodec::CodecInstByParams(
-      payload_name, sampling_freq_hz, channels);
-  if (ci) {
-    *codec = *ci;
-    return 0;
-  } else {
-    // We couldn't find a matching codec, so set the parameters to unacceptable
-    // values and return.
-    codec->plname[0] = '\0';
-    codec->pltype = -1;
-    codec->pacsize = 0;
-    codec->rate = 0;
-    codec->plfreq = 0;
-    return -1;
-  }
-}
-
-int AudioCodingModule::Codec(const char* payload_name,
-                             int sampling_freq_hz,
-                             size_t channels) {
-  rtc::Optional<acm2::RentACodec::CodecId> ci =
-      acm2::RentACodec::CodecIdByParams(payload_name, sampling_freq_hz,
-                                        channels);
-  if (!ci)
-    return -1;
-  rtc::Optional<int> i = acm2::RentACodec::CodecIndexFromId(*ci);
-  return i ? *i : -1;
-}
-
-// Checks the validity of the parameters of the given codec
-bool AudioCodingModule::IsCodecValid(const CodecInst& codec) {
-  bool valid = acm2::RentACodec::IsCodecValid(codec);
-  if (!valid)
-    LOG(LS_ERROR) << "Invalid codec setting";
-  return valid;
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/acm2/audio_coding_module_unittest.cc b/modules/audio_coding/acm2/audio_coding_module_unittest.cc
deleted file mode 100644
index 9c7e4cd..0000000
--- a/modules/audio_coding/acm2/audio_coding_module_unittest.cc
+++ /dev/null
@@ -1,1965 +0,0 @@
-/*
- *  Copyright (c) 2014 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 <stdio.h>
-#include <string.h>
-#include <memory>
-#include <vector>
-
-#include "webrtc/api/audio_codecs/audio_encoder.h"
-#include "webrtc/api/audio_codecs/builtin_audio_decoder_factory.h"
-#include "webrtc/modules/audio_coding/acm2/acm_receive_test.h"
-#include "webrtc/modules/audio_coding/acm2/acm_send_test.h"
-#include "webrtc/modules/audio_coding/codecs/audio_format_conversion.h"
-#include "webrtc/modules/audio_coding/codecs/g711/audio_decoder_pcm.h"
-#include "webrtc/modules/audio_coding/codecs/g711/audio_encoder_pcm.h"
-#include "webrtc/modules/audio_coding/codecs/isac/main/include/audio_encoder_isac.h"
-#include "webrtc/modules/audio_coding/codecs/opus/audio_encoder_opus.h"
-#include "webrtc/modules/audio_coding/include/audio_coding_module.h"
-#include "webrtc/modules/audio_coding/include/audio_coding_module_typedefs.h"
-#include "webrtc/modules/audio_coding/neteq/audio_decoder_impl.h"
-#include "webrtc/modules/audio_coding/neteq/tools/audio_checksum.h"
-#include "webrtc/modules/audio_coding/neteq/tools/audio_loop.h"
-#include "webrtc/modules/audio_coding/neteq/tools/constant_pcm_packet_source.h"
-#include "webrtc/modules/audio_coding/neteq/tools/input_audio_file.h"
-#include "webrtc/modules/audio_coding/neteq/tools/output_audio_file.h"
-#include "webrtc/modules/audio_coding/neteq/tools/output_wav_file.h"
-#include "webrtc/modules/audio_coding/neteq/tools/packet.h"
-#include "webrtc/modules/audio_coding/neteq/tools/rtp_file_source.h"
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/md5digest.h"
-#include "webrtc/rtc_base/platform_thread.h"
-#include "webrtc/rtc_base/thread_annotations.h"
-#include "webrtc/system_wrappers/include/clock.h"
-#include "webrtc/system_wrappers/include/event_wrapper.h"
-#include "webrtc/system_wrappers/include/sleep.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/mock_audio_decoder.h"
-#include "webrtc/test/mock_audio_encoder.h"
-#include "webrtc/test/testsupport/fileutils.h"
-
-using ::testing::AtLeast;
-using ::testing::Invoke;
-using ::testing::_;
-
-namespace webrtc {
-
-namespace {
-const int kSampleRateHz = 16000;
-const int kNumSamples10ms = kSampleRateHz / 100;
-const int kFrameSizeMs = 10;  // Multiple of 10.
-const int kFrameSizeSamples = kFrameSizeMs / 10 * kNumSamples10ms;
-const int kPayloadSizeBytes = kFrameSizeSamples * sizeof(int16_t);
-const uint8_t kPayloadType = 111;
-}  // namespace
-
-class RtpUtility {
- public:
-  RtpUtility(int samples_per_packet, uint8_t payload_type)
-      : samples_per_packet_(samples_per_packet), payload_type_(payload_type) {}
-
-  virtual ~RtpUtility() {}
-
-  void Populate(WebRtcRTPHeader* rtp_header) {
-    rtp_header->header.sequenceNumber = 0xABCD;
-    rtp_header->header.timestamp = 0xABCDEF01;
-    rtp_header->header.payloadType = payload_type_;
-    rtp_header->header.markerBit = false;
-    rtp_header->header.ssrc = 0x1234;
-    rtp_header->header.numCSRCs = 0;
-    rtp_header->frameType = kAudioFrameSpeech;
-
-    rtp_header->header.payload_type_frequency = kSampleRateHz;
-    rtp_header->type.Audio.channel = 1;
-    rtp_header->type.Audio.isCNG = false;
-  }
-
-  void Forward(WebRtcRTPHeader* rtp_header) {
-    ++rtp_header->header.sequenceNumber;
-    rtp_header->header.timestamp += samples_per_packet_;
-  }
-
- private:
-  int samples_per_packet_;
-  uint8_t payload_type_;
-};
-
-class PacketizationCallbackStubOldApi : public AudioPacketizationCallback {
- public:
-  PacketizationCallbackStubOldApi()
-      : num_calls_(0),
-        last_frame_type_(kEmptyFrame),
-        last_payload_type_(-1),
-        last_timestamp_(0) {}
-
-  int32_t SendData(FrameType frame_type,
-                   uint8_t payload_type,
-                   uint32_t timestamp,
-                   const uint8_t* payload_data,
-                   size_t payload_len_bytes,
-                   const RTPFragmentationHeader* fragmentation) override {
-    rtc::CritScope lock(&crit_sect_);
-    ++num_calls_;
-    last_frame_type_ = frame_type;
-    last_payload_type_ = payload_type;
-    last_timestamp_ = timestamp;
-    last_payload_vec_.assign(payload_data, payload_data + payload_len_bytes);
-    return 0;
-  }
-
-  int num_calls() const {
-    rtc::CritScope lock(&crit_sect_);
-    return num_calls_;
-  }
-
-  int last_payload_len_bytes() const {
-    rtc::CritScope lock(&crit_sect_);
-    return last_payload_vec_.size();
-  }
-
-  FrameType last_frame_type() const {
-    rtc::CritScope lock(&crit_sect_);
-    return last_frame_type_;
-  }
-
-  int last_payload_type() const {
-    rtc::CritScope lock(&crit_sect_);
-    return last_payload_type_;
-  }
-
-  uint32_t last_timestamp() const {
-    rtc::CritScope lock(&crit_sect_);
-    return last_timestamp_;
-  }
-
-  void SwapBuffers(std::vector<uint8_t>* payload) {
-    rtc::CritScope lock(&crit_sect_);
-    last_payload_vec_.swap(*payload);
-  }
-
- private:
-  int num_calls_ RTC_GUARDED_BY(crit_sect_);
-  FrameType last_frame_type_ RTC_GUARDED_BY(crit_sect_);
-  int last_payload_type_ RTC_GUARDED_BY(crit_sect_);
-  uint32_t last_timestamp_ RTC_GUARDED_BY(crit_sect_);
-  std::vector<uint8_t> last_payload_vec_ RTC_GUARDED_BY(crit_sect_);
-  rtc::CriticalSection crit_sect_;
-};
-
-class AudioCodingModuleTestOldApi : public ::testing::Test {
- protected:
-  AudioCodingModuleTestOldApi()
-      : id_(1),
-        rtp_utility_(new RtpUtility(kFrameSizeSamples, kPayloadType)),
-        clock_(Clock::GetRealTimeClock()) {}
-
-  ~AudioCodingModuleTestOldApi() {}
-
-  void TearDown() {}
-
-  void SetUp() {
-    acm_.reset(AudioCodingModule::Create(id_, clock_));
-
-    rtp_utility_->Populate(&rtp_header_);
-
-    input_frame_.sample_rate_hz_ = kSampleRateHz;
-    input_frame_.num_channels_ = 1;
-    input_frame_.samples_per_channel_ = kSampleRateHz * 10 / 1000;  // 10 ms.
-    static_assert(kSampleRateHz * 10 / 1000 <= AudioFrame::kMaxDataSizeSamples,
-                  "audio frame too small");
-    input_frame_.Mute();
-
-    ASSERT_EQ(0, acm_->RegisterTransportCallback(&packet_cb_));
-
-    SetUpL16Codec();
-  }
-
-  // Set up L16 codec.
-  virtual void SetUpL16Codec() {
-    audio_format_ =
-        rtc::Optional<SdpAudioFormat>(SdpAudioFormat("L16", kSampleRateHz, 1));
-    ASSERT_EQ(0, AudioCodingModule::Codec("L16", &codec_, kSampleRateHz, 1));
-    codec_.pltype = kPayloadType;
-  }
-
-  virtual void RegisterCodec() {
-    EXPECT_EQ(true, acm_->RegisterReceiveCodec(kPayloadType, *audio_format_));
-    EXPECT_EQ(0, acm_->RegisterSendCodec(codec_));
-  }
-
-  virtual void InsertPacketAndPullAudio() {
-    InsertPacket();
-    PullAudio();
-  }
-
-  virtual void InsertPacket() {
-    const uint8_t kPayload[kPayloadSizeBytes] = {0};
-    ASSERT_EQ(0,
-              acm_->IncomingPacket(kPayload, kPayloadSizeBytes, rtp_header_));
-    rtp_utility_->Forward(&rtp_header_);
-  }
-
-  virtual void PullAudio() {
-    AudioFrame audio_frame;
-    bool muted;
-    ASSERT_EQ(0, acm_->PlayoutData10Ms(-1, &audio_frame, &muted));
-    ASSERT_FALSE(muted);
-  }
-
-  virtual void InsertAudio() {
-    ASSERT_GE(acm_->Add10MsData(input_frame_), 0);
-    input_frame_.timestamp_ += kNumSamples10ms;
-  }
-
-  virtual void VerifyEncoding() {
-    int last_length = packet_cb_.last_payload_len_bytes();
-    EXPECT_TRUE(last_length == 2 * codec_.pacsize || last_length == 0)
-        << "Last encoded packet was " << last_length << " bytes.";
-  }
-
-  virtual void InsertAudioAndVerifyEncoding() {
-    InsertAudio();
-    VerifyEncoding();
-  }
-
-  const int id_;
-  std::unique_ptr<RtpUtility> rtp_utility_;
-  std::unique_ptr<AudioCodingModule> acm_;
-  PacketizationCallbackStubOldApi packet_cb_;
-  WebRtcRTPHeader rtp_header_;
-  AudioFrame input_frame_;
-
-  // These two have to be kept in sync for now. In the future, we'll be able to
-  // eliminate the CodecInst and keep only the SdpAudioFormat.
-  rtc::Optional<SdpAudioFormat> audio_format_;
-  CodecInst codec_;
-
-  Clock* clock_;
-};
-
-// Check if the statistics are initialized correctly. Before any call to ACM
-// all fields have to be zero.
-#if defined(WEBRTC_ANDROID)
-#define MAYBE_InitializedToZero DISABLED_InitializedToZero
-#else
-#define MAYBE_InitializedToZero InitializedToZero
-#endif
-TEST_F(AudioCodingModuleTestOldApi, MAYBE_InitializedToZero) {
-  RegisterCodec();
-  AudioDecodingCallStats stats;
-  acm_->GetDecodingCallStatistics(&stats);
-  EXPECT_EQ(0, stats.calls_to_neteq);
-  EXPECT_EQ(0, stats.calls_to_silence_generator);
-  EXPECT_EQ(0, stats.decoded_normal);
-  EXPECT_EQ(0, stats.decoded_cng);
-  EXPECT_EQ(0, stats.decoded_plc);
-  EXPECT_EQ(0, stats.decoded_plc_cng);
-  EXPECT_EQ(0, stats.decoded_muted_output);
-}
-
-// Insert some packets and pull audio. Check statistics are valid. Then,
-// simulate packet loss and check if PLC and PLC-to-CNG statistics are
-// correctly updated.
-#if defined(WEBRTC_ANDROID)
-#define MAYBE_NetEqCalls DISABLED_NetEqCalls
-#else
-#define MAYBE_NetEqCalls NetEqCalls
-#endif
-TEST_F(AudioCodingModuleTestOldApi, MAYBE_NetEqCalls) {
-  RegisterCodec();
-  AudioDecodingCallStats stats;
-  const int kNumNormalCalls = 10;
-
-  for (int num_calls = 0; num_calls < kNumNormalCalls; ++num_calls) {
-    InsertPacketAndPullAudio();
-  }
-  acm_->GetDecodingCallStatistics(&stats);
-  EXPECT_EQ(kNumNormalCalls, stats.calls_to_neteq);
-  EXPECT_EQ(0, stats.calls_to_silence_generator);
-  EXPECT_EQ(kNumNormalCalls, stats.decoded_normal);
-  EXPECT_EQ(0, stats.decoded_cng);
-  EXPECT_EQ(0, stats.decoded_plc);
-  EXPECT_EQ(0, stats.decoded_plc_cng);
-  EXPECT_EQ(0, stats.decoded_muted_output);
-
-  const int kNumPlc = 3;
-  const int kNumPlcCng = 5;
-
-  // Simulate packet-loss. NetEq first performs PLC then PLC fades to CNG.
-  for (int n = 0; n < kNumPlc + kNumPlcCng; ++n) {
-    PullAudio();
-  }
-  acm_->GetDecodingCallStatistics(&stats);
-  EXPECT_EQ(kNumNormalCalls + kNumPlc + kNumPlcCng, stats.calls_to_neteq);
-  EXPECT_EQ(0, stats.calls_to_silence_generator);
-  EXPECT_EQ(kNumNormalCalls, stats.decoded_normal);
-  EXPECT_EQ(0, stats.decoded_cng);
-  EXPECT_EQ(kNumPlc, stats.decoded_plc);
-  EXPECT_EQ(kNumPlcCng, stats.decoded_plc_cng);
-  EXPECT_EQ(0, stats.decoded_muted_output);
-  // TODO(henrik.lundin) Add a test with muted state enabled.
-}
-
-TEST_F(AudioCodingModuleTestOldApi, VerifyOutputFrame) {
-  AudioFrame audio_frame;
-  const int kSampleRateHz = 32000;
-  bool muted;
-  EXPECT_EQ(0, acm_->PlayoutData10Ms(kSampleRateHz, &audio_frame, &muted));
-  ASSERT_FALSE(muted);
-  EXPECT_EQ(id_, audio_frame.id_);
-  EXPECT_EQ(0u, audio_frame.timestamp_);
-  EXPECT_GT(audio_frame.num_channels_, 0u);
-  EXPECT_EQ(static_cast<size_t>(kSampleRateHz / 100),
-            audio_frame.samples_per_channel_);
-  EXPECT_EQ(kSampleRateHz, audio_frame.sample_rate_hz_);
-}
-
-// The below test is temporarily disabled on Windows due to problems
-// with clang debug builds.
-// TODO(tommi): Re-enable when we've figured out what the problem is.
-// http://crbug.com/615050
-#if !defined(WEBRTC_WIN) && defined(__clang__) && RTC_DCHECK_IS_ON && \
-    GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
-TEST_F(AudioCodingModuleTestOldApi, FailOnZeroDesiredFrequency) {
-  AudioFrame audio_frame;
-  bool muted;
-  EXPECT_DEATH(acm_->PlayoutData10Ms(0, &audio_frame, &muted),
-               "dst_sample_rate_hz");
-}
-#endif
-
-// Checks that the transport callback is invoked once for each speech packet.
-// Also checks that the frame type is kAudioFrameSpeech.
-TEST_F(AudioCodingModuleTestOldApi, TransportCallbackIsInvokedForEachPacket) {
-  const int k10MsBlocksPerPacket = 3;
-  codec_.pacsize = k10MsBlocksPerPacket * kSampleRateHz / 100;
-  RegisterCodec();
-  const int kLoops = 10;
-  for (int i = 0; i < kLoops; ++i) {
-    EXPECT_EQ(i / k10MsBlocksPerPacket, packet_cb_.num_calls());
-    if (packet_cb_.num_calls() > 0)
-      EXPECT_EQ(kAudioFrameSpeech, packet_cb_.last_frame_type());
-    InsertAudioAndVerifyEncoding();
-  }
-  EXPECT_EQ(kLoops / k10MsBlocksPerPacket, packet_cb_.num_calls());
-  EXPECT_EQ(kAudioFrameSpeech, packet_cb_.last_frame_type());
-}
-
-#if defined(WEBRTC_CODEC_ISAC) || defined(WEBRTC_CODEC_ISACFX)
-// Verifies that the RTP timestamp series is not reset when the codec is
-// changed.
-TEST_F(AudioCodingModuleTestOldApi, TimestampSeriesContinuesWhenCodecChanges) {
-  RegisterCodec();  // This registers the default codec.
-  uint32_t expected_ts = input_frame_.timestamp_;
-  int blocks_per_packet = codec_.pacsize / (kSampleRateHz / 100);
-  // Encode 5 packets of the first codec type.
-  const int kNumPackets1 = 5;
-  for (int j = 0; j < kNumPackets1; ++j) {
-    for (int i = 0; i < blocks_per_packet; ++i) {
-      EXPECT_EQ(j, packet_cb_.num_calls());
-      InsertAudio();
-    }
-    EXPECT_EQ(j + 1, packet_cb_.num_calls());
-    EXPECT_EQ(expected_ts, packet_cb_.last_timestamp());
-    expected_ts += codec_.pacsize;
-  }
-
-  // Change codec.
-  ASSERT_EQ(0, AudioCodingModule::Codec("ISAC", &codec_, kSampleRateHz, 1));
-  RegisterCodec();
-  blocks_per_packet = codec_.pacsize / (kSampleRateHz / 100);
-  // Encode another 5 packets.
-  const int kNumPackets2 = 5;
-  for (int j = 0; j < kNumPackets2; ++j) {
-    for (int i = 0; i < blocks_per_packet; ++i) {
-      EXPECT_EQ(kNumPackets1 + j, packet_cb_.num_calls());
-      InsertAudio();
-    }
-    EXPECT_EQ(kNumPackets1 + j + 1, packet_cb_.num_calls());
-    EXPECT_EQ(expected_ts, packet_cb_.last_timestamp());
-    expected_ts += codec_.pacsize;
-  }
-}
-#endif
-
-// Introduce this class to set different expectations on the number of encoded
-// bytes. This class expects all encoded packets to be 9 bytes (matching one
-// CNG SID frame) or 0 bytes. This test depends on |input_frame_| containing
-// (near-)zero values. It also introduces a way to register comfort noise with
-// a custom payload type.
-class AudioCodingModuleTestWithComfortNoiseOldApi
-    : public AudioCodingModuleTestOldApi {
- protected:
-  void RegisterCngCodec(int rtp_payload_type) {
-    EXPECT_EQ(true,
-              acm_->RegisterReceiveCodec(
-                  rtp_payload_type, SdpAudioFormat("cn", kSampleRateHz, 1)));
-
-    CodecInst codec;
-    EXPECT_EQ(0, AudioCodingModule::Codec("CN", &codec, kSampleRateHz, 1));
-    codec.pltype = rtp_payload_type;
-    EXPECT_EQ(0, acm_->RegisterSendCodec(codec));
-  }
-
-  void VerifyEncoding() override {
-    int last_length = packet_cb_.last_payload_len_bytes();
-    EXPECT_TRUE(last_length == 9 || last_length == 0)
-        << "Last encoded packet was " << last_length << " bytes.";
-  }
-
-  void DoTest(int blocks_per_packet, int cng_pt) {
-    const int kLoops = 40;
-    // This array defines the expected frame types, and when they should arrive.
-    // We expect a frame to arrive each time the speech encoder would have
-    // produced a packet, and once every 100 ms the frame should be non-empty,
-    // that is contain comfort noise.
-    const struct {
-      int ix;
-      FrameType type;
-    } expectation[] = {{2, kAudioFrameCN},
-                       {5, kEmptyFrame},
-                       {8, kEmptyFrame},
-                       {11, kAudioFrameCN},
-                       {14, kEmptyFrame},
-                       {17, kEmptyFrame},
-                       {20, kAudioFrameCN},
-                       {23, kEmptyFrame},
-                       {26, kEmptyFrame},
-                       {29, kEmptyFrame},
-                       {32, kAudioFrameCN},
-                       {35, kEmptyFrame},
-                       {38, kEmptyFrame}};
-    for (int i = 0; i < kLoops; ++i) {
-      int num_calls_before = packet_cb_.num_calls();
-      EXPECT_EQ(i / blocks_per_packet, num_calls_before);
-      InsertAudioAndVerifyEncoding();
-      int num_calls = packet_cb_.num_calls();
-      if (num_calls == num_calls_before + 1) {
-        EXPECT_EQ(expectation[num_calls - 1].ix, i);
-        EXPECT_EQ(expectation[num_calls - 1].type, packet_cb_.last_frame_type())
-            << "Wrong frame type for lap " << i;
-        EXPECT_EQ(cng_pt, packet_cb_.last_payload_type());
-      } else {
-        EXPECT_EQ(num_calls, num_calls_before);
-      }
-    }
-  }
-};
-
-// Checks that the transport callback is invoked once per frame period of the
-// underlying speech encoder, even when comfort noise is produced.
-// Also checks that the frame type is kAudioFrameCN or kEmptyFrame.
-// This test and the next check the same thing, but differ in the order of
-// speech codec and CNG registration.
-TEST_F(AudioCodingModuleTestWithComfortNoiseOldApi,
-       TransportCallbackTestForComfortNoiseRegisterCngLast) {
-  const int k10MsBlocksPerPacket = 3;
-  codec_.pacsize = k10MsBlocksPerPacket * kSampleRateHz / 100;
-  RegisterCodec();
-  const int kCngPayloadType = 105;
-  RegisterCngCodec(kCngPayloadType);
-  ASSERT_EQ(0, acm_->SetVAD(true, true));
-  DoTest(k10MsBlocksPerPacket, kCngPayloadType);
-}
-
-TEST_F(AudioCodingModuleTestWithComfortNoiseOldApi,
-       TransportCallbackTestForComfortNoiseRegisterCngFirst) {
-  const int k10MsBlocksPerPacket = 3;
-  codec_.pacsize = k10MsBlocksPerPacket * kSampleRateHz / 100;
-  const int kCngPayloadType = 105;
-  RegisterCngCodec(kCngPayloadType);
-  RegisterCodec();
-  ASSERT_EQ(0, acm_->SetVAD(true, true));
-  DoTest(k10MsBlocksPerPacket, kCngPayloadType);
-}
-
-// A multi-threaded test for ACM. This base class is using the PCM16b 16 kHz
-// codec, while the derive class AcmIsacMtTest is using iSAC.
-class AudioCodingModuleMtTestOldApi : public AudioCodingModuleTestOldApi {
- protected:
-  static const int kNumPackets = 500;
-  static const int kNumPullCalls = 500;
-
-  AudioCodingModuleMtTestOldApi()
-      : AudioCodingModuleTestOldApi(),
-        send_thread_(CbSendThread, this, "send"),
-        insert_packet_thread_(CbInsertPacketThread, this, "insert_packet"),
-        pull_audio_thread_(CbPullAudioThread, this, "pull_audio"),
-        test_complete_(EventWrapper::Create()),
-        send_count_(0),
-        insert_packet_count_(0),
-        pull_audio_count_(0),
-        next_insert_packet_time_ms_(0),
-        fake_clock_(new SimulatedClock(0)) {
-    clock_ = fake_clock_.get();
-  }
-
-  void SetUp() {
-    AudioCodingModuleTestOldApi::SetUp();
-    RegisterCodec();  // Must be called before the threads start below.
-    StartThreads();
-  }
-
-  void StartThreads() {
-    send_thread_.Start();
-    send_thread_.SetPriority(rtc::kRealtimePriority);
-    insert_packet_thread_.Start();
-    insert_packet_thread_.SetPriority(rtc::kRealtimePriority);
-    pull_audio_thread_.Start();
-    pull_audio_thread_.SetPriority(rtc::kRealtimePriority);
-  }
-
-  void TearDown() {
-    AudioCodingModuleTestOldApi::TearDown();
-    pull_audio_thread_.Stop();
-    send_thread_.Stop();
-    insert_packet_thread_.Stop();
-  }
-
-  EventTypeWrapper RunTest() {
-    return test_complete_->Wait(10 * 60 * 1000);  // 10 minutes' timeout.
-  }
-
-  virtual bool TestDone() {
-    if (packet_cb_.num_calls() > kNumPackets) {
-      rtc::CritScope lock(&crit_sect_);
-      if (pull_audio_count_ > kNumPullCalls) {
-        // Both conditions for completion are met. End the test.
-        return true;
-      }
-    }
-    return false;
-  }
-
-  static bool CbSendThread(void* context) {
-    return reinterpret_cast<AudioCodingModuleMtTestOldApi*>(context)
-        ->CbSendImpl();
-  }
-
-  // The send thread doesn't have to care about the current simulated time,
-  // since only the AcmReceiver is using the clock.
-  bool CbSendImpl() {
-    SleepMs(1);
-    if (HasFatalFailure()) {
-      // End the test early if a fatal failure (ASSERT_*) has occurred.
-      test_complete_->Set();
-    }
-    ++send_count_;
-    InsertAudioAndVerifyEncoding();
-    if (TestDone()) {
-      test_complete_->Set();
-    }
-    return true;
-  }
-
-  static bool CbInsertPacketThread(void* context) {
-    return reinterpret_cast<AudioCodingModuleMtTestOldApi*>(context)
-        ->CbInsertPacketImpl();
-  }
-
-  bool CbInsertPacketImpl() {
-    SleepMs(1);
-    {
-      rtc::CritScope lock(&crit_sect_);
-      if (clock_->TimeInMilliseconds() < next_insert_packet_time_ms_) {
-        return true;
-      }
-      next_insert_packet_time_ms_ += 10;
-    }
-    // Now we're not holding the crit sect when calling ACM.
-    ++insert_packet_count_;
-    InsertPacket();
-    return true;
-  }
-
-  static bool CbPullAudioThread(void* context) {
-    return reinterpret_cast<AudioCodingModuleMtTestOldApi*>(context)
-        ->CbPullAudioImpl();
-  }
-
-  bool CbPullAudioImpl() {
-    SleepMs(1);
-    {
-      rtc::CritScope lock(&crit_sect_);
-      // Don't let the insert thread fall behind.
-      if (next_insert_packet_time_ms_ < clock_->TimeInMilliseconds()) {
-        return true;
-      }
-      ++pull_audio_count_;
-    }
-    // Now we're not holding the crit sect when calling ACM.
-    PullAudio();
-    fake_clock_->AdvanceTimeMilliseconds(10);
-    return true;
-  }
-
-  rtc::PlatformThread send_thread_;
-  rtc::PlatformThread insert_packet_thread_;
-  rtc::PlatformThread pull_audio_thread_;
-  const std::unique_ptr<EventWrapper> test_complete_;
-  int send_count_;
-  int insert_packet_count_;
-  int pull_audio_count_ RTC_GUARDED_BY(crit_sect_);
-  rtc::CriticalSection crit_sect_;
-  int64_t next_insert_packet_time_ms_ RTC_GUARDED_BY(crit_sect_);
-  std::unique_ptr<SimulatedClock> fake_clock_;
-};
-
-#if defined(WEBRTC_IOS)
-#define MAYBE_DoTest DISABLED_DoTest
-#else
-#define MAYBE_DoTest DoTest
-#endif
-TEST_F(AudioCodingModuleMtTestOldApi, MAYBE_DoTest) {
-  EXPECT_EQ(kEventSignaled, RunTest());
-}
-
-// This is a multi-threaded ACM test using iSAC. The test encodes audio
-// from a PCM file. The most recent encoded frame is used as input to the
-// receiving part. Depending on timing, it may happen that the same RTP packet
-// is inserted into the receiver multiple times, but this is a valid use-case,
-// and simplifies the test code a lot.
-class AcmIsacMtTestOldApi : public AudioCodingModuleMtTestOldApi {
- protected:
-  static const int kNumPackets = 500;
-  static const int kNumPullCalls = 500;
-
-  AcmIsacMtTestOldApi()
-      : AudioCodingModuleMtTestOldApi(), last_packet_number_(0) {}
-
-  ~AcmIsacMtTestOldApi() {}
-
-  void SetUp() override {
-    AudioCodingModuleTestOldApi::SetUp();
-    RegisterCodec();  // Must be called before the threads start below.
-
-    // Set up input audio source to read from specified file, loop after 5
-    // seconds, and deliver blocks of 10 ms.
-    const std::string input_file_name =
-        webrtc::test::ResourcePath("audio_coding/speech_mono_16kHz", "pcm");
-    audio_loop_.Init(input_file_name, 5 * kSampleRateHz, kNumSamples10ms);
-
-    // Generate one packet to have something to insert.
-    int loop_counter = 0;
-    while (packet_cb_.last_payload_len_bytes() == 0) {
-      InsertAudio();
-      ASSERT_LT(loop_counter++, 10);
-    }
-    // Set |last_packet_number_| to one less that |num_calls| so that the packet
-    // will be fetched in the next InsertPacket() call.
-    last_packet_number_ = packet_cb_.num_calls() - 1;
-
-    StartThreads();
-  }
-
-  void RegisterCodec() override {
-    static_assert(kSampleRateHz == 16000, "test designed for iSAC 16 kHz");
-    audio_format_ =
-        rtc::Optional<SdpAudioFormat>(SdpAudioFormat("isac", kSampleRateHz, 1));
-    AudioCodingModule::Codec("ISAC", &codec_, kSampleRateHz, 1);
-    codec_.pltype = kPayloadType;
-
-    // Register iSAC codec in ACM, effectively unregistering the PCM16B codec
-    // registered in AudioCodingModuleTestOldApi::SetUp();
-    EXPECT_EQ(true, acm_->RegisterReceiveCodec(kPayloadType, *audio_format_));
-    EXPECT_EQ(0, acm_->RegisterSendCodec(codec_));
-  }
-
-  void InsertPacket() override {
-    int num_calls = packet_cb_.num_calls();  // Store locally for thread safety.
-    if (num_calls > last_packet_number_) {
-      // Get the new payload out from the callback handler.
-      // Note that since we swap buffers here instead of directly inserting
-      // a pointer to the data in |packet_cb_|, we avoid locking the callback
-      // for the duration of the IncomingPacket() call.
-      packet_cb_.SwapBuffers(&last_payload_vec_);
-      ASSERT_GT(last_payload_vec_.size(), 0u);
-      rtp_utility_->Forward(&rtp_header_);
-      last_packet_number_ = num_calls;
-    }
-    ASSERT_GT(last_payload_vec_.size(), 0u);
-    ASSERT_EQ(
-        0,
-        acm_->IncomingPacket(
-            &last_payload_vec_[0], last_payload_vec_.size(), rtp_header_));
-  }
-
-  void InsertAudio() override {
-    // TODO(kwiberg): Use std::copy here. Might be complications because AFAICS
-    // this call confuses the number of samples with the number of bytes, and
-    // ends up copying only half of what it should.
-    memcpy(input_frame_.mutable_data(), audio_loop_.GetNextBlock().data(),
-           kNumSamples10ms);
-    AudioCodingModuleTestOldApi::InsertAudio();
-  }
-
-  // Override the verification function with no-op, since iSAC produces variable
-  // payload sizes.
-  void VerifyEncoding() override {}
-
-  // This method is the same as AudioCodingModuleMtTestOldApi::TestDone(), but
-  // here it is using the constants defined in this class (i.e., shorter test
-  // run).
-  bool TestDone() override {
-    if (packet_cb_.num_calls() > kNumPackets) {
-      rtc::CritScope lock(&crit_sect_);
-      if (pull_audio_count_ > kNumPullCalls) {
-        // Both conditions for completion are met. End the test.
-        return true;
-      }
-    }
-    return false;
-  }
-
-  int last_packet_number_;
-  std::vector<uint8_t> last_payload_vec_;
-  test::AudioLoop audio_loop_;
-};
-
-#if defined(WEBRTC_IOS)
-#define MAYBE_DoTest DISABLED_DoTest
-#else
-#define MAYBE_DoTest DoTest
-#endif
-#if defined(WEBRTC_CODEC_ISAC) || defined(WEBRTC_CODEC_ISACFX)
-TEST_F(AcmIsacMtTestOldApi, MAYBE_DoTest) {
-  EXPECT_EQ(kEventSignaled, RunTest());
-}
-#endif
-
-class AcmReRegisterIsacMtTestOldApi : public AudioCodingModuleTestOldApi {
- protected:
-  static const int kRegisterAfterNumPackets = 5;
-  static const int kNumPackets = 10;
-  static const int kPacketSizeMs = 30;
-  static const int kPacketSizeSamples = kPacketSizeMs * 16;
-
-  AcmReRegisterIsacMtTestOldApi()
-      : AudioCodingModuleTestOldApi(),
-        receive_thread_(CbReceiveThread, this, "receive"),
-        codec_registration_thread_(CbCodecRegistrationThread,
-                                   this,
-                                   "codec_registration"),
-        test_complete_(EventWrapper::Create()),
-        codec_registered_(false),
-        receive_packet_count_(0),
-        next_insert_packet_time_ms_(0),
-        fake_clock_(new SimulatedClock(0)) {
-    AudioEncoderIsacFloatImpl::Config config;
-    config.payload_type = kPayloadType;
-    isac_encoder_.reset(new AudioEncoderIsacFloatImpl(config));
-    clock_ = fake_clock_.get();
-  }
-
-  void SetUp() override {
-    AudioCodingModuleTestOldApi::SetUp();
-    // Set up input audio source to read from specified file, loop after 5
-    // seconds, and deliver blocks of 10 ms.
-    const std::string input_file_name =
-        webrtc::test::ResourcePath("audio_coding/speech_mono_16kHz", "pcm");
-    audio_loop_.Init(input_file_name, 5 * kSampleRateHz, kNumSamples10ms);
-    RegisterCodec();  // Must be called before the threads start below.
-    StartThreads();
-  }
-
-  void RegisterCodec() override {
-    static_assert(kSampleRateHz == 16000, "test designed for iSAC 16 kHz");
-    AudioCodingModule::Codec("ISAC", &codec_, kSampleRateHz, 1);
-    codec_.pltype = kPayloadType;
-
-    // Register iSAC codec in ACM, effectively unregistering the PCM16B codec
-    // registered in AudioCodingModuleTestOldApi::SetUp();
-    // Only register the decoder for now. The encoder is registered later.
-    ASSERT_EQ(true, acm_->RegisterReceiveCodec(codec_.pltype,
-                                               CodecInstToSdp(codec_)));
-  }
-
-  void StartThreads() {
-    receive_thread_.Start();
-    receive_thread_.SetPriority(rtc::kRealtimePriority);
-    codec_registration_thread_.Start();
-    codec_registration_thread_.SetPriority(rtc::kRealtimePriority);
-  }
-
-  void TearDown() override {
-    AudioCodingModuleTestOldApi::TearDown();
-    receive_thread_.Stop();
-    codec_registration_thread_.Stop();
-  }
-
-  EventTypeWrapper RunTest() {
-    return test_complete_->Wait(10 * 60 * 1000);  // 10 minutes' timeout.
-  }
-
-  static bool CbReceiveThread(void* context) {
-    return reinterpret_cast<AcmReRegisterIsacMtTestOldApi*>(context)
-        ->CbReceiveImpl();
-  }
-
-  bool CbReceiveImpl() {
-    SleepMs(1);
-    rtc::Buffer encoded;
-    AudioEncoder::EncodedInfo info;
-    {
-      rtc::CritScope lock(&crit_sect_);
-      if (clock_->TimeInMilliseconds() < next_insert_packet_time_ms_) {
-        return true;
-      }
-      next_insert_packet_time_ms_ += kPacketSizeMs;
-      ++receive_packet_count_;
-
-      // Encode new frame.
-      uint32_t input_timestamp = rtp_header_.header.timestamp;
-      while (info.encoded_bytes == 0) {
-        info =
-            isac_encoder_->Encode(input_timestamp, audio_loop_.GetNextBlock(),
-                                  &encoded);
-        input_timestamp += 160;  // 10 ms at 16 kHz.
-      }
-      EXPECT_EQ(rtp_header_.header.timestamp + kPacketSizeSamples,
-                input_timestamp);
-      EXPECT_EQ(rtp_header_.header.timestamp, info.encoded_timestamp);
-      EXPECT_EQ(rtp_header_.header.payloadType, info.payload_type);
-    }
-    // Now we're not holding the crit sect when calling ACM.
-
-    // Insert into ACM.
-    EXPECT_EQ(0, acm_->IncomingPacket(encoded.data(), info.encoded_bytes,
-                                      rtp_header_));
-
-    // Pull audio.
-    for (int i = 0; i < rtc::CheckedDivExact(kPacketSizeMs, 10); ++i) {
-      AudioFrame audio_frame;
-      bool muted;
-      EXPECT_EQ(0, acm_->PlayoutData10Ms(-1 /* default output frequency */,
-                                         &audio_frame, &muted));
-      if (muted) {
-        ADD_FAILURE();
-        return false;
-      }
-      fake_clock_->AdvanceTimeMilliseconds(10);
-    }
-    rtp_utility_->Forward(&rtp_header_);
-    return true;
-  }
-
-  static bool CbCodecRegistrationThread(void* context) {
-    return reinterpret_cast<AcmReRegisterIsacMtTestOldApi*>(context)
-        ->CbCodecRegistrationImpl();
-  }
-
-  bool CbCodecRegistrationImpl() {
-    SleepMs(1);
-    if (HasFatalFailure()) {
-      // End the test early if a fatal failure (ASSERT_*) has occurred.
-      test_complete_->Set();
-    }
-    rtc::CritScope lock(&crit_sect_);
-    if (!codec_registered_ &&
-        receive_packet_count_ > kRegisterAfterNumPackets) {
-      // Register the iSAC encoder.
-      EXPECT_EQ(0, acm_->RegisterSendCodec(codec_));
-      codec_registered_ = true;
-    }
-    if (codec_registered_ && receive_packet_count_ > kNumPackets) {
-      test_complete_->Set();
-    }
-    return true;
-  }
-
-  rtc::PlatformThread receive_thread_;
-  rtc::PlatformThread codec_registration_thread_;
-  const std::unique_ptr<EventWrapper> test_complete_;
-  rtc::CriticalSection crit_sect_;
-  bool codec_registered_ RTC_GUARDED_BY(crit_sect_);
-  int receive_packet_count_ RTC_GUARDED_BY(crit_sect_);
-  int64_t next_insert_packet_time_ms_ RTC_GUARDED_BY(crit_sect_);
-  std::unique_ptr<AudioEncoderIsacFloatImpl> isac_encoder_;
-  std::unique_ptr<SimulatedClock> fake_clock_;
-  test::AudioLoop audio_loop_;
-};
-
-#if defined(WEBRTC_IOS)
-#define MAYBE_DoTest DISABLED_DoTest
-#else
-#define MAYBE_DoTest DoTest
-#endif
-#if defined(WEBRTC_CODEC_ISAC) || defined(WEBRTC_CODEC_ISACFX)
-TEST_F(AcmReRegisterIsacMtTestOldApi, MAYBE_DoTest) {
-  EXPECT_EQ(kEventSignaled, RunTest());
-}
-#endif
-
-// Disabling all of these tests on iOS until file support has been added.
-// See https://code.google.com/p/webrtc/issues/detail?id=4752 for details.
-#if !defined(WEBRTC_IOS)
-
-class AcmReceiverBitExactnessOldApi : public ::testing::Test {
- public:
-  static std::string PlatformChecksum(std::string others,
-                                      std::string win64,
-                                      std::string android_arm32,
-                                      std::string android_arm64,
-                                      std::string android_arm64_clang) {
-#if defined(_WIN32) && defined(WEBRTC_ARCH_64_BITS)
-    return win64;
-#elif defined(WEBRTC_ANDROID) && defined(WEBRTC_ARCH_ARM)
-    return android_arm32;
-#elif defined(WEBRTC_ANDROID) && defined(WEBRTC_ARCH_ARM64)
-#if defined(__clang__)
-    // Android ARM64 with Clang compiler
-    return android_arm64_clang;
-#else
-    // Android ARM64 with non-Clang compiler
-    return android_arm64;
-#endif  // __clang__
-#else
-    return others;
-#endif
-  }
-
- protected:
-  struct ExternalDecoder {
-    int rtp_payload_type;
-    AudioDecoder* external_decoder;
-    int sample_rate_hz;
-    int num_channels;
-    std::string name;
-  };
-
-  void Run(int output_freq_hz, const std::string& checksum_ref) {
-    Run(output_freq_hz, checksum_ref, CreateBuiltinAudioDecoderFactory(),
-        [](AudioCodingModule*) {});
-  }
-
-  void Run(int output_freq_hz,
-           const std::string& checksum_ref,
-           rtc::scoped_refptr<AudioDecoderFactory> decoder_factory,
-           rtc::FunctionView<void(AudioCodingModule*)> decoder_reg) {
-    const std::string input_file_name =
-        webrtc::test::ResourcePath("audio_coding/neteq_universal_new", "rtp");
-    std::unique_ptr<test::RtpFileSource> packet_source(
-        test::RtpFileSource::Create(input_file_name));
-#ifdef WEBRTC_ANDROID
-    // Filter out iLBC and iSAC-swb since they are not supported on Android.
-    packet_source->FilterOutPayloadType(102);  // iLBC.
-    packet_source->FilterOutPayloadType(104);  // iSAC-swb.
-#endif
-
-    test::AudioChecksum checksum;
-    const std::string output_file_name =
-        webrtc::test::OutputPath() +
-        ::testing::UnitTest::GetInstance()
-            ->current_test_info()
-            ->test_case_name() +
-        "_" + ::testing::UnitTest::GetInstance()->current_test_info()->name() +
-        "_output.wav";
-    test::OutputWavFile output_file(output_file_name, output_freq_hz);
-    test::AudioSinkFork output(&checksum, &output_file);
-
-    test::AcmReceiveTestOldApi test(
-        packet_source.get(), &output, output_freq_hz,
-        test::AcmReceiveTestOldApi::kArbitraryChannels,
-        std::move(decoder_factory));
-    ASSERT_NO_FATAL_FAILURE(test.RegisterNetEqTestCodecs());
-    decoder_reg(test.get_acm());
-    test.Run();
-
-    std::string checksum_string = checksum.Finish();
-    EXPECT_EQ(checksum_ref, checksum_string);
-
-    // Delete the output file.
-    remove(output_file_name.c_str());
-  }
-};
-
-#if (defined(WEBRTC_CODEC_ISAC) || defined(WEBRTC_CODEC_ISACFX)) && \
-    defined(WEBRTC_CODEC_ILBC) && defined(WEBRTC_CODEC_G722)
-TEST_F(AcmReceiverBitExactnessOldApi, 8kHzOutput) {
-  Run(8000, PlatformChecksum("2adede965c6f87de7142c51552111d08",
-                             "028c0fc414b1c9ab7e582dccdf381e98",
-                             "36c95170c1393d4b765d1c17b61ef977",
-                             "4598140b5e4f7ee66c5adad609e65a3e",
-                             "bac5db6dff44323be401060f1279a532"));
-}
-
-TEST_F(AcmReceiverBitExactnessOldApi, 16kHzOutput) {
-  Run(16000, PlatformChecksum("c2550a3db7632de409e8db0093df1c12",
-                              "edd31f4b6665cd5b9041fb93f2316594",
-                              "22128bca51650cb61c80bed63b595603",
-                              "f2aad418af974a3b1694d5ae5cc2c3c7",
-                              "61c3cb9386b9503feebcb829c9be54bd"));
-}
-
-TEST_F(AcmReceiverBitExactnessOldApi, 32kHzOutput) {
-  Run(32000, PlatformChecksum("85e28d7950132d56f90b099c90f82153",
-                              "7b903f5c89997f271b405e63c245ef45",
-                              "8b8fc6c6fd1dcdcfb3dd90e1ce597f10",
-                              "100869c8dcde51346c2073e52a272d98",
-                              "fdec5301dc649a47d407382b587e14da"));
-}
-
-TEST_F(AcmReceiverBitExactnessOldApi, 48kHzOutput) {
-  Run(48000, PlatformChecksum("ab611510e8fd6d5210a23cc04d3f0e8e",
-                              "d8609bc9b495d81f29779344c68bcc47",
-                              "ec5ebb90cda0ea5bb89e79d698af65de",
-                              "bd44bf97e7899186532f91235cef444d",
-                              "0baae2972cca142027d4af44f95f0bd5"));
-}
-
-TEST_F(AcmReceiverBitExactnessOldApi, 48kHzOutputExternalDecoder) {
-  class ADFactory : public AudioDecoderFactory {
-   public:
-    ADFactory()
-        : mock_decoder_(new MockAudioDecoder()),
-          pcmu_decoder_(1),
-          decode_forwarder_(&pcmu_decoder_),
-          fact_(CreateBuiltinAudioDecoderFactory()) {
-      // Set expectations on the mock decoder and also delegate the calls to
-      // the real decoder.
-      EXPECT_CALL(*mock_decoder_, IncomingPacket(_, _, _, _, _))
-          .Times(AtLeast(1))
-          .WillRepeatedly(
-              Invoke(&pcmu_decoder_, &AudioDecoderPcmU::IncomingPacket));
-      EXPECT_CALL(*mock_decoder_, SampleRateHz())
-          .Times(AtLeast(1))
-          .WillRepeatedly(
-              Invoke(&pcmu_decoder_, &AudioDecoderPcmU::SampleRateHz));
-      EXPECT_CALL(*mock_decoder_, Channels())
-          .Times(AtLeast(1))
-          .WillRepeatedly(Invoke(&pcmu_decoder_, &AudioDecoderPcmU::Channels));
-      EXPECT_CALL(*mock_decoder_, DecodeInternal(_, _, _, _, _))
-          .Times(AtLeast(1))
-          .WillRepeatedly(Invoke(&decode_forwarder_, &DecodeForwarder::Decode));
-      EXPECT_CALL(*mock_decoder_, HasDecodePlc())
-          .Times(AtLeast(1))
-          .WillRepeatedly(
-              Invoke(&pcmu_decoder_, &AudioDecoderPcmU::HasDecodePlc));
-      EXPECT_CALL(*mock_decoder_, PacketDuration(_, _))
-          .Times(AtLeast(1))
-          .WillRepeatedly(
-              Invoke(&pcmu_decoder_, &AudioDecoderPcmU::PacketDuration));
-      EXPECT_CALL(*mock_decoder_, Die());
-    }
-    std::vector<AudioCodecSpec> GetSupportedDecoders() override {
-      return fact_->GetSupportedDecoders();
-    }
-    bool IsSupportedDecoder(const SdpAudioFormat& format) override {
-      return format.name == "MockPCMu" ? true
-                                       : fact_->IsSupportedDecoder(format);
-    }
-    std::unique_ptr<AudioDecoder> MakeAudioDecoder(
-        const SdpAudioFormat& format) override {
-      return format.name == "MockPCMu" ? std::move(mock_decoder_)
-                                       : fact_->MakeAudioDecoder(format);
-    }
-
-   private:
-    // Class intended to forward a call from a mock DecodeInternal to Decode on
-    // the real decoder's Decode. DecodeInternal for the real decoder isn't
-    // public.
-    class DecodeForwarder {
-     public:
-      explicit DecodeForwarder(AudioDecoder* decoder) : decoder_(decoder) {}
-      int Decode(const uint8_t* encoded,
-                 size_t encoded_len,
-                 int sample_rate_hz,
-                 int16_t* decoded,
-                 AudioDecoder::SpeechType* speech_type) {
-        return decoder_->Decode(encoded, encoded_len, sample_rate_hz,
-                                decoder_->PacketDuration(encoded, encoded_len) *
-                                    decoder_->Channels() * sizeof(int16_t),
-                                decoded, speech_type);
-      }
-
-     private:
-      AudioDecoder* const decoder_;
-    };
-
-    std::unique_ptr<MockAudioDecoder> mock_decoder_;
-    AudioDecoderPcmU pcmu_decoder_;
-    DecodeForwarder decode_forwarder_;
-    rtc::scoped_refptr<AudioDecoderFactory> fact_;  // Fallback factory.
-  };
-
-  rtc::scoped_refptr<rtc::RefCountedObject<ADFactory>> factory(
-      new rtc::RefCountedObject<ADFactory>);
-  Run(48000, PlatformChecksum("ab611510e8fd6d5210a23cc04d3f0e8e",
-                              "d8609bc9b495d81f29779344c68bcc47",
-                              "ec5ebb90cda0ea5bb89e79d698af65de",
-                              "bd44bf97e7899186532f91235cef444d",
-                              "0baae2972cca142027d4af44f95f0bd5"),
-      factory, [](AudioCodingModule* acm) {
-        acm->RegisterReceiveCodec(0, {"MockPCMu", 8000, 1});
-      });
-}
-#endif
-
-// This test verifies bit exactness for the send-side of ACM. The test setup is
-// a chain of three different test classes:
-//
-// test::AcmSendTest -> AcmSenderBitExactness -> test::AcmReceiveTest
-//
-// The receiver side is driving the test by requesting new packets from
-// AcmSenderBitExactness::NextPacket(). This method, in turn, asks for the
-// packet from test::AcmSendTest::NextPacket, which inserts audio from the
-// input file until one packet is produced. (The input file loops indefinitely.)
-// Before passing the packet to the receiver, this test class verifies the
-// packet header and updates a payload checksum with the new payload. The
-// decoded output from the receiver is also verified with a (separate) checksum.
-class AcmSenderBitExactnessOldApi : public ::testing::Test,
-                                    public test::PacketSource {
- protected:
-  static const int kTestDurationMs = 1000;
-
-  AcmSenderBitExactnessOldApi()
-      : frame_size_rtp_timestamps_(0),
-        packet_count_(0),
-        payload_type_(0),
-        last_sequence_number_(0),
-        last_timestamp_(0) {}
-
-  // Sets up the test::AcmSendTest object. Returns true on success, otherwise
-  // false.
-  bool SetUpSender() {
-    const std::string input_file_name =
-        webrtc::test::ResourcePath("audio_coding/testfile32kHz", "pcm");
-    // Note that |audio_source_| will loop forever. The test duration is set
-    // explicitly by |kTestDurationMs|.
-    audio_source_.reset(new test::InputAudioFile(input_file_name));
-    static const int kSourceRateHz = 32000;
-    send_test_.reset(new test::AcmSendTestOldApi(
-        audio_source_.get(), kSourceRateHz, kTestDurationMs));
-    return send_test_.get() != NULL;
-  }
-
-  // Registers a send codec in the test::AcmSendTest object. Returns true on
-  // success, false on failure.
-  bool RegisterSendCodec(const char* payload_name,
-                         int sampling_freq_hz,
-                         int channels,
-                         int payload_type,
-                         int frame_size_samples,
-                         int frame_size_rtp_timestamps) {
-    payload_type_ = payload_type;
-    frame_size_rtp_timestamps_ = frame_size_rtp_timestamps;
-    return send_test_->RegisterCodec(payload_name,
-                                     sampling_freq_hz,
-                                     channels,
-                                     payload_type,
-                                     frame_size_samples);
-  }
-
-  bool RegisterExternalSendCodec(AudioEncoder* external_speech_encoder,
-                                 int payload_type) {
-    payload_type_ = payload_type;
-    frame_size_rtp_timestamps_ =
-        external_speech_encoder->Num10MsFramesInNextPacket() *
-        external_speech_encoder->RtpTimestampRateHz() / 100;
-    return send_test_->RegisterExternalCodec(external_speech_encoder);
-  }
-
-  // Runs the test. SetUpSender() and RegisterSendCodec() must have been called
-  // before calling this method.
-  void Run(const std::string& audio_checksum_ref,
-           const std::string& payload_checksum_ref,
-           int expected_packets,
-           test::AcmReceiveTestOldApi::NumOutputChannels expected_channels) {
-    // Set up the receiver used to decode the packets and verify the decoded
-    // output.
-    test::AudioChecksum audio_checksum;
-    const std::string output_file_name =
-        webrtc::test::OutputPath() +
-        ::testing::UnitTest::GetInstance()
-            ->current_test_info()
-            ->test_case_name() +
-        "_" + ::testing::UnitTest::GetInstance()->current_test_info()->name() +
-        "_output.wav";
-    const int kOutputFreqHz = 8000;
-    test::OutputWavFile output_file(output_file_name, kOutputFreqHz);
-    // Have the output audio sent both to file and to the checksum calculator.
-    test::AudioSinkFork output(&audio_checksum, &output_file);
-    test::AcmReceiveTestOldApi receive_test(this, &output, kOutputFreqHz,
-                                            expected_channels,
-                                            CreateBuiltinAudioDecoderFactory());
-    ASSERT_NO_FATAL_FAILURE(receive_test.RegisterDefaultCodecs());
-
-    // This is where the actual test is executed.
-    receive_test.Run();
-
-    // Extract and verify the audio checksum.
-    std::string checksum_string = audio_checksum.Finish();
-    EXPECT_EQ(audio_checksum_ref, checksum_string);
-
-    // Extract and verify the payload checksum.
-    char checksum_result[rtc::Md5Digest::kSize];
-    payload_checksum_.Finish(checksum_result, rtc::Md5Digest::kSize);
-    checksum_string = rtc::hex_encode(checksum_result, rtc::Md5Digest::kSize);
-    EXPECT_EQ(payload_checksum_ref, checksum_string);
-
-    // Verify number of packets produced.
-    EXPECT_EQ(expected_packets, packet_count_);
-
-    // Delete the output file.
-    remove(output_file_name.c_str());
-  }
-
-  // Inherited from test::PacketSource.
-  std::unique_ptr<test::Packet> NextPacket() override {
-    auto packet = send_test_->NextPacket();
-    if (!packet)
-      return NULL;
-
-    VerifyPacket(packet.get());
-    // TODO(henrik.lundin) Save the packet to file as well.
-
-    // Pass it on to the caller. The caller becomes the owner of |packet|.
-    return packet;
-  }
-
-  // Verifies the packet.
-  void VerifyPacket(const test::Packet* packet) {
-    EXPECT_TRUE(packet->valid_header());
-    // (We can check the header fields even if valid_header() is false.)
-    EXPECT_EQ(payload_type_, packet->header().payloadType);
-    if (packet_count_ > 0) {
-      // This is not the first packet.
-      uint16_t sequence_number_diff =
-          packet->header().sequenceNumber - last_sequence_number_;
-      EXPECT_EQ(1, sequence_number_diff);
-      uint32_t timestamp_diff = packet->header().timestamp - last_timestamp_;
-      EXPECT_EQ(frame_size_rtp_timestamps_, timestamp_diff);
-    }
-    ++packet_count_;
-    last_sequence_number_ = packet->header().sequenceNumber;
-    last_timestamp_ = packet->header().timestamp;
-    // Update the checksum.
-    payload_checksum_.Update(packet->payload(), packet->payload_length_bytes());
-  }
-
-  void SetUpTest(const char* codec_name,
-                 int codec_sample_rate_hz,
-                 int channels,
-                 int payload_type,
-                 int codec_frame_size_samples,
-                 int codec_frame_size_rtp_timestamps) {
-    ASSERT_TRUE(SetUpSender());
-    ASSERT_TRUE(RegisterSendCodec(codec_name,
-                                  codec_sample_rate_hz,
-                                  channels,
-                                  payload_type,
-                                  codec_frame_size_samples,
-                                  codec_frame_size_rtp_timestamps));
-  }
-
-  void SetUpTestExternalEncoder(AudioEncoder* external_speech_encoder,
-                                int payload_type) {
-    ASSERT_TRUE(SetUpSender());
-    ASSERT_TRUE(
-        RegisterExternalSendCodec(external_speech_encoder, payload_type));
-  }
-
-  std::unique_ptr<test::AcmSendTestOldApi> send_test_;
-  std::unique_ptr<test::InputAudioFile> audio_source_;
-  uint32_t frame_size_rtp_timestamps_;
-  int packet_count_;
-  uint8_t payload_type_;
-  uint16_t last_sequence_number_;
-  uint32_t last_timestamp_;
-  rtc::Md5Digest payload_checksum_;
-};
-
-class AcmSenderBitExactnessNewApi : public AcmSenderBitExactnessOldApi {};
-
-#if defined(WEBRTC_CODEC_ISAC) || defined(WEBRTC_CODEC_ISACFX)
-TEST_F(AcmSenderBitExactnessOldApi, IsacWb30ms) {
-  ASSERT_NO_FATAL_FAILURE(SetUpTest("ISAC", 16000, 1, 103, 480, 480));
-  Run(AcmReceiverBitExactnessOldApi::PlatformChecksum(
-          "2c9cb15d4ed55b5a0cadd04883bc73b0",
-          "9336a9b993cbd8a751f0e8958e66c89c",
-          "bd4682225f7c4ad5f2049f6769713ac2",
-          "343f1f42be0607c61e6516aece424609",
-          "2c9cb15d4ed55b5a0cadd04883bc73b0"),
-      AcmReceiverBitExactnessOldApi::PlatformChecksum(
-          "3c79f16f34218271f3dca4e2b1dfe1bb",
-          "d42cb5195463da26c8129bbfe73a22e6",
-          "83de248aea9c3c2bd680b6952401b4ca",
-          "3c79f16f34218271f3dca4e2b1dfe1bb",
-          "3c79f16f34218271f3dca4e2b1dfe1bb"),
-      33, test::AcmReceiveTestOldApi::kMonoOutput);
-}
-
-TEST_F(AcmSenderBitExactnessOldApi, IsacWb60ms) {
-  ASSERT_NO_FATAL_FAILURE(SetUpTest("ISAC", 16000, 1, 103, 960, 960));
-  Run(AcmReceiverBitExactnessOldApi::PlatformChecksum(
-          "1ad29139a04782a33daad8c2b9b35875",
-          "14d63c5f08127d280e722e3191b73bdd",
-          "edcf26694c289e3d9691faf79b74f09f",
-          "ef75e900e6f375e3061163c53fd09a63",
-          "1ad29139a04782a33daad8c2b9b35875"),
-      AcmReceiverBitExactnessOldApi::PlatformChecksum(
-          "9e0a0ab743ad987b55b8e14802769c56",
-          "ebe04a819d3a9d83a83a17f271e1139a",
-          "97aeef98553b5a4b5a68f8b716e8eaf0",
-          "9e0a0ab743ad987b55b8e14802769c56",
-          "9e0a0ab743ad987b55b8e14802769c56"),
-      16, test::AcmReceiveTestOldApi::kMonoOutput);
-}
-#endif
-
-#if defined(WEBRTC_ANDROID)
-#define MAYBE_IsacSwb30ms DISABLED_IsacSwb30ms
-#else
-#define MAYBE_IsacSwb30ms IsacSwb30ms
-#endif
-#if defined(WEBRTC_CODEC_ISAC)
-TEST_F(AcmSenderBitExactnessOldApi, MAYBE_IsacSwb30ms) {
-  ASSERT_NO_FATAL_FAILURE(SetUpTest("ISAC", 32000, 1, 104, 960, 960));
-  Run(AcmReceiverBitExactnessOldApi::PlatformChecksum(
-          "5683b58da0fbf2063c7adc2e6bfb3fb8",
-          "2b3c387d06f00b7b7aad4c9be56fb83d", "android_arm32_audio",
-          "android_arm64_audio", "android_arm64_clang_audio"),
-      AcmReceiverBitExactnessOldApi::PlatformChecksum(
-          "ce86106a93419aefb063097108ec94ab",
-          "bcc2041e7744c7ebd9f701866856849c", "android_arm32_payload",
-          "android_arm64_payload", "android_arm64_clang_payload"),
-      33, test::AcmReceiveTestOldApi::kMonoOutput);
-}
-#endif
-
-TEST_F(AcmSenderBitExactnessOldApi, Pcm16_8000khz_10ms) {
-  ASSERT_NO_FATAL_FAILURE(SetUpTest("L16", 8000, 1, 107, 80, 80));
-  Run("de4a98e1406f8b798d99cd0704e862e2",
-      "c1edd36339ce0326cc4550041ad719a0",
-      100,
-      test::AcmReceiveTestOldApi::kMonoOutput);
-}
-
-TEST_F(AcmSenderBitExactnessOldApi, Pcm16_16000khz_10ms) {
-  ASSERT_NO_FATAL_FAILURE(SetUpTest("L16", 16000, 1, 108, 160, 160));
-  Run("ae646d7b68384a1269cc080dd4501916",
-      "ad786526383178b08d80d6eee06e9bad",
-      100,
-      test::AcmReceiveTestOldApi::kMonoOutput);
-}
-
-TEST_F(AcmSenderBitExactnessOldApi, Pcm16_32000khz_10ms) {
-  ASSERT_NO_FATAL_FAILURE(SetUpTest("L16", 32000, 1, 109, 320, 320));
-  Run("7fe325e8fbaf755e3c5df0b11a4774fb",
-      "5ef82ea885e922263606c6fdbc49f651",
-      100,
-      test::AcmReceiveTestOldApi::kMonoOutput);
-}
-
-TEST_F(AcmSenderBitExactnessOldApi, Pcm16_stereo_8000khz_10ms) {
-  ASSERT_NO_FATAL_FAILURE(SetUpTest("L16", 8000, 2, 111, 80, 80));
-  Run("fb263b74e7ac3de915474d77e4744ceb",
-      "62ce5adb0d4965d0a52ec98ae7f98974",
-      100,
-      test::AcmReceiveTestOldApi::kStereoOutput);
-}
-
-TEST_F(AcmSenderBitExactnessOldApi, Pcm16_stereo_16000khz_10ms) {
-  ASSERT_NO_FATAL_FAILURE(SetUpTest("L16", 16000, 2, 112, 160, 160));
-  Run("d09e9239553649d7ac93e19d304281fd",
-      "41ca8edac4b8c71cd54fd9f25ec14870",
-      100,
-      test::AcmReceiveTestOldApi::kStereoOutput);
-}
-
-TEST_F(AcmSenderBitExactnessOldApi, Pcm16_stereo_32000khz_10ms) {
-  ASSERT_NO_FATAL_FAILURE(SetUpTest("L16", 32000, 2, 113, 320, 320));
-  Run("5f025d4f390982cc26b3d92fe02e3044",
-      "50e58502fb04421bf5b857dda4c96879",
-      100,
-      test::AcmReceiveTestOldApi::kStereoOutput);
-}
-
-TEST_F(AcmSenderBitExactnessOldApi, Pcmu_20ms) {
-  ASSERT_NO_FATAL_FAILURE(SetUpTest("PCMU", 8000, 1, 0, 160, 160));
-  Run("81a9d4c0bb72e9becc43aef124c981e9",
-      "8f9b8750bd80fe26b6cbf6659b89f0f9",
-      50,
-      test::AcmReceiveTestOldApi::kMonoOutput);
-}
-
-TEST_F(AcmSenderBitExactnessOldApi, Pcma_20ms) {
-  ASSERT_NO_FATAL_FAILURE(SetUpTest("PCMA", 8000, 1, 8, 160, 160));
-  Run("39611f798969053925a49dc06d08de29",
-      "6ad745e55aa48981bfc790d0eeef2dd1",
-      50,
-      test::AcmReceiveTestOldApi::kMonoOutput);
-}
-
-TEST_F(AcmSenderBitExactnessOldApi, Pcmu_stereo_20ms) {
-  ASSERT_NO_FATAL_FAILURE(SetUpTest("PCMU", 8000, 2, 110, 160, 160));
-  Run("437bec032fdc5cbaa0d5175430af7b18",
-      "60b6f25e8d1e74cb679cfe756dd9bca5",
-      50,
-      test::AcmReceiveTestOldApi::kStereoOutput);
-}
-
-TEST_F(AcmSenderBitExactnessOldApi, Pcma_stereo_20ms) {
-  ASSERT_NO_FATAL_FAILURE(SetUpTest("PCMA", 8000, 2, 118, 160, 160));
-  Run("a5c6d83c5b7cedbeff734238220a4b0c",
-      "92b282c83efd20e7eeef52ba40842cf7",
-      50,
-      test::AcmReceiveTestOldApi::kStereoOutput);
-}
-
-#if defined(WEBRTC_ANDROID)
-#define MAYBE_Ilbc_30ms DISABLED_Ilbc_30ms
-#else
-#define MAYBE_Ilbc_30ms Ilbc_30ms
-#endif
-#if defined(WEBRTC_CODEC_ILBC)
-TEST_F(AcmSenderBitExactnessOldApi, MAYBE_Ilbc_30ms) {
-  ASSERT_NO_FATAL_FAILURE(SetUpTest("ILBC", 8000, 1, 102, 240, 240));
-  Run(AcmReceiverBitExactnessOldApi::PlatformChecksum(
-          "7b6ec10910debd9af08011d3ed5249f7",
-          "7b6ec10910debd9af08011d3ed5249f7", "android_arm32_audio",
-          "android_arm64_audio", "android_arm64_clang_audio"),
-      AcmReceiverBitExactnessOldApi::PlatformChecksum(
-          "cfae2e9f6aba96e145f2bcdd5050ce78",
-          "cfae2e9f6aba96e145f2bcdd5050ce78", "android_arm32_payload",
-          "android_arm64_payload", "android_arm64_clang_payload"),
-      33, test::AcmReceiveTestOldApi::kMonoOutput);
-}
-#endif
-
-#if defined(WEBRTC_ANDROID)
-#define MAYBE_G722_20ms DISABLED_G722_20ms
-#else
-#define MAYBE_G722_20ms G722_20ms
-#endif
-#if defined(WEBRTC_CODEC_G722)
-TEST_F(AcmSenderBitExactnessOldApi, MAYBE_G722_20ms) {
-  ASSERT_NO_FATAL_FAILURE(SetUpTest("G722", 16000, 1, 9, 320, 160));
-  Run(AcmReceiverBitExactnessOldApi::PlatformChecksum(
-          "e99c89be49a46325d03c0d990c292d68",
-          "e99c89be49a46325d03c0d990c292d68", "android_arm32_audio",
-          "android_arm64_audio", "android_arm64_clang_audio"),
-      AcmReceiverBitExactnessOldApi::PlatformChecksum(
-          "fc68a87e1380614e658087cb35d5ca10",
-          "fc68a87e1380614e658087cb35d5ca10", "android_arm32_payload",
-          "android_arm64_payload", "android_arm64_clang_payload"),
-      50, test::AcmReceiveTestOldApi::kMonoOutput);
-}
-#endif
-
-#if defined(WEBRTC_ANDROID)
-#define MAYBE_G722_stereo_20ms DISABLED_G722_stereo_20ms
-#else
-#define MAYBE_G722_stereo_20ms G722_stereo_20ms
-#endif
-#if defined(WEBRTC_CODEC_G722)
-TEST_F(AcmSenderBitExactnessOldApi, MAYBE_G722_stereo_20ms) {
-  ASSERT_NO_FATAL_FAILURE(SetUpTest("G722", 16000, 2, 119, 320, 160));
-  Run(AcmReceiverBitExactnessOldApi::PlatformChecksum(
-          "e280aed283e499d37091b481ca094807",
-          "e280aed283e499d37091b481ca094807", "android_arm32_audio",
-          "android_arm64_audio", "android_arm64_clang_audio"),
-      AcmReceiverBitExactnessOldApi::PlatformChecksum(
-          "66516152eeaa1e650ad94ff85f668dac",
-          "66516152eeaa1e650ad94ff85f668dac", "android_arm32_payload",
-          "android_arm64_payload", "android_arm64_clang_payload"),
-      50, test::AcmReceiveTestOldApi::kStereoOutput);
-}
-#endif
-
-TEST_F(AcmSenderBitExactnessOldApi, Opus_stereo_20ms) {
-  ASSERT_NO_FATAL_FAILURE(SetUpTest("opus", 48000, 2, 120, 960, 960));
-  Run(AcmReceiverBitExactnessOldApi::PlatformChecksum(
-          "3e285b74510e62062fbd8142dacd16e9",
-          "3e285b74510e62062fbd8142dacd16e9",
-          "439e97ad1932c49923b5da029c17dd5e",
-          "038ec90f5f3fc2320f3090f8ecef6bb7",
-          "038ec90f5f3fc2320f3090f8ecef6bb7"),
-      AcmReceiverBitExactnessOldApi::PlatformChecksum(
-          "78cf8f03157358acdc69f6835caa0d9b",
-          "78cf8f03157358acdc69f6835caa0d9b",
-          "ab88b1a049c36bdfeb7e8b057ef6982a",
-          "27fef7b799393347ec3b5694369a1c36",
-          "27fef7b799393347ec3b5694369a1c36"),
-      50, test::AcmReceiveTestOldApi::kStereoOutput);
-}
-
-TEST_F(AcmSenderBitExactnessNewApi, MAYBE_OpusFromFormat_stereo_20ms) {
-  const SdpAudioFormat kOpusFormat("opus", 48000, 2, {{"stereo", "1"}});
-  AudioEncoderOpus encoder(120, kOpusFormat);
-  ASSERT_NO_FATAL_FAILURE(SetUpTestExternalEncoder(&encoder, 120));
-  Run(AcmReceiverBitExactnessOldApi::PlatformChecksum(
-          "3e285b74510e62062fbd8142dacd16e9",
-          "3e285b74510e62062fbd8142dacd16e9",
-          "439e97ad1932c49923b5da029c17dd5e",
-          "038ec90f5f3fc2320f3090f8ecef6bb7",
-          "038ec90f5f3fc2320f3090f8ecef6bb7"),
-      AcmReceiverBitExactnessOldApi::PlatformChecksum(
-          "78cf8f03157358acdc69f6835caa0d9b",
-          "78cf8f03157358acdc69f6835caa0d9b",
-          "ab88b1a049c36bdfeb7e8b057ef6982a",
-          "27fef7b799393347ec3b5694369a1c36",
-          "27fef7b799393347ec3b5694369a1c36"),
-      50, test::AcmReceiveTestOldApi::kStereoOutput);
-}
-
-TEST_F(AcmSenderBitExactnessOldApi, Opus_stereo_20ms_voip) {
-  ASSERT_NO_FATAL_FAILURE(SetUpTest("opus", 48000, 2, 120, 960, 960));
-  // If not set, default will be kAudio in case of stereo.
-  EXPECT_EQ(0, send_test_->acm()->SetOpusApplication(kVoip));
-  Run(AcmReceiverBitExactnessOldApi::PlatformChecksum(
-          "b0325df4e8104f04e03af23c0b75800e",
-          "b0325df4e8104f04e03af23c0b75800e",
-          "1c81121f5d9286a5a865d01dbab22ce8",
-          "11d547f89142e9ef03f37d7ca7f32379",
-          "11d547f89142e9ef03f37d7ca7f32379"),
-      AcmReceiverBitExactnessOldApi::PlatformChecksum(
-          "4eab2259b6fe24c22dd242a113e0b3d9",
-          "4eab2259b6fe24c22dd242a113e0b3d9",
-          "839ea60399447268ee0f0262a50b75fd",
-          "1815fd5589cad0c6f6cf946c76b81aeb",
-          "1815fd5589cad0c6f6cf946c76b81aeb"),
-      50, test::AcmReceiveTestOldApi::kStereoOutput);
-}
-
-TEST_F(AcmSenderBitExactnessNewApi, OpusFromFormat_stereo_20ms_voip) {
-  const SdpAudioFormat kOpusFormat("opus", 48000, 2, {{"stereo", "1"}});
-  AudioEncoderOpus encoder(120, kOpusFormat);
-  ASSERT_NO_FATAL_FAILURE(SetUpTestExternalEncoder(&encoder, 120));
-  // If not set, default will be kAudio in case of stereo.
-  EXPECT_EQ(0, send_test_->acm()->SetOpusApplication(kVoip));
-  Run(AcmReceiverBitExactnessOldApi::PlatformChecksum(
-          "b0325df4e8104f04e03af23c0b75800e",
-          "b0325df4e8104f04e03af23c0b75800e",
-          "1c81121f5d9286a5a865d01dbab22ce8",
-          "11d547f89142e9ef03f37d7ca7f32379",
-          "11d547f89142e9ef03f37d7ca7f32379"),
-      AcmReceiverBitExactnessOldApi::PlatformChecksum(
-          "4eab2259b6fe24c22dd242a113e0b3d9",
-          "4eab2259b6fe24c22dd242a113e0b3d9",
-          "839ea60399447268ee0f0262a50b75fd",
-          "1815fd5589cad0c6f6cf946c76b81aeb",
-          "1815fd5589cad0c6f6cf946c76b81aeb"),
-      50, test::AcmReceiveTestOldApi::kStereoOutput);
-}
-
-// This test is for verifying the SetBitRate function. The bitrate is changed at
-// the beginning, and the number of generated bytes are checked.
-class AcmSetBitRateTest : public ::testing::Test {
- protected:
-  static const int kTestDurationMs = 1000;
-
-  // Sets up the test::AcmSendTest object. Returns true on success, otherwise
-  // false.
-  bool SetUpSender() {
-    const std::string input_file_name =
-        webrtc::test::ResourcePath("audio_coding/testfile32kHz", "pcm");
-    // Note that |audio_source_| will loop forever. The test duration is set
-    // explicitly by |kTestDurationMs|.
-    audio_source_.reset(new test::InputAudioFile(input_file_name));
-    static const int kSourceRateHz = 32000;
-    send_test_.reset(new test::AcmSendTestOldApi(
-        audio_source_.get(), kSourceRateHz, kTestDurationMs));
-    return send_test_.get();
-  }
-
-  // Registers a send codec in the test::AcmSendTest object. Returns true on
-  // success, false on failure.
-  virtual bool RegisterSendCodec(const char* payload_name,
-                                 int sampling_freq_hz,
-                                 int channels,
-                                 int payload_type,
-                                 int frame_size_samples,
-                                 int frame_size_rtp_timestamps) {
-    return send_test_->RegisterCodec(payload_name, sampling_freq_hz, channels,
-                                     payload_type, frame_size_samples);
-  }
-
-  bool RegisterExternalSendCodec(AudioEncoder* external_speech_encoder,
-                                 int payload_type) {
-    return send_test_->RegisterExternalCodec(external_speech_encoder);
-  }
-
-  void RunInner(int expected_total_bits) {
-    int nr_bytes = 0;
-    while (std::unique_ptr<test::Packet> next_packet =
-               send_test_->NextPacket()) {
-      nr_bytes += next_packet->payload_length_bytes();
-    }
-    EXPECT_EQ(expected_total_bits, nr_bytes * 8);
-  }
-
-  void SetUpTest(const char* codec_name,
-                 int codec_sample_rate_hz,
-                 int channels,
-                 int payload_type,
-                 int codec_frame_size_samples,
-                 int codec_frame_size_rtp_timestamps) {
-    ASSERT_TRUE(SetUpSender());
-    ASSERT_TRUE(RegisterSendCodec(codec_name, codec_sample_rate_hz, channels,
-                                  payload_type, codec_frame_size_samples,
-                                  codec_frame_size_rtp_timestamps));
-  }
-
-  std::unique_ptr<test::AcmSendTestOldApi> send_test_;
-  std::unique_ptr<test::InputAudioFile> audio_source_;
-};
-
-class AcmSetBitRateOldApi : public AcmSetBitRateTest {
- protected:
-  // Runs the test. SetUpSender() must have been called and a codec must be set
-  // up before calling this method.
-  void Run(int target_bitrate_bps, int expected_total_bits) {
-    ASSERT_TRUE(send_test_->acm());
-    send_test_->acm()->SetBitRate(target_bitrate_bps);
-    RunInner(expected_total_bits);
-  }
-};
-
-class AcmSetBitRateNewApi : public AcmSetBitRateTest {
- protected:
-  // Runs the test. SetUpSender() must have been called and a codec must be set
-  // up before calling this method.
-  void Run(int expected_total_bits) { RunInner(expected_total_bits); }
-};
-
-TEST_F(AcmSetBitRateOldApi, Opus_48khz_20ms_10kbps) {
-  ASSERT_NO_FATAL_FAILURE(SetUpTest("opus", 48000, 1, 107, 960, 960));
-#if defined(WEBRTC_ANDROID)
-  Run(10000, 8640);
-#else
-  Run(10000, 8680);
-#endif  // WEBRTC_ANDROID
-}
-
-TEST_F(AcmSetBitRateNewApi, OpusFromFormat_48khz_20ms_10kbps) {
-  AudioEncoderOpus encoder(
-      107, SdpAudioFormat("opus", 48000, 2, {{"maxaveragebitrate", "10000"}}));
-  ASSERT_TRUE(SetUpSender());
-  ASSERT_TRUE(RegisterExternalSendCodec(&encoder, 107));
-#if defined(WEBRTC_ANDROID)
-  RunInner(8640);
-#else
-  RunInner(8680);
-#endif  // WEBRTC_ANDROID
-}
-
-TEST_F(AcmSetBitRateOldApi, Opus_48khz_20ms_50kbps) {
-  ASSERT_NO_FATAL_FAILURE(SetUpTest("opus", 48000, 1, 107, 960, 960));
-#if defined(WEBRTC_ANDROID)
-  Run(50000, 45792);
-#else
-  Run(50000, 45520);
-#endif  // WEBRTC_ANDROID
-}
-
-TEST_F(AcmSetBitRateNewApi, OpusFromFormat_48khz_20ms_50kbps) {
-  AudioEncoderOpus encoder(
-      107, SdpAudioFormat("opus", 48000, 2, {{"maxaveragebitrate", "50000"}}));
-  ASSERT_TRUE(SetUpSender());
-  ASSERT_TRUE(RegisterExternalSendCodec(&encoder, 107));
-#if defined(WEBRTC_ANDROID)
-  RunInner(45792);
-#else
-  RunInner(45520);
-#endif  // WEBRTC_ANDROID
-}
-
-// The result on the Android platforms is inconsistent for this test case.
-// On android_rel the result is different from android and android arm64 rel.
-#if defined(WEBRTC_ANDROID)
-#define MAYBE_Opus_48khz_20ms_100kbps DISABLED_Opus_48khz_20ms_100kbps
-#define MAYBE_OpusFromFormat_48khz_20ms_100kbps \
-  DISABLED_OpusFromFormat_48khz_20ms_100kbps
-#else
-#define MAYBE_Opus_48khz_20ms_100kbps Opus_48khz_20ms_100kbps
-#define MAYBE_OpusFromFormat_48khz_20ms_100kbps \
-  OpusFromFormat_48khz_20ms_100kbps
-#endif
-TEST_F(AcmSetBitRateOldApi, MAYBE_Opus_48khz_20ms_100kbps) {
-  ASSERT_NO_FATAL_FAILURE(SetUpTest("opus", 48000, 1, 107, 960, 960));
-  Run(100000, 100832);
-}
-
-TEST_F(AcmSetBitRateNewApi, MAYBE_OpusFromFormat_48khz_20ms_100kbps) {
-  AudioEncoderOpus encoder(
-      107, SdpAudioFormat("opus", 48000, 2, {{"maxaveragebitrate", "100000"}}));
-  ASSERT_TRUE(SetUpSender());
-  ASSERT_TRUE(RegisterExternalSendCodec(&encoder, 107));
-  RunInner(100832);
-}
-
-// These next 2 tests ensure that the SetBitRate function has no effect on PCM
-TEST_F(AcmSetBitRateOldApi, Pcm16_8khz_10ms_8kbps) {
-  ASSERT_NO_FATAL_FAILURE(SetUpTest("L16", 8000, 1, 107, 80, 80));
-  Run(8000, 128000);
-}
-
-TEST_F(AcmSetBitRateOldApi, Pcm16_8khz_10ms_32kbps) {
-  ASSERT_NO_FATAL_FAILURE(SetUpTest("L16", 8000, 1, 107, 80, 80));
-  Run(32000, 128000);
-}
-
-// This test is for verifying the SetBitRate function. The bitrate is changed
-// in the middle, and the number of generated bytes are before and after the
-// change are checked.
-class AcmChangeBitRateOldApi : public AcmSetBitRateOldApi {
- protected:
-  AcmChangeBitRateOldApi() : sampling_freq_hz_(0), frame_size_samples_(0) {}
-
-  // Registers a send codec in the test::AcmSendTest object. Returns true on
-  // success, false on failure.
-  bool RegisterSendCodec(const char* payload_name,
-                         int sampling_freq_hz,
-                         int channels,
-                         int payload_type,
-                         int frame_size_samples,
-                         int frame_size_rtp_timestamps) override {
-    frame_size_samples_ = frame_size_samples;
-    sampling_freq_hz_ = sampling_freq_hz;
-    return AcmSetBitRateOldApi::RegisterSendCodec(
-        payload_name, sampling_freq_hz, channels, payload_type,
-        frame_size_samples, frame_size_rtp_timestamps);
-  }
-
-  // Runs the test. SetUpSender() and RegisterSendCodec() must have been called
-  // before calling this method.
-  void Run(int target_bitrate_bps,
-           int expected_before_switch_bits,
-           int expected_after_switch_bits) {
-    ASSERT_TRUE(send_test_->acm());
-    int nr_packets =
-        sampling_freq_hz_ * kTestDurationMs / (frame_size_samples_ * 1000);
-    int nr_bytes_before = 0, nr_bytes_after = 0;
-    int packet_counter = 0;
-    while (std::unique_ptr<test::Packet> next_packet =
-               send_test_->NextPacket()) {
-      if (packet_counter == nr_packets / 2)
-        send_test_->acm()->SetBitRate(target_bitrate_bps);
-      if (packet_counter < nr_packets / 2)
-        nr_bytes_before += next_packet->payload_length_bytes();
-      else
-        nr_bytes_after += next_packet->payload_length_bytes();
-      packet_counter++;
-    }
-    EXPECT_EQ(expected_before_switch_bits, nr_bytes_before * 8);
-    EXPECT_EQ(expected_after_switch_bits, nr_bytes_after * 8);
-  }
-
-  uint32_t sampling_freq_hz_;
-  uint32_t frame_size_samples_;
-};
-
-TEST_F(AcmChangeBitRateOldApi, Opus_48khz_20ms_10kbps_2) {
-  ASSERT_NO_FATAL_FAILURE(SetUpTest("opus", 48000, 1, 107, 960, 960));
-#if defined(WEBRTC_ANDROID)
-  Run(10000, 29512, 4800);
-#else
-  Run(10000, 32200, 5368);
-#endif  // WEBRTC_ANDROID
-}
-
-TEST_F(AcmChangeBitRateOldApi, Opus_48khz_20ms_50kbps_2) {
-  ASSERT_NO_FATAL_FAILURE(SetUpTest("opus", 48000, 1, 107, 960, 960));
-#if defined(WEBRTC_ANDROID)
-  Run(50000, 29512, 23304);
-#else
-  Run(50000, 32200, 23920);
-#endif  // WEBRTC_ANDROID
-}
-
-TEST_F(AcmChangeBitRateOldApi, Opus_48khz_20ms_100kbps_2) {
-  ASSERT_NO_FATAL_FAILURE(SetUpTest("opus", 48000, 1, 107, 960, 960));
-#if defined(WEBRTC_ANDROID)
-  #if defined(WEBRTC_ARCH_ARM64)
-    Run(100000, 29512, 50440);
-  #else
-    Run(100000, 29512, 50496);
-  #endif  // WEBRTC_ARCH_ARM64
-#else
-  Run(100000, 32200, 50448);
-#endif  // WEBRTC_ANDROID
-}
-
-// These next 2 tests ensure that the SetBitRate function has no effect on PCM
-TEST_F(AcmChangeBitRateOldApi, Pcm16_8khz_10ms_8kbps) {
-  ASSERT_NO_FATAL_FAILURE(SetUpTest("L16", 8000, 1, 107, 80, 80));
-  Run(8000, 64000, 64000);
-}
-
-TEST_F(AcmChangeBitRateOldApi, Pcm16_8khz_10ms_32kbps) {
-  ASSERT_NO_FATAL_FAILURE(SetUpTest("L16", 8000, 1, 107, 80, 80));
-  Run(32000, 64000, 64000);
-}
-
-TEST_F(AcmSenderBitExactnessOldApi, External_Pcmu_20ms) {
-  CodecInst codec_inst;
-  codec_inst.channels = 1;
-  codec_inst.pacsize = 160;
-  codec_inst.pltype = 0;
-  AudioEncoderPcmU encoder(codec_inst);
-  MockAudioEncoder mock_encoder;
-  // Set expectations on the mock encoder and also delegate the calls to the
-  // real encoder.
-  EXPECT_CALL(mock_encoder, Die());
-  EXPECT_CALL(mock_encoder, SampleRateHz())
-      .Times(AtLeast(1))
-      .WillRepeatedly(Invoke(&encoder, &AudioEncoderPcmU::SampleRateHz));
-  EXPECT_CALL(mock_encoder, NumChannels())
-      .Times(AtLeast(1))
-      .WillRepeatedly(Invoke(&encoder, &AudioEncoderPcmU::NumChannels));
-  EXPECT_CALL(mock_encoder, RtpTimestampRateHz())
-      .Times(AtLeast(1))
-      .WillRepeatedly(Invoke(&encoder, &AudioEncoderPcmU::RtpTimestampRateHz));
-  EXPECT_CALL(mock_encoder, Num10MsFramesInNextPacket())
-      .Times(AtLeast(1))
-      .WillRepeatedly(
-          Invoke(&encoder, &AudioEncoderPcmU::Num10MsFramesInNextPacket));
-  EXPECT_CALL(mock_encoder, GetTargetBitrate())
-      .Times(AtLeast(1))
-      .WillRepeatedly(Invoke(&encoder, &AudioEncoderPcmU::GetTargetBitrate));
-  EXPECT_CALL(mock_encoder, EncodeImpl(_, _, _))
-      .Times(AtLeast(1))
-      .WillRepeatedly(Invoke(&encoder,
-                             static_cast<
-                             AudioEncoder::EncodedInfo(AudioEncoder::*)(
-                                 uint32_t,
-                                 rtc::ArrayView<const int16_t>,
-                                 rtc::Buffer*)>(&AudioEncoderPcmU::Encode)));
-  EXPECT_CALL(mock_encoder, SetFec(_))
-      .Times(AtLeast(1))
-      .WillRepeatedly(Invoke(&encoder, &AudioEncoderPcmU::SetFec));
-  ASSERT_NO_FATAL_FAILURE(
-      SetUpTestExternalEncoder(&mock_encoder, codec_inst.pltype));
-  Run("81a9d4c0bb72e9becc43aef124c981e9", "8f9b8750bd80fe26b6cbf6659b89f0f9",
-      50, test::AcmReceiveTestOldApi::kMonoOutput);
-}
-
-// This test fixture is implemented to run ACM and change the desired output
-// frequency during the call. The input packets are simply PCM16b-wb encoded
-// payloads with a constant value of |kSampleValue|. The test fixture itself
-// acts as PacketSource in between the receive test class and the constant-
-// payload packet source class. The output is both written to file, and analyzed
-// in this test fixture.
-class AcmSwitchingOutputFrequencyOldApi : public ::testing::Test,
-                                          public test::PacketSource,
-                                          public test::AudioSink {
- protected:
-  static const size_t kTestNumPackets = 50;
-  static const int kEncodedSampleRateHz = 16000;
-  static const size_t kPayloadLenSamples = 30 * kEncodedSampleRateHz / 1000;
-  static const int kPayloadType = 108;  // Default payload type for PCM16b-wb.
-
-  AcmSwitchingOutputFrequencyOldApi()
-      : first_output_(true),
-        num_packets_(0),
-        packet_source_(kPayloadLenSamples,
-                       kSampleValue,
-                       kEncodedSampleRateHz,
-                       kPayloadType),
-        output_freq_2_(0),
-        has_toggled_(false) {}
-
-  void Run(int output_freq_1, int output_freq_2, int toggle_period_ms) {
-    // Set up the receiver used to decode the packets and verify the decoded
-    // output.
-    const std::string output_file_name =
-        webrtc::test::OutputPath() +
-        ::testing::UnitTest::GetInstance()
-            ->current_test_info()
-            ->test_case_name() +
-        "_" + ::testing::UnitTest::GetInstance()->current_test_info()->name() +
-        "_output.pcm";
-    test::OutputAudioFile output_file(output_file_name);
-    // Have the output audio sent both to file and to the WriteArray method in
-    // this class.
-    test::AudioSinkFork output(this, &output_file);
-    test::AcmReceiveTestToggleOutputFreqOldApi receive_test(
-        this,
-        &output,
-        output_freq_1,
-        output_freq_2,
-        toggle_period_ms,
-        test::AcmReceiveTestOldApi::kMonoOutput);
-    ASSERT_NO_FATAL_FAILURE(receive_test.RegisterDefaultCodecs());
-    output_freq_2_ = output_freq_2;
-
-    // This is where the actual test is executed.
-    receive_test.Run();
-
-    // Delete output file.
-    remove(output_file_name.c_str());
-  }
-
-  // Inherited from test::PacketSource.
-  std::unique_ptr<test::Packet> NextPacket() override {
-    // Check if it is time to terminate the test. The packet source is of type
-    // ConstantPcmPacketSource, which is infinite, so we must end the test
-    // "manually".
-    if (num_packets_++ > kTestNumPackets) {
-      EXPECT_TRUE(has_toggled_);
-      return NULL;  // Test ended.
-    }
-
-    // Get the next packet from the source.
-    return packet_source_.NextPacket();
-  }
-
-  // Inherited from test::AudioSink.
-  bool WriteArray(const int16_t* audio, size_t num_samples) override {
-    // Skip checking the first output frame, since it has a number of zeros
-    // due to how NetEq is initialized.
-    if (first_output_) {
-      first_output_ = false;
-      return true;
-    }
-    for (size_t i = 0; i < num_samples; ++i) {
-      EXPECT_EQ(kSampleValue, audio[i]);
-    }
-    if (num_samples ==
-        static_cast<size_t>(output_freq_2_ / 100))  // Size of 10 ms frame.
-      has_toggled_ = true;
-    // The return value does not say if the values match the expectation, just
-    // that the method could process the samples.
-    return true;
-  }
-
-  const int16_t kSampleValue = 1000;
-  bool first_output_;
-  size_t num_packets_;
-  test::ConstantPcmPacketSource packet_source_;
-  int output_freq_2_;
-  bool has_toggled_;
-};
-
-TEST_F(AcmSwitchingOutputFrequencyOldApi, TestWithoutToggling) {
-  Run(16000, 16000, 1000);
-}
-
-TEST_F(AcmSwitchingOutputFrequencyOldApi, Toggle16KhzTo32Khz) {
-  Run(16000, 32000, 1000);
-}
-
-TEST_F(AcmSwitchingOutputFrequencyOldApi, Toggle32KhzTo16Khz) {
-  Run(32000, 16000, 1000);
-}
-
-TEST_F(AcmSwitchingOutputFrequencyOldApi, Toggle16KhzTo8Khz) {
-  Run(16000, 8000, 1000);
-}
-
-TEST_F(AcmSwitchingOutputFrequencyOldApi, Toggle8KhzTo16Khz) {
-  Run(8000, 16000, 1000);
-}
-
-#endif
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/acm2/call_statistics.cc b/modules/audio_coding/acm2/call_statistics.cc
deleted file mode 100644
index 28511e9..0000000
--- a/modules/audio_coding/acm2/call_statistics.cc
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- *  Copyright (c) 2013 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/acm2/call_statistics.h"
-
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-
-namespace acm2 {
-
-void CallStatistics::DecodedByNetEq(AudioFrame::SpeechType speech_type,
-                                    bool muted) {
-  ++decoding_stat_.calls_to_neteq;
-  if (muted) {
-    ++decoding_stat_.decoded_muted_output;
-  }
-  switch (speech_type) {
-    case AudioFrame::kNormalSpeech: {
-      ++decoding_stat_.decoded_normal;
-      break;
-    }
-    case AudioFrame::kPLC: {
-      ++decoding_stat_.decoded_plc;
-      break;
-    }
-    case AudioFrame::kCNG: {
-      ++decoding_stat_.decoded_cng;
-      break;
-    }
-    case AudioFrame::kPLCCNG: {
-      ++decoding_stat_.decoded_plc_cng;
-      break;
-    }
-    case AudioFrame::kUndefined: {
-      // If the audio is decoded by NetEq, |kUndefined| is not an option.
-      RTC_NOTREACHED();
-    }
-  }
-}
-
-void CallStatistics::DecodedBySilenceGenerator() {
-  ++decoding_stat_.calls_to_silence_generator;
-}
-
-const AudioDecodingCallStats& CallStatistics::GetDecodingStatistics() const {
-  return decoding_stat_;
-}
-
-}  // namespace acm2
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/acm2/call_statistics.h b/modules/audio_coding/acm2/call_statistics.h
deleted file mode 100644
index 3993319..0000000
--- a/modules/audio_coding/acm2/call_statistics.h
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- *  Copyright (c) 2013 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_ACM2_CALL_STATISTICS_H_
-#define WEBRTC_MODULES_AUDIO_CODING_ACM2_CALL_STATISTICS_H_
-
-#include "webrtc/common_types.h"
-#include "webrtc/modules/include/module_common_types.h"
-
-//
-// This class is for book keeping of calls to ACM. It is not useful to log API
-// calls which are supposed to be called every 10ms, e.g. PlayoutData10Ms(),
-// however, it is useful to know the number of such calls in a given time
-// interval. The current implementation covers calls to PlayoutData10Ms() with
-// detailed accounting of the decoded speech type.
-//
-// Thread Safety
-// =============
-// Please note that this class in not thread safe. The class must be protected
-// if different APIs are called from different threads.
-//
-
-namespace webrtc {
-
-namespace acm2 {
-
-class CallStatistics {
- public:
-  CallStatistics() {}
-  ~CallStatistics() {}
-
-  // Call this method to indicate that NetEq engaged in decoding. |speech_type|
-  // is the audio-type according to NetEq, and |muted| indicates if the decoded
-  // frame was produced in muted state.
-  void DecodedByNetEq(AudioFrame::SpeechType speech_type, bool muted);
-
-  // Call this method to indicate that a decoding call resulted in generating
-  // silence, i.e. call to NetEq is bypassed and the output audio is zero.
-  void DecodedBySilenceGenerator();
-
-  // Get statistics for decoding. The statistics include the number of calls to
-  // NetEq and silence generator, as well as the type of speech pulled of off
-  // NetEq, c.f. declaration of AudioDecodingCallStats for detailed description.
-  const AudioDecodingCallStats& GetDecodingStatistics() const;
-
- private:
-  // Reset the decoding statistics.
-  void ResetDecodingStatistics();
-
-  AudioDecodingCallStats decoding_stat_;
-};
-
-}  // namespace acm2
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_CODING_ACM2_CALL_STATISTICS_H_
diff --git a/modules/audio_coding/acm2/call_statistics_unittest.cc b/modules/audio_coding/acm2/call_statistics_unittest.cc
deleted file mode 100644
index ce4468a..0000000
--- a/modules/audio_coding/acm2/call_statistics_unittest.cc
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- *  Copyright (c) 2013 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/acm2/call_statistics.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-namespace acm2 {
-
-TEST(CallStatisticsTest, InitializedZero) {
-  CallStatistics call_stats;
-  AudioDecodingCallStats stats;
-
-  stats = call_stats.GetDecodingStatistics();
-  EXPECT_EQ(0, stats.calls_to_neteq);
-  EXPECT_EQ(0, stats.calls_to_silence_generator);
-  EXPECT_EQ(0, stats.decoded_normal);
-  EXPECT_EQ(0, stats.decoded_cng);
-  EXPECT_EQ(0, stats.decoded_plc);
-  EXPECT_EQ(0, stats.decoded_plc_cng);
-  EXPECT_EQ(0, stats.decoded_muted_output);
-}
-
-TEST(CallStatisticsTest, AllCalls) {
-  CallStatistics call_stats;
-  AudioDecodingCallStats stats;
-
-  call_stats.DecodedBySilenceGenerator();
-  call_stats.DecodedByNetEq(AudioFrame::kNormalSpeech, false);
-  call_stats.DecodedByNetEq(AudioFrame::kPLC, false);
-  call_stats.DecodedByNetEq(AudioFrame::kPLCCNG, true);  // Let this be muted.
-  call_stats.DecodedByNetEq(AudioFrame::kCNG, false);
-
-  stats = call_stats.GetDecodingStatistics();
-  EXPECT_EQ(4, stats.calls_to_neteq);
-  EXPECT_EQ(1, stats.calls_to_silence_generator);
-  EXPECT_EQ(1, stats.decoded_normal);
-  EXPECT_EQ(1, stats.decoded_cng);
-  EXPECT_EQ(1, stats.decoded_plc);
-  EXPECT_EQ(1, stats.decoded_plc_cng);
-  EXPECT_EQ(1, stats.decoded_muted_output);
-}
-
-}  // namespace acm2
-
-}  // namespace webrtc
-
-
-
diff --git a/modules/audio_coding/acm2/codec_manager.cc b/modules/audio_coding/acm2/codec_manager.cc
deleted file mode 100644
index 7bbafc7..0000000
--- a/modules/audio_coding/acm2/codec_manager.cc
+++ /dev/null
@@ -1,245 +0,0 @@
-/*
- *  Copyright (c) 2015 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/acm2/codec_manager.h"
-
-#include "webrtc/rtc_base/checks.h"
-//#include "webrtc/rtc_base/format_macros.h"
-#include "webrtc/modules/audio_coding/acm2/rent_a_codec.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-namespace acm2 {
-
-namespace {
-
-// Check if the given codec is a valid to be registered as send codec.
-int IsValidSendCodec(const CodecInst& send_codec) {
-  if ((send_codec.channels != 1) && (send_codec.channels != 2)) {
-    LOG(LS_ERROR) << "Wrong number of channels (" << send_codec.channels
-                  << "), only mono and stereo are supported)";
-    return -1;
-  }
-
-  auto maybe_codec_id = RentACodec::CodecIdByInst(send_codec);
-  if (!maybe_codec_id) {
-    LOG(LS_ERROR) << "Invalid codec setting for the send codec.";
-    return -1;
-  }
-
-  // Telephone-event cannot be a send codec.
-  if (!STR_CASE_CMP(send_codec.plname, "telephone-event")) {
-    LOG(LS_ERROR) << "telephone-event cannot be a send codec";
-    return -1;
-  }
-
-  if (!RentACodec::IsSupportedNumChannels(*maybe_codec_id, send_codec.channels)
-           .value_or(false)) {
-    LOG(LS_ERROR) << send_codec.channels
-                  << " number of channels not supported for "
-                  << send_codec.plname << ".";
-    return -1;
-  }
-  return RentACodec::CodecIndexFromId(*maybe_codec_id).value_or(-1);
-}
-
-bool IsOpus(const CodecInst& codec) {
-  return
-#ifdef WEBRTC_CODEC_OPUS
-      !STR_CASE_CMP(codec.plname, "opus") ||
-#endif
-      false;
-}
-
-}  // namespace
-
-CodecManager::CodecManager() {
-  thread_checker_.DetachFromThread();
-}
-
-CodecManager::~CodecManager() = default;
-
-bool CodecManager::RegisterEncoder(const CodecInst& send_codec) {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  int codec_id = IsValidSendCodec(send_codec);
-
-  // Check for reported errors from function IsValidSendCodec().
-  if (codec_id < 0) {
-    return false;
-  }
-
-  switch (RentACodec::RegisterRedPayloadType(
-      &codec_stack_params_.red_payload_types, send_codec)) {
-    case RentACodec::RegistrationResult::kOk:
-      return true;
-    case RentACodec::RegistrationResult::kBadFreq:
-      LOG(LS_ERROR) << "RegisterSendCodec() failed, invalid frequency for RED"
-                       " registration";
-      return false;
-    case RentACodec::RegistrationResult::kSkip:
-      break;
-  }
-  switch (RentACodec::RegisterCngPayloadType(
-      &codec_stack_params_.cng_payload_types, send_codec)) {
-    case RentACodec::RegistrationResult::kOk:
-      return true;
-    case RentACodec::RegistrationResult::kBadFreq:
-      LOG(LS_ERROR) << "RegisterSendCodec() failed, invalid frequency for CNG"
-                       " registration";
-      return false;
-    case RentACodec::RegistrationResult::kSkip:
-      break;
-  }
-
-  if (IsOpus(send_codec)) {
-    // VAD/DTX not supported.
-    codec_stack_params_.use_cng = false;
-  }
-
-  send_codec_inst_ = rtc::Optional<CodecInst>(send_codec);
-  recreate_encoder_ = true;  // Caller must recreate it.
-  return true;
-}
-
-CodecInst CodecManager::ForgeCodecInst(
-    const AudioEncoder* external_speech_encoder) {
-  CodecInst ci;
-  ci.channels = external_speech_encoder->NumChannels();
-  ci.plfreq = external_speech_encoder->SampleRateHz();
-  ci.pacsize = rtc::CheckedDivExact(
-      static_cast<int>(external_speech_encoder->Max10MsFramesInAPacket() *
-                       ci.plfreq),
-      100);
-  ci.pltype = -1;  // Not valid.
-  ci.rate = -1;    // Not valid.
-  static const char kName[] = "external";
-  memcpy(ci.plname, kName, sizeof(kName));
-  return ci;
-}
-
-bool CodecManager::SetCopyRed(bool enable) {
-  if (enable && codec_stack_params_.use_codec_fec) {
-    LOG(LS_WARNING) << "Codec internal FEC and RED cannot be co-enabled.";
-    return false;
-  }
-  if (enable && send_codec_inst_ &&
-      codec_stack_params_.red_payload_types.count(send_codec_inst_->plfreq) <
-          1) {
-    LOG(LS_WARNING) << "Cannot enable RED at " << send_codec_inst_->plfreq
-                    << " Hz.";
-    return false;
-  }
-  codec_stack_params_.use_red = enable;
-  return true;
-}
-
-bool CodecManager::SetVAD(bool enable, ACMVADMode mode) {
-  // Sanity check of the mode.
-  RTC_DCHECK(mode == VADNormal || mode == VADLowBitrate || mode == VADAggr ||
-             mode == VADVeryAggr);
-
-  // Check that the send codec is mono. We don't support VAD/DTX for stereo
-  // sending.
-  const bool stereo_send =
-      codec_stack_params_.speech_encoder
-          ? (codec_stack_params_.speech_encoder->NumChannels() != 1)
-          : false;
-  if (enable && stereo_send) {
-    LOG(LS_ERROR) << "VAD/DTX not supported for stereo sending";
-    return false;
-  }
-
-  // TODO(kwiberg): This doesn't protect Opus when injected as an external
-  // encoder.
-  if (send_codec_inst_ && IsOpus(*send_codec_inst_)) {
-    // VAD/DTX not supported, but don't fail.
-    enable = false;
-  }
-
-  codec_stack_params_.use_cng = enable;
-  codec_stack_params_.vad_mode = mode;
-  return true;
-}
-
-bool CodecManager::SetCodecFEC(bool enable_codec_fec) {
-  if (enable_codec_fec && codec_stack_params_.use_red) {
-    LOG(LS_WARNING) << "Codec internal FEC and RED cannot be co-enabled.";
-    return false;
-  }
-
-  codec_stack_params_.use_codec_fec = enable_codec_fec;
-  return true;
-}
-
-bool CodecManager::MakeEncoder(RentACodec* rac, AudioCodingModule* acm) {
-  RTC_DCHECK(rac);
-  RTC_DCHECK(acm);
-
-  if (!recreate_encoder_) {
-    bool error = false;
-    // Try to re-use the speech encoder we've given to the ACM.
-    acm->ModifyEncoder([&](std::unique_ptr<AudioEncoder>* encoder) {
-      if (!*encoder) {
-        // There is no existing encoder.
-        recreate_encoder_ = true;
-        return;
-      }
-
-      // Extract the speech encoder from the ACM.
-      std::unique_ptr<AudioEncoder> enc = std::move(*encoder);
-      while (true) {
-        auto sub_enc = enc->ReclaimContainedEncoders();
-        if (sub_enc.empty()) {
-          break;
-        }
-        RTC_CHECK_EQ(1, sub_enc.size());
-
-        // Replace enc with its sub encoder. We need to put the sub encoder in
-        // a temporary first, since otherwise the old value of enc would be
-        // destroyed before the new value got assigned, which would be bad
-        // since the new value is a part of the old value.
-        auto tmp_enc = std::move(sub_enc[0]);
-        enc = std::move(tmp_enc);
-      }
-
-      // Wrap it in a new encoder stack and put it back.
-      codec_stack_params_.speech_encoder = std::move(enc);
-      *encoder = rac->RentEncoderStack(&codec_stack_params_);
-      if (!*encoder) {
-        error = true;
-      }
-    });
-    if (error) {
-      return false;
-    }
-    if (!recreate_encoder_) {
-      return true;
-    }
-  }
-
-  if (!send_codec_inst_) {
-    // We don't have the information we need to create a new speech encoder.
-    // (This is not an error.)
-    return true;
-  }
-
-  codec_stack_params_.speech_encoder = rac->RentEncoder(*send_codec_inst_);
-  auto stack = rac->RentEncoderStack(&codec_stack_params_);
-  if (!stack) {
-    return false;
-  }
-  acm->SetEncoder(std::move(stack));
-  recreate_encoder_ = false;
-  return true;
-}
-
-}  // namespace acm2
-}  // namespace webrtc
diff --git a/modules/audio_coding/acm2/codec_manager.h b/modules/audio_coding/acm2/codec_manager.h
deleted file mode 100644
index b5c8d3e..0000000
--- a/modules/audio_coding/acm2/codec_manager.h
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- *  Copyright (c) 2015 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_ACM2_CODEC_MANAGER_H_
-#define WEBRTC_MODULES_AUDIO_CODING_ACM2_CODEC_MANAGER_H_
-
-#include <map>
-
-#include "webrtc/api/optional.h"
-#include "webrtc/common_types.h"
-#include "webrtc/modules/audio_coding/acm2/rent_a_codec.h"
-#include "webrtc/modules/audio_coding/include/audio_coding_module.h"
-#include "webrtc/modules/audio_coding/include/audio_coding_module_typedefs.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/thread_checker.h"
-
-namespace webrtc {
-
-class AudioDecoder;
-class AudioEncoder;
-
-namespace acm2 {
-
-class CodecManager final {
- public:
-  CodecManager();
-  ~CodecManager();
-
-  // Parses the given specification. On success, returns true and updates the
-  // stored CodecInst and stack parameters; on error, returns false.
-  bool RegisterEncoder(const CodecInst& send_codec);
-
-  static CodecInst ForgeCodecInst(const AudioEncoder* external_speech_encoder);
-
-  const CodecInst* GetCodecInst() const {
-    return send_codec_inst_ ? &*send_codec_inst_ : nullptr;
-  }
-
-  void UnsetCodecInst() { send_codec_inst_ = rtc::Optional<CodecInst>(); }
-
-  const RentACodec::StackParameters* GetStackParams() const {
-    return &codec_stack_params_;
-  }
-  RentACodec::StackParameters* GetStackParams() { return &codec_stack_params_; }
-
-  bool SetCopyRed(bool enable);
-
-  bool SetVAD(bool enable, ACMVADMode mode);
-
-  bool SetCodecFEC(bool enable_codec_fec);
-
-  // Uses the provided Rent-A-Codec to create a new encoder stack, if we have a
-  // complete specification; if so, it is then passed to set_encoder. On error,
-  // returns false.
-  bool MakeEncoder(RentACodec* rac, AudioCodingModule* acm);
-
- private:
-  rtc::ThreadChecker thread_checker_;
-  rtc::Optional<CodecInst> send_codec_inst_;
-  RentACodec::StackParameters codec_stack_params_;
-  bool recreate_encoder_ = true;  // Need to recreate encoder?
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(CodecManager);
-};
-
-}  // namespace acm2
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_AUDIO_CODING_ACM2_CODEC_MANAGER_H_
diff --git a/modules/audio_coding/acm2/codec_manager_unittest.cc b/modules/audio_coding/acm2/codec_manager_unittest.cc
deleted file mode 100644
index 4dfcbda..0000000
--- a/modules/audio_coding/acm2/codec_manager_unittest.cc
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- *  Copyright (c) 2015 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 <memory>
-
-#include "webrtc/modules/audio_coding/acm2/codec_manager.h"
-#include "webrtc/modules/audio_coding/acm2/rent_a_codec.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/mock_audio_encoder.h"
-
-namespace webrtc {
-namespace acm2 {
-
-using ::testing::Return;
-
-namespace {
-
-// Create a MockAudioEncoder with some reasonable default behavior.
-std::unique_ptr<MockAudioEncoder> CreateMockEncoder() {
-  auto enc = std::unique_ptr<MockAudioEncoder>(new MockAudioEncoder);
-  EXPECT_CALL(*enc, SampleRateHz()).WillRepeatedly(Return(8000));
-  EXPECT_CALL(*enc, NumChannels()).WillRepeatedly(Return(1));
-  EXPECT_CALL(*enc, Max10MsFramesInAPacket()).WillRepeatedly(Return(1));
-  EXPECT_CALL(*enc, Die());
-  return enc;
-}
-
-}  // namespace
-
-TEST(CodecManagerTest, ExternalEncoderFec) {
-  auto enc0 = CreateMockEncoder();
-  auto enc1 = CreateMockEncoder();
-  auto enc2 = CreateMockEncoder();
-  {
-    ::testing::InSequence s;
-    EXPECT_CALL(*enc0, SetFec(false)).WillOnce(Return(true));
-    EXPECT_CALL(*enc1, SetFec(true)).WillOnce(Return(true));
-    EXPECT_CALL(*enc2, SetFec(true)).WillOnce(Return(false));
-  }
-
-  CodecManager cm;
-  RentACodec rac;
-
-  // use_codec_fec starts out false.
-  EXPECT_FALSE(cm.GetStackParams()->use_codec_fec);
-  cm.GetStackParams()->speech_encoder = std::move(enc0);
-  EXPECT_TRUE(rac.RentEncoderStack(cm.GetStackParams()));
-  EXPECT_FALSE(cm.GetStackParams()->use_codec_fec);
-
-  // Set it to true.
-  EXPECT_EQ(true, cm.SetCodecFEC(true));
-  EXPECT_TRUE(cm.GetStackParams()->use_codec_fec);
-  cm.GetStackParams()->speech_encoder = std::move(enc1);
-  EXPECT_TRUE(rac.RentEncoderStack(cm.GetStackParams()));
-  EXPECT_TRUE(cm.GetStackParams()->use_codec_fec);
-
-  // Switch to a codec that doesn't support it.
-  cm.GetStackParams()->speech_encoder = std::move(enc2);
-  EXPECT_TRUE(rac.RentEncoderStack(cm.GetStackParams()));
-  EXPECT_FALSE(cm.GetStackParams()->use_codec_fec);
-}
-
-}  // namespace acm2
-}  // namespace webrtc
diff --git a/modules/audio_coding/acm2/rent_a_codec.cc b/modules/audio_coding/acm2/rent_a_codec.cc
deleted file mode 100644
index 3bc1464..0000000
--- a/modules/audio_coding/acm2/rent_a_codec.cc
+++ /dev/null
@@ -1,314 +0,0 @@
-/*
- *  Copyright (c) 2015 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/acm2/rent_a_codec.h"
-
-#include <memory>
-#include <utility>
-
-#include "webrtc/modules/audio_coding/codecs/cng/audio_encoder_cng.h"
-#include "webrtc/modules/audio_coding/codecs/g711/audio_encoder_pcm.h"
-#include "webrtc/rtc_base/logging.h"
-#ifdef WEBRTC_CODEC_G722
-#include "webrtc/modules/audio_coding/codecs/g722/audio_encoder_g722.h"
-#endif
-#ifdef WEBRTC_CODEC_ILBC
-#include "webrtc/modules/audio_coding/codecs/ilbc/audio_encoder_ilbc.h"
-#endif
-#ifdef WEBRTC_CODEC_ISACFX
-#include "webrtc/modules/audio_coding/codecs/isac/fix/include/audio_decoder_isacfix.h"  // nogncheck
-#include "webrtc/modules/audio_coding/codecs/isac/fix/include/audio_encoder_isacfix.h"  // nogncheck
-#endif
-#ifdef WEBRTC_CODEC_ISAC
-#include "webrtc/modules/audio_coding/codecs/isac/main/include/audio_decoder_isac.h"  // nogncheck
-#include "webrtc/modules/audio_coding/codecs/isac/main/include/audio_encoder_isac.h"  // nogncheck
-#endif
-#ifdef WEBRTC_CODEC_OPUS
-#include "webrtc/modules/audio_coding/codecs/opus/audio_encoder_opus.h"
-#endif
-#include "webrtc/modules/audio_coding/codecs/pcm16b/audio_encoder_pcm16b.h"
-#ifdef WEBRTC_CODEC_RED
-#include "webrtc/modules/audio_coding/codecs/red/audio_encoder_copy_red.h"
-#endif
-#include "webrtc/modules/audio_coding/acm2/acm_codec_database.h"
-
-#if defined(WEBRTC_CODEC_ISACFX) || defined(WEBRTC_CODEC_ISAC)
-#include "webrtc/modules/audio_coding/codecs/isac/locked_bandwidth_info.h"
-#endif
-
-namespace webrtc {
-namespace acm2 {
-
-rtc::Optional<RentACodec::CodecId> RentACodec::CodecIdByParams(
-    const char* payload_name,
-    int sampling_freq_hz,
-    size_t channels) {
-  return CodecIdFromIndex(
-      ACMCodecDB::CodecId(payload_name, sampling_freq_hz, channels));
-}
-
-rtc::Optional<CodecInst> RentACodec::CodecInstById(CodecId codec_id) {
-  rtc::Optional<int> mi = CodecIndexFromId(codec_id);
-  return mi ? rtc::Optional<CodecInst>(Database()[*mi])
-            : rtc::Optional<CodecInst>();
-}
-
-rtc::Optional<RentACodec::CodecId> RentACodec::CodecIdByInst(
-    const CodecInst& codec_inst) {
-  return CodecIdFromIndex(ACMCodecDB::CodecNumber(codec_inst));
-}
-
-rtc::Optional<CodecInst> RentACodec::CodecInstByParams(const char* payload_name,
-                                                       int sampling_freq_hz,
-                                                       size_t channels) {
-  rtc::Optional<CodecId> codec_id =
-      CodecIdByParams(payload_name, sampling_freq_hz, channels);
-  if (!codec_id)
-    return rtc::Optional<CodecInst>();
-  rtc::Optional<CodecInst> ci = CodecInstById(*codec_id);
-  RTC_DCHECK(ci);
-
-  // Keep the number of channels from the function call. For most codecs it
-  // will be the same value as in default codec settings, but not for all.
-  ci->channels = channels;
-
-  return ci;
-}
-
-bool RentACodec::IsCodecValid(const CodecInst& codec_inst) {
-  return ACMCodecDB::CodecNumber(codec_inst) >= 0;
-}
-
-rtc::Optional<bool> RentACodec::IsSupportedNumChannels(CodecId codec_id,
-                                                       size_t num_channels) {
-  auto i = CodecIndexFromId(codec_id);
-  return i ? rtc::Optional<bool>(
-                 ACMCodecDB::codec_settings_[*i].channel_support >=
-                 num_channels)
-           : rtc::Optional<bool>();
-}
-
-rtc::ArrayView<const CodecInst> RentACodec::Database() {
-  return rtc::ArrayView<const CodecInst>(ACMCodecDB::database_,
-                                         NumberOfCodecs());
-}
-
-rtc::Optional<NetEqDecoder> RentACodec::NetEqDecoderFromCodecId(
-    CodecId codec_id,
-    size_t num_channels) {
-  rtc::Optional<int> i = CodecIndexFromId(codec_id);
-  if (!i)
-    return rtc::Optional<NetEqDecoder>();
-  const NetEqDecoder ned = ACMCodecDB::neteq_decoders_[*i];
-  return rtc::Optional<NetEqDecoder>(
-      (ned == NetEqDecoder::kDecoderOpus && num_channels == 2)
-          ? NetEqDecoder::kDecoderOpus_2ch
-          : ned);
-}
-
-RentACodec::RegistrationResult RentACodec::RegisterCngPayloadType(
-    std::map<int, int>* pt_map,
-    const CodecInst& codec_inst) {
-  if (STR_CASE_CMP(codec_inst.plname, "CN") != 0)
-    return RegistrationResult::kSkip;
-  switch (codec_inst.plfreq) {
-    case 8000:
-    case 16000:
-    case 32000:
-    case 48000:
-      (*pt_map)[codec_inst.plfreq] = codec_inst.pltype;
-      return RegistrationResult::kOk;
-    default:
-      return RegistrationResult::kBadFreq;
-  }
-}
-
-RentACodec::RegistrationResult RentACodec::RegisterRedPayloadType(
-    std::map<int, int>* pt_map,
-    const CodecInst& codec_inst) {
-  if (STR_CASE_CMP(codec_inst.plname, "RED") != 0)
-    return RegistrationResult::kSkip;
-  switch (codec_inst.plfreq) {
-    case 8000:
-      (*pt_map)[codec_inst.plfreq] = codec_inst.pltype;
-      return RegistrationResult::kOk;
-    default:
-      return RegistrationResult::kBadFreq;
-  }
-}
-
-namespace {
-
-// Returns a new speech encoder, or null on error.
-// TODO(kwiberg): Don't handle errors here (bug 5033)
-std::unique_ptr<AudioEncoder> CreateEncoder(
-    const CodecInst& speech_inst,
-    const rtc::scoped_refptr<LockedIsacBandwidthInfo>& bwinfo) {
-#if defined(WEBRTC_CODEC_ISACFX)
-  if (STR_CASE_CMP(speech_inst.plname, "isac") == 0)
-    return std::unique_ptr<AudioEncoder>(
-        new AudioEncoderIsacFixImpl(speech_inst, bwinfo));
-#endif
-#if defined(WEBRTC_CODEC_ISAC)
-  if (STR_CASE_CMP(speech_inst.plname, "isac") == 0)
-    return std::unique_ptr<AudioEncoder>(
-        new AudioEncoderIsacFloatImpl(speech_inst, bwinfo));
-#endif
-#ifdef WEBRTC_CODEC_OPUS
-  if (STR_CASE_CMP(speech_inst.plname, "opus") == 0)
-    return std::unique_ptr<AudioEncoder>(new AudioEncoderOpus(speech_inst));
-#endif
-  if (STR_CASE_CMP(speech_inst.plname, "pcmu") == 0)
-    return std::unique_ptr<AudioEncoder>(new AudioEncoderPcmU(speech_inst));
-  if (STR_CASE_CMP(speech_inst.plname, "pcma") == 0)
-    return std::unique_ptr<AudioEncoder>(new AudioEncoderPcmA(speech_inst));
-  if (STR_CASE_CMP(speech_inst.plname, "l16") == 0)
-    return std::unique_ptr<AudioEncoder>(new AudioEncoderPcm16B(speech_inst));
-#ifdef WEBRTC_CODEC_ILBC
-  if (STR_CASE_CMP(speech_inst.plname, "ilbc") == 0)
-    return std::unique_ptr<AudioEncoder>(new AudioEncoderIlbcImpl(speech_inst));
-#endif
-#ifdef WEBRTC_CODEC_G722
-  if (STR_CASE_CMP(speech_inst.plname, "g722") == 0)
-    return std::unique_ptr<AudioEncoder>(new AudioEncoderG722Impl(speech_inst));
-#endif
-  LOG_F(LS_ERROR) << "Could not create encoder of type " << speech_inst.plname;
-  return std::unique_ptr<AudioEncoder>();
-}
-
-std::unique_ptr<AudioEncoder> CreateRedEncoder(
-    std::unique_ptr<AudioEncoder> encoder,
-    int red_payload_type) {
-#ifdef WEBRTC_CODEC_RED
-  AudioEncoderCopyRed::Config config;
-  config.payload_type = red_payload_type;
-  config.speech_encoder = std::move(encoder);
-  return std::unique_ptr<AudioEncoder>(
-      new AudioEncoderCopyRed(std::move(config)));
-#else
-  return std::unique_ptr<AudioEncoder>();
-#endif
-}
-
-std::unique_ptr<AudioEncoder> CreateCngEncoder(
-    std::unique_ptr<AudioEncoder> encoder,
-    int payload_type,
-    ACMVADMode vad_mode) {
-  AudioEncoderCng::Config config;
-  config.num_channels = encoder->NumChannels();
-  config.payload_type = payload_type;
-  config.speech_encoder = std::move(encoder);
-  switch (vad_mode) {
-    case VADNormal:
-      config.vad_mode = Vad::kVadNormal;
-      break;
-    case VADLowBitrate:
-      config.vad_mode = Vad::kVadLowBitrate;
-      break;
-    case VADAggr:
-      config.vad_mode = Vad::kVadAggressive;
-      break;
-    case VADVeryAggr:
-      config.vad_mode = Vad::kVadVeryAggressive;
-      break;
-    default:
-      FATAL();
-  }
-  return std::unique_ptr<AudioEncoder>(new AudioEncoderCng(std::move(config)));
-}
-
-std::unique_ptr<AudioDecoder> CreateIsacDecoder(
-    int sample_rate_hz,
-    const rtc::scoped_refptr<LockedIsacBandwidthInfo>& bwinfo) {
-#if defined(WEBRTC_CODEC_ISACFX)
-  return std::unique_ptr<AudioDecoder>(
-      new AudioDecoderIsacFixImpl(sample_rate_hz, bwinfo));
-#elif defined(WEBRTC_CODEC_ISAC)
-  return std::unique_ptr<AudioDecoder>(
-      new AudioDecoderIsacFloatImpl(sample_rate_hz, bwinfo));
-#else
-  FATAL() << "iSAC is not supported.";
-  return std::unique_ptr<AudioDecoder>();
-#endif
-}
-
-}  // namespace
-
-RentACodec::RentACodec() {
-#if defined(WEBRTC_CODEC_ISACFX) || defined(WEBRTC_CODEC_ISAC)
-  isac_bandwidth_info_ = new LockedIsacBandwidthInfo;
-#endif
-}
-RentACodec::~RentACodec() = default;
-
-std::unique_ptr<AudioEncoder> RentACodec::RentEncoder(
-    const CodecInst& codec_inst) {
-  return CreateEncoder(codec_inst, isac_bandwidth_info_);
-}
-
-RentACodec::StackParameters::StackParameters() {
-  // Register the default payload types for RED and CNG.
-  for (const CodecInst& ci : RentACodec::Database()) {
-    RentACodec::RegisterCngPayloadType(&cng_payload_types, ci);
-    RentACodec::RegisterRedPayloadType(&red_payload_types, ci);
-  }
-}
-
-RentACodec::StackParameters::~StackParameters() = default;
-
-std::unique_ptr<AudioEncoder> RentACodec::RentEncoderStack(
-    StackParameters* param) {
-  if (!param->speech_encoder)
-    return nullptr;
-
-  if (param->use_codec_fec) {
-    // Switch FEC on. On failure, remember that FEC is off.
-    if (!param->speech_encoder->SetFec(true))
-      param->use_codec_fec = false;
-  } else {
-    // Switch FEC off. This shouldn't fail.
-    const bool success = param->speech_encoder->SetFec(false);
-    RTC_DCHECK(success);
-  }
-
-  auto pt = [&param](const std::map<int, int>& m) {
-    auto it = m.find(param->speech_encoder->SampleRateHz());
-    return it == m.end() ? rtc::Optional<int>()
-                         : rtc::Optional<int>(it->second);
-  };
-  auto cng_pt = pt(param->cng_payload_types);
-  param->use_cng =
-      param->use_cng && cng_pt && param->speech_encoder->NumChannels() == 1;
-  auto red_pt = pt(param->red_payload_types);
-  param->use_red = param->use_red && red_pt;
-
-  if (param->use_cng || param->use_red) {
-    // The RED and CNG encoders need to be in sync with the speech encoder, so
-    // reset the latter to ensure its buffer is empty.
-    param->speech_encoder->Reset();
-  }
-  std::unique_ptr<AudioEncoder> encoder_stack =
-      std::move(param->speech_encoder);
-  if (param->use_red) {
-    encoder_stack = CreateRedEncoder(std::move(encoder_stack), *red_pt);
-  }
-  if (param->use_cng) {
-    encoder_stack =
-        CreateCngEncoder(std::move(encoder_stack), *cng_pt, param->vad_mode);
-  }
-  return encoder_stack;
-}
-
-std::unique_ptr<AudioDecoder> RentACodec::RentIsacDecoder(int sample_rate_hz) {
-  return CreateIsacDecoder(sample_rate_hz, isac_bandwidth_info_);
-}
-
-}  // namespace acm2
-}  // namespace webrtc
diff --git a/modules/audio_coding/acm2/rent_a_codec.h b/modules/audio_coding/acm2/rent_a_codec.h
deleted file mode 100644
index 6dcf793..0000000
--- a/modules/audio_coding/acm2/rent_a_codec.h
+++ /dev/null
@@ -1,207 +0,0 @@
-/*
- *  Copyright (c) 2015 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_ACM2_RENT_A_CODEC_H_
-#define WEBRTC_MODULES_AUDIO_CODING_ACM2_RENT_A_CODEC_H_
-
-#include <stddef.h>
-#include <map>
-#include <memory>
-
-#include "webrtc/api/array_view.h"
-#include "webrtc/api/audio_codecs/audio_decoder.h"
-#include "webrtc/api/audio_codecs/audio_encoder.h"
-#include "webrtc/api/optional.h"
-#include "webrtc/modules/audio_coding/include/audio_coding_module_typedefs.h"
-#include "webrtc/modules/audio_coding/neteq/neteq_decoder_enum.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/scoped_ref_ptr.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-struct CodecInst;
-class LockedIsacBandwidthInfo;
-
-namespace acm2 {
-
-class RentACodec {
- public:
-  enum class CodecId {
-#if defined(WEBRTC_CODEC_ISAC) || defined(WEBRTC_CODEC_ISACFX)
-    kISAC,
-#endif
-#ifdef WEBRTC_CODEC_ISAC
-    kISACSWB,
-#endif
-    // Mono
-    kPCM16B,
-    kPCM16Bwb,
-    kPCM16Bswb32kHz,
-    // Stereo
-    kPCM16B_2ch,
-    kPCM16Bwb_2ch,
-    kPCM16Bswb32kHz_2ch,
-    // Mono
-    kPCMU,
-    kPCMA,
-    // Stereo
-    kPCMU_2ch,
-    kPCMA_2ch,
-#ifdef WEBRTC_CODEC_ILBC
-    kILBC,
-#endif
-#ifdef WEBRTC_CODEC_G722
-    kG722,      // Mono
-    kG722_2ch,  // Stereo
-#endif
-#ifdef WEBRTC_CODEC_OPUS
-    kOpus,  // Mono and stereo
-#endif
-    kCNNB,
-    kCNWB,
-    kCNSWB,
-#ifdef ENABLE_48000_HZ
-    kCNFB,
-#endif
-    kAVT,
-    kAVT16kHz,
-    kAVT32kHz,
-    kAVT48kHz,
-#ifdef WEBRTC_CODEC_RED
-    kRED,
-#endif
-    kNumCodecs,  // Implementation detail. Don't use.
-
-// Set unsupported codecs to -1.
-#if !defined(WEBRTC_CODEC_ISAC) && !defined(WEBRTC_CODEC_ISACFX)
-    kISAC = -1,
-#endif
-#ifndef WEBRTC_CODEC_ISAC
-    kISACSWB = -1,
-#endif
-    // 48 kHz not supported, always set to -1.
-    kPCM16Bswb48kHz = -1,
-#ifndef WEBRTC_CODEC_ILBC
-    kILBC = -1,
-#endif
-#ifndef WEBRTC_CODEC_G722
-    kG722 = -1,      // Mono
-    kG722_2ch = -1,  // Stereo
-#endif
-#ifndef WEBRTC_CODEC_OPUS
-    kOpus = -1,  // Mono and stereo
-#endif
-#ifndef WEBRTC_CODEC_RED
-    kRED = -1,
-#endif
-#ifndef ENABLE_48000_HZ
-    kCNFB = -1,
-#endif
-
-    kNone = -1
-  };
-
-  static inline size_t NumberOfCodecs() {
-    return static_cast<size_t>(CodecId::kNumCodecs);
-  }
-
-  static inline rtc::Optional<int> CodecIndexFromId(CodecId codec_id) {
-    const int i = static_cast<int>(codec_id);
-    return i >= 0 && i < static_cast<int>(NumberOfCodecs())
-               ? rtc::Optional<int>(i)
-               : rtc::Optional<int>();
-  }
-
-  static inline rtc::Optional<CodecId> CodecIdFromIndex(int codec_index) {
-    return static_cast<size_t>(codec_index) < NumberOfCodecs()
-               ? rtc::Optional<RentACodec::CodecId>(
-                     static_cast<RentACodec::CodecId>(codec_index))
-               : rtc::Optional<RentACodec::CodecId>();
-  }
-
-  static rtc::Optional<CodecId> CodecIdByParams(const char* payload_name,
-                                                int sampling_freq_hz,
-                                                size_t channels);
-  static rtc::Optional<CodecInst> CodecInstById(CodecId codec_id);
-  static rtc::Optional<CodecId> CodecIdByInst(const CodecInst& codec_inst);
-  static rtc::Optional<CodecInst> CodecInstByParams(const char* payload_name,
-                                                    int sampling_freq_hz,
-                                                    size_t channels);
-  static bool IsCodecValid(const CodecInst& codec_inst);
-
-  static inline bool IsPayloadTypeValid(int payload_type) {
-    return payload_type >= 0 && payload_type <= 127;
-  }
-
-  static rtc::ArrayView<const CodecInst> Database();
-
-  static rtc::Optional<bool> IsSupportedNumChannels(CodecId codec_id,
-                                                    size_t num_channels);
-
-  static rtc::Optional<NetEqDecoder> NetEqDecoderFromCodecId(
-      CodecId codec_id,
-      size_t num_channels);
-
-  // Parse codec_inst and extract payload types. If the given CodecInst was for
-  // the wrong sort of codec, return kSkip; otherwise, if the rate was illegal,
-  // return kBadFreq; otherwise, update the given RTP timestamp rate (Hz) ->
-  // payload type map and return kOk.
-  enum class RegistrationResult { kOk, kSkip, kBadFreq };
-  static RegistrationResult RegisterCngPayloadType(std::map<int, int>* pt_map,
-                                                   const CodecInst& codec_inst);
-  static RegistrationResult RegisterRedPayloadType(std::map<int, int>* pt_map,
-                                                   const CodecInst& codec_inst);
-
-  RentACodec();
-  ~RentACodec();
-
-  // Creates and returns an audio encoder built to the given specification.
-  // Returns null in case of error.
-  std::unique_ptr<AudioEncoder> RentEncoder(const CodecInst& codec_inst);
-
-  struct StackParameters {
-    StackParameters();
-    ~StackParameters();
-
-    std::unique_ptr<AudioEncoder> speech_encoder;
-
-    bool use_codec_fec = false;
-    bool use_red = false;
-    bool use_cng = false;
-    ACMVADMode vad_mode = VADNormal;
-
-    // Maps from RTP timestamp rate (in Hz) to payload type.
-    std::map<int, int> cng_payload_types;
-    std::map<int, int> red_payload_types;
-  };
-
-  // Creates and returns an audio encoder stack constructed to the given
-  // specification. If the specification isn't compatible with the encoder, it
-  // will be changed to match (things will be switched off). The speech encoder
-  // will be stolen. If the specification isn't complete, returns nullptr.
-  std::unique_ptr<AudioEncoder> RentEncoderStack(StackParameters* param);
-
-  // Creates and returns an iSAC decoder.
-  std::unique_ptr<AudioDecoder> RentIsacDecoder(int sample_rate_hz);
-
- private:
-  std::unique_ptr<AudioEncoder> speech_encoder_;
-  std::unique_ptr<AudioEncoder> cng_encoder_;
-  std::unique_ptr<AudioEncoder> red_encoder_;
-  rtc::scoped_refptr<LockedIsacBandwidthInfo> isac_bandwidth_info_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(RentACodec);
-};
-
-}  // namespace acm2
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_CODING_ACM2_RENT_A_CODEC_H_
diff --git a/modules/audio_coding/acm2/rent_a_codec_unittest.cc b/modules/audio_coding/acm2/rent_a_codec_unittest.cc
deleted file mode 100644
index dcf6383..0000000
--- a/modules/audio_coding/acm2/rent_a_codec_unittest.cc
+++ /dev/null
@@ -1,232 +0,0 @@
-/*
- *  Copyright (c) 2015 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 <memory>
-
-#include "webrtc/modules/audio_coding/acm2/rent_a_codec.h"
-#include "webrtc/rtc_base/arraysize.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/mock_audio_encoder.h"
-
-namespace webrtc {
-namespace acm2 {
-
-using ::testing::Return;
-
-namespace {
-
-const int kDataLengthSamples = 80;
-const int kPacketSizeSamples = 2 * kDataLengthSamples;
-const int16_t kZeroData[kDataLengthSamples] = {0};
-const CodecInst kDefaultCodecInst = {0, "pcmu", 8000, kPacketSizeSamples,
-                                     1, 64000};
-const int kCngPt = 13;
-
-class Marker final {
- public:
-  MOCK_METHOD1(Mark, void(std::string desc));
-};
-
-}  // namespace
-
-class RentACodecTestF : public ::testing::Test {
- protected:
-  void CreateCodec() {
-    auto speech_encoder = rent_a_codec_.RentEncoder(kDefaultCodecInst);
-    ASSERT_TRUE(speech_encoder);
-    RentACodec::StackParameters param;
-    param.use_cng = true;
-    param.speech_encoder = std::move(speech_encoder);
-    encoder_ = rent_a_codec_.RentEncoderStack(&param);
-  }
-
-  void EncodeAndVerify(size_t expected_out_length,
-                       uint32_t expected_timestamp,
-                       int expected_payload_type,
-                       int expected_send_even_if_empty) {
-    rtc::Buffer out;
-    AudioEncoder::EncodedInfo encoded_info;
-    encoded_info =
-        encoder_->Encode(timestamp_, kZeroData, &out);
-    timestamp_ += kDataLengthSamples;
-    EXPECT_TRUE(encoded_info.redundant.empty());
-    EXPECT_EQ(expected_out_length, encoded_info.encoded_bytes);
-    EXPECT_EQ(expected_timestamp, encoded_info.encoded_timestamp);
-    if (expected_payload_type >= 0)
-      EXPECT_EQ(expected_payload_type, encoded_info.payload_type);
-    if (expected_send_even_if_empty >= 0)
-      EXPECT_EQ(static_cast<bool>(expected_send_even_if_empty),
-                encoded_info.send_even_if_empty);
-  }
-
-  RentACodec rent_a_codec_;
-  std::unique_ptr<AudioEncoder> encoder_;
-  uint32_t timestamp_ = 0;
-};
-
-// This test verifies that CNG frames are delivered as expected. Since the frame
-// size is set to 20 ms, we expect the first encode call to produce no output
-// (which is signaled as 0 bytes output of type kNoEncoding). The next encode
-// call should produce one SID frame of 9 bytes. The third call should not
-// result in any output (just like the first one). The fourth and final encode
-// call should produce an "empty frame", which is like no output, but with
-// AudioEncoder::EncodedInfo::send_even_if_empty set to true. (The reason to
-// produce an empty frame is to drive sending of DTMF packets in the RTP/RTCP
-// module.)
-TEST_F(RentACodecTestF, VerifyCngFrames) {
-  CreateCodec();
-  uint32_t expected_timestamp = timestamp_;
-  // Verify no frame.
-  {
-    SCOPED_TRACE("First encoding");
-    EncodeAndVerify(0, expected_timestamp, -1, -1);
-  }
-
-  // Verify SID frame delivered.
-  {
-    SCOPED_TRACE("Second encoding");
-    EncodeAndVerify(9, expected_timestamp, kCngPt, 1);
-  }
-
-  // Verify no frame.
-  {
-    SCOPED_TRACE("Third encoding");
-    EncodeAndVerify(0, expected_timestamp, -1, -1);
-  }
-
-  // Verify NoEncoding.
-  expected_timestamp += 2 * kDataLengthSamples;
-  {
-    SCOPED_TRACE("Fourth encoding");
-    EncodeAndVerify(0, expected_timestamp, kCngPt, 1);
-  }
-}
-
-TEST(RentACodecTest, ExternalEncoder) {
-  const int kSampleRateHz = 8000;
-  auto* external_encoder = new MockAudioEncoder;
-  EXPECT_CALL(*external_encoder, SampleRateHz())
-      .WillRepeatedly(Return(kSampleRateHz));
-  EXPECT_CALL(*external_encoder, NumChannels()).WillRepeatedly(Return(1));
-  EXPECT_CALL(*external_encoder, SetFec(false)).WillRepeatedly(Return(true));
-
-  RentACodec rac;
-  RentACodec::StackParameters param;
-  param.speech_encoder = std::unique_ptr<AudioEncoder>(external_encoder);
-  std::unique_ptr<AudioEncoder> encoder_stack = rac.RentEncoderStack(&param);
-  EXPECT_EQ(external_encoder, encoder_stack.get());
-  const int kPacketSizeSamples = kSampleRateHz / 100;
-  int16_t audio[kPacketSizeSamples] = {0};
-  rtc::Buffer encoded;
-  AudioEncoder::EncodedInfo info;
-
-  Marker marker;
-  {
-    ::testing::InSequence s;
-    info.encoded_timestamp = 0;
-    EXPECT_CALL(
-        *external_encoder,
-        EncodeImpl(0, rtc::ArrayView<const int16_t>(audio), &encoded))
-        .WillOnce(Return(info));
-    EXPECT_CALL(marker, Mark("A"));
-    EXPECT_CALL(marker, Mark("B"));
-    EXPECT_CALL(*external_encoder, Die());
-    EXPECT_CALL(marker, Mark("C"));
-  }
-
-  info = encoder_stack->Encode(0, audio, &encoded);
-  EXPECT_EQ(0u, info.encoded_timestamp);
-  marker.Mark("A");
-
-  // Change to internal encoder.
-  CodecInst codec_inst = kDefaultCodecInst;
-  codec_inst.pacsize = kPacketSizeSamples;
-  param.speech_encoder = rac.RentEncoder(codec_inst);
-  ASSERT_TRUE(param.speech_encoder);
-  AudioEncoder* enc = param.speech_encoder.get();
-  std::unique_ptr<AudioEncoder> stack = rac.RentEncoderStack(&param);
-  EXPECT_EQ(enc, stack.get());
-
-  // Don't expect any more calls to the external encoder.
-  info = stack->Encode(1, audio, &encoded);
-  marker.Mark("B");
-  encoder_stack.reset();
-  marker.Mark("C");
-}
-
-// Verify that the speech encoder's Reset method is called when CNG or RED
-// (or both) are switched on, but not when they're switched off.
-void TestCngAndRedResetSpeechEncoder(bool use_cng, bool use_red) {
-  auto make_enc = [] {
-    auto speech_encoder =
-        std::unique_ptr<MockAudioEncoder>(new MockAudioEncoder);
-    EXPECT_CALL(*speech_encoder, NumChannels()).WillRepeatedly(Return(1));
-    EXPECT_CALL(*speech_encoder, Max10MsFramesInAPacket())
-        .WillRepeatedly(Return(2));
-    EXPECT_CALL(*speech_encoder, SampleRateHz()).WillRepeatedly(Return(8000));
-    EXPECT_CALL(*speech_encoder, SetFec(false)).WillRepeatedly(Return(true));
-    return speech_encoder;
-  };
-  auto speech_encoder1 = make_enc();
-  auto speech_encoder2 = make_enc();
-  Marker marker;
-  {
-    ::testing::InSequence s;
-    EXPECT_CALL(marker, Mark("disabled"));
-    EXPECT_CALL(*speech_encoder1, Die());
-    EXPECT_CALL(marker, Mark("enabled"));
-    if (use_cng || use_red)
-      EXPECT_CALL(*speech_encoder2, Reset());
-    EXPECT_CALL(*speech_encoder2, Die());
-  }
-
-  RentACodec::StackParameters param1, param2;
-  param1.speech_encoder = std::move(speech_encoder1);
-  param2.speech_encoder = std::move(speech_encoder2);
-  param2.use_cng = use_cng;
-  param2.use_red = use_red;
-  marker.Mark("disabled");
-  RentACodec rac;
-  rac.RentEncoderStack(&param1);
-  marker.Mark("enabled");
-  rac.RentEncoderStack(&param2);
-}
-
-TEST(RentACodecTest, CngResetsSpeechEncoder) {
-  TestCngAndRedResetSpeechEncoder(true, false);
-}
-
-TEST(RentACodecTest, RedResetsSpeechEncoder) {
-  TestCngAndRedResetSpeechEncoder(false, true);
-}
-
-TEST(RentACodecTest, CngAndRedResetsSpeechEncoder) {
-  TestCngAndRedResetSpeechEncoder(true, true);
-}
-
-TEST(RentACodecTest, NoCngAndRedNoSpeechEncoderReset) {
-  TestCngAndRedResetSpeechEncoder(false, false);
-}
-
-TEST(RentACodecTest, RentEncoderError) {
-  const CodecInst codec_inst = {
-      0, "Robert'); DROP TABLE Students;", 8000, 160, 1, 64000};
-  RentACodec rent_a_codec;
-  EXPECT_FALSE(rent_a_codec.RentEncoder(codec_inst));
-}
-
-TEST(RentACodecTest, RentEncoderStackWithoutSpeechEncoder) {
-  RentACodec::StackParameters sp;
-  EXPECT_EQ(nullptr, sp.speech_encoder);
-  EXPECT_EQ(nullptr, RentACodec().RentEncoderStack(&sp));
-}
-
-}  // namespace acm2
-}  // namespace webrtc
diff --git a/modules/audio_coding/audio_coding.gni b/modules/audio_coding/audio_coding.gni
deleted file mode 100644
index 41dcf00..0000000
--- a/modules/audio_coding/audio_coding.gni
+++ /dev/null
@@ -1,36 +0,0 @@
-# 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.
-
-import("../../webrtc.gni")
-
-audio_codec_defines = []
-if (rtc_include_ilbc) {
-  audio_codec_defines += [ "WEBRTC_CODEC_ILBC" ]
-}
-if (rtc_include_opus) {
-  audio_codec_defines += [ "WEBRTC_CODEC_OPUS" ]
-}
-if (rtc_opus_support_120ms_ptime) {
-  audio_codec_defines += [ "WEBRTC_OPUS_SUPPORT_120MS_PTIME=1" ]
-} else {
-  audio_codec_defines += [ "WEBRTC_OPUS_SUPPORT_120MS_PTIME=0" ]
-}
-if (!build_with_mozilla) {
-  if (current_cpu == "arm") {
-    audio_codec_defines += [ "WEBRTC_CODEC_ISACFX" ]
-  } else {
-    audio_codec_defines += [ "WEBRTC_CODEC_ISAC" ]
-  }
-  audio_codec_defines += [ "WEBRTC_CODEC_G722" ]
-}
-if (!build_with_mozilla && !build_with_chromium) {
-  audio_codec_defines += [ "WEBRTC_CODEC_RED" ]
-}
-
-audio_coding_defines = audio_codec_defines
-neteq_defines = audio_codec_defines
diff --git a/modules/audio_coding/audio_network_adaptor/audio_network_adaptor_config.cc b/modules/audio_coding/audio_network_adaptor/audio_network_adaptor_config.cc
deleted file mode 100644
index e367e10..0000000
--- a/modules/audio_coding/audio_network_adaptor/audio_network_adaptor_config.cc
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- *  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/include/audio_network_adaptor_config.h"
-
-namespace webrtc {
-
-AudioEncoderRuntimeConfig::AudioEncoderRuntimeConfig() = default;
-
-AudioEncoderRuntimeConfig::~AudioEncoderRuntimeConfig() = default;
-
-AudioEncoderRuntimeConfig::AudioEncoderRuntimeConfig(
-    const AudioEncoderRuntimeConfig& other) = default;
-
-AudioEncoderRuntimeConfig& AudioEncoderRuntimeConfig::operator=(
-    const AudioEncoderRuntimeConfig& other) = default;
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/audio_network_adaptor/audio_network_adaptor_impl.cc b/modules/audio_coding/audio_network_adaptor/audio_network_adaptor_impl.cc
deleted file mode 100644
index e2786ca..0000000
--- a/modules/audio_coding/audio_network_adaptor/audio_network_adaptor_impl.cc
+++ /dev/null
@@ -1,213 +0,0 @@
-/*
- *  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/audio_network_adaptor_impl.h"
-
-#include <utility>
-
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/timeutils.h"
-#include "webrtc/system_wrappers/include/field_trial.h"
-
-namespace webrtc {
-
-namespace {
-constexpr int kEventLogMinBitrateChangeBps = 5000;
-constexpr float kEventLogMinBitrateChangeFraction = 0.25;
-constexpr float kEventLogMinPacketLossChangeFraction = 0.5;
-}  // namespace
-
-AudioNetworkAdaptorImpl::Config::Config() : event_log(nullptr){};
-
-AudioNetworkAdaptorImpl::Config::~Config() = default;
-
-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)),
-      event_log_writer_(
-          config.event_log
-              ? new EventLogWriter(config.event_log,
-                                   kEventLogMinBitrateChangeBps,
-                                   kEventLogMinBitrateChangeFraction,
-                                   kEventLogMinPacketLossChangeFraction)
-              : nullptr),
-      enable_bitrate_adaptation_(
-          webrtc::field_trial::IsEnabled("WebRTC-Audio-BitrateAdaptation")),
-      enable_dtx_adaptation_(
-          webrtc::field_trial::IsEnabled("WebRTC-Audio-DtxAdaptation")),
-      enable_fec_adaptation_(
-          webrtc::field_trial::IsEnabled("WebRTC-Audio-FecAdaptation")),
-      enable_channel_adaptation_(
-          webrtc::field_trial::IsEnabled("WebRTC-Audio-ChannelAdaptation")),
-      enable_frame_length_adaptation_(webrtc::field_trial::IsEnabled(
-          "WebRTC-Audio-FrameLengthAdaptation")) {
-  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);
-  DumpNetworkMetrics();
-
-  Controller::NetworkMetrics network_metrics;
-  network_metrics.uplink_bandwidth_bps =
-      rtc::Optional<int>(uplink_bandwidth_bps);
-  UpdateNetworkMetrics(network_metrics);
-}
-
-void AudioNetworkAdaptorImpl::SetUplinkPacketLossFraction(
-    float uplink_packet_loss_fraction) {
-  last_metrics_.uplink_packet_loss_fraction =
-      rtc::Optional<float>(uplink_packet_loss_fraction);
-  DumpNetworkMetrics();
-
-  Controller::NetworkMetrics network_metrics;
-  network_metrics.uplink_packet_loss_fraction =
-      rtc::Optional<float>(uplink_packet_loss_fraction);
-  UpdateNetworkMetrics(network_metrics);
-}
-
-void AudioNetworkAdaptorImpl::SetUplinkRecoverablePacketLossFraction(
-    float uplink_recoverable_packet_loss_fraction) {
-  last_metrics_.uplink_recoverable_packet_loss_fraction =
-      rtc::Optional<float>(uplink_recoverable_packet_loss_fraction);
-  DumpNetworkMetrics();
-
-  Controller::NetworkMetrics network_metrics;
-  network_metrics.uplink_recoverable_packet_loss_fraction =
-      rtc::Optional<float>(uplink_recoverable_packet_loss_fraction);
-  UpdateNetworkMetrics(network_metrics);
-}
-
-void AudioNetworkAdaptorImpl::SetRtt(int rtt_ms) {
-  last_metrics_.rtt_ms = rtc::Optional<int>(rtt_ms);
-  DumpNetworkMetrics();
-
-  Controller::NetworkMetrics network_metrics;
-  network_metrics.rtt_ms = rtc::Optional<int>(rtt_ms);
-  UpdateNetworkMetrics(network_metrics);
-}
-
-void AudioNetworkAdaptorImpl::SetTargetAudioBitrate(
-    int target_audio_bitrate_bps) {
-  last_metrics_.target_audio_bitrate_bps =
-      rtc::Optional<int>(target_audio_bitrate_bps);
-  DumpNetworkMetrics();
-
-  Controller::NetworkMetrics network_metrics;
-  network_metrics.target_audio_bitrate_bps =
-      rtc::Optional<int>(target_audio_bitrate_bps);
-  UpdateNetworkMetrics(network_metrics);
-}
-
-void AudioNetworkAdaptorImpl::SetOverhead(size_t overhead_bytes_per_packet) {
-  last_metrics_.overhead_bytes_per_packet =
-      rtc::Optional<size_t>(overhead_bytes_per_packet);
-  DumpNetworkMetrics();
-
-  Controller::NetworkMetrics network_metrics;
-  network_metrics.overhead_bytes_per_packet =
-      rtc::Optional<size_t>(overhead_bytes_per_packet);
-  UpdateNetworkMetrics(network_metrics);
-}
-
-AudioEncoderRuntimeConfig AudioNetworkAdaptorImpl::GetEncoderRuntimeConfig() {
-  AudioEncoderRuntimeConfig config;
-  for (auto& controller :
-       controller_manager_->GetSortedControllers(last_metrics_))
-    controller->MakeDecision(&config);
-
-  // Update ANA stats.
-  auto increment_opt = [](rtc::Optional<uint32_t>& a) {
-    a = rtc::Optional<uint32_t>(a.value_or(0) + 1);
-  };
-  if (prev_config_) {
-    if (config.bitrate_bps != prev_config_->bitrate_bps) {
-      increment_opt(stats_.bitrate_action_counter);
-    }
-    if (config.enable_dtx != prev_config_->enable_dtx) {
-      increment_opt(stats_.dtx_action_counter);
-    }
-    if (config.enable_fec != prev_config_->enable_fec) {
-      increment_opt(stats_.fec_action_counter);
-    }
-    if (config.frame_length_ms && prev_config_->frame_length_ms) {
-      if (*config.frame_length_ms > *prev_config_->frame_length_ms) {
-        increment_opt(stats_.frame_length_increase_counter);
-      } else if (*config.frame_length_ms < *prev_config_->frame_length_ms) {
-        increment_opt(stats_.frame_length_decrease_counter);
-      }
-    }
-    if (config.num_channels != prev_config_->num_channels) {
-      increment_opt(stats_.channel_action_counter);
-    }
-    if (config.uplink_packet_loss_fraction) {
-      stats_.uplink_packet_loss_fraction =
-          rtc::Optional<float>(*config.uplink_packet_loss_fraction);
-    }
-  }
-  prev_config_ = rtc::Optional<AudioEncoderRuntimeConfig>(config);
-
-  // Prevent certain controllers from taking action (determined by field trials)
-  if (!enable_bitrate_adaptation_ && config.bitrate_bps) {
-    config.bitrate_bps.reset();
-  }
-  if (!enable_dtx_adaptation_ && config.enable_dtx) {
-    config.enable_dtx.reset();
-  }
-  if (!enable_fec_adaptation_ && config.enable_fec) {
-    config.enable_fec.reset();
-    config.uplink_packet_loss_fraction.reset();
-  }
-  if (!enable_frame_length_adaptation_ && config.frame_length_ms) {
-    config.frame_length_ms.reset();
-  }
-  if (!enable_channel_adaptation_ && config.num_channels) {
-    config.num_channels.reset();
-  }
-
-  if (debug_dump_writer_)
-    debug_dump_writer_->DumpEncoderRuntimeConfig(config, rtc::TimeMillis());
-
-  if (event_log_writer_)
-    event_log_writer_->MaybeLogEncoderConfig(config);
-
-  return config;
-}
-
-void AudioNetworkAdaptorImpl::StartDebugDump(FILE* file_handle) {
-  debug_dump_writer_ = DebugDumpWriter::Create(file_handle);
-}
-
-void AudioNetworkAdaptorImpl::StopDebugDump() {
-  debug_dump_writer_.reset(nullptr);
-}
-
-ANAStats AudioNetworkAdaptorImpl::GetStats() const {
-  return stats_;
-}
-
-void AudioNetworkAdaptorImpl::DumpNetworkMetrics() {
-  if (debug_dump_writer_)
-    debug_dump_writer_->DumpNetworkMetrics(last_metrics_, rtc::TimeMillis());
-}
-
-void AudioNetworkAdaptorImpl::UpdateNetworkMetrics(
-    const Controller::NetworkMetrics& network_metrics) {
-  for (auto& controller : controller_manager_->GetControllers())
-    controller->UpdateNetworkMetrics(network_metrics);
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/audio_network_adaptor/audio_network_adaptor_impl.h b/modules/audio_coding/audio_network_adaptor/audio_network_adaptor_impl.h
deleted file mode 100644
index 8e76db2..0000000
--- a/modules/audio_coding/audio_network_adaptor/audio_network_adaptor_impl.h
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- *  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_AUDIO_NETWORK_ADAPTOR_IMPL_H_
-#define WEBRTC_MODULES_AUDIO_CODING_AUDIO_NETWORK_ADAPTOR_AUDIO_NETWORK_ADAPTOR_IMPL_H_
-
-#include <memory>
-
-#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/event_log_writer.h"
-#include "webrtc/modules/audio_coding/audio_network_adaptor/include/audio_network_adaptor.h"
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace webrtc {
-
-class RtcEventLog;
-
-class AudioNetworkAdaptorImpl final : public AudioNetworkAdaptor {
- public:
-  struct Config {
-    Config();
-    ~Config();
-    RtcEventLog* event_log;
-  };
-
-  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 SetUplinkRecoverablePacketLossFraction(
-      float uplink_recoverable_packet_loss_fraction) override;
-
-  void SetRtt(int rtt_ms) override;
-
-  void SetTargetAudioBitrate(int target_audio_bitrate_bps) override;
-
-  void SetOverhead(size_t overhead_bytes_per_packet) override;
-
-  AudioEncoderRuntimeConfig GetEncoderRuntimeConfig() override;
-
-  void StartDebugDump(FILE* file_handle) override;
-
-  void StopDebugDump() override;
-
-  ANAStats GetStats() const override;
-
- private:
-  void DumpNetworkMetrics();
-
-  void UpdateNetworkMetrics(const Controller::NetworkMetrics& network_metrics);
-
-  const Config config_;
-
-  std::unique_ptr<ControllerManager> controller_manager_;
-
-  std::unique_ptr<DebugDumpWriter> debug_dump_writer_;
-
-  const std::unique_ptr<EventLogWriter> event_log_writer_;
-
-  Controller::NetworkMetrics last_metrics_;
-
-  rtc::Optional<AudioEncoderRuntimeConfig> prev_config_;
-
-  ANAStats stats_;
-
-  const bool enable_bitrate_adaptation_;
-  const bool enable_dtx_adaptation_;
-  const bool enable_fec_adaptation_;
-  const bool enable_channel_adaptation_;
-  const bool enable_frame_length_adaptation_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(AudioNetworkAdaptorImpl);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_CODING_AUDIO_NETWORK_ADAPTOR_AUDIO_NETWORK_ADAPTOR_IMPL_H_
diff --git a/modules/audio_coding/audio_network_adaptor/audio_network_adaptor_impl_unittest.cc b/modules/audio_coding/audio_network_adaptor/audio_network_adaptor_impl_unittest.cc
deleted file mode 100644
index a0dc12c..0000000
--- a/modules/audio_coding/audio_network_adaptor/audio_network_adaptor_impl_unittest.cc
+++ /dev/null
@@ -1,319 +0,0 @@
-/*
- *  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 <vector>
-
-#include "webrtc/logging/rtc_event_log/mock/mock_rtc_event_log.h"
-#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"
-#include "webrtc/rtc_base/fakeclock.h"
-#include "webrtc/test/field_trial.h"
-#include "webrtc/test/gtest.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.overhead_bytes_per_packet == metric.overhead_bytes_per_packet &&
-         arg.uplink_packet_loss_fraction ==
-             metric.uplink_packet_loss_fraction &&
-         arg.uplink_recoverable_packet_loss_fraction ==
-             metric.uplink_recoverable_packet_loss_fraction;
-}
-
-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<MockRtcEventLog> event_log;
-  MockDebugDumpWriter* mock_debug_dump_writer;
-};
-
-AudioNetworkAdaptorStates CreateAudioNetworkAdaptor() {
-  AudioNetworkAdaptorStates states;
-  std::vector<Controller*> controllers;
-  for (size_t i = 0; i < kNumControllers; ++i) {
-    auto controller =
-        std::unique_ptr<MockController>(new NiceMock<MockController>());
-    EXPECT_CALL(*controller, Die());
-    controllers.push_back(controller.get());
-    states.mock_controllers.push_back(std::move(controller));
-  }
-
-  auto controller_manager = std::unique_ptr<MockControllerManager>(
-      new NiceMock<MockControllerManager>());
-
-  EXPECT_CALL(*controller_manager, Die());
-  EXPECT_CALL(*controller_manager, GetControllers())
-      .WillRepeatedly(Return(controllers));
-  EXPECT_CALL(*controller_manager, GetSortedControllers(_))
-      .WillRepeatedly(Return(controllers));
-
-  states.event_log.reset(new NiceMock<MockRtcEventLog>());
-
-  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.event_log = states.event_log.get();
-  // AudioNetworkAdaptorImpl governs the lifetime of controller manager.
-  states.audio_network_adaptor.reset(new AudioNetworkAdaptorImpl(
-      config,
-      std::move(controller_manager), std::move(debug_dump_writer)));
-
-  return states;
-}
-
-void SetExpectCallToUpdateNetworkMetrics(
-    const std::vector<std::unique_ptr<MockController>>& controllers,
-    const Controller::NetworkMetrics& check) {
-  for (auto& mock_controller : controllers) {
-    EXPECT_CALL(*mock_controller,
-                UpdateNetworkMetrics(NetworkMetricsIs(check)));
-  }
-}
-
-}  // namespace
-
-TEST(AudioNetworkAdaptorImplTest,
-     UpdateNetworkMetricsIsCalledOnSetUplinkBandwidth) {
-  auto states = CreateAudioNetworkAdaptor();
-  constexpr int kBandwidth = 16000;
-  Controller::NetworkMetrics check;
-  check.uplink_bandwidth_bps = rtc::Optional<int>(kBandwidth);
-  SetExpectCallToUpdateNetworkMetrics(states.mock_controllers, check);
-  states.audio_network_adaptor->SetUplinkBandwidth(kBandwidth);
-}
-
-TEST(AudioNetworkAdaptorImplTest,
-     UpdateNetworkMetricsIsCalledOnSetUplinkPacketLossFraction) {
-  auto states = CreateAudioNetworkAdaptor();
-  constexpr float kPacketLoss = 0.7f;
-  Controller::NetworkMetrics check;
-  check.uplink_packet_loss_fraction = rtc::Optional<float>(kPacketLoss);
-  SetExpectCallToUpdateNetworkMetrics(states.mock_controllers, check);
-  states.audio_network_adaptor->SetUplinkPacketLossFraction(kPacketLoss);
-}
-
-TEST(AudioNetworkAdaptorImplTest,
-     UpdateNetworkMetricsIsCalledOnSetUplinkRecoverablePacketLossFraction) {
-  auto states = CreateAudioNetworkAdaptor();
-  constexpr float kRecoverablePacketLoss = 0.1f;
-  Controller::NetworkMetrics check;
-  check.uplink_recoverable_packet_loss_fraction =
-      rtc::Optional<float>(kRecoverablePacketLoss);
-  SetExpectCallToUpdateNetworkMetrics(states.mock_controllers, check);
-  states.audio_network_adaptor->SetUplinkRecoverablePacketLossFraction(
-      kRecoverablePacketLoss);
-}
-
-TEST(AudioNetworkAdaptorImplTest, UpdateNetworkMetricsIsCalledOnSetRtt) {
-  auto states = CreateAudioNetworkAdaptor();
-  constexpr int kRtt = 100;
-  Controller::NetworkMetrics check;
-  check.rtt_ms = rtc::Optional<int>(kRtt);
-  SetExpectCallToUpdateNetworkMetrics(states.mock_controllers, check);
-  states.audio_network_adaptor->SetRtt(kRtt);
-}
-
-TEST(AudioNetworkAdaptorImplTest,
-     UpdateNetworkMetricsIsCalledOnSetTargetAudioBitrate) {
-  auto states = CreateAudioNetworkAdaptor();
-  constexpr int kTargetAudioBitrate = 15000;
-  Controller::NetworkMetrics check;
-  check.target_audio_bitrate_bps = rtc::Optional<int>(kTargetAudioBitrate);
-  SetExpectCallToUpdateNetworkMetrics(states.mock_controllers, check);
-  states.audio_network_adaptor->SetTargetAudioBitrate(kTargetAudioBitrate);
-}
-
-TEST(AudioNetworkAdaptorImplTest, UpdateNetworkMetricsIsCalledOnSetOverhead) {
-  auto states = CreateAudioNetworkAdaptor();
-  constexpr size_t kOverhead = 64;
-  Controller::NetworkMetrics check;
-  check.overhead_bytes_per_packet = rtc::Optional<size_t>(kOverhead);
-  SetExpectCallToUpdateNetworkMetrics(states.mock_controllers, check);
-  states.audio_network_adaptor->SetOverhead(kOverhead);
-}
-
-TEST(AudioNetworkAdaptorImplTest,
-     MakeDecisionIsCalledOnGetEncoderRuntimeConfig) {
-  auto states = CreateAudioNetworkAdaptor();
-  for (auto& mock_controller : states.mock_controllers)
-    EXPECT_CALL(*mock_controller, MakeDecision(_));
-  states.audio_network_adaptor->GetEncoderRuntimeConfig();
-}
-
-TEST(AudioNetworkAdaptorImplTest,
-     DumpEncoderRuntimeConfigIsCalledOnGetEncoderRuntimeConfig) {
-  test::ScopedFieldTrials override_field_trials(
-      "WebRTC-Audio-BitrateAdaptation/Enabled/WebRTC-Audio-FecAdaptation/"
-      "Enabled/");
-  rtc::ScopedFakeClock fake_clock;
-  fake_clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(kClockInitialTimeMs));
-  auto states = CreateAudioNetworkAdaptor();
-  AudioEncoderRuntimeConfig config;
-  config.bitrate_bps = rtc::Optional<int>(32000);
-  config.enable_fec = rtc::Optional<bool>(true);
-
-  EXPECT_CALL(*states.mock_controllers[0], MakeDecision(_))
-      .WillOnce(SetArgPointee<0>(config));
-
-  EXPECT_CALL(*states.mock_debug_dump_writer,
-              DumpEncoderRuntimeConfig(EncoderRuntimeConfigIs(config),
-                                       kClockInitialTimeMs));
-  states.audio_network_adaptor->GetEncoderRuntimeConfig();
-}
-
-TEST(AudioNetworkAdaptorImplTest,
-     DumpNetworkMetricsIsCalledOnSetNetworkMetrics) {
-  rtc::ScopedFakeClock fake_clock;
-  fake_clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(kClockInitialTimeMs));
-
-  auto states = CreateAudioNetworkAdaptor();
-
-  constexpr int kBandwidth = 16000;
-  constexpr float kPacketLoss = 0.7f;
-  const auto kRecoverablePacketLoss = 0.2f;
-  constexpr int kRtt = 100;
-  constexpr int kTargetAudioBitrate = 15000;
-  constexpr size_t kOverhead = 64;
-
-  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);
-
-  fake_clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(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);
-
-  fake_clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(50));
-  timestamp_check += 50;
-  check.uplink_recoverable_packet_loss_fraction =
-      rtc::Optional<float>(kRecoverablePacketLoss);
-  EXPECT_CALL(*states.mock_debug_dump_writer,
-              DumpNetworkMetrics(NetworkMetricsIs(check), timestamp_check));
-  states.audio_network_adaptor->SetUplinkRecoverablePacketLossFraction(
-      kRecoverablePacketLoss);
-
-  fake_clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(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);
-
-  fake_clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(150));
-  timestamp_check += 150;
-  check.target_audio_bitrate_bps = rtc::Optional<int>(kTargetAudioBitrate);
-  EXPECT_CALL(*states.mock_debug_dump_writer,
-              DumpNetworkMetrics(NetworkMetricsIs(check), timestamp_check));
-  states.audio_network_adaptor->SetTargetAudioBitrate(kTargetAudioBitrate);
-
-  fake_clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(50));
-  timestamp_check += 50;
-  check.overhead_bytes_per_packet = rtc::Optional<size_t>(kOverhead);
-  EXPECT_CALL(*states.mock_debug_dump_writer,
-              DumpNetworkMetrics(NetworkMetricsIs(check), timestamp_check));
-  states.audio_network_adaptor->SetOverhead(kOverhead);
-}
-
-TEST(AudioNetworkAdaptorImplTest, LogRuntimeConfigOnGetEncoderRuntimeConfig) {
-  test::ScopedFieldTrials override_field_trials(
-      "WebRTC-Audio-BitrateAdaptation/Enabled/WebRTC-Audio-FecAdaptation/"
-      "Enabled/");
-  auto states = CreateAudioNetworkAdaptor();
-
-  AudioEncoderRuntimeConfig config;
-  config.bitrate_bps = rtc::Optional<int>(32000);
-  config.enable_fec = rtc::Optional<bool>(true);
-
-  EXPECT_CALL(*states.mock_controllers[0], MakeDecision(_))
-      .WillOnce(SetArgPointee<0>(config));
-
-  EXPECT_CALL(*states.event_log,
-              LogAudioNetworkAdaptation(EncoderRuntimeConfigIs(config)))
-      .Times(1);
-  states.audio_network_adaptor->GetEncoderRuntimeConfig();
-}
-
-TEST(AudioNetworkAdaptorImplTest, TestANAStats) {
-  auto states = CreateAudioNetworkAdaptor();
-
-  // Simulate some adaptation, otherwise the stats will not show anything.
-  AudioEncoderRuntimeConfig config1, config2;
-  config1.bitrate_bps = rtc::Optional<int>(32000);
-  config1.num_channels = rtc::Optional<size_t>(2);
-  config1.enable_fec = rtc::Optional<bool>(true);
-  config1.enable_dtx = rtc::Optional<bool>(true);
-  config1.frame_length_ms = rtc::Optional<int>(120);
-  config1.uplink_packet_loss_fraction = rtc::Optional<float>(0.1f);
-  config2.bitrate_bps = rtc::Optional<int>(16000);
-  config2.num_channels = rtc::Optional<size_t>(1);
-  config2.enable_fec = rtc::Optional<bool>(false);
-  config2.enable_dtx = rtc::Optional<bool>(false);
-  config2.frame_length_ms = rtc::Optional<int>(60);
-  config1.uplink_packet_loss_fraction = rtc::Optional<float>(0.1f);
-
-  EXPECT_CALL(*states.mock_controllers[0], MakeDecision(_))
-      .WillOnce(SetArgPointee<0>(config1));
-  states.audio_network_adaptor->GetEncoderRuntimeConfig();
-  EXPECT_CALL(*states.mock_controllers[0], MakeDecision(_))
-      .WillOnce(SetArgPointee<0>(config2));
-  states.audio_network_adaptor->GetEncoderRuntimeConfig();
-  EXPECT_CALL(*states.mock_controllers[0], MakeDecision(_))
-      .WillOnce(SetArgPointee<0>(config1));
-  states.audio_network_adaptor->GetEncoderRuntimeConfig();
-
-  auto ana_stats = states.audio_network_adaptor->GetStats();
-
-  EXPECT_EQ(ana_stats.bitrate_action_counter, 2);
-  EXPECT_EQ(ana_stats.channel_action_counter, 2);
-  EXPECT_EQ(ana_stats.dtx_action_counter, 2);
-  EXPECT_EQ(ana_stats.fec_action_counter, 2);
-  EXPECT_EQ(ana_stats.frame_length_increase_counter, 1);
-  EXPECT_EQ(ana_stats.frame_length_decrease_counter, 1);
-  EXPECT_EQ(ana_stats.uplink_packet_loss_fraction, 0.1f);
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/audio_network_adaptor/bitrate_controller.cc b/modules/audio_coding/audio_network_adaptor/bitrate_controller.cc
deleted file mode 100644
index b585ce3..0000000
--- a/modules/audio_coding/audio_network_adaptor/bitrate_controller.cc
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- *  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/bitrate_controller.h"
-
-#include <algorithm>
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/system_wrappers/include/field_trial.h"
-
-namespace webrtc {
-namespace audio_network_adaptor {
-
-BitrateController::Config::Config(int initial_bitrate_bps,
-                                  int initial_frame_length_ms)
-    : initial_bitrate_bps(initial_bitrate_bps),
-      initial_frame_length_ms(initial_frame_length_ms) {}
-
-BitrateController::Config::~Config() = default;
-
-BitrateController::BitrateController(const Config& config)
-    : config_(config),
-      bitrate_bps_(config_.initial_bitrate_bps),
-      frame_length_ms_(config_.initial_frame_length_ms) {
-  RTC_DCHECK_GT(bitrate_bps_, 0);
-  RTC_DCHECK_GT(frame_length_ms_, 0);
-}
-
-BitrateController::~BitrateController() = default;
-
-void BitrateController::UpdateNetworkMetrics(
-    const NetworkMetrics& network_metrics) {
-  if (network_metrics.target_audio_bitrate_bps)
-    target_audio_bitrate_bps_ = network_metrics.target_audio_bitrate_bps;
-  if (network_metrics.overhead_bytes_per_packet)
-    overhead_bytes_per_packet_ = network_metrics.overhead_bytes_per_packet;
-}
-
-void BitrateController::MakeDecision(AudioEncoderRuntimeConfig* config) {
-  // Decision on |bitrate_bps| should not have been made.
-  RTC_DCHECK(!config->bitrate_bps);
-  if (target_audio_bitrate_bps_ && overhead_bytes_per_packet_) {
-    // Current implementation of BitrateController can only work when
-    // |metrics.target_audio_bitrate_bps| includes overhead is enabled. This is
-    // currently governed by the following field trial.
-    RTC_DCHECK(
-        webrtc::field_trial::IsEnabled("WebRTC-SendSideBwe-WithOverhead"));
-    if (config->frame_length_ms)
-      frame_length_ms_ = *config->frame_length_ms;
-    int overhead_rate_bps =
-        static_cast<int>(*overhead_bytes_per_packet_ * 8 * 1000 /
-            frame_length_ms_);
-    bitrate_bps_ = std::max(0, *target_audio_bitrate_bps_ - overhead_rate_bps);
-  }
-  config->bitrate_bps = rtc::Optional<int>(bitrate_bps_);
-}
-
-}  // namespace audio_network_adaptor
-}  // namespace webrtc
diff --git a/modules/audio_coding/audio_network_adaptor/bitrate_controller.h b/modules/audio_coding/audio_network_adaptor/bitrate_controller.h
deleted file mode 100644
index 740edbd..0000000
--- a/modules/audio_coding/audio_network_adaptor/bitrate_controller.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- *  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_BITRATE_CONTROLLER_H_
-#define WEBRTC_MODULES_AUDIO_CODING_AUDIO_NETWORK_ADAPTOR_BITRATE_CONTROLLER_H_
-
-#include "webrtc/modules/audio_coding/audio_network_adaptor/controller.h"
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace webrtc {
-namespace audio_network_adaptor {
-
-class BitrateController final : public Controller {
- public:
-  struct Config {
-    Config(int initial_bitrate_bps, int initial_frame_length_ms);
-    ~Config();
-    int initial_bitrate_bps;
-    int initial_frame_length_ms;
-  };
-
-  explicit BitrateController(const Config& config);
-
-  ~BitrateController() override;
-
-  void UpdateNetworkMetrics(const NetworkMetrics& network_metrics) override;
-
-  void MakeDecision(AudioEncoderRuntimeConfig* config) override;
-
- private:
-  const Config config_;
-  int bitrate_bps_;
-  int frame_length_ms_;
-  rtc::Optional<int> target_audio_bitrate_bps_;
-  rtc::Optional<size_t> overhead_bytes_per_packet_;
-  RTC_DISALLOW_COPY_AND_ASSIGN(BitrateController);
-};
-
-}  // namespace audio_network_adaptor
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_CODING_AUDIO_NETWORK_ADAPTOR_BITRATE_CONTROLLER_H_
diff --git a/modules/audio_coding/audio_network_adaptor/bitrate_controller_unittest.cc b/modules/audio_coding/audio_network_adaptor/bitrate_controller_unittest.cc
deleted file mode 100644
index 9fab781..0000000
--- a/modules/audio_coding/audio_network_adaptor/bitrate_controller_unittest.cc
+++ /dev/null
@@ -1,272 +0,0 @@
-/*
- *  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/bitrate_controller.h"
-#include "webrtc/test/field_trial.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-namespace audio_network_adaptor {
-
-namespace {
-
-void UpdateNetworkMetrics(
-    BitrateController* controller,
-    const rtc::Optional<int>& target_audio_bitrate_bps,
-    const rtc::Optional<size_t>& overhead_bytes_per_packet) {
-  // UpdateNetworkMetrics can accept multiple network metric updates at once.
-  // However, currently, the most used case is to update one metric at a time.
-  // To reflect this fact, we separate the calls.
-  if (target_audio_bitrate_bps) {
-    Controller::NetworkMetrics network_metrics;
-    network_metrics.target_audio_bitrate_bps = target_audio_bitrate_bps;
-    controller->UpdateNetworkMetrics(network_metrics);
-  }
-  if (overhead_bytes_per_packet) {
-    Controller::NetworkMetrics network_metrics;
-    network_metrics.overhead_bytes_per_packet = overhead_bytes_per_packet;
-    controller->UpdateNetworkMetrics(network_metrics);
-  }
-}
-
-void CheckDecision(BitrateController* controller,
-                   const rtc::Optional<int>& frame_length_ms,
-                   int expected_bitrate_bps) {
-  AudioEncoderRuntimeConfig config;
-  config.frame_length_ms = frame_length_ms;
-  controller->MakeDecision(&config);
-  EXPECT_EQ(rtc::Optional<int>(expected_bitrate_bps), config.bitrate_bps);
-}
-
-}  // namespace
-
-// These tests are named AnaBitrateControllerTest to distinguish from
-// BitrateControllerTest in
-// modules/bitrate_controller/bitrate_controller_unittest.cc.
-
-TEST(AnaBitrateControllerTest, OutputInitValueWhenTargetBitrateUnknown) {
-  constexpr int kInitialBitrateBps = 32000;
-  constexpr int kInitialFrameLengthMs = 20;
-  constexpr size_t kOverheadBytesPerPacket = 64;
-  BitrateController controller(
-      BitrateController::Config(kInitialBitrateBps, kInitialFrameLengthMs));
-  UpdateNetworkMetrics(&controller, rtc::Optional<int>(),
-                       rtc::Optional<size_t>(kOverheadBytesPerPacket));
-  CheckDecision(&controller, rtc::Optional<int>(kInitialFrameLengthMs * 2),
-                kInitialBitrateBps);
-}
-
-TEST(AnaBitrateControllerTest, OutputInitValueWhenOverheadUnknown) {
-  constexpr int kInitialBitrateBps = 32000;
-  constexpr int kInitialFrameLengthMs = 20;
-  constexpr int kTargetBitrateBps = 48000;
-  BitrateController controller(
-      BitrateController::Config(kInitialBitrateBps, kInitialFrameLengthMs));
-  UpdateNetworkMetrics(&controller, rtc::Optional<int>(kTargetBitrateBps),
-                       rtc::Optional<size_t>());
-  CheckDecision(&controller, rtc::Optional<int>(kInitialFrameLengthMs * 2),
-                kInitialBitrateBps);
-}
-
-TEST(AnaBitrateControllerTest, ChangeBitrateOnTargetBitrateChanged) {
-  test::ScopedFieldTrials override_field_trials(
-      "WebRTC-SendSideBwe-WithOverhead/Enabled/");
-  constexpr int kInitialFrameLengthMs = 20;
-  BitrateController controller(
-      BitrateController::Config(32000, kInitialFrameLengthMs));
-  constexpr int kTargetBitrateBps = 48000;
-  constexpr size_t kOverheadBytesPerPacket = 64;
-  constexpr int kBitrateBps =
-      kTargetBitrateBps -
-      kOverheadBytesPerPacket * 8 * 1000 / kInitialFrameLengthMs;
-  // Frame length unchanged, bitrate changes in accordance with
-  // |metrics.target_audio_bitrate_bps| and |metrics.overhead_bytes_per_packet|.
-  UpdateNetworkMetrics(&controller, rtc::Optional<int>(kTargetBitrateBps),
-                       rtc::Optional<size_t>(kOverheadBytesPerPacket));
-  CheckDecision(&controller, rtc::Optional<int>(kInitialFrameLengthMs),
-                kBitrateBps);
-}
-
-TEST(AnaBitrateControllerTest, UpdateMultipleNetworkMetricsAtOnce) {
-  // This test is similar to ChangeBitrateOnTargetBitrateChanged. But instead of
-  // using ::UpdateNetworkMetrics(...), which calls
-  // BitrateController::UpdateNetworkMetrics(...) multiple times, we
-  // we call it only once. This is to verify that
-  // BitrateController::UpdateNetworkMetrics(...) can handle multiple
-  // network updates at once. This is, however, not a common use case in current
-  // audio_network_adaptor_impl.cc.
-  test::ScopedFieldTrials override_field_trials(
-      "WebRTC-SendSideBwe-WithOverhead/Enabled/");
-  constexpr int kInitialFrameLengthMs = 20;
-  BitrateController controller(
-      BitrateController::Config(32000, kInitialFrameLengthMs));
-  constexpr int kTargetBitrateBps = 48000;
-  constexpr size_t kOverheadBytesPerPacket = 64;
-  constexpr int kBitrateBps =
-      kTargetBitrateBps -
-      kOverheadBytesPerPacket * 8 * 1000 / kInitialFrameLengthMs;
-  Controller::NetworkMetrics network_metrics;
-  network_metrics.target_audio_bitrate_bps =
-      rtc::Optional<int>(kTargetBitrateBps);
-  network_metrics.overhead_bytes_per_packet =
-      rtc::Optional<size_t>(kOverheadBytesPerPacket);
-  controller.UpdateNetworkMetrics(network_metrics);
-  CheckDecision(&controller, rtc::Optional<int>(kInitialFrameLengthMs),
-                kBitrateBps);
-}
-
-TEST(AnaBitrateControllerTest, TreatUnknownFrameLengthAsFrameLengthUnchanged) {
-  test::ScopedFieldTrials override_field_trials(
-      "WebRTC-SendSideBwe-WithOverhead/Enabled/");
-  constexpr int kInitialFrameLengthMs = 20;
-  BitrateController controller(
-      BitrateController::Config(32000, kInitialFrameLengthMs));
-  constexpr int kTargetBitrateBps = 48000;
-  constexpr size_t kOverheadBytesPerPacket = 64;
-  constexpr int kBitrateBps =
-      kTargetBitrateBps -
-      kOverheadBytesPerPacket * 8 * 1000 / kInitialFrameLengthMs;
-  UpdateNetworkMetrics(&controller, rtc::Optional<int>(kTargetBitrateBps),
-                       rtc::Optional<size_t>(kOverheadBytesPerPacket));
-  CheckDecision(&controller, rtc::Optional<int>(), kBitrateBps);
-}
-
-TEST(AnaBitrateControllerTest, IncreaseBitrateOnFrameLengthIncreased) {
-  test::ScopedFieldTrials override_field_trials(
-      "WebRTC-SendSideBwe-WithOverhead/Enabled/");
-  constexpr int kInitialFrameLengthMs = 20;
-  BitrateController controller(
-      BitrateController::Config(32000, kInitialFrameLengthMs));
-
-  constexpr int kTargetBitrateBps = 48000;
-  constexpr size_t kOverheadBytesPerPacket = 64;
-  constexpr int kBitrateBps =
-      kTargetBitrateBps -
-      kOverheadBytesPerPacket * 8 * 1000 / kInitialFrameLengthMs;
-  UpdateNetworkMetrics(&controller, rtc::Optional<int>(kTargetBitrateBps),
-                       rtc::Optional<size_t>(kOverheadBytesPerPacket));
-  CheckDecision(&controller, rtc::Optional<int>(), kBitrateBps);
-
-  constexpr int kFrameLengthMs = 60;
-  constexpr size_t kPacketOverheadRateDiff =
-      kOverheadBytesPerPacket * 8 * 1000 / 20 -
-      kOverheadBytesPerPacket * 8 * 1000 / 60;
-  UpdateNetworkMetrics(&controller, rtc::Optional<int>(kTargetBitrateBps),
-                       rtc::Optional<size_t>(kOverheadBytesPerPacket));
-  CheckDecision(&controller, rtc::Optional<int>(kFrameLengthMs),
-                kBitrateBps + kPacketOverheadRateDiff);
-}
-
-TEST(AnaBitrateControllerTest, DecreaseBitrateOnFrameLengthDecreased) {
-  test::ScopedFieldTrials override_field_trials(
-      "WebRTC-SendSideBwe-WithOverhead/Enabled/");
-  constexpr int kInitialFrameLengthMs = 60;
-  BitrateController controller(
-      BitrateController::Config(32000, kInitialFrameLengthMs));
-
-  constexpr int kTargetBitrateBps = 48000;
-  constexpr size_t kOverheadBytesPerPacket = 64;
-  constexpr int kBitrateBps =
-      kTargetBitrateBps -
-      kOverheadBytesPerPacket * 8 * 1000 / kInitialFrameLengthMs;
-  UpdateNetworkMetrics(&controller, rtc::Optional<int>(kTargetBitrateBps),
-                       rtc::Optional<size_t>(kOverheadBytesPerPacket));
-  CheckDecision(&controller, rtc::Optional<int>(), kBitrateBps);
-
-  constexpr int kFrameLengthMs = 20;
-  constexpr size_t kPacketOverheadRateDiff =
-      kOverheadBytesPerPacket * 8 * 1000 / 20 -
-      kOverheadBytesPerPacket * 8 * 1000 / 60;
-  UpdateNetworkMetrics(&controller, rtc::Optional<int>(kTargetBitrateBps),
-                       rtc::Optional<size_t>(kOverheadBytesPerPacket));
-  CheckDecision(&controller, rtc::Optional<int>(kFrameLengthMs),
-                kBitrateBps - kPacketOverheadRateDiff);
-}
-
-TEST(AnaBitrateControllerTest, BitrateNeverBecomesNegative) {
-  test::ScopedFieldTrials override_field_trials(
-      "WebRTC-SendSideBwe-WithOverhead/Enabled/");
-  BitrateController controller(BitrateController::Config(32000, 20));
-  constexpr size_t kOverheadBytesPerPacket = 64;
-  constexpr int kFrameLengthMs = 60;
-  // Set a target rate smaller than overhead rate, the bitrate is bounded by 0.
-  constexpr int kTargetBitrateBps =
-      kOverheadBytesPerPacket * 8 * 1000 / kFrameLengthMs - 1;
-  UpdateNetworkMetrics(&controller, rtc::Optional<int>(kTargetBitrateBps),
-                       rtc::Optional<size_t>(kOverheadBytesPerPacket));
-  CheckDecision(&controller, rtc::Optional<int>(kFrameLengthMs), 0);
-}
-
-TEST(AnaBitrateControllerTest, CheckBehaviorOnChangingCondition) {
-  test::ScopedFieldTrials override_field_trials(
-      "WebRTC-SendSideBwe-WithOverhead/Enabled/");
-  BitrateController controller(BitrateController::Config(32000, 20));
-
-  // Start from an arbitrary overall bitrate.
-  int overall_bitrate = 34567;
-  size_t overhead_bytes_per_packet = 64;
-  int frame_length_ms = 20;
-  int current_bitrate =
-      overall_bitrate - overhead_bytes_per_packet * 8 * 1000 / frame_length_ms;
-
-  UpdateNetworkMetrics(&controller, rtc::Optional<int>(overall_bitrate),
-                       rtc::Optional<size_t>(overhead_bytes_per_packet));
-  CheckDecision(&controller, rtc::Optional<int>(frame_length_ms),
-                current_bitrate);
-
-  // Next: increase overall bitrate.
-  overall_bitrate += 100;
-  current_bitrate += 100;
-  UpdateNetworkMetrics(&controller, rtc::Optional<int>(overall_bitrate),
-                       rtc::Optional<size_t>(overhead_bytes_per_packet));
-  CheckDecision(&controller, rtc::Optional<int>(frame_length_ms),
-                current_bitrate);
-
-  // Next: change frame length.
-  frame_length_ms = 60;
-  current_bitrate += overhead_bytes_per_packet * 8 * 1000 / 20 -
-                     overhead_bytes_per_packet * 8 * 1000 / 60;
-  UpdateNetworkMetrics(&controller, rtc::Optional<int>(overall_bitrate),
-                       rtc::Optional<size_t>(overhead_bytes_per_packet));
-  CheckDecision(&controller, rtc::Optional<int>(frame_length_ms),
-                current_bitrate);
-
-  // Next: change overhead.
-  overhead_bytes_per_packet -= 30;
-  current_bitrate += 30 * 8 * 1000 / frame_length_ms;
-  UpdateNetworkMetrics(&controller, rtc::Optional<int>(overall_bitrate),
-                       rtc::Optional<size_t>(overhead_bytes_per_packet));
-  CheckDecision(&controller, rtc::Optional<int>(frame_length_ms),
-                current_bitrate);
-
-  // Next: change frame length.
-  frame_length_ms = 20;
-  current_bitrate -= overhead_bytes_per_packet * 8 * 1000 / 20 -
-                     overhead_bytes_per_packet * 8 * 1000 / 60;
-  UpdateNetworkMetrics(&controller, rtc::Optional<int>(overall_bitrate),
-                       rtc::Optional<size_t>(overhead_bytes_per_packet));
-  CheckDecision(&controller, rtc::Optional<int>(frame_length_ms),
-                current_bitrate);
-
-  // Next: decrease overall bitrate and frame length.
-  overall_bitrate -= 100;
-  current_bitrate -= 100;
-  frame_length_ms = 60;
-  current_bitrate += overhead_bytes_per_packet * 8 * 1000 / 20 -
-                     overhead_bytes_per_packet * 8 * 1000 / 60;
-
-  UpdateNetworkMetrics(&controller, rtc::Optional<int>(overall_bitrate),
-                       rtc::Optional<size_t>(overhead_bytes_per_packet));
-  CheckDecision(&controller, rtc::Optional<int>(frame_length_ms),
-                current_bitrate);
-}
-
-}  // namespace audio_network_adaptor
-}  // namespace webrtc
diff --git a/modules/audio_coding/audio_network_adaptor/channel_controller.cc b/modules/audio_coding/audio_network_adaptor/channel_controller.cc
deleted file mode 100644
index 052808d..0000000
--- a/modules/audio_coding/audio_network_adaptor/channel_controller.cc
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- *  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 <algorithm>
-
-#include "webrtc/modules/audio_coding/audio_network_adaptor/channel_controller.h"
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-
-ChannelController::Config::Config(size_t num_encoder_channels,
-                                  size_t intial_channels_to_encode,
-                                  int channel_1_to_2_bandwidth_bps,
-                                  int channel_2_to_1_bandwidth_bps)
-    : num_encoder_channels(num_encoder_channels),
-      intial_channels_to_encode(intial_channels_to_encode),
-      channel_1_to_2_bandwidth_bps(channel_1_to_2_bandwidth_bps),
-      channel_2_to_1_bandwidth_bps(channel_2_to_1_bandwidth_bps) {}
-
-ChannelController::ChannelController(const Config& config)
-    : config_(config), channels_to_encode_(config_.intial_channels_to_encode) {
-  RTC_DCHECK_GT(config_.intial_channels_to_encode, 0lu);
-  // Currently, we require |intial_channels_to_encode| to be <= 2.
-  RTC_DCHECK_LE(config_.intial_channels_to_encode, 2lu);
-  RTC_DCHECK_GE(config_.num_encoder_channels,
-                config_.intial_channels_to_encode);
-}
-
-ChannelController::~ChannelController() = default;
-
-void ChannelController::UpdateNetworkMetrics(
-    const NetworkMetrics& network_metrics) {
-  if (network_metrics.uplink_bandwidth_bps)
-    uplink_bandwidth_bps_ = network_metrics.uplink_bandwidth_bps;
-}
-
-void ChannelController::MakeDecision(AudioEncoderRuntimeConfig* config) {
-  // Decision on |num_channels| should not have been made.
-  RTC_DCHECK(!config->num_channels);
-
-  if (uplink_bandwidth_bps_) {
-    if (channels_to_encode_ == 2 &&
-        *uplink_bandwidth_bps_ <= config_.channel_2_to_1_bandwidth_bps) {
-      channels_to_encode_ = 1;
-    } else if (channels_to_encode_ == 1 &&
-               *uplink_bandwidth_bps_ >= config_.channel_1_to_2_bandwidth_bps) {
-      channels_to_encode_ =
-          std::min(static_cast<size_t>(2), config_.num_encoder_channels);
-    }
-  }
-  config->num_channels = rtc::Optional<size_t>(channels_to_encode_);
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/audio_network_adaptor/channel_controller.h b/modules/audio_coding/audio_network_adaptor/channel_controller.h
deleted file mode 100644
index 4920668..0000000
--- a/modules/audio_coding/audio_network_adaptor/channel_controller.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- *  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_CHANNEL_CONTROLLER_H_
-#define WEBRTC_MODULES_AUDIO_CODING_AUDIO_NETWORK_ADAPTOR_CHANNEL_CONTROLLER_H_
-
-#include "webrtc/modules/audio_coding/audio_network_adaptor/controller.h"
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace webrtc {
-
-class ChannelController final : public Controller {
- public:
-  struct Config {
-    Config(size_t num_encoder_channels,
-           size_t intial_channels_to_encode,
-           int channel_1_to_2_bandwidth_bps,
-           int channel_2_to_1_bandwidth_bps);
-    size_t num_encoder_channels;
-    size_t intial_channels_to_encode;
-    // Uplink bandwidth above which the number of encoded channels should switch
-    // from 1 to 2.
-    int channel_1_to_2_bandwidth_bps;
-    // Uplink bandwidth below which the number of encoded channels should switch
-    // from 2 to 1.
-    int channel_2_to_1_bandwidth_bps;
-  };
-
-  explicit ChannelController(const Config& config);
-
-  ~ChannelController() override;
-
-  void UpdateNetworkMetrics(const NetworkMetrics& network_metrics) override;
-
-  void MakeDecision(AudioEncoderRuntimeConfig* config) override;
-
- private:
-  const Config config_;
-  size_t channels_to_encode_;
-  rtc::Optional<int> uplink_bandwidth_bps_;
-  RTC_DISALLOW_COPY_AND_ASSIGN(ChannelController);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_CODING_AUDIO_NETWORK_ADAPTOR_CHANNEL_CONTROLLER_H_
diff --git a/modules/audio_coding/audio_network_adaptor/channel_controller_unittest.cc b/modules/audio_coding/audio_network_adaptor/channel_controller_unittest.cc
deleted file mode 100644
index 980292c..0000000
--- a/modules/audio_coding/audio_network_adaptor/channel_controller_unittest.cc
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- *  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 <memory>
-
-#include "webrtc/modules/audio_coding/audio_network_adaptor/channel_controller.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-namespace {
-
-constexpr int kNumChannels = 2;
-constexpr int kChannel1To2BandwidthBps = 31000;
-constexpr int kChannel2To1BandwidthBps = 29000;
-constexpr int kMediumBandwidthBps =
-    (kChannel1To2BandwidthBps + kChannel2To1BandwidthBps) / 2;
-
-std::unique_ptr<ChannelController> CreateChannelController(int init_channels) {
-  std::unique_ptr<ChannelController> controller(
-      new ChannelController(ChannelController::Config(
-          kNumChannels, init_channels, kChannel1To2BandwidthBps,
-          kChannel2To1BandwidthBps)));
-  return controller;
-}
-
-void CheckDecision(ChannelController* controller,
-                   const rtc::Optional<int>& uplink_bandwidth_bps,
-                   size_t expected_num_channels) {
-  if (uplink_bandwidth_bps) {
-    Controller::NetworkMetrics network_metrics;
-    network_metrics.uplink_bandwidth_bps = uplink_bandwidth_bps;
-    controller->UpdateNetworkMetrics(network_metrics);
-  }
-  AudioEncoderRuntimeConfig config;
-  controller->MakeDecision(&config);
-  EXPECT_EQ(rtc::Optional<size_t>(expected_num_channels), config.num_channels);
-}
-
-}  // namespace
-
-TEST(ChannelControllerTest, OutputInitValueWhenUplinkBandwidthUnknown) {
-  constexpr int kInitChannels = 2;
-  auto controller = CreateChannelController(kInitChannels);
-  CheckDecision(controller.get(), rtc::Optional<int>(), kInitChannels);
-}
-
-TEST(ChannelControllerTest, SwitchTo2ChannelsOnHighUplinkBandwidth) {
-  constexpr int kInitChannels = 1;
-  auto controller = CreateChannelController(kInitChannels);
-  // Use high bandwidth to check output switch to 2.
-  CheckDecision(controller.get(), rtc::Optional<int>(kChannel1To2BandwidthBps),
-                2);
-}
-
-TEST(ChannelControllerTest, SwitchTo1ChannelOnLowUplinkBandwidth) {
-  constexpr int kInitChannels = 2;
-  auto controller = CreateChannelController(kInitChannels);
-  // Use low bandwidth to check output switch to 1.
-  CheckDecision(controller.get(), rtc::Optional<int>(kChannel2To1BandwidthBps),
-                1);
-}
-
-TEST(ChannelControllerTest, Maintain1ChannelOnMediumUplinkBandwidth) {
-  constexpr int kInitChannels = 1;
-  auto controller = CreateChannelController(kInitChannels);
-  // Use between-thresholds bandwidth to check output remains at 1.
-  CheckDecision(controller.get(), rtc::Optional<int>(kMediumBandwidthBps), 1);
-}
-
-TEST(ChannelControllerTest, Maintain2ChannelsOnMediumUplinkBandwidth) {
-  constexpr int kInitChannels = 2;
-  auto controller = CreateChannelController(kInitChannels);
-  // Use between-thresholds bandwidth to check output remains at 2.
-  CheckDecision(controller.get(), rtc::Optional<int>(kMediumBandwidthBps), 2);
-}
-
-TEST(ChannelControllerTest, CheckBehaviorOnChangingUplinkBandwidth) {
-  constexpr int kInitChannels = 1;
-  auto controller = CreateChannelController(kInitChannels);
-
-  // Use between-thresholds bandwidth to check output remains at 1.
-  CheckDecision(controller.get(), rtc::Optional<int>(kMediumBandwidthBps), 1);
-
-  // Use high bandwidth to check output switch to 2.
-  CheckDecision(controller.get(), rtc::Optional<int>(kChannel1To2BandwidthBps),
-                2);
-
-  // Use between-thresholds bandwidth to check output remains at 2.
-  CheckDecision(controller.get(), rtc::Optional<int>(kMediumBandwidthBps), 2);
-
-  // Use low bandwidth to check output switch to 1.
-  CheckDecision(controller.get(), rtc::Optional<int>(kChannel2To1BandwidthBps),
-                1);
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/audio_network_adaptor/config.proto b/modules/audio_coding/audio_network_adaptor/config.proto
deleted file mode 100644
index d510e41..0000000
--- a/modules/audio_coding/audio_network_adaptor/config.proto
+++ /dev/null
@@ -1,153 +0,0 @@
-syntax = "proto2";
-option optimize_for = LITE_RUNTIME;
-option java_package = "org.webrtc.AudioNetworkAdaptor";
-option java_outer_classname = "Config";
-package webrtc.audio_network_adaptor.config;
-
-message FecController {
-  message Threshold {
-    // Threshold defines a curve in the bandwidth/packet-loss domain. The
-    // curve is characterized by the two conjunction points: A and B.
-    //
-    // packet ^  |
-    //  loss  | A|
-    //        |   \        A: (low_bandwidth_bps, low_bandwidth_packet_loss)
-    //        |    \       B: (high_bandwidth_bps, high_bandwidth_packet_loss)
-    //        |    B\________
-    //        |---------------> bandwidth
-    optional int32 low_bandwidth_bps = 1;
-    optional float low_bandwidth_packet_loss = 2;
-    optional int32 high_bandwidth_bps = 3;
-    optional float high_bandwidth_packet_loss = 4;
-  }
-
-  // |fec_enabling_threshold| defines a curve, above which FEC should be
-  // enabled. |fec_disabling_threshold| defines a curve, under which FEC
-  // should be disabled. See below
-  //
-  // packet-loss ^   |  |
-  //             |   |  |   FEC
-  //             |    \  \   ON
-  //             | FEC \  \_______ fec_enabling_threshold
-  //             | OFF  \_________ fec_disabling_threshold
-  //             |-----------------> bandwidth
-  optional Threshold fec_enabling_threshold = 1;
-  optional Threshold fec_disabling_threshold = 2;
-
-  // |time_constant_ms| is the time constant for an exponential filter, which
-  // is used for smoothing the packet loss fraction.
-  optional int32 time_constant_ms = 3;
-}
-
-message FecControllerRplrBased {
-  message Threshold {
-    // Threshold defines a curve in the bandwidth/recoverable-packet-loss
-    // domain.
-    // The curve is characterized by the two conjunction points: A and B.
-    //
-    // recoverable ^
-    // packet      |  |
-    //  loss       | A|
-    //             |   \        A: (low_bandwidth_bps,
-    //             |    \           low_bandwidth_recoverable_packet_loss)
-    //             |     \       B: (high_bandwidth_bps,
-    //             |      \          high_bandwidth_recoverable_packet_loss)
-    //             |      B\________
-    //             |---------------> bandwidth
-    optional int32 low_bandwidth_bps = 1;
-    optional float low_bandwidth_recoverable_packet_loss = 2;
-    optional int32 high_bandwidth_bps = 3;
-    optional float high_bandwidth_recoverable_packet_loss = 4;
-  }
-
-  // |fec_enabling_threshold| defines a curve, above which FEC should be
-  // enabled. |fec_disabling_threshold| defines a curve, under which FEC
-  // should be disabled. See below
-  //
-  // packet-loss ^   |  |
-  //             |   |  |   FEC
-  //             |    \  \   ON
-  //             | FEC \  \_______ fec_enabling_threshold
-  //             | OFF  \_________ fec_disabling_threshold
-  //             |-----------------> bandwidth
-  optional Threshold fec_enabling_threshold = 1;
-  optional Threshold fec_disabling_threshold = 2;
-}
-
-message FrameLengthController {
-  // Uplink packet loss fraction below which frame length can increase.
-  optional float fl_increasing_packet_loss_fraction = 1;
-
-  // Uplink packet loss fraction above which frame length should decrease.
-  optional float fl_decreasing_packet_loss_fraction = 2;
-
-  // Uplink bandwidth below which frame length can switch from 20ms to 60ms.
-  optional int32 fl_20ms_to_60ms_bandwidth_bps = 3;
-
-  // Uplink bandwidth above which frame length should switch from 60ms to 20ms.
-  optional int32 fl_60ms_to_20ms_bandwidth_bps = 4;
-
-  // Uplink bandwidth below which frame length can switch from 60ms to 120ms.
-  optional int32 fl_60ms_to_120ms_bandwidth_bps = 5;
-
-  // Uplink bandwidth above which frame length should switch from 120ms to 60ms.
-  optional int32 fl_120ms_to_60ms_bandwidth_bps = 6;
-}
-
-message ChannelController {
-  // Uplink bandwidth above which the number of encoded channels should switch
-  // from 1 to 2.
-  optional int32 channel_1_to_2_bandwidth_bps = 1;
-
-  // Uplink bandwidth below which the number of encoded channels should switch
-  // from 2 to 1.
-  optional int32 channel_2_to_1_bandwidth_bps = 2;
-}
-
-message DtxController {
-  // Uplink bandwidth below which DTX should be switched on.
-  optional int32 dtx_enabling_bandwidth_bps = 1;
-
-  // Uplink bandwidth above which DTX should be switched off.
-  optional int32 dtx_disabling_bandwidth_bps = 2;
-}
-
-message BitrateController {}
-
-message Controller {
-  message ScoringPoint {
-    // |ScoringPoint| is a subspace of network condition. It is used for
-    // comparing the significance of controllers.
-    optional int32 uplink_bandwidth_bps = 1;
-    optional float uplink_packet_loss_fraction = 2;
-  }
-
-  // The distance from |scoring_point| to a given network condition defines
-  // the significance of this controller with respect that network condition.
-  // Shorter distance means higher significance. The significances of
-  // controllers determine their order in the processing pipeline. Controllers
-  // without |scoring_point| follow their default order in
-  // |ControllerManager::controllers|.
-  optional ScoringPoint scoring_point = 1;
-
-  oneof controller {
-    FecController fec_controller = 21;
-    FrameLengthController frame_length_controller = 22;
-    ChannelController channel_controller = 23;
-    DtxController dtx_controller = 24;
-    BitrateController bitrate_controller = 25;
-    FecControllerRplrBased fec_controller_rplr_based = 26;
-  }
-}
-
-message ControllerManager {
-  repeated Controller controllers = 1;
-
-  // Least time since last reordering for a new reordering to be made.
-  optional int32 min_reordering_time_ms = 2;
-
-  // Least squared distance from last scoring point for a new reordering to be
-  // made.
-  optional float min_reordering_squared_distance = 3;
-}
-
diff --git a/modules/audio_coding/audio_network_adaptor/controller.cc b/modules/audio_coding/audio_network_adaptor/controller.cc
deleted file mode 100644
index 549352f..0000000
--- a/modules/audio_coding/audio_network_adaptor/controller.cc
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- *  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/controller.h"
-
-namespace webrtc {
-
-Controller::NetworkMetrics::NetworkMetrics() = default;
-
-Controller::NetworkMetrics::~NetworkMetrics() = default;
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/audio_network_adaptor/controller.h b/modules/audio_coding/audio_network_adaptor/controller.h
deleted file mode 100644
index 38c2c21..0000000
--- a/modules/audio_coding/audio_network_adaptor/controller.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- *  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_CONTROLLER_H_
-#define WEBRTC_MODULES_AUDIO_CODING_AUDIO_NETWORK_ADAPTOR_CONTROLLER_H_
-
-#include "webrtc/api/optional.h"
-#include "webrtc/modules/audio_coding/audio_network_adaptor/include/audio_network_adaptor.h"
-
-namespace webrtc {
-
-class Controller {
- public:
-  struct NetworkMetrics {
-    NetworkMetrics();
-    ~NetworkMetrics();
-    rtc::Optional<int> uplink_bandwidth_bps;
-    rtc::Optional<float> uplink_packet_loss_fraction;
-    rtc::Optional<float> uplink_recoverable_packet_loss_fraction;
-    rtc::Optional<int> target_audio_bitrate_bps;
-    rtc::Optional<int> rtt_ms;
-    rtc::Optional<size_t> overhead_bytes_per_packet;
-  };
-
-  virtual ~Controller() = default;
-
-  // Informs network metrics update to this controller. Any non-empty field
-  // indicates an update on the corresponding network metric.
-  virtual void UpdateNetworkMetrics(const NetworkMetrics& network_metrics) = 0;
-
-  virtual void MakeDecision(AudioEncoderRuntimeConfig* config) = 0;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_CODING_AUDIO_NETWORK_ADAPTOR_CONTROLLER_H_
diff --git a/modules/audio_coding/audio_network_adaptor/controller_manager.cc b/modules/audio_coding/audio_network_adaptor/controller_manager.cc
deleted file mode 100644
index 425c213..0000000
--- a/modules/audio_coding/audio_network_adaptor/controller_manager.cc
+++ /dev/null
@@ -1,420 +0,0 @@
-/*
- *  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/controller_manager.h"
-
-#include <cmath>
-#include <utility>
-
-#include "webrtc/modules/audio_coding/audio_network_adaptor/bitrate_controller.h"
-#include "webrtc/modules/audio_coding/audio_network_adaptor/channel_controller.h"
-#include "webrtc/modules/audio_coding/audio_network_adaptor/debug_dump_writer.h"
-#include "webrtc/modules/audio_coding/audio_network_adaptor/dtx_controller.h"
-#include "webrtc/modules/audio_coding/audio_network_adaptor/fec_controller_plr_based.h"
-#include "webrtc/modules/audio_coding/audio_network_adaptor/fec_controller_rplr_based.h"
-#include "webrtc/modules/audio_coding/audio_network_adaptor/frame_length_controller.h"
-#include "webrtc/modules/audio_coding/audio_network_adaptor/util/threshold_curve.h"
-#include "webrtc/rtc_base/ignore_wundef.h"
-#include "webrtc/rtc_base/timeutils.h"
-
-#if WEBRTC_ENABLE_PROTOBUF
-RTC_PUSH_IGNORING_WUNDEF()
-#ifdef WEBRTC_ANDROID_PLATFORM_BUILD
-#include "external/webrtc/webrtc/modules/audio_coding/audio_network_adaptor/config.pb.h"
-#else
-#include "webrtc/modules/audio_coding/audio_network_adaptor/config.pb.h"
-#endif
-RTC_POP_IGNORING_WUNDEF()
-#endif
-
-namespace webrtc {
-
-namespace {
-
-#if WEBRTC_ENABLE_PROTOBUF
-
-std::unique_ptr<FecControllerPlrBased> CreateFecControllerPlrBased(
-    const audio_network_adaptor::config::FecController& config,
-    bool initial_fec_enabled) {
-  RTC_CHECK(config.has_fec_enabling_threshold());
-  RTC_CHECK(config.has_fec_disabling_threshold());
-  RTC_CHECK(config.has_time_constant_ms());
-
-  auto& fec_enabling_threshold = config.fec_enabling_threshold();
-  RTC_CHECK(fec_enabling_threshold.has_low_bandwidth_bps());
-  RTC_CHECK(fec_enabling_threshold.has_low_bandwidth_packet_loss());
-  RTC_CHECK(fec_enabling_threshold.has_high_bandwidth_bps());
-  RTC_CHECK(fec_enabling_threshold.has_high_bandwidth_packet_loss());
-
-  auto& fec_disabling_threshold = config.fec_disabling_threshold();
-  RTC_CHECK(fec_disabling_threshold.has_low_bandwidth_bps());
-  RTC_CHECK(fec_disabling_threshold.has_low_bandwidth_packet_loss());
-  RTC_CHECK(fec_disabling_threshold.has_high_bandwidth_bps());
-  RTC_CHECK(fec_disabling_threshold.has_high_bandwidth_packet_loss());
-
-  return std::unique_ptr<FecControllerPlrBased>(
-      new FecControllerPlrBased(FecControllerPlrBased::Config(
-          initial_fec_enabled,
-          ThresholdCurve(fec_enabling_threshold.low_bandwidth_bps(),
-                         fec_enabling_threshold.low_bandwidth_packet_loss(),
-                         fec_enabling_threshold.high_bandwidth_bps(),
-                         fec_enabling_threshold.high_bandwidth_packet_loss()),
-          ThresholdCurve(fec_disabling_threshold.low_bandwidth_bps(),
-                         fec_disabling_threshold.low_bandwidth_packet_loss(),
-                         fec_disabling_threshold.high_bandwidth_bps(),
-                         fec_disabling_threshold.high_bandwidth_packet_loss()),
-          config.time_constant_ms())));
-}
-
-std::unique_ptr<FecControllerRplrBased> CreateFecControllerRplrBased(
-    const audio_network_adaptor::config::FecControllerRplrBased& config,
-    bool initial_fec_enabled) {
-  RTC_CHECK(config.has_fec_enabling_threshold());
-  RTC_CHECK(config.has_fec_disabling_threshold());
-
-  auto& fec_enabling_threshold = config.fec_enabling_threshold();
-  RTC_CHECK(fec_enabling_threshold.has_low_bandwidth_bps());
-  RTC_CHECK(fec_enabling_threshold.has_low_bandwidth_recoverable_packet_loss());
-  RTC_CHECK(fec_enabling_threshold.has_high_bandwidth_bps());
-  RTC_CHECK(
-      fec_enabling_threshold.has_high_bandwidth_recoverable_packet_loss());
-
-  auto& fec_disabling_threshold = config.fec_disabling_threshold();
-  RTC_CHECK(fec_disabling_threshold.has_low_bandwidth_bps());
-  RTC_CHECK(
-      fec_disabling_threshold.has_low_bandwidth_recoverable_packet_loss());
-  RTC_CHECK(fec_disabling_threshold.has_high_bandwidth_bps());
-  RTC_CHECK(
-      fec_disabling_threshold.has_high_bandwidth_recoverable_packet_loss());
-
-  return std::unique_ptr<FecControllerRplrBased>(
-      new FecControllerRplrBased(FecControllerRplrBased::Config(
-          initial_fec_enabled,
-          ThresholdCurve(
-              fec_enabling_threshold.low_bandwidth_bps(),
-              fec_enabling_threshold.low_bandwidth_recoverable_packet_loss(),
-              fec_enabling_threshold.high_bandwidth_bps(),
-              fec_enabling_threshold.high_bandwidth_recoverable_packet_loss()),
-          ThresholdCurve(
-              fec_disabling_threshold.low_bandwidth_bps(),
-              fec_disabling_threshold.low_bandwidth_recoverable_packet_loss(),
-              fec_disabling_threshold.high_bandwidth_bps(),
-              fec_disabling_threshold
-                  .high_bandwidth_recoverable_packet_loss()))));
-}
-
-std::unique_ptr<FrameLengthController> CreateFrameLengthController(
-    const audio_network_adaptor::config::FrameLengthController& config,
-    rtc::ArrayView<const int> encoder_frame_lengths_ms,
-    int initial_frame_length_ms,
-    int min_encoder_bitrate_bps) {
-  RTC_CHECK(config.has_fl_increasing_packet_loss_fraction());
-  RTC_CHECK(config.has_fl_decreasing_packet_loss_fraction());
-  RTC_CHECK(config.has_fl_20ms_to_60ms_bandwidth_bps());
-  RTC_CHECK(config.has_fl_60ms_to_20ms_bandwidth_bps());
-
-  std::map<FrameLengthController::Config::FrameLengthChange, int>
-      fl_changing_bandwidths_bps = {
-          {FrameLengthController::Config::FrameLengthChange(20, 60),
-           config.fl_20ms_to_60ms_bandwidth_bps()},
-          {FrameLengthController::Config::FrameLengthChange(60, 20),
-           config.fl_60ms_to_20ms_bandwidth_bps()}};
-
-  if (config.has_fl_60ms_to_120ms_bandwidth_bps() &&
-      config.has_fl_120ms_to_60ms_bandwidth_bps()) {
-    fl_changing_bandwidths_bps.insert(std::make_pair(
-        FrameLengthController::Config::FrameLengthChange(60, 120),
-        config.fl_60ms_to_120ms_bandwidth_bps()));
-    fl_changing_bandwidths_bps.insert(std::make_pair(
-        FrameLengthController::Config::FrameLengthChange(120, 60),
-        config.fl_120ms_to_60ms_bandwidth_bps()));
-  }
-
-  FrameLengthController::Config ctor_config(
-      std::vector<int>(), initial_frame_length_ms, min_encoder_bitrate_bps,
-      config.fl_increasing_packet_loss_fraction(),
-      config.fl_decreasing_packet_loss_fraction(),
-      std::move(fl_changing_bandwidths_bps));
-
-  for (auto frame_length : encoder_frame_lengths_ms)
-    ctor_config.encoder_frame_lengths_ms.push_back(frame_length);
-
-  return std::unique_ptr<FrameLengthController>(
-      new FrameLengthController(ctor_config));
-}
-
-std::unique_ptr<ChannelController> CreateChannelController(
-    const audio_network_adaptor::config::ChannelController& config,
-    size_t num_encoder_channels,
-    size_t intial_channels_to_encode) {
-  RTC_CHECK(config.has_channel_1_to_2_bandwidth_bps());
-  RTC_CHECK(config.has_channel_2_to_1_bandwidth_bps());
-
-  return std::unique_ptr<ChannelController>(new ChannelController(
-      ChannelController::Config(num_encoder_channels, intial_channels_to_encode,
-                                config.channel_1_to_2_bandwidth_bps(),
-                                config.channel_2_to_1_bandwidth_bps())));
-}
-
-std::unique_ptr<DtxController> CreateDtxController(
-    const audio_network_adaptor::config::DtxController& dtx_config,
-    bool initial_dtx_enabled) {
-  RTC_CHECK(dtx_config.has_dtx_enabling_bandwidth_bps());
-  RTC_CHECK(dtx_config.has_dtx_disabling_bandwidth_bps());
-
-  return std::unique_ptr<DtxController>(new DtxController(DtxController::Config(
-      initial_dtx_enabled, dtx_config.dtx_enabling_bandwidth_bps(),
-      dtx_config.dtx_disabling_bandwidth_bps())));
-}
-
-using audio_network_adaptor::BitrateController;
-std::unique_ptr<BitrateController> CreateBitrateController(
-    int initial_bitrate_bps,
-    int initial_frame_length_ms) {
-  return std::unique_ptr<BitrateController>(new BitrateController(
-      BitrateController::Config(initial_bitrate_bps, initial_frame_length_ms)));
-}
-#endif  // WEBRTC_ENABLE_PROTOBUF
-
-}  // namespace
-
-ControllerManagerImpl::Config::Config(int min_reordering_time_ms,
-                                      float min_reordering_squared_distance)
-    : min_reordering_time_ms(min_reordering_time_ms),
-      min_reordering_squared_distance(min_reordering_squared_distance) {}
-
-ControllerManagerImpl::Config::~Config() = default;
-
-std::unique_ptr<ControllerManager> ControllerManagerImpl::Create(
-    const ProtoString& config_string,
-    size_t num_encoder_channels,
-    rtc::ArrayView<const int> encoder_frame_lengths_ms,
-    int min_encoder_bitrate_bps,
-    size_t intial_channels_to_encode,
-    int initial_frame_length_ms,
-    int initial_bitrate_bps,
-    bool initial_fec_enabled,
-    bool initial_dtx_enabled) {
-  return Create(config_string, num_encoder_channels, encoder_frame_lengths_ms,
-                min_encoder_bitrate_bps, intial_channels_to_encode,
-                initial_frame_length_ms, initial_bitrate_bps,
-                initial_fec_enabled, initial_dtx_enabled, nullptr);
-}
-
-std::unique_ptr<ControllerManager> ControllerManagerImpl::Create(
-    const ProtoString& config_string,
-    size_t num_encoder_channels,
-    rtc::ArrayView<const int> encoder_frame_lengths_ms,
-    int min_encoder_bitrate_bps,
-    size_t intial_channels_to_encode,
-    int initial_frame_length_ms,
-    int initial_bitrate_bps,
-    bool initial_fec_enabled,
-    bool initial_dtx_enabled,
-    DebugDumpWriter* debug_dump_writer) {
-#if WEBRTC_ENABLE_PROTOBUF
-  audio_network_adaptor::config::ControllerManager controller_manager_config;
-  RTC_CHECK(controller_manager_config.ParseFromString(config_string));
-  if (debug_dump_writer)
-    debug_dump_writer->DumpControllerManagerConfig(controller_manager_config,
-                                                   rtc::TimeMillis());
-
-  std::vector<std::unique_ptr<Controller>> controllers;
-  std::map<const Controller*, std::pair<int, float>> scoring_points;
-
-  for (int i = 0; i < controller_manager_config.controllers_size(); ++i) {
-    auto& controller_config = controller_manager_config.controllers(i);
-    std::unique_ptr<Controller> controller;
-    switch (controller_config.controller_case()) {
-      case audio_network_adaptor::config::Controller::kFecController:
-        controller = CreateFecControllerPlrBased(
-            controller_config.fec_controller(), initial_fec_enabled);
-        break;
-      case audio_network_adaptor::config::Controller::kFecControllerRplrBased:
-        controller = CreateFecControllerRplrBased(
-            controller_config.fec_controller_rplr_based(), initial_fec_enabled);
-        break;
-      case audio_network_adaptor::config::Controller::kFrameLengthController:
-        controller = CreateFrameLengthController(
-            controller_config.frame_length_controller(),
-            encoder_frame_lengths_ms, initial_frame_length_ms,
-            min_encoder_bitrate_bps);
-        break;
-      case audio_network_adaptor::config::Controller::kChannelController:
-        controller = CreateChannelController(
-            controller_config.channel_controller(), num_encoder_channels,
-            intial_channels_to_encode);
-        break;
-      case audio_network_adaptor::config::Controller::kDtxController:
-        controller = CreateDtxController(controller_config.dtx_controller(),
-                                         initial_dtx_enabled);
-        break;
-      case audio_network_adaptor::config::Controller::kBitrateController:
-        controller = CreateBitrateController(initial_bitrate_bps,
-                                             initial_frame_length_ms);
-        break;
-      default:
-        RTC_NOTREACHED();
-    }
-    if (controller_config.has_scoring_point()) {
-      auto& scoring_point = controller_config.scoring_point();
-      RTC_CHECK(scoring_point.has_uplink_bandwidth_bps());
-      RTC_CHECK(scoring_point.has_uplink_packet_loss_fraction());
-      scoring_points[controller.get()] = std::make_pair<int, float>(
-          scoring_point.uplink_bandwidth_bps(),
-          scoring_point.uplink_packet_loss_fraction());
-    }
-    controllers.push_back(std::move(controller));
-  }
-
-  if (scoring_points.size() == 0) {
-    return std::unique_ptr<ControllerManagerImpl>(new ControllerManagerImpl(
-        ControllerManagerImpl::Config(0, 0), std::move(controllers),
-        scoring_points));
-  } else {
-    RTC_CHECK(controller_manager_config.has_min_reordering_time_ms());
-    RTC_CHECK(controller_manager_config.has_min_reordering_squared_distance());
-    return std::unique_ptr<ControllerManagerImpl>(new ControllerManagerImpl(
-        ControllerManagerImpl::Config(
-            controller_manager_config.min_reordering_time_ms(),
-            controller_manager_config.min_reordering_squared_distance()),
-        std::move(controllers), scoring_points));
-  }
-
-#else
-  RTC_NOTREACHED();
-  return nullptr;
-#endif  // WEBRTC_ENABLE_PROTOBUF
-}
-
-ControllerManagerImpl::ControllerManagerImpl(const Config& config)
-    : ControllerManagerImpl(
-          config,
-          std::vector<std::unique_ptr<Controller>>(),
-          std::map<const Controller*, std::pair<int, float>>()) {}
-
-ControllerManagerImpl::ControllerManagerImpl(
-    const Config& config,
-    std::vector<std::unique_ptr<Controller>> controllers,
-    const std::map<const Controller*, std::pair<int, float>>& scoring_points)
-    : config_(config),
-      controllers_(std::move(controllers)),
-      last_reordering_time_ms_(rtc::Optional<int64_t>()),
-      last_scoring_point_(0, 0.0) {
-  for (auto& controller : controllers_)
-    default_sorted_controllers_.push_back(controller.get());
-  sorted_controllers_ = default_sorted_controllers_;
-  for (auto& controller_point : scoring_points) {
-    controller_scoring_points_.insert(std::make_pair(
-        controller_point.first, ScoringPoint(controller_point.second.first,
-                                             controller_point.second.second)));
-  }
-}
-
-ControllerManagerImpl::~ControllerManagerImpl() = default;
-
-std::vector<Controller*> ControllerManagerImpl::GetSortedControllers(
-    const Controller::NetworkMetrics& metrics) {
-  if (controller_scoring_points_.size() == 0)
-    return default_sorted_controllers_;
-
-  if (!metrics.uplink_bandwidth_bps || !metrics.uplink_packet_loss_fraction)
-    return sorted_controllers_;
-
-  const int64_t now_ms = rtc::TimeMillis();
-  if (last_reordering_time_ms_ &&
-      now_ms - *last_reordering_time_ms_ < config_.min_reordering_time_ms)
-    return sorted_controllers_;
-
-  ScoringPoint scoring_point(*metrics.uplink_bandwidth_bps,
-                             *metrics.uplink_packet_loss_fraction);
-
-  if (last_reordering_time_ms_ &&
-      last_scoring_point_.SquaredDistanceTo(scoring_point) <
-          config_.min_reordering_squared_distance)
-    return sorted_controllers_;
-
-  // Sort controllers according to the distances of |scoring_point| to the
-  // scoring points of controllers.
-  //
-  // A controller that does not associate with any scoring point
-  // are treated as if
-  // 1) they are less important than any controller that has a scoring point,
-  // 2) they are equally important to any controller that has no scoring point,
-  //    and their relative order will follow |default_sorted_controllers_|.
-  std::vector<Controller*> sorted_controllers(default_sorted_controllers_);
-  std::stable_sort(
-      sorted_controllers.begin(), sorted_controllers.end(),
-      [this, &scoring_point](const Controller* lhs, const Controller* rhs) {
-        auto lhs_scoring_point = controller_scoring_points_.find(lhs);
-        auto rhs_scoring_point = controller_scoring_points_.find(rhs);
-
-        if (lhs_scoring_point == controller_scoring_points_.end())
-          return false;
-
-        if (rhs_scoring_point == controller_scoring_points_.end())
-          return true;
-
-        return lhs_scoring_point->second.SquaredDistanceTo(scoring_point) <
-               rhs_scoring_point->second.SquaredDistanceTo(scoring_point);
-      });
-
-  if (sorted_controllers_ != sorted_controllers) {
-    sorted_controllers_ = sorted_controllers;
-    last_reordering_time_ms_ = rtc::Optional<int64_t>(now_ms);
-    last_scoring_point_ = scoring_point;
-  }
-  return sorted_controllers_;
-}
-
-std::vector<Controller*> ControllerManagerImpl::GetControllers() const {
-  return default_sorted_controllers_;
-}
-
-ControllerManagerImpl::ScoringPoint::ScoringPoint(
-    int uplink_bandwidth_bps,
-    float uplink_packet_loss_fraction)
-    : uplink_bandwidth_bps(uplink_bandwidth_bps),
-      uplink_packet_loss_fraction(uplink_packet_loss_fraction) {}
-
-namespace {
-
-constexpr int kMinUplinkBandwidthBps = 0;
-constexpr int kMaxUplinkBandwidthBps = 120000;
-
-float NormalizeUplinkBandwidth(int uplink_bandwidth_bps) {
-  uplink_bandwidth_bps =
-      std::min(kMaxUplinkBandwidthBps,
-               std::max(kMinUplinkBandwidthBps, uplink_bandwidth_bps));
-  return static_cast<float>(uplink_bandwidth_bps - kMinUplinkBandwidthBps) /
-         (kMaxUplinkBandwidthBps - kMinUplinkBandwidthBps);
-}
-
-float NormalizePacketLossFraction(float uplink_packet_loss_fraction) {
-  // |uplink_packet_loss_fraction| is seldom larger than 0.3, so we scale it up
-  // by 3.3333f.
-  return std::min(uplink_packet_loss_fraction * 3.3333f, 1.0f);
-}
-
-}  // namespace
-
-float ControllerManagerImpl::ScoringPoint::SquaredDistanceTo(
-    const ScoringPoint& scoring_point) const {
-  float diff_normalized_bitrate_bps =
-      NormalizeUplinkBandwidth(scoring_point.uplink_bandwidth_bps) -
-      NormalizeUplinkBandwidth(uplink_bandwidth_bps);
-  float diff_normalized_packet_loss =
-      NormalizePacketLossFraction(scoring_point.uplink_packet_loss_fraction) -
-      NormalizePacketLossFraction(uplink_packet_loss_fraction);
-  return std::pow(diff_normalized_bitrate_bps, 2) +
-         std::pow(diff_normalized_packet_loss, 2);
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/audio_network_adaptor/controller_manager.h b/modules/audio_coding/audio_network_adaptor/controller_manager.h
deleted file mode 100644
index 600fe65..0000000
--- a/modules/audio_coding/audio_network_adaptor/controller_manager.h
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- *  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_CONTROLLER_MANAGER_H_
-#define WEBRTC_MODULES_AUDIO_CODING_AUDIO_NETWORK_ADAPTOR_CONTROLLER_MANAGER_H_
-
-#include <map>
-#include <memory>
-#include <vector>
-
-#include "webrtc/modules/audio_coding/audio_network_adaptor/controller.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/protobuf_utils.h"
-
-namespace webrtc {
-
-class DebugDumpWriter;
-
-class ControllerManager {
- public:
-  virtual ~ControllerManager() = default;
-
-  // Sort controllers based on their significance.
-  virtual std::vector<Controller*> GetSortedControllers(
-      const Controller::NetworkMetrics& metrics) = 0;
-
-  virtual std::vector<Controller*> GetControllers() const = 0;
-};
-
-class ControllerManagerImpl final : public ControllerManager {
- public:
-  struct Config {
-    Config(int min_reordering_time_ms, float min_reordering_squared_distance);
-    ~Config();
-    // Least time since last reordering for a new reordering to be made.
-    int min_reordering_time_ms;
-    // Least squared distance from last scoring point for a new reordering to be
-    // made.
-    float min_reordering_squared_distance;
-  };
-
-  static std::unique_ptr<ControllerManager> Create(
-      const ProtoString& config_string,
-      size_t num_encoder_channels,
-      rtc::ArrayView<const int> encoder_frame_lengths_ms,
-      int min_encoder_bitrate_bps,
-      size_t intial_channels_to_encode,
-      int initial_frame_length_ms,
-      int initial_bitrate_bps,
-      bool initial_fec_enabled,
-      bool initial_dtx_enabled);
-
-  static std::unique_ptr<ControllerManager> Create(
-      const ProtoString& config_string,
-      size_t num_encoder_channels,
-      rtc::ArrayView<const int> encoder_frame_lengths_ms,
-      int min_encoder_bitrate_bps,
-      size_t intial_channels_to_encode,
-      int initial_frame_length_ms,
-      int initial_bitrate_bps,
-      bool initial_fec_enabled,
-      bool initial_dtx_enabled,
-      DebugDumpWriter* debug_dump_writer);
-
-  explicit ControllerManagerImpl(const Config& config);
-
-  // Dependency injection for testing.
-  ControllerManagerImpl(
-      const Config& config,
-      std::vector<std::unique_ptr<Controller>> controllers,
-      const std::map<const Controller*, std::pair<int, float>>&
-          chracteristic_points);
-
-  ~ControllerManagerImpl() override;
-
-  // Sort controllers based on their significance.
-  std::vector<Controller*> GetSortedControllers(
-      const Controller::NetworkMetrics& metrics) override;
-
-  std::vector<Controller*> GetControllers() const override;
-
- private:
-  // Scoring point is a subset of NetworkMetrics that is used for comparing the
-  // significance of controllers.
-  struct ScoringPoint {
-    // TODO(eladalon): Do we want to experiment with RPLR-based scoring?
-    ScoringPoint(int uplink_bandwidth_bps, float uplink_packet_loss_fraction);
-
-    // Calculate the normalized [0,1] distance between two scoring points.
-    float SquaredDistanceTo(const ScoringPoint& scoring_point) const;
-
-    int uplink_bandwidth_bps;
-    float uplink_packet_loss_fraction;
-  };
-
-  const Config config_;
-
-  std::vector<std::unique_ptr<Controller>> controllers_;
-
-  rtc::Optional<int64_t> last_reordering_time_ms_;
-  ScoringPoint last_scoring_point_;
-
-  std::vector<Controller*> default_sorted_controllers_;
-
-  std::vector<Controller*> sorted_controllers_;
-
-  // |scoring_points_| saves the scoring points of various
-  // controllers.
-  std::map<const Controller*, ScoringPoint> controller_scoring_points_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(ControllerManagerImpl);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_CODING_AUDIO_NETWORK_ADAPTOR_CONTROLLER_MANAGER_H_
diff --git a/modules/audio_coding/audio_network_adaptor/controller_manager_unittest.cc b/modules/audio_coding/audio_network_adaptor/controller_manager_unittest.cc
deleted file mode 100644
index aa4ff36..0000000
--- a/modules/audio_coding/audio_network_adaptor/controller_manager_unittest.cc
+++ /dev/null
@@ -1,488 +0,0 @@
-/*
- *  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/controller_manager.h"
-#include "webrtc/modules/audio_coding/audio_network_adaptor/mock/mock_controller.h"
-#include "webrtc/modules/audio_coding/audio_network_adaptor/mock/mock_debug_dump_writer.h"
-#include "webrtc/rtc_base/fakeclock.h"
-#include "webrtc/rtc_base/ignore_wundef.h"
-#include "webrtc/rtc_base/protobuf_utils.h"
-#include "webrtc/test/gtest.h"
-
-#if WEBRTC_ENABLE_PROTOBUF
-RTC_PUSH_IGNORING_WUNDEF()
-#ifdef WEBRTC_ANDROID_PLATFORM_BUILD
-#include "external/webrtc/webrtc/modules/audio_coding/audio_network_adaptor/config.pb.h"
-#else
-#include "webrtc/modules/audio_coding/audio_network_adaptor/config.pb.h"
-#endif
-RTC_POP_IGNORING_WUNDEF()
-#endif
-
-namespace webrtc {
-
-using ::testing::_;
-using ::testing::NiceMock;
-
-namespace {
-
-constexpr size_t kNumControllers = 4;
-constexpr int kChracteristicBandwithBps[2] = {15000, 0};
-constexpr float kChracteristicPacketLossFraction[2] = {0.2f, 0.0f};
-constexpr int kMinReorderingTimeMs = 200;
-constexpr int kFactor = 100;
-constexpr float kMinReorderingSquareDistance = 1.0f / kFactor / kFactor;
-
-// |kMinUplinkBandwidthBps| and |kMaxUplinkBandwidthBps| are copied from
-// controller_manager.cc
-constexpr int kMinUplinkBandwidthBps = 0;
-constexpr int kMaxUplinkBandwidthBps = 120000;
-constexpr int kMinBandwithChangeBps =
-    (kMaxUplinkBandwidthBps - kMinUplinkBandwidthBps) / kFactor;
-
-struct ControllerManagerStates {
-  std::unique_ptr<ControllerManager> controller_manager;
-  std::vector<MockController*> mock_controllers;
-};
-
-ControllerManagerStates CreateControllerManager() {
-  ControllerManagerStates states;
-  std::vector<std::unique_ptr<Controller>> controllers;
-  std::map<const Controller*, std::pair<int, float>> chracteristic_points;
-  for (size_t i = 0; i < kNumControllers; ++i) {
-    auto controller =
-        std::unique_ptr<MockController>(new NiceMock<MockController>());
-    EXPECT_CALL(*controller, Die());
-    states.mock_controllers.push_back(controller.get());
-    controllers.push_back(std::move(controller));
-  }
-
-  // Assign characteristic points to the last two controllers.
-  chracteristic_points[states.mock_controllers[kNumControllers - 2]] =
-      std::make_pair(kChracteristicBandwithBps[0],
-                     kChracteristicPacketLossFraction[0]);
-  chracteristic_points[states.mock_controllers[kNumControllers - 1]] =
-      std::make_pair(kChracteristicBandwithBps[1],
-                     kChracteristicPacketLossFraction[1]);
-
-  states.controller_manager.reset(new ControllerManagerImpl(
-      ControllerManagerImpl::Config(kMinReorderingTimeMs,
-                                    kMinReorderingSquareDistance),
-      std::move(controllers), chracteristic_points));
-  return states;
-}
-
-// |expected_order| contains the expected indices of all controllers in the
-// vector of controllers returned by GetSortedControllers(). A negative index
-// means that we do not care about its exact place, but we do check that it
-// exists in the vector.
-void CheckControllersOrder(
-    ControllerManagerStates* states,
-    const rtc::Optional<int>& uplink_bandwidth_bps,
-    const rtc::Optional<float>& uplink_packet_loss_fraction,
-    const std::vector<int>& expected_order) {
-  RTC_DCHECK_EQ(kNumControllers, expected_order.size());
-  Controller::NetworkMetrics metrics;
-  metrics.uplink_bandwidth_bps = uplink_bandwidth_bps;
-  metrics.uplink_packet_loss_fraction = uplink_packet_loss_fraction;
-  auto check = states->controller_manager->GetSortedControllers(metrics);
-  EXPECT_EQ(states->mock_controllers.size(), check.size());
-  for (size_t i = 0; i < states->mock_controllers.size(); ++i) {
-    if (expected_order[i] >= 0) {
-      EXPECT_EQ(states->mock_controllers[i], check[expected_order[i]]);
-    } else {
-      EXPECT_NE(check.end(), std::find(check.begin(), check.end(),
-                                       states->mock_controllers[i]));
-    }
-  }
-}
-
-}  // namespace
-
-TEST(ControllerManagerTest, GetControllersReturnAllControllers) {
-  auto states = CreateControllerManager();
-  auto check = states.controller_manager->GetControllers();
-  // Verify that controllers in |check| are one-to-one mapped to those in
-  // |mock_controllers_|.
-  EXPECT_EQ(states.mock_controllers.size(), check.size());
-  for (auto& controller : check)
-    EXPECT_NE(states.mock_controllers.end(),
-              std::find(states.mock_controllers.begin(),
-                        states.mock_controllers.end(), controller));
-}
-
-TEST(ControllerManagerTest, ControllersInDefaultOrderOnEmptyNetworkMetrics) {
-  auto states = CreateControllerManager();
-  // |network_metrics| are empty, and the controllers are supposed to follow the
-  // default order.
-  CheckControllersOrder(&states, rtc::Optional<int>(), rtc::Optional<float>(),
-                        {0, 1, 2, 3});
-}
-
-TEST(ControllerManagerTest, ControllersWithoutCharPointAtEndAndInDefaultOrder) {
-  auto states = CreateControllerManager();
-  CheckControllersOrder(&states, rtc::Optional<int>(0),
-                        rtc::Optional<float>(0.0),
-                        {kNumControllers - 2, kNumControllers - 1, -1, -1});
-}
-
-TEST(ControllerManagerTest, ControllersWithCharPointDependOnNetworkMetrics) {
-  auto states = CreateControllerManager();
-  CheckControllersOrder(
-      &states, rtc::Optional<int>(kChracteristicBandwithBps[1]),
-      rtc::Optional<float>(kChracteristicPacketLossFraction[1]),
-      {kNumControllers - 2, kNumControllers - 1, 1, 0});
-}
-
-TEST(ControllerManagerTest, DoNotReorderBeforeMinReordingTime) {
-  rtc::ScopedFakeClock fake_clock;
-  auto states = CreateControllerManager();
-  CheckControllersOrder(
-      &states, rtc::Optional<int>(kChracteristicBandwithBps[0]),
-      rtc::Optional<float>(kChracteristicPacketLossFraction[0]),
-      {kNumControllers - 2, kNumControllers - 1, 0, 1});
-  fake_clock.AdvanceTime(
-      rtc::TimeDelta::FromMilliseconds(kMinReorderingTimeMs - 1));
-  // Move uplink bandwidth and packet loss fraction to the other controller's
-  // characteristic point, which would cause controller manager to reorder the
-  // controllers if time had reached min reordering time.
-  CheckControllersOrder(
-      &states, rtc::Optional<int>(kChracteristicBandwithBps[1]),
-      rtc::Optional<float>(kChracteristicPacketLossFraction[1]),
-      {kNumControllers - 2, kNumControllers - 1, 0, 1});
-}
-
-TEST(ControllerManagerTest, ReorderBeyondMinReordingTimeAndMinDistance) {
-  rtc::ScopedFakeClock fake_clock;
-  auto states = CreateControllerManager();
-  constexpr int kBandwidthBps =
-      (kChracteristicBandwithBps[0] + kChracteristicBandwithBps[1]) / 2;
-  constexpr float kPacketLossFraction = (kChracteristicPacketLossFraction[0] +
-                                         kChracteristicPacketLossFraction[1]) /
-                                        2.0f;
-  // Set network metrics to be in the middle between the characteristic points
-  // of two controllers.
-  CheckControllersOrder(&states, rtc::Optional<int>(kBandwidthBps),
-                        rtc::Optional<float>(kPacketLossFraction),
-                        {kNumControllers - 2, kNumControllers - 1, 0, 1});
-  fake_clock.AdvanceTime(
-      rtc::TimeDelta::FromMilliseconds(kMinReorderingTimeMs));
-  // Then let network metrics move a little towards the other controller.
-  CheckControllersOrder(
-      &states, rtc::Optional<int>(kBandwidthBps - kMinBandwithChangeBps - 1),
-      rtc::Optional<float>(kPacketLossFraction),
-      {kNumControllers - 2, kNumControllers - 1, 1, 0});
-}
-
-TEST(ControllerManagerTest, DoNotReorderIfNetworkMetricsChangeTooSmall) {
-  rtc::ScopedFakeClock fake_clock;
-  auto states = CreateControllerManager();
-  constexpr int kBandwidthBps =
-      (kChracteristicBandwithBps[0] + kChracteristicBandwithBps[1]) / 2;
-  constexpr float kPacketLossFraction = (kChracteristicPacketLossFraction[0] +
-                                         kChracteristicPacketLossFraction[1]) /
-                                        2.0f;
-  // Set network metrics to be in the middle between the characteristic points
-  // of two controllers.
-  CheckControllersOrder(&states, rtc::Optional<int>(kBandwidthBps),
-                        rtc::Optional<float>(kPacketLossFraction),
-                        {kNumControllers - 2, kNumControllers - 1, 0, 1});
-  fake_clock.AdvanceTime(
-      rtc::TimeDelta::FromMilliseconds(kMinReorderingTimeMs));
-  // Then let network metrics move a little towards the other controller.
-  CheckControllersOrder(
-      &states, rtc::Optional<int>(kBandwidthBps - kMinBandwithChangeBps + 1),
-      rtc::Optional<float>(kPacketLossFraction),
-      {kNumControllers - 2, kNumControllers - 1, 0, 1});
-}
-
-#if WEBRTC_ENABLE_PROTOBUF
-
-namespace {
-
-void AddBitrateControllerConfig(
-    audio_network_adaptor::config::ControllerManager* config) {
-  config->add_controllers()->mutable_bitrate_controller();
-}
-
-void AddChannelControllerConfig(
-    audio_network_adaptor::config::ControllerManager* config) {
-  auto controller_config =
-      config->add_controllers()->mutable_channel_controller();
-  controller_config->set_channel_1_to_2_bandwidth_bps(31000);
-  controller_config->set_channel_2_to_1_bandwidth_bps(29000);
-}
-
-void AddDtxControllerConfig(
-    audio_network_adaptor::config::ControllerManager* config) {
-  auto controller_config = config->add_controllers()->mutable_dtx_controller();
-  controller_config->set_dtx_enabling_bandwidth_bps(55000);
-  controller_config->set_dtx_disabling_bandwidth_bps(65000);
-}
-
-void AddFecControllerConfig(
-    audio_network_adaptor::config::ControllerManager* config) {
-  auto controller_config_ext = config->add_controllers();
-  auto controller_config = controller_config_ext->mutable_fec_controller();
-  auto fec_enabling_threshold =
-      controller_config->mutable_fec_enabling_threshold();
-  fec_enabling_threshold->set_low_bandwidth_bps(17000);
-  fec_enabling_threshold->set_low_bandwidth_packet_loss(0.1f);
-  fec_enabling_threshold->set_high_bandwidth_bps(64000);
-  fec_enabling_threshold->set_high_bandwidth_packet_loss(0.05f);
-  auto fec_disabling_threshold =
-      controller_config->mutable_fec_disabling_threshold();
-  fec_disabling_threshold->set_low_bandwidth_bps(15000);
-  fec_disabling_threshold->set_low_bandwidth_packet_loss(0.08f);
-  fec_disabling_threshold->set_high_bandwidth_bps(64000);
-  fec_disabling_threshold->set_high_bandwidth_packet_loss(0.01f);
-  controller_config->set_time_constant_ms(500);
-
-  auto scoring_point = controller_config_ext->mutable_scoring_point();
-  scoring_point->set_uplink_bandwidth_bps(kChracteristicBandwithBps[0]);
-  scoring_point->set_uplink_packet_loss_fraction(
-      kChracteristicPacketLossFraction[0]);
-}
-
-void AddFrameLengthControllerConfig(
-    audio_network_adaptor::config::ControllerManager* config) {
-  auto controller_config_ext = config->add_controllers();
-  auto controller_config =
-      controller_config_ext->mutable_frame_length_controller();
-  controller_config->set_fl_decreasing_packet_loss_fraction(0.05f);
-  controller_config->set_fl_increasing_packet_loss_fraction(0.04f);
-  controller_config->set_fl_20ms_to_60ms_bandwidth_bps(72000);
-  controller_config->set_fl_60ms_to_20ms_bandwidth_bps(88000);
-
-  auto scoring_point = controller_config_ext->mutable_scoring_point();
-  scoring_point->set_uplink_bandwidth_bps(kChracteristicBandwithBps[1]);
-  scoring_point->set_uplink_packet_loss_fraction(
-      kChracteristicPacketLossFraction[1]);
-}
-
-constexpr int kInitialBitrateBps = 24000;
-constexpr size_t kIntialChannelsToEncode = 1;
-constexpr bool kInitialDtxEnabled = true;
-constexpr bool kInitialFecEnabled = true;
-constexpr int kInitialFrameLengthMs = 60;
-constexpr int kMinBitrateBps = 6000;
-
-ControllerManagerStates CreateControllerManager(
-    const ProtoString& config_string) {
-  ControllerManagerStates states;
-  constexpr size_t kNumEncoderChannels = 2;
-  const std::vector<int> encoder_frame_lengths_ms = {20, 60};
-  states.controller_manager = ControllerManagerImpl::Create(
-      config_string, kNumEncoderChannels, encoder_frame_lengths_ms,
-      kMinBitrateBps, kIntialChannelsToEncode, kInitialFrameLengthMs,
-      kInitialBitrateBps, kInitialFecEnabled, kInitialDtxEnabled);
-  return states;
-}
-
-enum class ControllerType : int8_t {
-  FEC,
-  CHANNEL,
-  DTX,
-  FRAME_LENGTH,
-  BIT_RATE
-};
-
-void CheckControllersOrder(const std::vector<Controller*>& controllers,
-                           const std::vector<ControllerType>& expected_types) {
-  ASSERT_EQ(expected_types.size(), controllers.size());
-
-  // We also check that the controllers follow the initial settings.
-  AudioEncoderRuntimeConfig encoder_config;
-
-  for (size_t i = 0; i < controllers.size(); ++i) {
-    AudioEncoderRuntimeConfig encoder_config;
-    // We check the order of |controllers| by judging their decisions.
-    controllers[i]->MakeDecision(&encoder_config);
-
-    // Since controllers are not provided with network metrics, they give the
-    // initial values.
-    switch (expected_types[i]) {
-      case ControllerType::FEC:
-        EXPECT_EQ(rtc::Optional<bool>(kInitialFecEnabled),
-                  encoder_config.enable_fec);
-        break;
-      case ControllerType::CHANNEL:
-        EXPECT_EQ(rtc::Optional<size_t>(kIntialChannelsToEncode),
-                  encoder_config.num_channels);
-        break;
-      case ControllerType::DTX:
-        EXPECT_EQ(rtc::Optional<bool>(kInitialDtxEnabled),
-                  encoder_config.enable_dtx);
-        break;
-      case ControllerType::FRAME_LENGTH:
-        EXPECT_EQ(rtc::Optional<int>(kInitialFrameLengthMs),
-                  encoder_config.frame_length_ms);
-        break;
-      case ControllerType::BIT_RATE:
-        EXPECT_EQ(rtc::Optional<int>(kInitialBitrateBps),
-                  encoder_config.bitrate_bps);
-    }
-  }
-}
-
-MATCHER_P(ControllerManagerEqual, value, "") {
-  ProtoString value_string;
-  ProtoString arg_string;
-  EXPECT_TRUE(arg.SerializeToString(&arg_string));
-  EXPECT_TRUE(value.SerializeToString(&value_string));
-  return arg_string == value_string;
-}
-
-}  // namespace
-
-TEST(ControllerManagerTest, DebugDumpLoggedWhenCreateFromConfigString) {
-  audio_network_adaptor::config::ControllerManager config;
-  config.set_min_reordering_time_ms(kMinReorderingTimeMs);
-  config.set_min_reordering_squared_distance(kMinReorderingSquareDistance);
-
-  AddFecControllerConfig(&config);
-  AddChannelControllerConfig(&config);
-  AddDtxControllerConfig(&config);
-  AddFrameLengthControllerConfig(&config);
-  AddBitrateControllerConfig(&config);
-
-  ProtoString config_string;
-  config.SerializeToString(&config_string);
-
-  constexpr size_t kNumEncoderChannels = 2;
-  const std::vector<int> encoder_frame_lengths_ms = {20, 60};
-
-  constexpr int64_t kClockInitialTimeMs = 12345678;
-  rtc::ScopedFakeClock fake_clock;
-  fake_clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(kClockInitialTimeMs));
-  auto debug_dump_writer =
-      std::unique_ptr<MockDebugDumpWriter>(new NiceMock<MockDebugDumpWriter>());
-  EXPECT_CALL(*debug_dump_writer, Die());
-  EXPECT_CALL(*debug_dump_writer,
-              DumpControllerManagerConfig(ControllerManagerEqual(config),
-                                          kClockInitialTimeMs));
-
-  ControllerManagerImpl::Create(config_string, kNumEncoderChannels,
-                                encoder_frame_lengths_ms, kMinBitrateBps,
-                                kIntialChannelsToEncode, kInitialFrameLengthMs,
-                                kInitialBitrateBps, kInitialFecEnabled,
-                                kInitialDtxEnabled, debug_dump_writer.get());
-}
-
-TEST(ControllerManagerTest, CreateFromConfigStringAndCheckDefaultOrder) {
-  audio_network_adaptor::config::ControllerManager config;
-  config.set_min_reordering_time_ms(kMinReorderingTimeMs);
-  config.set_min_reordering_squared_distance(kMinReorderingSquareDistance);
-
-  AddFecControllerConfig(&config);
-  AddChannelControllerConfig(&config);
-  AddDtxControllerConfig(&config);
-  AddFrameLengthControllerConfig(&config);
-  AddBitrateControllerConfig(&config);
-
-  ProtoString config_string;
-  config.SerializeToString(&config_string);
-
-  auto states = CreateControllerManager(config_string);
-  Controller::NetworkMetrics metrics;
-
-  auto controllers = states.controller_manager->GetSortedControllers(metrics);
-  CheckControllersOrder(
-      controllers,
-      std::vector<ControllerType>{
-          ControllerType::FEC, ControllerType::CHANNEL, ControllerType::DTX,
-          ControllerType::FRAME_LENGTH, ControllerType::BIT_RATE});
-}
-
-TEST(ControllerManagerTest, CreateCharPointFreeConfigAndCheckDefaultOrder) {
-  audio_network_adaptor::config::ControllerManager config;
-
-  // Following controllers have no characteristic points.
-  AddChannelControllerConfig(&config);
-  AddDtxControllerConfig(&config);
-  AddBitrateControllerConfig(&config);
-
-  ProtoString config_string;
-  config.SerializeToString(&config_string);
-
-  auto states = CreateControllerManager(config_string);
-  Controller::NetworkMetrics metrics;
-
-  auto controllers = states.controller_manager->GetSortedControllers(metrics);
-  CheckControllersOrder(
-      controllers,
-      std::vector<ControllerType>{ControllerType::CHANNEL, ControllerType::DTX,
-                                  ControllerType::BIT_RATE});
-}
-
-TEST(ControllerManagerTest, CreateFromConfigStringAndCheckReordering) {
-  rtc::ScopedFakeClock fake_clock;
-  audio_network_adaptor::config::ControllerManager config;
-  config.set_min_reordering_time_ms(kMinReorderingTimeMs);
-  config.set_min_reordering_squared_distance(kMinReorderingSquareDistance);
-
-  AddChannelControllerConfig(&config);
-
-  // Internally associated with characteristic point 0.
-  AddFecControllerConfig(&config);
-
-  AddDtxControllerConfig(&config);
-
-  // Internally associated with characteristic point 1.
-  AddFrameLengthControllerConfig(&config);
-
-  AddBitrateControllerConfig(&config);
-
-  ProtoString config_string;
-  config.SerializeToString(&config_string);
-
-  auto states = CreateControllerManager(config_string);
-
-  Controller::NetworkMetrics metrics;
-  metrics.uplink_bandwidth_bps =
-      rtc::Optional<int>(kChracteristicBandwithBps[0]);
-  metrics.uplink_packet_loss_fraction =
-      rtc::Optional<float>(kChracteristicPacketLossFraction[0]);
-
-  auto controllers = states.controller_manager->GetSortedControllers(metrics);
-  CheckControllersOrder(controllers,
-                        std::vector<ControllerType>{
-                            ControllerType::FEC, ControllerType::FRAME_LENGTH,
-                            ControllerType::CHANNEL, ControllerType::DTX,
-                            ControllerType::BIT_RATE});
-
-  metrics.uplink_bandwidth_bps =
-      rtc::Optional<int>(kChracteristicBandwithBps[1]);
-  metrics.uplink_packet_loss_fraction =
-      rtc::Optional<float>(kChracteristicPacketLossFraction[1]);
-  fake_clock.AdvanceTime(
-      rtc::TimeDelta::FromMilliseconds(kMinReorderingTimeMs - 1));
-  controllers = states.controller_manager->GetSortedControllers(metrics);
-  // Should not reorder since min reordering time is not met.
-  CheckControllersOrder(controllers,
-                        std::vector<ControllerType>{
-                            ControllerType::FEC, ControllerType::FRAME_LENGTH,
-                            ControllerType::CHANNEL, ControllerType::DTX,
-                            ControllerType::BIT_RATE});
-
-  fake_clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1));
-  controllers = states.controller_manager->GetSortedControllers(metrics);
-  // Reorder now.
-  CheckControllersOrder(controllers,
-                        std::vector<ControllerType>{
-                            ControllerType::FRAME_LENGTH, ControllerType::FEC,
-                            ControllerType::CHANNEL, ControllerType::DTX,
-                            ControllerType::BIT_RATE});
-}
-#endif  // WEBRTC_ENABLE_PROTOBUF
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/audio_network_adaptor/debug_dump.proto b/modules/audio_coding/audio_network_adaptor/debug_dump.proto
deleted file mode 100644
index 93b31c3..0000000
--- a/modules/audio_coding/audio_network_adaptor/debug_dump.proto
+++ /dev/null
@@ -1,42 +0,0 @@
-syntax = "proto2";
-option optimize_for = LITE_RUNTIME;
-package webrtc.audio_network_adaptor.debug_dump;
-
-import "config.proto";
-
-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;
-  optional int32 uplink_recoverable_packet_loss_fraction = 5;
-}
-
-message EncoderRuntimeConfig {
-  optional int32 bitrate_bps = 1;
-  optional int32 frame_length_ms = 2;
-  // Note: This is what we tell the encoder. It doesn't have to reflect
-  // the actual NetworkMetrics; it's subject to our decision.
-  optional float uplink_packet_loss_fraction = 3;
-  optional bool enable_fec = 4;
-  optional bool enable_dtx = 5;
-  // Some encoders can encode fewer channels than the actual input to make
-  // better use of the bandwidth. |num_channels| sets the number of channels
-  // to encode.
-  optional uint32 num_channels = 6;
-}
-
-message Event {
-  enum Type {
-    NETWORK_METRICS = 0;
-    ENCODER_RUNTIME_CONFIG = 1;
-    CONTROLLER_MANAGER_CONFIG = 2;
-  }
-  required Type type = 1;
-  required uint32 timestamp = 2;
-  optional NetworkMetrics network_metrics = 3;
-  optional EncoderRuntimeConfig encoder_runtime_config = 4;
-  optional webrtc.audio_network_adaptor.config.ControllerManager
-      controller_manager_config = 5;
-}
-
diff --git a/modules/audio_coding/audio_network_adaptor/debug_dump_writer.cc b/modules/audio_coding/audio_network_adaptor/debug_dump_writer.cc
deleted file mode 100644
index b3e8776..0000000
--- a/modules/audio_coding/audio_network_adaptor/debug_dump_writer.cc
+++ /dev/null
@@ -1,165 +0,0 @@
-/*
- *  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/rtc_base/checks.h"
-#include "webrtc/rtc_base/ignore_wundef.h"
-#include "webrtc/rtc_base/protobuf_utils.h"
-
-#if WEBRTC_ENABLE_PROTOBUF
-RTC_PUSH_IGNORING_WUNDEF()
-#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
-RTC_POP_IGNORING_WUNDEF()
-#endif
-
-namespace webrtc {
-
-#if WEBRTC_ENABLE_PROTOBUF
-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());
-  ProtoString 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_ENABLE_PROTOBUF
-
-class DebugDumpWriterImpl final : public DebugDumpWriter {
- public:
-  explicit DebugDumpWriterImpl(FILE* file_handle);
-  ~DebugDumpWriterImpl() override = default;
-
-  void DumpEncoderRuntimeConfig(const AudioEncoderRuntimeConfig& config,
-                                int64_t timestamp) override;
-
-  void DumpNetworkMetrics(const Controller::NetworkMetrics& metrics,
-                          int64_t timestamp) override;
-
-#if WEBRTC_ENABLE_PROTOBUF
-  void DumpControllerManagerConfig(
-      const audio_network_adaptor::config::ControllerManager&
-          controller_manager_config,
-      int64_t timestamp) override;
-#endif
-
- private:
-  std::unique_ptr<FileWrapper> dump_file_;
-};
-
-DebugDumpWriterImpl::DebugDumpWriterImpl(FILE* file_handle)
-    : dump_file_(FileWrapper::Create()) {
-#if WEBRTC_ENABLE_PROTOBUF
-  dump_file_->OpenFromFileHandle(file_handle);
-  RTC_CHECK(dump_file_->is_open());
-#else
-  RTC_NOTREACHED();
-#endif
-}
-
-void DebugDumpWriterImpl::DumpNetworkMetrics(
-    const Controller::NetworkMetrics& metrics,
-    int64_t timestamp) {
-#if WEBRTC_ENABLE_PROTOBUF
-  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);
-
-  if (metrics.uplink_recoverable_packet_loss_fraction) {
-    dump_metrics->set_uplink_recoverable_packet_loss_fraction(
-        *metrics.uplink_recoverable_packet_loss_fraction);
-  }
-
-  DumpEventToFile(event, dump_file_.get());
-#endif  // WEBRTC_ENABLE_PROTOBUF
-}
-
-void DebugDumpWriterImpl::DumpEncoderRuntimeConfig(
-    const AudioEncoderRuntimeConfig& config,
-    int64_t timestamp) {
-#if WEBRTC_ENABLE_PROTOBUF
-  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_ENABLE_PROTOBUF
-}
-
-#if WEBRTC_ENABLE_PROTOBUF
-void DebugDumpWriterImpl::DumpControllerManagerConfig(
-    const audio_network_adaptor::config::ControllerManager&
-        controller_manager_config,
-    int64_t timestamp) {
-  Event event;
-  event.set_timestamp(timestamp);
-  event.set_type(Event::CONTROLLER_MANAGER_CONFIG);
-  event.mutable_controller_manager_config()->CopyFrom(
-      controller_manager_config);
-  DumpEventToFile(event, dump_file_.get());
-}
-#endif  // WEBRTC_ENABLE_PROTOBUF
-
-std::unique_ptr<DebugDumpWriter> DebugDumpWriter::Create(FILE* file_handle) {
-  return std::unique_ptr<DebugDumpWriter>(new DebugDumpWriterImpl(file_handle));
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/audio_network_adaptor/debug_dump_writer.h b/modules/audio_coding/audio_network_adaptor/debug_dump_writer.h
deleted file mode 100644
index 0d9206d..0000000
--- a/modules/audio_coding/audio_network_adaptor/debug_dump_writer.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- *  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 "webrtc/modules/audio_coding/audio_network_adaptor/controller.h"
-#include "webrtc/modules/audio_coding/audio_network_adaptor/include/audio_network_adaptor.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/ignore_wundef.h"
-#include "webrtc/system_wrappers/include/file_wrapper.h"
-#if WEBRTC_ENABLE_PROTOBUF
-RTC_PUSH_IGNORING_WUNDEF()
-#ifdef WEBRTC_ANDROID_PLATFORM_BUILD
-#include "external/webrtc/webrtc/modules/audio_coding/audio_network_adaptor/config.pb.h"
-#else
-#include "webrtc/modules/audio_coding/audio_network_adaptor/config.pb.h"
-#endif
-RTC_POP_IGNORING_WUNDEF()
-#endif
-
-namespace webrtc {
-
-class DebugDumpWriter {
- public:
-  static std::unique_ptr<DebugDumpWriter> Create(FILE* file_handle);
-
-  virtual ~DebugDumpWriter() = default;
-
-  virtual void DumpEncoderRuntimeConfig(const AudioEncoderRuntimeConfig& config,
-                                        int64_t timestamp) = 0;
-
-  virtual void DumpNetworkMetrics(const Controller::NetworkMetrics& metrics,
-                                  int64_t timestamp) = 0;
-
-#if WEBRTC_ENABLE_PROTOBUF
-  virtual void DumpControllerManagerConfig(
-      const audio_network_adaptor::config::ControllerManager&
-          controller_manager_config,
-      int64_t timestamp) = 0;
-#endif
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_CODING_AUDIO_NETWORK_ADAPTOR_DEBUG_DUMP_WRITER_H_
diff --git a/modules/audio_coding/audio_network_adaptor/dtx_controller.cc b/modules/audio_coding/audio_network_adaptor/dtx_controller.cc
deleted file mode 100644
index 1941a5e..0000000
--- a/modules/audio_coding/audio_network_adaptor/dtx_controller.cc
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- *  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/dtx_controller.h"
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-
-DtxController::Config::Config(bool initial_dtx_enabled,
-                              int dtx_enabling_bandwidth_bps,
-                              int dtx_disabling_bandwidth_bps)
-    : initial_dtx_enabled(initial_dtx_enabled),
-      dtx_enabling_bandwidth_bps(dtx_enabling_bandwidth_bps),
-      dtx_disabling_bandwidth_bps(dtx_disabling_bandwidth_bps) {}
-
-DtxController::DtxController(const Config& config)
-    : config_(config), dtx_enabled_(config_.initial_dtx_enabled) {}
-
-DtxController::~DtxController() = default;
-
-void DtxController::UpdateNetworkMetrics(
-    const NetworkMetrics& network_metrics) {
-  if (network_metrics.uplink_bandwidth_bps)
-    uplink_bandwidth_bps_ = network_metrics.uplink_bandwidth_bps;
-}
-
-void DtxController::MakeDecision(AudioEncoderRuntimeConfig* config) {
-  // Decision on |enable_dtx| should not have been made.
-  RTC_DCHECK(!config->enable_dtx);
-
-  if (uplink_bandwidth_bps_) {
-    if (dtx_enabled_ &&
-        *uplink_bandwidth_bps_ >= config_.dtx_disabling_bandwidth_bps) {
-      dtx_enabled_ = false;
-    } else if (!dtx_enabled_ &&
-               *uplink_bandwidth_bps_ <= config_.dtx_enabling_bandwidth_bps) {
-      dtx_enabled_ = true;
-    }
-  }
-  config->enable_dtx = rtc::Optional<bool>(dtx_enabled_);
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/audio_network_adaptor/dtx_controller.h b/modules/audio_coding/audio_network_adaptor/dtx_controller.h
deleted file mode 100644
index 2945e11..0000000
--- a/modules/audio_coding/audio_network_adaptor/dtx_controller.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- *  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_DTX_CONTROLLER_H_
-#define WEBRTC_MODULES_AUDIO_CODING_AUDIO_NETWORK_ADAPTOR_DTX_CONTROLLER_H_
-
-#include "webrtc/modules/audio_coding/audio_network_adaptor/controller.h"
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace webrtc {
-
-class DtxController final : public Controller {
- public:
-  struct Config {
-    Config(bool initial_dtx_enabled,
-           int dtx_enabling_bandwidth_bps,
-           int dtx_disabling_bandwidth_bps);
-    bool initial_dtx_enabled;
-    // Uplink bandwidth below which DTX should be switched on.
-    int dtx_enabling_bandwidth_bps;
-    // Uplink bandwidth above which DTX should be switched off.
-    int dtx_disabling_bandwidth_bps;
-  };
-
-  explicit DtxController(const Config& config);
-
-  ~DtxController() override;
-
-  void UpdateNetworkMetrics(const NetworkMetrics& network_metrics) override;
-
-  void MakeDecision(AudioEncoderRuntimeConfig* config) override;
-
- private:
-  const Config config_;
-  bool dtx_enabled_;
-  rtc::Optional<int> uplink_bandwidth_bps_;
-  RTC_DISALLOW_COPY_AND_ASSIGN(DtxController);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_CODING_AUDIO_NETWORK_ADAPTOR_DTX_CONTROLLER_H_
diff --git a/modules/audio_coding/audio_network_adaptor/dtx_controller_unittest.cc b/modules/audio_coding/audio_network_adaptor/dtx_controller_unittest.cc
deleted file mode 100644
index 73527ee..0000000
--- a/modules/audio_coding/audio_network_adaptor/dtx_controller_unittest.cc
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- *  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 <memory>
-
-#include "webrtc/modules/audio_coding/audio_network_adaptor/dtx_controller.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-namespace {
-
-constexpr int kDtxEnablingBandwidthBps = 55000;
-constexpr int kDtxDisablingBandwidthBps = 65000;
-constexpr int kMediumBandwidthBps =
-    (kDtxEnablingBandwidthBps + kDtxDisablingBandwidthBps) / 2;
-
-std::unique_ptr<DtxController> CreateController(int initial_dtx_enabled) {
-  std::unique_ptr<DtxController> controller(new DtxController(
-      DtxController::Config(initial_dtx_enabled, kDtxEnablingBandwidthBps,
-                            kDtxDisablingBandwidthBps)));
-  return controller;
-}
-
-void CheckDecision(DtxController* controller,
-                   const rtc::Optional<int>& uplink_bandwidth_bps,
-                   bool expected_dtx_enabled) {
-  if (uplink_bandwidth_bps) {
-    Controller::NetworkMetrics network_metrics;
-    network_metrics.uplink_bandwidth_bps = uplink_bandwidth_bps;
-    controller->UpdateNetworkMetrics(network_metrics);
-  }
-  AudioEncoderRuntimeConfig config;
-  controller->MakeDecision(&config);
-  EXPECT_EQ(rtc::Optional<bool>(expected_dtx_enabled), config.enable_dtx);
-}
-
-}  // namespace
-
-TEST(DtxControllerTest, OutputInitValueWhenUplinkBandwidthUnknown) {
-  constexpr bool kInitialDtxEnabled = true;
-  auto controller = CreateController(kInitialDtxEnabled);
-  CheckDecision(controller.get(), rtc::Optional<int>(), kInitialDtxEnabled);
-}
-
-TEST(DtxControllerTest, TurnOnDtxForLowUplinkBandwidth) {
-  auto controller = CreateController(false);
-  CheckDecision(controller.get(), rtc::Optional<int>(kDtxEnablingBandwidthBps),
-                true);
-}
-
-TEST(DtxControllerTest, TurnOffDtxForHighUplinkBandwidth) {
-  auto controller = CreateController(true);
-  CheckDecision(controller.get(), rtc::Optional<int>(kDtxDisablingBandwidthBps),
-                false);
-}
-
-TEST(DtxControllerTest, MaintainDtxOffForMediumUplinkBandwidth) {
-  auto controller = CreateController(false);
-  CheckDecision(controller.get(), rtc::Optional<int>(kMediumBandwidthBps),
-                false);
-}
-
-TEST(DtxControllerTest, MaintainDtxOnForMediumUplinkBandwidth) {
-  auto controller = CreateController(true);
-  CheckDecision(controller.get(), rtc::Optional<int>(kMediumBandwidthBps),
-                true);
-}
-
-TEST(DtxControllerTest, CheckBehaviorOnChangingUplinkBandwidth) {
-  auto controller = CreateController(false);
-  CheckDecision(controller.get(), rtc::Optional<int>(kMediumBandwidthBps),
-                false);
-  CheckDecision(controller.get(), rtc::Optional<int>(kDtxEnablingBandwidthBps),
-                true);
-  CheckDecision(controller.get(), rtc::Optional<int>(kMediumBandwidthBps),
-                true);
-  CheckDecision(controller.get(), rtc::Optional<int>(kDtxDisablingBandwidthBps),
-                false);
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/audio_network_adaptor/event_log_writer.cc b/modules/audio_coding/audio_network_adaptor/event_log_writer.cc
deleted file mode 100644
index b4fcbfd..0000000
--- a/modules/audio_coding/audio_network_adaptor/event_log_writer.cc
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- *  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 <math.h>
-#include <algorithm>
-
-#include "webrtc/logging/rtc_event_log/rtc_event_log.h"
-#include "webrtc/modules/audio_coding/audio_network_adaptor/event_log_writer.h"
-
-namespace webrtc {
-
-EventLogWriter::EventLogWriter(RtcEventLog* event_log,
-                               int min_bitrate_change_bps,
-                               float min_bitrate_change_fraction,
-                               float min_packet_loss_change_fraction)
-    : event_log_(event_log),
-      min_bitrate_change_bps_(min_bitrate_change_bps),
-      min_bitrate_change_fraction_(min_bitrate_change_fraction),
-      min_packet_loss_change_fraction_(min_packet_loss_change_fraction) {
-  RTC_DCHECK(event_log_);
-}
-
-EventLogWriter::~EventLogWriter() = default;
-
-void EventLogWriter::MaybeLogEncoderConfig(
-    const AudioEncoderRuntimeConfig& config) {
-  if (last_logged_config_.num_channels != config.num_channels)
-    return LogEncoderConfig(config);
-  if (last_logged_config_.enable_dtx != config.enable_dtx)
-    return LogEncoderConfig(config);
-  if (last_logged_config_.enable_fec != config.enable_fec)
-    return LogEncoderConfig(config);
-  if (last_logged_config_.frame_length_ms != config.frame_length_ms)
-    return LogEncoderConfig(config);
-  if ((!last_logged_config_.bitrate_bps && config.bitrate_bps) ||
-      (last_logged_config_.bitrate_bps && config.bitrate_bps &&
-       std::abs(*last_logged_config_.bitrate_bps - *config.bitrate_bps) >=
-           std::min(static_cast<int>(*last_logged_config_.bitrate_bps *
-                                     min_bitrate_change_fraction_),
-                    min_bitrate_change_bps_))) {
-    return LogEncoderConfig(config);
-  }
-  if ((!last_logged_config_.uplink_packet_loss_fraction &&
-       config.uplink_packet_loss_fraction) ||
-      (last_logged_config_.uplink_packet_loss_fraction &&
-       config.uplink_packet_loss_fraction &&
-       fabs(*last_logged_config_.uplink_packet_loss_fraction -
-            *config.uplink_packet_loss_fraction) >=
-           min_packet_loss_change_fraction_ *
-               *last_logged_config_.uplink_packet_loss_fraction)) {
-    return LogEncoderConfig(config);
-  }
-}
-
-void EventLogWriter::LogEncoderConfig(const AudioEncoderRuntimeConfig& config) {
-  event_log_->LogAudioNetworkAdaptation(config);
-  last_logged_config_ = config;
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/audio_network_adaptor/event_log_writer.h b/modules/audio_coding/audio_network_adaptor/event_log_writer.h
deleted file mode 100644
index 7f7acef..0000000
--- a/modules/audio_coding/audio_network_adaptor/event_log_writer.h
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- *  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_EVENT_LOG_WRITER_H_
-#define WEBRTC_MODULES_AUDIO_CODING_AUDIO_NETWORK_ADAPTOR_EVENT_LOG_WRITER_H_
-
-#include "webrtc/modules/audio_coding/audio_network_adaptor/include/audio_network_adaptor.h"
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace webrtc {
-class RtcEventLog;
-
-class EventLogWriter final {
- public:
-  EventLogWriter(RtcEventLog* event_log,
-                 int min_bitrate_change_bps,
-                 float min_bitrate_change_fraction,
-                 float min_packet_loss_change_fraction);
-  ~EventLogWriter();
-  void MaybeLogEncoderConfig(const AudioEncoderRuntimeConfig& config);
-
- private:
-  void LogEncoderConfig(const AudioEncoderRuntimeConfig& config);
-
-  RtcEventLog* const event_log_;
-  const int min_bitrate_change_bps_;
-  const float min_bitrate_change_fraction_;
-  const float min_packet_loss_change_fraction_;
-  AudioEncoderRuntimeConfig last_logged_config_;
-  RTC_DISALLOW_COPY_AND_ASSIGN(EventLogWriter);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_CODING_AUDIO_NETWORK_ADAPTOR_EVENT_LOG_WRITER_H_
diff --git a/modules/audio_coding/audio_network_adaptor/event_log_writer_unittest.cc b/modules/audio_coding/audio_network_adaptor/event_log_writer_unittest.cc
deleted file mode 100644
index 443e4d1..0000000
--- a/modules/audio_coding/audio_network_adaptor/event_log_writer_unittest.cc
+++ /dev/null
@@ -1,265 +0,0 @@
-/*
- *  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 <memory>
-
-#include "webrtc/logging/rtc_event_log/mock/mock_rtc_event_log.h"
-#include "webrtc/modules/audio_coding/audio_network_adaptor/event_log_writer.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-namespace {
-
-constexpr int kMinBitrateChangeBps = 5000;
-constexpr float kMinPacketLossChangeFraction = 0.5;
-constexpr float kMinBitrateChangeFraction = 0.25;
-
-constexpr int kHighBitrateBps = 70000;
-constexpr int kLowBitrateBps = 10000;
-constexpr int kFrameLengthMs = 60;
-constexpr bool kEnableFec = true;
-constexpr bool kEnableDtx = true;
-constexpr float kPacketLossFraction = 0.05f;
-constexpr size_t kNumChannels = 1;
-
-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 EventLogWriterStates {
-  std::unique_ptr<EventLogWriter> event_log_writer;
-  std::unique_ptr<testing::StrictMock<MockRtcEventLog>> event_log;
-  AudioEncoderRuntimeConfig runtime_config;
-};
-
-EventLogWriterStates CreateEventLogWriter() {
-  EventLogWriterStates state;
-  state.event_log.reset(new testing::StrictMock<MockRtcEventLog>());
-  state.event_log_writer.reset(new EventLogWriter(
-      state.event_log.get(), kMinBitrateChangeBps, kMinBitrateChangeFraction,
-      kMinPacketLossChangeFraction));
-  state.runtime_config.bitrate_bps = rtc::Optional<int>(kHighBitrateBps);
-  state.runtime_config.frame_length_ms = rtc::Optional<int>(kFrameLengthMs);
-  state.runtime_config.uplink_packet_loss_fraction =
-      rtc::Optional<float>(kPacketLossFraction);
-  state.runtime_config.enable_fec = rtc::Optional<bool>(kEnableFec);
-  state.runtime_config.enable_dtx = rtc::Optional<bool>(kEnableDtx);
-  state.runtime_config.num_channels = rtc::Optional<size_t>(kNumChannels);
-  return state;
-}
-}  // namespace
-
-TEST(EventLogWriterTest, FirstConfigIsLogged) {
-  auto state = CreateEventLogWriter();
-  EXPECT_CALL(
-      *state.event_log,
-      LogAudioNetworkAdaptation(EncoderRuntimeConfigIs(state.runtime_config)))
-      .Times(1);
-  state.event_log_writer->MaybeLogEncoderConfig(state.runtime_config);
-}
-
-TEST(EventLogWriterTest, SameConfigIsNotLogged) {
-  auto state = CreateEventLogWriter();
-  EXPECT_CALL(
-      *state.event_log,
-      LogAudioNetworkAdaptation(EncoderRuntimeConfigIs(state.runtime_config)))
-      .Times(1);
-  state.event_log_writer->MaybeLogEncoderConfig(state.runtime_config);
-  state.event_log_writer->MaybeLogEncoderConfig(state.runtime_config);
-}
-
-TEST(EventLogWriterTest, LogFecStateChange) {
-  auto state = CreateEventLogWriter();
-  EXPECT_CALL(
-      *state.event_log,
-      LogAudioNetworkAdaptation(EncoderRuntimeConfigIs(state.runtime_config)))
-      .Times(1);
-  state.event_log_writer->MaybeLogEncoderConfig(state.runtime_config);
-
-  state.runtime_config.enable_fec = rtc::Optional<bool>(!kEnableFec);
-  EXPECT_CALL(
-      *state.event_log,
-      LogAudioNetworkAdaptation(EncoderRuntimeConfigIs(state.runtime_config)))
-      .Times(1);
-  state.event_log_writer->MaybeLogEncoderConfig(state.runtime_config);
-}
-
-TEST(EventLogWriterTest, LogDtxStateChange) {
-  auto state = CreateEventLogWriter();
-  EXPECT_CALL(
-      *state.event_log,
-      LogAudioNetworkAdaptation(EncoderRuntimeConfigIs(state.runtime_config)))
-      .Times(1);
-  state.event_log_writer->MaybeLogEncoderConfig(state.runtime_config);
-
-  state.runtime_config.enable_dtx = rtc::Optional<bool>(!kEnableDtx);
-  EXPECT_CALL(
-      *state.event_log,
-      LogAudioNetworkAdaptation(EncoderRuntimeConfigIs(state.runtime_config)))
-      .Times(1);
-  state.event_log_writer->MaybeLogEncoderConfig(state.runtime_config);
-}
-
-TEST(EventLogWriterTest, LogChannelChange) {
-  auto state = CreateEventLogWriter();
-  EXPECT_CALL(
-      *state.event_log,
-      LogAudioNetworkAdaptation(EncoderRuntimeConfigIs(state.runtime_config)))
-      .Times(1);
-  state.event_log_writer->MaybeLogEncoderConfig(state.runtime_config);
-
-  state.runtime_config.num_channels = rtc::Optional<size_t>(kNumChannels + 1);
-  EXPECT_CALL(
-      *state.event_log,
-      LogAudioNetworkAdaptation(EncoderRuntimeConfigIs(state.runtime_config)))
-      .Times(1);
-  state.event_log_writer->MaybeLogEncoderConfig(state.runtime_config);
-}
-
-TEST(EventLogWriterTest, LogFrameLengthChange) {
-  auto state = CreateEventLogWriter();
-  EXPECT_CALL(
-      *state.event_log,
-      LogAudioNetworkAdaptation(EncoderRuntimeConfigIs(state.runtime_config)))
-      .Times(1);
-  state.event_log_writer->MaybeLogEncoderConfig(state.runtime_config);
-
-  state.runtime_config.frame_length_ms = rtc::Optional<int>(20);
-  EXPECT_CALL(
-      *state.event_log,
-      LogAudioNetworkAdaptation(EncoderRuntimeConfigIs(state.runtime_config)))
-      .Times(1);
-  state.event_log_writer->MaybeLogEncoderConfig(state.runtime_config);
-}
-
-TEST(EventLogWriterTest, DoNotLogSmallBitrateChange) {
-  auto state = CreateEventLogWriter();
-  EXPECT_CALL(
-      *state.event_log,
-      LogAudioNetworkAdaptation(EncoderRuntimeConfigIs(state.runtime_config)))
-      .Times(1);
-  state.event_log_writer->MaybeLogEncoderConfig(state.runtime_config);
-  state.runtime_config.bitrate_bps =
-      rtc::Optional<int>(kHighBitrateBps + kMinBitrateChangeBps - 1);
-  state.event_log_writer->MaybeLogEncoderConfig(state.runtime_config);
-}
-
-TEST(EventLogWriterTest, LogLargeBitrateChange) {
-  auto state = CreateEventLogWriter();
-  EXPECT_CALL(
-      *state.event_log,
-      LogAudioNetworkAdaptation(EncoderRuntimeConfigIs(state.runtime_config)))
-      .Times(1);
-  state.event_log_writer->MaybeLogEncoderConfig(state.runtime_config);
-  // At high bitrate, the min fraction rule requires a larger change than the
-  // min change rule. We make sure that the min change rule applies.
-  RTC_DCHECK_GT(kHighBitrateBps * kMinBitrateChangeFraction,
-                kMinBitrateChangeBps);
-  state.runtime_config.bitrate_bps =
-      rtc::Optional<int>(kHighBitrateBps + kMinBitrateChangeBps);
-  EXPECT_CALL(
-      *state.event_log,
-      LogAudioNetworkAdaptation(EncoderRuntimeConfigIs(state.runtime_config)))
-      .Times(1);
-  state.event_log_writer->MaybeLogEncoderConfig(state.runtime_config);
-}
-
-TEST(EventLogWriterTest, LogMinBitrateChangeFractionOnLowBitrateChange) {
-  auto state = CreateEventLogWriter();
-  state.runtime_config.bitrate_bps = rtc::Optional<int>(kLowBitrateBps);
-  EXPECT_CALL(
-      *state.event_log,
-      LogAudioNetworkAdaptation(EncoderRuntimeConfigIs(state.runtime_config)))
-      .Times(1);
-  state.event_log_writer->MaybeLogEncoderConfig(state.runtime_config);
-  // At high bitrate, the min change rule requires a larger change than the min
-  // fraction rule. We make sure that the min fraction rule applies.
-  state.runtime_config.bitrate_bps = rtc::Optional<int>(
-      kLowBitrateBps + kLowBitrateBps * kMinBitrateChangeFraction);
-  EXPECT_CALL(
-      *state.event_log,
-      LogAudioNetworkAdaptation(EncoderRuntimeConfigIs(state.runtime_config)))
-      .Times(1);
-  state.event_log_writer->MaybeLogEncoderConfig(state.runtime_config);
-}
-
-TEST(EventLogWriterTest, DoNotLogSmallPacketLossFractionChange) {
-  auto state = CreateEventLogWriter();
-  EXPECT_CALL(
-      *state.event_log,
-      LogAudioNetworkAdaptation(EncoderRuntimeConfigIs(state.runtime_config)))
-      .Times(1);
-  state.event_log_writer->MaybeLogEncoderConfig(state.runtime_config);
-  state.runtime_config.uplink_packet_loss_fraction = rtc::Optional<float>(
-      kPacketLossFraction + kMinPacketLossChangeFraction * kPacketLossFraction -
-      0.001f);
-  state.event_log_writer->MaybeLogEncoderConfig(state.runtime_config);
-}
-
-TEST(EventLogWriterTest, LogLargePacketLossFractionChange) {
-  auto state = CreateEventLogWriter();
-  EXPECT_CALL(
-      *state.event_log,
-      LogAudioNetworkAdaptation(EncoderRuntimeConfigIs(state.runtime_config)))
-      .Times(1);
-  state.event_log_writer->MaybeLogEncoderConfig(state.runtime_config);
-  state.runtime_config.uplink_packet_loss_fraction = rtc::Optional<float>(
-      kPacketLossFraction + kMinPacketLossChangeFraction * kPacketLossFraction);
-  EXPECT_CALL(
-      *state.event_log,
-      LogAudioNetworkAdaptation(EncoderRuntimeConfigIs(state.runtime_config)))
-      .Times(1);
-  state.event_log_writer->MaybeLogEncoderConfig(state.runtime_config);
-}
-
-TEST(EventLogWriterTest, LogJustOnceOnMultipleChanges) {
-  auto state = CreateEventLogWriter();
-  EXPECT_CALL(
-      *state.event_log,
-      LogAudioNetworkAdaptation(EncoderRuntimeConfigIs(state.runtime_config)))
-      .Times(1);
-  state.event_log_writer->MaybeLogEncoderConfig(state.runtime_config);
-  state.runtime_config.uplink_packet_loss_fraction = rtc::Optional<float>(
-      kPacketLossFraction + kMinPacketLossChangeFraction * kPacketLossFraction);
-  state.runtime_config.frame_length_ms = rtc::Optional<int>(20);
-  EXPECT_CALL(
-      *state.event_log,
-      LogAudioNetworkAdaptation(EncoderRuntimeConfigIs(state.runtime_config)))
-      .Times(1);
-  state.event_log_writer->MaybeLogEncoderConfig(state.runtime_config);
-}
-
-TEST(EventLogWriterTest, LogAfterGradualChange) {
-  auto state = CreateEventLogWriter();
-  EXPECT_CALL(
-      *state.event_log,
-      LogAudioNetworkAdaptation(EncoderRuntimeConfigIs(state.runtime_config)))
-      .Times(1);
-  state.event_log_writer->MaybeLogEncoderConfig(state.runtime_config);
-  state.runtime_config.bitrate_bps =
-      rtc::Optional<int>(kHighBitrateBps + kMinBitrateChangeBps);
-  EXPECT_CALL(
-      *state.event_log,
-      LogAudioNetworkAdaptation(EncoderRuntimeConfigIs(state.runtime_config)))
-      .Times(1);
-  for (int bitrate_bps = kHighBitrateBps;
-       bitrate_bps <= kHighBitrateBps + kMinBitrateChangeBps; bitrate_bps++) {
-    state.runtime_config.bitrate_bps = rtc::Optional<int>(bitrate_bps);
-    state.event_log_writer->MaybeLogEncoderConfig(state.runtime_config);
-  }
-}
-}  // namespace webrtc
diff --git a/modules/audio_coding/audio_network_adaptor/fec_controller_plr_based.cc b/modules/audio_coding/audio_network_adaptor/fec_controller_plr_based.cc
deleted file mode 100644
index 58644b9..0000000
--- a/modules/audio_coding/audio_network_adaptor/fec_controller_plr_based.cc
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- *  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/fec_controller_plr_based.h"
-
-#include <limits>
-#include <utility>
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/system_wrappers/include/field_trial.h"
-
-namespace webrtc {
-
-namespace {
-class NullSmoothingFilter final : public SmoothingFilter {
- public:
-  void AddSample(float sample) override {
-    last_sample_ = rtc::Optional<float>(sample);
-  }
-
-  rtc::Optional<float> GetAverage() override { return last_sample_; }
-
-  bool SetTimeConstantMs(int time_constant_ms) override {
-    RTC_NOTREACHED();
-    return false;
-  }
-
- private:
-  rtc::Optional<float> last_sample_;
-};
-}
-
-FecControllerPlrBased::Config::Config(
-    bool initial_fec_enabled,
-    const ThresholdCurve& fec_enabling_threshold,
-    const ThresholdCurve& fec_disabling_threshold,
-    int time_constant_ms)
-    : initial_fec_enabled(initial_fec_enabled),
-      fec_enabling_threshold(fec_enabling_threshold),
-      fec_disabling_threshold(fec_disabling_threshold),
-      time_constant_ms(time_constant_ms) {}
-
-FecControllerPlrBased::FecControllerPlrBased(
-    const Config& config,
-    std::unique_ptr<SmoothingFilter> smoothing_filter)
-    : config_(config),
-      fec_enabled_(config.initial_fec_enabled),
-      packet_loss_smoother_(std::move(smoothing_filter)) {
-  RTC_DCHECK(config_.fec_disabling_threshold <= config_.fec_enabling_threshold);
-}
-
-FecControllerPlrBased::FecControllerPlrBased(const Config& config)
-    : FecControllerPlrBased(
-          config,
-          webrtc::field_trial::FindFullName("UseTwccPlrForAna") == "Enabled"
-              ? std::unique_ptr<NullSmoothingFilter>(new NullSmoothingFilter())
-              : std::unique_ptr<SmoothingFilter>(
-                    new SmoothingFilterImpl(config.time_constant_ms))) {}
-
-FecControllerPlrBased::~FecControllerPlrBased() = default;
-
-void FecControllerPlrBased::UpdateNetworkMetrics(
-    const NetworkMetrics& network_metrics) {
-  if (network_metrics.uplink_bandwidth_bps)
-    uplink_bandwidth_bps_ = network_metrics.uplink_bandwidth_bps;
-  if (network_metrics.uplink_packet_loss_fraction) {
-    packet_loss_smoother_->AddSample(
-        *network_metrics.uplink_packet_loss_fraction);
-  }
-}
-
-void FecControllerPlrBased::MakeDecision(AudioEncoderRuntimeConfig* config) {
-  RTC_DCHECK(!config->enable_fec);
-  RTC_DCHECK(!config->uplink_packet_loss_fraction);
-
-  const auto& packet_loss = packet_loss_smoother_->GetAverage();
-
-  fec_enabled_ = fec_enabled_ ? !FecDisablingDecision(packet_loss)
-                              : FecEnablingDecision(packet_loss);
-
-  config->enable_fec = rtc::Optional<bool>(fec_enabled_);
-
-  config->uplink_packet_loss_fraction =
-      rtc::Optional<float>(packet_loss ? *packet_loss : 0.0);
-}
-
-bool FecControllerPlrBased::FecEnablingDecision(
-    const rtc::Optional<float>& packet_loss) const {
-  if (!uplink_bandwidth_bps_ || !packet_loss) {
-    return false;
-  } else {
-    // Enable when above the curve or exactly on it.
-    return !config_.fec_enabling_threshold.IsBelowCurve(
-        {static_cast<float>(*uplink_bandwidth_bps_), *packet_loss});
-  }
-}
-
-bool FecControllerPlrBased::FecDisablingDecision(
-    const rtc::Optional<float>& packet_loss) const {
-  if (!uplink_bandwidth_bps_ || !packet_loss) {
-    return false;
-  } else {
-    // Disable when below the curve.
-    return config_.fec_disabling_threshold.IsBelowCurve(
-        {static_cast<float>(*uplink_bandwidth_bps_), *packet_loss});
-  }
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/audio_network_adaptor/fec_controller_plr_based.h b/modules/audio_coding/audio_network_adaptor/fec_controller_plr_based.h
deleted file mode 100644
index 9259f30..0000000
--- a/modules/audio_coding/audio_network_adaptor/fec_controller_plr_based.h
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- *  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_FEC_CONTROLLER_PLR_BASED_H_
-#define WEBRTC_MODULES_AUDIO_CODING_AUDIO_NETWORK_ADAPTOR_FEC_CONTROLLER_PLR_BASED_H_
-
-#include <memory>
-
-#include "webrtc/common_audio/smoothing_filter.h"
-#include "webrtc/modules/audio_coding/audio_network_adaptor/controller.h"
-#include "webrtc/modules/audio_coding/audio_network_adaptor/util/threshold_curve.h"
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace webrtc {
-
-class FecControllerPlrBased final : public Controller {
- public:
-  struct Config {
-    // |fec_enabling_threshold| defines a curve, above which FEC should be
-    // enabled. |fec_disabling_threshold| defines a curve, under which FEC
-    // should be disabled. See below
-    //
-    // packet-loss ^   |  |
-    //             |   |  |   FEC
-    //             |    \  \   ON
-    //             | FEC \  \_______ fec_enabling_threshold
-    //             | OFF  \_________ fec_disabling_threshold
-    //             |-----------------> bandwidth
-    Config(bool initial_fec_enabled,
-           const ThresholdCurve& fec_enabling_threshold,
-           const ThresholdCurve& fec_disabling_threshold,
-           int time_constant_ms);
-    bool initial_fec_enabled;
-    ThresholdCurve fec_enabling_threshold;
-    ThresholdCurve fec_disabling_threshold;
-    int time_constant_ms;
-  };
-
-  // Dependency injection for testing.
-  FecControllerPlrBased(const Config& config,
-                        std::unique_ptr<SmoothingFilter> smoothing_filter);
-
-  explicit FecControllerPlrBased(const Config& config);
-
-  ~FecControllerPlrBased() override;
-
-  void UpdateNetworkMetrics(const NetworkMetrics& network_metrics) override;
-
-  void MakeDecision(AudioEncoderRuntimeConfig* config) override;
-
- private:
-  bool FecEnablingDecision(const rtc::Optional<float>& packet_loss) const;
-  bool FecDisablingDecision(const rtc::Optional<float>& packet_loss) const;
-
-  const Config config_;
-  bool fec_enabled_;
-  rtc::Optional<int> uplink_bandwidth_bps_;
-  const std::unique_ptr<SmoothingFilter> packet_loss_smoother_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(FecControllerPlrBased);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_CODING_AUDIO_NETWORK_ADAPTOR_FEC_CONTROLLER_PLR_BASED_H_
diff --git a/modules/audio_coding/audio_network_adaptor/fec_controller_plr_based_unittest.cc b/modules/audio_coding/audio_network_adaptor/fec_controller_plr_based_unittest.cc
deleted file mode 100644
index 1ae7b45..0000000
--- a/modules/audio_coding/audio_network_adaptor/fec_controller_plr_based_unittest.cc
+++ /dev/null
@@ -1,499 +0,0 @@
-/*
- *  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/common_audio/mocks/mock_smoothing_filter.h"
-#include "webrtc/modules/audio_coding/audio_network_adaptor/fec_controller_plr_based.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-using ::testing::NiceMock;
-using ::testing::Return;
-using ::testing::_;
-
-namespace {
-
-// The test uses the following settings:
-//
-// packet-loss ^   |  |
-//             |  A| C|   FEC
-//             |    \  \   ON
-//             | FEC \ D\_______
-//             | OFF B\_________
-//             |-----------------> bandwidth
-//
-// A : (kDisablingBandwidthLow, kDisablingPacketLossAtLowBw)
-// B : (kDisablingBandwidthHigh, kDisablingPacketLossAtHighBw)
-// C : (kEnablingBandwidthLow, kEnablingPacketLossAtLowBw)
-// D : (kEnablingBandwidthHigh, kEnablingPacketLossAtHighBw)
-
-constexpr int kDisablingBandwidthLow = 15000;
-constexpr float kDisablingPacketLossAtLowBw = 0.08f;
-constexpr int kDisablingBandwidthHigh = 64000;
-constexpr float kDisablingPacketLossAtHighBw = 0.01f;
-constexpr int kEnablingBandwidthLow = 17000;
-constexpr float kEnablingPacketLossAtLowBw = 0.1f;
-constexpr int kEnablingBandwidthHigh = 64000;
-constexpr float kEnablingPacketLossAtHighBw = 0.05f;
-
-constexpr float kEpsilon = 1e-5f;
-
-struct FecControllerPlrBasedTestStates {
-  std::unique_ptr<FecControllerPlrBased> controller;
-  MockSmoothingFilter* packet_loss_smoother;
-};
-
-FecControllerPlrBasedTestStates CreateFecControllerPlrBased(
-    bool initial_fec_enabled,
-    const ThresholdCurve& enabling_curve,
-    const ThresholdCurve& disabling_curve) {
-  FecControllerPlrBasedTestStates states;
-  std::unique_ptr<MockSmoothingFilter> mock_smoothing_filter(
-      new NiceMock<MockSmoothingFilter>());
-  states.packet_loss_smoother = mock_smoothing_filter.get();
-  states.controller.reset(new FecControllerPlrBased(
-      FecControllerPlrBased::Config(initial_fec_enabled, enabling_curve,
-                                    disabling_curve, 0),
-      std::move(mock_smoothing_filter)));
-  return states;
-}
-
-FecControllerPlrBasedTestStates CreateFecControllerPlrBased(
-    bool initial_fec_enabled) {
-  return CreateFecControllerPlrBased(
-      initial_fec_enabled,
-      ThresholdCurve(kEnablingBandwidthLow, kEnablingPacketLossAtLowBw,
-                     kEnablingBandwidthHigh, kEnablingPacketLossAtHighBw),
-      ThresholdCurve(kDisablingBandwidthLow, kDisablingPacketLossAtLowBw,
-                     kDisablingBandwidthHigh, kDisablingPacketLossAtHighBw));
-}
-
-void UpdateNetworkMetrics(FecControllerPlrBasedTestStates* states,
-                          const rtc::Optional<int>& uplink_bandwidth_bps,
-                          const rtc::Optional<float>& uplink_packet_loss) {
-  // UpdateNetworkMetrics can accept multiple network metric updates at once.
-  // However, currently, the most used case is to update one metric at a time.
-  // To reflect this fact, we separate the calls.
-  if (uplink_bandwidth_bps) {
-    Controller::NetworkMetrics network_metrics;
-    network_metrics.uplink_bandwidth_bps = uplink_bandwidth_bps;
-    states->controller->UpdateNetworkMetrics(network_metrics);
-  }
-  if (uplink_packet_loss) {
-    Controller::NetworkMetrics network_metrics;
-    network_metrics.uplink_packet_loss_fraction = uplink_packet_loss;
-    EXPECT_CALL(*states->packet_loss_smoother, AddSample(*uplink_packet_loss));
-    states->controller->UpdateNetworkMetrics(network_metrics);
-    // This is called during CheckDecision().
-    EXPECT_CALL(*states->packet_loss_smoother, GetAverage())
-        .WillOnce(Return(rtc::Optional<float>(*uplink_packet_loss)));
-  }
-}
-
-void UpdateNetworkMetrics(FecControllerPlrBasedTestStates* states,
-                          int uplink_bandwidth_bps,
-                          float uplink_packet_loss) {
-  UpdateNetworkMetrics(states, rtc::Optional<int>(uplink_bandwidth_bps),
-                       rtc::Optional<float>(uplink_packet_loss));
-}
-
-// Checks that the FEC decision and |uplink_packet_loss_fraction| given by
-// |states->controller->MakeDecision| matches |expected_enable_fec| and
-// |expected_uplink_packet_loss_fraction|, respectively.
-void CheckDecision(FecControllerPlrBasedTestStates* states,
-                   bool expected_enable_fec,
-                   float expected_uplink_packet_loss_fraction) {
-  AudioEncoderRuntimeConfig config;
-  states->controller->MakeDecision(&config);
-  EXPECT_EQ(rtc::Optional<bool>(expected_enable_fec), config.enable_fec);
-  EXPECT_EQ(rtc::Optional<float>(expected_uplink_packet_loss_fraction),
-            config.uplink_packet_loss_fraction);
-}
-
-}  // namespace
-
-TEST(FecControllerPlrBasedTest, OutputInitValueBeforeAnyInputsAreReceived) {
-  for (bool initial_fec_enabled : {false, true}) {
-    auto states = CreateFecControllerPlrBased(initial_fec_enabled);
-    CheckDecision(&states, initial_fec_enabled, 0);
-  }
-}
-
-TEST(FecControllerPlrBasedTest, OutputInitValueWhenUplinkBandwidthUnknown) {
-  // Regardless of the initial FEC state and the packet-loss rate,
-  // the initial FEC state is maintained as long as the BWE is unknown.
-  for (bool initial_fec_enabled : {false, true}) {
-    for (float packet_loss :
-         {kDisablingPacketLossAtLowBw - kEpsilon, kDisablingPacketLossAtLowBw,
-          kDisablingPacketLossAtLowBw + kEpsilon,
-          kEnablingPacketLossAtLowBw - kEpsilon, kEnablingPacketLossAtLowBw,
-          kEnablingPacketLossAtLowBw + kEpsilon}) {
-      auto states = CreateFecControllerPlrBased(initial_fec_enabled);
-      UpdateNetworkMetrics(&states, rtc::Optional<int>(),
-                           rtc::Optional<float>(packet_loss));
-      CheckDecision(&states, initial_fec_enabled, packet_loss);
-    }
-  }
-}
-
-TEST(FecControllerPlrBasedTest,
-     OutputInitValueWhenUplinkPacketLossFractionUnknown) {
-  // Regardless of the initial FEC state and the BWE, the initial FEC state
-  // is maintained as long as the packet-loss rate is unknown.
-  for (bool initial_fec_enabled : {false, true}) {
-    for (int bandwidth : {kDisablingBandwidthLow - 1, kDisablingBandwidthLow,
-                          kDisablingBandwidthLow + 1, kEnablingBandwidthLow - 1,
-                          kEnablingBandwidthLow, kEnablingBandwidthLow + 1}) {
-      auto states = CreateFecControllerPlrBased(initial_fec_enabled);
-      UpdateNetworkMetrics(&states, rtc::Optional<int>(bandwidth),
-                           rtc::Optional<float>());
-      CheckDecision(&states, initial_fec_enabled, 0.0);
-    }
-  }
-}
-
-TEST(FecControllerPlrBasedTest, EnableFecForHighBandwidth) {
-  auto states = CreateFecControllerPlrBased(false);
-  UpdateNetworkMetrics(&states, kEnablingBandwidthHigh,
-                       kEnablingPacketLossAtHighBw);
-  CheckDecision(&states, true, kEnablingPacketLossAtHighBw);
-}
-
-TEST(FecControllerPlrBasedTest, UpdateMultipleNetworkMetricsAtOnce) {
-  // This test is similar to EnableFecForHighBandwidth. But instead of
-  // using ::UpdateNetworkMetrics(...), which calls
-  // FecControllerPlrBased::UpdateNetworkMetrics(...) multiple times, we
-  // we call it only once. This is to verify that
-  // FecControllerPlrBased::UpdateNetworkMetrics(...) can handle multiple
-  // network updates at once. This is, however, not a common use case in current
-  // audio_network_adaptor_impl.cc.
-  auto states = CreateFecControllerPlrBased(false);
-  Controller::NetworkMetrics network_metrics;
-  network_metrics.uplink_bandwidth_bps =
-      rtc::Optional<int>(kEnablingBandwidthHigh);
-  network_metrics.uplink_packet_loss_fraction =
-      rtc::Optional<float>(kEnablingPacketLossAtHighBw);
-  EXPECT_CALL(*states.packet_loss_smoother, GetAverage())
-      .WillOnce(Return(rtc::Optional<float>(kEnablingPacketLossAtHighBw)));
-  states.controller->UpdateNetworkMetrics(network_metrics);
-  CheckDecision(&states, true, kEnablingPacketLossAtHighBw);
-}
-
-TEST(FecControllerPlrBasedTest, MaintainFecOffForHighBandwidth) {
-  auto states = CreateFecControllerPlrBased(false);
-  constexpr float kPacketLoss = kEnablingPacketLossAtHighBw * 0.99f;
-  UpdateNetworkMetrics(&states, kEnablingBandwidthHigh, kPacketLoss);
-  CheckDecision(&states, false, kPacketLoss);
-}
-
-TEST(FecControllerPlrBasedTest, EnableFecForMediumBandwidth) {
-  auto states = CreateFecControllerPlrBased(false);
-  constexpr float kPacketLoss =
-      (kEnablingPacketLossAtLowBw + kEnablingPacketLossAtHighBw) / 2.0;
-  UpdateNetworkMetrics(&states,
-                       (kEnablingBandwidthHigh + kEnablingBandwidthLow) / 2,
-                       kPacketLoss);
-  CheckDecision(&states, true, kPacketLoss);
-}
-
-TEST(FecControllerPlrBasedTest, MaintainFecOffForMediumBandwidth) {
-  auto states = CreateFecControllerPlrBased(false);
-  constexpr float kPacketLoss =
-      kEnablingPacketLossAtLowBw * 0.49f + kEnablingPacketLossAtHighBw * 0.51f;
-  UpdateNetworkMetrics(&states,
-                       (kEnablingBandwidthHigh + kEnablingBandwidthLow) / 2,
-                       kPacketLoss);
-  CheckDecision(&states, false, kPacketLoss);
-}
-
-TEST(FecControllerPlrBasedTest, EnableFecForLowBandwidth) {
-  auto states = CreateFecControllerPlrBased(false);
-  UpdateNetworkMetrics(&states, kEnablingBandwidthLow,
-                       kEnablingPacketLossAtLowBw);
-  CheckDecision(&states, true, kEnablingPacketLossAtLowBw);
-}
-
-TEST(FecControllerPlrBasedTest, MaintainFecOffForLowBandwidth) {
-  auto states = CreateFecControllerPlrBased(false);
-  constexpr float kPacketLoss = kEnablingPacketLossAtLowBw * 0.99f;
-  UpdateNetworkMetrics(&states, kEnablingBandwidthLow, kPacketLoss);
-  CheckDecision(&states, false, kPacketLoss);
-}
-
-TEST(FecControllerPlrBasedTest, MaintainFecOffForVeryLowBandwidth) {
-  auto states = CreateFecControllerPlrBased(false);
-  // Below |kEnablingBandwidthLow|, no packet loss fraction can cause FEC to
-  // turn on.
-  UpdateNetworkMetrics(&states, kEnablingBandwidthLow - 1, 1.0);
-  CheckDecision(&states, false, 1.0);
-}
-
-TEST(FecControllerPlrBasedTest, DisableFecForHighBandwidth) {
-  auto states = CreateFecControllerPlrBased(true);
-  constexpr float kPacketLoss = kDisablingPacketLossAtHighBw - kEpsilon;
-  UpdateNetworkMetrics(&states, kDisablingBandwidthHigh, kPacketLoss);
-  CheckDecision(&states, false, kPacketLoss);
-}
-
-TEST(FecControllerPlrBasedTest, MaintainFecOnForHighBandwidth) {
-  // Note: Disabling happens when the value is strictly below the threshold.
-  auto states = CreateFecControllerPlrBased(true);
-  UpdateNetworkMetrics(&states, kDisablingBandwidthHigh,
-                       kDisablingPacketLossAtHighBw);
-  CheckDecision(&states, true, kDisablingPacketLossAtHighBw);
-}
-
-TEST(FecControllerPlrBasedTest, DisableFecOnMediumBandwidth) {
-  auto states = CreateFecControllerPlrBased(true);
-  constexpr float kPacketLoss =
-      (kDisablingPacketLossAtLowBw + kDisablingPacketLossAtHighBw) / 2.0f -
-      kEpsilon;
-  UpdateNetworkMetrics(&states,
-                       (kDisablingBandwidthHigh + kDisablingBandwidthLow) / 2,
-                       kPacketLoss);
-  CheckDecision(&states, false, kPacketLoss);
-}
-
-TEST(FecControllerPlrBasedTest, MaintainFecOnForMediumBandwidth) {
-  auto states = CreateFecControllerPlrBased(true);
-  constexpr float kPacketLoss = kDisablingPacketLossAtLowBw * 0.51f +
-                                kDisablingPacketLossAtHighBw * 0.49f - kEpsilon;
-  UpdateNetworkMetrics(&states,
-                       (kEnablingBandwidthHigh + kDisablingBandwidthLow) / 2,
-                       kPacketLoss);
-  CheckDecision(&states, true, kPacketLoss);
-}
-
-TEST(FecControllerPlrBasedTest, DisableFecForLowBandwidth) {
-  auto states = CreateFecControllerPlrBased(true);
-  constexpr float kPacketLoss = kDisablingPacketLossAtLowBw - kEpsilon;
-  UpdateNetworkMetrics(&states, kDisablingBandwidthLow, kPacketLoss);
-  CheckDecision(&states, false, kPacketLoss);
-}
-
-TEST(FecControllerPlrBasedTest, DisableFecForVeryLowBandwidth) {
-  auto states = CreateFecControllerPlrBased(true);
-  // Below |kEnablingBandwidthLow|, any packet loss fraction can cause FEC to
-  // turn off.
-  UpdateNetworkMetrics(&states, kDisablingBandwidthLow - 1, 1.0);
-  CheckDecision(&states, false, 1.0);
-}
-
-TEST(FecControllerPlrBasedTest, CheckBehaviorOnChangingNetworkMetrics) {
-  // In this test, we let the network metrics to traverse from 1 to 5.
-  // packet-loss ^ 1 |  |
-  //             |   | 2|
-  //             |    \  \ 3
-  //             |     \4 \_______
-  //             |      \_________
-  //             |---------5-------> bandwidth
-
-  auto states = CreateFecControllerPlrBased(true);
-  UpdateNetworkMetrics(&states, kDisablingBandwidthLow - 1, 1.0);
-  CheckDecision(&states, false, 1.0);
-
-  UpdateNetworkMetrics(&states, kEnablingBandwidthLow,
-                       kEnablingPacketLossAtLowBw * 0.99f);
-  CheckDecision(&states, false, kEnablingPacketLossAtLowBw * 0.99f);
-
-  UpdateNetworkMetrics(&states, kEnablingBandwidthHigh,
-                       kEnablingPacketLossAtHighBw);
-  CheckDecision(&states, true, kEnablingPacketLossAtHighBw);
-
-  UpdateNetworkMetrics(&states, kDisablingBandwidthHigh,
-                       kDisablingPacketLossAtHighBw);
-  CheckDecision(&states, true, kDisablingPacketLossAtHighBw);
-
-  UpdateNetworkMetrics(&states, kDisablingBandwidthHigh + 1, 0.0);
-  CheckDecision(&states, false, 0.0);
-}
-
-TEST(FecControllerPlrBasedTest, CheckBehaviorOnSpecialCurves) {
-  // We test a special configuration, where the points to define the FEC
-  // enabling/disabling curves are placed like the following, otherwise the test
-  // is the same as CheckBehaviorOnChangingNetworkMetrics.
-  //
-  // packet-loss ^   |  |
-  //             |   | C|
-  //             |   |  |
-  //             |   | D|_______
-  //             |  A|___B______
-  //             |-----------------> bandwidth
-
-  constexpr int kEnablingBandwidthHigh = kEnablingBandwidthLow;
-  constexpr float kDisablingPacketLossAtLowBw = kDisablingPacketLossAtHighBw;
-  FecControllerPlrBasedTestStates states;
-  std::unique_ptr<MockSmoothingFilter> mock_smoothing_filter(
-      new NiceMock<MockSmoothingFilter>());
-  states.packet_loss_smoother = mock_smoothing_filter.get();
-  states.controller.reset(new FecControllerPlrBased(
-      FecControllerPlrBased::Config(
-          true,
-          ThresholdCurve(kEnablingBandwidthLow, kEnablingPacketLossAtLowBw,
-                         kEnablingBandwidthHigh, kEnablingPacketLossAtHighBw),
-          ThresholdCurve(kDisablingBandwidthLow, kDisablingPacketLossAtLowBw,
-                         kDisablingBandwidthHigh, kDisablingPacketLossAtHighBw),
-          0),
-      std::move(mock_smoothing_filter)));
-
-  UpdateNetworkMetrics(&states, kDisablingBandwidthLow - 1, 1.0);
-  CheckDecision(&states, false, 1.0);
-
-  UpdateNetworkMetrics(&states, kEnablingBandwidthLow,
-                       kEnablingPacketLossAtHighBw * 0.99f);
-  CheckDecision(&states, false, kEnablingPacketLossAtHighBw * 0.99f);
-
-  UpdateNetworkMetrics(&states, kEnablingBandwidthHigh,
-                       kEnablingPacketLossAtHighBw);
-  CheckDecision(&states, true, kEnablingPacketLossAtHighBw);
-
-  UpdateNetworkMetrics(&states, kDisablingBandwidthHigh,
-                       kDisablingPacketLossAtHighBw);
-  CheckDecision(&states, true, kDisablingPacketLossAtHighBw);
-
-  UpdateNetworkMetrics(&states, kDisablingBandwidthHigh + 1, 0.0);
-  CheckDecision(&states, false, 0.0);
-}
-
-TEST(FecControllerPlrBasedTest, SingleThresholdCurveForEnablingAndDisabling) {
-  // Note: To avoid numerical errors, keep kPacketLossAtLowBw and
-  // kPacketLossAthighBw as (negative) integer powers of 2.
-  // This is mostly relevant for the O3 case.
-  constexpr int kBandwidthLow = 10000;
-  constexpr float kPacketLossAtLowBw = 0.25f;
-  constexpr int kBandwidthHigh = 20000;
-  constexpr float kPacketLossAtHighBw = 0.125f;
-  auto curve = ThresholdCurve(kBandwidthLow, kPacketLossAtLowBw, kBandwidthHigh,
-                              kPacketLossAtHighBw);
-
-  // B* stands for "below-curve", O* for "on-curve", and A* for "above-curve".
-  //
-  //                                            //
-  // packet-loss ^                              //
-  //             |    |                         //
-  //             | B1 O1                        //
-  //             |    |                         //
-  //             |    O2                        //
-  //             |     \ A1                     //
-  //             |      \                       //
-  //             |       O3   A2                //
-  //             |     B2 \                     //
-  //             |         \                    //
-  //             |          O4--O5----          //
-  //             |                              //
-  //             |            B3                //
-  //             |-----------------> bandwidth  //
-
-  struct NetworkState {
-    int bandwidth;
-    float packet_loss;
-  };
-
-  std::vector<NetworkState> below{
-      {kBandwidthLow - 1, kPacketLossAtLowBw + 0.1f},  // B1
-      {(kBandwidthLow + kBandwidthHigh) / 2,
-       (kPacketLossAtLowBw + kPacketLossAtHighBw) / 2 - kEpsilon},  // B2
-      {kBandwidthHigh + 1, kPacketLossAtHighBw - kEpsilon}          // B3
-  };
-
-  std::vector<NetworkState> on{
-      {kBandwidthLow, kPacketLossAtLowBw + 0.1f},  // O1
-      {kBandwidthLow, kPacketLossAtLowBw},         // O2
-      {(kBandwidthLow + kBandwidthHigh) / 2,
-       (kPacketLossAtLowBw + kPacketLossAtHighBw) / 2},  // O3
-      {kBandwidthHigh, kPacketLossAtHighBw},             // O4
-      {kBandwidthHigh + 1, kPacketLossAtHighBw},         // O5
-  };
-
-  std::vector<NetworkState> above{
-      {(kBandwidthLow + kBandwidthHigh) / 2,
-       (kPacketLossAtLowBw + kPacketLossAtHighBw) / 2 + kEpsilon},  // A1
-      {kBandwidthHigh + 1, kPacketLossAtHighBw + kEpsilon},         // A2
-  };
-
-  // Test that FEC is turned off whenever we're below the curve, independent
-  // of the starting FEC state.
-  for (NetworkState net_state : below) {
-    for (bool initial_fec_enabled : {false, true}) {
-      auto states =
-          CreateFecControllerPlrBased(initial_fec_enabled, curve, curve);
-      UpdateNetworkMetrics(&states, net_state.bandwidth, net_state.packet_loss);
-      CheckDecision(&states, false, net_state.packet_loss);
-    }
-  }
-
-  // Test that FEC is turned on whenever we're on the curve or above it,
-  // independent of the starting FEC state.
-  for (std::vector<NetworkState> states_list : {on, above}) {
-    for (NetworkState net_state : states_list) {
-      for (bool initial_fec_enabled : {false, true}) {
-        auto states =
-            CreateFecControllerPlrBased(initial_fec_enabled, curve, curve);
-        UpdateNetworkMetrics(&states, net_state.bandwidth,
-                             net_state.packet_loss);
-        CheckDecision(&states, true, net_state.packet_loss);
-      }
-    }
-  }
-}
-
-TEST(FecControllerPlrBasedTest, FecAlwaysOff) {
-  ThresholdCurve always_off_curve(0, 1.0f + kEpsilon, 0, 1.0f + kEpsilon);
-  for (bool initial_fec_enabled : {false, true}) {
-    for (int bandwidth : {0, 10000}) {
-      for (float packet_loss : {0.0f, 0.5f, 1.0f}) {
-        auto states = CreateFecControllerPlrBased(
-            initial_fec_enabled, always_off_curve, always_off_curve);
-        UpdateNetworkMetrics(&states, bandwidth, packet_loss);
-        CheckDecision(&states, false, packet_loss);
-      }
-    }
-  }
-}
-
-TEST(FecControllerPlrBasedTest, FecAlwaysOn) {
-  ThresholdCurve always_on_curve(0, 0.0f, 0, 0.0f);
-  for (bool initial_fec_enabled : {false, true}) {
-    for (int bandwidth : {0, 10000}) {
-      for (float packet_loss : {0.0f, 0.5f, 1.0f}) {
-        auto states = CreateFecControllerPlrBased(
-            initial_fec_enabled, always_on_curve, always_on_curve);
-        UpdateNetworkMetrics(&states, bandwidth, packet_loss);
-        CheckDecision(&states, true, packet_loss);
-      }
-    }
-  }
-}
-
-#if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
-TEST(FecControllerPlrBasedDeathTest, InvalidConfig) {
-  FecControllerPlrBasedTestStates states;
-  std::unique_ptr<MockSmoothingFilter> mock_smoothing_filter(
-      new NiceMock<MockSmoothingFilter>());
-  states.packet_loss_smoother = mock_smoothing_filter.get();
-  EXPECT_DEATH(
-      states.controller.reset(new FecControllerPlrBased(
-          FecControllerPlrBased::Config(
-              true,
-              ThresholdCurve(kDisablingBandwidthLow - 1,
-                             kEnablingPacketLossAtLowBw, kEnablingBandwidthHigh,
-                             kEnablingPacketLossAtHighBw),
-              ThresholdCurve(
-                  kDisablingBandwidthLow, kDisablingPacketLossAtLowBw,
-                  kDisablingBandwidthHigh, kDisablingPacketLossAtHighBw),
-              0),
-          std::move(mock_smoothing_filter))),
-      "Check failed");
-}
-#endif
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/audio_network_adaptor/fec_controller_rplr_based.cc b/modules/audio_coding/audio_network_adaptor/fec_controller_rplr_based.cc
deleted file mode 100644
index 0cf6d3b..0000000
--- a/modules/audio_coding/audio_network_adaptor/fec_controller_rplr_based.cc
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- *  Copyright (c) 2017 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/fec_controller_rplr_based.h"
-
-#include <limits>
-#include <utility>
-
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-
-FecControllerRplrBased::Config::Config(
-    bool initial_fec_enabled,
-    const ThresholdCurve& fec_enabling_threshold,
-    const ThresholdCurve& fec_disabling_threshold)
-    : initial_fec_enabled(initial_fec_enabled),
-      fec_enabling_threshold(fec_enabling_threshold),
-      fec_disabling_threshold(fec_disabling_threshold) {}
-
-FecControllerRplrBased::FecControllerRplrBased(const Config& config)
-    : config_(config), fec_enabled_(config.initial_fec_enabled) {
-  RTC_DCHECK(config_.fec_disabling_threshold <= config_.fec_enabling_threshold);
-}
-
-FecControllerRplrBased::~FecControllerRplrBased() = default;
-
-void FecControllerRplrBased::UpdateNetworkMetrics(
-    const NetworkMetrics& network_metrics) {
-  if (network_metrics.uplink_bandwidth_bps)
-    uplink_bandwidth_bps_ = network_metrics.uplink_bandwidth_bps;
-  if (network_metrics.uplink_recoverable_packet_loss_fraction) {
-    uplink_recoverable_packet_loss_ =
-        network_metrics.uplink_recoverable_packet_loss_fraction;
-  }
-}
-
-void FecControllerRplrBased::MakeDecision(AudioEncoderRuntimeConfig* config) {
-  RTC_DCHECK(!config->enable_fec);
-  RTC_DCHECK(!config->uplink_packet_loss_fraction);
-
-  fec_enabled_ = fec_enabled_ ? !FecDisablingDecision() : FecEnablingDecision();
-
-  config->enable_fec = rtc::Optional<bool>(fec_enabled_);
-  config->uplink_packet_loss_fraction = rtc::Optional<float>(
-      uplink_recoverable_packet_loss_ ? *uplink_recoverable_packet_loss_ : 0.0);
-}
-
-bool FecControllerRplrBased::FecEnablingDecision() const {
-  if (!uplink_bandwidth_bps_ || !uplink_recoverable_packet_loss_) {
-    return false;
-  } else {
-    // Enable when above the curve or exactly on it.
-    return !config_.fec_enabling_threshold.IsBelowCurve(
-        {static_cast<float>(*uplink_bandwidth_bps_),
-         *uplink_recoverable_packet_loss_});
-  }
-}
-
-bool FecControllerRplrBased::FecDisablingDecision() const {
-  if (!uplink_bandwidth_bps_ || !uplink_recoverable_packet_loss_) {
-    return false;
-  } else {
-    // Disable when below the curve.
-    return config_.fec_disabling_threshold.IsBelowCurve(
-        {static_cast<float>(*uplink_bandwidth_bps_),
-         *uplink_recoverable_packet_loss_});
-  }
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/audio_network_adaptor/fec_controller_rplr_based.h b/modules/audio_coding/audio_network_adaptor/fec_controller_rplr_based.h
deleted file mode 100644
index ce04dc7..0000000
--- a/modules/audio_coding/audio_network_adaptor/fec_controller_rplr_based.h
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- *  Copyright (c) 2017 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_FEC_CONTROLLER_RPLR_BASED_H_
-#define WEBRTC_MODULES_AUDIO_CODING_AUDIO_NETWORK_ADAPTOR_FEC_CONTROLLER_RPLR_BASED_H_
-
-#include <memory>
-
-#include "webrtc/modules/audio_coding/audio_network_adaptor/controller.h"
-#include "webrtc/modules/audio_coding/audio_network_adaptor/util/threshold_curve.h"
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace webrtc {
-
-class FecControllerRplrBased final : public Controller {
- public:
-  struct Config {
-    // |fec_enabling_threshold| defines a curve, above which FEC should be
-    // enabled. |fec_disabling_threshold| defines a curve, under which FEC
-    // should be disabled. See below
-    //
-    // recoverable
-    // packet-loss ^   |  |
-    //             |   |  |   FEC
-    //             |    \  \   ON
-    //             | FEC \  \_______ fec_enabling_threshold
-    //             | OFF  \_________ fec_disabling_threshold
-    //             |-----------------> bandwidth
-    Config(bool initial_fec_enabled,
-           const ThresholdCurve& fec_enabling_threshold,
-           const ThresholdCurve& fec_disabling_threshold);
-    bool initial_fec_enabled;
-    ThresholdCurve fec_enabling_threshold;
-    ThresholdCurve fec_disabling_threshold;
-  };
-
-  explicit FecControllerRplrBased(const Config& config);
-
-  ~FecControllerRplrBased() override;
-
-  void UpdateNetworkMetrics(const NetworkMetrics& network_metrics) override;
-
-  void MakeDecision(AudioEncoderRuntimeConfig* config) override;
-
- private:
-  bool FecEnablingDecision() const;
-  bool FecDisablingDecision() const;
-
-  const Config config_;
-  bool fec_enabled_;
-  rtc::Optional<int> uplink_bandwidth_bps_;
-  rtc::Optional<float> uplink_recoverable_packet_loss_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(FecControllerRplrBased);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_CODING_AUDIO_NETWORK_ADAPTOR_FEC_CONTROLLER_RPLR_BASED_H_
diff --git a/modules/audio_coding/audio_network_adaptor/fec_controller_rplr_based_unittest.cc b/modules/audio_coding/audio_network_adaptor/fec_controller_rplr_based_unittest.cc
deleted file mode 100644
index a7b057c..0000000
--- a/modules/audio_coding/audio_network_adaptor/fec_controller_rplr_based_unittest.cc
+++ /dev/null
@@ -1,532 +0,0 @@
-/*
- *  Copyright (c) 2017 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 <random>
-#include <utility>
-
-#include "webrtc/modules/audio_coding/audio_network_adaptor/fec_controller_rplr_based.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-namespace {
-
-// The test uses the following settings:
-//
-// recoverable ^
-// packet-loss |   |  |
-//             |  A| C|   FEC
-//             |    \  \   ON
-//             | FEC \ D\_______
-//             | OFF B\_________
-//             |-----------------> bandwidth
-//
-// A : (kDisablingBandwidthLow, kDisablingRecoverablePacketLossAtLowBw)
-// B : (kDisablingBandwidthHigh, kDisablingRecoverablePacketLossAtHighBw)
-// C : (kEnablingBandwidthLow, kEnablingRecoverablePacketLossAtLowBw)
-// D : (kEnablingBandwidthHigh, kEnablingRecoverablePacketLossAtHighBw)
-
-constexpr int kDisablingBandwidthLow = 15000;
-constexpr float kDisablingRecoverablePacketLossAtLowBw = 0.08f;
-constexpr int kDisablingBandwidthHigh = 64000;
-constexpr float kDisablingRecoverablePacketLossAtHighBw = 0.01f;
-constexpr int kEnablingBandwidthLow = 17000;
-constexpr float kEnablingRecoverablePacketLossAtLowBw = 0.1f;
-constexpr int kEnablingBandwidthHigh = 64000;
-constexpr float kEnablingRecoverablePacketLossAtHighBw = 0.05f;
-
-constexpr float kEpsilon = 1e-5f;
-
-rtc::Optional<float> GetRandomProbabilityOrUnknown() {
-  std::random_device rd;
-  std::mt19937 generator(rd());
-  std::uniform_real_distribution<> distribution(0, 1);
-
-  if (distribution(generator) < 0.2) {
-    return rtc::Optional<float>();
-  } else {
-    return rtc::Optional<float>(distribution(generator));
-  }
-}
-
-std::unique_ptr<FecControllerRplrBased> CreateFecControllerRplrBased(
-    bool initial_fec_enabled) {
-  return std::unique_ptr<FecControllerRplrBased>(
-      new FecControllerRplrBased(FecControllerRplrBased::Config(
-          initial_fec_enabled,
-          ThresholdCurve(
-              kEnablingBandwidthLow, kEnablingRecoverablePacketLossAtLowBw,
-              kEnablingBandwidthHigh, kEnablingRecoverablePacketLossAtHighBw),
-          ThresholdCurve(kDisablingBandwidthLow,
-                         kDisablingRecoverablePacketLossAtLowBw,
-                         kDisablingBandwidthHigh,
-                         kDisablingRecoverablePacketLossAtHighBw))));
-}
-
-void UpdateNetworkMetrics(
-    FecControllerRplrBased* controller,
-    const rtc::Optional<int>& uplink_bandwidth_bps,
-    const rtc::Optional<float>& uplink_packet_loss,
-    const rtc::Optional<float>& uplink_recoveralbe_packet_loss) {
-  // UpdateNetworkMetrics can accept multiple network metric updates at once.
-  // However, currently, the most used case is to update one metric at a time.
-  // To reflect this fact, we separate the calls.
-  if (uplink_bandwidth_bps) {
-    Controller::NetworkMetrics network_metrics;
-    network_metrics.uplink_bandwidth_bps = uplink_bandwidth_bps;
-    controller->UpdateNetworkMetrics(network_metrics);
-  }
-  if (uplink_packet_loss) {
-    Controller::NetworkMetrics network_metrics;
-    network_metrics.uplink_packet_loss_fraction = uplink_packet_loss;
-    controller->UpdateNetworkMetrics(network_metrics);
-  }
-  if (uplink_recoveralbe_packet_loss) {
-    Controller::NetworkMetrics network_metrics;
-    network_metrics.uplink_recoverable_packet_loss_fraction =
-        uplink_recoveralbe_packet_loss;
-    controller->UpdateNetworkMetrics(network_metrics);
-  }
-}
-
-void UpdateNetworkMetrics(
-    FecControllerRplrBased* controller,
-    const rtc::Optional<int>& uplink_bandwidth_bps,
-    const rtc::Optional<float>& uplink_recoveralbe_packet_loss) {
-  // FecControllerRplrBased doesn't currently use the PLR (general packet-loss
-  // rate) at all. (This might be changed in the future.) The unit-tests will
-  // use a random value (including unknown), to show this does not interfere.
-  UpdateNetworkMetrics(controller, uplink_bandwidth_bps,
-                       GetRandomProbabilityOrUnknown(),
-                       uplink_recoveralbe_packet_loss);
-}
-
-void UpdateNetworkMetrics(FecControllerRplrBased* controller,
-                          int uplink_bandwidth_bps,
-                          float uplink_recoveralbe_packet_loss) {
-  UpdateNetworkMetrics(controller, rtc::Optional<int>(uplink_bandwidth_bps),
-                       rtc::Optional<float>(uplink_recoveralbe_packet_loss));
-}
-
-// Checks that the FEC decision and |uplink_packet_loss_fraction| given by
-// |states->controller->MakeDecision| matches |expected_enable_fec| and
-// |expected_uplink_packet_loss_fraction|, respectively.
-void CheckDecision(FecControllerRplrBased* controller,
-                   bool expected_enable_fec,
-                   float expected_uplink_packet_loss_fraction) {
-  AudioEncoderRuntimeConfig config;
-  controller->MakeDecision(&config);
-
-  // Less compact than comparing optionals, but yields more readable errors.
-  EXPECT_TRUE(config.enable_fec);
-  if (config.enable_fec) {
-    EXPECT_EQ(expected_enable_fec, *config.enable_fec);
-  }
-  EXPECT_TRUE(config.uplink_packet_loss_fraction);
-  if (config.uplink_packet_loss_fraction) {
-    EXPECT_EQ(expected_uplink_packet_loss_fraction,
-              *config.uplink_packet_loss_fraction);
-  }
-}
-
-}  // namespace
-
-TEST(FecControllerRplrBasedTest, OutputInitValueBeforeAnyInputsAreReceived) {
-  for (bool initial_fec_enabled : {false, true}) {
-    auto controller = CreateFecControllerRplrBased(initial_fec_enabled);
-    CheckDecision(controller.get(), initial_fec_enabled, 0);
-  }
-}
-
-TEST(FecControllerRplrBasedTest, OutputInitValueWhenUplinkBandwidthUnknown) {
-  // Regardless of the initial FEC state and the recoverable-packet-loss
-  // rate, the initial FEC state is maintained as long as the BWE is unknown.
-  for (bool initial_fec_enabled : {false, true}) {
-    for (float recoverable_packet_loss :
-         {kDisablingRecoverablePacketLossAtHighBw - kEpsilon,
-          kDisablingRecoverablePacketLossAtHighBw,
-          kDisablingRecoverablePacketLossAtHighBw + kEpsilon,
-          kEnablingRecoverablePacketLossAtHighBw - kEpsilon,
-          kEnablingRecoverablePacketLossAtHighBw,
-          kEnablingRecoverablePacketLossAtHighBw + kEpsilon}) {
-      auto controller = CreateFecControllerRplrBased(initial_fec_enabled);
-      UpdateNetworkMetrics(controller.get(), rtc::Optional<int>(),
-                           rtc::Optional<float>(recoverable_packet_loss));
-      CheckDecision(controller.get(), initial_fec_enabled,
-                    recoverable_packet_loss);
-    }
-  }
-}
-
-TEST(FecControllerRplrBasedTest,
-     OutputInitValueWhenUplinkRecoverablePacketLossFractionUnknown) {
-  // Regardless of the initial FEC state and the BWE, the initial FEC state
-  // is maintained as long as the recoverable-packet-loss rate is unknown.
-  for (bool initial_fec_enabled : {false, true}) {
-    for (int bandwidth : {kDisablingBandwidthLow - 1, kDisablingBandwidthLow,
-                          kDisablingBandwidthLow + 1, kEnablingBandwidthLow - 1,
-                          kEnablingBandwidthLow, kEnablingBandwidthLow + 1}) {
-      auto controller = CreateFecControllerRplrBased(initial_fec_enabled);
-      UpdateNetworkMetrics(controller.get(), rtc::Optional<int>(bandwidth),
-                           rtc::Optional<float>());
-      CheckDecision(controller.get(), initial_fec_enabled, 0.0);
-    }
-  }
-}
-
-TEST(FecControllerRplrBasedTest, EnableFecForHighBandwidth) {
-  auto controller = CreateFecControllerRplrBased(false);
-  UpdateNetworkMetrics(controller.get(), kEnablingBandwidthHigh,
-                       kEnablingRecoverablePacketLossAtHighBw);
-  CheckDecision(controller.get(), true, kEnablingRecoverablePacketLossAtHighBw);
-}
-
-TEST(FecControllerRplrBasedTest, UpdateMultipleNetworkMetricsAtOnce) {
-  // This test is similar to EnableFecForHighBandwidth. But instead of
-  // using ::UpdateNetworkMetrics(...), which calls
-  // FecControllerRplrBasedTest::UpdateNetworkMetrics(...) multiple times, we
-  // we call it only once. This is to verify that
-  // FecControllerRplrBasedTest::UpdateNetworkMetrics(...) can handle multiple
-  // network updates at once. This is, however, not a common use case in current
-  // audio_network_adaptor_impl.cc.
-  auto controller = CreateFecControllerRplrBased(false);
-  Controller::NetworkMetrics network_metrics;
-  network_metrics.uplink_bandwidth_bps =
-      rtc::Optional<int>(kEnablingBandwidthHigh);
-  network_metrics.uplink_packet_loss_fraction =
-      rtc::Optional<float>(GetRandomProbabilityOrUnknown());
-  network_metrics.uplink_recoverable_packet_loss_fraction =
-      rtc::Optional<float>(kEnablingRecoverablePacketLossAtHighBw);
-  controller->UpdateNetworkMetrics(network_metrics);
-  CheckDecision(controller.get(), true, kEnablingRecoverablePacketLossAtHighBw);
-}
-
-TEST(FecControllerRplrBasedTest, MaintainFecOffForHighBandwidth) {
-  auto controller = CreateFecControllerRplrBased(false);
-  constexpr float kRecoverablePacketLoss =
-      kEnablingRecoverablePacketLossAtHighBw * 0.99f;
-  UpdateNetworkMetrics(controller.get(), kEnablingBandwidthHigh,
-                       kRecoverablePacketLoss);
-  CheckDecision(controller.get(), false, kRecoverablePacketLoss);
-}
-
-TEST(FecControllerRplrBasedTest, EnableFecForMediumBandwidth) {
-  auto controller = CreateFecControllerRplrBased(false);
-  constexpr float kRecoverablePacketLoss =
-      (kEnablingRecoverablePacketLossAtLowBw +
-       kEnablingRecoverablePacketLossAtHighBw) / 2.0;
-  UpdateNetworkMetrics(
-      controller.get(),
-      (kEnablingBandwidthHigh + kEnablingBandwidthLow) / 2,
-      kRecoverablePacketLoss);
-  CheckDecision(controller.get(), true, kRecoverablePacketLoss);
-}
-
-TEST(FecControllerRplrBasedTest, MaintainFecOffForMediumBandwidth) {
-  auto controller = CreateFecControllerRplrBased(false);
-  constexpr float kRecoverablePacketLoss =
-      kEnablingRecoverablePacketLossAtLowBw * 0.49f +
-      kEnablingRecoverablePacketLossAtHighBw * 0.51f;
-  UpdateNetworkMetrics(controller.get(),
-                       (kEnablingBandwidthHigh + kEnablingBandwidthLow) / 2,
-                       kRecoverablePacketLoss);
-  CheckDecision(controller.get(), false, kRecoverablePacketLoss);
-}
-
-TEST(FecControllerRplrBasedTest, EnableFecForLowBandwidth) {
-  auto controller = CreateFecControllerRplrBased(false);
-  UpdateNetworkMetrics(controller.get(), kEnablingBandwidthLow,
-                       kEnablingRecoverablePacketLossAtLowBw);
-  CheckDecision(controller.get(), true, kEnablingRecoverablePacketLossAtLowBw);
-}
-
-TEST(FecControllerRplrBasedTest, MaintainFecOffForLowBandwidth) {
-  auto controller = CreateFecControllerRplrBased(false);
-  constexpr float kRecoverablePacketLoss =
-      kEnablingRecoverablePacketLossAtLowBw * 0.99f;
-  UpdateNetworkMetrics(controller.get(), kEnablingBandwidthLow,
-                       kRecoverablePacketLoss);
-  CheckDecision(controller.get(), false, kRecoverablePacketLoss);
-}
-
-TEST(FecControllerRplrBasedTest, MaintainFecOffForVeryLowBandwidth) {
-  auto controller = CreateFecControllerRplrBased(false);
-  // Below |kEnablingBandwidthLow|, no recoverable packet loss fraction can
-  // cause FEC to turn on.
-  UpdateNetworkMetrics(controller.get(), kEnablingBandwidthLow - 1, 1.0);
-  CheckDecision(controller.get(), false, 1.0);
-}
-
-TEST(FecControllerRplrBasedTest, DisableFecForHighBandwidth) {
-  auto controller = CreateFecControllerRplrBased(true);
-  constexpr float kRecoverablePacketLoss =
-      kDisablingRecoverablePacketLossAtHighBw - kEpsilon;
-  UpdateNetworkMetrics(controller.get(), kDisablingBandwidthHigh,
-                       kRecoverablePacketLoss);
-  CheckDecision(controller.get(), false, kRecoverablePacketLoss);
-}
-
-TEST(FecControllerRplrBasedTest, MaintainFecOnForHighBandwidth) {
-  // Note: Disabling happens when the value is strictly below the threshold.
-  auto controller = CreateFecControllerRplrBased(true);
-  UpdateNetworkMetrics(controller.get(), kDisablingBandwidthHigh,
-                       kDisablingRecoverablePacketLossAtHighBw);
-  CheckDecision(controller.get(), true,
-                kDisablingRecoverablePacketLossAtHighBw);
-}
-
-TEST(FecControllerRplrBasedTest, DisableFecOnMediumBandwidth) {
-  auto controller = CreateFecControllerRplrBased(true);
-  constexpr float kRecoverablePacketLoss =
-      ((kDisablingRecoverablePacketLossAtLowBw +
-        kDisablingRecoverablePacketLossAtHighBw) / 2.0f) - kEpsilon;
-  UpdateNetworkMetrics(
-      controller.get(),
-      (kDisablingBandwidthHigh + kDisablingBandwidthLow) / 2,
-      kRecoverablePacketLoss);
-  CheckDecision(controller.get(), false, kRecoverablePacketLoss);
-}
-
-TEST(FecControllerRplrBasedTest, MaintainFecOnForMediumBandwidth) {
-  auto controller = CreateFecControllerRplrBased(true);
-  constexpr float kRecoverablePacketLoss =
-      kDisablingRecoverablePacketLossAtLowBw * 0.51f +
-      kDisablingRecoverablePacketLossAtHighBw * 0.49f - kEpsilon;
-  UpdateNetworkMetrics(controller.get(),
-                       (kEnablingBandwidthHigh + kDisablingBandwidthLow) / 2,
-                       kRecoverablePacketLoss);
-  CheckDecision(controller.get(), true, kRecoverablePacketLoss);
-}
-
-TEST(FecControllerRplrBasedTest, DisableFecForLowBandwidth) {
-  auto controller = CreateFecControllerRplrBased(true);
-  constexpr float kRecoverablePacketLoss =
-      kDisablingRecoverablePacketLossAtLowBw - kEpsilon;
-  UpdateNetworkMetrics(controller.get(), kDisablingBandwidthLow,
-                       kRecoverablePacketLoss);
-  CheckDecision(controller.get(), false, kRecoverablePacketLoss);
-}
-
-TEST(FecControllerRplrBasedTest, DisableFecForVeryLowBandwidth) {
-  auto controller = CreateFecControllerRplrBased(true);
-  // Below |kEnablingBandwidthLow|, any recoverable packet loss fraction can
-  // cause FEC to turn off.
-  UpdateNetworkMetrics(controller.get(), kDisablingBandwidthLow - 1, 1.0);
-  CheckDecision(controller.get(), false, 1.0);
-}
-
-TEST(FecControllerRplrBasedTest, CheckBehaviorOnChangingNetworkMetrics) {
-  // In this test, we let the network metrics to traverse from 1 to 5.
-  //
-  // recoverable ^
-  // packet-loss | 1 |  |
-  //             |   | 2|
-  //             |    \  \ 3
-  //             |     \4 \_______
-  //             |      \_________
-  //             |---------5-------> bandwidth
-
-  auto controller = CreateFecControllerRplrBased(true);
-  UpdateNetworkMetrics(controller.get(), kDisablingBandwidthLow - 1, 1.0);
-  CheckDecision(controller.get(), false, 1.0);
-
-  UpdateNetworkMetrics(controller.get(), kEnablingBandwidthLow,
-                       kEnablingRecoverablePacketLossAtLowBw * 0.99f);
-  CheckDecision(controller.get(), false,
-                kEnablingRecoverablePacketLossAtLowBw * 0.99f);
-
-  UpdateNetworkMetrics(controller.get(), kEnablingBandwidthHigh,
-                       kEnablingRecoverablePacketLossAtHighBw);
-  CheckDecision(controller.get(), true, kEnablingRecoverablePacketLossAtHighBw);
-
-  UpdateNetworkMetrics(controller.get(), kDisablingBandwidthHigh,
-                       kDisablingRecoverablePacketLossAtHighBw);
-  CheckDecision(controller.get(), true,
-                kDisablingRecoverablePacketLossAtHighBw);
-
-  UpdateNetworkMetrics(controller.get(), kDisablingBandwidthHigh + 1, 0.0);
-  CheckDecision(controller.get(), false, 0.0);
-}
-
-TEST(FecControllerRplrBasedTest, CheckBehaviorOnSpecialCurves) {
-  // We test a special configuration, where the points to define the FEC
-  // enabling/disabling curves are placed like the following, otherwise the test
-  // is the same as CheckBehaviorOnChangingNetworkMetrics.
-  //
-  // recoverable ^
-  // packet-loss |   |  |
-  //             |   | C|
-  //             |   |  |
-  //             |   | D|_______
-  //             |  A|___B______
-  //             |-----------------> bandwidth
-
-  constexpr int kEnablingBandwidthHigh = kEnablingBandwidthLow;
-  constexpr float kDisablingRecoverablePacketLossAtLowBw =
-      kDisablingRecoverablePacketLossAtHighBw;
-  FecControllerRplrBased controller(FecControllerRplrBased::Config(
-      true,
-      ThresholdCurve(
-          kEnablingBandwidthLow, kEnablingRecoverablePacketLossAtLowBw,
-          kEnablingBandwidthHigh, kEnablingRecoverablePacketLossAtHighBw),
-      ThresholdCurve(
-          kDisablingBandwidthLow, kDisablingRecoverablePacketLossAtLowBw,
-          kDisablingBandwidthHigh, kDisablingRecoverablePacketLossAtHighBw)));
-
-  UpdateNetworkMetrics(&controller, kDisablingBandwidthLow - 1, 1.0);
-  CheckDecision(&controller, false, 1.0);
-
-  UpdateNetworkMetrics(&controller, kEnablingBandwidthLow,
-                       kEnablingRecoverablePacketLossAtHighBw * 0.99f);
-  CheckDecision(&controller, false,
-                kEnablingRecoverablePacketLossAtHighBw * 0.99f);
-
-  UpdateNetworkMetrics(&controller, kEnablingBandwidthHigh,
-                       kEnablingRecoverablePacketLossAtHighBw);
-  CheckDecision(&controller, true, kEnablingRecoverablePacketLossAtHighBw);
-
-  UpdateNetworkMetrics(&controller, kDisablingBandwidthHigh,
-                       kDisablingRecoverablePacketLossAtHighBw);
-  CheckDecision(&controller, true, kDisablingRecoverablePacketLossAtHighBw);
-
-  UpdateNetworkMetrics(&controller, kDisablingBandwidthHigh + 1, 0.0);
-  CheckDecision(&controller, false, 0.0);
-}
-
-TEST(FecControllerRplrBasedTest, SingleThresholdCurveForEnablingAndDisabling) {
-  // Note: To avoid numerical errors, keep kRecoverablePacketLossAtLowBw and
-  // kRecoverablePacketLossAthighBw as (negative) integer powers of 2.
-  // This is mostly relevant for the O3 case.
-  constexpr int kBandwidthLow = 10000;
-  constexpr float kRecoverablePacketLossAtLowBw = 0.25f;
-  constexpr int kBandwidthHigh = 20000;
-  constexpr float kRecoverablePacketLossAtHighBw = 0.125f;
-  auto curve = ThresholdCurve(kBandwidthLow, kRecoverablePacketLossAtLowBw,
-                              kBandwidthHigh, kRecoverablePacketLossAtHighBw);
-
-  // B* stands for "below-curve", O* for "on-curve", and A* for "above-curve".
-  //
-  //                                            //
-  // recoverable ^                              //
-  // packet-loss |    |                         //
-  //             | B1 O1                        //
-  //             |    |                         //
-  //             |    O2                        //
-  //             |     \ A1                     //
-  //             |      \                       //
-  //             |       O3   A2                //
-  //             |     B2 \                     //
-  //             |         \                    //
-  //             |          O4--O5----          //
-  //             |                              //
-  //             |            B3                //
-  //             |-----------------> bandwidth  //
-
-  struct NetworkState {
-    int bandwidth;
-    float recoverable_packet_loss;
-  };
-
-  std::vector<NetworkState> below{
-      {kBandwidthLow - 1, kRecoverablePacketLossAtLowBw + 0.1f},  // B1
-      {(kBandwidthLow + kBandwidthHigh) / 2,
-       (kRecoverablePacketLossAtLowBw + kRecoverablePacketLossAtHighBw) / 2 -
-           kEpsilon},                                                  // B2
-      {kBandwidthHigh + 1, kRecoverablePacketLossAtHighBw - kEpsilon}  // B3
-  };
-
-  std::vector<NetworkState> on{
-      {kBandwidthLow, kRecoverablePacketLossAtLowBw + 0.1f},  // O1
-      {kBandwidthLow, kRecoverablePacketLossAtLowBw},         // O2
-      {(kBandwidthLow + kBandwidthHigh) / 2,
-       (kRecoverablePacketLossAtLowBw + kRecoverablePacketLossAtHighBw) /
-           2},                                               // O3
-      {kBandwidthHigh, kRecoverablePacketLossAtHighBw},      // O4
-      {kBandwidthHigh + 1, kRecoverablePacketLossAtHighBw},  // O5
-  };
-
-  std::vector<NetworkState> above{
-      {(kBandwidthLow + kBandwidthHigh) / 2,
-       (kRecoverablePacketLossAtLowBw + kRecoverablePacketLossAtHighBw) / 2 +
-           kEpsilon},                                                   // A1
-      {kBandwidthHigh + 1, kRecoverablePacketLossAtHighBw + kEpsilon},  // A2
-  };
-
-  // Test that FEC is turned off whenever we're below the curve, independent
-  // of the starting FEC state.
-  for (NetworkState net_state : below) {
-    for (bool initial_fec_enabled : {false, true}) {
-      FecControllerRplrBased controller(
-          FecControllerRplrBased::Config(initial_fec_enabled, curve, curve));
-      UpdateNetworkMetrics(&controller, net_state.bandwidth,
-                           net_state.recoverable_packet_loss);
-      CheckDecision(&controller, false, net_state.recoverable_packet_loss);
-    }
-  }
-
-  // Test that FEC is turned on whenever we're on the curve or above it,
-  // independent of the starting FEC state.
-  for (std::vector<NetworkState> states_list : {on, above}) {
-    for (NetworkState net_state : states_list) {
-      for (bool initial_fec_enabled : {false, true}) {
-        FecControllerRplrBased controller(
-            FecControllerRplrBased::Config(initial_fec_enabled, curve, curve));
-        UpdateNetworkMetrics(&controller, net_state.bandwidth,
-                             net_state.recoverable_packet_loss);
-        CheckDecision(&controller, true, net_state.recoverable_packet_loss);
-      }
-    }
-  }
-}
-
-TEST(FecControllerRplrBasedTest, FecAlwaysOff) {
-  ThresholdCurve always_off_curve(0, 1.0f + kEpsilon, 0, 1.0f + kEpsilon);
-  for (bool initial_fec_enabled : {false, true}) {
-    for (int bandwidth : {0, 10000}) {
-      for (float recoverable_packet_loss : {0.0f, 0.5f, 1.0f}) {
-        FecControllerRplrBased controller(FecControllerRplrBased::Config(
-            initial_fec_enabled, always_off_curve, always_off_curve));
-        UpdateNetworkMetrics(&controller, bandwidth, recoverable_packet_loss);
-        CheckDecision(&controller, false, recoverable_packet_loss);
-      }
-    }
-  }
-}
-
-TEST(FecControllerRplrBasedTest, FecAlwaysOn) {
-  ThresholdCurve always_on_curve(0, 0.0f, 0, 0.0f);
-  for (bool initial_fec_enabled : {false, true}) {
-    for (int bandwidth : {0, 10000}) {
-      for (float recoverable_packet_loss : {0.0f, 0.5f, 1.0f}) {
-        FecControllerRplrBased controller(FecControllerRplrBased::Config(
-            initial_fec_enabled, always_on_curve, always_on_curve));
-        UpdateNetworkMetrics(&controller, bandwidth, recoverable_packet_loss);
-        CheckDecision(&controller, true, recoverable_packet_loss);
-      }
-    }
-  }
-}
-
-#if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
-TEST(FecControllerRplrBasedDeathTest, InvalidConfig) {
-  EXPECT_DEATH(
-      FecControllerRplrBased controller(FecControllerRplrBased::Config(
-          true,
-          ThresholdCurve(
-              kDisablingBandwidthLow - 1, kEnablingRecoverablePacketLossAtLowBw,
-              kEnablingBandwidthHigh, kEnablingRecoverablePacketLossAtHighBw),
-          ThresholdCurve(kDisablingBandwidthLow,
-                         kDisablingRecoverablePacketLossAtLowBw,
-                         kDisablingBandwidthHigh,
-                         kDisablingRecoverablePacketLossAtHighBw))),
-      "Check failed");
-}
-#endif
-}  // namespace webrtc
diff --git a/modules/audio_coding/audio_network_adaptor/frame_length_controller.cc b/modules/audio_coding/audio_network_adaptor/frame_length_controller.cc
deleted file mode 100644
index 4dd6088..0000000
--- a/modules/audio_coding/audio_network_adaptor/frame_length_controller.cc
+++ /dev/null
@@ -1,162 +0,0 @@
-/*
- *  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/frame_length_controller.h"
-
-#include <utility>
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-
-namespace webrtc {
-
-namespace {
-constexpr int kPreventOveruseMarginBps = 5000;
-
-int OverheadRateBps(size_t overhead_bytes_per_packet, int frame_length_ms) {
-  return static_cast<int>(overhead_bytes_per_packet * 8 * 1000 /
-                          frame_length_ms);
-}
-}
-
-FrameLengthController::Config::Config(
-    const std::vector<int>& encoder_frame_lengths_ms,
-    int initial_frame_length_ms,
-    int min_encoder_bitrate_bps,
-    float fl_increasing_packet_loss_fraction,
-    float fl_decreasing_packet_loss_fraction,
-    std::map<FrameLengthChange, int> fl_changing_bandwidths_bps)
-    : encoder_frame_lengths_ms(encoder_frame_lengths_ms),
-      initial_frame_length_ms(initial_frame_length_ms),
-      min_encoder_bitrate_bps(min_encoder_bitrate_bps),
-      fl_increasing_packet_loss_fraction(fl_increasing_packet_loss_fraction),
-      fl_decreasing_packet_loss_fraction(fl_decreasing_packet_loss_fraction),
-      fl_changing_bandwidths_bps(std::move(fl_changing_bandwidths_bps)) {}
-
-FrameLengthController::Config::Config(const Config& other) = default;
-
-FrameLengthController::Config::~Config() = default;
-
-FrameLengthController::FrameLengthController(const Config& config)
-    : config_(config) {
-  frame_length_ms_ = std::find(config_.encoder_frame_lengths_ms.begin(),
-                               config_.encoder_frame_lengths_ms.end(),
-                               config_.initial_frame_length_ms);
-  // |encoder_frame_lengths_ms| must contain |initial_frame_length_ms|.
-  RTC_DCHECK(frame_length_ms_ != config_.encoder_frame_lengths_ms.end());
-}
-
-FrameLengthController::~FrameLengthController() = default;
-
-void FrameLengthController::UpdateNetworkMetrics(
-    const NetworkMetrics& network_metrics) {
-  if (network_metrics.uplink_bandwidth_bps)
-    uplink_bandwidth_bps_ = network_metrics.uplink_bandwidth_bps;
-  if (network_metrics.uplink_packet_loss_fraction)
-    uplink_packet_loss_fraction_ = network_metrics.uplink_packet_loss_fraction;
-  if (network_metrics.overhead_bytes_per_packet)
-    overhead_bytes_per_packet_ = network_metrics.overhead_bytes_per_packet;
-}
-
-void FrameLengthController::MakeDecision(AudioEncoderRuntimeConfig* config) {
-  // Decision on |frame_length_ms| should not have been made.
-  RTC_DCHECK(!config->frame_length_ms);
-
-  if (FrameLengthIncreasingDecision(*config)) {
-    ++frame_length_ms_;
-  } else if (FrameLengthDecreasingDecision(*config)) {
-    --frame_length_ms_;
-  }
-  config->frame_length_ms = rtc::Optional<int>(*frame_length_ms_);
-}
-
-FrameLengthController::Config::FrameLengthChange::FrameLengthChange(
-    int from_frame_length_ms,
-    int to_frame_length_ms)
-    : from_frame_length_ms(from_frame_length_ms),
-      to_frame_length_ms(to_frame_length_ms) {}
-
-bool FrameLengthController::Config::FrameLengthChange::operator<(
-    const FrameLengthChange& rhs) const {
-  return from_frame_length_ms < rhs.from_frame_length_ms ||
-         (from_frame_length_ms == rhs.from_frame_length_ms &&
-          to_frame_length_ms < rhs.to_frame_length_ms);
-}
-
-bool FrameLengthController::FrameLengthIncreasingDecision(
-    const AudioEncoderRuntimeConfig& config) const {
-  // Increase frame length if
-  // 1. |uplink_bandwidth_bps| is known to be smaller or equal than
-  //    |min_encoder_bitrate_bps| plus |prevent_overuse_margin_bps| plus the
-  //    current overhead rate OR all the following:
-  // 2. longer frame length is available AND
-  // 3. |uplink_bandwidth_bps| is known to be smaller than a threshold AND
-  // 4. |uplink_packet_loss_fraction| is known to be smaller than a threshold.
-
-  auto longer_frame_length_ms = std::next(frame_length_ms_);
-  if (longer_frame_length_ms == config_.encoder_frame_lengths_ms.end())
-    return false;
-
-  auto increase_threshold = config_.fl_changing_bandwidths_bps.find(
-      Config::FrameLengthChange(*frame_length_ms_, *longer_frame_length_ms));
-
-  if (increase_threshold == config_.fl_changing_bandwidths_bps.end())
-    return false;
-
-  if (uplink_bandwidth_bps_ && overhead_bytes_per_packet_ &&
-      *uplink_bandwidth_bps_ <=
-          config_.min_encoder_bitrate_bps + kPreventOveruseMarginBps +
-              OverheadRateBps(*overhead_bytes_per_packet_, *frame_length_ms_)) {
-    return true;
-  }
-
-  return (uplink_bandwidth_bps_ &&
-          *uplink_bandwidth_bps_ <= increase_threshold->second) &&
-         (uplink_packet_loss_fraction_ &&
-          *uplink_packet_loss_fraction_ <=
-              config_.fl_increasing_packet_loss_fraction);
-}
-
-bool FrameLengthController::FrameLengthDecreasingDecision(
-    const AudioEncoderRuntimeConfig& config) const {
-  // Decrease frame length if
-  // 1. shorter frame length is available AND
-  // 2. |uplink_bandwidth_bps| is known to be bigger than
-  // |min_encoder_bitrate_bps| plus |prevent_overuse_margin_bps| plus the
-  // overhead which would be produced with the shorter frame length AND
-  // one or more of the followings:
-  // 3. |uplink_bandwidth_bps| is known to be larger than a threshold,
-  // 4. |uplink_packet_loss_fraction| is known to be larger than a threshold,
-  if (frame_length_ms_ == config_.encoder_frame_lengths_ms.begin())
-    return false;
-
-  auto shorter_frame_length_ms = std::prev(frame_length_ms_);
-  auto decrease_threshold = config_.fl_changing_bandwidths_bps.find(
-      Config::FrameLengthChange(*frame_length_ms_, *shorter_frame_length_ms));
-
-  if (decrease_threshold == config_.fl_changing_bandwidths_bps.end())
-    return false;
-
-  if (uplink_bandwidth_bps_ && overhead_bytes_per_packet_ &&
-      *uplink_bandwidth_bps_ <= config_.min_encoder_bitrate_bps +
-                                    kPreventOveruseMarginBps +
-                                    OverheadRateBps(*overhead_bytes_per_packet_,
-                                                    *shorter_frame_length_ms)) {
-    return false;
-  }
-
-  return (uplink_bandwidth_bps_ &&
-          *uplink_bandwidth_bps_ >= decrease_threshold->second) ||
-         (uplink_packet_loss_fraction_ &&
-          *uplink_packet_loss_fraction_ >=
-              config_.fl_decreasing_packet_loss_fraction);
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/audio_network_adaptor/frame_length_controller.h b/modules/audio_coding/audio_network_adaptor/frame_length_controller.h
deleted file mode 100644
index 47a48fc..0000000
--- a/modules/audio_coding/audio_network_adaptor/frame_length_controller.h
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- *  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_FRAME_LENGTH_CONTROLLER_H_
-#define WEBRTC_MODULES_AUDIO_CODING_AUDIO_NETWORK_ADAPTOR_FRAME_LENGTH_CONTROLLER_H_
-
-#include <map>
-#include <vector>
-
-#include "webrtc/modules/audio_coding/audio_network_adaptor/controller.h"
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace webrtc {
-
-// Determines target frame length based on the network metrics and the decision
-// of FEC controller.
-class FrameLengthController final : public Controller {
- public:
-  struct Config {
-    struct FrameLengthChange {
-      FrameLengthChange(int from_frame_length_ms, int to_frame_length_ms);
-      bool operator<(const FrameLengthChange& rhs) const;
-      int from_frame_length_ms;
-      int to_frame_length_ms;
-    };
-    Config(const std::vector<int>& encoder_frame_lengths_ms,
-           int initial_frame_length_ms,
-           int min_encoder_bitrate_bps,
-           float fl_increasing_packet_loss_fraction,
-           float fl_decreasing_packet_loss_fraction,
-           std::map<FrameLengthChange, int> fl_changing_bandwidths_bps);
-    Config(const Config& other);
-    ~Config();
-    std::vector<int> encoder_frame_lengths_ms;
-    int initial_frame_length_ms;
-    int min_encoder_bitrate_bps;
-    // Uplink packet loss fraction below which frame length can increase.
-    float fl_increasing_packet_loss_fraction;
-    // Uplink packet loss fraction below which frame length should decrease.
-    float fl_decreasing_packet_loss_fraction;
-    std::map<FrameLengthChange, int> fl_changing_bandwidths_bps;
-  };
-
-  explicit FrameLengthController(const Config& config);
-
-  ~FrameLengthController() override;
-
-  void UpdateNetworkMetrics(const NetworkMetrics& network_metrics) override;
-
-  void MakeDecision(AudioEncoderRuntimeConfig* config) override;
-
- private:
-  bool FrameLengthIncreasingDecision(
-      const AudioEncoderRuntimeConfig& config) const;
-
-  bool FrameLengthDecreasingDecision(
-      const AudioEncoderRuntimeConfig& config) const;
-
-  const Config config_;
-
-  std::vector<int>::const_iterator frame_length_ms_;
-
-  rtc::Optional<int> uplink_bandwidth_bps_;
-
-  rtc::Optional<float> uplink_packet_loss_fraction_;
-
-  rtc::Optional<size_t> overhead_bytes_per_packet_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(FrameLengthController);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_CODING_AUDIO_NETWORK_ADAPTOR_FRAME_LENGTH_CONTROLLER_H_
diff --git a/modules/audio_coding/audio_network_adaptor/frame_length_controller_unittest.cc b/modules/audio_coding/audio_network_adaptor/frame_length_controller_unittest.cc
deleted file mode 100644
index d2b535c..0000000
--- a/modules/audio_coding/audio_network_adaptor/frame_length_controller_unittest.cc
+++ /dev/null
@@ -1,383 +0,0 @@
-/*
- *  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 <memory>
-#include <utility>
-
-#include "webrtc/modules/audio_coding/audio_network_adaptor/frame_length_controller.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-namespace {
-
-constexpr float kFlIncreasingPacketLossFraction = 0.04f;
-constexpr float kFlDecreasingPacketLossFraction = 0.05f;
-constexpr int kMinEncoderBitrateBps = 6000;
-constexpr int kPreventOveruseMarginBps = 5000;
-constexpr size_t kOverheadBytesPerPacket = 20;
-constexpr int kFl20msTo60msBandwidthBps = 40000;
-constexpr int kFl60msTo20msBandwidthBps = 50000;
-constexpr int kFl60msTo120msBandwidthBps = 30000;
-constexpr int kFl120msTo60msBandwidthBps = 40000;
-constexpr int kMediumBandwidthBps =
-    (kFl60msTo20msBandwidthBps + kFl20msTo60msBandwidthBps) / 2;
-constexpr float kMediumPacketLossFraction =
-    (kFlDecreasingPacketLossFraction + kFlIncreasingPacketLossFraction) / 2;
-
-int VeryLowBitrate(int frame_length_ms) {
-  return kMinEncoderBitrateBps + kPreventOveruseMarginBps +
-         (kOverheadBytesPerPacket * 8 * 1000 / frame_length_ms);
-}
-
-std::unique_ptr<FrameLengthController> CreateController(
-    const std::map<FrameLengthController::Config::FrameLengthChange, int>&
-        frame_length_change_criteria,
-    const std::vector<int>& encoder_frame_lengths_ms,
-    int initial_frame_length_ms) {
-  std::unique_ptr<FrameLengthController> controller(
-      new FrameLengthController(FrameLengthController::Config(
-          encoder_frame_lengths_ms, initial_frame_length_ms,
-          kMinEncoderBitrateBps, kFlIncreasingPacketLossFraction,
-          kFlDecreasingPacketLossFraction, frame_length_change_criteria)));
-
-  return controller;
-}
-
-std::map<FrameLengthController::Config::FrameLengthChange, int>
-CreateChangeCriteriaFor20msAnd60ms() {
-  return std::map<FrameLengthController::Config::FrameLengthChange, int>{
-      {FrameLengthController::Config::FrameLengthChange(20, 60),
-       kFl20msTo60msBandwidthBps},
-      {FrameLengthController::Config::FrameLengthChange(60, 20),
-       kFl60msTo20msBandwidthBps}};
-}
-
-std::map<FrameLengthController::Config::FrameLengthChange, int>
-CreateChangeCriteriaFor20ms60msAnd120ms() {
-  return std::map<FrameLengthController::Config::FrameLengthChange, int>{
-      {FrameLengthController::Config::FrameLengthChange(20, 60),
-       kFl20msTo60msBandwidthBps},
-      {FrameLengthController::Config::FrameLengthChange(60, 20),
-       kFl60msTo20msBandwidthBps},
-      {FrameLengthController::Config::FrameLengthChange(60, 120),
-       kFl60msTo120msBandwidthBps},
-      {FrameLengthController::Config::FrameLengthChange(120, 60),
-       kFl120msTo60msBandwidthBps}};
-}
-
-void UpdateNetworkMetrics(
-    FrameLengthController* controller,
-    const rtc::Optional<int>& uplink_bandwidth_bps,
-    const rtc::Optional<float>& uplink_packet_loss_fraction,
-    const rtc::Optional<size_t>& overhead_bytes_per_packet) {
-  // UpdateNetworkMetrics can accept multiple network metric updates at once.
-  // However, currently, the most used case is to update one metric at a time.
-  // To reflect this fact, we separate the calls.
-  if (uplink_bandwidth_bps) {
-    Controller::NetworkMetrics network_metrics;
-    network_metrics.uplink_bandwidth_bps = uplink_bandwidth_bps;
-    controller->UpdateNetworkMetrics(network_metrics);
-  }
-  if (uplink_packet_loss_fraction) {
-    Controller::NetworkMetrics network_metrics;
-    network_metrics.uplink_packet_loss_fraction = uplink_packet_loss_fraction;
-    controller->UpdateNetworkMetrics(network_metrics);
-  }
-  if (overhead_bytes_per_packet) {
-    Controller::NetworkMetrics network_metrics;
-    network_metrics.overhead_bytes_per_packet = overhead_bytes_per_packet;
-    controller->UpdateNetworkMetrics(network_metrics);
-  }
-}
-
-void CheckDecision(FrameLengthController* controller,
-                   int expected_frame_length_ms) {
-  AudioEncoderRuntimeConfig config;
-  controller->MakeDecision(&config);
-  EXPECT_EQ(rtc::Optional<int>(expected_frame_length_ms),
-            config.frame_length_ms);
-}
-
-}  // namespace
-
-TEST(FrameLengthControllerTest, DecreaseTo20MsOnHighUplinkBandwidth) {
-  auto controller =
-      CreateController(CreateChangeCriteriaFor20msAnd60ms(), {20, 60}, 60);
-  UpdateNetworkMetrics(
-      controller.get(), rtc::Optional<int>(kFl60msTo20msBandwidthBps),
-      rtc::Optional<float>(), rtc::Optional<size_t>(kOverheadBytesPerPacket));
-  CheckDecision(controller.get(), 20);
-}
-
-TEST(FrameLengthControllerTest, DecreaseTo20MsOnHighUplinkPacketLossFraction) {
-  auto controller =
-      CreateController(CreateChangeCriteriaFor20msAnd60ms(), {20, 60}, 60);
-  UpdateNetworkMetrics(controller.get(), rtc::Optional<int>(),
-                       rtc::Optional<float>(kFlDecreasingPacketLossFraction),
-                       rtc::Optional<size_t>(kOverheadBytesPerPacket));
-  CheckDecision(controller.get(), 20);
-}
-
-TEST(FrameLengthControllerTest,
-     Maintain60MsIf20MsNotInReceiverFrameLengthRange) {
-  auto controller =
-      CreateController(CreateChangeCriteriaFor20msAnd60ms(), {60}, 60);
-  // Set FEC on that would cause frame length to decrease if receiver frame
-  // length range included 20ms.
-  CheckDecision(controller.get(), 60);
-}
-
-TEST(FrameLengthControllerTest, Maintain60MsOnMultipleConditions) {
-  // Maintain 60ms frame length if
-  // 1. |uplink_bandwidth_bps| is at medium level,
-  // 2. |uplink_packet_loss_fraction| is at medium,
-  // 3. FEC is not decided ON.
-  auto controller =
-      CreateController(CreateChangeCriteriaFor20msAnd60ms(), {20, 60}, 60);
-  UpdateNetworkMetrics(controller.get(),
-                       rtc::Optional<int>(kMediumBandwidthBps),
-                       rtc::Optional<float>(kMediumPacketLossFraction),
-                       rtc::Optional<size_t>(kOverheadBytesPerPacket));
-  CheckDecision(controller.get(), 60);
-}
-
-TEST(FrameLengthControllerTest, IncreaseTo60MsOnMultipleConditions) {
-  // Increase to 60ms frame length if
-  // 1. |uplink_bandwidth_bps| is known to be smaller than a threshold AND
-  // 2. |uplink_packet_loss_fraction| is known to be smaller than a threshold
-  //    AND
-  // 3. FEC is not decided or OFF.
-  auto controller =
-      CreateController(CreateChangeCriteriaFor20msAnd60ms(), {20, 60}, 20);
-  UpdateNetworkMetrics(controller.get(),
-                       rtc::Optional<int>(kFl20msTo60msBandwidthBps),
-                       rtc::Optional<float>(kFlIncreasingPacketLossFraction),
-                       rtc::Optional<size_t>(kOverheadBytesPerPacket));
-  CheckDecision(controller.get(), 60);
-}
-
-TEST(FrameLengthControllerTest, IncreaseTo60MsOnVeryLowUplinkBandwidth) {
-  auto controller =
-      CreateController(CreateChangeCriteriaFor20msAnd60ms(), {20, 60}, 20);
-  // We set packet loss fraction to kFlDecreasingPacketLossFraction, which
-  // should have prevented frame length to increase, if the uplink bandwidth
-  // was not this low.
-  UpdateNetworkMetrics(controller.get(), rtc::Optional<int>(VeryLowBitrate(20)),
-                       rtc::Optional<float>(kFlIncreasingPacketLossFraction),
-                       rtc::Optional<size_t>(kOverheadBytesPerPacket));
-  CheckDecision(controller.get(), 60);
-}
-
-TEST(FrameLengthControllerTest, Maintain60MsOnVeryLowUplinkBandwidth) {
-  auto controller =
-      CreateController(CreateChangeCriteriaFor20msAnd60ms(), {20, 60}, 60);
-  // We set packet loss fraction to FlDecreasingPacketLossFraction, which should
-  // have caused the frame length to decrease, if the uplink bandwidth was not
-  // this low.
-  UpdateNetworkMetrics(controller.get(), rtc::Optional<int>(VeryLowBitrate(20)),
-                       rtc::Optional<float>(kFlIncreasingPacketLossFraction),
-                       rtc::Optional<size_t>(kOverheadBytesPerPacket));
-  CheckDecision(controller.get(), 60);
-}
-
-TEST(FrameLengthControllerTest, UpdateMultipleNetworkMetricsAtOnce) {
-  // This test is similar to IncreaseTo60MsOnMultipleConditions. But instead of
-  // using ::UpdateNetworkMetrics(...), which calls
-  // FrameLengthController::UpdateNetworkMetrics(...) multiple times, we
-  // we call it only once. This is to verify that
-  // FrameLengthController::UpdateNetworkMetrics(...) can handle multiple
-  // network updates at once. This is, however, not a common use case in current
-  // audio_network_adaptor_impl.cc.
-  auto controller =
-      CreateController(CreateChangeCriteriaFor20msAnd60ms(), {20, 60}, 20);
-  Controller::NetworkMetrics network_metrics;
-  network_metrics.uplink_bandwidth_bps =
-      rtc::Optional<int>(kFl20msTo60msBandwidthBps);
-  network_metrics.uplink_packet_loss_fraction =
-      rtc::Optional<float>(kFlIncreasingPacketLossFraction);
-  controller->UpdateNetworkMetrics(network_metrics);
-  CheckDecision(controller.get(), 60);
-}
-
-TEST(FrameLengthControllerTest,
-     Maintain20MsIf60MsNotInReceiverFrameLengthRange) {
-  auto controller =
-      CreateController(CreateChangeCriteriaFor20msAnd60ms(), {20}, 20);
-  // Use a low uplink bandwidth and a low uplink packet loss fraction that would
-  // cause frame length to increase if receiver frame length included 60ms.
-  UpdateNetworkMetrics(controller.get(),
-                       rtc::Optional<int>(kFl20msTo60msBandwidthBps),
-                       rtc::Optional<float>(kFlIncreasingPacketLossFraction),
-                       rtc::Optional<size_t>(kOverheadBytesPerPacket));
-  CheckDecision(controller.get(), 20);
-}
-
-TEST(FrameLengthControllerTest, Maintain20MsOnMediumUplinkBandwidth) {
-  auto controller =
-      CreateController(CreateChangeCriteriaFor20msAnd60ms(), {20, 60}, 20);
-  UpdateNetworkMetrics(controller.get(),
-                       rtc::Optional<int>(kMediumBandwidthBps),
-                       rtc::Optional<float>(kFlIncreasingPacketLossFraction),
-                       rtc::Optional<size_t>(kOverheadBytesPerPacket));
-  CheckDecision(controller.get(), 20);
-}
-
-TEST(FrameLengthControllerTest, Maintain20MsOnMediumUplinkPacketLossFraction) {
-  auto controller =
-      CreateController(CreateChangeCriteriaFor20msAnd60ms(), {20, 60}, 20);
-  // Use a low uplink bandwidth that would cause frame length to increase if
-  // uplink packet loss fraction was low.
-  UpdateNetworkMetrics(controller.get(),
-                       rtc::Optional<int>(kFl20msTo60msBandwidthBps),
-                       rtc::Optional<float>(kMediumPacketLossFraction),
-                       rtc::Optional<size_t>(kOverheadBytesPerPacket));
-  CheckDecision(controller.get(), 20);
-}
-
-TEST(FrameLengthControllerTest, Maintain60MsWhenNo120msCriteriaIsSet) {
-  auto controller =
-      CreateController(CreateChangeCriteriaFor20msAnd60ms(), {20, 60, 120}, 60);
-  UpdateNetworkMetrics(controller.get(),
-                       rtc::Optional<int>(kFl60msTo120msBandwidthBps),
-                       rtc::Optional<float>(kFlIncreasingPacketLossFraction),
-                       rtc::Optional<size_t>(kOverheadBytesPerPacket));
-  CheckDecision(controller.get(), 60);
-}
-
-TEST(FrameLengthControllerTest, From120MsTo20MsOnHighUplinkBandwidth) {
-  auto controller = CreateController(CreateChangeCriteriaFor20ms60msAnd120ms(),
-                                     {20, 60, 120}, 120);
-  // It takes two steps for frame length to go from 120ms to 20ms.
-  UpdateNetworkMetrics(
-      controller.get(), rtc::Optional<int>(kFl60msTo20msBandwidthBps),
-      rtc::Optional<float>(), rtc::Optional<size_t>(kOverheadBytesPerPacket));
-  CheckDecision(controller.get(), 60);
-
-  UpdateNetworkMetrics(
-      controller.get(), rtc::Optional<int>(kFl60msTo20msBandwidthBps),
-      rtc::Optional<float>(), rtc::Optional<size_t>(kOverheadBytesPerPacket));
-  CheckDecision(controller.get(), 20);
-}
-
-TEST(FrameLengthControllerTest, From120MsTo20MsOnHighUplinkPacketLossFraction) {
-  auto controller = CreateController(CreateChangeCriteriaFor20ms60msAnd120ms(),
-                                     {20, 60, 120}, 120);
-  // It takes two steps for frame length to go from 120ms to 20ms.
-  UpdateNetworkMetrics(controller.get(), rtc::Optional<int>(),
-                       rtc::Optional<float>(kFlDecreasingPacketLossFraction),
-                       rtc::Optional<size_t>(kOverheadBytesPerPacket));
-  CheckDecision(controller.get(), 60);
-
-  UpdateNetworkMetrics(controller.get(), rtc::Optional<int>(),
-                       rtc::Optional<float>(kFlDecreasingPacketLossFraction),
-                       rtc::Optional<size_t>(kOverheadBytesPerPacket));
-  CheckDecision(controller.get(), 20);
-}
-
-TEST(FrameLengthControllerTest, Maintain120MsOnVeryLowUplinkBandwidth) {
-  auto controller = CreateController(CreateChangeCriteriaFor20ms60msAnd120ms(),
-                                     {20, 60, 120}, 120);
-  // We set packet loss fraction to FlDecreasingPacketLossFraction, which should
-  // have caused the frame length to decrease, if the uplink bandwidth was not
-  // this low.
-  UpdateNetworkMetrics(controller.get(), rtc::Optional<int>(VeryLowBitrate(60)),
-                       rtc::Optional<float>(kFlDecreasingPacketLossFraction),
-                       rtc::Optional<size_t>(kOverheadBytesPerPacket));
-  CheckDecision(controller.get(), 120);
-}
-
-TEST(FrameLengthControllerTest, From60MsTo120MsOnVeryLowUplinkBandwidth) {
-  auto controller = CreateController(CreateChangeCriteriaFor20ms60msAnd120ms(),
-                                     {20, 60, 120}, 60);
-  // We set packet loss fraction to FlDecreasingPacketLossFraction, which should
-  // have prevented frame length to increase, if the uplink bandwidth was not
-  // this low.
-  UpdateNetworkMetrics(controller.get(), rtc::Optional<int>(VeryLowBitrate(60)),
-                       rtc::Optional<float>(kFlDecreasingPacketLossFraction),
-                       rtc::Optional<size_t>(kOverheadBytesPerPacket));
-  CheckDecision(controller.get(), 120);
-}
-
-TEST(FrameLengthControllerTest, From20MsTo120MsOnMultipleConditions) {
-  // Increase to 120ms frame length if
-  // 1. |uplink_bandwidth_bps| is known to be smaller than a threshold AND
-  // 2. |uplink_packet_loss_fraction| is known to be smaller than a threshold.
-  auto controller = CreateController(CreateChangeCriteriaFor20ms60msAnd120ms(),
-                                     {20, 60, 120}, 20);
-  // It takes two steps for frame length to go from 20ms to 120ms.
-  UpdateNetworkMetrics(controller.get(),
-                       rtc::Optional<int>(kFl60msTo120msBandwidthBps),
-                       rtc::Optional<float>(kFlIncreasingPacketLossFraction),
-                       rtc::Optional<size_t>(kOverheadBytesPerPacket));
-  CheckDecision(controller.get(), 60);
-  UpdateNetworkMetrics(controller.get(),
-                       rtc::Optional<int>(kFl60msTo120msBandwidthBps),
-                       rtc::Optional<float>(kFlIncreasingPacketLossFraction),
-                       rtc::Optional<size_t>(kOverheadBytesPerPacket));
-  CheckDecision(controller.get(), 120);
-}
-
-TEST(FrameLengthControllerTest, Stall60MsIf120MsNotInReceiverFrameLengthRange) {
-  auto controller =
-      CreateController(CreateChangeCriteriaFor20ms60msAnd120ms(), {20, 60}, 20);
-  UpdateNetworkMetrics(controller.get(),
-                       rtc::Optional<int>(kFl60msTo120msBandwidthBps),
-                       rtc::Optional<float>(kFlIncreasingPacketLossFraction),
-                       rtc::Optional<size_t>(kOverheadBytesPerPacket));
-  CheckDecision(controller.get(), 60);
-  UpdateNetworkMetrics(controller.get(),
-                       rtc::Optional<int>(kFl60msTo120msBandwidthBps),
-                       rtc::Optional<float>(kFlIncreasingPacketLossFraction),
-                       rtc::Optional<size_t>(kOverheadBytesPerPacket));
-  CheckDecision(controller.get(), 60);
-}
-
-TEST(FrameLengthControllerTest, CheckBehaviorOnChangingNetworkMetrics) {
-  auto controller = CreateController(CreateChangeCriteriaFor20ms60msAnd120ms(),
-                                     {20, 60, 120}, 20);
-  UpdateNetworkMetrics(controller.get(),
-                       rtc::Optional<int>(kMediumBandwidthBps),
-                       rtc::Optional<float>(kFlIncreasingPacketLossFraction),
-                       rtc::Optional<size_t>(kOverheadBytesPerPacket));
-  CheckDecision(controller.get(), 20);
-
-  UpdateNetworkMetrics(controller.get(),
-                       rtc::Optional<int>(kFl20msTo60msBandwidthBps),
-                       rtc::Optional<float>(kFlIncreasingPacketLossFraction),
-                       rtc::Optional<size_t>(kOverheadBytesPerPacket));
-  CheckDecision(controller.get(), 60);
-
-  UpdateNetworkMetrics(controller.get(),
-                       rtc::Optional<int>(kFl60msTo120msBandwidthBps),
-                       rtc::Optional<float>(kMediumPacketLossFraction),
-                       rtc::Optional<size_t>(kOverheadBytesPerPacket));
-  CheckDecision(controller.get(), 60);
-
-  UpdateNetworkMetrics(controller.get(),
-                       rtc::Optional<int>(kFl60msTo120msBandwidthBps),
-                       rtc::Optional<float>(kFlIncreasingPacketLossFraction),
-                       rtc::Optional<size_t>(kOverheadBytesPerPacket));
-  CheckDecision(controller.get(), 120);
-
-  UpdateNetworkMetrics(controller.get(),
-                       rtc::Optional<int>(kFl120msTo60msBandwidthBps),
-                       rtc::Optional<float>(kFlIncreasingPacketLossFraction),
-                       rtc::Optional<size_t>(kOverheadBytesPerPacket));
-  CheckDecision(controller.get(), 60);
-
-  UpdateNetworkMetrics(controller.get(),
-                       rtc::Optional<int>(kMediumBandwidthBps),
-                       rtc::Optional<float>(kFlDecreasingPacketLossFraction),
-                       rtc::Optional<size_t>(kOverheadBytesPerPacket));
-  CheckDecision(controller.get(), 20);
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/audio_network_adaptor/include/audio_network_adaptor.h b/modules/audio_coding/audio_network_adaptor/include/audio_network_adaptor.h
deleted file mode 100644
index a91b33b..0000000
--- a/modules/audio_coding/audio_network_adaptor/include/audio_network_adaptor.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- *  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_INCLUDE_AUDIO_NETWORK_ADAPTOR_H_
-#define WEBRTC_MODULES_AUDIO_CODING_AUDIO_NETWORK_ADAPTOR_INCLUDE_AUDIO_NETWORK_ADAPTOR_H_
-
-#include "webrtc/api/audio_codecs/audio_encoder.h"
-#include "webrtc/api/optional.h"
-#include "webrtc/modules/audio_coding/audio_network_adaptor/include/audio_network_adaptor_config.h"
-
-namespace webrtc {
-
-// An AudioNetworkAdaptor optimizes the audio experience by suggesting a
-// suitable runtime configuration (bit rate, frame length, FEC, etc.) to the
-// encoder based on network metrics.
-class AudioNetworkAdaptor {
- public:
-  virtual ~AudioNetworkAdaptor() = default;
-
-  virtual void SetUplinkBandwidth(int uplink_bandwidth_bps) = 0;
-
-  virtual void SetUplinkPacketLossFraction(
-      float uplink_packet_loss_fraction) = 0;
-
-  virtual void SetUplinkRecoverablePacketLossFraction(
-      float uplink_recoverable_packet_loss_fraction) = 0;
-
-  virtual void SetRtt(int rtt_ms) = 0;
-
-  virtual void SetTargetAudioBitrate(int target_audio_bitrate_bps) = 0;
-
-  virtual void SetOverhead(size_t overhead_bytes_per_packet) = 0;
-
-  virtual AudioEncoderRuntimeConfig GetEncoderRuntimeConfig() = 0;
-
-  virtual void StartDebugDump(FILE* file_handle) = 0;
-
-  virtual void StopDebugDump() = 0;
-
-  virtual ANAStats GetStats() const = 0;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_CODING_AUDIO_NETWORK_ADAPTOR_INCLUDE_AUDIO_NETWORK_ADAPTOR_H_
diff --git a/modules/audio_coding/audio_network_adaptor/include/audio_network_adaptor_config.h b/modules/audio_coding/audio_network_adaptor/include/audio_network_adaptor_config.h
deleted file mode 100644
index 148dec2..0000000
--- a/modules/audio_coding/audio_network_adaptor/include/audio_network_adaptor_config.h
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- *  Copyright (c) 2017 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_INCLUDE_AUDIO_NETWORK_ADAPTOR_CONFIG_H_
-#define WEBRTC_MODULES_AUDIO_CODING_AUDIO_NETWORK_ADAPTOR_INCLUDE_AUDIO_NETWORK_ADAPTOR_CONFIG_H_
-
-#include "webrtc/api/optional.h"
-
-namespace webrtc {
-
-struct AudioEncoderRuntimeConfig {
-  AudioEncoderRuntimeConfig();
-  AudioEncoderRuntimeConfig(const AudioEncoderRuntimeConfig& other);
-  AudioEncoderRuntimeConfig& operator=(const AudioEncoderRuntimeConfig& other);
-  ~AudioEncoderRuntimeConfig();
-  rtc::Optional<int> bitrate_bps;
-  rtc::Optional<int> frame_length_ms;
-  // Note: This is what we tell the encoder. It doesn't have to reflect
-  // the actual NetworkMetrics; it's subject to our decision.
-  rtc::Optional<float> uplink_packet_loss_fraction;
-  rtc::Optional<bool> enable_fec;
-  rtc::Optional<bool> enable_dtx;
-
-  // Some encoders can encode fewer channels than the actual input to make
-  // better use of the bandwidth. |num_channels| sets the number of channels
-  // to encode.
-  rtc::Optional<size_t> num_channels;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_CODING_AUDIO_NETWORK_ADAPTOR_INCLUDE_AUDIO_NETWORK_ADAPTOR_CONFIG_H_
diff --git a/modules/audio_coding/audio_network_adaptor/mock/mock_audio_network_adaptor.h b/modules/audio_coding/audio_network_adaptor/mock/mock_audio_network_adaptor.h
deleted file mode 100644
index f58a482..0000000
--- a/modules/audio_coding/audio_network_adaptor/mock/mock_audio_network_adaptor.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- *  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_AUDIO_NETWORK_ADAPTOR_H_
-#define WEBRTC_MODULES_AUDIO_CODING_AUDIO_NETWORK_ADAPTOR_MOCK_MOCK_AUDIO_NETWORK_ADAPTOR_H_
-
-#include "webrtc/modules/audio_coding/audio_network_adaptor/include/audio_network_adaptor.h"
-#include "webrtc/test/gmock.h"
-
-namespace webrtc {
-
-class MockAudioNetworkAdaptor : public AudioNetworkAdaptor {
- public:
-  virtual ~MockAudioNetworkAdaptor() { Die(); }
-  MOCK_METHOD0(Die, void());
-
-  MOCK_METHOD1(SetUplinkBandwidth, void(int uplink_bandwidth_bps));
-
-  MOCK_METHOD1(SetUplinkPacketLossFraction,
-               void(float uplink_packet_loss_fraction));
-
-  MOCK_METHOD1(SetUplinkRecoverablePacketLossFraction,
-               void(float uplink_recoverable_packet_loss_fraction));
-
-  MOCK_METHOD1(SetRtt, void(int rtt_ms));
-
-  MOCK_METHOD1(SetTargetAudioBitrate, void(int target_audio_bitrate_bps));
-
-  MOCK_METHOD1(SetOverhead, void(size_t overhead_bytes_per_packet));
-
-  MOCK_METHOD0(GetEncoderRuntimeConfig, AudioEncoderRuntimeConfig());
-
-  MOCK_METHOD1(StartDebugDump, void(FILE* file_handle));
-
-  MOCK_METHOD0(StopDebugDump, void());
-
-  MOCK_CONST_METHOD0(GetStats, ANAStats());
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_CODING_AUDIO_NETWORK_ADAPTOR_MOCK_MOCK_AUDIO_NETWORK_ADAPTOR_H_
diff --git a/modules/audio_coding/audio_network_adaptor/mock/mock_controller.h b/modules/audio_coding/audio_network_adaptor/mock/mock_controller.h
deleted file mode 100644
index e856601..0000000
--- a/modules/audio_coding/audio_network_adaptor/mock/mock_controller.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- *  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_CONTROLLER_H_
-#define WEBRTC_MODULES_AUDIO_CODING_AUDIO_NETWORK_ADAPTOR_MOCK_MOCK_CONTROLLER_H_
-
-#include "webrtc/modules/audio_coding/audio_network_adaptor/controller.h"
-#include "webrtc/test/gmock.h"
-
-namespace webrtc {
-
-class MockController : public Controller {
- public:
-  virtual ~MockController() { Die(); }
-  MOCK_METHOD0(Die, void());
-  MOCK_METHOD1(UpdateNetworkMetrics,
-               void(const NetworkMetrics& network_metrics));
-  MOCK_METHOD1(MakeDecision, void(AudioEncoderRuntimeConfig* config));
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_CODING_AUDIO_NETWORK_ADAPTOR_MOCK_MOCK_CONTROLLER_H_
diff --git a/modules/audio_coding/audio_network_adaptor/mock/mock_controller_manager.h b/modules/audio_coding/audio_network_adaptor/mock/mock_controller_manager.h
deleted file mode 100644
index 4976fd8..0000000
--- a/modules/audio_coding/audio_network_adaptor/mock/mock_controller_manager.h
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- *  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_CONTROLLER_MANAGER_H_
-#define WEBRTC_MODULES_AUDIO_CODING_AUDIO_NETWORK_ADAPTOR_MOCK_MOCK_CONTROLLER_MANAGER_H_
-
-#include <vector>
-
-#include "webrtc/modules/audio_coding/audio_network_adaptor/controller_manager.h"
-#include "webrtc/test/gmock.h"
-
-namespace webrtc {
-
-class MockControllerManager : public ControllerManager {
- public:
-  virtual ~MockControllerManager() { Die(); }
-  MOCK_METHOD0(Die, void());
-  MOCK_METHOD1(
-      GetSortedControllers,
-      std::vector<Controller*>(const Controller::NetworkMetrics& metrics));
-  MOCK_CONST_METHOD0(GetControllers, std::vector<Controller*>());
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_CODING_AUDIO_NETWORK_ADAPTOR_MOCK_MOCK_CONTROLLER_MANAGER_H_
diff --git a/modules/audio_coding/audio_network_adaptor/mock/mock_debug_dump_writer.h b/modules/audio_coding/audio_network_adaptor/mock/mock_debug_dump_writer.h
deleted file mode 100644
index fba9ccc..0000000
--- a/modules/audio_coding/audio_network_adaptor/mock/mock_debug_dump_writer.h
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- *  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 "webrtc/modules/audio_coding/audio_network_adaptor/debug_dump_writer.h"
-#include "webrtc/test/gmock.h"
-
-namespace webrtc {
-
-class MockDebugDumpWriter : public DebugDumpWriter {
- public:
-  virtual ~MockDebugDumpWriter() { Die(); }
-  MOCK_METHOD0(Die, void());
-
-  MOCK_METHOD2(DumpEncoderRuntimeConfig,
-               void(const AudioEncoderRuntimeConfig& config,
-                    int64_t timestamp));
-  MOCK_METHOD2(DumpNetworkMetrics,
-               void(const Controller::NetworkMetrics& metrics,
-                    int64_t timestamp));
-#if WEBRTC_ENABLE_PROTOBUF
-  MOCK_METHOD2(DumpControllerManagerConfig,
-               void(const audio_network_adaptor::config::ControllerManager&
-                        controller_manager_config,
-                    int64_t timestamp));
-#endif
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_CODING_AUDIO_NETWORK_ADAPTOR_MOCK_MOCK_DEBUG_DUMP_WRITER_H_
diff --git a/modules/audio_coding/audio_network_adaptor/parse_ana_dump.py b/modules/audio_coding/audio_network_adaptor/parse_ana_dump.py
deleted file mode 100755
index a52b065..0000000
--- a/modules/audio_coding/audio_network_adaptor/parse_ana_dump.py
+++ /dev/null
@@ -1,147 +0,0 @@
-#!/usr/bin/python2
-#  Copyright (c) 2017 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.
-
-#  To run this script please copy "out/<build_name>//pyproto/webrtc/modules/
-#  audio_coding/audio_network_adaptor/debug_dump_pb2.py" to this folder.
-#  The you can run this script with:
-#  "python parse_ana_dump.py -m uplink_bandwidth_bps -f dump_file.dat"
-#  You can add as may metrics or decisions to the plot as you like.
-#  form more information call:
-#  "python parse_ana_dump.py --help"
-
-import struct
-from optparse import OptionParser
-
-import matplotlib.pyplot as plt
-
-import debug_dump_pb2
-
-
-def GetNextMessageSize(file_to_parse):
-  data = file_to_parse.read(4)
-  if data == '':
-    return 0
-  return struct.unpack('<I', data)[0]
-
-
-def GetNextMessageFromFile(file_to_parse):
-  message_size = GetNextMessageSize(file_to_parse)
-  if message_size == 0:
-    return None
-  try:
-    event = debug_dump_pb2.Event()
-    event.ParseFromString(file_to_parse.read(message_size))
-  except IOError:
-    print 'Invalid message in file'
-    return None
-  return event
-
-
-def InitMetrics():
-  metrics = {}
-  event = debug_dump_pb2.Event()
-  for metric in event.network_metrics.DESCRIPTOR.fields:
-    metrics[metric.name] = {'time': [], 'value': []}
-  return metrics
-
-
-def InitDecisions():
-  decisions = {}
-  event = debug_dump_pb2.Event()
-  for decision in event.encoder_runtime_config.DESCRIPTOR.fields:
-    decisions[decision.name] = {'time': [], 'value': []}
-  return decisions
-
-
-def ParseAnaDump(dump_file_to_parse):
-  with open(dump_file_to_parse, 'rb') as file_to_parse:
-    metrics = InitMetrics()
-    decisions = InitDecisions()
-    first_time_stamp = None
-    while True:
-      event = GetNextMessageFromFile(file_to_parse)
-      if event == None:
-        break
-      if first_time_stamp == None:
-        first_time_stamp = event.timestamp
-      if event.type == debug_dump_pb2.Event.ENCODER_RUNTIME_CONFIG:
-        for decision in event.encoder_runtime_config.DESCRIPTOR.fields:
-          if event.encoder_runtime_config.HasField(decision.name):
-            decisions[decision.name]['time'].append(event.timestamp -
-                                                    first_time_stamp)
-            decisions[decision.name]['value'].append(
-                getattr(event.encoder_runtime_config, decision.name))
-      if event.type == debug_dump_pb2.Event.NETWORK_METRICS:
-        for metric in event.network_metrics.DESCRIPTOR.fields:
-          if event.network_metrics.HasField(metric.name):
-            metrics[metric.name]['time'].append(event.timestamp -
-                                                first_time_stamp)
-            metrics[metric.name]['value'].append(
-                getattr(event.network_metrics, metric.name))
-  return (metrics, decisions)
-
-
-def main():
-  parser = OptionParser()
-  parser.add_option(
-      "-f", "--dump_file", dest="dump_file_to_parse", help="dump file to parse")
-  parser.add_option(
-      '-m',
-      '--metric_plot',
-      default=[],
-      type=str,
-      help='metric key (name of the metric) to plot',
-      dest='metric_keys',
-      action='append')
-
-  parser.add_option(
-      '-d',
-      '--decision_plot',
-      default=[],
-      type=str,
-      help='decision key (name of the decision) to plot',
-      dest='decision_keys',
-      action='append')
-
-  options = parser.parse_args()[0]
-  if options.dump_file_to_parse == None:
-    print "No dump file to parse is set.\n"
-    parser.print_help()
-    exit()
-  (metrics, decisions) = ParseAnaDump(options.dump_file_to_parse)
-  metric_keys = options.metric_keys
-  decision_keys = options.decision_keys
-  plot_count = len(metric_keys) + len(decision_keys)
-  if plot_count == 0:
-    print "You have to set at least one metric or decision to plot.\n"
-    parser.print_help()
-    exit()
-  plots = []
-  if plot_count == 1:
-    f, mp_plot = plt.subplots()
-    plots.append(mp_plot)
-  else:
-    f, mp_plots = plt.subplots(plot_count, sharex=True)
-    plots.extend(mp_plots.tolist())
-
-  for key in metric_keys:
-    plot = plots.pop()
-    plot.grid(True)
-    plot.set_title(key + " (metric)")
-    plot.plot(metrics[key]['time'], metrics[key]['value'])
-  for key in decision_keys:
-    plot = plots.pop()
-    plot.grid(True)
-    plot.set_title(key + " (decision)")
-    plot.plot(decisions[key]['time'], decisions[key]['value'])
-  f.subplots_adjust(hspace=0.3)
-  plt.show()
-
-if __name__ == "__main__":
-  main()
diff --git a/modules/audio_coding/audio_network_adaptor/util/threshold_curve.h b/modules/audio_coding/audio_network_adaptor/util/threshold_curve.h
deleted file mode 100644
index 2f816db..0000000
--- a/modules/audio_coding/audio_network_adaptor/util/threshold_curve.h
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- *  Copyright (c) 2017 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_UTIL_THRESHOLD_CURVE_H_
-#define WEBRTC_MODULES_AUDIO_CODING_AUDIO_NETWORK_ADAPTOR_UTIL_THRESHOLD_CURVE_H_
-
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-
-class ThresholdCurve {
- public:
-  struct Point {
-    constexpr Point(float x, float y) : x(x), y(y) {}
-    float x;
-    float y;
-  };
-
-  // ThresholdCurve defines a curve. The curve is characterized by the two
-  // conjunction points: A and B. The curve segments the metric space into
-  // three domains - above the curve, on it and below it.
-  //
-  // y-axis ^  |
-  //        | A|
-  //        |   \    A: (a.x, a.y)
-  //        |    \   B: (b.x, b.y)
-  //        |    B\________
-  //        |---------------> bandwidth
-  //
-  // If either a.x == b.x or a.y == b.y, the curve can be defined
-  // by a single point. (We merge the two points into one - either the lower or
-  // the leftmost one - for easier treatment.)
-  //
-  // y-axis ^  |
-  //        |  |
-  //        |  |
-  //        |  |
-  //        | P|__________
-  //        |---------------> bandwidth
-  ThresholdCurve(const Point& left, const Point& right)
-      : a(GetPoint(left, right, true)),
-        b(GetPoint(left, right, false)),
-        slope(b.x - a.x == 0.0f ? 0.0f : (b.y - a.y) / (b.x - a.x)),
-        offset(a.y - slope * a.x) {
-    // TODO(eladalon): We might want to introduce some numerical validations.
-  }
-
-  ThresholdCurve(float a_x, float a_y, float b_x, float b_y)
-      : ThresholdCurve(Point{a_x, a_y}, Point{b_x, b_y}) {}
-
-  // Checks if a point is strictly below the curve.
-  bool IsBelowCurve(const Point& p) const {
-    if (p.x < a.x) {
-      return true;
-    } else if (p.x == a.x) {
-      // In principle, we could merge this into the next else, but to avoid
-      // numerical errors, we treat it separately.
-      return p.y < a.y;
-    } else if (a.x < p.x && p.x < b.x) {
-      return p.y < offset + slope * p.x;
-    } else {  // if (b.x <= p.x)
-      return p.y < b.y;
-    }
-  }
-
-  // Checks if a point is strictly above the curve.
-  bool IsAboveCurve(const Point& p) const {
-    if (p.x <= a.x) {
-      return false;
-    } else if (a.x < p.x && p.x < b.x) {
-      return p.y > offset + slope * p.x;
-    } else {  // if (b.x <= p.x)
-      return p.y > b.y;
-    }
-  }
-
-  bool operator<=(const ThresholdCurve& rhs) const {
-    // This curve is <= the rhs curve if no point from this curve is
-    // above a corresponding point from the rhs curve.
-    return !IsBelowCurve(rhs.a) && !IsBelowCurve(rhs.b) &&
-           !rhs.IsAboveCurve(a) && !rhs.IsAboveCurve(b);
-  }
-
- private:
-  static const Point& GetPoint(const Point& left,
-                               const Point& right,
-                               bool is_for_left) {
-    RTC_DCHECK_LE(left.x, right.x);
-    RTC_DCHECK_GE(left.y, right.y);
-
-    // Same X-value or Y-value triggers merging both points to the
-    // lower and/or left of the two points, respectively.
-    if (left.x == right.x) {
-      return right;
-    } else if (left.y == right.y) {
-      return left;
-    }
-
-    // If unmerged, boolean flag determines which of the points is desired.
-    return is_for_left ? left : right;
-  }
-
-  const Point a;
-  const Point b;
-  const float slope;
-  const float offset;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_CODING_AUDIO_NETWORK_ADAPTOR_UTIL_THRESHOLD_CURVE_H_
diff --git a/modules/audio_coding/audio_network_adaptor/util/threshold_curve_unittest.cc b/modules/audio_coding/audio_network_adaptor/util/threshold_curve_unittest.cc
deleted file mode 100644
index 0897d0d..0000000
--- a/modules/audio_coding/audio_network_adaptor/util/threshold_curve_unittest.cc
+++ /dev/null
@@ -1,631 +0,0 @@
-/*
- *  Copyright (c) 2017 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 <memory>
-
-#include "webrtc/modules/audio_coding/audio_network_adaptor/util/threshold_curve.h"
-#include "webrtc/test/gtest.h"
-
-// A threshold curve divides 2D space into three domains - below, on and above
-// the threshold curve.
-// The curve is defined by two points. Those points, P1 and P2, are ordered so
-// that (P1.x <= P2.x && P1.y >= P2.y).
-// The part of the curve which is between the two points is hereon referred
-// to as the "segment".
-// A "ray" extends from P1 directly upwards into infinity; that's the "vertical
-// ray". Likewise, a "horizontal ray" extends from P2 directly rightwards.
-//
-//  ^   |                         //
-//  |   | vertical ray            //
-//  |   |                         //
-//  |   |                         //
-//  | P1|                         //
-//  |    \                        //
-//  |     \ segment               //
-//  |      \                      //
-//  |       \    horizontal ray   //
-//  |     P2 ------------------   //
-//  *---------------------------> //
-
-namespace webrtc {
-
-namespace {
-enum RelativePosition { kBelow, kOn, kAbove };
-
-void CheckRelativePosition(const ThresholdCurve& curve,
-                           ThresholdCurve::Point point,
-                           RelativePosition pos) {
-  RTC_CHECK(pos == kBelow || pos == kOn || pos == kAbove);
-
-  EXPECT_EQ(pos == kBelow, curve.IsBelowCurve(point));
-  EXPECT_EQ(pos == kAbove, curve.IsAboveCurve(point));
-}
-}  // namespace
-
-// Test that the curve correctly reports the below/above position of points,
-// when the curve is a "normal" one - P1 and P2 are different in both their
-// X and Y values.
-TEST(ThresholdCurveTest, PointPositionToCommonCurve) {
-  // The points (P1-P2) define the curve.           //
-  // All other points are above/below/on the curve. //
-  //                                                //
-  //  ^                                             //
-  //  |     |                                       //
-  //  |  A  F    J  R   V                           //
-  //  |     |                                       //
-  //  |  B  P1   K  S   W                           //
-  //  |      \                                      //
-  //  |       \                                     //
-  //  |        \ L                                  //
-  //  |         \                                   //
-  //  |  C  G    M  T   X                           //
-  //  |           \                                 //
-  //  |          N \                                //
-  //  |             \                               //
-  //  |  D  H    O  P2--Y----------------           //
-  //  |  E  I    Q  U   Z                           //
-  //  *---------------------------------->          //
-  constexpr ThresholdCurve::Point p1{1000, 2000};
-  constexpr ThresholdCurve::Point p2{2000, 1000};
-
-  RTC_CHECK_GT((p1.x + p2.x) / 2, p1.x);
-  RTC_CHECK_LT((p1.x + p2.x) / 2, p2.x);
-  RTC_CHECK_LT((p1.y + p2.y) / 2, p1.y);
-  RTC_CHECK_GT((p1.y + p2.y) / 2, p2.y);
-
-  const ThresholdCurve curve(p1, p2);
-
-  {
-    // All cases where the point lies to the left of P1.
-    constexpr float x = p1.x - 1;
-    CheckRelativePosition(curve, {x, p1.y + 1}, kBelow);           // A
-    CheckRelativePosition(curve, {x, p1.y + 0}, kBelow);           // B
-    CheckRelativePosition(curve, {x, (p1.y + p2.y) / 2}, kBelow);  // C
-    CheckRelativePosition(curve, {x, p2.y + 0}, kBelow);           // D
-    CheckRelativePosition(curve, {x, p2.y - 1}, kBelow);           // E
-  }
-
-  {
-    // All cases where the point has the same x-value as P1.
-    constexpr float x = p1.x;
-    CheckRelativePosition(curve, {x, p1.y + 1}, kOn);              // F
-    CheckRelativePosition(curve, {x, p1.y + 0}, kOn);              // P1
-    CheckRelativePosition(curve, {x, (p1.y + p2.y) / 2}, kBelow);  // G
-    CheckRelativePosition(curve, {x, p2.y + 0}, kBelow);           // H
-    CheckRelativePosition(curve, {x, p2.y - 1}, kBelow);           // I
-  }
-
-  {
-    // To make sure we're really covering all of the cases, make sure that P1
-    // and P2 were chosen so that L would really be below K, and O would really
-    // be below N. (This would not hold if the Y values are too close together.)
-    RTC_CHECK_LT(((p1.y + p2.y) / 2) + 1, p1.y);
-    RTC_CHECK_LT(p2.y, ((p1.y + p2.y) / 2) - 1);
-
-    // All cases where the point's x-value is between P1 and P2.
-    constexpr float x = (p1.x + p2.x) / 2;
-    CheckRelativePosition(curve, {x, p1.y + 1}, kAbove);                 // J
-    CheckRelativePosition(curve, {x, p1.y + 0}, kAbove);                 // K
-    CheckRelativePosition(curve, {x, ((p1.y + p2.y) / 2) + 1}, kAbove);  // L
-    CheckRelativePosition(curve, {x, (p1.y + p2.y) / 2}, kOn);           // M
-    CheckRelativePosition(curve, {x, ((p1.y + p2.y) / 2) - 1}, kBelow);  // N
-    CheckRelativePosition(curve, {x, p2.y + 0}, kBelow);                 // O
-    CheckRelativePosition(curve, {x, p2.y - 1}, kBelow);                 // Q
-  }
-
-  {
-    // All cases where the point has the same x-value as P2.
-    constexpr float x = p2.x;
-    CheckRelativePosition(curve, {x, p1.y + 1}, kAbove);           // R
-    CheckRelativePosition(curve, {x, p1.y + 0}, kAbove);           // S
-    CheckRelativePosition(curve, {x, (p1.y + p2.y) / 2}, kAbove);  // T
-    CheckRelativePosition(curve, {x, p2.y + 0}, kOn);              // P2
-    CheckRelativePosition(curve, {x, p2.y - 1}, kBelow);           // U
-  }
-
-  {
-    // All cases where the point lies to the right of P2.
-    constexpr float x = p2.x + 1;
-    CheckRelativePosition(curve, {x, p1.y + 1}, kAbove);           // V
-    CheckRelativePosition(curve, {x, p1.y + 0}, kAbove);           // W
-    CheckRelativePosition(curve, {x, (p1.y + p2.y) / 2}, kAbove);  // X
-    CheckRelativePosition(curve, {x, p2.y + 0}, kOn);              // Y
-    CheckRelativePosition(curve, {x, p2.y - 1}, kBelow);           // Z
-  }
-}
-
-// Test that the curve correctly reports the below/above position of points,
-// when the curve is defined by two points with the same Y value.
-TEST(ThresholdCurveTest, PointPositionToCurveWithHorizaontalSegment) {
-  // The points (P1-P2) define the curve.
-  // All other points are above/below/on the curve.
-  //
-  //  ^
-  //  |    |
-  //  |    |
-  //  | A  D   F  I  K
-  //  |    |
-  //  |    |
-  //  | B  P1--G--P2-L--
-  //  | C  E   H  J  M
-  //  *------------------>
-
-  constexpr ThresholdCurve::Point p1{100, 200};
-  constexpr ThresholdCurve::Point p2{p1.x + 1, p1.y};
-
-  RTC_CHECK_GT((p1.x + p2.x) / 2, p1.x);
-  RTC_CHECK_LT((p1.x + p2.x) / 2, p2.x);
-
-  const ThresholdCurve curve(p1, p2);
-
-  {
-    // All cases where the point lies to the left of P1.
-    constexpr float x = p1.x - 1;
-    CheckRelativePosition(curve, {x, p1.y + 1}, kBelow);  // A
-    CheckRelativePosition(curve, {x, p1.y + 0}, kBelow);  // B
-    CheckRelativePosition(curve, {x, p1.y - 1}, kBelow);  // C
-  }
-
-  {
-    // All cases where the point has the same x-value as P1.
-    constexpr float x = p1.x;
-    CheckRelativePosition(curve, {x, p1.y + 1}, kOn);     // D
-    CheckRelativePosition(curve, {x, p1.y + 0}, kOn);     // P1
-    CheckRelativePosition(curve, {x, p1.y - 1}, kBelow);  // E
-  }
-
-  {
-    // All cases where the point's x-value is between P1 and P2.
-    constexpr float x = (p1.x + p2.x) / 2;
-    CheckRelativePosition(curve, {x, p1.y + 1}, kAbove);  // F
-    CheckRelativePosition(curve, {x, p1.y + 0}, kOn);     // G
-    CheckRelativePosition(curve, {x, p1.y - 1}, kBelow);  // H
-  }
-
-  {
-    // All cases where the point has the same x-value as P2.
-    constexpr float x = p2.x;
-    CheckRelativePosition(curve, {x, p1.y + 1}, kAbove);  // I
-    CheckRelativePosition(curve, {x, p1.y + 0}, kOn);     // P2
-    CheckRelativePosition(curve, {x, p1.y - 1}, kBelow);  // J
-  }
-
-  {
-    // All cases where the point lies to the right of P2.
-    constexpr float x = p2.x + 1;
-    CheckRelativePosition(curve, {x, p1.y + 1}, kAbove);  // K
-    CheckRelativePosition(curve, {x, p1.y + 0}, kOn);     // L
-    CheckRelativePosition(curve, {x, p1.y - 1}, kBelow);  // M
-  }
-}
-
-// Test that the curve correctly reports the below/above position of points,
-// when the curve is defined by two points with the same X value.
-TEST(ThresholdCurveTest, PointPositionToCurveWithVerticalSegment) {
-  // The points (P1-P2) define the curve.
-  // All other points are above/below/on the curve.
-  //
-  //  ^
-  //  |    |
-  //  | A  B   C
-  //  |    |
-  //  | D  P1  E
-  //  |    |
-  //  | F  G   H
-  //  |    |
-  //  | I  P2--J------
-  //  | K  L   M
-  //  *------------------>
-
-  constexpr ThresholdCurve::Point p1{100, 200};
-  constexpr ThresholdCurve::Point p2{p1.x, p1.y - 1};
-
-  constexpr float left = p1.x - 1;
-  constexpr float on = p1.x;
-  constexpr float right = p1.x + 1;
-
-  RTC_CHECK_LT((p1.y + p2.y) / 2, p1.y);
-  RTC_CHECK_GT((p1.y + p2.y) / 2, p2.y);
-
-  const ThresholdCurve curve(p1, p2);
-
-  {
-    // All cases where the point lies above P1.
-    constexpr float y = p1.y + 1;
-    CheckRelativePosition(curve, {left, y}, kBelow);   // A
-    CheckRelativePosition(curve, {on, y}, kOn);        // B
-    CheckRelativePosition(curve, {right, y}, kAbove);  // C
-  }
-
-  {
-    // All cases where the point has the same y-value as P1.
-    constexpr float y = p1.y;
-    CheckRelativePosition(curve, {left, y}, kBelow);   // D
-    CheckRelativePosition(curve, {on, y}, kOn);        // P1
-    CheckRelativePosition(curve, {right, y}, kAbove);  // E
-  }
-
-  {
-    // All cases where the point's y-value is between P1 and P2.
-    constexpr float y = (p1.y + p2.y) / 2;
-    CheckRelativePosition(curve, {left, y}, kBelow);   // F
-    CheckRelativePosition(curve, {on, y}, kOn);        // G
-    CheckRelativePosition(curve, {right, y}, kAbove);  // H
-  }
-
-  {
-    // All cases where the point has the same y-value as P2.
-    constexpr float y = p2.y;
-    CheckRelativePosition(curve, {left, y}, kBelow);  // I
-    CheckRelativePosition(curve, {on, y}, kOn);       // P2
-    CheckRelativePosition(curve, {right, y}, kOn);    // J
-  }
-
-  {
-    // All cases where the point lies below P2.
-    constexpr float y = p2.y - 1;
-    CheckRelativePosition(curve, {left, y}, kBelow);   // K
-    CheckRelativePosition(curve, {on, y}, kBelow);     // L
-    CheckRelativePosition(curve, {right, y}, kBelow);  // M
-  }
-}
-
-// Test that the curve correctly reports the below/above position of points,
-// when the curve is defined by two points which are identical.
-TEST(ThresholdCurveTest, PointPositionCurveWithNullSegment) {
-  // The points (P1-P2) define the curve.
-  // All other points are above/below/on the curve.
-  //
-  //  ^
-  //  |    |
-  //  | A  D   F
-  //  |    |
-  //  | B  P---G------
-  //  | C  E   H
-  //  *------------------>
-
-  constexpr ThresholdCurve::Point p{100, 200};
-
-  const ThresholdCurve curve(p, p);
-
-  {
-    // All cases where the point lies to the left of P.
-    constexpr float x = p.x - 1;
-    CheckRelativePosition(curve, {x, p.y + 1}, kBelow);  // A
-    CheckRelativePosition(curve, {x, p.y + 0}, kBelow);  // B
-    CheckRelativePosition(curve, {x, p.y - 1}, kBelow);  // C
-  }
-
-  {
-    // All cases where the point has the same x-value as P.
-    constexpr float x = p.x + 0;
-    CheckRelativePosition(curve, {x, p.y + 1}, kOn);     // D
-    CheckRelativePosition(curve, {x, p.y + 0}, kOn);     // P
-    CheckRelativePosition(curve, {x, p.y - 1}, kBelow);  // E
-  }
-
-  {
-    // All cases where the point lies to the right of P.
-    constexpr float x = p.x + 1;
-    CheckRelativePosition(curve, {x, p.y + 1}, kAbove);  // F
-    CheckRelativePosition(curve, {x, p.y + 0}, kOn);     // G
-    CheckRelativePosition(curve, {x, p.y - 1}, kBelow);  // H
-  }
-}
-
-// Test that the relative position of two curves is computed correctly when
-// the two curves have the same projection on the X-axis.
-TEST(ThresholdCurveTest, TwoCurvesSegmentHasSameProjectionAxisX) {
-  //  ^                        //
-  //  | C1 + C2                //
-  //  |  |                     //
-  //  |  |\                    //
-  //  |  | \                   //
-  //  |   \ \                  //
-  //  |    \ \                 //
-  //  |     \ \                //
-  //  |      \ -------- C2     //
-  //  |       --------- C1     //
-  //  *--------------------->  //
-
-  constexpr ThresholdCurve::Point c1_left{5, 10};
-  constexpr ThresholdCurve::Point c1_right{10, 5};
-  const ThresholdCurve c1_curve(c1_left, c1_right);
-
-  // Same x-values, but higher on Y. (Can be parallel, but doesn't have to be.)
-  constexpr ThresholdCurve::Point c2_left{c1_left.x, c1_left.y + 20};
-  constexpr ThresholdCurve::Point c2_right{c1_right.x, c1_right.y + 10};
-  const ThresholdCurve c2_curve(c2_left, c2_right);
-
-  EXPECT_TRUE(c1_curve <= c2_curve);
-  EXPECT_FALSE(c2_curve <= c1_curve);
-}
-
-// Test that the relative position of two curves is computed correctly when
-// the higher curve's projection on the X-axis is a strict subset of the
-// lower curve's projection on the X-axis (on both ends).
-TEST(ThresholdCurveTest, TwoCurvesSegmentOfHigherSubsetProjectionAxisX) {
-  //  ^                       //
-  //  | C1    C2              //
-  //  |  |    |               //
-  //  |  |    |               //
-  //  |   \   |               //
-  //  |    \  |               //
-  //  |     \ \               //
-  //  |      \ \              //
-  //  |       \ --------- C2  //
-  //  |        \              //
-  //  |         \             //
-  //  |          ---------C1  //
-  //  *---------------------> //
-
-  constexpr ThresholdCurve::Point c1_left{5, 10};
-  constexpr ThresholdCurve::Point c1_right{10, 5};
-  const ThresholdCurve c1_curve(c1_left, c1_right);
-
-  constexpr ThresholdCurve::Point c2_left{6, 11};
-  constexpr ThresholdCurve::Point c2_right{9, 7};
-  const ThresholdCurve c2_curve(c2_left, c2_right);
-
-  EXPECT_TRUE(c1_curve <= c2_curve);
-  EXPECT_FALSE(c2_curve <= c1_curve);
-}
-
-// Test that the relative position of two curves is computed correctly when
-// the higher curve's right point is above lower curve's horizontal ray (meaning
-// the higher curve's projection on the X-axis extends further right than
-// the lower curve's).
-TEST(ThresholdCurveTest,
-     TwoCurvesRightPointOfHigherCurveAboveHorizontalRayOfLower) {
-  //  ^                        //
-  //  | C1 + C2                //
-  //  |  |                     //
-  //  |  |\                    //
-  //  |  | \                   //
-  //  |  |  \                  //
-  //  |  |   \                 //
-  //  |  |    \                //
-  //  |   \    \               //
-  //  |    \    \              //
-  //  |     \    \             //
-  //  |      \    ----- C2     //
-  //  |       --------- C1     //
-  //  *--------------------->  //
-
-  constexpr ThresholdCurve::Point c1_left{5, 10};
-  constexpr ThresholdCurve::Point c1_right{10, 5};
-  const ThresholdCurve c1_curve(c1_left, c1_right);
-
-  constexpr ThresholdCurve::Point c2_left{c1_left.x, c1_left.y + 1};
-  constexpr ThresholdCurve::Point c2_right{c1_right.x + 1, c1_right.y + 1};
-  const ThresholdCurve c2_curve(c2_left, c2_right);
-
-  EXPECT_TRUE(c1_curve <= c2_curve);
-  EXPECT_FALSE(c2_curve <= c1_curve);
-}
-
-// Test that the relative position of two curves is computed correctly when
-// the higher curve's points are on the lower curve's rays (left point on the
-// veritcal ray, right point on the horizontal ray).
-TEST(ThresholdCurveTest, TwoCurvesPointsOfHigherOnRaysOfLower) {
-  //  ^
-  //  | C1 + C2               //
-  //  |  |                    //
-  //  |  |\                   //
-  //  |  | \                  //
-  //  |   \ \                 //
-  //  |    \ \                //
-  //  |     \ \               //
-  //  |      \ \              //
-  //  |       ----- C1 + C2   //
-  //  *---------------------> //
-
-  constexpr ThresholdCurve::Point c1_left{5, 10};
-  constexpr ThresholdCurve::Point c1_right{10, 5};
-  const ThresholdCurve c1_curve(c1_left, c1_right);
-
-  // Same x-values, but one of the points is higher on Y (the other isn't).
-  constexpr ThresholdCurve::Point c2_left{c1_left.x, c1_left.y + 2};
-  constexpr ThresholdCurve::Point c2_right{c1_right.x + 3, c1_right.y};
-  const ThresholdCurve c2_curve(c2_left, c2_right);
-
-  EXPECT_TRUE(c1_curve <= c2_curve);
-  EXPECT_FALSE(c2_curve <= c1_curve);
-}
-
-// Test that the relative position of two curves is computed correctly when
-// the second curve's segment intersects the first curve's vertical ray.
-TEST(ThresholdCurveTest, SecondCurveCrossesVerticalRayOfFirstCurve) {
-  //  ^                       //
-  //  | C2 C1                 //
-  //  |  | |                  //
-  //  |   \|                  //
-  //  |    |                  //
-  //  |    |\                 //
-  //  |    | \                //
-  //  |     \ \               //
-  //  |      \ \              //
-  //  |       \ \             //
-  //  |        \ ------- C2   //
-  //  |         -------- C1   //
-  //  *---------------------> //
-
-  constexpr ThresholdCurve::Point c1_left{5, 10};
-  constexpr ThresholdCurve::Point c1_right{10, 5};
-  const ThresholdCurve c1_curve(c1_left, c1_right);
-
-  constexpr ThresholdCurve::Point c2_left{c1_left.x - 1, c1_left.y + 1};
-  constexpr ThresholdCurve::Point c2_right{c1_right.x, c1_right.y + 1};
-  const ThresholdCurve c2_curve(c2_left, c2_right);
-
-  EXPECT_FALSE(c1_curve <= c2_curve);
-  EXPECT_FALSE(c2_curve <= c1_curve);
-}
-
-// Test that the relative position of two curves is computed correctly when
-// the second curve's segment intersects the first curve's horizontal ray.
-TEST(ThresholdCurveTest, SecondCurveCrossesHorizontalRayOfFirstCurve) {
-  //  ^                      //
-  //  | C1 +  C2             //
-  //  |  |                   //
-  //  |  |\                  //
-  //  |  \ \                 //
-  //  |   \ \                //
-  //  |    \ \               //
-  //  |     \ \              //
-  //  |      ----------- C1  //
-  //  |         \            //
-  //  |          ------- C2  //
-  //  *--------------------> //
-
-  constexpr ThresholdCurve::Point c1_left{5, 10};
-  constexpr ThresholdCurve::Point c1_right{10, 5};
-  const ThresholdCurve c1_curve(c1_left, c1_right);
-
-  constexpr ThresholdCurve::Point c2_left{c1_left.x, c1_left.y + 1};
-  constexpr ThresholdCurve::Point c2_right{c1_right.x + 2, c1_right.y - 1};
-  const ThresholdCurve c2_curve(c2_left, c2_right);
-
-  EXPECT_FALSE(c1_curve <= c2_curve);
-  EXPECT_FALSE(c2_curve <= c1_curve);
-}
-
-// Test that the relative position of two curves is computed correctly when
-// the second curve's segment intersects the first curve's segment.
-TEST(ThresholdCurveTest, TwoCurvesWithCrossingSegments) {
-  //  ^                           //
-  //  | C2 C1                     //
-  //  | |  |                      //
-  //  | |  |                      //
-  //  | |  \                      //
-  //  | |   \                     //
-  //  |  -_  \                    //
-  //  |    -_ \                   //
-  //  |      -_\                  //
-  //  |        -_                 //
-  //  |          \-_              //
-  //  |           \ ---------- C2 //
-  //  |            ----------- C1 //
-  //  |                           //
-  //  |                           //
-  //  *-------------------------> //
-
-  constexpr ThresholdCurve::Point c1_left{5, 10};
-  constexpr ThresholdCurve::Point c1_right{10, 5};
-  const ThresholdCurve c1_curve(c1_left, c1_right);
-
-  constexpr ThresholdCurve::Point c2_left{4, 9};
-  constexpr ThresholdCurve::Point c2_right{10, 6};
-  const ThresholdCurve c2_curve(c2_left, c2_right);
-
-  // The test is structured so that the two curves intersect at (8, 7).
-  RTC_CHECK(!c1_curve.IsAboveCurve({8, 7}));
-  RTC_CHECK(!c1_curve.IsBelowCurve({8, 7}));
-  RTC_CHECK(!c2_curve.IsAboveCurve({8, 7}));
-  RTC_CHECK(!c2_curve.IsBelowCurve({8, 7}));
-
-  EXPECT_FALSE(c1_curve <= c2_curve);
-  EXPECT_FALSE(c2_curve <= c1_curve);
-}
-
-// Test that the relative position of two curves is computed correctly when
-// both curves are identical.
-TEST(ThresholdCurveTest, IdenticalCurves) {
-  //  ^                       //
-  //  |  C1 + C2              //
-  //  |  |                    //
-  //  |  |                    //
-  //  |   \                   //
-  //  |    \                  //
-  //  |     \                 //
-  //  |      ------- C1 + C2  //
-  //  *---------------------> //
-
-  constexpr ThresholdCurve::Point left{5, 10};
-  constexpr ThresholdCurve::Point right{10, 5};
-
-  const ThresholdCurve c1_curve(left, right);
-  const ThresholdCurve c2_curve(left, right);
-
-  EXPECT_TRUE(c1_curve <= c2_curve);
-  EXPECT_TRUE(c2_curve <= c1_curve);
-}
-
-// Test that the relative position of two curves is computed correctly when
-// they are "nearly identical" - the first curve's segment is contained within
-// the second curve's segment, but the second curve's segment extends further
-// to the left (which also produces separate vertical rays for the curves).
-TEST(ThresholdCurveTest, NearlyIdenticalCurvesSecondContinuesOnOtherLeftSide) {
-  //  ^                       //
-  //  | C2 C1                 //
-  //  |  | |                  //
-  //  |  | |                  //
-  //  |   \|                  //
-  //  |    |                  //
-  //  |     \                 //
-  //  |      \                //
-  //  |       \               //
-  //  |        ----- C1 + C2  //
-  //  *---------------------> //
-
-  constexpr ThresholdCurve::Point c1_left{5, 10};
-  constexpr ThresholdCurve::Point c1_right{10, 5};
-  const ThresholdCurve c1_curve(c1_left, c1_left);
-
-  constexpr ThresholdCurve::Point c2_left{c1_left.x - 1, c1_left.y + 1};
-  constexpr ThresholdCurve::Point c2_right = c1_right;
-  const ThresholdCurve c2_curve(c2_left, c2_right);
-
-  EXPECT_FALSE(c1_curve <= c2_curve);
-  EXPECT_TRUE(c2_curve <= c1_curve);
-}
-
-// Test that the relative position of two curves is computed correctly when
-// they are "nearly identical" - the first curve's segment is contained within
-// the second curve's segment, but the second curve's segment extends further
-// to the right (which also produces separate horizontal rays for the curves).
-TEST(ThresholdCurveTest, NearlyIdenticalCurvesSecondContinuesOnOtherRightSide) {
-  //  ^                       //
-  //  | C1 + C2               //
-  //  |  |                    //
-  //  |  |                    //
-  //  |   \                   //
-  //  |    \                  //
-  //  |     \                 //
-  //  |      \----------- C1  //
-  //  |       \               //
-  //  |        ---------- C2  //
-  //  *---------------------> //
-
-  constexpr ThresholdCurve::Point c1_left{5, 10};
-  constexpr ThresholdCurve::Point c1_right{10, 5};
-  const ThresholdCurve c1_curve(c1_left, c1_left);
-
-  constexpr ThresholdCurve::Point c2_left = c1_left;
-  constexpr ThresholdCurve::Point c2_right{c1_right.x + 1, c1_right.y - 1};
-  const ThresholdCurve c2_curve(c2_left, c2_right);
-
-  EXPECT_FALSE(c1_curve <= c2_curve);
-  EXPECT_TRUE(c2_curve <= c1_curve);
-}
-
-#if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
-// The higher-left point must be given as the first point, and the lower-right
-// point must be given as the second.
-// This necessarily produces a non-positive slope.
-TEST(ThresholdCurveTest, WrongOrderPoints) {
-  std::unique_ptr<ThresholdCurve> curve;
-  constexpr ThresholdCurve::Point left{5, 10};
-  constexpr ThresholdCurve::Point right{10, 5};
-  EXPECT_DEATH(curve.reset(new ThresholdCurve(right, left)), "");
-}
-#endif
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/codecs/OWNERS b/modules/audio_coding/codecs/OWNERS
deleted file mode 100644
index e69de29..0000000
--- a/modules/audio_coding/codecs/OWNERS
+++ /dev/null
diff --git a/modules/audio_coding/codecs/audio_decoder.h b/modules/audio_coding/codecs/audio_decoder.h
deleted file mode 100644
index da06282..0000000
--- a/modules/audio_coding/codecs/audio_decoder.h
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- *  Copyright (c) 2012 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.
- */
-
-// This file is for backwards compatibility only! Use
-// webrtc/api/audio_codecs/audio_decoder.h instead!
-// TODO(kwiberg): Remove it.
-
-#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_AUDIO_DECODER_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_AUDIO_DECODER_H_
-
-#include "webrtc/api/audio_codecs/audio_decoder.h"
-
-#endif  // WEBRTC_MODULES_AUDIO_CODING_CODECS_AUDIO_DECODER_H_
diff --git a/modules/audio_coding/codecs/audio_encoder.h b/modules/audio_coding/codecs/audio_encoder.h
deleted file mode 100644
index 942abb6..0000000
--- a/modules/audio_coding/codecs/audio_encoder.h
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- *  Copyright (c) 2012 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.
- */
-
-// This file is for backwards compatibility only! Use
-// webrtc/api/audio_codecs/audio_encoder.h instead!
-// TODO(ossu): Remove it.
-
-#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_AUDIO_ENCODER_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_AUDIO_ENCODER_H_
-
-#include "webrtc/api/audio_codecs/audio_encoder.h"
-
-#endif  // WEBRTC_MODULES_AUDIO_CODING_CODECS_AUDIO_ENCODER_H_
diff --git a/modules/audio_coding/codecs/audio_format_conversion.cc b/modules/audio_coding/codecs/audio_format_conversion.cc
deleted file mode 100644
index 1e53bf3..0000000
--- a/modules/audio_coding/codecs/audio_format_conversion.cc
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- *  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/codecs/audio_format_conversion.h"
-
-#include <string.h>
-
-#include "webrtc/api/array_view.h"
-#include "webrtc/api/optional.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/safe_conversions.h"
-#include "webrtc/rtc_base/sanitizer.h"
-
-namespace webrtc {
-
-namespace {
-
-CodecInst MakeCodecInst(int payload_type,
-                        const char* name,
-                        int sample_rate,
-                        size_t num_channels) {
-  // Create a CodecInst with some fields set. The remaining fields are zeroed,
-  // but we tell MSan to consider them uninitialized.
-  CodecInst ci = {0};
-  rtc::MsanMarkUninitialized(rtc::MakeArrayView(&ci, 1));
-  ci.pltype = payload_type;
-  strncpy(ci.plname, name, sizeof(ci.plname));
-  ci.plname[sizeof(ci.plname) - 1] = '\0';
-  ci.plfreq = sample_rate;
-  ci.channels = num_channels;
-  return ci;
-}
-
-}  // namespace
-
-SdpAudioFormat CodecInstToSdp(const CodecInst& ci) {
-  if (STR_CASE_CMP(ci.plname, "g722") == 0) {
-    RTC_CHECK_EQ(16000, ci.plfreq);
-    RTC_CHECK(ci.channels == 1 || ci.channels == 2);
-    return {"g722", 8000, ci.channels};
-  } else if (STR_CASE_CMP(ci.plname, "opus") == 0) {
-    RTC_CHECK_EQ(48000, ci.plfreq);
-    RTC_CHECK(ci.channels == 1 || ci.channels == 2);
-    return ci.channels == 1
-               ? SdpAudioFormat("opus", 48000, 2)
-               : SdpAudioFormat("opus", 48000, 2, {{"stereo", "1"}});
-  } else {
-    return {ci.plname, ci.plfreq, ci.channels};
-  }
-}
-
-CodecInst SdpToCodecInst(int payload_type, const SdpAudioFormat& audio_format) {
-  if (STR_CASE_CMP(audio_format.name.c_str(), "g722") == 0) {
-    RTC_CHECK_EQ(8000, audio_format.clockrate_hz);
-    RTC_CHECK(audio_format.num_channels == 1 || audio_format.num_channels == 2);
-    return MakeCodecInst(payload_type, "g722", 16000,
-                         audio_format.num_channels);
-  } else if (STR_CASE_CMP(audio_format.name.c_str(), "opus") == 0) {
-    RTC_CHECK_EQ(48000, audio_format.clockrate_hz);
-    RTC_CHECK_EQ(2, audio_format.num_channels);
-    const int num_channels = [&] {
-      auto stereo = audio_format.parameters.find("stereo");
-      if (stereo != audio_format.parameters.end()) {
-        if (stereo->second == "0") {
-          return 1;
-        } else if (stereo->second == "1") {
-          return 2;
-        } else {
-          RTC_CHECK(false);  // Bad stereo parameter.
-        }
-      }
-      return 1;  // Default to mono.
-    }();
-    return MakeCodecInst(payload_type, "opus", 48000, num_channels);
-  } else {
-    return MakeCodecInst(payload_type, audio_format.name.c_str(),
-                         audio_format.clockrate_hz, audio_format.num_channels);
-  }
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/codecs/audio_format_conversion.h b/modules/audio_coding/codecs/audio_format_conversion.h
deleted file mode 100644
index 0fa3a50..0000000
--- a/modules/audio_coding/codecs/audio_format_conversion.h
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- *  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_CODECS_AUDIO_FORMAT_CONVERSION_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_AUDIO_FORMAT_CONVERSION_H_
-
-#include "webrtc/api/audio_codecs/audio_format.h"
-#include "webrtc/common_types.h"
-
-namespace webrtc {
-
-SdpAudioFormat CodecInstToSdp(const CodecInst& codec_inst);
-CodecInst SdpToCodecInst(int payload_type, const SdpAudioFormat& audio_format);
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_CODING_CODECS_AUDIO_FORMAT_CONVERSION_H_
diff --git a/modules/audio_coding/codecs/builtin_audio_decoder_factory.h b/modules/audio_coding/codecs/builtin_audio_decoder_factory.h
deleted file mode 100644
index 7e6407a..0000000
--- a/modules/audio_coding/codecs/builtin_audio_decoder_factory.h
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- *  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.
- */
-
-// This file is for backwards compatibility only! Use
-// webrtc/api/audio_codecs/builtin_audio_decoder_factory.h instead!
-// TODO(kwiberg): Remove it.
-
-#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_BUILTIN_AUDIO_DECODER_FACTORY_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_BUILTIN_AUDIO_DECODER_FACTORY_H_
-
-#include "webrtc/api/audio_codecs/builtin_audio_decoder_factory.h"
-
-#endif  // WEBRTC_MODULES_AUDIO_CODING_CODECS_BUILTIN_AUDIO_DECODER_FACTORY_H_
diff --git a/modules/audio_coding/codecs/builtin_audio_decoder_factory_unittest.cc b/modules/audio_coding/codecs/builtin_audio_decoder_factory_unittest.cc
deleted file mode 100644
index f6b44b6..0000000
--- a/modules/audio_coding/codecs/builtin_audio_decoder_factory_unittest.cc
+++ /dev/null
@@ -1,136 +0,0 @@
-/*
- *  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 <memory>
-
-#include "webrtc/api/audio_codecs/builtin_audio_decoder_factory.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-TEST(AudioDecoderFactoryTest, CreateUnknownDecoder) {
-  rtc::scoped_refptr<AudioDecoderFactory> adf =
-      CreateBuiltinAudioDecoderFactory();
-  ASSERT_TRUE(adf);
-  EXPECT_FALSE(adf->MakeAudioDecoder(SdpAudioFormat("rey", 8000, 1)));
-}
-
-TEST(AudioDecoderFactoryTest, CreatePcmu) {
-  rtc::scoped_refptr<AudioDecoderFactory> adf =
-      CreateBuiltinAudioDecoderFactory();
-  ASSERT_TRUE(adf);
-  // PCMu supports 8 kHz, and any number of channels.
-  EXPECT_FALSE(adf->MakeAudioDecoder(SdpAudioFormat("pcmu", 8000, 0)));
-  EXPECT_TRUE(adf->MakeAudioDecoder(SdpAudioFormat("pcmu", 8000, 1)));
-  EXPECT_TRUE(adf->MakeAudioDecoder(SdpAudioFormat("pcmu", 8000, 2)));
-  EXPECT_TRUE(adf->MakeAudioDecoder(SdpAudioFormat("pcmu", 8000, 3)));
-  EXPECT_FALSE(adf->MakeAudioDecoder(SdpAudioFormat("pcmu", 16000, 1)));
-}
-
-TEST(AudioDecoderFactoryTest, CreatePcma) {
-  rtc::scoped_refptr<AudioDecoderFactory> adf =
-      CreateBuiltinAudioDecoderFactory();
-  ASSERT_TRUE(adf);
-  // PCMa supports 8 kHz, and any number of channels.
-  EXPECT_FALSE(adf->MakeAudioDecoder(SdpAudioFormat("pcma", 8000, 0)));
-  EXPECT_TRUE(adf->MakeAudioDecoder(SdpAudioFormat("pcma", 8000, 1)));
-  EXPECT_TRUE(adf->MakeAudioDecoder(SdpAudioFormat("pcma", 8000, 2)));
-  EXPECT_TRUE(adf->MakeAudioDecoder(SdpAudioFormat("pcma", 8000, 3)));
-  EXPECT_FALSE(adf->MakeAudioDecoder(SdpAudioFormat("pcma", 16000, 1)));
-}
-
-TEST(AudioDecoderFactoryTest, CreateIlbc) {
-  rtc::scoped_refptr<AudioDecoderFactory> adf =
-      CreateBuiltinAudioDecoderFactory();
-  ASSERT_TRUE(adf);
-  // iLBC supports 8 kHz, 1 channel.
-  EXPECT_FALSE(adf->MakeAudioDecoder(SdpAudioFormat("ilbc", 8000, 0)));
-#ifdef WEBRTC_CODEC_ILBC
-  EXPECT_TRUE(adf->MakeAudioDecoder(SdpAudioFormat("ilbc", 8000, 1)));
-#endif
-  EXPECT_FALSE(adf->MakeAudioDecoder(SdpAudioFormat("ilbc", 8000, 2)));
-  EXPECT_FALSE(adf->MakeAudioDecoder(SdpAudioFormat("ilbc", 16000, 1)));
-}
-
-TEST(AudioDecoderFactoryTest, CreateIsac) {
-  rtc::scoped_refptr<AudioDecoderFactory> adf =
-      CreateBuiltinAudioDecoderFactory();
-  ASSERT_TRUE(adf);
-  // iSAC supports 16 kHz, 1 channel. The float implementation additionally
-  // supports 32 kHz, 1 channel.
-  EXPECT_FALSE(adf->MakeAudioDecoder(SdpAudioFormat("isac", 16000, 0)));
-  EXPECT_TRUE(adf->MakeAudioDecoder(SdpAudioFormat("isac", 16000, 1)));
-  EXPECT_FALSE(adf->MakeAudioDecoder(SdpAudioFormat("isac", 16000, 2)));
-  EXPECT_FALSE(adf->MakeAudioDecoder(SdpAudioFormat("isac", 8000, 1)));
-  EXPECT_FALSE(adf->MakeAudioDecoder(SdpAudioFormat("isac", 48000, 1)));
-#ifdef WEBRTC_ARCH_ARM
-  EXPECT_FALSE(adf->MakeAudioDecoder(SdpAudioFormat("isac", 32000, 1)));
-#else
-  EXPECT_TRUE(adf->MakeAudioDecoder(SdpAudioFormat("isac", 32000, 1)));
-#endif
-}
-
-TEST(AudioDecoderFactoryTest, CreateL16) {
-  rtc::scoped_refptr<AudioDecoderFactory> adf =
-      CreateBuiltinAudioDecoderFactory();
-  ASSERT_TRUE(adf);
-  // L16 supports any clock rate, any number of channels.
-  const int clockrates[] = {8000, 16000, 32000, 48000};
-  const int num_channels[] = {1, 2, 3, 4711};
-  for (int clockrate : clockrates) {
-    EXPECT_FALSE(adf->MakeAudioDecoder(SdpAudioFormat("l16", clockrate, 0)));
-    for (int channels : num_channels) {
-      EXPECT_TRUE(
-          adf->MakeAudioDecoder(SdpAudioFormat("l16", clockrate, channels)));
-    }
-  }
-}
-
-TEST(AudioDecoderFactoryTest, CreateG722) {
-  rtc::scoped_refptr<AudioDecoderFactory> adf =
-      CreateBuiltinAudioDecoderFactory();
-  ASSERT_TRUE(adf);
-  // g722 supports 8 kHz, 1-2 channels.
-  EXPECT_FALSE(adf->MakeAudioDecoder(SdpAudioFormat("g722", 8000, 0)));
-  EXPECT_TRUE(adf->MakeAudioDecoder(SdpAudioFormat("g722", 8000, 1)));
-  EXPECT_TRUE(adf->MakeAudioDecoder(SdpAudioFormat("g722", 8000, 2)));
-  EXPECT_FALSE(adf->MakeAudioDecoder(SdpAudioFormat("g722", 8000, 3)));
-  EXPECT_FALSE(adf->MakeAudioDecoder(SdpAudioFormat("g722", 16000, 1)));
-  EXPECT_FALSE(adf->MakeAudioDecoder(SdpAudioFormat("g722", 32000, 1)));
-
-  // g722 actually uses a 16 kHz sample rate instead of the nominal 8 kHz.
-  std::unique_ptr<AudioDecoder> dec =
-      adf->MakeAudioDecoder(SdpAudioFormat("g722", 8000, 1));
-  EXPECT_EQ(16000, dec->SampleRateHz());
-}
-
-TEST(AudioDecoderFactoryTest, CreateOpus) {
-  rtc::scoped_refptr<AudioDecoderFactory> adf =
-      CreateBuiltinAudioDecoderFactory();
-  ASSERT_TRUE(adf);
-  // Opus supports 48 kHz, 2 channels, and wants a "stereo" parameter whose
-  // value is either "0" or "1".
-  for (int hz : {8000, 16000, 32000, 48000}) {
-    for (int channels : {0, 1, 2, 3}) {
-      for (std::string stereo : {"XX", "0", "1", "2"}) {
-        std::map<std::string, std::string> params;
-        if (stereo != "XX") {
-          params["stereo"] = stereo;
-        }
-        const bool good = (hz == 48000 && channels == 2 &&
-                           (stereo == "XX" || stereo == "0" || stereo == "1"));
-        EXPECT_EQ(good, static_cast<bool>(adf->MakeAudioDecoder(SdpAudioFormat(
-                            "opus", hz, channels, std::move(params)))));
-      }
-    }
-  }
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/codecs/builtin_audio_encoder_factory.h b/modules/audio_coding/codecs/builtin_audio_encoder_factory.h
deleted file mode 100644
index fd0ed79..0000000
--- a/modules/audio_coding/codecs/builtin_audio_encoder_factory.h
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- *  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.
- */
-
-// This file is for backwards compatibility only! Use
-// webrtc/api/audio_codecs/builtin_audio_decoder_factory.h instead!
-// TODO(ossu): Remove it.
-
-#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_BUILTIN_AUDIO_ENCODER_FACTORY_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_BUILTIN_AUDIO_ENCODER_FACTORY_H_
-
-#include "webrtc/api/audio_codecs/builtin_audio_encoder_factory.h"
-
-#endif  // WEBRTC_MODULES_AUDIO_CODING_CODECS_BUILTIN_AUDIO_ENCODER_FACTORY_H_
diff --git a/modules/audio_coding/codecs/builtin_audio_encoder_factory_unittest.cc b/modules/audio_coding/codecs/builtin_audio_encoder_factory_unittest.cc
deleted file mode 100644
index 1446268..0000000
--- a/modules/audio_coding/codecs/builtin_audio_encoder_factory_unittest.cc
+++ /dev/null
@@ -1,145 +0,0 @@
-/*
- *  Copyright (c) 2017 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 <limits>
-#include <memory>
-#include <vector>
-
-#include "webrtc/api/audio_codecs/builtin_audio_encoder_factory.h"
-#include "webrtc/test/gmock.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-class AudioEncoderFactoryTest
-    : public ::testing::TestWithParam<rtc::scoped_refptr<AudioEncoderFactory>> {
-};
-
-TEST_P(AudioEncoderFactoryTest, SupportsAtLeastOneFormat) {
-  auto factory = GetParam();
-  auto supported_encoders = factory->GetSupportedEncoders();
-  EXPECT_FALSE(supported_encoders.empty());
-}
-
-TEST_P(AudioEncoderFactoryTest, CanQueryAllSupportedFormats) {
-  auto factory = GetParam();
-  auto supported_encoders = factory->GetSupportedEncoders();
-  for (const auto& spec : supported_encoders) {
-    auto info = factory->QueryAudioEncoder(spec.format);
-    EXPECT_TRUE(info);
-  }
-}
-
-TEST_P(AudioEncoderFactoryTest, CanConstructAllSupportedEncoders) {
-  auto factory = GetParam();
-  auto supported_encoders = factory->GetSupportedEncoders();
-  for (const auto& spec : supported_encoders) {
-    auto info = factory->QueryAudioEncoder(spec.format);
-    auto encoder = factory->MakeAudioEncoder(127, spec.format);
-    EXPECT_TRUE(encoder);
-    EXPECT_EQ(encoder->SampleRateHz(), info->sample_rate_hz);
-    EXPECT_EQ(encoder->NumChannels(), info->num_channels);
-    EXPECT_EQ(encoder->RtpTimestampRateHz(), spec.format.clockrate_hz);
-  }
-}
-
-TEST_P(AudioEncoderFactoryTest, CanRunAllSupportedEncoders) {
-  constexpr int kTestPayloadType = 127;
-  auto factory = GetParam();
-  auto supported_encoders = factory->GetSupportedEncoders();
-  for (const auto& spec : supported_encoders) {
-    auto encoder = factory->MakeAudioEncoder(kTestPayloadType, spec.format);
-    EXPECT_TRUE(encoder);
-    encoder->Reset();
-    const int num_samples =
-        encoder->SampleRateHz() * encoder->NumChannels() / 100;
-    rtc::Buffer out;
-    rtc::BufferT<int16_t> audio;
-    audio.SetData(num_samples, [](rtc::ArrayView<int16_t> audio) {
-      for (size_t i = 0; i != audio.size(); ++i) {
-        // Just put some numbers in there, ensure they're within range.
-        audio[i] =
-            static_cast<int16_t>(i & std::numeric_limits<int16_t>::max());
-      }
-      return audio.size();
-    });
-    // This is here to stop the test going forever with a broken encoder.
-    constexpr int kMaxEncodeCalls = 100;
-    int blocks = 0;
-    for (; blocks < kMaxEncodeCalls; ++blocks) {
-      AudioEncoder::EncodedInfo info = encoder->Encode(
-          blocks * encoder->RtpTimestampRateHz() / 100, audio, &out);
-      EXPECT_EQ(info.encoded_bytes, out.size());
-      if (info.encoded_bytes > 0) {
-        EXPECT_EQ(0u, info.encoded_timestamp);
-        EXPECT_EQ(kTestPayloadType, info.payload_type);
-        break;
-      }
-    }
-    ASSERT_LT(blocks, kMaxEncodeCalls);
-    const unsigned int next_timestamp =
-        blocks * encoder->RtpTimestampRateHz() / 100;
-    out.Clear();
-    for (; blocks < kMaxEncodeCalls; ++blocks) {
-      AudioEncoder::EncodedInfo info = encoder->Encode(
-          blocks * encoder->RtpTimestampRateHz() / 100, audio, &out);
-      EXPECT_EQ(info.encoded_bytes, out.size());
-      if (info.encoded_bytes > 0) {
-        EXPECT_EQ(next_timestamp, info.encoded_timestamp);
-        EXPECT_EQ(kTestPayloadType, info.payload_type);
-        break;
-      }
-    }
-    ASSERT_LT(blocks, kMaxEncodeCalls);
-  }
-}
-
-INSTANTIATE_TEST_CASE_P(BuiltinAudioEncoderFactoryTest,
-                        AudioEncoderFactoryTest,
-                        ::testing::Values(CreateBuiltinAudioEncoderFactory()));
-
-TEST(BuiltinAudioEncoderFactoryTest, SupportsTheExpectedFormats) {
-  using ::testing::ElementsAreArray;
-  // Check that we claim to support the formats we expect from build flags, and
-  // we've ordered them correctly.
-  auto factory = CreateBuiltinAudioEncoderFactory();
-  auto specs = factory->GetSupportedEncoders();
-
-  const std::vector<SdpAudioFormat> supported_formats = [&specs] {
-    std::vector<SdpAudioFormat> formats;
-    for (const auto& spec : specs) {
-      formats.push_back(spec.format);
-    }
-    return formats;
-  }();
-
-  const std::vector<SdpAudioFormat> expected_formats = {
-#ifdef WEBRTC_CODEC_OPUS
-    {"opus", 48000, 2, {{"minptime", "10"}, {"useinbandfec", "1"}}},
-#endif
-#if defined(WEBRTC_CODEC_ISAC) || defined(WEBRTC_CODEC_ISACFX)
-    {"isac", 16000, 1},
-#endif
-#ifdef WEBRTC_CODEC_ISAC
-    {"isac", 32000, 1},
-#endif
-#ifdef WEBRTC_CODEC_G722
-    {"G722", 8000, 1},
-#endif
-#ifdef WEBRTC_CODEC_ILBC
-    {"ilbc", 8000, 1},
-#endif
-    {"pcmu", 8000, 1},
-    {"pcma", 8000, 1}
-  };
-
-  ASSERT_THAT(supported_formats, ElementsAreArray(expected_formats));
-}
-}  // namespace webrtc
diff --git a/modules/audio_coding/codecs/cng/audio_encoder_cng.cc b/modules/audio_coding/codecs/cng/audio_encoder_cng.cc
deleted file mode 100644
index 52661d3..0000000
--- a/modules/audio_coding/codecs/cng/audio_encoder_cng.cc
+++ /dev/null
@@ -1,267 +0,0 @@
-/*
- *  Copyright (c) 2014 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/codecs/cng/audio_encoder_cng.h"
-
-#include <algorithm>
-#include <memory>
-#include <limits>
-#include <utility>
-
-namespace webrtc {
-
-namespace {
-
-const int kMaxFrameSizeMs = 60;
-
-}  // namespace
-
-AudioEncoderCng::Config::Config() = default;
-AudioEncoderCng::Config::Config(Config&&) = default;
-AudioEncoderCng::Config::~Config() = default;
-
-bool AudioEncoderCng::Config::IsOk() const {
-  if (num_channels != 1)
-    return false;
-  if (!speech_encoder)
-    return false;
-  if (num_channels != speech_encoder->NumChannels())
-    return false;
-  if (sid_frame_interval_ms <
-      static_cast<int>(speech_encoder->Max10MsFramesInAPacket() * 10))
-    return false;
-  if (num_cng_coefficients > WEBRTC_CNG_MAX_LPC_ORDER ||
-      num_cng_coefficients <= 0)
-    return false;
-  return true;
-}
-
-AudioEncoderCng::AudioEncoderCng(Config&& config)
-    : speech_encoder_(
-          ([&] { RTC_CHECK(config.IsOk()) << "Invalid configuration."; }(),
-           std::move(config.speech_encoder))),
-      cng_payload_type_(config.payload_type),
-      num_cng_coefficients_(config.num_cng_coefficients),
-      sid_frame_interval_ms_(config.sid_frame_interval_ms),
-      last_frame_active_(true),
-      vad_(config.vad ? std::unique_ptr<Vad>(config.vad)
-           : CreateVad(config.vad_mode)),
-      cng_encoder_(new ComfortNoiseEncoder(SampleRateHz(),
-                                           sid_frame_interval_ms_,
-                                           num_cng_coefficients_)) {
-}
-
-AudioEncoderCng::~AudioEncoderCng() = default;
-
-int AudioEncoderCng::SampleRateHz() const {
-  return speech_encoder_->SampleRateHz();
-}
-
-size_t AudioEncoderCng::NumChannels() const {
-  return 1;
-}
-
-int AudioEncoderCng::RtpTimestampRateHz() const {
-  return speech_encoder_->RtpTimestampRateHz();
-}
-
-size_t AudioEncoderCng::Num10MsFramesInNextPacket() const {
-  return speech_encoder_->Num10MsFramesInNextPacket();
-}
-
-size_t AudioEncoderCng::Max10MsFramesInAPacket() const {
-  return speech_encoder_->Max10MsFramesInAPacket();
-}
-
-int AudioEncoderCng::GetTargetBitrate() const {
-  return speech_encoder_->GetTargetBitrate();
-}
-
-AudioEncoder::EncodedInfo AudioEncoderCng::EncodeImpl(
-    uint32_t rtp_timestamp,
-    rtc::ArrayView<const int16_t> audio,
-    rtc::Buffer* encoded) {
-  const size_t samples_per_10ms_frame = SamplesPer10msFrame();
-  RTC_CHECK_EQ(speech_buffer_.size(),
-               rtp_timestamps_.size() * samples_per_10ms_frame);
-  rtp_timestamps_.push_back(rtp_timestamp);
-  RTC_DCHECK_EQ(samples_per_10ms_frame, audio.size());
-  speech_buffer_.insert(speech_buffer_.end(), audio.cbegin(), audio.cend());
-  const size_t frames_to_encode = speech_encoder_->Num10MsFramesInNextPacket();
-  if (rtp_timestamps_.size() < frames_to_encode) {
-    return EncodedInfo();
-  }
-  RTC_CHECK_LE(frames_to_encode * 10, kMaxFrameSizeMs)
-      << "Frame size cannot be larger than " << kMaxFrameSizeMs
-      << " ms when using VAD/CNG.";
-
-  // Group several 10 ms blocks per VAD call. Call VAD once or twice using the
-  // following split sizes:
-  // 10 ms = 10 + 0 ms; 20 ms = 20 + 0 ms; 30 ms = 30 + 0 ms;
-  // 40 ms = 20 + 20 ms; 50 ms = 30 + 20 ms; 60 ms = 30 + 30 ms.
-  size_t blocks_in_first_vad_call =
-      (frames_to_encode > 3 ? 3 : frames_to_encode);
-  if (frames_to_encode == 4)
-    blocks_in_first_vad_call = 2;
-  RTC_CHECK_GE(frames_to_encode, blocks_in_first_vad_call);
-  const size_t blocks_in_second_vad_call =
-      frames_to_encode - blocks_in_first_vad_call;
-
-  // Check if all of the buffer is passive speech. Start with checking the first
-  // block.
-  Vad::Activity activity = vad_->VoiceActivity(
-      &speech_buffer_[0], samples_per_10ms_frame * blocks_in_first_vad_call,
-      SampleRateHz());
-  if (activity == Vad::kPassive && blocks_in_second_vad_call > 0) {
-    // Only check the second block if the first was passive.
-    activity = vad_->VoiceActivity(
-        &speech_buffer_[samples_per_10ms_frame * blocks_in_first_vad_call],
-        samples_per_10ms_frame * blocks_in_second_vad_call, SampleRateHz());
-  }
-
-  EncodedInfo info;
-  switch (activity) {
-    case Vad::kPassive: {
-      info = EncodePassive(frames_to_encode, encoded);
-      last_frame_active_ = false;
-      break;
-    }
-    case Vad::kActive: {
-      info = EncodeActive(frames_to_encode, encoded);
-      last_frame_active_ = true;
-      break;
-    }
-    case Vad::kError: {
-      FATAL();  // Fails only if fed invalid data.
-      break;
-    }
-  }
-
-  speech_buffer_.erase(
-      speech_buffer_.begin(),
-      speech_buffer_.begin() + frames_to_encode * samples_per_10ms_frame);
-  rtp_timestamps_.erase(rtp_timestamps_.begin(),
-                        rtp_timestamps_.begin() + frames_to_encode);
-  return info;
-}
-
-void AudioEncoderCng::Reset() {
-  speech_encoder_->Reset();
-  speech_buffer_.clear();
-  rtp_timestamps_.clear();
-  last_frame_active_ = true;
-  vad_->Reset();
-  cng_encoder_.reset(
-      new ComfortNoiseEncoder(SampleRateHz(), sid_frame_interval_ms_,
-                              num_cng_coefficients_));
-}
-
-bool AudioEncoderCng::SetFec(bool enable) {
-  return speech_encoder_->SetFec(enable);
-}
-
-bool AudioEncoderCng::SetDtx(bool enable) {
-  return speech_encoder_->SetDtx(enable);
-}
-
-bool AudioEncoderCng::SetApplication(Application application) {
-  return speech_encoder_->SetApplication(application);
-}
-
-void AudioEncoderCng::SetMaxPlaybackRate(int frequency_hz) {
-  speech_encoder_->SetMaxPlaybackRate(frequency_hz);
-}
-
-rtc::ArrayView<std::unique_ptr<AudioEncoder>>
-AudioEncoderCng::ReclaimContainedEncoders() {
-  return rtc::ArrayView<std::unique_ptr<AudioEncoder>>(&speech_encoder_, 1);
-}
-
-void AudioEncoderCng::OnReceivedUplinkPacketLossFraction(
-    float uplink_packet_loss_fraction) {
-  speech_encoder_->OnReceivedUplinkPacketLossFraction(
-      uplink_packet_loss_fraction);
-}
-
-void AudioEncoderCng::OnReceivedUplinkRecoverablePacketLossFraction(
-    float uplink_recoverable_packet_loss_fraction) {
-  speech_encoder_->OnReceivedUplinkRecoverablePacketLossFraction(
-      uplink_recoverable_packet_loss_fraction);
-}
-
-void AudioEncoderCng::OnReceivedUplinkBandwidth(
-    int target_audio_bitrate_bps,
-    rtc::Optional<int64_t> bwe_period_ms) {
-  speech_encoder_->OnReceivedUplinkBandwidth(target_audio_bitrate_bps,
-                                             bwe_period_ms);
-}
-
-AudioEncoder::EncodedInfo AudioEncoderCng::EncodePassive(
-    size_t frames_to_encode,
-    rtc::Buffer* encoded) {
-  bool force_sid = last_frame_active_;
-  bool output_produced = false;
-  const size_t samples_per_10ms_frame = SamplesPer10msFrame();
-  AudioEncoder::EncodedInfo info;
-
-  for (size_t i = 0; i < frames_to_encode; ++i) {
-    // It's important not to pass &info.encoded_bytes directly to
-    // WebRtcCng_Encode(), since later loop iterations may return zero in
-    // that value, in which case we don't want to overwrite any value from
-    // an earlier iteration.
-    size_t encoded_bytes_tmp =
-        cng_encoder_->Encode(
-            rtc::ArrayView<const int16_t>(
-                &speech_buffer_[i * samples_per_10ms_frame],
-                samples_per_10ms_frame),
-            force_sid, encoded);
-
-    if (encoded_bytes_tmp > 0) {
-      RTC_CHECK(!output_produced);
-      info.encoded_bytes = encoded_bytes_tmp;
-      output_produced = true;
-      force_sid = false;
-    }
-  }
-
-  info.encoded_timestamp = rtp_timestamps_.front();
-  info.payload_type = cng_payload_type_;
-  info.send_even_if_empty = true;
-  info.speech = false;
-  return info;
-}
-
-AudioEncoder::EncodedInfo AudioEncoderCng::EncodeActive(
-    size_t frames_to_encode,
-    rtc::Buffer* encoded) {
-  const size_t samples_per_10ms_frame = SamplesPer10msFrame();
-  AudioEncoder::EncodedInfo info;
-  for (size_t i = 0; i < frames_to_encode; ++i) {
-    info =
-        speech_encoder_->Encode(rtp_timestamps_.front(),
-                                rtc::ArrayView<const int16_t>(
-                                    &speech_buffer_[i * samples_per_10ms_frame],
-                                    samples_per_10ms_frame),
-                                encoded);
-    if (i + 1 == frames_to_encode) {
-      RTC_CHECK_GT(info.encoded_bytes, 0) << "Encoder didn't deliver data.";
-    } else {
-      RTC_CHECK_EQ(info.encoded_bytes, 0)
-          << "Encoder delivered data too early.";
-    }
-  }
-  return info;
-}
-
-size_t AudioEncoderCng::SamplesPer10msFrame() const {
-  return rtc::CheckedDivExact(10 * SampleRateHz(), 1000);
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/codecs/cng/audio_encoder_cng.h b/modules/audio_coding/codecs/cng/audio_encoder_cng.h
deleted file mode 100644
index 66305e6..0000000
--- a/modules/audio_coding/codecs/cng/audio_encoder_cng.h
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- *  Copyright (c) 2014 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_CODECS_CNG_AUDIO_ENCODER_CNG_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_CNG_AUDIO_ENCODER_CNG_H_
-
-#include <memory>
-#include <vector>
-
-#include "webrtc/api/audio_codecs/audio_encoder.h"
-#include "webrtc/common_audio/vad/include/vad.h"
-#include "webrtc/modules/audio_coding/codecs/cng/webrtc_cng.h"
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace webrtc {
-
-class Vad;
-
-class AudioEncoderCng final : public AudioEncoder {
- public:
-  struct Config {
-    Config();
-    Config(Config&&);
-    ~Config();
-    bool IsOk() const;
-
-    size_t num_channels = 1;
-    int payload_type = 13;
-    std::unique_ptr<AudioEncoder> speech_encoder;
-    Vad::Aggressiveness vad_mode = Vad::kVadNormal;
-    int sid_frame_interval_ms = 100;
-    int num_cng_coefficients = 8;
-    // The Vad pointer is mainly for testing. If a NULL pointer is passed, the
-    // AudioEncoderCng creates (and destroys) a Vad object internally. If an
-    // object is passed, the AudioEncoderCng assumes ownership of the Vad
-    // object.
-    Vad* vad = nullptr;
-  };
-
-  explicit AudioEncoderCng(Config&& config);
-  ~AudioEncoderCng() override;
-
-  int SampleRateHz() const override;
-  size_t NumChannels() const override;
-  int RtpTimestampRateHz() const override;
-  size_t Num10MsFramesInNextPacket() const override;
-  size_t Max10MsFramesInAPacket() const override;
-  int GetTargetBitrate() const override;
-  EncodedInfo EncodeImpl(uint32_t rtp_timestamp,
-                         rtc::ArrayView<const int16_t> audio,
-                         rtc::Buffer* encoded) override;
-  void Reset() override;
-  bool SetFec(bool enable) override;
-  bool SetDtx(bool enable) override;
-  bool SetApplication(Application application) override;
-  void SetMaxPlaybackRate(int frequency_hz) override;
-  rtc::ArrayView<std::unique_ptr<AudioEncoder>> ReclaimContainedEncoders()
-      override;
-  void OnReceivedUplinkPacketLossFraction(
-      float uplink_packet_loss_fraction) override;
-  void OnReceivedUplinkRecoverablePacketLossFraction(
-      float uplink_recoverable_packet_loss_fraction) override;
-  void OnReceivedUplinkBandwidth(
-      int target_audio_bitrate_bps,
-      rtc::Optional<int64_t> bwe_period_ms) override;
-
- private:
-  EncodedInfo EncodePassive(size_t frames_to_encode,
-                            rtc::Buffer* encoded);
-  EncodedInfo EncodeActive(size_t frames_to_encode,
-                           rtc::Buffer* encoded);
-  size_t SamplesPer10msFrame() const;
-
-  std::unique_ptr<AudioEncoder> speech_encoder_;
-  const int cng_payload_type_;
-  const int num_cng_coefficients_;
-  const int sid_frame_interval_ms_;
-  std::vector<int16_t> speech_buffer_;
-  std::vector<uint32_t> rtp_timestamps_;
-  bool last_frame_active_;
-  std::unique_ptr<Vad> vad_;
-  std::unique_ptr<ComfortNoiseEncoder> cng_encoder_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(AudioEncoderCng);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_CODING_CODECS_CNG_AUDIO_ENCODER_CNG_H_
diff --git a/modules/audio_coding/codecs/cng/audio_encoder_cng_unittest.cc b/modules/audio_coding/codecs/cng/audio_encoder_cng_unittest.cc
deleted file mode 100644
index 5de1b03..0000000
--- a/modules/audio_coding/codecs/cng/audio_encoder_cng_unittest.cc
+++ /dev/null
@@ -1,506 +0,0 @@
-/*
- *  Copyright (c) 2014 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 <memory>
-#include <vector>
-
-#include "webrtc/common_audio/vad/mock/mock_vad.h"
-#include "webrtc/modules/audio_coding/codecs/cng/audio_encoder_cng.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/mock_audio_encoder.h"
-
-using ::testing::Return;
-using ::testing::_;
-using ::testing::SetArgPointee;
-using ::testing::InSequence;
-using ::testing::Invoke;
-
-namespace webrtc {
-
-namespace {
-static const size_t kMaxNumSamples = 48 * 10 * 2;  // 10 ms @ 48 kHz stereo.
-static const size_t kMockReturnEncodedBytes = 17;
-static const int kCngPayloadType = 18;
-}
-
-class AudioEncoderCngTest : public ::testing::Test {
- protected:
-  AudioEncoderCngTest()
-      : mock_encoder_owner_(new MockAudioEncoder),
-        mock_encoder_(mock_encoder_owner_.get()),
-        mock_vad_(new MockVad),
-        timestamp_(4711),
-        num_audio_samples_10ms_(0),
-        sample_rate_hz_(8000) {
-    memset(audio_, 0, kMaxNumSamples * 2);
-    EXPECT_CALL(*mock_encoder_, NumChannels()).WillRepeatedly(Return(1));
-    EXPECT_CALL(*mock_encoder_, Die()).Times(1);
-  }
-
-  void TearDown() override {
-    EXPECT_CALL(*mock_vad_, Die()).Times(1);
-    cng_.reset();
-  }
-
-  AudioEncoderCng::Config MakeCngConfig() {
-    AudioEncoderCng::Config config;
-    config.speech_encoder = std::move(mock_encoder_owner_);
-    EXPECT_TRUE(config.speech_encoder);
-
-    // Let the AudioEncoderCng object use a MockVad instead of its internally
-    // created Vad object.
-    config.vad = mock_vad_;
-    config.payload_type = kCngPayloadType;
-
-    return config;
-  }
-
-  void CreateCng(AudioEncoderCng::Config&& config) {
-    num_audio_samples_10ms_ = static_cast<size_t>(10 * sample_rate_hz_ / 1000);
-    ASSERT_LE(num_audio_samples_10ms_, kMaxNumSamples);
-    if (config.speech_encoder) {
-      EXPECT_CALL(*mock_encoder_, SampleRateHz())
-          .WillRepeatedly(Return(sample_rate_hz_));
-      // Max10MsFramesInAPacket() is just used to verify that the SID frame
-      // period is not too small. The return value does not matter that much,
-      // as long as it is smaller than 10.
-      EXPECT_CALL(*mock_encoder_, Max10MsFramesInAPacket())
-          .WillOnce(Return(1u));
-    }
-    cng_.reset(new AudioEncoderCng(std::move(config)));
-  }
-
-  void Encode() {
-    ASSERT_TRUE(cng_) << "Must call CreateCng() first.";
-    encoded_info_ = cng_->Encode(
-        timestamp_,
-        rtc::ArrayView<const int16_t>(audio_, num_audio_samples_10ms_),
-        &encoded_);
-    timestamp_ += static_cast<uint32_t>(num_audio_samples_10ms_);
-  }
-
-  // Expect |num_calls| calls to the encoder, all successful. The last call
-  // claims to have encoded |kMockReturnEncodedBytes| bytes, and all the
-  // preceding ones 0 bytes.
-  void ExpectEncodeCalls(size_t num_calls) {
-    InSequence s;
-    AudioEncoder::EncodedInfo info;
-    for (size_t j = 0; j < num_calls - 1; ++j) {
-      EXPECT_CALL(*mock_encoder_, EncodeImpl(_, _, _))
-          .WillOnce(Return(info));
-    }
-    info.encoded_bytes = kMockReturnEncodedBytes;
-    EXPECT_CALL(*mock_encoder_, EncodeImpl(_, _, _))
-        .WillOnce(
-            Invoke(MockAudioEncoder::FakeEncoding(kMockReturnEncodedBytes)));
-  }
-
-  // Verifies that the cng_ object waits until it has collected
-  // |blocks_per_frame| blocks of audio, and then dispatches all of them to
-  // the underlying codec (speech or cng).
-  void CheckBlockGrouping(size_t blocks_per_frame, bool active_speech) {
-    EXPECT_CALL(*mock_encoder_, Num10MsFramesInNextPacket())
-        .WillRepeatedly(Return(blocks_per_frame));
-    auto config = MakeCngConfig();
-    const int num_cng_coefficients = config.num_cng_coefficients;
-    CreateCng(std::move(config));
-    EXPECT_CALL(*mock_vad_, VoiceActivity(_, _, _))
-        .WillRepeatedly(Return(active_speech ? Vad::kActive : Vad::kPassive));
-
-    // Don't expect any calls to the encoder yet.
-    EXPECT_CALL(*mock_encoder_, EncodeImpl(_, _, _)).Times(0);
-    for (size_t i = 0; i < blocks_per_frame - 1; ++i) {
-      Encode();
-      EXPECT_EQ(0u, encoded_info_.encoded_bytes);
-    }
-    if (active_speech)
-      ExpectEncodeCalls(blocks_per_frame);
-    Encode();
-    if (active_speech) {
-      EXPECT_EQ(kMockReturnEncodedBytes, encoded_info_.encoded_bytes);
-    } else {
-      EXPECT_EQ(static_cast<size_t>(num_cng_coefficients + 1),
-                encoded_info_.encoded_bytes);
-    }
-  }
-
-  // Verifies that the audio is partitioned into larger blocks before calling
-  // the VAD.
-  void CheckVadInputSize(int input_frame_size_ms,
-                         int expected_first_block_size_ms,
-                         int expected_second_block_size_ms) {
-    const size_t blocks_per_frame =
-        static_cast<size_t>(input_frame_size_ms / 10);
-
-    EXPECT_CALL(*mock_encoder_, Num10MsFramesInNextPacket())
-        .WillRepeatedly(Return(blocks_per_frame));
-
-    // Expect nothing to happen before the last block is sent to cng_.
-    EXPECT_CALL(*mock_vad_, VoiceActivity(_, _, _)).Times(0);
-    for (size_t i = 0; i < blocks_per_frame - 1; ++i) {
-      Encode();
-    }
-
-    // Let the VAD decision be passive, since an active decision may lead to
-    // early termination of the decision loop.
-    InSequence s;
-    EXPECT_CALL(
-        *mock_vad_,
-        VoiceActivity(_, expected_first_block_size_ms * sample_rate_hz_ / 1000,
-                      sample_rate_hz_)).WillOnce(Return(Vad::kPassive));
-    if (expected_second_block_size_ms > 0) {
-      EXPECT_CALL(*mock_vad_,
-                  VoiceActivity(
-                      _, expected_second_block_size_ms * sample_rate_hz_ / 1000,
-                      sample_rate_hz_)).WillOnce(Return(Vad::kPassive));
-    }
-
-    // With this call to Encode(), |mock_vad_| should be called according to the
-    // above expectations.
-    Encode();
-  }
-
-  // Tests a frame with both active and passive speech. Returns true if the
-  // decision was active speech, false if it was passive.
-  bool CheckMixedActivePassive(Vad::Activity first_type,
-                               Vad::Activity second_type) {
-    // Set the speech encoder frame size to 60 ms, to ensure that the VAD will
-    // be called twice.
-    const size_t blocks_per_frame = 6;
-    EXPECT_CALL(*mock_encoder_, Num10MsFramesInNextPacket())
-        .WillRepeatedly(Return(blocks_per_frame));
-    InSequence s;
-    EXPECT_CALL(*mock_vad_, VoiceActivity(_, _, _))
-        .WillOnce(Return(first_type));
-    if (first_type == Vad::kPassive) {
-      // Expect a second call to the VAD only if the first frame was passive.
-      EXPECT_CALL(*mock_vad_, VoiceActivity(_, _, _))
-          .WillOnce(Return(second_type));
-    }
-    encoded_info_.payload_type = 0;
-    for (size_t i = 0; i < blocks_per_frame; ++i) {
-      Encode();
-    }
-    return encoded_info_.payload_type != kCngPayloadType;
-  }
-
-  std::unique_ptr<AudioEncoderCng> cng_;
-  std::unique_ptr<MockAudioEncoder> mock_encoder_owner_;
-  MockAudioEncoder* mock_encoder_;
-  MockVad* mock_vad_;  // Ownership is transferred to |cng_|.
-  uint32_t timestamp_;
-  int16_t audio_[kMaxNumSamples];
-  size_t num_audio_samples_10ms_;
-  rtc::Buffer encoded_;
-  AudioEncoder::EncodedInfo encoded_info_;
-  int sample_rate_hz_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(AudioEncoderCngTest);
-};
-
-TEST_F(AudioEncoderCngTest, CreateAndDestroy) {
-  CreateCng(MakeCngConfig());
-}
-
-TEST_F(AudioEncoderCngTest, CheckFrameSizePropagation) {
-  CreateCng(MakeCngConfig());
-  EXPECT_CALL(*mock_encoder_, Num10MsFramesInNextPacket())
-      .WillOnce(Return(17U));
-  EXPECT_EQ(17U, cng_->Num10MsFramesInNextPacket());
-}
-
-TEST_F(AudioEncoderCngTest, CheckTargetAudioBitratePropagation) {
-  CreateCng(MakeCngConfig());
-  EXPECT_CALL(*mock_encoder_,
-              OnReceivedUplinkBandwidth(4711, rtc::Optional<int64_t>()));
-  cng_->OnReceivedUplinkBandwidth(4711, rtc::Optional<int64_t>());
-}
-
-TEST_F(AudioEncoderCngTest, CheckPacketLossFractionPropagation) {
-  CreateCng(MakeCngConfig());
-  EXPECT_CALL(*mock_encoder_, OnReceivedUplinkPacketLossFraction(0.5));
-  cng_->OnReceivedUplinkPacketLossFraction(0.5);
-}
-
-TEST_F(AudioEncoderCngTest, EncodeCallsVad) {
-  EXPECT_CALL(*mock_encoder_, Num10MsFramesInNextPacket())
-      .WillRepeatedly(Return(1U));
-  CreateCng(MakeCngConfig());
-  EXPECT_CALL(*mock_vad_, VoiceActivity(_, _, _))
-      .WillOnce(Return(Vad::kPassive));
-  Encode();
-}
-
-TEST_F(AudioEncoderCngTest, EncodeCollects1BlockPassiveSpeech) {
-  CheckBlockGrouping(1, false);
-}
-
-TEST_F(AudioEncoderCngTest, EncodeCollects2BlocksPassiveSpeech) {
-  CheckBlockGrouping(2, false);
-}
-
-TEST_F(AudioEncoderCngTest, EncodeCollects3BlocksPassiveSpeech) {
-  CheckBlockGrouping(3, false);
-}
-
-TEST_F(AudioEncoderCngTest, EncodeCollects1BlockActiveSpeech) {
-  CheckBlockGrouping(1, true);
-}
-
-TEST_F(AudioEncoderCngTest, EncodeCollects2BlocksActiveSpeech) {
-  CheckBlockGrouping(2, true);
-}
-
-TEST_F(AudioEncoderCngTest, EncodeCollects3BlocksActiveSpeech) {
-  CheckBlockGrouping(3, true);
-}
-
-TEST_F(AudioEncoderCngTest, EncodePassive) {
-  const size_t kBlocksPerFrame = 3;
-  EXPECT_CALL(*mock_encoder_, Num10MsFramesInNextPacket())
-      .WillRepeatedly(Return(kBlocksPerFrame));
-  auto config = MakeCngConfig();
-  const auto sid_frame_interval_ms = config.sid_frame_interval_ms;
-  const auto num_cng_coefficients = config.num_cng_coefficients;
-  CreateCng(std::move(config));
-  EXPECT_CALL(*mock_vad_, VoiceActivity(_, _, _))
-      .WillRepeatedly(Return(Vad::kPassive));
-  // Expect no calls at all to the speech encoder mock.
-  EXPECT_CALL(*mock_encoder_, EncodeImpl(_, _, _)).Times(0);
-  uint32_t expected_timestamp = timestamp_;
-  for (size_t i = 0; i < 100; ++i) {
-    Encode();
-    // Check if it was time to call the cng encoder. This is done once every
-    // |kBlocksPerFrame| calls.
-    if ((i + 1) % kBlocksPerFrame == 0) {
-      // Now check if a SID interval has elapsed.
-      if ((i % (sid_frame_interval_ms / 10)) < kBlocksPerFrame) {
-        // If so, verify that we got a CNG encoding.
-        EXPECT_EQ(kCngPayloadType, encoded_info_.payload_type);
-        EXPECT_FALSE(encoded_info_.speech);
-        EXPECT_EQ(static_cast<size_t>(num_cng_coefficients) + 1,
-                  encoded_info_.encoded_bytes);
-        EXPECT_EQ(expected_timestamp, encoded_info_.encoded_timestamp);
-      }
-      expected_timestamp += kBlocksPerFrame * num_audio_samples_10ms_;
-    } else {
-      // Otherwise, expect no output.
-      EXPECT_EQ(0u, encoded_info_.encoded_bytes);
-    }
-  }
-}
-
-// Verifies that the correct action is taken for frames with both active and
-// passive speech.
-TEST_F(AudioEncoderCngTest, MixedActivePassive) {
-  CreateCng(MakeCngConfig());
-
-  // All of the frame is active speech.
-  ExpectEncodeCalls(6);
-  EXPECT_TRUE(CheckMixedActivePassive(Vad::kActive, Vad::kActive));
-  EXPECT_TRUE(encoded_info_.speech);
-
-  // First half of the frame is active speech.
-  ExpectEncodeCalls(6);
-  EXPECT_TRUE(CheckMixedActivePassive(Vad::kActive, Vad::kPassive));
-  EXPECT_TRUE(encoded_info_.speech);
-
-  // Second half of the frame is active speech.
-  ExpectEncodeCalls(6);
-  EXPECT_TRUE(CheckMixedActivePassive(Vad::kPassive, Vad::kActive));
-  EXPECT_TRUE(encoded_info_.speech);
-
-  // All of the frame is passive speech. Expect no calls to |mock_encoder_|.
-  EXPECT_FALSE(CheckMixedActivePassive(Vad::kPassive, Vad::kPassive));
-  EXPECT_FALSE(encoded_info_.speech);
-}
-
-// These tests verify that the audio is partitioned into larger blocks before
-// calling the VAD.
-// The parameters for CheckVadInputSize are:
-// CheckVadInputSize(frame_size, expected_first_block_size,
-//                   expected_second_block_size);
-TEST_F(AudioEncoderCngTest, VadInputSize10Ms) {
-  CreateCng(MakeCngConfig());
-  CheckVadInputSize(10, 10, 0);
-}
-TEST_F(AudioEncoderCngTest, VadInputSize20Ms) {
-  CreateCng(MakeCngConfig());
-  CheckVadInputSize(20, 20, 0);
-}
-TEST_F(AudioEncoderCngTest, VadInputSize30Ms) {
-  CreateCng(MakeCngConfig());
-  CheckVadInputSize(30, 30, 0);
-}
-TEST_F(AudioEncoderCngTest, VadInputSize40Ms) {
-  CreateCng(MakeCngConfig());
-  CheckVadInputSize(40, 20, 20);
-}
-TEST_F(AudioEncoderCngTest, VadInputSize50Ms) {
-  CreateCng(MakeCngConfig());
-  CheckVadInputSize(50, 30, 20);
-}
-TEST_F(AudioEncoderCngTest, VadInputSize60Ms) {
-  CreateCng(MakeCngConfig());
-  CheckVadInputSize(60, 30, 30);
-}
-
-// Verifies that the correct payload type is set when CNG is encoded.
-TEST_F(AudioEncoderCngTest, VerifyCngPayloadType) {
-  CreateCng(MakeCngConfig());
-  EXPECT_CALL(*mock_encoder_, EncodeImpl(_, _, _)).Times(0);
-  EXPECT_CALL(*mock_encoder_, Num10MsFramesInNextPacket()).WillOnce(Return(1U));
-  EXPECT_CALL(*mock_vad_, VoiceActivity(_, _, _))
-      .WillOnce(Return(Vad::kPassive));
-  encoded_info_.payload_type = 0;
-  Encode();
-  EXPECT_EQ(kCngPayloadType, encoded_info_.payload_type);
-}
-
-// Verifies that a SID frame is encoded immediately as the signal changes from
-// active speech to passive.
-TEST_F(AudioEncoderCngTest, VerifySidFrameAfterSpeech) {
-  auto config = MakeCngConfig();
-  const auto num_cng_coefficients = config.num_cng_coefficients;
-  CreateCng(std::move(config));
-  EXPECT_CALL(*mock_encoder_, Num10MsFramesInNextPacket())
-      .WillRepeatedly(Return(1U));
-  // Start with encoding noise.
-  EXPECT_CALL(*mock_vad_, VoiceActivity(_, _, _))
-      .Times(2)
-      .WillRepeatedly(Return(Vad::kPassive));
-  Encode();
-  EXPECT_EQ(kCngPayloadType, encoded_info_.payload_type);
-  EXPECT_EQ(static_cast<size_t>(num_cng_coefficients) + 1,
-            encoded_info_.encoded_bytes);
-  // Encode again, and make sure we got no frame at all (since the SID frame
-  // period is 100 ms by default).
-  Encode();
-  EXPECT_EQ(0u, encoded_info_.encoded_bytes);
-
-  // Now encode active speech.
-  encoded_info_.payload_type = 0;
-  EXPECT_CALL(*mock_vad_, VoiceActivity(_, _, _))
-      .WillOnce(Return(Vad::kActive));
-  EXPECT_CALL(*mock_encoder_, EncodeImpl(_, _, _))
-      .WillOnce(
-          Invoke(MockAudioEncoder::FakeEncoding(kMockReturnEncodedBytes)));
-  Encode();
-  EXPECT_EQ(kMockReturnEncodedBytes, encoded_info_.encoded_bytes);
-
-  // Go back to noise again, and verify that a SID frame is emitted.
-  EXPECT_CALL(*mock_vad_, VoiceActivity(_, _, _))
-      .WillOnce(Return(Vad::kPassive));
-  Encode();
-  EXPECT_EQ(kCngPayloadType, encoded_info_.payload_type);
-  EXPECT_EQ(static_cast<size_t>(num_cng_coefficients) + 1,
-            encoded_info_.encoded_bytes);
-}
-
-// Resetting the CNG should reset both the VAD and the encoder.
-TEST_F(AudioEncoderCngTest, Reset) {
-  CreateCng(MakeCngConfig());
-  EXPECT_CALL(*mock_encoder_, Reset()).Times(1);
-  EXPECT_CALL(*mock_vad_, Reset()).Times(1);
-  cng_->Reset();
-}
-
-#if GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
-
-// This test fixture tests various error conditions that makes the
-// AudioEncoderCng die via CHECKs.
-class AudioEncoderCngDeathTest : public AudioEncoderCngTest {
- protected:
-  AudioEncoderCngDeathTest() : AudioEncoderCngTest() {
-    EXPECT_CALL(*mock_vad_, Die()).Times(1);
-    delete mock_vad_;
-    mock_vad_ = nullptr;
-  }
-
-  // Override AudioEncoderCngTest::TearDown, since that one expects a call to
-  // the destructor of |mock_vad_|. In this case, that object is already
-  // deleted.
-  void TearDown() override {
-    cng_.reset();
-  }
-
-  AudioEncoderCng::Config MakeCngConfig() {
-    // Don't provide a Vad mock object, since it would leak when the test dies.
-    auto config = AudioEncoderCngTest::MakeCngConfig();
-    config.vad = nullptr;
-    return config;
-  }
-
-  void TryWrongNumCoefficients(int num) {
-    EXPECT_DEATH(
-        [&] {
-          auto config = MakeCngConfig();
-          config.num_cng_coefficients = num;
-          CreateCng(std::move(config));
-        }(),
-        "Invalid configuration");
-  }
-};
-
-TEST_F(AudioEncoderCngDeathTest, WrongFrameSize) {
-  CreateCng(MakeCngConfig());
-  num_audio_samples_10ms_ *= 2;  // 20 ms frame.
-  EXPECT_DEATH(Encode(), "");
-  num_audio_samples_10ms_ = 0;  // Zero samples.
-  EXPECT_DEATH(Encode(), "");
-}
-
-TEST_F(AudioEncoderCngDeathTest, WrongNumCoefficientsA) {
-  TryWrongNumCoefficients(-1);
-}
-
-TEST_F(AudioEncoderCngDeathTest, WrongNumCoefficientsB) {
-  TryWrongNumCoefficients(0);
-}
-
-TEST_F(AudioEncoderCngDeathTest, WrongNumCoefficientsC) {
-  TryWrongNumCoefficients(13);
-}
-
-TEST_F(AudioEncoderCngDeathTest, NullSpeechEncoder) {
-  auto config = MakeCngConfig();
-  config.speech_encoder = nullptr;
-  EXPECT_DEATH(CreateCng(std::move(config)), "");
-}
-
-TEST_F(AudioEncoderCngDeathTest, StereoEncoder) {
-  EXPECT_CALL(*mock_encoder_, NumChannels()).WillRepeatedly(Return(2));
-  EXPECT_DEATH(CreateCng(MakeCngConfig()), "Invalid configuration");
-}
-
-TEST_F(AudioEncoderCngDeathTest, StereoConfig) {
-  EXPECT_DEATH(
-      [&] {
-        auto config = MakeCngConfig();
-        config.num_channels = 2;
-        CreateCng(std::move(config));
-      }(),
-      "Invalid configuration");
-}
-
-TEST_F(AudioEncoderCngDeathTest, EncoderFrameSizeTooLarge) {
-  CreateCng(MakeCngConfig());
-  EXPECT_CALL(*mock_encoder_, Num10MsFramesInNextPacket())
-      .WillRepeatedly(Return(7U));
-  for (int i = 0; i < 6; ++i)
-    Encode();
-  EXPECT_DEATH(Encode(),
-               "Frame size cannot be larger than 60 ms when using VAD/CNG.");
-}
-
-#endif  // GTEST_HAS_DEATH_TEST
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/codecs/cng/cng_unittest.cc b/modules/audio_coding/codecs/cng/cng_unittest.cc
deleted file mode 100644
index 3835e93..0000000
--- a/modules/audio_coding/codecs/cng/cng_unittest.cc
+++ /dev/null
@@ -1,241 +0,0 @@
-/*
- *  Copyright (c) 2011 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 <memory>
-#include <string>
-
-#include "webrtc/modules/audio_coding/codecs/cng/webrtc_cng.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/testsupport/fileutils.h"
-
-namespace webrtc {
-
-enum {
-  kSidShortIntervalUpdate = 1,
-  kSidNormalIntervalUpdate = 100,
-  kSidLongIntervalUpdate = 10000
-};
-
-enum : size_t {
-  kCNGNumParamsLow = 0,
-  kCNGNumParamsNormal = 8,
-  kCNGNumParamsHigh = WEBRTC_CNG_MAX_LPC_ORDER,
-  kCNGNumParamsTooHigh = WEBRTC_CNG_MAX_LPC_ORDER + 1
-};
-
-enum {
-  kNoSid,
-  kForceSid
-};
-
-class CngTest : public ::testing::Test {
- protected:
-  virtual void SetUp();
-
-  void TestCngEncode(int sample_rate_hz, int quality);
-
-  int16_t speech_data_[640];  // Max size of CNG internal buffers.
-};
-
-void CngTest::SetUp() {
-  FILE* input_file;
-  const std::string file_name =
-        webrtc::test::ResourcePath("audio_coding/testfile32kHz", "pcm");
-  input_file = fopen(file_name.c_str(), "rb");
-  ASSERT_TRUE(input_file != NULL);
-  ASSERT_EQ(640, static_cast<int32_t>(fread(speech_data_, sizeof(int16_t),
-                                             640, input_file)));
-  fclose(input_file);
-  input_file = NULL;
-}
-
-void CngTest::TestCngEncode(int sample_rate_hz, int quality) {
-  const size_t num_samples_10ms = rtc::CheckedDivExact(sample_rate_hz, 100);
-  rtc::Buffer sid_data;
-
-  ComfortNoiseEncoder cng_encoder(sample_rate_hz, kSidNormalIntervalUpdate,
-                                  quality);
-  EXPECT_EQ(0U, cng_encoder.Encode(rtc::ArrayView<const int16_t>(
-                                       speech_data_, num_samples_10ms),
-                                   kNoSid, &sid_data));
-  EXPECT_EQ(static_cast<size_t>(quality + 1),
-            cng_encoder.Encode(
-                rtc::ArrayView<const int16_t>(speech_data_, num_samples_10ms),
-                kForceSid, &sid_data));
-}
-
-#if GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
-// Create CNG encoder, init with faulty values, free CNG encoder.
-TEST_F(CngTest, CngInitFail) {
-  // Call with too few parameters.
-  EXPECT_DEATH({ ComfortNoiseEncoder(8000, kSidNormalIntervalUpdate,
-                                     kCNGNumParamsLow); }, "");
-  // Call with too many parameters.
-  EXPECT_DEATH({ ComfortNoiseEncoder(8000, kSidNormalIntervalUpdate,
-                                     kCNGNumParamsTooHigh); }, "");
-}
-
-// Encode Cng with too long input vector.
-TEST_F(CngTest, CngEncodeTooLong) {
-  rtc::Buffer sid_data;
-
-  // Create encoder.
-  ComfortNoiseEncoder cng_encoder(8000, kSidNormalIntervalUpdate,
-                                  kCNGNumParamsNormal);
-  // Run encoder with too much data.
-  EXPECT_DEATH(
-      cng_encoder.Encode(rtc::ArrayView<const int16_t>(speech_data_, 641),
-                         kNoSid, &sid_data),
-      "");
-}
-#endif  // GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
-
-TEST_F(CngTest, CngEncode8000) {
-  TestCngEncode(8000, kCNGNumParamsNormal);
-}
-
-TEST_F(CngTest, CngEncode16000) {
-  TestCngEncode(16000, kCNGNumParamsNormal);
-}
-
-TEST_F(CngTest, CngEncode32000) {
-  TestCngEncode(32000, kCNGNumParamsHigh);
-}
-
-TEST_F(CngTest, CngEncode48000) {
-  TestCngEncode(48000, kCNGNumParamsNormal);
-}
-
-TEST_F(CngTest, CngEncode64000) {
-  TestCngEncode(64000, kCNGNumParamsNormal);
-}
-
-// Update SID parameters, for both 9 and 16 parameters.
-TEST_F(CngTest, CngUpdateSid) {
-  rtc::Buffer sid_data;
-
-  // Create and initialize encoder and decoder.
-  ComfortNoiseEncoder cng_encoder(16000, kSidNormalIntervalUpdate,
-                                  kCNGNumParamsNormal);
-  ComfortNoiseDecoder cng_decoder;
-
-  // Run normal Encode and UpdateSid.
-  EXPECT_EQ(kCNGNumParamsNormal + 1,
-            cng_encoder.Encode(rtc::ArrayView<const int16_t>(speech_data_, 160),
-                               kForceSid, &sid_data));
-  cng_decoder.UpdateSid(sid_data);
-
-  // Reinit with new length.
-  cng_encoder.Reset(16000, kSidNormalIntervalUpdate, kCNGNumParamsHigh);
-  cng_decoder.Reset();
-
-  // Expect 0 because of unstable parameters after switching length.
-  EXPECT_EQ(0U,
-            cng_encoder.Encode(rtc::ArrayView<const int16_t>(speech_data_, 160),
-                               kForceSid, &sid_data));
-  EXPECT_EQ(
-      kCNGNumParamsHigh + 1,
-      cng_encoder.Encode(rtc::ArrayView<const int16_t>(speech_data_ + 160, 160),
-                         kForceSid, &sid_data));
-  cng_decoder.UpdateSid(
-      rtc::ArrayView<const uint8_t>(sid_data.data(), kCNGNumParamsNormal + 1));
-}
-
-// Update SID parameters, with wrong parameters or without calling decode.
-TEST_F(CngTest, CngUpdateSidErroneous) {
-  rtc::Buffer sid_data;
-
-  // Encode.
-  ComfortNoiseEncoder cng_encoder(16000, kSidNormalIntervalUpdate,
-                                  kCNGNumParamsNormal);
-  ComfortNoiseDecoder cng_decoder;
-  EXPECT_EQ(kCNGNumParamsNormal + 1,
-            cng_encoder.Encode(rtc::ArrayView<const int16_t>(speech_data_, 160),
-                               kForceSid, &sid_data));
-
-  // First run with valid parameters, then with too many CNG parameters.
-  // The function will operate correctly by only reading the maximum number of
-  // parameters, skipping the extra.
-  EXPECT_EQ(kCNGNumParamsNormal + 1, sid_data.size());
-  cng_decoder.UpdateSid(sid_data);
-
-  // Make sure the input buffer is large enough. Since Encode() appends data, we
-  // need to set the size manually only afterwards, or the buffer will be bigger
-  // than anticipated.
-  sid_data.SetSize(kCNGNumParamsTooHigh + 1);
-  cng_decoder.UpdateSid(sid_data);
-}
-
-// Test to generate cng data, by forcing SID. Both normal and faulty condition.
-TEST_F(CngTest, CngGenerate) {
-  rtc::Buffer sid_data;
-  int16_t out_data[640];
-
-  // Create and initialize encoder and decoder.
-  ComfortNoiseEncoder cng_encoder(16000, kSidNormalIntervalUpdate,
-                                  kCNGNumParamsNormal);
-  ComfortNoiseDecoder cng_decoder;
-
-  // Normal Encode.
-  EXPECT_EQ(kCNGNumParamsNormal + 1,
-            cng_encoder.Encode(rtc::ArrayView<const int16_t>(speech_data_, 160),
-                               kForceSid, &sid_data));
-
-  // Normal UpdateSid.
-  cng_decoder.UpdateSid(sid_data);
-
-  // Two normal Generate, one with new_period.
-  EXPECT_TRUE(cng_decoder.Generate(rtc::ArrayView<int16_t>(out_data, 640), 1));
-  EXPECT_TRUE(cng_decoder.Generate(rtc::ArrayView<int16_t>(out_data, 640), 0));
-
-  // Call Genereate with too much data.
-  EXPECT_FALSE(cng_decoder.Generate(rtc::ArrayView<int16_t>(out_data, 641), 0));
-}
-
-// Test automatic SID.
-TEST_F(CngTest, CngAutoSid) {
-  rtc::Buffer sid_data;
-
-  // Create and initialize encoder and decoder.
-  ComfortNoiseEncoder cng_encoder(16000, kSidNormalIntervalUpdate,
-                                  kCNGNumParamsNormal);
-  ComfortNoiseDecoder cng_decoder;
-
-  // Normal Encode, 100 msec, where no SID data should be generated.
-  for (int i = 0; i < 10; i++) {
-    EXPECT_EQ(0U, cng_encoder.Encode(
-        rtc::ArrayView<const int16_t>(speech_data_, 160), kNoSid, &sid_data));
-  }
-
-  // We have reached 100 msec, and SID data should be generated.
-  EXPECT_EQ(kCNGNumParamsNormal + 1, cng_encoder.Encode(
-      rtc::ArrayView<const int16_t>(speech_data_, 160), kNoSid, &sid_data));
-}
-
-// Test automatic SID, with very short interval.
-TEST_F(CngTest, CngAutoSidShort) {
-  rtc::Buffer sid_data;
-
-  // Create and initialize encoder and decoder.
-  ComfortNoiseEncoder cng_encoder(16000, kSidShortIntervalUpdate,
-                                  kCNGNumParamsNormal);
-  ComfortNoiseDecoder cng_decoder;
-
-  // First call will never generate SID, unless forced to.
-  EXPECT_EQ(0U, cng_encoder.Encode(
-      rtc::ArrayView<const int16_t>(speech_data_, 160), kNoSid, &sid_data));
-
-  // Normal Encode, 100 msec, SID data should be generated all the time.
-  for (int i = 0; i < 10; i++) {
-    EXPECT_EQ(kCNGNumParamsNormal + 1, cng_encoder.Encode(
-        rtc::ArrayView<const int16_t>(speech_data_, 160), kNoSid, &sid_data));
-  }
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/codecs/cng/webrtc_cng.cc b/modules/audio_coding/codecs/cng/webrtc_cng.cc
deleted file mode 100644
index b891d84..0000000
--- a/modules/audio_coding/codecs/cng/webrtc_cng.cc
+++ /dev/null
@@ -1,444 +0,0 @@
-/*
- *  Copyright (c) 2012 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/codecs/cng/webrtc_cng.h"
-
-#include <algorithm>
-
-#include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
-#include "webrtc/rtc_base/safe_conversions.h"
-
-namespace webrtc {
-
-namespace {
-
-const size_t kCngMaxOutsizeOrder = 640;
-
-// TODO(ossu): Rename the left-over WebRtcCng according to style guide.
-void WebRtcCng_K2a16(int16_t* k, int useOrder, int16_t* a);
-
-const int32_t WebRtcCng_kDbov[94] = {
-  1081109975, 858756178, 682134279, 541838517, 430397633, 341876992,
-  271562548,  215709799, 171344384, 136103682, 108110997, 85875618,
-  68213428,   54183852,  43039763,  34187699,  27156255,  21570980,
-  17134438,   13610368,  10811100,  8587562,   6821343,   5418385,
-  4303976,    3418770,   2715625,   2157098,   1713444,   1361037,
-  1081110,    858756,    682134,    541839,    430398,    341877,
-  271563,     215710,    171344,    136104,    108111,    85876,
-  68213,      54184,     43040,     34188,     27156,     21571,
-  17134,      13610,     10811,     8588,      6821,      5418,
-  4304,       3419,      2716,      2157,      1713,      1361,
-  1081,       859,       682,       542,       430,       342,
-  272,        216,       171,       136,       108,       86,
-  68,         54,        43,        34,        27,        22,
-  17,         14,        11,        9,         7,         5,
-  4,          3,         3,         2,         2,         1,
-  1,          1,         1,         1
-};
-
-const int16_t WebRtcCng_kCorrWindow[WEBRTC_CNG_MAX_LPC_ORDER] = {
-  32702, 32636, 32570, 32505, 32439, 32374,
-  32309, 32244, 32179, 32114, 32049, 31985
-};
-
-}  // namespace
-
-ComfortNoiseDecoder::ComfortNoiseDecoder() {
-  /* Needed to get the right function pointers in SPLIB. */
-  WebRtcSpl_Init();
-  Reset();
-}
-
-void ComfortNoiseDecoder::Reset() {
-  dec_seed_ = 7777;  /* For debugging only. */
-  dec_target_energy_ = 0;
-  dec_used_energy_ = 0;
-  for (auto& c : dec_target_reflCoefs_)
-    c = 0;
-  for (auto& c : dec_used_reflCoefs_)
-    c = 0;
-  for (auto& c : dec_filtstate_)
-    c = 0;
-  for (auto& c : dec_filtstateLow_)
-    c = 0;
-  dec_order_ = 5;
-  dec_target_scale_factor_ = 0;
-  dec_used_scale_factor_ = 0;
-}
-
-void ComfortNoiseDecoder::UpdateSid(rtc::ArrayView<const uint8_t> sid) {
-  int16_t refCs[WEBRTC_CNG_MAX_LPC_ORDER];
-  int32_t targetEnergy;
-  size_t length = sid.size();
-  /* Throw away reflection coefficients of higher order than we can handle. */
-  if (length > (WEBRTC_CNG_MAX_LPC_ORDER + 1))
-    length = WEBRTC_CNG_MAX_LPC_ORDER + 1;
-
-  dec_order_ = static_cast<uint16_t>(length - 1);
-
-  uint8_t sid0 = std::min<uint8_t>(sid[0], 93);
-  targetEnergy = WebRtcCng_kDbov[sid0];
-  /* Take down target energy to 75%. */
-  targetEnergy = targetEnergy >> 1;
-  targetEnergy += targetEnergy >> 2;
-
-  dec_target_energy_ = targetEnergy;
-
-  /* Reconstruct coeffs with tweak for WebRtc implementation of RFC3389. */
-  if (dec_order_ == WEBRTC_CNG_MAX_LPC_ORDER) {
-    for (size_t i = 0; i < (dec_order_); i++) {
-      refCs[i] = sid[i + 1] << 8; /* Q7 to Q15*/
-      dec_target_reflCoefs_[i] = refCs[i];
-    }
-  } else {
-    for (size_t i = 0; i < (dec_order_); i++) {
-      refCs[i] = (sid[i + 1] - 127) << 8; /* Q7 to Q15. */
-      dec_target_reflCoefs_[i] = refCs[i];
-    }
-  }
-
-  for (size_t i = (dec_order_); i < WEBRTC_CNG_MAX_LPC_ORDER; i++) {
-    refCs[i] = 0;
-    dec_target_reflCoefs_[i] = refCs[i];
-  }
-}
-
-bool ComfortNoiseDecoder::Generate(rtc::ArrayView<int16_t> out_data,
-                                   bool new_period) {
-  int16_t excitation[kCngMaxOutsizeOrder];
-  int16_t low[kCngMaxOutsizeOrder];
-  int16_t lpPoly[WEBRTC_CNG_MAX_LPC_ORDER + 1];
-  int16_t ReflBetaStd = 26214;  /* 0.8 in q15. */
-  int16_t ReflBetaCompStd = 6553;  /* 0.2 in q15. */
-  int16_t ReflBetaNewP = 19661;  /* 0.6 in q15. */
-  int16_t ReflBetaCompNewP = 13107;  /* 0.4 in q15. */
-  int16_t Beta, BetaC;  /* These are in Q15. */
-  int32_t targetEnergy;
-  int16_t En;
-  int16_t temp16;
-  const size_t num_samples = out_data.size();
-
-  if (num_samples > kCngMaxOutsizeOrder) {
-    return false;
-  }
-
-  if (new_period) {
-    dec_used_scale_factor_ = dec_target_scale_factor_;
-    Beta = ReflBetaNewP;
-    BetaC = ReflBetaCompNewP;
-  } else {
-    Beta = ReflBetaStd;
-    BetaC = ReflBetaCompStd;
-  }
-
-  /* Calculate new scale factor in Q13 */
-  dec_used_scale_factor_ =
-      rtc::checked_cast<int16_t>(
-          WEBRTC_SPL_MUL_16_16_RSFT(dec_used_scale_factor_, Beta >> 2, 13) +
-          WEBRTC_SPL_MUL_16_16_RSFT(dec_target_scale_factor_, BetaC >> 2, 13));
-
-  dec_used_energy_  = dec_used_energy_ >> 1;
-  dec_used_energy_ += dec_target_energy_ >> 1;
-
-  /* Do the same for the reflection coeffs, albeit in Q15. */
-  for (size_t i = 0; i < WEBRTC_CNG_MAX_LPC_ORDER; i++) {
-    dec_used_reflCoefs_[i] = (int16_t) WEBRTC_SPL_MUL_16_16_RSFT(
-        dec_used_reflCoefs_[i], Beta, 15);
-    dec_used_reflCoefs_[i] += (int16_t) WEBRTC_SPL_MUL_16_16_RSFT(
-        dec_target_reflCoefs_[i], BetaC, 15);
-  }
-
-  /* Compute the polynomial coefficients. */
-  WebRtcCng_K2a16(dec_used_reflCoefs_, WEBRTC_CNG_MAX_LPC_ORDER, lpPoly);
-
-
-  targetEnergy = dec_used_energy_;
-
-  /* Calculate scaling factor based on filter energy. */
-  En = 8192;  /* 1.0 in Q13. */
-  for (size_t i = 0; i < (WEBRTC_CNG_MAX_LPC_ORDER); i++) {
-    /* Floating point value for reference.
-       E *= 1.0 - (dec_used_reflCoefs_[i] / 32768.0) *
-       (dec_used_reflCoefs_[i] / 32768.0);
-     */
-
-    /* Same in fixed point. */
-    /* K(i).^2 in Q15. */
-    temp16 = (int16_t) WEBRTC_SPL_MUL_16_16_RSFT(
-        dec_used_reflCoefs_[i], dec_used_reflCoefs_[i], 15);
-    /* 1 - K(i).^2 in Q15. */
-    temp16 = 0x7fff - temp16;
-    En = (int16_t) WEBRTC_SPL_MUL_16_16_RSFT(En, temp16, 15);
-  }
-
-  /* float scaling= sqrt(E * dec_target_energy_ / (1 << 24)); */
-
-  /* Calculate sqrt(En * target_energy / excitation energy) */
-  targetEnergy = WebRtcSpl_Sqrt(dec_used_energy_);
-
-  En = (int16_t) WebRtcSpl_Sqrt(En) << 6;
-  En = (En * 3) >> 1;  /* 1.5 estimates sqrt(2). */
-  dec_used_scale_factor_ = (int16_t)((En * targetEnergy) >> 12);
-
-  /* Generate excitation. */
-  /* Excitation energy per sample is 2.^24 - Q13 N(0,1). */
-  for (size_t i = 0; i < num_samples; i++) {
-    excitation[i] = WebRtcSpl_RandN(&dec_seed_) >> 1;
-  }
-
-  /* Scale to correct energy. */
-  WebRtcSpl_ScaleVector(excitation, excitation, dec_used_scale_factor_,
-                        num_samples, 13);
-
-  /* |lpPoly| - Coefficients in Q12.
-   * |excitation| - Speech samples.
-   * |nst->dec_filtstate| - State preservation.
-   * |out_data| - Filtered speech samples. */
-  WebRtcSpl_FilterAR(lpPoly, WEBRTC_CNG_MAX_LPC_ORDER + 1, excitation,
-                     num_samples, dec_filtstate_, WEBRTC_CNG_MAX_LPC_ORDER,
-                     dec_filtstateLow_, WEBRTC_CNG_MAX_LPC_ORDER,
-                     out_data.data(), low, num_samples);
-
-  return true;
-}
-
-ComfortNoiseEncoder::ComfortNoiseEncoder(int fs, int interval, int quality)
-    : enc_nrOfCoefs_(quality),
-      enc_sampfreq_(fs),
-      enc_interval_(interval),
-      enc_msSinceSid_(0),
-      enc_Energy_(0),
-      enc_reflCoefs_{0},
-      enc_corrVector_{0},
-      enc_seed_(7777)  /* For debugging only. */ {
-  RTC_CHECK_GT(quality, 0);
-  RTC_CHECK_LE(quality, WEBRTC_CNG_MAX_LPC_ORDER);
-  /* Needed to get the right function pointers in SPLIB. */
-  WebRtcSpl_Init();
-}
-
-void ComfortNoiseEncoder::Reset(int fs, int interval, int quality) {
-  RTC_CHECK_GT(quality, 0);
-  RTC_CHECK_LE(quality, WEBRTC_CNG_MAX_LPC_ORDER);
-  enc_nrOfCoefs_ = quality;
-  enc_sampfreq_ = fs;
-  enc_interval_ = interval;
-  enc_msSinceSid_ = 0;
-  enc_Energy_ = 0;
-  for (auto& c : enc_reflCoefs_)
-    c = 0;
-  for (auto& c : enc_corrVector_)
-    c = 0;
-  enc_seed_ = 7777;  /* For debugging only. */
-}
-
-size_t ComfortNoiseEncoder::Encode(rtc::ArrayView<const int16_t> speech,
-                                   bool force_sid,
-                                   rtc::Buffer* output) {
-  int16_t arCoefs[WEBRTC_CNG_MAX_LPC_ORDER + 1];
-  int32_t corrVector[WEBRTC_CNG_MAX_LPC_ORDER + 1];
-  int16_t refCs[WEBRTC_CNG_MAX_LPC_ORDER + 1];
-  int16_t hanningW[kCngMaxOutsizeOrder];
-  int16_t ReflBeta = 19661;     /* 0.6 in q15. */
-  int16_t ReflBetaComp = 13107; /* 0.4 in q15. */
-  int32_t outEnergy;
-  int outShifts;
-  size_t i;
-  int stab;
-  int acorrScale;
-  size_t index;
-  size_t ind, factor;
-  int32_t* bptr;
-  int32_t blo, bhi;
-  int16_t negate;
-  const int16_t* aptr;
-  int16_t speechBuf[kCngMaxOutsizeOrder];
-
-  const size_t num_samples = speech.size();
-  RTC_CHECK_LE(num_samples, kCngMaxOutsizeOrder);
-
-  for (i = 0; i < num_samples; i++) {
-    speechBuf[i] = speech[i];
-  }
-
-  factor = num_samples;
-
-  /* Calculate energy and a coefficients. */
-  outEnergy = WebRtcSpl_Energy(speechBuf, num_samples, &outShifts);
-  while (outShifts > 0) {
-    /* We can only do 5 shifts without destroying accuracy in
-     * division factor. */
-    if (outShifts > 5) {
-      outEnergy <<= (outShifts - 5);
-      outShifts = 5;
-    } else {
-      factor /= 2;
-      outShifts--;
-    }
-  }
-  outEnergy = WebRtcSpl_DivW32W16(outEnergy, (int16_t)factor);
-
-  if (outEnergy > 1) {
-    /* Create Hanning Window. */
-    WebRtcSpl_GetHanningWindow(hanningW, num_samples / 2);
-    for (i = 0; i < (num_samples / 2); i++)
-      hanningW[num_samples - i - 1] = hanningW[i];
-
-    WebRtcSpl_ElementwiseVectorMult(speechBuf, hanningW, speechBuf, num_samples,
-                                    14);
-
-    WebRtcSpl_AutoCorrelation(speechBuf, num_samples, enc_nrOfCoefs_,
-                              corrVector, &acorrScale);
-
-    if (*corrVector == 0)
-      *corrVector = WEBRTC_SPL_WORD16_MAX;
-
-    /* Adds the bandwidth expansion. */
-    aptr = WebRtcCng_kCorrWindow;
-    bptr = corrVector;
-
-    /* (zzz) lpc16_1 = 17+1+820+2+2 = 842 (ordo2=700). */
-    for (ind = 0; ind < enc_nrOfCoefs_; ind++) {
-      /* The below code multiplies the 16 b corrWindow values (Q15) with
-       * the 32 b corrvector (Q0) and shifts the result down 15 steps. */
-      negate = *bptr < 0;
-      if (negate)
-        *bptr = -*bptr;
-
-      blo = (int32_t) * aptr * (*bptr & 0xffff);
-      bhi = ((blo >> 16) & 0xffff)
-          + ((int32_t)(*aptr++) * ((*bptr >> 16) & 0xffff));
-      blo = (blo & 0xffff) | ((bhi & 0xffff) << 16);
-
-      *bptr = (((bhi >> 16) & 0x7fff) << 17) | ((uint32_t) blo >> 15);
-      if (negate)
-        *bptr = -*bptr;
-      bptr++;
-    }
-    /* End of bandwidth expansion. */
-
-    stab = WebRtcSpl_LevinsonDurbin(corrVector, arCoefs, refCs,
-                                    enc_nrOfCoefs_);
-
-    if (!stab) {
-      /* Disregard from this frame */
-      return 0;
-    }
-
-  } else {
-    for (i = 0; i < enc_nrOfCoefs_; i++)
-      refCs[i] = 0;
-  }
-
-  if (force_sid) {
-    /* Read instantaneous values instead of averaged. */
-    for (i = 0; i < enc_nrOfCoefs_; i++)
-      enc_reflCoefs_[i] = refCs[i];
-    enc_Energy_ = outEnergy;
-  } else {
-    /* Average history with new values. */
-    for (i = 0; i < enc_nrOfCoefs_; i++) {
-      enc_reflCoefs_[i] = (int16_t) WEBRTC_SPL_MUL_16_16_RSFT(
-          enc_reflCoefs_[i], ReflBeta, 15);
-      enc_reflCoefs_[i] +=
-          (int16_t) WEBRTC_SPL_MUL_16_16_RSFT(refCs[i], ReflBetaComp, 15);
-    }
-    enc_Energy_ =
-        (outEnergy >> 2) + (enc_Energy_ >> 1) + (enc_Energy_ >> 2);
-  }
-
-  if (enc_Energy_ < 1) {
-    enc_Energy_ = 1;
-  }
-
-  if ((enc_msSinceSid_ > (enc_interval_ - 1)) || force_sid) {
-    /* Search for best dbov value. */
-    index = 0;
-    for (i = 1; i < 93; i++) {
-      /* Always round downwards. */
-      if ((enc_Energy_ - WebRtcCng_kDbov[i]) > 0) {
-        index = i;
-        break;
-      }
-    }
-    if ((i == 93) && (index == 0))
-      index = 94;
-
-    const size_t output_coefs = enc_nrOfCoefs_ + 1;
-    output->AppendData(output_coefs, [&] (rtc::ArrayView<uint8_t> output) {
-        output[0] = (uint8_t)index;
-
-        /* Quantize coefficients with tweak for WebRtc implementation of
-         * RFC3389. */
-        if (enc_nrOfCoefs_ == WEBRTC_CNG_MAX_LPC_ORDER) {
-          for (i = 0; i < enc_nrOfCoefs_; i++) {
-            /* Q15 to Q7 with rounding. */
-            output[i + 1] = ((enc_reflCoefs_[i] + 128) >> 8);
-          }
-        } else {
-          for (i = 0; i < enc_nrOfCoefs_; i++) {
-            /* Q15 to Q7 with rounding. */
-            output[i + 1] = (127 + ((enc_reflCoefs_[i] + 128) >> 8));
-          }
-        }
-
-        return output_coefs;
-      });
-
-    enc_msSinceSid_ =
-        static_cast<int16_t>((1000 * num_samples) / enc_sampfreq_);
-    return output_coefs;
-  } else {
-    enc_msSinceSid_ +=
-        static_cast<int16_t>((1000 * num_samples) / enc_sampfreq_);
-    return 0;
-  }
-}
-
-namespace {
-/* Values in |k| are Q15, and |a| Q12. */
-void WebRtcCng_K2a16(int16_t* k, int useOrder, int16_t* a) {
-  int16_t any[WEBRTC_SPL_MAX_LPC_ORDER + 1];
-  int16_t* aptr;
-  int16_t* aptr2;
-  int16_t* anyptr;
-  const int16_t* kptr;
-  int m, i;
-
-  kptr = k;
-  *a = 4096; /* i.e., (Word16_MAX >> 3) + 1 */
-  *any = *a;
-  a[1] = (*k + 4) >> 3;
-  for (m = 1; m < useOrder; m++) {
-    kptr++;
-    aptr = a;
-    aptr++;
-    aptr2 = &a[m];
-    anyptr = any;
-    anyptr++;
-
-    any[m + 1] = (*kptr + 4) >> 3;
-    for (i = 0; i < m; i++) {
-      *anyptr++ =
-          (*aptr++) +
-          (int16_t)((((int32_t)(*aptr2--) * (int32_t)*kptr) + 16384) >> 15);
-    }
-
-    aptr = a;
-    anyptr = any;
-    for (i = 0; i < (m + 2); i++) {
-      *aptr++ = *anyptr++;
-    }
-  }
-}
-
-}  // namespace
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/codecs/cng/webrtc_cng.h b/modules/audio_coding/codecs/cng/webrtc_cng.h
deleted file mode 100644
index 98231e7..0000000
--- a/modules/audio_coding/codecs/cng/webrtc_cng.h
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- *  Copyright (c) 2012 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_CODECS_CNG_WEBRTC_CNG_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_CNG_WEBRTC_CNG_H_
-
-#include <cstddef>
-
-#include "webrtc/api/array_view.h"
-#include "webrtc/rtc_base/buffer.h"
-#include "webrtc/typedefs.h"
-
-#define WEBRTC_CNG_MAX_LPC_ORDER 12
-
-namespace webrtc {
-
-class ComfortNoiseDecoder {
- public:
-  ComfortNoiseDecoder();
-  ~ComfortNoiseDecoder() = default;
-
-  ComfortNoiseDecoder(const ComfortNoiseDecoder&) = delete;
-  ComfortNoiseDecoder& operator=(const ComfortNoiseDecoder&) = delete;
-
-  void Reset();
-
-  // Updates the CN state when a new SID packet arrives.
-  // |sid| is a view of the SID packet without the headers.
-  void UpdateSid(rtc::ArrayView<const uint8_t> sid);
-
-  // Generates comfort noise.
-  // |out_data| will be filled with samples - its size determines the number of
-  // samples generated. When |new_period| is true, CNG history will be reset
-  // before any audio is generated.  Returns |false| if outData is too large -
-  // currently 640 bytes (equalling 10ms at 64kHz).
-  // TODO(ossu): Specify better limits for the size of out_data. Either let it
-  //             be unbounded or limit to 10ms in the current sample rate.
-  bool Generate(rtc::ArrayView<int16_t> out_data, bool new_period);
-
- private:
-  uint32_t dec_seed_;
-  int32_t dec_target_energy_;
-  int32_t dec_used_energy_;
-  int16_t dec_target_reflCoefs_[WEBRTC_CNG_MAX_LPC_ORDER + 1];
-  int16_t dec_used_reflCoefs_[WEBRTC_CNG_MAX_LPC_ORDER + 1];
-  int16_t dec_filtstate_[WEBRTC_CNG_MAX_LPC_ORDER + 1];
-  int16_t dec_filtstateLow_[WEBRTC_CNG_MAX_LPC_ORDER + 1];
-  uint16_t dec_order_;
-  int16_t dec_target_scale_factor_;  /* Q29 */
-  int16_t dec_used_scale_factor_;  /* Q29 */
-};
-
-class ComfortNoiseEncoder {
- public:
-  // Creates a comfort noise encoder.
-  // |fs| selects sample rate: 8000 for narrowband or 16000 for wideband.
-  // |interval| sets the interval at which to generate SID data (in ms).
-  // |quality| selects the number of refl. coeffs. Maximum allowed is 12.
-  ComfortNoiseEncoder(int fs, int interval, int quality);
-  ~ComfortNoiseEncoder() = default;
-
-  ComfortNoiseEncoder(const ComfortNoiseEncoder&) = delete;
-  ComfortNoiseEncoder& operator=(const ComfortNoiseEncoder&) = delete;
-
-  // Resets the comfort noise encoder to its initial state.
-  // Parameters are set as during construction.
-  void Reset(int fs, int interval, int quality);
-
-  // Analyzes background noise from |speech| and appends coefficients to
-  // |output|.  Returns the number of coefficients generated.  If |force_sid| is
-  // true, a SID frame is forced and the internal sid interval counter is reset.
-  // Will fail if the input size is too large (> 640 samples, see
-  // ComfortNoiseDecoder::Generate).
-  size_t Encode(rtc::ArrayView<const int16_t> speech,
-                bool force_sid,
-                rtc::Buffer* output);
-
- private:
-  size_t enc_nrOfCoefs_;
-  int enc_sampfreq_;
-  int16_t enc_interval_;
-  int16_t enc_msSinceSid_;
-  int32_t enc_Energy_;
-  int16_t enc_reflCoefs_[WEBRTC_CNG_MAX_LPC_ORDER + 1];
-  int32_t enc_corrVector_[WEBRTC_CNG_MAX_LPC_ORDER + 1];
-  uint32_t enc_seed_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_CODING_CODECS_CNG_WEBRTC_CNG_H_
diff --git a/modules/audio_coding/codecs/g711/OWNERS b/modules/audio_coding/codecs/g711/OWNERS
deleted file mode 100644
index e69de29..0000000
--- a/modules/audio_coding/codecs/g711/OWNERS
+++ /dev/null
diff --git a/modules/audio_coding/codecs/g711/audio_decoder_pcm.cc b/modules/audio_coding/codecs/g711/audio_decoder_pcm.cc
deleted file mode 100644
index fd285a7..0000000
--- a/modules/audio_coding/codecs/g711/audio_decoder_pcm.cc
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- *  Copyright (c) 2015 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/codecs/g711/audio_decoder_pcm.h"
-
-#include "webrtc/modules/audio_coding/codecs/legacy_encoded_audio_frame.h"
-#include "webrtc/modules/audio_coding/codecs/g711/g711_interface.h"
-
-namespace webrtc {
-
-void AudioDecoderPcmU::Reset() {}
-
-std::vector<AudioDecoder::ParseResult> AudioDecoderPcmU::ParsePayload(
-    rtc::Buffer&& payload,
-    uint32_t timestamp) {
-  return LegacyEncodedAudioFrame::SplitBySamples(
-      this, std::move(payload), timestamp, 8 * num_channels_, 8);
-}
-
-int AudioDecoderPcmU::SampleRateHz() const {
-  return 8000;
-}
-
-size_t AudioDecoderPcmU::Channels() const {
-  return num_channels_;
-}
-
-int AudioDecoderPcmU::DecodeInternal(const uint8_t* encoded,
-                                     size_t encoded_len,
-                                     int sample_rate_hz,
-                                     int16_t* decoded,
-                                     SpeechType* speech_type) {
-  RTC_DCHECK_EQ(SampleRateHz(), sample_rate_hz);
-  int16_t temp_type = 1;  // Default is speech.
-  size_t ret = WebRtcG711_DecodeU(encoded, encoded_len, decoded, &temp_type);
-  *speech_type = ConvertSpeechType(temp_type);
-  return static_cast<int>(ret);
-}
-
-int AudioDecoderPcmU::PacketDuration(const uint8_t* encoded,
-                                     size_t encoded_len) const {
-  // One encoded byte per sample per channel.
-  return static_cast<int>(encoded_len / Channels());
-}
-
-void AudioDecoderPcmA::Reset() {}
-
-std::vector<AudioDecoder::ParseResult> AudioDecoderPcmA::ParsePayload(
-    rtc::Buffer&& payload,
-    uint32_t timestamp) {
-  return LegacyEncodedAudioFrame::SplitBySamples(
-      this, std::move(payload), timestamp, 8 * num_channels_, 8);
-}
-
-int AudioDecoderPcmA::SampleRateHz() const {
-  return 8000;
-}
-
-size_t AudioDecoderPcmA::Channels() const {
-  return num_channels_;
-}
-
-int AudioDecoderPcmA::DecodeInternal(const uint8_t* encoded,
-                                     size_t encoded_len,
-                                     int sample_rate_hz,
-                                     int16_t* decoded,
-                                     SpeechType* speech_type) {
-  RTC_DCHECK_EQ(SampleRateHz(), sample_rate_hz);
-  int16_t temp_type = 1;  // Default is speech.
-  size_t ret = WebRtcG711_DecodeA(encoded, encoded_len, decoded, &temp_type);
-  *speech_type = ConvertSpeechType(temp_type);
-  return static_cast<int>(ret);
-}
-
-int AudioDecoderPcmA::PacketDuration(const uint8_t* encoded,
-                                     size_t encoded_len) const {
-  // One encoded byte per sample per channel.
-  return static_cast<int>(encoded_len / Channels());
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/codecs/g711/audio_decoder_pcm.h b/modules/audio_coding/codecs/g711/audio_decoder_pcm.h
deleted file mode 100644
index f72f202..0000000
--- a/modules/audio_coding/codecs/g711/audio_decoder_pcm.h
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- *  Copyright (c) 2015 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_CODECS_G711_AUDIO_DECODER_PCM_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_G711_AUDIO_DECODER_PCM_H_
-
-#include "webrtc/api/audio_codecs/audio_decoder.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace webrtc {
-
-class AudioDecoderPcmU final : public AudioDecoder {
- public:
-  explicit AudioDecoderPcmU(size_t num_channels) : num_channels_(num_channels) {
-    RTC_DCHECK_GE(num_channels, 1);
-  }
-  void Reset() override;
-  std::vector<ParseResult> ParsePayload(rtc::Buffer&& payload,
-                                        uint32_t timestamp) override;
-  int PacketDuration(const uint8_t* encoded, size_t encoded_len) const override;
-  int SampleRateHz() const override;
-  size_t Channels() const override;
-
- protected:
-  int DecodeInternal(const uint8_t* encoded,
-                     size_t encoded_len,
-                     int sample_rate_hz,
-                     int16_t* decoded,
-                     SpeechType* speech_type) override;
-
- private:
-  const size_t num_channels_;
-  RTC_DISALLOW_COPY_AND_ASSIGN(AudioDecoderPcmU);
-};
-
-class AudioDecoderPcmA final : public AudioDecoder {
- public:
-  explicit AudioDecoderPcmA(size_t num_channels) : num_channels_(num_channels) {
-    RTC_DCHECK_GE(num_channels, 1);
-  }
-  void Reset() override;
-  std::vector<ParseResult> ParsePayload(rtc::Buffer&& payload,
-                                        uint32_t timestamp) override;
-  int PacketDuration(const uint8_t* encoded, size_t encoded_len) const override;
-  int SampleRateHz() const override;
-  size_t Channels() const override;
-
- protected:
-  int DecodeInternal(const uint8_t* encoded,
-                     size_t encoded_len,
-                     int sample_rate_hz,
-                     int16_t* decoded,
-                     SpeechType* speech_type) override;
-
- private:
-  const size_t num_channels_;
-  RTC_DISALLOW_COPY_AND_ASSIGN(AudioDecoderPcmA);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_CODING_CODECS_G711_AUDIO_DECODER_PCM_H_
diff --git a/modules/audio_coding/codecs/g711/audio_encoder_pcm.cc b/modules/audio_coding/codecs/g711/audio_encoder_pcm.cc
deleted file mode 100644
index 711eed7..0000000
--- a/modules/audio_coding/codecs/g711/audio_encoder_pcm.cc
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- *  Copyright (c) 2014 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/codecs/g711/audio_encoder_pcm.h"
-
-#include <algorithm>
-#include <limits>
-
-#include "webrtc/common_types.h"
-#include "webrtc/modules/audio_coding/codecs/g711/g711_interface.h"
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-
-namespace {
-
-template <typename T>
-typename T::Config CreateConfig(const CodecInst& codec_inst) {
-  typename T::Config config;
-  config.frame_size_ms = codec_inst.pacsize / 8;
-  config.num_channels = codec_inst.channels;
-  config.payload_type = codec_inst.pltype;
-  return config;
-}
-
-}  // namespace
-
-bool AudioEncoderPcm::Config::IsOk() const {
-  return (frame_size_ms % 10 == 0) && (num_channels >= 1);
-}
-
-AudioEncoderPcm::AudioEncoderPcm(const Config& config, int sample_rate_hz)
-    : sample_rate_hz_(sample_rate_hz),
-      num_channels_(config.num_channels),
-      payload_type_(config.payload_type),
-      num_10ms_frames_per_packet_(
-          static_cast<size_t>(config.frame_size_ms / 10)),
-      full_frame_samples_(
-          config.num_channels * config.frame_size_ms * sample_rate_hz / 1000),
-      first_timestamp_in_buffer_(0) {
-  RTC_CHECK_GT(sample_rate_hz, 0) << "Sample rate must be larger than 0 Hz";
-  RTC_CHECK_EQ(config.frame_size_ms % 10, 0)
-      << "Frame size must be an integer multiple of 10 ms.";
-  speech_buffer_.reserve(full_frame_samples_);
-}
-
-AudioEncoderPcm::~AudioEncoderPcm() = default;
-
-int AudioEncoderPcm::SampleRateHz() const {
-  return sample_rate_hz_;
-}
-
-size_t AudioEncoderPcm::NumChannels() const {
-  return num_channels_;
-}
-
-size_t AudioEncoderPcm::Num10MsFramesInNextPacket() const {
-  return num_10ms_frames_per_packet_;
-}
-
-size_t AudioEncoderPcm::Max10MsFramesInAPacket() const {
-  return num_10ms_frames_per_packet_;
-}
-
-int AudioEncoderPcm::GetTargetBitrate() const {
-  return static_cast<int>(
-      8 * BytesPerSample() * SampleRateHz() * NumChannels());
-}
-
-AudioEncoder::EncodedInfo AudioEncoderPcm::EncodeImpl(
-    uint32_t rtp_timestamp,
-    rtc::ArrayView<const int16_t> audio,
-    rtc::Buffer* encoded) {
-  if (speech_buffer_.empty()) {
-    first_timestamp_in_buffer_ = rtp_timestamp;
-  }
-  speech_buffer_.insert(speech_buffer_.end(), audio.begin(), audio.end());
-  if (speech_buffer_.size() < full_frame_samples_) {
-    return EncodedInfo();
-  }
-  RTC_CHECK_EQ(speech_buffer_.size(), full_frame_samples_);
-  EncodedInfo info;
-  info.encoded_timestamp = first_timestamp_in_buffer_;
-  info.payload_type = payload_type_;
-  info.encoded_bytes =
-      encoded->AppendData(full_frame_samples_ * BytesPerSample(),
-                          [&] (rtc::ArrayView<uint8_t> encoded) {
-                            return EncodeCall(&speech_buffer_[0],
-                                              full_frame_samples_,
-                                              encoded.data());
-                          });
-  speech_buffer_.clear();
-  info.encoder_type = GetCodecType();
-  return info;
-}
-
-void AudioEncoderPcm::Reset() {
-  speech_buffer_.clear();
-}
-
-AudioEncoderPcmA::AudioEncoderPcmA(const CodecInst& codec_inst)
-    : AudioEncoderPcmA(CreateConfig<AudioEncoderPcmA>(codec_inst)) {}
-
-size_t AudioEncoderPcmA::EncodeCall(const int16_t* audio,
-                                    size_t input_len,
-                                    uint8_t* encoded) {
-  return WebRtcG711_EncodeA(audio, input_len, encoded);
-}
-
-size_t AudioEncoderPcmA::BytesPerSample() const {
-  return 1;
-}
-
-AudioEncoder::CodecType AudioEncoderPcmA::GetCodecType() const {
-  return AudioEncoder::CodecType::kPcmA;
-}
-
-AudioEncoderPcmU::AudioEncoderPcmU(const CodecInst& codec_inst)
-    : AudioEncoderPcmU(CreateConfig<AudioEncoderPcmU>(codec_inst)) {}
-
-size_t AudioEncoderPcmU::EncodeCall(const int16_t* audio,
-                                    size_t input_len,
-                                    uint8_t* encoded) {
-  return WebRtcG711_EncodeU(audio, input_len, encoded);
-}
-
-size_t AudioEncoderPcmU::BytesPerSample() const {
-  return 1;
-}
-
-AudioEncoder::CodecType AudioEncoderPcmU::GetCodecType() const {
-  return AudioEncoder::CodecType::kPcmU;
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/codecs/g711/audio_encoder_pcm.h b/modules/audio_coding/codecs/g711/audio_encoder_pcm.h
deleted file mode 100644
index 22a15a1..0000000
--- a/modules/audio_coding/codecs/g711/audio_encoder_pcm.h
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- *  Copyright (c) 2014 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_CODECS_G711_AUDIO_ENCODER_PCM_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_G711_AUDIO_ENCODER_PCM_H_
-
-#include <vector>
-
-#include "webrtc/api/audio_codecs/audio_encoder.h"
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace webrtc {
-
-class AudioEncoderPcm : public AudioEncoder {
- public:
-  struct Config {
-   public:
-    bool IsOk() const;
-
-    int frame_size_ms;
-    size_t num_channels;
-    int payload_type;
-
-   protected:
-    explicit Config(int pt)
-        : frame_size_ms(20), num_channels(1), payload_type(pt) {}
-  };
-
-  ~AudioEncoderPcm() override;
-
-  int SampleRateHz() const override;
-  size_t NumChannels() const override;
-  size_t Num10MsFramesInNextPacket() const override;
-  size_t Max10MsFramesInAPacket() const override;
-  int GetTargetBitrate() const override;
-  void Reset() override;
-
- protected:
-  AudioEncoderPcm(const Config& config, int sample_rate_hz);
-
-  EncodedInfo EncodeImpl(uint32_t rtp_timestamp,
-                         rtc::ArrayView<const int16_t> audio,
-                         rtc::Buffer* encoded) override;
-
-  virtual size_t EncodeCall(const int16_t* audio,
-                            size_t input_len,
-                            uint8_t* encoded) = 0;
-
-  virtual size_t BytesPerSample() const = 0;
-
-  // Used to set EncodedInfoLeaf::encoder_type in
-  // AudioEncoderPcm::EncodeImpl
-  virtual AudioEncoder::CodecType GetCodecType() const = 0;
-
- private:
-  const int sample_rate_hz_;
-  const size_t num_channels_;
-  const int payload_type_;
-  const size_t num_10ms_frames_per_packet_;
-  const size_t full_frame_samples_;
-  std::vector<int16_t> speech_buffer_;
-  uint32_t first_timestamp_in_buffer_;
-};
-
-struct CodecInst;
-
-class AudioEncoderPcmA final : public AudioEncoderPcm {
- public:
-  struct Config : public AudioEncoderPcm::Config {
-    Config() : AudioEncoderPcm::Config(8) {}
-  };
-
-  explicit AudioEncoderPcmA(const Config& config)
-      : AudioEncoderPcm(config, kSampleRateHz) {}
-  explicit AudioEncoderPcmA(const CodecInst& codec_inst);
-
- protected:
-  size_t EncodeCall(const int16_t* audio,
-                    size_t input_len,
-                    uint8_t* encoded) override;
-
-  size_t BytesPerSample() const override;
-
-  AudioEncoder::CodecType GetCodecType() const override;
-
- private:
-  static const int kSampleRateHz = 8000;
-  RTC_DISALLOW_COPY_AND_ASSIGN(AudioEncoderPcmA);
-};
-
-class AudioEncoderPcmU final : public AudioEncoderPcm {
- public:
-  struct Config : public AudioEncoderPcm::Config {
-    Config() : AudioEncoderPcm::Config(0) {}
-  };
-
-  explicit AudioEncoderPcmU(const Config& config)
-      : AudioEncoderPcm(config, kSampleRateHz) {}
-  explicit AudioEncoderPcmU(const CodecInst& codec_inst);
-
- protected:
-  size_t EncodeCall(const int16_t* audio,
-                    size_t input_len,
-                    uint8_t* encoded) override;
-
-  size_t BytesPerSample() const override;
-
-  AudioEncoder::CodecType GetCodecType() const override;
-
- private:
-  static const int kSampleRateHz = 8000;
-  RTC_DISALLOW_COPY_AND_ASSIGN(AudioEncoderPcmU);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_CODING_CODECS_G711_AUDIO_ENCODER_PCM_H_
diff --git a/modules/audio_coding/codecs/g711/g711.c b/modules/audio_coding/codecs/g711/g711.c
deleted file mode 100644
index a183757..0000000
--- a/modules/audio_coding/codecs/g711/g711.c
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * SpanDSP - a series of DSP components for telephony
- *
- * g711.c - A-law and u-law transcoding routines
- *
- * Written by Steve Underwood <steveu@coppice.org>
- *
- * Copyright (C) 2006 Steve Underwood
- *
- *  Despite my general liking of the GPL, I place this code in the
- *  public domain for the benefit of all mankind - even the slimy
- *  ones who might try to proprietize my work and use it to my
- *  detriment.
- *
- * $Id: g711.c,v 1.1 2006/06/07 15:46:39 steveu Exp $
- *
- * Modifications for WebRtc, 2011/04/28, by tlegrand:
- * -Removed unused include files
- * -Changed to use WebRtc types
- * -Added option to run encoder bitexact with ITU-T reference implementation
- */
-
-#include "g711.h"
-#include "webrtc/typedefs.h"
-
-/* Copied from the CCITT G.711 specification */
-static const uint8_t ulaw_to_alaw_table[256] = {
-   42,  43,  40,  41,  46,  47,  44,  45,  34,  35,  32,  33,  38,  39,  36,
-   37,  58,  59,  56,  57,  62,  63,  60,  61,  50,  51,  48,  49,  54,  55,
-   52,  53,  10,  11,   8,   9,  14,  15,  12,  13,   2,   3,   0,   1,   6,
-    7,   4,  26,  27,  24,  25,  30,  31,  28,  29,  18,  19,  16,  17,  22,
-   23,  20,  21, 106, 104, 105, 110, 111, 108, 109,  98,  99,  96,  97, 102,
-  103, 100, 101, 122, 120, 126, 127, 124, 125, 114, 115, 112, 113, 118, 119,
-  116, 117,  75,  73,  79,  77,  66,  67,  64,  65,  70,  71,  68,  69,  90,
-   91,  88,  89,  94,  95,  92,  93,  82,  82,  83,  83,  80,  80,  81,  81,
-   86,  86,  87,  87,  84,  84,  85,  85, 170, 171, 168, 169, 174, 175, 172,
-  173, 162, 163, 160, 161, 166, 167, 164, 165, 186, 187, 184, 185, 190, 191,
-  188, 189, 178, 179, 176, 177, 182, 183, 180, 181, 138, 139, 136, 137, 142,
-  143, 140, 141, 130, 131, 128, 129, 134, 135, 132, 154, 155, 152, 153, 158,
-  159, 156, 157, 146, 147, 144, 145, 150, 151, 148, 149, 234, 232, 233, 238,
-  239, 236, 237, 226, 227, 224, 225, 230, 231, 228, 229, 250, 248, 254, 255,
-  252, 253, 242, 243, 240, 241, 246, 247, 244, 245, 203, 201, 207, 205, 194,
-  195, 192, 193, 198, 199, 196, 197, 218, 219, 216, 217, 222, 223, 220, 221,
-  210, 210, 211, 211, 208, 208, 209, 209, 214, 214, 215, 215, 212, 212, 213,
-  213
-};
-
-/* These transcoding tables are copied from the CCITT G.711 specification. To
-   achieve optimal results, do not change them. */
-static const uint8_t alaw_to_ulaw_table[256] = {
-   42,  43,  40,  41,  46,  47,  44,  45,  34,  35,  32,  33,  38,  39,  36,
-   37,  57,  58,  55,  56,  61,  62,  59,  60,  49,  50,  47,  48,  53,  54,
-   51,  52,  10,  11,   8,   9,  14,  15,  12,  13,   2,   3,   0,   1,   6,
-    7,   4,   5,  26,  27,  24,  25,  30,  31,  28,  29,  18,  19,  16,  17,
-   22,  23,  20,  21,  98,  99,  96,  97, 102, 103, 100, 101,  93,  93,  92,
-   92,  95,  95,  94,  94, 116, 118, 112, 114, 124, 126, 120, 122, 106, 107,
-  104, 105, 110, 111, 108, 109,  72,  73,  70,  71,  76,  77,  74,  75,  64,
-   65,  63,  63,  68,  69,  66,  67,  86,  87,  84,  85,  90,  91,  88,  89,
-   79,  79,  78,  78,  82,  83,  80,  81, 170, 171, 168, 169, 174, 175, 172,
-  173, 162, 163, 160, 161, 166, 167, 164, 165, 185, 186, 183, 184, 189, 190,
-  187, 188, 177, 178, 175, 176, 181, 182, 179, 180, 138, 139, 136, 137, 142,
-  143, 140, 141, 130, 131, 128, 129, 134, 135, 132, 133, 154, 155, 152, 153,
-  158, 159, 156, 157, 146, 147, 144, 145, 150, 151, 148, 149, 226, 227, 224,
-  225, 230, 231, 228, 229, 221, 221, 220, 220, 223, 223, 222, 222, 244, 246,
-  240, 242, 252, 254, 248, 250, 234, 235, 232, 233, 238, 239, 236, 237, 200,
-  201, 198, 199, 204, 205, 202, 203, 192, 193, 191, 191, 196, 197, 194, 195,
-  214, 215, 212, 213, 218, 219, 216, 217, 207, 207, 206, 206, 210, 211, 208,
-  209
-};
-
-uint8_t alaw_to_ulaw(uint8_t alaw) { return alaw_to_ulaw_table[alaw]; }
-
-uint8_t ulaw_to_alaw(uint8_t ulaw) { return ulaw_to_alaw_table[ulaw]; }
diff --git a/modules/audio_coding/codecs/g711/g711.h b/modules/audio_coding/codecs/g711/g711.h
deleted file mode 100644
index 3b07d8b..0000000
--- a/modules/audio_coding/codecs/g711/g711.h
+++ /dev/null
@@ -1,344 +0,0 @@
-/*
- * SpanDSP - a series of DSP components for telephony
- *
- * g711.h - In line A-law and u-law conversion routines
- *
- * Written by Steve Underwood <steveu@coppice.org>
- *
- * Copyright (C) 2001 Steve Underwood
- *
- *  Despite my general liking of the GPL, I place this code in the
- *  public domain for the benefit of all mankind - even the slimy
- *  ones who might try to proprietize my work and use it to my
- *  detriment.
- *
- * $Id: g711.h,v 1.1 2006/06/07 15:46:39 steveu Exp $
- *
- * Modifications for WebRtc, 2011/04/28, by tlegrand:
- * -Changed to use WebRtc types
- * -Changed __inline__ to __inline
- * -Two changes to make implementation bitexact with ITU-T reference implementation
- */
-
-/*! \page g711_page A-law and mu-law handling
-Lookup tables for A-law and u-law look attractive, until you consider the impact
-on the CPU cache. If it causes a substantial area of your processor cache to get
-hit too often, cache sloshing will severely slow things down. The main reason
-these routines are slow in C, is the lack of direct access to the CPU's "find
-the first 1" instruction. A little in-line assembler fixes that, and the
-conversion routines can be faster than lookup tables, in most real world usage.
-A "find the first 1" instruction is available on most modern CPUs, and is a
-much underused feature.
-
-If an assembly language method of bit searching is not available, these routines
-revert to a method that can be a little slow, so the cache thrashing might not
-seem so bad :(
-
-Feel free to submit patches to add fast "find the first 1" support for your own
-favourite processor.
-
-Look up tables are used for transcoding between A-law and u-law, since it is
-difficult to achieve the precise transcoding procedure laid down in the G.711
-specification by other means.
-*/
-
-#if !defined(_G711_H_)
-#define _G711_H_
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include "webrtc/typedefs.h"
-
-#if defined(__i386__)
-/*! \brief Find the bit position of the highest set bit in a word
-    \param bits The word to be searched
-    \return The bit number of the highest set bit, or -1 if the word is zero. */
-static __inline__ int top_bit(unsigned int bits) {
-  int res;
-
-  __asm__ __volatile__(" movl $-1,%%edx;\n"
-                       " bsrl %%eax,%%edx;\n"
-                       : "=d" (res)
-                       : "a" (bits));
-  return res;
-}
-
-/*! \brief Find the bit position of the lowest set bit in a word
-    \param bits The word to be searched
-    \return The bit number of the lowest set bit, or -1 if the word is zero. */
-static __inline__ int bottom_bit(unsigned int bits) {
-  int res;
-
-  __asm__ __volatile__(" movl $-1,%%edx;\n"
-                       " bsfl %%eax,%%edx;\n"
-                       : "=d" (res)
-                       : "a" (bits));
-  return res;
-}
-#elif defined(__x86_64__)
-static __inline__ int top_bit(unsigned int bits) {
-  int res;
-
-  __asm__ __volatile__(" movq $-1,%%rdx;\n"
-                       " bsrq %%rax,%%rdx;\n"
-                       : "=d" (res)
-                       : "a" (bits));
-  return res;
-}
-
-static __inline__ int bottom_bit(unsigned int bits) {
-  int res;
-
-  __asm__ __volatile__(" movq $-1,%%rdx;\n"
-                       " bsfq %%rax,%%rdx;\n"
-                       : "=d" (res)
-                       : "a" (bits));
-  return res;
-}
-#else
-static __inline int top_bit(unsigned int bits) {
-  int i;
-
-  if (bits == 0) {
-    return -1;
-  }
-  i = 0;
-  if (bits & 0xFFFF0000) {
-    bits &= 0xFFFF0000;
-    i += 16;
-  }
-  if (bits & 0xFF00FF00) {
-    bits &= 0xFF00FF00;
-    i += 8;
-  }
-  if (bits & 0xF0F0F0F0) {
-    bits &= 0xF0F0F0F0;
-    i += 4;
-  }
-  if (bits & 0xCCCCCCCC) {
-    bits &= 0xCCCCCCCC;
-    i += 2;
-  }
-  if (bits & 0xAAAAAAAA) {
-    bits &= 0xAAAAAAAA;
-    i += 1;
-  }
-  return i;
-}
-
-static __inline int bottom_bit(unsigned int bits) {
-  int i;
-
-  if (bits == 0) {
-    return -1;
-  }
-  i = 32;
-  if (bits & 0x0000FFFF) {
-    bits &= 0x0000FFFF;
-    i -= 16;
-  }
-  if (bits & 0x00FF00FF) {
-    bits &= 0x00FF00FF;
-    i -= 8;
-  }
-  if (bits & 0x0F0F0F0F) {
-    bits &= 0x0F0F0F0F;
-    i -= 4;
-  }
-  if (bits & 0x33333333) {
-    bits &= 0x33333333;
-    i -= 2;
-  }
-  if (bits & 0x55555555) {
-    bits &= 0x55555555;
-    i -= 1;
-  }
-  return i;
-}
-#endif
-
-/* N.B. It is tempting to use look-up tables for A-law and u-law conversion.
- *      However, you should consider the cache footprint.
- *
- *      A 64K byte table for linear to x-law and a 512 byte table for x-law to
- *      linear sound like peanuts these days, and shouldn't an array lookup be
- *      real fast? No! When the cache sloshes as badly as this one will, a tight
- *      calculation may be better. The messiest part is normally finding the
- *      segment, but a little inline assembly can fix that on an i386, x86_64 and
- *      many other modern processors.
- */
-
-/*
- * Mu-law is basically as follows:
- *
- *      Biased Linear Input Code        Compressed Code
- *      ------------------------        ---------------
- *      00000001wxyza                   000wxyz
- *      0000001wxyzab                   001wxyz
- *      000001wxyzabc                   010wxyz
- *      00001wxyzabcd                   011wxyz
- *      0001wxyzabcde                   100wxyz
- *      001wxyzabcdef                   101wxyz
- *      01wxyzabcdefg                   110wxyz
- *      1wxyzabcdefgh                   111wxyz
- *
- * Each biased linear code has a leading 1 which identifies the segment
- * number. The value of the segment number is equal to 7 minus the number
- * of leading 0's. The quantization interval is directly available as the
- * four bits wxyz.  * The trailing bits (a - h) are ignored.
- *
- * Ordinarily the complement of the resulting code word is used for
- * transmission, and so the code word is complemented before it is returned.
- *
- * For further information see John C. Bellamy's Digital Telephony, 1982,
- * John Wiley & Sons, pps 98-111 and 472-476.
- */
-
-//#define ULAW_ZEROTRAP                 /* turn on the trap as per the MIL-STD */
-#define ULAW_BIAS 0x84  /* Bias for linear code. */
-
-/*! \brief Encode a linear sample to u-law
-    \param linear The sample to encode.
-    \return The u-law value.
-*/
-static __inline uint8_t linear_to_ulaw(int linear) {
-  uint8_t u_val;
-  int mask;
-  int seg;
-
-  /* Get the sign and the magnitude of the value. */
-  if (linear < 0) {
-    /* WebRtc, tlegrand: -1 added to get bitexact to reference implementation */
-    linear = ULAW_BIAS - linear - 1;
-    mask = 0x7F;
-  } else {
-    linear = ULAW_BIAS + linear;
-    mask = 0xFF;
-  }
-
-  seg = top_bit(linear | 0xFF) - 7;
-
-  /*
-   * Combine the sign, segment, quantization bits,
-   * and complement the code word.
-   */
-  if (seg >= 8)
-    u_val = (uint8_t)(0x7F ^ mask);
-  else
-    u_val = (uint8_t)(((seg << 4) | ((linear >> (seg + 3)) & 0xF)) ^ mask);
-#ifdef ULAW_ZEROTRAP
-  /* Optional ITU trap */
-  if (u_val == 0)
-    u_val = 0x02;
-#endif
-  return u_val;
-}
-
-/*! \brief Decode an u-law sample to a linear value.
-    \param ulaw The u-law sample to decode.
-    \return The linear value.
-*/
-static __inline int16_t ulaw_to_linear(uint8_t ulaw) {
-  int t;
-
-  /* Complement to obtain normal u-law value. */
-  ulaw = ~ulaw;
-  /*
-   * Extract and bias the quantization bits. Then
-   * shift up by the segment number and subtract out the bias.
-   */
-  t = (((ulaw & 0x0F) << 3) + ULAW_BIAS) << (((int) ulaw & 0x70) >> 4);
-  return (int16_t)((ulaw & 0x80) ? (ULAW_BIAS - t) : (t - ULAW_BIAS));
-}
-
-/*
- * A-law is basically as follows:
- *
- *      Linear Input Code        Compressed Code
- *      -----------------        ---------------
- *      0000000wxyza             000wxyz
- *      0000001wxyza             001wxyz
- *      000001wxyzab             010wxyz
- *      00001wxyzabc             011wxyz
- *      0001wxyzabcd             100wxyz
- *      001wxyzabcde             101wxyz
- *      01wxyzabcdef             110wxyz
- *      1wxyzabcdefg             111wxyz
- *
- * For further information see John C. Bellamy's Digital Telephony, 1982,
- * John Wiley & Sons, pps 98-111 and 472-476.
- */
-
-#define ALAW_AMI_MASK 0x55
-
-/*! \brief Encode a linear sample to A-law
-    \param linear The sample to encode.
-    \return The A-law value.
-*/
-static __inline uint8_t linear_to_alaw(int linear) {
-  int mask;
-  int seg;
-
-  if (linear >= 0) {
-    /* Sign (bit 7) bit = 1 */
-    mask = ALAW_AMI_MASK | 0x80;
-  } else {
-    /* Sign (bit 7) bit = 0 */
-    mask = ALAW_AMI_MASK;
-    /* WebRtc, tlegrand: Changed from -8 to -1 to get bitexact to reference
-     * implementation */
-    linear = -linear - 1;
-  }
-
-  /* Convert the scaled magnitude to segment number. */
-  seg = top_bit(linear | 0xFF) - 7;
-  if (seg >= 8) {
-    if (linear >= 0) {
-      /* Out of range. Return maximum value. */
-      return (uint8_t)(0x7F ^ mask);
-    }
-    /* We must be just a tiny step below zero */
-    return (uint8_t)(0x00 ^ mask);
-  }
-  /* Combine the sign, segment, and quantization bits. */
-  return (uint8_t)(((seg << 4) | ((linear >> ((seg) ? (seg + 3) : 4)) & 0x0F)) ^
-                   mask);
-}
-
-/*! \brief Decode an A-law sample to a linear value.
-    \param alaw The A-law sample to decode.
-    \return The linear value.
-*/
-static __inline int16_t alaw_to_linear(uint8_t alaw) {
-  int i;
-  int seg;
-
-  alaw ^= ALAW_AMI_MASK;
-  i = ((alaw & 0x0F) << 4);
-  seg = (((int) alaw & 0x70) >> 4);
-  if (seg)
-    i = (i + 0x108) << (seg - 1);
-  else
-    i += 8;
-  return (int16_t)((alaw & 0x80) ? i : -i);
-}
-
-/*! \brief Transcode from A-law to u-law, using the procedure defined in G.711.
-    \param alaw The A-law sample to transcode.
-    \return The best matching u-law value.
-*/
-uint8_t alaw_to_ulaw(uint8_t alaw);
-
-/*! \brief Transcode from u-law to A-law, using the procedure defined in G.711.
-    \param alaw The u-law sample to transcode.
-    \return The best matching A-law value.
-*/
-uint8_t ulaw_to_alaw(uint8_t ulaw);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/modules/audio_coding/codecs/g711/g711_interface.c b/modules/audio_coding/codecs/g711/g711_interface.c
deleted file mode 100644
index 5b96a9c..0000000
--- a/modules/audio_coding/codecs/g711/g711_interface.c
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- *  Copyright (c) 2011 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 <string.h>
-#include "g711.h"
-#include "g711_interface.h"
-#include "webrtc/typedefs.h"
-
-size_t WebRtcG711_EncodeA(const int16_t* speechIn,
-                          size_t len,
-                          uint8_t* encoded) {
-  size_t n;
-  for (n = 0; n < len; n++)
-    encoded[n] = linear_to_alaw(speechIn[n]);
-  return len;
-}
-
-size_t WebRtcG711_EncodeU(const int16_t* speechIn,
-                          size_t len,
-                          uint8_t* encoded) {
-  size_t n;
-  for (n = 0; n < len; n++)
-    encoded[n] = linear_to_ulaw(speechIn[n]);
-  return len;
-}
-
-size_t WebRtcG711_DecodeA(const uint8_t* encoded,
-                          size_t len,
-                          int16_t* decoded,
-                          int16_t* speechType) {
-  size_t n;
-  for (n = 0; n < len; n++)
-    decoded[n] = alaw_to_linear(encoded[n]);
-  *speechType = 1;
-  return len;
-}
-
-size_t WebRtcG711_DecodeU(const uint8_t* encoded,
-                          size_t len,
-                          int16_t* decoded,
-                          int16_t* speechType) {
-  size_t n;
-  for (n = 0; n < len; n++)
-    decoded[n] = ulaw_to_linear(encoded[n]);
-  *speechType = 1;
-  return len;
-}
-
-int16_t WebRtcG711_Version(char* version, int16_t lenBytes) {
-  strncpy(version, "2.0.0", lenBytes);
-  return 0;
-}
diff --git a/modules/audio_coding/codecs/g711/g711_interface.h b/modules/audio_coding/codecs/g711/g711_interface.h
deleted file mode 100644
index 00854bb..0000000
--- a/modules/audio_coding/codecs/g711/g711_interface.h
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
- *  Copyright (c) 2011 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_CODECS_G711_G711_INTERFACE_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_G711_G711_INTERFACE_H_
-
-#include "webrtc/typedefs.h"
-
-// Comfort noise constants
-#define G711_WEBRTC_SPEECH 1
-#define G711_WEBRTC_CNG 2
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/****************************************************************************
- * WebRtcG711_EncodeA(...)
- *
- * This function encodes a G711 A-law frame and inserts it into a packet.
- * Input speech length has be of any length.
- *
- * Input:
- *      - speechIn           : Input speech vector
- *      - len                : Samples in speechIn
- *
- * Output:
- *      - encoded            : The encoded data vector
- *
- * Return value              : Length (in bytes) of coded data.
- *                             Always equal to len input parameter.
- */
-
-size_t WebRtcG711_EncodeA(const int16_t* speechIn,
-                          size_t len,
-                          uint8_t* encoded);
-
-/****************************************************************************
- * WebRtcG711_EncodeU(...)
- *
- * This function encodes a G711 U-law frame and inserts it into a packet.
- * Input speech length has be of any length.
- *
- * Input:
- *      - speechIn           : Input speech vector
- *      - len                : Samples in speechIn
- *
- * Output:
- *      - encoded            : The encoded data vector
- *
- * Return value              : Length (in bytes) of coded data.
- *                             Always equal to len input parameter.
- */
-
-size_t WebRtcG711_EncodeU(const int16_t* speechIn,
-                          size_t len,
-                          uint8_t* encoded);
-
-/****************************************************************************
- * WebRtcG711_DecodeA(...)
- *
- * This function decodes a packet G711 A-law frame.
- *
- * Input:
- *      - encoded            : Encoded data
- *      - len                : Bytes in encoded vector
- *
- * Output:
- *      - decoded            : The decoded vector
- *      - speechType         : 1 normal, 2 CNG (for G711 it should
- *                             always return 1 since G711 does not have a
- *                             built-in DTX/CNG scheme)
- *
- * Return value              : >0 - Samples in decoded vector
- *                             -1 - Error
- */
-
-size_t WebRtcG711_DecodeA(const uint8_t* encoded,
-                          size_t len,
-                          int16_t* decoded,
-                          int16_t* speechType);
-
-/****************************************************************************
- * WebRtcG711_DecodeU(...)
- *
- * This function decodes a packet G711 U-law frame.
- *
- * Input:
- *      - encoded            : Encoded data
- *      - len                : Bytes in encoded vector
- *
- * Output:
- *      - decoded            : The decoded vector
- *      - speechType         : 1 normal, 2 CNG (for G711 it should
- *                             always return 1 since G711 does not have a
- *                             built-in DTX/CNG scheme)
- *
- * Return value              : >0 - Samples in decoded vector
- *                             -1 - Error
- */
-
-size_t WebRtcG711_DecodeU(const uint8_t* encoded,
-                          size_t len,
-                          int16_t* decoded,
-                          int16_t* speechType);
-
-/**********************************************************************
-* WebRtcG711_Version(...)
-*
-* This function gives the version string of the G.711 codec.
-*
-* Input:
-*      - lenBytes:     the size of Allocated space (in Bytes) where
-*                      the version number is written to (in string format).
-*
-* Output:
-*      - version:      Pointer to a buffer where the version number is
-*                      written to.
-*
-*/
-
-int16_t WebRtcG711_Version(char* version, int16_t lenBytes);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif  // WEBRTC_MODULES_AUDIO_CODING_CODECS_G711_G711_INTERFACE_H_
diff --git a/modules/audio_coding/codecs/g711/test/testG711.cc b/modules/audio_coding/codecs/g711/test/testG711.cc
deleted file mode 100644
index 5675b1f..0000000
--- a/modules/audio_coding/codecs/g711/test/testG711.cc
+++ /dev/null
@@ -1,170 +0,0 @@
-/*
- *  Copyright (c) 2012 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.
- */
-
-/*
- * testG711.cpp : Defines the entry point for the console application.
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-/* include API */
-#include "webrtc/modules/audio_coding/codecs/g711/g711_interface.h"
-
-/* Runtime statistics */
-#include <time.h>
-#define CLOCKS_PER_SEC_G711 1000
-
-/* function for reading audio data from PCM file */
-bool readframe(int16_t* data, FILE* inp, size_t length) {
-  size_t rlen = fread(data, sizeof(int16_t), length, inp);
-  if (rlen >= length)
-    return false;
-  memset(data + rlen, 0, (length - rlen) * sizeof(int16_t));
-  return true;
-}
-
-int main(int argc, char* argv[]) {
-  char inname[80], outname[40], bitname[40];
-  FILE* inp;
-  FILE* outp;
-  FILE* bitp = NULL;
-  int framecnt;
-  bool endfile;
-
-  size_t framelength = 80;
-
-  /* Runtime statistics */
-  double starttime;
-  double runtime;
-  double length_file;
-
-  size_t stream_len = 0;
-  int16_t shortdata[480];
-  int16_t decoded[480];
-  uint8_t streamdata[1000];
-  int16_t speechType[1];
-  char law[2];
-  char versionNumber[40];
-
-  /* handling wrong input arguments in the command line */
-  if ((argc != 5) && (argc != 6)) {
-    printf("\n\nWrong number of arguments or flag values.\n\n");
-
-    printf("\n");
-    printf("\nG.711 test application\n\n");
-    printf("Usage:\n\n");
-    printf("./testG711.exe framelength law infile outfile \n\n");
-    printf("framelength: Framelength in samples.\n");
-    printf("law        : Coding law, A och u.\n");
-    printf("infile     : Normal speech input file\n");
-    printf("outfile    : Speech output file\n\n");
-    printf("outbits    : Output bitstream file [optional]\n\n");
-    exit(0);
-
-  }
-
-  /* Get version and print */
-  WebRtcG711_Version(versionNumber, 40);
-
-  printf("-----------------------------------\n");
-  printf("G.711 version: %s\n\n", versionNumber);
-  /* Get frame length */
-  int framelength_int = atoi(argv[1]);
-  if (framelength_int < 0) {
-      printf("  G.722: Invalid framelength %d.\n", framelength_int);
-      exit(1);
-  }
-  framelength = static_cast<size_t>(framelength_int);
-
-  /* Get compression law */
-  strcpy(law, argv[2]);
-
-  /* Get Input and Output files */
-  sscanf(argv[3], "%s", inname);
-  sscanf(argv[4], "%s", outname);
-  if (argc == 6) {
-    sscanf(argv[5], "%s", bitname);
-    if ((bitp = fopen(bitname, "wb")) == NULL) {
-      printf("  G.711: Cannot read file %s.\n", bitname);
-      exit(1);
-    }
-  }
-
-  if ((inp = fopen(inname, "rb")) == NULL) {
-    printf("  G.711: Cannot read file %s.\n", inname);
-    exit(1);
-  }
-  if ((outp = fopen(outname, "wb")) == NULL) {
-    printf("  G.711: Cannot write file %s.\n", outname);
-    exit(1);
-  }
-  printf("\nInput:  %s\nOutput: %s\n", inname, outname);
-  if (argc == 6) {
-    printf("\nBitfile:  %s\n", bitname);
-  }
-
-  starttime = clock() / (double) CLOCKS_PER_SEC_G711; /* Runtime statistics */
-
-  /* Initialize encoder and decoder */
-  framecnt = 0;
-  endfile = false;
-  while (!endfile) {
-    framecnt++;
-    /* Read speech block */
-    endfile = readframe(shortdata, inp, framelength);
-
-    /* G.711 encoding */
-    if (!strcmp(law, "A")) {
-      /* A-law encoding */
-      stream_len = WebRtcG711_EncodeA(shortdata, framelength, streamdata);
-      if (argc == 6) {
-        /* Write bits to file */
-        if (fwrite(streamdata, sizeof(unsigned char), stream_len, bitp) !=
-            stream_len) {
-          return -1;
-        }
-      }
-      WebRtcG711_DecodeA(streamdata, stream_len, decoded, speechType);
-    } else if (!strcmp(law, "u")) {
-      /* u-law encoding */
-      stream_len = WebRtcG711_EncodeU(shortdata, framelength, streamdata);
-      if (argc == 6) {
-        /* Write bits to file */
-        if (fwrite(streamdata, sizeof(unsigned char), stream_len, bitp) !=
-            stream_len) {
-          return -1;
-        }
-      }
-      WebRtcG711_DecodeU(streamdata, stream_len, decoded, speechType);
-    } else {
-      printf("Wrong law mode\n");
-      exit(1);
-    }
-    /* Write coded speech to file */
-    if (fwrite(decoded, sizeof(short), framelength, outp) != framelength) {
-      return -1;
-    }
-  }
-
-  runtime = (double)(clock() / (double) CLOCKS_PER_SEC_G711 - starttime);
-  length_file = ((double) framecnt * (double) framelength / 8000);
-  printf("\n\nLength of speech file: %.1f s\n", length_file);
-  printf("Time to run G.711:      %.2f s (%.2f %% of realtime)\n\n",
-         runtime,
-         (100 * runtime / length_file));
-  printf("---------------------END----------------------\n");
-
-  fclose(inp);
-  fclose(outp);
-
-  return 0;
-}
diff --git a/modules/audio_coding/codecs/g722/audio_decoder_g722.cc b/modules/audio_coding/codecs/g722/audio_decoder_g722.cc
deleted file mode 100644
index 7e597f8..0000000
--- a/modules/audio_coding/codecs/g722/audio_decoder_g722.cc
+++ /dev/null
@@ -1,162 +0,0 @@
-/*
- *  Copyright (c) 2015 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/codecs/g722/audio_decoder_g722.h"
-
-#include <string.h>
-
-#include "webrtc/modules/audio_coding/codecs/g722/g722_interface.h"
-#include "webrtc/modules/audio_coding/codecs/legacy_encoded_audio_frame.h"
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-
-AudioDecoderG722Impl::AudioDecoderG722Impl() {
-  WebRtcG722_CreateDecoder(&dec_state_);
-  WebRtcG722_DecoderInit(dec_state_);
-}
-
-AudioDecoderG722Impl::~AudioDecoderG722Impl() {
-  WebRtcG722_FreeDecoder(dec_state_);
-}
-
-bool AudioDecoderG722Impl::HasDecodePlc() const {
-  return false;
-}
-
-int AudioDecoderG722Impl::DecodeInternal(const uint8_t* encoded,
-                                         size_t encoded_len,
-                                         int sample_rate_hz,
-                                         int16_t* decoded,
-                                         SpeechType* speech_type) {
-  RTC_DCHECK_EQ(SampleRateHz(), sample_rate_hz);
-  int16_t temp_type = 1;  // Default is speech.
-  size_t ret =
-      WebRtcG722_Decode(dec_state_, encoded, encoded_len, decoded, &temp_type);
-  *speech_type = ConvertSpeechType(temp_type);
-  return static_cast<int>(ret);
-}
-
-void AudioDecoderG722Impl::Reset() {
-  WebRtcG722_DecoderInit(dec_state_);
-}
-
-std::vector<AudioDecoder::ParseResult> AudioDecoderG722Impl::ParsePayload(
-    rtc::Buffer&& payload,
-    uint32_t timestamp) {
-  return LegacyEncodedAudioFrame::SplitBySamples(this, std::move(payload),
-                                                 timestamp, 8, 16);
-}
-
-int AudioDecoderG722Impl::PacketDuration(const uint8_t* encoded,
-                                         size_t encoded_len) const {
-  // 1/2 encoded byte per sample per channel.
-  return static_cast<int>(2 * encoded_len / Channels());
-}
-
-int AudioDecoderG722Impl::SampleRateHz() const {
-  return 16000;
-}
-
-size_t AudioDecoderG722Impl::Channels() const {
-  return 1;
-}
-
-AudioDecoderG722StereoImpl::AudioDecoderG722StereoImpl() {
-  WebRtcG722_CreateDecoder(&dec_state_left_);
-  WebRtcG722_CreateDecoder(&dec_state_right_);
-  WebRtcG722_DecoderInit(dec_state_left_);
-  WebRtcG722_DecoderInit(dec_state_right_);
-}
-
-AudioDecoderG722StereoImpl::~AudioDecoderG722StereoImpl() {
-  WebRtcG722_FreeDecoder(dec_state_left_);
-  WebRtcG722_FreeDecoder(dec_state_right_);
-}
-
-int AudioDecoderG722StereoImpl::DecodeInternal(const uint8_t* encoded,
-                                               size_t encoded_len,
-                                               int sample_rate_hz,
-                                               int16_t* decoded,
-                                               SpeechType* speech_type) {
-  RTC_DCHECK_EQ(SampleRateHz(), sample_rate_hz);
-  int16_t temp_type = 1;  // Default is speech.
-  // De-interleave the bit-stream into two separate payloads.
-  uint8_t* encoded_deinterleaved = new uint8_t[encoded_len];
-  SplitStereoPacket(encoded, encoded_len, encoded_deinterleaved);
-  // Decode left and right.
-  size_t decoded_len = WebRtcG722_Decode(dec_state_left_, encoded_deinterleaved,
-                                         encoded_len / 2, decoded, &temp_type);
-  size_t ret = WebRtcG722_Decode(
-      dec_state_right_, &encoded_deinterleaved[encoded_len / 2],
-      encoded_len / 2, &decoded[decoded_len], &temp_type);
-  if (ret == decoded_len) {
-    ret += decoded_len;  // Return total number of samples.
-    // Interleave output.
-    for (size_t k = ret / 2; k < ret; k++) {
-      int16_t temp = decoded[k];
-      memmove(&decoded[2 * k - ret + 2], &decoded[2 * k - ret + 1],
-              (ret - k - 1) * sizeof(int16_t));
-      decoded[2 * k - ret + 1] = temp;
-    }
-  }
-  *speech_type = ConvertSpeechType(temp_type);
-  delete[] encoded_deinterleaved;
-  return static_cast<int>(ret);
-}
-
-int AudioDecoderG722StereoImpl::SampleRateHz() const {
-  return 16000;
-}
-
-size_t AudioDecoderG722StereoImpl::Channels() const {
-  return 2;
-}
-
-void AudioDecoderG722StereoImpl::Reset() {
-  WebRtcG722_DecoderInit(dec_state_left_);
-  WebRtcG722_DecoderInit(dec_state_right_);
-}
-
-std::vector<AudioDecoder::ParseResult> AudioDecoderG722StereoImpl::ParsePayload(
-    rtc::Buffer&& payload,
-    uint32_t timestamp) {
-  return LegacyEncodedAudioFrame::SplitBySamples(this, std::move(payload),
-                                                 timestamp, 2 * 8, 16);
-}
-
-// Split the stereo packet and place left and right channel after each other
-// in the output array.
-void AudioDecoderG722StereoImpl::SplitStereoPacket(
-    const uint8_t* encoded,
-    size_t encoded_len,
-    uint8_t* encoded_deinterleaved) {
-  // Regroup the 4 bits/sample so |l1 l2| |r1 r2| |l3 l4| |r3 r4| ...,
-  // where "lx" is 4 bits representing left sample number x, and "rx" right
-  // sample. Two samples fit in one byte, represented with |...|.
-  for (size_t i = 0; i + 1 < encoded_len; i += 2) {
-    uint8_t right_byte = ((encoded[i] & 0x0F) << 4) + (encoded[i + 1] & 0x0F);
-    encoded_deinterleaved[i] = (encoded[i] & 0xF0) + (encoded[i + 1] >> 4);
-    encoded_deinterleaved[i + 1] = right_byte;
-  }
-
-  // Move one byte representing right channel each loop, and place it at the
-  // end of the bytestream vector. After looping the data is reordered to:
-  // |l1 l2| |l3 l4| ... |l(N-1) lN| |r1 r2| |r3 r4| ... |r(N-1) r(N)|,
-  // where N is the total number of samples.
-  for (size_t i = 0; i < encoded_len / 2; i++) {
-    uint8_t right_byte = encoded_deinterleaved[i + 1];
-    memmove(&encoded_deinterleaved[i + 1], &encoded_deinterleaved[i + 2],
-            encoded_len - i - 2);
-    encoded_deinterleaved[encoded_len - 1] = right_byte;
-  }
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/codecs/g722/audio_decoder_g722.h b/modules/audio_coding/codecs/g722/audio_decoder_g722.h
deleted file mode 100644
index ee2270f..0000000
--- a/modules/audio_coding/codecs/g722/audio_decoder_g722.h
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- *  Copyright (c) 2015 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_CODECS_G722_AUDIO_DECODER_G722_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_G722_AUDIO_DECODER_G722_H_
-
-#include "webrtc/api/audio_codecs/audio_decoder.h"
-#include "webrtc/rtc_base/constructormagic.h"
-
-typedef struct WebRtcG722DecInst G722DecInst;
-
-namespace webrtc {
-
-class AudioDecoderG722Impl final : public AudioDecoder {
- public:
-  AudioDecoderG722Impl();
-  ~AudioDecoderG722Impl() override;
-  bool HasDecodePlc() const override;
-  void Reset() override;
-  std::vector<ParseResult> ParsePayload(rtc::Buffer&& payload,
-                                        uint32_t timestamp) override;
-  int PacketDuration(const uint8_t* encoded, size_t encoded_len) const override;
-  int SampleRateHz() const override;
-  size_t Channels() const override;
-
- protected:
-  int DecodeInternal(const uint8_t* encoded,
-                     size_t encoded_len,
-                     int sample_rate_hz,
-                     int16_t* decoded,
-                     SpeechType* speech_type) override;
-
- private:
-  G722DecInst* dec_state_;
-  RTC_DISALLOW_COPY_AND_ASSIGN(AudioDecoderG722Impl);
-};
-
-class AudioDecoderG722StereoImpl final : public AudioDecoder {
- public:
-  AudioDecoderG722StereoImpl();
-  ~AudioDecoderG722StereoImpl() override;
-  void Reset() override;
-  std::vector<ParseResult> ParsePayload(rtc::Buffer&& payload,
-                                        uint32_t timestamp) override;
-  int SampleRateHz() const override;
-  size_t Channels() const override;
-
- protected:
-  int DecodeInternal(const uint8_t* encoded,
-                     size_t encoded_len,
-                     int sample_rate_hz,
-                     int16_t* decoded,
-                     SpeechType* speech_type) override;
-
- private:
-  // Splits the stereo-interleaved payload in |encoded| into separate payloads
-  // for left and right channels. The separated payloads are written to
-  // |encoded_deinterleaved|, which must hold at least |encoded_len| samples.
-  // The left channel starts at offset 0, while the right channel starts at
-  // offset encoded_len / 2 into |encoded_deinterleaved|.
-  void SplitStereoPacket(const uint8_t* encoded,
-                         size_t encoded_len,
-                         uint8_t* encoded_deinterleaved);
-
-  G722DecInst* dec_state_left_;
-  G722DecInst* dec_state_right_;
-  RTC_DISALLOW_COPY_AND_ASSIGN(AudioDecoderG722StereoImpl);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_CODING_CODECS_G722_AUDIO_DECODER_G722_H_
diff --git a/modules/audio_coding/codecs/g722/audio_encoder_g722.cc b/modules/audio_coding/codecs/g722/audio_encoder_g722.cc
deleted file mode 100644
index 4c3e82d..0000000
--- a/modules/audio_coding/codecs/g722/audio_encoder_g722.cc
+++ /dev/null
@@ -1,162 +0,0 @@
-/*
- *  Copyright (c) 2014 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/codecs/g722/audio_encoder_g722.h"
-
-#include <algorithm>
-
-#include <limits>
-#include "webrtc/common_types.h"
-#include "webrtc/modules/audio_coding/codecs/g722/g722_interface.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/safe_conversions.h"
-
-namespace webrtc {
-
-namespace {
-
-const size_t kSampleRateHz = 16000;
-
-AudioEncoderG722Config CreateConfig(const CodecInst& codec_inst) {
-  AudioEncoderG722Config config;
-  config.num_channels = rtc::dchecked_cast<int>(codec_inst.channels);
-  config.frame_size_ms = codec_inst.pacsize / 16;
-  return config;
-}
-
-}  // namespace
-
-AudioEncoderG722Impl::AudioEncoderG722Impl(const AudioEncoderG722Config& config,
-                                           int payload_type)
-    : num_channels_(config.num_channels),
-      payload_type_(payload_type),
-      num_10ms_frames_per_packet_(
-          static_cast<size_t>(config.frame_size_ms / 10)),
-      num_10ms_frames_buffered_(0),
-      first_timestamp_in_buffer_(0),
-      encoders_(new EncoderState[num_channels_]),
-      interleave_buffer_(2 * num_channels_) {
-  RTC_CHECK(config.IsOk());
-  const size_t samples_per_channel =
-      kSampleRateHz / 100 * num_10ms_frames_per_packet_;
-  for (size_t i = 0; i < num_channels_; ++i) {
-    encoders_[i].speech_buffer.reset(new int16_t[samples_per_channel]);
-    encoders_[i].encoded_buffer.SetSize(samples_per_channel / 2);
-  }
-  Reset();
-}
-
-AudioEncoderG722Impl::AudioEncoderG722Impl(const CodecInst& codec_inst)
-    : AudioEncoderG722Impl(CreateConfig(codec_inst), codec_inst.pltype) {}
-
-AudioEncoderG722Impl::~AudioEncoderG722Impl() = default;
-
-int AudioEncoderG722Impl::SampleRateHz() const {
-  return kSampleRateHz;
-}
-
-size_t AudioEncoderG722Impl::NumChannels() const {
-  return num_channels_;
-}
-
-int AudioEncoderG722Impl::RtpTimestampRateHz() const {
-  // The RTP timestamp rate for G.722 is 8000 Hz, even though it is a 16 kHz
-  // codec.
-  return kSampleRateHz / 2;
-}
-
-size_t AudioEncoderG722Impl::Num10MsFramesInNextPacket() const {
-  return num_10ms_frames_per_packet_;
-}
-
-size_t AudioEncoderG722Impl::Max10MsFramesInAPacket() const {
-  return num_10ms_frames_per_packet_;
-}
-
-int AudioEncoderG722Impl::GetTargetBitrate() const {
-  // 4 bits/sample, 16000 samples/s/channel.
-  return static_cast<int>(64000 * NumChannels());
-}
-
-void AudioEncoderG722Impl::Reset() {
-  num_10ms_frames_buffered_ = 0;
-  for (size_t i = 0; i < num_channels_; ++i)
-    RTC_CHECK_EQ(0, WebRtcG722_EncoderInit(encoders_[i].encoder));
-}
-
-AudioEncoder::EncodedInfo AudioEncoderG722Impl::EncodeImpl(
-    uint32_t rtp_timestamp,
-    rtc::ArrayView<const int16_t> audio,
-    rtc::Buffer* encoded) {
-  if (num_10ms_frames_buffered_ == 0)
-    first_timestamp_in_buffer_ = rtp_timestamp;
-
-  // Deinterleave samples and save them in each channel's buffer.
-  const size_t start = kSampleRateHz / 100 * num_10ms_frames_buffered_;
-  for (size_t i = 0; i < kSampleRateHz / 100; ++i)
-    for (size_t j = 0; j < num_channels_; ++j)
-      encoders_[j].speech_buffer[start + i] = audio[i * num_channels_ + j];
-
-  // If we don't yet have enough samples for a packet, we're done for now.
-  if (++num_10ms_frames_buffered_ < num_10ms_frames_per_packet_) {
-    return EncodedInfo();
-  }
-
-  // Encode each channel separately.
-  RTC_CHECK_EQ(num_10ms_frames_buffered_, num_10ms_frames_per_packet_);
-  num_10ms_frames_buffered_ = 0;
-  const size_t samples_per_channel = SamplesPerChannel();
-  for (size_t i = 0; i < num_channels_; ++i) {
-    const size_t bytes_encoded = WebRtcG722_Encode(
-        encoders_[i].encoder, encoders_[i].speech_buffer.get(),
-        samples_per_channel, encoders_[i].encoded_buffer.data());
-    RTC_CHECK_EQ(bytes_encoded, samples_per_channel / 2);
-  }
-
-  const size_t bytes_to_encode = samples_per_channel / 2 * num_channels_;
-  EncodedInfo info;
-  info.encoded_bytes = encoded->AppendData(
-      bytes_to_encode, [&] (rtc::ArrayView<uint8_t> encoded) {
-        // Interleave the encoded bytes of the different channels. Each separate
-        // channel and the interleaved stream encodes two samples per byte, most
-        // significant half first.
-        for (size_t i = 0; i < samples_per_channel / 2; ++i) {
-          for (size_t j = 0; j < num_channels_; ++j) {
-            uint8_t two_samples = encoders_[j].encoded_buffer.data()[i];
-            interleave_buffer_.data()[j] = two_samples >> 4;
-            interleave_buffer_.data()[num_channels_ + j] = two_samples & 0xf;
-          }
-          for (size_t j = 0; j < num_channels_; ++j)
-            encoded[i * num_channels_ + j] =
-                interleave_buffer_.data()[2 * j] << 4 |
-                interleave_buffer_.data()[2 * j + 1];
-        }
-
-        return bytes_to_encode;
-      });
-  info.encoded_timestamp = first_timestamp_in_buffer_;
-  info.payload_type = payload_type_;
-  info.encoder_type = CodecType::kG722;
-  return info;
-}
-
-AudioEncoderG722Impl::EncoderState::EncoderState() {
-  RTC_CHECK_EQ(0, WebRtcG722_CreateEncoder(&encoder));
-}
-
-AudioEncoderG722Impl::EncoderState::~EncoderState() {
-  RTC_CHECK_EQ(0, WebRtcG722_FreeEncoder(encoder));
-}
-
-size_t AudioEncoderG722Impl::SamplesPerChannel() const {
-  return kSampleRateHz / 100 * num_10ms_frames_per_packet_;
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/codecs/g722/audio_encoder_g722.h b/modules/audio_coding/codecs/g722/audio_encoder_g722.h
deleted file mode 100644
index b4d9ef0..0000000
--- a/modules/audio_coding/codecs/g722/audio_encoder_g722.h
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- *  Copyright (c) 2014 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_CODECS_G722_AUDIO_ENCODER_G722_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_G722_AUDIO_ENCODER_G722_H_
-
-#include <memory>
-
-#include "webrtc/api/audio_codecs/audio_encoder.h"
-#include "webrtc/api/audio_codecs/g722/audio_encoder_g722_config.h"
-#include "webrtc/modules/audio_coding/codecs/g722/g722_interface.h"
-#include "webrtc/rtc_base/buffer.h"
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace webrtc {
-
-struct CodecInst;
-
-class AudioEncoderG722Impl final : public AudioEncoder {
- public:
-  AudioEncoderG722Impl(const AudioEncoderG722Config& config, int payload_type);
-  explicit AudioEncoderG722Impl(const CodecInst& codec_inst);
-  ~AudioEncoderG722Impl() override;
-
-  int SampleRateHz() const override;
-  size_t NumChannels() const override;
-  int RtpTimestampRateHz() const override;
-  size_t Num10MsFramesInNextPacket() const override;
-  size_t Max10MsFramesInAPacket() const override;
-  int GetTargetBitrate() const override;
-  void Reset() override;
-
- protected:
-  EncodedInfo EncodeImpl(uint32_t rtp_timestamp,
-                         rtc::ArrayView<const int16_t> audio,
-                         rtc::Buffer* encoded) override;
-
- private:
-  // The encoder state for one channel.
-  struct EncoderState {
-    G722EncInst* encoder;
-    std::unique_ptr<int16_t[]> speech_buffer;   // Queued up for encoding.
-    rtc::Buffer encoded_buffer;                 // Already encoded.
-    EncoderState();
-    ~EncoderState();
-  };
-
-  size_t SamplesPerChannel() const;
-
-  const size_t num_channels_;
-  const int payload_type_;
-  const size_t num_10ms_frames_per_packet_;
-  size_t num_10ms_frames_buffered_;
-  uint32_t first_timestamp_in_buffer_;
-  const std::unique_ptr<EncoderState[]> encoders_;
-  rtc::Buffer interleave_buffer_;
-  RTC_DISALLOW_COPY_AND_ASSIGN(AudioEncoderG722Impl);
-};
-
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_AUDIO_CODING_CODECS_G722_AUDIO_ENCODER_G722_H_
diff --git a/modules/audio_coding/codecs/g722/g722_decode.c b/modules/audio_coding/codecs/g722/g722_decode.c
deleted file mode 100644
index 71646c5..0000000
--- a/modules/audio_coding/codecs/g722/g722_decode.c
+++ /dev/null
@@ -1,400 +0,0 @@
-/*
- * SpanDSP - a series of DSP components for telephony
- *
- * g722_decode.c - The ITU G.722 codec, decode part.
- *
- * Written by Steve Underwood <steveu@coppice.org>
- *
- * Copyright (C) 2005 Steve Underwood
- *
- *  Despite my general liking of the GPL, I place my own contributions
- *  to this code in the public domain for the benefit of all mankind -
- *  even the slimy ones who might try to proprietize my work and use it
- *  to my detriment.
- *
- * Based in part on a single channel G.722 codec which is:
- *
- * Copyright (c) CMU 1993
- * Computer Science, Speech Group
- * Chengxiang Lu and Alex Hauptmann
- *
- * $Id: g722_decode.c,v 1.15 2006/07/07 16:37:49 steveu Exp $
- *
- * Modifications for WebRtc, 2011/04/28, by tlegrand:
- * -Removed usage of inttypes.h and tgmath.h
- * -Changed to use WebRtc types
- * -Changed __inline__ to __inline
- * -Added saturation check on output
- */
-
-/*! \file */
-
-
-#include <memory.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-#include "g722_enc_dec.h"
-#include "webrtc/typedefs.h"
-
-#if !defined(FALSE)
-#define FALSE 0
-#endif
-#if !defined(TRUE)
-#define TRUE (!FALSE)
-#endif
-
-static __inline int16_t saturate(int32_t amp)
-{
-    int16_t amp16;
-
-    /* Hopefully this is optimised for the common case - not clipping */
-    amp16 = (int16_t) amp;
-    if (amp == amp16)
-        return amp16;
-    if (amp > WEBRTC_INT16_MAX)
-        return  WEBRTC_INT16_MAX;
-    return  WEBRTC_INT16_MIN;
-}
-/*- End of function --------------------------------------------------------*/
-
-static void block4(G722DecoderState *s, int band, int d);
-
-static void block4(G722DecoderState *s, int band, int d)
-{
-    int wd1;
-    int wd2;
-    int wd3;
-    int i;
-
-    /* Block 4, RECONS */
-    s->band[band].d[0] = d;
-    s->band[band].r[0] = saturate(s->band[band].s + d);
-
-    /* Block 4, PARREC */
-    s->band[band].p[0] = saturate(s->band[band].sz + d);
-
-    /* Block 4, UPPOL2 */
-    for (i = 0;  i < 3;  i++)
-        s->band[band].sg[i] = s->band[band].p[i] >> 15;
-    wd1 = saturate(s->band[band].a[1] * 4);
-
-    wd2 = (s->band[band].sg[0] == s->band[band].sg[1])  ?  -wd1  :  wd1;
-    if (wd2 > 32767)
-        wd2 = 32767;
-    wd3 = (s->band[band].sg[0] == s->band[band].sg[2])  ?  128  :  -128;
-    wd3 += (wd2 >> 7);
-    wd3 += (s->band[band].a[2]*32512) >> 15;
-    if (wd3 > 12288)
-        wd3 = 12288;
-    else if (wd3 < -12288)
-        wd3 = -12288;
-    s->band[band].ap[2] = wd3;
-
-    /* Block 4, UPPOL1 */
-    s->band[band].sg[0] = s->band[band].p[0] >> 15;
-    s->band[band].sg[1] = s->band[band].p[1] >> 15;
-    wd1 = (s->band[band].sg[0] == s->band[band].sg[1])  ?  192  :  -192;
-    wd2 = (s->band[band].a[1]*32640) >> 15;
-
-    s->band[band].ap[1] = saturate(wd1 + wd2);
-    wd3 = saturate(15360 - s->band[band].ap[2]);
-    if (s->band[band].ap[1] > wd3)
-        s->band[band].ap[1] = wd3;
-    else if (s->band[band].ap[1] < -wd3)
-        s->band[band].ap[1] = -wd3;
-
-    /* Block 4, UPZERO */
-    wd1 = (d == 0)  ?  0  :  128;
-    s->band[band].sg[0] = d >> 15;
-    for (i = 1;  i < 7;  i++)
-    {
-        s->band[band].sg[i] = s->band[band].d[i] >> 15;
-        wd2 = (s->band[band].sg[i] == s->band[band].sg[0])  ?  wd1  :  -wd1;
-        wd3 = (s->band[band].b[i]*32640) >> 15;
-        s->band[band].bp[i] = saturate(wd2 + wd3);
-    }
-
-    /* Block 4, DELAYA */
-    for (i = 6;  i > 0;  i--)
-    {
-        s->band[band].d[i] = s->band[band].d[i - 1];
-        s->band[band].b[i] = s->band[band].bp[i];
-    }
-
-    for (i = 2;  i > 0;  i--)
-    {
-        s->band[band].r[i] = s->band[band].r[i - 1];
-        s->band[band].p[i] = s->band[band].p[i - 1];
-        s->band[band].a[i] = s->band[band].ap[i];
-    }
-
-    /* Block 4, FILTEP */
-    wd1 = saturate(s->band[band].r[1] + s->band[band].r[1]);
-    wd1 = (s->band[band].a[1]*wd1) >> 15;
-    wd2 = saturate(s->band[band].r[2] + s->band[band].r[2]);
-    wd2 = (s->band[band].a[2]*wd2) >> 15;
-    s->band[band].sp = saturate(wd1 + wd2);
-
-    /* Block 4, FILTEZ */
-    s->band[band].sz = 0;
-    for (i = 6;  i > 0;  i--)
-    {
-        wd1 = saturate(s->band[band].d[i] + s->band[band].d[i]);
-        s->band[band].sz += (s->band[band].b[i]*wd1) >> 15;
-    }
-    s->band[band].sz = saturate(s->band[band].sz);
-
-    /* Block 4, PREDIC */
-    s->band[band].s = saturate(s->band[band].sp + s->band[band].sz);
-}
-/*- End of function --------------------------------------------------------*/
-
-G722DecoderState* WebRtc_g722_decode_init(G722DecoderState* s,
-                                          int rate,
-                                          int options) {
-    s = s ? s : malloc(sizeof(*s));
-    memset(s, 0, sizeof(*s));
-    if (rate == 48000)
-        s->bits_per_sample = 6;
-    else if (rate == 56000)
-        s->bits_per_sample = 7;
-    else
-        s->bits_per_sample = 8;
-    if ((options & G722_SAMPLE_RATE_8000))
-        s->eight_k = TRUE;
-    if ((options & G722_PACKED)  &&  s->bits_per_sample != 8)
-        s->packed = TRUE;
-    else
-        s->packed = FALSE;
-    s->band[0].det = 32;
-    s->band[1].det = 8;
-    return s;
-}
-/*- End of function --------------------------------------------------------*/
-
-int WebRtc_g722_decode_release(G722DecoderState *s)
-{
-    free(s);
-    return 0;
-}
-/*- End of function --------------------------------------------------------*/
-
-size_t WebRtc_g722_decode(G722DecoderState *s, int16_t amp[],
-                          const uint8_t g722_data[], size_t len)
-{
-    static const int wl[8] = {-60, -30, 58, 172, 334, 538, 1198, 3042 };
-    static const int rl42[16] = {0, 7, 6, 5, 4, 3, 2, 1,
-                                 7, 6, 5, 4, 3,  2, 1, 0 };
-    static const int ilb[32] =
-    {
-        2048, 2093, 2139, 2186, 2233, 2282, 2332,
-        2383, 2435, 2489, 2543, 2599, 2656, 2714,
-        2774, 2834, 2896, 2960, 3025, 3091, 3158,
-        3228, 3298, 3371, 3444, 3520, 3597, 3676,
-        3756, 3838, 3922, 4008
-    };
-    static const int wh[3] = {0, -214, 798};
-    static const int rh2[4] = {2, 1, 2, 1};
-    static const int qm2[4] = {-7408, -1616,  7408,   1616};
-    static const int qm4[16] =
-    {
-              0, -20456, -12896,  -8968,
-          -6288,  -4240,  -2584,  -1200,
-          20456,  12896,   8968,   6288,
-           4240,   2584,   1200,      0
-    };
-    static const int qm5[32] =
-    {
-           -280,   -280, -23352, -17560,
-         -14120, -11664,  -9752,  -8184,
-          -6864,  -5712,  -4696,  -3784,
-          -2960,  -2208,  -1520,   -880,
-          23352,  17560,  14120,  11664,
-           9752,   8184,   6864,   5712,
-           4696,   3784,   2960,   2208,
-           1520,    880,    280,   -280
-    };
-    static const int qm6[64] =
-    {
-           -136,   -136,   -136,   -136,
-         -24808, -21904, -19008, -16704,
-         -14984, -13512, -12280, -11192,
-         -10232,  -9360,  -8576,  -7856,
-          -7192,  -6576,  -6000,  -5456,
-          -4944,  -4464,  -4008,  -3576,
-          -3168,  -2776,  -2400,  -2032,
-          -1688,  -1360,  -1040,   -728,
-          24808,  21904,  19008,  16704,
-          14984,  13512,  12280,  11192,
-          10232,   9360,   8576,   7856,
-           7192,   6576,   6000,   5456,
-           4944,   4464,   4008,   3576,
-           3168,   2776,   2400,   2032,
-           1688,   1360,   1040,    728,
-            432,    136,   -432,   -136
-    };
-    static const int qmf_coeffs[12] =
-    {
-           3,  -11,   12,   32, -210,  951, 3876, -805,  362, -156,   53,  -11,
-    };
-
-    int dlowt;
-    int rlow;
-    int ihigh;
-    int dhigh;
-    int rhigh;
-    int xout1;
-    int xout2;
-    int wd1;
-    int wd2;
-    int wd3;
-    int code;
-    size_t outlen;
-    int i;
-    size_t j;
-
-    outlen = 0;
-    rhigh = 0;
-    for (j = 0;  j < len;  )
-    {
-        if (s->packed)
-        {
-            /* Unpack the code bits */
-            if (s->in_bits < s->bits_per_sample)
-            {
-                s->in_buffer |= (g722_data[j++] << s->in_bits);
-                s->in_bits += 8;
-            }
-            code = s->in_buffer & ((1 << s->bits_per_sample) - 1);
-            s->in_buffer >>= s->bits_per_sample;
-            s->in_bits -= s->bits_per_sample;
-        }
-        else
-        {
-            code = g722_data[j++];
-        }
-
-        switch (s->bits_per_sample)
-        {
-        default:
-        case 8:
-            wd1 = code & 0x3F;
-            ihigh = (code >> 6) & 0x03;
-            wd2 = qm6[wd1];
-            wd1 >>= 2;
-            break;
-        case 7:
-            wd1 = code & 0x1F;
-            ihigh = (code >> 5) & 0x03;
-            wd2 = qm5[wd1];
-            wd1 >>= 1;
-            break;
-        case 6:
-            wd1 = code & 0x0F;
-            ihigh = (code >> 4) & 0x03;
-            wd2 = qm4[wd1];
-            break;
-        }
-        /* Block 5L, LOW BAND INVQBL */
-        wd2 = (s->band[0].det*wd2) >> 15;
-        /* Block 5L, RECONS */
-        rlow = s->band[0].s + wd2;
-        /* Block 6L, LIMIT */
-        if (rlow > 16383)
-            rlow = 16383;
-        else if (rlow < -16384)
-            rlow = -16384;
-
-        /* Block 2L, INVQAL */
-        wd2 = qm4[wd1];
-        dlowt = (s->band[0].det*wd2) >> 15;
-
-        /* Block 3L, LOGSCL */
-        wd2 = rl42[wd1];
-        wd1 = (s->band[0].nb*127) >> 7;
-        wd1 += wl[wd2];
-        if (wd1 < 0)
-            wd1 = 0;
-        else if (wd1 > 18432)
-            wd1 = 18432;
-        s->band[0].nb = wd1;
-
-        /* Block 3L, SCALEL */
-        wd1 = (s->band[0].nb >> 6) & 31;
-        wd2 = 8 - (s->band[0].nb >> 11);
-        wd3 = (wd2 < 0)  ?  (ilb[wd1] << -wd2)  :  (ilb[wd1] >> wd2);
-        s->band[0].det = wd3 << 2;
-
-        block4(s, 0, dlowt);
-
-        if (!s->eight_k)
-        {
-            /* Block 2H, INVQAH */
-            wd2 = qm2[ihigh];
-            dhigh = (s->band[1].det*wd2) >> 15;
-            /* Block 5H, RECONS */
-            rhigh = dhigh + s->band[1].s;
-            /* Block 6H, LIMIT */
-            if (rhigh > 16383)
-                rhigh = 16383;
-            else if (rhigh < -16384)
-                rhigh = -16384;
-
-            /* Block 2H, INVQAH */
-            wd2 = rh2[ihigh];
-            wd1 = (s->band[1].nb*127) >> 7;
-            wd1 += wh[wd2];
-            if (wd1 < 0)
-                wd1 = 0;
-            else if (wd1 > 22528)
-                wd1 = 22528;
-            s->band[1].nb = wd1;
-
-            /* Block 3H, SCALEH */
-            wd1 = (s->band[1].nb >> 6) & 31;
-            wd2 = 10 - (s->band[1].nb >> 11);
-            wd3 = (wd2 < 0)  ?  (ilb[wd1] << -wd2)  :  (ilb[wd1] >> wd2);
-            s->band[1].det = wd3 << 2;
-
-            block4(s, 1, dhigh);
-        }
-
-        if (s->itu_test_mode)
-        {
-            amp[outlen++] = (int16_t) (rlow << 1);
-            amp[outlen++] = (int16_t) (rhigh << 1);
-        }
-        else
-        {
-            if (s->eight_k)
-            {
-                amp[outlen++] = (int16_t) (rlow << 1);
-            }
-            else
-            {
-                /* Apply the receive QMF */
-                for (i = 0;  i < 22;  i++)
-                    s->x[i] = s->x[i + 2];
-                s->x[22] = rlow + rhigh;
-                s->x[23] = rlow - rhigh;
-
-                xout1 = 0;
-                xout2 = 0;
-                for (i = 0;  i < 12;  i++)
-                {
-                    xout2 += s->x[2*i]*qmf_coeffs[i];
-                    xout1 += s->x[2*i + 1]*qmf_coeffs[11 - i];
-                }
-                /* We shift by 12 to allow for the QMF filters (DC gain = 4096), less 1
-                   to allow for the 15 bit input to the G.722 algorithm. */
-                /* WebRtc, tlegrand: added saturation */
-                amp[outlen++] = saturate(xout1 >> 11);
-                amp[outlen++] = saturate(xout2 >> 11);
-            }
-        }
-    }
-    return outlen;
-}
-/*- End of function --------------------------------------------------------*/
-/*- End of file ------------------------------------------------------------*/
diff --git a/modules/audio_coding/codecs/g722/g722_enc_dec.h b/modules/audio_coding/codecs/g722/g722_enc_dec.h
deleted file mode 100644
index 7db4895..0000000
--- a/modules/audio_coding/codecs/g722/g722_enc_dec.h
+++ /dev/null
@@ -1,160 +0,0 @@
-/*
- * SpanDSP - a series of DSP components for telephony
- *
- * g722.h - The ITU G.722 codec.
- *
- * Written by Steve Underwood <steveu@coppice.org>
- *
- * Copyright (C) 2005 Steve Underwood
- *
- *  Despite my general liking of the GPL, I place my own contributions 
- *  to this code in the public domain for the benefit of all mankind -
- *  even the slimy ones who might try to proprietize my work and use it
- *  to my detriment.
- *
- * Based on a single channel G.722 codec which is:
- *
- *****    Copyright (c) CMU    1993      *****
- * Computer Science, Speech Group
- * Chengxiang Lu and Alex Hauptmann
- *
- * $Id: g722.h,v 1.10 2006/06/16 12:45:53 steveu Exp $
- *
- * Modifications for WebRtc, 2011/04/28, by tlegrand:
- * -Changed to use WebRtc types
- * -Added new defines for minimum and maximum values of short int
- */
-
-
-/*! \file */
-
-#if !defined(_G722_ENC_DEC_H_)
-#define _G722_ENC_DEC_H_
-
-#include "webrtc/typedefs.h"
-
-/*! \page g722_page G.722 encoding and decoding
-\section g722_page_sec_1 What does it do?
-The G.722 module is a bit exact implementation of the ITU G.722 specification for all three
-specified bit rates - 64000bps, 56000bps and 48000bps. It passes the ITU tests.
-
-To allow fast and flexible interworking with narrow band telephony, the encoder and decoder
-support an option for the linear audio to be an 8k samples/second stream. In this mode the
-codec is considerably faster, and still fully compatible with wideband terminals using G.722.
-
-\section g722_page_sec_2 How does it work?
-???.
-*/
-
-#define WEBRTC_INT16_MAX 32767
-#define WEBRTC_INT16_MIN -32768
-
-enum
-{
-    G722_SAMPLE_RATE_8000 = 0x0001,
-    G722_PACKED = 0x0002
-};
-
-typedef struct
-{
-    /*! TRUE if the operating in the special ITU test mode, with the band split filters
-             disabled. */
-    int itu_test_mode;
-    /*! TRUE if the G.722 data is packed */
-    int packed;
-    /*! TRUE if encode from 8k samples/second */
-    int eight_k;
-    /*! 6 for 48000kbps, 7 for 56000kbps, or 8 for 64000kbps. */
-    int bits_per_sample;
-
-    /*! Signal history for the QMF */
-    int x[24];
-
-    struct
-    {
-        int s;
-        int sp;
-        int sz;
-        int r[3];
-        int a[3];
-        int ap[3];
-        int p[3];
-        int d[7];
-        int b[7];
-        int bp[7];
-        int sg[7];
-        int nb;
-        int det;
-    } band[2];
-
-    unsigned int in_buffer;
-    int in_bits;
-    unsigned int out_buffer;
-    int out_bits;
-} G722EncoderState;
-
-typedef struct
-{
-    /*! TRUE if the operating in the special ITU test mode, with the band split filters
-             disabled. */
-    int itu_test_mode;
-    /*! TRUE if the G.722 data is packed */
-    int packed;
-    /*! TRUE if decode to 8k samples/second */
-    int eight_k;
-    /*! 6 for 48000kbps, 7 for 56000kbps, or 8 for 64000kbps. */
-    int bits_per_sample;
-
-    /*! Signal history for the QMF */
-    int x[24];
-
-    struct
-    {
-        int s;
-        int sp;
-        int sz;
-        int r[3];
-        int a[3];
-        int ap[3];
-        int p[3];
-        int d[7];
-        int b[7];
-        int bp[7];
-        int sg[7];
-        int nb;
-        int det;
-    } band[2];
-    
-    unsigned int in_buffer;
-    int in_bits;
-    unsigned int out_buffer;
-    int out_bits;
-} G722DecoderState;
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-G722EncoderState* WebRtc_g722_encode_init(G722EncoderState* s,
-                                          int rate,
-                                          int options);
-int WebRtc_g722_encode_release(G722EncoderState *s);
-size_t WebRtc_g722_encode(G722EncoderState *s,
-                          uint8_t g722_data[],
-                          const int16_t amp[],
-                          size_t len);
-
-G722DecoderState* WebRtc_g722_decode_init(G722DecoderState* s,
-                                          int rate,
-                                          int options);
-int WebRtc_g722_decode_release(G722DecoderState *s);
-size_t WebRtc_g722_decode(G722DecoderState *s,
-                          int16_t amp[],
-                          const uint8_t g722_data[],
-                          size_t len);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/modules/audio_coding/codecs/g722/g722_encode.c b/modules/audio_coding/codecs/g722/g722_encode.c
deleted file mode 100644
index 2bd784b..0000000
--- a/modules/audio_coding/codecs/g722/g722_encode.c
+++ /dev/null
@@ -1,430 +0,0 @@
-/*
- * SpanDSP - a series of DSP components for telephony
- *
- * g722_encode.c - The ITU G.722 codec, encode part.
- *
- * Written by Steve Underwood <steveu@coppice.org>
- *
- * Copyright (C) 2005 Steve Underwood
- *
- * All rights reserved.
- *
- *  Despite my general liking of the GPL, I place my own contributions
- *  to this code in the public domain for the benefit of all mankind -
- *  even the slimy ones who might try to proprietize my work and use it
- *  to my detriment.
- *
- * Based on a single channel 64kbps only G.722 codec which is:
- *
- *****    Copyright (c) CMU    1993      *****
- * Computer Science, Speech Group
- * Chengxiang Lu and Alex Hauptmann
- *
- * $Id: g722_encode.c,v 1.14 2006/07/07 16:37:49 steveu Exp $
- *
- * Modifications for WebRtc, 2011/04/28, by tlegrand:
- * -Removed usage of inttypes.h and tgmath.h
- * -Changed to use WebRtc types
- * -Added option to run encoder bitexact with ITU-T reference implementation
- */
-
-/*! \file */
-
-#include <memory.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-#include "g722_enc_dec.h"
-#include "webrtc/typedefs.h"
-
-#if !defined(FALSE)
-#define FALSE 0
-#endif
-#if !defined(TRUE)
-#define TRUE (!FALSE)
-#endif
-
-static __inline int16_t saturate(int32_t amp)
-{
-    int16_t amp16;
-
-    /* Hopefully this is optimised for the common case - not clipping */
-    amp16 = (int16_t) amp;
-    if (amp == amp16)
-        return amp16;
-    if (amp > WEBRTC_INT16_MAX)
-        return  WEBRTC_INT16_MAX;
-    return  WEBRTC_INT16_MIN;
-}
-/*- End of function --------------------------------------------------------*/
-
-static void block4(G722EncoderState *s, int band, int d)
-{
-    int wd1;
-    int wd2;
-    int wd3;
-    int i;
-
-    /* Block 4, RECONS */
-    s->band[band].d[0] = d;
-    s->band[band].r[0] = saturate(s->band[band].s + d);
-
-    /* Block 4, PARREC */
-    s->band[band].p[0] = saturate(s->band[band].sz + d);
-
-    /* Block 4, UPPOL2 */
-    for (i = 0;  i < 3;  i++)
-        s->band[band].sg[i] = s->band[band].p[i] >> 15;
-    wd1 = saturate(s->band[band].a[1] << 2);
-
-    wd2 = (s->band[band].sg[0] == s->band[band].sg[1])  ?  -wd1  :  wd1;
-    if (wd2 > 32767)
-        wd2 = 32767;
-    wd3 = (wd2 >> 7) + ((s->band[band].sg[0] == s->band[band].sg[2])  ?  128  :  -128);
-    wd3 += (s->band[band].a[2]*32512) >> 15;
-    if (wd3 > 12288)
-        wd3 = 12288;
-    else if (wd3 < -12288)
-        wd3 = -12288;
-    s->band[band].ap[2] = wd3;
-
-    /* Block 4, UPPOL1 */
-    s->band[band].sg[0] = s->band[band].p[0] >> 15;
-    s->band[band].sg[1] = s->band[band].p[1] >> 15;
-    wd1 = (s->band[band].sg[0] == s->band[band].sg[1])  ?  192  :  -192;
-    wd2 = (s->band[band].a[1]*32640) >> 15;
-
-    s->band[band].ap[1] = saturate(wd1 + wd2);
-    wd3 = saturate(15360 - s->band[band].ap[2]);
-    if (s->band[band].ap[1] > wd3)
-        s->band[band].ap[1] = wd3;
-    else if (s->band[band].ap[1] < -wd3)
-        s->band[band].ap[1] = -wd3;
-
-    /* Block 4, UPZERO */
-    wd1 = (d == 0)  ?  0  :  128;
-    s->band[band].sg[0] = d >> 15;
-    for (i = 1;  i < 7;  i++)
-    {
-        s->band[band].sg[i] = s->band[band].d[i] >> 15;
-        wd2 = (s->band[band].sg[i] == s->band[band].sg[0])  ?  wd1  :  -wd1;
-        wd3 = (s->band[band].b[i]*32640) >> 15;
-        s->band[band].bp[i] = saturate(wd2 + wd3);
-    }
-
-    /* Block 4, DELAYA */
-    for (i = 6;  i > 0;  i--)
-    {
-        s->band[band].d[i] = s->band[band].d[i - 1];
-        s->band[band].b[i] = s->band[band].bp[i];
-    }
-
-    for (i = 2;  i > 0;  i--)
-    {
-        s->band[band].r[i] = s->band[band].r[i - 1];
-        s->band[band].p[i] = s->band[band].p[i - 1];
-        s->band[band].a[i] = s->band[band].ap[i];
-    }
-
-    /* Block 4, FILTEP */
-    wd1 = saturate(s->band[band].r[1] + s->band[band].r[1]);
-    wd1 = (s->band[band].a[1]*wd1) >> 15;
-    wd2 = saturate(s->band[band].r[2] + s->band[band].r[2]);
-    wd2 = (s->band[band].a[2]*wd2) >> 15;
-    s->band[band].sp = saturate(wd1 + wd2);
-
-    /* Block 4, FILTEZ */
-    s->band[band].sz = 0;
-    for (i = 6;  i > 0;  i--)
-    {
-        wd1 = saturate(s->band[band].d[i] + s->band[band].d[i]);
-        s->band[band].sz += (s->band[band].b[i]*wd1) >> 15;
-    }
-    s->band[band].sz = saturate(s->band[band].sz);
-
-    /* Block 4, PREDIC */
-    s->band[band].s = saturate(s->band[band].sp + s->band[band].sz);
-}
-/*- End of function --------------------------------------------------------*/
-
-G722EncoderState* WebRtc_g722_encode_init(G722EncoderState* s,
-                                          int rate,
-                                          int options) {
-    if (s == NULL)
-    {
-        if ((s = (G722EncoderState *) malloc(sizeof(*s))) == NULL)
-            return NULL;
-    }
-    memset(s, 0, sizeof(*s));
-    if (rate == 48000)
-        s->bits_per_sample = 6;
-    else if (rate == 56000)
-        s->bits_per_sample = 7;
-    else
-        s->bits_per_sample = 8;
-    if ((options & G722_SAMPLE_RATE_8000))
-        s->eight_k = TRUE;
-    if ((options & G722_PACKED)  &&  s->bits_per_sample != 8)
-        s->packed = TRUE;
-    else
-        s->packed = FALSE;
-    s->band[0].det = 32;
-    s->band[1].det = 8;
-    return s;
-}
-/*- End of function --------------------------------------------------------*/
-
-int WebRtc_g722_encode_release(G722EncoderState *s)
-{
-    free(s);
-    return 0;
-}
-/*- End of function --------------------------------------------------------*/
-
-/* WebRtc, tlegrand:
- * Only define the following if bit-exactness with reference implementation
- * is needed. Will only have any effect if input signal is saturated.
- */
-//#define RUN_LIKE_REFERENCE_G722
-#ifdef RUN_LIKE_REFERENCE_G722
-int16_t limitValues (int16_t rl)
-{
-
-    int16_t yl;
-
-    yl = (rl > 16383) ? 16383 : ((rl < -16384) ? -16384 : rl);
-
-    return (yl);
-}
-#endif
-
-size_t WebRtc_g722_encode(G722EncoderState *s, uint8_t g722_data[],
-                          const int16_t amp[], size_t len)
-{
-    static const int q6[32] =
-    {
-           0,   35,   72,  110,  150,  190,  233,  276,
-         323,  370,  422,  473,  530,  587,  650,  714,
-         786,  858,  940, 1023, 1121, 1219, 1339, 1458,
-        1612, 1765, 1980, 2195, 2557, 2919,    0,    0
-    };
-    static const int iln[32] =
-    {
-         0, 63, 62, 31, 30, 29, 28, 27,
-        26, 25, 24, 23, 22, 21, 20, 19,
-        18, 17, 16, 15, 14, 13, 12, 11,
-        10,  9,  8,  7,  6,  5,  4,  0
-    };
-    static const int ilp[32] =
-    {
-         0, 61, 60, 59, 58, 57, 56, 55,
-        54, 53, 52, 51, 50, 49, 48, 47,
-        46, 45, 44, 43, 42, 41, 40, 39,
-        38, 37, 36, 35, 34, 33, 32,  0
-    };
-    static const int wl[8] =
-    {
-        -60, -30, 58, 172, 334, 538, 1198, 3042
-    };
-    static const int rl42[16] =
-    {
-        0, 7, 6, 5, 4, 3, 2, 1, 7, 6, 5, 4, 3, 2, 1, 0
-    };
-    static const int ilb[32] =
-    {
-        2048, 2093, 2139, 2186, 2233, 2282, 2332,
-        2383, 2435, 2489, 2543, 2599, 2656, 2714,
-        2774, 2834, 2896, 2960, 3025, 3091, 3158,
-        3228, 3298, 3371, 3444, 3520, 3597, 3676,
-        3756, 3838, 3922, 4008
-    };
-    static const int qm4[16] =
-    {
-             0, -20456, -12896, -8968,
-         -6288,  -4240,  -2584, -1200,
-         20456,  12896,   8968,  6288,
-          4240,   2584,   1200,     0
-    };
-    static const int qm2[4] =
-    {
-        -7408,  -1616,   7408,   1616
-    };
-    static const int qmf_coeffs[12] =
-    {
-           3,  -11,   12,   32, -210,  951, 3876, -805,  362, -156,   53,  -11,
-    };
-    static const int ihn[3] = {0, 1, 0};
-    static const int ihp[3] = {0, 3, 2};
-    static const int wh[3] = {0, -214, 798};
-    static const int rh2[4] = {2, 1, 2, 1};
-
-    int dlow;
-    int dhigh;
-    int el;
-    int wd;
-    int wd1;
-    int ril;
-    int wd2;
-    int il4;
-    int ih2;
-    int wd3;
-    int eh;
-    int mih;
-    int i;
-    size_t j;
-    /* Low and high band PCM from the QMF */
-    int xlow;
-    int xhigh;
-    size_t g722_bytes;
-    /* Even and odd tap accumulators */
-    int sumeven;
-    int sumodd;
-    int ihigh;
-    int ilow;
-    int code;
-
-    g722_bytes = 0;
-    xhigh = 0;
-    for (j = 0;  j < len;  )
-    {
-        if (s->itu_test_mode)
-        {
-            xlow =
-            xhigh = amp[j++] >> 1;
-        }
-        else
-        {
-            if (s->eight_k)
-            {
-                /* We shift by 1 to allow for the 15 bit input to the G.722 algorithm. */
-                xlow = amp[j++] >> 1;
-            }
-            else
-            {
-                /* Apply the transmit QMF */
-                /* Shuffle the buffer down */
-                for (i = 0;  i < 22;  i++)
-                    s->x[i] = s->x[i + 2];
-                s->x[22] = amp[j++];
-                s->x[23] = amp[j++];
-
-                /* Discard every other QMF output */
-                sumeven = 0;
-                sumodd = 0;
-                for (i = 0;  i < 12;  i++)
-                {
-                    sumodd += s->x[2*i]*qmf_coeffs[i];
-                    sumeven += s->x[2*i + 1]*qmf_coeffs[11 - i];
-                }
-                /* We shift by 12 to allow for the QMF filters (DC gain = 4096), plus 1
-                   to allow for us summing two filters, plus 1 to allow for the 15 bit
-                   input to the G.722 algorithm. */
-                xlow = (sumeven + sumodd) >> 14;
-                xhigh = (sumeven - sumodd) >> 14;
-
-#ifdef RUN_LIKE_REFERENCE_G722
-                /* The following lines are only used to verify bit-exactness
-                 * with reference implementation of G.722. Higher precision
-                 * is achieved without limiting the values.
-                 */
-                xlow = limitValues(xlow);
-                xhigh = limitValues(xhigh);
-#endif
-            }
-        }
-        /* Block 1L, SUBTRA */
-        el = saturate(xlow - s->band[0].s);
-
-        /* Block 1L, QUANTL */
-        wd = (el >= 0)  ?  el  :  -(el + 1);
-
-        for (i = 1;  i < 30;  i++)
-        {
-            wd1 = (q6[i]*s->band[0].det) >> 12;
-            if (wd < wd1)
-                break;
-        }
-        ilow = (el < 0)  ?  iln[i]  :  ilp[i];
-
-        /* Block 2L, INVQAL */
-        ril = ilow >> 2;
-        wd2 = qm4[ril];
-        dlow = (s->band[0].det*wd2) >> 15;
-
-        /* Block 3L, LOGSCL */
-        il4 = rl42[ril];
-        wd = (s->band[0].nb*127) >> 7;
-        s->band[0].nb = wd + wl[il4];
-        if (s->band[0].nb < 0)
-            s->band[0].nb = 0;
-        else if (s->band[0].nb > 18432)
-            s->band[0].nb = 18432;
-
-        /* Block 3L, SCALEL */
-        wd1 = (s->band[0].nb >> 6) & 31;
-        wd2 = 8 - (s->band[0].nb >> 11);
-        wd3 = (wd2 < 0)  ?  (ilb[wd1] << -wd2)  :  (ilb[wd1] >> wd2);
-        s->band[0].det = wd3 << 2;
-
-        block4(s, 0, dlow);
-
-        if (s->eight_k)
-        {
-            /* Just leave the high bits as zero */
-            code = (0xC0 | ilow) >> (8 - s->bits_per_sample);
-        }
-        else
-        {
-            /* Block 1H, SUBTRA */
-            eh = saturate(xhigh - s->band[1].s);
-
-            /* Block 1H, QUANTH */
-            wd = (eh >= 0)  ?  eh  :  -(eh + 1);
-            wd1 = (564*s->band[1].det) >> 12;
-            mih = (wd >= wd1)  ?  2  :  1;
-            ihigh = (eh < 0)  ?  ihn[mih]  :  ihp[mih];
-
-            /* Block 2H, INVQAH */
-            wd2 = qm2[ihigh];
-            dhigh = (s->band[1].det*wd2) >> 15;
-
-            /* Block 3H, LOGSCH */
-            ih2 = rh2[ihigh];
-            wd = (s->band[1].nb*127) >> 7;
-            s->band[1].nb = wd + wh[ih2];
-            if (s->band[1].nb < 0)
-                s->band[1].nb = 0;
-            else if (s->band[1].nb > 22528)
-                s->band[1].nb = 22528;
-
-            /* Block 3H, SCALEH */
-            wd1 = (s->band[1].nb >> 6) & 31;
-            wd2 = 10 - (s->band[1].nb >> 11);
-            wd3 = (wd2 < 0)  ?  (ilb[wd1] << -wd2)  :  (ilb[wd1] >> wd2);
-            s->band[1].det = wd3 << 2;
-
-            block4(s, 1, dhigh);
-            code = ((ihigh << 6) | ilow) >> (8 - s->bits_per_sample);
-        }
-
-        if (s->packed)
-        {
-            /* Pack the code bits */
-            s->out_buffer |= (code << s->out_bits);
-            s->out_bits += s->bits_per_sample;
-            if (s->out_bits >= 8)
-            {
-                g722_data[g722_bytes++] = (uint8_t) (s->out_buffer & 0xFF);
-                s->out_bits -= 8;
-                s->out_buffer >>= 8;
-            }
-        }
-        else
-        {
-            g722_data[g722_bytes++] = (uint8_t) code;
-        }
-    }
-    return g722_bytes;
-}
-/*- End of function --------------------------------------------------------*/
-/*- End of file ------------------------------------------------------------*/
diff --git a/modules/audio_coding/codecs/g722/g722_interface.c b/modules/audio_coding/codecs/g722/g722_interface.c
deleted file mode 100644
index 4244d5c..0000000
--- a/modules/audio_coding/codecs/g722/g722_interface.c
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- *  Copyright (c) 2011 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 <stdlib.h>
-#include <string.h>
-#include "g722_enc_dec.h"
-#include "g722_interface.h"
-#include "webrtc/typedefs.h"
-
-int16_t WebRtcG722_CreateEncoder(G722EncInst **G722enc_inst)
-{
-    *G722enc_inst=(G722EncInst*)malloc(sizeof(G722EncoderState));
-    if (*G722enc_inst!=NULL) {
-      return(0);
-    } else {
-      return(-1);
-    }
-}
-
-int16_t WebRtcG722_EncoderInit(G722EncInst *G722enc_inst)
-{
-    // Create and/or reset the G.722 encoder
-    // Bitrate 64 kbps and wideband mode (2)
-    G722enc_inst = (G722EncInst *) WebRtc_g722_encode_init(
-        (G722EncoderState*) G722enc_inst, 64000, 2);
-    if (G722enc_inst == NULL) {
-        return -1;
-    } else {
-        return 0;
-    }
-}
-
-int WebRtcG722_FreeEncoder(G722EncInst *G722enc_inst)
-{
-    // Free encoder memory
-    return WebRtc_g722_encode_release((G722EncoderState*) G722enc_inst);
-}
-
-size_t WebRtcG722_Encode(G722EncInst *G722enc_inst,
-                         const int16_t* speechIn,
-                         size_t len,
-                         uint8_t* encoded)
-{
-    unsigned char *codechar = (unsigned char*) encoded;
-    // Encode the input speech vector
-    return WebRtc_g722_encode((G722EncoderState*) G722enc_inst, codechar,
-                              speechIn, len);
-}
-
-int16_t WebRtcG722_CreateDecoder(G722DecInst **G722dec_inst)
-{
-    *G722dec_inst=(G722DecInst*)malloc(sizeof(G722DecoderState));
-    if (*G722dec_inst!=NULL) {
-      return(0);
-    } else {
-      return(-1);
-    }
-}
-
-void WebRtcG722_DecoderInit(G722DecInst* inst) {
-  // Create and/or reset the G.722 decoder
-  // Bitrate 64 kbps and wideband mode (2)
-  WebRtc_g722_decode_init((G722DecoderState*)inst, 64000, 2);
-}
-
-int WebRtcG722_FreeDecoder(G722DecInst *G722dec_inst)
-{
-    // Free encoder memory
-    return WebRtc_g722_decode_release((G722DecoderState*) G722dec_inst);
-}
-
-size_t WebRtcG722_Decode(G722DecInst *G722dec_inst,
-                         const uint8_t *encoded,
-                         size_t len,
-                         int16_t *decoded,
-                         int16_t *speechType)
-{
-    // Decode the G.722 encoder stream
-    *speechType=G722_WEBRTC_SPEECH;
-    return WebRtc_g722_decode((G722DecoderState*) G722dec_inst, decoded,
-                              encoded, len);
-}
-
-int16_t WebRtcG722_Version(char *versionStr, short len)
-{
-    // Get version string
-    char version[30] = "2.0.0\n";
-    if (strlen(version) < (unsigned int)len)
-    {
-        strcpy(versionStr, version);
-        return 0;
-    }
-    else
-    {
-        return -1;
-    }
-}
-
diff --git a/modules/audio_coding/codecs/g722/g722_interface.h b/modules/audio_coding/codecs/g722/g722_interface.h
deleted file mode 100644
index b411ef0..0000000
--- a/modules/audio_coding/codecs/g722/g722_interface.h
+++ /dev/null
@@ -1,182 +0,0 @@
-/*
- *  Copyright (c) 2011 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_CODECS_G722_G722_INTERFACE_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_G722_G722_INTERFACE_H_
-
-#include "webrtc/typedefs.h"
-
-/*
- * Solution to support multiple instances
- */
-
-typedef struct WebRtcG722EncInst    G722EncInst;
-typedef struct WebRtcG722DecInst    G722DecInst;
-
-/*
- * Comfort noise constants
- */
-
-#define G722_WEBRTC_SPEECH     1
-#define G722_WEBRTC_CNG        2
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-
-/****************************************************************************
- * WebRtcG722_CreateEncoder(...)
- *
- * Create memory used for G722 encoder
- *
- * Input:
- *     - G722enc_inst         : G722 instance for encoder
- *
- * Return value               :  0 - Ok
- *                              -1 - Error
- */
-int16_t WebRtcG722_CreateEncoder(G722EncInst **G722enc_inst);
-
-
-/****************************************************************************
- * WebRtcG722_EncoderInit(...)
- *
- * This function initializes a G722 instance
- *
- * Input:
- *     - G722enc_inst         : G722 instance, i.e. the user that should receive
- *                             be initialized
- *
- * Return value               :  0 - Ok
- *                              -1 - Error
- */
-
-int16_t WebRtcG722_EncoderInit(G722EncInst *G722enc_inst);
-
-
-/****************************************************************************
- * WebRtcG722_FreeEncoder(...)
- *
- * Free the memory used for G722 encoder
- *
- * Input:
- *     - G722enc_inst         : G722 instance for encoder
- *
- * Return value               :  0 - Ok
- *                              -1 - Error
- */
-int WebRtcG722_FreeEncoder(G722EncInst *G722enc_inst);
-
-
-
-/****************************************************************************
- * WebRtcG722_Encode(...)
- *
- * This function encodes G722 encoded data.
- *
- * Input:
- *     - G722enc_inst         : G722 instance, i.e. the user that should encode
- *                              a packet
- *     - speechIn             : Input speech vector
- *     - len                  : Samples in speechIn
- *
- * Output:
- *        - encoded           : The encoded data vector
- *
- * Return value               : Length (in bytes) of coded data
- */
-
-size_t WebRtcG722_Encode(G722EncInst* G722enc_inst,
-                         const int16_t* speechIn,
-                         size_t len,
-                         uint8_t* encoded);
-
-
-/****************************************************************************
- * WebRtcG722_CreateDecoder(...)
- *
- * Create memory used for G722 encoder
- *
- * Input:
- *     - G722dec_inst         : G722 instance for decoder
- *
- * Return value               :  0 - Ok
- *                              -1 - Error
- */
-int16_t WebRtcG722_CreateDecoder(G722DecInst **G722dec_inst);
-
-/****************************************************************************
- * WebRtcG722_DecoderInit(...)
- *
- * This function initializes a G722 instance
- *
- * Input:
- *     - inst      : G722 instance
- */
-
-void WebRtcG722_DecoderInit(G722DecInst* inst);
-
-/****************************************************************************
- * WebRtcG722_FreeDecoder(...)
- *
- * Free the memory used for G722 decoder
- *
- * Input:
- *     - G722dec_inst         : G722 instance for decoder
- *
- * Return value               :  0 - Ok
- *                              -1 - Error
- */
-
-int WebRtcG722_FreeDecoder(G722DecInst *G722dec_inst);
-
-
-/****************************************************************************
- * WebRtcG722_Decode(...)
- *
- * This function decodes a packet with G729 frame(s). Output speech length
- * will be a multiple of 80 samples (80*frames/packet).
- *
- * Input:
- *     - G722dec_inst       : G722 instance, i.e. the user that should decode
- *                            a packet
- *     - encoded            : Encoded G722 frame(s)
- *     - len                : Bytes in encoded vector
- *
- * Output:
- *        - decoded         : The decoded vector
- *      - speechType        : 1 normal, 2 CNG (Since G722 does not have its own
- *                            DTX/CNG scheme it should always return 1)
- *
- * Return value             : Samples in decoded vector
- */
-
-size_t WebRtcG722_Decode(G722DecInst *G722dec_inst,
-                         const uint8_t* encoded,
-                         size_t len,
-                         int16_t *decoded,
-                         int16_t *speechType);
-
-/****************************************************************************
- * WebRtcG722_Version(...)
- *
- * Get a string with the current version of the codec
- */
-
-int16_t WebRtcG722_Version(char *versionStr, short len);
-
-
-#ifdef __cplusplus
-}
-#endif
-
-
-#endif /* WEBRTC_MODULES_AUDIO_CODING_CODECS_G722_G722_INTERFACE_H_ */
diff --git a/modules/audio_coding/codecs/g722/test/testG722.cc b/modules/audio_coding/codecs/g722/test/testG722.cc
deleted file mode 100644
index c55a2eb..0000000
--- a/modules/audio_coding/codecs/g722/test/testG722.cc
+++ /dev/null
@@ -1,158 +0,0 @@
-/*
- *  Copyright (c) 2012 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.
- */
-
-/*
- * testG722.cpp : Defines the entry point for the console application.
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include "webrtc/typedefs.h"
-
-/* include API */
-#include "webrtc/modules/audio_coding/codecs/g722/g722_interface.h"
-
-/* Runtime statistics */
-#include <time.h>
-#define CLOCKS_PER_SEC_G722  100000
-
-// Forward declaration
-typedef struct WebRtcG722EncInst    G722EncInst;
-typedef struct WebRtcG722DecInst    G722DecInst;
-
-/* function for reading audio data from PCM file */
-bool readframe(int16_t *data, FILE *inp, size_t length)
-{
-    size_t rlen = fread(data, sizeof(int16_t), length, inp);
-    if (rlen >= length)
-      return false;
-    memset(data + rlen, 0, (length - rlen) * sizeof(int16_t));
-    return true;
-}
-
-int main(int argc, char* argv[])
-{
-    char inname[60], outbit[40], outname[40];
-    FILE *inp, *outbitp, *outp;
-
-    int framecnt;
-    bool endfile;
-    size_t framelength = 160;
-    G722EncInst *G722enc_inst;
-    G722DecInst *G722dec_inst;
-
-    /* Runtime statistics */
-    double starttime;
-    double runtime = 0;
-    double length_file;
-
-    size_t stream_len = 0;
-    int16_t shortdata[960];
-    int16_t decoded[960];
-    uint8_t streamdata[80 * 6];
-    int16_t speechType[1];
-
-    /* handling wrong input arguments in the command line */
-    if (argc!=5)  {
-        printf("\n\nWrong number of arguments or flag values.\n\n");
-
-        printf("\n");
-        printf("Usage:\n\n");
-        printf("./testG722.exe framelength infile outbitfile outspeechfile \n\n");
-        printf("with:\n");
-        printf("framelength  :    Framelength in samples.\n\n");
-        printf("infile       :    Normal speech input file\n\n");
-        printf("outbitfile   :    Bitstream output file\n\n");
-        printf("outspeechfile:    Speech output file\n\n");
-        exit(0);
-
-    }
-
-    /* Get frame length */
-    int framelength_int = atoi(argv[1]);
-    if (framelength_int < 0) {
-        printf("  G.722: Invalid framelength %d.\n", framelength_int);
-        exit(1);
-    }
-    framelength = static_cast<size_t>(framelength_int);
-
-    /* Get Input and Output files */
-    sscanf(argv[2], "%s", inname);
-    sscanf(argv[3], "%s", outbit);
-    sscanf(argv[4], "%s", outname);
-
-    if ((inp = fopen(inname,"rb")) == NULL) {
-        printf("  G.722: Cannot read file %s.\n", inname);
-        exit(1);
-    }
-    if ((outbitp = fopen(outbit,"wb")) == NULL) {
-        printf("  G.722: Cannot write file %s.\n", outbit);
-        exit(1);
-    }
-    if ((outp = fopen(outname,"wb")) == NULL) {
-        printf("  G.722: Cannot write file %s.\n", outname);
-        exit(1);
-    }
-    printf("\nInput:%s\nOutput bitstream:%s\nOutput:%s\n", inname, outbit, outname);
-
-    /* Create and init */
-    WebRtcG722_CreateEncoder((G722EncInst **)&G722enc_inst);
-    WebRtcG722_CreateDecoder((G722DecInst **)&G722dec_inst);
-    WebRtcG722_EncoderInit((G722EncInst *)G722enc_inst);
-    WebRtcG722_DecoderInit((G722DecInst *)G722dec_inst);
-
-
-    /* Initialize encoder and decoder */
-    framecnt = 0;
-    endfile = false;
-    while (!endfile) {
-        framecnt++;
-
-        /* Read speech block */
-        endfile = readframe(shortdata, inp, framelength);
-
-        /* Start clock before call to encoder and decoder */
-        starttime = clock()/(double)CLOCKS_PER_SEC_G722;
-
-        /* G.722 encoding + decoding */
-        stream_len = WebRtcG722_Encode((G722EncInst *)G722enc_inst, shortdata, framelength, streamdata);
-        WebRtcG722_Decode(G722dec_inst, streamdata, stream_len, decoded,
-                          speechType);
-
-        /* Stop clock after call to encoder and decoder */
-        runtime += (double)((clock()/(double)CLOCKS_PER_SEC_G722)-starttime);
-
-        /* Write coded bits to file */
-        if (fwrite(streamdata, sizeof(short), stream_len / 2, outbitp) !=
-            stream_len / 2) {
-          return -1;
-        }
-        /* Write coded speech to file */
-        if (fwrite(decoded, sizeof(short), framelength, outp) !=
-            framelength) {
-          return -1;
-        }
-    }
-
-    WebRtcG722_FreeEncoder((G722EncInst *)G722enc_inst);
-    WebRtcG722_FreeDecoder((G722DecInst *)G722dec_inst);
-
-    length_file = ((double)framecnt*(double)framelength/16000);
-    printf("\n\nLength of speech file: %.1f s\n", length_file);
-    printf("Time to run G.722:      %.2f s (%.2f %% of realtime)\n\n", runtime, (100*runtime/length_file));
-    printf("---------------------END----------------------\n");
-
-    fclose(inp);
-    fclose(outbitp);
-    fclose(outp);
-
-    return 0;
-}
diff --git a/modules/audio_coding/codecs/ilbc/abs_quant.c b/modules/audio_coding/codecs/ilbc/abs_quant.c
deleted file mode 100644
index 263749a..0000000
--- a/modules/audio_coding/codecs/ilbc/abs_quant.c
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_AbsQuant.c
-
-******************************************************************/
-
-#include "defines.h"
-#include "constants.h"
-#include "abs_quant_loop.h"
-
-
-/*----------------------------------------------------------------*
- *  predictive noise shaping encoding of scaled start state
- *  (subrutine for WebRtcIlbcfix_StateSearch)
- *---------------------------------------------------------------*/
-
-void WebRtcIlbcfix_AbsQuant(
-    IlbcEncoder *iLBCenc_inst,
-    /* (i) Encoder instance */
-    iLBC_bits *iLBC_encbits, /* (i/o) Encoded bits (outputs idxForMax
-                                   and idxVec, uses state_first as
-                                   input) */
-    int16_t *in,     /* (i) vector to encode */
-    int16_t *weightDenum   /* (i) denominator of synthesis filter */
-                            ) {
-  int16_t *syntOut;
-  size_t quantLen[2];
-
-  /* Stack based */
-  int16_t syntOutBuf[LPC_FILTERORDER+STATE_SHORT_LEN_30MS];
-  int16_t in_weightedVec[STATE_SHORT_LEN_30MS+LPC_FILTERORDER];
-  int16_t *in_weighted = &in_weightedVec[LPC_FILTERORDER];
-
-  /* Initialize the buffers */
-  WebRtcSpl_MemSetW16(syntOutBuf, 0, LPC_FILTERORDER+STATE_SHORT_LEN_30MS);
-  syntOut = &syntOutBuf[LPC_FILTERORDER];
-  /* Start with zero state */
-  WebRtcSpl_MemSetW16(in_weightedVec, 0, LPC_FILTERORDER);
-
-  /* Perform the quantization loop in two sections of length quantLen[i],
-     where the perceptual weighting filter is updated at the subframe
-     border */
-
-  if (iLBC_encbits->state_first) {
-    quantLen[0]=SUBL;
-    quantLen[1]=iLBCenc_inst->state_short_len-SUBL;
-  } else {
-    quantLen[0]=iLBCenc_inst->state_short_len-SUBL;
-    quantLen[1]=SUBL;
-  }
-
-  /* Calculate the weighted residual, switch perceptual weighting
-     filter at the subframe border */
-  WebRtcSpl_FilterARFastQ12(
-      in, in_weighted,
-      weightDenum, LPC_FILTERORDER+1, quantLen[0]);
-  WebRtcSpl_FilterARFastQ12(
-      &in[quantLen[0]], &in_weighted[quantLen[0]],
-      &weightDenum[LPC_FILTERORDER+1], LPC_FILTERORDER+1, quantLen[1]);
-
-  WebRtcIlbcfix_AbsQuantLoop(
-      syntOut,
-      in_weighted,
-      weightDenum,
-      quantLen,
-      iLBC_encbits->idxVec);
-
-}
diff --git a/modules/audio_coding/codecs/ilbc/abs_quant.h b/modules/audio_coding/codecs/ilbc/abs_quant.h
deleted file mode 100644
index 5154534..0000000
--- a/modules/audio_coding/codecs/ilbc/abs_quant.h
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_AbsQuant.h
-
-******************************************************************/
-
-#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_ABS_QUANT_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_ABS_QUANT_H_
-
-#include "defines.h"
-
-/*----------------------------------------------------------------*
- *  predictive noise shaping encoding of scaled start state
- *  (subrutine for WebRtcIlbcfix_StateSearch)
- *---------------------------------------------------------------*/
-
-void WebRtcIlbcfix_AbsQuant(
-    IlbcEncoder *iLBCenc_inst,
-    /* (i) Encoder instance */
-    iLBC_bits *iLBC_encbits, /* (i/o) Encoded bits (outputs idxForMax
-                                   and idxVec, uses state_first as
-                                   input) */
-    int16_t *in,     /* (i) vector to encode */
-    int16_t *weightDenum   /* (i) denominator of synthesis filter */
-                            );
-
-#endif
diff --git a/modules/audio_coding/codecs/ilbc/abs_quant_loop.c b/modules/audio_coding/codecs/ilbc/abs_quant_loop.c
deleted file mode 100644
index 4b76453..0000000
--- a/modules/audio_coding/codecs/ilbc/abs_quant_loop.c
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_AbsQuantLoop.c
-
-******************************************************************/
-
-#include "defines.h"
-#include "constants.h"
-#include "sort_sq.h"
-
-void WebRtcIlbcfix_AbsQuantLoop(int16_t *syntOutIN, int16_t *in_weightedIN,
-                                int16_t *weightDenumIN, size_t *quantLenIN,
-                                int16_t *idxVecIN ) {
-  size_t k1, k2;
-  int16_t index;
-  int32_t toQW32;
-  int32_t toQ32;
-  int16_t tmp16a;
-  int16_t xq;
-
-  int16_t *syntOut   = syntOutIN;
-  int16_t *in_weighted  = in_weightedIN;
-  int16_t *weightDenum  = weightDenumIN;
-  size_t *quantLen  = quantLenIN;
-  int16_t *idxVec   = idxVecIN;
-
-  for(k1=0;k1<2;k1++) {
-    for(k2=0;k2<quantLen[k1];k2++){
-
-      /* Filter to get the predicted value */
-      WebRtcSpl_FilterARFastQ12(
-          syntOut, syntOut,
-          weightDenum, LPC_FILTERORDER+1, 1);
-
-      /* the quantizer */
-      toQW32 = (int32_t)(*in_weighted) - (int32_t)(*syntOut);
-
-      toQ32 = (((int32_t)toQW32)<<2);
-
-      if (toQ32 > 32767) {
-        toQ32 = (int32_t) 32767;
-      } else if (toQ32 < -32768) {
-        toQ32 = (int32_t) -32768;
-      }
-
-      /* Quantize the state */
-      if (toQW32<(-7577)) {
-        /* To prevent negative overflow */
-        index=0;
-      } else if (toQW32>8151) {
-        /* To prevent positive overflow */
-        index=7;
-      } else {
-        /* Find the best quantization index
-           (state_sq3Tbl is in Q13 and toQ is in Q11)
-        */
-        WebRtcIlbcfix_SortSq(&xq, &index,
-                             (int16_t)toQ32,
-                             WebRtcIlbcfix_kStateSq3, 8);
-      }
-
-      /* Store selected index */
-      (*idxVec++) = index;
-
-      /* Compute decoded sample and update of the prediction filter */
-      tmp16a = ((WebRtcIlbcfix_kStateSq3[index] + 2 ) >> 2);
-
-      *syntOut     = (int16_t) (tmp16a + (int32_t)(*in_weighted) - toQW32);
-
-      syntOut++; in_weighted++;
-    }
-    /* Update perceptual weighting filter at subframe border */
-    weightDenum += 11;
-  }
-}
diff --git a/modules/audio_coding/codecs/ilbc/abs_quant_loop.h b/modules/audio_coding/codecs/ilbc/abs_quant_loop.h
deleted file mode 100644
index c8bf675..0000000
--- a/modules/audio_coding/codecs/ilbc/abs_quant_loop.h
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_AbsQuantLoop.h
-
-******************************************************************/
-
-#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_ABS_QUANT_LOOP_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_ABS_QUANT_LOOP_H_
-
-#include "defines.h"
-
-/*----------------------------------------------------------------*
- *  predictive noise shaping encoding of scaled start state
- *  (subrutine for WebRtcIlbcfix_StateSearch)
- *---------------------------------------------------------------*/
-
-void WebRtcIlbcfix_AbsQuantLoop(int16_t *syntOutIN, int16_t *in_weightedIN,
-                                int16_t *weightDenumIN, size_t *quantLenIN,
-                                int16_t *idxVecIN);
-
-#endif
diff --git a/modules/audio_coding/codecs/ilbc/audio_decoder_ilbc.cc b/modules/audio_coding/codecs/ilbc/audio_decoder_ilbc.cc
deleted file mode 100644
index 61ec7bd..0000000
--- a/modules/audio_coding/codecs/ilbc/audio_decoder_ilbc.cc
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- *  Copyright (c) 2015 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/codecs/ilbc/audio_decoder_ilbc.h"
-
-#include <utility>
-
-#include "webrtc/modules/audio_coding/codecs/ilbc/ilbc.h"
-#include "webrtc/modules/audio_coding/codecs/legacy_encoded_audio_frame.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-
-namespace webrtc {
-
-AudioDecoderIlbcImpl::AudioDecoderIlbcImpl() {
-  WebRtcIlbcfix_DecoderCreate(&dec_state_);
-  WebRtcIlbcfix_Decoderinit30Ms(dec_state_);
-}
-
-AudioDecoderIlbcImpl::~AudioDecoderIlbcImpl() {
-  WebRtcIlbcfix_DecoderFree(dec_state_);
-}
-
-bool AudioDecoderIlbcImpl::HasDecodePlc() const {
-  return true;
-}
-
-int AudioDecoderIlbcImpl::DecodeInternal(const uint8_t* encoded,
-                                     size_t encoded_len,
-                                     int sample_rate_hz,
-                                     int16_t* decoded,
-                                     SpeechType* speech_type) {
-  RTC_DCHECK_EQ(sample_rate_hz, 8000);
-  int16_t temp_type = 1;  // Default is speech.
-  int ret = WebRtcIlbcfix_Decode(dec_state_, encoded, encoded_len, decoded,
-                                 &temp_type);
-  *speech_type = ConvertSpeechType(temp_type);
-  return ret;
-}
-
-size_t AudioDecoderIlbcImpl::DecodePlc(size_t num_frames, int16_t* decoded) {
-  return WebRtcIlbcfix_NetEqPlc(dec_state_, decoded, num_frames);
-}
-
-void AudioDecoderIlbcImpl::Reset() {
-  WebRtcIlbcfix_Decoderinit30Ms(dec_state_);
-}
-
-std::vector<AudioDecoder::ParseResult> AudioDecoderIlbcImpl::ParsePayload(
-    rtc::Buffer&& payload,
-    uint32_t timestamp) {
-  std::vector<ParseResult> results;
-  size_t bytes_per_frame;
-  int timestamps_per_frame;
-  if (payload.size() >= 950) {
-    LOG(LS_WARNING) << "AudioDecoderIlbcImpl::ParsePayload: Payload too large";
-    return results;
-  }
-  if (payload.size() % 38 == 0) {
-    // 20 ms frames.
-    bytes_per_frame = 38;
-    timestamps_per_frame = 160;
-  } else if (payload.size() % 50 == 0) {
-    // 30 ms frames.
-    bytes_per_frame = 50;
-    timestamps_per_frame = 240;
-  } else {
-    LOG(LS_WARNING) << "AudioDecoderIlbcImpl::ParsePayload: Invalid payload";
-    return results;
-  }
-
-  RTC_DCHECK_EQ(0, payload.size() % bytes_per_frame);
-  if (payload.size() == bytes_per_frame) {
-    std::unique_ptr<EncodedAudioFrame> frame(
-        new LegacyEncodedAudioFrame(this, std::move(payload)));
-    results.emplace_back(timestamp, 0, std::move(frame));
-  } else {
-    size_t byte_offset;
-    uint32_t timestamp_offset;
-    for (byte_offset = 0, timestamp_offset = 0;
-         byte_offset < payload.size();
-         byte_offset += bytes_per_frame,
-             timestamp_offset += timestamps_per_frame) {
-      std::unique_ptr<EncodedAudioFrame> frame(new LegacyEncodedAudioFrame(
-          this, rtc::Buffer(payload.data() + byte_offset, bytes_per_frame)));
-      results.emplace_back(timestamp + timestamp_offset, 0, std::move(frame));
-    }
-  }
-
-  return results;
-}
-
-int AudioDecoderIlbcImpl::SampleRateHz() const {
-  return 8000;
-}
-
-size_t AudioDecoderIlbcImpl::Channels() const {
-  return 1;
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/codecs/ilbc/audio_decoder_ilbc.h b/modules/audio_coding/codecs/ilbc/audio_decoder_ilbc.h
deleted file mode 100644
index f2320fa..0000000
--- a/modules/audio_coding/codecs/ilbc/audio_decoder_ilbc.h
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- *  Copyright (c) 2015 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_CODECS_ILBC_AUDIO_DECODER_ILBC_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_AUDIO_DECODER_ILBC_H_
-
-#include "webrtc/api/audio_codecs/audio_decoder.h"
-#include "webrtc/rtc_base/constructormagic.h"
-
-typedef struct iLBC_decinst_t_ IlbcDecoderInstance;
-
-namespace webrtc {
-
-class AudioDecoderIlbcImpl final : public AudioDecoder {
- public:
-  AudioDecoderIlbcImpl();
-  ~AudioDecoderIlbcImpl() override;
-  bool HasDecodePlc() const override;
-  size_t DecodePlc(size_t num_frames, int16_t* decoded) override;
-  void Reset() override;
-  std::vector<ParseResult> ParsePayload(rtc::Buffer&& payload,
-                                        uint32_t timestamp) override;
-  int SampleRateHz() const override;
-  size_t Channels() const override;
-
- protected:
-  int DecodeInternal(const uint8_t* encoded,
-                     size_t encoded_len,
-                     int sample_rate_hz,
-                     int16_t* decoded,
-                     SpeechType* speech_type) override;
-
- private:
-  IlbcDecoderInstance* dec_state_;
-  RTC_DISALLOW_COPY_AND_ASSIGN(AudioDecoderIlbcImpl);
-};
-
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_AUDIO_DECODER_ILBC_H_
diff --git a/modules/audio_coding/codecs/ilbc/audio_encoder_ilbc.cc b/modules/audio_coding/codecs/ilbc/audio_encoder_ilbc.cc
deleted file mode 100644
index 2a6dda7..0000000
--- a/modules/audio_coding/codecs/ilbc/audio_encoder_ilbc.cc
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
- *  Copyright (c) 2014 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/codecs/ilbc/audio_encoder_ilbc.h"
-
-#include <algorithm>
-#include <limits>
-#include "webrtc/common_types.h"
-#include "webrtc/modules/audio_coding/codecs/ilbc/ilbc.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/safe_conversions.h"
-
-namespace webrtc {
-
-namespace {
-
-const int kSampleRateHz = 8000;
-
-AudioEncoderIlbcConfig CreateConfig(const CodecInst& codec_inst) {
-  AudioEncoderIlbcConfig config;
-  config.frame_size_ms = codec_inst.pacsize / 8;
-  return config;
-}
-
-int GetIlbcBitrate(int ptime) {
-  switch (ptime) {
-    case 20:
-    case 40:
-      // 38 bytes per frame of 20 ms => 15200 bits/s.
-      return 15200;
-    case 30:
-    case 60:
-      // 50 bytes per frame of 30 ms => (approx) 13333 bits/s.
-      return 13333;
-    default:
-      FATAL();
-  }
-}
-
-}  // namespace
-
-AudioEncoderIlbcImpl::AudioEncoderIlbcImpl(const AudioEncoderIlbcConfig& config,
-                                           int payload_type)
-    : frame_size_ms_(config.frame_size_ms),
-      payload_type_(payload_type),
-      num_10ms_frames_per_packet_(
-          static_cast<size_t>(config.frame_size_ms / 10)),
-      encoder_(nullptr) {
-  RTC_CHECK(config.IsOk());
-  Reset();
-}
-
-AudioEncoderIlbcImpl::AudioEncoderIlbcImpl(const CodecInst& codec_inst)
-    : AudioEncoderIlbcImpl(CreateConfig(codec_inst), codec_inst.pltype) {}
-
-AudioEncoderIlbcImpl::~AudioEncoderIlbcImpl() {
-  RTC_CHECK_EQ(0, WebRtcIlbcfix_EncoderFree(encoder_));
-}
-
-int AudioEncoderIlbcImpl::SampleRateHz() const {
-  return kSampleRateHz;
-}
-
-size_t AudioEncoderIlbcImpl::NumChannels() const {
-  return 1;
-}
-
-size_t AudioEncoderIlbcImpl::Num10MsFramesInNextPacket() const {
-  return num_10ms_frames_per_packet_;
-}
-
-size_t AudioEncoderIlbcImpl::Max10MsFramesInAPacket() const {
-  return num_10ms_frames_per_packet_;
-}
-
-int AudioEncoderIlbcImpl::GetTargetBitrate() const {
-  return GetIlbcBitrate(rtc::dchecked_cast<int>(num_10ms_frames_per_packet_) *
-                        10);
-}
-
-AudioEncoder::EncodedInfo AudioEncoderIlbcImpl::EncodeImpl(
-    uint32_t rtp_timestamp,
-    rtc::ArrayView<const int16_t> audio,
-    rtc::Buffer* encoded) {
-
-  // Save timestamp if starting a new packet.
-  if (num_10ms_frames_buffered_ == 0)
-    first_timestamp_in_buffer_ = rtp_timestamp;
-
-  // Buffer input.
-  std::copy(audio.cbegin(), audio.cend(),
-            input_buffer_ + kSampleRateHz / 100 * num_10ms_frames_buffered_);
-
-  // If we don't yet have enough buffered input for a whole packet, we're done
-  // for now.
-  if (++num_10ms_frames_buffered_ < num_10ms_frames_per_packet_) {
-    return EncodedInfo();
-  }
-
-  // Encode buffered input.
-  RTC_DCHECK_EQ(num_10ms_frames_buffered_, num_10ms_frames_per_packet_);
-  num_10ms_frames_buffered_ = 0;
-  size_t encoded_bytes =
-      encoded->AppendData(
-          RequiredOutputSizeBytes(),
-          [&] (rtc::ArrayView<uint8_t> encoded) {
-            const int r = WebRtcIlbcfix_Encode(
-                encoder_,
-                input_buffer_,
-                kSampleRateHz / 100 * num_10ms_frames_per_packet_,
-                encoded.data());
-            RTC_CHECK_GE(r, 0);
-
-            return static_cast<size_t>(r);
-          });
-
-  RTC_DCHECK_EQ(encoded_bytes, RequiredOutputSizeBytes());
-
-  EncodedInfo info;
-  info.encoded_bytes = encoded_bytes;
-  info.encoded_timestamp = first_timestamp_in_buffer_;
-  info.payload_type = payload_type_;
-  info.encoder_type = CodecType::kIlbc;
-  return info;
-}
-
-void AudioEncoderIlbcImpl::Reset() {
-  if (encoder_)
-    RTC_CHECK_EQ(0, WebRtcIlbcfix_EncoderFree(encoder_));
-  RTC_CHECK_EQ(0, WebRtcIlbcfix_EncoderCreate(&encoder_));
-  const int encoder_frame_size_ms = frame_size_ms_ > 30
-                                        ? frame_size_ms_ / 2
-                                        : frame_size_ms_;
-  RTC_CHECK_EQ(0, WebRtcIlbcfix_EncoderInit(encoder_, encoder_frame_size_ms));
-  num_10ms_frames_buffered_ = 0;
-}
-
-size_t AudioEncoderIlbcImpl::RequiredOutputSizeBytes() const {
-  switch (num_10ms_frames_per_packet_) {
-    case 2:   return 38;
-    case 3:   return 50;
-    case 4:   return 2 * 38;
-    case 6:   return 2 * 50;
-    default:  FATAL();
-  }
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/codecs/ilbc/audio_encoder_ilbc.h b/modules/audio_coding/codecs/ilbc/audio_encoder_ilbc.h
deleted file mode 100644
index 6a80a69..0000000
--- a/modules/audio_coding/codecs/ilbc/audio_encoder_ilbc.h
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- *  Copyright (c) 2014 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_CODECS_ILBC_AUDIO_ENCODER_ILBC_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_AUDIO_ENCODER_ILBC_H_
-
-#include "webrtc/api/audio_codecs/audio_encoder.h"
-#include "webrtc/api/audio_codecs/ilbc/audio_encoder_ilbc_config.h"
-#include "webrtc/modules/audio_coding/codecs/ilbc/ilbc.h"
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace webrtc {
-
-struct CodecInst;
-
-class AudioEncoderIlbcImpl final : public AudioEncoder {
- public:
-  AudioEncoderIlbcImpl(const AudioEncoderIlbcConfig& config, int payload_type);
-  explicit AudioEncoderIlbcImpl(const CodecInst& codec_inst);
-  ~AudioEncoderIlbcImpl() override;
-
-  int SampleRateHz() const override;
-  size_t NumChannels() const override;
-  size_t Num10MsFramesInNextPacket() const override;
-  size_t Max10MsFramesInAPacket() const override;
-  int GetTargetBitrate() const override;
-  EncodedInfo EncodeImpl(uint32_t rtp_timestamp,
-                         rtc::ArrayView<const int16_t> audio,
-                         rtc::Buffer* encoded) override;
-  void Reset() override;
-
- private:
-  size_t RequiredOutputSizeBytes() const;
-
-  static constexpr size_t kMaxSamplesPerPacket = 480;
-  const int frame_size_ms_;
-  const int payload_type_;
-  const size_t num_10ms_frames_per_packet_;
-  size_t num_10ms_frames_buffered_;
-  uint32_t first_timestamp_in_buffer_;
-  int16_t input_buffer_[kMaxSamplesPerPacket];
-  IlbcEncoderInstance* encoder_;
-  RTC_DISALLOW_COPY_AND_ASSIGN(AudioEncoderIlbcImpl);
-};
-
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_AUDIO_ENCODER_ILBC_H_
diff --git a/modules/audio_coding/codecs/ilbc/augmented_cb_corr.c b/modules/audio_coding/codecs/ilbc/augmented_cb_corr.c
deleted file mode 100644
index 1a3735f..0000000
--- a/modules/audio_coding/codecs/ilbc/augmented_cb_corr.c
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_AugmentedCbCorr.c
-
-******************************************************************/
-
-#include "defines.h"
-#include "constants.h"
-#include "augmented_cb_corr.h"
-
-void WebRtcIlbcfix_AugmentedCbCorr(
-    int16_t *target,   /* (i) Target vector */
-    int16_t *buffer,   /* (i) Memory buffer */
-    int16_t *interpSamples, /* (i) buffer with
-                                     interpolated samples */
-    int32_t *crossDot,  /* (o) The cross correlation between
-                                 the target and the Augmented
-                                 vector */
-    size_t low,    /* (i) Lag to start from (typically
-                             20) */
-    size_t high,   /* (i) Lag to end at (typically 39) */
-    int scale)   /* (i) Scale factor to use for
-                              the crossDot */
-{
-  size_t lagcount;
-  size_t ilow;
-  int16_t *targetPtr;
-  int32_t *crossDotPtr;
-  int16_t *iSPtr=interpSamples;
-
-  /* Calculate the correlation between the target and the
-     interpolated codebook. The correlation is calculated in
-     3 sections with the interpolated part in the middle */
-  crossDotPtr=crossDot;
-  for (lagcount=low; lagcount<=high; lagcount++) {
-
-    ilow = lagcount - 4;
-
-    /* Compute dot product for the first (lagcount-4) samples */
-    (*crossDotPtr) = WebRtcSpl_DotProductWithScale(target, buffer-lagcount, ilow, scale);
-
-    /* Compute dot product on the interpolated samples */
-    (*crossDotPtr) += WebRtcSpl_DotProductWithScale(target+ilow, iSPtr, 4, scale);
-    targetPtr = target + lagcount;
-    iSPtr += lagcount-ilow;
-
-    /* Compute dot product for the remaining samples */
-    (*crossDotPtr) += WebRtcSpl_DotProductWithScale(targetPtr, buffer-lagcount, SUBL-lagcount, scale);
-    crossDotPtr++;
-  }
-}
diff --git a/modules/audio_coding/codecs/ilbc/augmented_cb_corr.h b/modules/audio_coding/codecs/ilbc/augmented_cb_corr.h
deleted file mode 100644
index c5c4088..0000000
--- a/modules/audio_coding/codecs/ilbc/augmented_cb_corr.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_AugmentedCbCorr.h
-
-******************************************************************/
-
-#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_AUGMENTED_CB_CORR_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_AUGMENTED_CB_CORR_H_
-
-#include "defines.h"
-
-/*----------------------------------------------------------------*
- *  Calculate correlation between target and Augmented codebooks
- *---------------------------------------------------------------*/
-
-void WebRtcIlbcfix_AugmentedCbCorr(
-    int16_t *target,   /* (i) Target vector */
-    int16_t *buffer,   /* (i) Memory buffer */
-    int16_t *interpSamples, /* (i) buffer with
-                                           interpolated samples */
-    int32_t *crossDot,  /* (o) The cross correlation between
-                                           the target and the Augmented
-                                           vector */
-    size_t low,    /* (i) Lag to start from (typically
-                                                   20) */
-    size_t high,   /* (i) Lag to end at (typically 39 */
-    int scale);   /* (i) Scale factor to use for the crossDot */
-
-#endif
diff --git a/modules/audio_coding/codecs/ilbc/bw_expand.c b/modules/audio_coding/codecs/ilbc/bw_expand.c
deleted file mode 100644
index b02abab..0000000
--- a/modules/audio_coding/codecs/ilbc/bw_expand.c
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_BwExpand.c
-
-******************************************************************/
-
-#include "defines.h"
-
-/*----------------------------------------------------------------*
- *  lpc bandwidth expansion
- *---------------------------------------------------------------*/
-
-/* The output is in the same domain as the input */
-void WebRtcIlbcfix_BwExpand(
-    int16_t *out, /* (o) the bandwidth expanded lpc coefficients */
-    int16_t *in,  /* (i) the lpc coefficients before bandwidth
-                                   expansion */
-    int16_t *coef, /* (i) the bandwidth expansion factor Q15 */
-    int16_t length /* (i) the length of lpc coefficient vectors */
-                            ) {
-  int i;
-
-  out[0] = in[0];
-  for (i = 1; i < length; i++) {
-    /* out[i] = coef[i] * in[i] with rounding.
-       in[] and out[] are in Q12 and coef[] is in Q15
-    */
-    out[i] = (int16_t)((coef[i] * in[i] + 16384) >> 15);
-  }
-}
diff --git a/modules/audio_coding/codecs/ilbc/bw_expand.h b/modules/audio_coding/codecs/ilbc/bw_expand.h
deleted file mode 100644
index b3b16d5..0000000
--- a/modules/audio_coding/codecs/ilbc/bw_expand.h
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_BwExpand.h
-
-******************************************************************/
-
-#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_BW_EXPAND_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_BW_EXPAND_H_
-
-#include "defines.h"
-
-/*----------------------------------------------------------------*
- *  lpc bandwidth expansion
- *---------------------------------------------------------------*/
-
-void WebRtcIlbcfix_BwExpand(
-    int16_t *out, /* (o) the bandwidth expanded lpc coefficients */
-    int16_t *in,  /* (i) the lpc coefficients before bandwidth
-                                   expansion */
-    int16_t *coef, /* (i) the bandwidth expansion factor Q15 */
-    int16_t length /* (i) the length of lpc coefficient vectors */
-                            );
-
-#endif
diff --git a/modules/audio_coding/codecs/ilbc/cb_construct.c b/modules/audio_coding/codecs/ilbc/cb_construct.c
deleted file mode 100644
index c19818e..0000000
--- a/modules/audio_coding/codecs/ilbc/cb_construct.c
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_CbConstruct.c
-
-******************************************************************/
-
-#include "cb_construct.h"
-
-#include "defines.h"
-#include "gain_dequant.h"
-#include "get_cd_vec.h"
-
-/*----------------------------------------------------------------*
- *  Construct decoded vector from codebook and gains.
- *---------------------------------------------------------------*/
-
-bool WebRtcIlbcfix_CbConstruct(
-    int16_t* decvector,        /* (o) Decoded vector */
-    const int16_t* index,      /* (i) Codebook indices */
-    const int16_t* gain_index, /* (i) Gain quantization indices */
-    int16_t* mem,              /* (i) Buffer for codevector construction */
-    size_t lMem,               /* (i) Length of buffer */
-    size_t veclen) {           /* (i) Length of vector */
-  size_t j;
-  int16_t gain[CB_NSTAGES];
-  /* Stack based */
-  int16_t cbvec0[SUBL];
-  int16_t cbvec1[SUBL];
-  int16_t cbvec2[SUBL];
-  int32_t a32;
-  int16_t *gainPtr;
-
-  /* gain de-quantization */
-
-  gain[0] = WebRtcIlbcfix_GainDequant(gain_index[0], 16384, 0);
-  gain[1] = WebRtcIlbcfix_GainDequant(gain_index[1], gain[0], 1);
-  gain[2] = WebRtcIlbcfix_GainDequant(gain_index[2], gain[1], 2);
-
-  /* codebook vector construction and construction of total vector */
-
-  /* Stack based */
-  if (!WebRtcIlbcfix_GetCbVec(cbvec0, mem, (size_t)index[0], lMem, veclen))
-    return false;  // Failure.
-  if (!WebRtcIlbcfix_GetCbVec(cbvec1, mem, (size_t)index[1], lMem, veclen))
-    return false;  // Failure.
-  if (!WebRtcIlbcfix_GetCbVec(cbvec2, mem, (size_t)index[2], lMem, veclen))
-    return false;  // Failure.
-
-  gainPtr = &gain[0];
-  for (j=0;j<veclen;j++) {
-    a32 = (*gainPtr++) * cbvec0[j];
-    a32 += (*gainPtr++) * cbvec1[j];
-    a32 += (*gainPtr) * cbvec2[j];
-    gainPtr -= 2;
-    decvector[j] = (int16_t)((a32 + 8192) >> 14);
-  }
-
-  return true;  // Success.
-}
diff --git a/modules/audio_coding/codecs/ilbc/cb_construct.h b/modules/audio_coding/codecs/ilbc/cb_construct.h
deleted file mode 100644
index 12df628..0000000
--- a/modules/audio_coding/codecs/ilbc/cb_construct.h
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_CbConstruct.h
-
-******************************************************************/
-
-#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_CB_CONSTRUCT_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_CB_CONSTRUCT_H_
-
-#include <stdbool.h>
-#include "defines.h"
-
-/*----------------------------------------------------------------*
- *  Construct decoded vector from codebook and gains.
- *---------------------------------------------------------------*/
-
-// Returns true on success, false on failure.
-bool WebRtcIlbcfix_CbConstruct(
-    int16_t* decvector,        /* (o) Decoded vector */
-    const int16_t* index,      /* (i) Codebook indices */
-    const int16_t* gain_index, /* (i) Gain quantization indices */
-    int16_t* mem,              /* (i) Buffer for codevector construction */
-    size_t lMem,               /* (i) Length of buffer */
-    size_t veclen              /* (i) Length of vector */
-    ) RTC_WARN_UNUSED_RESULT;
-
-#endif
diff --git a/modules/audio_coding/codecs/ilbc/cb_mem_energy.c b/modules/audio_coding/codecs/ilbc/cb_mem_energy.c
deleted file mode 100644
index 6ad2f8e..0000000
--- a/modules/audio_coding/codecs/ilbc/cb_mem_energy.c
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_CbMemEnergy.c
-
-******************************************************************/
-
-#include "defines.h"
-#include "constants.h"
-#include "cb_mem_energy_calc.h"
-
-/*----------------------------------------------------------------*
- *  Function WebRtcIlbcfix_CbMemEnergy computes the energy of all
- * the vectors in the codebook memory that will be used in the
- * following search for the best match.
- *----------------------------------------------------------------*/
-
-void WebRtcIlbcfix_CbMemEnergy(
-    size_t range,
-    int16_t *CB,   /* (i) The CB memory (1:st section) */
-    int16_t *filteredCB,  /* (i) The filtered CB memory (2:nd section) */
-    size_t lMem,   /* (i) Length of the CB memory */
-    size_t lTarget,   /* (i) Length of the target vector */
-    int16_t *energyW16,  /* (o) Energy in the CB vectors */
-    int16_t *energyShifts, /* (o) Shift value of the energy */
-    int scale,   /* (i) The scaling of all energy values */
-    size_t base_size  /* (i) Index to where energy values should be stored */
-                               ) {
-  int16_t *ppi, *ppo, *pp;
-  int32_t energy, tmp32;
-
-  /* Compute the energy and store it in a vector. Also the
-   * corresponding shift values are stored. The energy values
-   * are reused in all three stages. */
-
-  /* Calculate the energy in the first block of 'lTarget' sampels. */
-  ppi = CB+lMem-lTarget-1;
-  ppo = CB+lMem-1;
-
-  pp=CB+lMem-lTarget;
-  energy = WebRtcSpl_DotProductWithScale( pp, pp, lTarget, scale);
-
-  /* Normalize the energy and store the number of shifts */
-  energyShifts[0] = (int16_t)WebRtcSpl_NormW32(energy);
-  tmp32 = energy << energyShifts[0];
-  energyW16[0] = (int16_t)(tmp32 >> 16);
-
-  /* Compute the energy of the rest of the cb memory
-   * by step wise adding and subtracting the next
-   * sample and the last sample respectively. */
-  WebRtcIlbcfix_CbMemEnergyCalc(energy, range, ppi, ppo, energyW16, energyShifts, scale, 0);
-
-  /* Next, precompute the energy values for the filtered cb section */
-  energy=0;
-  pp=filteredCB+lMem-lTarget;
-
-  energy = WebRtcSpl_DotProductWithScale( pp, pp, lTarget, scale);
-
-  /* Normalize the energy and store the number of shifts */
-  energyShifts[base_size] = (int16_t)WebRtcSpl_NormW32(energy);
-  tmp32 = energy << energyShifts[base_size];
-  energyW16[base_size] = (int16_t)(tmp32 >> 16);
-
-  ppi = filteredCB + lMem - 1 - lTarget;
-  ppo = filteredCB + lMem - 1;
-
-  WebRtcIlbcfix_CbMemEnergyCalc(energy, range, ppi, ppo, energyW16, energyShifts, scale, base_size);
-}
diff --git a/modules/audio_coding/codecs/ilbc/cb_mem_energy.h b/modules/audio_coding/codecs/ilbc/cb_mem_energy.h
deleted file mode 100644
index 6da2f43..0000000
--- a/modules/audio_coding/codecs/ilbc/cb_mem_energy.h
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_CbMemEnergy.h
-
-******************************************************************/
-
-#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_CB_MEM_ENERGY_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_CB_MEM_ENERGY_H_
-
-void WebRtcIlbcfix_CbMemEnergy(
-    size_t range,
-    int16_t *CB,   /* (i) The CB memory (1:st section) */
-    int16_t *filteredCB,  /* (i) The filtered CB memory (2:nd section) */
-    size_t lMem,   /* (i) Length of the CB memory */
-    size_t lTarget,   /* (i) Length of the target vector */
-    int16_t *energyW16,  /* (o) Energy in the CB vectors */
-    int16_t *energyShifts, /* (o) Shift value of the energy */
-    int scale,   /* (i) The scaling of all energy values */
-    size_t base_size  /* (i) Index to where energy values should be stored */
-                               );
-
-#endif
diff --git a/modules/audio_coding/codecs/ilbc/cb_mem_energy_augmentation.c b/modules/audio_coding/codecs/ilbc/cb_mem_energy_augmentation.c
deleted file mode 100644
index acd6b9c..0000000
--- a/modules/audio_coding/codecs/ilbc/cb_mem_energy_augmentation.c
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_CbMemEnergyAugmentation.c
-
-******************************************************************/
-
-#include "defines.h"
-#include "constants.h"
-
-void WebRtcIlbcfix_CbMemEnergyAugmentation(
-    int16_t *interpSamples, /* (i) The interpolated samples */
-    int16_t *CBmem,   /* (i) The CB memory */
-    int scale,   /* (i) The scaling of all energy values */
-    size_t base_size,  /* (i) Index to where energy values should be stored */
-    int16_t *energyW16,  /* (o) Energy in the CB vectors */
-    int16_t *energyShifts /* (o) Shift value of the energy */
-                                           ){
-  int32_t energy, tmp32;
-  int16_t *ppe, *pp, *interpSamplesPtr;
-  int16_t *CBmemPtr;
-  size_t lagcount;
-  int16_t *enPtr=&energyW16[base_size-20];
-  int16_t *enShPtr=&energyShifts[base_size-20];
-  int32_t nrjRecursive;
-
-  CBmemPtr = CBmem+147;
-  interpSamplesPtr = interpSamples;
-
-  /* Compute the energy for the first (low-5) noninterpolated samples */
-  nrjRecursive = WebRtcSpl_DotProductWithScale( CBmemPtr-19, CBmemPtr-19, 15, scale);
-  ppe = CBmemPtr - 20;
-
-  for (lagcount=20; lagcount<=39; lagcount++) {
-
-    /* Update the energy recursively to save complexity */
-    nrjRecursive += (*ppe * *ppe) >> scale;
-    ppe--;
-    energy = nrjRecursive;
-
-    /* interpolation */
-    energy += WebRtcSpl_DotProductWithScale(interpSamplesPtr, interpSamplesPtr, 4, scale);
-    interpSamplesPtr += 4;
-
-    /* Compute energy for the remaining samples */
-    pp = CBmemPtr - lagcount;
-    energy += WebRtcSpl_DotProductWithScale(pp, pp, SUBL-lagcount, scale);
-
-    /* Normalize the energy and store the number of shifts */
-    (*enShPtr) = (int16_t)WebRtcSpl_NormW32(energy);
-    tmp32 = energy << *enShPtr;
-    *enPtr = (int16_t)(tmp32 >> 16);
-    enShPtr++;
-    enPtr++;
-  }
-}
diff --git a/modules/audio_coding/codecs/ilbc/cb_mem_energy_augmentation.h b/modules/audio_coding/codecs/ilbc/cb_mem_energy_augmentation.h
deleted file mode 100644
index 594ba5f..0000000
--- a/modules/audio_coding/codecs/ilbc/cb_mem_energy_augmentation.h
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_CbMemEnergyAugmentation.h
-
-******************************************************************/
-
-#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_CB_MEM_ENERGY_AUGMENTATION_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_CB_MEM_ENERGY_AUGMENTATION_H_
-
-void WebRtcIlbcfix_CbMemEnergyAugmentation(
-    int16_t *interpSamples, /* (i) The interpolated samples */
-    int16_t *CBmem,   /* (i) The CB memory */
-    int scale,   /* (i) The scaling of all energy values */
-    size_t base_size,  /* (i) Index to where energy values should be stored */
-    int16_t *energyW16,  /* (o) Energy in the CB vectors */
-    int16_t *energyShifts /* (o) Shift value of the energy */
-                                           );
-
-#endif
diff --git a/modules/audio_coding/codecs/ilbc/cb_mem_energy_calc.c b/modules/audio_coding/codecs/ilbc/cb_mem_energy_calc.c
deleted file mode 100644
index f2415fe..0000000
--- a/modules/audio_coding/codecs/ilbc/cb_mem_energy_calc.c
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_CbMemEnergyCalc.c
-
-******************************************************************/
-
-#include "defines.h"
-
-/* Compute the energy of the rest of the cb memory
- * by step wise adding and subtracting the next
- * sample and the last sample respectively */
-void WebRtcIlbcfix_CbMemEnergyCalc(
-    int32_t energy,   /* (i) input start energy */
-    size_t range,   /* (i) number of iterations */
-    int16_t *ppi,   /* (i) input pointer 1 */
-    int16_t *ppo,   /* (i) input pointer 2 */
-    int16_t *energyW16,  /* (o) Energy in the CB vectors */
-    int16_t *energyShifts, /* (o) Shift value of the energy */
-    int scale,   /* (i) The scaling of all energy values */
-    size_t base_size  /* (i) Index to where energy values should be stored */
-                                   )
-{
-  size_t j;
-  int16_t shft;
-  int32_t tmp;
-  int16_t *eSh_ptr;
-  int16_t *eW16_ptr;
-
-
-  eSh_ptr  = &energyShifts[1+base_size];
-  eW16_ptr = &energyW16[1+base_size];
-
-  for (j = 0; j + 1 < range; j++) {
-
-    /* Calculate next energy by a +/-
-       operation on the edge samples */
-    tmp = (*ppi) * (*ppi) - (*ppo) * (*ppo);
-    energy += tmp >> scale;
-    energy = WEBRTC_SPL_MAX(energy, 0);
-
-    ppi--;
-    ppo--;
-
-    /* Normalize the energy into a int16_t and store
-       the number of shifts */
-
-    shft = (int16_t)WebRtcSpl_NormW32(energy);
-    *eSh_ptr++ = shft;
-
-    tmp = energy << shft;
-    *eW16_ptr++ = (int16_t)(tmp >> 16);
-  }
-}
diff --git a/modules/audio_coding/codecs/ilbc/cb_mem_energy_calc.h b/modules/audio_coding/codecs/ilbc/cb_mem_energy_calc.h
deleted file mode 100644
index 2991869..0000000
--- a/modules/audio_coding/codecs/ilbc/cb_mem_energy_calc.h
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_CbMemEnergyCalc.h
-
-******************************************************************/
-
-#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_CB_MEM_ENERGY_CALC_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_CB_MEM_ENERGY_CALC_H_
-
-void WebRtcIlbcfix_CbMemEnergyCalc(
-    int32_t energy,   /* (i) input start energy */
-    size_t range,   /* (i) number of iterations */
-    int16_t *ppi,   /* (i) input pointer 1 */
-    int16_t *ppo,   /* (i) input pointer 2 */
-    int16_t *energyW16,  /* (o) Energy in the CB vectors */
-    int16_t *energyShifts, /* (o) Shift value of the energy */
-    int scale,   /* (i) The scaling of all energy values */
-    size_t base_size  /* (i) Index to where energy values should be stored */
-                                   );
-
-#endif
diff --git a/modules/audio_coding/codecs/ilbc/cb_search.c b/modules/audio_coding/codecs/ilbc/cb_search.c
deleted file mode 100644
index be94951..0000000
--- a/modules/audio_coding/codecs/ilbc/cb_search.c
+++ /dev/null
@@ -1,403 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_CbSearch.c
-
-******************************************************************/
-
-#include "defines.h"
-#include "gain_quant.h"
-#include "filtered_cb_vecs.h"
-#include "constants.h"
-#include "cb_mem_energy.h"
-#include "interpolate_samples.h"
-#include "cb_mem_energy_augmentation.h"
-#include "cb_search_core.h"
-#include "energy_inverse.h"
-#include "augmented_cb_corr.h"
-#include "cb_update_best_index.h"
-#include "create_augmented_vec.h"
-
-/*----------------------------------------------------------------*
- *  Search routine for codebook encoding and gain quantization.
- *----------------------------------------------------------------*/
-
-void WebRtcIlbcfix_CbSearch(
-    IlbcEncoder *iLBCenc_inst,
-    /* (i) the encoder state structure */
-    int16_t *index,  /* (o) Codebook indices */
-    int16_t *gain_index, /* (o) Gain quantization indices */
-    int16_t *intarget, /* (i) Target vector for encoding */
-    int16_t *decResidual,/* (i) Decoded residual for codebook construction */
-    size_t lMem,  /* (i) Length of buffer */
-    size_t lTarget,  /* (i) Length of vector */
-    int16_t *weightDenum,/* (i) weighting filter coefficients in Q12 */
-    size_t block  /* (i) the subblock number */
-                            ) {
-  size_t i, range;
-  int16_t ii, j, stage;
-  int16_t *pp;
-  int16_t tmp;
-  int scale;
-  int16_t bits, temp1, temp2;
-  size_t base_size;
-  int32_t codedEner, targetEner;
-  int16_t gains[CB_NSTAGES+1];
-  int16_t *cb_vecPtr;
-  size_t indexOffset, sInd, eInd;
-  int32_t CritMax=0;
-  int16_t shTotMax=WEBRTC_SPL_WORD16_MIN;
-  size_t bestIndex=0;
-  int16_t bestGain=0;
-  size_t indexNew;
-  int16_t CritNewSh;
-  int32_t CritNew;
-  int32_t *cDotPtr;
-  size_t noOfZeros;
-  int16_t *gainPtr;
-  int32_t t32, tmpW32;
-  int16_t *WebRtcIlbcfix_kGainSq5_ptr;
-  /* Stack based */
-  int16_t CBbuf[CB_MEML+LPC_FILTERORDER+CB_HALFFILTERLEN];
-  int32_t cDot[128];
-  int32_t Crit[128];
-  int16_t targetVec[SUBL+LPC_FILTERORDER];
-  int16_t cbvectors[CB_MEML + 1];  /* Adding one extra position for
-                                            Coverity warnings. */
-  int16_t codedVec[SUBL];
-  int16_t interpSamples[20*4];
-  int16_t interpSamplesFilt[20*4];
-  int16_t energyW16[CB_EXPAND*128];
-  int16_t energyShifts[CB_EXPAND*128];
-  int16_t *inverseEnergy=energyW16;   /* Reuse memory */
-  int16_t *inverseEnergyShifts=energyShifts; /* Reuse memory */
-  int16_t *buf = &CBbuf[LPC_FILTERORDER];
-  int16_t *target = &targetVec[LPC_FILTERORDER];
-  int16_t *aug_vec = (int16_t*)cDot;   /* length [SUBL], reuse memory */
-
-  /* Determine size of codebook sections */
-
-  base_size=lMem-lTarget+1;
-  if (lTarget==SUBL) {
-    base_size=lMem-19;
-  }
-
-  /* weighting of the CB memory */
-  noOfZeros=lMem-WebRtcIlbcfix_kFilterRange[block];
-  WebRtcSpl_MemSetW16(&buf[-LPC_FILTERORDER], 0, noOfZeros+LPC_FILTERORDER);
-  WebRtcSpl_FilterARFastQ12(
-      decResidual+noOfZeros, buf+noOfZeros,
-      weightDenum, LPC_FILTERORDER+1, WebRtcIlbcfix_kFilterRange[block]);
-
-  /* weighting of the target vector */
-  WEBRTC_SPL_MEMCPY_W16(&target[-LPC_FILTERORDER], buf+noOfZeros+WebRtcIlbcfix_kFilterRange[block]-LPC_FILTERORDER, LPC_FILTERORDER);
-  WebRtcSpl_FilterARFastQ12(
-      intarget, target,
-      weightDenum, LPC_FILTERORDER+1, lTarget);
-
-  /* Store target, towards the end codedVec is calculated as
-     the initial target minus the remaining target */
-  WEBRTC_SPL_MEMCPY_W16(codedVec, target, lTarget);
-
-  /* Find the highest absolute value to calculate proper
-     vector scale factor (so that it uses 12 bits) */
-  temp1 = WebRtcSpl_MaxAbsValueW16(buf, lMem);
-  temp2 = WebRtcSpl_MaxAbsValueW16(target, lTarget);
-
-  if ((temp1>0)&&(temp2>0)) {
-    temp1 = WEBRTC_SPL_MAX(temp1, temp2);
-    scale = WebRtcSpl_GetSizeInBits((uint32_t)(temp1 * temp1));
-  } else {
-    /* temp1 or temp2 is negative (maximum was -32768) */
-    scale = 30;
-  }
-
-  /* Scale to so that a mul-add 40 times does not overflow */
-  scale = scale - 25;
-  scale = WEBRTC_SPL_MAX(0, scale);
-
-  /* Compute energy of the original target */
-  targetEner = WebRtcSpl_DotProductWithScale(target, target, lTarget, scale);
-
-  /* Prepare search over one more codebook section. This section
-     is created by filtering the original buffer with a filter. */
-  WebRtcIlbcfix_FilteredCbVecs(cbvectors, buf, lMem, WebRtcIlbcfix_kFilterRange[block]);
-
-  range = WebRtcIlbcfix_kSearchRange[block][0];
-
-  if(lTarget == SUBL) {
-    /* Create the interpolated samples and store them for use in all stages */
-
-    /* First section, non-filtered half of the cb */
-    WebRtcIlbcfix_InterpolateSamples(interpSamples, buf, lMem);
-
-    /* Second section, filtered half of the cb */
-    WebRtcIlbcfix_InterpolateSamples(interpSamplesFilt, cbvectors, lMem);
-
-    /* Compute the CB vectors' energies for the first cb section (non-filtered) */
-    WebRtcIlbcfix_CbMemEnergyAugmentation(interpSamples, buf,
-                                          scale, 20, energyW16, energyShifts);
-
-    /* Compute the CB vectors' energies for the second cb section (filtered cb) */
-    WebRtcIlbcfix_CbMemEnergyAugmentation(interpSamplesFilt, cbvectors, scale,
-                                          base_size + 20, energyW16,
-                                          energyShifts);
-
-    /* Compute the CB vectors' energies and store them in the vector
-     * energyW16. Also the corresponding shift values are stored. The
-     * energy values are used in all three stages. */
-    WebRtcIlbcfix_CbMemEnergy(range, buf, cbvectors, lMem,
-                              lTarget, energyW16+20, energyShifts+20, scale, base_size);
-
-  } else {
-    /* Compute the CB vectors' energies and store them in the vector
-     * energyW16. Also the corresponding shift values are stored. The
-     * energy values are used in all three stages. */
-    WebRtcIlbcfix_CbMemEnergy(range, buf, cbvectors, lMem,
-                              lTarget, energyW16, energyShifts, scale, base_size);
-
-    /* Set the energy positions 58-63 and 122-127 to zero
-       (otherwise they are uninitialized) */
-    WebRtcSpl_MemSetW16(energyW16+range, 0, (base_size-range));
-    WebRtcSpl_MemSetW16(energyW16+range+base_size, 0, (base_size-range));
-  }
-
-  /* Calculate Inverse Energy (energyW16 is already normalized
-     and will contain the inverse energy in Q29 after this call */
-  WebRtcIlbcfix_EnergyInverse(energyW16, base_size*CB_EXPAND);
-
-  /* The gain value computed in the previous stage is used
-   * as an upper limit to what the next stage gain value
-   * is allowed to be. In stage 0, 16384 (1.0 in Q14) is used as
-   * the upper limit. */
-  gains[0] = 16384;
-
-  for (stage=0; stage<CB_NSTAGES; stage++) {
-
-    /* Set up memories */
-    range = WebRtcIlbcfix_kSearchRange[block][stage];
-
-    /* initialize search measures */
-    CritMax=0;
-    shTotMax=-100;
-    bestIndex=0;
-    bestGain=0;
-
-    /* loop over lags 40+ in the first codebook section, full search */
-    cb_vecPtr = buf+lMem-lTarget;
-
-    /* Calculate all the cross correlations (augmented part of CB) */
-    if (lTarget==SUBL) {
-      WebRtcIlbcfix_AugmentedCbCorr(target, buf+lMem,
-                                    interpSamples, cDot,
-                                    20, 39, scale);
-      cDotPtr=&cDot[20];
-    } else {
-      cDotPtr=cDot;
-    }
-    /* Calculate all the cross correlations (main part of CB) */
-    WebRtcSpl_CrossCorrelation(cDotPtr, target, cb_vecPtr, lTarget, range, scale, -1);
-
-    /* Adjust the search range for the augmented vectors */
-    if (lTarget==SUBL) {
-      range=WebRtcIlbcfix_kSearchRange[block][stage]+20;
-    } else {
-      range=WebRtcIlbcfix_kSearchRange[block][stage];
-    }
-
-    indexOffset=0;
-
-    /* Search for best index in this part of the vector */
-    WebRtcIlbcfix_CbSearchCore(
-        cDot, range, stage, inverseEnergy,
-        inverseEnergyShifts, Crit,
-        &indexNew, &CritNew, &CritNewSh);
-
-    /* Update the global best index and the corresponding gain */
-    WebRtcIlbcfix_CbUpdateBestIndex(
-        CritNew, CritNewSh, indexNew+indexOffset, cDot[indexNew+indexOffset],
-        inverseEnergy[indexNew+indexOffset], inverseEnergyShifts[indexNew+indexOffset],
-        &CritMax, &shTotMax, &bestIndex, &bestGain);
-
-    sInd = ((CB_RESRANGE >> 1) > bestIndex) ?
-        0 : (bestIndex - (CB_RESRANGE >> 1));
-    eInd=sInd+CB_RESRANGE;
-    if (eInd>=range) {
-      eInd=range-1;
-      sInd=eInd-CB_RESRANGE;
-    }
-
-    range = WebRtcIlbcfix_kSearchRange[block][stage];
-
-    if (lTarget==SUBL) {
-      i=sInd;
-      if (sInd<20) {
-        WebRtcIlbcfix_AugmentedCbCorr(target, cbvectors + lMem,
-                                      interpSamplesFilt, cDot, sInd + 20,
-                                      WEBRTC_SPL_MIN(39, (eInd + 20)), scale);
-        i=20;
-        cDotPtr = &cDot[20 - sInd];
-      } else {
-        cDotPtr = cDot;
-      }
-
-      cb_vecPtr = cbvectors+lMem-20-i;
-
-      /* Calculate the cross correlations (main part of the filtered CB) */
-      WebRtcSpl_CrossCorrelation(cDotPtr, target, cb_vecPtr, lTarget,
-                                 eInd - i + 1, scale, -1);
-
-    } else {
-      cDotPtr = cDot;
-      cb_vecPtr = cbvectors+lMem-lTarget-sInd;
-
-      /* Calculate the cross correlations (main part of the filtered CB) */
-      WebRtcSpl_CrossCorrelation(cDotPtr, target, cb_vecPtr, lTarget,
-                                 eInd - sInd + 1, scale, -1);
-
-    }
-
-    /* Adjust the search range for the augmented vectors */
-    indexOffset=base_size+sInd;
-
-    /* Search for best index in this part of the vector */
-    WebRtcIlbcfix_CbSearchCore(
-        cDot, eInd-sInd+1, stage, inverseEnergy+indexOffset,
-        inverseEnergyShifts+indexOffset, Crit,
-        &indexNew, &CritNew, &CritNewSh);
-
-    /* Update the global best index and the corresponding gain */
-    WebRtcIlbcfix_CbUpdateBestIndex(
-        CritNew, CritNewSh, indexNew+indexOffset, cDot[indexNew],
-        inverseEnergy[indexNew+indexOffset], inverseEnergyShifts[indexNew+indexOffset],
-        &CritMax, &shTotMax, &bestIndex, &bestGain);
-
-    index[stage] = (int16_t)bestIndex;
-
-
-    bestGain = WebRtcIlbcfix_GainQuant(bestGain,
-                                       (int16_t)WEBRTC_SPL_ABS_W16(gains[stage]), stage, &gain_index[stage]);
-
-    /* Extract the best (according to measure) codebook vector
-       Also adjust the index, so that the augmented vectors are last.
-       Above these vectors were first...
-    */
-
-    if(lTarget==(STATE_LEN-iLBCenc_inst->state_short_len)) {
-
-      if((size_t)index[stage]<base_size) {
-        pp=buf+lMem-lTarget-index[stage];
-      } else {
-        pp=cbvectors+lMem-lTarget-
-            index[stage]+base_size;
-      }
-
-    } else {
-
-      if ((size_t)index[stage]<base_size) {
-        if (index[stage]>=20) {
-          /* Adjust index and extract vector */
-          index[stage]-=20;
-          pp=buf+lMem-lTarget-index[stage];
-        } else {
-          /* Adjust index and extract vector */
-          index[stage]+=(int16_t)(base_size-20);
-
-          WebRtcIlbcfix_CreateAugmentedVec(index[stage]-base_size+40,
-                                           buf+lMem, aug_vec);
-          pp = aug_vec;
-
-        }
-      } else {
-
-        if ((index[stage] - base_size) >= 20) {
-          /* Adjust index and extract vector */
-          index[stage]-=20;
-          pp=cbvectors+lMem-lTarget-
-              index[stage]+base_size;
-        } else {
-          /* Adjust index and extract vector */
-          index[stage]+=(int16_t)(base_size-20);
-          WebRtcIlbcfix_CreateAugmentedVec(index[stage]-2*base_size+40,
-                                           cbvectors+lMem, aug_vec);
-          pp = aug_vec;
-        }
-      }
-    }
-
-    /* Subtract the best codebook vector, according
-       to measure, from the target vector */
-
-    WebRtcSpl_AddAffineVectorToVector(target, pp, (int16_t)(-bestGain),
-                                      (int32_t)8192, (int16_t)14, lTarget);
-
-    /* record quantized gain */
-    gains[stage+1] = bestGain;
-
-  } /* end of Main Loop. for (stage=0;... */
-
-  /* Calculte the coded vector (original target - what's left) */
-  for (i=0;i<lTarget;i++) {
-    codedVec[i]-=target[i];
-  }
-
-  /* Gain adjustment for energy matching */
-  codedEner = WebRtcSpl_DotProductWithScale(codedVec, codedVec, lTarget, scale);
-
-  j=gain_index[0];
-
-  temp1 = (int16_t)WebRtcSpl_NormW32(codedEner);
-  temp2 = (int16_t)WebRtcSpl_NormW32(targetEner);
-
-  if(temp1 < temp2) {
-    bits = 16 - temp1;
-  } else {
-    bits = 16 - temp2;
-  }
-
-  tmp = (int16_t)((gains[1] * gains[1]) >> 14);
-
-  targetEner = (int16_t)WEBRTC_SPL_SHIFT_W32(targetEner, -bits) * tmp;
-
-  tmpW32 = ((int32_t)(gains[1]-1))<<1;
-
-  /* Pointer to the table that contains
-     gain_sq5TblFIX * gain_sq5TblFIX in Q14 */
-  gainPtr=(int16_t*)WebRtcIlbcfix_kGainSq5Sq+gain_index[0];
-  temp1 = (int16_t)WEBRTC_SPL_SHIFT_W32(codedEner, -bits);
-
-  WebRtcIlbcfix_kGainSq5_ptr = (int16_t*)&WebRtcIlbcfix_kGainSq5[j];
-
-  /* targetEner and codedEner are in Q(-2*scale) */
-  for (ii=gain_index[0];ii<32;ii++) {
-
-    /* Change the index if
-       (codedEnergy*gainTbl[i]*gainTbl[i])<(targetEn*gain[0]*gain[0]) AND
-       gainTbl[i] < 2*gain[0]
-    */
-
-    t32 = temp1 * *gainPtr;
-    t32 = t32 - targetEner;
-    if (t32 < 0) {
-      if ((*WebRtcIlbcfix_kGainSq5_ptr) < tmpW32) {
-        j=ii;
-        WebRtcIlbcfix_kGainSq5_ptr = (int16_t*)&WebRtcIlbcfix_kGainSq5[ii];
-      }
-    }
-    gainPtr++;
-  }
-  gain_index[0]=j;
-
-  return;
-}
diff --git a/modules/audio_coding/codecs/ilbc/cb_search.h b/modules/audio_coding/codecs/ilbc/cb_search.h
deleted file mode 100644
index ed1580c..0000000
--- a/modules/audio_coding/codecs/ilbc/cb_search.h
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_CbSearch.h
-
-******************************************************************/
-
-#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_CB_SEARCH_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_CB_SEARCH_H_
-
-void WebRtcIlbcfix_CbSearch(
-    IlbcEncoder *iLBCenc_inst,
-    /* (i) the encoder state structure */
-    int16_t *index,  /* (o) Codebook indices */
-    int16_t *gain_index, /* (o) Gain quantization indices */
-    int16_t *intarget, /* (i) Target vector for encoding */
-    int16_t *decResidual,/* (i) Decoded residual for codebook construction */
-    size_t lMem,  /* (i) Length of buffer */
-    size_t lTarget,  /* (i) Length of vector */
-    int16_t *weightDenum,/* (i) weighting filter coefficients in Q12 */
-    size_t block  /* (i) the subblock number */
-                            );
-
-#endif
diff --git a/modules/audio_coding/codecs/ilbc/cb_search_core.c b/modules/audio_coding/codecs/ilbc/cb_search_core.c
deleted file mode 100644
index fafa39f..0000000
--- a/modules/audio_coding/codecs/ilbc/cb_search_core.c
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_CbSearchCore.c
-
-******************************************************************/
-
-#include "defines.h"
-#include "constants.h"
-
-void WebRtcIlbcfix_CbSearchCore(
-    int32_t *cDot,    /* (i) Cross Correlation */
-    size_t range,    /* (i) Search range */
-    int16_t stage,    /* (i) Stage of this search */
-    int16_t *inverseEnergy,  /* (i) Inversed energy */
-    int16_t *inverseEnergyShift, /* (i) Shifts of inversed energy
-                                           with the offset 2*16-29 */
-    int32_t *Crit,    /* (o) The criteria */
-    size_t *bestIndex,   /* (o) Index that corresponds to
-                                                   maximum criteria (in this
-                                                   vector) */
-    int32_t *bestCrit,   /* (o) Value of critera for the
-                                                   chosen index */
-    int16_t *bestCritSh)   /* (o) The domain of the chosen
-                                                   criteria */
-{
-  int32_t maxW32, tmp32;
-  int16_t max, sh, tmp16;
-  size_t i;
-  int32_t *cDotPtr;
-  int16_t cDotSqW16;
-  int16_t *inverseEnergyPtr;
-  int32_t *critPtr;
-  int16_t *inverseEnergyShiftPtr;
-
-  /* Don't allow negative values for stage 0 */
-  if (stage==0) {
-    cDotPtr=cDot;
-    for (i=0;i<range;i++) {
-      *cDotPtr=WEBRTC_SPL_MAX(0, (*cDotPtr));
-      cDotPtr++;
-    }
-  }
-
-  /* Normalize cDot to int16_t, calculate the square of cDot and store the upper int16_t */
-  maxW32 = WebRtcSpl_MaxAbsValueW32(cDot, range);
-
-  sh = (int16_t)WebRtcSpl_NormW32(maxW32);
-  cDotPtr = cDot;
-  inverseEnergyPtr = inverseEnergy;
-  critPtr = Crit;
-  inverseEnergyShiftPtr=inverseEnergyShift;
-  max=WEBRTC_SPL_WORD16_MIN;
-
-  for (i=0;i<range;i++) {
-    /* Calculate cDot*cDot and put the result in a int16_t */
-    tmp32 = *cDotPtr << sh;
-    tmp16 = (int16_t)(tmp32 >> 16);
-    cDotSqW16 = (int16_t)(((int32_t)(tmp16)*(tmp16))>>16);
-
-    /* Calculate the criteria (cDot*cDot/energy) */
-    *critPtr = cDotSqW16 * *inverseEnergyPtr;
-
-    /* Extract the maximum shift value under the constraint
-       that the criteria is not zero */
-    if ((*critPtr)!=0) {
-      max = WEBRTC_SPL_MAX((*inverseEnergyShiftPtr), max);
-    }
-
-    inverseEnergyPtr++;
-    inverseEnergyShiftPtr++;
-    critPtr++;
-    cDotPtr++;
-  }
-
-  /* If no max shifts still at initialization value, set shift to zero */
-  if (max==WEBRTC_SPL_WORD16_MIN) {
-    max = 0;
-  }
-
-  /* Modify the criterias, so that all of them use the same Q domain */
-  critPtr=Crit;
-  inverseEnergyShiftPtr=inverseEnergyShift;
-  for (i=0;i<range;i++) {
-    /* Guarantee that the shift value is less than 16
-       in order to simplify for DSP's (and guard against >31) */
-    tmp16 = WEBRTC_SPL_MIN(16, max-(*inverseEnergyShiftPtr));
-
-    (*critPtr)=WEBRTC_SPL_SHIFT_W32((*critPtr),-tmp16);
-    critPtr++;
-    inverseEnergyShiftPtr++;
-  }
-
-  /* Find the index of the best value */
-  *bestIndex = WebRtcSpl_MaxIndexW32(Crit, range);
-  *bestCrit = Crit[*bestIndex];
-
-  /* Calculate total shifts of this criteria */
-  *bestCritSh = 32 - 2*sh + max;
-
-  return;
-}
diff --git a/modules/audio_coding/codecs/ilbc/cb_search_core.h b/modules/audio_coding/codecs/ilbc/cb_search_core.h
deleted file mode 100644
index 9648cf2..0000000
--- a/modules/audio_coding/codecs/ilbc/cb_search_core.h
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_CbSearchCore.h
-
-******************************************************************/
-
-#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_CB_SEARCH_CORE_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_CB_SEARCH_CORE_H_
-
-#include "defines.h"
-
-void WebRtcIlbcfix_CbSearchCore(
-    int32_t *cDot,    /* (i) Cross Correlation */
-    size_t range,    /* (i) Search range */
-    int16_t stage,    /* (i) Stage of this search */
-    int16_t *inverseEnergy,  /* (i) Inversed energy */
-    int16_t *inverseEnergyShift, /* (i) Shifts of inversed energy
-                                          with the offset 2*16-29 */
-    int32_t *Crit,    /* (o) The criteria */
-    size_t *bestIndex,   /* (o) Index that corresponds to
-                                   maximum criteria (in this
-                                   vector) */
-    int32_t *bestCrit,   /* (o) Value of critera for the
-                                  chosen index */
-    int16_t *bestCritSh);  /* (o) The domain of the chosen
-                                    criteria */
-
-#endif
diff --git a/modules/audio_coding/codecs/ilbc/cb_update_best_index.c b/modules/audio_coding/codecs/ilbc/cb_update_best_index.c
deleted file mode 100644
index fc27ea9..0000000
--- a/modules/audio_coding/codecs/ilbc/cb_update_best_index.c
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_CbUpdateBestIndex.c
-
-******************************************************************/
-
-#include "defines.h"
-#include "cb_update_best_index.h"
-#include "constants.h"
-
-void WebRtcIlbcfix_CbUpdateBestIndex(
-    int32_t CritNew,    /* (i) New Potentially best Criteria */
-    int16_t CritNewSh,   /* (i) Shift value of above Criteria */
-    size_t IndexNew,   /* (i) Index of new Criteria */
-    int32_t cDotNew,    /* (i) Cross dot of new index */
-    int16_t invEnergyNew,  /* (i) Inversed energy new index */
-    int16_t energyShiftNew,  /* (i) Energy shifts of new index */
-    int32_t *CritMax,   /* (i/o) Maximum Criteria (so far) */
-    int16_t *shTotMax,   /* (i/o) Shifts of maximum criteria */
-    size_t *bestIndex,   /* (i/o) Index that corresponds to
-                                                   maximum criteria */
-    int16_t *bestGain)   /* (i/o) Gain in Q14 that corresponds
-                                                   to maximum criteria */
-{
-  int16_t shOld, shNew, tmp16;
-  int16_t scaleTmp;
-  int32_t gainW32;
-
-  /* Normalize the new and old Criteria to the same domain */
-  if (CritNewSh>(*shTotMax)) {
-    shOld=WEBRTC_SPL_MIN(31,CritNewSh-(*shTotMax));
-    shNew=0;
-  } else {
-    shOld=0;
-    shNew=WEBRTC_SPL_MIN(31,(*shTotMax)-CritNewSh);
-  }
-
-  /* Compare the two criterias. If the new one is better,
-     calculate the gain and store this index as the new best one
-  */
-
-  if ((CritNew >> shNew) > (*CritMax >> shOld)) {
-
-    tmp16 = (int16_t)WebRtcSpl_NormW32(cDotNew);
-    tmp16 = 16 - tmp16;
-
-    /* Calculate the gain in Q14
-       Compensate for inverseEnergyshift in Q29 and that the energy
-       value was stored in a int16_t (shifted down 16 steps)
-       => 29-14+16 = 31 */
-
-    scaleTmp = -energyShiftNew-tmp16+31;
-    scaleTmp = WEBRTC_SPL_MIN(31, scaleTmp);
-
-    gainW32 = ((int16_t)WEBRTC_SPL_SHIFT_W32(cDotNew, -tmp16) * invEnergyNew) >>
-        scaleTmp;
-
-    /* Check if criteria satisfies Gain criteria (max 1.3)
-       if it is larger set the gain to 1.3
-       (slightly different from FLP version)
-    */
-    if (gainW32>21299) {
-      *bestGain=21299;
-    } else if (gainW32<-21299) {
-      *bestGain=-21299;
-    } else {
-      *bestGain=(int16_t)gainW32;
-    }
-
-    *CritMax=CritNew;
-    *shTotMax=CritNewSh;
-    *bestIndex = IndexNew;
-  }
-
-  return;
-}
diff --git a/modules/audio_coding/codecs/ilbc/cb_update_best_index.h b/modules/audio_coding/codecs/ilbc/cb_update_best_index.h
deleted file mode 100644
index a20fa38..0000000
--- a/modules/audio_coding/codecs/ilbc/cb_update_best_index.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_CbUpdateBestIndex.h
-
-******************************************************************/
-
-#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_CB_UPDATE_BEST_INDEX_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_CB_UPDATE_BEST_INDEX_H_
-
-#include "defines.h"
-
-void WebRtcIlbcfix_CbUpdateBestIndex(
-    int32_t CritNew,    /* (i) New Potentially best Criteria */
-    int16_t CritNewSh,   /* (i) Shift value of above Criteria */
-    size_t IndexNew,   /* (i) Index of new Criteria */
-    int32_t cDotNew,    /* (i) Cross dot of new index */
-    int16_t invEnergyNew,  /* (i) Inversed energy new index */
-    int16_t energyShiftNew,  /* (i) Energy shifts of new index */
-    int32_t *CritMax,   /* (i/o) Maximum Criteria (so far) */
-    int16_t *shTotMax,   /* (i/o) Shifts of maximum criteria */
-    size_t *bestIndex,   /* (i/o) Index that corresponds to
-                                   maximum criteria */
-    int16_t *bestGain);   /* (i/o) Gain in Q14 that corresponds
-                                   to maximum criteria */
-
-#endif
diff --git a/modules/audio_coding/codecs/ilbc/chebyshev.c b/modules/audio_coding/codecs/ilbc/chebyshev.c
deleted file mode 100644
index 21a8f40..0000000
--- a/modules/audio_coding/codecs/ilbc/chebyshev.c
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_Chebyshev.c
-
-******************************************************************/
-
-#include "defines.h"
-#include "constants.h"
-
-/*------------------------------------------------------------------*
- *  Calculate the Chevyshev polynomial series
- *  F(w) = 2*exp(-j5w)*C(x)
- *   C(x) = (T_0(x) + f(1)T_1(x) + ... + f(4)T_1(x) + f(5)/2)
- *   T_i(x) is the i:th order Chebyshev polynomial
- *------------------------------------------------------------------*/
-
-int16_t WebRtcIlbcfix_Chebyshev(
-    /* (o) Result of C(x) */
-    int16_t x,  /* (i) Value to the Chevyshev polynomial */
-    int16_t *f  /* (i) The coefficients in the polynomial */
-                                      ) {
-  int16_t b1_high, b1_low; /* Use the high, low format to increase the accuracy */
-  int32_t b2;
-  int32_t tmp1W32;
-  int32_t tmp2W32;
-  int i;
-
-  b2 = (int32_t)0x1000000; /* b2 = 1.0 (Q23) */
-  /* Calculate b1 = 2*x + f[1] */
-  tmp1W32 = (x << 10) + (f[1] << 14);
-
-  for (i = 2; i < 5; i++) {
-    tmp2W32 = tmp1W32;
-
-    /* Split b1 (in tmp1W32) into a high and low part */
-    b1_high = (int16_t)(tmp1W32 >> 16);
-    b1_low = (int16_t)((tmp1W32 - ((int32_t)b1_high << 16)) >> 1);
-
-    /* Calculate 2*x*b1-b2+f[i] */
-    tmp1W32 = ((b1_high * x + ((b1_low * x) >> 15)) << 2) - b2 + (f[i] << 14);
-
-    /* Update b2 for next round */
-    b2 = tmp2W32;
-  }
-
-  /* Split b1 (in tmp1W32) into a high and low part */
-  b1_high = (int16_t)(tmp1W32 >> 16);
-  b1_low = (int16_t)((tmp1W32 - ((int32_t)b1_high << 16)) >> 1);
-
-  /* tmp1W32 = x*b1 - b2 + f[i]/2 */
-  tmp1W32 = ((b1_high * x) << 1) + (((b1_low * x) >> 15) << 1) -
-      b2 + (f[i] << 13);
-
-  /* Handle overflows and set to maximum or minimum int16_t instead */
-  if (tmp1W32>((int32_t)33553408)) {
-    return(WEBRTC_SPL_WORD16_MAX);
-  } else if (tmp1W32<((int32_t)-33554432)) {
-    return(WEBRTC_SPL_WORD16_MIN);
-  } else {
-    return (int16_t)(tmp1W32 >> 10);
-  }
-}
diff --git a/modules/audio_coding/codecs/ilbc/chebyshev.h b/modules/audio_coding/codecs/ilbc/chebyshev.h
deleted file mode 100644
index bf10132..0000000
--- a/modules/audio_coding/codecs/ilbc/chebyshev.h
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_Chebyshev.h
-
-******************************************************************/
-
-#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_CHEBYSHEV_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_CHEBYSHEV_H_
-
-#include "defines.h"
-
-/*------------------------------------------------------------------*
- *  Calculate the Chevyshev polynomial series
- *  F(w) = 2*exp(-j5w)*C(x)
- *   C(x) = (T_0(x) + f(1)T_1(x) + ... + f(4)T_1(x) + f(5)/2)
- *   T_i(x) is the i:th order Chebyshev polynomial
- *------------------------------------------------------------------*/
-
-int16_t WebRtcIlbcfix_Chebyshev(
-    /* (o) Result of C(x) */
-    int16_t x,  /* (i) Value to the Chevyshev polynomial */
-    int16_t *f  /* (i) The coefficients in the polynomial */
-                                      );
-
-#endif
diff --git a/modules/audio_coding/codecs/ilbc/comp_corr.c b/modules/audio_coding/codecs/ilbc/comp_corr.c
deleted file mode 100644
index 7653cb0..0000000
--- a/modules/audio_coding/codecs/ilbc/comp_corr.c
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_CompCorr.c
-
-******************************************************************/
-
-#include "defines.h"
-
-/*----------------------------------------------------------------*
- *  Compute cross correlation and pitch gain for pitch prediction
- *  of last subframe at given lag.
- *---------------------------------------------------------------*/
-
-void WebRtcIlbcfix_CompCorr(
-    int32_t *corr, /* (o) cross correlation */
-    int32_t *ener, /* (o) energy */
-    int16_t *buffer, /* (i) signal buffer */
-    size_t lag,  /* (i) pitch lag */
-    size_t bLen, /* (i) length of buffer */
-    size_t sRange, /* (i) correlation search length */
-    int16_t scale /* (i) number of rightshifts to use */
-                            ){
-  int16_t *w16ptr;
-
-  w16ptr=&buffer[bLen-sRange-lag];
-
-  /* Calculate correlation and energy */
-  (*corr)=WebRtcSpl_DotProductWithScale(&buffer[bLen-sRange], w16ptr, sRange, scale);
-  (*ener)=WebRtcSpl_DotProductWithScale(w16ptr, w16ptr, sRange, scale);
-
-  /* For zero energy set the energy to 0 in order to avoid potential
-     problems for coming divisions */
-  if (*ener == 0) {
-    *corr = 0;
-    *ener = 1;
-  }
-}
diff --git a/modules/audio_coding/codecs/ilbc/comp_corr.h b/modules/audio_coding/codecs/ilbc/comp_corr.h
deleted file mode 100644
index ab78c72..0000000
--- a/modules/audio_coding/codecs/ilbc/comp_corr.h
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_CompCorr.h
-
-******************************************************************/
-
-#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_COMP_CORR_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_COMP_CORR_H_
-
-#include "defines.h"
-
-/*----------------------------------------------------------------*
- *  Compute cross correlation and pitch gain for pitch prediction
- *  of last subframe at given lag.
- *---------------------------------------------------------------*/
-
-void WebRtcIlbcfix_CompCorr(
-    int32_t *corr, /* (o) cross correlation */
-    int32_t *ener, /* (o) energy */
-    int16_t *buffer, /* (i) signal buffer */
-    size_t lag,  /* (i) pitch lag */
-    size_t bLen, /* (i) length of buffer */
-    size_t sRange, /* (i) correlation search length */
-    int16_t scale /* (i) number of rightshifts to use */
-                            );
-
-#endif
diff --git a/modules/audio_coding/codecs/ilbc/complexityMeasures.m b/modules/audio_coding/codecs/ilbc/complexityMeasures.m
deleted file mode 100644
index 5c39e36..0000000
--- a/modules/audio_coding/codecs/ilbc/complexityMeasures.m
+++ /dev/null
@@ -1,59 +0,0 @@
-%
-%  Copyright (c) 2011 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.
-%
-
-clear;
-pack;
-%
-% Enter the path to YOUR executable and remember to define the perprocessor
-% variable PRINT_MIPS te get the instructions printed to the screen.
-%
-command = '!iLBCtest.exe 30 speechAndBGnoise.pcm out1.bit out1.pcm tlm10_30ms.dat';
-cout=' > st.txt';   %saves to matlab variable 'st'
-eval(strcat(command,cout));
-if(length(cout)>3)
-    load st.txt
-else
-    disp('No cout file to load')
-end
-
-% initialize vector to zero
-index = find(st(1:end,1)==-1);
-indexnonzero = find(st(1:end,1)>0);
-frames = length(index)-indexnonzero(1)+1;
-start = indexnonzero(1) - 1;
-functionOrder=max(st(:,2));
-new=zeros(frames,functionOrder);
-
-for i = 1:frames,
-    for j = index(start-1+i)+1:(index(start+i)-1),
-        new(i,st(j,2)) = new(i,st(j,2)) + st(j,1);
-    end
-end
-
-result=zeros(functionOrder,3);
-for i=1:functionOrder
-    nonzeroelements = find(new(1:end,i)>0);
-    result(i,1)=i;
-    
-    % Compute each function's mean complexity
-    % result(i,2)=(sum(new(nonzeroelements,i))/(length(nonzeroelements)*0.03))/1000000;
-    
-    % Compute each function's maximum complexity in encoding
-    % and decoding respectively and then add it together:
-    % result(i,3)=(max(new(1:end,i))/0.03)/1000000;
-    result(i,3)=(max(new(1:size(new,1)/2,i))/0.03)/1000000 + (max(new(size(new,1)/2+1:end,i))/0.03)/1000000;
-end
-
-result
-
-% Compute maximum complexity for a single frame (enc/dec separately and together)
-maxEncComplexityInAFrame = (max(sum(new(1:size(new,1)/2,:),2))/0.03)/1000000
-maxDecComplexityInAFrame = (max(sum(new(size(new,1)/2+1:end,:),2))/0.03)/1000000
-totalComplexity = maxEncComplexityInAFrame + maxDecComplexityInAFrame
\ No newline at end of file
diff --git a/modules/audio_coding/codecs/ilbc/constants.c b/modules/audio_coding/codecs/ilbc/constants.c
deleted file mode 100644
index 9e34194..0000000
--- a/modules/audio_coding/codecs/ilbc/constants.c
+++ /dev/null
@@ -1,666 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- constants.c
-
-******************************************************************/
-
-#include "defines.h"
-#include "constants.h"
-
-/* HP Filters {b[0] b[1] b[2] -a[1] -a[2]} */
-
-const int16_t WebRtcIlbcfix_kHpInCoefs[5] = {3798, -7596, 3798, 7807, -3733};
-const int16_t WebRtcIlbcfix_kHpOutCoefs[5] = {3849, -7699, 3849, 7918, -3833};
-
-/* Window in Q11 to window the energies of the 5 choises (3 for 20ms) in the choise for
-   the 80 sample start state
-*/
-const int16_t WebRtcIlbcfix_kStartSequenceEnrgWin[NSUB_MAX-1]= {
-  1638, 1843, 2048, 1843, 1638
-};
-
-/* LP Filter coeffs used for downsampling */
-const int16_t WebRtcIlbcfix_kLpFiltCoefs[FILTERORDER_DS_PLUS1]= {
-  -273, 512, 1297, 1696, 1297, 512, -273
-};
-
-/* Constants used in the LPC calculations */
-
-/* Hanning LPC window (in Q15) */
-const int16_t WebRtcIlbcfix_kLpcWin[BLOCKL_MAX] = {
-  6, 22, 50, 89, 139, 200, 272, 355, 449, 554, 669, 795,
-  932, 1079, 1237, 1405, 1583, 1771, 1969, 2177, 2395, 2622, 2858, 3104,
-  3359, 3622, 3894, 4175, 4464, 4761, 5066, 5379, 5699, 6026, 6361, 6702,
-  7050, 7404, 7764, 8130, 8502, 8879, 9262, 9649, 10040, 10436, 10836, 11240,
-  11647, 12058, 12471, 12887, 13306, 13726, 14148, 14572, 14997, 15423, 15850, 16277,
-  16704, 17131, 17558, 17983, 18408, 18831, 19252, 19672, 20089, 20504, 20916, 21325,
-  21730, 22132, 22530, 22924, 23314, 23698, 24078, 24452, 24821, 25185, 25542, 25893,
-  26238, 26575, 26906, 27230, 27547, 27855, 28156, 28450, 28734, 29011, 29279, 29538,
-  29788, 30029, 30261, 30483, 30696, 30899, 31092, 31275, 31448, 31611, 31764, 31906,
-  32037, 32158, 32268, 32367, 32456, 32533, 32600, 32655, 32700, 32733, 32755, 32767,
-  32767, 32755, 32733, 32700, 32655, 32600, 32533, 32456, 32367, 32268, 32158, 32037,
-  31906, 31764, 31611, 31448, 31275, 31092, 30899, 30696, 30483, 30261, 30029, 29788,
-  29538, 29279, 29011, 28734, 28450, 28156, 27855, 27547, 27230, 26906, 26575, 26238,
-  25893, 25542, 25185, 24821, 24452, 24078, 23698, 23314, 22924, 22530, 22132, 21730,
-  21325, 20916, 20504, 20089, 19672, 19252, 18831, 18408, 17983, 17558, 17131, 16704,
-  16277, 15850, 15423, 14997, 14572, 14148, 13726, 13306, 12887, 12471, 12058, 11647,
-  11240, 10836, 10436, 10040, 9649, 9262, 8879, 8502, 8130, 7764, 7404, 7050,
-  6702, 6361, 6026, 5699, 5379, 5066, 4761, 4464, 4175, 3894, 3622, 3359,
-  3104, 2858, 2622, 2395, 2177, 1969, 1771, 1583, 1405, 1237, 1079, 932,
-  795, 669, 554, 449, 355, 272, 200, 139, 89, 50, 22, 6
-};
-
-/* Asymmetric LPC window (in Q15)*/
-const int16_t WebRtcIlbcfix_kLpcAsymWin[BLOCKL_MAX] = {
-  2, 7, 15, 27, 42, 60, 81, 106, 135, 166, 201, 239,
-  280, 325, 373, 424, 478, 536, 597, 661, 728, 798, 872, 949,
-  1028, 1111, 1197, 1287, 1379, 1474, 1572, 1674, 1778, 1885, 1995, 2108,
-  2224, 2343, 2465, 2589, 2717, 2847, 2980, 3115, 3254, 3395, 3538, 3684,
-  3833, 3984, 4138, 4295, 4453, 4615, 4778, 4944, 5112, 5283, 5456, 5631,
-  5808, 5987, 6169, 6352, 6538, 6725, 6915, 7106, 7300, 7495, 7692, 7891,
-  8091, 8293, 8497, 8702, 8909, 9118, 9328, 9539, 9752, 9966, 10182, 10398,
-  10616, 10835, 11055, 11277, 11499, 11722, 11947, 12172, 12398, 12625, 12852, 13080,
-  13309, 13539, 13769, 14000, 14231, 14463, 14695, 14927, 15160, 15393, 15626, 15859,
-  16092, 16326, 16559, 16792, 17026, 17259, 17492, 17725, 17957, 18189, 18421, 18653,
-  18884, 19114, 19344, 19573, 19802, 20030, 20257, 20483, 20709, 20934, 21157, 21380,
-  21602, 21823, 22042, 22261, 22478, 22694, 22909, 23123, 23335, 23545, 23755, 23962,
-  24168, 24373, 24576, 24777, 24977, 25175, 25371, 25565, 25758, 25948, 26137, 26323,
-  26508, 26690, 26871, 27049, 27225, 27399, 27571, 27740, 27907, 28072, 28234, 28394,
-  28552, 28707, 28860, 29010, 29157, 29302, 29444, 29584, 29721, 29855, 29987, 30115,
-  30241, 30364, 30485, 30602, 30717, 30828, 30937, 31043, 31145, 31245, 31342, 31436,
-  31526, 31614, 31699, 31780, 31858, 31933, 32005, 32074, 32140, 32202, 32261, 32317,
-  32370, 32420, 32466, 32509, 32549, 32585, 32618, 32648, 32675, 32698, 32718, 32734,
-  32748, 32758, 32764, 32767, 32767, 32667, 32365, 31863, 31164, 30274, 29197, 27939,
-  26510, 24917, 23170, 21281, 19261, 17121, 14876, 12540, 10126, 7650, 5126, 2571
-};
-
-/* Lag window for LPC (Q31) */
-const int32_t WebRtcIlbcfix_kLpcLagWin[LPC_FILTERORDER + 1]={
-  2147483647,   2144885453,   2137754373,   2125918626,   2109459810,
-  2088483140,   2063130336,   2033564590,   1999977009,   1962580174,
-  1921610283};
-
-/* WebRtcIlbcfix_kLpcChirpSyntDenum vector in Q15 corresponding
- * floating point vector {1 0.9025 0.9025^2 0.9025^3 ...}
- */
-const int16_t WebRtcIlbcfix_kLpcChirpSyntDenum[LPC_FILTERORDER + 1] = {
-  32767, 29573, 26690, 24087,
-  21739, 19619, 17707, 15980,
-  14422, 13016, 11747};
-
-/* WebRtcIlbcfix_kLpcChirpWeightDenum in Q15 corresponding to
- * floating point vector {1 0.4222 0.4222^2... }
- */
-const int16_t WebRtcIlbcfix_kLpcChirpWeightDenum[LPC_FILTERORDER + 1] = {
-  32767, 13835, 5841, 2466, 1041, 440,
-  186, 78,  33,  14,  6};
-
-/* LSF quantization Q13 domain */
-const int16_t WebRtcIlbcfix_kLsfCb[64 * 3 + 128 * 3 + 128 * 4] = {
-  1273,       2238,       3696,
-  3199,       5309,       8209,
-  3606,       5671,       7829,
-  2815,       5262,       8778,
-  2608,       4027,       5493,
-  1582,       3076,       5945,
-  2983,       4181,       5396,
-  2437,       4322,       6902,
-  1861,       2998,       4613,
-  2007,       3250,       5214,
-  1388,       2459,       4262,
-  2563,       3805,       5269,
-  2036,       3522,       5129,
-  1935,       4025,       6694,
-  2744,       5121,       7338,
-  2810,       4248,       5723,
-  3054,       5405,       7745,
-  1449,       2593,       4763,
-  3411,       5128,       6596,
-  2484,       4659,       7496,
-  1668,       2879,       4818,
-  1812,       3072,       5036,
-  1638,       2649,       3900,
-  2464,       3550,       4644,
-  1853,       2900,       4158,
-  2458,       4163,       5830,
-  2556,       4036,       6254,
-  2703,       4432,       6519,
-  3062,       4953,       7609,
-  1725,       3703,       6187,
-  2221,       3877,       5427,
-  2339,       3579,       5197,
-  2021,       4633,       7037,
-  2216,       3328,       4535,
-  2961,       4739,       6667,
-  2807,       3955,       5099,
-  2788,       4501,       6088,
-  1642,       2755,       4431,
-  3341,       5282,       7333,
-  2414,       3726,       5727,
-  1582,       2822,       5269,
-  2259,       3447,       4905,
-  3117,       4986,       7054,
-  1825,       3491,       5542,
-  3338,       5736,       8627,
-  1789,       3090,       5488,
-  2566,       3720,       4923,
-  2846,       4682,       7161,
-  1950,       3321,       5976,
-  1834,       3383,       6734,
-  3238,       4769,       6094,
-  2031,       3978,       5903,
-  1877,       4068,       7436,
-  2131,       4644,       8296,
-  2764,       5010,       8013,
-  2194,       3667,       6302,
-  2053,       3127,       4342,
-  3523,       6595,      10010,
-  3134,       4457,       5748,
-  3142,       5819,       9414,
-  2223,       4334,       6353,
-  2022,       3224,       4822,
-  2186,       3458,       5544,
-  2552,       4757,       6870,
-  10905,      12917,      14578,
-  9503,      11485,      14485,
-  9518,      12494,      14052,
-  6222,       7487,       9174,
-  7759,       9186,      10506,
-  8315,      12755,      14786,
-  9609,      11486,      13866,
-  8909,      12077,      13643,
-  7369,       9054,      11520,
-  9408,      12163,      14715,
-  6436,       9911,      12843,
-  7109,       9556,      11884,
-  7557,      10075,      11640,
-  6482,       9202,      11547,
-  6463,       7914,      10980,
-  8611,      10427,      12752,
-  7101,       9676,      12606,
-  7428,      11252,      13172,
-  10197,      12955,      15842,
-  7487,      10955,      12613,
-  5575,       7858,      13621,
-  7268,      11719,      14752,
-  7476,      11744,      13795,
-  7049,       8686,      11922,
-  8234,      11314,      13983,
-  6560,      11173,      14984,
-  6405,       9211,      12337,
-  8222,      12054,      13801,
-  8039,      10728,      13255,
-  10066,      12733,      14389,
-  6016,       7338,      10040,
-  6896,       8648,      10234,
-  7538,       9170,      12175,
-  7327,      12608,      14983,
-  10516,      12643,      15223,
-  5538,       7644,      12213,
-  6728,      12221,      14253,
-  7563,       9377,      12948,
-  8661,      11023,      13401,
-  7280,       8806,      11085,
-  7723,       9793,      12333,
-  12225,      14648,      16709,
-  8768,      13389,      15245,
-  10267,      12197,      13812,
-  5301,       7078,      11484,
-  7100,      10280,      11906,
-  8716,      12555,      14183,
-  9567,      12464,      15434,
-  7832,      12305,      14300,
-  7608,      10556,      12121,
-  8913,      11311,      12868,
-  7414,       9722,      11239,
-  8666,      11641,      13250,
-  9079,      10752,      12300,
-  8024,      11608,      13306,
-  10453,      13607,      16449,
-  8135,       9573,      10909,
-  6375,       7741,      10125,
-  10025,      12217,      14874,
-  6985,      11063,      14109,
-  9296,      13051,      14642,
-  8613,      10975,      12542,
-  6583,      10414,      13534,
-  6191,       9368,      13430,
-  5742,       6859,       9260,
-  7723,       9813,      13679,
-  8137,      11291,      12833,
-  6562,       8973,      10641,
-  6062,       8462,      11335,
-  6928,       8784,      12647,
-  7501,       8784,      10031,
-  8372,      10045,      12135,
-  8191,       9864,      12746,
-  5917,       7487,      10979,
-  5516,       6848,      10318,
-  6819,       9899,      11421,
-  7882,      12912,      15670,
-  9558,      11230,      12753,
-  7752,       9327,      11472,
-  8479,       9980,      11358,
-  11418,      14072,      16386,
-  7968,      10330,      14423,
-  8423,      10555,      12162,
-  6337,      10306,      14391,
-  8850,      10879,      14276,
-  6750,      11885,      15710,
-  7037,       8328,       9764,
-  6914,       9266,      13476,
-  9746,      13949,      15519,
-  11032,      14444,      16925,
-  8032,      10271,      11810,
-  10962,      13451,      15833,
-  10021,      11667,      13324,
-  6273,       8226,      12936,
-  8543,      10397,      13496,
-  7936,      10302,      12745,
-  6769,       8138,      10446,
-  6081,       7786,      11719,
-  8637,      11795,      14975,
-  8790,      10336,      11812,
-  7040,       8490,      10771,
-  7338,      10381,      13153,
-  6598,       7888,       9358,
-  6518,       8237,      12030,
-  9055,      10763,      12983,
-  6490,      10009,      12007,
-  9589,      12023,      13632,
-  6867,       9447,      10995,
-  7930,       9816,      11397,
-  10241,      13300,      14939,
-  5830,       8670,      12387,
-  9870,      11915,      14247,
-  9318,      11647,      13272,
-  6721,      10836,      12929,
-  6543,       8233,       9944,
-  8034,      10854,      12394,
-  9112,      11787,      14218,
-  9302,      11114,      13400,
-  9022,      11366,      13816,
-  6962,      10461,      12480,
-  11288,      13333,      15222,
-  7249,       8974,      10547,
-  10566,      12336,      14390,
-  6697,      11339,      13521,
-  11851,      13944,      15826,
-  6847,       8381,      11349,
-  7509,       9331,      10939,
-  8029,       9618,      11909,
-  13973,      17644,      19647,      22474,
-  14722,      16522,      20035,      22134,
-  16305,      18179,      21106,      23048,
-  15150,      17948,      21394,      23225,
-  13582,      15191,      17687,      22333,
-  11778,      15546,      18458,      21753,
-  16619,      18410,      20827,      23559,
-  14229,      15746,      17907,      22474,
-  12465,      15327,      20700,      22831,
-  15085,      16799,      20182,      23410,
-  13026,      16935,      19890,      22892,
-  14310,      16854,      19007,      22944,
-  14210,      15897,      18891,      23154,
-  14633,      18059,      20132,      22899,
-  15246,      17781,      19780,      22640,
-  16396,      18904,      20912,      23035,
-  14618,      17401,      19510,      21672,
-  15473,      17497,      19813,      23439,
-  18851,      20736,      22323,      23864,
-  15055,      16804,      18530,      20916,
-  16490,      18196,      19990,      21939,
-  11711,      15223,      21154,      23312,
-  13294,      15546,      19393,      21472,
-  12956,      16060,      20610,      22417,
-  11628,      15843,      19617,      22501,
-  14106,      16872,      19839,      22689,
-  15655,      18192,      20161,      22452,
-  12953,      15244,      20619,      23549,
-  15322,      17193,      19926,      21762,
-  16873,      18676,      20444,      22359,
-  14874,      17871,      20083,      21959,
-  11534,      14486,      19194,      21857,
-  17766,      19617,      21338,      23178,
-  13404,      15284,      19080,      23136,
-  15392,      17527,      19470,      21953,
-  14462,      16153,      17985,      21192,
-  17734,      19750,      21903,      23783,
-  16973,      19096,      21675,      23815,
-  16597,      18936,      21257,      23461,
-  15966,      17865,      20602,      22920,
-  15416,      17456,      20301,      22972,
-  18335,      20093,      21732,      23497,
-  15548,      17217,      20679,      23594,
-  15208,      16995,      20816,      22870,
-  13890,      18015,      20531,      22468,
-  13211,      15377,      19951,      22388,
-  12852,      14635,      17978,      22680,
-  16002,      17732,      20373,      23544,
-  11373,      14134,      19534,      22707,
-  17329,      19151,      21241,      23462,
-  15612,      17296,      19362,      22850,
-  15422,      19104,      21285,      23164,
-  13792,      17111,      19349,      21370,
-  15352,      17876,      20776,      22667,
-  15253,      16961,      18921,      22123,
-  14108,      17264,      20294,      23246,
-  15785,      17897,      20010,      21822,
-  17399,      19147,      20915,      22753,
-  13010,      15659,      18127,      20840,
-  16826,      19422,      22218,      24084,
-  18108,      20641,      22695,      24237,
-  18018,      20273,      22268,      23920,
-  16057,      17821,      21365,      23665,
-  16005,      17901,      19892,      23016,
-  13232,      16683,      21107,      23221,
-  13280,      16615,      19915,      21829,
-  14950,      18575,      20599,      22511,
-  16337,      18261,      20277,      23216,
-  14306,      16477,      21203,      23158,
-  12803,      17498,      20248,      22014,
-  14327,      17068,      20160,      22006,
-  14402,      17461,      21599,      23688,
-  16968,      18834,      20896,      23055,
-  15070,      17157,      20451,      22315,
-  15419,      17107,      21601,      23946,
-  16039,      17639,      19533,      21424,
-  16326,      19261,      21745,      23673,
-  16489,      18534,      21658,      23782,
-  16594,      18471,      20549,      22807,
-  18973,      21212,      22890,      24278,
-  14264,      18674,      21123,      23071,
-  15117,      16841,      19239,      23118,
-  13762,      15782,      20478,      23230,
-  14111,      15949,      20058,      22354,
-  14990,      16738,      21139,      23492,
-  13735,      16971,      19026,      22158,
-  14676,      17314,      20232,      22807,
-  16196,      18146,      20459,      22339,
-  14747,      17258,      19315,      22437,
-  14973,      17778,      20692,      23367,
-  15715,      17472,      20385,      22349,
-  15702,      18228,      20829,      23410,
-  14428,      16188,      20541,      23630,
-  16824,      19394,      21365,      23246,
-  13069,      16392,      18900,      21121,
-  12047,      16640,      19463,      21689,
-  14757,      17433,      19659,      23125,
-  15185,      16930,      19900,      22540,
-  16026,      17725,      19618,      22399,
-  16086,      18643,      21179,      23472,
-  15462,      17248,      19102,      21196,
-  17368,      20016,      22396,      24096,
-  12340,      14475,      19665,      23362,
-  13636,      16229,      19462,      22728,
-  14096,      16211,      19591,      21635,
-  12152,      14867,      19943,      22301,
-  14492,      17503,      21002,      22728,
-  14834,      16788,      19447,      21411,
-  14650,      16433,      19326,      22308,
-  14624,      16328,      19659,      23204,
-  13888,      16572,      20665,      22488,
-  12977,      16102,      18841,      22246,
-  15523,      18431,      21757,      23738,
-  14095,      16349,      18837,      20947,
-  13266,      17809,      21088,      22839,
-  15427,      18190,      20270,      23143,
-  11859,      16753,      20935,      22486,
-  12310,      17667,      21736,      23319,
-  14021,      15926,      18702,      22002,
-  12286,      15299,      19178,      21126,
-  15703,      17491,      21039,      23151,
-  12272,      14018,      18213,      22570,
-  14817,      16364,      18485,      22598,
-  17109,      19683,      21851,      23677,
-  12657,      14903,      19039,      22061,
-  14713,      16487,      20527,      22814,
-  14635,      16726,      18763,      21715,
-  15878,      18550,      20718,      22906
-};
-
-const int16_t WebRtcIlbcfix_kLsfDimCb[LSF_NSPLIT] = {3, 3, 4};
-const int16_t WebRtcIlbcfix_kLsfSizeCb[LSF_NSPLIT] = {64,128,128};
-
-const int16_t WebRtcIlbcfix_kLsfMean[LPC_FILTERORDER] = {
-  2308,       3652,       5434,       7885,
-  10255,      12559,      15160,      17513,
-  20328,      22752};
-
-const int16_t WebRtcIlbcfix_kLspMean[LPC_FILTERORDER] = {
-  31476, 29565, 25819, 18725, 10276,
-  1236, -9049, -17600, -25884, -30618
-};
-
-/* Q14 */
-const int16_t WebRtcIlbcfix_kLsfWeight20ms[4] = {12288, 8192, 4096, 0};
-const int16_t WebRtcIlbcfix_kLsfWeight30ms[6] = {8192, 16384, 10923, 5461, 0, 0};
-
-/*
-   cos(x) in Q15
-   WebRtcIlbcfix_kCos[i] = cos(pi*i/64.0)
-   used in WebRtcIlbcfix_Lsp2Lsf()
-*/
-
-const int16_t WebRtcIlbcfix_kCos[64] = {
-  32767,  32729,  32610,  32413,  32138,  31786,  31357,  30853,
-  30274,  29622,  28899,  28106,  27246,  26320,  25330,  24279,
-  23170,  22006,  20788,  19520,  18205,  16846,  15447,  14010,
-  12540,  11039,   9512,   7962,   6393,   4808,   3212,   1608,
-  0,  -1608,  -3212,  -4808,  -6393,  -7962,  -9512, -11039,
-  -12540, -14010, -15447, -16846, -18205, -19520, -20788, -22006,
-  -23170, -24279, -25330, -26320, -27246, -28106, -28899, -29622,
-  -30274, -30853, -31357, -31786, -32138, -32413, -32610, -32729
-};
-
-/*
-   Derivative in Q19, used to interpolate between the
-   WebRtcIlbcfix_kCos[] values to get a more exact y = cos(x)
-*/
-const int16_t WebRtcIlbcfix_kCosDerivative[64] = {
-  -632,  -1893,  -3150,  -4399,  -5638,  -6863,  -8072,  -9261,
-  -10428, -11570, -12684, -13767, -14817, -15832, -16808, -17744,
-  -18637, -19486, -20287, -21039, -21741, -22390, -22986, -23526,
-  -24009, -24435, -24801, -25108, -25354, -25540, -25664, -25726,
-  -25726, -25664, -25540, -25354, -25108, -24801, -24435, -24009,
-  -23526, -22986, -22390, -21741, -21039, -20287, -19486, -18637,
-  -17744, -16808, -15832, -14817, -13767, -12684, -11570, -10428,
-  -9261,  -8072,  -6863,  -5638,  -4399,  -3150,  -1893,   -632};
-
-/*
-  Table in Q15, used for a2lsf conversion
-  WebRtcIlbcfix_kCosGrid[i] = cos((2*pi*i)/(float)(2*COS_GRID_POINTS));
-*/
-
-const int16_t WebRtcIlbcfix_kCosGrid[COS_GRID_POINTS + 1] = {
-  32760, 32723, 32588, 32364, 32051, 31651, 31164, 30591,
-  29935, 29196, 28377, 27481, 26509, 25465, 24351, 23170,
-  21926, 20621, 19260, 17846, 16384, 14876, 13327, 11743,
-  10125, 8480, 6812, 5126, 3425, 1714, 0, -1714, -3425,
-  -5126, -6812, -8480, -10125, -11743, -13327, -14876,
-  -16384, -17846, -19260, -20621, -21926, -23170, -24351,
-  -25465, -26509, -27481, -28377, -29196, -29935, -30591,
-  -31164, -31651, -32051, -32364, -32588, -32723, -32760
-};
-
-/*
-   Derivative of y = acos(x) in Q12
-   used in WebRtcIlbcfix_Lsp2Lsf()
-*/
-
-const int16_t WebRtcIlbcfix_kAcosDerivative[64] = {
-  -26887, -8812, -5323, -3813, -2979, -2444, -2081, -1811,
-  -1608, -1450, -1322, -1219, -1132, -1059, -998, -946,
-  -901, -861, -827, -797, -772, -750, -730, -713,
-  -699, -687, -677, -668, -662, -657, -654, -652,
-  -652, -654, -657, -662, -668, -677, -687, -699,
-  -713, -730, -750, -772, -797, -827, -861, -901,
-  -946, -998, -1059, -1132, -1219, -1322, -1450, -1608,
-  -1811, -2081, -2444, -2979, -3813, -5323, -8812, -26887
-};
-
-
-/* Tables for quantization of start state */
-
-/* State quantization tables */
-const int16_t WebRtcIlbcfix_kStateSq3[8] = { /* Values in Q13 */
-  -30473, -17838, -9257, -2537,
-  3639, 10893, 19958, 32636
-};
-
-/* This table defines the limits for the selection of the freqg
-   less or equal than value 0 => index = 0
-   less or equal than value k => index = k
-*/
-const int32_t WebRtcIlbcfix_kChooseFrgQuant[64] = {
-  118, 163, 222, 305, 425, 604,
-  851, 1174, 1617, 2222, 3080, 4191,
-  5525, 7215, 9193, 11540, 14397, 17604,
-  21204, 25209, 29863, 35720, 42531, 50375,
-  59162, 68845, 80108, 93754, 110326, 129488,
-  150654, 174328, 201962, 233195, 267843, 308239,
-  354503, 405988, 464251, 531550, 608652, 697516,
-  802526, 928793, 1080145, 1258120, 1481106, 1760881,
-  2111111, 2546619, 3078825, 3748642, 4563142, 5573115,
-  6887601, 8582108, 10797296, 14014513, 18625760, 25529599,
-  37302935, 58819185, 109782723, WEBRTC_SPL_WORD32_MAX
-};
-
-const int16_t WebRtcIlbcfix_kScale[64] = {
-  /* Values in Q16 */
-  29485, 25003, 21345, 18316, 15578, 13128, 10973, 9310, 7955,
-  6762, 5789, 4877, 4255, 3699, 3258, 2904, 2595, 2328,
-  2123, 1932, 1785, 1631, 1493, 1370, 1260, 1167, 1083,
-  /* Values in Q21 */
-  32081, 29611, 27262, 25229, 23432, 21803, 20226, 18883, 17609,
-  16408, 15311, 14327, 13390, 12513, 11693, 10919, 10163, 9435,
-  8739, 8100, 7424, 6813, 6192, 5648, 5122, 4639, 4207, 3798,
-  3404, 3048, 2706, 2348, 2036, 1713, 1393, 1087, 747
-};
-
-/*frgq in fixpoint, but already computed like this:
-  for(i=0; i<64; i++){
-  a = (pow(10,frgq[i])/4.5);
-  WebRtcIlbcfix_kFrgQuantMod[i] = round(a);
-  }
-
-  Value 0 :36 in Q8
-  37:58 in Q5
-  59:63 in Q3
-*/
-const int16_t WebRtcIlbcfix_kFrgQuantMod[64] = {
-  /* First 37 values in Q8 */
-  569, 671, 786, 916, 1077, 1278,
-  1529, 1802, 2109, 2481, 2898, 3440,
-  3943, 4535, 5149, 5778, 6464, 7208,
-  7904, 8682, 9397, 10285, 11240, 12246,
-  13313, 14382, 15492, 16735, 18131, 19693,
-  21280, 22912, 24624, 26544, 28432, 30488,
-  32720,
-  /* 22 values in Q5 */
-  4383, 4684, 5012, 5363, 5739, 6146,
-  6603, 7113, 7679, 8285, 9040, 9850,
-  10838, 11882, 13103, 14467, 15950, 17669,
-  19712, 22016, 24800, 28576,
-  /* 5 values in Q3 */
-  8240, 9792, 12040, 15440, 22472
-};
-
-/* Constants for codebook search and creation */
-
-/* Expansion filter to get additional cb section.
- * Q12 and reversed compared to flp
- */
-const int16_t WebRtcIlbcfix_kCbFiltersRev[CB_FILTERLEN]={
-  -140, 446, -755, 3302, 2922, -590, 343, -138};
-
-/* Weighting coefficients for short lags.
- * [0.2 0.4 0.6 0.8] in Q15 */
-const int16_t WebRtcIlbcfix_kAlpha[4]={
-  6554, 13107, 19661, 26214};
-
-/* Ranges for search and filters at different subframes */
-
-const size_t WebRtcIlbcfix_kSearchRange[5][CB_NSTAGES]={
-  {58,58,58}, {108,44,44}, {108,108,108}, {108,108,108}, {108,108,108}};
-
-const size_t WebRtcIlbcfix_kFilterRange[5]={63, 85, 125, 147, 147};
-
-/* Gain Quantization for the codebook gains of the 3 stages */
-
-/* Q14 (one extra value (max int16_t) to simplify for the search) */
-const int16_t WebRtcIlbcfix_kGainSq3[9]={
-  -16384, -10813, -5407, 0, 4096, 8192,
-  12288, 16384, 32767};
-
-/* Q14 (one extra value (max int16_t) to simplify for the search) */
-const int16_t WebRtcIlbcfix_kGainSq4[17]={
-  -17203, -14746, -12288, -9830, -7373, -4915,
-  -2458, 0, 2458, 4915, 7373, 9830,
-  12288, 14746, 17203, 19661, 32767};
-
-/* Q14 (one extra value (max int16_t) to simplify for the search) */
-const int16_t WebRtcIlbcfix_kGainSq5[33]={
-  614,        1229,        1843,        2458,        3072,       3686,
-  4301,        4915,        5530,        6144,        6758,        7373,
-  7987,        8602,        9216,        9830,       10445,       11059,
-  11674,       12288,       12902,       13517,       14131,       14746,
-  15360,       15974,       16589,       17203,       17818,       18432,
-  19046,       19661,    32767};
-
-/* Q14 gain_sq5Tbl squared in Q14 */
-const int16_t WebRtcIlbcfix_kGainSq5Sq[32] = {
-  23,   92,    207,  368,  576,  829,
-  1129,  1474,   1866,  2304,  2787,  3317,
-  3893,  4516,   5184,  5897,  6658,  7464,
-  8318,  9216,   10160,  11151,  12187,  13271,
-  14400,  15574,   16796,  18062,  19377,  20736,
-  22140,  23593
-};
-
-const int16_t* const WebRtcIlbcfix_kGain[3] =
-{WebRtcIlbcfix_kGainSq5, WebRtcIlbcfix_kGainSq4, WebRtcIlbcfix_kGainSq3};
-
-
-/* Tables for the Enhancer, using upsamling factor 4 (ENH_UPS0 = 4) */
-
-const int16_t WebRtcIlbcfix_kEnhPolyPhaser[ENH_UPS0][ENH_FLO_MULT2_PLUS1]={
-  {0,    0,    0, 4096,    0,  0,   0},
-  {64, -315, 1181, 3531, -436, 77, -64},
-  {97, -509, 2464, 2464, -509, 97, -97},
-  {77, -436, 3531, 1181, -315, 64, -77}
-};
-
-const int16_t WebRtcIlbcfix_kEnhWt[3] = {
-  4800, 16384, 27968 /* Q16 */
-};
-
-const size_t WebRtcIlbcfix_kEnhPlocs[ENH_NBLOCKS_TOT] = {
-  160, 480, 800, 1120, 1440, 1760, 2080, 2400  /* Q(-2) */
-};
-
-/* PLC table */
-
-const int16_t WebRtcIlbcfix_kPlcPerSqr[6] = { /* Grid points for square of periodiciy in Q15 */
-  839, 1343, 2048, 2998, 4247, 5849
-};
-
-const int16_t WebRtcIlbcfix_kPlcPitchFact[6] = { /* Value of y=(x^4-0.4)/(0.7-0.4) in grid points in Q15 */
-  0, 5462, 10922, 16384, 21846, 27306
-};
-
-const int16_t WebRtcIlbcfix_kPlcPfSlope[6] = { /* Slope of y=(x^4-0.4)/(0.7-0.4) in Q11 */
-  26667, 18729, 13653, 10258, 7901, 6214
-};
diff --git a/modules/audio_coding/codecs/ilbc/constants.h b/modules/audio_coding/codecs/ilbc/constants.h
deleted file mode 100644
index 7c4ad4d..0000000
--- a/modules/audio_coding/codecs/ilbc/constants.h
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- constants.h
-
-******************************************************************/
-
-#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_CONSTANTS_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_CONSTANTS_H_
-
-#include "defines.h"
-#include "webrtc/typedefs.h"
-
-/* high pass filters */
-
-extern const int16_t WebRtcIlbcfix_kHpInCoefs[];
-extern const int16_t WebRtcIlbcfix_kHpOutCoefs[];
-
-/* Window for start state decision */
-extern const int16_t WebRtcIlbcfix_kStartSequenceEnrgWin[];
-
-/* low pass filter used for downsampling */
-extern const int16_t WebRtcIlbcfix_kLpFiltCoefs[];
-
-/* LPC analysis and quantization */
-
-extern const int16_t WebRtcIlbcfix_kLpcWin[];
-extern const int16_t WebRtcIlbcfix_kLpcAsymWin[];
-extern const int32_t WebRtcIlbcfix_kLpcLagWin[];
-extern const int16_t WebRtcIlbcfix_kLpcChirpSyntDenum[];
-extern const int16_t WebRtcIlbcfix_kLpcChirpWeightDenum[];
-extern const int16_t WebRtcIlbcfix_kLsfDimCb[];
-extern const int16_t WebRtcIlbcfix_kLsfSizeCb[];
-extern const int16_t WebRtcIlbcfix_kLsfCb[];
-extern const int16_t WebRtcIlbcfix_kLsfWeight20ms[];
-extern const int16_t WebRtcIlbcfix_kLsfWeight30ms[];
-extern const int16_t WebRtcIlbcfix_kLsfMean[];
-extern const int16_t WebRtcIlbcfix_kLspMean[];
-extern const int16_t WebRtcIlbcfix_kCos[];
-extern const int16_t WebRtcIlbcfix_kCosDerivative[];
-extern const int16_t WebRtcIlbcfix_kCosGrid[];
-extern const int16_t WebRtcIlbcfix_kAcosDerivative[];
-
-/* state quantization tables */
-
-extern const int16_t WebRtcIlbcfix_kStateSq3[];
-extern const int32_t WebRtcIlbcfix_kChooseFrgQuant[];
-extern const int16_t WebRtcIlbcfix_kScale[];
-extern const int16_t WebRtcIlbcfix_kFrgQuantMod[];
-
-/* Ranges for search and filters at different subframes */
-
-extern const size_t WebRtcIlbcfix_kSearchRange[5][CB_NSTAGES];
-extern const size_t WebRtcIlbcfix_kFilterRange[];
-
-/* gain quantization tables */
-
-extern const int16_t WebRtcIlbcfix_kGainSq3[];
-extern const int16_t WebRtcIlbcfix_kGainSq4[];
-extern const int16_t WebRtcIlbcfix_kGainSq5[];
-extern const int16_t WebRtcIlbcfix_kGainSq5Sq[];
-extern const int16_t* const WebRtcIlbcfix_kGain[];
-
-/* adaptive codebook definitions */
-
-extern const int16_t WebRtcIlbcfix_kCbFiltersRev[];
-extern const int16_t WebRtcIlbcfix_kAlpha[];
-
-/* enhancer definitions */
-
-extern const int16_t WebRtcIlbcfix_kEnhPolyPhaser[ENH_UPS0][ENH_FLO_MULT2_PLUS1];
-extern const int16_t WebRtcIlbcfix_kEnhWt[];
-extern const size_t WebRtcIlbcfix_kEnhPlocs[];
-
-/* PLC tables */
-
-extern const int16_t WebRtcIlbcfix_kPlcPerSqr[];
-extern const int16_t WebRtcIlbcfix_kPlcPitchFact[];
-extern const int16_t WebRtcIlbcfix_kPlcPfSlope[];
-
-#endif
diff --git a/modules/audio_coding/codecs/ilbc/create_augmented_vec.c b/modules/audio_coding/codecs/ilbc/create_augmented_vec.c
deleted file mode 100644
index e05b88b..0000000
--- a/modules/audio_coding/codecs/ilbc/create_augmented_vec.c
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_CreateAugmentedVec.c
-
-******************************************************************/
-
-#include "defines.h"
-#include "constants.h"
-#include "webrtc/rtc_base/sanitizer.h"
-#include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
-
-/*----------------------------------------------------------------*
- *  Recreate a specific codebook vector from the augmented part.
- *
- *----------------------------------------------------------------*/
-
-void WebRtcIlbcfix_CreateAugmentedVec(
-    size_t index,          /* (i) Index for the augmented vector to be
-                              created */
-    const int16_t* buffer, /* (i) Pointer to the end of the codebook memory
-                              that is used for creation of the augmented
-                              codebook */
-    int16_t* cbVec) {      /* (o) The constructed codebook vector */
-  size_t ilow;
-  const int16_t *ppo, *ppi;
-  int16_t cbVecTmp[4];
-  /* Interpolation starts 4 elements before cbVec+index, but must not start
-     outside |cbVec|; clamping interp_len to stay within |cbVec|.
-   */
-  size_t interp_len = WEBRTC_SPL_MIN(index, 4);
-
-  rtc_MsanCheckInitialized(buffer - index - interp_len, sizeof(buffer[0]),
-                           index + interp_len);
-
-  ilow = index - interp_len;
-
-  /* copy the first noninterpolated part */
-  ppo = buffer-index;
-  WEBRTC_SPL_MEMCPY_W16(cbVec, ppo, index);
-
-  /* interpolation */
-  ppo = buffer - interp_len;
-  ppi = buffer - index - interp_len;
-
-  /* perform cbVec[ilow+k] = ((ppi[k]*alphaTbl[k])>>15) +
-                             ((ppo[k]*alphaTbl[interp_len-1-k])>>15);
-     for k = 0..interp_len-1
-  */
-  WebRtcSpl_ElementwiseVectorMult(&cbVec[ilow], ppi, WebRtcIlbcfix_kAlpha,
-                                  interp_len, 15);
-  WebRtcSpl_ReverseOrderMultArrayElements(
-      cbVecTmp, ppo, &WebRtcIlbcfix_kAlpha[interp_len - 1], interp_len, 15);
-  WebRtcSpl_AddVectorsAndShift(&cbVec[ilow], &cbVec[ilow], cbVecTmp, interp_len,
-                               0);
-
-  /* copy the second noninterpolated part */
-  ppo = buffer - index;
-  /* |tempbuff2| is declared in WebRtcIlbcfix_GetCbVec and is SUBL+5 elements
-     long. |buffer| points one element past the end of that vector, i.e., at
-     tempbuff2+SUBL+5. Since ppo=buffer-index, we cannot read any more than
-     |index| elements from |ppo|.
-
-     |cbVec| is declared to be SUBL elements long in WebRtcIlbcfix_CbConstruct.
-     Therefore, we can only write SUBL-index elements to cbVec+index.
-
-     These two conditions limit the number of elements to copy.
-   */
-  WEBRTC_SPL_MEMCPY_W16(cbVec+index, ppo, WEBRTC_SPL_MIN(SUBL-index, index));
-}
diff --git a/modules/audio_coding/codecs/ilbc/create_augmented_vec.h b/modules/audio_coding/codecs/ilbc/create_augmented_vec.h
deleted file mode 100644
index f2582cd..0000000
--- a/modules/audio_coding/codecs/ilbc/create_augmented_vec.h
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_CreateAugmentedVec.h
-
-******************************************************************/
-
-#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_CREATE_AUGMENTED_VEC_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_CREATE_AUGMENTED_VEC_H_
-
-#include "defines.h"
-
-/*----------------------------------------------------------------*
- *  Recreate a specific codebook vector from the augmented part.
- *
- *----------------------------------------------------------------*/
-
-void WebRtcIlbcfix_CreateAugmentedVec(
-    size_t index,          /* (i) Index for the augmented vector to be
-                              created */
-    const int16_t* buffer, /* (i) Pointer to the end of the codebook memory
-                              that is used for creation of the augmented
-                              codebook */
-    int16_t* cbVec);       /* (o) The construced codebook vector */
-
-#endif
diff --git a/modules/audio_coding/codecs/ilbc/decode.c b/modules/audio_coding/codecs/ilbc/decode.c
deleted file mode 100644
index a6e045d..0000000
--- a/modules/audio_coding/codecs/ilbc/decode.c
+++ /dev/null
@@ -1,257 +0,0 @@
-/*
- *  Copyright (c) 2012 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_Decode.c
-
-******************************************************************/
-
-#include "defines.h"
-#include "simple_lsf_dequant.h"
-#include "decoder_interpolate_lsf.h"
-#include "index_conv_dec.h"
-#include "do_plc.h"
-#include "constants.h"
-#include "enhancer_interface.h"
-#include "xcorr_coef.h"
-#include "lsf_check.h"
-#include "decode_residual.h"
-#include "unpack_bits.h"
-#include "hp_output.h"
-#include "init_decode.h"
-#ifndef WEBRTC_ARCH_BIG_ENDIAN
-#include "swap_bytes.h"
-#endif
-
-/*----------------------------------------------------------------*
- *  main decoder function
- *---------------------------------------------------------------*/
-
-int WebRtcIlbcfix_DecodeImpl(
-    int16_t *decblock,    /* (o) decoded signal block */
-    const uint16_t *bytes, /* (i) encoded signal bits */
-    IlbcDecoder *iLBCdec_inst, /* (i/o) the decoder state
-                                           structure */
-    int16_t mode      /* (i) 0: bad packet, PLC,
-                                                                   1: normal */
-                           ) {
-  const int old_mode = iLBCdec_inst->mode;
-  const int old_use_enhancer = iLBCdec_inst->use_enhancer;
-
-  size_t i;
-  int16_t order_plus_one;
-
-  int16_t last_bit;
-  int16_t *data;
-  /* Stack based */
-  int16_t decresidual[BLOCKL_MAX];
-  int16_t PLCresidual[BLOCKL_MAX + LPC_FILTERORDER];
-  int16_t syntdenum[NSUB_MAX*(LPC_FILTERORDER+1)];
-  int16_t PLClpc[LPC_FILTERORDER + 1];
-#ifndef WEBRTC_ARCH_BIG_ENDIAN
-  uint16_t swapped[NO_OF_WORDS_30MS];
-#endif
-  iLBC_bits *iLBCbits_inst = (iLBC_bits*)PLCresidual;
-
-  /* Reuse some buffers that are non overlapping in order to save stack memory */
-  data = &PLCresidual[LPC_FILTERORDER];
-
-  if (mode) { /* the data are good */
-
-    /* decode data */
-
-    /* Unpacketize bits into parameters */
-
-#ifndef WEBRTC_ARCH_BIG_ENDIAN
-    WebRtcIlbcfix_SwapBytes(bytes, iLBCdec_inst->no_of_words, swapped);
-    last_bit = WebRtcIlbcfix_UnpackBits(swapped, iLBCbits_inst, iLBCdec_inst->mode);
-#else
-    last_bit = WebRtcIlbcfix_UnpackBits(bytes, iLBCbits_inst, iLBCdec_inst->mode);
-#endif
-
-    /* Check for bit errors */
-    if (iLBCbits_inst->startIdx<1)
-      mode = 0;
-    if ((iLBCdec_inst->mode==20) && (iLBCbits_inst->startIdx>3))
-      mode = 0;
-    if ((iLBCdec_inst->mode==30) && (iLBCbits_inst->startIdx>5))
-      mode = 0;
-    if (last_bit==1)
-      mode = 0;
-
-    if (mode) { /* No bit errors was detected, continue decoding */
-      /* Stack based */
-      int16_t lsfdeq[LPC_FILTERORDER*LPC_N_MAX];
-      int16_t weightdenum[(LPC_FILTERORDER + 1)*NSUB_MAX];
-
-      /* adjust index */
-      WebRtcIlbcfix_IndexConvDec(iLBCbits_inst->cb_index);
-
-      /* decode the lsf */
-      WebRtcIlbcfix_SimpleLsfDeQ(lsfdeq, (int16_t*)(iLBCbits_inst->lsf), iLBCdec_inst->lpc_n);
-      WebRtcIlbcfix_LsfCheck(lsfdeq, LPC_FILTERORDER, iLBCdec_inst->lpc_n);
-      WebRtcIlbcfix_DecoderInterpolateLsp(syntdenum, weightdenum,
-                                          lsfdeq, LPC_FILTERORDER, iLBCdec_inst);
-
-      /* Decode the residual using the cb and gain indexes */
-      if (!WebRtcIlbcfix_DecodeResidual(iLBCdec_inst, iLBCbits_inst,
-                                        decresidual, syntdenum))
-        goto error;
-
-      /* preparing the plc for a future loss! */
-      WebRtcIlbcfix_DoThePlc(
-          PLCresidual, PLClpc, 0, decresidual,
-          syntdenum + (LPC_FILTERORDER + 1) * (iLBCdec_inst->nsub - 1),
-          iLBCdec_inst->last_lag, iLBCdec_inst);
-
-      /* Use the output from doThePLC */
-      WEBRTC_SPL_MEMCPY_W16(decresidual, PLCresidual, iLBCdec_inst->blockl);
-    }
-
-  }
-
-  if (mode == 0) {
-    /* the data is bad (either a PLC call
-     * was made or a bit error was detected)
-     */
-
-    /* packet loss conceal */
-
-    WebRtcIlbcfix_DoThePlc(PLCresidual, PLClpc, 1, decresidual, syntdenum,
-                           iLBCdec_inst->last_lag, iLBCdec_inst);
-
-    WEBRTC_SPL_MEMCPY_W16(decresidual, PLCresidual, iLBCdec_inst->blockl);
-
-    order_plus_one = LPC_FILTERORDER + 1;
-
-    for (i = 0; i < iLBCdec_inst->nsub; i++) {
-      WEBRTC_SPL_MEMCPY_W16(syntdenum+(i*order_plus_one),
-                            PLClpc, order_plus_one);
-    }
-  }
-
-  if ((*iLBCdec_inst).use_enhancer == 1) { /* Enhancer activated */
-
-    /* Update the filter and filter coefficients if there was a packet loss */
-    if (iLBCdec_inst->prev_enh_pl==2) {
-      for (i=0;i<iLBCdec_inst->nsub;i++) {
-        WEBRTC_SPL_MEMCPY_W16(&(iLBCdec_inst->old_syntdenum[i*(LPC_FILTERORDER+1)]),
-                              syntdenum, (LPC_FILTERORDER+1));
-      }
-    }
-
-    /* post filtering */
-    (*iLBCdec_inst).last_lag =
-        WebRtcIlbcfix_EnhancerInterface(data, decresidual, iLBCdec_inst);
-
-    /* synthesis filtering */
-
-    /* Set up the filter state */
-    WEBRTC_SPL_MEMCPY_W16(&data[-LPC_FILTERORDER], iLBCdec_inst->syntMem, LPC_FILTERORDER);
-
-    if (iLBCdec_inst->mode==20) {
-      /* Enhancer has 40 samples delay */
-      i=0;
-      WebRtcSpl_FilterARFastQ12(
-          data, data,
-          iLBCdec_inst->old_syntdenum + (i+iLBCdec_inst->nsub-1)*(LPC_FILTERORDER+1),
-          LPC_FILTERORDER+1, SUBL);
-
-      for (i=1; i < iLBCdec_inst->nsub; i++) {
-        WebRtcSpl_FilterARFastQ12(
-            data+i*SUBL, data+i*SUBL,
-            syntdenum+(i-1)*(LPC_FILTERORDER+1),
-            LPC_FILTERORDER+1, SUBL);
-      }
-
-    } else if (iLBCdec_inst->mode==30) {
-      /* Enhancer has 80 samples delay */
-      for (i=0; i < 2; i++) {
-        WebRtcSpl_FilterARFastQ12(
-            data+i*SUBL, data+i*SUBL,
-            iLBCdec_inst->old_syntdenum + (i+4)*(LPC_FILTERORDER+1),
-            LPC_FILTERORDER+1, SUBL);
-      }
-      for (i=2; i < iLBCdec_inst->nsub; i++) {
-        WebRtcSpl_FilterARFastQ12(
-            data+i*SUBL, data+i*SUBL,
-            syntdenum+(i-2)*(LPC_FILTERORDER+1),
-            LPC_FILTERORDER+1, SUBL);
-      }
-    }
-
-    /* Save the filter state */
-    WEBRTC_SPL_MEMCPY_W16(iLBCdec_inst->syntMem, &data[iLBCdec_inst->blockl-LPC_FILTERORDER], LPC_FILTERORDER);
-
-  } else { /* Enhancer not activated */
-    size_t lag;
-
-    /* Find last lag (since the enhancer is not called to give this info) */
-    lag = 20;
-    if (iLBCdec_inst->mode==20) {
-      lag = WebRtcIlbcfix_XcorrCoef(
-          &decresidual[iLBCdec_inst->blockl-60],
-          &decresidual[iLBCdec_inst->blockl-60-lag],
-          60,
-          80, lag, -1);
-    } else {
-      lag = WebRtcIlbcfix_XcorrCoef(
-          &decresidual[iLBCdec_inst->blockl-ENH_BLOCKL],
-          &decresidual[iLBCdec_inst->blockl-ENH_BLOCKL-lag],
-          ENH_BLOCKL,
-          100, lag, -1);
-    }
-
-    /* Store lag (it is needed if next packet is lost) */
-    (*iLBCdec_inst).last_lag = lag;
-
-    /* copy data and run synthesis filter */
-    WEBRTC_SPL_MEMCPY_W16(data, decresidual, iLBCdec_inst->blockl);
-
-    /* Set up the filter state */
-    WEBRTC_SPL_MEMCPY_W16(&data[-LPC_FILTERORDER], iLBCdec_inst->syntMem, LPC_FILTERORDER);
-
-    for (i=0; i < iLBCdec_inst->nsub; i++) {
-      WebRtcSpl_FilterARFastQ12(
-          data+i*SUBL, data+i*SUBL,
-          syntdenum + i*(LPC_FILTERORDER+1),
-          LPC_FILTERORDER+1, SUBL);
-    }
-
-    /* Save the filter state */
-    WEBRTC_SPL_MEMCPY_W16(iLBCdec_inst->syntMem, &data[iLBCdec_inst->blockl-LPC_FILTERORDER], LPC_FILTERORDER);
-  }
-
-  WEBRTC_SPL_MEMCPY_W16(decblock,data,iLBCdec_inst->blockl);
-
-  /* High pass filter the signal (with upscaling a factor 2 and saturation) */
-  WebRtcIlbcfix_HpOutput(decblock, (int16_t*)WebRtcIlbcfix_kHpOutCoefs,
-                         iLBCdec_inst->hpimemy, iLBCdec_inst->hpimemx,
-                         iLBCdec_inst->blockl);
-
-  WEBRTC_SPL_MEMCPY_W16(iLBCdec_inst->old_syntdenum,
-                        syntdenum, iLBCdec_inst->nsub*(LPC_FILTERORDER+1));
-
-  iLBCdec_inst->prev_enh_pl=0;
-
-  if (mode==0) { /* PLC was used */
-    iLBCdec_inst->prev_enh_pl=1;
-  }
-
-  return 0;  // Success.
-
-error:
-  // The decoder got sick from eating that data. Reset it and return.
-  WebRtcIlbcfix_InitDecode(iLBCdec_inst, old_mode, old_use_enhancer);
-  return -1;  // Error
-}
diff --git a/modules/audio_coding/codecs/ilbc/decode.h b/modules/audio_coding/codecs/ilbc/decode.h
deleted file mode 100644
index 2d05182..0000000
--- a/modules/audio_coding/codecs/ilbc/decode.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- *  Copyright (c) 2012 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_Decode.h
-
-******************************************************************/
-
-#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_DECODE_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_DECODE_H_
-
-#include "defines.h"
-
-/*----------------------------------------------------------------*
- *  main decoder function
- *---------------------------------------------------------------*/
-
-// Returns 0 on success, -1 on error.
-int WebRtcIlbcfix_DecodeImpl(
-    int16_t* decblock,         /* (o) decoded signal block */
-    const uint16_t* bytes,     /* (i) encoded signal bits */
-    IlbcDecoder* iLBCdec_inst, /* (i/o) the decoder state
-                                           structure */
-    int16_t mode               /* (i) 0: bad packet, PLC,
-                                      1: normal */
-    ) RTC_WARN_UNUSED_RESULT;
-
-#endif
diff --git a/modules/audio_coding/codecs/ilbc/decode_residual.c b/modules/audio_coding/codecs/ilbc/decode_residual.c
deleted file mode 100644
index dd5c353..0000000
--- a/modules/audio_coding/codecs/ilbc/decode_residual.c
+++ /dev/null
@@ -1,185 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_DecodeResidual.c
-
-******************************************************************/
-
-#include "decode_residual.h"
-
-#include <string.h>
-
-#include "defines.h"
-#include "state_construct.h"
-#include "cb_construct.h"
-#include "index_conv_dec.h"
-#include "do_plc.h"
-#include "constants.h"
-#include "enhancer_interface.h"
-#include "xcorr_coef.h"
-#include "lsf_check.h"
-
-/*----------------------------------------------------------------*
- *  frame residual decoder function (subrutine to iLBC_decode)
- *---------------------------------------------------------------*/
-
-bool WebRtcIlbcfix_DecodeResidual(
-    IlbcDecoder *iLBCdec_inst,
-    /* (i/o) the decoder state structure */
-    iLBC_bits *iLBC_encbits, /* (i/o) Encoded bits, which are used
-                                for the decoding  */
-    int16_t *decresidual,  /* (o) decoded residual frame */
-    int16_t *syntdenum   /* (i) the decoded synthesis filter
-                                  coefficients */
-                                  ) {
-  size_t meml_gotten, diff, start_pos;
-  size_t subcount, subframe;
-  int16_t *reverseDecresidual = iLBCdec_inst->enh_buf; /* Reversed decoded data, used for decoding backwards in time (reuse memory in state) */
-  int16_t *memVec = iLBCdec_inst->prevResidual;  /* Memory for codebook and filter state (reuse memory in state) */
-  int16_t *mem = &memVec[CB_HALFFILTERLEN];   /* Memory for codebook */
-
-  diff = STATE_LEN - iLBCdec_inst->state_short_len;
-
-  if (iLBC_encbits->state_first == 1) {
-    start_pos = (iLBC_encbits->startIdx-1)*SUBL;
-  } else {
-    start_pos = (iLBC_encbits->startIdx-1)*SUBL + diff;
-  }
-
-  /* decode scalar part of start state */
-
-  WebRtcIlbcfix_StateConstruct(iLBC_encbits->idxForMax,
-                               iLBC_encbits->idxVec, &syntdenum[(iLBC_encbits->startIdx-1)*(LPC_FILTERORDER+1)],
-                               &decresidual[start_pos], iLBCdec_inst->state_short_len
-                               );
-
-  if (iLBC_encbits->state_first) { /* put adaptive part in the end */
-
-    /* setup memory */
-
-    WebRtcSpl_MemSetW16(mem, 0, CB_MEML - iLBCdec_inst->state_short_len);
-    WEBRTC_SPL_MEMCPY_W16(mem+CB_MEML-iLBCdec_inst->state_short_len, decresidual+start_pos,
-                          iLBCdec_inst->state_short_len);
-
-    /* construct decoded vector */
-
-    if (!WebRtcIlbcfix_CbConstruct(
-            &decresidual[start_pos + iLBCdec_inst->state_short_len],
-            iLBC_encbits->cb_index, iLBC_encbits->gain_index,
-            mem + CB_MEML - ST_MEM_L_TBL, ST_MEM_L_TBL, diff))
-      return false;  // Error.
-
-  }
-  else {/* put adaptive part in the beginning */
-
-    /* setup memory */
-
-    meml_gotten = iLBCdec_inst->state_short_len;
-    WebRtcSpl_MemCpyReversedOrder(mem+CB_MEML-1,
-                                  decresidual+start_pos, meml_gotten);
-    WebRtcSpl_MemSetW16(mem, 0, CB_MEML - meml_gotten);
-
-    /* construct decoded vector */
-
-    if (!WebRtcIlbcfix_CbConstruct(reverseDecresidual, iLBC_encbits->cb_index,
-                                   iLBC_encbits->gain_index,
-                                   mem + CB_MEML - ST_MEM_L_TBL, ST_MEM_L_TBL,
-                                   diff))
-      return false;  // Error.
-
-    /* get decoded residual from reversed vector */
-
-    WebRtcSpl_MemCpyReversedOrder(&decresidual[start_pos-1],
-                                  reverseDecresidual, diff);
-  }
-
-  /* counter for predicted subframes */
-
-  subcount=1;
-
-  /* forward prediction of subframes */
-
-  if (iLBCdec_inst->nsub > iLBC_encbits->startIdx + 1) {
-
-    /* setup memory */
-    WebRtcSpl_MemSetW16(mem, 0, CB_MEML-STATE_LEN);
-    WEBRTC_SPL_MEMCPY_W16(mem+CB_MEML-STATE_LEN,
-                          decresidual+(iLBC_encbits->startIdx-1)*SUBL, STATE_LEN);
-
-    /* loop over subframes to encode */
-
-    size_t Nfor = iLBCdec_inst->nsub - iLBC_encbits->startIdx - 1;
-    for (subframe=0; subframe<Nfor; subframe++) {
-
-      /* construct decoded vector */
-      if (!WebRtcIlbcfix_CbConstruct(
-              &decresidual[(iLBC_encbits->startIdx + 1 + subframe) * SUBL],
-              iLBC_encbits->cb_index + subcount * CB_NSTAGES,
-              iLBC_encbits->gain_index + subcount * CB_NSTAGES, mem, MEM_LF_TBL,
-              SUBL))
-        return false;  // Error;
-
-      /* update memory */
-      memmove(mem, mem + SUBL, (CB_MEML - SUBL) * sizeof(*mem));
-      WEBRTC_SPL_MEMCPY_W16(mem+CB_MEML-SUBL,
-                            &decresidual[(iLBC_encbits->startIdx+1+subframe)*SUBL], SUBL);
-
-      subcount++;
-    }
-
-  }
-
-  /* backward prediction of subframes */
-
-  if (iLBC_encbits->startIdx > 1) {
-
-    /* setup memory */
-
-    meml_gotten = SUBL*(iLBCdec_inst->nsub+1-iLBC_encbits->startIdx);
-    if( meml_gotten > CB_MEML ) {
-      meml_gotten=CB_MEML;
-    }
-
-    WebRtcSpl_MemCpyReversedOrder(mem+CB_MEML-1,
-                                  decresidual+(iLBC_encbits->startIdx-1)*SUBL, meml_gotten);
-    WebRtcSpl_MemSetW16(mem, 0, CB_MEML - meml_gotten);
-
-    /* loop over subframes to decode */
-
-    size_t Nback = iLBC_encbits->startIdx - 1;
-    for (subframe=0; subframe<Nback; subframe++) {
-
-      /* construct decoded vector */
-      if (!WebRtcIlbcfix_CbConstruct(
-              &reverseDecresidual[subframe * SUBL],
-              iLBC_encbits->cb_index + subcount * CB_NSTAGES,
-              iLBC_encbits->gain_index + subcount * CB_NSTAGES, mem, MEM_LF_TBL,
-              SUBL))
-        return false;  // Error.
-
-      /* update memory */
-      memmove(mem, mem + SUBL, (CB_MEML - SUBL) * sizeof(*mem));
-      WEBRTC_SPL_MEMCPY_W16(mem+CB_MEML-SUBL,
-                            &reverseDecresidual[subframe*SUBL], SUBL);
-
-      subcount++;
-    }
-
-    /* get decoded residual from reversed vector */
-    WebRtcSpl_MemCpyReversedOrder(decresidual+SUBL*Nback-1,
-                                  reverseDecresidual, SUBL*Nback);
-  }
-
-  return true;  // Success.
-}
diff --git a/modules/audio_coding/codecs/ilbc/decode_residual.h b/modules/audio_coding/codecs/ilbc/decode_residual.h
deleted file mode 100644
index e3fb7f7..0000000
--- a/modules/audio_coding/codecs/ilbc/decode_residual.h
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_DecodeResidual.h
-
-******************************************************************/
-
-#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_DECODE_RESIDUAL_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_DECODE_RESIDUAL_H_
-
-#include <stdbool.h>
-#include "defines.h"
-
-/*----------------------------------------------------------------*
- *  frame residual decoder function (subrutine to iLBC_decode)
- *---------------------------------------------------------------*/
-
-// Returns true on success, false on failure. In case of failure, the decoder
-// state may be corrupted and needs resetting.
-bool WebRtcIlbcfix_DecodeResidual(
-    IlbcDecoder* iLBCdec_inst, /* (i/o) the decoder state structure */
-    iLBC_bits* iLBC_encbits,   /* (i/o) Encoded bits, which are used
-                                        for the decoding  */
-    int16_t* decresidual,      /* (o) decoded residual frame */
-    int16_t* syntdenum         /* (i) the decoded synthesis filter
-                                                         coefficients */
-    ) RTC_WARN_UNUSED_RESULT;
-
-#endif
diff --git a/modules/audio_coding/codecs/ilbc/decoder_interpolate_lsf.c b/modules/audio_coding/codecs/ilbc/decoder_interpolate_lsf.c
deleted file mode 100644
index 06ab2e7..0000000
--- a/modules/audio_coding/codecs/ilbc/decoder_interpolate_lsf.c
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_DecoderInterpolateLsp.c
-
-******************************************************************/
-
-#include "lsf_interpolate_to_poly_dec.h"
-#include "bw_expand.h"
-#include "defines.h"
-#include "constants.h"
-
-/*----------------------------------------------------------------*
- *  obtain synthesis and weighting filters form lsf coefficients
- *---------------------------------------------------------------*/
-
-void WebRtcIlbcfix_DecoderInterpolateLsp(
-    int16_t *syntdenum,  /* (o) synthesis filter coefficients */
-    int16_t *weightdenum, /* (o) weighting denumerator
-                                   coefficients */
-    int16_t *lsfdeq,   /* (i) dequantized lsf coefficients */
-    int16_t length,   /* (i) length of lsf coefficient vector */
-    IlbcDecoder *iLBCdec_inst
-    /* (i) the decoder state structure */
-                                          ){
-  size_t i;
-  int pos, lp_length;
-  int16_t  lp[LPC_FILTERORDER + 1], *lsfdeq2;
-
-  lsfdeq2 = lsfdeq + length;
-  lp_length = length + 1;
-
-  if (iLBCdec_inst->mode==30) {
-    /* subframe 1: Interpolation between old and first LSF */
-
-    WebRtcIlbcfix_LspInterpolate2PolyDec(lp, (*iLBCdec_inst).lsfdeqold, lsfdeq,
-                                         WebRtcIlbcfix_kLsfWeight30ms[0], length);
-    WEBRTC_SPL_MEMCPY_W16(syntdenum,lp,lp_length);
-    WebRtcIlbcfix_BwExpand(weightdenum, lp, (int16_t*)WebRtcIlbcfix_kLpcChirpSyntDenum, (int16_t)lp_length);
-
-    /* subframes 2 to 6: interpolation between first and last LSF */
-
-    pos = lp_length;
-    for (i = 1; i < 6; i++) {
-      WebRtcIlbcfix_LspInterpolate2PolyDec(lp, lsfdeq, lsfdeq2,
-                                           WebRtcIlbcfix_kLsfWeight30ms[i], length);
-      WEBRTC_SPL_MEMCPY_W16(syntdenum + pos,lp,lp_length);
-      WebRtcIlbcfix_BwExpand(weightdenum + pos, lp,
-                             (int16_t*)WebRtcIlbcfix_kLpcChirpSyntDenum, (int16_t)lp_length);
-      pos += lp_length;
-    }
-  } else { /* iLBCdec_inst->mode=20 */
-    /* subframes 1 to 4: interpolation between old and new LSF */
-    pos = 0;
-    for (i = 0; i < iLBCdec_inst->nsub; i++) {
-      WebRtcIlbcfix_LspInterpolate2PolyDec(lp, iLBCdec_inst->lsfdeqold, lsfdeq,
-                                           WebRtcIlbcfix_kLsfWeight20ms[i], length);
-      WEBRTC_SPL_MEMCPY_W16(syntdenum+pos,lp,lp_length);
-      WebRtcIlbcfix_BwExpand(weightdenum+pos, lp,
-                             (int16_t*)WebRtcIlbcfix_kLpcChirpSyntDenum, (int16_t)lp_length);
-      pos += lp_length;
-    }
-  }
-
-  /* update memory */
-
-  if (iLBCdec_inst->mode==30) {
-    WEBRTC_SPL_MEMCPY_W16(iLBCdec_inst->lsfdeqold, lsfdeq2, length);
-  } else {
-    WEBRTC_SPL_MEMCPY_W16(iLBCdec_inst->lsfdeqold, lsfdeq, length);
-  }
-}
diff --git a/modules/audio_coding/codecs/ilbc/decoder_interpolate_lsf.h b/modules/audio_coding/codecs/ilbc/decoder_interpolate_lsf.h
deleted file mode 100644
index 37ecf07..0000000
--- a/modules/audio_coding/codecs/ilbc/decoder_interpolate_lsf.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_DecoderInterpolateLsp.h
-
-******************************************************************/
-
-#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_DECODER_INTERPOLATE_LSF_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_DECODER_INTERPOLATE_LSF_H_
-
-#include "defines.h"
-
-/*----------------------------------------------------------------*
- *  obtain synthesis and weighting filters form lsf coefficients
- *---------------------------------------------------------------*/
-
-void WebRtcIlbcfix_DecoderInterpolateLsp(
-    int16_t *syntdenum,  /* (o) synthesis filter coefficients */
-    int16_t *weightdenum, /* (o) weighting denumerator
-                                   coefficients */
-    int16_t *lsfdeq,   /* (i) dequantized lsf coefficients */
-    int16_t length,   /* (i) length of lsf coefficient vector */
-    IlbcDecoder *iLBCdec_inst
-    /* (i) the decoder state structure */
-                                          );
-
-#endif
diff --git a/modules/audio_coding/codecs/ilbc/defines.h b/modules/audio_coding/codecs/ilbc/defines.h
deleted file mode 100644
index 2faaea1..0000000
--- a/modules/audio_coding/codecs/ilbc/defines.h
+++ /dev/null
@@ -1,220 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- define.h
-
-******************************************************************/
-#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_DEFINES_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_DEFINES_H_
-
-#include <string.h>
-#include "signal_processing_library.h"
-#include "webrtc/typedefs.h"
-
-/* general codec settings */
-
-#define FS       8000
-#define BLOCKL_20MS     160
-#define BLOCKL_30MS     240
-#define BLOCKL_MAX     240
-#define NSUB_20MS     4
-#define NSUB_30MS     6
-#define NSUB_MAX     6
-#define NASUB_20MS     2
-#define NASUB_30MS     4
-#define NASUB_MAX     4
-#define SUBL      40
-#define STATE_LEN     80
-#define STATE_SHORT_LEN_30MS  58
-#define STATE_SHORT_LEN_20MS  57
-
-/* LPC settings */
-
-#define LPC_FILTERORDER    10
-#define LPC_LOOKBACK    60
-#define LPC_N_20MS     1
-#define LPC_N_30MS     2
-#define LPC_N_MAX     2
-#define LPC_ASYMDIFF    20
-#define LSF_NSPLIT     3
-#define LSF_NUMBER_OF_STEPS   4
-#define LPC_HALFORDER    5
-#define COS_GRID_POINTS 60
-
-/* cb settings */
-
-#define CB_NSTAGES     3
-#define CB_EXPAND     2
-#define CB_MEML      147
-#define CB_FILTERLEN    (2*4)
-#define CB_HALFFILTERLEN   4
-#define CB_RESRANGE     34
-#define CB_MAXGAIN_FIXQ6   83 /* error = -0.24% */
-#define CB_MAXGAIN_FIXQ14   21299
-
-/* enhancer */
-
-#define ENH_BLOCKL     80  /* block length */
-#define ENH_BLOCKL_HALF    (ENH_BLOCKL/2)
-#define ENH_HL      3  /* 2*ENH_HL+1 is number blocks
-                                                                           in said second sequence */
-#define ENH_SLOP     2  /* max difference estimated and
-                                                                           correct pitch period */
-#define ENH_PLOCSL     8  /* pitch-estimates and
-                                                                           pitch-locations buffer length */
-#define ENH_OVERHANG    2
-#define ENH_UPS0     4  /* upsampling rate */
-#define ENH_FL0      3  /* 2*FLO+1 is the length of each filter */
-#define ENH_FLO_MULT2_PLUS1   7
-#define ENH_VECTL     (ENH_BLOCKL+2*ENH_FL0)
-#define ENH_CORRDIM     (2*ENH_SLOP+1)
-#define ENH_NBLOCKS     (BLOCKL/ENH_BLOCKL)
-#define ENH_NBLOCKS_EXTRA   5
-#define ENH_NBLOCKS_TOT    8 /* ENH_NBLOCKS+ENH_NBLOCKS_EXTRA */
-#define ENH_BUFL     (ENH_NBLOCKS_TOT)*ENH_BLOCKL
-#define ENH_BUFL_FILTEROVERHEAD  3
-#define ENH_A0      819   /* Q14 */
-#define ENH_A0_MINUS_A0A0DIV4  848256041 /* Q34 */
-#define ENH_A0DIV2     26843546 /* Q30 */
-
-/* PLC */
-
-/* Down sampling */
-
-#define FILTERORDER_DS_PLUS1  7
-#define DELAY_DS     3
-#define FACTOR_DS     2
-
-/* bit stream defs */
-
-#define NO_OF_BYTES_20MS   38
-#define NO_OF_BYTES_30MS   50
-#define NO_OF_WORDS_20MS   19
-#define NO_OF_WORDS_30MS   25
-#define STATE_BITS     3
-#define BYTE_LEN     8
-#define ULP_CLASSES     3
-
-/* help parameters */
-
-#define TWO_PI_FIX     25736 /* Q12 */
-
-/* Constants for codebook search and creation */
-
-#define ST_MEM_L_TBL  85
-#define MEM_LF_TBL  147
-
-
-/* Struct for the bits */
-typedef struct iLBC_bits_t_ {
-  int16_t lsf[LSF_NSPLIT*LPC_N_MAX];
-  int16_t cb_index[CB_NSTAGES*(NASUB_MAX+1)];  /* First CB_NSTAGES values contains extra CB index */
-  int16_t gain_index[CB_NSTAGES*(NASUB_MAX+1)]; /* First CB_NSTAGES values contains extra CB gain */
-  size_t idxForMax;
-  int16_t state_first;
-  int16_t idxVec[STATE_SHORT_LEN_30MS];
-  int16_t firstbits;
-  size_t startIdx;
-} iLBC_bits;
-
-/* type definition encoder instance */
-typedef struct IlbcEncoder_ {
-
-  /* flag for frame size mode */
-  int16_t mode;
-
-  /* basic parameters for different frame sizes */
-  size_t blockl;
-  size_t nsub;
-  int16_t nasub;
-  size_t no_of_bytes, no_of_words;
-  int16_t lpc_n;
-  size_t state_short_len;
-
-  /* analysis filter state */
-  int16_t anaMem[LPC_FILTERORDER];
-
-  /* Fix-point old lsf parameters for interpolation */
-  int16_t lsfold[LPC_FILTERORDER];
-  int16_t lsfdeqold[LPC_FILTERORDER];
-
-  /* signal buffer for LP analysis */
-  int16_t lpc_buffer[LPC_LOOKBACK + BLOCKL_MAX];
-
-  /* state of input HP filter */
-  int16_t hpimemx[2];
-  int16_t hpimemy[4];
-
-#ifdef SPLIT_10MS
-  int16_t weightdenumbuf[66];
-  int16_t past_samples[160];
-  uint16_t bytes[25];
-  int16_t section;
-  int16_t Nfor_flag;
-  int16_t Nback_flag;
-  int16_t start_pos;
-  size_t diff;
-#endif
-
-} IlbcEncoder;
-
-/* type definition decoder instance */
-typedef struct IlbcDecoder_ {
-
-  /* flag for frame size mode */
-  int16_t mode;
-
-  /* basic parameters for different frame sizes */
-  size_t blockl;
-  size_t nsub;
-  int16_t nasub;
-  size_t no_of_bytes, no_of_words;
-  int16_t lpc_n;
-  size_t state_short_len;
-
-  /* synthesis filter state */
-  int16_t syntMem[LPC_FILTERORDER];
-
-  /* old LSF for interpolation */
-  int16_t lsfdeqold[LPC_FILTERORDER];
-
-  /* pitch lag estimated in enhancer and used in PLC */
-  size_t last_lag;
-
-  /* PLC state information */
-  int consPLICount, prev_enh_pl;
-  int16_t perSquare;
-
-  int16_t prevScale, prevPLI;
-  size_t prevLag;
-  int16_t prevLpc[LPC_FILTERORDER+1];
-  int16_t prevResidual[NSUB_MAX*SUBL];
-  int16_t seed;
-
-  /* previous synthesis filter parameters */
-
-  int16_t old_syntdenum[(LPC_FILTERORDER + 1)*NSUB_MAX];
-
-  /* state of output HP filter */
-  int16_t hpimemx[2];
-  int16_t hpimemy[4];
-
-  /* enhancer state information */
-  int use_enhancer;
-  int16_t enh_buf[ENH_BUFL+ENH_BUFL_FILTEROVERHEAD];
-  size_t enh_period[ENH_NBLOCKS_TOT];
-
-} IlbcDecoder;
-
-#endif
diff --git a/modules/audio_coding/codecs/ilbc/do_plc.c b/modules/audio_coding/codecs/ilbc/do_plc.c
deleted file mode 100644
index ebddec3..0000000
--- a/modules/audio_coding/codecs/ilbc/do_plc.c
+++ /dev/null
@@ -1,307 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_DoThePlc.c
-
-******************************************************************/
-
-#include "defines.h"
-#include "constants.h"
-#include "comp_corr.h"
-#include "bw_expand.h"
-
-/*----------------------------------------------------------------*
- *  Packet loss concealment routine. Conceals a residual signal
- *  and LP parameters. If no packet loss, update state.
- *---------------------------------------------------------------*/
-
-void WebRtcIlbcfix_DoThePlc(
-    int16_t *PLCresidual,  /* (o) concealed residual */
-    int16_t *PLClpc,    /* (o) concealed LP parameters */
-    int16_t PLI,     /* (i) packet loss indicator
-                                                           0 - no PL, 1 = PL */
-    int16_t *decresidual,  /* (i) decoded residual */
-    int16_t *lpc,    /* (i) decoded LPC (only used for no PL) */
-    size_t inlag,    /* (i) pitch lag */
-    IlbcDecoder *iLBCdec_inst
-    /* (i/o) decoder instance */
-                            ){
-  size_t i;
-  int32_t cross, ener, cross_comp, ener_comp = 0;
-  int32_t measure, maxMeasure, energy;
-  int16_t max, crossSquareMax, crossSquare;
-  size_t j, lag, randlag;
-  int16_t tmp1, tmp2;
-  int16_t shift1, shift2, shift3, shiftMax;
-  int16_t scale3;
-  size_t corrLen;
-  int32_t tmpW32, tmp2W32;
-  int16_t use_gain;
-  int16_t tot_gain;
-  int16_t max_perSquare;
-  int16_t scale1, scale2;
-  int16_t totscale;
-  int32_t nom;
-  int16_t denom;
-  int16_t pitchfact;
-  size_t use_lag;
-  int ind;
-  int16_t randvec[BLOCKL_MAX];
-
-  /* Packet Loss */
-  if (PLI == 1) {
-
-    (*iLBCdec_inst).consPLICount += 1;
-
-    /* if previous frame not lost,
-       determine pitch pred. gain */
-
-    if (iLBCdec_inst->prevPLI != 1) {
-
-      /* Maximum 60 samples are correlated, preserve as high accuracy
-         as possible without getting overflow */
-      max = WebRtcSpl_MaxAbsValueW16((*iLBCdec_inst).prevResidual,
-                                     iLBCdec_inst->blockl);
-      scale3 = (WebRtcSpl_GetSizeInBits(max)<<1) - 25;
-      if (scale3 < 0) {
-        scale3 = 0;
-      }
-
-      /* Store scale for use when interpolating between the
-       * concealment and the received packet */
-      iLBCdec_inst->prevScale = scale3;
-
-      /* Search around the previous lag +/-3 to find the
-         best pitch period */
-      lag = inlag - 3;
-
-      /* Guard against getting outside the frame */
-      corrLen = (size_t)WEBRTC_SPL_MIN(60, iLBCdec_inst->blockl-(inlag+3));
-
-      WebRtcIlbcfix_CompCorr( &cross, &ener,
-                              iLBCdec_inst->prevResidual, lag, iLBCdec_inst->blockl, corrLen, scale3);
-
-      /* Normalize and store cross^2 and the number of shifts */
-      shiftMax = WebRtcSpl_GetSizeInBits(WEBRTC_SPL_ABS_W32(cross))-15;
-      crossSquareMax = (int16_t)((
-          (int16_t)WEBRTC_SPL_SHIFT_W32(cross, -shiftMax) *
-          (int16_t)WEBRTC_SPL_SHIFT_W32(cross, -shiftMax)) >> 15);
-
-      for (j=inlag-2;j<=inlag+3;j++) {
-        WebRtcIlbcfix_CompCorr( &cross_comp, &ener_comp,
-                                iLBCdec_inst->prevResidual, j, iLBCdec_inst->blockl, corrLen, scale3);
-
-        /* Use the criteria (corr*corr)/energy to compare if
-           this lag is better or not. To avoid the division,
-           do a cross multiplication */
-        shift1 = WebRtcSpl_GetSizeInBits(WEBRTC_SPL_ABS_W32(cross_comp))-15;
-        crossSquare = (int16_t)((
-            (int16_t)WEBRTC_SPL_SHIFT_W32(cross_comp, -shift1) *
-            (int16_t)WEBRTC_SPL_SHIFT_W32(cross_comp, -shift1)) >> 15);
-
-        shift2 = WebRtcSpl_GetSizeInBits(ener)-15;
-        measure = (int16_t)WEBRTC_SPL_SHIFT_W32(ener, -shift2) * crossSquare;
-
-        shift3 = WebRtcSpl_GetSizeInBits(ener_comp)-15;
-        maxMeasure = (int16_t)WEBRTC_SPL_SHIFT_W32(ener_comp, -shift3) *
-            crossSquareMax;
-
-        /* Calculate shift value, so that the two measures can
-           be put in the same Q domain */
-        if(2 * shiftMax + shift3 > 2 * shift1 + shift2) {
-          tmp1 =
-              WEBRTC_SPL_MIN(31, 2 * shiftMax + shift3 - 2 * shift1 - shift2);
-          tmp2 = 0;
-        } else {
-          tmp1 = 0;
-          tmp2 =
-              WEBRTC_SPL_MIN(31, 2 * shift1 + shift2 - 2 * shiftMax - shift3);
-        }
-
-        if ((measure>>tmp1) > (maxMeasure>>tmp2)) {
-          /* New lag is better => record lag, measure and domain */
-          lag = j;
-          crossSquareMax = crossSquare;
-          cross = cross_comp;
-          shiftMax = shift1;
-          ener = ener_comp;
-        }
-      }
-
-      /* Calculate the periodicity for the lag with the maximum correlation.
-
-         Definition of the periodicity:
-         abs(corr(vec1, vec2))/(sqrt(energy(vec1))*sqrt(energy(vec2)))
-
-         Work in the Square domain to simplify the calculations
-         max_perSquare is less than 1 (in Q15)
-      */
-      tmp2W32=WebRtcSpl_DotProductWithScale(&iLBCdec_inst->prevResidual[iLBCdec_inst->blockl-corrLen],
-                                            &iLBCdec_inst->prevResidual[iLBCdec_inst->blockl-corrLen],
-                                            corrLen, scale3);
-
-      if ((tmp2W32>0)&&(ener_comp>0)) {
-        /* norm energies to int16_t, compute the product of the energies and
-           use the upper int16_t as the denominator */
-
-        scale1=(int16_t)WebRtcSpl_NormW32(tmp2W32)-16;
-        tmp1=(int16_t)WEBRTC_SPL_SHIFT_W32(tmp2W32, scale1);
-
-        scale2=(int16_t)WebRtcSpl_NormW32(ener)-16;
-        tmp2=(int16_t)WEBRTC_SPL_SHIFT_W32(ener, scale2);
-        denom = (int16_t)((tmp1 * tmp2) >> 16);  /* in Q(scale1+scale2-16) */
-
-        /* Square the cross correlation and norm it such that max_perSquare
-           will be in Q15 after the division */
-
-        totscale = scale1+scale2-1;
-        tmp1 = (int16_t)WEBRTC_SPL_SHIFT_W32(cross, (totscale>>1));
-        tmp2 = (int16_t)WEBRTC_SPL_SHIFT_W32(cross, totscale-(totscale>>1));
-
-        nom = tmp1 * tmp2;
-        max_perSquare = (int16_t)WebRtcSpl_DivW32W16(nom, denom);
-
-      } else {
-        max_perSquare = 0;
-      }
-    }
-
-    /* previous frame lost, use recorded lag and gain */
-
-    else {
-      lag = iLBCdec_inst->prevLag;
-      max_perSquare = iLBCdec_inst->perSquare;
-    }
-
-    /* Attenuate signal and scale down pitch pred gain if
-       several frames lost consecutively */
-
-    use_gain = 32767;   /* 1.0 in Q15 */
-
-    if (iLBCdec_inst->consPLICount*iLBCdec_inst->blockl>320) {
-      use_gain = 29491;  /* 0.9 in Q15 */
-    } else if (iLBCdec_inst->consPLICount*iLBCdec_inst->blockl>640) {
-      use_gain = 22938;  /* 0.7 in Q15 */
-    } else if (iLBCdec_inst->consPLICount*iLBCdec_inst->blockl>960) {
-      use_gain = 16384;  /* 0.5 in Q15 */
-    } else if (iLBCdec_inst->consPLICount*iLBCdec_inst->blockl>1280) {
-      use_gain = 0;   /* 0.0 in Q15 */
-    }
-
-    /* Compute mixing factor of picth repeatition and noise:
-       for max_per>0.7 set periodicity to 1.0
-       0.4<max_per<0.7 set periodicity to (maxper-0.4)/0.7-0.4)
-       max_per<0.4 set periodicity to 0.0
-    */
-
-    if (max_perSquare>7868) { /* periodicity > 0.7  (0.7^4=0.2401 in Q15) */
-      pitchfact = 32767;
-    } else if (max_perSquare>839) { /* 0.4 < periodicity < 0.7 (0.4^4=0.0256 in Q15) */
-      /* find best index and interpolate from that */
-      ind = 5;
-      while ((max_perSquare<WebRtcIlbcfix_kPlcPerSqr[ind])&&(ind>0)) {
-        ind--;
-      }
-      /* pitch fact is approximated by first order */
-      tmpW32 = (int32_t)WebRtcIlbcfix_kPlcPitchFact[ind] +
-          ((WebRtcIlbcfix_kPlcPfSlope[ind] *
-              (max_perSquare - WebRtcIlbcfix_kPlcPerSqr[ind])) >> 11);
-
-      pitchfact = (int16_t)WEBRTC_SPL_MIN(tmpW32, 32767); /* guard against overflow */
-
-    } else { /* periodicity < 0.4 */
-      pitchfact = 0;
-    }
-
-    /* avoid repetition of same pitch cycle (buzzyness) */
-    use_lag = lag;
-    if (lag<80) {
-      use_lag = 2*lag;
-    }
-
-    /* compute concealed residual */
-    energy = 0;
-
-    for (i=0; i<iLBCdec_inst->blockl; i++) {
-
-      /* noise component -  52 < randlagFIX < 117 */
-      iLBCdec_inst->seed = (int16_t)(iLBCdec_inst->seed * 31821 + 13849);
-      randlag = 53 + (iLBCdec_inst->seed & 63);
-      if (randlag > i) {
-        randvec[i] =
-            iLBCdec_inst->prevResidual[iLBCdec_inst->blockl + i - randlag];
-      } else {
-        randvec[i] = iLBCdec_inst->prevResidual[i - randlag];
-      }
-
-      /* pitch repeatition component */
-      if (use_lag > i) {
-        PLCresidual[i] =
-            iLBCdec_inst->prevResidual[iLBCdec_inst->blockl + i - use_lag];
-      } else {
-        PLCresidual[i] = PLCresidual[i - use_lag];
-      }
-
-      /* Attinuate total gain for each 10 ms */
-      if (i<80) {
-        tot_gain=use_gain;
-      } else if (i<160) {
-        tot_gain = (int16_t)((31130 * use_gain) >> 15);  /* 0.95*use_gain */
-      } else {
-        tot_gain = (int16_t)((29491 * use_gain) >> 15);  /* 0.9*use_gain */
-      }
-
-
-      /* mix noise and pitch repeatition */
-      PLCresidual[i] = (int16_t)((tot_gain *
-          ((pitchfact * PLCresidual[i] + (32767 - pitchfact) * randvec[i] +
-              16384) >> 15)) >> 15);
-
-      /* Shifting down the result one step extra to ensure that no overflow
-         will occur */
-      energy += (PLCresidual[i] * PLCresidual[i]) >>
-          (iLBCdec_inst->prevScale + 1);
-    }
-
-    /* less than 30 dB, use only noise */
-    if (energy < (WEBRTC_SPL_SHIFT_W32(((int32_t)iLBCdec_inst->blockl*900),-(iLBCdec_inst->prevScale+1)))) {
-      energy = 0;
-      for (i=0; i<iLBCdec_inst->blockl; i++) {
-        PLCresidual[i] = randvec[i];
-      }
-    }
-
-    /* use the old LPC */
-    WEBRTC_SPL_MEMCPY_W16(PLClpc, (*iLBCdec_inst).prevLpc, LPC_FILTERORDER+1);
-
-    /* Update state in case there are multiple frame losses */
-    iLBCdec_inst->prevLag = lag;
-    iLBCdec_inst->perSquare = max_perSquare;
-  }
-
-  /* no packet loss, copy input */
-
-  else {
-    WEBRTC_SPL_MEMCPY_W16(PLCresidual, decresidual, iLBCdec_inst->blockl);
-    WEBRTC_SPL_MEMCPY_W16(PLClpc, lpc, (LPC_FILTERORDER+1));
-    iLBCdec_inst->consPLICount = 0;
-  }
-
-  /* update state */
-  iLBCdec_inst->prevPLI = PLI;
-  WEBRTC_SPL_MEMCPY_W16(iLBCdec_inst->prevLpc, PLClpc, (LPC_FILTERORDER+1));
-  WEBRTC_SPL_MEMCPY_W16(iLBCdec_inst->prevResidual, PLCresidual, iLBCdec_inst->blockl);
-
-  return;
-}
diff --git a/modules/audio_coding/codecs/ilbc/do_plc.h b/modules/audio_coding/codecs/ilbc/do_plc.h
deleted file mode 100644
index 38b8fdb..0000000
--- a/modules/audio_coding/codecs/ilbc/do_plc.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_DoThePlc.h
-
-******************************************************************/
-
-#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_DO_PLC_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_DO_PLC_H_
-
-#include "defines.h"
-
-/*----------------------------------------------------------------*
- *  Packet loss concealment routine. Conceals a residual signal
- *  and LP parameters. If no packet loss, update state.
- *---------------------------------------------------------------*/
-
-void WebRtcIlbcfix_DoThePlc(
-    int16_t *PLCresidual,  /* (o) concealed residual */
-    int16_t *PLClpc,    /* (o) concealed LP parameters */
-    int16_t PLI,     /* (i) packet loss indicator
-                                                           0 - no PL, 1 = PL */
-    int16_t *decresidual,  /* (i) decoded residual */
-    int16_t *lpc,    /* (i) decoded LPC (only used for no PL) */
-    size_t inlag,    /* (i) pitch lag */
-    IlbcDecoder *iLBCdec_inst
-    /* (i/o) decoder instance */
-                            );
-
-#endif
diff --git a/modules/audio_coding/codecs/ilbc/encode.c b/modules/audio_coding/codecs/ilbc/encode.c
deleted file mode 100644
index fa4ffd0..0000000
--- a/modules/audio_coding/codecs/ilbc/encode.c
+++ /dev/null
@@ -1,513 +0,0 @@
-/*
- *  Copyright (c) 2012 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_Encode.c
-
-******************************************************************/
-
-#include <string.h>
-
-#include "defines.h"
-#include "lpc_encode.h"
-#include "frame_classify.h"
-#include "state_search.h"
-#include "state_construct.h"
-#include "constants.h"
-#include "cb_search.h"
-#include "cb_construct.h"
-#include "index_conv_enc.h"
-#include "pack_bits.h"
-#include "hp_input.h"
-#include "webrtc/rtc_base/checks.h"
-
-#ifdef SPLIT_10MS
-#include "unpack_bits.h"
-#include "index_conv_dec.h"
-#endif
-#ifndef WEBRTC_ARCH_BIG_ENDIAN
-#include "swap_bytes.h"
-#endif
-
-/*----------------------------------------------------------------*
- *  main encoder function
- *---------------------------------------------------------------*/
-
-void WebRtcIlbcfix_EncodeImpl(
-    uint16_t *bytes,     /* (o) encoded data bits iLBC */
-    const int16_t *block, /* (i) speech vector to encode */
-    IlbcEncoder *iLBCenc_inst /* (i/o) the general encoder
-                                     state */
-                          ){
-  size_t n, meml_gotten, Nfor;
-  size_t diff, start_pos;
-  size_t index;
-  size_t subcount, subframe;
-  size_t start_count, end_count;
-  int16_t *residual;
-  int32_t en1, en2;
-  int16_t scale, max;
-  int16_t *syntdenum;
-  int16_t *decresidual;
-  int16_t *reverseResidual;
-  int16_t *reverseDecresidual;
-  /* Stack based */
-  int16_t weightdenum[(LPC_FILTERORDER + 1)*NSUB_MAX];
-  int16_t dataVec[BLOCKL_MAX + LPC_FILTERORDER];
-  int16_t memVec[CB_MEML+CB_FILTERLEN];
-  int16_t bitsMemory[sizeof(iLBC_bits)/sizeof(int16_t)];
-  iLBC_bits *iLBCbits_inst = (iLBC_bits*)bitsMemory;
-
-
-#ifdef SPLIT_10MS
-  int16_t *weightdenumbuf = iLBCenc_inst->weightdenumbuf;
-  int16_t last_bit;
-#endif
-
-  int16_t *data = &dataVec[LPC_FILTERORDER];
-  int16_t *mem = &memVec[CB_HALFFILTERLEN];
-
-  /* Reuse som buffers to save stack memory */
-  residual = &iLBCenc_inst->lpc_buffer[LPC_LOOKBACK+BLOCKL_MAX-iLBCenc_inst->blockl];
-  syntdenum = mem;      /* syntdenum[(LPC_FILTERORDER + 1)*NSUB_MAX] and mem are used non overlapping in the code */
-  decresidual = residual;     /* Already encoded residual is overwritten by the decoded version */
-  reverseResidual = data;     /* data and reverseResidual are used non overlapping in the code */
-  reverseDecresidual = reverseResidual; /* Already encoded residual is overwritten by the decoded version */
-
-#ifdef SPLIT_10MS
-
-  WebRtcSpl_MemSetW16 (  (int16_t *) iLBCbits_inst, 0,
-                         sizeof(iLBC_bits) / sizeof(int16_t)  );
-
-  start_pos = iLBCenc_inst->start_pos;
-  diff = iLBCenc_inst->diff;
-
-  if (iLBCenc_inst->section != 0){
-    WEBRTC_SPL_MEMCPY_W16 (weightdenum, weightdenumbuf,
-                           SCRATCH_ENCODE_DATAVEC - SCRATCH_ENCODE_WEIGHTDENUM);
-    /* Un-Packetize the frame into parameters */
-    last_bit = WebRtcIlbcfix_UnpackBits (iLBCenc_inst->bytes, iLBCbits_inst, iLBCenc_inst->mode);
-    if (last_bit)
-      return;
-    /* adjust index */
-    WebRtcIlbcfix_IndexConvDec (iLBCbits_inst->cb_index);
-
-    if (iLBCenc_inst->section == 1){
-      /* Save first 80 samples of a 160/240 sample frame for 20/30msec */
-      WEBRTC_SPL_MEMCPY_W16 (iLBCenc_inst->past_samples, block, 80);
-    }
-    else{ // iLBCenc_inst->section == 2 AND mode = 30ms
-      /* Save second 80 samples of a 240 sample frame for 30msec */
-      WEBRTC_SPL_MEMCPY_W16 (iLBCenc_inst->past_samples + 80, block, 80);
-    }
-  }
-  else{ // iLBCenc_inst->section == 0
-    /* form a complete frame of 160/240 for 20msec/30msec mode */
-    WEBRTC_SPL_MEMCPY_W16 (data + (iLBCenc_inst->mode * 8) - 80, block, 80);
-    WEBRTC_SPL_MEMCPY_W16 (data, iLBCenc_inst->past_samples,
-                           (iLBCenc_inst->mode * 8) - 80);
-    iLBCenc_inst->Nfor_flag = 0;
-    iLBCenc_inst->Nback_flag = 0;
-#else
-    /* copy input block to data*/
-    WEBRTC_SPL_MEMCPY_W16(data,block,iLBCenc_inst->blockl);
-#endif
-
-    /* high pass filtering of input signal and scale down the residual (*0.5) */
-    WebRtcIlbcfix_HpInput(data, (int16_t*)WebRtcIlbcfix_kHpInCoefs,
-                          iLBCenc_inst->hpimemy, iLBCenc_inst->hpimemx,
-                          iLBCenc_inst->blockl);
-
-    /* LPC of hp filtered input data */
-    WebRtcIlbcfix_LpcEncode(syntdenum, weightdenum, iLBCbits_inst->lsf, data,
-                            iLBCenc_inst);
-
-    /* Set up state */
-    WEBRTC_SPL_MEMCPY_W16(dataVec, iLBCenc_inst->anaMem, LPC_FILTERORDER);
-
-    /* inverse filter to get residual */
-    for (n=0; n<iLBCenc_inst->nsub; n++ ) {
-      WebRtcSpl_FilterMAFastQ12(
-          &data[n*SUBL], &residual[n*SUBL],
-          &syntdenum[n*(LPC_FILTERORDER+1)],
-          LPC_FILTERORDER+1, SUBL);
-    }
-
-    /* Copy the state for next frame */
-    WEBRTC_SPL_MEMCPY_W16(iLBCenc_inst->anaMem, &data[iLBCenc_inst->blockl-LPC_FILTERORDER], LPC_FILTERORDER);
-
-    /* find state location */
-
-    iLBCbits_inst->startIdx = WebRtcIlbcfix_FrameClassify(iLBCenc_inst,residual);
-
-    /* check if state should be in first or last part of the
-       two subframes */
-
-    index = (iLBCbits_inst->startIdx-1)*SUBL;
-    max=WebRtcSpl_MaxAbsValueW16(&residual[index], 2*SUBL);
-    scale = WebRtcSpl_GetSizeInBits((uint32_t)(max * max));
-
-    /* Scale to maximum 25 bits so that the MAC won't cause overflow */
-    scale = scale - 25;
-    if(scale < 0) {
-      scale = 0;
-    }
-
-    diff = STATE_LEN - iLBCenc_inst->state_short_len;
-    en1=WebRtcSpl_DotProductWithScale(&residual[index], &residual[index],
-                                      iLBCenc_inst->state_short_len, scale);
-    index += diff;
-    en2=WebRtcSpl_DotProductWithScale(&residual[index], &residual[index],
-                                      iLBCenc_inst->state_short_len, scale);
-    if (en1 > en2) {
-      iLBCbits_inst->state_first = 1;
-      start_pos = (iLBCbits_inst->startIdx-1)*SUBL;
-    } else {
-      iLBCbits_inst->state_first = 0;
-      start_pos = (iLBCbits_inst->startIdx-1)*SUBL + diff;
-    }
-
-    /* scalar quantization of state */
-
-    WebRtcIlbcfix_StateSearch(iLBCenc_inst, iLBCbits_inst, &residual[start_pos],
-                              &syntdenum[(iLBCbits_inst->startIdx-1)*(LPC_FILTERORDER+1)],
-                              &weightdenum[(iLBCbits_inst->startIdx-1)*(LPC_FILTERORDER+1)]);
-
-    WebRtcIlbcfix_StateConstruct(iLBCbits_inst->idxForMax, iLBCbits_inst->idxVec,
-                                 &syntdenum[(iLBCbits_inst->startIdx-1)*(LPC_FILTERORDER+1)],
-                                 &decresidual[start_pos], iLBCenc_inst->state_short_len
-                                 );
-
-    /* predictive quantization in state */
-
-    if (iLBCbits_inst->state_first) { /* put adaptive part in the end */
-
-      /* setup memory */
-
-      WebRtcSpl_MemSetW16(mem, 0, CB_MEML - iLBCenc_inst->state_short_len);
-      WEBRTC_SPL_MEMCPY_W16(mem+CB_MEML-iLBCenc_inst->state_short_len,
-                            decresidual+start_pos, iLBCenc_inst->state_short_len);
-
-      /* encode subframes */
-
-      WebRtcIlbcfix_CbSearch(iLBCenc_inst, iLBCbits_inst->cb_index, iLBCbits_inst->gain_index,
-                             &residual[start_pos+iLBCenc_inst->state_short_len],
-                             mem+CB_MEML-ST_MEM_L_TBL, ST_MEM_L_TBL, diff,
-                             &weightdenum[iLBCbits_inst->startIdx*(LPC_FILTERORDER+1)], 0);
-
-      /* construct decoded vector */
-
-      RTC_CHECK(WebRtcIlbcfix_CbConstruct(
-          &decresidual[start_pos + iLBCenc_inst->state_short_len],
-          iLBCbits_inst->cb_index, iLBCbits_inst->gain_index,
-          mem + CB_MEML - ST_MEM_L_TBL, ST_MEM_L_TBL, diff));
-
-    }
-    else { /* put adaptive part in the beginning */
-
-      /* create reversed vectors for prediction */
-
-      WebRtcSpl_MemCpyReversedOrder(&reverseResidual[diff-1],
-                                    &residual[(iLBCbits_inst->startIdx+1)*SUBL-STATE_LEN], diff);
-
-      /* setup memory */
-
-      meml_gotten = iLBCenc_inst->state_short_len;
-      WebRtcSpl_MemCpyReversedOrder(&mem[CB_MEML-1], &decresidual[start_pos], meml_gotten);
-      WebRtcSpl_MemSetW16(mem, 0, CB_MEML - iLBCenc_inst->state_short_len);
-
-      /* encode subframes */
-      WebRtcIlbcfix_CbSearch(iLBCenc_inst, iLBCbits_inst->cb_index, iLBCbits_inst->gain_index,
-                             reverseResidual, mem+CB_MEML-ST_MEM_L_TBL, ST_MEM_L_TBL, diff,
-                             &weightdenum[(iLBCbits_inst->startIdx-1)*(LPC_FILTERORDER+1)],
-                             0);
-
-      /* construct decoded vector */
-      RTC_CHECK(WebRtcIlbcfix_CbConstruct(
-            reverseDecresidual, iLBCbits_inst->cb_index,
-            iLBCbits_inst->gain_index, mem + CB_MEML - ST_MEM_L_TBL,
-            ST_MEM_L_TBL, diff));
-
-      /* get decoded residual from reversed vector */
-
-      WebRtcSpl_MemCpyReversedOrder(&decresidual[start_pos-1], reverseDecresidual, diff);
-    }
-
-#ifdef SPLIT_10MS
-    iLBCenc_inst->start_pos = start_pos;
-    iLBCenc_inst->diff = diff;
-    iLBCenc_inst->section++;
-    /* adjust index */
-    WebRtcIlbcfix_IndexConvEnc (iLBCbits_inst->cb_index);
-    /* Packetize the parameters into the frame */
-    WebRtcIlbcfix_PackBits (iLBCenc_inst->bytes, iLBCbits_inst, iLBCenc_inst->mode);
-    WEBRTC_SPL_MEMCPY_W16 (weightdenumbuf, weightdenum,
-                           SCRATCH_ENCODE_DATAVEC - SCRATCH_ENCODE_WEIGHTDENUM);
-    return;
-  }
-#endif
-
-  /* forward prediction of subframes */
-
-  Nfor = iLBCenc_inst->nsub-iLBCbits_inst->startIdx-1;
-
-  /* counter for predicted subframes */
-#ifdef SPLIT_10MS
-  if (iLBCenc_inst->mode == 20)
-  {
-    subcount = 1;
-  }
-  if (iLBCenc_inst->mode == 30)
-  {
-    if (iLBCenc_inst->section == 1)
-    {
-      subcount = 1;
-    }
-    if (iLBCenc_inst->section == 2)
-    {
-      subcount = 3;
-    }
-  }
-#else
-  subcount=1;
-#endif
-
-  if( Nfor > 0 ){
-
-    /* setup memory */
-
-    WebRtcSpl_MemSetW16(mem, 0, CB_MEML-STATE_LEN);
-    WEBRTC_SPL_MEMCPY_W16(mem+CB_MEML-STATE_LEN,
-                          decresidual+(iLBCbits_inst->startIdx-1)*SUBL, STATE_LEN);
-
-#ifdef SPLIT_10MS
-    if (iLBCenc_inst->Nfor_flag > 0)
-    {
-      for (subframe = 0; subframe < WEBRTC_SPL_MIN (Nfor, 2); subframe++)
-      {
-        /* update memory */
-        WEBRTC_SPL_MEMCPY_W16 (mem, mem + SUBL, (CB_MEML - SUBL));
-        WEBRTC_SPL_MEMCPY_W16 (mem + CB_MEML - SUBL,
-                               &decresidual[(iLBCbits_inst->startIdx + 1 +
-                                             subframe) * SUBL], SUBL);
-      }
-    }
-
-    iLBCenc_inst->Nfor_flag++;
-
-    if (iLBCenc_inst->mode == 20)
-    {
-      start_count = 0;
-      end_count = Nfor;
-    }
-    if (iLBCenc_inst->mode == 30)
-    {
-      if (iLBCenc_inst->section == 1)
-      {
-        start_count = 0;
-        end_count = WEBRTC_SPL_MIN (Nfor, (size_t)2);
-      }
-      if (iLBCenc_inst->section == 2)
-      {
-        start_count = WEBRTC_SPL_MIN (Nfor, (size_t)2);
-        end_count = Nfor;
-      }
-    }
-#else
-    start_count = 0;
-    end_count = Nfor;
-#endif
-
-    /* loop over subframes to encode */
-
-    for (subframe = start_count; subframe < end_count; subframe++){
-
-      /* encode subframe */
-
-      WebRtcIlbcfix_CbSearch(iLBCenc_inst, iLBCbits_inst->cb_index+subcount*CB_NSTAGES,
-                             iLBCbits_inst->gain_index+subcount*CB_NSTAGES,
-                             &residual[(iLBCbits_inst->startIdx+1+subframe)*SUBL],
-                             mem, MEM_LF_TBL, SUBL,
-                             &weightdenum[(iLBCbits_inst->startIdx+1+subframe)*(LPC_FILTERORDER+1)],
-                             subcount);
-
-      /* construct decoded vector */
-      RTC_CHECK(WebRtcIlbcfix_CbConstruct(
-            &decresidual[(iLBCbits_inst->startIdx + 1 + subframe) * SUBL],
-            iLBCbits_inst->cb_index + subcount * CB_NSTAGES,
-            iLBCbits_inst->gain_index + subcount * CB_NSTAGES, mem, MEM_LF_TBL,
-            SUBL));
-
-      /* update memory */
-
-      memmove(mem, mem + SUBL, (CB_MEML - SUBL) * sizeof(*mem));
-      WEBRTC_SPL_MEMCPY_W16(mem+CB_MEML-SUBL,
-                            &decresidual[(iLBCbits_inst->startIdx+1+subframe)*SUBL], SUBL);
-
-      subcount++;
-    }
-  }
-
-#ifdef SPLIT_10MS
-  if ((iLBCenc_inst->section == 1) &&
-      (iLBCenc_inst->mode == 30) && (Nfor > 0) && (end_count == 2))
-  {
-    iLBCenc_inst->section++;
-    /* adjust index */
-    WebRtcIlbcfix_IndexConvEnc (iLBCbits_inst->cb_index);
-    /* Packetize the parameters into the frame */
-    WebRtcIlbcfix_PackBits (iLBCenc_inst->bytes, iLBCbits_inst, iLBCenc_inst->mode);
-    WEBRTC_SPL_MEMCPY_W16 (weightdenumbuf, weightdenum,
-                           SCRATCH_ENCODE_DATAVEC - SCRATCH_ENCODE_WEIGHTDENUM);
-    return;
-  }
-#endif
-
-  /* backward prediction of subframes */
-
-  if (iLBCbits_inst->startIdx > 1) {
-
-    /* create reverse order vectors
-       (The decresidual does not need to be copied since it is
-       contained in the same vector as the residual)
-    */
-
-    size_t Nback = iLBCbits_inst->startIdx - 1;
-    WebRtcSpl_MemCpyReversedOrder(&reverseResidual[Nback*SUBL-1], residual, Nback*SUBL);
-
-    /* setup memory */
-
-    meml_gotten = SUBL*(iLBCenc_inst->nsub+1-iLBCbits_inst->startIdx);
-    if( meml_gotten > CB_MEML ) {
-      meml_gotten=CB_MEML;
-    }
-
-    WebRtcSpl_MemCpyReversedOrder(&mem[CB_MEML-1], &decresidual[Nback*SUBL], meml_gotten);
-    WebRtcSpl_MemSetW16(mem, 0, CB_MEML - meml_gotten);
-
-#ifdef SPLIT_10MS
-    if (iLBCenc_inst->Nback_flag > 0)
-    {
-      for (subframe = 0; subframe < WEBRTC_SPL_MAX (2 - Nfor, 0); subframe++)
-      {
-        /* update memory */
-        WEBRTC_SPL_MEMCPY_W16 (mem, mem + SUBL, (CB_MEML - SUBL));
-        WEBRTC_SPL_MEMCPY_W16 (mem + CB_MEML - SUBL,
-                               &reverseDecresidual[subframe * SUBL], SUBL);
-      }
-    }
-
-    iLBCenc_inst->Nback_flag++;
-
-
-    if (iLBCenc_inst->mode == 20)
-    {
-      start_count = 0;
-      end_count = Nback;
-    }
-    if (iLBCenc_inst->mode == 30)
-    {
-      if (iLBCenc_inst->section == 1)
-      {
-        start_count = 0;
-        end_count = (Nfor >= 2) ? 0 : (2 - NFor);
-      }
-      if (iLBCenc_inst->section == 2)
-      {
-        start_count = (Nfor >= 2) ? 0 : (2 - NFor);
-        end_count = Nback;
-      }
-    }
-#else
-    start_count = 0;
-    end_count = Nback;
-#endif
-
-    /* loop over subframes to encode */
-
-    for (subframe = start_count; subframe < end_count; subframe++){
-
-      /* encode subframe */
-
-      WebRtcIlbcfix_CbSearch(iLBCenc_inst, iLBCbits_inst->cb_index+subcount*CB_NSTAGES,
-                             iLBCbits_inst->gain_index+subcount*CB_NSTAGES, &reverseResidual[subframe*SUBL],
-                             mem, MEM_LF_TBL, SUBL,
-                             &weightdenum[(iLBCbits_inst->startIdx-2-subframe)*(LPC_FILTERORDER+1)],
-                             subcount);
-
-      /* construct decoded vector */
-      RTC_CHECK(WebRtcIlbcfix_CbConstruct(
-            &reverseDecresidual[subframe * SUBL],
-            iLBCbits_inst->cb_index + subcount * CB_NSTAGES,
-            iLBCbits_inst->gain_index + subcount * CB_NSTAGES, mem, MEM_LF_TBL,
-            SUBL));
-
-      /* update memory */
-      memmove(mem, mem + SUBL, (CB_MEML - SUBL) * sizeof(*mem));
-      WEBRTC_SPL_MEMCPY_W16(mem+CB_MEML-SUBL,
-                            &reverseDecresidual[subframe*SUBL], SUBL);
-
-      subcount++;
-
-    }
-
-    /* get decoded residual from reversed vector */
-
-    WebRtcSpl_MemCpyReversedOrder(&decresidual[SUBL*Nback-1], reverseDecresidual, SUBL*Nback);
-  }
-  /* end encoding part */
-
-  /* adjust index */
-
-  WebRtcIlbcfix_IndexConvEnc(iLBCbits_inst->cb_index);
-
-  /* Packetize the parameters into the frame */
-
-#ifdef SPLIT_10MS
-  if( (iLBCenc_inst->mode==30) && (iLBCenc_inst->section==1) ){
-    WebRtcIlbcfix_PackBits(iLBCenc_inst->bytes, iLBCbits_inst, iLBCenc_inst->mode);
-  }
-  else{
-    WebRtcIlbcfix_PackBits(bytes, iLBCbits_inst, iLBCenc_inst->mode);
-  }
-#else
-  WebRtcIlbcfix_PackBits(bytes, iLBCbits_inst, iLBCenc_inst->mode);
-#endif
-
-#ifndef WEBRTC_ARCH_BIG_ENDIAN
-  /* Swap bytes for LITTLE ENDIAN since the packbits()
-     function assumes BIG_ENDIAN machine */
-#ifdef SPLIT_10MS
-  if (( (iLBCenc_inst->section == 1) && (iLBCenc_inst->mode == 20) ) ||
-      ( (iLBCenc_inst->section == 2) && (iLBCenc_inst->mode == 30) )){
-    WebRtcIlbcfix_SwapBytes(bytes, iLBCenc_inst->no_of_words, bytes);
-  }
-#else
-  WebRtcIlbcfix_SwapBytes(bytes, iLBCenc_inst->no_of_words, bytes);
-#endif
-#endif
-
-#ifdef SPLIT_10MS
-  if (subcount == (iLBCenc_inst->nsub - 1))
-  {
-    iLBCenc_inst->section = 0;
-  }
-  else
-  {
-    iLBCenc_inst->section++;
-    WEBRTC_SPL_MEMCPY_W16 (weightdenumbuf, weightdenum,
-                           SCRATCH_ENCODE_DATAVEC - SCRATCH_ENCODE_WEIGHTDENUM);
-  }
-#endif
-
-}
diff --git a/modules/audio_coding/codecs/ilbc/encode.h b/modules/audio_coding/codecs/ilbc/encode.h
deleted file mode 100644
index fe6ae62..0000000
--- a/modules/audio_coding/codecs/ilbc/encode.h
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- *  Copyright (c) 2012 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_Encode.h
-
-******************************************************************/
-
-#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_ENCODE_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_ENCODE_H_
-
-#include "defines.h"
-
-/*----------------------------------------------------------------*
- *  main encoder function
- *---------------------------------------------------------------*/
-
-void WebRtcIlbcfix_EncodeImpl(
-    uint16_t *bytes,     /* (o) encoded data bits iLBC */
-    const int16_t *block, /* (i) speech vector to encode */
-    IlbcEncoder *iLBCenc_inst /* (i/o) the general encoder
-                                           state */
-                          );
-
-#endif
diff --git a/modules/audio_coding/codecs/ilbc/energy_inverse.c b/modules/audio_coding/codecs/ilbc/energy_inverse.c
deleted file mode 100644
index b2bdcff..0000000
--- a/modules/audio_coding/codecs/ilbc/energy_inverse.c
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_EnergyInverse.c
-
-******************************************************************/
-
-/* Inverses the in vector in into Q29 domain */
-
-#include "energy_inverse.h"
-
-void WebRtcIlbcfix_EnergyInverse(
-    int16_t *energy,    /* (i/o) Energy and inverse
-                                                           energy (in Q29) */
-    size_t noOfEnergies)  /* (i)   The length of the energy
-                                   vector */
-{
-  int32_t Nom=(int32_t)0x1FFFFFFF;
-  int16_t *energyPtr;
-  size_t i;
-
-  /* Set the minimum energy value to 16384 to avoid overflow */
-  energyPtr=energy;
-  for (i=0; i<noOfEnergies; i++) {
-    (*energyPtr)=WEBRTC_SPL_MAX((*energyPtr),16384);
-    energyPtr++;
-  }
-
-  /* Calculate inverse energy in Q29 */
-  energyPtr=energy;
-  for (i=0; i<noOfEnergies; i++) {
-    (*energyPtr) = (int16_t)WebRtcSpl_DivW32W16(Nom, (*energyPtr));
-    energyPtr++;
-  }
-}
diff --git a/modules/audio_coding/codecs/ilbc/energy_inverse.h b/modules/audio_coding/codecs/ilbc/energy_inverse.h
deleted file mode 100644
index fe25094..0000000
--- a/modules/audio_coding/codecs/ilbc/energy_inverse.h
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_EnergyInverse.h
-
-******************************************************************/
-
-#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_ENERGY_INVERSE_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_ENERGY_INVERSE_H_
-
-#include "defines.h"
-
-/* Inverses the in vector in into Q29 domain */
-
-void WebRtcIlbcfix_EnergyInverse(
-    int16_t *energy,     /* (i/o) Energy and inverse
-                                                                   energy (in Q29) */
-    size_t noOfEnergies);   /* (i)   The length of the energy
-                                   vector */
-
-#endif
diff --git a/modules/audio_coding/codecs/ilbc/enh_upsample.c b/modules/audio_coding/codecs/ilbc/enh_upsample.c
deleted file mode 100644
index 929c630..0000000
--- a/modules/audio_coding/codecs/ilbc/enh_upsample.c
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_EnhUpsample.c
-
-******************************************************************/
-
-#include "defines.h"
-#include "constants.h"
-
-/*----------------------------------------------------------------*
- * upsample finite array assuming zeros outside bounds
- *---------------------------------------------------------------*/
-
-void WebRtcIlbcfix_EnhUpsample(
-    int32_t *useq1, /* (o) upsampled output sequence */
-    int16_t *seq1 /* (i) unupsampled sequence */
-                                ){
-  int j;
-  int32_t *pu1, *pu11;
-  int16_t *ps, *w16tmp;
-  const int16_t *pp;
-
-  /* filtering: filter overhangs left side of sequence */
-  pu1=useq1;
-  for (j=0;j<ENH_UPS0; j++) {
-    pu11=pu1;
-    /* i = 2 */
-    pp=WebRtcIlbcfix_kEnhPolyPhaser[j]+1;
-    ps=seq1+2;
-    *pu11 = (*ps--) * *pp++;
-    *pu11 += (*ps--) * *pp++;
-    *pu11 += (*ps--) * *pp++;
-    pu11+=ENH_UPS0;
-    /* i = 3 */
-    pp=WebRtcIlbcfix_kEnhPolyPhaser[j]+1;
-    ps=seq1+3;
-    *pu11 = (*ps--) * *pp++;
-    *pu11 += (*ps--) * *pp++;
-    *pu11 += (*ps--) * *pp++;
-    *pu11 += (*ps--) * *pp++;
-    pu11+=ENH_UPS0;
-    /* i = 4 */
-    pp=WebRtcIlbcfix_kEnhPolyPhaser[j]+1;
-    ps=seq1+4;
-    *pu11 = (*ps--) * *pp++;
-    *pu11 += (*ps--) * *pp++;
-    *pu11 += (*ps--) * *pp++;
-    *pu11 += (*ps--) * *pp++;
-    *pu11 += (*ps--) * *pp++;
-    pu1++;
-  }
-
-  /* filtering: simple convolution=inner products
-     (not needed since the sequence is so short)
-  */
-
-  /* filtering: filter overhangs right side of sequence */
-
-  /* Code with loops, which is equivivalent to the expanded version below
-
-     filterlength = 5;
-     hf1 = 2;
-     for(j=0;j<ENH_UPS0; j++){
-     pu = useq1 + (filterlength-hfl)*ENH_UPS0 + j;
-     for(i=1; i<=hfl; i++){
-     *pu=0;
-     pp = polyp[j]+i;
-     ps = seq1+dim1-1;
-     for(k=0;k<filterlength-i;k++) {
-     *pu += (*ps--) * *pp++;
-     }
-     pu+=ENH_UPS0;
-     }
-     }
-  */
-  pu1 = useq1 + 12;
-  w16tmp = seq1+4;
-  for (j=0;j<ENH_UPS0; j++) {
-    pu11 = pu1;
-    /* i = 1 */
-    pp = WebRtcIlbcfix_kEnhPolyPhaser[j]+2;
-    ps = w16tmp;
-    *pu11 = (*ps--) * *pp++;
-    *pu11 += (*ps--) * *pp++;
-    *pu11 += (*ps--) * *pp++;
-    *pu11 += (*ps--) * *pp++;
-    pu11+=ENH_UPS0;
-    /* i = 2 */
-    pp = WebRtcIlbcfix_kEnhPolyPhaser[j]+3;
-    ps = w16tmp;
-    *pu11 = (*ps--) * *pp++;
-    *pu11 += (*ps--) * *pp++;
-    *pu11 += (*ps--) * *pp++;
-    pu11+=ENH_UPS0;
-
-    pu1++;
-  }
-}
diff --git a/modules/audio_coding/codecs/ilbc/enh_upsample.h b/modules/audio_coding/codecs/ilbc/enh_upsample.h
deleted file mode 100644
index 00bb28b..0000000
--- a/modules/audio_coding/codecs/ilbc/enh_upsample.h
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_EnhUpsample.h
-
-******************************************************************/
-
-#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_ENH_UPSAMPLE_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_ENH_UPSAMPLE_H_
-
-#include "defines.h"
-
-/*----------------------------------------------------------------*
- * upsample finite array assuming zeros outside bounds
- *---------------------------------------------------------------*/
-
-void WebRtcIlbcfix_EnhUpsample(
-    int32_t *useq1, /* (o) upsampled output sequence */
-    int16_t *seq1 /* (i) unupsampled sequence */
-                                );
-
-#endif
diff --git a/modules/audio_coding/codecs/ilbc/enhancer.c b/modules/audio_coding/codecs/ilbc/enhancer.c
deleted file mode 100644
index 521d004..0000000
--- a/modules/audio_coding/codecs/ilbc/enhancer.c
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_Enhancer.c
-
-******************************************************************/
-
-#include "defines.h"
-#include "constants.h"
-#include "get_sync_seq.h"
-#include "smooth.h"
-
-/*----------------------------------------------------------------*
- * perform enhancement on idata+centerStartPos through
- * idata+centerStartPos+ENH_BLOCKL-1
- *---------------------------------------------------------------*/
-
-void WebRtcIlbcfix_Enhancer(
-    int16_t *odata,   /* (o) smoothed block, dimension blockl */
-    int16_t *idata,   /* (i) data buffer used for enhancing */
-    size_t idatal,   /* (i) dimension idata */
-    size_t centerStartPos, /* (i) first sample current block within idata */
-    size_t *period,   /* (i) pitch period array (pitch bward-in time) */
-    const size_t *plocs,   /* (i) locations where period array values valid */
-    size_t periodl   /* (i) dimension of period and plocs */
-                            ){
-  /* Stack based */
-  int16_t surround[ENH_BLOCKL];
-
-  WebRtcSpl_MemSetW16(surround, 0, ENH_BLOCKL);
-
-  /* get said second sequence of segments */
-
-  WebRtcIlbcfix_GetSyncSeq(idata, idatal, centerStartPos, period, plocs,
-                           periodl, ENH_HL, surround);
-
-  /* compute the smoothed output from said second sequence */
-
-  WebRtcIlbcfix_Smooth(odata, idata + centerStartPos, surround);
-}
diff --git a/modules/audio_coding/codecs/ilbc/enhancer.h b/modules/audio_coding/codecs/ilbc/enhancer.h
deleted file mode 100644
index ed219fb..0000000
--- a/modules/audio_coding/codecs/ilbc/enhancer.h
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_Enhancer.h
-
-******************************************************************/
-
-#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_ENHANCER_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_ENHANCER_H_
-
-#include "defines.h"
-
-/*----------------------------------------------------------------*
- * perform enhancement on idata+centerStartPos through
- * idata+centerStartPos+ENH_BLOCKL-1
- *---------------------------------------------------------------*/
-
-void WebRtcIlbcfix_Enhancer(
-    int16_t *odata,   /* (o) smoothed block, dimension blockl */
-    int16_t *idata,   /* (i) data buffer used for enhancing */
-    size_t idatal,   /* (i) dimension idata */
-    size_t centerStartPos, /* (i) first sample current block within idata */
-    size_t *period,   /* (i) pitch period array (pitch bward-in time) */
-    const size_t *plocs,   /* (i) locations where period array values valid */
-    size_t periodl   /* (i) dimension of period and plocs */
-                            );
-
-#endif
diff --git a/modules/audio_coding/codecs/ilbc/enhancer_interface.c b/modules/audio_coding/codecs/ilbc/enhancer_interface.c
deleted file mode 100644
index 1bd4b26..0000000
--- a/modules/audio_coding/codecs/ilbc/enhancer_interface.c
+++ /dev/null
@@ -1,377 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_EnhancerInterface.c
-
-******************************************************************/
-
-#include <string.h>
-
-#include "defines.h"
-#include "constants.h"
-#include "xcorr_coef.h"
-#include "enhancer.h"
-#include "hp_output.h"
-
-
-
-/*----------------------------------------------------------------*
- * interface for enhancer
- *---------------------------------------------------------------*/
-
-size_t  // (o) Estimated lag in end of in[]
-    WebRtcIlbcfix_EnhancerInterface(
-        int16_t* out,                 // (o) enhanced signal
-        const int16_t* in,            // (i) unenhanced signal
-        IlbcDecoder* iLBCdec_inst) {  // (i) buffers etc
-  size_t iblock;
-  size_t lag=20, tlag=20;
-  size_t inLen=iLBCdec_inst->blockl+120;
-  int16_t scale, scale1;
-  size_t plc_blockl;
-  int16_t *enh_buf;
-  size_t *enh_period;
-  int32_t tmp1, tmp2, max;
-  size_t new_blocks;
-  int16_t *enh_bufPtr1;
-  size_t i;
-  size_t k;
-  int16_t EnChange;
-  int16_t SqrtEnChange;
-  int16_t inc;
-  int16_t win;
-  int16_t *tmpW16ptr;
-  size_t startPos;
-  int16_t *plc_pred;
-  const int16_t *target, *regressor;
-  int16_t max16;
-  int shifts;
-  int32_t ener;
-  int16_t enerSh;
-  int16_t corrSh;
-  size_t ind;
-  int16_t sh;
-  size_t start, stop;
-  /* Stack based */
-  int16_t totsh[3];
-  int16_t downsampled[(BLOCKL_MAX+120)>>1]; /* length 180 */
-  int32_t corr32[50];
-  int32_t corrmax[3];
-  int16_t corr16[3];
-  int16_t en16[3];
-  size_t lagmax[3];
-
-  plc_pred = downsampled; /* Reuse memory since plc_pred[ENH_BLOCKL] and
-                              downsampled are non overlapping */
-  enh_buf=iLBCdec_inst->enh_buf;
-  enh_period=iLBCdec_inst->enh_period;
-
-  /* Copy in the new data into the enhancer buffer */
-  memmove(enh_buf, &enh_buf[iLBCdec_inst->blockl],
-          (ENH_BUFL - iLBCdec_inst->blockl) * sizeof(*enh_buf));
-
-  WEBRTC_SPL_MEMCPY_W16(&enh_buf[ENH_BUFL-iLBCdec_inst->blockl], in,
-                        iLBCdec_inst->blockl);
-
-  /* Set variables that are dependent on frame size */
-  if (iLBCdec_inst->mode==30) {
-    plc_blockl=ENH_BLOCKL;
-    new_blocks=3;
-    startPos=320;  /* Start position for enhancement
-                     (640-new_blocks*ENH_BLOCKL-80) */
-  } else {
-    plc_blockl=40;
-    new_blocks=2;
-    startPos=440;  /* Start position for enhancement
-                    (640-new_blocks*ENH_BLOCKL-40) */
-  }
-
-  /* Update the pitch prediction for each enhancer block, move the old ones */
-  memmove(enh_period, &enh_period[new_blocks],
-          (ENH_NBLOCKS_TOT - new_blocks) * sizeof(*enh_period));
-
-  WebRtcSpl_DownsampleFast(
-      enh_buf+ENH_BUFL-inLen,    /* Input samples */
-      inLen + ENH_BUFL_FILTEROVERHEAD,
-      downsampled,
-      inLen / 2,
-      (int16_t*)WebRtcIlbcfix_kLpFiltCoefs,  /* Coefficients in Q12 */
-      FILTERORDER_DS_PLUS1,    /* Length of filter (order-1) */
-      FACTOR_DS,
-      DELAY_DS);
-
-  /* Estimate the pitch in the down sampled domain. */
-  for(iblock = 0; iblock<new_blocks; iblock++){
-
-    /* references */
-    target = downsampled + 60 + iblock * ENH_BLOCKL_HALF;
-    regressor = target - 10;
-
-    /* scaling */
-    max16 = WebRtcSpl_MaxAbsValueW16(&regressor[-50], ENH_BLOCKL_HALF + 50 - 1);
-    shifts = WebRtcSpl_GetSizeInBits((uint32_t)(max16 * max16)) - 25;
-    shifts = WEBRTC_SPL_MAX(0, shifts);
-
-    /* compute cross correlation */
-    WebRtcSpl_CrossCorrelation(corr32, target, regressor, ENH_BLOCKL_HALF, 50,
-                               shifts, -1);
-
-    /* Find 3 highest correlations that should be compared for the
-       highest (corr*corr)/ener */
-
-    for (i=0;i<2;i++) {
-      lagmax[i] = WebRtcSpl_MaxIndexW32(corr32, 50);
-      corrmax[i] = corr32[lagmax[i]];
-      start = WEBRTC_SPL_MAX(2, lagmax[i]) - 2;
-      stop = WEBRTC_SPL_MIN(47, lagmax[i]) + 2;
-      for (k = start; k <= stop; k++) {
-        corr32[k] = 0;
-      }
-    }
-    lagmax[2] = WebRtcSpl_MaxIndexW32(corr32, 50);
-    corrmax[2] = corr32[lagmax[2]];
-
-    /* Calculate normalized corr^2 and ener */
-    for (i=0;i<3;i++) {
-      corrSh = 15-WebRtcSpl_GetSizeInBits(corrmax[i]);
-      ener = WebRtcSpl_DotProductWithScale(regressor - lagmax[i],
-                                           regressor - lagmax[i],
-                                           ENH_BLOCKL_HALF, shifts);
-      enerSh = 15-WebRtcSpl_GetSizeInBits(ener);
-      corr16[i] = (int16_t)WEBRTC_SPL_SHIFT_W32(corrmax[i], corrSh);
-      corr16[i] = (int16_t)((corr16[i] * corr16[i]) >> 16);
-      en16[i] = (int16_t)WEBRTC_SPL_SHIFT_W32(ener, enerSh);
-      totsh[i] = enerSh - 2 * corrSh;
-    }
-
-    /* Compare lagmax[0..3] for the (corr^2)/ener criteria */
-    ind = 0;
-    for (i=1; i<3; i++) {
-      if (totsh[ind] > totsh[i]) {
-        sh = WEBRTC_SPL_MIN(31, totsh[ind]-totsh[i]);
-        if (corr16[ind] * en16[i] < (corr16[i] * en16[ind]) >> sh) {
-          ind = i;
-        }
-      } else {
-        sh = WEBRTC_SPL_MIN(31, totsh[i]-totsh[ind]);
-        if ((corr16[ind] * en16[i]) >> sh < corr16[i] * en16[ind]) {
-          ind = i;
-        }
-      }
-    }
-
-    lag = lagmax[ind] + 10;
-
-    /* Store the estimated lag in the non-downsampled domain */
-    enh_period[ENH_NBLOCKS_TOT - new_blocks + iblock] = lag * 8;
-
-    /* Store the estimated lag for backward PLC */
-    if (iLBCdec_inst->prev_enh_pl==1) {
-      if (!iblock) {
-        tlag = lag * 2;
-      }
-    } else {
-      if (iblock==1) {
-        tlag = lag * 2;
-      }
-    }
-
-    lag *= 2;
-  }
-
-  if ((iLBCdec_inst->prev_enh_pl==1)||(iLBCdec_inst->prev_enh_pl==2)) {
-
-    /* Calculate the best lag of the new frame
-       This is used to interpolate backwards and mix with the PLC'd data
-    */
-
-    /* references */
-    target=in;
-    regressor=in+tlag-1;
-
-    /* scaling */
-    max16 = WebRtcSpl_MaxAbsValueW16(regressor, plc_blockl + 3 - 1);
-    if (max16>5000)
-      shifts=2;
-    else
-      shifts=0;
-
-    /* compute cross correlation */
-    WebRtcSpl_CrossCorrelation(corr32, target, regressor, plc_blockl, 3, shifts,
-                               1);
-
-    /* find lag */
-    lag=WebRtcSpl_MaxIndexW32(corr32, 3);
-    lag+=tlag-1;
-
-    /* Copy the backward PLC to plc_pred */
-
-    if (iLBCdec_inst->prev_enh_pl==1) {
-      if (lag>plc_blockl) {
-        WEBRTC_SPL_MEMCPY_W16(plc_pred, &in[lag-plc_blockl], plc_blockl);
-      } else {
-        WEBRTC_SPL_MEMCPY_W16(&plc_pred[plc_blockl-lag], in, lag);
-        WEBRTC_SPL_MEMCPY_W16(
-            plc_pred, &enh_buf[ENH_BUFL-iLBCdec_inst->blockl-plc_blockl+lag],
-            (plc_blockl-lag));
-      }
-    } else {
-      size_t pos;
-
-      pos = plc_blockl;
-
-      while (lag<pos) {
-        WEBRTC_SPL_MEMCPY_W16(&plc_pred[pos-lag], in, lag);
-        pos = pos - lag;
-      }
-      WEBRTC_SPL_MEMCPY_W16(plc_pred, &in[lag-pos], pos);
-
-    }
-
-    if (iLBCdec_inst->prev_enh_pl==1) {
-      /* limit energy change
-         if energy in backward PLC is more than 4 times higher than the forward
-         PLC, then reduce the energy in the backward PLC vector:
-         sample 1...len-16 set energy of the to 4 times forward PLC
-         sample len-15..len interpolate between 4 times fw PLC and bw PLC energy
-
-         Note: Compared to floating point code there is a slight change,
-         the window is 16 samples long instead of 10 samples to simplify the
-         calculations
-      */
-
-      max=WebRtcSpl_MaxAbsValueW16(
-          &enh_buf[ENH_BUFL-iLBCdec_inst->blockl-plc_blockl], plc_blockl);
-      max16=WebRtcSpl_MaxAbsValueW16(plc_pred, plc_blockl);
-      max = WEBRTC_SPL_MAX(max, max16);
-      scale=22-(int16_t)WebRtcSpl_NormW32(max);
-      scale=WEBRTC_SPL_MAX(scale,0);
-
-      tmp2 = WebRtcSpl_DotProductWithScale(
-          &enh_buf[ENH_BUFL-iLBCdec_inst->blockl-plc_blockl],
-          &enh_buf[ENH_BUFL-iLBCdec_inst->blockl-plc_blockl],
-          plc_blockl, scale);
-      tmp1 = WebRtcSpl_DotProductWithScale(plc_pred, plc_pred,
-                                           plc_blockl, scale);
-
-      /* Check the energy difference */
-      if ((tmp1>0)&&((tmp1>>2)>tmp2)) {
-        /* EnChange is now guaranteed to be <0.5
-           Calculate EnChange=tmp2/tmp1 in Q16
-        */
-
-        scale1=(int16_t)WebRtcSpl_NormW32(tmp1);
-        tmp1=WEBRTC_SPL_SHIFT_W32(tmp1, (scale1-16)); /* using 15 bits */
-
-        tmp2=WEBRTC_SPL_SHIFT_W32(tmp2, (scale1));
-        EnChange = (int16_t)WebRtcSpl_DivW32W16(tmp2,
-                                                      (int16_t)tmp1);
-
-        /* Calculate the Sqrt of the energy in Q15 ((14+16)/2) */
-        SqrtEnChange = (int16_t)WebRtcSpl_SqrtFloor(EnChange << 14);
-
-
-        /* Multiply first part of vector with 2*SqrtEnChange */
-        WebRtcSpl_ScaleVector(plc_pred, plc_pred, SqrtEnChange, plc_blockl-16,
-                              14);
-
-        /* Calculate increase parameter for window part (16 last samples) */
-        /* (1-2*SqrtEnChange)/16 in Q15 */
-        inc = 2048 - (SqrtEnChange >> 3);
-
-        win=0;
-        tmpW16ptr=&plc_pred[plc_blockl-16];
-
-        for (i=16;i>0;i--) {
-          *tmpW16ptr = (int16_t)(
-              (*tmpW16ptr * (SqrtEnChange + (win >> 1))) >> 14);
-          /* multiply by (2.0*SqrtEnChange+win) */
-
-          win += inc;
-          tmpW16ptr++;
-        }
-      }
-
-      /* Make the linear interpolation between the forward PLC'd data
-         and the backward PLC'd data (from the new frame)
-      */
-
-      if (plc_blockl==40) {
-        inc=400; /* 1/41 in Q14 */
-      } else { /* plc_blockl==80 */
-        inc=202; /* 1/81 in Q14 */
-      }
-      win=0;
-      enh_bufPtr1=&enh_buf[ENH_BUFL-1-iLBCdec_inst->blockl];
-      for (i=0; i<plc_blockl; i++) {
-        win+=inc;
-        *enh_bufPtr1 = (int16_t)((*enh_bufPtr1 * win) >> 14);
-        *enh_bufPtr1 += (int16_t)(
-            ((16384 - win) * plc_pred[plc_blockl - 1 - i]) >> 14);
-        enh_bufPtr1--;
-      }
-    } else {
-      int16_t *synt = &downsampled[LPC_FILTERORDER];
-
-      enh_bufPtr1=&enh_buf[ENH_BUFL-iLBCdec_inst->blockl-plc_blockl];
-      WEBRTC_SPL_MEMCPY_W16(enh_bufPtr1, plc_pred, plc_blockl);
-
-      /* Clear fileter memory */
-      WebRtcSpl_MemSetW16(iLBCdec_inst->syntMem, 0, LPC_FILTERORDER);
-      WebRtcSpl_MemSetW16(iLBCdec_inst->hpimemy, 0, 4);
-      WebRtcSpl_MemSetW16(iLBCdec_inst->hpimemx, 0, 2);
-
-      /* Initialize filter memory by filtering through 2 lags */
-      WEBRTC_SPL_MEMCPY_W16(&synt[-LPC_FILTERORDER], iLBCdec_inst->syntMem,
-                            LPC_FILTERORDER);
-      WebRtcSpl_FilterARFastQ12(
-          enh_bufPtr1,
-          synt,
-          &iLBCdec_inst->old_syntdenum[
-              (iLBCdec_inst->nsub-1)*(LPC_FILTERORDER+1)],
-          LPC_FILTERORDER+1, lag);
-
-      WEBRTC_SPL_MEMCPY_W16(&synt[-LPC_FILTERORDER], &synt[lag-LPC_FILTERORDER],
-                            LPC_FILTERORDER);
-      WebRtcIlbcfix_HpOutput(synt, (int16_t*)WebRtcIlbcfix_kHpOutCoefs,
-                             iLBCdec_inst->hpimemy, iLBCdec_inst->hpimemx,
-                             lag);
-      WebRtcSpl_FilterARFastQ12(
-          enh_bufPtr1, synt,
-          &iLBCdec_inst->old_syntdenum[
-              (iLBCdec_inst->nsub-1)*(LPC_FILTERORDER+1)],
-          LPC_FILTERORDER+1, lag);
-
-      WEBRTC_SPL_MEMCPY_W16(iLBCdec_inst->syntMem, &synt[lag-LPC_FILTERORDER],
-                            LPC_FILTERORDER);
-      WebRtcIlbcfix_HpOutput(synt, (int16_t*)WebRtcIlbcfix_kHpOutCoefs,
-                             iLBCdec_inst->hpimemy, iLBCdec_inst->hpimemx,
-                             lag);
-    }
-  }
-
-
-  /* Perform enhancement block by block */
-
-  for (iblock = 0; iblock<new_blocks; iblock++) {
-    WebRtcIlbcfix_Enhancer(out + iblock * ENH_BLOCKL,
-                           enh_buf,
-                           ENH_BUFL,
-                           iblock * ENH_BLOCKL + startPos,
-                           enh_period,
-                           WebRtcIlbcfix_kEnhPlocs, ENH_NBLOCKS_TOT);
-  }
-
-  return (lag);
-}
diff --git a/modules/audio_coding/codecs/ilbc/enhancer_interface.h b/modules/audio_coding/codecs/ilbc/enhancer_interface.h
deleted file mode 100644
index d540533..0000000
--- a/modules/audio_coding/codecs/ilbc/enhancer_interface.h
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_EnhancerInterface.h
-
-******************************************************************/
-
-#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_ENHANCER_INTERFACE_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_ENHANCER_INTERFACE_H_
-
-#include "defines.h"
-
-/*----------------------------------------------------------------*
- * interface for enhancer
- *---------------------------------------------------------------*/
-
-size_t  // (o) Estimated lag in end of in[]
-    WebRtcIlbcfix_EnhancerInterface(
-        int16_t* out,                // (o) enhanced signal
-        const int16_t* in,           // (i) unenhanced signal
-        IlbcDecoder* iLBCdec_inst);  // (i) buffers etc
-
-#endif
diff --git a/modules/audio_coding/codecs/ilbc/filtered_cb_vecs.c b/modules/audio_coding/codecs/ilbc/filtered_cb_vecs.c
deleted file mode 100644
index 04d17a6..0000000
--- a/modules/audio_coding/codecs/ilbc/filtered_cb_vecs.c
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_FilteredCbVecs.c
-
-******************************************************************/
-
-#include "defines.h"
-#include "constants.h"
-
-/*----------------------------------------------------------------*
- *  Construct an additional codebook vector by filtering the
- *  initial codebook buffer. This vector is then used to expand
- *  the codebook with an additional section.
- *---------------------------------------------------------------*/
-
-void WebRtcIlbcfix_FilteredCbVecs(
-    int16_t *cbvectors, /* (o) Codebook vector for the higher section */
-    int16_t *CBmem,  /* (i) Codebook memory that is filtered to create a
-                                           second CB section */
-    size_t lMem,  /* (i) Length of codebook memory */
-    size_t samples    /* (i) Number of samples to filter */
-                                  ) {
-
-  /* Set up the memory, start with zero state */
-  WebRtcSpl_MemSetW16(CBmem+lMem, 0, CB_HALFFILTERLEN);
-  WebRtcSpl_MemSetW16(CBmem-CB_HALFFILTERLEN, 0, CB_HALFFILTERLEN);
-  WebRtcSpl_MemSetW16(cbvectors, 0, lMem-samples);
-
-  /* Filter to obtain the filtered CB memory */
-
-  WebRtcSpl_FilterMAFastQ12(
-      CBmem+CB_HALFFILTERLEN+lMem-samples, cbvectors+lMem-samples,
-      (int16_t*)WebRtcIlbcfix_kCbFiltersRev, CB_FILTERLEN, samples);
-
-  return;
-}
diff --git a/modules/audio_coding/codecs/ilbc/filtered_cb_vecs.h b/modules/audio_coding/codecs/ilbc/filtered_cb_vecs.h
deleted file mode 100644
index d23b25c..0000000
--- a/modules/audio_coding/codecs/ilbc/filtered_cb_vecs.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_FilteredCbVecs.h
-
-******************************************************************/
-
-#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_FILTERED_CB_VECS_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_FILTERED_CB_VECS_H_
-
-#include "defines.h"
-
-/*----------------------------------------------------------------*
- *  Construct an additional codebook vector by filtering the
- *  initial codebook buffer. This vector is then used to expand
- *  the codebook with an additional section.
- *---------------------------------------------------------------*/
-
-void WebRtcIlbcfix_FilteredCbVecs(
-    int16_t *cbvectors, /* (o) Codebook vector for the higher section */
-    int16_t *CBmem,  /* (i) Codebook memory that is filtered to create a
-                                           second CB section */
-    size_t lMem,  /* (i) Length of codebook memory */
-    size_t samples    /* (i) Number of samples to filter */
-                                  );
-
-#endif
diff --git a/modules/audio_coding/codecs/ilbc/frame_classify.c b/modules/audio_coding/codecs/ilbc/frame_classify.c
deleted file mode 100644
index 4833280..0000000
--- a/modules/audio_coding/codecs/ilbc/frame_classify.c
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_FrameClassify.c
-
-******************************************************************/
-
-#include "defines.h"
-#include "constants.h"
-
-/*----------------------------------------------------------------*
- *  Classification of subframes to localize start state
- *---------------------------------------------------------------*/
-
-size_t WebRtcIlbcfix_FrameClassify(
-    /* (o) Index to the max-energy sub frame */
-    IlbcEncoder *iLBCenc_inst,
-    /* (i/o) the encoder state structure */
-    int16_t *residualFIX /* (i) lpc residual signal */
-                                                ){
-  int16_t max, scale;
-  int32_t ssqEn[NSUB_MAX-1];
-  int16_t *ssqPtr;
-  int32_t *seqEnPtr;
-  int32_t maxW32;
-  int16_t scale1;
-  size_t pos;
-  size_t n;
-
-  /*
-    Calculate the energy of each of the 80 sample blocks
-    in the draft the 4 first and last samples are windowed with 1/5...4/5
-    and 4/5...1/5 respectively. To simplify for the fixpoint we have changed
-    this to 0 0 1 1 and 1 1 0 0
-  */
-
-  max = WebRtcSpl_MaxAbsValueW16(residualFIX, iLBCenc_inst->blockl);
-  scale = WebRtcSpl_GetSizeInBits((uint32_t)(max * max));
-
-  /* Scale to maximum 24 bits so that it won't overflow for 76 samples */
-  scale = scale-24;
-  scale1 = WEBRTC_SPL_MAX(0, scale);
-
-  /* Calculate energies */
-  ssqPtr=residualFIX + 2;
-  seqEnPtr=ssqEn;
-  for (n=(iLBCenc_inst->nsub-1); n>0; n--) {
-    (*seqEnPtr) = WebRtcSpl_DotProductWithScale(ssqPtr, ssqPtr, 76, scale1);
-    ssqPtr += 40;
-    seqEnPtr++;
-  }
-
-  /* Scale to maximum 20 bits in order to allow for the 11 bit window */
-  maxW32 = WebRtcSpl_MaxValueW32(ssqEn, iLBCenc_inst->nsub - 1);
-  scale = WebRtcSpl_GetSizeInBits(maxW32) - 20;
-  scale1 = WEBRTC_SPL_MAX(0, scale);
-
-  /* Window each 80 block with the ssqEn_winTbl window to give higher probability for
-     the blocks in the middle
-  */
-  seqEnPtr=ssqEn;
-  if (iLBCenc_inst->mode==20) {
-    ssqPtr=(int16_t*)WebRtcIlbcfix_kStartSequenceEnrgWin+1;
-  } else {
-    ssqPtr=(int16_t*)WebRtcIlbcfix_kStartSequenceEnrgWin;
-  }
-  for (n=(iLBCenc_inst->nsub-1); n>0; n--) {
-    (*seqEnPtr)=WEBRTC_SPL_MUL(((*seqEnPtr)>>scale1), (*ssqPtr));
-    seqEnPtr++;
-    ssqPtr++;
-  }
-
-  /* Extract the best choise of start state */
-  pos = WebRtcSpl_MaxIndexW32(ssqEn, iLBCenc_inst->nsub - 1) + 1;
-
-  return(pos);
-}
diff --git a/modules/audio_coding/codecs/ilbc/frame_classify.h b/modules/audio_coding/codecs/ilbc/frame_classify.h
deleted file mode 100644
index 99f7144..0000000
--- a/modules/audio_coding/codecs/ilbc/frame_classify.h
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_FrameClassify.h
-
-******************************************************************/
-
-#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_FRAME_CLASSIFY_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_FRAME_CLASSIFY_H_
-
-size_t WebRtcIlbcfix_FrameClassify(
-    /* (o) Index to the max-energy sub frame */
-    IlbcEncoder *iLBCenc_inst,
-    /* (i/o) the encoder state structure */
-    int16_t *residualFIX /* (i) lpc residual signal */
-                                                );
-
-#endif
diff --git a/modules/audio_coding/codecs/ilbc/gain_dequant.c b/modules/audio_coding/codecs/ilbc/gain_dequant.c
deleted file mode 100644
index 07e09bb..0000000
--- a/modules/audio_coding/codecs/ilbc/gain_dequant.c
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_GainDequant.c
-
-******************************************************************/
-
-#include "defines.h"
-#include "constants.h"
-
-/*----------------------------------------------------------------*
- *  decoder for quantized gains in the gain-shape coding of
- *  residual
- *---------------------------------------------------------------*/
-
-int16_t WebRtcIlbcfix_GainDequant(
-    /* (o) quantized gain value (Q14) */
-    int16_t index, /* (i) quantization index */
-    int16_t maxIn, /* (i) maximum of unquantized gain (Q14) */
-    int16_t stage /* (i) The stage of the search */
-                                                ){
-  int16_t scale;
-  const int16_t *gain;
-
-  /* obtain correct scale factor */
-
-  scale=WEBRTC_SPL_ABS_W16(maxIn);
-  scale = WEBRTC_SPL_MAX(1638, scale);  /* if lower than 0.1, set it to 0.1 */
-
-  /* select the quantization table and return the decoded value */
-  gain = WebRtcIlbcfix_kGain[stage];
-
-  return (int16_t)((scale * gain[index] + 8192) >> 14);
-}
diff --git a/modules/audio_coding/codecs/ilbc/gain_dequant.h b/modules/audio_coding/codecs/ilbc/gain_dequant.h
deleted file mode 100644
index 6bda066..0000000
--- a/modules/audio_coding/codecs/ilbc/gain_dequant.h
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_GainDequant.h
-
-******************************************************************/
-
-#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_GAIN_DEQUANT_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_GAIN_DEQUANT_H_
-
-#include "defines.h"
-
-/*----------------------------------------------------------------*
- *  decoder for quantized gains in the gain-shape coding of
- *  residual
- *---------------------------------------------------------------*/
-
-int16_t WebRtcIlbcfix_GainDequant(
-    /* (o) quantized gain value (Q14) */
-    int16_t index, /* (i) quantization index */
-    int16_t maxIn, /* (i) maximum of unquantized gain (Q14) */
-    int16_t stage /* (i) The stage of the search */
-                                         );
-
-#endif
diff --git a/modules/audio_coding/codecs/ilbc/gain_quant.c b/modules/audio_coding/codecs/ilbc/gain_quant.c
deleted file mode 100644
index 90b4114..0000000
--- a/modules/audio_coding/codecs/ilbc/gain_quant.c
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_GainQuant.c
-
-******************************************************************/
-
-#include "defines.h"
-#include "constants.h"
-
-/*----------------------------------------------------------------*
- *  quantizer for the gain in the gain-shape coding of residual
- *---------------------------------------------------------------*/
-
-int16_t WebRtcIlbcfix_GainQuant( /* (o) quantized gain value */
-    int16_t gain, /* (i) gain value Q14 */
-    int16_t maxIn, /* (i) maximum of gain value Q14 */
-    int16_t stage, /* (i) The stage of the search */
-    int16_t *index /* (o) quantization index */
-                                        ) {
-
-  int16_t scale, cblen;
-  int32_t gainW32, measure1, measure2;
-  const int16_t *cbPtr, *cb;
-  int loc, noMoves, noChecks, i;
-
-  /* ensure a lower bound (0.1) on the scaling factor */
-
-  scale = WEBRTC_SPL_MAX(1638, maxIn);
-
-  /* select the quantization table and calculate
-     the length of the table and the number of
-     steps in the binary search that are needed */
-  cb = WebRtcIlbcfix_kGain[stage];
-  cblen = 32>>stage;
-  noChecks = 4-stage;
-
-  /* Multiply the gain with 2^14 to make the comparison
-     easier and with higher precision */
-  gainW32 = gain << 14;
-
-  /* Do a binary search, starting in the middle of the CB
-     loc - defines the current position in the table
-     noMoves - defines the number of steps to move in the CB in order
-     to get next CB location
-  */
-
-  loc = cblen>>1;
-  noMoves = loc;
-  cbPtr = cb + loc; /* Centre of CB */
-
-  for (i=noChecks;i>0;i--) {
-    noMoves>>=1;
-    measure1 = scale * *cbPtr;
-
-    /* Move up if gain is larger, otherwise move down in table */
-    measure1 = measure1 - gainW32;
-
-    if (0>measure1) {
-      cbPtr+=noMoves;
-      loc+=noMoves;
-    } else {
-      cbPtr-=noMoves;
-      loc-=noMoves;
-    }
-  }
-
-  /* Check which value is the closest one: loc-1, loc or loc+1 */
-
-  measure1 = scale * *cbPtr;
-  if (gainW32>measure1) {
-    /* Check against value above loc */
-    measure2 = scale * cbPtr[1];
-    if ((measure2-gainW32)<(gainW32-measure1)) {
-      loc+=1;
-    }
-  } else {
-    /* Check against value below loc */
-    measure2 = scale * cbPtr[-1];
-    if ((gainW32-measure2)<=(measure1-gainW32)) {
-      loc-=1;
-    }
-  }
-
-  /* Guard against getting outside the table. The calculation above can give a location
-     which is one above the maximum value (in very rare cases) */
-  loc=WEBRTC_SPL_MIN(loc, (cblen-1));
-  *index=loc;
-
-  /* Calculate and return the quantized gain value (in Q14) */
-  return (int16_t)((scale * cb[loc] + 8192) >> 14);
-}
diff --git a/modules/audio_coding/codecs/ilbc/gain_quant.h b/modules/audio_coding/codecs/ilbc/gain_quant.h
deleted file mode 100644
index 3954364..0000000
--- a/modules/audio_coding/codecs/ilbc/gain_quant.h
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_GainQuant.h
-
-******************************************************************/
-
-#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_GAIN_QUANT_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_GAIN_QUANT_H_
-
-#include "defines.h"
-
-/*----------------------------------------------------------------*
- *  quantizer for the gain in the gain-shape coding of residual
- *---------------------------------------------------------------*/
-
-int16_t WebRtcIlbcfix_GainQuant( /* (o) quantized gain value */
-    int16_t gain, /* (i) gain value Q14 */
-    int16_t maxIn, /* (i) maximum of gain value Q14 */
-    int16_t stage, /* (i) The stage of the search */
-    int16_t *index /* (o) quantization index */
-                                       );
-
-#endif
diff --git a/modules/audio_coding/codecs/ilbc/get_cd_vec.c b/modules/audio_coding/codecs/ilbc/get_cd_vec.c
deleted file mode 100644
index 272b49a..0000000
--- a/modules/audio_coding/codecs/ilbc/get_cd_vec.c
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_GetCbVec.c
-
-******************************************************************/
-
-#include "get_cd_vec.h"
-
-#include "defines.h"
-#include "constants.h"
-#include "create_augmented_vec.h"
-
-/*----------------------------------------------------------------*
- *  Construct codebook vector for given index.
- *---------------------------------------------------------------*/
-
-bool WebRtcIlbcfix_GetCbVec(
-    int16_t *cbvec,   /* (o) Constructed codebook vector */
-    int16_t *mem,   /* (i) Codebook buffer */
-    size_t index,   /* (i) Codebook index */
-    size_t lMem,   /* (i) Length of codebook buffer */
-    size_t cbveclen   /* (i) Codebook vector length */
-                            ){
-  size_t k, base_size;
-  size_t lag;
-  /* Stack based */
-  int16_t tempbuff2[SUBL+5];
-
-  /* Determine size of codebook sections */
-
-  base_size=lMem-cbveclen+1;
-
-  if (cbveclen==SUBL) {
-    base_size += cbveclen / 2;
-  }
-
-  /* No filter -> First codebook section */
-
-  if (index<lMem-cbveclen+1) {
-
-    /* first non-interpolated vectors */
-
-    k=index+cbveclen;
-    /* get vector */
-    WEBRTC_SPL_MEMCPY_W16(cbvec, mem+lMem-k, cbveclen);
-
-  } else if (index < base_size) {
-
-    /* Calculate lag */
-
-    k = (2 * (index - (lMem - cbveclen + 1))) + cbveclen;
-
-    lag = k / 2;
-
-    WebRtcIlbcfix_CreateAugmentedVec(lag, mem+lMem, cbvec);
-
-  }
-
-  /* Higher codebbok section based on filtering */
-
-  else {
-
-    size_t memIndTest;
-
-    /* first non-interpolated vectors */
-
-    if (index-base_size<lMem-cbveclen+1) {
-
-      /* Set up filter memory, stuff zeros outside memory buffer */
-
-      memIndTest = lMem-(index-base_size+cbveclen);
-
-      WebRtcSpl_MemSetW16(mem-CB_HALFFILTERLEN, 0, CB_HALFFILTERLEN);
-      WebRtcSpl_MemSetW16(mem+lMem, 0, CB_HALFFILTERLEN);
-
-      /* do filtering to get the codebook vector */
-
-      WebRtcSpl_FilterMAFastQ12(
-          &mem[memIndTest+4], cbvec, (int16_t*)WebRtcIlbcfix_kCbFiltersRev,
-          CB_FILTERLEN, cbveclen);
-    }
-
-    /* interpolated vectors */
-
-    else {
-      if (cbveclen < SUBL) {
-        // We're going to fill in cbveclen + 5 elements of tempbuff2 in
-        // WebRtcSpl_FilterMAFastQ12, less than the SUBL + 5 elements we'll be
-        // using in WebRtcIlbcfix_CreateAugmentedVec. This error is caused by
-        // bad values in |index| (which come from the encoded stream). Tell the
-        // caller that things went south, and that the decoder state is now
-        // corrupt (because it's half-way through an update that we can't
-        // complete).
-        return false;
-      }
-
-      /* Stuff zeros outside memory buffer  */
-      memIndTest = lMem-cbveclen-CB_FILTERLEN;
-      WebRtcSpl_MemSetW16(mem+lMem, 0, CB_HALFFILTERLEN);
-
-      /* do filtering */
-      WebRtcSpl_FilterMAFastQ12(
-          &mem[memIndTest+7], tempbuff2, (int16_t*)WebRtcIlbcfix_kCbFiltersRev,
-          CB_FILTERLEN, cbveclen+5);
-
-      /* Calculate lag index */
-      lag = (cbveclen<<1)-20+index-base_size-lMem-1;
-
-      WebRtcIlbcfix_CreateAugmentedVec(lag, tempbuff2+SUBL+5, cbvec);
-    }
-  }
-
-  return true;  // Success.
-}
diff --git a/modules/audio_coding/codecs/ilbc/get_cd_vec.h b/modules/audio_coding/codecs/ilbc/get_cd_vec.h
deleted file mode 100644
index a5abb5e..0000000
--- a/modules/audio_coding/codecs/ilbc/get_cd_vec.h
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_GetCbVec.h
-
-******************************************************************/
-
-#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_GET_CD_VEC_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_GET_CD_VEC_H_
-
-#include <stdbool.h>
-
-#include "defines.h"
-
-// Returns true on success, false on failure. In case of failure, the decoder
-// state may be corrupted and needs resetting.
-bool WebRtcIlbcfix_GetCbVec(
-    int16_t* cbvec, /* (o) Constructed codebook vector */
-    int16_t* mem,   /* (i) Codebook buffer */
-    size_t index,   /* (i) Codebook index */
-    size_t lMem,    /* (i) Length of codebook buffer */
-    size_t cbveclen /* (i) Codebook vector length */
-    ) RTC_WARN_UNUSED_RESULT;
-
-#endif
diff --git a/modules/audio_coding/codecs/ilbc/get_lsp_poly.c b/modules/audio_coding/codecs/ilbc/get_lsp_poly.c
deleted file mode 100644
index a8375af..0000000
--- a/modules/audio_coding/codecs/ilbc/get_lsp_poly.c
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_GetLspPoly.c
-
-******************************************************************/
-
-#include "defines.h"
-
-/*----------------------------------------------------------------*
- * Construct the polynomials F1(z) and F2(z) from the LSP
- * (Computations are done in Q24)
- *
- * The expansion is performed using the following recursion:
- *
- * f[0] = 1;
- * tmp = -2.0 * lsp[0];
- * f[1] = tmp;
- * for (i=2; i<=5; i++) {
- *    b = -2.0 * lsp[2*i-2];
- *    f[i] = tmp*f[i-1] + 2.0*f[i-2];
- *    for (j=i; j>=2; j--) {
- *       f[j] = f[j] + tmp*f[j-1] + f[j-2];
- *    }
- *    f[i] = f[i] + tmp;
- * }
- *---------------------------------------------------------------*/
-
-void WebRtcIlbcfix_GetLspPoly(
-    int16_t *lsp, /* (i) LSP in Q15 */
-    int32_t *f)  /* (o) polonymial in Q24 */
-{
-  int32_t tmpW32;
-  int i, j;
-  int16_t high, low;
-  int16_t *lspPtr;
-  int32_t *fPtr;
-
-  lspPtr = lsp;
-  fPtr = f;
-  /* f[0] = 1.0 (Q24) */
-  (*fPtr) = (int32_t)16777216;
-  fPtr++;
-
-  (*fPtr) = WEBRTC_SPL_MUL((*lspPtr), -1024);
-  fPtr++;
-  lspPtr+=2;
-
-  for(i=2; i<=5; i++)
-  {
-    (*fPtr) = fPtr[-2];
-
-    for(j=i; j>1; j--)
-    {
-      /* Compute f[j] = f[j] + tmp*f[j-1] + f[j-2]; */
-      high = (int16_t)(fPtr[-1] >> 16);
-      low = (int16_t)((fPtr[-1] & 0xffff) >> 1);
-
-      tmpW32 = 4 * high * *lspPtr + 4 * ((low * *lspPtr) >> 15);
-
-      (*fPtr) += fPtr[-2];
-      (*fPtr) -= tmpW32;
-      fPtr--;
-    }
-    *fPtr -= *lspPtr * (1 << 10);
-
-    fPtr+=i;
-    lspPtr+=2;
-  }
-  return;
-}
diff --git a/modules/audio_coding/codecs/ilbc/get_lsp_poly.h b/modules/audio_coding/codecs/ilbc/get_lsp_poly.h
deleted file mode 100644
index 46ade48..0000000
--- a/modules/audio_coding/codecs/ilbc/get_lsp_poly.h
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_GetLspPoly.h
-
-******************************************************************/
-
-#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_GET_LSP_POLY_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_GET_LSP_POLY_H_
-
-#include "defines.h"
-
-/*----------------------------------------------------------------*
- * Construct the polynomials F1(z) and F2(z) from the LSP
- * (Computations are done in Q24)
- *
- * The expansion is performed using the following recursion:
- *
- * f[0] = 1;
- * tmp = -2.0 * lsp[0];
- * f[1] = tmp;
- * for (i=2; i<=5; i++) {
- *    b = -2.0 * lsp[2*i-2];
- *    f[i] = tmp*f[i-1] + 2.0*f[i-2];
- *    for (j=i; j>=2; j--) {
- *       f[j] = f[j] + tmp*f[j-1] + f[j-2];
- *    }
- *    f[i] = f[i] + tmp;
- * }
- *---------------------------------------------------------------*/
-
-void WebRtcIlbcfix_GetLspPoly(
-    int16_t *lsp, /* (i) LSP in Q15 */
-    int32_t *f);  /* (o) polonymial in Q24 */
-
-#endif
diff --git a/modules/audio_coding/codecs/ilbc/get_sync_seq.c b/modules/audio_coding/codecs/ilbc/get_sync_seq.c
deleted file mode 100644
index a98a96c..0000000
--- a/modules/audio_coding/codecs/ilbc/get_sync_seq.c
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_GetSyncSeq.c
-
-******************************************************************/
-
-#include "defines.h"
-#include "constants.h"
-#include "refiner.h"
-#include "nearest_neighbor.h"
-
-/*----------------------------------------------------------------*
- * get the pitch-synchronous sample sequence
- *---------------------------------------------------------------*/
-
-void WebRtcIlbcfix_GetSyncSeq(
-    int16_t *idata,   /* (i) original data */
-    size_t idatal,   /* (i) dimension of data */
-    size_t centerStartPos, /* (i) where current block starts */
-    size_t *period,   /* (i) rough-pitch-period array       (Q-2) */
-    const size_t *plocs, /* (i) where periods of period array are taken (Q-2) */
-    size_t periodl,   /* (i) dimension period array */
-    size_t hl,    /* (i) 2*hl+1 is the number of sequences */
-    int16_t *surround  /* (i/o) The contribution from this sequence
-                                summed with earlier contributions */
-                              ){
-  size_t i, centerEndPos, q;
-  /* Stack based */
-  size_t lagBlock[2 * ENH_HL + 1];
-  size_t blockStartPos[2 * ENH_HL + 1]; /* The position to search around (Q2) */
-  size_t plocs2[ENH_PLOCSL];
-
-  centerEndPos = centerStartPos + ENH_BLOCKL - 1;
-
-  /* present (find predicted lag from this position) */
-
-  WebRtcIlbcfix_NearestNeighbor(lagBlock + hl,
-                                plocs,
-                                2 * (centerStartPos + centerEndPos),
-                                periodl);
-
-  blockStartPos[hl] = 4 * centerStartPos;
-
-  /* past (find predicted position and perform a refined
-     search to find the best sequence) */
-
-  for (q = hl; q > 0; q--) {
-    size_t qq = q - 1;
-    size_t period_q = period[lagBlock[q]];
-    /* Stop if this sequence would be outside the buffer; that means all
-       further-past sequences would also be outside the buffer. */
-    if (blockStartPos[q] < period_q + (4 * ENH_OVERHANG))
-      break;
-    blockStartPos[qq] = blockStartPos[q] - period_q;
-
-    size_t value = blockStartPos[qq] + 4 * ENH_BLOCKL_HALF;
-    value = (value > period_q) ? (value - period_q) : 0;
-    WebRtcIlbcfix_NearestNeighbor(lagBlock + qq, plocs, value, periodl);
-
-    /* Find the best possible sequence in the 4 times upsampled
-        domain around blockStartPos+q */
-    WebRtcIlbcfix_Refiner(blockStartPos + qq, idata, idatal, centerStartPos,
-                          blockStartPos[qq], surround,
-                          WebRtcIlbcfix_kEnhWt[qq]);
-  }
-
-  /* future (find predicted position and perform a refined
-     search to find the best sequence) */
-
-  for (i = 0; i < periodl; i++) {
-    plocs2[i] = plocs[i] - period[i];
-  }
-
-  for (q = hl + 1; q <= (2 * hl); q++) {
-
-    WebRtcIlbcfix_NearestNeighbor(
-        lagBlock + q,
-        plocs2,
-        blockStartPos[q - 1] + 4 * ENH_BLOCKL_HALF,
-        periodl);
-
-    blockStartPos[q]=blockStartPos[q-1]+period[lagBlock[q]];
-
-    if (blockStartPos[q] + 4 * (ENH_BLOCKL + ENH_OVERHANG) < 4 * idatal) {
-
-      /* Find the best possible sequence in the 4 times upsampled
-         domain around blockStartPos+q */
-      WebRtcIlbcfix_Refiner(blockStartPos + q, idata, idatal, centerStartPos,
-                            blockStartPos[q], surround,
-                            WebRtcIlbcfix_kEnhWt[2 * hl - q]);
-
-    } else {
-      /* Don't add anything since this sequence would
-         be outside the buffer */
-    }
-  }
-}
diff --git a/modules/audio_coding/codecs/ilbc/get_sync_seq.h b/modules/audio_coding/codecs/ilbc/get_sync_seq.h
deleted file mode 100644
index 0e3b207..0000000
--- a/modules/audio_coding/codecs/ilbc/get_sync_seq.h
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_GetSyncSeq.h
-
-******************************************************************/
-
-#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_GET_SYNC_SEQ_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_GET_SYNC_SEQ_H_
-
-#include "defines.h"
-
-/*----------------------------------------------------------------*
- * get the pitch-synchronous sample sequence
- *---------------------------------------------------------------*/
-
-void WebRtcIlbcfix_GetSyncSeq(
-    int16_t *idata,   /* (i) original data */
-    size_t idatal,   /* (i) dimension of data */
-    size_t centerStartPos, /* (i) where current block starts */
-    size_t *period,   /* (i) rough-pitch-period array       (Q-2) */
-    const size_t *plocs, /* (i) where periods of period array are taken (Q-2) */
-    size_t periodl,   /* (i) dimension period array */
-    size_t hl,    /* (i) 2*hl+1 is the number of sequences */
-    int16_t *surround  /* (i/o) The contribution from this sequence
-                                summed with earlier contributions */
-                              );
-
-#endif
diff --git a/modules/audio_coding/codecs/ilbc/hp_input.c b/modules/audio_coding/codecs/ilbc/hp_input.c
deleted file mode 100644
index 5d8a860..0000000
--- a/modules/audio_coding/codecs/ilbc/hp_input.c
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_HpInput.c
-
-******************************************************************/
-
-#include "defines.h"
-
-/*----------------------------------------------------------------*
- *  high-pass filter of input with *0.5 and saturation
- *---------------------------------------------------------------*/
-
-void WebRtcIlbcfix_HpInput(
-    int16_t *signal,     /* (i/o) signal vector */
-    int16_t *ba,      /* (i)   B- and A-coefficients (2:nd order)
-                                                                   {b[0] b[1] b[2] -a[1] -a[2]} a[0]
-                                                                   is assumed to be 1.0 */
-    int16_t *y,      /* (i/o) Filter state yhi[n-1] ylow[n-1]
-                                                                   yhi[n-2] ylow[n-2] */
-    int16_t *x,      /* (i/o) Filter state x[n-1] x[n-2] */
-    size_t len)      /* (i)   Number of samples to filter */
-{
-  size_t i;
-  int32_t tmpW32;
-  int32_t tmpW32b;
-
-  for (i=0; i<len; i++) {
-
-    /*
-        y[i] = b[0]*x[i] + b[1]*x[i-1] + b[2]*x[i-2]
-        + (-a[1])*y[i-1] + (-a[2])*y[i-2];
-    */
-
-    tmpW32 = y[1] * ba[3];  /* (-a[1])*y[i-1] (low part) */
-    tmpW32 += y[3] * ba[4];  /* (-a[2])*y[i-2] (low part) */
-    tmpW32 = (tmpW32>>15);
-    tmpW32 += y[0] * ba[3];  /* (-a[1])*y[i-1] (high part) */
-    tmpW32 += y[2] * ba[4];  /* (-a[2])*y[i-2] (high part) */
-    tmpW32 = (tmpW32<<1);
-
-    tmpW32 += signal[i] * ba[0];  /* b[0]*x[0] */
-    tmpW32 += x[0] * ba[1];  /* b[1]*x[i-1] */
-    tmpW32 += x[1] * ba[2];  /* b[2]*x[i-2] */
-
-    /* Update state (input part) */
-    x[1] = x[0];
-    x[0] = signal[i];
-
-    /* Rounding in Q(12+1), i.e. add 2^12 */
-    tmpW32b = tmpW32 + 4096;
-
-    /* Saturate (to 2^28) so that the HP filtered signal does not overflow */
-    tmpW32b = WEBRTC_SPL_SAT((int32_t)268435455, tmpW32b, (int32_t)-268435456);
-
-    /* Convert back to Q0 and multiply with 0.5 */
-    signal[i] = (int16_t)(tmpW32b >> 13);
-
-    /* Update state (filtered part) */
-    y[2] = y[0];
-    y[3] = y[1];
-
-    /* upshift tmpW32 by 3 with saturation */
-    if (tmpW32>268435455) {
-      tmpW32 = WEBRTC_SPL_WORD32_MAX;
-    } else if (tmpW32<-268435456) {
-      tmpW32 = WEBRTC_SPL_WORD32_MIN;
-    } else {
-      tmpW32 <<= 3;
-    }
-
-    y[0] = (int16_t)(tmpW32 >> 16);
-    y[1] = (int16_t)((tmpW32 - (y[0] << 16)) >> 1);
-  }
-
-  return;
-}
diff --git a/modules/audio_coding/codecs/ilbc/hp_input.h b/modules/audio_coding/codecs/ilbc/hp_input.h
deleted file mode 100644
index acdfa91..0000000
--- a/modules/audio_coding/codecs/ilbc/hp_input.h
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_HpInput.h
-
-******************************************************************/
-
-#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_HP_INPUT_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_HP_INPUT_H_
-
-#include "defines.h"
-
-void WebRtcIlbcfix_HpInput(
-    int16_t *signal,     /* (i/o) signal vector */
-    int16_t *ba,      /* (i)   B- and A-coefficients (2:nd order)
-                                                                   {b[0] b[1] b[2] -a[1] -a[2]} a[0]
-                                                                   is assumed to be 1.0 */
-    int16_t *y,      /* (i/o) Filter state yhi[n-1] ylow[n-1]
-                                                                   yhi[n-2] ylow[n-2] */
-    int16_t *x,      /* (i/o) Filter state x[n-1] x[n-2] */
-    size_t len);     /* (i)   Number of samples to filter */
-
-#endif
diff --git a/modules/audio_coding/codecs/ilbc/hp_output.c b/modules/audio_coding/codecs/ilbc/hp_output.c
deleted file mode 100644
index 8b18c04..0000000
--- a/modules/audio_coding/codecs/ilbc/hp_output.c
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_HpOutput.c
-
-******************************************************************/
-
-#include "defines.h"
-
-/*----------------------------------------------------------------*
- *  high-pass filter of output and *2 with saturation
- *---------------------------------------------------------------*/
-
-void WebRtcIlbcfix_HpOutput(
-    int16_t *signal,     /* (i/o) signal vector */
-    int16_t *ba,      /* (i)   B- and A-coefficients (2:nd order)
-                                                                   {b[0] b[1] b[2] -a[1] -a[2]} a[0]
-                                                                   is assumed to be 1.0 */
-    int16_t *y,      /* (i/o) Filter state yhi[n-1] ylow[n-1]
-                                                                   yhi[n-2] ylow[n-2] */
-    int16_t *x,      /* (i/o) Filter state x[n-1] x[n-2] */
-    size_t len)      /* (i)   Number of samples to filter */
-{
-  size_t i;
-  int32_t tmpW32;
-  int32_t tmpW32b;
-
-  for (i=0; i<len; i++) {
-
-    /*
-      y[i] = b[0]*x[i] + b[1]*x[i-1] + b[2]*x[i-2]
-      + (-a[1])*y[i-1] + (-a[2])*y[i-2];
-    */
-
-    tmpW32 = y[1] * ba[3];  /* (-a[1])*y[i-1] (low part) */
-    tmpW32 += y[3] * ba[4];  /* (-a[2])*y[i-2] (low part) */
-    tmpW32 = (tmpW32>>15);
-    tmpW32 += y[0] * ba[3];  /* (-a[1])*y[i-1] (high part) */
-    tmpW32 += y[2] * ba[4];  /* (-a[2])*y[i-2] (high part) */
-    tmpW32 *= 2;
-
-    tmpW32 += signal[i] * ba[0];  /* b[0]*x[0] */
-    tmpW32 += x[0] * ba[1];  /* b[1]*x[i-1] */
-    tmpW32 += x[1] * ba[2];  /* b[2]*x[i-2] */
-
-    /* Update state (input part) */
-    x[1] = x[0];
-    x[0] = signal[i];
-
-    /* Rounding in Q(12-1), i.e. add 2^10 */
-    tmpW32b = tmpW32 + 1024;
-
-    /* Saturate (to 2^26) so that the HP filtered signal does not overflow */
-    tmpW32b = WEBRTC_SPL_SAT((int32_t)67108863, tmpW32b, (int32_t)-67108864);
-
-    /* Convert back to Q0 and multiply with 2 */
-    signal[i] = (int16_t)(tmpW32b >> 11);
-
-    /* Update state (filtered part) */
-    y[2] = y[0];
-    y[3] = y[1];
-
-    /* upshift tmpW32 by 3 with saturation */
-    if (tmpW32>268435455) {
-      tmpW32 = WEBRTC_SPL_WORD32_MAX;
-    } else if (tmpW32<-268435456) {
-      tmpW32 = WEBRTC_SPL_WORD32_MIN;
-    } else {
-      tmpW32 *= 8;
-    }
-
-    y[0] = (int16_t)(tmpW32 >> 16);
-    y[1] = (int16_t)((tmpW32 & 0xffff) >> 1);
-
-  }
-
-  return;
-}
diff --git a/modules/audio_coding/codecs/ilbc/hp_output.h b/modules/audio_coding/codecs/ilbc/hp_output.h
deleted file mode 100644
index 1840b68..0000000
--- a/modules/audio_coding/codecs/ilbc/hp_output.h
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_HpOutput.h
-
-******************************************************************/
-
-#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_HP_OUTPUT_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_HP_OUTPUT_H_
-
-#include "defines.h"
-
-void WebRtcIlbcfix_HpOutput(
-    int16_t *signal,     /* (i/o) signal vector */
-    int16_t *ba,      /* (i)   B- and A-coefficients (2:nd order)
-                               {b[0] b[1] b[2] -a[1] -a[2]} a[0]
-                               is assumed to be 1.0 */
-    int16_t *y,      /* (i/o) Filter state yhi[n-1] ylow[n-1]
-                              yhi[n-2] ylow[n-2] */
-    int16_t *x,      /* (i/o) Filter state x[n-1] x[n-2] */
-    size_t len);      /* (i)   Number of samples to filter */
-
-#endif
diff --git a/modules/audio_coding/codecs/ilbc/ilbc.c b/modules/audio_coding/codecs/ilbc/ilbc.c
deleted file mode 100644
index 18e0f84..0000000
--- a/modules/audio_coding/codecs/ilbc/ilbc.c
+++ /dev/null
@@ -1,287 +0,0 @@
-/*
- *  Copyright (c) 2012 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- iLBCInterface.c
-
-******************************************************************/
-
-#include "ilbc.h"
-#include "defines.h"
-#include "init_encode.h"
-#include "encode.h"
-#include "init_decode.h"
-#include "decode.h"
-#include "webrtc/rtc_base/checks.h"
-#include <stdlib.h>
-
-int16_t WebRtcIlbcfix_EncoderAssign(IlbcEncoderInstance** iLBC_encinst,
-                                    int16_t* ILBCENC_inst_Addr,
-                                    int16_t* size) {
-  *iLBC_encinst=(IlbcEncoderInstance*)ILBCENC_inst_Addr;
-  *size=sizeof(IlbcEncoder)/sizeof(int16_t);
-  if (*iLBC_encinst!=NULL) {
-    return(0);
-  } else {
-    return(-1);
-  }
-}
-
-int16_t WebRtcIlbcfix_DecoderAssign(IlbcDecoderInstance** iLBC_decinst,
-                                    int16_t* ILBCDEC_inst_Addr,
-                                    int16_t* size) {
-  *iLBC_decinst=(IlbcDecoderInstance*)ILBCDEC_inst_Addr;
-  *size=sizeof(IlbcDecoder)/sizeof(int16_t);
-  if (*iLBC_decinst!=NULL) {
-    return(0);
-  } else {
-    return(-1);
-  }
-}
-
-int16_t WebRtcIlbcfix_EncoderCreate(IlbcEncoderInstance **iLBC_encinst) {
-  *iLBC_encinst=(IlbcEncoderInstance*)malloc(sizeof(IlbcEncoder));
-  if (*iLBC_encinst!=NULL) {
-    WebRtcSpl_Init();
-    return(0);
-  } else {
-    return(-1);
-  }
-}
-
-int16_t WebRtcIlbcfix_DecoderCreate(IlbcDecoderInstance **iLBC_decinst) {
-  *iLBC_decinst=(IlbcDecoderInstance*)malloc(sizeof(IlbcDecoder));
-  if (*iLBC_decinst!=NULL) {
-    WebRtcSpl_Init();
-    return(0);
-  } else {
-    return(-1);
-  }
-}
-
-int16_t WebRtcIlbcfix_EncoderFree(IlbcEncoderInstance *iLBC_encinst) {
-  free(iLBC_encinst);
-  return(0);
-}
-
-int16_t WebRtcIlbcfix_DecoderFree(IlbcDecoderInstance *iLBC_decinst) {
-  free(iLBC_decinst);
-  return(0);
-}
-
-int16_t WebRtcIlbcfix_EncoderInit(IlbcEncoderInstance* iLBCenc_inst,
-                                  int16_t mode) {
-  if ((mode==20)||(mode==30)) {
-    WebRtcIlbcfix_InitEncode((IlbcEncoder*) iLBCenc_inst, mode);
-    return(0);
-  } else {
-    return(-1);
-  }
-}
-
-int WebRtcIlbcfix_Encode(IlbcEncoderInstance* iLBCenc_inst,
-                         const int16_t* speechIn,
-                         size_t len,
-                         uint8_t* encoded) {
-  size_t pos = 0;
-  size_t encpos = 0;
-
-  if ((len != ((IlbcEncoder*)iLBCenc_inst)->blockl) &&
-#ifdef SPLIT_10MS
-      (len != 80) &&
-#endif
-      (len != 2*((IlbcEncoder*)iLBCenc_inst)->blockl) &&
-      (len != 3*((IlbcEncoder*)iLBCenc_inst)->blockl))
-  {
-    /* A maximum of 3 frames/packet is allowed */
-    return(-1);
-  } else {
-
-    /* call encoder */
-    while (pos<len) {
-      WebRtcIlbcfix_EncodeImpl((uint16_t*)&encoded[2 * encpos], &speechIn[pos],
-                               (IlbcEncoder*)iLBCenc_inst);
-#ifdef SPLIT_10MS
-      pos += 80;
-      if(((IlbcEncoder*)iLBCenc_inst)->section == 0)
-#else
-        pos += ((IlbcEncoder*)iLBCenc_inst)->blockl;
-#endif
-      encpos += ((IlbcEncoder*)iLBCenc_inst)->no_of_words;
-    }
-    return (int)(encpos*2);
-  }
-}
-
-int16_t WebRtcIlbcfix_DecoderInit(IlbcDecoderInstance* iLBCdec_inst,
-                                  int16_t mode) {
-  if ((mode==20)||(mode==30)) {
-    WebRtcIlbcfix_InitDecode((IlbcDecoder*) iLBCdec_inst, mode, 1);
-    return(0);
-  } else {
-    return(-1);
-  }
-}
-void WebRtcIlbcfix_DecoderInit20Ms(IlbcDecoderInstance* iLBCdec_inst) {
-  WebRtcIlbcfix_InitDecode((IlbcDecoder*) iLBCdec_inst, 20, 1);
-}
-void WebRtcIlbcfix_Decoderinit30Ms(IlbcDecoderInstance* iLBCdec_inst) {
-  WebRtcIlbcfix_InitDecode((IlbcDecoder*) iLBCdec_inst, 30, 1);
-}
-
-
-int WebRtcIlbcfix_Decode(IlbcDecoderInstance* iLBCdec_inst,
-                         const uint8_t* encoded,
-                         size_t len,
-                         int16_t* decoded,
-                         int16_t* speechType)
-{
-  size_t i=0;
-  /* Allow for automatic switching between the frame sizes
-     (although you do get some discontinuity) */
-  if ((len==((IlbcDecoder*)iLBCdec_inst)->no_of_bytes)||
-      (len==2*((IlbcDecoder*)iLBCdec_inst)->no_of_bytes)||
-      (len==3*((IlbcDecoder*)iLBCdec_inst)->no_of_bytes)) {
-    /* ok, do nothing */
-  } else {
-    /* Test if the mode has changed */
-    if (((IlbcDecoder*)iLBCdec_inst)->mode==20) {
-      if ((len==NO_OF_BYTES_30MS)||
-          (len==2*NO_OF_BYTES_30MS)||
-          (len==3*NO_OF_BYTES_30MS)) {
-        WebRtcIlbcfix_InitDecode(
-            ((IlbcDecoder*)iLBCdec_inst), 30,
-            ((IlbcDecoder*)iLBCdec_inst)->use_enhancer);
-      } else {
-        /* Unsupported frame length */
-        return(-1);
-      }
-    } else {
-      if ((len==NO_OF_BYTES_20MS)||
-          (len==2*NO_OF_BYTES_20MS)||
-          (len==3*NO_OF_BYTES_20MS)) {
-        WebRtcIlbcfix_InitDecode(
-            ((IlbcDecoder*)iLBCdec_inst), 20,
-            ((IlbcDecoder*)iLBCdec_inst)->use_enhancer);
-      } else {
-        /* Unsupported frame length */
-        return(-1);
-      }
-    }
-  }
-
-  while ((i*((IlbcDecoder*)iLBCdec_inst)->no_of_bytes)<len) {
-    if (WebRtcIlbcfix_DecodeImpl(
-            &decoded[i * ((IlbcDecoder*)iLBCdec_inst)->blockl],
-            (const uint16_t*)&encoded
-                [2 * i * ((IlbcDecoder*)iLBCdec_inst)->no_of_words],
-            (IlbcDecoder*)iLBCdec_inst, 1) == -1)
-      return -1;
-    i++;
-  }
-  /* iLBC does not support VAD/CNG yet */
-  *speechType=1;
-  return (int)(i*((IlbcDecoder*)iLBCdec_inst)->blockl);
-}
-
-int WebRtcIlbcfix_Decode20Ms(IlbcDecoderInstance* iLBCdec_inst,
-                             const uint8_t* encoded,
-                             size_t len,
-                             int16_t* decoded,
-                             int16_t* speechType)
-{
-  size_t i=0;
-  if ((len==((IlbcDecoder*)iLBCdec_inst)->no_of_bytes)||
-      (len==2*((IlbcDecoder*)iLBCdec_inst)->no_of_bytes)||
-      (len==3*((IlbcDecoder*)iLBCdec_inst)->no_of_bytes)) {
-    /* ok, do nothing */
-  } else {
-    return(-1);
-  }
-
-  while ((i*((IlbcDecoder*)iLBCdec_inst)->no_of_bytes)<len) {
-    if (!WebRtcIlbcfix_DecodeImpl(
-        &decoded[i * ((IlbcDecoder*)iLBCdec_inst)->blockl],
-        (const uint16_t*)&encoded
-            [2 * i * ((IlbcDecoder*)iLBCdec_inst)->no_of_words],
-        (IlbcDecoder*)iLBCdec_inst, 1))
-      return -1;
-    i++;
-  }
-  /* iLBC does not support VAD/CNG yet */
-  *speechType=1;
-  return (int)(i*((IlbcDecoder*)iLBCdec_inst)->blockl);
-}
-
-int WebRtcIlbcfix_Decode30Ms(IlbcDecoderInstance* iLBCdec_inst,
-                             const uint8_t* encoded,
-                             size_t len,
-                             int16_t* decoded,
-                             int16_t* speechType)
-{
-  size_t i=0;
-  if ((len==((IlbcDecoder*)iLBCdec_inst)->no_of_bytes)||
-      (len==2*((IlbcDecoder*)iLBCdec_inst)->no_of_bytes)||
-      (len==3*((IlbcDecoder*)iLBCdec_inst)->no_of_bytes)) {
-    /* ok, do nothing */
-  } else {
-    return(-1);
-  }
-
-  while ((i*((IlbcDecoder*)iLBCdec_inst)->no_of_bytes)<len) {
-    if (!WebRtcIlbcfix_DecodeImpl(
-        &decoded[i * ((IlbcDecoder*)iLBCdec_inst)->blockl],
-        (const uint16_t*)&encoded
-            [2 * i * ((IlbcDecoder*)iLBCdec_inst)->no_of_words],
-        (IlbcDecoder*)iLBCdec_inst, 1))
-      return -1;
-    i++;
-  }
-  /* iLBC does not support VAD/CNG yet */
-  *speechType=1;
-  return (int)(i*((IlbcDecoder*)iLBCdec_inst)->blockl);
-}
-
-size_t WebRtcIlbcfix_DecodePlc(IlbcDecoderInstance* iLBCdec_inst,
-                               int16_t* decoded,
-                               size_t noOfLostFrames) {
-  size_t i;
-  uint16_t dummy;
-
-  for (i=0;i<noOfLostFrames;i++) {
-    // PLC decoding shouldn't fail, because there is no external input data
-    // that can be bad.
-    RTC_CHECK(WebRtcIlbcfix_DecodeImpl(
-        &decoded[i * ((IlbcDecoder*)iLBCdec_inst)->blockl], &dummy,
-        (IlbcDecoder*)iLBCdec_inst, 0));
-  }
-  return (noOfLostFrames*((IlbcDecoder*)iLBCdec_inst)->blockl);
-}
-
-size_t WebRtcIlbcfix_NetEqPlc(IlbcDecoderInstance* iLBCdec_inst,
-                              int16_t* decoded,
-                              size_t noOfLostFrames) {
-  /* Two input parameters not used, but needed for function pointers in NetEQ */
-  (void)(decoded = NULL);
-  (void)(noOfLostFrames = 0);
-
-  WebRtcSpl_MemSetW16(((IlbcDecoder*)iLBCdec_inst)->enh_buf, 0, ENH_BUFL);
-  ((IlbcDecoder*)iLBCdec_inst)->prev_enh_pl = 2;
-
-  return (0);
-}
-
-void WebRtcIlbcfix_version(char *version)
-{
-  strcpy((char*)version, "1.1.1");
-}
diff --git a/modules/audio_coding/codecs/ilbc/ilbc.h b/modules/audio_coding/codecs/ilbc/ilbc.h
deleted file mode 100644
index c021f5b..0000000
--- a/modules/audio_coding/codecs/ilbc/ilbc.h
+++ /dev/null
@@ -1,258 +0,0 @@
-/*
- *  Copyright (c) 2012 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.
- */
-
-/*
- * ilbc.h
- *
- * This header file contains all of the API's for iLBC.
- *
- */
-
-#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_ILBC_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_ILBC_H_
-
-#include <stddef.h>
-
-/*
- * Define the fixpoint numeric formats
- */
-
-#include "webrtc/typedefs.h"
-
-/*
- * Solution to support multiple instances
- * Customer has to cast instance to proper type
- */
-
-typedef struct iLBC_encinst_t_ IlbcEncoderInstance;
-
-typedef struct iLBC_decinst_t_ IlbcDecoderInstance;
-
-/*
- * Comfort noise constants
- */
-
-#define ILBC_SPEECH 1
-#define ILBC_CNG  2
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-  /****************************************************************************
-   * WebRtcIlbcfix_XxxAssign(...)
-   *
-   * These functions assigns the encoder/decoder instance to the specified
-   * memory location
-   *
-   * Input:
-   *     - XXX_xxxinst       : Pointer to created instance that should be
-   *                           assigned
-   *     - ILBCXXX_inst_Addr : Pointer to the desired memory space
-   *     - size              : The size that this structure occupies (in Word16)
-   *
-   * Return value             :  0 - Ok
-   *                            -1 - Error
-   */
-
-  int16_t WebRtcIlbcfix_EncoderAssign(IlbcEncoderInstance **iLBC_encinst,
-                                      int16_t *ILBCENC_inst_Addr,
-                                      int16_t *size);
-  int16_t WebRtcIlbcfix_DecoderAssign(IlbcDecoderInstance **iLBC_decinst,
-                                      int16_t *ILBCDEC_inst_Addr,
-                                      int16_t *size);
-
-
-  /****************************************************************************
-   * WebRtcIlbcfix_XxxAssign(...)
-   *
-   * These functions create a instance to the specified structure
-   *
-   * Input:
-   *      - XXX_inst        : Pointer to created instance that should be created
-   *
-   * Return value           :  0 - Ok
-   *                          -1 - Error
-   */
-
-  int16_t WebRtcIlbcfix_EncoderCreate(IlbcEncoderInstance **iLBC_encinst);
-  int16_t WebRtcIlbcfix_DecoderCreate(IlbcDecoderInstance **iLBC_decinst);
-
-  /****************************************************************************
-   * WebRtcIlbcfix_XxxFree(...)
-   *
-   * These functions frees the dynamic memory of a specified instance
-   *
-   * Input:
-   *      - XXX_inst          : Pointer to created instance that should be freed
-   *
-   * Return value             :  0 - Ok
-   *                            -1 - Error
-   */
-
-  int16_t WebRtcIlbcfix_EncoderFree(IlbcEncoderInstance *iLBC_encinst);
-  int16_t WebRtcIlbcfix_DecoderFree(IlbcDecoderInstance *iLBC_decinst);
-
-
-  /****************************************************************************
-   * WebRtcIlbcfix_EncoderInit(...)
-   *
-   * This function initializes a iLBC instance
-   *
-   * Input:
-   *      - iLBCenc_inst      : iLBC instance, i.e. the user that should receive
-   *                            be initialized
-   *      - frameLen          : The frame length of the codec 20/30 (ms)
-   *
-   * Return value             :  0 - Ok
-   *                            -1 - Error
-   */
-
-  int16_t WebRtcIlbcfix_EncoderInit(IlbcEncoderInstance *iLBCenc_inst,
-                                    int16_t frameLen);
-
-  /****************************************************************************
-   * WebRtcIlbcfix_Encode(...)
-   *
-   * This function encodes one iLBC frame. Input speech length has be a
-   * multiple of the frame length.
-   *
-   * Input:
-   *      - iLBCenc_inst      : iLBC instance, i.e. the user that should encode
-   *                            a package
-   *      - speechIn          : Input speech vector
-   *      - len               : Samples in speechIn (160, 240, 320 or 480)
-   *
-   * Output:
-   *  - encoded               : The encoded data vector
-   *
-   * Return value             : >0 - Length (in bytes) of coded data
-   *                            -1 - Error
-   */
-
-  int WebRtcIlbcfix_Encode(IlbcEncoderInstance *iLBCenc_inst,
-                           const int16_t *speechIn,
-                           size_t len,
-                           uint8_t* encoded);
-
-  /****************************************************************************
-   * WebRtcIlbcfix_DecoderInit(...)
-   *
-   * This function initializes a iLBC instance with either 20 or 30 ms frames
-   * Alternatively the WebRtcIlbcfix_DecoderInit_XXms can be used. Then it's
-   * not needed to specify the frame length with a variable.
-   *
-   * Input:
-   *      - IlbcDecoderInstance : iLBC decoder instance
-   *      - frameLen            : The frame length of the codec 20/30 (ms)
-   *
-   * Return value               :  0 - Ok
-   *                              -1 - Error
-   */
-
-  int16_t WebRtcIlbcfix_DecoderInit(IlbcDecoderInstance *iLBCdec_inst,
-                                    int16_t frameLen);
-  void WebRtcIlbcfix_DecoderInit20Ms(IlbcDecoderInstance* iLBCdec_inst);
-  void WebRtcIlbcfix_Decoderinit30Ms(IlbcDecoderInstance* iLBCdec_inst);
-
-  /****************************************************************************
-   * WebRtcIlbcfix_Decode(...)
-   *
-   * This function decodes a packet with iLBC frame(s). Output speech length
-   * will be a multiple of 160 or 240 samples ((160 or 240)*frames/packet).
-   *
-   * Input:
-   *      - iLBCdec_inst      : iLBC instance, i.e. the user that should decode
-   *                            a packet
-   *      - encoded           : Encoded iLBC frame(s)
-   *      - len               : Bytes in encoded vector
-   *
-   * Output:
-   *      - decoded           : The decoded vector
-   *      - speechType        : 1 normal, 2 CNG
-   *
-   * Return value             : >0 - Samples in decoded vector
-   *                            -1 - Error
-   */
-
-  int WebRtcIlbcfix_Decode(IlbcDecoderInstance* iLBCdec_inst,
-                           const uint8_t* encoded,
-                           size_t len,
-                           int16_t* decoded,
-                           int16_t* speechType);
-  int WebRtcIlbcfix_Decode20Ms(IlbcDecoderInstance* iLBCdec_inst,
-                               const uint8_t* encoded,
-                               size_t len,
-                               int16_t* decoded,
-                               int16_t* speechType);
-  int WebRtcIlbcfix_Decode30Ms(IlbcDecoderInstance* iLBCdec_inst,
-                               const uint8_t* encoded,
-                               size_t len,
-                               int16_t* decoded,
-                               int16_t* speechType);
-
-  /****************************************************************************
-   * WebRtcIlbcfix_DecodePlc(...)
-   *
-   * This function conducts PLC for iLBC frame(s). Output speech length
-   * will be a multiple of 160 or 240 samples.
-   *
-   * Input:
-   *      - iLBCdec_inst      : iLBC instance, i.e. the user that should perform
-   *                            a PLC
-   *      - noOfLostFrames    : Number of PLC frames to produce
-   *
-   * Output:
-   *      - decoded           : The "decoded" vector
-   *
-   * Return value             : Samples in decoded PLC vector
-   */
-
-  size_t WebRtcIlbcfix_DecodePlc(IlbcDecoderInstance *iLBCdec_inst,
-                                 int16_t *decoded,
-                                 size_t noOfLostFrames);
-
-  /****************************************************************************
-   * WebRtcIlbcfix_NetEqPlc(...)
-   *
-   * This function updates the decoder when a packet loss has occured, but it
-   * does not produce any PLC data. Function can be used if another PLC method
-   * is used (i.e NetEq).
-   *
-   * Input:
-   *      - iLBCdec_inst      : iLBC instance that should be updated
-   *      - noOfLostFrames    : Number of lost frames
-   *
-   * Output:
-   *      - decoded           : The "decoded" vector (nothing in this case)
-   *
-   * Return value             : Samples in decoded PLC vector
-   */
-
-  size_t WebRtcIlbcfix_NetEqPlc(IlbcDecoderInstance *iLBCdec_inst,
-                                int16_t *decoded,
-                                size_t noOfLostFrames);
-
-  /****************************************************************************
-   * WebRtcIlbcfix_version(...)
-   *
-   * This function returns the version number of iLBC
-   *
-   * Output:
-   *      - version           : Version number of iLBC (maximum 20 char)
-   */
-
-  void WebRtcIlbcfix_version(char *version);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif  // WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_ILBC_H_
diff --git a/modules/audio_coding/codecs/ilbc/ilbc_unittest.cc b/modules/audio_coding/codecs/ilbc/ilbc_unittest.cc
deleted file mode 100644
index 69e2181..0000000
--- a/modules/audio_coding/codecs/ilbc/ilbc_unittest.cc
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- *  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/codecs/ilbc/audio_decoder_ilbc.h"
-#include "webrtc/modules/audio_coding/codecs/ilbc/audio_encoder_ilbc.h"
-#include "webrtc/modules/audio_coding/codecs/legacy_encoded_audio_frame.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-TEST(IlbcTest, BadPacket) {
-  // Get a good packet.
-  AudioEncoderIlbcConfig config;
-  config.frame_size_ms = 20;  // We need 20 ms rather than the default 30 ms;
-                              // otherwise, all possible values of cb_index[2]
-                              // are valid.
-  AudioEncoderIlbcImpl encoder(config, 102);
-  std::vector<int16_t> samples(encoder.SampleRateHz() / 100, 4711);
-  rtc::Buffer packet;
-  int num_10ms_chunks = 0;
-  while (packet.size() == 0) {
-    encoder.Encode(0, samples, &packet);
-    num_10ms_chunks += 1;
-  }
-
-  // Break the packet by setting all bits of the unsigned 7-bit number
-  // cb_index[2] to 1, giving it a value of 127. For a 20 ms packet, this is
-  // too large.
-  EXPECT_EQ(38u, packet.size());
-  rtc::Buffer bad_packet(packet.data(), packet.size());
-  bad_packet[29] |= 0x3f;  // Bits 1-6.
-  bad_packet[30] |= 0x80;  // Bit 0.
-
-  // Decode the bad packet. We expect the decoder to respond by returning -1.
-  AudioDecoderIlbcImpl decoder;
-  std::vector<int16_t> decoded_samples(num_10ms_chunks * samples.size());
-  AudioDecoder::SpeechType speech_type;
-  EXPECT_EQ(-1, decoder.Decode(bad_packet.data(), bad_packet.size(),
-                               encoder.SampleRateHz(),
-                               sizeof(int16_t) * decoded_samples.size(),
-                               decoded_samples.data(), &speech_type));
-
-  // Decode the good packet. This should work, because the failed decoding
-  // should not have left the decoder in a broken state.
-  EXPECT_EQ(static_cast<int>(decoded_samples.size()),
-            decoder.Decode(packet.data(), packet.size(), encoder.SampleRateHz(),
-                           sizeof(int16_t) * decoded_samples.size(),
-                           decoded_samples.data(), &speech_type));
-}
-
-class SplitIlbcTest : public ::testing::TestWithParam<std::pair<int, int> > {
- protected:
-  virtual void SetUp() {
-    const std::pair<int, int> parameters = GetParam();
-    num_frames_ = parameters.first;
-    frame_length_ms_ = parameters.second;
-    frame_length_bytes_ = (frame_length_ms_ == 20) ? 38 : 50;
-  }
-  size_t num_frames_;
-  int frame_length_ms_;
-  size_t frame_length_bytes_;
-};
-
-TEST_P(SplitIlbcTest, NumFrames) {
-  AudioDecoderIlbcImpl decoder;
-  const size_t frame_length_samples = frame_length_ms_ * 8;
-  const auto generate_payload = [] (size_t payload_length_bytes) {
-    rtc::Buffer payload(payload_length_bytes);
-    // Fill payload with increasing integers {0, 1, 2, ...}.
-    for (size_t i = 0; i < payload.size(); ++i) {
-      payload[i] = static_cast<uint8_t>(i);
-    }
-    return payload;
-  };
-
-  const auto results = decoder.ParsePayload(
-      generate_payload(frame_length_bytes_ * num_frames_), 0);
-  EXPECT_EQ(num_frames_, results.size());
-
-  size_t frame_num = 0;
-  uint8_t payload_value = 0;
-  for (const auto& result : results) {
-    EXPECT_EQ(frame_length_samples * frame_num, result.timestamp);
-    const LegacyEncodedAudioFrame* frame =
-        static_cast<const LegacyEncodedAudioFrame*>(result.frame.get());
-    const rtc::Buffer& payload = frame->payload();
-    EXPECT_EQ(frame_length_bytes_, payload.size());
-    for (size_t i = 0; i < payload.size(); ++i, ++payload_value) {
-      EXPECT_EQ(payload_value, payload[i]);
-    }
-    ++frame_num;
-  }
-}
-
-// Test 1 through 5 frames of 20 and 30 ms size.
-// Also test the maximum number of frames in one packet for 20 and 30 ms.
-// The maximum is defined by the largest payload length that can be uniquely
-// resolved to a frame size of either 38 bytes (20 ms) or 50 bytes (30 ms).
-INSTANTIATE_TEST_CASE_P(
-    IlbcTest, SplitIlbcTest,
-    ::testing::Values(std::pair<int, int>(1, 20),  // 1 frame, 20 ms.
-                      std::pair<int, int>(2, 20),  // 2 frames, 20 ms.
-                      std::pair<int, int>(3, 20),  // And so on.
-                      std::pair<int, int>(4, 20),
-                      std::pair<int, int>(5, 20),
-                      std::pair<int, int>(24, 20),
-                      std::pair<int, int>(1, 30),
-                      std::pair<int, int>(2, 30),
-                      std::pair<int, int>(3, 30),
-                      std::pair<int, int>(4, 30),
-                      std::pair<int, int>(5, 30),
-                      std::pair<int, int>(18, 30)));
-
-// Test too large payload size.
-TEST(IlbcTest, SplitTooLargePayload) {
-  AudioDecoderIlbcImpl decoder;
-  constexpr size_t kPayloadLengthBytes = 950;
-  const auto results =
-      decoder.ParsePayload(rtc::Buffer(kPayloadLengthBytes), 0);
-  EXPECT_TRUE(results.empty());
-}
-
-// Payload not an integer number of frames.
-TEST(IlbcTest, SplitUnevenPayload) {
-  AudioDecoderIlbcImpl decoder;
-  constexpr size_t kPayloadLengthBytes = 39;  // Not an even number of frames.
-  const auto results =
-      decoder.ParsePayload(rtc::Buffer(kPayloadLengthBytes), 0);
-  EXPECT_TRUE(results.empty());
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/codecs/ilbc/index_conv_dec.c b/modules/audio_coding/codecs/ilbc/index_conv_dec.c
deleted file mode 100644
index 033a0a3..0000000
--- a/modules/audio_coding/codecs/ilbc/index_conv_dec.c
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_IndexConvDec.c
-
-******************************************************************/
-
-#include "defines.h"
-
-void WebRtcIlbcfix_IndexConvDec(
-    int16_t *index   /* (i/o) Codebook indexes */
-                                ){
-  int k;
-
-  for (k=4;k<6;k++) {
-    /* Readjust the second and third codebook index for the first 40 sample
-       so that they look the same as the first (in terms of lag)
-    */
-    if ((index[k]>=44)&&(index[k]<108)) {
-      index[k]+=64;
-    } else if ((index[k]>=108)&&(index[k]<128)) {
-      index[k]+=128;
-    } else {
-      /* ERROR */
-    }
-  }
-}
diff --git a/modules/audio_coding/codecs/ilbc/index_conv_dec.h b/modules/audio_coding/codecs/ilbc/index_conv_dec.h
deleted file mode 100644
index 354c5b8..0000000
--- a/modules/audio_coding/codecs/ilbc/index_conv_dec.h
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_IndexConvDec.h
-
-******************************************************************/
-
-#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_INDEX_CONV_DEC_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_INDEX_CONV_DEC_H_
-
-#include "defines.h"
-
-void WebRtcIlbcfix_IndexConvDec(
-    int16_t *index   /* (i/o) Codebook indexes */
-                                );
-
-#endif
diff --git a/modules/audio_coding/codecs/ilbc/index_conv_enc.c b/modules/audio_coding/codecs/ilbc/index_conv_enc.c
deleted file mode 100644
index 0e7701b..0000000
--- a/modules/audio_coding/codecs/ilbc/index_conv_enc.c
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- IiLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_IndexConvEnc.c
-
-******************************************************************/
-
-#include "defines.h"
-/*----------------------------------------------------------------*
- *  Convert the codebook indexes to make the search easier
- *---------------------------------------------------------------*/
-
-void WebRtcIlbcfix_IndexConvEnc(
-    int16_t *index   /* (i/o) Codebook indexes */
-                                ){
-  int k;
-
-  for (k=4;k<6;k++) {
-    /* Readjust the second and third codebook index so that it is
-       packetized into 7 bits (before it was put in lag-wise the same
-       way as for the first codebook which uses 8 bits)
-    */
-    if ((index[k]>=108)&&(index[k]<172)) {
-      index[k]-=64;
-    } else if (index[k]>=236) {
-      index[k]-=128;
-    } else {
-      /* ERROR */
-    }
-  }
-}
diff --git a/modules/audio_coding/codecs/ilbc/index_conv_enc.h b/modules/audio_coding/codecs/ilbc/index_conv_enc.h
deleted file mode 100644
index d686331..0000000
--- a/modules/audio_coding/codecs/ilbc/index_conv_enc.h
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_IndexConvEnc.h
-
-******************************************************************/
-
-#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_INDEX_CONV_ENC_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_INDEX_CONV_ENC_H_
-
-#include "defines.h"
-
-/*----------------------------------------------------------------*
- *  Convert the codebook indexes to make the search easier
- *---------------------------------------------------------------*/
-
-void WebRtcIlbcfix_IndexConvEnc(
-    int16_t *index   /* (i/o) Codebook indexes */
-                                );
-
-#endif
diff --git a/modules/audio_coding/codecs/ilbc/init_decode.c b/modules/audio_coding/codecs/ilbc/init_decode.c
deleted file mode 100644
index 1f92480..0000000
--- a/modules/audio_coding/codecs/ilbc/init_decode.c
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
-	iLBC Speech Coder ANSI-C Source Code
-
-	WebRtcIlbcfix_InitDecode.c
-
-******************************************************************/
-
-#include "defines.h"
-#include "constants.h"
-
-/*----------------------------------------------------------------*
- *  Initiation of decoder instance.
- *---------------------------------------------------------------*/
-
-int WebRtcIlbcfix_InitDecode(  /* (o) Number of decoded samples */
-    IlbcDecoder *iLBCdec_inst,  /* (i/o) Decoder instance */
-    int16_t mode,  /* (i) frame size mode */
-    int use_enhancer) {  /* (i) 1: use enhancer, 0: no enhancer */
-  int i;
-
-  iLBCdec_inst->mode = mode;
-
-  /* Set all the variables that are dependent on the frame size mode */
-  if (mode==30) {
-    iLBCdec_inst->blockl = BLOCKL_30MS;
-    iLBCdec_inst->nsub = NSUB_30MS;
-    iLBCdec_inst->nasub = NASUB_30MS;
-    iLBCdec_inst->lpc_n = LPC_N_30MS;
-    iLBCdec_inst->no_of_bytes = NO_OF_BYTES_30MS;
-    iLBCdec_inst->no_of_words = NO_OF_WORDS_30MS;
-    iLBCdec_inst->state_short_len=STATE_SHORT_LEN_30MS;
-  }
-  else if (mode==20) {
-    iLBCdec_inst->blockl = BLOCKL_20MS;
-    iLBCdec_inst->nsub = NSUB_20MS;
-    iLBCdec_inst->nasub = NASUB_20MS;
-    iLBCdec_inst->lpc_n = LPC_N_20MS;
-    iLBCdec_inst->no_of_bytes = NO_OF_BYTES_20MS;
-    iLBCdec_inst->no_of_words = NO_OF_WORDS_20MS;
-    iLBCdec_inst->state_short_len=STATE_SHORT_LEN_20MS;
-  }
-  else {
-    return(-1);
-  }
-
-  /* Reset all the previous LSF to mean LSF */
-  WEBRTC_SPL_MEMCPY_W16(iLBCdec_inst->lsfdeqold, WebRtcIlbcfix_kLsfMean, LPC_FILTERORDER);
-
-  /* Clear the synthesis filter memory */
-  WebRtcSpl_MemSetW16(iLBCdec_inst->syntMem, 0, LPC_FILTERORDER);
-
-  /* Set the old synthesis filter to {1.0 0.0 ... 0.0} */
-  WebRtcSpl_MemSetW16(iLBCdec_inst->old_syntdenum, 0, ((LPC_FILTERORDER + 1)*NSUB_MAX));
-  for (i=0; i<NSUB_MAX; i++) {
-    iLBCdec_inst->old_syntdenum[i*(LPC_FILTERORDER+1)] = 4096;
-  }
-
-  /* Clear the variables that are used for the PLC */
-  iLBCdec_inst->last_lag = 20;
-  iLBCdec_inst->consPLICount = 0;
-  iLBCdec_inst->prevPLI = 0;
-  iLBCdec_inst->perSquare = 0;
-  iLBCdec_inst->prevLag = 120;
-  iLBCdec_inst->prevLpc[0] = 4096;
-  WebRtcSpl_MemSetW16(iLBCdec_inst->prevLpc+1, 0, LPC_FILTERORDER);
-  WebRtcSpl_MemSetW16(iLBCdec_inst->prevResidual, 0, BLOCKL_MAX);
-
-  /* Initialize the seed for the random number generator */
-  iLBCdec_inst->seed = 777;
-
-  /* Set the filter state of the HP filter to 0 */
-  WebRtcSpl_MemSetW16(iLBCdec_inst->hpimemx, 0, 2);
-  WebRtcSpl_MemSetW16(iLBCdec_inst->hpimemy, 0, 4);
-
-  /* Set the variables that are used in the ehnahcer */
-  iLBCdec_inst->use_enhancer = use_enhancer;
-  WebRtcSpl_MemSetW16(iLBCdec_inst->enh_buf, 0, (ENH_BUFL+ENH_BUFL_FILTEROVERHEAD));
-  for (i=0;i<ENH_NBLOCKS_TOT;i++) {
-    iLBCdec_inst->enh_period[i]=160; /* Q(-4) */
-  }
-
-  iLBCdec_inst->prev_enh_pl = 0;
-
-  return (int)(iLBCdec_inst->blockl);
-}
diff --git a/modules/audio_coding/codecs/ilbc/init_decode.h b/modules/audio_coding/codecs/ilbc/init_decode.h
deleted file mode 100644
index cdd2192..0000000
--- a/modules/audio_coding/codecs/ilbc/init_decode.h
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_InitDecode.h
-
-******************************************************************/
-
-#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_INIT_DECODE_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_INIT_DECODE_H_
-
-#include "defines.h"
-
-/*----------------------------------------------------------------*
- *  Initiation of decoder instance.
- *---------------------------------------------------------------*/
-
-int WebRtcIlbcfix_InitDecode(  /* (o) Number of decoded samples */
-    IlbcDecoder *iLBCdec_inst, /* (i/o) Decoder instance */
-    int16_t mode,     /* (i) frame size mode */
-    int use_enhancer           /* (i) 1 to use enhancer
-                                  0 to run without enhancer */
-                                         );
-
-#endif
diff --git a/modules/audio_coding/codecs/ilbc/init_encode.c b/modules/audio_coding/codecs/ilbc/init_encode.c
deleted file mode 100644
index f559d84..0000000
--- a/modules/audio_coding/codecs/ilbc/init_encode.c
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_InitEncode.c
-
-******************************************************************/
-
-#include "defines.h"
-#include "constants.h"
-
-/*----------------------------------------------------------------*
- *  Initiation of encoder instance.
- *---------------------------------------------------------------*/
-
-int WebRtcIlbcfix_InitEncode(  /* (o) Number of bytes encoded */
-    IlbcEncoder *iLBCenc_inst,  /* (i/o) Encoder instance */
-    int16_t mode) {  /* (i) frame size mode */
-  iLBCenc_inst->mode = mode;
-
-  /* Set all the variables that are dependent on the frame size mode */
-  if (mode==30) {
-    iLBCenc_inst->blockl = BLOCKL_30MS;
-    iLBCenc_inst->nsub = NSUB_30MS;
-    iLBCenc_inst->nasub = NASUB_30MS;
-    iLBCenc_inst->lpc_n = LPC_N_30MS;
-    iLBCenc_inst->no_of_bytes = NO_OF_BYTES_30MS;
-    iLBCenc_inst->no_of_words = NO_OF_WORDS_30MS;
-    iLBCenc_inst->state_short_len=STATE_SHORT_LEN_30MS;
-  }
-  else if (mode==20) {
-    iLBCenc_inst->blockl = BLOCKL_20MS;
-    iLBCenc_inst->nsub = NSUB_20MS;
-    iLBCenc_inst->nasub = NASUB_20MS;
-    iLBCenc_inst->lpc_n = LPC_N_20MS;
-    iLBCenc_inst->no_of_bytes = NO_OF_BYTES_20MS;
-    iLBCenc_inst->no_of_words = NO_OF_WORDS_20MS;
-    iLBCenc_inst->state_short_len=STATE_SHORT_LEN_20MS;
-  }
-  else {
-    return(-1);
-  }
-
-  /* Clear the buffers and set the previous LSF and LSP to the mean value */
-  WebRtcSpl_MemSetW16(iLBCenc_inst->anaMem, 0, LPC_FILTERORDER);
-  WEBRTC_SPL_MEMCPY_W16(iLBCenc_inst->lsfold, WebRtcIlbcfix_kLsfMean, LPC_FILTERORDER);
-  WEBRTC_SPL_MEMCPY_W16(iLBCenc_inst->lsfdeqold, WebRtcIlbcfix_kLsfMean, LPC_FILTERORDER);
-  WebRtcSpl_MemSetW16(iLBCenc_inst->lpc_buffer, 0, LPC_LOOKBACK + BLOCKL_MAX);
-
-  /* Set the filter state of the HP filter to 0 */
-  WebRtcSpl_MemSetW16(iLBCenc_inst->hpimemx, 0, 2);
-  WebRtcSpl_MemSetW16(iLBCenc_inst->hpimemy, 0, 4);
-
-#ifdef SPLIT_10MS
-  /*Zeroing the past samples for 10msec Split*/
-  WebRtcSpl_MemSetW16(iLBCenc_inst->past_samples,0,160);
-  iLBCenc_inst->section = 0;
-#endif
-
-  return (int)(iLBCenc_inst->no_of_bytes);
-}
diff --git a/modules/audio_coding/codecs/ilbc/init_encode.h b/modules/audio_coding/codecs/ilbc/init_encode.h
deleted file mode 100644
index 7154661..0000000
--- a/modules/audio_coding/codecs/ilbc/init_encode.h
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_InitEncode.h
-
-******************************************************************/
-
-#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_INIT_ENCODE_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_INIT_ENCODE_H_
-
-#include "defines.h"
-
-/*----------------------------------------------------------------*
- *  Initiation of encoder instance.
- *---------------------------------------------------------------*/
-
-int WebRtcIlbcfix_InitEncode(  /* (o) Number of bytes encoded */
-    IlbcEncoder *iLBCenc_inst, /* (i/o) Encoder instance */
-    int16_t mode     /* (i) frame size mode */
-                                         );
-
-#endif
diff --git a/modules/audio_coding/codecs/ilbc/interpolate.c b/modules/audio_coding/codecs/ilbc/interpolate.c
deleted file mode 100644
index d0869a5..0000000
--- a/modules/audio_coding/codecs/ilbc/interpolate.c
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_Interpolate.c
-
-******************************************************************/
-
-#include "defines.h"
-#include "constants.h"
-
-/*----------------------------------------------------------------*
- *  interpolation between vectors
- *---------------------------------------------------------------*/
-
-void WebRtcIlbcfix_Interpolate(
-    int16_t *out, /* (o) output vector */
-    int16_t *in1, /* (i) first input vector */
-    int16_t *in2, /* (i) second input vector */
-    int16_t coef, /* (i) weight coefficient in Q14 */
-    int16_t length)  /* (i) number of sample is vectors */
-{
-  int i;
-  int16_t invcoef;
-
-  /*
-    Performs the operation out[i] = in[i]*coef + (1-coef)*in2[i] (with rounding)
-  */
-
-  invcoef = 16384 - coef; /* 16384 = 1.0 (Q14)*/
-  for (i = 0; i < length; i++) {
-    out[i] = (int16_t)((coef * in1[i] + invcoef * in2[i] + 8192) >> 14);
-  }
-
-  return;
-}
diff --git a/modules/audio_coding/codecs/ilbc/interpolate.h b/modules/audio_coding/codecs/ilbc/interpolate.h
deleted file mode 100644
index 0483232..0000000
--- a/modules/audio_coding/codecs/ilbc/interpolate.h
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_Interpolate.h
-
-******************************************************************/
-
-#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_INTERPOLATE_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_INTERPOLATE_H_
-
-#include "defines.h"
-
-/*----------------------------------------------------------------*
- *  interpolation between vectors
- *---------------------------------------------------------------*/
-
-void WebRtcIlbcfix_Interpolate(
-    int16_t *out, /* (o) output vector */
-    int16_t *in1, /* (i) first input vector */
-    int16_t *in2, /* (i) second input vector */
-    int16_t coef, /* (i) weight coefficient in Q14 */
-    int16_t length); /* (i) number of sample is vectors */
-
-#endif
diff --git a/modules/audio_coding/codecs/ilbc/interpolate_samples.c b/modules/audio_coding/codecs/ilbc/interpolate_samples.c
deleted file mode 100644
index 376dbbb..0000000
--- a/modules/audio_coding/codecs/ilbc/interpolate_samples.c
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_InterpolateSamples.c
-
-******************************************************************/
-
-#include "defines.h"
-#include "constants.h"
-
-void WebRtcIlbcfix_InterpolateSamples(
-    int16_t *interpSamples, /* (o) The interpolated samples */
-    int16_t *CBmem,   /* (i) The CB memory */
-    size_t lMem    /* (i) Length of the CB memory */
-                                      ) {
-  int16_t *ppi, *ppo, i, j, temp1, temp2;
-  int16_t *tmpPtr;
-
-  /* Calculate the 20 vectors of interpolated samples (4 samples each)
-     that are used in the codebooks for lag 20 to 39 */
-  tmpPtr = interpSamples;
-  for (j=0; j<20; j++) {
-    temp1 = 0;
-    temp2 = 3;
-    ppo = CBmem+lMem-4;
-    ppi = CBmem+lMem-j-24;
-    for (i=0; i<4; i++) {
-
-      *tmpPtr++ = (int16_t)((WebRtcIlbcfix_kAlpha[temp2] * *ppo) >> 15) +
-          (int16_t)((WebRtcIlbcfix_kAlpha[temp1] * *ppi) >> 15);
-
-      ppo++;
-      ppi++;
-      temp1++;
-      temp2--;
-    }
-  }
-
-  return;
-}
diff --git a/modules/audio_coding/codecs/ilbc/interpolate_samples.h b/modules/audio_coding/codecs/ilbc/interpolate_samples.h
deleted file mode 100644
index 7549d2c..0000000
--- a/modules/audio_coding/codecs/ilbc/interpolate_samples.h
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_InterpolateSamples.h
-
-******************************************************************/
-
-#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_INTERPOLATE_SAMPLES_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_INTERPOLATE_SAMPLES_H_
-
-#include "defines.h"
-
-/*----------------------------------------------------------------*
- *  Construct the interpolated samples for the Augmented CB
- *---------------------------------------------------------------*/
-
-void WebRtcIlbcfix_InterpolateSamples(
-    int16_t *interpSamples, /* (o) The interpolated samples */
-    int16_t *CBmem,   /* (i) The CB memory */
-    size_t lMem    /* (i) Length of the CB memory */
-                                      );
-
-#endif
diff --git a/modules/audio_coding/codecs/ilbc/lpc_encode.c b/modules/audio_coding/codecs/ilbc/lpc_encode.c
deleted file mode 100644
index 258b6b1..0000000
--- a/modules/audio_coding/codecs/ilbc/lpc_encode.c
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_LpcEncode.c
-
-******************************************************************/
-
-#include "defines.h"
-#include "simple_lpc_analysis.h"
-#include "simple_interpolate_lsf.h"
-#include "simple_lsf_quant.h"
-#include "lsf_check.h"
-#include "constants.h"
-
-/*----------------------------------------------------------------*
- *  lpc encoder
- *---------------------------------------------------------------*/
-
-void WebRtcIlbcfix_LpcEncode(
-    int16_t *syntdenum,  /* (i/o) synthesis filter coefficients
-                                           before/after encoding */
-    int16_t *weightdenum, /* (i/o) weighting denumerator coefficients
-                                   before/after encoding */
-    int16_t *lsf_index,  /* (o) lsf quantization index */
-    int16_t *data,   /* (i) Speech to do LPC analysis on */
-    IlbcEncoder *iLBCenc_inst
-    /* (i/o) the encoder state structure */
-                              ) {
-  /* Stack based */
-  int16_t lsf[LPC_FILTERORDER * LPC_N_MAX];
-  int16_t lsfdeq[LPC_FILTERORDER * LPC_N_MAX];
-
-  /* Calculate LSF's from the input speech */
-  WebRtcIlbcfix_SimpleLpcAnalysis(lsf, data, iLBCenc_inst);
-
-  /* Quantize the LSF's */
-  WebRtcIlbcfix_SimpleLsfQ(lsfdeq, lsf_index, lsf, iLBCenc_inst->lpc_n);
-
-  /* Stableize the LSF's if needed */
-  WebRtcIlbcfix_LsfCheck(lsfdeq, LPC_FILTERORDER, iLBCenc_inst->lpc_n);
-
-  /* Calculate the synthesis and weighting filter coefficients from
-     the optimal LSF and the dequantized LSF */
-  WebRtcIlbcfix_SimpleInterpolateLsf(syntdenum, weightdenum,
-                                     lsf, lsfdeq, iLBCenc_inst->lsfold,
-                                     iLBCenc_inst->lsfdeqold, LPC_FILTERORDER, iLBCenc_inst);
-
-  return;
-}
diff --git a/modules/audio_coding/codecs/ilbc/lpc_encode.h b/modules/audio_coding/codecs/ilbc/lpc_encode.h
deleted file mode 100644
index 9f6f504..0000000
--- a/modules/audio_coding/codecs/ilbc/lpc_encode.h
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_LpcEncode.h
-
-******************************************************************/
-
-#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_LPC_ENCODE_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_LPC_ENCODE_H_
-
-#include "defines.h"
-
-/*----------------------------------------------------------------*
- *  lpc encoder
- *---------------------------------------------------------------*/
-
-void WebRtcIlbcfix_LpcEncode(
-    int16_t *syntdenum,  /* (i/o) synthesis filter coefficients
-                                  before/after encoding */
-    int16_t *weightdenum, /* (i/o) weighting denumerator coefficients
-                                   before/after encoding */
-    int16_t *lsf_index,  /* (o) lsf quantization index */
-    int16_t *data,   /* (i) Speech to do LPC analysis on */
-    IlbcEncoder *iLBCenc_inst
-    /* (i/o) the encoder state structure */
-                             );
-
-#endif
diff --git a/modules/audio_coding/codecs/ilbc/lsf_check.c b/modules/audio_coding/codecs/ilbc/lsf_check.c
deleted file mode 100644
index 0e3bd84..0000000
--- a/modules/audio_coding/codecs/ilbc/lsf_check.c
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_LsfCheck.c
-
-******************************************************************/
-
-#include "defines.h"
-#include "constants.h"
-
-/*----------------------------------------------------------------*
- *  check for stability of lsf coefficients
- *---------------------------------------------------------------*/
-
-int WebRtcIlbcfix_LsfCheck(
-    int16_t *lsf, /* LSF parameters */
-    int dim, /* dimension of LSF */
-    int NoAn)  /* No of analysis per frame */
-{
-  int k,n,m, Nit=2, change=0,pos;
-  const int16_t eps=319;  /* 0.039 in Q13 (50 Hz)*/
-  const int16_t eps2=160;  /* eps/2.0 in Q13;*/
-  const int16_t maxlsf=25723; /* 3.14; (4000 Hz)*/
-  const int16_t minlsf=82;  /* 0.01; (0 Hz)*/
-
-  /* LSF separation check*/
-  for (n=0;n<Nit;n++) {  /* Run through a 2 times */
-    for (m=0;m<NoAn;m++) { /* Number of analyses per frame */
-      for (k=0;k<(dim-1);k++) {
-        pos=m*dim+k;
-
-        /* Seperate coefficients with a safety margin of 50 Hz */
-        if ((lsf[pos+1]-lsf[pos])<eps) {
-
-          if (lsf[pos+1]<lsf[pos]) {
-            lsf[pos+1]= lsf[pos]+eps2;
-            lsf[pos]= lsf[pos+1]-eps2;
-          } else {
-            lsf[pos]-=eps2;
-            lsf[pos+1]+=eps2;
-          }
-          change=1;
-        }
-
-        /* Limit minimum and maximum LSF */
-        if (lsf[pos]<minlsf) {
-          lsf[pos]=minlsf;
-          change=1;
-        }
-
-        if (lsf[pos]>maxlsf) {
-          lsf[pos]=maxlsf;
-          change=1;
-        }
-      }
-    }
-  }
-
-  return change;
-}
diff --git a/modules/audio_coding/codecs/ilbc/lsf_check.h b/modules/audio_coding/codecs/ilbc/lsf_check.h
deleted file mode 100644
index 2f4ac8c..0000000
--- a/modules/audio_coding/codecs/ilbc/lsf_check.h
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_LsfCheck.h
-
-******************************************************************/
-
-#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_LSF_CHECK_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_LSF_CHECK_H_
-
-#include "defines.h"
-
-/*----------------------------------------------------------------*
- *  check for stability of lsf coefficients
- *---------------------------------------------------------------*/
-
-int WebRtcIlbcfix_LsfCheck(
-    int16_t *lsf, /* LSF parameters */
-    int dim, /* dimension of LSF */
-    int NoAn); /* No of analysis per frame */
-
-#endif
diff --git a/modules/audio_coding/codecs/ilbc/lsf_interpolate_to_poly_dec.c b/modules/audio_coding/codecs/ilbc/lsf_interpolate_to_poly_dec.c
deleted file mode 100644
index 66bbde8..0000000
--- a/modules/audio_coding/codecs/ilbc/lsf_interpolate_to_poly_dec.c
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_LspInterpolate2PolyDec.c
-
-******************************************************************/
-
-#include "interpolate.h"
-#include "lsf_to_poly.h"
-#include "defines.h"
-
-/*----------------------------------------------------------------*
- *  interpolation of lsf coefficients for the decoder
- *---------------------------------------------------------------*/
-
-void WebRtcIlbcfix_LspInterpolate2PolyDec(
-    int16_t *a,   /* (o) lpc coefficients Q12 */
-    int16_t *lsf1,  /* (i) first set of lsf coefficients Q13 */
-    int16_t *lsf2,  /* (i) second set of lsf coefficients Q13 */
-    int16_t coef,  /* (i) weighting coefficient to use between
-                                   lsf1 and lsf2 Q14 */
-    int16_t length  /* (i) length of coefficient vectors */
-                                          ){
-  int16_t lsftmp[LPC_FILTERORDER];
-
-  /* interpolate LSF */
-  WebRtcIlbcfix_Interpolate(lsftmp, lsf1, lsf2, coef, length);
-
-  /* Compute the filter coefficients from the LSF */
-  WebRtcIlbcfix_Lsf2Poly(a, lsftmp);
-}
diff --git a/modules/audio_coding/codecs/ilbc/lsf_interpolate_to_poly_dec.h b/modules/audio_coding/codecs/ilbc/lsf_interpolate_to_poly_dec.h
deleted file mode 100644
index 3540c1c..0000000
--- a/modules/audio_coding/codecs/ilbc/lsf_interpolate_to_poly_dec.h
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_LspInterpolate2PolyDec.h
-
-******************************************************************/
-
-#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_LSF_INTERPOLATE_TO_POLY_DEC_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_LSF_INTERPOLATE_TO_POLY_DEC_H_
-
-#include "defines.h"
-
-/*----------------------------------------------------------------*
- *  interpolation of lsf coefficients for the decoder
- *---------------------------------------------------------------*/
-
-void WebRtcIlbcfix_LspInterpolate2PolyDec(
-    int16_t *a,   /* (o) lpc coefficients Q12 */
-    int16_t *lsf1,  /* (i) first set of lsf coefficients Q13 */
-    int16_t *lsf2,  /* (i) second set of lsf coefficients Q13 */
-    int16_t coef,  /* (i) weighting coefficient to use between
-                                   lsf1 and lsf2 Q14 */
-    int16_t length  /* (i) length of coefficient vectors */
-                                          );
-
-#endif
diff --git a/modules/audio_coding/codecs/ilbc/lsf_interpolate_to_poly_enc.c b/modules/audio_coding/codecs/ilbc/lsf_interpolate_to_poly_enc.c
deleted file mode 100644
index cf67ecc..0000000
--- a/modules/audio_coding/codecs/ilbc/lsf_interpolate_to_poly_enc.c
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_LsfInterpolate2PloyEnc.c
-
-******************************************************************/
-
-#include "defines.h"
-#include "interpolate.h"
-#include "lsf_to_poly.h"
-
-/*----------------------------------------------------------------*
- *  lsf interpolator and conversion from lsf to a coefficients
- *  (subrutine to SimpleInterpolateLSF)
- *---------------------------------------------------------------*/
-
-void WebRtcIlbcfix_LsfInterpolate2PloyEnc(
-    int16_t *a,  /* (o) lpc coefficients Q12 */
-    int16_t *lsf1, /* (i) first set of lsf coefficients Q13 */
-    int16_t *lsf2, /* (i) second set of lsf coefficients Q13 */
-    int16_t coef, /* (i) weighting coefficient to use between
-                           lsf1 and lsf2 Q14 */
-    int16_t length /* (i) length of coefficient vectors */
-                                          ) {
-  /* Stack based */
-  int16_t lsftmp[LPC_FILTERORDER];
-
-  /* interpolate LSF */
-  WebRtcIlbcfix_Interpolate(lsftmp, lsf1, lsf2, coef, length);
-
-  /* Compute the filter coefficients from the LSF */
-  WebRtcIlbcfix_Lsf2Poly(a, lsftmp);
-
-  return;
-}
diff --git a/modules/audio_coding/codecs/ilbc/lsf_interpolate_to_poly_enc.h b/modules/audio_coding/codecs/ilbc/lsf_interpolate_to_poly_enc.h
deleted file mode 100644
index 799c100..0000000
--- a/modules/audio_coding/codecs/ilbc/lsf_interpolate_to_poly_enc.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_LsfInterpolate2PloyEnc.h
-
-******************************************************************/
-
-#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_LSF_INTERPOLATE_TO_POLY_ENC_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_LSF_INTERPOLATE_TO_POLY_ENC_H_
-
-#include "defines.h"
-
-/*----------------------------------------------------------------*
- *  lsf interpolator and conversion from lsf to a coefficients
- *  (subrutine to SimpleInterpolateLSF)
- *---------------------------------------------------------------*/
-
-void WebRtcIlbcfix_LsfInterpolate2PloyEnc(
-    int16_t *a,  /* (o) lpc coefficients Q12 */
-    int16_t *lsf1, /* (i) first set of lsf coefficients Q13 */
-    int16_t *lsf2, /* (i) second set of lsf coefficients Q13 */
-    int16_t coef, /* (i) weighting coefficient to use between
-                           lsf1 and lsf2 Q14 */
-    int16_t length /* (i) length of coefficient vectors */
-                                          );
-
-#endif
diff --git a/modules/audio_coding/codecs/ilbc/lsf_to_lsp.c b/modules/audio_coding/codecs/ilbc/lsf_to_lsp.c
deleted file mode 100644
index cfab013..0000000
--- a/modules/audio_coding/codecs/ilbc/lsf_to_lsp.c
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_Lsf2Lsp.c
-
-******************************************************************/
-
-#include "defines.h"
-#include "constants.h"
-
-/*----------------------------------------------------------------*
- *  conversion from lsf to lsp coefficients
- *---------------------------------------------------------------*/
-
-void WebRtcIlbcfix_Lsf2Lsp(
-    int16_t *lsf, /* (i) lsf in Q13 values between 0 and pi */
-    int16_t *lsp, /* (o) lsp in Q15 values between -1 and 1 */
-    int16_t m  /* (i) number of coefficients */
-                           ) {
-  int16_t i, k;
-  int16_t diff; /* difference, which is used for the
-                           linear approximation (Q8) */
-  int16_t freq; /* normalized frequency in Q15 (0..1) */
-  int32_t tmpW32;
-
-  for(i=0; i<m; i++)
-  {
-    freq = (int16_t)((lsf[i] * 20861) >> 15);
-    /* 20861: 1.0/(2.0*PI) in Q17 */
-    /*
-       Upper 8 bits give the index k and
-       Lower 8 bits give the difference, which needs
-       to be approximated linearly
-    */
-    k = freq >> 8;
-    diff = (freq&0x00ff);
-
-    /* Guard against getting outside table */
-
-    if (k>63) {
-      k = 63;
-    }
-
-    /* Calculate linear approximation */
-    tmpW32 = WebRtcIlbcfix_kCosDerivative[k] * diff;
-    lsp[i] = WebRtcIlbcfix_kCos[k] + (int16_t)(tmpW32 >> 12);
-  }
-
-  return;
-}
diff --git a/modules/audio_coding/codecs/ilbc/lsf_to_lsp.h b/modules/audio_coding/codecs/ilbc/lsf_to_lsp.h
deleted file mode 100644
index b2104d7..0000000
--- a/modules/audio_coding/codecs/ilbc/lsf_to_lsp.h
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_Lsf2Lsp.h
-
-******************************************************************/
-
-#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_LSF_TO_LSP_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_LSF_TO_LSP_H_
-
-#include "defines.h"
-
-/*----------------------------------------------------------------*
- *  conversion from lsf to lsp coefficients
- *---------------------------------------------------------------*/
-
-void WebRtcIlbcfix_Lsf2Lsp(
-    int16_t *lsf, /* (i) lsf in Q13 values between 0 and pi */
-    int16_t *lsp, /* (o) lsp in Q15 values between -1 and 1 */
-    int16_t m     /* (i) number of coefficients */
-                           );
-
-#endif
diff --git a/modules/audio_coding/codecs/ilbc/lsf_to_poly.c b/modules/audio_coding/codecs/ilbc/lsf_to_poly.c
deleted file mode 100644
index c3a34ca..0000000
--- a/modules/audio_coding/codecs/ilbc/lsf_to_poly.c
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_Lsf2Poly.c
-
-******************************************************************/
-
-#include "defines.h"
-#include "lsf_to_lsp.h"
-#include "get_lsp_poly.h"
-#include "constants.h"
-
-void WebRtcIlbcfix_Lsf2Poly(
-    int16_t *a,     /* (o) predictor coefficients (order = 10) in Q12 */
-    int16_t *lsf    /* (i) line spectral frequencies in Q13 */
-                            ) {
-  int32_t f[2][6]; /* f[0][] and f[1][] corresponds to
-                            F1(z) and F2(z) respectivly */
-  int32_t *f1ptr, *f2ptr;
-  int16_t *a1ptr, *a2ptr;
-  int32_t tmpW32;
-  int16_t lsp[10];
-  int i;
-
-  /* Convert lsf to lsp */
-  WebRtcIlbcfix_Lsf2Lsp(lsf, lsp, LPC_FILTERORDER);
-
-  /* Get F1(z) and F2(z) from the lsp */
-  f1ptr=f[0];
-  f2ptr=f[1];
-  WebRtcIlbcfix_GetLspPoly(&lsp[0],f1ptr);
-  WebRtcIlbcfix_GetLspPoly(&lsp[1],f2ptr);
-
-  /* for i = 5 down to 1
-     Compute f1[i] += f1[i-1];
-     and     f2[i] += f2[i-1];
-  */
-  f1ptr=&f[0][5];
-  f2ptr=&f[1][5];
-  for (i=5; i>0; i--)
-  {
-    (*f1ptr) += (*(f1ptr-1));
-    (*f2ptr) -= (*(f2ptr-1));
-    f1ptr--;
-    f2ptr--;
-  }
-
-  /* Get the A(z) coefficients
-     a[0] = 1.0
-     for i = 1 to 5
-     a[i] = (f1[i] + f2[i] + round)>>13;
-     for i = 1 to 5
-     a[11-i] = (f1[i] - f2[i] + round)>>13;
-  */
-  a[0]=4096;
-  a1ptr=&a[1];
-  a2ptr=&a[10];
-  f1ptr=&f[0][1];
-  f2ptr=&f[1][1];
-  for (i=5; i>0; i--)
-  {
-    tmpW32 = (*f1ptr) + (*f2ptr);
-    *a1ptr = (int16_t)((tmpW32 + 4096) >> 13);
-
-    tmpW32 = (*f1ptr) - (*f2ptr);
-    *a2ptr = (int16_t)((tmpW32 + 4096) >> 13);
-
-    a1ptr++;
-    a2ptr--;
-    f1ptr++;
-    f2ptr++;
-  }
-
-  return;
-}
diff --git a/modules/audio_coding/codecs/ilbc/lsf_to_poly.h b/modules/audio_coding/codecs/ilbc/lsf_to_poly.h
deleted file mode 100644
index d85f510..0000000
--- a/modules/audio_coding/codecs/ilbc/lsf_to_poly.h
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_Lsf2Poly.h
-
-******************************************************************/
-
-#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_LSF_TO_POLY_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_LSF_TO_POLY_H_
-
-#include "defines.h"
-
-/*----------------------------------------------------------------*
- *  Convert from LSF coefficients to A coefficients
- *---------------------------------------------------------------*/
-
-void WebRtcIlbcfix_Lsf2Poly(
-    int16_t *a,     /* (o) predictor coefficients (order = 10) in Q12 */
-    int16_t *lsf    /* (i) line spectral frequencies in Q13 */
-                            );
-
-#endif
diff --git a/modules/audio_coding/codecs/ilbc/lsp_to_lsf.c b/modules/audio_coding/codecs/ilbc/lsp_to_lsf.c
deleted file mode 100644
index be95de7..0000000
--- a/modules/audio_coding/codecs/ilbc/lsp_to_lsf.c
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_Lsp2Lsf.c
-
-******************************************************************/
-
-#include "defines.h"
-#include "constants.h"
-
-/*----------------------------------------------------------------*
- *  conversion from LSP coefficients to LSF coefficients
- *---------------------------------------------------------------*/
-
-void WebRtcIlbcfix_Lsp2Lsf(
-    int16_t *lsp, /* (i) lsp vector -1...+1 in Q15 */
-    int16_t *lsf, /* (o) Lsf vector 0...Pi in Q13
-                           (ordered, so that lsf[i]<lsf[i+1]) */
-    int16_t m  /* (i) Number of coefficients */
-                           )
-{
-  int16_t i, k;
-  int16_t diff; /* diff between table value and desired value (Q15) */
-  int16_t freq; /* lsf/(2*pi) (Q16) */
-  int16_t *lspPtr, *lsfPtr, *cosTblPtr;
-  int16_t tmp;
-
-  /* set the index to maximum index value in WebRtcIlbcfix_kCos */
-  k = 63;
-
-  /*
-     Start with the highest LSP and then work the way down
-     For each LSP the lsf is calculated by first order approximation
-     of the acos(x) function
-  */
-  lspPtr = &lsp[9];
-  lsfPtr = &lsf[9];
-  cosTblPtr=(int16_t*)&WebRtcIlbcfix_kCos[k];
-  for(i=m-1; i>=0; i--)
-  {
-    /*
-       locate value in the table, which is just above lsp[i],
-       basically an approximation to acos(x)
-    */
-    while( (((int32_t)(*cosTblPtr)-(*lspPtr)) < 0)&&(k>0) )
-    {
-      k-=1;
-      cosTblPtr--;
-    }
-
-    /* Calculate diff, which is used in the linear approximation of acos(x) */
-    diff = (*lspPtr)-(*cosTblPtr);
-
-    /*
-       The linear approximation of acos(lsp[i]) :
-       acos(lsp[i])= k*512 + (WebRtcIlbcfix_kAcosDerivative[ind]*offset >> 11)
-    */
-
-    /* tmp (linear offset) in Q16 */
-    tmp = (int16_t)((WebRtcIlbcfix_kAcosDerivative[k] * diff) >> 11);
-
-    /* freq in Q16 */
-    freq = (k << 9) + tmp;
-
-    /* lsf = freq*2*pi */
-    (*lsfPtr) = (int16_t)(((int32_t)freq*25736)>>15);
-
-    lsfPtr--;
-    lspPtr--;
-  }
-
-  return;
-}
diff --git a/modules/audio_coding/codecs/ilbc/lsp_to_lsf.h b/modules/audio_coding/codecs/ilbc/lsp_to_lsf.h
deleted file mode 100644
index a2bcaff..0000000
--- a/modules/audio_coding/codecs/ilbc/lsp_to_lsf.h
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_Lsp2Lsf.h
-
-******************************************************************/
-
-#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_LSP_TO_LSF_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_LSP_TO_LSF_H_
-
-#include "defines.h"
-
-/*----------------------------------------------------------------*
- *  conversion from LSP coefficients to LSF coefficients
- *---------------------------------------------------------------*/
-
-void WebRtcIlbcfix_Lsp2Lsf(
-    int16_t *lsp, /* (i) lsp vector -1...+1 in Q15 */
-    int16_t *lsf, /* (o) Lsf vector 0...Pi in Q13
-                           (ordered, so that lsf[i]<lsf[i+1]) */
-    int16_t m  /* (i) Number of coefficients */
-                           );
-
-#endif
diff --git a/modules/audio_coding/codecs/ilbc/my_corr.c b/modules/audio_coding/codecs/ilbc/my_corr.c
deleted file mode 100644
index 80847b6..0000000
--- a/modules/audio_coding/codecs/ilbc/my_corr.c
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_MyCorr.c
-
-******************************************************************/
-
-#include "defines.h"
-
-/*----------------------------------------------------------------*
- * compute cross correlation between sequences
- *---------------------------------------------------------------*/
-
-void WebRtcIlbcfix_MyCorr(
-    int32_t* corr,  /* (o) correlation of seq1 and seq2 */
-    const int16_t* seq1,  /* (i) first sequence */
-    size_t dim1,  /* (i) dimension first seq1 */
-    const int16_t* seq2, /* (i) second sequence */
-    size_t dim2   /* (i) dimension seq2 */
-                          ){
-  uint32_t max1, max2;
-  size_t loops;
-  int right_shift;
-
-  // Calculate a right shift that will let us sum dim2 pairwise products of
-  // values from the two sequences without overflowing an int32_t. (The +1 in
-  // max1 and max2 are because WebRtcSpl_MaxAbsValueW16 will return 2**15 - 1
-  // if the input array contains -2**15.)
-  max1 = WebRtcSpl_MaxAbsValueW16(seq1, dim1) + 1;
-  max2 = WebRtcSpl_MaxAbsValueW16(seq2, dim2) + 1;
-  right_shift =
-      (64 - 31) - WebRtcSpl_CountLeadingZeros64((max1 * max2) * (uint64_t)dim2);
-  if (right_shift < 0) {
-    right_shift = 0;
-  }
-
-  loops=dim1-dim2+1;
-
-  /* Calculate the cross correlations */
-  WebRtcSpl_CrossCorrelation(corr, seq2, seq1, dim2, loops, right_shift, 1);
-
-  return;
-}
diff --git a/modules/audio_coding/codecs/ilbc/my_corr.h b/modules/audio_coding/codecs/ilbc/my_corr.h
deleted file mode 100644
index 2149464..0000000
--- a/modules/audio_coding/codecs/ilbc/my_corr.h
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_MyCorr.h
-
-******************************************************************/
-
-#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_MY_CORR_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_MY_CORR_H_
-
-#include "defines.h"
-
-/*----------------------------------------------------------------*
- * compute cross correlation between sequences
- *---------------------------------------------------------------*/
-
-void WebRtcIlbcfix_MyCorr(
-    int32_t* corr,  /* (o) correlation of seq1 and seq2 */
-    const int16_t* seq1,  /* (i) first sequence */
-    size_t dim1,  /* (i) dimension first seq1 */
-    const int16_t* seq2, /* (i) second sequence */
-    size_t dim2   /* (i) dimension seq2 */
-                          );
-
-#endif
diff --git a/modules/audio_coding/codecs/ilbc/nearest_neighbor.c b/modules/audio_coding/codecs/ilbc/nearest_neighbor.c
deleted file mode 100644
index 2b58abc..0000000
--- a/modules/audio_coding/codecs/ilbc/nearest_neighbor.c
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_NearestNeighbor.c
-
-******************************************************************/
-
-#include "defines.h"
-
-void WebRtcIlbcfix_NearestNeighbor(size_t* index,
-                                   const size_t* array,
-                                   size_t value,
-                                   size_t arlength) {
-  size_t i;
-  size_t min_diff = (size_t)-1;
-  for (i = 0; i < arlength; i++) {
-    const size_t diff =
-        (array[i] < value) ? (value - array[i]) : (array[i] - value);
-    if (diff < min_diff) {
-      *index = i;
-      min_diff = diff;
-    }
-  }
-}
diff --git a/modules/audio_coding/codecs/ilbc/nearest_neighbor.h b/modules/audio_coding/codecs/ilbc/nearest_neighbor.h
deleted file mode 100644
index 7d7fb6f..0000000
--- a/modules/audio_coding/codecs/ilbc/nearest_neighbor.h
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_NearestNeighbor.h
-
-******************************************************************/
-
-#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_NEAREST_NEIGHBOR_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_NEAREST_NEIGHBOR_H_
-
-#include "defines.h"
-
-/*----------------------------------------------------------------*
- * Find index in array such that the array element with said
- * index is the element of said array closest to "value"
- *---------------------------------------------------------------*/
-
-void WebRtcIlbcfix_NearestNeighbor(
-    size_t* index, /* (o) index of array element closest to value */
-    const size_t* array, /* (i) data array (Q2) */
-    size_t value, /* (i) value (Q2) */
-    size_t arlength /* (i) dimension of data array (==ENH_NBLOCKS_TOT) */
-                                   );
-
-#endif
diff --git a/modules/audio_coding/codecs/ilbc/pack_bits.c b/modules/audio_coding/codecs/ilbc/pack_bits.c
deleted file mode 100644
index 9475ecb..0000000
--- a/modules/audio_coding/codecs/ilbc/pack_bits.c
+++ /dev/null
@@ -1,251 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_PackBits.c
-
-******************************************************************/
-
-#include "defines.h"
-
-/*----------------------------------------------------------------*
- *  unpacking of bits from bitstream, i.e., vector of bytes
- *---------------------------------------------------------------*/
-
-void WebRtcIlbcfix_PackBits(
-    uint16_t *bitstream,   /* (o) The packetized bitstream */
-    iLBC_bits *enc_bits,  /* (i) Encoded bits */
-    int16_t mode     /* (i) Codec mode (20 or 30) */
-                             ){
-  uint16_t *bitstreamPtr;
-  int i, k;
-  int16_t *tmpPtr;
-
-  bitstreamPtr=bitstream;
-
-  /* Class 1 bits of ULP */
-  /* First int16_t */
-  (*bitstreamPtr)  = ((uint16_t)enc_bits->lsf[0])<<10;   /* Bit 0..5  */
-  (*bitstreamPtr) |= (enc_bits->lsf[1])<<3;     /* Bit 6..12 */
-  (*bitstreamPtr) |= (enc_bits->lsf[2]&0x70)>>4;    /* Bit 13..15 */
-  bitstreamPtr++;
-  /* Second int16_t */
-  (*bitstreamPtr)  = ((uint16_t)enc_bits->lsf[2]&0xF)<<12;  /* Bit 0..3  */
-
-  if (mode==20) {
-    (*bitstreamPtr) |= (enc_bits->startIdx)<<10;    /* Bit 4..5  */
-    (*bitstreamPtr) |= (enc_bits->state_first)<<9;    /* Bit 6  */
-    (*bitstreamPtr) |= (enc_bits->idxForMax)<<3;    /* Bit 7..12 */
-    (*bitstreamPtr) |= ((enc_bits->cb_index[0])&0x70)>>4;  /* Bit 13..15 */
-    bitstreamPtr++;
-    /* Third int16_t */
-    (*bitstreamPtr) = ((enc_bits->cb_index[0])&0xE)<<12;  /* Bit 0..2  */
-    (*bitstreamPtr) |= ((enc_bits->gain_index[0])&0x18)<<8;  /* Bit 3..4  */
-    (*bitstreamPtr) |= ((enc_bits->gain_index[1])&0x8)<<7;  /* Bit 5  */
-    (*bitstreamPtr) |= ((enc_bits->cb_index[3])&0xFE)<<2;  /* Bit 6..12 */
-    (*bitstreamPtr) |= ((enc_bits->gain_index[3])&0x10)>>2;  /* Bit 13  */
-    (*bitstreamPtr) |= ((enc_bits->gain_index[4])&0x8)>>2;  /* Bit 14  */
-    (*bitstreamPtr) |= ((enc_bits->gain_index[6])&0x10)>>4;  /* Bit 15  */
-  } else { /* mode==30 */
-    (*bitstreamPtr) |= (enc_bits->lsf[3])<<6;     /* Bit 4..9  */
-    (*bitstreamPtr) |= (enc_bits->lsf[4]&0x7E)>>1;    /* Bit 10..15 */
-    bitstreamPtr++;
-    /* Third int16_t */
-    (*bitstreamPtr)  = ((uint16_t)enc_bits->lsf[4]&0x1)<<15;  /* Bit 0  */
-    (*bitstreamPtr) |= (enc_bits->lsf[5])<<8;     /* Bit 1..7  */
-    (*bitstreamPtr) |= (enc_bits->startIdx)<<5;     /* Bit 8..10 */
-    (*bitstreamPtr) |= (enc_bits->state_first)<<4;    /* Bit 11  */
-    (*bitstreamPtr) |= ((enc_bits->idxForMax)&0x3C)>>2;   /* Bit 12..15 */
-    bitstreamPtr++;
-    /* 4:th int16_t */
-    (*bitstreamPtr)  = ((uint16_t)enc_bits->idxForMax&0x3)<<14; /* Bit 0..1  */
-    (*bitstreamPtr) |= (enc_bits->cb_index[0]&0x78)<<7;   /* Bit 2..5  */
-    (*bitstreamPtr) |= (enc_bits->gain_index[0]&0x10)<<5;  /* Bit 6  */
-    (*bitstreamPtr) |= (enc_bits->gain_index[1]&0x8)<<5;  /* Bit 7  */
-    (*bitstreamPtr) |= (enc_bits->cb_index[3]&0xFC);   /* Bit 8..13 */
-    (*bitstreamPtr) |= (enc_bits->gain_index[3]&0x10)>>3;  /* Bit 14  */
-    (*bitstreamPtr) |= (enc_bits->gain_index[4]&0x8)>>3;  /* Bit 15  */
-  }
-  /* Class 2 bits of ULP */
-  /* 4:th to 6:th int16_t for 20 ms case
-     5:th to 7:th int16_t for 30 ms case */
-  bitstreamPtr++;
-  tmpPtr=enc_bits->idxVec;
-  for (k=0; k<3; k++) {
-    (*bitstreamPtr) = 0;
-    for (i=15; i>=0; i--) {
-      (*bitstreamPtr) |= ((uint16_t)((*tmpPtr)&0x4)>>2)<<i;
-      /* Bit 15-i  */
-      tmpPtr++;
-    }
-    bitstreamPtr++;
-  }
-
-  if (mode==20) {
-    /* 7:th int16_t */
-    (*bitstreamPtr) = 0;
-    for (i=15; i>6; i--) {
-      (*bitstreamPtr) |= ((uint16_t)((*tmpPtr)&0x4)>>2)<<i;
-      /* Bit 15-i  */
-      tmpPtr++;
-    }
-    (*bitstreamPtr) |= (enc_bits->gain_index[1]&0x4)<<4;  /* Bit 9  */
-    (*bitstreamPtr) |= (enc_bits->gain_index[3]&0xC)<<2;  /* Bit 10..11 */
-    (*bitstreamPtr) |= (enc_bits->gain_index[4]&0x4)<<1;  /* Bit 12  */
-    (*bitstreamPtr) |= (enc_bits->gain_index[6]&0x8)>>1;  /* Bit 13  */
-    (*bitstreamPtr) |= (enc_bits->gain_index[7]&0xC)>>2;  /* Bit 14..15 */
-
-  } else { /* mode==30 */
-    /* 8:th int16_t */
-    (*bitstreamPtr) = 0;
-    for (i=15; i>5; i--) {
-      (*bitstreamPtr) |= ((uint16_t)((*tmpPtr)&0x4)>>2)<<i;
-      /* Bit 15-i  */
-      tmpPtr++;
-    }
-    (*bitstreamPtr) |= (enc_bits->cb_index[0]&0x6)<<3;   /* Bit 10..11 */
-    (*bitstreamPtr) |= (enc_bits->gain_index[0]&0x8);   /* Bit 12  */
-    (*bitstreamPtr) |= (enc_bits->gain_index[1]&0x4);   /* Bit 13  */
-    (*bitstreamPtr) |= (enc_bits->cb_index[3]&0x2);    /* Bit 14  */
-    (*bitstreamPtr) |= (enc_bits->cb_index[6]&0x80)>>7;   /* Bit 15  */
-    bitstreamPtr++;
-    /* 9:th int16_t */
-    (*bitstreamPtr)  = ((uint16_t)enc_bits->cb_index[6]&0x7E)<<9;/* Bit 0..5  */
-    (*bitstreamPtr) |= (enc_bits->cb_index[9]&0xFE)<<2;   /* Bit 6..12 */
-    (*bitstreamPtr) |= (enc_bits->cb_index[12]&0xE0)>>5;  /* Bit 13..15 */
-    bitstreamPtr++;
-    /* 10:th int16_t */
-    (*bitstreamPtr)  = ((uint16_t)enc_bits->cb_index[12]&0x1E)<<11;/* Bit 0..3 */
-    (*bitstreamPtr) |= (enc_bits->gain_index[3]&0xC)<<8;  /* Bit 4..5  */
-    (*bitstreamPtr) |= (enc_bits->gain_index[4]&0x6)<<7;  /* Bit 6..7  */
-    (*bitstreamPtr) |= (enc_bits->gain_index[6]&0x18)<<3;  /* Bit 8..9  */
-    (*bitstreamPtr) |= (enc_bits->gain_index[7]&0xC)<<2;  /* Bit 10..11 */
-    (*bitstreamPtr) |= (enc_bits->gain_index[9]&0x10)>>1;  /* Bit 12  */
-    (*bitstreamPtr) |= (enc_bits->gain_index[10]&0x8)>>1;  /* Bit 13  */
-    (*bitstreamPtr) |= (enc_bits->gain_index[12]&0x10)>>3;  /* Bit 14  */
-    (*bitstreamPtr) |= (enc_bits->gain_index[13]&0x8)>>3;  /* Bit 15  */
-  }
-  bitstreamPtr++;
-  /* Class 3 bits of ULP */
-  /*  8:th to 14:th int16_t for 20 ms case
-      11:th to 17:th int16_t for 30 ms case */
-  tmpPtr=enc_bits->idxVec;
-  for (k=0; k<7; k++) {
-    (*bitstreamPtr) = 0;
-    for (i=14; i>=0; i-=2) {
-      (*bitstreamPtr) |= ((uint16_t)((*tmpPtr)&0x3))<<i; /* Bit 15-i..14-i*/
-      tmpPtr++;
-    }
-    bitstreamPtr++;
-  }
-
-  if (mode==20) {
-    /* 15:th int16_t */
-    (*bitstreamPtr)  = ((uint16_t)((enc_bits->idxVec[56])&0x3))<<14;/* Bit 0..1 */
-    (*bitstreamPtr) |= (((enc_bits->cb_index[0])&1))<<13;  /* Bit 2  */
-    (*bitstreamPtr) |= ((enc_bits->cb_index[1]))<<6;   /* Bit 3..9  */
-    (*bitstreamPtr) |= ((enc_bits->cb_index[2])&0x7E)>>1;  /* Bit 10..15 */
-    bitstreamPtr++;
-    /* 16:th int16_t */
-    (*bitstreamPtr) = ((uint16_t)((enc_bits->cb_index[2])&0x1))<<15;
-    /* Bit 0  */
-    (*bitstreamPtr) |= ((enc_bits->gain_index[0])&0x7)<<12;  /* Bit 1..3  */
-    (*bitstreamPtr) |= ((enc_bits->gain_index[1])&0x3)<<10;  /* Bit 4..5  */
-    (*bitstreamPtr) |= ((enc_bits->gain_index[2]))<<7;   /* Bit 6..8  */
-    (*bitstreamPtr) |= ((enc_bits->cb_index[3])&0x1)<<6;  /* Bit 9  */
-    (*bitstreamPtr) |= ((enc_bits->cb_index[4])&0x7E)>>1;  /* Bit 10..15 */
-    bitstreamPtr++;
-    /* 17:th int16_t */
-    (*bitstreamPtr) = ((uint16_t)((enc_bits->cb_index[4])&0x1))<<15;
-    /* Bit 0  */
-    (*bitstreamPtr) |= (enc_bits->cb_index[5])<<8;    /* Bit 1..7  */
-    (*bitstreamPtr) |= (enc_bits->cb_index[6]);     /* Bit 8..15 */
-    bitstreamPtr++;
-    /* 18:th int16_t */
-    (*bitstreamPtr) = ((uint16_t)(enc_bits->cb_index[7]))<<8; /* Bit 0..7  */
-    (*bitstreamPtr) |= (enc_bits->cb_index[8]);     /* Bit 8..15 */
-    bitstreamPtr++;
-    /* 19:th int16_t */
-    (*bitstreamPtr) = ((uint16_t)((enc_bits->gain_index[3])&0x3))<<14;
-    /* Bit 0..1  */
-    (*bitstreamPtr) |= ((enc_bits->gain_index[4])&0x3)<<12;  /* Bit 2..3  */
-    (*bitstreamPtr) |= ((enc_bits->gain_index[5]))<<9;   /* Bit 4..6  */
-    (*bitstreamPtr) |= ((enc_bits->gain_index[6])&0x7)<<6;  /* Bit 7..9  */
-    (*bitstreamPtr) |= ((enc_bits->gain_index[7])&0x3)<<4;  /* Bit 10..11 */
-    (*bitstreamPtr) |= (enc_bits->gain_index[8])<<1;   /* Bit 12..14 */
-  } else { /* mode==30 */
-    /* 18:th int16_t */
-    (*bitstreamPtr)  = ((uint16_t)((enc_bits->idxVec[56])&0x3))<<14;/* Bit 0..1 */
-    (*bitstreamPtr) |= (((enc_bits->idxVec[57])&0x3))<<12;  /* Bit 2..3  */
-    (*bitstreamPtr) |= (((enc_bits->cb_index[0])&1))<<11;  /* Bit 4  */
-    (*bitstreamPtr) |= ((enc_bits->cb_index[1]))<<4;   /* Bit 5..11 */
-    (*bitstreamPtr) |= ((enc_bits->cb_index[2])&0x78)>>3;  /* Bit 12..15 */
-    bitstreamPtr++;
-    /* 19:th int16_t */
-    (*bitstreamPtr)  = ((uint16_t)(enc_bits->cb_index[2])&0x7)<<13;
-    /* Bit 0..2  */
-    (*bitstreamPtr) |= ((enc_bits->gain_index[0])&0x7)<<10;  /* Bit 3..5  */
-    (*bitstreamPtr) |= ((enc_bits->gain_index[1])&0x3)<<8;  /* Bit 6..7  */
-    (*bitstreamPtr) |= ((enc_bits->gain_index[2])&0x7)<<5;  /* Bit 8..10 */
-    (*bitstreamPtr) |= ((enc_bits->cb_index[3])&0x1)<<4;  /* Bit 11  */
-    (*bitstreamPtr) |= ((enc_bits->cb_index[4])&0x78)>>3;  /* Bit 12..15 */
-    bitstreamPtr++;
-    /* 20:th int16_t */
-    (*bitstreamPtr)  = ((uint16_t)(enc_bits->cb_index[4])&0x7)<<13;
-    /* Bit 0..2  */
-    (*bitstreamPtr) |= ((enc_bits->cb_index[5]))<<6;   /* Bit 3..9  */
-    (*bitstreamPtr) |= ((enc_bits->cb_index[6])&0x1)<<5;  /* Bit 10  */
-    (*bitstreamPtr) |= ((enc_bits->cb_index[7])&0xF8)>>3;  /* Bit 11..15 */
-    bitstreamPtr++;
-    /* 21:st int16_t */
-    (*bitstreamPtr)  = ((uint16_t)(enc_bits->cb_index[7])&0x7)<<13;
-    /* Bit 0..2  */
-    (*bitstreamPtr) |= ((enc_bits->cb_index[8]))<<5;   /* Bit 3..10 */
-    (*bitstreamPtr) |= ((enc_bits->cb_index[9])&0x1)<<4;  /* Bit 11  */
-    (*bitstreamPtr) |= ((enc_bits->cb_index[10])&0xF0)>>4;  /* Bit 12..15 */
-    bitstreamPtr++;
-    /* 22:nd int16_t */
-    (*bitstreamPtr)  = ((uint16_t)(enc_bits->cb_index[10])&0xF)<<12;
-    /* Bit 0..3  */
-    (*bitstreamPtr) |= ((enc_bits->cb_index[11]))<<4;   /* Bit 4..11 */
-    (*bitstreamPtr) |= ((enc_bits->cb_index[12])&0x1)<<3;  /* Bit 12  */
-    (*bitstreamPtr) |= ((enc_bits->cb_index[13])&0xE0)>>5;  /* Bit 13..15 */
-    bitstreamPtr++;
-    /* 23:rd int16_t */
-    (*bitstreamPtr)  = ((uint16_t)(enc_bits->cb_index[13])&0x1F)<<11;
-    /* Bit 0..4  */
-    (*bitstreamPtr) |= ((enc_bits->cb_index[14]))<<3;   /* Bit 5..12 */
-    (*bitstreamPtr) |= ((enc_bits->gain_index[3])&0x3)<<1;  /* Bit 13..14 */
-    (*bitstreamPtr) |= ((enc_bits->gain_index[4])&0x1);   /* Bit 15  */
-    bitstreamPtr++;
-    /* 24:rd int16_t */
-    (*bitstreamPtr)  = ((uint16_t)(enc_bits->gain_index[5]))<<13;
-    /* Bit 0..2  */
-    (*bitstreamPtr) |= ((enc_bits->gain_index[6])&0x7)<<10;  /* Bit 3..5  */
-    (*bitstreamPtr) |= ((enc_bits->gain_index[7])&0x3)<<8;  /* Bit 6..7  */
-    (*bitstreamPtr) |= ((enc_bits->gain_index[8]))<<5;   /* Bit 8..10 */
-    (*bitstreamPtr) |= ((enc_bits->gain_index[9])&0xF)<<1;  /* Bit 11..14 */
-    (*bitstreamPtr) |= ((enc_bits->gain_index[10])&0x4)>>2;  /* Bit 15  */
-    bitstreamPtr++;
-    /* 25:rd int16_t */
-    (*bitstreamPtr)  = ((uint16_t)(enc_bits->gain_index[10])&0x3)<<14;
-    /* Bit 0..1  */
-    (*bitstreamPtr) |= ((enc_bits->gain_index[11]))<<11;  /* Bit 2..4  */
-    (*bitstreamPtr) |= ((enc_bits->gain_index[12])&0xF)<<7;  /* Bit 5..8  */
-    (*bitstreamPtr) |= ((enc_bits->gain_index[13])&0x7)<<4;  /* Bit 9..11 */
-    (*bitstreamPtr) |= ((enc_bits->gain_index[14]))<<1;   /* Bit 12..14 */
-  }
-  /* Last bit is automatically zero */
-
-  return;
-}
diff --git a/modules/audio_coding/codecs/ilbc/pack_bits.h b/modules/audio_coding/codecs/ilbc/pack_bits.h
deleted file mode 100644
index 603ddd4..0000000
--- a/modules/audio_coding/codecs/ilbc/pack_bits.h
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_PackBits.h
-
-******************************************************************/
-
-#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_PACK_BITS_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_PACK_BITS_H_
-
-#include "defines.h"
-
-/*----------------------------------------------------------------*
- *  unpacking of bits from bitstream, i.e., vector of bytes
- *---------------------------------------------------------------*/
-
-void WebRtcIlbcfix_PackBits( 
-    uint16_t *bitstream,   /* (o) The packetized bitstream */
-    iLBC_bits *enc_bits,  /* (i) Encoded bits */
-    int16_t mode     /* (i) Codec mode (20 or 30) */
-                             );
-
-#endif
diff --git a/modules/audio_coding/codecs/ilbc/poly_to_lsf.c b/modules/audio_coding/codecs/ilbc/poly_to_lsf.c
deleted file mode 100644
index df8a78b..0000000
--- a/modules/audio_coding/codecs/ilbc/poly_to_lsf.c
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_Poly2Lsf.c
-
-******************************************************************/
-
-#include "defines.h"
-#include "constants.h"
-#include "poly_to_lsp.h"
-#include "lsp_to_lsf.h"
-
-void WebRtcIlbcfix_Poly2Lsf(
-    int16_t *lsf,   /* (o) lsf coefficients (Q13) */
-    int16_t *a    /* (i) A coefficients (Q12) */
-                            ) {
-  int16_t lsp[10];
-  WebRtcIlbcfix_Poly2Lsp(a, lsp, (int16_t*)WebRtcIlbcfix_kLspMean);
-  WebRtcIlbcfix_Lsp2Lsf(lsp, lsf, 10);
-}
diff --git a/modules/audio_coding/codecs/ilbc/poly_to_lsf.h b/modules/audio_coding/codecs/ilbc/poly_to_lsf.h
deleted file mode 100644
index 5a7f7bb..0000000
--- a/modules/audio_coding/codecs/ilbc/poly_to_lsf.h
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_Poly2Lsf.h
-
-******************************************************************/
-
-#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_POLY_TO_LSF_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_POLY_TO_LSF_H_
-
-#include "defines.h"
-
-/*----------------------------------------------------------------*
- *  conversion from lpc coefficients to lsf coefficients
- *---------------------------------------------------------------*/
-
-void WebRtcIlbcfix_Poly2Lsf(
-    int16_t *lsf,   /* (o) lsf coefficients (Q13) */
-    int16_t *a    /* (i) A coefficients (Q12) */
-                            );
-
-#endif
diff --git a/modules/audio_coding/codecs/ilbc/poly_to_lsp.c b/modules/audio_coding/codecs/ilbc/poly_to_lsp.c
deleted file mode 100644
index ca376b3..0000000
--- a/modules/audio_coding/codecs/ilbc/poly_to_lsp.c
+++ /dev/null
@@ -1,158 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_Poly2Lsp.c
-
-******************************************************************/
-
-#include "defines.h"
-#include "constants.h"
-#include "chebyshev.h"
-
-/*----------------------------------------------------------------*
- * conversion from lpc coefficients to lsp coefficients
- * function is only for 10:th order LPC
- *---------------------------------------------------------------*/
-
-void WebRtcIlbcfix_Poly2Lsp(
-    int16_t *a,  /* (o) A coefficients in Q12 */
-    int16_t *lsp, /* (i) LSP coefficients in Q15 */
-    int16_t *old_lsp /* (i) old LSP coefficients that are used if the new
-                              coefficients turn out to be unstable */
-                            ) {
-  int16_t f[2][6]; /* f[0][] represents f1 and f[1][] represents f2 */
-  int16_t *a_i_ptr, *a_10mi_ptr;
-  int16_t *f1ptr, *f2ptr;
-  int32_t tmpW32;
-  int16_t x, y, xlow, ylow, xmid, ymid, xhigh, yhigh, xint;
-  int16_t shifts, sign;
-  int i, j;
-  int foundFreqs;
-  int fi_select;
-
-  /*
-     Calculate the two polynomials f1(z) and f2(z)
-     (the sum and the diff polynomial)
-     f1[0] = f2[0] = 1.0;
-     f1[i+1] = a[i+1] + a[10-i] - f1[i];
-     f2[i+1] = a[i+1] - a[10-i] - f1[i];
-  */
-
-  a_i_ptr = a + 1;
-  a_10mi_ptr = a + 10;
-  f1ptr = f[0];
-  f2ptr = f[1];
-  (*f1ptr) = 1024; /* 1.0 in Q10 */
-  (*f2ptr) = 1024; /* 1.0 in Q10 */
-  for (i = 0; i < 5; i++) {
-    *(f1ptr + 1) =
-        (int16_t)((((int32_t)(*a_i_ptr) + *a_10mi_ptr) >> 2) - *f1ptr);
-    *(f2ptr + 1) =
-        (int16_t)((((int32_t)(*a_i_ptr) - *a_10mi_ptr) >> 2) + *f2ptr);
-    a_i_ptr++;
-    a_10mi_ptr--;
-    f1ptr++;
-    f2ptr++;
-  }
-
-  /*
-    find the LSPs using the Chebychev pol. evaluation
-  */
-
-  fi_select = 0; /* selector between f1 and f2, start with f1 */
-
-  foundFreqs = 0;
-
-  xlow = WebRtcIlbcfix_kCosGrid[0];
-  ylow = WebRtcIlbcfix_Chebyshev(xlow, f[fi_select]);
-
-  /*
-     Iterate until all the 10 LSP's have been found or
-     all the grid points have been tried. If the 10 LSP's can
-     not be found, set the LSP vector to previous LSP
-  */
-
-  for (j = 1; j < COS_GRID_POINTS && foundFreqs < 10; j++) {
-    xhigh = xlow;
-    yhigh = ylow;
-    xlow = WebRtcIlbcfix_kCosGrid[j];
-    ylow = WebRtcIlbcfix_Chebyshev(xlow, f[fi_select]);
-
-    if (ylow * yhigh <= 0) {
-      /* Run 4 times to reduce the interval */
-      for (i = 0; i < 4; i++) {
-        /* xmid =(xlow + xhigh)/2 */
-        xmid = (xlow >> 1) + (xhigh >> 1);
-        ymid = WebRtcIlbcfix_Chebyshev(xmid, f[fi_select]);
-
-        if (ylow * ymid <= 0) {
-          yhigh = ymid;
-          xhigh = xmid;
-        } else {
-          ylow = ymid;
-          xlow = xmid;
-        }
-      }
-
-      /*
-        Calculater xint by linear interpolation:
-        xint = xlow - ylow*(xhigh-xlow)/(yhigh-ylow);
-      */
-
-      x = xhigh - xlow;
-      y = yhigh - ylow;
-
-      if (y == 0) {
-        xint = xlow;
-      } else {
-        sign = y;
-        y = WEBRTC_SPL_ABS_W16(y);
-        shifts = (int16_t)WebRtcSpl_NormW32(y)-16;
-        y <<= shifts;
-        y = (int16_t)WebRtcSpl_DivW32W16(536838144, y); /* 1/(yhigh-ylow) */
-
-        tmpW32 = (x * y) >> (19 - shifts);
-
-        /* y=(xhigh-xlow)/(yhigh-ylow) */
-        y = (int16_t)(tmpW32&0xFFFF);
-
-        if (sign < 0) {
-          y = -y;
-        }
-        /* tmpW32 = ylow*(xhigh-xlow)/(yhigh-ylow) */
-        tmpW32 = (ylow * y) >> 10;
-        xint = xlow-(int16_t)(tmpW32&0xFFFF);
-      }
-
-      /* Store the calculated lsp */
-      lsp[foundFreqs] = (int16_t)xint;
-      foundFreqs++;
-
-      /* if needed, set xlow and ylow for next recursion */
-      if (foundFreqs<10) {
-        xlow = xint;
-        /* Swap between f1 and f2 (f[0][] and f[1][]) */
-        fi_select = ((fi_select+1)&0x1);
-
-        ylow = WebRtcIlbcfix_Chebyshev(xlow, f[fi_select]);
-      }
-    }
-  }
-
-  /* Check if M roots found, if not then use the old LSP */
-  if (foundFreqs < 10) {
-    WEBRTC_SPL_MEMCPY_W16(lsp, old_lsp, 10);
-  }
-  return;
-}
diff --git a/modules/audio_coding/codecs/ilbc/poly_to_lsp.h b/modules/audio_coding/codecs/ilbc/poly_to_lsp.h
deleted file mode 100644
index ed20fd9..0000000
--- a/modules/audio_coding/codecs/ilbc/poly_to_lsp.h
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_Poly2Lsp.h
-
-******************************************************************/
-
-#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_POLY_TO_LSP_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_POLY_TO_LSP_H_
-
-#include "defines.h"
-
-/*----------------------------------------------------------------*
- * conversion from lpc coefficients to lsp coefficients
- * function is only for 10:th order LPC
- *---------------------------------------------------------------*/
-
-void WebRtcIlbcfix_Poly2Lsp(
-    int16_t *a,  /* (o) A coefficients in Q12 */
-    int16_t *lsp, /* (i) LSP coefficients in Q15 */
-    int16_t *old_lsp /* (i) old LSP coefficients that are used if the new
-                              coefficients turn out to be unstable */
-                            );
-
-#endif
diff --git a/modules/audio_coding/codecs/ilbc/refiner.c b/modules/audio_coding/codecs/ilbc/refiner.c
deleted file mode 100644
index 3c1265e..0000000
--- a/modules/audio_coding/codecs/ilbc/refiner.c
+++ /dev/null
@@ -1,140 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_Refiner.c
-
-******************************************************************/
-
-#include "defines.h"
-#include "constants.h"
-#include "enh_upsample.h"
-#include "my_corr.h"
-
-/*----------------------------------------------------------------*
- * find segment starting near idata+estSegPos that has highest
- * correlation with idata+centerStartPos through
- * idata+centerStartPos+ENH_BLOCKL-1 segment is found at a
- * resolution of ENH_UPSO times the original of the original
- * sampling rate
- *---------------------------------------------------------------*/
-
-void WebRtcIlbcfix_Refiner(
-    size_t *updStartPos, /* (o) updated start point (Q-2) */
-    int16_t *idata,   /* (i) original data buffer */
-    size_t idatal,   /* (i) dimension of idata */
-    size_t centerStartPos, /* (i) beginning center segment */
-    size_t estSegPos,  /* (i) estimated beginning other segment (Q-2) */
-    int16_t *surround,  /* (i/o) The contribution from this sequence
-                                           summed with earlier contributions */
-    int16_t gain    /* (i) Gain to use for this sequence */
-                           ){
-  size_t estSegPosRounded, searchSegStartPos, searchSegEndPos, corrdim;
-  size_t tloc, tloc2, i;
-
-  int32_t maxtemp, scalefact;
-  int16_t *filtStatePtr, *polyPtr;
-  /* Stack based */
-  int16_t filt[7];
-  int32_t corrVecUps[ENH_CORRDIM*ENH_UPS0];
-  int32_t corrVecTemp[ENH_CORRDIM];
-  int16_t vect[ENH_VECTL];
-  int16_t corrVec[ENH_CORRDIM];
-
-  /* defining array bounds */
-
-  estSegPosRounded = (estSegPos - 2) >> 2;
-
-  searchSegStartPos =
-      (estSegPosRounded < ENH_SLOP) ? 0 : (estSegPosRounded - ENH_SLOP);
-
-  searchSegEndPos = estSegPosRounded + ENH_SLOP;
-  if ((searchSegEndPos + ENH_BLOCKL) >= idatal) {
-    searchSegEndPos = idatal - ENH_BLOCKL - 1;
-  }
-
-  corrdim = searchSegEndPos + 1 - searchSegStartPos;
-
-  /* compute upsampled correlation and find
-     location of max */
-
-  WebRtcIlbcfix_MyCorr(corrVecTemp, idata + searchSegStartPos,
-                       corrdim + ENH_BLOCKL - 1, idata + centerStartPos,
-                       ENH_BLOCKL);
-
-  /* Calculate the rescaling factor for the correlation in order to
-     put the correlation in a int16_t vector instead */
-  maxtemp = WebRtcSpl_MaxAbsValueW32(corrVecTemp, corrdim);
-
-  scalefact = WebRtcSpl_GetSizeInBits(maxtemp) - 15;
-
-  if (scalefact > 0) {
-    for (i = 0; i < corrdim; i++) {
-      corrVec[i] = (int16_t)(corrVecTemp[i] >> scalefact);
-    }
-  } else {
-    for (i = 0; i < corrdim; i++) {
-      corrVec[i] = (int16_t)corrVecTemp[i];
-    }
-  }
-  /* In order to guarantee that all values are initialized */
-  for (i = corrdim; i < ENH_CORRDIM; i++) {
-    corrVec[i] = 0;
-  }
-
-  /* Upsample the correlation */
-  WebRtcIlbcfix_EnhUpsample(corrVecUps, corrVec);
-
-  /* Find maximum */
-  tloc = WebRtcSpl_MaxIndexW32(corrVecUps, ENH_UPS0 * corrdim);
-
-  /* make vector can be upsampled without ever running outside
-     bounds */
-  *updStartPos = searchSegStartPos * 4 + tloc + 4;
-
-  tloc2 = (tloc + 3) >> 2;
-
-  /* initialize the vector to be filtered, stuff with zeros
-     when data is outside idata buffer */
-  if (ENH_FL0 > (searchSegStartPos + tloc2)) {
-    const size_t st = ENH_FL0 - searchSegStartPos - tloc2;
-    WebRtcSpl_MemSetW16(vect, 0, st);
-    WEBRTC_SPL_MEMCPY_W16(&vect[st], idata, ENH_VECTL - st);
-  } else {
-    const size_t st = searchSegStartPos + tloc2 - ENH_FL0;
-    if ((st + ENH_VECTL) > idatal) {
-      const size_t en = st + ENH_VECTL - idatal;
-      WEBRTC_SPL_MEMCPY_W16(vect, &idata[st], ENH_VECTL - en);
-      WebRtcSpl_MemSetW16(&vect[ENH_VECTL - en], 0, en);
-    } else {
-      WEBRTC_SPL_MEMCPY_W16(vect, &idata[st], ENH_VECTL);
-    }
-  }
-
-  /* compute the segment (this is actually a convolution) */
-  filtStatePtr = filt + 6;
-  polyPtr = (int16_t*)WebRtcIlbcfix_kEnhPolyPhaser[tloc2 * ENH_UPS0 - tloc];
-  for (i = 0; i < 7; i++) {
-    *filtStatePtr-- = *polyPtr++;
-  }
-
-  WebRtcSpl_FilterMAFastQ12(&vect[6], vect, filt, ENH_FLO_MULT2_PLUS1,
-                            ENH_BLOCKL);
-
-  /* Add the contribution from this vector (scaled with gain) to the total
-     surround vector */
-  WebRtcSpl_AddAffineVectorToVector(surround, vect, gain, 32768, 16,
-                                    ENH_BLOCKL);
-
-  return;
-}
diff --git a/modules/audio_coding/codecs/ilbc/refiner.h b/modules/audio_coding/codecs/ilbc/refiner.h
deleted file mode 100644
index f8a2abc..0000000
--- a/modules/audio_coding/codecs/ilbc/refiner.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_Refiner.h
-
-******************************************************************/
-
-#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_REFINER_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_REFINER_H_
-
-#include "defines.h"
-
-/*----------------------------------------------------------------*
- * find segment starting near idata+estSegPos that has highest
- * correlation with idata+centerStartPos through
- * idata+centerStartPos+ENH_BLOCKL-1 segment is found at a
- * resolution of ENH_UPSO times the original of the original
- * sampling rate
- *---------------------------------------------------------------*/
-
-void WebRtcIlbcfix_Refiner(
-    size_t *updStartPos, /* (o) updated start point (Q-2) */
-    int16_t *idata,   /* (i) original data buffer */
-    size_t idatal,   /* (i) dimension of idata */
-    size_t centerStartPos, /* (i) beginning center segment */
-    size_t estSegPos,  /* (i) estimated beginning other segment (Q-2) */
-    int16_t *surround,  /* (i/o) The contribution from this sequence
-                                 summed with earlier contributions */
-    int16_t gain    /* (i) Gain to use for this sequence */
-                           );
-
-#endif
diff --git a/modules/audio_coding/codecs/ilbc/simple_interpolate_lsf.c b/modules/audio_coding/codecs/ilbc/simple_interpolate_lsf.c
deleted file mode 100644
index e63dda8..0000000
--- a/modules/audio_coding/codecs/ilbc/simple_interpolate_lsf.c
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_SimpleInterpolateLsf.c
-
-******************************************************************/
-
-#include "defines.h"
-#include "lsf_interpolate_to_poly_enc.h"
-#include "bw_expand.h"
-#include "constants.h"
-
-/*----------------------------------------------------------------*
- *  lsf interpolator (subrutine to LPCencode)
- *---------------------------------------------------------------*/
-
-void WebRtcIlbcfix_SimpleInterpolateLsf(
-    int16_t *syntdenum, /* (o) the synthesis filter denominator
-                                   resulting from the quantized
-                                   interpolated lsf Q12 */
-    int16_t *weightdenum, /* (o) the weighting filter denominator
-                                   resulting from the unquantized
-                                   interpolated lsf Q12 */
-    int16_t *lsf,  /* (i) the unquantized lsf coefficients Q13 */
-    int16_t *lsfdeq,  /* (i) the dequantized lsf coefficients Q13 */
-    int16_t *lsfold,  /* (i) the unquantized lsf coefficients of
-                                           the previous signal frame Q13 */
-    int16_t *lsfdeqold, /* (i) the dequantized lsf coefficients of the
-                                   previous signal frame Q13 */
-    int16_t length,  /* (i) should equate FILTERORDER */
-    IlbcEncoder *iLBCenc_inst
-    /* (i/o) the encoder state structure */
-                                        ) {
-  size_t i;
-  int pos, lp_length;
-
-  int16_t *lsf2, *lsfdeq2;
-  /* Stack based */
-  int16_t lp[LPC_FILTERORDER + 1];
-
-  lsf2 = lsf + length;
-  lsfdeq2 = lsfdeq + length;
-  lp_length = length + 1;
-
-  if (iLBCenc_inst->mode==30) {
-    /* subframe 1: Interpolation between old and first set of
-       lsf coefficients */
-
-    /* Calculate Analysis/Syntehsis filter from quantized LSF */
-    WebRtcIlbcfix_LsfInterpolate2PloyEnc(lp, lsfdeqold, lsfdeq,
-                                         WebRtcIlbcfix_kLsfWeight30ms[0],
-                                         length);
-    WEBRTC_SPL_MEMCPY_W16(syntdenum, lp, lp_length);
-
-    /* Calculate Weighting filter from quantized LSF */
-    WebRtcIlbcfix_LsfInterpolate2PloyEnc(lp, lsfold, lsf,
-                                         WebRtcIlbcfix_kLsfWeight30ms[0],
-                                         length);
-    WebRtcIlbcfix_BwExpand(weightdenum, lp,
-                           (int16_t*)WebRtcIlbcfix_kLpcChirpWeightDenum,
-                           (int16_t)lp_length);
-
-    /* subframe 2 to 6: Interpolation between first and second
-       set of lsf coefficients */
-
-    pos = lp_length;
-    for (i = 1; i < iLBCenc_inst->nsub; i++) {
-
-      /* Calculate Analysis/Syntehsis filter from quantized LSF */
-      WebRtcIlbcfix_LsfInterpolate2PloyEnc(lp, lsfdeq, lsfdeq2,
-                                           WebRtcIlbcfix_kLsfWeight30ms[i],
-                                           length);
-      WEBRTC_SPL_MEMCPY_W16(syntdenum + pos, lp, lp_length);
-
-      /* Calculate Weighting filter from quantized LSF */
-      WebRtcIlbcfix_LsfInterpolate2PloyEnc(lp, lsf, lsf2,
-                                           WebRtcIlbcfix_kLsfWeight30ms[i],
-                                           length);
-      WebRtcIlbcfix_BwExpand(weightdenum + pos, lp,
-                             (int16_t*)WebRtcIlbcfix_kLpcChirpWeightDenum,
-                             (int16_t)lp_length);
-
-      pos += lp_length;
-    }
-
-    /* update memory */
-
-    WEBRTC_SPL_MEMCPY_W16(lsfold, lsf2, length);
-    WEBRTC_SPL_MEMCPY_W16(lsfdeqold, lsfdeq2, length);
-
-  } else { /* iLBCenc_inst->mode==20 */
-    pos = 0;
-    for (i = 0; i < iLBCenc_inst->nsub; i++) {
-
-      /* Calculate Analysis/Syntehsis filter from quantized LSF */
-      WebRtcIlbcfix_LsfInterpolate2PloyEnc(lp, lsfdeqold, lsfdeq,
-                                           WebRtcIlbcfix_kLsfWeight20ms[i],
-                                           length);
-      WEBRTC_SPL_MEMCPY_W16(syntdenum + pos, lp, lp_length);
-
-      /* Calculate Weighting filter from quantized LSF */
-      WebRtcIlbcfix_LsfInterpolate2PloyEnc(lp, lsfold, lsf,
-                                           WebRtcIlbcfix_kLsfWeight20ms[i],
-                                           length);
-      WebRtcIlbcfix_BwExpand(weightdenum+pos, lp,
-                             (int16_t*)WebRtcIlbcfix_kLpcChirpWeightDenum,
-                             (int16_t)lp_length);
-
-      pos += lp_length;
-    }
-
-    /* update memory */
-
-    WEBRTC_SPL_MEMCPY_W16(lsfold, lsf, length);
-    WEBRTC_SPL_MEMCPY_W16(lsfdeqold, lsfdeq, length);
-
-  }
-
-  return;
-}
diff --git a/modules/audio_coding/codecs/ilbc/simple_interpolate_lsf.h b/modules/audio_coding/codecs/ilbc/simple_interpolate_lsf.h
deleted file mode 100644
index 6abcc00..0000000
--- a/modules/audio_coding/codecs/ilbc/simple_interpolate_lsf.h
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_SimpleInterpolateLsf.h
-
-******************************************************************/
-
-#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_SIMPLE_INTERPOLATE_LSF_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_SIMPLE_INTERPOLATE_LSF_H_
-
-#include "defines.h"
-
-/*----------------------------------------------------------------*
- *  lsf interpolator (subrutine to LPCencode)
- *---------------------------------------------------------------*/
-
-void WebRtcIlbcfix_SimpleInterpolateLsf(
-    int16_t *syntdenum, /* (o) the synthesis filter denominator
-                                   resulting from the quantized
-                                   interpolated lsf Q12 */
-    int16_t *weightdenum, /* (o) the weighting filter denominator
-                                   resulting from the unquantized
-                                   interpolated lsf Q12 */
-    int16_t *lsf,  /* (i) the unquantized lsf coefficients Q13 */
-    int16_t *lsfdeq,  /* (i) the dequantized lsf coefficients Q13 */
-    int16_t *lsfold,  /* (i) the unquantized lsf coefficients of
-                                           the previous signal frame Q13 */
-    int16_t *lsfdeqold, /* (i) the dequantized lsf coefficients of the
-                                   previous signal frame Q13 */
-    int16_t length,  /* (i) should equate FILTERORDER */
-    IlbcEncoder *iLBCenc_inst
-    /* (i/o) the encoder state structure */
-                                        );
-
-#endif
diff --git a/modules/audio_coding/codecs/ilbc/simple_lpc_analysis.c b/modules/audio_coding/codecs/ilbc/simple_lpc_analysis.c
deleted file mode 100644
index 72d80e0..0000000
--- a/modules/audio_coding/codecs/ilbc/simple_lpc_analysis.c
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_SimpleLpcAnalysis.c
-
-******************************************************************/
-
-#include "defines.h"
-#include "window32_w32.h"
-#include "bw_expand.h"
-#include "poly_to_lsf.h"
-#include "constants.h"
-
-/*----------------------------------------------------------------*
- *  lpc analysis (subrutine to LPCencode)
- *---------------------------------------------------------------*/
-
-void WebRtcIlbcfix_SimpleLpcAnalysis(
-    int16_t *lsf,   /* (o) lsf coefficients */
-    int16_t *data,   /* (i) new block of speech */
-    IlbcEncoder *iLBCenc_inst
-    /* (i/o) the encoder state structure */
-                                     ) {
-  int k;
-  int scale;
-  size_t is;
-  int16_t stability;
-  /* Stack based */
-  int16_t A[LPC_FILTERORDER + 1];
-  int32_t R[LPC_FILTERORDER + 1];
-  int16_t windowedData[BLOCKL_MAX];
-  int16_t rc[LPC_FILTERORDER];
-
-  is=LPC_LOOKBACK+BLOCKL_MAX-iLBCenc_inst->blockl;
-  WEBRTC_SPL_MEMCPY_W16(iLBCenc_inst->lpc_buffer+is,data,iLBCenc_inst->blockl);
-
-  /* No lookahead, last window is asymmetric */
-
-  for (k = 0; k < iLBCenc_inst->lpc_n; k++) {
-
-    is = LPC_LOOKBACK;
-
-    if (k < (iLBCenc_inst->lpc_n - 1)) {
-
-      /* Hanning table WebRtcIlbcfix_kLpcWin[] is in Q15-domain so the output is right-shifted 15 */
-      WebRtcSpl_ElementwiseVectorMult(windowedData, iLBCenc_inst->lpc_buffer, WebRtcIlbcfix_kLpcWin, BLOCKL_MAX, 15);
-    } else {
-
-      /* Hanning table WebRtcIlbcfix_kLpcAsymWin[] is in Q15-domain so the output is right-shifted 15 */
-      WebRtcSpl_ElementwiseVectorMult(windowedData, iLBCenc_inst->lpc_buffer+is, WebRtcIlbcfix_kLpcAsymWin, BLOCKL_MAX, 15);
-    }
-
-    /* Compute autocorrelation */
-    WebRtcSpl_AutoCorrelation(windowedData, BLOCKL_MAX, LPC_FILTERORDER, R, &scale);
-
-    /* Window autocorrelation vector */
-    WebRtcIlbcfix_Window32W32(R, R, WebRtcIlbcfix_kLpcLagWin, LPC_FILTERORDER + 1 );
-
-    /* Calculate the A coefficients from the Autocorrelation using Levinson Durbin algorithm */
-    stability=WebRtcSpl_LevinsonDurbin(R, A, rc, LPC_FILTERORDER);
-
-    /*
-       Set the filter to {1.0, 0.0, 0.0,...} if filter from Levinson Durbin algorithm is unstable
-       This should basically never happen...
-    */
-    if (stability!=1) {
-      A[0]=4096;
-      WebRtcSpl_MemSetW16(&A[1], 0, LPC_FILTERORDER);
-    }
-
-    /* Bandwidth expand the filter coefficients */
-    WebRtcIlbcfix_BwExpand(A, A, (int16_t*)WebRtcIlbcfix_kLpcChirpSyntDenum, LPC_FILTERORDER+1);
-
-    /* Convert from A to LSF representation */
-    WebRtcIlbcfix_Poly2Lsf(lsf + k*LPC_FILTERORDER, A);
-  }
-
-  is=LPC_LOOKBACK+BLOCKL_MAX-iLBCenc_inst->blockl;
-  WEBRTC_SPL_MEMCPY_W16(iLBCenc_inst->lpc_buffer,
-                        iLBCenc_inst->lpc_buffer+LPC_LOOKBACK+BLOCKL_MAX-is, is);
-
-  return;
-}
diff --git a/modules/audio_coding/codecs/ilbc/simple_lpc_analysis.h b/modules/audio_coding/codecs/ilbc/simple_lpc_analysis.h
deleted file mode 100644
index 7808da1..0000000
--- a/modules/audio_coding/codecs/ilbc/simple_lpc_analysis.h
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_SimpleLpcAnalysis.h
-
-******************************************************************/
-
-#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_SIMPLE_LPC_ANALYSIS_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_SIMPLE_LPC_ANALYSIS_H_
-
-#include "defines.h"
-
-/*----------------------------------------------------------------*
- *  lpc analysis (subrutine to LPCencode)
- *---------------------------------------------------------------*/
-
-void WebRtcIlbcfix_SimpleLpcAnalysis(
-    int16_t *lsf,   /* (o) lsf coefficients */
-    int16_t *data,   /* (i) new block of speech */
-    IlbcEncoder *iLBCenc_inst
-    /* (i/o) the encoder state structure */
-                                     );
-
-#endif
diff --git a/modules/audio_coding/codecs/ilbc/simple_lsf_dequant.c b/modules/audio_coding/codecs/ilbc/simple_lsf_dequant.c
deleted file mode 100644
index 9fa0d61..0000000
--- a/modules/audio_coding/codecs/ilbc/simple_lsf_dequant.c
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_SimpleLsfDeQ.c
-
-******************************************************************/
-
-#include "defines.h"
-#include "constants.h"
-
-/*----------------------------------------------------------------*
- *  obtain dequantized lsf coefficients from quantization index
- *---------------------------------------------------------------*/
-
-void WebRtcIlbcfix_SimpleLsfDeQ(
-    int16_t *lsfdeq,  /* (o) dequantized lsf coefficients */
-    int16_t *index,  /* (i) quantization index */
-    int16_t lpc_n  /* (i) number of LPCs */
-                                ){
-  int i, j, pos, cb_pos;
-
-  /* decode first LSF */
-
-  pos = 0;
-  cb_pos = 0;
-  for (i = 0; i < LSF_NSPLIT; i++) {
-    for (j = 0; j < WebRtcIlbcfix_kLsfDimCb[i]; j++) {
-      lsfdeq[pos + j] = WebRtcIlbcfix_kLsfCb[cb_pos + j + index[i] *
-                                             WebRtcIlbcfix_kLsfDimCb[i]];
-    }
-    pos += WebRtcIlbcfix_kLsfDimCb[i];
-    cb_pos += WebRtcIlbcfix_kLsfSizeCb[i] * WebRtcIlbcfix_kLsfDimCb[i];
-  }
-
-  if (lpc_n>1) {
-    /* decode last LSF */
-    pos = 0;
-    cb_pos = 0;
-    for (i = 0; i < LSF_NSPLIT; i++) {
-      for (j = 0; j < WebRtcIlbcfix_kLsfDimCb[i]; j++) {
-        lsfdeq[LPC_FILTERORDER + pos + j] = WebRtcIlbcfix_kLsfCb[
-            cb_pos + index[LSF_NSPLIT + i] * WebRtcIlbcfix_kLsfDimCb[i] + j];
-      }
-      pos += WebRtcIlbcfix_kLsfDimCb[i];
-      cb_pos += WebRtcIlbcfix_kLsfSizeCb[i] * WebRtcIlbcfix_kLsfDimCb[i];
-    }
-  }
-  return;
-}
diff --git a/modules/audio_coding/codecs/ilbc/simple_lsf_dequant.h b/modules/audio_coding/codecs/ilbc/simple_lsf_dequant.h
deleted file mode 100644
index 353edb2..0000000
--- a/modules/audio_coding/codecs/ilbc/simple_lsf_dequant.h
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_SimpleLsfDeQ.h
-
-******************************************************************/
-
-#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_SIMPLE_LSF_DEQUANT_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_SIMPLE_LSF_DEQUANT_H_
-
-#include "defines.h"
-
-/*----------------------------------------------------------------*
- *  obtain dequantized lsf coefficients from quantization index
- *---------------------------------------------------------------*/
-
-void WebRtcIlbcfix_SimpleLsfDeQ(
-    int16_t *lsfdeq,  /* (o) dequantized lsf coefficients */
-    int16_t *index,  /* (i) quantization index */
-    int16_t lpc_n  /* (i) number of LPCs */
-                                );
-
-#endif
diff --git a/modules/audio_coding/codecs/ilbc/simple_lsf_quant.c b/modules/audio_coding/codecs/ilbc/simple_lsf_quant.c
deleted file mode 100644
index 8daba50..0000000
--- a/modules/audio_coding/codecs/ilbc/simple_lsf_quant.c
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_SimpleLsfQ.c
-
-******************************************************************/
-
-#include "defines.h"
-#include "split_vq.h"
-#include "constants.h"
-
-/*----------------------------------------------------------------*
- *  lsf quantizer (subrutine to LPCencode)
- *---------------------------------------------------------------*/
-
-void WebRtcIlbcfix_SimpleLsfQ(
-    int16_t *lsfdeq, /* (o) dequantized lsf coefficients
-                                   (dimension FILTERORDER) Q13 */
-    int16_t *index, /* (o) quantization index */
-    int16_t *lsf, /* (i) the lsf coefficient vector to be
-                           quantized (dimension FILTERORDER) Q13 */
-    int16_t lpc_n /* (i) number of lsf sets to quantize */
-                              ){
-
-  /* Quantize first LSF with memoryless split VQ */
-  WebRtcIlbcfix_SplitVq( lsfdeq, index, lsf,
-                         (int16_t*)WebRtcIlbcfix_kLsfCb, (int16_t*)WebRtcIlbcfix_kLsfDimCb, (int16_t*)WebRtcIlbcfix_kLsfSizeCb);
-
-  if (lpc_n==2) {
-    /* Quantize second LSF with memoryless split VQ */
-    WebRtcIlbcfix_SplitVq( lsfdeq + LPC_FILTERORDER, index + LSF_NSPLIT,
-                           lsf + LPC_FILTERORDER, (int16_t*)WebRtcIlbcfix_kLsfCb,
-                           (int16_t*)WebRtcIlbcfix_kLsfDimCb, (int16_t*)WebRtcIlbcfix_kLsfSizeCb);
-  }
-  return;
-}
diff --git a/modules/audio_coding/codecs/ilbc/simple_lsf_quant.h b/modules/audio_coding/codecs/ilbc/simple_lsf_quant.h
deleted file mode 100644
index 94f804b..0000000
--- a/modules/audio_coding/codecs/ilbc/simple_lsf_quant.h
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_SimpleLsfQ.h
-
-******************************************************************/
-
-#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_SIMPLE_LSF_QUANT_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_SIMPLE_LSF_QUANT_H_
-
-#include "defines.h"
-
-/*----------------------------------------------------------------*
- *  lsf quantizer (subrutine to LPCencode)
- *---------------------------------------------------------------*/
-
-void WebRtcIlbcfix_SimpleLsfQ(
-    int16_t *lsfdeq, /* (o) dequantized lsf coefficients
-                                   (dimension FILTERORDER) Q13 */
-    int16_t *index, /* (o) quantization index */
-    int16_t *lsf, /* (i) the lsf coefficient vector to be
-                           quantized (dimension FILTERORDER) Q13 */
-    int16_t lpc_n /* (i) number of lsf sets to quantize */
-                              );
-
-#endif
diff --git a/modules/audio_coding/codecs/ilbc/smooth.c b/modules/audio_coding/codecs/ilbc/smooth.c
deleted file mode 100644
index ed87932..0000000
--- a/modules/audio_coding/codecs/ilbc/smooth.c
+++ /dev/null
@@ -1,210 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_Smooth.c
-
-******************************************************************/
-
-#include "defines.h"
-#include "constants.h"
-#include "smooth_out_data.h"
-
-/*----------------------------------------------------------------*
- * find the smoothed output data
- *---------------------------------------------------------------*/
-
-void WebRtcIlbcfix_Smooth(
-    int16_t *odata,   /* (o) smoothed output */
-    int16_t *current,  /* (i) the un enhanced residual for
-                                this block */
-    int16_t *surround  /* (i) The approximation from the
-                                surrounding sequences */
-                          ) {
-  int16_t scale, scale1, scale2;
-  int16_t A, B, C, denomW16;
-  int32_t B_W32, denom, num;
-  int32_t errs;
-  int32_t w00,w10,w11, endiff, crit;
-  int32_t w00prim, w10prim, w11_div_w00;
-  int16_t w11prim;
-  int16_t bitsw00, bitsw10, bitsw11;
-  int32_t w11w00, w10w10, w00w00;
-  uint32_t max1, max2, max12;
-
-  /* compute some inner products (ensure no overflow by first calculating proper scale factor) */
-
-  w00 = w10 = w11 = 0;
-
-  // Calculate a right shift that will let us sum ENH_BLOCKL pairwise products
-  // of values from the two sequences without overflowing an int32_t. (The +1
-  // in max1 and max2 are because WebRtcSpl_MaxAbsValueW16 will return 2**15 -
-  // 1 if the input array contains -2**15.)
-  max1 = WebRtcSpl_MaxAbsValueW16(current, ENH_BLOCKL) + 1;
-  max2 = WebRtcSpl_MaxAbsValueW16(surround, ENH_BLOCKL) + 1;
-  max12 = WEBRTC_SPL_MAX(max1, max2);
-  scale = (64 - 31) -
-          WebRtcSpl_CountLeadingZeros64((max12 * max12) * (uint64_t)ENH_BLOCKL);
-  scale=WEBRTC_SPL_MAX(0, scale);
-
-  w00=WebRtcSpl_DotProductWithScale(current,current,ENH_BLOCKL,scale);
-  w11=WebRtcSpl_DotProductWithScale(surround,surround,ENH_BLOCKL,scale);
-  w10=WebRtcSpl_DotProductWithScale(surround,current,ENH_BLOCKL,scale);
-
-  if (w00<0) w00 = WEBRTC_SPL_WORD32_MAX;
-  if (w11<0) w11 = WEBRTC_SPL_WORD32_MAX;
-
-  /* Rescale w00 and w11 to w00prim and w11prim, so that w00prim/w11prim
-     is in Q16 */
-
-  bitsw00 = WebRtcSpl_GetSizeInBits(w00);
-  bitsw11 = WebRtcSpl_GetSizeInBits(w11);
-  bitsw10 = WebRtcSpl_GetSizeInBits(WEBRTC_SPL_ABS_W32(w10));
-  scale1 = 31 - bitsw00;
-  scale2 = 15 - bitsw11;
-
-  if (scale2>(scale1-16)) {
-    scale2 = scale1 - 16;
-  } else {
-    scale1 = scale2 + 16;
-  }
-
-  w00prim = w00 << scale1;
-  w11prim = (int16_t) WEBRTC_SPL_SHIFT_W32(w11, scale2);
-
-  /* Perform C = sqrt(w11/w00) (C is in Q11 since (16+6)/2=11) */
-  if (w11prim>64) {
-    endiff = WebRtcSpl_DivW32W16(w00prim, w11prim) << 6;
-    C = (int16_t)WebRtcSpl_SqrtFloor(endiff); /* C is in Q11 */
-  } else {
-    C = 1;
-  }
-
-  /* first try enhancement without power-constraint */
-
-  errs = WebRtcIlbcfix_Smooth_odata(odata, current, surround, C);
-
-
-
-  /* if constraint violated by first try, add constraint */
-
-  if ( (6-scale+scale1) > 31) {
-    crit=0;
-  } else {
-    /* crit = 0.05 * w00 (Result in Q-6) */
-    crit = WEBRTC_SPL_SHIFT_W32(
-        WEBRTC_SPL_MUL(ENH_A0, w00prim >> 14),
-        -(6-scale+scale1));
-  }
-
-  if (errs > crit) {
-
-    if( w00 < 1) {
-      w00=1;
-    }
-
-    /* Calculate w11*w00, w10*w10 and w00*w00 in the same Q domain */
-
-    scale1 = bitsw00-15;
-    scale2 = bitsw11-15;
-
-    if (scale2>scale1) {
-      scale = scale2;
-    } else {
-      scale = scale1;
-    }
-
-    w11w00 = (int16_t)WEBRTC_SPL_SHIFT_W32(w11, -scale) *
-        (int16_t)WEBRTC_SPL_SHIFT_W32(w00, -scale);
-
-    w10w10 = (int16_t)WEBRTC_SPL_SHIFT_W32(w10, -scale) *
-        (int16_t)WEBRTC_SPL_SHIFT_W32(w10, -scale);
-
-    w00w00 = (int16_t)WEBRTC_SPL_SHIFT_W32(w00, -scale) *
-        (int16_t)WEBRTC_SPL_SHIFT_W32(w00, -scale);
-
-    /* Calculate (w11*w00-w10*w10)/(w00*w00) in Q16 */
-    if (w00w00>65536) {
-      endiff = (w11w00-w10w10);
-      endiff = WEBRTC_SPL_MAX(0, endiff);
-      /* denom is in Q16 */
-      denom = WebRtcSpl_DivW32W16(endiff, (int16_t)(w00w00 >> 16));
-    } else {
-      denom = 65536;
-    }
-
-    if( denom > 7){ /* eliminates numerical problems
-                       for if smooth */
-
-      scale=WebRtcSpl_GetSizeInBits(denom)-15;
-
-      if (scale>0) {
-        /* denomW16 is in Q(16+scale) */
-        denomW16 = (int16_t)(denom >> scale);
-
-        /* num in Q(34-scale) */
-        num = ENH_A0_MINUS_A0A0DIV4 >> scale;
-      } else {
-        /* denomW16 is in Q16 */
-        denomW16=(int16_t)denom;
-
-        /* num in Q34 */
-        num=ENH_A0_MINUS_A0A0DIV4;
-      }
-
-      /* A sqrt( (ENH_A0-(ENH_A0^2)/4)*(w00*w00)/(w11*w00 + w10*w10) ) in Q9 */
-      A = (int16_t)WebRtcSpl_SqrtFloor(WebRtcSpl_DivW32W16(num, denomW16));
-
-      /* B_W32 is in Q30 ( B = 1 - ENH_A0/2 - A * w10/w00 ) */
-      scale1 = 31-bitsw10;
-      scale2 = 21-scale1;
-      w10prim = w10 == 0 ? 0 : w10 * (1 << scale1);
-      w00prim = WEBRTC_SPL_SHIFT_W32(w00, -scale2);
-      scale = bitsw00-scale2-15;
-
-      if (scale>0) {
-        w10prim >>= scale;
-        w00prim >>= scale;
-      }
-
-      if ((w00prim>0)&&(w10prim>0)) {
-        w11_div_w00=WebRtcSpl_DivW32W16(w10prim, (int16_t)w00prim);
-
-        if (WebRtcSpl_GetSizeInBits(w11_div_w00)+WebRtcSpl_GetSizeInBits(A)>31) {
-          B_W32 = 0;
-        } else {
-          B_W32 = (int32_t)1073741824 - (int32_t)ENH_A0DIV2 -
-              WEBRTC_SPL_MUL(A, w11_div_w00);
-        }
-        B = (int16_t)(B_W32 >> 16);  /* B in Q14. */
-      } else {
-        /* No smoothing */
-        A = 0;
-        B = 16384; /* 1 in Q14 */
-      }
-    }
-    else{ /* essentially no difference between cycles;
-             smoothing not needed */
-
-      A = 0;
-      B = 16384; /* 1 in Q14 */
-    }
-
-    /* create smoothed sequence */
-
-    WebRtcSpl_ScaleAndAddVectors(surround, A, 9,
-                                current, B, 14,
-                                odata, ENH_BLOCKL);
-  }
-  return;
-}
diff --git a/modules/audio_coding/codecs/ilbc/smooth.h b/modules/audio_coding/codecs/ilbc/smooth.h
deleted file mode 100644
index add0c7b..0000000
--- a/modules/audio_coding/codecs/ilbc/smooth.h
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_Smooth.h
-
-******************************************************************/
-
-#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_SMOOTH_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_SMOOTH_H_
-
-#include "defines.h"
-
-/*----------------------------------------------------------------*
- * find the smoothed output data
- *---------------------------------------------------------------*/
-
-void WebRtcIlbcfix_Smooth(
-    int16_t *odata,   /* (o) smoothed output */
-    int16_t *current,  /* (i) the un enhanced residual for
-                                this block */
-    int16_t *surround  /* (i) The approximation from the
-                                surrounding sequences */
-                          );
-
-#endif
diff --git a/modules/audio_coding/codecs/ilbc/smooth_out_data.c b/modules/audio_coding/codecs/ilbc/smooth_out_data.c
deleted file mode 100644
index 9c41e04..0000000
--- a/modules/audio_coding/codecs/ilbc/smooth_out_data.c
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_Smooth_odata.c
-
-******************************************************************/
-
-#include "defines.h"
-#include "constants.h"
-
-int32_t WebRtcIlbcfix_Smooth_odata(
-    int16_t *odata,
-    int16_t *psseq,
-    int16_t *surround,
-    int16_t C)
-{
-  int i;
-
-  int16_t err;
-  int32_t errs;
-
-  for(i=0;i<80;i++) {
-    odata[i]= (int16_t)((C * surround[i] + 1024) >> 11);
-  }
-
-  errs=0;
-  for(i=0;i<80;i++) {
-    err = (psseq[i] - odata[i]) >> 3;
-    errs += err * err;  /* errs in Q-6 */
-  }
-
-  return errs;
-}
diff --git a/modules/audio_coding/codecs/ilbc/smooth_out_data.h b/modules/audio_coding/codecs/ilbc/smooth_out_data.h
deleted file mode 100644
index 8324439..0000000
--- a/modules/audio_coding/codecs/ilbc/smooth_out_data.h
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_Smooth_odata.h
-
-******************************************************************/
-
-#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_SMOOTH_OUT_DATA_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_SMOOTH_OUT_DATA_H_
-
-#include "defines.h"
-
-/*----------------------------------------------------------------*
- * help function to WebRtcIlbcfix_Smooth()
- *---------------------------------------------------------------*/
-
-int32_t WebRtcIlbcfix_Smooth_odata(
-    int16_t *odata,
-    int16_t *psseq,
-    int16_t *surround,
-    int16_t C);
-
-
-#endif
diff --git a/modules/audio_coding/codecs/ilbc/sort_sq.c b/modules/audio_coding/codecs/ilbc/sort_sq.c
deleted file mode 100644
index c51bf6d..0000000
--- a/modules/audio_coding/codecs/ilbc/sort_sq.c
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_SortSq.c
-
-******************************************************************/
-
-#include "defines.h"
-
-/*----------------------------------------------------------------*
- *  scalar quantization
- *---------------------------------------------------------------*/
-
-void WebRtcIlbcfix_SortSq(
-    int16_t *xq,   /* (o) the quantized value */
-    int16_t *index,  /* (o) the quantization index */
-    int16_t x,   /* (i) the value to quantize */
-    const int16_t *cb, /* (i) the quantization codebook */
-    int16_t cb_size  /* (i) the size of the quantization codebook */
-                          ){
-  int i;
-
-  if (x <= cb[0]) {
-    *index = 0;
-    *xq = cb[0];
-  } else {
-    i = 0;
-    while ((x > cb[i]) && (i < (cb_size-1))) {
-      i++;
-    }
-
-    if (x > (((int32_t)cb[i] + cb[i - 1] + 1) >> 1)) {
-      *index = i;
-      *xq = cb[i];
-    } else {
-      *index = i - 1;
-      *xq = cb[i - 1];
-    }
-  }
-}
diff --git a/modules/audio_coding/codecs/ilbc/sort_sq.h b/modules/audio_coding/codecs/ilbc/sort_sq.h
deleted file mode 100644
index eaf175b..0000000
--- a/modules/audio_coding/codecs/ilbc/sort_sq.h
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_SortSq.h
-
-******************************************************************/
-
-#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_SORT_SQ_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_SORT_SQ_H_
-
-#include "defines.h"
-
-/*----------------------------------------------------------------*
- *  scalar quantization
- *---------------------------------------------------------------*/
-
-void WebRtcIlbcfix_SortSq(
-    int16_t *xq,   /* (o) the quantized value */
-    int16_t *index,  /* (o) the quantization index */
-    int16_t x,   /* (i) the value to quantize */
-    const int16_t *cb, /* (i) the quantization codebook */
-    int16_t cb_size  /* (i) the size of the quantization codebook */
-                           );
-
-#endif
diff --git a/modules/audio_coding/codecs/ilbc/split_vq.c b/modules/audio_coding/codecs/ilbc/split_vq.c
deleted file mode 100644
index 39b6e1b..0000000
--- a/modules/audio_coding/codecs/ilbc/split_vq.c
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_SplitVq.c
-
-******************************************************************/
-
-#include "defines.h"
-#include "constants.h"
-#include "vq3.h"
-#include "vq4.h"
-
-/*----------------------------------------------------------------*
- *  split vector quantization
- *---------------------------------------------------------------*/
-
-void WebRtcIlbcfix_SplitVq(
-    int16_t *qX,  /* (o) the quantized vector in Q13 */
-    int16_t *index, /* (o) a vector of indexes for all vector
-                                   codebooks in the split */
-    int16_t *X,  /* (i) the vector to quantize */
-    int16_t *CB,  /* (i) the quantizer codebook in Q13 */
-    int16_t *dim, /* (i) the dimension of X and qX */
-    int16_t *cbsize /* (i) the number of vectors in the codebook */
-                           ) {
-
-  int16_t *qXPtr, *indexPtr, *CBPtr, *XPtr;
-
-  /* Quantize X with the 3 vectror quantization tables */
-
-  qXPtr=qX;
-  indexPtr=index;
-  CBPtr=CB;
-  XPtr=X;
-  WebRtcIlbcfix_Vq3(qXPtr, indexPtr, CBPtr, XPtr, cbsize[0]);
-
-  qXPtr+=3;
-  indexPtr+=1;
-  CBPtr+=(dim[0]*cbsize[0]);
-  XPtr+=3;
-  WebRtcIlbcfix_Vq3(qXPtr, indexPtr, CBPtr, XPtr, cbsize[1]);
-
-  qXPtr+=3;
-  indexPtr+=1;
-  CBPtr+=(dim[1]*cbsize[1]);
-  XPtr+=3;
-  WebRtcIlbcfix_Vq4(qXPtr, indexPtr, CBPtr, XPtr, cbsize[2]);
-
-  return;
-}
diff --git a/modules/audio_coding/codecs/ilbc/split_vq.h b/modules/audio_coding/codecs/ilbc/split_vq.h
deleted file mode 100644
index 2ca98cb..0000000
--- a/modules/audio_coding/codecs/ilbc/split_vq.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_SplitVq.h
-
-******************************************************************/
-
-#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_SPLIT_VQ_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_SPLIT_VQ_H_
-
-#include "defines.h"
-
-/*----------------------------------------------------------------*
- *  split vector quantization
- *---------------------------------------------------------------*/
-
-void WebRtcIlbcfix_SplitVq(
-    int16_t *qX,  /* (o) the quantized vector in Q13 */
-    int16_t *index, /* (o) a vector of indexes for all vector
-                                   codebooks in the split */
-    int16_t *X,  /* (i) the vector to quantize */
-    int16_t *CB,  /* (i) the quantizer codebook in Q13 */
-    int16_t *dim, /* (i) the dimension of X and qX */
-    int16_t *cbsize /* (i) the number of vectors in the codebook */
-                           );
-
-#endif
diff --git a/modules/audio_coding/codecs/ilbc/state_construct.c b/modules/audio_coding/codecs/ilbc/state_construct.c
deleted file mode 100644
index 29fe91b..0000000
--- a/modules/audio_coding/codecs/ilbc/state_construct.c
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_StateConstruct.c
-
-******************************************************************/
-
-#include "defines.h"
-#include "constants.h"
-
-/*----------------------------------------------------------------*
- *  decoding of the start state
- *---------------------------------------------------------------*/
-
-void WebRtcIlbcfix_StateConstruct(
-    size_t idxForMax,   /* (i) 6-bit index for the quantization of
-                                           max amplitude */
-    int16_t *idxVec,   /* (i) vector of quantization indexes */
-    int16_t *syntDenum,  /* (i) synthesis filter denumerator */
-    int16_t *Out_fix,  /* (o) the decoded state vector */
-    size_t len    /* (i) length of a state vector */
-                                  ) {
-  size_t k;
-  int16_t maxVal;
-  int16_t *tmp1, *tmp2, *tmp3;
-  /* Stack based */
-  int16_t numerator[1+LPC_FILTERORDER];
-  int16_t sampleValVec[2*STATE_SHORT_LEN_30MS+LPC_FILTERORDER];
-  int16_t sampleMaVec[2*STATE_SHORT_LEN_30MS+LPC_FILTERORDER];
-  int16_t *sampleVal = &sampleValVec[LPC_FILTERORDER];
-  int16_t *sampleMa = &sampleMaVec[LPC_FILTERORDER];
-  int16_t *sampleAr = &sampleValVec[LPC_FILTERORDER];
-
-  /* initialization of coefficients */
-
-  for (k=0; k<LPC_FILTERORDER+1; k++){
-    numerator[k] = syntDenum[LPC_FILTERORDER-k];
-  }
-
-  /* decoding of the maximum value */
-
-  maxVal = WebRtcIlbcfix_kFrgQuantMod[idxForMax];
-
-  /* decoding of the sample values */
-  tmp1 = sampleVal;
-  tmp2 = &idxVec[len-1];
-
-  if (idxForMax<37) {
-    for(k=0; k<len; k++){
-      /*the shifting is due to the Q13 in sq4_fixQ13[i], also the adding of 2097152 (= 0.5 << 22)
-        maxVal is in Q8 and result is in Q(-1) */
-      *tmp1 = (int16_t)((maxVal * WebRtcIlbcfix_kStateSq3[*tmp2] + 2097152) >>
-          22);
-      tmp1++;
-      tmp2--;
-    }
-  } else if (idxForMax<59) {
-    for(k=0; k<len; k++){
-      /*the shifting is due to the Q13 in sq4_fixQ13[i], also the adding of 262144 (= 0.5 << 19)
-        maxVal is in Q5 and result is in Q(-1) */
-      *tmp1 = (int16_t)((maxVal * WebRtcIlbcfix_kStateSq3[*tmp2] + 262144) >>
-          19);
-      tmp1++;
-      tmp2--;
-    }
-  } else {
-    for(k=0; k<len; k++){
-      /*the shifting is due to the Q13 in sq4_fixQ13[i], also the adding of 65536 (= 0.5 << 17)
-        maxVal is in Q3 and result is in Q(-1) */
-      *tmp1 = (int16_t)((maxVal * WebRtcIlbcfix_kStateSq3[*tmp2] + 65536) >>
-          17);
-      tmp1++;
-      tmp2--;
-    }
-  }
-
-  /* Set the rest of the data to zero */
-  WebRtcSpl_MemSetW16(&sampleVal[len], 0, len);
-
-  /* circular convolution with all-pass filter */
-
-  /* Set the state to zero */
-  WebRtcSpl_MemSetW16(sampleValVec, 0, (LPC_FILTERORDER));
-
-  /* Run MA filter + AR filter */
-  WebRtcSpl_FilterMAFastQ12(
-      sampleVal, sampleMa,
-      numerator, LPC_FILTERORDER+1, len + LPC_FILTERORDER);
-  WebRtcSpl_MemSetW16(&sampleMa[len + LPC_FILTERORDER], 0, (len - LPC_FILTERORDER));
-  WebRtcSpl_FilterARFastQ12(
-      sampleMa, sampleAr,
-      syntDenum, LPC_FILTERORDER+1, 2 * len);
-
-  tmp1 = &sampleAr[len-1];
-  tmp2 = &sampleAr[2*len-1];
-  tmp3 = Out_fix;
-  for(k=0;k<len;k++){
-    (*tmp3) = (*tmp1) + (*tmp2);
-    tmp1--;
-    tmp2--;
-    tmp3++;
-  }
-}
diff --git a/modules/audio_coding/codecs/ilbc/state_construct.h b/modules/audio_coding/codecs/ilbc/state_construct.h
deleted file mode 100644
index 2631919..0000000
--- a/modules/audio_coding/codecs/ilbc/state_construct.h
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_StateConstruct.h
-
-******************************************************************/
-
-#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_STATE_CONSTRUCT_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_STATE_CONSTRUCT_H_
-
-/*----------------------------------------------------------------*
- *  Generate the start state from the quantized indexes
- *---------------------------------------------------------------*/
-
-void WebRtcIlbcfix_StateConstruct(
-    size_t idxForMax,   /* (i) 6-bit index for the quantization of
-                                           max amplitude */
-    int16_t *idxVec,   /* (i) vector of quantization indexes */
-    int16_t *syntDenum,  /* (i) synthesis filter denumerator */
-    int16_t *Out_fix,  /* (o) the decoded state vector */
-    size_t len    /* (i) length of a state vector */
-                                  );
-
-#endif
diff --git a/modules/audio_coding/codecs/ilbc/state_search.c b/modules/audio_coding/codecs/ilbc/state_search.c
deleted file mode 100644
index 295c543..0000000
--- a/modules/audio_coding/codecs/ilbc/state_search.c
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_StateSearch.c
-
-******************************************************************/
-
-#include "defines.h"
-#include "constants.h"
-#include "abs_quant.h"
-
-/*----------------------------------------------------------------*
- *  encoding of start state
- *---------------------------------------------------------------*/
-
-void WebRtcIlbcfix_StateSearch(
-    IlbcEncoder *iLBCenc_inst,
-    /* (i) Encoder instance */
-    iLBC_bits *iLBC_encbits,/* (i/o) Encoded bits (output idxForMax
-                               and idxVec, input state_first) */
-    int16_t *residual,   /* (i) target residual vector */
-    int16_t *syntDenum,  /* (i) lpc synthesis filter */
-    int16_t *weightDenum  /* (i) weighting filter denuminator */
-                               ) {
-  size_t k, index;
-  int16_t maxVal;
-  int16_t scale, shift;
-  int32_t maxValsq;
-  int16_t scaleRes;
-  int16_t max;
-  int i;
-  /* Stack based */
-  int16_t numerator[1+LPC_FILTERORDER];
-  int16_t residualLongVec[2*STATE_SHORT_LEN_30MS+LPC_FILTERORDER];
-  int16_t sampleMa[2*STATE_SHORT_LEN_30MS];
-  int16_t *residualLong = &residualLongVec[LPC_FILTERORDER];
-  int16_t *sampleAr = residualLong;
-
-  /* Scale to maximum 12 bits to avoid saturation in circular convolution filter */
-  max = WebRtcSpl_MaxAbsValueW16(residual, iLBCenc_inst->state_short_len);
-  scaleRes = WebRtcSpl_GetSizeInBits(max)-12;
-  scaleRes = WEBRTC_SPL_MAX(0, scaleRes);
-  /* Set up the filter coefficients for the circular convolution */
-  for (i=0; i<LPC_FILTERORDER+1; i++) {
-    numerator[i] = (syntDenum[LPC_FILTERORDER-i]>>scaleRes);
-  }
-
-  /* Copy the residual to a temporary buffer that we can filter
-   * and set the remaining samples to zero.
-   */
-  WEBRTC_SPL_MEMCPY_W16(residualLong, residual, iLBCenc_inst->state_short_len);
-  WebRtcSpl_MemSetW16(residualLong + iLBCenc_inst->state_short_len, 0, iLBCenc_inst->state_short_len);
-
-  /* Run the Zero-Pole filter (Ciurcular convolution) */
-  WebRtcSpl_MemSetW16(residualLongVec, 0, LPC_FILTERORDER);
-  WebRtcSpl_FilterMAFastQ12(residualLong, sampleMa, numerator,
-                            LPC_FILTERORDER + 1,
-                            iLBCenc_inst->state_short_len + LPC_FILTERORDER);
-  WebRtcSpl_MemSetW16(&sampleMa[iLBCenc_inst->state_short_len + LPC_FILTERORDER], 0, iLBCenc_inst->state_short_len - LPC_FILTERORDER);
-
-  WebRtcSpl_FilterARFastQ12(
-      sampleMa, sampleAr,
-      syntDenum, LPC_FILTERORDER+1, 2 * iLBCenc_inst->state_short_len);
-
-  for(k=0;k<iLBCenc_inst->state_short_len;k++){
-    sampleAr[k] += sampleAr[k+iLBCenc_inst->state_short_len];
-  }
-
-  /* Find maximum absolute value in the vector */
-  maxVal=WebRtcSpl_MaxAbsValueW16(sampleAr, iLBCenc_inst->state_short_len);
-
-  /* Find the best index */
-
-  if ((((int32_t)maxVal)<<scaleRes)<23170) {
-    maxValsq=((int32_t)maxVal*maxVal)<<(2+2*scaleRes);
-  } else {
-    maxValsq=(int32_t)WEBRTC_SPL_WORD32_MAX;
-  }
-
-  index=0;
-  for (i=0;i<63;i++) {
-
-    if (maxValsq>=WebRtcIlbcfix_kChooseFrgQuant[i]) {
-      index=i+1;
-    } else {
-      i=63;
-    }
-  }
-  iLBC_encbits->idxForMax=index;
-
-  /* Rescale the vector before quantization */
-  scale=WebRtcIlbcfix_kScale[index];
-
-  if (index<27) { /* scale table is in Q16, fout[] is in Q(-1) and we want the result to be in Q11 */
-    shift=4;
-  } else { /* scale table is in Q21, fout[] is in Q(-1) and we want the result to be in Q11 */
-    shift=9;
-  }
-
-  /* Set up vectors for AbsQuant and rescale it with the scale factor */
-  WebRtcSpl_ScaleVectorWithSat(sampleAr, sampleAr, scale,
-                              iLBCenc_inst->state_short_len, (int16_t)(shift-scaleRes));
-
-  /* Quantize the values in fout[] */
-  WebRtcIlbcfix_AbsQuant(iLBCenc_inst, iLBC_encbits, sampleAr, weightDenum);
-
-  return;
-}
diff --git a/modules/audio_coding/codecs/ilbc/state_search.h b/modules/audio_coding/codecs/ilbc/state_search.h
deleted file mode 100644
index 800beac..0000000
--- a/modules/audio_coding/codecs/ilbc/state_search.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_StateSearch.h
-
-******************************************************************/
-
-#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_STATE_SEARCH_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_STATE_SEARCH_H_
-
-#include "defines.h"
-
-/*----------------------------------------------------------------*
- *  encoding of start state
- *---------------------------------------------------------------*/
-
-void WebRtcIlbcfix_StateSearch(
-    IlbcEncoder *iLBCenc_inst,
-    /* (i) Encoder instance */
-    iLBC_bits *iLBC_encbits,/* (i/o) Encoded bits (output idxForMax
-                               and idxVec, input state_first) */
-    int16_t *residual,   /* (i) target residual vector */
-    int16_t *syntDenum,  /* (i) lpc synthesis filter */
-    int16_t *weightDenum  /* (i) weighting filter denuminator */
-                               );
-
-#endif
diff --git a/modules/audio_coding/codecs/ilbc/swap_bytes.c b/modules/audio_coding/codecs/ilbc/swap_bytes.c
deleted file mode 100644
index b795e56..0000000
--- a/modules/audio_coding/codecs/ilbc/swap_bytes.c
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- *  Copyright (c) 2012 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_SwapBytes.c
-
-******************************************************************/
-
-#include "defines.h"
-
-/*----------------------------------------------------------------*
- * Swap bytes (to simplify operations on Little Endian machines)
- *---------------------------------------------------------------*/
-
-void WebRtcIlbcfix_SwapBytes(
-    const uint16_t* input,   /* (i) the sequence to swap */
-    size_t wordLength,      /* (i) number or uint16_t to swap */
-    uint16_t* output         /* (o) the swapped sequence */
-                              ) {
-  size_t k;
-  for (k = wordLength; k > 0; k--) {
-    *output++ = (*input >> 8)|(*input << 8);
-    input++;
-  }
-}
diff --git a/modules/audio_coding/codecs/ilbc/swap_bytes.h b/modules/audio_coding/codecs/ilbc/swap_bytes.h
deleted file mode 100644
index a4484d6..0000000
--- a/modules/audio_coding/codecs/ilbc/swap_bytes.h
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- *  Copyright (c) 2012 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_SwapBytes.h
-
-******************************************************************/
-
-#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_SWAP_BYTES_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_SWAP_BYTES_H_
-
-#include "defines.h"
-
-/*----------------------------------------------------------------*
- * Swap bytes (to simplify operations on Little Endian machines)
- *---------------------------------------------------------------*/
-
-void WebRtcIlbcfix_SwapBytes(
-    const uint16_t* input,   /* (i) the sequence to swap */
-    size_t wordLength,      /* (i) number or uint16_t to swap */
-    uint16_t* output         /* (o) the swapped sequence */
-                              );
-
-#endif
diff --git a/modules/audio_coding/codecs/ilbc/test/empty.cc b/modules/audio_coding/codecs/ilbc/test/empty.cc
deleted file mode 100644
index e69de29..0000000
--- a/modules/audio_coding/codecs/ilbc/test/empty.cc
+++ /dev/null
diff --git a/modules/audio_coding/codecs/ilbc/test/iLBC_test.c b/modules/audio_coding/codecs/ilbc/test/iLBC_test.c
deleted file mode 100644
index b440c7a..0000000
--- a/modules/audio_coding/codecs/ilbc/test/iLBC_test.c
+++ /dev/null
@@ -1,240 +0,0 @@
-/*
- *  Copyright (c) 2012 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.
- */
-
-/******************************************************************
-
-	iLBC Speech Coder ANSI-C Source Code
-
-        iLBC_test.c
-
-******************************************************************/
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include "webrtc/modules/audio_coding/codecs/ilbc/ilbc.h"
-
-/*---------------------------------------------------------------*
- *  Main program to test iLBC encoding and decoding
- *
- *  Usage:
- *	  exefile_name.exe <infile> <bytefile> <outfile> <channel>
- *
- *    <infile>   : Input file, speech for encoder (16-bit pcm file)
- *    <bytefile> : Bit stream output from the encoder
- *    <outfile>  : Output file, decoded speech (16-bit pcm file)
- *    <channel>  : Bit error file, optional (16-bit)
- *                     1 - Packet received correctly
- *                     0 - Packet Lost
- *
- *--------------------------------------------------------------*/
-
-#define BLOCKL_MAX			240
-#define ILBCNOOFWORDS_MAX	25
-
-
-int main(int argc, char* argv[])
-{
-
-  FILE *ifileid,*efileid,*ofileid, *cfileid;
-  int16_t data[BLOCKL_MAX];
-  uint8_t encoded_data[2 * ILBCNOOFWORDS_MAX];
-  int16_t decoded_data[BLOCKL_MAX];
-  int len_int, mode;
-  short pli;
-  int blockcount = 0;
-  int packetlosscount = 0;
-  size_t frameLen, len, len_i16s;
-  int16_t speechType;
-  IlbcEncoderInstance *Enc_Inst;
-  IlbcDecoderInstance *Dec_Inst;
-
-#ifdef __ILBC_WITH_40BITACC
-  /* Doublecheck that long long exists */
-  if (sizeof(long)>=sizeof(long long)) {
-    fprintf(stderr, "40-bit simulation is not be supported on this platform\n");
-    exit(0);
-  }
-#endif
-
-  /* get arguments and open files */
-
-  if ((argc!=5) && (argc!=6)) {
-    fprintf(stderr,
-            "\n*-----------------------------------------------*\n");
-    fprintf(stderr,
-            "   %s <20,30> input encoded decoded (channel)\n\n",
-            argv[0]);
-    fprintf(stderr,
-            "   mode    : Frame size for the encoding/decoding\n");
-    fprintf(stderr,
-            "                 20 - 20 ms\n");
-    fprintf(stderr,
-            "                 30 - 30 ms\n");
-    fprintf(stderr,
-            "   input   : Speech for encoder (16-bit pcm file)\n");
-    fprintf(stderr,
-            "   encoded : Encoded bit stream\n");
-    fprintf(stderr,
-            "   decoded : Decoded speech (16-bit pcm file)\n");
-    fprintf(stderr,
-            "   channel : Packet loss pattern, optional (16-bit)\n");
-    fprintf(stderr,
-            "                  1 - Packet received correctly\n");
-    fprintf(stderr,
-            "                  0 - Packet Lost\n");
-    fprintf(stderr,
-            "*-----------------------------------------------*\n\n");
-    exit(1);
-  }
-  mode=atoi(argv[1]);
-  if (mode != 20 && mode != 30) {
-    fprintf(stderr,"Wrong mode %s, must be 20, or 30\n",
-            argv[1]);
-    exit(2);
-  }
-  if ( (ifileid=fopen(argv[2],"rb")) == NULL) {
-    fprintf(stderr,"Cannot open input file %s\n", argv[2]);
-    exit(2);}
-  if ( (efileid=fopen(argv[3],"wb")) == NULL) {
-    fprintf(stderr, "Cannot open encoded file file %s\n",
-            argv[3]); exit(1);}
-  if ( (ofileid=fopen(argv[4],"wb")) == NULL) {
-    fprintf(stderr, "Cannot open decoded file %s\n",
-            argv[4]); exit(1);}
-  if (argc==6) {
-    if( (cfileid=fopen(argv[5],"rb")) == NULL) {
-      fprintf(stderr, "Cannot open channel file %s\n",
-              argv[5]);
-      exit(1);
-    }
-  } else {
-    cfileid=NULL;
-  }
-
-  /* print info */
-
-  fprintf(stderr, "\n");
-  fprintf(stderr,
-          "*---------------------------------------------------*\n");
-  fprintf(stderr,
-          "*                                                   *\n");
-  fprintf(stderr,
-          "*      iLBC test program                            *\n");
-  fprintf(stderr,
-          "*                                                   *\n");
-  fprintf(stderr,
-          "*                                                   *\n");
-  fprintf(stderr,
-          "*---------------------------------------------------*\n");
-  fprintf(stderr,"\nMode           : %2d ms\n", mode);
-  fprintf(stderr,"Input file     : %s\n", argv[2]);
-  fprintf(stderr,"Encoded file   : %s\n", argv[3]);
-  fprintf(stderr,"Output file    : %s\n", argv[4]);
-  if (argc==6) {
-    fprintf(stderr,"Channel file   : %s\n", argv[5]);
-  }
-  fprintf(stderr,"\n");
-
-  /* Create structs */
-  WebRtcIlbcfix_EncoderCreate(&Enc_Inst);
-  WebRtcIlbcfix_DecoderCreate(&Dec_Inst);
-
-
-  /* Initialization */
-
-  WebRtcIlbcfix_EncoderInit(Enc_Inst, mode);
-  WebRtcIlbcfix_DecoderInit(Dec_Inst, mode);
-  frameLen = (size_t)(mode*8);
-
-  /* loop over input blocks */
-
-  while (fread(data,sizeof(int16_t),frameLen,ifileid) == frameLen) {
-
-    blockcount++;
-
-    /* encoding */
-
-    fprintf(stderr, "--- Encoding block %i --- ",blockcount);
-    len_int = WebRtcIlbcfix_Encode(Enc_Inst, data, frameLen, encoded_data);
-    if (len_int < 0) {
-      fprintf(stderr, "Error encoding\n");
-      exit(0);
-    }
-    len = (size_t)len_int;
-    fprintf(stderr, "\r");
-
-    /* write byte file */
-
-    len_i16s = (len + 1) / sizeof(int16_t);
-    if (fwrite(encoded_data, sizeof(int16_t), len_i16s, efileid) != len_i16s) {
-      return -1;
-    }
-
-    /* get channel data if provided */
-    if (argc==6) {
-      if (fread(&pli, sizeof(int16_t), 1, cfileid)) {
-        if ((pli!=0)&&(pli!=1)) {
-          fprintf(stderr, "Error in channel file\n");
-          exit(0);
-        }
-        if (pli==0) {
-          /* Packet loss -> remove info from frame */
-          memset(encoded_data, 0,
-                 sizeof(int16_t)*ILBCNOOFWORDS_MAX);
-          packetlosscount++;
-        }
-      } else {
-        fprintf(stderr, "Error. Channel file too short\n");
-        exit(0);
-      }
-    } else {
-      pli=1;
-    }
-
-    /* decoding */
-
-    fprintf(stderr, "--- Decoding block %i --- ",blockcount);
-    if (pli==1) {
-      len_int=WebRtcIlbcfix_Decode(Dec_Inst, encoded_data,
-                                   len, decoded_data,&speechType);
-      if (len_int < 0) {
-        fprintf(stderr, "Error decoding\n");
-        exit(0);
-      }
-      len = (size_t)len_int;
-    } else {
-      len=WebRtcIlbcfix_DecodePlc(Dec_Inst, decoded_data, 1);
-    }
-    fprintf(stderr, "\r");
-
-    /* write output file */
-
-    if (fwrite(decoded_data, sizeof(int16_t), len, ofileid) != len) {
-      return -1;
-    }
-  }
-
-  /* close files */
-
-  fclose(ifileid);  fclose(efileid); fclose(ofileid);
-  if (argc==6) {
-    fclose(cfileid);
-  }
-
-  /* Free structs */
-  WebRtcIlbcfix_EncoderFree(Enc_Inst);
-  WebRtcIlbcfix_DecoderFree(Dec_Inst);
-
-
-  printf("\nDone with simulation\n\n");
-
-  return(0);
-}
diff --git a/modules/audio_coding/codecs/ilbc/test/iLBC_testLib.c b/modules/audio_coding/codecs/ilbc/test/iLBC_testLib.c
deleted file mode 100644
index 7ffa4a7..0000000
--- a/modules/audio_coding/codecs/ilbc/test/iLBC_testLib.c
+++ /dev/null
@@ -1,215 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
-iLBC Speech Coder ANSI-C Source Code
-
-iLBC_test.c
-
-******************************************************************/
-
-#include <math.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <time.h>
-#include "webrtc/modules/audio_coding/codecs/ilbc/ilbc.h"
-
-//#define JUNK_DATA
-#ifdef JUNK_DATA
-#define SEED_FILE "randseed.txt"
-#endif
-
-
-/*----------------------------------------------------------------*
-*  Main program to test iLBC encoding and decoding
-*
-*  Usage:
-*		exefile_name.exe <infile> <bytefile> <outfile>
-*
-*---------------------------------------------------------------*/
-
-int main(int argc, char* argv[])
-{
-  FILE *ifileid,*efileid,*ofileid, *chfileid;
-  short encoded_data[55], data[240], speechType;
-  int len_int, mode;
-  short pli;
-  size_t len, readlen;
-  int blockcount = 0;
-
-  IlbcEncoderInstance *Enc_Inst;
-  IlbcDecoderInstance *Dec_Inst;
-#ifdef JUNK_DATA
-  size_t i;
-  FILE *seedfile;
-  unsigned int random_seed = (unsigned int) time(NULL);//1196764538
-#endif
-
-  /* Create structs */
-  WebRtcIlbcfix_EncoderCreate(&Enc_Inst);
-  WebRtcIlbcfix_DecoderCreate(&Dec_Inst);
-
-  /* get arguments and open files */
-
-  if (argc != 6 ) {
-    fprintf(stderr, "%s mode inputfile bytefile outputfile channelfile\n",
-            argv[0]);
-    fprintf(stderr, "Example:\n");
-    fprintf(stderr, "%s <30,20> in.pcm byte.dat out.pcm T30.0.dat\n", argv[0]);
-    exit(1);
-  }
-  mode=atoi(argv[1]);
-  if (mode != 20 && mode != 30) {
-    fprintf(stderr,"Wrong mode %s, must be 20, or 30\n", argv[1]);
-    exit(2);
-  }
-  if ( (ifileid=fopen(argv[2],"rb")) == NULL) {
-    fprintf(stderr,"Cannot open input file %s\n", argv[2]);
-    exit(2);}
-  if ( (efileid=fopen(argv[3],"wb")) == NULL) {
-    fprintf(stderr, "Cannot open channelfile file %s\n",
-            argv[3]); exit(3);}
-  if( (ofileid=fopen(argv[4],"wb")) == NULL) {
-    fprintf(stderr, "Cannot open output file %s\n",
-            argv[4]); exit(3);}
-  if ( (chfileid=fopen(argv[5],"rb")) == NULL) {
-    fprintf(stderr,"Cannot open channel file file %s\n", argv[5]);
-    exit(2);
-  }
-  /* print info */
-  fprintf(stderr, "\n");
-  fprintf(stderr,
-          "*---------------------------------------------------*\n");
-  fprintf(stderr,
-          "*                                                   *\n");
-  fprintf(stderr,
-          "*      iLBCtest                                     *\n");
-  fprintf(stderr,
-          "*                                                   *\n");
-  fprintf(stderr,
-          "*                                                   *\n");
-  fprintf(stderr,
-		"*---------------------------------------------------*\n");
-#ifdef SPLIT_10MS
-  fprintf(stderr,"\n10ms split with raw mode: %2d ms\n", mode);
-#else
-  fprintf(stderr,"\nMode          : %2d ms\n", mode);
-#endif
-  fprintf(stderr,"\nInput file    : %s\n", argv[2]);
-  fprintf(stderr,"Coded file    : %s\n", argv[3]);
-  fprintf(stderr,"Output file   : %s\n\n", argv[4]);
-  fprintf(stderr,"Channel file  : %s\n\n", argv[5]);
-
-#ifdef JUNK_DATA
-  srand(random_seed);
-
-  if ( (seedfile = fopen(SEED_FILE, "a+t") ) == NULL ) {
-    fprintf(stderr, "Error: Could not open file %s\n", SEED_FILE);
-  }
-  else {
-    fprintf(seedfile, "%u\n", random_seed);
-    fclose(seedfile);
-  }
-#endif
-
-  /* Initialization */
-  WebRtcIlbcfix_EncoderInit(Enc_Inst, mode);
-  WebRtcIlbcfix_DecoderInit(Dec_Inst, mode);
-
-  /* loop over input blocks */
-#ifdef SPLIT_10MS
-  readlen = 80;
-#else
-  readlen = (size_t)(mode << 3);
-#endif
-  while(fread(data, sizeof(short), readlen, ifileid) == readlen) {
-    blockcount++;
-
-    /* encoding */
-    fprintf(stderr, "--- Encoding block %i --- ",blockcount);
-    len_int=WebRtcIlbcfix_Encode(Enc_Inst, data, readlen, encoded_data);
-    if (len_int < 0) {
-      fprintf(stderr, "Error encoding\n");
-      exit(0);
-    }
-    len = (size_t)len_int;
-    fprintf(stderr, "\r");
-
-#ifdef JUNK_DATA
-    for ( i = 0; i < len; i++) {
-      encoded_data[i] = (short) (encoded_data[i] + (short) rand());
-    }
-#endif
-    /* write byte file */
-    if(len != 0){ //len may be 0 in 10ms split case
-      fwrite(encoded_data,1,len,efileid);
-
-      /* get channel data if provided */
-      if (argc==6) {
-        if (fread(&pli, sizeof(int16_t), 1, chfileid)) {
-          if ((pli!=0)&&(pli!=1)) {
-            fprintf(stderr, "Error in channel file\n");
-            exit(0);
-          }
-          if (pli==0) {
-            /* Packet loss -> remove info from frame */
-            memset(encoded_data, 0, sizeof(int16_t)*25);
-          }
-        } else {
-          fprintf(stderr, "Error. Channel file too short\n");
-          exit(0);
-        }
-      } else {
-        pli=1;
-      }
-
-      /* decoding */
-      fprintf(stderr, "--- Decoding block %i --- ",blockcount);
-      if (pli==1) {
-        len_int = WebRtcIlbcfix_Decode(Dec_Inst, encoded_data, len, data,
-                                       &speechType);
-        if (len_int < 0) {
-          fprintf(stderr, "Error decoding\n");
-          exit(0);
-        }
-        len = (size_t)len_int;
-      } else {
-        len=WebRtcIlbcfix_DecodePlc(Dec_Inst, data, 1);
-      }
-      fprintf(stderr, "\r");
-
-      /* write output file */
-      fwrite(data,sizeof(short),len,ofileid);
-    }
-  }
-
-#ifdef JUNK_DATA
-  if ( (seedfile = fopen(SEED_FILE, "a+t") ) == NULL ) {
-    fprintf(stderr, "Error: Could not open file %s\n", SEED_FILE);
-  }
-  else {
-    fprintf(seedfile, "ok\n\n");
-    fclose(seedfile);
-  }
-#endif
-
-  /* free structs */
-  WebRtcIlbcfix_EncoderFree(Enc_Inst);
-  WebRtcIlbcfix_DecoderFree(Dec_Inst);
-
-  /* close files */
-  fclose(ifileid);
-  fclose(efileid);
-  fclose(ofileid);
-
-  return 0;
-}
diff --git a/modules/audio_coding/codecs/ilbc/test/iLBC_testprogram.c b/modules/audio_coding/codecs/ilbc/test/iLBC_testprogram.c
deleted file mode 100644
index 5454948..0000000
--- a/modules/audio_coding/codecs/ilbc/test/iLBC_testprogram.c
+++ /dev/null
@@ -1,343 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
-	iLBC Speech Coder ANSI-C Source Code
-
-        iLBC_test.c
-
-******************************************************************/
-
-#include <math.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-
-#include "webrtc/modules/audio_coding/codecs/ilbc/defines.h"
-#include "webrtc/modules/audio_coding/codecs/ilbc/nit_encode.h"
-#include "webrtc/modules/audio_coding/codecs/ilbc/encode.h"
-#include "webrtc/modules/audio_coding/codecs/ilbc/init_decode.h"
-#include "webrtc/modules/audio_coding/codecs/ilbc/decode.h"
-#include "webrtc/modules/audio_coding/codecs/ilbc/constants.h"
-#include "webrtc/modules/audio_coding/codecs/ilbc/ilbc.h"
-
-#define ILBCNOOFWORDS_MAX (NO_OF_BYTES_30MS)/2
-
-/* Runtime statistics */
-#include <time.h>
-/* #define CLOCKS_PER_SEC  1000 */
-
-/*----------------------------------------------------------------*
- *  Encoder interface function
- *---------------------------------------------------------------*/
-
-short encode(                         /* (o) Number of bytes encoded */
-    IlbcEncoder *iLBCenc_inst,    /* (i/o) Encoder instance */
-    int16_t *encoded_data,      /* (o) The encoded bytes */
-    int16_t *data               /* (i) The signal block to encode */
-                                                        ){
-
-  /* do the actual encoding */
-  WebRtcIlbcfix_Encode((uint16_t *)encoded_data, data, iLBCenc_inst);
-
-  return (iLBCenc_inst->no_of_bytes);
-}
-
-/*----------------------------------------------------------------*
- *  Decoder interface function
- *---------------------------------------------------------------*/
-
-short decode( /* (o) Number of decoded samples */
-    IlbcDecoder *iLBCdec_inst, /* (i/o) Decoder instance */
-    short *decoded_data, /* (o) Decoded signal block */
-    short *encoded_data, /* (i) Encoded bytes */
-    short mode           /* (i) 0=PL, 1=Normal */
-              ){
-
-  /* check if mode is valid */
-
-  if (mode<0 || mode>1) {
-    printf("\nERROR - Wrong mode - 0, 1 allowed\n"); exit(3);}
-
-  /* do actual decoding of block */
-
-  WebRtcIlbcfix_Decode(decoded_data, (uint16_t *)encoded_data,
-                       iLBCdec_inst, mode);
-
-  return (iLBCdec_inst->blockl);
-}
-
-/*----------------------------------------------------------------*
- *  Main program to test iLBC encoding and decoding
- *
- *  Usage:
- *		exefile_name.exe <infile> <bytefile> <outfile> <channelfile>
- *
- *---------------------------------------------------------------*/
-
-#define MAXFRAMES   10000
-#define MAXFILELEN (BLOCKL_MAX*MAXFRAMES)
-
-int main(int argc, char* argv[])
-{
-
-  /* Runtime statistics */
-
-  float starttime1, starttime2;
-  float runtime1, runtime2;
-  float outtime;
-
-  FILE *ifileid,*efileid,*ofileid, *chfileid;
-  short *inputdata, *encodeddata, *decodeddata;
-  short *channeldata;
-  int blockcount = 0, noOfBlocks=0, i, noOfLostBlocks=0;
-  short mode;
-  IlbcEncoder Enc_Inst;
-  IlbcDecoder Dec_Inst;
-
-  short frameLen;
-  short count;
-#ifdef SPLIT_10MS
-  short size;
-#endif
-
-  inputdata=(short*) malloc(MAXFILELEN*sizeof(short));
-  if (inputdata==NULL) {
-    fprintf(stderr,"Could not allocate memory for vector\n");
-    exit(0);
-  }
-  encodeddata=(short*) malloc(ILBCNOOFWORDS_MAX*MAXFRAMES*sizeof(short));
-  if (encodeddata==NULL) {
-    fprintf(stderr,"Could not allocate memory for vector\n");
-    free(inputdata);
-    exit(0);
-  }
-  decodeddata=(short*) malloc(MAXFILELEN*sizeof(short));
-  if (decodeddata==NULL) {
-    fprintf(stderr,"Could not allocate memory for vector\n");
-    free(inputdata);
-    free(encodeddata);
-    exit(0);
-  }
-  channeldata=(short*) malloc(MAXFRAMES*sizeof(short));
-  if (channeldata==NULL) {
-    fprintf(stderr,"Could not allocate memory for vector\n");
-    free(inputdata);
-    free(encodeddata);
-    free(decodeddata);
-    exit(0);
-  }
-
-  /* get arguments and open files */
-
-  if (argc != 6 ) {
-    fprintf(stderr, "%s mode inputfile bytefile outputfile channelfile\n",
-            argv[0]);
-    fprintf(stderr, "Example:\n");
-    fprintf(stderr, "%s <30,20> in.pcm byte.dat out.pcm T30.0.dat\n", argv[0]);
-    exit(1);
-  }
-  mode=atoi(argv[1]);
-  if (mode != 20 && mode != 30) {
-    fprintf(stderr,"Wrong mode %s, must be 20, or 30\n", argv[1]);
-    exit(2);
-  }
-  if ( (ifileid=fopen(argv[2],"rb")) == NULL) {
-    fprintf(stderr,"Cannot open input file %s\n", argv[2]);
-    exit(2);}
-  if ( (efileid=fopen(argv[3],"wb")) == NULL) {
-    fprintf(stderr, "Cannot open channelfile file %s\n",
-            argv[3]); exit(3);}
-  if( (ofileid=fopen(argv[4],"wb")) == NULL) {
-    fprintf(stderr, "Cannot open output file %s\n",
-            argv[4]); exit(3);}
-  if ( (chfileid=fopen(argv[5],"rb")) == NULL) {
-    fprintf(stderr,"Cannot open channel file file %s\n", argv[5]);
-    exit(2);}
-
-
-  /* print info */
-#ifndef PRINT_MIPS
-  fprintf(stderr, "\n");
-  fprintf(stderr,
-          "*---------------------------------------------------*\n");
-  fprintf(stderr,
-          "*                                                   *\n");
-  fprintf(stderr,
-          "*      iLBCtest                                     *\n");
-  fprintf(stderr,
-          "*                                                   *\n");
-  fprintf(stderr,
-          "*                                                   *\n");
-  fprintf(stderr,
-          "*---------------------------------------------------*\n");
-#ifdef SPLIT_10MS
-  fprintf(stderr,"\n10ms split with raw mode: %2d ms\n", mode);
-#else
-  fprintf(stderr,"\nMode          : %2d ms\n", mode);
-#endif
-  fprintf(stderr,"\nInput file    : %s\n", argv[2]);
-  fprintf(stderr,"Coded file    : %s\n", argv[3]);
-  fprintf(stderr,"Output file   : %s\n\n", argv[4]);
-  fprintf(stderr,"Channel file  : %s\n\n", argv[5]);
-#endif
-
-  /* Initialization */
-
-  WebRtcIlbcfix_EncoderInit(&Enc_Inst, mode);
-  WebRtcIlbcfix_DecoderInit(&Dec_Inst, mode, 1);
-
-  /* extract the input file and channel file */
-
-#ifdef SPLIT_10MS
-  frameLen = (mode==20)? 80:160;
-  fread(Enc_Inst.past_samples, sizeof(short), frameLen, ifileid);
-  Enc_Inst.section = 0;
-
-  while( fread(&inputdata[noOfBlocks*80], sizeof(short),
-               80, ifileid) == 80 ) {
-    noOfBlocks++;
-  }
-
-  noOfBlocks += frameLen/80;
-  frameLen = 80;
-#else
-  frameLen = Enc_Inst.blockl;
-
-  while( fread(&inputdata[noOfBlocks*Enc_Inst.blockl],sizeof(short),
-               Enc_Inst.blockl,ifileid)==(uint16_t)Enc_Inst.blockl){
-    noOfBlocks++;
-  }
-#endif
-
-
-  while ((fread(&channeldata[blockcount],sizeof(short), 1,chfileid)==1)
-            && ( blockcount < noOfBlocks/(Enc_Inst.blockl/frameLen) )) {
-    blockcount++;
-  }
-
-  if ( blockcount < noOfBlocks/(Enc_Inst.blockl/frameLen) ) {
-    fprintf(stderr,"Channel file %s is too short\n", argv[4]);
-    free(inputdata);
-    free(encodeddata);
-    free(decodeddata);
-    free(channeldata);
-    exit(0);
-  }
-
-  count=0;
-
-  /* Runtime statistics */
-
-  starttime1 = clock()/(float)CLOCKS_PER_SEC;
-
-  /* Encoding loop */
-#ifdef PRINT_MIPS
-  printf("-1 -1\n");
-#endif
-
-#ifdef SPLIT_10MS
-  /* "Enc_Inst.section != 0" is to make sure we run through full
-     lengths of all vectors for 10ms split mode.
-  */
-  //   while( (count < noOfBlocks) || (Enc_Inst.section != 0) )    {
-  while( count < blockcount * (Enc_Inst.blockl/frameLen) )    {
-
-    encode(&Enc_Inst, &encodeddata[Enc_Inst.no_of_words *
-                                   (count/(Enc_Inst.nsub/2))],
-           &inputdata[frameLen * count] );
-#else
-    while (count < noOfBlocks) {
-      encode( &Enc_Inst, &encodeddata[Enc_Inst.no_of_words * count],
-              &inputdata[frameLen * count] );
-#endif
-
-#ifdef PRINT_MIPS
-      printf("-1 -1\n");
-#endif
-
-      count++;
-    }
-
-    count=0;
-
-    /* Runtime statistics */
-
-    starttime2=clock()/(float)CLOCKS_PER_SEC;
-    runtime1 = (float)(starttime2-starttime1);
-
-    /* Decoding loop */
-
-    while (count < blockcount) {
-      if (channeldata[count]==1) {
-        /* Normal decoding */
-        decode(&Dec_Inst, &decodeddata[count * Dec_Inst.blockl],
-               &encodeddata[Dec_Inst.no_of_words * count], 1);
-      } else if (channeldata[count]==0) {
-        /* PLC */
-        short emptydata[ILBCNOOFWORDS_MAX];
-        memset(emptydata, 0, Dec_Inst.no_of_words*sizeof(short));
-        decode(&Dec_Inst, &decodeddata[count*Dec_Inst.blockl],
-               emptydata, 0);
-        noOfLostBlocks++;
-      } else {
-        printf("Error in channel file (values have to be either 1 or 0)\n");
-        exit(0);
-      }
-#ifdef PRINT_MIPS
-      printf("-1 -1\n");
-#endif
-
-      count++;
-    }
-
-    /* Runtime statistics */
-
-    runtime2 = (float)(clock()/(float)CLOCKS_PER_SEC-starttime2);
-
-    outtime = (float)((float)blockcount*
-                      (float)mode/1000.0);
-
-#ifndef PRINT_MIPS
-    printf("\nLength of speech file: %.1f s\n", outtime);
-    printf("Lost frames          : %.1f%%\n\n", 100*(float)noOfLostBlocks/(float)blockcount);
-
-    printf("Time to run iLBC_encode+iLBC_decode:");
-    printf(" %.1f s (%.1f%% of realtime)\n", runtime1+runtime2,
-           (100*(runtime1+runtime2)/outtime));
-
-    printf("Time in iLBC_encode                :");
-    printf(" %.1f s (%.1f%% of total runtime)\n",
-           runtime1, 100.0*runtime1/(runtime1+runtime2));
-
-    printf("Time in iLBC_decode                :");
-    printf(" %.1f s (%.1f%% of total runtime)\n\n",
-           runtime2, 100.0*runtime2/(runtime1+runtime2));
-#endif
-
-    /* Write data to files */
-    for (i=0; i<blockcount; i++) {
-      fwrite(&encodeddata[i*Enc_Inst.no_of_words], sizeof(short),
-             Enc_Inst.no_of_words, efileid);
-    }
-    for (i=0;i<blockcount;i++) {
-      fwrite(&decodeddata[i*Enc_Inst.blockl],sizeof(short),Enc_Inst.blockl,ofileid);
-    }
-
-    /* return memory and close files */
-
-    free(inputdata);
-    free(encodeddata);
-    free(decodeddata);
-    free(channeldata);
-    fclose(ifileid);  fclose(efileid); fclose(ofileid);
-    return(0);
-  }
diff --git a/modules/audio_coding/codecs/ilbc/test/iLBCtestscript.txt b/modules/audio_coding/codecs/ilbc/test/iLBCtestscript.txt
deleted file mode 100644
index db0e9a0..0000000
--- a/modules/audio_coding/codecs/ilbc/test/iLBCtestscript.txt
+++ /dev/null
@@ -1,73 +0,0 @@
-#!/bin/bash
-(set -o igncr) 2>/dev/null && set -o igncr; # force bash to ignore \r character
-
-#
-# This script can be used to verify the bit exactness of iLBC fixed-point version 1.0.6
-#
-
-INP=../../../../../../../resources/audio_coding
-EXEP=../../../../../../../out/Release
-OUTP=./GeneratedFiles
-mkdir ./GeneratedFiles
-
-$EXEP/iLBCtest 20 $INP/F00.INP $OUTP/F00.BIT20 $OUTP/F00.OUT20 $INP/clean.chn
-$EXEP/iLBCtest 20 $INP/F01.INP $OUTP/F01.BIT20 $OUTP/F01.OUT20 $INP/clean.chn
-$EXEP/iLBCtest 20 $INP/F02.INP $OUTP/F02.BIT20 $OUTP/F02.OUT20 $INP/clean.chn
-$EXEP/iLBCtest 20 $INP/F03.INP $OUTP/F03.BIT20 $OUTP/F03.OUT20 $INP/clean.chn
-$EXEP/iLBCtest 20 $INP/F04.INP $OUTP/F04.BIT20 $OUTP/F04.OUT20 $INP/clean.chn
-$EXEP/iLBCtest 20 $INP/F05.INP $OUTP/F05.BIT20 $OUTP/F05.OUT20 $INP/clean.chn
-$EXEP/iLBCtest 20 $INP/F06.INP $OUTP/F06.BIT20 $OUTP/F06.OUT20 $INP/clean.chn
-
-$EXEP/iLBCtest 30 $INP/F00.INP $OUTP/F00.BIT30 $OUTP/F00.OUT30 $INP/clean.chn
-$EXEP/iLBCtest 30 $INP/F01.INP $OUTP/F01.BIT30 $OUTP/F01.OUT30 $INP/clean.chn
-$EXEP/iLBCtest 30 $INP/F02.INP $OUTP/F02.BIT30 $OUTP/F02.OUT30 $INP/clean.chn
-$EXEP/iLBCtest 30 $INP/F03.INP $OUTP/F03.BIT30 $OUTP/F03.OUT30 $INP/clean.chn
-$EXEP/iLBCtest 30 $INP/F04.INP $OUTP/F04.BIT30 $OUTP/F04.OUT30 $INP/clean.chn
-$EXEP/iLBCtest 30 $INP/F05.INP $OUTP/F05.BIT30 $OUTP/F05.OUT30 $INP/clean.chn
-$EXEP/iLBCtest 30 $INP/F06.INP $OUTP/F06.BIT30 $OUTP/F06.OUT30 $INP/clean.chn
-
-$EXEP/iLBCtest 20 $INP/F00.INP $OUTP/F00.BIT20 $OUTP/F00_tlm10.OUT20 $INP/tlm10.chn
-$EXEP/iLBCtest 20 $INP/F01.INP $OUTP/F01.BIT20 $OUTP/F01_tlm10.OUT20 $INP/tlm10.chn
-$EXEP/iLBCtest 20 $INP/F02.INP $OUTP/F02.BIT20 $OUTP/F02_tlm10.OUT20 $INP/tlm10.chn
-$EXEP/iLBCtest 30 $INP/F00.INP $OUTP/F00.BIT30 $OUTP/F00_tlm10.OUT30 $INP/tlm10.chn
-$EXEP/iLBCtest 30 $INP/F01.INP $OUTP/F01.BIT30 $OUTP/F01_tlm10.OUT30 $INP/tlm10.chn
-$EXEP/iLBCtest 30 $INP/F02.INP $OUTP/F02.BIT30 $OUTP/F02_tlm10.OUT30 $INP/tlm10.chn
-
-
-diff $OUTP/F00.BIT20 $INP/F00.BIT20
-diff $OUTP/F01.BIT20 $INP/F01.BIT20
-diff $OUTP/F02.BIT20 $INP/F02.BIT20
-diff $OUTP/F03.BIT20 $INP/F03.BIT20
-diff $OUTP/F04.BIT20 $INP/F04.BIT20
-diff $OUTP/F05.BIT20 $INP/F05.BIT20
-diff $OUTP/F06.BIT20 $INP/F06.BIT20
-diff $OUTP/F00.OUT20 $INP/F00.OUT20
-diff $OUTP/F01.OUT20 $INP/F01.OUT20
-diff $OUTP/F02.OUT20 $INP/F02.OUT20
-diff $OUTP/F03.OUT20 $INP/F03.OUT20
-diff $OUTP/F04.OUT20 $INP/F04.OUT20
-diff $OUTP/F05.OUT20 $INP/F05.OUT20
-diff $OUTP/F06.OUT20 $INP/F06.OUT20
-
-diff $OUTP/F00.BIT30 $INP/F00.BIT30
-diff $OUTP/F01.BIT30 $INP/F01.BIT30
-diff $OUTP/F02.BIT30 $INP/F02.BIT30
-diff $OUTP/F03.BIT30 $INP/F03.BIT30
-diff $OUTP/F04.BIT30 $INP/F04.BIT30
-diff $OUTP/F05.BIT30 $INP/F05.BIT30
-diff $OUTP/F06.BIT30 $INP/F06.BIT30
-diff $OUTP/F00.OUT30 $INP/F00.OUT30
-diff $OUTP/F01.OUT30 $INP/F01.OUT30
-diff $OUTP/F02.OUT30 $INP/F02.OUT30
-diff $OUTP/F03.OUT30 $INP/F03.OUT30
-diff $OUTP/F04.OUT30 $INP/F04.OUT30
-diff $OUTP/F05.OUT30 $INP/F05.OUT30
-diff $OUTP/F06.OUT30 $INP/F06.OUT30
-
-diff $OUTP/F00_tlm10.OUT20 $INP/F00_tlm10.OUT20
-diff $OUTP/F01_tlm10.OUT20 $INP/F01_tlm10.OUT20
-diff $OUTP/F02_tlm10.OUT20 $INP/F02_tlm10.OUT20
-diff $OUTP/F00_tlm10.OUT30 $INP/F00_tlm10.OUT30
-diff $OUTP/F01_tlm10.OUT30 $INP/F01_tlm10.OUT30
-diff $OUTP/F02_tlm10.OUT30 $INP/F02_tlm10.OUT30
-
diff --git a/modules/audio_coding/codecs/ilbc/unpack_bits.c b/modules/audio_coding/codecs/ilbc/unpack_bits.c
deleted file mode 100644
index fae06f6..0000000
--- a/modules/audio_coding/codecs/ilbc/unpack_bits.c
+++ /dev/null
@@ -1,239 +0,0 @@
-/*
- *  Copyright (c) 2012 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_UnpackBits.c
-
-******************************************************************/
-
-#include "defines.h"
-
-/*----------------------------------------------------------------*
- *  unpacking of bits from bitstream, i.e., vector of bytes
- *---------------------------------------------------------------*/
-
-int16_t WebRtcIlbcfix_UnpackBits( /* (o) "Empty" frame indicator */
-    const uint16_t *bitstream,    /* (i) The packatized bitstream */
-    iLBC_bits *enc_bits,  /* (o) Paramerers from bitstream */
-    int16_t mode     /* (i) Codec mode (20 or 30) */
-                                        ) {
-  const uint16_t *bitstreamPtr;
-  int i, k;
-  int16_t *tmpPtr;
-
-  bitstreamPtr=bitstream;
-
-  /* First int16_t */
-  enc_bits->lsf[0]  =  (*bitstreamPtr)>>10;       /* Bit 0..5  */
-  enc_bits->lsf[1]  = ((*bitstreamPtr)>>3)&0x7F;      /* Bit 6..12 */
-  enc_bits->lsf[2]  = ((*bitstreamPtr)&0x7)<<4;      /* Bit 13..15 */
-  bitstreamPtr++;
-  /* Second int16_t */
-  enc_bits->lsf[2] |= ((*bitstreamPtr)>>12)&0xF;      /* Bit 0..3  */
-
-  if (mode==20) {
-    enc_bits->startIdx             = ((*bitstreamPtr)>>10)&0x3;  /* Bit 4..5  */
-    enc_bits->state_first          = ((*bitstreamPtr)>>9)&0x1;  /* Bit 6  */
-    enc_bits->idxForMax            = ((*bitstreamPtr)>>3)&0x3F;  /* Bit 7..12 */
-    enc_bits->cb_index[0]          = ((*bitstreamPtr)&0x7)<<4;  /* Bit 13..15 */
-    bitstreamPtr++;
-    /* Third int16_t */
-    enc_bits->cb_index[0]         |= ((*bitstreamPtr)>>12)&0xE;  /* Bit 0..2  */
-    enc_bits->gain_index[0]        = ((*bitstreamPtr)>>8)&0x18;  /* Bit 3..4  */
-    enc_bits->gain_index[1]        = ((*bitstreamPtr)>>7)&0x8;  /* Bit 5  */
-    enc_bits->cb_index[3]          = ((*bitstreamPtr)>>2)&0xFE;  /* Bit 6..12 */
-    enc_bits->gain_index[3]        = ((*bitstreamPtr)<<2)&0x10;  /* Bit 13  */
-    enc_bits->gain_index[4]        = ((*bitstreamPtr)<<2)&0x8;  /* Bit 14  */
-    enc_bits->gain_index[6]        = ((*bitstreamPtr)<<4)&0x10;  /* Bit 15  */
-  } else { /* mode==30 */
-    enc_bits->lsf[3]               = ((*bitstreamPtr)>>6)&0x3F;  /* Bit 4..9  */
-    enc_bits->lsf[4]               = ((*bitstreamPtr)<<1)&0x7E;  /* Bit 10..15 */
-    bitstreamPtr++;
-    /* Third int16_t */
-    enc_bits->lsf[4]              |= ((*bitstreamPtr)>>15)&0x1;  /* Bit 0  */
-    enc_bits->lsf[5]               = ((*bitstreamPtr)>>8)&0x7F;  /* Bit 1..7  */
-    enc_bits->startIdx             = ((*bitstreamPtr)>>5)&0x7;  /* Bit 8..10 */
-    enc_bits->state_first          = ((*bitstreamPtr)>>4)&0x1;  /* Bit 11  */
-    enc_bits->idxForMax            = ((*bitstreamPtr)<<2)&0x3C;  /* Bit 12..15 */
-    bitstreamPtr++;
-    /* 4:th int16_t */
-    enc_bits->idxForMax           |= ((*bitstreamPtr)>>14)&0x3;  /* Bit 0..1  */
-    enc_bits->cb_index[0]        = ((*bitstreamPtr)>>7)&0x78;  /* Bit 2..5  */
-    enc_bits->gain_index[0]        = ((*bitstreamPtr)>>5)&0x10;  /* Bit 6  */
-    enc_bits->gain_index[1]        = ((*bitstreamPtr)>>5)&0x8;  /* Bit 7  */
-    enc_bits->cb_index[3]          = ((*bitstreamPtr))&0xFC;  /* Bit 8..13 */
-    enc_bits->gain_index[3]        = ((*bitstreamPtr)<<3)&0x10;  /* Bit 14  */
-    enc_bits->gain_index[4]        = ((*bitstreamPtr)<<3)&0x8;  /* Bit 15  */
-  }
-  /* Class 2 bits of ULP */
-  /* 4:th to 6:th int16_t for 20 ms case
-     5:th to 7:th int16_t for 30 ms case */
-  bitstreamPtr++;
-  tmpPtr=enc_bits->idxVec;
-  for (k=0; k<3; k++) {
-    for (i=15; i>=0; i--) {
-      (*tmpPtr)                  = (((*bitstreamPtr)>>i)<<2)&0x4;
-      /* Bit 15-i  */
-      tmpPtr++;
-    }
-    bitstreamPtr++;
-  }
-
-  if (mode==20) {
-    /* 7:th int16_t */
-    for (i=15; i>6; i--) {
-      (*tmpPtr)                  = (((*bitstreamPtr)>>i)<<2)&0x4;
-      /* Bit 15-i  */
-      tmpPtr++;
-    }
-    enc_bits->gain_index[1]       |= ((*bitstreamPtr)>>4)&0x4; /* Bit 9  */
-    enc_bits->gain_index[3]       |= ((*bitstreamPtr)>>2)&0xC; /* Bit 10..11 */
-    enc_bits->gain_index[4]       |= ((*bitstreamPtr)>>1)&0x4; /* Bit 12  */
-    enc_bits->gain_index[6]       |= ((*bitstreamPtr)<<1)&0x8; /* Bit 13  */
-    enc_bits->gain_index[7]        = ((*bitstreamPtr)<<2)&0xC; /* Bit 14..15 */
-
-  } else { /* mode==30 */
-    /* 8:th int16_t */
-    for (i=15; i>5; i--) {
-      (*tmpPtr)                  = (((*bitstreamPtr)>>i)<<2)&0x4;
-      /* Bit 15-i  */
-      tmpPtr++;
-    }
-    enc_bits->cb_index[0]         |= ((*bitstreamPtr)>>3)&0x6; /* Bit 10..11 */
-    enc_bits->gain_index[0]       |= ((*bitstreamPtr))&0x8;  /* Bit 12  */
-    enc_bits->gain_index[1]       |= ((*bitstreamPtr))&0x4;  /* Bit 13  */
-    enc_bits->cb_index[3]         |= ((*bitstreamPtr))&0x2;  /* Bit 14  */
-    enc_bits->cb_index[6]          = ((*bitstreamPtr)<<7)&0x80; /* Bit 15  */
-    bitstreamPtr++;
-    /* 9:th int16_t */
-    enc_bits->cb_index[6]         |= ((*bitstreamPtr)>>9)&0x7E; /* Bit 0..5  */
-    enc_bits->cb_index[9]          = ((*bitstreamPtr)>>2)&0xFE; /* Bit 6..12 */
-    enc_bits->cb_index[12]         = ((*bitstreamPtr)<<5)&0xE0; /* Bit 13..15 */
-    bitstreamPtr++;
-    /* 10:th int16_t */
-    enc_bits->cb_index[12]         |= ((*bitstreamPtr)>>11)&0x1E;/* Bit 0..3 */
-    enc_bits->gain_index[3]       |= ((*bitstreamPtr)>>8)&0xC; /* Bit 4..5  */
-    enc_bits->gain_index[4]       |= ((*bitstreamPtr)>>7)&0x6; /* Bit 6..7  */
-    enc_bits->gain_index[6]        = ((*bitstreamPtr)>>3)&0x18; /* Bit 8..9  */
-    enc_bits->gain_index[7]        = ((*bitstreamPtr)>>2)&0xC; /* Bit 10..11 */
-    enc_bits->gain_index[9]        = ((*bitstreamPtr)<<1)&0x10; /* Bit 12  */
-    enc_bits->gain_index[10]       = ((*bitstreamPtr)<<1)&0x8; /* Bit 13  */
-    enc_bits->gain_index[12]       = ((*bitstreamPtr)<<3)&0x10; /* Bit 14  */
-    enc_bits->gain_index[13]       = ((*bitstreamPtr)<<3)&0x8; /* Bit 15  */
-  }
-  bitstreamPtr++;
-  /* Class 3 bits of ULP */
-  /*  8:th to 14:th int16_t for 20 ms case
-      11:th to 17:th int16_t for 30 ms case */
-  tmpPtr=enc_bits->idxVec;
-  for (k=0; k<7; k++) {
-    for (i=14; i>=0; i-=2) {
-      (*tmpPtr)                 |= ((*bitstreamPtr)>>i)&0x3; /* Bit 15-i..14-i*/
-      tmpPtr++;
-    }
-    bitstreamPtr++;
-  }
-
-  if (mode==20) {
-    /* 15:th int16_t */
-    enc_bits->idxVec[56]          |= ((*bitstreamPtr)>>14)&0x3; /* Bit 0..1  */
-    enc_bits->cb_index[0]         |= ((*bitstreamPtr)>>13)&0x1; /* Bit 2  */
-    enc_bits->cb_index[1]          = ((*bitstreamPtr)>>6)&0x7F; /* Bit 3..9  */
-    enc_bits->cb_index[2]          = ((*bitstreamPtr)<<1)&0x7E; /* Bit 10..15 */
-    bitstreamPtr++;
-    /* 16:th int16_t */
-    enc_bits->cb_index[2]         |= ((*bitstreamPtr)>>15)&0x1; /* Bit 0  */
-    enc_bits->gain_index[0]       |= ((*bitstreamPtr)>>12)&0x7; /* Bit 1..3  */
-    enc_bits->gain_index[1]       |= ((*bitstreamPtr)>>10)&0x3; /* Bit 4..5  */
-    enc_bits->gain_index[2]        = ((*bitstreamPtr)>>7)&0x7; /* Bit 6..8  */
-    enc_bits->cb_index[3]         |= ((*bitstreamPtr)>>6)&0x1; /* Bit 9  */
-    enc_bits->cb_index[4]          = ((*bitstreamPtr)<<1)&0x7E; /* Bit 10..15 */
-    bitstreamPtr++;
-    /* 17:th int16_t */
-    enc_bits->cb_index[4]         |= ((*bitstreamPtr)>>15)&0x1; /* Bit 0  */
-    enc_bits->cb_index[5]          = ((*bitstreamPtr)>>8)&0x7F; /* Bit 1..7  */
-    enc_bits->cb_index[6]          = ((*bitstreamPtr))&0xFF; /* Bit 8..15 */
-    bitstreamPtr++;
-    /* 18:th int16_t */
-    enc_bits->cb_index[7]          = (*bitstreamPtr)>>8;  /* Bit 0..7  */
-    enc_bits->cb_index[8]          = (*bitstreamPtr)&0xFF;  /* Bit 8..15 */
-    bitstreamPtr++;
-    /* 19:th int16_t */
-    enc_bits->gain_index[3]       |= ((*bitstreamPtr)>>14)&0x3; /* Bit 0..1  */
-    enc_bits->gain_index[4]       |= ((*bitstreamPtr)>>12)&0x3; /* Bit 2..3  */
-    enc_bits->gain_index[5]        = ((*bitstreamPtr)>>9)&0x7; /* Bit 4..6  */
-    enc_bits->gain_index[6]       |= ((*bitstreamPtr)>>6)&0x7; /* Bit 7..9  */
-    enc_bits->gain_index[7]       |= ((*bitstreamPtr)>>4)&0x3; /* Bit 10..11 */
-    enc_bits->gain_index[8]        = ((*bitstreamPtr)>>1)&0x7; /* Bit 12..14 */
-  } else { /* mode==30 */
-    /* 18:th int16_t */
-    enc_bits->idxVec[56]          |= ((*bitstreamPtr)>>14)&0x3; /* Bit 0..1  */
-    enc_bits->idxVec[57]          |= ((*bitstreamPtr)>>12)&0x3; /* Bit 2..3  */
-    enc_bits->cb_index[0]         |= ((*bitstreamPtr)>>11)&1; /* Bit 4  */
-    enc_bits->cb_index[1]          = ((*bitstreamPtr)>>4)&0x7F; /* Bit 5..11 */
-    enc_bits->cb_index[2]          = ((*bitstreamPtr)<<3)&0x78; /* Bit 12..15 */
-    bitstreamPtr++;
-    /* 19:th int16_t */
-    enc_bits->cb_index[2]         |= ((*bitstreamPtr)>>13)&0x7; /* Bit 0..2  */
-    enc_bits->gain_index[0]       |= ((*bitstreamPtr)>>10)&0x7; /* Bit 3..5  */
-    enc_bits->gain_index[1]       |= ((*bitstreamPtr)>>8)&0x3; /* Bit 6..7  */
-    enc_bits->gain_index[2]        = ((*bitstreamPtr)>>5)&0x7; /* Bit 8..10 */
-    enc_bits->cb_index[3]         |= ((*bitstreamPtr)>>4)&0x1; /* Bit 11  */
-    enc_bits->cb_index[4]          = ((*bitstreamPtr)<<3)&0x78; /* Bit 12..15 */
-    bitstreamPtr++;
-    /* 20:th int16_t */
-    enc_bits->cb_index[4]         |= ((*bitstreamPtr)>>13)&0x7; /* Bit 0..2  */
-    enc_bits->cb_index[5]          = ((*bitstreamPtr)>>6)&0x7F; /* Bit 3..9  */
-    enc_bits->cb_index[6]         |= ((*bitstreamPtr)>>5)&0x1; /* Bit 10  */
-    enc_bits->cb_index[7]          = ((*bitstreamPtr)<<3)&0xF8; /* Bit 11..15 */
-    bitstreamPtr++;
-    /* 21:st int16_t */
-    enc_bits->cb_index[7]         |= ((*bitstreamPtr)>>13)&0x7; /* Bit 0..2  */
-    enc_bits->cb_index[8]          = ((*bitstreamPtr)>>5)&0xFF; /* Bit 3..10 */
-    enc_bits->cb_index[9]         |= ((*bitstreamPtr)>>4)&0x1; /* Bit 11  */
-    enc_bits->cb_index[10]         = ((*bitstreamPtr)<<4)&0xF0; /* Bit 12..15 */
-    bitstreamPtr++;
-    /* 22:nd int16_t */
-    enc_bits->cb_index[10]        |= ((*bitstreamPtr)>>12)&0xF; /* Bit 0..3  */
-    enc_bits->cb_index[11]         = ((*bitstreamPtr)>>4)&0xFF; /* Bit 4..11 */
-    enc_bits->cb_index[12]        |= ((*bitstreamPtr)>>3)&0x1; /* Bit 12  */
-    enc_bits->cb_index[13]         = ((*bitstreamPtr)<<5)&0xE0; /* Bit 13..15 */
-    bitstreamPtr++;
-    /* 23:rd int16_t */
-    enc_bits->cb_index[13]        |= ((*bitstreamPtr)>>11)&0x1F;/* Bit 0..4  */
-    enc_bits->cb_index[14]         = ((*bitstreamPtr)>>3)&0xFF; /* Bit 5..12 */
-    enc_bits->gain_index[3]       |= ((*bitstreamPtr)>>1)&0x3; /* Bit 13..14 */
-    enc_bits->gain_index[4]       |= ((*bitstreamPtr)&0x1);  /* Bit 15  */
-    bitstreamPtr++;
-    /* 24:rd int16_t */
-    enc_bits->gain_index[5]        = ((*bitstreamPtr)>>13)&0x7; /* Bit 0..2  */
-    enc_bits->gain_index[6]       |= ((*bitstreamPtr)>>10)&0x7; /* Bit 3..5  */
-    enc_bits->gain_index[7]       |= ((*bitstreamPtr)>>8)&0x3; /* Bit 6..7  */
-    enc_bits->gain_index[8]        = ((*bitstreamPtr)>>5)&0x7; /* Bit 8..10 */
-    enc_bits->gain_index[9]       |= ((*bitstreamPtr)>>1)&0xF; /* Bit 11..14 */
-    enc_bits->gain_index[10]      |= ((*bitstreamPtr)<<2)&0x4; /* Bit 15  */
-    bitstreamPtr++;
-    /* 25:rd int16_t */
-    enc_bits->gain_index[10]      |= ((*bitstreamPtr)>>14)&0x3; /* Bit 0..1  */
-    enc_bits->gain_index[11]       = ((*bitstreamPtr)>>11)&0x7; /* Bit 2..4  */
-    enc_bits->gain_index[12]      |= ((*bitstreamPtr)>>7)&0xF; /* Bit 5..8  */
-    enc_bits->gain_index[13]      |= ((*bitstreamPtr)>>4)&0x7; /* Bit 9..11 */
-    enc_bits->gain_index[14]       = ((*bitstreamPtr)>>1)&0x7; /* Bit 12..14 */
-  }
-  /* Last bit should be zero, otherwise it's an "empty" frame */
-  if (((*bitstreamPtr)&0x1) == 1) {
-    return(1);
-  } else {
-    return(0);
-  }
-}
diff --git a/modules/audio_coding/codecs/ilbc/unpack_bits.h b/modules/audio_coding/codecs/ilbc/unpack_bits.h
deleted file mode 100644
index 9586a12..0000000
--- a/modules/audio_coding/codecs/ilbc/unpack_bits.h
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- *  Copyright (c) 2012 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_UnpackBits.h
-
-******************************************************************/
-
-#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_UNPACK_BITS_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_UNPACK_BITS_H_
-
-#include "defines.h"
-
-/*----------------------------------------------------------------*
- *  unpacking of bits from bitstream, i.e., vector of bytes
- *---------------------------------------------------------------*/
-
-int16_t WebRtcIlbcfix_UnpackBits( /* (o) "Empty" frame indicator */
-    const uint16_t *bitstream,    /* (i) The packatized bitstream */
-    iLBC_bits *enc_bits,  /* (o) Paramerers from bitstream */
-    int16_t mode     /* (i) Codec mode (20 or 30) */
-                                        );
-
-#endif
diff --git a/modules/audio_coding/codecs/ilbc/vq3.c b/modules/audio_coding/codecs/ilbc/vq3.c
deleted file mode 100644
index ee3b26e..0000000
--- a/modules/audio_coding/codecs/ilbc/vq3.c
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_Vq3.c
-
-******************************************************************/
-
-#include "vq3.h"
-#include "constants.h"
-
-/*----------------------------------------------------------------*
- *  vector quantization
- *---------------------------------------------------------------*/
-
-void WebRtcIlbcfix_Vq3(
-    int16_t *Xq, /* quantized vector (Q13) */
-    int16_t *index,
-    int16_t *CB, /* codebook in Q13 */
-    int16_t *X,  /* vector to quantize (Q13) */
-    int16_t n_cb
-                       ){
-  int16_t i, j;
-  int16_t pos, minindex=0;
-  int16_t tmp;
-  int32_t dist, mindist;
-
-  pos = 0;
-  mindist = WEBRTC_SPL_WORD32_MAX; /* start value */
-
-  /* Find the codebook with the lowest square distance */
-  for (j = 0; j < n_cb; j++) {
-    tmp = X[0] - CB[pos];
-    dist = tmp * tmp;
-    for (i = 1; i < 3; i++) {
-      tmp = X[i] - CB[pos + i];
-      dist += tmp * tmp;
-    }
-
-    if (dist < mindist) {
-      mindist = dist;
-      minindex = j;
-    }
-    pos += 3;
-  }
-
-  /* Store the quantized codebook and the index */
-  for (i = 0; i < 3; i++) {
-    Xq[i] = CB[minindex*3 + i];
-  }
-  *index = minindex;
-
-}
diff --git a/modules/audio_coding/codecs/ilbc/vq3.h b/modules/audio_coding/codecs/ilbc/vq3.h
deleted file mode 100644
index b146ea3..0000000
--- a/modules/audio_coding/codecs/ilbc/vq3.h
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_Vq3.h
-
-******************************************************************/
-
-#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_VQ3_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_VQ3_H_
-
-#include "webrtc/typedefs.h"
-
-/*----------------------------------------------------------------*
- *  Vector quantization of order 3 (based on MSE)
- *---------------------------------------------------------------*/
-
-void WebRtcIlbcfix_Vq3(
-    int16_t *Xq,  /* (o) the quantized vector (Q13) */
-    int16_t *index, /* (o) the quantization index */
-    int16_t *CB,  /* (i) the vector quantization codebook (Q13) */
-    int16_t *X,  /* (i) the vector to quantize (Q13) */
-    int16_t n_cb  /* (i) the number of vectors in the codebook */
-                       );
-
-#endif
diff --git a/modules/audio_coding/codecs/ilbc/vq4.c b/modules/audio_coding/codecs/ilbc/vq4.c
deleted file mode 100644
index bc20952..0000000
--- a/modules/audio_coding/codecs/ilbc/vq4.c
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_Vq4.c
-
-******************************************************************/
-
-#include "vq4.h"
-#include "constants.h"
-
-/*----------------------------------------------------------------*
- *  vector quantization
- *---------------------------------------------------------------*/
-
-void WebRtcIlbcfix_Vq4(
-    int16_t *Xq, /* quantized vector (Q13) */
-    int16_t *index,
-    int16_t *CB, /* codebook in Q13 */
-    int16_t *X,  /* vector to quantize (Q13) */
-    int16_t n_cb
-                       ){
-  int16_t i, j;
-  int16_t pos, minindex=0;
-  int16_t tmp;
-  int32_t dist, mindist;
-
-  pos = 0;
-  mindist = WEBRTC_SPL_WORD32_MAX; /* start value */
-
-  /* Find the codebook with the lowest square distance */
-  for (j = 0; j < n_cb; j++) {
-    tmp = X[0] - CB[pos];
-    dist = tmp * tmp;
-    for (i = 1; i < 4; i++) {
-      tmp = X[i] - CB[pos + i];
-      dist += tmp * tmp;
-    }
-
-    if (dist < mindist) {
-      mindist = dist;
-      minindex = j;
-    }
-    pos += 4;
-  }
-
-  /* Store the quantized codebook and the index */
-  for (i = 0; i < 4; i++) {
-    Xq[i] = CB[minindex*4 + i];
-  }
-  *index = minindex;
-}
diff --git a/modules/audio_coding/codecs/ilbc/vq4.h b/modules/audio_coding/codecs/ilbc/vq4.h
deleted file mode 100644
index 9263759..0000000
--- a/modules/audio_coding/codecs/ilbc/vq4.h
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_Vq4.h
-
-******************************************************************/
-
-#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_VQ4_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_VQ4_H_
-
-#include "webrtc/typedefs.h"
-
-/*----------------------------------------------------------------*
- *  Vector quantization of order 4 (based on MSE)
- *---------------------------------------------------------------*/
-
-void WebRtcIlbcfix_Vq4(
-    int16_t *Xq,  /* (o) the quantized vector (Q13) */
-    int16_t *index, /* (o) the quantization index */
-    int16_t *CB,  /* (i) the vector quantization codebook (Q13) */
-    int16_t *X,  /* (i) the vector to quantize (Q13) */
-    int16_t n_cb  /* (i) the number of vectors in the codebook */
-                       );
-
-#endif
diff --git a/modules/audio_coding/codecs/ilbc/window32_w32.c b/modules/audio_coding/codecs/ilbc/window32_w32.c
deleted file mode 100644
index dc12a5a..0000000
--- a/modules/audio_coding/codecs/ilbc/window32_w32.c
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_Window32W32.c
-
-******************************************************************/
-
-#include "defines.h"
-
-/*----------------------------------------------------------------*
- *  window multiplication
- *---------------------------------------------------------------*/
-
-void WebRtcIlbcfix_Window32W32(
-    int32_t *z,    /* Output */
-    int32_t *x,    /* Input (same domain as Output)*/
-    const int32_t  *y,  /* Q31 Window */
-    size_t N     /* length to process */
-                               ) {
-  size_t i;
-  int16_t x_low, x_hi, y_low, y_hi;
-  int16_t left_shifts;
-  int32_t temp;
-
-  left_shifts = (int16_t)WebRtcSpl_NormW32(x[0]);
-  WebRtcSpl_VectorBitShiftW32(x, N, x, (int16_t)(-left_shifts));
-
-
-  /* The double precision numbers use a special representation:
-   * w32 = hi<<16 + lo<<1
-   */
-  for (i = 0; i < N; i++) {
-    /* Extract higher bytes */
-    x_hi = (int16_t)(x[i] >> 16);
-    y_hi = (int16_t)(y[i] >> 16);
-
-    /* Extract lower bytes, defined as (w32 - hi<<16)>>1 */
-    x_low = (int16_t)((x[i] - (x_hi << 16)) >> 1);
-
-    y_low = (int16_t)((y[i] - (y_hi << 16)) >> 1);
-
-    /* Calculate z by a 32 bit multiplication using both low and high from x and y */
-    temp = ((x_hi * y_hi) << 1) + ((x_hi * y_low) >> 14);
-
-    z[i] = temp + ((x_low * y_hi) >> 14);
-  }
-
-  WebRtcSpl_VectorBitShiftW32(z, N, z, left_shifts);
-
-  return;
-}
diff --git a/modules/audio_coding/codecs/ilbc/window32_w32.h b/modules/audio_coding/codecs/ilbc/window32_w32.h
deleted file mode 100644
index 27ed1b6..0000000
--- a/modules/audio_coding/codecs/ilbc/window32_w32.h
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_Window32W32.h
-
-******************************************************************/
-
-#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_WINDOW32_W32_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_WINDOW32_W32_H_
-
-#include "defines.h"
-
-/*----------------------------------------------------------------*
- *  window multiplication
- *---------------------------------------------------------------*/
-
-void WebRtcIlbcfix_Window32W32(
-    int32_t *z,    /* Output */
-    int32_t *x,    /* Input (same domain as Output)*/
-    const int32_t  *y,  /* Q31 Window */
-    size_t N     /* length to process */
-                               );
-
-#endif
diff --git a/modules/audio_coding/codecs/ilbc/xcorr_coef.c b/modules/audio_coding/codecs/ilbc/xcorr_coef.c
deleted file mode 100644
index 0d898c5..0000000
--- a/modules/audio_coding/codecs/ilbc/xcorr_coef.c
+++ /dev/null
@@ -1,140 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_XcorrCoef.c
-
-******************************************************************/
-
-#include "defines.h"
-
-/*----------------------------------------------------------------*
- * cross correlation which finds the optimal lag for the
- * crossCorr*crossCorr/(energy) criteria
- *---------------------------------------------------------------*/
-
-size_t WebRtcIlbcfix_XcorrCoef(
-    int16_t *target,  /* (i) first array */
-    int16_t *regressor, /* (i) second array */
-    size_t subl,  /* (i) dimension arrays */
-    size_t searchLen, /* (i) the search lenght */
-    size_t offset,  /* (i) samples offset between arrays */
-    int16_t step   /* (i) +1 or -1 */
-                            ){
-  size_t k;
-  size_t maxlag;
-  int16_t pos;
-  int16_t max;
-  int16_t crossCorrScale, Energyscale;
-  int16_t crossCorrSqMod, crossCorrSqMod_Max;
-  int32_t crossCorr, Energy;
-  int16_t crossCorrmod, EnergyMod, EnergyMod_Max;
-  int16_t *tp, *rp;
-  int16_t *rp_beg, *rp_end;
-  int16_t totscale, totscale_max;
-  int16_t scalediff;
-  int32_t newCrit, maxCrit;
-  int shifts;
-
-  /* Initializations, to make sure that the first one is selected */
-  crossCorrSqMod_Max=0;
-  EnergyMod_Max=WEBRTC_SPL_WORD16_MAX;
-  totscale_max=-500;
-  maxlag=0;
-  pos=0;
-
-  /* Find scale value and start position */
-  if (step==1) {
-    max=WebRtcSpl_MaxAbsValueW16(regressor, subl + searchLen - 1);
-    rp_beg = regressor;
-    rp_end = regressor + subl;
-  } else { /* step==-1 */
-    max = WebRtcSpl_MaxAbsValueW16(regressor - searchLen, subl + searchLen - 1);
-    rp_beg = regressor - 1;
-    rp_end = regressor + subl - 1;
-  }
-
-  /* Introduce a scale factor on the Energy in int32_t in
-     order to make sure that the calculation does not
-     overflow */
-
-  if (max>5000) {
-    shifts=2;
-  } else {
-    shifts=0;
-  }
-
-  /* Calculate the first energy, then do a +/- to get the other energies */
-  Energy=WebRtcSpl_DotProductWithScale(regressor, regressor, subl, shifts);
-
-  for (k=0;k<searchLen;k++) {
-    tp = target;
-    rp = &regressor[pos];
-
-    crossCorr=WebRtcSpl_DotProductWithScale(tp, rp, subl, shifts);
-
-    if ((Energy>0)&&(crossCorr>0)) {
-
-      /* Put cross correlation and energy on 16 bit word */
-      crossCorrScale=(int16_t)WebRtcSpl_NormW32(crossCorr)-16;
-      crossCorrmod=(int16_t)WEBRTC_SPL_SHIFT_W32(crossCorr, crossCorrScale);
-      Energyscale=(int16_t)WebRtcSpl_NormW32(Energy)-16;
-      EnergyMod=(int16_t)WEBRTC_SPL_SHIFT_W32(Energy, Energyscale);
-
-      /* Square cross correlation and store upper int16_t */
-      crossCorrSqMod = (int16_t)((crossCorrmod * crossCorrmod) >> 16);
-
-      /* Calculate the total number of (dynamic) right shifts that have
-         been performed on (crossCorr*crossCorr)/energy
-      */
-      totscale=Energyscale-(crossCorrScale<<1);
-
-      /* Calculate the shift difference in order to be able to compare the two
-         (crossCorr*crossCorr)/energy in the same domain
-      */
-      scalediff=totscale-totscale_max;
-      scalediff=WEBRTC_SPL_MIN(scalediff,31);
-      scalediff=WEBRTC_SPL_MAX(scalediff,-31);
-
-      /* Compute the cross multiplication between the old best criteria
-         and the new one to be able to compare them without using a
-         division */
-
-      if (scalediff<0) {
-        newCrit = ((int32_t)crossCorrSqMod*EnergyMod_Max)>>(-scalediff);
-        maxCrit = ((int32_t)crossCorrSqMod_Max*EnergyMod);
-      } else {
-        newCrit = ((int32_t)crossCorrSqMod*EnergyMod_Max);
-        maxCrit = ((int32_t)crossCorrSqMod_Max*EnergyMod)>>scalediff;
-      }
-
-      /* Store the new lag value if the new criteria is larger
-         than previous largest criteria */
-
-      if (newCrit > maxCrit) {
-        crossCorrSqMod_Max = crossCorrSqMod;
-        EnergyMod_Max = EnergyMod;
-        totscale_max = totscale;
-        maxlag = k;
-      }
-    }
-    pos+=step;
-
-    /* Do a +/- to get the next energy */
-    Energy += step * ((*rp_end * *rp_end - *rp_beg * *rp_beg) >> shifts);
-    rp_beg+=step;
-    rp_end+=step;
-  }
-
-  return(maxlag+offset);
-}
diff --git a/modules/audio_coding/codecs/ilbc/xcorr_coef.h b/modules/audio_coding/codecs/ilbc/xcorr_coef.h
deleted file mode 100644
index 9b81c0f..0000000
--- a/modules/audio_coding/codecs/ilbc/xcorr_coef.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/******************************************************************
-
- iLBC Speech Coder ANSI-C Source Code
-
- WebRtcIlbcfix_XcorrCoef.h
-
-******************************************************************/
-
-#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_XCORR_COEF_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ILBC_MAIN_SOURCE_XCORR_COEF_H_
-
-#include "defines.h"
-
-/*----------------------------------------------------------------*
- * cross correlation which finds the optimal lag for the
- * crossCorr*crossCorr/(energy) criteria
- *---------------------------------------------------------------*/
-
-size_t WebRtcIlbcfix_XcorrCoef(
-    int16_t *target,  /* (i) first array */
-    int16_t *regressor, /* (i) second array */
-    size_t subl,  /* (i) dimension arrays */
-    size_t searchLen, /* (i) the search lenght */
-    size_t offset,  /* (i) samples offset between arrays */
-    int16_t step   /* (i) +1 or -1 */
-                            );
-
-#endif
diff --git a/modules/audio_coding/codecs/isac/audio_decoder_isac_t.h b/modules/audio_coding/codecs/isac/audio_decoder_isac_t.h
deleted file mode 100644
index 66f021a..0000000
--- a/modules/audio_coding/codecs/isac/audio_decoder_isac_t.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- *  Copyright (c) 2015 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_CODECS_ISAC_AUDIO_DECODER_ISAC_T_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_AUDIO_DECODER_ISAC_T_H_
-
-#include <vector>
-
-#include "webrtc/api/audio_codecs/audio_decoder.h"
-#include "webrtc/api/optional.h"
-#include "webrtc/modules/audio_coding/codecs/isac/locked_bandwidth_info.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/scoped_ref_ptr.h"
-
-namespace webrtc {
-
-template <typename T>
-class AudioDecoderIsacT final : public AudioDecoder {
- public:
-  explicit AudioDecoderIsacT(int sample_rate_hz);
-  AudioDecoderIsacT(int sample_rate_hz,
-                    const rtc::scoped_refptr<LockedIsacBandwidthInfo>& bwinfo);
-  ~AudioDecoderIsacT() override;
-
-  bool HasDecodePlc() const override;
-  size_t DecodePlc(size_t num_frames, int16_t* decoded) override;
-  void Reset() override;
-  int IncomingPacket(const uint8_t* payload,
-                     size_t payload_len,
-                     uint16_t rtp_sequence_number,
-                     uint32_t rtp_timestamp,
-                     uint32_t arrival_timestamp) override;
-  int ErrorCode() override;
-  int SampleRateHz() const override;
-  size_t Channels() const override;
-  int DecodeInternal(const uint8_t* encoded,
-                     size_t encoded_len,
-                     int sample_rate_hz,
-                     int16_t* decoded,
-                     SpeechType* speech_type) override;
-
- private:
-  typename T::instance_type* isac_state_;
-  int sample_rate_hz_;
-  rtc::scoped_refptr<LockedIsacBandwidthInfo> bwinfo_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(AudioDecoderIsacT);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_AUDIO_DECODER_ISAC_T_H_
diff --git a/modules/audio_coding/codecs/isac/audio_decoder_isac_t_impl.h b/modules/audio_coding/codecs/isac/audio_decoder_isac_t_impl.h
deleted file mode 100644
index 1abfe37..0000000
--- a/modules/audio_coding/codecs/isac/audio_decoder_isac_t_impl.h
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- *  Copyright (c) 2015 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_CODECS_ISAC_AUDIO_DECODER_ISAC_T_IMPL_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_AUDIO_DECODER_ISAC_T_IMPL_H_
-
-#include "webrtc/modules/audio_coding/codecs/isac/main/include/audio_decoder_isac.h"
-
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-
-template <typename T>
-AudioDecoderIsacT<T>::AudioDecoderIsacT(int sample_rate_hz)
-    : AudioDecoderIsacT(sample_rate_hz, nullptr) {}
-
-template <typename T>
-AudioDecoderIsacT<T>::AudioDecoderIsacT(
-    int sample_rate_hz,
-    const rtc::scoped_refptr<LockedIsacBandwidthInfo>& bwinfo)
-    : sample_rate_hz_(sample_rate_hz), bwinfo_(bwinfo) {
-  RTC_CHECK(sample_rate_hz == 16000 || sample_rate_hz == 32000)
-      << "Unsupported sample rate " << sample_rate_hz;
-  RTC_CHECK_EQ(0, T::Create(&isac_state_));
-  T::DecoderInit(isac_state_);
-  if (bwinfo_) {
-    IsacBandwidthInfo bi;
-    T::GetBandwidthInfo(isac_state_, &bi);
-    bwinfo_->Set(bi);
-  }
-  RTC_CHECK_EQ(0, T::SetDecSampRate(isac_state_, sample_rate_hz_));
-}
-
-template <typename T>
-AudioDecoderIsacT<T>::~AudioDecoderIsacT() {
-  RTC_CHECK_EQ(0, T::Free(isac_state_));
-}
-
-template <typename T>
-int AudioDecoderIsacT<T>::DecodeInternal(const uint8_t* encoded,
-                                         size_t encoded_len,
-                                         int sample_rate_hz,
-                                         int16_t* decoded,
-                                         SpeechType* speech_type) {
-  RTC_CHECK_EQ(sample_rate_hz_, sample_rate_hz);
-  int16_t temp_type = 1;  // Default is speech.
-  int ret =
-      T::DecodeInternal(isac_state_, encoded, encoded_len, decoded, &temp_type);
-  *speech_type = ConvertSpeechType(temp_type);
-  return ret;
-}
-
-template <typename T>
-bool AudioDecoderIsacT<T>::HasDecodePlc() const {
-  return false;
-}
-
-template <typename T>
-size_t AudioDecoderIsacT<T>::DecodePlc(size_t num_frames, int16_t* decoded) {
-  return T::DecodePlc(isac_state_, decoded, num_frames);
-}
-
-template <typename T>
-void AudioDecoderIsacT<T>::Reset() {
-  T::DecoderInit(isac_state_);
-}
-
-template <typename T>
-int AudioDecoderIsacT<T>::IncomingPacket(const uint8_t* payload,
-                                         size_t payload_len,
-                                         uint16_t rtp_sequence_number,
-                                         uint32_t rtp_timestamp,
-                                         uint32_t arrival_timestamp) {
-  int ret = T::UpdateBwEstimate(isac_state_, payload, payload_len,
-                                rtp_sequence_number, rtp_timestamp,
-                                arrival_timestamp);
-  if (bwinfo_) {
-    IsacBandwidthInfo bwinfo;
-    T::GetBandwidthInfo(isac_state_, &bwinfo);
-    bwinfo_->Set(bwinfo);
-  }
-  return ret;
-}
-
-template <typename T>
-int AudioDecoderIsacT<T>::ErrorCode() {
-  return T::GetErrorCode(isac_state_);
-}
-
-template <typename T>
-int AudioDecoderIsacT<T>::SampleRateHz() const {
-  return sample_rate_hz_;
-}
-
-template <typename T>
-size_t AudioDecoderIsacT<T>::Channels() const {
-  return 1;
-}
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_AUDIO_DECODER_ISAC_T_IMPL_H_
diff --git a/modules/audio_coding/codecs/isac/audio_encoder_isac_t.h b/modules/audio_coding/codecs/isac/audio_encoder_isac_t.h
deleted file mode 100644
index c12d734..0000000
--- a/modules/audio_coding/codecs/isac/audio_encoder_isac_t.h
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- *  Copyright (c) 2014 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_CODECS_ISAC_AUDIO_ENCODER_ISAC_T_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_AUDIO_ENCODER_ISAC_T_H_
-
-#include <vector>
-
-#include "webrtc/api/audio_codecs/audio_encoder.h"
-#include "webrtc/modules/audio_coding/codecs/isac/locked_bandwidth_info.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/scoped_ref_ptr.h"
-
-namespace webrtc {
-
-struct CodecInst;
-
-template <typename T>
-class AudioEncoderIsacT final : public AudioEncoder {
- public:
-  // Allowed combinations of sample rate, frame size, and bit rate are
-  //  - 16000 Hz, 30 ms, 10000-32000 bps
-  //  - 16000 Hz, 60 ms, 10000-32000 bps
-  //  - 32000 Hz, 30 ms, 10000-56000 bps (if T has super-wideband support)
-  struct Config {
-    bool IsOk() const;
-
-    rtc::scoped_refptr<LockedIsacBandwidthInfo> bwinfo;
-
-    int payload_type = 103;
-    int sample_rate_hz = 16000;
-    int frame_size_ms = 30;
-    int bit_rate = kDefaultBitRate;  // Limit on the short-term average bit
-                                     // rate, in bits/s.
-    int max_payload_size_bytes = -1;
-    int max_bit_rate = -1;
-
-    // If true, the encoder will dynamically adjust frame size and bit rate;
-    // the configured values are then merely the starting point.
-    bool adaptive_mode = false;
-
-    // In adaptive mode, prevent adaptive changes to the frame size. (Not used
-    // in nonadaptive mode.)
-    bool enforce_frame_size = false;
-  };
-
-  explicit AudioEncoderIsacT(const Config& config);
-  explicit AudioEncoderIsacT(
-      const CodecInst& codec_inst,
-      const rtc::scoped_refptr<LockedIsacBandwidthInfo>& bwinfo);
-  ~AudioEncoderIsacT() override;
-
-  int SampleRateHz() const override;
-  size_t NumChannels() const override;
-  size_t Num10MsFramesInNextPacket() const override;
-  size_t Max10MsFramesInAPacket() const override;
-  int GetTargetBitrate() const override;
-  EncodedInfo EncodeImpl(uint32_t rtp_timestamp,
-                         rtc::ArrayView<const int16_t> audio,
-                         rtc::Buffer* encoded) override;
-  void Reset() override;
-
- private:
-  // This value is taken from STREAM_SIZE_MAX_60 for iSAC float (60 ms) and
-  // STREAM_MAXW16_60MS for iSAC fix (60 ms).
-  static const size_t kSufficientEncodeBufferSizeBytes = 400;
-
-  static const int kDefaultBitRate = 32000;
-
-  // Recreate the iSAC encoder instance with the given settings, and save them.
-  void RecreateEncoderInstance(const Config& config);
-
-  Config config_;
-  typename T::instance_type* isac_state_ = nullptr;
-  rtc::scoped_refptr<LockedIsacBandwidthInfo> bwinfo_;
-
-  // Have we accepted input but not yet emitted it in a packet?
-  bool packet_in_progress_ = false;
-
-  // Timestamp of the first input of the currently in-progress packet.
-  uint32_t packet_timestamp_;
-
-  // Timestamp of the previously encoded packet.
-  uint32_t last_encoded_timestamp_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(AudioEncoderIsacT);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_AUDIO_ENCODER_ISAC_T_H_
diff --git a/modules/audio_coding/codecs/isac/audio_encoder_isac_t_impl.h b/modules/audio_coding/codecs/isac/audio_encoder_isac_t_impl.h
deleted file mode 100644
index 854f2ee..0000000
--- a/modules/audio_coding/codecs/isac/audio_encoder_isac_t_impl.h
+++ /dev/null
@@ -1,189 +0,0 @@
-/*
- *  Copyright (c) 2014 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_CODECS_ISAC_AUDIO_ENCODER_ISAC_T_IMPL_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_AUDIO_ENCODER_ISAC_T_IMPL_H_
-
-#include "webrtc/common_types.h"
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-
-template <typename T>
-typename AudioEncoderIsacT<T>::Config CreateIsacConfig(
-    const CodecInst& codec_inst,
-    const rtc::scoped_refptr<LockedIsacBandwidthInfo>& bwinfo) {
-  typename AudioEncoderIsacT<T>::Config config;
-  config.bwinfo = bwinfo;
-  config.payload_type = codec_inst.pltype;
-  config.sample_rate_hz = codec_inst.plfreq;
-  config.frame_size_ms =
-      rtc::CheckedDivExact(1000 * codec_inst.pacsize, config.sample_rate_hz);
-  config.adaptive_mode = (codec_inst.rate == -1);
-  if (codec_inst.rate != -1)
-    config.bit_rate = codec_inst.rate;
-  return config;
-}
-
-template <typename T>
-bool AudioEncoderIsacT<T>::Config::IsOk() const {
-  if (max_bit_rate < 32000 && max_bit_rate != -1)
-    return false;
-  if (max_payload_size_bytes < 120 && max_payload_size_bytes != -1)
-    return false;
-  if (adaptive_mode && !bwinfo)
-    return false;
-  switch (sample_rate_hz) {
-    case 16000:
-      if (max_bit_rate > 53400)
-        return false;
-      if (max_payload_size_bytes > 400)
-        return false;
-      return (frame_size_ms == 30 || frame_size_ms == 60) &&
-             (bit_rate == 0 || (bit_rate >= 10000 && bit_rate <= 32000));
-    case 32000:
-      if (max_bit_rate > 160000)
-        return false;
-      if (max_payload_size_bytes > 600)
-        return false;
-      return T::has_swb &&
-             (frame_size_ms == 30 &&
-              (bit_rate == 0 || (bit_rate >= 10000 && bit_rate <= 56000)));
-    default:
-      return false;
-  }
-}
-
-template <typename T>
-AudioEncoderIsacT<T>::AudioEncoderIsacT(const Config& config) {
-  RecreateEncoderInstance(config);
-}
-
-template <typename T>
-AudioEncoderIsacT<T>::AudioEncoderIsacT(
-    const CodecInst& codec_inst,
-    const rtc::scoped_refptr<LockedIsacBandwidthInfo>& bwinfo)
-    : AudioEncoderIsacT(CreateIsacConfig<T>(codec_inst, bwinfo)) {}
-
-template <typename T>
-AudioEncoderIsacT<T>::~AudioEncoderIsacT() {
-  RTC_CHECK_EQ(0, T::Free(isac_state_));
-}
-
-template <typename T>
-int AudioEncoderIsacT<T>::SampleRateHz() const {
-  return T::EncSampRate(isac_state_);
-}
-
-template <typename T>
-size_t AudioEncoderIsacT<T>::NumChannels() const {
-  return 1;
-}
-
-template <typename T>
-size_t AudioEncoderIsacT<T>::Num10MsFramesInNextPacket() const {
-  const int samples_in_next_packet = T::GetNewFrameLen(isac_state_);
-  return static_cast<size_t>(
-      rtc::CheckedDivExact(samples_in_next_packet,
-                           rtc::CheckedDivExact(SampleRateHz(), 100)));
-}
-
-template <typename T>
-size_t AudioEncoderIsacT<T>::Max10MsFramesInAPacket() const {
-  return 6;  // iSAC puts at most 60 ms in a packet.
-}
-
-template <typename T>
-int AudioEncoderIsacT<T>::GetTargetBitrate() const {
-  if (config_.adaptive_mode)
-    return -1;
-  return config_.bit_rate == 0 ? kDefaultBitRate : config_.bit_rate;
-}
-
-template <typename T>
-AudioEncoder::EncodedInfo AudioEncoderIsacT<T>::EncodeImpl(
-    uint32_t rtp_timestamp,
-    rtc::ArrayView<const int16_t> audio,
-    rtc::Buffer* encoded) {
-  if (!packet_in_progress_) {
-    // Starting a new packet; remember the timestamp for later.
-    packet_in_progress_ = true;
-    packet_timestamp_ = rtp_timestamp;
-  }
-  if (bwinfo_) {
-    IsacBandwidthInfo bwinfo = bwinfo_->Get();
-    T::SetBandwidthInfo(isac_state_, &bwinfo);
-  }
-
-  size_t encoded_bytes = encoded->AppendData(
-      kSufficientEncodeBufferSizeBytes,
-      [&] (rtc::ArrayView<uint8_t> encoded) {
-        int r = T::Encode(isac_state_, audio.data(), encoded.data());
-
-        RTC_CHECK_GE(r, 0) << "Encode failed (error code "
-                           << T::GetErrorCode(isac_state_) << ")";
-
-        return static_cast<size_t>(r);
-      });
-
-  if (encoded_bytes == 0)
-    return EncodedInfo();
-
-  // Got enough input to produce a packet. Return the saved timestamp from
-  // the first chunk of input that went into the packet.
-  packet_in_progress_ = false;
-  EncodedInfo info;
-  info.encoded_bytes = encoded_bytes;
-  info.encoded_timestamp = packet_timestamp_;
-  info.payload_type = config_.payload_type;
-  info.encoder_type = CodecType::kIsac;
-  return info;
-}
-
-template <typename T>
-void AudioEncoderIsacT<T>::Reset() {
-  RecreateEncoderInstance(config_);
-}
-
-template <typename T>
-void AudioEncoderIsacT<T>::RecreateEncoderInstance(const Config& config) {
-  RTC_CHECK(config.IsOk());
-  packet_in_progress_ = false;
-  bwinfo_ = config.bwinfo;
-  if (isac_state_)
-    RTC_CHECK_EQ(0, T::Free(isac_state_));
-  RTC_CHECK_EQ(0, T::Create(&isac_state_));
-  RTC_CHECK_EQ(0, T::EncoderInit(isac_state_, config.adaptive_mode ? 0 : 1));
-  RTC_CHECK_EQ(0, T::SetEncSampRate(isac_state_, config.sample_rate_hz));
-  const int bit_rate = config.bit_rate == 0 ? kDefaultBitRate : config.bit_rate;
-  if (config.adaptive_mode) {
-    RTC_CHECK_EQ(0, T::ControlBwe(isac_state_, bit_rate, config.frame_size_ms,
-                                  config.enforce_frame_size));
-  } else {
-    RTC_CHECK_EQ(0, T::Control(isac_state_, bit_rate, config.frame_size_ms));
-  }
-  if (config.max_payload_size_bytes != -1)
-    RTC_CHECK_EQ(
-        0, T::SetMaxPayloadSize(isac_state_, config.max_payload_size_bytes));
-  if (config.max_bit_rate != -1)
-    RTC_CHECK_EQ(0, T::SetMaxRate(isac_state_, config.max_bit_rate));
-
-  // Set the decoder sample rate even though we just use the encoder. This
-  // doesn't appear to be necessary to produce a valid encoding, but without it
-  // we get an encoding that isn't bit-for-bit identical with what a combined
-  // encoder+decoder object produces.
-  RTC_CHECK_EQ(0, T::SetDecSampRate(isac_state_, config.sample_rate_hz));
-
-  config_ = config;
-}
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_AUDIO_ENCODER_ISAC_T_IMPL_H_
diff --git a/modules/audio_coding/codecs/isac/bandwidth_info.h b/modules/audio_coding/codecs/isac/bandwidth_info.h
deleted file mode 100644
index 1e3f4c9..0000000
--- a/modules/audio_coding/codecs/isac/bandwidth_info.h
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- *  Copyright (c) 2015 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_CODECS_ISAC_BANDWIDTH_INFO_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_BANDWIDTH_INFO_H_
-
-#include "webrtc/typedefs.h"
-
-typedef struct {
-  int in_use;
-  int32_t send_bw_avg;
-  int32_t send_max_delay_avg;
-  int16_t bottleneck_idx;
-  int16_t jitter_info;
-} IsacBandwidthInfo;
-
-#endif  // WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_BANDWIDTH_INFO_H_
diff --git a/modules/audio_coding/codecs/isac/empty.cc b/modules/audio_coding/codecs/isac/empty.cc
deleted file mode 100644
index e69de29..0000000
--- a/modules/audio_coding/codecs/isac/empty.cc
+++ /dev/null
diff --git a/modules/audio_coding/codecs/isac/fix/include/audio_decoder_isacfix.h b/modules/audio_coding/codecs/isac/fix/include/audio_decoder_isacfix.h
deleted file mode 100644
index 4ddc3bb..0000000
--- a/modules/audio_coding/codecs/isac/fix/include/audio_decoder_isacfix.h
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- *  Copyright (c) 2015 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_CODECS_ISAC_FIX_INCLUDE_AUDIO_DECODER_ISACFIX_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_FIX_INCLUDE_AUDIO_DECODER_ISACFIX_H_
-
-#include "webrtc/modules/audio_coding/codecs/isac/audio_decoder_isac_t.h"
-#include "webrtc/modules/audio_coding/codecs/isac/fix/source/isac_fix_type.h"
-
-namespace webrtc {
-
-using AudioDecoderIsacFixImpl = AudioDecoderIsacT<IsacFix>;
-
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_FIX_INCLUDE_AUDIO_DECODER_ISACFIX_H_
diff --git a/modules/audio_coding/codecs/isac/fix/include/audio_encoder_isacfix.h b/modules/audio_coding/codecs/isac/fix/include/audio_encoder_isacfix.h
deleted file mode 100644
index aefad78..0000000
--- a/modules/audio_coding/codecs/isac/fix/include/audio_encoder_isacfix.h
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- *  Copyright (c) 2014 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_CODECS_ISAC_FIX_INCLUDE_AUDIO_ENCODER_ISACFIX_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_FIX_INCLUDE_AUDIO_ENCODER_ISACFIX_H_
-
-#include "webrtc/modules/audio_coding/codecs/isac/audio_encoder_isac_t.h"
-#include "webrtc/modules/audio_coding/codecs/isac/fix/source/isac_fix_type.h"
-
-namespace webrtc {
-
-using AudioEncoderIsacFixImpl = AudioEncoderIsacT<IsacFix>;
-
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_FIX_INCLUDE_AUDIO_ENCODER_ISACFIX_H_
diff --git a/modules/audio_coding/codecs/isac/fix/include/isacfix.h b/modules/audio_coding/codecs/isac/fix/include/isacfix.h
deleted file mode 100644
index 7f277ca..0000000
--- a/modules/audio_coding/codecs/isac/fix/include/isacfix.h
+++ /dev/null
@@ -1,637 +0,0 @@
-/*
- *  Copyright (c) 2011 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_CODECS_ISAC_FIX_INCLUDE_ISACFIX_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_FIX_INCLUDE_ISACFIX_H_
-
-#include <stddef.h>
-
-#include "webrtc/modules/audio_coding/codecs/isac/bandwidth_info.h"
-#include "webrtc/typedefs.h"
-
-typedef struct {
-  void *dummy;
-} ISACFIX_MainStruct;
-
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-
-  /**************************************************************************
-   * WebRtcIsacfix_AssignSize(...)
-   *
-   *  Functions used when malloc is not allowed
-   *  Output the number of bytes needed to allocate for iSAC struct.
-   *
-   */
-
-  int16_t WebRtcIsacfix_AssignSize(int *sizeinbytes);
-
-  /**************************************************************************
-   * WebRtcIsacfix_Assign(...)
-   *
-   * Functions used when malloc is not allowed, it
-   * places a struct at the given address.
-   *
-   * Input:
-   *      - *ISAC_main_inst   : a pointer to the coder instance.
-   *      - ISACFIX_inst_Addr : address of the memory where a space is
-   *                            for iSAC structure.
-   *
-   * Return value             : 0 - Ok
-   *                           -1 - Error
-   */
-
-  int16_t WebRtcIsacfix_Assign(ISACFIX_MainStruct **inst,
-                                     void *ISACFIX_inst_Addr);
-
-  /****************************************************************************
-   * WebRtcIsacfix_Create(...)
-   *
-   * This function creates an ISAC instance, which will contain the state
-   * information for one coding/decoding channel.
-   *
-   * Input:
-   *      - *ISAC_main_inst   : a pointer to the coder instance.
-   *
-   * Return value             : 0 - Ok
-   *                           -1 - Error
-   */
-
-  int16_t WebRtcIsacfix_Create(ISACFIX_MainStruct **ISAC_main_inst);
-
-
-  /****************************************************************************
-   * WebRtcIsacfix_Free(...)
-   *
-   * This function frees the ISAC instance created at the beginning.
-   *
-   * Input:
-   *      - ISAC_main_inst    : a ISAC instance.
-   *
-   * Return value             :  0 - Ok
-   *                            -1 - Error
-   */
-
-  int16_t WebRtcIsacfix_Free(ISACFIX_MainStruct *ISAC_main_inst);
-
-
-  /****************************************************************************
-   * WebRtcIsacfix_EncoderInit(...)
-   *
-   * This function initializes an ISAC instance prior to the encoder calls.
-   *
-   * Input:
-   *     - ISAC_main_inst     : ISAC instance.
-   *     - CodingMode         : 0 - Bit rate and frame length are automatically
-   *                                adjusted to available bandwidth on
-   *                                transmission channel.
-   *                            1 - User sets a frame length and a target bit
-   *                                rate which is taken as the maximum short-term
-   *                                average bit rate.
-   *
-   * Return value             :  0 - Ok
-   *                            -1 - Error
-   */
-
-  int16_t WebRtcIsacfix_EncoderInit(ISACFIX_MainStruct *ISAC_main_inst,
-                                    int16_t  CodingMode);
-
-
-  /****************************************************************************
-   * WebRtcIsacfix_Encode(...)
-   *
-   * This function encodes 10ms frame(s) and inserts it into a package.
-   * Input speech length has to be 160 samples (10ms). The encoder buffers those
-   * 10ms frames until it reaches the chosen Framesize (480 or 960 samples
-   * corresponding to 30 or 60 ms frames), and then proceeds to the encoding.
-   *
-   * Input:
-   *      - ISAC_main_inst    : ISAC instance.
-   *      - speechIn          : input speech vector.
-   *
-   * Output:
-   *      - encoded           : the encoded data vector
-   *
-   * Return value             : >0 - Length (in bytes) of coded data
-   *                             0 - The buffer didn't reach the chosen framesize
-   *                                 so it keeps buffering speech samples.
-   *                            -1 - Error
-   */
-
-  int WebRtcIsacfix_Encode(ISACFIX_MainStruct *ISAC_main_inst,
-                           const int16_t *speechIn,
-                           uint8_t* encoded);
-
-
-
-  /****************************************************************************
-   * WebRtcIsacfix_EncodeNb(...)
-   *
-   * This function encodes 10ms narrow band (8 kHz sampling) frame(s) and inserts
-   * it into a package. Input speech length has to be 80 samples (10ms). The encoder
-   * interpolates into wide-band (16 kHz sampling) buffers those
-   * 10ms frames until it reaches the chosen Framesize (480 or 960 wide-band samples
-   * corresponding to 30 or 60 ms frames), and then proceeds to the encoding.
-   *
-   * The function is enabled if WEBRTC_ISAC_FIX_NB_CALLS_ENABLED is defined
-   *
-   * Input:
-   *      - ISAC_main_inst    : ISAC instance.
-   *      - speechIn          : input speech vector.
-   *
-   * Output:
-   *      - encoded           : the encoded data vector
-   *
-   * Return value             : >0 - Length (in bytes) of coded data
-   *                             0 - The buffer didn't reach the chosen framesize
-   *                                 so it keeps buffering speech samples.
-   *                            -1 - Error
-   */
-
-
-#ifdef WEBRTC_ISAC_FIX_NB_CALLS_ENABLED
-  int16_t WebRtcIsacfix_EncodeNb(ISACFIX_MainStruct *ISAC_main_inst,
-                                 const int16_t *speechIn,
-                                 int16_t *encoded);
-#endif //  WEBRTC_ISAC_FIX_NB_CALLS_ENABLED
-
-
-
-  /****************************************************************************
-   * WebRtcIsacfix_DecoderInit(...)
-   *
-   * This function initializes an ISAC instance prior to the decoder calls.
-   *
-   * Input:
-   *  - ISAC_main_inst : ISAC instance.
-   */
-
-  void WebRtcIsacfix_DecoderInit(ISACFIX_MainStruct* ISAC_main_inst);
-
-  /****************************************************************************
-   * WebRtcIsacfix_UpdateBwEstimate1(...)
-   *
-   * This function updates the estimate of the bandwidth.
-   *
-   * Input:
-   *      - ISAC_main_inst    : ISAC instance.
-   *      - encoded           : encoded ISAC frame(s).
-   *      - packet_size       : size of the packet in bytes.
-   *      - rtp_seq_number    : the RTP number of the packet.
-   *      - arr_ts            : the arrival time of the packet (from NetEq)
-   *                            in samples.
-   *
-   * Return value             : 0 - Ok
-   *                           -1 - Error
-   */
-
-  int16_t WebRtcIsacfix_UpdateBwEstimate1(ISACFIX_MainStruct *ISAC_main_inst,
-                                          const uint8_t* encoded,
-                                          size_t packet_size,
-                                          uint16_t rtp_seq_number,
-                                          uint32_t arr_ts);
-
-  /****************************************************************************
-   * WebRtcIsacfix_UpdateBwEstimate(...)
-   *
-   * This function updates the estimate of the bandwidth.
-   *
-   * Input:
-   *      - ISAC_main_inst    : ISAC instance.
-   *      - encoded           : encoded ISAC frame(s).
-   *      - packet_size       : size of the packet in bytes.
-   *      - rtp_seq_number    : the RTP number of the packet.
-   *      - send_ts           : the send time of the packet from RTP header,
-   *                            in samples.
-   *      - arr_ts            : the arrival time of the packet (from NetEq)
-   *                            in samples.
-   *
-   * Return value             :  0 - Ok
-   *                            -1 - Error
-   */
-
-  int16_t WebRtcIsacfix_UpdateBwEstimate(ISACFIX_MainStruct *ISAC_main_inst,
-                                         const uint8_t* encoded,
-                                         size_t packet_size,
-                                         uint16_t rtp_seq_number,
-                                         uint32_t send_ts,
-                                         uint32_t arr_ts);
-
-  /****************************************************************************
-   * WebRtcIsacfix_Decode(...)
-   *
-   * This function decodes an ISAC frame. Output speech length
-   * will be a multiple of 480 samples: 480 or 960 samples,
-   * depending on the framesize (30 or 60 ms).
-   *
-   * Input:
-   *      - ISAC_main_inst    : ISAC instance.
-   *      - encoded           : encoded ISAC frame(s)
-   *      - len               : bytes in encoded vector
-   *
-   * Output:
-   *      - decoded           : The decoded vector
-   *
-   * Return value             : >0 - number of samples in decoded vector
-   *                            -1 - Error
-   */
-
-  int WebRtcIsacfix_Decode(ISACFIX_MainStruct *ISAC_main_inst,
-                           const uint8_t* encoded,
-                           size_t len,
-                           int16_t *decoded,
-                           int16_t *speechType);
-
-
-  /****************************************************************************
-   * WebRtcIsacfix_DecodeNb(...)
-   *
-   * This function decodes a ISAC frame in narrow-band (8 kHz sampling).
-   * Output speech length will be a multiple of 240 samples: 240 or 480 samples,
-   * depending on the framesize (30 or 60 ms).
-   *
-   * The function is enabled if WEBRTC_ISAC_FIX_NB_CALLS_ENABLED is defined
-   *
-   * Input:
-   *      - ISAC_main_inst    : ISAC instance.
-   *      - encoded           : encoded ISAC frame(s)
-   *      - len               : bytes in encoded vector
-   *
-   * Output:
-   *      - decoded           : The decoded vector
-   *
-   * Return value             : >0 - number of samples in decoded vector
-   *                            -1 - Error
-   */
-
-#ifdef WEBRTC_ISAC_FIX_NB_CALLS_ENABLED
-  int WebRtcIsacfix_DecodeNb(ISACFIX_MainStruct *ISAC_main_inst,
-                             const uint16_t *encoded,
-                             size_t len,
-                             int16_t *decoded,
-                             int16_t *speechType);
-#endif //  WEBRTC_ISAC_FIX_NB_CALLS_ENABLED
-
-
-  /****************************************************************************
-   * WebRtcIsacfix_DecodePlcNb(...)
-   *
-   * This function conducts PLC for ISAC frame(s) in narrow-band (8kHz sampling).
-   * Output speech length  will be "240*noOfLostFrames" samples
-   * that equevalent of "30*noOfLostFrames" millisecond.
-   *
-   * The function is enabled if WEBRTC_ISAC_FIX_NB_CALLS_ENABLED is defined
-   *
-   * Input:
-   *      - ISAC_main_inst    : ISAC instance.
-   *      - noOfLostFrames    : Number of PLC frames (240 sample=30ms) to produce
-   *                            NOTE! Maximum number is 2 (480 samples = 60ms)
-   *
-   * Output:
-   *      - decoded           : The decoded vector
-   *
-   * Return value             : Number of samples in decoded PLC vector
-   */
-
-#ifdef WEBRTC_ISAC_FIX_NB_CALLS_ENABLED
-  size_t WebRtcIsacfix_DecodePlcNb(ISACFIX_MainStruct *ISAC_main_inst,
-                                   int16_t *decoded,
-                                   size_t noOfLostFrames);
-#endif // WEBRTC_ISAC_FIX_NB_CALLS_ENABLED
-
-
-
-
-  /****************************************************************************
-   * WebRtcIsacfix_DecodePlc(...)
-   *
-   * This function conducts PLC for ISAC frame(s) in wide-band (16kHz sampling).
-   * Output speech length  will be "480*noOfLostFrames" samples
-   * that is equevalent of "30*noOfLostFrames" millisecond.
-   *
-   * Input:
-   *      - ISAC_main_inst    : ISAC instance.
-   *      - noOfLostFrames    : Number of PLC frames (480sample = 30ms)
-   *                            to produce
-   *                            NOTE! Maximum number is 2 (960 samples = 60ms)
-   *
-   * Output:
-   *      - decoded           : The decoded vector
-   *
-   * Return value             : Number of samples in decoded PLC vector
-   */
-
-  size_t WebRtcIsacfix_DecodePlc(ISACFIX_MainStruct *ISAC_main_inst,
-                                 int16_t *decoded,
-                                 size_t noOfLostFrames );
-
-
-  /****************************************************************************
-   * WebRtcIsacfix_ReadFrameLen(...)
-   *
-   * This function returns the length of the frame represented in the packet.
-   *
-   * Input:
-   *      - encoded           : Encoded bitstream
-   *      - encoded_len_bytes : Length of the bitstream in bytes.
-   *
-   * Output:
-   *      - frameLength       : Length of frame in packet (in samples)
-   *
-   */
-
-  int16_t WebRtcIsacfix_ReadFrameLen(const uint8_t* encoded,
-                                     size_t encoded_len_bytes,
-                                     size_t* frameLength);
-
-  /****************************************************************************
-   * WebRtcIsacfix_Control(...)
-   *
-   * This function sets the limit on the short-term average bit rate and the
-   * frame length. Should be used only in Instantaneous mode.
-   *
-   * Input:
-   *      - ISAC_main_inst    : ISAC instance.
-   *      - rate              : limit on the short-term average bit rate,
-   *                            in bits/second (between 10000 and 32000)
-   *      - framesize         : number of milliseconds per frame (30 or 60)
-   *
-   * Return value             : 0  - ok
-   *                           -1 - Error
-   */
-
-  int16_t WebRtcIsacfix_Control(ISACFIX_MainStruct *ISAC_main_inst,
-                                int16_t rate,
-                                int framesize);
-
-  void WebRtcIsacfix_SetInitialBweBottleneck(ISACFIX_MainStruct* ISAC_main_inst,
-                                             int bottleneck_bits_per_second);
-
-  /****************************************************************************
-   * WebRtcIsacfix_ControlBwe(...)
-   *
-   * This function sets the initial values of bottleneck and frame-size if
-   * iSAC is used in channel-adaptive mode. Through this API, users can
-   * enforce a frame-size for all values of bottleneck. Then iSAC will not
-   * automatically change the frame-size.
-   *
-   *
-   * Input:
-   *      - ISAC_main_inst    : ISAC instance.
-   *      - rateBPS           : initial value of bottleneck in bits/second
-   *                            10000 <= rateBPS <= 32000 is accepted
-   *      - frameSizeMs       : number of milliseconds per frame (30 or 60)
-   *      - enforceFrameSize  : 1 to enforce the given frame-size through out
-   *                            the adaptation process, 0 to let iSAC change
-   *                            the frame-size if required.
-   *
-   * Return value             : 0  - ok
-   *                           -1 - Error
-   */
-
-  int16_t WebRtcIsacfix_ControlBwe(ISACFIX_MainStruct *ISAC_main_inst,
-                                   int16_t rateBPS,
-                                   int frameSizeMs,
-                                   int16_t enforceFrameSize);
-
-
-
-  /****************************************************************************
-   * WebRtcIsacfix_version(...)
-   *
-   * This function returns the version number.
-   *
-   * Output:
-   *      - version      : Pointer to character string
-   *
-   */
-
-  void WebRtcIsacfix_version(char *version);
-
-
-  /****************************************************************************
-   * WebRtcIsacfix_GetErrorCode(...)
-   *
-   * This function can be used to check the error code of an iSAC instance. When
-   * a function returns -1 a error code will be set for that instance. The
-   * function below extract the code of the last error that occured in the
-   * specified instance.
-   *
-   * Input:
-   *  - ISAC_main_inst        : ISAC instance
-   *
-   * Return value             : Error code
-   */
-
-  int16_t WebRtcIsacfix_GetErrorCode(ISACFIX_MainStruct *ISAC_main_inst);
-
-
-  /****************************************************************************
-   * WebRtcIsacfix_GetUplinkBw(...)
-   *
-   * This function return iSAC send bitrate
-   *
-   * Input:
-   *      - ISAC_main_inst    : iSAC instance
-   *
-   * Return value             : <0 Error code
-   *                            else bitrate
-   */
-
-  int32_t WebRtcIsacfix_GetUplinkBw(ISACFIX_MainStruct *ISAC_main_inst);
-
-
-  /****************************************************************************
-   * WebRtcIsacfix_SetMaxPayloadSize(...)
-   *
-   * This function sets a limit for the maximum payload size of iSAC. The same
-   * value is used both for 30 and 60 msec packets.
-   * The absolute max will be valid until next time the function is called.
-   * NOTE! This function may override the function WebRtcIsacfix_SetMaxRate()
-   *
-   * Input:
-   *      - ISAC_main_inst    : iSAC instance
-   *      - maxPayloadBytes   : maximum size of the payload in bytes
-   *                            valid values are between 100 and 400 bytes
-   *
-   *
-   * Return value             : 0 if sucessful
-   *                           -1 if error happens
-   */
-
-  int16_t WebRtcIsacfix_SetMaxPayloadSize(ISACFIX_MainStruct *ISAC_main_inst,
-                                          int16_t maxPayloadBytes);
-
-
-  /****************************************************************************
-   * WebRtcIsacfix_SetMaxRate(...)
-   *
-   * This function sets the maximum rate which the codec may not exceed for a
-   * singel packet. The maximum rate is set in bits per second.
-   * The codec has an absolute maximum rate of 53400 bits per second (200 bytes
-   * per 30 msec).
-   * It is possible to set a maximum rate between 32000 and 53400 bits per second.
-   *
-   * The rate limit is valid until next time the function is called.
-   *
-   * NOTE! Packet size will never go above the value set if calling
-   * WebRtcIsacfix_SetMaxPayloadSize() (default max packet size is 400 bytes).
-   *
-   * Input:
-   *      - ISAC_main_inst    : iSAC instance
-   *      - maxRateInBytes    : maximum rate in bits per second,
-   *                            valid values are 32000 to 53400 bits
-   *
-   * Return value             : 0 if sucessful
-   *                           -1 if error happens
-   */
-
-  int16_t WebRtcIsacfix_SetMaxRate(ISACFIX_MainStruct *ISAC_main_inst,
-                                   int32_t maxRate);
-
-  /****************************************************************************
-   * WebRtcIsacfix_CreateInternal(...)
-   *
-   * This function creates the memory that is used to store data in the encoder
-   *
-   * Input:
-   *      - *ISAC_main_inst   : a pointer to the coder instance.
-   *
-   * Return value             : 0 - Ok
-   *                           -1 - Error
-   */
-
-  int16_t WebRtcIsacfix_CreateInternal(ISACFIX_MainStruct *ISAC_main_inst);
-
-
-  /****************************************************************************
-   * WebRtcIsacfix_FreeInternal(...)
-   *
-   * This function frees the internal memory for storing encoder data.
-   *
-   * Input:
-   *      - ISAC_main_inst        : an ISAC instance.
-   *
-   * Return value                 :  0 - Ok
-   *                                -1 - Error
-   */
-
-  int16_t WebRtcIsacfix_FreeInternal(ISACFIX_MainStruct *ISAC_main_inst);
-
-
-  /****************************************************************************
-   * WebRtcIsacfix_GetNewBitStream(...)
-   *
-   * This function returns encoded data, with the recieved bwe-index in the
-   * stream. It should always return a complete packet, i.e. only called once
-   * even for 60 msec frames
-   *
-   * Input:
-   *      - ISAC_main_inst    : ISAC instance.
-   *      - bweIndex          : index of bandwidth estimate to put in new bitstream
-   *      - scale             : factor for rate change (0.4 ~=> half the rate, 1 no change).
-   *
-   * Output:
-   *      - encoded           : the encoded data vector
-   *
-   * Return value             : >0 - Length (in bytes) of coded data
-   *                            -1 - Error
-   */
-
-  int16_t WebRtcIsacfix_GetNewBitStream(ISACFIX_MainStruct *ISAC_main_inst,
-                                        int16_t          bweIndex,
-                                        float              scale,
-                                        uint8_t* encoded);
-
-
-  /****************************************************************************
-   * WebRtcIsacfix_GetDownLinkBwIndex(...)
-   *
-   * This function returns index representing the Bandwidth estimate from
-   * other side to this side.
-   *
-   * Input:
-   *      - ISAC_main_inst    : iSAC struct
-   *
-   * Output:
-   *      - rateIndex         : Bandwidth estimate to transmit to other side.
-   *
-   */
-
-  int16_t WebRtcIsacfix_GetDownLinkBwIndex(ISACFIX_MainStruct* ISAC_main_inst,
-                                           int16_t*     rateIndex);
-
-
-  /****************************************************************************
-   * WebRtcIsacfix_UpdateUplinkBw(...)
-   *
-   * This function takes an index representing the Bandwidth estimate from
-   * this side to other side and updates BWE.
-   *
-   * Input:
-   *      - ISAC_main_inst    : iSAC struct
-   *      - rateIndex         : Bandwidth estimate from other side.
-   *
-   */
-
-  int16_t WebRtcIsacfix_UpdateUplinkBw(ISACFIX_MainStruct* ISAC_main_inst,
-                                       int16_t     rateIndex);
-
-
-  /****************************************************************************
-   * WebRtcIsacfix_ReadBwIndex(...)
-   *
-   * This function returns the index of the Bandwidth estimate from the bitstream.
-   *
-   * Input:
-   *      - encoded           : Encoded bitstream
-   *      - encoded_len_bytes : Length of the bitstream in bytes.
-   *
-   * Output:
-   *      - rateIndex         : Bandwidth estimate in bitstream
-   *
-   */
-
-  int16_t WebRtcIsacfix_ReadBwIndex(const uint8_t* encoded,
-                                    size_t encoded_len_bytes,
-                                    int16_t* rateIndex);
-
-
-  /****************************************************************************
-   * WebRtcIsacfix_GetNewFrameLen(...)
-   *
-   * This function return the next frame length (in samples) of iSAC.
-   *
-   * Input:
-   *      -ISAC_main_inst     : iSAC instance
-   *
-   * Return value             : frame lenght in samples
-   */
-
-  int16_t WebRtcIsacfix_GetNewFrameLen(ISACFIX_MainStruct *ISAC_main_inst);
-
-  /* Fills in an IsacBandwidthInfo struct. */
-  void WebRtcIsacfix_GetBandwidthInfo(ISACFIX_MainStruct* ISAC_main_inst,
-                                      IsacBandwidthInfo* bwinfo);
-
-  /* Uses the values from an IsacBandwidthInfo struct. */
-  void WebRtcIsacfix_SetBandwidthInfo(ISACFIX_MainStruct* ISAC_main_inst,
-                                      const IsacBandwidthInfo* bwinfo);
-
-#if defined(__cplusplus)
-}
-#endif
-
-
-
-#endif /* WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_FIX_INCLUDE_ISACFIX_H_ */
diff --git a/modules/audio_coding/codecs/isac/fix/source/arith_routines.c b/modules/audio_coding/codecs/isac/fix/source/arith_routines.c
deleted file mode 100644
index 5925d68..0000000
--- a/modules/audio_coding/codecs/isac/fix/source/arith_routines.c
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/*
- * arith_routins.c
- *
- * This C file contains a function for finalizing the bitstream
- * after arithmetic coding.
- *
- */
-
-#include "arith_routins.h"
-
-
-/****************************************************************************
- * WebRtcIsacfix_EncTerminate(...)
- *
- * Final call to the arithmetic coder for an encoder call. This function
- * terminates and return byte stream.
- *
- * Input:
- *      - streamData        : in-/output struct containing bitstream
- *
- * Return value             : number of bytes in the stream
- */
-int16_t WebRtcIsacfix_EncTerminate(Bitstr_enc *streamData)
-{
-  uint16_t *streamPtr;
-  uint16_t negCarry;
-
-  /* point to the right place in the stream buffer */
-  streamPtr = streamData->stream + streamData->stream_index;
-
-  /* find minimum length (determined by current interval width) */
-  if ( streamData->W_upper > 0x01FFFFFF )
-  {
-    streamData->streamval += 0x01000000;
-
-    /* if result is less than the added value we must take care of the carry */
-    if (streamData->streamval < 0x01000000)
-    {
-      /* propagate carry */
-      if (streamData->full == 0) {
-        /* Add value to current value */
-        negCarry = *streamPtr;
-        negCarry += 0x0100;
-        *streamPtr = negCarry;
-
-        /* if value is too big, propagate carry to next byte, and so on */
-        while (!(negCarry))
-        {
-          negCarry = *--streamPtr;
-          negCarry++;
-          *streamPtr = negCarry;
-        }
-      } else {
-        /* propagate carry by adding one to the previous byte in the
-         * stream if that byte is 0xFFFF we need to propagate the carry
-         * furhter back in the stream */
-        while ( !(++(*--streamPtr)) );
-      }
-
-      /* put pointer back to the old value */
-      streamPtr = streamData->stream + streamData->stream_index;
-    }
-    /* write remaining data to bitstream, if "full == 0" first byte has data */
-    if (streamData->full == 0) {
-      *streamPtr++ += (uint16_t)(streamData->streamval >> 24);
-      streamData->full = 1;
-    } else {
-      *streamPtr = (uint16_t)((streamData->streamval >> 24) << 8);
-      streamData->full = 0;
-    }
-  }
-  else
-  {
-    streamData->streamval += 0x00010000;
-
-    /* if result is less than the added value we must take care of the carry */
-    if (streamData->streamval < 0x00010000)
-    {
-      /* propagate carry */
-      if (streamData->full == 0) {
-        /* Add value to current value */
-        negCarry = *streamPtr;
-        negCarry += 0x0100;
-        *streamPtr = negCarry;
-
-        /* if value to big, propagate carry to next byte, and so on */
-        while (!(negCarry))
-        {
-          negCarry = *--streamPtr;
-          negCarry++;
-          *streamPtr = negCarry;
-        }
-      } else {
-        /* Add carry to previous byte */
-        while ( !(++(*--streamPtr)) );
-      }
-
-      /* put pointer back to the old value */
-      streamPtr = streamData->stream + streamData->stream_index;
-    }
-    /* write remaining data (2 bytes) to bitstream */
-    if (streamData->full) {
-      *streamPtr++ = (uint16_t)(streamData->streamval >> 16);
-    } else {
-      *streamPtr++ |= (uint16_t)(streamData->streamval >> 24);
-      *streamPtr = (uint16_t)(streamData->streamval >> 8) & 0xFF00;
-    }
-  }
-
-  /* calculate stream length in bytes */
-  return (((streamPtr - streamData->stream)<<1) + !(streamData->full));
-}
diff --git a/modules/audio_coding/codecs/isac/fix/source/arith_routines_hist.c b/modules/audio_coding/codecs/isac/fix/source/arith_routines_hist.c
deleted file mode 100644
index f1eb5ae..0000000
--- a/modules/audio_coding/codecs/isac/fix/source/arith_routines_hist.c
+++ /dev/null
@@ -1,401 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/*
- * arith_routinshist.c
- *
- * This C file contains arithmetic encoding and decoding.
- *
- */
-
-#include "arith_routins.h"
-
-
-/****************************************************************************
- * WebRtcIsacfix_EncHistMulti(...)
- *
- * Encode the histogram interval
- *
- * Input:
- *      - streamData        : in-/output struct containing bitstream
- *      - data              : data vector
- *      - cdf               : array of cdf arrays
- *      - lenData           : data vector length
- *
- * Return value             : 0 if ok
- *                            <0 if error detected
- */
-int WebRtcIsacfix_EncHistMulti(Bitstr_enc *streamData,
-                               const int16_t *data,
-                               const uint16_t *const *cdf,
-                               const int16_t lenData)
-{
-  uint32_t W_lower;
-  uint32_t W_upper;
-  uint32_t W_upper_LSB;
-  uint32_t W_upper_MSB;
-  uint16_t *streamPtr;
-  uint16_t negCarry;
-  uint16_t *maxStreamPtr;
-  uint16_t *streamPtrCarry;
-  uint32_t cdfLo;
-  uint32_t cdfHi;
-  int k;
-
-
-  /* point to beginning of stream buffer
-   * and set maximum streamPtr value */
-  streamPtr = streamData->stream + streamData->stream_index;
-  maxStreamPtr = streamData->stream + STREAM_MAXW16_60MS - 1;
-
-  W_upper = streamData->W_upper;
-
-  for (k = lenData; k > 0; k--)
-  {
-    /* fetch cdf_lower and cdf_upper from cdf tables */
-    cdfLo = (uint32_t) *(*cdf + (uint32_t)*data);
-    cdfHi = (uint32_t) *(*cdf++ + (uint32_t)*data++ + 1);
-
-    /* update interval */
-    W_upper_LSB = W_upper & 0x0000FFFF;
-    W_upper_MSB = W_upper >> 16;
-    W_lower = WEBRTC_SPL_UMUL(W_upper_MSB, cdfLo);
-    W_lower += ((W_upper_LSB * cdfLo) >> 16);
-    W_upper = WEBRTC_SPL_UMUL(W_upper_MSB, cdfHi);
-    W_upper += ((W_upper_LSB * cdfHi) >> 16);
-
-    /* shift interval such that it begins at zero */
-    W_upper -= ++W_lower;
-
-    /* add integer to bitstream */
-    streamData->streamval += W_lower;
-
-    /* handle carry */
-    if (streamData->streamval < W_lower)
-    {
-      /* propagate carry */
-      streamPtrCarry = streamPtr;
-      if (streamData->full == 0) {
-        negCarry = *streamPtrCarry;
-        negCarry += 0x0100;
-        *streamPtrCarry = negCarry;
-        while (!(negCarry))
-        {
-          negCarry = *--streamPtrCarry;
-          negCarry++;
-          *streamPtrCarry = negCarry;
-        }
-      } else {
-        while ( !(++(*--streamPtrCarry)) );
-      }
-    }
-
-    /* renormalize interval, store most significant byte of streamval and update streamval
-     * W_upper < 2^24 */
-    while ( !(W_upper & 0xFF000000) )
-    {
-      W_upper <<= 8;
-      if (streamData->full == 0) {
-        *streamPtr++ += (uint16_t)(streamData->streamval >> 24);
-        streamData->full = 1;
-      } else {
-        *streamPtr = (uint16_t)((streamData->streamval >> 24) << 8);
-        streamData->full = 0;
-      }
-
-      if( streamPtr > maxStreamPtr ) {
-        return -ISAC_DISALLOWED_BITSTREAM_LENGTH;
-      }
-      streamData->streamval <<= 8;
-    }
-  }
-
-  /* calculate new stream_index */
-  streamData->stream_index = streamPtr - streamData->stream;
-  streamData->W_upper = W_upper;
-
-  return 0;
-}
-
-
-/****************************************************************************
- * WebRtcIsacfix_DecHistBisectMulti(...)
- *
- * Function to decode more symbols from the arithmetic bytestream, using
- * method of bisection cdf tables should be of size 2^k-1 (which corresponds
- * to an alphabet size of 2^k-2)
- *
- * Input:
- *      - streamData        : in-/output struct containing bitstream
- *      - cdf               : array of cdf arrays
- *      - cdfSize           : array of cdf table sizes+1 (power of two: 2^k)
- *      - lenData           : data vector length
- *
- * Output:
- *      - data              : data vector
- *
- * Return value             : number of bytes in the stream
- *                            <0 if error detected
- */
-int16_t WebRtcIsacfix_DecHistBisectMulti(int16_t *data,
-                                         Bitstr_dec *streamData,
-                                         const uint16_t *const *cdf,
-                                         const uint16_t *cdfSize,
-                                         const int16_t lenData)
-{
-  uint32_t    W_lower = 0;
-  uint32_t    W_upper;
-  uint32_t    W_tmp;
-  uint32_t    W_upper_LSB;
-  uint32_t    W_upper_MSB;
-  uint32_t    streamval;
-  const uint16_t *streamPtr;
-  const uint16_t *cdfPtr;
-  int16_t     sizeTmp;
-  int             k;
-
-
-  streamPtr = streamData->stream + streamData->stream_index;
-  W_upper = streamData->W_upper;
-
-  /* Error check: should not be possible in normal operation */
-  if (W_upper == 0) {
-    return -2;
-  }
-
-  /* first time decoder is called for this stream */
-  if (streamData->stream_index == 0)
-  {
-    /* read first word from bytestream */
-    streamval = (uint32_t)*streamPtr++ << 16;
-    streamval |= *streamPtr++;
-  } else {
-    streamval = streamData->streamval;
-  }
-
-  for (k = lenData; k > 0; k--)
-  {
-    /* find the integer *data for which streamval lies in [W_lower+1, W_upper] */
-    W_upper_LSB = W_upper & 0x0000FFFF;
-    W_upper_MSB = W_upper >> 16;
-
-    /* start halfway the cdf range */
-    sizeTmp = *cdfSize++ / 2;
-    cdfPtr = *cdf + (sizeTmp - 1);
-
-    /* method of bisection */
-    for ( ;; )
-    {
-      W_tmp = WEBRTC_SPL_UMUL_32_16(W_upper_MSB, *cdfPtr);
-      W_tmp += (W_upper_LSB * (*cdfPtr)) >> 16;
-      sizeTmp /= 2;
-      if (sizeTmp == 0) {
-        break;
-      }
-
-      if (streamval > W_tmp)
-      {
-        W_lower = W_tmp;
-        cdfPtr += sizeTmp;
-      } else {
-        W_upper = W_tmp;
-        cdfPtr -= sizeTmp;
-      }
-    }
-    if (streamval > W_tmp)
-    {
-      W_lower = W_tmp;
-      *data++ = cdfPtr - *cdf++;
-    } else {
-      W_upper = W_tmp;
-      *data++ = cdfPtr - *cdf++ - 1;
-    }
-
-    /* shift interval to start at zero */
-    W_upper -= ++W_lower;
-
-    /* add integer to bitstream */
-    streamval -= W_lower;
-
-    /* renormalize interval and update streamval */
-    /* W_upper < 2^24 */
-    while ( !(W_upper & 0xFF000000) )
-    {
-      /* read next byte from stream */
-      if (streamData->full == 0) {
-        streamval = (streamval << 8) | (*streamPtr++ & 0x00FF);
-        streamData->full = 1;
-      } else {
-        streamval = (streamval << 8) | (*streamPtr >> 8);
-        streamData->full = 0;
-      }
-      W_upper <<= 8;
-    }
-
-
-    /* Error check: should not be possible in normal operation */
-    if (W_upper == 0) {
-      return -2;
-    }
-
-  }
-
-  streamData->stream_index = streamPtr - streamData->stream;
-  streamData->W_upper = W_upper;
-  streamData->streamval = streamval;
-
-  if ( W_upper > 0x01FFFFFF ) {
-    return (streamData->stream_index*2 - 3 + !streamData->full);
-  } else {
-    return (streamData->stream_index*2 - 2 + !streamData->full);
-  }
-}
-
-
-/****************************************************************************
- * WebRtcIsacfix_DecHistOneStepMulti(...)
- *
- * Function to decode more symbols from the arithmetic bytestream, taking
- * single step up or down at a time.
- * cdf tables can be of arbitrary size, but large tables may take a lot of
- * iterations.
- *
- * Input:
- *      - streamData        : in-/output struct containing bitstream
- *      - cdf               : array of cdf arrays
- *      - initIndex         : vector of initial cdf table search entries
- *      - lenData           : data vector length
- *
- * Output:
- *      - data              : data vector
- *
- * Return value             : number of bytes in original stream
- *                            <0 if error detected
- */
-int16_t WebRtcIsacfix_DecHistOneStepMulti(int16_t *data,
-                                          Bitstr_dec *streamData,
-                                          const uint16_t *const *cdf,
-                                          const uint16_t *initIndex,
-                                          const int16_t lenData)
-{
-  uint32_t    W_lower;
-  uint32_t    W_upper;
-  uint32_t    W_tmp;
-  uint32_t    W_upper_LSB;
-  uint32_t    W_upper_MSB;
-  uint32_t    streamval;
-  const uint16_t *streamPtr;
-  const uint16_t *cdfPtr;
-  int             k;
-
-
-  streamPtr = streamData->stream + streamData->stream_index;
-  W_upper = streamData->W_upper;
-  /* Error check: Should not be possible in normal operation */
-  if (W_upper == 0) {
-    return -2;
-  }
-
-  /* Check if it is the first time decoder is called for this stream */
-  if (streamData->stream_index == 0)
-  {
-    /* read first word from bytestream */
-    streamval = (uint32_t)(*streamPtr++) << 16;
-    streamval |= *streamPtr++;
-  } else {
-    streamval = streamData->streamval;
-  }
-
-  for (k = lenData; k > 0; k--)
-  {
-    /* find the integer *data for which streamval lies in [W_lower+1, W_upper] */
-    W_upper_LSB = W_upper & 0x0000FFFF;
-    W_upper_MSB = WEBRTC_SPL_RSHIFT_U32(W_upper, 16);
-
-    /* start at the specified table entry */
-    cdfPtr = *cdf + (*initIndex++);
-    W_tmp = WEBRTC_SPL_UMUL_32_16(W_upper_MSB, *cdfPtr);
-    W_tmp += (W_upper_LSB * (*cdfPtr)) >> 16;
-
-    if (streamval > W_tmp)
-    {
-      for ( ;; )
-      {
-        W_lower = W_tmp;
-
-        /* range check */
-        if (cdfPtr[0] == 65535) {
-          return -3;
-        }
-
-        W_tmp = WEBRTC_SPL_UMUL_32_16(W_upper_MSB, *++cdfPtr);
-        W_tmp += (W_upper_LSB * (*cdfPtr)) >> 16;
-
-        if (streamval <= W_tmp) {
-          break;
-        }
-      }
-      W_upper = W_tmp;
-      *data++ = cdfPtr - *cdf++ - 1;
-    } else {
-      for ( ;; )
-      {
-        W_upper = W_tmp;
-        --cdfPtr;
-
-        /* range check */
-        if (cdfPtr < *cdf) {
-          return -3;
-        }
-
-        W_tmp = WEBRTC_SPL_UMUL_32_16(W_upper_MSB, *cdfPtr);
-        W_tmp += (W_upper_LSB * (*cdfPtr)) >> 16;
-
-        if (streamval > W_tmp) {
-          break;
-        }
-      }
-      W_lower = W_tmp;
-      *data++ = cdfPtr - *cdf++;
-    }
-
-    /* shift interval to start at zero */
-    W_upper -= ++W_lower;
-
-    /* add integer to bitstream */
-    streamval -= W_lower;
-
-    /* renormalize interval and update streamval */
-    /* W_upper < 2^24 */
-    while ( !(W_upper & 0xFF000000) )
-    {
-      /* read next byte from stream */
-      if (streamData->full == 0) {
-        streamval = (streamval << 8) | (*streamPtr++ & 0x00FF);
-        streamData->full = 1;
-      } else {
-        streamval = (streamval << 8) | (*streamPtr >> 8);
-        streamData->full = 0;
-      }
-      W_upper <<= 8;
-    }
-  }
-
-  streamData->stream_index = streamPtr - streamData->stream;
-  streamData->W_upper = W_upper;
-  streamData->streamval = streamval;
-
-  /* find number of bytes in original stream (determined by current interval width) */
-  if ( W_upper > 0x01FFFFFF ) {
-    return (streamData->stream_index*2 - 3 + !streamData->full);
-  } else {
-    return (streamData->stream_index*2 - 2 + !streamData->full);
-  }
-}
diff --git a/modules/audio_coding/codecs/isac/fix/source/arith_routines_logist.c b/modules/audio_coding/codecs/isac/fix/source/arith_routines_logist.c
deleted file mode 100644
index 808aeb7..0000000
--- a/modules/audio_coding/codecs/isac/fix/source/arith_routines_logist.c
+++ /dev/null
@@ -1,413 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/*
- * arith_routinslogist.c
- *
- * This C file contains arithmetic encode and decode logistic
- *
- */
-
-#include "arith_routins.h"
-
-/* Tables for piecewise linear cdf functions: y = k*x */
-
-/* x Points for function piecewise() in Q15 */
-static const int32_t kHistEdges[51] = {
-  -327680, -314573, -301466, -288359, -275252, -262144, -249037, -235930, -222823, -209716,
-  -196608, -183501, -170394, -157287, -144180, -131072, -117965, -104858,  -91751,  -78644,
-  -65536,  -52429,  -39322,  -26215,  -13108,       0,   13107,   26214,   39321,   52428,
-  65536,   78643,   91750,  104857,  117964,  131072,  144179,  157286,  170393,  183500,
-  196608,  209715,  222822,  235929,  249036,  262144,  275251,  288358,  301465,  314572,
-  327680
-};
-
-
-/* k Points for function piecewise() in Q0 */
-static const uint16_t kCdfSlope[51] = {
-  5,    5,     5,     5,     5,     5,     5,     5,    5,    5,
-  5,    5,    13,    23,    47,    87,   154,   315,  700, 1088,
-  2471, 6064, 14221, 21463, 36634, 36924, 19750, 13270, 5806, 2312,
-  1095,  660,   316,   145,    86,    41,    32,     5,    5,    5,
-  5,    5,     5,     5,     5,     5,     5,     5,    5,    2,
-  0
-};
-
-/* y Points for function piecewise() in Q0 */
-static const uint16_t kCdfLogistic[51] = {
-  0,     2,     4,     6,     8,    10,    12,    14,    16,    18,
-  20,    22,    24,    29,    38,    57,    92,   153,   279,   559,
-  994,  1983,  4408, 10097, 18682, 33336, 48105, 56005, 61313, 63636,
-  64560, 64998, 65262, 65389, 65447, 65481, 65497, 65510, 65512, 65514,
-  65516, 65518, 65520, 65522, 65524, 65526, 65528, 65530, 65532, 65534,
-  65535
-};
-
-
-/****************************************************************************
- * WebRtcIsacfix_Piecewise(...)
- *
- * Piecewise linear function
- *
- * Input:
- *      - xinQ15           : input value x in Q15
- *
- * Return value            : korresponding y-value in Q0
- */
-
-
-static __inline uint16_t WebRtcIsacfix_Piecewise(int32_t xinQ15) {
-  int32_t ind;
-  int32_t qtmp1;
-  uint16_t qtmp2;
-
-  /* Find index for x-value */
-  qtmp1 = WEBRTC_SPL_SAT(kHistEdges[50],xinQ15,kHistEdges[0]);
-  ind = WEBRTC_SPL_MUL(5, qtmp1 - kHistEdges[0]);
-  ind >>= 16;
-
-  /* Calculate corresponding y-value ans return*/
-  qtmp1 = qtmp1 - kHistEdges[ind];
-  qtmp2 = (uint16_t)WEBRTC_SPL_RSHIFT_U32(
-      WEBRTC_SPL_UMUL_32_16(qtmp1,kCdfSlope[ind]), 15);
-  return (kCdfLogistic[ind] + qtmp2);
-}
-
-/****************************************************************************
- * WebRtcIsacfix_EncLogisticMulti2(...)
- *
- * Arithmetic coding of spectrum.
- *
- * Input:
- *      - streamData        : in-/output struct containing bitstream
- *      - dataQ7            : data vector in Q7
- *      - envQ8             : side info vector defining the width of the pdf
- *                            in Q8
- *      - lenData           : data vector length
- *
- * Return value             :  0 if ok,
- *                            <0 otherwise.
- */
-int WebRtcIsacfix_EncLogisticMulti2(Bitstr_enc *streamData,
-                                   int16_t *dataQ7,
-                                   const uint16_t *envQ8,
-                                   const int16_t lenData)
-{
-  uint32_t W_lower;
-  uint32_t W_upper;
-  uint16_t W_upper_LSB;
-  uint16_t W_upper_MSB;
-  uint16_t *streamPtr;
-  uint16_t *maxStreamPtr;
-  uint16_t *streamPtrCarry;
-  uint16_t negcarry;
-  uint32_t cdfLo;
-  uint32_t cdfHi;
-  int k;
-
-  /* point to beginning of stream buffer
-   * and set maximum streamPtr value */
-  streamPtr = streamData->stream + streamData->stream_index;
-  maxStreamPtr = streamData->stream + STREAM_MAXW16_60MS - 1;
-  W_upper = streamData->W_upper;
-
-  for (k = 0; k < lenData; k++)
-  {
-    /* compute cdf_lower and cdf_upper by evaluating the
-     * WebRtcIsacfix_Piecewise linear cdf */
-    cdfLo = WebRtcIsacfix_Piecewise(WEBRTC_SPL_MUL_16_U16(*dataQ7 - 64, *envQ8));
-    cdfHi = WebRtcIsacfix_Piecewise(WEBRTC_SPL_MUL_16_U16(*dataQ7 + 64, *envQ8));
-
-    /* test and clip if probability gets too small */
-    while ((cdfLo + 1) >= cdfHi) {
-      /* clip */
-      if (*dataQ7 > 0) {
-        *dataQ7 -= 128;
-        cdfHi = cdfLo;
-        cdfLo = WebRtcIsacfix_Piecewise(
-            WEBRTC_SPL_MUL_16_U16(*dataQ7 - 64, *envQ8));
-      } else {
-        *dataQ7 += 128;
-        cdfLo = cdfHi;
-        cdfHi = WebRtcIsacfix_Piecewise(
-            WEBRTC_SPL_MUL_16_U16(*dataQ7 + 64, *envQ8));
-      }
-    }
-
-    dataQ7++;
-    /* increment only once per 4 iterations */
-    envQ8 += (k & 1) & (k >> 1);
-
-
-    /* update interval */
-    W_upper_LSB = (uint16_t)W_upper;
-    W_upper_MSB = (uint16_t)WEBRTC_SPL_RSHIFT_U32(W_upper, 16);
-    W_lower = WEBRTC_SPL_UMUL_32_16(cdfLo, W_upper_MSB);
-    W_lower += (cdfLo * W_upper_LSB) >> 16;
-    W_upper = WEBRTC_SPL_UMUL_32_16(cdfHi, W_upper_MSB);
-    W_upper += (cdfHi * W_upper_LSB) >> 16;
-
-    /* shift interval such that it begins at zero */
-    W_upper -= ++W_lower;
-
-    /* add integer to bitstream */
-    streamData->streamval += W_lower;
-
-    /* handle carry */
-    if (streamData->streamval < W_lower)
-    {
-      /* propagate carry */
-      streamPtrCarry = streamPtr;
-      if (streamData->full == 0) {
-        negcarry = *streamPtrCarry;
-        negcarry += 0x0100;
-        *streamPtrCarry = negcarry;
-        while (!(negcarry))
-        {
-          negcarry = *--streamPtrCarry;
-          negcarry++;
-          *streamPtrCarry = negcarry;
-        }
-      } else {
-        while (!(++(*--streamPtrCarry)));
-      }
-    }
-
-    /* renormalize interval, store most significant byte of streamval and update streamval
-     * W_upper < 2^24 */
-    while ( !(W_upper & 0xFF000000) )
-    {
-      W_upper <<= 8;
-      if (streamData->full == 0) {
-        *streamPtr++ += (uint16_t) WEBRTC_SPL_RSHIFT_U32(
-            streamData->streamval, 24);
-        streamData->full = 1;
-      } else {
-        *streamPtr = (uint16_t)((streamData->streamval >> 24) << 8);
-        streamData->full = 0;
-      }
-
-      if( streamPtr > maxStreamPtr )
-        return -ISAC_DISALLOWED_BITSTREAM_LENGTH;
-
-      streamData->streamval <<= 8;
-    }
-  }
-
-  /* calculate new stream_index */
-  streamData->stream_index = streamPtr - streamData->stream;
-  streamData->W_upper = W_upper;
-
-  return 0;
-}
-
-
-/****************************************************************************
- * WebRtcIsacfix_DecLogisticMulti2(...)
- *
- * Arithmetic decoding of spectrum.
- *
- * Input:
- *      - streamData        : in-/output struct containing bitstream
- *      - envQ8             : side info vector defining the width of the pdf
- *                            in Q8
- *      - lenData           : data vector length
- *
- * Input/Output:
- *      - dataQ7            : input: dither vector, output: data vector
- *
- * Return value             : number of bytes in the stream so far
- *                            -1 if error detected
- */
-int WebRtcIsacfix_DecLogisticMulti2(int16_t *dataQ7,
-                                    Bitstr_dec *streamData,
-                                    const int32_t *envQ8,
-                                    const int16_t lenData)
-{
-  uint32_t    W_lower;
-  uint32_t    W_upper;
-  uint32_t    W_tmp;
-  uint16_t    W_upper_LSB;
-  uint16_t    W_upper_MSB;
-  uint32_t    streamVal;
-  uint16_t    cdfTmp;
-  int32_t     res;
-  int32_t     inSqrt;
-  int32_t     newRes;
-  const uint16_t *streamPtr;
-  int16_t     candQ7;
-  int16_t     envCount;
-  uint16_t    tmpARSpecQ8 = 0;
-  int             k, i;
-  int offset = 0;
-
-  /* point to beginning of stream buffer */
-  streamPtr = streamData->stream + streamData->stream_index;
-  W_upper = streamData->W_upper;
-
-  /* Check if it is first time decoder is called for this stream */
-  if (streamData->stream_index == 0)
-  {
-    /* read first word from bytestream */
-    streamVal = (uint32_t)(*streamPtr++) << 16;
-    streamVal |= *streamPtr++;
-
-  } else {
-    streamVal = streamData->streamval;
-  }
-
-
-  res = 1 << (WebRtcSpl_GetSizeInBits(envQ8[0]) >> 1);
-  envCount = 0;
-
-  /* code assumes lenData%4 == 0 */
-  for (k = 0; k < lenData; k += 4)
-  {
-    int k4;
-
-    /* convert to magnitude spectrum, by doing square-roots (modified from SPLIB) */
-    inSqrt = envQ8[envCount];
-    i = 10;
-
-    /* For safty reasons */
-    if (inSqrt < 0)
-      inSqrt=-inSqrt;
-
-    newRes = (inSqrt / res + res) >> 1;
-    do
-    {
-      res = newRes;
-      newRes = (inSqrt / res + res) >> 1;
-    } while (newRes != res && i-- > 0);
-
-    tmpARSpecQ8 = (uint16_t)newRes;
-
-    for(k4 = 0; k4 < 4; k4++)
-    {
-      /* find the integer *data for which streamVal lies in [W_lower+1, W_upper] */
-      W_upper_LSB = (uint16_t) (W_upper & 0x0000FFFF);
-      W_upper_MSB = (uint16_t) WEBRTC_SPL_RSHIFT_U32(W_upper, 16);
-
-      /* find first candidate by inverting the logistic cdf
-       * Input dither value collected from io-stream */
-      candQ7 = - *dataQ7 + 64;
-      cdfTmp = WebRtcIsacfix_Piecewise(WEBRTC_SPL_MUL_16_U16(candQ7, tmpARSpecQ8));
-
-      W_tmp = (uint32_t)cdfTmp * W_upper_MSB;
-      W_tmp += ((uint32_t)cdfTmp * (uint32_t)W_upper_LSB) >> 16;
-
-      if (streamVal > W_tmp)
-      {
-        W_lower = W_tmp;
-        candQ7 += 128;
-        cdfTmp = WebRtcIsacfix_Piecewise(WEBRTC_SPL_MUL_16_U16(candQ7, tmpARSpecQ8));
-
-        W_tmp = (uint32_t)cdfTmp * W_upper_MSB;
-        W_tmp += ((uint32_t)cdfTmp * (uint32_t)W_upper_LSB) >> 16;
-
-        while (streamVal > W_tmp)
-        {
-          W_lower = W_tmp;
-          candQ7 += 128;
-          cdfTmp = WebRtcIsacfix_Piecewise(
-              WEBRTC_SPL_MUL_16_U16(candQ7, tmpARSpecQ8));
-
-          W_tmp = (uint32_t)cdfTmp * W_upper_MSB;
-          W_tmp += ((uint32_t)cdfTmp * (uint32_t)W_upper_LSB) >> 16;
-
-          /* error check */
-          if (W_lower == W_tmp) {
-            return -1;
-          }
-        }
-        W_upper = W_tmp;
-
-        /* Output value put in dataQ7: another sample decoded */
-        *dataQ7 = candQ7 - 64;
-      }
-      else
-      {
-        W_upper = W_tmp;
-        candQ7 -= 128;
-        cdfTmp = WebRtcIsacfix_Piecewise(WEBRTC_SPL_MUL_16_U16(candQ7, tmpARSpecQ8));
-
-        W_tmp = (uint32_t)cdfTmp * W_upper_MSB;
-        W_tmp += ((uint32_t)cdfTmp * (uint32_t)W_upper_LSB) >> 16;
-
-        while ( !(streamVal > W_tmp) )
-        {
-          W_upper = W_tmp;
-          candQ7 -= 128;
-          cdfTmp = WebRtcIsacfix_Piecewise(
-              WEBRTC_SPL_MUL_16_U16(candQ7, tmpARSpecQ8));
-
-          W_tmp = (uint32_t)cdfTmp * W_upper_MSB;
-          W_tmp += ((uint32_t)cdfTmp * (uint32_t)W_upper_LSB) >> 16;
-
-          /* error check */
-          if (W_upper == W_tmp){
-            return -1;
-          }
-        }
-        W_lower = W_tmp;
-
-        /* Output value put in dataQ7: another sample decoded */
-        *dataQ7 = candQ7 + 64;
-      }
-
-      dataQ7++;
-
-      /* shift interval to start at zero */
-      W_upper -= ++W_lower;
-
-      /* add integer to bitstream */
-      streamVal -= W_lower;
-
-      /* renormalize interval and update streamVal
-       * W_upper < 2^24 */
-      while ( !(W_upper & 0xFF000000) )
-      {
-        if (streamPtr < streamData->stream + streamData->stream_size) {
-          /* read next byte from stream */
-          if (streamData->full == 0) {
-            streamVal = (streamVal << 8) | (*streamPtr++ & 0x00FF);
-            streamData->full = 1;
-          } else {
-            streamVal = (streamVal << 8) | (*streamPtr >> 8);
-            streamData->full = 0;
-          }
-        } else {
-          /* Intending to read outside the stream. This can happen for the last
-           * two or three bytes. It is how the algorithm is implemented. Do
-           * not read from the bit stream and insert zeros instead. */
-          streamVal <<= 8;
-          if (streamData->full == 0) {
-            offset++;  // We would have incremented the pointer in this case.
-            streamData->full = 1;
-          } else {
-            streamData->full = 0;
-          }
-        }
-        W_upper <<= 8;
-      }
-    }
-    envCount++;
-  }
-
-  streamData->stream_index = streamPtr + offset - streamData->stream;
-  streamData->W_upper = W_upper;
-  streamData->streamval = streamVal;
-
-  /* find number of bytes in original stream (determined by current interval width) */
-  if ( W_upper > 0x01FFFFFF )
-    return (streamData->stream_index*2 - 3 + !streamData->full);
-  else
-    return (streamData->stream_index*2 - 2 + !streamData->full);
-}
diff --git a/modules/audio_coding/codecs/isac/fix/source/arith_routins.h b/modules/audio_coding/codecs/isac/fix/source/arith_routins.h
deleted file mode 100644
index c76bf1a..0000000
--- a/modules/audio_coding/codecs/isac/fix/source/arith_routins.h
+++ /dev/null
@@ -1,160 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/*
- * arith_routins.h
- *
- * Functions for arithmetic coding.
- *
- */
-
-#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_FIX_SOURCE_ARITH_ROUTINS_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_FIX_SOURCE_ARITH_ROUTINS_H_
-
-#include "structs.h"
-
-
-/****************************************************************************
- * WebRtcIsacfix_EncLogisticMulti2(...)
- *
- * Arithmetic coding of spectrum.
- *
- * Input:
- *      - streamData        : in-/output struct containing bitstream
- *      - dataQ7            : data vector in Q7
- *      - envQ8             : side info vector defining the width of the pdf
- *                            in Q8
- *      - lenData           : data vector length
- *
- * Return value             :  0 if ok,
- *                             <0 otherwise.
- */
-int WebRtcIsacfix_EncLogisticMulti2(
-    Bitstr_enc *streamData,
-    int16_t *dataQ7,
-    const uint16_t *env,
-    const int16_t lenData);
-
-
-/****************************************************************************
- * WebRtcIsacfix_EncTerminate(...)
- *
- * Final call to the arithmetic coder for an encoder call. This function
- * terminates and return byte stream.
- *
- * Input:
- *      - streamData        : in-/output struct containing bitstream
- *
- * Return value             : number of bytes in the stream
- */
-int16_t WebRtcIsacfix_EncTerminate(Bitstr_enc *streamData);
-
-
-/****************************************************************************
- * WebRtcIsacfix_DecLogisticMulti2(...)
- *
- * Arithmetic decoding of spectrum.
- *
- * Input:
- *      - streamData        : in-/output struct containing bitstream
- *      - envQ8             : side info vector defining the width of the pdf
- *                            in Q8
- *      - lenData           : data vector length
- *
- * Input/Output:
- *      - dataQ7            : input: dither vector, output: data vector, in Q7
- *
- * Return value             : number of bytes in the stream so far
- *                            <0 if error detected
- */
-int WebRtcIsacfix_DecLogisticMulti2(
-    int16_t *data,
-    Bitstr_dec *streamData,
-    const int32_t *env,
-    const int16_t lenData);
-
-
-/****************************************************************************
- * WebRtcIsacfix_EncHistMulti(...)
- *
- * Encode the histogram interval
- *
- * Input:
- *      - streamData        : in-/output struct containing bitstream
- *      - data              : data vector
- *      - cdf               : array of cdf arrays
- *      - lenData           : data vector length
- *
- * Return value             : 0 if ok
- *                            <0 if error detected
- */
-int WebRtcIsacfix_EncHistMulti(
-    Bitstr_enc *streamData,
-    const int16_t *data,
-    const uint16_t *const *cdf,
-    const int16_t lenData);
-
-
-/****************************************************************************
- * WebRtcIsacfix_DecHistBisectMulti(...)
- *
- * Function to decode more symbols from the arithmetic bytestream, using
- * method of bisection.
- * C df tables should be of size 2^k-1 (which corresponds to an
- * alphabet size of 2^k-2)
- *
- * Input:
- *      - streamData        : in-/output struct containing bitstream
- *      - cdf               : array of cdf arrays
- *      - cdfSize           : array of cdf table sizes+1 (power of two: 2^k)
- *      - lenData           : data vector length
- *
- * Output:
- *      - data              : data vector
- *
- * Return value             : number of bytes in the stream
- *                            <0 if error detected
- */
-int16_t WebRtcIsacfix_DecHistBisectMulti(
-    int16_t *data,
-    Bitstr_dec *streamData,
-    const uint16_t *const *cdf,
-    const uint16_t *cdfSize,
-    const int16_t lenData);
-
-
-/****************************************************************************
- * WebRtcIsacfix_DecHistOneStepMulti(...)
- *
- * Function to decode more symbols from the arithmetic bytestream, taking
- * single step up or down at a time.
- * cdf tables can be of arbitrary size, but large tables may take a lot of
- * iterations.
- *
- * Input:
- *      - streamData        : in-/output struct containing bitstream
- *      - cdf               : array of cdf arrays
- *      - initIndex         : vector of initial cdf table search entries
- *      - lenData           : data vector length
- *
- * Output:
- *      - data              : data vector
- *
- * Return value             : number of bytes in original stream
- *                            <0 if error detected
- */
-int16_t WebRtcIsacfix_DecHistOneStepMulti(
-    int16_t *data,
-    Bitstr_dec *streamData,
-    const uint16_t *const *cdf,
-    const uint16_t *initIndex,
-    const int16_t lenData);
-
-#endif /* WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_FIX_SOURCE_ARITH_ROUTINS_H_ */
diff --git a/modules/audio_coding/codecs/isac/fix/source/audio_decoder_isacfix.cc b/modules/audio_coding/codecs/isac/fix/source/audio_decoder_isacfix.cc
deleted file mode 100644
index 45eefb9..0000000
--- a/modules/audio_coding/codecs/isac/fix/source/audio_decoder_isacfix.cc
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- *  Copyright (c) 2015 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/codecs/isac/fix/include/audio_decoder_isacfix.h"
-
-#include "webrtc/modules/audio_coding/codecs/isac/audio_decoder_isac_t_impl.h"
-
-namespace webrtc {
-
-// Explicit instantiation:
-template class AudioDecoderIsacT<IsacFix>;
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/codecs/isac/fix/source/audio_encoder_isacfix.cc b/modules/audio_coding/codecs/isac/fix/source/audio_encoder_isacfix.cc
deleted file mode 100644
index 257a8b5..0000000
--- a/modules/audio_coding/codecs/isac/fix/source/audio_encoder_isacfix.cc
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- *  Copyright (c) 2014 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/codecs/isac/fix/include/audio_encoder_isacfix.h"
-
-#include "webrtc/modules/audio_coding/codecs/isac/audio_encoder_isac_t_impl.h"
-
-namespace webrtc {
-
-// Explicit instantiation:
-template class AudioEncoderIsacT<IsacFix>;
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/codecs/isac/fix/source/bandwidth_estimator.c b/modules/audio_coding/codecs/isac/fix/source/bandwidth_estimator.c
deleted file mode 100644
index ab5aa0a..0000000
--- a/modules/audio_coding/codecs/isac/fix/source/bandwidth_estimator.c
+++ /dev/null
@@ -1,1037 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/*
- * bandwidth_estimator.c
- *
- * This file contains the code for the Bandwidth Estimator designed
- * for iSAC.
- *
- * NOTE! Castings needed for C55, do not remove!
- *
- */
-
-#include "bandwidth_estimator.h"
-
-#include "settings.h"
-#include "webrtc/rtc_base/checks.h"
-
-/* array of quantization levels for bottle neck info; Matlab code: */
-/* sprintf('%4.1ff, ', logspace(log10(5000), log10(40000), 12)) */
-static const int16_t kQRateTable[12] = {
-  10000, 11115, 12355, 13733, 15265, 16967,
-  18860, 20963, 23301, 25900, 28789, 32000
-};
-
-/* 0.1 times the values in the table kQRateTable */
-/* values are in Q16                                         */
-static const int32_t KQRate01[12] = {
-  65536000,  72843264,  80969728,  90000589,  100040704, 111194931,
-  123600896, 137383117, 152705434, 169738240, 188671590, 209715200
-};
-
-/* Bits per Bytes Seconds
- * 8 bits/byte * 1000 msec/sec * 1/framelength (in msec)->bits/byte*sec
- * frame length will either be 30 or 60 msec. 8738 is 1/60 in Q19 and 1/30 in Q18
- * The following number is either in Q15 or Q14 depending on the current frame length */
-static const int32_t kBitsByteSec = 4369000;
-
-/* Received header rate. First value is for 30 ms packets and second for 60 ms */
-static const int16_t kRecHeaderRate[2] = {
-  9333, 4666
-};
-
-/* Inverted minimum and maximum bandwidth in Q30.
-   minBwInv 30 ms, maxBwInv 30 ms,
-   minBwInv 60 ms, maxBwInv 69 ms
-*/
-static const int32_t kInvBandwidth[4] = {
-  55539, 25978,
-  73213, 29284
-};
-
-/* Number of samples in 25 msec */
-static const int32_t kSamplesIn25msec = 400;
-
-
-/****************************************************************************
- * WebRtcIsacfix_InitBandwidthEstimator(...)
- *
- * This function initializes the struct for the bandwidth estimator
- *
- * Input/Output:
- *      - bweStr        : Struct containing bandwidth information.
- *
- * Return value            : 0
- */
-int32_t WebRtcIsacfix_InitBandwidthEstimator(BwEstimatorstr *bweStr)
-{
-  bweStr->prevFrameSizeMs       = INIT_FRAME_LEN;
-  bweStr->prevRtpNumber         = 0;
-  bweStr->prevSendTime          = 0;
-  bweStr->prevArrivalTime       = 0;
-  bweStr->prevRtpRate           = 1;
-  bweStr->lastUpdate            = 0;
-  bweStr->lastReduction         = 0;
-  bweStr->countUpdates          = -9;
-
-  /* INIT_BN_EST = 20000
-   * INIT_BN_EST_Q7 = 2560000
-   * INIT_HDR_RATE = 4666
-   * INIT_REC_BN_EST_Q5 = 789312
-   *
-   * recBwInv = 1/(INIT_BN_EST + INIT_HDR_RATE) in Q30
-   * recBwAvg = INIT_BN_EST + INIT_HDR_RATE in Q5
-   */
-  bweStr->recBwInv              = 43531;
-  bweStr->recBw                 = INIT_BN_EST;
-  bweStr->recBwAvgQ             = INIT_BN_EST_Q7;
-  bweStr->recBwAvg              = INIT_REC_BN_EST_Q5;
-  bweStr->recJitter             = (int32_t) 327680;   /* 10 in Q15 */
-  bweStr->recJitterShortTerm    = 0;
-  bweStr->recJitterShortTermAbs = (int32_t) 40960;    /* 5 in Q13 */
-  bweStr->recMaxDelay           = (int32_t) 10;
-  bweStr->recMaxDelayAvgQ       = (int32_t) 5120;     /* 10 in Q9 */
-  bweStr->recHeaderRate         = INIT_HDR_RATE;
-  bweStr->countRecPkts          = 0;
-  bweStr->sendBwAvg             = INIT_BN_EST_Q7;
-  bweStr->sendMaxDelayAvg       = (int32_t) 5120;     /* 10 in Q9 */
-
-  bweStr->countHighSpeedRec     = 0;
-  bweStr->highSpeedRec          = 0;
-  bweStr->countHighSpeedSent    = 0;
-  bweStr->highSpeedSend         = 0;
-  bweStr->inWaitPeriod          = 0;
-
-  /* Find the inverse of the max bw and min bw in Q30
-   *  (1 / (MAX_ISAC_BW + INIT_HDR_RATE) in Q30
-   *  (1 / (MIN_ISAC_BW + INIT_HDR_RATE) in Q30
-   */
-  bweStr->maxBwInv              = kInvBandwidth[3];
-  bweStr->minBwInv              = kInvBandwidth[2];
-
-  bweStr->external_bw_info.in_use = 0;
-
-  return 0;
-}
-
-/****************************************************************************
- * WebRtcIsacfix_UpdateUplinkBwImpl(...)
- *
- * This function updates bottle neck rate received from other side in payload
- * and calculates a new bottle neck to send to the other side.
- *
- * Input/Output:
- *      - bweStr           : struct containing bandwidth information.
- *      - rtpNumber        : value from RTP packet, from NetEq
- *      - frameSize        : length of signal frame in ms, from iSAC decoder
- *      - sendTime         : value in RTP header giving send time in samples
- *      - arrivalTime      : value given by timeGetTime() time of arrival in
- *                           samples of packet from NetEq
- *      - pksize           : size of packet in bytes, from NetEq
- *      - Index            : integer (range 0...23) indicating bottle neck &
- *                           jitter as estimated by other side
- *
- * Return value            : 0 if everything went fine,
- *                           -1 otherwise
- */
-int32_t WebRtcIsacfix_UpdateUplinkBwImpl(BwEstimatorstr *bweStr,
-                                         const uint16_t rtpNumber,
-                                         const int16_t  frameSize,
-                                         const uint32_t sendTime,
-                                         const uint32_t arrivalTime,
-                                         const size_t   pksize,
-                                         const uint16_t Index)
-{
-  uint16_t  weight = 0;
-  uint32_t  currBwInv = 0;
-  uint16_t  recRtpRate;
-  uint32_t  arrTimeProj;
-  int32_t   arrTimeDiff;
-  int32_t   arrTimeNoise;
-  int32_t   arrTimeNoiseAbs;
-  int32_t   sendTimeDiff;
-
-  int32_t delayCorrFactor = DELAY_CORRECTION_MED;
-  int32_t lateDiff = 0;
-  int16_t immediateSet = 0;
-  int32_t frameSizeSampl;
-
-  int32_t  temp;
-  int32_t  msec;
-  uint32_t exponent;
-  uint32_t reductionFactor;
-  uint32_t numBytesInv;
-  int32_t  sign;
-
-  uint32_t byteSecondsPerBit;
-  uint32_t tempLower;
-  uint32_t tempUpper;
-  int32_t recBwAvgInv;
-  int32_t numPktsExpected;
-
-  int16_t errCode;
-
-  RTC_DCHECK(!bweStr->external_bw_info.in_use);
-
-  /* UPDATE ESTIMATES FROM OTHER SIDE */
-
-  /* The function also checks if Index has a valid value */
-  errCode = WebRtcIsacfix_UpdateUplinkBwRec(bweStr, Index);
-  if (errCode <0) {
-    return(errCode);
-  }
-
-
-  /* UPDATE ESTIMATES ON THIS SIDE */
-
-  /* Bits per second per byte * 1/30 or 1/60 */
-  if (frameSize == 60) {
-    /* If frameSize changed since last call, from 30 to 60, recalculate some values */
-    if ( (frameSize != bweStr->prevFrameSizeMs) && (bweStr->countUpdates > 0)) {
-      bweStr->countUpdates = 10;
-      bweStr->recHeaderRate = kRecHeaderRate[1];
-
-      bweStr->maxBwInv = kInvBandwidth[3];
-      bweStr->minBwInv = kInvBandwidth[2];
-      bweStr->recBwInv = 1073741824 / (bweStr->recBw + bweStr->recHeaderRate);
-    }
-
-    /* kBitsByteSec is in Q15 */
-    recRtpRate = (int16_t)((kBitsByteSec * pksize) >> 15) +
-        bweStr->recHeaderRate;
-
-  } else {
-    /* If frameSize changed since last call, from 60 to 30, recalculate some values */
-    if ( (frameSize != bweStr->prevFrameSizeMs) && (bweStr->countUpdates > 0)) {
-      bweStr->countUpdates = 10;
-      bweStr->recHeaderRate = kRecHeaderRate[0];
-
-      bweStr->maxBwInv = kInvBandwidth[1];
-      bweStr->minBwInv = kInvBandwidth[0];
-      bweStr->recBwInv = 1073741824 / (bweStr->recBw + bweStr->recHeaderRate);
-    }
-
-    /* kBitsByteSec is in Q14 */
-    recRtpRate = (uint16_t)((kBitsByteSec * pksize) >> 14) +
-        bweStr->recHeaderRate;
-  }
-
-
-  /* Check for timer wrap-around */
-  if (arrivalTime < bweStr->prevArrivalTime) {
-    bweStr->prevArrivalTime = arrivalTime;
-    bweStr->lastUpdate      = arrivalTime;
-    bweStr->lastReduction   = arrivalTime + FS3;
-
-    bweStr->countRecPkts      = 0;
-
-    /* store frame size */
-    bweStr->prevFrameSizeMs = frameSize;
-
-    /* store far-side transmission rate */
-    bweStr->prevRtpRate = recRtpRate;
-
-    /* store far-side RTP time stamp */
-    bweStr->prevRtpNumber = rtpNumber;
-
-    return 0;
-  }
-
-  bweStr->countRecPkts++;
-
-  /* Calculate framesize in msec */
-  frameSizeSampl = SAMPLES_PER_MSEC * frameSize;
-
-  /* Check that it's not one of the first 9 packets */
-  if ( bweStr->countUpdates > 0 ) {
-
-    /* Stay in Wait Period for 1.5 seconds (no updates in wait period) */
-    if(bweStr->inWaitPeriod) {
-      if ((arrivalTime - bweStr->startWaitPeriod)> FS_1_HALF) {
-        bweStr->inWaitPeriod = 0;
-      }
-    }
-
-    /* If not been updated for a long time, reduce the BN estimate */
-
-    /* Check send time difference between this packet and previous received      */
-    sendTimeDiff = sendTime - bweStr->prevSendTime;
-    if (sendTimeDiff <= frameSizeSampl * 2) {
-
-      /* Only update if 3 seconds has past since last update */
-      if ((arrivalTime - bweStr->lastUpdate) > FS3) {
-
-        /* Calculate expected number of received packets since last update */
-        numPktsExpected = (arrivalTime - bweStr->lastUpdate) / frameSizeSampl;
-
-        /* If received number of packets is more than 90% of expected (922 = 0.9 in Q10): */
-        /* do the update, else not                                                        */
-        if ((int32_t)bweStr->countRecPkts << 10 > 922 * numPktsExpected) {
-          /* Q4 chosen to approx dividing by 16 */
-          msec = (arrivalTime - bweStr->lastReduction);
-
-          /* the number below represents 13 seconds, highly unlikely
-             but to insure no overflow when reduction factor is multiplied by recBw inverse */
-          if (msec > 208000) {
-            msec = 208000;
-          }
-
-          /* Q20 2^(negative number: - 76/1048576) = .99995
-             product is Q24 */
-          exponent = WEBRTC_SPL_UMUL(0x0000004C, msec);
-
-          /* do the approx with positive exponent so that value is actually rf^-1
-             and multiply by bw inverse */
-          reductionFactor = WEBRTC_SPL_RSHIFT_U32(0x01000000 | (exponent & 0x00FFFFFF),
-                                                  WEBRTC_SPL_RSHIFT_U32(exponent, 24));
-
-          /* reductionFactor in Q13 */
-          reductionFactor = WEBRTC_SPL_RSHIFT_U32(reductionFactor, 11);
-
-          if ( reductionFactor != 0 ) {
-            bweStr->recBwInv = WEBRTC_SPL_MUL((int32_t)bweStr->recBwInv, (int32_t)reductionFactor);
-            bweStr->recBwInv = (int32_t)bweStr->recBwInv >> 13;
-
-          } else {
-            static const uint32_t kInitRate = INIT_BN_EST + INIT_HDR_RATE;
-            /* recBwInv = 1 / kInitRate  in Q26 (Q30??)*/
-            bweStr->recBwInv = (1073741824 + kInitRate / 2) / kInitRate;
-          }
-
-          /* reset time-since-update counter */
-          bweStr->lastReduction = arrivalTime;
-        } else {
-          /* Delay last reduction with 3 seconds */
-          bweStr->lastReduction = arrivalTime + FS3;
-          bweStr->lastUpdate    = arrivalTime;
-          bweStr->countRecPkts  = 0;
-        }
-      }
-    } else {
-      bweStr->lastReduction = arrivalTime + FS3;
-      bweStr->lastUpdate    = arrivalTime;
-      bweStr->countRecPkts  = 0;
-    }
-
-
-    /*   update only if previous packet was not lost */
-    if ( rtpNumber == bweStr->prevRtpNumber + 1 ) {
-      arrTimeDiff = arrivalTime - bweStr->prevArrivalTime;
-
-      if (!(bweStr->highSpeedSend && bweStr->highSpeedRec)) {
-        if (arrTimeDiff > frameSizeSampl) {
-          if (sendTimeDiff > 0) {
-            lateDiff = arrTimeDiff - sendTimeDiff - frameSizeSampl * 2;
-          } else {
-            lateDiff = arrTimeDiff - frameSizeSampl;
-          }
-
-          /* 8000 is 1/2 second (in samples at FS) */
-          if (lateDiff > 8000) {
-            delayCorrFactor = (int32_t) DELAY_CORRECTION_MAX;
-            bweStr->inWaitPeriod = 1;
-            bweStr->startWaitPeriod = arrivalTime;
-            immediateSet = 1;
-          } else if (lateDiff > 5120) {
-            delayCorrFactor = (int32_t) DELAY_CORRECTION_MED;
-            immediateSet = 1;
-            bweStr->inWaitPeriod = 1;
-            bweStr->startWaitPeriod = arrivalTime;
-          }
-        }
-      }
-
-      if ((bweStr->prevRtpRate > (int32_t)bweStr->recBwAvg >> 5) &&
-          (recRtpRate > (int32_t)bweStr->recBwAvg >> 5) &&
-          !bweStr->inWaitPeriod) {
-
-        /* test if still in initiation period and increment counter */
-        if (bweStr->countUpdates++ > 99) {
-          /* constant weight after initiation part, 0.01 in Q13 */
-          weight = (uint16_t) 82;
-        } else {
-          /* weight decreases with number of updates, 1/countUpdates in Q13  */
-          weight = (uint16_t) WebRtcSpl_DivW32W16(
-              8192 + (bweStr->countUpdates >> 1),
-              (int16_t)bweStr->countUpdates);
-        }
-
-        /* Bottle Neck Estimation */
-
-        /* limit outliers, if more than 25 ms too much */
-        if (arrTimeDiff > frameSizeSampl + kSamplesIn25msec) {
-          arrTimeDiff = frameSizeSampl + kSamplesIn25msec;
-        }
-
-        /* don't allow it to be less than frame rate - 10 ms */
-        if (arrTimeDiff < frameSizeSampl - FRAMESAMPLES_10ms) {
-          arrTimeDiff = frameSizeSampl - FRAMESAMPLES_10ms;
-        }
-
-        /* compute inverse receiving rate for last packet, in Q19 */
-        numBytesInv = (uint16_t) WebRtcSpl_DivW32W16(
-            (int32_t)(524288 + ((pksize + HEADER_SIZE) >> 1)),
-            (int16_t)(pksize + HEADER_SIZE));
-
-        /* 8389 is  ~ 1/128000 in Q30 */
-        byteSecondsPerBit = (uint32_t)(arrTimeDiff * 8389);
-
-        /* get upper N bits */
-        tempUpper = WEBRTC_SPL_RSHIFT_U32(byteSecondsPerBit, 15);
-
-        /* get lower 15 bits */
-        tempLower = byteSecondsPerBit & 0x00007FFF;
-
-        tempUpper = WEBRTC_SPL_MUL(tempUpper, numBytesInv);
-        tempLower = WEBRTC_SPL_MUL(tempLower, numBytesInv);
-        tempLower = WEBRTC_SPL_RSHIFT_U32(tempLower, 15);
-
-        currBwInv = tempUpper + tempLower;
-        currBwInv = WEBRTC_SPL_RSHIFT_U32(currBwInv, 4);
-
-        /* Limit inv rate. Note that minBwInv > maxBwInv! */
-        if(currBwInv < bweStr->maxBwInv) {
-          currBwInv = bweStr->maxBwInv;
-        } else if(currBwInv > bweStr->minBwInv) {
-          currBwInv = bweStr->minBwInv;
-        }
-
-        /* update bottle neck rate estimate */
-        bweStr->recBwInv = WEBRTC_SPL_UMUL(weight, currBwInv) +
-            WEBRTC_SPL_UMUL((uint32_t) 8192 - weight, bweStr->recBwInv);
-
-        /* Shift back to Q30 from Q40 (actual used bits shouldn't be more than 27 based on minBwInv)
-           up to 30 bits used with Q13 weight */
-        bweStr->recBwInv = WEBRTC_SPL_RSHIFT_U32(bweStr->recBwInv, 13);
-
-        /* reset time-since-update counter */
-        bweStr->lastUpdate    = arrivalTime;
-        bweStr->lastReduction = arrivalTime + FS3;
-        bweStr->countRecPkts  = 0;
-
-        /* to save resolution compute the inverse of recBwAvg in Q26 by left shifting numerator to 2^31
-           and NOT right shifting recBwAvg 5 bits to an integer
-           At max 13 bits are used
-           shift to Q5 */
-        recBwAvgInv = (0x80000000 + bweStr->recBwAvg / 2) / bweStr->recBwAvg;
-
-        /* Calculate Projected arrival time difference */
-
-        /* The numerator of the quotient can be 22 bits so right shift inv by 4 to avoid overflow
-           result in Q22 */
-        arrTimeProj = WEBRTC_SPL_MUL((int32_t)8000, recBwAvgInv);
-        /* shift to Q22 */
-        arrTimeProj = WEBRTC_SPL_RSHIFT_U32(arrTimeProj, 4);
-        /* complete calulation */
-        arrTimeProj = WEBRTC_SPL_MUL(((int32_t)pksize + HEADER_SIZE), arrTimeProj);
-        /* shift to Q10 */
-        arrTimeProj = WEBRTC_SPL_RSHIFT_U32(arrTimeProj, 12);
-
-        /* difference between projected and actual arrival time differences */
-        /* Q9 (only shift arrTimeDiff by 5 to simulate divide by 16 (need to revisit if change sampling rate) DH */
-        if ((arrTimeDiff << 6) > (int32_t)arrTimeProj) {
-          arrTimeNoise = (arrTimeDiff << 6) - arrTimeProj;
-          sign = 1;
-        } else {
-          arrTimeNoise = arrTimeProj - (arrTimeDiff << 6);
-          sign = -1;
-        }
-
-        /* Q9 */
-        arrTimeNoiseAbs = arrTimeNoise;
-
-        /* long term averaged absolute jitter, Q15 */
-        weight >>= 3;
-        bweStr->recJitter = weight * (arrTimeNoiseAbs << 5) +
-            (1024 - weight) * bweStr->recJitter;
-
-        /* remove the fractional portion */
-        bweStr->recJitter >>= 10;
-
-        /* Maximum jitter is 10 msec in Q15 */
-        if (bweStr->recJitter > (int32_t)327680) {
-          bweStr->recJitter = (int32_t)327680;
-        }
-
-        /* short term averaged absolute jitter */
-        /* Calculation in Q13 products in Q23 */
-        bweStr->recJitterShortTermAbs = 51 * (arrTimeNoiseAbs << 3) +
-            WEBRTC_SPL_MUL(973, bweStr->recJitterShortTermAbs);
-        bweStr->recJitterShortTermAbs >>= 10;
-
-        /* short term averaged jitter */
-        /* Calculation in Q13 products in Q23 */
-        bweStr->recJitterShortTerm = 205 * (arrTimeNoise << 3) * sign +
-            WEBRTC_SPL_MUL(3891, bweStr->recJitterShortTerm);
-
-        if (bweStr->recJitterShortTerm < 0) {
-          temp = -bweStr->recJitterShortTerm;
-          temp >>= 12;
-          bweStr->recJitterShortTerm = -temp;
-        } else {
-          bweStr->recJitterShortTerm >>= 12;
-        }
-      }
-    }
-  } else {
-    /* reset time-since-update counter when receiving the first 9 packets */
-    bweStr->lastUpdate    = arrivalTime;
-    bweStr->lastReduction = arrivalTime + FS3;
-    bweStr->countRecPkts  = 0;
-    bweStr->countUpdates++;
-  }
-
-  /* Limit to minimum or maximum bottle neck rate (in Q30) */
-  if (bweStr->recBwInv > bweStr->minBwInv) {
-    bweStr->recBwInv = bweStr->minBwInv;
-  } else if (bweStr->recBwInv < bweStr->maxBwInv) {
-    bweStr->recBwInv = bweStr->maxBwInv;
-  }
-
-
-  /* store frame length */
-  bweStr->prevFrameSizeMs = frameSize;
-
-  /* store far-side transmission rate */
-  bweStr->prevRtpRate = recRtpRate;
-
-  /* store far-side RTP time stamp */
-  bweStr->prevRtpNumber = rtpNumber;
-
-  /* Replace bweStr->recMaxDelay by the new value (atomic operation) */
-  if (bweStr->prevArrivalTime != 0xffffffff) {
-    bweStr->recMaxDelay = WEBRTC_SPL_MUL(3, bweStr->recJitter);
-  }
-
-  /* store arrival time stamp */
-  bweStr->prevArrivalTime = arrivalTime;
-  bweStr->prevSendTime = sendTime;
-
-  /* Replace bweStr->recBw by the new value */
-  bweStr->recBw = 1073741824 / bweStr->recBwInv - bweStr->recHeaderRate;
-
-  if (immediateSet) {
-    /* delay correction factor is in Q10 */
-    bweStr->recBw = WEBRTC_SPL_UMUL(delayCorrFactor, bweStr->recBw);
-    bweStr->recBw = WEBRTC_SPL_RSHIFT_U32(bweStr->recBw, 10);
-
-    if (bweStr->recBw < (int32_t) MIN_ISAC_BW) {
-      bweStr->recBw = (int32_t) MIN_ISAC_BW;
-    }
-
-    bweStr->recBwAvg = (bweStr->recBw + bweStr->recHeaderRate) << 5;
-
-    bweStr->recBwAvgQ = bweStr->recBw << 7;
-
-    bweStr->recJitterShortTerm = 0;
-
-    bweStr->recBwInv = 1073741824 / (bweStr->recBw + bweStr->recHeaderRate);
-
-    immediateSet = 0;
-  }
-
-
-  return 0;
-}
-
-/* This function updates the send bottle neck rate                                                   */
-/* Index         - integer (range 0...23) indicating bottle neck & jitter as estimated by other side */
-/* returns 0 if everything went fine, -1 otherwise                                                   */
-int16_t WebRtcIsacfix_UpdateUplinkBwRec(BwEstimatorstr *bweStr,
-                                        const int16_t Index)
-{
-  uint16_t RateInd;
-
-  RTC_DCHECK(!bweStr->external_bw_info.in_use);
-
-  if ( (Index < 0) || (Index > 23) ) {
-    return -ISAC_RANGE_ERROR_BW_ESTIMATOR;
-  }
-
-  /* UPDATE ESTIMATES FROM OTHER SIDE */
-
-  if ( Index > 11 ) {
-    RateInd = Index - 12;
-    /* compute the jitter estimate as decoded on the other side in Q9 */
-    /* sendMaxDelayAvg = 0.9 * sendMaxDelayAvg + 0.1 * MAX_ISAC_MD */
-    bweStr->sendMaxDelayAvg = WEBRTC_SPL_MUL(461, bweStr->sendMaxDelayAvg) +
-        51 * (MAX_ISAC_MD << 9);
-    bweStr->sendMaxDelayAvg >>= 9;
-
-  } else {
-    RateInd = Index;
-    /* compute the jitter estimate as decoded on the other side in Q9 */
-    /* sendMaxDelayAvg = 0.9 * sendMaxDelayAvg + 0.1 * MIN_ISAC_MD */
-    bweStr->sendMaxDelayAvg = WEBRTC_SPL_MUL(461, bweStr->sendMaxDelayAvg) +
-        51 * (MIN_ISAC_MD << 9);
-    bweStr->sendMaxDelayAvg >>= 9;
-
-  }
-
-
-  /* compute the BN estimate as decoded on the other side */
-  /* sendBwAvg = 0.9 * sendBwAvg + 0.1 * kQRateTable[RateInd]; */
-  bweStr->sendBwAvg = 461 * bweStr->sendBwAvg +
-      51 * ((uint32_t)kQRateTable[RateInd] << 7);
-  bweStr->sendBwAvg = WEBRTC_SPL_RSHIFT_U32(bweStr->sendBwAvg, 9);
-
-
-  if (WEBRTC_SPL_RSHIFT_U32(bweStr->sendBwAvg, 7) > 28000 && !bweStr->highSpeedSend) {
-    bweStr->countHighSpeedSent++;
-
-    /* approx 2 seconds with 30ms frames */
-    if (bweStr->countHighSpeedSent >= 66) {
-      bweStr->highSpeedSend = 1;
-    }
-  } else if (!bweStr->highSpeedSend) {
-    bweStr->countHighSpeedSent = 0;
-  }
-
-  return 0;
-}
-
-/****************************************************************************
- * WebRtcIsacfix_GetDownlinkBwIndexImpl(...)
- *
- * This function calculates and returns the bandwidth/jitter estimation code
- * (integer 0...23) to put in the sending iSAC payload.
- *
- * Input:
- *      - bweStr       : BWE struct
- *
- * Return:
- *      bandwith and jitter index (0..23)
- */
-uint16_t WebRtcIsacfix_GetDownlinkBwIndexImpl(BwEstimatorstr *bweStr)
-{
-  int32_t  rate;
-  int32_t  maxDelay;
-  uint16_t rateInd;
-  uint16_t maxDelayBit;
-  int32_t  tempTerm1;
-  int32_t  tempTerm2;
-  int32_t  tempTermX;
-  int32_t  tempTermY;
-  int32_t  tempMin;
-  int32_t  tempMax;
-
-  if (bweStr->external_bw_info.in_use)
-    return bweStr->external_bw_info.bottleneck_idx;
-
-  /* Get Rate Index */
-
-  /* Get unquantized rate. Always returns 10000 <= rate <= 32000 */
-  rate = WebRtcIsacfix_GetDownlinkBandwidth(bweStr);
-
-  /* Compute the averaged BN estimate on this side */
-
-  /* recBwAvg = 0.9 * recBwAvg + 0.1 * (rate + bweStr->recHeaderRate), 0.9 and 0.1 in Q9 */
-  bweStr->recBwAvg = 922 * bweStr->recBwAvg +
-      102 * (((uint32_t)rate + bweStr->recHeaderRate) << 5);
-  bweStr->recBwAvg = WEBRTC_SPL_RSHIFT_U32(bweStr->recBwAvg, 10);
-
-  /* Find quantization index that gives the closest rate after averaging.
-   * Note that we don't need to check the last value, rate <= kQRateTable[11],
-   * because we will use rateInd = 11 even if rate > kQRateTable[11]. */
-  for (rateInd = 1; rateInd < 11; rateInd++) {
-    if (rate <= kQRateTable[rateInd]){
-      break;
-    }
-  }
-
-  /* find closest quantization index, and update quantized average by taking: */
-  /* 0.9*recBwAvgQ + 0.1*kQRateTable[rateInd] */
-
-  /* 0.9 times recBwAvgQ in Q16 */
-  /* 461/512 - 25/65536 =0.900009 */
-  tempTerm1 = WEBRTC_SPL_MUL(bweStr->recBwAvgQ, 25);
-  tempTerm1 >>= 7;
-  tempTermX = WEBRTC_SPL_UMUL(461, bweStr->recBwAvgQ) - tempTerm1;
-
-  /* rate in Q16 */
-  tempTermY = rate << 16;
-
-  /* 0.1 * kQRateTable[rateInd] = KQRate01[rateInd] */
-  tempTerm1 = tempTermX + KQRate01[rateInd] - tempTermY;
-  tempTerm2 = tempTermY - tempTermX - KQRate01[rateInd-1];
-
-  /* Compare (0.9 * recBwAvgQ + 0.1 * kQRateTable[rateInd] - rate) >
-     (rate - 0.9 * recBwAvgQ - 0.1 * kQRateTable[rateInd-1]) */
-  if (tempTerm1  > tempTerm2) {
-    rateInd--;
-  }
-
-  /* Update quantized average by taking:                  */
-  /* 0.9*recBwAvgQ + 0.1*kQRateTable[rateInd] */
-
-  /* Add 0.1 times kQRateTable[rateInd], in Q16 */
-  tempTermX += KQRate01[rateInd];
-
-  /* Shift back to Q7 */
-  bweStr->recBwAvgQ = tempTermX >> 9;
-
-  /* Count consecutive received bandwidth above 28000 kbps (28000 in Q7 = 3584000) */
-  /* If 66 high estimates in a row, set highSpeedRec to one */
-  /* 66 corresponds to ~2 seconds in 30 msec mode */
-  if ((bweStr->recBwAvgQ > 3584000) && !bweStr->highSpeedRec) {
-    bweStr->countHighSpeedRec++;
-    if (bweStr->countHighSpeedRec >= 66) {
-      bweStr->highSpeedRec = 1;
-    }
-  } else if (!bweStr->highSpeedRec)    {
-    bweStr->countHighSpeedRec = 0;
-  }
-
-  /* Get Max Delay Bit */
-
-  /* get unquantized max delay */
-  maxDelay = WebRtcIsacfix_GetDownlinkMaxDelay(bweStr);
-
-  /* Update quantized max delay average */
-  tempMax = 652800; /* MAX_ISAC_MD * 0.1 in Q18 */
-  tempMin = 130560; /* MIN_ISAC_MD * 0.1 in Q18 */
-  tempTermX = WEBRTC_SPL_MUL((int32_t)bweStr->recMaxDelayAvgQ, (int32_t)461);
-  tempTermY = maxDelay << 18;
-
-  tempTerm1 = tempTermX + tempMax - tempTermY;
-  tempTerm2 = tempTermY - tempTermX - tempMin;
-
-  if ( tempTerm1 > tempTerm2) {
-    maxDelayBit = 0;
-    tempTerm1 = tempTermX + tempMin;
-
-    /* update quantized average, shift back to Q9 */
-    bweStr->recMaxDelayAvgQ = tempTerm1 >> 9;
-  } else {
-    maxDelayBit = 12;
-    tempTerm1 =  tempTermX + tempMax;
-
-    /* update quantized average, shift back to Q9 */
-    bweStr->recMaxDelayAvgQ = tempTerm1 >> 9;
-  }
-
-  /* Return bandwitdh and jitter index (0..23) */
-  return (uint16_t)(rateInd + maxDelayBit);
-}
-
-/* get the bottle neck rate from far side to here, as estimated on this side */
-uint16_t WebRtcIsacfix_GetDownlinkBandwidth(const BwEstimatorstr *bweStr)
-{
-  uint32_t  recBw;
-  int32_t   jitter_sign; /* Q8 */
-  int32_t   bw_adjust;   /* Q16 */
-  int32_t   rec_jitter_short_term_abs_inv; /* Q18 */
-  int32_t   temp;
-
-  RTC_DCHECK(!bweStr->external_bw_info.in_use);
-
-  /* Q18  rec jitter short term abs is in Q13, multiply it by 2^13 to save precision
-     2^18 then needs to be shifted 13 bits to 2^31 */
-  rec_jitter_short_term_abs_inv = 0x80000000u / bweStr->recJitterShortTermAbs;
-
-  /* Q27 = 9 + 18 */
-  jitter_sign = (bweStr->recJitterShortTerm >> 4) *
-      rec_jitter_short_term_abs_inv;
-
-  if (jitter_sign < 0) {
-    temp = -jitter_sign;
-    temp >>= 19;
-    jitter_sign = -temp;
-  } else {
-    jitter_sign >>= 19;
-  }
-
-  /* adjust bw proportionally to negative average jitter sign */
-  //bw_adjust = 1.0f - jitter_sign * (0.15f + 0.15f * jitter_sign * jitter_sign);
-  //Q8 -> Q16 .15 +.15 * jitter^2 first term is .15 in Q16 latter term is Q8*Q8*Q8
-  //38 in Q8 ~.15 9830 in Q16 ~.15
-  temp = 9830 + ((38 * jitter_sign * jitter_sign) >> 8);
-
-  if (jitter_sign < 0) {
-    temp = WEBRTC_SPL_MUL(jitter_sign, temp);
-    temp = -temp;
-    temp >>= 8;
-    bw_adjust = (uint32_t)65536 + temp; /* (1 << 16) + temp; */
-  } else {
-    /* (1 << 16) - ((jitter_sign * temp) >> 8); */
-    bw_adjust = 65536 - ((jitter_sign * temp) >> 8);
-  }
-
-  //make sure following multiplication won't overflow
-  //bw adjust now Q14
-  bw_adjust >>= 2;  // See if good resolution is maintained.
-
-  /* adjust Rate if jitter sign is mostly constant */
-  recBw = WEBRTC_SPL_UMUL(bweStr->recBw, bw_adjust);
-
-  recBw >>= 14;
-
-  /* limit range of bottle neck rate */
-  if (recBw < MIN_ISAC_BW) {
-    recBw = MIN_ISAC_BW;
-  } else if (recBw > MAX_ISAC_BW) {
-    recBw = MAX_ISAC_BW;
-  }
-
-  return  (uint16_t) recBw;
-}
-
-/* Returns the mmax delay (in ms) */
-int16_t WebRtcIsacfix_GetDownlinkMaxDelay(const BwEstimatorstr *bweStr)
-{
-  int16_t recMaxDelay = (int16_t)(bweStr->recMaxDelay >> 15);
-
-  RTC_DCHECK(!bweStr->external_bw_info.in_use);
-
-  /* limit range of jitter estimate */
-  if (recMaxDelay < MIN_ISAC_MD) {
-    recMaxDelay = MIN_ISAC_MD;
-  } else if (recMaxDelay > MAX_ISAC_MD) {
-    recMaxDelay = MAX_ISAC_MD;
-  }
-
-  return recMaxDelay;
-}
-
-/* Clamp val to the closed interval [min,max]. */
-static int16_t clamp(int16_t val, int16_t min, int16_t max) {
-  RTC_DCHECK_LE(min, max);
-  return val < min ? min : (val > max ? max : val);
-}
-
-int16_t WebRtcIsacfix_GetUplinkBandwidth(const BwEstimatorstr* bweStr) {
-  return bweStr->external_bw_info.in_use
-             ? bweStr->external_bw_info.send_bw_avg
-             : clamp(bweStr->sendBwAvg >> 7, MIN_ISAC_BW, MAX_ISAC_BW);
-}
-
-int16_t WebRtcIsacfix_GetUplinkMaxDelay(const BwEstimatorstr* bweStr) {
-  return bweStr->external_bw_info.in_use
-             ? bweStr->external_bw_info.send_max_delay_avg
-             : clamp(bweStr->sendMaxDelayAvg >> 9, MIN_ISAC_MD, MAX_ISAC_MD);
-}
-
-void WebRtcIsacfixBw_GetBandwidthInfo(BwEstimatorstr* bweStr,
-                                   IsacBandwidthInfo* bwinfo) {
-  RTC_DCHECK(!bweStr->external_bw_info.in_use);
-  bwinfo->in_use = 1;
-  bwinfo->send_bw_avg = WebRtcIsacfix_GetUplinkBandwidth(bweStr);
-  bwinfo->send_max_delay_avg = WebRtcIsacfix_GetUplinkMaxDelay(bweStr);
-  bwinfo->bottleneck_idx = WebRtcIsacfix_GetDownlinkBwIndexImpl(bweStr);
-  bwinfo->jitter_info = 0;  // Not used.
-}
-
-void WebRtcIsacfixBw_SetBandwidthInfo(BwEstimatorstr* bweStr,
-                                   const IsacBandwidthInfo* bwinfo) {
-  memcpy(&bweStr->external_bw_info, bwinfo,
-         sizeof bweStr->external_bw_info);
-}
-
-/*
- * update long-term average bitrate and amount of data in buffer
- * returns minimum payload size (bytes)
- */
-uint16_t WebRtcIsacfix_GetMinBytes(RateModel *State,
-                                   int16_t StreamSize,                    /* bytes in bitstream */
-                                   const int16_t FrameSamples,            /* samples per frame */
-                                   const int16_t BottleNeck,        /* bottle neck rate; excl headers (bps) */
-                                   const int16_t DelayBuildUp)      /* max delay from bottle neck buffering (ms) */
-{
-  int32_t MinRate = 0;
-  uint16_t    MinBytes;
-  int16_t TransmissionTime;
-  int32_t inv_Q12;
-  int32_t den;
-
-
-  /* first 10 packets @ low rate, then INIT_BURST_LEN packets @ fixed rate of INIT_RATE bps */
-  if (State->InitCounter > 0) {
-    if (State->InitCounter-- <= INIT_BURST_LEN) {
-      MinRate = INIT_RATE;
-    } else {
-      MinRate = 0;
-    }
-  } else {
-    /* handle burst */
-    if (State->BurstCounter) {
-      if (State->StillBuffered <
-          (((512 - 512 / BURST_LEN) * DelayBuildUp) >> 9)) {
-        /* max bps derived from BottleNeck and DelayBuildUp values */
-        inv_Q12 = 4096 / (BURST_LEN * FrameSamples);
-        MinRate = (512 + SAMPLES_PER_MSEC * ((DelayBuildUp * inv_Q12) >> 3)) *
-            BottleNeck;
-      } else {
-        /* max bps derived from StillBuffered and DelayBuildUp values */
-        inv_Q12 = 4096 / FrameSamples;
-        if (DelayBuildUp > State->StillBuffered) {
-          MinRate = (512 + SAMPLES_PER_MSEC * (((DelayBuildUp -
-              State->StillBuffered) * inv_Q12) >> 3)) * BottleNeck;
-        } else if ((den = WEBRTC_SPL_MUL(SAMPLES_PER_MSEC, (State->StillBuffered - DelayBuildUp))) >= FrameSamples) {
-          /* MinRate will be negative here */
-          MinRate = 0;
-        } else {
-          MinRate = (512 - ((den * inv_Q12) >> 3)) * BottleNeck;
-        }
-        //if (MinRate < 1.04 * BottleNeck)
-        //    MinRate = 1.04 * BottleNeck;
-        //Q9
-        if (MinRate < WEBRTC_SPL_MUL(532, BottleNeck)) {
-          MinRate += WEBRTC_SPL_MUL(22, BottleNeck);
-        }
-      }
-
-      State->BurstCounter--;
-    }
-  }
-
-
-  /* convert rate from bits/second to bytes/packet */
-  //round and shift before conversion
-  MinRate += 256;
-  MinRate >>= 9;
-  MinBytes = MinRate * FrameSamples / FS8;
-
-  /* StreamSize will be adjusted if less than MinBytes */
-  if (StreamSize < MinBytes) {
-    StreamSize = MinBytes;
-  }
-
-  /* keep track of when bottle neck was last exceeded by at least 1% */
-  //517/512 ~ 1.01
-  if ((StreamSize * (int32_t)FS8) / FrameSamples > (517 * BottleNeck) >> 9) {
-    if (State->PrevExceed) {
-      /* bottle_neck exceded twice in a row, decrease ExceedAgo */
-      State->ExceedAgo -= BURST_INTERVAL / (BURST_LEN - 1);
-      if (State->ExceedAgo < 0) {
-        State->ExceedAgo = 0;
-      }
-    } else {
-      State->ExceedAgo += FrameSamples / SAMPLES_PER_MSEC;  /* ms */
-      State->PrevExceed = 1;
-    }
-  } else {
-    State->PrevExceed = 0;
-    State->ExceedAgo += FrameSamples / SAMPLES_PER_MSEC;  /* ms */
-  }
-
-  /* set burst flag if bottle neck not exceeded for long time */
-  if ((State->ExceedAgo > BURST_INTERVAL) && (State->BurstCounter == 0)) {
-    if (State->PrevExceed) {
-      State->BurstCounter = BURST_LEN - 1;
-    } else {
-      State->BurstCounter = BURST_LEN;
-    }
-  }
-
-
-  /* Update buffer delay */
-  TransmissionTime = (StreamSize * 8000) / BottleNeck;  /* ms */
-  State->StillBuffered += TransmissionTime;
-  State->StillBuffered -= FrameSamples / SAMPLES_PER_MSEC;   /* ms */
-  if (State->StillBuffered < 0) {
-    State->StillBuffered = 0;
-  }
-
-  if (State->StillBuffered > 2000) {
-    State->StillBuffered = 2000;
-  }
-
-  return MinBytes;
-}
-
-
-/*
- * update long-term average bitrate and amount of data in buffer
- */
-void WebRtcIsacfix_UpdateRateModel(RateModel *State,
-                                   int16_t StreamSize,                    /* bytes in bitstream */
-                                   const int16_t FrameSamples,            /* samples per frame */
-                                   const int16_t BottleNeck)        /* bottle neck rate; excl headers (bps) */
-{
-  const int16_t TransmissionTime = (StreamSize * 8000) / BottleNeck;  /* ms */
-
-  /* avoid the initial "high-rate" burst */
-  State->InitCounter = 0;
-
-  /* Update buffer delay */
-  State->StillBuffered += TransmissionTime;
-  State->StillBuffered -= FrameSamples >> 4;  /* ms */
-  if (State->StillBuffered < 0) {
-    State->StillBuffered = 0;
-  }
-
-}
-
-
-void WebRtcIsacfix_InitRateModel(RateModel *State)
-{
-  State->PrevExceed      = 0;                        /* boolean */
-  State->ExceedAgo       = 0;                        /* ms */
-  State->BurstCounter    = 0;                        /* packets */
-  State->InitCounter     = INIT_BURST_LEN + 10;    /* packets */
-  State->StillBuffered   = 1;                    /* ms */
-}
-
-
-
-
-
-int16_t WebRtcIsacfix_GetNewFrameLength(int16_t bottle_neck, int16_t current_framesamples)
-{
-  int16_t new_framesamples;
-
-  new_framesamples = current_framesamples;
-
-  /* find new framelength */
-  switch(current_framesamples) {
-    case 480:
-      if (bottle_neck < Thld_30_60) {
-        new_framesamples = 960;
-      }
-      break;
-    case 960:
-      if (bottle_neck >= Thld_60_30) {
-        new_framesamples = 480;
-      }
-      break;
-    default:
-      new_framesamples = -1; /* Error */
-  }
-
-  return new_framesamples;
-}
-
-int16_t WebRtcIsacfix_GetSnr(int16_t bottle_neck, int16_t framesamples)
-{
-  int16_t s2nr = 0;
-
-  /* find new SNR value */
-  //consider BottleNeck to be in Q10 ( * 1 in Q10)
-  switch(framesamples) {
-  // TODO(bjornv): The comments below confuses me. I don't know if there is a
-  // difference between frame lengths (in which case the implementation is
-  // wrong), or if it is frame length independent in which case we should
-  // correct the comment and simplify the implementation.
-    case 480:
-      /*s2nr = -1*(a_30 << 10) + ((b_30 * bottle_neck) >> 10);*/
-      s2nr = -22500 + (int16_t)(500 * bottle_neck >> 10);
-      break;
-    case 960:
-      /*s2nr = -1*(a_60 << 10) + ((b_60 * bottle_neck) >> 10);*/
-      s2nr = -22500 + (int16_t)(500 * bottle_neck >> 10);
-      break;
-    default:
-      s2nr = -1; /* Error */
-  }
-
-  return s2nr; //return in Q10
-
-}
diff --git a/modules/audio_coding/codecs/isac/fix/source/bandwidth_estimator.h b/modules/audio_coding/codecs/isac/fix/source/bandwidth_estimator.h
deleted file mode 100644
index 101ef62..0000000
--- a/modules/audio_coding/codecs/isac/fix/source/bandwidth_estimator.h
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/*
- * bandwidth_estimator.h
- *
- * This header file contains the API for the Bandwidth Estimator
- * designed for iSAC.
- *
- */
-
-#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_FIX_SOURCE_BANDWIDTH_ESTIMATOR_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_FIX_SOURCE_BANDWIDTH_ESTIMATOR_H_
-
-#include "structs.h"
-
-
-/****************************************************************************
- * WebRtcIsacfix_InitBandwidthEstimator(...)
- *
- * This function initializes the struct for the bandwidth estimator
- *
- * Input/Output:
- *      - bwest_str        : Struct containing bandwidth information.
- *
- * Return value            : 0
- */
-
-int32_t WebRtcIsacfix_InitBandwidthEstimator(BwEstimatorstr *bwest_str);
-
-
-/****************************************************************************
- * WebRtcIsacfix_UpdateUplinkBwImpl(...)
- *
- * This function updates bottle neck rate received from other side in payload
- * and calculates a new bottle neck to send to the other side.
- *
- * Input/Output:
- *      - bweStr           : struct containing bandwidth information.
- *      - rtpNumber        : value from RTP packet, from NetEq
- *      - frameSize        : length of signal frame in ms, from iSAC decoder
- *      - sendTime         : value in RTP header giving send time in samples
- *      - arrivalTime      : value given by timeGetTime() time of arrival in
- *                           samples of packet from NetEq
- *      - pksize           : size of packet in bytes, from NetEq
- *      - Index            : integer (range 0...23) indicating bottle neck &
- *                           jitter as estimated by other side
- *
- * Return value            : 0 if everything went fine,
- *                           -1 otherwise
- */
-
-int32_t WebRtcIsacfix_UpdateUplinkBwImpl(BwEstimatorstr       *bwest_str,
-                                         const uint16_t        rtp_number,
-                                         const int16_t         frameSize,
-                                         const uint32_t        send_ts,
-                                         const uint32_t        arr_ts,
-                                         const size_t          pksize,
-                                         const uint16_t        Index);
-
-/* Update receiving estimates. Used when we only receive BWE index, no iSAC data packet. */
-int16_t WebRtcIsacfix_UpdateUplinkBwRec(BwEstimatorstr *bwest_str,
-                                        const int16_t Index);
-
-/****************************************************************************
- * WebRtcIsacfix_GetDownlinkBwIndexImpl(...)
- *
- * This function calculates and returns the bandwidth/jitter estimation code
- * (integer 0...23) to put in the sending iSAC payload.
- *
- * Input:
- *      - bweStr       : BWE struct
- *
- * Return:
- *      bandwith and jitter index (0..23)
- */
-uint16_t WebRtcIsacfix_GetDownlinkBwIndexImpl(BwEstimatorstr *bwest_str);
-
-/* Returns the bandwidth estimation (in bps) */
-uint16_t WebRtcIsacfix_GetDownlinkBandwidth(const BwEstimatorstr *bwest_str);
-
-/* Returns the bandwidth that iSAC should send with in bps */
-int16_t WebRtcIsacfix_GetUplinkBandwidth(const BwEstimatorstr *bwest_str);
-
-/* Returns the max delay (in ms) */
-int16_t WebRtcIsacfix_GetDownlinkMaxDelay(const BwEstimatorstr *bwest_str);
-
-/* Returns the max delay value from the other side in ms */
-int16_t WebRtcIsacfix_GetUplinkMaxDelay(const BwEstimatorstr *bwest_str);
-
-/* Fills in an IsacExternalBandwidthInfo struct. */
-void WebRtcIsacfixBw_GetBandwidthInfo(BwEstimatorstr* bwest_str,
-                                      IsacBandwidthInfo* bwinfo);
-
-/* Uses the values from an IsacExternalBandwidthInfo struct. */
-void WebRtcIsacfixBw_SetBandwidthInfo(BwEstimatorstr* bwest_str,
-                                      const IsacBandwidthInfo* bwinfo);
-
-/*
- * update amount of data in bottle neck buffer and burst handling
- * returns minimum payload size (bytes)
- */
-uint16_t WebRtcIsacfix_GetMinBytes(RateModel *State,
-                                   int16_t StreamSize,     /* bytes in bitstream */
-                                   const int16_t FrameLen,    /* ms per frame */
-                                   const int16_t BottleNeck,        /* bottle neck rate; excl headers (bps) */
-                                   const int16_t DelayBuildUp);     /* max delay from bottle neck buffering (ms) */
-
-/*
- * update long-term average bitrate and amount of data in buffer
- */
-void WebRtcIsacfix_UpdateRateModel(RateModel *State,
-                                   int16_t StreamSize,    /* bytes in bitstream */
-                                   const int16_t FrameSamples,  /* samples per frame */
-                                   const int16_t BottleNeck);       /* bottle neck rate; excl headers (bps) */
-
-
-void WebRtcIsacfix_InitRateModel(RateModel *State);
-
-/* Returns the new framelength value (input argument: bottle_neck) */
-int16_t WebRtcIsacfix_GetNewFrameLength(int16_t bottle_neck, int16_t current_framelength);
-
-/* Returns the new SNR value (input argument: bottle_neck) */
-//returns snr in Q10
-int16_t WebRtcIsacfix_GetSnr(int16_t bottle_neck, int16_t framesamples);
-
-
-#endif /*  WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_FIX_SOURCE_BANDWIDTH_ESTIMATOR_H_ */
diff --git a/modules/audio_coding/codecs/isac/fix/source/codec.h b/modules/audio_coding/codecs/isac/fix/source/codec.h
deleted file mode 100644
index 001a04f..0000000
--- a/modules/audio_coding/codecs/isac/fix/source/codec.h
+++ /dev/null
@@ -1,228 +0,0 @@
-/*
- *  Copyright (c) 2012 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.
- */
-
-/*
- * codec.h
- *
- * This header file contains the calls to the internal encoder
- * and decoder functions.
- *
- */
-
-#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_FIX_SOURCE_CODEC_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_FIX_SOURCE_CODEC_H_
-
-#include "structs.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-int WebRtcIsacfix_EstimateBandwidth(BwEstimatorstr* bwest_str,
-                                    Bitstr_dec* streamdata,
-                                    size_t packet_size,
-                                    uint16_t rtp_seq_number,
-                                    uint32_t send_ts,
-                                    uint32_t arr_ts);
-
-int WebRtcIsacfix_DecodeImpl(int16_t* signal_out16,
-                             IsacFixDecoderInstance* ISACdec_obj,
-                             size_t* current_framesamples);
-
-void WebRtcIsacfix_DecodePlcImpl(int16_t* decoded,
-                                 IsacFixDecoderInstance* ISACdec_obj,
-                                 size_t* current_framesample );
-
-int WebRtcIsacfix_EncodeImpl(int16_t* in,
-                             IsacFixEncoderInstance* ISACenc_obj,
-                             BwEstimatorstr* bw_estimatordata,
-                             int16_t CodingMode);
-
-int WebRtcIsacfix_EncodeStoredData(IsacFixEncoderInstance* ISACenc_obj,
-                                   int BWnumber,
-                                   float scale);
-
-/* initialization functions */
-
-void WebRtcIsacfix_InitMaskingEnc(MaskFiltstr_enc* maskdata);
-void WebRtcIsacfix_InitMaskingDec(MaskFiltstr_dec* maskdata);
-
-void WebRtcIsacfix_InitPreFilterbank(PreFiltBankstr* prefiltdata);
-
-void WebRtcIsacfix_InitPostFilterbank(PostFiltBankstr* postfiltdata);
-
-void WebRtcIsacfix_InitPitchFilter(PitchFiltstr* pitchfiltdata);
-
-void WebRtcIsacfix_InitPitchAnalysis(PitchAnalysisStruct* State);
-
-void WebRtcIsacfix_InitPlc(PLCstr* State);
-
-
-/* transform functions */
-
-void WebRtcIsacfix_InitTransform();
-
-typedef void (*Time2Spec)(int16_t* inre1Q9,
-                          int16_t* inre2Q9,
-                          int16_t* outre,
-                          int16_t* outim);
-typedef void (*Spec2Time)(int16_t* inreQ7,
-                          int16_t* inimQ7,
-                          int32_t* outre1Q16,
-                          int32_t* outre2Q16);
-
-extern Time2Spec WebRtcIsacfix_Time2Spec;
-extern Spec2Time WebRtcIsacfix_Spec2Time;
-
-void WebRtcIsacfix_Time2SpecC(int16_t* inre1Q9,
-                              int16_t* inre2Q9,
-                              int16_t* outre,
-                              int16_t* outim);
-void WebRtcIsacfix_Spec2TimeC(int16_t* inreQ7,
-                              int16_t* inimQ7,
-                              int32_t* outre1Q16,
-                              int32_t* outre2Q16);
-
-#if defined(WEBRTC_HAS_NEON)
-void WebRtcIsacfix_Time2SpecNeon(int16_t* inre1Q9,
-                                 int16_t* inre2Q9,
-                                 int16_t* outre,
-                                 int16_t* outim);
-void WebRtcIsacfix_Spec2TimeNeon(int16_t* inreQ7,
-                                 int16_t* inimQ7,
-                                 int32_t* outre1Q16,
-                                 int32_t* outre2Q16);
-#endif
-
-#if defined(MIPS32_LE)
-void WebRtcIsacfix_Time2SpecMIPS(int16_t* inre1Q9,
-                                 int16_t* inre2Q9,
-                                 int16_t* outre,
-                                 int16_t* outim);
-void WebRtcIsacfix_Spec2TimeMIPS(int16_t* inreQ7,
-                                 int16_t* inimQ7,
-                                 int32_t* outre1Q16,
-                                 int32_t* outre2Q16);
-#endif
-
-/* filterbank functions */
-
-void WebRtcIsacfix_SplitAndFilter1(int16_t* in,
-                                   int16_t* LP16,
-                                   int16_t* HP16,
-                                   PreFiltBankstr* prefiltdata);
-
-void WebRtcIsacfix_FilterAndCombine1(int16_t* tempin_ch1,
-                                     int16_t* tempin_ch2,
-                                     int16_t* out16,
-                                     PostFiltBankstr* postfiltdata);
-
-#ifdef WEBRTC_ISAC_FIX_NB_CALLS_ENABLED
-
-void WebRtcIsacfix_SplitAndFilter2(int16_t* in,
-                                   int16_t* LP16,
-                                   int16_t* HP16,
-                                   PreFiltBankstr* prefiltdata);
-
-void WebRtcIsacfix_FilterAndCombine2(int16_t* tempin_ch1,
-                                     int16_t* tempin_ch2,
-                                     int16_t* out16,
-                                     PostFiltBankstr* postfiltdata,
-                                     int16_t len);
-
-#endif
-
-/* normalized lattice filters */
-
-void WebRtcIsacfix_NormLatticeFilterMa(size_t orderCoef,
-                                       int32_t* stateGQ15,
-                                       int16_t* lat_inQ0,
-                                       int16_t* filt_coefQ15,
-                                       int32_t* gain_lo_hiQ17,
-                                       int16_t lo_hi,
-                                       int16_t* lat_outQ9);
-
-void WebRtcIsacfix_NormLatticeFilterAr(size_t orderCoef,
-                                       int16_t* stateGQ0,
-                                       int32_t* lat_inQ25,
-                                       int16_t* filt_coefQ15,
-                                       int32_t* gain_lo_hiQ17,
-                                       int16_t lo_hi,
-                                       int16_t* lat_outQ0);
-
-/* TODO(kma): Remove the following functions into individual header files. */
-
-/* Internal functions in both C and ARM Neon versions */
-
-int WebRtcIsacfix_AutocorrC(int32_t* __restrict r,
-                            const int16_t* __restrict x,
-                            int16_t N,
-                            int16_t order,
-                            int16_t* __restrict scale);
-
-void WebRtcIsacfix_FilterMaLoopC(int16_t input0,
-                                 int16_t input1,
-                                 int32_t input2,
-                                 int32_t* ptr0,
-                                 int32_t* ptr1,
-                                 int32_t* ptr2);
-
-#if defined(WEBRTC_HAS_NEON)
-int WebRtcIsacfix_AutocorrNeon(int32_t* __restrict r,
-                               const int16_t* __restrict x,
-                               int16_t N,
-                               int16_t order,
-                               int16_t* __restrict scale);
-
-void WebRtcIsacfix_FilterMaLoopNeon(int16_t input0,
-                                    int16_t input1,
-                                    int32_t input2,
-                                    int32_t* ptr0,
-                                    int32_t* ptr1,
-                                    int32_t* ptr2);
-#endif
-
-#if defined(MIPS32_LE)
-int WebRtcIsacfix_AutocorrMIPS(int32_t* __restrict r,
-                               const int16_t* __restrict x,
-                               int16_t N,
-                               int16_t order,
-                               int16_t* __restrict scale);
-
-void WebRtcIsacfix_FilterMaLoopMIPS(int16_t input0,
-                                    int16_t input1,
-                                    int32_t input2,
-                                    int32_t* ptr0,
-                                    int32_t* ptr1,
-                                    int32_t* ptr2);
-#endif
-
-/* Function pointers associated with the above functions. */
-
-typedef int (*AutocorrFix)(int32_t* __restrict r,
-                           const int16_t* __restrict x,
-                           int16_t N,
-                           int16_t order,
-                           int16_t* __restrict scale);
-extern AutocorrFix WebRtcIsacfix_AutocorrFix;
-
-typedef void (*FilterMaLoopFix)(int16_t input0,
-                                int16_t input1,
-                                int32_t input2,
-                                int32_t* ptr0,
-                                int32_t* ptr1,
-                                int32_t* ptr2);
-extern FilterMaLoopFix WebRtcIsacfix_FilterMaLoopFix;
-
-#ifdef __cplusplus
-}  // extern "C"
-#endif
-
-#endif /* WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_FIX_SOURCE_CODEC_H_ */
diff --git a/modules/audio_coding/codecs/isac/fix/source/decode.c b/modules/audio_coding/codecs/isac/fix/source/decode.c
deleted file mode 100644
index cf2d507..0000000
--- a/modules/audio_coding/codecs/isac/fix/source/decode.c
+++ /dev/null
@@ -1,221 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/*
- * decode.c
- *
- * This C file contains the internal decoding function.
- *
- */
-
-#include <string.h>
-
-#include "bandwidth_estimator.h"
-#include "codec.h"
-#include "entropy_coding.h"
-#include "pitch_estimator.h"
-#include "settings.h"
-#include "structs.h"
-
-
-
-
-int WebRtcIsacfix_DecodeImpl(int16_t* signal_out16,
-                             IsacFixDecoderInstance* ISACdec_obj,
-                             size_t* current_framesamples)
-{
-  int k;
-  int err;
-  int16_t BWno;
-  int len = 0;
-
-  int16_t model;
-
-
-  int16_t Vector_Word16_1[FRAMESAMPLES/2];
-  int16_t Vector_Word16_2[FRAMESAMPLES/2];
-
-  int32_t Vector_Word32_1[FRAMESAMPLES/2];
-  int32_t Vector_Word32_2[FRAMESAMPLES/2];
-
-  int16_t lofilt_coefQ15[ORDERLO*SUBFRAMES]; //refl. coeffs
-  int16_t hifilt_coefQ15[ORDERHI*SUBFRAMES]; //refl. coeffs
-  int32_t gain_lo_hiQ17[2*SUBFRAMES];
-
-  int16_t PitchLags_Q7[PITCH_SUBFRAMES];
-  int16_t PitchGains_Q12[PITCH_SUBFRAMES];
-  int16_t AvgPitchGain_Q12;
-
-  int16_t tmp_1, tmp_2;
-  int32_t tmp32a;
-  int16_t gainQ13;
-
-
-  size_t frame_nb; /* counter */
-  size_t frame_mode; /* 0 for 30ms, 1 for 60ms */
-  static const size_t kProcessedSamples = 480; /* 480 (for both 30, 60 ms) */
-
-  /* PLC */
-  int16_t overlapWin[ 240 ];
-
-  (ISACdec_obj->bitstr_obj).W_upper = 0xFFFFFFFF;
-  (ISACdec_obj->bitstr_obj).streamval = 0;
-  (ISACdec_obj->bitstr_obj).stream_index = 0;
-  (ISACdec_obj->bitstr_obj).full = 1;
-
-
-  /* decode framelength and BW estimation - not used, only for stream pointer*/
-  err = WebRtcIsacfix_DecodeFrameLen(&ISACdec_obj->bitstr_obj, current_framesamples);
-  if (err<0)  // error check
-    return err;
-
-  frame_mode = *current_framesamples / MAX_FRAMESAMPLES;  /* 0, or 1 */
-
-  err = WebRtcIsacfix_DecodeSendBandwidth(&ISACdec_obj->bitstr_obj, &BWno);
-  if (err<0)  // error check
-    return err;
-
-  /* one loop if it's one frame (30ms), two loops if two frames bundled together
-   * (60ms) */
-  for (frame_nb = 0; frame_nb <= frame_mode; frame_nb++) {
-
-    /* decode & dequantize pitch parameters */
-    err = WebRtcIsacfix_DecodePitchGain(&(ISACdec_obj->bitstr_obj), PitchGains_Q12);
-    if (err<0)  // error check
-      return err;
-
-    err = WebRtcIsacfix_DecodePitchLag(&ISACdec_obj->bitstr_obj, PitchGains_Q12, PitchLags_Q7);
-    if (err<0)  // error check
-      return err;
-
-    AvgPitchGain_Q12 = (int16_t)(((int32_t)PitchGains_Q12[0] + PitchGains_Q12[1] + PitchGains_Q12[2] + PitchGains_Q12[3])>>2);
-
-    /* decode & dequantize FiltCoef */
-    err = WebRtcIsacfix_DecodeLpc(gain_lo_hiQ17, lofilt_coefQ15, hifilt_coefQ15,
-                                  &ISACdec_obj->bitstr_obj, &model);
-
-    if (err<0)  // error check
-      return err;
-
-    /* decode & dequantize spectrum */
-    len = WebRtcIsacfix_DecodeSpec(&ISACdec_obj->bitstr_obj, Vector_Word16_1, Vector_Word16_2, AvgPitchGain_Q12);
-    if (len < 0)  // error check
-      return len;
-
-    // Why does this need Q16 in and out? /JS
-    WebRtcIsacfix_Spec2Time(Vector_Word16_1, Vector_Word16_2, Vector_Word32_1, Vector_Word32_2);
-
-    for (k=0; k<FRAMESAMPLES/2; k++) {
-      // Q16 -> Q9.
-      Vector_Word16_1[k] = (int16_t)((Vector_Word32_1[k] + 64) >> 7);
-    }
-
-    /* ----  If this is recovery frame ---- */
-    if( (ISACdec_obj->plcstr_obj).used == PLC_WAS_USED )
-    {
-      (ISACdec_obj->plcstr_obj).used = PLC_NOT_USED;
-      if( (ISACdec_obj->plcstr_obj).B < 1000 )
-      {
-        (ISACdec_obj->plcstr_obj).decayCoeffPriodic = 4000;
-      }
-
-      ISACdec_obj->plcstr_obj.decayCoeffPriodic = WEBRTC_SPL_WORD16_MAX;    /* DECAY_RATE is in Q15 */
-      ISACdec_obj->plcstr_obj.decayCoeffNoise = WEBRTC_SPL_WORD16_MAX;    /* DECAY_RATE is in Q15 */
-      ISACdec_obj->plcstr_obj.pitchCycles = 0;
-
-      PitchGains_Q12[0] = (int16_t)(PitchGains_Q12[0] * 700 >> 10);
-
-      /* ---- Add-overlap ---- */
-      WebRtcSpl_GetHanningWindow( overlapWin, RECOVERY_OVERLAP );
-      for( k = 0; k < RECOVERY_OVERLAP; k++ )
-        Vector_Word16_1[k] = WebRtcSpl_AddSatW16(
-            (int16_t)(ISACdec_obj->plcstr_obj.overlapLP[k] *
-                overlapWin[RECOVERY_OVERLAP - k - 1] >> 14),
-            (int16_t)(Vector_Word16_1[k] * overlapWin[k] >> 14));
-
-
-
-    }
-
-    /* --- Store side info --- */
-    if( frame_nb == frame_mode )
-    {
-      /* --- LPC info */
-      WEBRTC_SPL_MEMCPY_W16( (ISACdec_obj->plcstr_obj).lofilt_coefQ15, &lofilt_coefQ15[(SUBFRAMES-1)*ORDERLO], ORDERLO );
-      WEBRTC_SPL_MEMCPY_W16( (ISACdec_obj->plcstr_obj).hifilt_coefQ15, &hifilt_coefQ15[(SUBFRAMES-1)*ORDERHI], ORDERHI );
-      (ISACdec_obj->plcstr_obj).gain_lo_hiQ17[0] = gain_lo_hiQ17[(SUBFRAMES-1) * 2];
-      (ISACdec_obj->plcstr_obj).gain_lo_hiQ17[1] = gain_lo_hiQ17[(SUBFRAMES-1) * 2 + 1];
-
-      /* --- LTP info */
-      (ISACdec_obj->plcstr_obj).AvgPitchGain_Q12 = PitchGains_Q12[3];
-      (ISACdec_obj->plcstr_obj).lastPitchGain_Q12 = PitchGains_Q12[3];
-      (ISACdec_obj->plcstr_obj).lastPitchLag_Q7 = PitchLags_Q7[3];
-
-      if( PitchLags_Q7[3] < 3000 )
-        (ISACdec_obj->plcstr_obj).lastPitchLag_Q7 += PitchLags_Q7[3];
-
-      WEBRTC_SPL_MEMCPY_W16( (ISACdec_obj->plcstr_obj).prevPitchInvIn, Vector_Word16_1, FRAMESAMPLES/2 );
-
-    }
-    /* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
-
-    /* inverse pitch filter */
-    WebRtcIsacfix_PitchFilter(Vector_Word16_1, Vector_Word16_2, &ISACdec_obj->pitchfiltstr_obj, PitchLags_Q7, PitchGains_Q12, 4);
-
-    if( frame_nb == frame_mode )
-    {
-      WEBRTC_SPL_MEMCPY_W16( (ISACdec_obj->plcstr_obj).prevPitchInvOut, &(Vector_Word16_2[FRAMESAMPLES/2 - (PITCH_MAX_LAG + 10)]), PITCH_MAX_LAG );
-    }
-
-
-    /* reduce gain to compensate for pitch enhancer */
-    /* gain = 1.0f - 0.45f * AvgPitchGain; */
-    tmp32a = AvgPitchGain_Q12 * 29;  // Q18
-    gainQ13 = (int16_t)((262144 - tmp32a) >> 5);  // Q18 -> Q13.
-
-    for (k = 0; k < FRAMESAMPLES/2; k++)
-    {
-      Vector_Word32_1[k] = (Vector_Word16_2[k] * gainQ13) * (1 << 3);  // Q25
-    }
-
-
-    /* perceptual post-filtering (using normalized lattice filter) */
-    WebRtcIsacfix_NormLatticeFilterAr(ORDERLO, (ISACdec_obj->maskfiltstr_obj).PostStateLoGQ0,
-                                      Vector_Word32_1, lofilt_coefQ15, gain_lo_hiQ17, 0, Vector_Word16_1);
-
-    /* --- Store Highpass Residual --- */
-    for (k = 0; k < FRAMESAMPLES/2; k++)
-      Vector_Word32_1[k] = Vector_Word32_2[k] * (1 << 9);  // Q16 -> Q25
-
-    for( k = 0; k < PITCH_MAX_LAG + 10; k++ )
-      (ISACdec_obj->plcstr_obj).prevHP[k] = Vector_Word32_1[FRAMESAMPLES/2 - (PITCH_MAX_LAG + 10) + k];
-
-
-    WebRtcIsacfix_NormLatticeFilterAr(ORDERHI, (ISACdec_obj->maskfiltstr_obj).PostStateHiGQ0,
-                                      Vector_Word32_1, hifilt_coefQ15, gain_lo_hiQ17, 1, Vector_Word16_2);
-
-    /* recombine the 2 bands */
-
-    /* Form the polyphase signals, and compensate for DC offset */
-    for (k=0;k<FRAMESAMPLES/2;k++) {
-      tmp_1 = (int16_t)WebRtcSpl_SatW32ToW16(((int32_t)Vector_Word16_1[k]+Vector_Word16_2[k] + 1)); /* Construct a new upper channel signal*/
-      tmp_2 = (int16_t)WebRtcSpl_SatW32ToW16(((int32_t)Vector_Word16_1[k]-Vector_Word16_2[k])); /* Construct a new lower channel signal*/
-      Vector_Word16_1[k] = tmp_1;
-      Vector_Word16_2[k] = tmp_2;
-    }
-
-    WebRtcIsacfix_FilterAndCombine1(Vector_Word16_1,
-                                    Vector_Word16_2,
-                                    signal_out16 + frame_nb * kProcessedSamples,
-                                    &ISACdec_obj->postfiltbankstr_obj);
-
-  }
-  return len;
-}
diff --git a/modules/audio_coding/codecs/isac/fix/source/decode_bwe.c b/modules/audio_coding/codecs/isac/fix/source/decode_bwe.c
deleted file mode 100644
index 316f59a..0000000
--- a/modules/audio_coding/codecs/isac/fix/source/decode_bwe.c
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/*
- * decode_bwe.c
- *
- * This C file contains the internal decode bandwidth estimate function.
- *
- */
-
-
-#include "bandwidth_estimator.h"
-#include "codec.h"
-#include "entropy_coding.h"
-#include "structs.h"
-
-
-
-
-int WebRtcIsacfix_EstimateBandwidth(BwEstimatorstr *bwest_str,
-                                    Bitstr_dec  *streamdata,
-                                    size_t packet_size,
-                                    uint16_t rtp_seq_number,
-                                    uint32_t send_ts,
-                                    uint32_t arr_ts)
-{
-  int16_t index;
-  size_t frame_samples;
-  int err;
-
-  /* decode framelength */
-  err = WebRtcIsacfix_DecodeFrameLen(streamdata, &frame_samples);
-  /* error check */
-  if (err<0) {
-    return err;
-  }
-
-  /* decode BW estimation */
-  err = WebRtcIsacfix_DecodeSendBandwidth(streamdata, &index);
-  /* error check */
-  if (err<0) {
-    return err;
-  }
-
-  /* Update BWE with received data */
-  err = WebRtcIsacfix_UpdateUplinkBwImpl(
-      bwest_str,
-      rtp_seq_number,
-      (int16_t)(frame_samples * 1000 / FS),
-      send_ts,
-      arr_ts,
-      packet_size,  /* in bytes */
-      index);
-
-  /* error check */
-  if (err<0) {
-    return err;
-  }
-
-  /* Succesful */
-  return 0;
-}
diff --git a/modules/audio_coding/codecs/isac/fix/source/decode_plc.c b/modules/audio_coding/codecs/isac/fix/source/decode_plc.c
deleted file mode 100644
index e907f2b..0000000
--- a/modules/audio_coding/codecs/isac/fix/source/decode_plc.c
+++ /dev/null
@@ -1,805 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/*
- * decode_plc.c
- *
- * Packet Loss Concealment.
- *
- */
-
-#include <string.h>
-
-#include "settings.h"
-#include "entropy_coding.h"
-#include "pitch_estimator.h"
-#include "bandwidth_estimator.h"
-#include "structs.h"
-#include "codec.h"
-
-
-#define NO_OF_PRIMES 8
-#define NOISE_FILTER_LEN 30
-
-/*
- * function to decode the bitstream
- * returns the total number of bytes in the stream
- */
-
-static int16_t plc_filterma_Fast(
-    int16_t *In,  /* (i)   Vector to be filtered. InOut[-orderCoef+1]
-                           to InOut[-1] contains state */
-    int16_t *Out,  /* (o)   Filtered vector */
-    int16_t *B,   /* (i)   The filter coefficients (in Q0) */
-    int16_t Blen,  /* (i)   Number of B coefficients */
-    int16_t len,   /* (i)  Number of samples to be filtered */
-    int16_t reduceDecay,
-    int16_t decay,
-    int16_t rshift )
-{
-  int i, j;
-  int32_t o;
-  int32_t lim = (1 << (15 + rshift)) - 1;
-
-  for (i = 0; i < len; i++)
-  {
-    const int16_t *b_ptr = &B[0];
-    const int16_t *x_ptr = &In[i];
-
-    o = (int32_t)0;
-
-    for (j = 0;j < Blen; j++)
-    {
-      o = WebRtcSpl_AddSatW32(o, *b_ptr * *x_ptr);
-      b_ptr++;
-      x_ptr--;
-    }
-
-    /* to round off correctly */
-    o = WebRtcSpl_AddSatW32(o, 1 << (rshift - 1));
-
-    /* saturate according to the domain of the filter coefficients */
-    o = WEBRTC_SPL_SAT((int32_t)lim, o, (int32_t)-lim);
-
-    /* o should be in the range of int16_t */
-    o >>= rshift;
-
-    /* decay the output signal; this is specific to plc */
-    *Out++ = (int16_t)((int16_t)o * decay >> 15);
-
-    /* change the decay */
-    decay -= reduceDecay;
-    if( decay < 0 )
-      decay = 0;
-  }
-  return( decay );
-}
-
-
-
-
-
-
-
-
-static __inline int32_t log2_Q8_T( uint32_t x ) {
-
-  int32_t zeros;
-  int16_t frac;
-
-  zeros=WebRtcSpl_NormU32(x);
-  frac = (int16_t)(((x << zeros) & 0x7FFFFFFF) >> 23);
-
-  /* log2(magn(i)) */
-  return ((31 - zeros) << 8) + frac;
-}
-
-static __inline int16_t  exp2_Q10_T(int16_t x) { // Both in and out in Q10
-
-  int16_t tmp16_1, tmp16_2;
-
-  tmp16_2=(int16_t)(0x0400|(x&0x03FF));
-  tmp16_1 = -(x >> 10);
-  if(tmp16_1>0)
-    return tmp16_2 >> tmp16_1;
-  else
-    return tmp16_2 << -tmp16_1;
-
-}
-
-
-/*
-  This is a fixed-point version of the above code with limLow = 700 and limHigh = 5000,
-  hard-coded. The values 700 and 5000 were experimentally obtained.
-
-  The function implements membership values for two sets. The mebership functions are
-  of second orders corresponding to half-bell-shapped pulses.
-*/
-static void MemshipValQ15( int16_t in, int16_t *A, int16_t *B )
-{
-  int16_t x;
-
-  in -= 700;    /* translate the lowLim to 0, limHigh = 5000 - 700, M = 2150 */
-
-  if( in <= 2150 )
-  {
-    if( in > 0 )
-    {
-      /* b = in^2 / (2 * M^2), a = 1 - b in Q0.
-         We have to compute in Q15 */
-
-      /* x = in / 2150 {in Q15} = x * 15.2409 {in Q15} =
-         x*15 + (x*983)/(2^12); note that 983/2^12 = 0.23999     */
-
-      /* we are sure that x is in the range of int16_t            */
-      x = (int16_t)(in * 15 + (in * 983 >> 12));
-      /* b = x^2 / 2 {in Q15} so a shift of 16 is required to
-         be in correct domain and one more for the division by 2 */
-      *B = (int16_t)((x * x + 0x00010000) >> 17);
-      *A = WEBRTC_SPL_WORD16_MAX - *B;
-    }
-    else
-    {
-      *B = 0;
-      *A = WEBRTC_SPL_WORD16_MAX;
-    }
-  }
-  else
-  {
-    if( in < 4300 )
-    {
-      /* This is a mirror case of the above */
-      in = 4300 - in;
-      x = (int16_t)(in * 15 + (in * 983 >> 12));
-      /* b = x^2 / 2 {in Q15} so a shift of 16 is required to
-         be in correct domain and one more for the division by 2 */
-      *A = (int16_t)((x * x + 0x00010000) >> 17);
-      *B = WEBRTC_SPL_WORD16_MAX - *A;
-
-    }
-    else
-    {
-      *A = 0;
-      *B = WEBRTC_SPL_WORD16_MAX;
-    }
-  }
-}
-
-
-
-
-static void LinearResampler(int16_t* in,
-                            int16_t* out,
-                            size_t lenIn,
-                            size_t lenOut)
-{
-  size_t n = (lenIn - 1) * RESAMP_RES;
-  int16_t resOut, relativePos, diff; /* */
-  size_t i, j;
-  uint16_t udiff;
-
-  if( lenIn == lenOut )
-  {
-    WEBRTC_SPL_MEMCPY_W16( out, in, lenIn );
-    return;
-  }
-
-  resOut = WebRtcSpl_DivW32W16ResW16( (int32_t)n, (int16_t)(lenOut-1) );
-
-  out[0] = in[0];
-  for( i = 1, j = 0, relativePos = 0; i < lenOut; i++ )
-  {
-
-    relativePos += resOut;
-    while( relativePos > RESAMP_RES )
-    {
-      j++;
-      relativePos -= RESAMP_RES;
-    }
-
-
-    /* an overflow may happen and the differce in sample values may
-     * require more than 16 bits. We like to avoid 32 bit arithmatic
-     * as much as possible */
-
-    if( (in[ j ] > 0) && (in[j + 1] < 0) )
-    {
-      udiff = (uint16_t)(in[ j ] - in[j + 1]);
-      out[ i ] = in[ j ] - (uint16_t)( ((int32_t)( udiff * relativePos )) >> RESAMP_RES_BIT);
-    }
-    else
-    {
-      if( (in[j] < 0) && (in[j+1] > 0) )
-      {
-        udiff = (uint16_t)( in[j + 1] - in[ j ] );
-        out[ i ] = in[ j ] + (uint16_t)( ((int32_t)( udiff * relativePos )) >> RESAMP_RES_BIT);
-      }
-      else
-      {
-        diff = in[ j + 1 ] - in[ j ];
-        out[i] = in[j] + (int16_t)(diff * relativePos >> RESAMP_RES_BIT);
-      }
-    }
-  }
-}
-
-
-
-
-
-void WebRtcIsacfix_DecodePlcImpl(int16_t *signal_out16,
-                                 IsacFixDecoderInstance *ISACdec_obj,
-                                 size_t *current_framesamples )
-{
-  int subframecnt;
-
-  int16_t* Vector_Word16_1;
-  int16_t  Vector_Word16_Extended_1[FRAMESAMPLES_HALF + NOISE_FILTER_LEN];
-  int16_t* Vector_Word16_2;
-  int16_t  Vector_Word16_Extended_2[FRAMESAMPLES_HALF + NOISE_FILTER_LEN];
-
-  int32_t Vector_Word32_1[FRAMESAMPLES_HALF];
-  int32_t Vector_Word32_2[FRAMESAMPLES_HALF];
-
-  int16_t lofilt_coefQ15[ORDERLO*SUBFRAMES]; //refl. coeffs
-  int16_t hifilt_coefQ15[ORDERHI*SUBFRAMES]; //refl. coeffs
-
-  int16_t pitchLags_Q7[PITCH_SUBFRAMES];
-  int16_t pitchGains_Q12[PITCH_SUBFRAMES];
-
-  int16_t tmp_1, tmp_2;
-  int32_t tmp32a, tmp32b;
-  int16_t gainQ13;
-
-  int16_t myDecayRate;
-
-  /* ---------- PLC variables ------------ */
-  size_t lag0, i, k;
-  int16_t noiseIndex;
-  int16_t stretchPitchLP[PITCH_MAX_LAG + 10], stretchPitchLP1[PITCH_MAX_LAG + 10];
-
-  int32_t gain_lo_hiQ17[2*SUBFRAMES];
-
-  int16_t nLP, pLP, wNoisyLP, wPriodicLP, tmp16;
-  size_t minIdx;
-  int32_t nHP, pHP, wNoisyHP, wPriodicHP, corr, minCorr, maxCoeff;
-  int16_t noise1, rshift;
-
-
-  int16_t ltpGain, pitchGain, myVoiceIndicator, myAbs, maxAbs;
-  int32_t varIn, varOut, logVarIn, logVarOut, Q, logMaxAbs;
-  int rightShiftIn, rightShiftOut;
-
-
-  /* ------------------------------------- */
-
-
-  myDecayRate = (DECAY_RATE);
-  Vector_Word16_1 = &Vector_Word16_Extended_1[NOISE_FILTER_LEN];
-  Vector_Word16_2 = &Vector_Word16_Extended_2[NOISE_FILTER_LEN];
-
-
-  /* ----- Simply Copy Previous LPC parameters ------ */
-  for( subframecnt = 0; subframecnt < SUBFRAMES; subframecnt++ )
-  {
-    /* lower Band */
-    WEBRTC_SPL_MEMCPY_W16(&lofilt_coefQ15[ subframecnt * ORDERLO ],
-                          (ISACdec_obj->plcstr_obj).lofilt_coefQ15, ORDERLO);
-    gain_lo_hiQ17[2*subframecnt] = (ISACdec_obj->plcstr_obj).gain_lo_hiQ17[0];
-
-    /* Upper Band */
-    WEBRTC_SPL_MEMCPY_W16(&hifilt_coefQ15[ subframecnt * ORDERHI ],
-                          (ISACdec_obj->plcstr_obj).hifilt_coefQ15, ORDERHI);
-    gain_lo_hiQ17[2*subframecnt + 1] = (ISACdec_obj->plcstr_obj).gain_lo_hiQ17[1];
-  }
-
-
-
-
-  lag0 = (size_t)(((ISACdec_obj->plcstr_obj.lastPitchLag_Q7 + 64) >> 7) + 1);
-
-
-  if( (ISACdec_obj->plcstr_obj).used != PLC_WAS_USED )
-  {
-    (ISACdec_obj->plcstr_obj).pitchCycles = 0;
-
-    (ISACdec_obj->plcstr_obj).lastPitchLP =
-        &((ISACdec_obj->plcstr_obj).prevPitchInvIn[FRAMESAMPLES_HALF - lag0]);
-    minCorr = WEBRTC_SPL_WORD32_MAX;
-
-    if ((FRAMESAMPLES_HALF - 10) > 2 * lag0)
-    {
-      minIdx = 11;
-      for( i = 0; i < 21; i++ )
-      {
-        corr = 0;
-        for( k = 0; k < lag0; k++ )
-        {
-          corr = WebRtcSpl_AddSatW32(corr, WEBRTC_SPL_ABS_W32(
-              WebRtcSpl_SubSatW16(
-                  (ISACdec_obj->plcstr_obj).lastPitchLP[k],
-                  (ISACdec_obj->plcstr_obj).prevPitchInvIn[
-                      FRAMESAMPLES_HALF - 2*lag0 - 10 + i + k ] ) ) );
-        }
-        if( corr < minCorr )
-        {
-          minCorr = corr;
-          minIdx = i;
-        }
-      }
-      (ISACdec_obj->plcstr_obj).prevPitchLP =
-          &( (ISACdec_obj->plcstr_obj).prevPitchInvIn[
-              FRAMESAMPLES_HALF - lag0*2 - 10 + minIdx] );
-    }
-    else
-    {
-      (ISACdec_obj->plcstr_obj).prevPitchLP =
-          (ISACdec_obj->plcstr_obj).lastPitchLP;
-    }
-    pitchGain = (ISACdec_obj->plcstr_obj).lastPitchGain_Q12;
-
-    WebRtcSpl_AutoCorrelation(
-        &(ISACdec_obj->plcstr_obj).prevPitchInvIn[FRAMESAMPLES_HALF - lag0],
-        lag0, 0, &varIn, &rightShiftIn);
-    WebRtcSpl_AutoCorrelation(
-        &(ISACdec_obj->plcstr_obj).prevPitchInvOut[PITCH_MAX_LAG + 10 - lag0],
-        lag0, 0, &varOut, &rightShiftOut);
-
-    maxAbs = 0;
-    for( i = 0; i< lag0; i++)
-    {
-      myAbs = WEBRTC_SPL_ABS_W16(
-          (ISACdec_obj->plcstr_obj).prevPitchInvOut[
-              PITCH_MAX_LAG + 10 - lag0 + i] );
-      maxAbs = (myAbs > maxAbs)? myAbs:maxAbs;
-    }
-    logVarIn = log2_Q8_T( (uint32_t)( varIn ) ) +
-        (int32_t)(rightShiftIn << 8);
-    logVarOut = log2_Q8_T( (uint32_t)( varOut ) ) +
-        (int32_t)(rightShiftOut << 8);
-    logMaxAbs = log2_Q8_T( (uint32_t)( maxAbs ) );
-
-    ltpGain = (int16_t)(logVarOut - logVarIn);
-    Q = 2 * logMaxAbs - ( logVarOut - 1512 );
-
-    /*
-     * ---
-     * We are computing sqrt( (VarIn/lag0) / var( noise ) )
-     * var( noise ) is almost 256. we have already computed log2( VarIn ) in Q8
-     * so we actually compute 2^( 0.5*(log2( VarIn ) - log2( lag0 ) - log2( var(noise ) )  ).
-     * Note that put log function is in Q8 but the exponential function is in Q10.
-     * --
-     */
-
-    logVarIn -= log2_Q8_T( (uint32_t)( lag0 ) );
-    tmp16 = (int16_t)((logVarIn<<1) - (4<<10) );
-    rightShiftIn = 0;
-    if( tmp16 > 4096 )
-    {
-      tmp16 -= 4096;
-      tmp16 = exp2_Q10_T( tmp16 );
-      tmp16 >>= 6;
-    }
-    else
-      tmp16 = exp2_Q10_T( tmp16 )>>10;
-
-    (ISACdec_obj->plcstr_obj).std = tmp16 - 4;
-
-    if( (ltpGain < 110) || (ltpGain > 230) )
-    {
-      if( ltpGain < 100 && (pitchGain < 1800) )
-      {
-        (ISACdec_obj->plcstr_obj).A = WEBRTC_SPL_WORD16_MAX;
-      }
-      else
-      {
-        (ISACdec_obj->plcstr_obj).A = ((ltpGain < 110) && (Q < 800)
-                                       )? WEBRTC_SPL_WORD16_MAX:0;
-      }
-      (ISACdec_obj->plcstr_obj).B = WEBRTC_SPL_WORD16_MAX -
-          (ISACdec_obj->plcstr_obj).A;
-    }
-    else
-    {
-      if( (pitchGain < 450) || (pitchGain > 1600) )
-      {
-        (ISACdec_obj->plcstr_obj).A = ((pitchGain < 450)
-                                       )? WEBRTC_SPL_WORD16_MAX:0;
-        (ISACdec_obj->plcstr_obj).B = WEBRTC_SPL_WORD16_MAX -
-            (ISACdec_obj->plcstr_obj).A;
-      }
-      else
-      {
-        myVoiceIndicator = ltpGain * 2 + pitchGain;
-        MemshipValQ15( myVoiceIndicator,
-                       &(ISACdec_obj->plcstr_obj).A, &(ISACdec_obj->plcstr_obj).B );
-      }
-    }
-
-
-
-    myVoiceIndicator = ltpGain * 16 + pitchGain * 2 + (pitchGain >> 8);
-    MemshipValQ15( myVoiceIndicator,
-                   &(ISACdec_obj->plcstr_obj).A, &(ISACdec_obj->plcstr_obj).B );
-
-
-
-    (ISACdec_obj->plcstr_obj).stretchLag = lag0;
-    (ISACdec_obj->plcstr_obj).pitchIndex = 0;
-
-  }
-  else
-  {
-    myDecayRate = (DECAY_RATE<<2);
-  }
-
-  if( (ISACdec_obj->plcstr_obj).B < 1000 )
-  {
-    myDecayRate += (DECAY_RATE<<3);
-  }
-
-  /* ------------ reconstructing the residual signal ------------------ */
-
-  LinearResampler( (ISACdec_obj->plcstr_obj).lastPitchLP,
-                   stretchPitchLP, lag0, (ISACdec_obj->plcstr_obj).stretchLag );
-  /* inverse pitch filter */
-
-  pitchLags_Q7[0] = pitchLags_Q7[1] = pitchLags_Q7[2] = pitchLags_Q7[3] =
-      (int16_t)((ISACdec_obj->plcstr_obj).stretchLag<<7);
-  pitchGains_Q12[3] = ( (ISACdec_obj->plcstr_obj).lastPitchGain_Q12);
-  pitchGains_Q12[2] = (int16_t)(pitchGains_Q12[3] * 1010 >> 10);
-  pitchGains_Q12[1] = (int16_t)(pitchGains_Q12[2] * 1010 >> 10);
-  pitchGains_Q12[0] = (int16_t)(pitchGains_Q12[1] * 1010 >> 10);
-
-
-  /* most of the time either B or A are zero so seperating */
-  if( (ISACdec_obj->plcstr_obj).B == 0 )
-  {
-    for( i = 0; i < FRAMESAMPLES_HALF; i++ )
-    {
-      /* --- Low Pass                                             */
-      (ISACdec_obj->plcstr_obj).seed = WEBRTC_SPL_RAND(
-          (ISACdec_obj->plcstr_obj).seed );
-      Vector_Word16_1[i] = (ISACdec_obj->plcstr_obj.seed >> 10) - 16;
-
-      /* --- Highpass                                              */
-      (ISACdec_obj->plcstr_obj).seed = WEBRTC_SPL_RAND(
-          (ISACdec_obj->plcstr_obj).seed );
-      Vector_Word16_2[i] = (ISACdec_obj->plcstr_obj.seed >> 10) - 16;
-
-    }
-    for( i = 1; i < NOISE_FILTER_LEN; i++ )
-    {
-      (ISACdec_obj->plcstr_obj).seed = WEBRTC_SPL_RAND(
-          (ISACdec_obj->plcstr_obj).seed );
-      Vector_Word16_Extended_1[i] = (ISACdec_obj->plcstr_obj.seed >> 10) - 16;
-
-      (ISACdec_obj->plcstr_obj).seed = WEBRTC_SPL_RAND(
-          (ISACdec_obj->plcstr_obj).seed );
-      Vector_Word16_Extended_2[i] = (ISACdec_obj->plcstr_obj.seed >> 10) - 16;
-    }
-    plc_filterma_Fast(Vector_Word16_1, Vector_Word16_Extended_1,
-                      &(ISACdec_obj->plcstr_obj).prevPitchInvIn[FRAMESAMPLES_HALF -
-                                                                NOISE_FILTER_LEN], (int16_t) NOISE_FILTER_LEN,
-                      (int16_t) FRAMESAMPLES_HALF, (int16_t)(5),
-                      (ISACdec_obj->plcstr_obj).decayCoeffNoise, (int16_t)(6));
-
-    maxCoeff = WebRtcSpl_MaxAbsValueW32(
-        &(ISACdec_obj->plcstr_obj).prevHP[
-            PITCH_MAX_LAG + 10 - NOISE_FILTER_LEN], NOISE_FILTER_LEN );
-
-    rshift = 0;
-    while( maxCoeff > WEBRTC_SPL_WORD16_MAX )
-    {
-      maxCoeff >>= 1;
-      rshift++;
-    }
-    for( i = 0; i < NOISE_FILTER_LEN; i++ ) {
-      Vector_Word16_1[FRAMESAMPLES_HALF - NOISE_FILTER_LEN + i] =(int16_t)(
-          ISACdec_obj->plcstr_obj.prevHP[PITCH_MAX_LAG + 10 - NOISE_FILTER_LEN +
-                                         i] >> rshift);
-    }
-    (ISACdec_obj->plcstr_obj).decayCoeffNoise = plc_filterma_Fast(
-        Vector_Word16_2,
-        Vector_Word16_Extended_2,
-        &Vector_Word16_1[FRAMESAMPLES_HALF - NOISE_FILTER_LEN],
-        (int16_t) NOISE_FILTER_LEN,
-        (int16_t) FRAMESAMPLES_HALF,
-        (int16_t) (5),
-        (ISACdec_obj->plcstr_obj).decayCoeffNoise,
-        (int16_t) (7) );
-
-    for( i = 0; i < FRAMESAMPLES_HALF; i++ )
-      Vector_Word32_2[i] = Vector_Word16_Extended_2[i] << rshift;
-
-    Vector_Word16_1 = Vector_Word16_Extended_1;
-  }
-  else
-  {
-    if( (ISACdec_obj->plcstr_obj).A == 0 )
-    {
-      /* ------ Periodic Vector ---                                */
-      for( i = 0, noiseIndex = 0; i < FRAMESAMPLES_HALF; i++, noiseIndex++ )
-      {
-        /* --- Lowpass                                               */
-        pLP = (int16_t)(stretchPitchLP[ISACdec_obj->plcstr_obj.pitchIndex] *
-            ISACdec_obj->plcstr_obj.decayCoeffPriodic >> 15);
-
-        /* --- Highpass                                              */
-        pHP = (int32_t)WEBRTC_SPL_MUL_16_32_RSFT15(
-            (ISACdec_obj->plcstr_obj).decayCoeffPriodic,
-            (ISACdec_obj->plcstr_obj).prevHP[PITCH_MAX_LAG + 10 -
-                                             (ISACdec_obj->plcstr_obj).stretchLag +
-                                             (ISACdec_obj->plcstr_obj).pitchIndex] );
-
-        /* --- lower the muliplier (more decay at next sample) --- */
-        (ISACdec_obj->plcstr_obj).decayCoeffPriodic -= (myDecayRate);
-        if( (ISACdec_obj->plcstr_obj).decayCoeffPriodic < 0 )
-          (ISACdec_obj->plcstr_obj).decayCoeffPriodic = 0;
-
-        (ISACdec_obj->plcstr_obj).pitchIndex++;
-
-        if( (ISACdec_obj->plcstr_obj).pitchIndex ==
-            (ISACdec_obj->plcstr_obj).stretchLag )
-        {
-          (ISACdec_obj->plcstr_obj).pitchIndex = 0;
-          (ISACdec_obj->plcstr_obj).pitchCycles++;
-
-          if( (ISACdec_obj->plcstr_obj).stretchLag != (lag0 + 1) )
-          {
-            (ISACdec_obj->plcstr_obj).stretchLag = lag0 + 1;
-          }
-          else
-          {
-            (ISACdec_obj->plcstr_obj).stretchLag = lag0;
-          }
-
-          (ISACdec_obj->plcstr_obj).stretchLag = (
-              (ISACdec_obj->plcstr_obj).stretchLag > PITCH_MAX_LAG
-                                                  )? (PITCH_MAX_LAG):(ISACdec_obj->plcstr_obj).stretchLag;
-
-          LinearResampler( (ISACdec_obj->plcstr_obj).lastPitchLP,
-                           stretchPitchLP, lag0, (ISACdec_obj->plcstr_obj).stretchLag );
-
-          LinearResampler( (ISACdec_obj->plcstr_obj).prevPitchLP,
-                           stretchPitchLP1, lag0, (ISACdec_obj->plcstr_obj).stretchLag );
-
-          switch( (ISACdec_obj->plcstr_obj).pitchCycles )
-          {
-            case 1:
-              {
-                for( k=0; k<(ISACdec_obj->plcstr_obj).stretchLag; k++ )
-                {
-                  stretchPitchLP[k] = (int16_t)((
-                      (int32_t)stretchPitchLP[k]* 3 +
-                      (int32_t)stretchPitchLP1[k])>>2);
-                }
-                break;
-              }
-            case 2:
-              {
-                for( k=0; k<(ISACdec_obj->plcstr_obj).stretchLag; k++ )
-                {
-                  stretchPitchLP[k] = (int16_t)((
-                      (int32_t)stretchPitchLP[k] +
-                      (int32_t)stretchPitchLP1[k] )>>1);
-                }
-                break;
-              }
-            case 3:
-              {
-                for( k=0; k<(ISACdec_obj->plcstr_obj).stretchLag; k++ )
-                {
-                  stretchPitchLP[k] = (int16_t)((stretchPitchLP[k] +
-                                                       (int32_t)stretchPitchLP1[k]*3 )>>2);
-                }
-                break;
-              }
-          }
-
-          if( (ISACdec_obj->plcstr_obj).pitchCycles == 3 )
-          {
-            myDecayRate += 35; //(myDecayRate>>1);
-            (ISACdec_obj->plcstr_obj).pitchCycles = 0;
-          }
-
-        }
-
-        /* ------ Sum the noisy and periodic signals  ------ */
-        Vector_Word16_1[i] = pLP;
-        Vector_Word32_2[i] = pHP;
-      }
-    }
-    else
-    {
-      for( i = 0, noiseIndex = 0; i < FRAMESAMPLES_HALF; i++, noiseIndex++ )
-      {
-
-        (ISACdec_obj->plcstr_obj).seed = WEBRTC_SPL_RAND(
-            (ISACdec_obj->plcstr_obj).seed );
-
-        noise1 = (ISACdec_obj->plcstr_obj.seed >> 10) - 16;
-
-        nLP = (int16_t)((int16_t)(noise1 * ISACdec_obj->plcstr_obj.std) *
-            ISACdec_obj->plcstr_obj.decayCoeffNoise >> 15);
-
-        /* --- Highpass                                              */
-        (ISACdec_obj->plcstr_obj).seed = WEBRTC_SPL_RAND(
-            (ISACdec_obj->plcstr_obj).seed );
-        noise1 = (ISACdec_obj->plcstr_obj.seed >> 11) - 8;
-
-        nHP = (int32_t)WEBRTC_SPL_MUL_16_32_RSFT15(
-            (ISACdec_obj->plcstr_obj).decayCoeffNoise,
-            (int32_t)(noise1*(ISACdec_obj->plcstr_obj).std) );
-
-        /* --- lower the muliplier (more decay at next sample) --- */
-        (ISACdec_obj->plcstr_obj).decayCoeffNoise -= (myDecayRate);
-        if( (ISACdec_obj->plcstr_obj).decayCoeffNoise < 0 )
-          (ISACdec_obj->plcstr_obj).decayCoeffNoise = 0;
-
-        /* ------ Periodic Vector ---                                */
-        /* --- Lowpass                                               */
-        pLP = (int16_t)(stretchPitchLP[ISACdec_obj->plcstr_obj.pitchIndex] *
-            ISACdec_obj->plcstr_obj.decayCoeffPriodic >> 15);
-
-        /* --- Highpass                                              */
-        pHP = (int32_t)WEBRTC_SPL_MUL_16_32_RSFT15(
-            (ISACdec_obj->plcstr_obj).decayCoeffPriodic,
-            (ISACdec_obj->plcstr_obj).prevHP[PITCH_MAX_LAG + 10 -
-                                             (ISACdec_obj->plcstr_obj).stretchLag +
-                                             (ISACdec_obj->plcstr_obj).pitchIndex] );
-
-        /* --- lower the muliplier (more decay at next sample) --- */
-        (ISACdec_obj->plcstr_obj).decayCoeffPriodic -= (myDecayRate);
-        if( (ISACdec_obj->plcstr_obj).decayCoeffPriodic < 0 )
-        {
-          (ISACdec_obj->plcstr_obj).decayCoeffPriodic = 0;
-        }
-
-        /* ------ Weighting the noisy and periodic vectors -------   */
-        wNoisyLP = (int16_t)(ISACdec_obj->plcstr_obj.A * nLP >> 15);
-        wNoisyHP = (int32_t)(WEBRTC_SPL_MUL_16_32_RSFT15(
-            (ISACdec_obj->plcstr_obj).A, (nHP) ) );
-
-        wPriodicLP = (int16_t)(ISACdec_obj->plcstr_obj.B * pLP >> 15);
-        wPriodicHP = (int32_t)(WEBRTC_SPL_MUL_16_32_RSFT15(
-            (ISACdec_obj->plcstr_obj).B, pHP));
-
-        (ISACdec_obj->plcstr_obj).pitchIndex++;
-
-        if((ISACdec_obj->plcstr_obj).pitchIndex ==
-           (ISACdec_obj->plcstr_obj).stretchLag)
-        {
-          (ISACdec_obj->plcstr_obj).pitchIndex = 0;
-          (ISACdec_obj->plcstr_obj).pitchCycles++;
-
-          if( (ISACdec_obj->plcstr_obj).stretchLag != (lag0 + 1) )
-            (ISACdec_obj->plcstr_obj).stretchLag = lag0 + 1;
-          else
-            (ISACdec_obj->plcstr_obj).stretchLag = lag0;
-
-          (ISACdec_obj->plcstr_obj).stretchLag = (
-              (ISACdec_obj->plcstr_obj).stretchLag > PITCH_MAX_LAG
-                                                  )? (PITCH_MAX_LAG):(ISACdec_obj->plcstr_obj).stretchLag;
-          LinearResampler(
-              (ISACdec_obj->plcstr_obj).lastPitchLP,
-              stretchPitchLP, lag0, (ISACdec_obj->plcstr_obj).stretchLag );
-
-          LinearResampler((ISACdec_obj->plcstr_obj).prevPitchLP,
-                          stretchPitchLP1, lag0, (ISACdec_obj->plcstr_obj).stretchLag );
-
-          switch((ISACdec_obj->plcstr_obj).pitchCycles)
-          {
-            case 1:
-              {
-                for( k=0; k<(ISACdec_obj->plcstr_obj).stretchLag; k++ )
-                {
-                  stretchPitchLP[k] = (int16_t)((
-                      (int32_t)stretchPitchLP[k]* 3 +
-                      (int32_t)stretchPitchLP1[k] )>>2);
-                }
-                break;
-              }
-            case 2:
-              {
-                for( k=0; k<(ISACdec_obj->plcstr_obj).stretchLag; k++ )
-                {
-                  stretchPitchLP[k] = (int16_t)((
-                      (int32_t)stretchPitchLP[k] +
-                      (int32_t)stretchPitchLP1[k])>>1);
-                }
-                break;
-              }
-            case 3:
-              {
-                for( k=0; k<(ISACdec_obj->plcstr_obj).stretchLag; k++ )
-                {
-                  stretchPitchLP[k] = (int16_t)(
-                      (stretchPitchLP[k] +
-                       (int32_t)stretchPitchLP1[k]*3 )>>2);
-                }
-                break;
-              }
-          }
-
-          if( (ISACdec_obj->plcstr_obj).pitchCycles == 3 )
-          {
-            myDecayRate += 55; //(myDecayRate>>1);
-            (ISACdec_obj->plcstr_obj).pitchCycles = 0;
-          }
-        }
-
-        /* ------ Sum the noisy and periodic signals  ------ */
-        Vector_Word16_1[i] = WebRtcSpl_AddSatW16(wNoisyLP, wPriodicLP);
-        Vector_Word32_2[i] = WebRtcSpl_AddSatW32(wNoisyHP, wPriodicHP);
-      }
-    }
-  }
-  /* ----------------- residual signal is reconstructed ------------------ */
-
-  k = (ISACdec_obj->plcstr_obj).pitchIndex;
-  /* --- Write one pitch cycle for recovery block --- */
-
-  for( i = 0; i < RECOVERY_OVERLAP; i++ )
-  {
-    ISACdec_obj->plcstr_obj.overlapLP[i] = (int16_t)(
-        stretchPitchLP[k] * ISACdec_obj->plcstr_obj.decayCoeffPriodic >> 15);
-    k = ( k < ((ISACdec_obj->plcstr_obj).stretchLag - 1) )? (k+1):0;
-  }
-
-  (ISACdec_obj->plcstr_obj).lastPitchLag_Q7 =
-      (int16_t)((ISACdec_obj->plcstr_obj).stretchLag << 7);
-
-
-  /* --- Inverse Pitch Filter --- */
-  WebRtcIsacfix_PitchFilter(Vector_Word16_1, Vector_Word16_2,
-                            &ISACdec_obj->pitchfiltstr_obj, pitchLags_Q7, pitchGains_Q12, 4);
-
-  /* reduce gain to compensate for pitch enhancer */
-  /* gain = 1.0f - 0.45f * AvgPitchGain; */
-  tmp32a = ISACdec_obj->plcstr_obj.AvgPitchGain_Q12 * 29;  // Q18
-  tmp32b = 262144 - tmp32a;  // Q18
-  gainQ13 = (int16_t) (tmp32b >> 5); // Q13
-
-  /* perceptual post-filtering (using normalized lattice filter) */
-  for (k = 0; k < FRAMESAMPLES_HALF; k++)
-    Vector_Word32_1[k] = (Vector_Word16_2[k] * gainQ13) << 3;  // Q25
-
-
-  WebRtcIsacfix_NormLatticeFilterAr(ORDERLO,
-                                    (ISACdec_obj->maskfiltstr_obj).PostStateLoGQ0,
-                                    Vector_Word32_1, lofilt_coefQ15, gain_lo_hiQ17, 0, Vector_Word16_1);
-
-  WebRtcIsacfix_NormLatticeFilterAr(ORDERHI,
-                                    (ISACdec_obj->maskfiltstr_obj).PostStateHiGQ0,
-                                    Vector_Word32_2, hifilt_coefQ15, gain_lo_hiQ17, 1, Vector_Word16_2);
-
-  /* recombine the 2 bands */
-
-  /* Form the polyphase signals, and compensate for DC offset */
-  for (k=0;k<FRAMESAMPLES_HALF;k++)
-  {
-    /* Construct a new upper channel signal*/
-    tmp_1 = (int16_t)WebRtcSpl_SatW32ToW16(
-                                           ((int32_t)Vector_Word16_1[k]+Vector_Word16_2[k] + 1));
-    /* Construct a new lower channel signal*/
-    tmp_2 = (int16_t)WebRtcSpl_SatW32ToW16(
-                                           ((int32_t)Vector_Word16_1[k]-Vector_Word16_2[k]));
-    Vector_Word16_1[k] = tmp_1;
-    Vector_Word16_2[k] = tmp_2;
-  }
-
-
-  WebRtcIsacfix_FilterAndCombine1(Vector_Word16_1,
-                                  Vector_Word16_2, signal_out16, &ISACdec_obj->postfiltbankstr_obj);
-
-  (ISACdec_obj->plcstr_obj).used = PLC_WAS_USED;
-  *current_framesamples = 480;
-}
diff --git a/modules/audio_coding/codecs/isac/fix/source/encode.c b/modules/audio_coding/codecs/isac/fix/source/encode.c
deleted file mode 100644
index ee07660..0000000
--- a/modules/audio_coding/codecs/isac/fix/source/encode.c
+++ /dev/null
@@ -1,635 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/*
- * encode.c
- *
- * Encoding function for the iSAC coder.
- *
- */
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/modules/audio_coding/codecs/isac/fix/source/codec.h"
-
-#include <stdio.h>
-
-#include "webrtc/modules/audio_coding/codecs/isac/fix/source/arith_routins.h"
-#include "webrtc/modules/audio_coding/codecs/isac/fix/source/bandwidth_estimator.h"
-#include "webrtc/modules/audio_coding/codecs/isac/fix/source/entropy_coding.h"
-#include "webrtc/modules/audio_coding/codecs/isac/fix/source/lpc_masking_model.h"
-#include "webrtc/modules/audio_coding/codecs/isac/fix/source/lpc_tables.h"
-#include "webrtc/modules/audio_coding/codecs/isac/fix/source/pitch_estimator.h"
-#include "webrtc/modules/audio_coding/codecs/isac/fix/source/pitch_gain_tables.h"
-#include "webrtc/modules/audio_coding/codecs/isac/fix/source/pitch_lag_tables.h"
-#include "webrtc/modules/audio_coding/codecs/isac/fix/source/structs.h"
-
-
-int WebRtcIsacfix_EncodeImpl(int16_t      *in,
-                             IsacFixEncoderInstance  *ISACenc_obj,
-                             BwEstimatorstr      *bw_estimatordata,
-                             int16_t         CodingMode)
-{
-  int16_t stream_length = 0;
-  int16_t usefulstr_len = 0;
-  int k;
-  int16_t BWno;
-
-  int16_t lofilt_coefQ15[(ORDERLO)*SUBFRAMES];
-  int16_t hifilt_coefQ15[(ORDERHI)*SUBFRAMES];
-  int32_t gain_lo_hiQ17[2*SUBFRAMES];
-
-  int16_t LPandHP[FRAMESAMPLES/2 + QLOOKAHEAD];
-  int16_t LP16a[FRAMESAMPLES/2 + QLOOKAHEAD];
-  int16_t HP16a[FRAMESAMPLES/2 + QLOOKAHEAD];
-
-  int16_t PitchLags_Q7[PITCH_SUBFRAMES];
-  int16_t PitchGains_Q12[PITCH_SUBFRAMES];
-  int16_t AvgPitchGain_Q12;
-
-  int16_t frame_mode; /* 0 for 30ms, 1 for 60ms */
-  int16_t processed_samples;
-  int status;
-
-  int32_t bits_gainsQ11;
-  int16_t MinBytes;
-  int16_t bmodel;
-
-  transcode_obj transcodingParam;
-  int16_t payloadLimitBytes;
-  int16_t arithLenBeforeEncodingDFT;
-  int16_t iterCntr;
-
-  /* copy new frame length and bottle neck rate only for the first 10 ms data */
-  if (ISACenc_obj->buffer_index == 0) {
-    /* set the framelength for the next packet */
-    ISACenc_obj->current_framesamples = ISACenc_obj->new_framelength;
-  }
-
-  frame_mode = ISACenc_obj->current_framesamples/MAX_FRAMESAMPLES; /* 0 (30 ms) or 1 (60 ms)  */
-  processed_samples = ISACenc_obj->current_framesamples/(frame_mode+1); /* 480 (30, 60 ms) */
-
-  /* buffer speech samples (by 10ms packet) until the framelength is reached (30 or 60 ms) */
-  /**************************************************************************************/
-  /* fill the buffer with 10ms input data */
-  for(k=0; k<FRAMESAMPLES_10ms; k++) {
-    ISACenc_obj->data_buffer_fix[k + ISACenc_obj->buffer_index] = in[k];
-  }
-  /* if buffersize is not equal to current framesize, and end of file is not reached yet, */
-  /* increase index and go back to main to get more speech samples */
-  if (ISACenc_obj->buffer_index + FRAMESAMPLES_10ms != processed_samples) {
-    ISACenc_obj->buffer_index = ISACenc_obj->buffer_index + FRAMESAMPLES_10ms;
-    return 0;
-  }
-  /* if buffer reached the right size, reset index and continue with encoding the frame */
-  ISACenc_obj->buffer_index = 0;
-
-  /* end of buffer function */
-  /**************************/
-
-  /* encoding */
-  /************/
-
-  if (frame_mode == 0 || ISACenc_obj->frame_nb == 0 )
-  {
-    /* reset bitstream */
-    ISACenc_obj->bitstr_obj.W_upper = 0xFFFFFFFF;
-    ISACenc_obj->bitstr_obj.streamval = 0;
-    ISACenc_obj->bitstr_obj.stream_index = 0;
-    ISACenc_obj->bitstr_obj.full = 1;
-
-    if (CodingMode == 0) {
-      ISACenc_obj->BottleNeck =  WebRtcIsacfix_GetUplinkBandwidth(bw_estimatordata);
-      ISACenc_obj->MaxDelay =  WebRtcIsacfix_GetUplinkMaxDelay(bw_estimatordata);
-    }
-    if (CodingMode == 0 && frame_mode == 0 && (ISACenc_obj->enforceFrameSize == 0)) {
-      ISACenc_obj->new_framelength = WebRtcIsacfix_GetNewFrameLength(ISACenc_obj->BottleNeck,
-                                                                     ISACenc_obj->current_framesamples);
-    }
-
-    // multiply the bottleneck by 0.88 before computing SNR, 0.88 is tuned by experimenting on TIMIT
-    // 901/1024 is 0.87988281250000
-    ISACenc_obj->s2nr = WebRtcIsacfix_GetSnr(
-        (int16_t)(ISACenc_obj->BottleNeck * 901 >> 10),
-        ISACenc_obj->current_framesamples);
-
-    /* encode frame length */
-    status = WebRtcIsacfix_EncodeFrameLen(ISACenc_obj->current_framesamples, &ISACenc_obj->bitstr_obj);
-    if (status < 0)
-    {
-      /* Wrong frame size */
-      if (frame_mode == 1 && ISACenc_obj->frame_nb == 1)
-      {
-        // If this is the second 30ms of a 60ms frame reset this such that in the next call
-        // encoder starts fresh.
-        ISACenc_obj->frame_nb = 0;
-      }
-      return status;
-    }
-
-    /* Save framelength for multiple packets memory */
-    if (ISACenc_obj->SaveEnc_ptr != NULL) {
-      (ISACenc_obj->SaveEnc_ptr)->framelength=ISACenc_obj->current_framesamples;
-    }
-
-    /* bandwidth estimation and coding */
-    BWno = WebRtcIsacfix_GetDownlinkBwIndexImpl(bw_estimatordata);
-    status = WebRtcIsacfix_EncodeReceiveBandwidth(&BWno, &ISACenc_obj->bitstr_obj);
-    if (status < 0)
-    {
-      if (frame_mode == 1 && ISACenc_obj->frame_nb == 1)
-      {
-        // If this is the second 30ms of a 60ms frame reset this such that in the next call
-        // encoder starts fresh.
-        ISACenc_obj->frame_nb = 0;
-      }
-      return status;
-    }
-  }
-
-  /* split signal in two bands */
-  WebRtcIsacfix_SplitAndFilter1(ISACenc_obj->data_buffer_fix, LP16a, HP16a, &ISACenc_obj->prefiltbankstr_obj );
-
-  /* estimate pitch parameters and pitch-filter lookahead signal */
-  WebRtcIsacfix_PitchAnalysis(LP16a+QLOOKAHEAD, LPandHP,
-                              &ISACenc_obj->pitchanalysisstr_obj,  PitchLags_Q7, PitchGains_Q12); /* LPandHP = LP_lookahead_pfQ0, */
-
-  /* Set where to store data in multiple packets memory */
-  if (ISACenc_obj->SaveEnc_ptr != NULL) {
-    if (frame_mode == 0 || ISACenc_obj->frame_nb == 0)
-    {
-      (ISACenc_obj->SaveEnc_ptr)->startIdx = 0;
-    }
-    else
-    {
-      (ISACenc_obj->SaveEnc_ptr)->startIdx = 1;
-    }
-  }
-
-  /* quantize & encode pitch parameters */
-  status = WebRtcIsacfix_EncodePitchGain(PitchGains_Q12, &ISACenc_obj->bitstr_obj,  ISACenc_obj->SaveEnc_ptr);
-  if (status < 0)
-  {
-    if (frame_mode == 1 && ISACenc_obj->frame_nb == 1)
-    {
-      // If this is the second 30ms of a 60ms frame reset this such that in the next call
-      // encoder starts fresh.
-      ISACenc_obj->frame_nb = 0;
-    }
-    return status;
-  }
-  status = WebRtcIsacfix_EncodePitchLag(PitchLags_Q7 , PitchGains_Q12, &ISACenc_obj->bitstr_obj,  ISACenc_obj->SaveEnc_ptr);
-  if (status < 0)
-  {
-    if (frame_mode == 1 && ISACenc_obj->frame_nb == 1)
-    {
-      // If this is the second 30ms of a 60ms frame reset this such that in the next call
-      // encoder starts fresh.
-      ISACenc_obj->frame_nb = 0;
-    }
-    return status;
-  }
-  AvgPitchGain_Q12 = (PitchGains_Q12[0] + PitchGains_Q12[1] +
-      PitchGains_Q12[2] + PitchGains_Q12[3]) >> 2;
-
-  /* find coefficients for perceptual pre-filters */
-  WebRtcIsacfix_GetLpcCoef(LPandHP, HP16a+QLOOKAHEAD, &ISACenc_obj->maskfiltstr_obj,
-                           ISACenc_obj->s2nr, PitchGains_Q12,
-                           gain_lo_hiQ17, lofilt_coefQ15, hifilt_coefQ15); /*LPandHP = LP_lookahead_pfQ0*/
-
-  // record LPC Gains for possible bit-rate reduction
-  for(k = 0; k < KLT_ORDER_GAIN; k++)
-  {
-    transcodingParam.lpcGains[k] = gain_lo_hiQ17[k];
-  }
-
-  /* code LPC model and shape - gains not quantized yet */
-  status = WebRtcIsacfix_EncodeLpc(gain_lo_hiQ17, lofilt_coefQ15, hifilt_coefQ15,
-                                   &bmodel, &bits_gainsQ11, &ISACenc_obj->bitstr_obj, ISACenc_obj->SaveEnc_ptr, &transcodingParam);
-  if (status < 0)
-  {
-    if (frame_mode == 1 && ISACenc_obj->frame_nb == 1)
-    {
-      // If this is the second 30ms of a 60ms frame reset this such that in the next call
-      // encoder starts fresh.
-      ISACenc_obj->frame_nb = 0;
-    }
-    return status;
-  }
-  arithLenBeforeEncodingDFT = (ISACenc_obj->bitstr_obj.stream_index << 1) + (1-ISACenc_obj->bitstr_obj.full);
-
-  /* low-band filtering */
-  WebRtcIsacfix_NormLatticeFilterMa(ORDERLO, ISACenc_obj->maskfiltstr_obj.PreStateLoGQ15,
-                                    LP16a, lofilt_coefQ15, gain_lo_hiQ17, 0, LPandHP);/* LPandHP = LP16b */
-
-  /* pitch filter */
-  WebRtcIsacfix_PitchFilter(LPandHP, LP16a, &ISACenc_obj->pitchfiltstr_obj, PitchLags_Q7, PitchGains_Q12, 1);/* LPandHP = LP16b */
-
-  /* high-band filtering */
-  WebRtcIsacfix_NormLatticeFilterMa(ORDERHI, ISACenc_obj->maskfiltstr_obj.PreStateHiGQ15,
-                                    HP16a, hifilt_coefQ15, gain_lo_hiQ17, 1, LPandHP);/*LPandHP = HP16b*/
-
-  /* transform */
-  WebRtcIsacfix_Time2Spec(LP16a, LPandHP, LP16a, LPandHP); /*LPandHP = HP16b*/
-
-  /* Save data for multiple packets memory */
-  if (ISACenc_obj->SaveEnc_ptr != NULL) {
-    for (k = 0; k < FRAMESAMPLES_HALF; k++) {
-      (ISACenc_obj->SaveEnc_ptr)->fre[k + (ISACenc_obj->SaveEnc_ptr)->startIdx*FRAMESAMPLES_HALF] = LP16a[k];
-      (ISACenc_obj->SaveEnc_ptr)->fim[k + (ISACenc_obj->SaveEnc_ptr)->startIdx*FRAMESAMPLES_HALF] = LPandHP[k];
-    }
-    (ISACenc_obj->SaveEnc_ptr)->AvgPitchGain[(ISACenc_obj->SaveEnc_ptr)->startIdx] = AvgPitchGain_Q12;
-  }
-
-  /* quantization and lossless coding */
-  status = WebRtcIsacfix_EncodeSpec(LP16a, LPandHP, &ISACenc_obj->bitstr_obj, AvgPitchGain_Q12);
-  if((status <= -1) && (status != -ISAC_DISALLOWED_BITSTREAM_LENGTH)) /*LPandHP = HP16b*/
-  {
-    if (frame_mode == 1 && ISACenc_obj->frame_nb == 1)
-    {
-      // If this is the second 30ms of a 60ms frame reset this such that in the next call
-      // encoder starts fresh.
-      ISACenc_obj->frame_nb = 0;
-    }
-    return status;
-  }
-
-  if((frame_mode == 1) && (ISACenc_obj->frame_nb == 0))
-  {
-    // it is a 60ms and we are in the first 30ms
-    // then the limit at this point should be half of the assigned value
-    payloadLimitBytes = ISACenc_obj->payloadLimitBytes60 >> 1;
-  }
-  else if (frame_mode == 0)
-  {
-    // it is a 30ms frame
-    payloadLimitBytes = (ISACenc_obj->payloadLimitBytes30) - 3;
-  }
-  else
-  {
-    // this is the second half of a 60ms frame.
-    payloadLimitBytes = ISACenc_obj->payloadLimitBytes60 - 3; // subract 3 because termination process may add 3 bytes
-  }
-
-  iterCntr = 0;
-  while((((ISACenc_obj->bitstr_obj.stream_index) << 1) > payloadLimitBytes) ||
-        (status == -ISAC_DISALLOWED_BITSTREAM_LENGTH))
-  {
-    int16_t arithLenDFTByte;
-    int16_t bytesLeftQ5;
-    int16_t ratioQ5[8] = {0, 6, 9, 12, 16, 19, 22, 25};
-
-    // According to experiments on TIMIT the following is proper for audio, but it is not agressive enough for tonal inputs
-    // such as DTMF, sweep-sine, ...
-    //
-    // (0.55 - (0.8 - ratio[i]/32) * 5 / 6) * 2^14
-    // int16_t scaleQ14[8] = {0, 648, 1928, 3208, 4915, 6195, 7475, 8755};
-
-
-    // This is a supper-agressive scaling passed the tests (tonal inputs) tone with one iteration for payload limit
-    // of 120 (32kbps bottleneck), number of frames needed a rate-reduction was 58403
-    //
-    int16_t scaleQ14[8] = {0, 348, 828, 1408, 2015, 3195, 3500, 3500};
-    int16_t idx;
-
-    if(iterCntr >= MAX_PAYLOAD_LIMIT_ITERATION)
-    {
-      // We were not able to limit the payload size
-
-      if((frame_mode == 1) && (ISACenc_obj->frame_nb == 0))
-      {
-        // This was the first 30ms of a 60ms frame. Although the payload is larger than it
-        // should be but we let the second 30ms be encoded. Maybe togetehr we won't exceed
-        // the limit.
-        ISACenc_obj->frame_nb = 1;
-        return 0;
-      }
-      else if((frame_mode == 1) && (ISACenc_obj->frame_nb == 1))
-      {
-        ISACenc_obj->frame_nb = 0;
-      }
-
-      if(status != -ISAC_DISALLOWED_BITSTREAM_LENGTH)
-      {
-        return -ISAC_PAYLOAD_LARGER_THAN_LIMIT;
-      }
-      else
-      {
-        return status;
-      }
-    }
-    if(status != -ISAC_DISALLOWED_BITSTREAM_LENGTH)
-    {
-      arithLenDFTByte = (ISACenc_obj->bitstr_obj.stream_index << 1) + (1-ISACenc_obj->bitstr_obj.full) - arithLenBeforeEncodingDFT;
-      bytesLeftQ5 = (payloadLimitBytes - arithLenBeforeEncodingDFT) << 5;
-
-      // bytesLeft / arithLenDFTBytes indicates how much scaling is required a rough estimate (agressive)
-      // scale = 0.55 - (0.8 - bytesLeft / arithLenDFTBytes) * 5 / 6
-      // bytesLeft / arithLenDFTBytes below 0.2 will have a scale of zero and above 0.8 are treated as 0.8
-      // to avoid division we do more simplification.
-      //
-      // values of (bytesLeft / arithLenDFTBytes)*32 between ratioQ5[i] and ratioQ5[i+1] are rounded to ratioQ5[i]
-      // and the corresponding scale is chosen
-
-      // we compare bytesLeftQ5 with ratioQ5[]*arithLenDFTByte;
-      idx = 4;
-      idx += (bytesLeftQ5 >= ratioQ5[idx] * arithLenDFTByte) ? 2 : -2;
-      idx += (bytesLeftQ5 >= ratioQ5[idx] * arithLenDFTByte) ? 1 : -1;
-      idx += (bytesLeftQ5 >= ratioQ5[idx] * arithLenDFTByte) ? 0 : -1;
-    }
-    else
-    {
-      // we are here because the bit-stream did not fit into the buffer, in this case, the stream_index is not
-      // trustable, especially if the is the first 30ms of a packet. Thereforem, we will go for the most agressive
-      // case.
-      idx = 0;
-    }
-    // scale FFT coefficients to reduce the bit-rate
-    for(k = 0; k < FRAMESAMPLES_HALF; k++)
-    {
-      LP16a[k] = (int16_t)(LP16a[k] * scaleQ14[idx] >> 14);
-      LPandHP[k] = (int16_t)(LPandHP[k] * scaleQ14[idx] >> 14);
-    }
-
-    // Save data for multiple packets memory
-    if (ISACenc_obj->SaveEnc_ptr != NULL)
-    {
-      for(k = 0; k < FRAMESAMPLES_HALF; k++)
-      {
-        (ISACenc_obj->SaveEnc_ptr)->fre[k + (ISACenc_obj->SaveEnc_ptr)->startIdx*FRAMESAMPLES_HALF] = LP16a[k];
-        (ISACenc_obj->SaveEnc_ptr)->fim[k + (ISACenc_obj->SaveEnc_ptr)->startIdx*FRAMESAMPLES_HALF] = LPandHP[k];
-      }
-    }
-
-    // scale the unquantized LPC gains and save the scaled version for the future use
-    for(k = 0; k < KLT_ORDER_GAIN; k++)
-    {
-      gain_lo_hiQ17[k] = WEBRTC_SPL_MUL_16_32_RSFT14(scaleQ14[idx], transcodingParam.lpcGains[k]);//transcodingParam.lpcGains[k]; //
-      transcodingParam.lpcGains[k] = gain_lo_hiQ17[k];
-    }
-
-    // reset the bit-stream object to the state which it had before encoding LPC Gains
-    ISACenc_obj->bitstr_obj.full = transcodingParam.full;
-    ISACenc_obj->bitstr_obj.stream_index = transcodingParam.stream_index;
-    ISACenc_obj->bitstr_obj.streamval = transcodingParam.streamval;
-    ISACenc_obj->bitstr_obj.W_upper = transcodingParam.W_upper;
-    ISACenc_obj->bitstr_obj.stream[transcodingParam.stream_index-1] = transcodingParam.beforeLastWord;
-    ISACenc_obj->bitstr_obj.stream[transcodingParam.stream_index] = transcodingParam.lastWord;
-
-
-    // quantize and encode LPC gain
-    WebRtcIsacfix_EstCodeLpcGain(gain_lo_hiQ17, &ISACenc_obj->bitstr_obj, ISACenc_obj->SaveEnc_ptr);
-    arithLenBeforeEncodingDFT = (ISACenc_obj->bitstr_obj.stream_index << 1) + (1-ISACenc_obj->bitstr_obj.full);
-    status = WebRtcIsacfix_EncodeSpec(LP16a, LPandHP, &ISACenc_obj->bitstr_obj, AvgPitchGain_Q12);
-    if((status <= -1) && (status != -ISAC_DISALLOWED_BITSTREAM_LENGTH)) /*LPandHP = HP16b*/
-    {
-      if (frame_mode == 1 && ISACenc_obj->frame_nb == 1)
-      {
-        // If this is the second 30ms of a 60ms frame reset this such that in the next call
-        // encoder starts fresh.
-        ISACenc_obj->frame_nb = 0;
-      }
-      return status;
-    }
-    iterCntr++;
-  }
-
-  if (frame_mode == 1 && ISACenc_obj->frame_nb == 0)
-    /* i.e. 60 ms framesize and just processed the first 30ms, */
-    /* go back to main function to buffer the other 30ms speech frame */
-  {
-    ISACenc_obj->frame_nb = 1;
-    return 0;
-  }
-  else if (frame_mode == 1 && ISACenc_obj->frame_nb == 1)
-  {
-    ISACenc_obj->frame_nb = 0;
-    /* also update the framelength for next packet, in Adaptive mode only */
-    if (CodingMode == 0 && (ISACenc_obj->enforceFrameSize == 0)) {
-      ISACenc_obj->new_framelength = WebRtcIsacfix_GetNewFrameLength(ISACenc_obj->BottleNeck,
-                                                                     ISACenc_obj->current_framesamples);
-    }
-  }
-
-
-  /* complete arithmetic coding */
-  stream_length = WebRtcIsacfix_EncTerminate(&ISACenc_obj->bitstr_obj);
-  /* can this be negative? */
-
-  if(CodingMode == 0)
-  {
-
-    /* update rate model and get minimum number of bytes in this packet */
-    MinBytes = WebRtcIsacfix_GetMinBytes(&ISACenc_obj->rate_data_obj, (int16_t) stream_length,
-                                         ISACenc_obj->current_framesamples, ISACenc_obj->BottleNeck, ISACenc_obj->MaxDelay);
-
-    /* if bitstream is too short, add garbage at the end */
-
-    /* Store length of coded data */
-    usefulstr_len = stream_length;
-
-    /* Make sure MinBytes does not exceed packet size limit */
-    if ((ISACenc_obj->frame_nb == 0) && (MinBytes > ISACenc_obj->payloadLimitBytes30)) {
-      MinBytes = ISACenc_obj->payloadLimitBytes30;
-    } else if ((ISACenc_obj->frame_nb == 1) && (MinBytes > ISACenc_obj->payloadLimitBytes60)) {
-      MinBytes = ISACenc_obj->payloadLimitBytes60;
-    }
-
-    /* Make sure we don't allow more than 255 bytes of garbage data.
-       We store the length of the garbage data in 8 bits in the bitstream,
-       255 is the max garbage lenght we can signal using 8 bits. */
-    if( MinBytes > usefulstr_len + 255 ) {
-      MinBytes = usefulstr_len + 255;
-    }
-
-    /* Save data for creation of multiple bitstreams */
-    if (ISACenc_obj->SaveEnc_ptr != NULL) {
-      (ISACenc_obj->SaveEnc_ptr)->minBytes = MinBytes;
-    }
-
-    while (stream_length < MinBytes)
-    {
-      RTC_DCHECK_GE(stream_length, 0);
-      if (stream_length & 0x0001){
-        ISACenc_obj->bitstr_seed = WEBRTC_SPL_RAND( ISACenc_obj->bitstr_seed );
-        ISACenc_obj->bitstr_obj.stream[stream_length / 2] |=
-            (uint16_t)(ISACenc_obj->bitstr_seed & 0xFF);
-      } else {
-        ISACenc_obj->bitstr_seed = WEBRTC_SPL_RAND( ISACenc_obj->bitstr_seed );
-        ISACenc_obj->bitstr_obj.stream[stream_length / 2] =
-            ((uint16_t)ISACenc_obj->bitstr_seed << 8);
-      }
-      stream_length++;
-    }
-
-    /* to get the real stream_length, without garbage */
-    if (usefulstr_len & 0x0001) {
-      ISACenc_obj->bitstr_obj.stream[usefulstr_len>>1] &= 0xFF00;
-      ISACenc_obj->bitstr_obj.stream[usefulstr_len>>1] += (MinBytes - usefulstr_len) & 0x00FF;
-    }
-    else {
-      ISACenc_obj->bitstr_obj.stream[usefulstr_len>>1] &= 0x00FF;
-      ISACenc_obj->bitstr_obj.stream[usefulstr_len >> 1] +=
-          ((uint16_t)((MinBytes - usefulstr_len) & 0x00FF) << 8);
-    }
-  }
-  else
-  {
-    /* update rate model */
-    WebRtcIsacfix_UpdateRateModel(&ISACenc_obj->rate_data_obj, (int16_t) stream_length,
-                                  ISACenc_obj->current_framesamples, ISACenc_obj->BottleNeck);
-  }
-  return stream_length;
-}
-
-/* This function is used to create a new bitstream with new BWE.
-   The same data as previously encoded with the fucntion WebRtcIsacfix_EncodeImpl()
-   is used. The data needed is taken from the struct, where it was stored
-   when calling the encoder. */
-int WebRtcIsacfix_EncodeStoredData(IsacFixEncoderInstance  *ISACenc_obj,
-                                   int     BWnumber,
-                                   float              scale)
-{
-  int ii;
-  int status;
-  int16_t BWno = (int16_t)BWnumber;
-  int stream_length = 0;
-
-  int16_t model;
-  const uint16_t *Q_PitchGain_cdf_ptr[1];
-  const uint16_t **cdf;
-  const IsacSaveEncoderData *SaveEnc_str;
-  int32_t tmpLPCcoeffs_g[KLT_ORDER_GAIN<<1];
-  int16_t tmpLPCindex_g[KLT_ORDER_GAIN<<1];
-  int16_t tmp_fre[FRAMESAMPLES];
-  int16_t tmp_fim[FRAMESAMPLES];
-
-  SaveEnc_str = ISACenc_obj->SaveEnc_ptr;
-
-  /* Check if SaveEnc memory exists */
-  if (SaveEnc_str == NULL) {
-    return (-1);
-  }
-
-  /* Sanity Check - possible values for BWnumber is 0 - 23 */
-  if ((BWnumber < 0) || (BWnumber > 23)) {
-    return -ISAC_RANGE_ERROR_BW_ESTIMATOR;
-  }
-
-  /* reset bitstream */
-  ISACenc_obj->bitstr_obj.W_upper = 0xFFFFFFFF;
-  ISACenc_obj->bitstr_obj.streamval = 0;
-  ISACenc_obj->bitstr_obj.stream_index = 0;
-  ISACenc_obj->bitstr_obj.full = 1;
-
-  /* encode frame length */
-  status = WebRtcIsacfix_EncodeFrameLen(SaveEnc_str->framelength, &ISACenc_obj->bitstr_obj);
-  if (status < 0) {
-    /* Wrong frame size */
-    return status;
-  }
-
-  /* encode bandwidth estimate */
-  status = WebRtcIsacfix_EncodeReceiveBandwidth(&BWno, &ISACenc_obj->bitstr_obj);
-  if (status < 0) {
-    return status;
-  }
-
-  /* Transcoding                                                 */
-  /* If scale < 1, rescale data to produce lower bitrate signal  */
-  if ((0.0 < scale) && (scale < 1.0)) {
-    /* Compensate LPC gain */
-    for (ii = 0; ii < (KLT_ORDER_GAIN*(1+SaveEnc_str->startIdx)); ii++) {
-      tmpLPCcoeffs_g[ii] = (int32_t) ((scale) * (float) SaveEnc_str->LPCcoeffs_g[ii]);
-    }
-
-    /* Scale DFT */
-    for (ii = 0; ii < (FRAMESAMPLES_HALF*(1+SaveEnc_str->startIdx)); ii++) {
-      tmp_fre[ii] = (int16_t) ((scale) * (float) SaveEnc_str->fre[ii]) ;
-      tmp_fim[ii] = (int16_t) ((scale) * (float) SaveEnc_str->fim[ii]) ;
-    }
-  } else {
-    for (ii = 0; ii < (KLT_ORDER_GAIN*(1+SaveEnc_str->startIdx)); ii++) {
-      tmpLPCindex_g[ii] =  SaveEnc_str->LPCindex_g[ii];
-    }
-
-    for (ii = 0; ii < (FRAMESAMPLES_HALF*(1+SaveEnc_str->startIdx)); ii++) {
-      tmp_fre[ii] = SaveEnc_str->fre[ii];
-      tmp_fim[ii] = SaveEnc_str->fim[ii];
-    }
-  }
-
-  /* Loop over number of 30 msec */
-  for (ii = 0; ii <= SaveEnc_str->startIdx; ii++)
-  {
-
-    /* encode pitch gains */
-    *Q_PitchGain_cdf_ptr = WebRtcIsacfix_kPitchGainCdf;
-    status = WebRtcIsacfix_EncHistMulti(&ISACenc_obj->bitstr_obj, &SaveEnc_str->pitchGain_index[ii],
-                                       Q_PitchGain_cdf_ptr, 1);
-    if (status < 0) {
-      return status;
-    }
-
-    /* entropy coding of quantization pitch lags */
-    /* voicing classificiation */
-    if (SaveEnc_str->meanGain[ii] <= 819) {
-      cdf = WebRtcIsacfix_kPitchLagPtrLo;
-    } else if (SaveEnc_str->meanGain[ii] <= 1638) {
-      cdf = WebRtcIsacfix_kPitchLagPtrMid;
-    } else {
-      cdf = WebRtcIsacfix_kPitchLagPtrHi;
-    }
-    status = WebRtcIsacfix_EncHistMulti(&ISACenc_obj->bitstr_obj,
-                                       &SaveEnc_str->pitchIndex[PITCH_SUBFRAMES*ii], cdf, PITCH_SUBFRAMES);
-    if (status < 0) {
-      return status;
-    }
-
-    /* LPC */
-    /* entropy coding of model number */
-    model = 0;
-    status = WebRtcIsacfix_EncHistMulti(&ISACenc_obj->bitstr_obj,  &model,
-                                       WebRtcIsacfix_kModelCdfPtr, 1);
-    if (status < 0) {
-      return status;
-    }
-
-    /* entropy coding of quantization indices - LPC shape only */
-    status = WebRtcIsacfix_EncHistMulti(&ISACenc_obj->bitstr_obj, &SaveEnc_str->LPCindex_s[KLT_ORDER_SHAPE*ii],
-                                       WebRtcIsacfix_kCdfShapePtr[0], KLT_ORDER_SHAPE);
-    if (status < 0) {
-      return status;
-    }
-
-    /* If transcoding, get new LPC gain indices */
-    if (scale < 1.0) {
-      WebRtcIsacfix_TranscodeLpcCoef(&tmpLPCcoeffs_g[KLT_ORDER_GAIN*ii], &tmpLPCindex_g[KLT_ORDER_GAIN*ii]);
-    }
-
-    /* entropy coding of quantization indices - LPC gain */
-    status = WebRtcIsacfix_EncHistMulti(&ISACenc_obj->bitstr_obj, &tmpLPCindex_g[KLT_ORDER_GAIN*ii],
-                                       WebRtcIsacfix_kCdfGainPtr[0], KLT_ORDER_GAIN);
-    if (status < 0) {
-      return status;
-    }
-
-    /* quantization and lossless coding */
-    status = WebRtcIsacfix_EncodeSpec(&tmp_fre[ii*FRAMESAMPLES_HALF], &tmp_fim[ii*FRAMESAMPLES_HALF],
-                                      &ISACenc_obj->bitstr_obj, SaveEnc_str->AvgPitchGain[ii]);
-    if (status < 0) {
-      return status;
-    }
-  }
-
-  /* complete arithmetic coding */
-  stream_length = WebRtcIsacfix_EncTerminate(&ISACenc_obj->bitstr_obj);
-
-  return stream_length;
-}
diff --git a/modules/audio_coding/codecs/isac/fix/source/entropy_coding.c b/modules/audio_coding/codecs/isac/fix/source/entropy_coding.c
deleted file mode 100644
index 0a6e26f..0000000
--- a/modules/audio_coding/codecs/isac/fix/source/entropy_coding.c
+++ /dev/null
@@ -1,2056 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/*
- * entropy_coding.c
- *
- * This file contains all functions used to arithmetically
- * encode the iSAC bistream.
- *
- */
-
-#include <stddef.h>
-
-#include "arith_routins.h"
-#include "spectrum_ar_model_tables.h"
-#include "pitch_gain_tables.h"
-#include "pitch_lag_tables.h"
-#include "entropy_coding.h"
-#include "lpc_tables.h"
-#include "settings.h"
-#include "signal_processing_library.h"
-#include "webrtc/rtc_base/sanitizer.h"
-
-/*
- * Eenumerations for arguments to functions WebRtcIsacfix_MatrixProduct1()
- * and WebRtcIsacfix_MatrixProduct2().
-*/
-
-enum matrix_index_factor {
-  kTIndexFactor1 = 1,
-  kTIndexFactor2 = 2,
-  kTIndexFactor3 = SUBFRAMES,
-  kTIndexFactor4 = LPC_SHAPE_ORDER
-};
-
-enum matrix_index_step {
-  kTIndexStep1 = 1,
-  kTIndexStep2 = SUBFRAMES,
-  kTIndexStep3 = LPC_SHAPE_ORDER
-};
-
-enum matrixprod_loop_count {
-  kTLoopCount1 = SUBFRAMES,
-  kTLoopCount2 = 2,
-  kTLoopCount3 = LPC_SHAPE_ORDER
-};
-
-enum matrix1_shift_value {
-  kTMatrix1_shift0 = 0,
-  kTMatrix1_shift1 = 1,
-  kTMatrix1_shift5 = 5
-};
-
-enum matrixprod_init_case {
-  kTInitCase0 = 0,
-  kTInitCase1 = 1
-};
-
-/*
-  This function implements the fix-point correspondant function to lrint.
-
-  FLP: (int32_t)floor(flt+.499999999999)
-  FIP: (fixVal+roundVal)>>qDomain
-
-  where roundVal = 2^(qDomain-1) = 1<<(qDomain-1)
-
-*/
-static __inline int32_t CalcLrIntQ(int32_t fixVal, int16_t qDomain) {
-  return (fixVal + (1 << (qDomain - 1))) >> qDomain;
-}
-
-/*
-  __inline uint32_t stepwise(int32_t dinQ10) {
-
-  int32_t ind, diQ10, dtQ10;
-
-  diQ10 = dinQ10;
-  if (diQ10 < DPMIN_Q10)
-  diQ10 = DPMIN_Q10;
-  if (diQ10 >= DPMAX_Q10)
-  diQ10 = DPMAX_Q10 - 1;
-
-  dtQ10 = diQ10 - DPMIN_Q10;*/ /* Q10 + Q10 = Q10 */
-/* ind = (dtQ10 * 5) >> 10;  */ /* 2^10 / 5 = 0.2 in Q10  */
-/* Q10 -> Q0 */
-
-/* return rpointsFIX_Q10[ind];
-
-   }
-*/
-
-/* logN(x) = logN(2)*log2(x) = 0.6931*log2(x). Output in Q8. */
-/* The input argument X to logN(X) is 2^17 times higher than the
-   input floating point argument Y to log(Y), since the X value
-   is a Q17 value. This can be compensated for after the call, by
-   subraction a value Z for each Q-step. One Q-step means that
-   X gets 2 thimes higher, i.e. Z = logN(2)*256 = 0.693147180559*256 =
-   177.445678 should be subtracted (since logN() returns a Q8 value).
-   For a X value in Q17, the value 177.445678*17 = 3017 should be
-   subtracted */
-static int16_t CalcLogN(int32_t arg) {
-  int16_t zeros, log2, frac, logN;
-
-  zeros=WebRtcSpl_NormU32(arg);
-  frac = (int16_t)((uint32_t)((arg << zeros) & 0x7FFFFFFF) >> 23);
-  log2 = (int16_t)(((31 - zeros) << 8) + frac);  // log2(x) in Q8
-  logN = (int16_t)(log2 * 22713 >> 15);  // log(2) = 0.693147 = 22713 in Q15
-  logN=logN+11; //Scalar compensation which minimizes the (log(x)-logN(x))^2 error over all x.
-
-  return logN;
-}
-
-
-/*
-  expN(x) = 2^(a*x), where a = log2(e) ~= 1.442695
-
-  Input:  Q8  (int16_t)
-  Output: Q17 (int32_t)
-
-  a = log2(e) = log2(exp(1)) ~= 1.442695  ==>  a = 23637 in Q14 (1.442688)
-  To this value, 700 is added or subtracted in order to get an average error
-  nearer zero, instead of always same-sign.
-*/
-
-static int32_t CalcExpN(int16_t x) {
-  int16_t axINT, axFRAC;
-  int16_t exp16;
-  int32_t exp;
-  int16_t ax = (int16_t)(x * 23637 >> 14);  // Q8
-
-  if (x>=0) {
-    axINT = ax >> 8;  //Q0
-    axFRAC = ax&0x00FF;
-    exp16 = 1 << axINT;  // Q0
-    axFRAC = axFRAC+256; //Q8
-    exp = exp16 * axFRAC;  // Q0*Q8 = Q8
-    exp <<= 9;  // Q17
-  } else {
-    ax = -ax;
-    axINT = 1 + (ax >> 8);  //Q0
-    axFRAC = 0x00FF - (ax&0x00FF);
-    exp16 = (int16_t)(32768 >> axINT);  // Q15
-    axFRAC = axFRAC+256; //Q8
-    exp = exp16 * axFRAC;  // Q15*Q8 = Q23
-    exp >>= 6;  // Q17
-  }
-
-  return exp;
-}
-
-
-/* compute correlation from power spectrum */
-static void CalcCorrelation(int32_t *PSpecQ12, int32_t *CorrQ7)
-{
-  int32_t summ[FRAMESAMPLES/8];
-  int32_t diff[FRAMESAMPLES/8];
-  int32_t sum;
-  int k, n;
-
-  for (k = 0; k < FRAMESAMPLES/8; k++) {
-    summ[k] = (PSpecQ12[k] + PSpecQ12[FRAMESAMPLES / 4 - 1 - k] + 16) >> 5;
-    diff[k] = (PSpecQ12[k] - PSpecQ12[FRAMESAMPLES / 4 - 1 - k] + 16) >> 5;
-  }
-
-  sum = 2;
-  for (n = 0; n < FRAMESAMPLES/8; n++)
-    sum += summ[n];
-  CorrQ7[0] = sum;
-
-  for (k = 0; k < AR_ORDER; k += 2) {
-    sum = 0;
-    for (n = 0; n < FRAMESAMPLES/8; n++)
-      sum += (WebRtcIsacfix_kCos[k][n] * diff[n] + 256) >> 9;
-    CorrQ7[k+1] = sum;
-  }
-
-  for (k=1; k<AR_ORDER; k+=2) {
-    sum = 0;
-    for (n = 0; n < FRAMESAMPLES/8; n++)
-      sum += (WebRtcIsacfix_kCos[k][n] * summ[n] + 256) >> 9;
-    CorrQ7[k+1] = sum;
-  }
-}
-
-// Some arithmetic operations that are allowed to overflow. (It's still
-// undefined behavior, so not a good idea; this just makes UBSan ignore the
-// violations, so that our old code can continue to do what it's always been
-// doing.)
-static inline int32_t RTC_NO_SANITIZE("signed-integer-overflow")
-    OverflowingMulS16S32ToS32(int16_t a, int32_t b) {
-  return a * b;
-}
-static inline int32_t RTC_NO_SANITIZE("signed-integer-overflow")
-    OverflowingAddS32S32ToS32(int32_t a, int32_t b) {
-  return a + b;
-}
-static inline int32_t RTC_NO_SANITIZE("signed-integer-overflow")
-    OverflowingSubS32S32ToS32(int32_t a, int32_t b) {
-  return a - b;
-}
-
-/* compute inverse AR power spectrum */
-static void CalcInvArSpec(const int16_t *ARCoefQ12,
-                          const int32_t gainQ10,
-                          int32_t *CurveQ16)
-{
-  int32_t CorrQ11[AR_ORDER+1];
-  int32_t sum, tmpGain;
-  int32_t diffQ16[FRAMESAMPLES/8];
-  const int16_t *CS_ptrQ9;
-  int k, n;
-  int16_t round, shftVal = 0, sh;
-
-  sum = 0;
-  for (n = 0; n < AR_ORDER+1; n++)
-    sum += WEBRTC_SPL_MUL(ARCoefQ12[n], ARCoefQ12[n]);    /* Q24 */
-  sum = ((sum >> 6) * 65 + 32768) >> 16;  /* Result in Q8. */
-  CorrQ11[0] = (sum * gainQ10 + 256) >> 9;
-
-  /* To avoid overflow, we shift down gainQ10 if it is large. We will not lose any precision */
-  if(gainQ10>400000){
-    tmpGain = gainQ10 >> 3;
-    round = 32;
-    shftVal = 6;
-  } else {
-    tmpGain = gainQ10;
-    round = 256;
-    shftVal = 9;
-  }
-
-  for (k = 1; k < AR_ORDER+1; k++) {
-    sum = 16384;
-    for (n = k; n < AR_ORDER+1; n++)
-      sum += WEBRTC_SPL_MUL(ARCoefQ12[n-k], ARCoefQ12[n]);  /* Q24 */
-    sum >>= 15;
-    CorrQ11[k] = (sum * tmpGain + round) >> shftVal;
-  }
-  sum = CorrQ11[0] << 7;
-  for (n = 0; n < FRAMESAMPLES/8; n++)
-    CurveQ16[n] = sum;
-
-  for (k = 1; k < AR_ORDER; k += 2) {
-    for (n = 0; n < FRAMESAMPLES/8; n++)
-      CurveQ16[n] +=
-          (OverflowingMulS16S32ToS32(WebRtcIsacfix_kCos[k][n], CorrQ11[k + 1]) +
-           2) >>
-          2;
-  }
-
-  CS_ptrQ9 = WebRtcIsacfix_kCos[0];
-
-  /* If CorrQ11[1] too large we avoid getting overflow in the calculation by shifting */
-  sh=WebRtcSpl_NormW32(CorrQ11[1]);
-  if (CorrQ11[1]==0) /* Use next correlation */
-    sh=WebRtcSpl_NormW32(CorrQ11[2]);
-
-  if (sh<9)
-    shftVal = 9 - sh;
-  else
-    shftVal = 0;
-
-  for (n = 0; n < FRAMESAMPLES/8; n++)
-    diffQ16[n] = (CS_ptrQ9[n] * (CorrQ11[1] >> shftVal) + 2) >> 2;
-  for (k = 2; k < AR_ORDER; k += 2) {
-    CS_ptrQ9 = WebRtcIsacfix_kCos[k];
-    for (n = 0; n < FRAMESAMPLES/8; n++)
-      diffQ16[n] += (CS_ptrQ9[n] * (CorrQ11[k + 1] >> shftVal) + 2) >> 2;
-  }
-
-  for (k=0; k<FRAMESAMPLES/8; k++) {
-    int32_t diff_q16 = diffQ16[k] * (1 << shftVal);
-    CurveQ16[FRAMESAMPLES / 4 - 1 - k] =
-        OverflowingSubS32S32ToS32(CurveQ16[k], diff_q16);
-    CurveQ16[k] = OverflowingAddS32S32ToS32(CurveQ16[k], diff_q16);
-  }
-}
-
-static void CalcRootInvArSpec(const int16_t *ARCoefQ12,
-                              const int32_t gainQ10,
-                              uint16_t *CurveQ8)
-{
-  int32_t CorrQ11[AR_ORDER+1];
-  int32_t sum, tmpGain;
-  int32_t summQ16[FRAMESAMPLES/8];
-  int32_t diffQ16[FRAMESAMPLES/8];
-
-  const int16_t *CS_ptrQ9;
-  int k, n, i;
-  int16_t round, shftVal = 0, sh;
-  int32_t res, in_sqrt, newRes;
-
-  sum = 0;
-  for (n = 0; n < AR_ORDER+1; n++)
-    sum += WEBRTC_SPL_MUL(ARCoefQ12[n], ARCoefQ12[n]);    /* Q24 */
-  sum = ((sum >> 6) * 65 + 32768) >> 16;  /* Result in Q8. */
-  CorrQ11[0] = (sum * gainQ10 + 256) >> 9;
-
-  /* To avoid overflow, we shift down gainQ10 if it is large. We will not lose any precision */
-  if(gainQ10>400000){
-    tmpGain = gainQ10 >> 3;
-    round = 32;
-    shftVal = 6;
-  } else {
-    tmpGain = gainQ10;
-    round = 256;
-    shftVal = 9;
-  }
-
-  for (k = 1; k < AR_ORDER+1; k++) {
-    sum = 16384;
-    for (n = k; n < AR_ORDER+1; n++)
-      sum += WEBRTC_SPL_MUL(ARCoefQ12[n-k], ARCoefQ12[n]);  /* Q24 */
-    sum >>= 15;
-    CorrQ11[k] = (sum * tmpGain + round) >> shftVal;
-  }
-  sum = CorrQ11[0] << 7;
-  for (n = 0; n < FRAMESAMPLES/8; n++)
-    summQ16[n] = sum;
-
-  for (k = 1; k < (AR_ORDER); k += 2) {
-    for (n = 0; n < FRAMESAMPLES/8; n++)
-      summQ16[n] += ((CorrQ11[k + 1] * WebRtcIsacfix_kCos[k][n]) + 2) >> 2;
-  }
-
-  CS_ptrQ9 = WebRtcIsacfix_kCos[0];
-
-  /* If CorrQ11[1] too large we avoid getting overflow in the calculation by shifting */
-  sh=WebRtcSpl_NormW32(CorrQ11[1]);
-  if (CorrQ11[1]==0) /* Use next correlation */
-    sh=WebRtcSpl_NormW32(CorrQ11[2]);
-
-  if (sh<9)
-    shftVal = 9 - sh;
-  else
-    shftVal = 0;
-
-  for (n = 0; n < FRAMESAMPLES/8; n++)
-    diffQ16[n] = (CS_ptrQ9[n] * (CorrQ11[1] >> shftVal) + 2) >> 2;
-  for (k = 2; k < AR_ORDER; k += 2) {
-    CS_ptrQ9 = WebRtcIsacfix_kCos[k];
-    for (n = 0; n < FRAMESAMPLES/8; n++)
-      diffQ16[n] += (CS_ptrQ9[n] * (CorrQ11[k + 1] >> shftVal) + 2) >> 2;
-  }
-
-  in_sqrt = summQ16[0] + (diffQ16[0] << shftVal);
-
-  /* convert to magnitude spectrum, by doing square-roots (modified from SPLIB)  */
-  res = 1 << (WebRtcSpl_GetSizeInBits(in_sqrt) >> 1);
-
-  for (k = 0; k < FRAMESAMPLES/8; k++)
-  {
-    in_sqrt = summQ16[k] + (diffQ16[k] << shftVal);
-    i = 10;
-
-    /* make in_sqrt positive to prohibit sqrt of negative values */
-    if(in_sqrt<0)
-      in_sqrt=-in_sqrt;
-
-    newRes = (in_sqrt / res + res) >> 1;
-    do
-    {
-      res = newRes;
-      newRes = (in_sqrt / res + res) >> 1;
-    } while (newRes != res && i-- > 0);
-
-    CurveQ8[k] = (int16_t)newRes;
-  }
-  for (k = FRAMESAMPLES/8; k < FRAMESAMPLES/4; k++) {
-
-    in_sqrt = summQ16[FRAMESAMPLES / 4 - 1 - k] -
-        (diffQ16[FRAMESAMPLES / 4 - 1 - k] << shftVal);
-    i = 10;
-
-    /* make in_sqrt positive to prohibit sqrt of negative values */
-    if(in_sqrt<0)
-      in_sqrt=-in_sqrt;
-
-    newRes = (in_sqrt / res + res) >> 1;
-    do
-    {
-      res = newRes;
-      newRes = (in_sqrt / res + res) >> 1;
-    } while (newRes != res && i-- > 0);
-
-    CurveQ8[k] = (int16_t)newRes;
-  }
-
-}
-
-
-
-/* generate array of dither samples in Q7 */
-static void GenerateDitherQ7(int16_t *bufQ7,
-                             uint32_t seed,
-                             int16_t length,
-                             int16_t AvgPitchGain_Q12)
-{
-  int   k;
-  int16_t dither1_Q7, dither2_Q7, dither_gain_Q14, shft;
-
-  if (AvgPitchGain_Q12 < 614)  /* this threshold should be equal to that in decode_spec() */
-  {
-    for (k = 0; k < length-2; k += 3)
-    {
-      /* new random unsigned int32_t */
-      seed = WEBRTC_SPL_UMUL(seed, 196314165) + 907633515;
-
-      /* fixed-point dither sample between -64 and 64 (Q7) */
-      dither1_Q7 = (int16_t)(((int32_t)(seed + 16777216)) >> 25);
-
-      /* new random unsigned int32_t */
-      seed = WEBRTC_SPL_UMUL(seed, 196314165) + 907633515;
-
-      /* fixed-point dither sample between -64 and 64 */
-      dither2_Q7 = (int16_t)(((int32_t)(seed + 16777216)) >> 25);
-
-      shft = (int16_t)(WEBRTC_SPL_RSHIFT_U32(seed, 25) & 15);
-      if (shft < 5)
-      {
-        bufQ7[k]   = dither1_Q7;
-        bufQ7[k+1] = dither2_Q7;
-        bufQ7[k+2] = 0;
-      }
-      else if (shft < 10)
-      {
-        bufQ7[k]   = dither1_Q7;
-        bufQ7[k+1] = 0;
-        bufQ7[k+2] = dither2_Q7;
-      }
-      else
-      {
-        bufQ7[k]   = 0;
-        bufQ7[k+1] = dither1_Q7;
-        bufQ7[k+2] = dither2_Q7;
-      }
-    }
-  }
-  else
-  {
-    dither_gain_Q14 = (int16_t)(22528 - WEBRTC_SPL_MUL(10, AvgPitchGain_Q12));
-
-    /* dither on half of the coefficients */
-    for (k = 0; k < length-1; k += 2)
-    {
-      /* new random unsigned int32_t */
-      seed = WEBRTC_SPL_UMUL(seed, 196314165) + 907633515;
-
-      /* fixed-point dither sample between -64 and 64 */
-      dither1_Q7 = (int16_t)(((int32_t)(seed + 16777216)) >> 25);
-
-      /* dither sample is placed in either even or odd index */
-      shft = (int16_t)(WEBRTC_SPL_RSHIFT_U32(seed, 25) & 1);     /* either 0 or 1 */
-
-      bufQ7[k + shft] = (int16_t)((dither_gain_Q14 * dither1_Q7 + 8192) >> 14);
-      bufQ7[k + 1 - shft] = 0;
-    }
-  }
-}
-
-
-
-
-/*
- * function to decode the complex spectrum from the bitstream
- * returns the total number of bytes in the stream
- */
-int WebRtcIsacfix_DecodeSpec(Bitstr_dec *streamdata,
-                             int16_t *frQ7,
-                             int16_t *fiQ7,
-                             int16_t AvgPitchGain_Q12)
-{
-  int16_t  data[FRAMESAMPLES];
-  int32_t  invARSpec2_Q16[FRAMESAMPLES/4];
-  int16_t  ARCoefQ12[AR_ORDER+1];
-  int16_t  RCQ15[AR_ORDER];
-  int16_t  gainQ10;
-  int32_t  gain2_Q10;
-  int len;
-  int          k;
-
-  /* create dither signal */
-  GenerateDitherQ7(data, streamdata->W_upper, FRAMESAMPLES, AvgPitchGain_Q12); /* Dither is output in vector 'Data' */
-
-  /* decode model parameters */
-  if (WebRtcIsacfix_DecodeRcCoef(streamdata, RCQ15) < 0)
-    return -ISAC_RANGE_ERROR_DECODE_SPECTRUM;
-
-
-  WebRtcSpl_ReflCoefToLpc(RCQ15, AR_ORDER, ARCoefQ12);
-
-  if (WebRtcIsacfix_DecodeGain2(streamdata, &gain2_Q10) < 0)
-    return -ISAC_RANGE_ERROR_DECODE_SPECTRUM;
-
-  /* compute inverse AR power spectrum */
-  CalcInvArSpec(ARCoefQ12, gain2_Q10, invARSpec2_Q16);
-
-  /* arithmetic decoding of spectrum */
-  /* 'data' input and output. Input = Dither */
-  len = WebRtcIsacfix_DecLogisticMulti2(data, streamdata, invARSpec2_Q16, (int16_t)FRAMESAMPLES);
-
-  if (len<1)
-    return -ISAC_RANGE_ERROR_DECODE_SPECTRUM;
-
-  /* subtract dither and scale down spectral samples with low SNR */
-  if (AvgPitchGain_Q12 <= 614)
-  {
-    for (k = 0; k < FRAMESAMPLES; k += 4)
-    {
-      gainQ10 = WebRtcSpl_DivW32W16ResW16(30 << 10,
-          (int16_t)((uint32_t)(invARSpec2_Q16[k >> 2] + 2195456) >> 16));
-      *frQ7++ = (int16_t)((data[k] * gainQ10 + 512) >> 10);
-      *fiQ7++ = (int16_t)((data[k + 1] * gainQ10 + 512) >> 10);
-      *frQ7++ = (int16_t)((data[k + 2] * gainQ10 + 512) >> 10);
-      *fiQ7++ = (int16_t)((data[k + 3] * gainQ10 + 512) >> 10);
-    }
-  }
-  else
-  {
-    for (k = 0; k < FRAMESAMPLES; k += 4)
-    {
-      gainQ10 = WebRtcSpl_DivW32W16ResW16(36 << 10,
-          (int16_t)((uint32_t)(invARSpec2_Q16[k >> 2] + 2654208) >> 16));
-      *frQ7++ = (int16_t)((data[k] * gainQ10 + 512) >> 10);
-      *fiQ7++ = (int16_t)((data[k + 1] * gainQ10 + 512) >> 10);
-      *frQ7++ = (int16_t)((data[k + 2] * gainQ10 + 512) >> 10);
-      *fiQ7++ = (int16_t)((data[k + 3] * gainQ10 + 512) >> 10);
-    }
-  }
-
-  return len;
-}
-
-
-int WebRtcIsacfix_EncodeSpec(const int16_t *fr,
-                             const int16_t *fi,
-                             Bitstr_enc *streamdata,
-                             int16_t AvgPitchGain_Q12)
-{
-  int16_t  dataQ7[FRAMESAMPLES];
-  int32_t  PSpec[FRAMESAMPLES/4];
-  uint16_t invARSpecQ8[FRAMESAMPLES/4];
-  int32_t  CorrQ7[AR_ORDER+1];
-  int32_t  CorrQ7_norm[AR_ORDER+1];
-  int16_t  RCQ15[AR_ORDER];
-  int16_t  ARCoefQ12[AR_ORDER+1];
-  int32_t  gain2_Q10;
-  int16_t  val;
-  int32_t  nrg;
-  uint32_t sum;
-  int16_t  lft_shft;
-  int16_t  status;
-  int          k, n, j;
-
-
-  /* create dither_float signal */
-  GenerateDitherQ7(dataQ7, streamdata->W_upper, FRAMESAMPLES, AvgPitchGain_Q12);
-
-  /* add dither and quantize, and compute power spectrum */
-  /* Vector dataQ7 contains Dither in Q7 */
-  for (k = 0; k < FRAMESAMPLES; k += 4)
-  {
-    val = ((*fr++ + dataQ7[k]   + 64) & 0xFF80) - dataQ7[k]; /* Data = Dither */
-    dataQ7[k] = val;            /* New value in Data */
-    sum = WEBRTC_SPL_UMUL(val, val);
-
-    val = ((*fi++ + dataQ7[k+1] + 64) & 0xFF80) - dataQ7[k+1]; /* Data = Dither */
-    dataQ7[k+1] = val;            /* New value in Data */
-    sum += WEBRTC_SPL_UMUL(val, val);
-
-    val = ((*fr++ + dataQ7[k+2] + 64) & 0xFF80) - dataQ7[k+2]; /* Data = Dither */
-    dataQ7[k+2] = val;            /* New value in Data */
-    sum += WEBRTC_SPL_UMUL(val, val);
-
-    val = ((*fi++ + dataQ7[k+3] + 64) & 0xFF80) - dataQ7[k+3]; /* Data = Dither */
-    dataQ7[k+3] = val;            /* New value in Data */
-    sum += WEBRTC_SPL_UMUL(val, val);
-
-    PSpec[k>>2] = WEBRTC_SPL_RSHIFT_U32(sum, 2);
-  }
-
-  /* compute correlation from power spectrum */
-  CalcCorrelation(PSpec, CorrQ7);
-
-
-  /* find AR coefficients */
-  /* number of bit shifts to 14-bit normalize CorrQ7[0] (leaving room for sign) */
-  lft_shft = WebRtcSpl_NormW32(CorrQ7[0]) - 18;
-
-  if (lft_shft > 0) {
-    for (k=0; k<AR_ORDER+1; k++)
-      CorrQ7_norm[k] = CorrQ7[k] << lft_shft;
-  } else {
-    for (k=0; k<AR_ORDER+1; k++)
-      CorrQ7_norm[k] = CorrQ7[k] >> -lft_shft;
-  }
-
-  /* find RC coefficients */
-  WebRtcSpl_AutoCorrToReflCoef(CorrQ7_norm, AR_ORDER, RCQ15);
-
-  /* quantize & code RC Coef */
-  status = WebRtcIsacfix_EncodeRcCoef(RCQ15, streamdata);
-  if (status < 0) {
-    return status;
-  }
-
-  /* RC -> AR coefficients */
-  WebRtcSpl_ReflCoefToLpc(RCQ15, AR_ORDER, ARCoefQ12);
-
-  /* compute ARCoef' * Corr * ARCoef in Q19 */
-  nrg = 0;
-  for (j = 0; j <= AR_ORDER; j++) {
-    for (n = 0; n <= j; n++)
-      nrg += (ARCoefQ12[j] * ((CorrQ7_norm[j - n] * ARCoefQ12[n] + 256) >> 9) +
-          4) >> 3;
-    for (n = j+1; n <= AR_ORDER; n++)
-      nrg += (ARCoefQ12[j] * ((CorrQ7_norm[n - j] * ARCoefQ12[n] + 256) >> 9) +
-          4) >> 3;
-  }
-
-  if (lft_shft > 0)
-    nrg >>= lft_shft;
-  else
-    nrg <<= -lft_shft;
-
-  if(nrg>131072)
-    gain2_Q10 = WebRtcSpl_DivResultInQ31(FRAMESAMPLES >> 2, nrg);  /* also shifts 31 bits to the left! */
-  else
-    gain2_Q10 = FRAMESAMPLES >> 2;
-
-  /* quantize & code gain2_Q10 */
-  if (WebRtcIsacfix_EncodeGain2(&gain2_Q10, streamdata))
-    return -1;
-
-  /* compute inverse AR magnitude spectrum */
-  CalcRootInvArSpec(ARCoefQ12, gain2_Q10, invARSpecQ8);
-
-
-  /* arithmetic coding of spectrum */
-  status = WebRtcIsacfix_EncLogisticMulti2(streamdata, dataQ7, invARSpecQ8, (int16_t)FRAMESAMPLES);
-  if ( status )
-    return( status );
-
-  return 0;
-}
-
-
-/* Matlab's LAR definition */
-static void Rc2LarFix(const int16_t *rcQ15, int32_t *larQ17, int16_t order) {
-
-  /*
-
-    This is a piece-wise implemenetation of a rc2lar-function (all values in the comment
-    are Q15 values and  are based on [0 24956/32768 30000/32768 32500/32768], i.e.
-    [0.76159667968750   0.91552734375000   0.99182128906250]
-
-    x0  x1           a                 k              x0(again)         b
-    ==================================================================================
-    0.00 0.76:   0                  2.625997508581   0                  0
-    0.76 0.91:   2.000012018559     7.284502668663   0.761596679688    -3.547841027073
-    0.91 0.99:   3.121320351712    31.115835041229   0.915527343750   -25.366077452148
-    0.99 1.00:   5.495270168700   686.663805654056   0.991821289063  -675.552510708011
-
-    The implementation is y(x)= a + (x-x0)*k, but this can be simplified to
-
-    y(x) = a-x0*k + x*k = b + x*k, where b = a-x0*k
-
-    akx=[0                 2.625997508581   0
-    2.000012018559     7.284502668663   0.761596679688
-    3.121320351712    31.115835041229   0.915527343750
-    5.495270168700   686.663805654056   0.991821289063];
-
-    b = akx(:,1) - akx(:,3).*akx(:,2)
-
-    [ 0.0
-    -3.547841027073
-    -25.366077452148
-    -675.552510708011]
-
-  */
-
-  int k;
-  int16_t rc;
-  int32_t larAbsQ17;
-
-  for (k = 0; k < order; k++) {
-
-    rc = WEBRTC_SPL_ABS_W16(rcQ15[k]); //Q15
-
-    /* Calculate larAbsQ17 in Q17 from rc in Q15 */
-
-    if (rc<24956) {  //0.7615966 in Q15
-      // (Q15*Q13)>>11 = Q17
-      larAbsQ17 = rc * 21512 >> 11;
-    } else if (rc<30000) { //0.91552734375 in Q15
-      // Q17 + (Q15*Q12)>>10 = Q17
-      larAbsQ17 = -465024 + (rc * 29837 >> 10);
-    } else if (rc<32500) { //0.99182128906250 in Q15
-      // Q17 + (Q15*Q10)>>8 = Q17
-      larAbsQ17 = -3324784 + (rc * 31863 >> 8);
-    } else  {
-      // Q17 + (Q15*Q5)>>3 = Q17
-      larAbsQ17 = -88546020 + (rc * 21973 >> 3);
-    }
-
-    if (rcQ15[k]>0) {
-      larQ17[k] = larAbsQ17;
-    } else {
-      larQ17[k] = -larAbsQ17;
-    }
-  }
-}
-
-
-static void Lar2RcFix(const int32_t *larQ17, int16_t *rcQ15,  int16_t order) {
-
-  /*
-    This is a piece-wise implemenetation of a lar2rc-function
-    See comment in Rc2LarFix() about details.
-  */
-
-  int k;
-  int16_t larAbsQ11;
-  int32_t rc;
-
-  for (k = 0; k < order; k++) {
-
-    larAbsQ11 = (int16_t)WEBRTC_SPL_ABS_W32((larQ17[k] + 32) >> 6);  // Q11
-
-    if (larAbsQ11<4097) { //2.000012018559 in Q11
-      // Q11*Q16>>12 = Q15
-      rc = larAbsQ11 * 24957 >> 12;
-    } else if (larAbsQ11<6393) { //3.121320351712 in Q11
-      // (Q11*Q17 + Q13)>>13 = Q15
-      rc = (larAbsQ11 * 17993 + 130738688) >> 13;
-    } else if (larAbsQ11<11255) { //5.495270168700 in Q11
-      // (Q11*Q19 + Q30)>>15 = Q15
-      rc = (larAbsQ11 * 16850 + 875329820) >> 15;
-    } else  {
-      // (Q11*Q24>>16 + Q19)>>4 = Q15
-      rc = (((larAbsQ11 * 24433) >> 16) + 515804) >> 4;
-    }
-
-    if (larQ17[k]<=0) {
-      rc = -rc;
-    }
-
-    rcQ15[k] = (int16_t) rc;  // Q15
-  }
-}
-
-static void Poly2LarFix(int16_t *lowbandQ15,
-                        int16_t orderLo,
-                        int16_t *hibandQ15,
-                        int16_t orderHi,
-                        int16_t Nsub,
-                        int32_t *larsQ17) {
-
-  int k, n;
-  int32_t *outpQ17;
-  int16_t orderTot;
-  int32_t larQ17[MAX_ORDER];   // Size 7+6 is enough
-
-  orderTot = (orderLo + orderHi);
-  outpQ17 = larsQ17;
-  for (k = 0; k < Nsub; k++) {
-
-    Rc2LarFix(lowbandQ15, larQ17, orderLo);
-
-    for (n = 0; n < orderLo; n++)
-      outpQ17[n] = larQ17[n]; //Q17
-
-    Rc2LarFix(hibandQ15, larQ17, orderHi);
-
-    for (n = 0; n < orderHi; n++)
-      outpQ17[n + orderLo] = larQ17[n]; //Q17;
-
-    outpQ17 += orderTot;
-    lowbandQ15 += orderLo;
-    hibandQ15 += orderHi;
-  }
-}
-
-
-static void Lar2polyFix(int32_t *larsQ17,
-                        int16_t *lowbandQ15,
-                        int16_t orderLo,
-                        int16_t *hibandQ15,
-                        int16_t orderHi,
-                        int16_t Nsub) {
-
-  int k, n;
-  int16_t orderTot;
-  int16_t *outplQ15, *outphQ15;
-  int32_t *inpQ17;
-  int16_t rcQ15[7+6];
-
-  orderTot = (orderLo + orderHi);
-  outplQ15 = lowbandQ15;
-  outphQ15 = hibandQ15;
-  inpQ17 = larsQ17;
-  for (k = 0; k < Nsub; k++) {
-
-    /* gains not handled here as in the FLP version */
-
-    /* Low band */
-    Lar2RcFix(&inpQ17[0], rcQ15, orderLo);
-    for (n = 0; n < orderLo; n++)
-      outplQ15[n] = rcQ15[n]; // Refl. coeffs
-
-    /* High band */
-    Lar2RcFix(&inpQ17[orderLo], rcQ15, orderHi);
-    for (n = 0; n < orderHi; n++)
-      outphQ15[n] = rcQ15[n]; // Refl. coeffs
-
-    inpQ17 += orderTot;
-    outplQ15 += orderLo;
-    outphQ15 += orderHi;
-  }
-}
-
-/*
-Function WebRtcIsacfix_MatrixProduct1C() does one form of matrix multiplication.
-It first shifts input data of one matrix, determines the right indexes for the
-two matrixes, multiply them, and write the results into an output buffer.
-
-Note that two factors (or, multipliers) determine the initialization values of
-the variable |matrix1_index| in the code. The relationship is
-|matrix1_index| = |matrix1_index_factor1| * |matrix1_index_factor2|, where
-|matrix1_index_factor1| is given by the argument while |matrix1_index_factor2|
-is determined by the value of argument |matrix1_index_init_case|;
-|matrix1_index_factor2| is the value of the outmost loop counter j (when
-|matrix1_index_init_case| is 0), or the value of the middle loop counter k (when
-|matrix1_index_init_case| is non-zero).
-
-|matrix0_index| is determined the same way.
-
-Arguments:
-  matrix0[]:                 matrix0 data in Q15 domain.
-  matrix1[]:                 matrix1 data.
-  matrix_product[]:          output data (matrix product).
-  matrix1_index_factor1:     The first of two factors determining the
-                             initialization value of matrix1_index.
-  matrix0_index_factor1:     The first of two factors determining the
-                             initialization value of matrix0_index.
-  matrix1_index_init_case:   Case number for selecting the second of two
-                             factors determining the initialization value
-                             of matrix1_index and matrix0_index.
-  matrix1_index_step:        Incremental step for matrix1_index.
-  matrix0_index_step:        Incremental step for matrix0_index.
-  inner_loop_count:          Maximum count of the inner loop.
-  mid_loop_count:            Maximum count of the intermediate loop.
-  shift:                     Left shift value for matrix1.
-*/
-void WebRtcIsacfix_MatrixProduct1C(const int16_t matrix0[],
-                                   const int32_t matrix1[],
-                                   int32_t matrix_product[],
-                                   const int matrix1_index_factor1,
-                                   const int matrix0_index_factor1,
-                                   const int matrix1_index_init_case,
-                                   const int matrix1_index_step,
-                                   const int matrix0_index_step,
-                                   const int inner_loop_count,
-                                   const int mid_loop_count,
-                                   const int shift) {
-  int j = 0, k = 0, n = 0;
-  int matrix0_index = 0, matrix1_index = 0, matrix_prod_index = 0;
-  int* matrix0_index_factor2 = &k;
-  int* matrix1_index_factor2 = &j;
-  if (matrix1_index_init_case != 0) {
-    matrix0_index_factor2 = &j;
-    matrix1_index_factor2 = &k;
-  }
-
-  for (j = 0; j < SUBFRAMES; j++) {
-    matrix_prod_index = mid_loop_count * j;
-    for (k = 0; k < mid_loop_count; k++) {
-      int32_t sum32 = 0;
-      matrix0_index = matrix0_index_factor1 * (*matrix0_index_factor2);
-      matrix1_index = matrix1_index_factor1 * (*matrix1_index_factor2);
-      for (n = 0; n < inner_loop_count; n++) {
-        sum32 += WEBRTC_SPL_MUL_16_32_RSFT16(
-            matrix0[matrix0_index], matrix1[matrix1_index] * (1 << shift));
-        matrix0_index += matrix0_index_step;
-        matrix1_index += matrix1_index_step;
-      }
-      matrix_product[matrix_prod_index] = sum32;
-      matrix_prod_index++;
-    }
-  }
-}
-
-/*
-Function WebRtcIsacfix_MatrixProduct2C() returns the product of two matrixes,
-one of which has two columns. It first has to determine the correct index of
-the first matrix before doing the actual element multiplication.
-
-Arguments:
-  matrix0[]:                 A matrix in Q15 domain.
-  matrix1[]:                 A matrix in Q21 domain.
-  matrix_product[]:          Output data in Q17 domain.
-  matrix0_index_factor:      A factor determining the initialization value
-                             of matrix0_index.
-  matrix0_index_step:        Incremental step for matrix0_index.
-*/
-void WebRtcIsacfix_MatrixProduct2C(const int16_t matrix0[],
-                                   const int32_t matrix1[],
-                                   int32_t matrix_product[],
-                                   const int matrix0_index_factor,
-                                   const int matrix0_index_step) {
-  int j = 0, n = 0;
-  int matrix1_index = 0, matrix0_index = 0, matrix_prod_index = 0;
-  for (j = 0; j < SUBFRAMES; j++) {
-    int32_t sum32 = 0, sum32_2 = 0;
-    matrix1_index = 0;
-    matrix0_index = matrix0_index_factor * j;
-    for (n = SUBFRAMES; n > 0; n--) {
-      sum32 += (WEBRTC_SPL_MUL_16_32_RSFT16(matrix0[matrix0_index],
-                                            matrix1[matrix1_index]));
-      sum32_2 += (WEBRTC_SPL_MUL_16_32_RSFT16(matrix0[matrix0_index],
-                                            matrix1[matrix1_index + 1]));
-      matrix1_index += 2;
-      matrix0_index += matrix0_index_step;
-    }
-    matrix_product[matrix_prod_index] = sum32 >> 3;
-    matrix_product[matrix_prod_index + 1] = sum32_2 >> 3;
-    matrix_prod_index += 2;
-  }
-}
-
-int WebRtcIsacfix_DecodeLpc(int32_t *gain_lo_hiQ17,
-                            int16_t *LPCCoef_loQ15,
-                            int16_t *LPCCoef_hiQ15,
-                            Bitstr_dec *streamdata,
-                            int16_t *outmodel) {
-
-  int32_t larsQ17[KLT_ORDER_SHAPE]; // KLT_ORDER_GAIN+KLT_ORDER_SHAPE == (ORDERLO+ORDERHI)*SUBFRAMES
-  int err;
-
-  err = WebRtcIsacfix_DecodeLpcCoef(streamdata, larsQ17, gain_lo_hiQ17, outmodel);
-  if (err<0)  // error check
-    return -ISAC_RANGE_ERROR_DECODE_LPC;
-
-  Lar2polyFix(larsQ17, LPCCoef_loQ15, ORDERLO, LPCCoef_hiQ15, ORDERHI, SUBFRAMES);
-
-  return 0;
-}
-
-/* decode & dequantize LPC Coef */
-int WebRtcIsacfix_DecodeLpcCoef(Bitstr_dec *streamdata,
-                                int32_t *LPCCoefQ17,
-                                int32_t *gain_lo_hiQ17,
-                                int16_t *outmodel)
-{
-  int j, k, n;
-  int err;
-  int16_t pos, pos2, posg, poss;
-  int16_t gainpos;
-  int16_t model;
-  int16_t index_QQ[KLT_ORDER_SHAPE];
-  int32_t tmpcoeffs_gQ17[KLT_ORDER_GAIN];
-  int32_t tmpcoeffs2_gQ21[KLT_ORDER_GAIN];
-  int16_t tmpcoeffs_sQ10[KLT_ORDER_SHAPE];
-  int32_t tmpcoeffs_sQ17[KLT_ORDER_SHAPE];
-  int32_t tmpcoeffs2_sQ18[KLT_ORDER_SHAPE];
-  int32_t sumQQ;
-  int16_t sumQQ16;
-  int32_t tmp32;
-
-
-
-  /* entropy decoding of model number */
-  err = WebRtcIsacfix_DecHistOneStepMulti(&model, streamdata, WebRtcIsacfix_kModelCdfPtr, WebRtcIsacfix_kModelInitIndex, 1);
-  if (err<0)  // error check
-    return err;
-
-  /* entropy decoding of quantization indices */
-  err = WebRtcIsacfix_DecHistOneStepMulti(index_QQ, streamdata, WebRtcIsacfix_kCdfShapePtr[model], WebRtcIsacfix_kInitIndexShape[model], KLT_ORDER_SHAPE);
-  if (err<0)  // error check
-    return err;
-  /* find quantization levels for coefficients */
-  for (k=0; k<KLT_ORDER_SHAPE; k++) {
-    tmpcoeffs_sQ10[WebRtcIsacfix_kSelIndShape[k]] = WebRtcIsacfix_kLevelsShapeQ10[WebRtcIsacfix_kOfLevelsShape[model]+WebRtcIsacfix_kOffsetShape[model][k] + index_QQ[k]];
-  }
-
-  err = WebRtcIsacfix_DecHistOneStepMulti(index_QQ, streamdata, WebRtcIsacfix_kCdfGainPtr[model], WebRtcIsacfix_kInitIndexGain[model], KLT_ORDER_GAIN);
-  if (err<0)  // error check
-    return err;
-  /* find quantization levels for coefficients */
-  for (k=0; k<KLT_ORDER_GAIN; k++) {
-    tmpcoeffs_gQ17[WebRtcIsacfix_kSelIndGain[k]] = WebRtcIsacfix_kLevelsGainQ17[WebRtcIsacfix_kOfLevelsGain[model]+ WebRtcIsacfix_kOffsetGain[model][k] + index_QQ[k]];
-  }
-
-
-  /* inverse KLT  */
-
-  /* left transform */  // Transpose matrix!
-  WebRtcIsacfix_MatrixProduct1(WebRtcIsacfix_kT1GainQ15[model], tmpcoeffs_gQ17,
-                               tmpcoeffs2_gQ21, kTIndexFactor2, kTIndexFactor2,
-                               kTInitCase0, kTIndexStep1, kTIndexStep1,
-                               kTLoopCount2, kTLoopCount2, kTMatrix1_shift5);
-
-  poss = 0;
-  for (j=0; j<SUBFRAMES; j++) {
-    for (k=0; k<LPC_SHAPE_ORDER; k++) {
-      sumQQ = 0;
-      pos = LPC_SHAPE_ORDER * j;
-      pos2 = LPC_SHAPE_ORDER * k;
-      for (n=0; n<LPC_SHAPE_ORDER; n++) {
-        sumQQ += tmpcoeffs_sQ10[pos] *
-            WebRtcIsacfix_kT1ShapeQ15[model][pos2] >> 7;  // (Q10*Q15)>>7 = Q18
-        pos++;
-        pos2++;
-      }
-      tmpcoeffs2_sQ18[poss] = sumQQ; //Q18
-      poss++;
-    }
-  }
-
-  /* right transform */ // Transpose matrix
-  WebRtcIsacfix_MatrixProduct2(WebRtcIsacfix_kT2GainQ15[0], tmpcoeffs2_gQ21,
-                               tmpcoeffs_gQ17, kTIndexFactor1, kTIndexStep2);
-  WebRtcIsacfix_MatrixProduct1(WebRtcIsacfix_kT2ShapeQ15[model],
-      tmpcoeffs2_sQ18, tmpcoeffs_sQ17, kTIndexFactor1, kTIndexFactor1,
-      kTInitCase1, kTIndexStep3, kTIndexStep2, kTLoopCount1, kTLoopCount3,
-      kTMatrix1_shift0);
-
-  /* scaling, mean addition, and gain restoration */
-  gainpos = 0;
-  posg = 0;poss = 0;pos=0;
-  for (k=0; k<SUBFRAMES; k++) {
-
-    /* log gains */
-    // Divide by 4 and get Q17 to Q8, i.e. shift 2+9.
-    sumQQ16 = (int16_t)(tmpcoeffs_gQ17[posg] >> 11);
-    sumQQ16 += WebRtcIsacfix_kMeansGainQ8[model][posg];
-    sumQQ = CalcExpN(sumQQ16); // Q8 in and Q17 out
-    gain_lo_hiQ17[gainpos] = sumQQ; //Q17
-    gainpos++;
-    posg++;
-
-    // Divide by 4 and get Q17 to Q8, i.e. shift 2+9.
-    sumQQ16 = (int16_t)(tmpcoeffs_gQ17[posg] >> 11);
-    sumQQ16 += WebRtcIsacfix_kMeansGainQ8[model][posg];
-    sumQQ = CalcExpN(sumQQ16); // Q8 in and Q17 out
-    gain_lo_hiQ17[gainpos] = sumQQ; //Q17
-    gainpos++;
-    posg++;
-
-    /* lo band LAR coeffs */
-    for (n=0; n<ORDERLO; n++, pos++, poss++) {
-      tmp32 = WEBRTC_SPL_MUL_16_32_RSFT16(31208, tmpcoeffs_sQ17[poss]); // (Q16*Q17)>>16 = Q17, with 1/2.1 = 0.47619047619 ~= 31208 in Q16
-      tmp32 = tmp32 + WebRtcIsacfix_kMeansShapeQ17[model][poss]; // Q17+Q17 = Q17
-      LPCCoefQ17[pos] = tmp32;
-    }
-
-    /* hi band LAR coeffs */
-    for (n=0; n<ORDERHI; n++, pos++, poss++) {
-      // ((Q13*Q17)>>16)<<3 = Q17, with 1/0.45 = 2.222222222222 ~= 18204 in Q13
-      tmp32 =
-          WEBRTC_SPL_MUL_16_32_RSFT16(18204, tmpcoeffs_sQ17[poss]) * (1 << 3);
-      tmp32 = tmp32 + WebRtcIsacfix_kMeansShapeQ17[model][poss]; // Q17+Q17 = Q17
-      LPCCoefQ17[pos] = tmp32;
-    }
-  }
-
-
-  *outmodel=model;
-
-  return 0;
-}
-
-/* estimate codel length of LPC Coef */
-static int EstCodeLpcCoef(int32_t *LPCCoefQ17,
-                          int32_t *gain_lo_hiQ17,
-                          int16_t *model,
-                          int32_t *sizeQ11,
-                          Bitstr_enc *streamdata,
-                          IsacSaveEncoderData* encData,
-                          transcode_obj *transcodingParam) {
-  int j, k, n;
-  int16_t posQQ, pos2QQ, gainpos;
-  int16_t  pos, poss, posg, offsg;
-  int16_t index_gQQ[KLT_ORDER_GAIN], index_sQQ[KLT_ORDER_SHAPE];
-  int16_t index_ovr_gQQ[KLT_ORDER_GAIN], index_ovr_sQQ[KLT_ORDER_SHAPE];
-  int32_t BitsQQ;
-
-  int16_t tmpcoeffs_gQ6[KLT_ORDER_GAIN];
-  int32_t tmpcoeffs_gQ17[KLT_ORDER_GAIN];
-  int32_t tmpcoeffs_sQ17[KLT_ORDER_SHAPE];
-  int32_t tmpcoeffs2_gQ21[KLT_ORDER_GAIN];
-  int32_t tmpcoeffs2_sQ17[KLT_ORDER_SHAPE];
-  int32_t sumQQ;
-  int32_t tmp32;
-  int16_t sumQQ16;
-  int status = 0;
-
-  /* write LAR coefficients to statistics file */
-  /* Save data for creation of multiple bitstreams (and transcoding) */
-  if (encData != NULL) {
-    for (k=0; k<KLT_ORDER_GAIN; k++) {
-      encData->LPCcoeffs_g[KLT_ORDER_GAIN*encData->startIdx + k] = gain_lo_hiQ17[k];
-    }
-  }
-
-  /* log gains, mean removal and scaling */
-  posg = 0;poss = 0;pos=0; gainpos=0;
-
-  for (k=0; k<SUBFRAMES; k++) {
-    /* log gains */
-
-    /* The input argument X to logN(X) is 2^17 times higher than the
-       input floating point argument Y to log(Y), since the X value
-       is a Q17 value. This can be compensated for after the call, by
-       subraction a value Z for each Q-step. One Q-step means that
-       X gets 2 times higher, i.e. Z = logN(2)*256 = 0.693147180559*256 =
-       177.445678 should be subtracted (since logN() returns a Q8 value).
-       For a X value in Q17, the value 177.445678*17 = 3017 should be
-       subtracted */
-    tmpcoeffs_gQ6[posg] = CalcLogN(gain_lo_hiQ17[gainpos])-3017; //Q8
-    tmpcoeffs_gQ6[posg] -= WebRtcIsacfix_kMeansGainQ8[0][posg]; //Q8, but Q6 after not-needed mult. by 4
-    posg++; gainpos++;
-
-    tmpcoeffs_gQ6[posg] = CalcLogN(gain_lo_hiQ17[gainpos])-3017; //Q8
-    tmpcoeffs_gQ6[posg] -= WebRtcIsacfix_kMeansGainQ8[0][posg]; //Q8, but Q6 after not-needed mult. by 4
-    posg++; gainpos++;
-
-    /* lo band LAR coeffs */
-    for (n=0; n<ORDERLO; n++, poss++, pos++) {
-      tmp32 = LPCCoefQ17[pos] - WebRtcIsacfix_kMeansShapeQ17[0][poss]; //Q17
-      tmp32 = WEBRTC_SPL_MUL_16_32_RSFT16(17203, tmp32<<3); // tmp32 = 2.1*tmp32
-      tmpcoeffs_sQ17[poss] = tmp32; //Q17
-    }
-
-    /* hi band LAR coeffs */
-    for (n=0; n<ORDERHI; n++, poss++, pos++) {
-      tmp32 = LPCCoefQ17[pos] - WebRtcIsacfix_kMeansShapeQ17[0][poss]; //Q17
-      tmp32 = WEBRTC_SPL_MUL_16_32_RSFT16(14746, tmp32<<1); // tmp32 = 0.45*tmp32
-      tmpcoeffs_sQ17[poss] = tmp32; //Q17
-    }
-
-  }
-
-
-  /* KLT  */
-
-  /* left transform */
-  offsg = 0;
-  posg = 0;
-  for (j=0; j<SUBFRAMES; j++) {
-    // Q21 = Q6 * Q15
-    sumQQ = tmpcoeffs_gQ6[offsg] * WebRtcIsacfix_kT1GainQ15[0][0] +
-        tmpcoeffs_gQ6[offsg + 1] * WebRtcIsacfix_kT1GainQ15[0][2];
-    tmpcoeffs2_gQ21[posg] = sumQQ;
-    posg++;
-
-    // Q21 = Q6 * Q15
-    sumQQ = tmpcoeffs_gQ6[offsg] * WebRtcIsacfix_kT1GainQ15[0][1] +
-        tmpcoeffs_gQ6[offsg + 1] * WebRtcIsacfix_kT1GainQ15[0][3];
-    tmpcoeffs2_gQ21[posg] = sumQQ;
-    posg++;
-
-    offsg += 2;
-  }
-
-  WebRtcIsacfix_MatrixProduct1(WebRtcIsacfix_kT1ShapeQ15[0], tmpcoeffs_sQ17,
-      tmpcoeffs2_sQ17, kTIndexFactor4, kTIndexFactor1, kTInitCase0,
-      kTIndexStep1, kTIndexStep3, kTLoopCount3, kTLoopCount3, kTMatrix1_shift1);
-
-  /* right transform */
-  WebRtcIsacfix_MatrixProduct2(WebRtcIsacfix_kT2GainQ15[0], tmpcoeffs2_gQ21,
-                               tmpcoeffs_gQ17, kTIndexFactor3, kTIndexStep1);
-
-  WebRtcIsacfix_MatrixProduct1(WebRtcIsacfix_kT2ShapeQ15[0], tmpcoeffs2_sQ17,
-      tmpcoeffs_sQ17, kTIndexFactor1, kTIndexFactor3, kTInitCase1, kTIndexStep3,
-      kTIndexStep1, kTLoopCount1, kTLoopCount3, kTMatrix1_shift1);
-
-  /* quantize coefficients */
-
-  BitsQQ = 0;
-  for (k=0; k<KLT_ORDER_GAIN; k++) //ATTN: ok?
-  {
-    posQQ = WebRtcIsacfix_kSelIndGain[k];
-    pos2QQ= (int16_t)CalcLrIntQ(tmpcoeffs_gQ17[posQQ], 17);
-
-    index_gQQ[k] = pos2QQ + WebRtcIsacfix_kQuantMinGain[k]; //ATTN: ok?
-    if (index_gQQ[k] < 0) {
-      index_gQQ[k] = 0;
-    }
-    else if (index_gQQ[k] > WebRtcIsacfix_kMaxIndGain[k]) {
-      index_gQQ[k] = WebRtcIsacfix_kMaxIndGain[k];
-    }
-    index_ovr_gQQ[k] = WebRtcIsacfix_kOffsetGain[0][k]+index_gQQ[k];
-    posQQ = WebRtcIsacfix_kOfLevelsGain[0] + index_ovr_gQQ[k];
-
-    /* Save data for creation of multiple bitstreams */
-    if (encData != NULL) {
-      encData->LPCindex_g[KLT_ORDER_GAIN*encData->startIdx + k] = index_gQQ[k];
-    }
-
-    /* determine number of bits */
-    sumQQ = WebRtcIsacfix_kCodeLenGainQ11[posQQ]; //Q11
-    BitsQQ += sumQQ;
-  }
-
-  for (k=0; k<KLT_ORDER_SHAPE; k++) //ATTN: ok?
-  {
-    index_sQQ[k] = (int16_t)(CalcLrIntQ(tmpcoeffs_sQ17[WebRtcIsacfix_kSelIndShape[k]], 17) + WebRtcIsacfix_kQuantMinShape[k]); //ATTN: ok?
-
-    if (index_sQQ[k] < 0)
-      index_sQQ[k] = 0;
-    else if (index_sQQ[k] > WebRtcIsacfix_kMaxIndShape[k])
-      index_sQQ[k] = WebRtcIsacfix_kMaxIndShape[k];
-    index_ovr_sQQ[k] = WebRtcIsacfix_kOffsetShape[0][k]+index_sQQ[k];
-
-    posQQ = WebRtcIsacfix_kOfLevelsShape[0] + index_ovr_sQQ[k];
-    sumQQ = WebRtcIsacfix_kCodeLenShapeQ11[posQQ]; //Q11
-    BitsQQ += sumQQ;
-  }
-
-
-
-  *model = 0;
-  *sizeQ11=BitsQQ;
-
-  /* entropy coding of model number */
-  status = WebRtcIsacfix_EncHistMulti(streamdata, model, WebRtcIsacfix_kModelCdfPtr, 1);
-  if (status < 0) {
-    return status;
-  }
-
-  /* entropy coding of quantization indices - shape only */
-  status = WebRtcIsacfix_EncHistMulti(streamdata, index_sQQ, WebRtcIsacfix_kCdfShapePtr[0], KLT_ORDER_SHAPE);
-  if (status < 0) {
-    return status;
-  }
-
-  /* Save data for creation of multiple bitstreams */
-  if (encData != NULL) {
-    for (k=0; k<KLT_ORDER_SHAPE; k++)
-    {
-      encData->LPCindex_s[KLT_ORDER_SHAPE*encData->startIdx + k] = index_sQQ[k];
-    }
-  }
-  /* save the state of the bitstream object 'streamdata' for the possible bit-rate reduction */
-  transcodingParam->full         = streamdata->full;
-  transcodingParam->stream_index = streamdata->stream_index;
-  transcodingParam->streamval    = streamdata->streamval;
-  transcodingParam->W_upper      = streamdata->W_upper;
-  transcodingParam->beforeLastWord     = streamdata->stream[streamdata->stream_index-1];
-  transcodingParam->lastWord     = streamdata->stream[streamdata->stream_index];
-
-  /* entropy coding of index */
-  status = WebRtcIsacfix_EncHistMulti(streamdata, index_gQQ, WebRtcIsacfix_kCdfGainPtr[0], KLT_ORDER_GAIN);
-  if (status < 0) {
-    return status;
-  }
-
-  /* find quantization levels for shape coefficients */
-  for (k=0; k<KLT_ORDER_SHAPE; k++) {
-    tmpcoeffs_sQ17[WebRtcIsacfix_kSelIndShape[k]] = WEBRTC_SPL_MUL(128, WebRtcIsacfix_kLevelsShapeQ10[WebRtcIsacfix_kOfLevelsShape[0]+index_ovr_sQQ[k]]);
-
-  }
-  /* inverse KLT  */
-
-  /* left transform */  // Transpose matrix!
-  WebRtcIsacfix_MatrixProduct1(WebRtcIsacfix_kT1ShapeQ15[0], tmpcoeffs_sQ17,
-      tmpcoeffs2_sQ17, kTIndexFactor4, kTIndexFactor4, kTInitCase0,
-      kTIndexStep1, kTIndexStep1, kTLoopCount3, kTLoopCount3, kTMatrix1_shift1);
-
-  /* right transform */ // Transpose matrix
-  WebRtcIsacfix_MatrixProduct1(WebRtcIsacfix_kT2ShapeQ15[0], tmpcoeffs2_sQ17,
-      tmpcoeffs_sQ17, kTIndexFactor1, kTIndexFactor1, kTInitCase1, kTIndexStep3,
-      kTIndexStep2, kTLoopCount1, kTLoopCount3, kTMatrix1_shift1);
-
-  /* scaling, mean addition, and gain restoration */
-  poss = 0;pos=0;
-  for (k=0; k<SUBFRAMES; k++) {
-
-    /* lo band LAR coeffs */
-    for (n=0; n<ORDERLO; n++, pos++, poss++) {
-      tmp32 = WEBRTC_SPL_MUL_16_32_RSFT16(31208, tmpcoeffs_sQ17[poss]); // (Q16*Q17)>>16 = Q17, with 1/2.1 = 0.47619047619 ~= 31208 in Q16
-      tmp32 = tmp32 + WebRtcIsacfix_kMeansShapeQ17[0][poss]; // Q17+Q17 = Q17
-      LPCCoefQ17[pos] = tmp32;
-    }
-
-    /* hi band LAR coeffs */
-    for (n=0; n<ORDERHI; n++, pos++, poss++) {
-      // ((Q13*Q17)>>16)<<3 = Q17, with 1/0.45 = 2.222222222222 ~= 18204 in Q13
-      tmp32 = WEBRTC_SPL_MUL_16_32_RSFT16(18204, tmpcoeffs_sQ17[poss]) << 3;
-      tmp32 = tmp32 + WebRtcIsacfix_kMeansShapeQ17[0][poss]; // Q17+Q17 = Q17
-      LPCCoefQ17[pos] = tmp32;
-    }
-
-  }
-
-  //to update tmpcoeffs_gQ17 to the proper state
-  for (k=0; k<KLT_ORDER_GAIN; k++) {
-    tmpcoeffs_gQ17[WebRtcIsacfix_kSelIndGain[k]] = WebRtcIsacfix_kLevelsGainQ17[WebRtcIsacfix_kOfLevelsGain[0]+index_ovr_gQQ[k]];
-  }
-
-
-
-  /* find quantization levels for coefficients */
-
-  /* left transform */
-  offsg = 0;
-  posg = 0;
-  for (j=0; j<SUBFRAMES; j++) {
-    // (Q15 * Q17) >> (16 - 1) = Q17; Q17 << 4 = Q21.
-    sumQQ = (WEBRTC_SPL_MUL_16_32_RSFT16(WebRtcIsacfix_kT1GainQ15[0][0],
-                                         tmpcoeffs_gQ17[offsg]) << 1);
-    sumQQ += (WEBRTC_SPL_MUL_16_32_RSFT16(WebRtcIsacfix_kT1GainQ15[0][1],
-                                          tmpcoeffs_gQ17[offsg + 1]) << 1);
-    tmpcoeffs2_gQ21[posg] = sumQQ << 4;
-    posg++;
-
-    sumQQ = (WEBRTC_SPL_MUL_16_32_RSFT16(WebRtcIsacfix_kT1GainQ15[0][2],
-                                         tmpcoeffs_gQ17[offsg]) << 1);
-    sumQQ += (WEBRTC_SPL_MUL_16_32_RSFT16(WebRtcIsacfix_kT1GainQ15[0][3],
-                                          tmpcoeffs_gQ17[offsg + 1]) << 1);
-    tmpcoeffs2_gQ21[posg] = sumQQ << 4;
-    posg++;
-    offsg += 2;
-  }
-
-  /* right transform */ // Transpose matrix
-  WebRtcIsacfix_MatrixProduct2(WebRtcIsacfix_kT2GainQ15[0], tmpcoeffs2_gQ21,
-                               tmpcoeffs_gQ17, kTIndexFactor1, kTIndexStep2);
-
-  /* scaling, mean addition, and gain restoration */
-  posg = 0;
-  gainpos = 0;
-  for (k=0; k<2*SUBFRAMES; k++) {
-
-    // Divide by 4 and get Q17 to Q8, i.e. shift 2+9.
-    sumQQ16 = (int16_t)(tmpcoeffs_gQ17[posg] >> 11);
-    sumQQ16 += WebRtcIsacfix_kMeansGainQ8[0][posg];
-    sumQQ = CalcExpN(sumQQ16); // Q8 in and Q17 out
-    gain_lo_hiQ17[gainpos] = sumQQ; //Q17
-
-    gainpos++;
-    pos++;posg++;
-  }
-
-  return 0;
-}
-
-int WebRtcIsacfix_EstCodeLpcGain(int32_t *gain_lo_hiQ17,
-                                 Bitstr_enc *streamdata,
-                                 IsacSaveEncoderData* encData) {
-  int j, k;
-  int16_t posQQ, pos2QQ, gainpos;
-  int16_t posg;
-  int16_t index_gQQ[KLT_ORDER_GAIN];
-
-  int16_t tmpcoeffs_gQ6[KLT_ORDER_GAIN];
-  int32_t tmpcoeffs_gQ17[KLT_ORDER_GAIN];
-  int32_t tmpcoeffs2_gQ21[KLT_ORDER_GAIN];
-  int32_t sumQQ;
-  int status = 0;
-
-  /* write LAR coefficients to statistics file */
-  /* Save data for creation of multiple bitstreams (and transcoding) */
-  if (encData != NULL) {
-    for (k=0; k<KLT_ORDER_GAIN; k++) {
-      encData->LPCcoeffs_g[KLT_ORDER_GAIN*encData->startIdx + k] = gain_lo_hiQ17[k];
-    }
-  }
-
-  /* log gains, mean removal and scaling */
-  posg = 0; gainpos = 0;
-
-  for (k=0; k<SUBFRAMES; k++) {
-    /* log gains */
-
-    /* The input argument X to logN(X) is 2^17 times higher than the
-       input floating point argument Y to log(Y), since the X value
-       is a Q17 value. This can be compensated for after the call, by
-       subraction a value Z for each Q-step. One Q-step means that
-       X gets 2 times higher, i.e. Z = logN(2)*256 = 0.693147180559*256 =
-       177.445678 should be subtracted (since logN() returns a Q8 value).
-       For a X value in Q17, the value 177.445678*17 = 3017 should be
-       subtracted */
-    tmpcoeffs_gQ6[posg] = CalcLogN(gain_lo_hiQ17[gainpos])-3017; //Q8
-    tmpcoeffs_gQ6[posg] -= WebRtcIsacfix_kMeansGainQ8[0][posg]; //Q8, but Q6 after not-needed mult. by 4
-    posg++; gainpos++;
-
-    tmpcoeffs_gQ6[posg] = CalcLogN(gain_lo_hiQ17[gainpos])-3017; //Q8
-    tmpcoeffs_gQ6[posg] -= WebRtcIsacfix_kMeansGainQ8[0][posg]; //Q8, but Q6 after not-needed mult. by 4
-    posg++; gainpos++;
-  }
-
-
-  /* KLT  */
-
-  /* left transform */
-  posg = 0;
-  for (j=0; j<SUBFRAMES; j++) {
-      // Q21 = Q6 * Q15
-      sumQQ = tmpcoeffs_gQ6[j * 2] * WebRtcIsacfix_kT1GainQ15[0][0] +
-          tmpcoeffs_gQ6[j * 2 + 1] * WebRtcIsacfix_kT1GainQ15[0][2];
-      tmpcoeffs2_gQ21[posg] = sumQQ;
-      posg++;
-
-      sumQQ = tmpcoeffs_gQ6[j * 2] * WebRtcIsacfix_kT1GainQ15[0][1] +
-          tmpcoeffs_gQ6[j * 2 + 1] * WebRtcIsacfix_kT1GainQ15[0][3];
-      tmpcoeffs2_gQ21[posg] = sumQQ;
-      posg++;
-  }
-
-  /* right transform */
-  WebRtcIsacfix_MatrixProduct2(WebRtcIsacfix_kT2GainQ15[0], tmpcoeffs2_gQ21,
-                               tmpcoeffs_gQ17, kTIndexFactor3, kTIndexStep1);
-
-  /* quantize coefficients */
-
-  for (k=0; k<KLT_ORDER_GAIN; k++) //ATTN: ok?
-  {
-    posQQ = WebRtcIsacfix_kSelIndGain[k];
-    pos2QQ= (int16_t)CalcLrIntQ(tmpcoeffs_gQ17[posQQ], 17);
-
-    index_gQQ[k] = pos2QQ + WebRtcIsacfix_kQuantMinGain[k]; //ATTN: ok?
-    if (index_gQQ[k] < 0) {
-      index_gQQ[k] = 0;
-    }
-    else if (index_gQQ[k] > WebRtcIsacfix_kMaxIndGain[k]) {
-      index_gQQ[k] = WebRtcIsacfix_kMaxIndGain[k];
-    }
-
-    /* Save data for creation of multiple bitstreams */
-    if (encData != NULL) {
-      encData->LPCindex_g[KLT_ORDER_GAIN*encData->startIdx + k] = index_gQQ[k];
-    }
-  }
-
-  /* entropy coding of index */
-  status = WebRtcIsacfix_EncHistMulti(streamdata, index_gQQ, WebRtcIsacfix_kCdfGainPtr[0], KLT_ORDER_GAIN);
-  if (status < 0) {
-    return status;
-  }
-
-  return 0;
-}
-
-
-int WebRtcIsacfix_EncodeLpc(int32_t *gain_lo_hiQ17,
-                            int16_t *LPCCoef_loQ15,
-                            int16_t *LPCCoef_hiQ15,
-                            int16_t *model,
-                            int32_t *sizeQ11,
-                            Bitstr_enc *streamdata,
-                            IsacSaveEncoderData* encData,
-                            transcode_obj *transcodeParam)
-{
-  int status = 0;
-  int32_t larsQ17[KLT_ORDER_SHAPE]; // KLT_ORDER_SHAPE == (ORDERLO+ORDERHI)*SUBFRAMES
-  // = (6+12)*6 == 108
-
-  Poly2LarFix(LPCCoef_loQ15, ORDERLO, LPCCoef_hiQ15, ORDERHI, SUBFRAMES, larsQ17);
-
-  status = EstCodeLpcCoef(larsQ17, gain_lo_hiQ17, model, sizeQ11,
-                          streamdata, encData, transcodeParam);
-  if (status < 0) {
-    return (status);
-  }
-
-  Lar2polyFix(larsQ17, LPCCoef_loQ15, ORDERLO, LPCCoef_hiQ15, ORDERHI, SUBFRAMES);
-
-  return 0;
-}
-
-
-/* decode & dequantize RC */
-int WebRtcIsacfix_DecodeRcCoef(Bitstr_dec *streamdata, int16_t *RCQ15)
-{
-  int k, err;
-  int16_t index[AR_ORDER];
-
-  /* entropy decoding of quantization indices */
-  err = WebRtcIsacfix_DecHistOneStepMulti(index, streamdata, WebRtcIsacfix_kRcCdfPtr, WebRtcIsacfix_kRcInitInd, AR_ORDER);
-  if (err<0)  // error check
-    return err;
-
-  /* find quantization levels for reflection coefficients */
-  for (k=0; k<AR_ORDER; k++)
-  {
-    RCQ15[k] = *(WebRtcIsacfix_kRcLevPtr[k] + index[k]);
-  }
-
-  return 0;
-}
-
-
-
-/* quantize & code RC */
-int WebRtcIsacfix_EncodeRcCoef(int16_t *RCQ15, Bitstr_enc *streamdata)
-{
-  int k;
-  int16_t index[AR_ORDER];
-  int status;
-
-  /* quantize reflection coefficients (add noise feedback?) */
-  for (k=0; k<AR_ORDER; k++)
-  {
-    index[k] = WebRtcIsacfix_kRcInitInd[k];
-
-    if (RCQ15[k] > WebRtcIsacfix_kRcBound[index[k]])
-    {
-      while (RCQ15[k] > WebRtcIsacfix_kRcBound[index[k] + 1])
-        index[k]++;
-    }
-    else
-    {
-      while (RCQ15[k] < WebRtcIsacfix_kRcBound[--index[k]]) ;
-    }
-
-    RCQ15[k] = *(WebRtcIsacfix_kRcLevPtr[k] + index[k]);
-  }
-
-
-  /* entropy coding of quantization indices */
-  status = WebRtcIsacfix_EncHistMulti(streamdata, index, WebRtcIsacfix_kRcCdfPtr, AR_ORDER);
-
-  /* If error in WebRtcIsacfix_EncHistMulti(), status will be negative, otherwise 0 */
-  return status;
-}
-
-
-/* decode & dequantize squared Gain */
-int WebRtcIsacfix_DecodeGain2(Bitstr_dec *streamdata, int32_t *gainQ10)
-{
-  int err;
-  int16_t index;
-
-  /* entropy decoding of quantization index */
-  err = WebRtcIsacfix_DecHistOneStepMulti(
-      &index,
-      streamdata,
-      WebRtcIsacfix_kGainPtr,
-      WebRtcIsacfix_kGainInitInd,
-      1);
-  /* error check */
-  if (err<0) {
-    return err;
-  }
-
-  /* find quantization level */
-  *gainQ10 = WebRtcIsacfix_kGain2Lev[index];
-
-  return 0;
-}
-
-
-
-/* quantize & code squared Gain */
-int WebRtcIsacfix_EncodeGain2(int32_t *gainQ10, Bitstr_enc *streamdata)
-{
-  int16_t index;
-  int status = 0;
-
-  /* find quantization index */
-  index = WebRtcIsacfix_kGainInitInd[0];
-  if (*gainQ10 > WebRtcIsacfix_kGain2Bound[index])
-  {
-    while (*gainQ10 > WebRtcIsacfix_kGain2Bound[index + 1])
-      index++;
-  }
-  else
-  {
-    while (*gainQ10 < WebRtcIsacfix_kGain2Bound[--index]) ;
-  }
-
-  /* dequantize */
-  *gainQ10 = WebRtcIsacfix_kGain2Lev[index];
-
-  /* entropy coding of quantization index */
-  status = WebRtcIsacfix_EncHistMulti(streamdata, &index, WebRtcIsacfix_kGainPtr, 1);
-
-  /* If error in WebRtcIsacfix_EncHistMulti(), status will be negative, otherwise 0 */
-  return status;
-}
-
-
-/* code and decode Pitch Gains and Lags functions */
-
-/* decode & dequantize Pitch Gains */
-int WebRtcIsacfix_DecodePitchGain(Bitstr_dec *streamdata, int16_t *PitchGains_Q12)
-{
-  int err;
-  int16_t index_comb;
-  const uint16_t *pitch_gain_cdf_ptr[1];
-
-  /* entropy decoding of quantization indices */
-  *pitch_gain_cdf_ptr = WebRtcIsacfix_kPitchGainCdf;
-  err = WebRtcIsacfix_DecHistBisectMulti(&index_comb, streamdata, pitch_gain_cdf_ptr, WebRtcIsacfix_kCdfTableSizeGain, 1);
-  /* error check, Q_mean_Gain.. tables are of size 144 */
-  if ((err < 0) || (index_comb < 0) || (index_comb >= 144))
-    return -ISAC_RANGE_ERROR_DECODE_PITCH_GAIN;
-
-  /* unquantize back to pitch gains by table look-up */
-  PitchGains_Q12[0] = WebRtcIsacfix_kPitchGain1[index_comb];
-  PitchGains_Q12[1] = WebRtcIsacfix_kPitchGain2[index_comb];
-  PitchGains_Q12[2] = WebRtcIsacfix_kPitchGain3[index_comb];
-  PitchGains_Q12[3] = WebRtcIsacfix_kPitchGain4[index_comb];
-
-  return 0;
-}
-
-
-/* quantize & code Pitch Gains */
-int WebRtcIsacfix_EncodePitchGain(int16_t* PitchGains_Q12,
-                                  Bitstr_enc* streamdata,
-                                  IsacSaveEncoderData* encData) {
-  int k,j;
-  int16_t SQ15[PITCH_SUBFRAMES];
-  int16_t index[3];
-  int16_t index_comb;
-  const uint16_t *pitch_gain_cdf_ptr[1];
-  int32_t CQ17;
-  int status = 0;
-
-
-  /* get the approximate arcsine (almost linear)*/
-  for (k=0; k<PITCH_SUBFRAMES; k++)
-    SQ15[k] = (int16_t)(PitchGains_Q12[k] * 33 >> 2);  // Q15
-
-
-  /* find quantization index; only for the first three transform coefficients */
-  for (k=0; k<3; k++)
-  {
-    /*  transform */
-    CQ17=0;
-    for (j=0; j<PITCH_SUBFRAMES; j++) {
-      CQ17 += WebRtcIsacfix_kTransform[k][j] * SQ15[j] >> 10;  // Q17
-    }
-
-    index[k] = (int16_t)((CQ17 + 8192)>>14); // Rounding and scaling with stepsize (=1/0.125=8)
-
-    /* check that the index is not outside the boundaries of the table */
-    if (index[k] < WebRtcIsacfix_kLowerlimiGain[k]) index[k] = WebRtcIsacfix_kLowerlimiGain[k];
-    else if (index[k] > WebRtcIsacfix_kUpperlimitGain[k]) index[k] = WebRtcIsacfix_kUpperlimitGain[k];
-    index[k] -= WebRtcIsacfix_kLowerlimiGain[k];
-  }
-
-  /* calculate unique overall index */
-  index_comb = (int16_t)(WEBRTC_SPL_MUL(WebRtcIsacfix_kMultsGain[0], index[0]) +
-                               WEBRTC_SPL_MUL(WebRtcIsacfix_kMultsGain[1], index[1]) + index[2]);
-
-  /* unquantize back to pitch gains by table look-up */
-  // (Y)
-  PitchGains_Q12[0] = WebRtcIsacfix_kPitchGain1[index_comb];
-  PitchGains_Q12[1] = WebRtcIsacfix_kPitchGain2[index_comb];
-  PitchGains_Q12[2] = WebRtcIsacfix_kPitchGain3[index_comb];
-  PitchGains_Q12[3] = WebRtcIsacfix_kPitchGain4[index_comb];
-
-
-  /* entropy coding of quantization pitch gains */
-  *pitch_gain_cdf_ptr = WebRtcIsacfix_kPitchGainCdf;
-  status = WebRtcIsacfix_EncHistMulti(streamdata, &index_comb, pitch_gain_cdf_ptr, 1);
-  if (status < 0) {
-    return status;
-  }
-
-  /* Save data for creation of multiple bitstreams */
-  if (encData != NULL) {
-    encData->pitchGain_index[encData->startIdx] = index_comb;
-  }
-
-  return 0;
-}
-
-
-
-/* Pitch LAG */
-
-
-/* decode & dequantize Pitch Lags */
-int WebRtcIsacfix_DecodePitchLag(Bitstr_dec *streamdata,
-                                 int16_t *PitchGain_Q12,
-                                 int16_t *PitchLags_Q7)
-{
-  int k, err;
-  int16_t index[PITCH_SUBFRAMES];
-  const int16_t *mean_val2Q10, *mean_val4Q10;
-
-  const int16_t *lower_limit;
-  const uint16_t *init_index;
-  const uint16_t *cdf_size;
-  const uint16_t **cdf;
-
-  int32_t meangainQ12;
-  int32_t CQ11, CQ10,tmp32a,tmp32b;
-  int16_t shft;
-
-  meangainQ12=0;
-  for (k = 0; k < 4; k++)
-    meangainQ12 += PitchGain_Q12[k];
-
-  meangainQ12 >>= 2;  // Get average.
-
-  /* voicing classificiation */
-  if (meangainQ12 <= 819) {                 // mean_gain < 0.2
-    shft = -1;        // StepSize=2.0;
-    cdf = WebRtcIsacfix_kPitchLagPtrLo;
-    cdf_size = WebRtcIsacfix_kPitchLagSizeLo;
-    mean_val2Q10 = WebRtcIsacfix_kMeanLag2Lo;
-    mean_val4Q10 = WebRtcIsacfix_kMeanLag4Lo;
-    lower_limit = WebRtcIsacfix_kLowerLimitLo;
-    init_index = WebRtcIsacfix_kInitIndLo;
-  } else if (meangainQ12 <= 1638) {            // mean_gain < 0.4
-    shft = 0;        // StepSize=1.0;
-    cdf = WebRtcIsacfix_kPitchLagPtrMid;
-    cdf_size = WebRtcIsacfix_kPitchLagSizeMid;
-    mean_val2Q10 = WebRtcIsacfix_kMeanLag2Mid;
-    mean_val4Q10 = WebRtcIsacfix_kMeanLag4Mid;
-    lower_limit = WebRtcIsacfix_kLowerLimitMid;
-    init_index = WebRtcIsacfix_kInitIndMid;
-  } else {
-    shft = 1;        // StepSize=0.5;
-    cdf = WebRtcIsacfix_kPitchLagPtrHi;
-    cdf_size = WebRtcIsacfix_kPitchLagSizeHi;
-    mean_val2Q10 = WebRtcIsacfix_kMeanLag2Hi;
-    mean_val4Q10 = WebRtcIsacfix_kMeanLag4Hi;
-    lower_limit = WebRtcIsacfix_kLowerLimitHi;
-    init_index = WebRtcIsacfix_kInitIndHi;
-  }
-
-  /* entropy decoding of quantization indices */
-  err = WebRtcIsacfix_DecHistBisectMulti(index, streamdata, cdf, cdf_size, 1);
-  if ((err<0) || (index[0]<0))  // error check
-    return -ISAC_RANGE_ERROR_DECODE_PITCH_LAG;
-
-  err = WebRtcIsacfix_DecHistOneStepMulti(index+1, streamdata, cdf+1, init_index, 3);
-  if (err<0)  // error check
-    return -ISAC_RANGE_ERROR_DECODE_PITCH_LAG;
-
-
-  /* unquantize back to transform coefficients and do the inverse transform: S = T'*C */
-  CQ11 = ((int32_t)index[0] + lower_limit[0]);  // Q0
-  CQ11 = WEBRTC_SPL_SHIFT_W32(CQ11,11-shft); // Scale with StepSize, Q11
-  for (k=0; k<PITCH_SUBFRAMES; k++) {
-    tmp32a =  WEBRTC_SPL_MUL_16_32_RSFT11(WebRtcIsacfix_kTransform[0][k], CQ11);
-    PitchLags_Q7[k] = (int16_t)(tmp32a >> 5);
-  }
-
-  CQ10 = mean_val2Q10[index[1]];
-  for (k=0; k<PITCH_SUBFRAMES; k++) {
-    tmp32b = WebRtcIsacfix_kTransform[1][k] * (int16_t)CQ10 >> 10;
-    PitchLags_Q7[k] += (int16_t)(tmp32b >> 5);
-  }
-
-  CQ10 = mean_val4Q10[index[3]];
-  for (k=0; k<PITCH_SUBFRAMES; k++) {
-    tmp32b = WebRtcIsacfix_kTransform[3][k] * (int16_t)CQ10 >> 10;
-    PitchLags_Q7[k] += (int16_t)(tmp32b >> 5);
-  }
-
-  return 0;
-}
-
-
-
-/* quantize & code Pitch Lags */
-int WebRtcIsacfix_EncodePitchLag(int16_t* PitchLagsQ7,
-                                 int16_t* PitchGain_Q12,
-                                 Bitstr_enc* streamdata,
-                                 IsacSaveEncoderData* encData) {
-  int k, j;
-  int16_t index[PITCH_SUBFRAMES];
-  int32_t meangainQ12, CQ17;
-  int32_t CQ11, CQ10,tmp32a;
-
-  const int16_t *mean_val2Q10,*mean_val4Q10;
-  const int16_t *lower_limit, *upper_limit;
-  const uint16_t **cdf;
-  int16_t shft, tmp16b;
-  int32_t tmp32b;
-  int status = 0;
-
-  /* compute mean pitch gain */
-  meangainQ12=0;
-  for (k = 0; k < 4; k++)
-    meangainQ12 += PitchGain_Q12[k];
-
-  meangainQ12 >>= 2;
-
-  /* Save data for creation of multiple bitstreams */
-  if (encData != NULL) {
-    encData->meanGain[encData->startIdx] = meangainQ12;
-  }
-
-  /* voicing classificiation */
-  if (meangainQ12 <= 819) {                 // mean_gain < 0.2
-    shft = -1;        // StepSize=2.0;
-    cdf = WebRtcIsacfix_kPitchLagPtrLo;
-    mean_val2Q10 = WebRtcIsacfix_kMeanLag2Lo;
-    mean_val4Q10 = WebRtcIsacfix_kMeanLag4Lo;
-    lower_limit = WebRtcIsacfix_kLowerLimitLo;
-    upper_limit = WebRtcIsacfix_kUpperLimitLo;
-  } else if (meangainQ12 <= 1638) {            // mean_gain < 0.4
-    shft = 0;        // StepSize=1.0;
-    cdf = WebRtcIsacfix_kPitchLagPtrMid;
-    mean_val2Q10 = WebRtcIsacfix_kMeanLag2Mid;
-    mean_val4Q10 = WebRtcIsacfix_kMeanLag4Mid;
-    lower_limit = WebRtcIsacfix_kLowerLimitMid;
-    upper_limit = WebRtcIsacfix_kUpperLimitMid;
-  } else {
-    shft = 1;        // StepSize=0.5;
-    cdf = WebRtcIsacfix_kPitchLagPtrHi;
-    mean_val2Q10 = WebRtcIsacfix_kMeanLag2Hi;
-    mean_val4Q10 = WebRtcIsacfix_kMeanLag4Hi;
-    lower_limit = WebRtcIsacfix_kLowerLimitHi;
-    upper_limit = WebRtcIsacfix_kUpperLimitHi;
-  }
-
-  /* find quantization index */
-  for (k=0; k<4; k++)
-  {
-    /*  transform */
-    CQ17=0;
-    for (j=0; j<PITCH_SUBFRAMES; j++)
-      CQ17 += WebRtcIsacfix_kTransform[k][j] * PitchLagsQ7[j] >> 2;  // Q17
-
-    CQ17 = WEBRTC_SPL_SHIFT_W32(CQ17,shft); // Scale with StepSize
-
-    /* quantize */
-    tmp16b = (int16_t)((CQ17 + 65536) >> 17);
-    index[k] =  tmp16b;
-
-    /* check that the index is not outside the boundaries of the table */
-    if (index[k] < lower_limit[k]) index[k] = lower_limit[k];
-    else if (index[k] > upper_limit[k]) index[k] = upper_limit[k];
-    index[k] -= lower_limit[k];
-
-    /* Save data for creation of multiple bitstreams */
-    if(encData != NULL) {
-      encData->pitchIndex[PITCH_SUBFRAMES*encData->startIdx + k] = index[k];
-    }
-  }
-
-  /* unquantize back to transform coefficients and do the inverse transform: S = T'*C */
-  CQ11 = (index[0] + lower_limit[0]);  // Q0
-  CQ11 = WEBRTC_SPL_SHIFT_W32(CQ11,11-shft); // Scale with StepSize, Q11
-
-  for (k=0; k<PITCH_SUBFRAMES; k++) {
-    tmp32a =  WEBRTC_SPL_MUL_16_32_RSFT11(WebRtcIsacfix_kTransform[0][k], CQ11); // Q12
-    PitchLagsQ7[k] = (int16_t)(tmp32a >> 5);  // Q7.
-  }
-
-  CQ10 = mean_val2Q10[index[1]];
-  for (k=0; k<PITCH_SUBFRAMES; k++) {
-    tmp32b = WebRtcIsacfix_kTransform[1][k] * (int16_t)CQ10 >> 10;
-    PitchLagsQ7[k] += (int16_t)(tmp32b >> 5);  // Q7.
-  }
-
-  CQ10 = mean_val4Q10[index[3]];
-  for (k=0; k<PITCH_SUBFRAMES; k++) {
-    tmp32b = WebRtcIsacfix_kTransform[3][k] * (int16_t)CQ10 >> 10;
-    PitchLagsQ7[k] += (int16_t)(tmp32b >> 5);  // Q7.
-  }
-
-  /* entropy coding of quantization pitch lags */
-  status = WebRtcIsacfix_EncHistMulti(streamdata, index, cdf, PITCH_SUBFRAMES);
-
-  /* If error in WebRtcIsacfix_EncHistMulti(), status will be negative, otherwise 0 */
-  return status;
-}
-
-
-
-/* Routines for inband signaling of bandwitdh estimation */
-/* Histograms based on uniform distribution of indices */
-/* Move global variables later! */
-
-
-/* cdf array for frame length indicator */
-const uint16_t kFrameLenCdf[4] = {
-  0, 21845, 43690, 65535};
-
-/* pointer to cdf array for frame length indicator */
-const uint16_t * const kFrameLenCdfPtr[1] = {kFrameLenCdf};
-
-/* initial cdf index for decoder of frame length indicator */
-const uint16_t kFrameLenInitIndex[1] = {1};
-
-
-int WebRtcIsacfix_DecodeFrameLen(Bitstr_dec *streamdata,
-                                 size_t *framesamples)
-{
-
-  int err;
-  int16_t frame_mode;
-
-  err = 0;
-  /* entropy decoding of frame length [1:30ms,2:60ms] */
-  err = WebRtcIsacfix_DecHistOneStepMulti(&frame_mode, streamdata, kFrameLenCdfPtr, kFrameLenInitIndex, 1);
-  if (err<0)  // error check
-    return -ISAC_RANGE_ERROR_DECODE_FRAME_LENGTH;
-
-  switch(frame_mode) {
-    case 1:
-      *framesamples = 480; /* 30ms */
-      break;
-    case 2:
-      *framesamples = 960; /* 60ms */
-      break;
-    default:
-      err = -ISAC_DISALLOWED_FRAME_MODE_DECODER;
-  }
-
-  return err;
-}
-
-
-int WebRtcIsacfix_EncodeFrameLen(int16_t framesamples, Bitstr_enc *streamdata) {
-
-  int status;
-  int16_t frame_mode;
-
-  status = 0;
-  frame_mode = 0;
-  /* entropy coding of frame length [1:480 samples,2:960 samples] */
-  switch(framesamples) {
-    case 480:
-      frame_mode = 1;
-      break;
-    case 960:
-      frame_mode = 2;
-      break;
-    default:
-      status = - ISAC_DISALLOWED_FRAME_MODE_ENCODER;
-  }
-
-  if (status < 0)
-    return status;
-
-  status = WebRtcIsacfix_EncHistMulti(streamdata, &frame_mode, kFrameLenCdfPtr, 1);
-
-  return status;
-}
-
-/* cdf array for estimated bandwidth */
-const uint16_t kBwCdf[25] = {
-  0, 2731, 5461, 8192, 10923, 13653, 16384, 19114, 21845, 24576, 27306, 30037,
-  32768, 35498, 38229, 40959, 43690, 46421, 49151, 51882, 54613, 57343, 60074,
-  62804, 65535};
-
-/* pointer to cdf array for estimated bandwidth */
-const uint16_t * const kBwCdfPtr[1] = {kBwCdf};
-
-/* initial cdf index for decoder of estimated bandwidth*/
-const uint16_t kBwInitIndex[1] = {7};
-
-
-int WebRtcIsacfix_DecodeSendBandwidth(Bitstr_dec *streamdata, int16_t *BWno) {
-
-  int err;
-  int16_t BWno32;
-
-  /* entropy decoding of sender's BW estimation [0..23] */
-  err = WebRtcIsacfix_DecHistOneStepMulti(&BWno32, streamdata, kBwCdfPtr, kBwInitIndex, 1);
-  if (err<0)  // error check
-    return -ISAC_RANGE_ERROR_DECODE_BANDWIDTH;
-  *BWno = (int16_t)BWno32;
-  return err;
-
-}
-
-
-int WebRtcIsacfix_EncodeReceiveBandwidth(int16_t *BWno, Bitstr_enc *streamdata)
-{
-  int status = 0;
-  /* entropy encoding of receiver's BW estimation [0..23] */
-  status = WebRtcIsacfix_EncHistMulti(streamdata, BWno, kBwCdfPtr, 1);
-
-  return status;
-}
-
-/* estimate codel length of LPC Coef */
-void WebRtcIsacfix_TranscodeLpcCoef(int32_t *gain_lo_hiQ17,
-                                    int16_t *index_gQQ) {
-  int j, k;
-  int16_t posQQ, pos2QQ;
-  int16_t posg, offsg, gainpos;
-  int32_t tmpcoeffs_gQ6[KLT_ORDER_GAIN];
-  int32_t tmpcoeffs_gQ17[KLT_ORDER_GAIN];
-  int32_t tmpcoeffs2_gQ21[KLT_ORDER_GAIN];
-  int32_t sumQQ;
-
-
-  /* log gains, mean removal and scaling */
-  posg = 0; gainpos=0;
-
-  for (k=0; k<SUBFRAMES; k++) {
-    /* log gains */
-
-    /* The input argument X to logN(X) is 2^17 times higher than the
-       input floating point argument Y to log(Y), since the X value
-       is a Q17 value. This can be compensated for after the call, by
-       subraction a value Z for each Q-step. One Q-step means that
-       X gets 2 times higher, i.e. Z = logN(2)*256 = 0.693147180559*256 =
-       177.445678 should be subtracted (since logN() returns a Q8 value).
-       For a X value in Q17, the value 177.445678*17 = 3017 should be
-       subtracted */
-    tmpcoeffs_gQ6[posg] = CalcLogN(gain_lo_hiQ17[gainpos])-3017; //Q8
-    tmpcoeffs_gQ6[posg] -= WebRtcIsacfix_kMeansGainQ8[0][posg]; //Q8, but Q6 after not-needed mult. by 4
-    posg++; gainpos++;
-
-    tmpcoeffs_gQ6[posg] = CalcLogN(gain_lo_hiQ17[gainpos])-3017; //Q8
-    tmpcoeffs_gQ6[posg] -= WebRtcIsacfix_kMeansGainQ8[0][posg]; //Q8, but Q6 after not-needed mult. by 4
-    posg++; gainpos++;
-
-  }
-
-
-  /* KLT  */
-
-  /* left transform */
-  for (j = 0, offsg = 0; j < SUBFRAMES; j++, offsg += 2) {
-    // Q21 = Q6 * Q15
-    sumQQ = tmpcoeffs_gQ6[offsg] * WebRtcIsacfix_kT1GainQ15[0][0] +
-        tmpcoeffs_gQ6[offsg + 1] * WebRtcIsacfix_kT1GainQ15[0][2];
-    tmpcoeffs2_gQ21[offsg] = sumQQ;
-
-    // Q21 = Q6 * Q15
-    sumQQ = tmpcoeffs_gQ6[offsg] * WebRtcIsacfix_kT1GainQ15[0][1] +
-        tmpcoeffs_gQ6[offsg + 1] * WebRtcIsacfix_kT1GainQ15[0][3];
-    tmpcoeffs2_gQ21[offsg + 1] = sumQQ;
-  }
-
-  /* right transform */
-  WebRtcIsacfix_MatrixProduct2(WebRtcIsacfix_kT2GainQ15[0], tmpcoeffs2_gQ21,
-                               tmpcoeffs_gQ17, kTIndexFactor3, kTIndexStep1);
-
-  /* quantize coefficients */
-  for (k=0; k<KLT_ORDER_GAIN; k++) //ATTN: ok?
-  {
-    posQQ = WebRtcIsacfix_kSelIndGain[k];
-    pos2QQ= (int16_t)CalcLrIntQ(tmpcoeffs_gQ17[posQQ], 17);
-
-    index_gQQ[k] = pos2QQ + WebRtcIsacfix_kQuantMinGain[k]; //ATTN: ok?
-    if (index_gQQ[k] < 0) {
-      index_gQQ[k] = 0;
-    }
-    else if (index_gQQ[k] > WebRtcIsacfix_kMaxIndGain[k]) {
-      index_gQQ[k] = WebRtcIsacfix_kMaxIndGain[k];
-    }
-  }
-}
diff --git a/modules/audio_coding/codecs/isac/fix/source/entropy_coding.h b/modules/audio_coding/codecs/isac/fix/source/entropy_coding.h
deleted file mode 100644
index 1b87d0e..0000000
--- a/modules/audio_coding/codecs/isac/fix/source/entropy_coding.h
+++ /dev/null
@@ -1,189 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/*
- * entropy_coding.h
- *
- * This header file contains all of the functions used to arithmetically
- * encode the iSAC bistream
- *
- */
-
-#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_FIX_SOURCE_ENTROPY_CODING_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_FIX_SOURCE_ENTROPY_CODING_H_
-
-#include "structs.h"
-
-/* decode complex spectrum (return number of bytes in stream) */
-int WebRtcIsacfix_DecodeSpec(Bitstr_dec  *streamdata,
-                             int16_t *frQ7,
-                             int16_t *fiQ7,
-                             int16_t AvgPitchGain_Q12);
-
-/* encode complex spectrum */
-int WebRtcIsacfix_EncodeSpec(const int16_t *fr,
-                             const int16_t *fi,
-                             Bitstr_enc *streamdata,
-                             int16_t AvgPitchGain_Q12);
-
-
-/* decode & dequantize LPC Coef */
-int WebRtcIsacfix_DecodeLpcCoef(Bitstr_dec  *streamdata,
-                                int32_t *LPCCoefQ17,
-                                int32_t *gain_lo_hiQ17,
-                                int16_t *outmodel);
-
-int WebRtcIsacfix_DecodeLpc(int32_t *gain_lo_hiQ17,
-                            int16_t *LPCCoef_loQ15,
-                            int16_t *LPCCoef_hiQ15,
-                            Bitstr_dec  *streamdata,
-                            int16_t *outmodel);
-
-/* quantize & code LPC Coef */
-int WebRtcIsacfix_EncodeLpc(int32_t *gain_lo_hiQ17,
-                            int16_t *LPCCoef_loQ15,
-                            int16_t *LPCCoef_hiQ15,
-                            int16_t *model,
-                            int32_t *sizeQ11,
-                            Bitstr_enc *streamdata,
-                            IsacSaveEncoderData* encData,
-                            transcode_obj *transcodeParam);
-
-int WebRtcIsacfix_EstCodeLpcGain(int32_t *gain_lo_hiQ17,
-                                 Bitstr_enc *streamdata,
-                                 IsacSaveEncoderData* encData);
-/* decode & dequantize RC */
-int WebRtcIsacfix_DecodeRcCoef(Bitstr_dec *streamdata,
-                               int16_t *RCQ15);
-
-/* quantize & code RC */
-int WebRtcIsacfix_EncodeRcCoef(int16_t *RCQ15,
-                               Bitstr_enc *streamdata);
-
-/* decode & dequantize squared Gain */
-int WebRtcIsacfix_DecodeGain2(Bitstr_dec *streamdata,
-                              int32_t *Gain2);
-
-/* quantize & code squared Gain (input is squared gain) */
-int WebRtcIsacfix_EncodeGain2(int32_t *gain2,
-                              Bitstr_enc *streamdata);
-
-int WebRtcIsacfix_EncodePitchGain(int16_t *PitchGains_Q12,
-                                  Bitstr_enc *streamdata,
-                                  IsacSaveEncoderData* encData);
-
-int WebRtcIsacfix_EncodePitchLag(int16_t *PitchLagQ7,
-                                 int16_t *PitchGain_Q12,
-                                 Bitstr_enc *streamdata,
-                                 IsacSaveEncoderData* encData);
-
-int WebRtcIsacfix_DecodePitchGain(Bitstr_dec *streamdata,
-                                  int16_t *PitchGain_Q12);
-
-int WebRtcIsacfix_DecodePitchLag(Bitstr_dec *streamdata,
-                                 int16_t *PitchGain_Q12,
-                                 int16_t *PitchLagQ7);
-
-int WebRtcIsacfix_DecodeFrameLen(Bitstr_dec *streamdata,
-                                 size_t *framelength);
-
-
-int WebRtcIsacfix_EncodeFrameLen(int16_t framelength,
-                                 Bitstr_enc *streamdata);
-
-int WebRtcIsacfix_DecodeSendBandwidth(Bitstr_dec *streamdata,
-                                      int16_t *BWno);
-
-
-int WebRtcIsacfix_EncodeReceiveBandwidth(int16_t *BWno,
-                                         Bitstr_enc *streamdata);
-
-void WebRtcIsacfix_TranscodeLpcCoef(int32_t *tmpcoeffs_gQ6,
-                                    int16_t *index_gQQ);
-
-// Pointer functions for LPC transforms.
-
-typedef void (*MatrixProduct1)(const int16_t matrix0[],
-                               const int32_t matrix1[],
-                               int32_t matrix_product[],
-                               const int matrix1_index_factor1,
-                               const int matrix0_index_factor1,
-                               const int matrix1_index_init_case,
-                               const int matrix1_index_step,
-                               const int matrix0_index_step,
-                               const int inner_loop_count,
-                               const int mid_loop_count,
-                               const int shift);
-typedef void (*MatrixProduct2)(const int16_t matrix0[],
-                               const int32_t matrix1[],
-                               int32_t matrix_product[],
-                               const int matrix0_index_factor,
-                               const int matrix0_index_step);
-
-extern MatrixProduct1 WebRtcIsacfix_MatrixProduct1;
-extern MatrixProduct2 WebRtcIsacfix_MatrixProduct2;
-
-void WebRtcIsacfix_MatrixProduct1C(const int16_t matrix0[],
-                                   const int32_t matrix1[],
-                                   int32_t matrix_product[],
-                                   const int matrix1_index_factor1,
-                                   const int matrix0_index_factor1,
-                                   const int matrix1_index_init_case,
-                                   const int matrix1_index_step,
-                                   const int matrix0_index_step,
-                                   const int inner_loop_count,
-                                   const int mid_loop_count,
-                                   const int shift);
-void WebRtcIsacfix_MatrixProduct2C(const int16_t matrix0[],
-                                   const int32_t matrix1[],
-                                   int32_t matrix_product[],
-                                   const int matrix0_index_factor,
-                                   const int matrix0_index_step);
-
-#if defined(WEBRTC_HAS_NEON)
-void WebRtcIsacfix_MatrixProduct1Neon(const int16_t matrix0[],
-                                      const int32_t matrix1[],
-                                      int32_t matrix_product[],
-                                      const int matrix1_index_factor1,
-                                      const int matrix0_index_factor1,
-                                      const int matrix1_index_init_case,
-                                      const int matrix1_index_step,
-                                      const int matrix0_index_step,
-                                      const int inner_loop_count,
-                                      const int mid_loop_count,
-                                      const int shift);
-void WebRtcIsacfix_MatrixProduct2Neon(const int16_t matrix0[],
-                                      const int32_t matrix1[],
-                                      int32_t matrix_product[],
-                                      const int matrix0_index_factor,
-                                      const int matrix0_index_step);
-#endif
-
-#if defined(MIPS32_LE)
-void WebRtcIsacfix_MatrixProduct1MIPS(const int16_t matrix0[],
-                                      const int32_t matrix1[],
-                                      int32_t matrix_product[],
-                                      const int matrix1_index_factor1,
-                                      const int matrix0_index_factor1,
-                                      const int matrix1_index_init_case,
-                                      const int matrix1_index_step,
-                                      const int matrix0_index_step,
-                                      const int inner_loop_count,
-                                      const int mid_loop_count,
-                                      const int shift);
-
-void WebRtcIsacfix_MatrixProduct2MIPS(const int16_t matrix0[],
-                                      const int32_t matrix1[],
-                                      int32_t matrix_product[],
-                                      const int matrix0_index_factor,
-                                      const int matrix0_index_step);
-#endif
-
-#endif  // WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_FIX_SOURCE_ENTROPY_CODING_H_
diff --git a/modules/audio_coding/codecs/isac/fix/source/entropy_coding_mips.c b/modules/audio_coding/codecs/isac/fix/source/entropy_coding_mips.c
deleted file mode 100644
index 599f8f0..0000000
--- a/modules/audio_coding/codecs/isac/fix/source/entropy_coding_mips.c
+++ /dev/null
@@ -1,249 +0,0 @@
-/*
- *  Copyright (c) 2014 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/codecs/isac/fix/source/entropy_coding.h"
-#include "webrtc/modules/audio_coding/codecs/isac/fix/source/settings.h"
-
-// MIPS optimization of the function WebRtcIsacfix_MatrixProduct1.
-// Bit-exact with the function WebRtcIsacfix_MatrixProduct1C from
-// entropy_coding.c file.
-void WebRtcIsacfix_MatrixProduct1MIPS(const int16_t matrix0[],
-                                      const int32_t matrix1[],
-                                      int32_t matrix_product[],
-                                      const int matrix1_index_factor1,
-                                      const int matrix0_index_factor1,
-                                      const int matrix1_index_init_case,
-                                      const int matrix1_index_step,
-                                      const int matrix0_index_step,
-                                      const int inner_loop_count,
-                                      const int mid_loop_count,
-                                      const int shift) {
-  if (matrix1_index_init_case != 0) {
-    int j = SUBFRAMES, k = 0, n = 0;
-    int32_t r0, r1, r2, sum32;
-    int32_t* product_start = matrix_product;
-    int32_t* product_ptr;
-    const uint32_t product_step = 4 * mid_loop_count;
-    const uint32_t matrix0_step = 2 * matrix0_index_step;
-    const uint32_t matrix1_step = 4 * matrix1_index_step;
-    const uint32_t matrix0_step2 = 2 * matrix0_index_factor1;
-    const uint32_t matrix1_step2 = 4 * matrix1_index_factor1;
-    const int16_t* matrix0_start = matrix0;
-    const int32_t* matrix1_start = matrix1;
-    int16_t* matrix0_ptr;
-    int32_t* matrix1_ptr;
-
-    __asm __volatile (
-      ".set     push                                                       \n\t"
-      ".set     noreorder                                                  \n\t"
-     "1:                                                                   \n\t"
-      "addu     %[product_ptr],     %[product_start],     $0               \n\t"
-      "addu     %[k],               %[product_step],      $0               \n\t"
-      "addiu    %[j],               %[j],                 -1               \n\t"
-      "addu     %[matrix1_start],   %[matrix1],           $0               \n\t"
-     "2:                                                                   \n\t"
-      "addu     %[matrix1_ptr],     %[matrix1_start],     $0               \n\t"
-      "addu     %[matrix0_ptr],     %[matrix0_start],     $0               \n\t"
-      "addu     %[n],               %[inner_loop_count],  $0               \n\t"
-      "mul      %[sum32],           $0,                   $0               \n\t"
-     "3:                                                                   \n\t"
-      "lw       %[r0],              0(%[matrix1_ptr])                      \n\t"
-      "lh       %[r1],              0(%[matrix0_ptr])                      \n\t"
-      "addu     %[matrix1_ptr],     %[matrix1_ptr],       %[matrix1_step]  \n\t"
-      "sllv     %[r0],              %[r0],                %[shift]         \n\t"
-      "andi     %[r2],              %[r0],                0xffff           \n\t"
-      "sra      %[r2],              %[r2],                1                \n\t"
-      "mul      %[r2],              %[r2],                %[r1]            \n\t"
-      "sra      %[r0],              %[r0],                16               \n\t"
-      "mul      %[r0],              %[r0],                %[r1]            \n\t"
-      "addu     %[matrix0_ptr],     %[matrix0_ptr],       %[matrix0_step]  \n\t"
-      "addiu    %[n],               %[n],                 -1               \n\t"
-#if defined(MIPS_DSP_R1_LE)
-      "shra_r.w %[r2],              %[r2],                15               \n\t"
-#else
-      "addiu    %[r2],              %[r2],                0x4000           \n\t"
-      "sra      %[r2],              %[r2],                15               \n\t"
-#endif
-      "addu     %[sum32],           %[sum32],             %[r2]            \n\t"
-      "bgtz     %[n],               3b                                     \n\t"
-      " addu    %[sum32],           %[sum32],             %[r0]            \n\t"
-      "addiu    %[k],               %[k],                 -4               \n\t"
-      "addu     %[matrix1_start],   %[matrix1_start],     %[matrix1_step2] \n\t"
-      "sw       %[sum32],           0(%[product_ptr])                      \n\t"
-      "bgtz     %[k],               2b                                     \n\t"
-      " addiu   %[product_ptr],     %[product_ptr],       4                \n\t"
-      "addu     %[matrix0_start],   %[matrix0_start],     %[matrix0_step2] \n\t"
-      "bgtz     %[j],               1b                                     \n\t"
-      " addu    %[product_start],   %[product_start],     %[product_step]  \n\t"
-      ".set     pop                                                        \n\t"
-      : [product_ptr] "=&r" (product_ptr), [product_start] "+r" (product_start),
-        [k] "=&r" (k), [j] "+r" (j), [matrix1_start] "=&r"(matrix1_start),
-        [matrix1_ptr] "=&r" (matrix1_ptr), [matrix0_ptr] "=&r" (matrix0_ptr),
-        [matrix0_start] "+r" (matrix0_start), [n] "=&r" (n), [r0] "=&r" (r0),
-        [sum32] "=&r" (sum32), [r1] "=&r" (r1),[r2] "=&r" (r2)
-      : [product_step] "r" (product_step), [matrix1] "r" (matrix1),
-        [inner_loop_count] "r" (inner_loop_count),
-        [matrix1_step] "r" (matrix1_step), [shift] "r" (shift),
-        [matrix0_step] "r" (matrix0_step), [matrix1_step2] "r" (matrix1_step2),
-        [matrix0_step2] "r" (matrix0_step2)
-      : "hi", "lo", "memory"
-    );
-  } else {
-    int j = SUBFRAMES, k = 0, n = 0;
-    int32_t r0, r1, r2, sum32;
-    int32_t* product_start = matrix_product;
-    int32_t* product_ptr;
-    const uint32_t product_step = 4 * mid_loop_count;
-    const uint32_t matrix0_step = 2 * matrix0_index_step;
-    const uint32_t matrix1_step = 4 * matrix1_index_step;
-    const uint32_t matrix0_step2 = 2 * matrix0_index_factor1;
-    const uint32_t matrix1_step2 = 4 * matrix1_index_factor1;
-    const int16_t* matrix0_start = matrix0;
-    const int32_t* matrix1_start = matrix1;
-    int16_t* matrix0_ptr;
-    int32_t* matrix1_ptr;
-
-    __asm __volatile (
-      ".set     push                                                       \n\t"
-      ".set     noreorder                                                  \n\t"
-     "1:                                                                   \n\t"
-      "addu     %[product_ptr],     %[product_start],     $0               \n\t"
-      "addu     %[k],               %[product_step],      $0               \n\t"
-      "addiu    %[j],               %[j],                 -1               \n\t"
-      "addu     %[matrix0_start],   %[matrix0],           $0               \n\t"
-     "2:                                                                   \n\t"
-      "addu     %[matrix1_ptr],     %[matrix1_start],     $0               \n\t"
-      "addu     %[matrix0_ptr],     %[matrix0_start],     $0               \n\t"
-      "addu     %[n],               %[inner_loop_count],  $0               \n\t"
-      "mul      %[sum32],           $0,                   $0               \n\t"
-     "3:                                                                   \n\t"
-      "lw       %[r0],              0(%[matrix1_ptr])                      \n\t"
-      "lh       %[r1],              0(%[matrix0_ptr])                      \n\t"
-      "addu     %[matrix1_ptr],     %[matrix1_ptr],       %[matrix1_step]  \n\t"
-      "sllv     %[r0],              %[r0],                %[shift]         \n\t"
-      "andi     %[r2],              %[r0],                0xffff           \n\t"
-      "sra      %[r2],              %[r2],                1                \n\t"
-      "mul      %[r2],              %[r2],                %[r1]            \n\t"
-      "sra      %[r0],              %[r0],                16               \n\t"
-      "mul      %[r0],              %[r0],                %[r1]            \n\t"
-      "addu     %[matrix0_ptr],     %[matrix0_ptr],       %[matrix0_step]  \n\t"
-      "addiu    %[n],               %[n],                 -1               \n\t"
-#if defined(MIPS_DSP_R1_LE)
-      "shra_r.w %[r2],              %[r2],                15               \n\t"
-#else
-      "addiu    %[r2],              %[r2],                0x4000           \n\t"
-      "sra      %[r2],              %[r2],                15               \n\t"
-#endif
-      "addu     %[sum32],           %[sum32],             %[r2]            \n\t"
-      "bgtz     %[n],               3b                                     \n\t"
-      " addu    %[sum32],           %[sum32],             %[r0]            \n\t"
-      "addiu    %[k],               %[k],                 -4               \n\t"
-      "addu     %[matrix0_start],   %[matrix0_start],     %[matrix0_step2] \n\t"
-      "sw       %[sum32],           0(%[product_ptr])                      \n\t"
-      "bgtz     %[k],               2b                                     \n\t"
-      " addiu   %[product_ptr],     %[product_ptr],       4                \n\t"
-      "addu     %[matrix1_start],   %[matrix1_start],     %[matrix1_step2] \n\t"
-      "bgtz     %[j],               1b                                     \n\t"
-      " addu    %[product_start],   %[product_start],     %[product_step]  \n\t"
-      ".set     pop                                                        \n\t"
-      : [product_ptr] "=&r" (product_ptr), [product_start] "+r" (product_start),
-        [k] "=&r" (k), [j] "+r" (j), [matrix1_start] "+r"(matrix1_start),
-        [matrix1_ptr] "=&r" (matrix1_ptr), [matrix0_ptr] "=&r" (matrix0_ptr),
-        [matrix0_start] "=&r" (matrix0_start), [n] "=&r" (n), [r0] "=&r" (r0),
-        [sum32] "=&r" (sum32), [r1] "=&r" (r1),[r2] "=&r" (r2)
-      : [product_step] "r" (product_step), [matrix0] "r" (matrix0),
-        [inner_loop_count] "r" (inner_loop_count),
-        [matrix1_step] "r" (matrix1_step), [shift] "r" (shift),
-        [matrix0_step] "r" (matrix0_step), [matrix1_step2] "r" (matrix1_step2),
-        [matrix0_step2] "r" (matrix0_step2)
-      : "hi", "lo", "memory"
-    );
-  }
-}
-
-// MIPS optimization of the function WebRtcIsacfix_MatrixProduct2.
-// Bit-exact with the function WebRtcIsacfix_MatrixProduct2C from
-// entropy_coding.c file.
-void WebRtcIsacfix_MatrixProduct2MIPS(const int16_t matrix0[],
-                                      const int32_t matrix1[],
-                                      int32_t matrix_product[],
-                                      const int matrix0_index_factor,
-                                      const int matrix0_index_step) {
-  int j = 0, n = 0;
-  int loop_count = SUBFRAMES;
-  const int16_t* matrix0_ptr;
-  const int32_t* matrix1_ptr;
-  const int16_t* matrix0_start = matrix0;
-  const int matrix0_step = 2 * matrix0_index_step;
-  const int matrix0_step2 = 2 * matrix0_index_factor;
-  int32_t r0, r1, r2, r3, r4, sum32, sum32_2;
-
-  __asm __volatile (
-    ".set       push                                                   \n\t"
-    ".set       noreorder                                              \n\t"
-    "addu       %[j],              %[loop_count],     $0               \n\t"
-    "addu       %[matrix0_start],  %[matrix0],        $0               \n\t"
-   "1:                                                                 \n\t"
-    "addu       %[matrix1_ptr],    %[matrix1],        $0               \n\t"
-    "addu       %[matrix0_ptr],    %[matrix0_start],  $0               \n\t"
-    "addu       %[n],              %[loop_count],     $0               \n\t"
-    "mul        %[sum32],          $0,                $0               \n\t"
-    "mul        %[sum32_2],        $0,                $0               \n\t"
-   "2:                                                                 \n\t"
-    "lw         %[r0],             0(%[matrix1_ptr])                   \n\t"
-    "lw         %[r1],             4(%[matrix1_ptr])                   \n\t"
-    "lh         %[r2],             0(%[matrix0_ptr])                   \n\t"
-    "andi       %[r3],             %[r0],             0xffff           \n\t"
-    "sra        %[r3],             %[r3],             1                \n\t"
-    "mul        %[r3],             %[r3],             %[r2]            \n\t"
-    "andi       %[r4],             %[r1],             0xffff           \n\t"
-    "sra        %[r4],             %[r4],             1                \n\t"
-    "mul        %[r4],             %[r4],             %[r2]            \n\t"
-    "sra        %[r0],             %[r0],             16               \n\t"
-    "mul        %[r0],             %[r0],             %[r2]            \n\t"
-    "sra        %[r1],             %[r1],             16               \n\t"
-    "mul        %[r1],             %[r1],             %[r2]            \n\t"
-#if defined(MIPS_DSP_R1_LE)
-    "shra_r.w   %[r3],             %[r3],             15               \n\t"
-    "shra_r.w   %[r4],             %[r4],             15               \n\t"
-#else
-    "addiu      %[r3],             %[r3],             0x4000           \n\t"
-    "sra        %[r3],             %[r3],             15               \n\t"
-    "addiu      %[r4],             %[r4],             0x4000           \n\t"
-    "sra        %[r4],             %[r4],             15               \n\t"
-#endif
-    "addiu      %[matrix1_ptr],    %[matrix1_ptr],    8                \n\t"
-    "addu       %[matrix0_ptr],    %[matrix0_ptr],    %[matrix0_step]  \n\t"
-    "addiu      %[n],              %[n],              -1               \n\t"
-    "addu       %[sum32],          %[sum32],          %[r3]            \n\t"
-    "addu       %[sum32_2],        %[sum32_2],        %[r4]            \n\t"
-    "addu       %[sum32],          %[sum32],          %[r0]            \n\t"
-    "bgtz       %[n],              2b                                  \n\t"
-    " addu      %[sum32_2],        %[sum32_2],        %[r1]            \n\t"
-    "sra        %[sum32],          %[sum32],          3                \n\t"
-    "sra        %[sum32_2],        %[sum32_2],        3                \n\t"
-    "addiu      %[j],              %[j],              -1               \n\t"
-    "addu       %[matrix0_start],  %[matrix0_start],  %[matrix0_step2] \n\t"
-    "sw         %[sum32],          0(%[matrix_product])                \n\t"
-    "sw         %[sum32_2],        4(%[matrix_product])                \n\t"
-    "bgtz       %[j],              1b                                  \n\t"
-    " addiu     %[matrix_product], %[matrix_product], 8                \n\t"
-    ".set       pop                                                    \n\t"
-    : [j] "=&r" (j), [matrix0_start] "=&r" (matrix0_start),
-      [matrix1_ptr] "=&r" (matrix1_ptr), [matrix0_ptr] "=&r" (matrix0_ptr),
-      [n] "=&r" (n), [sum32] "=&r" (sum32), [sum32_2] "=&r" (sum32_2),
-      [r0] "=&r" (r0), [r1] "=&r" (r1), [r2] "=&r" (r2), [r3] "=&r" (r3),
-      [r4] "=&r" (r4), [matrix_product] "+r" (matrix_product)
-    : [loop_count] "r" (loop_count), [matrix0] "r" (matrix0),
-      [matrix1] "r" (matrix1), [matrix0_step] "r" (matrix0_step),
-      [matrix0_step2] "r" (matrix0_step2)
-    : "hi", "lo", "memory"
-  );
-}
diff --git a/modules/audio_coding/codecs/isac/fix/source/entropy_coding_neon.c b/modules/audio_coding/codecs/isac/fix/source/entropy_coding_neon.c
deleted file mode 100644
index 20437e5..0000000
--- a/modules/audio_coding/codecs/isac/fix/source/entropy_coding_neon.c
+++ /dev/null
@@ -1,218 +0,0 @@
-/*
- *  Copyright (c) 2013 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.
- */
-
-/* This file contains WebRtcIsacfix_MatrixProduct1Neon() and
- * WebRtcIsacfix_MatrixProduct2Neon() for ARM Neon platform. API's are in
- * entropy_coding.c. Results are bit exact with the c code for
- * generic platforms.
- */
-
-#include "entropy_coding.h"
-
-#include <arm_neon.h>
-#include <stddef.h>
-
-#include "signal_processing_library.h"
-#include "webrtc/rtc_base/checks.h"
-
-void WebRtcIsacfix_MatrixProduct1Neon(const int16_t matrix0[],
-                                      const int32_t matrix1[],
-                                      int32_t matrix_product[],
-                                      const int matrix1_index_factor1,
-                                      const int matrix0_index_factor1,
-                                      const int matrix1_index_init_case,
-                                      const int matrix1_index_step,
-                                      const int matrix0_index_step,
-                                      const int inner_loop_count,
-                                      const int mid_loop_count,
-                                      const int shift) {
-  int j = 0, k = 0, n = 0;
-  int matrix1_index = 0, matrix0_index = 0, matrix_prod_index = 0;
-  int* matrix1_index_factor2 = &j;
-  int* matrix0_index_factor2 = &k;
-  if (matrix1_index_init_case != 0) {
-    matrix1_index_factor2 = &k;
-    matrix0_index_factor2 = &j;
-  }
-  int32x4_t shift32x4 = vdupq_n_s32(shift);
-  int32x2_t shift32x2 = vdup_n_s32(shift);
-  int32x4_t sum_32x4 =  vdupq_n_s32(0);
-  int32x2_t sum_32x2 =  vdup_n_s32(0);
-
-  RTC_DCHECK_EQ(0, inner_loop_count % 2);
-  RTC_DCHECK_EQ(0, mid_loop_count % 2);
-
-  if (matrix1_index_init_case != 0 && matrix1_index_factor1 == 1) {
-    for (j = 0; j < SUBFRAMES; j++) {
-      matrix_prod_index = mid_loop_count * j;
-      for (k = 0; k < (mid_loop_count >> 2) << 2; k += 4) {
-        sum_32x4 = veorq_s32(sum_32x4, sum_32x4);  // Initialize to zeros.
-        matrix1_index = k;
-        matrix0_index = matrix0_index_factor1 * j;
-        for (n = 0; n < inner_loop_count; n++) {
-          int32x4_t matrix0_32x4 =
-              vdupq_n_s32((int32_t)(matrix0[matrix0_index]) << 15);
-          int32x4_t matrix1_32x4 =
-              vshlq_s32(vld1q_s32(&matrix1[matrix1_index]), shift32x4);
-          int32x4_t multi_32x4 = vqdmulhq_s32(matrix0_32x4, matrix1_32x4);
-          sum_32x4 = vqaddq_s32(sum_32x4, multi_32x4);
-          matrix1_index += matrix1_index_step;
-          matrix0_index += matrix0_index_step;
-        }
-        vst1q_s32(&matrix_product[matrix_prod_index], sum_32x4);
-        matrix_prod_index += 4;
-      }
-      if (mid_loop_count % 4 > 1) {
-        sum_32x2 = veor_s32(sum_32x2, sum_32x2);  // Initialize to zeros.
-        matrix1_index = k;
-        k += 2;
-        matrix0_index = matrix0_index_factor1 * j;
-        for (n = 0; n < inner_loop_count; n++) {
-          int32x2_t matrix0_32x2 =
-              vdup_n_s32((int32_t)(matrix0[matrix0_index]) << 15);
-          int32x2_t matrix1_32x2 =
-              vshl_s32(vld1_s32(&matrix1[matrix1_index]), shift32x2);
-          int32x2_t multi_32x2 = vqdmulh_s32(matrix0_32x2, matrix1_32x2);
-          sum_32x2 = vqadd_s32(sum_32x2, multi_32x2);
-          matrix1_index += matrix1_index_step;
-          matrix0_index += matrix0_index_step;
-        }
-        vst1_s32(&matrix_product[matrix_prod_index], sum_32x2);
-        matrix_prod_index += 2;
-      }
-    }
-  }
-  else if (matrix1_index_init_case == 0 && matrix0_index_factor1 == 1) {
-    int32x2_t multi_32x2 = vdup_n_s32(0);
-    int32x2_t matrix0_32x2 = vdup_n_s32(0);
-    for (j = 0; j < SUBFRAMES; j++) {
-      matrix_prod_index = mid_loop_count * j;
-      for (k = 0; k < (mid_loop_count >> 2) << 2; k += 4) {
-        sum_32x4 = veorq_s32(sum_32x4, sum_32x4);  // Initialize to zeros.
-        matrix1_index = matrix1_index_factor1 * j;
-        matrix0_index = k;
-        for (n = 0; n < inner_loop_count; n++) {
-          int32x4_t matrix1_32x4 = vdupq_n_s32(matrix1[matrix1_index] << shift);
-          int32x4_t matrix0_32x4 =
-              vshll_n_s16(vld1_s16(&matrix0[matrix0_index]), 15);
-          int32x4_t multi_32x4 = vqdmulhq_s32(matrix0_32x4, matrix1_32x4);
-          sum_32x4 = vqaddq_s32(sum_32x4, multi_32x4);
-          matrix1_index += matrix1_index_step;
-          matrix0_index += matrix0_index_step;
-        }
-        vst1q_s32(&matrix_product[matrix_prod_index], sum_32x4);
-        matrix_prod_index += 4;
-      }
-      if (mid_loop_count % 4 > 1) {
-        sum_32x2 = veor_s32(sum_32x2, sum_32x2);  // Initialize to zeros.
-        matrix1_index = matrix1_index_factor1 * j;
-        matrix0_index = k;
-        for (n = 0; n < inner_loop_count; n++) {
-          int32x2_t matrix1_32x2 = vdup_n_s32(matrix1[matrix1_index] << shift);
-          matrix0_32x2 =
-              vset_lane_s32((int32_t)matrix0[matrix0_index], matrix0_32x2, 0);
-          matrix0_32x2 = vset_lane_s32((int32_t)matrix0[matrix0_index + 1],
-                                     matrix0_32x2, 1);
-          matrix0_32x2 = vshl_n_s32(matrix0_32x2, 15);
-          multi_32x2 = vqdmulh_s32(matrix1_32x2, matrix0_32x2);
-          sum_32x2 = vqadd_s32(sum_32x2, multi_32x2);
-          matrix1_index += matrix1_index_step;
-          matrix0_index += matrix0_index_step;
-        }
-        vst1_s32(&matrix_product[matrix_prod_index], sum_32x2);
-        matrix_prod_index += 2;
-      }
-    }
-  }
-  else if (matrix1_index_init_case == 0 &&
-           matrix1_index_step == 1 &&
-           matrix0_index_step == 1) {
-    int32x2_t multi_32x2 = vdup_n_s32(0);
-    int32x2_t matrix0_32x2 = vdup_n_s32(0);
-    for (j = 0; j < SUBFRAMES; j++) {
-      matrix_prod_index = mid_loop_count * j;
-      for (k = 0; k < mid_loop_count; k++) {
-        sum_32x4 = veorq_s32(sum_32x4, sum_32x4);  // Initialize to zeros.
-        matrix1_index = matrix1_index_factor1 * j;
-        matrix0_index = matrix0_index_factor1 * k;
-        for (n = 0; n < (inner_loop_count >> 2) << 2; n += 4) {
-          int32x4_t matrix1_32x4 =
-              vshlq_s32(vld1q_s32(&matrix1[matrix1_index]), shift32x4);
-          int32x4_t matrix0_32x4 =
-              vshll_n_s16(vld1_s16(&matrix0[matrix0_index]), 15);
-          int32x4_t multi_32x4 = vqdmulhq_s32(matrix0_32x4, matrix1_32x4);
-          sum_32x4 = vqaddq_s32(sum_32x4, multi_32x4);
-          matrix1_index += 4;
-          matrix0_index += 4;
-        }
-        sum_32x2 = vqadd_s32(vget_low_s32(sum_32x4), vget_high_s32(sum_32x4));
-        if (inner_loop_count % 4 > 1) {
-          int32x2_t matrix1_32x2 =
-              vshl_s32(vld1_s32(&matrix1[matrix1_index]), shift32x2);
-          matrix0_32x2 =
-              vset_lane_s32((int32_t)matrix0[matrix0_index], matrix0_32x2, 0);
-          matrix0_32x2 = vset_lane_s32((int32_t)matrix0[matrix0_index + 1],
-                                     matrix0_32x2, 1);
-          matrix0_32x2 = vshl_n_s32(matrix0_32x2, 15);
-          multi_32x2 = vqdmulh_s32(matrix1_32x2, matrix0_32x2);
-          sum_32x2 = vqadd_s32(sum_32x2, multi_32x2);
-        }
-        sum_32x2 = vpadd_s32(sum_32x2, sum_32x2);
-        vst1_lane_s32(&matrix_product[matrix_prod_index], sum_32x2, 0);
-        matrix_prod_index++;
-      }
-    }
-  }
-  else {
-    for (j = 0; j < SUBFRAMES; j++) {
-      matrix_prod_index = mid_loop_count * j;
-      for (k=0; k < mid_loop_count; k++) {
-        int32_t sum32 = 0;
-        matrix1_index = matrix1_index_factor1 * (*matrix1_index_factor2);
-        matrix0_index = matrix0_index_factor1 * (*matrix0_index_factor2);
-        for (n = 0; n < inner_loop_count; n++) {
-          sum32 += (WEBRTC_SPL_MUL_16_32_RSFT16(matrix0[matrix0_index],
-              matrix1[matrix1_index] << shift));
-          matrix1_index += matrix1_index_step;
-          matrix0_index += matrix0_index_step;
-        }
-        matrix_product[matrix_prod_index] = sum32;
-        matrix_prod_index++;
-      }
-    }
-  }
-}
-
-void WebRtcIsacfix_MatrixProduct2Neon(const int16_t matrix0[],
-                                      const int32_t matrix1[],
-                                      int32_t matrix_product[],
-                                      const int matrix0_index_factor,
-                                      const int matrix0_index_step) {
-  int j = 0, n = 0;
-  int matrix1_index = 0, matrix0_index = 0, matrix_prod_index = 0;
-  int32x2_t sum_32x2 = vdup_n_s32(0);
-  for (j = 0; j < SUBFRAMES; j++) {
-    sum_32x2 = veor_s32(sum_32x2, sum_32x2);  // Initialize to zeros.
-    matrix1_index = 0;
-    matrix0_index = matrix0_index_factor * j;
-    for (n = SUBFRAMES; n > 0; n--) {
-      int32x2_t matrix0_32x2 =
-          vdup_n_s32((int32_t)(matrix0[matrix0_index]) << 15);
-      int32x2_t matrix1_32x2 = vld1_s32(&matrix1[matrix1_index]);
-      int32x2_t multi_32x2 = vqdmulh_s32(matrix0_32x2, matrix1_32x2);
-      sum_32x2 = vqadd_s32(sum_32x2, multi_32x2);
-      matrix1_index += 2;
-      matrix0_index += matrix0_index_step;
-    }
-    sum_32x2 = vshr_n_s32(sum_32x2, 3);
-    vst1_s32(&matrix_product[matrix_prod_index], sum_32x2);
-    matrix_prod_index += 2;
-  }
-}
diff --git a/modules/audio_coding/codecs/isac/fix/source/fft.c b/modules/audio_coding/codecs/isac/fix/source/fft.c
deleted file mode 100644
index 21566f1..0000000
--- a/modules/audio_coding/codecs/isac/fix/source/fft.c
+++ /dev/null
@@ -1,415 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/*
- * fft.c
- *
- * Fast Fourier Transform
- *
- */
-
-
-#include "fft.h"
-
-static const int16_t kSortTabFft[240] = {
-  0, 60, 120, 180, 20, 80, 140, 200, 40, 100, 160, 220,
-  4, 64, 124, 184, 24, 84, 144, 204, 44, 104, 164, 224,
-  8, 68, 128, 188, 28, 88, 148, 208, 48, 108, 168, 228,
-  12, 72, 132, 192, 32, 92, 152, 212, 52, 112, 172, 232,
-  16, 76, 136, 196, 36, 96, 156, 216, 56, 116, 176, 236,
-  1, 61, 121, 181, 21, 81, 141, 201, 41, 101, 161, 221,
-  5, 65, 125, 185, 25, 85, 145, 205, 45, 105, 165, 225,
-  9, 69, 129, 189, 29, 89, 149, 209, 49, 109, 169, 229,
-  13, 73, 133, 193, 33, 93, 153, 213, 53, 113, 173, 233,
-  17, 77, 137, 197, 37, 97, 157, 217, 57, 117, 177, 237,
-  2, 62, 122, 182, 22, 82, 142, 202, 42, 102, 162, 222,
-  6, 66, 126, 186, 26, 86, 146, 206, 46, 106, 166, 226,
-  10, 70, 130, 190, 30, 90, 150, 210, 50, 110, 170, 230,
-  14, 74, 134, 194, 34, 94, 154, 214, 54, 114, 174, 234,
-  18, 78, 138, 198, 38, 98, 158, 218, 58, 118, 178, 238,
-  3, 63, 123, 183, 23, 83, 143, 203, 43, 103, 163, 223,
-  7, 67, 127, 187, 27, 87, 147, 207, 47, 107, 167, 227,
-  11, 71, 131, 191, 31, 91, 151, 211, 51, 111, 171, 231,
-  15, 75, 135, 195, 35, 95, 155, 215, 55, 115, 175, 235,
-  19, 79, 139, 199, 39, 99, 159, 219, 59, 119, 179, 239
-};
-
-/* Cosine table in Q14 */
-static const int16_t kCosTabFfftQ14[240] = {
-  16384,  16378, 16362,   16333,  16294,  16244,  16182,  16110,  16026,  15931,  15826,  15709,
-  15582,  15444, 15296,   15137,  14968,  14788,  14598,  14399,  14189,  13970,  13741,  13502,
-  13255,  12998, 12733,   12458,  12176,  11885,  11585,  11278,  10963,  10641,  10311,   9974,
-  9630,   9280,  8923,    8561,   8192,   7818,   7438,   7053,   6664,   6270,   5872,   5469,
-  5063,   4653,  4240,    3825,   3406,   2986,   2563,   2139,   1713,   1285,    857,    429,
-  0,   -429,  -857,   -1285,  -1713,  -2139,  -2563,  -2986,  -3406,  -3825,  -4240,  -4653,
-  -5063,  -5469, -5872,   -6270,  -6664,  -7053,  -7438,  -7818,  -8192,  -8561,  -8923,  -9280,
-  -9630,  -9974, -10311, -10641, -10963, -11278, -11585, -11885, -12176, -12458, -12733, -12998,
-  -13255, -13502, -13741, -13970, -14189, -14399, -14598, -14788, -14968, -15137, -15296, -15444,
-  -15582, -15709, -15826, -15931, -16026, -16110, -16182, -16244, -16294, -16333, -16362, -16378,
-  -16384, -16378, -16362, -16333, -16294, -16244, -16182, -16110, -16026, -15931, -15826, -15709,
-  -15582, -15444, -15296, -15137, -14968, -14788, -14598, -14399, -14189, -13970, -13741, -13502,
-  -13255, -12998, -12733, -12458, -12176, -11885, -11585, -11278, -10963, -10641, -10311,  -9974,
-  -9630,  -9280,  -8923,  -8561,  -8192,  -7818,  -7438,  -7053,  -6664,  -6270,  -5872,  -5469,
-  -5063,  -4653,  -4240,  -3825,  -3406,  -2986,  -2563,  -2139,  -1713,  -1285,   -857,   -429,
-  0,    429,    857,   1285,   1713,   2139,   2563,   2986,   3406,   3825,   4240,   4653,
-  5063,   5469,   5872,   6270,   6664,   7053,   7438,   7818,   8192,   8561,   8923,   9280,
-  9630,   9974,  10311,  10641,  10963,  11278,  11585,  11885,  12176,  12458,  12733,  12998,
-  13255,  13502,  13741,  13970,  14189,  14399,  14598,  14788,  14968,  15137,  15296,  15444,
-  15582,  15709,  15826,  15931,  16026,  16110,  16182,  16244,  16294,  16333,  16362,  16378
-};
-
-
-
-/* Uses 16x16 mul, without rounding, which is faster. Uses WEBRTC_SPL_MUL_16_16_RSFT */
-int16_t WebRtcIsacfix_FftRadix16Fastest(int16_t RexQx[], int16_t ImxQx[], int16_t iSign) {
-
-  int16_t dd, ee, ff, gg, hh, ii;
-  int16_t k0, k1, k2, k3, k4, kk;
-  int16_t tmp116, tmp216;
-
-  int16_t ccc1Q14, ccc2Q14, ccc3Q14, sss1Q14, sss2Q14, sss3Q14;
-  int16_t sss60Q14, ccc72Q14, sss72Q14;
-  int16_t aaQx, ajQx, akQx, ajmQx, ajpQx, akmQx, akpQx;
-  int16_t bbQx, bjQx, bkQx, bjmQx, bjpQx, bkmQx, bkpQx;
-
-  int16_t ReDATAQx[240],  ImDATAQx[240];
-
-  sss60Q14 = kCosTabFfftQ14[20];
-  ccc72Q14 = kCosTabFfftQ14[48];
-  sss72Q14 = kCosTabFfftQ14[12];
-
-  if (iSign < 0) {
-    sss72Q14 = -sss72Q14;
-    sss60Q14 = -sss60Q14;
-  }
-  /* Complexity is: 10 cycles */
-
-  /* compute fourier transform */
-
-  // transform for factor of 4
-  for (kk=0; kk<60; kk++) {
-    k0 = kk;
-    k1 = k0 + 60;
-    k2 = k1 + 60;
-    k3 = k2 + 60;
-
-    akpQx = RexQx[k0] + RexQx[k2];
-    akmQx = RexQx[k0] - RexQx[k2];
-    ajpQx = RexQx[k1] + RexQx[k3];
-    ajmQx = RexQx[k1] - RexQx[k3];
-    bkpQx = ImxQx[k0] + ImxQx[k2];
-    bkmQx = ImxQx[k0] - ImxQx[k2];
-    bjpQx = ImxQx[k1] + ImxQx[k3];
-    bjmQx = ImxQx[k1] - ImxQx[k3];
-
-    RexQx[k0] = akpQx + ajpQx;
-    ImxQx[k0] = bkpQx + bjpQx;
-    ajpQx = akpQx - ajpQx;
-    bjpQx = bkpQx - bjpQx;
-    if (iSign < 0) {
-      akpQx = akmQx + bjmQx;
-      bkpQx = bkmQx - ajmQx;
-      akmQx -= bjmQx;
-      bkmQx += ajmQx;
-    } else {
-      akpQx = akmQx - bjmQx;
-      bkpQx = bkmQx + ajmQx;
-      akmQx += bjmQx;
-      bkmQx -= ajmQx;
-    }
-
-    ccc1Q14 = kCosTabFfftQ14[kk];
-    ccc2Q14 = kCosTabFfftQ14[2 * kk];
-    ccc3Q14 = kCosTabFfftQ14[3 * kk];
-    sss1Q14 = kCosTabFfftQ14[kk + 60];
-    sss2Q14 = kCosTabFfftQ14[2 * kk + 60];
-    sss3Q14 = kCosTabFfftQ14[3 * kk + 60];
-    if (iSign==1) {
-      sss1Q14 = -sss1Q14;
-      sss2Q14 = -sss2Q14;
-      sss3Q14 = -sss3Q14;
-    }
-
-    //Do several multiplications like Q14*Q16>>14 = Q16
-    // RexQ16[k1] = akpQ16 * ccc1Q14 - bkpQ16 * sss1Q14;
-    // RexQ16[k2] = ajpQ16 * ccc2Q14 - bjpQ16 * sss2Q14;
-    // RexQ16[k3] = akmQ16 * ccc3Q14 - bkmQ16 * sss3Q14;
-    // ImxQ16[k1] = akpQ16 * sss1Q14 + bkpQ16 * ccc1Q14;
-    // ImxQ16[k2] = ajpQ16 * sss2Q14 + bjpQ16 * ccc2Q14;
-    // ImxQ16[k3] = akmQ16 * sss3Q14 + bkmQ16 * ccc3Q14;
-
-    RexQx[k1] = (int16_t)WEBRTC_SPL_MUL_16_16_RSFT(ccc1Q14, akpQx, 14) -
-        (int16_t)WEBRTC_SPL_MUL_16_16_RSFT(sss1Q14, bkpQx, 14); // 6 non-mul + 2 mul cycles, i.e. 8 cycles (6+2*7=20 cycles if 16x32mul)
-    RexQx[k2] = (int16_t)WEBRTC_SPL_MUL_16_16_RSFT(ccc2Q14, ajpQx, 14) -
-        (int16_t)WEBRTC_SPL_MUL_16_16_RSFT(sss2Q14, bjpQx, 14);
-    RexQx[k3] = (int16_t)WEBRTC_SPL_MUL_16_16_RSFT(ccc3Q14, akmQx, 14) -
-        (int16_t)WEBRTC_SPL_MUL_16_16_RSFT(sss3Q14, bkmQx, 14);
-    ImxQx[k1] = (int16_t)WEBRTC_SPL_MUL_16_16_RSFT(sss1Q14, akpQx, 14) +
-        (int16_t)WEBRTC_SPL_MUL_16_16_RSFT(ccc1Q14, bkpQx, 14);
-    ImxQx[k2] = (int16_t)WEBRTC_SPL_MUL_16_16_RSFT(sss2Q14, ajpQx, 14) +
-        (int16_t)WEBRTC_SPL_MUL_16_16_RSFT(ccc2Q14, bjpQx, 14);
-    ImxQx[k3] = (int16_t)WEBRTC_SPL_MUL_16_16_RSFT(sss3Q14, akmQx, 14) +
-        (int16_t)WEBRTC_SPL_MUL_16_16_RSFT(ccc3Q14, bkmQx, 14);
-    //This mul segment needs 6*8 = 48 cycles for 16x16 muls, but 6*20 = 120 cycles for 16x32 muls
-
-
-  }
-  /* Complexity is: 51+48 = 99 cycles for 16x16 muls, but 51+120 = 171 cycles for 16x32 muls*/
-
-  // transform for factor of 3
-  kk=0;
-  k1=20;
-  k2=40;
-
-  for (hh=0; hh<4; hh++) {
-    for (ii=0; ii<20; ii++) {
-      akQx = RexQx[kk];
-      bkQx = ImxQx[kk];
-      ajQx = RexQx[k1] + RexQx[k2];
-      bjQx = ImxQx[k1] + ImxQx[k2];
-      RexQx[kk] = akQx + ajQx;
-      ImxQx[kk] = bkQx + bjQx;
-      tmp116 = ajQx >> 1;
-      tmp216 = bjQx >> 1;
-      akQx = akQx - tmp116;
-      bkQx = bkQx - tmp216;
-      tmp116 = RexQx[k1] - RexQx[k2];
-      tmp216 = ImxQx[k1] - ImxQx[k2];
-
-      ajQx = (int16_t)WEBRTC_SPL_MUL_16_16_RSFT(sss60Q14, tmp116, 14); // Q14*Qx>>14 = Qx
-      bjQx = (int16_t)WEBRTC_SPL_MUL_16_16_RSFT(sss60Q14, tmp216, 14); // Q14*Qx>>14 = Qx
-      RexQx[k1] = akQx - bjQx;
-      RexQx[k2] = akQx + bjQx;
-      ImxQx[k1] = bkQx + ajQx;
-      ImxQx[k2] = bkQx - ajQx;
-
-      kk++;
-      k1++;
-      k2++;
-    }
-    /* Complexity : (31+6)*20 = 740 cycles for 16x16 muls, but (31+18)*20 = 980 cycles for 16x32 muls*/
-    kk=kk+40;
-    k1=k1+40;
-    k2=k2+40;
-  }
-  /* Complexity : 4*(740+3) = 2972 cycles for 16x16 muls, but 4*(980+3) = 3932 cycles for 16x32 muls*/
-
-  /* multiply by rotation factor for odd factor 3 or 5 (not for 4)
-     Same code (duplicated) for both ii=2 and ii=3 */
-  kk = 1;
-  ee = 0;
-  ff = 0;
-
-  for (gg=0; gg<19; gg++) {
-    kk += 20;
-    ff = ff+4;
-    for (hh=0; hh<2; hh++) {
-      ee = ff + hh * ff;
-      dd = ee + 60;
-      ccc2Q14 = kCosTabFfftQ14[ee];
-      sss2Q14 = kCosTabFfftQ14[dd];
-      if (iSign==1) {
-        sss2Q14 = -sss2Q14;
-      }
-      for (ii=0; ii<4; ii++) {
-        akQx = RexQx[kk];
-        bkQx = ImxQx[kk];
-        RexQx[kk] = (int16_t)WEBRTC_SPL_MUL_16_16_RSFT(ccc2Q14, akQx, 14) - // Q14*Qx>>14 = Qx
-            (int16_t)WEBRTC_SPL_MUL_16_16_RSFT(sss2Q14, bkQx, 14);
-        ImxQx[kk] = (int16_t)WEBRTC_SPL_MUL_16_16_RSFT(sss2Q14, akQx, 14) + // Q14*Qx>>14 = Qx
-            (int16_t)WEBRTC_SPL_MUL_16_16_RSFT(ccc2Q14, bkQx, 14);
-
-
-        kk += 60;
-      }
-      kk = kk - 220;
-    }
-    // Complexity: 2*(13+5+4*13+2) = 144 for 16x16 muls, but 2*(13+5+4*33+2) = 304 cycles for 16x32 muls
-    kk = kk - 59;
-  }
-  // Complexity: 19*144 = 2736 for 16x16 muls, but 19*304 = 5776 cycles for 16x32 muls
-
-  // transform for factor of 5
-  kk = 0;
-  ccc2Q14 = kCosTabFfftQ14[96];
-  sss2Q14 = kCosTabFfftQ14[84];
-  if (iSign==1) {
-    sss2Q14 = -sss2Q14;
-  }
-
-  for (hh=0; hh<4; hh++) {
-    for (ii=0; ii<12; ii++) {
-      k1 = kk + 4;
-      k2 = k1 + 4;
-      k3 = k2 + 4;
-      k4 = k3 + 4;
-
-      akpQx = RexQx[k1] + RexQx[k4];
-      akmQx = RexQx[k1] - RexQx[k4];
-      bkpQx = ImxQx[k1] + ImxQx[k4];
-      bkmQx = ImxQx[k1] - ImxQx[k4];
-      ajpQx = RexQx[k2] + RexQx[k3];
-      ajmQx = RexQx[k2] - RexQx[k3];
-      bjpQx = ImxQx[k2] + ImxQx[k3];
-      bjmQx = ImxQx[k2] - ImxQx[k3];
-      aaQx = RexQx[kk];
-      bbQx = ImxQx[kk];
-      RexQx[kk] = aaQx + akpQx + ajpQx;
-      ImxQx[kk] = bbQx + bkpQx + bjpQx;
-
-      akQx = (int16_t)WEBRTC_SPL_MUL_16_16_RSFT(ccc72Q14, akpQx, 14) +
-          (int16_t)WEBRTC_SPL_MUL_16_16_RSFT(ccc2Q14, ajpQx, 14)  + aaQx;
-      bkQx = (int16_t)WEBRTC_SPL_MUL_16_16_RSFT(ccc72Q14, bkpQx, 14) +
-          (int16_t)WEBRTC_SPL_MUL_16_16_RSFT(ccc2Q14, bjpQx, 14)  + bbQx;
-      ajQx = (int16_t)WEBRTC_SPL_MUL_16_16_RSFT(sss72Q14, akmQx, 14) +
-          (int16_t)WEBRTC_SPL_MUL_16_16_RSFT(sss2Q14, ajmQx, 14);
-      bjQx = (int16_t)WEBRTC_SPL_MUL_16_16_RSFT(sss72Q14, bkmQx, 14) +
-          (int16_t)WEBRTC_SPL_MUL_16_16_RSFT(sss2Q14, bjmQx, 14);
-      // 32+4*8=64 or 32+4*20=112
-
-      RexQx[k1] = akQx - bjQx;
-      RexQx[k4] = akQx + bjQx;
-      ImxQx[k1] = bkQx + ajQx;
-      ImxQx[k4] = bkQx - ajQx;
-
-      akQx = (int16_t)WEBRTC_SPL_MUL_16_16_RSFT(ccc2Q14, akpQx, 14)  +
-          (int16_t)WEBRTC_SPL_MUL_16_16_RSFT(ccc72Q14, ajpQx, 14) + aaQx;
-      bkQx = (int16_t)WEBRTC_SPL_MUL_16_16_RSFT(ccc2Q14, bkpQx, 14)  +
-          (int16_t)WEBRTC_SPL_MUL_16_16_RSFT(ccc72Q14, bjpQx, 14) + bbQx;
-      ajQx = (int16_t)WEBRTC_SPL_MUL_16_16_RSFT(sss2Q14, akmQx, 14) -
-          (int16_t)WEBRTC_SPL_MUL_16_16_RSFT(sss72Q14, ajmQx, 14);
-      bjQx = (int16_t)WEBRTC_SPL_MUL_16_16_RSFT(sss2Q14, bkmQx, 14) -
-          (int16_t)WEBRTC_SPL_MUL_16_16_RSFT(sss72Q14, bjmQx, 14);
-      // 8+4*8=40 or 8+4*20=88
-
-      RexQx[k2] = akQx - bjQx;
-      RexQx[k3] = akQx + bjQx;
-      ImxQx[k2] = bkQx + ajQx;
-      ImxQx[k3] = bkQx - ajQx;
-
-      kk = k4 + 4;
-    }
-    // Complexity: 12*(64+40+10) = 1368 for 16x16 muls, but 12*(112+88+10) = 2520 cycles for 16x32 muls
-    kk -= 239;
-  }
-  // Complexity: 4*1368 = 5472 for 16x16 muls, but 4*2520 = 10080 cycles for 16x32 muls
-
-  /* multiply by rotation factor for odd factor 3 or 5 (not for 4)
-     Same code (duplicated) for both ii=2 and ii=3 */
-  kk = 1;
-  ee=0;
-
-  for (gg=0; gg<3; gg++) {
-    kk += 4;
-    dd = 12 + 12 * gg;
-    ff = 0;
-    for (hh=0; hh<4; hh++) {
-      ff = ff+dd;
-      ee = ff+60;
-      for (ii=0; ii<12; ii++) {
-        akQx = RexQx[kk];
-        bkQx = ImxQx[kk];
-
-        ccc2Q14 = kCosTabFfftQ14[ff];
-        sss2Q14 = kCosTabFfftQ14[ee];
-
-        if (iSign==1) {
-          sss2Q14 = -sss2Q14;
-        }
-
-        RexQx[kk] = (int16_t)WEBRTC_SPL_MUL_16_16_RSFT(ccc2Q14, akQx, 14) -
-            (int16_t)WEBRTC_SPL_MUL_16_16_RSFT(sss2Q14, bkQx, 14);
-        ImxQx[kk] = (int16_t)WEBRTC_SPL_MUL_16_16_RSFT(sss2Q14, akQx, 14) +
-            (int16_t)WEBRTC_SPL_MUL_16_16_RSFT(ccc2Q14, bkQx, 14);
-
-        kk += 20;
-      }
-      kk = kk - 236;
-      // Complexity: 12*(12+12) = 288 for 16x16 muls, but 12*(12+32) = 528 cycles for 16x32 muls
-    }
-    kk = kk - 19;
-    // Complexity: 4*288+6 for 16x16 muls, but 4*528+6 cycles for 16x32 muls
-  }
-  // Complexity: 3*4*288+6 = 3462 for 16x16 muls, but 3*4*528+6 = 6342 cycles for 16x32 muls
-
-
-  // last transform for factor of 4 */
-  for (kk=0; kk<240; kk=kk+4) {
-    k1 = kk + 1;
-    k2 = k1 + 1;
-    k3 = k2 + 1;
-
-    akpQx = RexQx[kk] + RexQx[k2];
-    akmQx = RexQx[kk] - RexQx[k2];
-    ajpQx = RexQx[k1] + RexQx[k3];
-    ajmQx = RexQx[k1] - RexQx[k3];
-    bkpQx = ImxQx[kk] + ImxQx[k2];
-    bkmQx = ImxQx[kk] - ImxQx[k2];
-    bjpQx = ImxQx[k1] + ImxQx[k3];
-    bjmQx = ImxQx[k1] - ImxQx[k3];
-    RexQx[kk] = akpQx + ajpQx;
-    ImxQx[kk] = bkpQx + bjpQx;
-    ajpQx = akpQx - ajpQx;
-    bjpQx = bkpQx - bjpQx;
-    if (iSign < 0) {
-      akpQx = akmQx + bjmQx;
-      bkpQx = bkmQx - ajmQx;
-      akmQx -= bjmQx;
-      bkmQx += ajmQx;
-    } else {
-      akpQx = akmQx - bjmQx;
-      bkpQx = bkmQx + ajmQx;
-      akmQx += bjmQx;
-      bkmQx -= ajmQx;
-    }
-    RexQx[k1] = akpQx;
-    RexQx[k2] = ajpQx;
-    RexQx[k3] = akmQx;
-    ImxQx[k1] = bkpQx;
-    ImxQx[k2] = bjpQx;
-    ImxQx[k3] = bkmQx;
-  }
-  // Complexity: 60*45 = 2700 for 16x16 muls, but 60*45 = 2700 cycles for 16x32 muls
-
-  /* permute the results to normal order */
-  for (ii=0; ii<240; ii++) {
-    ReDATAQx[ii]=RexQx[ii];
-    ImDATAQx[ii]=ImxQx[ii];
-  }
-  // Complexity: 240*2=480 cycles
-
-  for (ii=0; ii<240; ii++) {
-    RexQx[ii]=ReDATAQx[kSortTabFft[ii]];
-    ImxQx[ii]=ImDATAQx[kSortTabFft[ii]];
-  }
-  // Complexity: 240*2*2=960 cycles
-
-  // Total complexity:
-  //            16x16 16x32
-  // Complexity:   10    10
-  // Complexity:   99   171
-  // Complexity: 2972  3932
-  // Complexity: 2736  5776
-  // Complexity: 5472 10080
-  // Complexity: 3462  6342
-  // Complexity: 2700  2700
-  // Complexity:  480   480
-  // Complexity:  960   960
-  // =======================
-  //            18891 30451
-  //
-  // If this FFT is called 2 time each frame, i.e. 67 times per second, it will correspond to
-  // a C54 complexity of 67*18891/1000000 = 1.27 MIPS with 16x16-muls, and 67*30451/1000000 =
-  // = 2.04 MIPS with 16x32-muls. Note that this routine somtimes is called 6 times during the
-  // encoding of a frame, i.e. the max complexity would be 7/2*1.27 = 4.4 MIPS for the 16x16 mul case.
-
-
-  return 0;
-}
diff --git a/modules/audio_coding/codecs/isac/fix/source/fft.h b/modules/audio_coding/codecs/isac/fix/source/fft.h
deleted file mode 100644
index dc7cea8..0000000
--- a/modules/audio_coding/codecs/isac/fix/source/fft.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/*--------------------------------*-C-*---------------------------------*
- * File:
- * fft.h
- * ---------------------------------------------------------------------*
- * Re[]: real value array
- * Im[]: imaginary value array
- * nTotal: total number of complex values
- * nPass: number of elements involved in this pass of transform
- * nSpan: nspan/nPass = number of bytes to increment pointer
- *  in Re[] and Im[]
- * isign: exponent: +1 = forward  -1 = reverse
- * scaling: normalizing constant by which the final result is *divided*
- * scaling == -1, normalize by total dimension of the transform
- * scaling <  -1, normalize by the square-root of the total dimension
- *
- * ----------------------------------------------------------------------
- * See the comments in the code for correct usage!
- */
-
-#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_FIX_SOURCE_FFT_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_FIX_SOURCE_FFT_H_
-
-
-#include "structs.h"
-
-
-int16_t WebRtcIsacfix_FftRadix16Fastest(int16_t RexQx[], int16_t ImxQx[], int16_t iSign);
-
-
-
-#endif /* WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_FIX_SOURCE_FFT_H_ */
diff --git a/modules/audio_coding/codecs/isac/fix/source/filterbank_internal.h b/modules/audio_coding/codecs/isac/fix/source/filterbank_internal.h
deleted file mode 100644
index d488339..0000000
--- a/modules/audio_coding/codecs/isac/fix/source/filterbank_internal.h
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- *  Copyright (c) 2012 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_CODECS_ISAC_FIX_SOURCE_FILTERBANK_INTERNAL_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_FIX_SOURCE_FILTERBANK_INTERNAL_H_
-
-#include "webrtc/typedefs.h"
-
-#if defined(__cplusplus) || defined(c_plusplus)
-extern "C" {
-#endif
-
-/* Arguments:
- *   io:  Input/output, in Q0.
- *   len: Input, sample length.
- *   coefficient: Input.
- *   state: Input/output, filter state, in Q4.
- */
-typedef void (*HighpassFilterFixDec32)(int16_t* io,
-                                       int16_t len,
-                                       const int16_t* coefficient,
-                                       int32_t* state);
-extern HighpassFilterFixDec32 WebRtcIsacfix_HighpassFilterFixDec32;
-
-void WebRtcIsacfix_HighpassFilterFixDec32C(int16_t* io,
-                                           int16_t len,
-                                           const int16_t* coefficient,
-                                           int32_t* state);
-
-#if defined(MIPS_DSP_R1_LE)
-void WebRtcIsacfix_HighpassFilterFixDec32MIPS(int16_t* io,
-                                              int16_t len,
-                                              const int16_t* coefficient,
-                                              int32_t* state);
-#endif
-
-typedef void (*AllpassFilter2FixDec16)(
-    int16_t *data_ch1,           // Input and output in channel 1, in Q0
-    int16_t *data_ch2,           // Input and output in channel 2, in Q0
-    const int16_t *factor_ch1,   // Scaling factor for channel 1, in Q15
-    const int16_t *factor_ch2,   // Scaling factor for channel 2, in Q15
-    const int length,            // Length of the data buffers
-    int32_t *filter_state_ch1,   // Filter state for channel 1, in Q16
-    int32_t *filter_state_ch2);  // Filter state for channel 2, in Q16
-extern AllpassFilter2FixDec16 WebRtcIsacfix_AllpassFilter2FixDec16;
-
-void WebRtcIsacfix_AllpassFilter2FixDec16C(
-   int16_t *data_ch1,
-   int16_t *data_ch2,
-   const int16_t *factor_ch1,
-   const int16_t *factor_ch2,
-   const int length,
-   int32_t *filter_state_ch1,
-   int32_t *filter_state_ch2);
-
-#if defined(WEBRTC_HAS_NEON)
-void WebRtcIsacfix_AllpassFilter2FixDec16Neon(
-   int16_t *data_ch1,
-   int16_t *data_ch2,
-   const int16_t *factor_ch1,
-   const int16_t *factor_ch2,
-   const int length,
-   int32_t *filter_state_ch1,
-   int32_t *filter_state_ch2);
-#endif
-
-#if defined(MIPS_DSP_R1_LE)
-void WebRtcIsacfix_AllpassFilter2FixDec16MIPS(
-   int16_t *data_ch1,
-   int16_t *data_ch2,
-   const int16_t *factor_ch1,
-   const int16_t *factor_ch2,
-   const int length,
-   int32_t *filter_state_ch1,
-   int32_t *filter_state_ch2);
-#endif
-
-#if defined(__cplusplus) || defined(c_plusplus)
-}
-#endif
-
-#endif
-/* WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_FIX_SOURCE_FILTERBANK_INTERNAL_H_ */
diff --git a/modules/audio_coding/codecs/isac/fix/source/filterbank_tables.c b/modules/audio_coding/codecs/isac/fix/source/filterbank_tables.c
deleted file mode 100644
index 732611b..0000000
--- a/modules/audio_coding/codecs/isac/fix/source/filterbank_tables.c
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- *  Copyright (c) 2012 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.
- */
-
-/*
- * filterbank_tables.c
- *
- * This file contains variables that are used in
- * filterbanks.c
- *
- */
-
-#include "filterbank_tables.h"
-
-/* HPstcoeff_in_Q14 = {a1, a2, b1 - b0 * a1, b2 - b0 * a2};
- * In float, they are: {-1.94895953203325f, 0.94984516000000f,
- * -0.05101826139794f, 0.05015484000000f};
- */
-const int16_t WebRtcIsacfix_kHpStCoeffInQ30[8] = {
-  16189, -31932,  /* Q30 lo/hi pair */
-  17243, 15562,  /* Q30 lo/hi pair */
-  -17186, -26748,  /* Q35 lo/hi pair */
-  -27476, 26296  /* Q35 lo/hi pair */
-};
-
-/* HPstcoeff_out_1_Q14 = {a1, a2, b1 - b0 * a1, b2 - b0 * a2};
- * In float, they are: {-1.99701049409000f, 0.99714204490000f,
- * 0.01701049409000f, -0.01704204490000f};
- */
-const int16_t WebRtcIsacfix_kHPStCoeffOut1Q30[8] = {
-  -1306, -32719,  /* Q30 lo/hi pair */
-  11486, 16337,  /* Q30 lo/hi pair */
-  26078, 8918,  /* Q35 lo/hi pair */
-  3956, -8935  /* Q35 lo/hi pair */
-};
-
-/* HPstcoeff_out_2_Q14 = {a1, a2, b1 - b0 * a1, b2 - b0 * a2};
- * In float, they are: {-1.98645294509837f, 0.98672435560000f,
- * 0.00645294509837f, -0.00662435560000f};
- */
-const int16_t WebRtcIsacfix_kHPStCoeffOut2Q30[8] = {
-  -2953, -32546,  /* Q30 lo/hi pair */
-  32233, 16166,  /* Q30 lo/hi pair */
-  13217, 3383,  /* Q35 lo/hi pair */
-  -4597, -3473  /* Q35 lo/hi pair */
-};
-
-/* The upper channel all-pass filter factors */
-const int16_t WebRtcIsacfix_kUpperApFactorsQ15[2] = {
-  1137, 12537
-};
-
-/* The lower channel all-pass filter factors */
-const int16_t WebRtcIsacfix_kLowerApFactorsQ15[2] = {
-  5059, 24379
-};
diff --git a/modules/audio_coding/codecs/isac/fix/source/filterbank_tables.h b/modules/audio_coding/codecs/isac/fix/source/filterbank_tables.h
deleted file mode 100644
index c96fb05..0000000
--- a/modules/audio_coding/codecs/isac/fix/source/filterbank_tables.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- *  Copyright (c) 2012 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.
- */
-
-/*
- * filterbank_tables.h
- *
- * Header file for variables that are defined in
- * filterbank_tables.c.
- *
- */
-
-#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_FIX_SOURCE_FILTERBANK_TABLES_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_FIX_SOURCE_FILTERBANK_TABLES_H_
-
-#include "webrtc/typedefs.h"
-
-#if defined(__cplusplus) || defined(c_plusplus)
-extern "C" {
-#endif
-
-/********************* Coefficient Tables ************************/
-
-/* HPstcoeff_in_Q14 = {a1, a2, b1 - b0 * a1, b2 - b0 * a2}; */
-/* [Q30lo Q30hi Q30lo Q30hi Q35lo Q35hi Q35lo Q35hi] */
-extern const int16_t WebRtcIsacfix_kHpStCoeffInQ30[8];
-
-/* HPstcoeff_out_1_Q14 = {a1, a2, b1 - b0 * a1, b2 - b0 * a2}; */
-/* [Q30lo Q30hi Q30lo Q30hi Q35lo Q35hi Q35lo Q35hi] */
-extern const int16_t WebRtcIsacfix_kHPStCoeffOut1Q30[8];
-
-/* HPstcoeff_out_2_Q14 = {a1, a2, b1 - b0 * a1, b2 - b0 * a2}; */
-/* [Q30lo Q30hi Q30lo Q30hi Q35lo Q35hi Q35lo Q35hi] */
-extern const int16_t WebRtcIsacfix_kHPStCoeffOut2Q30[8];
-
-/* The upper channel all-pass filter factors */
-extern const int16_t WebRtcIsacfix_kUpperApFactorsQ15[2];
-
-/* The lower channel all-pass filter factors */
-extern const int16_t WebRtcIsacfix_kLowerApFactorsQ15[2];
-
-#if defined(__cplusplus) || defined(c_plusplus)
-}
-#endif
-
-#endif /* WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_FIX_SOURCE_FILTERBANK_TABLES_H_ */
diff --git a/modules/audio_coding/codecs/isac/fix/source/filterbanks.c b/modules/audio_coding/codecs/isac/fix/source/filterbanks.c
deleted file mode 100644
index bc21617..0000000
--- a/modules/audio_coding/codecs/isac/fix/source/filterbanks.c
+++ /dev/null
@@ -1,421 +0,0 @@
-/*
- *  Copyright (c) 2012 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.
- */
-
-/*
- * filterbanks.c
- *
- * This file contains function 
- * WebRtcIsacfix_SplitAndFilter, and WebRtcIsacfix_FilterAndCombine
- * which implement filterbanks that produce decimated lowpass and
- * highpass versions of a signal, and performs reconstruction.
- *
- */
-
-#include "filterbank_internal.h"
-
-#include "codec.h"
-#include "filterbank_tables.h"
-#include "settings.h"
-#include "webrtc/rtc_base/checks.h"
-
-// Declare a function pointer.
-AllpassFilter2FixDec16 WebRtcIsacfix_AllpassFilter2FixDec16;
-
-void WebRtcIsacfix_AllpassFilter2FixDec16C(
-    int16_t *data_ch1,  // Input and output in channel 1, in Q0
-    int16_t *data_ch2,  // Input and output in channel 2, in Q0
-    const int16_t *factor_ch1,  // Scaling factor for channel 1, in Q15
-    const int16_t *factor_ch2,  // Scaling factor for channel 2, in Q15
-    const int length,  // Length of the data buffers
-    int32_t *filter_state_ch1,  // Filter state for channel 1, in Q16
-    int32_t *filter_state_ch2) {  // Filter state for channel 2, in Q16
-  int n = 0;
-  int32_t state0_ch1 = filter_state_ch1[0], state1_ch1 = filter_state_ch1[1];
-  int32_t state0_ch2 = filter_state_ch2[0], state1_ch2 = filter_state_ch2[1];
-  int16_t in_out = 0;
-  int32_t a = 0, b = 0;
-
-  // Assembly file assumption.
-  RTC_DCHECK_EQ(0, length % 2);
-
-  for (n = 0; n < length; n++) {
-    // Process channel 1:
-    in_out = data_ch1[n];
-    a = factor_ch1[0] * in_out;  // Q15 * Q0 = Q15
-    a *= 1 << 1;  // Q15 -> Q16
-    b = WebRtcSpl_AddSatW32(a, state0_ch1);
-    a = -factor_ch1[0] * (int16_t)(b >> 16);  // Q15
-    state0_ch1 =
-        WebRtcSpl_AddSatW32(a * (1 << 1), (int32_t)in_out * (1 << 16));  // Q16
-    in_out = (int16_t) (b >> 16);  // Save as Q0
-
-    a = factor_ch1[1] * in_out;  // Q15 * Q0 = Q15
-    a *= 1 << 1; // Q15 -> Q16
-    b = WebRtcSpl_AddSatW32(a, state1_ch1);  // Q16
-    a = -factor_ch1[1] * (int16_t)(b >> 16);  // Q15
-    state1_ch1 =
-        WebRtcSpl_AddSatW32(a * (1 << 1), (int32_t)in_out * (1 << 16));  // Q16
-    data_ch1[n] = (int16_t) (b >> 16);  // Save as Q0
-
-    // Process channel 2:
-    in_out = data_ch2[n];
-    a = factor_ch2[0] * in_out;  // Q15 * Q0 = Q15
-    a *= 1 << 1;  // Q15 -> Q16
-    b = WebRtcSpl_AddSatW32(a, state0_ch2);  // Q16
-    a = -factor_ch2[0] * (int16_t)(b >> 16);  // Q15
-    state0_ch2 =
-        WebRtcSpl_AddSatW32(a * (1 << 1), (int32_t)in_out * (1 << 16));  // Q16
-    in_out = (int16_t) (b >> 16);  // Save as Q0
-
-    a = factor_ch2[1] * in_out;  // Q15 * Q0 = Q15
-    a *= (1 << 1);  // Q15 -> Q16
-    b = WebRtcSpl_AddSatW32(a, state1_ch2);  // Q16
-    a = -factor_ch2[1] * (int16_t)(b >> 16);  // Q15
-    state1_ch2 =
-        WebRtcSpl_AddSatW32(a * (1 << 1), (int32_t)in_out * (1 << 16));  // Q16
-    data_ch2[n] = (int16_t) (b >> 16);  // Save as Q0
-  }
-
-  filter_state_ch1[0] = state0_ch1;
-  filter_state_ch1[1] = state1_ch1;
-  filter_state_ch2[0] = state0_ch2;
-  filter_state_ch2[1] = state1_ch2;
-}
-
-// Declare a function pointer.
-HighpassFilterFixDec32 WebRtcIsacfix_HighpassFilterFixDec32;
-
-void WebRtcIsacfix_HighpassFilterFixDec32C(int16_t *io,
-                                           int16_t len,
-                                           const int16_t *coefficient,
-                                           int32_t *state)
-{
-  int k;
-  int32_t a1 = 0, b1 = 0, c = 0, in = 0;
-  int32_t a2 = 0, b2 = 0;
-  int32_t state0 = state[0];
-  int32_t state1 = state[1];
-
-  for (k=0; k<len; k++) {
-    in = (int32_t)io[k];
-
-#ifdef WEBRTC_ARCH_ARM_V7
-    {
-      register int tmp_coeff0;
-      register int tmp_coeff1;
-      __asm __volatile(
-        "ldr %[tmp_coeff0], [%[coeff]]\n\t"
-        "ldr %[tmp_coeff1], [%[coeff], #4]\n\t"
-        "smmulr %[a2], %[tmp_coeff0], %[state0]\n\t"
-        "smmulr %[b2], %[tmp_coeff1], %[state1]\n\t"
-        "ldr %[tmp_coeff0], [%[coeff], #8]\n\t"
-        "ldr %[tmp_coeff1], [%[coeff], #12]\n\t"
-        "smmulr %[a1], %[tmp_coeff0], %[state0]\n\t"
-        "smmulr %[b1], %[tmp_coeff1], %[state1]\n\t"
-        :[a2]"=&r"(a2),
-         [b2]"=&r"(b2),
-         [a1]"=&r"(a1),
-         [b1]"=r"(b1),
-         [tmp_coeff0]"=&r"(tmp_coeff0),
-         [tmp_coeff1]"=&r"(tmp_coeff1)
-        :[coeff]"r"(coefficient),
-         [state0]"r"(state0),
-         [state1]"r"(state1)
-      );
-    }
-#else
-    /* Q35 * Q4 = Q39 ; shift 32 bit => Q7 */
-    a1 = WEBRTC_SPL_MUL_16_32_RSFT16(coefficient[5], state0) +
-        (WEBRTC_SPL_MUL_16_32_RSFT16(coefficient[4], state0) >> 16);
-    b1 = WEBRTC_SPL_MUL_16_32_RSFT16(coefficient[7], state1) +
-        (WEBRTC_SPL_MUL_16_32_RSFT16(coefficient[6], state1) >> 16);
-
-    /* Q30 * Q4 = Q34 ; shift 32 bit => Q2 */
-    a2 = WEBRTC_SPL_MUL_16_32_RSFT16(coefficient[1], state0) +
-        (WEBRTC_SPL_MUL_16_32_RSFT16(coefficient[0], state0) >> 16);
-    b2 = WEBRTC_SPL_MUL_16_32_RSFT16(coefficient[3], state1) +
-        (WEBRTC_SPL_MUL_16_32_RSFT16(coefficient[2], state1) >> 16);
-#endif
-
-    c = in + ((a1 + b1) >> 7);  // Q0.
-    io[k] = (int16_t)WebRtcSpl_SatW32ToW16(c);  // Write output as Q0.
-
-    c = in * (1 << 2) - a2 - b2;  // In Q2.
-    c = (int32_t)WEBRTC_SPL_SAT(536870911, c, -536870912);
-
-    state1 = state0;
-    state0 = c * (1 << 2);  // Write state as Q4
-  }
-  state[0] = state0;
-  state[1] = state1;
-}
-
-
-void WebRtcIsacfix_SplitAndFilter1(int16_t *pin,
-                                   int16_t *LP16,
-                                   int16_t *HP16,
-                                   PreFiltBankstr *prefiltdata)
-{
-  /* Function WebRtcIsacfix_SplitAndFilter */
-  /* This function creates low-pass and high-pass decimated versions of part of
-     the input signal, and part of the signal in the input 'lookahead buffer'. */
-
-  int k;
-
-  int16_t tempin_ch1[FRAMESAMPLES/2 + QLOOKAHEAD];
-  int16_t tempin_ch2[FRAMESAMPLES/2 + QLOOKAHEAD];
-  int32_t tmpState_ch1[2 * (QORDER-1)]; /* 4 */
-  int32_t tmpState_ch2[2 * (QORDER-1)]; /* 4 */
-
-  /* High pass filter */
-  WebRtcIsacfix_HighpassFilterFixDec32(pin, FRAMESAMPLES, WebRtcIsacfix_kHpStCoeffInQ30, prefiltdata->HPstates_fix);
-
-
-  /* First Channel */
-  for (k=0;k<FRAMESAMPLES/2;k++) {
-    tempin_ch1[QLOOKAHEAD + k] = pin[1 + 2 * k];
-  }
-  for (k=0;k<QLOOKAHEAD;k++) {
-    tempin_ch1[k]=prefiltdata->INLABUF1_fix[k];
-    prefiltdata->INLABUF1_fix[k] = pin[FRAMESAMPLES + 1 - 2 * (QLOOKAHEAD - k)];
-  }
-
-  /* Second Channel.  This is exactly like the first channel, except that the
-     even samples are now filtered instead (lower channel). */
-  for (k=0;k<FRAMESAMPLES/2;k++) {
-    tempin_ch2[QLOOKAHEAD + k] = pin[2 * k];
-  }
-  for (k=0;k<QLOOKAHEAD;k++) {
-    tempin_ch2[k]=prefiltdata->INLABUF2_fix[k];
-    prefiltdata->INLABUF2_fix[k] = pin[FRAMESAMPLES - 2 * (QLOOKAHEAD - k)];
-  }
-
-
-  /*obtain polyphase components by forward all-pass filtering through each channel */
-  /* The all pass filtering automatically updates the filter states which are exported in the
-     prefiltdata structure */
-  WebRtcIsacfix_AllpassFilter2FixDec16(tempin_ch1,
-                                       tempin_ch2,
-                                       WebRtcIsacfix_kUpperApFactorsQ15,
-                                       WebRtcIsacfix_kLowerApFactorsQ15,
-                                       FRAMESAMPLES/2,
-                                       prefiltdata->INSTAT1_fix,
-                                       prefiltdata->INSTAT2_fix);
-
-  for (k = 0; k < 2 * (QORDER - 1); k++) {
-    tmpState_ch1[k] = prefiltdata->INSTAT1_fix[k];
-    tmpState_ch2[k] = prefiltdata->INSTAT2_fix[k];
-  }
-  WebRtcIsacfix_AllpassFilter2FixDec16(tempin_ch1 + FRAMESAMPLES/2,
-                                       tempin_ch2 + FRAMESAMPLES/2,
-                                       WebRtcIsacfix_kUpperApFactorsQ15,
-                                       WebRtcIsacfix_kLowerApFactorsQ15,
-                                       QLOOKAHEAD,
-                                       tmpState_ch1,
-                                       tmpState_ch2);
-
-  /* Now Construct low-pass and high-pass signals as combinations of polyphase components */
-  for (k=0; k<FRAMESAMPLES/2 + QLOOKAHEAD; k++) {
-    int32_t tmp1, tmp2, tmp3;
-    tmp1 = (int32_t)tempin_ch1[k]; // Q0 -> Q0
-    tmp2 = (int32_t)tempin_ch2[k]; // Q0 -> Q0
-    tmp3 = (tmp1 + tmp2) >> 1;  /* Low pass signal. */
-    LP16[k] = (int16_t)WebRtcSpl_SatW32ToW16(tmp3); /*low pass */
-    tmp3 = (tmp1 - tmp2) >> 1;  /* High pass signal. */
-    HP16[k] = (int16_t)WebRtcSpl_SatW32ToW16(tmp3); /*high pass */
-  }
-
-}/*end of WebRtcIsacfix_SplitAndFilter */
-
-
-#ifdef WEBRTC_ISAC_FIX_NB_CALLS_ENABLED
-
-/* Without lookahead */
-void WebRtcIsacfix_SplitAndFilter2(int16_t *pin,
-                                   int16_t *LP16,
-                                   int16_t *HP16,
-                                   PreFiltBankstr *prefiltdata)
-{
-  /* Function WebRtcIsacfix_SplitAndFilter2 */
-  /* This function creates low-pass and high-pass decimated versions of part of
-     the input signal. */
-
-  int k;
-
-  int16_t tempin_ch1[FRAMESAMPLES/2];
-  int16_t tempin_ch2[FRAMESAMPLES/2];
-
-
-  /* High pass filter */
-  WebRtcIsacfix_HighpassFilterFixDec32(pin, FRAMESAMPLES, WebRtcIsacfix_kHpStCoeffInQ30, prefiltdata->HPstates_fix);
-
-
-  /* First Channel */
-  for (k=0;k<FRAMESAMPLES/2;k++) {
-    tempin_ch1[k] = pin[1 + 2 * k];
-  }
-
-  /* Second Channel.  This is exactly like the first channel, except that the
-     even samples are now filtered instead (lower channel). */
-  for (k=0;k<FRAMESAMPLES/2;k++) {
-    tempin_ch2[k] = pin[2 * k];
-  }
-
-
-  /*obtain polyphase components by forward all-pass filtering through each channel */
-  /* The all pass filtering automatically updates the filter states which are exported in the
-     prefiltdata structure */
-  WebRtcIsacfix_AllpassFilter2FixDec16(tempin_ch1,
-                                       tempin_ch2,
-                                       WebRtcIsacfix_kUpperApFactorsQ15,
-                                       WebRtcIsacfix_kLowerApFactorsQ15,
-                                       FRAMESAMPLES/2,
-                                       prefiltdata->INSTAT1_fix,
-                                       prefiltdata->INSTAT2_fix);
-
-  /* Now Construct low-pass and high-pass signals as combinations of polyphase components */
-  for (k=0; k<FRAMESAMPLES/2; k++) {
-    int32_t tmp1, tmp2, tmp3;
-    tmp1 = (int32_t)tempin_ch1[k]; // Q0 -> Q0
-    tmp2 = (int32_t)tempin_ch2[k]; // Q0 -> Q0
-    tmp3 = (tmp1 + tmp2) >> 1;  /* Low pass signal. */
-    LP16[k] = (int16_t)WebRtcSpl_SatW32ToW16(tmp3); /*low pass */
-    tmp3 = (tmp1 - tmp2) >> 1;  /* High pass signal. */
-    HP16[k] = (int16_t)WebRtcSpl_SatW32ToW16(tmp3); /*high pass */
-  }
-
-}/*end of WebRtcIsacfix_SplitAndFilter */
-
-#endif
-
-
-
-//////////////////////////////////////////////////////////
-////////// Combining
-/* Function WebRtcIsacfix_FilterAndCombine */
-/* This is a decoder function that takes the decimated
-   length FRAMESAMPLES/2 input low-pass and
-   high-pass signals and creates a reconstructed fullband
-   output signal of length FRAMESAMPLES. WebRtcIsacfix_FilterAndCombine
-   is the sibling function of WebRtcIsacfix_SplitAndFilter */
-/* INPUTS:
-   inLP: a length FRAMESAMPLES/2 array of input low-pass
-   samples.
-   inHP: a length FRAMESAMPLES/2 array of input high-pass
-   samples.
-   postfiltdata: input data structure containing the filterbank
-   states from the previous decoding iteration.
-   OUTPUTS:
-   Out: a length FRAMESAMPLES array of output reconstructed
-   samples (fullband) based on the input low-pass and
-   high-pass signals.
-   postfiltdata: the input data structure containing the filterbank
-   states is updated for the next decoding iteration */
-void WebRtcIsacfix_FilterAndCombine1(int16_t *tempin_ch1,
-                                     int16_t *tempin_ch2,
-                                     int16_t *out16,
-                                     PostFiltBankstr *postfiltdata)
-{
-  int k;
-  int16_t in[FRAMESAMPLES];
-
-  /* all-pass filter the new upper and lower channel signal.
-     For upper channel, use the all-pass filter factors that were used as a
-     lower channel at the encoding side. So at the decoder, the corresponding
-     all-pass filter factors for each channel are swapped.
-     For lower channel signal, since all-pass filter factors at the decoder are
-     swapped from the ones at the encoder, the 'upper' channel all-pass filter
-     factors (kUpperApFactors) are used to filter this new lower channel signal.
-  */
-  WebRtcIsacfix_AllpassFilter2FixDec16(tempin_ch1,
-                                       tempin_ch2,
-                                       WebRtcIsacfix_kLowerApFactorsQ15,
-                                       WebRtcIsacfix_kUpperApFactorsQ15,
-                                       FRAMESAMPLES/2,
-                                       postfiltdata->STATE_0_UPPER_fix,
-                                       postfiltdata->STATE_0_LOWER_fix);
-
-  /* Merge outputs to form the full length output signal.*/
-  for (k=0;k<FRAMESAMPLES/2;k++) {
-    in[2 * k] = tempin_ch2[k];
-    in[2 * k + 1] = tempin_ch1[k];
-  }
-
-  /* High pass filter */
-  WebRtcIsacfix_HighpassFilterFixDec32(in, FRAMESAMPLES, WebRtcIsacfix_kHPStCoeffOut1Q30, postfiltdata->HPstates1_fix);
-  WebRtcIsacfix_HighpassFilterFixDec32(in, FRAMESAMPLES, WebRtcIsacfix_kHPStCoeffOut2Q30, postfiltdata->HPstates2_fix);
-
-  for (k=0;k<FRAMESAMPLES;k++) {
-    out16[k] = in[k];
-  }
-}
-
-
-#ifdef WEBRTC_ISAC_FIX_NB_CALLS_ENABLED
-/* Function WebRtcIsacfix_FilterAndCombine */
-/* This is a decoder function that takes the decimated
-   length len/2 input low-pass and
-   high-pass signals and creates a reconstructed fullband
-   output signal of length len. WebRtcIsacfix_FilterAndCombine
-   is the sibling function of WebRtcIsacfix_SplitAndFilter */
-/* INPUTS:
-   inLP: a length len/2 array of input low-pass
-   samples.
-   inHP: a length len/2 array of input high-pass
-   samples.
-   postfiltdata: input data structure containing the filterbank
-   states from the previous decoding iteration.
-   OUTPUTS:
-   Out: a length len array of output reconstructed
-   samples (fullband) based on the input low-pass and
-   high-pass signals.
-   postfiltdata: the input data structure containing the filterbank
-   states is updated for the next decoding iteration */
-void WebRtcIsacfix_FilterAndCombine2(int16_t *tempin_ch1,
-                                     int16_t *tempin_ch2,
-                                     int16_t *out16,
-                                     PostFiltBankstr *postfiltdata,
-                                     int16_t len)
-{
-  int k;
-  int16_t in[FRAMESAMPLES];
-
-  /* all-pass filter the new upper and lower channel signal.
-     For upper channel, use the all-pass filter factors that were used as a
-     lower channel at the encoding side. So at the decoder, the corresponding
-     all-pass filter factors for each channel are swapped.
-     For lower channel signal, since all-pass filter factors at the decoder are
-     swapped from the ones at the encoder, the 'upper' channel all-pass filter
-     factors (kUpperApFactors) are used to filter this new lower channel signal.
-  */
-  WebRtcIsacfix_AllpassFilter2FixDec16(tempin_ch1,
-                                       tempin_ch2,
-                                       WebRtcIsacfix_kLowerApFactorsQ15,
-                                       WebRtcIsacfix_kUpperApFactorsQ15,
-                                       len / 2,
-                                       postfiltdata->STATE_0_UPPER_fix,
-                                       postfiltdata->STATE_0_LOWER_fix);
-
-  /* Merge outputs to form the full length output signal.*/
-  for (k=0;k<len/2;k++) {
-    in[2 * k] = tempin_ch2[k];
-    in[2 * k + 1] = tempin_ch1[k];
-  }
-
-  /* High pass filter */
-  WebRtcIsacfix_HighpassFilterFixDec32(in, len, WebRtcIsacfix_kHPStCoeffOut1Q30, postfiltdata->HPstates1_fix);
-  WebRtcIsacfix_HighpassFilterFixDec32(in, len, WebRtcIsacfix_kHPStCoeffOut2Q30, postfiltdata->HPstates2_fix);
-
-  for (k=0;k<len;k++) {
-    out16[k] = in[k];
-  }
-}
-
-#endif
diff --git a/modules/audio_coding/codecs/isac/fix/source/filterbanks_mips.c b/modules/audio_coding/codecs/isac/fix/source/filterbanks_mips.c
deleted file mode 100644
index 4dd70cf..0000000
--- a/modules/audio_coding/codecs/isac/fix/source/filterbanks_mips.c
+++ /dev/null
@@ -1,242 +0,0 @@
-/*
- *  Copyright (c) 2014 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/codecs/isac/fix/source/filterbank_internal.h"
-
-// WebRtcIsacfix_AllpassFilter2FixDec16 function optimized for MIPSDSP platform.
-// Bit-exact with WebRtcIsacfix_AllpassFilter2FixDec16C from filterbanks.c.
-void WebRtcIsacfix_AllpassFilter2FixDec16MIPS(
-    int16_t* data_ch1,            // Input and output in channel 1, in Q0.
-    int16_t* data_ch2,            // Input and output in channel 2, in Q0.
-    const int16_t* factor_ch1,    // Scaling factor for channel 1, in Q15.
-    const int16_t* factor_ch2,    // Scaling factor for channel 2, in Q15.
-    const int length,             // Length of the data buffers.
-    int32_t* filter_state_ch1,    // Filter state for channel 1, in Q16.
-    int32_t* filter_state_ch2) {  // Filter state for channel 2, in Q16.
-
-  int32_t st0_ch1, st1_ch1;                // channel1 state variables.
-  int32_t st0_ch2, st1_ch2;                // channel2 state variables.
-  int32_t f_ch10, f_ch11, f_ch20, f_ch21;  // factor variables.
-  int32_t r0, r1, r2, r3, r4, r5;          // temporary register variables.
-
-  __asm __volatile (
-    ".set           push                                                  \n\t"
-    ".set           noreorder                                             \n\t"
-    // Load all the state and factor variables.
-    "lh             %[f_ch10],      0(%[factor_ch1])                      \n\t"
-    "lh             %[f_ch20],      0(%[factor_ch2])                      \n\t"
-    "lh             %[f_ch11],      2(%[factor_ch1])                      \n\t"
-    "lh             %[f_ch21],      2(%[factor_ch2])                      \n\t"
-    "lw             %[st0_ch1],     0(%[filter_state_ch1])                \n\t"
-    "lw             %[st1_ch1],     4(%[filter_state_ch1])                \n\t"
-    "lw             %[st0_ch2],     0(%[filter_state_ch2])                \n\t"
-    "lw             %[st1_ch2],     4(%[filter_state_ch2])                \n\t"
-    // Allpass filtering loop.
-   "1:                                                                    \n\t"
-    "lh             %[r0],          0(%[data_ch1])                        \n\t"
-    "lh             %[r1],          0(%[data_ch2])                        \n\t"
-    "addiu          %[length],      %[length],              -1            \n\t"
-    "mul            %[r2],          %[r0],                  %[f_ch10]     \n\t"
-    "mul            %[r3],          %[r1],                  %[f_ch20]     \n\t"
-    "sll            %[r0],          %[r0],                  16            \n\t"
-    "sll            %[r1],          %[r1],                  16            \n\t"
-    "sll            %[r2],          %[r2],                  1             \n\t"
-    "addq_s.w       %[r2],          %[r2],                  %[st0_ch1]    \n\t"
-    "sll            %[r3],          %[r3],                  1             \n\t"
-    "addq_s.w       %[r3],          %[r3],                  %[st0_ch2]    \n\t"
-    "sra            %[r2],          %[r2],                  16            \n\t"
-    "mul            %[st0_ch1],     %[f_ch10],              %[r2]         \n\t"
-    "sra            %[r3],          %[r3],                  16            \n\t"
-    "mul            %[st0_ch2],     %[f_ch20],              %[r3]         \n\t"
-    "mul            %[r4],          %[r2],                  %[f_ch11]     \n\t"
-    "mul            %[r5],          %[r3],                  %[f_ch21]     \n\t"
-    "sll            %[st0_ch1],     %[st0_ch1],             1             \n\t"
-    "subq_s.w       %[st0_ch1],     %[r0],                  %[st0_ch1]    \n\t"
-    "sll            %[st0_ch2],     %[st0_ch2],             1             \n\t"
-    "subq_s.w       %[st0_ch2],     %[r1],                  %[st0_ch2]    \n\t"
-    "sll            %[r4],          %[r4],                  1             \n\t"
-    "addq_s.w       %[r4],          %[r4],                  %[st1_ch1]    \n\t"
-    "sll            %[r5],          %[r5],                  1             \n\t"
-    "addq_s.w       %[r5],          %[r5],                  %[st1_ch2]    \n\t"
-    "sra            %[r4],          %[r4],                  16            \n\t"
-    "mul            %[r0],          %[r4],                  %[f_ch11]     \n\t"
-    "sra            %[r5],          %[r5],                  16            \n\t"
-    "mul            %[r1],          %[r5],                  %[f_ch21]     \n\t"
-    "sh             %[r4],          0(%[data_ch1])                        \n\t"
-    "sh             %[r5],          0(%[data_ch2])                        \n\t"
-    "addiu          %[data_ch1],    %[data_ch1],            2             \n\t"
-    "sll            %[r2],          %[r2],                  16            \n\t"
-    "sll            %[r0],          %[r0],                  1             \n\t"
-    "subq_s.w       %[st1_ch1],     %[r2],                  %[r0]         \n\t"
-    "sll            %[r3],          %[r3],                  16            \n\t"
-    "sll            %[r1],          %[r1],                  1             \n\t"
-    "subq_s.w       %[st1_ch2],     %[r3],                  %[r1]         \n\t"
-    "bgtz           %[length],      1b                                    \n\t"
-    " addiu         %[data_ch2],    %[data_ch2],            2             \n\t"
-    // Store channel states.
-    "sw             %[st0_ch1],     0(%[filter_state_ch1])                \n\t"
-    "sw             %[st1_ch1],     4(%[filter_state_ch1])                \n\t"
-    "sw             %[st0_ch2],     0(%[filter_state_ch2])                \n\t"
-    "sw             %[st1_ch2],     4(%[filter_state_ch2])                \n\t"
-    ".set           pop                                                   \n\t"
-    : [f_ch10] "=&r" (f_ch10), [f_ch20] "=&r" (f_ch20),
-      [f_ch11] "=&r" (f_ch11), [f_ch21] "=&r" (f_ch21),
-      [st0_ch1] "=&r" (st0_ch1), [st1_ch1] "=&r" (st1_ch1),
-      [st0_ch2] "=&r" (st0_ch2), [st1_ch2] "=&r" (st1_ch2),
-      [r0] "=&r" (r0), [r1] "=&r" (r1), [r2] "=&r" (r2),
-      [r3] "=&r" (r3), [r4] "=&r" (r4), [r5] "=&r" (r5)
-    : [factor_ch1] "r" (factor_ch1), [factor_ch2] "r" (factor_ch2),
-      [filter_state_ch1] "r" (filter_state_ch1),
-      [filter_state_ch2] "r" (filter_state_ch2),
-      [data_ch1] "r" (data_ch1), [data_ch2] "r" (data_ch2),
-      [length] "r" (length)
-    : "memory", "hi", "lo"
-  );
-}
-
-// WebRtcIsacfix_HighpassFilterFixDec32 function optimized for MIPSDSP platform.
-// Bit-exact with WebRtcIsacfix_HighpassFilterFixDec32C from filterbanks.c.
-void WebRtcIsacfix_HighpassFilterFixDec32MIPS(int16_t* io,
-                                              int16_t len,
-                                              const int16_t* coefficient,
-                                              int32_t* state) {
-  int k;
-  int32_t a1, a2, b1, b2, in;
-  int32_t state0 = state[0];
-  int32_t state1 = state[1];
-
-  int32_t c0, c1, c2, c3;
-  int32_t c4, c5, c6, c7;
-  int32_t state0_lo, state0_hi;
-  int32_t state1_lo, state1_hi;
-  int32_t t0, t1, t2, t3, t4, t5;
-
-  __asm  __volatile (
-    "lh         %[c0],         0(%[coeff_ptr])            \n\t"
-    "lh         %[c1],         2(%[coeff_ptr])            \n\t"
-    "lh         %[c2],         4(%[coeff_ptr])            \n\t"
-    "lh         %[c3],         6(%[coeff_ptr])            \n\t"
-    "sra        %[state0_hi],  %[state0],        16       \n\t"
-    "sra        %[state1_hi],  %[state1],        16       \n\t"
-    "andi       %[state0_lo],  %[state0],        0xFFFF   \n\t"
-    "andi       %[state1_lo],  %[state1],        0xFFFF   \n\t"
-    "lh         %[c4],         8(%[coeff_ptr])            \n\t"
-    "lh         %[c5],         10(%[coeff_ptr])           \n\t"
-    "lh         %[c6],         12(%[coeff_ptr])           \n\t"
-    "lh         %[c7],         14(%[coeff_ptr])           \n\t"
-    "sra        %[state0_lo],  %[state0_lo],     1        \n\t"
-    "sra        %[state1_lo],  %[state1_lo],     1        \n\t"
-    : [c0] "=&r" (c0), [c1] "=&r" (c1), [c2] "=&r" (c2), [c3] "=&r" (c3),
-      [c4] "=&r" (c4), [c5] "=&r" (c5), [c6] "=&r" (c6), [c7] "=&r" (c7),
-      [state0_hi] "=&r" (state0_hi), [state0_lo] "=&r" (state0_lo),
-      [state1_hi] "=&r" (state1_hi), [state1_lo] "=&r" (state1_lo)
-    : [coeff_ptr] "r" (coefficient), [state0] "r" (state0),
-      [state1] "r" (state1)
-    : "memory"
-  );
-
-  for (k = 0; k < len; k++) {
-    in = (int32_t)io[k];
-
-    __asm __volatile (
-      ".set      push                                      \n\t"
-      ".set      noreorder                                 \n\t"
-      "mul       %[t2],        %[c4],        %[state0_lo]  \n\t"
-      "mul       %[t0],        %[c5],        %[state0_lo]  \n\t"
-      "mul       %[t1],        %[c4],        %[state0_hi]  \n\t"
-      "mul       %[a1],        %[c5],        %[state0_hi]  \n\t"
-      "mul       %[t5],        %[c6],        %[state1_lo]  \n\t"
-      "mul       %[t3],        %[c7],        %[state1_lo]  \n\t"
-      "mul       %[t4],        %[c6],        %[state1_hi]  \n\t"
-      "mul       %[b1],        %[c7],        %[state1_hi]  \n\t"
-      "shra_r.w  %[t2],        %[t2],        15            \n\t"
-      "shra_r.w  %[t0],        %[t0],        15            \n\t"
-      "addu      %[t1],        %[t1],        %[t2]         \n\t"
-      "addu      %[a1],        %[a1],        %[t0]         \n\t"
-      "sra       %[t1],        %[t1],        16            \n\t"
-      "addu      %[a1],        %[a1],        %[t1]         \n\t"
-      "shra_r.w  %[t5],        %[t5],        15            \n\t"
-      "shra_r.w  %[t3],        %[t3],        15            \n\t"
-      "addu      %[t4],        %[t4],        %[t5]         \n\t"
-      "addu      %[b1],        %[b1],        %[t3]         \n\t"
-      "sra       %[t4],        %[t4],        16            \n\t"
-      "addu      %[b1],        %[b1],        %[t4]         \n\t"
-      "mul       %[t2],        %[c0],        %[state0_lo]  \n\t"
-      "mul       %[t0],        %[c1],        %[state0_lo]  \n\t"
-      "mul       %[t1],        %[c0],        %[state0_hi]  \n\t"
-      "mul       %[a2],        %[c1],        %[state0_hi]  \n\t"
-      "mul       %[t5],        %[c2],        %[state1_lo]  \n\t"
-      "mul       %[t3],        %[c3],        %[state1_lo]  \n\t"
-      "mul       %[t4],        %[c2],        %[state1_hi]  \n\t"
-      "mul       %[b2],        %[c3],        %[state1_hi]  \n\t"
-      "shra_r.w  %[t2],        %[t2],        15            \n\t"
-      "shra_r.w  %[t0],        %[t0],        15            \n\t"
-      "addu      %[t1],        %[t1],        %[t2]         \n\t"
-      "addu      %[a2],        %[a2],        %[t0]         \n\t"
-      "sra       %[t1],        %[t1],        16            \n\t"
-      "addu      %[a2],        %[a2],        %[t1]         \n\t"
-      "shra_r.w  %[t5],        %[t5],        15            \n\t"
-      "shra_r.w  %[t3],        %[t3],        15            \n\t"
-      "addu      %[t4],        %[t4],        %[t5]         \n\t"
-      "addu      %[b2],        %[b2],        %[t3]         \n\t"
-      "sra       %[t4],        %[t4],        16            \n\t"
-      "addu      %[b2],        %[b2],        %[t4]         \n\t"
-      "addu      %[a1],        %[a1],        %[b1]         \n\t"
-      "sra       %[a1],        %[a1],        7             \n\t"
-      "addu      %[a1],        %[a1],        %[in]         \n\t"
-      "sll       %[t0],        %[in],        2             \n\t"
-      "addu      %[a2],        %[a2],        %[b2]         \n\t"
-      "subu      %[t0],        %[t0],        %[a2]         \n\t"
-      "shll_s.w  %[a1],        %[a1],        16            \n\t"
-      "shll_s.w  %[t0],        %[t0],        2             \n\t"
-      "sra       %[a1],        %[a1],        16            \n\t"
-      "addu      %[state1_hi], %[state0_hi], $0            \n\t"
-      "addu      %[state1_lo], %[state0_lo], $0            \n\t"
-      "sra       %[state0_hi], %[t0],        16            \n\t"
-      "andi      %[state0_lo], %[t0],        0xFFFF        \n\t"
-      "sra       %[state0_lo], %[state0_lo], 1             \n\t"
-      ".set      pop                                       \n\t"
-      : [a1] "=&r" (a1), [b1] "=&r" (b1), [a2] "=&r" (a2), [b2] "=&r" (b2),
-        [state0_hi] "+r" (state0_hi), [state0_lo] "+r" (state0_lo),
-        [state1_hi] "+r" (state1_hi), [state1_lo] "+r" (state1_lo),
-        [t0] "=&r" (t0), [t1] "=&r" (t1), [t2] "=&r" (t2),
-        [t3] "=&r" (t3), [t4] "=&r" (t4), [t5] "=&r" (t5)
-      : [c0] "r" (c0), [c1] "r" (c1), [c2] "r" (c2), [c3] "r" (c3),
-        [c4] "r" (c4), [c5] "r" (c5), [c6] "r" (c6), [c7] "r" (c7),
-        [in] "r" (in)
-      : "hi", "lo"
-    );
-    io[k] = (int16_t)a1;
-  }
-  __asm __volatile (
-    ".set            push                                            \n\t"
-    ".set            noreorder                                       \n\t"
-#if !defined(MIPS_DSP_R2_LE)
-    "sll             %[state0_hi],   %[state0_hi],   16              \n\t"
-    "sll             %[state0_lo],   %[state0_lo],   1               \n\t"
-    "sll             %[state1_hi],   %[state1_hi],   16              \n\t"
-    "sll             %[state1_lo],   %[state1_lo],   1               \n\t"
-    "or              %[state0_hi],   %[state0_hi],   %[state0_lo]    \n\t"
-    "or              %[state1_hi],   %[state1_hi],   %[state1_lo]    \n\t"
-#else
-    "sll             %[state0_lo],   %[state0_lo],   1               \n\t"
-    "sll             %[state1_lo],   %[state1_lo],   1               \n\t"
-    "precr_sra.ph.w  %[state0_hi],   %[state0_lo],   0               \n\t"
-    "precr_sra.ph.w  %[state1_hi],   %[state1_lo],   0               \n\t"
-#endif
-    "sw              %[state0_hi],   0(%[state])                     \n\t"
-    "sw              %[state1_hi],   4(%[state])                     \n\t"
-    ".set            pop                                             \n\t"
-    : [state0_hi] "+r" (state0_hi), [state0_lo] "+r" (state0_lo),
-      [state1_hi] "+r" (state1_hi), [state1_lo] "+r" (state1_lo)
-    : [state] "r" (state)
-    : "memory"
-  );
-}
diff --git a/modules/audio_coding/codecs/isac/fix/source/filterbanks_neon.c b/modules/audio_coding/codecs/isac/fix/source/filterbanks_neon.c
deleted file mode 100644
index cd0bb07..0000000
--- a/modules/audio_coding/codecs/isac/fix/source/filterbanks_neon.c
+++ /dev/null
@@ -1,277 +0,0 @@
-/*
- *  Copyright (c) 2014 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.
- */
-
-// Contains a function for WebRtcIsacfix_AllpassFilter2FixDec16Neon()
-// in iSAC codec, optimized for ARM Neon platform. Bit exact with function
-// WebRtcIsacfix_AllpassFilter2FixDec16C() in filterbanks.c. Prototype
-// C code is at end of this file.
-
-#include <arm_neon.h>
-
-#include "webrtc/rtc_base/checks.h"
-
-void WebRtcIsacfix_AllpassFilter2FixDec16Neon(
-    int16_t* data_ch1,  // Input and output in channel 1, in Q0
-    int16_t* data_ch2,  // Input and output in channel 2, in Q0
-    const int16_t* factor_ch1,  // Scaling factor for channel 1, in Q15
-    const int16_t* factor_ch2,  // Scaling factor for channel 2, in Q15
-    const int length,  // Length of the data buffers
-    int32_t* filter_state_ch1,  // Filter state for channel 1, in Q16
-    int32_t* filter_state_ch2) {  // Filter state for channel 2, in Q16
-  RTC_DCHECK_EQ(0, length % 2);
-  int n = 0;
-  int16x4_t factorv;
-  int16x4_t datav;
-  int32x4_t statev;
-
-  // Load factor_ch1 and factor_ch2.
-  factorv = vld1_dup_s16(factor_ch1);
-  factorv = vld1_lane_s16(factor_ch1 + 1, factorv, 1);
-  factorv = vld1_lane_s16(factor_ch2, factorv, 2);
-  factorv = vld1_lane_s16(factor_ch2 + 1, factorv, 3);
-
-  // Load filter_state_ch1[0] and filter_state_ch2[0].
-  statev = vld1q_dup_s32(filter_state_ch1);
-  statev = vld1q_lane_s32(filter_state_ch2, statev, 2);
-
-  // Loop unrolling preprocessing.
-  int32x4_t a;
-  int16x4_t tmp1, tmp2;
-
-  // Load data_ch1[0] and data_ch2[0].
-  datav = vld1_dup_s16(data_ch1);
-  datav = vld1_lane_s16(data_ch2, datav, 2);
-
-  a = vqdmlal_s16(statev, datav, factorv);
-  tmp1 = vshrn_n_s32(a, 16);
-
-  // Update filter_state_ch1[0] and filter_state_ch2[0].
-  statev = vqdmlsl_s16(vshll_n_s16(datav, 16), tmp1, factorv);
-
-  // Load filter_state_ch1[1] and filter_state_ch2[1].
-  statev = vld1q_lane_s32(filter_state_ch1 + 1, statev, 1);
-  statev = vld1q_lane_s32(filter_state_ch2 + 1, statev, 3);
-
-  // Load data_ch1[1] and data_ch2[1].
-  tmp1 = vld1_lane_s16(data_ch1 + 1, tmp1, 1);
-  tmp1 = vld1_lane_s16(data_ch2 + 1, tmp1, 3);
-  datav = vrev32_s16(tmp1);
-
-  // Loop unrolling processing.
-  for (n = 0; n < length - 2; n += 2) {
-    a = vqdmlal_s16(statev, datav, factorv);
-    tmp1 = vshrn_n_s32(a, 16);
-    // Store data_ch1[n] and data_ch2[n].
-    vst1_lane_s16(data_ch1 + n, tmp1, 1);
-    vst1_lane_s16(data_ch2 + n, tmp1, 3);
-
-    // Update filter_state_ch1[0], filter_state_ch1[1]
-    // and filter_state_ch2[0], filter_state_ch2[1].
-    statev = vqdmlsl_s16(vshll_n_s16(datav, 16), tmp1, factorv);
-
-    // Load data_ch1[n + 2] and data_ch2[n + 2].
-    tmp1 = vld1_lane_s16(data_ch1 + n + 2, tmp1, 1);
-    tmp1 = vld1_lane_s16(data_ch2 + n + 2, tmp1, 3);
-    datav = vrev32_s16(tmp1);
-
-    a = vqdmlal_s16(statev, datav, factorv);
-    tmp2 = vshrn_n_s32(a, 16);
-    // Store data_ch1[n + 1] and data_ch2[n + 1].
-    vst1_lane_s16(data_ch1 + n + 1, tmp2, 1);
-    vst1_lane_s16(data_ch2 + n + 1, tmp2, 3);
-
-    // Update filter_state_ch1[0], filter_state_ch1[1]
-    // and filter_state_ch2[0], filter_state_ch2[1].
-    statev = vqdmlsl_s16(vshll_n_s16(datav, 16), tmp2, factorv);
-
-    // Load data_ch1[n + 3] and data_ch2[n + 3].
-    tmp2 = vld1_lane_s16(data_ch1 + n + 3, tmp2, 1);
-    tmp2 = vld1_lane_s16(data_ch2 + n + 3, tmp2, 3);
-    datav = vrev32_s16(tmp2);
-  }
-
-  // Loop unrolling post-processing.
-  a = vqdmlal_s16(statev, datav, factorv);
-  tmp1 = vshrn_n_s32(a, 16);
-  // Store data_ch1[n] and data_ch2[n].
-  vst1_lane_s16(data_ch1 + n, tmp1, 1);
-  vst1_lane_s16(data_ch2 + n, tmp1, 3);
-
-  // Update filter_state_ch1[0], filter_state_ch1[1]
-  // and filter_state_ch2[0], filter_state_ch2[1].
-  statev = vqdmlsl_s16(vshll_n_s16(datav, 16), tmp1, factorv);
-  // Store filter_state_ch1[0] and filter_state_ch2[0].
-  vst1q_lane_s32(filter_state_ch1, statev, 0);
-  vst1q_lane_s32(filter_state_ch2, statev, 2);
-
-  datav = vrev32_s16(tmp1);
-  a = vqdmlal_s16(statev, datav, factorv);
-  tmp2 = vshrn_n_s32(a, 16);
-  // Store data_ch1[n + 1] and data_ch2[n + 1].
-  vst1_lane_s16(data_ch1 + n + 1, tmp2, 1);
-  vst1_lane_s16(data_ch2 + n + 1, tmp2, 3);
-
-  // Update filter_state_ch1[1] and filter_state_ch2[1].
-  statev = vqdmlsl_s16(vshll_n_s16(datav, 16), tmp2, factorv);
-  // Store filter_state_ch1[1] and filter_state_ch2[1].
-  vst1q_lane_s32(filter_state_ch1 + 1, statev, 1);
-  vst1q_lane_s32(filter_state_ch2 + 1, statev, 3);
-}
-
-// This function is the prototype for above neon optimized function.
-//void AllpassFilter2FixDec16BothChannels(
-//    int16_t *data_ch1,  // Input and output in channel 1, in Q0
-//    int16_t *data_ch2,  // Input and output in channel 2, in Q0
-//    const int16_t *factor_ch1,  // Scaling factor for channel 1, in Q15
-//    const int16_t *factor_ch2,  // Scaling factor for channel 2, in Q15
-//    const int length,  // Length of the data buffers
-//    int32_t *filter_state_ch1,  // Filter state for channel 1, in Q16
-//    int32_t *filter_state_ch2) {  // Filter state for channel 2, in Q16
-//  int n = 0;
-//  int32_t state0_ch1 = filter_state_ch1[0], state1_ch1 = filter_state_ch1[1];
-//  int32_t state0_ch2 = filter_state_ch2[0], state1_ch2 = filter_state_ch2[1];
-//  int16_t sample0_ch1 = 0, sample0_ch2 = 0;
-//  int16_t sample1_ch1 = 0, sample1_ch2  = 0;
-//  int32_t a0_ch1 = 0, a0_ch2 = 0;
-//  int32_t b0_ch1 = 0, b0_ch2 = 0;
-//
-//  int32_t a1_ch1 = 0, a1_ch2 = 0;
-//  int32_t b1_ch1 = 0, b1_ch2 = 0;
-//  int32_t b2_ch1  = 0, b2_ch2 = 0;
-//
-//  // Loop unrolling preprocessing.
-//
-//  sample0_ch1 = data_ch1[n];
-//  sample0_ch2 = data_ch2[n];
-//
-//  a0_ch1 = (factor_ch1[0] * sample0_ch1) << 1;
-//  a0_ch2 = (factor_ch2[0] * sample0_ch2) << 1;
-//
-//  b0_ch1 = WebRtcSpl_AddSatW32(a0_ch1, state0_ch1);
-//  b0_ch2 = WebRtcSpl_AddSatW32(a0_ch2, state0_ch2); //Q16+Q16=Q16
-//
-//  a0_ch1 = -factor_ch1[0] * (int16_t)(b0_ch1 >> 16);
-//  a0_ch2 = -factor_ch2[0] * (int16_t)(b0_ch2 >> 16);
-//
-//  state0_ch1 = WebRtcSpl_AddSatW32(a0_ch1 <<1, (uint32_t)sample0_ch1 << 16);
-//  state0_ch2 = WebRtcSpl_AddSatW32(a0_ch2 <<1, (uint32_t)sample0_ch2 << 16);
-//
-//  sample1_ch1 = data_ch1[n + 1];
-//  sample0_ch1 = (int16_t) (b0_ch1 >> 16); //Save as Q0
-//  sample1_ch2  = data_ch2[n + 1];
-//  sample0_ch2 = (int16_t) (b0_ch2 >> 16); //Save as Q0
-//
-//
-//  for (n = 0; n < length - 2; n += 2) {
-//    a1_ch1 = (factor_ch1[0] * sample1_ch1) << 1;
-//    a0_ch1 = (factor_ch1[1] * sample0_ch1) << 1;
-//    a1_ch2 = (factor_ch2[0] * sample1_ch2) << 1;
-//    a0_ch2 = (factor_ch2[1] * sample0_ch2) << 1;
-//
-//    b1_ch1 = WebRtcSpl_AddSatW32(a1_ch1, state0_ch1);
-//    b0_ch1 = WebRtcSpl_AddSatW32(a0_ch1, state1_ch1); //Q16+Q16=Q16
-//    b1_ch2 = WebRtcSpl_AddSatW32(a1_ch2, state0_ch2); //Q16+Q16=Q16
-//    b0_ch2 = WebRtcSpl_AddSatW32(a0_ch2, state1_ch2); //Q16+Q16=Q16
-//
-//    a1_ch1 = -factor_ch1[0] * (int16_t)(b1_ch1 >> 16);
-//    a0_ch1 = -factor_ch1[1] * (int16_t)(b0_ch1 >> 16);
-//    a1_ch2 = -factor_ch2[0] * (int16_t)(b1_ch2 >> 16);
-//    a0_ch2 = -factor_ch2[1] * (int16_t)(b0_ch2 >> 16);
-//
-//    state0_ch1 = WebRtcSpl_AddSatW32(a1_ch1<<1, (uint32_t)sample1_ch1 <<16);
-//    state1_ch1 = WebRtcSpl_AddSatW32(a0_ch1<<1, (uint32_t)sample0_ch1 <<16);
-//    state0_ch2 = WebRtcSpl_AddSatW32(a1_ch2<<1, (uint32_t)sample1_ch2 <<16);
-//    state1_ch2 = WebRtcSpl_AddSatW32(a0_ch2<<1, (uint32_t)sample0_ch2 <<16);
-//
-//    sample0_ch1 = data_ch1[n + 2];
-//    sample1_ch1 = (int16_t) (b1_ch1 >> 16); //Save as Q0
-//    sample0_ch2 = data_ch2[n + 2];
-//    sample1_ch2  = (int16_t) (b1_ch2 >> 16); //Save as Q0
-//
-//    a0_ch1 = (factor_ch1[0] * sample0_ch1) << 1;
-//    a1_ch1 = (factor_ch1[1] * sample1_ch1) << 1;
-//    a0_ch2 = (factor_ch2[0] * sample0_ch2) << 1;
-//    a1_ch2 = (factor_ch2[1] * sample1_ch2) << 1;
-//
-//    b2_ch1 = WebRtcSpl_AddSatW32(a0_ch1, state0_ch1);
-//    b1_ch1 = WebRtcSpl_AddSatW32(a1_ch1, state1_ch1); //Q16+Q16=Q16
-//    b2_ch2 = WebRtcSpl_AddSatW32(a0_ch2, state0_ch2); //Q16+Q16=Q16
-//    b1_ch2 = WebRtcSpl_AddSatW32(a1_ch2, state1_ch2); //Q16+Q16=Q16
-//
-//    a0_ch1 = -factor_ch1[0] * (int16_t)(b2_ch1 >> 16);
-//    a1_ch1 = -factor_ch1[1] * (int16_t)(b1_ch1 >> 16);
-//    a0_ch2 = -factor_ch2[0] * (int16_t)(b2_ch2 >> 16);
-//    a1_ch2 = -factor_ch2[1] * (int16_t)(b1_ch2 >> 16);
-//
-//    state0_ch1 = WebRtcSpl_AddSatW32(a0_ch1<<1, (uint32_t)sample0_ch1<<16);
-//    state1_ch1 = WebRtcSpl_AddSatW32(a1_ch1<<1, (uint32_t)sample1_ch1<<16);
-//    state0_ch2 = WebRtcSpl_AddSatW32(a0_ch2<<1, (uint32_t)sample0_ch2<<16);
-//    state1_ch2 = WebRtcSpl_AddSatW32(a1_ch2<<1, (uint32_t)sample1_ch2<<16);
-//
-//
-//    sample1_ch1 = data_ch1[n + 3];
-//    sample0_ch1 = (int16_t) (b2_ch1  >> 16); //Save as Q0
-//    sample1_ch2 = data_ch2[n + 3];
-//    sample0_ch2 = (int16_t) (b2_ch2 >> 16); //Save as Q0
-//
-//    data_ch1[n]     = (int16_t) (b0_ch1 >> 16); //Save as Q0
-//    data_ch1[n + 1] = (int16_t) (b1_ch1 >> 16); //Save as Q0
-//    data_ch2[n]     = (int16_t) (b0_ch2 >> 16);
-//    data_ch2[n + 1] = (int16_t) (b1_ch2 >> 16);
-//  }
-//
-//  // Loop unrolling post-processing.
-//
-//  a1_ch1 = (factor_ch1[0] * sample1_ch1) << 1;
-//  a0_ch1 = (factor_ch1[1] * sample0_ch1) << 1;
-//  a1_ch2 = (factor_ch2[0] * sample1_ch2) << 1;
-//  a0_ch2 = (factor_ch2[1] * sample0_ch2) << 1;
-//
-//  b1_ch1 = WebRtcSpl_AddSatW32(a1_ch1, state0_ch1);
-//  b0_ch1 = WebRtcSpl_AddSatW32(a0_ch1, state1_ch1);
-//  b1_ch2 = WebRtcSpl_AddSatW32(a1_ch2, state0_ch2);
-//  b0_ch2 = WebRtcSpl_AddSatW32(a0_ch2, state1_ch2);
-//
-//  a1_ch1 = -factor_ch1[0] * (int16_t)(b1_ch1 >> 16);
-//  a0_ch1 = -factor_ch1[1] * (int16_t)(b0_ch1 >> 16);
-//  a1_ch2 = -factor_ch2[0] * (int16_t)(b1_ch2 >> 16);
-//  a0_ch2 = -factor_ch2[1] * (int16_t)(b0_ch2 >> 16);
-//
-//  state0_ch1 = WebRtcSpl_AddSatW32(a1_ch1<<1, (uint32_t)sample1_ch1 << 16);
-//  state1_ch1 = WebRtcSpl_AddSatW32(a0_ch1<<1, (uint32_t)sample0_ch1 << 16);
-//  state0_ch2 = WebRtcSpl_AddSatW32(a1_ch2<<1, (uint32_t)sample1_ch2 << 16);
-//  state1_ch2 = WebRtcSpl_AddSatW32(a0_ch2<<1, (uint32_t)sample0_ch2 << 16);
-//
-//  data_ch1[n] = (int16_t) (b0_ch1 >> 16); //Save as Q0
-//  data_ch2[n] = (int16_t) (b0_ch2 >> 16);
-//
-//  sample1_ch1 = (int16_t) (b1_ch1 >> 16); //Save as Q0
-//  sample1_ch2  = (int16_t) (b1_ch2 >> 16); //Save as Q0
-//
-//  a1_ch1 = (factor_ch1[1] * sample1_ch1) << 1;
-//  a1_ch2 = (factor_ch2[1] * sample1_ch2) << 1;
-//
-//  b1_ch1 = WebRtcSpl_AddSatW32(a1_ch1, state1_ch1); //Q16+Q16=Q16
-//  b1_ch2 = WebRtcSpl_AddSatW32(a1_ch2, state1_ch2); //Q16+Q16=Q16
-//
-//  a1_ch1 = -factor_ch1[1] * (int16_t)(b1_ch1 >> 16);
-//  a1_ch2 = -factor_ch2[1] * (int16_t)(b1_ch2 >> 16);
-//
-//  state1_ch1 = WebRtcSpl_AddSatW32(a1_ch1<<1, (uint32_t)sample1_ch1<<16);
-//  state1_ch2 = WebRtcSpl_AddSatW32(a1_ch2<<1, (uint32_t)sample1_ch2<<16);
-//
-//  data_ch1[n + 1] = (int16_t) (b1_ch1 >> 16); //Save as Q0
-//  data_ch2[n + 1] = (int16_t) (b1_ch2 >> 16);
-//
-//  filter_state_ch1[0] = state0_ch1;
-//  filter_state_ch1[1] = state1_ch1;
-//  filter_state_ch2[0] = state0_ch2;
-//  filter_state_ch2[1] = state1_ch2;
-//}
diff --git a/modules/audio_coding/codecs/isac/fix/source/filterbanks_unittest.cc b/modules/audio_coding/codecs/isac/fix/source/filterbanks_unittest.cc
deleted file mode 100644
index c8e6ac8..0000000
--- a/modules/audio_coding/codecs/isac/fix/source/filterbanks_unittest.cc
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- *  Copyright (c) 2012 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/common_audio/signal_processing/include/signal_processing_library.h"
-#include "webrtc/modules/audio_coding/codecs/isac/fix/source/filterbank_internal.h"
-#include "webrtc/modules/audio_coding/codecs/isac/fix/source/filterbank_tables.h"
-#include "webrtc/modules/audio_coding/codecs/isac/fix/source/settings.h"
-#include "webrtc/rtc_base/sanitizer.h"
-#include "webrtc/system_wrappers/include/cpu_features_wrapper.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/typedefs.h"
-
-class FilterBanksTest : public testing::Test {
- protected:
-  // Pass a function pointer to the Tester function.
-  void RTC_NO_SANITIZE("signed-integer-overflow")  // bugs.webrtc.org/5513
-  CalculateResidualEnergyTester(AllpassFilter2FixDec16
-                                AllpassFilter2FixDec16Function) {
-    const int kSamples = QLOOKAHEAD;
-    const int kState = 2;
-    int16_t data_ch1[kSamples] = {0};
-    int16_t data_ch2[kSamples] = {0};
-    int32_t state_ch1[kState] = {0};
-    int32_t state_ch2[kState] = {0};
-    const int32_t out_state_ch1[kState] = {-809122714, 1645972152};
-    const int32_t out_state_ch2[kState] = {428019288, 1057309936};
-    const int32_t out_data_ch1[kSamples] = {0, 0, 347, 10618, 16718, -7089,
-        32767, 16913, 27042, 8377, -22973, -28372, -27603, -14804, 398, -25332,
-        -11200, 18044, 25223, -6839, 1116, -23984, 32717, 7364};
-    const int32_t out_data_ch2[kSamples] = {0, 0, 3010, 22351, 21106, 16969,
-        -2095, -664, 3513, -30980, 32767, -23839, 13335, 20289, -6831, 339,
-        -17207, 32767, 4959, 6177, 32767, 16599, -4747, 20504};
-    int sign = 1;
-
-    for (int i = 0; i < kSamples; i++) {
-      sign *= -1;
-      data_ch1[i] = sign * WEBRTC_SPL_WORD32_MAX / (i * i + 1);
-      data_ch2[i] = sign * WEBRTC_SPL_WORD32_MIN / (i * i + 1);
-      // UBSan: -1 * -2147483648 cannot be represented in type 'int'
-    };
-
-    AllpassFilter2FixDec16Function(data_ch1,
-                                   data_ch2,
-                                   WebRtcIsacfix_kUpperApFactorsQ15,
-                                   WebRtcIsacfix_kLowerApFactorsQ15,
-                                   kSamples,
-                                   state_ch1,
-                                   state_ch2);
-
-    for (int i = 0; i < kSamples; i++) {
-      EXPECT_EQ(out_data_ch1[i], data_ch1[i]);
-      EXPECT_EQ(out_data_ch2[i], data_ch2[i]);
-    }
-    for (int i = 0; i < kState; i++) {
-      EXPECT_EQ(out_state_ch1[i], state_ch1[i]);
-      EXPECT_EQ(out_state_ch2[i], state_ch2[i]);
-    }
-  }
-};
-
-TEST_F(FilterBanksTest, AllpassFilter2FixDec16Test) {
-  CalculateResidualEnergyTester(WebRtcIsacfix_AllpassFilter2FixDec16C);
-#if defined(WEBRTC_HAS_NEON)
-  CalculateResidualEnergyTester(WebRtcIsacfix_AllpassFilter2FixDec16Neon);
-#endif
-}
-
-TEST_F(FilterBanksTest, HighpassFilterFixDec32Test) {
-  const int kSamples = 20;
-  int16_t in[kSamples];
-  int32_t state[2] = {12345, 987654};
-#ifdef WEBRTC_ARCH_ARM_V7
-  int32_t out[kSamples] = {-1040, -1035, -22875, -1397, -27604, 20018, 7917,
-    -1279, -8552, -14494, -7558, -23537, -27258, -30554, -32768, -3432, -32768,
-    25215, -27536, 22436};
-#else
-  int32_t out[kSamples] = {-1040, -1035, -22875, -1397, -27604, 20017, 7915,
-    -1280, -8554, -14496, -7561, -23541, -27263, -30560, -32768, -3441, -32768,
-    25203, -27550, 22419};
-#endif
-  HighpassFilterFixDec32 WebRtcIsacfix_HighpassFilterFixDec32;
-#if defined(MIPS_DSP_R1_LE)
-  WebRtcIsacfix_HighpassFilterFixDec32 =
-      WebRtcIsacfix_HighpassFilterFixDec32MIPS;
-#else
-  WebRtcIsacfix_HighpassFilterFixDec32 = WebRtcIsacfix_HighpassFilterFixDec32C;
-#endif
-
-  for (int i = 0; i < kSamples; i++) {
-    in[i] = WEBRTC_SPL_WORD32_MAX / (i + 1);
-  }
-
-  WebRtcIsacfix_HighpassFilterFixDec32(in, kSamples,
-      WebRtcIsacfix_kHPStCoeffOut1Q30, state);
-
-  for (int i = 0; i < kSamples; i++) {
-    EXPECT_EQ(out[i], in[i]);
-  }
-}
diff --git a/modules/audio_coding/codecs/isac/fix/source/filters.c b/modules/audio_coding/codecs/isac/fix/source/filters.c
deleted file mode 100644
index 31d4e08..0000000
--- a/modules/audio_coding/codecs/isac/fix/source/filters.c
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- *  Copyright (c) 2011 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/rtc_base/checks.h"
-#include "webrtc/modules/audio_coding/codecs/isac/fix/source/codec.h"
-
-// Autocorrelation function in fixed point.
-// NOTE! Different from SPLIB-version in how it scales the signal.
-int WebRtcIsacfix_AutocorrC(int32_t* __restrict r,
-                            const int16_t* __restrict x,
-                            int16_t N,
-                            int16_t order,
-                            int16_t* __restrict scale) {
-  int i = 0;
-  int j = 0;
-  int16_t scaling = 0;
-  int32_t sum = 0;
-  uint32_t temp = 0;
-  int64_t prod = 0;
-
-  // The ARM assembly code assumptoins.
-  RTC_DCHECK_EQ(0, N % 4);
-  RTC_DCHECK_GE(N, 8);
-
-  // Calculate r[0].
-  for (i = 0; i < N; i++) {
-    prod += x[i] * x[i];
-  }
-
-  // Calculate scaling (the value of shifting).
-  temp = (uint32_t)(prod >> 31);
-  if(temp == 0) {
-    scaling = 0;
-  } else {
-    scaling = 32 - WebRtcSpl_NormU32(temp);
-  }
-  r[0] = (int32_t)(prod >> scaling);
-
-  // Perform the actual correlation calculation.
-  for (i = 1; i < order + 1; i++) {
-    prod = 0;
-    for (j = 0; j < N - i; j++) {
-      prod += x[j] * x[i + j];
-    }
-    sum = (int32_t)(prod >> scaling);
-    r[i] = sum;
-  }
-
-  *scale = scaling;
-
-  return(order + 1);
-}
-
-static const int32_t kApUpperQ15[ALLPASSSECTIONS] = { 1137, 12537 };
-static const int32_t kApLowerQ15[ALLPASSSECTIONS] = { 5059, 24379 };
-
-
-static void AllpassFilterForDec32(int16_t         *InOut16, //Q0
-                                  const int32_t   *APSectionFactors, //Q15
-                                  int16_t         lengthInOut,
-                                  int32_t          *FilterState) //Q16
-{
-  int n, j;
-  int32_t a, b;
-
-  for (j=0; j<ALLPASSSECTIONS; j++) {
-    for (n=0;n<lengthInOut;n+=2){
-      a = WEBRTC_SPL_MUL_16_32_RSFT16(InOut16[n], APSectionFactors[j]); //Q0*Q31=Q31 shifted 16 gives Q15
-      a <<= 1;  // Q15 -> Q16
-      b = WebRtcSpl_AddSatW32(a, FilterState[j]);  //Q16+Q16=Q16
-      // |a| in Q15 (Q0*Q31=Q31 shifted 16 gives Q15).
-      a = WEBRTC_SPL_MUL_16_32_RSFT16(b >> 16, -APSectionFactors[j]);
-      // FilterState[j]: Q15<<1 + Q0<<16 = Q16 + Q16 = Q16
-      FilterState[j] = WebRtcSpl_AddSatW32(a << 1, (uint32_t)InOut16[n] << 16);
-      InOut16[n] = (int16_t)(b >> 16);  // Save as Q0.
-    }
-  }
-}
-
-
-
-
-void WebRtcIsacfix_DecimateAllpass32(const int16_t *in,
-                                     int32_t *state_in,        /* array of size: 2*ALLPASSSECTIONS+1 */
-                                     int16_t N,                /* number of input samples */
-                                     int16_t *out)             /* array of size N/2 */
-{
-  int n;
-  int16_t data_vec[PITCH_FRAME_LEN];
-
-  /* copy input */
-  memcpy(data_vec + 1, in, sizeof(int16_t) * (N - 1));
-
-  data_vec[0] = (int16_t)(state_in[2 * ALLPASSSECTIONS] >> 16);  // z^-1 state.
-  state_in[2 * ALLPASSSECTIONS] = (uint32_t)in[N - 1] << 16;
-
-
-
-  AllpassFilterForDec32(data_vec+1, kApUpperQ15, N, state_in);
-  AllpassFilterForDec32(data_vec, kApLowerQ15, N, state_in+ALLPASSSECTIONS);
-
-  for (n=0;n<N/2;n++) {
-    out[n] = WebRtcSpl_AddSatW16(data_vec[2 * n], data_vec[2 * n + 1]);
-  }
-}
diff --git a/modules/audio_coding/codecs/isac/fix/source/filters_mips.c b/modules/audio_coding/codecs/isac/fix/source/filters_mips.c
deleted file mode 100644
index 056dc27..0000000
--- a/modules/audio_coding/codecs/isac/fix/source/filters_mips.c
+++ /dev/null
@@ -1,365 +0,0 @@
-/*
- *  Copyright (c) 2014 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/codecs/isac/fix/source/codec.h"
-
-// MIPS optimized implementation of the Autocorrelation function in fixed point.
-// NOTE! Different from SPLIB-version in how it scales the signal.
-int WebRtcIsacfix_AutocorrMIPS(int32_t* __restrict r,
-                               const int16_t* __restrict x,
-                               int16_t N,
-                               int16_t order,
-                               int16_t* __restrict scale) {
-  int i = 0;
-  int16_t scaling = 0;
-  int16_t* in = (int16_t*)x;
-  int loop_size = (int)(N >> 3);
-  int count = (int)(N & 7);
-  // Declare temporary variables used as registry values.
-  int32_t r0, r1, r2, r3;
-#if !defined(MIPS_DSP_R2_LE)
-  // For non-DSPR2 optimizations 4 more registers are used.
-  int32_t r4, r5, r6, r7;
-#endif
-
-  // Calculate r[0] and scaling needed.
-  __asm __volatile (
-    ".set          push                                            \n\t"
-    ".set          noreorder                                       \n\t"
-    "mult          $0,             $0                              \n\t"
-    // Loop is unrolled 8 times, set accumulator to zero in branch delay slot.
-    "beqz          %[loop_size],   2f                              \n\t"
-    " mult         $0,             $0                              \n\t"
-   "1:                                                             \n\t"
-    // Load 8 samples per loop iteration.
-#if defined(MIPS_DSP_R2_LE)
-    "ulw           %[r0],          0(%[in])                        \n\t"
-    "ulw           %[r1],          4(%[in])                        \n\t"
-    "ulw           %[r2],          8(%[in])                        \n\t"
-    "ulw           %[r3],          12(%[in])                       \n\t"
-#else
-    "lh            %[r0],          0(%[in])                        \n\t"
-    "lh            %[r1],          2(%[in])                        \n\t"
-    "lh            %[r2],          4(%[in])                        \n\t"
-    "lh            %[r3],          6(%[in])                        \n\t"
-    "lh            %[r4],          8(%[in])                        \n\t"
-    "lh            %[r5],          10(%[in])                       \n\t"
-    "lh            %[r6],          12(%[in])                       \n\t"
-    "lh            %[r7],          14(%[in])                       \n\t"
-#endif
-    "addiu         %[loop_size],   %[loop_size],   -1              \n\t"
-    // Multiply and accumulate.
-#if defined(MIPS_DSP_R2_LE)
-    "dpa.w.ph      $ac0,           %[r0],          %[r0]           \n\t"
-    "dpa.w.ph      $ac0,           %[r1],          %[r1]           \n\t"
-    "dpa.w.ph      $ac0,           %[r2],          %[r2]           \n\t"
-    "dpa.w.ph      $ac0,           %[r3],          %[r3]           \n\t"
-#else
-    "madd          %[r0],          %[r0]                           \n\t"
-    "madd          %[r1],          %[r1]                           \n\t"
-    "madd          %[r2],          %[r2]                           \n\t"
-    "madd          %[r3],          %[r3]                           \n\t"
-    "madd          %[r4],          %[r4]                           \n\t"
-    "madd          %[r5],          %[r5]                           \n\t"
-    "madd          %[r6],          %[r6]                           \n\t"
-    "madd          %[r7],          %[r7]                           \n\t"
-#endif
-    "bnez          %[loop_size],   1b                              \n\t"
-    " addiu        %[in],          %[in],          16              \n\t"
-   "2:                                                             \n\t"
-    "beqz          %[count],       4f                              \n\t"
-#if defined(MIPS_DSP_R1_LE)
-    " extr.w       %[r0],          $ac0,           31              \n\t"
-#else
-    " mfhi         %[r2]                                           \n\t"
-#endif
-    // Process remaining samples (if any).
-   "3:                                                             \n\t"
-    "lh            %[r0],          0(%[in])                        \n\t"
-    "addiu         %[count],       %[count],       -1              \n\t"
-    "madd          %[r0],          %[r0]                           \n\t"
-    "bnez          %[count],       3b                              \n\t"
-    " addiu        %[in],          %[in],          2               \n\t"
-#if defined(MIPS_DSP_R1_LE)
-    "extr.w        %[r0],          $ac0,           31              \n\t"
-#else
-    "mfhi          %[r2]                                           \n\t"
-#endif
-   "4:                                                             \n\t"
-#if !defined(MIPS_DSP_R1_LE)
-    "mflo          %[r3]                                           \n\t"
-    "sll           %[r0],          %[r2],          1               \n\t"
-    "srl           %[r1],          %[r3],          31              \n\t"
-    "addu          %[r0],          %[r0],          %[r1]           \n\t"
-#endif
-    // Calculate scaling (the value of shifting).
-    "clz           %[r1],          %[r0]                           \n\t"
-    "addiu         %[r1],          %[r1],          -32             \n\t"
-    "subu          %[scaling],     $0,             %[r1]           \n\t"
-    "slti          %[r1],          %[r0],          0x1             \n\t"
-    "movn          %[scaling],     $0,             %[r1]           \n\t"
-#if defined(MIPS_DSP_R1_LE)
-    "extrv.w       %[r0],          $ac0,           %[scaling]      \n\t"
-    "mfhi          %[r2],          $ac0                            \n\t"
-#else
-    "addiu         %[r1],          %[scaling],     -32             \n\t"
-    "subu          %[r1],          $0,             %[r1]           \n\t"
-    "sllv          %[r1],          %[r2],          %[r1]           \n\t"
-    "srlv          %[r0],          %[r3],          %[scaling]      \n\t"
-    "addu          %[r0],          %[r0],          %[r1]           \n\t"
-#endif
-    "slti          %[r1],          %[scaling],     32              \n\t"
-    "movz          %[r0],          %[r2],          %[r1]           \n\t"
-    ".set          pop                                             \n\t"
-    : [loop_size] "+r" (loop_size), [in] "+r" (in), [r0] "=&r" (r0),
-      [r1] "=&r" (r1), [r2] "=&r" (r2), [r3] "=&r" (r3),
-#if !defined(MIPS_DSP_R2_LE)
-      [r4] "=&r" (r4), [r5] "=&r" (r5), [r6] "=&r" (r6), [r7] "=&r" (r7),
-#endif
-      [count] "+r" (count), [scaling] "=r" (scaling)
-    : [N] "r" (N)
-    : "memory", "hi", "lo"
-  );
-  r[0] = r0;
-
-  // Correlation calculation is divided in 3 cases depending on the scaling
-  // value (different accumulator manipulation needed). Three slightly different
-  // loops are written in order to avoid branches inside the loop.
-  if (scaling == 0) {
-    // In this case, the result will be in low part of the accumulator.
-    for (i = 1; i < order + 1; i++) {
-      in = (int16_t*)x;
-      int16_t* in1 = (int16_t*)x + i;
-      count = N - i;
-      loop_size = (count) >> 2;
-      __asm  __volatile (
-        ".set        push                                          \n\t"
-        ".set        noreorder                                     \n\t"
-        "mult        $0,             $0                            \n\t"
-        "beqz        %[loop_size],   2f                            \n\t"
-        " andi       %[count],       %[count],       0x3           \n\t"
-        // Loop processing 4 pairs of samples per iteration.
-       "1:                                                         \n\t"
-#if defined(MIPS_DSP_R2_LE)
-        "ulw         %[r0],          0(%[in])                      \n\t"
-        "ulw         %[r1],          0(%[in1])                     \n\t"
-        "ulw         %[r2],          4(%[in])                      \n\t"
-        "ulw         %[r3],          4(%[in1])                     \n\t"
-#else
-        "lh          %[r0],          0(%[in])                      \n\t"
-        "lh          %[r1],          0(%[in1])                     \n\t"
-        "lh          %[r2],          2(%[in])                      \n\t"
-        "lh          %[r3],          2(%[in1])                     \n\t"
-        "lh          %[r4],          4(%[in])                      \n\t"
-        "lh          %[r5],          4(%[in1])                     \n\t"
-        "lh          %[r6],          6(%[in])                      \n\t"
-        "lh          %[r7],          6(%[in1])                     \n\t"
-#endif
-        "addiu       %[loop_size],   %[loop_size],   -1            \n\t"
-#if defined(MIPS_DSP_R2_LE)
-        "dpa.w.ph    $ac0,           %[r0],          %[r1]         \n\t"
-        "dpa.w.ph    $ac0,           %[r2],          %[r3]         \n\t"
-#else
-        "madd        %[r0],          %[r1]                         \n\t"
-        "madd        %[r2],          %[r3]                         \n\t"
-        "madd        %[r4],          %[r5]                         \n\t"
-        "madd        %[r6],          %[r7]                         \n\t"
-#endif
-        "addiu       %[in],          %[in],          8             \n\t"
-        "bnez        %[loop_size],   1b                            \n\t"
-        " addiu      %[in1],         %[in1],         8             \n\t"
-       "2:                                                         \n\t"
-        "beqz        %[count],       4f                            \n\t"
-        " mflo       %[r0]                                         \n\t"
-        // Process remaining samples (if any).
-       "3:                                                         \n\t"
-        "lh          %[r0],          0(%[in])                      \n\t"
-        "lh          %[r1],          0(%[in1])                     \n\t"
-        "addiu       %[count],       %[count],       -1            \n\t"
-        "addiu       %[in],          %[in],          2             \n\t"
-        "madd        %[r0],          %[r1]                         \n\t"
-        "bnez        %[count],       3b                            \n\t"
-        " addiu      %[in1],         %[in1],         2             \n\t"
-        "mflo        %[r0]                                         \n\t"
-       "4:                                                         \n\t"
-        ".set        pop                                           \n\t"
-        : [loop_size] "+r" (loop_size), [in] "+r" (in), [in1] "+r" (in1),
-#if !defined(MIPS_DSP_R2_LE)
-          [r4] "=&r" (r4), [r5] "=&r" (r5), [r6] "=&r" (r6), [r7] "=&r" (r7),
-#endif
-          [r0] "=&r" (r0), [r1] "=&r" (r1), [r2] "=&r" (r2), [r3] "=&r" (r3),
-          [count] "+r" (count)
-        :
-        : "memory", "hi", "lo"
-      );
-      r[i] = r0;
-    }
-  } else if (scaling == 32) {
-    // In this case, the result will be high part of the accumulator.
-    for (i = 1; i < order + 1; i++) {
-      in = (int16_t*)x;
-      int16_t* in1 = (int16_t*)x + i;
-      count = N - i;
-      loop_size = (count) >> 2;
-      __asm __volatile (
-        ".set        push                                          \n\t"
-        ".set        noreorder                                     \n\t"
-        "mult        $0,             $0                            \n\t"
-        "beqz        %[loop_size],   2f                            \n\t"
-        " andi       %[count],       %[count],       0x3           \n\t"
-        // Loop processing 4 pairs of samples per iteration.
-       "1:                                                         \n\t"
-#if defined(MIPS_DSP_R2_LE)
-        "ulw         %[r0],          0(%[in])                      \n\t"
-        "ulw         %[r1],          0(%[in1])                     \n\t"
-        "ulw         %[r2],          4(%[in])                      \n\t"
-        "ulw         %[r3],          4(%[in1])                     \n\t"
-#else
-        "lh          %[r0],          0(%[in])                      \n\t"
-        "lh          %[r1],          0(%[in1])                     \n\t"
-        "lh          %[r2],          2(%[in])                      \n\t"
-        "lh          %[r3],          2(%[in1])                     \n\t"
-        "lh          %[r4],          4(%[in])                      \n\t"
-        "lh          %[r5],          4(%[in1])                     \n\t"
-        "lh          %[r6],          6(%[in])                      \n\t"
-        "lh          %[r7],          6(%[in1])                     \n\t"
-#endif
-        "addiu       %[loop_size],   %[loop_size],   -1            \n\t"
-#if defined(MIPS_DSP_R2_LE)
-        "dpa.w.ph    $ac0,           %[r0],          %[r1]         \n\t"
-        "dpa.w.ph    $ac0,           %[r2],          %[r3]         \n\t"
-#else
-        "madd        %[r0],          %[r1]                         \n\t"
-        "madd        %[r2],          %[r3]                         \n\t"
-        "madd        %[r4],          %[r5]                         \n\t"
-        "madd        %[r6],          %[r7]                         \n\t"
-#endif
-        "addiu       %[in],          %[in],          8             \n\t"
-        "bnez        %[loop_size],   1b                            \n\t"
-        " addiu      %[in1],         %[in1],         8             \n\t"
-       "2:                                                         \n\t"
-        "beqz        %[count],       4f                            \n\t"
-        " mfhi       %[r0]                                         \n\t"
-        // Process remaining samples (if any).
-       "3:                                                         \n\t"
-        "lh          %[r0],          0(%[in])                      \n\t"
-        "lh          %[r1],          0(%[in1])                     \n\t"
-        "addiu       %[count],       %[count],       -1            \n\t"
-        "addiu       %[in],          %[in],          2             \n\t"
-        "madd        %[r0],          %[r1]                         \n\t"
-        "bnez        %[count],       3b                            \n\t"
-        " addiu      %[in1],         %[in1],         2             \n\t"
-        "mfhi        %[r0]                                         \n\t"
-       "4:                                                         \n\t"
-        ".set        pop                                           \n\t"
-        : [loop_size] "+r" (loop_size), [in] "+r" (in), [in1] "+r" (in1),
-#if !defined(MIPS_DSP_R2_LE)
-          [r4] "=&r" (r4), [r5] "=&r" (r5), [r6] "=&r" (r6), [r7] "=&r" (r7),
-#endif
-          [r0] "=&r" (r0), [r1] "=&r" (r1), [r2] "=&r" (r2), [r3] "=&r" (r3),
-          [count] "+r" (count)
-        :
-        : "memory", "hi", "lo"
-      );
-      r[i] = r0;
-    }
-  } else {
-    // In this case, the result is obtained by combining low and high parts
-    // of the accumulator.
-#if !defined(MIPS_DSP_R1_LE)
-    int32_t tmp_shift = 32 - scaling;
-#endif
-    for (i = 1; i < order + 1; i++) {
-      in = (int16_t*)x;
-      int16_t* in1 = (int16_t*)x + i;
-      count = N - i;
-      loop_size = (count) >> 2;
-      __asm __volatile (
-        ".set        push                                          \n\t"
-        ".set        noreorder                                     \n\t"
-        "mult        $0,             $0                            \n\t"
-        "beqz        %[loop_size],   2f                            \n\t"
-        " andi       %[count],       %[count],       0x3           \n\t"
-       "1:                                                         \n\t"
-#if defined(MIPS_DSP_R2_LE)
-        "ulw         %[r0],          0(%[in])                      \n\t"
-        "ulw         %[r1],          0(%[in1])                     \n\t"
-        "ulw         %[r2],          4(%[in])                      \n\t"
-        "ulw         %[r3],          4(%[in1])                     \n\t"
-#else
-        "lh          %[r0],          0(%[in])                      \n\t"
-        "lh          %[r1],          0(%[in1])                     \n\t"
-        "lh          %[r2],          2(%[in])                      \n\t"
-        "lh          %[r3],          2(%[in1])                     \n\t"
-        "lh          %[r4],          4(%[in])                      \n\t"
-        "lh          %[r5],          4(%[in1])                     \n\t"
-        "lh          %[r6],          6(%[in])                      \n\t"
-        "lh          %[r7],          6(%[in1])                     \n\t"
-#endif
-        "addiu       %[loop_size],   %[loop_size],   -1            \n\t"
-#if defined(MIPS_DSP_R2_LE)
-        "dpa.w.ph    $ac0,           %[r0],          %[r1]         \n\t"
-        "dpa.w.ph    $ac0,           %[r2],          %[r3]         \n\t"
-#else
-        "madd        %[r0],          %[r1]                         \n\t"
-        "madd        %[r2],          %[r3]                         \n\t"
-        "madd        %[r4],          %[r5]                         \n\t"
-        "madd        %[r6],          %[r7]                         \n\t"
-#endif
-        "addiu       %[in],          %[in],          8             \n\t"
-        "bnez        %[loop_size],   1b                            \n\t"
-        " addiu      %[in1],         %[in1],         8             \n\t"
-       "2:                                                         \n\t"
-        "beqz        %[count],       4f                            \n\t"
-#if defined(MIPS_DSP_R1_LE)
-        " extrv.w    %[r0],          $ac0,           %[scaling]    \n\t"
-#else
-        " mfhi       %[r0]                                         \n\t"
-#endif
-       "3:                                                         \n\t"
-        "lh          %[r0],          0(%[in])                      \n\t"
-        "lh          %[r1],          0(%[in1])                     \n\t"
-        "addiu       %[count],       %[count],       -1            \n\t"
-        "addiu       %[in],          %[in],          2             \n\t"
-        "madd        %[r0],          %[r1]                         \n\t"
-        "bnez        %[count],       3b                            \n\t"
-        " addiu      %[in1],         %[in1],         2             \n\t"
-#if defined(MIPS_DSP_R1_LE)
-        "extrv.w     %[r0],          $ac0,           %[scaling]    \n\t"
-#else
-        "mfhi        %[r0]                                         \n\t"
-#endif
-       "4:                                                         \n\t"
-#if !defined(MIPS_DSP_R1_LE)
-        "mflo        %[r1]                                         \n\t"
-        "sllv        %[r0],          %[r0],          %[tmp_shift]  \n\t"
-        "srlv        %[r1],          %[r1],          %[scaling]    \n\t"
-        "addu        %[r0],          %[r0],          %[r1]         \n\t"
-#endif
-        ".set        pop                                           \n\t"
-        : [loop_size] "+r" (loop_size), [in] "+r" (in), [in1] "+r" (in1),
-#if !defined(MIPS_DSP_R2_LE)
-          [r4] "=&r" (r4), [r5] "=&r" (r5), [r6] "=&r" (r6), [r7] "=&r" (r7),
-#endif
-          [r0] "=&r" (r0), [r1] "=&r" (r1), [r2] "=&r" (r2), [r3] "=&r" (r3),
-          [count] "+r" (count)
-        : [scaling] "r" (scaling)
-#if !defined(MIPS_DSP_R1_LE)
-        , [tmp_shift] "r" (tmp_shift)
-#endif
-        : "memory", "hi", "lo"
-      );
-      r[i] = r0;
-    }
-  }
-  *scale = scaling;
-
-  return (order + 1);
-}
diff --git a/modules/audio_coding/codecs/isac/fix/source/filters_neon.c b/modules/audio_coding/codecs/isac/fix/source/filters_neon.c
deleted file mode 100644
index 9ec2b13..0000000
--- a/modules/audio_coding/codecs/isac/fix/source/filters_neon.c
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- *  Copyright (c) 2014 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 <arm_neon.h>
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/modules/audio_coding/codecs/isac/fix/source/codec.h"
-
-// Autocorrelation function in fixed point.
-// NOTE! Different from SPLIB-version in how it scales the signal.
-int WebRtcIsacfix_AutocorrNeon(int32_t* __restrict r,
-                               const int16_t* x,
-                               int16_t n,
-                               int16_t order,
-                               int16_t* __restrict scale) {
-  int i = 0;
-  int16_t scaling = 0;
-  uint32_t temp = 0;
-  int64_t prod = 0;
-  int64_t prod_tail = 0;
-
-  RTC_DCHECK_EQ(0, n % 4);
-  RTC_DCHECK_GE(n, 8);
-
-  // Calculate r[0].
-  int16x4_t x0_v;
-  int32x4_t tmpa0_v;
-  int64x2_t tmpb_v;
-
-  tmpb_v = vdupq_n_s64(0);
-  const int16_t* x_start = x;
-  const int16_t* x_end0 = x_start + n;
-  while (x_start < x_end0) {
-    x0_v = vld1_s16(x_start);
-    tmpa0_v = vmull_s16(x0_v, x0_v);
-    tmpb_v = vpadalq_s32(tmpb_v, tmpa0_v);
-    x_start += 4;
-  }
-
-#ifdef WEBRTC_ARCH_ARM64
-  prod = vaddvq_s64(tmpb_v);
-#else
-  prod = vget_lane_s64(vadd_s64(vget_low_s64(tmpb_v), vget_high_s64(tmpb_v)),
-                       0);
-#endif
-  // Calculate scaling (the value of shifting).
-  temp = (uint32_t)(prod >> 31);
-
-  scaling = temp ? 32 - WebRtcSpl_NormU32(temp) : 0;
-  r[0] = (int32_t)(prod >> scaling);
-
-  int16x8_t x1_v;
-  int16x8_t y_v;
-  int32x4_t tmpa1_v;
-  // Perform the actual correlation calculation.
-  for (i = 1; i < order + 1; i++) {
-    tmpb_v = vdupq_n_s64(0);
-    int rest = (n - i) % 8;
-    x_start = x;
-    x_end0 = x_start + n - i - rest;
-    const int16_t* y_start = x_start + i;
-    while (x_start < x_end0) {
-      x1_v = vld1q_s16(x_start);
-      y_v = vld1q_s16(y_start);
-      tmpa0_v = vmull_s16(vget_low_s16(x1_v), vget_low_s16(y_v));
-#ifdef WEBRTC_ARCH_ARM64
-      tmpa1_v = vmull_high_s16(x1_v, y_v);
-#else
-      tmpa1_v = vmull_s16(vget_high_s16(x1_v), vget_high_s16(y_v));
-#endif
-      tmpb_v = vpadalq_s32(tmpb_v, tmpa0_v);
-      tmpb_v = vpadalq_s32(tmpb_v, tmpa1_v);
-      x_start += 8;
-      y_start += 8;
-    }
-    // The remaining calculation.
-    const int16_t* x_end1 = x + n - i;
-    if (rest >= 4) {
-        int16x4_t x2_v = vld1_s16(x_start);
-        int16x4_t y2_v = vld1_s16(y_start);
-        tmpa0_v = vmull_s16(x2_v, y2_v);
-        tmpb_v = vpadalq_s32(tmpb_v, tmpa0_v);
-        x_start += 4;
-        y_start += 4;
-    }
-#ifdef WEBRTC_ARCH_ARM64
-    prod = vaddvq_s64(tmpb_v);
-#else
-    prod = vget_lane_s64(vadd_s64(vget_low_s64(tmpb_v), vget_high_s64(tmpb_v)),
-                         0);
-#endif
-
-    prod_tail = 0;
-    while (x_start < x_end1) {
-      prod_tail += *x_start * *y_start;
-      ++x_start;
-      ++y_start;
-    }
-
-    r[i] = (int32_t)((prod + prod_tail) >> scaling);
-  }
-
-  *scale = scaling;
-
-  return order + 1;
-}
-
diff --git a/modules/audio_coding/codecs/isac/fix/source/filters_unittest.cc b/modules/audio_coding/codecs/isac/fix/source/filters_unittest.cc
deleted file mode 100644
index 527841a..0000000
--- a/modules/audio_coding/codecs/isac/fix/source/filters_unittest.cc
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- *  Copyright (c) 2012 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/codecs/isac/fix/source/codec.h"
-#include "webrtc/system_wrappers/include/cpu_features_wrapper.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/typedefs.h"
-
-class FiltersTest : public testing::Test {
- protected:
-  // Pass a function pointer to the Tester function.
-  void FiltersTester(AutocorrFix WebRtcIsacfix_AutocorrFixFunction) {
-    const int kOrder = 12;
-    const int kBuffer = 40;
-    int16_t scale = 0;
-    int32_t r_buffer[kOrder + 2] = {0};
-
-    // Test an overflow case.
-    const int16_t x_buffer_0[kBuffer] = {0, 0, 3010, 22351, 21106, 16969, -2095,
-        -664, 3513, -30980, 32767, -23839, 13335, 20289, -6831, 339, -17207,
-        32767, 4959, 6177, 32767, 16599, -4747, 20504, 3513, -30980, 32767,
-        -23839, 13335, 20289, 0, -16969, -2095, -664, 3513, 31981, 32767,
-        -13839, 23336, 30281};
-    const int32_t r_expected_0[kOrder + 2] = {1872498461, -224288754, 203789985,
-        483400487, -208272635, 2436500, 137785322, 266600814, -208486262,
-        329510080, 137949184, -161738972, -26894267, 237630192};
-
-    WebRtcIsacfix_AutocorrFixFunction(r_buffer, x_buffer_0,
-                                      kBuffer, kOrder + 1, &scale);
-    for (int i = 0; i < kOrder + 2; i++) {
-      EXPECT_EQ(r_expected_0[i], r_buffer[i]);
-    }
-    EXPECT_EQ(3, scale);
-
-    // Test a no-overflow case.
-    const int16_t x_buffer_1[kBuffer] = {0, 0, 300, 21, 206, 169, -295,
-        -664, 3513, -300, 327, -29, 15, 289, -6831, 339, -107,
-        37, 59, 6177, 327, 169, -4747, 204, 313, -980, 767,
-        -9, 135, 289, 0, -6969, -2095, -664, 0, 1, 7,
-        -39, 236, 281};
-    const int32_t r_expected_1[kOrder + 2] = {176253864, 8126617, 1983287,
-        -26196788, -3487363, -42839676, -24644043, 3469813, 30559879, 31905045,
-        5101567, 29328896, -55787438, -13163978};
-
-    WebRtcIsacfix_AutocorrFixFunction(r_buffer, x_buffer_1,
-                                      kBuffer, kOrder + 1, &scale);
-    for (int i = 0; i < kOrder + 2; i++) {
-      EXPECT_EQ(r_expected_1[i], r_buffer[i]);
-    }
-    EXPECT_EQ(0, scale);
-  }
-};
-
-TEST_F(FiltersTest, AutocorrFixTest) {
-  FiltersTester(WebRtcIsacfix_AutocorrC);
-#if defined(WEBRTC_HAS_NEON)
-  FiltersTester(WebRtcIsacfix_AutocorrNeon);
-#endif
-}
diff --git a/modules/audio_coding/codecs/isac/fix/source/initialize.c b/modules/audio_coding/codecs/isac/fix/source/initialize.c
deleted file mode 100644
index 4481f98..0000000
--- a/modules/audio_coding/codecs/isac/fix/source/initialize.c
+++ /dev/null
@@ -1,173 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/*
- * initialize.c
- *
- * Internal initfunctions
- *
- */
-
-#include "codec.h"
-#include "structs.h"
-#include "pitch_estimator.h"
-
-
-void WebRtcIsacfix_InitMaskingEnc(MaskFiltstr_enc *maskdata) {
-
-  int k;
-
-  for (k = 0; k < WINLEN; k++) {
-    maskdata->DataBufferLoQ0[k] = (int16_t) 0;
-    maskdata->DataBufferHiQ0[k] = (int16_t) 0;
-  }
-  for (k = 0; k < ORDERLO+1; k++) {
-    maskdata->CorrBufLoQQ[k] = (int32_t) 0;
-    maskdata->CorrBufLoQdom[k] = 0;
-
-    maskdata->PreStateLoGQ15[k] = 0;
-
-  }
-  for (k = 0; k < ORDERHI+1; k++) {
-    maskdata->CorrBufHiQQ[k] = (int32_t) 0;
-    maskdata->CorrBufHiQdom[k] = 0;
-    maskdata->PreStateHiGQ15[k] = 0;
-  }
-
-  maskdata->OldEnergy = 10;
-
-  return;
-}
-
-void WebRtcIsacfix_InitMaskingDec(MaskFiltstr_dec *maskdata) {
-
-  int k;
-
-  for (k = 0; k < ORDERLO+1; k++)
-  {
-    maskdata->PostStateLoGQ0[k] = 0;
-  }
-  for (k = 0; k < ORDERHI+1; k++)
-  {
-    maskdata->PostStateHiGQ0[k] = 0;
-  }
-
-  maskdata->OldEnergy = 10;
-
-  return;
-}
-
-
-
-
-
-
-
-void WebRtcIsacfix_InitPreFilterbank(PreFiltBankstr *prefiltdata)
-{
-  int k;
-
-  for (k = 0; k < QLOOKAHEAD; k++) {
-    prefiltdata->INLABUF1_fix[k] = 0;
-    prefiltdata->INLABUF2_fix[k] = 0;
-  }
-  for (k = 0; k < 2 * (QORDER - 1); k++) {
-    prefiltdata->INSTAT1_fix[k] = 0;
-    prefiltdata->INSTAT2_fix[k] = 0;
-  }
-
-  /* High pass filter states */
-  prefiltdata->HPstates_fix[0] = 0;
-  prefiltdata->HPstates_fix[1] = 0;
-
-  return;
-}
-
-void WebRtcIsacfix_InitPostFilterbank(PostFiltBankstr *postfiltdata)
-{
-  int k;
-
-  for (k = 0; k < 2 * POSTQORDER; k++) {
-    postfiltdata->STATE_0_LOWER_fix[k] = 0;
-    postfiltdata->STATE_0_UPPER_fix[k] = 0;
-  }
-
-  /* High pass filter states */
-
-  postfiltdata->HPstates1_fix[0] = 0;
-  postfiltdata->HPstates1_fix[1] = 0;
-
-  postfiltdata->HPstates2_fix[0] = 0;
-  postfiltdata->HPstates2_fix[1] = 0;
-
-  return;
-}
-
-
-void WebRtcIsacfix_InitPitchFilter(PitchFiltstr *pitchfiltdata)
-{
-  int k;
-
-  for (k = 0; k < PITCH_BUFFSIZE; k++)
-    pitchfiltdata->ubufQQ[k] = 0;
-  for (k = 0; k < (PITCH_DAMPORDER); k++)
-    pitchfiltdata->ystateQQ[k] = 0;
-
-  pitchfiltdata->oldlagQ7 = 6400; /* 50.0 in Q7 */
-  pitchfiltdata->oldgainQ12 = 0;
-}
-
-void WebRtcIsacfix_InitPitchAnalysis(PitchAnalysisStruct *State)
-{
-  int k;
-
-  for (k = 0; k < PITCH_CORR_LEN2+PITCH_CORR_STEP2+PITCH_MAX_LAG/2-PITCH_FRAME_LEN/2+2; k++) {
-    State->dec_buffer16[k] = 0;
-  }
-  for (k = 0; k < 2 * ALLPASSSECTIONS + 1; k++) {
-    State->decimator_state32[k] = 0;
-  }
-
-  for (k = 0; k < QLOOKAHEAD; k++)
-    State->inbuf[k] = 0;
-
-  WebRtcIsacfix_InitPitchFilter(&(State->PFstr_wght));
-
-  WebRtcIsacfix_InitPitchFilter(&(State->PFstr));
-}
-
-
-void WebRtcIsacfix_InitPlc( PLCstr *State )
-{
-  State->decayCoeffPriodic = WEBRTC_SPL_WORD16_MAX;
-  State->decayCoeffNoise = WEBRTC_SPL_WORD16_MAX;
-
-  State->used = PLC_WAS_USED;
-
-  WebRtcSpl_ZerosArrayW16(State->overlapLP, RECOVERY_OVERLAP);
-  WebRtcSpl_ZerosArrayW16(State->lofilt_coefQ15, ORDERLO);
-  WebRtcSpl_ZerosArrayW16(State->hifilt_coefQ15, ORDERHI );
-
-  State->AvgPitchGain_Q12 = 0;
-  State->lastPitchGain_Q12 = 0;
-  State->lastPitchLag_Q7 = 0;
-  State->gain_lo_hiQ17[0]=State->gain_lo_hiQ17[1] = 0;
-  WebRtcSpl_ZerosArrayW16(State->prevPitchInvIn, FRAMESAMPLES/2);
-  WebRtcSpl_ZerosArrayW16(State->prevPitchInvOut, PITCH_MAX_LAG + 10 );
-  WebRtcSpl_ZerosArrayW32(State->prevHP, PITCH_MAX_LAG + 10 );
-  State->pitchCycles = 0;
-  State->A = 0;
-  State->B = 0;
-  State->pitchIndex = 0;
-  State->stretchLag = 240;
-  State->seed = 4447;
-
-
-}
diff --git a/modules/audio_coding/codecs/isac/fix/source/isac_fix_type.h b/modules/audio_coding/codecs/isac/fix/source/isac_fix_type.h
deleted file mode 100644
index a39444e..0000000
--- a/modules/audio_coding/codecs/isac/fix/source/isac_fix_type.h
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- *  Copyright (c) 2015 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_CODECS_ISAC_FIX_SOURCE_ISAC_FIX_TYPE_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_FIX_SOURCE_ISAC_FIX_TYPE_H_
-
-#include "webrtc/modules/audio_coding/codecs/isac/fix/include/isacfix.h"
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-
-class IsacFix {
- public:
-  using instance_type = ISACFIX_MainStruct;
-  static const bool has_swb = false;
-  static inline int16_t Control(instance_type* inst,
-                                int32_t rate,
-                                int framesize) {
-    return WebRtcIsacfix_Control(inst, rate, framesize);
-  }
-  static inline int16_t ControlBwe(instance_type* inst,
-                                   int32_t rate_bps,
-                                   int frame_size_ms,
-                                   int16_t enforce_frame_size) {
-    return WebRtcIsacfix_ControlBwe(inst, rate_bps, frame_size_ms,
-                                    enforce_frame_size);
-  }
-  static inline int16_t Create(instance_type** inst) {
-    return WebRtcIsacfix_Create(inst);
-  }
-  static inline int DecodeInternal(instance_type* inst,
-                                   const uint8_t* encoded,
-                                   size_t len,
-                                   int16_t* decoded,
-                                   int16_t* speech_type) {
-    return WebRtcIsacfix_Decode(inst, encoded, len, decoded, speech_type);
-  }
-  static inline size_t DecodePlc(instance_type* inst,
-                                 int16_t* decoded,
-                                 size_t num_lost_frames) {
-    return WebRtcIsacfix_DecodePlc(inst, decoded, num_lost_frames);
-  }
-  static inline void DecoderInit(instance_type* inst) {
-    WebRtcIsacfix_DecoderInit(inst);
-  }
-  static inline int Encode(instance_type* inst,
-                           const int16_t* speech_in,
-                           uint8_t* encoded) {
-    return WebRtcIsacfix_Encode(inst, speech_in, encoded);
-  }
-  static inline int16_t EncoderInit(instance_type* inst, int16_t coding_mode) {
-    return WebRtcIsacfix_EncoderInit(inst, coding_mode);
-  }
-  static inline uint16_t EncSampRate(instance_type* inst) {
-    return kFixSampleRate;
-  }
-
-  static inline int16_t Free(instance_type* inst) {
-    return WebRtcIsacfix_Free(inst);
-  }
-  static inline void GetBandwidthInfo(instance_type* inst,
-                                      IsacBandwidthInfo* bwinfo) {
-    WebRtcIsacfix_GetBandwidthInfo(inst, bwinfo);
-  }
-  static inline int16_t GetErrorCode(instance_type* inst) {
-    return WebRtcIsacfix_GetErrorCode(inst);
-  }
-
-  static inline int16_t GetNewFrameLen(instance_type* inst) {
-    return WebRtcIsacfix_GetNewFrameLen(inst);
-  }
-  static inline void SetBandwidthInfo(instance_type* inst,
-                                      const IsacBandwidthInfo* bwinfo) {
-    WebRtcIsacfix_SetBandwidthInfo(inst, bwinfo);
-  }
-  static inline int16_t SetDecSampRate(instance_type* inst,
-                                       uint16_t sample_rate_hz) {
-    RTC_DCHECK_EQ(sample_rate_hz, kFixSampleRate);
-    return 0;
-  }
-  static inline int16_t SetEncSampRate(instance_type* inst,
-                                       uint16_t sample_rate_hz) {
-    RTC_DCHECK_EQ(sample_rate_hz, kFixSampleRate);
-    return 0;
-  }
-  static inline void SetEncSampRateInDecoder(instance_type* inst,
-                                             uint16_t sample_rate_hz) {
-    RTC_DCHECK_EQ(sample_rate_hz, kFixSampleRate);
-  }
-  static inline void SetInitialBweBottleneck(instance_type* inst,
-                                             int bottleneck_bits_per_second) {
-    WebRtcIsacfix_SetInitialBweBottleneck(inst, bottleneck_bits_per_second);
-  }
-  static inline int16_t UpdateBwEstimate(instance_type* inst,
-                                         const uint8_t* encoded,
-                                         size_t packet_size,
-                                         uint16_t rtp_seq_number,
-                                         uint32_t send_ts,
-                                         uint32_t arr_ts) {
-    return WebRtcIsacfix_UpdateBwEstimate(inst, encoded, packet_size,
-                                          rtp_seq_number, send_ts, arr_ts);
-  }
-  static inline int16_t SetMaxPayloadSize(instance_type* inst,
-                                          int16_t max_payload_size_bytes) {
-    return WebRtcIsacfix_SetMaxPayloadSize(inst, max_payload_size_bytes);
-  }
-  static inline int16_t SetMaxRate(instance_type* inst, int32_t max_bit_rate) {
-    return WebRtcIsacfix_SetMaxRate(inst, max_bit_rate);
-  }
-
- private:
-  enum { kFixSampleRate = 16000 };
-};
-
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_FIX_SOURCE_ISAC_FIX_TYPE_H_
diff --git a/modules/audio_coding/codecs/isac/fix/source/isacfix.c b/modules/audio_coding/codecs/isac/fix/source/isacfix.c
deleted file mode 100644
index 3377bf7..0000000
--- a/modules/audio_coding/codecs/isac/fix/source/isacfix.c
+++ /dev/null
@@ -1,1551 +0,0 @@
-/*
- *  Copyright (c) 2012 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.
- */
-
-/*
- * isacfix.c
- *
- * This C file contains the functions for the ISAC API
- *
- */
-
-#include "webrtc/modules/audio_coding/codecs/isac/fix/include/isacfix.h"
-
-#include <stdlib.h>
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/modules/audio_coding/codecs/isac/fix/source/bandwidth_estimator.h"
-#include "webrtc/modules/audio_coding/codecs/isac/fix/source/codec.h"
-#include "webrtc/modules/audio_coding/codecs/isac/fix/source/entropy_coding.h"
-#include "webrtc/modules/audio_coding/codecs/isac/fix/source/filterbank_internal.h"
-#include "webrtc/modules/audio_coding/codecs/isac/fix/source/lpc_masking_model.h"
-#include "webrtc/modules/audio_coding/codecs/isac/fix/source/structs.h"
-#include "webrtc/system_wrappers/include/cpu_features_wrapper.h"
-
-// Declare function pointers.
-FilterMaLoopFix WebRtcIsacfix_FilterMaLoopFix;
-Spec2Time WebRtcIsacfix_Spec2Time;
-Time2Spec WebRtcIsacfix_Time2Spec;
-MatrixProduct1 WebRtcIsacfix_MatrixProduct1;
-MatrixProduct2 WebRtcIsacfix_MatrixProduct2;
-
-/* This method assumes that |stream_size_bytes| is in valid range,
- * i.e. >= 0 && <=  STREAM_MAXW16_60MS
- */
-static void InitializeDecoderBitstream(size_t stream_size_bytes,
-                                       Bitstr_dec* bitstream) {
-  bitstream->W_upper = 0xFFFFFFFF;
-  bitstream->streamval = 0;
-  bitstream->stream_index = 0;
-  bitstream->full = 1;
-  bitstream->stream_size = (stream_size_bytes + 1) >> 1;
-  memset(bitstream->stream, 0, sizeof(bitstream->stream));
-}
-
-/**************************************************************************
- * WebRtcIsacfix_AssignSize(...)
- *
- * Functions used when malloc is not allowed
- * Returns number of bytes needed to allocate for iSAC struct.
- *
- */
-
-int16_t WebRtcIsacfix_AssignSize(int *sizeinbytes) {
-  *sizeinbytes=sizeof(ISACFIX_SubStruct)*2/sizeof(int16_t);
-  return(0);
-}
-
-/***************************************************************************
- * WebRtcIsacfix_Assign(...)
- *
- * Functions used when malloc is not allowed
- * Place struct at given address
- *
- * If successful, Return 0, else Return -1
- */
-
-int16_t WebRtcIsacfix_Assign(ISACFIX_MainStruct **inst, void *ISACFIX_inst_Addr) {
-  if (ISACFIX_inst_Addr!=NULL) {
-    ISACFIX_SubStruct* self = ISACFIX_inst_Addr;
-    *inst = (ISACFIX_MainStruct*)self;
-    self->errorcode = 0;
-    self->initflag = 0;
-    self->ISACenc_obj.SaveEnc_ptr = NULL;
-    WebRtcIsacfix_InitBandwidthEstimator(&self->bwestimator_obj);
-    return(0);
-  } else {
-    return(-1);
-  }
-}
-
-
-#ifndef ISACFIX_NO_DYNAMIC_MEM
-
-/****************************************************************************
- * WebRtcIsacfix_Create(...)
- *
- * This function creates a ISAC instance, which will contain the state
- * information for one coding/decoding channel.
- *
- * Input:
- *      - *ISAC_main_inst   : a pointer to the coder instance.
- *
- * Return value             :  0 - Ok
- *                            -1 - Error
- */
-
-int16_t WebRtcIsacfix_Create(ISACFIX_MainStruct **ISAC_main_inst)
-{
-  ISACFIX_SubStruct *tempo;
-  tempo = malloc(1 * sizeof(ISACFIX_SubStruct));
-  *ISAC_main_inst = (ISACFIX_MainStruct *)tempo;
-  if (*ISAC_main_inst!=NULL) {
-    (*(ISACFIX_SubStruct**)ISAC_main_inst)->errorcode = 0;
-    (*(ISACFIX_SubStruct**)ISAC_main_inst)->initflag = 0;
-    (*(ISACFIX_SubStruct**)ISAC_main_inst)->ISACenc_obj.SaveEnc_ptr = NULL;
-    WebRtcSpl_Init();
-    WebRtcIsacfix_InitBandwidthEstimator(&tempo->bwestimator_obj);
-    return(0);
-  } else {
-    return(-1);
-  }
-}
-
-
-/****************************************************************************
- * WebRtcIsacfix_CreateInternal(...)
- *
- * This function creates the memory that is used to store data in the encoder
- *
- * Input:
- *      - *ISAC_main_inst   : a pointer to the coder instance.
- *
- * Return value             :  0 - Ok
- *                            -1 - Error
- */
-
-int16_t WebRtcIsacfix_CreateInternal(ISACFIX_MainStruct *ISAC_main_inst)
-{
-  ISACFIX_SubStruct *ISAC_inst;
-
-  /* typecast pointer to real structure */
-  ISAC_inst = (ISACFIX_SubStruct *)ISAC_main_inst;
-
-  /* Allocate memory for storing encoder data */
-  ISAC_inst->ISACenc_obj.SaveEnc_ptr = malloc(1 * sizeof(IsacSaveEncoderData));
-
-  if (ISAC_inst->ISACenc_obj.SaveEnc_ptr!=NULL) {
-    return(0);
-  } else {
-    return(-1);
-  }
-}
-
-
-#endif
-
-
-
-/****************************************************************************
- * WebRtcIsacfix_Free(...)
- *
- * This function frees the ISAC instance created at the beginning.
- *
- * Input:
- *      - ISAC_main_inst    : a ISAC instance.
- *
- * Return value             :  0 - Ok
- *                            -1 - Error
- */
-
-int16_t WebRtcIsacfix_Free(ISACFIX_MainStruct *ISAC_main_inst)
-{
-  free(ISAC_main_inst);
-  return(0);
-}
-
-/****************************************************************************
- * WebRtcIsacfix_FreeInternal(...)
- *
- * This function frees the internal memory for storing encoder data.
- *
- * Input:
- *       - ISAC_main_inst    : a ISAC instance.
- *
- * Return value              :  0 - Ok
- *                             -1 - Error
- */
-
-int16_t WebRtcIsacfix_FreeInternal(ISACFIX_MainStruct *ISAC_main_inst)
-{
-  ISACFIX_SubStruct *ISAC_inst;
-
-  /* typecast pointer to real structure */
-  ISAC_inst = (ISACFIX_SubStruct *)ISAC_main_inst;
-
-  /* Release memory */
-  free(ISAC_inst->ISACenc_obj.SaveEnc_ptr);
-
-  return(0);
-}
-
-/****************************************************************************
- * WebRtcIsacfix_InitNeon(...)
- *
- * This function initializes function pointers for ARM Neon platform.
- */
-
-#if defined(WEBRTC_HAS_NEON)
-static void WebRtcIsacfix_InitNeon(void) {
-  WebRtcIsacfix_AutocorrFix = WebRtcIsacfix_AutocorrNeon;
-  WebRtcIsacfix_FilterMaLoopFix = WebRtcIsacfix_FilterMaLoopNeon;
-  WebRtcIsacfix_Spec2Time = WebRtcIsacfix_Spec2TimeNeon;
-  WebRtcIsacfix_Time2Spec = WebRtcIsacfix_Time2SpecNeon;
-  WebRtcIsacfix_AllpassFilter2FixDec16 =
-      WebRtcIsacfix_AllpassFilter2FixDec16Neon;
-  WebRtcIsacfix_MatrixProduct1 = WebRtcIsacfix_MatrixProduct1Neon;
-  WebRtcIsacfix_MatrixProduct2 = WebRtcIsacfix_MatrixProduct2Neon;
-}
-#endif
-
-/****************************************************************************
- * WebRtcIsacfix_InitMIPS(...)
- *
- * This function initializes function pointers for MIPS platform.
- */
-
-#if defined(MIPS32_LE)
-static void WebRtcIsacfix_InitMIPS(void) {
-  WebRtcIsacfix_AutocorrFix = WebRtcIsacfix_AutocorrMIPS;
-  WebRtcIsacfix_FilterMaLoopFix = WebRtcIsacfix_FilterMaLoopMIPS;
-  WebRtcIsacfix_Spec2Time = WebRtcIsacfix_Spec2TimeMIPS;
-  WebRtcIsacfix_Time2Spec = WebRtcIsacfix_Time2SpecMIPS;
-  WebRtcIsacfix_MatrixProduct1 = WebRtcIsacfix_MatrixProduct1MIPS;
-  WebRtcIsacfix_MatrixProduct2 = WebRtcIsacfix_MatrixProduct2MIPS;
-#if defined(MIPS_DSP_R1_LE)
-  WebRtcIsacfix_AllpassFilter2FixDec16 =
-      WebRtcIsacfix_AllpassFilter2FixDec16MIPS;
-  WebRtcIsacfix_HighpassFilterFixDec32 =
-      WebRtcIsacfix_HighpassFilterFixDec32MIPS;
-#endif
-#if defined(MIPS_DSP_R2_LE)
-  WebRtcIsacfix_CalculateResidualEnergy =
-      WebRtcIsacfix_CalculateResidualEnergyMIPS;
-#endif
-}
-#endif
-
-static void InitFunctionPointers(void) {
-  WebRtcIsacfix_AutocorrFix = WebRtcIsacfix_AutocorrC;
-  WebRtcIsacfix_FilterMaLoopFix = WebRtcIsacfix_FilterMaLoopC;
-  WebRtcIsacfix_CalculateResidualEnergy =
-      WebRtcIsacfix_CalculateResidualEnergyC;
-  WebRtcIsacfix_AllpassFilter2FixDec16 = WebRtcIsacfix_AllpassFilter2FixDec16C;
-  WebRtcIsacfix_HighpassFilterFixDec32 = WebRtcIsacfix_HighpassFilterFixDec32C;
-  WebRtcIsacfix_Time2Spec = WebRtcIsacfix_Time2SpecC;
-  WebRtcIsacfix_Spec2Time = WebRtcIsacfix_Spec2TimeC;
-  WebRtcIsacfix_MatrixProduct1 = WebRtcIsacfix_MatrixProduct1C;
-  WebRtcIsacfix_MatrixProduct2 = WebRtcIsacfix_MatrixProduct2C;
-
-#if defined(WEBRTC_HAS_NEON)
-  WebRtcIsacfix_InitNeon();
-#endif
-
-#if defined(MIPS32_LE)
-  WebRtcIsacfix_InitMIPS();
-#endif
-}
-
-/****************************************************************************
- * WebRtcIsacfix_EncoderInit(...)
- *
- * This function initializes a ISAC instance prior to the encoder calls.
- *
- * Input:
- *      - ISAC_main_inst    : ISAC instance.
- *      - CodingMode        : 0 -> Bit rate and frame length are automatically
- *                                 adjusted to available bandwidth on
- *                                 transmission channel.
- *                            1 -> User sets a frame length and a target bit
- *                                 rate which is taken as the maximum short-term
- *                                 average bit rate.
- *
- * Return value             :  0 - Ok
- *                            -1 - Error
- */
-
-int16_t WebRtcIsacfix_EncoderInit(ISACFIX_MainStruct *ISAC_main_inst,
-                                  int16_t  CodingMode)
-{
-  int k;
-  int16_t statusInit;
-  ISACFIX_SubStruct *ISAC_inst;
-
-  statusInit = 0;
-  /* typecast pointer to rela structure */
-  ISAC_inst = (ISACFIX_SubStruct *)ISAC_main_inst;
-
-  /* flag encoder init */
-  ISAC_inst->initflag |= 2;
-
-  if (CodingMode == 0)
-    /* Adaptive mode */
-    ISAC_inst->ISACenc_obj.new_framelength  = INITIAL_FRAMESAMPLES;
-  else if (CodingMode == 1)
-    /* Instantaneous mode */
-    ISAC_inst->ISACenc_obj.new_framelength = 480;    /* default for I-mode */
-  else {
-    ISAC_inst->errorcode = ISAC_DISALLOWED_CODING_MODE;
-    statusInit = -1;
-  }
-
-  ISAC_inst->CodingMode = CodingMode;
-
-  WebRtcIsacfix_InitMaskingEnc(&ISAC_inst->ISACenc_obj.maskfiltstr_obj);
-  WebRtcIsacfix_InitPreFilterbank(&ISAC_inst->ISACenc_obj.prefiltbankstr_obj);
-  WebRtcIsacfix_InitPitchFilter(&ISAC_inst->ISACenc_obj.pitchfiltstr_obj);
-  WebRtcIsacfix_InitPitchAnalysis(&ISAC_inst->ISACenc_obj.pitchanalysisstr_obj);
-
-  WebRtcIsacfix_InitRateModel(&ISAC_inst->ISACenc_obj.rate_data_obj);
-
-
-  ISAC_inst->ISACenc_obj.buffer_index   = 0;
-  ISAC_inst->ISACenc_obj.frame_nb    = 0;
-  ISAC_inst->ISACenc_obj.BottleNeck      = 32000; /* default for I-mode */
-  ISAC_inst->ISACenc_obj.MaxDelay    = 10;    /* default for I-mode */
-  ISAC_inst->ISACenc_obj.current_framesamples = 0;
-  ISAC_inst->ISACenc_obj.s2nr     = 0;
-  ISAC_inst->ISACenc_obj.MaxBits    = 0;
-  ISAC_inst->ISACenc_obj.bitstr_seed   = 4447;
-  ISAC_inst->ISACenc_obj.payloadLimitBytes30  = STREAM_MAXW16_30MS << 1;
-  ISAC_inst->ISACenc_obj.payloadLimitBytes60  = STREAM_MAXW16_60MS << 1;
-  ISAC_inst->ISACenc_obj.maxPayloadBytes      = STREAM_MAXW16_60MS << 1;
-  ISAC_inst->ISACenc_obj.maxRateInBytes       = STREAM_MAXW16_30MS << 1;
-  ISAC_inst->ISACenc_obj.enforceFrameSize     = 0;
-
-  /* Init the bistream data area to zero */
-  for (k=0; k<STREAM_MAXW16_60MS; k++){
-    ISAC_inst->ISACenc_obj.bitstr_obj.stream[k] = 0;
-  }
-
-#ifdef WEBRTC_ISAC_FIX_NB_CALLS_ENABLED
-  WebRtcIsacfix_InitPostFilterbank(&ISAC_inst->ISACenc_obj.interpolatorstr_obj);
-#endif
-
-  InitFunctionPointers();
-
-  return statusInit;
-}
-
-/* Read the given number of bytes of big-endian 16-bit integers from |src| and
-   write them to |dest| in host endian. If |nbytes| is odd, the number of
-   output elements is rounded up, and the least significant byte of the last
-   element is set to 0. */
-static void read_be16(const uint8_t* src, size_t nbytes, uint16_t* dest) {
-  size_t i;
-  for (i = 0; i < nbytes / 2; ++i)
-    dest[i] = src[2 * i] << 8 | src[2 * i + 1];
-  if (nbytes % 2 == 1)
-    dest[nbytes / 2] = src[nbytes - 1] << 8;
-}
-
-/* Read the given number of bytes of host-endian 16-bit integers from |src| and
-   write them to |dest| in big endian. If |nbytes| is odd, the number of source
-   elements is rounded up (but only the most significant byte of the last
-   element is used), and the number of output bytes written will be
-   nbytes + 1. */
-static void write_be16(const uint16_t* src, size_t nbytes, uint8_t* dest) {
-  size_t i;
-  for (i = 0; i < nbytes / 2; ++i) {
-    dest[2 * i] = src[i] >> 8;
-    dest[2 * i + 1] = src[i];
-  }
-  if (nbytes % 2 == 1) {
-    dest[nbytes - 1] = src[nbytes / 2] >> 8;
-    dest[nbytes] = 0;
-  }
-}
-
-/****************************************************************************
- * WebRtcIsacfix_Encode(...)
- *
- * This function encodes 10ms frame(s) and inserts it into a package.
- * Input speech length has to be 160 samples (10ms). The encoder buffers those
- * 10ms frames until it reaches the chosen Framesize (480 or 960 samples
- * corresponding to 30 or 60 ms frames), and then proceeds to the encoding.
- *
- * Input:
- *      - ISAC_main_inst    : ISAC instance.
- *      - speechIn          : input speech vector.
- *
- * Output:
- *      - encoded           : the encoded data vector
- *
- * Return value:
- *                          : >0 - Length (in bytes) of coded data
- *                          :  0 - The buffer didn't reach the chosen framesize
- *                            so it keeps buffering speech samples.
- *                          : -1 - Error
- */
-
-int WebRtcIsacfix_Encode(ISACFIX_MainStruct *ISAC_main_inst,
-                         const int16_t    *speechIn,
-                         uint8_t* encoded)
-{
-  ISACFIX_SubStruct *ISAC_inst;
-  int stream_len;
-
-  /* typecast pointer to rela structure */
-  ISAC_inst = (ISACFIX_SubStruct *)ISAC_main_inst;
-
-
-  /* check if encoder initiated */
-  if ((ISAC_inst->initflag & 2) != 2) {
-    ISAC_inst->errorcode = ISAC_ENCODER_NOT_INITIATED;
-    return (-1);
-  }
-
-  stream_len = WebRtcIsacfix_EncodeImpl((int16_t*)speechIn,
-                                        &ISAC_inst->ISACenc_obj,
-                                        &ISAC_inst->bwestimator_obj,
-                                        ISAC_inst->CodingMode);
-  if (stream_len<0) {
-    ISAC_inst->errorcode = -(int16_t)stream_len;
-    return -1;
-  }
-
-  write_be16(ISAC_inst->ISACenc_obj.bitstr_obj.stream, (size_t)stream_len,
-             encoded);
-  return stream_len;
-
-}
-
-
-
-
-/****************************************************************************
- * WebRtcIsacfix_EncodeNb(...)
- *
- * This function encodes 10ms narrow band (8 kHz sampling) frame(s) and inserts
- * it into a package. Input speech length has to be 80 samples (10ms). The encoder
- * interpolates into wide-band (16 kHz sampling) buffers those
- * 10ms frames until it reaches the chosen Framesize (480 or 960 wide-band samples
- * corresponding to 30 or 60 ms frames), and then proceeds to the encoding.
- *
- * The function is enabled if WEBRTC_ISAC_FIX_NB_CALLS_ENABLED is defined
- *
- * Input:
- *      - ISAC_main_inst    : ISAC instance.
- *      - speechIn          : input speech vector.
- *
- * Output:
- *      - encoded           : the encoded data vector
- *
- * Return value:
- *                          : >0 - Length (in bytes) of coded data
- *                          :  0 - The buffer didn't reach the chosen framesize
- *                            so it keeps buffering speech samples.
- *                          : -1 - Error
- */
-#ifdef WEBRTC_ISAC_FIX_NB_CALLS_ENABLED
-int16_t WebRtcIsacfix_EncodeNb(ISACFIX_MainStruct *ISAC_main_inst,
-                               const int16_t    *speechIn,
-                               int16_t          *encoded)
-{
-  ISACFIX_SubStruct *ISAC_inst;
-  int16_t stream_len;
-  int16_t speechInWB[FRAMESAMPLES_10ms];
-  int16_t Vector_Word16_1[FRAMESAMPLES_10ms/2];
-  int16_t Vector_Word16_2[FRAMESAMPLES_10ms/2];
-
-  int k;
-
-
-  /* typecast pointer to rela structure */
-  ISAC_inst = (ISACFIX_SubStruct *)ISAC_main_inst;
-
-
-  /* check if encoder initiated */
-  if ((ISAC_inst->initflag & 2) != 2) {
-    ISAC_inst->errorcode = ISAC_ENCODER_NOT_INITIATED;
-    return (-1);
-  }
-
-
-  /* Oversample to WB */
-
-  /* Form polyphase signals, and compensate for DC offset */
-  for (k=0;k<FRAMESAMPLES_10ms/2;k++) {
-    Vector_Word16_1[k] = speechIn[k] + 1;
-    Vector_Word16_2[k] = speechIn[k];
-  }
-  WebRtcIsacfix_FilterAndCombine2(Vector_Word16_1, Vector_Word16_2, speechInWB, &ISAC_inst->ISACenc_obj.interpolatorstr_obj, FRAMESAMPLES_10ms);
-
-
-  /* Encode WB signal */
-  stream_len = WebRtcIsacfix_EncodeImpl((int16_t*)speechInWB,
-                                        &ISAC_inst->ISACenc_obj,
-                                        &ISAC_inst->bwestimator_obj,
-                                        ISAC_inst->CodingMode);
-  if (stream_len<0) {
-    ISAC_inst->errorcode = - stream_len;
-    return -1;
-  }
-
-  write_be16(ISAC_inst->ISACenc_obj.bitstr_obj.stream,
-             stream_len,
-             (uint8_t*)encoded);
-  return stream_len;
-}
-#endif  /* WEBRTC_ISAC_FIX_NB_CALLS_ENABLED */
-
-
-/****************************************************************************
- * WebRtcIsacfix_GetNewBitStream(...)
- *
- * This function returns encoded data, with the recieved bwe-index in the
- * stream. It should always return a complete packet, i.e. only called once
- * even for 60 msec frames
- *
- * Input:
- *      - ISAC_main_inst    : ISAC instance.
- *      - bweIndex          : index of bandwidth estimate to put in new bitstream
- *
- * Output:
- *      - encoded           : the encoded data vector
- *
- * Return value:
- *                          : >0 - Length (in bytes) of coded data
- *                          : -1 - Error
- */
-
-int16_t WebRtcIsacfix_GetNewBitStream(ISACFIX_MainStruct *ISAC_main_inst,
-                                      int16_t      bweIndex,
-                                      float              scale,
-                                      uint8_t* encoded)
-{
-  ISACFIX_SubStruct *ISAC_inst;
-  int16_t stream_len;
-
-  /* typecast pointer to rela structure */
-  ISAC_inst = (ISACFIX_SubStruct *)ISAC_main_inst;
-
-
-  /* check if encoder initiated */
-  if ((ISAC_inst->initflag & 2) != 2) {
-    ISAC_inst->errorcode = ISAC_ENCODER_NOT_INITIATED;
-    return (-1);
-  }
-
-  stream_len = WebRtcIsacfix_EncodeStoredData(&ISAC_inst->ISACenc_obj,
-                                              bweIndex,
-                                              scale);
-  if (stream_len<0) {
-    ISAC_inst->errorcode = - stream_len;
-    return -1;
-  }
-
-  write_be16(ISAC_inst->ISACenc_obj.bitstr_obj.stream, stream_len, encoded);
-  return stream_len;
-}
-
-
-
-/****************************************************************************
- * WebRtcIsacfix_DecoderInit(...)
- *
- * This function initializes a ISAC instance prior to the decoder calls.
- *
- * Input:
- *      - ISAC_main_inst    : ISAC instance.
- */
-
-void WebRtcIsacfix_DecoderInit(ISACFIX_MainStruct *ISAC_main_inst)
-{
-  ISACFIX_SubStruct *ISAC_inst;
-
-  InitFunctionPointers();
-
-  /* typecast pointer to real structure */
-  ISAC_inst = (ISACFIX_SubStruct *)ISAC_main_inst;
-
-  /* flag decoder init */
-  ISAC_inst->initflag |= 1;
-
-  WebRtcIsacfix_InitMaskingDec(&ISAC_inst->ISACdec_obj.maskfiltstr_obj);
-  WebRtcIsacfix_InitPostFilterbank(&ISAC_inst->ISACdec_obj.postfiltbankstr_obj);
-  WebRtcIsacfix_InitPitchFilter(&ISAC_inst->ISACdec_obj.pitchfiltstr_obj);
-
-  /* TS */
-  WebRtcIsacfix_InitPlc( &ISAC_inst->ISACdec_obj.plcstr_obj );
-
-
-#ifdef WEBRTC_ISAC_FIX_NB_CALLS_ENABLED
-  WebRtcIsacfix_InitPreFilterbank(&ISAC_inst->ISACdec_obj.decimatorstr_obj);
-#endif
-}
-
-
-/****************************************************************************
- * WebRtcIsacfix_UpdateBwEstimate1(...)
- *
- * This function updates the estimate of the bandwidth.
- *
- * Input:
- *      - ISAC_main_inst    : ISAC instance.
- *      - encoded           : encoded ISAC frame(s).
- *      - packet_size       : size of the packet.
- *      - rtp_seq_number    : the RTP number of the packet.
- *      - arr_ts            : the arrival time of the packet (from NetEq)
- *                            in samples.
- *
- * Return value             :  0 - Ok
- *                            -1 - Error
- */
-
-int16_t WebRtcIsacfix_UpdateBwEstimate1(ISACFIX_MainStruct *ISAC_main_inst,
-                                        const uint8_t* encoded,
-                                        size_t packet_size,
-                                        uint16_t rtp_seq_number,
-                                        uint32_t arr_ts)
-{
-  ISACFIX_SubStruct *ISAC_inst;
-  Bitstr_dec streamdata;
-  int16_t err;
-  const size_t kRequiredEncodedLenBytes = 10;
-
-  /* typecast pointer to real structure */
-  ISAC_inst = (ISACFIX_SubStruct *)ISAC_main_inst;
-
-  /* Sanity check of packet length */
-  if (packet_size == 0) {
-    /* return error code if the packet length is null or less */
-    ISAC_inst->errorcode = ISAC_EMPTY_PACKET;
-    return -1;
-  } else if (packet_size > (STREAM_MAXW16<<1)) {
-    /* return error code if length of stream is too long */
-    ISAC_inst->errorcode = ISAC_LENGTH_MISMATCH;
-    return -1;
-  }
-
-  /* check if decoder initiated */
-  if ((ISAC_inst->initflag & 1) != 1) {
-    ISAC_inst->errorcode = ISAC_DECODER_NOT_INITIATED;
-    return (-1);
-  }
-
-  InitializeDecoderBitstream(packet_size, &streamdata);
-
-  read_be16(encoded, kRequiredEncodedLenBytes, streamdata.stream);
-
-  err = WebRtcIsacfix_EstimateBandwidth(&ISAC_inst->bwestimator_obj,
-                                        &streamdata,
-                                        packet_size,
-                                        rtp_seq_number,
-                                        0,
-                                        arr_ts);
-
-
-  if (err < 0)
-  {
-    /* return error code if something went wrong */
-    ISAC_inst->errorcode = -err;
-    return -1;
-  }
-
-
-  return 0;
-}
-
-/****************************************************************************
- * WebRtcIsacfix_UpdateBwEstimate(...)
- *
- * This function updates the estimate of the bandwidth.
- *
- * Input:
- *      - ISAC_main_inst    : ISAC instance.
- *      - encoded           : encoded ISAC frame(s).
- *      - packet_size       : size of the packet.
- *      - rtp_seq_number    : the RTP number of the packet.
- *      - send_ts           : Send Time Stamp from RTP header
- *      - arr_ts            : the arrival time of the packet (from NetEq)
- *                            in samples.
- *
- * Return value             :  0 - Ok
- *                            -1 - Error
- */
-
-int16_t WebRtcIsacfix_UpdateBwEstimate(ISACFIX_MainStruct *ISAC_main_inst,
-                                       const uint8_t* encoded,
-                                       size_t packet_size,
-                                       uint16_t rtp_seq_number,
-                                       uint32_t send_ts,
-                                       uint32_t arr_ts)
-{
-  ISACFIX_SubStruct *ISAC_inst;
-  Bitstr_dec streamdata;
-  int16_t err;
-  const size_t kRequiredEncodedLenBytes = 10;
-
-  /* typecast pointer to real structure */
-  ISAC_inst = (ISACFIX_SubStruct *)ISAC_main_inst;
-
-  /* Sanity check of packet length */
-  if (packet_size == 0) {
-    /* return error code if the packet length is null  or less */
-    ISAC_inst->errorcode = ISAC_EMPTY_PACKET;
-    return -1;
-  } else if (packet_size < kRequiredEncodedLenBytes) {
-    ISAC_inst->errorcode = ISAC_PACKET_TOO_SHORT;
-    return -1;
-  } else if (packet_size > (STREAM_MAXW16<<1)) {
-    /* return error code if length of stream is too long */
-    ISAC_inst->errorcode = ISAC_LENGTH_MISMATCH;
-    return -1;
-  }
-
-  /* check if decoder initiated */
-  if ((ISAC_inst->initflag & 1) != 1) {
-    ISAC_inst->errorcode = ISAC_DECODER_NOT_INITIATED;
-    return (-1);
-  }
-
-  InitializeDecoderBitstream(packet_size, &streamdata);
-
-  read_be16(encoded, kRequiredEncodedLenBytes, streamdata.stream);
-
-  err = WebRtcIsacfix_EstimateBandwidth(&ISAC_inst->bwestimator_obj,
-                                        &streamdata,
-                                        packet_size,
-                                        rtp_seq_number,
-                                        send_ts,
-                                        arr_ts);
-
-  if (err < 0)
-  {
-    /* return error code if something went wrong */
-    ISAC_inst->errorcode = -err;
-    return -1;
-  }
-
-
-  return 0;
-}
-
-/****************************************************************************
- * WebRtcIsacfix_Decode(...)
- *
- * This function decodes a ISAC frame. Output speech length
- * will be a multiple of 480 samples: 480 or 960 samples,
- * depending on the framesize (30 or 60 ms).
- *
- * Input:
- *      - ISAC_main_inst    : ISAC instance.
- *      - encoded           : encoded ISAC frame(s)
- *      - len               : bytes in encoded vector
- *
- * Output:
- *      - decoded           : The decoded vector
- *
- * Return value             : >0 - number of samples in decoded vector
- *                            -1 - Error
- */
-
-
-int WebRtcIsacfix_Decode(ISACFIX_MainStruct* ISAC_main_inst,
-                         const uint8_t* encoded,
-                         size_t len,
-                         int16_t* decoded,
-                         int16_t* speechType)
-{
-  ISACFIX_SubStruct *ISAC_inst;
-  /* number of samples (480 or 960), output from decoder */
-  /* that were actually used in the encoder/decoder (determined on the fly) */
-  size_t number_of_samples;
-  int declen_int = 0;
-  size_t declen;
-
-  /* typecast pointer to real structure */
-  ISAC_inst = (ISACFIX_SubStruct *)ISAC_main_inst;
-
-  /* check if decoder initiated */
-  if ((ISAC_inst->initflag & 1) != 1) {
-    ISAC_inst->errorcode = ISAC_DECODER_NOT_INITIATED;
-    return (-1);
-  }
-
-  /* Sanity check of packet length */
-  if (len == 0) {
-    /* return error code if the packet length is null  or less */
-    ISAC_inst->errorcode = ISAC_EMPTY_PACKET;
-    return -1;
-  } else if (len > (STREAM_MAXW16<<1)) {
-    /* return error code if length of stream is too long */
-    ISAC_inst->errorcode = ISAC_LENGTH_MISMATCH;
-    return -1;
-  }
-
-  InitializeDecoderBitstream(len, &ISAC_inst->ISACdec_obj.bitstr_obj);
-
-  read_be16(encoded, len, ISAC_inst->ISACdec_obj.bitstr_obj.stream);
-
-  /* added for NetEq purposes (VAD/DTX related) */
-  *speechType=1;
-
-  declen_int = WebRtcIsacfix_DecodeImpl(decoded, &ISAC_inst->ISACdec_obj,
-                                        &number_of_samples);
-  if (declen_int < 0) {
-    /* Some error inside the decoder */
-    ISAC_inst->errorcode = -(int16_t)declen_int;
-    memset(decoded, 0, sizeof(int16_t) * MAX_FRAMESAMPLES);
-    return -1;
-  }
-  declen = (size_t)declen_int;
-
-  /* error check */
-
-  if (declen & 1) {
-    if (len != declen &&
-        len != declen +
-            ((ISAC_inst->ISACdec_obj.bitstr_obj.stream[declen >> 1]) & 0xFF)) {
-      ISAC_inst->errorcode = ISAC_LENGTH_MISMATCH;
-      memset(decoded, 0, sizeof(int16_t) * number_of_samples);
-      return -1;
-    }
-  } else {
-    if (len != declen &&
-        len != declen +
-            ((ISAC_inst->ISACdec_obj.bitstr_obj.stream[declen >> 1]) >> 8)) {
-      ISAC_inst->errorcode = ISAC_LENGTH_MISMATCH;
-      memset(decoded, 0, sizeof(int16_t) * number_of_samples);
-      return -1;
-    }
-  }
-
-  return (int)number_of_samples;
-}
-
-
-
-
-
-/****************************************************************************
- * WebRtcIsacfix_DecodeNb(...)
- *
- * This function decodes a ISAC frame in narrow-band (8 kHz sampling).
- * Output speech length will be a multiple of 240 samples: 240 or 480 samples,
- * depending on the framesize (30 or 60 ms).
- *
- * The function is enabled if WEBRTC_ISAC_FIX_NB_CALLS_ENABLED is defined
- *
- * Input:
- *      - ISAC_main_inst    : ISAC instance.
- *      - encoded           : encoded ISAC frame(s)
- *      - len               : bytes in encoded vector
- *
- * Output:
- *      - decoded           : The decoded vector
- *
- * Return value             : >0 - number of samples in decoded vector
- *                            -1 - Error
- */
-
-#ifdef WEBRTC_ISAC_FIX_NB_CALLS_ENABLED
-int WebRtcIsacfix_DecodeNb(ISACFIX_MainStruct* ISAC_main_inst,
-                           const uint16_t* encoded,
-                           size_t len,
-                           int16_t* decoded,
-                           int16_t* speechType)
-{
-  ISACFIX_SubStruct *ISAC_inst;
-  /* twice the number of samples (480 or 960), output from decoder */
-  /* that were actually used in the encoder/decoder (determined on the fly) */
-  size_t number_of_samples;
-  int declen_int = 0;
-  size_t declen;
-  int16_t dummy[FRAMESAMPLES/2];
-
-
-  /* typecast pointer to real structure */
-  ISAC_inst = (ISACFIX_SubStruct *)ISAC_main_inst;
-
-  /* check if decoder initiated */
-  if ((ISAC_inst->initflag & 1) != 1) {
-    ISAC_inst->errorcode = ISAC_DECODER_NOT_INITIATED;
-    return (-1);
-  }
-
-  if (len == 0) {
-    /* return error code if the packet length is null  or less */
-    ISAC_inst->errorcode = ISAC_EMPTY_PACKET;
-    return -1;
-  } else if (len > (STREAM_MAXW16<<1)) {
-    /* return error code if length of stream is too long */
-    ISAC_inst->errorcode = ISAC_LENGTH_MISMATCH;
-    return -1;
-  }
-
-  InitializeDecoderBitstream(len, &ISAC_inst->ISACdec_obj.bitstr_obj);
-
-  read_be16(encoded, len, ISAC_inst->ISACdec_obj.bitstr_obj.stream);
-
-  /* added for NetEq purposes (VAD/DTX related) */
-  *speechType=1;
-
-  declen_int = WebRtcIsacfix_DecodeImpl(decoded, &ISAC_inst->ISACdec_obj,
-                                        &number_of_samples);
-  if (declen_int < 0) {
-    /* Some error inside the decoder */
-    ISAC_inst->errorcode = -(int16_t)declen_int;
-    memset(decoded, 0, sizeof(int16_t) * FRAMESAMPLES);
-    return -1;
-  }
-  declen = (size_t)declen_int;
-
-  /* error check */
-
-  if (declen & 1) {
-    if (len != declen &&
-        len != declen +
-            ((ISAC_inst->ISACdec_obj.bitstr_obj.stream[declen >> 1]) & 0xFF)) {
-      ISAC_inst->errorcode = ISAC_LENGTH_MISMATCH;
-      memset(decoded, 0, sizeof(int16_t) * number_of_samples);
-      return -1;
-    }
-  } else {
-    if (len != declen &&
-        len != declen +
-            ((ISAC_inst->ISACdec_obj.bitstr_obj.stream[declen >>1]) >> 8)) {
-      ISAC_inst->errorcode = ISAC_LENGTH_MISMATCH;
-      memset(decoded, 0, sizeof(int16_t) * number_of_samples);
-      return -1;
-    }
-  }
-
-  WebRtcIsacfix_SplitAndFilter2(decoded, decoded, dummy, &ISAC_inst->ISACdec_obj.decimatorstr_obj);
-
-  if (number_of_samples>FRAMESAMPLES) {
-    WebRtcIsacfix_SplitAndFilter2(decoded + FRAMESAMPLES, decoded + FRAMESAMPLES/2,
-                                  dummy, &ISAC_inst->ISACdec_obj.decimatorstr_obj);
-  }
-
-  return (int)(number_of_samples / 2);
-}
-#endif /* WEBRTC_ISAC_FIX_NB_CALLS_ENABLED */
-
-
-/****************************************************************************
- * WebRtcIsacfix_DecodePlcNb(...)
- *
- * This function conducts PLC for ISAC frame(s) in narrow-band (8kHz sampling).
- * Output speech length  will be "240*noOfLostFrames" samples
- * that is equevalent of "30*noOfLostFrames" millisecond.
- *
- * The function is enabled if WEBRTC_ISAC_FIX_NB_CALLS_ENABLED is defined
- *
- * Input:
- *      - ISAC_main_inst    : ISAC instance.
- *      - noOfLostFrames    : Number of PLC frames (240 sample=30ms) to produce
- *
- * Output:
- *      - decoded           : The decoded vector
- *
- * Return value             : Number of samples in decoded PLC vector
- */
-
-#ifdef WEBRTC_ISAC_FIX_NB_CALLS_ENABLED
-size_t WebRtcIsacfix_DecodePlcNb(ISACFIX_MainStruct* ISAC_main_inst,
-                                 int16_t* decoded,
-                                 size_t noOfLostFrames )
-{
-  size_t no_of_samples, declen, k;
-  int16_t outframeNB[FRAMESAMPLES];
-  int16_t outframeWB[FRAMESAMPLES];
-  int16_t dummy[FRAMESAMPLES/2];
-
-
-  ISACFIX_SubStruct *ISAC_inst;
-  /* typecast pointer to real structure */
-  ISAC_inst = (ISACFIX_SubStruct *)ISAC_main_inst;
-
-  /* Limit number of frames to two = 60 msec. Otherwise we exceed data vectors */
-  if (noOfLostFrames > 2){
-    noOfLostFrames = 2;
-  }
-
-  k = 0;
-  declen = 0;
-  while( noOfLostFrames > 0 )
-  {
-    WebRtcIsacfix_DecodePlcImpl(outframeWB, &ISAC_inst->ISACdec_obj,
-                                &no_of_samples);
-
-    WebRtcIsacfix_SplitAndFilter2(outframeWB, &(outframeNB[k*240]), dummy, &ISAC_inst->ISACdec_obj.decimatorstr_obj);
-
-    declen += no_of_samples;
-    noOfLostFrames--;
-    k++;
-  }
-
-  declen>>=1;
-
-  for (k=0;k<declen;k++) {
-    decoded[k] = outframeNB[k];
-  }
-
-  return declen;
-}
-#endif /* WEBRTC_ISAC_FIX_NB_CALLS_ENABLED */
-
-
-
-
-/****************************************************************************
- * WebRtcIsacfix_DecodePlc(...)
- *
- * This function conducts PLC for ISAC frame(s) in wide-band (16kHz sampling).
- * Output speech length  will be "480*noOfLostFrames" samples
- * that is equevalent of "30*noOfLostFrames" millisecond.
- *
- * Input:
- *      - ISAC_main_inst    : ISAC instance.
- *      - noOfLostFrames    : Number of PLC frames (480sample = 30ms)
- *                                to produce
- *
- * Output:
- *      - decoded           : The decoded vector
- *
- * Return value             : Number of samples in decoded PLC vector
- */
-
-size_t WebRtcIsacfix_DecodePlc(ISACFIX_MainStruct* ISAC_main_inst,
-                               int16_t* decoded,
-                               size_t noOfLostFrames)
-{
-
-  size_t no_of_samples, declen, k;
-  int16_t outframe16[MAX_FRAMESAMPLES];
-
-  ISACFIX_SubStruct *ISAC_inst;
-  /* typecast pointer to real structure */
-  ISAC_inst = (ISACFIX_SubStruct *)ISAC_main_inst;
-
-  /* Limit number of frames to two = 60 msec. Otherwise we exceed data vectors */
-  if (noOfLostFrames > 2) {
-    noOfLostFrames = 2;
-  }
-  k = 0;
-  declen = 0;
-  while( noOfLostFrames > 0 )
-  {
-    WebRtcIsacfix_DecodePlcImpl(&(outframe16[k*480]), &ISAC_inst->ISACdec_obj,
-                                &no_of_samples);
-    declen += no_of_samples;
-    noOfLostFrames--;
-    k++;
-  }
-
-  for (k=0;k<declen;k++) {
-    decoded[k] = outframe16[k];
-  }
-
-  return declen;
-}
-
-
-/****************************************************************************
- * WebRtcIsacfix_Control(...)
- *
- * This function sets the limit on the short-term average bit rate and the
- * frame length. Should be used only in Instantaneous mode.
- *
- * Input:
- *      - ISAC_main_inst    : ISAC instance.
- *      - rate              : limit on the short-term average bit rate,
- *                            in bits/second (between 10000 and 32000)
- *      - framesize         : number of milliseconds per frame (30 or 60)
- *
- * Return value             : 0  - ok
- *                            -1 - Error
- */
-
-int16_t WebRtcIsacfix_Control(ISACFIX_MainStruct *ISAC_main_inst,
-                              int16_t rate,
-                              int framesize)
-{
-  ISACFIX_SubStruct *ISAC_inst;
-  /* typecast pointer to real structure */
-  ISAC_inst = (ISACFIX_SubStruct *)ISAC_main_inst;
-
-  if (ISAC_inst->CodingMode == 0)
-  {
-    /* in adaptive mode */
-    ISAC_inst->errorcode = ISAC_MODE_MISMATCH;
-    return -1;
-  }
-
-
-  if (rate >= 10000 && rate <= 32000)
-    ISAC_inst->ISACenc_obj.BottleNeck = rate;
-  else {
-    ISAC_inst->errorcode = ISAC_DISALLOWED_BOTTLENECK;
-    return -1;
-  }
-
-
-
-  if (framesize  == 30 || framesize == 60)
-    ISAC_inst->ISACenc_obj.new_framelength = (int16_t)((FS/1000) * framesize);
-  else {
-    ISAC_inst->errorcode = ISAC_DISALLOWED_FRAME_LENGTH;
-    return -1;
-  }
-
-  return 0;
-}
-
-void WebRtcIsacfix_SetInitialBweBottleneck(ISACFIX_MainStruct* ISAC_main_inst,
-                                           int bottleneck_bits_per_second) {
-  ISACFIX_SubStruct* inst = (ISACFIX_SubStruct*)ISAC_main_inst;
-  RTC_DCHECK_GE(bottleneck_bits_per_second, 10000);
-  RTC_DCHECK_LE(bottleneck_bits_per_second, 32000);
-  inst->bwestimator_obj.sendBwAvg = ((uint32_t)bottleneck_bits_per_second) << 7;
-}
-
-/****************************************************************************
- * WebRtcIsacfix_ControlBwe(...)
- *
- * This function sets the initial values of bottleneck and frame-size if
- * iSAC is used in channel-adaptive mode. Through this API, users can
- * enforce a frame-size for all values of bottleneck. Then iSAC will not
- * automatically change the frame-size.
- *
- *
- * Input:
- *  - ISAC_main_inst : ISAC instance.
- *      - rateBPS           : initial value of bottleneck in bits/second
- *                            10000 <= rateBPS <= 32000 is accepted
- *                            For default bottleneck set rateBPS = 0
- *      - frameSizeMs       : number of milliseconds per frame (30 or 60)
- *      - enforceFrameSize  : 1 to enforce the given frame-size through out
- *                            the adaptation process, 0 to let iSAC change
- *                            the frame-size if required.
- *
- * Return value    : 0  - ok
- *         -1 - Error
- */
-
-int16_t WebRtcIsacfix_ControlBwe(ISACFIX_MainStruct *ISAC_main_inst,
-                                 int16_t rateBPS,
-                                 int frameSizeMs,
-                                 int16_t enforceFrameSize)
-{
-  ISACFIX_SubStruct *ISAC_inst;
-  /* Typecast pointer to real structure */
-  ISAC_inst = (ISACFIX_SubStruct *)ISAC_main_inst;
-
-  /* check if encoder initiated */
-  if ((ISAC_inst->initflag & 2) != 2) {
-    ISAC_inst->errorcode = ISAC_ENCODER_NOT_INITIATED;
-    return (-1);
-  }
-
-  /* Check that we are in channel-adaptive mode, otherwise, return -1 */
-  if (ISAC_inst->CodingMode != 0) {
-    ISAC_inst->errorcode = ISAC_MODE_MISMATCH;
-    return (-1);
-  }
-
-  /* Set struct variable if enforceFrameSize is set. ISAC will then keep the */
-  /* chosen frame size.                                                      */
-  ISAC_inst->ISACenc_obj.enforceFrameSize = (enforceFrameSize != 0)? 1:0;
-
-  /* Set initial rate, if value between 10000 and 32000,                */
-  /* if rateBPS is 0, keep the default initial bottleneck value (15000) */
-  if ((rateBPS >= 10000) && (rateBPS <= 32000)) {
-    ISAC_inst->bwestimator_obj.sendBwAvg = (((uint32_t)rateBPS) << 7);
-  } else if (rateBPS != 0) {
-    ISAC_inst->errorcode = ISAC_DISALLOWED_BOTTLENECK;
-    return -1;
-  }
-
-  /* Set initial framesize. If enforceFrameSize is set the frame size will not change */
-  if ((frameSizeMs  == 30) || (frameSizeMs == 60)) {
-    ISAC_inst->ISACenc_obj.new_framelength = (int16_t)((FS/1000) * frameSizeMs);
-  } else {
-    ISAC_inst->errorcode = ISAC_DISALLOWED_FRAME_LENGTH;
-    return -1;
-  }
-
-  return 0;
-}
-
-
-
-
-
-/****************************************************************************
- * WebRtcIsacfix_GetDownLinkBwIndex(...)
- *
- * This function returns index representing the Bandwidth estimate from
- * other side to this side.
- *
- * Input:
- *      - ISAC_main_inst: iSAC struct
- *
- * Output:
- *      - rateIndex     : Bandwidth estimate to transmit to other side.
- *
- */
-
-int16_t WebRtcIsacfix_GetDownLinkBwIndex(ISACFIX_MainStruct* ISAC_main_inst,
-                                         int16_t*     rateIndex)
-{
-  ISACFIX_SubStruct *ISAC_inst;
-
-  /* typecast pointer to real structure */
-  ISAC_inst = (ISACFIX_SubStruct *)ISAC_main_inst;
-
-  /* Call function to get Bandwidth Estimate */
-  *rateIndex = WebRtcIsacfix_GetDownlinkBwIndexImpl(&ISAC_inst->bwestimator_obj);
-
-  return 0;
-}
-
-
-/****************************************************************************
- * WebRtcIsacfix_UpdateUplinkBw(...)
- *
- * This function takes an index representing the Bandwidth estimate from
- * this side to other side and updates BWE.
- *
- * Input:
- *      - ISAC_main_inst: iSAC struct
- *      - rateIndex     : Bandwidth estimate from other side.
- *
- */
-
-int16_t WebRtcIsacfix_UpdateUplinkBw(ISACFIX_MainStruct* ISAC_main_inst,
-                                     int16_t     rateIndex)
-{
-  int16_t err = 0;
-  ISACFIX_SubStruct *ISAC_inst;
-
-  /* typecast pointer to real structure */
-  ISAC_inst = (ISACFIX_SubStruct *)ISAC_main_inst;
-
-  /* Call function to update BWE with received Bandwidth Estimate */
-  err = WebRtcIsacfix_UpdateUplinkBwRec(&ISAC_inst->bwestimator_obj, rateIndex);
-  if (err < 0) {
-    ISAC_inst->errorcode = -err;
-    return (-1);
-  }
-
-  return 0;
-}
-
-/****************************************************************************
- * WebRtcIsacfix_ReadFrameLen(...)
- *
- * This function returns the length of the frame represented in the packet.
- *
- * Input:
- *      - encoded       : Encoded bitstream
- *
- * Output:
- *      - frameLength   : Length of frame in packet (in samples)
- *
- */
-
-int16_t WebRtcIsacfix_ReadFrameLen(const uint8_t* encoded,
-                                   size_t encoded_len_bytes,
-                                   size_t* frameLength)
-{
-  Bitstr_dec streamdata;
-  int16_t err;
-  const size_t kRequiredEncodedLenBytes = 10;
-
-  if (encoded_len_bytes < kRequiredEncodedLenBytes) {
-    return -1;
-  }
-
-  InitializeDecoderBitstream(encoded_len_bytes, &streamdata);
-
-  read_be16(encoded, kRequiredEncodedLenBytes, streamdata.stream);
-
-  /* decode frame length */
-  err = WebRtcIsacfix_DecodeFrameLen(&streamdata, frameLength);
-  if (err<0)  // error check
-    return err;
-
-  return 0;
-}
-
-
-/****************************************************************************
- * WebRtcIsacfix_ReadBwIndex(...)
- *
- * This function returns the index of the Bandwidth estimate from the bitstream.
- *
- * Input:
- *      - encoded       : Encoded bitstream
- *
- * Output:
- *      - frameLength   : Length of frame in packet (in samples)
- *      - rateIndex     : Bandwidth estimate in bitstream
- *
- */
-
-int16_t WebRtcIsacfix_ReadBwIndex(const uint8_t* encoded,
-                                  size_t encoded_len_bytes,
-                                  int16_t* rateIndex)
-{
-  Bitstr_dec streamdata;
-  int16_t err;
-  const size_t kRequiredEncodedLenBytes = 10;
-
-  if (encoded_len_bytes < kRequiredEncodedLenBytes) {
-    return -1;
-  }
-
-  InitializeDecoderBitstream(encoded_len_bytes, &streamdata);
-
-  read_be16(encoded, kRequiredEncodedLenBytes, streamdata.stream);
-
-  /* decode frame length, needed to get to the rateIndex in the bitstream */
-  size_t frameLength;
-  err = WebRtcIsacfix_DecodeFrameLen(&streamdata, &frameLength);
-  if (err<0)  // error check
-    return err;
-
-  /* decode BW estimation */
-  err = WebRtcIsacfix_DecodeSendBandwidth(&streamdata, rateIndex);
-  if (err<0)  // error check
-    return err;
-
-  return 0;
-}
-
-
-
-
-/****************************************************************************
- * WebRtcIsacfix_GetErrorCode(...)
- *
- * This function can be used to check the error code of an iSAC instance. When
- * a function returns -1 a error code will be set for that instance. The
- * function below extract the code of the last error that occured in the
- * specified instance.
- *
- * Input:
- *      - ISAC_main_inst    : ISAC instance
- *
- * Return value             : Error code
- */
-
-int16_t WebRtcIsacfix_GetErrorCode(ISACFIX_MainStruct *ISAC_main_inst)
-{
-  ISACFIX_SubStruct *ISAC_inst;
-  /* typecast pointer to real structure */
-  ISAC_inst = (ISACFIX_SubStruct *)ISAC_main_inst;
-
-  return ISAC_inst->errorcode;
-}
-
-
-
-/****************************************************************************
- * WebRtcIsacfix_GetUplinkBw(...)
- *
- * This function returns the inst quantized iSAC send bitrate
- *
- * Input:
- *      - ISAC_main_inst    : iSAC instance
- *
- * Return value             : bitrate
- */
-
-int32_t WebRtcIsacfix_GetUplinkBw(ISACFIX_MainStruct *ISAC_main_inst)
-{
-  ISACFIX_SubStruct *ISAC_inst = (ISACFIX_SubStruct *)ISAC_main_inst;
-  BwEstimatorstr * bw = (BwEstimatorstr*)&(ISAC_inst->bwestimator_obj);
-
-  return (int32_t) WebRtcIsacfix_GetUplinkBandwidth(bw);
-}
-
-/****************************************************************************
- * WebRtcIsacfix_GetNewFrameLen(...)
- *
- * This function return the next frame length (in samples) of iSAC.
- *
- * Input:
- *      - ISAC_main_inst    : iSAC instance
- *
- * Return value             :  frame lenght in samples
- */
-
-int16_t WebRtcIsacfix_GetNewFrameLen(ISACFIX_MainStruct *ISAC_main_inst)
-{
-  ISACFIX_SubStruct *ISAC_inst = (ISACFIX_SubStruct *)ISAC_main_inst;
-  return ISAC_inst->ISACenc_obj.new_framelength;
-}
-
-
-/****************************************************************************
- * WebRtcIsacfix_SetMaxPayloadSize(...)
- *
- * This function sets a limit for the maximum payload size of iSAC. The same
- * value is used both for 30 and 60 msec packets.
- * The absolute max will be valid until next time the function is called.
- * NOTE! This function may override the function WebRtcIsacfix_SetMaxRate()
- *
- * Input:
- *      - ISAC_main_inst    : iSAC instance
- *      - maxPayloadBytes   : maximum size of the payload in bytes
- *                            valid values are between 100 and 400 bytes
- *
- *
- * Return value             : 0 if sucessful
- *                           -1 if error happens
- */
-
-int16_t WebRtcIsacfix_SetMaxPayloadSize(ISACFIX_MainStruct *ISAC_main_inst,
-                                        int16_t maxPayloadBytes)
-{
-  ISACFIX_SubStruct *ISAC_inst;
-
-  /* typecast pointer to real structure */
-  ISAC_inst = (ISACFIX_SubStruct *)ISAC_main_inst;
-
-  if((maxPayloadBytes < 100) || (maxPayloadBytes > 400))
-  {
-    /* maxPayloadBytes is out of valid range */
-    return -1;
-  }
-  else
-  {
-    /* Set new absolute max, which will not change unless this function
-       is called again with a new value */
-    ISAC_inst->ISACenc_obj.maxPayloadBytes = maxPayloadBytes;
-
-    /* Set new maximum values for 30 and 60 msec packets */
-    if (maxPayloadBytes < ISAC_inst->ISACenc_obj.maxRateInBytes) {
-      ISAC_inst->ISACenc_obj.payloadLimitBytes30 = maxPayloadBytes;
-    } else {
-      ISAC_inst->ISACenc_obj.payloadLimitBytes30 = ISAC_inst->ISACenc_obj.maxRateInBytes;
-    }
-
-    if ( maxPayloadBytes < (ISAC_inst->ISACenc_obj.maxRateInBytes << 1)) {
-      ISAC_inst->ISACenc_obj.payloadLimitBytes60 = maxPayloadBytes;
-    } else {
-      ISAC_inst->ISACenc_obj.payloadLimitBytes60 = (ISAC_inst->ISACenc_obj.maxRateInBytes << 1);
-    }
-  }
-  return 0;
-}
-
-
-/****************************************************************************
- * WebRtcIsacfix_SetMaxRate(...)
- *
- * This function sets the maximum rate which the codec may not exceed for a
- * singel packet. The maximum rate is set in bits per second.
- * The codec has an absolute maximum rate of 53400 bits per second (200 bytes
- * per 30 msec).
- * It is possible to set a maximum rate between 32000 and 53400 bits per second.
- *
- * The rate limit is valid until next time the function is called.
- *
- * NOTE! Packet size will never go above the value set if calling
- * WebRtcIsacfix_SetMaxPayloadSize() (default max packet size is 400 bytes).
- *
- * Input:
- *      - ISAC_main_inst    : iSAC instance
- *      - maxRateInBytes    : maximum rate in bits per second,
- *                            valid values are 32000 to 53400 bits
- *
- * Return value             : 0 if sucessful
- *                           -1 if error happens
- */
-
-int16_t WebRtcIsacfix_SetMaxRate(ISACFIX_MainStruct *ISAC_main_inst,
-                                 int32_t maxRate)
-{
-  ISACFIX_SubStruct *ISAC_inst;
-  int16_t maxRateInBytes;
-
-  /* typecast pointer to real structure */
-  ISAC_inst = (ISACFIX_SubStruct *)ISAC_main_inst;
-
-  if((maxRate < 32000) || (maxRate > 53400))
-  {
-    /* maxRate is out of valid range */
-    return -1;
-  }
-  else
-  {
-    /* Calculate maximum number of bytes per 30 msec packets for the given
-       maximum rate. Multiply with 30/1000 to get number of bits per 30 msec,
-       divide by 8 to get number of bytes per 30 msec:
-       maxRateInBytes = floor((maxRate * 30/1000) / 8); */
-    maxRateInBytes = (int16_t)( WebRtcSpl_DivW32W16ResW16(WEBRTC_SPL_MUL(maxRate, 3), 800) );
-
-    /* Store the value for usage in the WebRtcIsacfix_SetMaxPayloadSize-function */
-    ISAC_inst->ISACenc_obj.maxRateInBytes = maxRateInBytes;
-
-    /* For 30 msec packets: if the new limit is below the maximum
-       payload size, set a new limit */
-    if (maxRateInBytes < ISAC_inst->ISACenc_obj.maxPayloadBytes) {
-      ISAC_inst->ISACenc_obj.payloadLimitBytes30 = maxRateInBytes;
-    } else {
-      ISAC_inst->ISACenc_obj.payloadLimitBytes30 = ISAC_inst->ISACenc_obj.maxPayloadBytes;
-    }
-
-    /* For 60 msec packets: if the new limit (times 2) is below the
-       maximum payload size, set a new limit */
-    if ( (maxRateInBytes << 1) < ISAC_inst->ISACenc_obj.maxPayloadBytes) {
-      ISAC_inst->ISACenc_obj.payloadLimitBytes60 = (maxRateInBytes << 1);
-    } else {
-      ISAC_inst->ISACenc_obj.payloadLimitBytes60 = ISAC_inst->ISACenc_obj.maxPayloadBytes;
-    }
-  }
-
-  return 0;
-}
-
-
-
-/****************************************************************************
- * WebRtcIsacfix_version(...)
- *
- * This function returns the version number.
- *
- * Output:
- *      - version  : Pointer to character string
- *
- */
-
-void WebRtcIsacfix_version(char *version)
-{
-  strcpy(version, "3.6.0");
-}
-
-void WebRtcIsacfix_GetBandwidthInfo(ISACFIX_MainStruct* ISAC_main_inst,
-                                    IsacBandwidthInfo* bwinfo) {
-  ISACFIX_SubStruct* inst = (ISACFIX_SubStruct*)ISAC_main_inst;
-  RTC_DCHECK_NE(0, inst->initflag & 1);  // Decoder initialized.
-  WebRtcIsacfixBw_GetBandwidthInfo(&inst->bwestimator_obj, bwinfo);
-}
-
-void WebRtcIsacfix_SetBandwidthInfo(ISACFIX_MainStruct* ISAC_main_inst,
-                                    const IsacBandwidthInfo* bwinfo) {
-  ISACFIX_SubStruct* inst = (ISACFIX_SubStruct*)ISAC_main_inst;
-  RTC_DCHECK_NE(0, inst->initflag & 2);  // Encoder initialized.
-  WebRtcIsacfixBw_SetBandwidthInfo(&inst->bwestimator_obj, bwinfo);
-}
diff --git a/modules/audio_coding/codecs/isac/fix/source/lattice.c b/modules/audio_coding/codecs/isac/fix/source/lattice.c
deleted file mode 100644
index 1f8b2c2..0000000
--- a/modules/audio_coding/codecs/isac/fix/source/lattice.c
+++ /dev/null
@@ -1,322 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/*
- * lattice.c
- *
- * Contains the normalized lattice filter routines (MA and AR) for iSAC codec
- *
- */
-
-#include "codec.h"
-#include "settings.h"
-#include "webrtc/rtc_base/sanitizer.h"
-
-#define LATTICE_MUL_32_32_RSFT16(a32a, a32b, b32)                  \
-  ((int32_t)(WEBRTC_SPL_MUL(a32a, b32) + (WEBRTC_SPL_MUL_16_32_RSFT16(a32b, b32))))
-/* This macro is FORBIDDEN to use elsewhere than in a function in this file and
-   its corresponding neon version. It might give unpredictable results, since a
-   general int32_t*int32_t multiplication results in a 64 bit value.
-   The result is then shifted just 16 steps to the right, giving need for 48
-   bits, i.e. in the generel case, it will NOT fit in a int32_t. In the
-   cases used in here, the int32_t will be enough, since (for a good
-   reason) the involved multiplicands aren't big enough to overflow a
-   int32_t after shifting right 16 bits. I have compared the result of a
-   multiplication between t32 and tmp32, done in two ways:
-   1) Using (int32_t) (((float)(tmp32))*((float)(tmp32b))/65536.0);
-   2) Using LATTICE_MUL_32_32_RSFT16(t16a, t16b, tmp32b);
-   By running 25 files, I haven't found any bigger diff than 64 - this was in the
-   case when  method 1) gave 650235648 and 2) gave 650235712.
-*/
-
-/* Function prototype: filtering ar_g_Q0[] and ar_f_Q0[] through an AR filter
-   with coefficients cth_Q15[] and sth_Q15[].
-   Implemented for both generic and ARMv7 platforms.
- */
-void WebRtcIsacfix_FilterArLoop(int16_t* ar_g_Q0,
-                                int16_t* ar_f_Q0,
-                                int16_t* cth_Q15,
-                                int16_t* sth_Q15,
-                                size_t order_coef);
-
-/* Inner loop used for function WebRtcIsacfix_NormLatticeFilterMa(). It does:
-   for 0 <= n < HALF_SUBFRAMELEN - 1:
-     *ptr2 = input2 * (*ptr2) + input0 * (*ptr0));
-     *ptr1 = input1 * (*ptr0) + input0 * (*ptr2);
-   Note, function WebRtcIsacfix_FilterMaLoopNeon and WebRtcIsacfix_FilterMaLoopC
-   are not bit-exact. The accuracy by the ARM Neon function is same or better.
-*/
-void WebRtcIsacfix_FilterMaLoopC(int16_t input0,  // Filter coefficient
-                                 int16_t input1,  // Filter coefficient
-                                 int32_t input2,  // Inverse coeff. (1/input1)
-                                 int32_t* ptr0,   // Sample buffer
-                                 int32_t* ptr1,   // Sample buffer
-                                 int32_t* ptr2) { // Sample buffer
-  int n = 0;
-
-  // Separate the 32-bit variable input2 into two 16-bit integers (high 16 and
-  // low 16 bits), for using LATTICE_MUL_32_32_RSFT16 in the loop.
-  int16_t t16a = (int16_t)(input2 >> 16);
-  int16_t t16b = (int16_t)input2;
-  if (t16b < 0) t16a++;
-
-  // The loop filtering the samples *ptr0, *ptr1, *ptr2 with filter coefficients
-  // input0, input1, and input2.
-  for(n = 0; n < HALF_SUBFRAMELEN - 1; n++, ptr0++, ptr1++, ptr2++) {
-    int32_t tmp32a = 0;
-    int32_t tmp32b = 0;
-
-    // Calculate *ptr2 = input2 * (*ptr2 + input0 * (*ptr0));
-    tmp32a = WEBRTC_SPL_MUL_16_32_RSFT15(input0, *ptr0); // Q15 * Q15 >> 15 = Q15
-    tmp32b = *ptr2 + tmp32a; // Q15 + Q15 = Q15
-    *ptr2 = LATTICE_MUL_32_32_RSFT16(t16a, t16b, tmp32b);
-
-    // Calculate *ptr1 = input1 * (*ptr0) + input0 * (*ptr2);
-    tmp32a = WEBRTC_SPL_MUL_16_32_RSFT15(input1, *ptr0); // Q15*Q15>>15 = Q15
-    tmp32b = WEBRTC_SPL_MUL_16_32_RSFT15(input0, *ptr2); // Q15*Q15>>15 = Q15
-    *ptr1 = tmp32a + tmp32b; // Q15 + Q15 = Q15
-  }
-}
-
-/* filter the signal using normalized lattice filter */
-/* MA filter */
-void WebRtcIsacfix_NormLatticeFilterMa(size_t orderCoef,
-                                       int32_t *stateGQ15,
-                                       int16_t *lat_inQ0,
-                                       int16_t *filt_coefQ15,
-                                       int32_t *gain_lo_hiQ17,
-                                       int16_t lo_hi,
-                                       int16_t *lat_outQ9)
-{
-  int16_t sthQ15[MAX_AR_MODEL_ORDER];
-  int16_t cthQ15[MAX_AR_MODEL_ORDER];
-
-  int u, n;
-  size_t i, k;
-  int16_t temp2,temp3;
-  size_t ord_1 = orderCoef+1;
-  int32_t inv_cthQ16[MAX_AR_MODEL_ORDER];
-
-  int32_t gain32, fQtmp;
-  int16_t gain16;
-  int16_t gain_sh;
-
-  int32_t tmp32, tmp32b;
-  int32_t fQ15vec[HALF_SUBFRAMELEN];
-  int32_t gQ15[MAX_AR_MODEL_ORDER+1][HALF_SUBFRAMELEN];
-  int16_t sh;
-  int16_t t16a;
-  int16_t t16b;
-
-  for (u=0;u<SUBFRAMES;u++)
-  {
-    int32_t temp1 = u * HALF_SUBFRAMELEN;
-
-    /* set the Direct Form coefficients */
-    temp2 = (int16_t)(u * orderCoef);
-    temp3 = (int16_t)(2 * u + lo_hi);
-
-    /* compute lattice filter coefficients */
-    memcpy(sthQ15, &filt_coefQ15[temp2], orderCoef * sizeof(int16_t));
-
-    WebRtcSpl_SqrtOfOneMinusXSquared(sthQ15, orderCoef, cthQ15);
-
-    /* compute the gain */
-    gain32 = gain_lo_hiQ17[temp3];
-    gain_sh = WebRtcSpl_NormW32(gain32);
-    gain32 <<= gain_sh;  // Q(17+gain_sh)
-
-    for (k=0;k<orderCoef;k++)
-    {
-      gain32 = WEBRTC_SPL_MUL_16_32_RSFT15(cthQ15[k], gain32); //Q15*Q(17+gain_sh)>>15 = Q(17+gain_sh)
-      inv_cthQ16[k] = WebRtcSpl_DivW32W16((int32_t)2147483647, cthQ15[k]); // 1/cth[k] in Q31/Q15 = Q16
-    }
-    gain16 = (int16_t)(gain32 >> 16);  // Q(1+gain_sh).
-
-    /* normalized lattice filter */
-    /*****************************/
-
-    /* initial conditions */
-    for (i=0;i<HALF_SUBFRAMELEN;i++)
-    {
-      fQ15vec[i] = lat_inQ0[i + temp1] << 15;  // Q15
-      gQ15[0][i] = lat_inQ0[i + temp1] << 15;  // Q15
-    }
-
-
-    fQtmp = fQ15vec[0];
-
-    /* get the state of f&g for the first input, for all orders */
-    for (i=1;i<ord_1;i++)
-    {
-      // Calculate f[i][0] = inv_cth[i-1]*(f[i-1][0] + sth[i-1]*stateG[i-1]);
-      tmp32 = WEBRTC_SPL_MUL_16_32_RSFT15(sthQ15[i-1], stateGQ15[i-1]);//Q15*Q15>>15 = Q15
-      tmp32b= fQtmp + tmp32; //Q15+Q15=Q15
-      tmp32 = inv_cthQ16[i-1]; //Q16
-      t16a = (int16_t)(tmp32 >> 16);
-      t16b = (int16_t)(tmp32 - (t16a << 16));
-      if (t16b<0) t16a++;
-      tmp32 = LATTICE_MUL_32_32_RSFT16(t16a, t16b, tmp32b);
-      fQtmp = tmp32; // Q15
-
-      // Calculate g[i][0] = cth[i-1]*stateG[i-1] + sth[i-1]* f[i][0];
-      tmp32  = WEBRTC_SPL_MUL_16_32_RSFT15(cthQ15[i-1], stateGQ15[i-1]); //Q15*Q15>>15 = Q15
-      tmp32b = WEBRTC_SPL_MUL_16_32_RSFT15(sthQ15[i-1], fQtmp); //Q15*Q15>>15 = Q15
-      tmp32  = tmp32 + tmp32b;//Q15+Q15 = Q15
-      gQ15[i][0] = tmp32; // Q15
-    }
-
-    /* filtering */
-    /* save the states */
-    for(k=0;k<orderCoef;k++)
-    {
-      // for 0 <= n < HALF_SUBFRAMELEN - 1:
-      //   f[k+1][n+1] = inv_cth[k]*(f[k][n+1] + sth[k]*g[k][n]);
-      //   g[k+1][n+1] = cth[k]*g[k][n] + sth[k]* f[k+1][n+1];
-      WebRtcIsacfix_FilterMaLoopFix(sthQ15[k], cthQ15[k], inv_cthQ16[k],
-                                    &gQ15[k][0], &gQ15[k+1][1], &fQ15vec[1]);
-    }
-
-    fQ15vec[0] = fQtmp;
-
-    for(n=0;n<HALF_SUBFRAMELEN;n++)
-    {
-      //gain32 >>= gain_sh; // Q(17+gain_sh) -> Q17
-      tmp32 = WEBRTC_SPL_MUL_16_32_RSFT16(gain16, fQ15vec[n]); //Q(1+gain_sh)*Q15>>16 = Q(gain_sh)
-      sh = 9-gain_sh; //number of needed shifts to reach Q9
-      t16a = (int16_t) WEBRTC_SPL_SHIFT_W32(tmp32, sh);
-      lat_outQ9[n + temp1] = t16a;
-    }
-
-    /* save the states */
-    for (i=0;i<ord_1;i++)
-    {
-      stateGQ15[i] = gQ15[i][HALF_SUBFRAMELEN-1];
-    }
-    //process next frame
-  }
-
-  return;
-}
-
-// Left shift of an int32_t that's allowed to overflow. (It's still undefined
-// behavior, so not a good idea; this just makes UBSan ignore the violation, so
-// that our old code can continue to do what it's always been doing.)
-static inline int32_t RTC_NO_SANITIZE("shift")
-    OverflowingLShiftS32(int32_t x, int shift) {
-  return x << shift;
-}
-
-/* ----------------AR filter-------------------------*/
-/* filter the signal using normalized lattice filter */
-void WebRtcIsacfix_NormLatticeFilterAr(size_t orderCoef,
-                                       int16_t *stateGQ0,
-                                       int32_t *lat_inQ25,
-                                       int16_t *filt_coefQ15,
-                                       int32_t *gain_lo_hiQ17,
-                                       int16_t lo_hi,
-                                       int16_t *lat_outQ0)
-{
-  size_t ii, k, i;
-  int n, u;
-  int16_t sthQ15[MAX_AR_MODEL_ORDER];
-  int16_t cthQ15[MAX_AR_MODEL_ORDER];
-  int32_t tmp32;
-
-
-  int16_t tmpAR;
-  int16_t ARfQ0vec[HALF_SUBFRAMELEN];
-  int16_t ARgQ0vec[MAX_AR_MODEL_ORDER+1];
-
-  int32_t inv_gain32;
-  int16_t inv_gain16;
-  int16_t den16;
-  int16_t sh;
-
-  int16_t temp2,temp3;
-  size_t ord_1 = orderCoef+1;
-
-  for (u=0;u<SUBFRAMES;u++)
-  {
-    int32_t temp1 = u * HALF_SUBFRAMELEN;
-
-    //set the denominator and numerator of the Direct Form
-    temp2 = (int16_t)(u * orderCoef);
-    temp3 = (int16_t)(2 * u + lo_hi);
-
-    for (ii=0; ii<orderCoef; ii++) {
-      sthQ15[ii] = filt_coefQ15[temp2+ii];
-    }
-
-    WebRtcSpl_SqrtOfOneMinusXSquared(sthQ15, orderCoef, cthQ15);
-
-    // Originally, this line was assumed to never overflow, since "[s]imulation
-    // of the 25 files shows that maximum value in the vector gain_lo_hiQ17[]
-    // is 441344, which means that it is log2((2^31)/441344) = 12.2 shifting
-    // bits from saturation. Therefore, it should be safe to use Q27 instead of
-    // Q17." However, a fuzzer test succeeded in provoking an overflow here,
-    // which we ignore on the theory that only "abnormal" inputs cause
-    // overflow.
-    tmp32 = OverflowingLShiftS32(gain_lo_hiQ17[temp3], 10);  // Q27
-
-    for (k=0;k<orderCoef;k++) {
-      tmp32 = WEBRTC_SPL_MUL_16_32_RSFT15(cthQ15[k], tmp32); // Q15*Q27>>15 = Q27
-    }
-
-    sh = WebRtcSpl_NormW32(tmp32); // tmp32 is the gain
-    den16 = (int16_t) WEBRTC_SPL_SHIFT_W32(tmp32, sh-16); //Q(27+sh-16) = Q(sh+11) (all 16 bits are value bits)
-    inv_gain32 = WebRtcSpl_DivW32W16((int32_t)2147483647, den16); // 1/gain in Q31/Q(sh+11) = Q(20-sh)
-
-    //initial conditions
-    inv_gain16 = (int16_t)(inv_gain32 >> 2);  // 1/gain in Q(20-sh-2) = Q(18-sh)
-
-    for (i=0;i<HALF_SUBFRAMELEN;i++)
-    {
-
-      tmp32 = lat_inQ25[i + temp1] * (1 << 1);  // Q25->Q26
-      tmp32 = WEBRTC_SPL_MUL_16_32_RSFT16(inv_gain16, tmp32); //lat_in[]*inv_gain in (Q(18-sh)*Q26)>>16 = Q(28-sh)
-      tmp32 = WEBRTC_SPL_SHIFT_W32(tmp32, -(28-sh)); // lat_in[]*inv_gain in Q0
-
-      ARfQ0vec[i] = (int16_t)WebRtcSpl_SatW32ToW16(tmp32); // Q0
-    }
-
-    // Get the state of f & g for the first input, for all orders.
-    for (i = orderCoef; i > 0; i--)
-    {
-      tmp32 = (cthQ15[i - 1] * ARfQ0vec[0] - sthQ15[i - 1] * stateGQ0[i - 1] +
-               16384) >> 15;
-      tmpAR = (int16_t)WebRtcSpl_SatW32ToW16(tmp32); // Q0
-
-      tmp32 = (sthQ15[i - 1] * ARfQ0vec[0] + cthQ15[i - 1] * stateGQ0[i - 1] +
-               16384) >> 15;
-      ARgQ0vec[i] = (int16_t)WebRtcSpl_SatW32ToW16(tmp32); // Q0
-      ARfQ0vec[0] = tmpAR;
-    }
-    ARgQ0vec[0] = ARfQ0vec[0];
-
-    // Filter ARgQ0vec[] and ARfQ0vec[] through coefficients cthQ15[] and sthQ15[].
-    WebRtcIsacfix_FilterArLoop(ARgQ0vec, ARfQ0vec, cthQ15, sthQ15, orderCoef);
-
-    for(n=0;n<HALF_SUBFRAMELEN;n++)
-    {
-      lat_outQ0[n + temp1] = ARfQ0vec[n];
-    }
-
-
-    /* cannot use memcpy in the following */
-
-    for (i=0;i<ord_1;i++)
-    {
-      stateGQ0[i] = ARgQ0vec[i];
-    }
-  }
-
-  return;
-}
diff --git a/modules/audio_coding/codecs/isac/fix/source/lattice_armv7.S b/modules/audio_coding/codecs/isac/fix/source/lattice_armv7.S
deleted file mode 100644
index 36411df..0000000
--- a/modules/audio_coding/codecs/isac/fix/source/lattice_armv7.S
+++ /dev/null
@@ -1,77 +0,0 @@
-@
-@ Copyright (c) 2011 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.
-@
-
-@ Contains a function for the core loop in the normalized lattice AR
-@ filter routine for iSAC codec, optimized for ARMv7 platforms.
-@
-@ Output is bit-exact with the reference C code in lattic_c.c
-@
-@ Register usage:
-@
-@ r0:  &ar_g_Q0
-@ r1:  &ar_f_Q0
-@ r2:  &cth_Q15
-@ r3:  &sth_Q15
-@ r4:  out loop counter
-@ r5:  tmpAR
-@ r9:  inner loop counter
-@ r12: constant #16384
-@ r6, r7, r8, r10, r11: scratch
-
-#include "webrtc/system_wrappers/include/asm_defines.h"
-#include "settings.h"
-
-GLOBAL_FUNCTION WebRtcIsacfix_FilterArLoop
-.align  2
-DEFINE_FUNCTION WebRtcIsacfix_FilterArLoop
-  push    {r4-r11}
-
-  add     r1, #2                 @ &ar_f_Q0[1]
-  mov     r12, #16384
-  mov     r4, #HALF_SUBFRAMELEN
-  sub     r4, #1                 @ Outer loop counter = HALF_SUBFRAMELEN - 1
-
-HALF_SUBFRAME_LOOP:  @ for (n = 0; n < HALF_SUBFRAMELEN - 1; n++)
-
-  ldr     r9, [sp, #32]          @ Restore the inner loop counter to order_coef
-  ldrh    r5, [r1]               @ tmpAR = ar_f_Q0[n+1]
-  add     r0, r9, asl #1         @ Restore r0 to &ar_g_Q0[order_coef]
-  add     r2, r9, asl #1         @ Restore r2 to &cth_Q15[order_coef]
-  add     r3, r9, asl #1         @ Restore r3 to &sth_Q15[order_coef]
-
-ORDER_COEF_LOOP:  @ for (k = order_coef; k > 0; k--)
-
-  ldrh    r7, [r3, #-2]!         @ sth_Q15[k - 1]
-  ldrh    r6, [r2, #-2]!         @ cth_Q15[k - 1]
-
-  ldrh    r8, [r0, #-2]          @ ar_g_Q0[k - 1]
-  smlabb  r11, r7, r5, r12       @ sth_Q15[k - 1] * tmpAR + 16384
-  smlabb  r10, r6, r5, r12       @ cth_Q15[k - 1] * tmpAR + 16384
-  smulbb  r7, r7, r8             @ sth_Q15[k - 1] * ar_g_Q0[k - 1]
-  smlabb  r11, r6, r8, r11       @ cth_Q15[k - 1] * ar_g_Q0[k - 1] +
-                                 @     (sth_Q15[k - 1] * tmpAR + 16384)
-
-  sub     r10, r10, r7           @ cth_Q15[k - 1] * tmpAR + 16384 -
-                                 @     (sth_Q15[k - 1] * ar_g_Q0[k - 1])
-  ssat    r11, #16, r11, asr #15
-  ssat    r5, #16, r10, asr #15
-  strh    r11, [r0], #-2         @ Output: ar_g_Q0[k]
-
-  subs    r9, #1
-  bgt     ORDER_COEF_LOOP
-
-  strh    r5, [r0]               @ Output: ar_g_Q0[0] = tmpAR;
-  strh    r5, [r1], #2           @ Output: ar_f_Q0[n+1] = tmpAR;
-
-  subs    r4, #1
-  bne     HALF_SUBFRAME_LOOP
-
-  pop     {r4-r11}
-  bx      lr
diff --git a/modules/audio_coding/codecs/isac/fix/source/lattice_c.c b/modules/audio_coding/codecs/isac/fix/source/lattice_c.c
deleted file mode 100644
index 40c3bf8..0000000
--- a/modules/audio_coding/codecs/isac/fix/source/lattice_c.c
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/*
- * Contains the core loop function for the lattice filter AR routine
- * for iSAC codec.
- *
- */
-
-#include "settings.h"
-#include "signal_processing_library.h"
-#include "webrtc/typedefs.h"
-
-/* Filter ar_g_Q0[] and ar_f_Q0[] through an AR filter with coefficients
- * cth_Q15[] and sth_Q15[].
- */
-void WebRtcIsacfix_FilterArLoop(int16_t* ar_g_Q0,     // Input samples
-                                int16_t* ar_f_Q0,     // Input samples
-                                int16_t* cth_Q15,     // Filter coefficients
-                                int16_t* sth_Q15,     // Filter coefficients
-                                size_t order_coef) { // order of the filter
-  int n = 0;
-
-  for (n = 0; n < HALF_SUBFRAMELEN - 1; n++) {
-    size_t k = 0;
-    int16_t tmpAR = 0;
-    int32_t tmp32 = 0;
-    int32_t tmp32_2 = 0;
-
-    tmpAR = ar_f_Q0[n + 1];
-    for (k = order_coef; k > 0; k--) {
-      tmp32 = (cth_Q15[k - 1] * tmpAR - sth_Q15[k - 1] * ar_g_Q0[k - 1] +
-               16384) >> 15;
-      tmp32_2 = (sth_Q15[k - 1] * tmpAR + cth_Q15[k - 1] * ar_g_Q0[k - 1] +
-                 16384) >> 15;
-      tmpAR   = (int16_t)WebRtcSpl_SatW32ToW16(tmp32);
-      ar_g_Q0[k] = (int16_t)WebRtcSpl_SatW32ToW16(tmp32_2);
-    }
-    ar_f_Q0[n + 1] = tmpAR;
-    ar_g_Q0[0] = tmpAR;
-  }
-}
diff --git a/modules/audio_coding/codecs/isac/fix/source/lattice_mips.c b/modules/audio_coding/codecs/isac/fix/source/lattice_mips.c
deleted file mode 100644
index d488bfc..0000000
--- a/modules/audio_coding/codecs/isac/fix/source/lattice_mips.c
+++ /dev/null
@@ -1,329 +0,0 @@
-/*
- *  Copyright (c) 2014 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 <stddef.h>
-
-#include "webrtc/modules/audio_coding/codecs/isac/fix/source/settings.h"
-#include "webrtc/typedefs.h"
-
-// Filter ar_g_Q0[] and ar_f_Q0[] through an AR filter with coefficients
-// cth_Q15[] and sth_Q15[].
-void WebRtcIsacfix_FilterArLoop(int16_t* ar_g_Q0,     // Input samples
-                                int16_t* ar_f_Q0,     // Input samples
-                                int16_t* cth_Q15,     // Filter coefficients
-                                int16_t* sth_Q15,     // Filter coefficients
-                                size_t order_coef) { // order of the filter
-  int n = 0;
-
-  for (n = 0; n < HALF_SUBFRAMELEN - 1; n++) {
-    int count = (int)(order_coef - 1);
-    int offset;
-#if !defined(MIPS_DSP_R1_LE)
-    int16_t* tmp_cth;
-    int16_t* tmp_sth;
-    int16_t* tmp_arg;
-    int32_t max_q16 = 0x7fff;
-    int32_t min_q16 = 0xffff8000;
-#endif
-    // Declare variables used as temporary registers.
-    int32_t r0, r1, r2, t0, t1, t2, t_ar;
-
-    __asm __volatile (
-      ".set          push                                                \n\t"
-      ".set          noreorder                                           \n\t"
-      "bltz          %[count],     2f                                    \n\t"
-      " lh           %[t_ar],      0(%[tmp])                             \n\t"
-      // Inner loop
-     "1:                                                                 \n\t"
-      "sll           %[offset],    %[count],               1             \n\t"
-#if defined(MIPS_DSP_R1_LE)
-      "lhx           %[r0],        %[offset](%[cth_Q15])                 \n\t"
-      "lhx           %[r1],        %[offset](%[sth_Q15])                 \n\t"
-      "lhx           %[r2],        %[offset](%[ar_g_Q0])                 \n\t"
-#else
-      "addu          %[tmp_cth],   %[cth_Q15],             %[offset]     \n\t"
-      "addu          %[tmp_sth],   %[sth_Q15],             %[offset]     \n\t"
-      "addu          %[tmp_arg],   %[ar_g_Q0],             %[offset]     \n\t"
-      "lh            %[r0],        0(%[tmp_cth])                         \n\t"
-      "lh            %[r1],        0(%[tmp_sth])                         \n\t"
-      "lh            %[r2],        0(%[tmp_arg])                         \n\t"
-#endif
-      "mul           %[t0],        %[r0],                  %[t_ar]       \n\t"
-      "mul           %[t1],        %[r1],                  %[t_ar]       \n\t"
-      "mul           %[t2],        %[r1],                  %[r2]         \n\t"
-      "mul           %[r0],        %[r0],                  %[r2]         \n\t"
-      "subu          %[t0],        %[t0],                  %[t2]         \n\t"
-      "addu          %[t1],        %[t1],                  %[r0]         \n\t"
-#if defined(MIPS_DSP_R1_LE)
-      "shra_r.w      %[t1],        %[t1],                  15            \n\t"
-      "shra_r.w      %[t0],        %[t0],                  15            \n\t"
-#else
-      "addiu         %[t1],        %[t1],                  0x4000        \n\t"
-      "sra           %[t1],        %[t1],                  15            \n\t"
-      "addiu         %[t0],        %[t0],                  0x4000        \n\t"
-      "sra           %[t0],        %[t0],                  15            \n\t"
-#endif
-      "addiu         %[offset],    %[offset],              2             \n\t"
-#if defined(MIPS_DSP_R1_LE)
-      "shll_s.w      %[t1],        %[t1],                  16            \n\t"
-      "shll_s.w      %[t_ar],      %[t0],                  16            \n\t"
-#else
-      "slt           %[r0],        %[t1],                  %[max_q16]    \n\t"
-      "slt           %[r1],        %[t0],                  %[max_q16]    \n\t"
-      "movz          %[t1],        %[max_q16],             %[r0]         \n\t"
-      "movz          %[t0],        %[max_q16],             %[r1]         \n\t"
-#endif
-      "addu          %[offset],    %[offset],              %[ar_g_Q0]    \n\t"
-#if defined(MIPS_DSP_R1_LE)
-      "sra           %[t1],        %[t1],                  16            \n\t"
-      "sra           %[t_ar],      %[t_ar],                16            \n\t"
-#else
-      "slt           %[r0],        %[t1],                  %[min_q16]    \n\t"
-      "slt           %[r1],        %[t0],                  %[min_q16]    \n\t"
-      "movn          %[t1],        %[min_q16],             %[r0]         \n\t"
-      "movn          %[t0],        %[min_q16],             %[r1]         \n\t"
-      "addu          %[t_ar],      $zero,                  %[t0]         \n\t"
-#endif
-      "sh            %[t1],        0(%[offset])                          \n\t"
-      "bgtz          %[count],     1b                                    \n\t"
-      " addiu        %[count],     %[count],               -1            \n\t"
-     "2:                                                                 \n\t"
-      "sh            %[t_ar],      0(%[tmp])                             \n\t"
-      "sh            %[t_ar],      0(%[ar_g_Q0])                         \n\t"
-      ".set          pop                                                 \n\t"
-      : [t_ar] "=&r" (t_ar), [count] "+r" (count), [offset] "=&r" (offset),
-        [r0] "=&r" (r0), [r1] "=&r" (r1), [r2] "=&r" (r2), [t0] "=&r" (t0),
-#if !defined(MIPS_DSP_R1_LE)
-        [tmp_cth] "=&r" (tmp_cth), [tmp_sth] "=&r" (tmp_sth),
-        [tmp_arg] "=&r" (tmp_arg),
-#endif
-        [t1] "=&r" (t1), [t2] "=&r" (t2)
-      : [tmp] "r" (&ar_f_Q0[n+1]), [cth_Q15] "r" (cth_Q15),
-#if !defined(MIPS_DSP_R1_LE)
-        [max_q16] "r" (max_q16), [min_q16] "r" (min_q16),
-#endif
-        [sth_Q15] "r" (sth_Q15), [ar_g_Q0] "r" (ar_g_Q0)
-      : "memory", "hi", "lo"
-    );
-  }
-}
-
-// MIPS optimization of the inner loop used for function
-// WebRtcIsacfix_NormLatticeFilterMa(). It does:
-//
-// for 0 <= n < HALF_SUBFRAMELEN - 1:
-//   *ptr2 = input2 * (*ptr2) + input0 * (*ptr0));
-//   *ptr1 = input1 * (*ptr0) + input0 * (*ptr2);
-//
-// Note, function WebRtcIsacfix_FilterMaLoopMIPS and WebRtcIsacfix_FilterMaLoopC
-// are not bit-exact. The accuracy of the MIPS function is same or better.
-void WebRtcIsacfix_FilterMaLoopMIPS(int16_t input0,  // Filter coefficient
-                                    int16_t input1,  // Filter coefficient
-                                    int32_t input2,  // Inverse coeff (1/input1)
-                                    int32_t* ptr0,   // Sample buffer
-                                    int32_t* ptr1,   // Sample buffer
-                                    int32_t* ptr2) { // Sample buffer
-#if defined(MIPS_DSP_R2_LE)
-  // MIPS DSPR2 version. 4 available accumulators allows loop unrolling 4 times.
-  // This variant is not bit-exact with WebRtcIsacfix_FilterMaLoopC, since we
-  // are exploiting 64-bit accumulators. The accuracy of the MIPS DSPR2 function
-  // is same or better.
-  int n = (HALF_SUBFRAMELEN - 1) >> 2;
-  int m = (HALF_SUBFRAMELEN - 1) & 3;
-
-  int r0, r1, r2, r3;
-  int t0, t1, t2, t3;
-  int s0, s1, s2, s3;
-
-  __asm __volatile (
-    ".set          push                                      \n\t"
-    ".set          noreorder                                 \n\t"
-   "1:                                                       \n\t"
-    "lw            %[r0],        0(%[ptr0])                  \n\t"
-    "lw            %[r1],        4(%[ptr0])                  \n\t"
-    "lw            %[r2],        8(%[ptr0])                  \n\t"
-    "lw            %[r3],        12(%[ptr0])                 \n\t"
-    "mult          $ac0,         %[r0],        %[input0]     \n\t"
-    "mult          $ac1,         %[r1],        %[input0]     \n\t"
-    "mult          $ac2,         %[r2],        %[input0]     \n\t"
-    "mult          $ac3,         %[r3],        %[input0]     \n\t"
-    "lw            %[t0],        0(%[ptr2])                  \n\t"
-    "extr_rs.w     %[s0],        $ac0,         15            \n\t"
-    "extr_rs.w     %[s1],        $ac1,         15            \n\t"
-    "extr_rs.w     %[s2],        $ac2,         15            \n\t"
-    "extr_rs.w     %[s3],        $ac3,         15            \n\t"
-    "lw            %[t1],        4(%[ptr2])                  \n\t"
-    "lw            %[t2],        8(%[ptr2])                  \n\t"
-    "lw            %[t3],        12(%[ptr2])                 \n\t"
-    "addu          %[t0],        %[t0],        %[s0]         \n\t"
-    "addu          %[t1],        %[t1],        %[s1]         \n\t"
-    "addu          %[t2],        %[t2],        %[s2]         \n\t"
-    "addu          %[t3],        %[t3],        %[s3]         \n\t"
-    "mult          $ac0,         %[t0],        %[input2]     \n\t"
-    "mult          $ac1,         %[t1],        %[input2]     \n\t"
-    "mult          $ac2,         %[t2],        %[input2]     \n\t"
-    "mult          $ac3,         %[t3],        %[input2]     \n\t"
-    "addiu         %[ptr0],      %[ptr0],      16            \n\t"
-    "extr_rs.w     %[t0],        $ac0,         16            \n\t"
-    "extr_rs.w     %[t1],        $ac1,         16            \n\t"
-    "extr_rs.w     %[t2],        $ac2,         16            \n\t"
-    "extr_rs.w     %[t3],        $ac3,         16            \n\t"
-    "addiu         %[n],         %[n],         -1            \n\t"
-    "mult          $ac0,         %[r0],        %[input1]     \n\t"
-    "mult          $ac1,         %[r1],        %[input1]     \n\t"
-    "mult          $ac2,         %[r2],        %[input1]     \n\t"
-    "mult          $ac3,         %[r3],        %[input1]     \n\t"
-    "sw            %[t0],        0(%[ptr2])                  \n\t"
-    "extr_rs.w     %[s0],        $ac0,         15            \n\t"
-    "extr_rs.w     %[s1],        $ac1,         15            \n\t"
-    "extr_rs.w     %[s2],        $ac2,         15            \n\t"
-    "extr_rs.w     %[s3],        $ac3,         15            \n\t"
-    "sw            %[t1],        4(%[ptr2])                  \n\t"
-    "sw            %[t2],        8(%[ptr2])                  \n\t"
-    "sw            %[t3],        12(%[ptr2])                 \n\t"
-    "mult          $ac0,         %[t0],        %[input0]     \n\t"
-    "mult          $ac1,         %[t1],        %[input0]     \n\t"
-    "mult          $ac2,         %[t2],        %[input0]     \n\t"
-    "mult          $ac3,         %[t3],        %[input0]     \n\t"
-    "addiu         %[ptr2],      %[ptr2],      16            \n\t"
-    "extr_rs.w     %[t0],        $ac0,         15            \n\t"
-    "extr_rs.w     %[t1],        $ac1,         15            \n\t"
-    "extr_rs.w     %[t2],        $ac2,         15            \n\t"
-    "extr_rs.w     %[t3],        $ac3,         15            \n\t"
-    "addu          %[t0],        %[t0],        %[s0]         \n\t"
-    "addu          %[t1],        %[t1],        %[s1]         \n\t"
-    "addu          %[t2],        %[t2],        %[s2]         \n\t"
-    "addu          %[t3],        %[t3],        %[s3]         \n\t"
-    "sw            %[t0],        0(%[ptr1])                  \n\t"
-    "sw            %[t1],        4(%[ptr1])                  \n\t"
-    "sw            %[t2],        8(%[ptr1])                  \n\t"
-    "sw            %[t3],        12(%[ptr1])                 \n\t"
-    "bgtz          %[n],         1b                          \n\t"
-    " addiu        %[ptr1],      %[ptr1],      16            \n\t"
-    "beq           %[m],         %0,           3f            \n\t"
-    " nop                                                    \n\t"
-   "2:                                                       \n\t"
-    "lw            %[r0],        0(%[ptr0])                  \n\t"
-    "lw            %[t0],        0(%[ptr2])                  \n\t"
-    "addiu         %[ptr0],      %[ptr0],      4             \n\t"
-    "mult          $ac0,         %[r0],        %[input0]     \n\t"
-    "mult          $ac1,         %[r0],        %[input1]     \n\t"
-    "extr_rs.w     %[r1],        $ac0,         15            \n\t"
-    "extr_rs.w     %[t1],        $ac1,         15            \n\t"
-    "addu          %[t0],        %[t0],        %[r1]         \n\t"
-    "mult          $ac0,         %[t0],        %[input2]     \n\t"
-    "extr_rs.w     %[t0],        $ac0,         16            \n\t"
-    "sw            %[t0],        0(%[ptr2])                  \n\t"
-    "mult          $ac0,         %[t0],        %[input0]     \n\t"
-    "addiu         %[ptr2],      %[ptr2],      4             \n\t"
-    "addiu         %[m],         %[m],         -1            \n\t"
-    "extr_rs.w     %[t0],        $ac0,         15            \n\t"
-    "addu          %[t0],        %[t0],        %[t1]         \n\t"
-    "sw            %[t0],        0(%[ptr1])                  \n\t"
-    "bgtz          %[m],         2b                          \n\t"
-    " addiu        %[ptr1],      %[ptr1],      4             \n\t"
-   "3:                                                       \n\t"
-    ".set          pop                                       \n\t"
-    : [r0] "=&r" (r0), [r1] "=&r" (r1), [r2] "=&r" (r2),
-      [r3] "=&r" (r3), [t0] "=&r" (t0), [t1] "=&r" (t1),
-      [t2] "=&r" (t2), [t3] "=&r" (t3), [s0] "=&r" (s0),
-      [s1] "=&r" (s1), [s2] "=&r" (s2), [s3] "=&r" (s3),
-      [ptr0] "+r" (ptr0), [ptr1] "+r" (ptr1), [m] "+r" (m),
-      [ptr2] "+r" (ptr2), [n] "+r" (n)
-    : [input0] "r" (input0), [input1] "r" (input1),
-      [input2] "r" (input2)
-    : "memory", "hi", "lo", "$ac1hi", "$ac1lo", "$ac2hi",
-      "$ac2lo", "$ac3hi", "$ac3lo"
-  );
-#else
-  // Non-DSPR2 version of the function. Avoiding the accumulator usage due to
-  // large latencies. This variant is bit-exact with C code.
-  int n = HALF_SUBFRAMELEN - 1;
-  int32_t t16a, t16b;
-  int32_t r0, r1, r2, r3, r4;
-
-  __asm __volatile (
-    ".set          push                                      \n\t"
-    ".set          noreorder                                 \n\t"
-    "sra           %[t16a],      %[input2],     16           \n\t"
-    "andi          %[t16b],      %[input2],     0xFFFF       \n\t"
-#if defined(MIPS32R2_LE)
-    "seh           %[t16b],      %[t16b]                     \n\t"
-    "seh           %[input0],    %[input0]                   \n\t"
-    "seh           %[input1],    %[input1]                   \n\t"
-#else
-    "sll           %[t16b],      %[t16b],       16           \n\t"
-    "sra           %[t16b],      %[t16b],       16           \n\t"
-    "sll           %[input0],    %[input0],     16           \n\t"
-    "sra           %[input0],    %[input0],     16           \n\t"
-    "sll           %[input1],    %[input1],     16           \n\t"
-    "sra           %[input1],    %[input1],     16           \n\t"
-#endif
-    "addiu         %[r0],        %[t16a],       1            \n\t"
-    "slt           %[r1],        %[t16b],       $zero        \n\t"
-    "movn          %[t16a],      %[r0],         %[r1]        \n\t"
-   "1:                                                       \n\t"
-    "lw            %[r0],        0(%[ptr0])                  \n\t"
-    "lw            %[r1],        0(%[ptr2])                  \n\t"
-    "addiu         %[ptr0],      %[ptr0],       4            \n\t"
-    "sra           %[r2],        %[r0],         16           \n\t"
-    "andi          %[r0],        %[r0],         0xFFFF       \n\t"
-    "mul           %[r3],        %[r2],         %[input0]    \n\t"
-    "mul           %[r4],        %[r0],         %[input0]    \n\t"
-    "mul           %[r2],        %[r2],         %[input1]    \n\t"
-    "mul           %[r0],        %[r0],         %[input1]    \n\t"
-    "addiu         %[ptr2],      %[ptr2],       4            \n\t"
-    "sll           %[r3],        %[r3],         1            \n\t"
-    "sra           %[r4],        %[r4],         1            \n\t"
-    "addiu         %[r4],        %[r4],         0x2000       \n\t"
-    "sra           %[r4],        %[r4],         14           \n\t"
-    "addu          %[r3],        %[r3],         %[r4]        \n\t"
-    "addu          %[r1],        %[r1],         %[r3]        \n\t"
-    "sra           %[r3],        %[r1],         16           \n\t"
-    "andi          %[r4],        %[r1],         0xFFFF       \n\t"
-    "sra           %[r4],        %[r4],         1            \n\t"
-    "mul           %[r1],        %[r1],         %[t16a]      \n\t"
-    "mul           %[r3],        %[r3],         %[t16b]      \n\t"
-    "mul           %[r4],        %[r4],         %[t16b]      \n\t"
-    "sll           %[r2],        %[r2],         1            \n\t"
-    "sra           %[r0],        %[r0],         1            \n\t"
-    "addiu         %[r0],        %[r0],         0x2000       \n\t"
-    "sra           %[r0],        %[r0],         14           \n\t"
-    "addu          %[r0],        %[r0],         %[r2]        \n\t"
-    "addiu         %[n],         %[n],          -1           \n\t"
-    "addu          %[r1],        %[r1],         %[r3]        \n\t"
-    "addiu         %[r4],        %[r4],         0x4000       \n\t"
-    "sra           %[r4],        %[r4],         15           \n\t"
-    "addu          %[r1],        %[r1],         %[r4]        \n\t"
-    "sra           %[r2],        %[r1],         16           \n\t"
-    "andi          %[r3],        %[r1],         0xFFFF       \n\t"
-    "mul           %[r3],        %[r3],         %[input0]    \n\t"
-    "mul           %[r2],        %[r2],         %[input0]    \n\t"
-    "sw            %[r1],        -4(%[ptr2])                 \n\t"
-    "sra           %[r3],        %[r3],         1            \n\t"
-    "addiu         %[r3],        %[r3],         0x2000       \n\t"
-    "sra           %[r3],        %[r3],         14           \n\t"
-    "addu          %[r0],        %[r0],         %[r3]        \n\t"
-    "sll           %[r2],        %[r2],         1            \n\t"
-    "addu          %[r0],        %[r0],         %[r2]        \n\t"
-    "sw            %[r0],        0(%[ptr1])                  \n\t"
-    "bgtz          %[n],         1b                          \n\t"
-    " addiu        %[ptr1],      %[ptr1],       4            \n\t"
-    ".set          pop                                       \n\t"
-    : [t16a] "=&r" (t16a), [t16b] "=&r" (t16b), [r0] "=&r" (r0),
-      [r1] "=&r" (r1), [r2] "=&r" (r2), [r3] "=&r" (r3),
-      [r4] "=&r" (r4), [ptr0] "+r" (ptr0), [ptr1] "+r" (ptr1),
-      [ptr2] "+r" (ptr2), [n] "+r" (n)
-    : [input0] "r" (input0), [input1] "r" (input1),
-      [input2] "r" (input2)
-    : "hi", "lo", "memory"
-  );
-#endif
-}
diff --git a/modules/audio_coding/codecs/isac/fix/source/lattice_neon.c b/modules/audio_coding/codecs/isac/fix/source/lattice_neon.c
deleted file mode 100644
index 9218a3a..0000000
--- a/modules/audio_coding/codecs/isac/fix/source/lattice_neon.c
+++ /dev/null
@@ -1,195 +0,0 @@
-/*
- *  Copyright (c) 2014 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 <arm_neon.h>
-
-#include "webrtc/modules/audio_coding/codecs/isac/fix/source/codec.h"
-#include "webrtc/modules/audio_coding/codecs/isac/fix/source/settings.h"
-
-// Contains a function for the core loop in the normalized lattice MA
-// filter routine for iSAC codec, optimized for ARM Neon platform.
-// It does:
-//  for 0 <= n < HALF_SUBFRAMELEN - 1:
-//    *ptr2 = input2 * ((*ptr2) + input0 * (*ptr0));
-//    *ptr1 = input1 * (*ptr0) + input0 * (*ptr2);
-// Output is not bit-exact with the reference C code, due to the replacement
-// of WEBRTC_SPL_MUL_16_32_RSFT15 and LATTICE_MUL_32_32_RSFT16 with Neon
-// instructions. The difference should not be bigger than 1.
-void WebRtcIsacfix_FilterMaLoopNeon(int16_t input0,  // Filter coefficient
-                                    int16_t input1,  // Filter coefficient
-                                    int32_t input2,  // Inverse coefficient
-                                    int32_t* ptr0,   // Sample buffer
-                                    int32_t* ptr1,   // Sample buffer
-                                    int32_t* ptr2)   // Sample buffer
-{
-  int n = 0;
-  int loop = (HALF_SUBFRAMELEN - 1) >> 3;
-  int loop_tail = (HALF_SUBFRAMELEN - 1) & 0x7;
-
-  int32x4_t input0_v = vdupq_n_s32((int32_t)input0 << 16);
-  int32x4_t input1_v = vdupq_n_s32((int32_t)input1 << 16);
-  int32x4_t input2_v = vdupq_n_s32(input2);
-  int32x4_t tmp0a, tmp1a, tmp2a, tmp3a;
-  int32x4_t tmp0b, tmp1b, tmp2b, tmp3b;
-  int32x4_t ptr0va, ptr1va, ptr2va;
-  int32x4_t ptr0vb, ptr1vb, ptr2vb;
-
-  int64x2_t tmp2al_low, tmp2al_high, tmp2bl_low, tmp2bl_high;
-  // Unroll to process 8 samples at once.
-  for (n = 0; n < loop; n++) {
-    ptr0va = vld1q_s32(ptr0);
-    ptr0vb = vld1q_s32(ptr0 + 4);
-    ptr0 += 8;
-
-    ptr2va = vld1q_s32(ptr2);
-    ptr2vb = vld1q_s32(ptr2 + 4);
-
-    // Calculate tmp0 = (*ptr0) * input0.
-    tmp0a = vqrdmulhq_s32(ptr0va, input0_v);
-    tmp0b = vqrdmulhq_s32(ptr0vb, input0_v);
-
-    // Calculate tmp1 = (*ptr0) * input1.
-    tmp1a = vqrdmulhq_s32(ptr0va, input1_v);
-    tmp1b = vqrdmulhq_s32(ptr0vb, input1_v);
-
-    // Calculate tmp2 = tmp0 + *(ptr2).
-    tmp2a = vaddq_s32(tmp0a, ptr2va);
-    tmp2b = vaddq_s32(tmp0b, ptr2vb);
-
-    // Calculate *ptr2 = input2 * tmp2.
-    tmp2al_low = vmull_s32(vget_low_s32(tmp2a), vget_low_s32(input2_v));
-#if defined(WEBRTC_ARCH_ARM64)
-    tmp2al_high = vmull_high_s32(tmp2a, input2_v);
-#else
-    tmp2al_high = vmull_s32(vget_high_s32(tmp2a), vget_high_s32(input2_v));
-#endif
-    ptr2va = vcombine_s32(vrshrn_n_s64(tmp2al_low, 16),
-                          vrshrn_n_s64(tmp2al_high, 16));
-
-    tmp2bl_low = vmull_s32(vget_low_s32(tmp2b), vget_low_s32(input2_v));
-#if defined(WEBRTC_ARCH_ARM64)
-    tmp2bl_high = vmull_high_s32(tmp2b, input2_v);
-#else
-    tmp2bl_high = vmull_s32(vget_high_s32(tmp2b), vget_high_s32(input2_v));
-#endif
-    ptr2vb = vcombine_s32(vrshrn_n_s64(tmp2bl_low, 16),
-                          vrshrn_n_s64(tmp2bl_high, 16));
-
-    vst1q_s32(ptr2, ptr2va);
-    vst1q_s32(ptr2 + 4, ptr2vb);
-    ptr2 += 8;
-
-    // Calculate tmp3 = ptr2v * input0.
-    tmp3a = vqrdmulhq_s32(ptr2va, input0_v);
-    tmp3b = vqrdmulhq_s32(ptr2vb, input0_v);
-
-    // Calculate *ptr1 = tmp1 + tmp3.
-    ptr1va = vaddq_s32(tmp1a, tmp3a);
-    ptr1vb = vaddq_s32(tmp1b, tmp3b);
-
-    vst1q_s32(ptr1, ptr1va);
-    vst1q_s32(ptr1 + 4, ptr1vb);
-    ptr1 += 8;
-  }
-
-  // Process four more samples.
-  if (loop_tail & 0x4) {
-    ptr0va = vld1q_s32(ptr0);
-    ptr2va = vld1q_s32(ptr2);
-    ptr0 += 4;
-
-    // Calculate tmp0 = (*ptr0) * input0.
-    tmp0a = vqrdmulhq_s32(ptr0va, input0_v);
-
-    // Calculate tmp1 = (*ptr0) * input1.
-    tmp1a = vqrdmulhq_s32(ptr0va, input1_v);
-
-    // Calculate tmp2 = tmp0 + *(ptr2).
-    tmp2a = vaddq_s32(tmp0a, ptr2va);
-
-    // Calculate *ptr2 = input2 * tmp2.
-    tmp2al_low = vmull_s32(vget_low_s32(tmp2a), vget_low_s32(input2_v));
-
-#if defined(WEBRTC_ARCH_ARM64)
-    tmp2al_high = vmull_high_s32(tmp2a, input2_v);
-#else
-    tmp2al_high = vmull_s32(vget_high_s32(tmp2a), vget_high_s32(input2_v));
-#endif
-    ptr2va = vcombine_s32(vrshrn_n_s64(tmp2al_low, 16),
-                          vrshrn_n_s64(tmp2al_high, 16));
-
-    vst1q_s32(ptr2, ptr2va);
-    ptr2 += 4;
-
-    // Calculate tmp3 = *(ptr2) * input0.
-    tmp3a = vqrdmulhq_s32(ptr2va, input0_v);
-
-    // Calculate *ptr1 = tmp1 + tmp3.
-    ptr1va = vaddq_s32(tmp1a, tmp3a);
-
-    vst1q_s32(ptr1, ptr1va);
-    ptr1 += 4;
-  }
-
-  // Process two more samples.
-  if (loop_tail & 0x2) {
-    int32x2_t ptr0v_tail, ptr2v_tail, ptr1v_tail;
-    int32x2_t tmp0_tail, tmp1_tail, tmp2_tail, tmp3_tail;
-    int64x2_t tmp2l_tail;
-    ptr0v_tail = vld1_s32(ptr0);
-    ptr2v_tail = vld1_s32(ptr2);
-    ptr0 += 2;
-
-    // Calculate tmp0 = (*ptr0) * input0.
-    tmp0_tail = vqrdmulh_s32(ptr0v_tail, vget_low_s32(input0_v));
-
-    // Calculate tmp1 = (*ptr0) * input1.
-    tmp1_tail = vqrdmulh_s32(ptr0v_tail, vget_low_s32(input1_v));
-
-    // Calculate tmp2 = tmp0 + *(ptr2).
-    tmp2_tail = vadd_s32(tmp0_tail, ptr2v_tail);
-
-    // Calculate *ptr2 = input2 * tmp2.
-    tmp2l_tail = vmull_s32(tmp2_tail, vget_low_s32(input2_v));
-    ptr2v_tail = vrshrn_n_s64(tmp2l_tail, 16);
-
-    vst1_s32(ptr2, ptr2v_tail);
-    ptr2 += 2;
-
-    // Calculate tmp3 = *(ptr2) * input0.
-    tmp3_tail = vqrdmulh_s32(ptr2v_tail, vget_low_s32(input0_v));
-
-    // Calculate *ptr1 = tmp1 + tmp3.
-    ptr1v_tail = vadd_s32(tmp1_tail, tmp3_tail);
-
-    vst1_s32(ptr1, ptr1v_tail);
-    ptr1 += 2;
-  }
-
-  // Process one more sample.
-  if (loop_tail & 0x1) {
-    int16_t t16a = (int16_t)(input2 >> 16);
-    int16_t t16b = (int16_t)input2;
-    if (t16b < 0) t16a++;
-    int32_t tmp32a;
-    int32_t tmp32b;
-
-    // Calculate *ptr2 = input2 * (*ptr2 + input0 * (*ptr0)).
-    tmp32a = WEBRTC_SPL_MUL_16_32_RSFT15(input0, *ptr0);
-    tmp32b = *ptr2 + tmp32a;
-    *ptr2 = (int32_t)(WEBRTC_SPL_MUL(t16a, tmp32b) +
-                       (WEBRTC_SPL_MUL_16_32_RSFT16(t16b, tmp32b)));
-
-    // Calculate *ptr1 = input1 * (*ptr0) + input0 * (*ptr2).
-    tmp32a = WEBRTC_SPL_MUL_16_32_RSFT15(input1, *ptr0);
-    tmp32b = WEBRTC_SPL_MUL_16_32_RSFT15(input0, *ptr2);
-    *ptr1 = tmp32a + tmp32b;
-  }
-}
diff --git a/modules/audio_coding/codecs/isac/fix/source/lpc_masking_model.c b/modules/audio_coding/codecs/isac/fix/source/lpc_masking_model.c
deleted file mode 100644
index 97e4ce0..0000000
--- a/modules/audio_coding/codecs/isac/fix/source/lpc_masking_model.c
+++ /dev/null
@@ -1,948 +0,0 @@
-/*
- *  Copyright (c) 2012 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.
- */
-
-/*
- * lpc_masking_model.c
- *
- * LPC analysis and filtering functions
- *
- */
-
-#include "lpc_masking_model.h"
-
-#include <limits.h>  /* For LLONG_MAX and LLONG_MIN. */
-#include "codec.h"
-#include "entropy_coding.h"
-#include "settings.h"
-
-/* The conversion is implemented by the step-down algorithm */
-void WebRtcSpl_AToK_JSK(
-    int16_t *a16, /* Q11 */
-    int16_t useOrder,
-    int16_t *k16  /* Q15 */
-                        )
-{
-  int m, k;
-  int32_t tmp32[MAX_AR_MODEL_ORDER];
-  int32_t tmp32b;
-  int32_t tmp_inv_denum32;
-  int16_t tmp_inv_denum16;
-
-  k16[useOrder-1] = a16[useOrder] << 4;  // Q11<<4 => Q15
-
-  for (m=useOrder-1; m>0; m--) {
-    // (1 - k^2) in Q30
-    tmp_inv_denum32 = 1073741823 - k16[m] * k16[m];
-    tmp_inv_denum16 = (int16_t)(tmp_inv_denum32 >> 15);  // (1 - k^2) in Q15.
-
-    for (k=1; k<=m; k++) {
-      tmp32b = (a16[k] << 16) - ((k16[m] * a16[m - k + 1]) << 1);
-
-      tmp32[k] = WebRtcSpl_DivW32W16(tmp32b, tmp_inv_denum16); //Q27/Q15 = Q12
-    }
-
-    for (k=1; k<m; k++) {
-      a16[k] = (int16_t)(tmp32[k] >> 1);  // Q12>>1 => Q11
-    }
-
-    tmp32[m] = WEBRTC_SPL_SAT(4092, tmp32[m], -4092);
-    k16[m - 1] = (int16_t)(tmp32[m] << 3);  // Q12<<3 => Q15
-  }
-
-  return;
-}
-
-
-
-
-
-int16_t WebRtcSpl_LevinsonW32_JSK(
-    int32_t *R,  /* (i) Autocorrelation of length >= order+1 */
-    int16_t *A,  /* (o) A[0..order] LPC coefficients (Q11) */
-    int16_t *K,  /* (o) K[0...order-1] Reflection coefficients (Q15) */
-    int16_t order /* (i) filter order */
-                                        ) {
-  int16_t i, j;
-  int16_t R_hi[LEVINSON_MAX_ORDER+1], R_low[LEVINSON_MAX_ORDER+1];
-  /* Aurocorr coefficients in high precision */
-  int16_t A_hi[LEVINSON_MAX_ORDER+1], A_low[LEVINSON_MAX_ORDER+1];
-  /* LPC coefficients in high precicion */
-  int16_t A_upd_hi[LEVINSON_MAX_ORDER+1], A_upd_low[LEVINSON_MAX_ORDER+1];
-  /* LPC coefficients for next iteration */
-  int16_t K_hi, K_low;      /* reflection coefficient in high precision */
-  int16_t Alpha_hi, Alpha_low, Alpha_exp; /* Prediction gain Alpha in high precision
-                                                   and with scale factor */
-  int16_t tmp_hi, tmp_low;
-  int32_t temp1W32, temp2W32, temp3W32;
-  int16_t norm;
-
-  /* Normalize the autocorrelation R[0]...R[order+1] */
-
-  norm = WebRtcSpl_NormW32(R[0]);
-
-  for (i=order;i>=0;i--) {
-    temp1W32 = R[i] << norm;
-    /* Put R in hi and low format */
-    R_hi[i] = (int16_t)(temp1W32 >> 16);
-    R_low[i] = (int16_t)((temp1W32 - ((int32_t)R_hi[i] << 16)) >> 1);
-  }
-
-  /* K = A[1] = -R[1] / R[0] */
-
-  temp2W32 = (R_hi[1] << 16) + (R_low[1] << 1);  /* R[1] in Q31      */
-  temp3W32  = WEBRTC_SPL_ABS_W32(temp2W32);      /* abs R[1]         */
-  temp1W32  = WebRtcSpl_DivW32HiLow(temp3W32, R_hi[0], R_low[0]); /* abs(R[1])/R[0] in Q31 */
-  /* Put back the sign on R[1] */
-  if (temp2W32 > 0) {
-    temp1W32 = -temp1W32;
-  }
-
-  /* Put K in hi and low format */
-  K_hi = (int16_t)(temp1W32 >> 16);
-  K_low = (int16_t)((temp1W32 - ((int32_t)K_hi << 16)) >> 1);
-
-  /* Store first reflection coefficient */
-  K[0] = K_hi;
-
-  temp1W32 >>= 4;  /* A[1] in Q27. */
-
-  /* Put A[1] in hi and low format */
-  A_hi[1] = (int16_t)(temp1W32 >> 16);
-  A_low[1] = (int16_t)((temp1W32 - ((int32_t)A_hi[1] << 16)) >> 1);
-
-  /*  Alpha = R[0] * (1-K^2) */
-
-  temp1W32  = (((K_hi * K_low) >> 14) + K_hi * K_hi) << 1;  /* = k^2 in Q31 */
-
-  temp1W32 = WEBRTC_SPL_ABS_W32(temp1W32);    /* Guard against <0 */
-  temp1W32 = (int32_t)0x7fffffffL - temp1W32;    /* temp1W32 = (1 - K[0]*K[0]) in Q31 */
-
-  /* Store temp1W32 = 1 - K[0]*K[0] on hi and low format */
-  tmp_hi = (int16_t)(temp1W32 >> 16);
-  tmp_low = (int16_t)((temp1W32 - ((int32_t)tmp_hi << 16)) >> 1);
-
-  /* Calculate Alpha in Q31 */
-  temp1W32 = (R_hi[0] * tmp_hi + ((R_hi[0] * tmp_low) >> 15) +
-      ((R_low[0] * tmp_hi) >> 15)) << 1;
-
-  /* Normalize Alpha and put it in hi and low format */
-
-  Alpha_exp = WebRtcSpl_NormW32(temp1W32);
-  temp1W32 <<= Alpha_exp;
-  Alpha_hi = (int16_t)(temp1W32 >> 16);
-  Alpha_low = (int16_t)((temp1W32 - ((int32_t)Alpha_hi<< 16)) >> 1);
-
-  /* Perform the iterative calculations in the
-     Levinson Durbin algorithm */
-
-  for (i=2; i<=order; i++)
-  {
-
-    /*                    ----
-                          \
-        temp1W32 =  R[i] + > R[j]*A[i-j]
-                          /
-                          ----
-                          j=1..i-1
-    */
-
-    temp1W32 = 0;
-
-    for(j=1; j<i; j++) {
-      /* temp1W32 is in Q31 */
-      temp1W32 += ((R_hi[j] * A_hi[i - j]) << 1) +
-          ((((R_hi[j] * A_low[i - j]) >> 15) +
-              ((R_low[j] * A_hi[i - j]) >> 15)) << 1);
-    }
-
-    temp1W32 <<= 4;
-    temp1W32 += (R_hi[i] << 16) + (R_low[i] << 1);
-
-    /* K = -temp1W32 / Alpha */
-    temp2W32 = WEBRTC_SPL_ABS_W32(temp1W32);      /* abs(temp1W32) */
-    temp3W32 = WebRtcSpl_DivW32HiLow(temp2W32, Alpha_hi, Alpha_low); /* abs(temp1W32)/Alpha */
-
-    /* Put the sign of temp1W32 back again */
-    if (temp1W32 > 0) {
-      temp3W32 = -temp3W32;
-    }
-
-    /* Use the Alpha shifts from earlier to denormalize */
-    norm = WebRtcSpl_NormW32(temp3W32);
-    if ((Alpha_exp <= norm)||(temp3W32==0)) {
-      temp3W32 <<= Alpha_exp;
-    } else {
-      if (temp3W32 > 0)
-      {
-        temp3W32 = (int32_t)0x7fffffffL;
-      } else
-      {
-        temp3W32 = (int32_t)0x80000000L;
-      }
-    }
-
-    /* Put K on hi and low format */
-    K_hi = (int16_t)(temp3W32 >> 16);
-    K_low = (int16_t)((temp3W32 - ((int32_t)K_hi << 16)) >> 1);
-
-    /* Store Reflection coefficient in Q15 */
-    K[i-1] = K_hi;
-
-    /* Test for unstable filter. If unstable return 0 and let the
-       user decide what to do in that case
-    */
-
-    if ((int32_t)WEBRTC_SPL_ABS_W16(K_hi) > (int32_t)32740) {
-      return(-i); /* Unstable filter */
-    }
-
-    /*
-      Compute updated LPC coefficient: Anew[i]
-      Anew[j]= A[j] + K*A[i-j]   for j=1..i-1
-      Anew[i]= K
-    */
-
-    for(j=1; j<i; j++)
-    {
-      temp1W32 = (A_hi[j] << 16) + (A_low[j] << 1);  // temp1W32 = A[j] in Q27
-
-      temp1W32 += (K_hi * A_hi[i - j] + ((K_hi * A_low[i - j]) >> 15) +
-          ((K_low * A_hi[i - j]) >> 15)) << 1;  // temp1W32 += K*A[i-j] in Q27.
-
-      /* Put Anew in hi and low format */
-      A_upd_hi[j] = (int16_t)(temp1W32 >> 16);
-      A_upd_low[j] = (int16_t)((temp1W32 - ((int32_t)A_upd_hi[j] << 16)) >> 1);
-    }
-
-    temp3W32 >>= 4;  /* temp3W32 = K in Q27 (Convert from Q31 to Q27) */
-
-    /* Store Anew in hi and low format */
-    A_upd_hi[i] = (int16_t)(temp3W32 >> 16);
-    A_upd_low[i] = (int16_t)((temp3W32 - ((int32_t)A_upd_hi[i] << 16)) >> 1);
-
-    /*  Alpha = Alpha * (1-K^2) */
-
-    temp1W32 = (((K_hi * K_low) >> 14) + K_hi * K_hi) << 1;  /* K*K in Q31 */
-
-    temp1W32 = WEBRTC_SPL_ABS_W32(temp1W32);      /* Guard against <0 */
-    temp1W32 = (int32_t)0x7fffffffL - temp1W32;      /* 1 - K*K  in Q31 */
-
-    /* Convert 1- K^2 in hi and low format */
-    tmp_hi = (int16_t)(temp1W32 >> 16);
-    tmp_low = (int16_t)((temp1W32 - ((int32_t)tmp_hi << 16)) >> 1);
-
-    /* Calculate Alpha = Alpha * (1-K^2) in Q31 */
-    temp1W32 = (Alpha_hi * tmp_hi + ((Alpha_hi * tmp_low) >> 15) +
-        ((Alpha_low * tmp_hi) >> 15)) << 1;
-
-    /* Normalize Alpha and store it on hi and low format */
-
-    norm = WebRtcSpl_NormW32(temp1W32);
-    temp1W32 <<= norm;
-
-    Alpha_hi = (int16_t)(temp1W32 >> 16);
-    Alpha_low = (int16_t)((temp1W32 - ((int32_t)Alpha_hi << 16)) >> 1);
-
-    /* Update the total nomalization of Alpha */
-    Alpha_exp = Alpha_exp + norm;
-
-    /* Update A[] */
-
-    for(j=1; j<=i; j++)
-    {
-      A_hi[j] =A_upd_hi[j];
-      A_low[j] =A_upd_low[j];
-    }
-  }
-
-  /*
-    Set A[0] to 1.0 and store the A[i] i=1...order in Q12
-    (Convert from Q27 and use rounding)
-  */
-
-  A[0] = 2048;
-
-  for(i=1; i<=order; i++) {
-    /* temp1W32 in Q27 */
-    temp1W32 = (A_hi[i] << 16) + (A_low[i] << 1);
-    /* Round and store upper word */
-    A[i] = (int16_t)((temp1W32 + 32768) >> 16);
-  }
-  return(1); /* Stable filters */
-}
-
-
-
-
-
-/* window */
-/* Matlab generation of floating point code:
- *  t = (1:256)/257; r = 1-(1-t).^.45; w = sin(r*pi).^3; w = w/sum(w); plot((1:256)/8, w); grid;
- *  for k=1:16, fprintf(1, '%.8f, ', w(k*16 + (-15:0))); fprintf(1, '\n'); end
- * All values are multiplyed with 2^21 in fixed point code.
- */
-static const int16_t kWindowAutocorr[WINLEN] = {
-  0,     0,     0,     0,     0,     1,     1,     2,     2,     3,     5,     6,
-  8,    10,    12,    14,    17,    20,    24,    28,    33,    38,    43,    49,
-  56,    63,    71,    79,    88,    98,   108,   119,   131,   143,   157,   171,
-  186,   202,   219,   237,   256,   275,   296,   318,   341,   365,   390,   416,
-  444,   472,   502,   533,   566,   600,   635,   671,   709,   748,   789,   831,
-  875,   920,   967,  1015,  1065,  1116,  1170,  1224,  1281,  1339,  1399,  1461,
-  1525,  1590,  1657,  1726,  1797,  1870,  1945,  2021,  2100,  2181,  2263,  2348,
-  2434,  2523,  2614,  2706,  2801,  2898,  2997,  3099,  3202,  3307,  3415,  3525,
-  3637,  3751,  3867,  3986,  4106,  4229,  4354,  4481,  4611,  4742,  4876,  5012,
-  5150,  5291,  5433,  5578,  5725,  5874,  6025,  6178,  6333,  6490,  6650,  6811,
-  6974,  7140,  7307,  7476,  7647,  7820,  7995,  8171,  8349,  8529,  8711,  8894,
-  9079,  9265,  9453,  9642,  9833, 10024, 10217, 10412, 10607, 10803, 11000, 11199,
-  11398, 11597, 11797, 11998, 12200, 12401, 12603, 12805, 13008, 13210, 13412, 13614,
-  13815, 14016, 14216, 14416, 14615, 14813, 15009, 15205, 15399, 15591, 15782, 15971,
-  16157, 16342, 16524, 16704, 16881, 17056, 17227, 17395, 17559, 17720, 17877, 18030,
-  18179, 18323, 18462, 18597, 18727, 18851, 18970, 19082, 19189, 19290, 19384, 19471,
-  19551, 19623, 19689, 19746, 19795, 19835, 19867, 19890, 19904, 19908, 19902, 19886,
-  19860, 19823, 19775, 19715, 19644, 19561, 19465, 19357, 19237, 19102, 18955, 18793,
-  18618, 18428, 18223, 18004, 17769, 17518, 17252, 16970, 16672, 16357, 16025, 15677,
-  15311, 14929, 14529, 14111, 13677, 13225, 12755, 12268, 11764, 11243, 10706, 10152,
-  9583,  8998,  8399,  7787,  7162,  6527,  5883,  5231,  4576,  3919,  3265,  2620,
-  1990,  1386,   825,   333
-};
-
-
-/* By using a hearing threshold level in dB of -28 dB (higher value gives more noise),
-   the H_T_H (in float) can be calculated as:
-   H_T_H = pow(10.0, 0.05 * (-28.0)) = 0.039810717055350
-   In Q19, H_T_H becomes round(0.039810717055350*2^19) ~= 20872, i.e.
-   H_T_H = 20872/524288.0, and H_T_HQ19 = 20872;
-*/
-
-
-/* The bandwidth expansion vectors are created from:
-   kPolyVecLo=[0.900000,0.810000,0.729000,0.656100,0.590490,0.531441,0.478297,0.430467,0.387420,0.348678,0.313811,0.282430];
-   kPolyVecHi=[0.800000,0.640000,0.512000,0.409600,0.327680,0.262144];
-   round(kPolyVecLo*32768)
-   round(kPolyVecHi*32768)
-*/
-static const int16_t kPolyVecLo[12] = {
-  29491, 26542, 23888, 21499, 19349, 17414, 15673, 14106, 12695, 11425, 10283, 9255
-};
-static const int16_t kPolyVecHi[6] = {
-  26214, 20972, 16777, 13422, 10737, 8590
-};
-
-static __inline int32_t log2_Q8_LPC( uint32_t x ) {
-
-  int32_t zeros;
-  int16_t frac;
-
-  zeros=WebRtcSpl_NormU32(x);
-  frac = (int16_t)(((x << zeros) & 0x7FFFFFFF) >> 23);
-
-  /* log2(x) */
-  return ((31 - zeros) << 8) + frac;
-}
-
-static const int16_t kMulPitchGain = -25; /* 200/256 in Q5 */
-static const int16_t kChngFactor = 3523; /* log10(2)*10/4*0.4/1.4=log10(2)/1.4= 0.2150 in Q14 */
-static const int16_t kExp2 = 11819; /* 1/log(2) */
-const int kShiftLowerBand = 11;  /* Shift value for lower band in Q domain. */
-const int kShiftHigherBand = 12;  /* Shift value for higher band in Q domain. */
-
-void WebRtcIsacfix_GetVars(const int16_t *input, const int16_t *pitchGains_Q12,
-                           uint32_t *oldEnergy, int16_t *varscale)
-{
-  int k;
-  uint32_t nrgQ[4];
-  int16_t nrgQlog[4];
-  int16_t tmp16, chng1, chng2, chng3, chng4, tmp, chngQ, oldNrgQlog, pgQ, pg3;
-  int32_t expPg32;
-  int16_t expPg, divVal;
-  int16_t tmp16_1, tmp16_2;
-
-  /* Calculate energies of first and second frame halfs */
-  nrgQ[0]=0;
-  for (k = QLOOKAHEAD/2; k < (FRAMESAMPLES/4 + QLOOKAHEAD) / 2; k++) {
-    nrgQ[0] += (uint32_t)(input[k] * input[k]);
-  }
-  nrgQ[1]=0;
-  for ( ; k < (FRAMESAMPLES/2 + QLOOKAHEAD) / 2; k++) {
-    nrgQ[1] += (uint32_t)(input[k] * input[k]);
-  }
-  nrgQ[2]=0;
-  for ( ; k < (FRAMESAMPLES * 3 / 4 + QLOOKAHEAD) / 2; k++) {
-    nrgQ[2] += (uint32_t)(input[k] * input[k]);
-  }
-  nrgQ[3]=0;
-  for ( ; k < (FRAMESAMPLES + QLOOKAHEAD) / 2; k++) {
-    nrgQ[3] += (uint32_t)(input[k] * input[k]);
-  }
-
-  for ( k=0; k<4; k++) {
-    nrgQlog[k] = (int16_t)log2_Q8_LPC(nrgQ[k]); /* log2(nrgQ) */
-  }
-  oldNrgQlog = (int16_t)log2_Q8_LPC(*oldEnergy);
-
-  /* Calculate average level change */
-  chng1 = WEBRTC_SPL_ABS_W16(nrgQlog[3]-nrgQlog[2]);
-  chng2 = WEBRTC_SPL_ABS_W16(nrgQlog[2]-nrgQlog[1]);
-  chng3 = WEBRTC_SPL_ABS_W16(nrgQlog[1]-nrgQlog[0]);
-  chng4 = WEBRTC_SPL_ABS_W16(nrgQlog[0]-oldNrgQlog);
-  tmp = chng1+chng2+chng3+chng4;
-  chngQ = (int16_t)(tmp * kChngFactor >> 10);  /* Q12 */
-  chngQ += 2926; /* + 1.0/1.4 in Q12 */
-
-  /* Find average pitch gain */
-  pgQ = 0;
-  for (k=0; k<4; k++)
-  {
-    pgQ += pitchGains_Q12[k];
-  }
-
-  pg3 = (int16_t)(pgQ * pgQ >> 11);  // pgQ in Q(12+2)=Q14. Q14*Q14>>11 => Q17
-  pg3 = (int16_t)(pgQ * pg3 >> 13);  /* Q14*Q17>>13 =>Q18  */
-  /* kMulPitchGain = -25 = -200 in Q-3. */
-  pg3 = (int16_t)(pg3 * kMulPitchGain >> 5);  // Q10
-  tmp16=(int16_t)WEBRTC_SPL_MUL_16_16_RSFT_WITH_ROUND(kExp2,pg3,13);/* Q13*Q10>>13 => Q10*/
-  if (tmp16<0) {
-    tmp16_2 = (0x0400 | (tmp16 & 0x03FF));
-    tmp16_1 = ((uint16_t)(tmp16 ^ 0xFFFF) >> 10) - 3;  /* Gives result in Q14 */
-    if (tmp16_1<0)
-      expPg = -(tmp16_2 << -tmp16_1);
-    else
-      expPg = -(tmp16_2 >> tmp16_1);
-  } else
-    expPg = (int16_t) -16384; /* 1 in Q14, since 2^0=1 */
-
-  expPg32 = (int32_t)expPg << 8;  /* Q22 */
-  divVal = WebRtcSpl_DivW32W16ResW16(expPg32, chngQ); /* Q22/Q12=Q10 */
-
-  tmp16=(int16_t)WEBRTC_SPL_MUL_16_16_RSFT_WITH_ROUND(kExp2,divVal,13);/* Q13*Q10>>13 => Q10*/
-  if (tmp16<0) {
-    tmp16_2 = (0x0400 | (tmp16 & 0x03FF));
-    tmp16_1 = ((uint16_t)(tmp16 ^ 0xFFFF) >> 10) - 3;  /* Gives result in Q14 */
-    if (tmp16_1<0)
-      expPg = tmp16_2 << -tmp16_1;
-    else
-      expPg = tmp16_2 >> tmp16_1;
-  } else
-    expPg = (int16_t) 16384; /* 1 in Q14, since 2^0=1 */
-
-  *varscale = expPg-1;
-  *oldEnergy = nrgQ[3];
-}
-
-
-
-static __inline int16_t  exp2_Q10_T(int16_t x) { // Both in and out in Q10
-
-  int16_t tmp16_1, tmp16_2;
-
-  tmp16_2=(int16_t)(0x0400|(x&0x03FF));
-  tmp16_1 = -(x >> 10);
-  if(tmp16_1>0)
-    return tmp16_2 >> tmp16_1;
-  else
-    return tmp16_2 << -tmp16_1;
-
-}
-
-
-// Declare function pointers.
-AutocorrFix WebRtcIsacfix_AutocorrFix;
-CalculateResidualEnergy WebRtcIsacfix_CalculateResidualEnergy;
-
-/* This routine calculates the residual energy for LPC.
- * Formula as shown in comments inside.
- */
-int32_t WebRtcIsacfix_CalculateResidualEnergyC(int lpc_order,
-                                               int32_t q_val_corr,
-                                               int q_val_polynomial,
-                                               int16_t* a_polynomial,
-                                               int32_t* corr_coeffs,
-                                               int* q_val_residual_energy) {
-  int i = 0, j = 0;
-  int shift_internal = 0, shift_norm = 0;
-  int32_t tmp32 = 0, word32_high = 0, word32_low = 0, residual_energy = 0;
-  int64_t sum64 = 0, sum64_tmp = 0;
-
-  for (i = 0; i <= lpc_order; i++) {
-    for (j = i; j <= lpc_order; j++) {
-      /* For the case of i == 0: residual_energy +=
-       *    a_polynomial[j] * corr_coeffs[i] * a_polynomial[j - i];
-       * For the case of i != 0: residual_energy +=
-       *    a_polynomial[j] * corr_coeffs[i] * a_polynomial[j - i] * 2;
-       */
-
-      tmp32 = a_polynomial[j] * a_polynomial[j - i];
-                                   /* tmp32 in Q(q_val_polynomial * 2). */
-      if (i != 0) {
-        tmp32 <<= 1;
-      }
-      sum64_tmp = (int64_t)tmp32 * (int64_t)corr_coeffs[i];
-      sum64_tmp >>= shift_internal;
-
-      /* Test overflow and sum the result. */
-      if(((sum64_tmp > 0 && sum64 > 0) && (LLONG_MAX - sum64 < sum64_tmp)) ||
-         ((sum64_tmp < 0 && sum64 < 0) && (LLONG_MIN - sum64 > sum64_tmp))) {
-        /* Shift right for overflow. */
-        shift_internal += 1;
-        sum64 >>= 1;
-        sum64 += sum64_tmp >> 1;
-      } else {
-        sum64 += sum64_tmp;
-      }
-    }
-  }
-
-  word32_high = (int32_t)(sum64 >> 32);
-  word32_low = (int32_t)sum64;
-
-  // Calculate the value of shifting (shift_norm) for the 64-bit sum.
-  if(word32_high != 0) {
-    shift_norm = 32 - WebRtcSpl_NormW32(word32_high);
-    residual_energy = (int32_t)(sum64 >> shift_norm);
-  } else {
-    if((word32_low & 0x80000000) != 0) {
-      shift_norm = 1;
-      residual_energy = (uint32_t)word32_low >> 1;
-    } else {
-      shift_norm = WebRtcSpl_NormW32(word32_low);
-      residual_energy = word32_low << shift_norm;
-      shift_norm = -shift_norm;
-    }
-  }
-
-  /* Q(q_val_polynomial * 2) * Q(q_val_corr) >> shift_internal >> shift_norm
-   *   = Q(q_val_corr - shift_internal - shift_norm + q_val_polynomial * 2)
-   */
-  *q_val_residual_energy = q_val_corr - shift_internal - shift_norm
-                           + q_val_polynomial * 2;
-
-  return residual_energy;
-}
-
-void WebRtcIsacfix_GetLpcCoef(int16_t *inLoQ0,
-                              int16_t *inHiQ0,
-                              MaskFiltstr_enc *maskdata,
-                              int16_t snrQ10,
-                              const int16_t *pitchGains_Q12,
-                              int32_t *gain_lo_hiQ17,
-                              int16_t *lo_coeffQ15,
-                              int16_t *hi_coeffQ15)
-{
-  int k, n, ii;
-  int pos1, pos2;
-  int sh_lo, sh_hi, sh, ssh, shMem;
-  int16_t varscaleQ14;
-
-  int16_t tmpQQlo, tmpQQhi;
-  int32_t tmp32;
-  int16_t tmp16,tmp16b;
-
-  int16_t polyHI[ORDERHI+1];
-  int16_t rcQ15_lo[ORDERLO], rcQ15_hi[ORDERHI];
-
-
-  int16_t DataLoQ6[WINLEN], DataHiQ6[WINLEN];
-  int32_t corrloQQ[ORDERLO+2];
-  int32_t corrhiQQ[ORDERHI+1];
-  int32_t corrlo2QQ[ORDERLO+1];
-  int16_t scale;
-  int16_t QdomLO, QdomHI, newQdomHI, newQdomLO;
-
-  int32_t res_nrgQQ;
-  int32_t sqrt_nrg;
-
-  /* less-noise-at-low-frequencies factor */
-  int16_t aaQ14;
-
-  /* Multiplication with 1/sqrt(12) ~= 0.28901734104046 can be done by convertion to
-     Q15, i.e. round(0.28901734104046*32768) = 9471, and use 9471/32768.0 ~= 0.289032
-  */
-  int16_t snrq;
-  int shft;
-
-  int16_t tmp16a;
-  int32_t tmp32a, tmp32b, tmp32c;
-
-  int16_t a_LOQ11[ORDERLO+1];
-  int16_t k_vecloQ15[ORDERLO];
-  int16_t a_HIQ12[ORDERHI+1];
-  int16_t k_vechiQ15[ORDERHI];
-
-  int16_t stab;
-
-  snrq=snrQ10;
-
-  /* SNR= C * 2 ^ (D * snrq) ; C=0.289, D=0.05*log2(10)=0.166 (~=172 in Q10)*/
-  tmp16 = (int16_t)(snrq * 172 >> 10);  // Q10
-  tmp16b = exp2_Q10_T(tmp16); // Q10
-  snrq = (int16_t)(tmp16b * 285 >> 10);  // Q10
-
-  /* change quallevel depending on pitch gains and level fluctuations */
-  WebRtcIsacfix_GetVars(inLoQ0, pitchGains_Q12, &(maskdata->OldEnergy), &varscaleQ14);
-
-  /* less-noise-at-low-frequencies factor */
-  /* Calculation of 0.35 * (0.5 + 0.5 * varscale) in fixpoint:
-     With 0.35 in Q16 (0.35 ~= 22938/65536.0 = 0.3500061) and varscaleQ14 in Q14,
-     we get Q16*Q14>>16 = Q14
-  */
-  aaQ14 = (int16_t)((22938 * (8192 + (varscaleQ14 >> 1)) + 32768) >> 16);
-
-  /* Calculate tmp = (1.0 + aa*aa); in Q12 */
-  tmp16 = (int16_t)(aaQ14 * aaQ14 >> 15);  // Q14*Q14>>15 = Q13
-  tmpQQlo = 4096 + (tmp16 >> 1);  // Q12 + Q13>>1 = Q12.
-
-  /* Calculate tmp = (1.0+aa) * (1.0+aa); */
-  tmp16 = 8192 + (aaQ14 >> 1);  // 1+a in Q13.
-  tmpQQhi = (int16_t)(tmp16 * tmp16 >> 14);  // Q13*Q13>>14 = Q12
-
-  /* replace data in buffer by new look-ahead data */
-  for (pos1 = 0; pos1 < QLOOKAHEAD; pos1++) {
-    maskdata->DataBufferLoQ0[pos1 + WINLEN - QLOOKAHEAD] = inLoQ0[pos1];
-  }
-
-  for (k = 0; k < SUBFRAMES; k++) {
-
-    /* Update input buffer and multiply signal with window */
-    for (pos1 = 0; pos1 < WINLEN - UPDATE/2; pos1++) {
-      maskdata->DataBufferLoQ0[pos1] = maskdata->DataBufferLoQ0[pos1 + UPDATE/2];
-      maskdata->DataBufferHiQ0[pos1] = maskdata->DataBufferHiQ0[pos1 + UPDATE/2];
-      DataLoQ6[pos1] = (int16_t)(maskdata->DataBufferLoQ0[pos1] *
-          kWindowAutocorr[pos1] >> 15);  // Q0*Q21>>15 = Q6
-      DataHiQ6[pos1] = (int16_t)(maskdata->DataBufferHiQ0[pos1] *
-          kWindowAutocorr[pos1] >> 15);  // Q0*Q21>>15 = Q6
-    }
-    pos2 = (int16_t)(k * UPDATE / 2);
-    for (n = 0; n < UPDATE/2; n++, pos1++) {
-      maskdata->DataBufferLoQ0[pos1] = inLoQ0[QLOOKAHEAD + pos2];
-      maskdata->DataBufferHiQ0[pos1] = inHiQ0[pos2++];
-      DataLoQ6[pos1] = (int16_t)(maskdata->DataBufferLoQ0[pos1] *
-          kWindowAutocorr[pos1] >> 15);  // Q0*Q21>>15 = Q6
-      DataHiQ6[pos1] = (int16_t)(maskdata->DataBufferHiQ0[pos1] *
-          kWindowAutocorr[pos1] >> 15);  // Q0*Q21>>15 = Q6
-    }
-
-    /* Get correlation coefficients */
-    /* The highest absolute value measured inside DataLo in the test set
-       For DataHi, corresponding value was 160.
-
-       This means that it should be possible to represent the input values
-       to WebRtcSpl_AutoCorrelation() as Q6 values (since 307*2^6 =
-       19648). Of course, Q0 will also work, but due to the low energy in
-       DataLo and DataHi, the outputted autocorrelation will be more accurate
-       and mimic the floating point code better, by being in an high as possible
-       Q-domain.
-    */
-
-    WebRtcIsacfix_AutocorrFix(corrloQQ,DataLoQ6,WINLEN, ORDERLO+1, &scale);
-    QdomLO = 12-scale; // QdomLO is the Q-domain of corrloQQ
-    sh_lo = WebRtcSpl_NormW32(corrloQQ[0]);
-    QdomLO += sh_lo;
-    for (ii=0; ii<ORDERLO+2; ii++) {
-      corrloQQ[ii] <<= sh_lo;
-    }
-    /* It is investigated whether it was possible to use 16 bits for the
-       32-bit vector corrloQQ, but it didn't work. */
-
-    WebRtcIsacfix_AutocorrFix(corrhiQQ,DataHiQ6,WINLEN, ORDERHI, &scale);
-
-    QdomHI = 12-scale; // QdomHI is the Q-domain of corrhiQQ
-    sh_hi = WebRtcSpl_NormW32(corrhiQQ[0]);
-    QdomHI += sh_hi;
-    for (ii=0; ii<ORDERHI+1; ii++) {
-      corrhiQQ[ii] <<= sh_hi;
-    }
-
-    /* less noise for lower frequencies, by filtering/scaling autocorrelation sequences */
-
-    /* Calculate corrlo2[0] = tmpQQlo * corrlo[0] - 2.0*tmpQQlo * corrlo[1];*/
-    // |corrlo2QQ| in Q(QdomLO-5).
-    corrlo2QQ[0] = (WEBRTC_SPL_MUL_16_32_RSFT16(tmpQQlo, corrloQQ[0]) >> 1) -
-        (WEBRTC_SPL_MUL_16_32_RSFT16(aaQ14, corrloQQ[1]) >> 2);
-
-    /* Calculate corrlo2[n] = tmpQQlo * corrlo[n] - tmpQQlo * (corrlo[n-1] + corrlo[n+1]);*/
-    for (n = 1; n <= ORDERLO; n++) {
-
-      tmp32 = (corrloQQ[n - 1] >> 1) + (corrloQQ[n + 1] >> 1);  // Q(QdomLO-1).
-      corrlo2QQ[n] = (WEBRTC_SPL_MUL_16_32_RSFT16(tmpQQlo, corrloQQ[n]) >> 1) -
-          (WEBRTC_SPL_MUL_16_32_RSFT16(aaQ14, tmp32) >> 2);
-    }
-    QdomLO -= 5;
-
-    /* Calculate corrhi[n] = tmpQQhi * corrhi[n]; */
-    for (n = 0; n <= ORDERHI; n++) {
-      corrhiQQ[n] = WEBRTC_SPL_MUL_16_32_RSFT16(tmpQQhi, corrhiQQ[n]); // Q(12+QdomHI-16) = Q(QdomHI-4)
-    }
-    QdomHI -= 4;
-
-    /* add white noise floor */
-    /* corrlo2QQ is in Q(QdomLO) and corrhiQQ is in Q(QdomHI) */
-    /* Calculate corrlo2[0] += 9.5367431640625e-7; and
-       corrhi[0]  += 9.5367431640625e-7, where the constant is 1/2^20 */
-
-    tmp32 = WEBRTC_SPL_SHIFT_W32((int32_t) 1, QdomLO-20);
-    corrlo2QQ[0] += tmp32;
-    tmp32 = WEBRTC_SPL_SHIFT_W32((int32_t) 1, QdomHI-20);
-    corrhiQQ[0]  += tmp32;
-
-    /* corrlo2QQ is in Q(QdomLO) and corrhiQQ is in Q(QdomHI) before the following
-       code segment, where we want to make sure we get a 1-bit margin */
-    for (n = 0; n <= ORDERLO; n++) {
-      corrlo2QQ[n] >>= 1;  // Make sure we have a 1-bit margin.
-    }
-    QdomLO -= 1; // Now, corrlo2QQ is in Q(QdomLO), with a 1-bit margin
-
-    for (n = 0; n <= ORDERHI; n++) {
-      corrhiQQ[n] >>= 1;  // Make sure we have a 1-bit margin.
-    }
-    QdomHI -= 1; // Now, corrhiQQ is in Q(QdomHI), with a 1-bit margin
-
-
-    newQdomLO = QdomLO;
-
-    for (n = 0; n <= ORDERLO; n++) {
-      int32_t tmp, tmpB, tmpCorr;
-      int16_t alpha=328; //0.01 in Q15
-      int16_t beta=324; //(1-0.01)*0.01=0.0099 in Q15
-      int16_t gamma=32440; //(1-0.01)=0.99 in Q15
-
-      if (maskdata->CorrBufLoQQ[n] != 0) {
-        shMem=WebRtcSpl_NormW32(maskdata->CorrBufLoQQ[n]);
-        sh = QdomLO - maskdata->CorrBufLoQdom[n];
-        if (sh<=shMem) {
-          tmp = WEBRTC_SPL_SHIFT_W32(maskdata->CorrBufLoQQ[n], sh); // Get CorrBufLoQQ to same domain as corrlo2
-          tmp = WEBRTC_SPL_MUL_16_32_RSFT15(alpha, tmp);
-        } else if ((sh-shMem)<7){
-          tmp = WEBRTC_SPL_SHIFT_W32(maskdata->CorrBufLoQQ[n], shMem); // Shift up CorrBufLoQQ as much as possible
-          // Shift |alpha| the number of times required to get |tmp| in QdomLO.
-          tmp = WEBRTC_SPL_MUL_16_32_RSFT15(alpha << (sh - shMem), tmp);
-        } else {
-          tmp = WEBRTC_SPL_SHIFT_W32(maskdata->CorrBufLoQQ[n], shMem); // Shift up CorrBufHiQQ as much as possible
-          // Shift |alpha| as much as possible without overflow the number of
-          // times required to get |tmp| in QdomLO.
-          tmp = WEBRTC_SPL_MUL_16_32_RSFT15(alpha << 6, tmp);
-          tmpCorr = corrloQQ[n] >> (sh - shMem - 6);
-          tmp = tmp + tmpCorr;
-          maskdata->CorrBufLoQQ[n] = tmp;
-          newQdomLO = QdomLO-(sh-shMem-6);
-          maskdata->CorrBufLoQdom[n] = newQdomLO;
-        }
-      } else
-        tmp = 0;
-
-      tmp = tmp + corrlo2QQ[n];
-
-      maskdata->CorrBufLoQQ[n] = tmp;
-      maskdata->CorrBufLoQdom[n] = QdomLO;
-
-      tmp=WEBRTC_SPL_MUL_16_32_RSFT15(beta, tmp);
-      tmpB=WEBRTC_SPL_MUL_16_32_RSFT15(gamma, corrlo2QQ[n]);
-      corrlo2QQ[n] = tmp + tmpB;
-    }
-    if( newQdomLO!=QdomLO) {
-      for (n = 0; n <= ORDERLO; n++) {
-        if (maskdata->CorrBufLoQdom[n] != newQdomLO)
-          corrloQQ[n] >>= maskdata->CorrBufLoQdom[n] - newQdomLO;
-      }
-      QdomLO = newQdomLO;
-    }
-
-
-    newQdomHI = QdomHI;
-
-    for (n = 0; n <= ORDERHI; n++) {
-      int32_t tmp, tmpB, tmpCorr;
-      int16_t alpha=328; //0.01 in Q15
-      int16_t beta=324; //(1-0.01)*0.01=0.0099 in Q15
-      int16_t gamma=32440; //(1-0.01)=0.99 in Q1
-      if (maskdata->CorrBufHiQQ[n] != 0) {
-        shMem=WebRtcSpl_NormW32(maskdata->CorrBufHiQQ[n]);
-        sh = QdomHI - maskdata->CorrBufHiQdom[n];
-        if (sh<=shMem) {
-          tmp = WEBRTC_SPL_SHIFT_W32(maskdata->CorrBufHiQQ[n], sh); // Get CorrBufHiQQ to same domain as corrhi
-          tmp = WEBRTC_SPL_MUL_16_32_RSFT15(alpha, tmp);
-          tmpCorr = corrhiQQ[n];
-          tmp = tmp + tmpCorr;
-          maskdata->CorrBufHiQQ[n] = tmp;
-          maskdata->CorrBufHiQdom[n] = QdomHI;
-        } else if ((sh-shMem)<7) {
-          tmp = WEBRTC_SPL_SHIFT_W32(maskdata->CorrBufHiQQ[n], shMem); // Shift up CorrBufHiQQ as much as possible
-          // Shift |alpha| the number of times required to get |tmp| in QdomHI.
-          tmp = WEBRTC_SPL_MUL_16_32_RSFT15(alpha << (sh - shMem), tmp);
-          tmpCorr = corrhiQQ[n];
-          tmp = tmp + tmpCorr;
-          maskdata->CorrBufHiQQ[n] = tmp;
-          maskdata->CorrBufHiQdom[n] = QdomHI;
-        } else {
-          tmp = WEBRTC_SPL_SHIFT_W32(maskdata->CorrBufHiQQ[n], shMem); // Shift up CorrBufHiQQ as much as possible
-          // Shift |alpha| as much as possible without overflow the number of
-          // times required to get |tmp| in QdomHI.
-          tmp = WEBRTC_SPL_MUL_16_32_RSFT15(alpha << 6, tmp);
-          tmpCorr = corrhiQQ[n] >> (sh - shMem - 6);
-          tmp = tmp + tmpCorr;
-          maskdata->CorrBufHiQQ[n] = tmp;
-          newQdomHI = QdomHI-(sh-shMem-6);
-          maskdata->CorrBufHiQdom[n] = newQdomHI;
-        }
-      } else {
-        tmp = corrhiQQ[n];
-        tmpCorr = tmp;
-        maskdata->CorrBufHiQQ[n] = tmp;
-        maskdata->CorrBufHiQdom[n] = QdomHI;
-      }
-
-      tmp=WEBRTC_SPL_MUL_16_32_RSFT15(beta, tmp);
-      tmpB=WEBRTC_SPL_MUL_16_32_RSFT15(gamma, tmpCorr);
-      corrhiQQ[n] = tmp + tmpB;
-    }
-
-    if( newQdomHI!=QdomHI) {
-      for (n = 0; n <= ORDERHI; n++) {
-        if (maskdata->CorrBufHiQdom[n] != newQdomHI)
-          corrhiQQ[n] >>= maskdata->CorrBufHiQdom[n] - newQdomHI;
-      }
-      QdomHI = newQdomHI;
-    }
-
-    stab=WebRtcSpl_LevinsonW32_JSK(corrlo2QQ, a_LOQ11, k_vecloQ15, ORDERLO);
-
-    if (stab<0) {  // If unstable use lower order
-      a_LOQ11[0]=2048;
-      for (n = 1; n <= ORDERLO; n++) {
-        a_LOQ11[n]=0;
-      }
-
-      stab=WebRtcSpl_LevinsonW32_JSK(corrlo2QQ, a_LOQ11, k_vecloQ15, 8);
-    }
-
-
-    WebRtcSpl_LevinsonDurbin(corrhiQQ,  a_HIQ12,  k_vechiQ15, ORDERHI);
-
-    /* bandwidth expansion */
-    for (n = 1; n <= ORDERLO; n++) {
-      a_LOQ11[n] = (int16_t)((kPolyVecLo[n - 1] * a_LOQ11[n] + (1 << 14)) >>
-          15);
-    }
-
-
-    polyHI[0] = a_HIQ12[0];
-    for (n = 1; n <= ORDERHI; n++) {
-      a_HIQ12[n] = (int16_t)(((int32_t)(kPolyVecHi[n - 1] * a_HIQ12[n]) +
-        (1 << 14)) >> 15);
-      polyHI[n] = a_HIQ12[n];
-    }
-
-    /* Normalize the corrlo2 vector */
-    sh = WebRtcSpl_NormW32(corrlo2QQ[0]);
-    for (n = 0; n <= ORDERLO; n++) {
-      corrlo2QQ[n] <<= sh;
-    }
-    QdomLO += sh; /* Now, corrlo2QQ is still in Q(QdomLO) */
-
-
-    /* residual energy */
-
-    sh_lo = 31;
-    res_nrgQQ = WebRtcIsacfix_CalculateResidualEnergy(ORDERLO, QdomLO,
-        kShiftLowerBand, a_LOQ11, corrlo2QQ, &sh_lo);
-
-    /* Convert to reflection coefficients */
-    WebRtcSpl_AToK_JSK(a_LOQ11, ORDERLO, rcQ15_lo);
-
-    if (sh_lo & 0x0001) {
-      res_nrgQQ >>= 1;
-      sh_lo-=1;
-    }
-
-
-    if( res_nrgQQ > 0 )
-    {
-      sqrt_nrg=WebRtcSpl_Sqrt(res_nrgQQ);
-
-      /* add hearing threshold and compute the gain */
-      /* lo_coeff = varscale * S_N_R / (sqrt_nrg + varscale * H_T_H); */
-
-      tmp32a = varscaleQ14 >> 1;  // H_T_HQ19=65536 (16-17=-1)
-      ssh = sh_lo >> 1;  // sqrt_nrg is in Qssh.
-      sh = ssh - 14;
-      tmp32b = WEBRTC_SPL_SHIFT_W32(tmp32a, sh); // Q14->Qssh
-      tmp32c = sqrt_nrg + tmp32b;  // Qssh  (denominator)
-      tmp32a = varscaleQ14 * snrq;  // Q24 (numerator)
-
-      sh = WebRtcSpl_NormW32(tmp32c);
-      shft = 16 - sh;
-      tmp16a = (int16_t) WEBRTC_SPL_SHIFT_W32(tmp32c, -shft); // Q(ssh-shft)  (denominator)
-
-      tmp32b = WebRtcSpl_DivW32W16(tmp32a, tmp16a); // Q(24-ssh+shft)
-      sh = ssh-shft-7;
-      *gain_lo_hiQ17 = WEBRTC_SPL_SHIFT_W32(tmp32b, sh);  // Gains in Q17
-    }
-    else
-    {
-      *gain_lo_hiQ17 = 100;  // Gains in Q17
-    }
-    gain_lo_hiQ17++;
-
-    /* copy coefficients to output array */
-    for (n = 0; n < ORDERLO; n++) {
-      *lo_coeffQ15 = (int16_t) (rcQ15_lo[n]);
-      lo_coeffQ15++;
-    }
-    /* residual energy */
-    sh_hi = 31;
-    res_nrgQQ = WebRtcIsacfix_CalculateResidualEnergy(ORDERHI, QdomHI,
-        kShiftHigherBand, a_HIQ12, corrhiQQ, &sh_hi);
-
-    /* Convert to reflection coefficients */
-    WebRtcSpl_LpcToReflCoef(polyHI, ORDERHI, rcQ15_hi);
-
-    if (sh_hi & 0x0001) {
-      res_nrgQQ >>= 1;
-      sh_hi-=1;
-    }
-
-
-    if( res_nrgQQ > 0 )
-    {
-      sqrt_nrg=WebRtcSpl_Sqrt(res_nrgQQ);
-
-
-      /* add hearing threshold and compute the gain */
-      /* hi_coeff = varscale * S_N_R / (sqrt_nrg + varscale * H_T_H); */
-
-      tmp32a = varscaleQ14 >> 1;  // H_T_HQ19=65536 (16-17=-1)
-
-      ssh = sh_hi >> 1;  // |sqrt_nrg| is in Qssh.
-      sh = ssh - 14;
-      tmp32b = WEBRTC_SPL_SHIFT_W32(tmp32a, sh); // Q14->Qssh
-      tmp32c = sqrt_nrg + tmp32b;  // Qssh  (denominator)
-      tmp32a = varscaleQ14 * snrq;  // Q24 (numerator)
-
-      sh = WebRtcSpl_NormW32(tmp32c);
-      shft = 16 - sh;
-      tmp16a = (int16_t) WEBRTC_SPL_SHIFT_W32(tmp32c, -shft); // Q(ssh-shft)  (denominator)
-
-      tmp32b = WebRtcSpl_DivW32W16(tmp32a, tmp16a); // Q(24-ssh+shft)
-      sh = ssh-shft-7;
-      *gain_lo_hiQ17 = WEBRTC_SPL_SHIFT_W32(tmp32b, sh);  // Gains in Q17
-    }
-    else
-    {
-      *gain_lo_hiQ17 = 100;  // Gains in Q17
-    }
-    gain_lo_hiQ17++;
-
-
-    /* copy coefficients to output array */
-    for (n = 0; n < ORDERHI; n++) {
-      *hi_coeffQ15 = rcQ15_hi[n];
-      hi_coeffQ15++;
-    }
-  }
-}
diff --git a/modules/audio_coding/codecs/isac/fix/source/lpc_masking_model.h b/modules/audio_coding/codecs/isac/fix/source/lpc_masking_model.h
deleted file mode 100644
index aac9275..0000000
--- a/modules/audio_coding/codecs/isac/fix/source/lpc_masking_model.h
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- *  Copyright (c) 2012 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.
- */
-
-/*
- * lpc_masking_model.h
- *
- * LPC functions
- *
- */
-
-#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_FIX_SOURCE_LPC_MASKING_MODEL_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_FIX_SOURCE_LPC_MASKING_MODEL_H_
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include "structs.h"
-
-void WebRtcIsacfix_GetVars(const int16_t *input,
-                           const int16_t *pitchGains_Q12,
-                           uint32_t *oldEnergy,
-                           int16_t *varscale);
-
-void WebRtcIsacfix_GetLpcCoef(int16_t *inLoQ0,
-                              int16_t *inHiQ0,
-                              MaskFiltstr_enc *maskdata,
-                              int16_t snrQ10,
-                              const int16_t *pitchGains_Q12,
-                              int32_t *gain_lo_hiQ17,
-                              int16_t *lo_coeffQ15,
-                              int16_t *hi_coeffQ15);
-
-typedef int32_t (*CalculateResidualEnergy)(int lpc_order,
-                                           int32_t q_val_corr,
-                                           int q_val_polynomial,
-                                           int16_t* a_polynomial,
-                                           int32_t* corr_coeffs,
-                                           int* q_val_residual_energy);
-extern CalculateResidualEnergy WebRtcIsacfix_CalculateResidualEnergy;
-
-int32_t WebRtcIsacfix_CalculateResidualEnergyC(int lpc_order,
-                                               int32_t q_val_corr,
-                                               int q_val_polynomial,
-                                               int16_t* a_polynomial,
-                                               int32_t* corr_coeffs,
-                                               int* q_val_residual_energy);
-
-#if defined(MIPS_DSP_R2_LE)
-int32_t WebRtcIsacfix_CalculateResidualEnergyMIPS(int lpc_order,
-                                                  int32_t q_val_corr,
-                                                  int q_val_polynomial,
-                                                  int16_t* a_polynomial,
-                                                  int32_t* corr_coeffs,
-                                                  int* q_val_residual_energy);
-#endif
-
-#ifdef __cplusplus
-} /* extern "C" */
-#endif
-
-#endif /* WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_FIX_SOURCE_LPC_MASKING_MODEL_H_ */
diff --git a/modules/audio_coding/codecs/isac/fix/source/lpc_masking_model_mips.c b/modules/audio_coding/codecs/isac/fix/source/lpc_masking_model_mips.c
deleted file mode 100644
index 55602b9..0000000
--- a/modules/audio_coding/codecs/isac/fix/source/lpc_masking_model_mips.c
+++ /dev/null
@@ -1,237 +0,0 @@
-/*
- *  Copyright (c) 2014 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/codecs/isac/fix/source/lpc_masking_model.h"
-
-// MIPS DSPR2 optimization for function WebRtcIsacfix_CalculateResidualEnergy
-// Bit-exact with WebRtcIsacfix_CalculateResidualEnergyC from file
-// lpc_masking_model.c
-int32_t WebRtcIsacfix_CalculateResidualEnergyMIPS(int lpc_order,
-                                                  int32_t q_val_corr,
-                                                  int q_val_polynomial,
-                                                  int16_t* a_polynomial,
-                                                  int32_t* corr_coeffs,
-                                                  int* q_val_residual_energy) {
-
-  int i = 0, j = 0;
-  int shift_internal = 0, shift_norm = 0;
-  int32_t tmp32 = 0, word32_high = 0, word32_low = 0, residual_energy = 0;
-  int32_t tmp_corr_c = corr_coeffs[0];
-  int16_t* tmp_a_poly = &a_polynomial[0];
-  int32_t sum64_hi = 0;
-  int32_t sum64_lo = 0;
-
-  for (j = 0; j <= lpc_order; j++) {
-    // For the case of i == 0:
-    //   residual_energy +=
-    //     a_polynomial[j] * corr_coeffs[i] * a_polynomial[j - i];
-
-    int32_t tmp2, tmp3;
-    int16_t sign_1;
-    int16_t sign_2;
-    int16_t sign_3;
-
-    __asm __volatile (
-      ".set      push                                                \n\t"
-      ".set      noreorder                                           \n\t"
-      "lh        %[tmp2],         0(%[tmp_a_poly])                   \n\t"
-      "mul       %[tmp32],        %[tmp2],            %[tmp2]        \n\t"
-      "addiu     %[tmp_a_poly],   %[tmp_a_poly],      2              \n\t"
-      "sra       %[sign_2],       %[sum64_hi],        31             \n\t"
-      "mult      $ac0,            %[tmp32],           %[tmp_corr_c]  \n\t"
-      "shilov    $ac0,            %[shift_internal]                  \n\t"
-      "mfhi      %[tmp2],         $ac0                               \n\t"
-      "mflo      %[tmp3],         $ac0                               \n\t"
-      "sra       %[sign_1],       %[tmp2],            31             \n\t"
-      "xor       %[sign_3],       %[sign_1],          %[sign_2]      \n\t"
-      ".set      pop                                                 \n\t"
-      : [tmp2] "=&r" (tmp2), [tmp3] "=&r" (tmp3), [tmp32] "=&r" (tmp32),
-        [tmp_a_poly] "+r" (tmp_a_poly), [sign_1] "=&r" (sign_1),
-        [sign_3] "=&r" (sign_3), [sign_2] "=&r" (sign_2),
-        [sum64_hi] "+r" (sum64_hi), [sum64_lo] "+r" (sum64_lo)
-      : [tmp_corr_c] "r" (tmp_corr_c), [shift_internal] "r" (shift_internal)
-      : "hi", "lo", "memory"
-    );
-
-    if (sign_3 != 0) {
-      __asm __volatile (
-        ".set      push                                      \n\t"
-        ".set      noreorder                                 \n\t"
-        "addsc     %[sum64_lo],   %[sum64_lo],    %[tmp3]    \n\t"
-        "addwc     %[sum64_hi],   %[sum64_hi],    %[tmp2]    \n\t"
-        ".set      pop                                       \n\t"
-        : [sum64_hi] "+r" (sum64_hi), [sum64_lo] "+r" (sum64_lo)
-        : [tmp2] "r" (tmp2), [tmp3] "r" (tmp3)
-        : "hi", "lo", "memory"
-      );
-    } else {
-      if (((!(sign_1 || sign_2)) && (0x7FFFFFFF - sum64_hi < tmp2)) ||
-          ((sign_1 && sign_2) && (sum64_hi + tmp2 > 0))) {
-        // Shift right for overflow.
-        __asm __volatile (
-          ".set      push                                             \n\t"
-          ".set      noreorder                                        \n\t"
-          "addiu     %[shift_internal], %[shift_internal],  1         \n\t"
-          "prepend   %[sum64_lo],       %[sum64_hi],        1         \n\t"
-          "sra       %[sum64_hi],       %[sum64_hi],        1         \n\t"
-          "prepend   %[tmp3],           %[tmp2],            1         \n\t"
-          "sra       %[tmp2],           %[tmp2],            1         \n\t"
-          "addsc     %[sum64_lo],       %[sum64_lo],        %[tmp3]   \n\t"
-          "addwc     %[sum64_hi],       %[sum64_hi],        %[tmp2]   \n\t"
-          ".set      pop                                              \n\t"
-          : [tmp2] "+r" (tmp2), [tmp3] "+r" (tmp3),
-            [shift_internal] "+r" (shift_internal),
-            [sum64_hi] "+r" (sum64_hi), [sum64_lo] "+r" (sum64_lo)
-          :
-          : "hi", "lo", "memory"
-        );
-      } else {
-        __asm __volatile (
-          ".set      push                                      \n\t"
-          ".set      noreorder                                 \n\t"
-          "addsc     %[sum64_lo],   %[sum64_lo],    %[tmp3]    \n\t"
-          "addwc     %[sum64_hi],   %[sum64_hi],    %[tmp2]    \n\t"
-          ".set      pop                                       \n\t"
-          : [sum64_hi] "+r" (sum64_hi), [sum64_lo] "+r" (sum64_lo)
-          : [tmp2] "r" (tmp2), [tmp3] "r" (tmp3)
-          : "hi", "lo", "memory"
-        );
-      }
-    }
-  }
-
-  for (i = 1; i <= lpc_order; i++) {
-    tmp_corr_c = corr_coeffs[i];
-    int16_t* tmp_a_poly_j = &a_polynomial[i];
-    int16_t* tmp_a_poly_j_i = &a_polynomial[0];
-    for (j = i; j <= lpc_order; j++) {
-      // For the case of i = 1 .. lpc_order:
-      //   residual_energy +=
-      //     a_polynomial[j] * corr_coeffs[i] * a_polynomial[j - i] * 2;
-
-      int32_t tmp2, tmp3;
-      int16_t sign_1;
-      int16_t sign_2;
-      int16_t sign_3;
-
-      __asm __volatile (
-        ".set      push                                                   \n\t"
-        ".set      noreorder                                              \n\t"
-        "lh        %[tmp3],           0(%[tmp_a_poly_j])                  \n\t"
-        "lh        %[tmp2],           0(%[tmp_a_poly_j_i])                \n\t"
-        "addiu     %[tmp_a_poly_j],   %[tmp_a_poly_j],    2               \n\t"
-        "addiu     %[tmp_a_poly_j_i], %[tmp_a_poly_j_i],  2               \n\t"
-        "mul       %[tmp32],          %[tmp3],            %[tmp2]         \n\t"
-        "sll       %[tmp32],          %[tmp32],           1               \n\t"
-        "mult      $ac0,              %[tmp32],           %[tmp_corr_c]   \n\t"
-        "shilov    $ac0,              %[shift_internal]                   \n\t"
-        "mfhi      %[tmp2],           $ac0                                \n\t"
-        "mflo      %[tmp3],           $ac0                                \n\t"
-        "sra       %[sign_1],         %[tmp2],            31              \n\t"
-        "sra       %[sign_2],         %[sum64_hi],        31              \n\t"
-        "xor       %[sign_3],         %[sign_1],          %[sign_2]       \n\t"
-        ".set      pop                                                    \n\t"
-        : [tmp2] "=&r" (tmp2), [tmp3] "=&r" (tmp3), [tmp32] "=&r" (tmp32),
-          [tmp_a_poly_j] "+r" (tmp_a_poly_j), [sign_1] "=&r" (sign_1),
-          [tmp_a_poly_j_i] "+r" (tmp_a_poly_j_i), [sign_2] "=&r" (sign_2),
-          [sign_3] "=&r" (sign_3), [sum64_hi] "+r" (sum64_hi),
-          [sum64_lo] "+r" (sum64_lo)
-        : [tmp_corr_c] "r" (tmp_corr_c), [shift_internal] "r" (shift_internal)
-        : "hi", "lo", "memory"
-      );
-      if (sign_3 != 0) {
-        __asm __volatile (
-          ".set      push                                     \n\t"
-          ".set      noreorder                                \n\t"
-          "addsc     %[sum64_lo],   %[sum64_lo],   %[tmp3]    \n\t"
-          "addwc     %[sum64_hi],   %[sum64_hi],   %[tmp2]    \n\t"
-          ".set      pop                                      \n\t"
-          : [tmp2] "+r" (tmp2), [tmp3] "+r" (tmp3), [sum64_hi] "+r" (sum64_hi),
-            [sum64_lo] "+r" (sum64_lo)
-          :
-          :"memory"
-        );
-      } else {
-        // Test overflow and sum the result.
-        if (((!(sign_1 || sign_2)) && (0x7FFFFFFF - sum64_hi < tmp2)) ||
-            ((sign_1 && sign_2) && (sum64_hi + tmp2 > 0))) {
-          // Shift right for overflow.
-          __asm __volatile (
-            ".set      push                                              \n\t"
-            ".set      noreorder                                         \n\t"
-            "addiu     %[shift_internal],  %[shift_internal],  1         \n\t"
-            "prepend   %[sum64_lo],        %[sum64_hi],        1         \n\t"
-            "sra       %[sum64_hi],        %[sum64_hi],        1         \n\t"
-            "prepend   %[tmp3],            %[tmp2],            1         \n\t"
-            "sra       %[tmp2],            %[tmp2],            1         \n\t"
-            "addsc     %[sum64_lo],        %[sum64_lo],        %[tmp3]   \n\t"
-            "addwc     %[sum64_hi],        %[sum64_hi],        %[tmp2]   \n\t"
-            ".set      pop                                               \n\t"
-            : [tmp2] "+r" (tmp2), [tmp3] "+r" (tmp3),
-              [shift_internal] "+r" (shift_internal),
-              [sum64_hi] "+r" (sum64_hi), [sum64_lo] "+r" (sum64_lo)
-            :
-            : "hi", "lo", "memory"
-          );
-        } else {
-          __asm __volatile (
-            ".set      push                                      \n\t"
-            ".set      noreorder                                 \n\t"
-            "addsc     %[sum64_lo],    %[sum64_lo],   %[tmp3]    \n\t"
-            "addwc     %[sum64_hi],    %[sum64_hi],   %[tmp2]    \n\t"
-            ".set      pop                                       \n\t"
-            : [tmp2] "+r" (tmp2), [tmp3] "+r" (tmp3),
-              [sum64_hi] "+r" (sum64_hi), [sum64_lo] "+r" (sum64_lo)
-            :
-            : "hi", "lo", "memory"
-          );
-        }
-      }
-    }
-  }
-  word32_high = sum64_hi;
-  word32_low = sum64_lo;
-
-  // Calculate the value of shifting (shift_norm) for the 64-bit sum.
-  if (word32_high != 0) {
-    shift_norm = 32 - WebRtcSpl_NormW32(word32_high);
-    int tmp1;
-    __asm __volatile (
-      ".set    push                                                     \n\t"
-      ".set    noreorder                                                \n\t"
-      "srl     %[residual_energy],  %[sum64_lo],         %[shift_norm]  \n\t"
-      "li      %[tmp1],             32                                  \n\t"
-      "subu    %[tmp1],             %[tmp1],             %[shift_norm]  \n\t"
-      "sll     %[tmp1],             %[sum64_hi],         %[tmp1]        \n\t"
-      "or      %[residual_energy],  %[residual_energy],  %[tmp1]        \n\t"
-      ".set    pop                                                      \n\t"
-      : [residual_energy] "=&r" (residual_energy), [tmp1]"=&r"(tmp1),
-        [sum64_hi] "+r" (sum64_hi), [sum64_lo] "+r" (sum64_lo)
-      : [shift_norm] "r" (shift_norm)
-      : "memory"
-    );
-  } else {
-    if ((word32_low & 0x80000000) != 0) {
-      shift_norm = 1;
-      residual_energy = (uint32_t)word32_low >> 1;
-    } else {
-      shift_norm = WebRtcSpl_NormW32(word32_low);
-      residual_energy = word32_low << shift_norm;
-      shift_norm = -shift_norm;
-    }
-  }
-
-  // Q(q_val_polynomial * 2) * Q(q_val_corr) >> shift_internal >> shift_norm
-  //   = Q(q_val_corr - shift_internal - shift_norm + q_val_polynomial * 2)
-  *q_val_residual_energy =
-      q_val_corr - shift_internal - shift_norm + q_val_polynomial * 2;
-
-  return residual_energy;
-}
diff --git a/modules/audio_coding/codecs/isac/fix/source/lpc_masking_model_unittest.cc b/modules/audio_coding/codecs/isac/fix/source/lpc_masking_model_unittest.cc
deleted file mode 100644
index a81814d..0000000
--- a/modules/audio_coding/codecs/isac/fix/source/lpc_masking_model_unittest.cc
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- *  Copyright (c) 2012 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/codecs/isac/fix/source/lpc_masking_model.h"
-#include "webrtc/system_wrappers/include/cpu_features_wrapper.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/typedefs.h"
-
-class LpcMaskingModelTest : public testing::Test {
- protected:
-  // Pass a function pointer to the Tester function.
-  void CalculateResidualEnergyTester(CalculateResidualEnergy
-                                     CalculateResidualEnergyFunction) {
-    const int kIntOrder = 10;
-    const int32_t kInt32QDomain = 5;
-    const int kIntShift = 11;
-    int16_t a[kIntOrder + 1] = {32760, 122, 7, 0, -32760, -3958,
-        -48, 18745, 498, 9, 23456};
-    int32_t corr[kIntOrder + 1] = {11443647, -27495, 0,
-        98745, -11443600, 1, 1, 498, 9, 888, 23456};
-    int q_shift_residual = 0;
-    int32_t residual_energy = 0;
-
-    // Test the code path where (residual_energy >= 0x10000).
-    residual_energy = CalculateResidualEnergyFunction(kIntOrder,
-        kInt32QDomain, kIntShift, a, corr, &q_shift_residual);
-    EXPECT_EQ(1789023310, residual_energy);
-    EXPECT_EQ(2, q_shift_residual);
-
-    // Test the code path where (residual_energy < 0x10000)
-    // and ((energy & 0x8000) != 0).
-    for (int i = 0; i < kIntOrder + 1; i++) {
-      a[i] = 24575 >> i;
-      corr[i] = i;
-    }
-    residual_energy = CalculateResidualEnergyFunction(kIntOrder,
-        kInt32QDomain, kIntShift, a, corr, &q_shift_residual);
-    EXPECT_EQ(1595279092, residual_energy);
-    EXPECT_EQ(26, q_shift_residual);
-
-    // Test the code path where (residual_energy <= 0x7fff).
-    for (int i = 0; i < kIntOrder + 1; i++) {
-      a[i] = 2457 >> i;
-    }
-    residual_energy = CalculateResidualEnergyFunction(kIntOrder,
-        kInt32QDomain, kIntShift, a, corr, &q_shift_residual);
-    EXPECT_EQ(2029266944, residual_energy);
-    EXPECT_EQ(33, q_shift_residual);
-  }
-};
-
-TEST_F(LpcMaskingModelTest, CalculateResidualEnergyTest) {
-  CalculateResidualEnergyTester(WebRtcIsacfix_CalculateResidualEnergyC);
-}
diff --git a/modules/audio_coding/codecs/isac/fix/source/lpc_tables.c b/modules/audio_coding/codecs/isac/fix/source/lpc_tables.c
deleted file mode 100644
index bc0f129..0000000
--- a/modules/audio_coding/codecs/isac/fix/source/lpc_tables.c
+++ /dev/null
@@ -1,1280 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/*
- * lpc_tables.c
- *
- * Coding tables for the KLT coefficients
- *
- */
-
-
-#include "settings.h"
-#include "lpc_tables.h"
-
-/* indices of KLT coefficients used */
-const uint16_t WebRtcIsacfix_kSelIndGain[12] = {
-  0,  1,  2,  3,  4,  5,  6,  7,  8,  9,
-  10,  11};
-
-const uint16_t WebRtcIsacfix_kSelIndShape[108] = {
-  0,  1,  2,  3,  4,  5,  6,  7,  8,  9,
-  10,  11,  12,  13,  14,  15,  16,  17,  18,  19,
-  20,  21,  22,  23,  24,  25,  26,  27,  28,  29,
-  30,  31,  32,  33,  34,  35,  36,  37,  38,  39,
-  40,  41,  42,  43,  44,  45,  46,  47,  48,  49,
-  50,  51,  52,  53,  54,  55,  56,  57,  58,  59,
-  60,  61,  62,  63,  64,  65,  66,  67,  68,  69,
-  70,  71,  72,  73,  74,  75,  76,  77,  78,  79,
-  80,  81,  82,  83,  84,  85,  86,  87,  88,  89,
-  90,  91,  92,  93,  94,  95,  96,  97,  98,  99,
-  100,  101,  102,  103,  104,  105,  106,  107
-};
-
-/* cdf array for model indicator */
-const uint16_t WebRtcIsacfix_kModelCdf[4] = {
-  0,  15434,  37548,  65535
-};
-
-/* pointer to cdf array for model indicator */
-const uint16_t *WebRtcIsacfix_kModelCdfPtr[1] = {
-  WebRtcIsacfix_kModelCdf
-};
-
-/* initial cdf index for decoder of model indicator */
-const uint16_t WebRtcIsacfix_kModelInitIndex[1] = {
-  1
-};
-
-/* offset to go from rounded value to quantization index */
-const int16_t WebRtcIsacfix_kQuantMinGain[12] ={
-  3,  6,  4,  6,  6,  9,  5,  16,  11,  34,  32,  47
-};
-
-const int16_t WebRtcIsacfix_kQuantMinShape[108] = {
-  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,
-  1,  1,  1,  1,  2,  2,  2,  3,  0,  0,
-  0,  0,  1,  0,  0,  0,  0,  1,  1,  1,
-  1,  1,  1,  2,  2,  3,  0,  0,  0,  0,
-  1,  0,  1,  1,  1,  1,  1,  1,  1,  2,
-  2,  4,  3,  5,  0,  0,  0,  0,  1,  1,
-  1,  1,  1,  1,  2,  1,  2,  2,  3,  4,
-  4,  7,  0,  0,  1,  1,  1,  1,  1,  1,
-  1,  2,  3,  2,  3,  4,  4,  5,  7,  13,
-  0,  1,  1,  2,  3,  2,  2,  2,  4,  4,
-  5,  6,  7,  11, 9, 13, 12, 26
-};
-
-/* maximum quantization index */
-const uint16_t WebRtcIsacfix_kMaxIndGain[12] = {
-  6,  12,  8,  14,  10,  19,  12,  31,  22,  56,  52,  138
-};
-
-const uint16_t WebRtcIsacfix_kMaxIndShape[108] = {
-  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,
-  2,  2,  2,  2,  4,  4,  5,  6,  0,  0,
-  0,  0,  1,  0,  0,  0,  0,  1,  2,  2,
-  2,  2,  3,  4,  5,  7,  0,  0,  0,  0,
-  2,  0,  2,  2,  2,  2,  3,  2,  2,  4,
-  4,  6,  6,  9,  0,  0,  0,  0,  2,  2,
-  2,  2,  2,  2,  3,  2,  4,  4,  7,  7,
-  9,  13, 0,  0,  2,  2,  2,  2,  2,  2,
-  3,  4,  5,  4,  6,  8,  8, 10, 16, 25,
-  0,  2,  2,  4,  5,  4,  4,  4,  7,  8,
-  9, 10, 13, 19, 17, 23, 25, 49
-};
-
-/* index offset */
-const uint16_t WebRtcIsacfix_kOffsetGain[3][12] = {
-  { 0,  7,  20,  29,  44,  55,  75,  88,  120,  143,  200,  253},
-  { 0,  7,  19,  27,  42,  53,  73,  86,  117,  140,  197,  249},
-  { 0,  7,  20,  28,  44,  55,  75,  89,  121,  145,  202,  257}
-};
-
-const uint16_t WebRtcIsacfix_kOffsetShape[3][108] = {
-  {
-    0,  1,  2,  3,  4,  5,  6,  7,  8,  9,
-    11,  14,  17,  20,  23,  28,  33,  39,  46,  47,
-    48,  49,  50,  52,  53,  54,  55,  56,  58,  61,
-    64,  67,  70,  74,  79,  85,  93,  94,  95,  96,
-    97,  100,  101,  104,  107,  110,  113,  117,  120,  123,
-    128,  133,  140,  147,  157,  158,  159,  160,  161,  164,
-    167,  170,  173,  176,  179,  183,  186,  191,  196,  204,
-    212,  222,  236,  237,  238,  241,  244,  247,  250,  253,
-    256,  260,  265,  271,  276,  283,  292,  301,  312,  329,
-    355,  356,  359,  362,  367,  373,  378,  383,  388,  396,
-    405,  415,  426,  440,  460,  478,  502,  528
-  },
-  {
-    0,  1,  2,  3,  4,  6,  7,  8,  9,  11,
-    13,  16,  19,  22,  26,  29,  34,  39,  45,  46,
-    47,  48,  49,  50,  51,  52,  53,  55,  57,  60,
-    63,  66,  70,  73,  78,  84,  91,  92,  93,  94,
-    95,  96,  97,  99,  102,  105,  108,  111,  114,  118,
-    123,  128,  134,  141,  151,  152,  153,  154,  156,  159,
-    162,  165,  168,  171,  174,  177,  181,  186,  194,  200,
-    208,  218,  233,  234,  235,  236,  239,  242,  245,  248,
-    251,  254,  258,  263,  270,  277,  288,  297,  308,  324,
-    349,  351,  354,  357,  361,  366,  372,  378,  383,  390,
-    398,  407,  420,  431,  450,  472,  496,  524
-  },
-  {
-    0,  1,  2,  3,  4,  5,  6,  7,  8,  11,
-    14,  17,  20,  23,  26,  29,  34,  40,  47,  48,
-    49,  50,  51,  52,  53,  54,  55,  58,  61,  64,
-    67,  70,  73,  77,  82,  88,  96,  97,  98,  99,
-    101,  102,  104,  107,  110,  113,  116,  119,  122,  125,
-    129,  134,  141,  150,  160,  161,  162,  163,  166,  168,
-    171,  174,  177,  180,  183,  186,  190,  195,  201,  208,
-    216,  226,  243,  244,  245,  248,  251,  254,  257,  260,
-    263,  268,  273,  278,  284,  291,  299,  310,  323,  340,
-    366,  368,  371,  374,  379,  383,  389,  394,  399,  406,
-    414,  422,  433,  445,  461,  480,  505,  533
-  }
-};
-
-/* initial cdf index for KLT coefficients */
-const uint16_t WebRtcIsacfix_kInitIndexGain[3][12] = {
-  { 3,  6,  4,  7,  5,  10,  6,  16,  11,  28,  26,  69},
-  { 3,  6,  4,  7,  5,  10,  6,  15,  11,  28,  26,  69},
-  { 3,  6,  4,  8,  5,  10,  7,  16,  12,  28,  27,  70}
-};
-
-const uint16_t WebRtcIsacfix_kInitIndexShape[3][108] = {
-  {
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  1,
-    1,  1,  1,  1,  2,  2,  3,  3,  0,  0,
-    0,  0,  1,  0,  0,  0,  0,  1,  1,  1,
-    1,  1,  2,  2,  3,  4,  0,  0,  0,  0,
-    1,  0,  1,  1,  1,  1,  2,  1,  1,  2,
-    2,  3,  3,  5,  0,  0,  0,  0,  1,  1,
-    1,  1,  1,  1,  2,  1,  2,  2,  4,  4,
-    5,  7,  0,  0,  1,  1,  1,  1,  1,  1,
-    2,  2,  3,  2,  3,  4,  4,  5,  8,  13,
-    0,  1,  1,  2,  3,  2,  2,  2,  4,  4,
-    5,  5,  7,  10,  9,  12,  13,  25
-  },
-  {
-    0,  0,  0,  0,  1,  0,  0,  0,  1,  1,
-    1,  1,  1,  2,  1,  2,  2,  3,  0,  0,
-    0,  0,  0,  0,  0,  0,  1,  1,  1,  1,
-    1,  2,  1,  2,  3,  3,  0,  0,  0,  0,
-    0,  0,  1,  1,  1,  1,  1,  1,  2,  2,
-    2,  3,  3,  5,  0,  0,  0,  1,  1,  1,
-    1,  1,  1,  1,  1,  2,  2,  4,  3,  4,
-    5,  7,  0,  0,  0,  1,  1,  1,  1,  1,
-    1,  2,  2,  3,  3,  5,  4,  5,  8,  12,
-    1,  1,  1,  2,  2,  3,  3,  2,  3,  4,
-    4,  6,  5,  9,  11,  12,  14,  25
-  },
-  {
-    0,  0,  0,  0,  0,  0,  0,  0,  1,  1,
-    1,  1,  1,  1,  1,  2,  3,  3,  0,  0,
-    0,  0,  0,  0,  0,  0,  1,  1,  1,  1,
-    1,  1,  2,  2,  3,  4,  0,  0,  0,  1,
-    0,  1,  1,  1,  1,  1,  1,  1,  1,  2,
-    2,  3,  4,  5,  0,  0,  0,  1,  1,  1,
-    1,  1,  1,  1,  1,  2,  2,  3,  3,  4,
-    5,  8,  0,  0,  1,  1,  1,  1,  1,  1,
-    2,  2,  2,  3,  3,  4,  5,  6,  8,  13,
-    1,  1,  1,  2,  2,  3,  2,  2,  3,  4,
-    4,  5,  6,  8,  9,  12,  14,  25
-  }
-};
-
-/* offsets for quantizer representation levels*/
-const uint16_t WebRtcIsacfix_kOfLevelsGain[3] = {
-  0,  392,  779
-};
-
-const uint16_t WebRtcIsacfix_kOfLevelsShape[3] = {
-  0,  578,  1152
-};
-
-/* quantizer representation levels */
-
-
-
-const int32_t WebRtcIsacfix_kLevelsGainQ17[1176] = {
-  -364547,-231664,-102123,-573,104807,238257,368823,-758583,-640135,-510291
-  ,-377662,-252785,-113177,2627,112906,248601,389461,522691,644517,763974
-  ,-538963,-368179,-245823,-106095,-890,104299,241111,350730,493190,-800763
-  ,-646230,-510239,-382115,-248623,-111829,-2983,113852,251105,388114,519757
-  ,644048,774712,896334,1057931,-770009,-635310,-503690,-375087,-248106,-108525
-  ,-105,108259,243472,377948,519271,-1160885,-1032044,-914636,-777593,-647891
-  ,-518408,-388028,-254321,-115293,-598,117849,251296,385367,515510,652727
-  ,777432,920363,1038625,1153637,1316836,-632287,-505430,-379430,-248458,-118013
-  ,-888,118762,250266,381650,513327,652169,766471,932113,-2107480,-1971030
-  ,-1827020,-1698263,-1558670,-1436314,-1305377,-1172252,-1047355,-914202,-779651,-651001
-  ,-520999,-390394,-255761,-123490,-1893,126839,256703,385493,518607,651760
-  ,782750,908693,1044131,1163865,1311066,1424177,1582628,1709823,1831740,1955391
-  ,-1423044,-1288917,-1181281,-1043222,-911770,-780354,-646799,-522664,-386721,-258266
-  ,-128060,-1101,128233,259996,390336,519590,649290,778701,908010,1040796
-  ,1161235,1306889,1441882,-4446002,-4301031,-4194304,-4080591,-3947740,-3808975,-3686530
-  ,-3567839,-3383251,-3287089,-3136577,-3017405,-2869860,-2751321,-2619984,-2482932,-2354790
-  ,-2223147,-2090669,-1964135,-1831208,-1706697,-1570817,-1446008,-1305386,-1175773,-1046066
-  ,-915356,-785120,-653614,-524331,-393767,-260442,-130187,-799,128841,261466
-  ,393616,520542,652117,784613,914159,1045399,1181072,1308971,1442502,1570346
-  ,1693912,1843986,1966014,2090474,2224869,2364593,2475934,2628403,2752512,2856640
-  ,-4192441,-4063232,-3917821,-3799195,-3666233,-3519199,-3411021,-3269192,-3135684,-3008826
-  ,-2880875,-2747342,-2620981,-2494872,-2354979,-2229718,-2098939,-1964971,-1835399,-1703452
-  ,-1572806,-1440482,-1311794,-1179338,-1046521,-919823,-785914,-655335,-523416,-395507
-  ,-264833,-132184,-2546,131698,256217,391372,522688,651248,789964,909618
-  ,1035305,1179145,1313824,1436934,1552353,1693722,1815508,1972826,2096328,2228224
-  ,2359296,2490368,2598848,-6160384,-6029312,-5881382,-5767168,-5636096,-5505024,-5373952
-  ,-5228418,-5110384,-4954923,-4880576,-4710990,-4587364,-4471340,-4333905,-4211513,-4051293
-  ,-3907927,-3800105,-3675961,-3538640,-3413663,-3271148,-3152105,-3019103,-2869647,-2744015
-  ,-2620639,-2479385,-2364211,-2227611,-2095427,-1974497,-1834168,-1703561,-1568961,-1439826
-  ,-1309192,-1174050,-1050191,-917836,-786015,-656943,-518934,-394831,-257708,-128041
-  ,1610,128991,264442,393977,521383,653849,788164,918641,1049122,1181971
-  ,1308934,1439505,1571808,1706305,1836318,1966235,2097269,2228990,2357005,2490292
-  ,2617400,2749680,2881234,3014880,3145637,3276467,3409099,3536637,3671493,3802918
-  ,3929740,4065036,4194143,4325999,4456126,4586857,4717194,4843923,4978676,5110913
-  ,5245281,5371394,5499780,5633779,5762611,5897682,6028688,6167546,6296465,6421682
-  ,6548882,6682074,6809432,6941956,7078143,7204509,7334296,7475137,7609896,7732044
-  ,7861604,8002039,8131670,8259222,8390299,8522399,8650037,8782348,8908402,9037815
-  ,9164594,9300338,9434679,9574500,9699702,9833934,9948152,10083972,10244937,10332822
-  ,10485760,10600122,10760754,10892964,11010048,11111004,11272192,11403264,11525091,11624984
-  ,11796480,11915146,-393216,-262144,-101702,-740,100568,262144,393216,-786432
-  ,-655360,-524288,-383907,-243301,-94956,-156,95547,269629,416691,524288
-  ,655360,-393216,-262144,-88448,-37,87318,262144,393216,524288,-917504
-  ,-786432,-655360,-495894,-373308,-267503,-93211,4119,91308,250895,393216
-  ,526138,655360,786432,917504,-786432,-655360,-524288,-393216,-262144,-83497
-  ,222,86893,240922,393216,524288,-1048576,-917504,-790472,-655360,-508639
-  ,-383609,-262016,-95550,-3775,96692,256797,364847,534906,655360,786432
-  ,889679,1048576,1179648,1310720,1441792,-655360,-524288,-377684,-248408,-93690
-  ,1261,95441,227519,393216,524288,655360,786432,917504,-2097152,-1966080
-  ,-1809470,-1703936,-1572864,-1441792,-1314289,-1195149,-1056205,-917504,-809951,-657769
-  ,-521072,-383788,-248747,-106350,-2944,105550,243408,388548,521064,628732
-  ,786432,885456,1064548,1179648,1310720,1441792,1572864,1703936,1835008,-1441792
-  ,-1310720,-1179648,-1037570,-888492,-767774,-646634,-519935,-373458,-248029,-111915
-  ,760,111232,247735,379432,507672,672699,786432,917504,1048576,1179648
-  ,1310720,1441792,-4456448,-4325376,-4194304,-4063232,-3932160,-3801088,-3670016,-3538944
-  ,-3407872,-3276800,-3145728,-3014656,-2883584,-2752512,-2647002,-2490368,-2359296,-2228224
-  ,-2097152,-1951753,-1835008,-1703936,-1594177,-1462001,-1289150,-1160774,-1025917,-924928
-  ,-782509,-641294,-516191,-386630,-251910,-118886,5210,121226,253949,386008
-  ,517973,649374,780064,917783,1052462,1183856,1290593,1419389,1556641,1699884
-  ,1835008,1988314,2090470,2228224,2359296,2490368,2621440,2752512,2883584,-3801088
-  ,-3643514,-3539937,-3409931,-3263294,-3145658,-3012952,-2879230,-2752359,-2622556,-2483471
-  ,-2357556,-2226500,-2093112,-1965892,-1833664,-1701035,-1567767,-1440320,-1310556,-1178339
-  ,-1049625,-916812,-786477,-655277,-525050,-393773,-264828,-130696,-480,132126
-  ,260116,394197,527846,652294,785563,917183,1049511,1175958,1308161,1438759
-  ,1572253,1698835,1828535,1967072,2089391,2212798,2348901,2461547,2621440,2752512
-  ,2883584,-7309870,-7203780,-7062699,-6939106,-6790819,-6672036,-6553600,-6422317,-6288422
-  ,-6164694,-6026456,-5901410,-5754168,-5621459,-5502710,-5369686,-5240454,-5120712,-4976140
-  ,-4847970,-4723070,-4589083,-4450923,-4324680,-4189892,-4065551,-3931803,-3800209,-3668539
-  ,-3539395,-3404801,-3277470,-3141389,-3016710,-2885724,-2752612,-2618541,-2486762,-2354153
-  ,-2225059,-2094984,-1968194,-1830895,-1699508,-1575743,-1444516,-1308683,-1179714,-1053088
-  ,-917981,-783707,-653900,-524980,-395409,-260309,-131948,-3452,132113,263241
-  ,392185,522597,654134,788288,919810,1045795,1179210,1314201,1444235,1574447
-  ,1705193,1834009,1967332,2098102,2229019,2359147,2489859,2619878,2754966,2879671
-  ,3014438,3146143,3276733,3405958,3542196,3667493,3798815,3932961,4062458,4187125
-  ,4322346,4454875,4587752,4716809,4848274,4975027,5111957,5242215,5373085,5501158
-  ,5640140,5762918,5895358,6024008,6157906,6290628,6422713,6546339,6675888,6815606
-  ,6955288,7077501,7211630,7337893,7473635,7607175,7728310,7866475,7999658,8127888
-  ,8241758,8386483,8522550,8641582,8771915,8922139,9038632,9179385,9313426,9437184
-  ,9568256,9699328,9830400,9952933,10120004,10223616,10354688,10474645,10616832,-393216
-  ,-262144,-85425,-121,82533,262144,393216,-786432,-655360,-524288,-379928
-  ,-222821,-95200,287,95541,227093,393216,493567,655360,786432,-393216
-  ,-262144,-86805,510,86722,262144,393216,524288,-1048576,-917504,-786432
-  ,-624456,-529951,-395071,-241627,-101168,81,99975,241605,393216,524288
-  ,655360,786432,917504,-786432,-655360,-524288,-393216,-230359,-95619,-137
-  ,94425,226222,393216,524288,-1179648,-1048576,-917504,-773841,-655360,-492258
-  ,-379715,-244707,-103621,-434,104523,242680,381575,523659,650565,786432
-  ,917504,1048576,1179648,1310720,-786432,-629344,-524288,-376757,-242858,-101932
-  ,-2715,107155,239212,366480,514943,655360,786432,917504,-2228224,-2097152
-  ,-1966080,-1835008,-1703936,-1572864,-1441792,-1284584,-1179648,-1048819,-934658,-777181
-  ,-626371,-515660,-377493,-248975,-113036,436,113584,248354,379718,512475
-  ,653932,796494,917504,1048576,1179648,1310720,1441792,1572864,1703936,1835008
-  ,-1572864,-1441792,-1297608,-1161159,-1032316,-917092,-779770,-647384,-515529,-384269
-  ,-250003,-119252,1053,118111,249512,380545,512039,648101,770656,907003
-  ,1021725,1178082,1310720,1441792,-4587520,-4456448,-4325376,-4194304,-4063232,-3932160
-  ,-3801088,-3670016,-3538944,-3407872,-3276800,-3145728,-2999335,-2883584,-2752512,-2621440
-  ,-2490368,-2359296,-2228224,-2112691,-1966080,-1848781,-1709830,-1566109,-1438427,-1303530
-  ,-1176124,-1040936,-913876,-784585,-652025,-518361,-385267,-256342,-127297,-2733
-  ,125422,257792,389363,519911,651106,783805,909407,1044143,1174156,1309267
-  ,1436173,1553771,1708958,1814083,1967036,2095386,2255169,2359296,2478303,2621440
-  ,2752512,-4456448,-4325376,-4194304,-4063232,-3932160,-3797524,-3670016,-3560250,-3413217
-  ,-3257719,-3166416,-2986626,-2878000,-2781144,-2625383,-2495465,-2346792,-2230930,-2077063
-  ,-1949225,-1819274,-1697261,-1568664,-1443074,-1304302,-1175289,-1043794,-913423,-785561
-  ,-652104,-522835,-392667,-260517,-130088,-2,129509,260990,391931,522470
-  ,655770,784902,917093,1046445,1176951,1303121,1441362,1565401,1702022,1822856
-  ,1952852,2090384,2214607,2338436,2457483,2621440,-8781824,-8650752,-8519680,-8388608
-  ,-8260828,-8126464,-8003337,-7859030,-7750057,-7602176,-7471104,-7340032,-7193045,-7090588
-  ,-6946816,-6843344,-6676635,-6557575,-6447804,-6277614,-6159736,-6035729,-5884723,-5739567
-  ,-5634818,-5489867,-5372864,-5243300,-5098939,-4988639,-4856258,-4728494,-4591717,-4447428
-  ,-4322409,-4192918,-4062638,-3934141,-3797545,-3673373,-3531587,-3407391,-3277404,-3147797
-  ,-3013578,-2886548,-2749811,-2616428,-2490949,-2361301,-2228482,-2096883,-1964343,-1831754
-  ,-1702201,-1572495,-1442012,-1309242,-1182451,-1048996,-916905,-786510,-657079,-524730
-  ,-393672,-261313,-128743,166,130678,261334,393287,524155,655570,786839
-  ,917353,1052167,1179013,1309360,1442634,1571153,1703961,1832027,1965014,2097912
-  ,2224861,2355341,2490455,2623051,2753484,2877015,3015783,3144157,3273705,3405255
-  ,3542006,3669580,3802417,3935413,4065088,4190896,4333521,4456355,4579781,4713832
-  ,4845707,4978625,5113278,5243817,5382318,5500592,5638135,5761179,5900822,6029270
-  ,6186398,6297816,6436435,6559163,6666389,6806548,6950461,7086078,7195777,7350973
-  ,7480132,7614852,7743514,7847288,8014762,8126464,8257536,8388608,8519680,8650752
-  ,8781824,8912896,9043968,9175040,9306112,9437184
-};
-
-
-
-const int16_t WebRtcIsacfix_kLevelsShapeQ10[1735] = {
-  0,     0,    -1,     0,     0,     1,     0,     1,     0,  -821
-  ,     1,  -763,    -1,   656,  -620,     0,   633,  -636,     4,   615
-  ,  -630,     1,   649, -1773,  -670,     5,   678,  1810, -1876,  -676
-  ,     0,   691,  1843, -1806,  -743,    -1,   749,  1795,  2920, -2872
-  , -1761,  -772,    -3,   790,  1763,  2942,     0,     0,     0,     0
-  ,  -792,     2,     0,     0,     1,     0,  -854,     0,  -702,    -1
-  ,   662,  -624,    -5,   638,  -611,    -6,   638,  -647,     0,   651
-  ,  -685,    -4,   679,  2123, -1814,  -693,     0,   664,  1791, -1735
-  ,  -737,     0,   771,  1854,  2873, -2867, -1842,  -793,    -1,   821
-  ,  1826,  2805,  3922,     0,     0,     0,    -1,  -779,     1,   786
-  ,     1,  -708,     0,   789,  -799,     1,   797,  -663,     2,   646
-  ,  -600,     3,   609,  -600,     1,   658,  1807,  -627,    -3,   612
-  ,  -625,     3,   632, -1732,  -674,     1,   672,  2048, -1768,  -715
-  ,     0,   724,  1784, -3881, -3072, -1774,  -719,    -1,   730,  1811
-  , -2963, -1829,  -806,    -1,   816,  1795,  3050, -5389, -3784, -2942
-  , -1893,  -865,   -12,   867,  1885,  2945,  3928,    -2,     1,     4
-  ,     0,  -694,     2,   665,  -598,     5,   587,  -599,    -1,   661
-  ,  -656,    -7,   611,  -607,     5,   603,  -618,    -4,   620, -1794
-  ,  -645,    -2,   654,  -655,    -1,   658, -1801,  -700,     5,   707
-  ,  1927, -1752,  -745,    -8,   752,  1843, -2838, -1781,  -801,    11
-  ,   796,  1811,  2942,  3866, -3849, -3026, -1848,  -819,     2,   827
-  ,  1825,  2963, -3873, -2904, -1869,  -910,    -6,   903,  1902,  2885
-  ,  3978,  5286, -7168, -6081, -4989, -3968, -2963, -1970,  -943,    -2
-  ,   953,  1951,  2968,  3974,  5009,  6032,    -2,     3, -1024,     2
-  ,  1024,  -637,     1,   669,  -613,    -7,   630,  -603,     4,   612
-  ,  -612,     0,   590,  -645,   -11,   627,  -657,    -2,   671,  1849
-  , -1853,  -694,     2,   702,  1838, -3304, -1780,  -736,    -8,   732
-  ,  1772, -1709,  -755,    -6,   760,  1780, -2994, -1780,  -800,     8
-  ,   819,  1830,  2816, -4096, -2822, -1881,  -851,    -4,   855,  1872
-  ,  2840,  3899, -3908, -2904, -1878,  -887,     6,   897,  1872,  2942
-  ,  4008, -4992, -3881, -2933, -1915,  -928,     1,   937,  1919,  2900
-  ,  4009,  4881, -6848, -6157, -5065, -3981, -2983, -1972,  -978,    -1
-  ,   968,  1979,  2988,  4008,  5007,  6108,  7003,  8051,  9027,-13272
-  ,-12012,-11228,-10213, -9261, -8084, -7133, -6075, -5052, -4050, -3036
-  , -2014,  -996,    -4,  1007,  2031,  3038,  4049,  5074,  6134,  7069
-  ,  8094,  9069, 10212, 11049, 12104,    51, -1024,   -13,  1024,  -609
-  ,  -107,   613, -2048,  -687,   -95,   667,  2048, -3072, -1724,  -785
-  ,   -34,   732,  1819, -2048,  -703,   -26,   681,  2048, -2048,  -686
-  ,    -9,   665,  2048, -2048,  -702,    37,   748,  1723, -4096, -2786
-  , -1844,  -837,    37,   811,  1742,  3072, -4096, -2783, -1848,  -881
-  ,    39,   898,  1843,  2792,  3764, -5120, -4096, -2923, -1833,  -852
-  ,   -14,   862,  1824,  2834,  4096, -6144, -5120, -3914, -2842, -1870
-  ,  -886,   -27,   888,  1929,  2931,  4051, -7168, -6144, -5120, -3866
-  , -2933, -1915,  -927,    64,   933,  1902,  2929,  3912,  5063,  6144
-  ,-11264,-10240, -9216, -8192, -7086, -6144, -5039, -3972, -2943, -1929
-  ,  -941,     3,   938,  1942,  2959,  3933,  4905,  6088,  6983,  8192
-  , -9216, -8192, -7202, -6088, -4983, -4019, -2955, -1975,  -966,    17
-  ,   997,  1981,  2967,  3990,  4948,  6022,  6967,  8192,-13312,-12288
-  ,-11264,-10240, -9216, -8049, -6997, -6040, -5026, -4043, -3029, -2034
-  , -1015,   -23,   984,  1997,  3010,  4038,  5002,  6015,  6946,  8061
-  ,  9216, 10240,-12381,-11264,-10240, -9060, -8058, -7153, -6085, -5075
-  , -4051, -3042, -2037, -1017,    -5,  1007,  2028,  3035,  4050,  5088
-  ,  6111,  7160,  8156,  9215, 10095, 11229, 12202, 13016,-26624,-25600
-  ,-24582,-23671,-22674,-21400,-20355,-19508,-18315,-17269,-16361,-15299
-  ,-14363,-13294,-12262,-11237,-10203, -9227, -8165, -7156, -6116, -5122
-  , -4076, -3056, -2043, -1020,    -8,  1027,  2047,  3065,  4110,  5130
-  ,  6125,  7168,  8195,  9206, 10230, 11227, 12256, 13304, 14281, 15316
-  , 16374, 17382, 18428, 19388, 20361, 21468, 22448, 23781,     0,     0
-  ,    -1,     0,    -2,  1024,     0,     0,     0,    -1,  1024, -1024
-  ,     1, -1024,     4,  1024, -1024,     2,  1024, -1024,     2,  1024
-  , -2048, -1024,    -4,  1024, -1024,     2,  1024, -2048, -1024,    -3
-  ,  1024,  2048, -2048, -1024,     4,  1024,  2048, -3072, -2048, -1024
-  ,    -1,   662,  2048,     0,     1,     0,     0,     1,    -2,    -2
-  ,     0,     2,  1024,    -1,  1024, -1024,     4,  1024, -1024,     1
-  ,  1024, -1024,     1,  1024, -2048,  -781,    -4,   844,  -807,    -5
-  ,   866, -2048,  -726,   -13,   777,  2048, -2048,  -643,    -4,   617
-  ,  2048,  3072, -3072, -2048,  -629,     1,   630,  2048,  3072,     0
-  ,    -1,     1,    -2,     2,     1, -1024,     5, -1024,     6,  1024
-  , -1024,     4,  1024, -1024,     1,  1024, -1024,    -9,  1024,  -673
-  ,    -7,   655, -2048,  -665,   -15,   716, -2048,  -647,     4,   640
-  ,  2048, -2048,  -615,    -1,   635,  2048, -2048,  -613,    10,   637
-  ,  2048,  3072, -3072, -2048,  -647,    -3,   641,  2048,  3072, -5120
-  , -4096, -3072, -2048,  -681,     6,   685,  2048,  3072,  4096,     1
-  ,     1,     0,    -1,  1024, -1024,    -3,  1024, -1024,     6,  1024
-  , -1024,    -1,   769,  -733,     0,  1024,  -876,    -2,   653, -1024
-  ,    -4,   786,  -596,   -13,   595,  -634,    -2,   638,  2048, -2048
-  ,  -620,    -5,   620,  2048, -4096, -3072, -2048,  -639,    11,   655
-  ,  2048,  3072, -3072, -2048,  -659,     5,   663,  2048, -3072, -1823
-  ,  -687,    22,   695,  2048,  3072,  4096, -4096, -3072, -1848,  -715
-  ,    -3,   727,  1816,  3072,  4096,  5120, -8192, -7168, -6144, -5120
-  , -4096, -2884, -1771,  -756,   -14,   775,  1844,  3072,  4096,  5120
-  ,  6144,    -1,     1,     0, -1024,     2,   815,  -768,     2,   708
-  , -1024,    -3,   693,  -661,    -7,   607,  -643,    -5,   609,  -624
-  ,     3,   631,  -682,    -3,   691,  2048, -2048,  -640,     5,   650
-  ,  2048, -3072, -2048,  -701,     9,   704,  2048,  3072, -3072, -2048
-  ,  -670,    10,   674,  2048,  3072, -5120, -4096, -3072, -1749,  -738
-  ,     0,   733,  1811,  3072,  4096,  5120, -4096, -3072, -1873,  -753
-  ,     0,   756,  1874,  3072,  4096, -5120, -4096, -2900, -1838,  -793
-  ,    -6,   793,  1868,  2837,  4096,  5120, -7168, -6144, -5120, -4096
-  , -2832, -1891,  -828,     1,   828,  1901,  2823,  3912,  5120,  6144
-  ,  7168,  8192,-13312,-12288,-11264,-10240, -9216, -8192, -7168, -6144
-  , -5120, -3976, -3004, -1911,  -869,     7,   869,  1932,  3024,  3992
-  ,  5009,  6144,  7168,  8192,  9216, 10240, 11264,    -4,  1024,  -629
-  ,   -22,   609,  -623,     9,   640, -2048,  -768,     1,   682, -2048
-  ,  -741,    49,   722,  2048, -3072, -1706,  -808,   -20,   768,  1750
-  , -1684,  -727,   -29,   788,  1840,  3033, -1758,  -784,     0,   801
-  ,  1702, -3072, -1813,  -814,    38,   820,  1884,  2927, -4096, -3241
-  , -1839,  -922,    25,   882,  1886,  2812, -4096, -2982, -1923,  -894
-  ,    84,   912,  1869,  2778,  4096, -4928, -3965, -2902, -1920,  -883
-  ,     3,   917,  1953,  2921,  3957,  4922,  6144,  7168, -5120, -3916
-  , -2897, -1949,  -930,    31,   959,  1934,  2901,  3851,  5120, -9216
-  , -8192, -7046, -6029, -5030, -4034, -2980, -1969, -1013,   -76,   963
-  ,  1963,  2901,  3929,  4893,  6270,  7168,  8192,  9216,-12288,-11264
-  ,-10240, -9216, -8192, -6846, -6123, -5108, -4008, -3000, -1963,  -954
-  ,    -6,   958,  1992,  3009,  4020,  5085,  6097,  7168,  8192,  9216
-  ,-11264,-10139, -9194, -8127, -7156, -6102, -5053, -4049, -3036, -2025
-  , -1009,   -34,   974,  1984,  3034,  4028,  5138,  6000,  7057,  8166
-  ,  9070, 10033, 11360, 12288,-13312,-12288,-10932,-10190, -9120, -8123
-  , -7128, -6103, -5074, -4081, -3053, -2029,  -989,    -4,  1010,  2028
-  ,  3051,  4073,  5071,  6099,  7132,  8147,  9295, 10159, 11023, 12263
-  , 13312, 14336,-25600,-24576,-23552,-22529,-21504,-20480,-19456,-18637
-  ,-17425,-16165,-15316,-14327,-13606,-12135,-11182,-10107, -9153, -8144
-  , -7146, -6160, -5129, -4095, -3064, -2038, -1025,     1,  1031,  2072
-  ,  3074,  4088,  5123,  6149,  7157,  8173,  9198, 10244, 11250, 12268
-  , 13263, 14289, 15351, 16370, 17402, 18413, 19474, 20337, 21386, 22521
-  , 23367, 24350,     0,     0,     0,     0,     0,     0,     0,     0
-  , -1024,     0,  1024, -1024,     0,  1024, -1024,     0,  1024, -1024
-  ,     0,  1024, -1024,     0,  1024,  -773,     0,  1024,  -674,     0
-  ,   645, -2048,  -745,     0,   628,  2048, -2048,  -712,     0,   681
-  ,  2048,  3072, -3072, -2048,  -673,     0,   682,  1964,  3257,     0
-  ,     0,     0,     0,     0,     0,     0,     0, -1024,     0,  1024
-  , -1024,     0,  1024, -1024,     0,  1024,  -705,     0,   623,  -771
-  ,     0,  1024,  -786,     0,   688,  -631,     0,   652,  2048, -2048
-  ,  -627,    -1,   666,  2048, -3072, -1756,  -694,     0,   674,  2048
-  , -3098, -1879,  -720,     5,   694,  1886,  2958,  4096,     0,     0
-  ,     0,     0,  1024,     0,     0,  1024,  -769,     0,  1024, -1024
-  ,     0,  1024, -1024,     0,  1024,  -817,     0,   734,  -786,     0
-  ,   651,  -638,     0,   637,  -623,     0,   671,  -652,     0,   619
-  ,  2048, -2048,  -670,    -1,   663,  2048, -1908,  -680,     1,   686
-  ,  2048,  3072,  4096, -4096, -3072, -1833,  -711,     0,   727,  1747
-  ,  3072,  4096, -4096, -2971, -1826,  -762,     2,   766,  1832,  2852
-  ,  3928,  5079,     0,     0,     0, -1024,     0,  1024, -1024,     0
-  ,  -656,     0,  1024,  -599,     0,   620, -1024,     0,  1024,  -603
-  ,     0,   622,  -643,     0,   660,  -599,     0,   611,  -641,    -1
-  ,   651,  2048, -2048,  -648,    -2,   647,  1798, -3072, -2048,  -672
-  ,     2,   670,  2048, -3072, -1780,  -694,    -1,   706,  1751,  3072
-  , -3072, -1862,  -757,     7,   739,  1798,  3072,  4096, -5120, -4096
-  , -3253, -1811,  -787,     3,   782,  1887,  3123,  4096, -7252, -6144
-  , -5354, -4060, -2864, -1863,  -820,   -11,   847,  1903,  2970,  3851
-  ,  4921,  5957,  7168,  8192,  9306,     0,     0, -1024,     0,  1024
-  ,  -726,     0,   706,  -692,     0,   593,  -598,     0,   616,  -624
-  ,     0,   616,  -605,     0,   613, -2048,  -652,     1,   635,  2048
-  , -2048,  -647,    -1,   660,  2048, -1811,  -668,    -2,   685,  2048
-  , -1796,  -731,    -2,   730,  1702,  3072, -3072, -1766,  -747,    -4
-  ,   756,  1770,  3072, -4096, -3024, -1762,  -783,     4,   771,  1781
-  ,  3072, -5120, -4057, -2807, -1832,  -822,     0,   816,  1804,  2851
-  ,  3949,  5120, -6144, -4899, -3927, -2920, -1893,  -874,    -2,   868
-  ,  1881,  2905,  3960,  4912,  6144, -9216, -8192, -7168, -6225, -4963
-  , -3943, -2956, -1890,  -902,     0,   897,  1914,  2916,  3984,  4990
-  ,  6050,  7168,-11264,-10217, -9114, -8132, -7035, -5988, -4984, -4000
-  , -2980, -1962,  -927,     7,   931,  1956,  2981,  4031,  4972,  6213
-  ,  7227,  8192,  9216, 10240, 11170, 12288, 13312, 14336,     0,  1024
-  ,  -557,     1,   571,  -606,    -4,   612, -1676,  -707,    10,   673
-  ,  2048, -2048,  -727,     5,   686, -3072, -1772,  -755,    12,   716
-  ,  1877, -1856,  -786,     2,   786,  1712, -1685,  -818,   -16,   863
-  ,  1729, -3072, -1762,  -857,     3,   866,  1838,  2841, -3862, -2816
-  , -1864,  -925,    -2,   923,  1897,  2779, -2782, -1838,  -920,   -28
-  ,   931,  1951,  2835,  3804, -4815, -4001, -2940, -1934,  -959,   -22
-  ,   975,  1957,  2904,  3971,  4835, -5148, -3892, -2944, -1953,  -986
-  ,   -11,   989,  1968,  2939,  3949,  4947,  5902, -9216, -8192, -6915
-  , -6004, -4965, -4013, -3009, -1977,  -987,    -1,   982,  1972,  3000
-  ,  3960,  4939,  5814, -8976, -7888, -7084, -5955, -5043, -4009, -2991
-  , -2002, -1000,    -8,   993,  2011,  3023,  4026,  5028,  6023,  7052
-  ,  8014,  9216,-11240,-10036, -9125, -8118, -7105, -6062, -5048, -4047
-  , -3044, -2025, -1009,    -1,  1011,  2023,  3042,  4074,  5085,  6108
-  ,  7119,  8142,  9152, 10114, 11141, 12250, 13307,-15360,-14099,-13284
-  ,-12291,-11223,-10221, -9152, -8147, -7128, -6104, -5077, -4072, -3062
-  , -2033, -1020,     7,  1018,  2038,  3059,  4081,  5084,  6109,  7102
-  ,  8128,  9134, 10125, 11239, 12080,-23552,-22528,-21504,-20480,-19456
-  ,-18159,-17240,-16291,-15364,-14285,-13305,-12271,-11233,-10217, -9198
-  , -8175, -7157, -6134, -5122, -4089, -3071, -2047, -1018,     3,  1026
-  ,  2041,  3077,  4090,  5108,  6131,  7150,  8172,  9175, 10196, 11272
-  , 12303, 13273, 14328, 15332, 16334, 17381, 18409, 19423, 20423, 21451
-  , 22679, 23391, 24568, 25600, 26589
-};
-
-/* cdf tables for quantizer indices */
-const uint16_t WebRtcIsacfix_kCdfGain[1212] = {
-  0,  13,  301,  3730,  61784,  65167,  65489,  65535,  0,  17,
-  142,  314,  929,  2466,  7678,  56450,  63463,  64740,  65204,  65426,
-  65527,  65535,  0,  8,  100,  724,  6301,  60105,  65125,  65510,
-  65531,  65535,  0,  13,  117,  368,  1068,  3010,  11928,  53603,
-  61177,  63404,  64505,  65108,  65422,  65502,  65531,  65535,  0,  4,
-  17,  96,  410,  1859,  12125,  54361,  64103,  65305,  65497,  65535,
-  0,  4,  88,  230,  469,  950,  1746,  3228,  6092,  16592,
-  44756,  56848,  61256,  63308,  64325,  64920,  65309,  65460,  65502,  65522,
-  65535,  0,  88,  352,  1675,  6339,  20749,  46686,  59284,  63525,
-  64949,  65359,  65502,  65527,  65535,  0,  13,  38,  63,  117,
-  234,  381,  641,  929,  1407,  2043,  2809,  4032,  5753,  8792,
-  14407,  24308,  38941,  48947,  55403,  59293,  61411,  62688,  63630,  64329,
-  64840,  65188,  65376,  65472,  65506,  65527,  65531,  65535,  0,  8,
-  29,  75,  222,  615,  1327,  2801,  5623,  9931,  16094,  24966,
-  34419,  43458,  50676,  56186,  60055,  62500,  63936,  64765,  65225,  65435,
-  65514,  65535,  0,  8,  13,  15,  17,  21,  33,  59,
-  71,  92,  151,  243,  360,  456,  674,  934,  1223,  1583,
-  1989,  2504,  3031,  3617,  4354,  5154,  6163,  7411,  8780,  10747,
-  12874,  15591,  18974,  23027,  27436,  32020,  36948,  41830,  46205,  49797,
-  53042,  56094,  58418,  60360,  61763,  62818,  63559,  64103,  64509,  64798,
-  65045,  65162,  65288,  65363,  65447,  65506,  65522,  65531,  65533,  65535,
-  0,  4,  6,  25,  38,  71,  138,  264,  519,  808,
-  1227,  1825,  2516,  3408,  4279,  5560,  7092,  9197,  11420,  14108,
-  16947,  20300,  23926,  27459,  31164,  34827,  38575,  42178,  45540,  48747,
-  51444,  54090,  56426,  58460,  60080,  61595,  62734,  63668,  64275,  64673,
-  64936,  65112,  65217,  65334,  65426,  65464,  65477,  65489,  65518,  65527,
-  65529,  65531,  65533,  65535,  0,  2,  4,  8,  10,  12,
-  14,  16,  21,  33,  50,  71,  84,  92,  105,  138,
-  180,  255,  318,  377,  435,  473,  511,  590,  682,  758,
-  913,  1097,  1256,  1449,  1671,  1884,  2169,  2445,  2772,  3157,
-  3563,  3944,  4375,  4848,  5334,  5820,  6448,  7101,  7716,  8378,
-  9102,  9956,  10752,  11648,  12707,  13670,  14758,  15910,  17187,  18472,
-  19627,  20649,  21951,  23169,  24283,  25552,  26862,  28227,  29391,  30764,
-  31882,  33213,  34432,  35600,  36910,  38116,  39464,  40729,  41872,  43144,
-  44371,  45514,  46762,  47813,  48968,  50069,  51032,  51974,  52908,  53737,
-  54603,  55445,  56282,  56990,  57572,  58191,  58840,  59410,  59887,  60264,
-  60607,  60946,  61269,  61516,  61771,  61960,  62198,  62408,  62558,  62776,
-  62985,  63207,  63408,  63546,  63739,  63906,  64070,  64237,  64371,  64551,
-  64677,  64836,  64999,  65095,  65213,  65284,  65338,  65380,  65426,  65447,
-  65472,  65485,  65487,  65489,  65502,  65510,  65512,  65514,  65516,  65518,
-  65522,  65531,  65533,  65535,  0,  2,  4,  6,  65528,  65531,
-  65533,  65535,  0,  2,  4,  6,  8,  10,  222,  65321,
-  65513,  65528,  65531,  65533,  65535,  0,  2,  4,  50,  65476,
-  65529,  65531,  65533,  65535,  0,  2,  4,  6,  8,  12,
-  38,  544,  64936,  65509,  65523,  65525,  65529,  65531,  65533,  65535,
-  0,  2,  4,  6,  8,  10,  1055,  64508,  65528,  65531,
-  65533,  65535,  0,  2,  4,  6,  8,  10,  12,  123,
-  3956,  62999,  65372,  65495,  65515,  65521,  65523,  65525,  65527,  65529,
-  65531,  65533,  65535,  0,  2,  4,  12,  53,  4707,  59445,
-  65467,  65525,  65527,  65529,  65531,  65533,  65535,  0,  2,  4,
-  6,  8,  10,  12,  14,  16,  38,  40,  50,  67,
-  96,  234,  929,  14345,  55750,  64866,  65389,  65462,  65514,  65517,
-  65519,  65521,  65523,  65525,  65527,  65529,  65531,  65533,  65535,  0,
-  2,  4,  6,  8,  10,  15,  35,  91,  377,  1946,
-  13618,  52565,  63714,  65184,  65465,  65520,  65523,  65525,  65527,  65529,
-  65531,  65533,  65535,  0,  2,  4,  6,  8,  10,  12,
-  14,  16,  18,  20,  22,  24,  26,  28,  30,  32,
-  34,  36,  38,  40,  42,  44,  46,  48,  50,  52,
-  54,  82,  149,  362,  751,  1701,  4239,  12893,  38627,  55072,
-  60875,  63071,  64158,  64702,  65096,  65283,  65412,  65473,  65494,  65505,
-  65508,  65517,  65519,  65521,  65523,  65525,  65527,  65529,  65531,  65533,
-  65535,  0,  2,  15,  23,  53,  143,  260,  418,  698,
-  988,  1353,  1812,  2411,  3144,  4015,  5143,  6401,  7611,  8999,
-  10653,  12512,  14636,  16865,  19404,  22154,  24798,  27521,  30326,  33102,
-  35790,  38603,  41415,  43968,  46771,  49435,  52152,  54715,  57143,  59481,
-  61178,  62507,  63603,  64489,  64997,  65257,  65427,  65473,  65503,  65520,
-  65529,  65531,  65533,  65535,  0,  3,  6,  9,  26,  32,
-  44,  46,  64,  94,  111,  164,  205,  254,  327,  409,
-  506,  608,  733,  885,  1093,  1292,  1482,  1742,  1993,  2329,
-  2615,  3029,  3374,  3798,  4257,  4870,  5405,  5992,  6618,  7225,
-  7816,  8418,  9051,  9761,  10532,  11380,  12113,  13010,  13788,  14594,
-  15455,  16361,  17182,  18088,  18997,  20046,  20951,  21968,  22947,  24124,
-  25296,  26547,  27712,  28775,  29807,  30835,  31709,  32469,  33201,  34014,
-  34876,  35773,  36696,  37620,  38558,  39547,  40406,  41277,  42367,  43290,
-  44445,  45443,  46510,  47684,  48973,  50157,  51187,  52242,  53209,  54083,
-  55006,  55871,  56618,  57293,  57965,  58556,  59222,  59722,  60180,  60554,
-  60902,  61250,  61554,  61837,  62100,  62372,  62631,  62856,  63078,  63324,
-  63557,  63768,  63961,  64089,  64235,  64352,  64501,  64633,  64770,  64887,
-  65001,  65059,  65121,  65188,  65246,  65302,  65346,  65390,  65428,  65463,
-  65477,  65506,  65515,  65517,  65519,  65521,  65523,  65525,  65527,  65529,
-  65531,  65533,  65535,  0,  2,  4,  109,  65332,  65531,  65533,
-  65535,  0,  2,  4,  6,  8,  25,  1817,  63874,  65511,
-  65527,  65529,  65531,  65533,  65535,  0,  2,  4,  907,  65014,
-  65529,  65531,  65533,  65535,  0,  2,  4,  6,  8,  10,
-  12,  132,  2743,  62708,  65430,  65525,  65527,  65529,  65531,  65533,
-  65535,  0,  2,  4,  6,  8,  35,  3743,  61666,  65485,
-  65531,  65533,  65535,  0,  2,  4,  6,  8,  10,  23,
-  109,  683,  6905,  58417,  64911,  65398,  65497,  65518,  65525,  65527,
-  65529,  65531,  65533,  65535,  0,  2,  4,  6,  53,  510,
-  10209,  55212,  64573,  65441,  65522,  65529,  65531,  65533,  65535,  0,
-  2,  4,  6,  8,  10,  12,  14,  16,  18,  20,
-  22,  32,  90,  266,  1037,  3349,  14468,  50488,  62394,  64685,
-  65341,  65480,  65514,  65519,  65521,  65523,  65525,  65527,  65529,  65531,
-  65533,  65535,  0,  2,  4,  6,  9,  16,  37,  106,
-  296,  748,  1868,  5733,  18897,  45553,  60165,  63949,  64926,  65314,
-  65441,  65508,  65524,  65529,  65531,  65533,  65535,  0,  2,  4,
-  6,  8,  10,  12,  14,  16,  18,  20,  22,  24,
-  26,  28,  30,  32,  34,  36,  38,  40,  42,  44,
-  46,  48,  50,  83,  175,  344,  667,  1293,  2337,  4357,
-  8033,  14988,  28600,  43244,  52011,  57042,  59980,  61779,  63065,  63869,
-  64390,  64753,  64988,  65164,  65326,  65422,  65462,  65492,  65506,  65522,
-  65524,  65526,  65531,  65533,  65535,  0,  2,  4,  6,  8,
-  10,  12,  14,  16,  25,  39,  48,  55,  62,  65,
-  85,  106,  139,  169,  194,  252,  323,  485,  688,  1074,
-  1600,  2544,  3863,  5733,  8303,  11397,  15529,  20273,  25734,  31455,
-  36853,  41891,  46410,  50306,  53702,  56503,  58673,  60479,  61880,  62989,
-  63748,  64404,  64852,  65124,  65309,  65424,  65480,  65524,  65528,  65533,
-  65535,  0,  2,  4,  6,  8,  10,  12,  14,  21,
-  23,  25,  27,  29,  31,  39,  41,  43,  48,  60,
-  72,  79,  106,  136,  166,  187,  224,  252,  323,  381,
-  427,  478,  568,  660,  783,  912,  1046,  1175,  1365,  1567,
-  1768,  2024,  2347,  2659,  3049,  3529,  4033,  4623,  5281,  5925,
-  6726,  7526,  8417,  9468,  10783,  12141,  13571,  15222,  16916,  18659,
-  20350,  22020,  23725,  25497,  27201,  29026,  30867,  32632,  34323,  36062,
-  37829,  39466,  41144,  42654,  43981,  45343,  46579,  47759,  49013,  50171,
-  51249,  52283,  53245,  54148,  54938,  55669,  56421,  57109,  57791,  58464,
-  59092,  59674,  60105,  60653,  61083,  61407,  61757,  62095,  62388,  62649,
-  62873,  63157,  63358,  63540,  63725,  63884,  64046,  64155,  64278,  64426,
-  64548,  64654,  64806,  64906,  64994,  65077,  65137,  65215,  65277,  65324,
-  65354,  65409,  65437,  65455,  65462,  65490,  65495,  65499,  65508,  65511,
-  65513,  65515,  65517,  65519,  65521,  65523,  65525,  65527,  65529,  65531,
-  65533,  65535
-};
-
-const uint16_t WebRtcIsacfix_kCdfShape[2059] = {
-  0,  65535,  0,  65535,  0,  65535,  0,  65535,  0,  65535,
-  0,  65535,  0,  65535,  0,  65535,  0,  65535,  0,  4,
-  65535,  0,  8,  65514,  65535,  0,  29,  65481,  65535,  0,
-  121,  65439,  65535,  0,  239,  65284,  65535,  0,  8,  779,
-  64999,  65527,  65535,  0,  8,  888,  64693,  65522,  65535,  0,
-  29,  2604,  62843,  65497,  65531,  65535,  0,  25,  176,  4576,
-  61164,  65275,  65527,  65535,  0,  65535,  0,  65535,  0,  65535,
-  0,  65535,  0,  4,  65535,  0,  65535,  0,  65535,  0,
-  65535,  0,  65535,  0,  4,  65535,  0,  33,  65502,  65535,
-  0,  54,  65481,  65535,  0,  251,  65309,  65535,  0,  611,
-  65074,  65535,  0,  1273,  64292,  65527,  65535,  0,  4,  1809,
-  63940,  65518,  65535,  0,  88,  4392,  60603,  65426,  65531,  65535,
-  0,  25,  419,  7046,  57756,  64961,  65514,  65531,  65535,  0,
-  65535,  0,  65535,  0,  65535,  0,  65535,  0,  4,  65531,
-  65535,  0,  65535,  0,  8,  65531,  65535,  0,  4,  65527,
-  65535,  0,  17,  65510,  65535,  0,  42,  65481,  65535,  0,
-  197,  65342,  65531,  65535,  0,  385,  65154,  65535,  0,  1005,
-  64522,  65535,  0,  8,  1985,  63469,  65533,  65535,  0,  38,
-  3119,  61884,  65514,  65535,  0,  4,  6,  67,  4961,  60804,
-  65472,  65535,  0,  17,  565,  9182,  56538,  65087,  65514,  65535,
-  0,  8,  63,  327,  2118,  14490,  52774,  63839,  65376,  65522,
-  65535,  0,  65535,  0,  65535,  0,  65535,  0,  65535,  0,
-  17,  65522,  65535,  0,  59,  65489,  65535,  0,  50,  65522,
-  65535,  0,  54,  65489,  65535,  0,  310,  65179,  65535,  0,
-  615,  64836,  65535,  0,  4,  1503,  63965,  65535,  0,  2780,
-  63383,  65535,  0,  21,  3919,  61051,  65527,  65535,  0,  84,
-  6674,  59929,  65435,  65535,  0,  4,  255,  7976,  55784,  65150,
-  65518,  65531,  65535,  0,  4,  8,  582,  10726,  53465,  64949,
-  65518,  65535,  0,  29,  339,  3006,  17555,  49517,  62956,  65200,
-  65497,  65531,  65535,  0,  2,  33,  138,  565,  2324,  7670,
-  22089,  45966,  58949,  63479,  64966,  65380,  65518,  65535,  0,  65535,
-  0,  65535,  0,  2,  65533,  65535,  0,  46,  65514,  65535,
-  0,  414,  65091,  65535,  0,  540,  64911,  65535,  0,  419,
-  65162,  65535,  0,  976,  64790,  65535,  0,  2977,  62495,  65531,
-  65535,  0,  4,  3852,  61034,  65527,  65535,  0,  4,  29,
-  6021,  60243,  65468,  65535,  0,  84,  6711,  58066,  65418,  65535,
-  0,  13,  281,  9550,  54917,  65125,  65506,  65535,  0,  2,
-  63,  984,  12108,  52644,  64342,  65435,  65527,  65535,  0,  29,
-  251,  2014,  14871,  47553,  62881,  65229,  65518,  65535,  0,  13,
-  142,  749,  4220,  18497,  45200,  60913,  64823,  65426,  65527,  65535,
-  0,  13,  71,  264,  1176,  3789,  10500,  24480,  43488,  56324,
-  62315,  64493,  65242,  65464,  65514,  65522,  65531,  65535,  0,  4,
-  13,  38,  109,  205,  448,  850,  1708,  3429,  6276,  11371,
-  19221,  29734,  40955,  49391,  55411,  59460,  62102,  63793,  64656,  65150,
-  65401,  65485,  65522,  65531,  65535,  0,  65535,  0,  2,  65533,
-  65535,  0,  1160,  65476,  65535,  0,  2,  6640,  64763,  65533,
-  65535,  0,  2,  38,  9923,  61009,  65527,  65535,  0,  2,
-  4949,  63092,  65533,  65535,  0,  2,  3090,  63398,  65533,  65535,
-  0,  2,  2520,  58744,  65510,  65535,  0,  2,  13,  544,
-  8784,  51403,  65148,  65533,  65535,  0,  2,  25,  1017,  10412,
-  43550,  63651,  65489,  65527,  65535,  0,  2,  4,  29,  783,
-  13377,  52462,  64524,  65495,  65533,  65535,  0,  2,  4,  6,
-  100,  1817,  18451,  52590,  63559,  65376,  65531,  65535,  0,  2,
-  4,  6,  46,  385,  2562,  11225,  37416,  60488,  65026,  65487,
-  65529,  65533,  65535,  0,  2,  4,  6,  8,  10,  12,
-  42,  222,  971,  5221,  19811,  45048,  60312,  64486,  65294,  65474,
-  65525,  65529,  65533,  65535,  0,  2,  4,  8,  71,  167,
-  666,  2533,  7875,  19622,  38082,  54359,  62108,  64633,  65290,  65495,
-  65529,  65533,  65535,  0,  2,  4,  6,  8,  10,  13,
-  109,  586,  1930,  4949,  11600,  22641,  36125,  48312,  56899,  61495,
-  63927,  64932,  65389,  65489,  65518,  65531,  65533,  65535,  0,  4,
-  6,  8,  67,  209,  712,  1838,  4195,  8432,  14432,  22834,
-  31723,  40523,  48139,  53929,  57865,  60657,  62403,  63584,  64363,  64907,
-  65167,  65372,  65472,  65514,  65535,  0,  2,  4,  13,  25,
-  42,  46,  50,  75,  113,  147,  281,  448,  657,  909,
-  1185,  1591,  1976,  2600,  3676,  5317,  7398,  9914,  12941,  16169,
-  19477,  22885,  26464,  29851,  33360,  37228,  41139,  44802,  48654,  52058,
-  55181,  57676,  59581,  61022,  62190,  63107,  63676,  64199,  64547,  64924,
-  65158,  65313,  65430,  65481,  65518,  65535,  0,  65535,  0,  65535,
-  0,  65535,  0,  65535,  0,  65533,  65535,  0,  65535,  0,
-  65535,  0,  65535,  0,  65533,  65535,  0,  2,  65535,  0,
-  2,  65533,  65535,  0,  2,  65533,  65535,  0,  2,  65533,
-  65535,  0,  2,  4,  65533,  65535,  0,  2,  65533,  65535,
-  0,  2,  4,  65531,  65533,  65535,  0,  2,  4,  65531,
-  65533,  65535,  0,  2,  4,  6,  65524,  65533,  65535,  0,
-  65535,  0,  65535,  0,  65535,  0,  65535,  0,  65535,  0,
-  65535,  0,  65535,  0,  65535,  0,  65533,  65535,  0,  65533,
-  65535,  0,  2,  65533,  65535,  0,  2,  65533,  65535,  0,
-  2,  65533,  65535,  0,  2,  4,  65532,  65535,  0,  6,
-  65523,  65535,  0,  2,  15,  65530,  65533,  65535,  0,  2,
-  35,  65493,  65531,  65533,  65535,  0,  2,  4,  158,  65382,
-  65531,  65533,  65535,  0,  65535,  0,  65535,  0,  65535,  0,
-  65535,  0,  65535,  0,  65535,  0,  2,  65535,  0,  2,
-  65533,  65535,  0,  2,  65533,  65535,  0,  2,  65533,  65535,
-  0,  2,  65533,  65535,  0,  9,  65512,  65535,  0,  2,
-  12,  65529,  65535,  0,  2,  73,  65434,  65533,  65535,  0,
-  2,  240,  65343,  65533,  65535,  0,  2,  476,  65017,  65531,
-  65533,  65535,  0,  2,  4,  1046,  64686,  65531,  65533,  65535,
-  0,  2,  4,  6,  8,  1870,  63898,  65529,  65531,  65533,
-  65535,  0,  65535,  0,  65535,  0,  65535,  0,  65533,  65535,
-  0,  2,  65533,  65535,  0,  2,  65533,  65535,  0,  2,
-  65532,  65535,  0,  6,  65533,  65535,  0,  6,  65523,  65535,
-  0,  2,  65532,  65535,  0,  137,  65439,  65535,  0,  576,
-  64899,  65533,  65535,  0,  2,  289,  65299,  65533,  65535,  0,
-  2,  4,  6,  880,  64134,  65531,  65533,  65535,  0,  2,
-  4,  1853,  63347,  65533,  65535,  0,  2,  6,  2516,  61762,
-  65529,  65531,  65533,  65535,  0,  2,  4,  9,  3980,  61380,
-  65503,  65529,  65531,  65533,  65535,  0,  2,  4,  6,  8,
-  10,  12,  61,  6393,  59859,  65466,  65527,  65529,  65531,  65533,
-  65535,  0,  65535,  0,  65535,  0,  65535,  0,  2,  65532,
-  65535,  0,  3,  65529,  65535,  0,  2,  65529,  65535,  0,
-  61,  65453,  65535,  0,  234,  65313,  65535,  0,  503,  65138,
-  65535,  0,  155,  65402,  65533,  65535,  0,  2,  1058,  64554,
-  65533,  65535,  0,  2,  4,  3138,  62109,  65531,  65533,  65535,
-  0,  2,  4,  2031,  63339,  65531,  65533,  65535,  0,  2,
-  4,  6,  9,  4155,  60778,  65523,  65529,  65531,  65533,  65535,
-  0,  2,  4,  41,  6189,  59269,  65490,  65531,  65533,  65535,
-  0,  2,  4,  6,  210,  8789,  57043,  65400,  65528,  65531,
-  65533,  65535,  0,  2,  4,  6,  8,  26,  453,  10086,
-  55499,  64948,  65483,  65524,  65527,  65529,  65531,  65533,  65535,  0,
-  2,  4,  6,  8,  10,  12,  14,  16,  18,  20,
-  114,  1014,  11202,  52670,  64226,  65356,  65503,  65514,  65523,  65525,
-  65527,  65529,  65531,  65533,  65535,  0,  65533,  65535,  0,  15,
-  65301,  65535,  0,  152,  64807,  65535,  0,  2,  3328,  63308,
-  65535,  0,  2,  4050,  59730,  65533,  65535,  0,  2,  164,
-  10564,  61894,  65529,  65535,  0,  15,  6712,  59831,  65076,  65532,
-  65535,  0,  32,  7712,  57449,  65459,  65535,  0,  2,  210,
-  7849,  53110,  65021,  65523,  65535,  0,  2,  12,  1081,  13883,
-  48262,  62870,  65477,  65535,  0,  2,  88,  847,  6145,  37852,
-  62012,  65454,  65533,  65535,  0,  9,  47,  207,  1823,  14522,
-  45521,  61069,  64891,  65481,  65528,  65531,  65533,  65535,  0,  2,
-  9,  488,  2881,  12758,  38703,  58412,  64420,  65410,  65533,  65535,
-  0,  2,  4,  6,  61,  333,  1891,  6486,  19720,  43188,
-  57547,  62472,  64796,  65421,  65497,  65523,  65529,  65531,  65533,  65535,
-  0,  2,  4,  6,  8,  10,  12,  29,  117,  447,
-  1528,  6138,  21242,  43133,  56495,  62432,  64746,  65362,  65500,  65529,
-  65531,  65533,  65535,  0,  2,  18,  105,  301,  760,  1490,
-  3472,  7568,  15002,  26424,  40330,  53029,  60048,  62964,  64274,  64890,
-  65337,  65445,  65489,  65513,  65527,  65530,  65533,  65535,  0,  2,
-  4,  6,  41,  102,  409,  853,  2031,  4316,  7302,  11328,
-  16869,  24825,  34926,  43481,  50877,  56126,  59874,  62103,  63281,  63857,
-  64166,  64675,  65382,  65522,  65531,  65533,  65535,  0,  2,  4,
-  6,  8,  10,  12,  14,  16,  18,  29,  38,  53,
-  58,  96,  181,  503,  1183,  2849,  5590,  8600,  11379,  13942,
-  16478,  19453,  22638,  26039,  29411,  32921,  37596,  41433,  44998,  48560,
-  51979,  55106,  57666,  59892,  61485,  62616,  63484,  64018,  64375,  64685,
-  64924,  65076,  65278,  65395,  65471,  65509,  65529,  65535,  0,  65535,
-  0,  65535,  0,  65535,  0,  65535,  0,  65535,  0,  65535,
-  0,  65535,  0,  65535,  0,  2,  65533,  65535,  0,  2,
-  65533,  65535,  0,  2,  65533,  65535,  0,  2,  65533,  65535,
-  0,  2,  65533,  65535,  0,  2,  65533,  65535,  0,  7,
-  65519,  65535,  0,  2,  14,  65491,  65533,  65535,  0,  2,
-  81,  65427,  65531,  65533,  65535,  0,  2,  4,  312,  65293,
-  65528,  65533,  65535,  0,  65535,  0,  65535,  0,  65535,  0,
-  65535,  0,  65535,  0,  65535,  0,  65535,  0,  65535,  0,
-  2,  65533,  65535,  0,  2,  65533,  65535,  0,  2,  65533,
-  65535,  0,  5,  65523,  65535,  0,  2,  65533,  65535,  0,
-  7,  65526,  65535,  0,  46,  65464,  65533,  65535,  0,  2,
-  120,  65309,  65533,  65535,  0,  2,  5,  362,  65097,  65533,
-  65535,  0,  2,  18,  1164,  64785,  65528,  65531,  65533,  65535,
-  0,  65535,  0,  65535,  0,  65535,  0,  65533,  65535,  0,
-  65535,  0,  65533,  65535,  0,  2,  65533,  65535,  0,  2,
-  65533,  65535,  0,  2,  65533,  65535,  0,  2,  65530,  65535,
-  0,  2,  65523,  65535,  0,  69,  65477,  65535,  0,  141,
-  65459,  65535,  0,  194,  65325,  65533,  65535,  0,  2,  543,
-  64912,  65533,  65535,  0,  5,  1270,  64301,  65529,  65531,  65533,
-  65535,  0,  2,  4,  12,  2055,  63538,  65508,  65531,  65533,
-  65535,  0,  2,  7,  102,  3775,  61970,  65429,  65526,  65528,
-  65533,  65535,  0,  65535,  0,  65535,  0,  65535,  0,  2,
-  65533,  65535,  0,  2,  65535,  0,  9,  65533,  65535,  0,
-  25,  65512,  65535,  0,  2,  65533,  65535,  0,  44,  65480,
-  65535,  0,  48,  65475,  65535,  0,  162,  65373,  65535,  0,
-  637,  64806,  65533,  65535,  0,  2,  935,  64445,  65533,  65535,
-  0,  2,  4,  1662,  64083,  65533,  65535,  0,  2,  12,
-  3036,  62469,  65521,  65533,  65535,  0,  2,  120,  5405,  60468,
-  65469,  65531,  65533,  65535,  0,  2,  4,  18,  254,  6663,
-  58999,  65272,  65528,  65533,  65535,  0,  2,  4,  9,  12,
-  67,  591,  8981,  56781,  64564,  65365,  65508,  65524,  65526,  65529,
-  65531,  65533,  65535,  0,  65535,  0,  65535,  0,  2,  65533,
-  65535,  0,  9,  65526,  65535,  0,  14,  65503,  65535,  0,
-  127,  65390,  65535,  0,  517,  64990,  65535,  0,  178,  65330,
-  65535,  0,  2,  1055,  64533,  65533,  65535,  0,  2,  1558,
-  63942,  65533,  65535,  0,  2,  2205,  63173,  65533,  65535,  0,
-  25,  4493,  60862,  65505,  65533,  65535,  0,  2,  48,  5890,
-  59442,  65482,  65533,  65535,  0,  2,  4,  127,  7532,  58191,
-  65394,  65533,  65535,  0,  2,  5,  32,  550,  10388,  54924,
-  65046,  65510,  65531,  65533,  65535,  0,  2,  4,  30,  150,
-  1685,  14340,  51375,  63619,  65288,  65503,  65528,  65533,  65535,  0,
-  2,  4,  6,  8,  28,  97,  473,  2692,  15407,  50020,
-  62880,  65064,  65445,  65508,  65531,  65533,  65535,  0,  2,  4,
-  12,  32,  79,  150,  372,  907,  2184,  5868,  18207,  45431,
-  59856,  64031,  65096,  65401,  65481,  65507,  65521,  65523,  65525,  65527,
-  65529,  65531,  65533,  65535,  0,  65533,  65535,  0,  182,  65491,
-  65535,  0,  877,  64286,  65535,  0,  9,  2708,  63612,  65533,
-  65535,  0,  2,  6038,  59532,  65535,  0,  2,  92,  5500,
-  60539,  65533,  65535,  0,  268,  8908,  56512,  65385,  65535,  0,
-  129,  13110,  52742,  65036,  65535,  0,  2,  806,  14003,  51929,
-  64732,  65523,  65535,  0,  7,  92,  2667,  18159,  47678,  62610,
-  65355,  65535,  0,  32,  1836,  19676,  48237,  61677,  64960,  65526,
-  65535,  0,  21,  159,  967,  5668,  22782,  44709,  58317,  64020,
-  65406,  65528,  65535,  0,  7,  162,  1838,  8328,  23929,  43014,
-  56394,  63374,  65216,  65484,  65521,  65535,  0,  2,  4,  6,
-  28,  268,  1120,  3613,  10688,  24185,  40989,  54917,  61684,  64510,
-  65403,  65530,  65535,  0,  2,  16,  44,  139,  492,  1739,
-  5313,  13558,  26766,  41566,  52446,  58937,  62815,  64480,  65201,  65454,
-  65524,  65533,  65535,  0,  7,  25,  76,  263,  612,  1466,
-  3325,  6832,  12366,  20152,  29466,  39255,  47360,  53506,  57740,  60726,
-  62845,  64131,  64882,  65260,  65459,  65521,  65528,  65530,  65535,  0,
-  2,  4,  14,  48,  136,  312,  653,  1240,  2369,  4327,
-  7028,  10759,  15449,  21235,  28027,  35386,  42938,  49562,  54990,  59119,
-  62086,  63916,  64863,  65249,  65445,  65493,  65523,  65535,  0,  2,
-  4,  6,  8,  10,  12,  21,  83,  208,  409,  723,
-  1152,  1868,  2951,  4463,  6460,  8979,  11831,  15195,  18863,  22657,
-  26762,  30881,  34963,  39098,  43054,  47069,  50620,  53871,  56821,  59386,
-  61340,  62670,  63512,  64023,  64429,  64750,  64944,  65126,  65279,  65366,
-  65413,  65445,  65473,  65505,  65510,  65521,  65528,  65530,  65535
-};
-
-/* pointers to cdf tables for quantizer indices */
-const uint16_t *WebRtcIsacfix_kCdfGainPtr[3][12] = {
-  { WebRtcIsacfix_kCdfGain +0 +0,   WebRtcIsacfix_kCdfGain +0 +8,   WebRtcIsacfix_kCdfGain +0 +22,
-    WebRtcIsacfix_kCdfGain +0 +32,  WebRtcIsacfix_kCdfGain +0 +48,  WebRtcIsacfix_kCdfGain +0 +60,
-    WebRtcIsacfix_kCdfGain +0 +81,  WebRtcIsacfix_kCdfGain +0 +95,  WebRtcIsacfix_kCdfGain +0 +128,
-    WebRtcIsacfix_kCdfGain +0 +152, WebRtcIsacfix_kCdfGain +0 +210, WebRtcIsacfix_kCdfGain +0 +264
-  },
-  { WebRtcIsacfix_kCdfGain +404 +0,   WebRtcIsacfix_kCdfGain +404 +8,   WebRtcIsacfix_kCdfGain +404 +21,
-    WebRtcIsacfix_kCdfGain +404 +30,  WebRtcIsacfix_kCdfGain +404 +46,  WebRtcIsacfix_kCdfGain +404 +58,
-    WebRtcIsacfix_kCdfGain +404 +79,  WebRtcIsacfix_kCdfGain +404 +93,  WebRtcIsacfix_kCdfGain +404 +125,
-    WebRtcIsacfix_kCdfGain +404 +149, WebRtcIsacfix_kCdfGain +404 +207, WebRtcIsacfix_kCdfGain +404 +260
-  },
-  { WebRtcIsacfix_kCdfGain +803 +0,   WebRtcIsacfix_kCdfGain +803 +8,   WebRtcIsacfix_kCdfGain +803 +22,
-    WebRtcIsacfix_kCdfGain +803 +31,  WebRtcIsacfix_kCdfGain +803 +48,  WebRtcIsacfix_kCdfGain +803 +60,
-    WebRtcIsacfix_kCdfGain +803 +81,  WebRtcIsacfix_kCdfGain +803 +96,  WebRtcIsacfix_kCdfGain +803 +129,
-    WebRtcIsacfix_kCdfGain +803 +154, WebRtcIsacfix_kCdfGain +803 +212, WebRtcIsacfix_kCdfGain +803 +268
-  }
-};
-
-const uint16_t *WebRtcIsacfix_kCdfShapePtr[3][108] = {
-  { WebRtcIsacfix_kCdfShape +0 +0,   WebRtcIsacfix_kCdfShape +0 +2,   WebRtcIsacfix_kCdfShape +0 +4,
-    WebRtcIsacfix_kCdfShape +0 +6,   WebRtcIsacfix_kCdfShape +0 +8,   WebRtcIsacfix_kCdfShape +0 +10,
-    WebRtcIsacfix_kCdfShape +0 +12,  WebRtcIsacfix_kCdfShape +0 +14,  WebRtcIsacfix_kCdfShape +0 +16,
-    WebRtcIsacfix_kCdfShape +0 +18,  WebRtcIsacfix_kCdfShape +0 +21,  WebRtcIsacfix_kCdfShape +0 +25,
-    WebRtcIsacfix_kCdfShape +0 +29,  WebRtcIsacfix_kCdfShape +0 +33,  WebRtcIsacfix_kCdfShape +0 +37,
-    WebRtcIsacfix_kCdfShape +0 +43,  WebRtcIsacfix_kCdfShape +0 +49,  WebRtcIsacfix_kCdfShape +0 +56,
-    WebRtcIsacfix_kCdfShape +0 +64,  WebRtcIsacfix_kCdfShape +0 +66,  WebRtcIsacfix_kCdfShape +0 +68,
-    WebRtcIsacfix_kCdfShape +0 +70,  WebRtcIsacfix_kCdfShape +0 +72,  WebRtcIsacfix_kCdfShape +0 +75,
-    WebRtcIsacfix_kCdfShape +0 +77,  WebRtcIsacfix_kCdfShape +0 +79,  WebRtcIsacfix_kCdfShape +0 +81,
-    WebRtcIsacfix_kCdfShape +0 +83,  WebRtcIsacfix_kCdfShape +0 +86,  WebRtcIsacfix_kCdfShape +0 +90,
-    WebRtcIsacfix_kCdfShape +0 +94,  WebRtcIsacfix_kCdfShape +0 +98,  WebRtcIsacfix_kCdfShape +0 +102,
-    WebRtcIsacfix_kCdfShape +0 +107, WebRtcIsacfix_kCdfShape +0 +113, WebRtcIsacfix_kCdfShape +0 +120,
-    WebRtcIsacfix_kCdfShape +0 +129, WebRtcIsacfix_kCdfShape +0 +131, WebRtcIsacfix_kCdfShape +0 +133,
-    WebRtcIsacfix_kCdfShape +0 +135, WebRtcIsacfix_kCdfShape +0 +137, WebRtcIsacfix_kCdfShape +0 +141,
-    WebRtcIsacfix_kCdfShape +0 +143, WebRtcIsacfix_kCdfShape +0 +147, WebRtcIsacfix_kCdfShape +0 +151,
-    WebRtcIsacfix_kCdfShape +0 +155, WebRtcIsacfix_kCdfShape +0 +159, WebRtcIsacfix_kCdfShape +0 +164,
-    WebRtcIsacfix_kCdfShape +0 +168, WebRtcIsacfix_kCdfShape +0 +172, WebRtcIsacfix_kCdfShape +0 +178,
-    WebRtcIsacfix_kCdfShape +0 +184, WebRtcIsacfix_kCdfShape +0 +192, WebRtcIsacfix_kCdfShape +0 +200,
-    WebRtcIsacfix_kCdfShape +0 +211, WebRtcIsacfix_kCdfShape +0 +213, WebRtcIsacfix_kCdfShape +0 +215,
-    WebRtcIsacfix_kCdfShape +0 +217, WebRtcIsacfix_kCdfShape +0 +219, WebRtcIsacfix_kCdfShape +0 +223,
-    WebRtcIsacfix_kCdfShape +0 +227, WebRtcIsacfix_kCdfShape +0 +231, WebRtcIsacfix_kCdfShape +0 +235,
-    WebRtcIsacfix_kCdfShape +0 +239, WebRtcIsacfix_kCdfShape +0 +243, WebRtcIsacfix_kCdfShape +0 +248,
-    WebRtcIsacfix_kCdfShape +0 +252, WebRtcIsacfix_kCdfShape +0 +258, WebRtcIsacfix_kCdfShape +0 +264,
-    WebRtcIsacfix_kCdfShape +0 +273, WebRtcIsacfix_kCdfShape +0 +282, WebRtcIsacfix_kCdfShape +0 +293,
-    WebRtcIsacfix_kCdfShape +0 +308, WebRtcIsacfix_kCdfShape +0 +310, WebRtcIsacfix_kCdfShape +0 +312,
-    WebRtcIsacfix_kCdfShape +0 +316, WebRtcIsacfix_kCdfShape +0 +320, WebRtcIsacfix_kCdfShape +0 +324,
-    WebRtcIsacfix_kCdfShape +0 +328, WebRtcIsacfix_kCdfShape +0 +332, WebRtcIsacfix_kCdfShape +0 +336,
-    WebRtcIsacfix_kCdfShape +0 +341, WebRtcIsacfix_kCdfShape +0 +347, WebRtcIsacfix_kCdfShape +0 +354,
-    WebRtcIsacfix_kCdfShape +0 +360, WebRtcIsacfix_kCdfShape +0 +368, WebRtcIsacfix_kCdfShape +0 +378,
-    WebRtcIsacfix_kCdfShape +0 +388, WebRtcIsacfix_kCdfShape +0 +400, WebRtcIsacfix_kCdfShape +0 +418,
-    WebRtcIsacfix_kCdfShape +0 +445, WebRtcIsacfix_kCdfShape +0 +447, WebRtcIsacfix_kCdfShape +0 +451,
-    WebRtcIsacfix_kCdfShape +0 +455, WebRtcIsacfix_kCdfShape +0 +461, WebRtcIsacfix_kCdfShape +0 +468,
-    WebRtcIsacfix_kCdfShape +0 +474, WebRtcIsacfix_kCdfShape +0 +480, WebRtcIsacfix_kCdfShape +0 +486,
-    WebRtcIsacfix_kCdfShape +0 +495, WebRtcIsacfix_kCdfShape +0 +505, WebRtcIsacfix_kCdfShape +0 +516,
-    WebRtcIsacfix_kCdfShape +0 +528, WebRtcIsacfix_kCdfShape +0 +543, WebRtcIsacfix_kCdfShape +0 +564,
-    WebRtcIsacfix_kCdfShape +0 +583, WebRtcIsacfix_kCdfShape +0 +608, WebRtcIsacfix_kCdfShape +0 +635
-  },
-  { WebRtcIsacfix_kCdfShape +686 +0,   WebRtcIsacfix_kCdfShape +686 +2,   WebRtcIsacfix_kCdfShape +686 +4,
-    WebRtcIsacfix_kCdfShape +686 +6,   WebRtcIsacfix_kCdfShape +686 +8,   WebRtcIsacfix_kCdfShape +686 +11,
-    WebRtcIsacfix_kCdfShape +686 +13,  WebRtcIsacfix_kCdfShape +686 +15,  WebRtcIsacfix_kCdfShape +686 +17,
-    WebRtcIsacfix_kCdfShape +686 +20,  WebRtcIsacfix_kCdfShape +686 +23,  WebRtcIsacfix_kCdfShape +686 +27,
-    WebRtcIsacfix_kCdfShape +686 +31,  WebRtcIsacfix_kCdfShape +686 +35,  WebRtcIsacfix_kCdfShape +686 +40,
-    WebRtcIsacfix_kCdfShape +686 +44,  WebRtcIsacfix_kCdfShape +686 +50,  WebRtcIsacfix_kCdfShape +686 +56,
-    WebRtcIsacfix_kCdfShape +686 +63,  WebRtcIsacfix_kCdfShape +686 +65,  WebRtcIsacfix_kCdfShape +686 +67,
-    WebRtcIsacfix_kCdfShape +686 +69,  WebRtcIsacfix_kCdfShape +686 +71,  WebRtcIsacfix_kCdfShape +686 +73,
-    WebRtcIsacfix_kCdfShape +686 +75,  WebRtcIsacfix_kCdfShape +686 +77,  WebRtcIsacfix_kCdfShape +686 +79,
-    WebRtcIsacfix_kCdfShape +686 +82,  WebRtcIsacfix_kCdfShape +686 +85,  WebRtcIsacfix_kCdfShape +686 +89,
-    WebRtcIsacfix_kCdfShape +686 +93,  WebRtcIsacfix_kCdfShape +686 +97,  WebRtcIsacfix_kCdfShape +686 +102,
-    WebRtcIsacfix_kCdfShape +686 +106, WebRtcIsacfix_kCdfShape +686 +112, WebRtcIsacfix_kCdfShape +686 +119,
-    WebRtcIsacfix_kCdfShape +686 +127, WebRtcIsacfix_kCdfShape +686 +129, WebRtcIsacfix_kCdfShape +686 +131,
-    WebRtcIsacfix_kCdfShape +686 +133, WebRtcIsacfix_kCdfShape +686 +135, WebRtcIsacfix_kCdfShape +686 +137,
-    WebRtcIsacfix_kCdfShape +686 +139, WebRtcIsacfix_kCdfShape +686 +142, WebRtcIsacfix_kCdfShape +686 +146,
-    WebRtcIsacfix_kCdfShape +686 +150, WebRtcIsacfix_kCdfShape +686 +154, WebRtcIsacfix_kCdfShape +686 +158,
-    WebRtcIsacfix_kCdfShape +686 +162, WebRtcIsacfix_kCdfShape +686 +167, WebRtcIsacfix_kCdfShape +686 +173,
-    WebRtcIsacfix_kCdfShape +686 +179, WebRtcIsacfix_kCdfShape +686 +186, WebRtcIsacfix_kCdfShape +686 +194,
-    WebRtcIsacfix_kCdfShape +686 +205, WebRtcIsacfix_kCdfShape +686 +207, WebRtcIsacfix_kCdfShape +686 +209,
-    WebRtcIsacfix_kCdfShape +686 +211, WebRtcIsacfix_kCdfShape +686 +214, WebRtcIsacfix_kCdfShape +686 +218,
-    WebRtcIsacfix_kCdfShape +686 +222, WebRtcIsacfix_kCdfShape +686 +226, WebRtcIsacfix_kCdfShape +686 +230,
-    WebRtcIsacfix_kCdfShape +686 +234, WebRtcIsacfix_kCdfShape +686 +238, WebRtcIsacfix_kCdfShape +686 +242,
-    WebRtcIsacfix_kCdfShape +686 +247, WebRtcIsacfix_kCdfShape +686 +253, WebRtcIsacfix_kCdfShape +686 +262,
-    WebRtcIsacfix_kCdfShape +686 +269, WebRtcIsacfix_kCdfShape +686 +278, WebRtcIsacfix_kCdfShape +686 +289,
-    WebRtcIsacfix_kCdfShape +686 +305, WebRtcIsacfix_kCdfShape +686 +307, WebRtcIsacfix_kCdfShape +686 +309,
-    WebRtcIsacfix_kCdfShape +686 +311, WebRtcIsacfix_kCdfShape +686 +315, WebRtcIsacfix_kCdfShape +686 +319,
-    WebRtcIsacfix_kCdfShape +686 +323, WebRtcIsacfix_kCdfShape +686 +327, WebRtcIsacfix_kCdfShape +686 +331,
-    WebRtcIsacfix_kCdfShape +686 +335, WebRtcIsacfix_kCdfShape +686 +340, WebRtcIsacfix_kCdfShape +686 +346,
-    WebRtcIsacfix_kCdfShape +686 +354, WebRtcIsacfix_kCdfShape +686 +362, WebRtcIsacfix_kCdfShape +686 +374,
-    WebRtcIsacfix_kCdfShape +686 +384, WebRtcIsacfix_kCdfShape +686 +396, WebRtcIsacfix_kCdfShape +686 +413,
-    WebRtcIsacfix_kCdfShape +686 +439, WebRtcIsacfix_kCdfShape +686 +442, WebRtcIsacfix_kCdfShape +686 +446,
-    WebRtcIsacfix_kCdfShape +686 +450, WebRtcIsacfix_kCdfShape +686 +455, WebRtcIsacfix_kCdfShape +686 +461,
-    WebRtcIsacfix_kCdfShape +686 +468, WebRtcIsacfix_kCdfShape +686 +475, WebRtcIsacfix_kCdfShape +686 +481,
-    WebRtcIsacfix_kCdfShape +686 +489, WebRtcIsacfix_kCdfShape +686 +498, WebRtcIsacfix_kCdfShape +686 +508,
-    WebRtcIsacfix_kCdfShape +686 +522, WebRtcIsacfix_kCdfShape +686 +534, WebRtcIsacfix_kCdfShape +686 +554,
-    WebRtcIsacfix_kCdfShape +686 +577, WebRtcIsacfix_kCdfShape +686 +602, WebRtcIsacfix_kCdfShape +686 +631
-  },
-  { WebRtcIsacfix_kCdfShape +1368 +0,   WebRtcIsacfix_kCdfShape +1368 +2,   WebRtcIsacfix_kCdfShape +1368 +4,
-    WebRtcIsacfix_kCdfShape +1368 +6,   WebRtcIsacfix_kCdfShape +1368 +8,   WebRtcIsacfix_kCdfShape +1368 +10,
-    WebRtcIsacfix_kCdfShape +1368 +12,  WebRtcIsacfix_kCdfShape +1368 +14,  WebRtcIsacfix_kCdfShape +1368 +16,
-    WebRtcIsacfix_kCdfShape +1368 +20,  WebRtcIsacfix_kCdfShape +1368 +24,  WebRtcIsacfix_kCdfShape +1368 +28,
-    WebRtcIsacfix_kCdfShape +1368 +32,  WebRtcIsacfix_kCdfShape +1368 +36,  WebRtcIsacfix_kCdfShape +1368 +40,
-    WebRtcIsacfix_kCdfShape +1368 +44,  WebRtcIsacfix_kCdfShape +1368 +50,  WebRtcIsacfix_kCdfShape +1368 +57,
-    WebRtcIsacfix_kCdfShape +1368 +65,  WebRtcIsacfix_kCdfShape +1368 +67,  WebRtcIsacfix_kCdfShape +1368 +69,
-    WebRtcIsacfix_kCdfShape +1368 +71,  WebRtcIsacfix_kCdfShape +1368 +73,  WebRtcIsacfix_kCdfShape +1368 +75,
-    WebRtcIsacfix_kCdfShape +1368 +77,  WebRtcIsacfix_kCdfShape +1368 +79,  WebRtcIsacfix_kCdfShape +1368 +81,
-    WebRtcIsacfix_kCdfShape +1368 +85,  WebRtcIsacfix_kCdfShape +1368 +89,  WebRtcIsacfix_kCdfShape +1368 +93,
-    WebRtcIsacfix_kCdfShape +1368 +97,  WebRtcIsacfix_kCdfShape +1368 +101, WebRtcIsacfix_kCdfShape +1368 +105,
-    WebRtcIsacfix_kCdfShape +1368 +110, WebRtcIsacfix_kCdfShape +1368 +116, WebRtcIsacfix_kCdfShape +1368 +123,
-    WebRtcIsacfix_kCdfShape +1368 +132, WebRtcIsacfix_kCdfShape +1368 +134, WebRtcIsacfix_kCdfShape +1368 +136,
-    WebRtcIsacfix_kCdfShape +1368 +138, WebRtcIsacfix_kCdfShape +1368 +141, WebRtcIsacfix_kCdfShape +1368 +143,
-    WebRtcIsacfix_kCdfShape +1368 +146, WebRtcIsacfix_kCdfShape +1368 +150, WebRtcIsacfix_kCdfShape +1368 +154,
-    WebRtcIsacfix_kCdfShape +1368 +158, WebRtcIsacfix_kCdfShape +1368 +162, WebRtcIsacfix_kCdfShape +1368 +166,
-    WebRtcIsacfix_kCdfShape +1368 +170, WebRtcIsacfix_kCdfShape +1368 +174, WebRtcIsacfix_kCdfShape +1368 +179,
-    WebRtcIsacfix_kCdfShape +1368 +185, WebRtcIsacfix_kCdfShape +1368 +193, WebRtcIsacfix_kCdfShape +1368 +203,
-    WebRtcIsacfix_kCdfShape +1368 +214, WebRtcIsacfix_kCdfShape +1368 +216, WebRtcIsacfix_kCdfShape +1368 +218,
-    WebRtcIsacfix_kCdfShape +1368 +220, WebRtcIsacfix_kCdfShape +1368 +224, WebRtcIsacfix_kCdfShape +1368 +227,
-    WebRtcIsacfix_kCdfShape +1368 +231, WebRtcIsacfix_kCdfShape +1368 +235, WebRtcIsacfix_kCdfShape +1368 +239,
-    WebRtcIsacfix_kCdfShape +1368 +243, WebRtcIsacfix_kCdfShape +1368 +247, WebRtcIsacfix_kCdfShape +1368 +251,
-    WebRtcIsacfix_kCdfShape +1368 +256, WebRtcIsacfix_kCdfShape +1368 +262, WebRtcIsacfix_kCdfShape +1368 +269,
-    WebRtcIsacfix_kCdfShape +1368 +277, WebRtcIsacfix_kCdfShape +1368 +286, WebRtcIsacfix_kCdfShape +1368 +297,
-    WebRtcIsacfix_kCdfShape +1368 +315, WebRtcIsacfix_kCdfShape +1368 +317, WebRtcIsacfix_kCdfShape +1368 +319,
-    WebRtcIsacfix_kCdfShape +1368 +323, WebRtcIsacfix_kCdfShape +1368 +327, WebRtcIsacfix_kCdfShape +1368 +331,
-    WebRtcIsacfix_kCdfShape +1368 +335, WebRtcIsacfix_kCdfShape +1368 +339, WebRtcIsacfix_kCdfShape +1368 +343,
-    WebRtcIsacfix_kCdfShape +1368 +349, WebRtcIsacfix_kCdfShape +1368 +355, WebRtcIsacfix_kCdfShape +1368 +361,
-    WebRtcIsacfix_kCdfShape +1368 +368, WebRtcIsacfix_kCdfShape +1368 +376, WebRtcIsacfix_kCdfShape +1368 +385,
-    WebRtcIsacfix_kCdfShape +1368 +397, WebRtcIsacfix_kCdfShape +1368 +411, WebRtcIsacfix_kCdfShape +1368 +429,
-    WebRtcIsacfix_kCdfShape +1368 +456, WebRtcIsacfix_kCdfShape +1368 +459, WebRtcIsacfix_kCdfShape +1368 +463,
-    WebRtcIsacfix_kCdfShape +1368 +467, WebRtcIsacfix_kCdfShape +1368 +473, WebRtcIsacfix_kCdfShape +1368 +478,
-    WebRtcIsacfix_kCdfShape +1368 +485, WebRtcIsacfix_kCdfShape +1368 +491, WebRtcIsacfix_kCdfShape +1368 +497,
-    WebRtcIsacfix_kCdfShape +1368 +505, WebRtcIsacfix_kCdfShape +1368 +514, WebRtcIsacfix_kCdfShape +1368 +523,
-    WebRtcIsacfix_kCdfShape +1368 +535, WebRtcIsacfix_kCdfShape +1368 +548, WebRtcIsacfix_kCdfShape +1368 +565,
-    WebRtcIsacfix_kCdfShape +1368 +585, WebRtcIsacfix_kCdfShape +1368 +611, WebRtcIsacfix_kCdfShape +1368 +640
-  }
-};
-
-/* code length for all coefficients using different models */
-
-const int16_t WebRtcIsacfix_kCodeLenGainQ11[392] = {
-  25189, 16036,  8717,   358,  8757, 15706, 21456, 24397, 18502, 17559
-  , 13794, 11088,  7480,   873,  6603, 11636, 14627, 16805, 19132, 26624
-  , 26624, 19408, 13751,  7280,   583,  7591, 15178, 23773, 28672, 25189
-  , 19045, 16442, 13412, 10397,  5893,  1338,  6376,  9992, 12074, 13853
-  , 15781, 19821, 22819, 28672, 28672, 25189, 19858, 15781, 11262,  5477
-  ,  1298,  5632, 11814, 17234, 22020, 28672, 19677, 18125, 16587, 14521
-  , 13032, 11196,  9249,  5411,  2495,  4994,  7975, 10234, 12308, 13892
-  , 15148, 17944, 21725, 23917, 25189, 19539, 16293, 11531,  7808,  4475
-  ,  2739,  4872,  8089, 11314, 14992, 18105, 23257, 26624, 25189, 23257
-  , 23257, 20982, 18697, 18023, 16338, 16036, 14539, 13695, 13146, 11763
-  , 10754,  9074,  7260,  5584,  4430,  5553,  6848,  8344, 10141, 11636
-  , 12535, 13416, 14342, 15477, 17296, 19282, 22349, 23773, 28672, 28672
-  , 26624, 23773, 21456, 18023, 15118, 13362, 11212,  9293,  8043,  6985
-  ,  5908,  5721,  5853,  6518,  7316,  8360,  9716, 11289, 12912, 14652
-  , 16969, 19858, 23773, 26624, 28013, 30720, 30720, 28672, 25426, 23141
-  , 25426, 23773, 20720, 19408, 18697, 19282, 16859, 16338, 16026, 15377
-  , 15021, 14319, 14251, 13937, 13260, 13017, 12332, 11703, 11430, 10359
-  , 10128,  9405,  8757,  8223,  7974,  7859,  7646,  7673,  7997,  8580
-  ,  8880,  9061,  9866, 10397, 11358, 12200, 13244, 14157, 15021, 16026
-  , 16490, 18697, 18479, 20011, 19677, 20720, 24576, 26276, 30720, 30720
-  , 28672, 30720, 24068, 25189, 22437, 20345, 18479, 16396, 16026, 14928
-  , 13877, 13450, 12696, 12766, 11626, 11098, 10159,  9998,  9437,  9275
-  ,  8783,  8552,  8629,  8488,  8522,  8454,  8571,  8775,  8915,  9427
-  ,  9483,  9851, 10260, 10933, 11131, 11974, 12560, 13833, 15080, 16304
-  , 17491, 19017, 18697, 19408, 22020, 25189, 25426, 22819, 26276, 30720
-  , 30720, 30720, 30720, 30720, 30720, 28672, 30720, 30720, 30720, 30720
-  , 28013, 25426, 24397, 23773, 25189, 26624, 25189, 22437, 21725, 20011
-  , 20527, 20720, 20771, 22020, 22020, 19858, 19408, 19972, 17866, 17360
-  , 17791, 17219, 16805, 16927, 16067, 16162, 15661, 15178, 15021, 15209
-  , 14845, 14570, 14490, 14490, 13733, 13617, 13794, 13577, 13312, 12824
-  , 13032, 12683, 12189, 12469, 12109, 11940, 11636, 11617, 11932, 12294
-  , 11578, 11775, 12039, 11654, 11560, 11439, 11909, 11421, 12029, 11513
-  , 11773, 11899, 11560, 11805, 11476, 11664, 11963, 11647, 11754, 11963
-  , 11703, 12211, 11932, 12074, 12469, 12535, 12560, 12912, 12783, 12866
-  , 12884, 13378, 13957, 13775, 13635, 14019, 14545, 15240, 15520, 15554
-  , 15697, 16490, 16396, 17281, 16599, 16969, 17963, 16859, 16983, 16805
-  , 17099, 18210, 17219, 17646, 17700, 17646, 18297, 17425, 18479, 17791
-  , 17718, 19282, 18672, 20173, 20982, 21725, 21456, 23773, 23257, 25189
-  , 30720, 30720, 25189, 26624, 30720, 30720, 30720, 30720, 28672, 26276
-  , 30720, 30720
-};
-
-const int16_t WebRtcIsacfix_kCodeLenShapeQ11[577] = {
-  0,     0,     0,     0,     0,     0,     0,     0,     0, 28672
-  ,     0, 26624,     1, 23773, 22819,     4, 20982, 18598,    10, 19282
-  , 16587,    22, 16442, 26624, 13126,    60, 14245, 26624, 26624, 12736
-  ,    79, 12912, 25189, 22819,  9563,   249,  9474, 22349, 28672, 23257
-  , 17944,  7980,   434,  8181, 16431, 26624,     0,     0,     0,     0
-  , 28672,     0,     0,     0,     0,     0, 28672,     0, 22437,     3
-  , 22437, 20982,     5, 20982, 16442,    22, 16752, 13814,    49, 14646
-  , 11645,   116, 11734, 26624, 28672, 10613,   158, 11010, 24397, 19539
-  ,  8046,   453,  7709, 19017, 28672, 23257, 15110,  6770,   758,  6523
-  , 14108, 24397, 28672,     0,     0,     0,     0, 28672,     0, 28672
-  ,     0, 26624,     1, 28672, 28672,     1, 26624, 24397,     2, 23257
-  , 21725,     4, 20982, 17158,    18, 17281, 28672, 15178,    35, 15209
-  , 12343,    92, 12320, 26624, 10344,   189, 10217, 30720, 22020,  9033
-  ,   322,  8549, 23773, 28672, 30720, 20622,  7666,   473,  7806, 20527
-  , 24397, 14135,  5995,   960,  6018, 14872, 23773, 26624, 20928, 16293
-  , 10636,  4926,  1588,  5256, 11088, 18043, 25189,     0,     0,     0
-  ,     0, 24397,     1, 25189, 20720,     5, 21456, 21209,     3, 25189
-  , 20982,     5, 21456, 15818,    30, 15410, 13794,    60, 13416, 28672
-  , 11162,   142, 11025,  9337,   231, 10094, 23773,  8338,   405,  7930
-  , 26624, 19677,  6787,   613,  7318, 19161, 28672, 16442,  6319,   932
-  ,  5748, 15312, 25189, 28672, 28672, 28672, 13998,  5513,  1263,  5146
-  , 14024, 24397, 22819, 15818,  9460,  4447,  2122,  4681,  9970, 15945
-  , 22349, 28672, 30720, 22622, 19017, 14872, 10689,  7405,  4473,  2983
-  ,  4783,  7894, 11186, 14964, 18210, 24397,     0,     0, 30720,     0
-  , 30720, 21456,     3, 23773, 14964,    39, 14757, 14179,    53, 13751
-  , 14928,    36, 15272, 12430,    79, 13228,  9135,   285,  9077, 28672
-  , 28672,  8377,   403,  7919, 26624, 28672, 23257,  7068,   560,  7473
-  , 20345, 19677,  6770,   720,  6464, 18697, 25189, 16249,  5779,  1087
-  ,  5494, 15209, 22819, 30720, 20622, 12601,  5240,  1419,  5091, 12095
-  , 19408, 26624, 22819, 16805, 10683,  4812,  2056,  4293,  9836, 16026
-  , 24397, 25189, 18409, 13833,  8681,  4503,  2653,  4220,  8329, 13853
-  , 19132, 26624, 25189, 20771, 17219, 12630,  9520,  6733,  4565,  3657
-  ,  4817,  7069, 10058, 13212, 16805, 21209, 26624, 26276, 28672, 28672
-  , 26276, 23257, 20173, 19282, 16538, 15051, 12811, 10754,  9267,  7547
-  ,  6270,  5407,  5214,  6057,  7054,  8226,  9488, 10806, 12793, 14442
-  , 16442, 19677, 22099, 26276, 28672,     0, 30720,     0, 30720, 11920
-  ,    56, 20720, 30720,  6766,   355, 13130, 30720, 30720, 22180,  5589
-  ,   736,  7902, 26624, 30720,  7634,   354,  9721, 30720, 30720,  9027
-  ,   246, 10117, 30720, 30720,  9630,   453,  6709, 23257, 30720, 25683
-  , 14228,  6127,  1271,  4615, 15178, 30720, 30720, 23504, 12382,  5739
-  ,  2015,  3492, 10560, 22020, 26624, 30720, 30720, 23257, 13192,  4873
-  ,  1527,  5001, 12445, 22020, 30720, 30720, 30720, 30720, 19344, 10761
-  ,  4051,  1927,  5281, 10594, 17866, 28672, 30720, 30720, 30720, 21869
-  , 15554, 10060,  5979,  2710,  3085,  7889, 14646, 21725, 28672, 30720
-  , 30720, 30720, 30720, 30720, 30720, 30720, 22719, 17425, 13212,  8083
-  ,  4439,  2820,  4305,  8136, 12988, 17425, 21151, 28672, 28672, 30720
-  , 30720, 30720, 28672, 20527, 19282, 14412, 10513,  7407,  5079,  3744
-  ,  4115,  6308,  9621, 13599, 17040, 22349, 28672, 30720, 30720, 30720
-  , 30720, 30720, 30720, 29522, 19282, 14545, 11485,  9093,  6760,  5262
-  ,  4672,  4970,  6005,  7852,  9732, 12343, 14672, 19161, 22819, 25189
-  , 30720, 30720, 28672, 30720, 30720, 20720, 18125, 14388, 12007,  9825
-  ,  8092,  7064,  6069,  5903,  5932,  6359,  7169,  8310,  9324, 10711
-  , 11867, 13096, 14157, 16338, 17040, 19161, 21725, 23773, 30720, 30720
-  , 26276, 25426, 24397, 28672, 28672, 23257, 22020, 22349, 18297, 17646
-  , 16983, 16431, 16162, 15021, 15178, 13751, 12142, 10895, 10193,  9632
-  ,  9086,  8896,  8823,  8735,  8591,  8754,  8649,  8361,  8329,  8522
-  ,  8373,  8739,  8993,  9657, 10454, 11279, 11899, 12614, 14024, 14273
-  , 15477, 15240, 16649, 17866, 18697, 21151, 22099
-};
-
-/* left KLT transforms */
-const int16_t WebRtcIsacfix_kT1GainQ15[3][4] = {
-  { -26130, 19773, 19773, 26130 },
-  { -26664, 19046, 19046, 26664 },
-  { -23538, 22797, 22797, 23538 }
-};
-
-
-
-const int16_t WebRtcIsacfix_kT1ShapeQ15[3][324] = {
-  { 52,16,168,7,439,-138,-89,306,671,882,
-    157,1301,291,1598,-3571,-1943,-1119,32404,96,-12,
-    379,-64,-307,345,-836,539,1045,2541,-2865,-992,
-    1683,-4717,5808,7427,30599,2319,183,-73,451,481,
-    933,-198,781,-397,1244,-777,3690,-2414,149,-1356,
-    -2593,-31140,8289,-1737,-202,-14,-214,360,501,450,
-    -245,-7,797,3638,-2804,3042,-337,22137,-22103,2264,
-    6838,-3381,305,172,263,-195,-355,351,179,513,
-    2234,3343,5509,7531,19075,-17740,-16836,2244,-629,-1505,
-    -153,108,124,-324,2694,-124,1492,-850,5347,4285,
-    7439,-10229,-22822,-12467,-12891,3645,822,-232,131,13,
-    374,565,536,4681,1294,-1935,1926,-5734,-10643,26462,
-    -12480,-5589,-1038,-2468,964,-704,-247,-106,186,-558,
-    -4050,3760,2972,2141,-7393,6294,26740,11991,-3251,5461,
-    5341,1574,2208,-51,-552,-297,-753,-154,2068,-5371,
-    3578,4106,28043,-10533,8041,2353,2389,4609,3410,1906,
-    351,-249,18,-15,1117,539,2870,9084,17585,-24528,
-    -366,-6490,2009,-3170,2942,1116,-232,1672,1065,606,
-    -399,-388,-518,38,3728,28948,-11936,4543,4104,-4441,
-    1545,-4044,1485,622,-68,186,-473,135,-280,125,
-    -546,-1813,6989,6606,23711,19376,-2636,2870,-4553,-1687,
-    878,-375,205,-208,-409,-108,-200,-45,-1670,-337,
-    8213,-5524,-2334,5240,-12939,-26205,5937,-1582,-592,-959,
-    -5374,2449,3400,559,349,-492,668,12379,-27684,3419,
-    5117,4415,-297,-8270,-1252,-3490,-1272,-1199,-3159,191,
-    630,488,-797,-3071,12912,-27783,-10249,1047,647,619,
-    111,-3722,-915,-1055,-502,5,-1384,-306,221,68,
-    5219,13173,-26474,-11663,-5626,927,806,-1127,236,-589,
-    -522,-230,-312,-315,-428,-573,426,192,-11830,-26883,
-    -14121,-2785,-1429,-109,410,-832,-302,539,-459,104,
-    1,-530,-202,-289,153,116,30082,-12944,-671,20,
-    649,98,103,215,234,0,280,-51,-169,298,
-    31,230,-73,-51
-  },
-  { -154,-7,-192,61,-739,-389,-947,-162,-60,94,
-    511,-716,1520,-1428,4168,-2214,1816,32270,-123,-77,
-    -199,-99,-42,-588,203,-240,-930,-35,1580,234,
-    3206,-5507,-1495,-10946,30000,-2667,-136,-176,-240,-175,
-    -204,-661,-1796,-1039,-1271,498,3143,734,2663,2699,
-    -8127,29333,10495,2356,-72,113,-91,118,-2840,-723,
-    -1733,-1158,-389,-2116,-3054,-3,-5179,8071,29546,6308,
-    5657,-3178,-186,-294,-473,-635,1213,-983,-1437,-1715,
-    -1094,1280,-92,-9573,948,29576,-7060,-5921,2954,1349,
-    -337,-108,-1099,962,418,-413,-1149,-334,1241,3975,
-    -6825,26725,-14377,7051,-4772,-1707,2335,2008,-150,570,
-    1371,42,-1649,-619,2039,3369,-1225,1583,-2755,-15207,
-    -27504,-4855,-4304,1495,2733,1324,15,-448,403,353,
-    3016,-1242,2338,2673,2064,-7496,-30447,-3686,5833,-1301,
-    -2455,2122,1519,608,43,-653,773,-3072,912,-1537,
-    4505,10284,30237,1549,3200,-691,205,1702,658,1014,
-    1499,148,79,-322,-1162,-4639,-813,7536,3204,29109,
-    -10747,-26,1611,2286,2114,2561,1022,372,348,207,
-    1062,-1088,-443,-9849,2381,5671,29097,-7612,-2927,3853,
-    194,1155,275,1438,1438,1312,581,888,-784,906,
-    112,-11103,25104,14438,-9311,-3068,1210,368,370,-940,
-    -2434,-1148,1925,392,657,258,-526,1475,-2281,-4265,
-    -1880,1534,2185,-1472,959,-30934,6306,3114,-4109,1768,
-    -2612,-703,45,644,2185,2033,5670,7211,19114,-22427,
-    6432,5150,-4090,-2694,3860,1245,-596,293,1829,369,
-    -319,229,-3256,2170,-6374,-26216,-4570,-16053,-5766,-262,
-    -2006,2873,-1477,147,378,-1544,-344,-544,-985,-481,
-    4210,4542,30757,-7291,-4863,1529,-2079,-628,-603,-783,
-    -408,1646,697,808,-620,-292,181,158,-13313,-29173,
-    5984,-1262,859,-1776,-558,-24,-883,-1421,739,210,
-    -531,-285,131,-160,-246,-56,29345,-13706,-2859,-2966,
-    -300,-970,-2382,-268,-103,-636,-12,-62,-691,-253,
-    -147,-127,27,66
-  },
-  { 55,-212,-198,489,-274,81,682,399,328,-934,
-    -389,-37,1357,-3632,5276,6581,-9493,-29921,29,-45,
-    2,190,172,-15,311,-130,-1085,-25,324,-684,
-    3223,-6580,4485,-5280,-29521,9933,82,-320,-530,229,
-    -705,-533,-414,848,-1842,-4473,1390,-857,6717,-6692,
-    4648,29397,576,8339,-68,-85,238,-330,264,-1012,
-    -381,-203,-3384,-3329,3906,6810,3790,-6250,28312,-8078,
-    8089,1565,160,-569,-612,-613,-1063,-1928,-1125,3421,
-    -7481,-7484,4942,-6984,4330,-25591,-10574,-6982,5682,-1781,
-    -308,89,178,-1715,-420,-3530,-5776,1219,-8617,-7137,
-    7015,4981,24875,12657,-5408,-3356,-785,-1972,326,-858,
-    -506,-3382,-986,-6258,-2259,4015,-8374,-10482,3127,23826,
-    -14126,-514,-5417,2178,-2912,-17,-587,80,67,-5881,
-    -1702,-5351,-4481,398,-10156,-225,20727,-15460,-11603,7752,
-    3660,1714,-2001,-359,499,-527,-1225,-7820,-1297,-6326,
-    -8526,7900,-18328,13311,-17488,-2926,-196,-17,2281,873,
-    480,-160,-624,471,780,-8729,1707,-14262,-20647,1721,
-    18590,-2206,-1214,-1066,312,-2602,783,-412,-113,49,
-    -119,1305,-2371,-15132,-1833,-18252,20295,-8316,2227,341,
-    -2074,-702,3082,-262,-465,-198,430,30,-70,-788,
-    2342,-25132,-4863,19783,-484,2137,2811,-1906,799,1586,
-    962,-734,-191,-30,-129,-93,-1126,1729,5860,-2030,
-    8953,603,-3338,-10869,-1144,22070,12130,10513,3191,-6881,
-    -3514,2090,711,-666,1843,-5997,-5681,2921,-17641,-2801,
-    4969,18590,7169,12214,8587,4405,3008,-1074,-371,-77,
-    253,331,-5611,5014,13152,-1985,18483,-1696,8043,20463,
-    2381,-393,1688,-1205,618,1220,457,248,-83,176,
-    7920,-13676,-22139,-3038,17402,2036,844,3258,994,719,
-    2087,-44,426,494,12,-91,46,5,-14204,22912,
-    -18156,-361,442,2298,-829,2229,386,1433,1335,1323,
-    55,-592,-139,49,-12,-57,27783,17134,350,-282,
-    552,158,142,2488,465,329,1087,118,143,10,
-    56,65,-15,-31
-  }
-};
-
-/* right KLT transforms */
-const int16_t WebRtcIsacfix_kT2GainQ15[3][36] = {
-  {   4775, -14892,  20313, -17104,  10533,  -3613,  -6782,  16044,  -8889,
-      -11019,  21330, -10720,  13193, -15678, -11101,  14461,  12250, -13096,
-      -16951,   2167,  16066,  15569,   -702, -16754, -19195, -12823,  -4321,
-      5128,    13348,  17825,  13232,  13404,  13494,  13490,  13383,  13261
-  },
-  {  -3725,  11408, -18493,  20031, -13097,   3865,   9344, -19294,  10740,
-     8856, -18432,   8982,  13975, -14444, -11930,  11774,  14285, -13594,
-     -16323,     -4,  16340,  15609,    359, -17220, -18401, -13471,  -4643,
-     5225,  13375,  18053,  13124,  13463,  13621,  13583,  13393,  13072
-  },
-  {  -3513,  11402, -17883,  19504, -14399,   4885,   8702, -19513,  12046,
-     8533, -18110,   8447,  12778, -14838, -12444,  13177,  14107, -12759,
-     -17268,    914,  15822,  15661,    838, -16686, -18907, -12936,  -4820,
-     4175,  12398,  18830,  12913,  13215,  13433,  13572,  13601,  13518
-  }
-};
-
-const int16_t WebRtcIsacfix_kT2ShapeQ15[3][36] = {
-  {   4400, -11512,  17205, -19470,  14770,  -5345,   9784, -19222,  11228,
-      6842, -18371,   9909,  14191, -13496, -11563,  14015,  11827, -14839,
-      -15439,    948,  17802,  14827,  -2053, -17132,  18723,  14516,   4135,
-      -6822, -13869, -16016,  12975,  13341,  13563,  13603,  13478,  13296
-  },
-  {   5420, -14215,  19060, -18073,  11709,  -3911,   9645, -18335,   7717,
-      10842, -19283,   9777,  14898, -12555, -13661,  11668,  13520, -13733,
-      -15936,  -1358,  15671,  16728,    328, -17100,  17527,  13973,   5587,
-      -5194, -14165, -17677,  12970,  13446,  13693,  13660,  13462,  13015
-  },
-  {   4386, -12426,  18019, -18895,  13894,  -5034,   9713, -19270,  10283,
-      8692, -18439,   9317,  13992, -13454, -13241,  12850,  13366, -13336,
-      -16334,   -498,  15976,  16213,   -114, -16987,  18191,  13659,   4958,
-      -5116, -13444, -18021,  12911,  13424,  13718,  13674,  13464,  13054
-  }
-};
-
-/* means of log gains and LAR coefficients*/
-const int16_t WebRtcIsacfix_kMeansGainQ8[3][12] = {
-  { -1758, -1370, -1758, -1373, -1757, -1375,
-    -1758, -1374, -1758, -1373, -1755, -1370
-  },
-  { -1569, -1224, -1569, -1225, -1569, -1227,
-    -1569, -1226, -1567, -1225, -1565, -1224
-  },
-  { -1452,  -957, -1447,  -951, -1438,  -944,
-    -1431,  -938, -1419,  -931, -1406,  -926
-  }
-};
-
-
-const int32_t WebRtcIsacfix_kMeansShapeQ17[3][108] = {
-  { -119581, 34418, -44193, 11112, -4428, 18906, 9222, 8068, 1953, 5425,
-    1871, 1689, 109933, 33751, 10471, -2566, 1090, 2320, -119219, 33728,
-    -43759, 11450, -4870, 19117, 9174, 8037, 1972, 5331, 1872, 1843,
-    109899, 34301, 10629, -2316, 1272, 2562, -118608, 32318, -44012, 11591,
-    -4914, 18932, 9456, 8088, 1900, 5419, 1723, 1853, 109963, 35059,
-    10745, -2335, 1161, 2520, -119174, 32107, -44462, 11635, -4694, 18611,
-    9757, 8108, 1969, 5486, 1673, 1777, 109636, 34907, 10643, -2406,
-    1034, 2420, -118597, 32320, -44590, 10854, -4569, 18821, 9701, 7866,
-    2003, 5577, 1732, 1626, 109913, 34448, 10714, -2752, 990, 2228,
-    -118138, 32996, -44352, 10334, -3772, 18488, 9464, 7865, 2208, 5540,
-    1745, 1664, 109880, 33381, 10640, -2779, 980, 2054
-  },
-  { -146328, 46370, 1047, 26431, 10035, 13933, 6415, 14359, -2368, 6661,
-    2269, 1764, 96623, 7802, 4163, 10742, 1643, 2954, -146871, 46561, 1127,
-    26225, 10113, 14096, 6771, 14323, -2037, 6788, 2297, 1761, 96324, 8382,
-    4309, 10450, 1695, 3016, -146502, 46475, 1580, 26118, 10487, 14179, 6622,
-    14439, -2034, 6757, 2342, 1761, 95869, 8966, 4347, 10358, 1999, 2855,
-    -146958, 47717, 826, 25952, 10263, 14061, 5266, 13681, -2417, 6582, 2047,
-    1608, 96257, 9107, 4452, 10301, 1792, 2676, -146992, 47123, 446, 25822,
-    10405, 14292, 5140, 13804, -2403, 6496, 1834, 1735, 97489, 9253, 4414,
-    10684, 1549, 2721, -145811, 46182, 901, 26482, 10241, 14524, 6075, 14514,
-    -2147, 6691, 2196, 1899, 97011, 8178, 4102, 10758, 1638, 2869
-  },
-  { -166617, 46969, -43908, 17726, 6330, 25615, 6913, 5450, -2301, 1984,
-    507, 2883, 149998, 28709, 19333, 16703, 11093, 8965, -168254, 46604,
-    -44315, 17862, 6474, 25746, 7018, 5373, -2343, 1930, 513, 2819, 150391,
-    28627, 19194, 16678, 10998, 8929, -169093, 46084, -44767, 17427, 6401,
-    25674, 7147, 5472, -2336, 1820, 491, 2802, 149860, 28430, 19064, 16524,
-    10898, 8875, -170205, 46189, -44877, 17403, 6190, 25209, 7035, 5673, -2173,
-    1894, 574, 2756, 148830, 28230, 18819, 16418, 10789, 8811, -171263, 45045,
-    -44834, 16858, 6103, 24726, 7014, 5713, -2103, 1877, 518, 2729, 147073,
-    27744, 18629, 16277, 10690, 8703, -171720, 44153, -45062, 15951, 5872,
-    24429, 7044, 5585, -2082, 1807, 519, 2769, 144791, 27402, 18490, 16126,
-    10548, 8635
-  }
-};
diff --git a/modules/audio_coding/codecs/isac/fix/source/lpc_tables.h b/modules/audio_coding/codecs/isac/fix/source/lpc_tables.h
deleted file mode 100644
index 7e8121e..0000000
--- a/modules/audio_coding/codecs/isac/fix/source/lpc_tables.h
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/*
- * lpc_tables.h
- *
- * header file for coding tables for the LPC coefficients
- *
- */
-
-#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_FIX_SOURCE_LPC_TABLES_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_FIX_SOURCE_LPC_TABLES_H_
-
-#include "webrtc/typedefs.h"
-
-/* indices of KLT coefficients used */
-extern const uint16_t WebRtcIsacfix_kSelIndGain[12];
-
-extern const uint16_t WebRtcIsacfix_kSelIndShape[108];
-
-/* cdf array for model indicator */
-extern const uint16_t WebRtcIsacfix_kModelCdf[KLT_NUM_MODELS+1];
-
-/* pointer to cdf array for model indicator */
-extern const uint16_t *WebRtcIsacfix_kModelCdfPtr[1];
-
-/* initial cdf index for decoder of model indicator */
-extern const uint16_t WebRtcIsacfix_kModelInitIndex[1];
-
-/* offset to go from rounded value to quantization index */
-extern const int16_t WebRtcIsacfix_kQuantMinGain[12];
-
-extern const int16_t WebRtcIsacfix_kQuantMinShape[108];
-
-/* maximum quantization index */
-extern const uint16_t WebRtcIsacfix_kMaxIndGain[12];
-
-extern const uint16_t WebRtcIsacfix_kMaxIndShape[108];
-
-/* index offset */
-extern const uint16_t WebRtcIsacfix_kOffsetGain[KLT_NUM_MODELS][12];
-
-extern const uint16_t WebRtcIsacfix_kOffsetShape[KLT_NUM_MODELS][108];
-
-/* initial cdf index for KLT coefficients */
-extern const uint16_t WebRtcIsacfix_kInitIndexGain[KLT_NUM_MODELS][12];
-
-extern const uint16_t WebRtcIsacfix_kInitIndexShape[KLT_NUM_MODELS][108];
-
-/* offsets for quantizer representation levels */
-extern const uint16_t WebRtcIsacfix_kOfLevelsGain[3];
-
-extern const uint16_t WebRtcIsacfix_kOfLevelsShape[3];
-
-/* quantizer representation levels */
-extern const int32_t WebRtcIsacfix_kLevelsGainQ17[1176];
-
-extern const int16_t WebRtcIsacfix_kLevelsShapeQ10[1735];
-
-/* cdf tables for quantizer indices */
-extern const uint16_t WebRtcIsacfix_kCdfGain[1212];
-
-extern const uint16_t WebRtcIsacfix_kCdfShape[2059];
-
-/* pointers to cdf tables for quantizer indices */
-extern const uint16_t *WebRtcIsacfix_kCdfGainPtr[KLT_NUM_MODELS][12];
-
-extern const uint16_t *WebRtcIsacfix_kCdfShapePtr[KLT_NUM_MODELS][108];
-
-/* code length for all coefficients using different models */
-extern const int16_t WebRtcIsacfix_kCodeLenGainQ11[392];
-
-extern const int16_t WebRtcIsacfix_kCodeLenShapeQ11[577];
-
-/* left KLT transforms */
-extern const int16_t WebRtcIsacfix_kT1GainQ15[KLT_NUM_MODELS][4];
-
-extern const int16_t WebRtcIsacfix_kT1ShapeQ15[KLT_NUM_MODELS][324];
-
-/* right KLT transforms */
-extern const int16_t WebRtcIsacfix_kT2GainQ15[KLT_NUM_MODELS][36];
-
-extern const int16_t WebRtcIsacfix_kT2ShapeQ15[KLT_NUM_MODELS][36];
-
-/* means of log gains and LAR coefficients */
-extern const int16_t WebRtcIsacfix_kMeansGainQ8[KLT_NUM_MODELS][12];
-
-extern const int32_t WebRtcIsacfix_kMeansShapeQ17[3][108];
-
-#endif /* WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_FIX_SOURCE_LPC_TABLES_H_ */
diff --git a/modules/audio_coding/codecs/isac/fix/source/pitch_estimator.c b/modules/audio_coding/codecs/isac/fix/source/pitch_estimator.c
deleted file mode 100644
index ac8511e..0000000
--- a/modules/audio_coding/codecs/isac/fix/source/pitch_estimator.c
+++ /dev/null
@@ -1,435 +0,0 @@
-/*
- *  Copyright (c) 2011 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/codecs/isac/fix/source/pitch_estimator.h"
-#include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
-#include "webrtc/rtc_base/compile_assert_c.h"
-
-/* log2[0.2, 0.5, 0.98] in Q8 */
-static const int16_t kLogLagWinQ8[3] = {
-  -594, -256, -7
-};
-
-/* [1 -0.75 0.25] in Q12 */
-static const int16_t kACoefQ12[3] = {
-  4096, -3072, 1024
-};
-
-int32_t WebRtcIsacfix_Log2Q8(uint32_t x) {
-  int32_t zeros;
-  int16_t frac;
-
-  zeros=WebRtcSpl_NormU32(x);
-  frac = (int16_t)(((x << zeros) & 0x7FFFFFFF) >> 23);
-  /* log2(magn(i)) */
-
-  return ((31 - zeros) << 8) + frac;
-}
-
-static __inline int16_t Exp2Q10(int16_t x) { // Both in and out in Q10
-
-  int16_t tmp16_1, tmp16_2;
-
-  tmp16_2=(int16_t)(0x0400|(x&0x03FF));
-  tmp16_1 = -(x >> 10);
-  if(tmp16_1>0)
-    return tmp16_2 >> tmp16_1;
-  else
-    return tmp16_2 << -tmp16_1;
-
-}
-
-
-
-/* 1D parabolic interpolation . All input and output values are in Q8 */
-static __inline void Intrp1DQ8(int32_t *x, int32_t *fx, int32_t *y, int32_t *fy) {
-
-  int16_t sign1=1, sign2=1;
-  int32_t r32, q32, t32, nom32, den32;
-  int16_t t16, tmp16, tmp16_1;
-
-  if ((fx[0]>0) && (fx[2]>0)) {
-    r32=fx[1]-fx[2];
-    q32=fx[0]-fx[1];
-    nom32=q32+r32;
-    den32 = (q32 - r32) * 2;
-    if (nom32<0)
-      sign1=-1;
-    if (den32<0)
-      sign2=-1;
-
-    /* t = (q32+r32)/(2*(q32-r32)) = (fx[0]-fx[1] + fx[1]-fx[2])/(2 * fx[0]-fx[1] - (fx[1]-fx[2]))*/
-    /* (Signs are removed because WebRtcSpl_DivResultInQ31 can't handle negative numbers) */
-    /* t in Q31, without signs */
-    t32 = WebRtcSpl_DivResultInQ31(nom32 * sign1, den32 * sign2);
-
-    t16 = (int16_t)(t32 >> 23);  /* Q8 */
-    t16=t16*sign1*sign2;        /* t in Q8 with signs */
-
-    *y = x[0]+t16;          /* Q8 */
-    // *y = x[1]+t16;          /* Q8 */
-
-    /* The following code calculates fy in three steps */
-    /* fy = 0.5 * t * (t-1) * fx[0] + (1-t*t) * fx[1] + 0.5 * t * (t+1) * fx[2]; */
-
-    /* Part I: 0.5 * t * (t-1) * fx[0] */
-    tmp16_1 = (int16_t)(t16 * t16);  /* Q8*Q8=Q16 */
-    tmp16_1 >>= 2;  /* Q16>>2 = Q14 */
-    t16 <<= 6;  /* Q8<<6 = Q14  */
-    tmp16 = tmp16_1-t16;
-    *fy = WEBRTC_SPL_MUL_16_32_RSFT15(tmp16, fx[0]); /* (Q14 * Q8 >>15)/2 = Q8 */
-
-    /* Part II: (1-t*t) * fx[1] */
-    tmp16 = 16384-tmp16_1;        /* 1 in Q14 - Q14 */
-    *fy += WEBRTC_SPL_MUL_16_32_RSFT14(tmp16, fx[1]);/* Q14 * Q8 >> 14 = Q8 */
-
-    /* Part III: 0.5 * t * (t+1) * fx[2] */
-    tmp16 = tmp16_1+t16;
-    *fy += WEBRTC_SPL_MUL_16_32_RSFT15(tmp16, fx[2]);/* (Q14 * Q8 >>15)/2 = Q8 */
-  } else {
-    *y = x[0];
-    *fy= fx[1];
-  }
-}
-
-
-static void FindFour32(int32_t *in, int16_t length, int16_t *bestind)
-{
-  int32_t best[4]= {-100, -100, -100, -100};
-  int16_t k;
-
-  for (k=0; k<length; k++) {
-    if (in[k] > best[3]) {
-      if (in[k] > best[2]) {
-        if (in[k] > best[1]) {
-          if (in[k] > best[0]) { // The Best
-            best[3] = best[2];
-            bestind[3] = bestind[2];
-            best[2] = best[1];
-            bestind[2] = bestind[1];
-            best[1] = best[0];
-            bestind[1] = bestind[0];
-            best[0] = in[k];
-            bestind[0] = k;
-          } else { // 2nd best
-            best[3] = best[2];
-            bestind[3] = bestind[2];
-            best[2] = best[1];
-            bestind[2] = bestind[1];
-            best[1] = in[k];
-            bestind[1] = k;
-          }
-        } else { // 3rd best
-          best[3] = best[2];
-          bestind[3] = bestind[2];
-          best[2] = in[k];
-          bestind[2] = k;
-        }
-      } else {  // 4th best
-        best[3] = in[k];
-        bestind[3] = k;
-      }
-    }
-  }
-}
-
-
-
-
-
-extern void WebRtcIsacfix_PCorr2Q32(const int16_t *in, int32_t *logcorQ8);
-
-
-
-void WebRtcIsacfix_InitialPitch(const int16_t *in, /* Q0 */
-                                PitchAnalysisStruct *State,
-                                int16_t *lagsQ7                   /* Q7 */
-                                )
-{
-  int16_t buf_dec16[PITCH_CORR_LEN2+PITCH_CORR_STEP2+PITCH_MAX_LAG/2+2];
-  int32_t *crrvecQ8_1,*crrvecQ8_2;
-  int32_t cv1q[PITCH_LAG_SPAN2+2],cv2q[PITCH_LAG_SPAN2+2], peakvq[PITCH_LAG_SPAN2+2];
-  int k;
-  int16_t peaks_indq;
-  int16_t peakiq[PITCH_LAG_SPAN2];
-  int32_t corr;
-  int32_t corr32, corr_max32, corr_max_o32;
-  int16_t npkq;
-  int16_t best4q[4]={0,0,0,0};
-  int32_t xq[3],yq[1],fyq[1];
-  int32_t *fxq;
-  int32_t best_lag1q, best_lag2q;
-  int32_t tmp32a,tmp32b,lag32,ratq;
-  int16_t start;
-  int16_t oldgQ12, tmp16a, tmp16b, gain_bias16,tmp16c, tmp16d, bias16;
-  int32_t tmp32c,tmp32d, tmp32e;
-  int16_t old_lagQ;
-  int32_t old_lagQ8;
-  int32_t lagsQ8[4];
-
-  old_lagQ = State->PFstr_wght.oldlagQ7; // Q7
-  old_lagQ8 = old_lagQ << 1;  // Q8
-
-  oldgQ12= State->PFstr_wght.oldgainQ12;
-
-  crrvecQ8_1=&cv1q[1];
-  crrvecQ8_2=&cv2q[1];
-
-
-  /* copy old values from state buffer */
-  memcpy(buf_dec16, State->dec_buffer16, sizeof(State->dec_buffer16));
-
-  /* decimation; put result after the old values */
-  WebRtcIsacfix_DecimateAllpass32(in, State->decimator_state32, PITCH_FRAME_LEN,
-                                  &buf_dec16[PITCH_CORR_LEN2+PITCH_CORR_STEP2+PITCH_MAX_LAG/2-PITCH_FRAME_LEN/2+2]);
-
-  /* low-pass filtering */
-  start= PITCH_CORR_LEN2+PITCH_CORR_STEP2+PITCH_MAX_LAG/2-PITCH_FRAME_LEN/2+2;
-  WebRtcSpl_FilterARFastQ12(&buf_dec16[start],&buf_dec16[start],(int16_t*)kACoefQ12,3, PITCH_FRAME_LEN/2);
-
-  /* copy end part back into state buffer */
-  for (k = 0; k < (PITCH_CORR_LEN2+PITCH_CORR_STEP2+PITCH_MAX_LAG/2-PITCH_FRAME_LEN/2+2); k++)
-    State->dec_buffer16[k] = buf_dec16[k+PITCH_FRAME_LEN/2];
-
-
-  /* compute correlation for first and second half of the frame */
-  WebRtcIsacfix_PCorr2Q32(buf_dec16, crrvecQ8_1);
-  WebRtcIsacfix_PCorr2Q32(buf_dec16 + PITCH_CORR_STEP2, crrvecQ8_2);
-
-
-  /* bias towards pitch lag of previous frame */
-  tmp32a = WebRtcIsacfix_Log2Q8((uint32_t) old_lagQ8) - 2304;
-      // log2(0.5*oldlag) in Q8
-  tmp32b = oldgQ12 * oldgQ12 >> 10;  // Q12 & * 4.0;
-  gain_bias16 = (int16_t) tmp32b;  //Q12
-  if (gain_bias16 > 3276) gain_bias16 = 3276; // 0.8 in Q12
-
-
-  for (k = 0; k < PITCH_LAG_SPAN2; k++)
-  {
-    if (crrvecQ8_1[k]>0) {
-      tmp32b = WebRtcIsacfix_Log2Q8((uint32_t) (k + (PITCH_MIN_LAG/2-2)));
-      tmp16a = (int16_t) (tmp32b - tmp32a); // Q8 & fabs(ratio)<4
-      tmp32c = tmp16a * tmp16a >> 6;  // Q10
-      tmp16b = (int16_t) tmp32c; // Q10 & <8
-      tmp32d = tmp16b * 177 >> 8;  // mult with ln2 in Q8
-      tmp16c = (int16_t) tmp32d; // Q10 & <4
-      tmp16d = Exp2Q10((int16_t) -tmp16c); //Q10
-      tmp32c = gain_bias16 * tmp16d >> 13;  // Q10  & * 0.5
-      bias16 = (int16_t) (1024 + tmp32c); // Q10
-      tmp32b = WebRtcIsacfix_Log2Q8((uint32_t)bias16) - 2560;
-          // Q10 in -> Q8 out with 10*2^8 offset
-      crrvecQ8_1[k] += tmp32b ; // -10*2^8 offset
-    }
-  }
-
-  /* taper correlation functions */
-  for (k = 0; k < 3; k++) {
-    crrvecQ8_1[k] += kLogLagWinQ8[k];
-    crrvecQ8_2[k] += kLogLagWinQ8[k];
-
-    crrvecQ8_1[PITCH_LAG_SPAN2-1-k] += kLogLagWinQ8[k];
-    crrvecQ8_2[PITCH_LAG_SPAN2-1-k] += kLogLagWinQ8[k];
-  }
-
-
-  /* Make zeropadded corr vectors */
-  cv1q[0]=0;
-  cv2q[0]=0;
-  cv1q[PITCH_LAG_SPAN2+1]=0;
-  cv2q[PITCH_LAG_SPAN2+1]=0;
-  corr_max32 = 0;
-
-  for (k = 1; k <= PITCH_LAG_SPAN2; k++)
-  {
-
-
-    corr32=crrvecQ8_1[k-1];
-    if (corr32 > corr_max32)
-      corr_max32 = corr32;
-
-    corr32=crrvecQ8_2[k-1];
-    corr32 += -4; // Compensate for later (log2(0.99))
-
-    if (corr32 > corr_max32)
-      corr_max32 = corr32;
-
-  }
-
-  /* threshold value to qualify as a peak */
-  // corr_max32 += -726; // log(0.14)/log(2.0) in Q8
-  corr_max32 += -1000; // log(0.14)/log(2.0) in Q8
-  corr_max_o32 = corr_max32;
-
-
-  /* find peaks in corr1 */
-  peaks_indq = 0;
-  for (k = 1; k <= PITCH_LAG_SPAN2; k++)
-  {
-    corr32=cv1q[k];
-    if (corr32>corr_max32) { // Disregard small peaks
-      if ((corr32>=cv1q[k-1]) && (corr32>cv1q[k+1])) { // Peak?
-        peakvq[peaks_indq] = corr32;
-        peakiq[peaks_indq++] = k;
-      }
-    }
-  }
-
-
-  /* find highest interpolated peak */
-  corr_max32=0;
-  best_lag1q =0;
-  if (peaks_indq > 0) {
-    FindFour32(peakvq, (int16_t) peaks_indq, best4q);
-    npkq = WEBRTC_SPL_MIN(peaks_indq, 4);
-
-    for (k=0;k<npkq;k++) {
-
-      lag32 =  peakiq[best4q[k]];
-      fxq = &cv1q[peakiq[best4q[k]]-1];
-      xq[0]= lag32;
-      xq[0] <<= 8;
-      Intrp1DQ8(xq, fxq, yq, fyq);
-
-      tmp32a= WebRtcIsacfix_Log2Q8((uint32_t) *yq) - 2048; // offset 8*2^8
-      /* Bias towards short lags */
-      /* log(pow(0.8, log(2.0 * *y )))/log(2.0) */
-      tmp32b = (int16_t)tmp32a * -42 >> 8;
-      tmp32c= tmp32b + 256;
-      *fyq += tmp32c;
-      if (*fyq > corr_max32) {
-        corr_max32 = *fyq;
-        best_lag1q = *yq;
-      }
-    }
-    tmp32b = (best_lag1q - OFFSET_Q8) * 2;
-    lagsQ8[0] = tmp32b + PITCH_MIN_LAG_Q8;
-    lagsQ8[1] = lagsQ8[0];
-  } else {
-    lagsQ8[0] = old_lagQ8;
-    lagsQ8[1] = lagsQ8[0];
-  }
-
-  /* Bias towards constant pitch */
-  tmp32a = lagsQ8[0] - PITCH_MIN_LAG_Q8;
-  ratq = (tmp32a >> 1) + OFFSET_Q8;
-
-  for (k = 1; k <= PITCH_LAG_SPAN2; k++)
-  {
-    tmp32a = k << 7; // 0.5*k Q8
-    tmp32b = tmp32a * 2 - ratq;  // Q8
-    tmp32c = (int16_t)tmp32b * (int16_t)tmp32b >> 8;  // Q8
-
-    tmp32b = tmp32c + (ratq >> 1);
-        // (k-r)^2 + 0.5 * r  Q8
-    tmp32c = WebRtcIsacfix_Log2Q8((uint32_t)tmp32a) - 2048;
-        // offset 8*2^8 , log2(0.5*k) Q8
-    tmp32d = WebRtcIsacfix_Log2Q8((uint32_t)tmp32b) - 2048;
-        // offset 8*2^8 , log2(0.5*k) Q8
-    tmp32e =  tmp32c - tmp32d;
-
-    cv2q[k] += tmp32e >> 1;
-
-  }
-
-  /* find peaks in corr2 */
-  corr_max32 = corr_max_o32;
-  peaks_indq = 0;
-
-  for (k = 1; k <= PITCH_LAG_SPAN2; k++)
-  {
-    corr=cv2q[k];
-    if (corr>corr_max32) { // Disregard small peaks
-      if ((corr>=cv2q[k-1]) && (corr>cv2q[k+1])) { // Peak?
-        peakvq[peaks_indq] = corr;
-        peakiq[peaks_indq++] = k;
-      }
-    }
-  }
-
-
-
-  /* find highest interpolated peak */
-  corr_max32 = 0;
-  best_lag2q =0;
-  if (peaks_indq > 0) {
-
-    FindFour32(peakvq, (int16_t) peaks_indq, best4q);
-    npkq = WEBRTC_SPL_MIN(peaks_indq, 4);
-    for (k=0;k<npkq;k++) {
-
-      lag32 =  peakiq[best4q[k]];
-      fxq = &cv2q[peakiq[best4q[k]]-1];
-
-      xq[0]= lag32;
-      xq[0] <<= 8;
-      Intrp1DQ8(xq, fxq, yq, fyq);
-
-      /* Bias towards short lags */
-      /* log(pow(0.8, log(2.0f * *y )))/log(2.0f) */
-      tmp32a= WebRtcIsacfix_Log2Q8((uint32_t) *yq) - 2048; // offset 8*2^8
-      tmp32b = (int16_t)tmp32a * -82 >> 8;
-      tmp32c= tmp32b + 256;
-      *fyq += tmp32c;
-      if (*fyq > corr_max32) {
-        corr_max32 = *fyq;
-        best_lag2q = *yq;
-      }
-    }
-
-    tmp32b = (best_lag2q - OFFSET_Q8) * 2;
-    lagsQ8[2] = tmp32b + PITCH_MIN_LAG_Q8;
-    lagsQ8[3] = lagsQ8[2];
-  } else {
-    lagsQ8[2] = lagsQ8[0];
-    lagsQ8[3] = lagsQ8[0];
-  }
-
-  lagsQ7[0] = (int16_t)(lagsQ8[0] >> 1);
-  lagsQ7[1] = (int16_t)(lagsQ8[1] >> 1);
-  lagsQ7[2] = (int16_t)(lagsQ8[2] >> 1);
-  lagsQ7[3] = (int16_t)(lagsQ8[3] >> 1);
-}
-
-
-
-void WebRtcIsacfix_PitchAnalysis(const int16_t *inn,               /* PITCH_FRAME_LEN samples */
-                                 int16_t *outQ0,                  /* PITCH_FRAME_LEN+QLOOKAHEAD samples */
-                                 PitchAnalysisStruct *State,
-                                 int16_t *PitchLags_Q7,
-                                 int16_t *PitchGains_Q12)
-{
-  int16_t inbufQ0[PITCH_FRAME_LEN + QLOOKAHEAD];
-  int16_t k;
-
-  /* inital pitch estimate */
-  WebRtcIsacfix_InitialPitch(inn, State,  PitchLags_Q7);
-
-
-  /* Calculate gain */
-  WebRtcIsacfix_PitchFilterGains(inn, &(State->PFstr_wght), PitchLags_Q7, PitchGains_Q12);
-
-  /* concatenate previous input's end and current input */
-  for (k = 0; k < QLOOKAHEAD; k++) {
-    inbufQ0[k] = State->inbuf[k];
-  }
-  for (k = 0; k < PITCH_FRAME_LEN; k++) {
-    inbufQ0[k+QLOOKAHEAD] = (int16_t) inn[k];
-  }
-
-  /* lookahead pitch filtering for masking analysis */
-  WebRtcIsacfix_PitchFilter(inbufQ0, outQ0, &(State->PFstr), PitchLags_Q7,PitchGains_Q12, 2);
-
-
-  /* store last part of input */
-  for (k = 0; k < QLOOKAHEAD; k++) {
-    State->inbuf[k] = inbufQ0[k + PITCH_FRAME_LEN];
-  }
-}
diff --git a/modules/audio_coding/codecs/isac/fix/source/pitch_estimator.h b/modules/audio_coding/codecs/isac/fix/source/pitch_estimator.h
deleted file mode 100644
index 40f15c4..0000000
--- a/modules/audio_coding/codecs/isac/fix/source/pitch_estimator.h
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- *  Copyright (c) 2012 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.
- */
-
-/*
- * pitch_estimator.h
- *
- * Pitch functions
- *
- */
-
-#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_FIX_SOURCE_PITCH_ESTIMATOR_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_FIX_SOURCE_PITCH_ESTIMATOR_H_
-
-#include "structs.h"
-
-void WebRtcIsacfix_PitchAnalysis(const int16_t *in,               /* PITCH_FRAME_LEN samples */
-                                 int16_t *outQ0,                  /* PITCH_FRAME_LEN+QLOOKAHEAD samples */
-                                 PitchAnalysisStruct *State,
-                                 int16_t *lagsQ7,
-                                 int16_t *PitchGains_Q12);
-
-void WebRtcIsacfix_InitialPitch(const int16_t *in,
-                                PitchAnalysisStruct *State,
-                                int16_t *qlags);
-
-void WebRtcIsacfix_PitchFilter(int16_t *indatFix,
-                               int16_t *outdatQQ,
-                               PitchFiltstr *pfp,
-                               int16_t *lagsQ7,
-                               int16_t *gainsQ12,
-                               int16_t type);
-
-void WebRtcIsacfix_PitchFilterCore(int loopNumber,
-                                   int16_t gain,
-                                   size_t index,
-                                   int16_t sign,
-                                   int16_t* inputState,
-                                   int16_t* outputBuff2,
-                                   const int16_t* coefficient,
-                                   int16_t* inputBuf,
-                                   int16_t* outputBuf,
-                                   int* index2);
-
-void WebRtcIsacfix_PitchFilterGains(const int16_t *indatQ0,
-                                    PitchFiltstr *pfp,
-                                    int16_t *lagsQ7,
-                                    int16_t *gainsQ12);
-
-void WebRtcIsacfix_DecimateAllpass32(const int16_t *in,
-                                     int32_t *state_in,        /* array of size: 2*ALLPASSSECTIONS+1 */
-                                     int16_t N,                   /* number of input samples */
-                                     int16_t *out);             /* array of size N/2 */
-
-int32_t WebRtcIsacfix_Log2Q8( uint32_t x );
-
-void WebRtcIsacfix_PCorr2Q32(const int16_t* in, int32_t* logcorQ8);
-
-#endif /* WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_FIX_SOURCE_PITCH_ESTIMATOR_H_ */
diff --git a/modules/audio_coding/codecs/isac/fix/source/pitch_estimator_c.c b/modules/audio_coding/codecs/isac/fix/source/pitch_estimator_c.c
deleted file mode 100644
index 81ec1d6..0000000
--- a/modules/audio_coding/codecs/isac/fix/source/pitch_estimator_c.c
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- *  Copyright (c) 2014 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/codecs/isac/fix/source/pitch_estimator.h"
-
-#ifdef WEBRTC_HAS_NEON
-#include <arm_neon.h>
-#endif
-
-#include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
-#include "webrtc/rtc_base/compile_assert_c.h"
-
-extern int32_t WebRtcIsacfix_Log2Q8(uint32_t x);
-
-void WebRtcIsacfix_PCorr2Q32(const int16_t* in, int32_t* logcorQ8) {
-  int16_t scaling,n,k;
-  int32_t ysum32,csum32, lys, lcs;
-  const int32_t oneQ8 = 1 << 8;  // 1.00 in Q8
-  const int16_t* x;
-  const int16_t* inptr;
-
-  x = in + PITCH_MAX_LAG / 2 + 2;
-  scaling = WebRtcSpl_GetScalingSquare((int16_t*)in,
-                                       PITCH_CORR_LEN2,
-                                       PITCH_CORR_LEN2);
-  ysum32 = 1;
-  csum32 = 0;
-  x = in + PITCH_MAX_LAG / 2 + 2;
-  for (n = 0; n < PITCH_CORR_LEN2; n++) {
-    ysum32 += in[n] * in[n] >> scaling;  // Q0
-    csum32 += x[n] * in[n] >> scaling;  // Q0
-  }
-  logcorQ8 += PITCH_LAG_SPAN2 - 1;
-  lys = WebRtcIsacfix_Log2Q8((uint32_t)ysum32) >> 1; // Q8, sqrt(ysum)
-  if (csum32 > 0) {
-    lcs = WebRtcIsacfix_Log2Q8((uint32_t)csum32);  // 2log(csum) in Q8
-    if (lcs > (lys + oneQ8)) {          // csum/sqrt(ysum) > 2 in Q8
-      *logcorQ8 = lcs - lys;            // log2(csum/sqrt(ysum))
-    } else {
-      *logcorQ8 = oneQ8;                // 1.00
-    }
-  } else {
-    *logcorQ8 = 0;
-  }
-
-
-  for (k = 1; k < PITCH_LAG_SPAN2; k++) {
-    inptr = &in[k];
-    ysum32 -= in[k - 1] * in[k - 1] >> scaling;
-    ysum32 += in[PITCH_CORR_LEN2 + k - 1] * in[PITCH_CORR_LEN2 + k - 1] >>
-        scaling;
-
-#ifdef WEBRTC_HAS_NEON
-    {
-      int32_t vbuff[4];
-      int32x4_t int_32x4_sum = vmovq_n_s32(0);
-      // Can't shift a Neon register to right with a non-constant shift value.
-      int32x4_t int_32x4_scale = vdupq_n_s32(-scaling);
-      // Assert a codition used in loop unrolling at compile-time.
-      RTC_COMPILE_ASSERT(PITCH_CORR_LEN2 %4 == 0);
-
-      for (n = 0; n < PITCH_CORR_LEN2; n += 4) {
-        int16x4_t int_16x4_x = vld1_s16(&x[n]);
-        int16x4_t int_16x4_in = vld1_s16(&inptr[n]);
-        int32x4_t int_32x4 = vmull_s16(int_16x4_x, int_16x4_in);
-        int_32x4 = vshlq_s32(int_32x4, int_32x4_scale);
-        int_32x4_sum = vaddq_s32(int_32x4_sum, int_32x4);
-      }
-
-      // Use vector store to avoid long stall from data trasferring
-      // from vector to general register.
-      vst1q_s32(vbuff, int_32x4_sum);
-      csum32 = vbuff[0] + vbuff[1];
-      csum32 += vbuff[2];
-      csum32 += vbuff[3];
-    }
-#else
-    csum32 = 0;
-    if(scaling == 0) {
-      for (n = 0; n < PITCH_CORR_LEN2; n++) {
-        csum32 += x[n] * inptr[n];
-      }
-    } else {
-      for (n = 0; n < PITCH_CORR_LEN2; n++) {
-        csum32 += (x[n] * inptr[n]) >> scaling;
-      }
-    }
-#endif
-
-    logcorQ8--;
-
-    lys = WebRtcIsacfix_Log2Q8((uint32_t)ysum32) >> 1; // Q8, sqrt(ysum)
-
-    if (csum32 > 0) {
-      lcs = WebRtcIsacfix_Log2Q8((uint32_t)csum32);  // 2log(csum) in Q8
-      if (lcs > (lys + oneQ8)) {          // csum/sqrt(ysum) > 2
-        *logcorQ8 = lcs - lys;            // log2(csum/sqrt(ysum))
-      } else {
-        *logcorQ8 = oneQ8;                // 1.00
-      }
-    } else {
-      *logcorQ8 = 0;
-    }
-  }
-}
diff --git a/modules/audio_coding/codecs/isac/fix/source/pitch_estimator_mips.c b/modules/audio_coding/codecs/isac/fix/source/pitch_estimator_mips.c
deleted file mode 100644
index a76ed7d..0000000
--- a/modules/audio_coding/codecs/isac/fix/source/pitch_estimator_mips.c
+++ /dev/null
@@ -1,193 +0,0 @@
-/*
- *  Copyright (c) 2011 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/codecs/isac/fix/source/pitch_estimator.h"
-#include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
-#include "webrtc/rtc_base/compile_assert_c.h"
-
-extern int32_t WebRtcIsacfix_Log2Q8(uint32_t x);
-
-void WebRtcIsacfix_PCorr2Q32(const int16_t* in, int32_t* logcorQ8) {
-  int16_t scaling,n,k;
-  int32_t ysum32,csum32, lys, lcs;
-  const int32_t oneQ8 = 1 << 8;  // 1.00 in Q8
-  const int16_t* x;
-  const int16_t* inptr;
-
-  x = in + PITCH_MAX_LAG / 2 + 2;
-  scaling = WebRtcSpl_GetScalingSquare((int16_t*)in,
-                                       PITCH_CORR_LEN2,
-                                       PITCH_CORR_LEN2);
-  ysum32 = 1;
-  csum32 = 0;
-  x = in + PITCH_MAX_LAG / 2 + 2;
-  {
-    const int16_t* tmp_x = x;
-    const int16_t* tmp_in = in;
-    int32_t tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7, tmp8;
-    n = PITCH_CORR_LEN2;
-    RTC_COMPILE_ASSERT(PITCH_CORR_LEN2 % 4 == 0);
-    __asm __volatile (
-      ".set       push                                          \n\t"
-      ".set       noreorder                                     \n\t"
-     "1:                                                        \n\t"
-      "lh         %[tmp1],       0(%[tmp_in])                   \n\t"
-      "lh         %[tmp2],       2(%[tmp_in])                   \n\t"
-      "lh         %[tmp3],       4(%[tmp_in])                   \n\t"
-      "lh         %[tmp4],       6(%[tmp_in])                   \n\t"
-      "lh         %[tmp5],       0(%[tmp_x])                    \n\t"
-      "lh         %[tmp6],       2(%[tmp_x])                    \n\t"
-      "lh         %[tmp7],       4(%[tmp_x])                    \n\t"
-      "lh         %[tmp8],       6(%[tmp_x])                    \n\t"
-      "mul        %[tmp5],       %[tmp1],        %[tmp5]        \n\t"
-      "mul        %[tmp1],       %[tmp1],        %[tmp1]        \n\t"
-      "mul        %[tmp6],       %[tmp2],        %[tmp6]        \n\t"
-      "mul        %[tmp2],       %[tmp2],        %[tmp2]        \n\t"
-      "mul        %[tmp7],       %[tmp3],        %[tmp7]        \n\t"
-      "mul        %[tmp3],       %[tmp3],        %[tmp3]        \n\t"
-      "mul        %[tmp8],       %[tmp4],        %[tmp8]        \n\t"
-      "mul        %[tmp4],       %[tmp4],        %[tmp4]        \n\t"
-      "addiu      %[n],          %[n],           -4             \n\t"
-      "srav       %[tmp5],       %[tmp5],        %[scaling]     \n\t"
-      "srav       %[tmp1],       %[tmp1],        %[scaling]     \n\t"
-      "srav       %[tmp6],       %[tmp6],        %[scaling]     \n\t"
-      "srav       %[tmp2],       %[tmp2],        %[scaling]     \n\t"
-      "srav       %[tmp7],       %[tmp7],        %[scaling]     \n\t"
-      "srav       %[tmp3],       %[tmp3],        %[scaling]     \n\t"
-      "srav       %[tmp8],       %[tmp8],        %[scaling]     \n\t"
-      "srav       %[tmp4],       %[tmp4],        %[scaling]     \n\t"
-      "addu       %[ysum32],     %[ysum32],      %[tmp1]        \n\t"
-      "addu       %[csum32],     %[csum32],      %[tmp5]        \n\t"
-      "addu       %[ysum32],     %[ysum32],      %[tmp2]        \n\t"
-      "addu       %[csum32],     %[csum32],      %[tmp6]        \n\t"
-      "addu       %[ysum32],     %[ysum32],      %[tmp3]        \n\t"
-      "addu       %[csum32],     %[csum32],      %[tmp7]        \n\t"
-      "addu       %[ysum32],     %[ysum32],      %[tmp4]        \n\t"
-      "addu       %[csum32],     %[csum32],      %[tmp8]        \n\t"
-      "addiu      %[tmp_in],     %[tmp_in],      8              \n\t"
-      "bgtz       %[n],          1b                             \n\t"
-      " addiu     %[tmp_x],      %[tmp_x],       8              \n\t"
-      ".set       pop                                           \n\t"
-      : [tmp1] "=&r" (tmp1), [tmp2] "=&r" (tmp2), [tmp3] "=&r" (tmp3),
-        [tmp4] "=&r" (tmp4), [tmp5] "=&r" (tmp5), [tmp6] "=&r" (tmp6),
-        [tmp7] "=&r" (tmp7), [tmp8] "=&r" (tmp8), [tmp_in] "+r" (tmp_in),
-        [ysum32] "+r" (ysum32), [tmp_x] "+r" (tmp_x), [csum32] "+r" (csum32),
-        [n] "+r" (n)
-      : [scaling] "r" (scaling)
-      : "memory", "hi", "lo"
-    );
-  }
-  logcorQ8 += PITCH_LAG_SPAN2 - 1;
-  lys = WebRtcIsacfix_Log2Q8((uint32_t)ysum32) >> 1; // Q8, sqrt(ysum)
-  if (csum32 > 0) {
-    lcs = WebRtcIsacfix_Log2Q8((uint32_t)csum32);  // 2log(csum) in Q8
-    if (lcs > (lys + oneQ8)) {  // csum/sqrt(ysum) > 2 in Q8
-      *logcorQ8 = lcs - lys;  // log2(csum/sqrt(ysum))
-    } else {
-      *logcorQ8 = oneQ8;  // 1.00
-    }
-  } else {
-    *logcorQ8 = 0;
-  }
-
-  for (k = 1; k < PITCH_LAG_SPAN2; k++) {
-    inptr = &in[k];
-    const int16_t* tmp_in1 = &in[k - 1];
-    const int16_t* tmp_in2 = &in[PITCH_CORR_LEN2 + k - 1];
-    const int16_t* tmp_x = x;
-    int32_t tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7, tmp8;
-    n = PITCH_CORR_LEN2;
-    csum32 = 0;
-    __asm __volatile (
-      ".set       push                                             \n\t"
-      ".set       noreorder                                        \n\t"
-      "lh         %[tmp1],        0(%[tmp_in1])                    \n\t"
-      "lh         %[tmp2],        0(%[tmp_in2])                    \n\t"
-      "mul        %[tmp1],        %[tmp1],         %[tmp1]         \n\t"
-      "mul        %[tmp2],        %[tmp2],         %[tmp2]         \n\t"
-      "srav       %[tmp1],        %[tmp1],         %[scaling]      \n\t"
-      "srav       %[tmp2],        %[tmp2],         %[scaling]      \n\t"
-      "subu       %[ysum32],      %[ysum32],       %[tmp1]         \n\t"
-      "bnez       %[scaling],     2f                               \n\t"
-      " addu      %[ysum32],      %[ysum32],       %[tmp2]         \n\t"
-     "1:                                                           \n\t"
-      "lh         %[tmp1],        0(%[inptr])                      \n\t"
-      "lh         %[tmp2],        0(%[tmp_x])                      \n\t"
-      "lh         %[tmp3],        2(%[inptr])                      \n\t"
-      "lh         %[tmp4],        2(%[tmp_x])                      \n\t"
-      "lh         %[tmp5],        4(%[inptr])                      \n\t"
-      "lh         %[tmp6],        4(%[tmp_x])                      \n\t"
-      "lh         %[tmp7],        6(%[inptr])                      \n\t"
-      "lh         %[tmp8],        6(%[tmp_x])                      \n\t"
-      "mul        %[tmp1],        %[tmp1],         %[tmp2]         \n\t"
-      "mul        %[tmp2],        %[tmp3],         %[tmp4]         \n\t"
-      "mul        %[tmp3],        %[tmp5],         %[tmp6]         \n\t"
-      "mul        %[tmp4],        %[tmp7],         %[tmp8]         \n\t"
-      "addiu      %[n],           %[n],            -4              \n\t"
-      "addiu      %[inptr],       %[inptr],        8               \n\t"
-      "addiu      %[tmp_x],       %[tmp_x],        8               \n\t"
-      "addu       %[csum32],      %[csum32],       %[tmp1]         \n\t"
-      "addu       %[csum32],      %[csum32],       %[tmp2]         \n\t"
-      "addu       %[csum32],      %[csum32],       %[tmp3]         \n\t"
-      "bgtz       %[n],           1b                               \n\t"
-      " addu      %[csum32],      %[csum32],       %[tmp4]         \n\t"
-      "b          3f                                               \n\t"
-      " nop                                                        \n\t"
-     "2:                                                           \n\t"
-      "lh         %[tmp1],        0(%[inptr])                      \n\t"
-      "lh         %[tmp2],        0(%[tmp_x])                      \n\t"
-      "lh         %[tmp3],        2(%[inptr])                      \n\t"
-      "lh         %[tmp4],        2(%[tmp_x])                      \n\t"
-      "lh         %[tmp5],        4(%[inptr])                      \n\t"
-      "lh         %[tmp6],        4(%[tmp_x])                      \n\t"
-      "lh         %[tmp7],        6(%[inptr])                      \n\t"
-      "lh         %[tmp8],        6(%[tmp_x])                      \n\t"
-      "mul        %[tmp1],        %[tmp1],         %[tmp2]         \n\t"
-      "mul        %[tmp2],        %[tmp3],         %[tmp4]         \n\t"
-      "mul        %[tmp3],        %[tmp5],         %[tmp6]         \n\t"
-      "mul        %[tmp4],        %[tmp7],         %[tmp8]         \n\t"
-      "addiu      %[n],           %[n],            -4              \n\t"
-      "addiu      %[inptr],       %[inptr],        8               \n\t"
-      "addiu      %[tmp_x],       %[tmp_x],        8               \n\t"
-      "srav       %[tmp1],        %[tmp1],         %[scaling]      \n\t"
-      "srav       %[tmp2],        %[tmp2],         %[scaling]      \n\t"
-      "srav       %[tmp3],        %[tmp3],         %[scaling]      \n\t"
-      "srav       %[tmp4],        %[tmp4],         %[scaling]      \n\t"
-      "addu       %[csum32],      %[csum32],       %[tmp1]         \n\t"
-      "addu       %[csum32],      %[csum32],       %[tmp2]         \n\t"
-      "addu       %[csum32],      %[csum32],       %[tmp3]         \n\t"
-      "bgtz       %[n],           2b                               \n\t"
-      " addu      %[csum32],      %[csum32],       %[tmp4]         \n\t"
-     "3:                                                           \n\t"
-      ".set       pop                                              \n\t"
-      : [tmp1] "=&r" (tmp1), [tmp2] "=&r" (tmp2), [tmp3] "=&r" (tmp3),
-        [tmp4] "=&r" (tmp4), [tmp5] "=&r" (tmp5), [tmp6] "=&r" (tmp6),
-        [tmp7] "=&r" (tmp7), [tmp8] "=&r" (tmp8), [inptr] "+r" (inptr),
-        [csum32] "+r" (csum32), [tmp_x] "+r" (tmp_x), [ysum32] "+r" (ysum32),
-        [n] "+r" (n)
-      : [tmp_in1] "r" (tmp_in1), [tmp_in2] "r" (tmp_in2),
-        [scaling] "r" (scaling)
-      : "memory", "hi", "lo"
-    );
-
-    logcorQ8--;
-    lys = WebRtcIsacfix_Log2Q8((uint32_t)ysum32) >> 1; // Q8, sqrt(ysum)
-    if (csum32 > 0) {
-      lcs = WebRtcIsacfix_Log2Q8((uint32_t)csum32); // 2log(csum) in Q8
-      if (lcs > (lys + oneQ8)) { // csum/sqrt(ysum) > 2
-        *logcorQ8 = lcs - lys;  // log2(csum/sqrt(ysum))
-      } else {
-        *logcorQ8 = oneQ8;  // 1.00
-      }
-    } else {
-      *logcorQ8 = 0;
-    }
-  }
-}
diff --git a/modules/audio_coding/codecs/isac/fix/source/pitch_filter.c b/modules/audio_coding/codecs/isac/fix/source/pitch_filter.c
deleted file mode 100644
index bcd6038..0000000
--- a/modules/audio_coding/codecs/isac/fix/source/pitch_filter.c
+++ /dev/null
@@ -1,248 +0,0 @@
-/*
- *  Copyright (c) 2012 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/codecs/isac/fix/source/pitch_estimator.h"
-
-#include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
-#include "webrtc/modules/audio_coding/codecs/isac/fix/source/settings.h"
-#include "webrtc/modules/audio_coding/codecs/isac/fix/source/structs.h"
-#include "webrtc/rtc_base/compile_assert_c.h"
-
-// Number of segments in a pitch subframe.
-static const int kSegments = 5;
-
-// A division factor of 1/5 in Q15.
-static const int16_t kDivFactor = 6553;
-
-// Interpolation coefficients; generated by design_pitch_filter.m.
-// Coefficients are stored in Q14.
-static const int16_t kIntrpCoef[PITCH_FRACS][PITCH_FRACORDER] = {
-  {-367, 1090, -2706,  9945, 10596, -3318,  1626, -781,  287},
-  {-325,  953, -2292,  7301, 12963, -3320,  1570, -743,  271},
-  {-240,  693, -1622,  4634, 14809, -2782,  1262, -587,  212},
-  {-125,  358,  -817,  2144, 15982, -1668,   721, -329,  118},
-  {   0,    0,    -1,     1, 16380,     1,    -1,    0,    0},
-  { 118, -329,   721, -1668, 15982,  2144,  -817,  358, -125},
-  { 212, -587,  1262, -2782, 14809,  4634, -1622,  693, -240},
-  { 271, -743,  1570, -3320, 12963,  7301, -2292,  953, -325}
-};
-
-static __inline size_t CalcLrIntQ(int16_t fixVal,
-                                  int16_t qDomain) {
-  int32_t roundVal = 1 << (qDomain - 1);
-
-  return (fixVal + roundVal) >> qDomain;
-}
-
-void WebRtcIsacfix_PitchFilter(int16_t* indatQQ, // Q10 if type is 1 or 4,
-                                                       // Q0 if type is 2.
-                               int16_t* outdatQQ,
-                               PitchFiltstr* pfp,
-                               int16_t* lagsQ7,
-                               int16_t* gainsQ12,
-                               int16_t type) {
-  int    k, ind, cnt;
-  int16_t sign = 1;
-  int16_t inystateQQ[PITCH_DAMPORDER];
-  int16_t ubufQQ[PITCH_INTBUFFSIZE + QLOOKAHEAD];
-  const int16_t Gain = 21299;     // 1.3 in Q14
-  int16_t oldLagQ7;
-  int16_t oldGainQ12, lagdeltaQ7, curLagQ7, gaindeltaQ12, curGainQ12;
-  size_t indW32 = 0, frcQQ = 0;
-  const int16_t* fracoeffQQ = NULL;
-
-  // Assumptions in ARM assembly for WebRtcIsacfix_PitchFilterCoreARM().
-  RTC_COMPILE_ASSERT(PITCH_FRACORDER == 9);
-  RTC_COMPILE_ASSERT(PITCH_DAMPORDER == 5);
-
-  // Set up buffer and states.
-  memcpy(ubufQQ, pfp->ubufQQ, sizeof(pfp->ubufQQ));
-  memcpy(inystateQQ, pfp->ystateQQ, sizeof(inystateQQ));
-
-  // Get old lag and gain value from memory.
-  oldLagQ7 = pfp->oldlagQ7;
-  oldGainQ12 = pfp->oldgainQ12;
-
-  if (type == 4) {
-    sign = -1;
-
-    // Make output more periodic.
-    for (k = 0; k < PITCH_SUBFRAMES; k++) {
-      gainsQ12[k] = (int16_t)(gainsQ12[k] * Gain >> 14);
-    }
-  }
-
-  // No interpolation if pitch lag step is big.
-  if (((lagsQ7[0] * 3 >> 1) < oldLagQ7) || (lagsQ7[0] > (oldLagQ7 * 3 >> 1))) {
-    oldLagQ7 = lagsQ7[0];
-    oldGainQ12 = gainsQ12[0];
-  }
-
-  ind = 0;
-
-  for (k = 0; k < PITCH_SUBFRAMES; k++) {
-    // Calculate interpolation steps.
-    lagdeltaQ7 = lagsQ7[k] - oldLagQ7;
-    lagdeltaQ7 = (int16_t)WEBRTC_SPL_MUL_16_16_RSFT_WITH_ROUND(
-                  lagdeltaQ7, kDivFactor, 15);
-    curLagQ7 = oldLagQ7;
-    gaindeltaQ12 = gainsQ12[k] - oldGainQ12;
-    gaindeltaQ12 = (int16_t)(gaindeltaQ12 * kDivFactor >> 15);
-
-    curGainQ12 = oldGainQ12;
-    oldLagQ7 = lagsQ7[k];
-    oldGainQ12 = gainsQ12[k];
-
-    // Each frame has 4 60-sample pitch subframes, and each subframe has 5
-    // 12-sample segments. Each segment need to be processed with
-    // newly-updated parameters, so we break the pitch filtering into
-    // two for-loops (5 x 12) below. It's also why kDivFactor = 0.2 (in Q15).
-    for (cnt = 0; cnt < kSegments; cnt++) {
-      // Update parameters for each segment.
-      curGainQ12 += gaindeltaQ12;
-      curLagQ7 += lagdeltaQ7;
-      indW32 = CalcLrIntQ(curLagQ7, 7);
-      if (indW32 < PITCH_FRACORDER - 2) {
-        // WebRtcIsacfix_PitchFilterCore requires indW32 >= PITCH_FRACORDER -
-        // 2; otherwise, it will read from entries of ubufQQ that haven't been
-        // written yet. (This problem has only been seen in fuzzer tests, not
-        // in real life.) See Chromium bug 581901.
-        indW32 = PITCH_FRACORDER - 2;
-      }
-      frcQQ = ((indW32 << 7) + 64 - curLagQ7) >> 4;
-
-      if (frcQQ >= PITCH_FRACS) {
-        frcQQ = 0;
-      }
-      fracoeffQQ = kIntrpCoef[frcQQ];
-
-      // Pitch filtering.
-      WebRtcIsacfix_PitchFilterCore(PITCH_SUBFRAME_LEN / kSegments, curGainQ12,
-        indW32, sign, inystateQQ, ubufQQ, fracoeffQQ, indatQQ, outdatQQ, &ind);
-    }
-  }
-
-  // Export buffer and states.
-  memcpy(pfp->ubufQQ, ubufQQ + PITCH_FRAME_LEN, sizeof(pfp->ubufQQ));
-  memcpy(pfp->ystateQQ, inystateQQ, sizeof(pfp->ystateQQ));
-
-  pfp->oldlagQ7 = oldLagQ7;
-  pfp->oldgainQ12 = oldGainQ12;
-
-  if (type == 2) {
-    // Filter look-ahead segment.
-    WebRtcIsacfix_PitchFilterCore(QLOOKAHEAD, curGainQ12, indW32, 1, inystateQQ,
-                ubufQQ, fracoeffQQ, indatQQ, outdatQQ, &ind);
-  }
-}
-
-
-void WebRtcIsacfix_PitchFilterGains(const int16_t* indatQ0,
-                                    PitchFiltstr* pfp,
-                                    int16_t* lagsQ7,
-                                    int16_t* gainsQ12) {
-  int  k, n, m;
-  size_t ind, pos, pos3QQ;
-
-  int16_t ubufQQ[PITCH_INTBUFFSIZE];
-  int16_t oldLagQ7, lagdeltaQ7, curLagQ7;
-  const int16_t* fracoeffQQ = NULL;
-  int16_t scale;
-  int16_t cnt = 0, tmpW16;
-  size_t frcQQ, indW16 = 0;
-  int32_t tmpW32, tmp2W32, csum1QQ, esumxQQ;
-
-  // Set up buffer and states.
-  memcpy(ubufQQ, pfp->ubufQQ, sizeof(pfp->ubufQQ));
-  oldLagQ7 = pfp->oldlagQ7;
-
-  // No interpolation if pitch lag step is big.
-  if (((lagsQ7[0] * 3 >> 1) < oldLagQ7) || (lagsQ7[0] > (oldLagQ7 * 3 >> 1))) {
-    oldLagQ7 = lagsQ7[0];
-  }
-
-  ind = 0;
-  pos = ind + PITCH_BUFFSIZE;
-  scale = 0;
-  for (k = 0; k < PITCH_SUBFRAMES; k++) {
-
-    // Calculate interpolation steps.
-    lagdeltaQ7 = lagsQ7[k] - oldLagQ7;
-    lagdeltaQ7 = (int16_t)WEBRTC_SPL_MUL_16_16_RSFT_WITH_ROUND(
-                   lagdeltaQ7, kDivFactor, 15);
-    curLagQ7 = oldLagQ7;
-    oldLagQ7 = lagsQ7[k];
-
-    csum1QQ = 1;
-    esumxQQ = 1;
-
-    // Same as function WebRtcIsacfix_PitchFilter(), we break the pitch
-    // filtering into two for-loops (5 x 12) below.
-    for (cnt = 0; cnt < kSegments; cnt++) {
-      // Update parameters for each segment.
-      curLagQ7 += lagdeltaQ7;
-      indW16 = CalcLrIntQ(curLagQ7, 7);
-      frcQQ = ((indW16 << 7) + 64 - curLagQ7) >> 4;
-
-      if (frcQQ >= PITCH_FRACS) {
-        frcQQ = 0;
-      }
-      fracoeffQQ = kIntrpCoef[frcQQ];
-
-      pos3QQ = pos - (indW16 + 4);
-
-      for (n = 0; n < PITCH_SUBFRAME_LEN / kSegments; n++) {
-        // Filter to get fractional pitch.
-
-        tmpW32 = 0;
-        for (m = 0; m < PITCH_FRACORDER; m++) {
-          tmpW32 += ubufQQ[pos3QQ + m] * fracoeffQQ[m];
-        }
-
-        // Subtract from input and update buffer.
-        ubufQQ[pos] = indatQ0[ind];
-
-        tmp2W32 = WEBRTC_SPL_MUL_16_32_RSFT14(indatQ0[ind], tmpW32);
-        tmpW32 += 8192;
-        tmpW16 = tmpW32 >> 14;
-        tmpW32 = tmpW16 * tmpW16;
-
-        if ((tmp2W32 > 1073700000) || (csum1QQ > 1073700000) ||
-            (tmpW32 > 1073700000) || (esumxQQ > 1073700000)) {  // 2^30
-          scale++;
-          csum1QQ >>= 1;
-          esumxQQ >>= 1;
-        }
-        csum1QQ += tmp2W32 >> scale;
-        esumxQQ += tmpW32 >> scale;
-
-        ind++;
-        pos++;
-        pos3QQ++;
-      }
-    }
-
-    if (csum1QQ < esumxQQ) {
-      tmp2W32 = WebRtcSpl_DivResultInQ31(csum1QQ, esumxQQ);
-
-      // Gain should be half the correlation.
-      tmpW32 = tmp2W32 >> 20;
-    } else {
-      tmpW32 = 4096;
-    }
-    gainsQ12[k] = (int16_t)WEBRTC_SPL_SAT(PITCH_MAX_GAIN_Q12, tmpW32, 0);
-  }
-
-  // Export buffer and states.
-  memcpy(pfp->ubufQQ, ubufQQ + PITCH_FRAME_LEN, sizeof(pfp->ubufQQ));
-  pfp->oldlagQ7 = lagsQ7[PITCH_SUBFRAMES - 1];
-  pfp->oldgainQ12 = gainsQ12[PITCH_SUBFRAMES - 1];
-
-}
diff --git a/modules/audio_coding/codecs/isac/fix/source/pitch_filter_armv6.S b/modules/audio_coding/codecs/isac/fix/source/pitch_filter_armv6.S
deleted file mode 100644
index bc18d44..0000000
--- a/modules/audio_coding/codecs/isac/fix/source/pitch_filter_armv6.S
+++ /dev/null
@@ -1,143 +0,0 @@
-@
-@ Copyright (c) 2012 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.
-@
-
-@ Contains the core loop routine for the pitch filter function in iSAC,
-@ optimized for ARMv7 platforms.
-@
-@ Output is bit-exact with the reference C code in pitch_filter.c.
-
-#include "webrtc/system_wrappers/include/asm_defines.h"
-#include "settings.h"
-
-GLOBAL_FUNCTION WebRtcIsacfix_PitchFilterCore
-.align  2
-
-@ void WebRtcIsacfix_PitchFilterCore(int loopNumber,
-@                                    int16_t gain,
-@                                    size_t index,
-@                                    int16_t sign,
-@                                    int16_t* inputState,
-@                                    int16_t* outputBuf2,
-@                                    const int16_t* coefficient,
-@                                    int16_t* inputBuf,
-@                                    int16_t* outputBuf,
-@                                    int* index2) {
-DEFINE_FUNCTION WebRtcIsacfix_PitchFilterCore
-  push {r4-r11}
-  sub sp, #8
-
-  str r0, [sp]                @ loopNumber
-  str r3, [sp, #4]            @ sign
-  ldr r3, [sp, #44]           @ outputBuf2
-  ldr r6, [sp, #60]           @ index2
-  ldr r7, [r6]                @ *index2
-  ldr r8, [sp, #52]           @ inputBuf
-  ldr r12, [sp, #56]          @ outputBuf
-
-  add r4, r7, r0
-  str r4, [r6]                @ Store return value to index2.
-
-  mov r10, r7, asl #1
-  add r12, r10                @ &outputBuf[*index2]
-  add r8, r10                 @ &inputBuf[*index2]
-
-  add r4, r7, #PITCH_BUFFSIZE @ *index2 + PITCH_BUFFSIZE
-  add r6, r3, r4, lsl #1      @ &outputBuf2[*index2 + PITCH_BUFFSIZE]
-  sub r4, r2                  @ r2: index
-  sub r4, #2                  @ *index2 + PITCH_BUFFSIZE - index - 2
-  add r3, r4, lsl #1          @ &ubufQQpos2[*index2]
-  ldr r9, [sp, #48]           @ coefficient
-
-LOOP:
-@ Usage of registers in the loop:
-@  r0: loop counter
-@  r1: gain
-@  r2: tmpW32
-@  r3: &ubufQQpos2[]
-@  r6: &outputBuf2[]
-@  r8: &inputBuf[]
-@  r9: &coefficient[]
-@  r12: &outputBuf[]
-@  r4, r5, r7, r10, r11: scratch
-
-  @ Filter to get fractional pitch.
-  @ The pitch filter loop here is unrolled with 9 multipications.
-  pld [r3]
-  ldr r10, [r3], #4           @ ubufQQpos2[*index2 + 0, *index2 + 1]
-  ldr r4, [r9], #4            @ coefficient[0, 1]
-  ldr r11, [r3], #4
-  ldr r5, [r9], #4
-  smuad r2, r10, r4
-  smlad r2, r11, r5, r2
-
-  ldr r10, [r3], #4
-  ldr r4, [r9], #4
-  ldr r11, [r3], #4
-  ldr r5, [r9], #4
-  smlad r2, r10, r4, r2
-  ldrh r10, [r3], #-14        @ r3 back to &ubufQQpos2[*index2].
-  ldrh  r4, [r9], #-16        @ r9 back to &coefficient[0].
-  smlad r2, r11, r5, r2
-  smlabb r2, r10, r4, r2
-
-  @ Saturate to avoid overflow in tmpW16.
-  asr r2, #1
-  add r4, r2, #0x1000
-  ssat r7, #16, r4, asr #13
-
-  @ Shift low pass filter state, and excute the low pass filter.
-  @ The memmove() and the low pass filter loop are unrolled and mixed.
-  smulbb r5, r1, r7
-  add r7, r5, #0x800
-  asr r7, #12                 @ Get the value for inputState[0].
-  ldr r11, [sp, #40]          @ inputState
-  pld [r11]
-  adr r10, kDampFilter
-  ldrsh r4, [r10], #2         @ kDampFilter[0]
-  mul r2, r7, r4
-  ldr r4, [r11]               @ inputState[0, 1], before shift.
-  strh r7, [r11]              @ inputState[0], after shift.
-  ldr r5, [r11, #4]           @ inputState[2, 3], before shift.
-  ldr r7, [r10], #4           @ kDampFilter[1, 2]
-  ldr r10, [r10]              @ kDampFilter[3, 4]
-  str r4, [r11, #2]           @ inputState[1, 2], after shift.
-  str r5, [r11, #6]           @ inputState[3, 4], after shift.
-  smlad r2, r4, r7, r2
-  smlad r2, r5, r10, r2
-
-  @ Saturate to avoid overflow.
-  @ First shift the sample to the range of [0xC0000000, 0x3FFFFFFF],
-  @ to avoid overflow in the next saturation step.
-  asr r2, #1
-  add r10, r2, #0x2000
-  ssat r10, #16, r10, asr #14
-
-  @ Subtract from input and update buffer.
-  ldr r11, [sp, #4]           @ sign
-  ldrsh r4, [r8]
-  ldrsh r7, [r8], #2          @ inputBuf[*index2]
-  smulbb r5, r11, r10
-  subs r0, #1
-  sub r4, r5
-  ssat r2, #16, r4
-  strh  r2, [r12], #2         @ outputBuf[*index2]
-
-  add r2, r7
-  ssat r2, #16, r2
-  strh  r2, [r6], #2          @ outputBuff2[*index2 + PITCH_BUFFSIZE]
-  bgt LOOP
-
-  add sp, #8
-  pop {r4-r11}
-  bx  lr
-
-.align  2
-kDampFilter:
-  .short  -2294, 8192, 20972, 8192, -2294
diff --git a/modules/audio_coding/codecs/isac/fix/source/pitch_filter_c.c b/modules/audio_coding/codecs/isac/fix/source/pitch_filter_c.c
deleted file mode 100644
index 366eef0..0000000
--- a/modules/audio_coding/codecs/isac/fix/source/pitch_filter_c.c
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- *  Copyright (c) 2012 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/common_audio/signal_processing/include/signal_processing_library.h"
-#include "webrtc/modules/audio_coding/codecs/isac/fix/source/pitch_estimator.h"
-
-/* Filter coefficicients in Q15. */
-static const int16_t kDampFilter[PITCH_DAMPORDER] = {
-  -2294, 8192, 20972, 8192, -2294
-};
-
-void WebRtcIsacfix_PitchFilterCore(int loopNumber,
-                                   int16_t gain,
-                                   size_t index,
-                                   int16_t sign,
-                                   int16_t* inputState,
-                                   int16_t* outputBuf2,
-                                   const int16_t* coefficient,
-                                   int16_t* inputBuf,
-                                   int16_t* outputBuf,
-                                   int* index2) {
-  int i = 0, j = 0;  /* Loop counters. */
-  int16_t* ubufQQpos2 = &outputBuf2[PITCH_BUFFSIZE - (index + 2)];
-  int16_t tmpW16 = 0;
-
-  for (i = 0; i < loopNumber; i++) {
-    int32_t tmpW32 = 0;
-
-    /* Filter to get fractional pitch. */
-    for (j = 0; j < PITCH_FRACORDER; j++) {
-      tmpW32 += ubufQQpos2[*index2 + j] * coefficient[j];
-    }
-
-    /* Saturate to avoid overflow in tmpW16. */
-    tmpW32 = WEBRTC_SPL_SAT(536862719, tmpW32, -536879104);
-    tmpW32 += 8192;
-    tmpW16 = (int16_t)(tmpW32 >> 14);
-
-    /* Shift low pass filter state. */
-    memmove(&inputState[1], &inputState[0],
-            (PITCH_DAMPORDER - 1) * sizeof(int16_t));
-    inputState[0] = (int16_t)WEBRTC_SPL_MUL_16_16_RSFT_WITH_ROUND(
-                      gain, tmpW16, 12);
-
-    /* Low pass filter. */
-    tmpW32 = 0;
-    /* TODO(kma): Define a static inline function WebRtcSpl_DotProduct()
-       in spl_inl.h to replace this and other similar loops. */
-    for (j = 0; j < PITCH_DAMPORDER; j++) {
-      tmpW32 += inputState[j] * kDampFilter[j];
-    }
-
-    /* Saturate to avoid overflow in tmpW16. */
-    tmpW32 = WEBRTC_SPL_SAT(1073725439, tmpW32, -1073758208);
-    tmpW32 += 16384;
-    tmpW16 = (int16_t)(tmpW32 >> 15);
-
-    /* Subtract from input and update buffer. */
-    tmpW32 = inputBuf[*index2] - sign * tmpW16;
-    outputBuf[*index2] = WebRtcSpl_SatW32ToW16(tmpW32);
-    tmpW32 = inputBuf[*index2] + outputBuf[*index2];
-    outputBuf2[*index2 + PITCH_BUFFSIZE] = WebRtcSpl_SatW32ToW16(tmpW32);
-
-    (*index2)++;
-  }
-}
diff --git a/modules/audio_coding/codecs/isac/fix/source/pitch_filter_mips.c b/modules/audio_coding/codecs/isac/fix/source/pitch_filter_mips.c
deleted file mode 100644
index 0f390b8..0000000
--- a/modules/audio_coding/codecs/isac/fix/source/pitch_filter_mips.c
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- *  Copyright (c) 2014 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/codecs/isac/fix/source/pitch_estimator.h"
-
-void WebRtcIsacfix_PitchFilterCore(int loopNumber,
-                                   int16_t gain,
-                                   size_t index,
-                                   int16_t sign,
-                                   int16_t* inputState,
-                                   int16_t* outputBuf2,
-                                   const int16_t* coefficient,
-                                   int16_t* inputBuf,
-                                   int16_t* outputBuf,
-                                   int* index2) {
-  int ind2t = *index2;
-  int i = 0;
-  int16_t* out2_pos2 = &outputBuf2[PITCH_BUFFSIZE - (index + 2)] + ind2t;
-  int32_t w1, w2, w3, w4, w5, gain32, sign32;
-  int32_t coef1, coef2, coef3, coef4, coef5 = 0;
-  // Define damp factors as int32_t (pair of int16_t)
-  int32_t kDampF0 = 0x0000F70A;
-  int32_t kDampF1 = 0x51EC2000;
-  int32_t kDampF2 = 0xF70A2000;
-  int16_t* input1 = inputBuf + ind2t;
-  int16_t* output1 = outputBuf + ind2t;
-  int16_t* output2 = outputBuf2 + ind2t + PITCH_BUFFSIZE;
-
-  // Load coefficients outside the loop and sign-extend gain and sign
-  __asm __volatile (
-    ".set     push                                        \n\t"
-    ".set     noreorder                                   \n\t"
-    "lwl      %[coef1],       3(%[coefficient])           \n\t"
-    "lwl      %[coef2],       7(%[coefficient])           \n\t"
-    "lwl      %[coef3],       11(%[coefficient])          \n\t"
-    "lwl      %[coef4],       15(%[coefficient])          \n\t"
-    "lwr      %[coef1],       0(%[coefficient])           \n\t"
-    "lwr      %[coef2],       4(%[coefficient])           \n\t"
-    "lwr      %[coef3],       8(%[coefficient])           \n\t"
-    "lwr      %[coef4],       12(%[coefficient])          \n\t"
-    "lhu      %[coef5],       16(%[coefficient])          \n\t"
-    "seh      %[gain32],      %[gain]                     \n\t"
-    "seh      %[sign32],      %[sign]                     \n\t"
-    ".set     pop                                         \n\t"
-    : [coef1] "=&r" (coef1), [coef2] "=&r" (coef2), [coef3] "=&r" (coef3),
-      [coef4] "=&r" (coef4), [coef5] "=&r" (coef5), [gain32] "=&r" (gain32),
-      [sign32] "=&r" (sign32)
-    : [coefficient] "r" (coefficient), [gain] "r" (gain),
-      [sign] "r" (sign)
-    : "memory"
-  );
-
-  for (i = 0; i < loopNumber; i++) {
-    __asm __volatile (
-      ".set       push                                            \n\t"
-      ".set       noreorder                                       \n\t"
-      // Filter to get fractional pitch
-      "li         %[w1],          8192                            \n\t"
-      "mtlo       %[w1]                                           \n\t"
-      "mthi       $0                                              \n\t"
-      "lwl        %[w1],          3(%[out2_pos2])                 \n\t"
-      "lwl        %[w2],          7(%[out2_pos2])                 \n\t"
-      "lwl        %[w3],          11(%[out2_pos2])                \n\t"
-      "lwl        %[w4],          15(%[out2_pos2])                \n\t"
-      "lwr        %[w1],          0(%[out2_pos2])                 \n\t"
-      "lwr        %[w2],          4(%[out2_pos2])                 \n\t"
-      "lwr        %[w3],          8(%[out2_pos2])                 \n\t"
-      "lwr        %[w4],          12(%[out2_pos2])                \n\t"
-      "lhu        %[w5],          16(%[out2_pos2])                \n\t"
-      "dpa.w.ph   $ac0,           %[w1],              %[coef1]    \n\t"
-      "dpa.w.ph   $ac0,           %[w2],              %[coef2]    \n\t"
-      "dpa.w.ph   $ac0,           %[w3],              %[coef3]    \n\t"
-      "dpa.w.ph   $ac0,           %[w4],              %[coef4]    \n\t"
-      "dpa.w.ph   $ac0,           %[w5],              %[coef5]    \n\t"
-      "addiu      %[out2_pos2],   %[out2_pos2],       2           \n\t"
-      "mthi       $0,             $ac1                            \n\t"
-      "lwl        %[w2],          3(%[inputState])                \n\t"
-      "lwl        %[w3],          7(%[inputState])                \n\t"
-      // Fractional pitch shift & saturation
-      "extr_s.h   %[w1],          $ac0,               14          \n\t"
-      "li         %[w4],          16384                           \n\t"
-      "lwr        %[w2],          0(%[inputState])                \n\t"
-      "lwr        %[w3],          4(%[inputState])                \n\t"
-      "mtlo       %[w4],          $ac1                            \n\t"
-      // Shift low pass filter state
-      "swl        %[w2],          5(%[inputState])                \n\t"
-      "swl        %[w3],          9(%[inputState])                \n\t"
-      "mul        %[w1],          %[gain32],          %[w1]       \n\t"
-      "swr        %[w2],          2(%[inputState])                \n\t"
-      "swr        %[w3],          6(%[inputState])                \n\t"
-      // Low pass filter accumulation
-      "dpa.w.ph   $ac1,           %[kDampF1],         %[w2]       \n\t"
-      "dpa.w.ph   $ac1,           %[kDampF2],         %[w3]       \n\t"
-      "lh         %[w4],          0(%[input1])                    \n\t"
-      "addiu      %[input1],      %[input1],          2           \n\t"
-      "shra_r.w   %[w1],          %[w1],              12          \n\t"
-      "sh         %[w1],          0(%[inputState])                \n\t"
-      "dpa.w.ph   $ac1,           %[kDampF0],         %[w1]       \n\t"
-      // Low pass filter shift & saturation
-      "extr_s.h   %[w2],          $ac1,               15          \n\t"
-      "mul        %[w2],          %[w2],              %[sign32]   \n\t"
-      // Buffer update
-      "subu       %[w2],          %[w4],              %[w2]       \n\t"
-      "shll_s.w   %[w2],          %[w2],              16          \n\t"
-      "sra        %[w2],          %[w2],              16          \n\t"
-      "sh         %[w2],          0(%[output1])                   \n\t"
-      "addu       %[w2],          %[w2],              %[w4]       \n\t"
-      "shll_s.w   %[w2],          %[w2],              16          \n\t"
-      "addiu      %[output1],     %[output1],         2           \n\t"
-      "sra        %[w2],          %[w2],              16          \n\t"
-      "sh         %[w2],          0(%[output2])                   \n\t"
-      "addiu      %[output2],     %[output2],         2           \n\t"
-      ".set       pop                                             \n\t"
-      : [w1] "=&r" (w1), [w2] "=&r" (w2), [w3] "=&r" (w3), [w4] "=&r" (w4),
-        [w5] "=&r" (w5), [input1] "+r" (input1), [out2_pos2] "+r" (out2_pos2),
-        [output1] "+r" (output1), [output2] "+r" (output2)
-      : [coefficient] "r" (coefficient), [inputState] "r" (inputState),
-        [gain32] "r" (gain32), [sign32] "r" (sign32), [kDampF0] "r" (kDampF0),
-        [kDampF1] "r" (kDampF1), [kDampF2] "r" (kDampF2),
-        [coef1] "r" (coef1), [coef2] "r" (coef2), [coef3] "r" (coef3),
-        [coef4] "r" (coef4), [coef5] "r" (coef5)
-      : "hi", "lo", "$ac1hi", "$ac1lo", "memory"
-    );
-  }
-  (*index2) += loopNumber;
-}
diff --git a/modules/audio_coding/codecs/isac/fix/source/pitch_gain_tables.c b/modules/audio_coding/codecs/isac/fix/source/pitch_gain_tables.c
deleted file mode 100644
index bfd83b7..0000000
--- a/modules/audio_coding/codecs/isac/fix/source/pitch_gain_tables.c
+++ /dev/null
@@ -1,149 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/*
- * pitch_gain_tables.c
- *
- * This file contains tables for the pitch filter side-info in the entropy coder.
- *
- */
-
-#include "pitch_gain_tables.h"
-
-
-/********************* Pitch Filter Gain Coefficient Tables ************************/
-
-/* cdf for quantized pitch filter gains */
-const uint16_t WebRtcIsacfix_kPitchGainCdf[255] = {
-  0,  2,  4,  6,  64,  901,  903,  905,  16954,  16956,
-  16961,  17360,  17362,  17364,  17366,  17368,  17370,  17372,  17374,  17411,
-  17514,  17516,  17583,  18790,  18796,  18802,  20760,  20777,  20782,  21722,
-  21724,  21728,  21738,  21740,  21742,  21744,  21746,  21748,  22224,  22227,
-  22230,  23214,  23229,  23239,  25086,  25108,  25120,  26088,  26094,  26098,
-  26175,  26177,  26179,  26181,  26183,  26185,  26484,  26507,  26522,  27705,
-  27731,  27750,  29767,  29799,  29817,  30866,  30883,  30885,  31025,  31029,
-  31031,  31033,  31035,  31037,  31114,  31126,  31134,  32687,  32722,  32767,
-  35718,  35742,  35757,  36943,  36952,  36954,  37115,  37128,  37130,  37132,
-  37134,  37136,  37143,  37145,  37152,  38843,  38863,  38897,  47458,  47467,
-  47474,  49040,  49061,  49063,  49145,  49157,  49159,  49161,  49163,  49165,
-  49167,  49169,  49171,  49757,  49770,  49782,  61333,  61344,  61346,  62860,
-  62883,  62885,  62887,  62889,  62891,  62893,  62895,  62897,  62899,  62901,
-  62903,  62905,  62907,  62909,  65496,  65498,  65500,  65521,  65523,  65525,
-  65527,  65529,  65531,  65533,  65535,  65535,  65535,  65535,  65535,  65535,
-  65535,  65535,  65535,  65535,  65535,  65535,  65535,  65535,  65535,  65535,
-  65535,  65535,  65535,  65535,  65535,  65535,  65535,  65535,  65535,  65535,
-  65535,  65535,  65535,  65535,  65535,  65535,  65535,  65535,  65535,  65535,
-  65535,  65535,  65535,  65535,  65535,  65535,  65535,  65535,  65535,  65535,
-  65535,  65535,  65535,  65535,  65535,  65535,  65535,  65535,  65535,  65535,
-  65535,  65535,  65535,  65535,  65535,  65535,  65535,  65535,  65535,  65535,
-  65535,  65535,  65535,  65535,  65535,  65535,  65535,  65535,  65535,  65535,
-  65535,  65535,  65535,  65535,  65535,  65535,  65535,  65535,  65535,  65535,
-  65535,  65535,  65535,  65535,  65535,  65535,  65535,  65535,  65535,  65535,
-  65535,  65535,  65535,  65535,  65535,  65535,  65535,  65535,  65535,  65535,
-  65535,  65535,  65535,  65535,  65535
-};
-
-/* index limits and ranges */
-const int16_t WebRtcIsacfix_kLowerlimiGain[3] = {
-  -7, -2, -1
-};
-
-const int16_t WebRtcIsacfix_kUpperlimitGain[3] = {
-  0,  3,  1
-};
-
-const uint16_t WebRtcIsacfix_kMultsGain[2] = {
-  18,  3
-};
-
-/* size of cdf table */
-const uint16_t WebRtcIsacfix_kCdfTableSizeGain[1] = {
-  256
-};
-
-/* mean values of pitch filter gains in FIXED point Q12 */
-const int16_t WebRtcIsacfix_kPitchGain1[144] = {
-  843, 1092, 1336, 1222, 1405, 1656, 1500, 1815, 1843, 1838, 1839,
-  1843, 1843, 1843, 1843, 1843,   1843, 1843, 814, 846, 1092, 1013,
-  1174, 1383, 1391, 1511, 1584, 1734, 1753, 1843, 1843, 1843,   1843,
-  1843, 1843, 1843, 524, 689, 777, 845, 947, 1069, 1090, 1263,
-  1380, 1447, 1559, 1676,   1645, 1749, 1843, 1843, 1843, 1843, 81,
-  477, 563, 611, 706, 806, 849, 1012, 1192, 1128,   1330, 1489,
-  1425, 1576, 1826, 1741, 1843, 1843, 0,     290, 305, 356, 488,
-  575, 602, 741,    890, 835, 1079, 1196, 1182, 1376, 1519, 1506,
-  1680, 1843, 0,     47,  97,  69,  289, 381,    385, 474, 617,
-  664, 803, 1079, 935, 1160, 1269, 1265, 1506, 1741, 0,      0,
-  0,      0,      112, 120, 190, 283, 442, 343, 526, 809, 684,
-  935, 1134, 1020, 1265, 1506, 0,      0,      0,      0,      0,      0,
-  0,      111,    256, 87,  373, 597, 430, 684, 935, 770, 1020,
-  1265
-};
-
-const int16_t WebRtcIsacfix_kPitchGain2[144] = {
-  1760, 1525, 1285, 1747, 1671, 1393, 1843, 1826, 1555, 1843, 1784,
-  1606, 1843, 1843, 1711, 1843,   1843, 1814, 1389, 1275, 1040, 1564,
-  1414, 1252, 1610, 1495, 1343, 1753, 1592, 1405, 1804, 1720,   1475,
-  1843, 1814, 1581, 1208, 1061, 856, 1349, 1148, 994, 1390, 1253,
-  1111, 1495, 1343, 1178,   1770, 1465, 1234, 1814, 1581, 1342, 1040,
-  793, 713, 1053, 895, 737, 1128, 1003, 861, 1277,   1094, 981,
-  1475, 1192, 1019, 1581, 1342, 1098, 855, 570, 483, 833, 648,
-  540, 948, 744,    572, 1009, 844, 636, 1234, 934, 685, 1342,
-  1217, 984, 537, 318, 124, 603, 423, 350,    687, 479, 322,
-  791, 581, 430, 987, 671, 488, 1098, 849, 597, 283, 27,
-  0,     397,    222, 38,  513, 271, 124, 624, 325, 157, 737,
-  484, 233, 849, 597, 343, 27,  0,      0,   141, 0,     0,
-  256, 69,  0,     370, 87,  0,     484, 229, 0,     597, 343,
-  87
-};
-
-const int16_t WebRtcIsacfix_kPitchGain3[144] = {
-  1843, 1843, 1711, 1843, 1818, 1606, 1843, 1827, 1511, 1814, 1639,
-  1393, 1760, 1525, 1285, 1656,   1419, 1176, 1835, 1718, 1475, 1841,
-  1650, 1387, 1648, 1498, 1287, 1600, 1411, 1176, 1522, 1299,   1040,
-  1419, 1176, 928, 1773, 1461, 1128, 1532, 1355, 1202, 1429, 1260,
-  1115, 1398, 1151, 1025,   1172, 1080, 790, 1176, 928, 677, 1475,
-  1147, 1019, 1276, 1096, 922, 1214, 1010, 901, 1057,   893, 800,
-  1040, 796, 734, 928, 677, 424, 1137, 897, 753, 1120, 830,
-  710, 875, 751,    601, 795, 642, 583, 790, 544, 475, 677,
-  474, 140, 987, 750, 482, 697, 573, 450,    691, 487, 303,
-  661, 394, 332, 537, 303, 220, 424, 168, 0,     737, 484,
-  229, 624,    348, 153, 441, 261, 136, 397, 166, 51,  283,
-  27,  0,     168, 0,     0,     484, 229,    0,   370, 57,  0,
-  256, 43,  0,     141, 0,  0,   27,  0,   0,   0,   0,
-  0
-};
-
-
-const int16_t WebRtcIsacfix_kPitchGain4[144] = {
-  1843, 1843, 1843, 1843, 1841, 1843, 1500, 1821, 1843, 1222, 1434,
-  1656, 843, 1092, 1336, 504,    757, 1007, 1843, 1843, 1843, 1838,
-  1791, 1843, 1265, 1505, 1599, 965, 1219, 1425, 730, 821,    1092,
-  249, 504, 757, 1783, 1819, 1843, 1351, 1567, 1727, 1096, 1268,
-  1409, 805, 961, 1131,   444, 670, 843, 0,  249, 504, 1425,
-  1655, 1743, 1096, 1324, 1448, 822, 1019, 1199, 490,    704, 867,
-  81,  450, 555, 0,     0,  249, 1247, 1428, 1530, 881, 1073,
-  1283, 610, 759,    939, 278, 464, 645, 0,     200, 270, 0,
-  0,   0,  935, 1163, 1410, 528, 790, 1068,   377, 499, 717,
-  173, 240, 274, 0,   43,  62,  0,   0,   0,   684, 935,
-  1182, 343,    551, 735, 161, 262, 423, 0,      55,  27,  0,
-  0,   0,   0,   0,   0,   430, 684,    935, 87,  377, 597,
-  0,   46,  256, 0,   0,   0,   0,   0,   0,   0,   0,
-  0
-};
-
-
-
-/* transform matrix in Q12*/
-const int16_t WebRtcIsacfix_kTransform[4][4] = {
-  { -2048, -2048, -2048, -2048 },
-  {  2748,   916,  -916, -2748 },
-  {  2048, -2048, -2048,  2048 },
-  {   916, -2748,  2748,  -916 }
-};
diff --git a/modules/audio_coding/codecs/isac/fix/source/pitch_gain_tables.h b/modules/audio_coding/codecs/isac/fix/source/pitch_gain_tables.h
deleted file mode 100644
index 4aab2b6..0000000
--- a/modules/audio_coding/codecs/isac/fix/source/pitch_gain_tables.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/*
- * pitch_gain_tables.h
- *
- * This file contains tables for the pitch filter side-info in the entropy coder.
- *
- */
-
-#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_FIX_SOURCE_PITCH_GAIN_TABLES_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_FIX_SOURCE_PITCH_GAIN_TABLES_H_
-
-#include "webrtc/typedefs.h"
-
-/********************* Pitch Filter Gain Coefficient Tables ************************/
-/* cdf for quantized pitch filter gains */
-extern const uint16_t WebRtcIsacfix_kPitchGainCdf[255];
-
-/* index limits and ranges */
-extern const int16_t WebRtcIsacfix_kLowerlimiGain[3];
-extern const int16_t WebRtcIsacfix_kUpperlimitGain[3];
-extern const uint16_t WebRtcIsacfix_kMultsGain[2];
-
-/* mean values of pitch filter gains in Q12*/
-extern const int16_t WebRtcIsacfix_kPitchGain1[144];
-extern const int16_t WebRtcIsacfix_kPitchGain2[144];
-extern const int16_t WebRtcIsacfix_kPitchGain3[144];
-extern const int16_t WebRtcIsacfix_kPitchGain4[144];
-
-/* size of cdf table */
-extern const uint16_t WebRtcIsacfix_kCdfTableSizeGain[1];
-
-/* transform matrix */
-extern const int16_t WebRtcIsacfix_kTransform[4][4];
-
-#endif /* WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_FIX_SOURCE_PITCH_GAIN_TABLES_H_ */
diff --git a/modules/audio_coding/codecs/isac/fix/source/pitch_lag_tables.c b/modules/audio_coding/codecs/isac/fix/source/pitch_lag_tables.c
deleted file mode 100644
index 4566b6eb..0000000
--- a/modules/audio_coding/codecs/isac/fix/source/pitch_lag_tables.c
+++ /dev/null
@@ -1,306 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/*
- * pitch_lag_tables.c
- *
- * This file contains tables for the pitch filter side-info in the entropy coder.
- *
- */
-
-#include "settings.h"
-#include "pitch_lag_tables.h"
-
-
-/********************* Pitch Filter Gain Coefficient Tables ************************/
-
-/* tables for use with small pitch gain */
-
-/* cdf for quantized pitch filter lags */
-const uint16_t WebRtcIsacfix_kPitchLagCdf1Lo[127] = {
-  0,  134,  336,  549,  778,  998,  1264,  1512,  1777,  2070,
-  2423,  2794,  3051,  3361,  3708,  3979,  4315,  4610,  4933,  5269,
-  5575,  5896,  6155,  6480,  6816,  7129,  7477,  7764,  8061,  8358,
-  8718,  9020,  9390,  9783,  10177,  10543,  10885,  11342,  11795,  12213,
-  12680,  13096,  13524,  13919,  14436,  14903,  15349,  15795,  16267,  16734,
-  17266,  17697,  18130,  18632,  19080,  19447,  19884,  20315,  20735,  21288,
-  21764,  22264,  22723,  23193,  23680,  24111,  24557,  25022,  25537,  26082,
-  26543,  27090,  27620,  28139,  28652,  29149,  29634,  30175,  30692,  31273,
-  31866,  32506,  33059,  33650,  34296,  34955,  35629,  36295,  36967,  37726,
-  38559,  39458,  40364,  41293,  42256,  43215,  44231,  45253,  46274,  47359,
-  48482,  49678,  50810,  51853,  53016,  54148,  55235,  56263,  57282,  58363,
-  59288,  60179,  61076,  61806,  62474,  63129,  63656,  64160,  64533,  64856,
-  65152,  65535,  65535,  65535,  65535,  65535,  65535
-};
-
-const uint16_t WebRtcIsacfix_kPitchLagCdf2Lo[20] = {
-  0,  429,  3558,  5861,  8558,  11639,  15210,  19502,  24773,  31983,
-  42602,  48567,  52601,  55676,  58160,  60172,  61889,  63235,  65383,  65535
-};
-
-const uint16_t WebRtcIsacfix_kPitchLagCdf3Lo[2] = {
-  0,  65535
-};
-
-const uint16_t WebRtcIsacfix_kPitchLagCdf4Lo[10] = {
-  0,  2966,  6368,  11182,  19431,  37793,  48532,  55353,  60626,  65535
-};
-
-const uint16_t *WebRtcIsacfix_kPitchLagPtrLo[4] = {
-  WebRtcIsacfix_kPitchLagCdf1Lo,
-  WebRtcIsacfix_kPitchLagCdf2Lo,
-  WebRtcIsacfix_kPitchLagCdf3Lo,
-  WebRtcIsacfix_kPitchLagCdf4Lo
-};
-
-/* size of first cdf table */
-const uint16_t WebRtcIsacfix_kPitchLagSizeLo[1] = {
-  128
-};
-
-/* index limits and ranges */
-const int16_t WebRtcIsacfix_kLowerLimitLo[4] = {
-  -140, -9,  0, -4
-};
-
-const int16_t WebRtcIsacfix_kUpperLimitLo[4] = {
-  -20,  9,  0,  4
-};
-
-/* initial index for arithmetic decoder */
-const uint16_t WebRtcIsacfix_kInitIndLo[3] = {
-  10,  1,  5
-};
-
-/* mean values of pitch filter lags in Q10 */
-
-const int16_t WebRtcIsacfix_kMeanLag2Lo[19] = {
-  -17627, -16207, -14409, -12319, -10253, -8200, -6054, -3986, -1948, -19,
-  1937, 3974, 6064, 8155, 10229, 12270, 14296, 16127, 17520
-};
-
-const int16_t WebRtcIsacfix_kMeanLag4Lo[9] = {
-  -7949, -6063, -4036, -1941, 38, 1977, 4060, 6059
-};
-
-
-
-/* tables for use with medium pitch gain */
-
-/* cdf for quantized pitch filter lags */
-const uint16_t WebRtcIsacfix_kPitchLagCdf1Mid[255] = {
-  0,  28,  61,  88,  121,  149,  233,  331,  475,  559,
-  624,  661,  689,  712,  745,  791,  815,  843,  866,  922,
-  959,  1024,  1061,  1117,  1178,  1238,  1280,  1350,  1453,  1513,
-  1564,  1625,  1671,  1741,  1788,  1904,  2072,  2421,  2626,  2770,
-  2840,  2900,  2942,  3012,  3068,  3115,  3147,  3194,  3254,  3319,
-  3366,  3520,  3678,  3780,  3850,  3911,  3957,  4032,  4106,  4185,
-  4292,  4474,  4683,  4842,  5019,  5191,  5321,  5428,  5540,  5675,
-  5763,  5847,  5959,  6127,  6304,  6564,  6839,  7090,  7263,  7421,
-  7556,  7728,  7872,  7984,  8142,  8361,  8580,  8743,  8938,  9227,
-  9409,  9539,  9674,  9795,  9930,  10060,  10177,  10382,  10614,  10861,
-  11038,  11271,  11415,  11629,  11792,  12044,  12193,  12416,  12574,  12821,
-  13007,  13235,  13445,  13654,  13901,  14134,  14488,  15000,  15703,  16285,
-  16504,  16797,  17086,  17328,  17579,  17807,  17998,  18268,  18538,  18836,
-  19087,  19274,  19474,  19716,  19935,  20270,  20833,  21303,  21532,  21741,
-  21978,  22207,  22523,  22770,  23054,  23613,  23943,  24204,  24399,  24651,
-  24832,  25074,  25270,  25549,  25759,  26015,  26150,  26424,  26713,  27048,
-  27342,  27504,  27681,  27854,  28021,  28207,  28412,  28664,  28859,  29064,
-  29278,  29548,  29748,  30107,  30377,  30656,  30856,  31164,  31452,  31755,
-  32011,  32328,  32626,  32919,  33319,  33789,  34329,  34925,  35396,  35973,
-  36443,  36964,  37551,  38156,  38724,  39357,  40023,  40908,  41587,  42602,
-  43924,  45037,  45810,  46597,  47421,  48291,  49092,  50051,  51448,  52719,
-  53440,  54241,  54944,  55977,  56676,  57299,  57872,  58389,  59059,  59688,
-  60237,  60782,  61094,  61573,  61890,  62290,  62658,  63030,  63217,  63454,
-  63622,  63882,  64003,  64273,  64427,  64529,  64581,  64697,  64758,  64902,
-  65414,  65535,  65535,  65535,  65535,  65535,  65535,  65535,  65535,  65535,
-  65535,  65535,  65535,  65535,  65535
-};
-
-const uint16_t WebRtcIsacfix_kPitchLagCdf2Mid[36] = {
-  0,  71,  335,  581,  836,  1039,  1323,  1795,  2258,  2608,
-  3005,  3591,  4243,  5344,  7163,  10583,  16848,  28078,  49448,  57007,
-  60357,  61850,  62837,  63437,  63872,  64188,  64377,  64614,  64774,  64949,
-  65039,  65115,  65223,  65360,  65474,  65535
-};
-
-const uint16_t WebRtcIsacfix_kPitchLagCdf3Mid[2] = {
-  0,  65535
-};
-
-const uint16_t WebRtcIsacfix_kPitchLagCdf4Mid[20] = {
-  0,  28,  246,  459,  667,  1045,  1523,  2337,  4337,  11347,
-  44231,  56709,  60781,  62243,  63161,  63969,  64608,  65062,  65502,  65535
-};
-
-const uint16_t *WebRtcIsacfix_kPitchLagPtrMid[4] = {
-  WebRtcIsacfix_kPitchLagCdf1Mid,
-  WebRtcIsacfix_kPitchLagCdf2Mid,
-  WebRtcIsacfix_kPitchLagCdf3Mid,
-  WebRtcIsacfix_kPitchLagCdf4Mid
-};
-
-/* size of first cdf table */
-const uint16_t WebRtcIsacfix_kPitchLagSizeMid[1] = {
-  256
-};
-
-/* index limits and ranges */
-const int16_t WebRtcIsacfix_kLowerLimitMid[4] = {
-  -280, -17,  0, -9
-};
-
-const int16_t WebRtcIsacfix_kUpperLimitMid[4] = {
-  -40,  17,  0,  9
-};
-
-/* initial index for arithmetic decoder */
-const uint16_t WebRtcIsacfix_kInitIndMid[3] = {
-  18,  1,  10
-};
-
-/* mean values of pitch filter lags in Q10 */
-
-const int16_t WebRtcIsacfix_kMeanLag2Mid[35] = {
-  -17297, -16250, -15416, -14343, -13341, -12363, -11270,
-  -10355, -9122, -8217, -7172, -6083, -5102, -4004, -3060,
-  -1982, -952, -18, 935, 1976, 3040, 4032,
-  5082, 6065, 7257, 8202, 9264, 10225, 11242,
-  12234, 13337, 14336, 15374, 16187, 17347
-};
-
-
-const int16_t WebRtcIsacfix_kMeanLag4Mid[19] = {
-  -8811, -8081, -7203, -6003, -5057, -4025, -2983, -1964,
-  -891, 29, 921, 1920, 2988, 4064, 5187, 6079, 7173, 8074, 8849
-};
-
-
-/* tables for use with large pitch gain */
-
-/* cdf for quantized pitch filter lags */
-const uint16_t WebRtcIsacfix_kPitchLagCdf1Hi[511] = {
-  0,  7,  18,  33,  69,  105,  156,  228,  315,  612,
-  680,  691,  709,  724,  735,  738,  742,  746,  749,  753,
-  756,  760,  764,  774,  782,  785,  789,  796,  800,  803,
-  807,  814,  818,  822,  829,  832,  847,  854,  858,  869,
-  876,  883,  898,  908,  934,  977,  1010,  1050,  1060,  1064,
-  1075,  1078,  1086,  1089,  1093,  1104,  1111,  1122,  1133,  1136,
-  1151,  1162,  1183,  1209,  1252,  1281,  1339,  1364,  1386,  1401,
-  1411,  1415,  1426,  1430,  1433,  1440,  1448,  1455,  1462,  1477,
-  1487,  1495,  1502,  1506,  1509,  1516,  1524,  1531,  1535,  1542,
-  1553,  1556,  1578,  1589,  1611,  1625,  1639,  1643,  1654,  1665,
-  1672,  1687,  1694,  1705,  1708,  1719,  1730,  1744,  1752,  1759,
-  1791,  1795,  1820,  1867,  1886,  1915,  1936,  1943,  1965,  1987,
-  2041,  2099,  2161,  2175,  2200,  2211,  2226,  2233,  2244,  2251,
-  2266,  2280,  2287,  2298,  2309,  2316,  2331,  2342,  2356,  2378,
-  2403,  2418,  2447,  2497,  2544,  2602,  2863,  2895,  2903,  2935,
-  2950,  2971,  3004,  3011,  3018,  3029,  3040,  3062,  3087,  3127,
-  3152,  3170,  3199,  3243,  3293,  3322,  3340,  3377,  3402,  3427,
-  3474,  3518,  3543,  3579,  3601,  3637,  3659,  3706,  3731,  3760,
-  3818,  3847,  3869,  3901,  3920,  3952,  4068,  4169,  4220,  4271,
-  4524,  4571,  4604,  4632,  4672,  4730,  4777,  4806,  4857,  4904,
-  4951,  5002,  5031,  5060,  5107,  5150,  5212,  5266,  5331,  5382,
-  5432,  5490,  5544,  5610,  5700,  5762,  5812,  5874,  5972,  6022,
-  6091,  6163,  6232,  6305,  6402,  6540,  6685,  6880,  7090,  7271,
-  7379,  7452,  7542,  7625,  7687,  7770,  7843,  7911,  7966,  8024,
-  8096,  8190,  8252,  8320,  8411,  8501,  8585,  8639,  8751,  8842,
-  8918,  8986,  9066,  9127,  9203,  9269,  9345,  9406,  9464,  9536,
-  9612,  9667,  9735,  9844,  9931,  10036,  10119,  10199,  10260,  10358,
-  10441,  10514,  10666,  10734,  10872,  10951,  11053,  11125,  11223,  11324,
-  11516,  11664,  11737,  11816,  11892,  12008,  12120,  12200,  12280,  12392,
-  12490,  12576,  12685,  12812,  12917,  13003,  13108,  13210,  13300,  13384,
-  13470,  13579,  13673,  13771,  13879,  13999,  14136,  14201,  14368,  14614,
-  14759,  14867,  14958,  15030,  15121,  15189,  15280,  15385,  15461,  15555,
-  15653,  15768,  15884,  15971,  16069,  16145,  16210,  16279,  16380,  16463,
-  16539,  16615,  16688,  16818,  16919,  17017,  18041,  18338,  18523,  18649,
-  18790,  18917,  19047,  19167,  19315,  19460,  19601,  19731,  19858,  20068,
-  20173,  20318,  20466,  20625,  20741,  20911,  21045,  21201,  21396,  21588,
-  21816,  22022,  22305,  22547,  22786,  23072,  23322,  23600,  23879,  24168,
-  24433,  24769,  25120,  25511,  25895,  26289,  26792,  27219,  27683,  28077,
-  28566,  29094,  29546,  29977,  30491,  30991,  31573,  32105,  32594,  33173,
-  33788,  34497,  35181,  35833,  36488,  37255,  37921,  38645,  39275,  39894,
-  40505,  41167,  41790,  42431,  43096,  43723,  44385,  45134,  45858,  46607,
-  47349,  48091,  48768,  49405,  49955,  50555,  51167,  51985,  52611,  53078,
-  53494,  53965,  54435,  54996,  55601,  56125,  56563,  56838,  57244,  57566,
-  57967,  58297,  58771,  59093,  59419,  59647,  59886,  60143,  60461,  60693,
-  60917,  61170,  61416,  61634,  61891,  62122,  62310,  62455,  62632,  62839,
-  63103,  63436,  63639,  63805,  63906,  64015,  64192,  64355,  64475,  64558,
-  64663,  64742,  64811,  64865,  64916,  64956,  64981,  65025,  65068,  65115,
-  65195,  65314,  65419,  65535,  65535,  65535,  65535,  65535,  65535,  65535,
-  65535,  65535,  65535,  65535,  65535,  65535,  65535,  65535,  65535,  65535,
-  65535,  65535,  65535,  65535,  65535,  65535,  65535,  65535,  65535,  65535,
-  65535,  65535,  65535,  65535,  65535,  65535,  65535,  65535,  65535,  65535,
-  65535
-};
-
-const uint16_t WebRtcIsacfix_kPitchLagCdf2Hi[68] = {
-  0,  7,  11,  22,  37,  52,  56,  59,  81,  85,
-  89,  96,  115,  130,  137,  152,  170,  181,  193,  200,
-  207,  233,  237,  259,  289,  318,  363,  433,  592,  992,
-  1607,  3062,  6149,  12206,  25522,  48368,  58223,  61918,  63640,  64584,
-  64943,  65098,  65206,  65268,  65294,  65335,  65350,  65372,  65387,  65402,
-  65413,  65420,  65428,  65435,  65439,  65450,  65454,  65468,  65472,  65476,
-  65483,  65491,  65498,  65505,  65516,  65520,  65528,  65535
-};
-
-const uint16_t WebRtcIsacfix_kPitchLagCdf3Hi[2] = {
-  0,  65535
-};
-
-const uint16_t WebRtcIsacfix_kPitchLagCdf4Hi[35] = {
-  0,  7,  19,  30,  41,  48,  63,  74,  82,  96,
-  122,  152,  215,  330,  701,  2611,  10931,  48106,  61177,  64341,
-  65112,  65238,  65309,  65338,  65364,  65379,  65401,  65427,  65453,
-  65465,  65476,  65490,  65509,  65528,  65535
-};
-
-const uint16_t *WebRtcIsacfix_kPitchLagPtrHi[4] = {
-  WebRtcIsacfix_kPitchLagCdf1Hi,
-  WebRtcIsacfix_kPitchLagCdf2Hi,
-  WebRtcIsacfix_kPitchLagCdf3Hi,
-  WebRtcIsacfix_kPitchLagCdf4Hi
-};
-
-/* size of first cdf table */
-const uint16_t WebRtcIsacfix_kPitchLagSizeHi[1] = {
-  512
-};
-
-/* index limits and ranges */
-const int16_t WebRtcIsacfix_kLowerLimitHi[4] = {
-  -552, -34,  0, -16
-};
-
-const int16_t WebRtcIsacfix_kUpperLimitHi[4] = {
-  -80,  32,  0,  17
-};
-
-/* initial index for arithmetic decoder */
-const uint16_t WebRtcIsacfix_kInitIndHi[3] = {
-  34,  1,  18
-};
-
-/* mean values of pitch filter lags */
-
-const int16_t WebRtcIsacfix_kMeanLag2Hi[67] = {
-  -17482, -16896, -16220, -15929, -15329, -14848, -14336, -13807, -13312, -12800, -12218, -11720,
-  -11307, -10649, -10396, -9742, -9148, -8668, -8297, -7718, -7155, -6656, -6231, -5600, -5129,
-  -4610, -4110, -3521, -3040, -2525, -2016, -1506, -995, -477, -5, 469, 991, 1510, 2025, 2526, 3079,
-  3555, 4124, 4601, 5131, 5613, 6194, 6671, 7140, 7645, 8207, 8601, 9132, 9728, 10359, 10752, 11302,
-  11776, 12288, 12687, 13204, 13759, 14295, 14810, 15360, 15764, 16350
-};
-
-
-const int16_t WebRtcIsacfix_kMeanLag4Hi[34] = {
-  -8175, -7659, -7205, -6684, -6215, -5651, -5180, -4566, -4087, -3536, -3096,
-  -2532, -1990, -1482, -959, -440, 11, 451, 954, 1492, 2020, 2562, 3059,
-  3577, 4113, 4618, 5134, 5724, 6060, 6758, 7015, 7716, 8066, 8741
-};
diff --git a/modules/audio_coding/codecs/isac/fix/source/pitch_lag_tables.h b/modules/audio_coding/codecs/isac/fix/source/pitch_lag_tables.h
deleted file mode 100644
index a5478b2..0000000
--- a/modules/audio_coding/codecs/isac/fix/source/pitch_lag_tables.h
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/*
- * pitch_lag_tables.h
- *
- * This file contains tables for the pitch filter side-info in the entropy coder.
- *
- */
-
-#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_FIX_SOURCE_PITCH_LAG_TABLES_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_FIX_SOURCE_PITCH_LAG_TABLES_H_
-
-#include "webrtc/typedefs.h"
-
-/********************* Pitch Filter Lag Coefficient Tables ************************/
-
-/* tables for use with small pitch gain */
-
-/* cdfs for quantized pitch lags */
-extern const uint16_t WebRtcIsacfix_kPitchLagCdf1Lo[127];
-extern const uint16_t WebRtcIsacfix_kPitchLagCdf2Lo[20];
-extern const uint16_t WebRtcIsacfix_kPitchLagCdf3Lo[2];
-extern const uint16_t WebRtcIsacfix_kPitchLagCdf4Lo[10];
-
-extern const uint16_t *WebRtcIsacfix_kPitchLagPtrLo[4];
-
-/* size of first cdf table */
-extern const uint16_t WebRtcIsacfix_kPitchLagSizeLo[1];
-
-/* index limits and ranges */
-extern const int16_t WebRtcIsacfix_kLowerLimitLo[4];
-extern const int16_t WebRtcIsacfix_kUpperLimitLo[4];
-
-/* initial index for arithmetic decoder */
-extern const uint16_t WebRtcIsacfix_kInitIndLo[3];
-
-/* mean values of pitch filter lags */
-extern const int16_t WebRtcIsacfix_kMeanLag2Lo[19];
-extern const int16_t WebRtcIsacfix_kMeanLag4Lo[9];
-
-
-
-/* tables for use with medium pitch gain */
-
-/* cdfs for quantized pitch lags */
-extern const uint16_t WebRtcIsacfix_kPitchLagCdf1Mid[255];
-extern const uint16_t WebRtcIsacfix_kPitchLagCdf2Mid[36];
-extern const uint16_t WebRtcIsacfix_kPitchLagCdf3Mid[2];
-extern const uint16_t WebRtcIsacfix_kPitchLagCdf4Mid[20];
-
-extern const uint16_t *WebRtcIsacfix_kPitchLagPtrMid[4];
-
-/* size of first cdf table */
-extern const uint16_t WebRtcIsacfix_kPitchLagSizeMid[1];
-
-/* index limits and ranges */
-extern const int16_t WebRtcIsacfix_kLowerLimitMid[4];
-extern const int16_t WebRtcIsacfix_kUpperLimitMid[4];
-
-/* initial index for arithmetic decoder */
-extern const uint16_t WebRtcIsacfix_kInitIndMid[3];
-
-/* mean values of pitch filter lags */
-extern const int16_t WebRtcIsacfix_kMeanLag2Mid[35];
-extern const int16_t WebRtcIsacfix_kMeanLag4Mid[19];
-
-
-/* tables for use with large pitch gain */
-
-/* cdfs for quantized pitch lags */
-extern const uint16_t WebRtcIsacfix_kPitchLagCdf1Hi[511];
-extern const uint16_t WebRtcIsacfix_kPitchLagCdf2Hi[68];
-extern const uint16_t WebRtcIsacfix_kPitchLagCdf3Hi[2];
-extern const uint16_t WebRtcIsacfix_kPitchLagCdf4Hi[35];
-
-extern const uint16_t *WebRtcIsacfix_kPitchLagPtrHi[4];
-
-/* size of first cdf table */
-extern const uint16_t WebRtcIsacfix_kPitchLagSizeHi[1];
-
-/* index limits and ranges */
-extern const int16_t WebRtcIsacfix_kLowerLimitHi[4];
-extern const int16_t WebRtcIsacfix_kUpperLimitHi[4];
-
-/* initial index for arithmetic decoder */
-extern const uint16_t WebRtcIsacfix_kInitIndHi[3];
-
-/* mean values of pitch filter lags */
-extern const int16_t WebRtcIsacfix_kMeanLag2Hi[67];
-extern const int16_t WebRtcIsacfix_kMeanLag4Hi[34];
-
-
-#endif /* WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_FIX_SOURCE_PITCH_LAG_TABLES_H_ */
diff --git a/modules/audio_coding/codecs/isac/fix/source/settings.h b/modules/audio_coding/codecs/isac/fix/source/settings.h
deleted file mode 100644
index 82eb51a..0000000
--- a/modules/audio_coding/codecs/isac/fix/source/settings.h
+++ /dev/null
@@ -1,215 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/*
- * settings.h
- *
- * Declaration of #defines used in the iSAC codec
- *
- */
-
-#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_FIX_SOURCE_SETTINGS_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_FIX_SOURCE_SETTINGS_H_
-
-
-/* sampling frequency (Hz) */
-#define FS                                      16000
-/* 1.5 times Sampling frequency */
-#define FS_1_HALF        (uint32_t) 24000
-/* Three times Sampling frequency */
-#define FS3          (uint32_t) 48000
-/* Eight times Sampling frequency */
-#define FS8          (uint32_t) 128000
-
-/* number of samples per frame (either 480 (30ms) or 960 (60ms)) */
-#define INITIAL_FRAMESAMPLES     960
-
-/* miliseconds */
-#define FRAMESIZE                               30
-/* number of samples per frame processed in the encoder (30ms) */
-#define FRAMESAMPLES                            480     /* ((FRAMESIZE*FS)/1000) */
-#define FRAMESAMPLES_HALF       240
-/* max number of samples per frame (= 60 ms frame) */
-#define MAX_FRAMESAMPLES      960
-/* number of samples per 10ms frame */
-#define FRAMESAMPLES_10ms                       160      /* ((10*FS)/1000) */
-/* Number of samples per 1 ms */
-#define SAMPLES_PER_MSEC      16
-/* number of subframes */
-#define SUBFRAMES                               6
-/* length of a subframe */
-#define UPDATE                                  80
-/* length of half a subframe (low/high band) */
-#define HALF_SUBFRAMELEN                        40    /* (UPDATE/2) */
-/* samples of look ahead (in a half-band, so actually half the samples of look ahead @ FS) */
-#define QLOOKAHEAD                              24    /* 3 ms */
-
-/* order of AR model in spectral entropy coder */
-#define AR_ORDER                                6
-#define MAX_ORDER                               13
-#define LEVINSON_MAX_ORDER                  12
-
-/* window length (masking analysis) */
-#define WINLEN                                  256
-/* order of low-band pole filter used to approximate masking curve */
-#define ORDERLO                                 12
-/* order of hi-band pole filter used to approximate masking curve */
-#define ORDERHI                                 6
-
-#define KLT_NUM_AVG_GAIN                        0
-#define KLT_NUM_AVG_SHAPE                       0
-#define KLT_NUM_MODELS                          3
-#define LPC_SHAPE_ORDER                         18    /* (ORDERLO + ORDERHI) */
-
-#define KLT_ORDER_GAIN                          12    /* (2 * SUBFRAMES) */
-#define KLT_ORDER_SHAPE                         108   /*  (LPC_SHAPE_ORDER * SUBFRAMES) */
-
-
-
-/* order for post_filter_bank */
-#define POSTQORDER                              3
-/* order for pre-filterbank */
-#define QORDER                                  3
-/* for decimator */
-#define ALLPASSSECTIONS                         2
-/* The number of composite all-pass filter factors */
-#define NUMBEROFCOMPOSITEAPSECTIONS             4
-
-/* The number of all-pass filter factors in an upper or lower channel*/
-#define NUMBEROFCHANNELAPSECTIONS               2
-
-
-
-#define DPMIN_Q10                            -10240   /* -10.00 in Q10 */
-#define DPMAX_Q10                             10240   /* 10.00 in Q10 */
-#define MINBITS_Q10                           10240   /* 10.0 in Q10 */
-
-
-/* array size for byte stream in number of Word16. */
-#define STREAM_MAXW16       300 /* The old maximum size still needed for the decoding */
-#define STREAM_MAXW16_30MS  100 /* 100 Word16 = 200 bytes = 53.4 kbit/s @ 30 ms.framelength */
-#define STREAM_MAXW16_60MS  200 /* 200 Word16 = 400 bytes = 53.4 kbit/s @ 60 ms.framelength */
-/* This is used only at the decoder bit-stream struct.
- * - The encoder and decoder bitstream containers are of different size because
- *   old iSAC limited the encoded bitstream to 600 bytes. But newer versions
- *   restrict to shorter bitstream.
- * - We add 10 bytes of guards to the internal bitstream container. The reason
- *   is that entropy decoder might read few bytes (3 according to our
- *   observations) more than the actual size of the bitstream. To avoid reading
- *   outside memory, in rare occasion of full-size bitstream we add 10 bytes
- *   of guard. */
-#define INTERNAL_STREAM_SIZE_W16 (STREAM_MAXW16 + 5)
-
-/* storage size for bit counts */
-//#define BIT_COUNTER_SIZE                        30
-/* maximum order of any AR model or filter */
-#define MAX_AR_MODEL_ORDER                      12
-
-/* Maximum number of iterations allowed to limit payload size */
-#define MAX_PAYLOAD_LIMIT_ITERATION           1
-
-/* Bandwidth estimator */
-
-#define MIN_ISAC_BW                           10000     /* Minimum bandwidth in bits per sec */
-#define MAX_ISAC_BW                           32000     /* Maxmum bandwidth in bits per sec */
-#define MIN_ISAC_MD                           5         /* Minimum Max Delay in ?? */
-#define MAX_ISAC_MD                           25        /* Maxmum Max Delay in ?? */
-#define DELAY_CORRECTION_MAX      717
-#define DELAY_CORRECTION_MED      819
-#define Thld_30_60         18000
-#define Thld_60_30         27000
-
-/* assumed header size; we don't know the exact number (header compression may be used) */
-#define HEADER_SIZE                           35       /* bytes */
-#define INIT_FRAME_LEN                        60
-#define INIT_BN_EST                           20000
-#define INIT_BN_EST_Q7                        2560000  /* 20 kbps in Q7 */
-#define INIT_REC_BN_EST_Q5                    789312   /* INIT_BN_EST + INIT_HDR_RATE in Q5 */
-
-/* 8738 in Q18 is ~ 1/30 */
-/* #define INIT_HDR_RATE (((HEADER_SIZE * 8 * 1000) * 8738) >> NUM_BITS_TO_SHIFT (INIT_FRAME_LEN)) */
-#define INIT_HDR_RATE                    4666
-/* number of packets in a row for a high rate burst */
-#define BURST_LEN                             3
-/* ms, max time between two full bursts */
-#define BURST_INTERVAL                        800
-/* number of packets in a row for initial high rate burst */
-#define INIT_BURST_LEN                        5
-/* bits/s, rate for the first BURST_LEN packets */
-#define INIT_RATE                             10240000 /* INIT_BN_EST in Q9 */
-
-
-/* For pitch analysis */
-#define PITCH_FRAME_LEN                         240  /* (FRAMESAMPLES/2) 30 ms  */
-#define PITCH_MAX_LAG                           140       /* 57 Hz  */
-#define PITCH_MIN_LAG                           20                /* 400 Hz */
-#define PITCH_MIN_LAG_Q8                        5120 /* 256 * PITCH_MIN_LAG */
-#define OFFSET_Q8                               768  /* 256 * 3 */
-
-#define PITCH_MAX_GAIN_Q12      1843                  /* 0.45 */
-#define PITCH_LAG_SPAN2                         65   /* (PITCH_MAX_LAG/2-PITCH_MIN_LAG/2+5) */
-#define PITCH_CORR_LEN2                         60     /* 15 ms  */
-#define PITCH_CORR_STEP2                        60   /* (PITCH_FRAME_LEN/4) */
-#define PITCH_SUBFRAMES                         4
-#define PITCH_SUBFRAME_LEN                      60   /* (PITCH_FRAME_LEN/PITCH_SUBFRAMES) */
-
-/* For pitch filter */
-#define PITCH_BUFFSIZE                   190  /* (PITCH_MAX_LAG + 50) Extra 50 for fraction and LP filters */
-#define PITCH_INTBUFFSIZE               430  /* (PITCH_FRAME_LEN+PITCH_BUFFSIZE) */
-#define PITCH_FRACS                             8
-#define PITCH_FRACORDER                         9
-#define PITCH_DAMPORDER                         5
-
-
-/* Order of high pass filter */
-#define HPORDER                                 2
-
-
-/* PLC */
-#define DECAY_RATE               10               /* Q15, 20% of decay every lost frame apllied linearly sample by sample*/
-#define PLC_WAS_USED              1
-#define PLC_NOT_USED              3
-#define RECOVERY_OVERLAP         80
-#define RESAMP_RES              256
-#define RESAMP_RES_BIT            8
-
-
-
-/* Define Error codes */
-/* 6000 General */
-#define ISAC_MEMORY_ALLOCATION_FAILED    6010
-#define ISAC_MODE_MISMATCH       6020
-#define ISAC_DISALLOWED_BOTTLENECK     6030
-#define ISAC_DISALLOWED_FRAME_LENGTH    6040
-/* 6200 Bandwidth estimator */
-#define ISAC_RANGE_ERROR_BW_ESTIMATOR    6240
-/* 6400 Encoder */
-#define ISAC_ENCODER_NOT_INITIATED     6410
-#define ISAC_DISALLOWED_CODING_MODE     6420
-#define ISAC_DISALLOWED_FRAME_MODE_ENCODER   6430
-#define ISAC_DISALLOWED_BITSTREAM_LENGTH            6440
-#define ISAC_PAYLOAD_LARGER_THAN_LIMIT              6450
-/* 6600 Decoder */
-#define ISAC_DECODER_NOT_INITIATED     6610
-#define ISAC_EMPTY_PACKET       6620
-#define ISAC_PACKET_TOO_SHORT 6625
-#define ISAC_DISALLOWED_FRAME_MODE_DECODER   6630
-#define ISAC_RANGE_ERROR_DECODE_FRAME_LENGTH  6640
-#define ISAC_RANGE_ERROR_DECODE_BANDWIDTH   6650
-#define ISAC_RANGE_ERROR_DECODE_PITCH_GAIN   6660
-#define ISAC_RANGE_ERROR_DECODE_PITCH_LAG   6670
-#define ISAC_RANGE_ERROR_DECODE_LPC     6680
-#define ISAC_RANGE_ERROR_DECODE_SPECTRUM   6690
-#define ISAC_LENGTH_MISMATCH      6730
-/* 6800 Call setup formats */
-#define ISAC_INCOMPATIBLE_FORMATS     6810
-
-
-#endif /* WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_FIX_SOURCE_SETTINGS_H_ */
diff --git a/modules/audio_coding/codecs/isac/fix/source/spectrum_ar_model_tables.c b/modules/audio_coding/codecs/isac/fix/source/spectrum_ar_model_tables.c
deleted file mode 100644
index cf2dea7..0000000
--- a/modules/audio_coding/codecs/isac/fix/source/spectrum_ar_model_tables.c
+++ /dev/null
@@ -1,193 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/*
- * spectrum_ar_model_tables.c
- *
- * This file contains tables with AR coefficients, Gain coefficients
- * and cosine tables.
- *
- */
-
-#include "spectrum_ar_model_tables.h"
-#include "settings.h"
-
-/********************* AR Coefficient Tables ************************/
-
-/* cdf for quantized reflection coefficient 1 */
-const uint16_t WebRtcIsacfix_kRc1Cdf[12] = {
-  0,  2,  4,  129,  7707,  57485,  65495,  65527,  65529,  65531,
-  65533,  65535
-};
-
-/* cdf for quantized reflection coefficient 2 */
-const uint16_t WebRtcIsacfix_kRc2Cdf[12] = {
-  0,  2,  4,  7,  531,  25298,  64525,  65526,  65529,  65531,
-  65533,  65535
-};
-
-/* cdf for quantized reflection coefficient 3 */
-const uint16_t WebRtcIsacfix_kRc3Cdf[12] = {
-  0,  2,  4,  6,  620,  22898,  64843,  65527,  65529,  65531,
-  65533,  65535
-};
-
-/* cdf for quantized reflection coefficient 4 */
-const uint16_t WebRtcIsacfix_kRc4Cdf[12] = {
-  0,  2,  4,  6,  35,  10034,  60733,  65506,  65529,  65531,
-  65533,  65535
-};
-
-/* cdf for quantized reflection coefficient 5 */
-const uint16_t WebRtcIsacfix_kRc5Cdf[12] = {
-  0,  2,  4,  6,  36,  7567,  56727,  65385,  65529,  65531,
-  65533,  65535
-};
-
-/* cdf for quantized reflection coefficient 6 */
-const uint16_t WebRtcIsacfix_kRc6Cdf[12] = {
-  0,  2,  4,  6,  14,  6579,  57360,  65409,  65529,  65531,
-  65533,  65535
-};
-
-/* representation levels for quantized reflection coefficient 1 */
-const int16_t WebRtcIsacfix_kRc1Levels[11] = {
-  -32104, -29007, -23202, -15496, -9279, -2577, 5934, 17535, 24512, 29503, 32104
-};
-
-/* representation levels for quantized reflection coefficient 2 */
-const int16_t WebRtcIsacfix_kRc2Levels[11] = {
-  -32104, -29503, -23494, -15261, -7309, -1399, 6158, 16381, 24512, 29503, 32104
-};
-
-/* representation levels for quantized reflection coefficient 3 */
-const int16_t WebRtcIsacfix_kRc3Levels[11] = {
-  -32104, -29503, -23157, -15186, -7347, -1359, 5829, 17535, 24512, 29503, 32104
-};
-
-/* representation levels for quantized reflection coefficient 4 */
-const int16_t WebRtcIsacfix_kRc4Levels[11] = {
-  -32104, -29503, -24512, -15362, -6665, -342, 6596, 14585, 24512, 29503, 32104
-};
-
-/* representation levels for quantized reflection coefficient 5 */
-const int16_t WebRtcIsacfix_kRc5Levels[11] = {
-  -32104, -29503, -24512, -15005, -6564, -106, 7123, 14920, 24512, 29503, 32104
-};
-
-/* representation levels for quantized reflection coefficient 6 */
-const int16_t WebRtcIsacfix_kRc6Levels[11] = {
-  -32104, -29503, -24512, -15096, -6656, -37, 7036, 14847, 24512, 29503, 32104
-};
-
-/* quantization boundary levels for reflection coefficients */
-const int16_t WebRtcIsacfix_kRcBound[12] = {
-  -32768, -31441, -27566, -21458, -13612, -4663,
-  4663, 13612, 21458, 27566, 31441, 32767
-};
-
-/* initial index for AR reflection coefficient quantizer and cdf table search */
-const uint16_t WebRtcIsacfix_kRcInitInd[6] = {
-  5,  5,  5,  5,  5,  5
-};
-
-/* pointers to AR cdf tables */
-const uint16_t *WebRtcIsacfix_kRcCdfPtr[AR_ORDER] = {
-  WebRtcIsacfix_kRc1Cdf,
-  WebRtcIsacfix_kRc2Cdf,
-  WebRtcIsacfix_kRc3Cdf,
-  WebRtcIsacfix_kRc4Cdf,
-  WebRtcIsacfix_kRc5Cdf,
-  WebRtcIsacfix_kRc6Cdf
-};
-
-/* pointers to AR representation levels tables */
-const int16_t *WebRtcIsacfix_kRcLevPtr[AR_ORDER] = {
-  WebRtcIsacfix_kRc1Levels,
-  WebRtcIsacfix_kRc2Levels,
-  WebRtcIsacfix_kRc3Levels,
-  WebRtcIsacfix_kRc4Levels,
-  WebRtcIsacfix_kRc5Levels,
-  WebRtcIsacfix_kRc6Levels
-};
-
-
-/******************** GAIN Coefficient Tables ***********************/
-
-/* cdf for Gain coefficient */
-const uint16_t WebRtcIsacfix_kGainCdf[19] = {
-  0,  2,  4,  6,  8,  10,  12,  14,  16,  1172,
-  11119,  29411,  51699,  64445,  65527,  65529,  65531,  65533,  65535
-};
-
-/* representation levels for quantized squared Gain coefficient */
-const int32_t WebRtcIsacfix_kGain2Lev[18] = {
-  128, 128, 128, 128, 128, 215, 364, 709, 1268,
-  1960, 3405, 6078, 11286, 17827, 51918, 134498, 487432, 2048000
-};
-
-/* quantization boundary levels for squared Gain coefficient */
-const int32_t WebRtcIsacfix_kGain2Bound[19] = {
-  0, 21, 35, 59, 99, 166, 280, 475, 815, 1414,
-  2495, 4505, 8397, 16405, 34431, 81359, 240497, 921600, 0x7FFFFFFF
-};
-
-/* pointers to Gain cdf table */
-const uint16_t *WebRtcIsacfix_kGainPtr[1] = {
-  WebRtcIsacfix_kGainCdf
-};
-
-/* gain initial index for gain quantizer and cdf table search */
-const uint16_t WebRtcIsacfix_kGainInitInd[1] = {
-  11
-};
-
-
-/************************* Cosine Tables ****************************/
-
-/* cosine table */
-const int16_t WebRtcIsacfix_kCos[6][60] = {
-  { 512,   512,   511,   510,   508,   507,   505,   502,   499,   496,
-        493,   489,   485,   480,   476,   470,   465,   459,   453,   447,
- 440,   433,   426,   418,   410,   402,   394,   385,   376,   367,
-        357,   348,   338,   327,   317,   306,   295,   284,   273,   262,
- 250,   238,   226,   214,   202,   190,   177,   165,   152,   139,
-        126,   113,   100,   87,   73,   60,   47,   33,   20,   7       },
-  { 512,   510,   508,   503,   498,   491,   483,   473,   462,   450,
-        437,   422,   406,   389,   371,   352,   333,   312,   290,   268,
- 244,   220,   196,   171,   145,   120,   93,   67,   40,   13,
-        -13,   -40,   -67,   -93,   -120,   -145,   -171,   -196,   -220,   -244,
- -268,   -290,   -312,   -333,   -352,   -371,   -389,   -406,   -422,   -437,
-        -450,   -462,   -473,   -483,   -491,   -498,   -503,   -508,   -510,   -512    },
-  { 512,   508,   502,   493,   480,   465,   447,   426,   402,   376,
-        348,   317,   284,   250,   214,   177,   139,   100,   60,   20,
- -20,   -60,   -100,   -139,   -177,   -214,   -250,   -284,   -317,   -348,
-        -376,   -402,   -426,   -447,   -465,   -480,   -493,   -502,   -508,   -512,
- -512,   -508,   -502,   -493,   -480,   -465,   -447,   -426,   -402,   -376,
-        -348,   -317,   -284,   -250,   -214,   -177,   -139,   -100,   -60,   -20     },
-  { 511,   506,   495,   478,   456,   429,   398,   362,   322,   279,
-        232,   183,   133,   80,   27,   -27,   -80,   -133,   -183,   -232,
- -279,   -322,   -362,   -398,   -429,   -456,   -478,   -495,   -506,   -511,
-        -511,   -506,   -495,   -478,   -456,   -429,   -398,   -362,   -322,   -279,
- -232,   -183,   -133,   -80,   -27,   27,   80,   133,   183,   232,
-        279,   322,   362,   398,   429,   456,   478,   495,   506,   511     },
-  { 511,   502,   485,   459,   426,   385,   338,   284,   226,   165,
-        100,   33,   -33,   -100,   -165,   -226,   -284,   -338,   -385,   -426,
- -459,   -485,   -502,   -511,   -511,   -502,   -485,   -459,   -426,   -385,
-        -338,   -284,   -226,   -165,   -100,   -33,   33,   100,   165,   226,
- 284,   338,   385,   426,   459,   485,   502,   511,   511,   502,
-        485,   459,   426,   385,   338,   284,   226,   165,   100,   33      },
-  { 510,   498,   473,   437,   389,   333,   268,   196,   120,   40,
-        -40,   -120,   -196,   -268,   -333,   -389,   -437,   -473,   -498,   -510,
- -510,   -498,   -473,   -437,   -389,   -333,   -268,   -196,   -120,   -40,
-        40,   120,   196,   268,   333,   389,   437,   473,   498,   510,
- 510,   498,   473,   437,   389,   333,   268,   196,   120,   40,
-        -40,   -120,   -196,   -268,   -333,   -389,   -437,   -473,   -498,   -510    }
-};
diff --git a/modules/audio_coding/codecs/isac/fix/source/spectrum_ar_model_tables.h b/modules/audio_coding/codecs/isac/fix/source/spectrum_ar_model_tables.h
deleted file mode 100644
index 5583206..0000000
--- a/modules/audio_coding/codecs/isac/fix/source/spectrum_ar_model_tables.h
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/*
- * spectrum_ar_model_tables.h
- *
- * This file contains definitions of tables with AR coefficients,
- * Gain coefficients and cosine tables.
- *
- */
-
-#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_FIX_SOURCE_SPECTRUM_AR_MODEL_TABLES_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_FIX_SOURCE_SPECTRUM_AR_MODEL_TABLES_H_
-
-#include "settings.h"
-#include "webrtc/typedefs.h"
-
-/********************* AR Coefficient Tables ************************/
-/* cdf for quantized reflection coefficient 1 */
-extern const uint16_t WebRtcIsacfix_kRc1Cdf[12];
-
-/* cdf for quantized reflection coefficient 2 */
-extern const uint16_t WebRtcIsacfix_kRc2Cdf[12];
-
-/* cdf for quantized reflection coefficient 3 */
-extern const uint16_t WebRtcIsacfix_kRc3Cdf[12];
-
-/* cdf for quantized reflection coefficient 4 */
-extern const uint16_t WebRtcIsacfix_kRc4Cdf[12];
-
-/* cdf for quantized reflection coefficient 5 */
-extern const uint16_t WebRtcIsacfix_kRc5Cdf[12];
-
-/* cdf for quantized reflection coefficient 6 */
-extern const uint16_t WebRtcIsacfix_kRc6Cdf[12];
-
-/* representation levels for quantized reflection coefficient 1 */
-extern const int16_t WebRtcIsacfix_kRc1Levels[11];
-
-/* representation levels for quantized reflection coefficient 2 */
-extern const int16_t WebRtcIsacfix_kRc2Levels[11];
-
-/* representation levels for quantized reflection coefficient 3 */
-extern const int16_t WebRtcIsacfix_kRc3Levels[11];
-
-/* representation levels for quantized reflection coefficient 4 */
-extern const int16_t WebRtcIsacfix_kRc4Levels[11];
-
-/* representation levels for quantized reflection coefficient 5 */
-extern const int16_t WebRtcIsacfix_kRc5Levels[11];
-
-/* representation levels for quantized reflection coefficient 6 */
-extern const int16_t WebRtcIsacfix_kRc6Levels[11];
-
-/* quantization boundary levels for reflection coefficients */
-extern const int16_t WebRtcIsacfix_kRcBound[12];
-
-/* initial indices for AR reflection coefficient quantizer and cdf table search */
-extern const uint16_t WebRtcIsacfix_kRcInitInd[AR_ORDER];
-
-/* pointers to AR cdf tables */
-extern const uint16_t *WebRtcIsacfix_kRcCdfPtr[AR_ORDER];
-
-/* pointers to AR representation levels tables */
-extern const int16_t *WebRtcIsacfix_kRcLevPtr[AR_ORDER];
-
-
-/******************** GAIN Coefficient Tables ***********************/
-/* cdf for Gain coefficient */
-extern const uint16_t WebRtcIsacfix_kGainCdf[19];
-
-/* representation levels for quantized Gain coefficient */
-extern const int32_t WebRtcIsacfix_kGain2Lev[18];
-
-/* squared quantization boundary levels for Gain coefficient */
-extern const int32_t WebRtcIsacfix_kGain2Bound[19];
-
-/* pointer to Gain cdf table */
-extern const uint16_t *WebRtcIsacfix_kGainPtr[1];
-
-/* Gain initial index for gain quantizer and cdf table search */
-extern const uint16_t WebRtcIsacfix_kGainInitInd[1];
-
-/************************* Cosine Tables ****************************/
-/* Cosine table */
-extern const int16_t WebRtcIsacfix_kCos[6][60];
-
-#endif /* WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_FIX_SOURCE_SPECTRUM_AR_MODEL_TABLES_H_ */
diff --git a/modules/audio_coding/codecs/isac/fix/source/structs.h b/modules/audio_coding/codecs/isac/fix/source/structs.h
deleted file mode 100644
index 278af75..0000000
--- a/modules/audio_coding/codecs/isac/fix/source/structs.h
+++ /dev/null
@@ -1,382 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/*
- * structs.h
- *
- * This header file contains all the structs used in the ISAC codec
- *
- */
-
-#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_FIX_SOURCE_STRUCTS_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_FIX_SOURCE_STRUCTS_H_
-
-
-#include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
-#include "webrtc/modules/audio_coding/codecs/isac/bandwidth_info.h"
-#include "webrtc/modules/audio_coding/codecs/isac/fix/source/settings.h"
-#include "webrtc/typedefs.h"
-
-/* Bitstream struct for decoder */
-typedef struct Bitstreamstruct_dec {
-
-  uint16_t  stream[INTERNAL_STREAM_SIZE_W16];  /* Array bytestream to decode */
-  uint32_t  W_upper;          /* Upper boundary of interval W */
-  uint32_t  streamval;
-  uint16_t  stream_index;     /* Index to the current position in bytestream */
-  int16_t   full;             /* 0 - first byte in memory filled, second empty*/
-  /* 1 - both bytes are empty (we just filled the previous memory */
-
-  size_t stream_size;  /* The size of stream in bytes. */
-} Bitstr_dec;
-
-/* Bitstream struct for encoder */
-typedef struct Bitstreamstruct_enc {
-
-  uint16_t  stream[STREAM_MAXW16_60MS];   /* Vector for adding encoded bytestream */
-  uint32_t  W_upper;          /* Upper boundary of interval W */
-  uint32_t  streamval;
-  uint16_t  stream_index;     /* Index to the current position in bytestream */
-  int16_t   full;             /* 0 - first byte in memory filled, second empty*/
-  /* 1 - both bytes are empty (we just filled the previous memory */
-
-} Bitstr_enc;
-
-
-typedef struct {
-
-  int16_t DataBufferLoQ0[WINLEN];
-  int16_t DataBufferHiQ0[WINLEN];
-
-  int32_t CorrBufLoQQ[ORDERLO+1];
-  int32_t CorrBufHiQQ[ORDERHI+1];
-
-  int16_t CorrBufLoQdom[ORDERLO+1];
-  int16_t CorrBufHiQdom[ORDERHI+1];
-
-  int32_t PreStateLoGQ15[ORDERLO+1];
-  int32_t PreStateHiGQ15[ORDERHI+1];
-
-  uint32_t OldEnergy;
-
-} MaskFiltstr_enc;
-
-
-
-typedef struct {
-
-  int16_t PostStateLoGQ0[ORDERLO+1];
-  int16_t PostStateHiGQ0[ORDERHI+1];
-
-  uint32_t OldEnergy;
-
-} MaskFiltstr_dec;
-
-
-
-
-
-
-
-
-typedef struct {
-
-  //state vectors for each of the two analysis filters
-
-  int32_t INSTAT1_fix[2*(QORDER-1)];
-  int32_t INSTAT2_fix[2*(QORDER-1)];
-  int16_t INLABUF1_fix[QLOOKAHEAD];
-  int16_t INLABUF2_fix[QLOOKAHEAD];
-
-  /* High pass filter */
-  int32_t HPstates_fix[HPORDER];
-
-} PreFiltBankstr;
-
-
-typedef struct {
-
-  //state vectors for each of the two analysis filters
-  int32_t STATE_0_LOWER_fix[2*POSTQORDER];
-  int32_t STATE_0_UPPER_fix[2*POSTQORDER];
-
-  /* High pass filter */
-
-  int32_t HPstates1_fix[HPORDER];
-  int32_t HPstates2_fix[HPORDER];
-
-} PostFiltBankstr;
-
-typedef struct {
-
-
-  /* data buffer for pitch filter */
-  int16_t ubufQQ[PITCH_BUFFSIZE];
-
-  /* low pass state vector */
-  int16_t ystateQQ[PITCH_DAMPORDER];
-
-  /* old lag and gain */
-  int16_t oldlagQ7;
-  int16_t oldgainQ12;
-
-} PitchFiltstr;
-
-
-
-typedef struct {
-
-  //for inital estimator
-  int16_t   dec_buffer16[PITCH_CORR_LEN2+PITCH_CORR_STEP2+PITCH_MAX_LAG/2-PITCH_FRAME_LEN/2+2];
-  int32_t   decimator_state32[2*ALLPASSSECTIONS+1];
-  int16_t   inbuf[QLOOKAHEAD];
-
-  PitchFiltstr  PFstr_wght;
-  PitchFiltstr  PFstr;
-
-
-} PitchAnalysisStruct;
-
-
-typedef struct {
-  /* Parameters used in PLC to avoid re-computation       */
-
-  /* --- residual signals --- */
-  int16_t prevPitchInvIn[FRAMESAMPLES/2];
-  int16_t prevPitchInvOut[PITCH_MAX_LAG + 10];            // [FRAMESAMPLES/2]; save 90
-  int32_t prevHP[PITCH_MAX_LAG + 10];                     // [FRAMESAMPLES/2]; save 90
-
-
-  int16_t decayCoeffPriodic; /* how much to supress a sample */
-  int16_t decayCoeffNoise;
-  int16_t used;       /* if PLC is used */
-
-
-  int16_t *lastPitchLP;                                  // [FRAMESAMPLES/2]; saved 240;
-
-
-  /* --- LPC side info --- */
-  int16_t lofilt_coefQ15[ ORDERLO ];
-  int16_t hifilt_coefQ15[ ORDERHI ];
-  int32_t gain_lo_hiQ17[2];
-
-  /* --- LTP side info --- */
-  int16_t AvgPitchGain_Q12;
-  int16_t lastPitchGain_Q12;
-  int16_t lastPitchLag_Q7;
-
-  /* --- Add-overlap in recovery packet --- */
-  int16_t overlapLP[ RECOVERY_OVERLAP ];                 // [FRAMESAMPLES/2]; saved 160
-
-  int16_t pitchCycles;
-  int16_t A;
-  int16_t B;
-  size_t pitchIndex;
-  size_t stretchLag;
-  int16_t *prevPitchLP;                                  // [ FRAMESAMPLES/2 ]; saved 240
-  int16_t seed;
-
-  int16_t std;
-} PLCstr;
-
-
-
-/* Have instance of struct together with other iSAC structs */
-typedef struct {
-
-  int16_t   prevFrameSizeMs;      /* Previous frame size (in ms) */
-  uint16_t  prevRtpNumber;      /* Previous RTP timestamp from received packet */
-  /* (in samples relative beginning)  */
-  uint32_t  prevSendTime;   /* Send time for previous packet, from RTP header */
-  uint32_t  prevArrivalTime;      /* Arrival time for previous packet (in ms using timeGetTime()) */
-  uint16_t  prevRtpRate;          /* rate of previous packet, derived from RTP timestamps (in bits/s) */
-  uint32_t  lastUpdate;           /* Time since the last update of the Bottle Neck estimate (in samples) */
-  uint32_t  lastReduction;        /* Time sinse the last reduction (in samples) */
-  int32_t   countUpdates;         /* How many times the estimate was update in the beginning */
-
-  /* The estimated bottle neck rate from there to here (in bits/s)                */
-  uint32_t  recBw;
-  uint32_t  recBwInv;
-  uint32_t  recBwAvg;
-  uint32_t  recBwAvgQ;
-
-  uint32_t  minBwInv;
-  uint32_t  maxBwInv;
-
-  /* The estimated mean absolute jitter value, as seen on this side (in ms)       */
-  int32_t   recJitter;
-  int32_t   recJitterShortTerm;
-  int32_t   recJitterShortTermAbs;
-  int32_t   recMaxDelay;
-  int32_t   recMaxDelayAvgQ;
-
-
-  int16_t   recHeaderRate;         /* (assumed) bitrate for headers (bps) */
-
-  uint32_t  sendBwAvg;           /* The estimated bottle neck rate from here to there (in bits/s) */
-  int32_t   sendMaxDelayAvg;    /* The estimated mean absolute jitter value, as seen on the other siee (in ms)  */
-
-
-  int16_t   countRecPkts;          /* number of packets received since last update */
-  int16_t   highSpeedRec;        /* flag for marking that a high speed network has been detected downstream */
-
-  /* number of consecutive pkts sent during which the bwe estimate has
-     remained at a value greater than the downstream threshold for determining highspeed network */
-  int16_t   countHighSpeedRec;
-
-  /* flag indicating bwe should not adjust down immediately for very late pckts */
-  int16_t   inWaitPeriod;
-
-  /* variable holding the time of the start of a window of time when
-     bwe should not adjust down immediately for very late pckts */
-  uint32_t  startWaitPeriod;
-
-  /* number of consecutive pkts sent during which the bwe estimate has
-     remained at a value greater than the upstream threshold for determining highspeed network */
-  int16_t   countHighSpeedSent;
-
-  /* flag indicated the desired number of packets over threshold rate have been sent and
-     bwe will assume the connection is over broadband network */
-  int16_t   highSpeedSend;
-
-  IsacBandwidthInfo external_bw_info;
-} BwEstimatorstr;
-
-
-typedef struct {
-
-  /* boolean, flags if previous packet exceeded B.N. */
-  int16_t    PrevExceed;
-  /* ms */
-  int16_t    ExceedAgo;
-  /* packets left to send in current burst */
-  int16_t    BurstCounter;
-  /* packets */
-  int16_t    InitCounter;
-  /* ms remaining in buffer when next packet will be sent */
-  int16_t    StillBuffered;
-
-} RateModel;
-
-/* The following strutc is used to store data from encoding, to make it
-   fast and easy to construct a new bitstream with a different Bandwidth
-   estimate. All values (except framelength and minBytes) is double size to
-   handle 60 ms of data.
-*/
-typedef struct {
-
-  /* Used to keep track of if it is first or second part of 60 msec packet */
-  int     startIdx;
-
-  /* Frame length in samples */
-  int16_t         framelength;
-
-  /* Pitch Gain */
-  int16_t   pitchGain_index[2];
-
-  /* Pitch Lag */
-  int32_t   meanGain[2];
-  int16_t   pitchIndex[PITCH_SUBFRAMES*2];
-
-  /* LPC */
-  int32_t         LPCcoeffs_g[12*2]; /* KLT_ORDER_GAIN = 12 */
-  int16_t   LPCindex_s[108*2]; /* KLT_ORDER_SHAPE = 108 */
-  int16_t   LPCindex_g[12*2];  /* KLT_ORDER_GAIN = 12 */
-
-  /* Encode Spec */
-  int16_t   fre[FRAMESAMPLES];
-  int16_t   fim[FRAMESAMPLES];
-  int16_t   AvgPitchGain[2];
-
-  /* Used in adaptive mode only */
-  int     minBytes;
-
-} IsacSaveEncoderData;
-
-typedef struct {
-
-  Bitstr_enc          bitstr_obj;
-  MaskFiltstr_enc     maskfiltstr_obj;
-  PreFiltBankstr      prefiltbankstr_obj;
-  PitchFiltstr        pitchfiltstr_obj;
-  PitchAnalysisStruct pitchanalysisstr_obj;
-  RateModel           rate_data_obj;
-
-  int16_t         buffer_index;
-  int16_t         current_framesamples;
-
-  int16_t      data_buffer_fix[FRAMESAMPLES]; // the size was MAX_FRAMESAMPLES
-
-  int16_t         frame_nb;
-  int16_t         BottleNeck;
-  int16_t         MaxDelay;
-  int16_t         new_framelength;
-  int16_t         s2nr;
-  uint16_t        MaxBits;
-
-  int16_t         bitstr_seed;
-#ifdef WEBRTC_ISAC_FIX_NB_CALLS_ENABLED
-  PostFiltBankstr     interpolatorstr_obj;
-#endif
-
-  IsacSaveEncoderData *SaveEnc_ptr;
-  int16_t         payloadLimitBytes30; /* Maximum allowed number of bits for a 30 msec packet */
-  int16_t         payloadLimitBytes60; /* Maximum allowed number of bits for a 30 msec packet */
-  int16_t         maxPayloadBytes;     /* Maximum allowed number of bits for both 30 and 60 msec packet */
-  int16_t         maxRateInBytes;      /* Maximum allowed rate in bytes per 30 msec packet */
-  int16_t         enforceFrameSize;    /* If set iSAC will never change packet size */
-
-} IsacFixEncoderInstance;
-
-
-typedef struct {
-
-  Bitstr_dec          bitstr_obj;
-  MaskFiltstr_dec     maskfiltstr_obj;
-  PostFiltBankstr     postfiltbankstr_obj;
-  PitchFiltstr        pitchfiltstr_obj;
-  PLCstr              plcstr_obj;               /* TS; for packet loss concealment */
-
-#ifdef WEBRTC_ISAC_FIX_NB_CALLS_ENABLED
-  PreFiltBankstr      decimatorstr_obj;
-#endif
-
-} IsacFixDecoderInstance;
-
-
-
-typedef struct {
-
-  IsacFixEncoderInstance ISACenc_obj;
-  IsacFixDecoderInstance ISACdec_obj;
-  BwEstimatorstr     bwestimator_obj;
-  int16_t         CodingMode;       /* 0 = adaptive; 1 = instantaneous */
-  int16_t   errorcode;
-  int16_t   initflag;  /* 0 = nothing initiated; 1 = encoder or decoder */
-  /* not initiated; 2 = all initiated */
-} ISACFIX_SubStruct;
-
-
-typedef struct {
-  int32_t   lpcGains[12];     /* 6 lower-band & 6 upper-band we may need to double it for 60*/
-  /* */
-  uint32_t  W_upper;          /* Upper boundary of interval W */
-  uint32_t  streamval;
-  uint16_t  stream_index;     /* Index to the current position in bytestream */
-  int16_t   full;             /* 0 - first byte in memory filled, second empty*/
-  /* 1 - both bytes are empty (we just filled the previous memory */
-  uint16_t  beforeLastWord;
-  uint16_t  lastWord;
-} transcode_obj;
-
-
-//Bitstr_enc myBitStr;
-
-#endif  /* WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_FIX_SOURCE_STRUCTS_H_ */
diff --git a/modules/audio_coding/codecs/isac/fix/source/transform.c b/modules/audio_coding/codecs/isac/fix/source/transform.c
deleted file mode 100644
index 362610a..0000000
--- a/modules/audio_coding/codecs/isac/fix/source/transform.c
+++ /dev/null
@@ -1,213 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/*
- * WebRtcIsacfix_kTransform.c
- *
- * Transform functions
- *
- */
-
-#include "webrtc/modules/audio_coding/codecs/isac/fix/source/codec.h"
-#include "webrtc/modules/audio_coding/codecs/isac/fix/source/fft.h"
-#include "webrtc/modules/audio_coding/codecs/isac/fix/source/settings.h"
-
-/* Tables are defined in transform_tables.c file or ARM assembly files. */
-/* Cosine table 1 in Q14 */
-extern const int16_t WebRtcIsacfix_kCosTab1[FRAMESAMPLES/2];
-/* Sine table 1 in Q14 */
-extern const int16_t WebRtcIsacfix_kSinTab1[FRAMESAMPLES/2];
-/* Sine table 2 in Q14 */
-extern const int16_t WebRtcIsacfix_kSinTab2[FRAMESAMPLES/4];
-
-void WebRtcIsacfix_Time2SpecC(int16_t *inre1Q9,
-                              int16_t *inre2Q9,
-                              int16_t *outreQ7,
-                              int16_t *outimQ7)
-{
-
-  int k;
-  int32_t tmpreQ16[FRAMESAMPLES/2], tmpimQ16[FRAMESAMPLES/2];
-  int16_t tmp1rQ14, tmp1iQ14;
-  int32_t xrQ16, xiQ16, yrQ16, yiQ16;
-  int32_t v1Q16, v2Q16;
-  int16_t factQ19, sh;
-
-  /* Multiply with complex exponentials and combine into one complex vector */
-  factQ19 = 16921; // 0.5/sqrt(240) in Q19 is round(.5/sqrt(240)*(2^19)) = 16921
-  for (k = 0; k < FRAMESAMPLES/2; k++) {
-    tmp1rQ14 = WebRtcIsacfix_kCosTab1[k];
-    tmp1iQ14 = WebRtcIsacfix_kSinTab1[k];
-    xrQ16 = (tmp1rQ14 * inre1Q9[k] + tmp1iQ14 * inre2Q9[k]) >> 7;
-    xiQ16 = (tmp1rQ14 * inre2Q9[k] - tmp1iQ14 * inre1Q9[k]) >> 7;
-    // Q-domains below: (Q16*Q19>>16)>>3 = Q16
-    tmpreQ16[k] = (WEBRTC_SPL_MUL_16_32_RSFT16(factQ19, xrQ16) + 4) >> 3;
-    tmpimQ16[k] = (WEBRTC_SPL_MUL_16_32_RSFT16(factQ19, xiQ16) + 4) >> 3;
-  }
-
-
-  xrQ16  = WebRtcSpl_MaxAbsValueW32(tmpreQ16, FRAMESAMPLES/2);
-  yrQ16 = WebRtcSpl_MaxAbsValueW32(tmpimQ16, FRAMESAMPLES/2);
-  if (yrQ16>xrQ16) {
-    xrQ16 = yrQ16;
-  }
-
-  sh = WebRtcSpl_NormW32(xrQ16);
-  sh = sh-24; //if sh becomes >=0, then we should shift sh steps to the left, and the domain will become Q(16+sh)
-  //if sh becomes <0, then we should shift -sh steps to the right, and the domain will become Q(16+sh)
-
-  //"Fastest" vectors
-  if (sh>=0) {
-    for (k=0; k<FRAMESAMPLES/2; k++) {
-      inre1Q9[k] = (int16_t)(tmpreQ16[k] << sh);  // Q(16+sh)
-      inre2Q9[k] = (int16_t)(tmpimQ16[k] << sh);  // Q(16+sh)
-    }
-  } else {
-    int32_t round = 1 << (-sh - 1);
-    for (k=0; k<FRAMESAMPLES/2; k++) {
-      inre1Q9[k] = (int16_t)((tmpreQ16[k] + round) >> -sh);  // Q(16+sh)
-      inre2Q9[k] = (int16_t)((tmpimQ16[k] + round) >> -sh);  // Q(16+sh)
-    }
-  }
-
-  /* Get DFT */
-  WebRtcIsacfix_FftRadix16Fastest(inre1Q9, inre2Q9, -1); // real call
-
-  //"Fastest" vectors
-  if (sh>=0) {
-    for (k=0; k<FRAMESAMPLES/2; k++) {
-      tmpreQ16[k] = inre1Q9[k] >> sh;  // Q(16+sh) -> Q16
-      tmpimQ16[k] = inre2Q9[k] >> sh;  // Q(16+sh) -> Q16
-    }
-  } else {
-    for (k=0; k<FRAMESAMPLES/2; k++) {
-      tmpreQ16[k] = inre1Q9[k] << -sh;  // Q(16+sh) -> Q16
-      tmpimQ16[k] = inre2Q9[k] << -sh;  // Q(16+sh) -> Q16
-    }
-  }
-
-
-  /* Use symmetry to separate into two complex vectors and center frames in time around zero */
-  for (k = 0; k < FRAMESAMPLES/4; k++) {
-    xrQ16 = tmpreQ16[k] + tmpreQ16[FRAMESAMPLES/2 - 1 - k];
-    yiQ16 = -tmpreQ16[k] + tmpreQ16[FRAMESAMPLES/2 - 1 - k];
-    xiQ16 = tmpimQ16[k] - tmpimQ16[FRAMESAMPLES/2 - 1 - k];
-    yrQ16 = tmpimQ16[k] + tmpimQ16[FRAMESAMPLES/2 - 1 - k];
-    tmp1rQ14 = -WebRtcIsacfix_kSinTab2[FRAMESAMPLES/4 - 1 - k];
-    tmp1iQ14 = WebRtcIsacfix_kSinTab2[k];
-    v1Q16 = WEBRTC_SPL_MUL_16_32_RSFT14(tmp1rQ14, xrQ16) - WEBRTC_SPL_MUL_16_32_RSFT14(tmp1iQ14, xiQ16);
-    v2Q16 = WEBRTC_SPL_MUL_16_32_RSFT14(tmp1iQ14, xrQ16) + WEBRTC_SPL_MUL_16_32_RSFT14(tmp1rQ14, xiQ16);
-    outreQ7[k] = (int16_t)(v1Q16 >> 9);
-    outimQ7[k] = (int16_t)(v2Q16 >> 9);
-    v1Q16 = -WEBRTC_SPL_MUL_16_32_RSFT14(tmp1iQ14, yrQ16) - WEBRTC_SPL_MUL_16_32_RSFT14(tmp1rQ14, yiQ16);
-    v2Q16 = -WEBRTC_SPL_MUL_16_32_RSFT14(tmp1rQ14, yrQ16) + WEBRTC_SPL_MUL_16_32_RSFT14(tmp1iQ14, yiQ16);
-    // CalcLrIntQ(v1Q16, 9);
-    outreQ7[FRAMESAMPLES / 2 - 1 - k] = (int16_t)(v1Q16 >> 9);
-    // CalcLrIntQ(v2Q16, 9);
-    outimQ7[FRAMESAMPLES / 2 - 1 - k] = (int16_t)(v2Q16 >> 9);
-
-  }
-}
-
-
-void WebRtcIsacfix_Spec2TimeC(int16_t *inreQ7, int16_t *inimQ7, int32_t *outre1Q16, int32_t *outre2Q16)
-{
-
-  int k;
-  int16_t tmp1rQ14, tmp1iQ14;
-  int32_t xrQ16, xiQ16, yrQ16, yiQ16;
-  int32_t tmpInRe, tmpInIm, tmpInRe2, tmpInIm2;
-  int16_t factQ11;
-  int16_t sh;
-
-  for (k = 0; k < FRAMESAMPLES/4; k++) {
-    /* Move zero in time to beginning of frames */
-    tmp1rQ14 = -WebRtcIsacfix_kSinTab2[FRAMESAMPLES/4 - 1 - k];
-    tmp1iQ14 = WebRtcIsacfix_kSinTab2[k];
-
-    tmpInRe = inreQ7[k] * (1 << 9);  // Q7 -> Q16
-    tmpInIm = inimQ7[k] * (1 << 9);  // Q7 -> Q16
-    tmpInRe2 = inreQ7[FRAMESAMPLES / 2 - 1 - k] * (1 << 9);  // Q7 -> Q16
-    tmpInIm2 = inimQ7[FRAMESAMPLES / 2 - 1 - k] * (1 << 9);  // Q7 -> Q16
-
-    xrQ16 = WEBRTC_SPL_MUL_16_32_RSFT14(tmp1rQ14, tmpInRe) + WEBRTC_SPL_MUL_16_32_RSFT14(tmp1iQ14, tmpInIm);
-    xiQ16 = WEBRTC_SPL_MUL_16_32_RSFT14(tmp1rQ14, tmpInIm) - WEBRTC_SPL_MUL_16_32_RSFT14(tmp1iQ14, tmpInRe);
-    yrQ16 = -WEBRTC_SPL_MUL_16_32_RSFT14(tmp1rQ14, tmpInIm2) - WEBRTC_SPL_MUL_16_32_RSFT14(tmp1iQ14, tmpInRe2);
-    yiQ16 = -WEBRTC_SPL_MUL_16_32_RSFT14(tmp1rQ14, tmpInRe2) + WEBRTC_SPL_MUL_16_32_RSFT14(tmp1iQ14, tmpInIm2);
-
-    /* Combine into one vector,  z = x + j * y */
-    outre1Q16[k] = xrQ16 - yiQ16;
-    outre1Q16[FRAMESAMPLES/2 - 1 - k] = xrQ16 + yiQ16;
-    outre2Q16[k] = xiQ16 + yrQ16;
-    outre2Q16[FRAMESAMPLES/2 - 1 - k] = -xiQ16 + yrQ16;
-  }
-
-  /* Get IDFT */
-  tmpInRe  = WebRtcSpl_MaxAbsValueW32(outre1Q16, 240);
-  tmpInIm = WebRtcSpl_MaxAbsValueW32(outre2Q16, 240);
-  if (tmpInIm>tmpInRe) {
-    tmpInRe = tmpInIm;
-  }
-
-  sh = WebRtcSpl_NormW32(tmpInRe);
-  sh = sh-24; //if sh becomes >=0, then we should shift sh steps to the left, and the domain will become Q(16+sh)
-  //if sh becomes <0, then we should shift -sh steps to the right, and the domain will become Q(16+sh)
-
-  //"Fastest" vectors
-  if (sh>=0) {
-    for (k=0; k<240; k++) {
-      inreQ7[k] = (int16_t)(outre1Q16[k] << sh);  // Q(16+sh)
-      inimQ7[k] = (int16_t)(outre2Q16[k] << sh);  // Q(16+sh)
-    }
-  } else {
-    int32_t round = 1 << (-sh - 1);
-    for (k=0; k<240; k++) {
-      inreQ7[k] = (int16_t)((outre1Q16[k] + round) >> -sh);  // Q(16+sh)
-      inimQ7[k] = (int16_t)((outre2Q16[k] + round) >> -sh);  // Q(16+sh)
-    }
-  }
-
-  WebRtcIsacfix_FftRadix16Fastest(inreQ7, inimQ7, 1); // real call
-
-  //"Fastest" vectors
-  if (sh>=0) {
-    for (k=0; k<240; k++) {
-      outre1Q16[k] = inreQ7[k] >> sh;  // Q(16+sh) -> Q16
-      outre2Q16[k] = inimQ7[k] >> sh;  // Q(16+sh) -> Q16
-    }
-  } else {
-    for (k=0; k<240; k++) {
-      outre1Q16[k] = inreQ7[k] * (1 << -sh);  // Q(16+sh) -> Q16
-      outre2Q16[k] = inimQ7[k] * (1 << -sh);  // Q(16+sh) -> Q16
-    }
-  }
-
-  /* Divide through by the normalizing constant: */
-  /* scale all values with 1/240, i.e. with 273 in Q16 */
-  /* 273/65536 ~= 0.0041656                            */
-  /*     1/240 ~= 0.0041666                            */
-  for (k=0; k<240; k++) {
-    outre1Q16[k] = WEBRTC_SPL_MUL_16_32_RSFT16(273, outre1Q16[k]);
-    outre2Q16[k] = WEBRTC_SPL_MUL_16_32_RSFT16(273, outre2Q16[k]);
-  }
-
-  /* Demodulate and separate */
-  factQ11 = 31727; // sqrt(240) in Q11 is round(15.49193338482967*2048) = 31727
-  for (k = 0; k < FRAMESAMPLES/2; k++) {
-    tmp1rQ14 = WebRtcIsacfix_kCosTab1[k];
-    tmp1iQ14 = WebRtcIsacfix_kSinTab1[k];
-    xrQ16 = WEBRTC_SPL_MUL_16_32_RSFT14(tmp1rQ14, outre1Q16[k]) - WEBRTC_SPL_MUL_16_32_RSFT14(tmp1iQ14, outre2Q16[k]);
-    xiQ16 = WEBRTC_SPL_MUL_16_32_RSFT14(tmp1rQ14, outre2Q16[k]) + WEBRTC_SPL_MUL_16_32_RSFT14(tmp1iQ14, outre1Q16[k]);
-    xrQ16 = WEBRTC_SPL_MUL_16_32_RSFT11(factQ11, xrQ16);
-    xiQ16 = WEBRTC_SPL_MUL_16_32_RSFT11(factQ11, xiQ16);
-    outre2Q16[k] = xiQ16;
-    outre1Q16[k] = xrQ16;
-  }
-}
diff --git a/modules/audio_coding/codecs/isac/fix/source/transform_mips.c b/modules/audio_coding/codecs/isac/fix/source/transform_mips.c
deleted file mode 100644
index e5d35f2..0000000
--- a/modules/audio_coding/codecs/isac/fix/source/transform_mips.c
+++ /dev/null
@@ -1,1294 +0,0 @@
-/*
- *  Copyright (c) 2014 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/codecs/isac/fix/source/codec.h"
-#include "webrtc/modules/audio_coding/codecs/isac/fix/source/fft.h"
-#include "webrtc/modules/audio_coding/codecs/isac/fix/source/settings.h"
-
-// The tables are defined in transform_tables.c file.
-extern const int16_t WebRtcIsacfix_kCosTab1[FRAMESAMPLES/2];
-extern const int16_t WebRtcIsacfix_kSinTab1[FRAMESAMPLES/2];
-extern const int16_t WebRtcIsacfix_kCosTab2[FRAMESAMPLES/4];
-extern const int16_t WebRtcIsacfix_kSinTab2[FRAMESAMPLES/4];
-
-// MIPS DSPr2 version of the WebRtcIsacfix_Time2Spec function
-// is not bit-exact with the C version.
-// The accuracy of the MIPS DSPr2 version is same or better.
-void WebRtcIsacfix_Time2SpecMIPS(int16_t* inre1Q9,
-                                 int16_t* inre2Q9,
-                                 int16_t* outreQ7,
-                                 int16_t* outimQ7) {
-  int k = FRAMESAMPLES / 2;
-  int32_t tmpreQ16[FRAMESAMPLES / 2], tmpimQ16[FRAMESAMPLES / 2];
-  int32_t r0, r1, r2, r3, r4, r5, r6, r7, r8, r9;
-  int32_t inre1, inre2, tmpre, tmpim, factor, max, max1;
-  int16_t* cosptr;
-  int16_t* sinptr;
-
-  cosptr = (int16_t*)WebRtcIsacfix_kCosTab1;
-  sinptr = (int16_t*)WebRtcIsacfix_kSinTab1;
-
-  __asm __volatile (
-    ".set           push                                      \n\t"
-    ".set           noreorder                                 \n\t"
-    "addiu          %[inre1],     %[inre1Q9],   0             \n\t"
-    "addiu          %[inre2],     %[inre2Q9],   0             \n\t"
-    "addiu          %[tmpre],     %[tmpreQ16],  0             \n\t"
-    "addiu          %[tmpim],     %[tmpimQ16],  0             \n\t"
-    "addiu          %[factor],    $zero,        16921         \n\t"
-    "mul            %[max],       $zero,        $zero         \n\t"
-    // Multiply with complex exponentials and combine into one complex vector.
-    // Also, calculate the maximal absolute value in the same loop.
-   "1:                                                        \n\t"
-#if defined(MIPS_DSP_R2_LE)
-    "lwl            %[r0],        0(%[inre1])                 \n\t"
-    "lwl            %[r2],        0(%[cosptr])                \n\t"
-    "lwl            %[r3],        0(%[sinptr])                \n\t"
-    "lwl            %[r1],        0(%[inre2])                 \n\t"
-    "lwr            %[r0],        0(%[inre1])                 \n\t"
-    "lwr            %[r2],        0(%[cosptr])                \n\t"
-    "lwr            %[r3],        0(%[sinptr])                \n\t"
-    "lwr            %[r1],        0(%[inre2])                 \n\t"
-    "muleq_s.w.phr  %[r4],        %[r2],        %[r0]         \n\t"
-    "muleq_s.w.phr  %[r5],        %[r3],        %[r0]         \n\t"
-    "muleq_s.w.phr  %[r6],        %[r3],        %[r1]         \n\t"
-    "muleq_s.w.phr  %[r7],        %[r2],        %[r1]         \n\t"
-    "muleq_s.w.phl  %[r8],        %[r2],        %[r0]         \n\t"
-    "muleq_s.w.phl  %[r0],        %[r3],        %[r0]         \n\t"
-    "muleq_s.w.phl  %[r3],        %[r3],        %[r1]         \n\t"
-    "muleq_s.w.phl  %[r1],        %[r2],        %[r1]         \n\t"
-    "addiu          %[k],         %[k],         -2            \n\t"
-    "addu           %[r4],        %[r4],        %[r6]         \n\t"
-    "subu           %[r5],        %[r7],        %[r5]         \n\t"
-    "sra            %[r4],        %[r4],        8             \n\t"
-    "sra            %[r5],        %[r5],        8             \n\t"
-    "mult           $ac0,         %[factor],    %[r4]         \n\t"
-    "mult           $ac1,         %[factor],    %[r5]         \n\t"
-    "addu           %[r3],        %[r8],        %[r3]         \n\t"
-    "subu           %[r0],        %[r1],        %[r0]         \n\t"
-    "sra            %[r3],        %[r3],        8             \n\t"
-    "sra            %[r0],        %[r0],        8             \n\t"
-    "mult           $ac2,         %[factor],    %[r3]         \n\t"
-    "mult           $ac3,         %[factor],    %[r0]         \n\t"
-    "extr_r.w       %[r4],        $ac0,         16            \n\t"
-    "extr_r.w       %[r5],        $ac1,         16            \n\t"
-    "addiu          %[inre1],     %[inre1],     4             \n\t"
-    "addiu          %[inre2],     %[inre2],     4             \n\t"
-    "extr_r.w       %[r6],        $ac2,         16            \n\t"
-    "extr_r.w       %[r7],        $ac3,         16            \n\t"
-    "addiu          %[cosptr],    %[cosptr],    4             \n\t"
-    "addiu          %[sinptr],    %[sinptr],    4             \n\t"
-    "shra_r.w       %[r4],        %[r4],        3             \n\t"
-    "shra_r.w       %[r5],        %[r5],        3             \n\t"
-    "sw             %[r4],        0(%[tmpre])                 \n\t"
-    "absq_s.w       %[r4],        %[r4]                       \n\t"
-    "sw             %[r5],        0(%[tmpim])                 \n\t"
-    "absq_s.w       %[r5],        %[r5]                       \n\t"
-    "shra_r.w       %[r6],        %[r6],        3             \n\t"
-    "shra_r.w       %[r7],        %[r7],        3             \n\t"
-    "sw             %[r6],        4(%[tmpre])                 \n\t"
-    "absq_s.w       %[r6],        %[r6]                       \n\t"
-    "sw             %[r7],        4(%[tmpim])                 \n\t"
-    "absq_s.w       %[r7],        %[r7]                       \n\t"
-    "slt            %[r0],        %[r4],        %[r5]         \n\t"
-    "movn           %[r4],        %[r5],        %[r0]         \n\t"
-    "slt            %[r1],        %[r6],        %[r7]         \n\t"
-    "movn           %[r6],        %[r7],        %[r1]         \n\t"
-    "slt            %[r0],        %[max],       %[r4]         \n\t"
-    "movn           %[max],       %[r4],        %[r0]         \n\t"
-    "slt            %[r1],        %[max],       %[r6]         \n\t"
-    "movn           %[max],       %[r6],        %[r1]         \n\t"
-    "addiu          %[tmpre],     %[tmpre],     8             \n\t"
-    "bgtz           %[k],         1b                          \n\t"
-    " addiu         %[tmpim],     %[tmpim],     8             \n\t"
-#else  // #if defined(MIPS_DSP_R2_LE)
-    "lh             %[r0],        0(%[inre1])                 \n\t"
-    "lh             %[r1],        0(%[inre2])                 \n\t"
-    "lh             %[r2],        0(%[cosptr])                \n\t"
-    "lh             %[r3],        0(%[sinptr])                \n\t"
-    "addiu          %[k],         %[k],         -1            \n\t"
-    "mul            %[r4],        %[r0],        %[r2]         \n\t"
-    "mul            %[r5],        %[r1],        %[r3]         \n\t"
-    "mul            %[r0],        %[r0],        %[r3]         \n\t"
-    "mul            %[r2],        %[r1],        %[r2]         \n\t"
-    "addiu          %[inre1],     %[inre1],     2             \n\t"
-    "addiu          %[inre2],     %[inre2],     2             \n\t"
-    "addiu          %[cosptr],    %[cosptr],    2             \n\t"
-    "addiu          %[sinptr],    %[sinptr],    2             \n\t"
-    "addu           %[r1],        %[r4],        %[r5]         \n\t"
-    "sra            %[r1],        %[r1],        7             \n\t"
-    "sra            %[r3],        %[r1],        16            \n\t"
-    "andi           %[r1],        %[r1],        0xFFFF        \n\t"
-    "sra            %[r1],        %[r1],        1             \n\t"
-    "mul            %[r1],        %[factor],    %[r1]         \n\t"
-    "mul            %[r3],        %[factor],    %[r3]         \n\t"
-    "subu           %[r0],        %[r2],        %[r0]         \n\t"
-    "sra            %[r0],        %[r0],        7             \n\t"
-    "sra            %[r2],        %[r0],        16            \n\t"
-    "andi           %[r0],        %[r0],        0xFFFF        \n\t"
-    "sra            %[r0],        %[r0],        1             \n\t"
-    "mul            %[r0],        %[factor],    %[r0]         \n\t"
-    "mul            %[r2],        %[factor],    %[r2]         \n\t"
-#if defined(MIPS_DSP_R1_LE)
-    "shra_r.w       %[r1],        %[r1],        15            \n\t"
-#else  // #if defined(MIPS_DSP_R1_LE)
-    "addiu          %[r1],        %[r1],        0x4000        \n\t"
-    "sra            %[r1],        %[r1],        15            \n\t"
-#endif  // #if defined(MIPS_DSP_R1_LE)
-    "addu           %[r1],        %[r3],        %[r1]         \n\t"
-#if defined(MIPS_DSP_R1_LE)
-    "shra_r.w       %[r1],        %[r1],        3             \n\t"
-#else  // #if defined(MIPS_DSP_R1_LE)
-    "addiu          %[r1],        %[r1],        4             \n\t"
-    "sra            %[r1],        %[r1],        3             \n\t"
-#endif  // #if defined(MIPS_DSP_R1_LE)
-    "sw             %[r1],        0(%[tmpre])                 \n\t"
-    "addiu          %[tmpre],     %[tmpre],     4             \n\t"
-#if defined(MIPS_DSP_R1_LE)
-    "absq_s.w       %[r1],        %[r1]                       \n\t"
-    "shra_r.w       %[r0],        %[r0],        15            \n\t"
-#else  // #if defined(MIPS_DSP_R1_LE)
-    "negu           %[r4],        %[r1]                       \n\t"
-    "slt            %[r3],        %[r1],        $zero         \n\t"
-    "movn           %[r1],        %[r4],        %[r3]         \n\t"
-    "addiu          %[r0],        %[r0],        0x4000        \n\t"
-    "sra            %[r0],        %[r0],        15            \n\t"
-#endif  // #if defined(MIPS_DSP_R1_LE)
-    "addu           %[r0],        %[r0],        %[r2]         \n\t"
-#if defined(MIPS_DSP_R1_LE)
-    "shra_r.w       %[r0],        %[r0],        3             \n\t"
-    "sw             %[r0],        0(%[tmpim])                 \n\t"
-    "absq_s.w       %[r0],        %[r0]                       \n\t"
-#else  // #if defined(MIPS_DSP_R1_LE)
-    "addiu          %[r0],        %[r0],        4             \n\t"
-    "sra            %[r0],        %[r0],        3             \n\t"
-    "sw             %[r0],        0(%[tmpim])                 \n\t"
-    "negu           %[r2],        %[r0]                       \n\t"
-    "slt            %[r3],        %[r0],        $zero         \n\t"
-    "movn           %[r0],        %[r2],        %[r3]         \n\t"
-#endif  // #if defined(MIPS_DSP_R1_LE)
-    "slt            %[r2],        %[max],       %[r1]         \n\t"
-    "movn           %[max],       %[r1],        %[r2]         \n\t"
-    "slt            %[r2],        %[max],       %[r0]         \n\t"
-    "movn           %[max],       %[r0],        %[r2]         \n\t"
-    "bgtz           %[k],         1b                          \n\t"
-    " addiu         %[tmpim],     %[tmpim],     4             \n\t"
-#endif  // #if defined(MIPS_DSP_R2_LE)
-    // Calculate WebRtcSpl_NormW32(max).
-    // If max gets value >=0, we should shift max steps to the left, and the
-    // domain will be Q(16+shift). If max gets value <0, we should shift -max
-    // steps to the right, and the domain will be Q(16+max)
-    "clz            %[max],       %[max]                      \n\t"
-    "addiu          %[max],       %[max],       -25           \n\t"
-    ".set           pop                                       \n\t"
-    : [k] "+r" (k), [inre1] "=&r" (inre1), [inre2] "=&r" (inre2),
-      [r0] "=&r" (r0), [r1] "=&r" (r1), [r2] "=&r" (r2),
-      [r3] "=&r" (r3), [r4] "=&r" (r4), [tmpre] "=&r" (tmpre),
-      [tmpim] "=&r" (tmpim), [max] "=&r" (max), [factor] "=&r" (factor),
-#if defined(MIPS_DSP_R2_LE)
-      [r6] "=&r" (r6), [r7] "=&r" (r7), [r8] "=&r" (r8),
-#endif  // #if defined(MIPS_DSP_R2_LE)
-      [r5] "=&r" (r5)
-    : [inre1Q9] "r" (inre1Q9), [inre2Q9] "r" (inre2Q9),
-      [tmpreQ16] "r" (tmpreQ16), [tmpimQ16] "r" (tmpimQ16),
-      [cosptr] "r" (cosptr), [sinptr] "r" (sinptr)
-    : "hi", "lo", "memory"
-#if defined(MIPS_DSP_R2_LE)
-    , "$ac1hi", "$ac1lo", "$ac2hi", "$ac2lo", "$ac3hi", "$ac3lo"
-#endif  // #if defined(MIPS_DSP_R2_LE)
-  );
-
-  // "Fastest" vectors
-  k = FRAMESAMPLES / 4;
-  __asm __volatile (
-    ".set           push                                      \n\t"
-    ".set           noreorder                                 \n\t"
-    "addiu          %[tmpre],     %[tmpreQ16],  0             \n\t"
-    "addiu          %[tmpim],     %[tmpimQ16],  0             \n\t"
-    "addiu          %[inre1],     %[inre1Q9],   0             \n\t"
-    "addiu          %[inre2],     %[inre2Q9],   0             \n\t"
-    "blez           %[max],       2f                          \n\t"
-    " subu          %[max1],      $zero,        %[max]        \n\t"
-   "1:                                                        \n\t"
-    "lw             %[r0],        0(%[tmpre])                 \n\t"
-    "lw             %[r1],        0(%[tmpim])                 \n\t"
-    "lw             %[r2],        4(%[tmpre])                 \n\t"
-    "lw             %[r3],        4(%[tmpim])                 \n\t"
-    "addiu          %[k],         %[k],         -1            \n\t"
-    "sllv           %[r0],        %[r0],        %[max]        \n\t"
-    "sllv           %[r1],        %[r1],        %[max]        \n\t"
-    "sllv           %[r2],        %[r2],        %[max]        \n\t"
-    "sllv           %[r3],        %[r3],        %[max]        \n\t"
-    "addiu          %[tmpre],     %[tmpre],     8             \n\t"
-    "addiu          %[tmpim],     %[tmpim],     8             \n\t"
-    "sh             %[r0],        0(%[inre1])                 \n\t"
-    "sh             %[r1],        0(%[inre2])                 \n\t"
-    "sh             %[r2],        2(%[inre1])                 \n\t"
-    "sh             %[r3],        2(%[inre2])                 \n\t"
-    "addiu          %[inre1],     %[inre1],     4             \n\t"
-    "bgtz           %[k],         1b                          \n\t"
-    " addiu         %[inre2],     %[inre2],     4             \n\t"
-    "b              4f                                        \n\t"
-    " nop                                                     \n\t"
-   "2:                                                        \n\t"
-#if !defined(MIPS_DSP_R1_LE)
-    "addiu          %[r4],        %[max1],      -1            \n\t"
-    "addiu          %[r5],        $zero,        1             \n\t"
-    "sllv           %[r4],        %[r5],        %[r4]         \n\t"
-#endif // #if !defined(MIPS_DSP_R1_LE)
-   "3:                                                        \n\t"
-    "lw             %[r0],        0(%[tmpre])                 \n\t"
-    "lw             %[r1],        0(%[tmpim])                 \n\t"
-    "lw             %[r2],        4(%[tmpre])                 \n\t"
-    "lw             %[r3],        4(%[tmpim])                 \n\t"
-    "addiu          %[k],         %[k],         -1            \n\t"
-#if defined(MIPS_DSP_R1_LE)
-    "shrav_r.w      %[r0],        %[r0],        %[max1]       \n\t"
-    "shrav_r.w      %[r1],        %[r1],        %[max1]       \n\t"
-    "shrav_r.w      %[r2],        %[r2],        %[max1]       \n\t"
-    "shrav_r.w      %[r3],        %[r3],        %[max1]       \n\t"
-#else // #if !defined(MIPS_DSP_R1_LE)
-    "addu           %[r0],        %[r0],        %[r4]         \n\t"
-    "addu           %[r1],        %[r1],        %[r4]         \n\t"
-    "addu           %[r2],        %[r2],        %[r4]         \n\t"
-    "addu           %[r3],        %[r3],        %[r4]         \n\t"
-    "srav           %[r0],        %[r0],        %[max1]       \n\t"
-    "srav           %[r1],        %[r1],        %[max1]       \n\t"
-    "srav           %[r2],        %[r2],        %[max1]       \n\t"
-    "srav           %[r3],        %[r3],        %[max1]       \n\t"
-#endif // #if !defined(MIPS_DSP_R1_LE)
-    "addiu          %[tmpre],     %[tmpre],     8             \n\t"
-    "addiu          %[tmpim],     %[tmpim],     8             \n\t"
-    "sh             %[r0],        0(%[inre1])                 \n\t"
-    "sh             %[r1],        0(%[inre2])                 \n\t"
-    "sh             %[r2],        2(%[inre1])                 \n\t"
-    "sh             %[r3],        2(%[inre2])                 \n\t"
-    "addiu          %[inre1],     %[inre1],     4             \n\t"
-    "bgtz           %[k],         3b                          \n\t"
-    " addiu         %[inre2],     %[inre2],     4             \n\t"
-   "4:                                                        \n\t"
-    ".set           pop                                       \n\t"
-    : [tmpre] "=&r" (tmpre), [tmpim] "=&r" (tmpim), [inre1] "=&r" (inre1),
-      [inre2] "=&r" (inre2), [k] "+r" (k), [max1] "=&r" (max1),
-#if !defined(MIPS_DSP_R1_LE)
-      [r4] "=&r" (r4), [r5] "=&r" (r5),
-#endif // #if !defined(MIPS_DSP_R1_LE)
-      [r0] "=&r" (r0), [r1] "=&r" (r1), [r2] "=&r" (r2), [r3] "=&r" (r3)
-    : [tmpreQ16] "r" (tmpreQ16), [tmpimQ16] "r" (tmpimQ16),
-      [inre1Q9] "r" (inre1Q9), [inre2Q9] "r" (inre2Q9), [max] "r" (max)
-    : "memory"
-  );
-
-  // Get DFT
-  WebRtcIsacfix_FftRadix16Fastest(inre1Q9, inre2Q9, -1); // real call
-
-  // "Fastest" vectors and
-  // Use symmetry to separate into two complex vectors
-  // and center frames in time around zero
-  // merged into one loop
-  cosptr = (int16_t*)WebRtcIsacfix_kCosTab2;
-  sinptr = (int16_t*)WebRtcIsacfix_kSinTab2;
-  k = FRAMESAMPLES / 4;
-  factor = FRAMESAMPLES - 2;  // offset for FRAMESAMPLES / 2 - 1 array member
-
-  __asm __volatile (
-    ".set           push                                      \n\t"
-    ".set           noreorder                                 \n\t"
-    "addiu          %[inre1],     %[inre1Q9],   0             \n\t"
-    "addiu          %[inre2],     %[inre2Q9],   0             \n\t"
-    "addiu          %[tmpre],     %[outreQ7],   0             \n\t"
-    "addiu          %[tmpim],     %[outimQ7],   0             \n\t"
-    "bltz           %[max],       2f                          \n\t"
-    " subu          %[max1],      $zero,        %[max]        \n\t"
-   "1:                                                        \n\t"
-#if !defined(MIPS_DSP_R1_LE)
-    "addu           %[r4],        %[inre1],     %[offset]     \n\t"
-    "addu           %[r5],        %[inre2],     %[offset]     \n\t"
-#endif  // #if !defined(MIPS_DSP_R1_LE)
-    "lh             %[r0],        0(%[inre1])                 \n\t"
-    "lh             %[r1],        0(%[inre2])                 \n\t"
-#if defined(MIPS_DSP_R1_LE)
-    "lhx            %[r2],        %[offset](%[inre1])         \n\t"
-    "lhx            %[r3],        %[offset](%[inre2])         \n\t"
-#else  // #if defined(MIPS_DSP_R1_LE)
-    "lh             %[r2],        0(%[r4])                    \n\t"
-    "lh             %[r3],        0(%[r5])                    \n\t"
-#endif  // #if defined(MIPS_DSP_R1_LE)
-    "srav           %[r0],        %[r0],        %[max]        \n\t"
-    "srav           %[r1],        %[r1],        %[max]        \n\t"
-    "srav           %[r2],        %[r2],        %[max]        \n\t"
-    "srav           %[r3],        %[r3],        %[max]        \n\t"
-    "addu           %[r4],        %[r0],        %[r2]         \n\t"
-    "subu           %[r0],        %[r2],        %[r0]         \n\t"
-    "subu           %[r2],        %[r1],        %[r3]         \n\t"
-    "addu           %[r1],        %[r1],        %[r3]         \n\t"
-    "lh             %[r3],        0(%[cosptr])                \n\t"
-    "lh             %[r5],        0(%[sinptr])                \n\t"
-    "andi           %[r6],        %[r4],        0xFFFF        \n\t"
-    "sra            %[r4],        %[r4],        16            \n\t"
-    "mul            %[r7],        %[r3],        %[r6]         \n\t"
-    "mul            %[r8],        %[r3],        %[r4]         \n\t"
-    "mul            %[r6],        %[r5],        %[r6]         \n\t"
-    "mul            %[r4],        %[r5],        %[r4]         \n\t"
-    "addiu          %[k],         %[k],         -1            \n\t"
-    "addiu          %[inre1],     %[inre1],     2             \n\t"
-    "addiu          %[inre2],     %[inre2],     2             \n\t"
-#if defined(MIPS_DSP_R1_LE)
-    "shra_r.w       %[r7],        %[r7],        14            \n\t"
-#else  // #if defined(MIPS_DSP_R1_LE)
-    "addiu          %[r7],        %[r7],        0x2000        \n\t"
-    "sra            %[r7],        %[r7],        14            \n\t"
-#endif  // #if defined(MIPS_DSP_R1_LE)
-    "sll            %[r8],        %[r8],        2             \n\t"
-    "addu           %[r8],        %[r8],        %[r7]         \n\t"
-#if defined(MIPS_DSP_R1_LE)
-    "shra_r.w       %[r6],        %[r6],        14            \n\t"
-#else  // #if defined(MIPS_DSP_R1_LE)
-    "addiu          %[r6],        %[r6],        0x2000        \n\t"
-    "sra            %[r6],        %[r6],        14            \n\t"
-#endif  // #if defined(MIPS_DSP_R1_LE)
-    "sll            %[r4],        %[r4],        2             \n\t"
-    "addu           %[r4],        %[r4],        %[r6]         \n\t"
-    "andi           %[r6],        %[r2],        0xFFFF        \n\t"
-    "sra            %[r2],        %[r2],        16            \n\t"
-    "mul            %[r7],        %[r5],        %[r6]         \n\t"
-    "mul            %[r9],        %[r5],        %[r2]         \n\t"
-    "mul            %[r6],        %[r3],        %[r6]         \n\t"
-    "mul            %[r2],        %[r3],        %[r2]         \n\t"
-    "addiu          %[cosptr],    %[cosptr],    2             \n\t"
-    "addiu          %[sinptr],    %[sinptr],    2             \n\t"
-#if defined(MIPS_DSP_R1_LE)
-    "shra_r.w       %[r7],        %[r7],        14            \n\t"
-#else  // #if defined(MIPS_DSP_R1_LE)
-    "addiu          %[r7],        %[r7],        0x2000        \n\t"
-    "sra            %[r7],        %[r7],        14            \n\t"
-#endif  // #if defined(MIPS_DSP_R1_LE)
-    "sll            %[r9],        %[r9],        2             \n\t"
-    "addu           %[r9],        %[r7],        %[r9]         \n\t"
-#if defined(MIPS_DSP_R1_LE)
-    "shra_r.w       %[r6],        %[r6],        14            \n\t"
-#else  // #if defined(MIPS_DSP_R1_LE)
-    "addiu          %[r6],        %[r6],        0x2000        \n\t"
-    "sra            %[r6],        %[r6],        14            \n\t"
-#endif  // #if defined(MIPS_DSP_R1_LE)
-    "sll            %[r2],        %[r2],        2             \n\t"
-    "addu           %[r2],        %[r6],        %[r2]         \n\t"
-    "subu           %[r8],        %[r8],        %[r9]         \n\t"
-    "sra            %[r8],        %[r8],        9             \n\t"
-    "addu           %[r2],        %[r4],        %[r2]         \n\t"
-    "sra            %[r2],        %[r2],        9             \n\t"
-    "sh             %[r8],        0(%[tmpre])                 \n\t"
-    "sh             %[r2],        0(%[tmpim])                 \n\t"
-
-    "andi           %[r4],        %[r1],        0xFFFF        \n\t"
-    "sra            %[r1],        %[r1],        16            \n\t"
-    "andi           %[r6],        %[r0],        0xFFFF        \n\t"
-    "sra            %[r0],        %[r0],        16            \n\t"
-    "mul            %[r7],        %[r5],        %[r4]         \n\t"
-    "mul            %[r9],        %[r5],        %[r1]         \n\t"
-    "mul            %[r4],        %[r3],        %[r4]         \n\t"
-    "mul            %[r1],        %[r3],        %[r1]         \n\t"
-    "mul            %[r8],        %[r3],        %[r0]         \n\t"
-    "mul            %[r3],        %[r3],        %[r6]         \n\t"
-    "mul            %[r6],        %[r5],        %[r6]         \n\t"
-    "mul            %[r0],        %[r5],        %[r0]         \n\t"
-#if defined(MIPS_DSP_R1_LE)
-    "shra_r.w       %[r7],        %[r7],        14            \n\t"
-#else  // #if defined(MIPS_DSP_R1_LE)
-    "addiu          %[r7],        %[r7],        0x2000        \n\t"
-    "sra            %[r7],        %[r7],        14            \n\t"
-#endif  // #if defined(MIPS_DSP_R1_LE)
-    "sll            %[r9],        %[r9],        2             \n\t"
-    "addu           %[r9],        %[r9],        %[r7]         \n\t"
-#if defined(MIPS_DSP_R1_LE)
-    "shra_r.w       %[r4],        %[r4],        14            \n\t"
-#else  // #if defined(MIPS_DSP_R1_LE)
-    "addiu          %[r4],        %[r4],        0x2000        \n\t"
-    "sra            %[r4],        %[r4],        14            \n\t"
-#endif  // #if defined(MIPS_DSP_R1_LE)
-    "sll            %[r1],        %[r1],        2             \n\t"
-    "addu           %[r1],        %[r1],        %[r4]         \n\t"
-#if defined(MIPS_DSP_R1_LE)
-    "shra_r.w       %[r3],        %[r3],        14            \n\t"
-#else  // #if defined(MIPS_DSP_R1_LE)
-    "addiu          %[r3],        %[r3],        0x2000        \n\t"
-    "sra            %[r3],        %[r3],        14            \n\t"
-#endif  // #if defined(MIPS_DSP_R1_LE)
-    "sll            %[r8],        %[r8],        2             \n\t"
-    "addu           %[r8],        %[r8],        %[r3]         \n\t"
-#if defined(MIPS_DSP_R1_LE)
-    "shra_r.w       %[r6],        %[r6],        14            \n\t"
-#else  // #if defined(MIPS_DSP_R1_LE)
-    "addiu          %[r6],        %[r6],        0x2000        \n\t"
-    "sra            %[r6],        %[r6],        14            \n\t"
-#endif  // #if defined(MIPS_DSP_R1_LE)
-    "sll            %[r0],        %[r0],        2             \n\t"
-    "addu           %[r0],        %[r0],        %[r6]         \n\t"
-    "addu           %[r3],        %[tmpre],     %[offset]     \n\t"
-    "addu           %[r2],        %[tmpim],     %[offset]     \n\t"
-    "addu           %[r9],        %[r9],        %[r8]         \n\t"
-    "negu           %[r9],        %[r9]                       \n\t"
-    "sra            %[r9],        %[r9],        9             \n\t"
-    "subu           %[r0],        %[r0],        %[r1]         \n\t"
-    "addiu          %[offset],    %[offset],    -4            \n\t"
-    "sh             %[r9],        0(%[r3])                    \n\t"
-    "sh             %[r0],        0(%[r2])                    \n\t"
-    "addiu          %[tmpre],     %[tmpre],     2             \n\t"
-    "bgtz           %[k],         1b                          \n\t"
-    " addiu         %[tmpim],     %[tmpim],     2             \n\t"
-    "b              3f                                        \n\t"
-    " nop                                                     \n\t"
-   "2:                                                        \n\t"
-#if !defined(MIPS_DSP_R1_LE)
-    "addu           %[r4],        %[inre1],     %[offset]     \n\t"
-    "addu           %[r5],        %[inre2],     %[offset]     \n\t"
-#endif  // #if !defined(MIPS_DSP_R1_LE)
-    "lh             %[r0],        0(%[inre1])                 \n\t"
-    "lh             %[r1],        0(%[inre2])                 \n\t"
-#if defined(MIPS_DSP_R1_LE)
-    "lhx            %[r2],        %[offset](%[inre1])         \n\t"
-    "lhx            %[r3],        %[offset](%[inre2])         \n\t"
-#else  // #if defined(MIPS_DSP_R1_LE)
-    "lh             %[r2],        0(%[r4])                    \n\t"
-    "lh             %[r3],        0(%[r5])                    \n\t"
-#endif  // #if defined(MIPS_DSP_R1_LE)
-    "sllv           %[r0],        %[r0],        %[max1]       \n\t"
-    "sllv           %[r1],        %[r1],        %[max1]       \n\t"
-    "sllv           %[r2],        %[r2],        %[max1]       \n\t"
-    "sllv           %[r3],        %[r3],        %[max1]       \n\t"
-    "addu           %[r4],        %[r0],        %[r2]         \n\t"
-    "subu           %[r0],        %[r2],        %[r0]         \n\t"
-    "subu           %[r2],        %[r1],        %[r3]         \n\t"
-    "addu           %[r1],        %[r1],        %[r3]         \n\t"
-    "lh             %[r3],        0(%[cosptr])                \n\t"
-    "lh             %[r5],        0(%[sinptr])                \n\t"
-    "andi           %[r6],        %[r4],        0xFFFF        \n\t"
-    "sra            %[r4],        %[r4],        16            \n\t"
-    "mul            %[r7],        %[r3],        %[r6]         \n\t"
-    "mul            %[r8],        %[r3],        %[r4]         \n\t"
-    "mul            %[r6],        %[r5],        %[r6]         \n\t"
-    "mul            %[r4],        %[r5],        %[r4]         \n\t"
-    "addiu          %[k],         %[k],         -1            \n\t"
-    "addiu          %[inre1],     %[inre1],     2             \n\t"
-    "addiu          %[inre2],     %[inre2],     2             \n\t"
-#if defined(MIPS_DSP_R1_LE)
-    "shra_r.w       %[r7],        %[r7],        14            \n\t"
-#else  // #if defined(MIPS_DSP_R1_LE)
-    "addiu          %[r7],        %[r7],        0x2000        \n\t"
-    "sra            %[r7],        %[r7],        14            \n\t"
-#endif  // #if defined(MIPS_DSP_R1_LE)
-    "sll            %[r8],        %[r8],        2             \n\t"
-    "addu           %[r8],        %[r8],        %[r7]         \n\t"
-#if defined(MIPS_DSP_R1_LE)
-    "shra_r.w       %[r6],        %[r6],        14            \n\t"
-#else  // #if defined(MIPS_DSP_R1_LE)
-    "addiu          %[r6],        %[r6],        0x2000        \n\t"
-    "sra            %[r6],        %[r6],        14            \n\t"
-#endif  // #if defined(MIPS_DSP_R1_LE)
-    "sll            %[r4],        %[r4],        2             \n\t"
-    "addu           %[r4],        %[r4],        %[r6]         \n\t"
-    "andi           %[r6],        %[r2],        0xFFFF        \n\t"
-    "sra            %[r2],        %[r2],        16            \n\t"
-    "mul            %[r7],        %[r5],        %[r6]         \n\t"
-    "mul            %[r9],        %[r5],        %[r2]         \n\t"
-    "mul            %[r6],        %[r3],        %[r6]         \n\t"
-    "mul            %[r2],        %[r3],        %[r2]         \n\t"
-    "addiu          %[cosptr],    %[cosptr],    2             \n\t"
-    "addiu          %[sinptr],    %[sinptr],    2             \n\t"
-#if defined(MIPS_DSP_R1_LE)
-    "shra_r.w       %[r7],        %[r7],        14            \n\t"
-#else  // #if defined(MIPS_DSP_R1_LE)
-    "addiu          %[r7],        %[r7],        0x2000        \n\t"
-    "sra            %[r7],        %[r7],        14            \n\t"
-#endif  // #if defined(MIPS_DSP_R1_LE)
-    "sll            %[r9],        %[r9],        2             \n\t"
-    "addu           %[r9],        %[r7],        %[r9]         \n\t"
-#if defined(MIPS_DSP_R1_LE)
-    "shra_r.w       %[r6],        %[r6],        14            \n\t"
-#else  // #if defined(MIPS_DSP_R1_LE)
-    "addiu          %[r6],        %[r6],        0x2000        \n\t"
-    "sra            %[r6],        %[r6],        14            \n\t"
-#endif  // #if defined(MIPS_DSP_R1_LE)
-    "sll            %[r2],        %[r2],        2             \n\t"
-    "addu           %[r2],        %[r6],        %[r2]         \n\t"
-    "subu           %[r8],        %[r8],        %[r9]         \n\t"
-    "sra            %[r8],        %[r8],        9             \n\t"
-    "addu           %[r2],        %[r4],        %[r2]         \n\t"
-    "sra            %[r2],        %[r2],        9             \n\t"
-    "sh             %[r8],        0(%[tmpre])                 \n\t"
-    "sh             %[r2],        0(%[tmpim])                 \n\t"
-    "andi           %[r4],        %[r1],        0xFFFF        \n\t"
-    "sra            %[r1],        %[r1],        16            \n\t"
-    "andi           %[r6],        %[r0],        0xFFFF        \n\t"
-    "sra            %[r0],        %[r0],        16            \n\t"
-    "mul            %[r7],        %[r5],        %[r4]         \n\t"
-    "mul            %[r9],        %[r5],        %[r1]         \n\t"
-    "mul            %[r4],        %[r3],        %[r4]         \n\t"
-    "mul            %[r1],        %[r3],        %[r1]         \n\t"
-    "mul            %[r8],        %[r3],        %[r0]         \n\t"
-    "mul            %[r3],        %[r3],        %[r6]         \n\t"
-    "mul            %[r6],        %[r5],        %[r6]         \n\t"
-    "mul            %[r0],        %[r5],        %[r0]         \n\t"
-#if defined(MIPS_DSP_R1_LE)
-    "shra_r.w       %[r7],        %[r7],        14            \n\t"
-#else  // #if defined(MIPS_DSP_R1_LE)
-    "addiu          %[r7],        %[r7],        0x2000        \n\t"
-    "sra            %[r7],        %[r7],        14            \n\t"
-#endif  // #if defined(MIPS_DSP_R1_LE)
-    "sll            %[r9],        %[r9],        2             \n\t"
-    "addu           %[r9],        %[r9],        %[r7]         \n\t"
-#if defined(MIPS_DSP_R1_LE)
-    "shra_r.w       %[r4],        %[r4],        14            \n\t"
-#else  // #if defined(MIPS_DSP_R1_LE)
-    "addiu          %[r4],        %[r4],        0x2000        \n\t"
-    "sra            %[r4],        %[r4],        14            \n\t"
-#endif
-    "sll            %[r1],        %[r1],        2             \n\t"
-    "addu           %[r1],        %[r1],        %[r4]         \n\t"
-#if defined(MIPS_DSP_R1_LE)
-    "shra_r.w       %[r3],        %[r3],        14            \n\t"
-#else  // #if defined(MIPS_DSP_R1_LE)
-    "addiu          %[r3],        %[r3],        0x2000        \n\t"
-    "sra            %[r3],        %[r3],        14            \n\t"
-#endif  // #if defined(MIPS_DSP_R1_LE)
-    "sll            %[r8],        %[r8],        2             \n\t"
-    "addu           %[r8],        %[r8],        %[r3]         \n\t"
-#if defined(MIPS_DSP_R1_LE)
-    "shra_r.w       %[r6],        %[r6],        14            \n\t"
-#else  // #if defined(MIPS_DSP_R1_LE)
-    "addiu          %[r6],        %[r6],        0x2000        \n\t"
-    "sra            %[r6],        %[r6],        14            \n\t"
-#endif  // #if defined(MIPS_DSP_R1_LE)
-    "sll            %[r0],        %[r0],        2             \n\t"
-    "addu           %[r0],        %[r0],        %[r6]         \n\t"
-    "addu           %[r3],        %[tmpre],     %[offset]     \n\t"
-    "addu           %[r2],        %[tmpim],     %[offset]     \n\t"
-    "addu           %[r9],        %[r9],        %[r8]         \n\t"
-    "negu           %[r9],        %[r9]                       \n\t"
-    "sra            %[r9],        %[r9],        9             \n\t"
-    "subu           %[r0],        %[r0],        %[r1]         \n\t"
-    "sra            %[r0],        %[r0],        9             \n\t"
-    "addiu          %[offset],    %[offset],    -4            \n\t"
-    "sh             %[r9],        0(%[r3])                    \n\t"
-    "sh             %[r0],        0(%[r2])                    \n\t"
-    "addiu          %[tmpre],     %[tmpre],     2             \n\t"
-    "bgtz           %[k],         2b                          \n\t"
-    " addiu         %[tmpim],     %[tmpim],     2             \n\t"
-   "3:                                                        \n\t"
-    ".set           pop                                       \n\t"
-    : [inre1] "=&r" (inre1), [inre2] "=&r" (inre2), [tmpre] "=&r" (tmpre),
-      [tmpim] "=&r" (tmpim), [offset] "+r" (factor), [k] "+r" (k),
-      [r0] "=&r" (r0), [r1] "=&r" (r1), [r2] "=&r" (r2), [r3] "=&r" (r3),
-      [r4] "=&r" (r4), [r5] "=&r" (r5), [r6] "=&r" (r6), [r7] "=&r" (r7),
-      [r8] "=&r" (r8), [r9] "=&r" (r9), [max1] "=&r" (max1)
-    : [inre1Q9] "r" (inre1Q9), [inre2Q9] "r" (inre2Q9),
-      [outreQ7] "r" (outreQ7), [outimQ7] "r" (outimQ7),
-      [max] "r" (max), [cosptr] "r" (cosptr), [sinptr] "r" (sinptr)
-    : "hi", "lo", "memory"
-  );
-}
-
-void WebRtcIsacfix_Spec2TimeMIPS(int16_t *inreQ7,
-                                 int16_t *inimQ7,
-                                 int32_t *outre1Q16,
-                                 int32_t *outre2Q16) {
-  int k = FRAMESAMPLES / 4;
-  int16_t* inre;
-  int16_t* inim;
-  int32_t* outre1;
-  int32_t* outre2;
-  int16_t* cosptr = (int16_t*)WebRtcIsacfix_kCosTab2;
-  int16_t* sinptr = (int16_t*)WebRtcIsacfix_kSinTab2;
-  int32_t r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, max, max1;
-#if defined(MIPS_DSP_R1_LE)
-  int32_t offset = FRAMESAMPLES - 4;
-#else  // #if defined(MIPS_DSP_R1_LE)
-  int32_t offset = FRAMESAMPLES - 2;
-#endif  // #if defined(MIPS_DSP_R1_LE)
-
-  __asm __volatile (
-    ".set           push                                      \n\t"
-    ".set           noreorder                                 \n\t"
-    "addiu          %[inre],      %[inreQ7],    0             \n\t"
-    "addiu          %[inim] ,     %[inimQ7],    0             \n\t"
-    "addiu          %[outre1],    %[outre1Q16], 0             \n\t"
-    "addiu          %[outre2],    %[outre2Q16], 0             \n\t"
-    "mul            %[max],       $zero,        $zero         \n\t"
-   "1:                                                        \n\t"
-#if defined(MIPS_DSP_R1_LE)
-    // Process two samples in one iteration avoiding left shift before
-    // multiplication. MaxAbsValueW32 function inlined into the loop.
-    "addu           %[r8],        %[inre],      %[offset]     \n\t"
-    "addu           %[r9],        %[inim],      %[offset]     \n\t"
-    "lwl            %[r4],        0(%[r8])                    \n\t"
-    "lwl            %[r5],        0(%[r9])                    \n\t"
-    "lwl            %[r0],        0(%[inre])                  \n\t"
-    "lwl            %[r1],        0(%[inim])                  \n\t"
-    "lwl            %[r2],        0(%[cosptr])                \n\t"
-    "lwl            %[r3],        0(%[sinptr])                \n\t"
-    "lwr            %[r4],        0(%[r8])                    \n\t"
-    "lwr            %[r5],        0(%[r9])                    \n\t"
-    "lwr            %[r0],        0(%[inre])                  \n\t"
-    "lwr            %[r1],        0(%[inim])                  \n\t"
-    "lwr            %[r2],        0(%[cosptr])                \n\t"
-    "lwr            %[r3],        0(%[sinptr])                \n\t"
-    "packrl.ph      %[r4],        %[r4],        %[r4]         \n\t"
-    "packrl.ph      %[r5],        %[r5],        %[r5]         \n\t"
-    "muleq_s.w.phr  %[r6],        %[r0],        %[r2]         \n\t"
-    "muleq_s.w.phr  %[r7],        %[r1],        %[r3]         \n\t"
-    "muleq_s.w.phr  %[r8],        %[r4],        %[r2]         \n\t"
-    "muleq_s.w.phr  %[r9],        %[r5],        %[r3]         \n\t"
-    "addiu          %[k],         %[k],         -2            \n\t"
-    "addiu          %[cosptr],    %[cosptr],    4             \n\t"
-    "addiu          %[sinptr],    %[sinptr],    4             \n\t"
-    "addiu          %[inre],      %[inre],      4             \n\t"
-    "addiu          %[inim],      %[inim],      4             \n\t"
-    "shra_r.w       %[r6],        %[r6],        6             \n\t"
-    "shra_r.w       %[r7],        %[r7],        6             \n\t"
-    "shra_r.w       %[r8],        %[r8],        6             \n\t"
-    "shra_r.w       %[r9],        %[r9],        6             \n\t"
-    "addu           %[r6],        %[r6],        %[r7]         \n\t"
-    "subu           %[r9],        %[r9],        %[r8]         \n\t"
-    "subu           %[r7],        %[r6],        %[r9]         \n\t"
-    "addu           %[r6],        %[r6],        %[r9]         \n\t"
-    "sw             %[r7],        0(%[outre1])                \n\t"
-    "absq_s.w       %[r7],        %[r7]                       \n\t"
-    "slt            %[r8],        %[max],       %[r7]         \n\t"
-    "movn           %[max],       %[r7],        %[r8]         \n\t"
-    "sll            %[r7],        %[offset],    1             \n\t"
-    "addu           %[r7],        %[outre1],    %[r7]         \n\t"
-    "sw             %[r6],        4(%[r7])                    \n\t"
-    "absq_s.w       %[r6],        %[r6]                       \n\t"
-    "slt            %[r8],        %[max],       %[r6]         \n\t"
-    "movn           %[max],       %[r6],        %[r8]         \n\t"
-    "muleq_s.w.phl  %[r6],        %[r0],        %[r2]         \n\t"
-    "muleq_s.w.phl  %[r7],        %[r1],        %[r3]         \n\t"
-    "muleq_s.w.phl  %[r8],        %[r4],        %[r2]         \n\t"
-    "muleq_s.w.phl  %[r9],        %[r5],        %[r3]         \n\t"
-    "shra_r.w       %[r6],        %[r6],        6             \n\t"
-    "shra_r.w       %[r7],        %[r7],        6             \n\t"
-    "shra_r.w       %[r8],        %[r8],        6             \n\t"
-    "shra_r.w       %[r9],        %[r9],        6             \n\t"
-    "addu           %[r6],        %[r6],        %[r7]         \n\t"
-    "subu           %[r9],        %[r9],        %[r8]         \n\t"
-    "subu           %[r7],        %[r6],        %[r9]         \n\t"
-    "addu           %[r6],        %[r6],        %[r9]         \n\t"
-    "sw             %[r7],        4(%[outre1])                \n\t"
-    "absq_s.w       %[r7],        %[r7]                       \n\t"
-    "slt            %[r8],        %[max],       %[r7]         \n\t"
-    "movn           %[max],       %[r7],        %[r8]         \n\t"
-    "sll            %[r7],        %[offset],    1             \n\t"
-    "addu           %[r7],        %[outre1],    %[r7]         \n\t"
-    "sw             %[r6],        0(%[r7])                    \n\t"
-    "absq_s.w       %[r6],        %[r6]                       \n\t"
-    "slt            %[r8],        %[max],       %[r6]         \n\t"
-    "movn           %[max],       %[r6],        %[r8]         \n\t"
-    "muleq_s.w.phr  %[r6],        %[r1],        %[r2]         \n\t"
-    "muleq_s.w.phr  %[r7],        %[r0],        %[r3]         \n\t"
-    "muleq_s.w.phr  %[r8],        %[r5],        %[r2]         \n\t"
-    "muleq_s.w.phr  %[r9],        %[r4],        %[r3]         \n\t"
-    "addiu          %[outre1],    %[outre1],    8             \n\t"
-    "shra_r.w       %[r6],        %[r6],        6             \n\t"
-    "shra_r.w       %[r7],        %[r7],        6             \n\t"
-    "shra_r.w       %[r8],        %[r8],        6             \n\t"
-    "shra_r.w       %[r9],        %[r9],        6             \n\t"
-    "subu           %[r6],        %[r6],        %[r7]         \n\t"
-    "addu           %[r9],        %[r9],        %[r8]         \n\t"
-    "subu           %[r7],        %[r6],        %[r9]         \n\t"
-    "addu           %[r6],        %[r9],        %[r6]         \n\t"
-    "negu           %[r6],        %[r6]                       \n\t"
-    "sw             %[r7],        0(%[outre2])                \n\t"
-    "absq_s.w       %[r7],        %[r7]                       \n\t"
-    "slt            %[r8],        %[max],       %[r7]         \n\t"
-    "movn           %[max],       %[r7],        %[r8]         \n\t"
-    "sll            %[r7],        %[offset],    1             \n\t"
-    "addu           %[r7],        %[outre2],    %[r7]         \n\t"
-    "sw             %[r6],        4(%[r7])                    \n\t"
-    "absq_s.w       %[r6],        %[r6]                       \n\t"
-    "slt            %[r8],        %[max],       %[r6]         \n\t"
-    "movn           %[max],       %[r6],        %[r8]         \n\t"
-    "muleq_s.w.phl  %[r6],       %[r1],         %[r2]         \n\t"
-    "muleq_s.w.phl  %[r7],       %[r0],         %[r3]         \n\t"
-    "muleq_s.w.phl  %[r8],       %[r5],         %[r2]         \n\t"
-    "muleq_s.w.phl  %[r9],       %[r4],         %[r3]         \n\t"
-    "addiu          %[offset],   %[offset],     -8            \n\t"
-    "shra_r.w       %[r6],       %[r6],         6             \n\t"
-    "shra_r.w       %[r7],       %[r7],         6             \n\t"
-    "shra_r.w       %[r8],       %[r8],         6             \n\t"
-    "shra_r.w       %[r9],       %[r9],         6             \n\t"
-    "subu           %[r6],       %[r6],         %[r7]         \n\t"
-    "addu           %[r9],       %[r9],         %[r8]         \n\t"
-    "subu           %[r7],       %[r6],         %[r9]         \n\t"
-    "addu           %[r6],       %[r9],         %[r6]         \n\t"
-    "negu           %[r6],       %[r6]                        \n\t"
-    "sw             %[r7],       4(%[outre2])                 \n\t"
-    "absq_s.w       %[r7],       %[r7]                        \n\t"
-    "slt            %[r8],       %[max],        %[r7]         \n\t"
-    "movn           %[max],      %[r7],         %[r8]         \n\t"
-    "sll            %[r7],       %[offset],     1             \n\t"
-    "addu           %[r7],       %[outre2],     %[r7]         \n\t"
-    "sw             %[r6],       0(%[r7])                     \n\t"
-    "absq_s.w       %[r6],       %[r6]                        \n\t"
-    "slt            %[r8],       %[max],        %[r6]         \n\t"
-    "movn           %[max],      %[r6],         %[r8]         \n\t"
-    "bgtz           %[k],        1b                           \n\t"
-    " addiu         %[outre2],   %[outre2],     8             \n\t"
-#else  // #if defined(MIPS_DSP_R1_LE)
-    "lh             %[r0],       0(%[inre])                   \n\t"
-    "lh             %[r1],       0(%[inim])                   \n\t"
-    "lh             %[r4],       0(%[cosptr])                 \n\t"
-    "lh             %[r5],       0(%[sinptr])                 \n\t"
-    "addiu          %[k],        %[k],          -1            \n\t"
-    "mul            %[r2],       %[r0],         %[r4]         \n\t"
-    "mul            %[r0],       %[r0],         %[r5]         \n\t"
-    "mul            %[r3],       %[r1],         %[r5]         \n\t"
-    "mul            %[r1],       %[r1],         %[r4]         \n\t"
-    "addiu          %[cosptr],   %[cosptr],     2             \n\t"
-    "addiu          %[sinptr],   %[sinptr],     2             \n\t"
-    "addu           %[r8],       %[inre],       %[offset]     \n\t"
-    "addu           %[r9],       %[inim],       %[offset]     \n\t"
-    "addiu          %[r2],       %[r2],         16            \n\t"
-    "sra            %[r2],       %[r2],         5             \n\t"
-    "addiu          %[r0],       %[r0],         16            \n\t"
-    "sra            %[r0],       %[r0],         5             \n\t"
-    "addiu          %[r3],       %[r3],         16            \n\t"
-    "sra            %[r3],       %[r3],         5             \n\t"
-    "lh             %[r6],       0(%[r8])                     \n\t"
-    "lh             %[r7],       0(%[r9])                     \n\t"
-    "addiu          %[r1],       %[r1],         16            \n\t"
-    "sra            %[r1],       %[r1],         5             \n\t"
-    "mul            %[r8],       %[r7],         %[r4]         \n\t"
-    "mul            %[r7],       %[r7],         %[r5]         \n\t"
-    "mul            %[r9],       %[r6],         %[r4]         \n\t"
-    "mul            %[r6],       %[r6],         %[r5]         \n\t"
-    "addu           %[r2],       %[r2],         %[r3]         \n\t"
-    "subu           %[r1],       %[r1],         %[r0]         \n\t"
-    "sll            %[r0],       %[offset],     1             \n\t"
-    "addu           %[r4],       %[outre1],     %[r0]         \n\t"
-    "addu           %[r5],       %[outre2],     %[r0]         \n\t"
-    "addiu          %[r8],       %[r8],         16            \n\t"
-    "sra            %[r8],       %[r8],         5             \n\t"
-    "addiu          %[r7],       %[r7],         16            \n\t"
-    "sra            %[r7],       %[r7],         5             \n\t"
-    "addiu          %[r6],       %[r6],         16            \n\t"
-    "sra            %[r6],       %[r6],         5             \n\t"
-    "addiu          %[r9],       %[r9],         16            \n\t"
-    "sra            %[r9],       %[r9],         5             \n\t"
-    "addu           %[r8],       %[r8],         %[r6]         \n\t"
-    "negu           %[r8],       %[r8]                        \n\t"
-    "subu           %[r7],       %[r7],         %[r9]         \n\t"
-    "subu           %[r6],       %[r2],         %[r7]         \n\t"
-    "addu           %[r0],       %[r2],         %[r7]         \n\t"
-    "addu           %[r3],       %[r1],         %[r8]         \n\t"
-    "subu           %[r1],       %[r8],         %[r1]         \n\t"
-    "sw             %[r6],       0(%[outre1])                 \n\t"
-    "sw             %[r0],       0(%[r4])                     \n\t"
-    "sw             %[r3],       0(%[outre2])                 \n\t"
-    "sw             %[r1],       0(%[r5])                     \n\t"
-    "addiu          %[outre1],   %[outre1],     4             \n\t"
-    "addiu          %[offset],   %[offset],     -4            \n\t"
-    "addiu          %[inre],     %[inre],       2             \n\t"
-    "addiu          %[inim],     %[inim],       2             \n\t"
-    // Inlined WebRtcSpl_MaxAbsValueW32
-    "negu           %[r5],       %[r6]                        \n\t"
-    "slt            %[r2],       %[r6],         $zero         \n\t"
-    "movn           %[r6],       %[r5],         %[r2]         \n\t"
-    "negu           %[r5],       %[r0]                        \n\t"
-    "slt            %[r2],       %[r0],         $zero         \n\t"
-    "movn           %[r0],       %[r5],         %[r2]         \n\t"
-    "negu           %[r5],       %[r3]                        \n\t"
-    "slt            %[r2],       %[r3],         $zero         \n\t"
-    "movn           %[r3],       %[r5],         %[r2]         \n\t"
-    "negu           %[r5],       %[r1]                        \n\t"
-    "slt            %[r2],       %[r1],         $zero         \n\t"
-    "movn           %[r1],       %[r5],         %[r2]         \n\t"
-    "slt            %[r2],       %[r6],         %[r0]         \n\t"
-    "slt            %[r5],       %[r3],         %[r1]         \n\t"
-    "movn           %[r6],       %[r0],         %[r2]         \n\t"
-    "movn           %[r3],       %[r1],         %[r5]         \n\t"
-    "slt            %[r2],       %[r6],         %[r3]         \n\t"
-    "movn           %[r6],       %[r3],         %[r2]         \n\t"
-    "slt            %[r2],       %[max],        %[r6]         \n\t"
-    "movn           %[max],      %[r6],         %[r2]         \n\t"
-    "bgtz           %[k],        1b                           \n\t"
-    " addiu         %[outre2],   %[outre2],     4             \n\t"
-#endif  // #if defined(MIPS_DSP_R1_LE)
-    "clz            %[max],      %[max]                       \n\t"
-    "addiu          %[max],      %[max],        -25           \n\t"
-    ".set           pop                                       \n\t"
-    : [inre] "=&r" (inre), [inim] "=&r" (inim),
-      [outre1] "=&r" (outre1), [outre2] "=&r" (outre2),
-      [offset] "+r" (offset), [k] "+r" (k), [r0] "=&r" (r0),
-      [r1] "=&r" (r1), [r2] "=&r" (r2), [r3] "=&r" (r3),
-      [r4] "=&r" (r4), [r5] "=&r" (r5), [r6] "=&r" (r6),
-      [r7] "=&r" (r7), [r8] "=&r" (r8), [r9] "=&r" (r9),
-      [max] "=&r" (max)
-    : [inreQ7] "r" (inreQ7), [inimQ7] "r" (inimQ7),
-      [cosptr] "r" (cosptr), [sinptr] "r" (sinptr),
-      [outre1Q16] "r" (outre1Q16), [outre2Q16] "r" (outre2Q16)
-    : "hi", "lo", "memory"
-  );
-
-  // "Fastest" vectors
-  k = FRAMESAMPLES / 4;
-  __asm __volatile (
-    ".set           push                                      \n\t"
-    ".set           noreorder                                 \n\t"
-    "addiu          %[inre],      %[inreQ7],    0             \n\t"
-    "addiu          %[inim],      %[inimQ7],    0             \n\t"
-    "addiu          %[outre1],    %[outre1Q16], 0             \n\t"
-    "addiu          %[outre2],    %[outre2Q16], 0             \n\t"
-    "bltz           %[max],       2f                          \n\t"
-    " subu          %[max1],      $zero,        %[max]        \n\t"
-   "1:                                                        \n\t"
-    "lw             %[r0],        0(%[outre1])                \n\t"
-    "lw             %[r1],        0(%[outre2])                \n\t"
-    "lw             %[r2],        4(%[outre1])                \n\t"
-    "lw             %[r3],        4(%[outre2])                \n\t"
-    "sllv           %[r0],        %[r0],        %[max]        \n\t"
-    "sllv           %[r1],        %[r1],        %[max]        \n\t"
-    "sllv           %[r2],        %[r2],        %[max]        \n\t"
-    "sllv           %[r3],        %[r3],        %[max]        \n\t"
-    "addiu          %[k],         %[k],         -1            \n\t"
-    "addiu          %[outre1],    %[outre1],    8             \n\t"
-    "addiu          %[outre2],    %[outre2],    8             \n\t"
-    "sh             %[r0],        0(%[inre])                  \n\t"
-    "sh             %[r1],        0(%[inim])                  \n\t"
-    "sh             %[r2],        2(%[inre])                  \n\t"
-    "sh             %[r3],        2(%[inim])                  \n\t"
-    "addiu          %[inre],      %[inre],      4             \n\t"
-    "bgtz           %[k],         1b                          \n\t"
-    " addiu         %[inim],      %[inim],      4             \n\t"
-    "b              4f                                        \n\t"
-    " nop                                                     \n\t"
-   "2:                                                        \n\t"
-#if !defined(MIPS_DSP_R1_LE)
-    "addiu          %[r4],        $zero,        1             \n\t"
-    "addiu          %[r5],        %[max1],      -1            \n\t"
-    "sllv           %[r4],        %[r4],        %[r5]         \n\t"
-#endif  // #if !defined(MIPS_DSP_R1_LE)
-   "3:                                                        \n\t"
-    "lw             %[r0],        0(%[outre1])                \n\t"
-    "lw             %[r1],        0(%[outre2])                \n\t"
-    "lw             %[r2],        4(%[outre1])                \n\t"
-    "lw             %[r3],        4(%[outre2])                \n\t"
-#if defined(MIPS_DSP_R1_LE)
-    "shrav_r.w      %[r0],        %[r0],        %[max1]       \n\t"
-    "shrav_r.w      %[r1],        %[r1],        %[max1]       \n\t"
-    "shrav_r.w      %[r2],        %[r2],        %[max1]       \n\t"
-    "shrav_r.w      %[r3],        %[r3],        %[max1]       \n\t"
-#else  // #if defined(MIPS_DSP_R1_LE)
-    "addu           %[r0],        %[r0],        %[r4]         \n\t"
-    "addu           %[r1],        %[r1],        %[r4]         \n\t"
-    "addu           %[r2],        %[r2],        %[r4]         \n\t"
-    "addu           %[r3],        %[r3],        %[r4]         \n\t"
-    "srav           %[r0],        %[r0],        %[max1]       \n\t"
-    "srav           %[r1],        %[r1],        %[max1]       \n\t"
-    "srav           %[r2],        %[r2],        %[max1]       \n\t"
-    "srav           %[r3],        %[r3],        %[max1]       \n\t"
-#endif  // #if defined(MIPS_DSP_R1_LE)
-    "addiu          %[outre1],    %[outre1],    8             \n\t"
-    "addiu          %[outre2],    %[outre2],    8             \n\t"
-    "sh             %[r0],        0(%[inre])                  \n\t"
-    "sh             %[r1],        0(%[inim])                  \n\t"
-    "sh             %[r2],        2(%[inre])                  \n\t"
-    "sh             %[r3],        2(%[inim])                  \n\t"
-    "addiu          %[k],         %[k],         -1            \n\t"
-    "addiu          %[inre],      %[inre],      4             \n\t"
-    "bgtz           %[k],         3b                          \n\t"
-    " addiu         %[inim],      %[inim],      4             \n\t"
-   "4:                                                        \n\t"
-    ".set           pop                                       \n\t"
-    : [k] "+r" (k), [max1] "=&r" (max1), [r0] "=&r" (r0),
-      [inre] "=&r" (inre), [inim] "=&r" (inim),
-      [outre1] "=&r" (outre1), [outre2] "=&r" (outre2),
-#if !defined(MIPS_DSP_R1_LE)
-      [r4] "=&r" (r4), [r5] "=&r" (r5),
-#endif  // #if !defined(MIPS_DSP_R1_LE)
-      [r1] "=&r" (r1), [r2] "=&r" (r2), [r3] "=&r" (r3)
-    : [max] "r" (max), [inreQ7] "r" (inreQ7),
-      [inimQ7] "r" (inimQ7), [outre1Q16] "r" (outre1Q16),
-      [outre2Q16] "r" (outre2Q16)
-    : "memory"
-  );
-
-  WebRtcIsacfix_FftRadix16Fastest(inreQ7, inimQ7, 1); // real call
-
-  // All the remaining processing is done inside a single loop to avoid
-  // unnecessary memory accesses. MIPS DSPr2 version processes two samples
-  // at a time.
-  cosptr = (int16_t*)WebRtcIsacfix_kCosTab1;
-  sinptr = (int16_t*)WebRtcIsacfix_kSinTab1;
-  k = FRAMESAMPLES / 2;
-  __asm __volatile (
-    ".set           push                                      \n\t"
-    ".set           noreorder                                 \n\t"
-    "addiu          %[inre],      %[inreQ7],    0             \n\t"
-    "addiu          %[inim],      %[inimQ7],    0             \n\t"
-    "addiu          %[outre1],    %[outre1Q16], 0             \n\t"
-    "addiu          %[outre2],    %[outre2Q16], 0             \n\t"
-    "addiu          %[r4],        $zero,        273           \n\t"
-    "addiu          %[r5],        $zero,        31727         \n\t"
-#if defined(MIPS_DSP_R2_LE)
-    "addiu          %[max],       %[max],       16            \n\t"
-    "replv.ph       %[r4],        %[r4]                       \n\t"
-#endif  // #if defined(MIPS_DSP_R2_LE)
-    "bltz           %[max],       2f                          \n\t"
-    " subu          %[max1],      $zero,        %[max]        \n\t"
-#if defined(MIPS_DSP_R2_LE)
-    "addiu          %[max],       %[max],       1             \n\t"
-#endif  // #if defined(MIPS_DSP_R2_LE)
-   "1:                                                        \n\t"
-#if defined(MIPS_DSP_R2_LE)
-    "lwl            %[r0],        0(%[inre])                  \n\t"
-    "lwl            %[r1],        0(%[inim])                  \n\t"
-    "lh             %[r2],        0(%[cosptr])                \n\t"
-    "lwr            %[r0],        0(%[inre])                  \n\t"
-    "lwr            %[r1],        0(%[inim])                  \n\t"
-    "lh             %[r3],        0(%[sinptr])                \n\t"
-    "muleq_s.w.phr  %[r6],        %[r0],        %[r4]         \n\t"
-    "muleq_s.w.phr  %[r7],        %[r1],        %[r4]         \n\t"
-    "muleq_s.w.phl  %[r0],        %[r0],        %[r4]         \n\t"
-    "muleq_s.w.phl  %[r1],        %[r1],        %[r4]         \n\t"
-    "addiu          %[k],         %[k],         -2            \n\t"
-    "addiu          %[inre],      %[inre],      4             \n\t"
-    "addiu          %[inim],      %[inim],      4             \n\t"
-    "shrav_r.w      %[r6],        %[r6],        %[max]        \n\t"
-    "shrav_r.w      %[r7],        %[r7],        %[max]        \n\t"
-    "mult           $ac0,         %[r2],        %[r6]         \n\t"
-    "mult           $ac1,         %[r3],        %[r7]         \n\t"
-    "mult           $ac2,         %[r2],        %[r7]         \n\t"
-    "mult           $ac3,         %[r3],        %[r6]         \n\t"
-    "lh             %[r2],        2(%[cosptr])                \n\t"
-    "lh             %[r3],        2(%[sinptr])                \n\t"
-    "extr_r.w       %[r6],        $ac0,         14            \n\t"
-    "extr_r.w       %[r7],        $ac1,         14            \n\t"
-    "extr_r.w       %[r8],        $ac2,         14            \n\t"
-    "extr_r.w       %[r9],        $ac3,         14            \n\t"
-    "shrav_r.w      %[r0],        %[r0],        %[max]        \n\t"
-    "shrav_r.w      %[r1],        %[r1],        %[max]        \n\t"
-    "mult           $ac0,         %[r2],        %[r0]         \n\t"
-    "mult           $ac1,         %[r3],        %[r1]         \n\t"
-    "mult           $ac2,         %[r2],        %[r1]         \n\t"
-    "mult           $ac3,         %[r3],        %[r0]         \n\t"
-    "addiu          %[cosptr],    %[cosptr],    4             \n\t"
-    "extr_r.w       %[r0],        $ac0,         14            \n\t"
-    "extr_r.w       %[r1],        $ac1,         14            \n\t"
-    "extr_r.w       %[r2],        $ac2,         14            \n\t"
-    "extr_r.w       %[r3],        $ac3,         14            \n\t"
-    "subu           %[r6],        %[r6],        %[r7]         \n\t"
-    "addu           %[r8],        %[r8],        %[r9]         \n\t"
-    "mult           $ac0,         %[r5],        %[r6]         \n\t"
-    "mult           $ac1,         %[r5],        %[r8]         \n\t"
-    "addiu          %[sinptr],    %[sinptr],    4             \n\t"
-    "subu           %[r0],        %[r0],        %[r1]         \n\t"
-    "addu           %[r2],        %[r2],        %[r3]         \n\t"
-    "extr_r.w       %[r1],        $ac0,         11            \n\t"
-    "extr_r.w       %[r3],        $ac1,         11            \n\t"
-    "mult           $ac2,         %[r5],        %[r0]         \n\t"
-    "mult           $ac3,         %[r5],        %[r2]         \n\t"
-    "sw             %[r1],        0(%[outre1])                \n\t"
-    "sw             %[r3],        0(%[outre2])                \n\t"
-    "addiu          %[outre1],    %[outre1],    8             \n\t"
-    "extr_r.w       %[r0],        $ac2,         11            \n\t"
-    "extr_r.w       %[r2],        $ac3,         11            \n\t"
-    "sw             %[r0],        -4(%[outre1])               \n\t"
-    "sw             %[r2],        4(%[outre2])                \n\t"
-    "bgtz           %[k],         1b                          \n\t"
-    " addiu         %[outre2],    %[outre2],    8             \n\t"
-    "b              3f                                        \n\t"
-#else  // #if defined(MIPS_DSP_R2_LE)
-    "lh             %[r0],        0(%[inre])                  \n\t"
-    "lh             %[r1],        0(%[inim])                  \n\t"
-    "addiu          %[k],         %[k],         -1            \n\t"
-    "srav           %[r0],        %[r0],        %[max]        \n\t"
-    "srav           %[r1],        %[r1],        %[max]        \n\t"
-    "sra            %[r2],        %[r0],        16            \n\t"
-    "andi           %[r0],        %[r0],        0xFFFF        \n\t"
-    "sra            %[r0],        %[r0],        1             \n\t"
-    "sra            %[r3],        %[r1],        16            \n\t"
-    "andi           %[r1],        %[r1],        0xFFFF        \n\t"
-    "sra            %[r1],        %[r1],        1             \n\t"
-    "mul            %[r2],        %[r2],        %[r4]         \n\t"
-    "mul            %[r0],        %[r0],        %[r4]         \n\t"
-    "mul            %[r3],        %[r3],        %[r4]         \n\t"
-    "mul            %[r1],        %[r1],        %[r4]         \n\t"
-    "addiu          %[inre],      %[inre],      2             \n\t"
-    "addiu          %[inim],      %[inim],      2             \n\t"
-    "lh             %[r6],        0(%[cosptr])                \n\t"
-    "lh             %[r7],        0(%[sinptr])                \n\t"
-#if defined(MIPS_DSP_R1_LE)
-    "shra_r.w       %[r0],        %[r0],        15            \n\t"
-    "shra_r.w       %[r1],        %[r1],        15            \n\t"
-#else  // #if defined(MIPS_DSP_R1_LE)
-    "addiu          %[r0],        %[r0],        0x4000        \n\t"
-    "addiu          %[r1],        %[r1],        0x4000        \n\t"
-    "sra            %[r0],        %[r0],        15            \n\t"
-    "sra            %[r1],        %[r1],        15            \n\t"
-#endif  // #if defined(MIPS_DSP_R1_LE)
-    "addu           %[r0],        %[r2],        %[r0]         \n\t"
-    "addu           %[r1],        %[r3],        %[r1]         \n\t"
-    "sra            %[r2],        %[r0],        16            \n\t"
-    "andi           %[r0],        %[r0],        0xFFFF        \n\t"
-    "mul            %[r9],        %[r2],        %[r6]         \n\t"
-    "mul            %[r2],        %[r2],        %[r7]         \n\t"
-    "mul            %[r8],        %[r0],        %[r6]         \n\t"
-    "mul            %[r0],        %[r0],        %[r7]         \n\t"
-    "sra            %[r3],        %[r3],        16            \n\t"
-    "andi           %[r1],        %[r1],        0xFFFF        \n\t"
-    "sll            %[r9],        %[r9],        2             \n\t"
-    "sll            %[r2],        %[r2],        2             \n\t"
-#if defined(MIPS_DSP_R1_LE)
-    "shra_r.w       %[r8],        %[r8],        14            \n\t"
-    "shra_r.w       %[r0],        %[r0],        14            \n\t"
-#else  // #if defined(MIPS_DSP_R1_LE)
-    "addiu          %[r8],        %[r8],        0x2000        \n\t"
-    "addiu          %[r0],        %[r0],        0x2000        \n\t"
-    "sra            %[r8],        %[r8],        14            \n\t"
-    "sra            %[r0],        %[r0],        14            \n\t"
-#endif  // #if defined(MIPS_DSP_R1_LE)
-    "addu           %[r9],        %[r9],        %[r8]         \n\t"
-    "addu           %[r2],        %[r2],        %[r0]         \n\t"
-    "mul            %[r0],        %[r3],        %[r6]         \n\t"
-    "mul            %[r3],        %[r3],        %[r7]         \n\t"
-    "mul            %[r8],        %[r1],        %[r6]         \n\t"
-    "mul            %[r1],        %[r1],        %[r8]         \n\t"
-    "addiu          %[cosptr],    %[cosptr],    2             \n\t"
-    "addiu          %[sinptr],    %[sinptr],    2             \n\t"
-    "sll            %[r0],        %[r0],        2             \n\t"
-    "sll            %[r3],        %[r3],        2             \n\t"
-#if defined(MIPS_DSP_R1_LE)
-    "shra_r.w       %[r8],        %[r8],        14            \n\t"
-    "shra_r.w       %[r1],        %[r1],        14            \n\t"
-#else  // #if defined(MIPS_DSP_R1_LE)
-    "addiu          %[r8],        %[r8],        0x2000        \n\t"
-    "addiu          %[r1],        %[r1],        0x2000        \n\t"
-    "sra            %[r8],        %[r8],        14            \n\t"
-    "sra            %[r1],        %[r1],        14            \n\t"
-#endif  // #if defined(MIPS_DSP_R1_LE)
-    "addu           %[r0],        %[r0],        %[r8]         \n\t"
-    "addu           %[r3],        %[r3],        %[r1]         \n\t"
-    "subu           %[r9],        %[r9],        %[r3]         \n\t"
-    "addu           %[r0],        %[r0],        %[r2]         \n\t"
-    "sra            %[r1],        %[r9],        16            \n\t"
-    "andi           %[r9],        %[r9],        0xFFFF        \n\t"
-    "mul            %[r1],        %[r1],        %[r5]         \n\t"
-    "mul            %[r9],        %[r9],        %[r5]         \n\t"
-    "sra            %[r2],        %[r0],        16            \n\t"
-    "andi           %[r0],        %[r0],        0xFFFF        \n\t"
-    "mul            %[r2],        %[r2],        %[r5]         \n\t"
-    "mul            %[r0],        %[r0],        %[r5]         \n\t"
-    "sll            %[r1],        %[r1],        5             \n\t"
-#if defined(MIPS_DSP_R1_LE)
-    "shra_r.w       %[r9],        %[r9],        11            \n\t"
-#else  // #if defined(MIPS_DSP_R1_LE)
-    "addiu          %[r9],        %[r9],        0x400         \n\t"
-    "sra            %[r9],        %[r9],        11            \n\t"
-#endif  // #if defined(MIPS_DSP_R1_LE)
-    "addu           %[r1],        %[r1],        %[r9]         \n\t"
-    "sll            %[r2],        %[r2],        5             \n\t"
-#if defined(MIPS_DSP_R1_LE)
-    "shra_r.w       %[r0],        %[r0],        11            \n\t"
-#else  // #if defined(MIPS_DSP_R1_LE)
-    "addiu          %[r0],        %[r0],        0x400         \n\t"
-    "sra            %[r0],        %[r0],        11            \n\t"
-#endif  // #if defined(MIPS_DSP_R1_LE)
-    "addu           %[r0],        %[r0],        %[r2]         \n\t"
-    "sw             %[r1],        0(%[outre1])                \n\t"
-    "addiu          %[outre1],    %[outre1],    4             \n\t"
-    "sw             %[r0],        0(%[outre2])                \n\t"
-    "bgtz           %[k],         1b                          \n\t"
-    " addiu         %[outre2],    %[outre2],    4             \n\t"
-    "b              3f                                        \n\t"
-    " nop                                                     \n\t"
-#endif  // #if defined(MIPS_DSP_R2_LE)
-   "2:                                                        \n\t"
-#if defined(MIPS_DSP_R2_LE)
-    "addiu          %[max1],      %[max1],      -1            \n\t"
-   "21:                                                       \n\t"
-    "lwl            %[r0],        0(%[inre])                  \n\t"
-    "lwl            %[r1],        0(%[inim])                  \n\t"
-    "lh             %[r2],        0(%[cosptr])                \n\t"
-    "lwr            %[r0],        0(%[inre])                  \n\t"
-    "lwr            %[r1],        0(%[inim])                  \n\t"
-    "lh             %[r3],        0(%[sinptr])                \n\t"
-    "muleq_s.w.phr  %[r6],        %[r0],        %[r4]         \n\t"
-    "muleq_s.w.phr  %[r7],        %[r1],        %[r4]         \n\t"
-    "muleq_s.w.phl  %[r0],        %[r0],        %[r4]         \n\t"
-    "muleq_s.w.phl  %[r1],        %[r1],        %[r4]         \n\t"
-    "addiu          %[k],         %[k],         -2            \n\t"
-    "addiu          %[inre],      %[inre],      4             \n\t"
-    "addiu          %[inim],      %[inim],      4             \n\t"
-    "sllv           %[r6],        %[r6],        %[max1]       \n\t"
-    "sllv           %[r7],        %[r7],        %[max1]       \n\t"
-    "mult           $ac0,         %[r2],        %[r6]         \n\t"
-    "mult           $ac1,         %[r3],        %[r7]         \n\t"
-    "mult           $ac2,         %[r2],        %[r7]         \n\t"
-    "mult           $ac3,         %[r3],        %[r6]         \n\t"
-    "lh             %[r2],        2(%[cosptr])                \n\t"
-    "lh             %[r3],        2(%[sinptr])                \n\t"
-    "extr_r.w       %[r6],        $ac0,         14            \n\t"
-    "extr_r.w       %[r7],        $ac1,         14            \n\t"
-    "extr_r.w       %[r8],        $ac2,         14            \n\t"
-    "extr_r.w       %[r9],        $ac3,         14            \n\t"
-    "sllv           %[r0],        %[r0],        %[max1]       \n\t"
-    "sllv           %[r1],        %[r1],        %[max1]       \n\t"
-    "mult           $ac0,         %[r2],        %[r0]         \n\t"
-    "mult           $ac1,         %[r3],        %[r1]         \n\t"
-    "mult           $ac2,         %[r2],        %[r1]         \n\t"
-    "mult           $ac3,         %[r3],        %[r0]         \n\t"
-    "addiu          %[cosptr],    %[cosptr],    4             \n\t"
-    "extr_r.w       %[r0],        $ac0,         14            \n\t"
-    "extr_r.w       %[r1],        $ac1,         14            \n\t"
-    "extr_r.w       %[r2],        $ac2,         14            \n\t"
-    "extr_r.w       %[r3],        $ac3,         14            \n\t"
-    "subu           %[r6],        %[r6],        %[r7]         \n\t"
-    "addu           %[r8],        %[r8],        %[r9]         \n\t"
-    "mult           $ac0,         %[r5],        %[r6]         \n\t"
-    "mult           $ac1,         %[r5],        %[r8]         \n\t"
-    "addiu          %[sinptr],    %[sinptr],    4             \n\t"
-    "subu           %[r0],        %[r0],        %[r1]         \n\t"
-    "addu           %[r2],        %[r2],        %[r3]         \n\t"
-    "extr_r.w       %[r1],        $ac0,         11            \n\t"
-    "extr_r.w       %[r3],        $ac1,         11            \n\t"
-    "mult           $ac2,         %[r5],        %[r0]         \n\t"
-    "mult           $ac3,         %[r5],        %[r2]         \n\t"
-    "sw             %[r1],        0(%[outre1])                \n\t"
-    "sw             %[r3],        0(%[outre2])                \n\t"
-    "addiu          %[outre1],    %[outre1],    8             \n\t"
-    "extr_r.w       %[r0],        $ac2,         11            \n\t"
-    "extr_r.w       %[r2],        $ac3,         11            \n\t"
-    "sw             %[r0],        -4(%[outre1])               \n\t"
-    "sw             %[r2],        4(%[outre2])                \n\t"
-    "bgtz           %[k],         21b                         \n\t"
-    " addiu         %[outre2],    %[outre2],    8             \n\t"
-    "b              3f                                        \n\t"
-    " nop                                                     \n\t"
-#else  // #if defined(MIPS_DSP_R2_LE)
-    "lh             %[r0],        0(%[inre])                  \n\t"
-    "lh             %[r1],        0(%[inim])                  \n\t"
-    "addiu          %[k],         %[k],         -1            \n\t"
-    "sllv           %[r0],        %[r0],        %[max1]       \n\t"
-    "sllv           %[r1],        %[r1],        %[max1]       \n\t"
-    "sra            %[r2],        %[r0],        16            \n\t"
-    "andi           %[r0],        %[r0],        0xFFFF        \n\t"
-    "sra            %[r0],        %[r0],        1             \n\t"
-    "sra            %[r3],        %[r1],        16            \n\t"
-    "andi           %[r1],        %[r1],        0xFFFF        \n\t"
-    "sra            %[r1],        %[r1],        1             \n\t"
-    "mul            %[r2],        %[r2],        %[r4]         \n\t"
-    "mul            %[r0],        %[r0],        %[r4]         \n\t"
-    "mul            %[r3],        %[r3],        %[r4]         \n\t"
-    "mul            %[r1],        %[r1],        %[r4]         \n\t"
-    "addiu          %[inre],      %[inre],      2             \n\t"
-    "addiu          %[inim],      %[inim],      2             \n\t"
-    "lh             %[r6],        0(%[cosptr])                \n\t"
-    "lh             %[r7],        0(%[sinptr])                \n\t"
-#if defined(MIPS_DSP_R1_LE)
-    "shra_r.w       %[r0],        %[r0],        15            \n\t"
-    "shra_r.w       %[r1],        %[r1],        15            \n\t"
-#else  // #if defined(MIPS_DSP_R1_LE)
-    "addiu          %[r0],        %[r0],        0x4000        \n\t"
-    "addiu          %[r1],        %[r1],        0x4000        \n\t"
-    "sra            %[r0],        %[r0],        15            \n\t"
-    "sra            %[r1],        %[r1],        15            \n\t"
-#endif  // #if defined(MIPS_DSP_R1_LE)
-    "addu           %[r0],        %[r2],        %[r0]         \n\t"
-    "addu           %[r1],        %[r3],        %[r1]         \n\t"
-    "sra            %[r2],        %[r0],        16            \n\t"
-    "andi           %[r0],        %[r0],        0xFFFF        \n\t"
-    "mul            %[r9],        %[r2],        %[r6]         \n\t"
-    "mul            %[r2],        %[r2],        %[r7]         \n\t"
-    "mul            %[r8],        %[r0],        %[r6]         \n\t"
-    "mul            %[r0],        %[r0],        %[r7]         \n\t"
-    "sra            %[r3],        %[r1],        16            \n\t"
-    "andi           %[r1],        %[r1],        0xFFFF        \n\t"
-    "sll            %[r9],        %[r9],        2             \n\t"
-    "sll            %[r2],        %[r2],        2             \n\t"
-#if defined(MIPS_DSP_R1_LE)
-    "shra_r.w       %[r8],        %[r8],        14            \n\t"
-    "shra_r.w       %[r0],        %[r0],        14            \n\t"
-#else  // #if defined(MIPS_DSP_R1_LE)
-    "addiu          %[r8],        %[r8],        0x2000        \n\t"
-    "addiu          %[r0],        %[r0],        0x2000        \n\t"
-    "sra            %[r8],        %[r8],        14            \n\t"
-    "sra            %[r0],        %[r0],        14            \n\t"
-#endif  // #if defined(MIPS_DSP_R1_LE)
-    "addu           %[r9],        %[r9],        %[r8]         \n\t"
-    "addu           %[r2],        %[r2],        %[r0]         \n\t"
-    "mul            %[r0],        %[r3],        %[r6]         \n\t"
-    "mul            %[r3],        %[r3],        %[r7]         \n\t"
-    "mul            %[r8],        %[r1],        %[r6]         \n\t"
-    "mul            %[r1],        %[r1],        %[r7]         \n\t"
-    "addiu          %[cosptr],    %[cosptr],    2             \n\t"
-    "addiu          %[sinptr],    %[sinptr],    2             \n\t"
-    "sll            %[r0],        %[r0],        2             \n\t"
-    "sll            %[r3],        %[r3],        2             \n\t"
-#if defined(MIPS_DSP_R1_LE)
-    "shra_r.w       %[r8],        %[r8],        14            \n\t"
-    "shra_r.w       %[r1],        %[r1],        14            \n\t"
-#else  // #if defined(MIPS_DSP_R1_LE)
-    "addiu          %[r8],        %[r8],        0x2000        \n\t"
-    "addiu          %[r1],        %[r1],        0x2000        \n\t"
-    "sra            %[r8],        %[r8],        14            \n\t"
-    "sra            %[r1],        %[r1],        14            \n\t"
-#endif  // #if defined(MIPS_DSP_R1_LE)
-    "addu           %[r0],        %[r0],        %[r8]         \n\t"
-    "addu           %[r3],        %[r3],        %[r1]         \n\t"
-    "subu           %[r9],        %[r9],        %[r3]         \n\t"
-    "addu           %[r0],        %[r0],        %[r2]         \n\t"
-    "sra            %[r1],        %[r9],        16            \n\t"
-    "andi           %[r9],        %[r9],        0xFFFF        \n\t"
-    "mul            %[r1],        %[r1],        %[r5]         \n\t"
-    "mul            %[r9],        %[r9],        %[r5]         \n\t"
-    "sra            %[r2],        %[r0],        16            \n\t"
-    "andi           %[r0],        %[r0],        0xFFFF        \n\t"
-    "mul            %[r2],        %[r2],        %[r5]         \n\t"
-    "mul            %[r0],        %[r0],        %[r5]         \n\t"
-    "sll            %[r1],        %[r1],        5             \n\t"
-#if defined(MIPS_DSP_R1_LE)
-    "shra_r.w       %[r9],        %[r9],        11            \n\t"
-#else  // #if defined(MIPS_DSP_R1_LE)
-    "addiu          %[r9],        %[r9],        0x400         \n\t"
-    "sra            %[r9],        %[r9],        11            \n\t"
-#endif  // #if defined(MIPS_DSP_R1_LE)
-    "addu           %[r1],        %[r1],        %[r9]         \n\t"
-    "sll            %[r2],        %[r2],        5             \n\t"
-#if defined(MIPS_DSP_R1_LE)
-    "shra_r.w       %[r0],        %[r0],        11            \n\t"
-#else  // #if defined(MIPS_DSP_R1_LE)
-    "addiu          %[r0],        %[r0],        0x400         \n\t"
-    "sra            %[r0],        %[r0],        11            \n\t"
-#endif  // #if defined(MIPS_DSP_R1_LE)
-    "addu           %[r0],        %[r0],        %[r2]         \n\t"
-    "sw             %[r1],        0(%[outre1])                \n\t"
-    "addiu          %[outre1],    %[outre1],    4             \n\t"
-    "sw             %[r0],        0(%[outre2])                \n\t"
-    "bgtz           %[k],         2b                          \n\t"
-    " addiu         %[outre2],    %[outre2],    4             \n\t"
-#endif  // #if defined(MIPS_DSP_R2_LE)
-   "3:                                                        \n\t"
-    ".set           pop                                       \n\t"
-    : [k] "+r" (k), [r0] "=&r" (r0), [r1] "=&r" (r1),
-      [r2] "=&r" (r2), [r3] "=&r" (r3), [r4] "=&r" (r4),
-      [r5] "=&r" (r5), [r6] "=&r" (r6), [r7] "=&r" (r7),
-      [r8] "=&r" (r8), [r9] "=&r" (r9), [max1] "=&r" (max1),
-      [inre] "=&r" (inre), [inim] "=&r" (inim),
-      [outre1] "=&r" (outre1), [outre2] "=&r" (outre2)
-    : [max] "r" (max), [inreQ7] "r" (inreQ7),
-      [inimQ7] "r" (inimQ7), [cosptr] "r" (cosptr),
-      [sinptr] "r" (sinptr), [outre1Q16] "r" (outre1Q16),
-      [outre2Q16] "r" (outre2Q16)
-    : "hi", "lo", "memory"
-#if defined(MIPS_DSP_R2_LE)
-    , "$ac1hi", "$ac1lo", "$ac2hi", "$ac2lo", "$ac3hi", "$ac3lo"
-#endif  // #if defined(MIPS_DSP_R2_LE)
-  );
-}
diff --git a/modules/audio_coding/codecs/isac/fix/source/transform_neon.c b/modules/audio_coding/codecs/isac/fix/source/transform_neon.c
deleted file mode 100644
index f0cbd5d..0000000
--- a/modules/audio_coding/codecs/isac/fix/source/transform_neon.c
+++ /dev/null
@@ -1,479 +0,0 @@
-/*
- *  Copyright (c) 2014 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 <arm_neon.h>
-
-#include "webrtc/modules/audio_coding/codecs/isac/fix/source/codec.h"
-#include "webrtc/modules/audio_coding/codecs/isac/fix/source/fft.h"
-#include "webrtc/modules/audio_coding/codecs/isac/fix/source/settings.h"
-
-// Tables are defined in transform_tables.c file.
-// Cosine table 1 in Q14.
-extern const int16_t WebRtcIsacfix_kCosTab1[FRAMESAMPLES/2];
-// Sine table 1 in Q14.
-extern const int16_t WebRtcIsacfix_kSinTab1[FRAMESAMPLES/2];
-// Sine table 2 in Q14.
-extern const int16_t WebRtcIsacfix_kSinTab2[FRAMESAMPLES/4];
-
-static inline int32_t ComplexMulAndFindMaxNeon(int16_t* inre1Q9,
-                                               int16_t* inre2Q9,
-                                               int32_t* outreQ16,
-                                               int32_t* outimQ16) {
-  int k;
-  const int16_t* kCosTab = &WebRtcIsacfix_kCosTab1[0];
-  const int16_t* kSinTab = &WebRtcIsacfix_kSinTab1[0];
-  // 0.5 / sqrt(240) in Q19 is round((.5 / sqrt(240)) * (2^19)) = 16921.
-  // Use "16921 << 5" and vqdmulh, instead of ">> 26" as in the C code.
-  int32_t fact  = 16921 << 5;
-  int32x4_t factq = vdupq_n_s32(fact);
-  uint32x4_t max_r = vdupq_n_u32(0);
-  uint32x4_t max_i = vdupq_n_u32(0);
-
-  for (k = 0; k < FRAMESAMPLES/2; k += 8) {
-    int16x8_t tmpr = vld1q_s16(kCosTab);
-    int16x8_t tmpi = vld1q_s16(kSinTab);
-    int16x8_t inre1 = vld1q_s16(inre1Q9);
-    int16x8_t inre2 = vld1q_s16(inre2Q9);
-    kCosTab += 8;
-    kSinTab += 8;
-    inre1Q9 += 8;
-    inre2Q9 += 8;
-
-    // Use ">> 26", instead of ">> 7", ">> 16" and then ">> 3" as in the C code.
-    int32x4_t tmp0 = vmull_s16(vget_low_s16(tmpr), vget_low_s16(inre1));
-    int32x4_t tmp1 = vmull_s16(vget_low_s16(tmpr), vget_low_s16(inre2));
-    tmp0 = vmlal_s16(tmp0, vget_low_s16(tmpi), vget_low_s16(inre2));
-    tmp1 = vmlsl_s16(tmp1, vget_low_s16(tmpi), vget_low_s16(inre1));
-#if defined(WEBRTC_ARCH_ARM64)
-    int32x4_t tmp2 = vmull_high_s16(tmpr, inre1);
-    int32x4_t tmp3 = vmull_high_s16(tmpr, inre2);
-    tmp2 = vmlal_high_s16(tmp2, tmpi, inre2);
-    tmp3 = vmlsl_high_s16(tmp3, tmpi, inre1);
-#else
-    int32x4_t tmp2 = vmull_s16(vget_high_s16(tmpr), vget_high_s16(inre1));
-    int32x4_t tmp3 = vmull_s16(vget_high_s16(tmpr), vget_high_s16(inre2));
-    tmp2 = vmlal_s16(tmp2, vget_high_s16(tmpi), vget_high_s16(inre2));
-    tmp3 = vmlsl_s16(tmp3, vget_high_s16(tmpi), vget_high_s16(inre1));
-#endif
-
-    int32x4_t outr_0 = vqdmulhq_s32(tmp0, factq);
-    int32x4_t outr_1 = vqdmulhq_s32(tmp2, factq);
-    int32x4_t outi_0 = vqdmulhq_s32(tmp1, factq);
-    int32x4_t outi_1 = vqdmulhq_s32(tmp3, factq);
-    vst1q_s32(outreQ16, outr_0);
-    outreQ16 += 4;
-    vst1q_s32(outreQ16, outr_1);
-    outreQ16 += 4;
-    vst1q_s32(outimQ16, outi_0);
-    outimQ16 += 4;
-    vst1q_s32(outimQ16, outi_1);
-    outimQ16 += 4;
-
-    // Find the absolute maximum in the vectors.
-    tmp0 = vabsq_s32(outr_0);
-    tmp1 = vabsq_s32(outr_1);
-    tmp2 = vabsq_s32(outi_0);
-    tmp3 = vabsq_s32(outi_1);
-    // vabs doesn't change the value of 0x80000000.
-    // Use u32 so we don't lose the value 0x80000000.
-    max_r = vmaxq_u32(max_r, vreinterpretq_u32_s32(tmp0));
-    max_i = vmaxq_u32(max_i, vreinterpretq_u32_s32(tmp2));
-    max_r = vmaxq_u32(max_r, vreinterpretq_u32_s32(tmp1));
-    max_i = vmaxq_u32(max_i, vreinterpretq_u32_s32(tmp3));
-  }
-
-  max_r = vmaxq_u32(max_r, max_i);
-#if defined(WEBRTC_ARCH_ARM64)
-  uint32_t maximum = vmaxvq_u32(max_r);
-#else
-  uint32x2_t max32x2_r = vmax_u32(vget_low_u32(max_r), vget_high_u32(max_r));
-  max32x2_r = vpmax_u32(max32x2_r, max32x2_r);
-  uint32_t maximum = vget_lane_u32(max32x2_r, 0);
-#endif
-
-  return (int32_t)maximum;
-}
-
-static inline void PreShiftW32toW16Neon(int32_t* inre,
-                                        int32_t* inim,
-                                        int16_t* outre,
-                                        int16_t* outim,
-                                        int32_t sh) {
-  int k;
-  int32x4_t sh32x4 = vdupq_n_s32(sh);
-  for (k = 0; k < FRAMESAMPLES/2; k += 16) {
-    int32x4x4_t inre32x4x4 = vld4q_s32(inre);
-    int32x4x4_t inim32x4x4 = vld4q_s32(inim);
-    inre += 16;
-    inim += 16;
-    inre32x4x4.val[0] = vrshlq_s32(inre32x4x4.val[0], sh32x4);
-    inre32x4x4.val[1] = vrshlq_s32(inre32x4x4.val[1], sh32x4);
-    inre32x4x4.val[2] = vrshlq_s32(inre32x4x4.val[2], sh32x4);
-    inre32x4x4.val[3] = vrshlq_s32(inre32x4x4.val[3], sh32x4);
-    inim32x4x4.val[0] = vrshlq_s32(inim32x4x4.val[0], sh32x4);
-    inim32x4x4.val[1] = vrshlq_s32(inim32x4x4.val[1], sh32x4);
-    inim32x4x4.val[2] = vrshlq_s32(inim32x4x4.val[2], sh32x4);
-    inim32x4x4.val[3] = vrshlq_s32(inim32x4x4.val[3], sh32x4);
-    int16x4x4_t outre16x4x4;
-    int16x4x4_t outim16x4x4;
-    outre16x4x4.val[0]  = vmovn_s32(inre32x4x4.val[0]);
-    outre16x4x4.val[1]  = vmovn_s32(inre32x4x4.val[1]);
-    outre16x4x4.val[2]  = vmovn_s32(inre32x4x4.val[2]);
-    outre16x4x4.val[3]  = vmovn_s32(inre32x4x4.val[3]);
-    outim16x4x4.val[0]  = vmovn_s32(inim32x4x4.val[0]);
-    outim16x4x4.val[1]  = vmovn_s32(inim32x4x4.val[1]);
-    outim16x4x4.val[2]  = vmovn_s32(inim32x4x4.val[2]);
-    outim16x4x4.val[3]  = vmovn_s32(inim32x4x4.val[3]);
-    vst4_s16(outre, outre16x4x4);
-    vst4_s16(outim, outim16x4x4);
-    outre += 16;
-    outim += 16;
-  }
-}
-
-static inline void PostShiftAndSeparateNeon(int16_t* inre,
-                                            int16_t* inim,
-                                            int16_t* outre,
-                                            int16_t* outim,
-                                            int32_t sh) {
-  int k;
-  int16_t* inre1 = inre;
-  int16_t* inre2 = &inre[FRAMESAMPLES/2 - 4];
-  int16_t* inim1 = inim;
-  int16_t* inim2 = &inim[FRAMESAMPLES/2 - 4];
-  int16_t* outre1 = outre;
-  int16_t* outre2 = &outre[FRAMESAMPLES/2 - 4];
-  int16_t* outim1 = outim;
-  int16_t* outim2 = &outim[FRAMESAMPLES/2 - 4];
-  const int16_t* kSinTab1 = &WebRtcIsacfix_kSinTab2[0];
-  const int16_t* kSinTab2 = &WebRtcIsacfix_kSinTab2[FRAMESAMPLES/4 -4];
-  // By vshl, we effectively did "<< (-sh - 23)", instead of "<< (-sh)",
-  // ">> 14" and then ">> 9" as in the C code.
-  int32x4_t shift = vdupq_n_s32(-sh - 23);
-
-  for (k = 0; k < FRAMESAMPLES/4; k += 4) {
-    int16x4_t tmpi = vld1_s16(kSinTab1);
-    kSinTab1 += 4;
-    int16x4_t tmpr = vld1_s16(kSinTab2);
-    kSinTab2 -= 4;
-    int16x4_t inre_0 = vld1_s16(inre1);
-    inre1 += 4;
-    int16x4_t inre_1 = vld1_s16(inre2);
-    inre2 -= 4;
-    int16x4_t inim_0 = vld1_s16(inim1);
-    inim1 += 4;
-    int16x4_t inim_1 = vld1_s16(inim2);
-    inim2 -= 4;
-    tmpr = vneg_s16(tmpr);
-    inre_1 = vrev64_s16(inre_1);
-    inim_1 = vrev64_s16(inim_1);
-    tmpr = vrev64_s16(tmpr);
-
-    int16x4_t xr = vqadd_s16(inre_0, inre_1);
-    int16x4_t xi = vqsub_s16(inim_0, inim_1);
-    int16x4_t yr = vqadd_s16(inim_0, inim_1);
-    int16x4_t yi = vqsub_s16(inre_1, inre_0);
-
-    int32x4_t outr0 = vmull_s16(tmpr, xr);
-    int32x4_t outi0 = vmull_s16(tmpi, xr);
-    int32x4_t outr1 = vmull_s16(tmpi, yr);
-    int32x4_t outi1 = vmull_s16(tmpi, yi);
-    outr0 = vmlsl_s16(outr0, tmpi, xi);
-    outi0 = vmlal_s16(outi0, tmpr, xi);
-    outr1 = vmlal_s16(outr1, tmpr, yi);
-    outi1 = vmlsl_s16(outi1, tmpr, yr);
-
-    outr0 = vshlq_s32(outr0, shift);
-    outi0 = vshlq_s32(outi0, shift);
-    outr1 = vshlq_s32(outr1, shift);
-    outi1 = vshlq_s32(outi1, shift);
-    outr1 = vnegq_s32(outr1);
-
-    int16x4_t outre_0  = vmovn_s32(outr0);
-    int16x4_t outim_0  = vmovn_s32(outi0);
-    int16x4_t outre_1  = vmovn_s32(outr1);
-    int16x4_t outim_1  = vmovn_s32(outi1);
-    outre_1 = vrev64_s16(outre_1);
-    outim_1 = vrev64_s16(outim_1);
-
-    vst1_s16(outre1, outre_0);
-    outre1 += 4;
-    vst1_s16(outim1, outim_0);
-    outim1 += 4;
-    vst1_s16(outre2, outre_1);
-    outre2 -= 4;
-    vst1_s16(outim2, outim_1);
-    outim2 -= 4;
-  }
-}
-
-void WebRtcIsacfix_Time2SpecNeon(int16_t* inre1Q9,
-                                 int16_t* inre2Q9,
-                                 int16_t* outreQ7,
-                                 int16_t* outimQ7) {
-  int32_t tmpreQ16[FRAMESAMPLES/2], tmpimQ16[FRAMESAMPLES/2];
-  int32_t max;
-  int32_t sh;
-
-  // Multiply with complex exponentials and combine into one complex vector.
-  // And find the maximum.
-  max = ComplexMulAndFindMaxNeon(inre1Q9, inre2Q9, tmpreQ16, tmpimQ16);
-
-  sh = (int32_t)WebRtcSpl_NormW32(max);
-  sh = sh - 24;
-
-  // If sh becomes >= 0, then we should shift sh steps to the left,
-  // and the domain will become Q(16 + sh).
-  // If sh becomes < 0, then we should shift -sh steps to the right,
-  // and the domain will become Q(16 + sh).
-  PreShiftW32toW16Neon(tmpreQ16, tmpimQ16, inre1Q9, inre2Q9, sh);
-
-  // Get DFT.
-  WebRtcIsacfix_FftRadix16Fastest(inre1Q9, inre2Q9, -1);
-
-  // If sh >= 0, shift sh steps to the right,
-  // If sh < 0, shift -sh steps to the left.
-  // Use symmetry to separate into two complex vectors
-  // and center frames in time around zero.
-  PostShiftAndSeparateNeon(inre1Q9, inre2Q9, outreQ7, outimQ7, sh);
-}
-
-static inline int32_t TransformAndFindMaxNeon(int16_t* inre,
-                                              int16_t* inim,
-                                              int32_t* outre,
-                                              int32_t* outim) {
-  int k;
-  int16_t* inre1 = inre;
-  int16_t* inre2 = &inre[FRAMESAMPLES/2 - 4];
-  int16_t* inim1 = inim;
-  int16_t* inim2 = &inim[FRAMESAMPLES/2 - 4];
-  int32_t* outre1 = outre;
-  int32_t* outre2 = &outre[FRAMESAMPLES/2 - 4];
-  int32_t* outim1 = outim;
-  int32_t* outim2 = &outim[FRAMESAMPLES/2 - 4];
-  const int16_t* kSinTab1 = &WebRtcIsacfix_kSinTab2[0];
-  const int16_t* kSinTab2 = &WebRtcIsacfix_kSinTab2[FRAMESAMPLES/4 - 4];
-  uint32x4_t max_r = vdupq_n_u32(0);
-  uint32x4_t max_i = vdupq_n_u32(0);
-
-  // Use ">> 5", instead of "<< 9" and then ">> 14" as in the C code.
-  for (k = 0; k < FRAMESAMPLES/4; k += 4) {
-    int16x4_t tmpi = vld1_s16(kSinTab1);
-    kSinTab1 += 4;
-    int16x4_t tmpr = vld1_s16(kSinTab2);
-    kSinTab2 -= 4;
-    int16x4_t inre_0 = vld1_s16(inre1);
-    inre1 += 4;
-    int16x4_t inre_1 = vld1_s16(inre2);
-    inre2 -= 4;
-    int16x4_t inim_0 = vld1_s16(inim1);
-    inim1 += 4;
-    int16x4_t inim_1 = vld1_s16(inim2);
-    inim2 -= 4;
-    tmpr = vneg_s16(tmpr);
-    inre_1 = vrev64_s16(inre_1);
-    inim_1 = vrev64_s16(inim_1);
-    tmpr = vrev64_s16(tmpr);
-
-    int32x4_t xr = vmull_s16(tmpr, inre_0);
-    int32x4_t xi = vmull_s16(tmpr, inim_0);
-    int32x4_t yr = vmull_s16(tmpr, inim_1);
-    int32x4_t yi = vmull_s16(tmpi, inim_1);
-    xr = vmlal_s16(xr, tmpi, inim_0);
-    xi = vmlsl_s16(xi, tmpi, inre_0);
-    yr = vmlal_s16(yr, tmpi, inre_1);
-    yi = vmlsl_s16(yi, tmpr, inre_1);
-    yr = vnegq_s32(yr);
-
-    xr = vshrq_n_s32(xr, 5);
-    xi = vshrq_n_s32(xi, 5);
-    yr = vshrq_n_s32(yr, 5);
-    yi = vshrq_n_s32(yi, 5);
-
-    int32x4_t outr0 = vsubq_s32(xr, yi);
-    int32x4_t outr1 = vaddq_s32(xr, yi);
-    int32x4_t outi0 = vaddq_s32(xi, yr);
-    int32x4_t outi1 = vsubq_s32(yr, xi);
-
-    // Find the absolute maximum in the vectors.
-    int32x4_t tmp0 = vabsq_s32(outr0);
-    int32x4_t tmp1 = vabsq_s32(outr1);
-    int32x4_t tmp2 = vabsq_s32(outi0);
-    int32x4_t tmp3 = vabsq_s32(outi1);
-    // vabs doesn't change the value of 0x80000000.
-    // Use u32 so we don't lose the value 0x80000000.
-    max_r = vmaxq_u32(max_r, vreinterpretq_u32_s32(tmp0));
-    max_i = vmaxq_u32(max_i, vreinterpretq_u32_s32(tmp2));
-    max_r = vmaxq_u32(max_r, vreinterpretq_u32_s32(tmp1));
-    max_i = vmaxq_u32(max_i, vreinterpretq_u32_s32(tmp3));
-
-    // Store the vectors.
-    outr1 = vrev64q_s32(outr1);
-    outi1 = vrev64q_s32(outi1);
-    int32x4_t outr_1 = vcombine_s32(vget_high_s32(outr1), vget_low_s32(outr1));
-    int32x4_t outi_1 = vcombine_s32(vget_high_s32(outi1), vget_low_s32(outi1));
-
-    vst1q_s32(outre1, outr0);
-    outre1 += 4;
-    vst1q_s32(outim1, outi0);
-    outim1 += 4;
-    vst1q_s32(outre2, outr_1);
-    outre2 -= 4;
-    vst1q_s32(outim2, outi_1);
-    outim2 -= 4;
-  }
-
-  max_r = vmaxq_u32(max_r, max_i);
-#if defined(WEBRTC_ARCH_ARM64)
-  uint32_t maximum = vmaxvq_u32(max_r);
-#else
-  uint32x2_t max32x2_r = vmax_u32(vget_low_u32(max_r), vget_high_u32(max_r));
-  max32x2_r = vpmax_u32(max32x2_r, max32x2_r);
-  uint32_t maximum = vget_lane_u32(max32x2_r, 0);
-#endif
-
-  return (int32_t)maximum;
-}
-
-static inline void PostShiftAndDivideAndDemodulateNeon(int16_t* inre,
-                                                       int16_t* inim,
-                                                       int32_t* outre1,
-                                                       int32_t* outre2,
-                                                       int32_t sh) {
-  int k;
-  int16_t* p_inre = inre;
-  int16_t* p_inim = inim;
-  int32_t* p_outre1 = outre1;
-  int32_t* p_outre2 = outre2;
-  const int16_t* kCosTab = &WebRtcIsacfix_kCosTab1[0];
-  const int16_t* kSinTab = &WebRtcIsacfix_kSinTab1[0];
-  int32x4_t shift = vdupq_n_s32(-sh - 16);
-  // Divide through by the normalizing constant:
-  // scale all values with 1/240, i.e. with 273 in Q16.
-  // 273/65536 ~= 0.0041656
-  // 1/240 ~= 0.0041666
-  int16x8_t scale = vdupq_n_s16(273);
-  // Sqrt(240) in Q11 is round(15.49193338482967 * 2048) = 31727.
-  int factQ19 = 31727 << 16;
-  int32x4_t fact = vdupq_n_s32(factQ19);
-
-  for (k = 0; k < FRAMESAMPLES/2; k += 8) {
-    int16x8_t inre16x8 = vld1q_s16(p_inre);
-    int16x8_t inim16x8 = vld1q_s16(p_inim);
-    p_inre += 8;
-    p_inim += 8;
-    int16x8_t tmpr = vld1q_s16(kCosTab);
-    int16x8_t tmpi = vld1q_s16(kSinTab);
-    kCosTab += 8;
-    kSinTab += 8;
-    // By vshl and vmull, we effectively did "<< (-sh - 16)",
-    // instead of "<< (-sh)" and ">> 16" as in the C code.
-    int32x4_t outre1_0 = vmull_s16(vget_low_s16(inre16x8), vget_low_s16(scale));
-    int32x4_t outre2_0 = vmull_s16(vget_low_s16(inim16x8), vget_low_s16(scale));
-#if defined(WEBRTC_ARCH_ARM64)
-    int32x4_t outre1_1 = vmull_high_s16(inre16x8, scale);
-    int32x4_t outre2_1 = vmull_high_s16(inim16x8, scale);
-#else
-    int32x4_t outre1_1 = vmull_s16(vget_high_s16(inre16x8),
-                                   vget_high_s16(scale));
-    int32x4_t outre2_1 = vmull_s16(vget_high_s16(inim16x8),
-                                   vget_high_s16(scale));
-#endif
-
-    outre1_0 = vshlq_s32(outre1_0, shift);
-    outre1_1 = vshlq_s32(outre1_1, shift);
-    outre2_0 = vshlq_s32(outre2_0, shift);
-    outre2_1 = vshlq_s32(outre2_1, shift);
-
-    // Demodulate and separate.
-    int32x4_t tmpr_0 = vmovl_s16(vget_low_s16(tmpr));
-    int32x4_t tmpi_0 = vmovl_s16(vget_low_s16(tmpi));
-#if defined(WEBRTC_ARCH_ARM64)
-    int32x4_t tmpr_1 = vmovl_high_s16(tmpr);
-    int32x4_t tmpi_1 = vmovl_high_s16(tmpi);
-#else
-    int32x4_t tmpr_1 = vmovl_s16(vget_high_s16(tmpr));
-    int32x4_t tmpi_1 = vmovl_s16(vget_high_s16(tmpi));
-#endif
-
-    int64x2_t xr0 = vmull_s32(vget_low_s32(tmpr_0), vget_low_s32(outre1_0));
-    int64x2_t xi0 = vmull_s32(vget_low_s32(tmpr_0), vget_low_s32(outre2_0));
-    int64x2_t xr2 = vmull_s32(vget_low_s32(tmpr_1), vget_low_s32(outre1_1));
-    int64x2_t xi2 = vmull_s32(vget_low_s32(tmpr_1), vget_low_s32(outre2_1));
-    xr0 = vmlsl_s32(xr0, vget_low_s32(tmpi_0), vget_low_s32(outre2_0));
-    xi0 = vmlal_s32(xi0, vget_low_s32(tmpi_0), vget_low_s32(outre1_0));
-    xr2 = vmlsl_s32(xr2, vget_low_s32(tmpi_1), vget_low_s32(outre2_1));
-    xi2 = vmlal_s32(xi2, vget_low_s32(tmpi_1), vget_low_s32(outre1_1));
-
-#if defined(WEBRTC_ARCH_ARM64)
-    int64x2_t xr1 = vmull_high_s32(tmpr_0, outre1_0);
-    int64x2_t xi1 = vmull_high_s32(tmpr_0, outre2_0);
-    int64x2_t xr3 = vmull_high_s32(tmpr_1, outre1_1);
-    int64x2_t xi3 = vmull_high_s32(tmpr_1, outre2_1);
-    xr1 = vmlsl_high_s32(xr1, tmpi_0, outre2_0);
-    xi1 = vmlal_high_s32(xi1, tmpi_0, outre1_0);
-    xr3 = vmlsl_high_s32(xr3, tmpi_1, outre2_1);
-    xi3 = vmlal_high_s32(xi3, tmpi_1, outre1_1);
-#else
-    int64x2_t xr1 = vmull_s32(vget_high_s32(tmpr_0), vget_high_s32(outre1_0));
-    int64x2_t xi1 = vmull_s32(vget_high_s32(tmpr_0), vget_high_s32(outre2_0));
-    int64x2_t xr3 = vmull_s32(vget_high_s32(tmpr_1), vget_high_s32(outre1_1));
-    int64x2_t xi3 = vmull_s32(vget_high_s32(tmpr_1), vget_high_s32(outre2_1));
-    xr1 = vmlsl_s32(xr1, vget_high_s32(tmpi_0), vget_high_s32(outre2_0));
-    xi1 = vmlal_s32(xi1, vget_high_s32(tmpi_0), vget_high_s32(outre1_0));
-    xr3 = vmlsl_s32(xr3, vget_high_s32(tmpi_1), vget_high_s32(outre2_1));
-    xi3 = vmlal_s32(xi3, vget_high_s32(tmpi_1), vget_high_s32(outre1_1));
-#endif
-
-    outre1_0 = vcombine_s32(vrshrn_n_s64(xr0, 10), vrshrn_n_s64(xr1, 10));
-    outre2_0 = vcombine_s32(vrshrn_n_s64(xi0, 10), vrshrn_n_s64(xi1, 10));
-    outre1_1 = vcombine_s32(vrshrn_n_s64(xr2, 10), vrshrn_n_s64(xr3, 10));
-    outre2_1 = vcombine_s32(vrshrn_n_s64(xi2, 10), vrshrn_n_s64(xi3, 10));
-    outre1_0 = vqdmulhq_s32(outre1_0, fact);
-    outre2_0 = vqdmulhq_s32(outre2_0, fact);
-    outre1_1 = vqdmulhq_s32(outre1_1, fact);
-    outre2_1 = vqdmulhq_s32(outre2_1, fact);
-
-    vst1q_s32(p_outre1, outre1_0);
-    p_outre1 += 4;
-    vst1q_s32(p_outre1, outre1_1);
-    p_outre1 += 4;
-    vst1q_s32(p_outre2, outre2_0);
-    p_outre2 += 4;
-    vst1q_s32(p_outre2, outre2_1);
-    p_outre2 += 4;
-  }
-}
-
-void WebRtcIsacfix_Spec2TimeNeon(int16_t* inreQ7,
-                                 int16_t* inimQ7,
-                                 int32_t* outre1Q16,
-                                 int32_t* outre2Q16) {
-  int32_t max;
-  int32_t sh;
-
-  max = TransformAndFindMaxNeon(inreQ7, inimQ7, outre1Q16, outre2Q16);
-
-
-  sh = (int32_t)WebRtcSpl_NormW32(max);
-  sh = sh - 24;
-  // If sh becomes >= 0, then we should shift sh steps to the left,
-  // and the domain will become Q(16 + sh).
-  // If sh becomes < 0, then we should shift -sh steps to the right,
-  // and the domain will become Q(16 + sh).
-
-  // "Fastest" vectors.
-  PreShiftW32toW16Neon(outre1Q16, outre2Q16, inreQ7, inimQ7, sh);
-
-  // Get IDFT.
-  WebRtcIsacfix_FftRadix16Fastest(inreQ7, inimQ7, 1);
-
-  PostShiftAndDivideAndDemodulateNeon(inreQ7, inimQ7, outre1Q16, outre2Q16, sh);
-}
diff --git a/modules/audio_coding/codecs/isac/fix/source/transform_tables.c b/modules/audio_coding/codecs/isac/fix/source/transform_tables.c
deleted file mode 100644
index 8f89fb8..0000000
--- a/modules/audio_coding/codecs/isac/fix/source/transform_tables.c
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- *  Copyright (c) 2014 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.
- */
-
-/*
- * This file contains trigonometric functions look-up tables used in
- * transform functions WebRtcIsacfix_Time2Spec and WebRtcIsacfix_Spec2Time.
- */
-
-#include "webrtc/modules/audio_coding/codecs/isac/fix/source/settings.h"
-#include "webrtc/typedefs.h"
-
-/* Cosine table 1 in Q14. */
-const int16_t WebRtcIsacfix_kCosTab1[FRAMESAMPLES/2] = {
-  16384,  16383,  16378,  16371,  16362,  16349,  16333,  16315,  16294,  16270,
-  16244,  16214,  16182,  16147,  16110,  16069,  16026,  15980,  15931,  15880,
-  15826,  15769,  15709,  15647,  15582,  15515,  15444,  15371,  15296,  15218,
-  15137,  15053,  14968,  14879,  14788,  14694,  14598,  14500,  14399,  14295,
-  14189,  14081,  13970,  13856,  13741,  13623,  13502,  13380,  13255,  13128,
-  12998,  12867,  12733,  12597,  12458,  12318,  12176,  12031,  11885,  11736,
-  11585,  11433,  11278,  11121,  10963,  10803,  10641,  10477,  10311,  10143,
-  9974,   9803,   9630,   9456,   9280,   9102,   8923,   8743,   8561,   8377,
-  8192,   8006,   7818,   7629,   7438,   7246,   7053,   6859,   6664,   6467,
-  6270,   6071,   5872,   5671,   5469,   5266,   5063,   4859,   4653,   4447,
-  4240,   4033,   3825,   3616,   3406,   3196,   2986,   2775,   2563,   2351,
-  2139,   1926,   1713,   1499,   1285,   1072,    857,    643,    429,    214,
-  0,   -214,   -429,   -643,   -857,  -1072,  -1285,  -1499,  -1713,  -1926,
-  -2139,  -2351,  -2563,  -2775,  -2986,  -3196,  -3406,  -3616,  -3825,  -4033,
-  -4240,  -4447,  -4653,  -4859,  -5063,  -5266,  -5469,  -5671,  -5872,  -6071,
-  -6270,  -6467,  -6664,  -6859,  -7053,  -7246,  -7438,  -7629,  -7818,  -8006,
-  -8192,  -8377,  -8561,  -8743,  -8923,  -9102,  -9280,  -9456,  -9630,  -9803,
-  -9974, -10143, -10311, -10477, -10641, -10803, -10963, -11121, -11278, -11433,
-  -11585, -11736, -11885, -12031, -12176, -12318, -12458, -12597, -12733,
-  -12867, -12998, -13128, -13255, -13380, -13502, -13623, -13741, -13856,
-  -13970, -14081, -14189, -14295, -14399, -14500, -14598, -14694, -14788,
-  -14879, -14968, -15053, -15137, -15218, -15296, -15371, -15444, -15515,
-  -15582, -15647, -15709, -15769, -15826, -15880, -15931, -15980, -16026,
-  -16069, -16110, -16147, -16182, -16214, -16244, -16270, -16294, -16315,
-  -16333, -16349, -16362, -16371, -16378, -16383
-};
-
-/* Sine table 1 in Q14. */
-const int16_t WebRtcIsacfix_kSinTab1[FRAMESAMPLES/2] = {
-  0,   214,   429,   643,   857,  1072,  1285,  1499,  1713,  1926,
-  2139,  2351,  2563,  2775,  2986,  3196,  3406,  3616,  3825,  4033,
-  4240,  4447,  4653,  4859,  5063,  5266,  5469,  5671,  5872,  6071,
-  6270,  6467,  6664,  6859,  7053,  7246,  7438,  7629,  7818,  8006,
-  8192,  8377,  8561,  8743,  8923,  9102,  9280,  9456,  9630,  9803,
-  9974, 10143, 10311, 10477, 10641, 10803, 10963, 11121, 11278, 11433,
-  11585, 11736, 11885, 12031, 12176, 12318, 12458, 12597, 12733, 12867,
-  12998, 13128, 13255, 13380, 13502, 13623, 13741, 13856, 13970, 14081,
-  14189, 14295, 14399, 14500, 14598, 14694, 14788, 14879, 14968, 15053,
-  15137, 15218, 15296, 15371, 15444, 15515, 15582, 15647, 15709, 15769,
-  15826, 15880, 15931, 15980, 16026, 16069, 16110, 16147, 16182, 16214,
-  16244, 16270, 16294, 16315, 16333, 16349, 16362, 16371, 16378, 16383,
-  16384, 16383, 16378, 16371, 16362, 16349, 16333, 16315, 16294, 16270,
-  16244, 16214, 16182, 16147, 16110, 16069, 16026, 15980, 15931, 15880,
-  15826, 15769, 15709, 15647, 15582, 15515, 15444, 15371, 15296, 15218,
-  15137, 15053, 14968, 14879, 14788, 14694, 14598, 14500, 14399, 14295,
-  14189, 14081, 13970, 13856, 13741, 13623, 13502, 13380, 13255, 13128,
-  12998, 12867, 12733, 12597, 12458, 12318, 12176, 12031, 11885, 11736,
-  11585, 11433, 11278, 11121, 10963, 10803, 10641, 10477, 10311, 10143,
-  9974,  9803,  9630,  9456,  9280,  9102,  8923,  8743,  8561,  8377,
-  8192,  8006,  7818,  7629,  7438,  7246,  7053,  6859,  6664,  6467,
-  6270,  6071,  5872,  5671,  5469,  5266,  5063,  4859,  4653,  4447,
-  4240,  4033,  3825,  3616,  3406,  3196,  2986,  2775,  2563,  2351,
-  2139,  1926,  1713,  1499,  1285,  1072,   857,   643,   429,   214
-};
-
-
-/* Sine table 2 in Q14. */
-const int16_t WebRtcIsacfix_kSinTab2[FRAMESAMPLES/4] = {
-  16384, -16381, 16375, -16367, 16356, -16342, 16325, -16305, 16283, -16257,
-  16229, -16199, 16165, -16129, 16090, -16048, 16003, -15956, 15906, -15853,
-  15798, -15739, 15679, -15615, 15549, -15480, 15408, -15334, 15257, -15178,
-  15095, -15011, 14924, -14834, 14741, -14647, 14549, -14449, 14347, -14242,
-  14135, -14025, 13913, -13799, 13682, -13563, 13441, -13318, 13192, -13063,
-  12933, -12800, 12665, -12528, 12389, -12247, 12104, -11958, 11810, -11661,
-  11509, -11356, 11200, -11042, 10883, -10722, 10559, -10394, 10227, -10059,
-  9889,  -9717,  9543,  -9368,  9191,  -9013,  8833,  -8652,  8469,  -8285,
-  8099,  -7912,  7723,  -7534,  7342,  -7150,  6957,  -6762,  6566,  -6369,
-  6171,  -5971,  5771,  -5570,  5368,  -5165,  4961,  -4756,  4550,  -4344,
-  4137,  -3929,  3720,  -3511,  3301,  -3091,  2880,  -2669,  2457,  -2245,
-  2032,  -1819,  1606,  -1392,  1179,   -965,   750,   -536,   322,   -107
-};
-
-#if defined(MIPS32_LE)
-/* Cosine table 2 in Q14. Used only on MIPS platforms. */
-const int16_t WebRtcIsacfix_kCosTab2[FRAMESAMPLES/4] = {
-  107,   -322,   536,   -750,   965,  -1179,  1392,  -1606,  1819,  -2032,
-  2245,  -2457,  2669,  -2880,  3091,  -3301,  3511,  -3720,  3929,  -4137,
-  4344,  -4550,  4756,  -4961,  5165,  -5368,  5570,  -5771,  5971,  -6171,
-  6369,  -6566,  6762,  -6957,  7150,  -7342,  7534,  -7723,  7912,  -8099,
-  8285,  -8469,  8652,  -8833,  9013,  -9191,  9368,  -9543,  9717,  -9889,
-  10059, -10227, 10394, -10559, 10722, -10883, 11042, -11200, 11356, -11509,
-  11661, -11810, 11958, -12104, 12247, -12389, 12528, -12665, 12800, -12933,
-  13063, -13192, 13318, -13441, 13563, -13682, 13799, -13913, 14025, -14135,
-  14242, -14347, 14449, -14549, 14647, -14741, 14834, -14924, 15011, -15095,
-  15178, -15257, 15334, -15408, 15480, -15549, 15615, -15679, 15739, -15798,
-  15853, -15906, 15956, -16003, 16048, -16090, 16129, -16165, 16199, -16229,
-  16257, -16283, 16305, -16325, 16342, -16356, 16367, -16375, 16381, -16384
-};
-#endif
diff --git a/modules/audio_coding/codecs/isac/fix/source/transform_unittest.cc b/modules/audio_coding/codecs/isac/fix/source/transform_unittest.cc
deleted file mode 100644
index 35e5800..0000000
--- a/modules/audio_coding/codecs/isac/fix/source/transform_unittest.cc
+++ /dev/null
@@ -1,193 +0,0 @@
-/*
- *  Copyright (c) 2012 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/codecs/isac/fix/source/codec.h"
-#include "webrtc/system_wrappers/include/cpu_features_wrapper.h"
-#include "webrtc/test/gtest.h"
-
-static const int kSamples = FRAMESAMPLES/2;
-static const int32_t spec2time_out_expected_1[kSamples] = {
-  -3366470, -2285227,
-  -3415765, -2310215, -3118030, -2222470, -3030254, -2192091, -3423170,
-  -2216041, -3305541, -2171936, -3195767, -2095779, -3153304, -2157560,
-  -3071167, -2032108, -3101190, -1972016, -3103824, -2089118, -3139811,
-  -1898337, -3102801, -2055082, -3029665, -1854140, -2962586, -1966454,
-  -3071167, -1894588, -2851743, -1917315, -2848087, -1594932, -2799242,
-  -1462184, -2845887, -1437599, -2691776, -1329637, -2770659, -1268491,
-  -2625161, -1578991, -2460299, -1186385, -2365613, -1039354, -2322608,
-  -958518, -2271749, -789860, -2254538, -850308, -2384436, -850959, -2133734,
-  -587678, -2093316, -495115, -1973364, -475177, -1801282, -173507,
-  -1848516, -158015, -1792018, -62648, -1643313, 214746, -1500758, 267077,
-  -1450193, 560521, -1521579, 675283, -1345408, 857559, -1300822, 1116332,
-  -1294533, 1241117, -1070027, 1263503, -983816, 1529821, -1019586,
-  1910421, -955420, 2073688, -836459, 2401105, -653905, 2690474, -731425,
-  2930131, -935234, 3299500, -875978, 3523432, -878906, 3924822, -1081630,
-  4561267, -1203023, 5105274, -1510983, 6052762, -2294646, 7021597,
-  -3108053, 8826736, -4935222, 11678789, -8442713, 18725700, -21526692,
-  25420577, 19589811, -28108666, 12634054, -14483066, 6263217, -9979706,
-  3665661, -7909736, 2531530, -6434896, 1700772, -5525393, 1479473,
-  -4894262, 1231760, -4353044, 1032940, -3786590, 941152, -3331614,
-  665090, -2851619, 830696, -2762201, 958007, -2483118, 788233, -2184965,
-  804825, -1967306, 1007255, -1862474, 920889, -1457506, 755406, -1405841,
-  890230, -1302124, 1161599, -701867, 1154163, -1083366, 1204743, -513581,
-  1547264, -650636, 1493384, -285543, 1771863, -277906, 1841343, -9078,
-  1751863, 230222, 1819578, 207170, 1978972, 398137, 2106468, 552155,
-  1997624, 685213, 2129520, 601078, 2238736, 944591, 2441879, 1194178,
-  2355280, 986124, 2393328, 1049005, 2417944, 1208368, 2489516, 1352023,
-  2572118, 1445283, 2856081, 1532997, 2742279, 1615877, 2915274, 1808036,
-  2856871, 1806936, 3241747, 1622461, 2978558, 1841297, 3010378, 1923666,
-  3271367, 2126700, 3070935, 1956958, 3107588, 2128405, 3288872, 2114911,
-  3315952, 2406651, 3344038, 2370199, 3368980, 2144361, 3305030, 2183803,
-  3401450, 2523102, 3405463, 2452475, 3463355, 2421678, 3551968, 2431949,
-  3477251, 2148125, 3244489, 2174090};
-static const int32_t spec2time_out_expected_2[kSamples] = {
-  1691694, -2499988, -2035547,
-  1060469, 988634, -2044502, -306271, 2041000, 201454, -2289456, 93694,
-  2129427, -369152, -1887834, 860796, 2089102, -929424, -1673956, 1395291,
-  1785651, -1619673, -1380109, 1963449, 1093311, -2111007, -840456,
-  2372786, 578119, -2242702, 89774, 2463304, -132717, -2121480, 643634,
-  2277636, -1125999, -1995858, 1543748, 2227861, -1483779, -1495491,
-  2102642, 1833876, -1920568, -958378, 2485101, 772261, -2454257, -24942,
-  2918714, 136838, -2500453, 816118, 3039735, -746560, -2365815, 1586396,
-  2714951, -1511696, -1942334, 2571792, 2182827, -2325335, -1311543,
-  3055970, 1367220, -2737182, -110626, 3889222, 631008, -3280879, 853066,
-  4122279, -706638, -3334449, 2148311, 3993512, -1846301, -3004894,
-  3426779, 3329522, -3165264, -2242423, 4756866, 2557711, -4131280,
-  -805259, 5702711, 1120592, -4852821, 743664, 6476444, -621186, -5465828,
-  2815787, 6768835, -3017442, -5338409, 5658126, 6838454, -5492288,
-  -4682382, 8874947, 6153814, -8832561, -2649251, 12817398, 4237692,
-  -13000247, 1190661, 18986363, -115738, -19693978, 9908367, 30660381,
-  -10632635, -37962068, 47022884, 89744622, -42087632, 40279224,
-  -88869341, -47542383, 38572364, 10441576, -30339718, -9926740, 19896578,
-  28009, -18886612, -1124047, 13232498, -4150304, -12770551, 2637074,
-  9051831, -6162211, -8713972, 4557937, 5489716, -6862312, -5532349,
-  5415449, 2791310, -6999367, -2790102, 5375806, 546222, -6486452,
-  -821261, 4994973, -1278840, -5645501, 1060484, 3996285, -2503954,
-  -4653629, 2220549, 3036977, -3282133, -3318585, 2780636, 1789880,
-  -4004589, -2041031, 3105373, 574819, -3992722, -971004, 3001703,
-  -676739, -3841508, 417284, 2897970, -1427018, -3058480, 1189948,
-  2210960, -2268992, -2603272, 1949785, 1576172, -2720404, -1891738,
-  2309456, 769178, -2975646, -707150, 2424652, -88039, -2966660, -65452,
-  2320780, -957557, -2798978, 744640, 1879794, -1672081, -2365319,
-  1253309, 1366383, -2204082, -1544367, 1801452, 613828, -2531994,
-  -983847, 2064842, 118326, -2613790, -203220, 2219635, -730341, -2641861,
-  563557, 1765434, -1329916, -2272927, 1037138, 1266725, -1939220,
-  -1588643, 1754528, 816552, -2376303, -1099167, 1864999, 122477,
-  -2422762, -400027, 1889228, -579916, -2490353, 287139, 2011318,
-  -1176657, -2502978, 812896, 1116502, -1940211};
-static const int16_t time2spec_out_expected_1[kSamples] = {
-  20342, 23889, -10063, -9419,
-  3242, 7280, -2012, -5029, 332, 4478, -97, -3244, -891, 3117, 773, -2204,
-  -1335, 2009, 1236, -1469, -1562, 1277, 1366, -815, -1619, 599, 1449, -177,
-  -1507, 116, 1294, 263, -1338, -244, 1059, 553, -1045, -549, 829, 826,
-  -731, -755, 516, 909, -427, -853, 189, 1004, -184, -828, -108, 888, 72,
-  -700, -280, 717, 342, -611, -534, 601, 534, -374, -646, 399, 567, -171,
-  -720, 234, 645, -11, -712, -26, 593, 215, -643, -172, 536, 361, -527,
-  -403, 388, 550, -361, -480, 208, 623, -206, -585, 41, 578, 12, -504,
-  -182, 583, 218, -437, -339, 499, 263, -354, -450, 347, 456, -193, -524,
-  212, 475, -74, -566, 94, 511, 112, -577, -201, 408, 217, -546, -295, 338,
-  387, -13, 4, -46, 2, -76, 103, -83, 108, -55, 100, -150, 131, -156, 141,
-  -171, 179, -190, 128, -227, 172, -214, 215, -189, 265, -244, 322, -335,
-  337, -352, 358, -368, 362, -355, 366, -381, 403, -395, 411, -392, 446,
-  -458, 504, -449, 507, -464, 452, -491, 481, -534, 486, -516, 560, -535,
-  525, -537, 559, -554, 570, -616, 591, -585, 627, -509, 588, -584, 547,
-  -610, 580, -614, 635, -620, 655, -554, 546, -591, 642, -590, 660, -656,
-  629, -604, 620, -580, 617, -645, 648, -573, 612, -604, 584, -571, 597,
-  -562, 627, -550, 560, -606, 529, -584, 568, -503, 532, -463, 512, -440,
-  399, -457, 437, -349, 278, -317, 257, -220, 163, -8, -61, 18, -161, 367,
-  -1306};
-static const int16_t time2spec_out_expected_2[kSamples] = {
-  14283, -11552, -15335, 6626,
-  7554, -2150, -6309, 1307, 4523, -4, -3908, -314, 3001, 914, -2715, -1042,
-  2094, 1272, -1715, -1399, 1263, 1508, -1021, -1534, 735, 1595, -439, -1447,
-  155, 1433, 22, -1325, -268, 1205, 424, -1030, -608, 950, 643, -733, -787,
-  661, 861, -502, -888, 331, 852, -144, -849, 19, 833, 99, -826, -154,
-  771, 368, -735, -459, 645, 513, -491, -604, 431, 630, -314, -598, 183,
-  622, -78, -612, -48, 641, 154, -645, -257, 610, 281, -529, -444, 450,
-  441, -327, -506, 274, 476, -232, -570, 117, 554, -86, -531, -21, 572,
-  151, -606, -221, 496, 322, -407, -388, 407, 394, -268, -428, 280, 505,
-  -115, -588, 19, 513, -29, -539, -109, 468, 173, -501, -242, 442, 278,
-  -478, -680, 656, -659, 656, -669, 602, -688, 612, -667, 612, -642, 627,
-  -648, 653, -676, 596, -680, 655, -649, 678, -672, 587, -608, 637, -645,
-  637, -620, 556, -580, 553, -635, 518, -599, 583, -501, 536, -544, 473,
-  -552, 583, -511, 541, -532, 563, -486, 461, -453, 486, -388, 424, -416,
-  432, -374, 399, -462, 364, -346, 293, -329, 331, -313, 281, -247, 309,
-  -337, 241, -190, 207, -194, 179, -163, 155, -156, 117, -135, 107, -126,
-  29, -22, 81, -8, 17, -61, -10, 8, -37, 80, -44, 72, -88, 65, -89, 130,
-  -114, 181, -215, 189, -245, 260, -288, 294, -339, 344, -396, 407, -429,
-  438, -439, 485, -556, 629, -612, 637, -645, 661, -737, 829, -830, 831,
-  -1041};
-
-class TransformTest : public testing::Test {
- protected:
-   TransformTest() {
-     WebRtcSpl_Init();
-   }
-
-   // Pass a function pointer to the Tester function.
-   void Time2SpecTester(Time2Spec Time2SpecFunction) {
-     // WebRtcIsacfix_Time2Spec functions hard coded the buffer lengths. It's a
-     // large buffer but we have to test it here.
-     int16_t data_in_1[kSamples] = {0};
-     int16_t data_in_2[kSamples] = {0};
-     int16_t data_out_1[kSamples] = {0};
-     int16_t data_out_2[kSamples] = {0};
-
-     for(int i = 0; i < kSamples; i++) {
-       data_in_1[i] = i * i + 1777;
-       data_in_2[i] = WEBRTC_SPL_WORD16_MAX / (i + 1) + 17;
-     }
-
-     Time2SpecFunction(data_in_1, data_in_2, data_out_1, data_out_2);
-
-     for (int i = 0; i < kSamples; i++) {
-       // We don't require bit-exact for ARM assembly code.
-       EXPECT_LE(abs(time2spec_out_expected_1[i] - data_out_1[i]), 1);
-       EXPECT_LE(abs(time2spec_out_expected_2[i] - data_out_2[i]), 1);
-     }
-   }
-
-  // Pass a function pointer to the Tester function.
-  void Spec2TimeTester(Spec2Time Spec2TimeFunction) {
-    // WebRtcIsacfix_Spec2Time functions hard coded the buffer lengths. It's a
-    // large buffer but we have to test it here.
-    int16_t data_in_1[kSamples] = {0};
-    int16_t data_in_2[kSamples] = {0};
-    int32_t data_out_1[kSamples] = {0};
-    int32_t data_out_2[kSamples] = {0};
-    for(int i = 0; i < kSamples; i++) {
-      data_in_1[i] = i * i + 1777;
-      data_in_2[i] = WEBRTC_SPL_WORD16_MAX / (i + 1) + 17;
-    }
-
-    Spec2TimeFunction(data_in_1, data_in_2, data_out_1, data_out_2);
-
-    for (int i = 0; i < kSamples; i++) {
-      // We don't require bit-exact for ARM assembly code.
-      EXPECT_LE(abs(spec2time_out_expected_1[i] - data_out_1[i]), 16);
-      EXPECT_LE(abs(spec2time_out_expected_2[i] - data_out_2[i]), 16);
-    }
-  }
-
-};
-
-TEST_F(TransformTest, Time2SpecTest) {
-  Time2SpecTester(WebRtcIsacfix_Time2SpecC);
-#if defined(WEBRTC_HAS_NEON)
-  Time2SpecTester(WebRtcIsacfix_Time2SpecNeon);
-#endif
-}
-
-TEST_F(TransformTest, Spec2TimeTest) {
-  Spec2TimeTester(WebRtcIsacfix_Spec2TimeC);
-#if defined(WEBRTC_HAS_NEON)
-  Spec2TimeTester(WebRtcIsacfix_Spec2TimeNeon);
-#endif
-}
diff --git a/modules/audio_coding/codecs/isac/fix/test/QA/ChannelFiles.txt b/modules/audio_coding/codecs/isac/fix/test/QA/ChannelFiles.txt
deleted file mode 100644
index 05f7410..0000000
--- a/modules/audio_coding/codecs/isac/fix/test/QA/ChannelFiles.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-bottlenecks.txt
-lowrates.txt
-tworates.txt
diff --git a/modules/audio_coding/codecs/isac/fix/test/QA/InputFiles.txt b/modules/audio_coding/codecs/isac/fix/test/QA/InputFiles.txt
deleted file mode 100644
index f26b7af..0000000
--- a/modules/audio_coding/codecs/isac/fix/test/QA/InputFiles.txt
+++ /dev/null
@@ -1,31 +0,0 @@
-DTMF_16kHz_long.pcm
-DTMF_16kHz_short.pcm
-F00.INP
-F01.INP
-F02.INP
-F03.INP
-F04.INP
-F05.INP
-F06.INP
-longtest.pcm
-ltest_speech_clean.pcm
-ltest_music.pcm
-ltest_speech_noisy.pcm
-misc2.pcm
-purenb.pcm
-sawsweep_380_60.pcm
-sinesweep.pcm
-sinesweep_half.pcm
-speechmusic.pcm
-speechmusic_nb.pcm
-speechoffice0dB.pcm
-speech_and_misc_NB.pcm
-speech_and_misc_WB.pcm
-testM4.pcm
-testM4D_rev.pcm  
-testM4D.pcm  
-testfile.pcm
-tone_cisco.pcm
-tone_cisco_long.pcm
-wb_contspeech.pcm
-wb_speech_office25db.pcm
\ No newline at end of file
diff --git a/modules/audio_coding/codecs/isac/fix/test/QA/InputFilesFew.txt b/modules/audio_coding/codecs/isac/fix/test/QA/InputFilesFew.txt
deleted file mode 100644
index 08bbde3..0000000
--- a/modules/audio_coding/codecs/isac/fix/test/QA/InputFilesFew.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-DTMF_16kHz_short.pcm
-ltest_speech_noisy.pcm
-misc2.pcm
-sinesweep.pcm
-speechmusic.pcm
-tone_cisco.pcm
diff --git a/modules/audio_coding/codecs/isac/fix/test/QA/ListOfTestCases.xls b/modules/audio_coding/codecs/isac/fix/test/QA/ListOfTestCases.xls
deleted file mode 100644
index f0889ef..0000000
--- a/modules/audio_coding/codecs/isac/fix/test/QA/ListOfTestCases.xls
+++ /dev/null
Binary files differ
diff --git a/modules/audio_coding/codecs/isac/fix/test/QA/diffiSAC.txt b/modules/audio_coding/codecs/isac/fix/test/QA/diffiSAC.txt
deleted file mode 100644
index 96b87c0..0000000
--- a/modules/audio_coding/codecs/isac/fix/test/QA/diffiSAC.txt
+++ /dev/null
@@ -1,481 +0,0 @@
-#!/bin/bash
-(set -o igncr) 2>/dev/null && set -o igncr; # force bash to ignore \r character
-
-diff ../dataqa350/i30_1DTMF_16kHz_long.pcm ../dataqa351/i30_1DTMF_16kHz_long.pcm
-diff ../dataqa350/i60_1DTMF_16kHz_long.pcm ../dataqa351/i60_1DTMF_16kHz_long.pcm
-diff ../dataqa350/i30_2DTMF_16kHz_long.pcm ../dataqa351/i30_2DTMF_16kHz_long.pcm
-diff ../dataqa350/i60_2DTMF_16kHz_long.pcm ../dataqa351/i60_2DTMF_16kHz_long.pcm
-diff ../dataqa350/i30_3DTMF_16kHz_long.pcm ../dataqa351/i30_3DTMF_16kHz_long.pcm
-diff ../dataqa350/i60_3DTMF_16kHz_long.pcm ../dataqa351/i60_3DTMF_16kHz_long.pcm
-diff ../dataqa350/i30_4DTMF_16kHz_long.pcm ../dataqa351/i30_4DTMF_16kHz_long.pcm
-diff ../dataqa350/i60_4DTMF_16kHz_long.pcm ../dataqa351/i60_4DTMF_16kHz_long.pcm
-diff ../dataqa350/i30_5DTMF_16kHz_long.pcm ../dataqa351/i30_5DTMF_16kHz_long.pcm
-diff ../dataqa350/i60_5DTMF_16kHz_long.pcm ../dataqa351/i60_5DTMF_16kHz_long.pcm
-diff ../dataqa350/i30_6DTMF_16kHz_long.pcm ../dataqa351/i30_6DTMF_16kHz_long.pcm
-diff ../dataqa350/i60_6DTMF_16kHz_long.pcm ../dataqa351/i60_6DTMF_16kHz_long.pcm
-diff ../dataqa350/a1DTMF_16kHz_long.pcm ../dataqa351/a1DTMF_16kHz_long.pcm
-diff ../dataqa350/a2DTMF_16kHz_long.pcm ../dataqa351/a2DTMF_16kHz_long.pcm
-diff ../dataqa350/a3DTMF_16kHz_long.pcm ../dataqa351/a3DTMF_16kHz_long.pcm
-diff ../dataqa350/i30_7DTMF_16kHz_short.pcm ../dataqa351/i30_7DTMF_16kHz_short.pcm
-diff ../dataqa350/i60_7DTMF_16kHz_short.pcm ../dataqa351/i60_7DTMF_16kHz_short.pcm
-diff ../dataqa350/i30_8DTMF_16kHz_short.pcm ../dataqa351/i30_8DTMF_16kHz_short.pcm
-diff ../dataqa350/i60_8DTMF_16kHz_short.pcm ../dataqa351/i60_8DTMF_16kHz_short.pcm
-diff ../dataqa350/i30_9DTMF_16kHz_short.pcm ../dataqa351/i30_9DTMF_16kHz_short.pcm
-diff ../dataqa350/i60_9DTMF_16kHz_short.pcm ../dataqa351/i60_9DTMF_16kHz_short.pcm
-diff ../dataqa350/i30_10DTMF_16kHz_short.pcm ../dataqa351/i30_10DTMF_16kHz_short.pcm
-diff ../dataqa350/i60_10DTMF_16kHz_short.pcm ../dataqa351/i60_10DTMF_16kHz_short.pcm
-diff ../dataqa350/i30_11DTMF_16kHz_short.pcm ../dataqa351/i30_11DTMF_16kHz_short.pcm
-diff ../dataqa350/i60_11DTMF_16kHz_short.pcm ../dataqa351/i60_11DTMF_16kHz_short.pcm
-diff ../dataqa350/i30_12DTMF_16kHz_short.pcm ../dataqa351/i30_12DTMF_16kHz_short.pcm
-diff ../dataqa350/i60_12DTMF_16kHz_short.pcm ../dataqa351/i60_12DTMF_16kHz_short.pcm
-diff ../dataqa350/a4DTMF_16kHz_short.pcm ../dataqa351/a4DTMF_16kHz_short.pcm
-diff ../dataqa350/a5DTMF_16kHz_short.pcm ../dataqa351/a5DTMF_16kHz_short.pcm
-diff ../dataqa350/a6DTMF_16kHz_short.pcm ../dataqa351/a6DTMF_16kHz_short.pcm
-diff ../dataqa350/i30_13F00.INP ../dataqa350/i30_13F00.INP
-diff ../dataqa350/i60_13F00.INP ../dataqa350/i60_13F00.INP
-diff ../dataqa350/i30_14F00.INP ../dataqa350/i30_14F00.INP
-diff ../dataqa350/i60_14F00.INP ../dataqa350/i60_14F00.INP
-diff ../dataqa350/i30_15F00.INP ../dataqa350/i30_15F00.INP
-diff ../dataqa350/i60_15F00.INP ../dataqa350/i60_15F00.INP
-diff ../dataqa350/i30_16F00.INP ../dataqa350/i30_16F00.INP
-diff ../dataqa350/i60_16F00.INP ../dataqa350/i60_16F00.INP
-diff ../dataqa350/i30_17F00.INP ../dataqa350/i30_17F00.INP
-diff ../dataqa350/i60_17F00.INP ../dataqa350/i60_17F00.INP
-diff ../dataqa350/i30_18F00.INP ../dataqa350/i30_18F00.INP
-diff ../dataqa350/i60_18F00.INP ../dataqa350/i60_18F00.INP
-diff ../dataqa350/a7F00.INP ../dataqa350/a7F00.INP
-diff ../dataqa350/a8F00.INP ../dataqa350/a8F00.INP
-diff ../dataqa350/a9F00.INP ../dataqa350/a9F00.INP
-diff ../dataqa350/i30_19F01.INP ../dataqa350/i30_19F01.INP
-diff ../dataqa350/i60_19F01.INP ../dataqa350/i60_19F01.INP
-diff ../dataqa350/i30_20F01.INP ../dataqa350/i30_20F01.INP
-diff ../dataqa350/i60_20F01.INP ../dataqa350/i60_20F01.INP
-diff ../dataqa350/i30_21F01.INP ../dataqa350/i30_21F01.INP
-diff ../dataqa350/i60_21F01.INP ../dataqa350/i60_21F01.INP
-diff ../dataqa350/i30_22F01.INP ../dataqa350/i30_22F01.INP
-diff ../dataqa350/i60_22F01.INP ../dataqa350/i60_22F01.INP
-diff ../dataqa350/i30_23F01.INP ../dataqa350/i30_23F01.INP
-diff ../dataqa350/i60_23F01.INP ../dataqa350/i60_23F01.INP
-diff ../dataqa350/i30_24F01.INP ../dataqa350/i30_24F01.INP
-diff ../dataqa350/i60_24F01.INP ../dataqa350/i60_24F01.INP
-diff ../dataqa350/a10F01.INP ../dataqa350/a10F01.INP
-diff ../dataqa350/a11F01.INP ../dataqa350/a11F01.INP
-diff ../dataqa350/a12F01.INP ../dataqa350/a12F01.INP
-diff ../dataqa350/i30_25F02.INP ../dataqa350/i30_25F02.INP
-diff ../dataqa350/i60_25F02.INP ../dataqa350/i60_25F02.INP
-diff ../dataqa350/i30_26F02.INP ../dataqa350/i30_26F02.INP
-diff ../dataqa350/i60_26F02.INP ../dataqa350/i60_26F02.INP
-diff ../dataqa350/i30_27F02.INP ../dataqa350/i30_27F02.INP
-diff ../dataqa350/i60_27F02.INP ../dataqa350/i60_27F02.INP
-diff ../dataqa350/i30_28F02.INP ../dataqa350/i30_28F02.INP
-diff ../dataqa350/i60_28F02.INP ../dataqa350/i60_28F02.INP
-diff ../dataqa350/i30_29F02.INP ../dataqa350/i30_29F02.INP
-diff ../dataqa350/i60_29F02.INP ../dataqa350/i60_29F02.INP
-diff ../dataqa350/i30_30F02.INP ../dataqa350/i30_30F02.INP
-diff ../dataqa350/i60_30F02.INP ../dataqa350/i60_30F02.INP
-diff ../dataqa350/a13F02.INP ../dataqa350/a13F02.INP
-diff ../dataqa350/a14F02.INP ../dataqa350/a14F02.INP
-diff ../dataqa350/a15F02.INP ../dataqa350/a15F02.INP
-diff ../dataqa350/i30_31F03.INP ../dataqa350/i30_31F03.INP
-diff ../dataqa350/i60_31F03.INP ../dataqa350/i60_31F03.INP
-diff ../dataqa350/i30_32F03.INP ../dataqa350/i30_32F03.INP
-diff ../dataqa350/i60_32F03.INP ../dataqa350/i60_32F03.INP
-diff ../dataqa350/i30_33F03.INP ../dataqa350/i30_33F03.INP
-diff ../dataqa350/i60_33F03.INP ../dataqa350/i60_33F03.INP
-diff ../dataqa350/i30_34F03.INP ../dataqa350/i30_34F03.INP
-diff ../dataqa350/i60_34F03.INP ../dataqa350/i60_34F03.INP
-diff ../dataqa350/i30_35F03.INP ../dataqa350/i30_35F03.INP
-diff ../dataqa350/i60_35F03.INP ../dataqa350/i60_35F03.INP
-diff ../dataqa350/i30_36F03.INP ../dataqa350/i30_36F03.INP
-diff ../dataqa350/i60_36F03.INP ../dataqa350/i60_36F03.INP
-diff ../dataqa350/a16F03.INP ../dataqa350/a16F03.INP
-diff ../dataqa350/a17F03.INP ../dataqa350/a17F03.INP
-diff ../dataqa350/a18F03.INP ../dataqa350/a18F03.INP
-diff ../dataqa350/i30_37F04.INP ../dataqa350/i30_37F04.INP
-diff ../dataqa350/i60_37F04.INP ../dataqa350/i60_37F04.INP
-diff ../dataqa350/i30_38F04.INP ../dataqa350/i30_38F04.INP
-diff ../dataqa350/i60_38F04.INP ../dataqa350/i60_38F04.INP
-diff ../dataqa350/i30_39F04.INP ../dataqa350/i30_39F04.INP
-diff ../dataqa350/i60_39F04.INP ../dataqa350/i60_39F04.INP
-diff ../dataqa350/i30_40F04.INP ../dataqa350/i30_40F04.INP
-diff ../dataqa350/i60_40F04.INP ../dataqa350/i60_40F04.INP
-diff ../dataqa350/i30_41F04.INP ../dataqa350/i30_41F04.INP
-diff ../dataqa350/i60_41F04.INP ../dataqa350/i60_41F04.INP
-diff ../dataqa350/i30_42F04.INP ../dataqa350/i30_42F04.INP
-diff ../dataqa350/i60_42F04.INP ../dataqa350/i60_42F04.INP
-diff ../dataqa350/a19F04.INP ../dataqa350/a19F04.INP
-diff ../dataqa350/a20F04.INP ../dataqa350/a20F04.INP
-diff ../dataqa350/a21F04.INP ../dataqa350/a21F04.INP
-diff ../dataqa350/i30_43F05.INP ../dataqa350/i30_43F05.INP
-diff ../dataqa350/i60_43F05.INP ../dataqa350/i60_43F05.INP
-diff ../dataqa350/i30_44F05.INP ../dataqa350/i30_44F05.INP
-diff ../dataqa350/i60_44F05.INP ../dataqa350/i60_44F05.INP
-diff ../dataqa350/i30_45F05.INP ../dataqa350/i30_45F05.INP
-diff ../dataqa350/i60_45F05.INP ../dataqa350/i60_45F05.INP
-diff ../dataqa350/i30_46F05.INP ../dataqa350/i30_46F05.INP
-diff ../dataqa350/i60_46F05.INP ../dataqa350/i60_46F05.INP
-diff ../dataqa350/i30_47F05.INP ../dataqa350/i30_47F05.INP
-diff ../dataqa350/i60_47F05.INP ../dataqa350/i60_47F05.INP
-diff ../dataqa350/i30_48F05.INP ../dataqa350/i30_48F05.INP
-diff ../dataqa350/i60_48F05.INP ../dataqa350/i60_48F05.INP
-diff ../dataqa350/a22F05.INP ../dataqa350/a22F05.INP
-diff ../dataqa350/a23F05.INP ../dataqa350/a23F05.INP
-diff ../dataqa350/a24F05.INP ../dataqa350/a24F05.INP
-diff ../dataqa350/i30_49F06.INP ../dataqa350/i30_49F06.INP
-diff ../dataqa350/i60_49F06.INP ../dataqa350/i60_49F06.INP
-diff ../dataqa350/i30_50F06.INP ../dataqa350/i30_50F06.INP
-diff ../dataqa350/i60_50F06.INP ../dataqa350/i60_50F06.INP
-diff ../dataqa350/i30_51F06.INP ../dataqa350/i30_51F06.INP
-diff ../dataqa350/i60_51F06.INP ../dataqa350/i60_51F06.INP
-diff ../dataqa350/i30_52F06.INP ../dataqa350/i30_52F06.INP
-diff ../dataqa350/i60_52F06.INP ../dataqa350/i60_52F06.INP
-diff ../dataqa350/i30_53F06.INP ../dataqa350/i30_53F06.INP
-diff ../dataqa350/i60_53F06.INP ../dataqa350/i60_53F06.INP
-diff ../dataqa350/i30_54F06.INP ../dataqa350/i30_54F06.INP
-diff ../dataqa350/i60_54F06.INP ../dataqa350/i60_54F06.INP
-diff ../dataqa350/a25F06.INP ../dataqa350/a25F06.INP
-diff ../dataqa350/a26F06.INP ../dataqa350/a26F06.INP
-diff ../dataqa350/a27F06.INP ../dataqa350/a27F06.INP
-diff ../dataqa350/i30_55longtest.pcm ../dataqa351/i30_55longtest.pcm
-diff ../dataqa350/i60_55longtest.pcm ../dataqa351/i60_55longtest.pcm
-diff ../dataqa350/i30_56longtest.pcm ../dataqa351/i30_56longtest.pcm
-diff ../dataqa350/i60_56longtest.pcm ../dataqa351/i60_56longtest.pcm
-diff ../dataqa350/i30_57longtest.pcm ../dataqa351/i30_57longtest.pcm
-diff ../dataqa350/i60_57longtest.pcm ../dataqa351/i60_57longtest.pcm
-diff ../dataqa350/i30_58longtest.pcm ../dataqa351/i30_58longtest.pcm
-diff ../dataqa350/i60_58longtest.pcm ../dataqa351/i60_58longtest.pcm
-diff ../dataqa350/i30_59longtest.pcm ../dataqa351/i30_59longtest.pcm
-diff ../dataqa350/i60_59longtest.pcm ../dataqa351/i60_59longtest.pcm
-diff ../dataqa350/i30_60longtest.pcm ../dataqa351/i30_60longtest.pcm
-diff ../dataqa350/i60_60longtest.pcm ../dataqa351/i60_60longtest.pcm
-diff ../dataqa350/a28longtest.pcm ../dataqa351/a28longtest.pcm
-diff ../dataqa350/a29longtest.pcm ../dataqa351/a29longtest.pcm
-diff ../dataqa350/a30longtest.pcm ../dataqa351/a30longtest.pcm
-diff ../dataqa350/i30_61ltest_speech_clean.pcm ../dataqa351/i30_61ltest_speech_clean.pcm
-diff ../dataqa350/i60_61ltest_speech_clean.pcm ../dataqa351/i60_61ltest_speech_clean.pcm
-diff ../dataqa350/i30_62ltest_speech_clean.pcm ../dataqa351/i30_62ltest_speech_clean.pcm
-diff ../dataqa350/i60_62ltest_speech_clean.pcm ../dataqa351/i60_62ltest_speech_clean.pcm
-diff ../dataqa350/i30_63ltest_speech_clean.pcm ../dataqa351/i30_63ltest_speech_clean.pcm
-diff ../dataqa350/i60_63ltest_speech_clean.pcm ../dataqa351/i60_63ltest_speech_clean.pcm
-diff ../dataqa350/i30_64ltest_speech_clean.pcm ../dataqa351/i30_64ltest_speech_clean.pcm
-diff ../dataqa350/i60_64ltest_speech_clean.pcm ../dataqa351/i60_64ltest_speech_clean.pcm
-diff ../dataqa350/i30_65ltest_speech_clean.pcm ../dataqa351/i30_65ltest_speech_clean.pcm
-diff ../dataqa350/i60_65ltest_speech_clean.pcm ../dataqa351/i60_65ltest_speech_clean.pcm
-diff ../dataqa350/i30_66ltest_speech_clean.pcm ../dataqa351/i30_66ltest_speech_clean.pcm
-diff ../dataqa350/i60_66ltest_speech_clean.pcm ../dataqa351/i60_66ltest_speech_clean.pcm
-diff ../dataqa350/a31ltest_speech_clean.pcm ../dataqa351/a31ltest_speech_clean.pcm
-diff ../dataqa350/a32ltest_speech_clean.pcm ../dataqa351/a32ltest_speech_clean.pcm
-diff ../dataqa350/a33ltest_speech_clean.pcm ../dataqa351/a33ltest_speech_clean.pcm
-diff ../dataqa350/i30_67ltest_music.pcm ../dataqa351/i30_67ltest_music.pcm
-diff ../dataqa350/i60_67ltest_music.pcm ../dataqa351/i60_67ltest_music.pcm
-diff ../dataqa350/i30_68ltest_music.pcm ../dataqa351/i30_68ltest_music.pcm
-diff ../dataqa350/i60_68ltest_music.pcm ../dataqa351/i60_68ltest_music.pcm
-diff ../dataqa350/i30_69ltest_music.pcm ../dataqa351/i30_69ltest_music.pcm
-diff ../dataqa350/i60_69ltest_music.pcm ../dataqa351/i60_69ltest_music.pcm
-diff ../dataqa350/i30_70ltest_music.pcm ../dataqa351/i30_70ltest_music.pcm
-diff ../dataqa350/i60_70ltest_music.pcm ../dataqa351/i60_70ltest_music.pcm
-diff ../dataqa350/i30_71ltest_music.pcm ../dataqa351/i30_71ltest_music.pcm
-diff ../dataqa350/i60_71ltest_music.pcm ../dataqa351/i60_71ltest_music.pcm
-diff ../dataqa350/i30_72ltest_music.pcm ../dataqa351/i30_72ltest_music.pcm
-diff ../dataqa350/i60_72ltest_music.pcm ../dataqa351/i60_72ltest_music.pcm
-diff ../dataqa350/a34ltest_music.pcm ../dataqa351/a34ltest_music.pcm
-diff ../dataqa350/a35ltest_music.pcm ../dataqa351/a35ltest_music.pcm
-diff ../dataqa350/a36ltest_music.pcm ../dataqa351/a36ltest_music.pcm
-diff ../dataqa350/i30_73ltest_speech_noisy.pcm ../dataqa351/i30_73ltest_speech_noisy.pcm
-diff ../dataqa350/i60_73ltest_speech_noisy.pcm ../dataqa351/i60_73ltest_speech_noisy.pcm
-diff ../dataqa350/i30_74ltest_speech_noisy.pcm ../dataqa351/i30_74ltest_speech_noisy.pcm
-diff ../dataqa350/i60_74ltest_speech_noisy.pcm ../dataqa351/i60_74ltest_speech_noisy.pcm
-diff ../dataqa350/i30_75ltest_speech_noisy.pcm ../dataqa351/i30_75ltest_speech_noisy.pcm
-diff ../dataqa350/i60_75ltest_speech_noisy.pcm ../dataqa351/i60_75ltest_speech_noisy.pcm
-diff ../dataqa350/i30_76ltest_speech_noisy.pcm ../dataqa351/i30_76ltest_speech_noisy.pcm
-diff ../dataqa350/i60_76ltest_speech_noisy.pcm ../dataqa351/i60_76ltest_speech_noisy.pcm
-diff ../dataqa350/i30_77ltest_speech_noisy.pcm ../dataqa351/i30_77ltest_speech_noisy.pcm
-diff ../dataqa350/i60_77ltest_speech_noisy.pcm ../dataqa351/i60_77ltest_speech_noisy.pcm
-diff ../dataqa350/i30_78ltest_speech_noisy.pcm ../dataqa351/i30_78ltest_speech_noisy.pcm
-diff ../dataqa350/i60_78ltest_speech_noisy.pcm ../dataqa351/i60_78ltest_speech_noisy.pcm
-diff ../dataqa350/a37ltest_speech_noisy.pcm ../dataqa351/a37ltest_speech_noisy.pcm
-diff ../dataqa350/a38ltest_speech_noisy.pcm ../dataqa351/a38ltest_speech_noisy.pcm
-diff ../dataqa350/a39ltest_speech_noisy.pcm ../dataqa351/a39ltest_speech_noisy.pcm
-diff ../dataqa350/i30_79misc2.pcm ../dataqa351/i30_79misc2.pcm
-diff ../dataqa350/i60_79misc2.pcm ../dataqa351/i60_79misc2.pcm
-diff ../dataqa350/i30_80misc2.pcm ../dataqa351/i30_80misc2.pcm
-diff ../dataqa350/i60_80misc2.pcm ../dataqa351/i60_80misc2.pcm
-diff ../dataqa350/i30_81misc2.pcm ../dataqa351/i30_81misc2.pcm
-diff ../dataqa350/i60_81misc2.pcm ../dataqa351/i60_81misc2.pcm
-diff ../dataqa350/i30_82misc2.pcm ../dataqa351/i30_82misc2.pcm
-diff ../dataqa350/i60_82misc2.pcm ../dataqa351/i60_82misc2.pcm
-diff ../dataqa350/i30_83misc2.pcm ../dataqa351/i30_83misc2.pcm
-diff ../dataqa350/i60_83misc2.pcm ../dataqa351/i60_83misc2.pcm
-diff ../dataqa350/i30_84misc2.pcm ../dataqa351/i30_84misc2.pcm
-diff ../dataqa350/i60_84misc2.pcm ../dataqa351/i60_84misc2.pcm
-diff ../dataqa350/a40misc2.pcm ../dataqa351/a40misc2.pcm
-diff ../dataqa350/a41misc2.pcm ../dataqa351/a41misc2.pcm
-diff ../dataqa350/a42misc2.pcm ../dataqa351/a42misc2.pcm
-diff ../dataqa350/i30_85purenb.pcm ../dataqa351/i30_85purenb.pcm
-diff ../dataqa350/i60_85purenb.pcm ../dataqa351/i60_85purenb.pcm
-diff ../dataqa350/i30_86purenb.pcm ../dataqa351/i30_86purenb.pcm
-diff ../dataqa350/i60_86purenb.pcm ../dataqa351/i60_86purenb.pcm
-diff ../dataqa350/i30_87purenb.pcm ../dataqa351/i30_87purenb.pcm
-diff ../dataqa350/i60_87purenb.pcm ../dataqa351/i60_87purenb.pcm
-diff ../dataqa350/i30_88purenb.pcm ../dataqa351/i30_88purenb.pcm
-diff ../dataqa350/i60_88purenb.pcm ../dataqa351/i60_88purenb.pcm
-diff ../dataqa350/i30_89purenb.pcm ../dataqa351/i30_89purenb.pcm
-diff ../dataqa350/i60_89purenb.pcm ../dataqa351/i60_89purenb.pcm
-diff ../dataqa350/i30_90purenb.pcm ../dataqa351/i30_90purenb.pcm
-diff ../dataqa350/i60_90purenb.pcm ../dataqa351/i60_90purenb.pcm
-diff ../dataqa350/a43purenb.pcm ../dataqa351/a43purenb.pcm
-diff ../dataqa350/a44purenb.pcm ../dataqa351/a44purenb.pcm
-diff ../dataqa350/a45purenb.pcm ../dataqa351/a45purenb.pcm
-diff ../dataqa350/i30_91sawsweep_380_60.pcm ../dataqa351/i30_91sawsweep_380_60.pcm
-diff ../dataqa350/i60_91sawsweep_380_60.pcm ../dataqa351/i60_91sawsweep_380_60.pcm
-diff ../dataqa350/i30_92sawsweep_380_60.pcm ../dataqa351/i30_92sawsweep_380_60.pcm
-diff ../dataqa350/i60_92sawsweep_380_60.pcm ../dataqa351/i60_92sawsweep_380_60.pcm
-diff ../dataqa350/i30_93sawsweep_380_60.pcm ../dataqa351/i30_93sawsweep_380_60.pcm
-diff ../dataqa350/i60_93sawsweep_380_60.pcm ../dataqa351/i60_93sawsweep_380_60.pcm
-diff ../dataqa350/i30_94sawsweep_380_60.pcm ../dataqa351/i30_94sawsweep_380_60.pcm
-diff ../dataqa350/i60_94sawsweep_380_60.pcm ../dataqa351/i60_94sawsweep_380_60.pcm
-diff ../dataqa350/i30_95sawsweep_380_60.pcm ../dataqa351/i30_95sawsweep_380_60.pcm
-diff ../dataqa350/i60_95sawsweep_380_60.pcm ../dataqa351/i60_95sawsweep_380_60.pcm
-diff ../dataqa350/i30_96sawsweep_380_60.pcm ../dataqa351/i30_96sawsweep_380_60.pcm
-diff ../dataqa350/i60_96sawsweep_380_60.pcm ../dataqa351/i60_96sawsweep_380_60.pcm
-diff ../dataqa350/a46sawsweep_380_60.pcm ../dataqa351/a46sawsweep_380_60.pcm
-diff ../dataqa350/a47sawsweep_380_60.pcm ../dataqa351/a47sawsweep_380_60.pcm
-diff ../dataqa350/a48sawsweep_380_60.pcm ../dataqa351/a48sawsweep_380_60.pcm
-diff ../dataqa350/i30_97sinesweep.pcm ../dataqa351/i30_97sinesweep.pcm
-diff ../dataqa350/i60_97sinesweep.pcm ../dataqa351/i60_97sinesweep.pcm
-diff ../dataqa350/i30_98sinesweep.pcm ../dataqa351/i30_98sinesweep.pcm
-diff ../dataqa350/i60_98sinesweep.pcm ../dataqa351/i60_98sinesweep.pcm
-diff ../dataqa350/i30_99sinesweep.pcm ../dataqa351/i30_99sinesweep.pcm
-diff ../dataqa350/i60_99sinesweep.pcm ../dataqa351/i60_99sinesweep.pcm
-diff ../dataqa350/i30_100sinesweep.pcm ../dataqa351/i30_100sinesweep.pcm
-diff ../dataqa350/i60_100sinesweep.pcm ../dataqa351/i60_100sinesweep.pcm
-diff ../dataqa350/i30_101sinesweep.pcm ../dataqa351/i30_101sinesweep.pcm
-diff ../dataqa350/i60_101sinesweep.pcm ../dataqa351/i60_101sinesweep.pcm
-diff ../dataqa350/i30_102sinesweep.pcm ../dataqa351/i30_102sinesweep.pcm
-diff ../dataqa350/i60_102sinesweep.pcm ../dataqa351/i60_102sinesweep.pcm
-diff ../dataqa350/a49sinesweep.pcm ../dataqa351/a49sinesweep.pcm
-diff ../dataqa350/a50sinesweep.pcm ../dataqa351/a50sinesweep.pcm
-diff ../dataqa350/a51sinesweep.pcm ../dataqa351/a51sinesweep.pcm
-diff ../dataqa350/i30_103sinesweep_half.pcm ../dataqa351/i30_103sinesweep_half.pcm
-diff ../dataqa350/i60_103sinesweep_half.pcm ../dataqa351/i60_103sinesweep_half.pcm
-diff ../dataqa350/i30_104sinesweep_half.pcm ../dataqa351/i30_104sinesweep_half.pcm
-diff ../dataqa350/i60_104sinesweep_half.pcm ../dataqa351/i60_104sinesweep_half.pcm
-diff ../dataqa350/i30_105sinesweep_half.pcm ../dataqa351/i30_105sinesweep_half.pcm
-diff ../dataqa350/i60_105sinesweep_half.pcm ../dataqa351/i60_105sinesweep_half.pcm
-diff ../dataqa350/i30_106sinesweep_half.pcm ../dataqa351/i30_106sinesweep_half.pcm
-diff ../dataqa350/i60_106sinesweep_half.pcm ../dataqa351/i60_106sinesweep_half.pcm
-diff ../dataqa350/i30_107sinesweep_half.pcm ../dataqa351/i30_107sinesweep_half.pcm
-diff ../dataqa350/i60_107sinesweep_half.pcm ../dataqa351/i60_107sinesweep_half.pcm
-diff ../dataqa350/i30_108sinesweep_half.pcm ../dataqa351/i30_108sinesweep_half.pcm
-diff ../dataqa350/i60_108sinesweep_half.pcm ../dataqa351/i60_108sinesweep_half.pcm
-diff ../dataqa350/a52sinesweep_half.pcm ../dataqa351/a52sinesweep_half.pcm
-diff ../dataqa350/a53sinesweep_half.pcm ../dataqa351/a53sinesweep_half.pcm
-diff ../dataqa350/a54sinesweep_half.pcm ../dataqa351/a54sinesweep_half.pcm
-diff ../dataqa350/i30_109speechmusic.pcm ../dataqa351/i30_109speechmusic.pcm
-diff ../dataqa350/i60_109speechmusic.pcm ../dataqa351/i60_109speechmusic.pcm
-diff ../dataqa350/i30_110speechmusic.pcm ../dataqa351/i30_110speechmusic.pcm
-diff ../dataqa350/i60_110speechmusic.pcm ../dataqa351/i60_110speechmusic.pcm
-diff ../dataqa350/i30_111speechmusic.pcm ../dataqa351/i30_111speechmusic.pcm
-diff ../dataqa350/i60_111speechmusic.pcm ../dataqa351/i60_111speechmusic.pcm
-diff ../dataqa350/i30_112speechmusic.pcm ../dataqa351/i30_112speechmusic.pcm
-diff ../dataqa350/i60_112speechmusic.pcm ../dataqa351/i60_112speechmusic.pcm
-diff ../dataqa350/i30_113speechmusic.pcm ../dataqa351/i30_113speechmusic.pcm
-diff ../dataqa350/i60_113speechmusic.pcm ../dataqa351/i60_113speechmusic.pcm
-diff ../dataqa350/i30_114speechmusic.pcm ../dataqa351/i30_114speechmusic.pcm
-diff ../dataqa350/i60_114speechmusic.pcm ../dataqa351/i60_114speechmusic.pcm
-diff ../dataqa350/a55speechmusic.pcm ../dataqa351/a55speechmusic.pcm
-diff ../dataqa350/a56speechmusic.pcm ../dataqa351/a56speechmusic.pcm
-diff ../dataqa350/a57speechmusic.pcm ../dataqa351/a57speechmusic.pcm
-diff ../dataqa350/i30_115speechmusic_nb.pcm ../dataqa351/i30_115speechmusic_nb.pcm
-diff ../dataqa350/i60_115speechmusic_nb.pcm ../dataqa351/i60_115speechmusic_nb.pcm
-diff ../dataqa350/i30_116speechmusic_nb.pcm ../dataqa351/i30_116speechmusic_nb.pcm
-diff ../dataqa350/i60_116speechmusic_nb.pcm ../dataqa351/i60_116speechmusic_nb.pcm
-diff ../dataqa350/i30_117speechmusic_nb.pcm ../dataqa351/i30_117speechmusic_nb.pcm
-diff ../dataqa350/i60_117speechmusic_nb.pcm ../dataqa351/i60_117speechmusic_nb.pcm
-diff ../dataqa350/i30_118speechmusic_nb.pcm ../dataqa351/i30_118speechmusic_nb.pcm
-diff ../dataqa350/i60_118speechmusic_nb.pcm ../dataqa351/i60_118speechmusic_nb.pcm
-diff ../dataqa350/i30_119speechmusic_nb.pcm ../dataqa351/i30_119speechmusic_nb.pcm
-diff ../dataqa350/i60_119speechmusic_nb.pcm ../dataqa351/i60_119speechmusic_nb.pcm
-diff ../dataqa350/i30_120speechmusic_nb.pcm ../dataqa351/i30_120speechmusic_nb.pcm
-diff ../dataqa350/i60_120speechmusic_nb.pcm ../dataqa351/i60_120speechmusic_nb.pcm
-diff ../dataqa350/a58speechmusic_nb.pcm ../dataqa351/a58speechmusic_nb.pcm
-diff ../dataqa350/a59speechmusic_nb.pcm ../dataqa351/a59speechmusic_nb.pcm
-diff ../dataqa350/a60speechmusic_nb.pcm ../dataqa351/a60speechmusic_nb.pcm
-diff ../dataqa350/i30_121speechoffice0dB.pcm ../dataqa351/i30_121speechoffice0dB.pcm
-diff ../dataqa350/i60_121speechoffice0dB.pcm ../dataqa351/i60_121speechoffice0dB.pcm
-diff ../dataqa350/i30_122speechoffice0dB.pcm ../dataqa351/i30_122speechoffice0dB.pcm
-diff ../dataqa350/i60_122speechoffice0dB.pcm ../dataqa351/i60_122speechoffice0dB.pcm
-diff ../dataqa350/i30_123speechoffice0dB.pcm ../dataqa351/i30_123speechoffice0dB.pcm
-diff ../dataqa350/i60_123speechoffice0dB.pcm ../dataqa351/i60_123speechoffice0dB.pcm
-diff ../dataqa350/i30_124speechoffice0dB.pcm ../dataqa351/i30_124speechoffice0dB.pcm
-diff ../dataqa350/i60_124speechoffice0dB.pcm ../dataqa351/i60_124speechoffice0dB.pcm
-diff ../dataqa350/i30_125speechoffice0dB.pcm ../dataqa351/i30_125speechoffice0dB.pcm
-diff ../dataqa350/i60_125speechoffice0dB.pcm ../dataqa351/i60_125speechoffice0dB.pcm
-diff ../dataqa350/i30_126speechoffice0dB.pcm ../dataqa351/i30_126speechoffice0dB.pcm
-diff ../dataqa350/i60_126speechoffice0dB.pcm ../dataqa351/i60_126speechoffice0dB.pcm
-diff ../dataqa350/a61speechoffice0dB.pcm ../dataqa351/a61speechoffice0dB.pcm
-diff ../dataqa350/a62speechoffice0dB.pcm ../dataqa351/a62speechoffice0dB.pcm
-diff ../dataqa350/a63speechoffice0dB.pcm ../dataqa351/a63speechoffice0dB.pcm
-diff ../dataqa350/i30_127speech_and_misc_NB.pcm ../dataqa351/i30_127speech_and_misc_NB.pcm
-diff ../dataqa350/i60_127speech_and_misc_NB.pcm ../dataqa351/i60_127speech_and_misc_NB.pcm
-diff ../dataqa350/i30_128speech_and_misc_NB.pcm ../dataqa351/i30_128speech_and_misc_NB.pcm
-diff ../dataqa350/i60_128speech_and_misc_NB.pcm ../dataqa351/i60_128speech_and_misc_NB.pcm
-diff ../dataqa350/i30_129speech_and_misc_NB.pcm ../dataqa351/i30_129speech_and_misc_NB.pcm
-diff ../dataqa350/i60_129speech_and_misc_NB.pcm ../dataqa351/i60_129speech_and_misc_NB.pcm
-diff ../dataqa350/i30_130speech_and_misc_NB.pcm ../dataqa351/i30_130speech_and_misc_NB.pcm
-diff ../dataqa350/i60_130speech_and_misc_NB.pcm ../dataqa351/i60_130speech_and_misc_NB.pcm
-diff ../dataqa350/i30_131speech_and_misc_NB.pcm ../dataqa351/i30_131speech_and_misc_NB.pcm
-diff ../dataqa350/i60_131speech_and_misc_NB.pcm ../dataqa351/i60_131speech_and_misc_NB.pcm
-diff ../dataqa350/i30_132speech_and_misc_NB.pcm ../dataqa351/i30_132speech_and_misc_NB.pcm
-diff ../dataqa350/i60_132speech_and_misc_NB.pcm ../dataqa351/i60_132speech_and_misc_NB.pcm
-diff ../dataqa350/a64speech_and_misc_NB.pcm ../dataqa351/a64speech_and_misc_NB.pcm
-diff ../dataqa350/a65speech_and_misc_NB.pcm ../dataqa351/a65speech_and_misc_NB.pcm
-diff ../dataqa350/a66speech_and_misc_NB.pcm ../dataqa351/a66speech_and_misc_NB.pcm
-diff ../dataqa350/i30_133speech_and_misc_WB.pcm ../dataqa351/i30_133speech_and_misc_WB.pcm
-diff ../dataqa350/i60_133speech_and_misc_WB.pcm ../dataqa351/i60_133speech_and_misc_WB.pcm
-diff ../dataqa350/i30_134speech_and_misc_WB.pcm ../dataqa351/i30_134speech_and_misc_WB.pcm
-diff ../dataqa350/i60_134speech_and_misc_WB.pcm ../dataqa351/i60_134speech_and_misc_WB.pcm
-diff ../dataqa350/i30_135speech_and_misc_WB.pcm ../dataqa351/i30_135speech_and_misc_WB.pcm
-diff ../dataqa350/i60_135speech_and_misc_WB.pcm ../dataqa351/i60_135speech_and_misc_WB.pcm
-diff ../dataqa350/i30_136speech_and_misc_WB.pcm ../dataqa351/i30_136speech_and_misc_WB.pcm
-diff ../dataqa350/i60_136speech_and_misc_WB.pcm ../dataqa351/i60_136speech_and_misc_WB.pcm
-diff ../dataqa350/i30_137speech_and_misc_WB.pcm ../dataqa351/i30_137speech_and_misc_WB.pcm
-diff ../dataqa350/i60_137speech_and_misc_WB.pcm ../dataqa351/i60_137speech_and_misc_WB.pcm
-diff ../dataqa350/i30_138speech_and_misc_WB.pcm ../dataqa351/i30_138speech_and_misc_WB.pcm
-diff ../dataqa350/i60_138speech_and_misc_WB.pcm ../dataqa351/i60_138speech_and_misc_WB.pcm
-diff ../dataqa350/a67speech_and_misc_WB.pcm ../dataqa351/a67speech_and_misc_WB.pcm
-diff ../dataqa350/a68speech_and_misc_WB.pcm ../dataqa351/a68speech_and_misc_WB.pcm
-diff ../dataqa350/a69speech_and_misc_WB.pcm ../dataqa351/a69speech_and_misc_WB.pcm
-diff ../dataqa350/i30_139testM4.pcm ../dataqa351/i30_139testM4.pcm
-diff ../dataqa350/i60_139testM4.pcm ../dataqa351/i60_139testM4.pcm
-diff ../dataqa350/i30_140testM4.pcm ../dataqa351/i30_140testM4.pcm
-diff ../dataqa350/i60_140testM4.pcm ../dataqa351/i60_140testM4.pcm
-diff ../dataqa350/i30_141testM4.pcm ../dataqa351/i30_141testM4.pcm
-diff ../dataqa350/i60_141testM4.pcm ../dataqa351/i60_141testM4.pcm
-diff ../dataqa350/i30_142testM4.pcm ../dataqa351/i30_142testM4.pcm
-diff ../dataqa350/i60_142testM4.pcm ../dataqa351/i60_142testM4.pcm
-diff ../dataqa350/i30_143testM4.pcm ../dataqa351/i30_143testM4.pcm
-diff ../dataqa350/i60_143testM4.pcm ../dataqa351/i60_143testM4.pcm
-diff ../dataqa350/i30_144testM4.pcm ../dataqa351/i30_144testM4.pcm
-diff ../dataqa350/i60_144testM4.pcm ../dataqa351/i60_144testM4.pcm
-diff ../dataqa350/a70testM4.pcm ../dataqa351/a70testM4.pcm
-diff ../dataqa350/a71testM4.pcm ../dataqa351/a71testM4.pcm
-diff ../dataqa350/a72testM4.pcm ../dataqa351/a72testM4.pcm
-diff ../dataqa350/i30_145testM4D_rev.pcm ../dataqa351/i30_145testM4D_rev.pcm
-diff ../dataqa350/i60_145testM4D_rev.pcm ../dataqa351/i60_145testM4D_rev.pcm
-diff ../dataqa350/i30_146testM4D_rev.pcm ../dataqa351/i30_146testM4D_rev.pcm
-diff ../dataqa350/i60_146testM4D_rev.pcm ../dataqa351/i60_146testM4D_rev.pcm
-diff ../dataqa350/i30_147testM4D_rev.pcm ../dataqa351/i30_147testM4D_rev.pcm
-diff ../dataqa350/i60_147testM4D_rev.pcm ../dataqa351/i60_147testM4D_rev.pcm
-diff ../dataqa350/i30_148testM4D_rev.pcm ../dataqa351/i30_148testM4D_rev.pcm
-diff ../dataqa350/i60_148testM4D_rev.pcm ../dataqa351/i60_148testM4D_rev.pcm
-diff ../dataqa350/i30_149testM4D_rev.pcm ../dataqa351/i30_149testM4D_rev.pcm
-diff ../dataqa350/i60_149testM4D_rev.pcm ../dataqa351/i60_149testM4D_rev.pcm
-diff ../dataqa350/i30_150testM4D_rev.pcm ../dataqa351/i30_150testM4D_rev.pcm
-diff ../dataqa350/i60_150testM4D_rev.pcm ../dataqa351/i60_150testM4D_rev.pcm
-diff ../dataqa350/a73testM4D_rev.pcm ../dataqa351/a73testM4D_rev.pcm
-diff ../dataqa350/a74testM4D_rev.pcm ../dataqa351/a74testM4D_rev.pcm
-diff ../dataqa350/a75testM4D_rev.pcm ../dataqa351/a75testM4D_rev.pcm
-diff ../dataqa350/i30_151testM4D.pcm ../dataqa351/i30_151testM4D.pcm
-diff ../dataqa350/i60_151testM4D.pcm ../dataqa351/i60_151testM4D.pcm
-diff ../dataqa350/i30_152testM4D.pcm ../dataqa351/i30_152testM4D.pcm
-diff ../dataqa350/i60_152testM4D.pcm ../dataqa351/i60_152testM4D.pcm
-diff ../dataqa350/i30_153testM4D.pcm ../dataqa351/i30_153testM4D.pcm
-diff ../dataqa350/i60_153testM4D.pcm ../dataqa351/i60_153testM4D.pcm
-diff ../dataqa350/i30_154testM4D.pcm ../dataqa351/i30_154testM4D.pcm
-diff ../dataqa350/i60_154testM4D.pcm ../dataqa351/i60_154testM4D.pcm
-diff ../dataqa350/i30_155testM4D.pcm ../dataqa351/i30_155testM4D.pcm
-diff ../dataqa350/i60_155testM4D.pcm ../dataqa351/i60_155testM4D.pcm
-diff ../dataqa350/i30_156testM4D.pcm ../dataqa351/i30_156testM4D.pcm
-diff ../dataqa350/i60_156testM4D.pcm ../dataqa351/i60_156testM4D.pcm
-diff ../dataqa350/a76testM4D.pcm ../dataqa351/a76testM4D.pcm
-diff ../dataqa350/a77testM4D.pcm ../dataqa351/a77testM4D.pcm
-diff ../dataqa350/a78testM4D.pcm ../dataqa351/a78testM4D.pcm
-diff ../dataqa350/i30_157testfile.pcm ../dataqa351/i30_157testfile.pcm
-diff ../dataqa350/i60_157testfile.pcm ../dataqa351/i60_157testfile.pcm
-diff ../dataqa350/i30_158testfile.pcm ../dataqa351/i30_158testfile.pcm
-diff ../dataqa350/i60_158testfile.pcm ../dataqa351/i60_158testfile.pcm
-diff ../dataqa350/i30_159testfile.pcm ../dataqa351/i30_159testfile.pcm
-diff ../dataqa350/i60_159testfile.pcm ../dataqa351/i60_159testfile.pcm
-diff ../dataqa350/i30_160testfile.pcm ../dataqa351/i30_160testfile.pcm
-diff ../dataqa350/i60_160testfile.pcm ../dataqa351/i60_160testfile.pcm
-diff ../dataqa350/i30_161testfile.pcm ../dataqa351/i30_161testfile.pcm
-diff ../dataqa350/i60_161testfile.pcm ../dataqa351/i60_161testfile.pcm
-diff ../dataqa350/i30_162testfile.pcm ../dataqa351/i30_162testfile.pcm
-diff ../dataqa350/i60_162testfile.pcm ../dataqa351/i60_162testfile.pcm
-diff ../dataqa350/a79testfile.pcm ../dataqa351/a79testfile.pcm
-diff ../dataqa350/a80testfile.pcm ../dataqa351/a80testfile.pcm
-diff ../dataqa350/a81testfile.pcm ../dataqa351/a81testfile.pcm
-diff ../dataqa350/i30_163tone_cisco.pcm ../dataqa351/i30_163tone_cisco.pcm
-diff ../dataqa350/i60_163tone_cisco.pcm ../dataqa351/i60_163tone_cisco.pcm
-diff ../dataqa350/i30_164tone_cisco.pcm ../dataqa351/i30_164tone_cisco.pcm
-diff ../dataqa350/i60_164tone_cisco.pcm ../dataqa351/i60_164tone_cisco.pcm
-diff ../dataqa350/i30_165tone_cisco.pcm ../dataqa351/i30_165tone_cisco.pcm
-diff ../dataqa350/i60_165tone_cisco.pcm ../dataqa351/i60_165tone_cisco.pcm
-diff ../dataqa350/i30_166tone_cisco.pcm ../dataqa351/i30_166tone_cisco.pcm
-diff ../dataqa350/i60_166tone_cisco.pcm ../dataqa351/i60_166tone_cisco.pcm
-diff ../dataqa350/i30_167tone_cisco.pcm ../dataqa351/i30_167tone_cisco.pcm
-diff ../dataqa350/i60_167tone_cisco.pcm ../dataqa351/i60_167tone_cisco.pcm
-diff ../dataqa350/i30_168tone_cisco.pcm ../dataqa351/i30_168tone_cisco.pcm
-diff ../dataqa350/i60_168tone_cisco.pcm ../dataqa351/i60_168tone_cisco.pcm
-diff ../dataqa350/a82tone_cisco.pcm ../dataqa351/a82tone_cisco.pcm
-diff ../dataqa350/a83tone_cisco.pcm ../dataqa351/a83tone_cisco.pcm
-diff ../dataqa350/a84tone_cisco.pcm ../dataqa351/a84tone_cisco.pcm
-diff ../dataqa350/i30_169tone_cisco_long.pcm ../dataqa351/i30_169tone_cisco_long.pcm
-diff ../dataqa350/i60_169tone_cisco_long.pcm ../dataqa351/i60_169tone_cisco_long.pcm
-diff ../dataqa350/i30_170tone_cisco_long.pcm ../dataqa351/i30_170tone_cisco_long.pcm
-diff ../dataqa350/i60_170tone_cisco_long.pcm ../dataqa351/i60_170tone_cisco_long.pcm
-diff ../dataqa350/i30_171tone_cisco_long.pcm ../dataqa351/i30_171tone_cisco_long.pcm
-diff ../dataqa350/i60_171tone_cisco_long.pcm ../dataqa351/i60_171tone_cisco_long.pcm
-diff ../dataqa350/i30_172tone_cisco_long.pcm ../dataqa351/i30_172tone_cisco_long.pcm
-diff ../dataqa350/i60_172tone_cisco_long.pcm ../dataqa351/i60_172tone_cisco_long.pcm
-diff ../dataqa350/i30_173tone_cisco_long.pcm ../dataqa351/i30_173tone_cisco_long.pcm
-diff ../dataqa350/i60_173tone_cisco_long.pcm ../dataqa351/i60_173tone_cisco_long.pcm
-diff ../dataqa350/i30_174tone_cisco_long.pcm ../dataqa351/i30_174tone_cisco_long.pcm
-diff ../dataqa350/i60_174tone_cisco_long.pcm ../dataqa351/i60_174tone_cisco_long.pcm
-diff ../dataqa350/a85tone_cisco_long.pcm ../dataqa351/a85tone_cisco_long.pcm
-diff ../dataqa350/a86tone_cisco_long.pcm ../dataqa351/a86tone_cisco_long.pcm
-diff ../dataqa350/a87tone_cisco_long.pcm ../dataqa351/a87tone_cisco_long.pcm
-diff ../dataqa350/i30_175wb_contspeech.pcm ../dataqa351/i30_175wb_contspeech.pcm
-diff ../dataqa350/i60_175wb_contspeech.pcm ../dataqa351/i60_175wb_contspeech.pcm
-diff ../dataqa350/i30_176wb_contspeech.pcm ../dataqa351/i30_176wb_contspeech.pcm
-diff ../dataqa350/i60_176wb_contspeech.pcm ../dataqa351/i60_176wb_contspeech.pcm
-diff ../dataqa350/i30_177wb_contspeech.pcm ../dataqa351/i30_177wb_contspeech.pcm
-diff ../dataqa350/i60_177wb_contspeech.pcm ../dataqa351/i60_177wb_contspeech.pcm
-diff ../dataqa350/i30_178wb_contspeech.pcm ../dataqa351/i30_178wb_contspeech.pcm
-diff ../dataqa350/i60_178wb_contspeech.pcm ../dataqa351/i60_178wb_contspeech.pcm
-diff ../dataqa350/i30_179wb_contspeech.pcm ../dataqa351/i30_179wb_contspeech.pcm
-diff ../dataqa350/i60_179wb_contspeech.pcm ../dataqa351/i60_179wb_contspeech.pcm
-diff ../dataqa350/i30_180wb_contspeech.pcm ../dataqa351/i30_180wb_contspeech.pcm
-diff ../dataqa350/i60_180wb_contspeech.pcm ../dataqa351/i60_180wb_contspeech.pcm
-diff ../dataqa350/a88wb_contspeech.pcm ../dataqa351/a88wb_contspeech.pcm
-diff ../dataqa350/a89wb_contspeech.pcm ../dataqa351/a89wb_contspeech.pcm
-diff ../dataqa350/a90wb_contspeech.pcm ../dataqa351/a90wb_contspeech.pcm
-diff ../dataqa350/i30_181wb_speech_office25db.pcm ../dataqa351/i30_181wb_speech_office25db.pcm
-diff ../dataqa350/i60_181wb_speech_office25db.pcm ../dataqa351/i60_181wb_speech_office25db.pcm
-diff ../dataqa350/i30_182wb_speech_office25db.pcm ../dataqa351/i30_182wb_speech_office25db.pcm
-diff ../dataqa350/i60_182wb_speech_office25db.pcm ../dataqa351/i60_182wb_speech_office25db.pcm
-diff ../dataqa350/i30_183wb_speech_office25db.pcm ../dataqa351/i30_183wb_speech_office25db.pcm
-diff ../dataqa350/i60_183wb_speech_office25db.pcm ../dataqa351/i60_183wb_speech_office25db.pcm
-diff ../dataqa350/i30_184wb_speech_office25db.pcm ../dataqa351/i30_184wb_speech_office25db.pcm
-diff ../dataqa350/i60_184wb_speech_office25db.pcm ../dataqa351/i60_184wb_speech_office25db.pcm
-diff ../dataqa350/i30_185wb_speech_office25db.pcm ../dataqa351/i30_185wb_speech_office25db.pcm
-diff ../dataqa350/i60_185wb_speech_office25db.pcm ../dataqa351/i60_185wb_speech_office25db.pcm
-diff ../dataqa350/i30_186wb_speech_office25db.pcm ../dataqa351/i30_186wb_speech_office25db.pcm
-diff ../dataqa350/i60_186wb_speech_office25db.pcm ../dataqa351/i60_186wb_speech_office25db.pcm
-diff ../dataqa350/a91wb_speech_office25db.pcm ../dataqa351/a91wb_speech_office25db.pcm
-diff ../dataqa350/a92wb_speech_office25db.pcm ../dataqa351/a92wb_speech_office25db.pcm
-diff ../dataqa350/a93wb_speech_office25db.pcm ../dataqa351/a93wb_speech_office25db.pcm
-diff ../dataqa350/a30_1DTMF_16kHz_short.pcm ../dataqa351/a30_1DTMF_16kHz_short.pcm
-diff ../dataqa350/a60_1DTMF_16kHz_short.pcm ../dataqa351/a60_1DTMF_16kHz_short.pcm
-diff ../dataqa350/a30_2ltest_speech_noisy.pcm ../dataqa351/a30_2ltest_speech_noisy.pcm
-diff ../dataqa350/a60_2ltest_speech_noisy.pcm ../dataqa351/a60_2ltest_speech_noisy.pcm
-diff ../dataqa350/a30_3misc2.pcm ../dataqa351/a30_3misc2.pcm
-diff ../dataqa350/a60_3misc2.pcm ../dataqa351/a60_3misc2.pcm
-diff ../dataqa350/a30_4sinesweep.pcm ../dataqa351/a30_4sinesweep.pcm
-diff ../dataqa350/a60_4sinesweep.pcm ../dataqa351/a60_4sinesweep.pcm
-diff ../dataqa350/a30_5speechmusic.pcm ../dataqa351/a30_5speechmusic.pcm
-diff ../dataqa350/a60_5speechmusic.pcm ../dataqa351/a60_5speechmusic.pcm
-diff ../dataqa350/a30_6tone_cisco.pcm ../dataqa351/a30_6tone_cisco.pcm
-diff ../dataqa350/a60_6tone_cisco.pcm ../dataqa351/a60_6tone_cisco.pcm
-diff ../dataqa350/a60_7tone_cisco.pcm ../dataqa351/a60_7tone_cisco.pcm
diff --git a/modules/audio_coding/codecs/isac/fix/test/QA/diffiSACPLC.txt b/modules/audio_coding/codecs/isac/fix/test/QA/diffiSACPLC.txt
deleted file mode 100644
index 9e3629b..0000000
--- a/modules/audio_coding/codecs/isac/fix/test/QA/diffiSACPLC.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-#!/bin/bash
-(set -o igncr) 2>/dev/null && set -o igncr; # force bash to ignore \r character
-
-LOGFILE=logplc.txt
-echo "START PLC TEST" > $LOGFILE
-
-OUTDIR1=../dataqaplc_0
-OUTDIR2=../dataqaplc_1
-
-diff $OUTDIR1/outplc1.pcm $OUTDIR2/outplc1.pcm 
-diff $OUTDIR1/outplc2.pcm $OUTDIR2/outplc2.pcm 
-diff $OUTDIR1/outplc3.pcm $OUTDIR2/outplc3.pcm 
-diff $OUTDIR1/outplc4.pcm $OUTDIR2/outplc4.pcm 
-diff $OUTDIR1/outplc5.pcm $OUTDIR2/outplc5.pcm 
-diff $OUTDIR1/outplc6.pcm $OUTDIR2/outplc6.pcm 
-
-echo DONE!
-
-
-
diff --git a/modules/audio_coding/codecs/isac/fix/test/QA/runiSACLongtest.txt b/modules/audio_coding/codecs/isac/fix/test/QA/runiSACLongtest.txt
deleted file mode 100644
index eeffc0c..0000000
--- a/modules/audio_coding/codecs/isac/fix/test/QA/runiSACLongtest.txt
+++ /dev/null
@@ -1,61 +0,0 @@
-#!/bin/bash
-(set -o igncr) 2>/dev/null && set -o igncr; # force bash to ignore \r character
-
-LOGFILE=logNormal.txt
-echo "START ISAC TEST" > $LOGFILE
-echo >> $LOGFILE
-
-ISAC=../Release/kenny.exe
-ISACFIXFLOAT=../Release/testFixFloat.exe
-
-INFILES=$(cat InputFiles.txt)
-SUBSET=$(cat InputFilesFew.txt)
-CHANNELFILES=$(cat ChannelFiles.txt)
-CHANNELLIST=($(cat ChannelFiles.txt))
-INDIR=../data/orig
-OUTDIR=../dataqa
-mkdir -p $OUTDIR
-
-TARGETRATE=(10000 15000 20000 25000 30000 32000)
-#echo ${CHANNELFILES[1]}
-
-index1=0
-index2=0
-
-for file in $INFILES # loop over all input files
-  do
-  
-  for rate in ${TARGETRATE[*]}
-	do
-	let "index1=index1+1"
-	$ISAC -I $rate -FL 30 $INDIR/"$file" $OUTDIR/i30_$index1"$file" >> $LOGFILE
-	$ISAC -I $rate -FL 60 $INDIR/"$file" $OUTDIR/i60_$index1"$file" >> $LOGFILE
-  done
-  for channel in $CHANNELFILES
-	do
-	let "index2=index2+1"
-	$ISAC $INDIR/$channel $INDIR/"$file" $OUTDIR/a$index2"$file" >> $LOGFILE
-  done
-
-done
-
-index1=0
-
-for file in $SUBSET # loop over the subset of input files
-  do
-	let "index1=index1+1"
-	$ISAC $INDIR/${CHANNELLIST[0]} -FL 30 -FIXED_FL $INDIR/"$file" $OUTDIR/a30_$index1"$file" >> $LOGFILE
-	$ISAC $INDIR/${CHANNELLIST[0]} -FL 60 -FIXED_FL $INDIR/"$file" $OUTDIR/a60_$index1"$file" >> $LOGFILE
-done
-
-let "index1=index1+1"	
- $ISAC $INDIR/${CHANNELLIST[0]} -INITRATE 25000 -FL 30 $INDIR/"$file" $OUTDIR/a60_$index1"$file" >> $LOGFILE
-
-# Run fault test
-
-#./runiSACfault.txt
-
-echo DONE!
-
-
-
diff --git a/modules/audio_coding/codecs/isac/fix/test/QA/runiSACNB.txt b/modules/audio_coding/codecs/isac/fix/test/QA/runiSACNB.txt
deleted file mode 100644
index 605595c..0000000
--- a/modules/audio_coding/codecs/isac/fix/test/QA/runiSACNB.txt
+++ /dev/null
@@ -1,45 +0,0 @@
-#!/bin/bash
-(set -o igncr) 2>/dev/null && set -o igncr; # force bash to ignore \r character
-
-LOGFILE=logNB.txt
-echo "START NARROWBAND TEST" > $LOGFILE
-echo >> $LOGFILE
-
-ISAC=../Release/kenny.exe
-ISACFIXFLOAT=../Release/testFixFloat.exe
-
-INFILES=$(cat InputFiles.txt)
-SUBSET=$(cat InputFilesFew.txt)
-CHANNELFILES=$(cat ChannelFiles.txt)
-CHANNELLIST=($(cat ChannelFiles.txt))
-INDIR=../data/orig
-OUTDIR=../dataqaNB
-mkdir -p $OUTDIR
-
-TARGETRATE=(10000 15000 20000 25000 30000 32000)
-#echo ${CHANNELFILES[1]}
-
-index1=0
-index2=0
-
-# Narrowband Interfaces
-
-for file in $SUBSET # loop over all input files
-  do
-  for rate in ${TARGETRATE[*]}
-	do
-	let "index1=index1+1"
- 	$ISAC $rate -FL 30 -NB 1 $INDIR/"$file" $OUTDIR/nb130_$index1"$file" >> $LOGFILE
-	$ISAC $rate -FL 60 -NB 1 $INDIR/"$file" $OUTDIR/nb160_$index1"$file" >> $LOGFILE
-	$ISAC $rate -FL 30 -NB 2 $INDIR/"$file" $OUTDIR/nb230_$index1"$file" >> $LOGFILE
-	$ISAC $rate -FL 60 -NB 2 $INDIR/"$file" $OUTDIR/nb260_$index1"$file" >> $LOGFILE
-	$ISAC $rate -FL 30 -NB 2 -PL 10 $INDIR/"$file" $OUTDIR/nb2plc30_$index1"$file" >> $LOGFILE
-	$ISAC $rate -FL 60 -NB 2 -PL 10 $INDIR/"$file" $OUTDIR/nb2plc60_$index1"$file" >> $LOGFILE
-  done
-
-done
-
-echo DONE!
-
-
-
diff --git a/modules/audio_coding/codecs/isac/fix/test/QA/runiSACPLC.txt b/modules/audio_coding/codecs/isac/fix/test/QA/runiSACPLC.txt
deleted file mode 100644
index 6bee6f7..0000000
--- a/modules/audio_coding/codecs/isac/fix/test/QA/runiSACPLC.txt
+++ /dev/null
@@ -1,23 +0,0 @@
-#!/bin/bash
-(set -o igncr) 2>/dev/null && set -o igncr; # force bash to ignore \r character
-
-LOGFILE=logplc.txt
-echo "START PLC TEST" > $LOGFILE
-
-ISAC=../Release/kenny.exe
-
-INDIR=../data/orig
-OUTDIR=../dataqaplc_0
-mkdir -p $OUTDIR
-
-$ISAC 12000 -PL 15 $INDIR/speechmusic.pcm $OUTDIR/outplc1.pcm 
-$ISAC 20000 -PL 15 $INDIR/speechmusic.pcm $OUTDIR/outplc2.pcm 
-$ISAC 32000 -PL 15 $INDIR/speechmusic.pcm $OUTDIR/outplc3.pcm 
-$ISAC 12000 -PL 15 $INDIR/tone_cisco.pcm $OUTDIR/outplc4.pcm 
-$ISAC 20000 -PL 15 $INDIR/tone_cisco.pcm $OUTDIR/outplc5.pcm 
-$ISAC 32000 -PL 15 $INDIR/tone_cisco.pcm $OUTDIR/outplc6.pcm 
-
-echo DONE!
-
-
-
diff --git a/modules/audio_coding/codecs/isac/fix/test/QA/runiSACRate.txt b/modules/audio_coding/codecs/isac/fix/test/QA/runiSACRate.txt
deleted file mode 100644
index d8403e0..0000000
--- a/modules/audio_coding/codecs/isac/fix/test/QA/runiSACRate.txt
+++ /dev/null
@@ -1,23 +0,0 @@
-#!/bin/bash
-(set -o igncr) 2>/dev/null && set -o igncr; # force bash to ignore \r character
-
-LOGG=loggRate.txt
-OUTDIR=../dataqaRate
-mkdir -p $OUTDIR
-
-../Release/kenny.exe 13000 -FIXED_FL -FL 30 -MAX 100 ../data/orig/sawsweep_380_60.pcm $OUTDIR/out_napi_1.pcm > $LOGG
-../Release/kenny.exe ../data/orig/bottlenecks.txt -FIXED_FL -FL 30 -MAXRATE 32000 ../data/orig/sawsweep_380_60.pcm $OUTDIR/out_napi_2.pcm >> $LOGG
-../Release/kenny.exe 13000 -FIXED_FL -FL 30 -MAX 100 ../data/orig/sawsweep_380_60.pcm $OUTDIR/out_napi_3.pcm >> $LOGG
-../Release/kenny.exe ../data/orig/bottlenecks.txt -FIXED_FL -FL 30 -MAXRATE 32000 ../data/orig/sawsweep_380_60.pcm $OUTDIR/out_napi_4.pcm >> $LOGG
-../Release/kenny.exe 13000 -FIXED_FL -FL 60 -MAX 100 ../data/orig/sawsweep_380_60.pcm $OUTDIR/out_napi_5.pcm >> $LOGG
-../Release/kenny.exe ../data/orig/bottlenecks.txt -FIXED_FL -FL 60 -MAXRATE 32000 ../data/orig/sawsweep_380_60.pcm $OUTDIR/out_napi_6.pcm >> $LOGG
-../Release/kenny.exe 13000 -INIT_RATE 32000 -FIXED_FL -FL 60 -MAX 100 ../data/orig/sawsweep_380_60.pcm $OUTDIR/out_napi_7.pcm >> $LOGG
-
-../Release/kenny.exe 13000 -FIXED_FL -FL 30 -MAX 100 ../data/orig/longspeech.pcm $OUTDIR/out_napi_11.pcm >> $LOGG
-../Release/kenny.exe ../data/orig/bottlenecks.txt -FIXED_FL -FL 30 -MAXRATE 32000 ../data/orig/longspeech.pcm $OUTDIR/out_napi_12.pcm >> $LOGG
-../Release/kenny.exe 13000 -FIXED_FL -FL 30 -MAX 100 ../data/orig/longspeech.pcm $OUTDIR/out_napi_13.pcm >> $LOGG
-../Release/kenny.exe ../data/orig/bottlenecks.txt -FIXED_FL -FL 30 -MAXRATE 32000 ../data/orig/longspeech.pcm $OUTDIR/out_napi_14.pcm >> $LOGG
-../Release/kenny.exe 13000 -FIXED_FL -FL 60 -MAX 100 ../data/orig/longspeech.pcm $OUTDIR/out_napi_15.pcm >> $LOGG
-../Release/kenny.exe ../data/orig/bottlenecks.txt -FIXED_FL -FL 60 -MAXRATE 32000 ../data/orig/longspeech.pcm $OUTDIR/out_napi_16.pcm >> $LOGG
-../Release/kenny.exe 13000 -INIT_RATE 32000 -FIXED_FL -FL 60 -MAX 100 ../data/orig/longspeech.pcm $OUTDIR/out_napi_17.pcm >> $LOGG
-
diff --git a/modules/audio_coding/codecs/isac/fix/test/QA/runiSACfault.txt b/modules/audio_coding/codecs/isac/fix/test/QA/runiSACfault.txt
deleted file mode 100644
index f4d9478..0000000
--- a/modules/audio_coding/codecs/isac/fix/test/QA/runiSACfault.txt
+++ /dev/null
@@ -1,40 +0,0 @@
-#!/bin/bash
-(set -o igncr) 2>/dev/null && set -o igncr; # force bash to ignore \r character
-
-LOGFILE=logfault.txt
-echo "START FAULT TEST" > $LOGFILE
-
-ISAC=../Release/kenny.exe
-ISACFIXFLOAT=../Release/testFixFloat.exe
-
-INFILES=$(cat InputFiles.txt)
-SUBSET=$(cat InputFilesFew.txt)
-CHANNELFILES=$(cat ChannelFiles.txt)
-CHANNELLIST=($(cat ChannelFiles.txt))
-INDIR=../data/orig
-OUTDIR=../dataqaft
-mkdir -p $OUTDIR
-
-TARGETRATE=(10000 15000 20000 25000 30000 32000)
-FAULTTEST=(1 2 3 4 5 6 7 9)
-
-index1=0
-
-file=wb_contspeech.pcm
-
-# Fault test
-for testnr in ${FAULTTEST[*]}
-   do
-	$ISAC 32000 -F $testnr $INDIR/"$file" $OUTDIR/ft$testnr"$file" >> $LOGFILE
-done
-
-# Fault test number 10, error in bitstream
- $ISAC 32000 -F 10 $INDIR/"$file" $OUTDIR/ft10_"$file" >> $LOGFILE
- $ISAC 32000 -F 10 -PL 10 $INDIR/"$file" $OUTDIR/ft10plc_"$file" >> $LOGFILE
- $ISAC 32000 -F 10 -NB 1 $INDIR/"$file" $OUTDIR/ft10nb1_"$file" >> $LOGFILE
- $ISAC 32000 -F 10 -NB 2 -PL 10 $INDIR/"$file" $OUTDIR/ft10nb2_"$file" >> $LOGFILE
-
-echo DONE!
-
-
-
diff --git a/modules/audio_coding/codecs/isac/fix/test/QA/runiSACfixfloat.txt b/modules/audio_coding/codecs/isac/fix/test/QA/runiSACfixfloat.txt
deleted file mode 100644
index c9e02df..0000000
--- a/modules/audio_coding/codecs/isac/fix/test/QA/runiSACfixfloat.txt
+++ /dev/null
@@ -1,47 +0,0 @@
-#!/bin/bash
-(set -o igncr) 2>/dev/null && set -o igncr; # force bash to ignore \r character
-
-LOGFILE=logfxfl.txt
-echo "START FIX-FLOAT TEST" > $LOGFILE
-
-
-ISACFIXFLOAT=../testFixFloat.exe
-
-INFILES=$(cat InputFiles.txt)
-SUBSET=$(cat InputFilesFew.txt)
-CHANNELFILES=$(cat ChannelFiles.txt)
-CHANNELLIST=($(cat ChannelFiles.txt))
-INDIR=../data/orig
-OUTDIR=../dataqafxfl
-mkdir -p $OUTDIR
-
-index1=0
-
-for file in $INFILES # loop over all input files
-  do
-  
-  for channel in $CHANNELFILES
-	do
-	let "index1=index1+1"
-
-	$ISACFIXFLOAT $INDIR/$channel -m 1 -PLC $INDIR/"$file" $OUTDIR/flfx$index1"$file" >> $LOGFILE
-	$ISACFIXFLOAT $INDIR/$channel -m 2 -PLC $INDIR/"$file" $OUTDIR/fxfl$index1"$file" >> $LOGFILE
-  done
-
-done
-
-index1=0
-
-for file in $SUBSET # loop over the subset of input files
-  do
-	let "index1=index1+1"
-	$ISACFIXFLOAT $INDIR/$channel -m 1 -NB 1 $INDIR/"$file" $OUTDIR/flfxnb1_$index1"$file" >> $LOGFILE
-	$ISACFIXFLOAT $INDIR/$channel -m 2 -NB 1 $INDIR/"$file" $OUTDIR/fxflnb1_$index1"$file" >> $LOGFILE
-	$ISACFIXFLOAT $INDIR/$channel -m 1 -NB 2 -PLC $INDIR/"$file" $OUTDIR/flfxnb2_$index1"$file" >> $LOGFILE
-	$ISACFIXFLOAT $INDIR/$channel -m 2 -NB 2 -PLC $INDIR/"$file" $OUTDIR/fxflnb2_$index1"$file" >> $LOGFILE
-done
-
-echo DONE!
-
-
-
diff --git a/modules/audio_coding/codecs/isac/fix/test/isac_speed_test.cc b/modules/audio_coding/codecs/isac/fix/test/isac_speed_test.cc
deleted file mode 100644
index 276eb60..0000000
--- a/modules/audio_coding/codecs/isac/fix/test/isac_speed_test.cc
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- *  Copyright (c) 2014 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/codecs/isac/fix/include/isacfix.h"
-#include "webrtc/modules/audio_coding/codecs/isac/fix/source/settings.h"
-#include "webrtc/modules/audio_coding/codecs/tools/audio_codec_speed_test.h"
-
-using ::std::string;
-
-namespace webrtc {
-
-static const int kIsacBlockDurationMs = 30;
-static const int kIsacInputSamplingKhz = 16;
-static const int kIsacOutputSamplingKhz = 16;
-
-class IsacSpeedTest : public AudioCodecSpeedTest {
- protected:
-  IsacSpeedTest();
-  void SetUp() override;
-  void TearDown() override;
-  float EncodeABlock(int16_t* in_data, uint8_t* bit_stream,
-                     size_t max_bytes, size_t* encoded_bytes) override;
-  float DecodeABlock(const uint8_t* bit_stream, size_t encoded_bytes,
-                     int16_t* out_data) override;
-  ISACFIX_MainStruct *ISACFIX_main_inst_;
-};
-
-IsacSpeedTest::IsacSpeedTest()
-    : AudioCodecSpeedTest(kIsacBlockDurationMs,
-                          kIsacInputSamplingKhz,
-                          kIsacOutputSamplingKhz),
-      ISACFIX_main_inst_(NULL) {
-}
-
-void IsacSpeedTest::SetUp() {
-  AudioCodecSpeedTest::SetUp();
-
-  // Check whether the allocated buffer for the bit stream is large enough.
-  EXPECT_GE(max_bytes_, static_cast<size_t>(STREAM_MAXW16_60MS));
-
-  // Create encoder memory.
-  EXPECT_EQ(0, WebRtcIsacfix_Create(&ISACFIX_main_inst_));
-  EXPECT_EQ(0, WebRtcIsacfix_EncoderInit(ISACFIX_main_inst_, 1));
-  WebRtcIsacfix_DecoderInit(ISACFIX_main_inst_);
-  // Set bitrate and block length.
-  EXPECT_EQ(0, WebRtcIsacfix_Control(ISACFIX_main_inst_, bit_rate_,
-                                     block_duration_ms_));
-}
-
-void IsacSpeedTest::TearDown() {
-  AudioCodecSpeedTest::TearDown();
-  // Free memory.
-  EXPECT_EQ(0, WebRtcIsacfix_Free(ISACFIX_main_inst_));
-}
-
-float IsacSpeedTest::EncodeABlock(int16_t* in_data, uint8_t* bit_stream,
-                                  size_t max_bytes, size_t* encoded_bytes) {
-  // ISAC takes 10 ms everycall
-  const int subblocks = block_duration_ms_ / 10;
-  const int subblock_length = 10 * input_sampling_khz_;
-  int value = 0;
-
-  clock_t clocks = clock();
-  size_t pointer = 0;
-  for (int idx = 0; idx < subblocks; idx++, pointer += subblock_length) {
-    value = WebRtcIsacfix_Encode(ISACFIX_main_inst_, &in_data[pointer],
-                                 bit_stream);
-    if (idx == subblocks - 1)
-      EXPECT_GT(value, 0);
-    else
-      EXPECT_EQ(0, value);
-  }
-  clocks = clock() - clocks;
-  *encoded_bytes = static_cast<size_t>(value);
-  assert(*encoded_bytes <= max_bytes);
-  return 1000.0 * clocks / CLOCKS_PER_SEC;
-}
-
-float IsacSpeedTest::DecodeABlock(const uint8_t* bit_stream,
-                                  size_t encoded_bytes,
-                                  int16_t* out_data) {
-  int value;
-  int16_t audio_type;
-  clock_t clocks = clock();
-  value = WebRtcIsacfix_Decode(ISACFIX_main_inst_, bit_stream, encoded_bytes,
-                               out_data, &audio_type);
-  clocks = clock() - clocks;
-  EXPECT_EQ(output_length_sample_, static_cast<size_t>(value));
-  return 1000.0 * clocks / CLOCKS_PER_SEC;
-}
-
-TEST_P(IsacSpeedTest, IsacEncodeDecodeTest) {
-  size_t kDurationSec = 400;  // Test audio length in second.
-  EncodeDecode(kDurationSec);
-}
-
-const coding_param param_set[] =
-    {::std::tr1::make_tuple(1, 32000, string("audio_coding/speech_mono_16kHz"),
-                            string("pcm"), true)};
-
-INSTANTIATE_TEST_CASE_P(AllTest, IsacSpeedTest,
-                        ::testing::ValuesIn(param_set));
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/codecs/isac/fix/test/kenny.cc b/modules/audio_coding/codecs/isac/fix/test/kenny.cc
deleted file mode 100644
index 79a525b..0000000
--- a/modules/audio_coding/codecs/isac/fix/test/kenny.cc
+++ /dev/null
@@ -1,845 +0,0 @@
-/*
- *  Copyright (c) 2012 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 <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <time.h>
-#include <ctype.h>
-
-#include "webrtc/modules/audio_coding/codecs/isac/fix/include/isacfix.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/testsupport/perf_test.h"
-
-// TODO(kma): Clean up the code and change benchmarking the whole codec to
-// separate encoder and decoder.
-
-/* Defines */
-#define SEED_FILE "randseed.txt"  /* Used when running decoder on garbage data */
-#define MAX_FRAMESAMPLES    960   /* max number of samples per frame (= 60 ms frame) */
-#define FRAMESAMPLES_10ms 160   /* number of samples per 10ms frame */
-#define FS           16000 /* sampling frequency (Hz) */
-
-/* Function for reading audio data from PCM file */
-int readframe(int16_t *data, FILE *inp, int length) {
-
-  short k, rlen, status = 0;
-
-  rlen = fread(data, sizeof(int16_t), length, inp);
-  if (rlen < length) {
-    for (k = rlen; k < length; k++)
-      data[k] = 0;
-    status = 1;
-  }
-
-  return status;
-}
-
-// Globals needed because gtest does not provide access to argv.
-// This should be reworked to use flags.
-static int global_argc;
-static char **global_argv;
-
-/* Struct for bottleneck model */
-typedef struct {
-  uint32_t send_time;            /* samples */
-  uint32_t arrival_time;         /* samples */
-  uint32_t sample_count;         /* samples */
-  uint16_t rtp_number;
-} BottleNeckModel;
-
-void get_arrival_time(int current_framesamples,   /* samples */
-                      size_t packet_size,         /* bytes */
-                      int bottleneck,             /* excluding headers; bits/s */
-                      BottleNeckModel *BN_data)
-{
-  const int HeaderSize = 35;
-  int HeaderRate;
-
-  HeaderRate = HeaderSize * 8 * FS / current_framesamples;     /* bits/s */
-
-  /* everything in samples */
-  BN_data->sample_count = BN_data->sample_count + current_framesamples;
-
-  BN_data->arrival_time += static_cast<uint32_t>(
-      ((packet_size + HeaderSize) * 8 * FS) / (bottleneck + HeaderRate));
-  BN_data->send_time += current_framesamples;
-
-  if (BN_data->arrival_time < BN_data->sample_count)
-    BN_data->arrival_time = BN_data->sample_count;
-
-  BN_data->rtp_number++;
-}
-
-void get_arrival_time2(int current_framesamples,
-                       int current_delay,
-                       BottleNeckModel *BN_data)
-{
-  if (current_delay == -1)
-    //dropped packet
-  {
-    BN_data->arrival_time += current_framesamples;
-  }
-  else if (current_delay != -2)
-  {
-    //
-    BN_data->arrival_time += (current_framesamples + ((FS/1000) * current_delay));
-  }
-  //else
-  //current packet has same timestamp as previous packet
-
-  BN_data->rtp_number++;
-}
-
-TEST(IsacFixTest, Kenny) {
-  int argc = global_argc;
-  char **argv = global_argv;
-
-  char inname[100], outname[100],  outbitsname[100], bottleneck_file[100];
-  FILE *inp, *outp, *f_bn, *outbits;
-  int endfile;
-
-  size_t i;
-  int errtype, h = 0, k, packetLossPercent = 0;
-  int16_t CodingMode;
-  int16_t bottleneck;
-  int framesize = 30;           /* ms */
-  int cur_framesmpls, err = 0, lostPackets = 0;
-
-  /* Runtime statistics */
-  double starttime, runtime, length_file;
-
-  int stream_len_int = 0;
-  size_t stream_len = 0;
-  int16_t framecnt;
-  int declen = 0;
-  int16_t shortdata[FRAMESAMPLES_10ms];
-  int16_t decoded[MAX_FRAMESAMPLES];
-  uint16_t streamdata[500];
-  int16_t speechType[1];
-  size_t prevFrameSize = 1;
-  int16_t rateBPS = 0;
-  int16_t fixedFL = 0;
-  int16_t payloadSize = 0;
-  int32_t payloadRate = 0;
-  int setControlBWE = 0;
-  int readLoss;
-  FILE  *plFile = NULL;
-
-  char version_number[20];
-  char tmpBit[5] = ".bit";
-
-  int totalbits =0;
-  int totalsmpls =0;
-  int16_t testNum, testCE;
-
-  FILE *fp_gns = NULL;
-  int gns = 0;
-  int cur_delay = 0;
-  char gns_file[100];
-
-  int nbTest = 0;
-  int16_t lostFrame;
-  float scale = (float)0.7;
-  /* only one structure used for ISAC encoder */
-  ISACFIX_MainStruct *ISAC_main_inst = NULL;
-
-  /* For fault test 10, garbage data */
-  FILE *seedfile;
-  unsigned int random_seed = (unsigned int) time(NULL);//1196764538
-
-  BottleNeckModel       BN_data;
-  f_bn  = NULL;
-
-  readLoss = 0;
-  packetLossPercent = 0;
-
-  /* Handling wrong input arguments in the command line */
-  if ((argc<3) || (argc>21))  {
-    printf("\n\nWrong number of arguments or flag values.\n\n");
-
-    printf("\n");
-    WebRtcIsacfix_version(version_number);
-    printf("iSAC version %s \n\n", version_number);
-
-    printf("Usage:\n\n");
-    printf("%s [-F num][-I] bottleneck_value infile outfile \n\n", argv[0]);
-    printf("with:\n");
-    printf("[-I]             :if -I option is specified, the coder will use\n");
-    printf("                  an instantaneous Bottleneck value. If not, it\n");
-    printf("                  will be an adaptive Bottleneck value.\n\n");
-    printf("bottleneck_value :the value of the bottleneck provided either\n");
-    printf("                  as a fixed value (e.g. 25000) or\n");
-    printf("                  read from a file (e.g. bottleneck.txt)\n\n");
-    printf("[-INITRATE num]  :Set a new value for initial rate. Note! Only used"
-           " in adaptive mode.\n\n");
-    printf("[-FL num]        :Set (initial) frame length in msec. Valid length"
-           " are 30 and 60 msec.\n\n");
-    printf("[-FIXED_FL]      :Frame length to be fixed to initial value.\n\n");
-    printf("[-MAX num]       :Set the limit for the payload size of iSAC"
-           " in bytes. \n");
-    printf("                  Minimum 100, maximum 400.\n\n");
-    printf("[-MAXRATE num]   :Set the maxrate for iSAC in bits per second. \n");
-    printf("                  Minimum 32000, maximum 53400.\n\n");
-    printf("[-F num]         :if -F option is specified, the test function\n");
-    printf("                  will run the iSAC API fault scenario specified"
-           " by the\n");
-    printf("                  supplied number.\n");
-    printf("                  F 1 - Call encoder prior to init encoder call\n");
-    printf("                  F 2 - Call decoder prior to init decoder call\n");
-    printf("                  F 3 - Call decoder prior to encoder call\n");
-    printf("                  F 4 - Call decoder with a too short coded"
-           " sequence\n");
-    printf("                  F 5 - Call decoder with a too long coded"
-           " sequence\n");
-    printf("                  F 6 - Call decoder with random bit stream\n");
-    printf("                  F 7 - Call init encoder/decoder at random"
-           " during a call\n");
-    printf("                  F 8 - Call encoder/decoder without having"
-           " allocated memory for \n");
-    printf("                        encoder/decoder instance\n");
-    printf("                  F 9 - Call decodeB without calling decodeA\n");
-    printf("                  F 10 - Call decodeB with garbage data\n");
-    printf("[-PL num]       : if -PL option is specified 0<num<100 will "
-           "specify the\n");
-    printf("                  percentage of packet loss\n\n");
-    printf("[-G file]       : if -G option is specified the file given is"
-           " a .gns file\n");
-    printf("                  that represents a network profile\n\n");
-    printf("[-NB num]       : if -NB option, use the narrowband interfaces\n");
-    printf("                  num=1 => encode with narrowband encoder"
-           " (infile is narrowband)\n");
-    printf("                  num=2 => decode with narrowband decoder"
-           " (outfile is narrowband)\n\n");
-    printf("[-CE num]       : Test of APIs used by Conference Engine.\n");
-    printf("                  CE 1 - createInternal, freeInternal,"
-           " getNewBitstream \n");
-    printf("                  CE 2 - transcode, getBWE \n");
-    printf("                  CE 3 - getSendBWE, setSendBWE.  \n\n");
-    printf("[-RTP_INIT num] : if -RTP_INIT option is specified num will be"
-           " the initial\n");
-    printf("                  value of the rtp sequence number.\n\n");
-    printf("infile          : Normal speech input file\n\n");
-    printf("outfile         : Speech output file\n\n");
-    printf("Example usage   : \n\n");
-    printf("%s -I bottleneck.txt speechIn.pcm speechOut.pcm\n\n", argv[0]);
-    exit(1);
-
-  }
-
-  /* Print version number */
-  WebRtcIsacfix_version(version_number);
-  printf("iSAC version %s \n\n", version_number);
-
-  /* Loop over all command line arguments */
-  CodingMode = 0;
-  testNum = 0;
-  testCE = 0;
-  for (i = 1; i + 2 < static_cast<size_t>(argc); i++) {
-    /* Instantaneous mode */
-    if (!strcmp ("-I", argv[i])) {
-      printf("\nInstantaneous BottleNeck\n");
-      CodingMode = 1;
-      i++;
-    }
-
-    /* Set (initial) bottleneck value */
-    if (!strcmp ("-INITRATE", argv[i])) {
-      rateBPS = atoi(argv[i + 1]);
-      setControlBWE = 1;
-      if ((rateBPS < 10000) || (rateBPS > 32000)) {
-        printf("\n%d is not a initial rate. "
-               "Valid values are in the range 10000 to 32000.\n", rateBPS);
-        exit(1);
-      }
-      printf("\nNew initial rate: %d\n", rateBPS);
-      i++;
-    }
-
-    /* Set (initial) framelength */
-    if (!strcmp ("-FL", argv[i])) {
-      framesize = atoi(argv[i + 1]);
-      if ((framesize != 30) && (framesize != 60)) {
-        printf("\n%d is not a valid frame length. "
-               "Valid length are 30 and 60 msec.\n", framesize);
-        exit(1);
-      }
-      printf("\nFrame Length: %d\n", framesize);
-      i++;
-    }
-
-    /* Fixed frame length */
-    if (!strcmp ("-FIXED_FL", argv[i])) {
-      fixedFL = 1;
-      setControlBWE = 1;
-    }
-
-    /* Set maximum allowed payload size in bytes */
-    if (!strcmp ("-MAX", argv[i])) {
-      payloadSize = atoi(argv[i + 1]);
-      printf("Maximum Payload Size: %d\n", payloadSize);
-      i++;
-    }
-
-    /* Set maximum rate in bytes */
-    if (!strcmp ("-MAXRATE", argv[i])) {
-      payloadRate = atoi(argv[i + 1]);
-      printf("Maximum Rate in kbps: %d\n", payloadRate);
-      i++;
-    }
-
-    /* Test of fault scenarious */
-    if (!strcmp ("-F", argv[i])) {
-      testNum = atoi(argv[i + 1]);
-      printf("\nFault test: %d\n", testNum);
-      if (testNum < 1 || testNum > 10) {
-        printf("\n%d is not a valid Fault Scenario number."
-               " Valid Fault Scenarios are numbered 1-10.\n", testNum);
-        exit(1);
-      }
-      i++;
-    }
-
-    /* Packet loss test */
-    if (!strcmp ("-PL", argv[i])) {
-      if( isdigit( *argv[i+1] ) ) {
-        packetLossPercent = atoi( argv[i+1] );
-        if( (packetLossPercent < 0) | (packetLossPercent > 100) ) {
-          printf( "\nInvalid packet loss perentage \n" );
-          exit( 1 );
-        }
-        if( packetLossPercent > 0 ) {
-          printf( "\nSimulating %d %% of independent packet loss\n",
-                  packetLossPercent );
-        } else {
-          printf( "\nNo Packet Loss Is Simulated \n" );
-        }
-        readLoss = 0;
-      } else {
-        readLoss = 1;
-        plFile = fopen( argv[i+1], "rb" );
-        if( plFile == NULL ) {
-          FAIL() << "Couldn't open the frameloss file: " << argv[i+1];
-        }
-        printf( "\nSimulating packet loss through the given "
-                "channel file: %s\n", argv[i+1] );
-      }
-      i++;
-    }
-
-    /* Random packetlosses */
-    if (!strcmp ("-rnd", argv[i])) {
-      srand(time(NULL) );
-      printf( "\n Random pattern in lossed packets \n" );
-    }
-
-    /* Use gns file */
-    if (!strcmp ("-G", argv[i])) {
-      sscanf(argv[i + 1], "%s", gns_file);
-      fp_gns = fopen(gns_file, "rb");
-      if (fp_gns  == NULL) {
-        FAIL() << "Cannot read file " << gns_file << ".";
-      }
-      gns = 1;
-      i++;
-    }
-
-    /* Run Narrowband interfaces (either encoder or decoder) */
-    if (!strcmp ("-NB", argv[i])) {
-      nbTest = atoi(argv[i + 1]);
-      i++;
-    }
-
-    /* Run Conference Engine APIs */
-    if (!strcmp ("-CE", argv[i])) {
-      testCE = atoi(argv[i + 1]);
-      if (testCE==1 || testCE==2) {
-        i++;
-        scale = (float)atof( argv[i+1] );
-      } else if (testCE < 1 || testCE > 3) {
-        printf("\n%d is not a valid CE-test number, valid Fault "
-               "Scenarios are numbered 1-3\n", testCE);
-        exit(1);
-      }
-      i++;
-    }
-
-    /* Set initial RTP number */
-    if (!strcmp ("-RTP_INIT", argv[i])) {
-      i++;
-    }
-  }
-
-  /* Get Bottleneck value                                                   */
-  /* Gns files and bottleneck should not and can not be used simultaneously */
-  bottleneck = atoi(argv[CodingMode+1]);
-  if (bottleneck == 0 && gns == 0) {
-    sscanf(argv[CodingMode+1], "%s", bottleneck_file);
-    f_bn = fopen(bottleneck_file, "rb");
-    if (f_bn  == NULL) {
-      printf("No value provided for BottleNeck\n");
-      FAIL() << "Cannot read file " << bottleneck_file;
-    } else {
-      int aux_var;
-      printf("reading bottleneck rates from file %s\n\n",bottleneck_file);
-      if (fscanf(f_bn, "%d", &aux_var) == EOF) {
-        /* Set pointer to beginning of file */
-        fseek(f_bn, 0L, SEEK_SET);
-        if (fscanf(f_bn, "%d", &aux_var) == EOF) {
-          FAIL();
-        }
-      }
-      bottleneck = (int16_t)aux_var;
-      /* Bottleneck is a cosine function
-       * Matlab code for writing the bottleneck file:
-       * BottleNeck_10ms = 20e3 + 10e3 * cos((0:5999)/5999*2*pi);
-       * fid = fopen('bottleneck.txt', 'wb');
-       * fprintf(fid, '%d\n', BottleNeck_10ms); fclose(fid);
-       */
-    }
-  } else {
-    f_bn = NULL;
-    printf("\nfixed bottleneck rate of %d bits/s\n\n", bottleneck);
-  }
-
-  if (CodingMode == 0) {
-    printf("\nAdaptive BottleNeck\n");
-  }
-
-  /* Get Input and Output files */
-  sscanf(argv[argc-2], "%s", inname);
-  sscanf(argv[argc-1], "%s", outname);
-
-  /* Add '.bit' to output bitstream file */
-  while ((int)outname[h] != 0) {
-    outbitsname[h] = outname[h];
-    h++;
-  }
-  for (k=0; k<5; k++) {
-    outbitsname[h] = tmpBit[k];
-    h++;
-  }
-  if ((inp = fopen(inname,"rb")) == NULL) {
-    FAIL() << "  iSAC: Cannot read file " << inname;
-  }
-  if ((outp = fopen(outname,"wb")) == NULL) {
-    FAIL() << "  iSAC: Cannot write file " << outname;
-  }
-
-  if ((outbits = fopen(outbitsname,"wb")) == NULL) {
-    FAIL() << "  iSAC: Cannot write file " << outbitsname;
-  }
-  printf("\nInput:%s\nOutput:%s\n\n", inname, outname);
-
-  /* Error test number 10, garbage data */
-  if (testNum == 10) {
-    /* Test to run decoder with garbage data */
-    srand(random_seed);
-
-    if ( (seedfile = fopen(SEED_FILE, "a+t") ) == NULL ) {
-      printf("Error: Could not open file %s\n", SEED_FILE);
-    }
-    else {
-      fprintf(seedfile, "%u\n", random_seed);
-      fclose(seedfile);
-    }
-  }
-
-  /* Runtime statistics */
-  starttime = clock()/(double)CLOCKS_PER_SEC;
-
-  /* Initialize the ISAC and BN structs */
-  if (testNum != 8)
-  {
-    if(1){
-      err =WebRtcIsacfix_Create(&ISAC_main_inst);
-    }else{
-      /* Test the Assign functions */
-      int sss;
-      void *ppp;
-      err =WebRtcIsacfix_AssignSize(&sss);
-      ppp=malloc(sss);
-      err =WebRtcIsacfix_Assign(&ISAC_main_inst,ppp);
-    }
-    /* Error check */
-    if (err < 0) {
-      printf("\n\n Error in create.\n\n");
-    }
-    if (testCE == 1) {
-      err = WebRtcIsacfix_CreateInternal(ISAC_main_inst);
-      /* Error check */
-      if (err < 0) {
-        printf("\n\n Error in createInternal.\n\n");
-      }
-    }
-  }
-
-  /* Init of bandwidth data */
-  BN_data.send_time     = 0;
-  BN_data.arrival_time  = 0;
-  BN_data.sample_count  = 0;
-  BN_data.rtp_number    = 0;
-
-  /* Initialize encoder and decoder */
-  framecnt= 0;
-  endfile = 0;
-  if (testNum != 1) {
-    WebRtcIsacfix_EncoderInit(ISAC_main_inst, CodingMode);
-  }
-  if (testNum != 2) {
-    WebRtcIsacfix_DecoderInit(ISAC_main_inst);
-  }
-
-  if (CodingMode == 1) {
-    err = WebRtcIsacfix_Control(ISAC_main_inst, bottleneck, framesize);
-    if (err < 0) {
-      /* exit if returned with error */
-      errtype=WebRtcIsacfix_GetErrorCode(ISAC_main_inst);
-      printf("\n\n Error in control: %d.\n\n", errtype);
-    }
-  } else if(setControlBWE == 1) {
-    err = WebRtcIsacfix_ControlBwe(ISAC_main_inst, rateBPS, framesize, fixedFL);
-  }
-
-  if (payloadSize != 0) {
-    err = WebRtcIsacfix_SetMaxPayloadSize(ISAC_main_inst, payloadSize);
-    if (err < 0) {
-      /* exit if returned with error */
-      errtype=WebRtcIsacfix_GetErrorCode(ISAC_main_inst);
-      FAIL() << "Error in SetMaxPayloadSize: " << errtype;
-    }
-  }
-  if (payloadRate != 0) {
-    err = WebRtcIsacfix_SetMaxRate(ISAC_main_inst, payloadRate);
-    if (err < 0) {
-      /* exit if returned with error */
-      errtype=WebRtcIsacfix_GetErrorCode(ISAC_main_inst);
-      FAIL() << "Error in SetMaxRateInBytes: " << errtype;
-    }
-  }
-
-  *speechType = 1;
-
-
-  while (endfile == 0) {
-
-    if(testNum == 7 && (rand()%2 == 0)) {
-      err = WebRtcIsacfix_EncoderInit(ISAC_main_inst, CodingMode);
-      /* Error check */
-      if (err < 0) {
-        errtype=WebRtcIsacfix_GetErrorCode(ISAC_main_inst);
-        printf("\n\n Error in encoderinit: %d.\n\n", errtype);
-      }
-
-      WebRtcIsacfix_DecoderInit(ISAC_main_inst);
-    }
-
-
-    cur_framesmpls = 0;
-    while (1) {
-      /* Read 10 ms speech block */
-      if (nbTest != 1) {
-        endfile = readframe(shortdata, inp, FRAMESAMPLES_10ms);
-      } else {
-        endfile = readframe(shortdata, inp, (FRAMESAMPLES_10ms/2));
-      }
-
-      if (testNum == 7) {
-        srand(time(NULL));
-      }
-
-      /* iSAC encoding */
-      if (!(testNum == 3 && framecnt == 0)) {
-        if (nbTest != 1) {
-          short bwe;
-
-          /* Encode */
-          stream_len_int = WebRtcIsacfix_Encode(ISAC_main_inst,
-                                                shortdata,
-                                                (uint8_t*)streamdata);
-
-          /* If packet is ready, and CE testing, call the different API
-             functions from the internal API. */
-          if (stream_len_int>0) {
-            if (testCE == 1) {
-              err = WebRtcIsacfix_ReadBwIndex(
-                  reinterpret_cast<const uint8_t*>(streamdata),
-                  static_cast<size_t>(stream_len_int),
-                  &bwe);
-              stream_len_int = WebRtcIsacfix_GetNewBitStream(
-                  ISAC_main_inst,
-                  bwe,
-                  scale,
-                  reinterpret_cast<uint8_t*>(streamdata));
-            } else if (testCE == 2) {
-              /* transcode function not supported */
-            } else if (testCE == 3) {
-              /* Only for Function testing. The functions should normally
-                 not be used in this way                                      */
-
-              err = WebRtcIsacfix_GetDownLinkBwIndex(ISAC_main_inst, &bwe);
-              /* Error Check */
-              if (err < 0) {
-                errtype=WebRtcIsacfix_GetErrorCode(ISAC_main_inst);
-                printf("\nError in getSendBWE: %d.\n", errtype);
-              }
-
-              err = WebRtcIsacfix_UpdateUplinkBw(ISAC_main_inst, bwe);
-              /* Error Check */
-              if (err < 0) {
-                errtype=WebRtcIsacfix_GetErrorCode(ISAC_main_inst);
-                printf("\nError in setBWE: %d.\n", errtype);
-              }
-
-            }
-          }
-        } else {
-#ifdef WEBRTC_ISAC_FIX_NB_CALLS_ENABLED
-          stream_len_int = WebRtcIsacfix_EncodeNb(ISAC_main_inst,
-                                                  shortdata,
-                                                  streamdata);
-#else
-          stream_len_int = -1;
-#endif
-        }
-      }
-      else
-      {
-        break;
-      }
-
-      if (stream_len_int < 0 || err < 0) {
-        /* exit if returned with error */
-        errtype=WebRtcIsacfix_GetErrorCode(ISAC_main_inst);
-        printf("\nError in encoder: %d.\n", errtype);
-      } else {
-        stream_len = static_cast<size_t>(stream_len_int);
-        if (fwrite(streamdata, sizeof(char), stream_len, outbits) !=
-            stream_len) {
-          FAIL();
-        }
-      }
-
-      cur_framesmpls += FRAMESAMPLES_10ms;
-
-      /* read next bottleneck rate */
-      if (f_bn != NULL) {
-        int aux_var;
-        if (fscanf(f_bn, "%d", &aux_var) == EOF) {
-          /* Set pointer to beginning of file */
-          fseek(f_bn, 0L, SEEK_SET);
-          if (fscanf(f_bn, "%d", &aux_var) == EOF) {
-            FAIL();
-          }
-        }
-        bottleneck = (int16_t)aux_var;
-        if (CodingMode == 1) {
-          WebRtcIsacfix_Control(ISAC_main_inst, bottleneck, framesize);
-        }
-      }
-
-      /* exit encoder loop if the encoder returned a bitstream */
-      if (stream_len != 0) break;
-    }
-
-    /* make coded sequence to short be inreasing */
-    /* the length the decoder expects */
-    if (testNum == 4) {
-      stream_len += 10;
-    }
-
-    /* make coded sequence to long be decreasing */
-    /* the length the decoder expects */
-    if (testNum == 5) {
-      stream_len -= 10;
-    }
-
-    if (testNum == 6) {
-      srand(time(NULL));
-      for (i = 0; i < stream_len; i++ ) {
-        streamdata[i] = rand();
-      }
-    }
-
-    /* set pointer to beginning of file */
-    if (fp_gns != NULL) {
-      if (fscanf(fp_gns, "%d", &cur_delay) == EOF) {
-        fseek(fp_gns, 0L, SEEK_SET);
-        if (fscanf(fp_gns, "%d", &cur_delay) == EOF) {
-          FAIL();
-        }
-      }
-    }
-
-    /* simulate packet handling through NetEq and the modem */
-    if (!(testNum == 3 && framecnt == 0)) {
-      if (gns == 0) {
-        get_arrival_time(cur_framesmpls, stream_len, bottleneck,
-                         &BN_data);
-      } else {
-        get_arrival_time2(cur_framesmpls, cur_delay, &BN_data);
-      }
-    }
-
-    /* packet not dropped */
-    if (cur_delay != -1) {
-
-      /* Error test number 10, garbage data */
-      if (testNum == 10) {
-        for ( i = 0; i < stream_len; i++) {
-          streamdata[i] = (short) (streamdata[i] + (short) rand());
-        }
-      }
-
-      if (testNum != 9) {
-        err = WebRtcIsacfix_UpdateBwEstimate(
-            ISAC_main_inst,
-            reinterpret_cast<const uint8_t*>(streamdata),
-            stream_len,
-            BN_data.rtp_number,
-            BN_data.send_time,
-            BN_data.arrival_time);
-
-        if (err < 0) {
-          /* exit if returned with error */
-          errtype=WebRtcIsacfix_GetErrorCode(ISAC_main_inst);
-          printf("\nError in decoder: %d.\n", errtype);
-        }
-      }
-
-      if( readLoss == 1 ) {
-        if( fread( &lostFrame, sizeof(int16_t), 1, plFile ) != 1 ) {
-          rewind( plFile );
-        }
-        lostFrame = !lostFrame;
-      } else {
-        lostFrame = (rand()%100 < packetLossPercent);
-      }
-
-
-
-      /* iSAC decoding */
-      if( lostFrame && framecnt >  0) {
-        if (nbTest !=2) {
-          declen = static_cast<int>(
-              WebRtcIsacfix_DecodePlc(ISAC_main_inst, decoded, prevFrameSize));
-        } else {
-#ifdef WEBRTC_ISAC_FIX_NB_CALLS_ENABLED
-          declen = static_cast<int>(WebRtcIsacfix_DecodePlcNb(
-              ISAC_main_inst, decoded, prevFrameSize));
-#else
-          declen = -1;
-#endif
-        }
-        lostPackets++;
-      } else {
-        if (nbTest !=2 ) {
-          size_t FL;
-          /* Call getFramelen, only used here for function test */
-          err = WebRtcIsacfix_ReadFrameLen(
-              reinterpret_cast<const uint8_t*>(streamdata), stream_len, &FL);
-          declen = WebRtcIsacfix_Decode(
-              ISAC_main_inst,
-              reinterpret_cast<const uint8_t*>(streamdata),
-              stream_len,
-              decoded,
-              speechType);
-          /* Error check */
-          if (err < 0 || declen < 0 || FL != static_cast<size_t>(declen)) {
-            errtype=WebRtcIsacfix_GetErrorCode(ISAC_main_inst);
-            printf(
-                "\nError %d in ReadFrameLen (%s), Decode (%s), with FL %zu and "
-                "declen %d.\n",
-                errtype, err < 0 ? "yes" : "no", declen < 0 ? "yes" : "no", FL,
-                declen);
-          }
-          prevFrameSize = static_cast<size_t>(declen/480);
-
-        } else {
-#ifdef WEBRTC_ISAC_FIX_NB_CALLS_ENABLED
-          declen = WebRtcIsacfix_DecodeNb( ISAC_main_inst, streamdata,
-                                           stream_len, decoded, speechType );
-#else
-          declen = -1;
-#endif
-          prevFrameSize = static_cast<size_t>(declen / 240);
-        }
-      }
-
-      if (declen <= 0) {
-        /* exit if returned with error */
-        errtype=WebRtcIsacfix_GetErrorCode(ISAC_main_inst);
-        printf("\nError in decoder: %d.\n", errtype);
-      }
-
-      /* Write decoded speech frame to file */
-      if (fwrite(decoded, sizeof(int16_t),
-                 declen, outp) != (size_t)declen) {
-        FAIL();
-      }
-      //   fprintf( ratefile, "%f \n", stream_len / ( ((double)declen)/
-      // ((double)FS) ) * 8 );
-    } else {
-      lostPackets++;
-    }
-    framecnt++;
-
-    totalsmpls += declen;
-    totalbits += static_cast<int>(8 * stream_len);
-
-    /* Error test number 10, garbage data */
-    if (testNum == 10) {
-      if ( (seedfile = fopen(SEED_FILE, "a+t") ) == NULL ) {
-        printf( "Error: Could not open file %s\n", SEED_FILE);
-      }
-      else {
-        fprintf(seedfile, "ok\n\n");
-        fclose(seedfile);
-      }
-    }
-  }
-  printf("\nLost Frames %d ~ %4.1f%%\n", lostPackets,
-         (double)lostPackets/(double)framecnt*100.0 );
-  printf("\n\ntotal bits                          = %d bits", totalbits);
-  printf("\nmeasured average bitrate              = %0.3f kbits/s",
-         (double)totalbits *(FS/1000) / totalsmpls);
-  printf("\n");
-
-  /* Runtime statistics */
-
-
-  runtime = (double)(((double)clock()/(double)CLOCKS_PER_SEC)-starttime);
-  length_file = ((double)framecnt*(double)declen/FS);
-  printf("\n\nLength of speech file: %.1f s\n", length_file);
-  printf("Time to run iSAC:      %.2f s (%.2f %% of realtime)\n\n",
-         runtime, (100*runtime/length_file));
-  printf("\n\n_______________________________________________\n");
-
-  // Record the results with Perf test tools.
-  webrtc::test::PrintResult("isac", "", "time_per_10ms_frame",
-                            (runtime * 10000) / length_file, "us", false);
-
-  fclose(inp);
-  fclose(outp);
-  fclose(outbits);
-
-  if ( testCE == 1) {
-    WebRtcIsacfix_FreeInternal(ISAC_main_inst);
-  }
-  WebRtcIsacfix_Free(ISAC_main_inst);
-}
-
-int main(int argc, char* argv[]) {
-  ::testing::InitGoogleTest(&argc, argv);
-  global_argc = argc;
-  global_argv = argv;
-
-  return RUN_ALL_TESTS();
-}
diff --git a/modules/audio_coding/codecs/isac/locked_bandwidth_info.cc b/modules/audio_coding/codecs/isac/locked_bandwidth_info.cc
deleted file mode 100644
index 5b9439f..0000000
--- a/modules/audio_coding/codecs/isac/locked_bandwidth_info.cc
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- *  Copyright (c) 2015 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/codecs/isac/locked_bandwidth_info.h"
-
-namespace webrtc {
-
-LockedIsacBandwidthInfo::LockedIsacBandwidthInfo() : ref_count_(0) {
-  bwinfo_.in_use = 0;
-}
-
-LockedIsacBandwidthInfo::~LockedIsacBandwidthInfo() = default;
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/codecs/isac/locked_bandwidth_info.h b/modules/audio_coding/codecs/isac/locked_bandwidth_info.h
deleted file mode 100644
index a0e74b5..0000000
--- a/modules/audio_coding/codecs/isac/locked_bandwidth_info.h
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- *  Copyright (c) 2015 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_CODECS_ISAC_LOCKED_BANDWIDTH_INFO_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_LOCKED_BANDWIDTH_INFO_H_
-
-#include "webrtc/modules/audio_coding/codecs/isac/bandwidth_info.h"
-#include "webrtc/rtc_base/atomicops.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/thread_annotations.h"
-
-namespace webrtc {
-
-// An IsacBandwidthInfo that's safe to access from multiple threads because
-// it's protected by a mutex.
-class LockedIsacBandwidthInfo final {
- public:
-  LockedIsacBandwidthInfo();
-  ~LockedIsacBandwidthInfo();
-
-  IsacBandwidthInfo Get() const {
-    rtc::CritScope lock(&lock_);
-    return bwinfo_;
-  }
-
-  void Set(const IsacBandwidthInfo& bwinfo) {
-    rtc::CritScope lock(&lock_);
-    bwinfo_ = bwinfo;
-  }
-
-  int AddRef() const { return rtc::AtomicOps::Increment(&ref_count_); }
-
-  int Release() const {
-    const int count = rtc::AtomicOps::Decrement(&ref_count_);
-    if (count == 0) {
-      delete this;
-    }
-    return count;
-  }
-
- private:
-  mutable volatile int ref_count_;
-  rtc::CriticalSection lock_;
-  IsacBandwidthInfo bwinfo_ RTC_GUARDED_BY(lock_);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_LOCKED_BANDWIDTH_INFO_H_
diff --git a/modules/audio_coding/codecs/isac/main/include/audio_decoder_isac.h b/modules/audio_coding/codecs/isac/main/include/audio_decoder_isac.h
deleted file mode 100644
index 06821c0..0000000
--- a/modules/audio_coding/codecs/isac/main/include/audio_decoder_isac.h
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- *  Copyright (c) 2015 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_CODECS_ISAC_MAIN_INCLUDE_AUDIO_DECODER_ISAC_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_MAIN_INCLUDE_AUDIO_DECODER_ISAC_H_
-
-#include "webrtc/modules/audio_coding/codecs/isac/audio_decoder_isac_t.h"
-#include "webrtc/modules/audio_coding/codecs/isac/main/source/isac_float_type.h"
-
-namespace webrtc {
-
-using AudioDecoderIsacFloatImpl = AudioDecoderIsacT<IsacFloat>;
-
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_MAIN_INCLUDE_AUDIO_ENCODER_ISAC_H_
diff --git a/modules/audio_coding/codecs/isac/main/include/audio_encoder_isac.h b/modules/audio_coding/codecs/isac/main/include/audio_encoder_isac.h
deleted file mode 100644
index 06bef4c..0000000
--- a/modules/audio_coding/codecs/isac/main/include/audio_encoder_isac.h
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- *  Copyright (c) 2014 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_CODECS_ISAC_MAIN_INCLUDE_AUDIO_ENCODER_ISAC_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_MAIN_INCLUDE_AUDIO_ENCODER_ISAC_H_
-
-#include "webrtc/modules/audio_coding/codecs/isac/audio_encoder_isac_t.h"
-#include "webrtc/modules/audio_coding/codecs/isac/main/source/isac_float_type.h"
-
-namespace webrtc {
-
-using AudioEncoderIsacFloatImpl = AudioEncoderIsacT<IsacFloat>;
-
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_MAIN_INCLUDE_AUDIO_ENCODER_ISAC_H_
diff --git a/modules/audio_coding/codecs/isac/main/include/isac.h b/modules/audio_coding/codecs/isac/main/include/isac.h
deleted file mode 100644
index 327e7f4..0000000
--- a/modules/audio_coding/codecs/isac/main/include/isac.h
+++ /dev/null
@@ -1,724 +0,0 @@
-/*
- *  Copyright (c) 2011 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_CODECS_ISAC_MAIN_INCLUDE_ISAC_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_MAIN_INCLUDE_ISAC_H_
-
-#include <stddef.h>
-
-#include "webrtc/modules/audio_coding/codecs/isac/bandwidth_info.h"
-#include "webrtc/typedefs.h"
-
-typedef struct WebRtcISACStruct    ISACStruct;
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-  /******************************************************************************
-   * WebRtcIsac_AssignSize(...)
-   *
-   * This function returns the size of the ISAC instance, so that the instance
-   * can be created outside iSAC.
-   *
-   * Input:
-   *        - samplingRate      : sampling rate of the input/output audio.
-   *
-   * Output:
-   *        - sizeinbytes       : number of bytes needed to allocate for the
-   *                              instance.
-   *
-   * Return value               : 0 - Ok
-   *                             -1 - Error
-   */
-
-  int16_t WebRtcIsac_AssignSize(
-      int* sizeinbytes);
-
-
-  /******************************************************************************
-   * WebRtcIsac_Assign(...)
-   *
-   * This function assignes the memory already created to the ISAC instance.
-   *
-   * Input:
-   *        - *ISAC_main_inst   : a pointer to the coder instance.
-   *        - samplingRate      : sampling rate of the input/output audio.
-   *        - ISAC_inst_Addr    : the already allocated memory, where we put the
-   *                              iSAC structure.
-   *
-   * Return value               : 0 - Ok
-   *                             -1 - Error
-   */
-
-  int16_t WebRtcIsac_Assign(
-      ISACStruct** ISAC_main_inst,
-      void*        ISAC_inst_Addr);
-
-
-  /******************************************************************************
-   * WebRtcIsac_Create(...)
-   *
-   * This function creates an ISAC instance, which will contain the state
-   * information for one coding/decoding channel.
-   *
-   * Input:
-   *        - *ISAC_main_inst   : a pointer to the coder instance.
-   *
-   * Return value               : 0 - Ok
-   *                             -1 - Error
-   */
-
-  int16_t WebRtcIsac_Create(
-      ISACStruct** ISAC_main_inst);
-
-
-  /******************************************************************************
-   * WebRtcIsac_Free(...)
-   *
-   * This function frees the ISAC instance created at the beginning.
-   *
-   * Input:
-   *        - ISAC_main_inst    : an ISAC instance.
-   *
-   * Return value               : 0 - Ok
-   *                             -1 - Error
-   */
-
-  int16_t WebRtcIsac_Free(
-      ISACStruct* ISAC_main_inst);
-
-
-  /******************************************************************************
-   * WebRtcIsac_EncoderInit(...)
-   *
-   * This function initializes an ISAC instance prior to the encoder calls.
-   *
-   * Input:
-   *        - ISAC_main_inst    : ISAC instance.
-   *        - CodingMode        : 0 -> Bit rate and frame length are
-   *                                automatically adjusted to available bandwidth
-   *                                on transmission channel, just valid if codec
-   *                                is created to work in wideband mode.
-   *                              1 -> User sets a frame length and a target bit
-   *                                rate which is taken as the maximum
-   *                                short-term average bit rate.
-   *
-   * Return value               : 0 - Ok
-   *                             -1 - Error
-   */
-
-  int16_t WebRtcIsac_EncoderInit(
-      ISACStruct* ISAC_main_inst,
-      int16_t CodingMode);
-
-
-  /******************************************************************************
-   * WebRtcIsac_Encode(...)
-   *
-   * This function encodes 10ms audio blocks and inserts it into a package.
-   * Input speech length has 160 samples if operating at 16 kHz sampling
-   * rate, or 320 if operating at 32 kHz sampling rate. The encoder buffers the
-   * input audio until the whole frame is buffered then proceeds with encoding.
-   *
-   *
-   * Input:
-   *        - ISAC_main_inst    : ISAC instance.
-   *        - speechIn          : input speech vector.
-   *
-   * Output:
-   *        - encoded           : the encoded data vector
-   *
-   * Return value:
-   *                            : >0 - Length (in bytes) of coded data
-   *                            :  0 - The buffer didn't reach the chosen
-   *                               frame-size so it keeps buffering speech
-   *                               samples.
-   *                            : -1 - Error
-   */
-
-  int WebRtcIsac_Encode(
-      ISACStruct*        ISAC_main_inst,
-      const int16_t* speechIn,
-      uint8_t* encoded);
-
-
-  /******************************************************************************
-   * WebRtcIsac_DecoderInit(...)
-   *
-   * This function initializes an ISAC instance prior to the decoder calls.
-   *
-   * Input:
-   *        - ISAC_main_inst    : ISAC instance.
-   */
-
-  void WebRtcIsac_DecoderInit(ISACStruct* ISAC_main_inst);
-
-  /******************************************************************************
-   * WebRtcIsac_UpdateBwEstimate(...)
-   *
-   * This function updates the estimate of the bandwidth.
-   *
-   * Input:
-   *        - ISAC_main_inst    : ISAC instance.
-   *        - encoded           : encoded ISAC frame(s).
-   *        - packet_size       : size of the packet.
-   *        - rtp_seq_number    : the RTP number of the packet.
-   *        - send_ts           : the RTP send timestamp, given in samples
-   *        - arr_ts            : the arrival time of the packet (from NetEq)
-   *                              in samples.
-   *
-   * Return value               : 0 - Ok
-   *                             -1 - Error
-   */
-
-  int16_t WebRtcIsac_UpdateBwEstimate(
-      ISACStruct*         ISAC_main_inst,
-      const uint8_t* encoded,
-      size_t         packet_size,
-      uint16_t        rtp_seq_number,
-      uint32_t        send_ts,
-      uint32_t        arr_ts);
-
-
-  /******************************************************************************
-   * WebRtcIsac_Decode(...)
-   *
-   * This function decodes an ISAC frame. At 16 kHz sampling rate, the length
-   * of the output audio could be either 480 or 960 samples, equivalent to
-   * 30 or 60 ms respectively. At 32 kHz sampling rate, the length of the
-   * output audio is 960 samples, which is 30 ms.
-   *
-   * Input:
-   *        - ISAC_main_inst    : ISAC instance.
-   *        - encoded           : encoded ISAC frame(s).
-   *        - len               : bytes in encoded vector.
-   *
-   * Output:
-   *        - decoded           : The decoded vector.
-   *
-   * Return value               : >0 - number of samples in decoded vector.
-   *                              -1 - Error.
-   */
-
-  int WebRtcIsac_Decode(
-      ISACStruct*           ISAC_main_inst,
-      const uint8_t* encoded,
-      size_t         len,
-      int16_t*        decoded,
-      int16_t*        speechType);
-
-
-  /******************************************************************************
-   * WebRtcIsac_DecodePlc(...)
-   *
-   * This function conducts PLC for ISAC frame(s). Output speech length
-   * will be a multiple of frames, i.e. multiples of 30 ms audio. Therefore,
-   * the output is multiple of 480 samples if operating at 16 kHz and multiple
-   * of 960 if operating at 32 kHz.
-   *
-   * Input:
-   *        - ISAC_main_inst    : ISAC instance.
-   *        - noOfLostFrames    : Number of PLC frames to produce.
-   *
-   * Output:
-   *        - decoded           : The decoded vector.
-   *
-   * Return value               : Number of samples in decoded PLC vector
-   */
-
-  size_t WebRtcIsac_DecodePlc(
-      ISACStruct*  ISAC_main_inst,
-      int16_t* decoded,
-      size_t  noOfLostFrames);
-
-
-  /******************************************************************************
-   * WebRtcIsac_Control(...)
-   *
-   * This function sets the limit on the short-term average bit-rate and the
-   * frame length. Should be used only in Instantaneous mode. At 16 kHz sampling
-   * rate, an average bit-rate between 10000 to 32000 bps is valid and a
-   * frame-size of 30 or 60 ms is acceptable. At 32 kHz, an average bit-rate
-   * between 10000 to 56000 is acceptable, and the valid frame-size is 30 ms.
-   *
-   * Input:
-   *        - ISAC_main_inst    : ISAC instance.
-   *        - rate              : limit on the short-term average bit rate,
-   *                              in bits/second.
-   *        - framesize         : frame-size in millisecond.
-   *
-   * Return value               : 0  - ok
-   *                             -1 - Error
-   */
-
-  int16_t WebRtcIsac_Control(
-      ISACStruct*   ISAC_main_inst,
-      int32_t rate,
-      int framesize);
-
-  void WebRtcIsac_SetInitialBweBottleneck(ISACStruct* ISAC_main_inst,
-                                          int bottleneck_bits_per_second);
-
-  /******************************************************************************
-   * WebRtcIsac_ControlBwe(...)
-   *
-   * This function sets the initial values of bottleneck and frame-size if
-   * iSAC is used in channel-adaptive mode. Therefore, this API is not
-   * applicable if the codec is created to operate in super-wideband mode.
-   *
-   * Through this API, users can enforce a frame-size for all values of
-   * bottleneck. Then iSAC will not automatically change the frame-size.
-   *
-   *
-   * Input:
-   *        - ISAC_main_inst    : ISAC instance.
-   *        - rateBPS           : initial value of bottleneck in bits/second
-   *                              10000 <= rateBPS <= 56000 is accepted
-   *                              For default bottleneck set rateBPS = 0
-   *        - frameSizeMs       : number of milliseconds per frame (30 or 60)
-   *        - enforceFrameSize  : 1 to enforce the given frame-size through
-   *                              out the adaptation process, 0 to let iSAC
-   *                              change the frame-size if required.
-   *
-   * Return value               : 0  - ok
-   *                             -1 - Error
-   */
-
-  int16_t WebRtcIsac_ControlBwe(
-      ISACStruct* ISAC_main_inst,
-      int32_t rateBPS,
-      int frameSizeMs,
-      int16_t enforceFrameSize);
-
-
-  /******************************************************************************
-   * WebRtcIsac_ReadFrameLen(...)
-   *
-   * This function returns the length of the frame represented in the packet.
-   *
-   * Input:
-   *        - encoded           : Encoded bit-stream
-   *
-   * Output:
-   *        - frameLength       : Length of frame in packet (in samples)
-   *
-   */
-
-  int16_t WebRtcIsac_ReadFrameLen(
-      ISACStruct*          ISAC_main_inst,
-      const uint8_t* encoded,
-      int16_t*       frameLength);
-
-
-  /******************************************************************************
-   * WebRtcIsac_version(...)
-   *
-   * This function returns the version number.
-   *
-   * Output:
-   *        - version      : Pointer to character string
-   *
-   */
-
-  void WebRtcIsac_version(
-      char *version);
-
-
-  /******************************************************************************
-   * WebRtcIsac_GetErrorCode(...)
-   *
-   * This function can be used to check the error code of an iSAC instance. When
-   * a function returns -1 a error code will be set for that instance. The
-   * function below extract the code of the last error that occurred in the
-   * specified instance.
-   *
-   * Input:
-   *        - ISAC_main_inst    : ISAC instance
-   *
-   * Return value               : Error code
-   */
-
-  int16_t WebRtcIsac_GetErrorCode(
-      ISACStruct* ISAC_main_inst);
-
-
-  /****************************************************************************
-   * WebRtcIsac_GetUplinkBw(...)
-   *
-   * This function outputs the target bottleneck of the codec. In
-   * channel-adaptive mode, the target bottleneck is specified through in-band
-   * signalling retreived by bandwidth estimator.
-   * In channel-independent, also called instantaneous mode, the target
-   * bottleneck is provided to the encoder by calling xxx_control(...). If
-   * xxx_control is never called the default values is returned. The default
-   * value for bottleneck at 16 kHz encoder sampling rate is 32000 bits/sec,
-   * and it is 56000 bits/sec for 32 kHz sampling rate.
-   * Note that the output is the iSAC internal operating bottleneck which might
-   * differ slightly from the one provided through xxx_control().
-   *
-   * Input:
-   *        - ISAC_main_inst    : iSAC instance
-   *
-   * Output:
-   *        - *bottleneck       : bottleneck in bits/sec
-   *
-   * Return value               : -1 if error happens
-   *                               0 bit-rates computed correctly.
-   */
-
-  int16_t WebRtcIsac_GetUplinkBw(
-      ISACStruct*    ISAC_main_inst,
-      int32_t* bottleneck);
-
-
-  /******************************************************************************
-   * WebRtcIsac_SetMaxPayloadSize(...)
-   *
-   * This function sets a limit for the maximum payload size of iSAC. The same
-   * value is used both for 30 and 60 ms packets. If the encoder sampling rate
-   * is 16 kHz the maximum payload size is between 120 and 400 bytes. If the
-   * encoder sampling rate is 32 kHz the maximum payload size is between 120
-   * and 600 bytes.
-   *
-   * If an out of range limit is used, the function returns -1, but the closest
-   * valid value will be applied.
-   *
-   * ---------------
-   * IMPORTANT NOTES
-   * ---------------
-   * The size of a packet is limited to the minimum of 'max-payload-size' and
-   * 'max-rate.' For instance, let's assume the max-payload-size is set to
-   * 170 bytes, and max-rate is set to 40 kbps. Note that a limit of 40 kbps
-   * translates to 150 bytes for 30ms frame-size & 300 bytes for 60ms
-   * frame-size. Then a packet with a frame-size of 30 ms is limited to 150,
-   * i.e. min(170, 150), and a packet with 60 ms frame-size is limited to
-   * 170 bytes, i.e. min(170, 300).
-   *
-   * Input:
-   *        - ISAC_main_inst    : iSAC instance
-   *        - maxPayloadBytes   : maximum size of the payload in bytes
-   *                              valid values are between 120 and 400 bytes
-   *                              if encoder sampling rate is 16 kHz. For
-   *                              32 kHz encoder sampling rate valid values
-   *                              are between 120 and 600 bytes.
-   *
-   * Return value               : 0 if successful
-   *                             -1 if error happens
-   */
-
-  int16_t WebRtcIsac_SetMaxPayloadSize(
-      ISACStruct* ISAC_main_inst,
-      int16_t maxPayloadBytes);
-
-
-  /******************************************************************************
-   * WebRtcIsac_SetMaxRate(...)
-   *
-   * This function sets the maximum rate which the codec may not exceed for
-   * any signal packet. The maximum rate is defined and payload-size per
-   * frame-size in bits per second.
-   *
-   * The codec has a maximum rate of 53400 bits per second (200 bytes per 30
-   * ms) if the encoder sampling rate is 16kHz, and 160 kbps (600 bytes/30 ms)
-   * if the encoder sampling rate is 32 kHz.
-   *
-   * It is possible to set a maximum rate between 32000 and 53400 bits/sec
-   * in wideband mode, and 32000 to 160000 bits/sec in super-wideband mode.
-   *
-   * If an out of range limit is used, the function returns -1, but the closest
-   * valid value will be applied.
-   *
-   * ---------------
-   * IMPORTANT NOTES
-   * ---------------
-   * The size of a packet is limited to the minimum of 'max-payload-size' and
-   * 'max-rate.' For instance, let's assume the max-payload-size is set to
-   * 170 bytes, and max-rate is set to 40 kbps. Note that a limit of 40 kbps
-   * translates to 150 bytes for 30ms frame-size & 300 bytes for 60ms
-   * frame-size. Then a packet with a frame-size of 30 ms is limited to 150,
-   * i.e. min(170, 150), and a packet with 60 ms frame-size is limited to
-   * 170 bytes, min(170, 300).
-   *
-   * Input:
-   *        - ISAC_main_inst    : iSAC instance
-   *        - maxRate           : maximum rate in bits per second,
-   *                              valid values are 32000 to 53400 bits/sec in
-   *                              wideband mode, and 32000 to 160000 bits/sec in
-   *                              super-wideband mode.
-   *
-   * Return value               : 0 if successful
-   *                             -1 if error happens
-   */
-
-  int16_t WebRtcIsac_SetMaxRate(
-      ISACStruct* ISAC_main_inst,
-      int32_t maxRate);
-
-
-  /******************************************************************************
-   * WebRtcIsac_DecSampRate()
-   * Return the sampling rate of the decoded audio.
-   *
-   * Input:
-   *        - ISAC_main_inst    : iSAC instance
-   *
-   * Return value               : sampling frequency in Hertz.
-   *
-   */
-
-  uint16_t WebRtcIsac_DecSampRate(ISACStruct* ISAC_main_inst);
-
-
-  /******************************************************************************
-   * WebRtcIsac_EncSampRate()
-   *
-   * Input:
-   *        - ISAC_main_inst    : iSAC instance
-   *
-   * Return value               : sampling rate in Hertz.
-   *
-   */
-
-  uint16_t WebRtcIsac_EncSampRate(ISACStruct* ISAC_main_inst);
-
-
-  /******************************************************************************
-   * WebRtcIsac_SetDecSampRate()
-   * Set the sampling rate of the decoder.  Initialization of the decoder WILL
-   * NOT overwrite the sampling rate of the encoder. The default value is 16 kHz
-   * which is set when the instance is created.
-   *
-   * Input:
-   *        - ISAC_main_inst    : iSAC instance
-   *        - sampRate          : sampling rate in Hertz.
-   *
-   * Return value               : 0 if successful
-   *                             -1 if failed.
-   */
-
-  int16_t WebRtcIsac_SetDecSampRate(ISACStruct* ISAC_main_inst,
-                                          uint16_t samp_rate_hz);
-
-
-  /******************************************************************************
-   * WebRtcIsac_SetEncSampRate()
-   * Set the sampling rate of the encoder. Initialization of the encoder WILL
-   * NOT overwrite the sampling rate of the encoder. The default value is 16 kHz
-   * which is set when the instance is created. The encoding-mode and the
-   * bottleneck remain unchanged by this call, however, the maximum rate and
-   * maximum payload-size will reset to their default value.
-   *
-   * Input:
-   *        - ISAC_main_inst    : iSAC instance
-   *        - sampRate          : sampling rate in Hertz.
-   *
-   * Return value               : 0 if successful
-   *                             -1 if failed.
-   */
-
-  int16_t WebRtcIsac_SetEncSampRate(ISACStruct* ISAC_main_inst,
-                                          uint16_t sample_rate_hz);
-
-
-
-  /******************************************************************************
-   * WebRtcIsac_GetNewBitStream(...)
-   *
-   * This function returns encoded data, with the recieved bwe-index in the
-   * stream. If the rate is set to a value less than bottleneck of codec
-   * the new bistream will be re-encoded with the given target rate.
-   * It should always return a complete packet, i.e. only called once
-   * even for 60 msec frames.
-   *
-   * NOTE 1! This function does not write in the ISACStruct, it is not allowed.
-   * NOTE 2! Currently not implemented for SWB mode.
-   * NOTE 3! Rates larger than the bottleneck of the codec will be limited
-   *         to the current bottleneck.
-   *
-   * Input:
-   *        - ISAC_main_inst    : ISAC instance.
-   *        - bweIndex          : Index of bandwidth estimate to put in new
-   *                              bitstream
-   *        - rate              : target rate of the transcoder is bits/sec.
-   *                              Valid values are the accepted rate in iSAC,
-   *                              i.e. 10000 to 56000.
-   *        - isRCU                       : if the new bit-stream is an RCU stream.
-   *                              Note that the rate parameter always indicates
-   *                              the target rate of the main payload, regardless
-   *                              of 'isRCU' value.
-   *
-   * Output:
-   *        - encoded           : The encoded data vector
-   *
-   * Return value               : >0 - Length (in bytes) of coded data
-   *                              -1 - Error  or called in SWB mode
-   *                                 NOTE! No error code is written to
-   *                                 the struct since it is only allowed to read
-   *                                 the struct.
-   */
-  int16_t WebRtcIsac_GetNewBitStream(
-      ISACStruct*    ISAC_main_inst,
-      int16_t  bweIndex,
-      int16_t  jitterInfo,
-      int32_t  rate,
-      uint8_t* encoded,
-      int16_t  isRCU);
-
-
-
-  /****************************************************************************
-   * WebRtcIsac_GetDownLinkBwIndex(...)
-   *
-   * This function returns index representing the Bandwidth estimate from
-   * other side to this side.
-   *
-   * Input:
-   *        - ISAC_main_inst    : iSAC struct
-   *
-   * Output:
-   *        - bweIndex          : Bandwidth estimate to transmit to other side.
-   *
-   */
-
-  int16_t WebRtcIsac_GetDownLinkBwIndex(
-      ISACStruct*  ISAC_main_inst,
-      int16_t* bweIndex,
-      int16_t* jitterInfo);
-
-
-  /****************************************************************************
-   * WebRtcIsac_UpdateUplinkBw(...)
-   *
-   * This function takes an index representing the Bandwidth estimate from
-   * this side to other side and updates BWE.
-   *
-   * Input:
-   *        - ISAC_main_inst    : iSAC struct
-   *        - bweIndex          : Bandwidth estimate from other side.
-   *
-   */
-
-  int16_t WebRtcIsac_UpdateUplinkBw(
-      ISACStruct* ISAC_main_inst,
-      int16_t bweIndex);
-
-
-  /****************************************************************************
-   * WebRtcIsac_ReadBwIndex(...)
-   *
-   * This function returns the index of the Bandwidth estimate from the bitstream.
-   *
-   * Input:
-   *        - encoded           : Encoded bitstream
-   *
-   * Output:
-   *        - frameLength       : Length of frame in packet (in samples)
-   *        - bweIndex         : Bandwidth estimate in bitstream
-   *
-   */
-
-  int16_t WebRtcIsac_ReadBwIndex(
-      const uint8_t* encoded,
-      int16_t*       bweIndex);
-
-
-
-  /*******************************************************************************
-   * WebRtcIsac_GetNewFrameLen(...)
-   *
-   * returns the frame lenght (in samples) of the next packet. In the case of channel-adaptive
-   * mode, iSAC decides on its frame lenght based on the estimated bottleneck
-   * this allows a user to prepare for the next packet (at the encoder)
-   *
-   * The primary usage is in CE to make the iSAC works in channel-adaptive mode
-   *
-   * Input:
-   *        - ISAC_main_inst     : iSAC struct
-   *
-   * Return Value                : frame lenght in samples
-   *
-   */
-
-  int16_t WebRtcIsac_GetNewFrameLen(
-      ISACStruct* ISAC_main_inst);
-
-
-  /****************************************************************************
-   *  WebRtcIsac_GetRedPayload(...)
-   *
-   *  Populates "encoded" with the redundant payload of the recently encoded
-   *  frame. This function has to be called once that WebRtcIsac_Encode(...)
-   *  returns a positive value. Regardless of the frame-size this function will
-   *  be called only once after encoding is completed.
-   *
-   * Input:
-   *      - ISAC_main_inst    : iSAC struct
-   *
-   * Output:
-   *        - encoded            : the encoded data vector
-   *
-   *
-   * Return value:
-   *                              : >0 - Length (in bytes) of coded data
-   *                              : -1 - Error
-   *
-   *
-   */
-  int16_t WebRtcIsac_GetRedPayload(
-      ISACStruct*    ISAC_main_inst,
-      uint8_t* encoded);
-
-
-  /****************************************************************************
-   * WebRtcIsac_DecodeRcu(...)
-   *
-   * This function decodes a redundant (RCU) iSAC frame. Function is called in
-   * NetEq with a stored RCU payload i case of packet loss. Output speech length
-   * will be a multiple of 480 samples: 480 or 960 samples,
-   * depending on the framesize (30 or 60 ms).
-   *
-   * Input:
-   *      - ISAC_main_inst     : ISAC instance.
-   *      - encoded            : encoded ISAC RCU frame(s)
-   *      - len                : bytes in encoded vector
-   *
-   * Output:
-   *      - decoded            : The decoded vector
-   *
-   * Return value              : >0 - number of samples in decoded vector
-   *                             -1 - Error
-   */
-  int WebRtcIsac_DecodeRcu(
-      ISACStruct*           ISAC_main_inst,
-      const uint8_t* encoded,
-      size_t         len,
-      int16_t*        decoded,
-      int16_t*        speechType);
-
-  /* Fills in an IsacBandwidthInfo struct. |inst| should be a decoder. */
-  void WebRtcIsac_GetBandwidthInfo(ISACStruct* inst, IsacBandwidthInfo* bwinfo);
-
-  /* Uses the values from an IsacBandwidthInfo struct. |inst| should be an
-     encoder. */
-  void WebRtcIsac_SetBandwidthInfo(ISACStruct* inst,
-                                   const IsacBandwidthInfo* bwinfo);
-
-  /* If |inst| is a decoder but not an encoder: tell it what sample rate the
-     encoder is using, for bandwidth estimation purposes. */
-  void WebRtcIsac_SetEncSampRateInDecoder(ISACStruct* inst, int sample_rate_hz);
-
-#if defined(__cplusplus)
-}
-#endif
-
-
-
-#endif /* WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_MAIN_INCLUDE_ISAC_H_ */
diff --git a/modules/audio_coding/codecs/isac/main/source/arith_routines.c b/modules/audio_coding/codecs/isac/main/source/arith_routines.c
deleted file mode 100644
index 5c901bb..0000000
--- a/modules/audio_coding/codecs/isac/main/source/arith_routines.c
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- *  Copyright (c) 2011 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 "arith_routines.h"
-#include "settings.h"
-
-
-/*
- * terminate and return byte stream;
- * returns the number of bytes in the stream
- */
-int WebRtcIsac_EncTerminate(Bitstr *streamdata) /* in-/output struct containing bitstream */
-{
-  uint8_t *stream_ptr;
-
-
-  /* point to the right place in the stream buffer */
-  stream_ptr = streamdata->stream + streamdata->stream_index;
-
-  /* find minimum length (determined by current interval width) */
-  if ( streamdata->W_upper > 0x01FFFFFF )
-  {
-    streamdata->streamval += 0x01000000;
-    /* add carry to buffer */
-    if (streamdata->streamval < 0x01000000)
-    {
-      /* propagate carry */
-      while ( !(++(*--stream_ptr)) );
-      /* put pointer back to the old value */
-      stream_ptr = streamdata->stream + streamdata->stream_index;
-    }
-    /* write remaining data to bitstream */
-    *stream_ptr++ = (uint8_t) (streamdata->streamval >> 24);
-  }
-  else
-  {
-    streamdata->streamval += 0x00010000;
-    /* add carry to buffer */
-    if (streamdata->streamval < 0x00010000)
-    {
-      /* propagate carry */
-      while ( !(++(*--stream_ptr)) );
-      /* put pointer back to the old value */
-      stream_ptr = streamdata->stream + streamdata->stream_index;
-    }
-    /* write remaining data to bitstream */
-    *stream_ptr++ = (uint8_t) (streamdata->streamval >> 24);
-    *stream_ptr++ = (uint8_t) ((streamdata->streamval >> 16) & 0x00FF);
-  }
-
-  /* calculate stream length */
-  return (int)(stream_ptr - streamdata->stream);
-}
diff --git a/modules/audio_coding/codecs/isac/main/source/arith_routines.h b/modules/audio_coding/codecs/isac/main/source/arith_routines.h
deleted file mode 100644
index d2fcbfe..0000000
--- a/modules/audio_coding/codecs/isac/main/source/arith_routines.h
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/*
- * arith_routines.h
- *
- * Functions for arithmetic coding.
- *
- */
-
-#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_MAIN_SOURCE_ARITH_ROUTINES_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_MAIN_SOURCE_ARITH_ROUTINES_H_
-
-#include "structs.h"
-
-
-int WebRtcIsac_EncLogisticMulti2(
-    Bitstr *streamdata,              /* in-/output struct containing bitstream */
-    int16_t *dataQ7,           /* input: data vector */
-    const uint16_t *env,       /* input: side info vector defining the width of the pdf */
-    const int N,                     /* input: data vector length */
-    const int16_t isSWB12kHz); /* if the codec is working in 12kHz bandwidth */
-
-/* returns the number of bytes in the stream */
-int WebRtcIsac_EncTerminate(Bitstr *streamdata); /* in-/output struct containing bitstream */
-
-/* returns the number of bytes in the stream so far */
-int WebRtcIsac_DecLogisticMulti2(
-    int16_t *data,             /* output: data vector */
-    Bitstr *streamdata,              /* in-/output struct containing bitstream */
-    const uint16_t *env,       /* input: side info vector defining the width of the pdf */
-    const int16_t *dither,     /* input: dither vector */
-    const int N,                     /* input: data vector length */
-    const int16_t isSWB12kHz); /* if the codec is working in 12kHz bandwidth */
-
-void WebRtcIsac_EncHistMulti(
-    Bitstr *streamdata,         /* in-/output struct containing bitstream */
-    const int *data,            /* input: data vector */
-    const uint16_t *const *cdf, /* input: array of cdf arrays */
-    const int N);               /* input: data vector length */
-
-int WebRtcIsac_DecHistBisectMulti(
-    int *data,                      /* output: data vector */
-    Bitstr *streamdata,             /* in-/output struct containing bitstream */
-    const uint16_t *const *cdf,     /* input: array of cdf arrays */
-    const uint16_t *cdf_size, /* input: array of cdf table sizes+1 (power of two: 2^k) */
-    const int N);                   /* input: data vector length */
-
-int WebRtcIsac_DecHistOneStepMulti(
-    int *data,                       /* output: data vector */
-    Bitstr *streamdata,              /* in-/output struct containing bitstream */
-    const uint16_t *const *cdf,      /* input: array of cdf arrays */
-    const uint16_t *init_index,/* input: vector of initial cdf table search entries */
-    const int N);                    /* input: data vector length */
-
-#endif /* WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_MAIN_SOURCE_ARITH_ROUTINES_H_ */
diff --git a/modules/audio_coding/codecs/isac/main/source/arith_routines_hist.c b/modules/audio_coding/codecs/isac/main/source/arith_routines_hist.c
deleted file mode 100644
index b229c67..0000000
--- a/modules/audio_coding/codecs/isac/main/source/arith_routines_hist.c
+++ /dev/null
@@ -1,291 +0,0 @@
-/*
- *  Copyright (c) 2011 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 "settings.h"
-#include "arith_routines.h"
-
-
-/*
- * code symbols into arithmetic bytestream
- */
-void WebRtcIsac_EncHistMulti(Bitstr *streamdata, /* in-/output struct containing bitstream */
-                             const int *data,  /* input: data vector */
-                             const uint16_t *const *cdf, /* input: array of cdf arrays */
-                             const int N)   /* input: data vector length */
-{
-  uint32_t W_lower, W_upper;
-  uint32_t W_upper_LSB, W_upper_MSB;
-  uint8_t *stream_ptr;
-  uint8_t *stream_ptr_carry;
-  uint32_t cdf_lo, cdf_hi;
-  int k;
-
-
-  /* point to beginning of stream buffer */
-  stream_ptr = streamdata->stream + streamdata->stream_index;
-  W_upper = streamdata->W_upper;
-
-  for (k=N; k>0; k--)
-  {
-    /* fetch cdf_lower and cdf_upper from cdf tables */
-    cdf_lo = (uint32_t) *(*cdf + *data);
-    cdf_hi = (uint32_t) *(*cdf++ + *data++ + 1);
-
-    /* update interval */
-    W_upper_LSB = W_upper & 0x0000FFFF;
-    W_upper_MSB = W_upper >> 16;
-    W_lower = W_upper_MSB * cdf_lo;
-    W_lower += (W_upper_LSB * cdf_lo) >> 16;
-    W_upper = W_upper_MSB * cdf_hi;
-    W_upper += (W_upper_LSB * cdf_hi) >> 16;
-
-    /* shift interval such that it begins at zero */
-    W_upper -= ++W_lower;
-
-    /* add integer to bitstream */
-    streamdata->streamval += W_lower;
-
-    /* handle carry */
-    if (streamdata->streamval < W_lower)
-    {
-      /* propagate carry */
-      stream_ptr_carry = stream_ptr;
-      while (!(++(*--stream_ptr_carry)));
-    }
-
-    /* renormalize interval, store most significant byte of streamval and update streamval */
-    while ( !(W_upper & 0xFF000000) )      /* W_upper < 2^24 */
-    {
-      W_upper <<= 8;
-      *stream_ptr++ = (uint8_t) (streamdata->streamval >> 24);
-      streamdata->streamval <<= 8;
-    }
-  }
-
-  /* calculate new stream_index */
-  streamdata->stream_index = (int)(stream_ptr - streamdata->stream);
-  streamdata->W_upper = W_upper;
-
-  return;
-}
-
-
-
-/*
- * function to decode more symbols from the arithmetic bytestream, using method of bisection
- * cdf tables should be of size 2^k-1 (which corresponds to an alphabet size of 2^k-2)
- */
-int WebRtcIsac_DecHistBisectMulti(int *data,     /* output: data vector */
-                                  Bitstr *streamdata,   /* in-/output struct containing bitstream */
-                                  const uint16_t *const *cdf,  /* input: array of cdf arrays */
-                                  const uint16_t *cdf_size, /* input: array of cdf table sizes+1 (power of two: 2^k) */
-                                  const int N)    /* input: data vector length */
-{
-  uint32_t    W_lower, W_upper;
-  uint32_t    W_tmp;
-  uint32_t    W_upper_LSB, W_upper_MSB;
-  uint32_t    streamval;
-  const   uint8_t *stream_ptr;
-  const   uint16_t *cdf_ptr;
-  int     size_tmp;
-  int     k;
-
-  W_lower = 0; //to remove warning -DH
-  stream_ptr = streamdata->stream + streamdata->stream_index;
-  W_upper = streamdata->W_upper;
-  if (W_upper == 0)
-    /* Should not be possible in normal operation */
-    return -2;
-
-  if (streamdata->stream_index == 0)   /* first time decoder is called for this stream */
-  {
-    /* read first word from bytestream */
-    streamval = *stream_ptr << 24;
-    streamval |= *++stream_ptr << 16;
-    streamval |= *++stream_ptr << 8;
-    streamval |= *++stream_ptr;
-  } else {
-    streamval = streamdata->streamval;
-  }
-
-  for (k=N; k>0; k--)
-  {
-    /* find the integer *data for which streamval lies in [W_lower+1, W_upper] */
-    W_upper_LSB = W_upper & 0x0000FFFF;
-    W_upper_MSB = W_upper >> 16;
-
-    /* start halfway the cdf range */
-    size_tmp = *cdf_size++ >> 1;
-    cdf_ptr = *cdf + (size_tmp - 1);
-
-    /* method of bisection */
-    for ( ;; )
-    {
-      W_tmp = W_upper_MSB * *cdf_ptr;
-      W_tmp += (W_upper_LSB * *cdf_ptr) >> 16;
-      size_tmp >>= 1;
-      if (size_tmp == 0) break;
-      if (streamval > W_tmp)
-      {
-        W_lower = W_tmp;
-        cdf_ptr += size_tmp;
-      } else {
-        W_upper = W_tmp;
-        cdf_ptr -= size_tmp;
-      }
-    }
-    if (streamval > W_tmp)
-    {
-      W_lower = W_tmp;
-      *data++ = (int)(cdf_ptr - *cdf++);
-    } else {
-      W_upper = W_tmp;
-      *data++ = (int)(cdf_ptr - *cdf++ - 1);
-    }
-
-    /* shift interval to start at zero */
-    W_upper -= ++W_lower;
-
-    /* add integer to bitstream */
-    streamval -= W_lower;
-
-    /* renormalize interval and update streamval */
-    while ( !(W_upper & 0xFF000000) )    /* W_upper < 2^24 */
-    {
-      /* read next byte from stream */
-      streamval = (streamval << 8) | *++stream_ptr;
-      W_upper <<= 8;
-    }
-
-    if (W_upper == 0)
-      /* Should not be possible in normal operation */
-      return -2;
-
-
-  }
-
-  streamdata->stream_index = (int)(stream_ptr - streamdata->stream);
-  streamdata->W_upper = W_upper;
-  streamdata->streamval = streamval;
-
-
-  /* find number of bytes in original stream (determined by current interval width) */
-  if ( W_upper > 0x01FFFFFF )
-    return streamdata->stream_index - 2;
-  else
-    return streamdata->stream_index - 1;
-}
-
-
-
-/*
- * function to decode more symbols from the arithmetic bytestream, taking single step up or
- * down at a time
- * cdf tables can be of arbitrary size, but large tables may take a lot of iterations
- */
-int WebRtcIsac_DecHistOneStepMulti(int *data,        /* output: data vector */
-                                   Bitstr *streamdata,      /* in-/output struct containing bitstream */
-                                   const uint16_t *const *cdf,   /* input: array of cdf arrays */
-                                   const uint16_t *init_index, /* input: vector of initial cdf table search entries */
-                                   const int N)     /* input: data vector length */
-{
-  uint32_t    W_lower, W_upper;
-  uint32_t    W_tmp;
-  uint32_t    W_upper_LSB, W_upper_MSB;
-  uint32_t    streamval;
-  const   uint8_t *stream_ptr;
-  const   uint16_t *cdf_ptr;
-  int     k;
-
-
-  stream_ptr = streamdata->stream + streamdata->stream_index;
-  W_upper = streamdata->W_upper;
-  if (W_upper == 0)
-    /* Should not be possible in normal operation */
-    return -2;
-
-  if (streamdata->stream_index == 0)   /* first time decoder is called for this stream */
-  {
-    /* read first word from bytestream */
-    streamval = (uint32_t)(*stream_ptr) << 24;
-    streamval |= (uint32_t)(*++stream_ptr) << 16;
-    streamval |= (uint32_t)(*++stream_ptr) << 8;
-    streamval |= (uint32_t)(*++stream_ptr);
-  } else {
-    streamval = streamdata->streamval;
-  }
-
-
-  for (k=N; k>0; k--)
-  {
-    /* find the integer *data for which streamval lies in [W_lower+1, W_upper] */
-    W_upper_LSB = W_upper & 0x0000FFFF;
-    W_upper_MSB = W_upper >> 16;
-
-    /* start at the specified table entry */
-    cdf_ptr = *cdf + (*init_index++);
-    W_tmp = W_upper_MSB * *cdf_ptr;
-    W_tmp += (W_upper_LSB * *cdf_ptr) >> 16;
-    if (streamval > W_tmp)
-    {
-      for ( ;; )
-      {
-        W_lower = W_tmp;
-        if (cdf_ptr[0]==65535)
-          /* range check */
-          return -3;
-        W_tmp = W_upper_MSB * *++cdf_ptr;
-        W_tmp += (W_upper_LSB * *cdf_ptr) >> 16;
-        if (streamval <= W_tmp) break;
-      }
-      W_upper = W_tmp;
-      *data++ = (int)(cdf_ptr - *cdf++ - 1);
-    } else {
-      for ( ;; )
-      {
-        W_upper = W_tmp;
-        --cdf_ptr;
-        if (cdf_ptr<*cdf) {
-          /* range check */
-          return -3;
-        }
-        W_tmp = W_upper_MSB * *cdf_ptr;
-        W_tmp += (W_upper_LSB * *cdf_ptr) >> 16;
-        if (streamval > W_tmp) break;
-      }
-      W_lower = W_tmp;
-      *data++ = (int)(cdf_ptr - *cdf++);
-    }
-
-    /* shift interval to start at zero */
-    W_upper -= ++W_lower;
-    /* add integer to bitstream */
-    streamval -= W_lower;
-
-    /* renormalize interval and update streamval */
-    while ( !(W_upper & 0xFF000000) )    /* W_upper < 2^24 */
-    {
-      /* read next byte from stream */
-      streamval = (streamval << 8) | *++stream_ptr;
-      W_upper <<= 8;
-    }
-  }
-
-  streamdata->stream_index = (int)(stream_ptr - streamdata->stream);
-  streamdata->W_upper = W_upper;
-  streamdata->streamval = streamval;
-
-
-  /* find number of bytes in original stream (determined by current interval width) */
-  if ( W_upper > 0x01FFFFFF )
-    return streamdata->stream_index - 2;
-  else
-    return streamdata->stream_index - 1;
-}
diff --git a/modules/audio_coding/codecs/isac/main/source/arith_routines_logist.c b/modules/audio_coding/codecs/isac/main/source/arith_routines_logist.c
deleted file mode 100644
index a463d48..0000000
--- a/modules/audio_coding/codecs/isac/main/source/arith_routines_logist.c
+++ /dev/null
@@ -1,303 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/*
- * arith_routines.h
- *
- * This file contains functions for arithmatically encoding and
- * decoding DFT coefficients.
- *
- */
-
-
-#include "arith_routines.h"
-
-
-
-static const int32_t kHistEdgesQ15[51] = {
-  -327680, -314573, -301466, -288359, -275252, -262144, -249037, -235930, -222823, -209716,
-  -196608, -183501, -170394, -157287, -144180, -131072, -117965, -104858, -91751, -78644,
-  -65536, -52429, -39322, -26215, -13108,  0,  13107,  26214,  39321,  52428,
-  65536,  78643,  91750,  104857,  117964,  131072,  144179,  157286,  170393,  183500,
-  196608,  209715,  222822,  235929,  249036,  262144,  275251,  288358,  301465,  314572,
-  327680};
-
-
-static const int kCdfSlopeQ0[51] = {  /* Q0 */
-  5,  5,  5,  5,  5,  5,  5,  5,  5,  5,
-  5,  5,  13,  23,  47,  87,  154,  315,  700,  1088,
-  2471,  6064,  14221,  21463,  36634,  36924,  19750,  13270,  5806,  2312,
-  1095,  660,  316,  145,  86,  41,  32,  5,  5,  5,
-  5,  5,  5,  5,  5,  5,  5,  5,  5,  2, 0};
-
-
-static const int kCdfQ16[51] = {  /* Q16 */
-  0,  2,  4,  6,  8,  10,  12,  14,  16,  18,
-  20,  22,  24,  29,  38,  57,  92,  153,  279,  559,
-  994,  1983,  4408,  10097,  18682,  33336,  48105,  56005,  61313,  63636,
-  64560,  64998,  65262,  65389,  65447,  65481,  65497,  65510,  65512,  65514,
-  65516,  65518,  65520,  65522,  65524,  65526,  65528,  65530,  65532,  65534,
-  65535};
-
-
-
-/* function to be converted to fixed point */
-static __inline uint32_t piecewise(int32_t xinQ15) {
-
-  int32_t ind, qtmp1, qtmp2, qtmp3;
-  uint32_t tmpUW32;
-
-
-  qtmp2 = xinQ15;
-
-  if (qtmp2 < kHistEdgesQ15[0]) {
-    qtmp2 = kHistEdgesQ15[0];
-  }
-  if (qtmp2 > kHistEdgesQ15[50]) {
-    qtmp2 = kHistEdgesQ15[50];
-  }
-
-  qtmp1 = qtmp2 - kHistEdgesQ15[0];       /* Q15 - Q15 = Q15        */
-  ind = (qtmp1 * 5) >> 16;              /* 2^16 / 5 = 0.4 in Q15  */
-  /* Q15 -> Q0              */
-  qtmp1 = qtmp2 - kHistEdgesQ15[ind];     /* Q15 - Q15 = Q15        */
-  qtmp2 = kCdfSlopeQ0[ind] * qtmp1;      /* Q0 * Q15 = Q15         */
-  qtmp3 = qtmp2>>15;                    /* Q15 -> Q0              */
-
-  tmpUW32 = kCdfQ16[ind] + qtmp3;    /* Q0 + Q0 = Q0           */
-  return tmpUW32;
-}
-
-
-
-int WebRtcIsac_EncLogisticMulti2(
-    Bitstr *streamdata,      /* in-/output struct containing bitstream */
-    int16_t *dataQ7,    /* input: data vector */
-    const uint16_t *envQ8, /* input: side info vector defining the width of the pdf */
-    const int N,       /* input: data vector length / 2 */
-    const int16_t isSWB12kHz)
-{
-  uint32_t W_lower, W_upper;
-  uint32_t W_upper_LSB, W_upper_MSB;
-  uint8_t *stream_ptr;
-  uint8_t *maxStreamPtr;
-  uint8_t *stream_ptr_carry;
-  uint32_t cdf_lo, cdf_hi;
-  int k;
-
-  /* point to beginning of stream buffer */
-  stream_ptr = streamdata->stream + streamdata->stream_index;
-  W_upper = streamdata->W_upper;
-
-  maxStreamPtr = streamdata->stream + STREAM_SIZE_MAX_60 - 1;
-  for (k = 0; k < N; k++)
-  {
-    /* compute cdf_lower and cdf_upper by evaluating the piecewise linear cdf */
-    cdf_lo = piecewise((*dataQ7 - 64) * *envQ8);
-    cdf_hi = piecewise((*dataQ7 + 64) * *envQ8);
-
-    /* test and clip if probability gets too small */
-    while (cdf_lo+1 >= cdf_hi) {
-      /* clip */
-      if (*dataQ7 > 0) {
-        *dataQ7 -= 128;
-        cdf_hi = cdf_lo;
-        cdf_lo = piecewise((*dataQ7 - 64) * *envQ8);
-      } else {
-        *dataQ7 += 128;
-        cdf_lo = cdf_hi;
-        cdf_hi = piecewise((*dataQ7 + 64) * *envQ8);
-      }
-    }
-
-    dataQ7++;
-    // increment only once per 4 iterations for SWB-16kHz or WB
-    // increment only once per 2 iterations for SWB-12kHz
-    envQ8 += (isSWB12kHz)? (k & 1):((k & 1) & (k >> 1));
-
-
-    /* update interval */
-    W_upper_LSB = W_upper & 0x0000FFFF;
-    W_upper_MSB = W_upper >> 16;
-    W_lower = W_upper_MSB * cdf_lo;
-    W_lower += (W_upper_LSB * cdf_lo) >> 16;
-    W_upper = W_upper_MSB * cdf_hi;
-    W_upper += (W_upper_LSB * cdf_hi) >> 16;
-
-    /* shift interval such that it begins at zero */
-    W_upper -= ++W_lower;
-
-    /* add integer to bitstream */
-    streamdata->streamval += W_lower;
-
-    /* handle carry */
-    if (streamdata->streamval < W_lower)
-    {
-      /* propagate carry */
-      stream_ptr_carry = stream_ptr;
-      while (!(++(*--stream_ptr_carry)));
-    }
-
-    /* renormalize interval, store most significant byte of streamval and update streamval */
-    while ( !(W_upper & 0xFF000000) )      /* W_upper < 2^24 */
-    {
-      W_upper <<= 8;
-      *stream_ptr++ = (uint8_t) (streamdata->streamval >> 24);
-
-      if(stream_ptr > maxStreamPtr)
-      {
-        return -ISAC_DISALLOWED_BITSTREAM_LENGTH;
-      }
-      streamdata->streamval <<= 8;
-    }
-  }
-
-  /* calculate new stream_index */
-  streamdata->stream_index = (int)(stream_ptr - streamdata->stream);
-  streamdata->W_upper = W_upper;
-
-  return 0;
-}
-
-
-
-int WebRtcIsac_DecLogisticMulti2(
-    int16_t *dataQ7,       /* output: data vector */
-    Bitstr *streamdata,      /* in-/output struct containing bitstream */
-    const uint16_t *envQ8, /* input: side info vector defining the width of the pdf */
-    const int16_t *ditherQ7,/* input: dither vector */
-    const int N,         /* input: data vector length */
-    const int16_t isSWB12kHz)
-{
-  uint32_t    W_lower, W_upper;
-  uint32_t    W_tmp;
-  uint32_t    W_upper_LSB, W_upper_MSB;
-  uint32_t    streamval;
-  const uint8_t *stream_ptr;
-  uint32_t    cdf_tmp;
-  int16_t     candQ7;
-  int             k;
-
-  // Position just past the end of the stream. STREAM_SIZE_MAX_60 instead of
-  // STREAM_SIZE_MAX (which is the size of the allocated buffer) because that's
-  // the limit to how much data is filled in.
-  const uint8_t* const stream_end = streamdata->stream + STREAM_SIZE_MAX_60;
-
-  stream_ptr = streamdata->stream + streamdata->stream_index;
-  W_upper = streamdata->W_upper;
-  if (streamdata->stream_index == 0)   /* first time decoder is called for this stream */
-  {
-    /* read first word from bytestream */
-    if (stream_ptr + 3 >= stream_end)
-      return -1;  // Would read out of bounds. Malformed input?
-    streamval = *stream_ptr << 24;
-    streamval |= *++stream_ptr << 16;
-    streamval |= *++stream_ptr << 8;
-    streamval |= *++stream_ptr;
-  } else {
-    streamval = streamdata->streamval;
-  }
-
-
-  for (k = 0; k < N; k++)
-  {
-    /* find the integer *data for which streamval lies in [W_lower+1, W_upper] */
-    W_upper_LSB = W_upper & 0x0000FFFF;
-    W_upper_MSB = W_upper >> 16;
-
-    /* find first candidate by inverting the logistic cdf */
-    candQ7 = - *ditherQ7 + 64;
-    cdf_tmp = piecewise(candQ7 * *envQ8);
-
-    W_tmp = W_upper_MSB * cdf_tmp;
-    W_tmp += (W_upper_LSB * cdf_tmp) >> 16;
-    if (streamval > W_tmp)
-    {
-      W_lower = W_tmp;
-      candQ7 += 128;
-      cdf_tmp = piecewise(candQ7 * *envQ8);
-
-      W_tmp = W_upper_MSB * cdf_tmp;
-      W_tmp += (W_upper_LSB * cdf_tmp) >> 16;
-      while (streamval > W_tmp)
-      {
-        W_lower = W_tmp;
-        candQ7 += 128;
-        cdf_tmp = piecewise(candQ7 * *envQ8);
-
-        W_tmp = W_upper_MSB * cdf_tmp;
-        W_tmp += (W_upper_LSB * cdf_tmp) >> 16;
-
-        /* error check */
-        if (W_lower == W_tmp) return -1;
-      }
-      W_upper = W_tmp;
-
-      /* another sample decoded */
-      *dataQ7 = candQ7 - 64;
-    }
-    else
-    {
-      W_upper = W_tmp;
-      candQ7 -= 128;
-      cdf_tmp = piecewise(candQ7 * *envQ8);
-
-      W_tmp = W_upper_MSB * cdf_tmp;
-      W_tmp += (W_upper_LSB * cdf_tmp) >> 16;
-      while ( !(streamval > W_tmp) )
-      {
-        W_upper = W_tmp;
-        candQ7 -= 128;
-        cdf_tmp = piecewise(candQ7 * *envQ8);
-
-        W_tmp = W_upper_MSB * cdf_tmp;
-        W_tmp += (W_upper_LSB * cdf_tmp) >> 16;
-
-        /* error check */
-        if (W_upper == W_tmp) return -1;
-      }
-      W_lower = W_tmp;
-
-      /* another sample decoded */
-      *dataQ7 = candQ7 + 64;
-    }
-    ditherQ7++;
-    dataQ7++;
-    // increment only once per 4 iterations for SWB-16kHz or WB
-    // increment only once per 2 iterations for SWB-12kHz
-    envQ8 += (isSWB12kHz)? (k & 1):((k & 1) & (k >> 1));
-
-    /* shift interval to start at zero */
-    W_upper -= ++W_lower;
-
-    /* add integer to bitstream */
-    streamval -= W_lower;
-
-    /* renormalize interval and update streamval */
-    while ( !(W_upper & 0xFF000000) )    /* W_upper < 2^24 */
-    {
-      /* read next byte from stream */
-      if (stream_ptr + 1 >= stream_end)
-        return -1;  // Would read out of bounds. Malformed input?
-      streamval = (streamval << 8) | *++stream_ptr;
-      W_upper <<= 8;
-    }
-  }
-
-  streamdata->stream_index = (int)(stream_ptr - streamdata->stream);
-  streamdata->W_upper = W_upper;
-  streamdata->streamval = streamval;
-
-  /* find number of bytes in original stream (determined by current interval width) */
-  if ( W_upper > 0x01FFFFFF )
-    return streamdata->stream_index - 2;
-  else
-    return streamdata->stream_index - 1;
-}
diff --git a/modules/audio_coding/codecs/isac/main/source/audio_decoder_isac.cc b/modules/audio_coding/codecs/isac/main/source/audio_decoder_isac.cc
deleted file mode 100644
index 8e0603e..0000000
--- a/modules/audio_coding/codecs/isac/main/source/audio_decoder_isac.cc
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- *  Copyright (c) 2015 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/codecs/isac/main/include/audio_decoder_isac.h"
-
-#include "webrtc/modules/audio_coding/codecs/isac/audio_decoder_isac_t_impl.h"
-
-namespace webrtc {
-
-// Explicit instantiation:
-template class AudioDecoderIsacT<IsacFloat>;
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/codecs/isac/main/source/audio_encoder_isac.cc b/modules/audio_coding/codecs/isac/main/source/audio_encoder_isac.cc
deleted file mode 100644
index 64b9815..0000000
--- a/modules/audio_coding/codecs/isac/main/source/audio_encoder_isac.cc
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- *  Copyright (c) 2014 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/codecs/isac/main/include/audio_encoder_isac.h"
-
-#include "webrtc/modules/audio_coding/codecs/isac/audio_encoder_isac_t_impl.h"
-
-namespace webrtc {
-
-// Explicit instantiation:
-template class AudioEncoderIsacT<IsacFloat>;
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/codecs/isac/main/source/audio_encoder_isac_unittest.cc b/modules/audio_coding/codecs/isac/main/source/audio_encoder_isac_unittest.cc
deleted file mode 100644
index 3fe8c1a..0000000
--- a/modules/audio_coding/codecs/isac/main/source/audio_encoder_isac_unittest.cc
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- *  Copyright (c) 2015 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 <limits>
-
-#include "webrtc/modules/audio_coding/codecs/isac/main/include/audio_encoder_isac.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-namespace {
-
-void TestBadConfig(const AudioEncoderIsacFloatImpl::Config& config) {
-  EXPECT_FALSE(config.IsOk());
-}
-
-void TestGoodConfig(const AudioEncoderIsacFloatImpl::Config& config) {
-  EXPECT_TRUE(config.IsOk());
-  AudioEncoderIsacFloatImpl aei(config);
-}
-
-// Wrap subroutine calls that test things in this, so that the error messages
-// will be accompanied by stack traces that make it possible to tell which
-// subroutine invocation caused the failure.
-#define S(x) do { SCOPED_TRACE(#x); x; } while (0)
-
-}  // namespace
-
-TEST(AudioEncoderIsacTest, TestConfigBitrate) {
-  AudioEncoderIsacFloatImpl::Config config;
-
-  // The default value is some real, positive value.
-  EXPECT_GT(config.bit_rate, 1);
-  S(TestGoodConfig(config));
-
-  // 0 is another way to ask for the default value.
-  config.bit_rate = 0;
-  S(TestGoodConfig(config));
-
-  // Try some unreasonable values and watch them fail.
-  config.bit_rate = -1;
-  S(TestBadConfig(config));
-  config.bit_rate = 1;
-  S(TestBadConfig(config));
-  config.bit_rate = std::numeric_limits<int>::max();
-  S(TestBadConfig(config));
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/codecs/isac/main/source/bandwidth_estimator.c b/modules/audio_coding/codecs/isac/main/source/bandwidth_estimator.c
deleted file mode 100644
index c2c166c..0000000
--- a/modules/audio_coding/codecs/isac/main/source/bandwidth_estimator.c
+++ /dev/null
@@ -1,1031 +0,0 @@
-/*
- *  Copyright (c) 2012 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.
- */
-
-/*
- * BwEstimator.c
- *
- * This file contains the code for the Bandwidth Estimator designed
- * for iSAC.
- *
- */
-
-#include "bandwidth_estimator.h"
-#include "settings.h"
-#include "isac.h"
-#include "webrtc/rtc_base/checks.h"
-
-#include <math.h>
-#include <string.h>
-
-/* array of quantization levels for bottle neck info; Matlab code: */
-/* sprintf('%4.1ff, ', logspace(log10(5000), log10(40000), 12)) */
-static const float kQRateTableWb[12] =
-{
-  10000.0f, 11115.3f, 12355.1f, 13733.1f, 15264.8f, 16967.3f,
-  18859.8f, 20963.3f, 23301.4f, 25900.3f, 28789.0f, 32000.0f};
-
-
-static const float kQRateTableSwb[24] =
-{
-  10000.0f, 11115.3f, 12355.1f, 13733.1f, 15264.8f, 16967.3f,
-  18859.8f, 20963.3f, 23153.1f, 25342.9f, 27532.7f, 29722.5f,
-  31912.3f, 34102.1f, 36291.9f, 38481.7f, 40671.4f, 42861.2f,
-  45051.0f, 47240.8f, 49430.6f, 51620.4f, 53810.2f, 56000.0f,
-};
-
-
-
-
-int32_t WebRtcIsac_InitBandwidthEstimator(
-    BwEstimatorstr*              bwest_str,
-    enum IsacSamplingRate encoderSampRate,
-    enum IsacSamplingRate decoderSampRate)
-{
-  switch(encoderSampRate)
-  {
-    case kIsacWideband:
-      {
-        bwest_str->send_bw_avg       = INIT_BN_EST_WB;
-        break;
-      }
-    case kIsacSuperWideband:
-      {
-        bwest_str->send_bw_avg       = INIT_BN_EST_SWB;
-        break;
-      }
-  }
-
-  switch(decoderSampRate)
-  {
-    case kIsacWideband:
-      {
-        bwest_str->prev_frame_length = INIT_FRAME_LEN_WB;
-        bwest_str->rec_bw_inv        = 1.0f /
-            (INIT_BN_EST_WB + INIT_HDR_RATE_WB);
-        bwest_str->rec_bw            = (int32_t)INIT_BN_EST_WB;
-        bwest_str->rec_bw_avg_Q      = INIT_BN_EST_WB;
-        bwest_str->rec_bw_avg        = INIT_BN_EST_WB + INIT_HDR_RATE_WB;
-        bwest_str->rec_header_rate   = INIT_HDR_RATE_WB;
-        break;
-      }
-    case kIsacSuperWideband:
-      {
-        bwest_str->prev_frame_length = INIT_FRAME_LEN_SWB;
-        bwest_str->rec_bw_inv        = 1.0f /
-            (INIT_BN_EST_SWB + INIT_HDR_RATE_SWB);
-        bwest_str->rec_bw            = (int32_t)INIT_BN_EST_SWB;
-        bwest_str->rec_bw_avg_Q      = INIT_BN_EST_SWB;
-        bwest_str->rec_bw_avg        = INIT_BN_EST_SWB + INIT_HDR_RATE_SWB;
-        bwest_str->rec_header_rate   = INIT_HDR_RATE_SWB;
-        break;
-      }
-  }
-
-  bwest_str->prev_rec_rtp_number       = 0;
-  bwest_str->prev_rec_arr_ts           = 0;
-  bwest_str->prev_rec_send_ts          = 0;
-  bwest_str->prev_rec_rtp_rate         = 1.0f;
-  bwest_str->last_update_ts            = 0;
-  bwest_str->last_reduction_ts         = 0;
-  bwest_str->count_tot_updates_rec     = -9;
-  bwest_str->rec_jitter                = 10.0f;
-  bwest_str->rec_jitter_short_term     = 0.0f;
-  bwest_str->rec_jitter_short_term_abs = 5.0f;
-  bwest_str->rec_max_delay             = 10.0f;
-  bwest_str->rec_max_delay_avg_Q       = 10.0f;
-  bwest_str->num_pkts_rec              = 0;
-
-  bwest_str->send_max_delay_avg        = 10.0f;
-
-  bwest_str->hsn_detect_rec = 0;
-
-  bwest_str->num_consec_rec_pkts_over_30k = 0;
-
-  bwest_str->hsn_detect_snd = 0;
-
-  bwest_str->num_consec_snt_pkts_over_30k = 0;
-
-  bwest_str->in_wait_period = 0;
-
-  bwest_str->change_to_WB = 0;
-
-  bwest_str->numConsecLatePkts = 0;
-  bwest_str->consecLatency = 0;
-  bwest_str->inWaitLatePkts = 0;
-  bwest_str->senderTimestamp = 0;
-  bwest_str->receiverTimestamp = 0;
-
-  bwest_str->external_bw_info.in_use = 0;
-
-  return 0;
-}
-
-/* This function updates both bottle neck rates                                                      */
-/* Parameters:                                                                                       */
-/* rtp_number    - value from RTP packet, from NetEq                                                 */
-/* frame length  - length of signal frame in ms, from iSAC decoder                                   */
-/* send_ts       - value in RTP header giving send time in samples                                     */
-/* arr_ts        - value given by timeGetTime() time of arrival in samples of packet from NetEq      */
-/* pksize        - size of packet in bytes, from NetEq                                               */
-/* Index         - integer (range 0...23) indicating bottle neck & jitter as estimated by other side */
-/* returns 0 if everything went fine, -1 otherwise                                                   */
-int16_t WebRtcIsac_UpdateBandwidthEstimator(
-    BwEstimatorstr* bwest_str,
-    const uint16_t rtp_number,
-    const int32_t frame_length,
-    const uint32_t send_ts,
-    const uint32_t arr_ts,
-    const size_t pksize
-    /*,    const uint16_t Index*/)
-{
-  float weight = 0.0f;
-  float curr_bw_inv = 0.0f;
-  float rec_rtp_rate;
-  float t_diff_proj;
-  float arr_ts_diff;
-  float send_ts_diff;
-  float arr_time_noise;
-  float arr_time_noise_abs;
-
-  float delay_correction_factor = 1;
-  float late_diff = 0.0f;
-  int immediate_set = 0;
-  int num_pkts_expected;
-
-  RTC_DCHECK(!bwest_str->external_bw_info.in_use);
-
-  // We have to adjust the header-rate if the first packet has a
-  // frame-size different than the initialized value.
-  if ( frame_length != bwest_str->prev_frame_length )
-  {
-    bwest_str->rec_header_rate = (float)HEADER_SIZE * 8.0f *
-        1000.0f / (float)frame_length;     /* bits/s */
-  }
-
-  /* UPDATE ESTIMATES ON THIS SIDE */
-  /* compute far-side transmission rate */
-  rec_rtp_rate = ((float)pksize * 8.0f * 1000.0f / (float)frame_length) +
-      bwest_str->rec_header_rate;
-  // rec_rtp_rate packet bits/s + header bits/s
-
-  /* check for timer wrap-around */
-  if (arr_ts < bwest_str->prev_rec_arr_ts)
-  {
-    bwest_str->prev_rec_arr_ts   = arr_ts;
-    bwest_str->last_update_ts    = arr_ts;
-    bwest_str->last_reduction_ts = arr_ts + 3*FS;
-    bwest_str->num_pkts_rec      = 0;
-
-    /* store frame length */
-    bwest_str->prev_frame_length = frame_length;
-
-    /* store far-side transmission rate */
-    bwest_str->prev_rec_rtp_rate = rec_rtp_rate;
-
-    /* store far-side RTP time stamp */
-    bwest_str->prev_rec_rtp_number = rtp_number;
-
-    return 0;
-  }
-
-  bwest_str->num_pkts_rec++;
-
-  /* check that it's not one of the first 9 packets */
-  if ( bwest_str->count_tot_updates_rec > 0 )
-  {
-    if(bwest_str->in_wait_period > 0 )
-    {
-      bwest_str->in_wait_period--;
-    }
-
-    bwest_str->inWaitLatePkts -= ((bwest_str->inWaitLatePkts > 0)? 1:0);
-    send_ts_diff = (float)(send_ts - bwest_str->prev_rec_send_ts);
-
-    if (send_ts_diff <= (16 * frame_length)*2)
-      //doesn't allow for a dropped packet, not sure necessary to be
-      // that strict -DH
-    {
-      /* if not been updated for a long time, reduce the BN estimate */
-      if((uint32_t)(arr_ts - bwest_str->last_update_ts) *
-         1000.0f / FS > 3000)
-      {
-        //how many frames should have been received since the last
-        // update if too many have been dropped or there have been
-        // big delays won't allow this reduction may no longer need
-        // the send_ts_diff here
-        num_pkts_expected = (int)(((float)(arr_ts -
-                                           bwest_str->last_update_ts) * 1000.0f /(float) FS) /
-                                  (float)frame_length);
-
-        if(((float)bwest_str->num_pkts_rec/(float)num_pkts_expected) >
-           0.9)
-        {
-          float inv_bitrate = (float) pow( 0.99995,
-                                           (double)((uint32_t)(arr_ts -
-                                                                     bwest_str->last_reduction_ts)*1000.0f/FS) );
-
-          if ( inv_bitrate )
-          {
-            bwest_str->rec_bw_inv /= inv_bitrate;
-
-            //precautionary, likely never necessary
-            if (bwest_str->hsn_detect_snd &&
-                bwest_str->hsn_detect_rec)
-            {
-              if (bwest_str->rec_bw_inv > 0.000066f)
-              {
-                bwest_str->rec_bw_inv = 0.000066f;
-              }
-            }
-          }
-          else
-          {
-            bwest_str->rec_bw_inv = 1.0f /
-                (INIT_BN_EST_WB + INIT_HDR_RATE_WB);
-          }
-          /* reset time-since-update counter */
-          bwest_str->last_reduction_ts = arr_ts;
-        }
-        else
-          //reset here?
-        {
-          bwest_str->last_reduction_ts = arr_ts + 3*FS;
-          bwest_str->last_update_ts = arr_ts;
-          bwest_str->num_pkts_rec = 0;
-        }
-      }
-    }
-    else
-    {
-      bwest_str->last_reduction_ts = arr_ts + 3*FS;
-      bwest_str->last_update_ts = arr_ts;
-      bwest_str->num_pkts_rec = 0;
-    }
-
-
-    /* temporarily speed up adaptation if frame length has changed */
-    if ( frame_length != bwest_str->prev_frame_length )
-    {
-      bwest_str->count_tot_updates_rec = 10;
-      bwest_str->rec_header_rate = (float)HEADER_SIZE * 8.0f *
-          1000.0f / (float)frame_length;     /* bits/s */
-
-      bwest_str->rec_bw_inv = 1.0f /((float)bwest_str->rec_bw +
-                                     bwest_str->rec_header_rate);
-    }
-
-    ////////////////////////
-    arr_ts_diff = (float)(arr_ts - bwest_str->prev_rec_arr_ts);
-
-    if (send_ts_diff > 0 )
-    {
-      late_diff = arr_ts_diff - send_ts_diff;
-    }
-    else
-    {
-      late_diff = arr_ts_diff - (float)(16 * frame_length);
-    }
-
-    if((late_diff > 0) && !bwest_str->inWaitLatePkts)
-    {
-      bwest_str->numConsecLatePkts++;
-      bwest_str->consecLatency += late_diff;
-    }
-    else
-    {
-      bwest_str->numConsecLatePkts = 0;
-      bwest_str->consecLatency = 0;
-    }
-    if(bwest_str->numConsecLatePkts > 50)
-    {
-      float latencyMs = bwest_str->consecLatency/(FS/1000);
-      float averageLatencyMs = latencyMs / bwest_str->numConsecLatePkts;
-      delay_correction_factor = frame_length / (frame_length + averageLatencyMs);
-      immediate_set = 1;
-      bwest_str->inWaitLatePkts = (int16_t)((bwest_str->consecLatency/(FS/1000)) / 30);// + 150;
-      bwest_str->start_wait_period = arr_ts;
-    }
-    ///////////////////////////////////////////////
-
-
-
-    /*   update only if previous packet was not lost */
-    if ( rtp_number == bwest_str->prev_rec_rtp_number + 1 )
-    {
-
-
-      if (!(bwest_str->hsn_detect_snd && bwest_str->hsn_detect_rec))
-      {
-        if ((arr_ts_diff > (float)(16 * frame_length)))
-        {
-          //1/2 second
-          if ((late_diff > 8000.0f) && !bwest_str->in_wait_period)
-          {
-            delay_correction_factor = 0.7f;
-            bwest_str->in_wait_period = 55;
-            bwest_str->start_wait_period = arr_ts;
-            immediate_set = 1;
-          }
-          //320 ms
-          else if (late_diff > 5120.0f && !bwest_str->in_wait_period)
-          {
-            delay_correction_factor = 0.8f;
-            immediate_set = 1;
-            bwest_str->in_wait_period = 44;
-            bwest_str->start_wait_period = arr_ts;
-          }
-        }
-      }
-
-
-      if ((bwest_str->prev_rec_rtp_rate > bwest_str->rec_bw_avg) &&
-          (rec_rtp_rate > bwest_str->rec_bw_avg)                 &&
-          !bwest_str->in_wait_period)
-      {
-        /* test if still in initiation period and increment counter */
-        if (bwest_str->count_tot_updates_rec++ > 99)
-        {
-          /* constant weight after initiation part */
-          weight = 0.01f;
-        }
-        else
-        {
-          /* weight decreases with number of updates */
-          weight = 1.0f / (float) bwest_str->count_tot_updates_rec;
-        }
-        /* Bottle Neck Estimation */
-
-        /* limit outliers */
-        /* if more than 25 ms too much */
-        if (arr_ts_diff > frame_length * FS/1000 + 400.0f)
-        {
-          // in samples,  why 25ms??
-          arr_ts_diff = frame_length * FS/1000 + 400.0f;
-        }
-        if(arr_ts_diff < (frame_length * FS/1000) - 160.0f)
-        {
-          /* don't allow it to be less than frame rate - 10 ms */
-          arr_ts_diff = (float)frame_length * FS/1000 - 160.0f;
-        }
-
-        /* compute inverse receiving rate for last packet */
-        curr_bw_inv = arr_ts_diff / ((float)(pksize + HEADER_SIZE) *
-                                     8.0f * FS); // (180+35)*8*16000 = 27.5 Mbit....
-
-
-        if(curr_bw_inv <
-           (1.0f / (MAX_ISAC_BW + bwest_str->rec_header_rate)))
-        {
-          // don't allow inv rate to be larger than MAX
-          curr_bw_inv = (1.0f /
-                         (MAX_ISAC_BW + bwest_str->rec_header_rate));
-        }
-
-        /* update bottle neck rate estimate */
-        bwest_str->rec_bw_inv = weight * curr_bw_inv +
-            (1.0f - weight) * bwest_str->rec_bw_inv;
-
-        /* reset time-since-update counter */
-        bwest_str->last_update_ts    = arr_ts;
-        bwest_str->last_reduction_ts = arr_ts + 3 * FS;
-        bwest_str->num_pkts_rec = 0;
-
-        /* Jitter Estimation */
-        /* projected difference between arrival times */
-        t_diff_proj = ((float)(pksize + HEADER_SIZE) * 8.0f *
-                       1000.0f) / bwest_str->rec_bw_avg;
-
-
-        // difference between projected and actual
-        //   arrival time differences
-        arr_time_noise = (float)(arr_ts_diff*1000.0f/FS) -
-            t_diff_proj;
-        arr_time_noise_abs = (float) fabs( arr_time_noise );
-
-        /* long term averaged absolute jitter */
-        bwest_str->rec_jitter = weight * arr_time_noise_abs +
-            (1.0f - weight) * bwest_str->rec_jitter;
-        if (bwest_str->rec_jitter > 10.0f)
-        {
-          bwest_str->rec_jitter = 10.0f;
-        }
-        /* short term averaged absolute jitter */
-        bwest_str->rec_jitter_short_term_abs = 0.05f *
-            arr_time_noise_abs + 0.95f *
-            bwest_str->rec_jitter_short_term_abs;
-
-        /* short term averaged jitter */
-        bwest_str->rec_jitter_short_term = 0.05f * arr_time_noise +
-            0.95f * bwest_str->rec_jitter_short_term;
-      }
-    }
-  }
-  else
-  {
-    // reset time-since-update counter when
-    // receiving the first 9 packets
-    bwest_str->last_update_ts    = arr_ts;
-    bwest_str->last_reduction_ts = arr_ts + 3*FS;
-    bwest_str->num_pkts_rec = 0;
-
-    bwest_str->count_tot_updates_rec++;
-  }
-
-  /* limit minimum bottle neck rate */
-  if (bwest_str->rec_bw_inv > 1.0f / ((float)MIN_ISAC_BW +
-                                      bwest_str->rec_header_rate))
-  {
-    bwest_str->rec_bw_inv = 1.0f / ((float)MIN_ISAC_BW +
-                                    bwest_str->rec_header_rate);
-  }
-
-  // limit maximum bitrate
-  if (bwest_str->rec_bw_inv < 1.0f / ((float)MAX_ISAC_BW +
-                                      bwest_str->rec_header_rate))
-  {
-    bwest_str->rec_bw_inv = 1.0f / ((float)MAX_ISAC_BW +
-                                    bwest_str->rec_header_rate);
-  }
-
-  /* store frame length */
-  bwest_str->prev_frame_length = frame_length;
-
-  /* store far-side transmission rate */
-  bwest_str->prev_rec_rtp_rate = rec_rtp_rate;
-
-  /* store far-side RTP time stamp */
-  bwest_str->prev_rec_rtp_number = rtp_number;
-
-  // Replace bwest_str->rec_max_delay by the new
-  // value (atomic operation)
-  bwest_str->rec_max_delay = 3.0f * bwest_str->rec_jitter;
-
-  /* store send and arrival time stamp */
-  bwest_str->prev_rec_arr_ts = arr_ts ;
-  bwest_str->prev_rec_send_ts = send_ts;
-
-  /* Replace bwest_str->rec_bw by the new value (atomic operation) */
-  bwest_str->rec_bw = (int32_t)(1.0f / bwest_str->rec_bw_inv -
-                                      bwest_str->rec_header_rate);
-
-  if (immediate_set)
-  {
-    bwest_str->rec_bw = (int32_t) (delay_correction_factor *
-                                         (float) bwest_str->rec_bw);
-
-    if (bwest_str->rec_bw < (int32_t) MIN_ISAC_BW)
-    {
-      bwest_str->rec_bw = (int32_t) MIN_ISAC_BW;
-    }
-
-    bwest_str->rec_bw_avg = bwest_str->rec_bw +
-        bwest_str->rec_header_rate;
-
-    bwest_str->rec_bw_avg_Q = (float) bwest_str->rec_bw;
-
-    bwest_str->rec_jitter_short_term = 0.0f;
-
-    bwest_str->rec_bw_inv = 1.0f / (bwest_str->rec_bw +
-                                    bwest_str->rec_header_rate);
-
-    bwest_str->count_tot_updates_rec = 1;
-
-    immediate_set = 0;
-    bwest_str->consecLatency = 0;
-    bwest_str->numConsecLatePkts = 0;
-  }
-
-  return 0;
-}
-
-
-/* This function updates the send bottle neck rate                                                   */
-/* Index         - integer (range 0...23) indicating bottle neck & jitter as estimated by other side */
-/* returns 0 if everything went fine, -1 otherwise                                                   */
-int16_t WebRtcIsac_UpdateUplinkBwImpl(
-    BwEstimatorstr*           bwest_str,
-    int16_t               index,
-    enum IsacSamplingRate encoderSamplingFreq)
-{
-  RTC_DCHECK(!bwest_str->external_bw_info.in_use);
-
-  if((index < 0) || (index > 23))
-  {
-    return -ISAC_RANGE_ERROR_BW_ESTIMATOR;
-  }
-
-  /* UPDATE ESTIMATES FROM OTHER SIDE */
-  if(encoderSamplingFreq == kIsacWideband)
-  {
-    if(index > 11)
-    {
-      index -= 12;   
-      /* compute the jitter estimate as decoded on the other side */
-      bwest_str->send_max_delay_avg = 0.9f * bwest_str->send_max_delay_avg +
-          0.1f * (float)MAX_ISAC_MD;
-    }
-    else
-    {
-      /* compute the jitter estimate as decoded on the other side */
-      bwest_str->send_max_delay_avg = 0.9f * bwest_str->send_max_delay_avg +
-          0.1f * (float)MIN_ISAC_MD;
-    }
-
-    /* compute the BN estimate as decoded on the other side */
-    bwest_str->send_bw_avg = 0.9f * bwest_str->send_bw_avg +
-        0.1f * kQRateTableWb[index];
-  }
-  else
-  {
-    /* compute the BN estimate as decoded on the other side */
-    bwest_str->send_bw_avg = 0.9f * bwest_str->send_bw_avg +
-        0.1f * kQRateTableSwb[index];
-  }
-
-  if (bwest_str->send_bw_avg > (float) 28000 && !bwest_str->hsn_detect_snd)
-  {
-    bwest_str->num_consec_snt_pkts_over_30k++;
-
-    if (bwest_str->num_consec_snt_pkts_over_30k >= 66)
-    {
-      //approx 2 seconds with 30ms frames
-      bwest_str->hsn_detect_snd = 1;
-    }
-  }
-  else if (!bwest_str->hsn_detect_snd)
-  {
-    bwest_str->num_consec_snt_pkts_over_30k = 0;
-  }
-  return 0;
-}
-
-// called when there is upper-band bit-stream to update jitter
-// statistics.
-int16_t WebRtcIsac_UpdateUplinkJitter(
-    BwEstimatorstr*              bwest_str,
-    int32_t                  index)
-{
-  RTC_DCHECK(!bwest_str->external_bw_info.in_use);
-
-  if((index < 0) || (index > 23))
-  {
-    return -ISAC_RANGE_ERROR_BW_ESTIMATOR;
-  }
-
-  if(index > 0)
-  {
-    /* compute the jitter estimate as decoded on the other side */
-    bwest_str->send_max_delay_avg = 0.9f * bwest_str->send_max_delay_avg +
-        0.1f * (float)MAX_ISAC_MD;
-  }
-  else
-  {
-    /* compute the jitter estimate as decoded on the other side */
-    bwest_str->send_max_delay_avg = 0.9f * bwest_str->send_max_delay_avg +
-        0.1f * (float)MIN_ISAC_MD;
-  }
-
-  return 0;
-}
-
-
-
-// Returns the bandwidth/jitter estimation code (integer 0...23)
-// to put in the sending iSAC payload
-void
-WebRtcIsac_GetDownlinkBwJitIndexImpl(
-    BwEstimatorstr*           bwest_str,
-    int16_t*              bottleneckIndex,
-    int16_t*              jitterInfo,
-    enum IsacSamplingRate decoderSamplingFreq)
-{
-  float MaxDelay;
-  //uint16_t MaxDelayBit;
-
-  float rate;
-  float r;
-  float e1, e2;
-  const float weight = 0.1f;
-  const float* ptrQuantizationTable;
-  int16_t addJitterInfo;
-  int16_t minInd;
-  int16_t maxInd;
-  int16_t midInd;
-
-  if (bwest_str->external_bw_info.in_use) {
-    *bottleneckIndex = bwest_str->external_bw_info.bottleneck_idx;
-    *jitterInfo = bwest_str->external_bw_info.jitter_info;
-    return;
-  }
-
-  /* Get Max Delay Bit */
-  /* get unquantized max delay */
-  MaxDelay = (float)WebRtcIsac_GetDownlinkMaxDelay(bwest_str);
-
-  if ( ((1.f - weight) * bwest_str->rec_max_delay_avg_Q + weight *
-        MAX_ISAC_MD - MaxDelay) > (MaxDelay - (1.f-weight) *
-                                   bwest_str->rec_max_delay_avg_Q - weight * MIN_ISAC_MD) )
-  {
-    jitterInfo[0] = 0;
-    /* update quantized average */
-    bwest_str->rec_max_delay_avg_Q =
-        (1.f - weight) * bwest_str->rec_max_delay_avg_Q + weight *
-        (float)MIN_ISAC_MD;
-  }
-  else
-  {
-    jitterInfo[0] = 1;
-    /* update quantized average */
-    bwest_str->rec_max_delay_avg_Q =
-        (1.f-weight) * bwest_str->rec_max_delay_avg_Q + weight *
-        (float)MAX_ISAC_MD;
-  }
-
-  // Get unquantized rate.
-  rate = (float)WebRtcIsac_GetDownlinkBandwidth(bwest_str);
-
-  /* Get Rate Index */
-  if(decoderSamplingFreq == kIsacWideband)
-  {
-    ptrQuantizationTable = kQRateTableWb;
-    addJitterInfo = 1;
-    maxInd = 11;
-  }
-  else
-  {
-    ptrQuantizationTable = kQRateTableSwb;
-    addJitterInfo = 0;
-    maxInd = 23;
-  }
-
-  minInd = 0;
-  while(maxInd > minInd + 1)
-  {
-    midInd = (maxInd + minInd) >> 1;
-    if(rate > ptrQuantizationTable[midInd])
-    {
-      minInd = midInd;
-    }
-    else
-    {
-      maxInd = midInd;
-    }
-  }
-  // Chose the index which gives results an average which is closest
-  // to rate
-  r = (1 - weight) * bwest_str->rec_bw_avg_Q - rate;
-  e1 = weight * ptrQuantizationTable[minInd] + r;
-  e2 = weight * ptrQuantizationTable[maxInd] + r;
-  e1 = (e1 > 0)? e1:-e1;
-  e2 = (e2 > 0)? e2:-e2;
-  if(e1 < e2)
-  {
-    bottleneckIndex[0] = minInd;
-  }
-  else
-  {
-    bottleneckIndex[0] = maxInd;
-  }
-
-  bwest_str->rec_bw_avg_Q = (1 - weight) * bwest_str->rec_bw_avg_Q +
-      weight * ptrQuantizationTable[bottleneckIndex[0]];
-  bottleneckIndex[0] += jitterInfo[0] * 12 * addJitterInfo;
-
-  bwest_str->rec_bw_avg = (1 - weight) * bwest_str->rec_bw_avg + weight *
-      (rate + bwest_str->rec_header_rate);
-}
-
-
-
-/* get the bottle neck rate from far side to here, as estimated on this side */
-int32_t WebRtcIsac_GetDownlinkBandwidth( const BwEstimatorstr *bwest_str)
-{
-  int32_t  rec_bw;
-  float   jitter_sign;
-  float   bw_adjust;
-
-  RTC_DCHECK(!bwest_str->external_bw_info.in_use);
-
-  /* create a value between -1.0 and 1.0 indicating "average sign" of jitter */
-  jitter_sign = bwest_str->rec_jitter_short_term /
-      bwest_str->rec_jitter_short_term_abs;
-
-  /* adjust bw proportionally to negative average jitter sign */
-  bw_adjust = 1.0f - jitter_sign * (0.15f + 0.15f * jitter_sign * jitter_sign);
-
-  /* adjust Rate if jitter sign is mostly constant */
-  rec_bw = (int32_t)(bwest_str->rec_bw * bw_adjust);
-
-  /* limit range of bottle neck rate */
-  if (rec_bw < MIN_ISAC_BW)
-  {
-    rec_bw = MIN_ISAC_BW;
-  }
-  else if (rec_bw > MAX_ISAC_BW)
-  {
-    rec_bw = MAX_ISAC_BW;
-  }
-  return rec_bw;
-}
-
-/* Returns the max delay (in ms) */
-int32_t
-WebRtcIsac_GetDownlinkMaxDelay(const BwEstimatorstr *bwest_str)
-{
-  int32_t rec_max_delay;
-
-  RTC_DCHECK(!bwest_str->external_bw_info.in_use);
-
-  rec_max_delay = (int32_t)(bwest_str->rec_max_delay);
-
-  /* limit range of jitter estimate */
-  if (rec_max_delay < MIN_ISAC_MD)
-  {
-    rec_max_delay = MIN_ISAC_MD;
-  }
-  else if (rec_max_delay > MAX_ISAC_MD)
-  {
-    rec_max_delay = MAX_ISAC_MD;
-  }
-  return rec_max_delay;
-}
-
-/* Clamp val to the closed interval [min,max]. */
-static int32_t clamp(int32_t val, int32_t min, int32_t max) {
-  RTC_DCHECK_LE(min, max);
-  return val < min ? min : (val > max ? max : val);
-}
-
-int32_t WebRtcIsac_GetUplinkBandwidth(const BwEstimatorstr* bwest_str) {
-  return bwest_str->external_bw_info.in_use
-             ? bwest_str->external_bw_info.send_bw_avg
-             : clamp(bwest_str->send_bw_avg, MIN_ISAC_BW, MAX_ISAC_BW);
-}
-
-int32_t WebRtcIsac_GetUplinkMaxDelay(const BwEstimatorstr* bwest_str) {
-  return bwest_str->external_bw_info.in_use
-             ? bwest_str->external_bw_info.send_max_delay_avg
-             : clamp(bwest_str->send_max_delay_avg, MIN_ISAC_MD, MAX_ISAC_MD);
-}
-
-void WebRtcIsacBw_GetBandwidthInfo(BwEstimatorstr* bwest_str,
-                                   enum IsacSamplingRate decoder_sample_rate_hz,
-                                   IsacBandwidthInfo* bwinfo) {
-  RTC_DCHECK(!bwest_str->external_bw_info.in_use);
-  bwinfo->in_use = 1;
-  bwinfo->send_bw_avg = WebRtcIsac_GetUplinkBandwidth(bwest_str);
-  bwinfo->send_max_delay_avg = WebRtcIsac_GetUplinkMaxDelay(bwest_str);
-  WebRtcIsac_GetDownlinkBwJitIndexImpl(bwest_str, &bwinfo->bottleneck_idx,
-                                       &bwinfo->jitter_info,
-                                       decoder_sample_rate_hz);
-}
-
-void WebRtcIsacBw_SetBandwidthInfo(BwEstimatorstr* bwest_str,
-                                   const IsacBandwidthInfo* bwinfo) {
-  memcpy(&bwest_str->external_bw_info, bwinfo,
-         sizeof bwest_str->external_bw_info);
-}
-
-/*
- * update long-term average bitrate and amount of data in buffer
- * returns minimum payload size (bytes)
- */
-int WebRtcIsac_GetMinBytes(
-    RateModel*         State,
-    int                StreamSize,    /* bytes in bitstream */
-    const int          FrameSamples,  /* samples per frame */
-    const double       BottleNeck,    /* bottle neck rate; excl headers (bps) */
-    const double       DelayBuildUp,  /* max delay from bottleneck buffering (ms) */
-    enum ISACBandwidth bandwidth
-    /*,int16_t        frequentLargePackets*/)
-{
-  double MinRate = 0.0;
-  int    MinBytes;
-  double TransmissionTime;
-  int    burstInterval = BURST_INTERVAL;
-
-  // first 10 packets @ low rate, then INIT_BURST_LEN packets @
-  // fixed rate of INIT_RATE bps
-  if (State->InitCounter > 0)
-  {
-    if (State->InitCounter-- <= INIT_BURST_LEN)
-    {
-      if(bandwidth == isac8kHz)
-      {
-        MinRate = INIT_RATE_WB;
-      }
-      else
-      {
-        MinRate = INIT_RATE_SWB;
-      }
-    }
-    else
-    {
-      MinRate = 0;
-    }
-  }
-  else
-  {
-    /* handle burst */
-    if (State->BurstCounter)
-    {
-      if (State->StillBuffered < (1.0 - 1.0/BURST_LEN) * DelayBuildUp)
-      {
-        /* max bps derived from BottleNeck and DelayBuildUp values */
-        MinRate = (1.0 + (FS/1000) * DelayBuildUp /
-                   (double)(BURST_LEN * FrameSamples)) * BottleNeck;
-      }
-      else
-      {
-        // max bps derived from StillBuffered and DelayBuildUp
-        // values
-        MinRate = (1.0 + (FS/1000) * (DelayBuildUp -
-                                      State->StillBuffered) / (double)FrameSamples) * BottleNeck;
-        if (MinRate < 1.04 * BottleNeck)
-        {
-          MinRate = 1.04 * BottleNeck;
-        }
-      }
-      State->BurstCounter--;
-    }
-  }
-
-
-  /* convert rate from bits/second to bytes/packet */
-  MinBytes = (int) (MinRate * FrameSamples / (8.0 * FS));
-
-  /* StreamSize will be adjusted if less than MinBytes */
-  if (StreamSize < MinBytes)
-  {
-    StreamSize = MinBytes;
-  }
-
-  /* keep track of when bottle neck was last exceeded by at least 1% */
-  if (StreamSize * 8.0 * FS / FrameSamples > 1.01 * BottleNeck) {
-    if (State->PrevExceed) {
-      /* bottle_neck exceded twice in a row, decrease ExceedAgo */
-      State->ExceedAgo -= /*BURST_INTERVAL*/ burstInterval / (BURST_LEN - 1);
-      if (State->ExceedAgo < 0)
-        State->ExceedAgo = 0;
-    }
-    else
-    {
-      State->ExceedAgo += (FrameSamples * 1000) / FS; /* ms */
-      State->PrevExceed = 1;
-    }
-  }
-  else
-  {
-    State->PrevExceed = 0;
-    State->ExceedAgo += (FrameSamples * 1000) / FS;     /* ms */
-  }
-
-  /* set burst flag if bottle neck not exceeded for long time */
-  if ((State->ExceedAgo > burstInterval) &&
-      (State->BurstCounter == 0))
-  {
-    if (State->PrevExceed)
-    {
-      State->BurstCounter = BURST_LEN - 1;
-    }
-    else
-    {
-      State->BurstCounter = BURST_LEN;
-    }
-  }
-
-
-  /* Update buffer delay */
-  TransmissionTime = StreamSize * 8.0 * 1000.0 / BottleNeck;  /* ms */
-  State->StillBuffered += TransmissionTime;
-  State->StillBuffered -= (FrameSamples * 1000) / FS;     /* ms */
-  if (State->StillBuffered < 0.0)
-  {
-    State->StillBuffered = 0.0;
-  }
-
-  return MinBytes;
-}
-
-
-/*
- * update long-term average bitrate and amount of data in buffer
- */
-void WebRtcIsac_UpdateRateModel(
-    RateModel *State,
-    int StreamSize,                    /* bytes in bitstream */
-    const int FrameSamples,            /* samples per frame */
-    const double BottleNeck)        /* bottle neck rate; excl headers (bps) */
-{
-  double TransmissionTime;
-
-  /* avoid the initial "high-rate" burst */
-  State->InitCounter = 0;
-
-  /* Update buffer delay */
-  TransmissionTime = StreamSize * 8.0 * 1000.0 / BottleNeck;  /* ms */
-  State->StillBuffered += TransmissionTime;
-  State->StillBuffered -= (FrameSamples * 1000) / FS;     /* ms */
-  if (State->StillBuffered < 0.0)
-    State->StillBuffered = 0.0;
-
-}
-
-
-void WebRtcIsac_InitRateModel(
-    RateModel *State)
-{
-  State->PrevExceed      = 0;                        /* boolean */
-  State->ExceedAgo       = 0;                        /* ms */
-  State->BurstCounter    = 0;                        /* packets */
-  State->InitCounter     = INIT_BURST_LEN + 10;    /* packets */
-  State->StillBuffered   = 1.0;                    /* ms */
-}
-
-int WebRtcIsac_GetNewFrameLength(
-    double bottle_neck,
-    int    current_framesamples)
-{
-  int new_framesamples;
-
-  const int Thld_20_30 = 20000;
-
-  //const int Thld_30_20 = 30000;
-  const int Thld_30_20 = 1000000;   // disable 20 ms frames
-
-  const int Thld_30_60 = 18000;
-  //const int Thld_30_60 = 0;      // disable 60 ms frames
-
-  const int Thld_60_30 = 27000;
-
-
-  new_framesamples = current_framesamples;
-
-  /* find new framelength */
-  switch(current_framesamples) {
-    case 320:
-      if (bottle_neck < Thld_20_30)
-        new_framesamples = 480;
-      break;
-    case 480:
-      if (bottle_neck < Thld_30_60)
-        new_framesamples = 960;
-      else if (bottle_neck > Thld_30_20)
-        new_framesamples = 320;
-      break;
-    case 960:
-      if (bottle_neck >= Thld_60_30)
-        new_framesamples = 480;
-      break;
-  }
-
-  return new_framesamples;
-}
-
-double WebRtcIsac_GetSnr(
-    double bottle_neck,
-    int    framesamples)
-{
-  double s2nr;
-
-  const double a_20 = -30.0;
-  const double b_20 = 0.8;
-  const double c_20 = 0.0;
-
-  const double a_30 = -23.0;
-  const double b_30 = 0.48;
-  const double c_30 = 0.0;
-
-  const double a_60 = -23.0;
-  const double b_60 = 0.53;
-  const double c_60 = 0.0;
-
-
-  /* find new SNR value */
-  switch(framesamples) {
-    case 320:
-      s2nr = a_20 + b_20 * bottle_neck * 0.001 + c_20 * bottle_neck *
-          bottle_neck * 0.000001;
-      break;
-    case 480:
-      s2nr = a_30 + b_30 * bottle_neck * 0.001 + c_30 * bottle_neck *
-          bottle_neck * 0.000001;
-      break;
-    case 960:
-      s2nr = a_60 + b_60 * bottle_neck * 0.001 + c_60 * bottle_neck *
-          bottle_neck * 0.000001;
-      break;
-    default:
-      s2nr = 0;
-  }
-
-  return s2nr;
-
-}
diff --git a/modules/audio_coding/codecs/isac/main/source/bandwidth_estimator.h b/modules/audio_coding/codecs/isac/main/source/bandwidth_estimator.h
deleted file mode 100644
index 0704337..0000000
--- a/modules/audio_coding/codecs/isac/main/source/bandwidth_estimator.h
+++ /dev/null
@@ -1,184 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/*
- * bandwidth_estimator.h
- *
- * This header file contains the API for the Bandwidth Estimator
- * designed for iSAC.
- *
- */
-
-#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_MAIN_SOURCE_BANDWIDTH_ESTIMATOR_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_MAIN_SOURCE_BANDWIDTH_ESTIMATOR_H_
-
-#include "structs.h"
-#include "settings.h"
-
-
-#define MIN_ISAC_BW     10000
-#define MIN_ISAC_BW_LB  10000
-#define MIN_ISAC_BW_UB  25000
-
-#define MAX_ISAC_BW     56000
-#define MAX_ISAC_BW_UB  32000
-#define MAX_ISAC_BW_LB  32000
-
-#define MIN_ISAC_MD     5
-#define MAX_ISAC_MD     25
-
-// assumed header size, in bytes; we don't know the exact number
-// (header compression may be used)
-#define HEADER_SIZE        35
-
-// Initial Frame-Size, in ms, for Wideband & Super-Wideband Mode
-#define INIT_FRAME_LEN_WB  60
-#define INIT_FRAME_LEN_SWB 30
-
-// Initial Bottleneck Estimate, in bits/sec, for
-// Wideband & Super-wideband mode
-#define INIT_BN_EST_WB     20e3f
-#define INIT_BN_EST_SWB    56e3f
-
-// Initial Header rate (header rate depends on frame-size),
-// in bits/sec, for Wideband & Super-Wideband mode.
-#define INIT_HDR_RATE_WB                                                \
-  ((float)HEADER_SIZE * 8.0f * 1000.0f / (float)INIT_FRAME_LEN_WB)
-#define INIT_HDR_RATE_SWB                                               \
-  ((float)HEADER_SIZE * 8.0f * 1000.0f / (float)INIT_FRAME_LEN_SWB)
-
-// number of packets in a row for a high rate burst
-#define BURST_LEN       3
-
-// ms, max time between two full bursts
-#define BURST_INTERVAL  500
-
-// number of packets in a row for initial high rate burst
-#define INIT_BURST_LEN  5
-
-// bits/s, rate for the first BURST_LEN packets
-#define INIT_RATE_WB       INIT_BN_EST_WB
-#define INIT_RATE_SWB      INIT_BN_EST_SWB
-
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-  /* This function initializes the struct                    */
-  /* to be called before using the struct for anything else  */
-  /* returns 0 if everything went fine, -1 otherwise         */
-  int32_t WebRtcIsac_InitBandwidthEstimator(
-      BwEstimatorstr*           bwest_str,
-      enum IsacSamplingRate encoderSampRate,
-      enum IsacSamplingRate decoderSampRate);
-
-  /* This function updates the receiving estimate                                                      */
-  /* Parameters:                                                                                       */
-  /* rtp_number    - value from RTP packet, from NetEq                                                 */
-  /* frame length  - length of signal frame in ms, from iSAC decoder                                   */
-  /* send_ts       - value in RTP header giving send time in samples                                   */
-  /* arr_ts        - value given by timeGetTime() time of arrival in samples of packet from NetEq      */
-  /* pksize        - size of packet in bytes, from NetEq                                               */
-  /* Index         - integer (range 0...23) indicating bottle neck & jitter as estimated by other side */
-  /* returns 0 if everything went fine, -1 otherwise                                                   */
-  int16_t WebRtcIsac_UpdateBandwidthEstimator(
-      BwEstimatorstr* bwest_str,
-      const uint16_t rtp_number,
-      const int32_t frame_length,
-      const uint32_t send_ts,
-      const uint32_t arr_ts,
-      const size_t pksize);
-
-  /* Update receiving estimates. Used when we only receive BWE index, no iSAC data packet. */
-  int16_t WebRtcIsac_UpdateUplinkBwImpl(
-      BwEstimatorstr*           bwest_str,
-      int16_t               Index,
-      enum IsacSamplingRate encoderSamplingFreq);
-
-  /* Returns the bandwidth/jitter estimation code (integer 0...23) to put in the sending iSAC payload */
-  void WebRtcIsac_GetDownlinkBwJitIndexImpl(
-      BwEstimatorstr* bwest_str,
-      int16_t* bottleneckIndex,
-      int16_t* jitterInfo,
-      enum IsacSamplingRate decoderSamplingFreq);
-
-  /* Returns the bandwidth estimation (in bps) */
-  int32_t WebRtcIsac_GetDownlinkBandwidth(
-      const BwEstimatorstr *bwest_str);
-
-  /* Returns the max delay (in ms) */
-  int32_t WebRtcIsac_GetDownlinkMaxDelay(
-      const BwEstimatorstr *bwest_str);
-
-  /* Returns the bandwidth that iSAC should send with in bps */
-  int32_t WebRtcIsac_GetUplinkBandwidth(const BwEstimatorstr* bwest_str);
-
-  /* Returns the max delay value from the other side in ms */
-  int32_t WebRtcIsac_GetUplinkMaxDelay(
-      const BwEstimatorstr *bwest_str);
-
-  /* Fills in an IsacExternalBandwidthInfo struct. */
-  void WebRtcIsacBw_GetBandwidthInfo(
-      BwEstimatorstr* bwest_str,
-      enum IsacSamplingRate decoder_sample_rate_hz,
-      IsacBandwidthInfo* bwinfo);
-
-  /* Uses the values from an IsacExternalBandwidthInfo struct. */
-  void WebRtcIsacBw_SetBandwidthInfo(BwEstimatorstr* bwest_str,
-                                     const IsacBandwidthInfo* bwinfo);
-
-  /*
-   * update amount of data in bottle neck buffer and burst handling
-   * returns minimum payload size (bytes)
-   */
-  int WebRtcIsac_GetMinBytes(
-      RateModel*         State,
-      int                StreamSize,    /* bytes in bitstream */
-      const int          FrameLen,      /* ms per frame */
-      const double       BottleNeck,    /* bottle neck rate; excl headers (bps) */
-      const double       DelayBuildUp,  /* max delay from bottleneck buffering (ms) */
-      enum ISACBandwidth bandwidth
-      /*,int16_t        frequentLargePackets*/);
-
-  /*
-   * update long-term average bitrate and amount of data in buffer
-   */
-  void WebRtcIsac_UpdateRateModel(
-      RateModel*   State,
-      int          StreamSize,                /* bytes in bitstream */
-      const int    FrameSamples,        /* samples per frame */
-      const double BottleNeck);       /* bottle neck rate; excl headers (bps) */
-
-
-  void WebRtcIsac_InitRateModel(
-      RateModel *State);
-
-  /* Returns the new framelength value (input argument: bottle_neck) */
-  int WebRtcIsac_GetNewFrameLength(
-      double bottle_neck,
-      int    current_framelength);
-
-  /* Returns the new SNR value (input argument: bottle_neck) */
-  double WebRtcIsac_GetSnr(
-      double bottle_neck,
-      int    new_framelength);
-
-
-  int16_t WebRtcIsac_UpdateUplinkJitter(
-      BwEstimatorstr*              bwest_str,
-      int32_t                  index);
-
-#if defined(__cplusplus)
-}
-#endif
-
-
-#endif /* WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_MAIN_SOURCE_BANDWIDTH_ESTIMATOR_H_ */
diff --git a/modules/audio_coding/codecs/isac/main/source/codec.h b/modules/audio_coding/codecs/isac/main/source/codec.h
deleted file mode 100644
index 7ef64b5..0000000
--- a/modules/audio_coding/codecs/isac/main/source/codec.h
+++ /dev/null
@@ -1,233 +0,0 @@
-/*
- *  Copyright (c) 2012 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.
- */
-
-/*
- * codec.h
- *
- * This header file contains the calls to the internal encoder
- * and decoder functions.
- *
- */
-
-#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_MAIN_SOURCE_CODEC_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_MAIN_SOURCE_CODEC_H_
-
-#include "structs.h"
-
-
-void WebRtcIsac_ResetBitstream(Bitstr* bit_stream);
-
-int WebRtcIsac_EstimateBandwidth(BwEstimatorstr* bwest_str, Bitstr* streamdata,
-                                 size_t packet_size,
-                                 uint16_t rtp_seq_number,
-                                 uint32_t send_ts, uint32_t arr_ts,
-                                 enum IsacSamplingRate encoderSampRate,
-                                 enum IsacSamplingRate decoderSampRate);
-
-int WebRtcIsac_DecodeLb(const TransformTables* transform_tables,
-                        float* signal_out,
-                        ISACLBDecStruct* ISACdec_obj,
-                        int16_t* current_framesamples,
-                        int16_t isRCUPayload);
-
-int WebRtcIsac_DecodeRcuLb(float* signal_out, ISACLBDecStruct* ISACdec_obj,
-                           int16_t* current_framesamples);
-
-int WebRtcIsac_EncodeLb(const TransformTables* transform_tables,
-                        float* in,
-                        ISACLBEncStruct* ISACencLB_obj,
-                        int16_t codingMode,
-                        int16_t bottleneckIndex);
-
-int WebRtcIsac_EncodeStoredDataLb(const IsacSaveEncoderData* ISACSavedEnc_obj,
-                                  Bitstr* ISACBitStr_obj, int BWnumber,
-                                  float scale);
-
-int WebRtcIsac_EncodeStoredDataUb(
-    const ISACUBSaveEncDataStruct* ISACSavedEnc_obj, Bitstr* bitStream,
-    int32_t jitterInfo, float scale, enum ISACBandwidth bandwidth);
-
-int16_t WebRtcIsac_GetRedPayloadUb(
-    const ISACUBSaveEncDataStruct* ISACSavedEncObj, Bitstr* bitStreamObj,
-    enum ISACBandwidth bandwidth);
-
-/******************************************************************************
- * WebRtcIsac_RateAllocation()
- * Internal function to perform a rate-allocation for upper and lower-band,
- * given a total rate.
- *
- * Input:
- *   - inRateBitPerSec           : a total bit-rate in bits/sec.
- *
- * Output:
- *   - rateLBBitPerSec           : a bit-rate allocated to the lower-band
- *                                 in bits/sec.
- *   - rateUBBitPerSec           : a bit-rate allocated to the upper-band
- *                                 in bits/sec.
- *
- * Return value                  : 0 if rate allocation has been successful.
- *                                -1 if failed to allocate rates.
- */
-
-int16_t WebRtcIsac_RateAllocation(int32_t inRateBitPerSec,
-                                  double* rateLBBitPerSec,
-                                  double* rateUBBitPerSec,
-                                  enum ISACBandwidth* bandwidthKHz);
-
-
-/******************************************************************************
- * WebRtcIsac_DecodeUb16()
- *
- * Decode the upper-band if the codec is in 0-16 kHz mode.
- *
- * Input/Output:
- *       -ISACdec_obj        : pointer to the upper-band decoder object. The
- *                             bit-stream is stored inside the decoder object.
- *
- * Output:
- *       -signal_out         : decoded audio, 480 samples 30 ms.
- *
- * Return value              : >0 number of decoded bytes.
- *                             <0 if an error occurred.
- */
-int WebRtcIsac_DecodeUb16(const TransformTables* transform_tables,
-                          float* signal_out,
-                          ISACUBDecStruct* ISACdec_obj,
-                          int16_t isRCUPayload);
-
-/******************************************************************************
- * WebRtcIsac_DecodeUb12()
- *
- * Decode the upper-band if the codec is in 0-12 kHz mode.
- *
- * Input/Output:
- *       -ISACdec_obj        : pointer to the upper-band decoder object. The
- *                             bit-stream is stored inside the decoder object.
- *
- * Output:
- *       -signal_out         : decoded audio, 480 samples 30 ms.
- *
- * Return value              : >0 number of decoded bytes.
- *                             <0 if an error occurred.
- */
-int WebRtcIsac_DecodeUb12(const TransformTables* transform_tables,
-                          float* signal_out,
-                          ISACUBDecStruct* ISACdec_obj,
-                          int16_t isRCUPayload);
-
-/******************************************************************************
- * WebRtcIsac_EncodeUb16()
- *
- * Encode the upper-band if the codec is in 0-16 kHz mode.
- *
- * Input:
- *       -in                 : upper-band audio, 160 samples (10 ms).
- *
- * Input/Output:
- *       -ISACdec_obj        : pointer to the upper-band encoder object. The
- *                             bit-stream is stored inside the encoder object.
- *
- * Return value              : >0 number of encoded bytes.
- *                             <0 if an error occurred.
- */
-int WebRtcIsac_EncodeUb16(const TransformTables* transform_tables,
-                          float* in,
-                          ISACUBEncStruct* ISACenc_obj,
-                          int32_t jitterInfo);
-
-/******************************************************************************
- * WebRtcIsac_EncodeUb12()
- *
- * Encode the upper-band if the codec is in 0-12 kHz mode.
- *
- * Input:
- *       -in                 : upper-band audio, 160 samples (10 ms).
- *
- * Input/Output:
- *       -ISACdec_obj        : pointer to the upper-band encoder object. The
- *                             bit-stream is stored inside the encoder object.
- *
- * Return value              : >0 number of encoded bytes.
- *                             <0 if an error occurred.
- */
-int WebRtcIsac_EncodeUb12(const TransformTables* transform_tables,
-                          float* in,
-                          ISACUBEncStruct* ISACenc_obj,
-                          int32_t jitterInfo);
-
-/************************** initialization functions *************************/
-
-void WebRtcIsac_InitMasking(MaskFiltstr* maskdata);
-
-void WebRtcIsac_InitPreFilterbank(PreFiltBankstr* prefiltdata);
-
-void WebRtcIsac_InitPostFilterbank(PostFiltBankstr* postfiltdata);
-
-void WebRtcIsac_InitPitchFilter(PitchFiltstr* pitchfiltdata);
-
-void WebRtcIsac_InitPitchAnalysis(PitchAnalysisStruct* State);
-
-
-/**************************** transform functions ****************************/
-
-void WebRtcIsac_InitTransform(TransformTables* tables);
-
-void WebRtcIsac_Time2Spec(const TransformTables* tables,
-                          double* inre1,
-                          double* inre2,
-                          int16_t* outre,
-                          int16_t* outim,
-                          FFTstr* fftstr_obj);
-
-void WebRtcIsac_Spec2time(const TransformTables* tables,
-                          double* inre,
-                          double* inim,
-                          double* outre1,
-                          double* outre2,
-                          FFTstr* fftstr_obj);
-
-/******************************* filter functions ****************************/
-
-void WebRtcIsac_AllPoleFilter(double* InOut, double* Coef, size_t lengthInOut,
-                              int orderCoef);
-
-void WebRtcIsac_AllZeroFilter(double* In, double* Coef, size_t lengthInOut,
-                              int orderCoef, double* Out);
-
-void WebRtcIsac_ZeroPoleFilter(double* In, double* ZeroCoef, double* PoleCoef,
-                               size_t lengthInOut, int orderCoef, double* Out);
-
-
-/***************************** filterbank functions **************************/
-
-void WebRtcIsac_SplitAndFilterFloat(float* in, float* LP, float* HP,
-                                    double* LP_la, double* HP_la,
-                                    PreFiltBankstr* prefiltdata);
-
-
-void WebRtcIsac_FilterAndCombineFloat(float* InLP, float* InHP, float* Out,
-                                      PostFiltBankstr* postfiltdata);
-
-
-/************************* normalized lattice filters ************************/
-
-void WebRtcIsac_NormLatticeFilterMa(int orderCoef, float* stateF, float* stateG,
-                                    float* lat_in, double* filtcoeflo,
-                                    double* lat_out);
-
-void WebRtcIsac_NormLatticeFilterAr(int orderCoef, float* stateF, float* stateG,
-                                    double* lat_in, double* lo_filt_coef,
-                                    float* lat_out);
-
-void WebRtcIsac_Dir2Lat(double* a, int orderCoef, float* sth, float* cth);
-
-void WebRtcIsac_AutoCorr(double* r, const double* x, size_t N, size_t order);
-
-#endif /* WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_MAIN_SOURCE_CODEC_H_ */
diff --git a/modules/audio_coding/codecs/isac/main/source/crc.c b/modules/audio_coding/codecs/isac/main/source/crc.c
deleted file mode 100644
index 2419e24..0000000
--- a/modules/audio_coding/codecs/isac/main/source/crc.c
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- *  Copyright (c) 2011 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 "crc.h"
-#include <stdlib.h>
-#include "signal_processing_library.h"
-
-#define POLYNOMIAL 0x04c11db7L
-
-
-static const uint32_t kCrcTable[256] = {
-  0,          0x4c11db7,  0x9823b6e,  0xd4326d9,  0x130476dc, 0x17c56b6b,
-  0x1a864db2, 0x1e475005, 0x2608edb8, 0x22c9f00f, 0x2f8ad6d6, 0x2b4bcb61,
-  0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd, 0x4c11db70, 0x48d0c6c7,
-  0x4593e01e, 0x4152fda9, 0x5f15adac, 0x5bd4b01b, 0x569796c2, 0x52568b75,
-  0x6a1936c8, 0x6ed82b7f, 0x639b0da6, 0x675a1011, 0x791d4014, 0x7ddc5da3,
-  0x709f7b7a, 0x745e66cd, 0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039,
-  0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5, 0xbe2b5b58, 0xbaea46ef,
-  0xb7a96036, 0xb3687d81, 0xad2f2d84, 0xa9ee3033, 0xa4ad16ea, 0xa06c0b5d,
-  0xd4326d90, 0xd0f37027, 0xddb056fe, 0xd9714b49, 0xc7361b4c, 0xc3f706fb,
-  0xceb42022, 0xca753d95, 0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1,
-  0xe13ef6f4, 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d, 0x34867077, 0x30476dc0,
-  0x3d044b19, 0x39c556ae, 0x278206ab, 0x23431b1c, 0x2e003dc5, 0x2ac12072,
-  0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16, 0x18aeb13,  0x54bf6a4,
-  0x808d07d,  0xcc9cdca,  0x7897ab07, 0x7c56b6b0, 0x71159069, 0x75d48dde,
-  0x6b93dddb, 0x6f52c06c, 0x6211e6b5, 0x66d0fb02, 0x5e9f46bf, 0x5a5e5b08,
-  0x571d7dd1, 0x53dc6066, 0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba,
-  0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e, 0xbfa1b04b, 0xbb60adfc,
-  0xb6238b25, 0xb2e29692, 0x8aad2b2f, 0x8e6c3698, 0x832f1041, 0x87ee0df6,
-  0x99a95df3, 0x9d684044, 0x902b669d, 0x94ea7b2a, 0xe0b41de7, 0xe4750050,
-  0xe9362689, 0xedf73b3e, 0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2,
-  0xc6bcf05f, 0xc27dede8, 0xcf3ecb31, 0xcbffd686, 0xd5b88683, 0xd1799b34,
-  0xdc3abded, 0xd8fba05a, 0x690ce0ee, 0x6dcdfd59, 0x608edb80, 0x644fc637,
-  0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb, 0x4f040d56, 0x4bc510e1,
-  0x46863638, 0x42472b8f, 0x5c007b8a, 0x58c1663d, 0x558240e4, 0x51435d53,
-  0x251d3b9e, 0x21dc2629, 0x2c9f00f0, 0x285e1d47, 0x36194d42, 0x32d850f5,
-  0x3f9b762c, 0x3b5a6b9b,  0x315d626, 0x7d4cb91,  0xa97ed48,  0xe56f0ff,
-  0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623, 0xf12f560e, 0xf5ee4bb9,
-  0xf8ad6d60, 0xfc6c70d7, 0xe22b20d2, 0xe6ea3d65, 0xeba91bbc, 0xef68060b,
-  0xd727bbb6, 0xd3e6a601, 0xdea580d8, 0xda649d6f, 0xc423cd6a, 0xc0e2d0dd,
-  0xcda1f604, 0xc960ebb3, 0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7,
-  0xae3afba2, 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b, 0x9b3660c6, 0x9ff77d71,
-  0x92b45ba8, 0x9675461f, 0x8832161a, 0x8cf30bad, 0x81b02d74, 0x857130c3,
-  0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640, 0x4e8ee645, 0x4a4ffbf2,
-  0x470cdd2b, 0x43cdc09c, 0x7b827d21, 0x7f436096, 0x7200464f, 0x76c15bf8,
-  0x68860bfd, 0x6c47164a, 0x61043093, 0x65c52d24, 0x119b4be9, 0x155a565e,
-  0x18197087, 0x1cd86d30, 0x29f3d35,  0x65e2082,  0xb1d065b,  0xfdc1bec,
-  0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088, 0x2497d08d, 0x2056cd3a,
-  0x2d15ebe3, 0x29d4f654, 0xc5a92679, 0xc1683bce, 0xcc2b1d17, 0xc8ea00a0,
-  0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb, 0xdbee767c, 0xe3a1cbc1, 0xe760d676,
-  0xea23f0af, 0xeee2ed18, 0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4,
-  0x89b8fd09, 0x8d79e0be, 0x803ac667, 0x84fbdbd0, 0x9abc8bd5, 0x9e7d9662,
-  0x933eb0bb, 0x97ffad0c, 0xafb010b1, 0xab710d06, 0xa6322bdf, 0xa2f33668,
-  0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4
-};
-
-
-
-
-/****************************************************************************
- * WebRtcIsac_GetCrc(...)
- *
- * This function returns a 32 bit CRC checksum of a bit stream
- *
- * Input:
- *  - bitstream              : payload bitstream
- *  - len_bitstream_in_bytes : number of 8-bit words in the bit stream
- *
- * Output:
- *  - crc                    : checksum
- *
- * Return value              :  0 - Ok
- *                             -1 - Error
- */
-
-int WebRtcIsac_GetCrc(const int16_t* bitstream,
-                      int len_bitstream_in_bytes,
-                      uint32_t* crc)
-{
-  uint8_t* bitstream_ptr_uw8;
-  uint32_t crc_state;
-  int byte_cntr;
-  int crc_tbl_indx;
-
-  /* Sanity Check. */
-  if (bitstream == NULL) {
-    return -1;
-  }
-  /* cast to UWord8 pointer */
-  bitstream_ptr_uw8 = (uint8_t *)bitstream;
-
-  /* initialize */
-  crc_state = 0xFFFFFFFF;
-
-  for (byte_cntr = 0; byte_cntr < len_bitstream_in_bytes; byte_cntr++) {
-    crc_tbl_indx = (WEBRTC_SPL_RSHIFT_U32(crc_state, 24) ^
-                       bitstream_ptr_uw8[byte_cntr]) & 0xFF;
-    crc_state = (crc_state << 8) ^ kCrcTable[crc_tbl_indx];
-  }
-
-  *crc = ~crc_state;
-  return 0;
-}
diff --git a/modules/audio_coding/codecs/isac/main/source/crc.h b/modules/audio_coding/codecs/isac/main/source/crc.h
deleted file mode 100644
index 09583df..0000000
--- a/modules/audio_coding/codecs/isac/main/source/crc.h
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/*
- * crc.h
- *
- * Checksum functions
- *
- */
-
-#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_MAIN_SOURCE_CRC_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_MAIN_SOURCE_CRC_H_
-
-#include "webrtc/typedefs.h"
-
-/****************************************************************************
- * WebRtcIsac_GetCrc(...)
- *
- * This function returns a 32 bit CRC checksum of a bit stream
- *
- * Input:
- *  - encoded      : payload bit stream
- *  - no_of_word8s : number of 8-bit words in the bit stream
- *
- * Output:
- *  - crc          : checksum
- *
- * Return value    :  0 - Ok
- *                   -1 - Error
- */
-
-int WebRtcIsac_GetCrc(
-    const int16_t* encoded,
-    int no_of_word8s,
-    uint32_t* crc);
-
-
-
-#endif /* WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_MAIN_SOURCE_CRC_H_ */
diff --git a/modules/audio_coding/codecs/isac/main/source/decode.c b/modules/audio_coding/codecs/isac/main/source/decode.c
deleted file mode 100644
index e925efb..0000000
--- a/modules/audio_coding/codecs/isac/main/source/decode.c
+++ /dev/null
@@ -1,304 +0,0 @@
-/*
- *  Copyright (c) 2012 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.
- */
-
-/*
- * decode_B.c
- *
- * This file contains definition of funtions for decoding.
- * Decoding of lower-band, including normal-decoding and RCU decoding.
- * Decoding of upper-band, including 8-12 kHz, when the bandwidth is
- * 0-12 kHz, and 8-16 kHz, when the bandwidth is 0-16 kHz.
- *
- */
-
-
-#include "codec.h"
-#include "entropy_coding.h"
-#include "pitch_estimator.h"
-#include "bandwidth_estimator.h"
-#include "structs.h"
-#include "settings.h"
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-
-/*
- * function to decode the bitstream
- * returns the total number of bytes in the stream
- */
-int WebRtcIsac_DecodeLb(const TransformTables* transform_tables,
-                        float* signal_out, ISACLBDecStruct* ISACdecLB_obj,
-                        int16_t* current_framesamples,
-                        int16_t isRCUPayload) {
-  int k;
-  int len, err;
-  int16_t bandwidthInd;
-
-  float LP_dec_float[FRAMESAMPLES_HALF];
-  float HP_dec_float[FRAMESAMPLES_HALF];
-
-  double LPw[FRAMESAMPLES_HALF];
-  double HPw[FRAMESAMPLES_HALF];
-  double LPw_pf[FRAMESAMPLES_HALF];
-
-  double lo_filt_coef[(ORDERLO + 1)*SUBFRAMES];
-  double hi_filt_coef[(ORDERHI + 1)*SUBFRAMES];
-
-  double real_f[FRAMESAMPLES_HALF];
-  double imag_f[FRAMESAMPLES_HALF];
-
-  double PitchLags[4];
-  double PitchGains[4];
-  double AvgPitchGain;
-  int16_t PitchGains_Q12[4];
-  int16_t AvgPitchGain_Q12;
-
-  float gain;
-
-  int frame_nb; /* counter */
-  int frame_mode; /* 0 30ms, 1 for 60ms */
-  /* Processed_samples: 480 (30, 60 ms). Cannot take other values. */
-
-  WebRtcIsac_ResetBitstream(&(ISACdecLB_obj->bitstr_obj));
-
-  len = 0;
-
-  /* Decode framelength and BW estimation - not used,
-     only for stream pointer*/
-  err = WebRtcIsac_DecodeFrameLen(&ISACdecLB_obj->bitstr_obj,
-                                  current_framesamples);
-  if (err < 0) {
-    return err;
-  }
-
-  /* Frame_mode:
-   * 0: indicates 30 ms frame (480 samples)
-   * 1: indicates 60 ms frame (960 samples) */
-  frame_mode = *current_framesamples / MAX_FRAMESAMPLES;
-
-  err = WebRtcIsac_DecodeSendBW(&ISACdecLB_obj->bitstr_obj, &bandwidthInd);
-  if (err < 0) {
-    return err;
-  }
-
-  /* One loop if it's one frame (20 or 30ms), 2 loops if 2 frames
-     bundled together (60ms). */
-  for (frame_nb = 0; frame_nb <= frame_mode; frame_nb++) {
-    /* Decode & de-quantize pitch parameters */
-    err = WebRtcIsac_DecodePitchGain(&ISACdecLB_obj->bitstr_obj,
-                                     PitchGains_Q12);
-    if (err < 0) {
-      return err;
-    }
-
-    err = WebRtcIsac_DecodePitchLag(&ISACdecLB_obj->bitstr_obj, PitchGains_Q12,
-                                    PitchLags);
-    if (err < 0) {
-      return err;
-    }
-
-    AvgPitchGain_Q12 = (PitchGains_Q12[0] + PitchGains_Q12[1] +
-        PitchGains_Q12[2] + PitchGains_Q12[3]) >> 2;
-
-    /* Decode & de-quantize filter coefficients. */
-    err = WebRtcIsac_DecodeLpc(&ISACdecLB_obj->bitstr_obj, lo_filt_coef,
-                               hi_filt_coef);
-    if (err < 0) {
-      return err;
-    }
-    /* Decode & de-quantize spectrum. */
-    len = WebRtcIsac_DecodeSpec(&ISACdecLB_obj->bitstr_obj, AvgPitchGain_Q12,
-                                kIsacLowerBand, real_f, imag_f);
-    if (len < 0) {
-      return len;
-    }
-
-    /* Inverse transform. */
-    WebRtcIsac_Spec2time(transform_tables, real_f, imag_f, LPw, HPw,
-                         &ISACdecLB_obj->fftstr_obj);
-
-    /* Convert PitchGains back to float for pitchfilter_post */
-    for (k = 0; k < 4; k++) {
-      PitchGains[k] = ((float)PitchGains_Q12[k]) / 4096;
-    }
-    if (isRCUPayload) {
-      for (k = 0; k < 240; k++) {
-        LPw[k] *= RCU_TRANSCODING_SCALE_INVERSE;
-        HPw[k] *= RCU_TRANSCODING_SCALE_INVERSE;
-      }
-    }
-
-    /* Inverse pitch filter. */
-    WebRtcIsac_PitchfilterPost(LPw, LPw_pf, &ISACdecLB_obj->pitchfiltstr_obj,
-                               PitchLags, PitchGains);
-    /* Convert AvgPitchGain back to float for computation of gain. */
-    AvgPitchGain = ((float)AvgPitchGain_Q12) / 4096;
-    gain = 1.0f - 0.45f * (float)AvgPitchGain;
-
-    for (k = 0; k < FRAMESAMPLES_HALF; k++) {
-      /* Reduce gain to compensate for pitch enhancer. */
-      LPw_pf[k] *= gain;
-    }
-
-    if (isRCUPayload) {
-      for (k = 0; k < FRAMESAMPLES_HALF; k++) {
-        /* Compensation for transcoding gain changes. */
-        LPw_pf[k] *= RCU_TRANSCODING_SCALE;
-        HPw[k] *= RCU_TRANSCODING_SCALE;
-      }
-    }
-    /* Perceptual post-filtering (using normalized lattice filter). */
-    WebRtcIsac_NormLatticeFilterAr(
-        ORDERLO, ISACdecLB_obj->maskfiltstr_obj.PostStateLoF,
-        (ISACdecLB_obj->maskfiltstr_obj).PostStateLoG, LPw_pf, lo_filt_coef,
-        LP_dec_float);
-    WebRtcIsac_NormLatticeFilterAr(
-        ORDERHI, ISACdecLB_obj->maskfiltstr_obj.PostStateHiF,
-        (ISACdecLB_obj->maskfiltstr_obj).PostStateHiG, HPw, hi_filt_coef,
-        HP_dec_float);
-
-    /* Recombine the 2 bands. */
-    WebRtcIsac_FilterAndCombineFloat(LP_dec_float, HP_dec_float,
-                                     signal_out + frame_nb * FRAMESAMPLES,
-                                     &ISACdecLB_obj->postfiltbankstr_obj);
-  }
-  return len;
-}
-
-
-/*
- * This decode function is called when the codec is operating in 16 kHz
- * bandwidth to decode the upperband, i.e. 8-16 kHz.
- *
- * Contrary to lower-band, the upper-band (8-16 kHz) is not split in
- * frequency, but split to 12 sub-frames, i.e. twice as lower-band.
- */
-int WebRtcIsac_DecodeUb16(const TransformTables* transform_tables,
-                          float* signal_out, ISACUBDecStruct* ISACdecUB_obj,
-                          int16_t isRCUPayload) {
-  int len, err;
-
-  double halfFrameFirst[FRAMESAMPLES_HALF];
-  double halfFrameSecond[FRAMESAMPLES_HALF];
-
-  double percepFilterParam[(UB_LPC_ORDER + 1) * (SUBFRAMES << 1) +
-                           (UB_LPC_ORDER + 1)];
-
-  double real_f[FRAMESAMPLES_HALF];
-  double imag_f[FRAMESAMPLES_HALF];
-  const int16_t kAveragePitchGain = 0; /* No pitch-gain for upper-band. */
-  len = 0;
-
-  /* Decode & de-quantize filter coefficients. */
-  memset(percepFilterParam, 0, sizeof(percepFilterParam));
-  err = WebRtcIsac_DecodeInterpolLpcUb(&ISACdecUB_obj->bitstr_obj,
-                                       percepFilterParam, isac16kHz);
-  if (err < 0) {
-    return err;
-  }
-
-  /* Decode & de-quantize spectrum. */
-  len = WebRtcIsac_DecodeSpec(&ISACdecUB_obj->bitstr_obj, kAveragePitchGain,
-                              kIsacUpperBand16, real_f, imag_f);
-  if (len < 0) {
-    return len;
-  }
-  if (isRCUPayload) {
-    int n;
-    for (n = 0; n < 240; n++) {
-      real_f[n] *= RCU_TRANSCODING_SCALE_UB_INVERSE;
-      imag_f[n] *= RCU_TRANSCODING_SCALE_UB_INVERSE;
-    }
-  }
-  /* Inverse transform. */
-  WebRtcIsac_Spec2time(transform_tables,
-                       real_f, imag_f, halfFrameFirst, halfFrameSecond,
-                       &ISACdecUB_obj->fftstr_obj);
-
-  /* Perceptual post-filtering (using normalized lattice filter). */
-  WebRtcIsac_NormLatticeFilterAr(
-      UB_LPC_ORDER, ISACdecUB_obj->maskfiltstr_obj.PostStateLoF,
-      (ISACdecUB_obj->maskfiltstr_obj).PostStateLoG, halfFrameFirst,
-      &percepFilterParam[(UB_LPC_ORDER + 1)], signal_out);
-
-  WebRtcIsac_NormLatticeFilterAr(
-      UB_LPC_ORDER, ISACdecUB_obj->maskfiltstr_obj.PostStateLoF,
-      (ISACdecUB_obj->maskfiltstr_obj).PostStateLoG, halfFrameSecond,
-      &percepFilterParam[(UB_LPC_ORDER + 1) * SUBFRAMES + (UB_LPC_ORDER + 1)],
-      &signal_out[FRAMESAMPLES_HALF]);
-
-  return len;
-}
-
-/*
- * This decode function is called when the codec operates at 0-12 kHz
- * bandwidth to decode the upperband, i.e. 8-12 kHz.
- *
- * At the encoder the upper-band is split into two band, 8-12 kHz & 12-16
- * kHz, and only 8-12 kHz is encoded. At the decoder, 8-12 kHz band is
- * reconstructed and 12-16 kHz replaced with zeros. Then two bands
- * are combined, to reconstruct the upperband 8-16 kHz.
- */
-int WebRtcIsac_DecodeUb12(const TransformTables* transform_tables,
-                          float* signal_out, ISACUBDecStruct* ISACdecUB_obj,
-                          int16_t isRCUPayload) {
-  int len, err;
-
-  float LP_dec_float[FRAMESAMPLES_HALF];
-  float HP_dec_float[FRAMESAMPLES_HALF];
-
-  double LPw[FRAMESAMPLES_HALF];
-  double HPw[FRAMESAMPLES_HALF];
-
-  double percepFilterParam[(UB_LPC_ORDER + 1)*SUBFRAMES];
-
-  double real_f[FRAMESAMPLES_HALF];
-  double imag_f[FRAMESAMPLES_HALF];
-  const int16_t kAveragePitchGain = 0; /* No pitch-gain for upper-band. */
-  len = 0;
-
-  /* Decode & dequantize filter coefficients. */
-  err = WebRtcIsac_DecodeInterpolLpcUb(&ISACdecUB_obj->bitstr_obj,
-                                       percepFilterParam, isac12kHz);
-  if (err < 0) {
-    return err;
-  }
-
-  /* Decode & de-quantize spectrum. */
-  len = WebRtcIsac_DecodeSpec(&ISACdecUB_obj->bitstr_obj, kAveragePitchGain,
-                              kIsacUpperBand12, real_f, imag_f);
-  if (len < 0) {
-    return len;
-  }
-
-  if (isRCUPayload) {
-    int n;
-    for (n = 0; n < 240; n++) {
-      real_f[n] *= RCU_TRANSCODING_SCALE_UB_INVERSE;
-      imag_f[n] *= RCU_TRANSCODING_SCALE_UB_INVERSE;
-    }
-  }
-  /* Inverse transform. */
-  WebRtcIsac_Spec2time(transform_tables,
-                       real_f, imag_f, LPw, HPw, &ISACdecUB_obj->fftstr_obj);
-  /* perceptual post-filtering (using normalized lattice filter) */
-  WebRtcIsac_NormLatticeFilterAr(UB_LPC_ORDER,
-                                 ISACdecUB_obj->maskfiltstr_obj.PostStateLoF,
-                                 (ISACdecUB_obj->maskfiltstr_obj).PostStateLoG,
-                                 LPw, percepFilterParam, LP_dec_float);
-  /* Zero for 12-16 kHz. */
-  memset(HP_dec_float, 0, sizeof(float) * (FRAMESAMPLES_HALF));
-  /* Recombine the 2 bands. */
-  WebRtcIsac_FilterAndCombineFloat(HP_dec_float, LP_dec_float, signal_out,
-                                   &ISACdecUB_obj->postfiltbankstr_obj);
-  return len;
-}
diff --git a/modules/audio_coding/codecs/isac/main/source/decode_bwe.c b/modules/audio_coding/codecs/isac/main/source/decode_bwe.c
deleted file mode 100644
index 019cc89..0000000
--- a/modules/audio_coding/codecs/isac/main/source/decode_bwe.c
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- *  Copyright (c) 2011 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 "structs.h"
-#include "bandwidth_estimator.h"
-#include "entropy_coding.h"
-#include "codec.h"
-
-
-int
-WebRtcIsac_EstimateBandwidth(
-    BwEstimatorstr*           bwest_str,
-    Bitstr*                   streamdata,
-    size_t                packet_size,
-    uint16_t              rtp_seq_number,
-    uint32_t              send_ts,
-    uint32_t              arr_ts,
-    enum IsacSamplingRate encoderSampRate,
-    enum IsacSamplingRate decoderSampRate)
-{
-  int16_t  index;
-  int16_t  frame_samples;
-  uint32_t sendTimestampIn16kHz;
-  uint32_t arrivalTimestampIn16kHz;
-  uint32_t diffSendTime;
-  uint32_t diffArrivalTime;
-  int err;
-
-  /* decode framelength and BW estimation */
-  err = WebRtcIsac_DecodeFrameLen(streamdata, &frame_samples);
-  if(err < 0)  // error check
-  {
-    return err;
-  }
-  err = WebRtcIsac_DecodeSendBW(streamdata, &index);
-  if(err < 0)  // error check
-  {
-    return err;
-  }
-
-  /* UPDATE ESTIMATES FROM OTHER SIDE */
-  err = WebRtcIsac_UpdateUplinkBwImpl(bwest_str, index, encoderSampRate);
-  if(err < 0)
-  {
-    return err;
-  }
-
-  // We like BWE to work at 16 kHz sampling rate,
-  // therefore, we have to change the timestamps accordingly.
-  // translate the send timestamp if required
-  diffSendTime = (uint32_t)((uint32_t)send_ts -
-                                  (uint32_t)bwest_str->senderTimestamp);
-  bwest_str->senderTimestamp = send_ts;
-
-  diffArrivalTime = (uint32_t)((uint32_t)arr_ts -
-                                     (uint32_t)bwest_str->receiverTimestamp);
-  bwest_str->receiverTimestamp = arr_ts;
-
-  if(decoderSampRate == kIsacSuperWideband)
-  {
-    diffArrivalTime = (uint32_t)diffArrivalTime >> 1;
-    diffSendTime = (uint32_t)diffSendTime >> 1;
-  }
-
-  // arrival timestamp in 16 kHz
-  arrivalTimestampIn16kHz = (uint32_t)((uint32_t)
-                                             bwest_str->prev_rec_arr_ts + (uint32_t)diffArrivalTime);
-  // send timestamp in 16 kHz
-  sendTimestampIn16kHz = (uint32_t)((uint32_t)
-                                          bwest_str->prev_rec_send_ts + (uint32_t)diffSendTime);
-
-  err = WebRtcIsac_UpdateBandwidthEstimator(bwest_str, rtp_seq_number,
-                                            (frame_samples * 1000) / FS, sendTimestampIn16kHz,
-                                            arrivalTimestampIn16kHz, packet_size);
-  // error check
-  if(err < 0)
-  {
-    return err;
-  }
-
-  return 0;
-}
diff --git a/modules/audio_coding/codecs/isac/main/source/encode.c b/modules/audio_coding/codecs/isac/main/source/encode.c
deleted file mode 100644
index 3f1912b..0000000
--- a/modules/audio_coding/codecs/isac/main/source/encode.c
+++ /dev/null
@@ -1,1258 +0,0 @@
-/*
- *  Copyright (c) 2012 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.
- */
-
-/*
- * encode.c
- *
- * This file contains definition of funtions for encoding.
- * Decoding of upper-band, including 8-12 kHz, when the bandwidth is
- * 0-12 kHz, and 8-16 kHz, when the bandwidth is 0-16 kHz.
- *
- */
-
-#include <stdlib.h>
-#include <string.h>
-#include <stdio.h>
-
-#include "structs.h"
-#include "codec.h"
-#include "pitch_estimator.h"
-#include "entropy_coding.h"
-#include "arith_routines.h"
-#include "pitch_gain_tables.h"
-#include "pitch_lag_tables.h"
-#include "spectrum_ar_model_tables.h"
-#include "lpc_tables.h"
-#include "lpc_analysis.h"
-#include "bandwidth_estimator.h"
-#include "lpc_shape_swb12_tables.h"
-#include "lpc_shape_swb16_tables.h"
-#include "lpc_gain_swb_tables.h"
-
-
-#define UB_LOOKAHEAD 24
-
-
-/*
-  Rate allocation tables of lower and upper-band bottleneck for
-  12kHz & 16kHz bandwidth.
-
-  12 kHz bandwidth
-  -----------------
-  The overall bottleneck of the coder is between 38 kbps and 45 kbps. We have
-  considered 7 enteries, uniformly distributed in this interval, i.e. 38,
-  39.17, 40.33, 41.5, 42.67, 43.83 and 45. For every entery, the lower-band
-  and the upper-band bottlenecks are specified in
-  'kLowerBandBitRate12' and 'kUpperBandBitRate12'
-  tables, respectively. E.g. the overall rate of 41.5 kbps corresponts to a
-  bottleneck of 31 kbps for lower-band and 27 kbps for upper-band. Given an
-  overall bottleneck of the codec, we use linear interpolation to get
-  lower-band and upper-band bottlenecks.
-
-  16 kHz bandwidth
-  -----------------
-  The overall bottleneck of the coder is between 50 kbps and 56 kbps. We have
-  considered 7 enteries, uniformly distributed in this interval, i.e. 50, 51.2,
-  52.4, 53.6, 54.8 and 56. For every entery, the lower-band and the upper-band
-  bottlenecks are specified in 'kLowerBandBitRate16' and
-  'kUpperBandBitRate16' tables, respectively. E.g. the overall rate
-  of 53.6 kbps corresponts to a bottleneck of 32 kbps for lower-band and 30
-  kbps for upper-band. Given an overall bottleneck of the codec, we use linear
-  interpolation to get lower-band and upper-band bottlenecks.
-
- */
-
-/*     38  39.17  40.33   41.5  42.67  43.83     45 */
-static const int16_t kLowerBandBitRate12[7] = {
-    29000, 30000, 30000, 31000, 31000, 32000, 32000 };
-static const int16_t kUpperBandBitRate12[7] = {
-    25000, 25000, 27000, 27000, 29000, 29000, 32000 };
-
-/*    50     51.2  52.4   53.6   54.8    56 */
-static const int16_t kLowerBandBitRate16[6] = {
-    31000, 31000, 32000, 32000, 32000, 32000 };
-static const int16_t kUpperBandBitRate16[6] = {
-    28000, 29000, 29000, 30000, 31000, 32000 };
-
-/******************************************************************************
- * WebRtcIsac_RateAllocation()
- * Internal function to perform a rate-allocation for upper and lower-band,
- * given a total rate.
- *
- * Input:
- *   - inRateBitPerSec           : a total bottleneck in bits/sec.
- *
- * Output:
- *   - rateLBBitPerSec           : a bottleneck allocated to the lower-band
- *                                 in bits/sec.
- *   - rateUBBitPerSec           : a bottleneck allocated to the upper-band
- *                                 in bits/sec.
- *
- * Return value                  : 0 if rate allocation has been successful.
- *                                -1 if failed to allocate rates.
- */
-
-int16_t WebRtcIsac_RateAllocation(int32_t inRateBitPerSec,
-                                        double* rateLBBitPerSec,
-                                        double* rateUBBitPerSec,
-                                        enum ISACBandwidth* bandwidthKHz) {
-  int16_t idx;
-  double idxD;
-  double idxErr;
-  if (inRateBitPerSec < 38000) {
-    /* If the given overall bottleneck is less than 38000 then
-     * then codec has to operate in wideband mode, i.e. 8 kHz
-     * bandwidth. */
-    *rateLBBitPerSec = (int16_t)((inRateBitPerSec > 32000) ?
-        32000 : inRateBitPerSec);
-    *rateUBBitPerSec = 0;
-    *bandwidthKHz = isac8kHz;
-  } else if ((inRateBitPerSec >= 38000) && (inRateBitPerSec < 50000)) {
-    /* At a bottleneck between 38 and 50 kbps the codec is operating
-     * at 12 kHz bandwidth. Using xxxBandBitRate12[] to calculates
-     * upper/lower bottleneck */
-
-    /* Find the bottlenecks by linear interpolation,
-     * step is (45000 - 38000)/6.0 we use the inverse of it. */
-    const double stepSizeInv = 8.5714286e-4;
-    idxD = (inRateBitPerSec - 38000) * stepSizeInv;
-    idx = (idxD >= 6) ? 6 : ((int16_t)idxD);
-    idxErr = idxD - idx;
-    *rateLBBitPerSec = kLowerBandBitRate12[idx];
-    *rateUBBitPerSec = kUpperBandBitRate12[idx];
-
-    if (idx < 6) {
-      *rateLBBitPerSec += (int16_t)(
-          idxErr * (kLowerBandBitRate12[idx + 1] - kLowerBandBitRate12[idx]));
-      *rateUBBitPerSec += (int16_t)(
-          idxErr * (kUpperBandBitRate12[idx + 1] - kUpperBandBitRate12[idx]));
-    }
-    *bandwidthKHz = isac12kHz;
-  } else if ((inRateBitPerSec >= 50000) && (inRateBitPerSec <= 56000)) {
-    /* A bottleneck between 50 and 56 kbps corresponds to bandwidth
-     * of 16 kHz. Using xxxBandBitRate16[] to calculates
-     * upper/lower bottleneck. */
-
-    /* Find the bottlenecks by linear interpolation
-     * step is (56000 - 50000)/5 we use the inverse of it. */
-    const double stepSizeInv = 8.3333333e-4;
-    idxD = (inRateBitPerSec - 50000) * stepSizeInv;
-    idx = (idxD >= 5) ? 5 : ((int16_t)idxD);
-    idxErr = idxD - idx;
-    *rateLBBitPerSec = kLowerBandBitRate16[idx];
-    *rateUBBitPerSec  = kUpperBandBitRate16[idx];
-
-    if (idx < 5) {
-      *rateLBBitPerSec += (int16_t)(idxErr *
-          (kLowerBandBitRate16[idx + 1] -
-              kLowerBandBitRate16[idx]));
-
-      *rateUBBitPerSec += (int16_t)(idxErr *
-          (kUpperBandBitRate16[idx + 1] -
-              kUpperBandBitRate16[idx]));
-    }
-    *bandwidthKHz = isac16kHz;
-  } else {
-    /* Out-of-range botlteneck value. */
-    return -1;
-  }
-
-  /* limit the values. */
-  *rateLBBitPerSec = (*rateLBBitPerSec > 32000) ? 32000 : *rateLBBitPerSec;
-  *rateUBBitPerSec = (*rateUBBitPerSec > 32000) ? 32000 : *rateUBBitPerSec;
-  return 0;
-}
-
-
-void WebRtcIsac_ResetBitstream(Bitstr* bit_stream) {
-  bit_stream->W_upper = 0xFFFFFFFF;
-  bit_stream->stream_index = 0;
-  bit_stream->streamval = 0;
-}
-
-int WebRtcIsac_EncodeLb(const TransformTables* transform_tables,
-                        float* in, ISACLBEncStruct* ISACencLB_obj,
-                        int16_t codingMode,
-                        int16_t bottleneckIndex) {
-  int stream_length = 0;
-  int err;
-  int k;
-  int iterCntr;
-
-  double lofilt_coef[(ORDERLO + 1)*SUBFRAMES];
-  double hifilt_coef[(ORDERHI + 1)*SUBFRAMES];
-  float LP[FRAMESAMPLES_HALF];
-  float HP[FRAMESAMPLES_HALF];
-
-  double LP_lookahead[FRAMESAMPLES_HALF];
-  double HP_lookahead[FRAMESAMPLES_HALF];
-  double LP_lookahead_pf[FRAMESAMPLES_HALF + QLOOKAHEAD];
-  double LPw[FRAMESAMPLES_HALF];
-
-  double HPw[FRAMESAMPLES_HALF];
-  double LPw_pf[FRAMESAMPLES_HALF];
-  int16_t fre[FRAMESAMPLES_HALF];   /* Q7 */
-  int16_t fim[FRAMESAMPLES_HALF];   /* Q7 */
-
-  double PitchLags[4];
-  double PitchGains[4];
-  int16_t PitchGains_Q12[4];
-  int16_t AvgPitchGain_Q12;
-
-  int frame_mode; /* 0 for 30ms, 1 for 60ms */
-  int status = 0;
-  int my_index;
-  transcode_obj transcodingParam;
-  double bytesLeftSpecCoding;
-  uint16_t payloadLimitBytes;
-
-  /* Copy new frame-length and bottleneck rate only for the first 10 ms data */
-  if (ISACencLB_obj->buffer_index == 0) {
-    /* Set the framelength for the next packet. */
-    ISACencLB_obj->current_framesamples = ISACencLB_obj->new_framelength;
-  }
-  /* 'frame_mode' is 0 (30 ms) or 1 (60 ms). */
-  frame_mode = ISACencLB_obj->current_framesamples / MAX_FRAMESAMPLES;
-
-  /* buffer speech samples (by 10ms packet) until the frame-length */
-  /* is reached (30 or 60 ms).                                     */
-  /*****************************************************************/
-
-  /* fill the buffer with 10ms input data */
-  for (k = 0; k < FRAMESAMPLES_10ms; k++) {
-    ISACencLB_obj->data_buffer_float[k + ISACencLB_obj->buffer_index] = in[k];
-  }
-
-  /* If buffersize is not equal to current framesize then increase index
-   * and return. We do no encoding untill we have enough audio.  */
-  if (ISACencLB_obj->buffer_index + FRAMESAMPLES_10ms != FRAMESAMPLES) {
-    ISACencLB_obj->buffer_index += FRAMESAMPLES_10ms;
-    return 0;
-  }
-  /* If buffer reached the right size, reset index and continue with
-   * encoding the frame. */
-  ISACencLB_obj->buffer_index = 0;
-
-  /* End of buffer function. */
-  /**************************/
-
-  /* Encoding */
-  /************/
-
-  if (frame_mode == 0 || ISACencLB_obj->frame_nb == 0) {
-    /* This is to avoid Linux warnings until we change 'int' to 'Word32'
-     * at all places. */
-    int intVar;
-    /* reset bitstream */
-    WebRtcIsac_ResetBitstream(&(ISACencLB_obj->bitstr_obj));
-
-    if ((codingMode == 0) && (frame_mode == 0) &&
-        (ISACencLB_obj->enforceFrameSize == 0)) {
-      ISACencLB_obj->new_framelength = WebRtcIsac_GetNewFrameLength(
-          ISACencLB_obj->bottleneck, ISACencLB_obj->current_framesamples);
-    }
-
-    ISACencLB_obj->s2nr = WebRtcIsac_GetSnr(
-        ISACencLB_obj->bottleneck, ISACencLB_obj->current_framesamples);
-
-    /* Encode frame length. */
-    status = WebRtcIsac_EncodeFrameLen(
-        ISACencLB_obj->current_framesamples, &ISACencLB_obj->bitstr_obj);
-    if (status < 0) {
-      /* Wrong frame size. */
-      return status;
-    }
-    /* Save framelength for multiple packets memory. */
-    ISACencLB_obj->SaveEnc_obj.framelength =
-        ISACencLB_obj->current_framesamples;
-
-    /* To be used for Redundant Coding. */
-    ISACencLB_obj->lastBWIdx = bottleneckIndex;
-    intVar = (int)bottleneckIndex;
-    WebRtcIsac_EncodeReceiveBw(&intVar, &ISACencLB_obj->bitstr_obj);
-  }
-
-  /* Split signal in two bands. */
-  WebRtcIsac_SplitAndFilterFloat(ISACencLB_obj->data_buffer_float, LP, HP,
-                                 LP_lookahead, HP_lookahead,
-                                 &ISACencLB_obj->prefiltbankstr_obj);
-
-  /* estimate pitch parameters and pitch-filter lookahead signal */
-  WebRtcIsac_PitchAnalysis(LP_lookahead, LP_lookahead_pf,
-                           &ISACencLB_obj->pitchanalysisstr_obj, PitchLags,
-                           PitchGains);
-
-  /* Encode in FIX Q12. */
-
-  /* Convert PitchGain to Fixed point. */
-  for (k = 0; k < PITCH_SUBFRAMES; k++) {
-    PitchGains_Q12[k] = (int16_t)(PitchGains[k] * 4096.0);
-  }
-
-  /* Set where to store data in multiple packets memory. */
-  if (frame_mode == 0 || ISACencLB_obj->frame_nb == 0) {
-    ISACencLB_obj->SaveEnc_obj.startIdx = 0;
-  } else {
-    ISACencLB_obj->SaveEnc_obj.startIdx = 1;
-  }
-
-  /* Quantize & encode pitch parameters. */
-  WebRtcIsac_EncodePitchGain(PitchGains_Q12, &ISACencLB_obj->bitstr_obj,
-                             &ISACencLB_obj->SaveEnc_obj);
-  WebRtcIsac_EncodePitchLag(PitchLags, PitchGains_Q12,
-                            &ISACencLB_obj->bitstr_obj,
-                            &ISACencLB_obj->SaveEnc_obj);
-
-  AvgPitchGain_Q12 = (PitchGains_Q12[0] + PitchGains_Q12[1] +
-      PitchGains_Q12[2] + PitchGains_Q12[3]) >> 2;
-
-  /* Find coefficients for perceptual pre-filters. */
-  WebRtcIsac_GetLpcCoefLb(LP_lookahead_pf, HP_lookahead,
-                          &ISACencLB_obj->maskfiltstr_obj, ISACencLB_obj->s2nr,
-                          PitchGains_Q12, lofilt_coef, hifilt_coef);
-
-  /* Code LPC model and shape - gains not quantized yet. */
-  WebRtcIsac_EncodeLpcLb(lofilt_coef, hifilt_coef, &ISACencLB_obj->bitstr_obj,
-                         &ISACencLB_obj->SaveEnc_obj);
-
-  /* Convert PitchGains back to FLOAT for pitchfilter_pre. */
-  for (k = 0; k < 4; k++) {
-    PitchGains[k] = ((float)PitchGains_Q12[k]) / 4096;
-  }
-
-  /* Store the state of arithmetic coder before coding LPC gains. */
-  transcodingParam.W_upper = ISACencLB_obj->bitstr_obj.W_upper;
-  transcodingParam.stream_index = ISACencLB_obj->bitstr_obj.stream_index;
-  transcodingParam.streamval = ISACencLB_obj->bitstr_obj.streamval;
-  transcodingParam.stream[0] =
-      ISACencLB_obj->bitstr_obj.stream[ISACencLB_obj->bitstr_obj.stream_index -
-                                       2];
-  transcodingParam.stream[1] =
-      ISACencLB_obj->bitstr_obj.stream[ISACencLB_obj->bitstr_obj.stream_index -
-                                       1];
-  transcodingParam.stream[2] =
-      ISACencLB_obj->bitstr_obj.stream[ISACencLB_obj->bitstr_obj.stream_index];
-
-  /* Store LPC Gains before encoding them. */
-  for (k = 0; k < SUBFRAMES; k++) {
-    transcodingParam.loFiltGain[k] = lofilt_coef[(LPC_LOBAND_ORDER + 1) * k];
-    transcodingParam.hiFiltGain[k] = hifilt_coef[(LPC_HIBAND_ORDER + 1) * k];
-  }
-
-  /* Code gains */
-  WebRtcIsac_EncodeLpcGainLb(lofilt_coef, hifilt_coef,
-                             &ISACencLB_obj->bitstr_obj,
-                             &ISACencLB_obj->SaveEnc_obj);
-
-  /* Get the correct value for the payload limit and calculate the
-   * number of bytes left for coding the spectrum. */
-  if ((frame_mode == 1) && (ISACencLB_obj->frame_nb == 0)) {
-    /* It is a 60ms and we are in the first 30ms then the limit at
-     * this point should be half of the assigned value. */
-    payloadLimitBytes = ISACencLB_obj->payloadLimitBytes60 >> 1;
-  } else if (frame_mode == 0) {
-    /* It is a 30ms frame */
-    /* Subract 3 because termination process may add 3 bytes. */
-    payloadLimitBytes = ISACencLB_obj->payloadLimitBytes30 - 3;
-  } else {
-    /* This is the second half of a 60ms frame. */
-    /* Subract 3 because termination process may add 3 bytes. */
-    payloadLimitBytes = ISACencLB_obj->payloadLimitBytes60 - 3;
-  }
-  bytesLeftSpecCoding = payloadLimitBytes - transcodingParam.stream_index;
-
-  /* Perceptual pre-filtering (using normalized lattice filter). */
-  /* Low-band filtering. */
-  WebRtcIsac_NormLatticeFilterMa(ORDERLO,
-                                 ISACencLB_obj->maskfiltstr_obj.PreStateLoF,
-                                 ISACencLB_obj->maskfiltstr_obj.PreStateLoG,
-                                 LP, lofilt_coef, LPw);
-  /* High-band filtering. */
-  WebRtcIsac_NormLatticeFilterMa(ORDERHI,
-                                 ISACencLB_obj->maskfiltstr_obj.PreStateHiF,
-                                 ISACencLB_obj->maskfiltstr_obj.PreStateHiG,
-                                 HP, hifilt_coef, HPw);
-  /* Pitch filter. */
-  WebRtcIsac_PitchfilterPre(LPw, LPw_pf, &ISACencLB_obj->pitchfiltstr_obj,
-                            PitchLags, PitchGains);
-  /* Transform */
-  WebRtcIsac_Time2Spec(transform_tables,
-                       LPw_pf, HPw, fre, fim, &ISACencLB_obj->fftstr_obj);
-
-  /* Save data for multiple packets memory. */
-  my_index = ISACencLB_obj->SaveEnc_obj.startIdx * FRAMESAMPLES_HALF;
-  memcpy(&ISACencLB_obj->SaveEnc_obj.fre[my_index], fre, sizeof(fre));
-  memcpy(&ISACencLB_obj->SaveEnc_obj.fim[my_index], fim, sizeof(fim));
-
-  ISACencLB_obj->SaveEnc_obj.AvgPitchGain[ISACencLB_obj->SaveEnc_obj.startIdx] =
-      AvgPitchGain_Q12;
-
-  /* Quantization and loss-less coding. */
-  err = WebRtcIsac_EncodeSpec(fre, fim, AvgPitchGain_Q12, kIsacLowerBand,
-                              &ISACencLB_obj->bitstr_obj);
-  if ((err < 0) && (err != -ISAC_DISALLOWED_BITSTREAM_LENGTH)) {
-    /* There has been an error but it was not too large payload
-       (we can cure too large payload). */
-    if (frame_mode == 1 && ISACencLB_obj->frame_nb == 1) {
-      /* If this is the second 30ms of a 60ms frame reset
-         this such that in the next call encoder starts fresh. */
-      ISACencLB_obj->frame_nb = 0;
-    }
-    return err;
-  }
-  iterCntr = 0;
-  while ((ISACencLB_obj->bitstr_obj.stream_index > payloadLimitBytes) ||
-      (err == -ISAC_DISALLOWED_BITSTREAM_LENGTH)) {
-    double bytesSpecCoderUsed;
-    double transcodeScale;
-
-    if (iterCntr >= MAX_PAYLOAD_LIMIT_ITERATION) {
-      /* We were not able to limit the payload size */
-      if ((frame_mode == 1) && (ISACencLB_obj->frame_nb == 0)) {
-        /* This was the first 30ms of a 60ms frame. Although
-           the payload is larger than it should be but we let
-           the second 30ms be encoded. Maybe together we
-           won't exceed the limit. */
-        ISACencLB_obj->frame_nb = 1;
-        return 0;
-      } else if ((frame_mode == 1) && (ISACencLB_obj->frame_nb == 1)) {
-        ISACencLB_obj->frame_nb = 0;
-      }
-
-      if (err != -ISAC_DISALLOWED_BITSTREAM_LENGTH) {
-        return -ISAC_PAYLOAD_LARGER_THAN_LIMIT;
-      } else {
-        return status;
-      }
-    }
-
-    if (err == -ISAC_DISALLOWED_BITSTREAM_LENGTH) {
-      bytesSpecCoderUsed = STREAM_SIZE_MAX;
-      /* Being conservative */
-      transcodeScale = bytesLeftSpecCoding / bytesSpecCoderUsed * 0.5;
-    } else {
-      bytesSpecCoderUsed = ISACencLB_obj->bitstr_obj.stream_index -
-          transcodingParam.stream_index;
-      transcodeScale = bytesLeftSpecCoding / bytesSpecCoderUsed;
-    }
-
-    /* To be safe, we reduce the scale depending on
-       the number of iterations. */
-    transcodeScale *= (1.0 - (0.9 * (double)iterCntr /
-        (double)MAX_PAYLOAD_LIMIT_ITERATION));
-
-    /* Scale the LPC Gains. */
-    for (k = 0; k < SUBFRAMES; k++) {
-      lofilt_coef[(LPC_LOBAND_ORDER + 1) * k] =
-          transcodingParam.loFiltGain[k] * transcodeScale;
-      hifilt_coef[(LPC_HIBAND_ORDER + 1) * k] =
-          transcodingParam.hiFiltGain[k] * transcodeScale;
-      transcodingParam.loFiltGain[k] = lofilt_coef[(LPC_LOBAND_ORDER + 1) * k];
-      transcodingParam.hiFiltGain[k] = hifilt_coef[(LPC_HIBAND_ORDER + 1) * k];
-    }
-
-    /* Scale DFT coefficients. */
-    for (k = 0; k < FRAMESAMPLES_HALF; k++) {
-      fre[k] = (int16_t)(fre[k] * transcodeScale);
-      fim[k] = (int16_t)(fim[k] * transcodeScale);
-    }
-
-    /* Save data for multiple packets memory. */
-    my_index = ISACencLB_obj->SaveEnc_obj.startIdx * FRAMESAMPLES_HALF;
-    memcpy(&ISACencLB_obj->SaveEnc_obj.fre[my_index], fre, sizeof(fre));
-    memcpy(&ISACencLB_obj->SaveEnc_obj.fim[my_index], fim, sizeof(fim));
-
-    /* Re-store the state of arithmetic coder before coding LPC gains. */
-    ISACencLB_obj->bitstr_obj.W_upper = transcodingParam.W_upper;
-    ISACencLB_obj->bitstr_obj.stream_index = transcodingParam.stream_index;
-    ISACencLB_obj->bitstr_obj.streamval = transcodingParam.streamval;
-    ISACencLB_obj->bitstr_obj.stream[transcodingParam.stream_index - 2] =
-        transcodingParam.stream[0];
-    ISACencLB_obj->bitstr_obj.stream[transcodingParam.stream_index - 1] =
-        transcodingParam.stream[1];
-    ISACencLB_obj->bitstr_obj.stream[transcodingParam.stream_index] =
-        transcodingParam.stream[2];
-
-    /* Code gains. */
-    WebRtcIsac_EncodeLpcGainLb(lofilt_coef, hifilt_coef,
-                               &ISACencLB_obj->bitstr_obj,
-                               &ISACencLB_obj->SaveEnc_obj);
-
-    /* Update the number of bytes left for encoding the spectrum. */
-    bytesLeftSpecCoding = payloadLimitBytes - transcodingParam.stream_index;
-
-    /* Encode the spectrum. */
-    err = WebRtcIsac_EncodeSpec(fre, fim, AvgPitchGain_Q12, kIsacLowerBand,
-                                &ISACencLB_obj->bitstr_obj);
-
-    if ((err < 0) && (err != -ISAC_DISALLOWED_BITSTREAM_LENGTH)) {
-      /* There has been an error but it was not too large
-         payload (we can cure too large payload). */
-      if (frame_mode == 1 && ISACencLB_obj->frame_nb == 1) {
-        /* If this is the second 30 ms of a 60 ms frame reset
-           this such that in the next call encoder starts fresh. */
-        ISACencLB_obj->frame_nb = 0;
-      }
-      return err;
-    }
-    iterCntr++;
-  }
-
-  /* If 60 ms frame-size and just processed the first 30 ms, */
-  /* go back to main function to buffer the other 30 ms speech frame. */
-  if (frame_mode == 1) {
-    if (ISACencLB_obj->frame_nb == 0) {
-      ISACencLB_obj->frame_nb = 1;
-      return 0;
-    } else if (ISACencLB_obj->frame_nb == 1) {
-      ISACencLB_obj->frame_nb = 0;
-      /* Also update the frame-length for next packet,
-         in Adaptive mode only. */
-      if (codingMode == 0 && (ISACencLB_obj->enforceFrameSize == 0)) {
-        ISACencLB_obj->new_framelength =
-            WebRtcIsac_GetNewFrameLength(ISACencLB_obj->bottleneck,
-                                         ISACencLB_obj->current_framesamples);
-      }
-    }
-  } else {
-    ISACencLB_obj->frame_nb = 0;
-  }
-
-  /* Complete arithmetic coding. */
-  stream_length = WebRtcIsac_EncTerminate(&ISACencLB_obj->bitstr_obj);
-  return stream_length;
-}
-
-
-
-static int LimitPayloadUb(ISACUBEncStruct* ISACencUB_obj,
-                          uint16_t payloadLimitBytes,
-                          double bytesLeftSpecCoding,
-                          transcode_obj* transcodingParam,
-                          int16_t* fre, int16_t* fim,
-                          double* lpcGains, enum ISACBand band, int status) {
-
-  int iterCntr = 0;
-  int k;
-  double bytesSpecCoderUsed;
-  double transcodeScale;
-  const int16_t kAveragePitchGain = 0.0;
-
-  do {
-    if (iterCntr >= MAX_PAYLOAD_LIMIT_ITERATION) {
-      /* We were not able to limit the payload size. */
-      return -ISAC_PAYLOAD_LARGER_THAN_LIMIT;
-    }
-
-    if (status == -ISAC_DISALLOWED_BITSTREAM_LENGTH) {
-      bytesSpecCoderUsed = STREAM_SIZE_MAX;
-      /* Being conservative. */
-      transcodeScale = bytesLeftSpecCoding / bytesSpecCoderUsed * 0.5;
-    } else {
-      bytesSpecCoderUsed = ISACencUB_obj->bitstr_obj.stream_index -
-          transcodingParam->stream_index;
-      transcodeScale = bytesLeftSpecCoding / bytesSpecCoderUsed;
-    }
-
-    /* To be safe, we reduce the scale depending on the
-       number of iterations. */
-    transcodeScale *= (1.0 - (0.9 * (double)iterCntr /
-        (double)MAX_PAYLOAD_LIMIT_ITERATION));
-
-    /* Scale the LPC Gains. */
-    if (band == kIsacUpperBand16) {
-      /* Two sets of coefficients if 16 kHz. */
-      for (k = 0; k < SUBFRAMES; k++) {
-        transcodingParam->loFiltGain[k] *= transcodeScale;
-        transcodingParam->hiFiltGain[k] *= transcodeScale;
-      }
-    } else {
-      /* One sets of coefficients if 12 kHz. */
-      for (k = 0; k < SUBFRAMES; k++) {
-        transcodingParam->loFiltGain[k] *= transcodeScale;
-      }
-    }
-
-    /* Scale DFT coefficients. */
-    for (k = 0; k < FRAMESAMPLES_HALF; k++) {
-      fre[k] = (int16_t)(fre[k] * transcodeScale + 0.5);
-      fim[k] = (int16_t)(fim[k] * transcodeScale + 0.5);
-    }
-    /* Store FFT coefficients for multiple encoding. */
-    memcpy(ISACencUB_obj->SaveEnc_obj.realFFT, fre,
-          sizeof(ISACencUB_obj->SaveEnc_obj.realFFT));
-    memcpy(ISACencUB_obj->SaveEnc_obj.imagFFT, fim,
-           sizeof(ISACencUB_obj->SaveEnc_obj.imagFFT));
-
-    /* Store the state of arithmetic coder before coding LPC gains */
-    ISACencUB_obj->bitstr_obj.W_upper = transcodingParam->W_upper;
-    ISACencUB_obj->bitstr_obj.stream_index = transcodingParam->stream_index;
-    ISACencUB_obj->bitstr_obj.streamval = transcodingParam->streamval;
-    ISACencUB_obj->bitstr_obj.stream[transcodingParam->stream_index - 2] =
-        transcodingParam->stream[0];
-    ISACencUB_obj->bitstr_obj.stream[transcodingParam->stream_index - 1] =
-        transcodingParam->stream[1];
-    ISACencUB_obj->bitstr_obj.stream[transcodingParam->stream_index] =
-        transcodingParam->stream[2];
-
-    /* Store the gains for multiple encoding. */
-    memcpy(ISACencUB_obj->SaveEnc_obj.lpcGain, lpcGains,
-           SUBFRAMES * sizeof(double));
-    /* Entropy Code lpc-gains, indices are stored for a later use.*/
-    WebRtcIsac_EncodeLpcGainUb(transcodingParam->loFiltGain,
-                               &ISACencUB_obj->bitstr_obj,
-                               ISACencUB_obj->SaveEnc_obj.lpcGainIndex);
-
-    /* If 16kHz should do one more set. */
-    if (band == kIsacUpperBand16) {
-      /* Store the gains for multiple encoding. */
-      memcpy(&ISACencUB_obj->SaveEnc_obj.lpcGain[SUBFRAMES],
-             &lpcGains[SUBFRAMES], SUBFRAMES * sizeof(double));
-      /* Entropy Code lpc-gains, indices are stored for a later use.*/
-      WebRtcIsac_EncodeLpcGainUb(
-          transcodingParam->hiFiltGain, &ISACencUB_obj->bitstr_obj,
-          &ISACencUB_obj->SaveEnc_obj.lpcGainIndex[SUBFRAMES]);
-    }
-
-    /* Update the number of bytes left for encoding the spectrum. */
-    bytesLeftSpecCoding = payloadLimitBytes -
-        ISACencUB_obj->bitstr_obj.stream_index;
-
-    /* Save the bit-stream object at this point for FEC. */
-    memcpy(&ISACencUB_obj->SaveEnc_obj.bitStreamObj,
-           &ISACencUB_obj->bitstr_obj, sizeof(Bitstr));
-
-    /* Encode the spectrum. */
-    status = WebRtcIsac_EncodeSpec(fre, fim, kAveragePitchGain,
-                                   band, &ISACencUB_obj->bitstr_obj);
-    if ((status < 0) && (status != -ISAC_DISALLOWED_BITSTREAM_LENGTH)) {
-      /* There has been an error but it was not too large payload
-         (we can cure too large payload). */
-      return status;
-    }
-    iterCntr++;
-  } while ((ISACencUB_obj->bitstr_obj.stream_index > payloadLimitBytes) ||
-      (status == -ISAC_DISALLOWED_BITSTREAM_LENGTH));
-  return 0;
-}
-
-int WebRtcIsac_EncodeUb16(const TransformTables* transform_tables,
-                          float* in, ISACUBEncStruct* ISACencUB_obj,
-                          int32_t jitterInfo) {
-  int err;
-  int k;
-
-  double lpcVecs[UB_LPC_ORDER * UB16_LPC_VEC_PER_FRAME];
-  double percepFilterParams[(1 + UB_LPC_ORDER) * (SUBFRAMES << 1) +
-                            (1 + UB_LPC_ORDER)];
-
-  double LP_lookahead[FRAMESAMPLES];
-  int16_t fre[FRAMESAMPLES_HALF];   /* Q7 */
-  int16_t fim[FRAMESAMPLES_HALF];   /* Q7 */
-
-  int status = 0;
-
-  double varscale[2];
-  double corr[SUBFRAMES << 1][UB_LPC_ORDER + 1];
-  double lpcGains[SUBFRAMES << 1];
-  transcode_obj transcodingParam;
-  uint16_t payloadLimitBytes;
-  double s2nr;
-  const int16_t kAveragePitchGain = 0.0;
-  int bytesLeftSpecCoding;
-
-  /* Buffer speech samples (by 10ms packet) until the frame-length is   */
-  /* reached (30 ms).                                                   */
-  /*********************************************************************/
-
-  /* fill the buffer with 10ms input data */
-  memcpy(&ISACencUB_obj->data_buffer_float[ISACencUB_obj->buffer_index], in,
-         FRAMESAMPLES_10ms * sizeof(float));
-
-  /* If buffer size is not equal to current frame-size, and end of file is
-   * not reached yet, we don't do encoding unless we have the whole frame. */
-  if (ISACencUB_obj->buffer_index + FRAMESAMPLES_10ms < FRAMESAMPLES) {
-    ISACencUB_obj->buffer_index += FRAMESAMPLES_10ms;
-    return 0;
-  }
-
-  /* End of buffer function. */
-  /**************************/
-
-  /* Encoding */
-  /************/
-
-  /* Reset bit-stream */
-  WebRtcIsac_ResetBitstream(&(ISACencUB_obj->bitstr_obj));
-
-  /* Encoding of bandwidth information. */
-  WebRtcIsac_EncodeJitterInfo(jitterInfo, &ISACencUB_obj->bitstr_obj);
-
-  status = WebRtcIsac_EncodeBandwidth(isac16kHz, &ISACencUB_obj->bitstr_obj);
-  if (status < 0) {
-    return status;
-  }
-
-  s2nr = WebRtcIsac_GetSnr(ISACencUB_obj->bottleneck, FRAMESAMPLES);
-
-  memcpy(lpcVecs, ISACencUB_obj->lastLPCVec, UB_LPC_ORDER * sizeof(double));
-
-  for (k = 0; k < FRAMESAMPLES; k++) {
-    LP_lookahead[k] = ISACencUB_obj->data_buffer_float[UB_LOOKAHEAD + k];
-  }
-
-  /* Find coefficients for perceptual pre-filters. */
-  WebRtcIsac_GetLpcCoefUb(LP_lookahead, &ISACencUB_obj->maskfiltstr_obj,
-                          &lpcVecs[UB_LPC_ORDER], corr, varscale, isac16kHz);
-
-  memcpy(ISACencUB_obj->lastLPCVec,
-         &lpcVecs[(UB16_LPC_VEC_PER_FRAME - 1) * (UB_LPC_ORDER)],
-         sizeof(double) * UB_LPC_ORDER);
-
-  /* Code LPC model and shape - gains not quantized yet. */
-  WebRtcIsac_EncodeLpcUB(lpcVecs, &ISACencUB_obj->bitstr_obj,
-                         percepFilterParams, isac16kHz,
-                         &ISACencUB_obj->SaveEnc_obj);
-
-  /* the first set of lpc parameters are from the last sub-frame of
-   * the previous frame. so we don't care about them. */
-  WebRtcIsac_GetLpcGain(s2nr, &percepFilterParams[UB_LPC_ORDER + 1],
-                        (SUBFRAMES << 1), lpcGains, corr, varscale);
-
-  /* Store the state of arithmetic coder before coding LPC gains */
-  transcodingParam.stream_index = ISACencUB_obj->bitstr_obj.stream_index;
-  transcodingParam.W_upper = ISACencUB_obj->bitstr_obj.W_upper;
-  transcodingParam.streamval = ISACencUB_obj->bitstr_obj.streamval;
-  transcodingParam.stream[0] =
-      ISACencUB_obj->bitstr_obj.stream[ISACencUB_obj->bitstr_obj.stream_index -
-                                       2];
-  transcodingParam.stream[1] =
-      ISACencUB_obj->bitstr_obj.stream[ISACencUB_obj->bitstr_obj.stream_index -
-                                       1];
-  transcodingParam.stream[2] =
-      ISACencUB_obj->bitstr_obj.stream[ISACencUB_obj->bitstr_obj.stream_index];
-
-  /* Store LPC Gains before encoding them. */
-  for (k = 0; k < SUBFRAMES; k++) {
-    transcodingParam.loFiltGain[k] = lpcGains[k];
-    transcodingParam.hiFiltGain[k] = lpcGains[SUBFRAMES + k];
-  }
-
-  /* Store the gains for multiple encoding. */
-  memcpy(ISACencUB_obj->SaveEnc_obj.lpcGain, lpcGains,
-         (SUBFRAMES << 1) * sizeof(double));
-
-  WebRtcIsac_EncodeLpcGainUb(lpcGains, &ISACencUB_obj->bitstr_obj,
-                             ISACencUB_obj->SaveEnc_obj.lpcGainIndex);
-  WebRtcIsac_EncodeLpcGainUb(
-      &lpcGains[SUBFRAMES], &ISACencUB_obj->bitstr_obj,
-      &ISACencUB_obj->SaveEnc_obj.lpcGainIndex[SUBFRAMES]);
-
-  /* Get the correct value for the payload limit and calculate the number of
-     bytes left for coding the spectrum. It is a 30ms frame
-     Subract 3 because termination process may add 3 bytes */
-  payloadLimitBytes = ISACencUB_obj->maxPayloadSizeBytes -
-      ISACencUB_obj->numBytesUsed - 3;
-  bytesLeftSpecCoding = payloadLimitBytes -
-        ISACencUB_obj->bitstr_obj.stream_index;
-
-  for (k = 0; k < (SUBFRAMES << 1); k++) {
-    percepFilterParams[k * (UB_LPC_ORDER + 1) + (UB_LPC_ORDER + 1)] =
-        lpcGains[k];
-  }
-
-  /* LPC filtering (using normalized lattice filter), */
-  /* first half-frame. */
-  WebRtcIsac_NormLatticeFilterMa(UB_LPC_ORDER,
-                                 ISACencUB_obj->maskfiltstr_obj.PreStateLoF,
-                                 ISACencUB_obj->maskfiltstr_obj.PreStateLoG,
-                                 &ISACencUB_obj->data_buffer_float[0],
-                                 &percepFilterParams[UB_LPC_ORDER + 1],
-                                 &LP_lookahead[0]);
-
-  /* Second half-frame filtering. */
-  WebRtcIsac_NormLatticeFilterMa(
-      UB_LPC_ORDER, ISACencUB_obj->maskfiltstr_obj.PreStateLoF,
-      ISACencUB_obj->maskfiltstr_obj.PreStateLoG,
-      &ISACencUB_obj->data_buffer_float[FRAMESAMPLES_HALF],
-      &percepFilterParams[(UB_LPC_ORDER + 1) + SUBFRAMES * (UB_LPC_ORDER + 1)],
-      &LP_lookahead[FRAMESAMPLES_HALF]);
-
-  WebRtcIsac_Time2Spec(transform_tables,
-                       &LP_lookahead[0], &LP_lookahead[FRAMESAMPLES_HALF],
-                       fre, fim, &ISACencUB_obj->fftstr_obj);
-
-  /* Store FFT coefficients for multiple encoding. */
-  memcpy(ISACencUB_obj->SaveEnc_obj.realFFT, fre, sizeof(fre));
-  memcpy(ISACencUB_obj->SaveEnc_obj.imagFFT, fim, sizeof(fim));
-
-  /* Prepare the audio buffer for the next packet
-   * move the last 3 ms to the beginning of the buffer. */
-  memcpy(ISACencUB_obj->data_buffer_float,
-         &ISACencUB_obj->data_buffer_float[FRAMESAMPLES],
-         LB_TOTAL_DELAY_SAMPLES * sizeof(float));
-  /* start writing with 3 ms delay to compensate for the delay
-   * of the lower-band. */
-  ISACencUB_obj->buffer_index = LB_TOTAL_DELAY_SAMPLES;
-
-  /* Save the bit-stream object at this point for FEC. */
-  memcpy(&ISACencUB_obj->SaveEnc_obj.bitStreamObj, &ISACencUB_obj->bitstr_obj,
-         sizeof(Bitstr));
-
-  /* Qantization and lossless coding */
-  /* Note that there is no pitch-gain for this band so kAveragePitchGain = 0
-   * is passed to the function. In fact, the function ignores the 3rd parameter
-   * for this band. */
-  err = WebRtcIsac_EncodeSpec(fre, fim, kAveragePitchGain, kIsacUpperBand16,
-                              &ISACencUB_obj->bitstr_obj);
-  if ((err < 0) && (err != -ISAC_DISALLOWED_BITSTREAM_LENGTH)) {
-    return err;
-  }
-
-  if ((ISACencUB_obj->bitstr_obj.stream_index > payloadLimitBytes) ||
-      (err == -ISAC_DISALLOWED_BITSTREAM_LENGTH)) {
-    err = LimitPayloadUb(ISACencUB_obj, payloadLimitBytes, bytesLeftSpecCoding,
-                         &transcodingParam, fre, fim, lpcGains,
-                         kIsacUpperBand16, err);
-  }
-  if (err < 0) {
-    return err;
-  }
-  /* Complete arithmetic coding. */
-  return WebRtcIsac_EncTerminate(&ISACencUB_obj->bitstr_obj);
-}
-
-
-int WebRtcIsac_EncodeUb12(const TransformTables* transform_tables,
-                          float* in, ISACUBEncStruct* ISACencUB_obj,
-                          int32_t jitterInfo) {
-  int err;
-  int k;
-
-  double lpcVecs[UB_LPC_ORDER * UB_LPC_VEC_PER_FRAME];
-
-  double percepFilterParams[(1 + UB_LPC_ORDER) * SUBFRAMES];
-  float LP[FRAMESAMPLES_HALF];
-  float HP[FRAMESAMPLES_HALF];
-
-  double LP_lookahead[FRAMESAMPLES_HALF];
-  double HP_lookahead[FRAMESAMPLES_HALF];
-  double LPw[FRAMESAMPLES_HALF];
-
-  double HPw[FRAMESAMPLES_HALF];
-  int16_t fre[FRAMESAMPLES_HALF];   /* Q7 */
-  int16_t fim[FRAMESAMPLES_HALF];   /* Q7 */
-
-  int status = 0;
-
-  double varscale[1];
-
-  double corr[UB_LPC_GAIN_DIM][UB_LPC_ORDER + 1];
-  double lpcGains[SUBFRAMES];
-  transcode_obj transcodingParam;
-  uint16_t payloadLimitBytes;
-  double s2nr;
-  const int16_t kAveragePitchGain = 0.0;
-  double bytesLeftSpecCoding;
-
-  /* Buffer speech samples (by 10ms packet) until the framelength is  */
-  /* reached (30 ms).                                                 */
-  /********************************************************************/
-
-  /* Fill the buffer with 10ms input data. */
-  memcpy(&ISACencUB_obj->data_buffer_float[ISACencUB_obj->buffer_index], in,
-         FRAMESAMPLES_10ms * sizeof(float));
-
-  /* if buffer-size is not equal to current frame-size then increase the
-     index and return. We do the encoding when we have enough audio.     */
-  if (ISACencUB_obj->buffer_index + FRAMESAMPLES_10ms < FRAMESAMPLES) {
-    ISACencUB_obj->buffer_index += FRAMESAMPLES_10ms;
-    return 0;
-  }
-  /* If buffer reached the right size, reset index and continue
-     with encoding the frame */
-  ISACencUB_obj->buffer_index = 0;
-
-  /* End of buffer function */
-  /**************************/
-
-  /* Encoding */
-  /************/
-
-  /* Reset bit-stream. */
-  WebRtcIsac_ResetBitstream(&(ISACencUB_obj->bitstr_obj));
-
-  /* Encoding bandwidth information. */
-  WebRtcIsac_EncodeJitterInfo(jitterInfo, &ISACencUB_obj->bitstr_obj);
-  status = WebRtcIsac_EncodeBandwidth(isac12kHz, &ISACencUB_obj->bitstr_obj);
-  if (status < 0) {
-    return status;
-  }
-
-  s2nr = WebRtcIsac_GetSnr(ISACencUB_obj->bottleneck, FRAMESAMPLES);
-
-  /* Split signal in two bands. */
-  WebRtcIsac_SplitAndFilterFloat(ISACencUB_obj->data_buffer_float, HP, LP,
-                                 HP_lookahead, LP_lookahead,
-                                 &ISACencUB_obj->prefiltbankstr_obj);
-
-  /* Find coefficients for perceptual pre-filters. */
-  WebRtcIsac_GetLpcCoefUb(LP_lookahead, &ISACencUB_obj->maskfiltstr_obj,
-                          lpcVecs, corr, varscale, isac12kHz);
-
-  /* Code LPC model and shape - gains not quantized yet. */
-  WebRtcIsac_EncodeLpcUB(lpcVecs, &ISACencUB_obj->bitstr_obj,
-                         percepFilterParams, isac12kHz,
-                         &ISACencUB_obj->SaveEnc_obj);
-
-  WebRtcIsac_GetLpcGain(s2nr, percepFilterParams, SUBFRAMES, lpcGains, corr,
-                        varscale);
-
-  /* Store the state of arithmetic coder before coding LPC gains. */
-  transcodingParam.W_upper = ISACencUB_obj->bitstr_obj.W_upper;
-  transcodingParam.stream_index = ISACencUB_obj->bitstr_obj.stream_index;
-  transcodingParam.streamval = ISACencUB_obj->bitstr_obj.streamval;
-  transcodingParam.stream[0] =
-      ISACencUB_obj->bitstr_obj.stream[ISACencUB_obj->bitstr_obj.stream_index -
-                                       2];
-  transcodingParam.stream[1] =
-      ISACencUB_obj->bitstr_obj.stream[ISACencUB_obj->bitstr_obj.stream_index -
-                                       1];
-  transcodingParam.stream[2] =
-      ISACencUB_obj->bitstr_obj.stream[ISACencUB_obj->bitstr_obj.stream_index];
-
-  /* Store LPC Gains before encoding them. */
-  for (k = 0; k < SUBFRAMES; k++) {
-    transcodingParam.loFiltGain[k] = lpcGains[k];
-  }
-
-  /* Store the gains for multiple encoding. */
-  memcpy(ISACencUB_obj->SaveEnc_obj.lpcGain, lpcGains, SUBFRAMES *
-         sizeof(double));
-
-  WebRtcIsac_EncodeLpcGainUb(lpcGains, &ISACencUB_obj->bitstr_obj,
-                             ISACencUB_obj->SaveEnc_obj.lpcGainIndex);
-
-  for (k = 0; k < SUBFRAMES; k++) {
-    percepFilterParams[k * (UB_LPC_ORDER + 1)] = lpcGains[k];
-  }
-
-  /* perceptual pre-filtering (using normalized lattice filter) */
-  /* low-band filtering */
-  WebRtcIsac_NormLatticeFilterMa(UB_LPC_ORDER,
-                                 ISACencUB_obj->maskfiltstr_obj.PreStateLoF,
-                                 ISACencUB_obj->maskfiltstr_obj.PreStateLoG, LP,
-                                 percepFilterParams, LPw);
-
-  /* Get the correct value for the payload limit and calculate the number
-     of bytes left for coding the spectrum. It is a 30ms frame Subract 3
-     because termination process may add 3 bytes */
-  payloadLimitBytes = ISACencUB_obj->maxPayloadSizeBytes -
-      ISACencUB_obj->numBytesUsed - 3;
-  bytesLeftSpecCoding = payloadLimitBytes -
-      ISACencUB_obj->bitstr_obj.stream_index;
-
-  memset(HPw, 0, sizeof(HPw));
-
-  /* Transform */
-  WebRtcIsac_Time2Spec(transform_tables,
-                       LPw, HPw, fre, fim, &ISACencUB_obj->fftstr_obj);
-
-  /* Store FFT coefficients for multiple encoding. */
-  memcpy(ISACencUB_obj->SaveEnc_obj.realFFT, fre,
-         sizeof(ISACencUB_obj->SaveEnc_obj.realFFT));
-  memcpy(ISACencUB_obj->SaveEnc_obj.imagFFT, fim,
-         sizeof(ISACencUB_obj->SaveEnc_obj.imagFFT));
-
-  /* Save the bit-stream object at this point for FEC. */
-  memcpy(&ISACencUB_obj->SaveEnc_obj.bitStreamObj,
-         &ISACencUB_obj->bitstr_obj, sizeof(Bitstr));
-
-  /* Quantization and loss-less coding */
-  /* The 4th parameter to this function is pitch-gain, which is only used
-   * when encoding 0-8 kHz band, and irrelevant in this function, therefore,
-   * we insert zero here. */
-  err = WebRtcIsac_EncodeSpec(fre, fim, kAveragePitchGain, kIsacUpperBand12,
-                              &ISACencUB_obj->bitstr_obj);
-  if ((err < 0) && (err != -ISAC_DISALLOWED_BITSTREAM_LENGTH)) {
-    /* There has been an error but it was not too large
-       payload (we can cure too large payload) */
-    return err;
-  }
-
-  if ((ISACencUB_obj->bitstr_obj.stream_index > payloadLimitBytes) ||
-      (err == -ISAC_DISALLOWED_BITSTREAM_LENGTH)) {
-    err = LimitPayloadUb(ISACencUB_obj, payloadLimitBytes, bytesLeftSpecCoding,
-                         &transcodingParam, fre, fim, lpcGains,
-                         kIsacUpperBand12, err);
-  }
-  if (err < 0) {
-    return err;
-  }
-  /* Complete arithmetic coding. */
-  return WebRtcIsac_EncTerminate(&ISACencUB_obj->bitstr_obj);
-}
-
-
-
-
-
-
-/* This function is used to create a new bit-stream with new BWE.
-   The same data as previously encoded with the function WebRtcIsac_Encoder().
-   The data needed is taken from the structure, where it was stored
-   when calling the encoder. */
-
-int WebRtcIsac_EncodeStoredDataLb(const IsacSaveEncoderData* ISACSavedEnc_obj,
-                                  Bitstr* ISACBitStr_obj, int BWnumber,
-                                  float scale) {
-  int ii;
-  int status;
-  int BWno = BWnumber;
-
-  const uint16_t* WebRtcIsac_kQPitchGainCdf_ptr[1];
-  const uint16_t** cdf;
-
-  double tmpLPCcoeffs_lo[(ORDERLO + 1)*SUBFRAMES * 2];
-  double tmpLPCcoeffs_hi[(ORDERHI + 1)*SUBFRAMES * 2];
-  int tmpLPCindex_g[12 * 2];
-  int16_t tmp_fre[FRAMESAMPLES], tmp_fim[FRAMESAMPLES];
-  const int kModel = 0;
-
-  /* Sanity Check - possible values for BWnumber is 0 - 23. */
-  if ((BWnumber < 0) || (BWnumber > 23)) {
-    return -ISAC_RANGE_ERROR_BW_ESTIMATOR;
-  }
-
-  /* Reset bit-stream. */
-  WebRtcIsac_ResetBitstream(ISACBitStr_obj);
-
-  /* Encode frame length */
-  status = WebRtcIsac_EncodeFrameLen(ISACSavedEnc_obj->framelength,
-                                     ISACBitStr_obj);
-  if (status < 0) {
-    /* Wrong frame size. */
-    return status;
-  }
-
-  /* Transcoding */
-  if ((scale > 0.0) && (scale < 1.0)) {
-    /* Compensate LPC gain. */
-    for (ii = 0;
-        ii < ((ORDERLO + 1)* SUBFRAMES * (1 + ISACSavedEnc_obj->startIdx));
-        ii++) {
-      tmpLPCcoeffs_lo[ii] = scale *  ISACSavedEnc_obj->LPCcoeffs_lo[ii];
-    }
-    for (ii = 0;
-        ii < ((ORDERHI + 1) * SUBFRAMES * (1 + ISACSavedEnc_obj->startIdx));
-        ii++) {
-      tmpLPCcoeffs_hi[ii] = scale *  ISACSavedEnc_obj->LPCcoeffs_hi[ii];
-    }
-    /* Scale DFT. */
-    for (ii = 0;
-        ii < (FRAMESAMPLES_HALF * (1 + ISACSavedEnc_obj->startIdx));
-        ii++) {
-      tmp_fre[ii] = (int16_t)((scale) * (float)ISACSavedEnc_obj->fre[ii]);
-      tmp_fim[ii] = (int16_t)((scale) * (float)ISACSavedEnc_obj->fim[ii]);
-    }
-  } else {
-    for (ii = 0;
-        ii < (KLT_ORDER_GAIN * (1 + ISACSavedEnc_obj->startIdx));
-        ii++) {
-      tmpLPCindex_g[ii] =  ISACSavedEnc_obj->LPCindex_g[ii];
-    }
-    for (ii = 0;
-        ii < (FRAMESAMPLES_HALF * (1 + ISACSavedEnc_obj->startIdx));
-        ii++) {
-      tmp_fre[ii] = ISACSavedEnc_obj->fre[ii];
-      tmp_fim[ii] = ISACSavedEnc_obj->fim[ii];
-    }
-  }
-
-  /* Encode bandwidth estimate. */
-  WebRtcIsac_EncodeReceiveBw(&BWno, ISACBitStr_obj);
-
-  /* Loop over number of 30 msec */
-  for (ii = 0; ii <= ISACSavedEnc_obj->startIdx; ii++) {
-    /* Encode pitch gains. */
-    *WebRtcIsac_kQPitchGainCdf_ptr = WebRtcIsac_kQPitchGainCdf;
-    WebRtcIsac_EncHistMulti(ISACBitStr_obj,
-                            &ISACSavedEnc_obj->pitchGain_index[ii],
-                            WebRtcIsac_kQPitchGainCdf_ptr, 1);
-
-    /* Entropy coding of quantization pitch lags */
-    /* Voicing classification. */
-    if (ISACSavedEnc_obj->meanGain[ii] < 0.2) {
-      cdf = WebRtcIsac_kQPitchLagCdfPtrLo;
-    } else if (ISACSavedEnc_obj->meanGain[ii] < 0.4) {
-      cdf = WebRtcIsac_kQPitchLagCdfPtrMid;
-    } else {
-      cdf = WebRtcIsac_kQPitchLagCdfPtrHi;
-    }
-    WebRtcIsac_EncHistMulti(ISACBitStr_obj,
-                            &ISACSavedEnc_obj->pitchIndex[PITCH_SUBFRAMES * ii],
-                            cdf, PITCH_SUBFRAMES);
-
-    /* LPC */
-    /* Only one model exists. The entropy coding is done only for backward
-     * compatibility. */
-    WebRtcIsac_EncHistMulti(ISACBitStr_obj, &kModel,
-                            WebRtcIsac_kQKltModelCdfPtr, 1);
-    /* Entropy coding of quantization indices - LPC shape only. */
-    WebRtcIsac_EncHistMulti(ISACBitStr_obj,
-                            &ISACSavedEnc_obj->LPCindex_s[KLT_ORDER_SHAPE * ii],
-                            WebRtcIsac_kQKltCdfPtrShape,
-                            KLT_ORDER_SHAPE);
-
-    /* If transcoding, get new LPC gain indices */
-    if (scale < 1.0) {
-      WebRtcIsac_TranscodeLPCCoef(
-          &tmpLPCcoeffs_lo[(ORDERLO + 1) * SUBFRAMES * ii],
-          &tmpLPCcoeffs_hi[(ORDERHI + 1)*SUBFRAMES * ii],
-          &tmpLPCindex_g[KLT_ORDER_GAIN * ii]);
-    }
-
-    /* Entropy coding of quantization indices - LPC gain. */
-    WebRtcIsac_EncHistMulti(ISACBitStr_obj, &tmpLPCindex_g[KLT_ORDER_GAIN * ii],
-                            WebRtcIsac_kQKltCdfPtrGain, KLT_ORDER_GAIN);
-
-    /* Quantization and loss-less coding. */
-    status = WebRtcIsac_EncodeSpec(&tmp_fre[ii * FRAMESAMPLES_HALF],
-                                   &tmp_fim[ii * FRAMESAMPLES_HALF],
-                                   ISACSavedEnc_obj->AvgPitchGain[ii],
-                                   kIsacLowerBand, ISACBitStr_obj);
-    if (status < 0) {
-      return status;
-    }
-  }
-  /* Complete arithmetic coding. */
-  return WebRtcIsac_EncTerminate(ISACBitStr_obj);
-}
-
-
-int WebRtcIsac_EncodeStoredDataUb(
-    const ISACUBSaveEncDataStruct* ISACSavedEnc_obj,
-    Bitstr* bitStream,
-    int32_t jitterInfo,
-    float scale,
-    enum ISACBandwidth bandwidth) {
-  int n;
-  int err;
-  double lpcGain[SUBFRAMES];
-  int16_t realFFT[FRAMESAMPLES_HALF];
-  int16_t imagFFT[FRAMESAMPLES_HALF];
-  const uint16_t** shape_cdf;
-  int shape_len;
-  const int16_t kAveragePitchGain = 0.0;
-  enum ISACBand band;
-  /* Reset bitstream. */
-  WebRtcIsac_ResetBitstream(bitStream);
-
-  /* Encode jitter index. */
-  WebRtcIsac_EncodeJitterInfo(jitterInfo, bitStream);
-
-  err = WebRtcIsac_EncodeBandwidth(bandwidth, bitStream);
-  if (err < 0) {
-    return err;
-  }
-
-  /* Encode LPC-shape. */
-  if (bandwidth == isac12kHz) {
-    shape_cdf = WebRtcIsac_kLpcShapeCdfMatUb12;
-    shape_len = UB_LPC_ORDER * UB_LPC_VEC_PER_FRAME;
-    band = kIsacUpperBand12;
-  } else {
-    shape_cdf = WebRtcIsac_kLpcShapeCdfMatUb16;
-    shape_len = UB_LPC_ORDER * UB16_LPC_VEC_PER_FRAME;
-    band = kIsacUpperBand16;
-  }
-  WebRtcIsac_EncHistMulti(bitStream, ISACSavedEnc_obj->indexLPCShape,
-                          shape_cdf, shape_len);
-
-  if ((scale <= 0.0) || (scale >= 1.0)) {
-    /* We only consider scales between zero and one. */
-    WebRtcIsac_EncHistMulti(bitStream, ISACSavedEnc_obj->lpcGainIndex,
-                            WebRtcIsac_kLpcGainCdfMat, UB_LPC_GAIN_DIM);
-    if (bandwidth == isac16kHz) {
-      /* Store gain indices of the second half. */
-      WebRtcIsac_EncHistMulti(bitStream,
-                              &ISACSavedEnc_obj->lpcGainIndex[SUBFRAMES],
-                              WebRtcIsac_kLpcGainCdfMat, UB_LPC_GAIN_DIM);
-    }
-    /* Store FFT coefficients. */
-    err = WebRtcIsac_EncodeSpec(ISACSavedEnc_obj->realFFT,
-                                ISACSavedEnc_obj->imagFFT, kAveragePitchGain,
-                                band, bitStream);
-  } else {
-    /* Scale LPC gain and FFT coefficients. */
-    for (n = 0; n < SUBFRAMES; n++) {
-      lpcGain[n] = scale * ISACSavedEnc_obj->lpcGain[n];
-    }
-    /* Store LPC gains. */
-    WebRtcIsac_StoreLpcGainUb(lpcGain, bitStream);
-
-    if (bandwidth == isac16kHz) {
-      /* Scale and code the gains of the second half of the frame, if 16kHz. */
-      for (n = 0; n < SUBFRAMES; n++) {
-        lpcGain[n] = scale * ISACSavedEnc_obj->lpcGain[n + SUBFRAMES];
-      }
-      WebRtcIsac_StoreLpcGainUb(lpcGain, bitStream);
-    }
-
-    for (n = 0; n < FRAMESAMPLES_HALF; n++) {
-      realFFT[n] = (int16_t)(scale * (float)ISACSavedEnc_obj->realFFT[n] +
-          0.5f);
-      imagFFT[n] = (int16_t)(scale * (float)ISACSavedEnc_obj->imagFFT[n] +
-          0.5f);
-    }
-    /* Store FFT coefficients. */
-    err = WebRtcIsac_EncodeSpec(realFFT, imagFFT, kAveragePitchGain,
-                                band, bitStream);
-  }
-  if (err < 0) {
-    /* Error happened while encoding FFT coefficients. */
-    return err;
-  }
-
-  /* Complete arithmetic coding. */
-  return WebRtcIsac_EncTerminate(bitStream);
-}
-
-int16_t WebRtcIsac_GetRedPayloadUb(
-    const ISACUBSaveEncDataStruct* ISACSavedEncObj,
-    Bitstr*                        bitStreamObj,
-    enum ISACBandwidth             bandwidth) {
-  int n;
-  int16_t status;
-  int16_t realFFT[FRAMESAMPLES_HALF];
-  int16_t imagFFT[FRAMESAMPLES_HALF];
-  enum ISACBand band;
-  const int16_t kAveragePitchGain = 0.0;
-  /* Store bit-stream object. */
-  memcpy(bitStreamObj, &ISACSavedEncObj->bitStreamObj, sizeof(Bitstr));
-
-  /* Scale FFT coefficients. */
-  for (n = 0; n < FRAMESAMPLES_HALF; n++) {
-    realFFT[n] = (int16_t)((float)ISACSavedEncObj->realFFT[n] *
-        RCU_TRANSCODING_SCALE_UB + 0.5);
-    imagFFT[n] = (int16_t)((float)ISACSavedEncObj->imagFFT[n] *
-        RCU_TRANSCODING_SCALE_UB + 0.5);
-  }
-
-  band = (bandwidth == isac12kHz) ? kIsacUpperBand12 : kIsacUpperBand16;
-  status = WebRtcIsac_EncodeSpec(realFFT, imagFFT, kAveragePitchGain, band,
-                                 bitStreamObj);
-  if (status < 0) {
-    return status;
-  } else {
-    /* Terminate entropy coding */
-    return WebRtcIsac_EncTerminate(bitStreamObj);
-  }
-}
diff --git a/modules/audio_coding/codecs/isac/main/source/encode_lpc_swb.c b/modules/audio_coding/codecs/isac/main/source/encode_lpc_swb.c
deleted file mode 100644
index 12a263d..0000000
--- a/modules/audio_coding/codecs/isac/main/source/encode_lpc_swb.c
+++ /dev/null
@@ -1,708 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/*
- * code_LPC_UB.c
- *
- * This file contains definition of functions used to
- * encode LPC parameters (Shape & gain) of the upper band.
- *
- */
-
-#include "encode_lpc_swb.h"
-
-#include <math.h>
-#include <stdio.h>
-#include <string.h>
-
-#include "lpc_gain_swb_tables.h"
-#include "lpc_shape_swb12_tables.h"
-#include "lpc_shape_swb16_tables.h"
-#include "settings.h"
-#include "webrtc/typedefs.h"
-
-/******************************************************************************
- * WebRtcIsac_RemoveLarMean()
- *
- * Remove the means from LAR coefficients.
- *
- * Input:
- *      -lar                : pointer to lar vectors. LAR vectors are
- *                            concatenated.
- *      -bandwidth          : indicates if the given LAR vectors belong
- *                            to SWB-12kHz or SWB-16kHz.
- *
- * Output:
- *      -lar                : pointer to mean-removed LAR:s.
- *
- *
- */
-int16_t
-WebRtcIsac_RemoveLarMean(
-    double* lar,
-    int16_t bandwidth)
-{
-  int16_t coeffCntr;
-  int16_t vecCntr;
-  int16_t numVec;
-  const double* meanLAR;
-  switch(bandwidth)
-  {
-    case isac12kHz:
-      {
-        numVec = UB_LPC_VEC_PER_FRAME;
-        meanLAR = WebRtcIsac_kMeanLarUb12;
-        break;
-      }
-    case isac16kHz:
-      {
-        numVec = UB16_LPC_VEC_PER_FRAME;
-        meanLAR = WebRtcIsac_kMeanLarUb16;
-        break;
-      }
-    default:
-      return -1;
-  }
-
-  for(vecCntr = 0; vecCntr < numVec; vecCntr++)
-  {
-    for(coeffCntr = 0; coeffCntr < UB_LPC_ORDER; coeffCntr++)
-    {
-      // REMOVE MEAN
-      *lar++ -= meanLAR[coeffCntr];
-    }
-  }
-  return 0;
-}
-
-/******************************************************************************
- * WebRtcIsac_DecorrelateIntraVec()
- *
- * Remove the correlation amonge the components of LAR vectors. If LAR vectors
- * of one frame are put in a matrix where each column is a LAR vector of a
- * sub-frame, then this is equivalent to multiplying the LAR matrix with
- * a decorrelting mtrix from left.
- *
- * Input:
- *      -inLar              : pointer to mean-removed LAR vecrtors.
- *      -bandwidth          : indicates if the given LAR vectors belong
- *                            to SWB-12kHz or SWB-16kHz.
- *
- * Output:
- *      -out                : decorrelated LAR vectors.
- */
-int16_t
-WebRtcIsac_DecorrelateIntraVec(
-    const double* data,
-    double*       out,
-    int16_t bandwidth)
-{
-  const double* ptrData;
-  const double* ptrRow;
-  int16_t rowCntr;
-  int16_t colCntr;
-  int16_t larVecCntr;
-  int16_t numVec;
-  const double* decorrMat;
-  switch(bandwidth)
-  {
-    case isac12kHz:
-      {
-        decorrMat = &WebRtcIsac_kIntraVecDecorrMatUb12[0][0];
-        numVec = UB_LPC_VEC_PER_FRAME;
-        break;
-      }
-    case isac16kHz:
-      {
-        decorrMat = &WebRtcIsac_kIintraVecDecorrMatUb16[0][0];
-        numVec = UB16_LPC_VEC_PER_FRAME;
-        break;
-      }
-    default:
-      return -1;
-  }
-
-  //
-  // decorrMat * data
-  //
-  // data is assumed to contain 'numVec' of LAR
-  // vectors (mean removed) each of dimension 'UB_LPC_ORDER'
-  // concatenated one after the other.
-  //
-
-  ptrData = data;
-  for(larVecCntr = 0; larVecCntr < numVec; larVecCntr++)
-  {
-    for(rowCntr = 0; rowCntr < UB_LPC_ORDER; rowCntr++)
-    {
-      ptrRow = &decorrMat[rowCntr * UB_LPC_ORDER];
-      *out = 0;
-      for(colCntr = 0; colCntr < UB_LPC_ORDER; colCntr++)
-      {
-        *out += ptrData[colCntr] * ptrRow[colCntr];
-      }
-      out++;
-    }
-    ptrData += UB_LPC_ORDER;
-  }
-  return 0;
-}
-
-/******************************************************************************
- * WebRtcIsac_DecorrelateInterVec()
- *
- * Remover the correlation among mean-removed LAR vectors. If LAR vectors
- * of one frame are put in a matrix where each column is a LAR vector of a
- * sub-frame, then this is equivalent to multiplying the LAR matrix with
- * a decorrelting mtrix from right.
- *
- * Input:
- *      -data               : pointer to matrix of LAR vectors. The matrix
- *                            is stored column-wise.
- *      -bandwidth          : indicates if the given LAR vectors belong
- *                            to SWB-12kHz or SWB-16kHz.
- *
- * Output:
- *      -out                : decorrelated LAR vectors.
- */
-int16_t
-WebRtcIsac_DecorrelateInterVec(
-    const double* data,
-    double* out,
-    int16_t bandwidth)
-{
-  int16_t coeffCntr;
-  int16_t rowCntr;
-  int16_t colCntr;
-  const double* decorrMat;
-  int16_t interVecDim;
-
-  switch(bandwidth)
-  {
-    case isac12kHz:
-      {
-        decorrMat = &WebRtcIsac_kInterVecDecorrMatUb12[0][0];
-        interVecDim = UB_LPC_VEC_PER_FRAME;
-        break;
-      }
-    case isac16kHz:
-      {
-        decorrMat = &WebRtcIsac_kInterVecDecorrMatUb16[0][0];
-        interVecDim = UB16_LPC_VEC_PER_FRAME;
-        break;
-      }
-    default:
-      return -1;
-  }
-
-  //
-  // data * decorrMat
-  //
-  // data is of size 'interVecDim' * 'UB_LPC_ORDER'
-  // That is 'interVecDim' of LAR vectors (mean removed)
-  // in columns each of dimension 'UB_LPC_ORDER'.
-  // matrix is stored column-wise.
-  //
-
-  for(coeffCntr = 0; coeffCntr < UB_LPC_ORDER; coeffCntr++)
-  {
-    for(colCntr = 0; colCntr < interVecDim; colCntr++)
-    {
-      out[coeffCntr + colCntr * UB_LPC_ORDER] = 0;
-      for(rowCntr = 0; rowCntr < interVecDim; rowCntr++)
-      {
-        out[coeffCntr + colCntr * UB_LPC_ORDER] +=
-            data[coeffCntr + rowCntr * UB_LPC_ORDER] *
-            decorrMat[rowCntr * interVecDim + colCntr];
-      }
-    }
-  }
-  return 0;
-}
-
-/******************************************************************************
- * WebRtcIsac_QuantizeUncorrLar()
- *
- * Quantize the uncorrelated parameters.
- *
- * Input:
- *      -data               : uncorrelated LAR vectors.
- *      -bandwidth          : indicates if the given LAR vectors belong
- *                            to SWB-12kHz or SWB-16kHz.
- *
- * Output:
- *      -data               : quantized version of the input.
- *      -idx                : pointer to quantization indices.
- */
-double
-WebRtcIsac_QuantizeUncorrLar(
-    double* data,
-    int* recIdx,
-    int16_t bandwidth)
-{
-  int16_t cntr;
-  int32_t idx;
-  int16_t interVecDim;
-  const double* leftRecPoint;
-  double quantizationStepSize;
-  const int16_t* numQuantCell;
-  switch(bandwidth)
-  {
-    case isac12kHz:
-      {
-        leftRecPoint         = WebRtcIsac_kLpcShapeLeftRecPointUb12;
-        quantizationStepSize = WebRtcIsac_kLpcShapeQStepSizeUb12;
-        numQuantCell         = WebRtcIsac_kLpcShapeNumRecPointUb12;
-        interVecDim          = UB_LPC_VEC_PER_FRAME;
-        break;
-      }
-    case isac16kHz:
-      {
-        leftRecPoint         = WebRtcIsac_kLpcShapeLeftRecPointUb16;
-        quantizationStepSize = WebRtcIsac_kLpcShapeQStepSizeUb16;
-        numQuantCell         = WebRtcIsac_kLpcShapeNumRecPointUb16;
-        interVecDim          = UB16_LPC_VEC_PER_FRAME;
-        break;
-      }
-    default:
-      return -1;
-  }
-
-  //
-  // Quantize the parametrs.
-  //
-  for(cntr = 0; cntr < UB_LPC_ORDER * interVecDim; cntr++)
-  {
-    idx = (int32_t)floor((*data - leftRecPoint[cntr]) /
-                               quantizationStepSize + 0.5);
-    if(idx < 0)
-    {
-      idx = 0;
-    }
-    else if(idx >= numQuantCell[cntr])
-    {
-      idx = numQuantCell[cntr] - 1;
-    }
-
-    *data++ = leftRecPoint[cntr] + idx * quantizationStepSize;
-    *recIdx++ = idx;
-  }
-  return 0;
-}
-
-
-/******************************************************************************
- * WebRtcIsac_DequantizeLpcParam()
- *
- * Get the quantized value of uncorrelated LARs given the quantization indices.
- *
- * Input:
- *      -idx                : pointer to quantiztion indices.
- *      -bandwidth          : indicates if the given LAR vectors belong
- *                            to SWB-12kHz or SWB-16kHz.
- *
- * Output:
- *      -out                : pointer to quantized values.
- */
-int16_t
-WebRtcIsac_DequantizeLpcParam(
-    const int* idx,
-    double*    out,
-    int16_t bandwidth)
-{
-  int16_t cntr;
-  int16_t interVecDim;
-  const double* leftRecPoint;
-  double quantizationStepSize;
-
-  switch(bandwidth)
-  {
-    case isac12kHz:
-      {
-        leftRecPoint =         WebRtcIsac_kLpcShapeLeftRecPointUb12;
-        quantizationStepSize = WebRtcIsac_kLpcShapeQStepSizeUb12;
-        interVecDim =          UB_LPC_VEC_PER_FRAME;
-        break;
-      }
-    case isac16kHz:
-      {
-        leftRecPoint =         WebRtcIsac_kLpcShapeLeftRecPointUb16;
-        quantizationStepSize = WebRtcIsac_kLpcShapeQStepSizeUb16;
-        interVecDim =          UB16_LPC_VEC_PER_FRAME;
-        break;
-      }
-    default:
-      return -1;
-  }
-
-  //
-  // Dequantize given the quantization indices
-  //
-
-  for(cntr = 0; cntr < UB_LPC_ORDER * interVecDim; cntr++)
-  {
-    *out++ = leftRecPoint[cntr] + *idx++ * quantizationStepSize;
-  }
-  return 0;
-}
-
-
-/******************************************************************************
- * WebRtcIsac_CorrelateIntraVec()
- *
- * This is the inverse of WebRtcIsac_DecorrelateIntraVec().
- *
- * Input:
- *      -data               : uncorrelated parameters.
- *      -bandwidth          : indicates if the given LAR vectors belong
- *                            to SWB-12kHz or SWB-16kHz.
- *
- * Output:
- *      -out                : correlated parametrs.
- */
-int16_t
-WebRtcIsac_CorrelateIntraVec(
-    const double* data,
-    double*       out,
-    int16_t bandwidth)
-{
-  int16_t vecCntr;
-  int16_t rowCntr;
-  int16_t colCntr;
-  int16_t numVec;
-  const double* ptrData;
-  const double* intraVecDecorrMat;
-
-  switch(bandwidth)
-  {
-    case isac12kHz:
-      {
-        numVec            = UB_LPC_VEC_PER_FRAME;
-        intraVecDecorrMat = &WebRtcIsac_kIntraVecDecorrMatUb12[0][0];
-        break;
-      }
-    case isac16kHz:
-      {
-        numVec            = UB16_LPC_VEC_PER_FRAME;
-        intraVecDecorrMat = &WebRtcIsac_kIintraVecDecorrMatUb16[0][0];
-        break;
-      }
-    default:
-      return -1;
-  }
-
-
-  ptrData = data;
-  for(vecCntr = 0; vecCntr < numVec; vecCntr++)
-  {
-    for(colCntr = 0; colCntr < UB_LPC_ORDER; colCntr++)
-    {
-      *out = 0;
-      for(rowCntr = 0; rowCntr < UB_LPC_ORDER; rowCntr++)
-      {
-        *out += ptrData[rowCntr] *
-            intraVecDecorrMat[rowCntr * UB_LPC_ORDER + colCntr];
-      }
-      out++;
-    }
-    ptrData += UB_LPC_ORDER;
-  }
-  return 0;
-}
-
-/******************************************************************************
- * WebRtcIsac_CorrelateInterVec()
- *
- * This is the inverse of WebRtcIsac_DecorrelateInterVec().
- *
- * Input:
- *      -data
- *      -bandwidth          : indicates if the given LAR vectors belong
- *                            to SWB-12kHz or SWB-16kHz.
- *
- * Output:
- *      -out                : correlated parametrs.
- */
-int16_t
-WebRtcIsac_CorrelateInterVec(
-    const double* data,
-    double*       out,
-    int16_t bandwidth)
-{
-  int16_t coeffCntr;
-  int16_t rowCntr;
-  int16_t colCntr;
-  int16_t interVecDim;
-  double myVec[UB16_LPC_VEC_PER_FRAME] = {0.0};
-  const double* interVecDecorrMat;
-
-  switch(bandwidth)
-  {
-    case isac12kHz:
-      {
-        interVecDim       = UB_LPC_VEC_PER_FRAME;
-        interVecDecorrMat = &WebRtcIsac_kInterVecDecorrMatUb12[0][0];
-        break;
-      }
-    case isac16kHz:
-      {
-        interVecDim       = UB16_LPC_VEC_PER_FRAME;
-        interVecDecorrMat = &WebRtcIsac_kInterVecDecorrMatUb16[0][0];
-        break;
-      }
-    default:
-      return -1;
-  }
-
-  for(coeffCntr = 0; coeffCntr < UB_LPC_ORDER; coeffCntr++)
-  {
-    for(rowCntr = 0; rowCntr < interVecDim; rowCntr++)
-    {
-      myVec[rowCntr] = 0;
-      for(colCntr = 0; colCntr < interVecDim; colCntr++)
-      {
-        myVec[rowCntr] += data[coeffCntr + colCntr * UB_LPC_ORDER] * //*ptrData *
-            interVecDecorrMat[rowCntr * interVecDim + colCntr];
-        //ptrData += UB_LPC_ORDER;
-      }
-    }
-
-    for(rowCntr = 0; rowCntr < interVecDim; rowCntr++)
-    {
-      out[coeffCntr + rowCntr * UB_LPC_ORDER] = myVec[rowCntr];
-    }
-  }
-  return 0;
-}
-
-/******************************************************************************
- * WebRtcIsac_AddLarMean()
- *
- * This is the inverse of WebRtcIsac_RemoveLarMean()
- *
- * Input:
- *      -data               : pointer to mean-removed LAR:s.
- *      -bandwidth          : indicates if the given LAR vectors belong
- *                            to SWB-12kHz or SWB-16kHz.
- *
- * Output:
- *      -data               : pointer to LARs.
- */
-int16_t
-WebRtcIsac_AddLarMean(
-    double* data,
-    int16_t bandwidth)
-{
-  int16_t coeffCntr;
-  int16_t vecCntr;
-  int16_t numVec;
-  const double* meanLAR;
-
-  switch(bandwidth)
-  {
-    case isac12kHz:
-      {
-        numVec = UB_LPC_VEC_PER_FRAME;
-        meanLAR = WebRtcIsac_kMeanLarUb12;
-        break;
-      }
-    case isac16kHz:
-      {
-        numVec = UB16_LPC_VEC_PER_FRAME;
-        meanLAR = WebRtcIsac_kMeanLarUb16;
-        break;
-      }
-    default:
-      return -1;
-  }
-
-  for(vecCntr = 0; vecCntr < numVec; vecCntr++)
-  {
-    for(coeffCntr = 0; coeffCntr < UB_LPC_ORDER; coeffCntr++)
-    {
-      *data++ += meanLAR[coeffCntr];
-    }
-  }
-  return 0;
-}
-
-/******************************************************************************
- * WebRtcIsac_ToLogDomainRemoveMean()
- *
- * Transform the LPC gain to log domain then remove the mean value.
- *
- * Input:
- *      -lpcGain            : pointer to LPC Gain, expecting 6 LPC gains
- *
- * Output:
- *      -lpcGain            : mean-removed in log domain.
- */
-int16_t
-WebRtcIsac_ToLogDomainRemoveMean(
-    double* data)
-{
-  int16_t coeffCntr;
-  for(coeffCntr = 0; coeffCntr < UB_LPC_GAIN_DIM; coeffCntr++)
-  {
-    data[coeffCntr] = log(data[coeffCntr]) - WebRtcIsac_kMeanLpcGain;
-  }
-  return 0;
-}
-
-
-/******************************************************************************
- * WebRtcIsac_DecorrelateLPGain()
- *
- * Decorrelate LPC gains. There are 6 LPC Gains per frame. This is like
- * multiplying gain vector with decorrelating matrix.
- *
- * Input:
- *      -data               : LPC gain in log-domain with mean removed.
- *
- * Output:
- *      -out                : decorrelated parameters.
- */
-int16_t WebRtcIsac_DecorrelateLPGain(
-    const double* data,
-    double* out)
-{
-  int16_t rowCntr;
-  int16_t colCntr;
-
-  for(colCntr = 0; colCntr < UB_LPC_GAIN_DIM; colCntr++)
-  {
-    *out = 0;
-    for(rowCntr = 0; rowCntr < UB_LPC_GAIN_DIM; rowCntr++)
-    {
-      *out += data[rowCntr] * WebRtcIsac_kLpcGainDecorrMat[rowCntr][colCntr];
-    }
-    out++;
-  }
-  return 0;
-}
-
-/******************************************************************************
- * WebRtcIsac_QuantizeLpcGain()
- *
- * Quantize the decorrelated log-domain gains.
- *
- * Input:
- *      -lpcGain            : uncorrelated LPC gains.
- *
- * Output:
- *      -idx                : quantization indices
- *      -lpcGain            : quantized value of the inpt.
- */
-double WebRtcIsac_QuantizeLpcGain(
-    double* data,
-    int*    idx)
-{
-  int16_t coeffCntr;
-  for(coeffCntr = 0; coeffCntr < UB_LPC_GAIN_DIM; coeffCntr++)
-  {
-    *idx = (int)floor((*data - WebRtcIsac_kLeftRecPointLpcGain[coeffCntr]) /
-                                WebRtcIsac_kQSizeLpcGain + 0.5);
-
-    if(*idx < 0)
-    {
-      *idx = 0;
-    }
-    else if(*idx >= WebRtcIsac_kNumQCellLpcGain[coeffCntr])
-    {
-      *idx = WebRtcIsac_kNumQCellLpcGain[coeffCntr] - 1;
-    }
-    *data = WebRtcIsac_kLeftRecPointLpcGain[coeffCntr] + *idx *
-        WebRtcIsac_kQSizeLpcGain;
-
-    data++;
-    idx++;
-  }
-  return 0;
-}
-
-/******************************************************************************
- * WebRtcIsac_DequantizeLpcGain()
- *
- * Get the quantized values given the quantization indices.
- *
- * Input:
- *      -idx                : pointer to quantization indices.
- *
- * Output:
- *      -lpcGains           : quantized values of the given parametes.
- */
-int16_t WebRtcIsac_DequantizeLpcGain(
-    const int* idx,
-    double*    out)
-{
-  int16_t coeffCntr;
-  for(coeffCntr = 0; coeffCntr < UB_LPC_GAIN_DIM; coeffCntr++)
-  {
-    *out = WebRtcIsac_kLeftRecPointLpcGain[coeffCntr] + *idx *
-        WebRtcIsac_kQSizeLpcGain;
-    out++;
-    idx++;
-  }
-  return 0;
-}
-
-/******************************************************************************
- * WebRtcIsac_CorrelateLpcGain()
- *
- * This is the inverse of WebRtcIsac_DecorrelateLPGain().
- *
- * Input:
- *      -data               : decorrelated parameters.
- *
- * Output:
- *      -out                : correlated parameters.
- */
-int16_t WebRtcIsac_CorrelateLpcGain(
-    const double* data,
-    double* out)
-{
-  int16_t rowCntr;
-  int16_t colCntr;
-
-  for(rowCntr = 0; rowCntr < UB_LPC_GAIN_DIM; rowCntr++)
-  {
-    *out = 0;
-    for(colCntr = 0; colCntr < UB_LPC_GAIN_DIM; colCntr++)
-    {
-      *out += WebRtcIsac_kLpcGainDecorrMat[rowCntr][colCntr] * data[colCntr];
-    }
-    out++;
-  }
-
-  return 0;
-}
-
-
-/******************************************************************************
- * WebRtcIsac_AddMeanToLinearDomain()
- *
- * This is the inverse of WebRtcIsac_ToLogDomainRemoveMean().
- *
- * Input:
- *      -lpcGain            : LPC gain in log-domain & mean removed
- *
- * Output:
- *      -lpcGain            : LPC gain in normal domain.
- */
-int16_t WebRtcIsac_AddMeanToLinearDomain(
-    double* lpcGains)
-{
-  int16_t coeffCntr;
-  for(coeffCntr = 0; coeffCntr < UB_LPC_GAIN_DIM; coeffCntr++)
-  {
-    lpcGains[coeffCntr] = exp(lpcGains[coeffCntr] + WebRtcIsac_kMeanLpcGain);
-  }
-  return 0;
-}
diff --git a/modules/audio_coding/codecs/isac/main/source/encode_lpc_swb.h b/modules/audio_coding/codecs/isac/main/source/encode_lpc_swb.h
deleted file mode 100644
index 3dd2311..0000000
--- a/modules/audio_coding/codecs/isac/main/source/encode_lpc_swb.h
+++ /dev/null
@@ -1,282 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/*
- * encode_lpc_swb.h
- *
- * This file contains declaration of functions used to
- * encode LPC parameters (Shape & gain) of the upper band.
- *
- */
-
-#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_MAIN_SOURCE_ENCODE_LPC_SWB_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_MAIN_SOURCE_ENCODE_LPC_SWB_H_
-
-#include "settings.h"
-#include "structs.h"
-#include "webrtc/typedefs.h"
-
-/******************************************************************************
- * WebRtcIsac_RemoveLarMean()
- *
- * Remove the means from LAR coefficients.
- *
- * Input:
- *      -lar                : pointer to lar vectors. LAR vectors are
- *                            concatenated.
- *      -bandwidth          : indicates if the given LAR vectors belong
- *                            to SWB-12kHz or SWB-16kHz.
- *
- * Output:
- *      -lar                : pointer to mean-removed LAR:s.
- *
- *
- */
-int16_t WebRtcIsac_RemoveLarMean(
-    double*     lar,
-    int16_t bandwidth);
-
-/******************************************************************************
- * WebRtcIsac_DecorrelateIntraVec()
- *
- * Remove the correlation amonge the components of LAR vectors. If LAR vectors
- * of one frame are put in a matrix where each column is a LAR vector of a
- * sub-frame, then this is equivalent to multiplying the LAR matrix with
- * a decorrelting mtrix from left.
- *
- * Input:
- *      -inLar              : pointer to mean-removed LAR vecrtors.
- *      -bandwidth          : indicates if the given LAR vectors belong
- *                            to SWB-12kHz or SWB-16kHz.
- *
- * Output:
- *      -out                : decorrelated LAR vectors.
- */
-int16_t WebRtcIsac_DecorrelateIntraVec(
-    const double* inLAR,
-    double*       out,
-    int16_t   bandwidth);
-
-
-/******************************************************************************
- * WebRtcIsac_DecorrelateInterVec()
- *
- * Remover the correlation among mean-removed LAR vectors. If LAR vectors
- * of one frame are put in a matrix where each column is a LAR vector of a
- * sub-frame, then this is equivalent to multiplying the LAR matrix with
- * a decorrelting mtrix from right.
- *
- * Input:
- *      -data               : pointer to matrix of LAR vectors. The matrix
- *                            is stored column-wise.
- *      -bandwidth          : indicates if the given LAR vectors belong
- *                            to SWB-12kHz or SWB-16kHz.
- *
- * Output:
- *      -out                : decorrelated LAR vectors.
- */
-int16_t WebRtcIsac_DecorrelateInterVec(
-    const double* data,
-    double*       out,
-    int16_t   bandwidth);
-
-
-/******************************************************************************
- * WebRtcIsac_QuantizeUncorrLar()
- *
- * Quantize the uncorrelated parameters.
- *
- * Input:
- *      -data               : uncorrelated LAR vectors.
- *      -bandwidth          : indicates if the given LAR vectors belong
- *                            to SWB-12kHz or SWB-16kHz.
- *
- * Output:
- *      -data               : quantized version of the input.
- *      -idx                : pointer to quantization indices.
- */
-double WebRtcIsac_QuantizeUncorrLar(
-    double*     data,
-    int*        idx,
-    int16_t bandwidth);
-
-
-/******************************************************************************
- * WebRtcIsac_CorrelateIntraVec()
- *
- * This is the inverse of WebRtcIsac_DecorrelateIntraVec().
- *
- * Input:
- *      -data               : uncorrelated parameters.
- *      -bandwidth          : indicates if the given LAR vectors belong
- *                            to SWB-12kHz or SWB-16kHz.
- *
- * Output:
- *      -out                : correlated parametrs.
- */
-int16_t WebRtcIsac_CorrelateIntraVec(
-    const double* data,
-    double*       out,
-    int16_t   bandwidth);
-
-
-/******************************************************************************
- * WebRtcIsac_CorrelateInterVec()
- *
- * This is the inverse of WebRtcIsac_DecorrelateInterVec().
- *
- * Input:
- *      -data
- *      -bandwidth          : indicates if the given LAR vectors belong
- *                            to SWB-12kHz or SWB-16kHz.
- *
- * Output:
- *      -out                : correlated parametrs.
- */
-int16_t WebRtcIsac_CorrelateInterVec(
-    const double* data,
-    double*       out,
-    int16_t   bandwidth);
-
-
-/******************************************************************************
- * WebRtcIsac_AddLarMean()
- *
- * This is the inverse of WebRtcIsac_RemoveLarMean()
- * 
- * Input:
- *      -data               : pointer to mean-removed LAR:s.
- *      -bandwidth          : indicates if the given LAR vectors belong
- *                            to SWB-12kHz or SWB-16kHz.
- *
- * Output:
- *      -data               : pointer to LARs.
- */
-int16_t WebRtcIsac_AddLarMean(
-    double*     data,
-    int16_t bandwidth);
-
-
-/******************************************************************************
- * WebRtcIsac_DequantizeLpcParam()
- *
- * Get the quantized value of uncorrelated LARs given the quantization indices.
- *
- * Input:
- *      -idx                : pointer to quantiztion indices.
- *      -bandwidth          : indicates if the given LAR vectors belong
- *                            to SWB-12kHz or SWB-16kHz.
- *
- * Output:
- *      -out                : pointer to quantized values.
- */
-int16_t WebRtcIsac_DequantizeLpcParam(
-    const int*  idx,
-    double*     out,
-    int16_t bandwidth);
-
-
-/******************************************************************************
- * WebRtcIsac_ToLogDomainRemoveMean()
- *
- * Transform the LPC gain to log domain then remove the mean value.
- *
- * Input:
- *      -lpcGain            : pointer to LPC Gain, expecting 6 LPC gains
- *
- * Output:
- *      -lpcGain            : mean-removed in log domain.
- */
-int16_t WebRtcIsac_ToLogDomainRemoveMean(
-    double* lpGains);
-
-
-/******************************************************************************
- * WebRtcIsac_DecorrelateLPGain()
- *
- * Decorrelate LPC gains. There are 6 LPC Gains per frame. This is like
- * multiplying gain vector with decorrelating matrix.
- *
- * Input:
- *      -data               : LPC gain in log-domain with mean removed.
- *
- * Output:
- *      -out                : decorrelated parameters.
- */
-int16_t WebRtcIsac_DecorrelateLPGain(
-    const double* data,
-    double*       out);
-
-
-/******************************************************************************
- * WebRtcIsac_QuantizeLpcGain()
- *
- * Quantize the decorrelated log-domain gains.
- * 
- * Input:
- *      -lpcGain            : uncorrelated LPC gains.
- *
- * Output:
- *      -idx                : quantization indices
- *      -lpcGain            : quantized value of the inpt.
- */
-double WebRtcIsac_QuantizeLpcGain(
-    double* lpGains,
-    int*    idx);
-
-
-/******************************************************************************
- * WebRtcIsac_DequantizeLpcGain()
- *
- * Get the quantized values given the quantization indices.
- *
- * Input:
- *      -idx                : pointer to quantization indices.
- *
- * Output:
- *      -lpcGains           : quantized values of the given parametes.
- */
-int16_t WebRtcIsac_DequantizeLpcGain(
-    const int* idx,
-    double*    lpGains);
-
-
-/******************************************************************************
- * WebRtcIsac_CorrelateLpcGain()
- *
- * This is the inverse of WebRtcIsac_DecorrelateLPGain().
- *
- * Input:
- *      -data               : decorrelated parameters.
- *
- * Output:
- *      -out                : correlated parameters.
- */
-int16_t WebRtcIsac_CorrelateLpcGain(
-    const double* data,
-    double*       out);
-
-
-/******************************************************************************
- * WebRtcIsac_AddMeanToLinearDomain()
- *
- * This is the inverse of WebRtcIsac_ToLogDomainRemoveMean().
- *
- * Input:
- *      -lpcGain            : LPC gain in log-domain & mean removed
- *
- * Output:
- *      -lpcGain            : LPC gain in normal domain.
- */
-int16_t WebRtcIsac_AddMeanToLinearDomain(
-    double* lpcGains);
-
-
-#endif  // WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_MAIN_SOURCE_ENCODE_LPC_SWB_H_
diff --git a/modules/audio_coding/codecs/isac/main/source/entropy_coding.c b/modules/audio_coding/codecs/isac/main/source/entropy_coding.c
deleted file mode 100644
index b494cc2..0000000
--- a/modules/audio_coding/codecs/isac/main/source/entropy_coding.c
+++ /dev/null
@@ -1,2066 +0,0 @@
-/*
- *  Copyright (c) 2012 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.
- */
-
-/*
- * entropy_coding.c
- *
- * This header file defines all of the functions used to arithmetically
- * encode the iSAC bistream
- *
- */
-
-
-#include "entropy_coding.h"
-#include "settings.h"
-#include "arith_routines.h"
-#include "signal_processing_library.h"
-#include "spectrum_ar_model_tables.h"
-#include "lpc_tables.h"
-#include "pitch_gain_tables.h"
-#include "pitch_lag_tables.h"
-#include "encode_lpc_swb.h"
-#include "lpc_shape_swb12_tables.h"
-#include "lpc_shape_swb16_tables.h"
-#include "lpc_gain_swb_tables.h"
-#include "os_specific_inline.h"
-
-#include <math.h>
-#include <string.h>
-
-static const uint16_t kLpcVecPerSegmentUb12 = 5;
-static const uint16_t kLpcVecPerSegmentUb16 = 4;
-
-/* CDF array for encoder bandwidth (12 vs 16 kHz) indicator. */
-static const uint16_t kOneBitEqualProbCdf[3] = {
-    0, 32768, 65535 };
-
-/* Pointer to cdf array for encoder bandwidth (12 vs 16 kHz) indicator. */
-static const uint16_t* const kOneBitEqualProbCdf_ptr[1] = {
-    kOneBitEqualProbCdf };
-
-/*
- * Initial cdf index for decoder of encoded bandwidth
- * (12 vs 16 kHz) indicator.
- */
-static const uint16_t kOneBitEqualProbInitIndex[1] = { 1 };
-
-
-static const int kIsSWB12 = 1;
-
-/* compute correlation from power spectrum */
-static void FindCorrelation(int32_t* PSpecQ12, int32_t* CorrQ7) {
-  int32_t summ[FRAMESAMPLES / 8];
-  int32_t diff[FRAMESAMPLES / 8];
-  const int16_t* CS_ptrQ9;
-  int32_t sum;
-  int k, n;
-
-  for (k = 0; k < FRAMESAMPLES / 8; k++) {
-    summ[k] = (PSpecQ12[k] + PSpecQ12[FRAMESAMPLES_QUARTER - 1 - k] + 16) >> 5;
-    diff[k] = (PSpecQ12[k] - PSpecQ12[FRAMESAMPLES_QUARTER - 1 - k] + 16) >> 5;
-  }
-
-  sum = 2;
-  for (n = 0; n < FRAMESAMPLES / 8; n++) {
-    sum += summ[n];
-  }
-  CorrQ7[0] = sum;
-
-  for (k = 0; k < AR_ORDER; k += 2) {
-    sum = 0;
-    CS_ptrQ9 = WebRtcIsac_kCos[k];
-    for (n = 0; n < FRAMESAMPLES / 8; n++)
-      sum += (CS_ptrQ9[n] * diff[n] + 256) >> 9;
-    CorrQ7[k + 1] = sum;
-  }
-
-  for (k = 1; k < AR_ORDER; k += 2) {
-    sum = 0;
-    CS_ptrQ9 = WebRtcIsac_kCos[k];
-    for (n = 0; n < FRAMESAMPLES / 8; n++)
-      sum += (CS_ptrQ9[n] * summ[n] + 256) >> 9;
-    CorrQ7[k + 1] = sum;
-  }
-}
-
-/* compute inverse AR power spectrum */
-/* Changed to the function used in iSAC FIX for compatibility reasons */
-static void FindInvArSpec(const int16_t* ARCoefQ12,
-                          const int32_t gainQ10,
-                          int32_t* CurveQ16) {
-  int32_t CorrQ11[AR_ORDER + 1];
-  int32_t sum, tmpGain;
-  int32_t diffQ16[FRAMESAMPLES / 8];
-  const int16_t* CS_ptrQ9;
-  int k, n;
-  int16_t round, shftVal = 0, sh;
-
-  sum = 0;
-  for (n = 0; n < AR_ORDER + 1; n++) {
-    sum += WEBRTC_SPL_MUL(ARCoefQ12[n], ARCoefQ12[n]);   /* Q24 */
-  }
-  sum = ((sum >> 6) * 65 + 32768) >> 16;  /* Q8 */
-  CorrQ11[0] = (sum * gainQ10 + 256) >> 9;
-
-  /* To avoid overflow, we shift down gainQ10 if it is large.
-   * We will not lose any precision */
-  if (gainQ10 > 400000) {
-    tmpGain = gainQ10 >> 3;
-    round = 32;
-    shftVal = 6;
-  } else {
-    tmpGain = gainQ10;
-    round = 256;
-    shftVal = 9;
-  }
-
-  for (k = 1; k < AR_ORDER + 1; k++) {
-    sum = 16384;
-    for (n = k; n < AR_ORDER + 1; n++)
-      sum += WEBRTC_SPL_MUL(ARCoefQ12[n - k], ARCoefQ12[n]); /* Q24 */
-    sum >>= 15;
-    CorrQ11[k] = (sum * tmpGain + round) >> shftVal;
-  }
-  sum = CorrQ11[0] << 7;
-  for (n = 0; n < FRAMESAMPLES / 8; n++) {
-    CurveQ16[n] = sum;
-  }
-  for (k = 1; k < AR_ORDER; k += 2) {
-    for (n = 0; n < FRAMESAMPLES / 8; n++) {
-      CurveQ16[n] += (WebRtcIsac_kCos[k][n] * CorrQ11[k + 1] + 2) >> 2;
-    }
-  }
-
-  CS_ptrQ9 = WebRtcIsac_kCos[0];
-
-  /* If CorrQ11[1] too large we avoid getting overflow in the
-   * calculation by shifting */
-  sh = WebRtcSpl_NormW32(CorrQ11[1]);
-  if (CorrQ11[1] == 0) { /* Use next correlation */
-    sh = WebRtcSpl_NormW32(CorrQ11[2]);
-  }
-  if (sh < 9) {
-    shftVal = 9 - sh;
-  } else {
-    shftVal = 0;
-  }
-  for (n = 0; n < FRAMESAMPLES / 8; n++) {
-    diffQ16[n] = (CS_ptrQ9[n] * (CorrQ11[1] >> shftVal) + 2) >> 2;
-  }
-  for (k = 2; k < AR_ORDER; k += 2) {
-    CS_ptrQ9 = WebRtcIsac_kCos[k];
-    for (n = 0; n < FRAMESAMPLES / 8; n++) {
-      diffQ16[n] += (CS_ptrQ9[n] * (CorrQ11[k + 1] >> shftVal) + 2) >> 2;
-    }
-  }
-
-  for (k = 0; k < FRAMESAMPLES / 8; k++) {
-    int32_t diff_q16_shifted = (int32_t)((uint32_t)(diffQ16[k]) << shftVal);
-    CurveQ16[FRAMESAMPLES_QUARTER - 1 - k] = CurveQ16[k] - diff_q16_shifted;
-    CurveQ16[k] += diff_q16_shifted;
-  }
-}
-
-/* Generate array of dither samples in Q7. */
-static void GenerateDitherQ7Lb(int16_t* bufQ7, uint32_t seed,
-                               int length, int16_t AvgPitchGain_Q12) {
-  int   k, shft;
-  int16_t dither1_Q7, dither2_Q7, dither_gain_Q14;
-
-  /* This threshold should be equal to that in decode_spec(). */
-  if (AvgPitchGain_Q12 < 614) {
-    for (k = 0; k < length - 2; k += 3) {
-      /* New random unsigned int. */
-      seed = (seed * 196314165) + 907633515;
-
-      /* Fixed-point dither sample between -64 and 64 (Q7). */
-      /* dither = seed * 128 / 4294967295 */
-      dither1_Q7 = (int16_t)(((int32_t)(seed + 16777216)) >> 25);
-
-      /* New random unsigned int. */
-      seed = (seed * 196314165) + 907633515;
-
-      /* Fixed-point dither sample between -64 and 64. */
-      dither2_Q7 = (int16_t)(((int32_t)(seed + 16777216)) >> 25);
-
-      shft = (seed >> 25) & 15;
-      if (shft < 5) {
-        bufQ7[k]   = dither1_Q7;
-        bufQ7[k + 1] = dither2_Q7;
-        bufQ7[k + 2] = 0;
-      } else if (shft < 10) {
-        bufQ7[k]   = dither1_Q7;
-        bufQ7[k + 1] = 0;
-        bufQ7[k + 2] = dither2_Q7;
-      } else {
-        bufQ7[k]   = 0;
-        bufQ7[k + 1] = dither1_Q7;
-        bufQ7[k + 2] = dither2_Q7;
-      }
-    }
-  } else {
-    dither_gain_Q14 = (int16_t)(22528 - 10 * AvgPitchGain_Q12);
-
-    /* Dither on half of the coefficients. */
-    for (k = 0; k < length - 1; k += 2) {
-      /* New random unsigned int */
-      seed = (seed * 196314165) + 907633515;
-
-      /* Fixed-point dither sample between -64 and 64. */
-      dither1_Q7 = (int16_t)(((int32_t)(seed + 16777216)) >> 25);
-
-      /* Dither sample is placed in either even or odd index. */
-      shft = (seed >> 25) & 1;     /* Either 0 or 1 */
-
-      bufQ7[k + shft] = (((dither_gain_Q14 * dither1_Q7) + 8192) >> 14);
-      bufQ7[k + 1 - shft] = 0;
-    }
-  }
-}
-
-
-
-/******************************************************************************
- * GenerateDitherQ7LbUB()
- *
- * generate array of dither samples in Q7 There are less zeros in dither
- * vector compared to GenerateDitherQ7Lb.
- *
- * A uniform random number generator with the range of [-64 64] is employed
- * but the generated dithers are scaled by 0.35, a heuristic scaling.
- *
- * Input:
- *      -seed               : the initial seed for the random number generator.
- *      -length             : the number of dither values to be generated.
- *
- * Output:
- *      -bufQ7              : pointer to a buffer where dithers are written to.
- */
-static void GenerateDitherQ7LbUB(
-    int16_t* bufQ7,
-    uint32_t seed,
-    int length) {
-  int k;
-  for (k = 0; k < length; k++) {
-    /* new random unsigned int */
-    seed = (seed * 196314165) + 907633515;
-
-    /* Fixed-point dither sample between -64 and 64 (Q7). */
-    /* bufQ7 = seed * 128 / 4294967295 */
-    bufQ7[k] = (int16_t)(((int32_t)(seed + 16777216)) >> 25);
-
-    /* Scale by 0.35. */
-    bufQ7[k] = (int16_t)WEBRTC_SPL_MUL_16_16_RSFT(bufQ7[k], 2048, 13);
-  }
-}
-
-/*
- * Function to decode the complex spectrum from the bit stream
- * returns the total number of bytes in the stream.
- */
-int WebRtcIsac_DecodeSpec(Bitstr* streamdata, int16_t AvgPitchGain_Q12,
-                          enum ISACBand band, double* fr, double* fi) {
-  int16_t  DitherQ7[FRAMESAMPLES];
-  int16_t  data[FRAMESAMPLES];
-  int32_t  invARSpec2_Q16[FRAMESAMPLES_QUARTER];
-  uint16_t invARSpecQ8[FRAMESAMPLES_QUARTER];
-  int16_t  ARCoefQ12[AR_ORDER + 1];
-  int16_t  RCQ15[AR_ORDER];
-  int16_t  gainQ10;
-  int32_t  gain2_Q10, res;
-  int32_t  in_sqrt;
-  int32_t  newRes;
-  int k, len, i;
-  int is_12khz = !kIsSWB12;
-  int num_dft_coeff = FRAMESAMPLES;
-  /* Create dither signal. */
-  if (band == kIsacLowerBand) {
-    GenerateDitherQ7Lb(DitherQ7, streamdata->W_upper, FRAMESAMPLES,
-                       AvgPitchGain_Q12);
-  } else {
-    GenerateDitherQ7LbUB(DitherQ7, streamdata->W_upper, FRAMESAMPLES);
-    if (band == kIsacUpperBand12) {
-      is_12khz = kIsSWB12;
-      num_dft_coeff = FRAMESAMPLES_HALF;
-    }
-  }
-
-  /* Decode model parameters. */
-  if (WebRtcIsac_DecodeRc(streamdata, RCQ15) < 0)
-    return -ISAC_RANGE_ERROR_DECODE_SPECTRUM;
-
-  WebRtcSpl_ReflCoefToLpc(RCQ15, AR_ORDER, ARCoefQ12);
-
-  if (WebRtcIsac_DecodeGain2(streamdata, &gain2_Q10) < 0)
-    return -ISAC_RANGE_ERROR_DECODE_SPECTRUM;
-
-  /* Compute inverse AR power spectrum. */
-  FindInvArSpec(ARCoefQ12, gain2_Q10, invARSpec2_Q16);
-
-  /* Convert to magnitude spectrum,
-   * by doing square-roots (modified from SPLIB). */
-  res = 1 << (WebRtcSpl_GetSizeInBits(invARSpec2_Q16[0]) >> 1);
-  for (k = 0; k < FRAMESAMPLES_QUARTER; k++) {
-    in_sqrt = invARSpec2_Q16[k];
-    i = 10;
-
-    /* Negative values make no sense for a real sqrt-function. */
-    if (in_sqrt < 0)
-      in_sqrt = -in_sqrt;
-
-    newRes = (in_sqrt / res + res) >> 1;
-    do {
-      res = newRes;
-      newRes = (in_sqrt / res + res) >> 1;
-    } while (newRes != res && i-- > 0);
-
-    invARSpecQ8[k] = (int16_t)newRes;
-  }
-
-  len = WebRtcIsac_DecLogisticMulti2(data, streamdata, invARSpecQ8, DitherQ7,
-                                     num_dft_coeff, is_12khz);
-  /* Arithmetic decoding of spectrum. */
-  if (len < 1) {
-    return -ISAC_RANGE_ERROR_DECODE_SPECTRUM;
-  }
-
-  switch (band) {
-    case kIsacLowerBand: {
-      /* Scale down spectral samples with low SNR. */
-      int32_t p1;
-      int32_t p2;
-      if (AvgPitchGain_Q12 <= 614) {
-        p1 = 30 << 10;
-        p2 = 32768 + (33 << 16);
-      } else {
-        p1 = 36 << 10;
-        p2 = 32768 + (40 << 16);
-      }
-      for (k = 0; k < FRAMESAMPLES; k += 4) {
-        gainQ10 = WebRtcSpl_DivW32W16ResW16(p1, (int16_t)(
-            (invARSpec2_Q16[k >> 2] + p2) >> 16));
-        *fr++ = (double)((data[ k ] * gainQ10 + 512) >> 10) / 128.0;
-        *fi++ = (double)((data[k + 1] * gainQ10 + 512) >> 10) / 128.0;
-        *fr++ = (double)((data[k + 2] * gainQ10 + 512) >> 10) / 128.0;
-        *fi++ = (double)((data[k + 3] * gainQ10 + 512) >> 10) / 128.0;
-      }
-      break;
-    }
-    case kIsacUpperBand12: {
-      for (k = 0, i = 0; k < FRAMESAMPLES_HALF; k += 4) {
-        fr[i] = (double)data[ k ] / 128.0;
-        fi[i] = (double)data[k + 1] / 128.0;
-        i++;
-        fr[i] = (double)data[k + 2] / 128.0;
-        fi[i] = (double)data[k + 3] / 128.0;
-        i++;
-      }
-      /* The second half of real and imaginary coefficients is zero. This is
-       * due to using the old FFT module which requires two signals as input
-       * while in 0-12 kHz mode we only have 8-12 kHz band, and the second
-       * signal is set to zero. */
-      memset(&fr[FRAMESAMPLES_QUARTER], 0, FRAMESAMPLES_QUARTER *
-             sizeof(double));
-      memset(&fi[FRAMESAMPLES_QUARTER], 0, FRAMESAMPLES_QUARTER *
-             sizeof(double));
-      break;
-    }
-    case kIsacUpperBand16: {
-      for (i = 0, k = 0; k < FRAMESAMPLES; k += 4, i++) {
-        fr[i] = (double)data[ k ] / 128.0;
-        fi[i] = (double)data[k + 1] / 128.0;
-        fr[(FRAMESAMPLES_HALF) - 1 - i] = (double)data[k + 2] / 128.0;
-        fi[(FRAMESAMPLES_HALF) - 1 - i] = (double)data[k + 3] / 128.0;
-      }
-      break;
-    }
-  }
-  return len;
-}
-
-
-int WebRtcIsac_EncodeSpec(const int16_t* fr, const int16_t* fi,
-                          int16_t AvgPitchGain_Q12, enum ISACBand band,
-                          Bitstr* streamdata) {
-  int16_t ditherQ7[FRAMESAMPLES];
-  int16_t dataQ7[FRAMESAMPLES];
-  int32_t PSpec[FRAMESAMPLES_QUARTER];
-  int32_t invARSpec2_Q16[FRAMESAMPLES_QUARTER];
-  uint16_t invARSpecQ8[FRAMESAMPLES_QUARTER];
-  int32_t CorrQ7[AR_ORDER + 1];
-  int32_t CorrQ7_norm[AR_ORDER + 1];
-  int16_t RCQ15[AR_ORDER];
-  int16_t ARCoefQ12[AR_ORDER + 1];
-  int32_t gain2_Q10;
-  int16_t val;
-  int32_t nrg, res;
-  uint32_t sum;
-  int32_t in_sqrt;
-  int32_t newRes;
-  int16_t err;
-  uint32_t nrg_u32;
-  int shift_var;
-  int k, n, j, i;
-  int is_12khz = !kIsSWB12;
-  int num_dft_coeff = FRAMESAMPLES;
-
-  /* Create dither signal. */
-  if (band == kIsacLowerBand) {
-    GenerateDitherQ7Lb(ditherQ7, streamdata->W_upper, FRAMESAMPLES,
-                       AvgPitchGain_Q12);
-  } else {
-    GenerateDitherQ7LbUB(ditherQ7, streamdata->W_upper, FRAMESAMPLES);
-    if (band == kIsacUpperBand12) {
-      is_12khz = kIsSWB12;
-      num_dft_coeff = FRAMESAMPLES_HALF;
-    }
-  }
-
-  /* add dither and quantize, and compute power spectrum */
-  switch (band) {
-    case kIsacLowerBand: {
-      for (k = 0; k < FRAMESAMPLES; k += 4) {
-        val = ((*fr++ + ditherQ7[k]   + 64) & 0xFF80) - ditherQ7[k];
-        dataQ7[k] = val;
-        sum = val * val;
-
-        val = ((*fi++ + ditherQ7[k + 1] + 64) & 0xFF80) - ditherQ7[k + 1];
-        dataQ7[k + 1] = val;
-        sum += val * val;
-
-        val = ((*fr++ + ditherQ7[k + 2] + 64) & 0xFF80) - ditherQ7[k + 2];
-        dataQ7[k + 2] = val;
-        sum += val * val;
-
-        val = ((*fi++ + ditherQ7[k + 3] + 64) & 0xFF80) - ditherQ7[k + 3];
-        dataQ7[k + 3] = val;
-        sum += val * val;
-
-        PSpec[k >> 2] = sum >> 2;
-      }
-      break;
-    }
-    case kIsacUpperBand12: {
-      for (k = 0, j = 0; k < FRAMESAMPLES_HALF; k += 4) {
-        val = ((*fr++ + ditherQ7[k]   + 64) & 0xFF80) - ditherQ7[k];
-        dataQ7[k] = val;
-        sum = val * val;
-
-        val = ((*fi++ + ditherQ7[k + 1] + 64) & 0xFF80) - ditherQ7[k + 1];
-        dataQ7[k + 1] = val;
-        sum += val * val;
-
-        PSpec[j++] = sum >> 1;
-
-        val = ((*fr++ + ditherQ7[k + 2] + 64) & 0xFF80) - ditherQ7[k + 2];
-        dataQ7[k + 2] = val;
-        sum = val * val;
-
-        val = ((*fi++ + ditherQ7[k + 3] + 64) & 0xFF80) - ditherQ7[k + 3];
-        dataQ7[k + 3] = val;
-        sum += val * val;
-
-        PSpec[j++] = sum >> 1;
-      }
-      break;
-    }
-    case kIsacUpperBand16: {
-      for (j = 0, k = 0; k < FRAMESAMPLES; k += 4, j++) {
-        val = ((fr[j] + ditherQ7[k]   + 64) & 0xFF80) - ditherQ7[k];
-        dataQ7[k] = val;
-        sum = val * val;
-
-        val = ((fi[j] + ditherQ7[k + 1] + 64) & 0xFF80) - ditherQ7[k + 1];
-        dataQ7[k + 1] = val;
-        sum += val * val;
-
-        val = ((fr[(FRAMESAMPLES_HALF) - 1 - j] + ditherQ7[k + 2] + 64) &
-            0xFF80) - ditherQ7[k + 2];
-        dataQ7[k + 2] = val;
-        sum += val * val;
-
-        val = ((fi[(FRAMESAMPLES_HALF) - 1 - j] + ditherQ7[k + 3] + 64) &
-            0xFF80) - ditherQ7[k + 3];
-        dataQ7[k + 3] = val;
-        sum += val * val;
-
-        PSpec[k >> 2] = sum >> 2;
-      }
-      break;
-    }
-  }
-
-  /* compute correlation from power spectrum */
-  FindCorrelation(PSpec, CorrQ7);
-
-  /* Find AR coefficients */
-  /* Aumber of bit shifts to 14-bit normalize CorrQ7[0]
-   * (leaving room for sign) */
-  shift_var = WebRtcSpl_NormW32(CorrQ7[0]) - 18;
-
-  if (shift_var > 0) {
-    for (k = 0; k < AR_ORDER + 1; k++) {
-      CorrQ7_norm[k] = CorrQ7[k] << shift_var;
-    }
-  } else {
-    for (k = 0; k < AR_ORDER + 1; k++) {
-      CorrQ7_norm[k] = CorrQ7[k] >> (-shift_var);
-    }
-  }
-
-  /* Find RC coefficients. */
-  WebRtcSpl_AutoCorrToReflCoef(CorrQ7_norm, AR_ORDER, RCQ15);
-
-  /* Quantize & code RC Coefficient. */
-  WebRtcIsac_EncodeRc(RCQ15, streamdata);
-
-  /* RC -> AR coefficients */
-  WebRtcSpl_ReflCoefToLpc(RCQ15, AR_ORDER, ARCoefQ12);
-
-  /* Compute ARCoef' * Corr * ARCoef in Q19. */
-  nrg = 0;
-  for (j = 0; j <= AR_ORDER; j++) {
-    for (n = 0; n <= j; n++) {
-      nrg += (ARCoefQ12[j] * ((CorrQ7_norm[j - n] * ARCoefQ12[n] + 256) >> 9) +
-          4) >> 3;
-    }
-    for (n = j + 1; n <= AR_ORDER; n++) {
-      nrg += (ARCoefQ12[j] * ((CorrQ7_norm[n - j] * ARCoefQ12[n] + 256) >> 9) +
-          4) >> 3;
-    }
-  }
-
-  nrg_u32 = (uint32_t)nrg;
-  if (shift_var > 0) {
-    nrg_u32 = nrg_u32 >> shift_var;
-  } else {
-    nrg_u32 = nrg_u32 << (-shift_var);
-  }
-  if (nrg_u32 > 0x7FFFFFFF) {
-    nrg = 0x7FFFFFFF;
-  }  else {
-    nrg = (int32_t)nrg_u32;
-  }
-  /* Also shifts 31 bits to the left! */
-  gain2_Q10 = WebRtcSpl_DivResultInQ31(FRAMESAMPLES_QUARTER, nrg);
-
-  /* Quantize & code gain2_Q10. */
-  if (WebRtcIsac_EncodeGain2(&gain2_Q10, streamdata)) {
-    return -1;
-  }
-
-  /* Compute inverse AR power spectrum. */
-  FindInvArSpec(ARCoefQ12, gain2_Q10, invARSpec2_Q16);
-  /* Convert to magnitude spectrum, by doing square-roots
-   * (modified from SPLIB). */
-  res = 1 << (WebRtcSpl_GetSizeInBits(invARSpec2_Q16[0]) >> 1);
-  for (k = 0; k < FRAMESAMPLES_QUARTER; k++) {
-    in_sqrt = invARSpec2_Q16[k];
-    i = 10;
-    /* Negative values make no sense for a real sqrt-function. */
-    if (in_sqrt < 0) {
-      in_sqrt = -in_sqrt;
-    }
-    newRes = (in_sqrt / res + res) >> 1;
-    do {
-      res = newRes;
-      newRes = (in_sqrt / res + res) >> 1;
-    } while (newRes != res && i-- > 0);
-
-    invARSpecQ8[k] = (int16_t)newRes;
-  }
-  /* arithmetic coding of spectrum */
-  err = WebRtcIsac_EncLogisticMulti2(streamdata, dataQ7, invARSpecQ8,
-                                     num_dft_coeff, is_12khz);
-  if (err < 0) {
-    return (err);
-  }
-  return 0;
-}
-
-
-/* step-up */
-void WebRtcIsac_Rc2Poly(double* RC, int N, double* a) {
-  int m, k;
-  double tmp[MAX_AR_MODEL_ORDER];
-
-  a[0] = 1.0;
-  tmp[0] = 1.0;
-  for (m = 1; m <= N; m++) {
-    /* copy */
-    memcpy(&tmp[1], &a[1], (m - 1) * sizeof(double));
-    a[m] = RC[m - 1];
-    for (k = 1; k < m; k++) {
-      a[k] += RC[m - 1] * tmp[m - k];
-    }
-  }
-  return;
-}
-
-/* step-down */
-void WebRtcIsac_Poly2Rc(double* a, int N, double* RC) {
-  int m, k;
-  double tmp[MAX_AR_MODEL_ORDER];
-  double tmp_inv;
-
-  RC[N - 1] = a[N];
-  for (m = N - 1; m > 0; m--) {
-    tmp_inv = 1.0 / (1.0 - RC[m] * RC[m]);
-    for (k = 1; k <= m; k++) {
-      tmp[k] = (a[k] - RC[m] * a[m - k + 1]) * tmp_inv;
-    }
-
-    memcpy(&a[1], &tmp[1], (m - 1) * sizeof(double));
-    RC[m - 1] = tmp[m];
-  }
-  return;
-}
-
-
-#define MAX_ORDER 100
-
-/* Matlab's LAR definition */
-void WebRtcIsac_Rc2Lar(const double* refc, double* lar, int order) {
-  int k;
-  for (k = 0; k < order; k++) {
-    lar[k] = log((1 + refc[k]) / (1 - refc[k]));
-  }
-}
-
-
-void WebRtcIsac_Lar2Rc(const double* lar, double* refc,  int order) {
-  int k;
-  double tmp;
-
-  for (k = 0; k < order; k++) {
-    tmp = exp(lar[k]);
-    refc[k] = (tmp - 1) / (tmp + 1);
-  }
-}
-
-void WebRtcIsac_Poly2Lar(double* lowband, int orderLo, double* hiband,
-                         int orderHi, int Nsub, double* lars) {
-  int k;
-  double rc[MAX_ORDER], *inpl, *inph, *outp;
-
-  inpl = lowband;
-  inph = hiband;
-  outp = lars;
-  for (k = 0; k < Nsub; k++) {
-    /* gains */
-    outp[0] = inpl[0];
-    outp[1] = inph[0];
-    outp += 2;
-
-    /* Low band */
-    inpl[0] = 1.0;
-    WebRtcIsac_Poly2Rc(inpl, orderLo, rc);
-    WebRtcIsac_Rc2Lar(rc, outp, orderLo);
-    outp += orderLo;
-
-    /* High band */
-    inph[0] = 1.0;
-    WebRtcIsac_Poly2Rc(inph, orderHi, rc);
-    WebRtcIsac_Rc2Lar(rc, outp, orderHi);
-    outp += orderHi;
-
-    inpl += orderLo + 1;
-    inph += orderHi + 1;
-  }
-}
-
-
-int16_t WebRtcIsac_Poly2LarUB(double* lpcVecs, int16_t bandwidth) {
-  double      poly[MAX_ORDER];
-  double      rc[MAX_ORDER];
-  double*     ptrIO;
-  int16_t vecCntr;
-  int16_t vecSize;
-  int16_t numVec;
-
-  vecSize = UB_LPC_ORDER;
-  switch (bandwidth) {
-    case isac12kHz: {
-      numVec  = UB_LPC_VEC_PER_FRAME;
-      break;
-    }
-    case isac16kHz: {
-      numVec  = UB16_LPC_VEC_PER_FRAME;
-      break;
-    }
-    default:
-      return -1;
-  }
-
-  ptrIO = lpcVecs;
-  poly[0] = 1.0;
-  for (vecCntr = 0; vecCntr < numVec; vecCntr++) {
-    memcpy(&poly[1], ptrIO, sizeof(double) * vecSize);
-    WebRtcIsac_Poly2Rc(poly, vecSize, rc);
-    WebRtcIsac_Rc2Lar(rc, ptrIO, vecSize);
-    ptrIO += vecSize;
-  }
-  return 0;
-}
-
-
-void WebRtcIsac_Lar2Poly(double* lars, double* lowband, int orderLo,
-                         double* hiband, int orderHi, int Nsub) {
-  int k, orderTot;
-  double rc[MAX_ORDER], *outpl, *outph, *inp;
-
-  orderTot = (orderLo + orderHi + 2);
-  outpl = lowband;
-  outph = hiband;
-  /* First two elements of 'inp' store gains*/
-  inp = lars;
-  for (k = 0; k < Nsub; k++) {
-    /* Low band */
-    WebRtcIsac_Lar2Rc(&inp[2], rc, orderLo);
-    WebRtcIsac_Rc2Poly(rc, orderLo, outpl);
-
-    /* High band */
-    WebRtcIsac_Lar2Rc(&inp[orderLo + 2], rc, orderHi);
-    WebRtcIsac_Rc2Poly(rc, orderHi, outph);
-
-    /* gains */
-    outpl[0] = inp[0];
-    outph[0] = inp[1];
-
-    outpl += orderLo + 1;
-    outph += orderHi + 1;
-    inp += orderTot;
-  }
-}
-
-/*
- *  assumes 2 LAR vectors interpolates to 'numPolyVec' A-polynomials
- *  Note: 'numPolyVecs' includes the first and the last point of the interval
- */
-void WebRtcIsac_Lar2PolyInterpolUB(double* larVecs, double* percepFilterParams,
-                                   int numPolyVecs) {
-  int polyCntr, coeffCntr;
-  double larInterpol[UB_LPC_ORDER];
-  double rc[UB_LPC_ORDER];
-  double delta[UB_LPC_ORDER];
-
-  /* calculate the step-size for linear interpolation coefficients */
-  for (coeffCntr = 0; coeffCntr < UB_LPC_ORDER; coeffCntr++) {
-    delta[coeffCntr] = (larVecs[UB_LPC_ORDER + coeffCntr] -
-        larVecs[coeffCntr]) / (numPolyVecs - 1);
-  }
-
-  for (polyCntr = 0; polyCntr < numPolyVecs; polyCntr++) {
-    for (coeffCntr = 0; coeffCntr < UB_LPC_ORDER; coeffCntr++) {
-      larInterpol[coeffCntr] = larVecs[coeffCntr] +
-          delta[coeffCntr] * polyCntr;
-    }
-    WebRtcIsac_Lar2Rc(larInterpol, rc, UB_LPC_ORDER);
-
-    /* convert to A-polynomial, the following function returns A[0] = 1;
-     * which is written where gains had to be written. Then we write the
-     * gain (outside this function). This way we say a memcpy. */
-    WebRtcIsac_Rc2Poly(rc, UB_LPC_ORDER, percepFilterParams);
-    percepFilterParams += (UB_LPC_ORDER + 1);
-  }
-}
-
-int WebRtcIsac_DecodeLpc(Bitstr* streamdata, double* LPCCoef_lo,
-                         double* LPCCoef_hi) {
-  double lars[KLT_ORDER_GAIN + KLT_ORDER_SHAPE];
-  int err;
-
-  err = WebRtcIsac_DecodeLpcCoef(streamdata, lars);
-  if (err < 0) {
-    return -ISAC_RANGE_ERROR_DECODE_LPC;
-  }
-  WebRtcIsac_Lar2Poly(lars, LPCCoef_lo, ORDERLO, LPCCoef_hi, ORDERHI,
-                      SUBFRAMES);
-  return 0;
-}
-
-int16_t WebRtcIsac_DecodeInterpolLpcUb(Bitstr* streamdata,
-                                       double* percepFilterParams,
-                                       int16_t bandwidth) {
-  double lpcCoeff[UB_LPC_ORDER * UB16_LPC_VEC_PER_FRAME];
-  int err;
-  int interpolCntr;
-  int subframeCntr;
-  int16_t numSegments;
-  int16_t numVecPerSegment;
-  int16_t numGains;
-
-  double percepFilterGains[SUBFRAMES << 1];
-  double* ptrOutParam = percepFilterParams;
-
-  err = WebRtcIsac_DecodeLpcCoefUB(streamdata, lpcCoeff, percepFilterGains,
-                                   bandwidth);
-  if (err < 0) {
-    return -ISAC_RANGE_ERROR_DECODE_LPC;
-  }
-
-  switch (bandwidth) {
-    case isac12kHz: {
-      numGains = SUBFRAMES;
-      numSegments = UB_LPC_VEC_PER_FRAME - 1;
-      numVecPerSegment = kLpcVecPerSegmentUb12;
-      break;
-    }
-    case isac16kHz: {
-      numGains = SUBFRAMES << 1;
-      numSegments = UB16_LPC_VEC_PER_FRAME - 1;
-      numVecPerSegment = kLpcVecPerSegmentUb16;
-      break;
-    }
-    default:
-      return -1;
-  }
-
-  for (interpolCntr = 0; interpolCntr < numSegments; interpolCntr++) {
-    WebRtcIsac_Lar2PolyInterpolUB(&lpcCoeff[interpolCntr * UB_LPC_ORDER],
-                                  ptrOutParam, numVecPerSegment + 1);
-    ptrOutParam += (numVecPerSegment * (UB_LPC_ORDER + 1));
-  }
-
-  ptrOutParam = percepFilterParams;
-
-  if (bandwidth == isac16kHz) {
-    ptrOutParam += (1 + UB_LPC_ORDER);
-  }
-
-  for (subframeCntr = 0; subframeCntr < numGains; subframeCntr++) {
-    *ptrOutParam = percepFilterGains[subframeCntr];
-    ptrOutParam += (1 + UB_LPC_ORDER);
-  }
-  return 0;
-}
-
-
-/* decode & dequantize LPC Coef */
-int WebRtcIsac_DecodeLpcCoef(Bitstr* streamdata, double* LPCCoef) {
-  int j, k, n, pos, pos2, posg, poss, offsg, offss, offs2;
-  int index_g[KLT_ORDER_GAIN], index_s[KLT_ORDER_SHAPE];
-  double tmpcoeffs_g[KLT_ORDER_GAIN], tmpcoeffs_s[KLT_ORDER_SHAPE];
-  double tmpcoeffs2_g[KLT_ORDER_GAIN], tmpcoeffs2_s[KLT_ORDER_SHAPE];
-  double sum;
-  int err;
-  int model = 1;
-
-  /* entropy decoding of model number */
-  /* We are keeping this for backward compatibility of bit-streams. */
-  err = WebRtcIsac_DecHistOneStepMulti(&model, streamdata,
-                                       WebRtcIsac_kQKltModelCdfPtr,
-                                       WebRtcIsac_kQKltModelInitIndex, 1);
-  if (err < 0) {
-    return err;
-  }
-  /* Only accepted value of model is 0. It is kept in bit-stream for backward
-   * compatibility. */
-  if (model != 0) {
-    return -ISAC_DISALLOWED_LPC_MODEL;
-  }
-
-  /* entropy decoding of quantization indices */
-  err = WebRtcIsac_DecHistOneStepMulti(
-      index_s, streamdata, WebRtcIsac_kQKltCdfPtrShape,
-      WebRtcIsac_kQKltInitIndexShape, KLT_ORDER_SHAPE);
-  if (err < 0) {
-    return err;
-  }
-  err = WebRtcIsac_DecHistOneStepMulti(
-      index_g, streamdata, WebRtcIsac_kQKltCdfPtrGain,
-      WebRtcIsac_kQKltInitIndexGain, KLT_ORDER_GAIN);
-  if (err < 0) {
-    return err;
-  }
-
-  /* find quantization levels for coefficients */
-  for (k = 0; k < KLT_ORDER_SHAPE; k++) {
-    tmpcoeffs_s[k] =
-        WebRtcIsac_kQKltLevelsShape[WebRtcIsac_kQKltOffsetShape[k] +
-                                    index_s[k]];
-  }
-  for (k = 0; k < KLT_ORDER_GAIN; k++) {
-    tmpcoeffs_g[k] = WebRtcIsac_kQKltLevelsGain[WebRtcIsac_kQKltOffsetGain[k] +
-                                                index_g[k]];
-  }
-
-  /* Inverse KLT  */
-
-  /* Left transform, transpose matrix!  */
-  offsg = 0;
-  offss = 0;
-  posg = 0;
-  poss = 0;
-  for (j = 0; j < SUBFRAMES; j++) {
-    offs2 = 0;
-    for (k = 0; k < LPC_GAIN_ORDER; k++) {
-      sum = 0;
-      pos = offsg;
-      pos2 = offs2;
-      for (n = 0; n < LPC_GAIN_ORDER; n++) {
-        sum += tmpcoeffs_g[pos++] * WebRtcIsac_kKltT1Gain[pos2++];
-      }
-      tmpcoeffs2_g[posg++] = sum;
-      offs2 += LPC_GAIN_ORDER;
-    }
-    offs2 = 0;
-    for (k = 0; k < LPC_SHAPE_ORDER; k++) {
-      sum = 0;
-      pos = offss;
-      pos2 = offs2;
-      for (n = 0; n < LPC_SHAPE_ORDER; n++) {
-        sum += tmpcoeffs_s[pos++] * WebRtcIsac_kKltT1Shape[pos2++];
-      }
-      tmpcoeffs2_s[poss++] = sum;
-      offs2 += LPC_SHAPE_ORDER;
-    }
-    offsg += LPC_GAIN_ORDER;
-    offss += LPC_SHAPE_ORDER;
-  }
-
-  /* Right transform, transpose matrix */
-  offsg = 0;
-  offss = 0;
-  posg = 0;
-  poss = 0;
-  for (j = 0; j < SUBFRAMES; j++) {
-    posg = offsg;
-    for (k = 0; k < LPC_GAIN_ORDER; k++) {
-      sum = 0;
-      pos = k;
-      pos2 = j;
-      for (n = 0; n < SUBFRAMES; n++) {
-        sum += tmpcoeffs2_g[pos] * WebRtcIsac_kKltT2Gain[pos2];
-        pos += LPC_GAIN_ORDER;
-        pos2 += SUBFRAMES;
-
-      }
-      tmpcoeffs_g[posg++] = sum;
-    }
-    poss = offss;
-    for (k = 0; k < LPC_SHAPE_ORDER; k++) {
-      sum = 0;
-      pos = k;
-      pos2 = j;
-      for (n = 0; n < SUBFRAMES; n++) {
-        sum += tmpcoeffs2_s[pos] * WebRtcIsac_kKltT2Shape[pos2];
-        pos += LPC_SHAPE_ORDER;
-        pos2 += SUBFRAMES;
-      }
-      tmpcoeffs_s[poss++] = sum;
-    }
-    offsg += LPC_GAIN_ORDER;
-    offss += LPC_SHAPE_ORDER;
-  }
-
-  /* scaling, mean addition, and gain restoration */
-  posg = 0;
-  poss = 0;
-  pos = 0;
-  for (k = 0; k < SUBFRAMES; k++) {
-    /* log gains */
-    LPCCoef[pos] = tmpcoeffs_g[posg] / LPC_GAIN_SCALE;
-    LPCCoef[pos] += WebRtcIsac_kLpcMeansGain[posg];
-    LPCCoef[pos] = exp(LPCCoef[pos]);
-    pos++;
-    posg++;
-    LPCCoef[pos] = tmpcoeffs_g[posg] / LPC_GAIN_SCALE;
-    LPCCoef[pos] += WebRtcIsac_kLpcMeansGain[posg];
-    LPCCoef[pos] = exp(LPCCoef[pos]);
-    pos++;
-    posg++;
-
-    /* Low-band LAR coefficients. */
-    for (n = 0; n < LPC_LOBAND_ORDER; n++, pos++, poss++) {
-      LPCCoef[pos] = tmpcoeffs_s[poss] / LPC_LOBAND_SCALE;
-      LPCCoef[pos] += WebRtcIsac_kLpcMeansShape[poss];
-    }
-
-    /* High-band LAR coefficients. */
-    for (n = 0; n < LPC_HIBAND_ORDER; n++, pos++, poss++) {
-      LPCCoef[pos] = tmpcoeffs_s[poss] / LPC_HIBAND_SCALE;
-      LPCCoef[pos] += WebRtcIsac_kLpcMeansShape[poss];
-    }
-  }
-  return 0;
-}
-
-/* Encode LPC in LAR domain. */
-void WebRtcIsac_EncodeLar(double* LPCCoef, Bitstr* streamdata,
-                          IsacSaveEncoderData* encData) {
-  int j, k, n, pos, pos2, poss, offss, offs2;
-  int index_s[KLT_ORDER_SHAPE];
-  int index_ovr_s[KLT_ORDER_SHAPE];
-  double tmpcoeffs_s[KLT_ORDER_SHAPE];
-  double tmpcoeffs2_s[KLT_ORDER_SHAPE];
-  double sum;
-  const int kModel = 0;
-
-  /* Mean removal and scaling. */
-  poss = 0;
-  pos = 0;
-  for (k = 0; k < SUBFRAMES; k++) {
-    /* First two element are gains, move over them. */
-    pos += 2;
-
-    /* Low-band LAR coefficients. */
-    for (n = 0; n < LPC_LOBAND_ORDER; n++, poss++, pos++) {
-      tmpcoeffs_s[poss] = LPCCoef[pos] - WebRtcIsac_kLpcMeansShape[poss];
-      tmpcoeffs_s[poss] *= LPC_LOBAND_SCALE;
-    }
-
-    /* High-band LAR coefficients. */
-    for (n = 0; n < LPC_HIBAND_ORDER; n++, poss++, pos++) {
-      tmpcoeffs_s[poss] = LPCCoef[pos] - WebRtcIsac_kLpcMeansShape[poss];
-      tmpcoeffs_s[poss] *= LPC_HIBAND_SCALE;
-    }
-  }
-
-  /* KLT  */
-
-  /* Left transform. */
-  offss = 0;
-  for (j = 0; j < SUBFRAMES; j++) {
-    poss = offss;
-    for (k = 0; k < LPC_SHAPE_ORDER; k++) {
-      sum = 0;
-      pos = offss;
-      pos2 = k;
-      for (n = 0; n < LPC_SHAPE_ORDER; n++) {
-        sum += tmpcoeffs_s[pos++] * WebRtcIsac_kKltT1Shape[pos2];
-        pos2 += LPC_SHAPE_ORDER;
-      }
-      tmpcoeffs2_s[poss++] = sum;
-    }
-    offss += LPC_SHAPE_ORDER;
-  }
-
-  /* Right transform. */
-  offss = 0;
-  offs2 = 0;
-  for (j = 0; j < SUBFRAMES; j++) {
-    poss = offss;
-    for (k = 0; k < LPC_SHAPE_ORDER; k++) {
-      sum = 0;
-      pos = k;
-      pos2 = offs2;
-      for (n = 0; n < SUBFRAMES; n++) {
-        sum += tmpcoeffs2_s[pos] * WebRtcIsac_kKltT2Shape[pos2++];
-        pos += LPC_SHAPE_ORDER;
-      }
-      tmpcoeffs_s[poss++] = sum;
-    }
-    offs2 += SUBFRAMES;
-    offss += LPC_SHAPE_ORDER;
-  }
-
-  /* Quantize coefficients. */
-  for (k = 0; k < KLT_ORDER_SHAPE; k++) {
-    index_s[k] = (WebRtcIsac_lrint(tmpcoeffs_s[k] / KLT_STEPSIZE)) +
-        WebRtcIsac_kQKltQuantMinShape[k];
-    if (index_s[k] < 0) {
-      index_s[k] = 0;
-    } else if (index_s[k] > WebRtcIsac_kQKltMaxIndShape[k]) {
-      index_s[k] = WebRtcIsac_kQKltMaxIndShape[k];
-    }
-    index_ovr_s[k] = WebRtcIsac_kQKltOffsetShape[k] + index_s[k];
-  }
-
-
-  /* Only one model remains in this version of the code, kModel = 0. We
-   * are keeping for bit-streams to be backward compatible. */
-  /* entropy coding of model number */
-  WebRtcIsac_EncHistMulti(streamdata, &kModel, WebRtcIsac_kQKltModelCdfPtr, 1);
-
-  /* Save data for creation of multiple bit streams */
-  /* Entropy coding of quantization indices - shape only. */
-  WebRtcIsac_EncHistMulti(streamdata, index_s, WebRtcIsac_kQKltCdfPtrShape,
-                          KLT_ORDER_SHAPE);
-
-  /* Save data for creation of multiple bit streams. */
-  for (k = 0; k < KLT_ORDER_SHAPE; k++) {
-    encData->LPCindex_s[KLT_ORDER_SHAPE * encData->startIdx + k] = index_s[k];
-  }
-
-  /* Find quantization levels for shape coefficients. */
-  for (k = 0; k < KLT_ORDER_SHAPE; k++) {
-    tmpcoeffs_s[k] = WebRtcIsac_kQKltLevelsShape[index_ovr_s[k]];
-  }
-  /* Inverse KLT.  */
-  /* Left transform, transpose matrix.! */
-  offss = 0;
-  poss = 0;
-  for (j = 0; j < SUBFRAMES; j++) {
-    offs2 = 0;
-    for (k = 0; k < LPC_SHAPE_ORDER; k++) {
-      sum = 0;
-      pos = offss;
-      pos2 = offs2;
-      for (n = 0; n < LPC_SHAPE_ORDER; n++) {
-        sum += tmpcoeffs_s[pos++] * WebRtcIsac_kKltT1Shape[pos2++];
-      }
-      tmpcoeffs2_s[poss++] = sum;
-      offs2 += LPC_SHAPE_ORDER;
-    }
-    offss += LPC_SHAPE_ORDER;
-  }
-
-  /* Right transform, Transpose matrix */
-  offss = 0;
-  poss = 0;
-  for (j = 0; j < SUBFRAMES; j++) {
-    poss = offss;
-    for (k = 0; k < LPC_SHAPE_ORDER; k++) {
-      sum = 0;
-      pos = k;
-      pos2 = j;
-      for (n = 0; n < SUBFRAMES; n++) {
-        sum += tmpcoeffs2_s[pos] * WebRtcIsac_kKltT2Shape[pos2];
-        pos += LPC_SHAPE_ORDER;
-        pos2 += SUBFRAMES;
-      }
-      tmpcoeffs_s[poss++] = sum;
-    }
-    offss += LPC_SHAPE_ORDER;
-  }
-
-  /* Scaling, mean addition, and gain restoration. */
-  poss = 0;
-  pos = 0;
-  for (k = 0; k < SUBFRAMES; k++) {
-    /* Ignore gains. */
-    pos += 2;
-
-    /* Low band LAR coefficients. */
-    for (n = 0; n < LPC_LOBAND_ORDER; n++, pos++, poss++) {
-      LPCCoef[pos] = tmpcoeffs_s[poss] / LPC_LOBAND_SCALE;
-      LPCCoef[pos] += WebRtcIsac_kLpcMeansShape[poss];
-    }
-
-    /* High band LAR coefficients. */
-    for (n = 0; n < LPC_HIBAND_ORDER; n++, pos++, poss++) {
-      LPCCoef[pos] = tmpcoeffs_s[poss] / LPC_HIBAND_SCALE;
-      LPCCoef[pos] += WebRtcIsac_kLpcMeansShape[poss];
-    }
-  }
-}
-
-
-void WebRtcIsac_EncodeLpcLb(double* LPCCoef_lo, double* LPCCoef_hi,
-                            Bitstr* streamdata, IsacSaveEncoderData* encData) {
-  double lars[KLT_ORDER_GAIN + KLT_ORDER_SHAPE];
-  int k;
-
-  WebRtcIsac_Poly2Lar(LPCCoef_lo, ORDERLO, LPCCoef_hi, ORDERHI, SUBFRAMES,
-                      lars);
-  WebRtcIsac_EncodeLar(lars, streamdata, encData);
-  WebRtcIsac_Lar2Poly(lars, LPCCoef_lo, ORDERLO, LPCCoef_hi, ORDERHI,
-                      SUBFRAMES);
-  /* Save data for creation of multiple bit streams (and transcoding). */
-  for (k = 0; k < (ORDERLO + 1)*SUBFRAMES; k++) {
-    encData->LPCcoeffs_lo[(ORDERLO + 1)*SUBFRAMES * encData->startIdx + k] =
-        LPCCoef_lo[k];
-  }
-  for (k = 0; k < (ORDERHI + 1)*SUBFRAMES; k++) {
-    encData->LPCcoeffs_hi[(ORDERHI + 1)*SUBFRAMES * encData->startIdx + k] =
-        LPCCoef_hi[k];
-  }
-}
-
-
-int16_t WebRtcIsac_EncodeLpcUB(double* lpcVecs, Bitstr* streamdata,
-                               double* interpolLPCCoeff,
-                               int16_t bandwidth,
-                                     ISACUBSaveEncDataStruct* encData) {
-  double    U[UB_LPC_ORDER * UB16_LPC_VEC_PER_FRAME];
-  int     idx[UB_LPC_ORDER * UB16_LPC_VEC_PER_FRAME];
-  int interpolCntr;
-
-  WebRtcIsac_Poly2LarUB(lpcVecs, bandwidth);
-  WebRtcIsac_RemoveLarMean(lpcVecs, bandwidth);
-  WebRtcIsac_DecorrelateIntraVec(lpcVecs, U, bandwidth);
-  WebRtcIsac_DecorrelateInterVec(U, lpcVecs, bandwidth);
-  WebRtcIsac_QuantizeUncorrLar(lpcVecs, idx, bandwidth);
-
-  WebRtcIsac_CorrelateInterVec(lpcVecs, U, bandwidth);
-  WebRtcIsac_CorrelateIntraVec(U, lpcVecs, bandwidth);
-  WebRtcIsac_AddLarMean(lpcVecs, bandwidth);
-
-  switch (bandwidth) {
-    case isac12kHz: {
-      /* Store the indices to be used for multiple encoding. */
-      memcpy(encData->indexLPCShape, idx, UB_LPC_ORDER *
-             UB_LPC_VEC_PER_FRAME * sizeof(int));
-      WebRtcIsac_EncHistMulti(streamdata, idx, WebRtcIsac_kLpcShapeCdfMatUb12,
-                              UB_LPC_ORDER * UB_LPC_VEC_PER_FRAME);
-      for (interpolCntr = 0; interpolCntr < UB_INTERPOL_SEGMENTS;
-          interpolCntr++) {
-        WebRtcIsac_Lar2PolyInterpolUB(lpcVecs, interpolLPCCoeff,
-                                      kLpcVecPerSegmentUb12 + 1);
-        lpcVecs += UB_LPC_ORDER;
-        interpolLPCCoeff += (kLpcVecPerSegmentUb12 * (UB_LPC_ORDER + 1));
-      }
-      break;
-    }
-    case isac16kHz: {
-      /* Store the indices to be used for multiple encoding. */
-      memcpy(encData->indexLPCShape, idx, UB_LPC_ORDER *
-             UB16_LPC_VEC_PER_FRAME * sizeof(int));
-      WebRtcIsac_EncHistMulti(streamdata, idx, WebRtcIsac_kLpcShapeCdfMatUb16,
-                              UB_LPC_ORDER * UB16_LPC_VEC_PER_FRAME);
-      for (interpolCntr = 0; interpolCntr < UB16_INTERPOL_SEGMENTS;
-          interpolCntr++) {
-        WebRtcIsac_Lar2PolyInterpolUB(lpcVecs, interpolLPCCoeff,
-                                      kLpcVecPerSegmentUb16 + 1);
-        lpcVecs += UB_LPC_ORDER;
-        interpolLPCCoeff += (kLpcVecPerSegmentUb16 * (UB_LPC_ORDER + 1));
-      }
-      break;
-    }
-    default:
-      return -1;
-  }
-  return 0;
-}
-
-void WebRtcIsac_EncodeLpcGainLb(double* LPCCoef_lo, double* LPCCoef_hi,
-                                Bitstr* streamdata,
-                                IsacSaveEncoderData* encData) {
-  int j, k, n, pos, pos2, posg, offsg, offs2;
-  int index_g[KLT_ORDER_GAIN];
-  int index_ovr_g[KLT_ORDER_GAIN];
-  double tmpcoeffs_g[KLT_ORDER_GAIN];
-  double tmpcoeffs2_g[KLT_ORDER_GAIN];
-  double sum;
-  /* log gains, mean removal and scaling */
-  posg = 0;
-  for (k = 0; k < SUBFRAMES; k++) {
-    tmpcoeffs_g[posg] = log(LPCCoef_lo[(LPC_LOBAND_ORDER + 1) * k]);
-    tmpcoeffs_g[posg] -= WebRtcIsac_kLpcMeansGain[posg];
-    tmpcoeffs_g[posg] *= LPC_GAIN_SCALE;
-    posg++;
-    tmpcoeffs_g[posg] = log(LPCCoef_hi[(LPC_HIBAND_ORDER + 1) * k]);
-    tmpcoeffs_g[posg] -= WebRtcIsac_kLpcMeansGain[posg];
-    tmpcoeffs_g[posg] *= LPC_GAIN_SCALE;
-    posg++;
-  }
-
-  /* KLT  */
-
-  /* Left transform. */
-  offsg = 0;
-  for (j = 0; j < SUBFRAMES; j++) {
-    posg = offsg;
-    for (k = 0; k < LPC_GAIN_ORDER; k++) {
-      sum = 0;
-      pos = offsg;
-      pos2 = k;
-      for (n = 0; n < LPC_GAIN_ORDER; n++) {
-        sum += tmpcoeffs_g[pos++] * WebRtcIsac_kKltT1Gain[pos2];
-        pos2 += LPC_GAIN_ORDER;
-      }
-      tmpcoeffs2_g[posg++] = sum;
-    }
-    offsg += LPC_GAIN_ORDER;
-  }
-
-  /* Right transform. */
-  offsg = 0;
-  offs2 = 0;
-  for (j = 0; j < SUBFRAMES; j++) {
-    posg = offsg;
-    for (k = 0; k < LPC_GAIN_ORDER; k++) {
-      sum = 0;
-      pos = k;
-      pos2 = offs2;
-      for (n = 0; n < SUBFRAMES; n++) {
-        sum += tmpcoeffs2_g[pos] * WebRtcIsac_kKltT2Gain[pos2++];
-        pos += LPC_GAIN_ORDER;
-      }
-      tmpcoeffs_g[posg++] = sum;
-    }
-    offs2 += SUBFRAMES;
-    offsg += LPC_GAIN_ORDER;
-  }
-
-  /* Quantize coefficients. */
-  for (k = 0; k < KLT_ORDER_GAIN; k++) {
-    /* Get index. */
-    pos2 = WebRtcIsac_lrint(tmpcoeffs_g[k] / KLT_STEPSIZE);
-    index_g[k] = (pos2) + WebRtcIsac_kQKltQuantMinGain[k];
-    if (index_g[k] < 0) {
-      index_g[k] = 0;
-    } else if (index_g[k] > WebRtcIsac_kQKltMaxIndGain[k]) {
-      index_g[k] = WebRtcIsac_kQKltMaxIndGain[k];
-    }
-    index_ovr_g[k] = WebRtcIsac_kQKltOffsetGain[k] + index_g[k];
-
-    /* Find quantization levels for coefficients. */
-    tmpcoeffs_g[k] = WebRtcIsac_kQKltLevelsGain[index_ovr_g[k]];
-
-    /* Save data for creation of multiple bit streams. */
-    encData->LPCindex_g[KLT_ORDER_GAIN * encData->startIdx + k] = index_g[k];
-  }
-
-  /* Entropy coding of quantization indices - gain. */
-  WebRtcIsac_EncHistMulti(streamdata, index_g, WebRtcIsac_kQKltCdfPtrGain,
-                          KLT_ORDER_GAIN);
-
-  /* Find quantization levels for coefficients. */
-  /* Left transform. */
-  offsg = 0;
-  posg = 0;
-  for (j = 0; j < SUBFRAMES; j++) {
-    offs2 = 0;
-    for (k = 0; k < LPC_GAIN_ORDER; k++) {
-      sum = 0;
-      pos = offsg;
-      pos2 = offs2;
-      for (n = 0; n < LPC_GAIN_ORDER; n++)
-        sum += tmpcoeffs_g[pos++] * WebRtcIsac_kKltT1Gain[pos2++];
-      tmpcoeffs2_g[posg++] = sum;
-      offs2 += LPC_GAIN_ORDER;
-    }
-    offsg += LPC_GAIN_ORDER;
-  }
-
-  /* Right transform, transpose matrix. */
-  offsg = 0;
-  posg = 0;
-  for (j = 0; j < SUBFRAMES; j++) {
-    posg = offsg;
-    for (k = 0; k < LPC_GAIN_ORDER; k++) {
-      sum = 0;
-      pos = k;
-      pos2 = j;
-      for (n = 0; n < SUBFRAMES; n++) {
-        sum += tmpcoeffs2_g[pos] * WebRtcIsac_kKltT2Gain[pos2];
-        pos += LPC_GAIN_ORDER;
-        pos2 += SUBFRAMES;
-      }
-      tmpcoeffs_g[posg++] = sum;
-    }
-    offsg += LPC_GAIN_ORDER;
-  }
-
-
-  /* Scaling, mean addition, and gain restoration. */
-  posg = 0;
-  for (k = 0; k < SUBFRAMES; k++) {
-    sum = tmpcoeffs_g[posg] / LPC_GAIN_SCALE;
-    sum += WebRtcIsac_kLpcMeansGain[posg];
-    LPCCoef_lo[k * (LPC_LOBAND_ORDER + 1)] = exp(sum);
-    pos++;
-    posg++;
-    sum = tmpcoeffs_g[posg] / LPC_GAIN_SCALE;
-    sum += WebRtcIsac_kLpcMeansGain[posg];
-    LPCCoef_hi[k * (LPC_HIBAND_ORDER + 1)] = exp(sum);
-    pos++;
-    posg++;
-  }
-
-}
-
-void WebRtcIsac_EncodeLpcGainUb(double* lpGains, Bitstr* streamdata,
-                                int* lpcGainIndex) {
-  double U[UB_LPC_GAIN_DIM];
-  int idx[UB_LPC_GAIN_DIM];
-  WebRtcIsac_ToLogDomainRemoveMean(lpGains);
-  WebRtcIsac_DecorrelateLPGain(lpGains, U);
-  WebRtcIsac_QuantizeLpcGain(U, idx);
-  /* Store the index for re-encoding for FEC. */
-  memcpy(lpcGainIndex, idx, UB_LPC_GAIN_DIM * sizeof(int));
-  WebRtcIsac_CorrelateLpcGain(U, lpGains);
-  WebRtcIsac_AddMeanToLinearDomain(lpGains);
-  WebRtcIsac_EncHistMulti(streamdata, idx, WebRtcIsac_kLpcGainCdfMat,
-                          UB_LPC_GAIN_DIM);
-}
-
-
-void WebRtcIsac_StoreLpcGainUb(double* lpGains, Bitstr* streamdata) {
-  double U[UB_LPC_GAIN_DIM];
-  int idx[UB_LPC_GAIN_DIM];
-  WebRtcIsac_ToLogDomainRemoveMean(lpGains);
-  WebRtcIsac_DecorrelateLPGain(lpGains, U);
-  WebRtcIsac_QuantizeLpcGain(U, idx);
-  WebRtcIsac_EncHistMulti(streamdata, idx, WebRtcIsac_kLpcGainCdfMat,
-                          UB_LPC_GAIN_DIM);
-}
-
-
-
-int16_t WebRtcIsac_DecodeLpcGainUb(double* lpGains, Bitstr* streamdata) {
-  double U[UB_LPC_GAIN_DIM];
-  int idx[UB_LPC_GAIN_DIM];
-  int err;
-  err = WebRtcIsac_DecHistOneStepMulti(idx, streamdata,
-                                       WebRtcIsac_kLpcGainCdfMat,
-                                       WebRtcIsac_kLpcGainEntropySearch,
-                                       UB_LPC_GAIN_DIM);
-  if (err < 0) {
-    return -1;
-  }
-  WebRtcIsac_DequantizeLpcGain(idx, U);
-  WebRtcIsac_CorrelateLpcGain(U, lpGains);
-  WebRtcIsac_AddMeanToLinearDomain(lpGains);
-  return 0;
-}
-
-
-
-/* decode & dequantize RC */
-int WebRtcIsac_DecodeRc(Bitstr* streamdata, int16_t* RCQ15) {
-  int k, err;
-  int index[AR_ORDER];
-
-  /* entropy decoding of quantization indices */
-  err = WebRtcIsac_DecHistOneStepMulti(index, streamdata,
-                                       WebRtcIsac_kQArRcCdfPtr,
-                                       WebRtcIsac_kQArRcInitIndex, AR_ORDER);
-  if (err < 0)
-    return err;
-
-  /* find quantization levels for reflection coefficients */
-  for (k = 0; k < AR_ORDER; k++) {
-    RCQ15[k] = *(WebRtcIsac_kQArRcLevelsPtr[k] + index[k]);
-  }
-  return 0;
-}
-
-
-/* quantize & code RC */
-void WebRtcIsac_EncodeRc(int16_t* RCQ15, Bitstr* streamdata) {
-  int k;
-  int index[AR_ORDER];
-
-  /* quantize reflection coefficients (add noise feedback?) */
-  for (k = 0; k < AR_ORDER; k++) {
-    index[k] = WebRtcIsac_kQArRcInitIndex[k];
-    // The safe-guards in following while conditions are to suppress gcc 4.8.3
-    // warnings, Issue 2888. Otherwise, first and last elements of
-    // |WebRtcIsac_kQArBoundaryLevels| are such that the following search
-    // *never* cause an out-of-boundary read.
-    if (RCQ15[k] > WebRtcIsac_kQArBoundaryLevels[index[k]]) {
-      while (index[k] + 1 < NUM_AR_RC_QUANT_BAUNDARY &&
-        RCQ15[k] > WebRtcIsac_kQArBoundaryLevels[index[k] + 1]) {
-        index[k]++;
-      }
-    } else {
-      while (index[k] > 0 &&
-        RCQ15[k] < WebRtcIsac_kQArBoundaryLevels[--index[k]]) ;
-    }
-    RCQ15[k] = *(WebRtcIsac_kQArRcLevelsPtr[k] + index[k]);
-  }
-
-  /* entropy coding of quantization indices */
-  WebRtcIsac_EncHistMulti(streamdata, index, WebRtcIsac_kQArRcCdfPtr, AR_ORDER);
-}
-
-
-/* decode & dequantize squared Gain */
-int WebRtcIsac_DecodeGain2(Bitstr* streamdata, int32_t* gainQ10) {
-  int index, err;
-
-  /* entropy decoding of quantization index */
-  err = WebRtcIsac_DecHistOneStepMulti(&index, streamdata,
-                                       WebRtcIsac_kQGainCdf_ptr,
-                                       WebRtcIsac_kQGainInitIndex, 1);
-  if (err < 0) {
-    return err;
-  }
-  /* find quantization level */
-  *gainQ10 = WebRtcIsac_kQGain2Levels[index];
-  return 0;
-}
-
-
-/* quantize & code squared Gain */
-int WebRtcIsac_EncodeGain2(int32_t* gainQ10, Bitstr* streamdata) {
-  int index;
-
-  /* find quantization index */
-  index = WebRtcIsac_kQGainInitIndex[0];
-  if (*gainQ10 > WebRtcIsac_kQGain2BoundaryLevels[index]) {
-    while (*gainQ10 > WebRtcIsac_kQGain2BoundaryLevels[index + 1]) {
-      index++;
-    }
-  } else {
-    while (*gainQ10 < WebRtcIsac_kQGain2BoundaryLevels[--index]) ;
-  }
-  /* De-quantize */
-  *gainQ10 = WebRtcIsac_kQGain2Levels[index];
-
-  /* entropy coding of quantization index */
-  WebRtcIsac_EncHistMulti(streamdata, &index, WebRtcIsac_kQGainCdf_ptr, 1);
-  return 0;
-}
-
-
-/* code and decode Pitch Gains and Lags functions */
-
-/* decode & dequantize Pitch Gains */
-int WebRtcIsac_DecodePitchGain(Bitstr* streamdata,
-                               int16_t* PitchGains_Q12) {
-  int index_comb, err;
-  const uint16_t* WebRtcIsac_kQPitchGainCdf_ptr[1];
-
-  /* Entropy decoding of quantization indices */
-  *WebRtcIsac_kQPitchGainCdf_ptr = WebRtcIsac_kQPitchGainCdf;
-  err = WebRtcIsac_DecHistBisectMulti(&index_comb, streamdata,
-                                      WebRtcIsac_kQPitchGainCdf_ptr,
-                                      WebRtcIsac_kQCdfTableSizeGain, 1);
-  /* Error check, Q_mean_Gain.. tables are of size 144 */
-  if ((err < 0) || (index_comb < 0) || (index_comb >= 144)) {
-    return -ISAC_RANGE_ERROR_DECODE_PITCH_GAIN;
-  }
-  /* De-quantize back to pitch gains by table look-up. */
-  PitchGains_Q12[0] = WebRtcIsac_kQMeanGain1Q12[index_comb];
-  PitchGains_Q12[1] = WebRtcIsac_kQMeanGain2Q12[index_comb];
-  PitchGains_Q12[2] = WebRtcIsac_kQMeanGain3Q12[index_comb];
-  PitchGains_Q12[3] = WebRtcIsac_kQMeanGain4Q12[index_comb];
-  return 0;
-}
-
-
-/* Quantize & code Pitch Gains. */
-void WebRtcIsac_EncodePitchGain(int16_t* PitchGains_Q12,
-                                Bitstr* streamdata,
-                                IsacSaveEncoderData* encData) {
-  int k, j;
-  double C;
-  double S[PITCH_SUBFRAMES];
-  int index[3];
-  int index_comb;
-  const uint16_t* WebRtcIsac_kQPitchGainCdf_ptr[1];
-  double PitchGains[PITCH_SUBFRAMES] = {0, 0, 0, 0};
-
-  /* Take the asin. */
-  for (k = 0; k < PITCH_SUBFRAMES; k++) {
-    PitchGains[k] = ((float)PitchGains_Q12[k]) / 4096;
-    S[k] = asin(PitchGains[k]);
-  }
-
-  /* Find quantization index; only for the first three
-   * transform coefficients. */
-  for (k = 0; k < 3; k++) {
-    /*  transform */
-    C = 0.0;
-    for (j = 0; j < PITCH_SUBFRAMES; j++) {
-      C += WebRtcIsac_kTransform[k][j] * S[j];
-    }
-    /* Quantize */
-    index[k] = WebRtcIsac_lrint(C / PITCH_GAIN_STEPSIZE);
-
-    /* Check that the index is not outside the boundaries of the table. */
-    if (index[k] < WebRtcIsac_kIndexLowerLimitGain[k]) {
-      index[k] = WebRtcIsac_kIndexLowerLimitGain[k];
-    } else if (index[k] > WebRtcIsac_kIndexUpperLimitGain[k]) {
-      index[k] = WebRtcIsac_kIndexUpperLimitGain[k];
-    }
-    index[k] -= WebRtcIsac_kIndexLowerLimitGain[k];
-  }
-
-  /* Calculate unique overall index. */
-  index_comb = WebRtcIsac_kIndexMultsGain[0] * index[0] +
-      WebRtcIsac_kIndexMultsGain[1] * index[1] + index[2];
-
-  /* unquantize back to pitch gains by table look-up */
-  PitchGains_Q12[0] = WebRtcIsac_kQMeanGain1Q12[index_comb];
-  PitchGains_Q12[1] = WebRtcIsac_kQMeanGain2Q12[index_comb];
-  PitchGains_Q12[2] = WebRtcIsac_kQMeanGain3Q12[index_comb];
-  PitchGains_Q12[3] = WebRtcIsac_kQMeanGain4Q12[index_comb];
-
-  /* entropy coding of quantization pitch gains */
-  *WebRtcIsac_kQPitchGainCdf_ptr = WebRtcIsac_kQPitchGainCdf;
-  WebRtcIsac_EncHistMulti(streamdata, &index_comb,
-                          WebRtcIsac_kQPitchGainCdf_ptr, 1);
-  encData->pitchGain_index[encData->startIdx] = index_comb;
-}
-
-
-
-/* Pitch LAG */
-/* Decode & de-quantize Pitch Lags. */
-int WebRtcIsac_DecodePitchLag(Bitstr* streamdata, int16_t* PitchGain_Q12,
-                              double* PitchLags) {
-  int k, err;
-  double StepSize;
-  double C;
-  int index[PITCH_SUBFRAMES];
-  double mean_gain;
-  const double* mean_val2, *mean_val3, *mean_val4;
-  const int16_t* lower_limit;
-  const uint16_t* init_index;
-  const uint16_t* cdf_size;
-  const uint16_t** cdf;
-  double PitchGain[4] = {0, 0, 0, 0};
-
-  /* compute mean pitch gain */
-  mean_gain = 0.0;
-  for (k = 0; k < 4; k++) {
-    PitchGain[k] = ((float)PitchGain_Q12[k]) / 4096;
-    mean_gain += PitchGain[k];
-  }
-  mean_gain /= 4.0;
-
-  /* voicing classification. */
-  if (mean_gain < 0.2) {
-    StepSize = WebRtcIsac_kQPitchLagStepsizeLo;
-    cdf = WebRtcIsac_kQPitchLagCdfPtrLo;
-    cdf_size = WebRtcIsac_kQPitchLagCdfSizeLo;
-    mean_val2 = WebRtcIsac_kQMeanLag2Lo;
-    mean_val3 = WebRtcIsac_kQMeanLag3Lo;
-    mean_val4 = WebRtcIsac_kQMeanLag4Lo;
-    lower_limit = WebRtcIsac_kQIndexLowerLimitLagLo;
-    init_index = WebRtcIsac_kQInitIndexLagLo;
-  } else if (mean_gain < 0.4) {
-    StepSize = WebRtcIsac_kQPitchLagStepsizeMid;
-    cdf = WebRtcIsac_kQPitchLagCdfPtrMid;
-    cdf_size = WebRtcIsac_kQPitchLagCdfSizeMid;
-    mean_val2 = WebRtcIsac_kQMeanLag2Mid;
-    mean_val3 = WebRtcIsac_kQMeanLag3Mid;
-    mean_val4 = WebRtcIsac_kQMeanLag4Mid;
-    lower_limit = WebRtcIsac_kQIndexLowerLimitLagMid;
-    init_index = WebRtcIsac_kQInitIndexLagMid;
-  } else {
-    StepSize = WebRtcIsac_kQPitchLagStepsizeHi;
-    cdf = WebRtcIsac_kQPitchLagCdfPtrHi;
-    cdf_size = WebRtcIsac_kQPitchLagCdfSizeHi;
-    mean_val2 = WebRtcIsac_kQMeanLag2Hi;
-    mean_val3 = WebRtcIsac_kQMeanLag3Hi;
-    mean_val4 = WebRtcIsac_kQMeanLag4Hi;
-    lower_limit = WebRtcIsac_kQindexLowerLimitLagHi;
-    init_index = WebRtcIsac_kQInitIndexLagHi;
-  }
-
-  /* Entropy decoding of quantization indices. */
-  err = WebRtcIsac_DecHistBisectMulti(index, streamdata, cdf, cdf_size, 1);
-  if ((err < 0) || (index[0] < 0)) {
-    return -ISAC_RANGE_ERROR_DECODE_PITCH_LAG;
-  }
-  err = WebRtcIsac_DecHistOneStepMulti(index + 1, streamdata, cdf + 1,
-                                       init_index, 3);
-  if (err < 0) {
-    return -ISAC_RANGE_ERROR_DECODE_PITCH_LAG;
-  }
-
-  /* Unquantize back to transform coefficients and do the inverse transform:
-   * S = T'*C. */
-  C = (index[0] + lower_limit[0]) * StepSize;
-  for (k = 0; k < PITCH_SUBFRAMES; k++) {
-    PitchLags[k] = WebRtcIsac_kTransformTranspose[k][0] * C;
-  }
-  C = mean_val2[index[1]];
-  for (k = 0; k < PITCH_SUBFRAMES; k++) {
-    PitchLags[k] += WebRtcIsac_kTransformTranspose[k][1] * C;
-  }
-  C = mean_val3[index[2]];
-  for (k = 0; k < PITCH_SUBFRAMES; k++) {
-    PitchLags[k] += WebRtcIsac_kTransformTranspose[k][2] * C;
-  }
-  C = mean_val4[index[3]];
-  for (k = 0; k < PITCH_SUBFRAMES; k++) {
-    PitchLags[k] += WebRtcIsac_kTransformTranspose[k][3] * C;
-  }
-  return 0;
-}
-
-
-
-/* Quantize & code pitch lags. */
-void WebRtcIsac_EncodePitchLag(double* PitchLags, int16_t* PitchGain_Q12,
-                               Bitstr* streamdata,
-                               IsacSaveEncoderData* encData) {
-  int k, j;
-  double StepSize;
-  double C;
-  int index[PITCH_SUBFRAMES];
-  double mean_gain;
-  const double* mean_val2, *mean_val3, *mean_val4;
-  const int16_t* lower_limit, *upper_limit;
-  const uint16_t** cdf;
-  double PitchGain[4] = {0, 0, 0, 0};
-
-  /* compute mean pitch gain */
-  mean_gain = 0.0;
-  for (k = 0; k < 4; k++) {
-    PitchGain[k] = ((float)PitchGain_Q12[k]) / 4096;
-    mean_gain += PitchGain[k];
-  }
-  mean_gain /= 4.0;
-
-  /* Save data for creation of multiple bit streams */
-  encData->meanGain[encData->startIdx] = mean_gain;
-
-  /* Voicing classification. */
-  if (mean_gain < 0.2) {
-    StepSize = WebRtcIsac_kQPitchLagStepsizeLo;
-    cdf = WebRtcIsac_kQPitchLagCdfPtrLo;
-    mean_val2 = WebRtcIsac_kQMeanLag2Lo;
-    mean_val3 = WebRtcIsac_kQMeanLag3Lo;
-    mean_val4 = WebRtcIsac_kQMeanLag4Lo;
-    lower_limit = WebRtcIsac_kQIndexLowerLimitLagLo;
-    upper_limit = WebRtcIsac_kQIndexUpperLimitLagLo;
-  } else if (mean_gain < 0.4) {
-    StepSize = WebRtcIsac_kQPitchLagStepsizeMid;
-    cdf = WebRtcIsac_kQPitchLagCdfPtrMid;
-    mean_val2 = WebRtcIsac_kQMeanLag2Mid;
-    mean_val3 = WebRtcIsac_kQMeanLag3Mid;
-    mean_val4 = WebRtcIsac_kQMeanLag4Mid;
-    lower_limit = WebRtcIsac_kQIndexLowerLimitLagMid;
-    upper_limit = WebRtcIsac_kQIndexUpperLimitLagMid;
-  } else {
-    StepSize = WebRtcIsac_kQPitchLagStepsizeHi;
-    cdf = WebRtcIsac_kQPitchLagCdfPtrHi;
-    mean_val2 = WebRtcIsac_kQMeanLag2Hi;
-    mean_val3 = WebRtcIsac_kQMeanLag3Hi;
-    mean_val4 = WebRtcIsac_kQMeanLag4Hi;
-    lower_limit = WebRtcIsac_kQindexLowerLimitLagHi;
-    upper_limit = WebRtcIsac_kQindexUpperLimitLagHi;
-  }
-
-  /* find quantization index */
-  for (k = 0; k < 4; k++) {
-    /*  transform */
-    C = 0.0;
-    for (j = 0; j < PITCH_SUBFRAMES; j++) {
-      C += WebRtcIsac_kTransform[k][j] * PitchLags[j];
-    }
-    /* quantize */
-    index[k] = WebRtcIsac_lrint(C / StepSize);
-
-    /* check that the index is not outside the boundaries of the table */
-    if (index[k] < lower_limit[k]) {
-      index[k] = lower_limit[k];
-    } else if (index[k] > upper_limit[k]) index[k] = upper_limit[k]; {
-      index[k] -= lower_limit[k];
-    }
-    /* Save data for creation of multiple bit streams */
-    encData->pitchIndex[PITCH_SUBFRAMES * encData->startIdx + k] = index[k];
-  }
-
-  /* Un-quantize back to transform coefficients and do the inverse transform:
-   * S = T'*C */
-  C = (index[0] + lower_limit[0]) * StepSize;
-  for (k = 0; k < PITCH_SUBFRAMES; k++) {
-    PitchLags[k] = WebRtcIsac_kTransformTranspose[k][0] * C;
-  }
-  C = mean_val2[index[1]];
-  for (k = 0; k < PITCH_SUBFRAMES; k++) {
-    PitchLags[k] += WebRtcIsac_kTransformTranspose[k][1] * C;
-  }
-  C = mean_val3[index[2]];
-  for (k = 0; k < PITCH_SUBFRAMES; k++) {
-    PitchLags[k] += WebRtcIsac_kTransformTranspose[k][2] * C;
-  }
-  C = mean_val4[index[3]];
-  for (k = 0; k < PITCH_SUBFRAMES; k++) {
-    PitchLags[k] += WebRtcIsac_kTransformTranspose[k][3] * C;
-  }
-  /* entropy coding of quantization pitch lags */
-  WebRtcIsac_EncHistMulti(streamdata, index, cdf, PITCH_SUBFRAMES);
-}
-
-
-
-/* Routines for in-band signaling of bandwidth estimation */
-/* Histograms based on uniform distribution of indices */
-/* Move global variables later! */
-
-
-/* cdf array for frame length indicator */
-const uint16_t WebRtcIsac_kFrameLengthCdf[4] = {
-    0, 21845, 43690, 65535 };
-
-/* pointer to cdf array for frame length indicator */
-const uint16_t* WebRtcIsac_kFrameLengthCdf_ptr[1] = {
-    WebRtcIsac_kFrameLengthCdf };
-
-/* initial cdf index for decoder of frame length indicator */
-const uint16_t WebRtcIsac_kFrameLengthInitIndex[1] = { 1 };
-
-
-int WebRtcIsac_DecodeFrameLen(Bitstr* streamdata, int16_t* framesamples) {
-  int frame_mode, err;
-  err = 0;
-  /* entropy decoding of frame length [1:30ms,2:60ms] */
-  err = WebRtcIsac_DecHistOneStepMulti(&frame_mode, streamdata,
-                                       WebRtcIsac_kFrameLengthCdf_ptr,
-                                       WebRtcIsac_kFrameLengthInitIndex, 1);
-  if (err < 0)
-    return -ISAC_RANGE_ERROR_DECODE_FRAME_LENGTH;
-
-  switch (frame_mode) {
-    case 1:
-      *framesamples = 480; /* 30ms */
-      break;
-    case 2:
-      *framesamples = 960; /* 60ms */
-      break;
-    default:
-      err = -ISAC_DISALLOWED_FRAME_MODE_DECODER;
-  }
-  return err;
-}
-
-int WebRtcIsac_EncodeFrameLen(int16_t framesamples, Bitstr* streamdata) {
-  int frame_mode, status;
-
-  status = 0;
-  frame_mode = 0;
-  /* entropy coding of frame length [1:480 samples,2:960 samples] */
-  switch (framesamples) {
-    case 480:
-      frame_mode = 1;
-      break;
-    case 960:
-      frame_mode = 2;
-      break;
-    default:
-      status = - ISAC_DISALLOWED_FRAME_MODE_ENCODER;
-  }
-
-  if (status < 0)
-    return status;
-
-  WebRtcIsac_EncHistMulti(streamdata, &frame_mode,
-                          WebRtcIsac_kFrameLengthCdf_ptr, 1);
-  return status;
-}
-
-/* cdf array for estimated bandwidth */
-static const uint16_t kBwCdf[25] = {
-    0, 2731, 5461, 8192, 10923, 13653, 16384, 19114, 21845, 24576, 27306, 30037,
-    32768, 35498, 38229, 40959, 43690, 46421, 49151, 51882, 54613, 57343, 60074,
-    62804, 65535 };
-
-/* pointer to cdf array for estimated bandwidth */
-static const uint16_t* const kBwCdfPtr[1] = { kBwCdf };
-
-/* initial cdf index for decoder of estimated bandwidth*/
-static const uint16_t kBwInitIndex[1] = { 7 };
-
-
-int WebRtcIsac_DecodeSendBW(Bitstr* streamdata, int16_t* BWno) {
-  int BWno32, err;
-
-  /* entropy decoding of sender's BW estimation [0..23] */
-  err = WebRtcIsac_DecHistOneStepMulti(&BWno32, streamdata, kBwCdfPtr,
-                                       kBwInitIndex, 1);
-  if (err < 0) {
-    return -ISAC_RANGE_ERROR_DECODE_BANDWIDTH;
-  }
-  *BWno = (int16_t)BWno32;
-  return err;
-}
-
-void WebRtcIsac_EncodeReceiveBw(int* BWno, Bitstr* streamdata) {
-  /* entropy encoding of receiver's BW estimation [0..23] */
-  WebRtcIsac_EncHistMulti(streamdata, BWno, kBwCdfPtr, 1);
-}
-
-
-/* estimate code length of LPC Coef */
-void WebRtcIsac_TranscodeLPCCoef(double* LPCCoef_lo, double* LPCCoef_hi,
-                                 int* index_g) {
-  int j, k, n, pos, pos2, posg, offsg, offs2;
-  int index_ovr_g[KLT_ORDER_GAIN];
-  double tmpcoeffs_g[KLT_ORDER_GAIN];
-  double tmpcoeffs2_g[KLT_ORDER_GAIN];
-  double sum;
-
-  /* log gains, mean removal and scaling */
-  posg = 0;
-  for (k = 0; k < SUBFRAMES; k++) {
-    tmpcoeffs_g[posg] = log(LPCCoef_lo[(LPC_LOBAND_ORDER + 1) * k]);
-    tmpcoeffs_g[posg] -= WebRtcIsac_kLpcMeansGain[posg];
-    tmpcoeffs_g[posg] *= LPC_GAIN_SCALE;
-    posg++;
-    tmpcoeffs_g[posg] = log(LPCCoef_hi[(LPC_HIBAND_ORDER + 1) * k]);
-    tmpcoeffs_g[posg] -= WebRtcIsac_kLpcMeansGain[posg];
-    tmpcoeffs_g[posg] *= LPC_GAIN_SCALE;
-    posg++;
-  }
-
-  /* KLT  */
-
-  /* Left transform. */
-  offsg = 0;
-  for (j = 0; j < SUBFRAMES; j++) {
-    posg = offsg;
-    for (k = 0; k < LPC_GAIN_ORDER; k++) {
-      sum = 0;
-      pos = offsg;
-      pos2 = k;
-      for (n = 0; n < LPC_GAIN_ORDER; n++) {
-        sum += tmpcoeffs_g[pos++] * WebRtcIsac_kKltT1Gain[pos2];
-        pos2 += LPC_GAIN_ORDER;
-      }
-      tmpcoeffs2_g[posg++] = sum;
-    }
-    offsg += LPC_GAIN_ORDER;
-  }
-
-  /* Right transform. */
-  offsg = 0;
-  offs2 = 0;
-  for (j = 0; j < SUBFRAMES; j++) {
-    posg = offsg;
-    for (k = 0; k < LPC_GAIN_ORDER; k++) {
-      sum = 0;
-      pos = k;
-      pos2 = offs2;
-      for (n = 0; n < SUBFRAMES; n++) {
-        sum += tmpcoeffs2_g[pos] * WebRtcIsac_kKltT2Gain[pos2++];
-        pos += LPC_GAIN_ORDER;
-      }
-      tmpcoeffs_g[posg++] = sum;
-    }
-    offs2 += SUBFRAMES;
-    offsg += LPC_GAIN_ORDER;
-  }
-
-
-  /* quantize coefficients */
-  for (k = 0; k < KLT_ORDER_GAIN; k++) {
-    /* Get index. */
-    pos2 = WebRtcIsac_lrint(tmpcoeffs_g[k] / KLT_STEPSIZE);
-    index_g[k] = (pos2) + WebRtcIsac_kQKltQuantMinGain[k];
-    if (index_g[k] < 0) {
-      index_g[k] = 0;
-    } else if (index_g[k] > WebRtcIsac_kQKltMaxIndGain[k]) {
-      index_g[k] = WebRtcIsac_kQKltMaxIndGain[k];
-    }
-    index_ovr_g[k] = WebRtcIsac_kQKltOffsetGain[k] + index_g[k];
-
-    /* find quantization levels for coefficients */
-    tmpcoeffs_g[k] = WebRtcIsac_kQKltLevelsGain[index_ovr_g[k]];
-  }
-}
-
-
-/* Decode & de-quantize LPC Coefficients. */
-int WebRtcIsac_DecodeLpcCoefUB(Bitstr* streamdata, double* lpcVecs,
-                               double* percepFilterGains,
-                               int16_t bandwidth) {
-  int  index_s[KLT_ORDER_SHAPE];
-
-  double U[UB_LPC_ORDER * UB16_LPC_VEC_PER_FRAME];
-  int err;
-
-  /* Entropy decoding of quantization indices. */
-  switch (bandwidth) {
-    case isac12kHz: {
-      err = WebRtcIsac_DecHistOneStepMulti(
-          index_s, streamdata, WebRtcIsac_kLpcShapeCdfMatUb12,
-          WebRtcIsac_kLpcShapeEntropySearchUb12, UB_LPC_ORDER *
-          UB_LPC_VEC_PER_FRAME);
-      break;
-    }
-    case isac16kHz: {
-      err = WebRtcIsac_DecHistOneStepMulti(
-          index_s, streamdata, WebRtcIsac_kLpcShapeCdfMatUb16,
-          WebRtcIsac_kLpcShapeEntropySearchUb16, UB_LPC_ORDER *
-          UB16_LPC_VEC_PER_FRAME);
-      break;
-    }
-    default:
-      return -1;
-  }
-
-  if (err < 0) {
-    return err;
-  }
-
-  WebRtcIsac_DequantizeLpcParam(index_s, lpcVecs, bandwidth);
-  WebRtcIsac_CorrelateInterVec(lpcVecs, U, bandwidth);
-  WebRtcIsac_CorrelateIntraVec(U, lpcVecs, bandwidth);
-  WebRtcIsac_AddLarMean(lpcVecs, bandwidth);
-  WebRtcIsac_DecodeLpcGainUb(percepFilterGains, streamdata);
-
-  if (bandwidth == isac16kHz) {
-    /* Decode another set of Gains. */
-    WebRtcIsac_DecodeLpcGainUb(&percepFilterGains[SUBFRAMES], streamdata);
-  }
-  return 0;
-}
-
-int16_t WebRtcIsac_EncodeBandwidth(enum ISACBandwidth bandwidth,
-                                   Bitstr* streamData) {
-  int bandwidthMode;
-  switch (bandwidth) {
-    case isac12kHz: {
-      bandwidthMode = 0;
-      break;
-    }
-    case isac16kHz: {
-      bandwidthMode = 1;
-      break;
-    }
-    default:
-      return -ISAC_DISALLOWED_ENCODER_BANDWIDTH;
-  }
-  WebRtcIsac_EncHistMulti(streamData, &bandwidthMode, kOneBitEqualProbCdf_ptr,
-                          1);
-  return 0;
-}
-
-int16_t WebRtcIsac_DecodeBandwidth(Bitstr* streamData,
-                                   enum ISACBandwidth* bandwidth) {
-  int bandwidthMode;
-  if (WebRtcIsac_DecHistOneStepMulti(&bandwidthMode, streamData,
-                                     kOneBitEqualProbCdf_ptr,
-                                     kOneBitEqualProbInitIndex, 1) < 0) {
-    return -ISAC_RANGE_ERROR_DECODE_BANDWITH;
-  }
-  switch (bandwidthMode) {
-    case 0: {
-      *bandwidth = isac12kHz;
-      break;
-    }
-    case 1: {
-      *bandwidth = isac16kHz;
-      break;
-    }
-    default:
-      return -ISAC_DISALLOWED_BANDWIDTH_MODE_DECODER;
-  }
-  return 0;
-}
-
-int16_t WebRtcIsac_EncodeJitterInfo(int32_t jitterIndex,
-                                    Bitstr* streamData) {
-  /* This is to avoid LINUX warning until we change 'int' to 'Word32'. */
-  int intVar;
-
-  if ((jitterIndex < 0) || (jitterIndex > 1)) {
-    return -1;
-  }
-  intVar = (int)(jitterIndex);
-  /* Use the same CDF table as for bandwidth
-   * both take two values with equal probability.*/
-  WebRtcIsac_EncHistMulti(streamData, &intVar, kOneBitEqualProbCdf_ptr, 1);
-  return 0;
-}
-
-int16_t WebRtcIsac_DecodeJitterInfo(Bitstr* streamData,
-                                    int32_t* jitterInfo) {
-  int intVar;
-  /* Use the same CDF table as for bandwidth
-   * both take two values with equal probability. */
-  if (WebRtcIsac_DecHistOneStepMulti(&intVar, streamData,
-                                     kOneBitEqualProbCdf_ptr,
-                                     kOneBitEqualProbInitIndex, 1) < 0) {
-    return -ISAC_RANGE_ERROR_DECODE_BANDWITH;
-  }
-  *jitterInfo = (int16_t)(intVar);
-  return 0;
-}
diff --git a/modules/audio_coding/codecs/isac/main/source/entropy_coding.h b/modules/audio_coding/codecs/isac/main/source/entropy_coding.h
deleted file mode 100644
index d715d86..0000000
--- a/modules/audio_coding/codecs/isac/main/source/entropy_coding.h
+++ /dev/null
@@ -1,343 +0,0 @@
-/*
- *  Copyright (c) 2012 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.
- */
-
-/*
- * entropy_coding.h
- *
- * This header file declares all of the functions used to arithmetically
- * encode the iSAC bistream
- *
- */
-
-#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_MAIN_SOURCE_ENTROPY_CODING_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_MAIN_SOURCE_ENTROPY_CODING_H_
-
-#include "settings.h"
-#include "structs.h"
-
-/******************************************************************************
- * WebRtcIsac_DecodeSpec()
- * Decode real and imaginary part of the DFT coefficients, given a bit-stream.
- * The decoded DFT coefficient can be transformed to time domain by
- * WebRtcIsac_Time2Spec().
- *
- * Input:
- *  - streamdata            : pointer to a stucture containg the encoded
- *                            data and theparameters needed for entropy
- *                            coding.
- *  - AvgPitchGain_Q12      : average pitch-gain of the frame. This is only
- *                            relevant for 0-4 kHz band, and the input value is
- *                            not used in other bands.
- *  - band                  : specifies which band's DFT should be decoded.
- *
- * Output:
- *   - *fr                  : pointer to a buffer where the real part of DFT
- *                            coefficients are written to.
- *   - *fi                  : pointer to a buffer where the imaginary part
- *                            of DFT coefficients are written to.
- *
- * Return value             : < 0 if an error occures
- *                              0 if succeeded.
- */
-int WebRtcIsac_DecodeSpec(Bitstr* streamdata, int16_t AvgPitchGain_Q12,
-                          enum ISACBand band, double* fr, double* fi);
-
-/******************************************************************************
- * WebRtcIsac_EncodeSpec()
- * Encode real and imaginary part of the DFT coefficients into the given
- * bit-stream.
- *
- * Input:
- *  - *fr                   : pointer to a buffer where the real part of DFT
- *                            coefficients are written to.
- *  - *fi                   : pointer to a buffer where the imaginary part
- *                            of DFT coefficients are written to.
- *  - AvgPitchGain_Q12      : average pitch-gain of the frame. This is only
- *                            relevant for 0-4 kHz band, and the input value is
- *                            not used in other bands.
- *  - band                  : specifies which band's DFT should be decoded.
- *
- * Output:
- *  - streamdata            : pointer to a stucture containg the encoded
- *                            data and theparameters needed for entropy
- *                            coding.
- *
- * Return value             : < 0 if an error occures
- *                              0 if succeeded.
- */
-int WebRtcIsac_EncodeSpec(const int16_t* fr, const int16_t* fi,
-                          int16_t AvgPitchGain_Q12, enum ISACBand band,
-                          Bitstr* streamdata);
-
-/* decode & dequantize LPC Coef */
-int WebRtcIsac_DecodeLpcCoef(Bitstr* streamdata, double* LPCCoef);
-int WebRtcIsac_DecodeLpcCoefUB(Bitstr* streamdata, double* lpcVecs,
-                               double* percepFilterGains,
-                               int16_t bandwidth);
-
-int WebRtcIsac_DecodeLpc(Bitstr* streamdata, double* LPCCoef_lo,
-                         double* LPCCoef_hi);
-
-/* quantize & code LPC Coef */
-void WebRtcIsac_EncodeLpcLb(double* LPCCoef_lo, double* LPCCoef_hi,
-                            Bitstr* streamdata, IsacSaveEncoderData* encData);
-
-void WebRtcIsac_EncodeLpcGainLb(double* LPCCoef_lo, double* LPCCoef_hi,
-                                Bitstr* streamdata,
-                                IsacSaveEncoderData* encData);
-
-/******************************************************************************
- * WebRtcIsac_EncodeLpcUB()
- * Encode LPC parameters, given as A-polynomial, of upper-band. The encoding
- * is performed in LAR domain.
- * For the upper-band, we compute and encode LPC of some sub-frames, LPC of
- * other sub-frames are computed by linear interpolation, in LAR domain. This
- * function performs the interpolation and returns the LPC of all sub-frames.
- *
- * Inputs:
- *  - lpcCoef               : a buffer containing A-polynomials of sub-frames
- *                            (excluding first coefficient that is 1).
- *  - bandwidth             : specifies if the codec is operating at 0-12 kHz
- *                            or 0-16 kHz mode.
- *
- * Input/output:
- *  - streamdata            : pointer to a structure containing the encoded
- *                            data and the parameters needed for entropy
- *                            coding.
- *
- * Output:
- *  - interpolLPCCoeff      : Decoded and interpolated LPC (A-polynomial)
- *                            of all sub-frames.
- *                            If LP analysis is of order K, and there are N
- *                            sub-frames then this is a buffer of size
- *                            (k + 1) * N, each vector starts with the LPC gain
- *                            of the corresponding sub-frame. The LPC gains
- *                            are encoded and inserted after this function is
- *                            called. The first A-coefficient which is 1 is not
- *                            included.
- *
- * Return value             : 0 if encoding is successful,
- *                           <0 if failed to encode.
- */
-int16_t WebRtcIsac_EncodeLpcUB(double* lpcCoeff, Bitstr* streamdata,
-                               double* interpolLPCCoeff,
-                               int16_t bandwidth,
-                               ISACUBSaveEncDataStruct* encData);
-
-/******************************************************************************
- * WebRtcIsac_DecodeInterpolLpcUb()
- * Decode LPC coefficients and interpolate to get the coefficients fo all
- * sub-frmaes.
- *
- * Inputs:
- *  - bandwidth             : spepecifies if the codec is in 0-12 kHz or
- *                            0-16 kHz mode.
- *
- * Input/output:
- *  - streamdata            : pointer to a stucture containg the encoded
- *                            data and theparameters needed for entropy
- *                            coding.
- *
- * Output:
- *  - percepFilterParam     : Decoded and interpolated LPC (A-polynomial) of
- *                            all sub-frames.
- *                            If LP analysis is of order K, and there are N
- *                            sub-frames then this is a buffer of size
- *                            (k + 1) * N, each vector starts with the LPC gain
- *                            of the corresponding sub-frame. The LPC gains
- *                            are encoded and inserted after this function is
- *                            called. The first A-coefficient which is 1 is not
- *                            included.
- *
- * Return value             : 0 if encoding is successful,
- *                           <0 if failed to encode.
- */
-int16_t WebRtcIsac_DecodeInterpolLpcUb(Bitstr* streamdata,
-                                       double* percepFilterParam,
-                                       int16_t bandwidth);
-
-/* Decode & dequantize RC */
-int WebRtcIsac_DecodeRc(Bitstr* streamdata, int16_t* RCQ15);
-
-/* Quantize & code RC */
-void WebRtcIsac_EncodeRc(int16_t* RCQ15, Bitstr* streamdata);
-
-/* Decode & dequantize squared Gain */
-int WebRtcIsac_DecodeGain2(Bitstr* streamdata, int32_t* Gain2);
-
-/* Quantize & code squared Gain (input is squared gain) */
-int WebRtcIsac_EncodeGain2(int32_t* gain2, Bitstr* streamdata);
-
-void WebRtcIsac_EncodePitchGain(int16_t* PitchGains_Q12,
-                                Bitstr* streamdata,
-                                IsacSaveEncoderData* encData);
-
-void WebRtcIsac_EncodePitchLag(double* PitchLags,
-                               int16_t* PitchGain_Q12,
-                               Bitstr* streamdata,
-                               IsacSaveEncoderData* encData);
-
-int WebRtcIsac_DecodePitchGain(Bitstr* streamdata,
-                               int16_t* PitchGain_Q12);
-int WebRtcIsac_DecodePitchLag(Bitstr* streamdata, int16_t* PitchGain_Q12,
-                              double* PitchLag);
-
-int WebRtcIsac_DecodeFrameLen(Bitstr* streamdata, int16_t* framelength);
-int WebRtcIsac_EncodeFrameLen(int16_t framelength, Bitstr* streamdata);
-int WebRtcIsac_DecodeSendBW(Bitstr* streamdata, int16_t* BWno);
-void WebRtcIsac_EncodeReceiveBw(int* BWno, Bitstr* streamdata);
-
-/* Step-down */
-void WebRtcIsac_Poly2Rc(double* a, int N, double* RC);
-
-/* Step-up */
-void WebRtcIsac_Rc2Poly(double* RC, int N, double* a);
-
-void WebRtcIsac_TranscodeLPCCoef(double* LPCCoef_lo, double* LPCCoef_hi,
-                                 int* index_g);
-
-
-/******************************************************************************
- * WebRtcIsac_EncodeLpcGainUb()
- * Encode LPC gains of sub-Frames.
- *
- * Input/outputs:
- *  - lpGains               : a buffer which contains 'SUBFRAME' number of
- *                            LP gains to be encoded. The input values are
- *                            overwritten by the quantized values.
- *  - streamdata            : pointer to a stucture containg the encoded
- *                            data and theparameters needed for entropy
- *                            coding.
- *
- * Output:
- *  - lpcGainIndex          : quantization indices for lpc gains, these will
- *                            be stored to be used  for FEC.
- */
-void WebRtcIsac_EncodeLpcGainUb(double* lpGains, Bitstr* streamdata,
-                                int* lpcGainIndex);
-
-
-/******************************************************************************
- * WebRtcIsac_EncodeLpcGainUb()
- * Store LPC gains of sub-Frames in 'streamdata'.
- *
- * Input:
- *  - lpGains               : a buffer which contains 'SUBFRAME' number of
- *                            LP gains to be encoded.
- * Input/outputs:
- *  - streamdata            : pointer to a stucture containg the encoded
- *                            data and theparameters needed for entropy
- *                            coding.
- *
- */
-void WebRtcIsac_StoreLpcGainUb(double* lpGains, Bitstr* streamdata);
-
-
-/******************************************************************************
- * WebRtcIsac_DecodeLpcGainUb()
- * Decode the LPC gain of sub-frames.
- *
- * Input/output:
- *  - streamdata            : pointer to a stucture containg the encoded
- *                            data and theparameters needed for entropy
- *                            coding.
- *
- * Output:
- *  - lpGains               : a buffer where decoded LPC gians will be stored.
- *
- * Return value             : 0 if succeeded.
- *                           <0 if failed.
- */
-int16_t WebRtcIsac_DecodeLpcGainUb(double* lpGains, Bitstr* streamdata);
-
-
-/******************************************************************************
- * WebRtcIsac_EncodeBandwidth()
- * Encode if the bandwidth of encoded audio is 0-12 kHz or 0-16 kHz.
- *
- * Input:
- *  - bandwidth             : an enumerator specifying if the codec in is
- *                            0-12 kHz or 0-16 kHz mode.
- *
- * Input/output:
- *  - streamdata            : pointer to a stucture containg the encoded
- *                            data and theparameters needed for entropy
- *                            coding.
- *
- * Return value             : 0 if succeeded.
- *                           <0 if failed.
- */
-int16_t WebRtcIsac_EncodeBandwidth(enum ISACBandwidth bandwidth,
-                                   Bitstr* streamData);
-
-
-/******************************************************************************
- * WebRtcIsac_DecodeBandwidth()
- * Decode the bandwidth of the encoded audio, i.e. if the bandwidth is 0-12 kHz
- * or 0-16 kHz.
- *
- * Input/output:
- *  - streamdata            : pointer to a stucture containg the encoded
- *                            data and theparameters needed for entropy
- *                            coding.
- *
- * Output:
- *  - bandwidth             : an enumerator specifying if the codec is in
- *                            0-12 kHz or 0-16 kHz mode.
- *
- * Return value             : 0 if succeeded.
- *                           <0 if failed.
- */
-int16_t WebRtcIsac_DecodeBandwidth(Bitstr* streamData,
-                                   enum ISACBandwidth* bandwidth);
-
-
-/******************************************************************************
- * WebRtcIsac_EncodeJitterInfo()
- * Decode the jitter information.
- *
- * Input/output:
- *  - streamdata            : pointer to a stucture containg the encoded
- *                            data and theparameters needed for entropy
- *                            coding.
- *
- * Input:
- *  - jitterInfo            : one bit of info specifying if the channel is
- *                            in high/low jitter. Zero indicates low jitter
- *                            and one indicates high jitter.
- *
- * Return value             : 0 if succeeded.
- *                           <0 if failed.
- */
-int16_t WebRtcIsac_EncodeJitterInfo(int32_t jitterIndex,
-                                    Bitstr* streamData);
-
-
-/******************************************************************************
- * WebRtcIsac_DecodeJitterInfo()
- * Decode the jitter information.
- *
- * Input/output:
- *  - streamdata            : pointer to a stucture containg the encoded
- *                            data and theparameters needed for entropy
- *                            coding.
- *
- * Output:
- *  - jitterInfo            : one bit of info specifying if the channel is
- *                            in high/low jitter. Zero indicates low jitter
- *                            and one indicates high jitter.
- *
- * Return value             : 0 if succeeded.
- *                           <0 if failed.
- */
-int16_t WebRtcIsac_DecodeJitterInfo(Bitstr* streamData,
-                                    int32_t* jitterInfo);
-
-#endif /* WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_MAIN_SOURCE_ENTROPY_CODING_H_ */
diff --git a/modules/audio_coding/codecs/isac/main/source/fft.c b/modules/audio_coding/codecs/isac/main/source/fft.c
deleted file mode 100644
index c854d8c..0000000
--- a/modules/audio_coding/codecs/isac/main/source/fft.c
+++ /dev/null
@@ -1,943 +0,0 @@
-/*
- * Copyright(c)1995,97 Mark Olesen <olesen@me.QueensU.CA>
- *    Queen's Univ at Kingston (Canada)
- *
- * Permission to use, copy, modify, and distribute this software for
- * any purpose without fee is hereby granted, provided that this
- * entire notice is included in all copies of any software which is
- * or includes a copy or modification of this software and in all
- * copies of the supporting documentation for such software.
- *
- * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR
- * IMPLIED WARRANTY.  IN PARTICULAR, NEITHER THE AUTHOR NOR QUEEN'S
- * UNIVERSITY AT KINGSTON MAKES ANY REPRESENTATION OR WARRANTY OF ANY
- * KIND CONCERNING THE MERCHANTABILITY OF THIS SOFTWARE OR ITS
- * FITNESS FOR ANY PARTICULAR PURPOSE.
- *
- * All of which is to say that you can do what you like with this
- * source code provided you don't try to sell it as your own and you
- * include an unaltered copy of this message (including the
- * copyright).
- *
- * It is also implicitly understood that bug fixes and improvements
- * should make their way back to the general Internet community so
- * that everyone benefits.
- *
- * Changes:
- *   Trivial type modifications by the WebRTC authors.
- */
-
-
-/*
- * File:
- * WebRtcIsac_Fftn.c
- *
- * Public:
- * WebRtcIsac_Fftn / fftnf ();
- *
- * Private:
- * WebRtcIsac_Fftradix / fftradixf ();
- *
- * Descript:
- * multivariate complex Fourier transform, computed in place
- * using mixed-radix Fast Fourier Transform algorithm.
- *
- * Fortran code by:
- * RC Singleton, Stanford Research Institute, Sept. 1968
- *
- * translated by f2c (version 19950721).
- *
- * int WebRtcIsac_Fftn (int ndim, const int dims[], REAL Re[], REAL Im[],
- *     int iSign, double scaling);
- *
- * NDIM = the total number dimensions
- * DIMS = a vector of array sizes
- * if NDIM is zero then DIMS must be zero-terminated
- *
- * RE and IM hold the real and imaginary components of the data, and return
- * the resulting real and imaginary Fourier coefficients.  Multidimensional
- * data *must* be allocated contiguously.  There is no limit on the number
- * of dimensions.
- *
- * ISIGN = the sign of the complex exponential (ie, forward or inverse FFT)
- * the magnitude of ISIGN (normally 1) is used to determine the
- * correct indexing increment (see below).
- *
- * SCALING = normalizing constant by which the final result is *divided*
- * if SCALING == -1, normalize by total dimension of the transform
- * if SCALING <  -1, normalize by the square-root of the total dimension
- *
- * example:
- * tri-variate transform with Re[n1][n2][n3], Im[n1][n2][n3]
- *
- * int dims[3] = {n1,n2,n3}
- * WebRtcIsac_Fftn (3, dims, Re, Im, 1, scaling);
- *
- *-----------------------------------------------------------------------*
- * int WebRtcIsac_Fftradix (REAL Re[], REAL Im[], size_t nTotal, size_t nPass,
- *   size_t nSpan, int iSign, size_t max_factors,
- *   size_t max_perm);
- *
- * RE, IM - see above documentation
- *
- * Although there is no limit on the number of dimensions, WebRtcIsac_Fftradix() must
- * be called once for each dimension, but the calls may be in any order.
- *
- * NTOTAL = the total number of complex data values
- * NPASS  = the dimension of the current variable
- * NSPAN/NPASS = the spacing of consecutive data values while indexing the
- * current variable
- * ISIGN - see above documentation
- *
- * example:
- * tri-variate transform with Re[n1][n2][n3], Im[n1][n2][n3]
- *
- * WebRtcIsac_Fftradix (Re, Im, n1*n2*n3, n1,       n1, 1, maxf, maxp);
- * WebRtcIsac_Fftradix (Re, Im, n1*n2*n3, n2,    n1*n2, 1, maxf, maxp);
- * WebRtcIsac_Fftradix (Re, Im, n1*n2*n3, n3, n1*n2*n3, 1, maxf, maxp);
- *
- * single-variate transform,
- *    NTOTAL = N = NSPAN = (number of complex data values),
- *
- * WebRtcIsac_Fftradix (Re, Im, n, n, n, 1, maxf, maxp);
- *
- * The data can also be stored in a single array with alternating real and
- * imaginary parts, the magnitude of ISIGN is changed to 2 to give correct
- * indexing increment, and data [0] and data [1] used to pass the initial
- * addresses for the sequences of real and imaginary values,
- *
- * example:
- * REAL data [2*NTOTAL];
- * WebRtcIsac_Fftradix ( &data[0], &data[1], NTOTAL, nPass, nSpan, 2, maxf, maxp);
- *
- * for temporary allocation:
- *
- * MAX_FACTORS >= the maximum prime factor of NPASS
- * MAX_PERM >= the number of prime factors of NPASS.  In addition,
- * if the square-free portion K of NPASS has two or more prime
- * factors, then MAX_PERM >= (K-1)
- *
- * storage in FACTOR for a maximum of 15 prime factors of NPASS. if NPASS
- * has more than one square-free factor, the product of the square-free
- * factors must be <= 210 array storage for maximum prime factor of 23 the
- * following two constants should agree with the array dimensions.
- *
- *----------------------------------------------------------------------*/
-#include "fft.h"
-
-#include <stdlib.h>
-#include <math.h>
-
-
-
-/* double precision routine */
-static int
-WebRtcIsac_Fftradix (double Re[], double Im[],
-                    size_t nTotal, size_t nPass, size_t nSpan, int isign,
-                    int max_factors, unsigned int max_perm,
-                    FFTstr *fftstate);
-
-
-
-#ifndef M_PI
-# define M_PI 3.14159265358979323846264338327950288
-#endif
-
-#ifndef SIN60
-# define SIN60 0.86602540378443865 /* sin(60 deg) */
-# define COS72 0.30901699437494742 /* cos(72 deg) */
-# define SIN72 0.95105651629515357 /* sin(72 deg) */
-#endif
-
-# define REAL  double
-# define FFTN  WebRtcIsac_Fftn
-# define FFTNS  "fftn"
-# define FFTRADIX WebRtcIsac_Fftradix
-# define FFTRADIXS "fftradix"
-
-
-int  WebRtcIsac_Fftns(unsigned int ndim, const int dims[],
-                     double Re[],
-                     double Im[],
-                     int iSign,
-                     double scaling,
-                     FFTstr *fftstate)
-{
-
-  size_t nSpan, nPass, nTotal;
-  unsigned int i;
-  int ret, max_factors, max_perm;
-
-  /*
-   * tally the number of elements in the data array
-   * and determine the number of dimensions
-   */
-  nTotal = 1;
-  if (ndim && dims [0])
-  {
-    for (i = 0; i < ndim; i++)
-    {
-      if (dims [i] <= 0)
-      {
-        return -1;
-      }
-      nTotal *= dims [i];
-    }
-  }
-  else
-  {
-    ndim = 0;
-    for (i = 0; dims [i]; i++)
-    {
-      if (dims [i] <= 0)
-      {
-        return -1;
-      }
-      nTotal *= dims [i];
-      ndim++;
-    }
-  }
-
-  /* determine maximum number of factors and permuations */
-#if 1
-  /*
-   * follow John Beale's example, just use the largest dimension and don't
-   * worry about excess allocation.  May be someone else will do it?
-   */
-  max_factors = max_perm = 1;
-  for (i = 0; i < ndim; i++)
-  {
-    nSpan = dims [i];
-    if ((int)nSpan > max_factors)
-    {
-      max_factors = (int)nSpan;
-    }
-    if ((int)nSpan > max_perm) 
-    {
-      max_perm = (int)nSpan;
-    }
-  }
-#else
-  /* use the constants used in the original Fortran code */
-  max_factors = 23;
-  max_perm = 209;
-#endif
-  /* loop over the dimensions: */
-  nPass = 1;
-  for (i = 0; i < ndim; i++)
-  {
-    nSpan = dims [i];
-    nPass *= nSpan;
-    ret = FFTRADIX (Re, Im, nTotal, nSpan, nPass, iSign,
-                    max_factors, max_perm, fftstate);
-    /* exit, clean-up already done */
-    if (ret)
-      return ret;
-  }
-
-  /* Divide through by the normalizing constant: */
-  if (scaling && scaling != 1.0)
-  {
-    if (iSign < 0) iSign = -iSign;
-    if (scaling < 0.0)
-    {
-      scaling = (double)nTotal;
-      if (scaling < -1.0)
-        scaling = sqrt (scaling);
-    }
-    scaling = 1.0 / scaling; /* multiply is often faster */
-    for (i = 0; i < nTotal; i += iSign)
-    {
-      Re [i] *= scaling;
-      Im [i] *= scaling;
-    }
-  }
-  return 0;
-}
-
-/*
- * singleton's mixed radix routine
- *
- * could move allocation out to WebRtcIsac_Fftn(), but leave it here so that it's
- * possible to make this a standalone function
- */
-
-static int   FFTRADIX (REAL Re[],
-                       REAL Im[],
-                       size_t nTotal,
-                       size_t nPass,
-                       size_t nSpan,
-                       int iSign,
-                       int max_factors,
-                       unsigned int max_perm,
-                       FFTstr *fftstate)
-{
-  int ii, mfactor, kspan, ispan, inc;
-  int j, jc, jf, jj, k, k1, k2, k3, k4, kk, kt, nn, ns, nt;
-
-
-  REAL radf;
-  REAL c1, c2, c3, cd, aa, aj, ak, ajm, ajp, akm, akp;
-  REAL s1, s2, s3, sd, bb, bj, bk, bjm, bjp, bkm, bkp;
-
-  REAL *Rtmp = NULL; /* temp space for real part*/
-  REAL *Itmp = NULL; /* temp space for imaginary part */
-  REAL *Cos = NULL; /* Cosine values */
-  REAL *Sin = NULL; /* Sine values */
-
-  REAL s60 = SIN60;  /* sin(60 deg) */
-  REAL c72 = COS72;  /* cos(72 deg) */
-  REAL s72 = SIN72;  /* sin(72 deg) */
-  REAL pi2 = M_PI;  /* use PI first, 2 PI later */
-
-
-  fftstate->SpaceAlloced = 0;
-  fftstate->MaxPermAlloced = 0;
-
-
-  // initialize to avoid warnings
-  k3 = c2 = c3 = s2 = s3 = 0.0;
-
-  if (nPass < 2)
-    return 0;
-
-  /*  allocate storage */
-  if (fftstate->SpaceAlloced < max_factors * sizeof (REAL))
-  {
-#ifdef SUN_BROKEN_REALLOC
-    if (!fftstate->SpaceAlloced) /* first time */
-    {
-      fftstate->SpaceAlloced = max_factors * sizeof (REAL);
-    }
-    else
-    {
-#endif
-      fftstate->SpaceAlloced = max_factors * sizeof (REAL);
-#ifdef SUN_BROKEN_REALLOC
-    }
-#endif
-  }
-  else
-  {
-    /* allow full use of alloc'd space */
-    max_factors = fftstate->SpaceAlloced / sizeof (REAL);
-  }
-  if (fftstate->MaxPermAlloced < max_perm)
-  {
-#ifdef SUN_BROKEN_REALLOC
-    if (!fftstate->MaxPermAlloced) /* first time */
-    else
-#endif
-      fftstate->MaxPermAlloced = max_perm;
-  }
-  else
-  {
-    /* allow full use of alloc'd space */
-    max_perm = fftstate->MaxPermAlloced;
-  }
-
-  /* assign pointers */
-  Rtmp = (REAL *) fftstate->Tmp0;
-  Itmp = (REAL *) fftstate->Tmp1;
-  Cos  = (REAL *) fftstate->Tmp2;
-  Sin  = (REAL *) fftstate->Tmp3;
-
-  /*
-   * Function Body
-   */
-  inc = iSign;
-  if (iSign < 0) {
-    s72 = -s72;
-    s60 = -s60;
-    pi2 = -pi2;
-    inc = -inc;  /* absolute value */
-  }
-
-  /* adjust for strange increments */
-  nt = inc * (int)nTotal;
-  ns = inc * (int)nSpan;
-  kspan = ns;
-
-  nn = nt - inc;
-  jc = ns / (int)nPass;
-  radf = pi2 * (double) jc;
-  pi2 *= 2.0;   /* use 2 PI from here on */
-
-  ii = 0;
-  jf = 0;
-  /*  determine the factors of n */
-  mfactor = 0;
-  k = (int)nPass;
-  while (k % 16 == 0) {
-    mfactor++;
-    fftstate->factor [mfactor - 1] = 4;
-    k /= 16;
-  }
-  j = 3;
-  jj = 9;
-  do {
-    while (k % jj == 0) {
-      mfactor++;
-      fftstate->factor [mfactor - 1] = j;
-      k /= jj;
-    }
-    j += 2;
-    jj = j * j;
-  } while (jj <= k);
-  if (k <= 4) {
-    kt = mfactor;
-    fftstate->factor [mfactor] = k;
-    if (k != 1)
-      mfactor++;
-  } else {
-    if (k - (k / 4 << 2) == 0) {
-      mfactor++;
-      fftstate->factor [mfactor - 1] = 2;
-      k /= 4;
-    }
-    kt = mfactor;
-    j = 2;
-    do {
-      if (k % j == 0) {
-        mfactor++;
-        fftstate->factor [mfactor - 1] = j;
-        k /= j;
-      }
-      j = ((j + 1) / 2 << 1) + 1;
-    } while (j <= k);
-  }
-  if (kt) {
-    j = kt;
-    do {
-      mfactor++;
-      fftstate->factor [mfactor - 1] = fftstate->factor [j - 1];
-      j--;
-    } while (j);
-  }
-
-  /* test that mfactors is in range */
-  if (mfactor > NFACTOR)
-  {
-    return -1;
-  }
-
-  /* compute fourier transform */
-  for (;;) {
-    sd = radf / (double) kspan;
-    cd = sin(sd);
-    cd = 2.0 * cd * cd;
-    sd = sin(sd + sd);
-    kk = 0;
-    ii++;
-
-    switch (fftstate->factor [ii - 1]) {
-      case 2:
-        /* transform for factor of 2 (including rotation factor) */
-        kspan /= 2;
-        k1 = kspan + 2;
-        do {
-          do {
-            k2 = kk + kspan;
-            ak = Re [k2];
-            bk = Im [k2];
-            Re [k2] = Re [kk] - ak;
-            Im [k2] = Im [kk] - bk;
-            Re [kk] += ak;
-            Im [kk] += bk;
-            kk = k2 + kspan;
-          } while (kk < nn);
-          kk -= nn;
-        } while (kk < jc);
-        if (kk >= kspan)
-          goto Permute_Results_Label;  /* exit infinite loop */
-        do {
-          c1 = 1.0 - cd;
-          s1 = sd;
-          do {
-            do {
-              do {
-                k2 = kk + kspan;
-                ak = Re [kk] - Re [k2];
-                bk = Im [kk] - Im [k2];
-                Re [kk] += Re [k2];
-                Im [kk] += Im [k2];
-                Re [k2] = c1 * ak - s1 * bk;
-                Im [k2] = s1 * ak + c1 * bk;
-                kk = k2 + kspan;
-              } while (kk < (nt-1));
-              k2 = kk - nt;
-              c1 = -c1;
-              kk = k1 - k2;
-            } while (kk > k2);
-            ak = c1 - (cd * c1 + sd * s1);
-            s1 = sd * c1 - cd * s1 + s1;
-            c1 = 2.0 - (ak * ak + s1 * s1);
-            s1 *= c1;
-            c1 *= ak;
-            kk += jc;
-          } while (kk < k2);
-          k1 += inc + inc;
-          kk = (k1 - kspan + 1) / 2 + jc - 1;
-        } while (kk < (jc + jc));
-        break;
-
-      case 4:   /* transform for factor of 4 */
-        ispan = kspan;
-        kspan /= 4;
-
-        do {
-          c1 = 1.0;
-          s1 = 0.0;
-          do {
-            do {
-              k1 = kk + kspan;
-              k2 = k1 + kspan;
-              k3 = k2 + kspan;
-              akp = Re [kk] + Re [k2];
-              akm = Re [kk] - Re [k2];
-              ajp = Re [k1] + Re [k3];
-              ajm = Re [k1] - Re [k3];
-              bkp = Im [kk] + Im [k2];
-              bkm = Im [kk] - Im [k2];
-              bjp = Im [k1] + Im [k3];
-              bjm = Im [k1] - Im [k3];
-              Re [kk] = akp + ajp;
-              Im [kk] = bkp + bjp;
-              ajp = akp - ajp;
-              bjp = bkp - bjp;
-              if (iSign < 0) {
-                akp = akm + bjm;
-                bkp = bkm - ajm;
-                akm -= bjm;
-                bkm += ajm;
-              } else {
-                akp = akm - bjm;
-                bkp = bkm + ajm;
-                akm += bjm;
-                bkm -= ajm;
-              }
-              /* avoid useless multiplies */
-              if (s1 == 0.0) {
-                Re [k1] = akp;
-                Re [k2] = ajp;
-                Re [k3] = akm;
-                Im [k1] = bkp;
-                Im [k2] = bjp;
-                Im [k3] = bkm;
-              } else {
-                Re [k1] = akp * c1 - bkp * s1;
-                Re [k2] = ajp * c2 - bjp * s2;
-                Re [k3] = akm * c3 - bkm * s3;
-                Im [k1] = akp * s1 + bkp * c1;
-                Im [k2] = ajp * s2 + bjp * c2;
-                Im [k3] = akm * s3 + bkm * c3;
-              }
-              kk = k3 + kspan;
-            } while (kk < nt);
-
-            c2 = c1 - (cd * c1 + sd * s1);
-            s1 = sd * c1 - cd * s1 + s1;
-            c1 = 2.0 - (c2 * c2 + s1 * s1);
-            s1 *= c1;
-            c1 *= c2;
-            /* values of c2, c3, s2, s3 that will get used next time */
-            c2 = c1 * c1 - s1 * s1;
-            s2 = 2.0 * c1 * s1;
-            c3 = c2 * c1 - s2 * s1;
-            s3 = c2 * s1 + s2 * c1;
-            kk = kk - nt + jc;
-          } while (kk < kspan);
-          kk = kk - kspan + inc;
-        } while (kk < jc);
-        if (kspan == jc)
-          goto Permute_Results_Label;  /* exit infinite loop */
-        break;
-
-      default:
-        /*  transform for odd factors */
-#ifdef FFT_RADIX4
-        return -1;
-        break;
-#else /* FFT_RADIX4 */
-        k = fftstate->factor [ii - 1];
-        ispan = kspan;
-        kspan /= k;
-
-        switch (k) {
-          case 3: /* transform for factor of 3 (optional code) */
-            do {
-              do {
-                k1 = kk + kspan;
-                k2 = k1 + kspan;
-                ak = Re [kk];
-                bk = Im [kk];
-                aj = Re [k1] + Re [k2];
-                bj = Im [k1] + Im [k2];
-                Re [kk] = ak + aj;
-                Im [kk] = bk + bj;
-                ak -= 0.5 * aj;
-                bk -= 0.5 * bj;
-                aj = (Re [k1] - Re [k2]) * s60;
-                bj = (Im [k1] - Im [k2]) * s60;
-                Re [k1] = ak - bj;
-                Re [k2] = ak + bj;
-                Im [k1] = bk + aj;
-                Im [k2] = bk - aj;
-                kk = k2 + kspan;
-              } while (kk < (nn - 1));
-              kk -= nn;
-            } while (kk < kspan);
-            break;
-
-          case 5: /*  transform for factor of 5 (optional code) */
-            c2 = c72 * c72 - s72 * s72;
-            s2 = 2.0 * c72 * s72;
-            do {
-              do {
-                k1 = kk + kspan;
-                k2 = k1 + kspan;
-                k3 = k2 + kspan;
-                k4 = k3 + kspan;
-                akp = Re [k1] + Re [k4];
-                akm = Re [k1] - Re [k4];
-                bkp = Im [k1] + Im [k4];
-                bkm = Im [k1] - Im [k4];
-                ajp = Re [k2] + Re [k3];
-                ajm = Re [k2] - Re [k3];
-                bjp = Im [k2] + Im [k3];
-                bjm = Im [k2] - Im [k3];
-                aa = Re [kk];
-                bb = Im [kk];
-                Re [kk] = aa + akp + ajp;
-                Im [kk] = bb + bkp + bjp;
-                ak = akp * c72 + ajp * c2 + aa;
-                bk = bkp * c72 + bjp * c2 + bb;
-                aj = akm * s72 + ajm * s2;
-                bj = bkm * s72 + bjm * s2;
-                Re [k1] = ak - bj;
-                Re [k4] = ak + bj;
-                Im [k1] = bk + aj;
-                Im [k4] = bk - aj;
-                ak = akp * c2 + ajp * c72 + aa;
-                bk = bkp * c2 + bjp * c72 + bb;
-                aj = akm * s2 - ajm * s72;
-                bj = bkm * s2 - bjm * s72;
-                Re [k2] = ak - bj;
-                Re [k3] = ak + bj;
-                Im [k2] = bk + aj;
-                Im [k3] = bk - aj;
-                kk = k4 + kspan;
-              } while (kk < (nn-1));
-              kk -= nn;
-            } while (kk < kspan);
-            break;
-
-          default:
-            if (k != jf) {
-              jf = k;
-              s1 = pi2 / (double) k;
-              c1 = cos(s1);
-              s1 = sin(s1);
-              if (jf > max_factors){
-                return -1;
-              }
-              Cos [jf - 1] = 1.0;
-              Sin [jf - 1] = 0.0;
-              j = 1;
-              do {
-                Cos [j - 1] = Cos [k - 1] * c1 + Sin [k - 1] * s1;
-                Sin [j - 1] = Cos [k - 1] * s1 - Sin [k - 1] * c1;
-                k--;
-                Cos [k - 1] = Cos [j - 1];
-                Sin [k - 1] = -Sin [j - 1];
-                j++;
-              } while (j < k);
-            }
-            do {
-              do {
-                k1 = kk;
-                k2 = kk + ispan;
-                ak = aa = Re [kk];
-                bk = bb = Im [kk];
-                j = 1;
-                k1 += kspan;
-                do {
-                  k2 -= kspan;
-                  j++;
-                  Rtmp [j - 1] = Re [k1] + Re [k2];
-                  ak += Rtmp [j - 1];
-                  Itmp [j - 1] = Im [k1] + Im [k2];
-                  bk += Itmp [j - 1];
-                  j++;
-                  Rtmp [j - 1] = Re [k1] - Re [k2];
-                  Itmp [j - 1] = Im [k1] - Im [k2];
-                  k1 += kspan;
-                } while (k1 < k2);
-                Re [kk] = ak;
-                Im [kk] = bk;
-                k1 = kk;
-                k2 = kk + ispan;
-                j = 1;
-                do {
-                  k1 += kspan;
-                  k2 -= kspan;
-                  jj = j;
-                  ak = aa;
-                  bk = bb;
-                  aj = 0.0;
-                  bj = 0.0;
-                  k = 1;
-                  do {
-                    k++;
-                    ak += Rtmp [k - 1] * Cos [jj - 1];
-                    bk += Itmp [k - 1] * Cos [jj - 1];
-                    k++;
-                    aj += Rtmp [k - 1] * Sin [jj - 1];
-                    bj += Itmp [k - 1] * Sin [jj - 1];
-                    jj += j;
-                    if (jj > jf) {
-                      jj -= jf;
-                    }
-                  } while (k < jf);
-                  k = jf - j;
-                  Re [k1] = ak - bj;
-                  Im [k1] = bk + aj;
-                  Re [k2] = ak + bj;
-                  Im [k2] = bk - aj;
-                  j++;
-                } while (j < k);
-                kk += ispan;
-              } while (kk < nn);
-              kk -= nn;
-            } while (kk < kspan);
-            break;
-        }
-
-        /*  multiply by rotation factor (except for factors of 2 and 4) */
-        if (ii == mfactor)
-          goto Permute_Results_Label;  /* exit infinite loop */
-        kk = jc;
-        do {
-          c2 = 1.0 - cd;
-          s1 = sd;
-          do {
-            c1 = c2;
-            s2 = s1;
-            kk += kspan;
-            do {
-              do {
-                ak = Re [kk];
-                Re [kk] = c2 * ak - s2 * Im [kk];
-                Im [kk] = s2 * ak + c2 * Im [kk];
-                kk += ispan;
-              } while (kk < nt);
-              ak = s1 * s2;
-              s2 = s1 * c2 + c1 * s2;
-              c2 = c1 * c2 - ak;
-              kk = kk - nt + kspan;
-            } while (kk < ispan);
-            c2 = c1 - (cd * c1 + sd * s1);
-            s1 += sd * c1 - cd * s1;
-            c1 = 2.0 - (c2 * c2 + s1 * s1);
-            s1 *= c1;
-            c2 *= c1;
-            kk = kk - ispan + jc;
-          } while (kk < kspan);
-          kk = kk - kspan + jc + inc;
-        } while (kk < (jc + jc));
-        break;
-#endif /* FFT_RADIX4 */
-    }
-  }
-
-  /*  permute the results to normal order---done in two stages */
-  /*  permutation for square factors of n */
-Permute_Results_Label:
-  fftstate->Perm [0] = ns;
-  if (kt) {
-    k = kt + kt + 1;
-    if (mfactor < k)
-      k--;
-    j = 1;
-    fftstate->Perm [k] = jc;
-    do {
-      fftstate->Perm [j] = fftstate->Perm [j - 1] / fftstate->factor [j - 1];
-      fftstate->Perm [k - 1] = fftstate->Perm [k] * fftstate->factor [j - 1];
-      j++;
-      k--;
-    } while (j < k);
-    k3 = fftstate->Perm [k];
-    kspan = fftstate->Perm [1];
-    kk = jc;
-    k2 = kspan;
-    j = 1;
-    if (nPass != nTotal) {
-      /*  permutation for multivariate transform */
-   Permute_Multi_Label:
-      do {
-        do {
-          k = kk + jc;
-          do {
-            /* swap Re [kk] <> Re [k2], Im [kk] <> Im [k2] */
-            ak = Re [kk]; Re [kk] = Re [k2]; Re [k2] = ak;
-            bk = Im [kk]; Im [kk] = Im [k2]; Im [k2] = bk;
-            kk += inc;
-            k2 += inc;
-          } while (kk < (k-1));
-          kk += ns - jc;
-          k2 += ns - jc;
-        } while (kk < (nt-1));
-        k2 = k2 - nt + kspan;
-        kk = kk - nt + jc;
-      } while (k2 < (ns-1));
-      do {
-        do {
-          k2 -= fftstate->Perm [j - 1];
-          j++;
-          k2 = fftstate->Perm [j] + k2;
-        } while (k2 > fftstate->Perm [j - 1]);
-        j = 1;
-        do {
-          if (kk < (k2-1))
-            goto Permute_Multi_Label;
-          kk += jc;
-          k2 += kspan;
-        } while (k2 < (ns-1));
-      } while (kk < (ns-1));
-    } else {
-      /*  permutation for single-variate transform (optional code) */
-   Permute_Single_Label:
-      do {
-        /* swap Re [kk] <> Re [k2], Im [kk] <> Im [k2] */
-        ak = Re [kk]; Re [kk] = Re [k2]; Re [k2] = ak;
-        bk = Im [kk]; Im [kk] = Im [k2]; Im [k2] = bk;
-        kk += inc;
-        k2 += kspan;
-      } while (k2 < (ns-1));
-      do {
-        do {
-          k2 -= fftstate->Perm [j - 1];
-          j++;
-          k2 = fftstate->Perm [j] + k2;
-        } while (k2 >= fftstate->Perm [j - 1]);
-        j = 1;
-        do {
-          if (kk < k2)
-            goto Permute_Single_Label;
-          kk += inc;
-          k2 += kspan;
-        } while (k2 < (ns-1));
-      } while (kk < (ns-1));
-    }
-    jc = k3;
-  }
-
-  if ((kt << 1) + 1 >= mfactor)
-    return 0;
-  ispan = fftstate->Perm [kt];
-  /* permutation for square-free factors of n */
-  j = mfactor - kt;
-  fftstate->factor [j] = 1;
-  do {
-    fftstate->factor [j - 1] *= fftstate->factor [j];
-    j--;
-  } while (j != kt);
-  kt++;
-  nn = fftstate->factor [kt - 1] - 1;
-  if (nn > (int) max_perm) {
-    return -1;
-  }
-  j = jj = 0;
-  for (;;) {
-    k = kt + 1;
-    k2 = fftstate->factor [kt - 1];
-    kk = fftstate->factor [k - 1];
-    j++;
-    if (j > nn)
-      break;    /* exit infinite loop */
-    jj += kk;
-    while (jj >= k2) {
-      jj -= k2;
-      k2 = kk;
-      k++;
-      kk = fftstate->factor [k - 1];
-      jj += kk;
-    }
-    fftstate->Perm [j - 1] = jj;
-  }
-  /*  determine the permutation cycles of length greater than 1 */
-  j = 0;
-  for (;;) {
-    do {
-      j++;
-      kk = fftstate->Perm [j - 1];
-    } while (kk < 0);
-    if (kk != j) {
-      do {
-        k = kk;
-        kk = fftstate->Perm [k - 1];
-        fftstate->Perm [k - 1] = -kk;
-      } while (kk != j);
-      k3 = kk;
-    } else {
-      fftstate->Perm [j - 1] = -j;
-      if (j == nn)
-        break;  /* exit infinite loop */
-    }
-  }
-  max_factors *= inc;
-  /*  reorder a and b, following the permutation cycles */
-  for (;;) {
-    j = k3 + 1;
-    nt -= ispan;
-    ii = nt - inc + 1;
-    if (nt < 0)
-      break;   /* exit infinite loop */
-    do {
-      do {
-        j--;
-      } while (fftstate->Perm [j - 1] < 0);
-      jj = jc;
-      do {
-        kspan = jj;
-        if (jj > max_factors) {
-          kspan = max_factors;
-        }
-        jj -= kspan;
-        k = fftstate->Perm [j - 1];
-        kk = jc * k + ii + jj;
-        k1 = kk + kspan - 1;
-        k2 = 0;
-        do {
-          k2++;
-          Rtmp [k2 - 1] = Re [k1];
-          Itmp [k2 - 1] = Im [k1];
-          k1 -= inc;
-        } while (k1 != (kk-1));
-        do {
-          k1 = kk + kspan - 1;
-          k2 = k1 - jc * (k + fftstate->Perm [k - 1]);
-          k = -fftstate->Perm [k - 1];
-          do {
-            Re [k1] = Re [k2];
-            Im [k1] = Im [k2];
-            k1 -= inc;
-            k2 -= inc;
-          } while (k1 != (kk-1));
-          kk = k2 + 1;
-        } while (k != j);
-        k1 = kk + kspan - 1;
-        k2 = 0;
-        do {
-          k2++;
-          Re [k1] = Rtmp [k2 - 1];
-          Im [k1] = Itmp [k2 - 1];
-          k1 -= inc;
-        } while (k1 != (kk-1));
-      } while (jj);
-    } while (j != 1);
-  }
-  return 0;   /* exit point here */
-}
-/* ---------------------- end-of-file (c source) ---------------------- */
-
diff --git a/modules/audio_coding/codecs/isac/main/source/fft.h b/modules/audio_coding/codecs/isac/main/source/fft.h
deleted file mode 100644
index a42f57b..0000000
--- a/modules/audio_coding/codecs/isac/main/source/fft.h
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/*--------------------------------*-C-*---------------------------------*
- * File:
- *       fftn.h
- * ---------------------------------------------------------------------*
- * Re[]:        real value array
- * Im[]:        imaginary value array
- * nTotal:      total number of complex values
- * nPass:       number of elements involved in this pass of transform
- * nSpan:       nspan/nPass = number of bytes to increment pointer
- *              in Re[] and Im[]
- * isign: exponent: +1 = forward  -1 = reverse
- * scaling: normalizing constant by which the final result is *divided*
- * scaling == -1, normalize by total dimension of the transform
- * scaling <  -1, normalize by the square-root of the total dimension
- *
- * ----------------------------------------------------------------------
- * See the comments in the code for correct usage!
- */
-
-#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_MAIN_SOURCE_FFT_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_MAIN_SOURCE_FFT_H_
-
-
-#include "structs.h"
-
-
-/* double precision routine */
-
-
-int WebRtcIsac_Fftns (unsigned int ndim, const int dims[], double Re[], double Im[],
-                     int isign, double scaling, FFTstr *fftstate);
-
-
-
-#endif /* WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_MAIN_SOURCE_FFT_H_ */
diff --git a/modules/audio_coding/codecs/isac/main/source/filter_functions.c b/modules/audio_coding/codecs/isac/main/source/filter_functions.c
deleted file mode 100644
index d47eb1f..0000000
--- a/modules/audio_coding/codecs/isac/main/source/filter_functions.c
+++ /dev/null
@@ -1,263 +0,0 @@
-/*
- *  Copyright (c) 2011 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 <memory.h>
-#include <string.h>
-#ifdef WEBRTC_ANDROID
-#include <stdlib.h>
-#endif
-#include "pitch_estimator.h"
-#include "lpc_analysis.h"
-#include "codec.h"
-
-
-
-void WebRtcIsac_AllPoleFilter(double* InOut,
-                              double* Coef,
-                              size_t lengthInOut,
-                              int orderCoef) {
-  /* the state of filter is assumed to be in InOut[-1] to InOut[-orderCoef] */
-  double scal;
-  double sum;
-  size_t n;
-  int k;
-
-  //if (fabs(Coef[0]-1.0)<0.001) {
-  if ( (Coef[0] > 0.9999) && (Coef[0] < 1.0001) )
-  {
-    for(n = 0; n < lengthInOut; n++)
-    {
-      sum = Coef[1] * InOut[-1];
-      for(k = 2; k <= orderCoef; k++){
-        sum += Coef[k] * InOut[-k];
-      }
-      *InOut++ -= sum;
-    }
-  }
-  else
-  {
-    scal = 1.0 / Coef[0];
-    for(n=0;n<lengthInOut;n++)
-    {
-      *InOut *= scal;
-      for(k=1;k<=orderCoef;k++){
-        *InOut -= scal*Coef[k]*InOut[-k];
-      }
-      InOut++;
-    }
-  }
-}
-
-
-void WebRtcIsac_AllZeroFilter(double* In,
-                              double* Coef,
-                              size_t lengthInOut,
-                              int orderCoef,
-                              double* Out) {
-  /* the state of filter is assumed to be in In[-1] to In[-orderCoef] */
-
-  size_t n;
-  int k;
-  double tmp;
-
-  for(n = 0; n < lengthInOut; n++)
-  {
-    tmp = In[0] * Coef[0];
-
-    for(k = 1; k <= orderCoef; k++){
-      tmp += Coef[k] * In[-k];
-    }
-
-    *Out++ = tmp;
-    In++;
-  }
-}
-
-
-void WebRtcIsac_ZeroPoleFilter(double* In,
-                               double* ZeroCoef,
-                               double* PoleCoef,
-                               size_t lengthInOut,
-                               int orderCoef,
-                               double* Out) {
-  /* the state of the zero section is assumed to be in In[-1] to In[-orderCoef] */
-  /* the state of the pole section is assumed to be in Out[-1] to Out[-orderCoef] */
-
-  WebRtcIsac_AllZeroFilter(In,ZeroCoef,lengthInOut,orderCoef,Out);
-  WebRtcIsac_AllPoleFilter(Out,PoleCoef,lengthInOut,orderCoef);
-}
-
-
-void WebRtcIsac_AutoCorr(double* r, const double* x, size_t N, size_t order) {
-  size_t  lag, n;
-  double sum, prod;
-  const double *x_lag;
-
-  for (lag = 0; lag <= order; lag++)
-  {
-    sum = 0.0f;
-    x_lag = &x[lag];
-    prod = x[0] * x_lag[0];
-    for (n = 1; n < N - lag; n++) {
-      sum += prod;
-      prod = x[n] * x_lag[n];
-    }
-    sum += prod;
-    r[lag] = sum;
-  }
-
-}
-
-
-void WebRtcIsac_BwExpand(double* out, double* in, double coef, size_t length) {
-  size_t i;
-  double  chirp;
-
-  chirp = coef;
-
-  out[0] = in[0];
-  for (i = 1; i < length; i++) {
-    out[i] = chirp * in[i];
-    chirp *= coef;
-  }
-}
-
-void WebRtcIsac_WeightingFilter(const double* in,
-                                double* weiout,
-                                double* whiout,
-                                WeightFiltstr* wfdata) {
-  double  tmpbuffer[PITCH_FRAME_LEN + PITCH_WLPCBUFLEN];
-  double  corr[PITCH_WLPCORDER+1], rc[PITCH_WLPCORDER+1];
-  double apol[PITCH_WLPCORDER+1], apolr[PITCH_WLPCORDER+1];
-  double  rho=0.9, *inp, *dp, *dp2;
-  double  whoutbuf[PITCH_WLPCBUFLEN + PITCH_WLPCORDER];
-  double  weoutbuf[PITCH_WLPCBUFLEN + PITCH_WLPCORDER];
-  double  *weo, *who, opol[PITCH_WLPCORDER+1], ext[PITCH_WLPCWINLEN];
-  int     k, n, endpos, start;
-
-  /* Set up buffer and states */
-  memcpy(tmpbuffer, wfdata->buffer, sizeof(double) * PITCH_WLPCBUFLEN);
-  memcpy(tmpbuffer+PITCH_WLPCBUFLEN, in, sizeof(double) * PITCH_FRAME_LEN);
-  memcpy(wfdata->buffer, tmpbuffer+PITCH_FRAME_LEN, sizeof(double) * PITCH_WLPCBUFLEN);
-
-  dp=weoutbuf;
-  dp2=whoutbuf;
-  for (k=0;k<PITCH_WLPCORDER;k++) {
-    *dp++ = wfdata->weostate[k];
-    *dp2++ = wfdata->whostate[k];
-    opol[k]=0.0;
-  }
-  opol[0]=1.0;
-  opol[PITCH_WLPCORDER]=0.0;
-  weo=dp;
-  who=dp2;
-
-  endpos=PITCH_WLPCBUFLEN + PITCH_SUBFRAME_LEN;
-  inp=tmpbuffer + PITCH_WLPCBUFLEN;
-
-  for (n=0; n<PITCH_SUBFRAMES; n++) {
-    /* Windowing */
-    start=endpos-PITCH_WLPCWINLEN;
-    for (k=0; k<PITCH_WLPCWINLEN; k++) {
-      ext[k]=wfdata->window[k]*tmpbuffer[start+k];
-    }
-
-    /* Get LPC polynomial */
-    WebRtcIsac_AutoCorr(corr, ext, PITCH_WLPCWINLEN, PITCH_WLPCORDER);
-    corr[0]=1.01*corr[0]+1.0; /* White noise correction */
-    WebRtcIsac_LevDurb(apol, rc, corr, PITCH_WLPCORDER);
-    WebRtcIsac_BwExpand(apolr, apol, rho, PITCH_WLPCORDER+1);
-
-    /* Filtering */
-    WebRtcIsac_ZeroPoleFilter(inp, apol, apolr, PITCH_SUBFRAME_LEN, PITCH_WLPCORDER, weo);
-    WebRtcIsac_ZeroPoleFilter(inp, apolr, opol, PITCH_SUBFRAME_LEN, PITCH_WLPCORDER, who);
-
-    inp+=PITCH_SUBFRAME_LEN;
-    endpos+=PITCH_SUBFRAME_LEN;
-    weo+=PITCH_SUBFRAME_LEN;
-    who+=PITCH_SUBFRAME_LEN;
-  }
-
-  /* Export filter states */
-  for (k=0;k<PITCH_WLPCORDER;k++) {
-    wfdata->weostate[k]=weoutbuf[PITCH_FRAME_LEN+k];
-    wfdata->whostate[k]=whoutbuf[PITCH_FRAME_LEN+k];
-  }
-
-  /* Export output data */
-  memcpy(weiout, weoutbuf+PITCH_WLPCORDER, sizeof(double) * PITCH_FRAME_LEN);
-  memcpy(whiout, whoutbuf+PITCH_WLPCORDER, sizeof(double) * PITCH_FRAME_LEN);
-}
-
-
-static const double APupper[ALLPASSSECTIONS] = {0.0347, 0.3826};
-static const double APlower[ALLPASSSECTIONS] = {0.1544, 0.744};
-
-
-void WebRtcIsac_AllpassFilterForDec(double* InOut,
-                                    const double* APSectionFactors,
-                                    size_t lengthInOut,
-                                    double* FilterState) {
-  //This performs all-pass filtering--a series of first order all-pass sections are used
-  //to filter the input in a cascade manner.
-  size_t n,j;
-  double temp;
-  for (j=0; j<ALLPASSSECTIONS; j++){
-    for (n=0;n<lengthInOut;n+=2){
-      temp = InOut[n]; //store input
-      InOut[n] = FilterState[j] + APSectionFactors[j]*temp;
-      FilterState[j] = -APSectionFactors[j]*InOut[n] + temp;
-    }
-  }
-}
-
-void WebRtcIsac_DecimateAllpass(const double* in,
-                                double* state_in,
-                                size_t N,
-                                double* out) {
-  size_t n;
-  double data_vec[PITCH_FRAME_LEN];
-
-  /* copy input */
-  memcpy(data_vec+1, in, sizeof(double) * (N-1));
-
-  data_vec[0] = state_in[2*ALLPASSSECTIONS];   //the z^(-1) state
-  state_in[2*ALLPASSSECTIONS] = in[N-1];
-
-  WebRtcIsac_AllpassFilterForDec(data_vec+1, APupper, N, state_in);
-  WebRtcIsac_AllpassFilterForDec(data_vec, APlower, N, state_in+ALLPASSSECTIONS);
-
-  for (n=0;n<N/2;n++)
-    out[n] = data_vec[2*n] + data_vec[2*n+1];
-
-}
-
-
-/* create high-pass filter ocefficients
- * z = 0.998 * exp(j*2*pi*35/8000);
- * p = 0.94 * exp(j*2*pi*140/8000);
- * HP_b = [1, -2*real(z), abs(z)^2];
- * HP_a = [1, -2*real(p), abs(p)^2]; */
-static const double a_coef[2] = { 1.86864659625574, -0.88360000000000};
-static const double b_coef[2] = {-1.99524591718270,  0.99600400000000};
-
-/* second order high-pass filter */
-void WebRtcIsac_Highpass(const double* in,
-                         double* out,
-                         double* state,
-                         size_t N) {
-  size_t k;
-
-  for (k=0; k<N; k++) {
-    *out = *in + state[1];
-    state[1] = state[0] + b_coef[0] * *in + a_coef[0] * *out;
-    state[0] = b_coef[1] * *in++ + a_coef[1] * *out++;
-  }
-}
diff --git a/modules/audio_coding/codecs/isac/main/source/filterbank_tables.c b/modules/audio_coding/codecs/isac/main/source/filterbank_tables.c
deleted file mode 100644
index 0f844af..0000000
--- a/modules/audio_coding/codecs/isac/main/source/filterbank_tables.c
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/* filterbank_tables.c*/
-/* This file contains variables that are used in filterbanks.c*/
-
-#include "filterbank_tables.h"
-#include "settings.h"
-
-/* The composite all-pass filter factors */
-const float WebRtcIsac_kCompositeApFactorsFloat[4] = {
- 0.03470000000000f,  0.15440000000000f,  0.38260000000000f,  0.74400000000000f};
-
-/* The upper channel all-pass filter factors */
-const float WebRtcIsac_kUpperApFactorsFloat[2] = {
- 0.03470000000000f,  0.38260000000000f};
-
-/* The lower channel all-pass filter factors */
-const float WebRtcIsac_kLowerApFactorsFloat[2] = {
- 0.15440000000000f,  0.74400000000000f};
-
-/* The matrix for transforming the backward composite state to upper channel state */
-const float WebRtcIsac_kTransform1Float[8] = {
-  -0.00158678506084f,  0.00127157815343f, -0.00104805672709f,  0.00084837248079f,
-  0.00134467983258f, -0.00107756549387f,  0.00088814793277f, -0.00071893072525f};
-
-/* The matrix for transforming the backward composite state to lower channel state */
-const float WebRtcIsac_kTransform2Float[8] = {
- -0.00170686041697f,  0.00136780109829f, -0.00112736532350f,  0.00091257055385f,
-  0.00103094281812f, -0.00082615076557f,  0.00068092756088f, -0.00055119165484f};
diff --git a/modules/audio_coding/codecs/isac/main/source/filterbank_tables.h b/modules/audio_coding/codecs/isac/main/source/filterbank_tables.h
deleted file mode 100644
index e8fda5e..0000000
--- a/modules/audio_coding/codecs/isac/main/source/filterbank_tables.h
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/*
- * filterbank_tables.h
- *
- * Header file for variables that are defined in
- * filterbank_tables.c.
- *
- */
-
-#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_MAIN_SOURCE_FILTERBANK_TABLES_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_MAIN_SOURCE_FILTERBANK_TABLES_H_
-
-#include "structs.h"
-
-/********************* Coefficient Tables ************************/
-/* The number of composite all-pass filter factors */
-#define NUMBEROFCOMPOSITEAPSECTIONS 4
-
-/* The number of all-pass filter factors in an upper or lower channel*/
-#define NUMBEROFCHANNELAPSECTIONS 2
-
-/* The composite all-pass filter factors */
-extern const float WebRtcIsac_kCompositeApFactorsFloat[4];
-
-/* The upper channel all-pass filter factors */
-extern const float WebRtcIsac_kUpperApFactorsFloat[2];
-
-/* The lower channel all-pass filter factors */
-extern const float WebRtcIsac_kLowerApFactorsFloat[2];
-
-/* The matrix for transforming the backward composite state to upper channel state */
-extern const float WebRtcIsac_kTransform1Float[8];
-
-/* The matrix for transforming the backward composite state to lower channel state */
-extern const float WebRtcIsac_kTransform2Float[8];
-
-#endif /* WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_MAIN_SOURCE_FILTERBANK_TABLES_H_ */
diff --git a/modules/audio_coding/codecs/isac/main/source/filterbanks.c b/modules/audio_coding/codecs/isac/main/source/filterbanks.c
deleted file mode 100644
index 671fd32..0000000
--- a/modules/audio_coding/codecs/isac/main/source/filterbanks.c
+++ /dev/null
@@ -1,346 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/*
- * filterbanks.c
- *
- * This file contains function WebRtcIsac_AllPassFilter2Float,
- * WebRtcIsac_SplitAndFilter, and WebRtcIsac_FilterAndCombine
- * which implement filterbanks that produce decimated lowpass and
- * highpass versions of a signal, and performs reconstruction.
- *
- */
-
-#include "settings.h"
-#include "filterbank_tables.h"
-#include "codec.h"
-
-/* This function performs all-pass filtering--a series of first order all-pass
- * sections are used to filter the input in a cascade manner.
- * The input is overwritten!!
- */
-static void WebRtcIsac_AllPassFilter2Float(float *InOut, const float *APSectionFactors,
-                                           int lengthInOut, int NumberOfSections,
-                                           float *FilterState)
-{
-  int n, j;
-  float temp;
-  for (j=0; j<NumberOfSections; j++){
-    for (n=0;n<lengthInOut;n++){
-      temp = FilterState[j] + APSectionFactors[j] * InOut[n];
-      FilterState[j] = -APSectionFactors[j] * temp + InOut[n];
-      InOut[n] = temp;
-    }
-  }
-}
-
-/* HPstcoeff_in = {a1, a2, b1 - b0 * a1, b2 - b0 * a2}; */
-static const float kHpStCoefInFloat[4] =
-{-1.94895953203325f, 0.94984516000000f, -0.05101826139794f, 0.05015484000000f};
-
-/* Function WebRtcIsac_SplitAndFilter
- * This function creates low-pass and high-pass decimated versions of part of
- the input signal, and part of the signal in the input 'lookahead buffer'.
-
- INPUTS:
- in: a length FRAMESAMPLES array of input samples
- prefiltdata: input data structure containing the filterbank states
- and lookahead samples from the previous encoding
- iteration.
- OUTPUTS:
- LP: a FRAMESAMPLES_HALF array of low-pass filtered samples that
- have been phase equalized.  The first QLOOKAHEAD samples are
- based on the samples in the two prefiltdata->INLABUFx arrays
- each of length QLOOKAHEAD.
- The remaining FRAMESAMPLES_HALF-QLOOKAHEAD samples are based
- on the first FRAMESAMPLES_HALF-QLOOKAHEAD samples of the input
- array in[].
- HP: a FRAMESAMPLES_HALF array of high-pass filtered samples that
- have been phase equalized.  The first QLOOKAHEAD samples are
- based on the samples in the two prefiltdata->INLABUFx arrays
- each of length QLOOKAHEAD.
- The remaining FRAMESAMPLES_HALF-QLOOKAHEAD samples are based
- on the first FRAMESAMPLES_HALF-QLOOKAHEAD samples of the input
- array in[].
-
- LP_la: a FRAMESAMPLES_HALF array of low-pass filtered samples.
- These samples are not phase equalized. They are computed
- from the samples in the in[] array.
- HP_la: a FRAMESAMPLES_HALF array of high-pass filtered samples
- that are not phase equalized. They are computed from
- the in[] vector.
- prefiltdata: this input data structure's filterbank state and
- lookahead sample buffers are updated for the next
- encoding iteration.
-*/
-void WebRtcIsac_SplitAndFilterFloat(float *pin, float *LP, float *HP,
-                                    double *LP_la, double *HP_la,
-                                    PreFiltBankstr *prefiltdata)
-{
-  int k,n;
-  float CompositeAPFilterState[NUMBEROFCOMPOSITEAPSECTIONS];
-  float ForTransform_CompositeAPFilterState[NUMBEROFCOMPOSITEAPSECTIONS];
-  float ForTransform_CompositeAPFilterState2[NUMBEROFCOMPOSITEAPSECTIONS];
-  float tempinoutvec[FRAMESAMPLES+MAX_AR_MODEL_ORDER];
-  float tempin_ch1[FRAMESAMPLES+MAX_AR_MODEL_ORDER];
-  float tempin_ch2[FRAMESAMPLES+MAX_AR_MODEL_ORDER];
-  float in[FRAMESAMPLES];
-  float ftmp;
-
-
-  /* High pass filter */
-
-  for (k=0;k<FRAMESAMPLES;k++) {
-    in[k] = pin[k] + kHpStCoefInFloat[2] * prefiltdata->HPstates_float[0] +
-        kHpStCoefInFloat[3] * prefiltdata->HPstates_float[1];
-    ftmp = pin[k] - kHpStCoefInFloat[0] * prefiltdata->HPstates_float[0] -
-        kHpStCoefInFloat[1] * prefiltdata->HPstates_float[1];
-    prefiltdata->HPstates_float[1] = prefiltdata->HPstates_float[0];
-    prefiltdata->HPstates_float[0] = ftmp;
-  }
-
-  /*
-    % backwards all-pass filtering to obtain zero-phase
-    [tmp1(N2+LA:-1:LA+1, 1), state1] = filter(Q.coef, Q.coef(end:-1:1), in(N:-2:2));
-    tmp1(LA:-1:1) = filter(Q.coef, Q.coef(end:-1:1), Q.LookAheadBuf1, state1);
-    Q.LookAheadBuf1 = in(N:-2:N-2*LA+2);
-  */
-  /*Backwards all-pass filter the odd samples of the input (upper channel)
-    to eventually obtain zero phase.  The composite all-pass filter (comprised of both
-    the upper and lower channel all-pass filsters in series) is used for the
-    filtering. */
-
-  /* First Channel */
-
-  /*initial state of composite filter is zero */
-  for (k=0;k<NUMBEROFCOMPOSITEAPSECTIONS;k++){
-    CompositeAPFilterState[k] = 0.0;
-  }
-  /* put every other sample of input into a temporary vector in reverse (backward) order*/
-  for (k=0;k<FRAMESAMPLES_HALF;k++) {
-    tempinoutvec[k] = in[FRAMESAMPLES-1-2*k];
-  }
-
-  /* now all-pass filter the backwards vector.  Output values overwrite the input vector. */
-  WebRtcIsac_AllPassFilter2Float(tempinoutvec, WebRtcIsac_kCompositeApFactorsFloat,
-                                 FRAMESAMPLES_HALF, NUMBEROFCOMPOSITEAPSECTIONS, CompositeAPFilterState);
-
-  /* save the backwards filtered output for later forward filtering,
-     but write it in forward order*/
-  for (k=0;k<FRAMESAMPLES_HALF;k++) {
-    tempin_ch1[FRAMESAMPLES_HALF+QLOOKAHEAD-1-k] = tempinoutvec[k];
-  }
-
-  /* save the backwards filter state  becaue it will be transformed
-     later into a forward state */
-  for (k=0; k<NUMBEROFCOMPOSITEAPSECTIONS; k++) {
-    ForTransform_CompositeAPFilterState[k] = CompositeAPFilterState[k];
-  }
-
-  /* now backwards filter the samples in the lookahead buffer. The samples were
-     placed there in the encoding of the previous frame.  The output samples
-     overwrite the input samples */
-  WebRtcIsac_AllPassFilter2Float(prefiltdata->INLABUF1_float,
-                                 WebRtcIsac_kCompositeApFactorsFloat, QLOOKAHEAD,
-                                 NUMBEROFCOMPOSITEAPSECTIONS, CompositeAPFilterState);
-
-  /* save the output, but write it in forward order */
-  /* write the lookahead samples for the next encoding iteration. Every other
-     sample at the end of the input frame is written in reverse order for the
-     lookahead length. Exported in the prefiltdata structure. */
-  for (k=0;k<QLOOKAHEAD;k++) {
-    tempin_ch1[QLOOKAHEAD-1-k]=prefiltdata->INLABUF1_float[k];
-    prefiltdata->INLABUF1_float[k]=in[FRAMESAMPLES-1-2*k];
-  }
-
-  /* Second Channel.  This is exactly like the first channel, except that the
-     even samples are now filtered instead (lower channel). */
-  for (k=0;k<NUMBEROFCOMPOSITEAPSECTIONS;k++){
-    CompositeAPFilterState[k] = 0.0;
-  }
-
-  for (k=0;k<FRAMESAMPLES_HALF;k++) {
-    tempinoutvec[k] = in[FRAMESAMPLES-2-2*k];
-  }
-
-  WebRtcIsac_AllPassFilter2Float(tempinoutvec, WebRtcIsac_kCompositeApFactorsFloat,
-                                 FRAMESAMPLES_HALF, NUMBEROFCOMPOSITEAPSECTIONS, CompositeAPFilterState);
-
-  for (k=0;k<FRAMESAMPLES_HALF;k++) {
-    tempin_ch2[FRAMESAMPLES_HALF+QLOOKAHEAD-1-k] = tempinoutvec[k];
-  }
-
-  for (k=0; k<NUMBEROFCOMPOSITEAPSECTIONS; k++) {
-    ForTransform_CompositeAPFilterState2[k] = CompositeAPFilterState[k];
-  }
-
-
-  WebRtcIsac_AllPassFilter2Float(prefiltdata->INLABUF2_float,
-                                 WebRtcIsac_kCompositeApFactorsFloat, QLOOKAHEAD,NUMBEROFCOMPOSITEAPSECTIONS,
-                                 CompositeAPFilterState);
-
-  for (k=0;k<QLOOKAHEAD;k++) {
-    tempin_ch2[QLOOKAHEAD-1-k]=prefiltdata->INLABUF2_float[k];
-    prefiltdata->INLABUF2_float[k]=in[FRAMESAMPLES-2-2*k];
-  }
-
-  /* Transform filter states from backward to forward */
-  /*At this point, each of the states of the backwards composite filters for the
-    two channels are transformed into forward filtering states for the corresponding
-    forward channel filters.  Each channel's forward filtering state from the previous
-    encoding iteration is added to the transformed state to get a proper forward state */
-
-  /* So the existing NUMBEROFCOMPOSITEAPSECTIONS x 1 (4x1) state vector is multiplied by a
-     NUMBEROFCHANNELAPSECTIONSxNUMBEROFCOMPOSITEAPSECTIONS (2x4) transform matrix to get the
-     new state that is added to the previous 2x1 input state */
-
-  for (k=0;k<NUMBEROFCHANNELAPSECTIONS;k++){ /* k is row variable */
-    for (n=0; n<NUMBEROFCOMPOSITEAPSECTIONS;n++){/* n is column variable */
-      prefiltdata->INSTAT1_float[k] += ForTransform_CompositeAPFilterState[n]*
-          WebRtcIsac_kTransform1Float[k*NUMBEROFCHANNELAPSECTIONS+n];
-      prefiltdata->INSTAT2_float[k] += ForTransform_CompositeAPFilterState2[n]*
-          WebRtcIsac_kTransform2Float[k*NUMBEROFCHANNELAPSECTIONS+n];
-    }
-  }
-
-  /*obtain polyphase components by forward all-pass filtering through each channel */
-  /* the backward filtered samples are now forward filtered with the corresponding channel filters */
-  /* The all pass filtering automatically updates the filter states which are exported in the
-     prefiltdata structure */
-  WebRtcIsac_AllPassFilter2Float(tempin_ch1,WebRtcIsac_kUpperApFactorsFloat,
-                                 FRAMESAMPLES_HALF, NUMBEROFCHANNELAPSECTIONS, prefiltdata->INSTAT1_float);
-  WebRtcIsac_AllPassFilter2Float(tempin_ch2,WebRtcIsac_kLowerApFactorsFloat,
-                                 FRAMESAMPLES_HALF, NUMBEROFCHANNELAPSECTIONS, prefiltdata->INSTAT2_float);
-
-  /* Now Construct low-pass and high-pass signals as combinations of polyphase components */
-  for (k=0; k<FRAMESAMPLES_HALF; k++) {
-    LP[k] = 0.5f*(tempin_ch1[k] + tempin_ch2[k]);/* low pass signal*/
-    HP[k] = 0.5f*(tempin_ch1[k] - tempin_ch2[k]);/* high pass signal*/
-  }
-
-  /* Lookahead LP and HP signals */
-  /* now create low pass and high pass signals of the input vector.  However, no
-     backwards filtering is performed, and hence no phase equalization is involved.
-     Also, the input contains some samples that are lookahead samples.  The high pass
-     and low pass signals that are created are used outside this function for analysis
-     (not encoding) purposes */
-
-  /* set up input */
-  for (k=0; k<FRAMESAMPLES_HALF; k++) {
-    tempin_ch1[k]=in[2*k+1];
-    tempin_ch2[k]=in[2*k];
-  }
-
-  /* the input filter states are passed in and updated by the all-pass filtering routine and
-     exported in the prefiltdata structure*/
-  WebRtcIsac_AllPassFilter2Float(tempin_ch1,WebRtcIsac_kUpperApFactorsFloat,
-                                 FRAMESAMPLES_HALF, NUMBEROFCHANNELAPSECTIONS, prefiltdata->INSTATLA1_float);
-  WebRtcIsac_AllPassFilter2Float(tempin_ch2,WebRtcIsac_kLowerApFactorsFloat,
-                                 FRAMESAMPLES_HALF, NUMBEROFCHANNELAPSECTIONS, prefiltdata->INSTATLA2_float);
-
-  for (k=0; k<FRAMESAMPLES_HALF; k++) {
-    LP_la[k] = (float)(0.5f*(tempin_ch1[k] + tempin_ch2[k])); /*low pass */
-    HP_la[k] = (double)(0.5f*(tempin_ch1[k] - tempin_ch2[k])); /* high pass */
-  }
-
-
-}/*end of WebRtcIsac_SplitAndFilter */
-
-
-/* Combining */
-
-/* HPstcoeff_out_1 = {a1, a2, b1 - b0 * a1, b2 - b0 * a2}; */
-static const float kHpStCoefOut1Float[4] =
-{-1.99701049409000f, 0.99714204490000f, 0.01701049409000f, -0.01704204490000f};
-
-/* HPstcoeff_out_2 = {a1, a2, b1 - b0 * a1, b2 - b0 * a2}; */
-static const float kHpStCoefOut2Float[4] =
-{-1.98645294509837f, 0.98672435560000f, 0.00645294509837f, -0.00662435560000f};
-
-
-/* Function WebRtcIsac_FilterAndCombine */
-/* This is a decoder function that takes the decimated
-   length FRAMESAMPLES_HALF input low-pass and
-   high-pass signals and creates a reconstructed fullband
-   output signal of length FRAMESAMPLES. WebRtcIsac_FilterAndCombine
-   is the sibling function of WebRtcIsac_SplitAndFilter */
-/* INPUTS:
-   inLP: a length FRAMESAMPLES_HALF array of input low-pass
-   samples.
-   inHP: a length FRAMESAMPLES_HALF array of input high-pass
-   samples.
-   postfiltdata: input data structure containing the filterbank
-   states from the previous decoding iteration.
-   OUTPUTS:
-   Out: a length FRAMESAMPLES array of output reconstructed
-   samples (fullband) based on the input low-pass and
-   high-pass signals.
-   postfiltdata: the input data structure containing the filterbank
-   states is updated for the next decoding iteration */
-void WebRtcIsac_FilterAndCombineFloat(float *InLP,
-                                      float *InHP,
-                                      float *Out,
-                                      PostFiltBankstr *postfiltdata)
-{
-  int k;
-  float tempin_ch1[FRAMESAMPLES+MAX_AR_MODEL_ORDER];
-  float tempin_ch2[FRAMESAMPLES+MAX_AR_MODEL_ORDER];
-  float ftmp, ftmp2;
-
-  /* Form the polyphase signals*/
-  for (k=0;k<FRAMESAMPLES_HALF;k++) {
-    tempin_ch1[k]=InLP[k]+InHP[k]; /* Construct a new upper channel signal*/
-    tempin_ch2[k]=InLP[k]-InHP[k]; /* Construct a new lower channel signal*/
-  }
-
-
-  /* all-pass filter the new upper channel signal. HOWEVER, use the all-pass filter factors
-     that were used as a lower channel at the encoding side.  So at the decoder, the
-     corresponding all-pass filter factors for each channel are swapped.*/
-  WebRtcIsac_AllPassFilter2Float(tempin_ch1, WebRtcIsac_kLowerApFactorsFloat,
-                                 FRAMESAMPLES_HALF, NUMBEROFCHANNELAPSECTIONS,postfiltdata->STATE_0_UPPER_float);
-
-  /* Now, all-pass filter the new lower channel signal. But since all-pass filter factors
-     at the decoder are swapped from the ones at the encoder, the 'upper' channel
-     all-pass filter factors (WebRtcIsac_kUpperApFactorsFloat) are used to filter this new
-     lower channel signal */
-  WebRtcIsac_AllPassFilter2Float(tempin_ch2, WebRtcIsac_kUpperApFactorsFloat,
-                                 FRAMESAMPLES_HALF, NUMBEROFCHANNELAPSECTIONS,postfiltdata->STATE_0_LOWER_float);
-
-
-  /* Merge outputs to form the full length output signal.*/
-  for (k=0;k<FRAMESAMPLES_HALF;k++) {
-    Out[2*k]=tempin_ch2[k];
-    Out[2*k+1]=tempin_ch1[k];
-  }
-
-
-  /* High pass filter */
-
-  for (k=0;k<FRAMESAMPLES;k++) {
-    ftmp2 = Out[k] + kHpStCoefOut1Float[2] * postfiltdata->HPstates1_float[0] +
-        kHpStCoefOut1Float[3] * postfiltdata->HPstates1_float[1];
-    ftmp = Out[k] - kHpStCoefOut1Float[0] * postfiltdata->HPstates1_float[0] -
-        kHpStCoefOut1Float[1] * postfiltdata->HPstates1_float[1];
-    postfiltdata->HPstates1_float[1] = postfiltdata->HPstates1_float[0];
-    postfiltdata->HPstates1_float[0] = ftmp;
-    Out[k] = ftmp2;
-  }
-
-  for (k=0;k<FRAMESAMPLES;k++) {
-    ftmp2 = Out[k] + kHpStCoefOut2Float[2] * postfiltdata->HPstates2_float[0] +
-        kHpStCoefOut2Float[3] * postfiltdata->HPstates2_float[1];
-    ftmp = Out[k] - kHpStCoefOut2Float[0] * postfiltdata->HPstates2_float[0] -
-        kHpStCoefOut2Float[1] * postfiltdata->HPstates2_float[1];
-    postfiltdata->HPstates2_float[1] = postfiltdata->HPstates2_float[0];
-    postfiltdata->HPstates2_float[0] = ftmp;
-    Out[k] = ftmp2;
-  }
-}
diff --git a/modules/audio_coding/codecs/isac/main/source/intialize.c b/modules/audio_coding/codecs/isac/main/source/intialize.c
deleted file mode 100644
index 01e683c..0000000
--- a/modules/audio_coding/codecs/isac/main/source/intialize.c
+++ /dev/null
@@ -1,171 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/* encode.c  - Encoding function for the iSAC coder */
-
-#include "structs.h"
-#include "codec.h"
-#include "pitch_estimator.h"
-
-#include <math.h>
-
-void WebRtcIsac_InitMasking(MaskFiltstr *maskdata) {
-
-  int k;
-
-  for (k = 0; k < WINLEN; k++) {
-    maskdata->DataBufferLo[k] = 0.0;
-    maskdata->DataBufferHi[k] = 0.0;
-  }
-  for (k = 0; k < ORDERLO+1; k++) {
-    maskdata->CorrBufLo[k] = 0.0;
-    maskdata->PreStateLoF[k] = 0.0;
-    maskdata->PreStateLoG[k] = 0.0;
-    maskdata->PostStateLoF[k] = 0.0;
-    maskdata->PostStateLoG[k] = 0.0;
-  }
-  for (k = 0; k < ORDERHI+1; k++) {
-    maskdata->CorrBufHi[k] = 0.0;
-    maskdata->PreStateHiF[k] = 0.0;
-    maskdata->PreStateHiG[k] = 0.0;
-    maskdata->PostStateHiF[k] = 0.0;
-    maskdata->PostStateHiG[k] = 0.0;
-  }
-
-  maskdata->OldEnergy = 10.0;
-  return;
-}
-
-void WebRtcIsac_InitPreFilterbank(PreFiltBankstr *prefiltdata)
-{
-  int k;
-
-  for (k = 0; k < QLOOKAHEAD; k++) {
-    prefiltdata->INLABUF1[k] = 0;
-    prefiltdata->INLABUF2[k] = 0;
-
-    prefiltdata->INLABUF1_float[k] = 0;
-    prefiltdata->INLABUF2_float[k] = 0;
-  }
-  for (k = 0; k < 2*(QORDER-1); k++) {
-    prefiltdata->INSTAT1[k] = 0;
-    prefiltdata->INSTAT2[k] = 0;
-    prefiltdata->INSTATLA1[k] = 0;
-    prefiltdata->INSTATLA2[k] = 0;
-
-    prefiltdata->INSTAT1_float[k] = 0;
-    prefiltdata->INSTAT2_float[k] = 0;
-    prefiltdata->INSTATLA1_float[k] = 0;
-    prefiltdata->INSTATLA2_float[k] = 0;
-  }
-
-  /* High pass filter states */
-  prefiltdata->HPstates[0] = 0.0;
-  prefiltdata->HPstates[1] = 0.0;
-
-  prefiltdata->HPstates_float[0] = 0.0f;
-  prefiltdata->HPstates_float[1] = 0.0f;
-
-  return;
-}
-
-void WebRtcIsac_InitPostFilterbank(PostFiltBankstr *postfiltdata)
-{
-  int k;
-
-  for (k = 0; k < 2*POSTQORDER; k++) {
-    postfiltdata->STATE_0_LOWER[k] = 0;
-    postfiltdata->STATE_0_UPPER[k] = 0;
-
-    postfiltdata->STATE_0_LOWER_float[k] = 0;
-    postfiltdata->STATE_0_UPPER_float[k] = 0;
-  }
-
-  /* High pass filter states */
-  postfiltdata->HPstates1[0] = 0.0;
-  postfiltdata->HPstates1[1] = 0.0;
-
-  postfiltdata->HPstates2[0] = 0.0;
-  postfiltdata->HPstates2[1] = 0.0;
-
-  postfiltdata->HPstates1_float[0] = 0.0f;
-  postfiltdata->HPstates1_float[1] = 0.0f;
-
-  postfiltdata->HPstates2_float[0] = 0.0f;
-  postfiltdata->HPstates2_float[1] = 0.0f;
-
-  return;
-}
-
-
-void WebRtcIsac_InitPitchFilter(PitchFiltstr *pitchfiltdata)
-{
-  int k;
-
-  for (k = 0; k < PITCH_BUFFSIZE; k++) {
-    pitchfiltdata->ubuf[k] = 0.0;
-  }
-  pitchfiltdata->ystate[0] = 0.0;
-  for (k = 1; k < (PITCH_DAMPORDER); k++) {
-    pitchfiltdata->ystate[k] = 0.0;
-  }
-  pitchfiltdata->oldlagp[0] = 50.0;
-  pitchfiltdata->oldgainp[0] = 0.0;
-}
-
-void WebRtcIsac_InitWeightingFilter(WeightFiltstr *wfdata)
-{
-  int k;
-  double t, dtmp, dtmp2, denum, denum2;
-
-  for (k=0;k<PITCH_WLPCBUFLEN;k++)
-    wfdata->buffer[k]=0.0;
-
-  for (k=0;k<PITCH_WLPCORDER;k++) {
-    wfdata->istate[k]=0.0;
-    wfdata->weostate[k]=0.0;
-    wfdata->whostate[k]=0.0;
-  }
-
-  /* next part should be in Matlab, writing to a global table */
-  t = 0.5;
-  denum = 1.0 / ((double) PITCH_WLPCWINLEN);
-  denum2 = denum * denum;
-  for (k=0;k<PITCH_WLPCWINLEN;k++) {
-    dtmp = PITCH_WLPCASYM * t * denum + (1-PITCH_WLPCASYM) * t * t * denum2;
-    dtmp *= 3.14159265;
-    dtmp2 = sin(dtmp);
-    wfdata->window[k] = dtmp2 * dtmp2;
-    t++;
-  }
-}
-
-/* clear all buffers */
-void WebRtcIsac_InitPitchAnalysis(PitchAnalysisStruct *State)
-{
-  int k;
-
-  for (k = 0; k < PITCH_CORR_LEN2+PITCH_CORR_STEP2+PITCH_MAX_LAG/2-PITCH_FRAME_LEN/2+2; k++)
-    State->dec_buffer[k] = 0.0;
-  for (k = 0; k < 2*ALLPASSSECTIONS+1; k++)
-    State->decimator_state[k] = 0.0;
-  for (k = 0; k < 2; k++)
-    State->hp_state[k] = 0.0;
-  for (k = 0; k < QLOOKAHEAD; k++)
-    State->whitened_buf[k] = 0.0;
-  for (k = 0; k < QLOOKAHEAD; k++)
-    State->inbuf[k] = 0.0;
-
-  WebRtcIsac_InitPitchFilter(&(State->PFstr_wght));
-
-  WebRtcIsac_InitPitchFilter(&(State->PFstr));
-
-  WebRtcIsac_InitWeightingFilter(&(State->Wghtstr));
-}
diff --git a/modules/audio_coding/codecs/isac/main/source/isac.c b/modules/audio_coding/codecs/isac/main/source/isac.c
deleted file mode 100644
index f83d4f8..0000000
--- a/modules/audio_coding/codecs/isac/main/source/isac.c
+++ /dev/null
@@ -1,2374 +0,0 @@
-/*
- *  Copyright (c) 2012 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.
- */
-
-/*
- * isac.c
- *
- * This C file contains the functions for the ISAC API
- *
- */
-
-#include "webrtc/modules/audio_coding/codecs/isac/main/include/isac.h"
-
-#include <math.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
-#include "webrtc/modules/audio_coding/codecs/isac/main/source/bandwidth_estimator.h"
-#include "webrtc/modules/audio_coding/codecs/isac/main/source/codec.h"
-#include "webrtc/modules/audio_coding/codecs/isac/main/source/crc.h"
-#include "webrtc/modules/audio_coding/codecs/isac/main/source/entropy_coding.h"
-#include "webrtc/modules/audio_coding/codecs/isac/main/source/lpc_shape_swb16_tables.h"
-#include "webrtc/modules/audio_coding/codecs/isac/main/source/os_specific_inline.h"
-#include "webrtc/modules/audio_coding/codecs/isac/main/source/structs.h"
-
-#define BIT_MASK_DEC_INIT 0x0001
-#define BIT_MASK_ENC_INIT 0x0002
-
-#define LEN_CHECK_SUM_WORD8     4
-#define MAX_NUM_LAYERS         10
-
-
-/****************************************************************************
- * UpdatePayloadSizeLimit(...)
- *
- * Call this function to update the limit on the payload size. The limit on
- * payload size might change i) if a user ''directly changes the limit by
- * calling xxx_setMaxPayloadSize() or xxx_setMaxRate(), or ii) indirectly
- * when bandwidth is changing. The latter might be the result of bandwidth
- * adaptation, or direct change of the bottleneck in instantaneous mode.
- *
- * This function takes the current overall limit on payload, and translates it
- * to the limits on lower and upper-band. If the codec is in wideband mode,
- * then the overall limit and the limit on the lower-band is the same.
- * Otherwise, a fraction of the limit should be allocated to lower-band
- * leaving some room for the upper-band bit-stream. That is why an update
- * of limit is required every time that the bandwidth is changing.
- *
- */
-static void UpdatePayloadSizeLimit(ISACMainStruct* instISAC) {
-  int16_t lim30MsPayloadBytes = WEBRTC_SPL_MIN(
-                          (instISAC->maxPayloadSizeBytes),
-                          (instISAC->maxRateBytesPer30Ms));
-  int16_t lim60MsPayloadBytes = WEBRTC_SPL_MIN(
-                          (instISAC->maxPayloadSizeBytes),
-                          (instISAC->maxRateBytesPer30Ms << 1));
-
-  /* The only time that iSAC will have 60 ms
-   * frame-size is when operating in wideband, so
-   * there is no upper-band bit-stream. */
-
-  if (instISAC->bandwidthKHz == isac8kHz) {
-    /* At 8 kHz there is no upper-band bit-stream,
-     * therefore, the lower-band limit is the overall limit. */
-    instISAC->instLB.ISACencLB_obj.payloadLimitBytes60 =
-      lim60MsPayloadBytes;
-    instISAC->instLB.ISACencLB_obj.payloadLimitBytes30 =
-      lim30MsPayloadBytes;
-  } else {
-    /* When in super-wideband, we only have 30 ms frames.
-     * Do a rate allocation for the given limit. */
-    if (lim30MsPayloadBytes > 250) {
-      /* 4/5 to lower-band the rest for upper-band. */
-      instISAC->instLB.ISACencLB_obj.payloadLimitBytes30 =
-        (lim30MsPayloadBytes << 2) / 5;
-    } else if (lim30MsPayloadBytes > 200) {
-      /* For the interval of 200 to 250 the share of
-       * upper-band linearly grows from 20 to 50. */
-      instISAC->instLB.ISACencLB_obj.payloadLimitBytes30 =
-        (lim30MsPayloadBytes << 1) / 5 + 100;
-    } else {
-      /* Allocate only 20 for upper-band. */
-      instISAC->instLB.ISACencLB_obj.payloadLimitBytes30 =
-        lim30MsPayloadBytes - 20;
-    }
-    instISAC->instUB.ISACencUB_obj.maxPayloadSizeBytes =
-      lim30MsPayloadBytes;
-  }
-}
-
-
-/****************************************************************************
- * UpdateBottleneck(...)
- *
- * This function updates the bottleneck only if the codec is operating in
- * channel-adaptive mode. Furthermore, as the update of bottleneck might
- * result in an update of bandwidth, therefore, the bottlenech should be
- * updated just right before the first 10ms of a frame is pushed into encoder.
- *
- */
-static void UpdateBottleneck(ISACMainStruct* instISAC) {
-  /* Read the bottleneck from bandwidth estimator for the
-   * first 10 ms audio. This way, if there is a change
-   * in bandwidth, upper and lower-band will be in sync. */
-  if ((instISAC->codingMode == 0) &&
-      (instISAC->instLB.ISACencLB_obj.buffer_index == 0) &&
-      (instISAC->instLB.ISACencLB_obj.frame_nb == 0)) {
-    int32_t bottleneck =
-        WebRtcIsac_GetUplinkBandwidth(&instISAC->bwestimator_obj);
-
-    /* Adding hysteresis when increasing signal bandwidth. */
-    if ((instISAC->bandwidthKHz == isac8kHz)
-        && (bottleneck > 37000)
-        && (bottleneck < 41000)) {
-      bottleneck = 37000;
-    }
-
-    /* Switching from 12 kHz to 16 kHz is not allowed at this revision.
-     * If we let this happen, we have to take care of buffer_index and
-     * the last LPC vector. */
-    if ((instISAC->bandwidthKHz != isac16kHz) &&
-        (bottleneck > 46000)) {
-      bottleneck = 46000;
-    }
-
-    /* We might need a rate allocation. */
-    if (instISAC->encoderSamplingRateKHz == kIsacWideband) {
-      /* Wideband is the only choice we have here. */
-      instISAC->instLB.ISACencLB_obj.bottleneck =
-        (bottleneck > 32000) ? 32000 : bottleneck;
-      instISAC->bandwidthKHz = isac8kHz;
-    } else {
-      /* Do the rate-allocation and get the new bandwidth. */
-      enum ISACBandwidth bandwidth;
-      WebRtcIsac_RateAllocation(bottleneck,
-                                &(instISAC->instLB.ISACencLB_obj.bottleneck),
-                                &(instISAC->instUB.ISACencUB_obj.bottleneck),
-                                &bandwidth);
-      if (bandwidth != isac8kHz) {
-        instISAC->instLB.ISACencLB_obj.new_framelength = 480;
-      }
-      if (bandwidth != instISAC->bandwidthKHz) {
-        /* Bandwidth is changing. */
-        instISAC->bandwidthKHz = bandwidth;
-        UpdatePayloadSizeLimit(instISAC);
-        if (bandwidth == isac12kHz) {
-          instISAC->instLB.ISACencLB_obj.buffer_index = 0;
-        }
-        /* Currently we don't let the bandwidth to switch to 16 kHz
-         * if in adaptive mode. If we let this happen, we have to take
-         * care of buffer_index and the last LPC vector. */
-      }
-    }
-  }
-}
-
-
-/****************************************************************************
- * GetSendBandwidthInfo(...)
- *
- * This is called to get the bandwidth info. This info is the bandwidth and
- * the jitter of 'there-to-here' channel, estimated 'here.' These info
- * is signaled in an in-band fashion to the other side.
- *
- * The call to the bandwidth estimator triggers a recursive averaging which
- * has to be synchronized between encoder & decoder, therefore, the call to
- * BWE should be once per packet. As the BWE info is inserted into bit-stream
- * We need a valid info right before the encodeLB function is going to
- * generate a bit-stream. That is when lower-band buffer has already 20ms
- * of audio, and the 3rd block of 10ms is going to be injected into encoder.
- *
- * Inputs:
- *         - instISAC          : iSAC instance.
- *
- * Outputs:
- *         - bandwidthIndex    : an index which has to be encoded in
- *                               lower-band bit-stream, indicating the
- *                               bandwidth of there-to-here channel.
- *         - jitterInfo        : this indicates if the jitter is high
- *                               or low and it is encoded in upper-band
- *                               bit-stream.
- *
- */
-static void GetSendBandwidthInfo(ISACMainStruct* instISAC,
-                                 int16_t* bandwidthIndex,
-                                 int16_t* jitterInfo) {
-  if ((instISAC->instLB.ISACencLB_obj.buffer_index ==
-      (FRAMESAMPLES_10ms << 1)) &&
-      (instISAC->instLB.ISACencLB_obj.frame_nb == 0)) {
-    /* Bandwidth estimation and coding. */
-    WebRtcIsac_GetDownlinkBwJitIndexImpl(&(instISAC->bwestimator_obj),
-                                         bandwidthIndex, jitterInfo,
-                                         instISAC->decoderSamplingRateKHz);
-  }
-}
-
-
-/****************************************************************************
- * WebRtcIsac_AssignSize(...)
- *
- * This function returns the size of the ISAC instance, so that the instance
- * can be created out side iSAC.
- *
- * Output:
- *        - sizeinbytes       : number of bytes needed to allocate for the
- *                              instance.
- *
- * Return value               : 0 - Ok
- *                             -1 - Error
- */
-int16_t WebRtcIsac_AssignSize(int* sizeInBytes) {
-  *sizeInBytes = sizeof(ISACMainStruct) * 2 / sizeof(int16_t);
-  return 0;
-}
-
-
-/****************************************************************************
- * WebRtcIsac_Assign(...)
- *
- * This function assigns the memory already created to the ISAC instance.
- *
- * Input:
- *        - ISAC_main_inst    : address of the pointer to the coder instance.
- *        - instISAC_Addr     : the already allocated memory, where we put the
- *                              iSAC structure.
- *
- * Return value               : 0 - Ok
- *                             -1 - Error
- */
-int16_t WebRtcIsac_Assign(ISACStruct** ISAC_main_inst,
-                          void* instISAC_Addr) {
-  if (instISAC_Addr != NULL) {
-    ISACMainStruct* instISAC = (ISACMainStruct*)instISAC_Addr;
-    instISAC->errorCode = 0;
-    instISAC->initFlag = 0;
-
-    /* Assign the address. */
-    *ISAC_main_inst = (ISACStruct*)instISAC_Addr;
-
-    /* Default is wideband. */
-    instISAC->encoderSamplingRateKHz = kIsacWideband;
-    instISAC->decoderSamplingRateKHz = kIsacWideband;
-    instISAC->bandwidthKHz           = isac8kHz;
-    instISAC->in_sample_rate_hz = 16000;
-
-    WebRtcIsac_InitTransform(&instISAC->transform_tables);
-    return 0;
-  } else {
-    return -1;
-  }
-}
-
-
-/****************************************************************************
- * WebRtcIsac_Create(...)
- *
- * This function creates an ISAC instance, which will contain the state
- * information for one coding/decoding channel.
- *
- * Input:
- *        - ISAC_main_inst    : address of the pointer to the coder instance.
- *
- * Return value               : 0 - Ok
- *                             -1 - Error
- */
-int16_t WebRtcIsac_Create(ISACStruct** ISAC_main_inst) {
-  ISACMainStruct* instISAC;
-
-  if (ISAC_main_inst != NULL) {
-    instISAC = (ISACMainStruct*)malloc(sizeof(ISACMainStruct));
-    *ISAC_main_inst = (ISACStruct*)instISAC;
-    if (*ISAC_main_inst != NULL) {
-      instISAC->errorCode = 0;
-      instISAC->initFlag = 0;
-      /* Default is wideband. */
-      instISAC->bandwidthKHz = isac8kHz;
-      instISAC->encoderSamplingRateKHz = kIsacWideband;
-      instISAC->decoderSamplingRateKHz = kIsacWideband;
-      instISAC->in_sample_rate_hz = 16000;
-
-      WebRtcIsac_InitTransform(&instISAC->transform_tables);
-      return 0;
-    } else {
-      return -1;
-    }
-  } else {
-    return -1;
-  }
-}
-
-
-/****************************************************************************
- * WebRtcIsac_Free(...)
- *
- * This function frees the ISAC instance created at the beginning.
- *
- * Input:
- *        - ISAC_main_inst    : a ISAC instance.
- *
- * Return value               : 0 - Ok
- *                             -1 - Error
- */
-int16_t WebRtcIsac_Free(ISACStruct* ISAC_main_inst) {
-  ISACMainStruct* instISAC = (ISACMainStruct*)ISAC_main_inst;
-  free(instISAC);
-  return 0;
-}
-
-
-/****************************************************************************
- * EncoderInitLb(...) - internal function for initialization of
- *                                Lower Band
- * EncoderInitUb(...) - internal function for initialization of
- *                                Upper Band
- * WebRtcIsac_EncoderInit(...) - API function
- *
- * This function initializes a ISAC instance prior to the encoder calls.
- *
- * Input:
- *        - ISAC_main_inst    : ISAC instance.
- *        - CodingMode        : 0 -> Bit rate and frame length are automatically
- *                                 adjusted to available bandwidth on
- *                                 transmission channel, applicable just to
- *                                 wideband mode.
- *                              1 -> User sets a frame length and a target bit
- *                                 rate which is taken as the maximum
- *                                 short-term average bit rate.
- *
- * Return value               :  0 - Ok
- *                              -1 - Error
- */
-static int16_t EncoderInitLb(ISACLBStruct* instLB,
-                             int16_t codingMode,
-                             enum IsacSamplingRate sampRate) {
-  int16_t statusInit = 0;
-  int k;
-
-  /* Init stream vector to zero */
-  for (k = 0; k < STREAM_SIZE_MAX_60; k++) {
-    instLB->ISACencLB_obj.bitstr_obj.stream[k] = 0;
-  }
-
-  if ((codingMode == 1) || (sampRate == kIsacSuperWideband)) {
-    /* 30 ms frame-size if either in super-wideband or
-     * instantaneous mode (I-mode). */
-    instLB->ISACencLB_obj.new_framelength = 480;
-  } else {
-    instLB->ISACencLB_obj.new_framelength = INITIAL_FRAMESAMPLES;
-  }
-
-  WebRtcIsac_InitMasking(&instLB->ISACencLB_obj.maskfiltstr_obj);
-  WebRtcIsac_InitPreFilterbank(&instLB->ISACencLB_obj.prefiltbankstr_obj);
-  WebRtcIsac_InitPitchFilter(&instLB->ISACencLB_obj.pitchfiltstr_obj);
-  WebRtcIsac_InitPitchAnalysis(
-    &instLB->ISACencLB_obj.pitchanalysisstr_obj);
-
-  instLB->ISACencLB_obj.buffer_index = 0;
-  instLB->ISACencLB_obj.frame_nb = 0;
-  /* Default for I-mode. */
-  instLB->ISACencLB_obj.bottleneck = 32000;
-  instLB->ISACencLB_obj.current_framesamples = 0;
-  instLB->ISACencLB_obj.s2nr = 0;
-  instLB->ISACencLB_obj.payloadLimitBytes30 = STREAM_SIZE_MAX_30;
-  instLB->ISACencLB_obj.payloadLimitBytes60 = STREAM_SIZE_MAX_60;
-  instLB->ISACencLB_obj.maxPayloadBytes = STREAM_SIZE_MAX_60;
-  instLB->ISACencLB_obj.maxRateInBytes = STREAM_SIZE_MAX_30;
-  instLB->ISACencLB_obj.enforceFrameSize = 0;
-  /* Invalid value prevents getRedPayload to
-     run before encoder is called. */
-  instLB->ISACencLB_obj.lastBWIdx            = -1;
-  return statusInit;
-}
-
-static int16_t EncoderInitUb(ISACUBStruct* instUB,
-                             int16_t bandwidth) {
-  int16_t statusInit = 0;
-  int k;
-
-  /* Init stream vector to zero. */
-  for (k = 0; k < STREAM_SIZE_MAX_60; k++) {
-    instUB->ISACencUB_obj.bitstr_obj.stream[k] = 0;
-  }
-
-  WebRtcIsac_InitMasking(&instUB->ISACencUB_obj.maskfiltstr_obj);
-  WebRtcIsac_InitPreFilterbank(&instUB->ISACencUB_obj.prefiltbankstr_obj);
-
-  if (bandwidth == isac16kHz) {
-    instUB->ISACencUB_obj.buffer_index = LB_TOTAL_DELAY_SAMPLES;
-  } else {
-    instUB->ISACencUB_obj.buffer_index = 0;
-  }
-  /* Default for I-mode. */
-  instUB->ISACencUB_obj.bottleneck = 32000;
-  /* These store the limits for the wideband + super-wideband bit-stream. */
-  instUB->ISACencUB_obj.maxPayloadSizeBytes = STREAM_SIZE_MAX_30 << 1;
-  /* This has to be updated after each lower-band encoding to guarantee
-   * a correct payload-limitation. */
-  instUB->ISACencUB_obj.numBytesUsed = 0;
-  memset(instUB->ISACencUB_obj.data_buffer_float, 0,
-         (MAX_FRAMESAMPLES + LB_TOTAL_DELAY_SAMPLES) * sizeof(float));
-
-  memcpy(&(instUB->ISACencUB_obj.lastLPCVec),
-         WebRtcIsac_kMeanLarUb16, sizeof(double) * UB_LPC_ORDER);
-
-  return statusInit;
-}
-
-
-int16_t WebRtcIsac_EncoderInit(ISACStruct* ISAC_main_inst,
-                               int16_t codingMode) {
-  ISACMainStruct* instISAC = (ISACMainStruct*)ISAC_main_inst;
-  int16_t status;
-
-  if ((codingMode != 0) && (codingMode != 1)) {
-    instISAC->errorCode = ISAC_DISALLOWED_CODING_MODE;
-    return -1;
-  }
-  /* Default bottleneck. */
-  instISAC->bottleneck = MAX_ISAC_BW;
-
-  if (instISAC->encoderSamplingRateKHz == kIsacWideband) {
-    instISAC->bandwidthKHz = isac8kHz;
-    instISAC->maxPayloadSizeBytes = STREAM_SIZE_MAX_60;
-    instISAC->maxRateBytesPer30Ms = STREAM_SIZE_MAX_30;
-  } else {
-    instISAC->bandwidthKHz = isac16kHz;
-    instISAC->maxPayloadSizeBytes = STREAM_SIZE_MAX;
-    instISAC->maxRateBytesPer30Ms = STREAM_SIZE_MAX;
-  }
-
-  /* Channel-adaptive = 0; Instantaneous (Channel-independent) = 1. */
-  instISAC->codingMode = codingMode;
-
-  WebRtcIsac_InitBandwidthEstimator(&instISAC->bwestimator_obj,
-                                    instISAC->encoderSamplingRateKHz,
-                                    instISAC->decoderSamplingRateKHz);
-
-  WebRtcIsac_InitRateModel(&instISAC->rate_data_obj);
-  /* Default for I-mode. */
-  instISAC->MaxDelay = 10.0;
-
-  status = EncoderInitLb(&instISAC->instLB, codingMode,
-                         instISAC->encoderSamplingRateKHz);
-  if (status < 0) {
-    instISAC->errorCode = -status;
-    return -1;
-  }
-
-  if (instISAC->encoderSamplingRateKHz == kIsacSuperWideband) {
-    /* Initialize encoder filter-bank. */
-    memset(instISAC->analysisFBState1, 0,
-           FB_STATE_SIZE_WORD32 * sizeof(int32_t));
-    memset(instISAC->analysisFBState2, 0,
-           FB_STATE_SIZE_WORD32 * sizeof(int32_t));
-
-    status = EncoderInitUb(&(instISAC->instUB),
-                           instISAC->bandwidthKHz);
-    if (status < 0) {
-      instISAC->errorCode = -status;
-      return -1;
-    }
-  }
-  /* Initialization is successful, set the flag. */
-  instISAC->initFlag |= BIT_MASK_ENC_INIT;
-  return 0;
-}
-
-
-/****************************************************************************
- * WebRtcIsac_Encode(...)
- *
- * This function encodes 10ms frame(s) and inserts it into a package.
- * Input speech length has to be 160 samples (10ms). The encoder buffers those
- * 10ms frames until it reaches the chosen Framesize (480 or 960 samples
- * corresponding to 30 or 60 ms frames), and then proceeds to the encoding.
- *
- * Input:
- *        - ISAC_main_inst    : ISAC instance.
- *        - speechIn          : input speech vector.
- *
- * Output:
- *        - encoded           : the encoded data vector
- *
- * Return value:
- *                            : >0 - Length (in bytes) of coded data
- *                            :  0 - The buffer didn't reach the chosen
- *                                  frameSize so it keeps buffering speech
- *                                 samples.
- *                            : -1 - Error
- */
-int WebRtcIsac_Encode(ISACStruct* ISAC_main_inst,
-                      const int16_t* speechIn,
-                      uint8_t* encoded) {
-  float inFrame[FRAMESAMPLES_10ms];
-  int16_t speechInLB[FRAMESAMPLES_10ms];
-  int16_t speechInUB[FRAMESAMPLES_10ms];
-  int streamLenLB = 0;
-  int streamLenUB = 0;
-  int streamLen = 0;
-  size_t k = 0;
-  uint8_t garbageLen = 0;
-  int32_t bottleneck = 0;
-  int16_t bottleneckIdx = 0;
-  int16_t jitterInfo = 0;
-
-  ISACMainStruct* instISAC = (ISACMainStruct*)ISAC_main_inst;
-  ISACLBStruct* instLB = &(instISAC->instLB);
-  ISACUBStruct* instUB = &(instISAC->instUB);
-
-  /* Check if encoder initiated. */
-  if ((instISAC->initFlag & BIT_MASK_ENC_INIT) !=
-      BIT_MASK_ENC_INIT) {
-    instISAC->errorCode = ISAC_ENCODER_NOT_INITIATED;
-    return -1;
-  }
-
-  if (instISAC->encoderSamplingRateKHz == kIsacSuperWideband) {
-    WebRtcSpl_AnalysisQMF(speechIn, SWBFRAMESAMPLES_10ms, speechInLB,
-                          speechInUB, instISAC->analysisFBState1,
-                          instISAC->analysisFBState2);
-
-    /* Convert from fixed to floating point. */
-    for (k = 0; k < FRAMESAMPLES_10ms; k++) {
-      inFrame[k] = (float)speechInLB[k];
-    }
-  } else {
-    for (k = 0; k < FRAMESAMPLES_10ms; k++) {
-      inFrame[k] = (float) speechIn[k];
-    }
-  }
-
-  /* Add some noise to avoid denormal numbers. */
-  inFrame[0] += (float)1.23455334e-3;
-  inFrame[1] -= (float)2.04324239e-3;
-  inFrame[2] += (float)1.90854954e-3;
-  inFrame[9] += (float)1.84854878e-3;
-
-  /* This function will update the bottleneck if required. */
-  UpdateBottleneck(instISAC);
-
-  /* Get the bandwith information which has to be sent to the other side. */
-  GetSendBandwidthInfo(instISAC, &bottleneckIdx, &jitterInfo);
-
-  /* Encode lower-band. */
-  streamLenLB = WebRtcIsac_EncodeLb(&instISAC->transform_tables,
-                                    inFrame, &instLB->ISACencLB_obj,
-                                    instISAC->codingMode, bottleneckIdx);
-  if (streamLenLB < 0) {
-    return -1;
-  }
-
-  if (instISAC->encoderSamplingRateKHz == kIsacSuperWideband) {
-    instUB = &(instISAC->instUB);
-
-    /* Convert to float. */
-    for (k = 0; k < FRAMESAMPLES_10ms; k++) {
-      inFrame[k] = (float) speechInUB[k];
-    }
-
-    /* Add some noise to avoid denormal numbers. */
-    inFrame[0] += (float)1.23455334e-3;
-    inFrame[1] -= (float)2.04324239e-3;
-    inFrame[2] += (float)1.90854954e-3;
-    inFrame[9] += (float)1.84854878e-3;
-
-    /* Tell to upper-band the number of bytes used so far.
-     * This is for payload limitation. */
-    instUB->ISACencUB_obj.numBytesUsed =
-        (int16_t)(streamLenLB + 1 + LEN_CHECK_SUM_WORD8);
-    /* Encode upper-band. */
-    switch (instISAC->bandwidthKHz) {
-      case isac12kHz: {
-        streamLenUB = WebRtcIsac_EncodeUb12(&instISAC->transform_tables,
-                                            inFrame, &instUB->ISACencUB_obj,
-                                            jitterInfo);
-        break;
-      }
-      case isac16kHz: {
-        streamLenUB = WebRtcIsac_EncodeUb16(&instISAC->transform_tables,
-                                            inFrame, &instUB->ISACencUB_obj,
-                                            jitterInfo);
-        break;
-      }
-      case isac8kHz: {
-        streamLenUB = 0;
-        break;
-      }
-    }
-
-    if ((streamLenUB < 0) && (streamLenUB != -ISAC_PAYLOAD_LARGER_THAN_LIMIT)) {
-      /* An error has happened but this is not the error due to a
-       * bit-stream larger than the limit. */
-      return -1;
-    }
-
-    if (streamLenLB == 0) {
-      return 0;
-    }
-
-    /* One byte is allocated for the length. According to older decoders
-       so the length bit-stream plus one byte for size and
-       LEN_CHECK_SUM_WORD8 for the checksum should be less than or equal
-       to 255. */
-    if ((streamLenUB > (255 - (LEN_CHECK_SUM_WORD8 + 1))) ||
-        (streamLenUB == -ISAC_PAYLOAD_LARGER_THAN_LIMIT)) {
-      /* We have got a too long bit-stream we skip the upper-band
-       * bit-stream for this frame. */
-      streamLenUB = 0;
-    }
-
-    memcpy(encoded, instLB->ISACencLB_obj.bitstr_obj.stream, streamLenLB);
-    streamLen = streamLenLB;
-    if (streamLenUB > 0) {
-      encoded[streamLenLB] = (uint8_t)(streamLenUB + 1 + LEN_CHECK_SUM_WORD8);
-      memcpy(&encoded[streamLenLB + 1],
-             instUB->ISACencUB_obj.bitstr_obj.stream,
-             streamLenUB);
-      streamLen += encoded[streamLenLB];
-    } else {
-      encoded[streamLenLB] = 0;
-    }
-  } else {
-    if (streamLenLB == 0) {
-      return 0;
-    }
-    memcpy(encoded, instLB->ISACencLB_obj.bitstr_obj.stream, streamLenLB);
-    streamLenUB = 0;
-    streamLen = streamLenLB;
-  }
-
-  /* Add Garbage if required. */
-  bottleneck = WebRtcIsac_GetUplinkBandwidth(&instISAC->bwestimator_obj);
-  if (instISAC->codingMode == 0) {
-    int minBytes;
-    int limit;
-    uint8_t* ptrGarbage;
-
-    instISAC->MaxDelay = (double)WebRtcIsac_GetUplinkMaxDelay(
-                           &instISAC->bwestimator_obj);
-
-    /* Update rate model and get minimum number of bytes in this packet. */
-    minBytes = WebRtcIsac_GetMinBytes(
-        &(instISAC->rate_data_obj), streamLen,
-        instISAC->instLB.ISACencLB_obj.current_framesamples, bottleneck,
-        instISAC->MaxDelay, instISAC->bandwidthKHz);
-
-    /* Make sure MinBytes does not exceed packet size limit. */
-    if (instISAC->bandwidthKHz == isac8kHz) {
-      if (instLB->ISACencLB_obj.current_framesamples == FRAMESAMPLES) {
-        limit = instLB->ISACencLB_obj.payloadLimitBytes30;
-      } else {
-        limit = instLB->ISACencLB_obj.payloadLimitBytes60;
-      }
-    } else {
-      limit = instUB->ISACencUB_obj.maxPayloadSizeBytes;
-    }
-    minBytes = (minBytes > limit) ? limit : minBytes;
-
-    /* Make sure we don't allow more than 255 bytes of garbage data.
-     * We store the length of the garbage data in 8 bits in the bitstream,
-     * 255 is the max garbage length we can signal using 8 bits. */
-    if ((instISAC->bandwidthKHz == isac8kHz) ||
-        (streamLenUB == 0)) {
-      ptrGarbage = &encoded[streamLenLB];
-      limit = streamLen + 255;
-    } else {
-      ptrGarbage = &encoded[streamLenLB + 1 + streamLenUB];
-      limit = streamLen + (255 - encoded[streamLenLB]);
-    }
-    minBytes = (minBytes > limit) ? limit : minBytes;
-
-    garbageLen = (minBytes > streamLen) ? (uint8_t)(minBytes - streamLen) : 0;
-
-    /* Save data for creation of multiple bit-streams. */
-    /* If bit-stream too short then add garbage at the end. */
-    if (garbageLen > 0) {
-      /* Overwrite the garbage area to avoid leaking possibly sensitive data
-         over the network. This also makes the output deterministic. */
-      memset(ptrGarbage, 0, garbageLen);
-
-      /* For a correct length of the upper-band bit-stream together
-       * with the garbage. Garbage is embeded in upper-band bit-stream.
-       * That is the only way to preserve backward compatibility. */
-      if ((instISAC->bandwidthKHz == isac8kHz) ||
-          (streamLenUB == 0)) {
-        encoded[streamLenLB] = garbageLen;
-      } else {
-        encoded[streamLenLB] += garbageLen;
-        /* Write the length of the garbage at the end of the upper-band
-         *  bit-stream, if exists. This helps for sanity check. */
-        encoded[streamLenLB + 1 + streamLenUB] = garbageLen;
-
-      }
-      streamLen += garbageLen;
-    }
-  } else {
-    /* update rate model */
-    WebRtcIsac_UpdateRateModel(
-        &instISAC->rate_data_obj, streamLen,
-        instISAC->instLB.ISACencLB_obj.current_framesamples, bottleneck);
-    garbageLen = 0;
-  }
-
-  /* Generate CRC if required. */
-  if ((instISAC->bandwidthKHz != isac8kHz) && (streamLenUB > 0)) {
-    uint32_t crc;
-
-    WebRtcIsac_GetCrc((int16_t*)(&(encoded[streamLenLB + 1])),
-                      streamLenUB + garbageLen, &crc);
-#ifndef WEBRTC_ARCH_BIG_ENDIAN
-    for (k = 0; k < LEN_CHECK_SUM_WORD8; k++) {
-      encoded[streamLen - LEN_CHECK_SUM_WORD8 + k] =
-          (uint8_t)(crc >> (24 - k * 8));
-    }
-#else
-    memcpy(&encoded[streamLenLB + streamLenUB + 1], &crc, LEN_CHECK_SUM_WORD8);
-#endif
-  }
-  return streamLen;
-}
-
-
-/******************************************************************************
- * WebRtcIsac_GetNewBitStream(...)
- *
- * This function returns encoded data, with the recieved bwe-index in the
- * stream. If the rate is set to a value less than bottleneck of codec
- * the new bistream will be re-encoded with the given target rate.
- * It should always return a complete packet, i.e. only called once
- * even for 60 msec frames.
- *
- * NOTE 1! This function does not write in the ISACStruct, it is not allowed.
- * NOTE 2! Rates larger than the bottleneck of the codec will be limited
- *         to the current bottleneck.
- *
- * Input:
- *        - ISAC_main_inst    : ISAC instance.
- *        - bweIndex          : Index of bandwidth estimate to put in new
- *                              bitstream
- *        - rate              : target rate of the transcoder is bits/sec.
- *                              Valid values are the accepted rate in iSAC,
- *                              i.e. 10000 to 56000.
- *
- * Output:
- *        - encoded           : The encoded data vector
- *
- * Return value               : >0 - Length (in bytes) of coded data
- *                              -1 - Error  or called in SWB mode
- *                                 NOTE! No error code is written to
- *                                 the struct since it is only allowed to read
- *                                 the struct.
- */
-int16_t WebRtcIsac_GetNewBitStream(ISACStruct*  ISAC_main_inst,
-                                   int16_t  bweIndex,
-                                   int16_t  jitterInfo,
-                                   int32_t  rate,
-                                   uint8_t* encoded,
-                                   int16_t  isRCU) {
-  Bitstr iSACBitStreamInst;   /* Local struct for bitstream handling */
-  int16_t streamLenLB;
-  int16_t streamLenUB;
-  int16_t totalStreamLen;
-  double gain2;
-  double gain1;
-  float scale;
-  enum ISACBandwidth bandwidthKHz;
-  double rateLB;
-  double rateUB;
-  int32_t currentBN;
-  uint32_t crc;
-#ifndef WEBRTC_ARCH_BIG_ENDIAN
-  int16_t  k;
-#endif
-  ISACMainStruct* instISAC = (ISACMainStruct*)ISAC_main_inst;
-
-  if ((instISAC->initFlag & BIT_MASK_ENC_INIT) !=
-      BIT_MASK_ENC_INIT) {
-    return -1;
-  }
-
-  /* Get the bottleneck of this iSAC and limit the
-   * given rate to the current bottleneck. */
-  WebRtcIsac_GetUplinkBw(ISAC_main_inst, &currentBN);
-  if (rate > currentBN) {
-    rate = currentBN;
-  }
-
-  if (WebRtcIsac_RateAllocation(rate, &rateLB, &rateUB, &bandwidthKHz) < 0) {
-    return -1;
-  }
-
-  /* Cannot transcode from 16 kHz to 12 kHz. */
-  if ((bandwidthKHz == isac12kHz) &&
-      (instISAC->bandwidthKHz == isac16kHz)) {
-    return -1;
-  }
-
-  /* A gain [dB] for the given rate. */
-  gain1 = WebRtcIsac_GetSnr(
-      rateLB, instISAC->instLB.ISACencLB_obj.current_framesamples);
-  /* The gain [dB] of this iSAC. */
-  gain2 = WebRtcIsac_GetSnr(
-      instISAC->instLB.ISACencLB_obj.bottleneck,
-      instISAC->instLB.ISACencLB_obj.current_framesamples);
-
-  /* Scale is the ratio of two gains in normal domain. */
-  scale = (float)pow(10, (gain1 - gain2) / 20.0);
-  /* Change the scale if this is a RCU bit-stream. */
-  scale = (isRCU) ? (scale * RCU_TRANSCODING_SCALE) : scale;
-
-  streamLenLB = WebRtcIsac_EncodeStoredDataLb(
-                  &instISAC->instLB.ISACencLB_obj.SaveEnc_obj,
-                  &iSACBitStreamInst, bweIndex, scale);
-
-  if (streamLenLB < 0) {
-    return -1;
-  }
-
-  /* Convert from bytes to int16_t. */
-  memcpy(encoded, iSACBitStreamInst.stream, streamLenLB);
-
-  if (bandwidthKHz == isac8kHz) {
-    return streamLenLB;
-  }
-
-  totalStreamLen = streamLenLB;
-  /* super-wideband is always at 30ms.
-   * These gains are in dB.
-   * Gain for the given rate. */
-  gain1 = WebRtcIsac_GetSnr(rateUB, FRAMESAMPLES);
-  /* Gain of this iSAC */
-  gain2 = WebRtcIsac_GetSnr(instISAC->instUB.ISACencUB_obj.bottleneck,
-                            FRAMESAMPLES);
-
-  /* Scale is the ratio of two gains in normal domain. */
-  scale = (float)pow(10, (gain1 - gain2) / 20.0);
-
-  /* Change the scale if this is a RCU bit-stream. */
-  scale = (isRCU)? (scale * RCU_TRANSCODING_SCALE_UB) : scale;
-
-  streamLenUB = WebRtcIsac_EncodeStoredDataUb(
-                  &(instISAC->instUB.ISACencUB_obj.SaveEnc_obj),
-                  &iSACBitStreamInst, jitterInfo, scale,
-                  instISAC->bandwidthKHz);
-
-  if (streamLenUB < 0) {
-    return -1;
-  }
-
-  if (streamLenUB + 1 + LEN_CHECK_SUM_WORD8 > 255) {
-    return streamLenLB;
-  }
-
-  totalStreamLen = streamLenLB + streamLenUB + 1 + LEN_CHECK_SUM_WORD8;
-  encoded[streamLenLB] = streamLenUB + 1 + LEN_CHECK_SUM_WORD8;
-
-  memcpy(&encoded[streamLenLB + 1], iSACBitStreamInst.stream,
-         streamLenUB);
-
-  WebRtcIsac_GetCrc((int16_t*)(&(encoded[streamLenLB + 1])),
-                    streamLenUB, &crc);
-#ifndef WEBRTC_ARCH_BIG_ENDIAN
-  for (k = 0; k < LEN_CHECK_SUM_WORD8; k++) {
-    encoded[totalStreamLen - LEN_CHECK_SUM_WORD8 + k] =
-      (uint8_t)((crc >> (24 - k * 8)) & 0xFF);
-  }
-#else
-  memcpy(&encoded[streamLenLB + streamLenUB + 1], &crc,
-         LEN_CHECK_SUM_WORD8);
-#endif
-  return totalStreamLen;
-}
-
-
-/****************************************************************************
- * DecoderInitLb(...) - internal function for initialization of
- *                                Lower Band
- * DecoderInitUb(...) - internal function for initialization of
- *                                Upper Band
- * WebRtcIsac_DecoderInit(...) - API function
- *
- * This function initializes a ISAC instance prior to the decoder calls.
- *
- * Input:
- *        - ISAC_main_inst    : ISAC instance.
- */
-static void DecoderInitLb(ISACLBStruct* instISAC) {
-  int i;
-  /* Initialize stream vector to zero. */
-  for (i = 0; i < STREAM_SIZE_MAX_60; i++) {
-    instISAC->ISACdecLB_obj.bitstr_obj.stream[i] = 0;
-  }
-
-  WebRtcIsac_InitMasking(&instISAC->ISACdecLB_obj.maskfiltstr_obj);
-  WebRtcIsac_InitPostFilterbank(
-    &instISAC->ISACdecLB_obj.postfiltbankstr_obj);
-  WebRtcIsac_InitPitchFilter(&instISAC->ISACdecLB_obj.pitchfiltstr_obj);
-}
-
-static void DecoderInitUb(ISACUBStruct* instISAC) {
-  int i;
-  /* Init stream vector to zero */
-  for (i = 0; i < STREAM_SIZE_MAX_60; i++) {
-    instISAC->ISACdecUB_obj.bitstr_obj.stream[i] = 0;
-  }
-
-  WebRtcIsac_InitMasking(&instISAC->ISACdecUB_obj.maskfiltstr_obj);
-  WebRtcIsac_InitPostFilterbank(
-    &instISAC->ISACdecUB_obj.postfiltbankstr_obj);
-}
-
-void WebRtcIsac_DecoderInit(ISACStruct* ISAC_main_inst) {
-  ISACMainStruct* instISAC = (ISACMainStruct*)ISAC_main_inst;
-
-  DecoderInitLb(&instISAC->instLB);
-  if (instISAC->decoderSamplingRateKHz == kIsacSuperWideband) {
-    memset(instISAC->synthesisFBState1, 0,
-           FB_STATE_SIZE_WORD32 * sizeof(int32_t));
-    memset(instISAC->synthesisFBState2, 0,
-           FB_STATE_SIZE_WORD32 * sizeof(int32_t));
-    DecoderInitUb(&(instISAC->instUB));
-  }
-  if ((instISAC->initFlag & BIT_MASK_ENC_INIT) != BIT_MASK_ENC_INIT) {
-    WebRtcIsac_InitBandwidthEstimator(&instISAC->bwestimator_obj,
-                                      instISAC->encoderSamplingRateKHz,
-                                      instISAC->decoderSamplingRateKHz);
-  }
-  instISAC->initFlag |= BIT_MASK_DEC_INIT;
-  instISAC->resetFlag_8kHz = 0;
-}
-
-
-/****************************************************************************
- * WebRtcIsac_UpdateBwEstimate(...)
- *
- * This function updates the estimate of the bandwidth.
- *
- * NOTE:
- * The estimates of bandwidth is not valid if the sample rate of the far-end
- * encoder is set to 48 kHz and send timestamps are increamented according to
- * 48 kHz sampling rate.
- *
- * Input:
- *        - ISAC_main_inst    : ISAC instance.
- *        - encoded           : encoded ISAC frame(s).
- *        - packet_size       : size of the packet.
- *        - rtp_seq_number    : the RTP number of the packet.
- *        - arr_ts            : the arrival time of the packet (from NetEq)
- *                              in samples.
- *
- * Return value               :  0 - Ok
- *                              -1 - Error
- */
-int16_t WebRtcIsac_UpdateBwEstimate(ISACStruct* ISAC_main_inst,
-                                    const uint8_t* encoded,
-                                    size_t packet_size,
-                                    uint16_t rtp_seq_number,
-                                    uint32_t send_ts,
-                                    uint32_t arr_ts) {
-  ISACMainStruct* instISAC = (ISACMainStruct*)ISAC_main_inst;
-  Bitstr streamdata;
-#ifndef WEBRTC_ARCH_BIG_ENDIAN
-  int k;
-#endif
-  int16_t err;
-
-  /* Check if decoder initiated. */
-  if ((instISAC->initFlag & BIT_MASK_DEC_INIT) != BIT_MASK_DEC_INIT) {
-    instISAC->errorCode = ISAC_DECODER_NOT_INITIATED;
-    return -1;
-  }
-
-  /* Check that the size of the packet is valid, and if not return without
-   * updating the bandwidth estimate. A valid size is at least 10 bytes. */
-  if (packet_size < 10) {
-    /* Return error code if the packet length is null. */
-    instISAC->errorCode = ISAC_EMPTY_PACKET;
-    return -1;
-  }
-
-  WebRtcIsac_ResetBitstream(&(streamdata));
-
-#ifndef WEBRTC_ARCH_BIG_ENDIAN
-  for (k = 0; k < 10; k++) {
-    uint16_t ek = ((const uint16_t*)encoded)[k >> 1];
-    streamdata.stream[k] = (uint8_t)((ek >> ((k & 1) << 3)) & 0xff);
-  }
-#else
-  memcpy(streamdata.stream, encoded, 10);
-#endif
-
-  err = WebRtcIsac_EstimateBandwidth(&instISAC->bwestimator_obj, &streamdata,
-                                     packet_size, rtp_seq_number, send_ts,
-                                     arr_ts, instISAC->encoderSamplingRateKHz,
-                                     instISAC->decoderSamplingRateKHz);
-  if (err < 0) {
-    /* Return error code if something went wrong. */
-    instISAC->errorCode = -err;
-    return -1;
-  }
-  return 0;
-}
-
-static int Decode(ISACStruct* ISAC_main_inst,
-                  const uint8_t* encoded,
-                  size_t lenEncodedBytes,
-                  int16_t* decoded,
-                  int16_t* speechType,
-                  int16_t isRCUPayload) {
-  /* Number of samples (480 or 960), output from decoder
-     that were actually used in the encoder/decoder
-     (determined on the fly). */
-  int16_t numSamplesLB;
-  int16_t numSamplesUB;
-  int16_t speechIdx;
-  float outFrame[MAX_FRAMESAMPLES];
-  int16_t outFrameLB[MAX_FRAMESAMPLES];
-  int16_t outFrameUB[MAX_FRAMESAMPLES];
-  int numDecodedBytesLBint;
-  size_t numDecodedBytesLB;
-  int numDecodedBytesUB;
-  size_t lenEncodedLBBytes;
-  int16_t validChecksum = 1;
-  int16_t k;
-  uint16_t numLayer;
-  size_t totSizeBytes;
-  int16_t err;
-
-  ISACMainStruct* instISAC = (ISACMainStruct*)ISAC_main_inst;
-  ISACUBDecStruct* decInstUB = &(instISAC->instUB.ISACdecUB_obj);
-  ISACLBDecStruct* decInstLB = &(instISAC->instLB.ISACdecLB_obj);
-
-  /* Check if decoder initiated. */
-  if ((instISAC->initFlag & BIT_MASK_DEC_INIT) !=
-      BIT_MASK_DEC_INIT) {
-    instISAC->errorCode = ISAC_DECODER_NOT_INITIATED;
-    return -1;
-  }
-
-  if (lenEncodedBytes == 0) {
-    /* return error code if the packet length is null. */
-    instISAC->errorCode = ISAC_EMPTY_PACKET;
-    return -1;
-  }
-
-  /* The size of the encoded lower-band is bounded by
-   * STREAM_SIZE_MAX. If a payload with the size larger than STREAM_SIZE_MAX
-   * is received, it is not considered erroneous. */
-  lenEncodedLBBytes = (lenEncodedBytes > STREAM_SIZE_MAX) ?
-      STREAM_SIZE_MAX : lenEncodedBytes;
-
-  /* Copy to lower-band bit-stream structure. */
-  memcpy(instISAC->instLB.ISACdecLB_obj.bitstr_obj.stream, encoded,
-         lenEncodedLBBytes);
-
-  /* We need to initialize numSamplesLB to something; otherwise, in the test
-     for whether we should return -1 below, the compiler might generate code
-     that fools Memcheck (Valgrind) into thinking that the control flow depends
-     on the uninitialized value in numSamplesLB (since WebRtcIsac_DecodeLb will
-     not fill it in if it fails and returns -1). */
-  numSamplesLB = 0;
-
-  /* Regardless of that the current codec is setup to work in
-   * wideband or super-wideband, the decoding of the lower-band
-   * has to be performed. */
-  numDecodedBytesLBint = WebRtcIsac_DecodeLb(&instISAC->transform_tables,
-                                             outFrame, decInstLB,
-                                             &numSamplesLB, isRCUPayload);
-  numDecodedBytesLB = (size_t)numDecodedBytesLBint;
-  if ((numDecodedBytesLBint < 0) ||
-      (numDecodedBytesLB > lenEncodedLBBytes) ||
-      (numSamplesLB > MAX_FRAMESAMPLES)) {
-    instISAC->errorCode = ISAC_LENGTH_MISMATCH;
-    return -1;
-  }
-
-  /* Error Check, we accept multi-layer bit-stream This will limit number
-   * of iterations of the while loop. Even without this the number
-   * of iterations is limited. */
-  numLayer = 1;
-  totSizeBytes = numDecodedBytesLB;
-  while (totSizeBytes != lenEncodedBytes) {
-    if ((totSizeBytes > lenEncodedBytes) ||
-        (encoded[totSizeBytes] == 0) ||
-        (numLayer > MAX_NUM_LAYERS)) {
-      instISAC->errorCode = ISAC_LENGTH_MISMATCH;
-      return -1;
-    }
-    totSizeBytes += encoded[totSizeBytes];
-    numLayer++;
-  }
-
-  if (instISAC->decoderSamplingRateKHz == kIsacWideband) {
-    for (k = 0; k < numSamplesLB; k++) {
-      if (outFrame[k] > 32767) {
-        decoded[k] = 32767;
-      } else if (outFrame[k] < -32768) {
-        decoded[k] = -32768;
-      } else {
-        decoded[k] = (int16_t)WebRtcIsac_lrint(outFrame[k]);
-      }
-    }
-    numSamplesUB = 0;
-  } else {
-    uint32_t crc;
-    /* We don't accept larger than 30ms (480 samples at lower-band)
-     * frame-size. */
-    for (k = 0; k < numSamplesLB; k++) {
-      if (outFrame[k] > 32767) {
-        outFrameLB[k] = 32767;
-      } else if (outFrame[k] < -32768) {
-        outFrameLB[k] = -32768;
-      } else {
-        outFrameLB[k] = (int16_t)WebRtcIsac_lrint(outFrame[k]);
-      }
-    }
-
-    /* Check for possible error, and if upper-band stream exists. */
-    if (numDecodedBytesLB == lenEncodedBytes) {
-      /* Decoding was successful. No super-wideband bit-stream exists. */
-      numSamplesUB = numSamplesLB;
-      memset(outFrameUB, 0, sizeof(int16_t) *  numSamplesUB);
-
-      /* Prepare for the potential increase of signal bandwidth. */
-      instISAC->resetFlag_8kHz = 2;
-    } else {
-      /* This includes the checksum and the bytes that stores the length. */
-      int16_t lenNextStream = encoded[numDecodedBytesLB];
-
-      /* Is this garbage or valid super-wideband bit-stream?
-       * Check if checksum is valid. */
-      if (lenNextStream <= (LEN_CHECK_SUM_WORD8 + 1)) {
-        /* Such a small second layer cannot be super-wideband layer.
-         * It must be a short garbage. */
-        validChecksum = 0;
-      } else {
-        /* Run CRC to see if the checksum match. */
-        WebRtcIsac_GetCrc((int16_t*)(&encoded[numDecodedBytesLB + 1]),
-                          lenNextStream - LEN_CHECK_SUM_WORD8 - 1, &crc);
-
-        validChecksum = 1;
-        for (k = 0; k < LEN_CHECK_SUM_WORD8; k++) {
-          validChecksum &= (((crc >> (24 - k * 8)) & 0xFF) ==
-                            encoded[numDecodedBytesLB + lenNextStream -
-                                          LEN_CHECK_SUM_WORD8 + k]);
-        }
-      }
-
-      if (!validChecksum) {
-        /* This is a garbage, we have received a wideband
-         * bit-stream with garbage. */
-        numSamplesUB = numSamplesLB;
-        memset(outFrameUB, 0, sizeof(int16_t) * numSamplesUB);
-      } else {
-        /* A valid super-wideband biststream exists. */
-        enum ISACBandwidth bandwidthKHz;
-        int32_t maxDelayBit;
-
-        /* If we have super-wideband bit-stream, we cannot
-         * have 60 ms frame-size. */
-        if (numSamplesLB > FRAMESAMPLES) {
-          instISAC->errorCode = ISAC_LENGTH_MISMATCH;
-          return -1;
-        }
-
-        /* The rest of the bit-stream contains the upper-band
-         * bit-stream curently this is the only thing there,
-         * however, we might add more layers. */
-
-        /* Have to exclude one byte where the length is stored
-         * and last 'LEN_CHECK_SUM_WORD8' bytes where the
-         * checksum is stored. */
-        lenNextStream -= (LEN_CHECK_SUM_WORD8 + 1);
-
-        memcpy(decInstUB->bitstr_obj.stream,
-               &encoded[numDecodedBytesLB + 1], lenNextStream);
-
-        /* Reset bit-stream object, this is the first decoding. */
-        WebRtcIsac_ResetBitstream(&(decInstUB->bitstr_obj));
-
-        /* Decode jitter information. */
-        err = WebRtcIsac_DecodeJitterInfo(&decInstUB->bitstr_obj, &maxDelayBit);
-        if (err < 0) {
-          instISAC->errorCode = -err;
-          return -1;
-        }
-
-        /* Update jitter info which is in the upper-band bit-stream
-         * only if the encoder is in super-wideband. Otherwise,
-         * the jitter info is already embedded in bandwidth index
-         * and has been updated. */
-        if (instISAC->encoderSamplingRateKHz == kIsacSuperWideband) {
-          err = WebRtcIsac_UpdateUplinkJitter(
-                  &(instISAC->bwestimator_obj), maxDelayBit);
-          if (err < 0) {
-            instISAC->errorCode = -err;
-            return -1;
-          }
-        }
-
-        /* Decode bandwidth information. */
-        err = WebRtcIsac_DecodeBandwidth(&decInstUB->bitstr_obj,
-                                         &bandwidthKHz);
-        if (err < 0) {
-          instISAC->errorCode = -err;
-          return -1;
-        }
-
-        switch (bandwidthKHz) {
-          case isac12kHz: {
-            numDecodedBytesUB = WebRtcIsac_DecodeUb12(
-                &instISAC->transform_tables, outFrame, decInstUB, isRCUPayload);
-
-            /* Hang-over for transient alleviation -
-             * wait two frames to add the upper band going up from 8 kHz. */
-            if (instISAC->resetFlag_8kHz > 0) {
-              if (instISAC->resetFlag_8kHz == 2) {
-                /* Silence first and a half frame. */
-                memset(outFrame, 0, MAX_FRAMESAMPLES *
-                       sizeof(float));
-              } else {
-                const float rampStep = 2.0f / MAX_FRAMESAMPLES;
-                float rampVal = 0;
-                memset(outFrame, 0, (MAX_FRAMESAMPLES >> 1) *
-                       sizeof(float));
-
-                /* Ramp up second half of second frame. */
-                for (k = MAX_FRAMESAMPLES / 2; k < MAX_FRAMESAMPLES; k++) {
-                  outFrame[k] *= rampVal;
-                  rampVal += rampStep;
-                }
-              }
-              instISAC->resetFlag_8kHz -= 1;
-            }
-
-            break;
-          }
-          case isac16kHz: {
-            numDecodedBytesUB = WebRtcIsac_DecodeUb16(
-                &instISAC->transform_tables, outFrame, decInstUB, isRCUPayload);
-            break;
-          }
-          default:
-            return -1;
-        }
-
-        if (numDecodedBytesUB < 0) {
-          instISAC->errorCode = numDecodedBytesUB;
-          return -1;
-        }
-        if (numDecodedBytesLB + numDecodedBytesUB > lenEncodedBytes) {
-          // We have supposedly decoded more bytes than we were given. Likely
-          // caused by bad input data.
-          instISAC->errorCode = ISAC_LENGTH_MISMATCH;
-          return -1;
-        }
-
-        /* It might be less due to garbage. */
-        if ((numDecodedBytesUB != lenNextStream) &&
-            (numDecodedBytesUB != (lenNextStream -
-                encoded[numDecodedBytesLB + 1 + numDecodedBytesUB]))) {
-          instISAC->errorCode = ISAC_LENGTH_MISMATCH;
-          return -1;
-        }
-
-        /* If there is no error Upper-band always decodes
-         * 30 ms (480 samples). */
-        numSamplesUB = FRAMESAMPLES;
-
-        /* Convert to W16. */
-        for (k = 0; k < numSamplesUB; k++) {
-          if (outFrame[k] > 32767) {
-            outFrameUB[k] = 32767;
-          } else if (outFrame[k] < -32768) {
-            outFrameUB[k] = -32768;
-          } else {
-            outFrameUB[k] = (int16_t)WebRtcIsac_lrint(
-                              outFrame[k]);
-          }
-        }
-      }
-    }
-
-    speechIdx = 0;
-    while (speechIdx < numSamplesLB) {
-      WebRtcSpl_SynthesisQMF(&outFrameLB[speechIdx], &outFrameUB[speechIdx],
-                             FRAMESAMPLES_10ms, &decoded[(speechIdx << 1)],
-                             instISAC->synthesisFBState1,
-                             instISAC->synthesisFBState2);
-
-      speechIdx += FRAMESAMPLES_10ms;
-    }
-  }
-  *speechType = 0;
-  return (numSamplesLB + numSamplesUB);
-}
-
-
-
-
-
-
-
-/****************************************************************************
- * WebRtcIsac_Decode(...)
- *
- * This function decodes a ISAC frame. Output speech length
- * will be a multiple of 480 samples: 480 or 960 samples,
- * depending on the  frameSize (30 or 60 ms).
- *
- * Input:
- *        - ISAC_main_inst    : ISAC instance.
- *        - encoded           : encoded ISAC frame(s)
- *        - len               : bytes in encoded vector
- *
- * Output:
- *        - decoded           : The decoded vector
- *
- * Return value               : >0 - number of samples in decoded vector
- *                              -1 - Error
- */
-
-int WebRtcIsac_Decode(ISACStruct* ISAC_main_inst,
-                      const uint8_t* encoded,
-                      size_t lenEncodedBytes,
-                      int16_t* decoded,
-                      int16_t* speechType) {
-  int16_t isRCUPayload = 0;
-  return Decode(ISAC_main_inst, encoded, lenEncodedBytes, decoded,
-                speechType, isRCUPayload);
-}
-
-/****************************************************************************
- * WebRtcIsac_DecodeRcu(...)
- *
- * This function decodes a redundant (RCU) iSAC frame. Function is called in
- * NetEq with a stored RCU payload in case of packet loss. Output speech length
- * will be a multiple of 480 samples: 480 or 960 samples,
- * depending on the framesize (30 or 60 ms).
- *
- * Input:
- *      - ISAC_main_inst     : ISAC instance.
- *      - encoded            : encoded ISAC RCU frame(s)
- *      - len                : bytes in encoded vector
- *
- * Output:
- *      - decoded            : The decoded vector
- *
- * Return value              : >0 - number of samples in decoded vector
- *                             -1 - Error
- */
-
-
-
-int WebRtcIsac_DecodeRcu(ISACStruct* ISAC_main_inst,
-                         const uint8_t* encoded,
-                         size_t lenEncodedBytes,
-                         int16_t* decoded,
-                         int16_t* speechType) {
-  int16_t isRCUPayload = 1;
-  return Decode(ISAC_main_inst, encoded, lenEncodedBytes, decoded,
-                speechType, isRCUPayload);
-}
-
-
-/****************************************************************************
- * WebRtcIsac_DecodePlc(...)
- *
- * This function conducts PLC for ISAC frame(s). Output speech length
- * will be a multiple of 480 samples: 480 or 960 samples,
- * depending on the  frameSize (30 or 60 ms).
- *
- * Input:
- *        - ISAC_main_inst    : ISAC instance.
- *        - noOfLostFrames    : Number of PLC frames to produce
- *
- * Output:
- *        - decoded           : The decoded vector
- *
- * Return value               : Number of samples in decoded PLC vector
- */
-size_t WebRtcIsac_DecodePlc(ISACStruct* ISAC_main_inst,
-                            int16_t* decoded,
-                            size_t noOfLostFrames) {
-  size_t numSamples = 0;
-  ISACMainStruct* instISAC = (ISACMainStruct*)ISAC_main_inst;
-
-  /* Limit number of frames to two = 60 millisecond.
-   * Otherwise we exceed data vectors. */
-  if (noOfLostFrames > 2) {
-    noOfLostFrames = 2;
-  }
-
-  /* Get the number of samples per frame */
-  switch (instISAC->decoderSamplingRateKHz) {
-    case kIsacWideband: {
-      numSamples = 480 * noOfLostFrames;
-      break;
-    }
-    case kIsacSuperWideband: {
-      numSamples = 960 * noOfLostFrames;
-      break;
-    }
-  }
-
-  /* Set output samples to zero. */
-  memset(decoded, 0, numSamples * sizeof(int16_t));
-  return numSamples;
-}
-
-
-/****************************************************************************
- * ControlLb(...) - Internal function for controlling Lower Band
- * ControlUb(...) - Internal function for controlling Upper Band
- * WebRtcIsac_Control(...) - API function
- *
- * This function sets the limit on the short-term average bit rate and the
- * frame length. Should be used only in Instantaneous mode.
- *
- * Input:
- *        - ISAC_main_inst    : ISAC instance.
- *        - rate              : limit on the short-term average bit rate,
- *                              in bits/second (between 10000 and 32000)
- *        - frameSize         : number of milliseconds per frame (30 or 60)
- *
- * Return value               : 0 - ok
- *                             -1 - Error
- */
-static int16_t ControlLb(ISACLBStruct* instISAC, double rate,
-                         int16_t frameSize) {
-  if ((rate >= 10000) && (rate <= 32000)) {
-    instISAC->ISACencLB_obj.bottleneck = rate;
-  } else {
-    return -ISAC_DISALLOWED_BOTTLENECK;
-  }
-
-  if ((frameSize == 30) || (frameSize == 60)) {
-    instISAC->ISACencLB_obj.new_framelength = (FS / 1000) *  frameSize;
-  } else {
-    return -ISAC_DISALLOWED_FRAME_LENGTH;
-  }
-
-  return 0;
-}
-
-static int16_t ControlUb(ISACUBStruct* instISAC, double rate) {
-  if ((rate >= 10000) && (rate <= 32000)) {
-    instISAC->ISACencUB_obj.bottleneck = rate;
-  } else {
-    return -ISAC_DISALLOWED_BOTTLENECK;
-  }
-  return 0;
-}
-
-int16_t WebRtcIsac_Control(ISACStruct* ISAC_main_inst,
-                           int32_t bottleneckBPS,
-                           int frameSize) {
-  ISACMainStruct* instISAC = (ISACMainStruct*)ISAC_main_inst;
-  int16_t status;
-  double rateLB;
-  double rateUB;
-  enum ISACBandwidth bandwidthKHz;
-
-  if (instISAC->codingMode == 0) {
-    /* In adaptive mode. */
-    instISAC->errorCode = ISAC_MODE_MISMATCH;
-    return -1;
-  }
-
-  /* Check if encoder initiated */
-  if ((instISAC->initFlag & BIT_MASK_ENC_INIT) !=
-      BIT_MASK_ENC_INIT) {
-    instISAC->errorCode = ISAC_ENCODER_NOT_INITIATED;
-    return -1;
-  }
-
-  if (instISAC->encoderSamplingRateKHz == kIsacWideband) {
-    /* If the sampling rate is 16kHz then bandwith should be 8kHz,
-     * regardless of bottleneck. */
-    bandwidthKHz = isac8kHz;
-    rateLB = (bottleneckBPS > 32000) ? 32000 : bottleneckBPS;
-    rateUB = 0;
-  } else {
-    if (WebRtcIsac_RateAllocation(bottleneckBPS, &rateLB, &rateUB,
-                                  &bandwidthKHz) < 0) {
-      return -1;
-    }
-  }
-
-  if ((instISAC->encoderSamplingRateKHz == kIsacSuperWideband) &&
-      (frameSize != 30) &&
-      (bandwidthKHz != isac8kHz)) {
-    /* Cannot have 60 ms in super-wideband. */
-    instISAC->errorCode = ISAC_DISALLOWED_FRAME_LENGTH;
-    return -1;
-  }
-
-  status = ControlLb(&instISAC->instLB, rateLB, (int16_t)frameSize);
-  if (status < 0) {
-    instISAC->errorCode = -status;
-    return -1;
-  }
-  if (bandwidthKHz != isac8kHz) {
-    status = ControlUb(&(instISAC->instUB), rateUB);
-    if (status < 0) {
-      instISAC->errorCode = -status;
-      return -1;
-    }
-  }
-
-
-  /* Check if bandwidth is changing from wideband to super-wideband
-   * then we have to synch data buffer of lower & upper-band. Also
-   * clean up the upper-band data buffer. */
-
-  if ((instISAC->bandwidthKHz == isac8kHz) && (bandwidthKHz != isac8kHz)) {
-    memset(instISAC->instUB.ISACencUB_obj.data_buffer_float, 0,
-           sizeof(float) * (MAX_FRAMESAMPLES + LB_TOTAL_DELAY_SAMPLES));
-
-    if (bandwidthKHz == isac12kHz) {
-      instISAC->instUB.ISACencUB_obj.buffer_index =
-        instISAC->instLB.ISACencLB_obj.buffer_index;
-    } else {
-      instISAC->instUB.ISACencUB_obj.buffer_index =
-          LB_TOTAL_DELAY_SAMPLES + instISAC->instLB.ISACencLB_obj.buffer_index;
-
-      memcpy(&(instISAC->instUB.ISACencUB_obj.lastLPCVec),
-             WebRtcIsac_kMeanLarUb16, sizeof(double) * UB_LPC_ORDER);
-    }
-  }
-
-  /* Update the payload limit if the bandwidth is changing. */
-  if (instISAC->bandwidthKHz != bandwidthKHz) {
-    instISAC->bandwidthKHz = bandwidthKHz;
-    UpdatePayloadSizeLimit(instISAC);
-  }
-  instISAC->bottleneck = bottleneckBPS;
-  return 0;
-}
-
-void WebRtcIsac_SetInitialBweBottleneck(ISACStruct* ISAC_main_inst,
-                                        int bottleneck_bits_per_second) {
-  ISACMainStruct* instISAC = (ISACMainStruct*)ISAC_main_inst;
-  RTC_DCHECK_GE(bottleneck_bits_per_second, 10000);
-  RTC_DCHECK_LE(bottleneck_bits_per_second, 32000);
-  instISAC->bwestimator_obj.send_bw_avg = (float)bottleneck_bits_per_second;
-}
-
-/****************************************************************************
- * WebRtcIsac_ControlBwe(...)
- *
- * This function sets the initial values of bottleneck and frame-size if
- * iSAC is used in channel-adaptive mode. Through this API, users can
- * enforce a frame-size for all values of bottleneck. Then iSAC will not
- * automatically change the frame-size.
- *
- *
- * Input:
- *        - ISAC_main_inst    : ISAC instance.
- *        - rateBPS           : initial value of bottleneck in bits/second
- *                              10000 <= rateBPS <= 32000 is accepted
- *                              For default bottleneck set rateBPS = 0
- *        - frameSizeMs       : number of milliseconds per frame (30 or 60)
- *        - enforceFrameSize  : 1 to enforce the given frame-size through out
- *                              the adaptation process, 0 to let iSAC change
- *                              the frame-size if required.
- *
- * Return value               : 0 - ok
- *                             -1 - Error
- */
-int16_t WebRtcIsac_ControlBwe(ISACStruct* ISAC_main_inst,
-                              int32_t bottleneckBPS,
-                              int frameSizeMs,
-                              int16_t enforceFrameSize) {
-  ISACMainStruct* instISAC = (ISACMainStruct*)ISAC_main_inst;
-  enum ISACBandwidth bandwidth;
-
-   /* Check if encoder initiated */
-  if ((instISAC->initFlag & BIT_MASK_ENC_INIT) !=
-      BIT_MASK_ENC_INIT) {
-    instISAC->errorCode = ISAC_ENCODER_NOT_INITIATED;
-    return -1;
-  }
-
-  /* Check that we are in channel-adaptive mode, otherwise, return (-1) */
-  if (instISAC->codingMode != 0) {
-    instISAC->errorCode = ISAC_MODE_MISMATCH;
-    return -1;
-  }
-  if ((frameSizeMs != 30) &&
-      (instISAC->encoderSamplingRateKHz == kIsacSuperWideband)) {
-    return -1;
-  }
-
-  /* Set structure variable if enforceFrameSize is set. ISAC will then
-   * keep the chosen frame size. */
-  if (enforceFrameSize != 0) {
-    instISAC->instLB.ISACencLB_obj.enforceFrameSize = 1;
-  } else {
-    instISAC->instLB.ISACencLB_obj.enforceFrameSize = 0;
-  }
-
-  /* Set the initial rate. If the input value is zero then the default intial
-   * rate is used. Otehrwise, values between 10 to 32 kbps are accepted. */
-  if (bottleneckBPS != 0) {
-    double rateLB;
-    double rateUB;
-    if (WebRtcIsac_RateAllocation(bottleneckBPS, &rateLB, &rateUB,
-                                  &bandwidth) < 0) {
-      return -1;
-    }
-    instISAC->bwestimator_obj.send_bw_avg = (float)bottleneckBPS;
-    instISAC->bandwidthKHz = bandwidth;
-  }
-
-  /* Set the initial frame-size. If 'enforceFrameSize' is set, the frame-size
-   *  will not change */
-  if (frameSizeMs != 0) {
-    if ((frameSizeMs  == 30) || (frameSizeMs == 60)) {
-      instISAC->instLB.ISACencLB_obj.new_framelength =
-          (int16_t)((FS / 1000) * frameSizeMs);
-    } else {
-      instISAC->errorCode = ISAC_DISALLOWED_FRAME_LENGTH;
-      return -1;
-    }
-  }
-  return 0;
-}
-
-
-/****************************************************************************
- * WebRtcIsac_GetDownLinkBwIndex(...)
- *
- * This function returns index representing the Bandwidth estimate from
- * the other side to this side.
- *
- * Input:
- *        - ISAC_main_inst    : iSAC structure
- *
- * Output:
- *        - bweIndex         : Bandwidth estimate to transmit to other side.
- *
- */
-int16_t WebRtcIsac_GetDownLinkBwIndex(ISACStruct* ISAC_main_inst,
-                                      int16_t* bweIndex,
-                                      int16_t* jitterInfo) {
-  ISACMainStruct* instISAC = (ISACMainStruct*)ISAC_main_inst;
-
-  /* Check if encoder initialized. */
-  if ((instISAC->initFlag & BIT_MASK_DEC_INIT) !=
-      BIT_MASK_DEC_INIT) {
-    instISAC->errorCode = ISAC_ENCODER_NOT_INITIATED;
-    return -1;
-  }
-
-  /* Call function to get Bandwidth Estimate. */
-  WebRtcIsac_GetDownlinkBwJitIndexImpl(&(instISAC->bwestimator_obj), bweIndex,
-                                       jitterInfo,
-                                       instISAC->decoderSamplingRateKHz);
-  return 0;
-}
-
-
-/****************************************************************************
- * WebRtcIsac_UpdateUplinkBw(...)
- *
- * This function takes an index representing the Bandwidth estimate from
- * this side to other side and updates BWE.
- *
- * Input:
- *        - ISAC_main_inst    : iSAC structure
- *        - rateIndex         : Bandwidth estimate from other side.
- *
- * Return value               : 0 - ok
- *                             -1 - index out of range
- */
-int16_t WebRtcIsac_UpdateUplinkBw(ISACStruct* ISAC_main_inst,
-                                  int16_t bweIndex) {
-  ISACMainStruct* instISAC = (ISACMainStruct*)ISAC_main_inst;
-  int16_t returnVal;
-
-  /* Check if encoder initiated. */
-  if ((instISAC->initFlag & BIT_MASK_ENC_INIT) !=
-      BIT_MASK_ENC_INIT) {
-    instISAC->errorCode = ISAC_ENCODER_NOT_INITIATED;
-    return -1;
-  }
-
-  /* Call function to get Bandwidth Estimate. */
-  returnVal = WebRtcIsac_UpdateUplinkBwImpl(
-                &(instISAC->bwestimator_obj), bweIndex,
-                instISAC->encoderSamplingRateKHz);
-
-  if (returnVal < 0) {
-    instISAC->errorCode = -returnVal;
-    return -1;
-  } else {
-    return 0;
-  }
-}
-
-
-/****************************************************************************
- * WebRtcIsac_ReadBwIndex(...)
- *
- * This function returns the index of the Bandwidth estimate from the
- * bit-stream.
- *
- * Input:
- *        - encoded           : Encoded bit-stream
- *
- * Output:
- *        - frameLength       : Length of frame in packet (in samples)
- *        - bweIndex          : Bandwidth estimate in bit-stream
- *
- */
-int16_t WebRtcIsac_ReadBwIndex(const uint8_t* encoded,
-                               int16_t* bweIndex) {
-  Bitstr streamdata;
-#ifndef WEBRTC_ARCH_BIG_ENDIAN
-  int k;
-#endif
-  int16_t err;
-
-  WebRtcIsac_ResetBitstream(&(streamdata));
-
-#ifndef WEBRTC_ARCH_BIG_ENDIAN
-  for (k = 0; k < 10; k++) {
-    int16_t ek2 = ((const int16_t*)encoded)[k >> 1];
-    streamdata.stream[k] = (uint8_t)((ek2 >> ((k & 1) << 3)) & 0xff);
-  }
-#else
-  memcpy(streamdata.stream, encoded, 10);
-#endif
-
-  /* Decode frame length. */
-  err = WebRtcIsac_DecodeFrameLen(&streamdata, bweIndex);
-  if (err < 0) {
-    return err;
-  }
-
-  /* Decode BW estimation. */
-  err = WebRtcIsac_DecodeSendBW(&streamdata, bweIndex);
-  if (err < 0) {
-    return err;
-  }
-
-  return 0;
-}
-
-
-/****************************************************************************
- * WebRtcIsac_ReadFrameLen(...)
- *
- * This function returns the number of samples the decoder will generate if
- * the given payload is decoded.
- *
- * Input:
- *        - encoded           : Encoded bitstream
- *
- * Output:
- *        - frameLength       : Length of frame in packet (in samples)
- *
- */
-int16_t WebRtcIsac_ReadFrameLen(ISACStruct* ISAC_main_inst,
-                                const uint8_t* encoded,
-                                int16_t* frameLength) {
-  Bitstr streamdata;
-#ifndef WEBRTC_ARCH_BIG_ENDIAN
-  int k;
-#endif
-  int16_t err;
-  ISACMainStruct* instISAC;
-
-  WebRtcIsac_ResetBitstream(&(streamdata));
-
-#ifndef WEBRTC_ARCH_BIG_ENDIAN
-  for (k = 0; k < 10; k++) {
-    int16_t ek2 = ((const int16_t*)encoded)[k >> 1];
-    streamdata.stream[k] = (uint8_t)((ek2 >> ((k & 1) << 3)) & 0xff);
-  }
-#else
-  memcpy(streamdata.stream, encoded, 10);
-#endif
-
-  /* Decode frame length. */
-  err = WebRtcIsac_DecodeFrameLen(&streamdata, frameLength);
-  if (err < 0) {
-    return -1;
-  }
-  instISAC = (ISACMainStruct*)ISAC_main_inst;
-
-  if (instISAC->decoderSamplingRateKHz == kIsacSuperWideband) {
-    /* The decoded frame length indicates the number of samples in
-     * lower-band in this case, multiply by 2 to get the total number
-     * of samples. */
-    *frameLength <<= 1;
-  }
-  return 0;
-}
-
-
-/*******************************************************************************
- * WebRtcIsac_GetNewFrameLen(...)
- *
- * This function returns the frame length (in samples) of the next packet.
- * In the case of channel-adaptive mode, iSAC decides on its frame length based
- * on the estimated bottleneck, this AOI allows a user to prepare for the next
- * packet (at the encoder).
- *
- * The primary usage is in CE to make the iSAC works in channel-adaptive mode
- *
- * Input:
- *        - ISAC_main_inst     : iSAC struct
- *
- * Return Value                : frame lenght in samples
- *
- */
-int16_t WebRtcIsac_GetNewFrameLen(ISACStruct* ISAC_main_inst) {
-  ISACMainStruct* instISAC = (ISACMainStruct*)ISAC_main_inst;
-
-  /* Return new frame length. */
-  if (instISAC->in_sample_rate_hz == 16000)
-    return (instISAC->instLB.ISACencLB_obj.new_framelength);
-  else  /* 32000 Hz */
-    return ((instISAC->instLB.ISACencLB_obj.new_framelength) * 2);
-}
-
-
-/****************************************************************************
- * WebRtcIsac_GetErrorCode(...)
- *
- * This function can be used to check the error code of an iSAC instance.
- * When a function returns -1 an error code will be set for that instance.
- * The function below extracts the code of the last error that occurred in
- * the specified instance.
- *
- * Input:
- *        - ISAC_main_inst    : ISAC instance
- *
- * Return value               : Error code
- */
-int16_t WebRtcIsac_GetErrorCode(ISACStruct* ISAC_main_inst) {
- return ((ISACMainStruct*)ISAC_main_inst)->errorCode;
-}
-
-
-/****************************************************************************
- * WebRtcIsac_GetUplinkBw(...)
- *
- * This function outputs the target bottleneck of the codec. In
- * channel-adaptive mode, the target bottleneck is specified through an in-band
- * signalling retrieved by bandwidth estimator.
- * In channel-independent, also called instantaneous mode, the target
- * bottleneck is provided to the encoder by calling xxx_control(...) (if
- * xxx_control is never called, the default values are used.).
- * Note that the output is the iSAC internal operating bottleneck which might
- * differ slightly from the one provided through xxx_control().
- *
- * Input:
- *        - ISAC_main_inst    : iSAC instance
- *
- * Output:
- *        - *bottleneck       : bottleneck in bits/sec
- *
- * Return value               : -1 if error happens
- *                               0 bit-rates computed correctly.
- */
-int16_t WebRtcIsac_GetUplinkBw(ISACStruct*  ISAC_main_inst,
-                               int32_t* bottleneck) {
-  ISACMainStruct* instISAC = (ISACMainStruct*)ISAC_main_inst;
-
-  if (instISAC->codingMode == 0) {
-    /* We are in adaptive mode then get the bottleneck from BWE. */
-    *bottleneck = (int32_t)instISAC->bwestimator_obj.send_bw_avg;
-  } else {
-    *bottleneck = instISAC->bottleneck;
-  }
-
-  if ((*bottleneck > 32000) && (*bottleneck < 38000)) {
-    *bottleneck = 32000;
-  } else if ((*bottleneck > 45000) && (*bottleneck < 50000)) {
-    *bottleneck = 45000;
-  } else if (*bottleneck > 56000) {
-    *bottleneck = 56000;
-  }
-  return 0;
-}
-
-
-/******************************************************************************
- * WebRtcIsac_SetMaxPayloadSize(...)
- *
- * This function sets a limit for the maximum payload size of iSAC. The same
- * value is used both for 30 and 60 ms packets. If the encoder sampling rate
- * is 16 kHz the maximum payload size is between 120 and 400 bytes. If the
- * encoder sampling rate is 32 kHz the maximum payload size is between 120
- * and 600 bytes.
- *
- * ---------------
- * IMPORTANT NOTES
- * ---------------
- * The size of a packet is limited to the minimum of 'max-payload-size' and
- * 'max-rate.' For instance, let's assume the max-payload-size is set to
- * 170 bytes, and max-rate is set to 40 kbps. Note that a limit of 40 kbps
- * translates to 150 bytes for 30ms frame-size & 300 bytes for 60ms
- * frame-size. Then a packet with a frame-size of 30 ms is limited to 150,
- * i.e. min(170, 150), and a packet with 60 ms frame-size is limited to
- * 170 bytes, i.e. min(170, 300).
- *
- * Input:
- *        - ISAC_main_inst    : iSAC instance
- *        - maxPayloadBytes   : maximum size of the payload in bytes
- *                              valid values are between 100 and 400 bytes
- *                              if encoder sampling rate is 16 kHz. For
- *                              32 kHz encoder sampling rate valid values
- *                              are between 100 and 600 bytes.
- *
- * Return value               : 0 if successful
- *                             -1 if error happens
- */
-int16_t WebRtcIsac_SetMaxPayloadSize(ISACStruct* ISAC_main_inst,
-                                     int16_t maxPayloadBytes) {
-  ISACMainStruct* instISAC = (ISACMainStruct*)ISAC_main_inst;
-  int16_t status = 0;
-
-  /* Check if encoder initiated */
-  if ((instISAC->initFlag & BIT_MASK_ENC_INIT) !=
-      BIT_MASK_ENC_INIT) {
-    instISAC->errorCode = ISAC_ENCODER_NOT_INITIATED;
-    return -1;
-  }
-
-  if (instISAC->encoderSamplingRateKHz == kIsacSuperWideband) {
-    /* Sanity check. */
-    if (maxPayloadBytes < 120) {
-      /* 'maxRate' is out of valid range
-       * set to the acceptable value and return -1. */
-      maxPayloadBytes = 120;
-      status = -1;
-    }
-
-    /* sanity check */
-    if (maxPayloadBytes > STREAM_SIZE_MAX) {
-      /* maxRate is out of valid range,
-       * set to the acceptable value and return -1. */
-      maxPayloadBytes = STREAM_SIZE_MAX;
-      status = -1;
-    }
-  } else {
-    if (maxPayloadBytes < 120) {
-      /* Max payload-size is out of valid range
-       * set to the acceptable value and return -1. */
-      maxPayloadBytes = 120;
-      status = -1;
-    }
-    if (maxPayloadBytes > STREAM_SIZE_MAX_60) {
-      /* Max payload-size is out of valid range
-       * set to the acceptable value and return -1. */
-      maxPayloadBytes = STREAM_SIZE_MAX_60;
-      status = -1;
-    }
-  }
-  instISAC->maxPayloadSizeBytes = maxPayloadBytes;
-  UpdatePayloadSizeLimit(instISAC);
-  return status;
-}
-
-
-/******************************************************************************
- * WebRtcIsac_SetMaxRate(...)
- *
- * This function sets the maximum rate which the codec may not exceed for
- * any signal packet. The maximum rate is defined and payload-size per
- * frame-size in bits per second.
- *
- * The codec has a maximum rate of 53400 bits per second (200 bytes per 30
- * ms) if the encoder sampling rate is 16kHz, and 160 kbps (600 bytes/30 ms)
- * if the encoder sampling rate is 32 kHz.
- *
- * It is possible to set a maximum rate between 32000 and 53400 bits/sec
- * in wideband mode, and 32000 to 160000 bits/sec in super-wideband mode.
- *
- * ---------------
- * IMPORTANT NOTES
- * ---------------
- * The size of a packet is limited to the minimum of 'max-payload-size' and
- * 'max-rate.' For instance, let's assume the max-payload-size is set to
- * 170 bytes, and max-rate is set to 40 kbps. Note that a limit of 40 kbps
- * translates to 150 bytes for 30ms frame-size & 300 bytes for 60ms
- * frame-size. Then a packet with a frame-size of 30 ms is limited to 150,
- * i.e. min(170, 150), and a packet with 60 ms frame-size is limited to
- * 170 bytes, min(170, 300).
- *
- * Input:
- *        - ISAC_main_inst    : iSAC instance
- *        - maxRate           : maximum rate in bits per second,
- *                              valid values are 32000 to 53400 bits/sec in
- *                              wideband mode, and 32000 to 160000 bits/sec in
- *                              super-wideband mode.
- *
- * Return value               : 0 if successful
- *                             -1 if error happens
- */
-int16_t WebRtcIsac_SetMaxRate(ISACStruct* ISAC_main_inst,
-                              int32_t maxRate) {
-  ISACMainStruct* instISAC = (ISACMainStruct*)ISAC_main_inst;
-  int16_t maxRateInBytesPer30Ms;
-  int16_t status = 0;
-
-  /* check if encoder initiated */
-  if ((instISAC->initFlag & BIT_MASK_ENC_INIT) != BIT_MASK_ENC_INIT) {
-    instISAC->errorCode = ISAC_ENCODER_NOT_INITIATED;
-    return -1;
-  }
-  /* Calculate maximum number of bytes per 30 msec packets for the
-     given maximum rate. Multiply with 30/1000 to get number of
-     bits per 30 ms, divide by 8 to get number of bytes per 30 ms:
-     maxRateInBytes = floor((maxRate * 30/1000) / 8); */
-  maxRateInBytesPer30Ms = (int16_t)(maxRate * 3 / 800);
-
-  if (instISAC->encoderSamplingRateKHz == kIsacWideband) {
-    if (maxRate < 32000) {
-      /* 'maxRate' is out of valid range.
-       * Set to the acceptable value and return -1. */
-      maxRateInBytesPer30Ms = 120;
-      status = -1;
-    }
-
-    if (maxRate > 53400) {
-      /* 'maxRate' is out of valid range.
-       * Set to the acceptable value and return -1. */
-      maxRateInBytesPer30Ms = 200;
-      status = -1;
-    }
-  } else {
-    if (maxRateInBytesPer30Ms < 120) {
-      /* 'maxRate' is out of valid range
-       * Set to the acceptable value and return -1. */
-      maxRateInBytesPer30Ms = 120;
-      status = -1;
-    }
-
-    if (maxRateInBytesPer30Ms > STREAM_SIZE_MAX) {
-      /* 'maxRate' is out of valid range.
-       * Set to the acceptable value and return -1. */
-      maxRateInBytesPer30Ms = STREAM_SIZE_MAX;
-      status = -1;
-    }
-  }
-  instISAC->maxRateBytesPer30Ms = maxRateInBytesPer30Ms;
-  UpdatePayloadSizeLimit(instISAC);
-  return status;
-}
-
-
-/****************************************************************************
- * WebRtcIsac_GetRedPayload(...)
- *
- * This function populates "encoded" with the redundant payload of the recently
- * encodedframe. This function has to be called once that WebRtcIsac_Encode(...)
- * returns a positive value. Regardless of the frame-size this function will
- * be called only once after encoding is completed. The bit-stream is
- * targeted for 16000 bit/sec.
- *
- * Input:
- *        - ISAC_main_inst    : iSAC struct
- *
- * Output:
- *        - encoded           : the encoded data vector
- *
- *
- * Return value               : >0 - Length (in bytes) of coded data
- *                            : -1 - Error
- */
-int16_t WebRtcIsac_GetRedPayload(ISACStruct* ISAC_main_inst,
-                                 uint8_t* encoded) {
-  Bitstr iSACBitStreamInst;
-  int16_t streamLenLB;
-  int16_t streamLenUB;
-  int16_t streamLen;
-  int16_t totalLenUB;
-  ISACMainStruct* instISAC = (ISACMainStruct*)ISAC_main_inst;
-#ifndef WEBRTC_ARCH_BIG_ENDIAN
-  int k;
-#endif
-
-  if ((instISAC->initFlag & BIT_MASK_ENC_INIT) !=
-      BIT_MASK_ENC_INIT) {
-    instISAC->errorCode = ISAC_ENCODER_NOT_INITIATED;
-  }
-
-  WebRtcIsac_ResetBitstream(&(iSACBitStreamInst));
-
-  streamLenLB = WebRtcIsac_EncodeStoredDataLb(
-                  &instISAC->instLB.ISACencLB_obj.SaveEnc_obj,
-                  &iSACBitStreamInst,
-                  instISAC->instLB.ISACencLB_obj.lastBWIdx,
-                  RCU_TRANSCODING_SCALE);
-  if (streamLenLB < 0) {
-    return -1;
-  }
-
-  /* convert from bytes to int16_t. */
-  memcpy(encoded, iSACBitStreamInst.stream, streamLenLB);
-  streamLen = streamLenLB;
-  if (instISAC->bandwidthKHz == isac8kHz) {
-    return streamLenLB;
-  }
-
-  streamLenUB = WebRtcIsac_GetRedPayloadUb(
-                  &instISAC->instUB.ISACencUB_obj.SaveEnc_obj,
-                  &iSACBitStreamInst, instISAC->bandwidthKHz);
-  if (streamLenUB < 0) {
-    /* An error has happened but this is not the error due to a
-     * bit-stream larger than the limit. */
-    return -1;
-  }
-
-  /* We have one byte to write the total length of the upper-band.
-   * The length includes the bit-stream length, check-sum and the
-   * single byte where the length is written to. This is according to
-   * iSAC wideband and how the "garbage" is dealt. */
-  totalLenUB = streamLenUB + 1 + LEN_CHECK_SUM_WORD8;
-  if (totalLenUB > 255) {
-    streamLenUB = 0;
-  }
-
-  /* Generate CRC if required. */
-  if ((instISAC->bandwidthKHz != isac8kHz) &&
-      (streamLenUB > 0)) {
-    uint32_t crc;
-    streamLen += totalLenUB;
-    encoded[streamLenLB] = (uint8_t)totalLenUB;
-    memcpy(&encoded[streamLenLB + 1], iSACBitStreamInst.stream,
-           streamLenUB);
-
-    WebRtcIsac_GetCrc((int16_t*)(&(encoded[streamLenLB + 1])),
-                      streamLenUB, &crc);
-#ifndef WEBRTC_ARCH_BIG_ENDIAN
-    for (k = 0; k < LEN_CHECK_SUM_WORD8; k++) {
-      encoded[streamLen - LEN_CHECK_SUM_WORD8 + k] =
-        (uint8_t)((crc >> (24 - k * 8)) & 0xFF);
-    }
-#else
-    memcpy(&encoded[streamLenLB + streamLenUB + 1], &crc,
-           LEN_CHECK_SUM_WORD8);
-#endif
-  }
-  return streamLen;
-}
-
-
-/****************************************************************************
- * WebRtcIsac_version(...)
- *
- * This function returns the version number.
- *
- * Output:
- *        - version      : Pointer to character string
- *
- */
-void WebRtcIsac_version(char* version) {
-  strcpy(version, "4.3.0");
-}
-
-
-/******************************************************************************
- * WebRtcIsac_SetEncSampRate()
- * This function sets the sampling rate of the encoder. Initialization of the
- * encoder WILL NOT overwrite the sampling rate of the encoder. The default
- * value is 16 kHz which is set when the instance is created. The encoding-mode
- * and the bottleneck remain unchanged by this call, however, the maximum rate
- * and maximum payload-size will be reset to their default values.
- *
- * Input:
- *        - ISAC_main_inst    : iSAC instance
- *        - sample_rate_hz    : sampling rate in Hertz, valid values are 16000
- *                              and 32000.
- *
- * Return value               : 0 if successful
- *                             -1 if failed.
- */
-int16_t WebRtcIsac_SetEncSampRate(ISACStruct* ISAC_main_inst,
-                                  uint16_t sample_rate_hz) {
-  ISACMainStruct* instISAC = (ISACMainStruct*)ISAC_main_inst;
-  enum IsacSamplingRate encoder_operational_rate;
-
-  if ((sample_rate_hz != 16000) && (sample_rate_hz != 32000)) {
-    /* Sampling Frequency is not supported. */
-    instISAC->errorCode = ISAC_UNSUPPORTED_SAMPLING_FREQUENCY;
-    return -1;
-  }
-  if (sample_rate_hz == 16000) {
-    encoder_operational_rate = kIsacWideband;
-  } else {
-    encoder_operational_rate = kIsacSuperWideband;
-  }
-
-  if ((instISAC->initFlag & BIT_MASK_ENC_INIT) !=
-      BIT_MASK_ENC_INIT) {
-    if (encoder_operational_rate == kIsacWideband) {
-      instISAC->bandwidthKHz = isac8kHz;
-    } else {
-      instISAC->bandwidthKHz = isac16kHz;
-    }
-  } else {
-    ISACUBStruct* instUB = &(instISAC->instUB);
-    ISACLBStruct* instLB = &(instISAC->instLB);
-    int32_t bottleneck = instISAC->bottleneck;
-    int16_t codingMode = instISAC->codingMode;
-    int16_t frameSizeMs = instLB->ISACencLB_obj.new_framelength /
-        (FS / 1000);
-
-    if ((encoder_operational_rate == kIsacWideband) &&
-        (instISAC->encoderSamplingRateKHz == kIsacSuperWideband)) {
-      /* Changing from super-wideband to wideband.
-       * we don't need to re-initialize the encoder of the lower-band. */
-      instISAC->bandwidthKHz = isac8kHz;
-      if (codingMode == 1) {
-        ControlLb(instLB,
-                  (bottleneck > 32000) ? 32000 : bottleneck, FRAMESIZE);
-      }
-      instISAC->maxPayloadSizeBytes = STREAM_SIZE_MAX_60;
-      instISAC->maxRateBytesPer30Ms = STREAM_SIZE_MAX_30;
-    } else if ((encoder_operational_rate == kIsacSuperWideband) &&
-               (instISAC->encoderSamplingRateKHz == kIsacWideband)) {
-      double bottleneckLB = 0;
-      double bottleneckUB = 0;
-      if (codingMode == 1) {
-        WebRtcIsac_RateAllocation(bottleneck, &bottleneckLB, &bottleneckUB,
-                                  &(instISAC->bandwidthKHz));
-      }
-
-      instISAC->bandwidthKHz = isac16kHz;
-      instISAC->maxPayloadSizeBytes = STREAM_SIZE_MAX;
-      instISAC->maxRateBytesPer30Ms = STREAM_SIZE_MAX;
-
-      EncoderInitLb(instLB, codingMode, encoder_operational_rate);
-      EncoderInitUb(instUB, instISAC->bandwidthKHz);
-
-      memset(instISAC->analysisFBState1, 0,
-             FB_STATE_SIZE_WORD32 * sizeof(int32_t));
-      memset(instISAC->analysisFBState2, 0,
-             FB_STATE_SIZE_WORD32 * sizeof(int32_t));
-
-      if (codingMode == 1) {
-        instISAC->bottleneck = bottleneck;
-        ControlLb(instLB, bottleneckLB,
-                  (instISAC->bandwidthKHz == isac8kHz) ? frameSizeMs:FRAMESIZE);
-        if (instISAC->bandwidthKHz > isac8kHz) {
-          ControlUb(instUB, bottleneckUB);
-        }
-      } else {
-        instLB->ISACencLB_obj.enforceFrameSize = 0;
-        instLB->ISACencLB_obj.new_framelength = FRAMESAMPLES;
-      }
-    }
-  }
-  instISAC->encoderSamplingRateKHz = encoder_operational_rate;
-  instISAC->in_sample_rate_hz = sample_rate_hz;
-  return 0;
-}
-
-
-/******************************************************************************
- * WebRtcIsac_SetDecSampRate()
- * This function sets the sampling rate of the decoder. Initialization of the
- * decoder WILL NOT overwrite the sampling rate of the encoder. The default
- * value is 16 kHz which is set when the instance is created.
- *
- * Input:
- *        - ISAC_main_inst    : iSAC instance
- *        - sample_rate_hz    : sampling rate in Hertz, valid values are 16000
- *                              and 32000.
- *
- * Return value               : 0 if successful
- *                             -1 if failed.
- */
-int16_t WebRtcIsac_SetDecSampRate(ISACStruct* ISAC_main_inst,
-                                  uint16_t sample_rate_hz) {
-  ISACMainStruct* instISAC = (ISACMainStruct*)ISAC_main_inst;
-  enum IsacSamplingRate decoder_operational_rate;
-
-  if (sample_rate_hz == 16000) {
-    decoder_operational_rate = kIsacWideband;
-  } else if (sample_rate_hz == 32000) {
-    decoder_operational_rate = kIsacSuperWideband;
-  } else {
-    /* Sampling Frequency is not supported. */
-    instISAC->errorCode = ISAC_UNSUPPORTED_SAMPLING_FREQUENCY;
-    return -1;
-  }
-
-  if ((instISAC->decoderSamplingRateKHz == kIsacWideband) &&
-        (decoder_operational_rate == kIsacSuperWideband)) {
-      /* Switching from wideband to super-wideband at the decoder
-       * we need to reset the filter-bank and initialize upper-band decoder. */
-      memset(instISAC->synthesisFBState1, 0,
-             FB_STATE_SIZE_WORD32 * sizeof(int32_t));
-      memset(instISAC->synthesisFBState2, 0,
-             FB_STATE_SIZE_WORD32 * sizeof(int32_t));
-
-      DecoderInitUb(&instISAC->instUB);
-  }
-  instISAC->decoderSamplingRateKHz = decoder_operational_rate;
-  return 0;
-}
-
-
-/******************************************************************************
- * WebRtcIsac_EncSampRate()
- *
- * Input:
- *        - ISAC_main_inst    : iSAC instance
- *
- * Return value               : sampling rate in Hertz. The input to encoder
- *                              is expected to be sampled in this rate.
- *
- */
-uint16_t WebRtcIsac_EncSampRate(ISACStruct* ISAC_main_inst) {
-  ISACMainStruct* instISAC = (ISACMainStruct*)ISAC_main_inst;
-  return instISAC->in_sample_rate_hz;
-}
-
-
-/******************************************************************************
- * WebRtcIsac_DecSampRate()
- * Return the sampling rate of the decoded audio.
- *
- * Input:
- *        - ISAC_main_inst    : iSAC instance
- *
- * Return value               : sampling rate in Hertz. Decoder output is
- *                              sampled at this rate.
- *
- */
-uint16_t WebRtcIsac_DecSampRate(ISACStruct* ISAC_main_inst) {
-  ISACMainStruct* instISAC = (ISACMainStruct*)ISAC_main_inst;
-  return instISAC->decoderSamplingRateKHz == kIsacWideband ? 16000 : 32000;
-}
-
-void WebRtcIsac_GetBandwidthInfo(ISACStruct* inst,
-                                 IsacBandwidthInfo* bwinfo) {
-  ISACMainStruct* instISAC = (ISACMainStruct*)inst;
-  RTC_DCHECK_NE(0, instISAC->initFlag & BIT_MASK_DEC_INIT);
-  WebRtcIsacBw_GetBandwidthInfo(&instISAC->bwestimator_obj,
-                                instISAC->decoderSamplingRateKHz, bwinfo);
-}
-
-void WebRtcIsac_SetBandwidthInfo(ISACStruct* inst,
-                                 const IsacBandwidthInfo* bwinfo) {
-  ISACMainStruct* instISAC = (ISACMainStruct*)inst;
-  RTC_DCHECK_NE(0, instISAC->initFlag & BIT_MASK_ENC_INIT);
-  WebRtcIsacBw_SetBandwidthInfo(&instISAC->bwestimator_obj, bwinfo);
-}
-
-void WebRtcIsac_SetEncSampRateInDecoder(ISACStruct* inst,
-                                        int sample_rate_hz) {
-  ISACMainStruct* instISAC = (ISACMainStruct*)inst;
-  RTC_DCHECK_NE(0, instISAC->initFlag & BIT_MASK_DEC_INIT);
-  RTC_DCHECK(!(instISAC->initFlag & BIT_MASK_ENC_INIT));
-  RTC_DCHECK(sample_rate_hz == 16000 || sample_rate_hz == 32000);
-  instISAC->encoderSamplingRateKHz = sample_rate_hz / 1000;
-}
diff --git a/modules/audio_coding/codecs/isac/main/source/isac_float_type.h b/modules/audio_coding/codecs/isac/main/source/isac_float_type.h
deleted file mode 100644
index e150d39..0000000
--- a/modules/audio_coding/codecs/isac/main/source/isac_float_type.h
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- *  Copyright (c) 2015 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_CODECS_ISAC_MAIN_SOURCE_ISAC_FLOAT_TYPE_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_MAIN_SOURCE_ISAC_FLOAT_TYPE_H_
-
-#include "webrtc/modules/audio_coding/codecs/isac/main/include/isac.h"
-
-namespace webrtc {
-
-struct IsacFloat {
-  using instance_type = ISACStruct;
-  static const bool has_swb = true;
-  static inline int16_t Control(instance_type* inst,
-                                int32_t rate,
-                                int framesize) {
-    return WebRtcIsac_Control(inst, rate, framesize);
-  }
-  static inline int16_t ControlBwe(instance_type* inst,
-                                   int32_t rate_bps,
-                                   int frame_size_ms,
-                                   int16_t enforce_frame_size) {
-    return WebRtcIsac_ControlBwe(inst, rate_bps, frame_size_ms,
-                                 enforce_frame_size);
-  }
-  static inline int16_t Create(instance_type** inst) {
-    return WebRtcIsac_Create(inst);
-  }
-  static inline int DecodeInternal(instance_type* inst,
-                                   const uint8_t* encoded,
-                                   size_t len,
-                                   int16_t* decoded,
-                                   int16_t* speech_type) {
-    return WebRtcIsac_Decode(inst, encoded, len, decoded, speech_type);
-  }
-  static inline size_t DecodePlc(instance_type* inst,
-                                 int16_t* decoded,
-                                 size_t num_lost_frames) {
-    return WebRtcIsac_DecodePlc(inst, decoded, num_lost_frames);
-  }
-
-  static inline void DecoderInit(instance_type* inst) {
-    WebRtcIsac_DecoderInit(inst);
-  }
-  static inline int Encode(instance_type* inst,
-                           const int16_t* speech_in,
-                           uint8_t* encoded) {
-    return WebRtcIsac_Encode(inst, speech_in, encoded);
-  }
-  static inline int16_t EncoderInit(instance_type* inst, int16_t coding_mode) {
-    return WebRtcIsac_EncoderInit(inst, coding_mode);
-  }
-  static inline uint16_t EncSampRate(instance_type* inst) {
-    return WebRtcIsac_EncSampRate(inst);
-  }
-
-  static inline int16_t Free(instance_type* inst) {
-    return WebRtcIsac_Free(inst);
-  }
-  static inline void GetBandwidthInfo(instance_type* inst,
-                                      IsacBandwidthInfo* bwinfo) {
-    WebRtcIsac_GetBandwidthInfo(inst, bwinfo);
-  }
-  static inline int16_t GetErrorCode(instance_type* inst) {
-    return WebRtcIsac_GetErrorCode(inst);
-  }
-
-  static inline int16_t GetNewFrameLen(instance_type* inst) {
-    return WebRtcIsac_GetNewFrameLen(inst);
-  }
-  static inline void SetBandwidthInfo(instance_type* inst,
-                                      const IsacBandwidthInfo* bwinfo) {
-    WebRtcIsac_SetBandwidthInfo(inst, bwinfo);
-  }
-  static inline int16_t SetDecSampRate(instance_type* inst,
-                                       uint16_t sample_rate_hz) {
-    return WebRtcIsac_SetDecSampRate(inst, sample_rate_hz);
-  }
-  static inline int16_t SetEncSampRate(instance_type* inst,
-                                       uint16_t sample_rate_hz) {
-    return WebRtcIsac_SetEncSampRate(inst, sample_rate_hz);
-  }
-  static inline void SetEncSampRateInDecoder(instance_type* inst,
-                                             uint16_t sample_rate_hz) {
-    WebRtcIsac_SetEncSampRateInDecoder(inst, sample_rate_hz);
-  }
-  static inline void SetInitialBweBottleneck(instance_type* inst,
-                                             int bottleneck_bits_per_second) {
-    WebRtcIsac_SetInitialBweBottleneck(inst, bottleneck_bits_per_second);
-  }
-  static inline int16_t UpdateBwEstimate(instance_type* inst,
-                                         const uint8_t* encoded,
-                                         size_t packet_size,
-                                         uint16_t rtp_seq_number,
-                                         uint32_t send_ts,
-                                         uint32_t arr_ts) {
-    return WebRtcIsac_UpdateBwEstimate(inst, encoded, packet_size,
-                                       rtp_seq_number, send_ts, arr_ts);
-  }
-  static inline int16_t SetMaxPayloadSize(instance_type* inst,
-                                          int16_t max_payload_size_bytes) {
-    return WebRtcIsac_SetMaxPayloadSize(inst, max_payload_size_bytes);
-  }
-  static inline int16_t SetMaxRate(instance_type* inst, int32_t max_bit_rate) {
-    return WebRtcIsac_SetMaxRate(inst, max_bit_rate);
-  }
-};
-
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_MAIN_SOURCE_ISAC_FLOAT_TYPE_H_
diff --git a/modules/audio_coding/codecs/isac/main/source/isac_unittest.cc b/modules/audio_coding/codecs/isac/main/source/isac_unittest.cc
deleted file mode 100644
index 3f7170c..0000000
--- a/modules/audio_coding/codecs/isac/main/source/isac_unittest.cc
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- *  Copyright (c) 2013 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 <string>
-
-#include "webrtc/modules/audio_coding/codecs/isac/main/include/isac.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/testsupport/fileutils.h"
-
-struct WebRtcISACStruct;
-
-namespace webrtc {
-
-// Number of samples in a 60 ms, sampled at 32 kHz.
-const int kIsacNumberOfSamples = 320 * 6;
-// Maximum number of bytes in output bitstream.
-const size_t kMaxBytes = 1000;
-
-class IsacTest : public ::testing::Test {
- protected:
-  IsacTest();
-  virtual void SetUp();
-
-  WebRtcISACStruct* isac_codec_;
-
-  int16_t speech_data_[kIsacNumberOfSamples];
-  int16_t output_data_[kIsacNumberOfSamples];
-  uint8_t bitstream_[kMaxBytes];
-  uint8_t bitstream_small_[7];  // Simulate sync packets.
-};
-
-IsacTest::IsacTest()
-    : isac_codec_(NULL) {
-}
-
-void IsacTest::SetUp() {
-  // Read some samples from a speech file, to be used in the encode test.
-  FILE* input_file;
-  const std::string file_name =
-        webrtc::test::ResourcePath("audio_coding/testfile32kHz", "pcm");
-  input_file = fopen(file_name.c_str(), "rb");
-  ASSERT_TRUE(input_file != NULL);
-  ASSERT_EQ(kIsacNumberOfSamples,
-            static_cast<int32_t>(fread(speech_data_, sizeof(int16_t),
-                                       kIsacNumberOfSamples, input_file)));
-  fclose(input_file);
-  input_file = NULL;
-}
-
-// Test failing Create.
-TEST_F(IsacTest, IsacCreateFail) {
-  // Test to see that an invalid pointer is caught.
-  EXPECT_EQ(-1, WebRtcIsac_Create(NULL));
-}
-
-// Test failing Free.
-TEST_F(IsacTest, IsacFreeFail) {
-  // Test to see that free function doesn't crash.
-  EXPECT_EQ(0, WebRtcIsac_Free(NULL));
-}
-
-// Test normal Create and Free.
-TEST_F(IsacTest, IsacCreateFree) {
-  EXPECT_EQ(0, WebRtcIsac_Create(&isac_codec_));
-  EXPECT_TRUE(isac_codec_ != NULL);
-  EXPECT_EQ(0, WebRtcIsac_Free(isac_codec_));}
-
-TEST_F(IsacTest, IsacUpdateBWE) {
-  // Create encoder memory.
-  EXPECT_EQ(0, WebRtcIsac_Create(&isac_codec_));
-
-  // Init encoder (adaptive mode) and decoder.
-  WebRtcIsac_EncoderInit(isac_codec_, 0);
-  WebRtcIsac_DecoderInit(isac_codec_);
-
-  int encoded_bytes;
-
-  // Test with call with a small packet (sync packet).
-  EXPECT_EQ(-1, WebRtcIsac_UpdateBwEstimate(isac_codec_, bitstream_small_, 7, 1,
-                                            12345, 56789));
-
-  // Encode 60 ms of data (needed to create a first packet).
-  encoded_bytes =  WebRtcIsac_Encode(isac_codec_, speech_data_, bitstream_);
-  EXPECT_EQ(0, encoded_bytes);
-  encoded_bytes =  WebRtcIsac_Encode(isac_codec_, speech_data_, bitstream_);
-  EXPECT_EQ(0, encoded_bytes);
-  encoded_bytes =  WebRtcIsac_Encode(isac_codec_, speech_data_, bitstream_);
-  EXPECT_EQ(0, encoded_bytes);
-  encoded_bytes =  WebRtcIsac_Encode(isac_codec_, speech_data_, bitstream_);
-  EXPECT_EQ(0, encoded_bytes);
-  encoded_bytes =  WebRtcIsac_Encode(isac_codec_, speech_data_, bitstream_);
-  EXPECT_EQ(0, encoded_bytes);
-  encoded_bytes =  WebRtcIsac_Encode(isac_codec_, speech_data_, bitstream_);
-  EXPECT_GT(encoded_bytes, 0);
-
-  // Call to update bandwidth estimator with real data.
-  EXPECT_EQ(0, WebRtcIsac_UpdateBwEstimate(isac_codec_, bitstream_,
-                                           static_cast<size_t>(encoded_bytes),
-                                           1, 12345, 56789));
-
-  // Free memory.
-  EXPECT_EQ(0, WebRtcIsac_Free(isac_codec_));
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/codecs/isac/main/source/lattice.c b/modules/audio_coding/codecs/isac/main/source/lattice.c
deleted file mode 100644
index eabe708..0000000
--- a/modules/audio_coding/codecs/isac/main/source/lattice.c
+++ /dev/null
@@ -1,218 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/*
- * lattice.c
- *
- * contains the normalized lattice filter routines (MA and AR) for iSAC codec
- *
- */
-#include "settings.h"
-#include "codec.h"
-
-#include <math.h>
-#include <memory.h>
-#include <string.h>
-#ifdef WEBRTC_ANDROID
-#include <stdlib.h>
-#endif
-
-/* filter the signal using normalized lattice filter */
-/* MA filter */
-void WebRtcIsac_NormLatticeFilterMa(int orderCoef,
-                                     float *stateF,
-                                     float *stateG,
-                                     float *lat_in,
-                                     double *filtcoeflo,
-                                     double *lat_out)
-{
-  int n,k,i,u,temp1;
-  int ord_1 = orderCoef+1;
-  float sth[MAX_AR_MODEL_ORDER];
-  float cth[MAX_AR_MODEL_ORDER];
-  float inv_cth[MAX_AR_MODEL_ORDER];
-  double a[MAX_AR_MODEL_ORDER+1];
-  float f[MAX_AR_MODEL_ORDER+1][HALF_SUBFRAMELEN], g[MAX_AR_MODEL_ORDER+1][HALF_SUBFRAMELEN];
-  float gain1;
-
-  for (u=0;u<SUBFRAMES;u++)
-  {
-    /* set the Direct Form coefficients */
-    temp1 = u*ord_1;
-    a[0] = 1;
-    memcpy(a+1, filtcoeflo+temp1+1, sizeof(double) * (ord_1-1));
-
-    /* compute lattice filter coefficients */
-    WebRtcIsac_Dir2Lat(a,orderCoef,sth,cth);
-
-    /* compute the gain */
-    gain1 = (float)filtcoeflo[temp1];
-    for (k=0;k<orderCoef;k++)
-    {
-      gain1 *= cth[k];
-      inv_cth[k] = 1/cth[k];
-    }
-
-    /* normalized lattice filter */
-    /*****************************/
-
-    /* initial conditions */
-    for (i=0;i<HALF_SUBFRAMELEN;i++)
-    {
-      f[0][i] = lat_in[i + u * HALF_SUBFRAMELEN];
-      g[0][i] = lat_in[i + u * HALF_SUBFRAMELEN];
-    }
-
-    /* get the state of f&g for the first input, for all orders */
-    for (i=1;i<ord_1;i++)
-    {
-      f[i][0] = inv_cth[i-1]*(f[i-1][0] + sth[i-1]*stateG[i-1]);
-      g[i][0] = cth[i-1]*stateG[i-1] + sth[i-1]* f[i][0];
-    }
-
-    /* filtering */
-    for(k=0;k<orderCoef;k++)
-    {
-      for(n=0;n<(HALF_SUBFRAMELEN-1);n++)
-      {
-        f[k+1][n+1] = inv_cth[k]*(f[k][n+1] + sth[k]*g[k][n]);
-        g[k+1][n+1] = cth[k]*g[k][n] + sth[k]* f[k+1][n+1];
-      }
-    }
-
-    for(n=0;n<HALF_SUBFRAMELEN;n++)
-    {
-      lat_out[n + u * HALF_SUBFRAMELEN] = gain1 * f[orderCoef][n];
-    }
-
-    /* save the states */
-    for (i=0;i<ord_1;i++)
-    {
-      stateF[i] = f[i][HALF_SUBFRAMELEN-1];
-      stateG[i] = g[i][HALF_SUBFRAMELEN-1];
-    }
-    /* process next frame */
-  }
-
-  return;
-}
-
-
-/*///////////////////AR filter ///////////////////////////////*/
-/* filter the signal using normalized lattice filter */
-void WebRtcIsac_NormLatticeFilterAr(int orderCoef,
-                                     float *stateF,
-                                     float *stateG,
-                                     double *lat_in,
-                                     double *lo_filt_coef,
-                                     float *lat_out)
-{
-  int n,k,i,u,temp1;
-  int ord_1 = orderCoef+1;
-  float sth[MAX_AR_MODEL_ORDER];
-  float cth[MAX_AR_MODEL_ORDER];
-  double a[MAX_AR_MODEL_ORDER+1];
-  float ARf[MAX_AR_MODEL_ORDER+1][HALF_SUBFRAMELEN], ARg[MAX_AR_MODEL_ORDER+1][HALF_SUBFRAMELEN];
-  float gain1,inv_gain1;
-
-  for (u=0;u<SUBFRAMES;u++)
-  {
-    /* set the denominator and numerator of the Direct Form */
-    temp1 = u*ord_1;
-    a[0] = 1;
-
-    memcpy(a+1, lo_filt_coef+temp1+1, sizeof(double) * (ord_1-1));
-
-    WebRtcIsac_Dir2Lat(a,orderCoef,sth,cth);
-
-    gain1 = (float)lo_filt_coef[temp1];
-    for (k=0;k<orderCoef;k++)
-    {
-      gain1 = cth[k]*gain1;
-    }
-
-    /* initial conditions */
-    inv_gain1 = 1/gain1;
-    for (i=0;i<HALF_SUBFRAMELEN;i++)
-    {
-      ARf[orderCoef][i] = (float)lat_in[i + u * HALF_SUBFRAMELEN]*inv_gain1;
-    }
-
-
-    for (i=orderCoef-1;i>=0;i--) //get the state of f&g for the first input, for all orders
-    {
-      ARf[i][0] = cth[i]*ARf[i+1][0] - sth[i]*stateG[i];
-      ARg[i+1][0] = sth[i]*ARf[i+1][0] + cth[i]* stateG[i];
-    }
-    ARg[0][0] = ARf[0][0];
-
-    for(n=0;n<(HALF_SUBFRAMELEN-1);n++)
-    {
-      for(k=orderCoef-1;k>=0;k--)
-      {
-        ARf[k][n+1] = cth[k]*ARf[k+1][n+1] - sth[k]*ARg[k][n];
-        ARg[k+1][n+1] = sth[k]*ARf[k+1][n+1] + cth[k]* ARg[k][n];
-      }
-      ARg[0][n+1] = ARf[0][n+1];
-    }
-
-    memcpy(lat_out+u * HALF_SUBFRAMELEN, &(ARf[0][0]), sizeof(float) * HALF_SUBFRAMELEN);
-
-    /* cannot use memcpy in the following */
-    for (i=0;i<ord_1;i++)
-    {
-      stateF[i] = ARf[i][HALF_SUBFRAMELEN-1];
-      stateG[i] = ARg[i][HALF_SUBFRAMELEN-1];
-    }
-
-  }
-
-  return;
-}
-
-
-/* compute the reflection coefficients using the step-down procedure*/
-/* converts the direct form parameters to lattice form.*/
-/* a and b are vectors which contain the direct form coefficients,
-   according to
-   A(z) = a(1) + a(2)*z + a(3)*z^2 + ... + a(M+1)*z^M
-   B(z) = b(1) + b(2)*z + b(3)*z^2 + ... + b(M+1)*z^M
-*/
-
-void WebRtcIsac_Dir2Lat(double *a,
-                        int orderCoef,
-                        float *sth,
-                        float *cth)
-{
-  int m, k;
-  float tmp[MAX_AR_MODEL_ORDER];
-  float tmp_inv, cth2;
-
-  sth[orderCoef-1] = (float)a[orderCoef];
-  cth2 = 1.0f - sth[orderCoef-1] * sth[orderCoef-1];
-  cth[orderCoef-1] = (float)sqrt(cth2);
-  for (m=orderCoef-1; m>0; m--)
-  {
-    tmp_inv = 1.0f / cth2;
-    for (k=1; k<=m; k++)
-    {
-      tmp[k] = ((float)a[k] - sth[m] * (float)a[m-k+1]) * tmp_inv;
-    }
-
-    for (k=1; k<m; k++)
-    {
-      a[k] = tmp[k];
-    }
-
-    sth[m-1] = tmp[m];
-    cth2 = 1 - sth[m-1] * sth[m-1];
-    cth[m-1] = (float)sqrt(cth2);
-  }
-}
diff --git a/modules/audio_coding/codecs/isac/main/source/lpc_analysis.c b/modules/audio_coding/codecs/isac/main/source/lpc_analysis.c
deleted file mode 100644
index 60fc25b..0000000
--- a/modules/audio_coding/codecs/isac/main/source/lpc_analysis.c
+++ /dev/null
@@ -1,535 +0,0 @@
-/*
- *  Copyright (c) 2011 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 "lpc_analysis.h"
-#include "settings.h"
-#include "codec.h"
-#include "entropy_coding.h"
-
-#include <math.h>
-#include <string.h>
-
-#define LEVINSON_EPS    1.0e-10
-
-
-/* window */
-/* Matlab generation code:
- *  t = (1:256)/257; r = 1-(1-t).^.45; w = sin(r*pi).^3; w = w/sum(w); plot((1:256)/8, w); grid;
- *  for k=1:16, fprintf(1, '%.8f, ', w(k*16 + (-15:0))); fprintf(1, '\n'); end
- */
-static const double kLpcCorrWindow[WINLEN] = {
-  0.00000000, 0.00000001, 0.00000004, 0.00000010, 0.00000020,
-  0.00000035, 0.00000055, 0.00000083, 0.00000118, 0.00000163,
-  0.00000218, 0.00000283, 0.00000361, 0.00000453, 0.00000558, 0.00000679,
-  0.00000817, 0.00000973, 0.00001147, 0.00001342, 0.00001558,
-  0.00001796, 0.00002058, 0.00002344, 0.00002657, 0.00002997,
-  0.00003365, 0.00003762, 0.00004190, 0.00004651, 0.00005144, 0.00005673,
-  0.00006236, 0.00006837, 0.00007476, 0.00008155, 0.00008875,
-  0.00009636, 0.00010441, 0.00011290, 0.00012186, 0.00013128,
-  0.00014119, 0.00015160, 0.00016252, 0.00017396, 0.00018594, 0.00019846,
-  0.00021155, 0.00022521, 0.00023946, 0.00025432, 0.00026978,
-  0.00028587, 0.00030260, 0.00031998, 0.00033802, 0.00035674,
-  0.00037615, 0.00039626, 0.00041708, 0.00043863, 0.00046092, 0.00048396,
-  0.00050775, 0.00053233, 0.00055768, 0.00058384, 0.00061080,
-  0.00063858, 0.00066720, 0.00069665, 0.00072696, 0.00075813,
-  0.00079017, 0.00082310, 0.00085692, 0.00089164, 0.00092728, 0.00096384,
-  0.00100133, 0.00103976, 0.00107914, 0.00111947, 0.00116077,
-  0.00120304, 0.00124630, 0.00129053, 0.00133577, 0.00138200,
-  0.00142924, 0.00147749, 0.00152676, 0.00157705, 0.00162836, 0.00168070,
-  0.00173408, 0.00178850, 0.00184395, 0.00190045, 0.00195799,
-  0.00201658, 0.00207621, 0.00213688, 0.00219860, 0.00226137,
-  0.00232518, 0.00239003, 0.00245591, 0.00252284, 0.00259079, 0.00265977,
-  0.00272977, 0.00280078, 0.00287280, 0.00294582, 0.00301984,
-  0.00309484, 0.00317081, 0.00324774, 0.00332563, 0.00340446,
-  0.00348421, 0.00356488, 0.00364644, 0.00372889, 0.00381220, 0.00389636,
-  0.00398135, 0.00406715, 0.00415374, 0.00424109, 0.00432920,
-  0.00441802, 0.00450754, 0.00459773, 0.00468857, 0.00478001,
-  0.00487205, 0.00496464, 0.00505775, 0.00515136, 0.00524542, 0.00533990,
-  0.00543476, 0.00552997, 0.00562548, 0.00572125, 0.00581725,
-  0.00591342, 0.00600973, 0.00610612, 0.00620254, 0.00629895,
-  0.00639530, 0.00649153, 0.00658758, 0.00668341, 0.00677894, 0.00687413,
-  0.00696891, 0.00706322, 0.00715699, 0.00725016, 0.00734266,
-  0.00743441, 0.00752535, 0.00761540, 0.00770449, 0.00779254,
-  0.00787947, 0.00796519, 0.00804963, 0.00813270, 0.00821431, 0.00829437,
-  0.00837280, 0.00844949, 0.00852436, 0.00859730, 0.00866822,
-  0.00873701, 0.00880358, 0.00886781, 0.00892960, 0.00898884,
-  0.00904542, 0.00909923, 0.00915014, 0.00919805, 0.00924283, 0.00928436,
-  0.00932252, 0.00935718, 0.00938821, 0.00941550, 0.00943890,
-  0.00945828, 0.00947351, 0.00948446, 0.00949098, 0.00949294,
-  0.00949020, 0.00948262, 0.00947005, 0.00945235, 0.00942938, 0.00940099,
-  0.00936704, 0.00932738, 0.00928186, 0.00923034, 0.00917268,
-  0.00910872, 0.00903832, 0.00896134, 0.00887763, 0.00878706,
-  0.00868949, 0.00858478, 0.00847280, 0.00835343, 0.00822653, 0.00809199,
-  0.00794970, 0.00779956, 0.00764145, 0.00747530, 0.00730103,
-  0.00711857, 0.00692787, 0.00672888, 0.00652158, 0.00630597,
-  0.00608208, 0.00584994, 0.00560962, 0.00536124, 0.00510493, 0.00484089,
-  0.00456935, 0.00429062, 0.00400505, 0.00371310, 0.00341532,
-  0.00311238, 0.00280511, 0.00249452, 0.00218184, 0.00186864,
-  0.00155690, 0.00124918, 0.00094895, 0.00066112, 0.00039320, 0.00015881
-};
-
-double WebRtcIsac_LevDurb(double *a, double *k, double *r, size_t order)
-{
-
-  double sum, alpha;
-  size_t m, m_h, i;
-  alpha = 0; //warning -DH
-  a[0] = 1.0;
-  if (r[0] < LEVINSON_EPS) { /* if r[0] <= 0, set LPC coeff. to zero */
-    for (i = 0; i < order; i++) {
-      k[i] = 0;
-      a[i+1] = 0;
-    }
-  } else {
-    a[1] = k[0] = -r[1]/r[0];
-    alpha = r[0] + r[1] * k[0];
-    for (m = 1; m < order; m++){
-      sum = r[m + 1];
-      for (i = 0; i < m; i++){
-        sum += a[i+1] * r[m - i];
-      }
-      k[m] = -sum / alpha;
-      alpha += k[m] * sum;
-      m_h = (m + 1) >> 1;
-      for (i = 0; i < m_h; i++){
-        sum = a[i+1] + k[m] * a[m - i];
-        a[m - i] += k[m] * a[i+1];
-        a[i+1] = sum;
-      }
-      a[m+1] = k[m];
-    }
-  }
-  return alpha;
-}
-
-
-//was static before, but didn't work with MEX file
-void WebRtcIsac_GetVars(const double *input, const int16_t *pitchGains_Q12,
-                       double *oldEnergy, double *varscale)
-{
-  double nrg[4], chng, pg;
-  int k;
-
-  double pitchGains[4]={0,0,0,0};;
-
-  /* Calculate energies of first and second frame halfs */
-  nrg[0] = 0.0001;
-  for (k = QLOOKAHEAD/2; k < (FRAMESAMPLES_QUARTER + QLOOKAHEAD) / 2; k++) {
-    nrg[0] += input[k]*input[k];
-  }
-  nrg[1] = 0.0001;
-  for ( ; k < (FRAMESAMPLES_HALF + QLOOKAHEAD) / 2; k++) {
-    nrg[1] += input[k]*input[k];
-  }
-  nrg[2] = 0.0001;
-  for ( ; k < (FRAMESAMPLES*3/4 + QLOOKAHEAD) / 2; k++) {
-    nrg[2] += input[k]*input[k];
-  }
-  nrg[3] = 0.0001;
-  for ( ; k < (FRAMESAMPLES + QLOOKAHEAD) / 2; k++) {
-    nrg[3] += input[k]*input[k];
-  }
-
-  /* Calculate average level change */
-  chng = 0.25 * (fabs(10.0 * log10(nrg[3] / nrg[2])) +
-                 fabs(10.0 * log10(nrg[2] / nrg[1])) +
-                 fabs(10.0 * log10(nrg[1] / nrg[0])) +
-                 fabs(10.0 * log10(nrg[0] / *oldEnergy)));
-
-
-  /* Find average pitch gain */
-  pg = 0.0;
-  for (k=0; k<4; k++)
-  {
-    pitchGains[k] = ((float)pitchGains_Q12[k])/4096;
-    pg += pitchGains[k];
-  }
-  pg *= 0.25;
-
-  /* If pitch gain is low and energy constant - increase noise level*/
-  /* Matlab code:
-     pg = 0:.01:.45; plot(pg, 0.0 + 1.0 * exp( -1.0 * exp(-200.0 * pg.*pg.*pg) / (1.0 + 0.4 * 0) ))
-  */
-  *varscale = 0.0 + 1.0 * exp( -1.4 * exp(-200.0 * pg*pg*pg) / (1.0 + 0.4 * chng) );
-
-  *oldEnergy = nrg[3];
-}
-
-void
-WebRtcIsac_GetVarsUB(
-    const double* input,
-    double*       oldEnergy,
-    double*       varscale)
-{
-  double nrg[4], chng;
-  int k;
-
-  /* Calculate energies of first and second frame halfs */
-  nrg[0] = 0.0001;
-  for (k = 0; k < (FRAMESAMPLES_QUARTER) / 2; k++) {
-    nrg[0] += input[k]*input[k];
-  }
-  nrg[1] = 0.0001;
-  for ( ; k < (FRAMESAMPLES_HALF) / 2; k++) {
-    nrg[1] += input[k]*input[k];
-  }
-  nrg[2] = 0.0001;
-  for ( ; k < (FRAMESAMPLES*3/4) / 2; k++) {
-    nrg[2] += input[k]*input[k];
-  }
-  nrg[3] = 0.0001;
-  for ( ; k < (FRAMESAMPLES) / 2; k++) {
-    nrg[3] += input[k]*input[k];
-  }
-
-  /* Calculate average level change */
-  chng = 0.25 * (fabs(10.0 * log10(nrg[3] / nrg[2])) +
-                 fabs(10.0 * log10(nrg[2] / nrg[1])) +
-                 fabs(10.0 * log10(nrg[1] / nrg[0])) +
-                 fabs(10.0 * log10(nrg[0] / *oldEnergy)));
-
-
-  /* If pitch gain is low and energy constant - increase noise level*/
-  /* Matlab code:
-     pg = 0:.01:.45; plot(pg, 0.0 + 1.0 * exp( -1.0 * exp(-200.0 * pg.*pg.*pg) / (1.0 + 0.4 * 0) ))
-  */
-  *varscale = exp( -1.4 / (1.0 + 0.4 * chng) );
-
-  *oldEnergy = nrg[3];
-}
-
-void WebRtcIsac_GetLpcCoefLb(double *inLo, double *inHi, MaskFiltstr *maskdata,
-                             double signal_noise_ratio, const int16_t *pitchGains_Q12,
-                             double *lo_coeff, double *hi_coeff)
-{
-  int k, n, j, pos1, pos2;
-  double varscale;
-
-  double DataLo[WINLEN], DataHi[WINLEN];
-  double corrlo[ORDERLO+2], corrlo2[ORDERLO+1];
-  double corrhi[ORDERHI+1];
-  double k_veclo[ORDERLO], k_vechi[ORDERHI];
-
-  double a_LO[ORDERLO+1], a_HI[ORDERHI+1];
-  double tmp, res_nrg;
-
-  double FwdA, FwdB;
-
-  /* hearing threshold level in dB; higher value gives more noise */
-  const double HearThresOffset = -28.0;
-
-  /* bandwdith expansion factors for low- and high band */
-  const double gammaLo = 0.9;
-  const double gammaHi = 0.8;
-
-  /* less-noise-at-low-frequencies factor */
-  double aa;
-
-
-  /* convert from dB to signal level */
-  const double H_T_H = pow(10.0, 0.05 * HearThresOffset);
-  double S_N_R = pow(10.0, 0.05 * signal_noise_ratio) / 3.46;    /* divide by sqrt(12) */
-
-  /* change quallevel depending on pitch gains and level fluctuations */
-  WebRtcIsac_GetVars(inLo, pitchGains_Q12, &(maskdata->OldEnergy), &varscale);
-
-  /* less-noise-at-low-frequencies factor */
-  aa = 0.35 * (0.5 + 0.5 * varscale);
-
-  /* replace data in buffer by new look-ahead data */
-  for (pos1 = 0; pos1 < QLOOKAHEAD; pos1++)
-    maskdata->DataBufferLo[pos1 + WINLEN - QLOOKAHEAD] = inLo[pos1];
-
-  for (k = 0; k < SUBFRAMES; k++) {
-
-    /* Update input buffer and multiply signal with window */
-    for (pos1 = 0; pos1 < WINLEN - UPDATE/2; pos1++) {
-      maskdata->DataBufferLo[pos1] = maskdata->DataBufferLo[pos1 + UPDATE/2];
-      maskdata->DataBufferHi[pos1] = maskdata->DataBufferHi[pos1 + UPDATE/2];
-      DataLo[pos1] = maskdata->DataBufferLo[pos1] * kLpcCorrWindow[pos1];
-      DataHi[pos1] = maskdata->DataBufferHi[pos1] * kLpcCorrWindow[pos1];
-    }
-    pos2 = k * UPDATE/2;
-    for (n = 0; n < UPDATE/2; n++, pos1++) {
-      maskdata->DataBufferLo[pos1] = inLo[QLOOKAHEAD + pos2];
-      maskdata->DataBufferHi[pos1] = inHi[pos2++];
-      DataLo[pos1] = maskdata->DataBufferLo[pos1] * kLpcCorrWindow[pos1];
-      DataHi[pos1] = maskdata->DataBufferHi[pos1] * kLpcCorrWindow[pos1];
-    }
-
-    /* Get correlation coefficients */
-    WebRtcIsac_AutoCorr(corrlo, DataLo, WINLEN, ORDERLO+1); /* computing autocorrelation */
-    WebRtcIsac_AutoCorr(corrhi, DataHi, WINLEN, ORDERHI);
-
-
-    /* less noise for lower frequencies, by filtering/scaling autocorrelation sequences */
-    corrlo2[0] = (1.0+aa*aa) * corrlo[0] - 2.0*aa * corrlo[1];
-    tmp = (1.0 + aa*aa);
-    for (n = 1; n <= ORDERLO; n++) {
-      corrlo2[n] = tmp * corrlo[n] - aa * (corrlo[n-1] + corrlo[n+1]);
-    }
-    tmp = (1.0+aa) * (1.0+aa);
-    for (n = 0; n <= ORDERHI; n++) {
-      corrhi[n] = tmp * corrhi[n];
-    }
-
-    /* add white noise floor */
-    corrlo2[0] += 1e-6;
-    corrhi[0] += 1e-6;
-
-
-    FwdA = 0.01;
-    FwdB = 0.01;
-
-    /* recursive filtering of correlation over subframes */
-    for (n = 0; n <= ORDERLO; n++) {
-      maskdata->CorrBufLo[n] = FwdA * maskdata->CorrBufLo[n] + corrlo2[n];
-      corrlo2[n] = ((1.0-FwdA)*FwdB) * maskdata->CorrBufLo[n] + (1.0-FwdB) * corrlo2[n];
-    }
-    for (n = 0; n <= ORDERHI; n++) {
-      maskdata->CorrBufHi[n] = FwdA * maskdata->CorrBufHi[n] + corrhi[n];
-      corrhi[n] = ((1.0-FwdA)*FwdB) * maskdata->CorrBufHi[n] + (1.0-FwdB) * corrhi[n];
-    }
-
-    /* compute prediction coefficients */
-    WebRtcIsac_LevDurb(a_LO, k_veclo, corrlo2, ORDERLO);
-    WebRtcIsac_LevDurb(a_HI, k_vechi, corrhi, ORDERHI);
-
-    /* bandwidth expansion */
-    tmp = gammaLo;
-    for (n = 1; n <= ORDERLO; n++) {
-      a_LO[n] *= tmp;
-      tmp *= gammaLo;
-    }
-
-    /* residual energy */
-    res_nrg = 0.0;
-    for (j = 0; j <= ORDERLO; j++) {
-      for (n = 0; n <= j; n++) {
-        res_nrg += a_LO[j] * corrlo2[j-n] * a_LO[n];
-      }
-      for (n = j+1; n <= ORDERLO; n++) {
-        res_nrg += a_LO[j] * corrlo2[n-j] * a_LO[n];
-      }
-    }
-
-    /* add hearing threshold and compute the gain */
-    *lo_coeff++ = S_N_R / (sqrt(res_nrg) / varscale + H_T_H);
-
-    /* copy coefficients to output array */
-    for (n = 1; n <= ORDERLO; n++) {
-      *lo_coeff++ = a_LO[n];
-    }
-
-
-    /* bandwidth expansion */
-    tmp = gammaHi;
-    for (n = 1; n <= ORDERHI; n++) {
-      a_HI[n] *= tmp;
-      tmp *= gammaHi;
-    }
-
-    /* residual energy */
-    res_nrg = 0.0;
-    for (j = 0; j <= ORDERHI; j++) {
-      for (n = 0; n <= j; n++) {
-        res_nrg += a_HI[j] * corrhi[j-n] * a_HI[n];
-      }
-      for (n = j+1; n <= ORDERHI; n++) {
-        res_nrg += a_HI[j] * corrhi[n-j] * a_HI[n];
-      }
-    }
-
-    /* add hearing threshold and compute of the gain */
-    *hi_coeff++ = S_N_R / (sqrt(res_nrg) / varscale + H_T_H);
-
-    /* copy coefficients to output array */
-    for (n = 1; n <= ORDERHI; n++) {
-      *hi_coeff++ = a_HI[n];
-    }
-  }
-}
-
-
-
-/******************************************************************************
- * WebRtcIsac_GetLpcCoefUb()
- *
- * Compute LP coefficients and correlation coefficients. At 12 kHz LP
- * coefficients of the first and the last sub-frame is computed. At 16 kHz
- * LP coefficients of 4th, 8th and 12th sub-frames are computed. We always
- * compute correlation coefficients of all sub-frames.
- *
- * Inputs:
- *       -inSignal           : Input signal
- *       -maskdata           : a structure keeping signal from previous frame.
- *       -bandwidth          : specifies if the codec is in 0-16 kHz mode or
- *                             0-12 kHz mode.
- *
- * Outputs:
- *       -lpCoeff            : pointer to a buffer where A-polynomials are
- *                             written to (first coeff is 1 and it is not
- *                             written)
- *       -corrMat            : a matrix where correlation coefficients of each
- *                             sub-frame are written to one row.
- *       -varscale           : a scale used to compute LPC gains.
- */
-void
-WebRtcIsac_GetLpcCoefUb(
-    double*      inSignal,
-    MaskFiltstr* maskdata,
-    double*      lpCoeff,
-    double       corrMat[][UB_LPC_ORDER + 1],
-    double*      varscale,
-    int16_t  bandwidth)
-{
-  int frameCntr, activeFrameCntr, n, pos1, pos2;
-  int16_t criterion1;
-  int16_t criterion2;
-  int16_t numSubFrames = SUBFRAMES * (1 + (bandwidth == isac16kHz));
-  double data[WINLEN];
-  double corrSubFrame[UB_LPC_ORDER+2];
-  double reflecCoeff[UB_LPC_ORDER];
-
-  double aPolynom[UB_LPC_ORDER+1];
-  double tmp;
-
-  /* bandwdith expansion factors */
-  const double gamma = 0.9;
-
-  /* change quallevel depending on pitch gains and level fluctuations */
-  WebRtcIsac_GetVarsUB(inSignal, &(maskdata->OldEnergy), varscale);
-
-  /* replace data in buffer by new look-ahead data */
-  for(frameCntr = 0, activeFrameCntr = 0; frameCntr < numSubFrames;
-      frameCntr++)
-  {
-    if(frameCntr == SUBFRAMES)
-    {
-      // we are in 16 kHz
-      varscale++;
-      WebRtcIsac_GetVarsUB(&inSignal[FRAMESAMPLES_HALF],
-                          &(maskdata->OldEnergy), varscale);
-    }
-    /* Update input buffer and multiply signal with window */
-    for(pos1 = 0; pos1 < WINLEN - UPDATE/2; pos1++)
-    {
-      maskdata->DataBufferLo[pos1] = maskdata->DataBufferLo[pos1 +
-                                                            UPDATE/2];
-      data[pos1] = maskdata->DataBufferLo[pos1] * kLpcCorrWindow[pos1];
-    }
-    pos2 = frameCntr * UPDATE/2;
-    for(n = 0; n < UPDATE/2; n++, pos1++, pos2++)
-    {
-      maskdata->DataBufferLo[pos1] = inSignal[pos2];
-      data[pos1] = maskdata->DataBufferLo[pos1] * kLpcCorrWindow[pos1];
-    }
-
-    /* Get correlation coefficients */
-    /* computing autocorrelation    */
-    WebRtcIsac_AutoCorr(corrSubFrame, data, WINLEN, UB_LPC_ORDER+1);
-    memcpy(corrMat[frameCntr], corrSubFrame,
-           (UB_LPC_ORDER+1)*sizeof(double));
-
-    criterion1 = ((frameCntr == 0) || (frameCntr == (SUBFRAMES - 1))) &&
-        (bandwidth == isac12kHz);
-    criterion2 = (((frameCntr+1) % 4) == 0) &&
-        (bandwidth == isac16kHz);
-    if(criterion1 || criterion2)
-    {
-      /* add noise */
-      corrSubFrame[0] += 1e-6;
-      /* compute prediction coefficients */
-      WebRtcIsac_LevDurb(aPolynom, reflecCoeff, corrSubFrame,
-                        UB_LPC_ORDER);
-
-      /* bandwidth expansion */
-      tmp = gamma;
-      for (n = 1; n <= UB_LPC_ORDER; n++)
-      {
-        *lpCoeff++ = aPolynom[n] * tmp;
-        tmp *= gamma;
-      }
-      activeFrameCntr++;
-    }
-  }
-}
-
-
-
-/******************************************************************************
- * WebRtcIsac_GetLpcGain()
- *
- * Compute the LPC gains for each sub-frame, given the LPC of each sub-frame
- * and the corresponding correlation coefficients.
- *
- * Inputs:
- *       -signal_noise_ratio : the desired SNR in dB.
- *       -numVecs            : number of sub-frames
- *       -corrMat             : a matrix of correlation coefficients where
- *                             each row is a set of correlation coefficients of
- *                             one sub-frame.
- *       -varscale           : a scale computed when WebRtcIsac_GetLpcCoefUb()
- *                             is called.
- *
- * Outputs:
- *       -gain               : pointer to a buffer where LP gains are written.
- *
- */
-void
-WebRtcIsac_GetLpcGain(
-    double        signal_noise_ratio,
-    const double* filtCoeffVecs,
-    int           numVecs,
-    double*       gain,
-    double        corrMat[][UB_LPC_ORDER + 1],
-    const double* varscale)
-{
-  int16_t j, n;
-  int16_t subFrameCntr;
-  double aPolynom[ORDERLO + 1];
-  double res_nrg;
-
-  const double HearThresOffset = -28.0;
-  const double H_T_H = pow(10.0, 0.05 * HearThresOffset);
-  /* divide by sqrt(12) = 3.46 */
-  const double S_N_R = pow(10.0, 0.05 * signal_noise_ratio) / 3.46;
-
-  aPolynom[0] = 1;
-  for(subFrameCntr = 0; subFrameCntr < numVecs; subFrameCntr++)
-  {
-    if(subFrameCntr == SUBFRAMES)
-    {
-      // we are in second half of a SWB frame. use new varscale
-      varscale++;
-    }
-    memcpy(&aPolynom[1], &filtCoeffVecs[(subFrameCntr * (UB_LPC_ORDER + 1)) +
-                                        1], sizeof(double) * UB_LPC_ORDER);
-
-    /* residual energy */
-    res_nrg = 0.0;
-    for(j = 0; j <= UB_LPC_ORDER; j++)
-    {
-      for(n = 0; n <= j; n++)
-      {
-        res_nrg += aPolynom[j] * corrMat[subFrameCntr][j-n] *
-            aPolynom[n];
-      }
-      for(n = j+1; n <= UB_LPC_ORDER; n++)
-      {
-        res_nrg += aPolynom[j] * corrMat[subFrameCntr][n-j] *
-            aPolynom[n];
-      }
-    }
-
-    /* add hearing threshold and compute the gain */
-    gain[subFrameCntr] = S_N_R / (sqrt(res_nrg) / *varscale + H_T_H);
-  }
-}
diff --git a/modules/audio_coding/codecs/isac/main/source/lpc_analysis.h b/modules/audio_coding/codecs/isac/main/source/lpc_analysis.h
deleted file mode 100644
index 8dfe383..0000000
--- a/modules/audio_coding/codecs/isac/main/source/lpc_analysis.h
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/*
- * lpc_analysis.h
- *
- * LPC functions
- *
- */
-
-#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_MAIN_SOURCE_LPC_ANALYSIS_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_MAIN_SOURCE_LPC_ANALYSIS_H_
-
-#include "settings.h"
-#include "structs.h"
-
-double WebRtcIsac_LevDurb(double *a, double *k, double *r, size_t order);
-
-void WebRtcIsac_GetVars(const double *input, const int16_t *pitchGains_Q12,
-                       double *oldEnergy, double *varscale);
-
-void WebRtcIsac_GetLpcCoefLb(double *inLo, double *inHi, MaskFiltstr *maskdata,
-                             double signal_noise_ratio, const int16_t *pitchGains_Q12,
-                             double *lo_coeff, double *hi_coeff);
-
-
-void WebRtcIsac_GetLpcGain(
-    double         signal_noise_ratio,
-    const double*  filtCoeffVecs,
-    int            numVecs,
-    double*        gain,
-    double         corrLo[][UB_LPC_ORDER + 1],
-    const double*  varscale);
-
-void WebRtcIsac_GetLpcCoefUb(
-    double*      inSignal,
-    MaskFiltstr* maskdata,
-    double*      lpCoeff,
-    double       corr[][UB_LPC_ORDER + 1],
-    double*      varscale,
-    int16_t  bandwidth);
-
-#endif /* WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_MAIN_SOURCE_LPC_ANALYIS_H_ */
diff --git a/modules/audio_coding/codecs/isac/main/source/lpc_gain_swb_tables.c b/modules/audio_coding/codecs/isac/main/source/lpc_gain_swb_tables.c
deleted file mode 100644
index 5cc6c11..0000000
--- a/modules/audio_coding/codecs/isac/main/source/lpc_gain_swb_tables.c
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/*
- * SWB_KLT_Tables_LPCGain.c
- *
- * This file defines tables used for entropy coding of LPC Gain
- * of upper-band.
- *
- */
-
-#include "lpc_gain_swb_tables.h"
-#include "settings.h"
-#include "webrtc/typedefs.h"
-
-const double WebRtcIsac_kQSizeLpcGain = 0.100000;
-
-const double WebRtcIsac_kMeanLpcGain = -3.3822;
-
-/*
-* The smallest reconstruction points for quantiztion of
-* LPC gains.
-*/
-const double WebRtcIsac_kLeftRecPointLpcGain[SUBFRAMES] =
-{
-   -0.800000, -1.000000, -1.200000, -2.200000, -3.000000, -12.700000
-};
-
-/*
-* Number of reconstruction points of quantizers for LPC Gains.
-*/
-const int16_t WebRtcIsac_kNumQCellLpcGain[SUBFRAMES] =
-{
-    17,  20,  25,  45,  77, 170
-};
-/*
-* Starting index for entropy decoder to search for the right interval,
-* one entry per LAR coefficient
-*/
-const uint16_t WebRtcIsac_kLpcGainEntropySearch[SUBFRAMES] =
-{
-     8,  10,  12,  22,  38,  85
-};
-
-/*
-* The following 6 vectors define CDF of 6 decorrelated LPC
-* gains.
-*/
-const uint16_t WebRtcIsac_kLpcGainCdfVec0[18] =
-{
-     0,    10,    27,    83,   234,   568,  1601,  4683, 16830, 57534, 63437,
- 64767, 65229, 65408, 65483, 65514, 65527, 65535
-};
-
-const uint16_t WebRtcIsac_kLpcGainCdfVec1[21] =
-{
-     0,    15,    33,    84,   185,   385,   807,  1619,  3529,  7850, 19488,
- 51365, 62437, 64548, 65088, 65304, 65409, 65484, 65507, 65522, 65535
-};
-
-const uint16_t WebRtcIsac_kLpcGainCdfVec2[26] =
-{
-     0,    15,    29,    54,    89,   145,   228,   380,   652,  1493,  4260,
- 12359, 34133, 50749, 57224, 60814, 62927, 64078, 64742, 65103, 65311, 65418,
- 65473, 65509, 65521, 65535
-};
-
-const uint16_t WebRtcIsac_kLpcGainCdfVec3[46] =
-{
-     0,     8,    12,    16,    26,    42,    56,    76,   111,   164,   247,
-   366,   508,   693,  1000,  1442,  2155,  3188,  4854,  7387, 11249, 17617,
- 30079, 46711, 56291, 60127, 62140, 63258, 63954, 64384, 64690, 64891, 65031,
- 65139, 65227, 65293, 65351, 65399, 65438, 65467, 65492, 65504, 65510, 65518,
- 65523, 65535
-};
-
-const uint16_t WebRtcIsac_kLpcGainCdfVec4[78] =
-{
-     0,    17,    29,    39,    51,    70,   104,   154,   234,   324,   443,
-   590,   760,   971,  1202,  1494,  1845,  2274,  2797,  3366,  4088,  4905,
-  5899,  7142,  8683, 10625, 12983, 16095, 20637, 28216, 38859, 47237, 51537,
- 54150, 56066, 57583, 58756, 59685, 60458, 61103, 61659, 62144, 62550, 62886,
- 63186, 63480, 63743, 63954, 64148, 64320, 64467, 64600, 64719, 64837, 64939,
- 65014, 65098, 65160, 65211, 65250, 65290, 65325, 65344, 65366, 65391, 65410,
- 65430, 65447, 65460, 65474, 65487, 65494, 65501, 65509, 65513, 65518, 65520,
- 65535
-};
-
-const uint16_t WebRtcIsac_kLpcGainCdfVec5[171] =
-{
-     0,    10,    12,    14,    16,    18,    23,    29,    35,    42,    51,
-    58,    65,    72,    78,    87,    96,   103,   111,   122,   134,   150,
-   167,   184,   202,   223,   244,   265,   289,   315,   346,   379,   414,
-   450,   491,   532,   572,   613,   656,   700,   751,   802,   853,   905,
-   957,  1021,  1098,  1174,  1250,  1331,  1413,  1490,  1565,  1647,  1730,
-  1821,  1913,  2004,  2100,  2207,  2314,  2420,  2532,  2652,  2783,  2921,
-  3056,  3189,  3327,  3468,  3640,  3817,  3993,  4171,  4362,  4554,  4751,
-  4948,  5142,  5346,  5566,  5799,  6044,  6301,  6565,  6852,  7150,  7470,
-  7797,  8143,  8492,  8835,  9181,  9547,  9919, 10315, 10718, 11136, 11566,
- 12015, 12482, 12967, 13458, 13953, 14432, 14903, 15416, 15936, 16452, 16967,
- 17492, 18024, 18600, 19173, 19736, 20311, 20911, 21490, 22041, 22597, 23157,
- 23768, 24405, 25034, 25660, 26280, 26899, 27614, 28331, 29015, 29702, 30403,
- 31107, 31817, 32566, 33381, 34224, 35099, 36112, 37222, 38375, 39549, 40801,
- 42074, 43350, 44626, 45982, 47354, 48860, 50361, 51845, 53312, 54739, 56026,
- 57116, 58104, 58996, 59842, 60658, 61488, 62324, 63057, 63769, 64285, 64779,
- 65076, 65344, 65430, 65500, 65517, 65535
-};
-
-/*
-* An array of pointers to CDFs of decorrelated LPC Gains
-*/
-const uint16_t* WebRtcIsac_kLpcGainCdfMat[SUBFRAMES] =
-{
-    WebRtcIsac_kLpcGainCdfVec0, WebRtcIsac_kLpcGainCdfVec1,
-    WebRtcIsac_kLpcGainCdfVec2, WebRtcIsac_kLpcGainCdfVec3,
-    WebRtcIsac_kLpcGainCdfVec4, WebRtcIsac_kLpcGainCdfVec5
-};
-
-/*
-* A matrix to decorrellate LPC gains of subframes.
-*/
-const double WebRtcIsac_kLpcGainDecorrMat[SUBFRAMES][SUBFRAMES] =
-{
-    {-0.150860,  0.327872,  0.367220,  0.504613,  0.559270,  0.409234},
-    { 0.457128, -0.613591, -0.289283, -0.029734,  0.393760,  0.418240},
-    {-0.626043,  0.136489, -0.439118, -0.448323,  0.135987,  0.420869},
-    { 0.526617,  0.480187,  0.242552, -0.488754, -0.158713,  0.411331},
-    {-0.302587, -0.494953,  0.588112, -0.063035, -0.404290,  0.387510},
-    { 0.086378,  0.147714, -0.428875,  0.548300, -0.570121,  0.401391}
-};
diff --git a/modules/audio_coding/codecs/isac/main/source/lpc_gain_swb_tables.h b/modules/audio_coding/codecs/isac/main/source/lpc_gain_swb_tables.h
deleted file mode 100644
index c163f4a..0000000
--- a/modules/audio_coding/codecs/isac/main/source/lpc_gain_swb_tables.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/*
- * SWB_KLT_Tables_LPCGain.h
- *
- * This file declares tables used for entropy coding of LPC Gain
- * of upper-band.
- *
- */
-
-#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_MAIN_SOURCE_LPC_GAIN_SWB_TABLES_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_MAIN_SOURCE_LPC_GAIN_SWB_TABLES_H_
-
-#include "settings.h"
-#include "webrtc/typedefs.h"
-
-extern const double WebRtcIsac_kQSizeLpcGain;
-
-extern const double WebRtcIsac_kLeftRecPointLpcGain[SUBFRAMES];
-
-extern const int16_t WebRtcIsac_kNumQCellLpcGain[SUBFRAMES];
-
-extern const uint16_t WebRtcIsac_kLpcGainEntropySearch[SUBFRAMES];
-
-extern const uint16_t WebRtcIsac_kLpcGainCdfVec0[18];
-
-extern const uint16_t WebRtcIsac_kLpcGainCdfVec1[21];
-
-extern const uint16_t WebRtcIsac_kLpcGainCdfVec2[26];
-
-extern const uint16_t WebRtcIsac_kLpcGainCdfVec3[46];
-
-extern const uint16_t WebRtcIsac_kLpcGainCdfVec4[78];
-
-extern const uint16_t WebRtcIsac_kLpcGainCdfVec5[171];
-
-extern const uint16_t* WebRtcIsac_kLpcGainCdfMat[SUBFRAMES];
-
-extern const double WebRtcIsac_kLpcGainDecorrMat[SUBFRAMES][SUBFRAMES];
-
-#endif // WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_MAIN_SOURCE_LPC_GAIN_SWB_TABLES_H_
diff --git a/modules/audio_coding/codecs/isac/main/source/lpc_shape_swb12_tables.c b/modules/audio_coding/codecs/isac/main/source/lpc_shape_swb12_tables.c
deleted file mode 100644
index 599b89d..0000000
--- a/modules/audio_coding/codecs/isac/main/source/lpc_shape_swb12_tables.c
+++ /dev/null
@@ -1,159 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/*
- * SWB_KLT_Tables.c
- *
- * This file defines tables used for entropy coding of LPC shape of
- * upper-band signal if the bandwidth is 12 kHz.
- *
- */
-
-#include "lpc_shape_swb12_tables.h"
-#include "settings.h"
-#include "webrtc/typedefs.h"
-
-/*
-* Mean value of LAR
-*/
-const double WebRtcIsac_kMeanLarUb12[UB_LPC_ORDER] =
-{
-  0.03748928306641, 0.09453441192543, -0.01112522344398, 0.03800237516842
-};
-
-/*
-* A rotation matrix to decorrelate intra-vector correlation,
-* i.e. correlation among components of LAR vector.
-*/
-const double WebRtcIsac_kIntraVecDecorrMatUb12[UB_LPC_ORDER][UB_LPC_ORDER] =
-{
-    {-0.00075365493856,  -0.05809964887743,  -0.23397966154116,   0.97050367376411},
-    { 0.00625021257734,  -0.17299965610679,   0.95977735920651,   0.22104179375008},
-    { 0.20543384258374,  -0.96202143495696,  -0.15301870801552,  -0.09432375099565},
-    {-0.97865075648479,  -0.20300322280841,  -0.02581111653779,  -0.01913568980258}
-};
-
-/*
-* A rotation matrix to remove correlation among LAR coefficients
-* of different LAR vectors. One might guess that decorrelation matrix
-* for the first component should differ from the second component
-* but we haven't observed a significant benefit of having different
-* decorrelation matrices for different components.
-*/
-const double WebRtcIsac_kInterVecDecorrMatUb12
-[UB_LPC_VEC_PER_FRAME][UB_LPC_VEC_PER_FRAME] =
-{
-    { 0.70650597970460,  -0.70770707262373},
-    {-0.70770707262373,  -0.70650597970460}
-};
-
-/*
-* LAR quantization step-size.
-*/
-const double WebRtcIsac_kLpcShapeQStepSizeUb12 = 0.150000;
-
-/*
-* The smallest reconstruction points for quantiztion of LAR coefficients.
-*/
-const double WebRtcIsac_kLpcShapeLeftRecPointUb12
-[UB_LPC_ORDER*UB_LPC_VEC_PER_FRAME] =
-{
-    -0.900000, -1.050000, -1.350000, -1.800000, -1.350000, -1.650000,
-    -2.250000, -3.450000
-};
-
-/*
-* Number of reconstruction points of quantizers for LAR coefficients.
-*/
-const int16_t WebRtcIsac_kLpcShapeNumRecPointUb12
-[UB_LPC_ORDER * UB_LPC_VEC_PER_FRAME] =
-{
-    13, 15, 19, 27, 19, 24, 32, 48
-};
-
-/*
-* Starting index for entropy decoder to search for the right interval,
-* one entry per LAR coefficient
-*/
-const uint16_t WebRtcIsac_kLpcShapeEntropySearchUb12
-[UB_LPC_ORDER * UB_LPC_VEC_PER_FRAME] =
-{
-     6,  7,  9, 13,  9, 12, 16, 24
-};
-
-/*
-* The following 8 vectors define CDF of 8 decorrelated LAR
-* coefficients.
-*/
-const uint16_t WebRtcIsac_kLpcShapeCdfVec0Ub12[14] =
-{
-     0,    13,    95,   418,  1687,  6498, 21317, 44200, 59029, 63849, 65147,
- 65449, 65525, 65535
-};
-
-const uint16_t WebRtcIsac_kLpcShapeCdfVec1Ub12[16] =
-{
-     0,    10,    59,   255,   858,  2667,  8200, 22609, 42988, 57202, 62947,
- 64743, 65308, 65476, 65522, 65535
-};
-
-const uint16_t WebRtcIsac_kLpcShapeCdfVec2Ub12[20] =
-{
-     0,    18,    40,   118,   332,   857,  2017,  4822, 11321, 24330, 41279,
- 54342, 60637, 63394, 64659, 65184, 65398, 65482, 65518, 65535
-};
-
-const uint16_t WebRtcIsac_kLpcShapeCdfVec3Ub12[28] =
-{
-     0,    21,    38,    90,   196,   398,   770,  1400,  2589,  4650,  8211,
- 14933, 26044, 39592, 50814, 57452, 60971, 62884, 63995, 64621, 65019, 65273,
- 65410, 65480, 65514, 65522, 65531, 65535
-};
-
-const uint16_t WebRtcIsac_kLpcShapeCdfVec4Ub12[20] =
-{
-     0,     7,    46,   141,   403,   969,  2132,  4649, 10633, 24902, 43254,
- 54665, 59928, 62674, 64173, 64938, 65293, 65464, 65523, 65535
-};
-
-const uint16_t WebRtcIsac_kLpcShapeCdfVec5Ub12[25] =
-{
-     0,     7,    22,    72,   174,   411,   854,  1737,  3545,  6774, 13165,
- 25221, 40980, 52821, 58714, 61706, 63472, 64437, 64989, 65287, 65430, 65503,
- 65525, 65529, 65535
-};
-
-const uint16_t WebRtcIsac_kLpcShapeCdfVec6Ub12[33] =
-{
-     0,    11,    21,    36,    65,   128,   228,   401,   707,  1241,  2126,
-  3589,  6060, 10517, 18853, 31114, 42477, 49770, 54271, 57467, 59838, 61569,
- 62831, 63772, 64433, 64833, 65123, 65306, 65419, 65466, 65499, 65519, 65535
-};
-
-const uint16_t WebRtcIsac_kLpcShapeCdfVec7Ub12[49] =
-{
-     0,    14,    34,    67,   107,   167,   245,   326,   449,   645,   861,
-  1155,  1508,  2003,  2669,  3544,  4592,  5961,  7583,  9887, 13256, 18765,
- 26519, 34077, 40034, 44349, 47795, 50663, 53262, 55473, 57458, 59122, 60592,
- 61742, 62690, 63391, 63997, 64463, 64794, 65045, 65207, 65309, 65394, 65443,
- 65478, 65504, 65514, 65523, 65535
-};
-
-/*
-* An array of pointers to CDFs of decorrelated LARs
-*/
-const uint16_t* WebRtcIsac_kLpcShapeCdfMatUb12
-[UB_LPC_ORDER * UB_LPC_VEC_PER_FRAME] =
-{
-    WebRtcIsac_kLpcShapeCdfVec0Ub12, WebRtcIsac_kLpcShapeCdfVec1Ub12,
-    WebRtcIsac_kLpcShapeCdfVec2Ub12, WebRtcIsac_kLpcShapeCdfVec3Ub12,
-    WebRtcIsac_kLpcShapeCdfVec4Ub12, WebRtcIsac_kLpcShapeCdfVec5Ub12,
-    WebRtcIsac_kLpcShapeCdfVec6Ub12, WebRtcIsac_kLpcShapeCdfVec7Ub12
-};
diff --git a/modules/audio_coding/codecs/isac/main/source/lpc_shape_swb12_tables.h b/modules/audio_coding/codecs/isac/main/source/lpc_shape_swb12_tables.h
deleted file mode 100644
index 256f1d4..0000000
--- a/modules/audio_coding/codecs/isac/main/source/lpc_shape_swb12_tables.h
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/*
- * lpc_shape_swb12_tables.h
- *
- * This file declares tables used for entropy coding of LPC shape of
- * upper-band signal if the bandwidth is 12 kHz.
- *
- */
-
-#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_MAIN_SOURCE_LPC_SHAPE_SWB12_TABLES_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_MAIN_SOURCE_LPC_SHAPE_SWB12_TABLES_H_
-
-#include "settings.h"
-#include "webrtc/typedefs.h"
-
-extern const double WebRtcIsac_kMeanLarUb12[UB_LPC_ORDER];
-
-extern const double WebRtcIsac_kMeanLpcGain;
-
-extern const double WebRtcIsac_kIntraVecDecorrMatUb12[UB_LPC_ORDER][UB_LPC_ORDER];
-
-extern const double WebRtcIsac_kInterVecDecorrMatUb12
-[UB_LPC_VEC_PER_FRAME][UB_LPC_VEC_PER_FRAME];
-
-extern const double WebRtcIsac_kLpcShapeQStepSizeUb12;
-
-extern const double WebRtcIsac_kLpcShapeLeftRecPointUb12
-[UB_LPC_ORDER*UB_LPC_VEC_PER_FRAME];
-
-
-extern const int16_t WebRtcIsac_kLpcShapeNumRecPointUb12
-[UB_LPC_ORDER * UB_LPC_VEC_PER_FRAME];
-
-extern const uint16_t WebRtcIsac_kLpcShapeEntropySearchUb12
-[UB_LPC_ORDER * UB_LPC_VEC_PER_FRAME];
-
-extern const uint16_t WebRtcIsac_kLpcShapeCdfVec0Ub12[14];
-
-extern const uint16_t WebRtcIsac_kLpcShapeCdfVec1Ub12[16];
-
-extern const uint16_t WebRtcIsac_kLpcShapeCdfVec2Ub12[20];
-
-extern const uint16_t WebRtcIsac_kLpcShapeCdfVec3Ub12[28];
-
-extern const uint16_t WebRtcIsac_kLpcShapeCdfVec4Ub12[20];
-
-extern const uint16_t WebRtcIsac_kLpcShapeCdfVec5Ub12[25];
-
-extern const uint16_t WebRtcIsac_kLpcShapeCdfVec6Ub12[33];
-
-extern const uint16_t WebRtcIsac_kLpcShapeCdfVec7Ub12[49];
-
-extern const uint16_t* WebRtcIsac_kLpcShapeCdfMatUb12
-[UB_LPC_ORDER * UB_LPC_VEC_PER_FRAME];
-
-#endif // WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_MAIN_SOURCE_LPC_SHAPE_SWB12_TABLES_H_
diff --git a/modules/audio_coding/codecs/isac/main/source/lpc_shape_swb16_tables.c b/modules/audio_coding/codecs/isac/main/source/lpc_shape_swb16_tables.c
deleted file mode 100644
index 6176d2c..0000000
--- a/modules/audio_coding/codecs/isac/main/source/lpc_shape_swb16_tables.c
+++ /dev/null
@@ -1,248 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/*
- * SWB16_KLT_Tables.c
- *
- * This file defines tables used for entropy coding of LPC shape of
- * upper-band signal if the bandwidth is 16 kHz.
- *
- */
-
-#include "lpc_shape_swb16_tables.h"
-#include "settings.h"
-#include "webrtc/typedefs.h"
-
-/*
-* Mean value of LAR
-*/
-const double WebRtcIsac_kMeanLarUb16[UB_LPC_ORDER] =
-{
-0.454978, 0.364747, 0.102999, 0.104523
-};
-
-/*
-* A rotation matrix to decorrelate intra-vector correlation,
-* i.e. correlation among components of LAR vector.
-*/
-const double WebRtcIsac_kIintraVecDecorrMatUb16[UB_LPC_ORDER][UB_LPC_ORDER] =
-{
-    {-0.020528, -0.085858, -0.002431,  0.996093},
-    {-0.033155,  0.036102,  0.998786,  0.004866},
-    { 0.202627,  0.974853, -0.028940,  0.088132},
-    {-0.978479,  0.202454, -0.039785, -0.002811}
-};
-
-/*
-* A rotation matrix to remove correlation among LAR coefficients
-* of different LAR vectors. One might guess that decorrelation matrix
-* for the first component should differ from the second component
-* but we haven't observed a significant benefit of having different
-* decorrelation matrices for different components.
-*/
-const double WebRtcIsac_kInterVecDecorrMatUb16
-[UB16_LPC_VEC_PER_FRAME][UB16_LPC_VEC_PER_FRAME] =
-{
-    { 0.291675, -0.515786,  0.644927,  0.482658},
-    {-0.647220,  0.479712,  0.289556,  0.516856},
-    { 0.643084,  0.485489, -0.289307,  0.516763},
-    {-0.287185, -0.517823, -0.645389,  0.482553}
-};
-
-/*
-* The following 16 vectors define CDF of 16 decorrelated LAR
-* coefficients.
-*/
-const uint16_t WebRtcIsac_kLpcShapeCdfVec01Ub16[14] =
-{
-     0,      2,     20,    159,   1034,   5688,  20892,  44653,
- 59849,  64485,  65383,  65518,  65534,  65535
-};
-
-const uint16_t WebRtcIsac_kLpcShapeCdfVec1Ub16[16] =
-{
-     0,      1,      7,     43,    276,   1496,   6681,  21653,
- 43891,  58859,  64022,  65248,  65489,  65529,  65534,  65535
-};
-
-const uint16_t WebRtcIsac_kLpcShapeCdfVec2Ub16[18] =
-{
-     0,      1,      9,     54,    238,    933,   3192,   9461,
- 23226,  42146,  56138,  62413,  64623,  65300,  65473,  65521,
- 65533,  65535
-};
-
-const uint16_t WebRtcIsac_kLpcShapeCdfVec3Ub16[30] =
-{
-     0,      2,      4,      8,     17,     36,     75,    155,
-   329,    683,   1376,   2662,   5047,   9508,  17526,  29027,
- 40363,  48997,  55096,  59180,  61789,  63407,  64400,  64967,
- 65273,  65429,  65497,  65526,  65534,  65535
-};
-
-const uint16_t WebRtcIsac_kLpcShapeCdfVec4Ub16[16] =
-{
-     0,      1,     10,     63,    361,   1785,   7407,  22242,
- 43337,  58125,  63729,  65181,  65472,  65527,  65534,  65535
-};
-
-const uint16_t WebRtcIsac_kLpcShapeCdfVec5Ub16[17] =
-{
-     0,      1,      7,     29,    134,    599,   2443,   8590,
- 22962,  42635,  56911,  63060,  64940,  65408,  65513,  65531,
- 65535
-};
-
-const uint16_t WebRtcIsac_kLpcShapeCdfVec6Ub16[21] =
-{
-     0,      1,      5,     16,     57,    191,    611,   1808,
-  4847,  11755,  24612,  40910,  53789,  60698,  63729,  64924,
- 65346,  65486,  65523,  65532,  65535
-};
-
-const uint16_t WebRtcIsac_kLpcShapeCdfVec7Ub16[36] =
-{
-     0,      1,      4,     12,     25,     55,    104,    184,
-   314,    539,    926,   1550,   2479,   3861,   5892,   8845,
- 13281,  20018,  29019,  38029,  45581,  51557,  56057,  59284,
- 61517,  63047,  64030,  64648,  65031,  65261,  65402,  65480,
- 65518,  65530,  65534,  65535
-};
-
-const uint16_t WebRtcIsac_kLpcShapeCdfVec8Ub16[21] =
-{
-     0,      1,      2,      7,     26,    103,    351,   1149,
-  3583,  10204,  23846,  41711,  55361,  61917,  64382,  65186,
- 65433,  65506,  65528,  65534,  65535
-};
-
-const uint16_t WebRtcIsac_kLpcShapeCdfVec01Ub160[21] =
-{
-     0,      6,     19,     63,    205,    638,   1799,   4784,
- 11721,  24494,  40803,  53805,  60886,  63822,  64931,  65333,
- 65472,  65517,  65530,  65533,  65535
-};
-
-const uint16_t WebRtcIsac_kLpcShapeCdfVec01Ub161[28] =
-{
-     0,      1,      3,     11,     31,     86,    221,    506,
-  1101,   2296,   4486,   8477,  15356,  26079,  38941,  49952,
- 57165,  61257,  63426,  64549,  65097,  65351,  65463,  65510,
- 65526,  65532,  65534,  65535
-};
-
-const uint16_t WebRtcIsac_kLpcShapeCdfVec01Ub162[55] =
-{
-     0,      3,     12,     23,     42,     65,     89,    115,
-   150,    195,    248,    327,    430,    580,    784,   1099,
-  1586,   2358,   3651,   5899,   9568,  14312,  19158,  23776,
- 28267,  32663,  36991,  41153,  45098,  48680,  51870,  54729,
- 57141,  59158,  60772,  62029,  63000,  63761,  64322,  64728,
- 65000,  65192,  65321,  65411,  65463,  65496,  65514,  65523,
- 65527,  65529,  65531,  65532,  65533,  65534,  65535
-};
-
-const uint16_t WebRtcIsac_kLpcShapeCdfVec01Ub163[26] =
-{
-     0,      2,      4,     10,     21,     48,    114,    280,
-   701,   1765,   4555,  11270,  24267,  41213,  54285,  61003,
- 63767,  64840,  65254,  65421,  65489,  65514,  65526,  65532,
- 65534,  65535
-};
-
-const uint16_t WebRtcIsac_kLpcShapeCdfVec01Ub164[28] =
-{
-     0,      1,      3,      6,     15,     36,     82,    196,
-   453,   1087,   2557,   5923,  13016,  25366,  40449,  52582,
- 59539,  62896,  64389,  65033,  65316,  65442,  65494,  65519,
- 65529,  65533,  65534,  65535
-};
-
-const uint16_t WebRtcIsac_kLpcShapeCdfVec01Ub165[34] =
-{
-     0,      2,      4,      8,     18,     35,     73,    146,
-   279,    524,    980,   1789,   3235,   5784,  10040,  16998,
- 27070,  38543,  48499,  55421,  59712,  62257,  63748,  64591,
- 65041,  65278,  65410,  65474,  65508,  65522,  65530,  65533,
- 65534,  65535
-};
-
-const uint16_t WebRtcIsac_kLpcShapeCdfVec01Ub166[71] =
-{
-     0,      1,      2,      6,     13,     26,     55,     92,
-   141,    191,    242,    296,    355,    429,    522,    636,
-   777,    947,   1162,   1428,   1753,   2137,   2605,   3140,
-  3743,   4409,   5164,   6016,   6982,   8118,   9451,  10993,
- 12754,  14810,  17130,  19780,  22864,  26424,  30547,  35222,
- 40140,  44716,  48698,  52056,  54850,  57162,  59068,  60643,
- 61877,  62827,  63561,  64113,  64519,  64807,  65019,  65167,
- 65272,  65343,  65399,  65440,  65471,  65487,  65500,  65509,
- 65518,  65524,  65527,  65531,  65533,  65534,  65535
-};
-
-/*
-* An array of pointers to CDFs of decorrelated LARs
-*/
-const uint16_t* WebRtcIsac_kLpcShapeCdfMatUb16
-[UB_LPC_ORDER * UB16_LPC_VEC_PER_FRAME] = {
-     WebRtcIsac_kLpcShapeCdfVec01Ub16,
-     WebRtcIsac_kLpcShapeCdfVec1Ub16,
-     WebRtcIsac_kLpcShapeCdfVec2Ub16,
-     WebRtcIsac_kLpcShapeCdfVec3Ub16,
-     WebRtcIsac_kLpcShapeCdfVec4Ub16,
-     WebRtcIsac_kLpcShapeCdfVec5Ub16,
-     WebRtcIsac_kLpcShapeCdfVec6Ub16,
-     WebRtcIsac_kLpcShapeCdfVec7Ub16,
-     WebRtcIsac_kLpcShapeCdfVec8Ub16,
-     WebRtcIsac_kLpcShapeCdfVec01Ub160,
-     WebRtcIsac_kLpcShapeCdfVec01Ub161,
-     WebRtcIsac_kLpcShapeCdfVec01Ub162,
-     WebRtcIsac_kLpcShapeCdfVec01Ub163,
-     WebRtcIsac_kLpcShapeCdfVec01Ub164,
-     WebRtcIsac_kLpcShapeCdfVec01Ub165,
-     WebRtcIsac_kLpcShapeCdfVec01Ub166
-};
-
-/*
-* The smallest reconstruction points for quantiztion of LAR coefficients.
-*/
-const double WebRtcIsac_kLpcShapeLeftRecPointUb16
-[UB_LPC_ORDER * UB16_LPC_VEC_PER_FRAME] =
-{
- -0.8250,  -0.9750,  -1.1250,  -2.1750,  -0.9750,  -1.1250,  -1.4250,
- -2.6250,  -1.4250,  -1.2750,  -1.8750,  -3.6750,  -1.7250,  -1.8750,
- -2.3250,  -5.4750
-};
-
-/*
-* Number of reconstruction points of quantizers for LAR coefficients.
-*/
-const int16_t WebRtcIsac_kLpcShapeNumRecPointUb16
-[UB_LPC_ORDER * UB16_LPC_VEC_PER_FRAME] =
-{
-   13,    15,    17,    29,    15,    16,    20,    35,    20,
-   20,    27,    54,    25,    27,    33,    70
-};
-
-/*
-* Starting index for entropy decoder to search for the right interval,
-* one entry per LAR coefficient
-*/
-const uint16_t WebRtcIsac_kLpcShapeEntropySearchUb16
-[UB_LPC_ORDER * UB16_LPC_VEC_PER_FRAME] =
-{
-    6,     7,     8,    14,     7,     8,    10,    17,    10,
-   10,    13,    27,    12,    13,    16,    35
-};
-
-/*
-* LAR quantization step-size.
-*/
-const double WebRtcIsac_kLpcShapeQStepSizeUb16 = 0.150000;
diff --git a/modules/audio_coding/codecs/isac/main/source/lpc_shape_swb16_tables.h b/modules/audio_coding/codecs/isac/main/source/lpc_shape_swb16_tables.h
deleted file mode 100644
index 3e1bdf7..0000000
--- a/modules/audio_coding/codecs/isac/main/source/lpc_shape_swb16_tables.h
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/*
- * lpc_shape_swb16_tables.h
- *
- * This file declares tables used for entropy coding of LPC shape of
- * upper-band signal if the bandwidth is 16 kHz.
- *
- */
-
-#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_MAIN_SOURCE_LPC_SHAPE_SWB16_TABLES_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_MAIN_SOURCE_LPC_SHAPE_SWB16_TABLES_H_
-
-#include "settings.h"
-#include "webrtc/typedefs.h"
-
-extern const double WebRtcIsac_kMeanLarUb16[UB_LPC_ORDER];
-
-extern const double WebRtcIsac_kIintraVecDecorrMatUb16[UB_LPC_ORDER][UB_LPC_ORDER];
-
-extern const double WebRtcIsac_kInterVecDecorrMatUb16
-[UB16_LPC_VEC_PER_FRAME][UB16_LPC_VEC_PER_FRAME];
-
-extern const uint16_t WebRtcIsac_kLpcShapeCdfVec01Ub16[14];
-
-extern const uint16_t WebRtcIsac_kLpcShapeCdfVec1Ub16[16];
-
-extern const uint16_t WebRtcIsac_kLpcShapeCdfVec2Ub16[18];
-
-extern const uint16_t WebRtcIsac_kLpcShapeCdfVec3Ub16[30];
-
-extern const uint16_t WebRtcIsac_kLpcShapeCdfVec4Ub16[16];
-
-extern const uint16_t WebRtcIsac_kLpcShapeCdfVec5Ub16[17];
-
-extern const uint16_t WebRtcIsac_kLpcShapeCdfVec6Ub16[21];
-
-extern const uint16_t WebRtcIsac_kLpcShapeCdfVec7Ub16[36];
-
-extern const uint16_t WebRtcIsac_kLpcShapeCdfVec8Ub16[21];
-
-extern const uint16_t WebRtcIsac_kLpcShapeCdfVec01Ub160[21];
-
-extern const uint16_t WebRtcIsac_kLpcShapeCdfVec01Ub161[28];
-
-extern const uint16_t WebRtcIsac_kLpcShapeCdfVec01Ub162[55];
-
-extern const uint16_t WebRtcIsac_kLpcShapeCdfVec01Ub163[26];
-
-extern const uint16_t WebRtcIsac_kLpcShapeCdfVec01Ub164[28];
-
-extern const uint16_t WebRtcIsac_kLpcShapeCdfVec01Ub165[34];
-
-extern const uint16_t WebRtcIsac_kLpcShapeCdfVec01Ub166[71];
-
-extern const uint16_t* WebRtcIsac_kLpcShapeCdfMatUb16
-[UB_LPC_ORDER * UB16_LPC_VEC_PER_FRAME];
-
-extern const double WebRtcIsac_kLpcShapeLeftRecPointUb16
-[UB_LPC_ORDER * UB16_LPC_VEC_PER_FRAME];
-
-extern const int16_t WebRtcIsac_kLpcShapeNumRecPointUb16
-[UB_LPC_ORDER * UB16_LPC_VEC_PER_FRAME];
-
-extern const uint16_t WebRtcIsac_kLpcShapeEntropySearchUb16
-[UB_LPC_ORDER * UB16_LPC_VEC_PER_FRAME];
-
-extern const double WebRtcIsac_kLpcShapeQStepSizeUb16;
-
-#endif // WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_MAIN_SOURCE_LPC_SHAPE_SWB16_TABLES_H_
diff --git a/modules/audio_coding/codecs/isac/main/source/lpc_tables.c b/modules/audio_coding/codecs/isac/main/source/lpc_tables.c
deleted file mode 100644
index 909809b..0000000
--- a/modules/audio_coding/codecs/isac/main/source/lpc_tables.c
+++ /dev/null
@@ -1,601 +0,0 @@
-/*
- *  Copyright (c) 2012 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.
- */
-
-/* coding tables for the KLT coefficients */
-
-#include "lpc_tables.h"
-#include "settings.h"
-
-/* cdf array for model indicator */
-const uint16_t WebRtcIsac_kQKltModelCdf[4] = {
-    0,  15434,  37548,  65535 };
-
-/* pointer to cdf array for model indicator */
-const uint16_t *WebRtcIsac_kQKltModelCdfPtr[1] = {
-    WebRtcIsac_kQKltModelCdf };
-
-/* initial cdf index for decoder of model indicator */
-const uint16_t WebRtcIsac_kQKltModelInitIndex[1] = { 1 };
-
-/* offset to go from rounded value to quantization index */
-const short WebRtcIsac_kQKltQuantMinGain[12] = {
-    3,  6,  4,  6,  6,  9,  5,  16,  11,  34, 32,  47 };
-
-
-const short WebRtcIsac_kQKltQuantMinShape[108] = {
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  1,
-    1,  1,  1,  1,  2,  2,  2,  3,  0,  0,
-    0,  0,  1,  0,  0,  0,  0,  1,  1,  1,
-    1,  1,  1,  2,  2,  3,  0,  0,  0,  0,
-    1,  0,  1,  1,  1,  1,  1,  1,  1,  2,
-    2,  4,  3,  5,  0,  0,  0,  0,  1,  1,
-    1,  1,  1,  1,  2,  1,  2,  2,  3,  4,
-    4,  7,  0,  0,  1,  1,  1,  1,  1,  1,
-    1,  2,  3,  2,  3,  4,  4,  5,  7,  13,
-    0,  1,  1,  2,  3,  2,  2,  2,  4,  4,
-    5,  6,  7,  11,  9,  13,  12,  26 };
-
-/* maximum quantization index */
-const uint16_t WebRtcIsac_kQKltMaxIndGain[12] = {
-    6,  12,  8,  14,  10,  19,  12,  31,  22,  56, 52,  138 };
-
-const uint16_t WebRtcIsac_kQKltMaxIndShape[108] = {
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  1,
-    2,  2,  2,  2,  4,  4,  5,  6,  0,  0,
-    0,  0,  1,  0,  0,  0,  0,  1,  2,  2,
-    2,  2,  3,  4,  5,  7,  0,  0,  0,  0,
-    2,  0,  2,  2,  2,  2,  3,  2,  2,  4,
-    4,  6,  6,  9,  0,  0,  0,  0,  2,  2,
-    2,  2,  2,  2,  3,  2,  4,  4,  7,  7,
-    9,  13,  0,  0,  2,  2,  2,  2,  2,  2,
-    3,  4,  5,  4,  6,  8,  8,  10,  16,  25,
-    0,  2,  2,  4,  5,  4,  4,  4,  7,  8,
-    9,  10,  13,  19,  17,  23,  25,  49 };
-
-/* index offset */
-const uint16_t WebRtcIsac_kQKltOffsetGain[12] = {
-    0,  7,  20,  29,  44,  55,  75,  88,  120,  143,  200,  253 };
-
-const uint16_t WebRtcIsac_kQKltOffsetShape[108] = {
-    0,  1,  2,  3,  4,  5,  6,  7,  8,  9,
-    11,  14,  17,  20,  23,  28,  33,  39,  46,  47,
-    48,  49,  50,  52,  53,  54,  55,  56,  58,  61,
-    64,  67,  70,  74,  79,  85,  93,  94,  95,  96,
-    97,  100,  101,  104,  107,  110,  113,  117,  120,  123,
-    128,  133,  140,  147,  157,  158,  159,  160,  161,  164,
-    167,  170,  173,  176,  179,  183,  186,  191,  196,  204,
-    212,  222,  236,  237,  238,  241,  244,  247,  250,  253,
-    256,  260,  265,  271,  276,  283,  292,  301,  312,  329,
-    355,  356,  359,  362,  367,  373,  378,  383,  388,  396,
-    405,  415,  426,  440,  460,  478,  502,  528 };
-
-/* initial cdf index for KLT coefficients */
-const uint16_t WebRtcIsac_kQKltInitIndexGain[12] = {
-    3,  6,  4,  7,  5,  10,  6,  16,  11,  28, 26,  69};
-
-const uint16_t WebRtcIsac_kQKltInitIndexShape[108] = {
-    0,  0,  0,  0,  0,  0,  0,  0,  0,  1,
-    1,  1,  1,  1,  2,  2,  3,  3,  0,  0,
-    0,  0,  1,  0,  0,  0,  0,  1,  1,  1,
-    1,  1,  2,  2,  3,  4,  0,  0,  0,  0,
-    1,  0,  1,  1,  1,  1,  2,  1,  1,  2,
-    2,  3,  3,  5,  0,  0,  0,  0,  1,  1,
-    1,  1,  1,  1,  2,  1,  2,  2,  4,  4,
-    5,  7,  0,  0,  1,  1,  1,  1,  1,  1,
-    2,  2,  3,  2,  3,  4,  4,  5,  8,  13,
-    0,  1,  1,  2,  3,  2,  2,  2,  4,  4,
-    5,  5,  7,  10,  9,  12,  13,  25 };
-
-
-/* quantizer representation levels */
-const double WebRtcIsac_kQKltLevelsGain[392] = {
-    -2.78127126, -1.76745590, -0.77913790, -0.00437329,  0.79961206,
-    1.81775776, 2.81389782, -5.78753143, -4.88384084, -3.89320940,
-    -2.88133610, -1.92859977, -0.86347396,  0.02003888,  0.86140400,
-    1.89667156,  2.97134967,  3.98781964,  4.91727277,  5.82865898,
-    -4.11195874, -2.80898424, -1.87547977, -0.80943825, -0.00679084,
-    0.79573851,  1.83953397,  2.67586037,  3.76274082, -6.10933968,
-    -4.93034581, -3.89281296, -2.91530625, -1.89684163, -0.85319130,
-    -0.02275767,  0.86862017,  1.91578276,  2.96107339,  3.96543056,
-    4.91369908,  5.91058154,  6.83848343,  8.07136925, -5.87470395,
-    -4.84703049, -3.84284597, -2.86168446, -1.89290192, -0.82798145,
-    -0.00080013,  0.82594974,  1.85754329,  2.88351798,  3.96172628,
-    -8.85684885, -7.87387461, -6.97811862, -5.93256270, -4.94301439,
-    -3.95513701, -2.96041544, -1.94031192, -0.87961478, -0.00456201,
-    0.89911505,  1.91723376,  2.94011511,  3.93302540,  4.97990967,
-    5.93133404,  7.02181199,  7.92407762,  8.80155440,  10.04665814,
-    -4.82396678, -3.85612158, -2.89482244, -1.89558408, -0.90036978,
-    -0.00677823,  0.90607989,  1.90937981,  2.91175777,  3.91637730,
-    4.97565723,  5.84771228,  7.11145863, -16.07879840, -15.03776309,
-    -13.93905670, -12.95671800, -11.89171202, -10.95820934, -9.95923714,
-    -8.94357334, -7.99068299, -6.97481009, -5.94826231, -4.96673988,
-    -3.97490466, -2.97846970, -1.95130435, -0.94215262, -0.01444043,
-    0.96770704,  1.95848598,  2.94107862,  3.95666119,  4.97253085,
-    5.97191122,  6.93277360,  7.96608727,  8.87958779,  10.00264269,
-    10.86560820,  12.07449071,  13.04491775,  13.97507061,  14.91845261,
-    -10.85696295, -9.83365357, -9.01245635, -7.95915145, -6.95625003,
-    -5.95362618, -4.93468444, -3.98760978, -2.95044407, -1.97041277,
-    -0.97701799, -0.00840234,  0.97834289,  1.98361415,  2.97802439,
-    3.96415871,  4.95369042,  5.94101770,  6.92756798,  7.94063998,
-    8.85951828,  9.97077022,  11.00068503, -33.92030406, -32.81426422,
-    -32.00000000, -31.13243639, -30.11886909, -29.06017570, -28.12598824,
-    -27.22045482, -25.81215858, -25.07849962, -23.93018013, -23.02097643,
-    -21.89529725, -20.99091085, -19.98889048, -18.94327044, -17.96562071,
-    -16.96126218, -15.95054062, -14.98516200, -13.97101012, -13.02106500,
-    -11.98438006, -11.03216748, -9.95930286, -8.97043946, -7.98085082,
-    -6.98360995, -5.98998802, -4.98668173, -4.00032906, -3.00420619,
-    -1.98701132, -0.99324682, -0.00609324,  0.98297834,  1.99483076,
-    3.00305044,  3.97142097,  4.97525759,  5.98612258,  6.97448236,
-    7.97575900,  9.01086211,  9.98665542,  11.00541438,  11.98078628,
-    12.92352471,  14.06849675,  14.99949430,  15.94904834,  16.97440321,
-    18.04040916,  18.88987609,  20.05312391,  21.00000000,  21.79443341,
-    -31.98578825, -31.00000000, -29.89060567, -28.98555686, -27.97114102,
-    -26.84935410, -26.02402230, -24.94195278, -23.92336849, -22.95552382,
-    -21.97932836, -20.96055470, -19.99649553, -19.03436122, -17.96706525,
-    -17.01139515, -16.01363516, -14.99154248, -14.00298333, -12.99630613,
-    -11.99955519, -10.99000421, -10.00819092, -8.99763648, -7.98431793,
-    -7.01769025, -5.99604690, -4.99980697, -3.99334671, -3.01748192,
-    -2.02051217, -1.00848371, -0.01942358,  1.00477757,  1.95477872,
-    2.98593031,  3.98779079,  4.96862849,  6.02694771,  6.93983733,
-    7.89874717,  8.99615862,  10.02367921,  10.96293452,  11.84351528,
-    12.92207187,  13.85122329,  15.05146877,  15.99371264,  17.00000000,
-    18.00000000,  19.00000000,  19.82763573, -47.00000000, -46.00000000,
-    -44.87138498, -44.00000000, -43.00000000, -42.00000000, -41.00000000,
-    -39.88966612, -38.98913239, -37.80306486, -37.23584325, -35.94200288,
-    -34.99881301, -34.11361858, -33.06507360, -32.13129135, -30.90891364,
-    -29.81511907, -28.99250380, -28.04535391, -26.99767800, -26.04418164,
-    -24.95687851, -24.04865595, -23.03392645, -21.89366707, -20.93517364,
-    -19.99388660, -18.91620943, -18.03749683, -16.99532379, -15.98683813,
-    -15.06421479, -13.99359211, -12.99714098, -11.97022520, -10.98500279,
-    -9.98834422, -8.95729330, -8.01232284, -7.00253661, -5.99681626,
-    -5.01207817, -3.95914904, -3.01232178, -1.96615919, -0.97687670,
-    0.01228030,  0.98412288,  2.01753544,  3.00580570,  3.97783510,
-    4.98846894,  6.01321400,  7.00867732,  8.00416375,  9.01771966,
-    9.98637729,  10.98255180,  11.99194163,  13.01807333,  14.00999545,
-    15.00118556,  16.00089224,  17.00584148,  17.98251763,  18.99942091,
-    19.96917690,  20.97839265,  21.98207297,  23.00171271,  23.99930737,
-    24.99746061,  26.00936304,  26.98240132,  28.01126868,  29.01395915,
-    29.98153507,  31.01376711,  31.99876818,  33.00475317,  33.99753994,
-    34.99493913,  35.98933585,  36.95620160,  37.98428461,  38.99317544,
-    40.01832073,  40.98048133,  41.95999283,  42.98232091,  43.96523612,
-    44.99574268,  45.99524194,  47.05464025,  48.03821548,  48.99354366,
-    49.96400411,  50.98017973,  51.95184408,  52.96291806,  54.00194392,
-    54.96603783,  55.95623778,  57.03076595,  58.05889901,  58.99081551,
-    59.97928121,  61.05071612,  62.03971580,  63.01286038,  64.01290338,
-    65.02074503,  65.99454594,  67.00399425,  67.96571257,  68.95305727,
-    69.92030664,  70.95594862,  71.98088567,  73.04764124,  74.00285480,
-    75.02696330,  75.89837673,  76.93459997,  78.16266309,  78.83317543,
-    80.00000000,  80.87251574,  82.09803524,  83.10671664,  84.00000000,
-    84.77023523,  86.00000000,  87.00000000,  87.92946897,  88.69159118,
-    90.00000000,  90.90535270 };
-
-const double WebRtcIsac_kQKltLevelsShape[578] = {
-    0.00032397,  0.00008053, -0.00061202, -0.00012620,  0.00030437,
-    0.00054764, -0.00027902,  0.00069360,  0.00029449, -0.80219239,
-    0.00091089, -0.74514927, -0.00094283,  0.64030631, -0.60509119,
-    0.00035575,  0.61851665, -0.62129957,  0.00375219,  0.60054900,
-    -0.61554359,  0.00054977,  0.63362016, -1.73118727, -0.65422341,
-    0.00524568,  0.66165298,  1.76785515, -1.83182018, -0.65997434,
-    -0.00011887,  0.67524299,  1.79933938, -1.76344480, -0.72547708,
-    -0.00133017,  0.73104704,  1.75305377,  2.85164534, -2.80423916,
-    -1.71959639, -0.75419722, -0.00329945,  0.77196760,  1.72211069,
-    2.87339653,  0.00031089, -0.00015311,  0.00018201, -0.00035035,
-    -0.77357251,  0.00154647, -0.00047625, -0.00045299,  0.00086590,
-    0.00044762, -0.83383829,  0.00024787, -0.68526258, -0.00122472,
-    0.64643255, -0.60904942, -0.00448987,  0.62309184, -0.59626442,
-    -0.00574132,  0.62296546, -0.63222115,  0.00013441,  0.63609545,
-    -0.66911055, -0.00369971,  0.66346095,  2.07281301, -1.77184694,
-    -0.67640425, -0.00010145,  0.64818392,  1.74948973, -1.69420224,
-    -0.71943894, -0.00004680,  0.75303493,  1.81075983,  2.80610041,
-    -2.80005755, -1.79866753, -0.77409777, -0.00084220,  0.80141293,
-    1.78291081,  2.73954236,  3.82994169,  0.00015140, -0.00012766,
-    -0.00034241, -0.00119125, -0.76113497,  0.00069246,  0.76722027,
-    0.00132862, -0.69107530,  0.00010656,  0.77061578, -0.78012970,
-    0.00095947,  0.77828502, -0.64787758,  0.00217168,  0.63050167,
-    -0.58601125,  0.00306596,  0.59466308, -0.58603410,  0.00059779,
-    0.64257970,  1.76512766, -0.61193600, -0.00259517,  0.59767574,
-    -0.61026273,  0.00315811,  0.61725479, -1.69169719, -0.65816029,
-    0.00067575,  0.65576890,  2.00000000, -1.72689193, -0.69780808,
-    -0.00040990,  0.70668487,  1.74198458, -3.79028154, -3.00000000,
-    -1.73194459, -0.70179341, -0.00106695,  0.71302629,  1.76849782,
-    -2.89332364, -1.78585007, -0.78731491, -0.00132610,  0.79692976,
-    1.75247009,  2.97828682, -5.26238694, -3.69559829, -2.87286122,
-    -1.84908818, -0.84434577, -0.01167975,  0.84641753,  1.84087672,
-    2.87628156,  3.83556679, -0.00190204,  0.00092642,  0.00354385,
-    -0.00012982, -0.67742785,  0.00229509,  0.64935672, -0.58444751,
-    0.00470733,  0.57299534, -0.58456202, -0.00097715,  0.64593607,
-    -0.64060330, -0.00638534,  0.59680157, -0.59287537,  0.00490772,
-    0.58919707, -0.60306173, -0.00417464,  0.60562100, -1.75218757,
-    -0.63018569, -0.00225922,  0.63863300, -0.63949939, -0.00126421,
-    0.64268914, -1.75851182, -0.68318060,  0.00510418,  0.69049211,
-    1.88178506, -1.71136148, -0.72710534, -0.00815559,  0.73412917,
-    1.79996711, -2.77111145, -1.73940498, -0.78212945,  0.01074476,
-    0.77688916,  1.76873972,  2.87281379,  3.77554698, -3.75832725,
-    -2.95463235, -1.80451491, -0.80017226,  0.00149902,  0.80729206,
-    1.78265046,  2.89391793, -3.78236148, -2.83640598, -1.82532067,
-    -0.88844327, -0.00620952,  0.88208030,  1.85757631,  2.81712391,
-    3.88430176,  5.16179367, -7.00000000, -5.93805408, -4.87172597,
-    -3.87524433, -2.89399744, -1.92359563, -0.92136341, -0.00172725,
-    0.93087018,  1.90528280,  2.89809686,  3.88085708,  4.89147740,
-    5.89078692, -0.00239502,  0.00312564, -1.00000000,  0.00178325,
-    1.00000000, -0.62198029,  0.00143254,  0.65344051, -0.59851220,
-    -0.00676987,  0.61510140, -0.58894151,  0.00385055,  0.59794203,
-    -0.59808568, -0.00038214,  0.57625703, -0.63009713, -0.01107985,
-    0.61278758, -0.64206758, -0.00154369,  0.65480598,  1.80604162,
-    -1.80909286, -0.67810514,  0.00205762,  0.68571097,  1.79453891,
-    -3.22682422, -1.73808453, -0.71870305, -0.00738594,  0.71486172,
-    1.73005326, -1.66891897, -0.73689615, -0.00616203,  0.74262409,
-    1.73807899, -2.92417482, -1.73866741, -0.78133871,  0.00764425,
-    0.80027264,  1.78668732,  2.74992588, -4.00000000, -2.75578740,
-    -1.83697516, -0.83117035, -0.00355191,  0.83527172,  1.82814700,
-    2.77377675,  3.80718693, -3.81667698, -2.83575471, -1.83372350,
-    -0.86579471,  0.00547578,  0.87582281,  1.82858793,  2.87265007,
-    3.91405377, -4.87521600, -3.78999094, -2.86437014, -1.86964365,
-    -0.90618018,  0.00128243,  0.91497811,  1.87374952,  2.83199819,
-    3.91519130,  4.76632822, -6.68713448, -6.01252467, -4.94587936,
-    -3.88795368, -2.91299088, -1.92592211, -0.95504570, -0.00089980,
-    0.94565200,  1.93239633,  2.91832808,  3.91363475,  4.88920034,
-    5.96471415,  6.83905252,  7.86195009,  8.81571018,-12.96141759,
-    -11.73039516,-10.96459719, -9.97382433, -9.04414433, -7.89460619,
-    -6.96628608, -5.93236595, -4.93337924, -3.95479990, -2.96451499,
-    -1.96635876, -0.97271229, -0.00402238,  0.98343930,  1.98348291,
-    2.96641164,  3.95456471,  4.95517089,  5.98975714,  6.90322073,
-    7.90468849,  8.85639467,  9.97255498, 10.79006309, 11.81988596,
-    0.04950500, -1.00000000, -0.01226628,  1.00000000, -0.59479469,
-    -0.10438305,  0.59822144, -2.00000000, -0.67109149, -0.09256692,
-    0.65171621,  2.00000000, -3.00000000, -1.68391999, -0.76681039,
-    -0.03354151,  0.71509146,  1.77615472, -2.00000000, -0.68661511,
-    -0.02497881,  0.66478398,  2.00000000, -2.00000000, -0.67032784,
-    -0.00920582,  0.64892756,  2.00000000, -2.00000000, -0.68561894,
-    0.03641869,  0.73021611,  1.68293863, -4.00000000, -2.72024184,
-    -1.80096059, -0.81696185,  0.03604685,  0.79232033,  1.70070730,
-    3.00000000, -4.00000000, -2.71795670, -1.80482986, -0.86001162,
-    0.03764903,  0.87723968,  1.79970771,  2.72685932,  3.67589143,
-    -5.00000000, -4.00000000, -2.85492548, -1.78996365, -0.83250358,
-    -0.01376828,  0.84195506,  1.78161105,  2.76754458,  4.00000000,
-    -6.00000000, -5.00000000, -3.82268811, -2.77563624, -1.82608163,
-    -0.86486114, -0.02671886,  0.86693165,  1.88422879,  2.86248347,
-    3.95632216, -7.00000000, -6.00000000, -5.00000000, -3.77533988,
-    -2.86391432, -1.87052039, -0.90513658,  0.06271236,  0.91083620,
-    1.85734756,  2.86031688,  3.82019418,  4.94420394,  6.00000000,
-    -11.00000000,-10.00000000, -9.00000000, -8.00000000, -6.91952415,
-    -6.00000000, -4.92044374, -3.87845165, -2.87392362, -1.88413020,
-    -0.91915740,  0.00318517,  0.91602800,  1.89664838,  2.88925058,
-    3.84123856,  4.78988651,  5.94526812,  6.81953917,  8.00000000,
-    -9.00000000, -8.00000000, -7.03319143, -5.94530963, -4.86669720,
-    -3.92438007, -2.88620396, -1.92848070, -0.94365985,  0.01671855,
-    0.97349410,  1.93419878,  2.89740109,  3.89662823,  4.83235583,
-    5.88106535,  6.80328232,  8.00000000,-13.00000000,-12.00000000,
-    -11.00000000,-10.00000000, -9.00000000, -7.86033489, -6.83344055,
-    -5.89844215, -4.90811454, -3.94841298, -2.95820490, -1.98627966,
-    -0.99161468, -0.02286136,  0.96055651,  1.95052433,  2.93969396,
-    3.94304346,  4.88522624,  5.87434241,  6.78309433,  7.87244101,
-    9.00000000, 10.00000000,-12.09117356,-11.00000000,-10.00000000,
-    -8.84766108, -7.86934236, -6.98544896, -5.94233429, -4.95583292,
-    -3.95575986, -2.97085529, -1.98955811, -0.99359873, -0.00485413,
-    0.98298870,  1.98093258,  2.96430203,  3.95540216,  4.96915010,
-    5.96775124,  6.99236918,  7.96503302,  8.99864542,  9.85857723,
-    10.96541926, 11.91647197, 12.71060069,-26.00000000,-25.00000000,
-    -24.00585596,-23.11642573,-22.14271284,-20.89800711,-19.87815799,
-    -19.05036354,-17.88555651,-16.86471209,-15.97711073,-14.94012359,
-    -14.02661226,-12.98243228,-11.97489256,-10.97402777, -9.96425624,
-    -9.01085220, -7.97372506, -6.98795002, -5.97271328, -5.00191694,
-    -3.98055849, -2.98458048, -1.99470442, -0.99656768, -0.00825666,
-    1.00272004,  1.99922218,  2.99357669,  4.01407905,  5.01003897,
-    5.98115528,  7.00018958,  8.00338125,  8.98981046,  9.98990318,
-    10.96341479, 11.96866930, 12.99175139, 13.94580443, 14.95745083,
-    15.98992869, 16.97484646, 17.99630043, 18.93396897, 19.88347741,
-    20.96532482, 21.92191032, 23.22314702 };
-
-
-/* cdf tables for quantizer indices */
-const uint16_t WebRtcIsac_kQKltCdfGain[404] = {
-    0,  13,  301,  3730,  61784,  65167,  65489,  65535,  0,  17,
-    142,  314,  929,  2466,  7678,  56450,  63463,  64740,  65204,  65426,
-    65527,  65535,  0,  8,  100,  724,  6301,  60105,  65125,  65510,
-    65531,  65535,  0,  13,  117,  368,  1068,  3010,  11928,  53603,
-    61177,  63404,  64505,  65108,  65422,  65502,  65531,  65535,  0,  4,
-    17,  96,  410,  1859,  12125,  54361,  64103,  65305,  65497,  65535,
-    0,  4,  88,  230,  469,  950,  1746,  3228,  6092,  16592,
-    44756,  56848,  61256,  63308,  64325,  64920,  65309,  65460,  65502,
-    65522, 65535,  0,  88,  352,  1675,  6339,  20749,  46686,  59284,  63525,
-    64949,  65359,  65502,  65527,  65535,  0,  13,  38,  63,  117,
-    234,  381,  641,  929,  1407,  2043,  2809,  4032,  5753,  8792,
-    14407,  24308,  38941,  48947,  55403,  59293,  61411,  62688,  63630,
-    64329, 64840,  65188,  65376,  65472,  65506,  65527,  65531,  65535,
-    0,  8, 29,  75,  222,  615,  1327,  2801,  5623,  9931,  16094,  24966,
-    34419, 43458,  50676,  56186,  60055,  62500,  63936,  64765,  65225,
-    65435, 65514,  65535,  0,  8,  13,  15,  17,  21,  33,  59,
-    71,  92,  151,  243,  360,  456,  674,  934,  1223,  1583,
-    1989,  2504,  3031,  3617,  4354,  5154,  6163,  7411,  8780,  10747,
-    12874,  15591,  18974,  23027,  27436,  32020,  36948,  41830,  46205,
-    49797,  53042,  56094,  58418,  60360,  61763,  62818,  63559,  64103,
-    64509,  64798,  65045,  65162,  65288,  65363,  65447,  65506,  65522,
-    65531,  65533,  65535,  0,  4,  6,  25,  38,  71,  138,  264,  519,  808,
-    1227,  1825,  2516,  3408,  4279,  5560,  7092,  9197,  11420,  14108,
-    16947,  20300,  23926,  27459,  31164,  34827,  38575,  42178,  45540,
-    48747,  51444,  54090,  56426,  58460,  60080,  61595,  62734,  63668,
-    64275,  64673,  64936,  65112,  65217,  65334,  65426,  65464,  65477,
-    65489,  65518,  65527,  65529,  65531,  65533,  65535,  0,  2,  4,  8,  10,
-    12,  14,  16,  21,  33,  50,  71,  84,  92,  105,  138, 180,  255,  318,
-    377,  435,  473,  511,  590,  682,  758,  913,  1097,  1256,  1449,  1671,
-    1884,  2169,  2445,  2772,  3157,  3563,  3944,  4375,  4848,  5334,  5820,
-    6448,  7101,  7716,  8378,  9102,  9956,  10752,  11648,  12707,  13670,
-    14758,  15910,  17187,  18472,  19627,  20649,  21951,  23169,  24283,
-    25552,  26862,  28227,  29391,  30764,  31882,  33213,  34432,  35600,
-    36910,  38116,  39464,  40729,  41872,  43144,  44371,  45514,  46762,
-    47813,  48968,  50069,  51032,  51974,  52908,  53737,  54603,  55445,
-    56282,  56990,  57572,  58191,  58840,  59410,  59887,  60264,  60607,
-    60946,  61269,  61516,  61771,  61960,  62198,  62408,  62558,  62776,
-    62985,  63207,  63408,  63546,  63739,  63906,  64070,  64237,  64371,
-    64551,  64677,  64836,  64999,  65095,  65213,  65284,  65338,  65380,
-    65426,  65447,  65472,  65485,  65487,  65489,  65502,  65510,  65512,
-    65514,  65516,  65518,  65522,  65531,  65533,  65535 };
-
-
-const uint16_t WebRtcIsac_kQKltCdfShape[686] = {
-    0,  65535,  0,  65535,  0,  65535,  0,  65535,  0,  65535,
-    0,  65535,  0,  65535,  0,  65535,  0,  65535,  0,  4,
-    65535,  0,  8,  65514,  65535,  0,  29,  65481,  65535,  0,
-    121,  65439,  65535,  0,  239,  65284,  65535,  0,  8,  779,
-    64999,  65527,  65535,  0,  8,  888,  64693,  65522,  65535,  0,
-    29,  2604,  62843,  65497,  65531,  65535,  0,  25,  176,  4576,
-    61164,  65275,  65527,  65535,  0,  65535,  0,  65535,  0,  65535,
-    0,  65535,  0,  4,  65535,  0,  65535,  0,  65535,  0,
-    65535,  0,  65535,  0,  4,  65535,  0,  33,  65502,  65535,
-    0,  54,  65481,  65535,  0,  251,  65309,  65535,  0,  611,
-    65074,  65535,  0,  1273,  64292,  65527,  65535,  0,  4,  1809,
-    63940,  65518,  65535,  0,  88,  4392,  60603,  65426,  65531,  65535,
-    0,  25,  419,  7046,  57756,  64961,  65514,  65531,  65535,  0,
-    65535,  0,  65535,  0,  65535,  0,  65535,  0,  4,  65531,
-    65535,  0,  65535,  0,  8,  65531,  65535,  0,  4,  65527,
-    65535,  0,  17,  65510,  65535,  0,  42,  65481,  65535,  0,
-    197,  65342,  65531,  65535,  0,  385,  65154,  65535,  0,  1005,
-    64522,  65535,  0,  8,  1985,  63469,  65533,  65535,  0,  38,
-    3119,  61884,  65514,  65535,  0,  4,  6,  67,  4961,  60804,
-    65472,  65535,  0,  17,  565,  9182,  56538,  65087,  65514,  65535,
-    0,  8,  63,  327,  2118,  14490,  52774,  63839,  65376,  65522,
-    65535,  0,  65535,  0,  65535,  0,  65535,  0,  65535,  0,
-    17,  65522,  65535,  0,  59,  65489,  65535,  0,  50,  65522,
-    65535,  0,  54,  65489,  65535,  0,  310,  65179,  65535,  0,
-    615,  64836,  65535,  0,  4,  1503,  63965,  65535,  0,  2780,
-    63383,  65535,  0,  21,  3919,  61051,  65527,  65535,  0,  84,
-    6674,  59929,  65435,  65535,  0,  4,  255,  7976,  55784,  65150,
-    65518,  65531,  65535,  0,  4,  8,  582,  10726,  53465,  64949,
-    65518,  65535,  0,  29,  339,  3006,  17555,  49517,  62956,  65200,
-    65497,  65531,  65535,  0,  2,  33,  138,  565,  2324,  7670,
-    22089,  45966,  58949,  63479,  64966,  65380,  65518,  65535,  0,  65535,
-    0,  65535,  0,  2,  65533,  65535,  0,  46,  65514,  65535,
-    0,  414,  65091,  65535,  0,  540,  64911,  65535,  0,  419,
-    65162,  65535,  0,  976,  64790,  65535,  0,  2977,  62495,  65531,
-    65535,  0,  4,  3852,  61034,  65527,  65535,  0,  4,  29,
-    6021,  60243,  65468,  65535,  0,  84,  6711,  58066,  65418,  65535,
-    0,  13,  281,  9550,  54917,  65125,  65506,  65535,  0,  2,
-    63,  984,  12108,  52644,  64342,  65435,  65527,  65535,  0,  29,
-    251,  2014,  14871,  47553,  62881,  65229,  65518,  65535,  0,  13,
-    142,  749,  4220,  18497,  45200,  60913,  64823,  65426,  65527,  65535,
-    0,  13,  71,  264,  1176,  3789,  10500,  24480,  43488,  56324,
-    62315,  64493,  65242,  65464,  65514,  65522,  65531,  65535,  0,  4,
-    13,  38,  109,  205,  448,  850,  1708,  3429,  6276,  11371,
-    19221,  29734,  40955,  49391,  55411,  59460,  62102,  63793,  64656,
-    65150, 65401,  65485,  65522,  65531,  65535,  0,  65535,  0,  2,  65533,
-    65535,  0,  1160,  65476,  65535,  0,  2,  6640,  64763,  65533,
-    65535,  0,  2,  38,  9923,  61009,  65527,  65535,  0,  2,
-    4949,  63092,  65533,  65535,  0,  2,  3090,  63398,  65533,  65535,
-    0,  2,  2520,  58744,  65510,  65535,  0,  2,  13,  544,
-    8784,  51403,  65148,  65533,  65535,  0,  2,  25,  1017,  10412,
-    43550,  63651,  65489,  65527,  65535,  0,  2,  4,  29,  783,
-    13377,  52462,  64524,  65495,  65533,  65535,  0,  2,  4,  6,
-    100,  1817,  18451,  52590,  63559,  65376,  65531,  65535,  0,  2,
-    4,  6,  46,  385,  2562,  11225,  37416,  60488,  65026,  65487,
-    65529,  65533,  65535,  0,  2,  4,  6,  8,  10,  12,
-    42,  222,  971,  5221,  19811,  45048,  60312,  64486,  65294,  65474,
-    65525,  65529,  65533,  65535,  0,  2,  4,  8,  71,  167,
-    666,  2533,  7875,  19622,  38082,  54359,  62108,  64633,  65290,  65495,
-    65529,  65533,  65535,  0,  2,  4,  6,  8,  10,  13,
-    109,  586,  1930,  4949,  11600,  22641,  36125,  48312,  56899,  61495,
-    63927,  64932,  65389,  65489,  65518,  65531,  65533,  65535,  0,  4,
-    6,  8,  67,  209,  712,  1838,  4195,  8432,  14432,  22834,
-    31723,  40523,  48139,  53929,  57865,  60657,  62403,  63584,  64363,
-    64907, 65167,  65372,  65472,  65514,  65535,  0,  2,  4,  13,  25,
-    42,  46,  50,  75,  113,  147,  281,  448,  657,  909,
-    1185,  1591,  1976,  2600,  3676,  5317,  7398,  9914,  12941,  16169,
-    19477,  22885,  26464,  29851,  33360,  37228,  41139,  44802,  48654,
-    52058, 55181,  57676,  59581,  61022,  62190,  63107,  63676,  64199,
-    64547,  64924, 65158,  65313,  65430,  65481,  65518,  65535 };
-
-
-/* pointers to cdf tables for quantizer indices */
-const uint16_t *WebRtcIsac_kQKltCdfPtrGain[12] = {
-    WebRtcIsac_kQKltCdfGain +0 +0, WebRtcIsac_kQKltCdfGain +0 +8,
-    WebRtcIsac_kQKltCdfGain +0 +22, WebRtcIsac_kQKltCdfGain +0 +32,
-    WebRtcIsac_kQKltCdfGain +0 +48, WebRtcIsac_kQKltCdfGain +0 +60,
-    WebRtcIsac_kQKltCdfGain +0 +81, WebRtcIsac_kQKltCdfGain +0 +95,
-    WebRtcIsac_kQKltCdfGain +0 +128, WebRtcIsac_kQKltCdfGain +0 +152,
-    WebRtcIsac_kQKltCdfGain +0 +210, WebRtcIsac_kQKltCdfGain +0 +264 };
-
-const uint16_t *WebRtcIsac_kQKltCdfPtrShape[108] = {
-    WebRtcIsac_kQKltCdfShape +0 +0, WebRtcIsac_kQKltCdfShape +0 +2,
-    WebRtcIsac_kQKltCdfShape +0 +4, WebRtcIsac_kQKltCdfShape +0 +6,
-    WebRtcIsac_kQKltCdfShape +0 +8, WebRtcIsac_kQKltCdfShape +0 +10,
-    WebRtcIsac_kQKltCdfShape +0 +12, WebRtcIsac_kQKltCdfShape +0 +14,
-    WebRtcIsac_kQKltCdfShape +0 +16, WebRtcIsac_kQKltCdfShape +0 +18,
-    WebRtcIsac_kQKltCdfShape +0 +21, WebRtcIsac_kQKltCdfShape +0 +25,
-    WebRtcIsac_kQKltCdfShape +0 +29, WebRtcIsac_kQKltCdfShape +0 +33,
-    WebRtcIsac_kQKltCdfShape +0 +37, WebRtcIsac_kQKltCdfShape +0 +43,
-    WebRtcIsac_kQKltCdfShape +0 +49, WebRtcIsac_kQKltCdfShape +0 +56,
-    WebRtcIsac_kQKltCdfShape +0 +64, WebRtcIsac_kQKltCdfShape +0 +66,
-    WebRtcIsac_kQKltCdfShape +0 +68, WebRtcIsac_kQKltCdfShape +0 +70,
-    WebRtcIsac_kQKltCdfShape +0 +72, WebRtcIsac_kQKltCdfShape +0 +75,
-    WebRtcIsac_kQKltCdfShape +0 +77, WebRtcIsac_kQKltCdfShape +0 +79,
-    WebRtcIsac_kQKltCdfShape +0 +81, WebRtcIsac_kQKltCdfShape +0 +83,
-    WebRtcIsac_kQKltCdfShape +0 +86, WebRtcIsac_kQKltCdfShape +0 +90,
-    WebRtcIsac_kQKltCdfShape +0 +94, WebRtcIsac_kQKltCdfShape +0 +98,
-    WebRtcIsac_kQKltCdfShape +0 +102, WebRtcIsac_kQKltCdfShape +0 +107,
-    WebRtcIsac_kQKltCdfShape +0 +113, WebRtcIsac_kQKltCdfShape +0 +120,
-    WebRtcIsac_kQKltCdfShape +0 +129, WebRtcIsac_kQKltCdfShape +0 +131,
-    WebRtcIsac_kQKltCdfShape +0 +133, WebRtcIsac_kQKltCdfShape +0 +135,
-    WebRtcIsac_kQKltCdfShape +0 +137, WebRtcIsac_kQKltCdfShape +0 +141,
-    WebRtcIsac_kQKltCdfShape +0 +143, WebRtcIsac_kQKltCdfShape +0 +147,
-    WebRtcIsac_kQKltCdfShape +0 +151, WebRtcIsac_kQKltCdfShape +0 +155,
-    WebRtcIsac_kQKltCdfShape +0 +159, WebRtcIsac_kQKltCdfShape +0 +164,
-    WebRtcIsac_kQKltCdfShape +0 +168, WebRtcIsac_kQKltCdfShape +0 +172,
-    WebRtcIsac_kQKltCdfShape +0 +178, WebRtcIsac_kQKltCdfShape +0 +184,
-    WebRtcIsac_kQKltCdfShape +0 +192, WebRtcIsac_kQKltCdfShape +0 +200,
-    WebRtcIsac_kQKltCdfShape +0 +211, WebRtcIsac_kQKltCdfShape +0 +213,
-    WebRtcIsac_kQKltCdfShape +0 +215, WebRtcIsac_kQKltCdfShape +0 +217,
-    WebRtcIsac_kQKltCdfShape +0 +219, WebRtcIsac_kQKltCdfShape +0 +223,
-    WebRtcIsac_kQKltCdfShape +0 +227, WebRtcIsac_kQKltCdfShape +0 +231,
-    WebRtcIsac_kQKltCdfShape +0 +235, WebRtcIsac_kQKltCdfShape +0 +239,
-    WebRtcIsac_kQKltCdfShape +0 +243, WebRtcIsac_kQKltCdfShape +0 +248,
-    WebRtcIsac_kQKltCdfShape +0 +252, WebRtcIsac_kQKltCdfShape +0 +258,
-    WebRtcIsac_kQKltCdfShape +0 +264, WebRtcIsac_kQKltCdfShape +0 +273,
-    WebRtcIsac_kQKltCdfShape +0 +282, WebRtcIsac_kQKltCdfShape +0 +293,
-    WebRtcIsac_kQKltCdfShape +0 +308, WebRtcIsac_kQKltCdfShape +0 +310,
-    WebRtcIsac_kQKltCdfShape +0 +312, WebRtcIsac_kQKltCdfShape +0 +316,
-    WebRtcIsac_kQKltCdfShape +0 +320, WebRtcIsac_kQKltCdfShape +0 +324,
-    WebRtcIsac_kQKltCdfShape +0 +328, WebRtcIsac_kQKltCdfShape +0 +332,
-    WebRtcIsac_kQKltCdfShape +0 +336, WebRtcIsac_kQKltCdfShape +0 +341,
-    WebRtcIsac_kQKltCdfShape +0 +347, WebRtcIsac_kQKltCdfShape +0 +354,
-    WebRtcIsac_kQKltCdfShape +0 +360, WebRtcIsac_kQKltCdfShape +0 +368,
-    WebRtcIsac_kQKltCdfShape +0 +378, WebRtcIsac_kQKltCdfShape +0 +388,
-    WebRtcIsac_kQKltCdfShape +0 +400, WebRtcIsac_kQKltCdfShape +0 +418,
-    WebRtcIsac_kQKltCdfShape +0 +445, WebRtcIsac_kQKltCdfShape +0 +447,
-    WebRtcIsac_kQKltCdfShape +0 +451, WebRtcIsac_kQKltCdfShape +0 +455,
-    WebRtcIsac_kQKltCdfShape +0 +461, WebRtcIsac_kQKltCdfShape +0 +468,
-    WebRtcIsac_kQKltCdfShape +0 +474, WebRtcIsac_kQKltCdfShape +0 +480,
-    WebRtcIsac_kQKltCdfShape +0 +486, WebRtcIsac_kQKltCdfShape +0 +495,
-    WebRtcIsac_kQKltCdfShape +0 +505, WebRtcIsac_kQKltCdfShape +0 +516,
-    WebRtcIsac_kQKltCdfShape +0 +528, WebRtcIsac_kQKltCdfShape +0 +543,
-    WebRtcIsac_kQKltCdfShape +0 +564, WebRtcIsac_kQKltCdfShape +0 +583,
-    WebRtcIsac_kQKltCdfShape +0 +608, WebRtcIsac_kQKltCdfShape +0 +635 };
-
-
-/* left KLT transforms */
-const double WebRtcIsac_kKltT1Gain[4] = {
-    -0.79742827,  0.60341375,  0.60341375,  0.79742827 };
-
-const double WebRtcIsac_kKltT1Shape[324] = {
-    0.00159597,  0.00049320,  0.00513821,  0.00021066,  0.01338581,
-    -0.00422367, -0.00272072,  0.00935107,  0.02047622,  0.02691189,
-    0.00478236,  0.03969702,  0.00886698,  0.04877604, -0.10898362,
-    -0.05930891, -0.03415047,  0.98889721,  0.00293558, -0.00035282,
-    0.01156321, -0.00195341, -0.00937631,  0.01052213, -0.02551163,
-    0.01644059,  0.03189927,  0.07754773, -0.08742313, -0.03026338,
-    0.05136248, -0.14395974,  0.17725040,  0.22664856,  0.93380230,
-    0.07076411,  0.00557890, -0.00222834,  0.01377569,  0.01466808,
-    0.02847361, -0.00603178,  0.02382480, -0.01210452,  0.03797267,
-    -0.02371480,  0.11260335, -0.07366682,  0.00453436, -0.04136941,
-    -0.07912843, -0.95031418,  0.25295337, -0.05302216, -0.00617554,
-    -0.00044040, -0.00653778,  0.01097838,  0.01529174,  0.01374431,
-    -0.00748512, -0.00020034,  0.02432713,  0.11101570, -0.08556891,
-    0.09282249, -0.01029446,  0.67556443, -0.67454300,  0.06910063,
-    0.20866865, -0.10318050,  0.00932175,  0.00524058,  0.00803610,
-    -0.00594676, -0.01082578,  0.01069906,  0.00546768,  0.01565291,
-    0.06816200,  0.10201227,  0.16812734,  0.22984074,  0.58213170,
-    -0.54138651, -0.51379962,  0.06847390, -0.01920037, -0.04592324,
-    -0.00467394,  0.00328858,  0.00377424, -0.00987448,  0.08222096,
-    -0.00377301,  0.04551941, -0.02592517,  0.16317082,  0.13077530,
-    0.22702921, -0.31215289, -0.69645962, -0.38047101, -0.39339411,
-    0.11124777,  0.02508035, -0.00708074,  0.00400344,  0.00040331,
-    0.01142402,  0.01725406,  0.01635170,  0.14285366,  0.03949233,
-    -0.05905676,  0.05877154, -0.17497577, -0.32479440,  0.80754464,
-    -0.38085603, -0.17055430, -0.03168622, -0.07531451,  0.02942002,
-    -0.02148095, -0.00754114, -0.00322372,  0.00567812, -0.01701521,
-    -0.12358320,  0.11473564,  0.09070136,  0.06533068, -0.22560802,
-    0.19209022,  0.81605094,  0.36592275, -0.09919829,  0.16667122,
-    0.16300725,  0.04803807,  0.06739263, -0.00156752, -0.01685302,
-    -0.00905240, -0.02297836, -0.00469939,  0.06310613, -0.16391930,
-    0.10919511,  0.12529293,  0.85581322, -0.32145522,  0.24539076,
-    0.07181839,  0.07289591,  0.14066759,  0.10406711,  0.05815518,
-    0.01072680, -0.00759339,  0.00053486, -0.00044865,  0.03407361,
-    0.01645348,  0.08758579,  0.27722240,  0.53665485, -0.74853376,
-    -0.01118192, -0.19805430,  0.06130619, -0.09675299,  0.08978480,
-    0.03405255, -0.00706867,  0.05102045,  0.03250746,  0.01849966,
-    -0.01216314, -0.01184187, -0.01579288,  0.00114807,  0.11376166,
-    0.88342114, -0.36425379,  0.13863190,  0.12524180, -0.13553892,
-    0.04715856, -0.12341103,  0.04531568,  0.01899360, -0.00206897,
-    0.00567768, -0.01444163,  0.00411946, -0.00855896,  0.00381663,
-    -0.01664861, -0.05534280,  0.21328278,  0.20161162,  0.72360394,
-    0.59130708, -0.08043791,  0.08757349, -0.13893918, -0.05147377,
-    0.02680690, -0.01144070,  0.00625162, -0.00634215, -0.01248947,
-    -0.00329455, -0.00609625, -0.00136305, -0.05097048, -0.01029851,
-    0.25065384, -0.16856837, -0.07123372,  0.15992623, -0.39487617,
-    -0.79972301,  0.18118185, -0.04826639, -0.01805578, -0.02927253,
-    -0.16400618,  0.07472763,  0.10376449,  0.01705406,  0.01065801,
-    -0.01500498,  0.02039914,  0.37776349, -0.84484186,  0.10434286,
-    0.15616990,  0.13474456, -0.00906238, -0.25238368, -0.03820885,
-    -0.10650905, -0.03880833, -0.03660028, -0.09640894,  0.00583314,
-    0.01922097,  0.01489911, -0.02431117, -0.09372217,  0.39404721,
-    -0.84786223, -0.31277121,  0.03193850,  0.01974060,  0.01887901,
-    0.00337911, -0.11359599, -0.02792521, -0.03220184, -0.01533311,
-    0.00015962, -0.04225043, -0.00933965,  0.00675311,  0.00206060,
-    0.15926771,  0.40199829, -0.80792558, -0.35591604, -0.17169764,
-    0.02830436,  0.02459982, -0.03438589,  0.00718705, -0.01798329,
-    -0.01594508, -0.00702430, -0.00952419, -0.00962701, -0.01307212,
-    -0.01749740,  0.01299602,  0.00587270, -0.36103108, -0.82039266,
-    -0.43092844, -0.08500097, -0.04361674, -0.00333482,  0.01250434,
-    -0.02538295, -0.00921797,  0.01645071, -0.01400872,  0.00317607,
-    0.00003277, -0.01617646, -0.00616863, -0.00882661,  0.00466157,
-    0.00353237,  0.91803104, -0.39503305, -0.02048964,  0.00060125,
-    0.01980634,  0.00300109,  0.00313880,  0.00657337,  0.00715163,
-    0.00000261,  0.00854276, -0.00154825, -0.00516128,  0.00909527,
-    0.00095609,  0.00701196, -0.00221867, -0.00156741 };
-
-/* right KLT transforms */
-const double WebRtcIsac_kKltT2Gain[36] = {
-    0.14572837, -0.45446306,  0.61990621, -0.52197033,  0.32145074,
-    -0.11026900, -0.20698282,  0.48962182, -0.27127933, -0.33627476,
-    0.65094037, -0.32715751,  0.40262573, -0.47844405, -0.33876075,
-    0.44130653,  0.37383966, -0.39964662, -0.51730480,  0.06611973,
-    0.49030187,  0.47512886, -0.02141226, -0.51129451, -0.58578569,
-    -0.39132064, -0.13187771,  0.15649421,  0.40735596,  0.54396897,
-    0.40381276,  0.40904942,  0.41179766,  0.41167576,  0.40840251,
-    0.40468132 };
-
-const double WebRtcIsac_kKltT2Shape[36] = {
-    0.13427386, -0.35132558,  0.52506528, -0.59419077,  0.45075085,
-    -0.16312057,  0.29857439, -0.58660147,  0.34265431,  0.20879510,
-    -0.56063262,  0.30238345,  0.43308283, -0.41186999, -0.35288681,
-    0.42768996,  0.36094634, -0.45284910, -0.47116680,  0.02893449,
-    0.54326135,  0.45249040, -0.06264420, -0.52283830,  0.57137758,
-    0.44298139,  0.12617554, -0.20819946, -0.42324603, -0.48876443,
-    0.39597050,  0.40713935,  0.41389880,  0.41512486,  0.41130400,
-    0.40575001 };
-
-/* means of log gains and LAR coefficients*/
-const double WebRtcIsac_kLpcMeansGain[12] = {
-    -6.86881911, -5.35075273, -6.86792680, -5.36200897, -6.86401538,
-    -5.36921533, -6.86802969, -5.36893966, -6.86538097, -5.36315063,
-    -6.85535304, -5.35155315 };
-
-const double WebRtcIsac_kLpcMeansShape[108] = {
-    -0.91232981,  0.26258634, -0.33716701,  0.08477430, -0.03378426,
-    0.14423909,  0.07036185,  0.06155019,  0.01490385,  0.04138740,
-    0.01427317,  0.01288970,  0.83872106,  0.25750199,  0.07988929,
-    -0.01957923,  0.00831390,  0.01770300, -0.90957164,  0.25732216,
-    -0.33385344,  0.08735740, -0.03715332,  0.14584917,  0.06998990,
-    0.06131968,  0.01504379,  0.04067339,  0.01428039,  0.01406460,
-    0.83846243,  0.26169862,  0.08109025, -0.01767055,  0.00970539,
-    0.01954310, -0.90490803,  0.24656405, -0.33578607,  0.08843286,
-    -0.03749139,  0.14443959,  0.07214669,  0.06170993,  0.01449947,
-    0.04134309,  0.01314762,  0.01413471,  0.83895203,  0.26748062,
-    0.08197507, -0.01781298,  0.00885967,  0.01922394, -0.90922472,
-    0.24495889, -0.33921540,  0.08877169, -0.03581332,  0.14199172,
-    0.07444032,  0.06185940,  0.01502054,  0.04185113,  0.01276579,
-    0.01355457,  0.83645358,  0.26631720,  0.08119697, -0.01835449,
-    0.00788512,  0.01846446, -0.90482253,  0.24658310, -0.34019734,
-    0.08281090, -0.03486038,  0.14359248,  0.07401336,  0.06001471,
-    0.01528421,  0.04254560,  0.01321472,  0.01240799,  0.83857127,
-    0.26281654,  0.08174380, -0.02099842,  0.00755176,  0.01699448,
-    -0.90132307,  0.25174308, -0.33838268,  0.07883863, -0.02877906,
-    0.14105407,  0.07220290,  0.06000352,  0.01684879,  0.04226844,
-    0.01331331,  0.01269244,  0.83832138,  0.25467485,  0.08118028,
-    -0.02120528,  0.00747832,  0.01567212 };
diff --git a/modules/audio_coding/codecs/isac/main/source/lpc_tables.h b/modules/audio_coding/codecs/isac/main/source/lpc_tables.h
deleted file mode 100644
index 51f6316..0000000
--- a/modules/audio_coding/codecs/isac/main/source/lpc_tables.h
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- *  Copyright (c) 2012 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.
- */
-
-/*
- * lpc_tables.h
- *
- * header file for coding tables for the LPC coefficients
- *
- */
-
-#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_MAIN_SOURCE_LPC_TABLES_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_MAIN_SOURCE_LPC_TABLES_H_
-
-#include "structs.h"
-
-#include "settings.h"
-
-#define KLT_STEPSIZE         1.00000000
-#define KLT_NUM_AVG_GAIN     0
-#define KLT_NUM_AVG_SHAPE    0
-#define KLT_NUM_MODELS  3
-#define LPC_GAIN_SCALE     4.000f
-#define LPC_LOBAND_SCALE   2.100f
-#define LPC_LOBAND_ORDER   ORDERLO
-#define LPC_HIBAND_SCALE   0.450f
-#define LPC_HIBAND_ORDER   ORDERHI
-#define LPC_GAIN_ORDER     2
-
-#define LPC_SHAPE_ORDER    (LPC_LOBAND_ORDER + LPC_HIBAND_ORDER)
-
-#define KLT_ORDER_GAIN     (LPC_GAIN_ORDER * SUBFRAMES)
-#define KLT_ORDER_SHAPE    (LPC_SHAPE_ORDER * SUBFRAMES)
-
-/* cdf array for model indicator */
-extern const uint16_t WebRtcIsac_kQKltModelCdf[KLT_NUM_MODELS+1];
-
-/* pointer to cdf array for model indicator */
-extern const uint16_t *WebRtcIsac_kQKltModelCdfPtr[1];
-
-/* initial cdf index for decoder of model indicator */
-extern const uint16_t WebRtcIsac_kQKltModelInitIndex[1];
-
-/* offset to go from rounded value to quantization index */
-extern const short WebRtcIsac_kQKltQuantMinGain[12];
-
-extern const short WebRtcIsac_kQKltQuantMinShape[108];
-
-/* maximum quantization index */
-extern const uint16_t WebRtcIsac_kQKltMaxIndGain[12];
-
-extern const uint16_t WebRtcIsac_kQKltMaxIndShape[108];
-
-/* index offset */
-extern const uint16_t WebRtcIsac_kQKltOffsetGain[12];
-
-extern const uint16_t WebRtcIsac_kQKltOffsetShape[108];
-
-/* initial cdf index for KLT coefficients */
-extern const uint16_t WebRtcIsac_kQKltInitIndexGain[12];
-
-extern const uint16_t WebRtcIsac_kQKltInitIndexShape[108];
-
-/* quantizer representation levels */
-extern const double WebRtcIsac_kQKltLevelsGain[392];
-
-extern const double WebRtcIsac_kQKltLevelsShape[578];
-
-/* cdf tables for quantizer indices */
-extern const uint16_t WebRtcIsac_kQKltCdfGain[404];
-
-extern const uint16_t WebRtcIsac_kQKltCdfShape[686];
-
-/* pointers to cdf tables for quantizer indices */
-extern const uint16_t *WebRtcIsac_kQKltCdfPtrGain[12];
-
-extern const uint16_t *WebRtcIsac_kQKltCdfPtrShape[108];
-
-/* left KLT transforms */
-extern const double WebRtcIsac_kKltT1Gain[4];
-
-extern const double WebRtcIsac_kKltT1Shape[324];
-
-/* right KLT transforms */
-extern const double WebRtcIsac_kKltT2Gain[36];
-
-extern const double WebRtcIsac_kKltT2Shape[36];
-
-/* means of log gains and LAR coefficients */
-extern const double WebRtcIsac_kLpcMeansGain[12];
-
-extern const double WebRtcIsac_kLpcMeansShape[108];
-
-#endif /* WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_MAIN_SOURCE_LPC_TABLES_H_ */
diff --git a/modules/audio_coding/codecs/isac/main/source/os_specific_inline.h b/modules/audio_coding/codecs/isac/main/source/os_specific_inline.h
deleted file mode 100644
index 2b446e9..0000000
--- a/modules/audio_coding/codecs/isac/main/source/os_specific_inline.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- *  Copyright (c) 2011 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_CODECS_ISAC_MAIN_SOURCE_OS_SPECIFIC_INLINE_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_MAIN_SOURCE_OS_SPECIFIC_INLINE_H_
-
-#include <math.h>
-#include "webrtc/typedefs.h"
-
-#if defined(WEBRTC_POSIX)
-#define WebRtcIsac_lrint lrint
-#elif (defined(WEBRTC_ARCH_X86) && defined(WIN32))
-static __inline long int WebRtcIsac_lrint(double x_dbl) {
-  long int x_int;
-
-  __asm {
-    fld x_dbl
-    fistp x_int
-  };
-
-  return x_int;
-}
-#else // Do a slow but correct implementation of lrint
-
-static __inline long int WebRtcIsac_lrint(double x_dbl) {
-  long int x_int;
-  x_int = (long int)floor(x_dbl + 0.499999999999);
-  return x_int;
-}
-
-#endif
-
-#endif  // WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_MAIN_SOURCE_OS_SPECIFIC_INLINE_H_
diff --git a/modules/audio_coding/codecs/isac/main/source/pitch_estimator.c b/modules/audio_coding/codecs/isac/main/source/pitch_estimator.c
deleted file mode 100644
index 090b94c..0000000
--- a/modules/audio_coding/codecs/isac/main/source/pitch_estimator.c
+++ /dev/null
@@ -1,623 +0,0 @@
-/*
- *  Copyright (c) 2011 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 "pitch_estimator.h"
-
-#include <math.h>
-#include <memory.h>
-#include <string.h>
-#ifdef WEBRTC_ANDROID
-#include <stdlib.h>
-#endif
-
-static const double kInterpolWin[8] = {-0.00067556028640,  0.02184247643159, -0.12203175715679,  0.60086484101160,
-                                       0.60086484101160, -0.12203175715679,  0.02184247643159, -0.00067556028640};
-
-/* interpolation filter */
-__inline static void IntrepolFilter(double *data_ptr, double *intrp)
-{
-  *intrp = kInterpolWin[0] * data_ptr[-3];
-  *intrp += kInterpolWin[1] * data_ptr[-2];
-  *intrp += kInterpolWin[2] * data_ptr[-1];
-  *intrp += kInterpolWin[3] * data_ptr[0];
-  *intrp += kInterpolWin[4] * data_ptr[1];
-  *intrp += kInterpolWin[5] * data_ptr[2];
-  *intrp += kInterpolWin[6] * data_ptr[3];
-  *intrp += kInterpolWin[7] * data_ptr[4];
-}
-
-
-/* 2D parabolic interpolation */
-/* probably some 0.5 factors can be eliminated, and the square-roots can be removed from the Cholesky fact. */
-__inline static void Intrpol2D(double T[3][3], double *x, double *y, double *peak_val)
-{
-  double c, b[2], A[2][2];
-  double t1, t2, d;
-  double delta1, delta2;
-
-
-  // double T[3][3] = {{-1.25, -.25,-.25}, {-.25, .75, .75}, {-.25, .75, .75}};
-  // should result in: delta1 = 0.5;  delta2 = 0.0;  peak_val = 1.0
-
-  c = T[1][1];
-  b[0] = 0.5 * (T[1][2] + T[2][1] - T[0][1] - T[1][0]);
-  b[1] = 0.5 * (T[1][0] + T[2][1] - T[0][1] - T[1][2]);
-  A[0][1] = -0.5 * (T[0][1] + T[2][1] - T[1][0] - T[1][2]);
-  t1 = 0.5 * (T[0][0] + T[2][2]) - c;
-  t2 = 0.5 * (T[2][0] + T[0][2]) - c;
-  d = (T[0][1] + T[1][2] + T[1][0] + T[2][1]) - 4.0 * c - t1 - t2;
-  A[0][0] = -t1 - 0.5 * d;
-  A[1][1] = -t2 - 0.5 * d;
-
-  /* deal with singularities or ill-conditioned cases */
-  if ( (A[0][0] < 1e-7) || ((A[0][0] * A[1][1] - A[0][1] * A[0][1]) < 1e-7) ) {
-    *peak_val = T[1][1];
-    return;
-  }
-
-  /* Cholesky decomposition: replace A by upper-triangular factor */
-  A[0][0] = sqrt(A[0][0]);
-  A[0][1] = A[0][1] / A[0][0];
-  A[1][1] = sqrt(A[1][1] - A[0][1] * A[0][1]);
-
-  /* compute [x; y] = -0.5 * inv(A) * b */
-  t1 = b[0] / A[0][0];
-  t2 = (b[1] - t1 * A[0][1]) / A[1][1];
-  delta2 = t2 / A[1][1];
-  delta1 = 0.5 * (t1 - delta2 * A[0][1]) / A[0][0];
-  delta2 *= 0.5;
-
-  /* limit norm */
-  t1 = delta1 * delta1 + delta2 * delta2;
-  if (t1 > 1.0) {
-    delta1 /= t1;
-    delta2 /= t1;
-  }
-
-  *peak_val = 0.5 * (b[0] * delta1 + b[1] * delta2) + c;
-
-  *x += delta1;
-  *y += delta2;
-}
-
-
-static void PCorr(const double *in, double *outcorr)
-{
-  double sum, ysum, prod;
-  const double *x, *inptr;
-  int k, n;
-
-  //ysum = 1e-6;          /* use this with float (i.s.o. double)! */
-  ysum = 1e-13;
-  sum = 0.0;
-  x = in + PITCH_MAX_LAG/2 + 2;
-  for (n = 0; n < PITCH_CORR_LEN2; n++) {
-    ysum += in[n] * in[n];
-    sum += x[n] * in[n];
-  }
-
-  outcorr += PITCH_LAG_SPAN2 - 1;     /* index of last element in array */
-  *outcorr = sum / sqrt(ysum);
-
-  for (k = 1; k < PITCH_LAG_SPAN2; k++) {
-    ysum -= in[k-1] * in[k-1];
-    ysum += in[PITCH_CORR_LEN2 + k - 1] * in[PITCH_CORR_LEN2 + k - 1];
-    sum = 0.0;
-    inptr = &in[k];
-    prod = x[0] * inptr[0];
-    for (n = 1; n < PITCH_CORR_LEN2; n++) {
-      sum += prod;
-      prod = x[n] * inptr[n];
-    }
-    sum += prod;
-    outcorr--;
-    *outcorr = sum / sqrt(ysum);
-  }
-}
-
-
-void WebRtcIsac_InitializePitch(const double *in,
-                                const double old_lag,
-                                const double old_gain,
-                                PitchAnalysisStruct *State,
-                                double *lags)
-{
-  double buf_dec[PITCH_CORR_LEN2+PITCH_CORR_STEP2+PITCH_MAX_LAG/2+2];
-  double ratio, log_lag, gain_bias;
-  double bias;
-  double corrvec1[PITCH_LAG_SPAN2];
-  double corrvec2[PITCH_LAG_SPAN2];
-  int m, k;
-  // Allocating 10 extra entries at the begining of the CorrSurf
-  double corrSurfBuff[10 + (2*PITCH_BW+3)*(PITCH_LAG_SPAN2+4)];
-  double* CorrSurf[2*PITCH_BW+3];
-  double *CorrSurfPtr1, *CorrSurfPtr2;
-  double LagWin[3] = {0.2, 0.5, 0.98};
-  int ind1, ind2, peaks_ind, peak, max_ind;
-  int peaks[PITCH_MAX_NUM_PEAKS];
-  double adj, gain_tmp;
-  double corr, corr_max;
-  double intrp_a, intrp_b, intrp_c, intrp_d;
-  double peak_vals[PITCH_MAX_NUM_PEAKS];
-  double lags1[PITCH_MAX_NUM_PEAKS];
-  double lags2[PITCH_MAX_NUM_PEAKS];
-  double T[3][3];
-  int row;
-
-  for(k = 0; k < 2*PITCH_BW+3; k++)
-  {
-    CorrSurf[k] = &corrSurfBuff[10 + k * (PITCH_LAG_SPAN2+4)];
-  }
-  /* reset CorrSurf matrix */
-  memset(corrSurfBuff, 0, sizeof(double) * (10 + (2*PITCH_BW+3) * (PITCH_LAG_SPAN2+4)));
-
-  //warnings -DH
-  max_ind = 0;
-  peak = 0;
-
-  /* copy old values from state buffer */
-  memcpy(buf_dec, State->dec_buffer, sizeof(double) * (PITCH_CORR_LEN2+PITCH_CORR_STEP2+PITCH_MAX_LAG/2-PITCH_FRAME_LEN/2+2));
-
-  /* decimation; put result after the old values */
-  WebRtcIsac_DecimateAllpass(in, State->decimator_state, PITCH_FRAME_LEN,
-                             &buf_dec[PITCH_CORR_LEN2+PITCH_CORR_STEP2+PITCH_MAX_LAG/2-PITCH_FRAME_LEN/2+2]);
-
-  /* low-pass filtering */
-  for (k = PITCH_CORR_LEN2+PITCH_CORR_STEP2+PITCH_MAX_LAG/2-PITCH_FRAME_LEN/2+2; k < PITCH_CORR_LEN2+PITCH_CORR_STEP2+PITCH_MAX_LAG/2+2; k++)
-    buf_dec[k] += 0.75 * buf_dec[k-1] - 0.25 * buf_dec[k-2];
-
-  /* copy end part back into state buffer */
-  memcpy(State->dec_buffer, buf_dec+PITCH_FRAME_LEN/2, sizeof(double) * (PITCH_CORR_LEN2+PITCH_CORR_STEP2+PITCH_MAX_LAG/2-PITCH_FRAME_LEN/2+2));
-
-  /* compute correlation for first and second half of the frame */
-  PCorr(buf_dec, corrvec1);
-  PCorr(buf_dec + PITCH_CORR_STEP2, corrvec2);
-
-  /* bias towards pitch lag of previous frame */
-  log_lag = log(0.5 * old_lag);
-  gain_bias = 4.0 * old_gain * old_gain;
-  if (gain_bias > 0.8) gain_bias = 0.8;
-  for (k = 0; k < PITCH_LAG_SPAN2; k++)
-  {
-    ratio = log((double) (k + (PITCH_MIN_LAG/2-2))) - log_lag;
-    bias = 1.0 + gain_bias * exp(-5.0 * ratio * ratio);
-    corrvec1[k] *= bias;
-  }
-
-  /* taper correlation functions */
-  for (k = 0; k < 3; k++) {
-    gain_tmp = LagWin[k];
-    corrvec1[k] *= gain_tmp;
-    corrvec2[k] *= gain_tmp;
-    corrvec1[PITCH_LAG_SPAN2-1-k] *= gain_tmp;
-    corrvec2[PITCH_LAG_SPAN2-1-k] *= gain_tmp;
-  }
-
-  corr_max = 0.0;
-  /* fill middle row of correlation surface */
-  ind1 = 0;
-  ind2 = 0;
-  CorrSurfPtr1 = &CorrSurf[PITCH_BW][2];
-  for (k = 0; k < PITCH_LAG_SPAN2; k++) {
-    corr = corrvec1[ind1++] + corrvec2[ind2++];
-    CorrSurfPtr1[k] = corr;
-    if (corr > corr_max) {
-      corr_max = corr;  /* update maximum */
-      max_ind = (int)(&CorrSurfPtr1[k] - &CorrSurf[0][0]);
-    }
-  }
-  /* fill first and last rows of correlation surface */
-  ind1 = 0;
-  ind2 = PITCH_BW;
-  CorrSurfPtr1 = &CorrSurf[0][2];
-  CorrSurfPtr2 = &CorrSurf[2*PITCH_BW][PITCH_BW+2];
-  for (k = 0; k < PITCH_LAG_SPAN2-PITCH_BW; k++) {
-    ratio = ((double) (ind1 + 12)) / ((double) (ind2 + 12));
-    adj = 0.2 * ratio * (2.0 - ratio);   /* adjustment factor; inverse parabola as a function of ratio */
-    corr = adj * (corrvec1[ind1] + corrvec2[ind2]);
-    CorrSurfPtr1[k] = corr;
-    if (corr > corr_max) {
-      corr_max = corr;  /* update maximum */
-      max_ind = (int)(&CorrSurfPtr1[k] - &CorrSurf[0][0]);
-    }
-    corr = adj * (corrvec1[ind2++] + corrvec2[ind1++]);
-    CorrSurfPtr2[k] = corr;
-    if (corr > corr_max) {
-      corr_max = corr;  /* update maximum */
-      max_ind = (int)(&CorrSurfPtr2[k] - &CorrSurf[0][0]);
-    }
-  }
-  /* fill second and next to last rows of correlation surface */
-  ind1 = 0;
-  ind2 = PITCH_BW-1;
-  CorrSurfPtr1 = &CorrSurf[1][2];
-  CorrSurfPtr2 = &CorrSurf[2*PITCH_BW-1][PITCH_BW+1];
-  for (k = 0; k < PITCH_LAG_SPAN2-PITCH_BW+1; k++) {
-    ratio = ((double) (ind1 + 12)) / ((double) (ind2 + 12));
-    adj = 0.9 * ratio * (2.0 - ratio);   /* adjustment factor; inverse parabola as a function of ratio */
-    corr = adj * (corrvec1[ind1] + corrvec2[ind2]);
-    CorrSurfPtr1[k] = corr;
-    if (corr > corr_max) {
-      corr_max = corr;  /* update maximum */
-      max_ind = (int)(&CorrSurfPtr1[k] - &CorrSurf[0][0]);
-    }
-    corr = adj * (corrvec1[ind2++] + corrvec2[ind1++]);
-    CorrSurfPtr2[k] = corr;
-    if (corr > corr_max) {
-      corr_max = corr;  /* update maximum */
-      max_ind = (int)(&CorrSurfPtr2[k] - &CorrSurf[0][0]);
-    }
-  }
-  /* fill remainder of correlation surface */
-  for (m = 2; m < PITCH_BW; m++) {
-    ind1 = 0;
-    ind2 = PITCH_BW - m;         /* always larger than ind1 */
-    CorrSurfPtr1 = &CorrSurf[m][2];
-    CorrSurfPtr2 = &CorrSurf[2*PITCH_BW-m][PITCH_BW+2-m];
-    for (k = 0; k < PITCH_LAG_SPAN2-PITCH_BW+m; k++) {
-      ratio = ((double) (ind1 + 12)) / ((double) (ind2 + 12));
-      adj = ratio * (2.0 - ratio);    /* adjustment factor; inverse parabola as a function of ratio */
-      corr = adj * (corrvec1[ind1] + corrvec2[ind2]);
-      CorrSurfPtr1[k] = corr;
-      if (corr > corr_max) {
-        corr_max = corr;  /* update maximum */
-        max_ind = (int)(&CorrSurfPtr1[k] - &CorrSurf[0][0]);
-      }
-      corr = adj * (corrvec1[ind2++] + corrvec2[ind1++]);
-      CorrSurfPtr2[k] = corr;
-      if (corr > corr_max) {
-        corr_max = corr;  /* update maximum */
-        max_ind = (int)(&CorrSurfPtr2[k] - &CorrSurf[0][0]);
-      }
-    }
-  }
-
-  /* threshold value to qualify as a peak */
-  corr_max *= 0.6;
-
-  peaks_ind = 0;
-  /* find peaks */
-  for (m = 1; m < PITCH_BW+1; m++) {
-    if (peaks_ind == PITCH_MAX_NUM_PEAKS) break;
-    CorrSurfPtr1 = &CorrSurf[m][2];
-    for (k = 2; k < PITCH_LAG_SPAN2-PITCH_BW-2+m; k++) {
-      corr = CorrSurfPtr1[k];
-      if (corr > corr_max) {
-        if ( (corr > CorrSurfPtr1[k - (PITCH_LAG_SPAN2+5)]) && (corr > CorrSurfPtr1[k - (PITCH_LAG_SPAN2+4)]) ) {
-          if ( (corr > CorrSurfPtr1[k + (PITCH_LAG_SPAN2+4)]) && (corr > CorrSurfPtr1[k + (PITCH_LAG_SPAN2+5)]) ) {
-            /* found a peak; store index into matrix */
-            peaks[peaks_ind++] = (int)(&CorrSurfPtr1[k] - &CorrSurf[0][0]);
-            if (peaks_ind == PITCH_MAX_NUM_PEAKS) break;
-          }
-        }
-      }
-    }
-  }
-  for (m = PITCH_BW+1; m < 2*PITCH_BW; m++) {
-    if (peaks_ind == PITCH_MAX_NUM_PEAKS) break;
-    CorrSurfPtr1 = &CorrSurf[m][2];
-    for (k = 2+m-PITCH_BW; k < PITCH_LAG_SPAN2-2; k++) {
-      corr = CorrSurfPtr1[k];
-      if (corr > corr_max) {
-        if ( (corr > CorrSurfPtr1[k - (PITCH_LAG_SPAN2+5)]) && (corr > CorrSurfPtr1[k - (PITCH_LAG_SPAN2+4)]) ) {
-          if ( (corr > CorrSurfPtr1[k + (PITCH_LAG_SPAN2+4)]) && (corr > CorrSurfPtr1[k + (PITCH_LAG_SPAN2+5)]) ) {
-            /* found a peak; store index into matrix */
-            peaks[peaks_ind++] = (int)(&CorrSurfPtr1[k] - &CorrSurf[0][0]);
-            if (peaks_ind == PITCH_MAX_NUM_PEAKS) break;
-          }
-        }
-      }
-    }
-  }
-
-  if (peaks_ind > 0) {
-    /* examine each peak */
-    CorrSurfPtr1 = &CorrSurf[0][0];
-    for (k = 0; k < peaks_ind; k++) {
-      peak = peaks[k];
-
-      /* compute four interpolated values around current peak */
-      IntrepolFilter(&CorrSurfPtr1[peak - (PITCH_LAG_SPAN2+5)], &intrp_a);
-      IntrepolFilter(&CorrSurfPtr1[peak - 1            ], &intrp_b);
-      IntrepolFilter(&CorrSurfPtr1[peak                ], &intrp_c);
-      IntrepolFilter(&CorrSurfPtr1[peak + (PITCH_LAG_SPAN2+4)], &intrp_d);
-
-      /* determine maximum of the interpolated values */
-      corr = CorrSurfPtr1[peak];
-      corr_max = intrp_a;
-      if (intrp_b > corr_max) corr_max = intrp_b;
-      if (intrp_c > corr_max) corr_max = intrp_c;
-      if (intrp_d > corr_max) corr_max = intrp_d;
-
-      /* determine where the peak sits and fill a 3x3 matrix around it */
-      row = peak / (PITCH_LAG_SPAN2+4);
-      lags1[k] = (double) ((peak - row * (PITCH_LAG_SPAN2+4)) + PITCH_MIN_LAG/2 - 4);
-      lags2[k] = (double) (lags1[k] + PITCH_BW - row);
-      if ( corr > corr_max ) {
-        T[0][0] = CorrSurfPtr1[peak - (PITCH_LAG_SPAN2+5)];
-        T[2][0] = CorrSurfPtr1[peak - (PITCH_LAG_SPAN2+4)];
-        T[1][1] = corr;
-        T[0][2] = CorrSurfPtr1[peak + (PITCH_LAG_SPAN2+4)];
-        T[2][2] = CorrSurfPtr1[peak + (PITCH_LAG_SPAN2+5)];
-        T[1][0] = intrp_a;
-        T[0][1] = intrp_b;
-        T[2][1] = intrp_c;
-        T[1][2] = intrp_d;
-      } else {
-        if (intrp_a == corr_max) {
-          lags1[k] -= 0.5;
-          lags2[k] += 0.5;
-          IntrepolFilter(&CorrSurfPtr1[peak - 2*(PITCH_LAG_SPAN2+5)], &T[0][0]);
-          IntrepolFilter(&CorrSurfPtr1[peak - (2*PITCH_LAG_SPAN2+9)], &T[2][0]);
-          T[1][1] = intrp_a;
-          T[0][2] = intrp_b;
-          T[2][2] = intrp_c;
-          T[1][0] = CorrSurfPtr1[peak - (2*PITCH_LAG_SPAN2+9)];
-          T[0][1] = CorrSurfPtr1[peak - (PITCH_LAG_SPAN2+5)];
-          T[2][1] = CorrSurfPtr1[peak - (PITCH_LAG_SPAN2+4)];
-          T[1][2] = corr;
-        } else if (intrp_b == corr_max) {
-          lags1[k] -= 0.5;
-          lags2[k] -= 0.5;
-          IntrepolFilter(&CorrSurfPtr1[peak - (PITCH_LAG_SPAN2+6)], &T[0][0]);
-          T[2][0] = intrp_a;
-          T[1][1] = intrp_b;
-          IntrepolFilter(&CorrSurfPtr1[peak + (PITCH_LAG_SPAN2+3)], &T[0][2]);
-          T[2][2] = intrp_d;
-          T[1][0] = CorrSurfPtr1[peak - (PITCH_LAG_SPAN2+5)];
-          T[0][1] = CorrSurfPtr1[peak - 1];
-          T[2][1] = corr;
-          T[1][2] = CorrSurfPtr1[peak + (PITCH_LAG_SPAN2+4)];
-        } else if (intrp_c == corr_max) {
-          lags1[k] += 0.5;
-          lags2[k] += 0.5;
-          T[0][0] = intrp_a;
-          IntrepolFilter(&CorrSurfPtr1[peak - (PITCH_LAG_SPAN2+4)], &T[2][0]);
-          T[1][1] = intrp_c;
-          T[0][2] = intrp_d;
-          IntrepolFilter(&CorrSurfPtr1[peak + (PITCH_LAG_SPAN2+5)], &T[2][2]);
-          T[1][0] = CorrSurfPtr1[peak - (PITCH_LAG_SPAN2+4)];
-          T[0][1] = corr;
-          T[2][1] = CorrSurfPtr1[peak + 1];
-          T[1][2] = CorrSurfPtr1[peak + (PITCH_LAG_SPAN2+5)];
-        } else {
-          lags1[k] += 0.5;
-          lags2[k] -= 0.5;
-          T[0][0] = intrp_b;
-          T[2][0] = intrp_c;
-          T[1][1] = intrp_d;
-          IntrepolFilter(&CorrSurfPtr1[peak + 2*(PITCH_LAG_SPAN2+4)], &T[0][2]);
-          IntrepolFilter(&CorrSurfPtr1[peak + (2*PITCH_LAG_SPAN2+9)], &T[2][2]);
-          T[1][0] = corr;
-          T[0][1] = CorrSurfPtr1[peak + (PITCH_LAG_SPAN2+4)];
-          T[2][1] = CorrSurfPtr1[peak + (PITCH_LAG_SPAN2+5)];
-          T[1][2] = CorrSurfPtr1[peak + (2*PITCH_LAG_SPAN2+9)];
-        }
-      }
-
-      /* 2D parabolic interpolation gives more accurate lags and peak value */
-      Intrpol2D(T, &lags1[k], &lags2[k], &peak_vals[k]);
-    }
-
-    /* determine the highest peak, after applying a bias towards short lags */
-    corr_max = 0.0;
-    for (k = 0; k < peaks_ind; k++) {
-      corr = peak_vals[k] * pow(PITCH_PEAK_DECAY, log(lags1[k] + lags2[k]));
-      if (corr > corr_max) {
-        corr_max = corr;
-        peak = k;
-      }
-    }
-
-    lags1[peak] *= 2.0;
-    lags2[peak] *= 2.0;
-
-    if (lags1[peak] < (double) PITCH_MIN_LAG) lags1[peak] = (double) PITCH_MIN_LAG;
-    if (lags2[peak] < (double) PITCH_MIN_LAG) lags2[peak] = (double) PITCH_MIN_LAG;
-    if (lags1[peak] > (double) PITCH_MAX_LAG) lags1[peak] = (double) PITCH_MAX_LAG;
-    if (lags2[peak] > (double) PITCH_MAX_LAG) lags2[peak] = (double) PITCH_MAX_LAG;
-
-    /* store lags of highest peak in output array */
-    lags[0] = lags1[peak];
-    lags[1] = lags1[peak];
-    lags[2] = lags2[peak];
-    lags[3] = lags2[peak];
-  }
-  else
-  {
-    row = max_ind / (PITCH_LAG_SPAN2+4);
-    lags1[0] = (double) ((max_ind - row * (PITCH_LAG_SPAN2+4)) + PITCH_MIN_LAG/2 - 4);
-    lags2[0] = (double) (lags1[0] + PITCH_BW - row);
-
-    if (lags1[0] < (double) PITCH_MIN_LAG) lags1[0] = (double) PITCH_MIN_LAG;
-    if (lags2[0] < (double) PITCH_MIN_LAG) lags2[0] = (double) PITCH_MIN_LAG;
-    if (lags1[0] > (double) PITCH_MAX_LAG) lags1[0] = (double) PITCH_MAX_LAG;
-    if (lags2[0] > (double) PITCH_MAX_LAG) lags2[0] = (double) PITCH_MAX_LAG;
-
-    /* store lags of highest peak in output array */
-    lags[0] = lags1[0];
-    lags[1] = lags1[0];
-    lags[2] = lags2[0];
-    lags[3] = lags2[0];
-  }
-}
-
-
-
-/* create weighting matrix by orthogonalizing a basis of polynomials of increasing order
- * t = (0:4)';
- * A = [t.^0, t.^1, t.^2, t.^3, t.^4];
- * [Q, dummy] = qr(A);
- * P.Weight = Q * diag([0, .1, .5, 1, 1]) * Q'; */
-static const double kWeight[5][5] = {
-  { 0.29714285714286,  -0.30857142857143,  -0.05714285714286,   0.05142857142857,  0.01714285714286},
-  {-0.30857142857143,   0.67428571428571,  -0.27142857142857,  -0.14571428571429,  0.05142857142857},
-  {-0.05714285714286,  -0.27142857142857,   0.65714285714286,  -0.27142857142857, -0.05714285714286},
-  { 0.05142857142857,  -0.14571428571429,  -0.27142857142857,   0.67428571428571, -0.30857142857143},
-  { 0.01714285714286,   0.05142857142857,  -0.05714285714286,  -0.30857142857143,  0.29714285714286}
-};
-
-
-void WebRtcIsac_PitchAnalysis(const double *in,               /* PITCH_FRAME_LEN samples */
-                              double *out,                    /* PITCH_FRAME_LEN+QLOOKAHEAD samples */
-                              PitchAnalysisStruct *State,
-                              double *lags,
-                              double *gains)
-{
-  double HPin[PITCH_FRAME_LEN];
-  double Weighted[PITCH_FRAME_LEN];
-  double Whitened[PITCH_FRAME_LEN + QLOOKAHEAD];
-  double inbuf[PITCH_FRAME_LEN + QLOOKAHEAD];
-  double out_G[PITCH_FRAME_LEN + QLOOKAHEAD];          // could be removed by using out instead
-  double out_dG[4][PITCH_FRAME_LEN + QLOOKAHEAD];
-  double old_lag, old_gain;
-  double nrg_wht, tmp;
-  double Wnrg, Wfluct, Wgain;
-  double H[4][4];
-  double grad[4];
-  double dG[4];
-  int k, m, n, iter;
-
-  /* high pass filtering using second order pole-zero filter */
-  WebRtcIsac_Highpass(in, HPin, State->hp_state, PITCH_FRAME_LEN);
-
-  /* copy from state into buffer */
-  memcpy(Whitened, State->whitened_buf, sizeof(double) * QLOOKAHEAD);
-
-  /* compute weighted and whitened signals */
-  WebRtcIsac_WeightingFilter(HPin, &Weighted[0], &Whitened[QLOOKAHEAD], &(State->Wghtstr));
-
-  /* copy from buffer into state */
-  memcpy(State->whitened_buf, Whitened+PITCH_FRAME_LEN, sizeof(double) * QLOOKAHEAD);
-
-  old_lag = State->PFstr_wght.oldlagp[0];
-  old_gain = State->PFstr_wght.oldgainp[0];
-
-  /* inital pitch estimate */
-  WebRtcIsac_InitializePitch(Weighted, old_lag, old_gain, State, lags);
-
-
-  /* Iterative optimization of lags - to be done */
-
-  /* compute energy of whitened signal */
-  nrg_wht = 0.0;
-  for (k = 0; k < PITCH_FRAME_LEN + QLOOKAHEAD; k++)
-    nrg_wht += Whitened[k] * Whitened[k];
-
-
-  /* Iterative optimization of gains */
-
-  /* set weights for energy, gain fluctiation, and spectral gain penalty functions */
-  Wnrg = 1.0 / nrg_wht;
-  Wgain = 0.005;
-  Wfluct = 3.0;
-
-  /* set initial gains */
-  for (k = 0; k < 4; k++)
-    gains[k] = PITCH_MAX_GAIN_06;
-
-  /* two iterations should be enough */
-  for (iter = 0; iter < 2; iter++) {
-    /* compute Jacobian of pre-filter output towards gains */
-    WebRtcIsac_PitchfilterPre_gains(Whitened, out_G, out_dG, &(State->PFstr_wght), lags, gains);
-
-    /* gradient and approximate Hessian (lower triangle) for minimizing the filter's output power */
-    for (k = 0; k < 4; k++) {
-      tmp = 0.0;
-      for (n = 0; n < PITCH_FRAME_LEN + QLOOKAHEAD; n++)
-        tmp += out_G[n] * out_dG[k][n];
-      grad[k] = tmp * Wnrg;
-    }
-    for (k = 0; k < 4; k++) {
-      for (m = 0; m <= k; m++) {
-        tmp = 0.0;
-        for (n = 0; n < PITCH_FRAME_LEN + QLOOKAHEAD; n++)
-          tmp += out_dG[m][n] * out_dG[k][n];
-        H[k][m] = tmp * Wnrg;
-      }
-    }
-
-    /* add gradient and Hessian (lower triangle) for dampening fast gain changes */
-    for (k = 0; k < 4; k++) {
-      tmp = kWeight[k+1][0] * old_gain;
-      for (m = 0; m < 4; m++)
-        tmp += kWeight[k+1][m+1] * gains[m];
-      grad[k] += tmp * Wfluct;
-    }
-    for (k = 0; k < 4; k++) {
-      for (m = 0; m <= k; m++) {
-        H[k][m] += kWeight[k+1][m+1] * Wfluct;
-      }
-    }
-
-    /* add gradient and Hessian for dampening gain */
-    for (k = 0; k < 3; k++) {
-      tmp = 1.0 / (1 - gains[k]);
-      grad[k] += tmp * tmp * Wgain;
-      H[k][k] += 2.0 * tmp * (tmp * tmp * Wgain);
-    }
-    tmp = 1.0 / (1 - gains[3]);
-    grad[3] += 1.33 * (tmp * tmp * Wgain);
-    H[3][3] += 2.66 * tmp * (tmp * tmp * Wgain);
-
-
-    /* compute Cholesky factorization of Hessian
-     * by overwritting the upper triangle; scale factors on diagonal
-     * (for non pc-platforms store the inverse of the diagonals seperately to minimize divisions) */
-    H[0][1] = H[1][0] / H[0][0];
-    H[0][2] = H[2][0] / H[0][0];
-    H[0][3] = H[3][0] / H[0][0];
-    H[1][1] -= H[0][0] * H[0][1] * H[0][1];
-    H[1][2] = (H[2][1] - H[0][1] * H[2][0]) / H[1][1];
-    H[1][3] = (H[3][1] - H[0][1] * H[3][0]) / H[1][1];
-    H[2][2] -= H[0][0] * H[0][2] * H[0][2] + H[1][1] * H[1][2] * H[1][2];
-    H[2][3] = (H[3][2] - H[0][2] * H[3][0] - H[1][2] * H[1][1] * H[1][3]) / H[2][2];
-    H[3][3] -= H[0][0] * H[0][3] * H[0][3] + H[1][1] * H[1][3] * H[1][3] + H[2][2] * H[2][3] * H[2][3];
-
-    /* Compute update as  delta_gains = -inv(H) * grad */
-    /* copy and negate */
-    for (k = 0; k < 4; k++)
-      dG[k] = -grad[k];
-    /* back substitution */
-    dG[1] -= dG[0] * H[0][1];
-    dG[2] -= dG[0] * H[0][2] + dG[1] * H[1][2];
-    dG[3] -= dG[0] * H[0][3] + dG[1] * H[1][3] + dG[2] * H[2][3];
-    /* scale */
-    for (k = 0; k < 4; k++)
-      dG[k] /= H[k][k];
-    /* back substitution */
-    dG[2] -= dG[3] * H[2][3];
-    dG[1] -= dG[3] * H[1][3] + dG[2] * H[1][2];
-    dG[0] -= dG[3] * H[0][3] + dG[2] * H[0][2] + dG[1] * H[0][1];
-
-    /* update gains and check range */
-    for (k = 0; k < 4; k++) {
-      gains[k] += dG[k];
-      if (gains[k] > PITCH_MAX_GAIN)
-        gains[k] = PITCH_MAX_GAIN;
-      else if (gains[k] < 0.0)
-        gains[k] = 0.0;
-    }
-  }
-
-  /* update state for next frame */
-  WebRtcIsac_PitchfilterPre(Whitened, out, &(State->PFstr_wght), lags, gains);
-
-  /* concatenate previous input's end and current input */
-  memcpy(inbuf, State->inbuf, sizeof(double) * QLOOKAHEAD);
-  memcpy(inbuf+QLOOKAHEAD, in, sizeof(double) * PITCH_FRAME_LEN);
-
-  /* lookahead pitch filtering for masking analysis */
-  WebRtcIsac_PitchfilterPre_la(inbuf, out, &(State->PFstr), lags, gains);
-
-  /* store last part of input */
-  for (k = 0; k < QLOOKAHEAD; k++)
-    State->inbuf[k] = inbuf[k + PITCH_FRAME_LEN];
-}
diff --git a/modules/audio_coding/codecs/isac/main/source/pitch_estimator.h b/modules/audio_coding/codecs/isac/main/source/pitch_estimator.h
deleted file mode 100644
index 6fb02b3..0000000
--- a/modules/audio_coding/codecs/isac/main/source/pitch_estimator.h
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/*
- * pitch_estimator.h
- *
- * Pitch functions
- *
- */
-
-#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_MAIN_SOURCE_PITCH_ESTIMATOR_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_MAIN_SOURCE_PITCH_ESTIMATOR_H_
-
-#include "structs.h"
-
-
-
-void WebRtcIsac_PitchAnalysis(const double *in,               /* PITCH_FRAME_LEN samples */
-                              double *out,                    /* PITCH_FRAME_LEN+QLOOKAHEAD samples */
-                              PitchAnalysisStruct *State,
-                              double *lags,
-                              double *gains);
-
-void WebRtcIsac_InitializePitch(const double *in,
-                                const double old_lag,
-                                const double old_gain,
-                                PitchAnalysisStruct *State,
-                                double *lags);
-
-void WebRtcIsac_PitchfilterPre(double *indat,
-                               double *outdat,
-                               PitchFiltstr *pfp,
-                               double *lags,
-                               double *gains);
-
-void WebRtcIsac_PitchfilterPost(double *indat,
-                                double *outdat,
-                                PitchFiltstr *pfp,
-                                double *lags,
-                                double *gains);
-
-void WebRtcIsac_PitchfilterPre_la(double *indat,
-                                  double *outdat,
-                                  PitchFiltstr *pfp,
-                                  double *lags,
-                                  double *gains);
-
-void WebRtcIsac_PitchfilterPre_gains(double *indat,
-                                     double *outdat,
-                                     double out_dG[][PITCH_FRAME_LEN + QLOOKAHEAD],
-                                     PitchFiltstr *pfp,
-                                     double *lags,
-                                     double *gains);
-
-void WebRtcIsac_WeightingFilter(const double *in, double *weiout, double *whiout, WeightFiltstr *wfdata);
-
-void WebRtcIsac_Highpass(const double *in,
-                         double *out,
-                         double *state,
-                         size_t N);
-
-void WebRtcIsac_DecimateAllpass(const double *in,
-                                double *state_in,  /* array of size:
-                                                    *     2*ALLPASSSECTIONS+1 */
-                                size_t N,          /* number of input samples */
-                                double *out);      /* array of size N/2 */
-
-#endif /* WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_MAIN_SOURCE_PITCH_ESTIMATOR_H_ */
diff --git a/modules/audio_coding/codecs/isac/main/source/pitch_filter.c b/modules/audio_coding/codecs/isac/main/source/pitch_filter.c
deleted file mode 100644
index 3010fbc..0000000
--- a/modules/audio_coding/codecs/isac/main/source/pitch_filter.c
+++ /dev/null
@@ -1,390 +0,0 @@
-/*
- *  Copyright (c) 2012 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 "pitch_estimator.h"
-
-#include <math.h>
-#include <memory.h>
-#include <stdlib.h>
-
-#include "os_specific_inline.h"
-
-#include "webrtc/rtc_base/compile_assert_c.h"
-
-/*
- * We are implementing the following filters;
- *
- * Pre-filtering:
- *   y(z) = x(z) + damper(z) * gain * (x(z) + y(z)) * z ^ (-lag);
- *
- * Post-filtering:
- *   y(z) = x(z) - damper(z) * gain * (x(z) + y(z)) * z ^ (-lag);
- *
- * Note that |lag| is a floating number so we perform an interpolation to
- * obtain the correct |lag|.
- *
- */
-
-static const double kDampFilter[PITCH_DAMPORDER] = {-0.07, 0.25, 0.64, 0.25,
-    -0.07};
-
-/* interpolation coefficients; generated by design_pitch_filter.m */
-static const double kIntrpCoef[PITCH_FRACS][PITCH_FRACORDER] = {
-    {-0.02239172458614,  0.06653315052934, -0.16515880017569,  0.60701333734125,
-     0.64671399919202, -0.20249000396417,  0.09926548334755, -0.04765933793109,
-     0.01754159521746},
-    {-0.01985640750434,  0.05816126837866, -0.13991265473714,  0.44560418147643,
-     0.79117042386876, -0.20266133815188,  0.09585268418555, -0.04533310458084,
-     0.01654127246314},
-    {-0.01463300534216,  0.04229888475060, -0.09897034715253,  0.28284326017787,
-     0.90385267956632, -0.16976950138649,  0.07704272393639, -0.03584218578311,
-     0.01295781500709},
-    {-0.00764851320885,  0.02184035544377, -0.04985561057281,  0.13083306574393,
-     0.97545011664662, -0.10177807997561,  0.04400901776474, -0.02010737175166,
-     0.00719783432422},
-    {-0.00000000000000,  0.00000000000000, -0.00000000000001,  0.00000000000001,
-     0.99999999999999,  0.00000000000001, -0.00000000000001,  0.00000000000000,
-     -0.00000000000000},
-    {0.00719783432422, -0.02010737175166,  0.04400901776474, -0.10177807997562,
-     0.97545011664663,  0.13083306574393, -0.04985561057280,  0.02184035544377,
-     -0.00764851320885},
-    {0.01295781500710, -0.03584218578312,  0.07704272393640, -0.16976950138650,
-     0.90385267956634,  0.28284326017785, -0.09897034715252,  0.04229888475059,
-     -0.01463300534216},
-    {0.01654127246315, -0.04533310458085,  0.09585268418557, -0.20266133815190,
-     0.79117042386878,  0.44560418147640, -0.13991265473712,  0.05816126837865,
-     -0.01985640750433}
-};
-
-/*
- * Enumerating the operation of the filter.
- * iSAC has 4 different pitch-filter which are very similar in their structure.
- *
- * kPitchFilterPre     : In this mode the filter is operating as pitch
- *                       pre-filter. This is used at the encoder.
- * kPitchFilterPost    : In this mode the filter is operating as pitch
- *                       post-filter. This is the inverse of pre-filter and used
- *                       in the decoder.
- * kPitchFilterPreLa   : This is, in structure, similar to pre-filtering but
- *                       utilizing 3 millisecond lookahead. It is used to
- *                       obtain the signal for LPC analysis.
- * kPitchFilterPreGain : This is, in structure, similar to pre-filtering but
- *                       differential changes in gain is considered. This is
- *                       used to find the optimal gain.
- */
-typedef enum {
-  kPitchFilterPre, kPitchFilterPost, kPitchFilterPreLa, kPitchFilterPreGain
-} PitchFilterOperation;
-
-/*
- * Structure with parameters used for pitch-filtering.
- * buffer           : a buffer where the sum of previous inputs and outputs
- *                    are stored.
- * damper_state     : the state of the damping filter. The filter is defined by
- *                    |kDampFilter|.
- * interpol_coeff   : pointer to a set of coefficient which are used to utilize
- *                    fractional pitch by interpolation.
- * gain             : pitch-gain to be applied to the current segment of input.
- * lag              : pitch-lag for the current segment of input.
- * lag_offset       : the offset of lag w.r.t. current sample.
- * sub_frame        : sub-frame index, there are 4 pitch sub-frames in an iSAC
- *                    frame.
- *                    This specifies the usage of the filter. See
- *                    'PitchFilterOperation' for operational modes.
- * num_samples      : number of samples to be processed in each segment.
- * index            : index of the input and output sample.
- * damper_state_dg  : state of damping filter for different trial gains.
- * gain_mult        : differential changes to gain.
- */
-typedef struct {
-  double buffer[PITCH_INTBUFFSIZE + QLOOKAHEAD];
-  double damper_state[PITCH_DAMPORDER];
-  const double *interpol_coeff;
-  double gain;
-  double lag;
-  int lag_offset;
-
-  int sub_frame;
-  PitchFilterOperation mode;
-  int num_samples;
-  int index;
-
-  double damper_state_dg[4][PITCH_DAMPORDER];
-  double gain_mult[4];
-} PitchFilterParam;
-
-/**********************************************************************
- * FilterSegment()
- * Filter one segment, a quarter of a frame.
- *
- * Inputs
- *   in_data      : pointer to the input signal of 30 ms at 8 kHz sample-rate.
- *   filter_param : pitch filter parameters.
- *
- * Outputs
- *   out_data     : pointer to a buffer where the filtered signal is written to.
- *   out_dg       : [only used in kPitchFilterPreGain] pointer to a buffer
- *                  where the output of different gain values (differential
- *                  change to gain) is written.
- */
-static void FilterSegment(const double* in_data, PitchFilterParam* parameters,
-                          double* out_data,
-                          double out_dg[][PITCH_FRAME_LEN + QLOOKAHEAD]) {
-  int n;
-  int m;
-  int j;
-  double sum;
-  double sum2;
-  /* Index of |parameters->buffer| where the output is written to. */
-  int pos = parameters->index + PITCH_BUFFSIZE;
-  /* Index of |parameters->buffer| where samples are read for fractional-lag
-   * computation. */
-  int pos_lag = pos - parameters->lag_offset;
-
-  for (n = 0; n < parameters->num_samples; ++n) {
-    /* Shift low pass filter states. */
-    for (m = PITCH_DAMPORDER - 1; m > 0; --m) {
-      parameters->damper_state[m] = parameters->damper_state[m - 1];
-    }
-    /* Filter to get fractional pitch. */
-    sum = 0.0;
-    for (m = 0; m < PITCH_FRACORDER; ++m) {
-      sum += parameters->buffer[pos_lag + m] * parameters->interpol_coeff[m];
-    }
-    /* Multiply with gain. */
-    parameters->damper_state[0] = parameters->gain * sum;
-
-    if (parameters->mode == kPitchFilterPreGain) {
-      int lag_index = parameters->index - parameters->lag_offset;
-      int m_tmp = (lag_index < 0) ? -lag_index : 0;
-      /* Update the damper state for the new sample. */
-      for (m = PITCH_DAMPORDER - 1; m > 0; --m) {
-        for (j = 0; j < 4; ++j) {
-          parameters->damper_state_dg[j][m] =
-              parameters->damper_state_dg[j][m - 1];
-        }
-      }
-
-      for (j = 0; j < parameters->sub_frame + 1; ++j) {
-        /* Filter for fractional pitch. */
-        sum2 = 0.0;
-        for (m = PITCH_FRACORDER-1; m >= m_tmp; --m) {
-          /* |lag_index + m| is always larger than or equal to zero, see how
-           * m_tmp is computed. This is equivalent to assume samples outside
-           * |out_dg[j]| are zero. */
-          sum2 += out_dg[j][lag_index + m] * parameters->interpol_coeff[m];
-        }
-        /* Add the contribution of differential gain change. */
-        parameters->damper_state_dg[j][0] = parameters->gain_mult[j] * sum +
-            parameters->gain * sum2;
-      }
-
-      /* Filter with damping filter, and store the results. */
-      for (j = 0; j < parameters->sub_frame + 1; ++j) {
-        sum = 0.0;
-        for (m = 0; m < PITCH_DAMPORDER; ++m) {
-          sum -= parameters->damper_state_dg[j][m] * kDampFilter[m];
-        }
-        out_dg[j][parameters->index] = sum;
-      }
-    }
-    /* Filter with damping filter. */
-    sum = 0.0;
-    for (m = 0; m < PITCH_DAMPORDER; ++m) {
-      sum += parameters->damper_state[m] * kDampFilter[m];
-    }
-
-    /* Subtract from input and update buffer. */
-    out_data[parameters->index] = in_data[parameters->index] - sum;
-    parameters->buffer[pos] = in_data[parameters->index] +
-        out_data[parameters->index];
-
-    ++parameters->index;
-    ++pos;
-    ++pos_lag;
-  }
-  return;
-}
-
-/* Update filter parameters based on the pitch-gains and pitch-lags. */
-static void Update(PitchFilterParam* parameters) {
-  double fraction;
-  int fraction_index;
-  /* Compute integer lag-offset. */
-  parameters->lag_offset = WebRtcIsac_lrint(parameters->lag + PITCH_FILTDELAY +
-                                            0.5);
-  /* Find correct set of coefficients for computing fractional pitch. */
-  fraction = parameters->lag_offset - (parameters->lag + PITCH_FILTDELAY);
-  fraction_index = WebRtcIsac_lrint(PITCH_FRACS * fraction - 0.5);
-  parameters->interpol_coeff = kIntrpCoef[fraction_index];
-
-  if (parameters->mode == kPitchFilterPreGain) {
-    /* If in this mode make a differential change to pitch gain. */
-    parameters->gain_mult[parameters->sub_frame] += 0.2;
-    if (parameters->gain_mult[parameters->sub_frame] > 1.0) {
-      parameters->gain_mult[parameters->sub_frame] = 1.0;
-    }
-    if (parameters->sub_frame > 0) {
-      parameters->gain_mult[parameters->sub_frame - 1] -= 0.2;
-    }
-  }
-}
-
-/******************************************************************************
- * FilterFrame()
- * Filter a frame of 30 millisecond, given pitch-lags and pitch-gains.
- *
- * Inputs
- *   in_data     : pointer to the input signal of 30 ms at 8 kHz sample-rate.
- *   lags        : pointer to pitch-lags, 4 lags per frame.
- *   gains       : pointer to pitch-gians, 4 gains per frame.
- *   mode        : defining the functionality of the filter. It takes the
- *                 following values.
- *                 kPitchFilterPre:     Pitch pre-filter, used at encoder.
- *                 kPitchFilterPost:    Pitch post-filter, used at decoder.
- *                 kPitchFilterPreLa:   Pitch pre-filter with lookahead.
- *                 kPitchFilterPreGain: Pitch pre-filter used to otain optimal
- *                                      pitch-gains.
- *
- * Outputs
- *   out_data    : pointer to a buffer where the filtered signal is written to.
- *   out_dg      : [only used in kPitchFilterPreGain] pointer to a buffer
- *                 where the output of different gain values (differential
- *                 change to gain) is written.
- */
-static void FilterFrame(const double* in_data, PitchFiltstr* filter_state,
-                        double* lags, double* gains, PitchFilterOperation mode,
-                        double* out_data,
-                        double out_dg[][PITCH_FRAME_LEN + QLOOKAHEAD]) {
-  PitchFilterParam filter_parameters;
-  double gain_delta, lag_delta;
-  double old_lag, old_gain;
-  int n;
-  int m;
-  const double kEnhancer = 1.3;
-
-  /* Set up buffer and states. */
-  filter_parameters.index = 0;
-  filter_parameters.lag_offset = 0;
-  filter_parameters.mode = mode;
-  /* Copy states to local variables. */
-  memcpy(filter_parameters.buffer, filter_state->ubuf,
-         sizeof(filter_state->ubuf));
-  RTC_COMPILE_ASSERT(sizeof(filter_parameters.buffer) >=
-                 sizeof(filter_state->ubuf));
-  memset(filter_parameters.buffer +
-             sizeof(filter_state->ubuf) / sizeof(filter_state->ubuf[0]),
-         0, sizeof(filter_parameters.buffer) - sizeof(filter_state->ubuf));
-  memcpy(filter_parameters.damper_state, filter_state->ystate,
-         sizeof(filter_state->ystate));
-
-  if (mode == kPitchFilterPreGain) {
-    /* Clear buffers. */
-    memset(filter_parameters.gain_mult, 0, sizeof(filter_parameters.gain_mult));
-    memset(filter_parameters.damper_state_dg, 0,
-           sizeof(filter_parameters.damper_state_dg));
-    for (n = 0; n < PITCH_SUBFRAMES; ++n) {
-      //memset(out_dg[n], 0, sizeof(double) * (PITCH_FRAME_LEN + QLOOKAHEAD));
-      memset(out_dg[n], 0, sizeof(out_dg[n]));
-    }
-  } else if (mode == kPitchFilterPost) {
-    /* Make output more periodic. Negative sign is to change the structure
-     * of the filter. */
-    for (n = 0; n < PITCH_SUBFRAMES; ++n) {
-      gains[n] *= -kEnhancer;
-    }
-  }
-
-  old_lag = *filter_state->oldlagp;
-  old_gain = *filter_state->oldgainp;
-
-  /* No interpolation if pitch lag step is big. */
-  if ((lags[0] > (PITCH_UPSTEP * old_lag)) ||
-      (lags[0] < (PITCH_DOWNSTEP * old_lag))) {
-    old_lag = lags[0];
-    old_gain = gains[0];
-
-    if (mode == kPitchFilterPreGain) {
-      filter_parameters.gain_mult[0] = 1.0;
-    }
-  }
-
-  filter_parameters.num_samples = PITCH_UPDATE;
-  for (m = 0; m < PITCH_SUBFRAMES; ++m) {
-    /* Set the sub-frame value. */
-    filter_parameters.sub_frame = m;
-    /* Calculate interpolation steps for pitch-lag and pitch-gain. */
-    lag_delta = (lags[m] - old_lag) / PITCH_GRAN_PER_SUBFRAME;
-    filter_parameters.lag = old_lag;
-    gain_delta = (gains[m] - old_gain) / PITCH_GRAN_PER_SUBFRAME;
-    filter_parameters.gain = old_gain;
-    /* Store for the next sub-frame. */
-    old_lag = lags[m];
-    old_gain = gains[m];
-
-    for (n = 0; n < PITCH_GRAN_PER_SUBFRAME; ++n) {
-      /* Step-wise interpolation of pitch gains and lags. As pitch-lag changes,
-       * some parameters of filter need to be update. */
-      filter_parameters.gain += gain_delta;
-      filter_parameters.lag += lag_delta;
-      /* Update parameters according to new lag value. */
-      Update(&filter_parameters);
-      /* Filter a segment of input. */
-      FilterSegment(in_data, &filter_parameters, out_data, out_dg);
-    }
-  }
-
-  if (mode != kPitchFilterPreGain) {
-    /* Export buffer and states. */
-    memcpy(filter_state->ubuf, &filter_parameters.buffer[PITCH_FRAME_LEN],
-           sizeof(filter_state->ubuf));
-    memcpy(filter_state->ystate, filter_parameters.damper_state,
-           sizeof(filter_state->ystate));
-
-    /* Store for the next frame. */
-    *filter_state->oldlagp = old_lag;
-    *filter_state->oldgainp = old_gain;
-  }
-
-  if ((mode == kPitchFilterPreGain) || (mode == kPitchFilterPreLa)) {
-    /* Filter the lookahead segment, this is treated as the last sub-frame. So
-     * set |pf_param| to last sub-frame. */
-    filter_parameters.sub_frame = PITCH_SUBFRAMES - 1;
-    filter_parameters.num_samples = QLOOKAHEAD;
-    FilterSegment(in_data, &filter_parameters, out_data, out_dg);
-  }
-}
-
-void WebRtcIsac_PitchfilterPre(double* in_data, double* out_data,
-                               PitchFiltstr* pf_state, double* lags,
-                               double* gains) {
-  FilterFrame(in_data, pf_state, lags, gains, kPitchFilterPre, out_data, NULL);
-}
-
-void WebRtcIsac_PitchfilterPre_la(double* in_data, double* out_data,
-                                  PitchFiltstr* pf_state, double* lags,
-                                  double* gains) {
-  FilterFrame(in_data, pf_state, lags, gains, kPitchFilterPreLa, out_data,
-              NULL);
-}
-
-void WebRtcIsac_PitchfilterPre_gains(
-    double* in_data, double* out_data,
-    double out_dg[][PITCH_FRAME_LEN + QLOOKAHEAD], PitchFiltstr *pf_state,
-    double* lags, double* gains) {
-  FilterFrame(in_data, pf_state, lags, gains, kPitchFilterPreGain, out_data,
-              out_dg);
-}
-
-void WebRtcIsac_PitchfilterPost(double* in_data, double* out_data,
-                                PitchFiltstr* pf_state, double* lags,
-                                double* gains) {
-  FilterFrame(in_data, pf_state, lags, gains, kPitchFilterPost, out_data, NULL);
-}
diff --git a/modules/audio_coding/codecs/isac/main/source/pitch_gain_tables.c b/modules/audio_coding/codecs/isac/main/source/pitch_gain_tables.c
deleted file mode 100644
index 947d3e7..0000000
--- a/modules/audio_coding/codecs/isac/main/source/pitch_gain_tables.c
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- *  Copyright (c) 2011 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 "pitch_gain_tables.h"
-
-#include "settings.h"
-
-/* header file for coding tables for the pitch filter side-info in the entropy coder */
-/********************* Pitch Filter Gain Coefficient Tables ************************/
-/* cdf for quantized pitch filter gains */
-const uint16_t WebRtcIsac_kQPitchGainCdf[255] = {
-  0,  2,  4,  6,  64,  901,  903,  905,  16954,  16956,
-  16961,  17360,  17362,  17364,  17366,  17368,  17370,  17372,  17374,  17411,
-  17514,  17516,  17583,  18790,  18796,  18802,  20760,  20777,  20782,  21722,
-  21724,  21728,  21738,  21740,  21742,  21744,  21746,  21748,  22224,  22227,
-  22230,  23214,  23229,  23239,  25086,  25108,  25120,  26088,  26094,  26098,
-  26175,  26177,  26179,  26181,  26183,  26185,  26484,  26507,  26522,  27705,
-  27731,  27750,  29767,  29799,  29817,  30866,  30883,  30885,  31025,  31029,
-  31031,  31033,  31035,  31037,  31114,  31126,  31134,  32687,  32722,  32767,
-  35718,  35742,  35757,  36943,  36952,  36954,  37115,  37128,  37130,  37132,
-  37134,  37136,  37143,  37145,  37152,  38843,  38863,  38897,  47458,  47467,
-  47474,  49040,  49061,  49063,  49145,  49157,  49159,  49161,  49163,  49165,
-  49167,  49169,  49171,  49757,  49770,  49782,  61333,  61344,  61346,  62860,
-  62883,  62885,  62887,  62889,  62891,  62893,  62895,  62897,  62899,  62901,
-  62903,  62905,  62907,  62909,  65496,  65498,  65500,  65521,  65523,  65525,
-  65527,  65529,  65531,  65533,  65535,  65535,  65535,  65535,  65535,  65535,
-  65535,  65535,  65535,  65535,  65535,  65535,  65535,  65535,  65535,  65535,
-  65535,  65535,  65535,  65535,  65535,  65535,  65535,  65535,  65535,  65535,
-  65535,  65535,  65535,  65535,  65535,  65535,  65535,  65535,  65535,  65535,
-  65535,  65535,  65535,  65535,  65535,  65535,  65535,  65535,  65535,  65535,
-  65535,  65535,  65535,  65535,  65535,  65535,  65535,  65535,  65535,  65535,
-  65535,  65535,  65535,  65535,  65535,  65535,  65535,  65535,  65535,  65535,
-  65535,  65535,  65535,  65535,  65535,  65535,  65535,  65535,  65535,  65535,
-  65535,  65535,  65535,  65535,  65535,  65535,  65535,  65535,  65535,  65535,
-  65535,  65535,  65535,  65535,  65535,  65535,  65535,  65535,  65535,  65535,
-  65535,  65535,  65535,  65535,  65535,  65535,  65535,  65535,  65535,  65535,
-  65535,  65535,  65535,  65535,  65535};
-
-/* index limits and ranges */
-const int16_t WebRtcIsac_kIndexLowerLimitGain[3] = {
-  -7, -2, -1};
-
-const int16_t WebRtcIsac_kIndexUpperLimitGain[3] = {
-  0,  3,  1};
-
-const uint16_t WebRtcIsac_kIndexMultsGain[2] = {
-  18,  3};
-
-/* size of cdf table */
-const uint16_t WebRtcIsac_kQCdfTableSizeGain[1] = {
-  256};
-
-///////////////////////////FIXED POINT
-/* mean values of pitch filter gains in FIXED point */
-const int16_t WebRtcIsac_kQMeanGain1Q12[144] = {
-   843,    1092,    1336,    1222,    1405,    1656,    1500,    1815,    1843,    1838,    1839,    1843,    1843,    1843,    1843,    1843,
-  1843,    1843,     814,     846,    1092,    1013,    1174,    1383,    1391,    1511,    1584,    1734,    1753,    1843,    1843,    1843,
-  1843,    1843,    1843,    1843,     524,     689,     777,     845,     947,    1069,    1090,    1263,    1380,    1447,    1559,    1676,
-  1645,    1749,    1843,    1843,    1843,    1843,      81,     477,     563,     611,     706,     806,     849,    1012,    1192,    1128,
-  1330,    1489,    1425,    1576,    1826,    1741,    1843,    1843,       0,     290,     305,     356,     488,     575,     602,     741,
-   890,     835,    1079,    1196,    1182,    1376,    1519,    1506,    1680,    1843,       0,      47,      97,      69,     289,     381,
-   385,     474,     617,     664,     803,    1079,     935,    1160,    1269,    1265,    1506,    1741,       0,       0,       0,       0,
-   112,     120,     190,     283,     442,     343,     526,     809,     684,     935,    1134,    1020,    1265,    1506,       0,       0,
-     0,       0,       0,       0,       0,     111,     256,      87,     373,     597,     430,     684,     935,     770,    1020,    1265};
-
-const int16_t WebRtcIsac_kQMeanGain2Q12[144] = {
-  1760,    1525,    1285,    1747,    1671,    1393,    1843,    1826,    1555,    1843,    1784,    1606,    1843,    1843,    1711,    1843,
-  1843,    1814,    1389,    1275,    1040,    1564,    1414,    1252,    1610,    1495,    1343,    1753,    1592,    1405,    1804,    1720,
-  1475,    1843,    1814,    1581,    1208,    1061,    856,    1349,    1148,    994,    1390,    1253,    1111,    1495,    1343,    1178,
-  1770,    1465,    1234,    1814,    1581,    1342,    1040,    793,    713,    1053,    895,    737,    1128,    1003,    861,    1277,
-  1094,    981,    1475,    1192,    1019,    1581,    1342,    1098,    855,    570,    483,    833,    648,    540,    948,    744,
-  572,    1009,    844,    636,    1234,    934,    685,    1342,    1217,    984,    537,    318,    124,    603,    423,    350,
-  687,    479,    322,    791,    581,    430,    987,    671,    488,    1098,    849,    597,    283,    27,        0,    397,
-  222,    38,        513,    271,    124,    624,    325,    157,    737,    484,    233,    849,    597,    343,    27,        0,
-  0,    141,    0,    0,    256,    69,        0,    370,    87,        0,    484,    229,    0,    597,    343,    87};
-
-const int16_t WebRtcIsac_kQMeanGain3Q12[144] = {
-  1843,    1843,    1711,    1843,    1818,    1606,    1843,    1827,    1511,    1814,    1639,    1393,    1760,    1525,    1285,    1656,
-  1419,    1176,    1835,    1718,    1475,    1841,    1650,    1387,    1648,    1498,    1287,    1600,    1411,    1176,    1522,    1299,
-  1040,    1419,    1176,    928,    1773,    1461,    1128,    1532,    1355,    1202,    1429,    1260,    1115,    1398,    1151,    1025,
-  1172,    1080,    790,    1176,    928,    677,    1475,    1147,    1019,    1276,    1096,    922,    1214,    1010,    901,    1057,
-  893,    800,    1040,    796,    734,    928,    677,    424,    1137,    897,    753,    1120,    830,    710,    875,    751,
-  601,    795,    642,    583,    790,    544,    475,    677,    474,    140,    987,    750,    482,    697,    573,    450,
-  691,    487,    303,    661,    394,    332,    537,    303,    220,    424,    168,    0,    737,    484,    229,    624,
-  348,    153,    441,    261,    136,    397,    166,    51,        283,    27,        0,    168,    0,    0,    484,    229,
-  0,    370,    57,        0,    256,    43,        0,    141,    0,        0,    27,        0,    0,    0,    0,    0};
-
-
-const int16_t WebRtcIsac_kQMeanGain4Q12[144] = {
-  1843,    1843,    1843,    1843,    1841,    1843,    1500,    1821,    1843,    1222,    1434,    1656,    843,    1092,    1336,    504,
-  757,    1007,    1843,    1843,    1843,    1838,    1791,    1843,    1265,    1505,    1599,    965,    1219,    1425,    730,    821,
-  1092,    249,    504,    757,    1783,    1819,    1843,    1351,    1567,    1727,    1096,    1268,    1409,    805,    961,    1131,
-  444,    670,    843,    0,        249,    504,    1425,    1655,    1743,    1096,    1324,    1448,    822,    1019,    1199,    490,
-  704,    867,    81,        450,    555,    0,    0,        249,    1247,    1428,    1530,    881,    1073,    1283,    610,    759,
-  939,    278,    464,    645,    0,    200,    270,    0,    0,    0,        935,    1163,    1410,    528,    790,    1068,
-  377,    499,    717,    173,    240,    274,    0,    43,        62,        0,    0,    0,    684,    935,    1182,    343,
-  551,    735,    161,    262,    423,    0,    55,        27,        0,    0,    0,    0,    0,    0,    430,    684,
-  935,    87,        377,    597,    0,    46,        256,    0,    0,    0,    0,    0,    0,    0,    0,    0};
diff --git a/modules/audio_coding/codecs/isac/main/source/pitch_gain_tables.h b/modules/audio_coding/codecs/isac/main/source/pitch_gain_tables.h
deleted file mode 100644
index 8d708ce..0000000
--- a/modules/audio_coding/codecs/isac/main/source/pitch_gain_tables.h
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/*
- * pitch_gain_tables.h
- *
- * This file contains tables for the pitch filter side-info in the entropy coder.
- *
- */
-
-#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_MAIN_SOURCE_PITCH_GAIN_TABLES_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_MAIN_SOURCE_PITCH_GAIN_TABLES_H_
-
-#include "webrtc/typedefs.h"
-
-/* header file for coding tables for the pitch filter side-info in the entropy coder */
-/********************* Pitch Filter Gain Coefficient Tables ************************/
-/* cdf for quantized pitch filter gains */
-extern const uint16_t WebRtcIsac_kQPitchGainCdf[255];
-
-/* index limits and ranges */
-extern const int16_t WebRtcIsac_kIndexLowerLimitGain[3];
-
-extern const int16_t WebRtcIsac_kIndexUpperLimitGain[3];
-extern const uint16_t WebRtcIsac_kIndexMultsGain[2];
-
-/* mean values of pitch filter gains */
-//(Y)
-extern const int16_t WebRtcIsac_kQMeanGain1Q12[144];
-extern const int16_t WebRtcIsac_kQMeanGain2Q12[144];
-extern const int16_t WebRtcIsac_kQMeanGain3Q12[144];
-extern const int16_t WebRtcIsac_kQMeanGain4Q12[144];
-//(Y)
-
-/* size of cdf table */
-extern const uint16_t WebRtcIsac_kQCdfTableSizeGain[1];
-
-#endif /* WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_MAIN_SOURCE_PITCH_GAIN_TABLES_H_ */
diff --git a/modules/audio_coding/codecs/isac/main/source/pitch_lag_tables.c b/modules/audio_coding/codecs/isac/main/source/pitch_lag_tables.c
deleted file mode 100644
index f845a22..0000000
--- a/modules/audio_coding/codecs/isac/main/source/pitch_lag_tables.c
+++ /dev/null
@@ -1,277 +0,0 @@
-/*
- *  Copyright (c) 2011 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 "pitch_lag_tables.h"
-#include "settings.h"
-
-/* header file for coding tables for the pitch filter side-info in the entropy coder */
-/********************* Pitch Filter Gain Coefficient Tables ************************/
-
-/* tables for use with small pitch gain */
-
-/* cdf for quantized pitch filter lags */
-const uint16_t WebRtcIsac_kQPitchLagCdf1Lo[127] = {
- 0,  134,  336,  549,  778,  998,  1264,  1512,  1777,  2070,
- 2423,  2794,  3051,  3361,  3708,  3979,  4315,  4610,  4933,  5269,
- 5575,  5896,  6155,  6480,  6816,  7129,  7477,  7764,  8061,  8358,
- 8718,  9020,  9390,  9783,  10177,  10543,  10885,  11342,  11795,  12213,
- 12680,  13096,  13524,  13919,  14436,  14903,  15349,  15795,  16267,  16734,
- 17266,  17697,  18130,  18632,  19080,  19447,  19884,  20315,  20735,  21288,
- 21764,  22264,  22723,  23193,  23680,  24111,  24557,  25022,  25537,  26082,
- 26543,  27090,  27620,  28139,  28652,  29149,  29634,  30175,  30692,  31273,
- 31866,  32506,  33059,  33650,  34296,  34955,  35629,  36295,  36967,  37726,
- 38559,  39458,  40364,  41293,  42256,  43215,  44231,  45253,  46274,  47359,
- 48482,  49678,  50810,  51853,  53016,  54148,  55235,  56263,  57282,  58363,
- 59288,  60179,  61076,  61806,  62474,  63129,  63656,  64160,  64533,  64856,
- 65152,  65535,  65535,  65535,  65535,  65535,  65535};
-
-const uint16_t WebRtcIsac_kQPitchLagCdf2Lo[20] = {
- 0,  429,  3558,  5861,  8558,  11639,  15210,  19502,  24773,  31983,
- 42602,  48567,  52601,  55676,  58160,  60172,  61889,  63235,  65383,  65535};
-
-const uint16_t WebRtcIsac_kQPitchLagCdf3Lo[2] = {
- 0,  65535};
-
-const uint16_t WebRtcIsac_kQPitchLagCdf4Lo[10] = {
- 0,  2966,  6368,  11182,  19431,  37793,  48532,  55353,  60626,  65535};
-
-const uint16_t *WebRtcIsac_kQPitchLagCdfPtrLo[4] = {WebRtcIsac_kQPitchLagCdf1Lo, WebRtcIsac_kQPitchLagCdf2Lo, WebRtcIsac_kQPitchLagCdf3Lo, WebRtcIsac_kQPitchLagCdf4Lo};
-
-/* size of first cdf table */
-const uint16_t WebRtcIsac_kQPitchLagCdfSizeLo[1] = {128};
-
-/* index limits and ranges */
-const int16_t WebRtcIsac_kQIndexLowerLimitLagLo[4] = {
--140, -9,  0, -4};
-
-const int16_t WebRtcIsac_kQIndexUpperLimitLagLo[4] = {
--20,  9,  0,  4};
-
-/* initial index for arithmetic decoder */
-const uint16_t WebRtcIsac_kQInitIndexLagLo[3] = {
- 10,  1,  5};
-
-/* mean values of pitch filter lags */
-const double WebRtcIsac_kQMeanLag2Lo[19] = {
--17.21385070, -15.82678944, -14.07123081, -12.03003877, -10.01311864, -8.00794627, -5.91162987, -3.89231876, -1.90220980, -0.01879275,
- 1.89144232,  3.88123171,  5.92146992,  7.96435361,  9.98923648,  11.98266347,  13.96101002,  15.74855713,  17.10976611};
-
-const double WebRtcIsac_kQMeanLag3Lo[1] = {
- 0.00000000};
-
-const double WebRtcIsac_kQMeanLag4Lo[9] = {
--7.76246496, -5.92083980, -3.94095226, -1.89502305,  0.03724681,  1.93054221,  3.96443467,  5.91726366,  7.78434291};
-
-const double WebRtcIsac_kQPitchLagStepsizeLo = 2.000000;
-
-
-/* tables for use with medium pitch gain */
-
-/* cdf for quantized pitch filter lags */
-const uint16_t WebRtcIsac_kQPitchLagCdf1Mid[255] = {
- 0,  28,  61,  88,  121,  149,  233,  331,  475,  559,
- 624,  661,  689,  712,  745,  791,  815,  843,  866,  922,
- 959,  1024,  1061,  1117,  1178,  1238,  1280,  1350,  1453,  1513,
- 1564,  1625,  1671,  1741,  1788,  1904,  2072,  2421,  2626,  2770,
- 2840,  2900,  2942,  3012,  3068,  3115,  3147,  3194,  3254,  3319,
- 3366,  3520,  3678,  3780,  3850,  3911,  3957,  4032,  4106,  4185,
- 4292,  4474,  4683,  4842,  5019,  5191,  5321,  5428,  5540,  5675,
- 5763,  5847,  5959,  6127,  6304,  6564,  6839,  7090,  7263,  7421,
- 7556,  7728,  7872,  7984,  8142,  8361,  8580,  8743,  8938,  9227,
- 9409,  9539,  9674,  9795,  9930,  10060,  10177,  10382,  10614,  10861,
- 11038,  11271,  11415,  11629,  11792,  12044,  12193,  12416,  12574,  12821,
- 13007,  13235,  13445,  13654,  13901,  14134,  14488,  15000,  15703,  16285,
- 16504,  16797,  17086,  17328,  17579,  17807,  17998,  18268,  18538,  18836,
- 19087,  19274,  19474,  19716,  19935,  20270,  20833,  21303,  21532,  21741,
- 21978,  22207,  22523,  22770,  23054,  23613,  23943,  24204,  24399,  24651,
- 24832,  25074,  25270,  25549,  25759,  26015,  26150,  26424,  26713,  27048,
- 27342,  27504,  27681,  27854,  28021,  28207,  28412,  28664,  28859,  29064,
- 29278,  29548,  29748,  30107,  30377,  30656,  30856,  31164,  31452,  31755,
- 32011,  32328,  32626,  32919,  33319,  33789,  34329,  34925,  35396,  35973,
- 36443,  36964,  37551,  38156,  38724,  39357,  40023,  40908,  41587,  42602,
- 43924,  45037,  45810,  46597,  47421,  48291,  49092,  50051,  51448,  52719,
- 53440,  54241,  54944,  55977,  56676,  57299,  57872,  58389,  59059,  59688,
- 60237,  60782,  61094,  61573,  61890,  62290,  62658,  63030,  63217,  63454,
- 63622,  63882,  64003,  64273,  64427,  64529,  64581,  64697,  64758,  64902,
- 65414,  65535,  65535,  65535,  65535,  65535,  65535,  65535,  65535,  65535,
- 65535,  65535,  65535,  65535,  65535};
-
-const uint16_t WebRtcIsac_kQPitchLagCdf2Mid[36] = {
- 0,  71,  335,  581,  836,  1039,  1323,  1795,  2258,  2608,
- 3005,  3591,  4243,  5344,  7163,  10583,  16848,  28078,  49448,  57007,
- 60357,  61850,  62837,  63437,  63872,  64188,  64377,  64614,  64774,  64949,
- 65039,  65115,  65223,  65360,  65474,  65535};
-
-const uint16_t WebRtcIsac_kQPitchLagCdf3Mid[2] = {
- 0,  65535};
-
-const uint16_t WebRtcIsac_kQPitchLagCdf4Mid[20] = {
- 0,  28,  246,  459,  667,  1045,  1523,  2337,  4337,  11347,
- 44231,  56709,  60781,  62243,  63161,  63969,  64608,  65062,  65502,  65535};
-
-const uint16_t *WebRtcIsac_kQPitchLagCdfPtrMid[4] = {WebRtcIsac_kQPitchLagCdf1Mid, WebRtcIsac_kQPitchLagCdf2Mid, WebRtcIsac_kQPitchLagCdf3Mid, WebRtcIsac_kQPitchLagCdf4Mid};
-
-/* size of first cdf table */
-const uint16_t WebRtcIsac_kQPitchLagCdfSizeMid[1] = {256};
-
-/* index limits and ranges */
-const int16_t WebRtcIsac_kQIndexLowerLimitLagMid[4] = {
--280, -17,  0, -9};
-
-const int16_t WebRtcIsac_kQIndexUpperLimitLagMid[4] = {
--40,  17,  0,  9};
-
-/* initial index for arithmetic decoder */
-const uint16_t WebRtcIsac_kQInitIndexLagMid[3] = {
- 18,  1,  10};
-
-/* mean values of pitch filter lags */
-const double WebRtcIsac_kQMeanLag2Mid[35] = {
--16.89183900, -15.86949778, -15.05476653, -14.00664348, -13.02793036, -12.07324237, -11.00542532, -10.11250602, -8.90792971, -8.02474753,
--7.00426767, -5.94055287, -4.98251338, -3.91053158, -2.98820425, -1.93524245, -0.92978085, -0.01722509,  0.91317387,  1.92973955,
- 2.96908851,  3.93728974,  4.96308471,  5.92244151,  7.08673497,  8.00993708,  9.04656316,  9.98538742,  10.97851694,  11.94772884,
- 13.02426166,  14.00039951,  15.01347042,  15.80758023,  16.94086895};
-
-const double WebRtcIsac_kQMeanLag3Mid[1] = {
- 0.00000000};
-
-const double WebRtcIsac_kQMeanLag4Mid[19] = {
--8.60409403, -7.89198395, -7.03450280, -5.86260421, -4.93822322, -3.93078706, -2.91302322, -1.91824007, -0.87003282,  0.02822649,
- 0.89951758,  1.87495484,  2.91802604,  3.96874074,  5.06571703,  5.93618227,  7.00520185,  7.88497726,  8.64160364};
-
-const double WebRtcIsac_kQPitchLagStepsizeMid = 1.000000;
-
-
-/* tables for use with large pitch gain */
-
-/* cdf for quantized pitch filter lags */
-const uint16_t WebRtcIsac_kQPitchLagCdf1Hi[511] = {
- 0,  7,  18,  33,  69,  105,  156,  228,  315,  612,
- 680,  691,  709,  724,  735,  738,  742,  746,  749,  753,
- 756,  760,  764,  774,  782,  785,  789,  796,  800,  803,
- 807,  814,  818,  822,  829,  832,  847,  854,  858,  869,
- 876,  883,  898,  908,  934,  977,  1010,  1050,  1060,  1064,
- 1075,  1078,  1086,  1089,  1093,  1104,  1111,  1122,  1133,  1136,
- 1151,  1162,  1183,  1209,  1252,  1281,  1339,  1364,  1386,  1401,
- 1411,  1415,  1426,  1430,  1433,  1440,  1448,  1455,  1462,  1477,
- 1487,  1495,  1502,  1506,  1509,  1516,  1524,  1531,  1535,  1542,
- 1553,  1556,  1578,  1589,  1611,  1625,  1639,  1643,  1654,  1665,
- 1672,  1687,  1694,  1705,  1708,  1719,  1730,  1744,  1752,  1759,
- 1791,  1795,  1820,  1867,  1886,  1915,  1936,  1943,  1965,  1987,
- 2041,  2099,  2161,  2175,  2200,  2211,  2226,  2233,  2244,  2251,
- 2266,  2280,  2287,  2298,  2309,  2316,  2331,  2342,  2356,  2378,
- 2403,  2418,  2447,  2497,  2544,  2602,  2863,  2895,  2903,  2935,
- 2950,  2971,  3004,  3011,  3018,  3029,  3040,  3062,  3087,  3127,
- 3152,  3170,  3199,  3243,  3293,  3322,  3340,  3377,  3402,  3427,
- 3474,  3518,  3543,  3579,  3601,  3637,  3659,  3706,  3731,  3760,
- 3818,  3847,  3869,  3901,  3920,  3952,  4068,  4169,  4220,  4271,
- 4524,  4571,  4604,  4632,  4672,  4730,  4777,  4806,  4857,  4904,
- 4951,  5002,  5031,  5060,  5107,  5150,  5212,  5266,  5331,  5382,
- 5432,  5490,  5544,  5610,  5700,  5762,  5812,  5874,  5972,  6022,
- 6091,  6163,  6232,  6305,  6402,  6540,  6685,  6880,  7090,  7271,
- 7379,  7452,  7542,  7625,  7687,  7770,  7843,  7911,  7966,  8024,
- 8096,  8190,  8252,  8320,  8411,  8501,  8585,  8639,  8751,  8842,
- 8918,  8986,  9066,  9127,  9203,  9269,  9345,  9406,  9464,  9536,
- 9612,  9667,  9735,  9844,  9931,  10036,  10119,  10199,  10260,  10358,
- 10441,  10514,  10666,  10734,  10872,  10951,  11053,  11125,  11223,  11324,
- 11516,  11664,  11737,  11816,  11892,  12008,  12120,  12200,  12280,  12392,
- 12490,  12576,  12685,  12812,  12917,  13003,  13108,  13210,  13300,  13384,
- 13470,  13579,  13673,  13771,  13879,  13999,  14136,  14201,  14368,  14614,
- 14759,  14867,  14958,  15030,  15121,  15189,  15280,  15385,  15461,  15555,
- 15653,  15768,  15884,  15971,  16069,  16145,  16210,  16279,  16380,  16463,
- 16539,  16615,  16688,  16818,  16919,  17017,  18041,  18338,  18523,  18649,
- 18790,  18917,  19047,  19167,  19315,  19460,  19601,  19731,  19858,  20068,
- 20173,  20318,  20466,  20625,  20741,  20911,  21045,  21201,  21396,  21588,
- 21816,  22022,  22305,  22547,  22786,  23072,  23322,  23600,  23879,  24168,
- 24433,  24769,  25120,  25511,  25895,  26289,  26792,  27219,  27683,  28077,
- 28566,  29094,  29546,  29977,  30491,  30991,  31573,  32105,  32594,  33173,
- 33788,  34497,  35181,  35833,  36488,  37255,  37921,  38645,  39275,  39894,
- 40505,  41167,  41790,  42431,  43096,  43723,  44385,  45134,  45858,  46607,
- 47349,  48091,  48768,  49405,  49955,  50555,  51167,  51985,  52611,  53078,
- 53494,  53965,  54435,  54996,  55601,  56125,  56563,  56838,  57244,  57566,
- 57967,  58297,  58771,  59093,  59419,  59647,  59886,  60143,  60461,  60693,
- 60917,  61170,  61416,  61634,  61891,  62122,  62310,  62455,  62632,  62839,
- 63103,  63436,  63639,  63805,  63906,  64015,  64192,  64355,  64475,  64558,
- 64663,  64742,  64811,  64865,  64916,  64956,  64981,  65025,  65068,  65115,
- 65195,  65314,  65419,  65535,  65535,  65535,  65535,  65535,  65535,  65535,
- 65535,  65535,  65535,  65535,  65535,  65535,  65535,  65535,  65535,  65535,
- 65535,  65535,  65535,  65535,  65535,  65535,  65535,  65535,  65535,  65535,
- 65535,  65535,  65535,  65535,  65535,  65535,  65535,  65535,  65535,  65535,
- 65535};
-
-const uint16_t WebRtcIsac_kQPitchLagCdf2Hi[68] = {
- 0,  7,  11,  22,  37,  52,  56,  59,  81,  85,
- 89,  96,  115,  130,  137,  152,  170,  181,  193,  200,
- 207,  233,  237,  259,  289,  318,  363,  433,  592,  992,
- 1607,  3062,  6149,  12206,  25522,  48368,  58223,  61918,  63640,  64584,
- 64943,  65098,  65206,  65268,  65294,  65335,  65350,  65372,  65387,  65402,
- 65413,  65420,  65428,  65435,  65439,  65450,  65454,  65468,  65472,  65476,
- 65483,  65491,  65498,  65505,  65516,  65520,  65528,  65535};
-
-const uint16_t WebRtcIsac_kQPitchLagCdf3Hi[2] = {
- 0,  65535};
-
-const uint16_t WebRtcIsac_kQPitchLagCdf4Hi[35] = {
- 0,  7,  19,  30,  41,  48,  63,  74,  82,  96,
- 122,  152,  215,  330,  701,  2611,  10931,  48106,  61177,  64341,
- 65112,  65238,  65309,  65338,  65364,  65379,  65401,  65427,  65453,  65465,
- 65476,  65490,  65509,  65528,  65535};
-
-const uint16_t *WebRtcIsac_kQPitchLagCdfPtrHi[4] = {WebRtcIsac_kQPitchLagCdf1Hi, WebRtcIsac_kQPitchLagCdf2Hi, WebRtcIsac_kQPitchLagCdf3Hi, WebRtcIsac_kQPitchLagCdf4Hi};
-
-/* size of first cdf table */
-const uint16_t WebRtcIsac_kQPitchLagCdfSizeHi[1] = {512};
-
-/* index limits and ranges */
-const int16_t WebRtcIsac_kQindexLowerLimitLagHi[4] = {
--552, -34,  0, -16};
-
-const int16_t WebRtcIsac_kQindexUpperLimitLagHi[4] = {
--80,  32,  0,  17};
-
-/* initial index for arithmetic decoder */
-const uint16_t WebRtcIsac_kQInitIndexLagHi[3] = {
- 34,  1,  18};
-
-/* mean values of pitch filter lags */
-const double WebRtcIsac_kQMeanLag2Hi[67] = {
--17.07263295, -16.50000000, -15.83966081, -15.55613708, -14.96948007, -14.50000000, -14.00000000, -13.48377986, -13.00000000, -12.50000000,
--11.93199636, -11.44530414, -11.04197641, -10.39910301, -10.15202337, -9.51322461, -8.93357741, -8.46456632, -8.10270672, -7.53751847,
--6.98686404, -6.50000000, -6.08463150, -5.46872991, -5.00864717, -4.50163760, -4.01382410, -3.43856708, -2.96898001, -2.46554810,
--1.96861004, -1.47106701, -0.97197237, -0.46561654, -0.00531409,  0.45767857,  0.96777907,  1.47507903,  1.97740425,  2.46695420,
- 3.00695774,  3.47167185,  4.02712538,  4.49280007,  5.01087640,  5.48191963,  6.04916550,  6.51511058,  6.97297819,  7.46565499,
- 8.01489405,  8.39912001,  8.91819757,  9.50000000,  10.11654065,  10.50000000,  11.03712583,  11.50000000,  12.00000000,  12.38964346,
- 12.89466127,  13.43657881,  13.96013840,  14.46279912,  15.00000000,  15.39412269,  15.96662441};
-
-const double WebRtcIsac_kQMeanLag3Hi[1] = {
- 0.00000000};
-
-const double WebRtcIsac_kQMeanLag4Hi[34] = {
--7.98331221, -7.47988769, -7.03626557, -6.52708003, -6.06982173, -5.51856292, -5.05827033, -4.45909878, -3.99125864, -3.45308135,
--3.02328139, -2.47297273, -1.94341995, -1.44699056, -0.93612243, -0.43012406,  0.01120357,  0.44054812,  0.93199883,  1.45669587,
- 1.97218322,  2.50187419,  2.98748690,  3.49343202,  4.01660147,  4.50984306,  5.01402683,  5.58936797,  5.91787793,  6.59998900,
- 6.85034315,  7.53503316,  7.87711194,  8.53631648};
-
-const double WebRtcIsac_kQPitchLagStepsizeHi = 0.500000;
-
-/* transform matrix */
-const double WebRtcIsac_kTransform[4][4] = {
-{-0.50000000, -0.50000000, -0.50000000, -0.50000000},
-{ 0.67082039,  0.22360680, -0.22360680, -0.67082039},
-{ 0.50000000, -0.50000000, -0.50000000,  0.50000000},
-{ 0.22360680, -0.67082039,  0.67082039, -0.22360680}};
-
-/* transpose transform matrix */
-const double WebRtcIsac_kTransformTranspose[4][4] = {
-{-0.50000000,  0.67082039,  0.50000000,  0.22360680},
-{-0.50000000,  0.22360680, -0.50000000, -0.67082039},
-{-0.50000000, -0.22360680, -0.50000000,  0.67082039},
-{-0.50000000, -0.67082039,  0.50000000, -0.22360680}};
-
diff --git a/modules/audio_coding/codecs/isac/main/source/pitch_lag_tables.h b/modules/audio_coding/codecs/isac/main/source/pitch_lag_tables.h
deleted file mode 100644
index 01989f0..0000000
--- a/modules/audio_coding/codecs/isac/main/source/pitch_lag_tables.h
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/*
- * pitch_lag_tables.h
- *
- * This file contains tables for the pitch filter side-info in the entropy coder.
- *
- */
-
-#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_MAIN_SOURCE_PITCH_LAG_TABLES_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_MAIN_SOURCE_PITCH_LAG_TABLES_H_
-
-#include "webrtc/typedefs.h"
-/* header file for coding tables for the pitch filter side-info in the entropy coder */
-/********************* Pitch Filter Lag Coefficient Tables ************************/
-
-/* tables for use with small pitch gain */
-
-/* cdfs for quantized pitch lags */
-extern const uint16_t WebRtcIsac_kQPitchLagCdf1Lo[127];
-extern const uint16_t WebRtcIsac_kQPitchLagCdf2Lo[20];
-extern const uint16_t WebRtcIsac_kQPitchLagCdf3Lo[2];
-extern const uint16_t WebRtcIsac_kQPitchLagCdf4Lo[10];
-
-extern const uint16_t *WebRtcIsac_kQPitchLagCdfPtrLo[4];
-
-/* size of first cdf table */
-extern const uint16_t WebRtcIsac_kQPitchLagCdfSizeLo[1];
-
-/* index limits and ranges */
-extern const int16_t WebRtcIsac_kQIndexLowerLimitLagLo[4];
-extern const int16_t WebRtcIsac_kQIndexUpperLimitLagLo[4];
-
-/* initial index for arithmetic decoder */
-extern const uint16_t WebRtcIsac_kQInitIndexLagLo[3];
-
-/* mean values of pitch filter lags */
-extern const double WebRtcIsac_kQMeanLag2Lo[19];
-extern const double WebRtcIsac_kQMeanLag3Lo[1];
-extern const double WebRtcIsac_kQMeanLag4Lo[9];
-
-extern const double WebRtcIsac_kQPitchLagStepsizeLo;
-
-
-/* tables for use with medium pitch gain */
-
-/* cdfs for quantized pitch lags */
-extern const uint16_t WebRtcIsac_kQPitchLagCdf1Mid[255];
-extern const uint16_t WebRtcIsac_kQPitchLagCdf2Mid[36];
-extern const uint16_t WebRtcIsac_kQPitchLagCdf3Mid[2];
-extern const uint16_t WebRtcIsac_kQPitchLagCdf4Mid[20];
-
-extern const uint16_t *WebRtcIsac_kQPitchLagCdfPtrMid[4];
-
-/* size of first cdf table */
-extern const uint16_t WebRtcIsac_kQPitchLagCdfSizeMid[1];
-
-/* index limits and ranges */
-extern const int16_t WebRtcIsac_kQIndexLowerLimitLagMid[4];
-extern const int16_t WebRtcIsac_kQIndexUpperLimitLagMid[4];
-
-/* initial index for arithmetic decoder */
-extern const uint16_t WebRtcIsac_kQInitIndexLagMid[3];
-
-/* mean values of pitch filter lags */
-extern const double WebRtcIsac_kQMeanLag2Mid[35];
-extern const double WebRtcIsac_kQMeanLag3Mid[1];
-extern const double WebRtcIsac_kQMeanLag4Mid[19];
-
-extern const double WebRtcIsac_kQPitchLagStepsizeMid;
-
-
-/* tables for use with large pitch gain */
-
-/* cdfs for quantized pitch lags */
-extern const uint16_t WebRtcIsac_kQPitchLagCdf1Hi[511];
-extern const uint16_t WebRtcIsac_kQPitchLagCdf2Hi[68];
-extern const uint16_t WebRtcIsac_kQPitchLagCdf3Hi[2];
-extern const uint16_t WebRtcIsac_kQPitchLagCdf4Hi[35];
-
-extern const uint16_t *WebRtcIsac_kQPitchLagCdfPtrHi[4];
-
-/* size of first cdf table */
-extern const uint16_t WebRtcIsac_kQPitchLagCdfSizeHi[1];
-
-/* index limits and ranges */
-extern const int16_t WebRtcIsac_kQindexLowerLimitLagHi[4];
-extern const int16_t WebRtcIsac_kQindexUpperLimitLagHi[4];
-
-/* initial index for arithmetic decoder */
-extern const uint16_t WebRtcIsac_kQInitIndexLagHi[3];
-
-/* mean values of pitch filter lags */
-extern const double WebRtcIsac_kQMeanLag2Hi[67];
-extern const double WebRtcIsac_kQMeanLag3Hi[1];
-extern const double WebRtcIsac_kQMeanLag4Hi[34];
-
-extern const double WebRtcIsac_kQPitchLagStepsizeHi;
-
-/* transform matrix */
-extern const double WebRtcIsac_kTransform[4][4];
-
-/* transpose transform matrix */
-extern const double WebRtcIsac_kTransformTranspose[4][4];
-
-#endif /* WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_MAIN_SOURCE_PITCH_LAG_TABLES_H_ */
diff --git a/modules/audio_coding/codecs/isac/main/source/settings.h b/modules/audio_coding/codecs/isac/main/source/settings.h
deleted file mode 100644
index 31a8065..0000000
--- a/modules/audio_coding/codecs/isac/main/source/settings.h
+++ /dev/null
@@ -1,205 +0,0 @@
-/*
- *  Copyright (c) 2012 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.
- */
-
-/*
- * settings.h
- *
- * Declaration of #defines used in the iSAC codec
- *
- */
-
-#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_MAIN_SOURCE_SETTINGS_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_MAIN_SOURCE_SETTINGS_H_
-
-/* sampling frequency (Hz) */
-#define FS                                      16000
-
-/* number of samples per frame (either 320 (20ms), 480 (30ms) or 960 (60ms)) */
-#define INITIAL_FRAMESAMPLES     960
-
-
-#define MAXFFTSIZE 2048
-#define NFACTOR 11
-
-
-
-/* do not modify the following; this will have to be modified if we
- * have a 20ms framesize option */
-/**********************************************************************/
-/* miliseconds */
-#define FRAMESIZE                               30
-/* number of samples per frame processed in the encoder, 480 */
-#define FRAMESAMPLES                            480 /* ((FRAMESIZE*FS)/1000) */
-#define FRAMESAMPLES_HALF      240
-#define FRAMESAMPLES_QUARTER                    120
-/**********************************************************************/
-
-
-
-/* max number of samples per frame (= 60 ms frame) */
-#define MAX_FRAMESAMPLES      960
-#define MAX_SWBFRAMESAMPLES                     (MAX_FRAMESAMPLES * 2)
-/* number of samples per 10ms frame */
-#define FRAMESAMPLES_10ms                       ((10*FS)/1000)
-#define SWBFRAMESAMPLES_10ms                    (FRAMESAMPLES_10ms * 2)
-/* number of samples in 30 ms frame */
-#define FRAMESAMPLES_30ms            480
-/* number of subframes */
-#define SUBFRAMES                               6
-/* length of a subframe */
-#define UPDATE                                  80
-/* length of half a subframe (low/high band) */
-#define HALF_SUBFRAMELEN                        (UPDATE/2)
-/* samples of look ahead (in a half-band, so actually
- * half the samples of look ahead @ FS) */
-#define QLOOKAHEAD                              24    /* 3 ms */
-/* order of AR model in spectral entropy coder */
-#define AR_ORDER                                6
-/* order of LP model in spectral entropy coder */
-#define LP_ORDER                                0
-
-/* window length (masking analysis) */
-#define WINLEN                                  256
-/* order of low-band pole filter used to approximate masking curve */
-#define ORDERLO                                 12
-/* order of hi-band pole filter used to approximate masking curve */
-#define ORDERHI                                 6
-
-#define UB_LPC_ORDER                            4
-#define UB_LPC_VEC_PER_FRAME                    2
-#define UB16_LPC_VEC_PER_FRAME                  4
-#define UB_ACTIVE_SUBFRAMES                     2
-#define UB_MAX_LPC_ORDER                        6
-#define UB_INTERPOL_SEGMENTS                    1
-#define UB16_INTERPOL_SEGMENTS                  3
-#define LB_TOTAL_DELAY_SAMPLES                 48
-enum ISACBandwidth {isac8kHz = 8, isac12kHz = 12, isac16kHz = 16};
-enum ISACBand {kIsacLowerBand = 0, kIsacUpperBand12 = 1, kIsacUpperBand16 = 2};
-enum IsacSamplingRate {kIsacWideband = 16,  kIsacSuperWideband = 32};
-#define UB_LPC_GAIN_DIM                 SUBFRAMES
-#define FB_STATE_SIZE_WORD32                    6
-
-
-/* order for post_filter_bank */
-#define POSTQORDER                              3
-/* order for pre-filterbank */
-#define QORDER                                  3
-/* another order */
-#define QORDER_ALL                              (POSTQORDER+QORDER-1)
-/* for decimator */
-#define ALLPASSSECTIONS                         2
-
-
-/* array size for byte stream in number of bytes. */
-/* The old maximum size still needed for the decoding */
-#define STREAM_SIZE_MAX     600
-#define STREAM_SIZE_MAX_30  200 /* 200 bytes=53.4 kbps @ 30 ms.framelength */
-#define STREAM_SIZE_MAX_60  400 /* 400 bytes=53.4 kbps @ 60 ms.framelength */
-
-/* storage size for bit counts */
-#define BIT_COUNTER_SIZE                        30
-/* maximum order of any AR model or filter */
-#define MAX_AR_MODEL_ORDER                      12//50
-
-
-/* For pitch analysis */
-#define PITCH_FRAME_LEN                         (FRAMESAMPLES_HALF) /* 30 ms  */
-#define PITCH_MAX_LAG                           140     /* 57 Hz  */
-#define PITCH_MIN_LAG                           20              /* 400 Hz */
-#define PITCH_MAX_GAIN                          0.45
-#define PITCH_MAX_GAIN_06                       0.27  /* PITCH_MAX_GAIN*0.6 */
-#define PITCH_MAX_GAIN_Q12      1843
-#define PITCH_LAG_SPAN2                     (PITCH_MAX_LAG/2-PITCH_MIN_LAG/2+5)
-#define PITCH_CORR_LEN2                         60     /* 15 ms  */
-#define PITCH_CORR_STEP2                        (PITCH_FRAME_LEN/4)
-#define PITCH_BW        11     /* half the band width of correlation surface */
-#define PITCH_SUBFRAMES                         4
-#define PITCH_GRAN_PER_SUBFRAME                 5
-#define PITCH_SUBFRAME_LEN        (PITCH_FRAME_LEN/PITCH_SUBFRAMES)
-#define PITCH_UPDATE              (PITCH_SUBFRAME_LEN/PITCH_GRAN_PER_SUBFRAME)
-/* maximum number of peaks to be examined in correlation surface */
-#define PITCH_MAX_NUM_PEAKS                  10
-#define PITCH_PEAK_DECAY               0.85
-/* For weighting filter */
-#define PITCH_WLPCORDER                   6
-#define PITCH_WLPCWINLEN               PITCH_FRAME_LEN
-#define PITCH_WLPCASYM                   0.3         /* asymmetry parameter */
-#define PITCH_WLPCBUFLEN               PITCH_WLPCWINLEN
-/* For pitch filter */
-/* Extra 50 for fraction and LP filters */
-#define PITCH_BUFFSIZE                   (PITCH_MAX_LAG + 50)
-#define PITCH_INTBUFFSIZE               (PITCH_FRAME_LEN+PITCH_BUFFSIZE)
-/* Max rel. step for interpolation */
-#define PITCH_UPSTEP                1.5
-/* Max rel. step for interpolation */
-#define PITCH_DOWNSTEP                   0.67
-#define PITCH_FRACS                             8
-#define PITCH_FRACORDER                         9
-#define PITCH_DAMPORDER                         5
-#define PITCH_FILTDELAY                         1.5f
-/* stepsize for quantization of the pitch Gain */
-#define PITCH_GAIN_STEPSIZE                     0.125
-
-
-
-/* Order of high pass filter */
-#define HPORDER                                 2
-
-/* some mathematical constants */
-/* log2(exp) */
-#define LOG2EXP                                 1.44269504088896
-#define PI                                      3.14159265358979
-
-/* Maximum number of iterations allowed to limit payload size */
-#define MAX_PAYLOAD_LIMIT_ITERATION             5
-
-/* Redundant Coding */
-#define RCU_BOTTLENECK_BPS                      16000
-#define RCU_TRANSCODING_SCALE                   0.40f
-#define RCU_TRANSCODING_SCALE_INVERSE           2.5f
-
-#define RCU_TRANSCODING_SCALE_UB                0.50f
-#define RCU_TRANSCODING_SCALE_UB_INVERSE        2.0f
-
-/* Define Error codes */
-/* 6000 General */
-#define ISAC_MEMORY_ALLOCATION_FAILED    6010
-#define ISAC_MODE_MISMATCH       6020
-#define ISAC_DISALLOWED_BOTTLENECK     6030
-#define ISAC_DISALLOWED_FRAME_LENGTH    6040
-#define ISAC_UNSUPPORTED_SAMPLING_FREQUENCY         6050
-
-/* 6200 Bandwidth estimator */
-#define ISAC_RANGE_ERROR_BW_ESTIMATOR    6240
-/* 6400 Encoder */
-#define ISAC_ENCODER_NOT_INITIATED     6410
-#define ISAC_DISALLOWED_CODING_MODE     6420
-#define ISAC_DISALLOWED_FRAME_MODE_ENCODER   6430
-#define ISAC_DISALLOWED_BITSTREAM_LENGTH            6440
-#define ISAC_PAYLOAD_LARGER_THAN_LIMIT              6450
-#define ISAC_DISALLOWED_ENCODER_BANDWIDTH           6460
-/* 6600 Decoder */
-#define ISAC_DECODER_NOT_INITIATED     6610
-#define ISAC_EMPTY_PACKET       6620
-#define ISAC_DISALLOWED_FRAME_MODE_DECODER   6630
-#define ISAC_RANGE_ERROR_DECODE_FRAME_LENGTH  6640
-#define ISAC_RANGE_ERROR_DECODE_BANDWIDTH   6650
-#define ISAC_RANGE_ERROR_DECODE_PITCH_GAIN   6660
-#define ISAC_RANGE_ERROR_DECODE_PITCH_LAG   6670
-#define ISAC_RANGE_ERROR_DECODE_LPC     6680
-#define ISAC_RANGE_ERROR_DECODE_SPECTRUM   6690
-#define ISAC_LENGTH_MISMATCH      6730
-#define ISAC_RANGE_ERROR_DECODE_BANDWITH            6740
-#define ISAC_DISALLOWED_BANDWIDTH_MODE_DECODER      6750
-#define ISAC_DISALLOWED_LPC_MODEL                   6760
-/* 6800 Call setup formats */
-#define ISAC_INCOMPATIBLE_FORMATS     6810
-
-#endif /* WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_MAIN_SOURCE_SETTINGS_H_ */
diff --git a/modules/audio_coding/codecs/isac/main/source/spectrum_ar_model_tables.c b/modules/audio_coding/codecs/isac/main/source/spectrum_ar_model_tables.c
deleted file mode 100644
index 0f6d889..0000000
--- a/modules/audio_coding/codecs/isac/main/source/spectrum_ar_model_tables.c
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- *  Copyright (c) 2011 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 "spectrum_ar_model_tables.h"
-#include "settings.h"
-
-/********************* AR Coefficient Tables ************************/
-/* cdf for quantized reflection coefficient 1 */
-const uint16_t WebRtcIsac_kQArRc1Cdf[NUM_AR_RC_QUANT_BAUNDARY] = {
- 0,  2,  4,  129,  7707,  57485,  65495,  65527,  65529,  65531,
- 65533,  65535};
-
-/* cdf for quantized reflection coefficient 2 */
-const uint16_t WebRtcIsac_kQArRc2Cdf[NUM_AR_RC_QUANT_BAUNDARY] = {
- 0,  2,  4,  7,  531,  25298,  64525,  65526,  65529,  65531,
- 65533,  65535};
-
-/* cdf for quantized reflection coefficient 3 */
-const uint16_t WebRtcIsac_kQArRc3Cdf[NUM_AR_RC_QUANT_BAUNDARY] = {
- 0,  2,  4,  6,  620,  22898,  64843,  65527,  65529,  65531,
- 65533,  65535};
-
-/* cdf for quantized reflection coefficient 4 */
-const uint16_t WebRtcIsac_kQArRc4Cdf[NUM_AR_RC_QUANT_BAUNDARY] = {
- 0,  2,  4,  6,  35,  10034,  60733,  65506,  65529,  65531,
- 65533,  65535};
-
-/* cdf for quantized reflection coefficient 5 */
-const uint16_t WebRtcIsac_kQArRc5Cdf[NUM_AR_RC_QUANT_BAUNDARY] = {
- 0,  2,  4,  6,  36,  7567,  56727,  65385,  65529,  65531,
- 65533,  65535};
-
-/* cdf for quantized reflection coefficient 6 */
-const uint16_t WebRtcIsac_kQArRc6Cdf[NUM_AR_RC_QUANT_BAUNDARY] = {
- 0,  2,  4,  6,  14,  6579,  57360,  65409,  65529,  65531,
- 65533,  65535};
-
-/* representation levels for quantized reflection coefficient 1 */
-const int16_t WebRtcIsac_kQArRc1Levels[NUM_AR_RC_QUANT_BAUNDARY - 1] = {
- -32104, -29007, -23202, -15496, -9279, -2577, 5934, 17535, 24512, 29503, 32104
-};
-
-/* representation levels for quantized reflection coefficient 2 */
-const int16_t WebRtcIsac_kQArRc2Levels[NUM_AR_RC_QUANT_BAUNDARY - 1] = {
- -32104, -29503, -23494, -15261, -7309, -1399, 6158, 16381, 24512, 29503, 32104
-};
-
-/* representation levels for quantized reflection coefficient 3 */
-const int16_t WebRtcIsac_kQArRc3Levels[NUM_AR_RC_QUANT_BAUNDARY - 1] = {
--32104, -29503, -23157, -15186, -7347, -1359, 5829, 17535, 24512, 29503, 32104
-};
-
-/* representation levels for quantized reflection coefficient 4 */
-const int16_t WebRtcIsac_kQArRc4Levels[NUM_AR_RC_QUANT_BAUNDARY - 1] = {
--32104, -29503, -24512, -15362, -6665, -342, 6596, 14585, 24512, 29503, 32104
-};
-
-/* representation levels for quantized reflection coefficient 5 */
-const int16_t WebRtcIsac_kQArRc5Levels[NUM_AR_RC_QUANT_BAUNDARY - 1] = {
--32104, -29503, -24512, -15005, -6564, -106, 7123, 14920, 24512, 29503, 32104
-};
-
-/* representation levels for quantized reflection coefficient 6 */
-const int16_t WebRtcIsac_kQArRc6Levels[NUM_AR_RC_QUANT_BAUNDARY - 1] = {
--32104, -29503, -24512, -15096, -6656, -37, 7036, 14847, 24512, 29503, 32104
-};
-
-/* quantization boundary levels for reflection coefficients */
-const int16_t WebRtcIsac_kQArBoundaryLevels[NUM_AR_RC_QUANT_BAUNDARY] = {
--32768, -31441, -27566, -21458, -13612, -4663, 4663, 13612, 21458, 27566, 31441,
-32767
-};
-
-/* initial index for AR reflection coefficient quantizer and cdf table search */
-const uint16_t WebRtcIsac_kQArRcInitIndex[6] = {
- 5,  5,  5,  5,  5,  5};
-
-/* pointers to AR cdf tables */
-const uint16_t *WebRtcIsac_kQArRcCdfPtr[AR_ORDER] = {
-  WebRtcIsac_kQArRc1Cdf, WebRtcIsac_kQArRc2Cdf, WebRtcIsac_kQArRc3Cdf,
-  WebRtcIsac_kQArRc4Cdf, WebRtcIsac_kQArRc5Cdf, WebRtcIsac_kQArRc6Cdf
-};
-
-/* pointers to AR representation levels tables */
-const int16_t *WebRtcIsac_kQArRcLevelsPtr[AR_ORDER] = {
-  WebRtcIsac_kQArRc1Levels, WebRtcIsac_kQArRc2Levels, WebRtcIsac_kQArRc3Levels,
-  WebRtcIsac_kQArRc4Levels, WebRtcIsac_kQArRc5Levels, WebRtcIsac_kQArRc6Levels
-};
-
-
-/******************** GAIN Coefficient Tables ***********************/
-/* cdf for Gain coefficient */
-const uint16_t WebRtcIsac_kQGainCdf[19] = {
- 0,  2,  4,  6,  8,  10,  12,  14,  16,  1172,
- 11119,  29411,  51699,  64445,  65527,  65529,  65531,  65533,  65535};
-
-/* representation levels for quantized squared Gain coefficient */
-const int32_t WebRtcIsac_kQGain2Levels[18] = {
-// 17, 28, 46, 76, 128, 215, 364, 709, 1268, 1960, 3405, 6078, 11286, 17827, 51918, 134498, 487432, 2048000};
- 128, 128, 128, 128, 128, 215, 364, 709, 1268, 1960, 3405, 6078, 11286, 17827, 51918, 134498, 487432, 2048000};
-/* quantization boundary levels for squared Gain coefficient */
-const int32_t WebRtcIsac_kQGain2BoundaryLevels[19] = {
-0, 21, 35, 59, 99, 166, 280, 475, 815, 1414, 2495, 4505, 8397, 16405, 34431, 81359, 240497, 921600, 0x7FFFFFFF};
-
-/* pointers to Gain cdf table */
-const uint16_t *WebRtcIsac_kQGainCdf_ptr[1] = {WebRtcIsac_kQGainCdf};
-
-/* Gain initial index for gain quantizer and cdf table search */
-const uint16_t WebRtcIsac_kQGainInitIndex[1] = {11};
-
-/************************* Cosine Tables ****************************/
-/* Cosine table */
-const int16_t WebRtcIsac_kCos[6][60] = {
-{512,  512,  511,  510,  508,  507,  505,  502,  499,  496,  493,  489,  485,  480,  476,  470,  465,  459,  453,  447,
-440,  433,  426,  418,  410,  402,  394,  385,  376,  367,  357,  348,  338,  327,  317,  306,  295,  284,  273,  262,
-250,  238,  226,  214,  202,  190,  177,  165,  152,  139,  126,  113,  100,  87,  73,  60,  47,  33,  20,  7},
-{512,  510,  508,  503,  498,  491,  483,  473,  462,  450,  437,  422,  406,  389,  371,  352,  333,  312,  290,  268,
-244,  220,  196,  171,  145,  120,  93,  67,  40,  13,  -13,  -40,  -67,  -93,  -120,  -145,  -171,  -196,  -220,  -244,
--268,  -290,  -312,  -333,  -352,  -371,  -389,  -406,  -422,  -437,  -450,  -462,  -473,  -483,  -491,  -498,  -503,  -508,  -510,  -512},
-{512,  508,  502,  493,  480,  465,  447,  426,  402,  376,  348,  317,  284,  250,  214,  177,  139,  100,  60,  20,
--20,  -60,  -100,  -139,  -177,  -214,  -250,  -284,  -317,  -348,  -376,  -402,  -426,  -447,  -465,  -480,  -493,  -502,  -508,  -512,
--512,  -508,  -502,  -493,  -480,  -465,  -447,  -426,  -402,  -376,  -348,  -317,  -284,  -250,  -214,  -177,  -139,  -100,  -60,  -20},
-{511,  506,  495,  478,  456,  429,  398,  362,  322,  279,  232,  183,  133,  80,  27,  -27,  -80,  -133,  -183,  -232,
--279,  -322,  -362,  -398,  -429,  -456,  -478,  -495,  -506,  -511,  -511,  -506,  -495,  -478,  -456,  -429,  -398,  -362,  -322,  -279,
--232,  -183,  -133,  -80,  -27,  27,  80,  133,  183,  232,  279,  322,  362,  398,  429,  456,  478,  495,  506,  511},
-{511,  502,  485,  459,  426,  385,  338,  284,  226,  165,  100,  33,  -33,  -100,  -165,  -226,  -284,  -338,  -385,  -426,
--459,  -485,  -502,  -511,  -511,  -502,  -485,  -459,  -426,  -385,  -338,  -284,  -226,  -165,  -100,  -33,  33,  100,  165,  226,
-284,  338,  385,  426,  459,  485,  502,  511,  511,  502,  485,  459,  426,  385,  338,  284,  226,  165,  100,  33},
-{510,  498,  473,  437,  389,  333,  268,  196,  120,  40,  -40,  -120,  -196,  -268,  -333,  -389,  -437,  -473,  -498,  -510,
--510,  -498,  -473,  -437,  -389,  -333,  -268,  -196,  -120,  -40,  40,  120,  196,  268,  333,  389,  437,  473,  498,  510,
-510,  498,  473,  437,  389,  333,  268,  196,  120,  40,  -40,  -120,  -196,  -268,  -333,  -389,  -437,  -473,  -498,  -510}
-};
diff --git a/modules/audio_coding/codecs/isac/main/source/spectrum_ar_model_tables.h b/modules/audio_coding/codecs/isac/main/source/spectrum_ar_model_tables.h
deleted file mode 100644
index 989cb36..0000000
--- a/modules/audio_coding/codecs/isac/main/source/spectrum_ar_model_tables.h
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/*
- * spectrum_ar_model_tables.h
- *
- * This file contains definitions of tables with AR coefficients, 
- * Gain coefficients and cosine tables.
- *
- */
-
-#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_MAIN_SOURCE_SPECTRUM_AR_MODEL_TABLES_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_MAIN_SOURCE_SPECTRUM_AR_MODEL_TABLES_H_
-
-#include "structs.h"
-
-#define NUM_AR_RC_QUANT_BAUNDARY 12
-
-/********************* AR Coefficient Tables ************************/
-/* cdf for quantized reflection coefficient 1 */
-extern const uint16_t WebRtcIsac_kQArRc1Cdf[NUM_AR_RC_QUANT_BAUNDARY];
-
-/* cdf for quantized reflection coefficient 2 */
-extern const uint16_t WebRtcIsac_kQArRc2Cdf[NUM_AR_RC_QUANT_BAUNDARY];
-
-/* cdf for quantized reflection coefficient 3 */
-extern const uint16_t WebRtcIsac_kQArRc3Cdf[NUM_AR_RC_QUANT_BAUNDARY];
-
-/* cdf for quantized reflection coefficient 4 */
-extern const uint16_t WebRtcIsac_kQArRc4Cdf[NUM_AR_RC_QUANT_BAUNDARY];
-
-/* cdf for quantized reflection coefficient 5 */
-extern const uint16_t WebRtcIsac_kQArRc5Cdf[NUM_AR_RC_QUANT_BAUNDARY];
-
-/* cdf for quantized reflection coefficient 6 */
-extern const uint16_t WebRtcIsac_kQArRc6Cdf[NUM_AR_RC_QUANT_BAUNDARY];
-
-/* quantization boundary levels for reflection coefficients */
-extern const int16_t WebRtcIsac_kQArBoundaryLevels[NUM_AR_RC_QUANT_BAUNDARY];
-
-/* initial indices for AR reflection coefficient quantizer and cdf table search */
-extern const uint16_t WebRtcIsac_kQArRcInitIndex[AR_ORDER];
-
-/* pointers to AR cdf tables */
-extern const uint16_t *WebRtcIsac_kQArRcCdfPtr[AR_ORDER];
-
-/* pointers to AR representation levels tables */
-extern const int16_t *WebRtcIsac_kQArRcLevelsPtr[AR_ORDER];
-
-
-/******************** GAIN Coefficient Tables ***********************/
-/* cdf for Gain coefficient */
-extern const uint16_t WebRtcIsac_kQGainCdf[19];
-
-/* representation levels for quantized Gain coefficient */
-extern const int32_t WebRtcIsac_kQGain2Levels[18];
-
-/* squared quantization boundary levels for Gain coefficient */
-extern const int32_t WebRtcIsac_kQGain2BoundaryLevels[19];
-
-/* pointer to Gain cdf table */
-extern const uint16_t *WebRtcIsac_kQGainCdf_ptr[1];
-
-/* Gain initial index for gain quantizer and cdf table search */
-extern const uint16_t WebRtcIsac_kQGainInitIndex[1];
-
-/************************* Cosine Tables ****************************/
-/* Cosine table */
-extern const int16_t WebRtcIsac_kCos[6][60];
-
-#endif /* WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_MAIN_SOURCE_SPECTRUM_AR_MODEL_TABLES_H_ */
diff --git a/modules/audio_coding/codecs/isac/main/source/structs.h b/modules/audio_coding/codecs/isac/main/source/structs.h
deleted file mode 100644
index a2cdca2..0000000
--- a/modules/audio_coding/codecs/isac/main/source/structs.h
+++ /dev/null
@@ -1,495 +0,0 @@
-/*
- *  Copyright (c) 2012 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.
- */
-
-/*
- * structs.h
- *
- * This header file contains all the structs used in the ISAC codec
- *
- */
-
-#ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_MAIN_SOURCE_STRUCTS_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_MAIN_SOURCE_STRUCTS_H_
-
-#include "webrtc/modules/audio_coding/codecs/isac/bandwidth_info.h"
-#include "webrtc/modules/audio_coding/codecs/isac/main/include/isac.h"
-#include "webrtc/modules/audio_coding/codecs/isac/main/source/settings.h"
-#include "webrtc/typedefs.h"
-
-typedef struct Bitstreamstruct {
-
-  uint8_t   stream[STREAM_SIZE_MAX];
-  uint32_t  W_upper;
-  uint32_t  streamval;
-  uint32_t  stream_index;
-
-} Bitstr;
-
-typedef struct {
-
-  double    DataBufferLo[WINLEN];
-  double    DataBufferHi[WINLEN];
-
-  double    CorrBufLo[ORDERLO+1];
-  double    CorrBufHi[ORDERHI+1];
-
-  float    PreStateLoF[ORDERLO+1];
-  float    PreStateLoG[ORDERLO+1];
-  float    PreStateHiF[ORDERHI+1];
-  float    PreStateHiG[ORDERHI+1];
-  float    PostStateLoF[ORDERLO+1];
-  float    PostStateLoG[ORDERLO+1];
-  float    PostStateHiF[ORDERHI+1];
-  float    PostStateHiG[ORDERHI+1];
-
-  double    OldEnergy;
-
-} MaskFiltstr;
-
-
-typedef struct {
-
-  //state vectors for each of the two analysis filters
-  double    INSTAT1[2*(QORDER-1)];
-  double    INSTAT2[2*(QORDER-1)];
-  double    INSTATLA1[2*(QORDER-1)];
-  double    INSTATLA2[2*(QORDER-1)];
-  double    INLABUF1[QLOOKAHEAD];
-  double    INLABUF2[QLOOKAHEAD];
-
-  float    INSTAT1_float[2*(QORDER-1)];
-  float    INSTAT2_float[2*(QORDER-1)];
-  float    INSTATLA1_float[2*(QORDER-1)];
-  float    INSTATLA2_float[2*(QORDER-1)];
-  float    INLABUF1_float[QLOOKAHEAD];
-  float    INLABUF2_float[QLOOKAHEAD];
-
-  /* High pass filter */
-  double    HPstates[HPORDER];
-  float    HPstates_float[HPORDER];
-
-} PreFiltBankstr;
-
-
-typedef struct {
-
-  //state vectors for each of the two analysis filters
-  double    STATE_0_LOWER[2*POSTQORDER];
-  double    STATE_0_UPPER[2*POSTQORDER];
-
-  /* High pass filter */
-  double    HPstates1[HPORDER];
-  double    HPstates2[HPORDER];
-
-  float    STATE_0_LOWER_float[2*POSTQORDER];
-  float    STATE_0_UPPER_float[2*POSTQORDER];
-
-  float    HPstates1_float[HPORDER];
-  float    HPstates2_float[HPORDER];
-
-} PostFiltBankstr;
-
-typedef struct {
-
-  //data buffer for pitch filter
-  double    ubuf[PITCH_BUFFSIZE];
-
-  //low pass state vector
-  double    ystate[PITCH_DAMPORDER];
-
-  //old lag and gain
-  double    oldlagp[1];
-  double    oldgainp[1];
-
-} PitchFiltstr;
-
-typedef struct {
-
-  //data buffer
-  double    buffer[PITCH_WLPCBUFLEN];
-
-  //state vectors
-  double    istate[PITCH_WLPCORDER];
-  double    weostate[PITCH_WLPCORDER];
-  double    whostate[PITCH_WLPCORDER];
-
-  //LPC window   -> should be a global array because constant
-  double    window[PITCH_WLPCWINLEN];
-
-} WeightFiltstr;
-
-typedef struct {
-
-  //for inital estimator
-  double         dec_buffer[PITCH_CORR_LEN2 + PITCH_CORR_STEP2 +
-                            PITCH_MAX_LAG/2 - PITCH_FRAME_LEN/2+2];
-  double        decimator_state[2*ALLPASSSECTIONS+1];
-  double        hp_state[2];
-
-  double        whitened_buf[QLOOKAHEAD];
-
-  double        inbuf[QLOOKAHEAD];
-
-  PitchFiltstr  PFstr_wght;
-  PitchFiltstr  PFstr;
-  WeightFiltstr Wghtstr;
-
-} PitchAnalysisStruct;
-
-
-
-/* Have instance of struct together with other iSAC structs */
-typedef struct {
-
-  /* Previous frame length (in ms)                                    */
-  int32_t    prev_frame_length;
-
-  /* Previous RTP timestamp from received
-     packet (in samples relative beginning)                           */
-  int32_t    prev_rec_rtp_number;
-
-  /* Send timestamp for previous packet (in ms using timeGetTime())   */
-  uint32_t    prev_rec_send_ts;
-
-  /* Arrival time for previous packet (in ms using timeGetTime())     */
-  uint32_t    prev_rec_arr_ts;
-
-  /* rate of previous packet, derived from RTP timestamps (in bits/s) */
-  float   prev_rec_rtp_rate;
-
-  /* Time sinse the last update of the BN estimate (in ms)            */
-  uint32_t    last_update_ts;
-
-  /* Time sinse the last reduction (in ms)                            */
-  uint32_t    last_reduction_ts;
-
-  /* How many times the estimate was update in the beginning          */
-  int32_t    count_tot_updates_rec;
-
-  /* The estimated bottle neck rate from there to here (in bits/s)    */
-  int32_t  rec_bw;
-  float   rec_bw_inv;
-  float   rec_bw_avg;
-  float   rec_bw_avg_Q;
-
-  /* The estimated mean absolute jitter value,
-     as seen on this side (in ms)                                     */
-  float   rec_jitter;
-  float   rec_jitter_short_term;
-  float   rec_jitter_short_term_abs;
-  float   rec_max_delay;
-  float   rec_max_delay_avg_Q;
-
-  /* (assumed) bitrate for headers (bps)                              */
-  float   rec_header_rate;
-
-  /* The estimated bottle neck rate from here to there (in bits/s)    */
-  float    send_bw_avg;
-
-  /* The estimated mean absolute jitter value, as seen on
-     the other siee (in ms)                                           */
-  float   send_max_delay_avg;
-
-  // number of packets received since last update
-  int num_pkts_rec;
-
-  int num_consec_rec_pkts_over_30k;
-
-  // flag for marking that a high speed network has been
-  // detected downstream
-  int hsn_detect_rec;
-
-  int num_consec_snt_pkts_over_30k;
-
-  // flag for marking that a high speed network has
-  // been detected upstream
-  int hsn_detect_snd;
-
-  uint32_t start_wait_period;
-
-  int in_wait_period;
-
-  int change_to_WB;
-
-  uint32_t                 senderTimestamp;
-  uint32_t                 receiverTimestamp;
-  //enum IsacSamplingRate incomingStreamSampFreq;
-  uint16_t                 numConsecLatePkts;
-  float                        consecLatency;
-  int16_t                  inWaitLatePkts;
-
-  IsacBandwidthInfo external_bw_info;
-} BwEstimatorstr;
-
-
-typedef struct {
-
-  /* boolean, flags if previous packet exceeded B.N. */
-  int    PrevExceed;
-  /* ms */
-  int    ExceedAgo;
-  /* packets left to send in current burst */
-  int    BurstCounter;
-  /* packets */
-  int    InitCounter;
-  /* ms remaining in buffer when next packet will be sent */
-  double StillBuffered;
-
-} RateModel;
-
-
-typedef struct {
-
-  unsigned int SpaceAlloced;
-  unsigned int MaxPermAlloced;
-  double Tmp0[MAXFFTSIZE];
-  double Tmp1[MAXFFTSIZE];
-  double Tmp2[MAXFFTSIZE];
-  double Tmp3[MAXFFTSIZE];
-  int Perm[MAXFFTSIZE];
-  int factor [NFACTOR];
-
-} FFTstr;
-
-
-/* The following strutc is used to store data from encoding, to make it
-   fast and easy to construct a new bitstream with a different Bandwidth
-   estimate. All values (except framelength and minBytes) is double size to
-   handle 60 ms of data.
-*/
-typedef struct {
-
-  /* Used to keep track of if it is first or second part of 60 msec packet */
-  int         startIdx;
-
-  /* Frame length in samples */
-  int16_t framelength;
-
-  /* Pitch Gain */
-  int         pitchGain_index[2];
-
-  /* Pitch Lag */
-  double      meanGain[2];
-  int         pitchIndex[PITCH_SUBFRAMES*2];
-
-  /* LPC */
-  int         LPCindex_s[108*2]; /* KLT_ORDER_SHAPE = 108 */
-  int         LPCindex_g[12*2];  /* KLT_ORDER_GAIN = 12 */
-  double      LPCcoeffs_lo[(ORDERLO+1)*SUBFRAMES*2];
-  double      LPCcoeffs_hi[(ORDERHI+1)*SUBFRAMES*2];
-
-  /* Encode Spec */
-  int16_t fre[FRAMESAMPLES];
-  int16_t fim[FRAMESAMPLES];
-  int16_t AvgPitchGain[2];
-
-  /* Used in adaptive mode only */
-  int         minBytes;
-
-} IsacSaveEncoderData;
-
-
-typedef struct {
-
-  int         indexLPCShape[UB_LPC_ORDER * UB16_LPC_VEC_PER_FRAME];
-  double      lpcGain[SUBFRAMES<<1];
-  int         lpcGainIndex[SUBFRAMES<<1];
-
-  Bitstr      bitStreamObj;
-
-  int16_t realFFT[FRAMESAMPLES_HALF];
-  int16_t imagFFT[FRAMESAMPLES_HALF];
-} ISACUBSaveEncDataStruct;
-
-
-
-typedef struct {
-
-  Bitstr              bitstr_obj;
-  MaskFiltstr         maskfiltstr_obj;
-  PreFiltBankstr      prefiltbankstr_obj;
-  PitchFiltstr        pitchfiltstr_obj;
-  PitchAnalysisStruct pitchanalysisstr_obj;
-  FFTstr              fftstr_obj;
-  IsacSaveEncoderData SaveEnc_obj;
-
-  int                 buffer_index;
-  int16_t         current_framesamples;
-
-  float               data_buffer_float[FRAMESAMPLES_30ms];
-
-  int                 frame_nb;
-  double              bottleneck;
-  int16_t         new_framelength;
-  double              s2nr;
-
-  /* Maximum allowed number of bits for a 30 msec packet */
-  int16_t         payloadLimitBytes30;
-  /* Maximum allowed number of bits for a 30 msec packet */
-  int16_t         payloadLimitBytes60;
-  /* Maximum allowed number of bits for both 30 and 60 msec packet */
-  int16_t         maxPayloadBytes;
-  /* Maximum allowed rate in bytes per 30 msec packet */
-  int16_t         maxRateInBytes;
-
-  /*---
-    If set to 1 iSAC will not addapt the frame-size, if used in
-    channel-adaptive mode. The initial value will be used for all rates.
-    ---*/
-  int16_t         enforceFrameSize;
-
-  /*-----
-    This records the BWE index the encoder injected into the bit-stream.
-    It will be used in RCU. The same BWE index of main payload will be in
-    the redundant payload. We can not retrive it from BWE because it is
-    a recursive procedure (WebRtcIsac_GetDownlinkBwJitIndexImpl) and has to be
-    called only once per each encode.
-    -----*/
-  int16_t         lastBWIdx;
-} ISACLBEncStruct;
-
-typedef struct {
-
-  Bitstr                  bitstr_obj;
-  MaskFiltstr             maskfiltstr_obj;
-  PreFiltBankstr          prefiltbankstr_obj;
-  FFTstr                  fftstr_obj;
-  ISACUBSaveEncDataStruct SaveEnc_obj;
-
-  int                     buffer_index;
-  float                   data_buffer_float[MAX_FRAMESAMPLES +
-                                            LB_TOTAL_DELAY_SAMPLES];
-  double                  bottleneck;
-  /* Maximum allowed number of bits for a 30 msec packet */
-  //int16_t        payloadLimitBytes30;
-  /* Maximum allowed number of bits for both 30 and 60 msec packet */
-  //int16_t        maxPayloadBytes;
-  int16_t             maxPayloadSizeBytes;
-
-  double                  lastLPCVec[UB_LPC_ORDER];
-  int16_t             numBytesUsed;
-  int16_t             lastJitterInfo;
-} ISACUBEncStruct;
-
-
-
-typedef struct {
-
-  Bitstr          bitstr_obj;
-  MaskFiltstr     maskfiltstr_obj;
-  PostFiltBankstr postfiltbankstr_obj;
-  PitchFiltstr    pitchfiltstr_obj;
-  FFTstr          fftstr_obj;
-
-} ISACLBDecStruct;
-
-typedef struct {
-
-  Bitstr          bitstr_obj;
-  MaskFiltstr     maskfiltstr_obj;
-  PostFiltBankstr postfiltbankstr_obj;
-  FFTstr          fftstr_obj;
-
-} ISACUBDecStruct;
-
-
-
-typedef struct {
-
-  ISACLBEncStruct ISACencLB_obj;
-  ISACLBDecStruct ISACdecLB_obj;
-} ISACLBStruct;
-
-
-typedef struct {
-
-  ISACUBEncStruct ISACencUB_obj;
-  ISACUBDecStruct ISACdecUB_obj;
-} ISACUBStruct;
-
-/*
-  This struct is used to take a snapshot of the entropy coder and LPC gains
-  right before encoding LPC gains. This allows us to go back to that state
-  if we like to limit the payload size.
-*/
-typedef struct {
-  /* 6 lower-band & 6 upper-band */
-  double       loFiltGain[SUBFRAMES];
-  double       hiFiltGain[SUBFRAMES];
-  /* Upper boundary of interval W */
-  uint32_t W_upper;
-  uint32_t streamval;
-  /* Index to the current position in bytestream */
-  uint32_t stream_index;
-  uint8_t  stream[3];
-} transcode_obj;
-
-typedef struct {
-  // TODO(kwiberg): The size of these tables could be reduced by storing floats
-  // instead of doubles, and by making use of the identity cos(x) =
-  // sin(x+pi/2). They could also be made global constants that we fill in at
-  // compile time.
-  double costab1[FRAMESAMPLES_HALF];
-  double sintab1[FRAMESAMPLES_HALF];
-  double costab2[FRAMESAMPLES_QUARTER];
-  double sintab2[FRAMESAMPLES_QUARTER];
-} TransformTables;
-
-typedef struct {
-  // lower-band codec instance
-  ISACLBStruct              instLB;
-  // upper-band codec instance
-  ISACUBStruct              instUB;
-
-  // Bandwidth Estimator and model for the rate.
-  BwEstimatorstr            bwestimator_obj;
-  RateModel                 rate_data_obj;
-  double                    MaxDelay;
-
-  /* 0 = adaptive; 1 = instantaneous */
-  int16_t               codingMode;
-
-  // overall bottleneck of the codec
-  int32_t               bottleneck;
-
-  // QMF Filter state
-  int32_t               analysisFBState1[FB_STATE_SIZE_WORD32];
-  int32_t               analysisFBState2[FB_STATE_SIZE_WORD32];
-  int32_t               synthesisFBState1[FB_STATE_SIZE_WORD32];
-  int32_t               synthesisFBState2[FB_STATE_SIZE_WORD32];
-
-  // Error Code
-  int16_t               errorCode;
-
-  // bandwidth of the encoded audio 8, 12 or 16 kHz
-  enum ISACBandwidth        bandwidthKHz;
-  // Sampling rate of audio, encoder and decode,  8 or 16 kHz
-  enum IsacSamplingRate encoderSamplingRateKHz;
-  enum IsacSamplingRate decoderSamplingRateKHz;
-  // Flag to keep track of initializations, lower & upper-band
-  // encoder and decoder.
-  int16_t               initFlag;
-
-  // Flag to to indicate signal bandwidth switch
-  int16_t               resetFlag_8kHz;
-
-  // Maximum allowed rate, measured in Bytes per 30 ms.
-  int16_t               maxRateBytesPer30Ms;
-  // Maximum allowed payload-size, measured in Bytes.
-  int16_t               maxPayloadSizeBytes;
-  /* The expected sampling rate of the input signal. Valid values are 16000
-   * and 32000. This is not the operation sampling rate of the codec. */
-  uint16_t in_sample_rate_hz;
-
-  // Trig tables for WebRtcIsac_Time2Spec and WebRtcIsac_Spec2time.
-  TransformTables transform_tables;
-} ISACMainStruct;
-
-#endif /* WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_MAIN_SOURCE_STRUCTS_H_ */
diff --git a/modules/audio_coding/codecs/isac/main/source/transform.c b/modules/audio_coding/codecs/isac/main/source/transform.c
deleted file mode 100644
index 8992897..0000000
--- a/modules/audio_coding/codecs/isac/main/source/transform.c
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- *  Copyright (c) 2011 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 "settings.h"
-#include "fft.h"
-#include "codec.h"
-#include "os_specific_inline.h"
-#include <math.h>
-
-void WebRtcIsac_InitTransform(TransformTables* tables) {
-  int k;
-  double fact, phase;
-
-  fact = PI / (FRAMESAMPLES_HALF);
-  phase = 0.0;
-  for (k = 0; k < FRAMESAMPLES_HALF; k++) {
-    tables->costab1[k] = cos(phase);
-    tables->sintab1[k] = sin(phase);
-    phase += fact;
-  }
-
-  fact = PI * ((double) (FRAMESAMPLES_HALF - 1)) / ((double) FRAMESAMPLES_HALF);
-  phase = 0.5 * fact;
-  for (k = 0; k < FRAMESAMPLES_QUARTER; k++) {
-    tables->costab2[k] = cos(phase);
-    tables->sintab2[k] = sin(phase);
-    phase += fact;
-  }
-}
-
-void WebRtcIsac_Time2Spec(const TransformTables* tables,
-                          double* inre1,
-                          double* inre2,
-                          int16_t* outreQ7,
-                          int16_t* outimQ7,
-                          FFTstr* fftstr_obj) {
-  int k;
-  int dims[1];
-  double tmp1r, tmp1i, xr, xi, yr, yi, fact;
-  double tmpre[FRAMESAMPLES_HALF], tmpim[FRAMESAMPLES_HALF];
-
-
-  dims[0] = FRAMESAMPLES_HALF;
-
-
-  /* Multiply with complex exponentials and combine into one complex vector */
-  fact = 0.5 / sqrt(FRAMESAMPLES_HALF);
-  for (k = 0; k < FRAMESAMPLES_HALF; k++) {
-    tmp1r = tables->costab1[k];
-    tmp1i = tables->sintab1[k];
-    tmpre[k] = (inre1[k] * tmp1r + inre2[k] * tmp1i) * fact;
-    tmpim[k] = (inre2[k] * tmp1r - inre1[k] * tmp1i) * fact;
-  }
-
-
-  /* Get DFT */
-  WebRtcIsac_Fftns(1, dims, tmpre, tmpim, -1, 1.0, fftstr_obj);
-
-  /* Use symmetry to separate into two complex vectors and center frames in time around zero */
-  for (k = 0; k < FRAMESAMPLES_QUARTER; k++) {
-    xr = tmpre[k] + tmpre[FRAMESAMPLES_HALF - 1 - k];
-    yi = -tmpre[k] + tmpre[FRAMESAMPLES_HALF - 1 - k];
-    xi = tmpim[k] - tmpim[FRAMESAMPLES_HALF - 1 - k];
-    yr = tmpim[k] + tmpim[FRAMESAMPLES_HALF - 1 - k];
-
-    tmp1r = tables->costab2[k];
-    tmp1i = tables->sintab2[k];
-    outreQ7[k] = (int16_t)WebRtcIsac_lrint((xr * tmp1r - xi * tmp1i) * 128.0);
-    outimQ7[k] = (int16_t)WebRtcIsac_lrint((xr * tmp1i + xi * tmp1r) * 128.0);
-    outreQ7[FRAMESAMPLES_HALF - 1 - k] = (int16_t)WebRtcIsac_lrint((-yr * tmp1i - yi * tmp1r) * 128.0);
-    outimQ7[FRAMESAMPLES_HALF - 1 - k] = (int16_t)WebRtcIsac_lrint((-yr * tmp1r + yi * tmp1i) * 128.0);
-  }
-}
-
-void WebRtcIsac_Spec2time(const TransformTables* tables,
-                          double* inre,
-                          double* inim,
-                          double* outre1,
-                          double* outre2,
-                          FFTstr* fftstr_obj) {
-  int k;
-  double tmp1r, tmp1i, xr, xi, yr, yi, fact;
-
-  int dims;
-
-  dims = FRAMESAMPLES_HALF;
-
-  for (k = 0; k < FRAMESAMPLES_QUARTER; k++) {
-    /* Move zero in time to beginning of frames */
-    tmp1r = tables->costab2[k];
-    tmp1i = tables->sintab2[k];
-    xr = inre[k] * tmp1r + inim[k] * tmp1i;
-    xi = inim[k] * tmp1r - inre[k] * tmp1i;
-    yr = -inim[FRAMESAMPLES_HALF - 1 - k] * tmp1r - inre[FRAMESAMPLES_HALF - 1 - k] * tmp1i;
-    yi = -inre[FRAMESAMPLES_HALF - 1 - k] * tmp1r + inim[FRAMESAMPLES_HALF - 1 - k] * tmp1i;
-
-    /* Combine into one vector,  z = x + j * y */
-    outre1[k] = xr - yi;
-    outre1[FRAMESAMPLES_HALF - 1 - k] = xr + yi;
-    outre2[k] = xi + yr;
-    outre2[FRAMESAMPLES_HALF - 1 - k] = -xi + yr;
-  }
-
-
-  /* Get IDFT */
-  WebRtcIsac_Fftns(1, &dims, outre1, outre2, 1, FRAMESAMPLES_HALF, fftstr_obj);
-
-
-  /* Demodulate and separate */
-  fact = sqrt(FRAMESAMPLES_HALF);
-  for (k = 0; k < FRAMESAMPLES_HALF; k++) {
-    tmp1r = tables->costab1[k];
-    tmp1i = tables->sintab1[k];
-    xr = (outre1[k] * tmp1r - outre2[k] * tmp1i) * fact;
-    outre2[k] = (outre2[k] * tmp1r + outre1[k] * tmp1i) * fact;
-    outre1[k] = xr;
-  }
-}
diff --git a/modules/audio_coding/codecs/isac/main/test/QA/runiSACLongtest.txt b/modules/audio_coding/codecs/isac/main/test/QA/runiSACLongtest.txt
deleted file mode 100644
index 3f05224..0000000
--- a/modules/audio_coding/codecs/isac/main/test/QA/runiSACLongtest.txt
+++ /dev/null
@@ -1,433 +0,0 @@
-#!/bin/bash
-(set -o igncr) 2>/dev/null && set -o igncr; # force bash to ignore \r character
-
-
-
-if  [ "$1" = "x64" ] || [ "$2" = "x64" ] || [ "$#" -eq 0 ]
-    then
-    PLATFORM=_X64
-    ISAC=../x64/Release/ReleaseTest-API_2005.exe
-elif [ "$1" = "LINUX" ] || [ "$2" = "LINUX" ]
-    then
-    PLATFORM=_linux
-    ISAC=../ReleaseTest-API/isacswtest
-else
-    PLATFORM=_2005
-    ISAC=../win32/Release/ReleaseTest-API_2005.exe
-fi
-
-if  [ "$#" -eq 0 ] || [ "$1" = "all" ] || [ "$1" = "wb" ]
-    then
-    LOGFILE=logNormal"$PLATFORM".txt
-    echo "START ISAC WB TEST" > $LOGFILE
-    echo >> $LOGFILE
-
-    INFILES=$(cat InputFiles.txt)
-    SUBSET=$(cat InputFilesFew.txt)
-    CHANNELFILES=$(cat ChannelFiles.txt)
-    CHANNELLIST=($(cat ChannelFiles.txt))
-    INDIR=../data/orig
-    OUTDIR=../dataqa"$PLATFORM"
-    mkdir -p $OUTDIR
-    rm -f $OUTDIR/*
-    
-    idx=0
-    RATE=10000
-    FRAMESIZE=30
-    
-
-    for file in $INFILES # loop over all input files
-      do
-      
-      echo "Input file: " $file
-      echo "-----------------------------------"
-      echo "Instantaneous with RATE " $RATE ", and Frame-size " $FRAMESIZE
-      $ISAC -I -B $RATE -FL $FRAMESIZE -FS 16 $INDIR/"$file" $OUTDIR/i_"$FRAMESIZE"_"$RATE"_"$file" >> $LOGFILE
-      echo
-      
-      name="${CHANNELLIST[$idx]}"
-      echo "Adaptive with channel file: " $name 
-      
-      $ISAC -B $INDIR/${CHANNELLIST[$idx]} -FS 16 $INDIR/"$file" $OUTDIR/a_${name%.*}_"$file" >> $LOGFILE
-      
-      echo
-      echo
-      
-#     alternate between 30 & 60 ms.
-      if [ $FRAMESIZE -eq 30 ]
-	  then
-	  FRAMESIZE=60
-      else
-	  FRAMESIZE=30
-      fi
-      
-#     rate between 10000 to 32000 bits/sec
-      if [ $RATE -le 30000 ]
-	  then
-	  let "RATE=RATE+2000"
-      else
-	  let "RATE=10000"
-      fi
-      
-#     there are only three channel file
-      if [ $idx -ge 2 ]; then
-	  idx=0
-      else
-	  let "idx=idx+1"
-      fi
-      
-    done
-
-    idx=0
-    
-#   loop over the subset of input files
-    for file in $SUBSET 
-      do
-      
-      if [ $idx -eq 0 ]; then
-	  $ISAC -B $INDIR/${CHANNELLIST[0]} -FL 30 -FIXED_FL -FS 16 $INDIR/"$file" $OUTDIR/a30_"$file" >> $LOGFILE
-	  idx=1
-      else
-	  $ISAC -B $INDIR/${CHANNELLIST[0]} -FL 60 -FIXED_FL -FS 16 $INDIR/"$file" $OUTDIR/a60_"$file" >> $LOGFILE
-	  idx=0
-      fi
-    done
-
-    $ISAC -B $INDIR/${CHANNELLIST[0]} -INITRATE 25000 -FL 30 -FS 16 $INDIR/"$file" $OUTDIR/a60_Init25kbps_"$file" >> $LOGFILE
-
-    echo
-    echo WIDEBAND DONE!
-    echo
-    echo
-fi
-
-if  [ "$#" -eq 0 ] || [ "$1" = "all" ] || [ "$1" = "swb" ]
-    then
-
-    LOGFILE=logNormal_SWB"$PLATFORM".txt
-    echo "START ISAC SWB TEST" > $LOGFILE
-    echo >> $LOGFILE
-
-    echo STARTING TO TEST SUPER-WIDEBAND
-    
-    INFILES=$(cat InputFilesSWB.txt)
-    INDIR=../data/origswb
-    OUTDIR=../dataqaswb"$PLATFORM"
-    mkdir -p $OUTDIR
-    rm -f $OUTDIR/*
-    
-    for file in $INFILES
-      do
-      echo
-      echo "Input file: " $file
-      echo "--------------------------------"
-      for RATE in 12000 20000 32000 38000 45000 50000 56000  
-	do
-	
-	echo "Rate " $RATE
-	$ISAC -I -B $RATE -FL 30 -FS 32 $INDIR/"$file" $OUTDIR/swb_"$RATE"_"$file" >> $LOGFILE
-	echo
-	
-      done
-  
-    done
-fi
-
-if  [ "$#" -eq 0 ] || [ "$1" = "all" ] || [ "$1" = "API" ]
-    then
-
-    LOGFILE_API=logNormal_API"$PLATFORM".txt
-    echo
-    echo
-    echo "START ISAC API TEST" > $LOGFILE_API
-    echo >> $LOGFILE_API
-    idx=1
-    echo "                            Test Enforcement of frame-size"
-    echo "========================================================================================"
-    mkdir -p ../FrameSizeLim"$PLATFORM"
-    rm -f ../FrameSizeLim"$PLATFORM"/*
-    echo
-    echo "-- No enforcement; BN 10000"
-    echo
-    $ISAC -B 10000 -FS 16 ../data/orig/speech_and_misc_WB.pcm \
-	../FrameSizeLim"$PLATFORM"/APITest_"$idx".pcm >> $LOGFILE_API
-    let "idx=idx+1"
-    echo
-    echo
-    echo "-- Now Enforce 30 ms frame size with the same bottleneck"
-    echo "There should not be any 60 ms frame"
-    echo
-    $ISAC -B 10000 -FL 30 -FIXED_FL -FS 16 ../data/orig/speech_and_misc_WB.pcm \
-	../FrameSizeLim"$PLATFORM"/APITest_"$idx".pcm >> $LOGFILE_API
-    let "idx=idx+1"
-    echo
-    echo
-    echo "-- No enforcement; BN 32000"
-    echo
-    $ISAC -B 32000 -FS 16 ../data/orig/speech_and_misc_WB.pcm \
-	../FrameSizeLim"$PLATFORM"/APITest_"$idx".pcm >> $LOGFILE_API
-    let "idx=idx+1"
-    echo
-    echo
-    echo "-- Now Enforce 60 ms frame size with the same bottleneck"
-    echo "There should not be any 30 ms frame"
-    echo 
-    $ISAC -B 32000 -FL 60 -FIXED_FL -FS 16 ../data/orig/speech_and_misc_WB.pcm \
-	../FrameSizeLim"$PLATFORM"/APITest_"$idx".pcm >> $LOGFILE_API
-    let "idx=idx+1"
-    echo
-    echo
-    echo
-    echo
-    echo
-
-    echo "                           Test Limiting of Payload Size and Rate"
-    echo "========================================================================================"
-    mkdir -p ../PayloadLim"$PLATFORM"
-    rm -f ../PayloadLim"$PLATFORM"/*
-    echo
-    echo
-    echo "-- No Limit, frame-size 60 ms, WIDEBAND"
-    echo 
-    $ISAC -I -B 32000 -FL 60 -FS 16                ../data/orig/speech_and_misc_WB.pcm \
-	../PayloadLim"$PLATFORM"/APITest_"$idx".pcm >> $LOGFILE_API
-    let "idx=idx+1"
-    echo
-    echo
-    echo "-- Payload-size limit of 250, frame-size 60 ms, WIDEBAND"
-    echo 
-    $ISAC -I -B 32000 -FL 60 -FS 16 -MAX 250       ../data/orig/speech_and_misc_WB.pcm \
-	../PayloadLim"$PLATFORM"/APITest_"$idx".pcm >> $LOGFILE_API
-    let "idx=idx+1"
-    echo
-    echo
-    echo "-- Rate limit of 33 kbps for 60 ms frame-size"
-    echo
-    $ISAC -I -B 32000 -FL 60 -FS 16 -MAXRATE 33000 ../data/orig/speech_and_misc_WB.pcm \
-	../PayloadLim"$PLATFORM"/APITest_"$idx".pcm >> $LOGFILE_API
-    let "idx=idx+1"
-    echo 
-    echo "________________________________________________________"
-    echo
-    echo
-
-    echo "-- No Limit, frame-size 30 ms, WIDEBAND"
-    echo 
-    $ISAC -I -B 32000 -FL 30 -FS 16                ../data/orig/speech_and_misc_WB.pcm \
-	../PayloadLim"$PLATFORM"/APITest_"$idx".pcm >> $LOGFILE_API
-    let "idx=idx+1"
-    echo
-    echo    
-    echo "-- Payload-size limit of 130, frame-size 30 ms, WIDEBAND"
-    echo 
-    $ISAC -I -B 32000 -FL 30 -FS 16 -MAX 130       ../data/orig/speech_and_misc_WB.pcm \
-	../PayloadLim"$PLATFORM"/APITest_"$idx".pcm >> $LOGFILE_API
-    let "idx=idx+1"
-    echo
-    echo
-    echo "-- Rate limit of 33 kbps for 30 ms frame-size, wideband"
-    echo
-    $ISAC -I -B 32000 -FL 30 -FS 16 -MAXRATE 33000 ../data/orig/speech_and_misc_WB.pcm \
-	../PayloadLim"$PLATFORM"/APITest_"$idx".pcm >> $LOGFILE_API
-    let "idx=idx+1"
-    echo
-    echo "________________________________________________________"
-    echo
-    echo
-
-    echo "-- No limit for 32 kbps, 30 ms, SUPER-WIDEBAND"
-    echo
-    $ISAC -I -B 32000 -FL 30 -FS 32          ../data/origswb/jstest_32.pcm \
-	../PayloadLim"$PLATFORM"/APITest_"$idx".pcm >> $LOGFILE_API
-    let "idx=idx+1"
-    echo
-    echo
-    echo "-- Payload limit of 130 bytes for 32 kbps, 30 ms, SUPER-WIDEBAND"
-    echo
-    $ISAC -I -B 32000 -FL 30 -FS 32 -MAX 130 ../data/origswb/jstest_32.pcm \
-	../PayloadLim"$PLATFORM"/APITest_"$idx".pcm >> $LOGFILE_API
-    let "idx=idx+1"
-    echo
-    echo "________________________________________________________"
-    echo
-    echo
-
-    echo "-- No limit, Rate 45 kbps, 30 ms, SUPER-WIDEBAND, 12 kHz"
-    echo
-    $ISAC -I -B 45000 -FL 30 -FS 32               ../data/origswb/jstest_32.pcm \
-	../PayloadLim"$PLATFORM"/APITest_"$idx".pcm >> $LOGFILE_API
-    let "idx=idx+1"
-    echo
-    echo
-    echo "-- Rate limit of 46 kbps for 42 kbps, 30 ms, SUPER-WIDEBAND, 12 kHz"
-    echo
-    $ISAC -I -B 45000 -FL 30 -FS 32 -MAXRATE 46000 ../data/origswb/jstest_32.pcm \
-	../PayloadLim"$PLATFORM"/APITest_"$idx".pcm >> $LOGFILE_API
-    let "idx=idx+1"
-    echo
-    echo
-    echo "-- Payload limit of 170 bytes for 45 kbps, 30 ms, SUPER-WIDEBAND, 12 kHz"
-    echo
-    $ISAC -I -B 45000 -FL 30 -FS 32 -MAX 170       ../data/origswb/jstest_32.pcm \
-	../PayloadLim"$PLATFORM"/APITest_"$idx".pcm >> $LOGFILE_API
-    let "idx=idx+1"
-    echo
-    echo "________________________________________________________"
-    echo
-    echo
-  
-    echo "-- No limit for 56 kbps, 30 ms, SUPER-WIDEBAND, 16 kHz"
-    echo
-    $ISAC -I -B 56000 -FL 30 -FS 32                ../data/origswb/jstest_32.pcm \
-	../PayloadLim"$PLATFORM"/APITest_"$idx".pcm >> $LOGFILE_API
-    let "idx=idx+1"
-    echo
-    echo
-    echo "-- Payload limit of 200 bytes for 56 kbps 30 ms, SUPER-WIDEBAND, 16 kHz"
-    echo
-    $ISAC -I -B 56000 -FL 30 -FS 32 -MAX 200       ../data/origswb/jstest_32.pcm \
-	../PayloadLim"$PLATFORM"/APITest_"$idx".pcm >> $LOGFILE_API
-    let "idx=idx+1"
-    echo
-    echo
-    echo "-- Rate limit of 57 kbps for 56 kbps 30 ms, SUPER-WIDEBAND, 16 kHz"
-    echo
-    $ISAC -I -B 56000 -FL 30 -FS 32 -MAXRATE 57000 ../data/origswb/jstest_32.pcm \
-	../PayloadLim"$PLATFORM"/APITest_"$idx".pcm >> $LOGFILE_API
-    let "idx=idx+1"
-    echo
-    echo "________________________________________________________"
-    echo
-    echo
-    echo
-    echo
-    echo
-    
-    echo "                                    Test Trans-Coding"
-    echo "========================================================================================"
-    mkdir -p ../Transcoding"$PLATFORM"
-    rm -f ../Transcoding"$PLATFORM"/*
-    echo
-    echo
-    echo "-- 20 kbps, 30 ms, WIDEBAND"
-    echo
-    $ISAC -I -B 20000 -FL 30 -FS 16          ../data/orig/speech_and_misc_WB.pcm \
-	../Transcoding"$PLATFORM"/APITest_refTrans20WB.pcm >> $LOGFILE_API
-    let "idx=idx+1"
-    echo
-    echo
-    
-    echo "-- 32 kbps trans-coding to 20 kbps, 30 ms, WIDEBAND"
-    echo
-    $ISAC -I -B 32000 -FL 30 -FS 16  -T 20000  ../Transcoding"$PLATFORM"/APITest_32T20.pcm \
-	../data/orig/speech_and_misc_WB.pcm ../Transcoding"$PLATFORM"/APITest_"$idx".pcm >> $LOGFILE_API
-    let "idx=idx+1"
-    echo
-    echo "________________________________________________________"
-
-    echo
-    echo
-    echo "-- 38 kbps, 30 ms, SUPER-WIDEBAND"
-    echo
-    $ISAC -I -B 38000 -FL 30 -FS 32          ../data/origswb/jstest_32.pcm \
-	../Transcoding"$PLATFORM"/APITest_refTrans38.pcm >> $LOGFILE_API
-    let "idx=idx+1"
-    echo
-    echo
-    
-    echo "-- 45 kbps trans-coding to 38 kbps, 30 ms, SUPER-WIDEBAND"
-    echo
-    $ISAC -I -B 45000 -FL 30 -FS 32  -T 38000  ../Transcoding"$PLATFORM"/APITest_45T38.pcm \
-	../data/origswb/jstest_32.pcm ../Transcoding"$PLATFORM"/APITest_"$idx".pcm >> $LOGFILE_API
-    let "idx=idx+1"
- 
-    echo
-    echo
-    echo "-- 20 kbps, 30 ms, SUPER-WIDEBAND"
-    echo
-    $ISAC -I -B 20000 -FL 30 -FS 32          ../data/origswb/jstest_32.pcm \
-	../Transcoding"$PLATFORM"/APITest_refTrans20SWB.pcm >> $LOGFILE_API
-    let "idx=idx+1"
-
-    echo
-    echo
-    
-    echo "-- 45 kbps trans-coding to 20 kbps, 30 ms, SUPER-WIDEBAND"
-    echo
-    $ISAC -I -B 45000 -FL 30 -FS 32  -T 20000  ../Transcoding"$PLATFORM"/APITest_45T20.pcm \
-	../data/origswb/jstest_32.pcm ../Transcoding"$PLATFORM"/APITest_"$idx".pcm >> $LOGFILE_API
-    let "idx=idx+1"
-    echo
-    echo "________________________________________________________"
-    echo
-    echo
-    echo "-- 50 kbps, 30 ms, SUPER-WIDEBAND"
-    echo
-    $ISAC -I -B 50000 -FL 30 -FS 32          ../data/origswb/jstest_32.pcm \
-	../Transcoding"$PLATFORM"/APITest_refTrans50.pcm >> $LOGFILE_API
-    let "idx=idx+1"
-    echo
-    echo
-    
-    echo "-- 56 kbps trans-coding to 50 kbps, 30 ms, SUPER-WIDEBAND"
-    echo
-    $ISAC -I -B 56000 -FL 30 -FS 32  -T 50000  ../Transcoding"$PLATFORM"/APITest_56T50.pcm \
-	../data/origswb/jstest_32.pcm ../Transcoding"$PLATFORM"/APITest_"$idx".pcm >> $LOGFILE_API
-    let "idx=idx+1"
-    echo
-    echo
-    
-    echo "-- 56 kbps trans-coding to 20 kbps, 30 ms, SUPER-WIDEBAND"
-    echo
-    $ISAC -I -B 56000 -FL 30 -FS 32  -T 20000 ../Transcoding"$PLATFORM"/APITest_56T20.pcm \
-	../data/origswb/jstest_32.pcm ../Transcoding"$PLATFORM"/APITest_"$idx".pcm >> $LOGFILE_API
-    let "idx=idx+1"
-    echo
-    echo "________________________________________________________"
-    echo
-    echo
-    echo 
-    echo
-    echo
-    
-    echo "                                         Test FEC"
-    echo "========================================================================================"
-    mkdir -p ../FEC"$PLATFORM"
-    rm -f ../FEC"$PLATFORM"/*
-    echo
-    echo
-    echo "-- 32 kbps with transcoding to 20kbps, 30 ms, WIDEBAND, 10% packet loss"
-    $ISAC -I -B 32000 -FL 30 -FS 16 -PL 10 -T 20000 ../FEC"$PLATFORM"/APITest_PL10_WB30_T20.pcm \
-	../data/orig/speech_and_misc_WB.pcm ../FEC"$PLATFORM"/APITest_PL10_WB30.pcm >> $LOGFILE_API
-    let "idx=idx+1"
-    echo
-    echo
-    
-    echo "-- 32 kbps, 60 ms, WIDEBAND, 10% packet loss"
-    $ISAC -I -B 32000 -FL 60 -FS 16 -PL 10 ../data/orig/speech_and_misc_WB.pcm \
-	../FEC"$PLATFORM"/APITest_PL10_WB60.pcm >> $LOGFILE_API
-    let "idx=idx+1"
-    echo
-    echo
-    
-    echo "-- 32 kbps with transcoding to 20 kbps, 30 ms, SUPER-WIDEBAND, 10% packet loss"
-    $ISAC -I -B 32000 -FL 30 -FS 32 -PL 10 -T 20000 ../FEC"$PLATFORM"/APITest_PL10_SWB_8kHz_T20.pcm \
-	../data/origswb/jstest_32.pcm ../FEC"$PLATFORM"/APITest_PL10_SWB_8kHz.pcm >> $LOGFILE_API
-    let "idx=idx+1"
-    echo
-    echo
-
-    echo "-- 45 kbps with Trascoding to 38 kbps, 30 ms, SUPER-WIDEBAND, 10% packet loss"
-    $ISAC -I -B 45000 -FL 30 -FS 32 -PL 10 -T 38000 ../FEC"$PLATFORM"/APITest_PL10_SWB_12kHz_T38.pcm \
-	../data/origswb/jstest_32.pcm ../FEC"$PLATFORM"/APITest_PL10_SWB_12kHz.pcm >> $LOGFILE_API
-    let "idx=idx+1"
-    echo
-    echo
-
-    echo "-- 56 kbps with transcoding to 50 kbps, 30 ms, SUPER-WIDEBAND, 10% packet loss"
-    $ISAC -I -B 56000 -FL 30 -FS 32 -PL 10 -T 50000 ../FEC"$PLATFORM"/APITest_PL10_SWB_16kHz_T50.pcm \
-	../data/origswb/jstest_32.pcm ../FEC"$PLATFORM"/APITest_PL10_SWB_16kHz.pcm >> $LOGFILE_API
-    let "idx=idx+1"
-    echo
-    echo
-fi
diff --git a/modules/audio_coding/codecs/isac/main/test/QA/runiSACfault.txt b/modules/audio_coding/codecs/isac/main/test/QA/runiSACfault.txt
deleted file mode 100644
index 63829a4..0000000
--- a/modules/audio_coding/codecs/isac/main/test/QA/runiSACfault.txt
+++ /dev/null
@@ -1,80 +0,0 @@
-#!/bin/bash
-(set -o igncr) 2>/dev/null && set -o igncr; # force bash to ignore \r character????? ?????? 
-if  [ "$1" = "x64" ] || [ "$#" -eq 0 ]
-    then
-    PLATFORM=_X64
-    ISAC=../x64/Release/ReleaseTest-API_2005.exe
-elif [ "$1" = "2005" ]
-	then
-    PLATFORM=_2005
-    ISAC=../win32/Release/ReleaseTest-API_2005.exe
-elif [ "$1" == "LINUX" ]
-	then
-    PLATFORM=_linux
-    ISAC=../ReleaseTest-API/isacswtest
-else
-	echo Unknown Platform
-	exit 2
-fi
-
-LOGFILE=logfault$PLATFORM.txt
-echo "START FAULT TEST" > $LOGFILE
-
-
-INFILES=$(cat InputFiles.txt)
-SUBSET=$(cat InputFilesFew.txt)
-CHANNELFILES=$(cat ChannelFiles.txt)
-CHANNELLIST=($(cat ChannelFiles.txt))
-INDIR=../data/orig
-INDIRSWB=../data/origswb
-OUTDIR=../dataqaft$PLATFORM
-mkdir -p $OUTDIR
-
-#maximum Target rate for different bandwidth
-TARGETRATE=( 32000 32000 44000 56000 )
-SAMPFREQ=( 16 32 32 32 )
-FAULTTEST=(1 2 3 4 5 6 7 9)
-
-index1=0
-
-file_wb=../data/orig/16kHz.pcm
-file_swb=../data/origswb/32kHz.pcm
-
-for idx in 0 1 2 3 
-  do
-# Fault test
-  echo
-  echo "Sampling Frequency " ${SAMPFREQ[idx]} "kHz, Rate " ${TARGETRATE[idx]} "bps."
-  echo "---------------------------------------------------"
-  if [ ${SAMPFREQ[idx]} -eq 16 ]; then
-    file=$file_wb
-  else
-    file=$file_swb
-  fi
-
-  for testnr in ${FAULTTEST[*]}
-    do
-    echo "Running Fault Test " $testnr
-    $ISAC -I -B "${TARGETRATE[idx]}" -F $testnr -FS "${SAMPFREQ[idx]}" "$file" \
-	$OUTDIR/ft"$testnr"_"${TARGETRATE[idx]}"_"${SAMPFREQ[idx]}".pcm >> LOGFILE
-    echo
-    
-  done
-  
-# Fault test number 10, error in bitstream
-  echo "Running Fault Test 10"
-  $ISAC -I -B "${TARGETRATE[idx]}" -F 10        -FS "${SAMPFREQ[idx]}" "$file" \
-    $OUTDIR/ft10_"${TARGETRATE[idx]}"_"${SAMPFREQ[idx]}".pcm >> LOGFILE
-  echo
-  echo "Running Fault Test 10 with packetloss"
-  $ISAC -I -B "${TARGETRATE[idx]}" -F 10 -PL 10 -FS "${SAMPFREQ[idx]}" "$file" \
-    $OUTDIR/ft10plc_"${TARGETRATE[idx]}"_"${SAMPFREQ[idx]}".pcm >> LOGFILE
-  echo
-done
-
-echo 
-echo
-echo DONE!
-  
-
-
diff --git a/modules/audio_coding/codecs/isac/main/test/QA/runiSACfixfloat.txt b/modules/audio_coding/codecs/isac/main/test/QA/runiSACfixfloat.txt
deleted file mode 100644
index 4cda78e..0000000
--- a/modules/audio_coding/codecs/isac/main/test/QA/runiSACfixfloat.txt
+++ /dev/null
@@ -1,47 +0,0 @@
-#!/bin/bash
-(set -o igncr) 2>/dev/null && set -o igncr; # force bash to ignore \r character
-
-LOGFILE=logfxfl.txt
-echo "START FIX-FLOAT TEST" > $LOGFILE
-
-
-ISACFIXFLOAT=../../../fix/test/testFixFloat.exe
-
-INFILES=$(cat InputFiles.txt)
-SUBSET=$(cat InputFilesFew.txt)
-CHANNELFILES=$(cat ChannelFiles.txt)
-CHANNELLIST=($(cat ChannelFiles.txt))
-INDIR=../data/orig
-OUTDIR=../dataqafxfl
-mkdir -p $OUTDIR
-
-index1=0
-
-for file in $INFILES # loop over all input files
-  do
-  
-  for channel in $CHANNELFILES
-	do
-	let "index1=index1+1"
-
-	$ISACFIXFLOAT $INDIR/$channel -m 1 -PLC $INDIR/"$file" $OUTDIR/flfx$index1"$file" >> $LOGFILE
-	$ISACFIXFLOAT $INDIR/$channel -m 2 -PLC $INDIR/"$file" $OUTDIR/fxfl$index1"$file" >> $LOGFILE
-  done
-
-done
-
-index1=0
-
-for file in $SUBSET # loop over the subset of input files
-  do
-	let "index1=index1+1"
-	$ISACFIXFLOAT $INDIR/$channel -m 1 -NB 1 $INDIR/"$file" $OUTDIR/flfxnb1_$index1"$file" >> $LOGFILE
-	$ISACFIXFLOAT $INDIR/$channel -m 2 -NB 1 $INDIR/"$file" $OUTDIR/fxflnb1_$index1"$file" >> $LOGFILE
-	$ISACFIXFLOAT $INDIR/$channel -m 1 -NB 2 -PLC $INDIR/"$file" $OUTDIR/flfxnb2_$index1"$file" >> $LOGFILE
-	$ISACFIXFLOAT $INDIR/$channel -m 2 -NB 2 -PLC $INDIR/"$file" $OUTDIR/fxflnb2_$index1"$file" >> $LOGFILE
-done
-
-echo DONE!
-
-
-
diff --git a/modules/audio_coding/codecs/isac/main/test/ReleaseTest-API/ReleaseTest-API.cc b/modules/audio_coding/codecs/isac/main/test/ReleaseTest-API/ReleaseTest-API.cc
deleted file mode 100644
index 9c11d23..0000000
--- a/modules/audio_coding/codecs/isac/main/test/ReleaseTest-API/ReleaseTest-API.cc
+++ /dev/null
@@ -1,949 +0,0 @@
-/*
- *  Copyright (c) 2012 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.
- */
-
-// ReleaseTest-API.cpp : Defines the entry point for the console application.
-//
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <time.h>
-#include <ctype.h>
-#include <iostream>
-
-/* include API */
-#include "isac.h"
-#include "utility.h"
-#include "webrtc/rtc_base/format_macros.h"
-
-/* Defines */
-#define SEED_FILE "randseed.txt" /* Used when running decoder on garbage data */
-#define MAX_FRAMESAMPLES 960     /* max number of samples per frame
-                                    (= 60 ms frame & 16 kHz) or
-                                    (= 30 ms frame & 32 kHz) */
-#define FRAMESAMPLES_10ms 160 /* number of samples per 10ms frame */
-#define SWBFRAMESAMPLES_10ms 320
-//#define FS 16000 /* sampling frequency (Hz) */
-
-#ifdef WIN32
-#ifndef CLOCKS_PER_SEC
-#define CLOCKS_PER_SEC 1000 /* Runtime statistics */
-#endif
-#endif
-
-using namespace std;
-
-int main(int argc, char* argv[]) {
-  char inname[100], outname[100], bottleneck_file[100], vadfile[100];
-  FILE* inp, *outp, * f_bn = NULL, * vadp = NULL, *bandwidthp;
-  int framecnt, endfile;
-
-  size_t i;
-  int errtype, VADusage = 0, packetLossPercent = 0;
-  int16_t CodingMode;
-  int32_t bottleneck = 0;
-  int framesize = 30; /* ms */
-  int cur_framesmpls, err;
-
-  /* Runtime statistics */
-  double starttime, runtime, length_file;
-
-  size_t stream_len = 0;
-  int declen = 0, declenTC = 0;
-  bool lostFrame = false;
-
-  int16_t shortdata[SWBFRAMESAMPLES_10ms];
-  int16_t vaddata[SWBFRAMESAMPLES_10ms * 3];
-  int16_t decoded[MAX_FRAMESAMPLES << 1];
-  int16_t decodedTC[MAX_FRAMESAMPLES << 1];
-  uint16_t streamdata[500];
-  int16_t speechType[1];
-  int16_t rateBPS = 0;
-  int16_t fixedFL = 0;
-  int16_t payloadSize = 0;
-  int32_t payloadRate = 0;
-  int setControlBWE = 0;
-  short FL, testNum;
-  char version_number[20];
-  FILE* plFile;
-  int32_t sendBN;
-
-#if !defined(NDEBUG)
-  FILE* fy;
-  double kbps;
-#endif
-  size_t totalbits = 0;
-  int totalsmpls = 0;
-
-  /* If use GNS file */
-  FILE* fp_gns = NULL;
-  char gns_file[100];
-  size_t maxStreamLen30 = 0;
-  size_t maxStreamLen60 = 0;
-  short sampFreqKHz = 32;
-  short samplesIn10Ms;
-  short useAssign = 0;
-  // FILE logFile;
-  bool doTransCoding = false;
-  int32_t rateTransCoding = 0;
-  uint8_t streamDataTransCoding[1200];
-  size_t streamLenTransCoding = 0;
-  FILE* transCodingFile = NULL;
-  FILE* transcodingBitstream = NULL;
-  size_t numTransCodingBytes = 0;
-
-  /* only one structure used for ISAC encoder */
-  ISACStruct* ISAC_main_inst = NULL;
-  ISACStruct* decoderTransCoding = NULL;
-
-  BottleNeckModel BN_data;
-
-#if !defined(NDEBUG)
-  fy = fopen("bit_rate.dat", "w");
-  fclose(fy);
-  fy = fopen("bytes_frames.dat", "w");
-  fclose(fy);
-#endif
-
-  /* Handling wrong input arguments in the command line */
-  if ((argc < 3) || (argc > 17)) {
-    printf("\n\nWrong number of arguments or flag values.\n\n");
-
-    printf("\n");
-    WebRtcIsac_version(version_number);
-    printf("iSAC-swb version %s \n\n", version_number);
-
-    printf("Usage:\n\n");
-    printf("%s [-I] bottleneck_value infile outfile \n\n", argv[0]);
-    printf("with:\n");
-    printf("[-FS num]       : sampling frequency in kHz, valid values are\n");
-    printf("                  16 & 32, with 16 as default.\n");
-    printf("[-I]            : if -I option is specified, the coder will use\n");
-    printf("                  an instantaneous Bottleneck value. If not, it\n");
-    printf("                  will be an adaptive Bottleneck value.\n");
-    printf("[-assign]       : Use Assign API.\n");
-    printf("[-B num]        : the value of the bottleneck provided either\n");
-    printf("                  as a fixed value in bits/sec (e.g. 25000) or\n");
-    printf("                  read from a file (e.g. bottleneck.txt)\n");
-    printf("[-INITRATE num] : Set a new value for initial rate. Note! Only\n");
-    printf("                  used in adaptive mode.\n");
-    printf("[-FL num]       : Set (initial) frame length in msec. Valid\n");
-    printf("                  lengths are 30 and 60 msec.\n");
-    printf("[-FIXED_FL]     : Frame length will be fixed to initial value.\n");
-    printf("[-MAX num]      : Set the limit for the payload size of iSAC\n");
-    printf("                  in bytes. Minimum 100 maximum 400.\n");
-    printf("[-MAXRATE num]  : Set the maxrate for iSAC in bits per second.\n");
-    printf("                  Minimum 32000, maximum 53400.\n");
-    printf("[-F num]        : if -F option is specified, the test function\n");
-    printf("                  will run the iSAC API fault scenario\n");
-    printf("                  specified by the supplied number.\n");
-    printf("                  F 1 - Call encoder prior to init encoder call\n");
-    printf("                  F 2 - Call decoder prior to init decoder call\n");
-    printf("                  F 3 - Call decoder prior to encoder call\n");
-    printf("                  F 4 - Call decoder with a too short coded\n");
-    printf("                        sequence\n");
-    printf("                  F 5 - Call decoder with a too long coded\n");
-    printf("                        sequence\n");
-    printf("                  F 6 - Call decoder with random bit stream\n");
-    printf("                  F 7 - Call init encoder/decoder at random\n");
-    printf("                        during a call\n");
-    printf("                  F 8 - Call encoder/decoder without having\n");
-    printf("                        allocated memory for encoder/decoder\n");
-    printf("                        instance\n");
-    printf("                  F 9 - Call decodeB without calling decodeA\n");
-    printf("                  F 10 - Call decodeB with garbage data\n");
-    printf("[-PL num]       : if -PL option is specified \n");
-    printf("[-T rate file]  : test trans-coding with target bottleneck\n");
-    printf("                  'rate' bits/sec\n");
-    printf("                  the output file is written to 'file'\n");
-    printf("[-LOOP num]     : number of times to repeat coding the input\n");
-    printf("                  file for stress testing\n");
-    // printf("[-CE num]       : Test of APIs used by Conference Engine.\n");
-    // printf("                  CE 1 - getNewBitstream, getBWE \n");
-    // printf("                  (CE 2 - RESERVED for transcoding)\n");
-    // printf("                  CE 3 - getSendBWE, setSendBWE.  \n");
-    // printf("-L filename     : write the logging info into file
-    // (appending)\n");
-    printf("infile          :   Normal speech input file\n");
-    printf("outfile         :   Speech output file\n");
-    exit(0);
-  }
-
-  /* Print version number */
-  printf("-------------------------------------------------\n");
-  WebRtcIsac_version(version_number);
-  printf("iSAC version %s \n\n", version_number);
-
-  /* Loop over all command line arguments */
-  CodingMode = 0;
-  testNum = 0;
-  useAssign = 0;
-  // logFile = NULL;
-  char transCodingFileName[500];
-  int16_t totFileLoop = 0;
-  int16_t numFileLoop = 0;
-  for (i = 1; i + 2 < static_cast<size_t>(argc); i++) {
-    if (!strcmp("-LOOP", argv[i])) {
-      i++;
-      totFileLoop = (int16_t)atol(argv[i]);
-      if (totFileLoop <= 0) {
-        fprintf(stderr, "Invalid number of runs for the given input file, %d.",
-                totFileLoop);
-        exit(0);
-      }
-    }
-
-    if (!strcmp("-T", argv[i])) {
-      doTransCoding = true;
-      i++;
-      rateTransCoding = atoi(argv[i]);
-      i++;
-      strcpy(transCodingFileName, argv[i]);
-    }
-
-    /*Should we use assign API*/
-    if (!strcmp("-assign", argv[i])) {
-      useAssign = 1;
-    }
-
-    /* Set Sampling Rate */
-    if (!strcmp("-FS", argv[i])) {
-      i++;
-      sampFreqKHz = atoi(argv[i]);
-    }
-
-    /* Instantaneous mode */
-    if (!strcmp("-I", argv[i])) {
-      printf("Instantaneous BottleNeck\n");
-      CodingMode = 1;
-    }
-
-    /* Set (initial) bottleneck value */
-    if (!strcmp("-INITRATE", argv[i])) {
-      rateBPS = atoi(argv[i + 1]);
-      setControlBWE = 1;
-      if ((rateBPS < 10000) || (rateBPS > 32000)) {
-        printf("\n%d is not a initial rate. Valid values are in the range "
-               "10000 to 32000.\n", rateBPS);
-        exit(0);
-      }
-      printf("New initial rate: %d\n", rateBPS);
-      i++;
-    }
-
-    /* Set (initial) framelength */
-    if (!strcmp("-FL", argv[i])) {
-      framesize = atoi(argv[i + 1]);
-      if ((framesize != 30) && (framesize != 60)) {
-        printf("\n%d is not a valid frame length. Valid length are 30 and 60 "
-               "msec.\n", framesize);
-        exit(0);
-      }
-      setControlBWE = 1;
-      printf("Frame Length: %d\n", framesize);
-      i++;
-    }
-
-    /* Fixed frame length */
-    if (!strcmp("-FIXED_FL", argv[i])) {
-      fixedFL = 1;
-      setControlBWE = 1;
-      printf("Fixed Frame Length\n");
-    }
-
-    /* Set maximum allowed payload size in bytes */
-    if (!strcmp("-MAX", argv[i])) {
-      payloadSize = atoi(argv[i + 1]);
-      printf("Maximum Payload Size: %d\n", payloadSize);
-      i++;
-    }
-
-    /* Set maximum rate in bytes */
-    if (!strcmp("-MAXRATE", argv[i])) {
-      payloadRate = atoi(argv[i + 1]);
-      printf("Maximum Rate in kbps: %d\n", payloadRate);
-      i++;
-    }
-
-    /* Test of fault scenarious */
-    if (!strcmp("-F", argv[i])) {
-      testNum = atoi(argv[i + 1]);
-      printf("Fault test: %d\n", testNum);
-      if (testNum < 1 || testNum > 10) {
-        printf("\n%d is not a valid Fault Scenario number. Valid Fault "
-               "Scenarios are numbered 1-10.\n", testNum);
-        exit(0);
-      }
-      i++;
-    }
-
-    /* Packet loss test */
-    if (!strcmp("-PL", argv[i])) {
-      if (isdigit(*argv[i + 1])) {
-        packetLossPercent = atoi(argv[i + 1]);
-        if ((packetLossPercent < 0) | (packetLossPercent > 100)) {
-          printf("\nInvalid packet loss perentage \n");
-          exit(0);
-        }
-        if (packetLossPercent > 0) {
-          printf("Simulating %d %% of independent packet loss\n",
-                 packetLossPercent);
-        } else {
-          printf("\nNo Packet Loss Is Simulated \n");
-        }
-      } else {
-        plFile = fopen(argv[i + 1], "rb");
-        if (plFile == NULL) {
-          printf("\n couldn't open the frameloss file: %s\n", argv[i + 1]);
-          exit(0);
-        }
-        printf("Simulating packet loss through the given channel file: %s\n",
-               argv[i + 1]);
-      }
-      i++;
-    }
-
-    /* Random packetlosses */
-    if (!strcmp("-rnd", argv[i])) {
-      srand((unsigned int)time(NULL));
-      printf("Random pattern in lossed packets \n");
-    }
-
-    /* Use gns file */
-    if (!strcmp("-G", argv[i])) {
-      sscanf(argv[i + 1], "%s", gns_file);
-      fp_gns = fopen(gns_file, "rb");
-      if (fp_gns == NULL) {
-        printf("Cannot read file %s.\n", gns_file);
-        exit(0);
-      }
-      i++;
-    }
-
-    // make it with '-B'
-    /* Get Bottleneck value */
-    if (!strcmp("-B", argv[i])) {
-      i++;
-      bottleneck = atoi(argv[i]);
-      if (bottleneck == 0) {
-        sscanf(argv[i], "%s", bottleneck_file);
-        f_bn = fopen(bottleneck_file, "rb");
-        if (f_bn == NULL) {
-          printf("Error No value provided for BottleNeck and cannot read file "
-                 "%s.\n", bottleneck_file);
-          exit(0);
-        } else {
-          printf("reading bottleneck rates from file %s\n\n", bottleneck_file);
-          if (fscanf(f_bn, "%d", &bottleneck) == EOF) {
-            /* Set pointer to beginning of file */
-            fseek(f_bn, 0L, SEEK_SET);
-            if (fscanf(f_bn, "%d", &bottleneck) == EOF) {
-              exit(0);
-            }
-          }
-
-          /* Bottleneck is a cosine function
-           * Matlab code for writing the bottleneck file:
-           * BottleNeck_10ms = 20e3 + 10e3 * cos((0:5999)/5999*2*pi);
-           * fid = fopen('bottleneck.txt', 'wb');
-           * fprintf(fid, '%d\n', BottleNeck_10ms); fclose(fid);
-           */
-        }
-      } else {
-        printf("\nfixed bottleneck rate of %d bits/s\n\n", bottleneck);
-      }
-    }
-    /* Run Conference Engine APIs */
-    //     Do not test it in the first release
-    //
-    //     if(!strcmp ("-CE", argv[i]))
-    //     {
-    //         testCE = atoi(argv[i + 1]);
-    //         if(testCE==1)
-    //         {
-    //             i++;
-    //             scale = (float)atof( argv[i+1] );
-    //         }
-    //         else if(testCE == 2)
-    //         {
-    //             printf("\nCE-test 2 (transcoding) not implemented.\n");
-    //             exit(0);
-    //         }
-    //         else if(testCE < 1 || testCE > 3)
-    //         {
-    //             printf("\n%d is not a valid CE-test number. Valid CE tests
-    //             are 1-3.\n", testCE);
-    //             exit(0);
-    //         }
-    //         printf("CE-test number: %d\n", testCE);
-    //         i++;
-    //     }
-  }
-
-  if (CodingMode == 0) {
-    printf("\nAdaptive BottleNeck\n");
-  }
-
-  switch (sampFreqKHz) {
-    case 16: {
-      printf("iSAC Wideband.\n");
-      samplesIn10Ms = FRAMESAMPLES_10ms;
-      break;
-    }
-    case 32: {
-      printf("iSAC Supper-Wideband.\n");
-      samplesIn10Ms = SWBFRAMESAMPLES_10ms;
-      break;
-    }
-    default:
-      printf("Unsupported sampling frequency %d kHz", sampFreqKHz);
-      exit(0);
-  }
-
-  /* Get Input and Output files */
-  sscanf(argv[argc - 2], "%s", inname);
-  sscanf(argv[argc - 1], "%s", outname);
-  printf("\nInput file: %s\n", inname);
-  printf("Output file: %s\n\n", outname);
-  if ((inp = fopen(inname, "rb")) == NULL) {
-    printf("  Error iSAC Cannot read file %s.\n", inname);
-    cout << flush;
-    exit(1);
-  }
-
-  if ((outp = fopen(outname, "wb")) == NULL) {
-    printf("  Error iSAC Cannot write file %s.\n", outname);
-    cout << flush;
-    getc(stdin);
-    exit(1);
-  }
-  if (VADusage) {
-    if ((vadp = fopen(vadfile, "rb")) == NULL) {
-      printf("  Error iSAC Cannot read file %s.\n", vadfile);
-      cout << flush;
-      exit(1);
-    }
-  }
-
-  if ((bandwidthp = fopen("bwe.pcm", "wb")) == NULL) {
-    printf("  Error iSAC Cannot read file %s.\n", "bwe.pcm");
-    cout << flush;
-    exit(1);
-  }
-
-  starttime = clock() / (double)CLOCKS_PER_SEC; /* Runtime statistics */
-
-  /* Initialize the ISAC and BN structs */
-  if (testNum != 8) {
-    if (!useAssign) {
-      err = WebRtcIsac_Create(&ISAC_main_inst);
-      WebRtcIsac_SetEncSampRate(ISAC_main_inst, sampFreqKHz * 1000);
-      WebRtcIsac_SetDecSampRate(ISAC_main_inst,
-                                sampFreqKHz >= 32 ? 32000 : 16000);
-    } else {
-      /* Test the Assign functions */
-      int sss;
-      void* ppp;
-      err = WebRtcIsac_AssignSize(&sss);
-      ppp = malloc(sss);
-      err = WebRtcIsac_Assign(&ISAC_main_inst, ppp);
-      WebRtcIsac_SetEncSampRate(ISAC_main_inst, sampFreqKHz * 1000);
-      WebRtcIsac_SetDecSampRate(ISAC_main_inst,
-                                sampFreqKHz >= 32 ? 32000 : 16000);
-    }
-    /* Error check */
-    if (err < 0) {
-      printf("\n\n Error in create.\n\n");
-      cout << flush;
-      exit(EXIT_FAILURE);
-    }
-  }
-  BN_data.arrival_time = 0;
-  BN_data.sample_count = 0;
-  BN_data.rtp_number = 0;
-
-  /* Initialize encoder and decoder */
-  framecnt = 0;
-  endfile = 0;
-
-  if (doTransCoding) {
-    WebRtcIsac_Create(&decoderTransCoding);
-    WebRtcIsac_SetEncSampRate(decoderTransCoding, sampFreqKHz * 1000);
-    WebRtcIsac_SetDecSampRate(decoderTransCoding,
-                              sampFreqKHz >= 32 ? 32000 : 16000);
-    WebRtcIsac_DecoderInit(decoderTransCoding);
-    transCodingFile = fopen(transCodingFileName, "wb");
-    if (transCodingFile == NULL) {
-      printf("Could not open %s to output trans-coding.\n",
-             transCodingFileName);
-      exit(0);
-    }
-    strcat(transCodingFileName, ".bit");
-    transcodingBitstream = fopen(transCodingFileName, "wb");
-    if (transcodingBitstream == NULL) {
-      printf("Could not open %s to write the bit-stream of transcoder.\n",
-             transCodingFileName);
-      exit(0);
-    }
-  }
-
-  if (testNum != 1) {
-    if (WebRtcIsac_EncoderInit(ISAC_main_inst, CodingMode) < 0) {
-      printf("Error could not initialize the encoder \n");
-      cout << flush;
-      return 0;
-    }
-  }
-  if (testNum != 2)
-    WebRtcIsac_DecoderInit(ISAC_main_inst);
-  if (CodingMode == 1) {
-    err = WebRtcIsac_Control(ISAC_main_inst, bottleneck, framesize);
-    if (err < 0) {
-      /* exit if returned with error */
-      errtype = WebRtcIsac_GetErrorCode(ISAC_main_inst);
-      printf("\n\n Error in initialization (control): %d.\n\n", errtype);
-      cout << flush;
-      if (testNum == 0) {
-        exit(EXIT_FAILURE);
-      }
-    }
-  }
-
-  if ((setControlBWE) && (CodingMode == 0)) {
-    err = WebRtcIsac_ControlBwe(ISAC_main_inst, rateBPS, framesize, fixedFL);
-    if (err < 0) {
-      /* exit if returned with error */
-      errtype = WebRtcIsac_GetErrorCode(ISAC_main_inst);
-
-      printf("\n\n Error in Control BWE: %d.\n\n", errtype);
-      cout << flush;
-      exit(EXIT_FAILURE);
-    }
-  }
-
-  if (payloadSize != 0) {
-    err = WebRtcIsac_SetMaxPayloadSize(ISAC_main_inst, payloadSize);
-    if (err < 0) {
-      /* exit if returned with error */
-      errtype = WebRtcIsac_GetErrorCode(ISAC_main_inst);
-      printf("\n\n Error in SetMaxPayloadSize: %d.\n\n", errtype);
-      cout << flush;
-      exit(EXIT_FAILURE);
-    }
-  }
-  if (payloadRate != 0) {
-    err = WebRtcIsac_SetMaxRate(ISAC_main_inst, payloadRate);
-    if (err < 0) {
-      /* exit if returned with error */
-      errtype = WebRtcIsac_GetErrorCode(ISAC_main_inst);
-      printf("\n\n Error in SetMaxRateInBytes: %d.\n\n", errtype);
-      cout << flush;
-      exit(EXIT_FAILURE);
-    }
-  }
-
-  *speechType = 1;
-
-  cout << "\n" << flush;
-
-  length_file = 0;
-  int16_t bnIdxTC = 0;
-  int16_t jitterInfoTC = 0;
-  while (endfile == 0) {
-    /* Call init functions at random, fault test number 7 */
-    if (testNum == 7 && (rand() % 2 == 0)) {
-      err = WebRtcIsac_EncoderInit(ISAC_main_inst, CodingMode);
-      /* Error check */
-      if (err < 0) {
-        errtype = WebRtcIsac_GetErrorCode(ISAC_main_inst);
-        printf("\n\n Error in encoderinit: %d.\n\n", errtype);
-        cout << flush;
-      }
-
-      WebRtcIsac_DecoderInit(ISAC_main_inst);
-    }
-
-    cur_framesmpls = 0;
-    while (1) {
-      int stream_len_int = 0;
-
-      /* Read 10 ms speech block */
-      endfile = readframe(shortdata, inp, samplesIn10Ms);
-
-      if (endfile) {
-        numFileLoop++;
-        if (numFileLoop < totFileLoop) {
-          rewind(inp);
-          framecnt = 0;
-          fprintf(stderr, "\n");
-          endfile = readframe(shortdata, inp, samplesIn10Ms);
-        }
-      }
-
-      if (testNum == 7) {
-        srand((unsigned int)time(NULL));
-      }
-
-      /* iSAC encoding */
-      if (!(testNum == 3 && framecnt == 0)) {
-        stream_len_int =
-            WebRtcIsac_Encode(ISAC_main_inst, shortdata, (uint8_t*)streamdata);
-        if ((payloadSize != 0) && (stream_len_int > payloadSize)) {
-          if (testNum == 0) {
-            printf("\n\n");
-          }
-
-          printf("\nError: Streamsize out of range %d\n",
-                 stream_len_int - payloadSize);
-          cout << flush;
-        }
-
-        WebRtcIsac_GetUplinkBw(ISAC_main_inst, &sendBN);
-
-        if (stream_len_int > 0) {
-          if (doTransCoding) {
-            int16_t indexStream;
-            uint8_t auxUW8;
-
-            /******************** Main Transcoding stream ********************/
-            WebRtcIsac_GetDownLinkBwIndex(ISAC_main_inst, &bnIdxTC,
-                                          &jitterInfoTC);
-            int streamLenTransCoding_int = WebRtcIsac_GetNewBitStream(
-                ISAC_main_inst, bnIdxTC, jitterInfoTC, rateTransCoding,
-                streamDataTransCoding, false);
-            if (streamLenTransCoding_int < 0) {
-              fprintf(stderr, "Error in trans-coding\n");
-              exit(0);
-            }
-            streamLenTransCoding =
-                static_cast<size_t>(streamLenTransCoding_int);
-            auxUW8 = (uint8_t)(((streamLenTransCoding & 0xFF00) >> 8) & 0x00FF);
-            if (fwrite(&auxUW8, sizeof(uint8_t), 1, transcodingBitstream) !=
-                1) {
-              return -1;
-            }
-
-            auxUW8 = (uint8_t)(streamLenTransCoding & 0x00FF);
-            if (fwrite(&auxUW8, sizeof(uint8_t), 1, transcodingBitstream) !=
-                1) {
-              return -1;
-            }
-
-            if (fwrite(streamDataTransCoding, sizeof(uint8_t),
-                       streamLenTransCoding, transcodingBitstream) !=
-                streamLenTransCoding) {
-              return -1;
-            }
-
-            WebRtcIsac_ReadBwIndex(streamDataTransCoding, &indexStream);
-            if (indexStream != bnIdxTC) {
-              fprintf(stderr,
-                      "Error in inserting Bandwidth index into transcoding "
-                      "stream.\n");
-              exit(0);
-            }
-            numTransCodingBytes += streamLenTransCoding;
-          }
-        }
-      } else {
-        break;
-      }
-
-      if (stream_len_int < 0) {
-        /* exit if returned with error */
-        errtype = WebRtcIsac_GetErrorCode(ISAC_main_inst);
-        fprintf(stderr, "Error in encoder: %d.\n", errtype);
-        cout << flush;
-        exit(0);
-      }
-      stream_len = static_cast<size_t>(stream_len_int);
-
-      cur_framesmpls += samplesIn10Ms;
-      /* exit encoder loop if the encoder returned a bitstream */
-      if (stream_len != 0)
-        break;
-    }
-
-    /* read next bottleneck rate */
-    if (f_bn != NULL) {
-      if (fscanf(f_bn, "%d", &bottleneck) == EOF) {
-        /* Set pointer to beginning of file */
-        fseek(f_bn, 0L, SEEK_SET);
-        if (fscanf(f_bn, "%d", &bottleneck) == EOF) {
-          exit(0);
-        }
-      }
-      if (CodingMode == 1) {
-        WebRtcIsac_Control(ISAC_main_inst, bottleneck, framesize);
-      }
-    }
-
-    length_file += cur_framesmpls;
-    if (cur_framesmpls == (3 * samplesIn10Ms)) {
-      maxStreamLen30 =
-          (stream_len > maxStreamLen30) ? stream_len : maxStreamLen30;
-    } else {
-      maxStreamLen60 =
-          (stream_len > maxStreamLen60) ? stream_len : maxStreamLen60;
-    }
-
-    if (!lostFrame) {
-      lostFrame = ((rand() % 100) < packetLossPercent);
-    } else {
-      lostFrame = false;
-    }
-
-    // RED.
-    if (lostFrame) {
-      int stream_len_int = WebRtcIsac_GetRedPayload(
-          ISAC_main_inst, reinterpret_cast<uint8_t*>(streamdata));
-      if (stream_len_int < 0) {
-        fprintf(stderr, "Error getting RED payload\n");
-        exit(0);
-      }
-      stream_len = static_cast<size_t>(stream_len_int);
-
-      if (doTransCoding) {
-        int streamLenTransCoding_int = WebRtcIsac_GetNewBitStream(
-            ISAC_main_inst, bnIdxTC, jitterInfoTC, rateTransCoding,
-            streamDataTransCoding, true);
-        if (streamLenTransCoding_int < 0) {
-          fprintf(stderr, "Error in RED trans-coding\n");
-          exit(0);
-        }
-        streamLenTransCoding =
-            static_cast<size_t>(streamLenTransCoding_int);
-      }
-    }
-
-    /* make coded sequence to short be inreasing */
-    /* the length the decoder expects */
-    if (testNum == 4) {
-      stream_len += 10;
-    }
-
-    /* make coded sequence to long be decreasing */
-    /* the length the decoder expects */
-    if (testNum == 5) {
-      stream_len -= 10;
-    }
-
-    if (testNum == 6) {
-      srand((unsigned int)time(NULL));
-      for (i = 0; i < stream_len; i++) {
-        streamdata[i] = rand();
-      }
-    }
-
-    if (VADusage) {
-      readframe(vaddata, vadp, samplesIn10Ms * 3);
-    }
-
-    /* simulate packet handling through NetEq and the modem */
-    if (!(testNum == 3 && framecnt == 0)) {
-      get_arrival_time(cur_framesmpls, stream_len, bottleneck, &BN_data,
-                       sampFreqKHz * 1000, sampFreqKHz * 1000);
-    }
-
-    if (VADusage && (framecnt > 10 && vaddata[0] == 0)) {
-      BN_data.rtp_number--;
-    } else {
-      /* Error test number 10, garbage data */
-      if (testNum == 10) {
-        /* Test to run decoder with garbage data */
-        for (i = 0; i < stream_len; i++) {
-          streamdata[i] = (short)(streamdata[i]) + (short)rand();
-        }
-      }
-
-      if (testNum != 9) {
-        err = WebRtcIsac_UpdateBwEstimate(
-            ISAC_main_inst, reinterpret_cast<const uint8_t*>(streamdata),
-            stream_len, BN_data.rtp_number, BN_data.sample_count,
-            BN_data.arrival_time);
-
-        if (err < 0) {
-          /* exit if returned with error */
-          errtype = WebRtcIsac_GetErrorCode(ISAC_main_inst);
-          if (testNum == 0) {
-            printf("\n\n");
-          }
-
-          printf("Error: in decoder: %d.", errtype);
-          cout << flush;
-          if (testNum == 0) {
-            printf("\n\n");
-          }
-        }
-      }
-
-      /* Call getFramelen, only used here for function test */
-      err = WebRtcIsac_ReadFrameLen(
-          ISAC_main_inst, reinterpret_cast<const uint8_t*>(streamdata), &FL);
-      if (err < 0) {
-        /* exit if returned with error */
-        errtype = WebRtcIsac_GetErrorCode(ISAC_main_inst);
-        if (testNum == 0) {
-          printf("\n\n");
-        }
-        printf("    Error: in getFrameLen %d.", errtype);
-        cout << flush;
-        if (testNum == 0) {
-          printf("\n\n");
-        }
-      }
-
-      // iSAC decoding
-
-      if (lostFrame) {
-        declen = WebRtcIsac_DecodeRcu(
-            ISAC_main_inst, reinterpret_cast<const uint8_t*>(streamdata),
-            stream_len, decoded, speechType);
-
-        if (doTransCoding) {
-          declenTC =
-              WebRtcIsac_DecodeRcu(decoderTransCoding, streamDataTransCoding,
-                                   streamLenTransCoding, decodedTC, speechType);
-        }
-      } else {
-        declen = WebRtcIsac_Decode(ISAC_main_inst,
-                                   reinterpret_cast<const uint8_t*>(streamdata),
-                                   stream_len, decoded, speechType);
-        if (doTransCoding) {
-          declenTC =
-              WebRtcIsac_Decode(decoderTransCoding, streamDataTransCoding,
-                                streamLenTransCoding, decodedTC, speechType);
-        }
-      }
-
-      if (declen < 0) {
-        /* exit if returned with error */
-        errtype = WebRtcIsac_GetErrorCode(ISAC_main_inst);
-        if (testNum == 0) {
-          printf("\n\n");
-        }
-        printf("    Error: in decoder %d.", errtype);
-        cout << flush;
-        if (testNum == 0) {
-          printf("\n\n");
-        }
-      }
-
-      if (declenTC < 0) {
-        if (testNum == 0) {
-          printf("\n\n");
-        }
-        printf("    Error: in decoding the transcoded stream");
-        cout << flush;
-        if (testNum == 0) {
-          printf("\n\n");
-        }
-      }
-    }
-    /* Write decoded speech frame to file */
-    if ((declen > 0) && (numFileLoop == 0)) {
-      if (fwrite(decoded, sizeof(int16_t), declen, outp) !=
-          static_cast<size_t>(declen)) {
-        return -1;
-      }
-    }
-
-    if ((declenTC > 0) && (numFileLoop == 0)) {
-      if (fwrite(decodedTC, sizeof(int16_t), declen, transCodingFile) !=
-          static_cast<size_t>(declen)) {
-        return -1;
-      }
-    }
-
-    fprintf(stderr, "\rframe = %5d  ", framecnt);
-    fflush(stderr);
-    framecnt++;
-
-    /* Error test number 10, garbage data */
-    // if (testNum == 10)
-    // {
-    //   /* Test to run decoder with garbage data */
-    //   if ((seedfile = fopen(SEED_FILE, "a+t")) == NULL) {
-    //     fprintf(stderr, "Error: Could not open file %s\n", SEED_FILE);
-    //   } else {
-    //     fprintf(seedfile, "ok\n\n");
-    //     fclose(seedfile);
-    //   }
-    // }
-    /* Error test number 10, garbage data */
-    // if (testNum == 10) {
-    //   /* Test to run decoder with garbage data */
-    //   for (i = 0; i < stream_len; i++) {
-    //     streamdata[i] = (short) (streamdata[i] + (short) rand());
-    //   }
-    // }
-
-    totalsmpls += declen;
-    totalbits += 8 * stream_len;
-#if !defined(NDEBUG)
-    kbps = ((double)sampFreqKHz * 1000.) / ((double)cur_framesmpls) * 8.0 *
-           stream_len / 1000.0;  // kbits/s
-    fy = fopen("bit_rate.dat", "a");
-    fprintf(fy, "Frame %i = %0.14f\n", framecnt, kbps);
-    fclose(fy);
-
-#endif
-  }
-  printf("\n");
-  printf("total bits               = %" PRIuS " bits\n", totalbits);
-  printf("measured average bitrate = %0.3f kbits/s\n",
-         (double)totalbits * (sampFreqKHz) / totalsmpls);
-  if (doTransCoding) {
-    printf("Transcoding average bit-rate = %0.3f kbps\n",
-           (double)numTransCodingBytes * 8.0 * (sampFreqKHz) / totalsmpls);
-    fclose(transCodingFile);
-  }
-  printf("\n");
-
-  /* Runtime statistics */
-  runtime = (double)(clock() / (double)CLOCKS_PER_SEC - starttime);
-  length_file = length_file / (sampFreqKHz * 1000.);
-
-  printf("\n\nLength of speech file: %.1f s\n", length_file);
-  printf("Time to run iSAC:      %.2f s (%.2f %% of realtime)\n\n", runtime,
-         (100 * runtime / length_file));
-
-  if (maxStreamLen30 != 0) {
-    printf("Maximum payload size 30ms Frames %" PRIuS " bytes (%0.3f kbps)\n",
-           maxStreamLen30, maxStreamLen30 * 8 / 30.);
-  }
-  if (maxStreamLen60 != 0) {
-    printf("Maximum payload size 60ms Frames %" PRIuS " bytes (%0.3f kbps)\n",
-           maxStreamLen60, maxStreamLen60 * 8 / 60.);
-  }
-  // fprintf(stderr, "\n");
-
-  fprintf(stderr, "   %.1f s", length_file);
-  fprintf(stderr, "   %0.1f kbps",
-          (double)totalbits * (sampFreqKHz) / totalsmpls);
-  if (maxStreamLen30 != 0) {
-    fprintf(stderr, "   plmax-30ms %" PRIuS " bytes (%0.0f kbps)",
-            maxStreamLen30, maxStreamLen30 * 8 / 30.);
-  }
-  if (maxStreamLen60 != 0) {
-    fprintf(stderr, "   plmax-60ms %" PRIuS " bytes (%0.0f kbps)",
-            maxStreamLen60, maxStreamLen60 * 8 / 60.);
-  }
-  if (doTransCoding) {
-    fprintf(stderr, "  transcoding rate %.0f kbps",
-            (double)numTransCodingBytes * 8.0 * (sampFreqKHz) / totalsmpls);
-  }
-
-  fclose(inp);
-  fclose(outp);
-  WebRtcIsac_Free(ISAC_main_inst);
-
-  exit(0);
-}
diff --git a/modules/audio_coding/codecs/isac/main/test/SwitchingSampRate/SwitchingSampRate.cc b/modules/audio_coding/codecs/isac/main/test/SwitchingSampRate/SwitchingSampRate.cc
deleted file mode 100644
index a53e7bd..0000000
--- a/modules/audio_coding/codecs/isac/main/test/SwitchingSampRate/SwitchingSampRate.cc
+++ /dev/null
@@ -1,458 +0,0 @@
-/*
- *  Copyright (c) 2012 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.
- */
-
-// SwitchingSampRate.cpp : Defines the entry point for the console
-// application.
-//
-
-#include <iostream>
-#include "isac.h"
-#include "utility.h"
-#include "signal_processing_library.h"
-
-#define MAX_FILE_NAME  500
-#define MAX_NUM_CLIENTS 2
-
-
-#define NUM_CLIENTS 2
-
-using namespace std;
-
-int main(int argc, char* argv[])
-{
-  char fileNameWB[MAX_FILE_NAME];
-  char fileNameSWB[MAX_FILE_NAME];
-
-  char outFileName[MAX_NUM_CLIENTS][MAX_FILE_NAME];
-
-  FILE* inFile[MAX_NUM_CLIENTS];
-  FILE* outFile[MAX_NUM_CLIENTS];
-
-  ISACStruct* codecInstance[MAX_NUM_CLIENTS];
-  int32_t resamplerState[MAX_NUM_CLIENTS][8];
-
-  int encoderSampRate[MAX_NUM_CLIENTS];
-
-  int minBn = 16000;
-  int maxBn = 56000;
-
-  int bnWB = 32000;
-  int bnSWB = 56000;
-
-  strcpy(outFileName[0], "switchSampRate_out1.pcm");
-  strcpy(outFileName[1], "switchSampRate_out2.pcm");
-
-  short clientCntr;
-
-  size_t lenEncodedInBytes[MAX_NUM_CLIENTS];
-  unsigned int lenAudioIn10ms[MAX_NUM_CLIENTS];
-  size_t lenEncodedInBytesTmp[MAX_NUM_CLIENTS];
-  unsigned int lenAudioIn10msTmp[MAX_NUM_CLIENTS];
-  BottleNeckModel* packetData[MAX_NUM_CLIENTS];
-
-  char versionNumber[100];
-  short samplesIn10ms[MAX_NUM_CLIENTS];
-  int bottleneck[MAX_NUM_CLIENTS];
-
-  printf("\n\n");
-  printf("____________________________________________\n\n");
-  WebRtcIsac_version(versionNumber);
-  printf("    iSAC-swb version %s\n", versionNumber);
-  printf("____________________________________________\n");
-
-
-  fileNameWB[0]  = '\0';
-  fileNameSWB[0] = '\0';
-
-  char myFlag[20];
-  strcpy(myFlag, "-wb");
-  // READ THE WIDEBAND AND SUPER-WIDEBAND FILE NAMES
-  if(readParamString(argc, argv, myFlag, fileNameWB, MAX_FILE_NAME) <= 0)
-  {
-    printf("No wideband file is specified");
-  }
-
-  strcpy(myFlag, "-swb");
-  if(readParamString(argc, argv, myFlag, fileNameSWB, MAX_FILE_NAME) <= 0)
-  {
-    printf("No super-wideband file is specified");
-  }
-
-  // THE FIRST CLIENT STARTS IN WIDEBAND
-  encoderSampRate[0] = 16000;
-  OPEN_FILE_RB(inFile[0], fileNameWB);
-
-  // THE SECOND CLIENT STARTS IN SUPER-WIDEBAND
-  encoderSampRate[1] = 32000;
-  OPEN_FILE_RB(inFile[1], fileNameSWB);
-
-  strcpy(myFlag, "-I");
-  short codingMode = readSwitch(argc, argv, myFlag);
-
-  for(clientCntr = 0; clientCntr < NUM_CLIENTS; clientCntr++)
-  {
-    codecInstance[clientCntr] = NULL;
-
-    printf("\n");
-    printf("Client %d\n", clientCntr + 1);
-    printf("---------\n");
-    printf("Starting %s",
-           (encoderSampRate[clientCntr] == 16000)
-           ? "wideband":"super-wideband");
-
-    // Open output File Name
-    OPEN_FILE_WB(outFile[clientCntr], outFileName[clientCntr]);
-    printf("Output File...................... %s\n", outFileName[clientCntr]);
-
-    samplesIn10ms[clientCntr] = encoderSampRate[clientCntr] * 10;
-
-    if(codingMode == 1)
-    {
-      bottleneck[clientCntr] = (clientCntr)? bnSWB:bnWB;
-    }
-    else
-    {
-      bottleneck[clientCntr] = (clientCntr)? minBn:maxBn;
-    }
-
-    printf("Bottleneck....................... %0.3f kbits/sec \n",
-           bottleneck[clientCntr] / 1000.0);
-
-    // coding-mode
-    printf("Encoding Mode.................... %s\n",
-           (codingMode == 1)? "Channel-Independent (Instantaneous)":"Adaptive");
-
-    lenEncodedInBytes[clientCntr] = 0;
-    lenAudioIn10ms[clientCntr] = 0;
-    lenEncodedInBytesTmp[clientCntr] = 0;
-    lenAudioIn10msTmp[clientCntr] = 0;
-
-    packetData[clientCntr] = (BottleNeckModel*)new(BottleNeckModel);
-    if(packetData[clientCntr] == NULL)
-    {
-      printf("Could not allocate memory for packetData \n");
-      return -1;
-    }
-    memset(packetData[clientCntr], 0, sizeof(BottleNeckModel));
-    memset(resamplerState[clientCntr], 0, sizeof(int32_t) * 8);
-  }
-
-  for(clientCntr = 0; clientCntr < NUM_CLIENTS; clientCntr++)
-  {
-    // Create
-    if(WebRtcIsac_Create(&codecInstance[clientCntr]))
-    {
-      printf("Could not creat client %d\n", clientCntr + 1);
-      return -1;
-    }
-
-    WebRtcIsac_SetEncSampRate(codecInstance[clientCntr], encoderSampRate[clientCntr]);
-
-    WebRtcIsac_SetDecSampRate(codecInstance[clientCntr],
-                              encoderSampRate[clientCntr + (1 - ((clientCntr & 1)<<1))]);
-
-    // Initialize Encoder
-    if(WebRtcIsac_EncoderInit(codecInstance[clientCntr],
-                              codingMode) < 0)
-    {
-      printf("Could not initialize client, %d\n", clientCntr + 1);
-      return -1;
-    }
-
-    WebRtcIsac_DecoderInit(codecInstance[clientCntr]);
-
-    // setup Rate if in Instantaneous mode
-    if(codingMode != 0)
-    {
-      // ONLY Clients who are not in Adaptive mode
-      if(WebRtcIsac_Control(codecInstance[clientCntr],
-                            bottleneck[clientCntr], 30) < 0)
-      {
-        printf("Could not setup bottleneck and frame-size for client %d\n",
-               clientCntr + 1);
-        return -1;
-      }
-    }
-  }
-
-
-  size_t streamLen;
-  short numSamplesRead;
-  size_t lenDecodedAudio;
-  short senderIdx;
-  short receiverIdx;
-
-  printf("\n");
-  short num10ms[MAX_NUM_CLIENTS];
-  memset(num10ms, 0, sizeof(short)*MAX_NUM_CLIENTS);
-  FILE* arrivalTimeFile1 = fopen("arrivalTime1.dat", "wb");
-  FILE* arrivalTimeFile2 = fopen("arrivalTime2.dat", "wb");
-  short numPrint[MAX_NUM_CLIENTS];
-  memset(numPrint, 0, sizeof(short) * MAX_NUM_CLIENTS);
-
-  // Audio Buffers
-  short silence10ms[10 * 32];
-  memset(silence10ms, 0, 320 * sizeof(short));
-  short audioBuff10ms[10 * 32];
-  short audioBuff60ms[60 * 32];
-  short resampledAudio60ms[60 * 32];
-
-  unsigned short bitStream[600+600];
-  short speechType[1];
-
-  short numSampFreqChanged = 0;
-  while(numSampFreqChanged < 10)
-  {
-    for(clientCntr = 0; clientCntr < NUM_CLIENTS; clientCntr++)
-    {
-      // Encoding/decoding for this pair of clients, if there is
-      // audio for any of them
-      //if(audioLeft[clientCntr] || audioLeft[clientCntr + 1])
-      //{
-      //for(pairCntr = 0; pairCntr < 2; pairCntr++)
-      //{
-      senderIdx = clientCntr; // + pairCntr;
-      receiverIdx = 1 - clientCntr;//  + (1 - pairCntr);
-
-      //if(num10ms[senderIdx] > 6)
-      //{
-      //    printf("Too many frames read for client %d",
-      //        senderIdx + 1);
-      //    return -1;
-      //}
-
-      numSamplesRead = (short)fread(audioBuff10ms, sizeof(short),
-                                    samplesIn10ms[senderIdx], inFile[senderIdx]);
-      if(numSamplesRead != samplesIn10ms[senderIdx])
-      {
-        // file finished switch encoder sampling frequency.
-        printf("Changing Encoder Sampling frequency in client %d to ", senderIdx+1);
-        fclose(inFile[senderIdx]);
-        numSampFreqChanged++;
-        if(encoderSampRate[senderIdx] == 16000)
-        {
-          printf("super-wideband.\n");
-          OPEN_FILE_RB(inFile[senderIdx], fileNameSWB);
-          encoderSampRate[senderIdx] = 32000;
-        }
-        else
-        {
-          printf("wideband.\n");
-          OPEN_FILE_RB(inFile[senderIdx], fileNameWB);
-          encoderSampRate[senderIdx] = 16000;
-        }
-        WebRtcIsac_SetEncSampRate(codecInstance[senderIdx], encoderSampRate[senderIdx]);
-        WebRtcIsac_SetDecSampRate(codecInstance[receiverIdx], encoderSampRate[senderIdx]);
-
-        samplesIn10ms[clientCntr] = encoderSampRate[clientCntr] * 10;
-
-        numSamplesRead = (short)fread(audioBuff10ms, sizeof(short),
-                                      samplesIn10ms[senderIdx], inFile[senderIdx]);
-        if(numSamplesRead != samplesIn10ms[senderIdx])
-        {
-          printf(" File %s for client %d has not enough audio\n",
-                 (encoderSampRate[senderIdx]==16000)? "wideband":"super-wideband",
-                 senderIdx + 1);
-          return -1;
-        }
-      }
-      num10ms[senderIdx]++;
-
-      // sanity check
-      //if(num10ms[senderIdx] > 6)
-      //{
-      //    printf("Client %d has got more than 60 ms audio and encoded no packet.\n",
-      //        senderIdx);
-      //    return -1;
-      //}
-
-      // Encode
-
-
-      int streamLen_int = WebRtcIsac_Encode(codecInstance[senderIdx],
-                                            audioBuff10ms,
-                                            (uint8_t*)bitStream);
-      int16_t ggg;
-      if (streamLen_int > 0) {
-        if ((WebRtcIsac_ReadFrameLen(
-                codecInstance[receiverIdx],
-                reinterpret_cast<const uint8_t*>(bitStream),
-                &ggg)) < 0)
-          printf("ERROR\n");
-      }
-
-      // Sanity check
-      if(streamLen_int < 0)
-      {
-        printf(" Encoder error in client %d \n", senderIdx + 1);
-        return -1;
-      }
-      streamLen = static_cast<size_t>(streamLen_int);
-
-
-      if(streamLen > 0)
-      {
-        // Packet generated; model sending through a channel, do bandwidth
-        // estimation at the receiver and decode.
-        lenEncodedInBytes[senderIdx] += streamLen;
-        lenAudioIn10ms[senderIdx] += (unsigned int)num10ms[senderIdx];
-        lenEncodedInBytesTmp[senderIdx] += streamLen;
-        lenAudioIn10msTmp[senderIdx] += (unsigned int)num10ms[senderIdx];
-
-        // Print after ~5 sec.
-        if(lenAudioIn10msTmp[senderIdx] >= 100)
-        {
-          numPrint[senderIdx]++;
-          printf("  %d,  %6.3f => %6.3f ", senderIdx+1,
-                 bottleneck[senderIdx] / 1000.0,
-                 lenEncodedInBytesTmp[senderIdx] * 0.8 /
-                 lenAudioIn10msTmp[senderIdx]);
-
-          if(codingMode == 0)
-          {
-            int32_t bn;
-            WebRtcIsac_GetUplinkBw(codecInstance[senderIdx], &bn);
-            printf("[%d] ", bn);
-          }
-          //int16_t rateIndexLB;
-          //int16_t rateIndexUB;
-          //WebRtcIsac_GetDownLinkBwIndex(codecInstance[receiverIdx],
-          //    &rateIndexLB, &rateIndexUB);
-          //printf(" (%2d, %2d) ", rateIndexLB, rateIndexUB);
-
-          cout << flush;
-          lenEncodedInBytesTmp[senderIdx] = 0;
-          lenAudioIn10msTmp[senderIdx]    = 0;
-          //if(senderIdx == (NUM_CLIENTS - 1))
-          //{
-          printf("  %0.1f \n", lenAudioIn10ms[senderIdx] * 10. /1000);
-          //}
-
-          // After ~20 sec change the bottleneck.
-          //    if((numPrint[senderIdx] == 4) && (codingMode == 0))
-          //    {
-          //        numPrint[senderIdx] = 0;
-          //        if(codingMode == 0)
-          //        {
-          //            int newBottleneck = bottleneck[senderIdx] +
-          //                (bottleneckChange[senderIdx] * 1000);
-
-          //            if(bottleneckChange[senderIdx] > 0)
-          //            {
-          //                if(newBottleneck >maxBn)
-          //                {
-          //                    bottleneckChange[senderIdx] = -1;
-          //                    newBottleneck = bottleneck[senderIdx] +
-          //                        (bottleneckChange[senderIdx] * 1000);
-          //                    if(newBottleneck > minBn)
-          //                    {
-          //                        bottleneck[senderIdx] = newBottleneck;
-          //                    }
-          //                }
-          //                else
-          //                {
-          //                    bottleneck[senderIdx] = newBottleneck;
-          //                }
-          //            }
-          //            else
-          //            {
-          //                if(newBottleneck < minBn)
-          //                {
-          //                    bottleneckChange[senderIdx] = 1;
-          //                    newBottleneck = bottleneck[senderIdx] +
-          //                        (bottleneckChange[senderIdx] * 1000);
-          //                    if(newBottleneck < maxBn)
-          //                    {
-          //                        bottleneck[senderIdx] = newBottleneck;
-          //                    }
-          //                }
-          //                else
-          //                {
-          //                    bottleneck[senderIdx] = newBottleneck;
-          //                }
-          //            }
-          //        }
-          //    }
-        }
-
-        // model a channel of given bottleneck, to get the receive timestamp
-        get_arrival_time(num10ms[senderIdx] * samplesIn10ms[senderIdx],
-                         streamLen, bottleneck[senderIdx], packetData[senderIdx],
-                         encoderSampRate[senderIdx]*1000, encoderSampRate[senderIdx]*1000);
-
-        // Write the arrival time.
-        if(senderIdx == 0)
-        {
-          if (fwrite(&(packetData[senderIdx]->arrival_time),
-                     sizeof(unsigned int),
-                     1, arrivalTimeFile1) != 1) {
-            return -1;
-          }
-        }
-        else
-        {
-          if (fwrite(&(packetData[senderIdx]->arrival_time),
-                     sizeof(unsigned int),
-                     1, arrivalTimeFile2) != 1) {
-            return -1;
-          }
-        }
-
-        // BWE
-        if (WebRtcIsac_UpdateBwEstimate(
-                codecInstance[receiverIdx],
-                reinterpret_cast<const uint8_t*>(bitStream),
-                streamLen,
-                packetData[senderIdx]->rtp_number,
-                packetData[senderIdx]->sample_count,
-                packetData[senderIdx]->arrival_time) < 0) {
-          printf(" BWE Error at client %d \n", receiverIdx + 1);
-          return -1;
-        }
-        /**/
-        // Decode
-        int lenDecodedAudio_int = WebRtcIsac_Decode(
-            codecInstance[receiverIdx],
-            reinterpret_cast<const uint8_t*>(bitStream),
-            streamLen,
-            audioBuff60ms,
-            speechType);
-        if(lenDecodedAudio_int < 0)
-        {
-          printf(" Decoder error in client %d \n", receiverIdx + 1);
-          return -1;
-        }
-        lenDecodedAudio = static_cast<size_t>(lenDecodedAudio_int);
-
-        if(encoderSampRate[senderIdx] == 16000)
-        {
-          WebRtcSpl_UpsampleBy2(audioBuff60ms, lenDecodedAudio, resampledAudio60ms,
-                                resamplerState[receiverIdx]);
-          if (fwrite(resampledAudio60ms, sizeof(short), lenDecodedAudio << 1,
-                     outFile[receiverIdx]) !=
-              lenDecodedAudio << 1) {
-            return -1;
-          }
-        }
-        else
-        {
-          if (fwrite(audioBuff60ms, sizeof(short), lenDecodedAudio,
-                     outFile[receiverIdx]) !=
-              lenDecodedAudio) {
-            return -1;
-          }
-        }
-        num10ms[senderIdx] = 0;
-      }
-      //}
-      //}
-    }
-  }
-}
diff --git a/modules/audio_coding/codecs/isac/main/test/simpleKenny.c b/modules/audio_coding/codecs/isac/main/test/simpleKenny.c
deleted file mode 100644
index 646cd48..0000000
--- a/modules/audio_coding/codecs/isac/main/test/simpleKenny.c
+++ /dev/null
@@ -1,467 +0,0 @@
-/*
- *  Copyright (c) 2012 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.
- */
-
-/* kenny.c  - Main function for the iSAC coder */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <time.h>
-
-#ifdef WIN32
-#include "windows.h"
-#ifndef CLOCKS_PER_SEC
-#define CLOCKS_PER_SEC 1000
-#endif
-#endif
-
-#include <ctype.h>
-#include <math.h>
-
-/* include API */
-#include "isac.h"
-#include "utility.h"
-#include "webrtc/rtc_base/format_macros.h"
-
-/* max number of samples per frame (= 60 ms frame) */
-#define MAX_FRAMESAMPLES_SWB 1920
-/* number of samples per 10ms frame */
-#define FRAMESAMPLES_SWB_10ms 320
-#define FRAMESAMPLES_WB_10ms 160
-
-/* sampling frequency (Hz) */
-#define FS_SWB 32000
-#define FS_WB 16000
-
-unsigned long framecnt = 0;
-
-int main(int argc, char* argv[]) {
-  //--- File IO ----
-  FILE* inp;
-  FILE* outp;
-  char inname[500];
-  char outname[500];
-
-  /* Runtime statistics */
-  double rate;
-  double rateRCU;
-  size_t totalbits = 0;
-  unsigned long totalBitsRCU = 0;
-  unsigned long totalsmpls = 0;
-
-  int32_t bottleneck = 39;
-  int frameSize = 30; /* ms */
-  int16_t codingMode = 1;
-  int16_t shortdata[FRAMESAMPLES_SWB_10ms];
-  int16_t decoded[MAX_FRAMESAMPLES_SWB];
-  int16_t speechType[1];
-  int16_t payloadLimit;
-  int32_t rateLimit;
-  ISACStruct* ISAC_main_inst;
-
-  size_t stream_len = 0;
-  int declen = 0;
-  int16_t err;
-  int cur_framesmpls;
-  int endfile;
-#ifdef WIN32
-  double length_file;
-  double runtime;
-  char outDrive[10];
-  char outPath[500];
-  char outPrefix[500];
-  char outSuffix[500];
-  char bitrateFileName[500];
-  FILE* bitrateFile;
-  double starttime;
-  double rateLB = 0;
-  double rateUB = 0;
-#endif
-  FILE* histFile;
-  FILE* averageFile;
-  int sampFreqKHz;
-  int samplesIn10Ms;
-  size_t maxStreamLen = 0;
-  char histFileName[500];
-  char averageFileName[500];
-  unsigned int hist[600];
-  double tmpSumStreamLen = 0;
-  unsigned int packetCntr = 0;
-  unsigned int lostPacketCntr = 0;
-  uint8_t payload[1200];
-  uint8_t payloadRCU[1200];
-  uint16_t packetLossPercent = 0;
-  int16_t rcuStreamLen = 0;
-  int onlyEncode;
-  int onlyDecode;
-
-  BottleNeckModel packetData;
-  packetData.arrival_time = 0;
-  packetData.sample_count = 0;
-  packetData.rtp_number = 0;
-  memset(hist, 0, sizeof(hist));
-
-  /* handling wrong input arguments in the command line */
-  if (argc < 5) {
-    int size;
-    WebRtcIsac_AssignSize(&size);
-
-    printf("\n\nWrong number of arguments or flag values.\n\n");
-
-    printf("Usage:\n\n");
-    printf("%s infile outfile -bn bottleneck [options]\n\n", argv[0]);
-    printf("with:\n");
-    printf("-I.............. indicates encoding in instantaneous mode.\n");
-    printf("-bn bottleneck.. the value of the bottleneck in bit/sec, e.g.\n");
-    printf("                 39742, in instantaneous (channel-independent)\n");
-    printf("                 mode.\n\n");
-    printf("infile.......... Normal speech input file\n\n");
-    printf("outfile......... Speech output file\n\n");
-    printf("OPTIONS\n");
-    printf("-------\n");
-    printf("-fs sampFreq.... sampling frequency of codec 16 or 32 (default)\n");
-    printf("                 kHz.\n");
-    printf("-plim payloadLim payload limit in bytes, default is the maximum\n");
-    printf("                 possible.\n");
-    printf("-rlim rateLim... rate limit in bits/sec, default is the maximum\n");
-    printf("                 possible.\n");
-    printf("-h file......... record histogram and *append* to 'file'.\n");
-    printf("-ave file....... record average rate of 3 sec intervales and\n");
-    printf("                 *append* to 'file'.\n");
-    printf("-ploss.......... packet-loss percentage.\n");
-    printf("-enc............ do only encoding and store the bit-stream\n");
-    printf("-dec............ the input file is a bit-stream, decode it.\n\n");
-    printf("Example usage:\n\n");
-    printf("%s speechIn.pcm speechOut.pcm -B 40000 -fs 32\n\n", argv[0]);
-    printf("structure size %d bytes\n", size);
-
-    exit(0);
-  }
-
-  /* Get Bottleneck value */
-  bottleneck = readParamInt(argc, argv, "-bn", 50000);
-  fprintf(stderr, "\nfixed bottleneck rate of %d bits/s\n\n", bottleneck);
-
-  /* Get Input and Output files */
-  sscanf(argv[1], "%s", inname);
-  sscanf(argv[2], "%s", outname);
-  codingMode = readSwitch(argc, argv, "-I");
-  sampFreqKHz = (int16_t)readParamInt(argc, argv, "-fs", 32);
-  if (readParamString(argc, argv, "-h", histFileName, 500) > 0) {
-    histFile = fopen(histFileName, "a");
-    if (histFile == NULL) {
-      printf("cannot open hist file %s", histFileName);
-      exit(0);
-    }
-  } else {
-    // NO recording of hitstogram
-    histFile = NULL;
-  }
-
-  packetLossPercent = readParamInt(argc, argv, "-ploss", 0);
-
-  if (readParamString(argc, argv, "-ave", averageFileName, 500) > 0) {
-    averageFile = fopen(averageFileName, "a");
-    if (averageFile == NULL) {
-      printf("cannot open file to write rate %s", averageFileName);
-      exit(0);
-    }
-  } else {
-    averageFile = NULL;
-  }
-
-  onlyEncode = readSwitch(argc, argv, "-enc");
-  onlyDecode = readSwitch(argc, argv, "-dec");
-
-  switch (sampFreqKHz) {
-    case 16: {
-      samplesIn10Ms = 160;
-      break;
-    }
-    case 32: {
-      samplesIn10Ms = 320;
-      break;
-    }
-    default:
-      printf("A sampling frequency of %d kHz is not supported, valid values are"
-             " 8 and 16.\n", sampFreqKHz);
-      exit(-1);
-  }
-  payloadLimit = (int16_t)readParamInt(argc, argv, "-plim", 400);
-  rateLimit = readParamInt(argc, argv, "-rlim", 106800);
-
-  if ((inp = fopen(inname, "rb")) == NULL) {
-    printf("  iSAC: Cannot read file %s.\n", inname);
-    exit(1);
-  }
-  if ((outp = fopen(outname, "wb")) == NULL) {
-    printf("  iSAC: Cannot write file %s.\n", outname);
-    exit(1);
-  }
-
-#ifdef WIN32
-  _splitpath(outname, outDrive, outPath, outPrefix, outSuffix);
-  _makepath(bitrateFileName, outDrive, outPath, "bitrate", ".txt");
-
-  bitrateFile = fopen(bitrateFileName, "a");
-  fprintf(bitrateFile, "%%  %s  \n", inname);
-#endif
-
-  printf("\n");
-  printf("Input.................... %s\n", inname);
-  printf("Output................... %s\n", outname);
-  printf("Encoding Mode............ %s\n",
-         (codingMode == 1) ? "Channel-Independent" : "Channel-Adaptive");
-  printf("Bottleneck............... %d bits/sec\n", bottleneck);
-  printf("Packet-loss Percentage... %d\n", packetLossPercent);
-  printf("\n");
-
-#ifdef WIN32
-  starttime = clock() / (double)CLOCKS_PER_SEC; /* Runtime statistics */
-#endif
-
-  /* Initialize the ISAC and BN structs */
-  err = WebRtcIsac_Create(&ISAC_main_inst);
-
-  WebRtcIsac_SetEncSampRate(ISAC_main_inst, sampFreqKHz * 1000);
-  WebRtcIsac_SetDecSampRate(ISAC_main_inst, sampFreqKHz >= 32 ? 32000 : 16000);
-  /* Error check */
-  if (err < 0) {
-    fprintf(stderr, "\n\n Error in create.\n\n");
-    exit(EXIT_FAILURE);
-  }
-
-  framecnt = 0;
-  endfile = 0;
-
-  /* Initialize encoder and decoder */
-  if (WebRtcIsac_EncoderInit(ISAC_main_inst, codingMode) < 0) {
-    printf("cannot initialize encoder\n");
-    return -1;
-  }
-  WebRtcIsac_DecoderInit(ISAC_main_inst);
-
-  if (codingMode == 1) {
-    if (WebRtcIsac_Control(ISAC_main_inst, bottleneck, frameSize) < 0) {
-      printf("cannot set bottleneck\n");
-      return -1;
-    }
-  } else {
-    if (WebRtcIsac_ControlBwe(ISAC_main_inst, 15000, 30, 1) < 0) {
-      printf("cannot configure BWE\n");
-      return -1;
-    }
-  }
-
-  if (WebRtcIsac_SetMaxPayloadSize(ISAC_main_inst, payloadLimit) < 0) {
-    printf("cannot set maximum payload size %d.\n", payloadLimit);
-    return -1;
-  }
-
-  if (rateLimit < 106800) {
-    if (WebRtcIsac_SetMaxRate(ISAC_main_inst, rateLimit) < 0) {
-      printf("cannot set the maximum rate %d.\n", rateLimit);
-      return -1;
-    }
-  }
-
-  while (endfile == 0) {
-    fprintf(stderr, "  \rframe = %7li", framecnt);
-
-    //============== Readind from the file and encoding =================
-    cur_framesmpls = 0;
-    stream_len = 0;
-
-    if (onlyDecode) {
-      uint8_t auxUW8;
-      if (fread(&auxUW8, sizeof(uint8_t), 1, inp) < 1) {
-        break;
-      }
-      stream_len = auxUW8 << 8;
-      if (fread(&auxUW8, sizeof(uint8_t), 1, inp) < 1) {
-        break;
-      }
-      stream_len |= auxUW8;
-      if (fread(payload, 1, stream_len, inp) < stream_len) {
-        printf("last payload is corrupted\n");
-        break;
-      }
-    } else {
-      while (stream_len == 0) {
-        int stream_len_int;
-
-        // Read 10 ms speech block
-        endfile = readframe(shortdata, inp, samplesIn10Ms);
-        if (endfile) {
-          break;
-        }
-        cur_framesmpls += samplesIn10Ms;
-
-        //-------- iSAC encoding ---------
-        stream_len_int = WebRtcIsac_Encode(ISAC_main_inst, shortdata, payload);
-
-        if (stream_len_int < 0) {
-          // exit if returned with error
-          // errType=WebRtcIsac_GetErrorCode(ISAC_main_inst);
-          fprintf(stderr, "\nError in encoder\n");
-          getc(stdin);
-          exit(EXIT_FAILURE);
-        }
-        stream_len = (size_t)stream_len_int;
-      }
-      //===================================================================
-      if (endfile) {
-        break;
-      }
-
-      rcuStreamLen = WebRtcIsac_GetRedPayload(ISAC_main_inst, payloadRCU);
-      if (rcuStreamLen < 0) {
-        fprintf(stderr, "\nError getting RED payload\n");
-        getc(stdin);
-        exit(EXIT_FAILURE);
-      }
-
-      get_arrival_time(cur_framesmpls, stream_len, bottleneck, &packetData,
-                       sampFreqKHz * 1000, sampFreqKHz * 1000);
-      if (WebRtcIsac_UpdateBwEstimate(
-              ISAC_main_inst, payload, stream_len, packetData.rtp_number,
-              packetData.sample_count, packetData.arrival_time) < 0) {
-        printf(" BWE Error at client\n");
-        return -1;
-      }
-    }
-
-    if (endfile) {
-      break;
-    }
-
-    maxStreamLen = (stream_len > maxStreamLen) ? stream_len : maxStreamLen;
-    packetCntr++;
-
-    hist[stream_len]++;
-    if (averageFile != NULL) {
-      tmpSumStreamLen += stream_len;
-      if (packetCntr == 100) {
-        // kbps
-        fprintf(averageFile, "%8.3f ",
-                tmpSumStreamLen * 8.0 / (30.0 * packetCntr));
-        packetCntr = 0;
-        tmpSumStreamLen = 0;
-      }
-    }
-
-    if (onlyEncode) {
-      uint8_t auxUW8;
-      auxUW8 = (uint8_t)(((stream_len & 0x7F00) >> 8) & 0xFF);
-      if (fwrite(&auxUW8, sizeof(uint8_t), 1, outp) != 1) {
-        return -1;
-      }
-
-      auxUW8 = (uint8_t)(stream_len & 0xFF);
-      if (fwrite(&auxUW8, sizeof(uint8_t), 1, outp) != 1) {
-        return -1;
-      }
-      if (fwrite(payload, 1, stream_len, outp) != stream_len) {
-        return -1;
-      }
-    } else {
-      //======================= iSAC decoding ===========================
-
-      if ((rand() % 100) < packetLossPercent) {
-        declen = WebRtcIsac_DecodeRcu(ISAC_main_inst, payloadRCU,
-                                      (size_t)rcuStreamLen, decoded,
-                                      speechType);
-        lostPacketCntr++;
-      } else {
-        declen = WebRtcIsac_Decode(ISAC_main_inst, payload, stream_len, decoded,
-                                   speechType);
-      }
-      if (declen <= 0) {
-        // errType=WebRtcIsac_GetErrorCode(ISAC_main_inst);
-        fprintf(stderr, "\nError in decoder.\n");
-        getc(stdin);
-        exit(1);
-      }
-
-      // Write decoded speech frame to file
-      if (fwrite(decoded, sizeof(int16_t), declen, outp) != (size_t)declen) {
-        return -1;
-      }
-      cur_framesmpls = declen;
-    }
-    // Update Statistics
-    framecnt++;
-    totalsmpls += cur_framesmpls;
-    if (stream_len > 0) {
-      totalbits += 8 * stream_len;
-    }
-    if (rcuStreamLen > 0) {
-      totalBitsRCU += 8 * rcuStreamLen;
-    }
-  }
-
-  rate = ((double)totalbits * (sampFreqKHz)) / (double)totalsmpls;
-  rateRCU = ((double)totalBitsRCU * (sampFreqKHz)) / (double)totalsmpls;
-
-  printf("\n\n");
-  printf("Sampling Rate............... %d kHz\n", sampFreqKHz);
-  printf("Payload Limit............... %d bytes \n", payloadLimit);
-  printf("Rate Limit.................. %d bits/sec \n", rateLimit);
-
-#ifdef WIN32
-  fprintf(bitrateFile, "%d  %10u     %d     %6.3f  %6.3f    %6.3f\n",
-          sampFreqKHz, framecnt, bottleneck, rateLB, rateUB, rate);
-  fclose(bitrateFile);
-#endif  // WIN32
-
-  printf("\n");
-  printf("Measured bit-rate........... %0.3f kbps\n", rate);
-  printf("Measured RCU bit-ratre...... %0.3f kbps\n", rateRCU);
-  printf("Maximum bit-rate/payloadsize %0.3f / %" PRIuS "\n",
-         maxStreamLen * 8 / 0.03, maxStreamLen);
-  printf("Measured packet-loss........ %0.1f%% \n",
-         100.0f * (float)lostPacketCntr / (float)packetCntr);
-
-  printf("\n");
-
-/* Runtime statistics */
-#ifdef WIN32
-  runtime = (double)(clock() / (double)CLOCKS_PER_SEC - starttime);
-  length_file = ((double)framecnt * (double)declen / (sampFreqKHz * 1000));
-  printf("Length of speech file....... %.1f s\n", length_file);
-  printf("Time to run iSAC............ %.2f s (%.2f %% of realtime)\n\n",
-         runtime, (100 * runtime / length_file));
-#endif
-  printf("\n\n_______________________________________________\n");
-
-  if (histFile != NULL) {
-    int n;
-    for (n = 0; n < 600; n++) {
-      fprintf(histFile, "%6d ", hist[n]);
-    }
-    fprintf(histFile, "\n");
-    fclose(histFile);
-  }
-  if (averageFile != NULL) {
-    if (packetCntr > 0) {
-      fprintf(averageFile, "%8.3f ",
-              tmpSumStreamLen * 8.0 / (30.0 * packetCntr));
-    }
-    fprintf(averageFile, "\n");
-    fclose(averageFile);
-  }
-
-  fclose(inp);
-  fclose(outp);
-
-  WebRtcIsac_Free(ISAC_main_inst);
-
-  exit(0);
-}
diff --git a/modules/audio_coding/codecs/isac/main/util/utility.c b/modules/audio_coding/codecs/isac/main/util/utility.c
deleted file mode 100644
index d9c4332..0000000
--- a/modules/audio_coding/codecs/isac/main/util/utility.c
+++ /dev/null
@@ -1,178 +0,0 @@
-/*
- *  Copyright (c) 2011 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 <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <math.h>
-#include "utility.h"
-
-/* function for reading audio data from PCM file */
-int
-readframe(
-    short* data,
-    FILE*  inp,
-    int    length)
-{
-    short k, rlen, status = 0;
-	unsigned char* ptrUChar;
-	ptrUChar = (unsigned char*)data;
-
-    rlen = (short)fread(data, sizeof(short), length, inp);
-    if (rlen < length) {
-        for (k = rlen; k < length; k++)
-            data[k] = 0;
-        status = 1;
-    }
-
-	// Assuming that our PCM files are written in Intel machines
-	for(k = 0; k < length; k++)
-	{
-		data[k] = (short)ptrUChar[k<<1] | ((((short)ptrUChar[(k<<1) + 1]) << 8) & 0xFF00);
-	}
-
-    return status;
-}
-
-short
-readSwitch(
-    int   argc,
-    char* argv[],
-    char* strID)
-{
-    short n;
-    for(n = 0; n < argc; n++)
-    {
-        if(strcmp(argv[n], strID) == 0)
-        {
-            return 1;
-        }
-    }
-    return 0;
-}
-
-double
-readParamDouble(
-    int    argc,
-    char*  argv[],
-    char*  strID,
-    double defaultVal)
-{
-    double returnVal = defaultVal;
-    short n;
-    for(n = 0; n < argc; n++)
-    {
-        if(strcmp(argv[n], strID) == 0)
-        {
-            n++;
-            if(n < argc)
-            {
-                returnVal = atof(argv[n]);
-            }
-            break;
-        }
-    }
-    return returnVal;
-}
-
-int
-readParamInt(
-    int   argc,
-    char* argv[],
-    char* strID,
-    int   defaultVal)
-{
-    int returnVal = defaultVal;
-    short n;
-    for(n = 0; n < argc; n++)
-    {
-        if(strcmp(argv[n], strID) == 0)
-        {
-            n++;
-            if(n < argc)
-            {
-                returnVal = atoi(argv[n]);
-            }
-            break;
-        }
-    }
-    return returnVal;
-}
-
-int
-readParamString(
-    int   argc,
-    char* argv[],
-    char* strID,
-    char* stringParam,
-    int   maxSize)
-{
-    int paramLenght = 0;
-    short n;
-    for(n = 0; n < argc; n++)
-    {
-        if(strcmp(argv[n], strID) == 0)
-        {
-            n++;
-            if(n < argc)
-            {
-                strncpy(stringParam, argv[n], maxSize);
-                paramLenght = (int)strlen(argv[n]);
-            }
-            break;
-        }
-    }
-    return paramLenght;
-}
-
-void
-get_arrival_time(
-    int              current_framesamples,   /* samples */
-    size_t           packet_size,            /* bytes */
-    int              bottleneck,             /* excluding headers; bits/s */
-    BottleNeckModel* BN_data,
-    short            senderSampFreqHz,
-    short            receiverSampFreqHz)
-{
-    unsigned int travelTimeMs;
-	const int headerSizeByte = 35;
-
-	int headerRate;
-
-    BN_data->whenPackGeneratedMs += (current_framesamples / (senderSampFreqHz / 1000));
-
-	headerRate = headerSizeByte * 8 * senderSampFreqHz / current_framesamples;     /* bits/s */
-
-	/* everything in samples */
-	BN_data->sample_count = BN_data->sample_count + current_framesamples;
-
-    //travelTimeMs = ((packet_size + HeaderSize) * 8 * sampFreqHz) /
-    //    (bottleneck + HeaderRate)
-    travelTimeMs = (unsigned int)floor((double)((packet_size + headerSizeByte) * 8 * 1000)
-        / (double)(bottleneck + headerRate) + 0.5);
-
-    if(BN_data->whenPrevPackLeftMs > BN_data->whenPackGeneratedMs)
-    {
-        BN_data->whenPrevPackLeftMs += travelTimeMs;
-    }
-    else
-    {
-        BN_data->whenPrevPackLeftMs = BN_data->whenPackGeneratedMs +
-            travelTimeMs;
-    }
-
-    BN_data->arrival_time = (BN_data->whenPrevPackLeftMs *
-        (receiverSampFreqHz / 1000));
-
-//	if (BN_data->arrival_time < BN_data->sample_count)
-//		BN_data->arrival_time = BN_data->sample_count;
-
-	BN_data->rtp_number++;
-}
diff --git a/modules/audio_coding/codecs/isac/main/util/utility.h b/modules/audio_coding/codecs/isac/main/util/utility.h
deleted file mode 100644
index 1bb6d29..0000000
--- a/modules/audio_coding/codecs/isac/main/util/utility.h
+++ /dev/null
@@ -1,144 +0,0 @@
-/*
- *  Copyright (c) 2011 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_CODECS_ISAC_MAIN_UTIL_UTILITY_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_MAIN_UTIL_UTILITY_H_
-
-#include <stdlib.h>
-#include <stdio.h>
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-#define OPEN_FILE_WB(filePtr, fullPath)                         \
-  do                                                            \
-  {                                                             \
-    if(fullPath != NULL)                                        \
-    {                                                           \
-      filePtr = fopen(fullPath, "wb");                          \
-      if(filePtr == NULL)                                       \
-      {                                                         \
-        printf("could not open %s to write to.", fullPath);     \
-        return -1;                                              \
-      }                                                         \
-    }                                                           \
-    else                                                        \
-    {                                                           \
-      filePtr = NULL;                                           \
-    }                                                           \
-  }while(0)
-
-#define OPEN_FILE_AB(filePtr, fullPath)                         \
-  do                                                            \
-  {                                                             \
-    if(fullPath != NULL)                                        \
-    {                                                           \
-      filePtr = fopen(fullPath, "ab");                          \
-      if(filePtr == NULL)                                       \
-      {                                                         \
-        printf("could not open %s to write to.", fullPath);     \
-        return -1;                                              \
-      }                                                         \
-    }                                                           \
-    else                                                        \
-    {                                                           \
-      filePtr = NULL;                                           \
-    }                                                           \
-  }while(0)
-
-#define OPEN_FILE_RB(filePtr, fullPath)                         \
-  do                                                            \
-  {                                                             \
-    if(fullPath != NULL)                                        \
-    {                                                           \
-      filePtr = fopen(fullPath, "rb");                          \
-      if(filePtr == NULL)                                       \
-      {                                                         \
-        printf("could not open %s to read from.", fullPath);    \
-        return -1;                                              \
-      }                                                         \
-    }                                                           \
-    else                                                        \
-    {                                                           \
-      filePtr = NULL;                                           \
-    }                                                           \
-  }while(0)
-
-#define WRITE_FILE_D(bufferPtr, len, filePtr)           \
-  do                                                    \
-  {                                                     \
-    if(filePtr != NULL)                                 \
-    {                                                   \
-      double dummy[1000];                               \
-      int cntr;                                         \
-      for(cntr = 0; cntr < (len); cntr++)               \
-      {                                                 \
-        dummy[cntr] = (double)bufferPtr[cntr];          \
-      }                                                 \
-      fwrite(dummy, sizeof(double), len, filePtr);      \
-      fflush(filePtr);                                  \
-    }                                                   \
-  } while(0)
-
-  typedef struct {
-    unsigned int whenPackGeneratedMs;
-    unsigned int whenPrevPackLeftMs;
-    unsigned int sendTimeMs ;          /* milisecond */
-    unsigned int arrival_time;         /* samples */
-    unsigned int sample_count;         /* samples, also used as "send time stamp" */
-    unsigned int rtp_number;
-  } BottleNeckModel;
-
-  void get_arrival_time(
-      int              current_framesamples,   /* samples */
-      size_t           packet_size,            /* bytes */
-      int              bottleneck,             /* excluding headers; bits/s */
-      BottleNeckModel* BN_data,
-      short            senderSampFreqHz,
-      short            receiverSampFreqHz);
-
-  /* function for reading audio data from PCM file */
-  int readframe(
-      short* data,
-      FILE*  inp,
-      int    length);
-
-  short readSwitch(
-      int   argc,
-      char* argv[],
-      char* strID);
-
-  double readParamDouble(
-      int    argc,
-      char*  argv[],
-      char*  strID,
-      double defaultVal);
-
-  int readParamInt(
-      int   argc,
-      char* argv[],
-      char* strID,
-      int   defaultVal);
-
-  int readParamString(
-      int   argc,
-      char* argv[],
-      char* strID,
-      char* stringParam,
-      int   maxSize);
-
-#if defined(__cplusplus)
-}
-#endif
-
-
-
-#endif
diff --git a/modules/audio_coding/codecs/isac/unittest.cc b/modules/audio_coding/codecs/isac/unittest.cc
deleted file mode 100644
index 1f4ae80..0000000
--- a/modules/audio_coding/codecs/isac/unittest.cc
+++ /dev/null
@@ -1,254 +0,0 @@
-/*
- *  Copyright (c) 2015 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 <algorithm>
-#include <numeric>
-#include <sstream>
-#include <vector>
-
-#include "webrtc/modules/audio_coding/codecs/isac/fix/include/audio_encoder_isacfix.h"
-#include "webrtc/modules/audio_coding/codecs/isac/main/include/audio_encoder_isac.h"
-#include "webrtc/modules/audio_coding/neteq/tools/input_audio_file.h"
-#include "webrtc/rtc_base/buffer.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/testsupport/fileutils.h"
-
-namespace webrtc {
-
-namespace {
-
-const int kIsacNumberOfSamples = 32 * 60;  // 60 ms at 32 kHz
-
-std::vector<int16_t> LoadSpeechData() {
-  webrtc::test::InputAudioFile input_file(
-      webrtc::test::ResourcePath("audio_coding/testfile32kHz", "pcm"));
-  std::vector<int16_t> speech_data(kIsacNumberOfSamples);
-  input_file.Read(kIsacNumberOfSamples, speech_data.data());
-  return speech_data;
-}
-
-template <typename T>
-IsacBandwidthInfo GetBwInfo(typename T::instance_type* inst) {
-  IsacBandwidthInfo bi;
-  T::GetBandwidthInfo(inst, &bi);
-  EXPECT_TRUE(bi.in_use);
-  return bi;
-}
-
-// Encodes one packet. Returns the packet duration in milliseconds.
-template <typename T>
-int EncodePacket(typename T::instance_type* inst,
-                 const IsacBandwidthInfo* bi,
-                 const int16_t* speech_data,
-                 rtc::Buffer* output) {
-  output->SetSize(1000);
-  for (int duration_ms = 10;; duration_ms += 10) {
-    if (bi)
-      T::SetBandwidthInfo(inst, bi);
-    int encoded_bytes = T::Encode(inst, speech_data, output->data());
-    if (encoded_bytes > 0 || duration_ms >= 60) {
-      EXPECT_GT(encoded_bytes, 0);
-      EXPECT_LE(static_cast<size_t>(encoded_bytes), output->size());
-      output->SetSize(encoded_bytes);
-      return duration_ms;
-    }
-  }
-}
-
-template <typename T>
-std::vector<int16_t> DecodePacket(typename T::instance_type* inst,
-                                  const rtc::Buffer& encoded) {
-  std::vector<int16_t> decoded(kIsacNumberOfSamples);
-  int16_t speech_type;
-  int nsamples = T::DecodeInternal(inst, encoded.data(), encoded.size(),
-                                   &decoded.front(), &speech_type);
-  EXPECT_GT(nsamples, 0);
-  EXPECT_LE(static_cast<size_t>(nsamples), decoded.size());
-  decoded.resize(nsamples);
-  return decoded;
-}
-
-class BoundedCapacityChannel final {
- public:
-  BoundedCapacityChannel(int sample_rate_hz, int rate_bits_per_second)
-      : current_time_rtp_(0),
-        channel_rate_bytes_per_sample_(rate_bits_per_second /
-                                       (8.0 * sample_rate_hz)) {}
-
-  // Simulate sending the given number of bytes at the given RTP time. Returns
-  // the new current RTP time after the sending is done.
-  int Send(int send_time_rtp, int nbytes) {
-    current_time_rtp_ = std::max(current_time_rtp_, send_time_rtp) +
-                        nbytes / channel_rate_bytes_per_sample_;
-    return current_time_rtp_;
-  }
-
- private:
-  int current_time_rtp_;
-  // The somewhat strange unit for channel rate, bytes per sample, is because
-  // RTP time is measured in samples:
-  const double channel_rate_bytes_per_sample_;
-};
-
-// Test that the iSAC encoder produces identical output whether or not we use a
-// conjoined encoder+decoder pair or a separate encoder and decoder that
-// communicate BW estimation info explicitly.
-template <typename T, bool adaptive>
-void TestGetSetBandwidthInfo(const int16_t* speech_data,
-                             int rate_bits_per_second,
-                             int sample_rate_hz,
-                             int frame_size_ms) {
-  const int bit_rate = 32000;
-
-  // Conjoined encoder/decoder pair:
-  typename T::instance_type* encdec;
-  ASSERT_EQ(0, T::Create(&encdec));
-  ASSERT_EQ(0, T::EncoderInit(encdec, adaptive ? 0 : 1));
-  T::DecoderInit(encdec);
-  ASSERT_EQ(0, T::SetEncSampRate(encdec, sample_rate_hz));
-  if (adaptive)
-    ASSERT_EQ(0, T::ControlBwe(encdec, bit_rate, frame_size_ms, false));
-  else
-    ASSERT_EQ(0, T::Control(encdec, bit_rate, frame_size_ms));
-
-  // Disjoint encoder/decoder pair:
-  typename T::instance_type* enc;
-  ASSERT_EQ(0, T::Create(&enc));
-  ASSERT_EQ(0, T::EncoderInit(enc, adaptive ? 0 : 1));
-  ASSERT_EQ(0, T::SetEncSampRate(enc, sample_rate_hz));
-  if (adaptive)
-    ASSERT_EQ(0, T::ControlBwe(enc, bit_rate, frame_size_ms, false));
-  else
-    ASSERT_EQ(0, T::Control(enc, bit_rate, frame_size_ms));
-  typename T::instance_type* dec;
-  ASSERT_EQ(0, T::Create(&dec));
-  T::DecoderInit(dec);
-  T::SetInitialBweBottleneck(dec, bit_rate);
-  T::SetEncSampRateInDecoder(dec, sample_rate_hz);
-
-  // 0. Get initial BW info from decoder.
-  auto bi = GetBwInfo<T>(dec);
-
-  BoundedCapacityChannel channel1(sample_rate_hz, rate_bits_per_second),
-      channel2(sample_rate_hz, rate_bits_per_second);
-
-  int elapsed_time_ms = 0;
-  for (int i = 0; elapsed_time_ms < 10000; ++i) {
-    std::ostringstream ss;
-    ss << " i = " << i;
-    SCOPED_TRACE(ss.str());
-
-    // 1. Encode 3 * 10 ms or 6 * 10 ms. The separate encoder is given the BW
-    // info before each encode call.
-    rtc::Buffer bitstream1, bitstream2;
-    int duration1_ms =
-        EncodePacket<T>(encdec, nullptr, speech_data, &bitstream1);
-    int duration2_ms = EncodePacket<T>(enc, &bi, speech_data, &bitstream2);
-    EXPECT_EQ(duration1_ms, duration2_ms);
-    if (adaptive)
-      EXPECT_TRUE(duration1_ms == 30 || duration1_ms == 60);
-    else
-      EXPECT_EQ(frame_size_ms, duration1_ms);
-    ASSERT_EQ(bitstream1.size(), bitstream2.size());
-    EXPECT_EQ(bitstream1, bitstream2);
-
-    // 2. Deliver the encoded data to the decoders.
-    const int send_time = elapsed_time_ms * (sample_rate_hz / 1000);
-    EXPECT_EQ(0, T::UpdateBwEstimate(
-                     encdec, bitstream1.data(), bitstream1.size(), i, send_time,
-                     channel1.Send(send_time, bitstream1.size())));
-    EXPECT_EQ(0, T::UpdateBwEstimate(
-                     dec, bitstream2.data(), bitstream2.size(), i, send_time,
-                     channel2.Send(send_time, bitstream2.size())));
-
-    // 3. Decode, and get new BW info from the separate decoder.
-    ASSERT_EQ(0, T::SetDecSampRate(encdec, sample_rate_hz));
-    ASSERT_EQ(0, T::SetDecSampRate(dec, sample_rate_hz));
-    auto decoded1 = DecodePacket<T>(encdec, bitstream1);
-    auto decoded2 = DecodePacket<T>(dec, bitstream2);
-    EXPECT_EQ(decoded1, decoded2);
-    bi = GetBwInfo<T>(dec);
-
-    elapsed_time_ms += duration1_ms;
-  }
-
-  EXPECT_EQ(0, T::Free(encdec));
-  EXPECT_EQ(0, T::Free(enc));
-  EXPECT_EQ(0, T::Free(dec));
-}
-
-enum class IsacType { Fix, Float };
-
-std::ostream& operator<<(std::ostream& os, IsacType t) {
-  os << (t == IsacType::Fix ? "fix" : "float");
-  return os;
-}
-
-struct IsacTestParam {
-  IsacType isac_type;
-  bool adaptive;
-  int channel_rate_bits_per_second;
-  int sample_rate_hz;
-  int frame_size_ms;
-
-  friend std::ostream& operator<<(std::ostream& os, const IsacTestParam& itp) {
-    os << '{' << itp.isac_type << ','
-       << (itp.adaptive ? "adaptive" : "nonadaptive") << ','
-       << itp.channel_rate_bits_per_second << ',' << itp.sample_rate_hz << ','
-       << itp.frame_size_ms << '}';
-    return os;
-  }
-};
-
-class IsacCommonTest : public testing::TestWithParam<IsacTestParam> {};
-
-}  // namespace
-
-TEST_P(IsacCommonTest, GetSetBandwidthInfo) {
-  auto p = GetParam();
-  auto test_fun = [p] {
-    if (p.isac_type == IsacType::Fix) {
-      if (p.adaptive)
-        return TestGetSetBandwidthInfo<IsacFix, true>;
-      else
-        return TestGetSetBandwidthInfo<IsacFix, false>;
-    } else {
-      if (p.adaptive)
-        return TestGetSetBandwidthInfo<IsacFloat, true>;
-      else
-        return TestGetSetBandwidthInfo<IsacFloat, false>;
-    }
-  }();
-  test_fun(LoadSpeechData().data(), p.channel_rate_bits_per_second,
-           p.sample_rate_hz, p.frame_size_ms);
-}
-
-std::vector<IsacTestParam> TestCases() {
-  static const IsacType types[] = {IsacType::Fix, IsacType::Float};
-  static const bool adaptives[] = {true, false};
-  static const int channel_rates[] = {12000, 15000, 19000, 22000};
-  static const int sample_rates[] = {16000, 32000};
-  static const int frame_sizes[] = {30, 60};
-  std::vector<IsacTestParam> cases;
-  for (IsacType type : types)
-    for (bool adaptive : adaptives)
-      for (int channel_rate : channel_rates)
-        for (int sample_rate : sample_rates)
-          if (!(type == IsacType::Fix && sample_rate == 32000))
-            for (int frame_size : frame_sizes)
-              if (!(sample_rate == 32000 && frame_size == 60))
-                cases.push_back(
-                    {type, adaptive, channel_rate, sample_rate, frame_size});
-  return cases;
-}
-
-INSTANTIATE_TEST_CASE_P(, IsacCommonTest, testing::ValuesIn(TestCases()));
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/codecs/legacy_encoded_audio_frame.cc b/modules/audio_coding/codecs/legacy_encoded_audio_frame.cc
deleted file mode 100644
index e0f1faf..0000000
--- a/modules/audio_coding/codecs/legacy_encoded_audio_frame.cc
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- *  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/codecs/legacy_encoded_audio_frame.h"
-
-#include <algorithm>
-#include <memory>
-#include <utility>
-
-namespace webrtc {
-
-LegacyEncodedAudioFrame::LegacyEncodedAudioFrame(AudioDecoder* decoder,
-                                                 rtc::Buffer&& payload)
-    : decoder_(decoder), payload_(std::move(payload)) {}
-
-LegacyEncodedAudioFrame::~LegacyEncodedAudioFrame() = default;
-
-size_t LegacyEncodedAudioFrame::Duration() const {
-  const int ret = decoder_->PacketDuration(payload_.data(), payload_.size());
-  return (ret < 0) ? 0 : static_cast<size_t>(ret);
-}
-
-rtc::Optional<AudioDecoder::EncodedAudioFrame::DecodeResult>
-LegacyEncodedAudioFrame::Decode(rtc::ArrayView<int16_t> decoded) const {
-  AudioDecoder::SpeechType speech_type = AudioDecoder::kSpeech;
-  const int ret = decoder_->Decode(
-      payload_.data(), payload_.size(), decoder_->SampleRateHz(),
-      decoded.size() * sizeof(int16_t), decoded.data(), &speech_type);
-
-  if (ret < 0)
-    return rtc::Optional<DecodeResult>();
-
-  return rtc::Optional<DecodeResult>({static_cast<size_t>(ret), speech_type});
-}
-
-std::vector<AudioDecoder::ParseResult> LegacyEncodedAudioFrame::SplitBySamples(
-    AudioDecoder* decoder,
-    rtc::Buffer&& payload,
-    uint32_t timestamp,
-    size_t bytes_per_ms,
-    uint32_t timestamps_per_ms) {
-  RTC_DCHECK(payload.data());
-  std::vector<AudioDecoder::ParseResult> results;
-  size_t split_size_bytes = payload.size();
-
-  // Find a "chunk size" >= 20 ms and < 40 ms.
-  const size_t min_chunk_size = bytes_per_ms * 20;
-  if (min_chunk_size >= payload.size()) {
-    std::unique_ptr<LegacyEncodedAudioFrame> frame(
-        new LegacyEncodedAudioFrame(decoder, std::move(payload)));
-    results.emplace_back(timestamp, 0, std::move(frame));
-  } else {
-    // Reduce the split size by half as long as |split_size_bytes| is at least
-    // twice the minimum chunk size (so that the resulting size is at least as
-    // large as the minimum chunk size).
-    while (split_size_bytes >= 2 * min_chunk_size) {
-      split_size_bytes /= 2;
-    }
-
-    const uint32_t timestamps_per_chunk = static_cast<uint32_t>(
-        split_size_bytes * timestamps_per_ms / bytes_per_ms);
-    size_t byte_offset;
-    uint32_t timestamp_offset;
-    for (byte_offset = 0, timestamp_offset = 0;
-         byte_offset < payload.size();
-         byte_offset += split_size_bytes,
-             timestamp_offset += timestamps_per_chunk) {
-      split_size_bytes =
-          std::min(split_size_bytes, payload.size() - byte_offset);
-      rtc::Buffer new_payload(payload.data() + byte_offset, split_size_bytes);
-      std::unique_ptr<LegacyEncodedAudioFrame> frame(
-          new LegacyEncodedAudioFrame(decoder, std::move(new_payload)));
-      results.emplace_back(timestamp + timestamp_offset, 0, std::move(frame));
-    }
-  }
-
-  return results;
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/codecs/legacy_encoded_audio_frame.h b/modules/audio_coding/codecs/legacy_encoded_audio_frame.h
deleted file mode 100644
index e8ea029..0000000
--- a/modules/audio_coding/codecs/legacy_encoded_audio_frame.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- *  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_CODECS_LEGACY_ENCODED_AUDIO_FRAME_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_LEGACY_ENCODED_AUDIO_FRAME_H_
-
-#include <vector>
-
-#include "webrtc/api/array_view.h"
-#include "webrtc/api/audio_codecs/audio_decoder.h"
-
-namespace webrtc {
-
-class LegacyEncodedAudioFrame final : public AudioDecoder::EncodedAudioFrame {
- public:
-  LegacyEncodedAudioFrame(AudioDecoder* decoder, rtc::Buffer&& payload);
-  ~LegacyEncodedAudioFrame() override;
-
-  static std::vector<AudioDecoder::ParseResult> SplitBySamples(
-      AudioDecoder* decoder,
-      rtc::Buffer&& payload,
-      uint32_t timestamp,
-      size_t bytes_per_ms,
-      uint32_t timestamps_per_ms);
-
-  size_t Duration() const override;
-
-  rtc::Optional<DecodeResult> Decode(
-      rtc::ArrayView<int16_t> decoded) const override;
-
-  // For testing:
-  const rtc::Buffer& payload() const { return payload_; }
-
- private:
-  AudioDecoder* const decoder_;
-  const rtc::Buffer payload_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_CODING_CODECS_LEGACY_ENCODED_AUDIO_FRAME_H_
diff --git a/modules/audio_coding/codecs/legacy_encoded_audio_frame_unittest.cc b/modules/audio_coding/codecs/legacy_encoded_audio_frame_unittest.cc
deleted file mode 100644
index fe049ab..0000000
--- a/modules/audio_coding/codecs/legacy_encoded_audio_frame_unittest.cc
+++ /dev/null
@@ -1,167 +0,0 @@
-/*
- *  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/acm2/rent_a_codec.h"
-#include "webrtc/modules/audio_coding/codecs/legacy_encoded_audio_frame.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-class SplitBySamplesTest : public ::testing::TestWithParam<NetEqDecoder> {
- protected:
-  virtual void SetUp() {
-    decoder_type_ = GetParam();
-    switch (decoder_type_) {
-      case NetEqDecoder::kDecoderPCMu:
-      case NetEqDecoder::kDecoderPCMa:
-        bytes_per_ms_ = 8;
-        samples_per_ms_ = 8;
-        break;
-      case NetEqDecoder::kDecoderPCMu_2ch:
-      case NetEqDecoder::kDecoderPCMa_2ch:
-        bytes_per_ms_ = 2 * 8;
-        samples_per_ms_ = 8;
-        break;
-      case NetEqDecoder::kDecoderG722:
-        bytes_per_ms_ = 8;
-        samples_per_ms_ = 16;
-        break;
-      case NetEqDecoder::kDecoderPCM16B:
-        bytes_per_ms_ = 16;
-        samples_per_ms_ = 8;
-        break;
-      case NetEqDecoder::kDecoderPCM16Bwb:
-        bytes_per_ms_ = 32;
-        samples_per_ms_ = 16;
-        break;
-      case NetEqDecoder::kDecoderPCM16Bswb32kHz:
-        bytes_per_ms_ = 64;
-        samples_per_ms_ = 32;
-        break;
-      case NetEqDecoder::kDecoderPCM16Bswb48kHz:
-        bytes_per_ms_ = 96;
-        samples_per_ms_ = 48;
-        break;
-      case NetEqDecoder::kDecoderPCM16B_2ch:
-        bytes_per_ms_ = 2 * 16;
-        samples_per_ms_ = 8;
-        break;
-      case NetEqDecoder::kDecoderPCM16Bwb_2ch:
-        bytes_per_ms_ = 2 * 32;
-        samples_per_ms_ = 16;
-        break;
-      case NetEqDecoder::kDecoderPCM16Bswb32kHz_2ch:
-        bytes_per_ms_ = 2 * 64;
-        samples_per_ms_ = 32;
-        break;
-      case NetEqDecoder::kDecoderPCM16Bswb48kHz_2ch:
-        bytes_per_ms_ = 2 * 96;
-        samples_per_ms_ = 48;
-        break;
-      case NetEqDecoder::kDecoderPCM16B_5ch:
-        bytes_per_ms_ = 5 * 16;
-        samples_per_ms_ = 8;
-        break;
-      default:
-        assert(false);
-        break;
-    }
-  }
-  size_t bytes_per_ms_;
-  int samples_per_ms_;
-  NetEqDecoder decoder_type_;
-};
-
-// Test splitting sample-based payloads.
-TEST_P(SplitBySamplesTest, PayloadSizes) {
-  constexpr uint32_t kBaseTimestamp = 0x12345678;
-  struct ExpectedSplit {
-    size_t payload_size_ms;
-    size_t num_frames;
-    // For simplicity. We only expect up to two packets per split.
-    size_t frame_sizes[2];
-  };
-  // The payloads are expected to be split as follows:
-  // 10 ms -> 10 ms
-  // 20 ms -> 20 ms
-  // 30 ms -> 30 ms
-  // 40 ms -> 20 + 20 ms
-  // 50 ms -> 25 + 25 ms
-  // 60 ms -> 30 + 30 ms
-  ExpectedSplit expected_splits[] = {
-    {10, 1, {10}},
-    {20, 1, {20}},
-    {30, 1, {30}},
-    {40, 2, {20, 20}},
-    {50, 2, {25, 25}},
-    {60, 2, {30, 30}}
-  };
-
-  for (const auto& expected_split : expected_splits) {
-    // The payload values are set to steadily increase (modulo 256), so that the
-    // resulting frames can be checked and we can be reasonably certain no
-    // sample was missed or repeated.
-    const auto generate_payload = [] (size_t num_bytes) {
-      rtc::Buffer payload(num_bytes);
-      uint8_t value = 0;
-      // Allow wrap-around of value in counter below.
-      for (size_t i = 0; i != payload.size(); ++i, ++value) {
-        payload[i] = value;
-      }
-      return payload;
-    };
-
-    const auto results = LegacyEncodedAudioFrame::SplitBySamples(
-        nullptr,
-        generate_payload(expected_split.payload_size_ms * bytes_per_ms_),
-        kBaseTimestamp, bytes_per_ms_, samples_per_ms_);
-
-    EXPECT_EQ(expected_split.num_frames, results.size());
-    uint32_t expected_timestamp = kBaseTimestamp;
-    uint32_t expected_byte_offset = 0;
-    uint8_t value = 0;
-    for (size_t i = 0; i != expected_split.num_frames; ++i) {
-      const auto& result = results[i];
-      const LegacyEncodedAudioFrame* frame =
-          static_cast<const LegacyEncodedAudioFrame*>(result.frame.get());
-      const size_t length_bytes = expected_split.frame_sizes[i] * bytes_per_ms_;
-      EXPECT_EQ(length_bytes, frame->payload().size());
-      EXPECT_EQ(expected_timestamp, result.timestamp);
-      const rtc::Buffer& payload = frame->payload();
-      // Allow wrap-around of value in counter below.
-      for (size_t i = 0; i != payload.size(); ++i, ++value) {
-        ASSERT_EQ(value, payload[i]);
-      }
-
-      expected_timestamp += expected_split.frame_sizes[i] * samples_per_ms_;
-      expected_byte_offset += length_bytes;
-    }
-  }
-}
-
-INSTANTIATE_TEST_CASE_P(
-    LegacyEncodedAudioFrame,
-    SplitBySamplesTest,
-    ::testing::Values(NetEqDecoder::kDecoderPCMu,
-                      NetEqDecoder::kDecoderPCMa,
-                      NetEqDecoder::kDecoderPCMu_2ch,
-                      NetEqDecoder::kDecoderPCMa_2ch,
-                      NetEqDecoder::kDecoderG722,
-                      NetEqDecoder::kDecoderPCM16B,
-                      NetEqDecoder::kDecoderPCM16Bwb,
-                      NetEqDecoder::kDecoderPCM16Bswb32kHz,
-                      NetEqDecoder::kDecoderPCM16Bswb48kHz,
-                      NetEqDecoder::kDecoderPCM16B_2ch,
-                      NetEqDecoder::kDecoderPCM16Bwb_2ch,
-                      NetEqDecoder::kDecoderPCM16Bswb32kHz_2ch,
-                      NetEqDecoder::kDecoderPCM16Bswb48kHz_2ch,
-                      NetEqDecoder::kDecoderPCM16B_5ch));
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/codecs/opus/audio_decoder_opus.cc b/modules/audio_coding/codecs/opus/audio_decoder_opus.cc
deleted file mode 100644
index 2270ff4..0000000
--- a/modules/audio_coding/codecs/opus/audio_decoder_opus.cc
+++ /dev/null
@@ -1,168 +0,0 @@
-/*
- *  Copyright (c) 2015 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/codecs/opus/audio_decoder_opus.h"
-
-#include <utility>
-
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-
-namespace {
-class OpusFrame : public AudioDecoder::EncodedAudioFrame {
- public:
-  OpusFrame(AudioDecoderOpusImpl* decoder,
-            rtc::Buffer&& payload,
-            bool is_primary_payload)
-      : decoder_(decoder),
-        payload_(std::move(payload)),
-        is_primary_payload_(is_primary_payload) {}
-
-  size_t Duration() const override {
-    int ret;
-    if (is_primary_payload_) {
-      ret = decoder_->PacketDuration(payload_.data(), payload_.size());
-    } else {
-      ret = decoder_->PacketDurationRedundant(payload_.data(), payload_.size());
-    }
-    return (ret < 0) ? 0 : static_cast<size_t>(ret);
-  }
-
-  rtc::Optional<DecodeResult> Decode(
-      rtc::ArrayView<int16_t> decoded) const override {
-    AudioDecoder::SpeechType speech_type = AudioDecoder::kSpeech;
-    int ret;
-    if (is_primary_payload_) {
-      ret = decoder_->Decode(
-          payload_.data(), payload_.size(), decoder_->SampleRateHz(),
-          decoded.size() * sizeof(int16_t), decoded.data(), &speech_type);
-    } else {
-      ret = decoder_->DecodeRedundant(
-          payload_.data(), payload_.size(), decoder_->SampleRateHz(),
-          decoded.size() * sizeof(int16_t), decoded.data(), &speech_type);
-    }
-
-    if (ret < 0)
-      return rtc::Optional<DecodeResult>();
-
-    return rtc::Optional<DecodeResult>({static_cast<size_t>(ret), speech_type});
-  }
-
- private:
-  AudioDecoderOpusImpl* const decoder_;
-  const rtc::Buffer payload_;
-  const bool is_primary_payload_;
-};
-
-}  // namespace
-
-AudioDecoderOpusImpl::AudioDecoderOpusImpl(size_t num_channels)
-    : channels_(num_channels) {
-  RTC_DCHECK(num_channels == 1 || num_channels == 2);
-  WebRtcOpus_DecoderCreate(&dec_state_, channels_);
-  WebRtcOpus_DecoderInit(dec_state_);
-}
-
-AudioDecoderOpusImpl::~AudioDecoderOpusImpl() {
-  WebRtcOpus_DecoderFree(dec_state_);
-}
-
-std::vector<AudioDecoder::ParseResult> AudioDecoderOpusImpl::ParsePayload(
-    rtc::Buffer&& payload,
-    uint32_t timestamp) {
-  std::vector<ParseResult> results;
-
-  if (PacketHasFec(payload.data(), payload.size())) {
-    const int duration =
-        PacketDurationRedundant(payload.data(), payload.size());
-    RTC_DCHECK_GE(duration, 0);
-    rtc::Buffer payload_copy(payload.data(), payload.size());
-    std::unique_ptr<EncodedAudioFrame> fec_frame(
-        new OpusFrame(this, std::move(payload_copy), false));
-    results.emplace_back(timestamp - duration, 1, std::move(fec_frame));
-  }
-  std::unique_ptr<EncodedAudioFrame> frame(
-      new OpusFrame(this, std::move(payload), true));
-  results.emplace_back(timestamp, 0, std::move(frame));
-  return results;
-}
-
-int AudioDecoderOpusImpl::DecodeInternal(const uint8_t* encoded,
-                                         size_t encoded_len,
-                                         int sample_rate_hz,
-                                         int16_t* decoded,
-                                         SpeechType* speech_type) {
-  RTC_DCHECK_EQ(sample_rate_hz, 48000);
-  int16_t temp_type = 1;  // Default is speech.
-  int ret =
-      WebRtcOpus_Decode(dec_state_, encoded, encoded_len, decoded, &temp_type);
-  if (ret > 0)
-    ret *= static_cast<int>(channels_);  // Return total number of samples.
-  *speech_type = ConvertSpeechType(temp_type);
-  return ret;
-}
-
-int AudioDecoderOpusImpl::DecodeRedundantInternal(const uint8_t* encoded,
-                                                  size_t encoded_len,
-                                                  int sample_rate_hz,
-                                                  int16_t* decoded,
-                                                  SpeechType* speech_type) {
-  if (!PacketHasFec(encoded, encoded_len)) {
-    // This packet is a RED packet.
-    return DecodeInternal(encoded, encoded_len, sample_rate_hz, decoded,
-                          speech_type);
-  }
-
-  RTC_DCHECK_EQ(sample_rate_hz, 48000);
-  int16_t temp_type = 1;  // Default is speech.
-  int ret = WebRtcOpus_DecodeFec(dec_state_, encoded, encoded_len, decoded,
-                                 &temp_type);
-  if (ret > 0)
-    ret *= static_cast<int>(channels_);  // Return total number of samples.
-  *speech_type = ConvertSpeechType(temp_type);
-  return ret;
-}
-
-void AudioDecoderOpusImpl::Reset() {
-  WebRtcOpus_DecoderInit(dec_state_);
-}
-
-int AudioDecoderOpusImpl::PacketDuration(const uint8_t* encoded,
-                                         size_t encoded_len) const {
-  return WebRtcOpus_DurationEst(dec_state_, encoded, encoded_len);
-}
-
-int AudioDecoderOpusImpl::PacketDurationRedundant(const uint8_t* encoded,
-                                                  size_t encoded_len) const {
-  if (!PacketHasFec(encoded, encoded_len)) {
-    // This packet is a RED packet.
-    return PacketDuration(encoded, encoded_len);
-  }
-
-  return WebRtcOpus_FecDurationEst(encoded, encoded_len);
-}
-
-bool AudioDecoderOpusImpl::PacketHasFec(const uint8_t* encoded,
-                                        size_t encoded_len) const {
-  int fec;
-  fec = WebRtcOpus_PacketHasFec(encoded, encoded_len);
-  return (fec == 1);
-}
-
-int AudioDecoderOpusImpl::SampleRateHz() const {
-  return 48000;
-}
-
-size_t AudioDecoderOpusImpl::Channels() const {
-  return channels_;
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/codecs/opus/audio_decoder_opus.h b/modules/audio_coding/codecs/opus/audio_decoder_opus.h
deleted file mode 100644
index d8512ec..0000000
--- a/modules/audio_coding/codecs/opus/audio_decoder_opus.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- *  Copyright (c) 2015 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_CODECS_OPUS_AUDIO_DECODER_OPUS_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_OPUS_AUDIO_DECODER_OPUS_H_
-
-#include "webrtc/api/audio_codecs/audio_decoder.h"
-#include "webrtc/modules/audio_coding/codecs/opus/opus_interface.h"
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace webrtc {
-
-class AudioDecoderOpusImpl final : public AudioDecoder {
- public:
-  explicit AudioDecoderOpusImpl(size_t num_channels);
-  ~AudioDecoderOpusImpl() override;
-
-  std::vector<ParseResult> ParsePayload(rtc::Buffer&& payload,
-                                        uint32_t timestamp) override;
-  void Reset() override;
-  int PacketDuration(const uint8_t* encoded, size_t encoded_len) const override;
-  int PacketDurationRedundant(const uint8_t* encoded,
-                              size_t encoded_len) const override;
-  bool PacketHasFec(const uint8_t* encoded, size_t encoded_len) const override;
-  int SampleRateHz() const override;
-  size_t Channels() const override;
-
- protected:
-  int DecodeInternal(const uint8_t* encoded,
-                     size_t encoded_len,
-                     int sample_rate_hz,
-                     int16_t* decoded,
-                     SpeechType* speech_type) override;
-  int DecodeRedundantInternal(const uint8_t* encoded,
-                              size_t encoded_len,
-                              int sample_rate_hz,
-                              int16_t* decoded,
-                              SpeechType* speech_type) override;
-
- private:
-  OpusDecInst* dec_state_;
-  const size_t channels_;
-  RTC_DISALLOW_COPY_AND_ASSIGN(AudioDecoderOpusImpl);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_CODING_CODECS_OPUS_AUDIO_DECODER_OPUS_H_
diff --git a/modules/audio_coding/codecs/opus/audio_encoder_opus.cc b/modules/audio_coding/codecs/opus/audio_encoder_opus.cc
deleted file mode 100644
index 3b4473a..0000000
--- a/modules/audio_coding/codecs/opus/audio_encoder_opus.cc
+++ /dev/null
@@ -1,783 +0,0 @@
-/*
- *  Copyright (c) 2014 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/codecs/opus/audio_encoder_opus.h"
-
-#include <algorithm>
-#include <iterator>
-#include <utility>
-
-#include "webrtc/common_types.h"
-#include "webrtc/modules/audio_coding/audio_network_adaptor/audio_network_adaptor_impl.h"
-#include "webrtc/modules/audio_coding/audio_network_adaptor/controller_manager.h"
-#include "webrtc/modules/audio_coding/codecs/opus/opus_interface.h"
-#include "webrtc/rtc_base/arraysize.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/numerics/exp_filter.h"
-#include "webrtc/rtc_base/protobuf_utils.h"
-#include "webrtc/rtc_base/ptr_util.h"
-#include "webrtc/rtc_base/safe_conversions.h"
-#include "webrtc/rtc_base/safe_minmax.h"
-#include "webrtc/rtc_base/string_to_number.h"
-#include "webrtc/rtc_base/timeutils.h"
-#include "webrtc/system_wrappers/include/field_trial.h"
-
-namespace webrtc {
-
-namespace {
-
-// Codec parameters for Opus.
-// draft-spittka-payload-rtp-opus-03
-
-// Recommended bitrates:
-// 8-12 kb/s for NB speech,
-// 16-20 kb/s for WB speech,
-// 28-40 kb/s for FB speech,
-// 48-64 kb/s for FB mono music, and
-// 64-128 kb/s for FB stereo music.
-// The current implementation applies the following values to mono signals,
-// and multiplies them by 2 for stereo.
-constexpr int kOpusBitrateNbBps = 12000;
-constexpr int kOpusBitrateWbBps = 20000;
-constexpr int kOpusBitrateFbBps = 32000;
-
-constexpr int kSampleRateHz = 48000;
-constexpr int kDefaultMaxPlaybackRate = 48000;
-
-// These two lists must be sorted from low to high
-#if WEBRTC_OPUS_SUPPORT_120MS_PTIME
-constexpr int kANASupportedFrameLengths[] = {20, 60, 120};
-constexpr int kOpusSupportedFrameLengths[] = {10, 20, 40, 60, 120};
-#else
-constexpr int kANASupportedFrameLengths[] = {20, 60};
-constexpr int kOpusSupportedFrameLengths[] = {10, 20, 40, 60};
-#endif
-
-// PacketLossFractionSmoother uses an exponential filter with a time constant
-// of -1.0 / ln(0.9999) = 10000 ms.
-constexpr float kAlphaForPacketLossFractionSmoother = 0.9999f;
-
-// Optimize the loss rate to configure Opus. Basically, optimized loss rate is
-// the input loss rate rounded down to various levels, because a robustly good
-// audio quality is achieved by lowering the packet loss down.
-// Additionally, to prevent toggling, margins are used, i.e., when jumping to
-// a loss rate from below, a higher threshold is used than jumping to the same
-// level from above.
-float OptimizePacketLossRate(float new_loss_rate, float old_loss_rate) {
-  RTC_DCHECK_GE(new_loss_rate, 0.0f);
-  RTC_DCHECK_LE(new_loss_rate, 1.0f);
-  RTC_DCHECK_GE(old_loss_rate, 0.0f);
-  RTC_DCHECK_LE(old_loss_rate, 1.0f);
-  constexpr float kPacketLossRate20 = 0.20f;
-  constexpr float kPacketLossRate10 = 0.10f;
-  constexpr float kPacketLossRate5 = 0.05f;
-  constexpr float kPacketLossRate1 = 0.01f;
-  constexpr float kLossRate20Margin = 0.02f;
-  constexpr float kLossRate10Margin = 0.01f;
-  constexpr float kLossRate5Margin = 0.01f;
-  if (new_loss_rate >=
-      kPacketLossRate20 +
-          kLossRate20Margin *
-              (kPacketLossRate20 - old_loss_rate > 0 ? 1 : -1)) {
-    return kPacketLossRate20;
-  } else if (new_loss_rate >=
-             kPacketLossRate10 +
-                 kLossRate10Margin *
-                     (kPacketLossRate10 - old_loss_rate > 0 ? 1 : -1)) {
-    return kPacketLossRate10;
-  } else if (new_loss_rate >=
-             kPacketLossRate5 +
-                 kLossRate5Margin *
-                     (kPacketLossRate5 - old_loss_rate > 0 ? 1 : -1)) {
-    return kPacketLossRate5;
-  } else if (new_loss_rate >= kPacketLossRate1) {
-    return kPacketLossRate1;
-  } else {
-    return 0.0f;
-  }
-}
-
-rtc::Optional<std::string> GetFormatParameter(const SdpAudioFormat& format,
-                                              const std::string& param) {
-  auto it = format.parameters.find(param);
-  return (it == format.parameters.end())
-             ? rtc::Optional<std::string>()
-             : rtc::Optional<std::string>(it->second);
-}
-
-template <typename T>
-rtc::Optional<T> GetFormatParameter(const SdpAudioFormat& format,
-                                    const std::string& param) {
-  return rtc::StringToNumber<T>(GetFormatParameter(format, param).value_or(""));
-}
-
-int CalculateDefaultBitrate(int max_playback_rate, size_t num_channels) {
-  const int bitrate = [&] {
-    if (max_playback_rate <= 8000) {
-      return kOpusBitrateNbBps * rtc::dchecked_cast<int>(num_channels);
-    } else if (max_playback_rate <= 16000) {
-      return kOpusBitrateWbBps * rtc::dchecked_cast<int>(num_channels);
-    } else {
-      return kOpusBitrateFbBps * rtc::dchecked_cast<int>(num_channels);
-    }
-  }();
-  RTC_DCHECK_GE(bitrate, AudioEncoderOpusConfig::kMinBitrateBps);
-  RTC_DCHECK_LE(bitrate, AudioEncoderOpusConfig::kMaxBitrateBps);
-  return bitrate;
-}
-
-// Get the maxaveragebitrate parameter in string-form, so we can properly figure
-// out how invalid it is and accurately log invalid values.
-int CalculateBitrate(int max_playback_rate_hz,
-                     size_t num_channels,
-                     rtc::Optional<std::string> bitrate_param) {
-  const int default_bitrate =
-      CalculateDefaultBitrate(max_playback_rate_hz, num_channels);
-
-  if (bitrate_param) {
-    const auto bitrate = rtc::StringToNumber<int>(*bitrate_param);
-    if (bitrate) {
-      const int chosen_bitrate =
-          std::max(AudioEncoderOpusConfig::kMinBitrateBps,
-                   std::min(*bitrate, AudioEncoderOpusConfig::kMaxBitrateBps));
-      if (bitrate != chosen_bitrate) {
-        LOG(LS_WARNING) << "Invalid maxaveragebitrate " << *bitrate
-                        << " clamped to " << chosen_bitrate;
-      }
-      return chosen_bitrate;
-    }
-    LOG(LS_WARNING) << "Invalid maxaveragebitrate \"" << *bitrate_param
-                    << "\" replaced by default bitrate " << default_bitrate;
-  }
-
-  return default_bitrate;
-}
-
-int GetChannelCount(const SdpAudioFormat& format) {
-  const auto param = GetFormatParameter(format, "stereo");
-  if (param == "1") {
-    return 2;
-  } else {
-    return 1;
-  }
-}
-
-int GetMaxPlaybackRate(const SdpAudioFormat& format) {
-  const auto param = GetFormatParameter<int>(format, "maxplaybackrate");
-  if (param && *param >= 8000) {
-    return std::min(*param, kDefaultMaxPlaybackRate);
-  }
-  return kDefaultMaxPlaybackRate;
-}
-
-int GetFrameSizeMs(const SdpAudioFormat& format) {
-  const auto ptime = GetFormatParameter<int>(format, "ptime");
-  if (ptime) {
-    // Pick the next highest supported frame length from
-    // kOpusSupportedFrameLengths.
-    for (const int supported_frame_length : kOpusSupportedFrameLengths) {
-      if (supported_frame_length >= *ptime) {
-        return supported_frame_length;
-      }
-    }
-    // If none was found, return the largest supported frame length.
-    return *(std::end(kOpusSupportedFrameLengths) - 1);
-  }
-
-  return AudioEncoderOpusConfig::kDefaultFrameSizeMs;
-}
-
-void FindSupportedFrameLengths(int min_frame_length_ms,
-                               int max_frame_length_ms,
-                               std::vector<int>* out) {
-  out->clear();
-  std::copy_if(std::begin(kANASupportedFrameLengths),
-               std::end(kANASupportedFrameLengths), std::back_inserter(*out),
-               [&](int frame_length_ms) {
-                 return frame_length_ms >= min_frame_length_ms &&
-                        frame_length_ms <= max_frame_length_ms;
-               });
-  RTC_DCHECK(std::is_sorted(out->begin(), out->end()));
-}
-
-int GetBitrateBps(const AudioEncoderOpusConfig& config) {
-  RTC_DCHECK(config.IsOk());
-  return *config.bitrate_bps;
-}
-
-}  // namespace
-
-void AudioEncoderOpus::AppendSupportedEncoders(
-    std::vector<AudioCodecSpec>* specs) {
-  const SdpAudioFormat fmt = {
-      "opus", 48000, 2, {{"minptime", "10"}, {"useinbandfec", "1"}}};
-  const AudioCodecInfo info = QueryAudioEncoder(*SdpToConfig(fmt));
-  specs->push_back({fmt, info});
-}
-
-AudioCodecInfo AudioEncoderOpus::QueryAudioEncoder(
-    const AudioEncoderOpusConfig& config) {
-  RTC_DCHECK(config.IsOk());
-  AudioCodecInfo info(48000, config.num_channels, *config.bitrate_bps,
-                      AudioEncoderOpusConfig::kMinBitrateBps,
-                      AudioEncoderOpusConfig::kMaxBitrateBps);
-  info.allow_comfort_noise = false;
-  info.supports_network_adaption = true;
-  return info;
-}
-
-std::unique_ptr<AudioEncoder> AudioEncoderOpus::MakeAudioEncoder(
-    const AudioEncoderOpusConfig& config,
-    int payload_type) {
-  RTC_DCHECK(config.IsOk());
-  return rtc::MakeUnique<AudioEncoderOpus>(config, payload_type);
-}
-
-rtc::Optional<AudioCodecInfo> AudioEncoderOpus::QueryAudioEncoder(
-    const SdpAudioFormat& format) {
-  if (STR_CASE_CMP(format.name.c_str(), GetPayloadName()) == 0 &&
-      format.clockrate_hz == 48000 && format.num_channels == 2) {
-    const size_t num_channels = GetChannelCount(format);
-    const int bitrate =
-        CalculateBitrate(GetMaxPlaybackRate(format), num_channels,
-                         GetFormatParameter(format, "maxaveragebitrate"));
-    AudioCodecInfo info(48000, num_channels, bitrate,
-                        AudioEncoderOpusConfig::kMinBitrateBps,
-                        AudioEncoderOpusConfig::kMaxBitrateBps);
-    info.allow_comfort_noise = false;
-    info.supports_network_adaption = true;
-
-    return rtc::Optional<AudioCodecInfo>(info);
-  }
-  return rtc::Optional<AudioCodecInfo>();
-}
-
-AudioEncoderOpusConfig AudioEncoderOpus::CreateConfig(
-    int payload_type,
-    const SdpAudioFormat& format) {
-  auto opt_config = SdpToConfig(format);
-  RTC_CHECK(opt_config);
-  opt_config->payload_type = payload_type;
-  return *opt_config;
-}
-
-AudioEncoderOpusConfig AudioEncoderOpus::CreateConfig(
-    const CodecInst& codec_inst) {
-  AudioEncoderOpusConfig config;
-  config.frame_size_ms = rtc::CheckedDivExact(codec_inst.pacsize, 48);
-  config.num_channels = codec_inst.channels;
-  config.bitrate_bps = rtc::Optional<int>(codec_inst.rate);
-  config.application = config.num_channels == 1
-                           ? AudioEncoderOpusConfig::ApplicationMode::kVoip
-                           : AudioEncoderOpusConfig::ApplicationMode::kAudio;
-  config.supported_frame_lengths_ms.push_back(config.frame_size_ms);
-  return config;
-}
-
-rtc::Optional<AudioEncoderOpusConfig> AudioEncoderOpus::SdpToConfig(
-    const SdpAudioFormat& format) {
-  if (STR_CASE_CMP(format.name.c_str(), "opus") != 0 ||
-      format.clockrate_hz != 48000 || format.num_channels != 2) {
-    return rtc::Optional<AudioEncoderOpusConfig>();
-  }
-
-  AudioEncoderOpusConfig config;
-  config.num_channels = GetChannelCount(format);
-  config.frame_size_ms = GetFrameSizeMs(format);
-  config.max_playback_rate_hz = GetMaxPlaybackRate(format);
-  config.fec_enabled = (GetFormatParameter(format, "useinbandfec") == "1");
-  config.dtx_enabled = (GetFormatParameter(format, "usedtx") == "1");
-  config.cbr_enabled = (GetFormatParameter(format, "cbr") == "1");
-  config.bitrate_bps = rtc::Optional<int>(
-      CalculateBitrate(config.max_playback_rate_hz, config.num_channels,
-                       GetFormatParameter(format, "maxaveragebitrate")));
-  config.application = config.num_channels == 1
-                           ? AudioEncoderOpusConfig::ApplicationMode::kVoip
-                           : AudioEncoderOpusConfig::ApplicationMode::kAudio;
-
-  constexpr int kMinANAFrameLength = kANASupportedFrameLengths[0];
-  constexpr int kMaxANAFrameLength =
-      kANASupportedFrameLengths[arraysize(kANASupportedFrameLengths) - 1];
-
-  // For now, minptime and maxptime are only used with ANA. If ptime is outside
-  // of this range, it will get adjusted once ANA takes hold. Ideally, we'd know
-  // if ANA was to be used when setting up the config, and adjust accordingly.
-  const int min_frame_length_ms =
-      GetFormatParameter<int>(format, "minptime").value_or(kMinANAFrameLength);
-  const int max_frame_length_ms =
-      GetFormatParameter<int>(format, "maxptime").value_or(kMaxANAFrameLength);
-
-  FindSupportedFrameLengths(min_frame_length_ms, max_frame_length_ms,
-                            &config.supported_frame_lengths_ms);
-  RTC_DCHECK(config.IsOk());
-  return rtc::Optional<AudioEncoderOpusConfig>(config);
-}
-
-rtc::Optional<int> AudioEncoderOpus::GetNewComplexity(
-    const AudioEncoderOpusConfig& config) {
-  RTC_DCHECK(config.IsOk());
-  const int bitrate_bps = GetBitrateBps(config);
-  if (bitrate_bps >= config.complexity_threshold_bps -
-                         config.complexity_threshold_window_bps &&
-      bitrate_bps <= config.complexity_threshold_bps +
-                         config.complexity_threshold_window_bps) {
-    // Within the hysteresis window; make no change.
-    return rtc::Optional<int>();
-  } else {
-    return rtc::Optional<int>(bitrate_bps <= config.complexity_threshold_bps
-                                  ? config.low_rate_complexity
-                                  : config.complexity);
-  }
-}
-
-class AudioEncoderOpus::PacketLossFractionSmoother {
- public:
-  explicit PacketLossFractionSmoother()
-      : last_sample_time_ms_(rtc::TimeMillis()),
-        smoother_(kAlphaForPacketLossFractionSmoother) {}
-
-  // Gets the smoothed packet loss fraction.
-  float GetAverage() const {
-    float value = smoother_.filtered();
-    return (value == rtc::ExpFilter::kValueUndefined) ? 0.0f : value;
-  }
-
-  // Add new observation to the packet loss fraction smoother.
-  void AddSample(float packet_loss_fraction) {
-    int64_t now_ms = rtc::TimeMillis();
-    smoother_.Apply(static_cast<float>(now_ms - last_sample_time_ms_),
-                    packet_loss_fraction);
-    last_sample_time_ms_ = now_ms;
-  }
-
- private:
-  int64_t last_sample_time_ms_;
-
-  // An exponential filter is used to smooth the packet loss fraction.
-  rtc::ExpFilter smoother_;
-};
-
-AudioEncoderOpus::AudioEncoderOpus(const AudioEncoderOpusConfig& config)
-    : AudioEncoderOpus(config, config.payload_type) {}
-
-AudioEncoderOpus::AudioEncoderOpus(const AudioEncoderOpusConfig& config,
-                                   int payload_type)
-    : AudioEncoderOpus(
-          config,
-          payload_type,
-          [this](const ProtoString& config_string, RtcEventLog* event_log) {
-            return DefaultAudioNetworkAdaptorCreator(config_string, event_log);
-          },
-          // We choose 5sec as initial time constant due to empirical data.
-          rtc::MakeUnique<SmoothingFilterImpl>(5000)) {}
-
-AudioEncoderOpus::AudioEncoderOpus(
-    const AudioEncoderOpusConfig& config,
-    int payload_type,
-    const AudioNetworkAdaptorCreator& audio_network_adaptor_creator,
-    std::unique_ptr<SmoothingFilter> bitrate_smoother)
-    : payload_type_(payload_type),
-      send_side_bwe_with_overhead_(
-          webrtc::field_trial::IsEnabled("WebRTC-SendSideBwe-WithOverhead")),
-      packet_loss_rate_(0.0),
-      inst_(nullptr),
-      packet_loss_fraction_smoother_(new PacketLossFractionSmoother()),
-      audio_network_adaptor_creator_(audio_network_adaptor_creator),
-      bitrate_smoother_(std::move(bitrate_smoother)) {
-  RTC_DCHECK(0 <= payload_type && payload_type <= 127);
-
-  // Sanity check of the redundant payload type field that we want to get rid
-  // of. See https://bugs.chromium.org/p/webrtc/issues/detail?id=7847
-  RTC_CHECK(config.payload_type == -1 || config.payload_type == payload_type);
-
-  RTC_CHECK(RecreateEncoderInstance(config));
-}
-
-AudioEncoderOpus::AudioEncoderOpus(const CodecInst& codec_inst)
-    : AudioEncoderOpus(CreateConfig(codec_inst), codec_inst.pltype) {}
-
-AudioEncoderOpus::AudioEncoderOpus(int payload_type,
-                                   const SdpAudioFormat& format)
-    : AudioEncoderOpus(*SdpToConfig(format), payload_type) {}
-
-AudioEncoderOpus::~AudioEncoderOpus() {
-  RTC_CHECK_EQ(0, WebRtcOpus_EncoderFree(inst_));
-}
-
-int AudioEncoderOpus::SampleRateHz() const {
-  return kSampleRateHz;
-}
-
-size_t AudioEncoderOpus::NumChannels() const {
-  return config_.num_channels;
-}
-
-size_t AudioEncoderOpus::Num10MsFramesInNextPacket() const {
-  return Num10msFramesPerPacket();
-}
-
-size_t AudioEncoderOpus::Max10MsFramesInAPacket() const {
-  return Num10msFramesPerPacket();
-}
-
-int AudioEncoderOpus::GetTargetBitrate() const {
-  return GetBitrateBps(config_);
-}
-
-void AudioEncoderOpus::Reset() {
-  RTC_CHECK(RecreateEncoderInstance(config_));
-}
-
-bool AudioEncoderOpus::SetFec(bool enable) {
-  if (enable) {
-    RTC_CHECK_EQ(0, WebRtcOpus_EnableFec(inst_));
-  } else {
-    RTC_CHECK_EQ(0, WebRtcOpus_DisableFec(inst_));
-  }
-  config_.fec_enabled = enable;
-  return true;
-}
-
-bool AudioEncoderOpus::SetDtx(bool enable) {
-  if (enable) {
-    RTC_CHECK_EQ(0, WebRtcOpus_EnableDtx(inst_));
-  } else {
-    RTC_CHECK_EQ(0, WebRtcOpus_DisableDtx(inst_));
-  }
-  config_.dtx_enabled = enable;
-  return true;
-}
-
-bool AudioEncoderOpus::GetDtx() const {
-  return config_.dtx_enabled;
-}
-
-bool AudioEncoderOpus::SetApplication(Application application) {
-  auto conf = config_;
-  switch (application) {
-    case Application::kSpeech:
-      conf.application = AudioEncoderOpusConfig::ApplicationMode::kVoip;
-      break;
-    case Application::kAudio:
-      conf.application = AudioEncoderOpusConfig::ApplicationMode::kAudio;
-      break;
-  }
-  return RecreateEncoderInstance(conf);
-}
-
-void AudioEncoderOpus::SetMaxPlaybackRate(int frequency_hz) {
-  auto conf = config_;
-  conf.max_playback_rate_hz = frequency_hz;
-  RTC_CHECK(RecreateEncoderInstance(conf));
-}
-
-bool AudioEncoderOpus::EnableAudioNetworkAdaptor(
-    const std::string& config_string,
-    RtcEventLog* event_log) {
-  audio_network_adaptor_ =
-      audio_network_adaptor_creator_(config_string, event_log);
-  return audio_network_adaptor_.get() != nullptr;
-}
-
-void AudioEncoderOpus::DisableAudioNetworkAdaptor() {
-  audio_network_adaptor_.reset(nullptr);
-}
-
-void AudioEncoderOpus::OnReceivedUplinkPacketLossFraction(
-    float uplink_packet_loss_fraction) {
-  if (!audio_network_adaptor_) {
-    packet_loss_fraction_smoother_->AddSample(uplink_packet_loss_fraction);
-    float average_fraction_loss = packet_loss_fraction_smoother_->GetAverage();
-    return SetProjectedPacketLossRate(average_fraction_loss);
-  }
-  audio_network_adaptor_->SetUplinkPacketLossFraction(
-      uplink_packet_loss_fraction);
-  ApplyAudioNetworkAdaptor();
-}
-
-void AudioEncoderOpus::OnReceivedUplinkRecoverablePacketLossFraction(
-    float uplink_recoverable_packet_loss_fraction) {
-  if (!audio_network_adaptor_)
-    return;
-  audio_network_adaptor_->SetUplinkRecoverablePacketLossFraction(
-      uplink_recoverable_packet_loss_fraction);
-  ApplyAudioNetworkAdaptor();
-}
-
-void AudioEncoderOpus::OnReceivedUplinkBandwidth(
-    int target_audio_bitrate_bps,
-    rtc::Optional<int64_t> bwe_period_ms) {
-  if (audio_network_adaptor_) {
-    audio_network_adaptor_->SetTargetAudioBitrate(target_audio_bitrate_bps);
-    // We give smoothed bitrate allocation to audio network adaptor as
-    // the uplink bandwidth.
-    // The BWE spikes should not affect the bitrate smoother more than 25%.
-    // To simplify the calculations we use a step response as input signal.
-    // The step response of an exponential filter is
-    // u(t) = 1 - e^(-t / time_constant).
-    // In order to limit the affect of a BWE spike within 25% of its value
-    // before
-    // the next BWE update, we would choose a time constant that fulfills
-    // 1 - e^(-bwe_period_ms / time_constant) < 0.25
-    // Then 4 * bwe_period_ms is a good choice.
-    if (bwe_period_ms)
-      bitrate_smoother_->SetTimeConstantMs(*bwe_period_ms * 4);
-    bitrate_smoother_->AddSample(target_audio_bitrate_bps);
-
-    ApplyAudioNetworkAdaptor();
-  } else if (send_side_bwe_with_overhead_) {
-    if (!overhead_bytes_per_packet_) {
-      LOG(LS_INFO)
-          << "AudioEncoderOpus: Overhead unknown, target audio bitrate "
-          << target_audio_bitrate_bps << " bps is ignored.";
-      return;
-    }
-    const int overhead_bps = static_cast<int>(
-        *overhead_bytes_per_packet_ * 8 * 100 / Num10MsFramesInNextPacket());
-    SetTargetBitrate(
-        std::min(AudioEncoderOpusConfig::kMaxBitrateBps,
-                 std::max(AudioEncoderOpusConfig::kMinBitrateBps,
-                          target_audio_bitrate_bps - overhead_bps)));
-  } else {
-    SetTargetBitrate(target_audio_bitrate_bps);
-  }
-}
-
-void AudioEncoderOpus::OnReceivedRtt(int rtt_ms) {
-  if (!audio_network_adaptor_)
-    return;
-  audio_network_adaptor_->SetRtt(rtt_ms);
-  ApplyAudioNetworkAdaptor();
-}
-
-void AudioEncoderOpus::OnReceivedOverhead(size_t overhead_bytes_per_packet) {
-  if (audio_network_adaptor_) {
-    audio_network_adaptor_->SetOverhead(overhead_bytes_per_packet);
-    ApplyAudioNetworkAdaptor();
-  } else {
-    overhead_bytes_per_packet_ =
-        rtc::Optional<size_t>(overhead_bytes_per_packet);
-  }
-}
-
-void AudioEncoderOpus::SetReceiverFrameLengthRange(int min_frame_length_ms,
-                                                   int max_frame_length_ms) {
-  // Ensure that |SetReceiverFrameLengthRange| is called before
-  // |EnableAudioNetworkAdaptor|, otherwise we need to recreate
-  // |audio_network_adaptor_|, which is not a needed use case.
-  RTC_DCHECK(!audio_network_adaptor_);
-  FindSupportedFrameLengths(min_frame_length_ms, max_frame_length_ms,
-                            &config_.supported_frame_lengths_ms);
-}
-
-AudioEncoder::EncodedInfo AudioEncoderOpus::EncodeImpl(
-    uint32_t rtp_timestamp,
-    rtc::ArrayView<const int16_t> audio,
-    rtc::Buffer* encoded) {
-  MaybeUpdateUplinkBandwidth();
-
-  if (input_buffer_.empty())
-    first_timestamp_in_buffer_ = rtp_timestamp;
-
-  input_buffer_.insert(input_buffer_.end(), audio.cbegin(), audio.cend());
-  if (input_buffer_.size() <
-      (Num10msFramesPerPacket() * SamplesPer10msFrame())) {
-    return EncodedInfo();
-  }
-  RTC_CHECK_EQ(input_buffer_.size(),
-               Num10msFramesPerPacket() * SamplesPer10msFrame());
-
-  const size_t max_encoded_bytes = SufficientOutputBufferSize();
-  EncodedInfo info;
-  info.encoded_bytes =
-      encoded->AppendData(
-          max_encoded_bytes, [&] (rtc::ArrayView<uint8_t> encoded) {
-            int status = WebRtcOpus_Encode(
-                inst_, &input_buffer_[0],
-                rtc::CheckedDivExact(input_buffer_.size(),
-                                     config_.num_channels),
-                rtc::saturated_cast<int16_t>(max_encoded_bytes),
-                encoded.data());
-
-            RTC_CHECK_GE(status, 0);  // Fails only if fed invalid data.
-
-            return static_cast<size_t>(status);
-          });
-  input_buffer_.clear();
-
-  // Will use new packet size for next encoding.
-  config_.frame_size_ms = next_frame_length_ms_;
-
-  info.encoded_timestamp = first_timestamp_in_buffer_;
-  info.payload_type = payload_type_;
-  info.send_even_if_empty = true;  // Allows Opus to send empty packets.
-  info.speech = (info.encoded_bytes > 0);
-  info.encoder_type = CodecType::kOpus;
-  return info;
-}
-
-size_t AudioEncoderOpus::Num10msFramesPerPacket() const {
-  return static_cast<size_t>(rtc::CheckedDivExact(config_.frame_size_ms, 10));
-}
-
-size_t AudioEncoderOpus::SamplesPer10msFrame() const {
-  return rtc::CheckedDivExact(kSampleRateHz, 100) * config_.num_channels;
-}
-
-size_t AudioEncoderOpus::SufficientOutputBufferSize() const {
-  // Calculate the number of bytes we expect the encoder to produce,
-  // then multiply by two to give a wide margin for error.
-  const size_t bytes_per_millisecond =
-      static_cast<size_t>(GetBitrateBps(config_) / (1000 * 8) + 1);
-  const size_t approx_encoded_bytes =
-      Num10msFramesPerPacket() * 10 * bytes_per_millisecond;
-  return 2 * approx_encoded_bytes;
-}
-
-// If the given config is OK, recreate the Opus encoder instance with those
-// settings, save the config, and return true. Otherwise, do nothing and return
-// false.
-bool AudioEncoderOpus::RecreateEncoderInstance(
-    const AudioEncoderOpusConfig& config) {
-  if (!config.IsOk())
-    return false;
-  config_ = config;
-  if (inst_)
-    RTC_CHECK_EQ(0, WebRtcOpus_EncoderFree(inst_));
-  input_buffer_.clear();
-  input_buffer_.reserve(Num10msFramesPerPacket() * SamplesPer10msFrame());
-  RTC_CHECK_EQ(0, WebRtcOpus_EncoderCreate(
-                      &inst_, config.num_channels,
-                      config.application ==
-                              AudioEncoderOpusConfig::ApplicationMode::kVoip
-                          ? 0
-                          : 1));
-  RTC_CHECK_EQ(0, WebRtcOpus_SetBitRate(inst_, GetBitrateBps(config)));
-  if (config.fec_enabled) {
-    RTC_CHECK_EQ(0, WebRtcOpus_EnableFec(inst_));
-  } else {
-    RTC_CHECK_EQ(0, WebRtcOpus_DisableFec(inst_));
-  }
-  RTC_CHECK_EQ(
-      0, WebRtcOpus_SetMaxPlaybackRate(inst_, config.max_playback_rate_hz));
-  // Use the default complexity if the start bitrate is within the hysteresis
-  // window.
-  complexity_ = GetNewComplexity(config).value_or(config.complexity);
-  RTC_CHECK_EQ(0, WebRtcOpus_SetComplexity(inst_, complexity_));
-  if (config.dtx_enabled) {
-    RTC_CHECK_EQ(0, WebRtcOpus_EnableDtx(inst_));
-  } else {
-    RTC_CHECK_EQ(0, WebRtcOpus_DisableDtx(inst_));
-  }
-  RTC_CHECK_EQ(0,
-               WebRtcOpus_SetPacketLossRate(
-                   inst_, static_cast<int32_t>(packet_loss_rate_ * 100 + .5)));
-  if (config.cbr_enabled) {
-    RTC_CHECK_EQ(0, WebRtcOpus_EnableCbr(inst_));
-  } else {
-    RTC_CHECK_EQ(0, WebRtcOpus_DisableCbr(inst_));
-  }
-  num_channels_to_encode_ = NumChannels();
-  next_frame_length_ms_ = config_.frame_size_ms;
-  return true;
-}
-
-void AudioEncoderOpus::SetFrameLength(int frame_length_ms) {
-  next_frame_length_ms_ = frame_length_ms;
-}
-
-void AudioEncoderOpus::SetNumChannelsToEncode(size_t num_channels_to_encode) {
-  RTC_DCHECK_GT(num_channels_to_encode, 0);
-  RTC_DCHECK_LE(num_channels_to_encode, config_.num_channels);
-
-  if (num_channels_to_encode_ == num_channels_to_encode)
-    return;
-
-  RTC_CHECK_EQ(0, WebRtcOpus_SetForceChannels(inst_, num_channels_to_encode));
-  num_channels_to_encode_ = num_channels_to_encode;
-}
-
-void AudioEncoderOpus::SetProjectedPacketLossRate(float fraction) {
-  float opt_loss_rate = OptimizePacketLossRate(fraction, packet_loss_rate_);
-  if (packet_loss_rate_ != opt_loss_rate) {
-    packet_loss_rate_ = opt_loss_rate;
-    RTC_CHECK_EQ(
-        0, WebRtcOpus_SetPacketLossRate(
-               inst_, static_cast<int32_t>(packet_loss_rate_ * 100 + .5)));
-  }
-}
-
-void AudioEncoderOpus::SetTargetBitrate(int bits_per_second) {
-  config_.bitrate_bps = rtc::Optional<int>(rtc::SafeClamp<int>(
-      bits_per_second, AudioEncoderOpusConfig::kMinBitrateBps,
-      AudioEncoderOpusConfig::kMaxBitrateBps));
-  RTC_DCHECK(config_.IsOk());
-  RTC_CHECK_EQ(0, WebRtcOpus_SetBitRate(inst_, GetBitrateBps(config_)));
-  const auto new_complexity = GetNewComplexity(config_);
-  if (new_complexity && complexity_ != *new_complexity) {
-    complexity_ = *new_complexity;
-    RTC_CHECK_EQ(0, WebRtcOpus_SetComplexity(inst_, complexity_));
-  }
-}
-
-void AudioEncoderOpus::ApplyAudioNetworkAdaptor() {
-  auto config = audio_network_adaptor_->GetEncoderRuntimeConfig();
-
-  if (config.bitrate_bps)
-    SetTargetBitrate(*config.bitrate_bps);
-  if (config.frame_length_ms)
-    SetFrameLength(*config.frame_length_ms);
-  if (config.enable_fec)
-    SetFec(*config.enable_fec);
-  if (config.uplink_packet_loss_fraction)
-    SetProjectedPacketLossRate(*config.uplink_packet_loss_fraction);
-  if (config.enable_dtx)
-    SetDtx(*config.enable_dtx);
-  if (config.num_channels)
-    SetNumChannelsToEncode(*config.num_channels);
-}
-
-std::unique_ptr<AudioNetworkAdaptor>
-AudioEncoderOpus::DefaultAudioNetworkAdaptorCreator(
-    const ProtoString& config_string,
-    RtcEventLog* event_log) const {
-  AudioNetworkAdaptorImpl::Config config;
-  config.event_log = event_log;
-  return std::unique_ptr<AudioNetworkAdaptor>(new AudioNetworkAdaptorImpl(
-      config, ControllerManagerImpl::Create(
-                  config_string, NumChannels(), supported_frame_lengths_ms(),
-                  AudioEncoderOpusConfig::kMinBitrateBps,
-                  num_channels_to_encode_, next_frame_length_ms_,
-                  GetTargetBitrate(), config_.fec_enabled, GetDtx())));
-}
-
-void AudioEncoderOpus::MaybeUpdateUplinkBandwidth() {
-  if (audio_network_adaptor_) {
-    int64_t now_ms = rtc::TimeMillis();
-    if (!bitrate_smoother_last_update_time_ ||
-        now_ms - *bitrate_smoother_last_update_time_ >=
-            config_.uplink_bandwidth_update_interval_ms) {
-      rtc::Optional<float> smoothed_bitrate = bitrate_smoother_->GetAverage();
-      if (smoothed_bitrate)
-        audio_network_adaptor_->SetUplinkBandwidth(*smoothed_bitrate);
-      bitrate_smoother_last_update_time_ = rtc::Optional<int64_t>(now_ms);
-    }
-  }
-}
-
-ANAStats AudioEncoderOpus::GetANAStats() const {
-  if (audio_network_adaptor_) {
-    return audio_network_adaptor_->GetStats();
-  }
-  return ANAStats();
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/codecs/opus/audio_encoder_opus.h b/modules/audio_coding/codecs/opus/audio_encoder_opus.h
deleted file mode 100644
index f966dbe..0000000
--- a/modules/audio_coding/codecs/opus/audio_encoder_opus.h
+++ /dev/null
@@ -1,182 +0,0 @@
-/*
- *  Copyright (c) 2014 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_CODECS_OPUS_AUDIO_ENCODER_OPUS_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_OPUS_AUDIO_ENCODER_OPUS_H_
-
-#include <functional>
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "webrtc/api/audio_codecs/audio_encoder.h"
-#include "webrtc/api/audio_codecs/audio_format.h"
-#include "webrtc/api/audio_codecs/opus/audio_encoder_opus_config.h"
-#include "webrtc/api/optional.h"
-#include "webrtc/common_audio/smoothing_filter.h"
-#include "webrtc/modules/audio_coding/audio_network_adaptor/include/audio_network_adaptor.h"
-#include "webrtc/modules/audio_coding/codecs/opus/opus_interface.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/protobuf_utils.h"
-
-namespace webrtc {
-
-class RtcEventLog;
-
-struct CodecInst;
-
-class AudioEncoderOpus final : public AudioEncoder {
- public:
-  static void AppendSupportedEncoders(std::vector<AudioCodecSpec>* specs);
-  static AudioCodecInfo QueryAudioEncoder(const AudioEncoderOpusConfig& config);
-  static std::unique_ptr<AudioEncoder> MakeAudioEncoder(
-      const AudioEncoderOpusConfig&,
-      int payload_type);
-
-  // NOTE: This alias will soon go away. See
-  // https://bugs.chromium.org/p/webrtc/issues/detail?id=7847
-  using Config = AudioEncoderOpusConfig;
-
-  // NOTE: This function will soon go away. See
-  // https://bugs.chromium.org/p/webrtc/issues/detail?id=7847
-  static Config CreateConfig(int payload_type, const SdpAudioFormat& format);
-
-  static AudioEncoderOpusConfig CreateConfig(const CodecInst& codec_inst);
-  static rtc::Optional<AudioEncoderOpusConfig> SdpToConfig(
-      const SdpAudioFormat& format);
-
-  // Returns empty if the current bitrate falls within the hysteresis window,
-  // defined by complexity_threshold_bps +/- complexity_threshold_window_bps.
-  // Otherwise, returns the current complexity depending on whether the
-  // current bitrate is above or below complexity_threshold_bps.
-  static rtc::Optional<int> GetNewComplexity(
-      const AudioEncoderOpusConfig& config);
-
-  using AudioNetworkAdaptorCreator =
-      std::function<std::unique_ptr<AudioNetworkAdaptor>(const std::string&,
-                                                         RtcEventLog*)>;
-
-  // NOTE: This constructor will soon go away. See
-  // https://bugs.chromium.org/p/webrtc/issues/detail?id=7847
-  AudioEncoderOpus(const AudioEncoderOpusConfig& config);
-
-  AudioEncoderOpus(const AudioEncoderOpusConfig& config, int payload_type);
-
-  // Dependency injection for testing.
-  AudioEncoderOpus(
-      const AudioEncoderOpusConfig& config,
-      int payload_type,
-      const AudioNetworkAdaptorCreator& audio_network_adaptor_creator,
-      std::unique_ptr<SmoothingFilter> bitrate_smoother);
-
-  explicit AudioEncoderOpus(const CodecInst& codec_inst);
-  AudioEncoderOpus(int payload_type, const SdpAudioFormat& format);
-  ~AudioEncoderOpus() override;
-
-  // Static interface for use by BuiltinAudioEncoderFactory.
-  static constexpr const char* GetPayloadName() { return "opus"; }
-  static rtc::Optional<AudioCodecInfo> QueryAudioEncoder(
-      const SdpAudioFormat& format);
-
-  int SampleRateHz() const override;
-  size_t NumChannels() const override;
-  size_t Num10MsFramesInNextPacket() const override;
-  size_t Max10MsFramesInAPacket() const override;
-  int GetTargetBitrate() const override;
-
-  void Reset() override;
-  bool SetFec(bool enable) override;
-
-  // Set Opus DTX. Once enabled, Opus stops transmission, when it detects
-  // voice being inactive. During that, it still sends 2 packets (one for
-  // content, one for signaling) about every 400 ms.
-  bool SetDtx(bool enable) override;
-  bool GetDtx() const override;
-
-  bool SetApplication(Application application) override;
-  void SetMaxPlaybackRate(int frequency_hz) override;
-  bool EnableAudioNetworkAdaptor(const std::string& config_string,
-                                 RtcEventLog* event_log) override;
-  void DisableAudioNetworkAdaptor() override;
-  void OnReceivedUplinkPacketLossFraction(
-      float uplink_packet_loss_fraction) override;
-  void OnReceivedUplinkRecoverablePacketLossFraction(
-      float uplink_recoverable_packet_loss_fraction) override;
-  void OnReceivedUplinkBandwidth(
-      int target_audio_bitrate_bps,
-      rtc::Optional<int64_t> bwe_period_ms) override;
-  void OnReceivedRtt(int rtt_ms) override;
-  void OnReceivedOverhead(size_t overhead_bytes_per_packet) override;
-  void SetReceiverFrameLengthRange(int min_frame_length_ms,
-                                   int max_frame_length_ms) override;
-  ANAStats GetANAStats() const override;
-  rtc::ArrayView<const int> supported_frame_lengths_ms() const {
-    return config_.supported_frame_lengths_ms;
-  }
-
-  // Getters for testing.
-  float packet_loss_rate() const { return packet_loss_rate_; }
-  AudioEncoderOpusConfig::ApplicationMode application() const {
-    return config_.application;
-  }
-  bool fec_enabled() const { return config_.fec_enabled; }
-  size_t num_channels_to_encode() const { return num_channels_to_encode_; }
-  int next_frame_length_ms() const { return next_frame_length_ms_; }
-
- protected:
-  EncodedInfo EncodeImpl(uint32_t rtp_timestamp,
-                         rtc::ArrayView<const int16_t> audio,
-                         rtc::Buffer* encoded) override;
-
- private:
-  class PacketLossFractionSmoother;
-
-  size_t Num10msFramesPerPacket() const;
-  size_t SamplesPer10msFrame() const;
-  size_t SufficientOutputBufferSize() const;
-  bool RecreateEncoderInstance(const AudioEncoderOpusConfig& config);
-  void SetFrameLength(int frame_length_ms);
-  void SetNumChannelsToEncode(size_t num_channels_to_encode);
-  void SetProjectedPacketLossRate(float fraction);
-
-  // TODO(minyue): remove "override" when we can deprecate
-  // |AudioEncoder::SetTargetBitrate|.
-  void SetTargetBitrate(int target_bps) override;
-
-  void ApplyAudioNetworkAdaptor();
-  std::unique_ptr<AudioNetworkAdaptor> DefaultAudioNetworkAdaptorCreator(
-      const ProtoString& config_string,
-      RtcEventLog* event_log) const;
-
-  void MaybeUpdateUplinkBandwidth();
-
-  AudioEncoderOpusConfig config_;
-  const int payload_type_;
-  const bool send_side_bwe_with_overhead_;
-  float packet_loss_rate_;
-  std::vector<int16_t> input_buffer_;
-  OpusEncInst* inst_;
-  uint32_t first_timestamp_in_buffer_;
-  size_t num_channels_to_encode_;
-  int next_frame_length_ms_;
-  int complexity_;
-  std::unique_ptr<PacketLossFractionSmoother> packet_loss_fraction_smoother_;
-  const AudioNetworkAdaptorCreator audio_network_adaptor_creator_;
-  std::unique_ptr<AudioNetworkAdaptor> audio_network_adaptor_;
-  rtc::Optional<size_t> overhead_bytes_per_packet_;
-  const std::unique_ptr<SmoothingFilter> bitrate_smoother_;
-  rtc::Optional<int64_t> bitrate_smoother_last_update_time_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(AudioEncoderOpus);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_CODING_CODECS_OPUS_AUDIO_ENCODER_OPUS_H_
diff --git a/modules/audio_coding/codecs/opus/audio_encoder_opus_unittest.cc b/modules/audio_coding/codecs/opus/audio_encoder_opus_unittest.cc
deleted file mode 100644
index 08e168b..0000000
--- a/modules/audio_coding/codecs/opus/audio_encoder_opus_unittest.cc
+++ /dev/null
@@ -1,763 +0,0 @@
-/*
- *  Copyright (c) 2015 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 <array>
-#include <memory>
-#include <utility>
-
-#include "webrtc/common_audio/mocks/mock_smoothing_filter.h"
-#include "webrtc/common_types.h"
-#include "webrtc/modules/audio_coding/audio_network_adaptor/mock/mock_audio_network_adaptor.h"
-#include "webrtc/modules/audio_coding/codecs/opus/audio_encoder_opus.h"
-#include "webrtc/modules/audio_coding/neteq/tools/audio_loop.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/fakeclock.h"
-#include "webrtc/test/field_trial.h"
-#include "webrtc/test/gmock.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/testsupport/fileutils.h"
-
-namespace webrtc {
-using ::testing::NiceMock;
-using ::testing::Return;
-
-namespace {
-
-const CodecInst kDefaultOpusSettings = {105, "opus", 48000, 960, 1, 32000};
-constexpr int64_t kInitialTimeUs = 12345678;
-
-AudioEncoderOpusConfig CreateConfig(const CodecInst& codec_inst) {
-  AudioEncoderOpusConfig config;
-  config.frame_size_ms = rtc::CheckedDivExact(codec_inst.pacsize, 48);
-  config.num_channels = codec_inst.channels;
-  config.bitrate_bps = rtc::Optional<int>(codec_inst.rate);
-  config.application = config.num_channels == 1
-                           ? AudioEncoderOpusConfig::ApplicationMode::kVoip
-                           : AudioEncoderOpusConfig::ApplicationMode::kAudio;
-  config.supported_frame_lengths_ms.push_back(config.frame_size_ms);
-  return config;
-}
-
-AudioEncoderOpusConfig CreateConfigWithParameters(
-    const SdpAudioFormat::Parameters& params) {
-  const SdpAudioFormat format("opus", 48000, 2, params);
-  return *AudioEncoderOpus::SdpToConfig(format);
-}
-
-struct AudioEncoderOpusStates {
-  std::shared_ptr<MockAudioNetworkAdaptor*> mock_audio_network_adaptor;
-  MockSmoothingFilter* mock_bitrate_smoother;
-  std::unique_ptr<AudioEncoderOpus> encoder;
-  std::unique_ptr<rtc::ScopedFakeClock> fake_clock;
-  AudioEncoderOpusConfig config;
-};
-
-AudioEncoderOpusStates CreateCodec(size_t num_channels) {
-  AudioEncoderOpusStates states;
-  states.mock_audio_network_adaptor =
-      std::make_shared<MockAudioNetworkAdaptor*>(nullptr);
-  states.fake_clock.reset(new rtc::ScopedFakeClock());
-  states.fake_clock->SetTimeMicros(kInitialTimeUs);
-  std::weak_ptr<MockAudioNetworkAdaptor*> mock_ptr(
-      states.mock_audio_network_adaptor);
-  AudioEncoderOpus::AudioNetworkAdaptorCreator creator =
-      [mock_ptr](const std::string&, RtcEventLog* event_log) {
-        std::unique_ptr<MockAudioNetworkAdaptor> adaptor(
-            new NiceMock<MockAudioNetworkAdaptor>());
-        EXPECT_CALL(*adaptor, Die());
-        if (auto sp = mock_ptr.lock()) {
-          *sp = adaptor.get();
-        } else {
-          RTC_NOTREACHED();
-        }
-        return adaptor;
-      };
-
-  CodecInst codec_inst = kDefaultOpusSettings;
-  codec_inst.channels = num_channels;
-  states.config = CreateConfig(codec_inst);
-  std::unique_ptr<MockSmoothingFilter> bitrate_smoother(
-      new MockSmoothingFilter());
-  states.mock_bitrate_smoother = bitrate_smoother.get();
-
-  states.encoder.reset(new AudioEncoderOpus(states.config, codec_inst.pltype,
-                                            std::move(creator),
-                                            std::move(bitrate_smoother)));
-  return states;
-}
-
-AudioEncoderRuntimeConfig CreateEncoderRuntimeConfig() {
-  constexpr int kBitrate = 40000;
-  constexpr int kFrameLength = 60;
-  constexpr bool kEnableFec = true;
-  constexpr bool kEnableDtx = false;
-  constexpr size_t kNumChannels = 1;
-  constexpr float kPacketLossFraction = 0.1f;
-  AudioEncoderRuntimeConfig config;
-  config.bitrate_bps = rtc::Optional<int>(kBitrate);
-  config.frame_length_ms = rtc::Optional<int>(kFrameLength);
-  config.enable_fec = rtc::Optional<bool>(kEnableFec);
-  config.enable_dtx = rtc::Optional<bool>(kEnableDtx);
-  config.num_channels = rtc::Optional<size_t>(kNumChannels);
-  config.uplink_packet_loss_fraction =
-      rtc::Optional<float>(kPacketLossFraction);
-  return config;
-}
-
-void CheckEncoderRuntimeConfig(const AudioEncoderOpus* encoder,
-                               const AudioEncoderRuntimeConfig& config) {
-  EXPECT_EQ(*config.bitrate_bps, encoder->GetTargetBitrate());
-  EXPECT_EQ(*config.frame_length_ms, encoder->next_frame_length_ms());
-  EXPECT_EQ(*config.enable_fec, encoder->fec_enabled());
-  EXPECT_EQ(*config.enable_dtx, encoder->GetDtx());
-  EXPECT_EQ(*config.num_channels, encoder->num_channels_to_encode());
-}
-
-// Create 10ms audio data blocks for a total packet size of "packet_size_ms".
-std::unique_ptr<test::AudioLoop> Create10msAudioBlocks(
-    const std::unique_ptr<AudioEncoderOpus>& encoder,
-    int packet_size_ms) {
-  const std::string file_name =
-      test::ResourcePath("audio_coding/testfile32kHz", "pcm");
-
-  std::unique_ptr<test::AudioLoop> speech_data(new test::AudioLoop());
-  int audio_samples_per_ms =
-      rtc::CheckedDivExact(encoder->SampleRateHz(), 1000);
-  if (!speech_data->Init(
-          file_name,
-          packet_size_ms * audio_samples_per_ms *
-              encoder->num_channels_to_encode(),
-          10 * audio_samples_per_ms * encoder->num_channels_to_encode()))
-    return nullptr;
-  return speech_data;
-}
-
-}  // namespace
-
-TEST(AudioEncoderOpusTest, DefaultApplicationModeMono) {
-  auto states = CreateCodec(1);
-  EXPECT_EQ(AudioEncoderOpusConfig::ApplicationMode::kVoip,
-            states.encoder->application());
-}
-
-TEST(AudioEncoderOpusTest, DefaultApplicationModeStereo) {
-  auto states = CreateCodec(2);
-  EXPECT_EQ(AudioEncoderOpusConfig::ApplicationMode::kAudio,
-            states.encoder->application());
-}
-
-TEST(AudioEncoderOpusTest, ChangeApplicationMode) {
-  auto states = CreateCodec(2);
-  EXPECT_TRUE(
-      states.encoder->SetApplication(AudioEncoder::Application::kSpeech));
-  EXPECT_EQ(AudioEncoderOpusConfig::ApplicationMode::kVoip,
-            states.encoder->application());
-}
-
-TEST(AudioEncoderOpusTest, ResetWontChangeApplicationMode) {
-  auto states = CreateCodec(2);
-
-  // Trigger a reset.
-  states.encoder->Reset();
-  // Verify that the mode is still kAudio.
-  EXPECT_EQ(AudioEncoderOpusConfig::ApplicationMode::kAudio,
-            states.encoder->application());
-
-  // Now change to kVoip.
-  EXPECT_TRUE(
-      states.encoder->SetApplication(AudioEncoder::Application::kSpeech));
-  EXPECT_EQ(AudioEncoderOpusConfig::ApplicationMode::kVoip,
-            states.encoder->application());
-
-  // Trigger a reset again.
-  states.encoder->Reset();
-  // Verify that the mode is still kVoip.
-  EXPECT_EQ(AudioEncoderOpusConfig::ApplicationMode::kVoip,
-            states.encoder->application());
-}
-
-TEST(AudioEncoderOpusTest, ToggleDtx) {
-  auto states = CreateCodec(2);
-  // Enable DTX
-  EXPECT_TRUE(states.encoder->SetDtx(true));
-  EXPECT_TRUE(states.encoder->GetDtx());
-  // Turn off DTX.
-  EXPECT_TRUE(states.encoder->SetDtx(false));
-  EXPECT_FALSE(states.encoder->GetDtx());
-}
-
-TEST(AudioEncoderOpusTest,
-     OnReceivedUplinkBandwidthWithoutAudioNetworkAdaptor) {
-  auto states = CreateCodec(1);
-  // Constants are replicated from audio_states.encoderopus.cc.
-  const int kMinBitrateBps = 6000;
-  const int kMaxBitrateBps = 510000;
-  // Set a too low bitrate.
-  states.encoder->OnReceivedUplinkBandwidth(kMinBitrateBps - 1,
-                                            rtc::Optional<int64_t>());
-  EXPECT_EQ(kMinBitrateBps, states.encoder->GetTargetBitrate());
-  // Set a too high bitrate.
-  states.encoder->OnReceivedUplinkBandwidth(kMaxBitrateBps + 1,
-                                            rtc::Optional<int64_t>());
-  EXPECT_EQ(kMaxBitrateBps, states.encoder->GetTargetBitrate());
-  // Set the minimum rate.
-  states.encoder->OnReceivedUplinkBandwidth(kMinBitrateBps,
-                                            rtc::Optional<int64_t>());
-  EXPECT_EQ(kMinBitrateBps, states.encoder->GetTargetBitrate());
-  // Set the maximum rate.
-  states.encoder->OnReceivedUplinkBandwidth(kMaxBitrateBps,
-                                            rtc::Optional<int64_t>());
-  EXPECT_EQ(kMaxBitrateBps, states.encoder->GetTargetBitrate());
-  // Set rates from kMaxBitrateBps up to 32000 bps.
-  for (int rate = kMinBitrateBps; rate <= 32000; rate += 1000) {
-    states.encoder->OnReceivedUplinkBandwidth(rate, rtc::Optional<int64_t>());
-    EXPECT_EQ(rate, states.encoder->GetTargetBitrate());
-  }
-}
-
-namespace {
-
-// Returns a vector with the n evenly-spaced numbers a, a + (b - a)/(n - 1),
-// ..., b.
-std::vector<float> IntervalSteps(float a, float b, size_t n) {
-  RTC_DCHECK_GT(n, 1u);
-  const float step = (b - a) / (n - 1);
-  std::vector<float> points;
-  points.push_back(a);
-  for (size_t i = 1; i < n - 1; ++i)
-    points.push_back(a + i * step);
-  points.push_back(b);
-  return points;
-}
-
-// Sets the packet loss rate to each number in the vector in turn, and verifies
-// that the loss rate as reported by the encoder is |expected_return| for all
-// of them.
-void TestSetPacketLossRate(AudioEncoderOpusStates* states,
-                           const std::vector<float>& losses,
-                           float expected_return) {
-  // |kSampleIntervalMs| is chosen to ease the calculation since
-  // 0.9999 ^ 184198 = 1e-8. Which minimizes the effect of
-  // PacketLossFractionSmoother used in AudioEncoderOpus.
-  constexpr int64_t kSampleIntervalMs = 184198;
-  for (float loss : losses) {
-    states->encoder->OnReceivedUplinkPacketLossFraction(loss);
-    states->fake_clock->AdvanceTime(
-        rtc::TimeDelta::FromMilliseconds(kSampleIntervalMs));
-    EXPECT_FLOAT_EQ(expected_return, states->encoder->packet_loss_rate());
-  }
-}
-
-}  // namespace
-
-TEST(AudioEncoderOpusTest, PacketLossRateOptimized) {
-  auto states = CreateCodec(1);
-  auto I = [](float a, float b) { return IntervalSteps(a, b, 10); };
-  constexpr float eps = 1e-8f;
-
-  // Note that the order of the following calls is critical.
-
-  // clang-format off
-  TestSetPacketLossRate(&states, I(0.00f      , 0.01f - eps), 0.00f);
-  TestSetPacketLossRate(&states, I(0.01f + eps, 0.06f - eps), 0.01f);
-  TestSetPacketLossRate(&states, I(0.06f + eps, 0.11f - eps), 0.05f);
-  TestSetPacketLossRate(&states, I(0.11f + eps, 0.22f - eps), 0.10f);
-  TestSetPacketLossRate(&states, I(0.22f + eps, 1.00f      ), 0.20f);
-
-  TestSetPacketLossRate(&states, I(1.00f      , 0.18f + eps), 0.20f);
-  TestSetPacketLossRate(&states, I(0.18f - eps, 0.09f + eps), 0.10f);
-  TestSetPacketLossRate(&states, I(0.09f - eps, 0.04f + eps), 0.05f);
-  TestSetPacketLossRate(&states, I(0.04f - eps, 0.01f + eps), 0.01f);
-  TestSetPacketLossRate(&states, I(0.01f - eps, 0.00f      ), 0.00f);
-  // clang-format on
-}
-
-TEST(AudioEncoderOpusTest, SetReceiverFrameLengthRange) {
-  auto states = CreateCodec(2);
-  // Before calling to |SetReceiverFrameLengthRange|,
-  // |supported_frame_lengths_ms| should contain only the frame length being
-  // used.
-  using ::testing::ElementsAre;
-  EXPECT_THAT(states.encoder->supported_frame_lengths_ms(),
-              ElementsAre(states.encoder->next_frame_length_ms()));
-  states.encoder->SetReceiverFrameLengthRange(0, 12345);
-  states.encoder->SetReceiverFrameLengthRange(21, 60);
-  EXPECT_THAT(states.encoder->supported_frame_lengths_ms(), ElementsAre(60));
-  states.encoder->SetReceiverFrameLengthRange(20, 59);
-  EXPECT_THAT(states.encoder->supported_frame_lengths_ms(), ElementsAre(20));
-}
-
-TEST(AudioEncoderOpusTest,
-     InvokeAudioNetworkAdaptorOnReceivedUplinkPacketLossFraction) {
-  auto states = CreateCodec(2);
-  states.encoder->EnableAudioNetworkAdaptor("", nullptr);
-
-  auto config = CreateEncoderRuntimeConfig();
-  EXPECT_CALL(**states.mock_audio_network_adaptor, GetEncoderRuntimeConfig())
-      .WillOnce(Return(config));
-
-  // Since using mock audio network adaptor, any packet loss fraction is fine.
-  constexpr float kUplinkPacketLoss = 0.1f;
-  EXPECT_CALL(**states.mock_audio_network_adaptor,
-              SetUplinkPacketLossFraction(kUplinkPacketLoss));
-  states.encoder->OnReceivedUplinkPacketLossFraction(kUplinkPacketLoss);
-
-  CheckEncoderRuntimeConfig(states.encoder.get(), config);
-}
-
-TEST(AudioEncoderOpusTest, InvokeAudioNetworkAdaptorOnReceivedUplinkBandwidth) {
-  auto states = CreateCodec(2);
-  states.encoder->EnableAudioNetworkAdaptor("", nullptr);
-
-  auto config = CreateEncoderRuntimeConfig();
-  EXPECT_CALL(**states.mock_audio_network_adaptor, GetEncoderRuntimeConfig())
-      .WillOnce(Return(config));
-
-  // Since using mock audio network adaptor, any target audio bitrate is fine.
-  constexpr int kTargetAudioBitrate = 30000;
-  constexpr int64_t kProbingIntervalMs = 3000;
-  EXPECT_CALL(**states.mock_audio_network_adaptor,
-              SetTargetAudioBitrate(kTargetAudioBitrate));
-  EXPECT_CALL(*states.mock_bitrate_smoother,
-              SetTimeConstantMs(kProbingIntervalMs * 4));
-  EXPECT_CALL(*states.mock_bitrate_smoother, AddSample(kTargetAudioBitrate));
-  states.encoder->OnReceivedUplinkBandwidth(
-      kTargetAudioBitrate, rtc::Optional<int64_t>(kProbingIntervalMs));
-
-  CheckEncoderRuntimeConfig(states.encoder.get(), config);
-}
-
-TEST(AudioEncoderOpusTest, InvokeAudioNetworkAdaptorOnReceivedRtt) {
-  auto states = CreateCodec(2);
-  states.encoder->EnableAudioNetworkAdaptor("", nullptr);
-
-  auto config = CreateEncoderRuntimeConfig();
-  EXPECT_CALL(**states.mock_audio_network_adaptor, GetEncoderRuntimeConfig())
-      .WillOnce(Return(config));
-
-  // Since using mock audio network adaptor, any rtt is fine.
-  constexpr int kRtt = 30;
-  EXPECT_CALL(**states.mock_audio_network_adaptor, SetRtt(kRtt));
-  states.encoder->OnReceivedRtt(kRtt);
-
-  CheckEncoderRuntimeConfig(states.encoder.get(), config);
-}
-
-TEST(AudioEncoderOpusTest, InvokeAudioNetworkAdaptorOnReceivedOverhead) {
-  auto states = CreateCodec(2);
-  states.encoder->EnableAudioNetworkAdaptor("", nullptr);
-
-  auto config = CreateEncoderRuntimeConfig();
-  EXPECT_CALL(**states.mock_audio_network_adaptor, GetEncoderRuntimeConfig())
-      .WillOnce(Return(config));
-
-  // Since using mock audio network adaptor, any overhead is fine.
-  constexpr size_t kOverhead = 64;
-  EXPECT_CALL(**states.mock_audio_network_adaptor, SetOverhead(kOverhead));
-  states.encoder->OnReceivedOverhead(kOverhead);
-
-  CheckEncoderRuntimeConfig(states.encoder.get(), config);
-}
-
-TEST(AudioEncoderOpusTest,
-     PacketLossFractionSmoothedOnSetUplinkPacketLossFraction) {
-  auto states = CreateCodec(2);
-
-  // The values are carefully chosen so that if no smoothing is made, the test
-  // will fail.
-  constexpr float kPacketLossFraction_1 = 0.02f;
-  constexpr float kPacketLossFraction_2 = 0.198f;
-  // |kSecondSampleTimeMs| is chosen to ease the calculation since
-  // 0.9999 ^ 6931 = 0.5.
-  constexpr int64_t kSecondSampleTimeMs = 6931;
-
-  // First time, no filtering.
-  states.encoder->OnReceivedUplinkPacketLossFraction(kPacketLossFraction_1);
-  EXPECT_FLOAT_EQ(0.01f, states.encoder->packet_loss_rate());
-
-  states.fake_clock->AdvanceTime(
-      rtc::TimeDelta::FromMilliseconds(kSecondSampleTimeMs));
-  states.encoder->OnReceivedUplinkPacketLossFraction(kPacketLossFraction_2);
-
-  // Now the output of packet loss fraction smoother should be
-  // (0.02 + 0.198) / 2 = 0.109, which reach the threshold for the optimized
-  // packet loss rate to increase to 0.05. If no smoothing has been made, the
-  // optimized packet loss rate should have been increase to 0.1.
-  EXPECT_FLOAT_EQ(0.05f, states.encoder->packet_loss_rate());
-}
-
-TEST(AudioEncoderOpusTest, DoNotInvokeSetTargetBitrateIfOverheadUnknown) {
-  test::ScopedFieldTrials override_field_trials(
-      "WebRTC-SendSideBwe-WithOverhead/Enabled/");
-
-  auto states = CreateCodec(2);
-
-  states.encoder->OnReceivedUplinkBandwidth(kDefaultOpusSettings.rate * 2,
-                                            rtc::Optional<int64_t>());
-
-  // Since |OnReceivedOverhead| has not been called, the codec bitrate should
-  // not change.
-  EXPECT_EQ(kDefaultOpusSettings.rate, states.encoder->GetTargetBitrate());
-}
-
-TEST(AudioEncoderOpusTest, OverheadRemovedFromTargetAudioBitrate) {
-  test::ScopedFieldTrials override_field_trials(
-      "WebRTC-SendSideBwe-WithOverhead/Enabled/");
-
-  auto states = CreateCodec(2);
-
-  constexpr size_t kOverheadBytesPerPacket = 64;
-  states.encoder->OnReceivedOverhead(kOverheadBytesPerPacket);
-
-  constexpr int kTargetBitrateBps = 40000;
-  states.encoder->OnReceivedUplinkBandwidth(kTargetBitrateBps,
-                                            rtc::Optional<int64_t>());
-
-  int packet_rate = rtc::CheckedDivExact(48000, kDefaultOpusSettings.pacsize);
-  EXPECT_EQ(kTargetBitrateBps -
-                8 * static_cast<int>(kOverheadBytesPerPacket) * packet_rate,
-            states.encoder->GetTargetBitrate());
-}
-
-TEST(AudioEncoderOpusTest, BitrateBounded) {
-  test::ScopedFieldTrials override_field_trials(
-      "WebRTC-SendSideBwe-WithOverhead/Enabled/");
-
-  constexpr int kMinBitrateBps = 6000;
-  constexpr int kMaxBitrateBps = 510000;
-
-  auto states = CreateCodec(2);
-
-  constexpr size_t kOverheadBytesPerPacket = 64;
-  states.encoder->OnReceivedOverhead(kOverheadBytesPerPacket);
-
-  int packet_rate = rtc::CheckedDivExact(48000, kDefaultOpusSettings.pacsize);
-
-  // Set a target rate that is smaller than |kMinBitrateBps| when overhead is
-  // subtracted. The eventual codec rate should be bounded by |kMinBitrateBps|.
-  int target_bitrate =
-      kOverheadBytesPerPacket * 8 * packet_rate + kMinBitrateBps - 1;
-  states.encoder->OnReceivedUplinkBandwidth(target_bitrate,
-                                            rtc::Optional<int64_t>());
-  EXPECT_EQ(kMinBitrateBps, states.encoder->GetTargetBitrate());
-
-  // Set a target rate that is greater than |kMaxBitrateBps| when overhead is
-  // subtracted. The eventual codec rate should be bounded by |kMaxBitrateBps|.
-  target_bitrate =
-      kOverheadBytesPerPacket * 8 * packet_rate + kMaxBitrateBps + 1;
-  states.encoder->OnReceivedUplinkBandwidth(target_bitrate,
-                                            rtc::Optional<int64_t>());
-  EXPECT_EQ(kMaxBitrateBps, states.encoder->GetTargetBitrate());
-}
-
-// Verifies that the complexity adaptation in the config works as intended.
-TEST(AudioEncoderOpusTest, ConfigComplexityAdaptation) {
-  AudioEncoderOpusConfig config;
-  config.low_rate_complexity = 8;
-  config.complexity = 6;
-
-  // Bitrate within hysteresis window. Expect empty output.
-  config.bitrate_bps = rtc::Optional<int>(12500);
-  EXPECT_EQ(rtc::Optional<int>(), AudioEncoderOpus::GetNewComplexity(config));
-
-  // Bitrate below hysteresis window. Expect higher complexity.
-  config.bitrate_bps = rtc::Optional<int>(10999);
-  EXPECT_EQ(rtc::Optional<int>(8), AudioEncoderOpus::GetNewComplexity(config));
-
-  // Bitrate within hysteresis window. Expect empty output.
-  config.bitrate_bps = rtc::Optional<int>(12500);
-  EXPECT_EQ(rtc::Optional<int>(), AudioEncoderOpus::GetNewComplexity(config));
-
-  // Bitrate above hysteresis window. Expect lower complexity.
-  config.bitrate_bps = rtc::Optional<int>(14001);
-  EXPECT_EQ(rtc::Optional<int>(6), AudioEncoderOpus::GetNewComplexity(config));
-}
-
-TEST(AudioEncoderOpusTest, EmptyConfigDoesNotAffectEncoderSettings) {
-  auto states = CreateCodec(2);
-  states.encoder->EnableAudioNetworkAdaptor("", nullptr);
-
-  auto config = CreateEncoderRuntimeConfig();
-  AudioEncoderRuntimeConfig empty_config;
-
-  EXPECT_CALL(**states.mock_audio_network_adaptor, GetEncoderRuntimeConfig())
-      .WillOnce(Return(config))
-      .WillOnce(Return(empty_config));
-
-  constexpr size_t kOverhead = 64;
-  EXPECT_CALL(**states.mock_audio_network_adaptor, SetOverhead(kOverhead))
-      .Times(2);
-  states.encoder->OnReceivedOverhead(kOverhead);
-  states.encoder->OnReceivedOverhead(kOverhead);
-
-  CheckEncoderRuntimeConfig(states.encoder.get(), config);
-}
-
-TEST(AudioEncoderOpusTest, UpdateUplinkBandwidthInAudioNetworkAdaptor) {
-  auto states = CreateCodec(2);
-  states.encoder->EnableAudioNetworkAdaptor("", nullptr);
-  std::array<int16_t, 480 * 2> audio;
-  audio.fill(0);
-  rtc::Buffer encoded;
-  EXPECT_CALL(*states.mock_bitrate_smoother, GetAverage())
-      .WillOnce(Return(rtc::Optional<float>(50000)));
-  EXPECT_CALL(**states.mock_audio_network_adaptor, SetUplinkBandwidth(50000));
-  states.encoder->Encode(
-      0, rtc::ArrayView<const int16_t>(audio.data(), audio.size()), &encoded);
-
-  // Repeat update uplink bandwidth tests.
-  for (int i = 0; i < 5; i++) {
-    // Don't update till it is time to update again.
-    states.fake_clock->AdvanceTime(rtc::TimeDelta::FromMilliseconds(
-        states.config.uplink_bandwidth_update_interval_ms - 1));
-    states.encoder->Encode(
-        0, rtc::ArrayView<const int16_t>(audio.data(), audio.size()), &encoded);
-
-    // Update when it is time to update.
-    EXPECT_CALL(*states.mock_bitrate_smoother, GetAverage())
-        .WillOnce(Return(rtc::Optional<float>(40000)));
-    EXPECT_CALL(**states.mock_audio_network_adaptor, SetUplinkBandwidth(40000));
-    states.fake_clock->AdvanceTime(rtc::TimeDelta::FromMilliseconds(1));
-    states.encoder->Encode(
-        0, rtc::ArrayView<const int16_t>(audio.data(), audio.size()), &encoded);
-  }
-}
-
-TEST(AudioEncoderOpusTest, EncodeAtMinBitrate) {
-  auto states = CreateCodec(1);
-  constexpr int kNumPacketsToEncode = 2;
-  auto audio_frames =
-      Create10msAudioBlocks(states.encoder, kNumPacketsToEncode * 20);
-  ASSERT_TRUE(audio_frames) << "Create10msAudioBlocks failed";
-  rtc::Buffer encoded;
-  uint32_t rtp_timestamp = 12345;  // Just a number not important to this test.
-
-  states.encoder->OnReceivedUplinkBandwidth(0, rtc::Optional<int64_t>());
-  for (int packet_index = 0; packet_index < kNumPacketsToEncode;
-       packet_index++) {
-    // Make sure we are not encoding before we have enough data for
-    // a 20ms packet.
-    for (int index = 0; index < 1; index++) {
-      states.encoder->Encode(rtp_timestamp, audio_frames->GetNextBlock(),
-                             &encoded);
-      EXPECT_EQ(0u, encoded.size());
-    }
-
-    // Should encode now.
-    states.encoder->Encode(rtp_timestamp, audio_frames->GetNextBlock(),
-                           &encoded);
-    EXPECT_GT(encoded.size(), 0u);
-    encoded.Clear();
-  }
-}
-
-TEST(AudioEncoderOpusTest, TestConfigDefaults) {
-  const auto config_opt = AudioEncoderOpus::SdpToConfig({"opus", 48000, 2});
-  ASSERT_TRUE(config_opt);
-  EXPECT_EQ(48000, config_opt->max_playback_rate_hz);
-  EXPECT_EQ(1u, config_opt->num_channels);
-  EXPECT_FALSE(config_opt->fec_enabled);
-  EXPECT_FALSE(config_opt->dtx_enabled);
-  EXPECT_EQ(20, config_opt->frame_size_ms);
-}
-
-TEST(AudioEncoderOpusTest, TestConfigFromParams) {
-  const auto config1 = CreateConfigWithParameters({{"stereo", "0"}});
-  EXPECT_EQ(1U, config1.num_channels);
-
-  const auto config2 = CreateConfigWithParameters({{"stereo", "1"}});
-  EXPECT_EQ(2U, config2.num_channels);
-
-  const auto config3 = CreateConfigWithParameters({{"useinbandfec", "0"}});
-  EXPECT_FALSE(config3.fec_enabled);
-
-  const auto config4 = CreateConfigWithParameters({{"useinbandfec", "1"}});
-  EXPECT_TRUE(config4.fec_enabled);
-
-  const auto config5 = CreateConfigWithParameters({{"usedtx", "0"}});
-  EXPECT_FALSE(config5.dtx_enabled);
-
-  const auto config6 = CreateConfigWithParameters({{"usedtx", "1"}});
-  EXPECT_TRUE(config6.dtx_enabled);
-
-  const auto config7 = CreateConfigWithParameters({{"cbr", "0"}});
-  EXPECT_FALSE(config7.cbr_enabled);
-
-  const auto config8 = CreateConfigWithParameters({{"cbr", "1"}});
-  EXPECT_TRUE(config8.cbr_enabled);
-
-  const auto config9 =
-      CreateConfigWithParameters({{"maxplaybackrate", "12345"}});
-  EXPECT_EQ(12345, config9.max_playback_rate_hz);
-
-  const auto config10 =
-      CreateConfigWithParameters({{"maxaveragebitrate", "96000"}});
-  EXPECT_EQ(96000, config10.bitrate_bps);
-
-  const auto config11 = CreateConfigWithParameters({{"maxptime", "40"}});
-  for (int frame_length : config11.supported_frame_lengths_ms) {
-    EXPECT_LE(frame_length, 40);
-  }
-
-  const auto config12 = CreateConfigWithParameters({{"minptime", "40"}});
-  for (int frame_length : config12.supported_frame_lengths_ms) {
-    EXPECT_GE(frame_length, 40);
-  }
-
-  const auto config13 = CreateConfigWithParameters({{"ptime", "40"}});
-  EXPECT_EQ(40, config13.frame_size_ms);
-
-  constexpr int kMinSupportedFrameLength = 10;
-  constexpr int kMaxSupportedFrameLength =
-      WEBRTC_OPUS_SUPPORT_120MS_PTIME ? 120 : 60;
-
-  const auto config14 = CreateConfigWithParameters({{"ptime", "1"}});
-  EXPECT_EQ(kMinSupportedFrameLength, config14.frame_size_ms);
-
-  const auto config15 = CreateConfigWithParameters({{"ptime", "2000"}});
-  EXPECT_EQ(kMaxSupportedFrameLength, config15.frame_size_ms);
-}
-
-TEST(AudioEncoderOpusTest, TestConfigFromInvalidParams) {
-  const webrtc::SdpAudioFormat format("opus", 48000, 2);
-  const auto default_config = *AudioEncoderOpus::SdpToConfig(format);
-#if WEBRTC_OPUS_SUPPORT_120MS_PTIME
-  const std::vector<int> default_supported_frame_lengths_ms({20, 60, 120});
-#else
-  const std::vector<int> default_supported_frame_lengths_ms({20, 60});
-#endif
-
-  AudioEncoderOpusConfig config;
-  config = CreateConfigWithParameters({{"stereo", "invalid"}});
-  EXPECT_EQ(default_config.num_channels, config.num_channels);
-
-  config = CreateConfigWithParameters({{"useinbandfec", "invalid"}});
-  EXPECT_EQ(default_config.fec_enabled, config.fec_enabled);
-
-  config = CreateConfigWithParameters({{"usedtx", "invalid"}});
-  EXPECT_EQ(default_config.dtx_enabled, config.dtx_enabled);
-
-  config = CreateConfigWithParameters({{"cbr", "invalid"}});
-  EXPECT_EQ(default_config.dtx_enabled, config.dtx_enabled);
-
-  config = CreateConfigWithParameters({{"maxplaybackrate", "0"}});
-  EXPECT_EQ(default_config.max_playback_rate_hz, config.max_playback_rate_hz);
-
-  config = CreateConfigWithParameters({{"maxplaybackrate", "-23"}});
-  EXPECT_EQ(default_config.max_playback_rate_hz, config.max_playback_rate_hz);
-
-  config = CreateConfigWithParameters({{"maxplaybackrate", "not a number!"}});
-  EXPECT_EQ(default_config.max_playback_rate_hz, config.max_playback_rate_hz);
-
-  config = CreateConfigWithParameters({{"maxaveragebitrate", "0"}});
-  EXPECT_EQ(6000, config.bitrate_bps);
-
-  config = CreateConfigWithParameters({{"maxaveragebitrate", "-1000"}});
-  EXPECT_EQ(6000, config.bitrate_bps);
-
-  config = CreateConfigWithParameters({{"maxaveragebitrate", "1024000"}});
-  EXPECT_EQ(510000, config.bitrate_bps);
-
-  config = CreateConfigWithParameters({{"maxaveragebitrate", "not a number!"}});
-  EXPECT_EQ(default_config.bitrate_bps, config.bitrate_bps);
-
-  config = CreateConfigWithParameters({{"maxptime", "invalid"}});
-  EXPECT_EQ(default_supported_frame_lengths_ms,
-            config.supported_frame_lengths_ms);
-
-  config = CreateConfigWithParameters({{"minptime", "invalid"}});
-  EXPECT_EQ(default_supported_frame_lengths_ms,
-            config.supported_frame_lengths_ms);
-
-  config = CreateConfigWithParameters({{"ptime", "invalid"}});
-  EXPECT_EQ(default_supported_frame_lengths_ms,
-            config.supported_frame_lengths_ms);
-}
-
-// Test that bitrate will be overridden by the "maxaveragebitrate" parameter.
-// Also test that the "maxaveragebitrate" can't be set to values outside the
-// range of 6000 and 510000
-TEST(AudioEncoderOpusTest, SetSendCodecOpusMaxAverageBitrate) {
-  // Ignore if less than 6000.
-  const auto config1 = AudioEncoderOpus::SdpToConfig(
-      {"opus", 48000, 2, {{"maxaveragebitrate", "5999"}}});
-  EXPECT_EQ(6000, config1->bitrate_bps);
-
-  // Ignore if larger than 510000.
-  const auto config2 = AudioEncoderOpus::SdpToConfig(
-      {"opus", 48000, 2, {{"maxaveragebitrate", "510001"}}});
-  EXPECT_EQ(510000, config2->bitrate_bps);
-
-  const auto config3 = AudioEncoderOpus::SdpToConfig(
-      {"opus", 48000, 2, {{"maxaveragebitrate", "200000"}}});
-  EXPECT_EQ(200000, config3->bitrate_bps);
-}
-
-// Test maxplaybackrate <= 8000 triggers Opus narrow band mode.
-TEST(AudioEncoderOpusTest, SetMaxPlaybackRateNb) {
-  auto config = CreateConfigWithParameters({{"maxplaybackrate", "8000"}});
-  EXPECT_EQ(8000, config.max_playback_rate_hz);
-  EXPECT_EQ(12000, config.bitrate_bps);
-
-  config = CreateConfigWithParameters({{"maxplaybackrate", "8000"},
-                                       {"stereo", "1"}});
-  EXPECT_EQ(8000, config.max_playback_rate_hz);
-  EXPECT_EQ(24000, config.bitrate_bps);
-}
-
-// Test 8000 < maxplaybackrate <= 12000 triggers Opus medium band mode.
-TEST(AudioEncoderOpusTest, SetMaxPlaybackRateMb) {
-  auto config = CreateConfigWithParameters({{"maxplaybackrate", "8001"}});
-  EXPECT_EQ(8001, config.max_playback_rate_hz);
-  EXPECT_EQ(20000, config.bitrate_bps);
-
-  config = CreateConfigWithParameters({{"maxplaybackrate", "8001"},
-                                       {"stereo", "1"}});
-  EXPECT_EQ(8001, config.max_playback_rate_hz);
-  EXPECT_EQ(40000, config.bitrate_bps);
-}
-
-// Test 12000 < maxplaybackrate <= 16000 triggers Opus wide band mode.
-TEST(AudioEncoderOpusTest, SetMaxPlaybackRateWb) {
-  auto config = CreateConfigWithParameters({{"maxplaybackrate", "12001"}});
-  EXPECT_EQ(12001, config.max_playback_rate_hz);
-  EXPECT_EQ(20000, config.bitrate_bps);
-
-  config = CreateConfigWithParameters({{"maxplaybackrate", "12001"},
-                                       {"stereo", "1"}});
-  EXPECT_EQ(12001, config.max_playback_rate_hz);
-  EXPECT_EQ(40000, config.bitrate_bps);
-}
-
-// Test 16000 < maxplaybackrate <= 24000 triggers Opus super wide band mode.
-TEST(AudioEncoderOpusTest, SetMaxPlaybackRateSwb) {
-  auto config = CreateConfigWithParameters({{"maxplaybackrate", "16001"}});
-  EXPECT_EQ(16001, config.max_playback_rate_hz);
-  EXPECT_EQ(32000, config.bitrate_bps);
-
-  config = CreateConfigWithParameters({{"maxplaybackrate", "16001"},
-                                       {"stereo", "1"}});
-  EXPECT_EQ(16001, config.max_playback_rate_hz);
-  EXPECT_EQ(64000, config.bitrate_bps);
-}
-
-// Test 24000 < maxplaybackrate triggers Opus full band mode.
-TEST(AudioEncoderOpusTest, SetMaxPlaybackRateFb) {
-  auto config = CreateConfigWithParameters({{"maxplaybackrate", "24001"}});
-  EXPECT_EQ(24001, config.max_playback_rate_hz);
-  EXPECT_EQ(32000, config.bitrate_bps);
-
-  config = CreateConfigWithParameters({{"maxplaybackrate", "24001"},
-                                       {"stereo", "1"}});
-  EXPECT_EQ(24001, config.max_playback_rate_hz);
-  EXPECT_EQ(64000, config.bitrate_bps);
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/codecs/opus/opus_complexity_unittest.cc b/modules/audio_coding/codecs/opus/opus_complexity_unittest.cc
deleted file mode 100644
index 28d5175..0000000
--- a/modules/audio_coding/codecs/opus/opus_complexity_unittest.cc
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- *  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/codecs/opus/audio_encoder_opus.h"
-#include "webrtc/modules/audio_coding/neteq/tools/audio_loop.h"
-#include "webrtc/rtc_base/format_macros.h"
-#include "webrtc/rtc_base/timeutils.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/testsupport/fileutils.h"
-#include "webrtc/test/testsupport/perf_test.h"
-
-namespace webrtc {
-
-namespace {
-int64_t RunComplexityTest(const AudioEncoderOpusConfig& config) {
-  // Create encoder.
-  constexpr int payload_type = 17;
-  AudioEncoderOpus encoder(config, payload_type);
-  // Open speech file.
-  const std::string kInputFileName =
-      webrtc::test::ResourcePath("audio_coding/speech_mono_32_48kHz", "pcm");
-  test::AudioLoop audio_loop;
-  constexpr int kSampleRateHz = 48000;
-  EXPECT_EQ(kSampleRateHz, encoder.SampleRateHz());
-  constexpr size_t kMaxLoopLengthSamples =
-      kSampleRateHz * 10;  // 10 second loop.
-  constexpr size_t kInputBlockSizeSamples =
-      10 * kSampleRateHz / 1000;  // 60 ms.
-  EXPECT_TRUE(audio_loop.Init(kInputFileName, kMaxLoopLengthSamples,
-                              kInputBlockSizeSamples));
-  // Encode.
-  const int64_t start_time_ms = rtc::TimeMillis();
-  AudioEncoder::EncodedInfo info;
-  rtc::Buffer encoded(500);
-  uint32_t rtp_timestamp = 0u;
-  for (size_t i = 0; i < 10000; ++i) {
-    encoded.Clear();
-    info = encoder.Encode(rtp_timestamp, audio_loop.GetNextBlock(), &encoded);
-    rtp_timestamp += kInputBlockSizeSamples;
-  }
-  return rtc::TimeMillis() - start_time_ms;
-}
-}  // namespace
-
-// This test encodes an audio file using Opus twice with different bitrates
-// (~11 kbps and 15.5 kbps). The runtime for each is measured, and the ratio
-// between the two is calculated and tracked. This test explicitly sets the
-// low_rate_complexity to 9. When running on desktop platforms, this is the same
-// as the regular complexity, and the expectation is that the resulting ratio
-// should be less than 100% (since the encoder runs faster at lower bitrates,
-// given a fixed complexity setting). On the other hand, when running on
-// mobiles, the regular complexity is 5, and we expect the resulting ratio to
-// be higher, since we have explicitly asked for a higher complexity setting at
-// the lower rate.
-TEST(AudioEncoderOpusComplexityAdaptationTest, AdaptationOn) {
-  // Create config.
-  AudioEncoderOpusConfig config;
-  // The limit -- including the hysteresis window -- at which the complexity
-  // shuold be increased.
-  config.bitrate_bps = rtc::Optional<int>(11000 - 1);
-  config.low_rate_complexity = 9;
-  int64_t runtime_10999bps = RunComplexityTest(config);
-
-  config.bitrate_bps = rtc::Optional<int>(15500);
-  int64_t runtime_15500bps = RunComplexityTest(config);
-
-  test::PrintResult("opus_encoding_complexity_ratio", "", "adaptation_on",
-                    100.0 * runtime_10999bps / runtime_15500bps, "percent",
-                    true);
-}
-
-// This test is identical to the one above, but without the complexity
-// adaptation enabled (neither on desktop, nor on mobile). The expectation is
-// that the resulting ratio is less than 100% at all times.
-TEST(AudioEncoderOpusComplexityAdaptationTest, AdaptationOff) {
-  // Create config.
-  AudioEncoderOpusConfig config;
-  // The limit -- including the hysteresis window -- at which the complexity
-  // shuold be increased (but not in this test since complexity adaptation is
-  // disabled).
-  config.bitrate_bps = rtc::Optional<int>(11000 - 1);
-  int64_t runtime_10999bps = RunComplexityTest(config);
-
-  config.bitrate_bps = rtc::Optional<int>(15500);
-  int64_t runtime_15500bps = RunComplexityTest(config);
-
-  test::PrintResult("opus_encoding_complexity_ratio", "", "adaptation_off",
-                    100.0 * runtime_10999bps / runtime_15500bps, "percent",
-                    true);
-}
-}  // namespace webrtc
diff --git a/modules/audio_coding/codecs/opus/opus_fec_test.cc b/modules/audio_coding/codecs/opus/opus_fec_test.cc
deleted file mode 100644
index 8f42bf4..0000000
--- a/modules/audio_coding/codecs/opus/opus_fec_test.cc
+++ /dev/null
@@ -1,242 +0,0 @@
-/*
- *  Copyright (c) 2014 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 <memory>
-
-#include "webrtc/modules/audio_coding/codecs/opus/opus_interface.h"
-#include "webrtc/rtc_base/format_macros.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/testsupport/fileutils.h"
-
-using ::std::string;
-using ::std::tr1::tuple;
-using ::std::tr1::get;
-using ::testing::TestWithParam;
-
-namespace webrtc {
-
-// Define coding parameter as <channels, bit_rate, filename, extension>.
-typedef tuple<size_t, int, string, string> coding_param;
-typedef struct mode mode;
-
-struct mode {
-  bool fec;
-  uint8_t target_packet_loss_rate;
-};
-
-const int kOpusBlockDurationMs = 20;
-const int kOpusSamplingKhz = 48;
-
-class OpusFecTest : public TestWithParam<coding_param> {
- protected:
-  OpusFecTest();
-
-  virtual void SetUp();
-  virtual void TearDown();
-
-  virtual void EncodeABlock();
-
-  virtual void DecodeABlock(bool lost_previous, bool lost_current);
-
-  int block_duration_ms_;
-  int sampling_khz_;
-  size_t block_length_sample_;
-
-  size_t channels_;
-  int bit_rate_;
-
-  size_t data_pointer_;
-  size_t loop_length_samples_;
-  size_t max_bytes_;
-  size_t encoded_bytes_;
-
-  WebRtcOpusEncInst* opus_encoder_;
-  WebRtcOpusDecInst* opus_decoder_;
-
-  string in_filename_;
-
-  std::unique_ptr<int16_t[]> in_data_;
-  std::unique_ptr<int16_t[]> out_data_;
-  std::unique_ptr<uint8_t[]> bit_stream_;
-};
-
-void OpusFecTest::SetUp() {
-  channels_ = get<0>(GetParam());
-  bit_rate_ = get<1>(GetParam());
-  printf("Coding %" PRIuS " channel signal at %d bps.\n", channels_, bit_rate_);
-
-  in_filename_ = test::ResourcePath(get<2>(GetParam()), get<3>(GetParam()));
-
-  FILE* fp = fopen(in_filename_.c_str(), "rb");
-  ASSERT_FALSE(fp == NULL);
-
-  // Obtain file size.
-  fseek(fp, 0, SEEK_END);
-  loop_length_samples_ = ftell(fp) / sizeof(int16_t);
-  rewind(fp);
-
-  // Allocate memory to contain the whole file.
-  in_data_.reset(new int16_t[loop_length_samples_ +
-      block_length_sample_ * channels_]);
-
-  // Copy the file into the buffer.
-  ASSERT_EQ(fread(&in_data_[0], sizeof(int16_t), loop_length_samples_, fp),
-            loop_length_samples_);
-  fclose(fp);
-
-  // The audio will be used in a looped manner. To ease the acquisition of an
-  // audio frame that crosses the end of the excerpt, we add an extra block
-  // length of samples to the end of the array, starting over again from the
-  // beginning of the array. Audio frames cross the end of the excerpt always
-  // appear as a continuum of memory.
-  memcpy(&in_data_[loop_length_samples_], &in_data_[0],
-         block_length_sample_ * channels_ * sizeof(int16_t));
-
-  // Maximum number of bytes in output bitstream.
-  max_bytes_ = block_length_sample_ * channels_ * sizeof(int16_t);
-
-  out_data_.reset(new int16_t[2 * block_length_sample_ * channels_]);
-  bit_stream_.reset(new uint8_t[max_bytes_]);
-
-  // If channels_ == 1, use Opus VOIP mode, otherwise, audio mode.
-  int app = channels_ == 1 ? 0 : 1;
-
-  // Create encoder memory.
-  EXPECT_EQ(0, WebRtcOpus_EncoderCreate(&opus_encoder_, channels_, app));
-  EXPECT_EQ(0, WebRtcOpus_DecoderCreate(&opus_decoder_, channels_));
-  // Set bitrate.
-  EXPECT_EQ(0, WebRtcOpus_SetBitRate(opus_encoder_, bit_rate_));
-}
-
-void OpusFecTest::TearDown() {
-  // Free memory.
-  EXPECT_EQ(0, WebRtcOpus_EncoderFree(opus_encoder_));
-  EXPECT_EQ(0, WebRtcOpus_DecoderFree(opus_decoder_));
-}
-
-OpusFecTest::OpusFecTest()
-    : block_duration_ms_(kOpusBlockDurationMs),
-      sampling_khz_(kOpusSamplingKhz),
-      block_length_sample_(
-          static_cast<size_t>(block_duration_ms_ * sampling_khz_)),
-      data_pointer_(0),
-      max_bytes_(0),
-      encoded_bytes_(0),
-      opus_encoder_(NULL),
-      opus_decoder_(NULL) {
-}
-
-void OpusFecTest::EncodeABlock() {
-  int value = WebRtcOpus_Encode(opus_encoder_,
-                                &in_data_[data_pointer_],
-                                block_length_sample_,
-                                max_bytes_, &bit_stream_[0]);
-  EXPECT_GT(value, 0);
-
-  encoded_bytes_ = static_cast<size_t>(value);
-}
-
-void OpusFecTest::DecodeABlock(bool lost_previous, bool lost_current) {
-  int16_t audio_type;
-  int value_1 = 0, value_2 = 0;
-
-  if (lost_previous) {
-    // Decode previous frame.
-    if (!lost_current &&
-        WebRtcOpus_PacketHasFec(&bit_stream_[0], encoded_bytes_) == 1) {
-      value_1 = WebRtcOpus_DecodeFec(opus_decoder_, &bit_stream_[0],
-                                     encoded_bytes_, &out_data_[0],
-                                     &audio_type);
-    } else {
-      value_1 = WebRtcOpus_DecodePlc(opus_decoder_, &out_data_[0], 1);
-    }
-    EXPECT_EQ(static_cast<int>(block_length_sample_), value_1);
-  }
-
-  if (!lost_current) {
-    // Decode current frame.
-    value_2 = WebRtcOpus_Decode(opus_decoder_, &bit_stream_[0], encoded_bytes_,
-                                &out_data_[value_1 * channels_], &audio_type);
-    EXPECT_EQ(static_cast<int>(block_length_sample_), value_2);
-  }
-}
-
-TEST_P(OpusFecTest, RandomPacketLossTest) {
-  const int kDurationMs = 200000;
-  int time_now_ms, fec_frames;
-  int actual_packet_loss_rate;
-  bool lost_current, lost_previous;
-  mode mode_set[3] = {{true, 0},
-                      {false, 0},
-                      {true, 50}};
-
-  lost_current = false;
-  for (int i = 0; i < 3; i++) {
-    if (mode_set[i].fec) {
-      EXPECT_EQ(0, WebRtcOpus_EnableFec(opus_encoder_));
-      EXPECT_EQ(0, WebRtcOpus_SetPacketLossRate(opus_encoder_,
-          mode_set[i].target_packet_loss_rate));
-      printf("FEC is ON, target at packet loss rate %d percent.\n",
-             mode_set[i].target_packet_loss_rate);
-    } else {
-      EXPECT_EQ(0, WebRtcOpus_DisableFec(opus_encoder_));
-      printf("FEC is OFF.\n");
-    }
-    // In this test, we let the target packet loss rate match the actual rate.
-    actual_packet_loss_rate = mode_set[i].target_packet_loss_rate;
-    // Run every mode a certain time.
-    time_now_ms = 0;
-    fec_frames = 0;
-    while (time_now_ms < kDurationMs) {
-      // Encode & decode.
-      EncodeABlock();
-
-      // Check if payload has FEC.
-      int fec = WebRtcOpus_PacketHasFec(&bit_stream_[0], encoded_bytes_);
-
-      // If FEC is disabled or the target packet loss rate is set to 0, there
-      // should be no FEC in the bit stream.
-      if (!mode_set[i].fec || mode_set[i].target_packet_loss_rate == 0) {
-        EXPECT_EQ(fec, 0);
-      } else if (fec == 1) {
-        fec_frames++;
-      }
-
-      lost_previous = lost_current;
-      lost_current = rand() < actual_packet_loss_rate * (RAND_MAX / 100);
-      DecodeABlock(lost_previous, lost_current);
-
-      time_now_ms += block_duration_ms_;
-
-      // |data_pointer_| is incremented and wrapped across
-      // |loop_length_samples_|.
-      data_pointer_ = (data_pointer_ + block_length_sample_ * channels_) %
-        loop_length_samples_;
-    }
-    if (mode_set[i].fec) {
-      printf("%.2f percent frames has FEC.\n",
-             static_cast<float>(fec_frames) * block_duration_ms_ / 2000);
-    }
-  }
-}
-
-const coding_param param_set[] =
-    {::std::tr1::make_tuple(1, 64000, string("audio_coding/testfile32kHz"),
-                            string("pcm")),
-     ::std::tr1::make_tuple(1, 32000, string("audio_coding/testfile32kHz"),
-                            string("pcm")),
-     ::std::tr1::make_tuple(2, 64000, string("audio_coding/teststereo32kHz"),
-                            string("pcm"))};
-
-// 64 kbps, stereo
-INSTANTIATE_TEST_CASE_P(AllTest, OpusFecTest,
-                        ::testing::ValuesIn(param_set));
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/codecs/opus/opus_inst.h b/modules/audio_coding/codecs/opus/opus_inst.h
deleted file mode 100644
index 976f09e..0000000
--- a/modules/audio_coding/codecs/opus/opus_inst.h
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- *  Copyright (c) 2014 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_CODECS_OPUS_OPUS_INST_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_OPUS_OPUS_INST_H_
-
-#include <stddef.h>
-
-#include "webrtc/rtc_base/ignore_wundef.h"
-
-RTC_PUSH_IGNORING_WUNDEF()
-#include "opus.h"
-RTC_POP_IGNORING_WUNDEF()
-
-struct WebRtcOpusEncInst {
-  OpusEncoder* encoder;
-  size_t channels;
-  int in_dtx_mode;
-};
-
-struct WebRtcOpusDecInst {
-  OpusDecoder* decoder;
-  int prev_decoded_samples;
-  size_t channels;
-  int in_dtx_mode;
-};
-
-
-#endif  // WEBRTC_MODULES_AUDIO_CODING_CODECS_OPUS_OPUS_INST_H_
diff --git a/modules/audio_coding/codecs/opus/opus_interface.c b/modules/audio_coding/codecs/opus/opus_interface.c
deleted file mode 100644
index 6427f0f..0000000
--- a/modules/audio_coding/codecs/opus/opus_interface.c
+++ /dev/null
@@ -1,503 +0,0 @@
-/*
- *  Copyright (c) 2012 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/codecs/opus/opus_interface.h"
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/modules/audio_coding/codecs/opus/opus_inst.h"
-
-#include <stdlib.h>
-#include <string.h>
-
-enum {
-#if WEBRTC_OPUS_SUPPORT_120MS_PTIME
-  /* Maximum supported frame size in WebRTC is 120 ms. */
-  kWebRtcOpusMaxEncodeFrameSizeMs = 120,
-#else
-  /* Maximum supported frame size in WebRTC is 60 ms. */
-  kWebRtcOpusMaxEncodeFrameSizeMs = 60,
-#endif
-
-  /* The format allows up to 120 ms frames. Since we don't control the other
-   * side, we must allow for packets of that size. NetEq is currently limited
-   * to 60 ms on the receive side. */
-  kWebRtcOpusMaxDecodeFrameSizeMs = 120,
-
-  /* Maximum sample count per channel is 48 kHz * maximum frame size in
-   * milliseconds. */
-  kWebRtcOpusMaxFrameSizePerChannel = 48 * kWebRtcOpusMaxDecodeFrameSizeMs,
-
-  /* Default frame size, 20 ms @ 48 kHz, in samples (for one channel). */
-  kWebRtcOpusDefaultFrameSize = 960,
-};
-
-int16_t WebRtcOpus_EncoderCreate(OpusEncInst** inst,
-                                 size_t channels,
-                                 int32_t application) {
-  int opus_app;
-  if (!inst)
-    return -1;
-
-  switch (application) {
-    case 0:
-      opus_app = OPUS_APPLICATION_VOIP;
-      break;
-    case 1:
-      opus_app = OPUS_APPLICATION_AUDIO;
-      break;
-    default:
-      return -1;
-  }
-
-  OpusEncInst* state = calloc(1, sizeof(OpusEncInst));
-  RTC_DCHECK(state);
-
-  int error;
-  state->encoder = opus_encoder_create(48000, (int)channels, opus_app,
-                                       &error);
-  if (error != OPUS_OK || !state->encoder) {
-    WebRtcOpus_EncoderFree(state);
-    return -1;
-  }
-
-  state->in_dtx_mode = 0;
-  state->channels = channels;
-
-  *inst = state;
-  return 0;
-}
-
-int16_t WebRtcOpus_EncoderFree(OpusEncInst* inst) {
-  if (inst) {
-    opus_encoder_destroy(inst->encoder);
-    free(inst);
-    return 0;
-  } else {
-    return -1;
-  }
-}
-
-int WebRtcOpus_Encode(OpusEncInst* inst,
-                      const int16_t* audio_in,
-                      size_t samples,
-                      size_t length_encoded_buffer,
-                      uint8_t* encoded) {
-  int res;
-
-  if (samples > 48 * kWebRtcOpusMaxEncodeFrameSizeMs) {
-    return -1;
-  }
-
-  res = opus_encode(inst->encoder,
-                    (const opus_int16*)audio_in,
-                    (int)samples,
-                    encoded,
-                    (opus_int32)length_encoded_buffer);
-
-  if (res <= 0) {
-    return -1;
-  }
-
-  if (res <= 2) {
-    // Indicates DTX since the packet has nothing but a header. In principle,
-    // there is no need to send this packet. However, we do transmit the first
-    // occurrence to let the decoder know that the encoder enters DTX mode.
-    if (inst->in_dtx_mode) {
-      return 0;
-    } else {
-      inst->in_dtx_mode = 1;
-      return res;
-    }
-  }
-
-  inst->in_dtx_mode = 0;
-  return res;
-}
-
-int16_t WebRtcOpus_SetBitRate(OpusEncInst* inst, int32_t rate) {
-  if (inst) {
-    return opus_encoder_ctl(inst->encoder, OPUS_SET_BITRATE(rate));
-  } else {
-    return -1;
-  }
-}
-
-int16_t WebRtcOpus_SetPacketLossRate(OpusEncInst* inst, int32_t loss_rate) {
-  if (inst) {
-    return opus_encoder_ctl(inst->encoder,
-                            OPUS_SET_PACKET_LOSS_PERC(loss_rate));
-  } else {
-    return -1;
-  }
-}
-
-int16_t WebRtcOpus_SetMaxPlaybackRate(OpusEncInst* inst, int32_t frequency_hz) {
-  opus_int32 set_bandwidth;
-
-  if (!inst)
-    return -1;
-
-  if (frequency_hz <= 8000) {
-    set_bandwidth = OPUS_BANDWIDTH_NARROWBAND;
-  } else if (frequency_hz <= 12000) {
-    set_bandwidth = OPUS_BANDWIDTH_MEDIUMBAND;
-  } else if (frequency_hz <= 16000) {
-    set_bandwidth = OPUS_BANDWIDTH_WIDEBAND;
-  } else if (frequency_hz <= 24000) {
-    set_bandwidth = OPUS_BANDWIDTH_SUPERWIDEBAND;
-  } else {
-    set_bandwidth = OPUS_BANDWIDTH_FULLBAND;
-  }
-  return opus_encoder_ctl(inst->encoder,
-                          OPUS_SET_MAX_BANDWIDTH(set_bandwidth));
-}
-
-int16_t WebRtcOpus_EnableFec(OpusEncInst* inst) {
-  if (inst) {
-    return opus_encoder_ctl(inst->encoder, OPUS_SET_INBAND_FEC(1));
-  } else {
-    return -1;
-  }
-}
-
-int16_t WebRtcOpus_DisableFec(OpusEncInst* inst) {
-  if (inst) {
-    return opus_encoder_ctl(inst->encoder, OPUS_SET_INBAND_FEC(0));
-  } else {
-    return -1;
-  }
-}
-
-int16_t WebRtcOpus_EnableDtx(OpusEncInst* inst) {
-  if (!inst) {
-    return -1;
-  }
-
-  // To prevent Opus from entering CELT-only mode by forcing signal type to
-  // voice to make sure that DTX behaves correctly. Currently, DTX does not
-  // last long during a pure silence, if the signal type is not forced.
-  // TODO(minyue): Remove the signal type forcing when Opus DTX works properly
-  // without it.
-  int ret = opus_encoder_ctl(inst->encoder,
-                             OPUS_SET_SIGNAL(OPUS_SIGNAL_VOICE));
-  if (ret != OPUS_OK)
-    return ret;
-
-  return opus_encoder_ctl(inst->encoder, OPUS_SET_DTX(1));
-}
-
-int16_t WebRtcOpus_DisableDtx(OpusEncInst* inst) {
-  if (inst) {
-    int ret = opus_encoder_ctl(inst->encoder,
-                               OPUS_SET_SIGNAL(OPUS_AUTO));
-    if (ret != OPUS_OK)
-      return ret;
-    return opus_encoder_ctl(inst->encoder, OPUS_SET_DTX(0));
-  } else {
-    return -1;
-  }
-}
-
-int16_t WebRtcOpus_EnableCbr(OpusEncInst* inst) {
-  if (inst) {
-    return opus_encoder_ctl(inst->encoder, OPUS_SET_VBR(0));
-  } else {
-    return -1;
-  }
-}
-
-int16_t WebRtcOpus_DisableCbr(OpusEncInst* inst) {
-  if (inst) {
-    return opus_encoder_ctl(inst->encoder, OPUS_SET_VBR(1));
-  } else {
-    return -1;
-  }
-}
-
-int16_t WebRtcOpus_SetComplexity(OpusEncInst* inst, int32_t complexity) {
-  if (inst) {
-    return opus_encoder_ctl(inst->encoder, OPUS_SET_COMPLEXITY(complexity));
-  } else {
-    return -1;
-  }
-}
-
-int16_t WebRtcOpus_SetForceChannels(OpusEncInst* inst, size_t num_channels) {
-  if (!inst)
-    return -1;
-  if (num_channels == 0) {
-    return opus_encoder_ctl(inst->encoder,
-                            OPUS_SET_FORCE_CHANNELS(OPUS_AUTO));
-  } else if (num_channels == 1 || num_channels == 2) {
-    return opus_encoder_ctl(inst->encoder,
-                            OPUS_SET_FORCE_CHANNELS(num_channels));
-  } else {
-    return -1;
-  }
-}
-
-int16_t WebRtcOpus_DecoderCreate(OpusDecInst** inst, size_t channels) {
-  int error;
-  OpusDecInst* state;
-
-  if (inst != NULL) {
-    /* Create Opus decoder state. */
-    state = (OpusDecInst*) calloc(1, sizeof(OpusDecInst));
-    if (state == NULL) {
-      return -1;
-    }
-
-    /* Create new memory, always at 48000 Hz. */
-    state->decoder = opus_decoder_create(48000, (int)channels, &error);
-    if (error == OPUS_OK && state->decoder != NULL) {
-      /* Creation of memory all ok. */
-      state->channels = channels;
-      state->prev_decoded_samples = kWebRtcOpusDefaultFrameSize;
-      state->in_dtx_mode = 0;
-      *inst = state;
-      return 0;
-    }
-
-    /* If memory allocation was unsuccessful, free the entire state. */
-    if (state->decoder) {
-      opus_decoder_destroy(state->decoder);
-    }
-    free(state);
-  }
-  return -1;
-}
-
-int16_t WebRtcOpus_DecoderFree(OpusDecInst* inst) {
-  if (inst) {
-    opus_decoder_destroy(inst->decoder);
-    free(inst);
-    return 0;
-  } else {
-    return -1;
-  }
-}
-
-size_t WebRtcOpus_DecoderChannels(OpusDecInst* inst) {
-  return inst->channels;
-}
-
-void WebRtcOpus_DecoderInit(OpusDecInst* inst) {
-  opus_decoder_ctl(inst->decoder, OPUS_RESET_STATE);
-  inst->in_dtx_mode = 0;
-}
-
-/* For decoder to determine if it is to output speech or comfort noise. */
-static int16_t DetermineAudioType(OpusDecInst* inst, size_t encoded_bytes) {
-  // Audio type becomes comfort noise if |encoded_byte| is 1 and keeps
-  // to be so if the following |encoded_byte| are 0 or 1.
-  if (encoded_bytes == 0 && inst->in_dtx_mode) {
-    return 2;  // Comfort noise.
-  } else if (encoded_bytes == 1 || encoded_bytes == 2) {
-    // TODO(henrik.lundin): There is a slight risk that a 2-byte payload is in
-    // fact a 1-byte TOC with a 1-byte payload. That will be erroneously
-    // interpreted as comfort noise output, but such a payload is probably
-    // faulty anyway.
-    inst->in_dtx_mode = 1;
-    return 2;  // Comfort noise.
-  } else {
-    inst->in_dtx_mode = 0;
-    return 0;  // Speech.
-  }
-}
-
-/* |frame_size| is set to maximum Opus frame size in the normal case, and
- * is set to the number of samples needed for PLC in case of losses.
- * It is up to the caller to make sure the value is correct. */
-static int DecodeNative(OpusDecInst* inst, const uint8_t* encoded,
-                        size_t encoded_bytes, int frame_size,
-                        int16_t* decoded, int16_t* audio_type, int decode_fec) {
-  int res = opus_decode(inst->decoder, encoded, (opus_int32)encoded_bytes,
-                        (opus_int16*)decoded, frame_size, decode_fec);
-
-  if (res <= 0)
-    return -1;
-
-  *audio_type = DetermineAudioType(inst, encoded_bytes);
-
-  return res;
-}
-
-int WebRtcOpus_Decode(OpusDecInst* inst, const uint8_t* encoded,
-                      size_t encoded_bytes, int16_t* decoded,
-                      int16_t* audio_type) {
-  int decoded_samples;
-
-  if (encoded_bytes == 0) {
-    *audio_type = DetermineAudioType(inst, encoded_bytes);
-    decoded_samples = WebRtcOpus_DecodePlc(inst, decoded, 1);
-  } else {
-    decoded_samples = DecodeNative(inst,
-                                   encoded,
-                                   encoded_bytes,
-                                   kWebRtcOpusMaxFrameSizePerChannel,
-                                   decoded,
-                                   audio_type,
-                                   0);
-  }
-  if (decoded_samples < 0) {
-    return -1;
-  }
-
-  /* Update decoded sample memory, to be used by the PLC in case of losses. */
-  inst->prev_decoded_samples = decoded_samples;
-
-  return decoded_samples;
-}
-
-int WebRtcOpus_DecodePlc(OpusDecInst* inst, int16_t* decoded,
-                         int number_of_lost_frames) {
-  int16_t audio_type = 0;
-  int decoded_samples;
-  int plc_samples;
-
-  /* The number of samples we ask for is |number_of_lost_frames| times
-   * |prev_decoded_samples_|. Limit the number of samples to maximum
-   * |kWebRtcOpusMaxFrameSizePerChannel|. */
-  plc_samples = number_of_lost_frames * inst->prev_decoded_samples;
-  plc_samples = (plc_samples <= kWebRtcOpusMaxFrameSizePerChannel) ?
-      plc_samples : kWebRtcOpusMaxFrameSizePerChannel;
-  decoded_samples = DecodeNative(inst, NULL, 0, plc_samples,
-                                 decoded, &audio_type, 0);
-  if (decoded_samples < 0) {
-    return -1;
-  }
-
-  return decoded_samples;
-}
-
-int WebRtcOpus_DecodeFec(OpusDecInst* inst, const uint8_t* encoded,
-                         size_t encoded_bytes, int16_t* decoded,
-                         int16_t* audio_type) {
-  int decoded_samples;
-  int fec_samples;
-
-  if (WebRtcOpus_PacketHasFec(encoded, encoded_bytes) != 1) {
-    return 0;
-  }
-
-  fec_samples = opus_packet_get_samples_per_frame(encoded, 48000);
-
-  decoded_samples = DecodeNative(inst, encoded, encoded_bytes,
-                                 fec_samples, decoded, audio_type, 1);
-  if (decoded_samples < 0) {
-    return -1;
-  }
-
-  return decoded_samples;
-}
-
-int WebRtcOpus_DurationEst(OpusDecInst* inst,
-                           const uint8_t* payload,
-                           size_t payload_length_bytes) {
-  if (payload_length_bytes == 0) {
-    // WebRtcOpus_Decode calls PLC when payload length is zero. So we return
-    // PLC duration correspondingly.
-    return WebRtcOpus_PlcDuration(inst);
-  }
-
-  int frames, samples;
-  frames = opus_packet_get_nb_frames(payload, (opus_int32)payload_length_bytes);
-  if (frames < 0) {
-    /* Invalid payload data. */
-    return 0;
-  }
-  samples = frames * opus_packet_get_samples_per_frame(payload, 48000);
-  if (samples < 120 || samples > 5760) {
-    /* Invalid payload duration. */
-    return 0;
-  }
-  return samples;
-}
-
-int WebRtcOpus_PlcDuration(OpusDecInst* inst) {
-  /* The number of samples we ask for is |number_of_lost_frames| times
-   * |prev_decoded_samples_|. Limit the number of samples to maximum
-   * |kWebRtcOpusMaxFrameSizePerChannel|. */
-  const int plc_samples = inst->prev_decoded_samples;
-  return (plc_samples <= kWebRtcOpusMaxFrameSizePerChannel) ?
-      plc_samples : kWebRtcOpusMaxFrameSizePerChannel;
-}
-
-int WebRtcOpus_FecDurationEst(const uint8_t* payload,
-                              size_t payload_length_bytes) {
-  int samples;
-  if (WebRtcOpus_PacketHasFec(payload, payload_length_bytes) != 1) {
-    return 0;
-  }
-
-  samples = opus_packet_get_samples_per_frame(payload, 48000);
-  if (samples < 480 || samples > 5760) {
-    /* Invalid payload duration. */
-    return 0;
-  }
-  return samples;
-}
-
-int WebRtcOpus_PacketHasFec(const uint8_t* payload,
-                            size_t payload_length_bytes) {
-  int frames, channels, payload_length_ms;
-  int n;
-  opus_int16 frame_sizes[48];
-  const unsigned char *frame_data[48];
-
-  if (payload == NULL || payload_length_bytes == 0)
-    return 0;
-
-  /* In CELT_ONLY mode, packets should not have FEC. */
-  if (payload[0] & 0x80)
-    return 0;
-
-  payload_length_ms = opus_packet_get_samples_per_frame(payload, 48000) / 48;
-  if (10 > payload_length_ms)
-    payload_length_ms = 10;
-
-  channels = opus_packet_get_nb_channels(payload);
-
-  switch (payload_length_ms) {
-    case 10:
-    case 20: {
-      frames = 1;
-      break;
-    }
-    case 40: {
-      frames = 2;
-      break;
-    }
-    case 60: {
-      frames = 3;
-      break;
-    }
-    default: {
-      return 0; // It is actually even an invalid packet.
-    }
-  }
-
-  /* The following is to parse the LBRR flags. */
-  if (opus_packet_parse(payload, (opus_int32)payload_length_bytes, NULL,
-                        frame_data, frame_sizes, NULL) < 0) {
-    return 0;
-  }
-
-  if (frame_sizes[0] <= 1) {
-    return 0;
-  }
-
-  for (n = 0; n < channels; n++) {
-    if (frame_data[0][0] & (0x80 >> ((n + 1) * (frames + 1) - 1)))
-      return 1;
-  }
-
-  return 0;
-}
diff --git a/modules/audio_coding/codecs/opus/opus_interface.h b/modules/audio_coding/codecs/opus/opus_interface.h
deleted file mode 100644
index 2985151..0000000
--- a/modules/audio_coding/codecs/opus/opus_interface.h
+++ /dev/null
@@ -1,397 +0,0 @@
-/*
- *  Copyright (c) 2012 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_CODECS_OPUS_OPUS_INTERFACE_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_OPUS_OPUS_INTERFACE_H_
-
-#include <stddef.h>
-
-#include "webrtc/typedefs.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-// Opaque wrapper types for the codec state.
-typedef struct WebRtcOpusEncInst OpusEncInst;
-typedef struct WebRtcOpusDecInst OpusDecInst;
-
-/****************************************************************************
- * WebRtcOpus_EncoderCreate(...)
- *
- * This function create an Opus encoder.
- *
- * Input:
- *      - channels           : number of channels.
- *      - application        : 0 - VOIP applications.
- *                                 Favor speech intelligibility.
- *                             1 - Audio applications.
- *                                 Favor faithfulness to the original input.
- *
- * Output:
- *      - inst               : a pointer to Encoder context that is created
- *                             if success.
- *
- * Return value              : 0 - Success
- *                            -1 - Error
- */
-int16_t WebRtcOpus_EncoderCreate(OpusEncInst** inst,
-                                 size_t channels,
-                                 int32_t application);
-
-int16_t WebRtcOpus_EncoderFree(OpusEncInst* inst);
-
-/****************************************************************************
- * WebRtcOpus_Encode(...)
- *
- * This function encodes audio as a series of Opus frames and inserts
- * it into a packet. Input buffer can be any length.
- *
- * Input:
- *      - inst                  : Encoder context
- *      - audio_in              : Input speech data buffer
- *      - samples               : Samples per channel in audio_in
- *      - length_encoded_buffer : Output buffer size
- *
- * Output:
- *      - encoded               : Output compressed data buffer
- *
- * Return value                 : >=0 - Length (in bytes) of coded data
- *                                -1 - Error
- */
-int WebRtcOpus_Encode(OpusEncInst* inst,
-                      const int16_t* audio_in,
-                      size_t samples,
-                      size_t length_encoded_buffer,
-                      uint8_t* encoded);
-
-/****************************************************************************
- * WebRtcOpus_SetBitRate(...)
- *
- * This function adjusts the target bitrate of the encoder.
- *
- * Input:
- *      - inst               : Encoder context
- *      - rate               : New target bitrate
- *
- * Return value              :  0 - Success
- *                             -1 - Error
- */
-int16_t WebRtcOpus_SetBitRate(OpusEncInst* inst, int32_t rate);
-
-/****************************************************************************
- * WebRtcOpus_SetPacketLossRate(...)
- *
- * This function configures the encoder's expected packet loss percentage.
- *
- * Input:
- *      - inst               : Encoder context
- *      - loss_rate          : loss percentage in the range 0-100, inclusive.
- * Return value              :  0 - Success
- *                             -1 - Error
- */
-int16_t WebRtcOpus_SetPacketLossRate(OpusEncInst* inst, int32_t loss_rate);
-
-/****************************************************************************
- * WebRtcOpus_SetMaxPlaybackRate(...)
- *
- * Configures the maximum playback rate for encoding. Due to hardware
- * limitations, the receiver may render audio up to a playback rate. Opus
- * encoder can use this information to optimize for network usage and encoding
- * complexity. This will affect the audio bandwidth in the coded audio. However,
- * the input/output sample rate is not affected.
- *
- * Input:
- *      - inst               : Encoder context
- *      - frequency_hz       : Maximum playback rate in Hz.
- *                             This parameter can take any value. The relation
- *                             between the value and the Opus internal mode is
- *                             as following:
- *                             frequency_hz <= 8000           narrow band
- *                             8000 < frequency_hz <= 12000   medium band
- *                             12000 < frequency_hz <= 16000  wide band
- *                             16000 < frequency_hz <= 24000  super wide band
- *                             frequency_hz > 24000           full band
- * Return value              :  0 - Success
- *                             -1 - Error
- */
-int16_t WebRtcOpus_SetMaxPlaybackRate(OpusEncInst* inst, int32_t frequency_hz);
-
-/* TODO(minyue): Check whether an API to check the FEC and the packet loss rate
- * is needed. It might not be very useful since there are not many use cases and
- * the caller can always maintain the states. */
-
-/****************************************************************************
- * WebRtcOpus_EnableFec()
- *
- * This function enables FEC for encoding.
- *
- * Input:
- *      - inst               : Encoder context
- *
- * Return value              :  0 - Success
- *                             -1 - Error
- */
-int16_t WebRtcOpus_EnableFec(OpusEncInst* inst);
-
-/****************************************************************************
- * WebRtcOpus_DisableFec()
- *
- * This function disables FEC for encoding.
- *
- * Input:
- *      - inst               : Encoder context
- *
- * Return value              :  0 - Success
- *                             -1 - Error
- */
-int16_t WebRtcOpus_DisableFec(OpusEncInst* inst);
-
-/****************************************************************************
- * WebRtcOpus_EnableDtx()
- *
- * This function enables Opus internal DTX for encoding.
- *
- * Input:
- *      - inst               : Encoder context
- *
- * Return value              :  0 - Success
- *                             -1 - Error
- */
-int16_t WebRtcOpus_EnableDtx(OpusEncInst* inst);
-
-/****************************************************************************
- * WebRtcOpus_DisableDtx()
- *
- * This function disables Opus internal DTX for encoding.
- *
- * Input:
- *      - inst               : Encoder context
- *
- * Return value              :  0 - Success
- *                             -1 - Error
- */
-int16_t WebRtcOpus_DisableDtx(OpusEncInst* inst);
-
-/****************************************************************************
- * WebRtcOpus_EnableCbr()
- *
- * This function enables CBR for encoding.
- *
- * Input:
- *      - inst               : Encoder context
- *
- * Return value              :  0 - Success
- *                             -1 - Error
- */
-int16_t WebRtcOpus_EnableCbr(OpusEncInst* inst);
-
-/****************************************************************************
- * WebRtcOpus_DisableCbr()
- *
- * This function disables CBR for encoding.
- *
- * Input:
- *      - inst               : Encoder context
- *
- * Return value              :  0 - Success
- *                             -1 - Error
- */
-int16_t WebRtcOpus_DisableCbr(OpusEncInst* inst);
-
-/*
- * WebRtcOpus_SetComplexity(...)
- *
- * This function adjusts the computational complexity. The effect is the same as
- * calling the complexity setting of Opus as an Opus encoder related CTL.
- *
- * Input:
- *      - inst               : Encoder context
- *      - complexity         : New target complexity (0-10, inclusive)
- *
- * Return value              :  0 - Success
- *                             -1 - Error
- */
-int16_t WebRtcOpus_SetComplexity(OpusEncInst* inst, int32_t complexity);
-
-/*
- * WebRtcOpus_SetForceChannels(...)
- *
- * If the encoder is initialized as a stereo encoder, Opus will by default
- * decide whether to encode in mono or stereo based on the bitrate. This
- * function overrules the previous setting, and forces the encoder to encode
- * in auto/mono/stereo.
- *
- * If the Encoder is initialized as a mono encoder, and one tries to force
- * stereo, the function will return an error.
- *
- * Input:
- *      - inst               : Encoder context
- *      - num_channels       : 0 - Not forced
- *                             1 - Mono
- *                             2 - Stereo
- *
- * Return value              :  0 - Success
- *                             -1 - Error
- */
-int16_t WebRtcOpus_SetForceChannels(OpusEncInst* inst, size_t num_channels);
-
-int16_t WebRtcOpus_DecoderCreate(OpusDecInst** inst, size_t channels);
-int16_t WebRtcOpus_DecoderFree(OpusDecInst* inst);
-
-/****************************************************************************
- * WebRtcOpus_DecoderChannels(...)
- *
- * This function returns the number of channels created for Opus decoder.
- */
-size_t WebRtcOpus_DecoderChannels(OpusDecInst* inst);
-
-/****************************************************************************
- * WebRtcOpus_DecoderInit(...)
- *
- * This function resets state of the decoder.
- *
- * Input:
- *      - inst               : Decoder context
- */
-void WebRtcOpus_DecoderInit(OpusDecInst* inst);
-
-/****************************************************************************
- * WebRtcOpus_Decode(...)
- *
- * This function decodes an Opus packet into one or more audio frames at the
- * ACM interface's sampling rate (32 kHz).
- *
- * Input:
- *      - inst               : Decoder context
- *      - encoded            : Encoded data
- *      - encoded_bytes      : Bytes in encoded vector
- *
- * Output:
- *      - decoded            : The decoded vector
- *      - audio_type         : 1 normal, 2 CNG (for Opus it should
- *                             always return 1 since we're not using Opus's
- *                             built-in DTX/CNG scheme)
- *
- * Return value              : >0 - Samples per channel in decoded vector
- *                             -1 - Error
- */
-int WebRtcOpus_Decode(OpusDecInst* inst, const uint8_t* encoded,
-                      size_t encoded_bytes, int16_t* decoded,
-                      int16_t* audio_type);
-
-/****************************************************************************
- * WebRtcOpus_DecodePlc(...)
- *
- * This function processes PLC for opus frame(s).
- * Input:
- *        - inst                  : Decoder context
- *        - number_of_lost_frames : Number of PLC frames to produce
- *
- * Output:
- *        - decoded               : The decoded vector
- *
- * Return value                   : >0 - number of samples in decoded PLC vector
- *                                  -1 - Error
- */
-int WebRtcOpus_DecodePlc(OpusDecInst* inst, int16_t* decoded,
-                         int number_of_lost_frames);
-
-/****************************************************************************
- * WebRtcOpus_DecodeFec(...)
- *
- * This function decodes the FEC data from an Opus packet into one or more audio
- * frames at the ACM interface's sampling rate (32 kHz).
- *
- * Input:
- *      - inst               : Decoder context
- *      - encoded            : Encoded data
- *      - encoded_bytes      : Bytes in encoded vector
- *
- * Output:
- *      - decoded            : The decoded vector (previous frame)
- *
- * Return value              : >0 - Samples per channel in decoded vector
- *                              0 - No FEC data in the packet
- *                             -1 - Error
- */
-int WebRtcOpus_DecodeFec(OpusDecInst* inst, const uint8_t* encoded,
-                         size_t encoded_bytes, int16_t* decoded,
-                         int16_t* audio_type);
-
-/****************************************************************************
- * WebRtcOpus_DurationEst(...)
- *
- * This function calculates the duration of an opus packet.
- * Input:
- *        - inst                 : Decoder context
- *        - payload              : Encoded data pointer
- *        - payload_length_bytes : Bytes of encoded data
- *
- * Return value                  : The duration of the packet, in samples per
- *                                 channel.
- */
-int WebRtcOpus_DurationEst(OpusDecInst* inst,
-                           const uint8_t* payload,
-                           size_t payload_length_bytes);
-
-/****************************************************************************
- * WebRtcOpus_PlcDuration(...)
- *
- * This function calculates the duration of a frame returned by packet loss
- * concealment (PLC).
- *
- * Input:
- *        - inst                 : Decoder context
- *
- * Return value                  : The duration of a frame returned by PLC, in
- *                                 samples per channel.
- */
-int WebRtcOpus_PlcDuration(OpusDecInst* inst);
-
-/* TODO(minyue): Check whether it is needed to add a decoder context to the
- * arguments, like WebRtcOpus_DurationEst(...). In fact, the packet itself tells
- * the duration. The decoder context in WebRtcOpus_DurationEst(...) is not used.
- * So it may be advisable to remove it from WebRtcOpus_DurationEst(...). */
-
-/****************************************************************************
- * WebRtcOpus_FecDurationEst(...)
- *
- * This function calculates the duration of the FEC data within an opus packet.
- * Input:
- *        - payload              : Encoded data pointer
- *        - payload_length_bytes : Bytes of encoded data
- *
- * Return value                  : >0 - The duration of the FEC data in the
- *                                 packet in samples per channel.
- *                                  0 - No FEC data in the packet.
- */
-int WebRtcOpus_FecDurationEst(const uint8_t* payload,
-                              size_t payload_length_bytes);
-
-/****************************************************************************
- * WebRtcOpus_PacketHasFec(...)
- *
- * This function detects if an opus packet has FEC.
- * Input:
- *        - payload              : Encoded data pointer
- *        - payload_length_bytes : Bytes of encoded data
- *
- * Return value                  : 0 - the packet does NOT contain FEC.
- *                                 1 - the packet contains FEC.
- */
-int WebRtcOpus_PacketHasFec(const uint8_t* payload,
-                            size_t payload_length_bytes);
-
-#ifdef __cplusplus
-}  // extern "C"
-#endif
-
-#endif  // WEBRTC_MODULES_AUDIO_CODING_CODECS_OPUS_OPUS_INTERFACE_H_
diff --git a/modules/audio_coding/codecs/opus/opus_speed_test.cc b/modules/audio_coding/codecs/opus/opus_speed_test.cc
deleted file mode 100644
index 7165d29..0000000
--- a/modules/audio_coding/codecs/opus/opus_speed_test.cc
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- *  Copyright (c) 2014 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/codecs/opus/opus_interface.h"
-#include "webrtc/modules/audio_coding/codecs/tools/audio_codec_speed_test.h"
-
-using ::std::string;
-
-namespace webrtc {
-
-static const int kOpusBlockDurationMs = 20;
-static const int kOpusSamplingKhz = 48;
-
-class OpusSpeedTest : public AudioCodecSpeedTest {
- protected:
-  OpusSpeedTest();
-  void SetUp() override;
-  void TearDown() override;
-  float EncodeABlock(int16_t* in_data, uint8_t* bit_stream,
-                     size_t max_bytes, size_t* encoded_bytes) override;
-  float DecodeABlock(const uint8_t* bit_stream, size_t encoded_bytes,
-                     int16_t* out_data) override;
-  WebRtcOpusEncInst* opus_encoder_;
-  WebRtcOpusDecInst* opus_decoder_;
-};
-
-OpusSpeedTest::OpusSpeedTest()
-    : AudioCodecSpeedTest(kOpusBlockDurationMs,
-                          kOpusSamplingKhz,
-                          kOpusSamplingKhz),
-      opus_encoder_(NULL),
-      opus_decoder_(NULL) {
-}
-
-void OpusSpeedTest::SetUp() {
-  AudioCodecSpeedTest::SetUp();
-  // If channels_ == 1, use Opus VOIP mode, otherwise, audio mode.
-  int app = channels_ == 1 ? 0 : 1;
-  /* Create encoder memory. */
-  EXPECT_EQ(0, WebRtcOpus_EncoderCreate(&opus_encoder_, channels_, app));
-  EXPECT_EQ(0, WebRtcOpus_DecoderCreate(&opus_decoder_, channels_));
-  /* Set bitrate. */
-  EXPECT_EQ(0, WebRtcOpus_SetBitRate(opus_encoder_, bit_rate_));
-}
-
-void OpusSpeedTest::TearDown() {
-  AudioCodecSpeedTest::TearDown();
-  /* Free memory. */
-  EXPECT_EQ(0, WebRtcOpus_EncoderFree(opus_encoder_));
-  EXPECT_EQ(0, WebRtcOpus_DecoderFree(opus_decoder_));
-}
-
-float OpusSpeedTest::EncodeABlock(int16_t* in_data, uint8_t* bit_stream,
-                                  size_t max_bytes, size_t* encoded_bytes) {
-  clock_t clocks = clock();
-  int value = WebRtcOpus_Encode(opus_encoder_, in_data,
-                                input_length_sample_, max_bytes,
-                                bit_stream);
-  clocks = clock() - clocks;
-  EXPECT_GT(value, 0);
-  *encoded_bytes = static_cast<size_t>(value);
-  return 1000.0 * clocks / CLOCKS_PER_SEC;
-}
-
-float OpusSpeedTest::DecodeABlock(const uint8_t* bit_stream,
-                                  size_t encoded_bytes, int16_t* out_data) {
-  int value;
-  int16_t audio_type;
-  clock_t clocks = clock();
-  value = WebRtcOpus_Decode(opus_decoder_, bit_stream, encoded_bytes, out_data,
-                            &audio_type);
-  clocks = clock() - clocks;
-  EXPECT_EQ(output_length_sample_, static_cast<size_t>(value));
-  return 1000.0 * clocks / CLOCKS_PER_SEC;
-}
-
-#define ADD_TEST(complexity) \
-TEST_P(OpusSpeedTest, OpusSetComplexityTest##complexity) { \
-  /* Test audio length in second. */ \
-  size_t kDurationSec = 400; \
-  /* Set complexity. */ \
-  printf("Setting complexity to %d ...\n", complexity); \
-  EXPECT_EQ(0, WebRtcOpus_SetComplexity(opus_encoder_, complexity)); \
-  EncodeDecode(kDurationSec); \
-}
-
-ADD_TEST(10);
-ADD_TEST(9);
-ADD_TEST(8);
-ADD_TEST(7);
-ADD_TEST(6);
-ADD_TEST(5);
-ADD_TEST(4);
-ADD_TEST(3);
-ADD_TEST(2);
-ADD_TEST(1);
-ADD_TEST(0);
-
-// List all test cases: (channel, bit rat, filename, extension).
-const coding_param param_set[] =
-    {::std::tr1::make_tuple(1, 64000,
-                            string("audio_coding/speech_mono_32_48kHz"),
-                            string("pcm"), true),
-     ::std::tr1::make_tuple(1, 32000,
-                            string("audio_coding/speech_mono_32_48kHz"),
-                            string("pcm"), true),
-     ::std::tr1::make_tuple(2, 64000,
-                            string("audio_coding/music_stereo_48kHz"),
-                            string("pcm"), true)};
-
-INSTANTIATE_TEST_CASE_P(AllTest, OpusSpeedTest,
-                        ::testing::ValuesIn(param_set));
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/codecs/opus/opus_unittest.cc b/modules/audio_coding/codecs/opus/opus_unittest.cc
deleted file mode 100644
index 9cff920..0000000
--- a/modules/audio_coding/codecs/opus/opus_unittest.cc
+++ /dev/null
@@ -1,774 +0,0 @@
-/*
- *  Copyright (c) 2013 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 <memory>
-#include <string>
-
-#include "webrtc/modules/audio_coding/codecs/opus/opus_inst.h"
-#include "webrtc/modules/audio_coding/codecs/opus/opus_interface.h"
-#include "webrtc/modules/audio_coding/neteq/tools/audio_loop.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/testsupport/fileutils.h"
-
-namespace webrtc {
-
-using test::AudioLoop;
-using ::testing::TestWithParam;
-using ::testing::Values;
-using ::testing::Combine;
-
-// Maximum number of bytes in output bitstream.
-const size_t kMaxBytes = 1000;
-// Sample rate of Opus.
-const size_t kOpusRateKhz = 48;
-// Number of samples-per-channel in a 20 ms frame, sampled at 48 kHz.
-const size_t kOpus20msFrameSamples = kOpusRateKhz * 20;
-// Number of samples-per-channel in a 10 ms frame, sampled at 48 kHz.
-const size_t kOpus10msFrameSamples = kOpusRateKhz * 10;
-
-class OpusTest : public TestWithParam<::testing::tuple<int, int>> {
- protected:
-  OpusTest();
-
-  void TestDtxEffect(bool dtx, int block_length_ms);
-
-  void TestCbrEffect(bool dtx, int block_length_ms);
-
-  // Prepare |speech_data_| for encoding, read from a hard-coded file.
-  // After preparation, |speech_data_.GetNextBlock()| returns a pointer to a
-  // block of |block_length_ms| milliseconds. The data is looped every
-  // |loop_length_ms| milliseconds.
-  void PrepareSpeechData(size_t channel,
-                         int block_length_ms,
-                         int loop_length_ms);
-
-  int EncodeDecode(WebRtcOpusEncInst* encoder,
-                   rtc::ArrayView<const int16_t> input_audio,
-                   WebRtcOpusDecInst* decoder,
-                   int16_t* output_audio,
-                   int16_t* audio_type);
-
-  void SetMaxPlaybackRate(WebRtcOpusEncInst* encoder,
-                          opus_int32 expect, int32_t set);
-
-  void CheckAudioBounded(const int16_t* audio, size_t samples, size_t channels,
-                         uint16_t bound) const;
-
-  WebRtcOpusEncInst* opus_encoder_;
-  WebRtcOpusDecInst* opus_decoder_;
-
-  AudioLoop speech_data_;
-  uint8_t bitstream_[kMaxBytes];
-  size_t encoded_bytes_;
-  size_t channels_;
-  int application_;
-};
-
-OpusTest::OpusTest()
-    : opus_encoder_(NULL),
-      opus_decoder_(NULL),
-      encoded_bytes_(0),
-      channels_(static_cast<size_t>(::testing::get<0>(GetParam()))),
-      application_(::testing::get<1>(GetParam())) {
-}
-
-void OpusTest::PrepareSpeechData(size_t channel, int block_length_ms,
-                                 int loop_length_ms) {
-  const std::string file_name =
-        webrtc::test::ResourcePath((channel == 1) ?
-            "audio_coding/testfile32kHz" :
-            "audio_coding/teststereo32kHz", "pcm");
-  if (loop_length_ms < block_length_ms) {
-    loop_length_ms = block_length_ms;
-  }
-  EXPECT_TRUE(speech_data_.Init(file_name,
-                                loop_length_ms * kOpusRateKhz * channel,
-                                block_length_ms * kOpusRateKhz * channel));
-}
-
-void OpusTest::SetMaxPlaybackRate(WebRtcOpusEncInst* encoder,
-                                  opus_int32 expect,
-                                  int32_t set) {
-  opus_int32 bandwidth;
-  EXPECT_EQ(0, WebRtcOpus_SetMaxPlaybackRate(opus_encoder_, set));
-  opus_encoder_ctl(opus_encoder_->encoder,
-                   OPUS_GET_MAX_BANDWIDTH(&bandwidth));
-  EXPECT_EQ(expect, bandwidth);
-}
-
-void OpusTest::CheckAudioBounded(const int16_t* audio, size_t samples,
-                                 size_t channels, uint16_t bound) const {
-  for (size_t i = 0; i < samples; ++i) {
-    for (size_t c = 0; c < channels; ++c) {
-      ASSERT_GE(audio[i * channels + c], -bound);
-      ASSERT_LE(audio[i * channels + c], bound);
-    }
-  }
-}
-
-int OpusTest::EncodeDecode(WebRtcOpusEncInst* encoder,
-                           rtc::ArrayView<const int16_t> input_audio,
-                           WebRtcOpusDecInst* decoder,
-                           int16_t* output_audio,
-                           int16_t* audio_type) {
-  int encoded_bytes_int = WebRtcOpus_Encode(
-      encoder, input_audio.data(),
-      rtc::CheckedDivExact(input_audio.size(), channels_),
-      kMaxBytes, bitstream_);
-  EXPECT_GE(encoded_bytes_int, 0);
-  encoded_bytes_ = static_cast<size_t>(encoded_bytes_int);
-  int est_len = WebRtcOpus_DurationEst(decoder, bitstream_, encoded_bytes_);
-  int act_len = WebRtcOpus_Decode(decoder, bitstream_,
-                                  encoded_bytes_, output_audio,
-                                  audio_type);
-  EXPECT_EQ(est_len, act_len);
-  return act_len;
-}
-
-// Test if encoder/decoder can enter DTX mode properly and do not enter DTX when
-// they should not. This test is signal dependent.
-void OpusTest::TestDtxEffect(bool dtx, int block_length_ms) {
-  PrepareSpeechData(channels_, block_length_ms, 2000);
-  const size_t samples = kOpusRateKhz * block_length_ms;
-
-  // Create encoder memory.
-  EXPECT_EQ(0, WebRtcOpus_EncoderCreate(&opus_encoder_,
-                                        channels_,
-                                        application_));
-  EXPECT_EQ(0, WebRtcOpus_DecoderCreate(&opus_decoder_, channels_));
-
-  // Set bitrate.
-  EXPECT_EQ(0, WebRtcOpus_SetBitRate(opus_encoder_,
-                                     channels_ == 1 ? 32000 : 64000));
-
-  // Set input audio as silence.
-  std::vector<int16_t> silence(samples * channels_, 0);
-
-  // Setting DTX.
-  EXPECT_EQ(0, dtx ? WebRtcOpus_EnableDtx(opus_encoder_) :
-      WebRtcOpus_DisableDtx(opus_encoder_));
-
-  int16_t audio_type;
-  int16_t* output_data_decode = new int16_t[samples * channels_];
-
-  for (int i = 0; i < 100; ++i) {
-    EXPECT_EQ(samples,
-              static_cast<size_t>(EncodeDecode(
-                  opus_encoder_, speech_data_.GetNextBlock(), opus_decoder_,
-                  output_data_decode, &audio_type)));
-    // If not DTX, it should never enter DTX mode. If DTX, we do not care since
-    // whether it enters DTX depends on the signal type.
-    if (!dtx) {
-      EXPECT_GT(encoded_bytes_, 1U);
-      EXPECT_EQ(0, opus_encoder_->in_dtx_mode);
-      EXPECT_EQ(0, opus_decoder_->in_dtx_mode);
-      EXPECT_EQ(0, audio_type);  // Speech.
-    }
-  }
-
-  // We input some silent segments. In DTX mode, the encoder will stop sending.
-  // However, DTX may happen after a while.
-  for (int i = 0; i < 30; ++i) {
-    EXPECT_EQ(samples,
-              static_cast<size_t>(EncodeDecode(
-                  opus_encoder_, silence, opus_decoder_, output_data_decode,
-                  &audio_type)));
-    if (!dtx) {
-      EXPECT_GT(encoded_bytes_, 1U);
-      EXPECT_EQ(0, opus_encoder_->in_dtx_mode);
-      EXPECT_EQ(0, opus_decoder_->in_dtx_mode);
-      EXPECT_EQ(0, audio_type);  // Speech.
-    } else if (encoded_bytes_ == 1) {
-      EXPECT_EQ(1, opus_encoder_->in_dtx_mode);
-      EXPECT_EQ(1, opus_decoder_->in_dtx_mode);
-      EXPECT_EQ(2, audio_type);  // Comfort noise.
-      break;
-    }
-  }
-
-  // When Opus is in DTX, it wakes up in a regular basis. It sends two packets,
-  // one with an arbitrary size and the other of 1-byte, then stops sending for
-  // a certain number of frames.
-
-  // |max_dtx_frames| is the maximum number of frames Opus can stay in DTX.
-  const int max_dtx_frames = 400 / block_length_ms + 1;
-
-  // We run |kRunTimeMs| milliseconds of pure silence.
-  const int kRunTimeMs = 4500;
-
-  // We check that, after a |kCheckTimeMs| milliseconds (given that the CNG in
-  // Opus needs time to adapt), the absolute values of DTX decoded signal are
-  // bounded by |kOutputValueBound|.
-  const int kCheckTimeMs = 4000;
-
-#if defined(OPUS_FIXED_POINT)
-  // Fixed-point Opus generates a random (comfort) noise, which has a less
-  // predictable value bound than its floating-point Opus. This value depends on
-  // input signal, and the time window for checking the output values (between
-  // |kCheckTimeMs| and |kRunTimeMs|).
-  const uint16_t kOutputValueBound = 30;
-
-#else
-  const uint16_t kOutputValueBound = 2;
-#endif
-
-  int time = 0;
-  while (time < kRunTimeMs) {
-    // DTX mode is maintained for maximum |max_dtx_frames| frames.
-    int i = 0;
-    for (; i < max_dtx_frames; ++i) {
-      time += block_length_ms;
-      EXPECT_EQ(samples,
-                static_cast<size_t>(EncodeDecode(
-                    opus_encoder_, silence, opus_decoder_, output_data_decode,
-                    &audio_type)));
-      if (dtx) {
-        if (encoded_bytes_ > 1)
-          break;
-        EXPECT_EQ(0U, encoded_bytes_)  // Send 0 byte.
-            << "Opus should have entered DTX mode.";
-        EXPECT_EQ(1, opus_encoder_->in_dtx_mode);
-        EXPECT_EQ(1, opus_decoder_->in_dtx_mode);
-        EXPECT_EQ(2, audio_type);  // Comfort noise.
-        if (time >= kCheckTimeMs) {
-          CheckAudioBounded(output_data_decode, samples, channels_,
-                            kOutputValueBound);
-        }
-      } else {
-        EXPECT_GT(encoded_bytes_, 1U);
-        EXPECT_EQ(0, opus_encoder_->in_dtx_mode);
-        EXPECT_EQ(0, opus_decoder_->in_dtx_mode);
-        EXPECT_EQ(0, audio_type);  // Speech.
-      }
-    }
-
-    if (dtx) {
-      // With DTX, Opus must stop transmission for some time.
-      EXPECT_GT(i, 1);
-    }
-
-    // We expect a normal payload.
-    EXPECT_EQ(0, opus_encoder_->in_dtx_mode);
-    EXPECT_EQ(0, opus_decoder_->in_dtx_mode);
-    EXPECT_EQ(0, audio_type);  // Speech.
-
-    // Enters DTX again immediately.
-    time += block_length_ms;
-    EXPECT_EQ(samples,
-              static_cast<size_t>(EncodeDecode(
-                  opus_encoder_, silence, opus_decoder_, output_data_decode,
-                  &audio_type)));
-    if (dtx) {
-      EXPECT_EQ(1U, encoded_bytes_);  // Send 1 byte.
-      EXPECT_EQ(1, opus_encoder_->in_dtx_mode);
-      EXPECT_EQ(1, opus_decoder_->in_dtx_mode);
-      EXPECT_EQ(2, audio_type);  // Comfort noise.
-      if (time >= kCheckTimeMs) {
-        CheckAudioBounded(output_data_decode, samples, channels_,
-                          kOutputValueBound);
-      }
-    } else {
-      EXPECT_GT(encoded_bytes_, 1U);
-      EXPECT_EQ(0, opus_encoder_->in_dtx_mode);
-      EXPECT_EQ(0, opus_decoder_->in_dtx_mode);
-      EXPECT_EQ(0, audio_type);  // Speech.
-    }
-  }
-
-  silence[0] = 10000;
-  if (dtx) {
-    // Verify that encoder/decoder can jump out from DTX mode.
-    EXPECT_EQ(samples,
-              static_cast<size_t>(EncodeDecode(
-                  opus_encoder_, silence, opus_decoder_, output_data_decode,
-                  &audio_type)));
-    EXPECT_GT(encoded_bytes_, 1U);
-    EXPECT_EQ(0, opus_encoder_->in_dtx_mode);
-    EXPECT_EQ(0, opus_decoder_->in_dtx_mode);
-    EXPECT_EQ(0, audio_type);  // Speech.
-  }
-
-  // Free memory.
-  delete[] output_data_decode;
-  EXPECT_EQ(0, WebRtcOpus_EncoderFree(opus_encoder_));
-  EXPECT_EQ(0, WebRtcOpus_DecoderFree(opus_decoder_));
-}
-
-// Test if CBR does what we expect.
-void OpusTest::TestCbrEffect(bool cbr, int block_length_ms) {
-  PrepareSpeechData(channels_, block_length_ms, 2000);
-  const size_t samples = kOpusRateKhz * block_length_ms;
-
-  int32_t max_pkt_size_diff = 0;
-  int32_t prev_pkt_size = 0;
-
-  // Create encoder memory.
-  EXPECT_EQ(0,
-            WebRtcOpus_EncoderCreate(&opus_encoder_, channels_, application_));
-  EXPECT_EQ(0, WebRtcOpus_DecoderCreate(&opus_decoder_, channels_));
-
-  // Set bitrate.
-  EXPECT_EQ(
-      0, WebRtcOpus_SetBitRate(opus_encoder_, channels_ == 1 ? 32000 : 64000));
-
-  // Setting CBR.
-  EXPECT_EQ(0, cbr ? WebRtcOpus_EnableCbr(opus_encoder_)
-                   : WebRtcOpus_DisableCbr(opus_encoder_));
-
-  int16_t audio_type;
-  std::vector<int16_t> audio_out(samples * channels_);
-  for (int i = 0; i < 100; ++i) {
-    EXPECT_EQ(samples, static_cast<size_t>(EncodeDecode(
-                           opus_encoder_, speech_data_.GetNextBlock(),
-                           opus_decoder_, audio_out.data(), &audio_type)));
-
-    if (prev_pkt_size > 0) {
-      int32_t diff = std::abs((int32_t)encoded_bytes_ - prev_pkt_size);
-      max_pkt_size_diff = std::max(max_pkt_size_diff, diff);
-    }
-    prev_pkt_size = encoded_bytes_;
-  }
-
-  if (cbr) {
-    EXPECT_EQ(max_pkt_size_diff, 0);
-  } else {
-    EXPECT_GT(max_pkt_size_diff, 0);
-  }
-
-  // Free memory.
-  EXPECT_EQ(0, WebRtcOpus_EncoderFree(opus_encoder_));
-  EXPECT_EQ(0, WebRtcOpus_DecoderFree(opus_decoder_));
-}
-
-// Test failing Create.
-TEST(OpusTest, OpusCreateFail) {
-  WebRtcOpusEncInst* opus_encoder;
-  WebRtcOpusDecInst* opus_decoder;
-
-  // Test to see that an invalid pointer is caught.
-  EXPECT_EQ(-1, WebRtcOpus_EncoderCreate(NULL, 1, 0));
-  // Invalid channel number.
-  EXPECT_EQ(-1, WebRtcOpus_EncoderCreate(&opus_encoder, 3, 0));
-  // Invalid applciation mode.
-  EXPECT_EQ(-1, WebRtcOpus_EncoderCreate(&opus_encoder, 1, 2));
-
-  EXPECT_EQ(-1, WebRtcOpus_DecoderCreate(NULL, 1));
-  // Invalid channel number.
-  EXPECT_EQ(-1, WebRtcOpus_DecoderCreate(&opus_decoder, 3));
-}
-
-// Test failing Free.
-TEST(OpusTest, OpusFreeFail) {
-  // Test to see that an invalid pointer is caught.
-  EXPECT_EQ(-1, WebRtcOpus_EncoderFree(NULL));
-  EXPECT_EQ(-1, WebRtcOpus_DecoderFree(NULL));
-}
-
-// Test normal Create and Free.
-TEST_P(OpusTest, OpusCreateFree) {
-  EXPECT_EQ(0, WebRtcOpus_EncoderCreate(&opus_encoder_,
-                                        channels_,
-                                        application_));
-  EXPECT_EQ(0, WebRtcOpus_DecoderCreate(&opus_decoder_, channels_));
-  EXPECT_TRUE(opus_encoder_ != NULL);
-  EXPECT_TRUE(opus_decoder_ != NULL);
-  // Free encoder and decoder memory.
-  EXPECT_EQ(0, WebRtcOpus_EncoderFree(opus_encoder_));
-  EXPECT_EQ(0, WebRtcOpus_DecoderFree(opus_decoder_));
-}
-
-TEST_P(OpusTest, OpusEncodeDecode) {
-  PrepareSpeechData(channels_, 20, 20);
-
-  // Create encoder memory.
-  EXPECT_EQ(0, WebRtcOpus_EncoderCreate(&opus_encoder_,
-                                        channels_,
-                                        application_));
-  EXPECT_EQ(0, WebRtcOpus_DecoderCreate(&opus_decoder_,
-                                        channels_));
-
-  // Set bitrate.
-  EXPECT_EQ(0, WebRtcOpus_SetBitRate(opus_encoder_,
-                                     channels_ == 1 ? 32000 : 64000));
-
-  // Check number of channels for decoder.
-  EXPECT_EQ(channels_, WebRtcOpus_DecoderChannels(opus_decoder_));
-
-  // Check application mode.
-  opus_int32 app;
-  opus_encoder_ctl(opus_encoder_->encoder,
-                   OPUS_GET_APPLICATION(&app));
-  EXPECT_EQ(application_ == 0 ? OPUS_APPLICATION_VOIP : OPUS_APPLICATION_AUDIO,
-            app);
-
-  // Encode & decode.
-  int16_t audio_type;
-  int16_t* output_data_decode = new int16_t[kOpus20msFrameSamples * channels_];
-  EXPECT_EQ(kOpus20msFrameSamples,
-            static_cast<size_t>(
-                EncodeDecode(opus_encoder_, speech_data_.GetNextBlock(),
-                             opus_decoder_, output_data_decode, &audio_type)));
-
-  // Free memory.
-  delete[] output_data_decode;
-  EXPECT_EQ(0, WebRtcOpus_EncoderFree(opus_encoder_));
-  EXPECT_EQ(0, WebRtcOpus_DecoderFree(opus_decoder_));
-}
-
-TEST_P(OpusTest, OpusSetBitRate) {
-  // Test without creating encoder memory.
-  EXPECT_EQ(-1, WebRtcOpus_SetBitRate(opus_encoder_, 60000));
-
-  // Create encoder memory, try with different bitrates.
-  EXPECT_EQ(0, WebRtcOpus_EncoderCreate(&opus_encoder_,
-                                        channels_,
-                                        application_));
-  EXPECT_EQ(0, WebRtcOpus_SetBitRate(opus_encoder_, 30000));
-  EXPECT_EQ(0, WebRtcOpus_SetBitRate(opus_encoder_, 60000));
-  EXPECT_EQ(0, WebRtcOpus_SetBitRate(opus_encoder_, 300000));
-  EXPECT_EQ(0, WebRtcOpus_SetBitRate(opus_encoder_, 600000));
-
-  // Free memory.
-  EXPECT_EQ(0, WebRtcOpus_EncoderFree(opus_encoder_));
-}
-
-TEST_P(OpusTest, OpusSetComplexity) {
-  // Test without creating encoder memory.
-  EXPECT_EQ(-1, WebRtcOpus_SetComplexity(opus_encoder_, 9));
-
-  // Create encoder memory, try with different complexities.
-  EXPECT_EQ(0, WebRtcOpus_EncoderCreate(&opus_encoder_,
-                                        channels_,
-                                        application_));
-
-  EXPECT_EQ(0, WebRtcOpus_SetComplexity(opus_encoder_, 0));
-  EXPECT_EQ(0, WebRtcOpus_SetComplexity(opus_encoder_, 10));
-  EXPECT_EQ(-1, WebRtcOpus_SetComplexity(opus_encoder_, 11));
-
-  // Free memory.
-  EXPECT_EQ(0, WebRtcOpus_EncoderFree(opus_encoder_));
-}
-
-TEST_P(OpusTest, OpusForceChannels) {
-  // Test without creating encoder memory.
-  EXPECT_EQ(-1, WebRtcOpus_SetForceChannels(opus_encoder_, 1));
-
-  ASSERT_EQ(0,
-            WebRtcOpus_EncoderCreate(&opus_encoder_, channels_, application_));
-
-  if (channels_ == 2) {
-    EXPECT_EQ(-1, WebRtcOpus_SetForceChannels(opus_encoder_, 3));
-    EXPECT_EQ(0, WebRtcOpus_SetForceChannels(opus_encoder_, 2));
-    EXPECT_EQ(0, WebRtcOpus_SetForceChannels(opus_encoder_, 1));
-    EXPECT_EQ(0, WebRtcOpus_SetForceChannels(opus_encoder_, 0));
-  } else {
-    EXPECT_EQ(-1, WebRtcOpus_SetForceChannels(opus_encoder_, 2));
-    EXPECT_EQ(0, WebRtcOpus_SetForceChannels(opus_encoder_, 1));
-    EXPECT_EQ(0, WebRtcOpus_SetForceChannels(opus_encoder_, 0));
-  }
-
-  EXPECT_EQ(0, WebRtcOpus_EncoderFree(opus_encoder_));
-}
-
-// Encode and decode one frame, initialize the decoder and
-// decode once more.
-TEST_P(OpusTest, OpusDecodeInit) {
-  PrepareSpeechData(channels_, 20, 20);
-
-  // Create encoder memory.
-  EXPECT_EQ(0, WebRtcOpus_EncoderCreate(&opus_encoder_,
-                                        channels_,
-                                        application_));
-  EXPECT_EQ(0, WebRtcOpus_DecoderCreate(&opus_decoder_, channels_));
-
-  // Encode & decode.
-  int16_t audio_type;
-  int16_t* output_data_decode = new int16_t[kOpus20msFrameSamples * channels_];
-  EXPECT_EQ(kOpus20msFrameSamples,
-            static_cast<size_t>(
-                EncodeDecode(opus_encoder_, speech_data_.GetNextBlock(),
-                             opus_decoder_, output_data_decode, &audio_type)));
-
-  WebRtcOpus_DecoderInit(opus_decoder_);
-
-  EXPECT_EQ(kOpus20msFrameSamples,
-            static_cast<size_t>(WebRtcOpus_Decode(
-                opus_decoder_, bitstream_, encoded_bytes_, output_data_decode,
-                &audio_type)));
-
-  // Free memory.
-  delete[] output_data_decode;
-  EXPECT_EQ(0, WebRtcOpus_EncoderFree(opus_encoder_));
-  EXPECT_EQ(0, WebRtcOpus_DecoderFree(opus_decoder_));
-}
-
-TEST_P(OpusTest, OpusEnableDisableFec) {
-  // Test without creating encoder memory.
-  EXPECT_EQ(-1, WebRtcOpus_EnableFec(opus_encoder_));
-  EXPECT_EQ(-1, WebRtcOpus_DisableFec(opus_encoder_));
-
-  // Create encoder memory.
-  EXPECT_EQ(0, WebRtcOpus_EncoderCreate(&opus_encoder_,
-                                        channels_,
-                                        application_));
-
-  EXPECT_EQ(0, WebRtcOpus_EnableFec(opus_encoder_));
-  EXPECT_EQ(0, WebRtcOpus_DisableFec(opus_encoder_));
-
-  // Free memory.
-  EXPECT_EQ(0, WebRtcOpus_EncoderFree(opus_encoder_));
-}
-
-TEST_P(OpusTest, OpusEnableDisableDtx) {
-  // Test without creating encoder memory.
-  EXPECT_EQ(-1, WebRtcOpus_EnableDtx(opus_encoder_));
-  EXPECT_EQ(-1, WebRtcOpus_DisableDtx(opus_encoder_));
-
-  // Create encoder memory.
-  EXPECT_EQ(0, WebRtcOpus_EncoderCreate(&opus_encoder_,
-                                        channels_,
-                                        application_));
-
-  opus_int32 dtx;
-
-  // DTX is off by default.
-  opus_encoder_ctl(opus_encoder_->encoder,
-                   OPUS_GET_DTX(&dtx));
-  EXPECT_EQ(0, dtx);
-
-  // Test to enable DTX.
-  EXPECT_EQ(0, WebRtcOpus_EnableDtx(opus_encoder_));
-  opus_encoder_ctl(opus_encoder_->encoder,
-                   OPUS_GET_DTX(&dtx));
-  EXPECT_EQ(1, dtx);
-
-  // Test to disable DTX.
-  EXPECT_EQ(0, WebRtcOpus_DisableDtx(opus_encoder_));
-  opus_encoder_ctl(opus_encoder_->encoder,
-                   OPUS_GET_DTX(&dtx));
-  EXPECT_EQ(0, dtx);
-
-
-  // Free memory.
-  EXPECT_EQ(0, WebRtcOpus_EncoderFree(opus_encoder_));
-}
-
-TEST_P(OpusTest, OpusDtxOff) {
-  TestDtxEffect(false, 10);
-  TestDtxEffect(false, 20);
-  TestDtxEffect(false, 40);
-}
-
-TEST_P(OpusTest, OpusDtxOn) {
-  TestDtxEffect(true, 10);
-  TestDtxEffect(true, 20);
-  TestDtxEffect(true, 40);
-}
-
-TEST_P(OpusTest, OpusCbrOff) {
-  TestCbrEffect(false, 10);
-  TestCbrEffect(false, 20);
-  TestCbrEffect(false, 40);
-}
-
-TEST_P(OpusTest, OpusCbrOn) {
-  TestCbrEffect(true, 10);
-  TestCbrEffect(true, 20);
-  TestCbrEffect(true, 40);
-}
-
-TEST_P(OpusTest, OpusSetPacketLossRate) {
-  // Test without creating encoder memory.
-  EXPECT_EQ(-1, WebRtcOpus_SetPacketLossRate(opus_encoder_, 50));
-
-  // Create encoder memory.
-  EXPECT_EQ(0, WebRtcOpus_EncoderCreate(&opus_encoder_,
-                                        channels_,
-                                        application_));
-
-  EXPECT_EQ(0, WebRtcOpus_SetPacketLossRate(opus_encoder_, 50));
-  EXPECT_EQ(-1, WebRtcOpus_SetPacketLossRate(opus_encoder_, -1));
-  EXPECT_EQ(-1, WebRtcOpus_SetPacketLossRate(opus_encoder_, 101));
-
-  // Free memory.
-  EXPECT_EQ(0, WebRtcOpus_EncoderFree(opus_encoder_));
-}
-
-TEST_P(OpusTest, OpusSetMaxPlaybackRate) {
-  // Test without creating encoder memory.
-  EXPECT_EQ(-1, WebRtcOpus_SetMaxPlaybackRate(opus_encoder_, 20000));
-
-  // Create encoder memory.
-  EXPECT_EQ(0, WebRtcOpus_EncoderCreate(&opus_encoder_,
-                                        channels_,
-                                        application_));
-
-  SetMaxPlaybackRate(opus_encoder_, OPUS_BANDWIDTH_FULLBAND, 48000);
-  SetMaxPlaybackRate(opus_encoder_, OPUS_BANDWIDTH_FULLBAND, 24001);
-  SetMaxPlaybackRate(opus_encoder_, OPUS_BANDWIDTH_SUPERWIDEBAND, 24000);
-  SetMaxPlaybackRate(opus_encoder_, OPUS_BANDWIDTH_SUPERWIDEBAND, 16001);
-  SetMaxPlaybackRate(opus_encoder_, OPUS_BANDWIDTH_WIDEBAND, 16000);
-  SetMaxPlaybackRate(opus_encoder_, OPUS_BANDWIDTH_WIDEBAND, 12001);
-  SetMaxPlaybackRate(opus_encoder_, OPUS_BANDWIDTH_MEDIUMBAND, 12000);
-  SetMaxPlaybackRate(opus_encoder_, OPUS_BANDWIDTH_MEDIUMBAND, 8001);
-  SetMaxPlaybackRate(opus_encoder_, OPUS_BANDWIDTH_NARROWBAND, 8000);
-  SetMaxPlaybackRate(opus_encoder_, OPUS_BANDWIDTH_NARROWBAND, 4000);
-
-  // Free memory.
-  EXPECT_EQ(0, WebRtcOpus_EncoderFree(opus_encoder_));
-}
-
-// Test PLC.
-TEST_P(OpusTest, OpusDecodePlc) {
-  PrepareSpeechData(channels_, 20, 20);
-
-  // Create encoder memory.
-  EXPECT_EQ(0, WebRtcOpus_EncoderCreate(&opus_encoder_,
-                                        channels_,
-                                        application_));
-  EXPECT_EQ(0, WebRtcOpus_DecoderCreate(&opus_decoder_, channels_));
-
-  // Set bitrate.
-  EXPECT_EQ(0, WebRtcOpus_SetBitRate(opus_encoder_,
-                                     channels_== 1 ? 32000 : 64000));
-
-  // Check number of channels for decoder.
-  EXPECT_EQ(channels_, WebRtcOpus_DecoderChannels(opus_decoder_));
-
-  // Encode & decode.
-  int16_t audio_type;
-  int16_t* output_data_decode = new int16_t[kOpus20msFrameSamples * channels_];
-  EXPECT_EQ(kOpus20msFrameSamples,
-            static_cast<size_t>(
-                EncodeDecode(opus_encoder_, speech_data_.GetNextBlock(),
-                             opus_decoder_, output_data_decode, &audio_type)));
-
-  // Call decoder PLC.
-  int16_t* plc_buffer = new int16_t[kOpus20msFrameSamples * channels_];
-  EXPECT_EQ(kOpus20msFrameSamples,
-            static_cast<size_t>(WebRtcOpus_DecodePlc(
-                opus_decoder_, plc_buffer, 1)));
-
-  // Free memory.
-  delete[] plc_buffer;
-  delete[] output_data_decode;
-  EXPECT_EQ(0, WebRtcOpus_EncoderFree(opus_encoder_));
-  EXPECT_EQ(0, WebRtcOpus_DecoderFree(opus_decoder_));
-}
-
-// Duration estimation.
-TEST_P(OpusTest, OpusDurationEstimation) {
-  PrepareSpeechData(channels_, 20, 20);
-
-  // Create.
-  EXPECT_EQ(0, WebRtcOpus_EncoderCreate(&opus_encoder_,
-                                        channels_,
-                                        application_));
-  EXPECT_EQ(0, WebRtcOpus_DecoderCreate(&opus_decoder_, channels_));
-
-  // 10 ms. We use only first 10 ms of a 20 ms block.
-  auto speech_block = speech_data_.GetNextBlock();
-  int encoded_bytes_int = WebRtcOpus_Encode(
-      opus_encoder_, speech_block.data(),
-      rtc::CheckedDivExact(speech_block.size(), 2 * channels_),
-      kMaxBytes, bitstream_);
-  EXPECT_GE(encoded_bytes_int, 0);
-  EXPECT_EQ(kOpus10msFrameSamples,
-            static_cast<size_t>(WebRtcOpus_DurationEst(
-                opus_decoder_, bitstream_,
-                static_cast<size_t>(encoded_bytes_int))));
-
-  // 20 ms
-  speech_block = speech_data_.GetNextBlock();
-  encoded_bytes_int = WebRtcOpus_Encode(
-      opus_encoder_, speech_block.data(),
-      rtc::CheckedDivExact(speech_block.size(), channels_),
-      kMaxBytes, bitstream_);
-  EXPECT_GE(encoded_bytes_int, 0);
-  EXPECT_EQ(kOpus20msFrameSamples,
-            static_cast<size_t>(WebRtcOpus_DurationEst(
-                opus_decoder_, bitstream_,
-                static_cast<size_t>(encoded_bytes_int))));
-
-  // Free memory.
-  EXPECT_EQ(0, WebRtcOpus_EncoderFree(opus_encoder_));
-  EXPECT_EQ(0, WebRtcOpus_DecoderFree(opus_decoder_));
-}
-
-TEST_P(OpusTest, OpusDecodeRepacketized) {
-  constexpr size_t kPackets = 6;
-
-  PrepareSpeechData(channels_, 20, 20 * kPackets);
-
-  // Create encoder memory.
-  ASSERT_EQ(0, WebRtcOpus_EncoderCreate(&opus_encoder_,
-                                        channels_,
-                                        application_));
-  ASSERT_EQ(0, WebRtcOpus_DecoderCreate(&opus_decoder_,
-                                        channels_));
-
-  // Set bitrate.
-  EXPECT_EQ(0, WebRtcOpus_SetBitRate(opus_encoder_,
-                                     channels_ == 1 ? 32000 : 64000));
-
-  // Check number of channels for decoder.
-  EXPECT_EQ(channels_, WebRtcOpus_DecoderChannels(opus_decoder_));
-
-  // Encode & decode.
-  int16_t audio_type;
-  std::unique_ptr<int16_t[]> output_data_decode(
-      new int16_t[kPackets * kOpus20msFrameSamples * channels_]);
-  OpusRepacketizer* rp = opus_repacketizer_create();
-
-  size_t num_packets = 0;
-  constexpr size_t kMaxCycles = 100;
-  for (size_t idx = 0; idx < kMaxCycles; ++idx) {
-    auto speech_block = speech_data_.GetNextBlock();
-    encoded_bytes_ =
-        WebRtcOpus_Encode(opus_encoder_, speech_block.data(),
-                          rtc::CheckedDivExact(speech_block.size(), channels_),
-                          kMaxBytes, bitstream_);
-    if (opus_repacketizer_cat(rp, bitstream_, encoded_bytes_) == OPUS_OK) {
-      ++num_packets;
-      if (num_packets == kPackets) {
-        break;
-      }
-    } else {
-      // Opus repacketizer cannot guarantee a success. We try again if it fails.
-      opus_repacketizer_init(rp);
-      num_packets = 0;
-    }
-  }
-  EXPECT_EQ(kPackets, num_packets);
-
-  encoded_bytes_ = opus_repacketizer_out(rp, bitstream_, kMaxBytes);
-
-  EXPECT_EQ(kOpus20msFrameSamples * kPackets,
-            static_cast<size_t>(WebRtcOpus_DurationEst(
-                opus_decoder_, bitstream_, encoded_bytes_)));
-
-  EXPECT_EQ(kOpus20msFrameSamples * kPackets,
-            static_cast<size_t>(WebRtcOpus_Decode(
-                opus_decoder_, bitstream_, encoded_bytes_,
-                output_data_decode.get(), &audio_type)));
-
-  // Free memory.
-  opus_repacketizer_destroy(rp);
-  EXPECT_EQ(0, WebRtcOpus_EncoderFree(opus_encoder_));
-  EXPECT_EQ(0, WebRtcOpus_DecoderFree(opus_decoder_));
-}
-
-INSTANTIATE_TEST_CASE_P(VariousMode,
-                        OpusTest,
-                        Combine(Values(1, 2), Values(0, 1)));
-
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/codecs/pcm16b/audio_decoder_pcm16b.cc b/modules/audio_coding/codecs/pcm16b/audio_decoder_pcm16b.cc
deleted file mode 100644
index 57724a3..0000000
--- a/modules/audio_coding/codecs/pcm16b/audio_decoder_pcm16b.cc
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- *  Copyright (c) 2015 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/codecs/pcm16b/audio_decoder_pcm16b.h"
-
-#include "webrtc/modules/audio_coding/codecs/legacy_encoded_audio_frame.h"
-#include "webrtc/modules/audio_coding/codecs/pcm16b/pcm16b.h"
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-
-AudioDecoderPcm16B::AudioDecoderPcm16B(int sample_rate_hz, size_t num_channels)
-    : sample_rate_hz_(sample_rate_hz), num_channels_(num_channels) {
-  RTC_DCHECK(sample_rate_hz == 8000 || sample_rate_hz == 16000 ||
-             sample_rate_hz == 32000 || sample_rate_hz == 48000)
-      << "Unsupported sample rate " << sample_rate_hz;
-  RTC_DCHECK_GE(num_channels, 1);
-}
-
-void AudioDecoderPcm16B::Reset() {}
-
-int AudioDecoderPcm16B::SampleRateHz() const {
-  return sample_rate_hz_;
-}
-
-size_t AudioDecoderPcm16B::Channels() const {
-  return num_channels_;
-}
-
-int AudioDecoderPcm16B::DecodeInternal(const uint8_t* encoded,
-                                       size_t encoded_len,
-                                       int sample_rate_hz,
-                                       int16_t* decoded,
-                                       SpeechType* speech_type) {
-  RTC_DCHECK_EQ(sample_rate_hz_, sample_rate_hz);
-  size_t ret = WebRtcPcm16b_Decode(encoded, encoded_len, decoded);
-  *speech_type = ConvertSpeechType(1);
-  return static_cast<int>(ret);
-}
-
-std::vector<AudioDecoder::ParseResult> AudioDecoderPcm16B::ParsePayload(
-    rtc::Buffer&& payload,
-    uint32_t timestamp) {
-  const int samples_per_ms = rtc::CheckedDivExact(sample_rate_hz_, 1000);
-  return LegacyEncodedAudioFrame::SplitBySamples(
-      this, std::move(payload), timestamp, samples_per_ms * 2 * num_channels_,
-      samples_per_ms);
-}
-
-int AudioDecoderPcm16B::PacketDuration(const uint8_t* encoded,
-                                       size_t encoded_len) const {
-  // Two encoded byte per sample per channel.
-  return static_cast<int>(encoded_len / (2 * Channels()));
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/codecs/pcm16b/audio_decoder_pcm16b.h b/modules/audio_coding/codecs/pcm16b/audio_decoder_pcm16b.h
deleted file mode 100644
index 46dfbb2..0000000
--- a/modules/audio_coding/codecs/pcm16b/audio_decoder_pcm16b.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- *  Copyright (c) 2015 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_CODECS_PCM16B_AUDIO_DECODER_PCM16B_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_PCM16B_AUDIO_DECODER_PCM16B_H_
-
-#include "webrtc/api/audio_codecs/audio_decoder.h"
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace webrtc {
-
-class AudioDecoderPcm16B final : public AudioDecoder {
- public:
-  AudioDecoderPcm16B(int sample_rate_hz, size_t num_channels);
-  void Reset() override;
-  std::vector<ParseResult> ParsePayload(rtc::Buffer&& payload,
-                                        uint32_t timestamp) override;
-  int PacketDuration(const uint8_t* encoded, size_t encoded_len) const override;
-  int SampleRateHz() const override;
-  size_t Channels() const override;
-
- protected:
-  int DecodeInternal(const uint8_t* encoded,
-                     size_t encoded_len,
-                     int sample_rate_hz,
-                     int16_t* decoded,
-                     SpeechType* speech_type) override;
-
- private:
-  const int sample_rate_hz_;
-  const size_t num_channels_;
-  RTC_DISALLOW_COPY_AND_ASSIGN(AudioDecoderPcm16B);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_CODING_CODECS_PCM16B_AUDIO_DECODER_PCM16B_H_
diff --git a/modules/audio_coding/codecs/pcm16b/audio_encoder_pcm16b.cc b/modules/audio_coding/codecs/pcm16b/audio_encoder_pcm16b.cc
deleted file mode 100644
index 7b4a919..0000000
--- a/modules/audio_coding/codecs/pcm16b/audio_encoder_pcm16b.cc
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- *  Copyright (c) 2014 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/codecs/pcm16b/audio_encoder_pcm16b.h"
-
-#include <algorithm>
-
-#include "webrtc/common_types.h"
-#include "webrtc/modules/audio_coding/codecs/pcm16b/pcm16b.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/safe_conversions.h"
-
-namespace webrtc {
-
-size_t AudioEncoderPcm16B::EncodeCall(const int16_t* audio,
-                                      size_t input_len,
-                                      uint8_t* encoded) {
-  return WebRtcPcm16b_Encode(audio, input_len, encoded);
-}
-
-size_t AudioEncoderPcm16B::BytesPerSample() const {
-  return 2;
-}
-
-AudioEncoder::CodecType AudioEncoderPcm16B::GetCodecType() const {
-  return CodecType::kOther;
-}
-
-namespace {
-
-AudioEncoderPcm16B::Config CreateConfig(const CodecInst& codec_inst) {
-  AudioEncoderPcm16B::Config config;
-  config.num_channels = codec_inst.channels;
-  config.sample_rate_hz = codec_inst.plfreq;
-  config.frame_size_ms = rtc::CheckedDivExact(
-      codec_inst.pacsize, rtc::CheckedDivExact(config.sample_rate_hz, 1000));
-  config.payload_type = codec_inst.pltype;
-  return config;
-}
-
-}  // namespace
-
-bool AudioEncoderPcm16B::Config::IsOk() const {
-  if ((sample_rate_hz != 8000) && (sample_rate_hz != 16000) &&
-      (sample_rate_hz != 32000) && (sample_rate_hz != 48000))
-    return false;
-  return AudioEncoderPcm::Config::IsOk();
-}
-
-AudioEncoderPcm16B::AudioEncoderPcm16B(const CodecInst& codec_inst)
-    : AudioEncoderPcm16B(CreateConfig(codec_inst)) {}
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/codecs/pcm16b/audio_encoder_pcm16b.h b/modules/audio_coding/codecs/pcm16b/audio_encoder_pcm16b.h
deleted file mode 100644
index 25d548c..0000000
--- a/modules/audio_coding/codecs/pcm16b/audio_encoder_pcm16b.h
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- *  Copyright (c) 2014 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_CODECS_PCM16B_AUDIO_ENCODER_PCM16B_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_PCM16B_AUDIO_ENCODER_PCM16B_H_
-
-#include "webrtc/modules/audio_coding/codecs/g711/audio_encoder_pcm.h"
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace webrtc {
-
-struct CodecInst;
-
-class AudioEncoderPcm16B final : public AudioEncoderPcm {
- public:
-  struct Config : public AudioEncoderPcm::Config {
-   public:
-    Config() : AudioEncoderPcm::Config(107), sample_rate_hz(8000) {}
-    bool IsOk() const;
-
-    int sample_rate_hz;
-  };
-
-  explicit AudioEncoderPcm16B(const Config& config)
-      : AudioEncoderPcm(config, config.sample_rate_hz) {}
-  explicit AudioEncoderPcm16B(const CodecInst& codec_inst);
-
- protected:
-  size_t EncodeCall(const int16_t* audio,
-                    size_t input_len,
-                    uint8_t* encoded) override;
-
-  size_t BytesPerSample() const override;
-
-  AudioEncoder::CodecType GetCodecType() const override;
-
- private:
-  RTC_DISALLOW_COPY_AND_ASSIGN(AudioEncoderPcm16B);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_CODING_CODECS_PCM16B_AUDIO_ENCODER_PCM16B_H_
diff --git a/modules/audio_coding/codecs/pcm16b/pcm16b.c b/modules/audio_coding/codecs/pcm16b/pcm16b.c
deleted file mode 100644
index 120c790..0000000
--- a/modules/audio_coding/codecs/pcm16b/pcm16b.c
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- *  Copyright (c) 2011 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 "pcm16b.h"
-
-#include "webrtc/typedefs.h"
-
-size_t WebRtcPcm16b_Encode(const int16_t* speech,
-                           size_t len,
-                           uint8_t* encoded) {
-  size_t i;
-  for (i = 0; i < len; ++i) {
-    uint16_t s = speech[i];
-    encoded[2 * i] = s >> 8;
-    encoded[2 * i + 1] = s;
-  }
-  return 2 * len;
-}
-
-size_t WebRtcPcm16b_Decode(const uint8_t* encoded,
-                           size_t len,
-                           int16_t* speech) {
-  size_t i;
-  for (i = 0; i < len / 2; ++i)
-    speech[i] = encoded[2 * i] << 8 | encoded[2 * i + 1];
-  return len / 2;
-}
diff --git a/modules/audio_coding/codecs/pcm16b/pcm16b.h b/modules/audio_coding/codecs/pcm16b/pcm16b.h
deleted file mode 100644
index f96e741..0000000
--- a/modules/audio_coding/codecs/pcm16b/pcm16b.h
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- *  Copyright (c) 2011 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_CODECS_PCM16B_PCM16B_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_PCM16B_PCM16B_H_
-/*
- * Define the fixpoint numeric formats
- */
-
-#include <stddef.h>
-
-#include "webrtc/typedefs.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/****************************************************************************
- * WebRtcPcm16b_Encode(...)
- *
- * "Encode" a sample vector to 16 bit linear (Encoded standard is big endian)
- *
- * Input:
- *              - speech        : Input speech vector
- *              - len           : Number of samples in speech vector
- *
- * Output:
- *              - encoded       : Encoded data vector (big endian 16 bit)
- *
- * Returned value               : Length (in bytes) of coded data.
- *                                Always equal to twice the len input parameter.
- */
-
-size_t WebRtcPcm16b_Encode(const int16_t* speech,
-                           size_t len,
-                           uint8_t* encoded);
-
-/****************************************************************************
- * WebRtcPcm16b_Decode(...)
- *
- * "Decode" a vector to 16 bit linear (Encoded standard is big endian)
- *
- * Input:
- *              - encoded       : Encoded data vector (big endian 16 bit)
- *              - len           : Number of bytes in encoded
- *
- * Output:
- *              - speech        : Decoded speech vector
- *
- * Returned value               : Samples in speech
- */
-
-size_t WebRtcPcm16b_Decode(const uint8_t* encoded,
-                           size_t len,
-                           int16_t* speech);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* WEBRTC_MODULES_AUDIO_CODING_CODECS_PCM16B_PCM16B_H_ */
diff --git a/modules/audio_coding/codecs/pcm16b/pcm16b_common.cc b/modules/audio_coding/codecs/pcm16b/pcm16b_common.cc
deleted file mode 100644
index 36015e7..0000000
--- a/modules/audio_coding/codecs/pcm16b/pcm16b_common.cc
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- *  Copyright (c) 2017 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/codecs/pcm16b/pcm16b_common.h"
-
-namespace webrtc {
-
-void Pcm16BAppendSupportedCodecSpecs(std::vector<AudioCodecSpec>* specs) {
-  for (uint8_t num_channels : {1, 2}) {
-    for (int sample_rate_hz : {8000, 16000, 32000}) {
-      specs->push_back(
-          {{"L16", sample_rate_hz, num_channels},
-           {sample_rate_hz, num_channels, sample_rate_hz * num_channels * 16}});
-    }
-  }
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/codecs/pcm16b/pcm16b_common.h b/modules/audio_coding/codecs/pcm16b/pcm16b_common.h
deleted file mode 100644
index 5d764c9..0000000
--- a/modules/audio_coding/codecs/pcm16b/pcm16b_common.h
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- *  Copyright (c) 2017 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_CODECS_PCM16B_PCM16B_COMMON_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_PCM16B_PCM16B_COMMON_H_
-
-#include <vector>
-
-#include "webrtc/api/audio_codecs/audio_decoder_factory.h"
-
-namespace webrtc {
-void Pcm16BAppendSupportedCodecSpecs(std::vector<AudioCodecSpec>* specs);
-}
-
-#endif  // WEBRTC_MODULES_AUDIO_CODING_CODECS_PCM16B_PCM16B_COMMON_H_
diff --git a/modules/audio_coding/codecs/red/audio_encoder_copy_red.cc b/modules/audio_coding/codecs/red/audio_encoder_copy_red.cc
deleted file mode 100644
index 3680ff0..0000000
--- a/modules/audio_coding/codecs/red/audio_encoder_copy_red.cc
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- *  Copyright (c) 2014 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/codecs/red/audio_encoder_copy_red.h"
-
-#include <string.h>
-
-#include <utility>
-
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-
-AudioEncoderCopyRed::Config::Config() = default;
-AudioEncoderCopyRed::Config::Config(Config&&) = default;
-AudioEncoderCopyRed::Config::~Config() = default;
-
-AudioEncoderCopyRed::AudioEncoderCopyRed(Config&& config)
-    : speech_encoder_(std::move(config.speech_encoder)),
-      red_payload_type_(config.payload_type) {
-  RTC_CHECK(speech_encoder_) << "Speech encoder not provided.";
-}
-
-AudioEncoderCopyRed::~AudioEncoderCopyRed() = default;
-
-int AudioEncoderCopyRed::SampleRateHz() const {
-  return speech_encoder_->SampleRateHz();
-}
-
-size_t AudioEncoderCopyRed::NumChannels() const {
-  return speech_encoder_->NumChannels();
-}
-
-int AudioEncoderCopyRed::RtpTimestampRateHz() const {
-  return speech_encoder_->RtpTimestampRateHz();
-}
-
-size_t AudioEncoderCopyRed::Num10MsFramesInNextPacket() const {
-  return speech_encoder_->Num10MsFramesInNextPacket();
-}
-
-size_t AudioEncoderCopyRed::Max10MsFramesInAPacket() const {
-  return speech_encoder_->Max10MsFramesInAPacket();
-}
-
-int AudioEncoderCopyRed::GetTargetBitrate() const {
-  return speech_encoder_->GetTargetBitrate();
-}
-
-AudioEncoder::EncodedInfo AudioEncoderCopyRed::EncodeImpl(
-    uint32_t rtp_timestamp,
-    rtc::ArrayView<const int16_t> audio,
-    rtc::Buffer* encoded) {
-
-  const size_t primary_offset = encoded->size();
-  EncodedInfo info =
-      speech_encoder_->Encode(rtp_timestamp, audio, encoded);
-
-  RTC_CHECK(info.redundant.empty()) << "Cannot use nested redundant encoders.";
-  RTC_DCHECK_EQ(encoded->size() - primary_offset, info.encoded_bytes);
-
-  if (info.encoded_bytes > 0) {
-    // |info| will be implicitly cast to an EncodedInfoLeaf struct, effectively
-    // discarding the (empty) vector of redundant information. This is
-    // intentional.
-    info.redundant.push_back(info);
-    RTC_DCHECK_EQ(info.redundant.size(), 1);
-    if (secondary_info_.encoded_bytes > 0) {
-      encoded->AppendData(secondary_encoded_);
-      info.redundant.push_back(secondary_info_);
-      RTC_DCHECK_EQ(info.redundant.size(), 2);
-    }
-    // Save primary to secondary.
-    secondary_encoded_.SetData(encoded->data() + primary_offset,
-                               info.encoded_bytes);
-    secondary_info_ = info;
-    RTC_DCHECK_EQ(info.speech, info.redundant[0].speech);
-  }
-  // Update main EncodedInfo.
-  info.payload_type = red_payload_type_;
-  info.encoded_bytes = 0;
-  for (std::vector<EncodedInfoLeaf>::const_iterator it = info.redundant.begin();
-       it != info.redundant.end(); ++it) {
-    info.encoded_bytes += it->encoded_bytes;
-  }
-  return info;
-}
-
-void AudioEncoderCopyRed::Reset() {
-  speech_encoder_->Reset();
-  secondary_encoded_.Clear();
-  secondary_info_.encoded_bytes = 0;
-}
-
-bool AudioEncoderCopyRed::SetFec(bool enable) {
-  return speech_encoder_->SetFec(enable);
-}
-
-bool AudioEncoderCopyRed::SetDtx(bool enable) {
-  return speech_encoder_->SetDtx(enable);
-}
-
-bool AudioEncoderCopyRed::SetApplication(Application application) {
-  return speech_encoder_->SetApplication(application);
-}
-
-void AudioEncoderCopyRed::SetMaxPlaybackRate(int frequency_hz) {
-  speech_encoder_->SetMaxPlaybackRate(frequency_hz);
-}
-
-rtc::ArrayView<std::unique_ptr<AudioEncoder>>
-AudioEncoderCopyRed::ReclaimContainedEncoders() {
-  return rtc::ArrayView<std::unique_ptr<AudioEncoder>>(&speech_encoder_, 1);
-}
-
-void AudioEncoderCopyRed::OnReceivedUplinkPacketLossFraction(
-    float uplink_packet_loss_fraction) {
-  speech_encoder_->OnReceivedUplinkPacketLossFraction(
-      uplink_packet_loss_fraction);
-}
-
-void AudioEncoderCopyRed::OnReceivedUplinkRecoverablePacketLossFraction(
-    float uplink_recoverable_packet_loss_fraction) {
-  speech_encoder_->OnReceivedUplinkRecoverablePacketLossFraction(
-      uplink_recoverable_packet_loss_fraction);
-}
-
-void AudioEncoderCopyRed::OnReceivedUplinkBandwidth(
-    int target_audio_bitrate_bps,
-    rtc::Optional<int64_t> bwe_period_ms) {
-  speech_encoder_->OnReceivedUplinkBandwidth(target_audio_bitrate_bps,
-                                             bwe_period_ms);
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/codecs/red/audio_encoder_copy_red.h b/modules/audio_coding/codecs/red/audio_encoder_copy_red.h
deleted file mode 100644
index 664c13e..0000000
--- a/modules/audio_coding/codecs/red/audio_encoder_copy_red.h
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- *  Copyright (c) 2014 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_CODECS_RED_AUDIO_ENCODER_COPY_RED_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_RED_AUDIO_ENCODER_COPY_RED_H_
-
-#include <memory>
-#include <vector>
-
-#include "webrtc/api/audio_codecs/audio_encoder.h"
-#include "webrtc/rtc_base/buffer.h"
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace webrtc {
-
-// This class implements redundant audio coding. The class object will have an
-// underlying AudioEncoder object that performs the actual encodings. The
-// current class will gather the two latest encodings from the underlying codec
-// into one packet.
-class AudioEncoderCopyRed final : public AudioEncoder {
- public:
-  struct Config {
-    Config();
-    Config(Config&&);
-    ~Config();
-    int payload_type;
-    std::unique_ptr<AudioEncoder> speech_encoder;
-  };
-
-  explicit AudioEncoderCopyRed(Config&& config);
-
-  ~AudioEncoderCopyRed() override;
-
-  int SampleRateHz() const override;
-  size_t NumChannels() const override;
-  int RtpTimestampRateHz() const override;
-  size_t Num10MsFramesInNextPacket() const override;
-  size_t Max10MsFramesInAPacket() const override;
-  int GetTargetBitrate() const override;
-  void Reset() override;
-  bool SetFec(bool enable) override;
-  bool SetDtx(bool enable) override;
-  bool SetApplication(Application application) override;
-  void SetMaxPlaybackRate(int frequency_hz) override;
-  rtc::ArrayView<std::unique_ptr<AudioEncoder>> ReclaimContainedEncoders()
-      override;
-  void OnReceivedUplinkPacketLossFraction(
-      float uplink_packet_loss_fraction) override;
-  void OnReceivedUplinkRecoverablePacketLossFraction(
-      float uplink_recoverable_packet_loss_fraction) override;
-  void OnReceivedUplinkBandwidth(
-      int target_audio_bitrate_bps,
-      rtc::Optional<int64_t> bwe_period_ms) override;
-
- protected:
-  EncodedInfo EncodeImpl(uint32_t rtp_timestamp,
-                         rtc::ArrayView<const int16_t> audio,
-                         rtc::Buffer* encoded) override;
-
- private:
-  std::unique_ptr<AudioEncoder> speech_encoder_;
-  int red_payload_type_;
-  rtc::Buffer secondary_encoded_;
-  EncodedInfoLeaf secondary_info_;
-  RTC_DISALLOW_COPY_AND_ASSIGN(AudioEncoderCopyRed);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_CODING_CODECS_RED_AUDIO_ENCODER_COPY_RED_H_
diff --git a/modules/audio_coding/codecs/red/audio_encoder_copy_red_unittest.cc b/modules/audio_coding/codecs/red/audio_encoder_copy_red_unittest.cc
deleted file mode 100644
index a79bb1c..0000000
--- a/modules/audio_coding/codecs/red/audio_encoder_copy_red_unittest.cc
+++ /dev/null
@@ -1,307 +0,0 @@
-/*
- *  Copyright (c) 2014 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 <memory>
-#include <vector>
-
-#include "webrtc/modules/audio_coding/codecs/red/audio_encoder_copy_red.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/mock_audio_encoder.h"
-
-using ::testing::Return;
-using ::testing::_;
-using ::testing::SetArgPointee;
-using ::testing::InSequence;
-using ::testing::Invoke;
-using ::testing::MockFunction;
-
-namespace webrtc {
-
-namespace {
-static const size_t kMaxNumSamples = 48 * 10 * 2;  // 10 ms @ 48 kHz stereo.
-}
-
-class AudioEncoderCopyRedTest : public ::testing::Test {
- protected:
-  AudioEncoderCopyRedTest()
-      : mock_encoder_(new MockAudioEncoder),
-        timestamp_(4711),
-        sample_rate_hz_(16000),
-        num_audio_samples_10ms(sample_rate_hz_ / 100),
-        red_payload_type_(200) {
-    AudioEncoderCopyRed::Config config;
-    config.payload_type = red_payload_type_;
-    config.speech_encoder = std::unique_ptr<AudioEncoder>(mock_encoder_);
-    red_.reset(new AudioEncoderCopyRed(std::move(config)));
-    memset(audio_, 0, sizeof(audio_));
-    EXPECT_CALL(*mock_encoder_, NumChannels()).WillRepeatedly(Return(1U));
-    EXPECT_CALL(*mock_encoder_, SampleRateHz())
-        .WillRepeatedly(Return(sample_rate_hz_));
-  }
-
-  void TearDown() override {
-    EXPECT_CALL(*mock_encoder_, Die()).Times(1);
-    red_.reset();
-  }
-
-  void Encode() {
-    ASSERT_TRUE(red_.get() != NULL);
-    encoded_.Clear();
-    encoded_info_ = red_->Encode(
-        timestamp_,
-        rtc::ArrayView<const int16_t>(audio_, num_audio_samples_10ms),
-        &encoded_);
-    timestamp_ += num_audio_samples_10ms;
-  }
-
-  MockAudioEncoder* mock_encoder_;
-  std::unique_ptr<AudioEncoderCopyRed> red_;
-  uint32_t timestamp_;
-  int16_t audio_[kMaxNumSamples];
-  const int sample_rate_hz_;
-  size_t num_audio_samples_10ms;
-  rtc::Buffer encoded_;
-  AudioEncoder::EncodedInfo encoded_info_;
-  const int red_payload_type_;
-};
-
-TEST_F(AudioEncoderCopyRedTest, CreateAndDestroy) {
-}
-
-TEST_F(AudioEncoderCopyRedTest, CheckSampleRatePropagation) {
-  EXPECT_CALL(*mock_encoder_, SampleRateHz()).WillOnce(Return(17));
-  EXPECT_EQ(17, red_->SampleRateHz());
-}
-
-TEST_F(AudioEncoderCopyRedTest, CheckNumChannelsPropagation) {
-  EXPECT_CALL(*mock_encoder_, NumChannels()).WillOnce(Return(17U));
-  EXPECT_EQ(17U, red_->NumChannels());
-}
-
-TEST_F(AudioEncoderCopyRedTest, CheckFrameSizePropagation) {
-  EXPECT_CALL(*mock_encoder_, Num10MsFramesInNextPacket())
-      .WillOnce(Return(17U));
-  EXPECT_EQ(17U, red_->Num10MsFramesInNextPacket());
-}
-
-TEST_F(AudioEncoderCopyRedTest, CheckMaxFrameSizePropagation) {
-  EXPECT_CALL(*mock_encoder_, Max10MsFramesInAPacket()).WillOnce(Return(17U));
-  EXPECT_EQ(17U, red_->Max10MsFramesInAPacket());
-}
-
-TEST_F(AudioEncoderCopyRedTest, CheckTargetAudioBitratePropagation) {
-  EXPECT_CALL(*mock_encoder_,
-              OnReceivedUplinkBandwidth(4711, rtc::Optional<int64_t>()));
-  red_->OnReceivedUplinkBandwidth(4711, rtc::Optional<int64_t>());
-}
-
-TEST_F(AudioEncoderCopyRedTest, CheckPacketLossFractionPropagation) {
-  EXPECT_CALL(*mock_encoder_, OnReceivedUplinkPacketLossFraction(0.5));
-  red_->OnReceivedUplinkPacketLossFraction(0.5);
-}
-
-// Checks that the an Encode() call is immediately propagated to the speech
-// encoder.
-TEST_F(AudioEncoderCopyRedTest, CheckImmediateEncode) {
-  // Interleaving the EXPECT_CALL sequence with expectations on the MockFunction
-  // check ensures that exactly one call to EncodeImpl happens in each
-  // Encode call.
-  InSequence s;
-  MockFunction<void(int check_point_id)> check;
-  for (int i = 1; i <= 6; ++i) {
-    EXPECT_CALL(*mock_encoder_, EncodeImpl(_, _, _))
-        .WillRepeatedly(Return(AudioEncoder::EncodedInfo()));
-    EXPECT_CALL(check, Call(i));
-    Encode();
-    check.Call(i);
-  }
-}
-
-// Checks that no output is produced if the underlying codec doesn't emit any
-// new data, even if the RED codec is loaded with a secondary encoding.
-TEST_F(AudioEncoderCopyRedTest, CheckNoOutput) {
-  static const size_t kEncodedSize = 17;
-  {
-    InSequence s;
-    EXPECT_CALL(*mock_encoder_, EncodeImpl(_, _, _))
-        .WillOnce(Invoke(MockAudioEncoder::FakeEncoding(kEncodedSize)))
-        .WillOnce(Invoke(MockAudioEncoder::FakeEncoding(0)))
-        .WillOnce(Invoke(MockAudioEncoder::FakeEncoding(kEncodedSize)));
-  }
-
-  // Start with one Encode() call that will produce output.
-  Encode();
-  // First call is a special case, since it does not include a secondary
-  // payload.
-  EXPECT_EQ(1u, encoded_info_.redundant.size());
-  EXPECT_EQ(kEncodedSize, encoded_info_.encoded_bytes);
-
-  // Next call to the speech encoder will not produce any output.
-  Encode();
-  EXPECT_EQ(0u, encoded_info_.encoded_bytes);
-
-  // Final call to the speech encoder will produce output.
-  Encode();
-  EXPECT_EQ(2 * kEncodedSize, encoded_info_.encoded_bytes);
-  ASSERT_EQ(2u, encoded_info_.redundant.size());
-}
-
-// Checks that the correct payload sizes are populated into the redundancy
-// information.
-TEST_F(AudioEncoderCopyRedTest, CheckPayloadSizes) {
-  // Let the mock encoder return payload sizes 1, 2, 3, ..., 10 for the sequence
-  // of calls.
-  static const int kNumPackets = 10;
-  InSequence s;
-  for (int encode_size = 1; encode_size <= kNumPackets; ++encode_size) {
-    EXPECT_CALL(*mock_encoder_, EncodeImpl(_, _, _))
-        .WillOnce(Invoke(MockAudioEncoder::FakeEncoding(encode_size)));
-  }
-
-  // First call is a special case, since it does not include a secondary
-  // payload.
-  Encode();
-  EXPECT_EQ(1u, encoded_info_.redundant.size());
-  EXPECT_EQ(1u, encoded_info_.encoded_bytes);
-
-  for (size_t i = 2; i <= kNumPackets; ++i) {
-    Encode();
-    ASSERT_EQ(2u, encoded_info_.redundant.size());
-    EXPECT_EQ(i, encoded_info_.redundant[0].encoded_bytes);
-    EXPECT_EQ(i - 1, encoded_info_.redundant[1].encoded_bytes);
-    EXPECT_EQ(i + i - 1, encoded_info_.encoded_bytes);
-  }
-}
-
-// Checks that the correct timestamps are returned.
-TEST_F(AudioEncoderCopyRedTest, CheckTimestamps) {
-  uint32_t primary_timestamp = timestamp_;
-  AudioEncoder::EncodedInfo info;
-  info.encoded_bytes = 17;
-  info.encoded_timestamp = timestamp_;
-
-  EXPECT_CALL(*mock_encoder_, EncodeImpl(_, _, _))
-      .WillOnce(Invoke(MockAudioEncoder::FakeEncoding(info)));
-
-  // First call is a special case, since it does not include a secondary
-  // payload.
-  Encode();
-  EXPECT_EQ(primary_timestamp, encoded_info_.encoded_timestamp);
-
-  uint32_t secondary_timestamp = primary_timestamp;
-  primary_timestamp = timestamp_;
-  info.encoded_timestamp = timestamp_;
-  EXPECT_CALL(*mock_encoder_, EncodeImpl(_, _, _))
-      .WillOnce(Invoke(MockAudioEncoder::FakeEncoding(info)));
-
-  Encode();
-  ASSERT_EQ(2u, encoded_info_.redundant.size());
-  EXPECT_EQ(primary_timestamp, encoded_info_.redundant[0].encoded_timestamp);
-  EXPECT_EQ(secondary_timestamp, encoded_info_.redundant[1].encoded_timestamp);
-  EXPECT_EQ(primary_timestamp, encoded_info_.encoded_timestamp);
-}
-
-// Checks that the primary and secondary payloads are written correctly.
-TEST_F(AudioEncoderCopyRedTest, CheckPayloads) {
-  // Let the mock encoder write payloads with increasing values. The first
-  // payload will have values 0, 1, 2, ..., kPayloadLenBytes - 1.
-  static const size_t kPayloadLenBytes = 5;
-  uint8_t payload[kPayloadLenBytes];
-  for (uint8_t i = 0; i < kPayloadLenBytes; ++i) {
-    payload[i] = i;
-  }
-  EXPECT_CALL(*mock_encoder_, EncodeImpl(_, _, _))
-      .WillRepeatedly(Invoke(MockAudioEncoder::CopyEncoding(payload)));
-
-  // First call is a special case, since it does not include a secondary
-  // payload.
-  Encode();
-  EXPECT_EQ(kPayloadLenBytes, encoded_info_.encoded_bytes);
-  for (size_t i = 0; i < kPayloadLenBytes; ++i) {
-    EXPECT_EQ(i, encoded_.data()[i]);
-  }
-
-  for (int j = 0; j < 5; ++j) {
-    // Increment all values of the payload by 10.
-    for (size_t i = 0; i < kPayloadLenBytes; ++i)
-      payload[i] += 10;
-
-    Encode();
-    ASSERT_EQ(2u, encoded_info_.redundant.size());
-    EXPECT_EQ(kPayloadLenBytes, encoded_info_.redundant[0].encoded_bytes);
-    EXPECT_EQ(kPayloadLenBytes, encoded_info_.redundant[1].encoded_bytes);
-    for (size_t i = 0; i < kPayloadLenBytes; ++i) {
-      // Check primary payload.
-      EXPECT_EQ((j + 1) * 10 + i, encoded_.data()[i]);
-      // Check secondary payload.
-      EXPECT_EQ(j * 10 + i, encoded_.data()[i + kPayloadLenBytes]);
-    }
-  }
-}
-
-// Checks correct propagation of payload type.
-// Checks that the correct timestamps are returned.
-TEST_F(AudioEncoderCopyRedTest, CheckPayloadType) {
-  const int primary_payload_type = red_payload_type_ + 1;
-  AudioEncoder::EncodedInfo info;
-  info.encoded_bytes = 17;
-  info.payload_type = primary_payload_type;
-  EXPECT_CALL(*mock_encoder_, EncodeImpl(_, _, _))
-      .WillOnce(Invoke(MockAudioEncoder::FakeEncoding(info)));
-
-  // First call is a special case, since it does not include a secondary
-  // payload.
-  Encode();
-  ASSERT_EQ(1u, encoded_info_.redundant.size());
-  EXPECT_EQ(primary_payload_type, encoded_info_.redundant[0].payload_type);
-  EXPECT_EQ(red_payload_type_, encoded_info_.payload_type);
-
-  const int secondary_payload_type = red_payload_type_ + 2;
-  info.payload_type = secondary_payload_type;
-  EXPECT_CALL(*mock_encoder_, EncodeImpl(_, _, _))
-      .WillOnce(Invoke(MockAudioEncoder::FakeEncoding(info)));
-
-  Encode();
-  ASSERT_EQ(2u, encoded_info_.redundant.size());
-  EXPECT_EQ(secondary_payload_type, encoded_info_.redundant[0].payload_type);
-  EXPECT_EQ(primary_payload_type, encoded_info_.redundant[1].payload_type);
-  EXPECT_EQ(red_payload_type_, encoded_info_.payload_type);
-}
-
-#if GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
-
-// This test fixture tests various error conditions that makes the
-// AudioEncoderCng die via CHECKs.
-class AudioEncoderCopyRedDeathTest : public AudioEncoderCopyRedTest {
- protected:
-  AudioEncoderCopyRedDeathTest() : AudioEncoderCopyRedTest() {}
-};
-
-TEST_F(AudioEncoderCopyRedDeathTest, WrongFrameSize) {
-  num_audio_samples_10ms *= 2;  // 20 ms frame.
-  EXPECT_DEATH(Encode(), "");
-  num_audio_samples_10ms = 0;  // Zero samples.
-  EXPECT_DEATH(Encode(), "");
-}
-
-TEST_F(AudioEncoderCopyRedDeathTest, NullSpeechEncoder) {
-  AudioEncoderCopyRed* red = NULL;
-  AudioEncoderCopyRed::Config config;
-  config.speech_encoder = NULL;
-  EXPECT_DEATH(red = new AudioEncoderCopyRed(std::move(config)),
-               "Speech encoder not provided.");
-  // The delete operation is needed to avoid leak reports from memcheck.
-  delete red;
-}
-
-#endif  // GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/codecs/tools/audio_codec_speed_test.cc b/modules/audio_coding/codecs/tools/audio_codec_speed_test.cc
deleted file mode 100644
index b9332e0..0000000
--- a/modules/audio_coding/codecs/tools/audio_codec_speed_test.cc
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- *  Copyright (c) 2014 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/codecs/tools/audio_codec_speed_test.h"
-
-#include "webrtc/rtc_base/format_macros.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/testsupport/fileutils.h"
-
-using ::std::tr1::get;
-
-namespace webrtc {
-
-AudioCodecSpeedTest::AudioCodecSpeedTest(int block_duration_ms,
-                                         int input_sampling_khz,
-                                         int output_sampling_khz)
-    : block_duration_ms_(block_duration_ms),
-      input_sampling_khz_(input_sampling_khz),
-      output_sampling_khz_(output_sampling_khz),
-      input_length_sample_(
-          static_cast<size_t>(block_duration_ms_ * input_sampling_khz_)),
-      output_length_sample_(
-          static_cast<size_t>(block_duration_ms_ * output_sampling_khz_)),
-      data_pointer_(0),
-      loop_length_samples_(0),
-      max_bytes_(0),
-      encoded_bytes_(0),
-      encoding_time_ms_(0.0),
-      decoding_time_ms_(0.0),
-      out_file_(NULL) {
-}
-
-void AudioCodecSpeedTest::SetUp() {
-  channels_ = get<0>(GetParam());
-  bit_rate_ = get<1>(GetParam());
-  in_filename_ = test::ResourcePath(get<2>(GetParam()), get<3>(GetParam()));
-  save_out_data_ = get<4>(GetParam());
-
-  FILE* fp = fopen(in_filename_.c_str(), "rb");
-  assert(fp != NULL);
-
-  // Obtain file size.
-  fseek(fp, 0, SEEK_END);
-  loop_length_samples_ = ftell(fp) / sizeof(int16_t);
-  rewind(fp);
-
-  // Allocate memory to contain the whole file.
-  in_data_.reset(new int16_t[loop_length_samples_ +
-      input_length_sample_ * channels_]);
-
-  data_pointer_ = 0;
-
-  // Copy the file into the buffer.
-  ASSERT_EQ(fread(&in_data_[0], sizeof(int16_t), loop_length_samples_, fp),
-            loop_length_samples_);
-  fclose(fp);
-
-  // Add an extra block length of samples to the end of the array, starting
-  // over again from the beginning of the array. This is done to simplify
-  // the reading process when reading over the end of the loop.
-  memcpy(&in_data_[loop_length_samples_], &in_data_[0],
-         input_length_sample_ * channels_ * sizeof(int16_t));
-
-  max_bytes_ = input_length_sample_ * channels_ * sizeof(int16_t);
-  out_data_.reset(new int16_t[output_length_sample_ * channels_]);
-  bit_stream_.reset(new uint8_t[max_bytes_]);
-
-  if (save_out_data_) {
-    std::string out_filename =
-        ::testing::UnitTest::GetInstance()->current_test_info()->name();
-
-    // Erase '/'
-    size_t found;
-    while ((found = out_filename.find('/')) != std::string::npos)
-      out_filename.replace(found, 1, "_");
-
-    out_filename = test::OutputPath() + out_filename + ".pcm";
-
-    out_file_ = fopen(out_filename.c_str(), "wb");
-    assert(out_file_ != NULL);
-
-    printf("Output to be saved in %s.\n", out_filename.c_str());
-  }
-}
-
-void AudioCodecSpeedTest::TearDown() {
-  if (save_out_data_) {
-    fclose(out_file_);
-  }
-}
-
-void AudioCodecSpeedTest::EncodeDecode(size_t audio_duration_sec) {
-  size_t time_now_ms = 0;
-  float time_ms;
-
-  printf("Coding %d kHz-sampled %" PRIuS "-channel audio at %d bps ...\n",
-         input_sampling_khz_, channels_, bit_rate_);
-
-  while (time_now_ms < audio_duration_sec * 1000) {
-    // Encode & decode.
-    time_ms = EncodeABlock(&in_data_[data_pointer_], &bit_stream_[0],
-                           max_bytes_, &encoded_bytes_);
-    encoding_time_ms_ += time_ms;
-    time_ms = DecodeABlock(&bit_stream_[0], encoded_bytes_, &out_data_[0]);
-    decoding_time_ms_ += time_ms;
-    if (save_out_data_) {
-      fwrite(&out_data_[0], sizeof(int16_t),
-             output_length_sample_ * channels_, out_file_);
-    }
-    data_pointer_ = (data_pointer_ + input_length_sample_ * channels_) %
-        loop_length_samples_;
-    time_now_ms += block_duration_ms_;
-  }
-
-  printf("Encoding: %.2f%% real time,\nDecoding: %.2f%% real time.\n",
-         (encoding_time_ms_ / audio_duration_sec) / 10.0,
-         (decoding_time_ms_ / audio_duration_sec) / 10.0);
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/codecs/tools/audio_codec_speed_test.h b/modules/audio_coding/codecs/tools/audio_codec_speed_test.h
deleted file mode 100644
index b79b1ef..0000000
--- a/modules/audio_coding/codecs/tools/audio_codec_speed_test.h
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- *  Copyright (c) 2014 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_CODECS_TOOLS_AUDIO_CODEC_SPEED_TEST_H_
-#define WEBRTC_MODULES_AUDIO_CODING_CODECS_TOOLS_AUDIO_CODEC_SPEED_TEST_H_
-
-#include <memory>
-#include <string>
-
-#include "webrtc/test/gtest.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-// Define coding parameter as
-// <channels, bit_rate, file_name, extension, if_save_output>.
-typedef std::tr1::tuple<size_t, int, std::string, std::string, bool>
-    coding_param;
-
-class AudioCodecSpeedTest : public testing::TestWithParam<coding_param> {
- protected:
-  AudioCodecSpeedTest(int block_duration_ms,
-                      int input_sampling_khz,
-                      int output_sampling_khz);
-  virtual void SetUp();
-  virtual void TearDown();
-
-  // EncodeABlock(...) does the following:
-  // 1. encodes a block of audio, saved in |in_data|,
-  // 2. save the bit stream to |bit_stream| of |max_bytes| bytes in size,
-  // 3. assign |encoded_bytes| with the length of the bit stream (in bytes),
-  // 4. return the cost of time (in millisecond) spent on actual encoding.
-  virtual float EncodeABlock(int16_t* in_data, uint8_t* bit_stream,
-                             size_t max_bytes, size_t* encoded_bytes) = 0;
-
-  // DecodeABlock(...) does the following:
-  // 1. decodes the bit stream in |bit_stream| with a length of |encoded_bytes|
-  // (in bytes),
-  // 2. save the decoded audio in |out_data|,
-  // 3. return the cost of time (in millisecond) spent on actual decoding.
-  virtual float DecodeABlock(const uint8_t* bit_stream, size_t encoded_bytes,
-                             int16_t* out_data) = 0;
-
-  // Encoding and decode an audio of |audio_duration| (in seconds) and
-  // record the runtime for encoding and decoding separately.
-  void EncodeDecode(size_t audio_duration);
-
-  int block_duration_ms_;
-  int input_sampling_khz_;
-  int output_sampling_khz_;
-
-  // Number of samples-per-channel in a frame.
-  size_t input_length_sample_;
-
-  // Expected output number of samples-per-channel in a frame.
-  size_t output_length_sample_;
-
-  std::unique_ptr<int16_t[]> in_data_;
-  std::unique_ptr<int16_t[]> out_data_;
-  size_t data_pointer_;
-  size_t loop_length_samples_;
-  std::unique_ptr<uint8_t[]> bit_stream_;
-
-  // Maximum number of bytes in output bitstream for a frame of audio.
-  size_t max_bytes_;
-
-  size_t encoded_bytes_;
-  float encoding_time_ms_;
-  float decoding_time_ms_;
-  FILE* out_file_;
-
-  size_t channels_;
-
-  // Bit rate is in bit-per-second.
-  int bit_rate_;
-
-  std::string in_filename_;
-
-  // Determines whether to save the output to file.
-  bool save_out_data_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_CODING_CODECS_TOOLS_AUDIO_CODEC_SPEED_TEST_H_
diff --git a/modules/audio_coding/include/audio_coding_module.h b/modules/audio_coding/include/audio_coding_module.h
deleted file mode 100644
index eb59404..0000000
--- a/modules/audio_coding/include/audio_coding_module.h
+++ /dev/null
@@ -1,832 +0,0 @@
-/*
- *  Copyright (c) 2012 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_INCLUDE_AUDIO_CODING_MODULE_H_
-#define WEBRTC_MODULES_AUDIO_CODING_INCLUDE_AUDIO_CODING_MODULE_H_
-
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "webrtc/api/audio_codecs/audio_decoder_factory.h"
-#include "webrtc/api/audio_codecs/audio_encoder.h"
-#include "webrtc/api/optional.h"
-#include "webrtc/common_types.h"
-#include "webrtc/modules/audio_coding/include/audio_coding_module_typedefs.h"
-#include "webrtc/modules/audio_coding/neteq/include/neteq.h"
-#include "webrtc/modules/include/module.h"
-#include "webrtc/rtc_base/deprecation.h"
-#include "webrtc/rtc_base/function_view.h"
-#include "webrtc/system_wrappers/include/clock.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-// forward declarations
-struct CodecInst;
-struct WebRtcRTPHeader;
-class AudioDecoder;
-class AudioEncoder;
-class AudioFrame;
-class RTPFragmentationHeader;
-
-#define WEBRTC_10MS_PCM_AUDIO 960  // 16 bits super wideband 48 kHz
-
-// Callback class used for sending data ready to be packetized
-class AudioPacketizationCallback {
- public:
-  virtual ~AudioPacketizationCallback() {}
-
-  virtual int32_t SendData(FrameType frame_type,
-                           uint8_t payload_type,
-                           uint32_t timestamp,
-                           const uint8_t* payload_data,
-                           size_t payload_len_bytes,
-                           const RTPFragmentationHeader* fragmentation) = 0;
-};
-
-// Callback class used for reporting VAD decision
-class ACMVADCallback {
- public:
-  virtual ~ACMVADCallback() {}
-
-  virtual int32_t InFrameType(FrameType frame_type) = 0;
-};
-
-class AudioCodingModule {
- protected:
-  AudioCodingModule() {}
-
- public:
-  struct Config {
-    Config();
-    Config(const Config&);
-    ~Config();
-
-    int id;
-    NetEq::Config neteq_config;
-    Clock* clock;
-    rtc::scoped_refptr<AudioDecoderFactory> decoder_factory;
-  };
-
-  ///////////////////////////////////////////////////////////////////////////
-  // Creation and destruction of a ACM.
-  //
-  // The second method is used for testing where a simulated clock can be
-  // injected into ACM. ACM will take the ownership of the object clock and
-  // delete it when destroyed.
-  //
-  static AudioCodingModule* Create(int id);
-  static AudioCodingModule* Create(int id, Clock* clock);
-  static AudioCodingModule* Create(const Config& config);
-  virtual ~AudioCodingModule() = default;
-
-  ///////////////////////////////////////////////////////////////////////////
-  //   Utility functions
-  //
-
-  ///////////////////////////////////////////////////////////////////////////
-  // uint8_t NumberOfCodecs()
-  // Returns number of supported codecs.
-  //
-  // Return value:
-  //   number of supported codecs.
-  ///
-  static int NumberOfCodecs();
-
-  ///////////////////////////////////////////////////////////////////////////
-  // int32_t Codec()
-  // Get supported codec with list number.
-  //
-  // Input:
-  //   -list_id             : list number.
-  //
-  // Output:
-  //   -codec              : a structure where the parameters of the codec,
-  //                         given by list number is written to.
-  //
-  // Return value:
-  //   -1 if the list number (list_id) is invalid.
-  //    0 if succeeded.
-  //
-  static int Codec(int list_id, CodecInst* codec);
-
-  ///////////////////////////////////////////////////////////////////////////
-  // int32_t Codec()
-  // Get supported codec with the given codec name, sampling frequency, and
-  // a given number of channels.
-  //
-  // Input:
-  //   -payload_name       : name of the codec.
-  //   -sampling_freq_hz   : sampling frequency of the codec. Note! for RED
-  //                         a sampling frequency of -1 is a valid input.
-  //   -channels           : number of channels ( 1 - mono, 2 - stereo).
-  //
-  // Output:
-  //   -codec              : a structure where the function returns the
-  //                         default parameters of the codec.
-  //
-  // Return value:
-  //   -1 if no codec matches the given parameters.
-  //    0 if succeeded.
-  //
-  static int Codec(const char* payload_name, CodecInst* codec,
-                   int sampling_freq_hz, size_t channels);
-
-  ///////////////////////////////////////////////////////////////////////////
-  // int32_t Codec()
-  //
-  // Returns the list number of the given codec name, sampling frequency, and
-  // a given number of channels.
-  //
-  // Input:
-  //   -payload_name        : name of the codec.
-  //   -sampling_freq_hz    : sampling frequency of the codec. Note! for RED
-  //                          a sampling frequency of -1 is a valid input.
-  //   -channels            : number of channels ( 1 - mono, 2 - stereo).
-  //
-  // Return value:
-  //   if the codec is found, the index of the codec in the list,
-  //   -1 if the codec is not found.
-  //
-  static int Codec(const char* payload_name, int sampling_freq_hz,
-                   size_t channels);
-
-  ///////////////////////////////////////////////////////////////////////////
-  // bool IsCodecValid()
-  // Checks the validity of the parameters of the given codec.
-  //
-  // Input:
-  //   -codec              : the structure which keeps the parameters of the
-  //                         codec.
-  //
-  // Return value:
-  //   true if the parameters are valid,
-  //   false if any parameter is not valid.
-  //
-  static bool IsCodecValid(const CodecInst& codec);
-
-  ///////////////////////////////////////////////////////////////////////////
-  //   Sender
-  //
-
-  ///////////////////////////////////////////////////////////////////////////
-  // int32_t RegisterSendCodec()
-  // Registers a codec, specified by |send_codec|, as sending codec.
-  // This API can be called multiple of times to register Codec. The last codec
-  // registered overwrites the previous ones.
-  // The API can also be used to change payload type for CNG and RED, which are
-  // registered by default to default payload types.
-  // Note that registering CNG and RED won't overwrite speech codecs.
-  // This API can be called to set/change the send payload-type, frame-size
-  // or encoding rate (if applicable for the codec).
-  //
-  // Note: If a stereo codec is registered as send codec, VAD/DTX will
-  // automatically be turned off, since it is not supported for stereo sending.
-  //
-  // Note: If a secondary encoder is already registered, and the new send-codec
-  // has a sampling rate that does not match the secondary encoder, the
-  // secondary encoder will be unregistered.
-  //
-  // Input:
-  //   -send_codec         : Parameters of the codec to be registered, c.f.
-  //                         common_types.h for the definition of
-  //                         CodecInst.
-  //
-  // Return value:
-  //   -1 if failed to initialize,
-  //    0 if succeeded.
-  //
-  virtual int32_t RegisterSendCodec(const CodecInst& send_codec) = 0;
-
-  // Registers |external_speech_encoder| as encoder. The new encoder will
-  // replace any previously registered speech encoder (internal or external).
-  virtual void RegisterExternalSendCodec(
-      AudioEncoder* external_speech_encoder) = 0;
-
-  // |modifier| is called exactly once with one argument: a pointer to the
-  // unique_ptr that holds the current encoder (which is null if there is no
-  // current encoder). For the duration of the call, |modifier| has exclusive
-  // access to the unique_ptr; it may call the encoder, steal the encoder and
-  // replace it with another encoder or with nullptr, etc.
-  virtual void ModifyEncoder(
-      rtc::FunctionView<void(std::unique_ptr<AudioEncoder>*)> modifier) = 0;
-
-  // |modifier| is called exactly once with one argument: a const pointer to the
-  // current encoder (which is null if there is no current encoder).
-  virtual void QueryEncoder(
-      rtc::FunctionView<void(AudioEncoder const*)> query) = 0;
-
-  // Utility method for simply replacing the existing encoder with a new one.
-  void SetEncoder(std::unique_ptr<AudioEncoder> new_encoder) {
-    ModifyEncoder([&](std::unique_ptr<AudioEncoder>* encoder) {
-      *encoder = std::move(new_encoder);
-    });
-  }
-
-  ///////////////////////////////////////////////////////////////////////////
-  // int32_t SendCodec()
-  // Get parameters for the codec currently registered as send codec.
-  //
-  // Return value:
-  //   The send codec, or nothing if we don't have one
-  //
-  virtual rtc::Optional<CodecInst> SendCodec() const = 0;
-
-  ///////////////////////////////////////////////////////////////////////////
-  // int32_t SendFrequency()
-  // Get the sampling frequency of the current encoder in Hertz.
-  //
-  // Return value:
-  //   positive; sampling frequency [Hz] of the current encoder.
-  //   -1 if an error has happened.
-  //
-  virtual int32_t SendFrequency() const = 0;
-
-  ///////////////////////////////////////////////////////////////////////////
-  // Sets the bitrate to the specified value in bits/sec. If the value is not
-  // supported by the codec, it will choose another appropriate value.
-  //
-  // This is only used in test code that rely on old ACM APIs.
-  // TODO(minyue): Remove it when possible.
-  virtual void SetBitRate(int bitrate_bps) = 0;
-
-  // int32_t RegisterTransportCallback()
-  // Register a transport callback which will be called to deliver
-  // the encoded buffers whenever Process() is called and a
-  // bit-stream is ready.
-  //
-  // Input:
-  //   -transport          : pointer to the callback class
-  //                         transport->SendData() is called whenever
-  //                         Process() is called and bit-stream is ready
-  //                         to deliver.
-  //
-  // Return value:
-  //   -1 if the transport callback could not be registered
-  //    0 if registration is successful.
-  //
-  virtual int32_t RegisterTransportCallback(
-      AudioPacketizationCallback* transport) = 0;
-
-  ///////////////////////////////////////////////////////////////////////////
-  // int32_t Add10MsData()
-  // Add 10MS of raw (PCM) audio data and encode it. If the sampling
-  // frequency of the audio does not match the sampling frequency of the
-  // current encoder ACM will resample the audio. If an encoded packet was
-  // produced, it will be delivered via the callback object registered using
-  // RegisterTransportCallback, and the return value from this function will
-  // be the number of bytes encoded.
-  //
-  // Input:
-  //   -audio_frame        : the input audio frame, containing raw audio
-  //                         sampling frequency etc.,
-  //                         c.f. module_common_types.h for definition of
-  //                         AudioFrame.
-  //
-  // Return value:
-  //   >= 0   number of bytes encoded.
-  //     -1   some error occurred.
-  //
-  virtual int32_t Add10MsData(const AudioFrame& audio_frame) = 0;
-
-  ///////////////////////////////////////////////////////////////////////////
-  // (RED) Redundant Coding
-  //
-
-  ///////////////////////////////////////////////////////////////////////////
-  // int32_t SetREDStatus()
-  // configure RED status i.e. on/off.
-  //
-  // RFC 2198 describes a solution which has a single payload type which
-  // signifies a packet with redundancy. That packet then becomes a container,
-  // encapsulating multiple payloads into a single RTP packet.
-  // Such a scheme is flexible, since any amount of redundancy may be
-  // encapsulated within a single packet.  There is, however, a small overhead
-  // since each encapsulated payload must be preceded by a header indicating
-  // the type of data enclosed.
-  //
-  // Input:
-  //   -enable_red         : if true RED is enabled, otherwise RED is
-  //                         disabled.
-  //
-  // Return value:
-  //   -1 if failed to set RED status,
-  //    0 if succeeded.
-  //
-  virtual int32_t SetREDStatus(bool enable_red) = 0;
-
-  ///////////////////////////////////////////////////////////////////////////
-  // bool REDStatus()
-  // Get RED status
-  //
-  // Return value:
-  //   true if RED is enabled,
-  //   false if RED is disabled.
-  //
-  virtual bool REDStatus() const = 0;
-
-  ///////////////////////////////////////////////////////////////////////////
-  // (FEC) Forward Error Correction (codec internal)
-  //
-
-  ///////////////////////////////////////////////////////////////////////////
-  // int32_t SetCodecFEC()
-  // Configures codec internal FEC status i.e. on/off. No effects on codecs that
-  // do not provide internal FEC.
-  //
-  // Input:
-  //   -enable_fec         : if true FEC will be enabled otherwise the FEC is
-  //                         disabled.
-  //
-  // Return value:
-  //   -1 if failed, or the codec does not support FEC
-  //    0 if succeeded.
-  //
-  virtual int SetCodecFEC(bool enable_codec_fec) = 0;
-
-  ///////////////////////////////////////////////////////////////////////////
-  // bool CodecFEC()
-  // Gets status of codec internal FEC.
-  //
-  // Return value:
-  //   true if FEC is enabled,
-  //   false if FEC is disabled.
-  //
-  virtual bool CodecFEC() const = 0;
-
-  ///////////////////////////////////////////////////////////////////////////
-  // int SetPacketLossRate()
-  // Sets expected packet loss rate for encoding. Some encoders provide packet
-  // loss gnostic encoding to make stream less sensitive to packet losses,
-  // through e.g., FEC. No effects on codecs that do not provide such encoding.
-  //
-  // Input:
-  //   -packet_loss_rate   : expected packet loss rate (0 -- 100 inclusive).
-  //
-  // Return value
-  //   -1 if failed to set packet loss rate,
-  //   0 if succeeded.
-  //
-  // This is only used in test code that rely on old ACM APIs.
-  // TODO(minyue): Remove it when possible.
-  virtual int SetPacketLossRate(int packet_loss_rate) = 0;
-
-  ///////////////////////////////////////////////////////////////////////////
-  //   (VAD) Voice Activity Detection
-  //
-
-  ///////////////////////////////////////////////////////////////////////////
-  // int32_t SetVAD()
-  // If DTX is enabled & the codec does not have internal DTX/VAD
-  // WebRtc VAD will be automatically enabled and |enable_vad| is ignored.
-  //
-  // If DTX is disabled but VAD is enabled no DTX packets are send,
-  // regardless of whether the codec has internal DTX/VAD or not. In this
-  // case, WebRtc VAD is running to label frames as active/in-active.
-  //
-  // NOTE! VAD/DTX is not supported when sending stereo.
-  //
-  // Inputs:
-  //   -enable_dtx         : if true DTX is enabled,
-  //                         otherwise DTX is disabled.
-  //   -enable_vad         : if true VAD is enabled,
-  //                         otherwise VAD is disabled.
-  //   -vad_mode           : determines the aggressiveness of VAD. A more
-  //                         aggressive mode results in more frames labeled
-  //                         as in-active, c.f. definition of
-  //                         ACMVADMode in audio_coding_module_typedefs.h
-  //                         for valid values.
-  //
-  // Return value:
-  //   -1 if failed to set up VAD/DTX,
-  //    0 if succeeded.
-  //
-  virtual int32_t SetVAD(const bool enable_dtx = true,
-                               const bool enable_vad = false,
-                               const ACMVADMode vad_mode = VADNormal) = 0;
-
-  ///////////////////////////////////////////////////////////////////////////
-  // int32_t VAD()
-  // Get VAD status.
-  //
-  // Outputs:
-  //   -dtx_enabled        : is set to true if DTX is enabled, otherwise
-  //                         is set to false.
-  //   -vad_enabled        : is set to true if VAD is enabled, otherwise
-  //                         is set to false.
-  //   -vad_mode            : is set to the current aggressiveness of VAD.
-  //
-  // Return value:
-  //   -1 if fails to retrieve the setting of DTX/VAD,
-  //    0 if succeeded.
-  //
-  virtual int32_t VAD(bool* dtx_enabled, bool* vad_enabled,
-                            ACMVADMode* vad_mode) const = 0;
-
-  ///////////////////////////////////////////////////////////////////////////
-  // int32_t RegisterVADCallback()
-  // Call this method to register a callback function which is called
-  // any time that ACM encounters an empty frame. That is a frame which is
-  // recognized inactive. Depending on the codec WebRtc VAD or internal codec
-  // VAD is employed to identify a frame as active/inactive.
-  //
-  // Input:
-  //   -vad_callback        : pointer to a callback function.
-  //
-  // Return value:
-  //   -1 if failed to register the callback function.
-  //    0 if the callback function is registered successfully.
-  //
-  virtual int32_t RegisterVADCallback(ACMVADCallback* vad_callback) = 0;
-
-  ///////////////////////////////////////////////////////////////////////////
-  //   Receiver
-  //
-
-  ///////////////////////////////////////////////////////////////////////////
-  // int32_t InitializeReceiver()
-  // Any decoder-related state of ACM will be initialized to the
-  // same state when ACM is created. This will not interrupt or
-  // effect encoding functionality of ACM. ACM would lose all the
-  // decoding-related settings by calling this function.
-  // For instance, all registered codecs are deleted and have to be
-  // registered again.
-  //
-  // Return value:
-  //   -1 if failed to initialize,
-  //    0 if succeeded.
-  //
-  virtual int32_t InitializeReceiver() = 0;
-
-  ///////////////////////////////////////////////////////////////////////////
-  // int32_t ReceiveFrequency()
-  // Get sampling frequency of the last received payload.
-  //
-  // Return value:
-  //   non-negative the sampling frequency in Hertz.
-  //   -1 if an error has occurred.
-  //
-  virtual int32_t ReceiveFrequency() const = 0;
-
-  ///////////////////////////////////////////////////////////////////////////
-  // int32_t PlayoutFrequency()
-  // Get sampling frequency of audio played out.
-  //
-  // Return value:
-  //   the sampling frequency in Hertz.
-  //
-  virtual int32_t PlayoutFrequency() const = 0;
-
-  // Replace any existing decoders with the given payload type -> decoder map.
-  virtual void SetReceiveCodecs(
-      const std::map<int, SdpAudioFormat>& codecs) = 0;
-
-  // Registers a decoder for the given payload type. Returns true iff
-  // successful.
-  virtual bool RegisterReceiveCodec(int rtp_payload_type,
-                                    const SdpAudioFormat& audio_format) = 0;
-
-  ///////////////////////////////////////////////////////////////////////////
-  // int32_t RegisterReceiveCodec()
-  // Register possible decoders, can be called multiple times for
-  // codecs, CNG-NB, CNG-WB, CNG-SWB, AVT and RED.
-  //
-  // Input:
-  //   -receive_codec      : parameters of the codec to be registered, c.f.
-  //                         common_types.h for the definition of
-  //                         CodecInst.
-  //
-  // Return value:
-  //   -1 if failed to register the codec
-  //    0 if the codec registered successfully.
-  //
-  virtual int RegisterReceiveCodec(const CodecInst& receive_codec) = 0;
-
-  // Register a decoder; call repeatedly to register multiple decoders. |df| is
-  // a decoder factory that returns an iSAC decoder; it will be called once if
-  // the decoder being registered is iSAC.
-  virtual int RegisterReceiveCodec(
-      const CodecInst& receive_codec,
-      rtc::FunctionView<std::unique_ptr<AudioDecoder>()> isac_factory) = 0;
-
-  // Registers an external decoder. The name is only used to provide information
-  // back to the caller about the decoder. Hence, the name is arbitrary, and may
-  // be empty.
-  virtual int RegisterExternalReceiveCodec(int rtp_payload_type,
-                                           AudioDecoder* external_decoder,
-                                           int sample_rate_hz,
-                                           int num_channels,
-                                           const std::string& name) = 0;
-
-  ///////////////////////////////////////////////////////////////////////////
-  // int32_t UnregisterReceiveCodec()
-  // Unregister the codec currently registered with a specific payload type
-  // from the list of possible receive codecs.
-  //
-  // Input:
-  //   -payload_type        : The number representing the payload type to
-  //                         unregister.
-  //
-  // Output:
-  //   -1 if fails to unregister.
-  //    0 if the given codec is successfully unregistered.
-  //
-  virtual int UnregisterReceiveCodec(
-      uint8_t payload_type) = 0;
-
-  ///////////////////////////////////////////////////////////////////////////
-  // int32_t ReceiveCodec()
-  // Get the codec associated with last received payload.
-  //
-  // Output:
-  //   -curr_receive_codec : parameters of the codec associated with the last
-  //                         received payload, c.f. common_types.h for
-  //                         the definition of CodecInst.
-  //
-  // Return value:
-  //   -1 if failed to retrieve the codec,
-  //    0 if the codec is successfully retrieved.
-  //
-  virtual int32_t ReceiveCodec(CodecInst* curr_receive_codec) const = 0;
-
-  ///////////////////////////////////////////////////////////////////////////
-  // rtc::Optional<SdpAudioFormat> ReceiveFormat()
-  // Get the format associated with last received payload.
-  //
-  // Return value:
-  //    An SdpAudioFormat describing the format associated with the last
-  //    received payload.
-  //    An empty Optional if no payload has yet been received.
-  //
-  virtual rtc::Optional<SdpAudioFormat> ReceiveFormat() const = 0;
-
-  ///////////////////////////////////////////////////////////////////////////
-  // int32_t IncomingPacket()
-  // Call this function to insert a parsed RTP packet into ACM.
-  //
-  // Inputs:
-  //   -incoming_payload   : received payload.
-  //   -payload_len_bytes  : the length of payload in bytes.
-  //   -rtp_info           : the relevant information retrieved from RTP
-  //                         header.
-  //
-  // Return value:
-  //   -1 if failed to push in the payload
-  //    0 if payload is successfully pushed in.
-  //
-  virtual int32_t IncomingPacket(const uint8_t* incoming_payload,
-                                 const size_t payload_len_bytes,
-                                 const WebRtcRTPHeader& rtp_info) = 0;
-
-  ///////////////////////////////////////////////////////////////////////////
-  // int32_t IncomingPayload()
-  // Call this API to push incoming payloads when there is no rtp-info.
-  // The rtp-info will be created in ACM. One usage for this API is when
-  // pre-encoded files are pushed in ACM
-  //
-  // Inputs:
-  //   -incoming_payload   : received payload.
-  //   -payload_len_byte   : the length, in bytes, of the received payload.
-  //   -payload_type       : the payload-type. This specifies which codec has
-  //                         to be used to decode the payload.
-  //   -timestamp          : send timestamp of the payload. ACM starts with
-  //                         a random value and increment it by the
-  //                         packet-size, which is given when the codec in
-  //                         question is registered by RegisterReceiveCodec().
-  //                         Therefore, it is essential to have the timestamp
-  //                         if the frame-size differ from the registered
-  //                         value or if the incoming payload contains DTX
-  //                         packets.
-  //
-  // Return value:
-  //   -1 if failed to push in the payload
-  //    0 if payload is successfully pushed in.
-  //
-  virtual int32_t IncomingPayload(const uint8_t* incoming_payload,
-                                  const size_t payload_len_byte,
-                                  const uint8_t payload_type,
-                                  const uint32_t timestamp = 0) = 0;
-
-  ///////////////////////////////////////////////////////////////////////////
-  // int SetMinimumPlayoutDelay()
-  // Set a minimum for the playout delay, used for lip-sync. NetEq maintains
-  // such a delay unless channel condition yields to a higher delay.
-  //
-  // Input:
-  //   -time_ms            : minimum delay in milliseconds.
-  //
-  // Return value:
-  //   -1 if failed to set the delay,
-  //    0 if the minimum delay is set.
-  //
-  virtual int SetMinimumPlayoutDelay(int time_ms) = 0;
-
-  ///////////////////////////////////////////////////////////////////////////
-  // int SetMaximumPlayoutDelay()
-  // Set a maximum for the playout delay
-  //
-  // Input:
-  //   -time_ms            : maximum delay in milliseconds.
-  //
-  // Return value:
-  //   -1 if failed to set the delay,
-  //    0 if the maximum delay is set.
-  //
-  virtual int SetMaximumPlayoutDelay(int time_ms) = 0;
-
-  // TODO(kwiberg): Consider if this is needed anymore, now that voe::Channel
-  //                doesn't use it.
-  // The shortest latency, in milliseconds, required by jitter buffer. This
-  // is computed based on inter-arrival times and playout mode of NetEq. The
-  // actual delay is the maximum of least-required-delay and the minimum-delay
-  // specified by SetMinumumPlayoutDelay() API.
-  //
-  virtual int LeastRequiredDelayMs() const = 0;
-
-  // int32_t PlayoutTimestamp()
-  // The send timestamp of an RTP packet is associated with the decoded
-  // audio of the packet in question. This function returns the timestamp of
-  // the latest audio obtained by calling PlayoutData10ms().
-  //
-  // Input:
-  //   -timestamp          : a reference to a uint32_t to receive the
-  //                         timestamp.
-  // Return value:
-  //    0 if the output is a correct timestamp.
-  //   -1 if failed to output the correct timestamp.
-  //
-  RTC_DEPRECATED virtual int32_t PlayoutTimestamp(uint32_t* timestamp) = 0;
-
-  ///////////////////////////////////////////////////////////////////////////
-  // int32_t PlayoutTimestamp()
-  // The send timestamp of an RTP packet is associated with the decoded
-  // audio of the packet in question. This function returns the timestamp of
-  // the latest audio obtained by calling PlayoutData10ms(), or empty if no
-  // valid timestamp is available.
-  //
-  virtual rtc::Optional<uint32_t> PlayoutTimestamp() = 0;
-
-  ///////////////////////////////////////////////////////////////////////////
-  // int FilteredCurrentDelayMs()
-  // Returns the current total delay from NetEq (packet buffer and sync buffer)
-  // in ms, with smoothing applied to even out short-time fluctuations due to
-  // jitter. The packet buffer part of the delay is not updated during DTX/CNG
-  // periods.
-  //
-  virtual int FilteredCurrentDelayMs() const = 0;
-
-  ///////////////////////////////////////////////////////////////////////////
-  // int32_t PlayoutData10Ms(
-  // Get 10 milliseconds of raw audio data for playout, at the given sampling
-  // frequency. ACM will perform a resampling if required.
-  //
-  // Input:
-  //   -desired_freq_hz    : the desired sampling frequency, in Hertz, of the
-  //                         output audio. If set to -1, the function returns
-  //                         the audio at the current sampling frequency.
-  //
-  // Output:
-  //   -audio_frame        : output audio frame which contains raw audio data
-  //                         and other relevant parameters, c.f.
-  //                         module_common_types.h for the definition of
-  //                         AudioFrame.
-  //   -muted              : if true, the sample data in audio_frame is not
-  //                         populated, and must be interpreted as all zero.
-  //
-  // Return value:
-  //   -1 if the function fails,
-  //    0 if the function succeeds.
-  //
-  virtual int32_t PlayoutData10Ms(int32_t desired_freq_hz,
-                                  AudioFrame* audio_frame,
-                                  bool* muted) = 0;
-
-  /////////////////////////////////////////////////////////////////////////////
-  // Same as above, but without the muted parameter. This methods should not be
-  // used if enable_fast_accelerate was set to true in NetEq::Config.
-  // TODO(henrik.lundin) Remove this method when downstream dependencies are
-  // ready.
-  virtual int32_t PlayoutData10Ms(int32_t desired_freq_hz,
-                                  AudioFrame* audio_frame) = 0;
-
-  ///////////////////////////////////////////////////////////////////////////
-  //   Codec specific
-  //
-
-  ///////////////////////////////////////////////////////////////////////////
-  // int SetOpusApplication()
-  // Sets the intended application if current send codec is Opus. Opus uses this
-  // to optimize the encoding for applications like VOIP and music. Currently,
-  // two modes are supported: kVoip and kAudio.
-  //
-  // Input:
-  //   - application            : intended application.
-  //
-  // Return value:
-  //   -1 if current send codec is not Opus or error occurred in setting the
-  //      Opus application mode.
-  //    0 if the Opus application mode is successfully set.
-  //
-  virtual int SetOpusApplication(OpusApplicationMode application) = 0;
-
-  ///////////////////////////////////////////////////////////////////////////
-  // int SetOpusMaxPlaybackRate()
-  // If current send codec is Opus, informs it about maximum playback rate the
-  // receiver will render. Opus can use this information to optimize the bit
-  // rate and increase the computation efficiency.
-  //
-  // Input:
-  //   -frequency_hz            : maximum playback rate in Hz.
-  //
-  // Return value:
-  //   -1 if current send codec is not Opus or
-  //      error occurred in setting the maximum playback rate,
-  //    0 if maximum bandwidth is set successfully.
-  //
-  virtual int SetOpusMaxPlaybackRate(int frequency_hz) = 0;
-
-  ///////////////////////////////////////////////////////////////////////////
-  // EnableOpusDtx()
-  // Enable the DTX, if current send codec is Opus.
-  //
-  // Return value:
-  //   -1 if current send codec is not Opus or error occurred in enabling the
-  //      Opus DTX.
-  //    0 if Opus DTX is enabled successfully.
-  //
-  virtual int EnableOpusDtx() = 0;
-
-  ///////////////////////////////////////////////////////////////////////////
-  // int DisableOpusDtx()
-  // If current send codec is Opus, disables its internal DTX.
-  //
-  // Return value:
-  //   -1 if current send codec is not Opus or error occurred in disabling DTX.
-  //    0 if Opus DTX is disabled successfully.
-  //
-  virtual int DisableOpusDtx() = 0;
-
-  ///////////////////////////////////////////////////////////////////////////
-  //   statistics
-  //
-
-  ///////////////////////////////////////////////////////////////////////////
-  // int32_t  GetNetworkStatistics()
-  // Get network statistics. Note that the internal statistics of NetEq are
-  // reset by this call.
-  //
-  // Input:
-  //   -network_statistics : a structure that contains network statistics.
-  //
-  // Return value:
-  //   -1 if failed to set the network statistics,
-  //    0 if statistics are set successfully.
-  //
-  virtual int32_t GetNetworkStatistics(
-      NetworkStatistics* network_statistics) = 0;
-
-  //
-  // Enable NACK and set the maximum size of the NACK list. If NACK is already
-  // enable then the maximum NACK list size is modified accordingly.
-  //
-  // If the sequence number of last received packet is N, the sequence numbers
-  // of NACK list are in the range of [N - |max_nack_list_size|, N).
-  //
-  // |max_nack_list_size| should be positive (none zero) and less than or
-  // equal to |Nack::kNackListSizeLimit|. Otherwise, No change is applied and -1
-  // is returned. 0 is returned at success.
-  //
-  virtual int EnableNack(size_t max_nack_list_size) = 0;
-
-  // Disable NACK.
-  virtual void DisableNack() = 0;
-
-  //
-  // Get a list of packets to be retransmitted. |round_trip_time_ms| is an
-  // estimate of the round-trip-time (in milliseconds). Missing packets which
-  // will be playout in a shorter time than the round-trip-time (with respect
-  // to the time this API is called) will not be included in the list.
-  //
-  // Negative |round_trip_time_ms| results is an error message and empty list
-  // is returned.
-  //
-  virtual std::vector<uint16_t> GetNackList(
-      int64_t round_trip_time_ms) const = 0;
-
-  virtual void GetDecodingCallStatistics(
-      AudioDecodingCallStats* call_stats) const = 0;
-
-  virtual ANAStats GetANAStats() const = 0;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_CODING_INCLUDE_AUDIO_CODING_MODULE_H_
diff --git a/modules/audio_coding/include/audio_coding_module_typedefs.h b/modules/audio_coding/include/audio_coding_module_typedefs.h
deleted file mode 100644
index 280d6bf..0000000
--- a/modules/audio_coding/include/audio_coding_module_typedefs.h
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- *  Copyright (c) 2011 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_INCLUDE_AUDIO_CODING_MODULE_TYPEDEFS_H_
-#define WEBRTC_MODULES_AUDIO_CODING_INCLUDE_AUDIO_CODING_MODULE_TYPEDEFS_H_
-
-#include <map>
-
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-///////////////////////////////////////////////////////////////////////////
-// enum ACMVADMode
-// An enumerator for aggressiveness of VAD
-// -VADNormal                : least aggressive mode.
-// -VADLowBitrate            : more aggressive than "VADNormal" to save on
-//                             bit-rate.
-// -VADAggr                  : an aggressive mode.
-// -VADVeryAggr              : the most agressive mode.
-//
-enum ACMVADMode {
-  VADNormal = 0,
-  VADLowBitrate = 1,
-  VADAggr = 2,
-  VADVeryAggr = 3
-};
-
-///////////////////////////////////////////////////////////////////////////
-//
-// Enumeration of Opus mode for intended application.
-//
-// kVoip              : optimized for voice signals.
-// kAudio             : optimized for non-voice signals like music.
-//
-enum OpusApplicationMode {
- kVoip = 0,
- kAudio = 1,
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_CODING_INCLUDE_AUDIO_CODING_MODULE_TYPEDEFS_H_
diff --git a/modules/audio_coding/neteq/accelerate.cc b/modules/audio_coding/neteq/accelerate.cc
deleted file mode 100644
index 1c36fa8..0000000
--- a/modules/audio_coding/neteq/accelerate.cc
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- *  Copyright (c) 2012 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/neteq/accelerate.h"
-
-#include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
-
-namespace webrtc {
-
-Accelerate::ReturnCodes Accelerate::Process(const int16_t* input,
-                                            size_t input_length,
-                                            bool fast_accelerate,
-                                            AudioMultiVector* output,
-                                            size_t* length_change_samples) {
-  // Input length must be (almost) 30 ms.
-  static const size_t k15ms = 120;  // 15 ms = 120 samples at 8 kHz sample rate.
-  if (num_channels_ == 0 ||
-      input_length / num_channels_ < (2 * k15ms - 1) * fs_mult_) {
-    // Length of input data too short to do accelerate. Simply move all data
-    // from input to output.
-    output->PushBackInterleaved(input, input_length);
-    return kError;
-  }
-  return TimeStretch::Process(input, input_length, fast_accelerate, output,
-                              length_change_samples);
-}
-
-void Accelerate::SetParametersForPassiveSpeech(size_t /*len*/,
-                                               int16_t* best_correlation,
-                                               size_t* /*peak_index*/) const {
-  // When the signal does not contain any active speech, the correlation does
-  // not matter. Simply set it to zero.
-  *best_correlation = 0;
-}
-
-Accelerate::ReturnCodes Accelerate::CheckCriteriaAndStretch(
-    const int16_t* input,
-    size_t input_length,
-    size_t peak_index,
-    int16_t best_correlation,
-    bool active_speech,
-    bool fast_mode,
-    AudioMultiVector* output) const {
-  // Check for strong correlation or passive speech.
-  // Use 8192 (0.5 in Q14) in fast mode.
-  const int correlation_threshold = fast_mode ? 8192 : kCorrelationThreshold;
-  if ((best_correlation > correlation_threshold) || !active_speech) {
-    // Do accelerate operation by overlap add.
-
-    // Pre-calculate common multiplication with |fs_mult_|.
-    // 120 corresponds to 15 ms.
-    size_t fs_mult_120 = fs_mult_ * 120;
-
-    if (fast_mode) {
-      // Fit as many multiples of |peak_index| as possible in fs_mult_120.
-      // TODO(henrik.lundin) Consider finding multiple correlation peaks and
-      // pick the one with the longest correlation lag in this case.
-      peak_index = (fs_mult_120 / peak_index) * peak_index;
-    }
-
-    assert(fs_mult_120 >= peak_index);  // Should be handled in Process().
-    // Copy first part; 0 to 15 ms.
-    output->PushBackInterleaved(input, fs_mult_120 * num_channels_);
-    // Copy the |peak_index| starting at 15 ms to |temp_vector|.
-    AudioMultiVector temp_vector(num_channels_);
-    temp_vector.PushBackInterleaved(&input[fs_mult_120 * num_channels_],
-                                    peak_index * num_channels_);
-    // Cross-fade |temp_vector| onto the end of |output|.
-    output->CrossFade(temp_vector, peak_index);
-    // Copy the last unmodified part, 15 ms + pitch period until the end.
-    output->PushBackInterleaved(
-        &input[(fs_mult_120 + peak_index) * num_channels_],
-        input_length - (fs_mult_120 + peak_index) * num_channels_);
-
-    if (active_speech) {
-      return kSuccess;
-    } else {
-      return kSuccessLowEnergy;
-    }
-  } else {
-    // Accelerate not allowed. Simply move all data from decoded to outData.
-    output->PushBackInterleaved(input, input_length);
-    return kNoStretch;
-  }
-}
-
-Accelerate* AccelerateFactory::Create(
-    int sample_rate_hz,
-    size_t num_channels,
-    const BackgroundNoise& background_noise) const {
-  return new Accelerate(sample_rate_hz, num_channels, background_noise);
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/neteq/accelerate.h b/modules/audio_coding/neteq/accelerate.h
deleted file mode 100644
index 713344e..0000000
--- a/modules/audio_coding/neteq/accelerate.h
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- *  Copyright (c) 2012 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_NETEQ_ACCELERATE_H_
-#define WEBRTC_MODULES_AUDIO_CODING_NETEQ_ACCELERATE_H_
-
-#include <assert.h>
-
-#include "webrtc/modules/audio_coding/neteq/audio_multi_vector.h"
-#include "webrtc/modules/audio_coding/neteq/time_stretch.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-// Forward declarations.
-class BackgroundNoise;
-
-// This class implements the Accelerate operation. Most of the work is done
-// in the base class TimeStretch, which is shared with the PreemptiveExpand
-// operation. In the Accelerate class, the operations that are specific to
-// Accelerate are implemented.
-class Accelerate : public TimeStretch {
- public:
-  Accelerate(int sample_rate_hz, size_t num_channels,
-             const BackgroundNoise& background_noise)
-      : TimeStretch(sample_rate_hz, num_channels, background_noise) {
-  }
-
-  // This method performs the actual Accelerate operation. The samples are
-  // read from |input|, of length |input_length| elements, and are written to
-  // |output|. The number of samples removed through time-stretching is
-  // is provided in the output |length_change_samples|. The method returns
-  // the outcome of the operation as an enumerator value. If |fast_accelerate|
-  // is true, the algorithm will relax the requirements on finding strong
-  // correlations, and may remove multiple pitch periods if possible.
-  ReturnCodes Process(const int16_t* input,
-                      size_t input_length,
-                      bool fast_accelerate,
-                      AudioMultiVector* output,
-                      size_t* length_change_samples);
-
- protected:
-  // Sets the parameters |best_correlation| and |peak_index| to suitable
-  // values when the signal contains no active speech.
-  void SetParametersForPassiveSpeech(size_t len,
-                                     int16_t* best_correlation,
-                                     size_t* peak_index) const override;
-
-  // Checks the criteria for performing the time-stretching operation and,
-  // if possible, performs the time-stretching.
-  ReturnCodes CheckCriteriaAndStretch(const int16_t* input,
-                                      size_t input_length,
-                                      size_t peak_index,
-                                      int16_t best_correlation,
-                                      bool active_speech,
-                                      bool fast_mode,
-                                      AudioMultiVector* output) const override;
-
- private:
-  RTC_DISALLOW_COPY_AND_ASSIGN(Accelerate);
-};
-
-struct AccelerateFactory {
-  AccelerateFactory() {}
-  virtual ~AccelerateFactory() {}
-
-  virtual Accelerate* Create(int sample_rate_hz,
-                             size_t num_channels,
-                             const BackgroundNoise& background_noise) const;
-};
-
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_AUDIO_CODING_NETEQ_ACCELERATE_H_
diff --git a/modules/audio_coding/neteq/audio_decoder_impl.cc b/modules/audio_coding/neteq/audio_decoder_impl.cc
deleted file mode 100644
index d60f4bf..0000000
--- a/modules/audio_coding/neteq/audio_decoder_impl.cc
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- *  Copyright (c) 2012 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/neteq/audio_decoder_impl.h"
-
-#include <assert.h>
-
-#include "webrtc/modules/audio_coding/codecs/g711/audio_decoder_pcm.h"
-#include "webrtc/rtc_base/checks.h"
-#ifdef WEBRTC_CODEC_G722
-#include "webrtc/modules/audio_coding/codecs/g722/audio_decoder_g722.h"
-#endif
-#ifdef WEBRTC_CODEC_ILBC
-#include "webrtc/modules/audio_coding/codecs/ilbc/audio_decoder_ilbc.h"
-#endif
-#ifdef WEBRTC_CODEC_ISACFX
-#include "webrtc/modules/audio_coding/codecs/isac/fix/include/audio_decoder_isacfix.h"  // nogncheck
-#include "webrtc/modules/audio_coding/codecs/isac/fix/include/audio_encoder_isacfix.h"  // nogncheck
-#endif
-#ifdef WEBRTC_CODEC_ISAC
-#include "webrtc/modules/audio_coding/codecs/isac/main/include/audio_decoder_isac.h"  // nogncheck
-#include "webrtc/modules/audio_coding/codecs/isac/main/include/audio_encoder_isac.h"  // nogncheck
-#endif
-#ifdef WEBRTC_CODEC_OPUS
-#include "webrtc/modules/audio_coding/codecs/opus/audio_decoder_opus.h"
-#endif
-#include "webrtc/modules/audio_coding/codecs/pcm16b/audio_decoder_pcm16b.h"
-
-namespace webrtc {
-
-bool CodecSupported(NetEqDecoder codec_type) {
-  switch (codec_type) {
-    case NetEqDecoder::kDecoderPCMu:
-    case NetEqDecoder::kDecoderPCMa:
-    case NetEqDecoder::kDecoderPCMu_2ch:
-    case NetEqDecoder::kDecoderPCMa_2ch:
-#ifdef WEBRTC_CODEC_ILBC
-    case NetEqDecoder::kDecoderILBC:
-#endif
-#if defined(WEBRTC_CODEC_ISACFX) || defined(WEBRTC_CODEC_ISAC)
-    case NetEqDecoder::kDecoderISAC:
-#endif
-#ifdef WEBRTC_CODEC_ISAC
-    case NetEqDecoder::kDecoderISACswb:
-#endif
-    case NetEqDecoder::kDecoderPCM16B:
-    case NetEqDecoder::kDecoderPCM16Bwb:
-    case NetEqDecoder::kDecoderPCM16Bswb32kHz:
-    case NetEqDecoder::kDecoderPCM16Bswb48kHz:
-    case NetEqDecoder::kDecoderPCM16B_2ch:
-    case NetEqDecoder::kDecoderPCM16Bwb_2ch:
-    case NetEqDecoder::kDecoderPCM16Bswb32kHz_2ch:
-    case NetEqDecoder::kDecoderPCM16Bswb48kHz_2ch:
-    case NetEqDecoder::kDecoderPCM16B_5ch:
-#ifdef WEBRTC_CODEC_G722
-    case NetEqDecoder::kDecoderG722:
-    case NetEqDecoder::kDecoderG722_2ch:
-#endif
-#ifdef WEBRTC_CODEC_OPUS
-    case NetEqDecoder::kDecoderOpus:
-    case NetEqDecoder::kDecoderOpus_2ch:
-#endif
-    case NetEqDecoder::kDecoderRED:
-    case NetEqDecoder::kDecoderAVT:
-    case NetEqDecoder::kDecoderAVT16kHz:
-    case NetEqDecoder::kDecoderAVT32kHz:
-    case NetEqDecoder::kDecoderAVT48kHz:
-    case NetEqDecoder::kDecoderCNGnb:
-    case NetEqDecoder::kDecoderCNGwb:
-    case NetEqDecoder::kDecoderCNGswb32kHz:
-    case NetEqDecoder::kDecoderCNGswb48kHz:
-    case NetEqDecoder::kDecoderArbitrary: {
-      return true;
-    }
-    default: {
-      return false;
-    }
-  }
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/neteq/audio_decoder_impl.h b/modules/audio_coding/neteq/audio_decoder_impl.h
deleted file mode 100644
index 8dc746c..0000000
--- a/modules/audio_coding/neteq/audio_decoder_impl.h
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- *  Copyright (c) 2012 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_NETEQ_AUDIO_DECODER_IMPL_H_
-#define WEBRTC_MODULES_AUDIO_CODING_NETEQ_AUDIO_DECODER_IMPL_H_
-
-#include <assert.h>
-
-#include "webrtc/api/audio_codecs/audio_decoder.h"
-#include "webrtc/modules/audio_coding/neteq/neteq_decoder_enum.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/typedefs.h"
-
-#ifdef WEBRTC_CODEC_G722
-#include "webrtc/modules/audio_coding/codecs/g722/g722_interface.h"
-#endif
-
-namespace webrtc {
-
-// Returns true if |codec_type| is supported.
-bool CodecSupported(NetEqDecoder codec_type);
-
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_AUDIO_CODING_NETEQ_AUDIO_DECODER_IMPL_H_
diff --git a/modules/audio_coding/neteq/audio_decoder_unittest.cc b/modules/audio_coding/neteq/audio_decoder_unittest.cc
deleted file mode 100644
index f6ae2dd..0000000
--- a/modules/audio_coding/neteq/audio_decoder_unittest.cc
+++ /dev/null
@@ -1,693 +0,0 @@
-/*
- *  Copyright (c) 2012 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/neteq/audio_decoder_impl.h"
-
-#include <assert.h>
-#include <stdlib.h>
-
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "webrtc/api/audio_codecs/opus/audio_encoder_opus.h"
-#include "webrtc/modules/audio_coding/codecs/g711/audio_decoder_pcm.h"
-#include "webrtc/modules/audio_coding/codecs/g711/audio_encoder_pcm.h"
-#include "webrtc/modules/audio_coding/codecs/g722/audio_decoder_g722.h"
-#include "webrtc/modules/audio_coding/codecs/g722/audio_encoder_g722.h"
-#include "webrtc/modules/audio_coding/codecs/ilbc/audio_decoder_ilbc.h"
-#include "webrtc/modules/audio_coding/codecs/ilbc/audio_encoder_ilbc.h"
-#include "webrtc/modules/audio_coding/codecs/isac/fix/include/audio_decoder_isacfix.h"
-#include "webrtc/modules/audio_coding/codecs/isac/fix/include/audio_encoder_isacfix.h"
-#include "webrtc/modules/audio_coding/codecs/isac/main/include/audio_decoder_isac.h"
-#include "webrtc/modules/audio_coding/codecs/isac/main/include/audio_encoder_isac.h"
-#include "webrtc/modules/audio_coding/codecs/opus/audio_decoder_opus.h"
-#include "webrtc/modules/audio_coding/codecs/pcm16b/audio_decoder_pcm16b.h"
-#include "webrtc/modules/audio_coding/codecs/pcm16b/audio_encoder_pcm16b.h"
-#include "webrtc/modules/audio_coding/neteq/tools/resample_input_audio_file.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/testsupport/fileutils.h"
-
-namespace webrtc {
-
-namespace {
-// The absolute difference between the input and output (the first channel) is
-// compared vs |tolerance|. The parameter |delay| is used to correct for codec
-// delays.
-void CompareInputOutput(const std::vector<int16_t>& input,
-                        const std::vector<int16_t>& output,
-                        size_t num_samples,
-                        size_t channels,
-                        int tolerance,
-                        int delay) {
-  ASSERT_LE(num_samples, input.size());
-  ASSERT_LE(num_samples * channels, output.size());
-  for (unsigned int n = 0; n < num_samples - delay; ++n) {
-    ASSERT_NEAR(input[n], output[channels * n + delay], tolerance)
-        << "Exit test on first diff; n = " << n;
-  }
-}
-
-// The absolute difference between the first two channels in |output| is
-// compared vs |tolerance|.
-void CompareTwoChannels(const std::vector<int16_t>& output,
-                        size_t samples_per_channel,
-                        size_t channels,
-                        int tolerance) {
-  ASSERT_GE(channels, 2u);
-  ASSERT_LE(samples_per_channel * channels, output.size());
-  for (unsigned int n = 0; n < samples_per_channel; ++n)
-    ASSERT_NEAR(output[channels * n], output[channels * n + 1], tolerance)
-        << "Stereo samples differ.";
-}
-
-// Calculates mean-squared error between input and output (the first channel).
-// The parameter |delay| is used to correct for codec delays.
-double MseInputOutput(const std::vector<int16_t>& input,
-                      const std::vector<int16_t>& output,
-                      size_t num_samples,
-                      size_t channels,
-                      int delay) {
-  assert(delay < static_cast<int>(num_samples));
-  assert(num_samples <= input.size());
-  assert(num_samples * channels <= output.size());
-  if (num_samples == 0)
-    return 0.0;
-  double squared_sum = 0.0;
-  for (unsigned int n = 0; n < num_samples - delay; ++n) {
-    squared_sum += (input[n] - output[channels * n + delay]) *
-                   (input[n] - output[channels * n + delay]);
-  }
-  return squared_sum / (num_samples - delay);
-}
-}  // namespace
-
-class AudioDecoderTest : public ::testing::Test {
- protected:
-  AudioDecoderTest()
-      : input_audio_(
-            webrtc::test::ResourcePath("audio_coding/testfile32kHz", "pcm"),
-            32000),
-        codec_input_rate_hz_(32000),  // Legacy default value.
-        frame_size_(0),
-        data_length_(0),
-        channels_(1),
-        payload_type_(17),
-        decoder_(NULL) {}
-
-  virtual ~AudioDecoderTest() {}
-
-  virtual void SetUp() {
-    if (audio_encoder_)
-      codec_input_rate_hz_ = audio_encoder_->SampleRateHz();
-    // Create arrays.
-    ASSERT_GT(data_length_, 0u) << "The test must set data_length_ > 0";
-  }
-
-  virtual void TearDown() {
-    delete decoder_;
-    decoder_ = NULL;
-  }
-
-  virtual void InitEncoder() { }
-
-  // TODO(henrik.lundin) Change return type to size_t once most/all overriding
-  // implementations are gone.
-  virtual int EncodeFrame(const int16_t* input,
-                          size_t input_len_samples,
-                          rtc::Buffer* output) {
-    AudioEncoder::EncodedInfo encoded_info;
-    const size_t samples_per_10ms = audio_encoder_->SampleRateHz() / 100;
-    RTC_CHECK_EQ(samples_per_10ms * audio_encoder_->Num10MsFramesInNextPacket(),
-                 input_len_samples);
-    std::unique_ptr<int16_t[]> interleaved_input(
-        new int16_t[channels_ * samples_per_10ms]);
-    for (size_t i = 0; i < audio_encoder_->Num10MsFramesInNextPacket(); ++i) {
-      EXPECT_EQ(0u, encoded_info.encoded_bytes);
-
-      // Duplicate the mono input signal to however many channels the test
-      // wants.
-      test::InputAudioFile::DuplicateInterleaved(input + i * samples_per_10ms,
-                                                 samples_per_10ms, channels_,
-                                                 interleaved_input.get());
-
-      encoded_info = audio_encoder_->Encode(
-          0, rtc::ArrayView<const int16_t>(interleaved_input.get(),
-                                           audio_encoder_->NumChannels() *
-                                               audio_encoder_->SampleRateHz() /
-                                               100),
-          output);
-    }
-    EXPECT_EQ(payload_type_, encoded_info.payload_type);
-    return static_cast<int>(encoded_info.encoded_bytes);
-  }
-
-  // Encodes and decodes audio. The absolute difference between the input and
-  // output is compared vs |tolerance|, and the mean-squared error is compared
-  // with |mse|. The encoded stream should contain |expected_bytes|. For stereo
-  // audio, the absolute difference between the two channels is compared vs
-  // |channel_diff_tolerance|.
-  void EncodeDecodeTest(size_t expected_bytes, int tolerance, double mse,
-                        int delay = 0, int channel_diff_tolerance = 0) {
-    ASSERT_GE(tolerance, 0) << "Test must define a tolerance >= 0";
-    ASSERT_GE(channel_diff_tolerance, 0) <<
-        "Test must define a channel_diff_tolerance >= 0";
-    size_t processed_samples = 0u;
-    rtc::Buffer encoded;
-    size_t encoded_bytes = 0u;
-    InitEncoder();
-    std::vector<int16_t> input;
-    std::vector<int16_t> decoded;
-    while (processed_samples + frame_size_ <= data_length_) {
-      // Extend input vector with |frame_size_|.
-      input.resize(input.size() + frame_size_, 0);
-      // Read from input file.
-      ASSERT_GE(input.size() - processed_samples, frame_size_);
-      ASSERT_TRUE(input_audio_.Read(
-          frame_size_, codec_input_rate_hz_, &input[processed_samples]));
-      size_t enc_len = EncodeFrame(
-          &input[processed_samples], frame_size_, &encoded);
-      // Make sure that frame_size_ * channels_ samples are allocated and free.
-      decoded.resize((processed_samples + frame_size_) * channels_, 0);
-      AudioDecoder::SpeechType speech_type;
-      size_t dec_len = decoder_->Decode(
-          &encoded.data()[encoded_bytes], enc_len, codec_input_rate_hz_,
-          frame_size_ * channels_ * sizeof(int16_t),
-          &decoded[processed_samples * channels_], &speech_type);
-      EXPECT_EQ(frame_size_ * channels_, dec_len);
-      encoded_bytes += enc_len;
-      processed_samples += frame_size_;
-    }
-    // For some codecs it doesn't make sense to check expected number of bytes,
-    // since the number can vary for different platforms. Opus and iSAC are
-    // such codecs. In this case expected_bytes is set to 0.
-    if (expected_bytes) {
-      EXPECT_EQ(expected_bytes, encoded_bytes);
-    }
-    CompareInputOutput(
-        input, decoded, processed_samples, channels_, tolerance, delay);
-    if (channels_ == 2)
-      CompareTwoChannels(
-          decoded, processed_samples, channels_, channel_diff_tolerance);
-    EXPECT_LE(
-        MseInputOutput(input, decoded, processed_samples, channels_, delay),
-        mse);
-  }
-
-  // Encodes a payload and decodes it twice with decoder re-init before each
-  // decode. Verifies that the decoded result is the same.
-  void ReInitTest() {
-    InitEncoder();
-    std::unique_ptr<int16_t[]> input(new int16_t[frame_size_]);
-    ASSERT_TRUE(
-        input_audio_.Read(frame_size_, codec_input_rate_hz_, input.get()));
-    rtc::Buffer encoded;
-    size_t enc_len = EncodeFrame(input.get(), frame_size_, &encoded);
-    size_t dec_len;
-    AudioDecoder::SpeechType speech_type1, speech_type2;
-    decoder_->Reset();
-    std::unique_ptr<int16_t[]> output1(new int16_t[frame_size_ * channels_]);
-    dec_len = decoder_->Decode(encoded.data(), enc_len, codec_input_rate_hz_,
-                               frame_size_ * channels_ * sizeof(int16_t),
-                               output1.get(), &speech_type1);
-    ASSERT_LE(dec_len, frame_size_ * channels_);
-    EXPECT_EQ(frame_size_ * channels_, dec_len);
-    // Re-init decoder and decode again.
-    decoder_->Reset();
-    std::unique_ptr<int16_t[]> output2(new int16_t[frame_size_ * channels_]);
-    dec_len = decoder_->Decode(encoded.data(), enc_len, codec_input_rate_hz_,
-                               frame_size_ * channels_ * sizeof(int16_t),
-                               output2.get(), &speech_type2);
-    ASSERT_LE(dec_len, frame_size_ * channels_);
-    EXPECT_EQ(frame_size_ * channels_, dec_len);
-    for (unsigned int n = 0; n < frame_size_; ++n) {
-      ASSERT_EQ(output1[n], output2[n]) << "Exit test on first diff; n = " << n;
-    }
-    EXPECT_EQ(speech_type1, speech_type2);
-  }
-
-  // Call DecodePlc and verify that the correct number of samples is produced.
-  void DecodePlcTest() {
-    InitEncoder();
-    std::unique_ptr<int16_t[]> input(new int16_t[frame_size_]);
-    ASSERT_TRUE(
-        input_audio_.Read(frame_size_, codec_input_rate_hz_, input.get()));
-    rtc::Buffer encoded;
-    size_t enc_len = EncodeFrame(input.get(), frame_size_, &encoded);
-    AudioDecoder::SpeechType speech_type;
-    decoder_->Reset();
-    std::unique_ptr<int16_t[]> output(new int16_t[frame_size_ * channels_]);
-    size_t dec_len = decoder_->Decode(encoded.data(), enc_len,
-                                      codec_input_rate_hz_,
-                                      frame_size_ * channels_ * sizeof(int16_t),
-                                      output.get(), &speech_type);
-    EXPECT_EQ(frame_size_ * channels_, dec_len);
-    // Call DecodePlc and verify that we get one frame of data.
-    // (Overwrite the output from the above Decode call, but that does not
-    // matter.)
-    dec_len = decoder_->DecodePlc(1, output.get());
-    EXPECT_EQ(frame_size_ * channels_, dec_len);
-  }
-
-  test::ResampleInputAudioFile input_audio_;
-  int codec_input_rate_hz_;
-  size_t frame_size_;
-  size_t data_length_;
-  size_t channels_;
-  const int payload_type_;
-  AudioDecoder* decoder_;
-  std::unique_ptr<AudioEncoder> audio_encoder_;
-};
-
-class AudioDecoderPcmUTest : public AudioDecoderTest {
- protected:
-  AudioDecoderPcmUTest() : AudioDecoderTest() {
-    frame_size_ = 160;
-    data_length_ = 10 * frame_size_;
-    decoder_ = new AudioDecoderPcmU(1);
-    AudioEncoderPcmU::Config config;
-    config.frame_size_ms = static_cast<int>(frame_size_ / 8);
-    config.payload_type = payload_type_;
-    audio_encoder_.reset(new AudioEncoderPcmU(config));
-  }
-};
-
-class AudioDecoderPcmATest : public AudioDecoderTest {
- protected:
-  AudioDecoderPcmATest() : AudioDecoderTest() {
-    frame_size_ = 160;
-    data_length_ = 10 * frame_size_;
-    decoder_ = new AudioDecoderPcmA(1);
-    AudioEncoderPcmA::Config config;
-    config.frame_size_ms = static_cast<int>(frame_size_ / 8);
-    config.payload_type = payload_type_;
-    audio_encoder_.reset(new AudioEncoderPcmA(config));
-  }
-};
-
-class AudioDecoderPcm16BTest : public AudioDecoderTest {
- protected:
-  AudioDecoderPcm16BTest() : AudioDecoderTest() {
-    codec_input_rate_hz_ = 16000;
-    frame_size_ = 20 * codec_input_rate_hz_ / 1000;
-    data_length_ = 10 * frame_size_;
-    decoder_ = new AudioDecoderPcm16B(codec_input_rate_hz_, 1);
-    assert(decoder_);
-    AudioEncoderPcm16B::Config config;
-    config.sample_rate_hz = codec_input_rate_hz_;
-    config.frame_size_ms =
-        static_cast<int>(frame_size_ / (config.sample_rate_hz / 1000));
-    config.payload_type = payload_type_;
-    audio_encoder_.reset(new AudioEncoderPcm16B(config));
-  }
-};
-
-class AudioDecoderIlbcTest : public AudioDecoderTest {
- protected:
-  AudioDecoderIlbcTest() : AudioDecoderTest() {
-    codec_input_rate_hz_ = 8000;
-    frame_size_ = 240;
-    data_length_ = 10 * frame_size_;
-    decoder_ = new AudioDecoderIlbcImpl;
-    assert(decoder_);
-    AudioEncoderIlbcConfig config;
-    config.frame_size_ms = 30;
-    audio_encoder_.reset(new AudioEncoderIlbcImpl(config, payload_type_));
-  }
-
-  // Overload the default test since iLBC's function WebRtcIlbcfix_NetEqPlc does
-  // not return any data. It simply resets a few states and returns 0.
-  void DecodePlcTest() {
-    InitEncoder();
-    std::unique_ptr<int16_t[]> input(new int16_t[frame_size_]);
-    ASSERT_TRUE(
-        input_audio_.Read(frame_size_, codec_input_rate_hz_, input.get()));
-    rtc::Buffer encoded;
-    size_t enc_len = EncodeFrame(input.get(), frame_size_, &encoded);
-    AudioDecoder::SpeechType speech_type;
-    decoder_->Reset();
-    std::unique_ptr<int16_t[]> output(new int16_t[frame_size_ * channels_]);
-    size_t dec_len = decoder_->Decode(encoded.data(), enc_len,
-                                      codec_input_rate_hz_,
-                                      frame_size_ * channels_ * sizeof(int16_t),
-                                      output.get(), &speech_type);
-    EXPECT_EQ(frame_size_, dec_len);
-    // Simply call DecodePlc and verify that we get 0 as return value.
-    EXPECT_EQ(0U, decoder_->DecodePlc(1, output.get()));
-  }
-};
-
-class AudioDecoderIsacFloatTest : public AudioDecoderTest {
- protected:
-  AudioDecoderIsacFloatTest() : AudioDecoderTest() {
-    codec_input_rate_hz_ = 16000;
-    frame_size_ = 480;
-    data_length_ = 10 * frame_size_;
-    AudioEncoderIsacFloatImpl::Config config;
-    config.payload_type = payload_type_;
-    config.sample_rate_hz = codec_input_rate_hz_;
-    config.adaptive_mode = false;
-    config.frame_size_ms =
-        1000 * static_cast<int>(frame_size_) / codec_input_rate_hz_;
-    audio_encoder_.reset(new AudioEncoderIsacFloatImpl(config));
-    decoder_ = new AudioDecoderIsacFloatImpl(codec_input_rate_hz_);
-  }
-};
-
-class AudioDecoderIsacSwbTest : public AudioDecoderTest {
- protected:
-  AudioDecoderIsacSwbTest() : AudioDecoderTest() {
-    codec_input_rate_hz_ = 32000;
-    frame_size_ = 960;
-    data_length_ = 10 * frame_size_;
-    AudioEncoderIsacFloatImpl::Config config;
-    config.payload_type = payload_type_;
-    config.sample_rate_hz = codec_input_rate_hz_;
-    config.adaptive_mode = false;
-    config.frame_size_ms =
-        1000 * static_cast<int>(frame_size_) / codec_input_rate_hz_;
-    audio_encoder_.reset(new AudioEncoderIsacFloatImpl(config));
-    decoder_ = new AudioDecoderIsacFloatImpl(codec_input_rate_hz_);
-  }
-};
-
-class AudioDecoderIsacFixTest : public AudioDecoderTest {
- protected:
-  AudioDecoderIsacFixTest() : AudioDecoderTest() {
-    codec_input_rate_hz_ = 16000;
-    frame_size_ = 480;
-    data_length_ = 10 * frame_size_;
-    AudioEncoderIsacFixImpl::Config config;
-    config.payload_type = payload_type_;
-    config.sample_rate_hz = codec_input_rate_hz_;
-    config.adaptive_mode = false;
-    config.frame_size_ms =
-        1000 * static_cast<int>(frame_size_) / codec_input_rate_hz_;
-    audio_encoder_.reset(new AudioEncoderIsacFixImpl(config));
-    decoder_ = new AudioDecoderIsacFixImpl(codec_input_rate_hz_);
-  }
-};
-
-class AudioDecoderG722Test : public AudioDecoderTest {
- protected:
-  AudioDecoderG722Test() : AudioDecoderTest() {
-    codec_input_rate_hz_ = 16000;
-    frame_size_ = 160;
-    data_length_ = 10 * frame_size_;
-    decoder_ = new AudioDecoderG722Impl;
-    assert(decoder_);
-    AudioEncoderG722Config config;
-    config.frame_size_ms = 10;
-    config.num_channels = 1;
-    audio_encoder_.reset(new AudioEncoderG722Impl(config, payload_type_));
-  }
-};
-
-class AudioDecoderG722StereoTest : public AudioDecoderTest {
- protected:
-  AudioDecoderG722StereoTest() : AudioDecoderTest() {
-    channels_ = 2;
-    codec_input_rate_hz_ = 16000;
-    frame_size_ = 160;
-    data_length_ = 10 * frame_size_;
-    decoder_ = new AudioDecoderG722StereoImpl;
-    assert(decoder_);
-    AudioEncoderG722Config config;
-    config.frame_size_ms = 10;
-    config.num_channels = 2;
-    audio_encoder_.reset(new AudioEncoderG722Impl(config, payload_type_));
-  }
-};
-
-class AudioDecoderOpusTest : public AudioDecoderTest {
- protected:
-  AudioDecoderOpusTest() : AudioDecoderTest() {
-    codec_input_rate_hz_ = 48000;
-    frame_size_ = 480;
-    data_length_ = 10 * frame_size_;
-    decoder_ = new AudioDecoderOpusImpl(1);
-    AudioEncoderOpusConfig config;
-    config.frame_size_ms = static_cast<int>(frame_size_) / 48;
-    config.application = AudioEncoderOpusConfig::ApplicationMode::kVoip;
-    audio_encoder_ = AudioEncoderOpus::MakeAudioEncoder(config, payload_type_);
-  }
-};
-
-class AudioDecoderOpusStereoTest : public AudioDecoderOpusTest {
- protected:
-  AudioDecoderOpusStereoTest() : AudioDecoderOpusTest() {
-    channels_ = 2;
-    delete decoder_;
-    decoder_ = new AudioDecoderOpusImpl(2);
-    AudioEncoderOpusConfig config;
-    config.frame_size_ms = static_cast<int>(frame_size_) / 48;
-    config.num_channels = 2;
-    config.application = AudioEncoderOpusConfig::ApplicationMode::kAudio;
-    audio_encoder_ = AudioEncoderOpus::MakeAudioEncoder(config, payload_type_);
-  }
-};
-
-TEST_F(AudioDecoderPcmUTest, EncodeDecode) {
-  int tolerance = 251;
-  double mse = 1734.0;
-  EncodeDecodeTest(data_length_, tolerance, mse);
-  ReInitTest();
-  EXPECT_FALSE(decoder_->HasDecodePlc());
-}
-
-namespace {
-int SetAndGetTargetBitrate(AudioEncoder* audio_encoder, int rate) {
-  audio_encoder->OnReceivedUplinkBandwidth(rate, rtc::Optional<int64_t>());
-  return audio_encoder->GetTargetBitrate();
-}
-void TestSetAndGetTargetBitratesWithFixedCodec(AudioEncoder* audio_encoder,
-                                               int fixed_rate) {
-  EXPECT_EQ(fixed_rate, SetAndGetTargetBitrate(audio_encoder, 32000));
-  EXPECT_EQ(fixed_rate, SetAndGetTargetBitrate(audio_encoder, fixed_rate - 1));
-  EXPECT_EQ(fixed_rate, SetAndGetTargetBitrate(audio_encoder, fixed_rate));
-  EXPECT_EQ(fixed_rate, SetAndGetTargetBitrate(audio_encoder, fixed_rate + 1));
-}
-}  // namespace
-
-TEST_F(AudioDecoderPcmUTest, SetTargetBitrate) {
-  TestSetAndGetTargetBitratesWithFixedCodec(audio_encoder_.get(), 64000);
-}
-
-TEST_F(AudioDecoderPcmATest, EncodeDecode) {
-  int tolerance = 308;
-  double mse = 1931.0;
-  EncodeDecodeTest(data_length_, tolerance, mse);
-  ReInitTest();
-  EXPECT_FALSE(decoder_->HasDecodePlc());
-}
-
-TEST_F(AudioDecoderPcmATest, SetTargetBitrate) {
-  TestSetAndGetTargetBitratesWithFixedCodec(audio_encoder_.get(), 64000);
-}
-
-TEST_F(AudioDecoderPcm16BTest, EncodeDecode) {
-  int tolerance = 0;
-  double mse = 0.0;
-  EncodeDecodeTest(2 * data_length_, tolerance, mse);
-  ReInitTest();
-  EXPECT_FALSE(decoder_->HasDecodePlc());
-}
-
-TEST_F(AudioDecoderPcm16BTest, SetTargetBitrate) {
-  TestSetAndGetTargetBitratesWithFixedCodec(audio_encoder_.get(),
-                                            codec_input_rate_hz_ * 16);
-}
-
-TEST_F(AudioDecoderIlbcTest, EncodeDecode) {
-  int tolerance = 6808;
-  double mse = 2.13e6;
-  int delay = 80;  // Delay from input to output.
-  EncodeDecodeTest(500, tolerance, mse, delay);
-  ReInitTest();
-  EXPECT_TRUE(decoder_->HasDecodePlc());
-  DecodePlcTest();
-}
-
-TEST_F(AudioDecoderIlbcTest, SetTargetBitrate) {
-  TestSetAndGetTargetBitratesWithFixedCodec(audio_encoder_.get(), 13333);
-}
-
-TEST_F(AudioDecoderIsacFloatTest, EncodeDecode) {
-  int tolerance = 3399;
-  double mse = 434951.0;
-  int delay = 48;  // Delay from input to output.
-  EncodeDecodeTest(0, tolerance, mse, delay);
-  ReInitTest();
-  EXPECT_FALSE(decoder_->HasDecodePlc());
-}
-
-TEST_F(AudioDecoderIsacFloatTest, SetTargetBitrate) {
-  TestSetAndGetTargetBitratesWithFixedCodec(audio_encoder_.get(), 32000);
-}
-
-TEST_F(AudioDecoderIsacSwbTest, EncodeDecode) {
-  int tolerance = 19757;
-  double mse = 8.18e6;
-  int delay = 160;  // Delay from input to output.
-  EncodeDecodeTest(0, tolerance, mse, delay);
-  ReInitTest();
-  EXPECT_FALSE(decoder_->HasDecodePlc());
-}
-
-TEST_F(AudioDecoderIsacSwbTest, SetTargetBitrate) {
-  TestSetAndGetTargetBitratesWithFixedCodec(audio_encoder_.get(), 32000);
-}
-
-TEST_F(AudioDecoderIsacFixTest, EncodeDecode) {
-  int tolerance = 11034;
-  double mse = 3.46e6;
-  int delay = 54;  // Delay from input to output.
-#if defined(WEBRTC_ANDROID) && defined(WEBRTC_ARCH_ARM)
-  static const int kEncodedBytes = 685;
-#elif defined(WEBRTC_ANDROID) && defined(WEBRTC_ARCH_ARM64)
-  static const int kEncodedBytes = 673;
-#else
-  static const int kEncodedBytes = 671;
-#endif
-  EncodeDecodeTest(kEncodedBytes, tolerance, mse, delay);
-  ReInitTest();
-  EXPECT_FALSE(decoder_->HasDecodePlc());
-}
-
-TEST_F(AudioDecoderIsacFixTest, SetTargetBitrate) {
-  TestSetAndGetTargetBitratesWithFixedCodec(audio_encoder_.get(), 32000);
-}
-
-TEST_F(AudioDecoderG722Test, EncodeDecode) {
-  int tolerance = 6176;
-  double mse = 238630.0;
-  int delay = 22;  // Delay from input to output.
-  EncodeDecodeTest(data_length_ / 2, tolerance, mse, delay);
-  ReInitTest();
-  EXPECT_FALSE(decoder_->HasDecodePlc());
-}
-
-TEST_F(AudioDecoderG722Test, SetTargetBitrate) {
-  TestSetAndGetTargetBitratesWithFixedCodec(audio_encoder_.get(), 64000);
-}
-
-TEST_F(AudioDecoderG722StereoTest, EncodeDecode) {
-  int tolerance = 6176;
-  int channel_diff_tolerance = 0;
-  double mse = 238630.0;
-  int delay = 22;  // Delay from input to output.
-  EncodeDecodeTest(data_length_, tolerance, mse, delay, channel_diff_tolerance);
-  ReInitTest();
-  EXPECT_FALSE(decoder_->HasDecodePlc());
-}
-
-TEST_F(AudioDecoderG722StereoTest, SetTargetBitrate) {
-  TestSetAndGetTargetBitratesWithFixedCodec(audio_encoder_.get(), 128000);
-}
-
-TEST_F(AudioDecoderOpusTest, EncodeDecode) {
-  int tolerance = 6176;
-  double mse = 238630.0;
-  int delay = 22;  // Delay from input to output.
-  EncodeDecodeTest(0, tolerance, mse, delay);
-  ReInitTest();
-  EXPECT_FALSE(decoder_->HasDecodePlc());
-}
-
-namespace {
-void TestOpusSetTargetBitrates(AudioEncoder* audio_encoder) {
-  EXPECT_EQ(6000, SetAndGetTargetBitrate(audio_encoder, 5999));
-  EXPECT_EQ(6000, SetAndGetTargetBitrate(audio_encoder, 6000));
-  EXPECT_EQ(32000, SetAndGetTargetBitrate(audio_encoder, 32000));
-  EXPECT_EQ(510000, SetAndGetTargetBitrate(audio_encoder, 510000));
-  EXPECT_EQ(510000, SetAndGetTargetBitrate(audio_encoder, 511000));
-}
-}  // namespace
-
-TEST_F(AudioDecoderOpusTest, SetTargetBitrate) {
-  TestOpusSetTargetBitrates(audio_encoder_.get());
-}
-
-TEST_F(AudioDecoderOpusStereoTest, EncodeDecode) {
-  int tolerance = 6176;
-  int channel_diff_tolerance = 0;
-  double mse = 238630.0;
-  int delay = 22;  // Delay from input to output.
-  EncodeDecodeTest(0, tolerance, mse, delay, channel_diff_tolerance);
-  ReInitTest();
-  EXPECT_FALSE(decoder_->HasDecodePlc());
-}
-
-TEST_F(AudioDecoderOpusStereoTest, SetTargetBitrate) {
-  TestOpusSetTargetBitrates(audio_encoder_.get());
-}
-
-namespace {
-#ifdef WEBRTC_CODEC_ILBC
-const bool has_ilbc = true;
-#else
-const bool has_ilbc = false;
-#endif
-#if defined(WEBRTC_CODEC_ISAC) || defined(WEBRTC_CODEC_ISACFX)
-const bool has_isac = true;
-#else
-const bool has_isac = false;
-#endif
-#ifdef WEBRTC_CODEC_ISAC
-const bool has_isac_swb = true;
-#else
-const bool has_isac_swb = false;
-#endif
-#ifdef WEBRTC_CODEC_G722
-const bool has_g722 = true;
-#else
-const bool has_g722 = false;
-#endif
-#ifdef WEBRTC_CODEC_OPUS
-const bool has_opus = true;
-#else
-const bool has_opus = false;
-#endif
-}  // namespace
-
-TEST(AudioDecoder, CodecSupported) {
-  EXPECT_TRUE(CodecSupported(NetEqDecoder::kDecoderPCMu));
-  EXPECT_TRUE(CodecSupported(NetEqDecoder::kDecoderPCMa));
-  EXPECT_TRUE(CodecSupported(NetEqDecoder::kDecoderPCMu_2ch));
-  EXPECT_TRUE(CodecSupported(NetEqDecoder::kDecoderPCMa_2ch));
-  EXPECT_EQ(has_ilbc, CodecSupported(NetEqDecoder::kDecoderILBC));
-  EXPECT_EQ(has_isac, CodecSupported(NetEqDecoder::kDecoderISAC));
-  EXPECT_EQ(has_isac_swb, CodecSupported(NetEqDecoder::kDecoderISACswb));
-  EXPECT_TRUE(CodecSupported(NetEqDecoder::kDecoderPCM16B));
-  EXPECT_TRUE(CodecSupported(NetEqDecoder::kDecoderPCM16Bwb));
-  EXPECT_TRUE(CodecSupported(NetEqDecoder::kDecoderPCM16Bswb32kHz));
-  EXPECT_TRUE(CodecSupported(NetEqDecoder::kDecoderPCM16Bswb48kHz));
-  EXPECT_TRUE(CodecSupported(NetEqDecoder::kDecoderPCM16B_2ch));
-  EXPECT_TRUE(CodecSupported(NetEqDecoder::kDecoderPCM16Bwb_2ch));
-  EXPECT_TRUE(CodecSupported(NetEqDecoder::kDecoderPCM16Bswb32kHz_2ch));
-  EXPECT_TRUE(CodecSupported(NetEqDecoder::kDecoderPCM16Bswb48kHz_2ch));
-  EXPECT_TRUE(CodecSupported(NetEqDecoder::kDecoderPCM16B_5ch));
-  EXPECT_EQ(has_g722, CodecSupported(NetEqDecoder::kDecoderG722));
-  EXPECT_EQ(has_g722, CodecSupported(NetEqDecoder::kDecoderG722_2ch));
-  EXPECT_TRUE(CodecSupported(NetEqDecoder::kDecoderRED));
-  EXPECT_TRUE(CodecSupported(NetEqDecoder::kDecoderAVT));
-  EXPECT_TRUE(CodecSupported(NetEqDecoder::kDecoderAVT16kHz));
-  EXPECT_TRUE(CodecSupported(NetEqDecoder::kDecoderAVT32kHz));
-  EXPECT_TRUE(CodecSupported(NetEqDecoder::kDecoderAVT48kHz));
-  EXPECT_TRUE(CodecSupported(NetEqDecoder::kDecoderCNGnb));
-  EXPECT_TRUE(CodecSupported(NetEqDecoder::kDecoderCNGwb));
-  EXPECT_TRUE(CodecSupported(NetEqDecoder::kDecoderCNGswb32kHz));
-  EXPECT_TRUE(CodecSupported(NetEqDecoder::kDecoderCNGswb48kHz));
-  EXPECT_TRUE(CodecSupported(NetEqDecoder::kDecoderArbitrary));
-  EXPECT_EQ(has_opus, CodecSupported(NetEqDecoder::kDecoderOpus));
-  EXPECT_EQ(has_opus, CodecSupported(NetEqDecoder::kDecoderOpus_2ch));
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/neteq/audio_multi_vector.cc b/modules/audio_coding/neteq/audio_multi_vector.cc
deleted file mode 100644
index 8263752..0000000
--- a/modules/audio_coding/neteq/audio_multi_vector.cc
+++ /dev/null
@@ -1,222 +0,0 @@
-/*
- *  Copyright (c) 2012 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/neteq/audio_multi_vector.h"
-
-#include <assert.h>
-
-#include <algorithm>
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-AudioMultiVector::AudioMultiVector(size_t N) {
-  assert(N > 0);
-  if (N < 1) N = 1;
-  for (size_t n = 0; n < N; ++n) {
-    channels_.push_back(new AudioVector);
-  }
-  num_channels_ = N;
-}
-
-AudioMultiVector::AudioMultiVector(size_t N, size_t initial_size) {
-  assert(N > 0);
-  if (N < 1) N = 1;
-  for (size_t n = 0; n < N; ++n) {
-    channels_.push_back(new AudioVector(initial_size));
-  }
-  num_channels_ = N;
-}
-
-AudioMultiVector::~AudioMultiVector() {
-  std::vector<AudioVector*>::iterator it = channels_.begin();
-  while (it != channels_.end()) {
-    delete (*it);
-    ++it;
-  }
-}
-
-void AudioMultiVector::Clear() {
-  for (size_t i = 0; i < num_channels_; ++i) {
-    channels_[i]->Clear();
-  }
-}
-
-void AudioMultiVector::Zeros(size_t length) {
-  for (size_t i = 0; i < num_channels_; ++i) {
-    channels_[i]->Clear();
-    channels_[i]->Extend(length);
-  }
-}
-
-void AudioMultiVector::CopyTo(AudioMultiVector* copy_to) const {
-  if (copy_to) {
-    for (size_t i = 0; i < num_channels_; ++i) {
-      channels_[i]->CopyTo(&(*copy_to)[i]);
-    }
-  }
-}
-
-void AudioMultiVector::PushBackInterleaved(const int16_t* append_this,
-                                           size_t length) {
-  assert(length % num_channels_ == 0);
-  if (num_channels_ == 1) {
-    // Special case to avoid extra allocation and data shuffling.
-    channels_[0]->PushBack(append_this, length);
-    return;
-  }
-  size_t length_per_channel = length / num_channels_;
-  int16_t* temp_array = new int16_t[length_per_channel];  // Temporary storage.
-  for (size_t channel = 0; channel < num_channels_; ++channel) {
-    // Copy elements to |temp_array|.
-    // Set |source_ptr| to first element of this channel.
-    const int16_t* source_ptr = &append_this[channel];
-    for (size_t i = 0; i < length_per_channel; ++i) {
-      temp_array[i] = *source_ptr;
-      source_ptr += num_channels_;  // Jump to next element of this channel.
-    }
-    channels_[channel]->PushBack(temp_array, length_per_channel);
-  }
-  delete [] temp_array;
-}
-
-void AudioMultiVector::PushBack(const AudioMultiVector& append_this) {
-  assert(num_channels_ == append_this.num_channels_);
-  if (num_channels_ == append_this.num_channels_) {
-    for (size_t i = 0; i < num_channels_; ++i) {
-      channels_[i]->PushBack(append_this[i]);
-    }
-  }
-}
-
-void AudioMultiVector::PushBackFromIndex(const AudioMultiVector& append_this,
-                                         size_t index) {
-  assert(index < append_this.Size());
-  index = std::min(index, append_this.Size() - 1);
-  size_t length = append_this.Size() - index;
-  assert(num_channels_ == append_this.num_channels_);
-  if (num_channels_ == append_this.num_channels_) {
-    for (size_t i = 0; i < num_channels_; ++i) {
-      channels_[i]->PushBack(append_this[i], length, index);
-    }
-  }
-}
-
-void AudioMultiVector::PopFront(size_t length) {
-  for (size_t i = 0; i < num_channels_; ++i) {
-    channels_[i]->PopFront(length);
-  }
-}
-
-void AudioMultiVector::PopBack(size_t length) {
-  for (size_t i = 0; i < num_channels_; ++i) {
-    channels_[i]->PopBack(length);
-  }
-}
-
-size_t AudioMultiVector::ReadInterleaved(size_t length,
-                                         int16_t* destination) const {
-  return ReadInterleavedFromIndex(0, length, destination);
-}
-
-size_t AudioMultiVector::ReadInterleavedFromIndex(size_t start_index,
-                                                  size_t length,
-                                                  int16_t* destination) const {
-  RTC_DCHECK(destination);
-  size_t index = 0;  // Number of elements written to |destination| so far.
-  RTC_DCHECK_LE(start_index, Size());
-  start_index = std::min(start_index, Size());
-  if (length + start_index > Size()) {
-    length = Size() - start_index;
-  }
-  if (num_channels_ == 1) {
-    // Special case to avoid the nested for loop below.
-    (*this)[0].CopyTo(length, start_index, destination);
-    return length;
-  }
-  for (size_t i = 0; i < length; ++i) {
-    for (size_t channel = 0; channel < num_channels_; ++channel) {
-      destination[index] = (*this)[channel][i + start_index];
-      ++index;
-    }
-  }
-  return index;
-}
-
-size_t AudioMultiVector::ReadInterleavedFromEnd(size_t length,
-                                                int16_t* destination) const {
-  length = std::min(length, Size());  // Cannot read more than Size() elements.
-  return ReadInterleavedFromIndex(Size() - length, length, destination);
-}
-
-void AudioMultiVector::OverwriteAt(const AudioMultiVector& insert_this,
-                                   size_t length,
-                                   size_t position) {
-  assert(num_channels_ == insert_this.num_channels_);
-  // Cap |length| at the length of |insert_this|.
-  assert(length <= insert_this.Size());
-  length = std::min(length, insert_this.Size());
-  if (num_channels_ == insert_this.num_channels_) {
-    for (size_t i = 0; i < num_channels_; ++i) {
-      channels_[i]->OverwriteAt(insert_this[i], length, position);
-    }
-  }
-}
-
-void AudioMultiVector::CrossFade(const AudioMultiVector& append_this,
-                                 size_t fade_length) {
-  assert(num_channels_ == append_this.num_channels_);
-  if (num_channels_ == append_this.num_channels_) {
-    for (size_t i = 0; i < num_channels_; ++i) {
-      channels_[i]->CrossFade(append_this[i], fade_length);
-    }
-  }
-}
-
-size_t AudioMultiVector::Channels() const {
-  return num_channels_;
-}
-
-size_t AudioMultiVector::Size() const {
-  assert(channels_[0]);
-  return channels_[0]->Size();
-}
-
-void AudioMultiVector::AssertSize(size_t required_size) {
-  if (Size() < required_size) {
-    size_t extend_length = required_size - Size();
-    for (size_t channel = 0; channel < num_channels_; ++channel) {
-      channels_[channel]->Extend(extend_length);
-    }
-  }
-}
-
-bool AudioMultiVector::Empty() const {
-  assert(channels_[0]);
-  return channels_[0]->Empty();
-}
-
-void AudioMultiVector::CopyChannel(size_t from_channel, size_t to_channel) {
-  assert(from_channel < num_channels_);
-  assert(to_channel < num_channels_);
-  channels_[from_channel]->CopyTo(channels_[to_channel]);
-}
-
-const AudioVector& AudioMultiVector::operator[](size_t index) const {
-  return *(channels_[index]);
-}
-
-AudioVector& AudioMultiVector::operator[](size_t index) {
-  return *(channels_[index]);
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/neteq/audio_multi_vector.h b/modules/audio_coding/neteq/audio_multi_vector.h
deleted file mode 100644
index b6f1d39..0000000
--- a/modules/audio_coding/neteq/audio_multi_vector.h
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- *  Copyright (c) 2012 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_NETEQ_AUDIO_MULTI_VECTOR_H_
-#define WEBRTC_MODULES_AUDIO_CODING_NETEQ_AUDIO_MULTI_VECTOR_H_
-
-#include <string.h>  // Access to size_t.
-
-#include <vector>
-
-#include "webrtc/modules/audio_coding/neteq/audio_vector.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-class AudioMultiVector {
- public:
-  // Creates an empty AudioMultiVector with |N| audio channels. |N| must be
-  // larger than 0.
-  explicit AudioMultiVector(size_t N);
-
-  // Creates an AudioMultiVector with |N| audio channels, each channel having
-  // an initial size. |N| must be larger than 0.
-  AudioMultiVector(size_t N, size_t initial_size);
-
-  virtual ~AudioMultiVector();
-
-  // Deletes all values and make the vector empty.
-  virtual void Clear();
-
-  // Clears the vector and inserts |length| zeros into each channel.
-  virtual void Zeros(size_t length);
-
-  // Copies all values from this vector to |copy_to|. Any contents in |copy_to|
-  // are deleted. After the operation is done, |copy_to| will be an exact
-  // replica of this object. The source and the destination must have the same
-  // number of channels.
-  virtual void CopyTo(AudioMultiVector* copy_to) const;
-
-  // Appends the contents of array |append_this| to the end of this
-  // object. The array is assumed to be channel-interleaved. |length| must be
-  // an even multiple of this object's number of channels.
-  // The length of this object is increased with the |length| divided by the
-  // number of channels.
-  virtual void PushBackInterleaved(const int16_t* append_this, size_t length);
-
-  // Appends the contents of AudioMultiVector |append_this| to this object. The
-  // length of this object is increased with the length of |append_this|.
-  virtual void PushBack(const AudioMultiVector& append_this);
-
-  // Appends the contents of AudioMultiVector |append_this| to this object,
-  // taken from |index| up until the end of |append_this|. The length of this
-  // object is increased.
-  virtual void PushBackFromIndex(const AudioMultiVector& append_this,
-                                 size_t index);
-
-  // Removes |length| elements from the beginning of this object, from each
-  // channel.
-  virtual void PopFront(size_t length);
-
-  // Removes |length| elements from the end of this object, from each
-  // channel.
-  virtual void PopBack(size_t length);
-
-  // Reads |length| samples from each channel and writes them interleaved to
-  // |destination|. The total number of elements written to |destination| is
-  // returned, i.e., |length| * number of channels. If the AudioMultiVector
-  // contains less than |length| samples per channel, this is reflected in the
-  // return value.
-  virtual size_t ReadInterleaved(size_t length, int16_t* destination) const;
-
-  // Like ReadInterleaved() above, but reads from |start_index| instead of from
-  // the beginning.
-  virtual size_t ReadInterleavedFromIndex(size_t start_index,
-                                          size_t length,
-                                          int16_t* destination) const;
-
-  // Like ReadInterleaved() above, but reads from the end instead of from
-  // the beginning.
-  virtual size_t ReadInterleavedFromEnd(size_t length,
-                                        int16_t* destination) const;
-
-  // Overwrites each channel in this AudioMultiVector with values taken from
-  // |insert_this|. The values are taken from the beginning of |insert_this| and
-  // are inserted starting at |position|. |length| values are written into each
-  // channel. If |length| and |position| are selected such that the new data
-  // extends beyond the end of the current AudioVector, the vector is extended
-  // to accommodate the new data. |length| is limited to the length of
-  // |insert_this|.
-  virtual void OverwriteAt(const AudioMultiVector& insert_this,
-                           size_t length,
-                           size_t position);
-
-  // Appends |append_this| to the end of the current vector. Lets the two
-  // vectors overlap by |fade_length| samples (per channel), and cross-fade
-  // linearly in this region.
-  virtual void CrossFade(const AudioMultiVector& append_this,
-                         size_t fade_length);
-
-  // Returns the number of channels.
-  virtual size_t Channels() const;
-
-  // Returns the number of elements per channel in this AudioMultiVector.
-  virtual size_t Size() const;
-
-  // Verify that each channel can hold at least |required_size| elements. If
-  // not, extend accordingly.
-  virtual void AssertSize(size_t required_size);
-
-  virtual bool Empty() const;
-
-  // Copies the data between two channels in the AudioMultiVector. The method
-  // does not add any new channel. Thus, |from_channel| and |to_channel| must
-  // both be valid channel numbers.
-  virtual void CopyChannel(size_t from_channel, size_t to_channel);
-
-  // Accesses and modifies a channel (i.e., an AudioVector object) of this
-  // AudioMultiVector.
-  const AudioVector& operator[](size_t index) const;
-  AudioVector& operator[](size_t index);
-
- protected:
-  std::vector<AudioVector*> channels_;
-  size_t num_channels_;
-
- private:
-  RTC_DISALLOW_COPY_AND_ASSIGN(AudioMultiVector);
-};
-
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_AUDIO_CODING_NETEQ_AUDIO_MULTI_VECTOR_H_
diff --git a/modules/audio_coding/neteq/audio_multi_vector_unittest.cc b/modules/audio_coding/neteq/audio_multi_vector_unittest.cc
deleted file mode 100644
index af8d5f1..0000000
--- a/modules/audio_coding/neteq/audio_multi_vector_unittest.cc
+++ /dev/null
@@ -1,323 +0,0 @@
-/*
- *  Copyright (c) 2012 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/neteq/audio_multi_vector.h"
-
-#include <assert.h>
-#include <stdlib.h>
-
-#include <string>
-
-#include "webrtc/test/gtest.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-// This is a value-parameterized test. The test cases are instantiated with
-// different values for the test parameter, which is used to determine the
-// number of channels in the AudioMultiBuffer. Note that it is not possible
-// to combine typed testing with value-parameterized testing, and since the
-// tests for AudioVector already covers a number of different type parameters,
-// this test focuses on testing different number of channels, and keeping the
-// value type constant.
-
-class AudioMultiVectorTest : public ::testing::TestWithParam<size_t> {
- protected:
-  AudioMultiVectorTest()
-      : num_channels_(GetParam()),  // Get the test parameter.
-        interleaved_length_(num_channels_ * array_length()) {
-    array_interleaved_ = new int16_t[num_channels_ * array_length()];
-  }
-
-  ~AudioMultiVectorTest() {
-    delete [] array_interleaved_;
-  }
-
-  virtual void SetUp() {
-    // Populate test arrays.
-    for (size_t i = 0; i < array_length(); ++i) {
-      array_[i] = static_cast<int16_t>(i);
-    }
-    int16_t* ptr = array_interleaved_;
-    // Write 100, 101, 102, ... for first channel.
-    // Write 200, 201, 202, ... for second channel.
-    // And so on.
-    for (size_t i = 0; i < array_length(); ++i) {
-      for (size_t j = 1; j <= num_channels_; ++j) {
-        *ptr = j * 100 + i;
-        ++ptr;
-      }
-    }
-  }
-
-  size_t array_length() const {
-    return sizeof(array_) / sizeof(array_[0]);
-  }
-
-  const size_t num_channels_;
-  size_t interleaved_length_;
-  int16_t array_[10];
-  int16_t* array_interleaved_;
-};
-
-// Create and destroy AudioMultiVector objects, both empty and with a predefined
-// length.
-TEST_P(AudioMultiVectorTest, CreateAndDestroy) {
-  AudioMultiVector vec1(num_channels_);
-  EXPECT_TRUE(vec1.Empty());
-  EXPECT_EQ(num_channels_, vec1.Channels());
-  EXPECT_EQ(0u, vec1.Size());
-
-  size_t initial_size = 17;
-  AudioMultiVector vec2(num_channels_, initial_size);
-  EXPECT_FALSE(vec2.Empty());
-  EXPECT_EQ(num_channels_, vec2.Channels());
-  EXPECT_EQ(initial_size, vec2.Size());
-}
-
-// Test the subscript operator [] for getting and setting.
-TEST_P(AudioMultiVectorTest, SubscriptOperator) {
-  AudioMultiVector vec(num_channels_, array_length());
-  for (size_t channel = 0; channel < num_channels_; ++channel) {
-    for (size_t i = 0; i < array_length(); ++i) {
-      vec[channel][i] = static_cast<int16_t>(i);
-      // Make sure to use the const version.
-      const AudioVector& audio_vec = vec[channel];
-      EXPECT_EQ(static_cast<int16_t>(i), audio_vec[i]);
-    }
-  }
-}
-
-// Test the PushBackInterleaved method and the CopyFrom method. The Clear
-// method is also invoked.
-TEST_P(AudioMultiVectorTest, PushBackInterleavedAndCopy) {
-  AudioMultiVector vec(num_channels_);
-  vec.PushBackInterleaved(array_interleaved_, interleaved_length_);
-  AudioMultiVector vec_copy(num_channels_);
-  vec.CopyTo(&vec_copy);  // Copy from |vec| to |vec_copy|.
-  ASSERT_EQ(num_channels_, vec.Channels());
-  ASSERT_EQ(array_length(), vec.Size());
-  ASSERT_EQ(num_channels_, vec_copy.Channels());
-  ASSERT_EQ(array_length(), vec_copy.Size());
-  for (size_t channel = 0; channel < vec.Channels(); ++channel) {
-    for (size_t i = 0; i < array_length(); ++i) {
-      EXPECT_EQ(static_cast<int16_t>((channel + 1) * 100 + i), vec[channel][i]);
-      EXPECT_EQ(vec[channel][i], vec_copy[channel][i]);
-    }
-  }
-
-  // Clear |vec| and verify that it is empty.
-  vec.Clear();
-  EXPECT_TRUE(vec.Empty());
-
-  // Now copy the empty vector and verify that the copy becomes empty too.
-  vec.CopyTo(&vec_copy);
-  EXPECT_TRUE(vec_copy.Empty());
-}
-
-// Try to copy to a NULL pointer. Nothing should happen.
-TEST_P(AudioMultiVectorTest, CopyToNull) {
-  AudioMultiVector vec(num_channels_);
-  AudioMultiVector* vec_copy = NULL;
-  vec.PushBackInterleaved(array_interleaved_, interleaved_length_);
-  vec.CopyTo(vec_copy);
-}
-
-// Test the PushBack method with another AudioMultiVector as input argument.
-TEST_P(AudioMultiVectorTest, PushBackVector) {
-  AudioMultiVector vec1(num_channels_, array_length());
-  AudioMultiVector vec2(num_channels_, array_length());
-  // Set the first vector to [0, 1, ..., array_length() - 1] +
-  //   100 * channel_number.
-  // Set the second vector to [array_length(), array_length() + 1, ...,
-  //   2 * array_length() - 1] + 100 * channel_number.
-  for (size_t channel = 0; channel < num_channels_; ++channel) {
-    for (size_t i = 0; i < array_length(); ++i) {
-      vec1[channel][i] = static_cast<int16_t>(i + 100 * channel);
-      vec2[channel][i] =
-          static_cast<int16_t>(i + 100 * channel + array_length());
-    }
-  }
-  // Append vec2 to the back of vec1.
-  vec1.PushBack(vec2);
-  ASSERT_EQ(2u * array_length(), vec1.Size());
-  for (size_t channel = 0; channel < num_channels_; ++channel) {
-    for (size_t i = 0; i < 2 * array_length(); ++i) {
-      EXPECT_EQ(static_cast<int16_t>(i + 100 * channel), vec1[channel][i]);
-    }
-  }
-}
-
-// Test the PushBackFromIndex method.
-TEST_P(AudioMultiVectorTest, PushBackFromIndex) {
-  AudioMultiVector vec1(num_channels_);
-  vec1.PushBackInterleaved(array_interleaved_, interleaved_length_);
-  AudioMultiVector vec2(num_channels_);
-
-  // Append vec1 to the back of vec2 (which is empty). Read vec1 from the second
-  // last element.
-  vec2.PushBackFromIndex(vec1, array_length() - 2);
-  ASSERT_EQ(2u, vec2.Size());
-  for (size_t channel = 0; channel < num_channels_; ++channel) {
-    for (size_t i = 0; i < 2; ++i) {
-      EXPECT_EQ(array_interleaved_[channel + num_channels_ *
-                  (array_length() - 2 + i)], vec2[channel][i]);
-    }
-  }
-}
-
-// Starts with pushing some values to the vector, then test the Zeros method.
-TEST_P(AudioMultiVectorTest, Zeros) {
-  AudioMultiVector vec(num_channels_);
-  vec.PushBackInterleaved(array_interleaved_, interleaved_length_);
-  vec.Zeros(2 * array_length());
-  ASSERT_EQ(num_channels_, vec.Channels());
-  ASSERT_EQ(2u * array_length(), vec.Size());
-  for (size_t channel = 0; channel < num_channels_; ++channel) {
-    for (size_t i = 0; i < 2 * array_length(); ++i) {
-      EXPECT_EQ(0, vec[channel][i]);
-    }
-  }
-}
-
-// Test the ReadInterleaved method
-TEST_P(AudioMultiVectorTest, ReadInterleaved) {
-  AudioMultiVector vec(num_channels_);
-  vec.PushBackInterleaved(array_interleaved_, interleaved_length_);
-  int16_t* output = new int16_t[interleaved_length_];
-  // Read 5 samples.
-  size_t read_samples = 5;
-  EXPECT_EQ(num_channels_ * read_samples,
-            vec.ReadInterleaved(read_samples, output));
-  EXPECT_EQ(0,
-            memcmp(array_interleaved_, output, read_samples * sizeof(int16_t)));
-
-  // Read too many samples. Expect to get all samples from the vector.
-  EXPECT_EQ(interleaved_length_,
-            vec.ReadInterleaved(array_length() + 1, output));
-  EXPECT_EQ(0,
-            memcmp(array_interleaved_, output, read_samples * sizeof(int16_t)));
-
-  delete [] output;
-}
-
-// Test the PopFront method.
-TEST_P(AudioMultiVectorTest, PopFront) {
-  AudioMultiVector vec(num_channels_);
-  vec.PushBackInterleaved(array_interleaved_, interleaved_length_);
-  vec.PopFront(1);  // Remove one element from each channel.
-  ASSERT_EQ(array_length() - 1u, vec.Size());
-  // Let |ptr| point to the second element of the first channel in the
-  // interleaved array.
-  int16_t* ptr = &array_interleaved_[num_channels_];
-  for (size_t i = 0; i < array_length() - 1; ++i) {
-    for (size_t channel = 0; channel < num_channels_; ++channel) {
-      EXPECT_EQ(*ptr, vec[channel][i]);
-      ++ptr;
-    }
-  }
-  vec.PopFront(array_length());  // Remove more elements than vector size.
-  EXPECT_EQ(0u, vec.Size());
-}
-
-// Test the PopBack method.
-TEST_P(AudioMultiVectorTest, PopBack) {
-  AudioMultiVector vec(num_channels_);
-  vec.PushBackInterleaved(array_interleaved_, interleaved_length_);
-  vec.PopBack(1);  // Remove one element from each channel.
-  ASSERT_EQ(array_length() - 1u, vec.Size());
-  // Let |ptr| point to the first element of the first channel in the
-  // interleaved array.
-  int16_t* ptr = array_interleaved_;
-  for (size_t i = 0; i < array_length() - 1; ++i) {
-    for (size_t channel = 0; channel < num_channels_; ++channel) {
-      EXPECT_EQ(*ptr, vec[channel][i]);
-      ++ptr;
-    }
-  }
-  vec.PopBack(array_length());  // Remove more elements than vector size.
-  EXPECT_EQ(0u, vec.Size());
-}
-
-// Test the AssertSize method.
-TEST_P(AudioMultiVectorTest, AssertSize) {
-  AudioMultiVector vec(num_channels_, array_length());
-  EXPECT_EQ(array_length(), vec.Size());
-  // Start with asserting with smaller sizes than already allocated.
-  vec.AssertSize(0);
-  vec.AssertSize(array_length() - 1);
-  // Nothing should have changed.
-  EXPECT_EQ(array_length(), vec.Size());
-  // Assert with one element longer than already allocated.
-  vec.AssertSize(array_length() + 1);
-  // Expect vector to have grown.
-  EXPECT_EQ(array_length() + 1, vec.Size());
-  // Also check the individual AudioVectors.
-  for (size_t channel = 0; channel < vec.Channels(); ++channel) {
-    EXPECT_EQ(array_length() + 1u, vec[channel].Size());
-  }
-}
-
-// Test the PushBack method with another AudioMultiVector as input argument.
-TEST_P(AudioMultiVectorTest, OverwriteAt) {
-  AudioMultiVector vec1(num_channels_);
-  vec1.PushBackInterleaved(array_interleaved_, interleaved_length_);
-  AudioMultiVector vec2(num_channels_);
-  vec2.Zeros(3);  // 3 zeros in each channel.
-  // Overwrite vec2 at position 5.
-  vec1.OverwriteAt(vec2, 3, 5);
-  // Verify result.
-  // Length remains the same.
-  ASSERT_EQ(array_length(), vec1.Size());
-  int16_t* ptr = array_interleaved_;
-  for (size_t i = 0; i < array_length() - 1; ++i) {
-    for (size_t channel = 0; channel < num_channels_; ++channel) {
-      if (i >= 5 && i <= 7) {
-        // Elements 5, 6, 7 should have been replaced with zeros.
-        EXPECT_EQ(0, vec1[channel][i]);
-      } else {
-        EXPECT_EQ(*ptr, vec1[channel][i]);
-      }
-      ++ptr;
-    }
-  }
-}
-
-// Test the CopyChannel method, when the test is instantiated with at least two
-// channels.
-TEST_P(AudioMultiVectorTest, CopyChannel) {
-  if (num_channels_ < 2)
-    return;
-
-  AudioMultiVector vec(num_channels_);
-  vec.PushBackInterleaved(array_interleaved_, interleaved_length_);
-  // Create a reference copy.
-  AudioMultiVector ref(num_channels_);
-  ref.PushBack(vec);
-  // Copy from first to last channel.
-  vec.CopyChannel(0, num_channels_ - 1);
-  // Verify that the first and last channels are identical; the others should
-  // be left untouched.
-  for (size_t i = 0; i < array_length(); ++i) {
-    // Verify that all but the last channel are untouched.
-    for (size_t channel = 0; channel < num_channels_ - 1; ++channel) {
-      EXPECT_EQ(ref[channel][i], vec[channel][i]);
-    }
-    // Verify that the last and the first channels are identical.
-    EXPECT_EQ(vec[0][i], vec[num_channels_ - 1][i]);
-  }
-}
-
-INSTANTIATE_TEST_CASE_P(TestNumChannels,
-                        AudioMultiVectorTest,
-                        ::testing::Values(static_cast<size_t>(1),
-                                          static_cast<size_t>(2),
-                                          static_cast<size_t>(5)));
-}  // namespace webrtc
diff --git a/modules/audio_coding/neteq/audio_vector.cc b/modules/audio_coding/neteq/audio_vector.cc
deleted file mode 100644
index c819daa..0000000
--- a/modules/audio_coding/neteq/audio_vector.cc
+++ /dev/null
@@ -1,386 +0,0 @@
-/*
- *  Copyright (c) 2012 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/neteq/audio_vector.h"
-
-#include <assert.h>
-
-#include <algorithm>
-#include <memory>
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-AudioVector::AudioVector()
-    : AudioVector(kDefaultInitialSize) {
-  Clear();
-}
-
-AudioVector::AudioVector(size_t initial_size)
-    : array_(new int16_t[initial_size + 1]),
-      capacity_(initial_size + 1),
-      begin_index_(0),
-      end_index_(capacity_ - 1) {
-  memset(array_.get(), 0, capacity_ * sizeof(int16_t));
-}
-
-AudioVector::~AudioVector() = default;
-
-void AudioVector::Clear() {
-  end_index_ = begin_index_ = 0;
-}
-
-void AudioVector::CopyTo(AudioVector* copy_to) const {
-  RTC_DCHECK(copy_to);
-  copy_to->Reserve(Size());
-  CopyTo(Size(), 0, copy_to->array_.get());
-  copy_to->begin_index_ = 0;
-  copy_to->end_index_ = Size();
-}
-
-void AudioVector::CopyTo(
-    size_t length, size_t position, int16_t* copy_to) const {
-  if (length == 0)
-    return;
-  length = std::min(length, Size() - position);
-  const size_t copy_index = (begin_index_ + position) % capacity_;
-  const size_t first_chunk_length =
-      std::min(length, capacity_ - copy_index);
-  memcpy(copy_to, &array_[copy_index],
-         first_chunk_length * sizeof(int16_t));
-  const size_t remaining_length = length - first_chunk_length;
-  if (remaining_length > 0) {
-    memcpy(&copy_to[first_chunk_length], array_.get(),
-           remaining_length * sizeof(int16_t));
-  }
-}
-
-void AudioVector::PushFront(const AudioVector& prepend_this) {
-  const size_t length = prepend_this.Size();
-  if (length == 0)
-    return;
-
-  // Although the subsequent calling to PushFront does Reserve in it, it is
-  // always more efficient to do a big Reserve first.
-  Reserve(Size() + length);
-
-  const size_t first_chunk_length =
-      std::min(length, prepend_this.capacity_ - prepend_this.begin_index_);
-  const size_t remaining_length = length - first_chunk_length;
-  if (remaining_length > 0)
-    PushFront(prepend_this.array_.get(), remaining_length);
-  PushFront(&prepend_this.array_[prepend_this.begin_index_],
-            first_chunk_length);
-}
-
-void AudioVector::PushFront(const int16_t* prepend_this, size_t length) {
-  if (length == 0)
-    return;
-  Reserve(Size() + length);
-  const size_t first_chunk_length = std::min(length, begin_index_);
-  memcpy(&array_[begin_index_ - first_chunk_length],
-         &prepend_this[length - first_chunk_length],
-         first_chunk_length * sizeof(int16_t));
-  const size_t remaining_length = length - first_chunk_length;
-  if (remaining_length > 0) {
-    memcpy(&array_[capacity_ - remaining_length], prepend_this,
-           remaining_length * sizeof(int16_t));
-  }
-  begin_index_ = (begin_index_ + capacity_ - length) % capacity_;
-}
-
-void AudioVector::PushBack(const AudioVector& append_this) {
-  PushBack(append_this, append_this.Size(), 0);
-}
-
-void AudioVector::PushBack(
-    const AudioVector& append_this, size_t length, size_t position) {
-  RTC_DCHECK_LE(position, append_this.Size());
-  RTC_DCHECK_LE(length, append_this.Size() - position);
-
-  if (length == 0)
-    return;
-
-  // Although the subsequent calling to PushBack does Reserve in it, it is
-  // always more efficient to do a big Reserve first.
-  Reserve(Size() + length);
-
-  const size_t start_index =
-      (append_this.begin_index_ + position) % append_this.capacity_;
-  const size_t first_chunk_length = std::min(
-      length, append_this.capacity_ - start_index);
-  PushBack(&append_this.array_[start_index], first_chunk_length);
-
-  const size_t remaining_length = length - first_chunk_length;
-  if (remaining_length > 0)
-    PushBack(append_this.array_.get(), remaining_length);
-}
-
-void AudioVector::PushBack(const int16_t* append_this, size_t length) {
-  if (length == 0)
-    return;
-  Reserve(Size() + length);
-  const size_t first_chunk_length = std::min(length, capacity_ - end_index_);
-  memcpy(&array_[end_index_], append_this,
-         first_chunk_length * sizeof(int16_t));
-  const size_t remaining_length = length - first_chunk_length;
-  if (remaining_length > 0) {
-    memcpy(array_.get(), &append_this[first_chunk_length],
-           remaining_length * sizeof(int16_t));
-  }
-  end_index_ = (end_index_ + length) % capacity_;
-}
-
-void AudioVector::PopFront(size_t length) {
-  if (length == 0)
-    return;
-  length = std::min(length, Size());
-  begin_index_ = (begin_index_ + length) % capacity_;
-}
-
-void AudioVector::PopBack(size_t length) {
-  if (length == 0)
-    return;
-  // Never remove more than what is in the array.
-  length = std::min(length, Size());
-  end_index_ = (end_index_ + capacity_ - length) % capacity_;
-}
-
-void AudioVector::Extend(size_t extra_length) {
-  if (extra_length == 0)
-    return;
-  InsertZerosByPushBack(extra_length, Size());
-}
-
-void AudioVector::InsertAt(const int16_t* insert_this,
-                           size_t length,
-                           size_t position) {
-  if (length == 0)
-    return;
-  // Cap the insert position at the current array length.
-  position = std::min(Size(), position);
-
-  // When inserting to a position closer to the beginning, it is more efficient
-  // to insert by pushing front than to insert by pushing back, since less data
-  // will be moved, vice versa.
-  if (position <= Size() - position) {
-    InsertByPushFront(insert_this, length, position);
-  } else {
-    InsertByPushBack(insert_this, length, position);
-  }
-}
-
-void AudioVector::InsertZerosAt(size_t length,
-                                size_t position) {
-  if (length == 0)
-    return;
-  // Cap the insert position at the current array length.
-  position = std::min(Size(), position);
-
-  // When inserting to a position closer to the beginning, it is more efficient
-  // to insert by pushing front than to insert by pushing back, since less data
-  // will be moved, vice versa.
-  if (position <= Size() - position) {
-    InsertZerosByPushFront(length, position);
-  } else {
-    InsertZerosByPushBack(length, position);
-  }
-}
-
-void AudioVector::OverwriteAt(const AudioVector& insert_this,
-                              size_t length,
-                              size_t position) {
-  RTC_DCHECK_LE(length, insert_this.Size());
-  if (length == 0)
-    return;
-
-  // Cap the insert position at the current array length.
-  position = std::min(Size(), position);
-
-  // Although the subsequent calling to OverwriteAt does Reserve in it, it is
-  // always more efficient to do a big Reserve first.
-  size_t new_size = std::max(Size(), position + length);
-  Reserve(new_size);
-
-  const size_t first_chunk_length =
-      std::min(length, insert_this.capacity_ - insert_this.begin_index_);
-  OverwriteAt(&insert_this.array_[insert_this.begin_index_], first_chunk_length,
-              position);
-  const size_t remaining_length = length - first_chunk_length;
-  if (remaining_length > 0) {
-    OverwriteAt(insert_this.array_.get(), remaining_length,
-                position + first_chunk_length);
-  }
-}
-
-void AudioVector::OverwriteAt(const int16_t* insert_this,
-                              size_t length,
-                              size_t position) {
-  if (length == 0)
-    return;
-  // Cap the insert position at the current array length.
-  position = std::min(Size(), position);
-
-  size_t new_size = std::max(Size(), position + length);
-  Reserve(new_size);
-
-  const size_t overwrite_index = (begin_index_ + position) % capacity_;
-  const size_t first_chunk_length =
-      std::min(length, capacity_ - overwrite_index);
-  memcpy(&array_[overwrite_index], insert_this,
-         first_chunk_length * sizeof(int16_t));
-  const size_t remaining_length = length - first_chunk_length;
-  if (remaining_length > 0) {
-    memcpy(array_.get(), &insert_this[first_chunk_length],
-           remaining_length * sizeof(int16_t));
-  }
-
-  end_index_ = (begin_index_ + new_size) % capacity_;
-}
-
-void AudioVector::CrossFade(const AudioVector& append_this,
-                            size_t fade_length) {
-  // Fade length cannot be longer than the current vector or |append_this|.
-  assert(fade_length <= Size());
-  assert(fade_length <= append_this.Size());
-  fade_length = std::min(fade_length, Size());
-  fade_length = std::min(fade_length, append_this.Size());
-  size_t position = Size() - fade_length + begin_index_;
-  // Cross fade the overlapping regions.
-  // |alpha| is the mixing factor in Q14.
-  // TODO(hlundin): Consider skipping +1 in the denominator to produce a
-  // smoother cross-fade, in particular at the end of the fade.
-  int alpha_step = 16384 / (static_cast<int>(fade_length) + 1);
-  int alpha = 16384;
-  for (size_t i = 0; i < fade_length; ++i) {
-    alpha -= alpha_step;
-    array_[(position + i) % capacity_] =
-        (alpha * array_[(position + i) % capacity_] +
-            (16384 - alpha) * append_this[i] + 8192) >> 14;
-  }
-  assert(alpha >= 0);  // Verify that the slope was correct.
-  // Append what is left of |append_this|.
-  size_t samples_to_push_back = append_this.Size() - fade_length;
-  if (samples_to_push_back > 0)
-    PushBack(append_this, samples_to_push_back, fade_length);
-}
-
-// Returns the number of elements in this AudioVector.
-size_t AudioVector::Size() const {
-  return (end_index_ + capacity_ - begin_index_) % capacity_;
-}
-
-// Returns true if this AudioVector is empty.
-bool AudioVector::Empty() const {
-  return begin_index_ == end_index_;
-}
-
-void AudioVector::Reserve(size_t n) {
-  if (capacity_ > n)
-    return;
-  const size_t length = Size();
-  // Reserve one more sample to remove the ambiguity between empty vector and
-  // full vector. Therefore |begin_index_| == |end_index_| indicates empty
-  // vector, and |begin_index_| == (|end_index_| + 1) % capacity indicates
-  // full vector.
-  std::unique_ptr<int16_t[]> temp_array(new int16_t[n + 1]);
-  CopyTo(length, 0, temp_array.get());
-  array_.swap(temp_array);
-  begin_index_ = 0;
-  end_index_ = length;
-  capacity_ = n + 1;
-}
-
-void AudioVector::InsertByPushBack(const int16_t* insert_this,
-                                   size_t length,
-                                   size_t position) {
-  const size_t move_chunk_length = Size() - position;
-  std::unique_ptr<int16_t[]> temp_array(nullptr);
-  if (move_chunk_length > 0) {
-    // TODO(minyue): see if it is possible to avoid copying to a buffer.
-    temp_array.reset(new int16_t[move_chunk_length]);
-    CopyTo(move_chunk_length, position, temp_array.get());
-    PopBack(move_chunk_length);
-  }
-
-  Reserve(Size() + length + move_chunk_length);
-  PushBack(insert_this, length);
-  if (move_chunk_length > 0)
-    PushBack(temp_array.get(), move_chunk_length);
-}
-
-void AudioVector::InsertByPushFront(const int16_t* insert_this,
-                                   size_t length,
-                                   size_t position) {
-  std::unique_ptr<int16_t[]> temp_array(nullptr);
-  if (position > 0) {
-    // TODO(minyue): see if it is possible to avoid copying to a buffer.
-    temp_array.reset(new int16_t[position]);
-    CopyTo(position, 0, temp_array.get());
-    PopFront(position);
-  }
-
-  Reserve(Size() + length + position);
-  PushFront(insert_this, length);
-  if (position > 0)
-    PushFront(temp_array.get(), position);
-}
-
-void AudioVector::InsertZerosByPushBack(size_t length,
-                                        size_t position) {
-  const size_t move_chunk_length = Size() - position;
-  std::unique_ptr<int16_t[]> temp_array(nullptr);
-  if (move_chunk_length > 0) {
-    temp_array.reset(new int16_t[move_chunk_length]);
-    CopyTo(move_chunk_length, position, temp_array.get());
-    PopBack(move_chunk_length);
-  }
-
-  Reserve(Size() + length + move_chunk_length);
-
-  const size_t first_zero_chunk_length =
-      std::min(length, capacity_ - end_index_);
-  memset(&array_[end_index_], 0, first_zero_chunk_length * sizeof(int16_t));
-  const size_t remaining_zero_length = length - first_zero_chunk_length;
-  if (remaining_zero_length > 0)
-    memset(array_.get(), 0, remaining_zero_length * sizeof(int16_t));
-  end_index_ = (end_index_ + length) % capacity_;
-
-  if (move_chunk_length > 0)
-    PushBack(temp_array.get(), move_chunk_length);
-}
-
-void AudioVector::InsertZerosByPushFront(size_t length,
-                                         size_t position) {
-  std::unique_ptr<int16_t[]> temp_array(nullptr);
-  if (position > 0) {
-    temp_array.reset(new int16_t[position]);
-    CopyTo(position, 0, temp_array.get());
-    PopFront(position);
-  }
-
-  Reserve(Size() + length + position);
-
-  const size_t first_zero_chunk_length = std::min(length, begin_index_);
-  memset(&array_[begin_index_ - first_zero_chunk_length], 0,
-         first_zero_chunk_length * sizeof(int16_t));
-  const size_t remaining_zero_length = length - first_zero_chunk_length;
-  if (remaining_zero_length > 0)
-    memset(&array_[capacity_ - remaining_zero_length], 0,
-           remaining_zero_length * sizeof(int16_t));
-  begin_index_ = (begin_index_ + capacity_ - length) % capacity_;
-
-  if (position > 0)
-    PushFront(temp_array.get(), position);
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/neteq/audio_vector.h b/modules/audio_coding/neteq/audio_vector.h
deleted file mode 100644
index f3dfdd6..0000000
--- a/modules/audio_coding/neteq/audio_vector.h
+++ /dev/null
@@ -1,168 +0,0 @@
-/*
- *  Copyright (c) 2012 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_NETEQ_AUDIO_VECTOR_H_
-#define WEBRTC_MODULES_AUDIO_CODING_NETEQ_AUDIO_VECTOR_H_
-
-#include <string.h>  // Access to size_t.
-#include <memory>
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-class AudioVector {
- public:
-  // Creates an empty AudioVector.
-  AudioVector();
-
-  // Creates an AudioVector with an initial size.
-  explicit AudioVector(size_t initial_size);
-
-  virtual ~AudioVector();
-
-  // Deletes all values and make the vector empty.
-  virtual void Clear();
-
-  // Copies all values from this vector to |copy_to|. Any contents in |copy_to|
-  // are deleted before the copy operation. After the operation is done,
-  // |copy_to| will be an exact replica of this object.
-  virtual void CopyTo(AudioVector* copy_to) const;
-
-  // Copies |length| values from |position| in this vector to |copy_to|.
-  virtual void CopyTo(size_t length, size_t position, int16_t* copy_to) const;
-
-  // Prepends the contents of AudioVector |prepend_this| to this object. The
-  // length of this object is increased with the length of |prepend_this|.
-  virtual void PushFront(const AudioVector& prepend_this);
-
-  // Same as above, but with an array |prepend_this| with |length| elements as
-  // source.
-  virtual void PushFront(const int16_t* prepend_this, size_t length);
-
-  // Same as PushFront but will append to the end of this object.
-  virtual void PushBack(const AudioVector& append_this);
-
-  // Appends a segment of |append_this| to the end of this object. The segment
-  // starts from |position| and has |length| samples.
-  virtual void PushBack(const AudioVector& append_this,
-                        size_t length,
-                        size_t position);
-
-  // Same as PushFront but will append to the end of this object.
-  virtual void PushBack(const int16_t* append_this, size_t length);
-
-  // Removes |length| elements from the beginning of this object.
-  virtual void PopFront(size_t length);
-
-  // Removes |length| elements from the end of this object.
-  virtual void PopBack(size_t length);
-
-  // Extends this object with |extra_length| elements at the end. The new
-  // elements are initialized to zero.
-  virtual void Extend(size_t extra_length);
-
-  // Inserts |length| elements taken from the array |insert_this| and insert
-  // them at |position|. The length of the AudioVector is increased by |length|.
-  // |position| = 0 means that the new values are prepended to the vector.
-  // |position| = Size() means that the new values are appended to the vector.
-  virtual void InsertAt(const int16_t* insert_this, size_t length,
-                        size_t position);
-
-  // Like InsertAt, but inserts |length| zero elements at |position|.
-  virtual void InsertZerosAt(size_t length, size_t position);
-
-  // Overwrites |length| elements of this AudioVector starting from |position|
-  // with first values in |AudioVector|. The definition of |position|
-  // is the same as for InsertAt(). If |length| and |position| are selected
-  // such that the new data extends beyond the end of the current AudioVector,
-  // the vector is extended to accommodate the new data.
-  virtual void OverwriteAt(const AudioVector& insert_this,
-                           size_t length,
-                           size_t position);
-
-  // Overwrites |length| elements of this AudioVector with values taken from the
-  // array |insert_this|, starting at |position|. The definition of |position|
-  // is the same as for InsertAt(). If |length| and |position| are selected
-  // such that the new data extends beyond the end of the current AudioVector,
-  // the vector is extended to accommodate the new data.
-  virtual void OverwriteAt(const int16_t* insert_this,
-                           size_t length,
-                           size_t position);
-
-  // Appends |append_this| to the end of the current vector. Lets the two
-  // vectors overlap by |fade_length| samples, and cross-fade linearly in this
-  // region.
-  virtual void CrossFade(const AudioVector& append_this, size_t fade_length);
-
-  // Returns the number of elements in this AudioVector.
-  virtual size_t Size() const;
-
-  // Returns true if this AudioVector is empty.
-  virtual bool Empty() const;
-
-  // Accesses and modifies an element of AudioVector.
-  inline const int16_t& operator[](size_t index) const {
-    return array_[WrapIndex(index, begin_index_, capacity_)];
-  }
-
-  inline int16_t& operator[](size_t index) {
-    return array_[WrapIndex(index, begin_index_, capacity_)];
-  }
-
- private:
-  static const size_t kDefaultInitialSize = 10;
-
-  // This method is used by the [] operators to calculate an index within the
-  // capacity of the array, but without using the modulo operation (%).
-  static inline size_t WrapIndex(size_t index,
-                                 size_t begin_index,
-                                 size_t capacity) {
-    RTC_DCHECK_LT(index, capacity);
-    RTC_DCHECK_LT(begin_index, capacity);
-    size_t ix = begin_index + index;
-    RTC_DCHECK_GE(ix, index);  // Check for overflow.
-    if (ix >= capacity) {
-      ix -= capacity;
-    }
-    RTC_DCHECK_LT(ix, capacity);
-    return ix;
-  }
-
-  void Reserve(size_t n);
-
-  void InsertByPushBack(const int16_t* insert_this, size_t length,
-                        size_t position);
-
-  void InsertByPushFront(const int16_t* insert_this, size_t length,
-                         size_t position);
-
-  void InsertZerosByPushBack(size_t length, size_t position);
-
-  void InsertZerosByPushFront(size_t length, size_t position);
-
-  std::unique_ptr<int16_t[]> array_;
-
-  size_t capacity_;  // Allocated number of samples in the array.
-
-  // The index of the first sample in |array_|, except when
-  // |begin_index_ == end_index_|, which indicates an empty buffer.
-  size_t begin_index_;
-
-  // The index of the sample after the last sample in |array_|.
-  size_t end_index_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(AudioVector);
-};
-
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_AUDIO_CODING_NETEQ_AUDIO_VECTOR_H_
diff --git a/modules/audio_coding/neteq/audio_vector_unittest.cc b/modules/audio_coding/neteq/audio_vector_unittest.cc
deleted file mode 100644
index e9ef93f..0000000
--- a/modules/audio_coding/neteq/audio_vector_unittest.cc
+++ /dev/null
@@ -1,386 +0,0 @@
-/*
- *  Copyright (c) 2012 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/neteq/audio_vector.h"
-
-#include <assert.h>
-#include <stdlib.h>
-
-#include <string>
-
-#include "webrtc/test/gtest.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-class AudioVectorTest : public ::testing::Test {
- protected:
-  virtual void SetUp() {
-    // Populate test array.
-    for (size_t i = 0; i < array_length(); ++i) {
-      array_[i] = i;
-    }
-  }
-
-  size_t array_length() const {
-    return sizeof(array_) / sizeof(array_[0]);
-  }
-
-  int16_t array_[10];
-};
-
-// Create and destroy AudioVector objects, both empty and with a predefined
-// length.
-TEST_F(AudioVectorTest, CreateAndDestroy) {
-  AudioVector vec1;
-  EXPECT_TRUE(vec1.Empty());
-  EXPECT_EQ(0u, vec1.Size());
-
-  size_t initial_size = 17;
-  AudioVector vec2(initial_size);
-  EXPECT_FALSE(vec2.Empty());
-  EXPECT_EQ(initial_size, vec2.Size());
-}
-
-// Test the subscript operator [] for getting and setting.
-TEST_F(AudioVectorTest, SubscriptOperator) {
-  AudioVector vec(array_length());
-  for (size_t i = 0; i < array_length(); ++i) {
-    vec[i] = static_cast<int16_t>(i);
-    const int16_t& value = vec[i];  // Make sure to use the const version.
-    EXPECT_EQ(static_cast<int16_t>(i), value);
-  }
-}
-
-// Test the PushBack method and the CopyFrom method. The Clear method is also
-// invoked.
-TEST_F(AudioVectorTest, PushBackAndCopy) {
-  AudioVector vec;
-  AudioVector vec_copy;
-  vec.PushBack(array_, array_length());
-  vec.CopyTo(&vec_copy);  // Copy from |vec| to |vec_copy|.
-  ASSERT_EQ(array_length(), vec.Size());
-  ASSERT_EQ(array_length(), vec_copy.Size());
-  for (size_t i = 0; i < array_length(); ++i) {
-    EXPECT_EQ(array_[i], vec[i]);
-    EXPECT_EQ(array_[i], vec_copy[i]);
-  }
-
-  // Clear |vec| and verify that it is empty.
-  vec.Clear();
-  EXPECT_TRUE(vec.Empty());
-
-  // Now copy the empty vector and verify that the copy becomes empty too.
-  vec.CopyTo(&vec_copy);
-  EXPECT_TRUE(vec_copy.Empty());
-}
-
-// Test the PushBack method with another AudioVector as input argument.
-TEST_F(AudioVectorTest, PushBackVector) {
-  static const size_t kLength = 10;
-  AudioVector vec1(kLength);
-  AudioVector vec2(kLength);
-  // Set the first vector to [0, 1, ..., kLength - 1].
-  // Set the second vector to [kLength, kLength + 1, ..., 2 * kLength - 1].
-  for (size_t i = 0; i < kLength; ++i) {
-    vec1[i] = static_cast<int16_t>(i);
-    vec2[i] = static_cast<int16_t>(i + kLength);
-  }
-  // Append vec2 to the back of vec1.
-  vec1.PushBack(vec2);
-  ASSERT_EQ(2 * kLength, vec1.Size());
-  for (size_t i = 0; i < 2 * kLength; ++i) {
-    EXPECT_EQ(static_cast<int16_t>(i), vec1[i]);
-  }
-}
-
-// Test the PushFront method.
-TEST_F(AudioVectorTest, PushFront) {
-  AudioVector vec;
-  vec.PushFront(array_, array_length());
-  ASSERT_EQ(array_length(), vec.Size());
-  for (size_t i = 0; i < array_length(); ++i) {
-    EXPECT_EQ(array_[i], vec[i]);
-  }
-}
-
-// Test the PushFront method with another AudioVector as input argument.
-TEST_F(AudioVectorTest, PushFrontVector) {
-  static const size_t kLength = 10;
-  AudioVector vec1(kLength);
-  AudioVector vec2(kLength);
-  // Set the first vector to [0, 1, ..., kLength - 1].
-  // Set the second vector to [kLength, kLength + 1, ..., 2 * kLength - 1].
-  for (size_t i = 0; i < kLength; ++i) {
-    vec1[i] = static_cast<int16_t>(i);
-    vec2[i] = static_cast<int16_t>(i + kLength);
-  }
-  // Prepend vec1 to the front of vec2.
-  vec2.PushFront(vec1);
-  ASSERT_EQ(2 * kLength, vec2.Size());
-  for (size_t i = 0; i < 2 * kLength; ++i) {
-    EXPECT_EQ(static_cast<int16_t>(i), vec2[i]);
-  }
-}
-
-// Test the PopFront method.
-TEST_F(AudioVectorTest, PopFront) {
-  AudioVector vec;
-  vec.PushBack(array_, array_length());
-  vec.PopFront(1);  // Remove one element.
-  EXPECT_EQ(array_length() - 1u, vec.Size());
-  for (size_t i = 0; i < array_length() - 1; ++i) {
-    EXPECT_EQ(static_cast<int16_t>(i + 1), vec[i]);
-  }
-  vec.PopFront(array_length());  // Remove more elements than vector size.
-  EXPECT_EQ(0u, vec.Size());
-}
-
-// Test the PopBack method.
-TEST_F(AudioVectorTest, PopBack) {
-  AudioVector vec;
-  vec.PushBack(array_, array_length());
-  vec.PopBack(1);  // Remove one element.
-  EXPECT_EQ(array_length() - 1u, vec.Size());
-  for (size_t i = 0; i < array_length() - 1; ++i) {
-    EXPECT_EQ(static_cast<int16_t>(i), vec[i]);
-  }
-  vec.PopBack(array_length());  // Remove more elements than vector size.
-  EXPECT_EQ(0u, vec.Size());
-}
-
-// Test the Extend method.
-TEST_F(AudioVectorTest, Extend) {
-  AudioVector vec;
-  vec.PushBack(array_, array_length());
-  vec.Extend(5);  // Extend with 5 elements, which should all be zeros.
-  ASSERT_EQ(array_length() + 5u, vec.Size());
-  // Verify that all are zero.
-  for (size_t i = array_length(); i < array_length() + 5; ++i) {
-    EXPECT_EQ(0, vec[i]);
-  }
-}
-
-// Test the InsertAt method with an insert position in the middle of the vector.
-TEST_F(AudioVectorTest, InsertAt) {
-  AudioVector vec;
-  vec.PushBack(array_, array_length());
-  static const int kNewLength = 5;
-  int16_t new_array[kNewLength];
-  // Set array elements to {100, 101, 102, ... }.
-  for (int i = 0; i < kNewLength; ++i) {
-    new_array[i] = 100 + i;
-  }
-  int insert_position = 5;
-  vec.InsertAt(new_array, kNewLength, insert_position);
-  // Verify that the vector looks as follows:
-  // {0, 1, ..., |insert_position| - 1, 100, 101, ..., 100 + kNewLength - 1,
-  //  |insert_position|, |insert_position| + 1, ..., kLength - 1}.
-  size_t pos = 0;
-  for (int i = 0; i < insert_position; ++i) {
-    EXPECT_EQ(array_[i], vec[pos]);
-    ++pos;
-  }
-  for (int i = 0; i < kNewLength; ++i) {
-    EXPECT_EQ(new_array[i], vec[pos]);
-    ++pos;
-  }
-  for (size_t i = insert_position; i < array_length(); ++i) {
-    EXPECT_EQ(array_[i], vec[pos]);
-    ++pos;
-  }
-}
-
-// Test the InsertZerosAt method with an insert position in the middle of the
-// vector. Use the InsertAt method as reference.
-TEST_F(AudioVectorTest, InsertZerosAt) {
-  AudioVector vec;
-  AudioVector vec_ref;
-  vec.PushBack(array_, array_length());
-  vec_ref.PushBack(array_, array_length());
-  static const int kNewLength = 5;
-  int insert_position = 5;
-  vec.InsertZerosAt(kNewLength, insert_position);
-  int16_t new_array[kNewLength] = {0};  // All zero elements.
-  vec_ref.InsertAt(new_array, kNewLength, insert_position);
-  // Verify that the vectors are identical.
-  ASSERT_EQ(vec_ref.Size(), vec.Size());
-  for (size_t i = 0; i < vec.Size(); ++i) {
-    EXPECT_EQ(vec_ref[i], vec[i]);
-  }
-}
-
-// Test the InsertAt method with an insert position at the start of the vector.
-TEST_F(AudioVectorTest, InsertAtBeginning) {
-  AudioVector vec;
-  vec.PushBack(array_, array_length());
-  static const int kNewLength = 5;
-  int16_t new_array[kNewLength];
-  // Set array elements to {100, 101, 102, ... }.
-  for (int i = 0; i < kNewLength; ++i) {
-    new_array[i] = 100 + i;
-  }
-  int insert_position = 0;
-  vec.InsertAt(new_array, kNewLength, insert_position);
-  // Verify that the vector looks as follows:
-  // {100, 101, ..., 100 + kNewLength - 1,
-  //  0, 1, ..., kLength - 1}.
-  size_t pos = 0;
-  for (int i = 0; i < kNewLength; ++i) {
-    EXPECT_EQ(new_array[i], vec[pos]);
-    ++pos;
-  }
-  for (size_t i = insert_position; i < array_length(); ++i) {
-    EXPECT_EQ(array_[i], vec[pos]);
-    ++pos;
-  }
-}
-
-// Test the InsertAt method with an insert position at the end of the vector.
-TEST_F(AudioVectorTest, InsertAtEnd) {
-  AudioVector vec;
-  vec.PushBack(array_, array_length());
-  static const int kNewLength = 5;
-  int16_t new_array[kNewLength];
-  // Set array elements to {100, 101, 102, ... }.
-  for (int i = 0; i < kNewLength; ++i) {
-    new_array[i] = 100 + i;
-  }
-  int insert_position = array_length();
-  vec.InsertAt(new_array, kNewLength, insert_position);
-  // Verify that the vector looks as follows:
-  // {0, 1, ..., kLength - 1, 100, 101, ..., 100 + kNewLength - 1 }.
-  size_t pos = 0;
-  for (size_t i = 0; i < array_length(); ++i) {
-    EXPECT_EQ(array_[i], vec[pos]);
-    ++pos;
-  }
-  for (int i = 0; i < kNewLength; ++i) {
-    EXPECT_EQ(new_array[i], vec[pos]);
-    ++pos;
-  }
-}
-
-// Test the InsertAt method with an insert position beyond the end of the
-// vector. Verify that a position beyond the end of the vector does not lead to
-// an error. The expected outcome is the same as if the vector end was used as
-// input position. That is, the input position should be capped at the maximum
-// allowed value.
-TEST_F(AudioVectorTest, InsertBeyondEnd) {
-  AudioVector vec;
-  vec.PushBack(array_, array_length());
-  static const int kNewLength = 5;
-  int16_t new_array[kNewLength];
-  // Set array elements to {100, 101, 102, ... }.
-  for (int i = 0; i < kNewLength; ++i) {
-    new_array[i] = 100 + i;
-  }
-  int insert_position = array_length() + 10;  // Too large.
-  vec.InsertAt(new_array, kNewLength, insert_position);
-  // Verify that the vector looks as follows:
-  // {0, 1, ..., kLength - 1, 100, 101, ..., 100 + kNewLength - 1 }.
-  size_t pos = 0;
-  for (size_t i = 0; i < array_length(); ++i) {
-    EXPECT_EQ(array_[i], vec[pos]);
-    ++pos;
-  }
-  for (int i = 0; i < kNewLength; ++i) {
-    EXPECT_EQ(new_array[i], vec[pos]);
-    ++pos;
-  }
-}
-
-// Test the OverwriteAt method with a position such that all of the new values
-// fit within the old vector.
-TEST_F(AudioVectorTest, OverwriteAt) {
-  AudioVector vec;
-  vec.PushBack(array_, array_length());
-  static const int kNewLength = 5;
-  int16_t new_array[kNewLength];
-  // Set array elements to {100, 101, 102, ... }.
-  for (int i = 0; i < kNewLength; ++i) {
-    new_array[i] = 100 + i;
-  }
-  size_t insert_position = 2;
-  vec.OverwriteAt(new_array, kNewLength, insert_position);
-  // Verify that the vector looks as follows:
-  // {0, ..., |insert_position| - 1, 100, 101, ..., 100 + kNewLength - 1,
-  //  |insert_position|, |insert_position| + 1, ..., kLength - 1}.
-  size_t pos = 0;
-  for (pos = 0; pos < insert_position; ++pos) {
-    EXPECT_EQ(array_[pos], vec[pos]);
-  }
-  for (int i = 0; i < kNewLength; ++i) {
-    EXPECT_EQ(new_array[i], vec[pos]);
-    ++pos;
-  }
-  for (; pos < array_length(); ++pos) {
-    EXPECT_EQ(array_[pos], vec[pos]);
-  }
-}
-
-// Test the OverwriteAt method with a position such that some of the new values
-// extend beyond the end of the current vector. This is valid, and the vector is
-// expected to expand to accommodate the new values.
-TEST_F(AudioVectorTest, OverwriteBeyondEnd) {
-  AudioVector vec;
-  vec.PushBack(array_, array_length());
-  static const int kNewLength = 5;
-  int16_t new_array[kNewLength];
-  // Set array elements to {100, 101, 102, ... }.
-  for (int i = 0; i < kNewLength; ++i) {
-    new_array[i] = 100 + i;
-  }
-  int insert_position = array_length() - 2;
-  vec.OverwriteAt(new_array, kNewLength, insert_position);
-  ASSERT_EQ(array_length() - 2u + kNewLength, vec.Size());
-  // Verify that the vector looks as follows:
-  // {0, ..., |insert_position| - 1, 100, 101, ..., 100 + kNewLength - 1,
-  //  |insert_position|, |insert_position| + 1, ..., kLength - 1}.
-  int pos = 0;
-  for (pos = 0; pos < insert_position; ++pos) {
-    EXPECT_EQ(array_[pos], vec[pos]);
-  }
-  for (int i = 0; i < kNewLength; ++i) {
-    EXPECT_EQ(new_array[i], vec[pos]);
-    ++pos;
-  }
-  // Verify that we checked to the end of |vec|.
-  EXPECT_EQ(vec.Size(), static_cast<size_t>(pos));
-}
-
-TEST_F(AudioVectorTest, CrossFade) {
-  static const size_t kLength = 100;
-  static const size_t kFadeLength = 10;
-  AudioVector vec1(kLength);
-  AudioVector vec2(kLength);
-  // Set all vector elements to 0 in |vec1| and 100 in |vec2|.
-  for (size_t i = 0; i < kLength; ++i) {
-    vec1[i] = 0;
-    vec2[i] = 100;
-  }
-  vec1.CrossFade(vec2, kFadeLength);
-  ASSERT_EQ(2 * kLength - kFadeLength, vec1.Size());
-  // First part untouched.
-  for (size_t i = 0; i < kLength - kFadeLength; ++i) {
-    EXPECT_EQ(0, vec1[i]);
-  }
-  // Check mixing zone.
-  for (size_t i = 0 ; i < kFadeLength; ++i) {
-    EXPECT_NEAR((i + 1) * 100 / (kFadeLength + 1),
-                vec1[kLength - kFadeLength + i], 1);
-  }
-  // Second part untouched.
-  for (size_t i = kLength; i < vec1.Size(); ++i) {
-    EXPECT_EQ(100, vec1[i]);
-  }
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/neteq/background_noise.cc b/modules/audio_coding/neteq/background_noise.cc
deleted file mode 100644
index cf77ec5..0000000
--- a/modules/audio_coding/neteq/background_noise.cc
+++ /dev/null
@@ -1,255 +0,0 @@
-/*
- *  Copyright (c) 2012 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/neteq/background_noise.h"
-
-#include <assert.h>
-#include <string.h>  // memcpy
-
-#include <algorithm>  // min, max
-
-#include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
-#include "webrtc/modules/audio_coding/neteq/audio_multi_vector.h"
-#include "webrtc/modules/audio_coding/neteq/cross_correlation.h"
-#include "webrtc/modules/audio_coding/neteq/post_decode_vad.h"
-
-namespace webrtc {
-
-// static
-const size_t BackgroundNoise::kMaxLpcOrder;
-
-BackgroundNoise::BackgroundNoise(size_t num_channels)
-    : num_channels_(num_channels),
-      channel_parameters_(new ChannelParameters[num_channels_]),
-      mode_(NetEq::kBgnOn) {
-  Reset();
-}
-
-BackgroundNoise::~BackgroundNoise() {}
-
-void BackgroundNoise::Reset() {
-  initialized_ = false;
-  for (size_t channel = 0; channel < num_channels_; ++channel) {
-    channel_parameters_[channel].Reset();
-  }
-  // Keep _bgnMode as it is.
-}
-
-void BackgroundNoise::Update(const AudioMultiVector& input,
-                             const PostDecodeVad& vad) {
-  if (vad.running() && vad.active_speech()) {
-    // Do not update the background noise parameters if we know that the signal
-    // is active speech.
-    return;
-  }
-
-  int32_t auto_correlation[kMaxLpcOrder + 1];
-  int16_t fiter_output[kMaxLpcOrder + kResidualLength];
-  int16_t reflection_coefficients[kMaxLpcOrder];
-  int16_t lpc_coefficients[kMaxLpcOrder + 1];
-
-  for (size_t channel_ix = 0; channel_ix < num_channels_; ++channel_ix) {
-    ChannelParameters& parameters = channel_parameters_[channel_ix];
-    int16_t temp_signal_array[kVecLen + kMaxLpcOrder] = {0};
-    int16_t* temp_signal = &temp_signal_array[kMaxLpcOrder];
-    input[channel_ix].CopyTo(kVecLen, input.Size() - kVecLen, temp_signal);
-    int32_t sample_energy = CalculateAutoCorrelation(temp_signal, kVecLen,
-                                                     auto_correlation);
-
-    if ((!vad.running() &&
-        sample_energy < parameters.energy_update_threshold) ||
-        (vad.running() && !vad.active_speech())) {
-      // Generate LPC coefficients.
-      if (auto_correlation[0] > 0) {
-        // Regardless of whether the filter is actually updated or not,
-        // update energy threshold levels, since we have in fact observed
-        // a low energy signal.
-        if (sample_energy < parameters.energy_update_threshold) {
-          // Never go under 1.0 in average sample energy.
-          parameters.energy_update_threshold = std::max(sample_energy, 1);
-          parameters.low_energy_update_threshold = 0;
-        }
-
-        // Only update BGN if filter is stable, i.e., if return value from
-        // Levinson-Durbin function is 1.
-        if (WebRtcSpl_LevinsonDurbin(auto_correlation, lpc_coefficients,
-                                     reflection_coefficients,
-                                     kMaxLpcOrder) != 1) {
-          return;
-        }
-      } else {
-        // Center value in auto-correlation is not positive. Do not update.
-        return;
-      }
-
-      // Generate the CNG gain factor by looking at the energy of the residual.
-      WebRtcSpl_FilterMAFastQ12(temp_signal + kVecLen - kResidualLength,
-                                fiter_output, lpc_coefficients,
-                                kMaxLpcOrder + 1, kResidualLength);
-      int32_t residual_energy = WebRtcSpl_DotProductWithScale(fiter_output,
-                                                              fiter_output,
-                                                              kResidualLength,
-                                                              0);
-
-      // Check spectral flatness.
-      // Comparing the residual variance with the input signal variance tells
-      // if the spectrum is flat or not.
-      // If 5 * residual_energy >= 16 * sample_energy, the spectrum is flat
-      // enough.  Also ensure that the energy is non-zero.
-      if ((sample_energy > 0) &&
-          (int64_t{5} * residual_energy >= int64_t{16} * sample_energy)) {
-        // Spectrum is flat enough; save filter parameters.
-        // |temp_signal| + |kVecLen| - |kMaxLpcOrder| points at the first of the
-        // |kMaxLpcOrder| samples in the residual signal, which will form the
-        // filter state for the next noise generation.
-        SaveParameters(channel_ix, lpc_coefficients,
-                       temp_signal + kVecLen - kMaxLpcOrder, sample_energy,
-                       residual_energy);
-      }
-    } else {
-      // Will only happen if post-decode VAD is disabled and |sample_energy| is
-      // not low enough. Increase the threshold for update so that it increases
-      // by a factor 4 in 4 seconds.
-      IncrementEnergyThreshold(channel_ix, sample_energy);
-    }
-  }
-  return;
-}
-
-int32_t BackgroundNoise::Energy(size_t channel) const {
-  assert(channel < num_channels_);
-  return channel_parameters_[channel].energy;
-}
-
-void BackgroundNoise::SetMuteFactor(size_t channel, int16_t value) {
-  assert(channel < num_channels_);
-  channel_parameters_[channel].mute_factor = value;
-}
-
-int16_t BackgroundNoise::MuteFactor(size_t channel) const {
-  assert(channel < num_channels_);
-  return channel_parameters_[channel].mute_factor;
-}
-
-const int16_t* BackgroundNoise::Filter(size_t channel) const {
-  assert(channel < num_channels_);
-  return channel_parameters_[channel].filter;
-}
-
-const int16_t* BackgroundNoise::FilterState(size_t channel) const {
-  assert(channel < num_channels_);
-  return channel_parameters_[channel].filter_state;
-}
-
-void BackgroundNoise::SetFilterState(size_t channel, const int16_t* input,
-                                     size_t length) {
-  assert(channel < num_channels_);
-  length = std::min(length, kMaxLpcOrder);
-  memcpy(channel_parameters_[channel].filter_state, input,
-         length * sizeof(int16_t));
-}
-
-int16_t BackgroundNoise::Scale(size_t channel) const {
-  assert(channel < num_channels_);
-  return channel_parameters_[channel].scale;
-}
-int16_t BackgroundNoise::ScaleShift(size_t channel) const {
-  assert(channel < num_channels_);
-  return channel_parameters_[channel].scale_shift;
-}
-
-int32_t BackgroundNoise::CalculateAutoCorrelation(
-    const int16_t* signal, size_t length, int32_t* auto_correlation) const {
-  static const int kCorrelationStep = -1;
-  const int correlation_scale =
-      CrossCorrelationWithAutoShift(signal, signal, length, kMaxLpcOrder + 1,
-                                    kCorrelationStep, auto_correlation);
-
-  // Number of shifts to normalize energy to energy/sample.
-  int energy_sample_shift = kLogVecLen - correlation_scale;
-  return auto_correlation[0] >> energy_sample_shift;
-}
-
-void BackgroundNoise::IncrementEnergyThreshold(size_t channel,
-                                               int32_t sample_energy) {
-  // TODO(hlundin): Simplify the below threshold update. What this code
-  // does is simply "threshold += (increment * threshold) >> 16", but due
-  // to the limited-width operations, it is not exactly the same. The
-  // difference should be inaudible, but bit-exactness would not be
-  // maintained.
-  assert(channel < num_channels_);
-  ChannelParameters& parameters = channel_parameters_[channel];
-  int32_t temp_energy =
-    (kThresholdIncrement * parameters.low_energy_update_threshold) >> 16;
-  temp_energy += kThresholdIncrement *
-      (parameters.energy_update_threshold & 0xFF);
-  temp_energy += (kThresholdIncrement *
-      ((parameters.energy_update_threshold>>8) & 0xFF)) << 8;
-  parameters.low_energy_update_threshold += temp_energy;
-
-  parameters.energy_update_threshold += kThresholdIncrement *
-      (parameters.energy_update_threshold>>16);
-  parameters.energy_update_threshold +=
-      parameters.low_energy_update_threshold >> 16;
-  parameters.low_energy_update_threshold =
-      parameters.low_energy_update_threshold & 0x0FFFF;
-
-  // Update maximum energy.
-  // Decrease by a factor 1/1024 each time.
-  parameters.max_energy = parameters.max_energy -
-      (parameters.max_energy >> 10);
-  if (sample_energy > parameters.max_energy) {
-    parameters.max_energy = sample_energy;
-  }
-
-  // Set |energy_update_threshold| to no less than 60 dB lower than
-  // |max_energy_|. Adding 524288 assures proper rounding.
-  int32_t energy_update_threshold = (parameters.max_energy + 524288) >> 20;
-  if (energy_update_threshold > parameters.energy_update_threshold) {
-    parameters.energy_update_threshold = energy_update_threshold;
-  }
-}
-
-void BackgroundNoise::SaveParameters(size_t channel,
-                                     const int16_t* lpc_coefficients,
-                                     const int16_t* filter_state,
-                                     int32_t sample_energy,
-                                     int32_t residual_energy) {
-  assert(channel < num_channels_);
-  ChannelParameters& parameters = channel_parameters_[channel];
-  memcpy(parameters.filter, lpc_coefficients,
-         (kMaxLpcOrder+1) * sizeof(int16_t));
-  memcpy(parameters.filter_state, filter_state,
-         kMaxLpcOrder * sizeof(int16_t));
-  // Save energy level and update energy threshold levels.
-  // Never get under 1.0 in average sample energy.
-  parameters.energy = std::max(sample_energy, 1);
-  parameters.energy_update_threshold = parameters.energy;
-  parameters.low_energy_update_threshold = 0;
-
-  // Normalize residual_energy to 29 or 30 bits before sqrt.
-  int16_t norm_shift = WebRtcSpl_NormW32(residual_energy) - 1;
-  if (norm_shift & 0x1) {
-    norm_shift -= 1;  // Even number of shifts required.
-  }
-  residual_energy = WEBRTC_SPL_SHIFT_W32(residual_energy, norm_shift);
-
-  // Calculate scale and shift factor.
-  parameters.scale = static_cast<int16_t>(WebRtcSpl_SqrtFloor(residual_energy));
-  // Add 13 to the |scale_shift_|, since the random numbers table is in
-  // Q13.
-  // TODO(hlundin): Move the "13" to where the |scale_shift_| is used?
-  parameters.scale_shift =
-      static_cast<int16_t>(13 + ((kLogResidualLength + norm_shift) / 2));
-
-  initialized_ = true;
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/neteq/background_noise.h b/modules/audio_coding/neteq/background_noise.h
deleted file mode 100644
index 0c662bd..0000000
--- a/modules/audio_coding/neteq/background_noise.h
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
- *  Copyright (c) 2012 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_NETEQ_BACKGROUND_NOISE_H_
-#define WEBRTC_MODULES_AUDIO_CODING_NETEQ_BACKGROUND_NOISE_H_
-
-#include <string.h>  // size_t
-#include <memory>
-
-#include "webrtc/modules/audio_coding/neteq/audio_multi_vector.h"
-#include "webrtc/modules/audio_coding/neteq/include/neteq.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-// Forward declarations.
-class PostDecodeVad;
-
-// This class handles estimation of background noise parameters.
-class BackgroundNoise {
- public:
-  // TODO(hlundin): For 48 kHz support, increase kMaxLpcOrder to 10.
-  // Will work anyway, but probably sound a little worse.
-  static const size_t kMaxLpcOrder = 8;  // 32000 / 8000 + 4.
-
-  explicit BackgroundNoise(size_t num_channels);
-  virtual ~BackgroundNoise();
-
-  void Reset();
-
-  // Updates the parameter estimates based on the signal currently in the
-  // |sync_buffer|, and on the latest decision in |vad| if it is running.
-  void Update(const AudioMultiVector& sync_buffer,
-              const PostDecodeVad& vad);
-
-  // Returns |energy_| for |channel|.
-  int32_t Energy(size_t channel) const;
-
-  // Sets the value of |mute_factor_| for |channel| to |value|.
-  void SetMuteFactor(size_t channel, int16_t value);
-
-  // Returns |mute_factor_| for |channel|.
-  int16_t MuteFactor(size_t channel) const;
-
-  // Returns a pointer to |filter_| for |channel|.
-  const int16_t* Filter(size_t channel) const;
-
-  // Returns a pointer to |filter_state_| for |channel|.
-  const int16_t* FilterState(size_t channel) const;
-
-  // Copies |length| elements from |input| to the filter state. Will not copy
-  // more than |kMaxLpcOrder| elements.
-  void SetFilterState(size_t channel, const int16_t* input, size_t length);
-
-  // Returns |scale_| for |channel|.
-  int16_t Scale(size_t channel) const;
-
-  // Returns |scale_shift_| for |channel|.
-  int16_t ScaleShift(size_t channel) const;
-
-  // Accessors.
-  bool initialized() const { return initialized_; }
-  NetEq::BackgroundNoiseMode mode() const { return mode_; }
-
-  // Sets the mode of the background noise playout for cases when there is long
-  // duration of packet loss.
-  void set_mode(NetEq::BackgroundNoiseMode mode) { mode_ = mode; }
-
- private:
-  static const int kThresholdIncrement = 229;  // 0.0035 in Q16.
-  static const size_t kVecLen = 256;
-  static const int kLogVecLen = 8;  // log2(kVecLen).
-  static const size_t kResidualLength = 64;
-  static const int16_t kLogResidualLength = 6;  // log2(kResidualLength)
-
-  struct ChannelParameters {
-    // Constructor.
-    ChannelParameters() {
-      Reset();
-    }
-
-    void Reset() {
-      energy = 2500;
-      max_energy = 0;
-      energy_update_threshold = 500000;
-      low_energy_update_threshold = 0;
-      memset(filter_state, 0, sizeof(filter_state));
-      memset(filter, 0, sizeof(filter));
-      filter[0] = 4096;
-      mute_factor = 0,
-      scale = 20000;
-      scale_shift = 24;
-    }
-
-    int32_t energy;
-    int32_t max_energy;
-    int32_t energy_update_threshold;
-    int32_t low_energy_update_threshold;
-    int16_t filter_state[kMaxLpcOrder];
-    int16_t filter[kMaxLpcOrder + 1];
-    int16_t mute_factor;
-    int16_t scale;
-    int16_t scale_shift;
-  };
-
-  int32_t CalculateAutoCorrelation(const int16_t* signal,
-                                   size_t length,
-                                   int32_t* auto_correlation) const;
-
-  // Increments the energy threshold by a factor 1 + |kThresholdIncrement|.
-  void IncrementEnergyThreshold(size_t channel, int32_t sample_energy);
-
-  // Updates the filter parameters.
-  void SaveParameters(size_t channel,
-                      const int16_t* lpc_coefficients,
-                      const int16_t* filter_state,
-                      int32_t sample_energy,
-                      int32_t residual_energy);
-
-  size_t num_channels_;
-  std::unique_ptr<ChannelParameters[]> channel_parameters_;
-  bool initialized_;
-  NetEq::BackgroundNoiseMode mode_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(BackgroundNoise);
-};
-
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_AUDIO_CODING_NETEQ_BACKGROUND_NOISE_H_
diff --git a/modules/audio_coding/neteq/background_noise_unittest.cc b/modules/audio_coding/neteq/background_noise_unittest.cc
deleted file mode 100644
index 3305b2c..0000000
--- a/modules/audio_coding/neteq/background_noise_unittest.cc
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- *  Copyright (c) 2012 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.
- */
-
-// Unit tests for BackgroundNoise class.
-
-#include "webrtc/modules/audio_coding/neteq/background_noise.h"
-
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-TEST(BackgroundNoise, CreateAndDestroy) {
-  size_t channels = 1;
-  BackgroundNoise bgn(channels);
-}
-
-// TODO(hlundin): Write more tests.
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/neteq/buffer_level_filter.cc b/modules/audio_coding/neteq/buffer_level_filter.cc
deleted file mode 100644
index 9054791..0000000
--- a/modules/audio_coding/neteq/buffer_level_filter.cc
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- *  Copyright (c) 2012 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/neteq/buffer_level_filter.h"
-
-#include <algorithm>  // Provide access to std::max.
-
-namespace webrtc {
-
-BufferLevelFilter::BufferLevelFilter() {
-  Reset();
-}
-
-void BufferLevelFilter::Reset() {
-  filtered_current_level_ = 0;
-  level_factor_ = 253;
-}
-
-void BufferLevelFilter::Update(size_t buffer_size_packets,
-                               int time_stretched_samples,
-                               size_t packet_len_samples) {
-  // Filter:
-  // |filtered_current_level_| = |level_factor_| * |filtered_current_level_| +
-  //                            (1 - |level_factor_|) * |buffer_size_packets|
-  // |level_factor_| and |filtered_current_level_| are in Q8.
-  // |buffer_size_packets| is in Q0.
-  filtered_current_level_ = ((level_factor_ * filtered_current_level_) >> 8) +
-      ((256 - level_factor_) * static_cast<int>(buffer_size_packets));
-
-  // Account for time-scale operations (accelerate and pre-emptive expand).
-  if (time_stretched_samples && packet_len_samples > 0) {
-    // Time-scaling has been performed since last filter update. Subtract the
-    // value of |time_stretched_samples| from |filtered_current_level_| after
-    // converting |time_stretched_samples| from samples to packets in Q8.
-    // Make sure that the filtered value remains non-negative.
-    filtered_current_level_ = std::max(0,
-        filtered_current_level_ -
-        (time_stretched_samples << 8) / static_cast<int>(packet_len_samples));
-  }
-}
-
-void BufferLevelFilter::SetTargetBufferLevel(int target_buffer_level) {
-  if (target_buffer_level <= 1) {
-    level_factor_ = 251;
-  } else if (target_buffer_level <= 3) {
-    level_factor_ = 252;
-  } else if (target_buffer_level <= 7) {
-    level_factor_ = 253;
-  } else {
-    level_factor_ = 254;
-  }
-}
-
-int BufferLevelFilter::filtered_current_level() const {
-  return filtered_current_level_;
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/neteq/buffer_level_filter.h b/modules/audio_coding/neteq/buffer_level_filter.h
deleted file mode 100644
index bc9a10e..0000000
--- a/modules/audio_coding/neteq/buffer_level_filter.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- *  Copyright (c) 2012 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_NETEQ_BUFFER_LEVEL_FILTER_H_
-#define WEBRTC_MODULES_AUDIO_CODING_NETEQ_BUFFER_LEVEL_FILTER_H_
-
-#include <stddef.h>
-
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace webrtc {
-
-class BufferLevelFilter {
- public:
-  BufferLevelFilter();
-  virtual ~BufferLevelFilter() {}
-  virtual void Reset();
-
-  // Updates the filter. Current buffer size is |buffer_size_packets| (Q0).
-  // If |time_stretched_samples| is non-zero, the value is converted to the
-  // corresponding number of packets, and is subtracted from the filtered
-  // value (thus bypassing the filter operation). |packet_len_samples| is the
-  // number of audio samples carried in each incoming packet.
-  virtual void Update(size_t buffer_size_packets, int time_stretched_samples,
-                      size_t packet_len_samples);
-
-  // Set the current target buffer level (obtained from
-  // DelayManager::base_target_level()). Used to select the appropriate
-  // filter coefficient.
-  virtual void SetTargetBufferLevel(int target_buffer_level);
-
-  virtual int filtered_current_level() const;
-
- private:
-  int level_factor_;  // Filter factor for the buffer level filter in Q8.
-  int filtered_current_level_;  // Filtered current buffer level in Q8.
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(BufferLevelFilter);
-};
-
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_AUDIO_CODING_NETEQ_BUFFER_LEVEL_FILTER_H_
diff --git a/modules/audio_coding/neteq/buffer_level_filter_unittest.cc b/modules/audio_coding/neteq/buffer_level_filter_unittest.cc
deleted file mode 100644
index cfa6e3d..0000000
--- a/modules/audio_coding/neteq/buffer_level_filter_unittest.cc
+++ /dev/null
@@ -1,162 +0,0 @@
-/*
- *  Copyright (c) 2012 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.
- */
-
-// Unit tests for BufferLevelFilter class.
-
-#include "webrtc/modules/audio_coding/neteq/buffer_level_filter.h"
-
-#include <math.h>  // Access to pow function.
-
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-TEST(BufferLevelFilter, CreateAndDestroy) {
-  BufferLevelFilter* filter = new BufferLevelFilter();
-  EXPECT_EQ(0, filter->filtered_current_level());
-  delete filter;
-}
-
-TEST(BufferLevelFilter, ConvergenceTest) {
-  BufferLevelFilter filter;
-  for (int times = 10; times <= 50; times += 10) {
-    for (int value = 100; value <= 200; value += 10) {
-      filter.Reset();
-      filter.SetTargetBufferLevel(1);  // Makes filter coefficient 251/256.
-      std::ostringstream ss;
-      ss << "times = " << times << ", value = " << value;
-      SCOPED_TRACE(ss.str());  // Print out the parameter values on failure.
-      for (int i = 0; i < times; ++i) {
-        filter.Update(value, 0 /* time_stretched_samples */,
-                      160 /* packet_len_samples */);
-      }
-      // Expect the filtered value to be (theoretically)
-      // (1 - (251/256) ^ |times|) * |value|.
-      double expected_value_double =
-          (1 - pow(251.0 / 256.0, times)) * value;
-      int expected_value = static_cast<int>(expected_value_double);
-      // filtered_current_level() returns the value in Q8.
-      // The actual value may differ slightly from the expected value due to
-      // intermediate-stage rounding errors in the filter implementation.
-      // This is why we have to use EXPECT_NEAR with a tolerance of +/-1.
-      EXPECT_NEAR(expected_value, filter.filtered_current_level() >> 8, 1);
-    }
-  }
-}
-
-// Verify that target buffer level impacts on the filter convergence.
-TEST(BufferLevelFilter, FilterFactor) {
-  BufferLevelFilter filter;
-  // Update 10 times with value 100.
-  const int kTimes = 10;
-  const int kValue = 100;
-
-  filter.SetTargetBufferLevel(3);  // Makes filter coefficient 252/256.
-  for (int i = 0; i < kTimes; ++i) {
-    filter.Update(kValue, 0 /* time_stretched_samples */,
-                  160 /* packet_len_samples */);
-  }
-  // Expect the filtered value to be
-  // (1 - (252/256) ^ |kTimes|) * |kValue|.
-  int expected_value = 14;
-  // filtered_current_level() returns the value in Q8.
-  EXPECT_EQ(expected_value, filter.filtered_current_level() >> 8);
-
-  filter.Reset();
-  filter.SetTargetBufferLevel(7);  // Makes filter coefficient 253/256.
-  for (int i = 0; i < kTimes; ++i) {
-    filter.Update(kValue, 0 /* time_stretched_samples */,
-                  160 /* packet_len_samples */);
-  }
-  // Expect the filtered value to be
-  // (1 - (253/256) ^ |kTimes|) * |kValue|.
-  expected_value = 11;
-  // filtered_current_level() returns the value in Q8.
-  EXPECT_EQ(expected_value, filter.filtered_current_level() >> 8);
-
-  filter.Reset();
-  filter.SetTargetBufferLevel(8);  // Makes filter coefficient 254/256.
-  for (int i = 0; i < kTimes; ++i) {
-    filter.Update(kValue, 0 /* time_stretched_samples */,
-                  160 /* packet_len_samples */);
-  }
-  // Expect the filtered value to be
-  // (1 - (254/256) ^ |kTimes|) * |kValue|.
-  expected_value = 7;
-  // filtered_current_level() returns the value in Q8.
-  EXPECT_EQ(expected_value, filter.filtered_current_level() >> 8);
-}
-
-
-TEST(BufferLevelFilter, TimeStretchedSamples) {
-  BufferLevelFilter filter;
-  filter.SetTargetBufferLevel(1);  // Makes filter coefficient 251/256.
-  // Update 10 times with value 100.
-  const int kTimes = 10;
-  const int kValue = 100;
-  const int kPacketSizeSamples = 160;
-  const int kNumPacketsStretched = 2;
-  const int kTimeStretchedSamples = kNumPacketsStretched * kPacketSizeSamples;
-  for (int i = 0; i < kTimes; ++i) {
-    // Packet size set to 0. Do not expect the parameter
-    // |kTimeStretchedSamples| to have any effect.
-    filter.Update(kValue, kTimeStretchedSamples, 0 /* packet_len_samples */);
-  }
-  // Expect the filtered value to be
-  // (1 - (251/256) ^ |kTimes|) * |kValue|.
-  const int kExpectedValue = 17;
-  // filtered_current_level() returns the value in Q8.
-  EXPECT_EQ(kExpectedValue, filter.filtered_current_level() >> 8);
-
-  // Update filter again, now with non-zero value for packet length.
-  // Set the current filtered value to be the input, in order to isolate the
-  // impact of |kTimeStretchedSamples|.
-  filter.Update(filter.filtered_current_level() >> 8, kTimeStretchedSamples,
-                kPacketSizeSamples);
-  EXPECT_EQ(kExpectedValue - kNumPacketsStretched,
-            filter.filtered_current_level() >> 8);
-  // Try negative value and verify that we come back to the previous result.
-  filter.Update(filter.filtered_current_level() >> 8, -kTimeStretchedSamples,
-                kPacketSizeSamples);
-  EXPECT_EQ(kExpectedValue, filter.filtered_current_level() >> 8);
-}
-
-TEST(BufferLevelFilter, TimeStretchedSamplesNegativeUnevenFrames) {
-  BufferLevelFilter filter;
-  filter.SetTargetBufferLevel(1);  // Makes filter coefficient 251/256.
-  // Update 10 times with value 100.
-  const int kTimes = 10;
-  const int kValue = 100;
-  const int kPacketSizeSamples = 160;
-  const int kTimeStretchedSamples = -3.1415 * kPacketSizeSamples;
-  for (int i = 0; i < kTimes; ++i) {
-    // Packet size set to 0. Do not expect the parameter
-    // |kTimeStretchedSamples| to have any effect.
-    filter.Update(kValue, kTimeStretchedSamples, 0 /* packet_len_samples */);
-  }
-  // Expect the filtered value to be
-  // (1 - (251/256) ^ |kTimes|) * |kValue|.
-  const int kExpectedValue = 17;
-  // filtered_current_level() returns the value in Q8.
-  EXPECT_EQ(kExpectedValue, filter.filtered_current_level() >> 8);
-
-  // Update filter again, now with non-zero value for packet length.
-  // Set the current filtered value to be the input, in order to isolate the
-  // impact of |kTimeStretchedSamples|.
-  filter.Update(filter.filtered_current_level() >> 8, kTimeStretchedSamples,
-                kPacketSizeSamples);
-  EXPECT_EQ(21, filter.filtered_current_level() >> 8);
-  // Try negative value and verify that we come back to the previous result.
-  filter.Update(filter.filtered_current_level() >> 8, -kTimeStretchedSamples,
-                kPacketSizeSamples);
-  EXPECT_EQ(kExpectedValue, filter.filtered_current_level() >> 8);
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/neteq/comfort_noise.cc b/modules/audio_coding/neteq/comfort_noise.cc
deleted file mode 100644
index 8482e8d..0000000
--- a/modules/audio_coding/neteq/comfort_noise.cc
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- *  Copyright (c) 2012 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/neteq/comfort_noise.h"
-
-#include <assert.h>
-
-#include "webrtc/api/audio_codecs/audio_decoder.h"
-#include "webrtc/modules/audio_coding/neteq/decoder_database.h"
-#include "webrtc/modules/audio_coding/neteq/dsp_helper.h"
-#include "webrtc/modules/audio_coding/neteq/sync_buffer.h"
-#include "webrtc/rtc_base/logging.h"
-
-namespace webrtc {
-
-void ComfortNoise::Reset() {
-  first_call_ = true;
-}
-
-int ComfortNoise::UpdateParameters(const Packet& packet) {
-  // Get comfort noise decoder.
-  if (decoder_database_->SetActiveCngDecoder(packet.payload_type) != kOK) {
-    return kUnknownPayloadType;
-  }
-  ComfortNoiseDecoder* cng_decoder = decoder_database_->GetActiveCngDecoder();
-  RTC_DCHECK(cng_decoder);
-  cng_decoder->UpdateSid(packet.payload);
-  return kOK;
-}
-
-int ComfortNoise::Generate(size_t requested_length,
-                           AudioMultiVector* output) {
-  // TODO(hlundin): Change to an enumerator and skip assert.
-  assert(fs_hz_ == 8000 || fs_hz_ == 16000 || fs_hz_ ==  32000 ||
-         fs_hz_ == 48000);
-  // Not adapted for multi-channel yet.
-  if (output->Channels() != 1) {
-    LOG(LS_ERROR) << "No multi-channel support";
-    return kMultiChannelNotSupported;
-  }
-
-  size_t number_of_samples = requested_length;
-  bool new_period = false;
-  if (first_call_) {
-    // Generate noise and overlap slightly with old data.
-    number_of_samples = requested_length + overlap_length_;
-    new_period = true;
-  }
-  output->AssertSize(number_of_samples);
-  // Get the decoder from the database.
-  ComfortNoiseDecoder* cng_decoder = decoder_database_->GetActiveCngDecoder();
-  if (!cng_decoder) {
-    LOG(LS_ERROR) << "Unknwown payload type";
-    return kUnknownPayloadType;
-  }
-
-  std::unique_ptr<int16_t[]> temp(new int16_t[number_of_samples]);
-  if (!cng_decoder->Generate(
-          rtc::ArrayView<int16_t>(temp.get(), number_of_samples),
-          new_period)) {
-    // Error returned.
-    output->Zeros(requested_length);
-    LOG(LS_ERROR) <<
-        "ComfortNoiseDecoder::Genererate failed to generate comfort noise";
-    return kInternalError;
-  }
-  (*output)[0].OverwriteAt(temp.get(), number_of_samples, 0);
-
-  if (first_call_) {
-    // Set tapering window parameters. Values are in Q15.
-    int16_t muting_window;  // Mixing factor for overlap data.
-    int16_t muting_window_increment;  // Mixing factor increment (negative).
-    int16_t unmuting_window;  // Mixing factor for comfort noise.
-    int16_t unmuting_window_increment;  // Mixing factor increment.
-    if (fs_hz_ == 8000) {
-      muting_window = DspHelper::kMuteFactorStart8kHz;
-      muting_window_increment = DspHelper::kMuteFactorIncrement8kHz;
-      unmuting_window = DspHelper::kUnmuteFactorStart8kHz;
-      unmuting_window_increment = DspHelper::kUnmuteFactorIncrement8kHz;
-    } else if (fs_hz_ == 16000) {
-      muting_window = DspHelper::kMuteFactorStart16kHz;
-      muting_window_increment = DspHelper::kMuteFactorIncrement16kHz;
-      unmuting_window = DspHelper::kUnmuteFactorStart16kHz;
-      unmuting_window_increment = DspHelper::kUnmuteFactorIncrement16kHz;
-    } else if (fs_hz_ == 32000) {
-      muting_window = DspHelper::kMuteFactorStart32kHz;
-      muting_window_increment = DspHelper::kMuteFactorIncrement32kHz;
-      unmuting_window = DspHelper::kUnmuteFactorStart32kHz;
-      unmuting_window_increment = DspHelper::kUnmuteFactorIncrement32kHz;
-    } else {  // fs_hz_ == 48000
-      muting_window = DspHelper::kMuteFactorStart48kHz;
-      muting_window_increment = DspHelper::kMuteFactorIncrement48kHz;
-      unmuting_window = DspHelper::kUnmuteFactorStart48kHz;
-      unmuting_window_increment = DspHelper::kUnmuteFactorIncrement48kHz;
-    }
-
-    // Do overlap-add between new vector and overlap.
-    size_t start_ix = sync_buffer_->Size() - overlap_length_;
-    for (size_t i = 0; i < overlap_length_; i++) {
-      /* overlapVec[i] = WinMute * overlapVec[i] + WinUnMute * outData[i] */
-      // The expression (*output)[0][i] is the i-th element in the first
-      // channel.
-      (*sync_buffer_)[0][start_ix + i] =
-          (((*sync_buffer_)[0][start_ix + i] * muting_window) +
-              ((*output)[0][i] * unmuting_window) + 16384) >> 15;
-      muting_window += muting_window_increment;
-      unmuting_window += unmuting_window_increment;
-    }
-    // Remove |overlap_length_| samples from the front of |output| since they
-    // were mixed into |sync_buffer_| above.
-    output->PopFront(overlap_length_);
-  }
-  first_call_ = false;
-  return kOK;
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/neteq/comfort_noise.h b/modules/audio_coding/neteq/comfort_noise.h
deleted file mode 100644
index fe663cc..0000000
--- a/modules/audio_coding/neteq/comfort_noise.h
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- *  Copyright (c) 2012 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_NETEQ_COMFORT_NOISE_H_
-#define WEBRTC_MODULES_AUDIO_CODING_NETEQ_COMFORT_NOISE_H_
-
-#include "webrtc/modules/audio_coding/neteq/audio_multi_vector.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-// Forward declarations.
-class DecoderDatabase;
-class SyncBuffer;
-struct Packet;
-
-// This class acts as an interface to the CNG generator.
-class ComfortNoise {
- public:
-  enum ReturnCodes {
-    kOK = 0,
-    kUnknownPayloadType,
-    kInternalError,
-    kMultiChannelNotSupported
-  };
-
-  ComfortNoise(int fs_hz, DecoderDatabase* decoder_database,
-               SyncBuffer* sync_buffer)
-      : fs_hz_(fs_hz),
-        first_call_(true),
-        overlap_length_(5 * fs_hz_ / 8000),
-        decoder_database_(decoder_database),
-        sync_buffer_(sync_buffer) {
-  }
-
-  // Resets the state. Should be called before each new comfort noise period.
-  void Reset();
-
-  // Update the comfort noise generator with the parameters in |packet|.
-  int UpdateParameters(const Packet& packet);
-
-  // Generates |requested_length| samples of comfort noise and writes to
-  // |output|. If this is the first in call after Reset (or first after creating
-  // the object), it will also mix in comfort noise at the end of the
-  // SyncBuffer object provided in the constructor.
-  int Generate(size_t requested_length, AudioMultiVector* output);
-
-  // Returns the last error code that was produced by the comfort noise
-  // decoder. Returns 0 if no error has been encountered since the last reset.
-  int internal_error_code() { return internal_error_code_; }
-
- private:
-  int fs_hz_;
-  bool first_call_;
-  size_t overlap_length_;
-  DecoderDatabase* decoder_database_;
-  SyncBuffer* sync_buffer_;
-  int internal_error_code_;
-  RTC_DISALLOW_COPY_AND_ASSIGN(ComfortNoise);
-};
-
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_AUDIO_CODING_NETEQ_COMFORT_NOISE_H_
diff --git a/modules/audio_coding/neteq/comfort_noise_unittest.cc b/modules/audio_coding/neteq/comfort_noise_unittest.cc
deleted file mode 100644
index 2de6886..0000000
--- a/modules/audio_coding/neteq/comfort_noise_unittest.cc
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- *  Copyright (c) 2012 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.
- */
-
-// Unit tests for ComfortNoise class.
-
-#include "webrtc/modules/audio_coding/neteq/comfort_noise.h"
-
-#include "webrtc/modules/audio_coding/neteq/mock/mock_decoder_database.h"
-#include "webrtc/modules/audio_coding/neteq/sync_buffer.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-TEST(ComfortNoise, CreateAndDestroy) {
-  int fs = 8000;
-  MockDecoderDatabase db;
-  SyncBuffer sync_buffer(1, 1000);
-  ComfortNoise cn(fs, &db, &sync_buffer);
-  EXPECT_CALL(db, Die());  // Called when |db| goes out of scope.
-}
-
-// TODO(hlundin): Write more tests.
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/neteq/cross_correlation.cc b/modules/audio_coding/neteq/cross_correlation.cc
deleted file mode 100644
index ad89ab8..0000000
--- a/modules/audio_coding/neteq/cross_correlation.cc
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- *  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/neteq/cross_correlation.h"
-
-#include <cstdlib>
-#include <limits>
-
-#include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
-
-namespace webrtc {
-
-// This function decides the overflow-protecting scaling and calls
-// WebRtcSpl_CrossCorrelation.
-int CrossCorrelationWithAutoShift(const int16_t* sequence_1,
-                                  const int16_t* sequence_2,
-                                  size_t sequence_1_length,
-                                  size_t cross_correlation_length,
-                                  int cross_correlation_step,
-                                  int32_t* cross_correlation) {
-  // Find the maximum absolute value of sequence_1 and 2.
-  const int16_t max_1 = WebRtcSpl_MaxAbsValueW16(sequence_1, sequence_1_length);
-  const int sequence_2_shift =
-      cross_correlation_step * (static_cast<int>(cross_correlation_length) - 1);
-  const int16_t* sequence_2_start =
-      sequence_2_shift >= 0 ? sequence_2 : sequence_2 + sequence_2_shift;
-  const size_t sequence_2_length =
-      sequence_1_length + std::abs(sequence_2_shift);
-  const int16_t max_2 =
-      WebRtcSpl_MaxAbsValueW16(sequence_2_start, sequence_2_length);
-
-  // In order to avoid overflow when computing the sum we should scale the
-  // samples so that (in_vector_length * max_1 * max_2) will not overflow.
-  // Expected scaling fulfills
-  // 1) sufficient:
-  //    sequence_1_length * (max_1 * max_2 >> scaling) <= 0x7fffffff;
-  // 2) necessary:
-  //    if (scaling > 0)
-  //      sequence_1_length * (max_1 * max_2 >> (scaling - 1)) > 0x7fffffff;
-  // The following calculation fulfills 1) and almost fulfills 2).
-  // There are some corner cases that 2) is not satisfied, e.g.,
-  // max_1 = 17, max_2 = 30848, sequence_1_length = 4095, in such case,
-  // optimal scaling is 0, while the following calculation results in 1.
-  const int32_t factor = (max_1 * max_2) / (std::numeric_limits<int32_t>::max()
-      / static_cast<int32_t>(sequence_1_length));
-  const int scaling = factor == 0 ? 0 : 31 - WebRtcSpl_NormW32(factor);
-
-  WebRtcSpl_CrossCorrelation(cross_correlation, sequence_1, sequence_2,
-                             sequence_1_length, cross_correlation_length,
-                             scaling, cross_correlation_step);
-
-  return scaling;
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/neteq/cross_correlation.h b/modules/audio_coding/neteq/cross_correlation.h
deleted file mode 100644
index db14141..0000000
--- a/modules/audio_coding/neteq/cross_correlation.h
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- *  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_NETEQ_CROSS_CORRELATION_H_
-#define WEBRTC_MODULES_AUDIO_CODING_NETEQ_CROSS_CORRELATION_H_
-
-#include "webrtc/common_types.h"
-
-namespace webrtc {
-
-// The function calculates the cross-correlation between two sequences
-// |sequence_1| and |sequence_2|. |sequence_1| is taken as reference, with
-// |sequence_1_length| as its length. |sequence_2| slides for the calculation of
-// cross-correlation. The result will be saved in |cross_correlation|.
-// |cross_correlation_length| correlation points are calculated.
-// The corresponding lag starts from 0, and increases with a step of
-// |cross_correlation_step|. The result is without normalization. To avoid
-// overflow, the result will be right shifted. The amount of shifts will be
-// returned.
-//
-// Input:
-//     - sequence_1     : First sequence (reference).
-//     - sequence_2     : Second sequence (sliding during calculation).
-//     - sequence_1_length : Length of |sequence_1|.
-//     - cross_correlation_length : Number of cross-correlations to calculate.
-//     - cross_correlation_step : Step in the lag for the cross-correlation.
-//
-// Output:
-//      - cross_correlation : The cross-correlation in Q(-right_shifts)
-//
-// Return:
-//      Number of right shifts in cross_correlation.
-
-int CrossCorrelationWithAutoShift(const int16_t* sequence_1,
-                                  const int16_t* sequence_2,
-                                  size_t sequence_1_length,
-                                  size_t cross_correlation_length,
-                                  int cross_correlation_step,
-                                  int32_t* cross_correlation);
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_CODING_NETEQ_CROSS_CORRELATION_H_
diff --git a/modules/audio_coding/neteq/decision_logic.cc b/modules/audio_coding/neteq/decision_logic.cc
deleted file mode 100644
index 94c542d..0000000
--- a/modules/audio_coding/neteq/decision_logic.cc
+++ /dev/null
@@ -1,170 +0,0 @@
-/*
- *  Copyright (c) 2013 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/neteq/decision_logic.h"
-
-#include <algorithm>
-
-#include "webrtc/modules/audio_coding/neteq/buffer_level_filter.h"
-#include "webrtc/modules/audio_coding/neteq/decision_logic_fax.h"
-#include "webrtc/modules/audio_coding/neteq/decision_logic_normal.h"
-#include "webrtc/modules/audio_coding/neteq/delay_manager.h"
-#include "webrtc/modules/audio_coding/neteq/expand.h"
-#include "webrtc/modules/audio_coding/neteq/packet_buffer.h"
-#include "webrtc/modules/audio_coding/neteq/sync_buffer.h"
-
-namespace webrtc {
-
-DecisionLogic* DecisionLogic::Create(int fs_hz,
-                                     size_t output_size_samples,
-                                     NetEqPlayoutMode playout_mode,
-                                     DecoderDatabase* decoder_database,
-                                     const PacketBuffer& packet_buffer,
-                                     DelayManager* delay_manager,
-                                     BufferLevelFilter* buffer_level_filter,
-                                     const TickTimer* tick_timer) {
-  switch (playout_mode) {
-    case kPlayoutOn:
-    case kPlayoutStreaming:
-      return new DecisionLogicNormal(
-          fs_hz, output_size_samples, playout_mode, decoder_database,
-          packet_buffer, delay_manager, buffer_level_filter, tick_timer);
-    case kPlayoutFax:
-    case kPlayoutOff:
-      return new DecisionLogicFax(
-          fs_hz, output_size_samples, playout_mode, decoder_database,
-          packet_buffer, delay_manager, buffer_level_filter, tick_timer);
-  }
-  // This line cannot be reached, but must be here to avoid compiler errors.
-  assert(false);
-  return NULL;
-}
-
-DecisionLogic::DecisionLogic(int fs_hz,
-                             size_t output_size_samples,
-                             NetEqPlayoutMode playout_mode,
-                             DecoderDatabase* decoder_database,
-                             const PacketBuffer& packet_buffer,
-                             DelayManager* delay_manager,
-                             BufferLevelFilter* buffer_level_filter,
-                             const TickTimer* tick_timer)
-    : decoder_database_(decoder_database),
-      packet_buffer_(packet_buffer),
-      delay_manager_(delay_manager),
-      buffer_level_filter_(buffer_level_filter),
-      tick_timer_(tick_timer),
-      cng_state_(kCngOff),
-      packet_length_samples_(0),
-      sample_memory_(0),
-      prev_time_scale_(false),
-      timescale_countdown_(
-          tick_timer_->GetNewCountdown(kMinTimescaleInterval + 1)),
-      num_consecutive_expands_(0),
-      playout_mode_(playout_mode) {
-  delay_manager_->set_streaming_mode(playout_mode_ == kPlayoutStreaming);
-  SetSampleRate(fs_hz, output_size_samples);
-}
-
-DecisionLogic::~DecisionLogic() = default;
-
-void DecisionLogic::Reset() {
-  cng_state_ = kCngOff;
-  noise_fast_forward_ = 0;
-  packet_length_samples_ = 0;
-  sample_memory_ = 0;
-  prev_time_scale_ = false;
-  timescale_countdown_.reset();
-  num_consecutive_expands_ = 0;
-}
-
-void DecisionLogic::SoftReset() {
-  packet_length_samples_ = 0;
-  sample_memory_ = 0;
-  prev_time_scale_ = false;
-  timescale_countdown_ =
-      tick_timer_->GetNewCountdown(kMinTimescaleInterval + 1);
-}
-
-void DecisionLogic::SetSampleRate(int fs_hz, size_t output_size_samples) {
-  // TODO(hlundin): Change to an enumerator and skip assert.
-  assert(fs_hz == 8000 || fs_hz == 16000 || fs_hz ==  32000 || fs_hz == 48000);
-  fs_mult_ = fs_hz / 8000;
-  output_size_samples_ = output_size_samples;
-}
-
-Operations DecisionLogic::GetDecision(const SyncBuffer& sync_buffer,
-                                      const Expand& expand,
-                                      size_t decoder_frame_length,
-                                      const Packet* next_packet,
-                                      Modes prev_mode,
-                                      bool play_dtmf,
-                                      size_t generated_noise_samples,
-                                      bool* reset_decoder) {
-  // If last mode was CNG (or Expand, since this could be covering up for
-  // a lost CNG packet), remember that CNG is on. This is needed if comfort
-  // noise is interrupted by DTMF.
-  if (prev_mode == kModeRfc3389Cng) {
-    cng_state_ = kCngRfc3389On;
-  } else if (prev_mode == kModeCodecInternalCng) {
-    cng_state_ = kCngInternalOn;
-  }
-
-  const size_t samples_left =
-      sync_buffer.FutureLength() - expand.overlap_length();
-  const size_t cur_size_samples =
-      samples_left + packet_buffer_.NumSamplesInBuffer(decoder_frame_length);
-
-  prev_time_scale_ = prev_time_scale_ &&
-      (prev_mode == kModeAccelerateSuccess ||
-          prev_mode == kModeAccelerateLowEnergy ||
-          prev_mode == kModePreemptiveExpandSuccess ||
-          prev_mode == kModePreemptiveExpandLowEnergy);
-
-  FilterBufferLevel(cur_size_samples, prev_mode);
-
-  return GetDecisionSpecialized(sync_buffer, expand, decoder_frame_length,
-                                next_packet, prev_mode, play_dtmf,
-                                reset_decoder, generated_noise_samples);
-}
-
-void DecisionLogic::ExpandDecision(Operations operation) {
-  if (operation == kExpand) {
-    num_consecutive_expands_++;
-  } else {
-    num_consecutive_expands_ = 0;
-  }
-}
-
-void DecisionLogic::FilterBufferLevel(size_t buffer_size_samples,
-                                      Modes prev_mode) {
-  // Do not update buffer history if currently playing CNG since it will bias
-  // the filtered buffer level.
-  if ((prev_mode != kModeRfc3389Cng) && (prev_mode != kModeCodecInternalCng)) {
-    buffer_level_filter_->SetTargetBufferLevel(
-        delay_manager_->base_target_level());
-
-    size_t buffer_size_packets = 0;
-    if (packet_length_samples_ > 0) {
-      // Calculate size in packets.
-      buffer_size_packets = buffer_size_samples / packet_length_samples_;
-    }
-    int sample_memory_local = 0;
-    if (prev_time_scale_) {
-      sample_memory_local = sample_memory_;
-      timescale_countdown_ =
-          tick_timer_->GetNewCountdown(kMinTimescaleInterval);
-    }
-    buffer_level_filter_->Update(buffer_size_packets, sample_memory_local,
-                                 packet_length_samples_);
-    prev_time_scale_ = false;
-  }
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/neteq/decision_logic.h b/modules/audio_coding/neteq/decision_logic.h
deleted file mode 100644
index 7d9ba60..0000000
--- a/modules/audio_coding/neteq/decision_logic.h
+++ /dev/null
@@ -1,168 +0,0 @@
-/*
- *  Copyright (c) 2013 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_NETEQ_DECISION_LOGIC_H_
-#define WEBRTC_MODULES_AUDIO_CODING_NETEQ_DECISION_LOGIC_H_
-
-#include "webrtc/modules/audio_coding/neteq/defines.h"
-#include "webrtc/modules/audio_coding/neteq/include/neteq.h"
-#include "webrtc/modules/audio_coding/neteq/tick_timer.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-// Forward declarations.
-class BufferLevelFilter;
-class DecoderDatabase;
-class DelayManager;
-class Expand;
-class PacketBuffer;
-class SyncBuffer;
-struct Packet;
-
-// This is the base class for the decision tree implementations. Derived classes
-// must implement the method GetDecisionSpecialized().
-class DecisionLogic {
- public:
-  // Static factory function which creates different types of objects depending
-  // on the |playout_mode|.
-  static DecisionLogic* Create(int fs_hz,
-                               size_t output_size_samples,
-                               NetEqPlayoutMode playout_mode,
-                               DecoderDatabase* decoder_database,
-                               const PacketBuffer& packet_buffer,
-                               DelayManager* delay_manager,
-                               BufferLevelFilter* buffer_level_filter,
-                               const TickTimer* tick_timer);
-
-  // Constructor.
-  DecisionLogic(int fs_hz,
-                size_t output_size_samples,
-                NetEqPlayoutMode playout_mode,
-                DecoderDatabase* decoder_database,
-                const PacketBuffer& packet_buffer,
-                DelayManager* delay_manager,
-                BufferLevelFilter* buffer_level_filter,
-                const TickTimer* tick_timer);
-
-  virtual ~DecisionLogic();
-
-  // Resets object to a clean state.
-  void Reset();
-
-  // Resets parts of the state. Typically done when switching codecs.
-  void SoftReset();
-
-  // Sets the sample rate and the output block size.
-  void SetSampleRate(int fs_hz, size_t output_size_samples);
-
-  // Returns the operation that should be done next. |sync_buffer| and |expand|
-  // are provided for reference. |decoder_frame_length| is the number of samples
-  // obtained from the last decoded frame. If there is a packet available, it
-  // should be supplied in |next_packet|; otherwise it should be NULL. The mode
-  // resulting from the last call to NetEqImpl::GetAudio is supplied in
-  // |prev_mode|. If there is a DTMF event to play, |play_dtmf| should be set to
-  // true. The output variable |reset_decoder| will be set to true if a reset is
-  // required; otherwise it is left unchanged (i.e., it can remain true if it
-  // was true before the call).  This method end with calling
-  // GetDecisionSpecialized to get the actual return value.
-  Operations GetDecision(const SyncBuffer& sync_buffer,
-                         const Expand& expand,
-                         size_t decoder_frame_length,
-                         const Packet* next_packet,
-                         Modes prev_mode,
-                         bool play_dtmf,
-                         size_t generated_noise_samples,
-                         bool* reset_decoder);
-
-  // These methods test the |cng_state_| for different conditions.
-  bool CngRfc3389On() const { return cng_state_ == kCngRfc3389On; }
-  bool CngOff() const { return cng_state_ == kCngOff; }
-
-  // Resets the |cng_state_| to kCngOff.
-  void SetCngOff() { cng_state_ = kCngOff; }
-
-  // Reports back to DecisionLogic whether the decision to do expand remains or
-  // not. Note that this is necessary, since an expand decision can be changed
-  // to kNormal in NetEqImpl::GetDecision if there is still enough data in the
-  // sync buffer.
-  virtual void ExpandDecision(Operations operation);
-
-  // Adds |value| to |sample_memory_|.
-  void AddSampleMemory(int32_t value) {
-    sample_memory_ += value;
-  }
-
-  // Accessors and mutators.
-  void set_sample_memory(int32_t value) { sample_memory_ = value; }
-  size_t noise_fast_forward() const { return noise_fast_forward_; }
-  size_t packet_length_samples() const { return packet_length_samples_; }
-  void set_packet_length_samples(size_t value) {
-    packet_length_samples_ = value;
-  }
-  void set_prev_time_scale(bool value) { prev_time_scale_ = value; }
-  NetEqPlayoutMode playout_mode() const { return playout_mode_; }
-
- protected:
-  // The value 5 sets maximum time-stretch rate to about 100 ms/s.
-  static const int kMinTimescaleInterval = 5;
-
-  enum CngState {
-    kCngOff,
-    kCngRfc3389On,
-    kCngInternalOn
-  };
-
-  // Returns the operation that should be done next. |sync_buffer| and |expand|
-  // are provided for reference. |decoder_frame_length| is the number of samples
-  // obtained from the last decoded frame. If there is a packet available, it
-  // should be supplied in |next_packet|; otherwise it should be NULL. The mode
-  // resulting from the last call to NetEqImpl::GetAudio is supplied in
-  // |prev_mode|. If there is a DTMF event to play, |play_dtmf| should be set to
-  // true. The output variable |reset_decoder| will be set to true if a reset is
-  // required; otherwise it is left unchanged (i.e., it can remain true if it
-  // was true before the call).  Should be implemented by derived classes.
-  virtual Operations GetDecisionSpecialized(const SyncBuffer& sync_buffer,
-                                            const Expand& expand,
-                                            size_t decoder_frame_length,
-                                            const Packet* next_packet,
-                                            Modes prev_mode,
-                                            bool play_dtmf,
-                                            bool* reset_decoder,
-                                            size_t generated_noise_samples) = 0;
-
-  // Updates the |buffer_level_filter_| with the current buffer level
-  // |buffer_size_packets|.
-  void FilterBufferLevel(size_t buffer_size_packets, Modes prev_mode);
-
-  DecoderDatabase* decoder_database_;
-  const PacketBuffer& packet_buffer_;
-  DelayManager* delay_manager_;
-  BufferLevelFilter* buffer_level_filter_;
-  const TickTimer* tick_timer_;
-  int fs_mult_;
-  size_t output_size_samples_;
-  CngState cng_state_;  // Remember if comfort noise is interrupted by other
-                        // event (e.g., DTMF).
-  size_t noise_fast_forward_ = 0;
-  size_t packet_length_samples_;
-  int sample_memory_;
-  bool prev_time_scale_;
-  std::unique_ptr<TickTimer::Countdown> timescale_countdown_;
-  int num_consecutive_expands_;
-  const NetEqPlayoutMode playout_mode_;
-
- private:
-  RTC_DISALLOW_COPY_AND_ASSIGN(DecisionLogic);
-};
-
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_AUDIO_CODING_NETEQ_DECISION_LOGIC_H_
diff --git a/modules/audio_coding/neteq/decision_logic_fax.cc b/modules/audio_coding/neteq/decision_logic_fax.cc
deleted file mode 100644
index 7db8f30..0000000
--- a/modules/audio_coding/neteq/decision_logic_fax.cc
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- *  Copyright (c) 2013 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/neteq/decision_logic_fax.h"
-
-#include <assert.h>
-
-#include <algorithm>
-
-#include "webrtc/modules/audio_coding/neteq/decoder_database.h"
-#include "webrtc/modules/audio_coding/neteq/sync_buffer.h"
-
-namespace webrtc {
-
-Operations DecisionLogicFax::GetDecisionSpecialized(
-    const SyncBuffer& sync_buffer,
-    const Expand& expand,
-    size_t decoder_frame_length,
-    const Packet* next_packet,
-    Modes prev_mode,
-    bool play_dtmf,
-    bool* reset_decoder,
-    size_t generated_noise_samples) {
-  assert(playout_mode_ == kPlayoutFax || playout_mode_ == kPlayoutOff);
-  uint32_t target_timestamp = sync_buffer.end_timestamp();
-  uint32_t available_timestamp = 0;
-  int is_cng_packet = 0;
-  if (next_packet) {
-    available_timestamp = next_packet->timestamp;
-    is_cng_packet =
-        decoder_database_->IsComfortNoise(next_packet->payload_type);
-  }
-  if (is_cng_packet) {
-    if (static_cast<int32_t>((generated_noise_samples + target_timestamp)
-        - available_timestamp) >= 0) {
-      // Time to play this packet now.
-      return kRfc3389Cng;
-    } else {
-      // Wait before playing this packet.
-      return kRfc3389CngNoPacket;
-    }
-  }
-  if (!next_packet) {
-    // No packet. If in CNG mode, play as usual. Otherwise, use other method to
-    // generate data.
-    if (cng_state_ == kCngRfc3389On) {
-      // Continue playing comfort noise.
-      return kRfc3389CngNoPacket;
-    } else if (cng_state_ == kCngInternalOn) {
-      // Continue playing codec-internal comfort noise.
-      return kCodecInternalCng;
-    } else {
-      // Nothing to play. Generate some data to play out.
-      switch (playout_mode_) {
-        case kPlayoutOff:
-          return kAlternativePlc;
-        case kPlayoutFax:
-          return kAudioRepetition;
-        default:
-          assert(false);
-          return kUndefined;
-      }
-    }
-  } else if (target_timestamp == available_timestamp) {
-    return kNormal;
-  } else {
-    if (static_cast<int32_t>((generated_noise_samples + target_timestamp)
-        - available_timestamp) >= 0) {
-      return kNormal;
-    } else {
-      // If currently playing comfort noise, continue with that. Do not
-      // increase the timestamp counter since generated_noise_stopwatch_ in
-      // NetEqImpl will take care of the time-keeping.
-      if (cng_state_ == kCngRfc3389On) {
-        return kRfc3389CngNoPacket;
-      } else if (cng_state_ == kCngInternalOn) {
-        return kCodecInternalCng;
-      } else {
-        // Otherwise, do packet-loss concealment and increase the
-        // timestamp while waiting for the time to play this packet.
-        switch (playout_mode_) {
-          case kPlayoutOff:
-            return kAlternativePlcIncreaseTimestamp;
-          case kPlayoutFax:
-            return kAudioRepetitionIncreaseTimestamp;
-          default:
-            assert(0);
-            return kUndefined;
-        }
-      }
-    }
-  }
-}
-
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/neteq/decision_logic_fax.h b/modules/audio_coding/neteq/decision_logic_fax.h
deleted file mode 100644
index 4efb874..0000000
--- a/modules/audio_coding/neteq/decision_logic_fax.h
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- *  Copyright (c) 2013 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_NETEQ_DECISION_LOGIC_FAX_H_
-#define WEBRTC_MODULES_AUDIO_CODING_NETEQ_DECISION_LOGIC_FAX_H_
-
-#include "webrtc/modules/audio_coding/neteq/decision_logic.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-// Implementation of the DecisionLogic class for playout modes kPlayoutFax and
-// kPlayoutOff.
-class DecisionLogicFax : public DecisionLogic {
- public:
-  // Constructor.
-  DecisionLogicFax(int fs_hz,
-                   size_t output_size_samples,
-                   NetEqPlayoutMode playout_mode,
-                   DecoderDatabase* decoder_database,
-                   const PacketBuffer& packet_buffer,
-                   DelayManager* delay_manager,
-                   BufferLevelFilter* buffer_level_filter,
-                   const TickTimer* tick_timer)
-      : DecisionLogic(fs_hz,
-                      output_size_samples,
-                      playout_mode,
-                      decoder_database,
-                      packet_buffer,
-                      delay_manager,
-                      buffer_level_filter,
-                      tick_timer) {}
-
- protected:
-  Operations GetDecisionSpecialized(const SyncBuffer& sync_buffer,
-                                    const Expand& expand,
-                                    size_t decoder_frame_length,
-                                    const Packet* next_packet,
-                                    Modes prev_mode,
-                                    bool play_dtmf,
-                                    bool* reset_decoder,
-                                    size_t generated_noise_samples) override;
-
- private:
-  RTC_DISALLOW_COPY_AND_ASSIGN(DecisionLogicFax);
-};
-
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_AUDIO_CODING_NETEQ_DECISION_LOGIC_FAX_H_
diff --git a/modules/audio_coding/neteq/decision_logic_normal.cc b/modules/audio_coding/neteq/decision_logic_normal.cc
deleted file mode 100644
index c5f2570..0000000
--- a/modules/audio_coding/neteq/decision_logic_normal.cc
+++ /dev/null
@@ -1,242 +0,0 @@
-/*
- *  Copyright (c) 2013 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/neteq/decision_logic_normal.h"
-
-#include <assert.h>
-
-#include <algorithm>
-
-#include "webrtc/modules/audio_coding/neteq/buffer_level_filter.h"
-#include "webrtc/modules/audio_coding/neteq/decoder_database.h"
-#include "webrtc/modules/audio_coding/neteq/delay_manager.h"
-#include "webrtc/modules/audio_coding/neteq/expand.h"
-#include "webrtc/modules/audio_coding/neteq/packet_buffer.h"
-#include "webrtc/modules/audio_coding/neteq/sync_buffer.h"
-#include "webrtc/modules/include/module_common_types.h"
-
-namespace webrtc {
-
-Operations DecisionLogicNormal::GetDecisionSpecialized(
-    const SyncBuffer& sync_buffer,
-    const Expand& expand,
-    size_t decoder_frame_length,
-    const Packet* next_packet,
-    Modes prev_mode,
-    bool play_dtmf,
-    bool* reset_decoder,
-    size_t generated_noise_samples) {
-  assert(playout_mode_ == kPlayoutOn || playout_mode_ == kPlayoutStreaming);
-  // Guard for errors, to avoid getting stuck in error mode.
-  if (prev_mode == kModeError) {
-    if (!next_packet) {
-      return kExpand;
-    } else {
-      return kUndefined;  // Use kUndefined to flag for a reset.
-    }
-  }
-
-  uint32_t target_timestamp = sync_buffer.end_timestamp();
-  uint32_t available_timestamp = 0;
-  bool is_cng_packet = false;
-  if (next_packet) {
-    available_timestamp = next_packet->timestamp;
-    is_cng_packet =
-        decoder_database_->IsComfortNoise(next_packet->payload_type);
-  }
-
-  if (is_cng_packet) {
-    return CngOperation(prev_mode, target_timestamp, available_timestamp,
-                        generated_noise_samples);
-  }
-
-  // Handle the case with no packet at all available (except maybe DTMF).
-  if (!next_packet) {
-    return NoPacket(play_dtmf);
-  }
-
-  // If the expand period was very long, reset NetEQ since it is likely that the
-  // sender was restarted.
-  if (num_consecutive_expands_ > kReinitAfterExpands) {
-    *reset_decoder = true;
-    return kNormal;
-  }
-
-  const uint32_t five_seconds_samples =
-      static_cast<uint32_t>(5 * 8000 * fs_mult_);
-  // Check if the required packet is available.
-  if (target_timestamp == available_timestamp) {
-    return ExpectedPacketAvailable(prev_mode, play_dtmf);
-  } else if (!PacketBuffer::IsObsoleteTimestamp(
-                 available_timestamp, target_timestamp, five_seconds_samples)) {
-    return FuturePacketAvailable(sync_buffer, expand, decoder_frame_length,
-                                 prev_mode, target_timestamp,
-                                 available_timestamp, play_dtmf,
-                                 generated_noise_samples);
-  } else {
-    // This implies that available_timestamp < target_timestamp, which can
-    // happen when a new stream or codec is received. Signal for a reset.
-    return kUndefined;
-  }
-}
-
-Operations DecisionLogicNormal::CngOperation(Modes prev_mode,
-                                             uint32_t target_timestamp,
-                                             uint32_t available_timestamp,
-                                             size_t generated_noise_samples) {
-  // Signed difference between target and available timestamp.
-  int32_t timestamp_diff = static_cast<int32_t>(
-      static_cast<uint32_t>(generated_noise_samples + target_timestamp) -
-      available_timestamp);
-  int32_t optimal_level_samp = static_cast<int32_t>(
-      (delay_manager_->TargetLevel() * packet_length_samples_) >> 8);
-  const int64_t excess_waiting_time_samp =
-      -static_cast<int64_t>(timestamp_diff) - optimal_level_samp;
-
-  if (excess_waiting_time_samp > optimal_level_samp / 2) {
-    // The waiting time for this packet will be longer than 1.5
-    // times the wanted buffer delay. Apply fast-forward to cut the
-    // waiting time down to the optimal.
-    noise_fast_forward_ = rtc::dchecked_cast<size_t>(noise_fast_forward_ +
-                                                     excess_waiting_time_samp);
-    timestamp_diff =
-        rtc::saturated_cast<int32_t>(timestamp_diff + excess_waiting_time_samp);
-  }
-
-  if (timestamp_diff < 0 && prev_mode == kModeRfc3389Cng) {
-    // Not time to play this packet yet. Wait another round before using this
-    // packet. Keep on playing CNG from previous CNG parameters.
-    return kRfc3389CngNoPacket;
-  } else {
-    // Otherwise, go for the CNG packet now.
-    noise_fast_forward_ = 0;
-    return kRfc3389Cng;
-  }
-}
-
-Operations DecisionLogicNormal::NoPacket(bool play_dtmf) {
-  if (cng_state_ == kCngRfc3389On) {
-    // Keep on playing comfort noise.
-    return kRfc3389CngNoPacket;
-  } else if (cng_state_ == kCngInternalOn) {
-    // Keep on playing codec internal comfort noise.
-    return kCodecInternalCng;
-  } else if (play_dtmf) {
-    return kDtmf;
-  } else {
-    // Nothing to play, do expand.
-    return kExpand;
-  }
-}
-
-Operations DecisionLogicNormal::ExpectedPacketAvailable(Modes prev_mode,
-                                                        bool play_dtmf) {
-  if (prev_mode != kModeExpand && !play_dtmf) {
-    // Check criterion for time-stretching.
-    int low_limit, high_limit;
-    delay_manager_->BufferLimits(&low_limit, &high_limit);
-    if (buffer_level_filter_->filtered_current_level() >= high_limit << 2)
-      return kFastAccelerate;
-    if (TimescaleAllowed()) {
-      if (buffer_level_filter_->filtered_current_level() >= high_limit)
-        return kAccelerate;
-      if (buffer_level_filter_->filtered_current_level() < low_limit)
-        return kPreemptiveExpand;
-    }
-  }
-  return kNormal;
-}
-
-Operations DecisionLogicNormal::FuturePacketAvailable(
-    const SyncBuffer& sync_buffer,
-    const Expand& expand,
-    size_t decoder_frame_length,
-    Modes prev_mode,
-    uint32_t target_timestamp,
-    uint32_t available_timestamp,
-    bool play_dtmf,
-    size_t generated_noise_samples) {
-  // Required packet is not available, but a future packet is.
-  // Check if we should continue with an ongoing expand because the new packet
-  // is too far into the future.
-  uint32_t timestamp_leap = available_timestamp - target_timestamp;
-  if ((prev_mode == kModeExpand) &&
-      !ReinitAfterExpands(timestamp_leap) &&
-      !MaxWaitForPacket() &&
-      PacketTooEarly(timestamp_leap) &&
-      UnderTargetLevel()) {
-    if (play_dtmf) {
-      // Still have DTMF to play, so do not do expand.
-      return kDtmf;
-    } else {
-      // Nothing to play.
-      return kExpand;
-    }
-  }
-
-  const size_t samples_left =
-      sync_buffer.FutureLength() - expand.overlap_length();
-  const size_t cur_size_samples = samples_left +
-      packet_buffer_.NumPacketsInBuffer() * decoder_frame_length;
-
-  // If previous was comfort noise, then no merge is needed.
-  if (prev_mode == kModeRfc3389Cng ||
-      prev_mode == kModeCodecInternalCng) {
-    // Keep the same delay as before the CNG (or maximum 70 ms in buffer as
-    // safety precaution), but make sure that the number of samples in buffer
-    // is no higher than 4 times the optimal level. (Note that TargetLevel()
-    // is in Q8.)
-    if (static_cast<uint32_t>(generated_noise_samples + target_timestamp) >=
-            available_timestamp ||
-        cur_size_samples >
-            ((delay_manager_->TargetLevel() * packet_length_samples_) >> 8) *
-            4) {
-      // Time to play this new packet.
-      return kNormal;
-    } else {
-      // Too early to play this new packet; keep on playing comfort noise.
-      if (prev_mode == kModeRfc3389Cng) {
-        return kRfc3389CngNoPacket;
-      } else {  // prevPlayMode == kModeCodecInternalCng.
-        return kCodecInternalCng;
-      }
-    }
-  }
-  // Do not merge unless we have done an expand before.
-  if (prev_mode == kModeExpand) {
-    return kMerge;
-  } else if (play_dtmf) {
-    // Play DTMF instead of expand.
-    return kDtmf;
-  } else {
-    return kExpand;
-  }
-}
-
-bool DecisionLogicNormal::UnderTargetLevel() const {
-  return buffer_level_filter_->filtered_current_level() <=
-      delay_manager_->TargetLevel();
-}
-
-bool DecisionLogicNormal::ReinitAfterExpands(uint32_t timestamp_leap) const {
-  return timestamp_leap >=
-      static_cast<uint32_t>(output_size_samples_ * kReinitAfterExpands);
-}
-
-bool DecisionLogicNormal::PacketTooEarly(uint32_t timestamp_leap) const {
-  return timestamp_leap >
-      static_cast<uint32_t>(output_size_samples_ * num_consecutive_expands_);
-}
-
-bool DecisionLogicNormal::MaxWaitForPacket() const {
-  return num_consecutive_expands_ >= kMaxWaitForPacket;
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/neteq/decision_logic_normal.h b/modules/audio_coding/neteq/decision_logic_normal.h
deleted file mode 100644
index b676bd4..0000000
--- a/modules/audio_coding/neteq/decision_logic_normal.h
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- *  Copyright (c) 2013 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_NETEQ_DECISION_LOGIC_NORMAL_H_
-#define WEBRTC_MODULES_AUDIO_CODING_NETEQ_DECISION_LOGIC_NORMAL_H_
-
-#include "webrtc/modules/audio_coding/neteq/decision_logic.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-// Implementation of the DecisionLogic class for playout modes kPlayoutOn and
-// kPlayoutStreaming.
-class DecisionLogicNormal : public DecisionLogic {
- public:
-  // Constructor.
-  DecisionLogicNormal(int fs_hz,
-                      size_t output_size_samples,
-                      NetEqPlayoutMode playout_mode,
-                      DecoderDatabase* decoder_database,
-                      const PacketBuffer& packet_buffer,
-                      DelayManager* delay_manager,
-                      BufferLevelFilter* buffer_level_filter,
-                      const TickTimer* tick_timer)
-      : DecisionLogic(fs_hz,
-                      output_size_samples,
-                      playout_mode,
-                      decoder_database,
-                      packet_buffer,
-                      delay_manager,
-                      buffer_level_filter,
-                      tick_timer) {}
-
- protected:
-  static const int kReinitAfterExpands = 100;
-  static const int kMaxWaitForPacket = 10;
-
-  Operations GetDecisionSpecialized(const SyncBuffer& sync_buffer,
-                                    const Expand& expand,
-                                    size_t decoder_frame_length,
-                                    const Packet* next_packet,
-                                    Modes prev_mode,
-                                    bool play_dtmf,
-                                    bool* reset_decoder,
-                                    size_t generated_noise_samples) override;
-
-  // Returns the operation to do given that the expected packet is not
-  // available, but a packet further into the future is at hand.
-  virtual Operations FuturePacketAvailable(
-      const SyncBuffer& sync_buffer,
-      const Expand& expand,
-      size_t decoder_frame_length,
-      Modes prev_mode,
-      uint32_t target_timestamp,
-      uint32_t available_timestamp,
-      bool play_dtmf,
-      size_t generated_noise_samples);
-
-  // Returns the operation to do given that the expected packet is available.
-  virtual Operations ExpectedPacketAvailable(Modes prev_mode, bool play_dtmf);
-
-  // Returns the operation given that no packets are available (except maybe
-  // a DTMF event, flagged by setting |play_dtmf| true).
-  virtual Operations NoPacket(bool play_dtmf);
-
- private:
-  // Returns the operation given that the next available packet is a comfort
-  // noise payload (RFC 3389 only, not codec-internal).
-  Operations CngOperation(Modes prev_mode,
-                          uint32_t target_timestamp,
-                          uint32_t available_timestamp,
-                          size_t generated_noise_samples);
-
-  // Checks if enough time has elapsed since the last successful timescale
-  // operation was done (i.e., accelerate or preemptive expand).
-  bool TimescaleAllowed() const {
-    return !timescale_countdown_ || timescale_countdown_->Finished();
-  }
-
-  // Checks if the current (filtered) buffer level is under the target level.
-  bool UnderTargetLevel() const;
-
-  // Checks if |timestamp_leap| is so long into the future that a reset due
-  // to exceeding kReinitAfterExpands will be done.
-  bool ReinitAfterExpands(uint32_t timestamp_leap) const;
-
-  // Checks if we still have not done enough expands to cover the distance from
-  // the last decoded packet to the next available packet, the distance beeing
-  // conveyed in |timestamp_leap|.
-  bool PacketTooEarly(uint32_t timestamp_leap) const;
-
-  // Checks if num_consecutive_expands_ >= kMaxWaitForPacket.
-  bool MaxWaitForPacket() const;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(DecisionLogicNormal);
-};
-
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_AUDIO_CODING_NETEQ_DECISION_LOGIC_NORMAL_H_
diff --git a/modules/audio_coding/neteq/decision_logic_unittest.cc b/modules/audio_coding/neteq/decision_logic_unittest.cc
deleted file mode 100644
index a5c5778..0000000
--- a/modules/audio_coding/neteq/decision_logic_unittest.cc
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- *  Copyright (c) 2012 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.
- */
-
-// Unit tests for DecisionLogic class and derived classes.
-
-#include "webrtc/modules/audio_coding/neteq/decision_logic.h"
-#include "webrtc/modules/audio_coding/neteq/buffer_level_filter.h"
-#include "webrtc/modules/audio_coding/neteq/decoder_database.h"
-#include "webrtc/modules/audio_coding/neteq/delay_manager.h"
-#include "webrtc/modules/audio_coding/neteq/delay_peak_detector.h"
-#include "webrtc/modules/audio_coding/neteq/packet_buffer.h"
-#include "webrtc/modules/audio_coding/neteq/tick_timer.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/mock_audio_decoder_factory.h"
-
-namespace webrtc {
-
-TEST(DecisionLogic, CreateAndDestroy) {
-  int fs_hz = 8000;
-  int output_size_samples = fs_hz / 100;  // Samples per 10 ms.
-  DecoderDatabase decoder_database(
-      new rtc::RefCountedObject<MockAudioDecoderFactory>);
-  TickTimer tick_timer;
-  PacketBuffer packet_buffer(10, &tick_timer);
-  DelayPeakDetector delay_peak_detector(&tick_timer);
-  DelayManager delay_manager(240, &delay_peak_detector, &tick_timer);
-  BufferLevelFilter buffer_level_filter;
-  DecisionLogic* logic = DecisionLogic::Create(
-      fs_hz, output_size_samples, kPlayoutOn, &decoder_database, packet_buffer,
-      &delay_manager, &buffer_level_filter, &tick_timer);
-  delete logic;
-  logic = DecisionLogic::Create(
-      fs_hz, output_size_samples, kPlayoutStreaming, &decoder_database,
-      packet_buffer, &delay_manager, &buffer_level_filter, &tick_timer);
-  delete logic;
-  logic = DecisionLogic::Create(
-      fs_hz, output_size_samples, kPlayoutFax, &decoder_database, packet_buffer,
-      &delay_manager, &buffer_level_filter, &tick_timer);
-  delete logic;
-  logic = DecisionLogic::Create(
-      fs_hz, output_size_samples, kPlayoutOff, &decoder_database, packet_buffer,
-      &delay_manager, &buffer_level_filter, &tick_timer);
-  delete logic;
-}
-
-// TODO(hlundin): Write more tests.
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/neteq/decoder_database.cc b/modules/audio_coding/neteq/decoder_database.cc
deleted file mode 100644
index 526d159..0000000
--- a/modules/audio_coding/neteq/decoder_database.cc
+++ /dev/null
@@ -1,355 +0,0 @@
-/*
- *  Copyright (c) 2012 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/neteq/decoder_database.h"
-
-#include <utility>  // pair
-
-#include "webrtc/api/audio_codecs/audio_decoder.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-
-namespace webrtc {
-
-DecoderDatabase::DecoderDatabase(
-    const rtc::scoped_refptr<AudioDecoderFactory>& decoder_factory)
-    : active_decoder_type_(-1),
-      active_cng_decoder_type_(-1),
-      decoder_factory_(decoder_factory) {}
-
-DecoderDatabase::~DecoderDatabase() = default;
-
-DecoderDatabase::DecoderInfo::DecoderInfo(const SdpAudioFormat& audio_format,
-                                          AudioDecoderFactory* factory,
-                                          const std::string& codec_name)
-    : name_(codec_name),
-      audio_format_(audio_format),
-      factory_(factory),
-      external_decoder_(nullptr),
-      cng_decoder_(CngDecoder::Create(audio_format)),
-      subtype_(SubtypeFromFormat(audio_format)) {}
-
-DecoderDatabase::DecoderInfo::DecoderInfo(const SdpAudioFormat& audio_format,
-                                          AudioDecoderFactory* factory)
-    : DecoderInfo(audio_format, factory, audio_format.name) {}
-
-DecoderDatabase::DecoderInfo::DecoderInfo(NetEqDecoder ct,
-                                          AudioDecoderFactory* factory)
-    : DecoderInfo(*NetEqDecoderToSdpAudioFormat(ct), factory) {}
-
-DecoderDatabase::DecoderInfo::DecoderInfo(const SdpAudioFormat& audio_format,
-                                          AudioDecoder* ext_dec,
-                                          const std::string& codec_name)
-    : name_(codec_name),
-      audio_format_(audio_format),
-      factory_(nullptr),
-      external_decoder_(ext_dec),
-      subtype_(Subtype::kNormal) {
-  RTC_CHECK(ext_dec);
-}
-
-DecoderDatabase::DecoderInfo::DecoderInfo(DecoderInfo&&) = default;
-DecoderDatabase::DecoderInfo::~DecoderInfo() = default;
-
-AudioDecoder* DecoderDatabase::DecoderInfo::GetDecoder() const {
-  if (subtype_ != Subtype::kNormal) {
-    // These are handled internally, so they have no AudioDecoder objects.
-    return nullptr;
-  }
-  if (external_decoder_) {
-    RTC_DCHECK(!decoder_);
-    RTC_DCHECK(!cng_decoder_);
-    return external_decoder_;
-  }
-  if (!decoder_) {
-    // TODO(ossu): Keep a check here for now, since a number of tests create
-    // DecoderInfos without factories.
-    RTC_DCHECK(factory_);
-    decoder_ = factory_->MakeAudioDecoder(audio_format_);
-  }
-  RTC_DCHECK(decoder_) << "Failed to create: " << audio_format_;
-  return decoder_.get();
-}
-
-bool DecoderDatabase::DecoderInfo::IsType(const char* name) const {
-  return STR_CASE_CMP(audio_format_.name.c_str(), name) == 0;
-}
-
-bool DecoderDatabase::DecoderInfo::IsType(const std::string& name) const {
-  return IsType(name.c_str());
-}
-
-rtc::Optional<DecoderDatabase::DecoderInfo::CngDecoder>
-DecoderDatabase::DecoderInfo::CngDecoder::Create(const SdpAudioFormat& format) {
-  if (STR_CASE_CMP(format.name.c_str(), "CN") == 0) {
-    // CN has a 1:1 RTP clock rate to sample rate ratio.
-    const int sample_rate_hz = format.clockrate_hz;
-    RTC_DCHECK(sample_rate_hz == 8000 || sample_rate_hz == 16000 ||
-               sample_rate_hz == 32000 || sample_rate_hz == 48000);
-    return rtc::Optional<DecoderDatabase::DecoderInfo::CngDecoder>(
-        {sample_rate_hz});
-  } else {
-    return rtc::Optional<CngDecoder>();
-  }
-}
-
-DecoderDatabase::DecoderInfo::Subtype
-DecoderDatabase::DecoderInfo::SubtypeFromFormat(const SdpAudioFormat& format) {
-  if (STR_CASE_CMP(format.name.c_str(), "CN") == 0) {
-    return Subtype::kComfortNoise;
-  } else if (STR_CASE_CMP(format.name.c_str(), "telephone-event") == 0) {
-    return Subtype::kDtmf;
-  } else if (STR_CASE_CMP(format.name.c_str(), "red") == 0) {
-    return Subtype::kRed;
-  }
-
-  return Subtype::kNormal;
-}
-
-bool DecoderDatabase::Empty() const { return decoders_.empty(); }
-
-int DecoderDatabase::Size() const { return static_cast<int>(decoders_.size()); }
-
-void DecoderDatabase::Reset() {
-  decoders_.clear();
-  active_decoder_type_ = -1;
-  active_cng_decoder_type_ = -1;
-}
-
-std::vector<int> DecoderDatabase::SetCodecs(
-    const std::map<int, SdpAudioFormat>& codecs) {
-  // First collect all payload types that we'll remove or reassign, then remove
-  // them from the database.
-  std::vector<int> changed_payload_types;
-  for (const std::pair<uint8_t, const DecoderInfo&> kv : decoders_) {
-    auto i = codecs.find(kv.first);
-    if (i == codecs.end() || i->second != kv.second.GetFormat()) {
-      changed_payload_types.push_back(kv.first);
-    }
-  }
-  for (int pl_type : changed_payload_types) {
-    Remove(pl_type);
-  }
-
-  // Enter the new and changed payload type mappings into the database.
-  for (const auto& kv : codecs) {
-    const int& rtp_payload_type = kv.first;
-    const SdpAudioFormat& audio_format = kv.second;
-    RTC_DCHECK_GE(rtp_payload_type, 0);
-    RTC_DCHECK_LE(rtp_payload_type, 0x7f);
-    if (decoders_.count(rtp_payload_type) == 0) {
-      decoders_.insert(std::make_pair(
-          rtp_payload_type, DecoderInfo(audio_format, decoder_factory_.get())));
-    } else {
-      // The mapping for this payload type hasn't changed.
-    }
-  }
-
-  return changed_payload_types;
-}
-
-int DecoderDatabase::RegisterPayload(uint8_t rtp_payload_type,
-                                     NetEqDecoder codec_type,
-                                     const std::string& name) {
-  if (rtp_payload_type > 0x7F) {
-    return kInvalidRtpPayloadType;
-  }
-  // kCodecArbitrary is only supported through InsertExternal.
-  if (codec_type == NetEqDecoder::kDecoderArbitrary ||
-      !CodecSupported(codec_type)) {
-    return kCodecNotSupported;
-  }
-  const auto opt_format = NetEqDecoderToSdpAudioFormat(codec_type);
-  if (!opt_format) {
-    return kCodecNotSupported;
-  }
-  DecoderInfo info(*opt_format, decoder_factory_, name);
-  auto ret =
-      decoders_.insert(std::make_pair(rtp_payload_type, std::move(info)));
-  if (ret.second == false) {
-    // Database already contains a decoder with type |rtp_payload_type|.
-    return kDecoderExists;
-  }
-  return kOK;
-}
-
-int DecoderDatabase::RegisterPayload(int rtp_payload_type,
-                                     const SdpAudioFormat& audio_format) {
-  if (rtp_payload_type < 0 || rtp_payload_type > 0x7f) {
-    return kInvalidRtpPayloadType;
-  }
-  const auto ret = decoders_.insert(std::make_pair(
-      rtp_payload_type, DecoderInfo(audio_format, decoder_factory_.get())));
-  if (ret.second == false) {
-    // Database already contains a decoder with type |rtp_payload_type|.
-    return kDecoderExists;
-  }
-  return kOK;
-}
-
-int DecoderDatabase::InsertExternal(uint8_t rtp_payload_type,
-                                    NetEqDecoder codec_type,
-                                    const std::string& codec_name,
-                                    AudioDecoder* decoder) {
-  if (rtp_payload_type > 0x7F) {
-    return kInvalidRtpPayloadType;
-  }
-  if (!decoder) {
-    return kInvalidPointer;
-  }
-
-  const auto opt_db_format = NetEqDecoderToSdpAudioFormat(codec_type);
-  const SdpAudioFormat format = opt_db_format.value_or({"arbitrary", 0, 0});
-
-  std::pair<DecoderMap::iterator, bool> ret;
-  DecoderInfo info(format, decoder, codec_name);
-  ret = decoders_.insert(std::make_pair(rtp_payload_type, std::move(info)));
-  if (ret.second == false) {
-    // Database already contains a decoder with type |rtp_payload_type|.
-    return kDecoderExists;
-  }
-  return kOK;
-}
-
-int DecoderDatabase::Remove(uint8_t rtp_payload_type) {
-  if (decoders_.erase(rtp_payload_type) == 0) {
-    // No decoder with that |rtp_payload_type|.
-    return kDecoderNotFound;
-  }
-  if (active_decoder_type_ == rtp_payload_type) {
-    active_decoder_type_ = -1;  // No active decoder.
-  }
-  if (active_cng_decoder_type_ == rtp_payload_type) {
-    active_cng_decoder_type_ = -1;  // No active CNG decoder.
-  }
-  return kOK;
-}
-
-void DecoderDatabase::RemoveAll() {
-  decoders_.clear();
-  active_decoder_type_ = -1;      // No active decoder.
-  active_cng_decoder_type_ = -1;  // No active CNG decoder.
-}
-
-const DecoderDatabase::DecoderInfo* DecoderDatabase::GetDecoderInfo(
-    uint8_t rtp_payload_type) const {
-  DecoderMap::const_iterator it = decoders_.find(rtp_payload_type);
-  if (it == decoders_.end()) {
-    // Decoder not found.
-    return NULL;
-  }
-  return &it->second;
-}
-
-int DecoderDatabase::SetActiveDecoder(uint8_t rtp_payload_type,
-                                      bool* new_decoder) {
-  // Check that |rtp_payload_type| exists in the database.
-  const DecoderInfo *info = GetDecoderInfo(rtp_payload_type);
-  if (!info) {
-    // Decoder not found.
-    return kDecoderNotFound;
-  }
-  RTC_CHECK(!info->IsComfortNoise());
-  RTC_DCHECK(new_decoder);
-  *new_decoder = false;
-  if (active_decoder_type_ < 0) {
-    // This is the first active decoder.
-    *new_decoder = true;
-  } else if (active_decoder_type_ != rtp_payload_type) {
-    // Moving from one active decoder to another. Delete the first one.
-    const DecoderInfo *old_info = GetDecoderInfo(active_decoder_type_);
-    RTC_DCHECK(old_info);
-    old_info->DropDecoder();
-    *new_decoder = true;
-  }
-  active_decoder_type_ = rtp_payload_type;
-  return kOK;
-}
-
-AudioDecoder* DecoderDatabase::GetActiveDecoder() const {
-  if (active_decoder_type_ < 0) {
-    // No active decoder.
-    return NULL;
-  }
-  return GetDecoder(active_decoder_type_);
-}
-
-int DecoderDatabase::SetActiveCngDecoder(uint8_t rtp_payload_type) {
-  // Check that |rtp_payload_type| exists in the database.
-  const DecoderInfo *info = GetDecoderInfo(rtp_payload_type);
-  if (!info) {
-    // Decoder not found.
-    return kDecoderNotFound;
-  }
-  if (active_cng_decoder_type_ >= 0 &&
-      active_cng_decoder_type_ != rtp_payload_type) {
-    // Moving from one active CNG decoder to another. Delete the first one.
-    RTC_DCHECK(active_cng_decoder_);
-    active_cng_decoder_.reset();
-  }
-  active_cng_decoder_type_ = rtp_payload_type;
-  return kOK;
-}
-
-ComfortNoiseDecoder* DecoderDatabase::GetActiveCngDecoder() const {
-  if (active_cng_decoder_type_ < 0) {
-    // No active CNG decoder.
-    return NULL;
-  }
-  if (!active_cng_decoder_) {
-    active_cng_decoder_.reset(new ComfortNoiseDecoder);
-  }
-  return active_cng_decoder_.get();
-}
-
-AudioDecoder* DecoderDatabase::GetDecoder(uint8_t rtp_payload_type) const {
-  const DecoderInfo *info = GetDecoderInfo(rtp_payload_type);
-  return info ? info->GetDecoder() : nullptr;
-}
-
-bool DecoderDatabase::IsType(uint8_t rtp_payload_type, const char* name) const {
-  const DecoderInfo* info = GetDecoderInfo(rtp_payload_type);
-  return info && info->IsType(name);
-}
-
-bool DecoderDatabase::IsType(uint8_t rtp_payload_type,
-                             const std::string& name) const {
-  return IsType(rtp_payload_type, name.c_str());
-}
-
-bool DecoderDatabase::IsComfortNoise(uint8_t rtp_payload_type) const {
-  const DecoderInfo *info = GetDecoderInfo(rtp_payload_type);
-  return info && info->IsComfortNoise();
-}
-
-bool DecoderDatabase::IsDtmf(uint8_t rtp_payload_type) const {
-  const DecoderInfo *info = GetDecoderInfo(rtp_payload_type);
-  return info && info->IsDtmf();
-}
-
-bool DecoderDatabase::IsRed(uint8_t rtp_payload_type) const {
-  const DecoderInfo *info = GetDecoderInfo(rtp_payload_type);
-  return info && info->IsRed();
-}
-
-int DecoderDatabase::CheckPayloadTypes(const PacketList& packet_list) const {
-  PacketList::const_iterator it;
-  for (it = packet_list.begin(); it != packet_list.end(); ++it) {
-    if (!GetDecoderInfo(it->payload_type)) {
-      // Payload type is not found.
-      LOG(LS_WARNING) << "CheckPayloadTypes: unknown RTP payload type "
-                      << static_cast<int>(it->payload_type);
-      return kDecoderNotFound;
-    }
-  }
-  return kOK;
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/neteq/decoder_database.h b/modules/audio_coding/neteq/decoder_database.h
deleted file mode 100644
index 5feadd1..0000000
--- a/modules/audio_coding/neteq/decoder_database.h
+++ /dev/null
@@ -1,246 +0,0 @@
-/*
- *  Copyright (c) 2012 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_NETEQ_DECODER_DATABASE_H_
-#define WEBRTC_MODULES_AUDIO_CODING_NETEQ_DECODER_DATABASE_H_
-
-#include <map>
-#include <memory>
-#include <string>
-
-#include "webrtc/api/audio_codecs/audio_decoder_factory.h"
-#include "webrtc/api/audio_codecs/audio_format.h"
-#include "webrtc/common_types.h"  // NULL
-#include "webrtc/modules/audio_coding/codecs/cng/webrtc_cng.h"
-#include "webrtc/modules/audio_coding/neteq/audio_decoder_impl.h"
-#include "webrtc/modules/audio_coding/neteq/packet.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/scoped_ref_ptr.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-class DecoderDatabase {
- public:
-  enum DatabaseReturnCodes {
-    kOK = 0,
-    kInvalidRtpPayloadType = -1,
-    kCodecNotSupported = -2,
-    kInvalidSampleRate = -3,
-    kDecoderExists = -4,
-    kDecoderNotFound = -5,
-    kInvalidPointer = -6
-  };
-
-  // Class that stores decoder info in the database.
-  class DecoderInfo {
-   public:
-    DecoderInfo(const SdpAudioFormat& audio_format,
-                AudioDecoderFactory* factory,
-                const std::string& codec_name);
-    explicit DecoderInfo(const SdpAudioFormat& audio_format,
-                         AudioDecoderFactory* factory = nullptr);
-    explicit DecoderInfo(NetEqDecoder ct,
-                         AudioDecoderFactory* factory = nullptr);
-    DecoderInfo(const SdpAudioFormat& audio_format,
-                AudioDecoder* ext_dec,
-                const std::string& codec_name);
-    DecoderInfo(DecoderInfo&&);
-    ~DecoderInfo();
-
-    // Get the AudioDecoder object, creating it first if necessary.
-    AudioDecoder* GetDecoder() const;
-
-    // Delete the AudioDecoder object, unless it's external. (This means we can
-    // always recreate it later if we need it.)
-    void DropDecoder() const { decoder_.reset(); }
-
-    int SampleRateHz() const {
-      if (IsDtmf()) {
-        // DTMF has a 1:1 mapping between clock rate and sample rate.
-        return audio_format_.clockrate_hz;
-      }
-      const AudioDecoder* decoder = GetDecoder();
-      RTC_DCHECK_EQ(1, !!decoder + !!cng_decoder_);
-      return decoder ? decoder->SampleRateHz() : cng_decoder_->sample_rate_hz;
-    }
-
-    const SdpAudioFormat& GetFormat() const { return audio_format_; }
-
-    // Returns true if the decoder's format is comfort noise.
-    bool IsComfortNoise() const {
-      RTC_DCHECK_EQ(!!cng_decoder_, subtype_ == Subtype::kComfortNoise);
-      return subtype_ == Subtype::kComfortNoise;
-    }
-
-    // Returns true if the decoder's format is DTMF.
-    bool IsDtmf() const {
-      return subtype_ == Subtype::kDtmf;
-    }
-
-    // Returns true if the decoder's format is RED.
-    bool IsRed() const {
-      return subtype_ == Subtype::kRed;
-    }
-
-    // Returns true if the decoder's format is named |name|.
-    bool IsType(const char* name) const;
-    // Returns true if the decoder's format is named |name|.
-    bool IsType(const std::string& name) const;
-
-    const std::string& get_name() const { return name_; }
-
-   private:
-    // TODO(ossu): |name_| is kept here while we retain the old external
-    //             decoder interface. Remove this once using an
-    //             AudioDecoderFactory has supplanted the old functionality.
-    const std::string name_;
-
-    const SdpAudioFormat audio_format_;
-    AudioDecoderFactory* const factory_;
-    mutable std::unique_ptr<AudioDecoder> decoder_;
-
-    // Set iff this is an external decoder.
-    AudioDecoder* const external_decoder_;
-
-    // Set iff this is a comfort noise decoder.
-    struct CngDecoder {
-      static rtc::Optional<CngDecoder> Create(const SdpAudioFormat& format);
-      int sample_rate_hz;
-    };
-    const rtc::Optional<CngDecoder> cng_decoder_;
-
-    enum class Subtype : int8_t {
-      kNormal,
-      kComfortNoise,
-      kDtmf,
-      kRed
-    };
-
-    static Subtype SubtypeFromFormat(const SdpAudioFormat& format);
-
-    const Subtype subtype_;
-  };
-
-  // Maximum value for 8 bits, and an invalid RTP payload type (since it is
-  // only 7 bits).
-  static const uint8_t kRtpPayloadTypeError = 0xFF;
-
-  DecoderDatabase(
-      const rtc::scoped_refptr<AudioDecoderFactory>& decoder_factory);
-
-  virtual ~DecoderDatabase();
-
-  // Returns true if the database is empty.
-  virtual bool Empty() const;
-
-  // Returns the number of decoders registered in the database.
-  virtual int Size() const;
-
-  // Resets the database, erasing all registered payload types, and deleting
-  // any AudioDecoder objects that were not externally created and inserted
-  // using InsertExternal().
-  virtual void Reset();
-
-  // Replaces the existing set of decoders with the given set. Returns the
-  // payload types that were reassigned or removed while doing so.
-  virtual std::vector<int> SetCodecs(
-      const std::map<int, SdpAudioFormat>& codecs);
-
-  // Registers |rtp_payload_type| as a decoder of type |codec_type|. The |name|
-  // is only used to populate the name field in the DecoderInfo struct in the
-  // database, and can be arbitrary (including empty). Returns kOK on success;
-  // otherwise an error code.
-  virtual int RegisterPayload(uint8_t rtp_payload_type,
-                              NetEqDecoder codec_type,
-                              const std::string& name);
-
-  // Registers a decoder for the given payload type. Returns kOK on success;
-  // otherwise an error code.
-  virtual int RegisterPayload(int rtp_payload_type,
-                              const SdpAudioFormat& audio_format);
-
-  // Registers an externally created AudioDecoder object, and associates it
-  // as a decoder of type |codec_type| with |rtp_payload_type|.
-  virtual int InsertExternal(uint8_t rtp_payload_type,
-                             NetEqDecoder codec_type,
-                             const std::string& codec_name,
-                             AudioDecoder* decoder);
-
-  // Removes the entry for |rtp_payload_type| from the database.
-  // Returns kDecoderNotFound or kOK depending on the outcome of the operation.
-  virtual int Remove(uint8_t rtp_payload_type);
-
-  // Remove all entries.
-  virtual void RemoveAll();
-
-  // Returns a pointer to the DecoderInfo struct for |rtp_payload_type|. If
-  // no decoder is registered with that |rtp_payload_type|, NULL is returned.
-  virtual const DecoderInfo* GetDecoderInfo(uint8_t rtp_payload_type) const;
-
-  // Sets the active decoder to be |rtp_payload_type|. If this call results in a
-  // change of active decoder, |new_decoder| is set to true. The previous active
-  // decoder's AudioDecoder object is deleted.
-  virtual int SetActiveDecoder(uint8_t rtp_payload_type, bool* new_decoder);
-
-  // Returns the current active decoder, or NULL if no active decoder exists.
-  virtual AudioDecoder* GetActiveDecoder() const;
-
-  // Sets the active comfort noise decoder to be |rtp_payload_type|. If this
-  // call results in a change of active comfort noise decoder, the previous
-  // active decoder's AudioDecoder object is deleted.
-  virtual int SetActiveCngDecoder(uint8_t rtp_payload_type);
-
-  // Returns the current active comfort noise decoder, or NULL if no active
-  // comfort noise decoder exists.
-  virtual ComfortNoiseDecoder* GetActiveCngDecoder() const;
-
-  // The following are utility methods: they will look up DecoderInfo through
-  // GetDecoderInfo and call the respective method on that info object, if it
-  // exists.
-
-  // Returns a pointer to the AudioDecoder object associated with
-  // |rtp_payload_type|, or NULL if none is registered. If the AudioDecoder
-  // object does not exist for that decoder, the object is created.
-  AudioDecoder* GetDecoder(uint8_t rtp_payload_type) const;
-
-  // Returns if |rtp_payload_type| is registered with a format named |name|.
-  bool IsType(uint8_t rtp_payload_type, const char* name) const;
-
-  // Returns if |rtp_payload_type| is registered with a format named |name|.
-  bool IsType(uint8_t rtp_payload_type, const std::string& name) const;
-
-  // Returns true if |rtp_payload_type| is registered as comfort noise.
-  bool IsComfortNoise(uint8_t rtp_payload_type) const;
-
-  // Returns true if |rtp_payload_type| is registered as DTMF.
-  bool IsDtmf(uint8_t rtp_payload_type) const;
-
-  // Returns true if |rtp_payload_type| is registered as RED.
-  bool IsRed(uint8_t rtp_payload_type) const;
-
-  // Returns kOK if all packets in |packet_list| carry payload types that are
-  // registered in the database. Otherwise, returns kDecoderNotFound.
-  int CheckPayloadTypes(const PacketList& packet_list) const;
-
- private:
-  typedef std::map<uint8_t, DecoderInfo> DecoderMap;
-
-  DecoderMap decoders_;
-  int active_decoder_type_;
-  int active_cng_decoder_type_;
-  mutable std::unique_ptr<ComfortNoiseDecoder> active_cng_decoder_;
-  rtc::scoped_refptr<AudioDecoderFactory> decoder_factory_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(DecoderDatabase);
-};
-
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_AUDIO_CODING_NETEQ_DECODER_DATABASE_H_
diff --git a/modules/audio_coding/neteq/decoder_database_unittest.cc b/modules/audio_coding/neteq/decoder_database_unittest.cc
deleted file mode 100644
index 3e65485..0000000
--- a/modules/audio_coding/neteq/decoder_database_unittest.cc
+++ /dev/null
@@ -1,256 +0,0 @@
-/*
- *  Copyright (c) 2012 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/neteq/decoder_database.h"
-
-#include <assert.h>
-#include <stdlib.h>
-
-#include <string>
-
-#include "webrtc/api/audio_codecs/builtin_audio_decoder_factory.h"
-#include "webrtc/test/gmock.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/mock_audio_decoder.h"
-#include "webrtc/test/mock_audio_decoder_factory.h"
-
-using testing::_;
-using testing::Invoke;
-
-namespace webrtc {
-
-TEST(DecoderDatabase, CreateAndDestroy) {
-  DecoderDatabase db(new rtc::RefCountedObject<MockAudioDecoderFactory>);
-  EXPECT_EQ(0, db.Size());
-  EXPECT_TRUE(db.Empty());
-}
-
-TEST(DecoderDatabase, InsertAndRemove) {
-  DecoderDatabase db(new rtc::RefCountedObject<MockAudioDecoderFactory>);
-  const uint8_t kPayloadType = 0;
-  const std::string kCodecName = "Robert\'); DROP TABLE Students;";
-  EXPECT_EQ(
-      DecoderDatabase::kOK,
-      db.RegisterPayload(kPayloadType, NetEqDecoder::kDecoderPCMu, kCodecName));
-  EXPECT_EQ(1, db.Size());
-  EXPECT_FALSE(db.Empty());
-  EXPECT_EQ(DecoderDatabase::kOK, db.Remove(kPayloadType));
-  EXPECT_EQ(0, db.Size());
-  EXPECT_TRUE(db.Empty());
-}
-
-TEST(DecoderDatabase, InsertAndRemoveAll) {
-  DecoderDatabase db(new rtc::RefCountedObject<MockAudioDecoderFactory>);
-  const std::string kCodecName1 = "Robert\'); DROP TABLE Students;";
-  const std::string kCodecName2 = "https://xkcd.com/327/";
-  EXPECT_EQ(DecoderDatabase::kOK,
-            db.RegisterPayload(0, NetEqDecoder::kDecoderPCMu, kCodecName1));
-  EXPECT_EQ(DecoderDatabase::kOK,
-            db.RegisterPayload(1, NetEqDecoder::kDecoderPCMa, kCodecName2));
-  EXPECT_EQ(2, db.Size());
-  EXPECT_FALSE(db.Empty());
-  db.RemoveAll();
-  EXPECT_EQ(0, db.Size());
-  EXPECT_TRUE(db.Empty());
-}
-
-TEST(DecoderDatabase, GetDecoderInfo) {
-  rtc::scoped_refptr<MockAudioDecoderFactory> factory(
-      new rtc::RefCountedObject<MockAudioDecoderFactory>);
-  auto* decoder = new MockAudioDecoder;
-  EXPECT_CALL(*factory, MakeAudioDecoderMock(_, _))
-      .WillOnce(Invoke([decoder](const SdpAudioFormat& format,
-                                 std::unique_ptr<AudioDecoder>* dec) {
-        EXPECT_EQ("pcmu", format.name);
-        dec->reset(decoder);
-      }));
-  DecoderDatabase db(factory);
-  const uint8_t kPayloadType = 0;
-  const std::string kCodecName = "Robert\'); DROP TABLE Students;";
-  EXPECT_EQ(
-      DecoderDatabase::kOK,
-      db.RegisterPayload(kPayloadType, NetEqDecoder::kDecoderPCMu, kCodecName));
-  const DecoderDatabase::DecoderInfo* info;
-  info = db.GetDecoderInfo(kPayloadType);
-  ASSERT_TRUE(info != NULL);
-  EXPECT_TRUE(info->IsType("pcmu"));
-  EXPECT_EQ(kCodecName, info->get_name());
-  EXPECT_EQ(decoder, db.GetDecoder(kPayloadType));
-  info = db.GetDecoderInfo(kPayloadType + 1);  // Other payload type.
-  EXPECT_TRUE(info == NULL);  // Should not be found.
-}
-
-TEST(DecoderDatabase, GetDecoder) {
-  DecoderDatabase db(CreateBuiltinAudioDecoderFactory());
-  const uint8_t kPayloadType = 0;
-  const std::string kCodecName = "Robert\'); DROP TABLE Students;";
-  EXPECT_EQ(DecoderDatabase::kOK,
-            db.RegisterPayload(kPayloadType, NetEqDecoder::kDecoderPCM16B,
-                               kCodecName));
-  AudioDecoder* dec = db.GetDecoder(kPayloadType);
-  ASSERT_TRUE(dec != NULL);
-}
-
-TEST(DecoderDatabase, TypeTests) {
-  DecoderDatabase db(new rtc::RefCountedObject<MockAudioDecoderFactory>);
-  const uint8_t kPayloadTypePcmU = 0;
-  const uint8_t kPayloadTypeCng = 13;
-  const uint8_t kPayloadTypeDtmf = 100;
-  const uint8_t kPayloadTypeRed = 101;
-  const uint8_t kPayloadNotUsed = 102;
-  // Load into database.
-  EXPECT_EQ(
-      DecoderDatabase::kOK,
-      db.RegisterPayload(kPayloadTypePcmU, NetEqDecoder::kDecoderPCMu, "pcmu"));
-  EXPECT_EQ(DecoderDatabase::kOK,
-            db.RegisterPayload(kPayloadTypeCng, NetEqDecoder::kDecoderCNGnb,
-                               "cng-nb"));
-  EXPECT_EQ(
-      DecoderDatabase::kOK,
-      db.RegisterPayload(kPayloadTypeDtmf, NetEqDecoder::kDecoderAVT, "avt"));
-  EXPECT_EQ(
-      DecoderDatabase::kOK,
-      db.RegisterPayload(kPayloadTypeRed, NetEqDecoder::kDecoderRED, "red"));
-  EXPECT_EQ(4, db.Size());
-  // Test.
-  EXPECT_FALSE(db.IsComfortNoise(kPayloadNotUsed));
-  EXPECT_FALSE(db.IsDtmf(kPayloadNotUsed));
-  EXPECT_FALSE(db.IsRed(kPayloadNotUsed));
-  EXPECT_FALSE(db.IsComfortNoise(kPayloadTypePcmU));
-  EXPECT_FALSE(db.IsDtmf(kPayloadTypePcmU));
-  EXPECT_FALSE(db.IsRed(kPayloadTypePcmU));
-  EXPECT_FALSE(db.IsType(kPayloadTypePcmU, "isac"));
-  EXPECT_TRUE(db.IsType(kPayloadTypePcmU, "pcmu"));
-  EXPECT_TRUE(db.IsComfortNoise(kPayloadTypeCng));
-  EXPECT_TRUE(db.IsDtmf(kPayloadTypeDtmf));
-  EXPECT_TRUE(db.IsRed(kPayloadTypeRed));
-}
-
-TEST(DecoderDatabase, ExternalDecoder) {
-  DecoderDatabase db(new rtc::RefCountedObject<MockAudioDecoderFactory>);
-  const uint8_t kPayloadType = 0;
-  const std::string kCodecName = "Robert\'); DROP TABLE Students;";
-  MockAudioDecoder decoder;
-  // Load into database.
-  EXPECT_EQ(DecoderDatabase::kOK,
-            db.InsertExternal(kPayloadType, NetEqDecoder::kDecoderPCMu,
-                              kCodecName, &decoder));
-  EXPECT_EQ(1, db.Size());
-  // Get decoder and make sure we get the external one.
-  EXPECT_EQ(&decoder, db.GetDecoder(kPayloadType));
-  // Get the decoder info struct and check it too.
-  const DecoderDatabase::DecoderInfo* info;
-  info = db.GetDecoderInfo(kPayloadType);
-  ASSERT_TRUE(info != NULL);
-  EXPECT_TRUE(info->IsType("pcmu"));
-  EXPECT_EQ(info->get_name(), kCodecName);
-  EXPECT_EQ(kCodecName, info->get_name());
-  // Expect not to delete the decoder when removing it from the database, since
-  // it was declared externally.
-  EXPECT_CALL(decoder, Die()).Times(0);
-  EXPECT_EQ(DecoderDatabase::kOK, db.Remove(kPayloadType));
-  EXPECT_TRUE(db.Empty());
-
-  EXPECT_CALL(decoder, Die()).Times(1);  // Will be called when |db| is deleted.
-}
-
-TEST(DecoderDatabase, CheckPayloadTypes) {
-  DecoderDatabase db(new rtc::RefCountedObject<MockAudioDecoderFactory>);
-  // Load a number of payloads into the database. Payload types are 0, 1, ...,
-  // while the decoder type is the same for all payload types (this does not
-  // matter for the test).
-  const int kNumPayloads = 10;
-  for (uint8_t payload_type = 0; payload_type < kNumPayloads; ++payload_type) {
-    EXPECT_EQ(DecoderDatabase::kOK,
-              db.RegisterPayload(payload_type, NetEqDecoder::kDecoderPCMu, ""));
-  }
-  PacketList packet_list;
-  for (int i = 0; i < kNumPayloads + 1; ++i) {
-    // Create packet with payload type |i|. The last packet will have a payload
-    // type that is not registered in the decoder database.
-    Packet packet;
-    packet.payload_type = i;
-    packet_list.push_back(std::move(packet));
-  }
-
-  // Expect to return false, since the last packet is of an unknown type.
-  EXPECT_EQ(DecoderDatabase::kDecoderNotFound,
-            db.CheckPayloadTypes(packet_list));
-
-  packet_list.pop_back();  // Remove the unknown one.
-
-  EXPECT_EQ(DecoderDatabase::kOK, db.CheckPayloadTypes(packet_list));
-
-  // Delete all packets.
-  PacketList::iterator it = packet_list.begin();
-  while (it != packet_list.end()) {
-    it = packet_list.erase(it);
-  }
-}
-
-#if defined(WEBRTC_CODEC_ISAC) || defined(WEBRTC_CODEC_ISACFX)
-#define IF_ISAC(x) x
-#else
-#define IF_ISAC(x) DISABLED_##x
-#endif
-
-// Test the methods for setting and getting active speech and CNG decoders.
-TEST(DecoderDatabase, IF_ISAC(ActiveDecoders)) {
-  DecoderDatabase db(CreateBuiltinAudioDecoderFactory());
-  // Load payload types.
-  ASSERT_EQ(DecoderDatabase::kOK,
-            db.RegisterPayload(0, NetEqDecoder::kDecoderPCMu, "pcmu"));
-  ASSERT_EQ(DecoderDatabase::kOK,
-            db.RegisterPayload(103, NetEqDecoder::kDecoderISAC, "isac"));
-  ASSERT_EQ(DecoderDatabase::kOK,
-            db.RegisterPayload(13, NetEqDecoder::kDecoderCNGnb, "cng-nb"));
-  // Verify that no decoders are active from the start.
-  EXPECT_EQ(NULL, db.GetActiveDecoder());
-  EXPECT_EQ(NULL, db.GetActiveCngDecoder());
-
-  // Set active speech codec.
-  bool changed;  // Should be true when the active decoder changed.
-  EXPECT_EQ(DecoderDatabase::kOK, db.SetActiveDecoder(0, &changed));
-  EXPECT_TRUE(changed);
-  AudioDecoder* decoder = db.GetActiveDecoder();
-  ASSERT_FALSE(decoder == NULL);  // Should get a decoder here.
-
-  // Set the same again. Expect no change.
-  EXPECT_EQ(DecoderDatabase::kOK, db.SetActiveDecoder(0, &changed));
-  EXPECT_FALSE(changed);
-  decoder = db.GetActiveDecoder();
-  ASSERT_FALSE(decoder == NULL);  // Should get a decoder here.
-
-  // Change active decoder.
-  EXPECT_EQ(DecoderDatabase::kOK, db.SetActiveDecoder(103, &changed));
-  EXPECT_TRUE(changed);
-  decoder = db.GetActiveDecoder();
-  ASSERT_FALSE(decoder == NULL);  // Should get a decoder here.
-
-  // Remove the active decoder, and verify that the active becomes NULL.
-  EXPECT_EQ(DecoderDatabase::kOK, db.Remove(103));
-  EXPECT_EQ(NULL, db.GetActiveDecoder());
-
-  // Set active CNG codec.
-  EXPECT_EQ(DecoderDatabase::kOK, db.SetActiveCngDecoder(13));
-  ComfortNoiseDecoder* cng = db.GetActiveCngDecoder();
-  ASSERT_FALSE(cng == NULL);  // Should get a decoder here.
-
-  // Remove the active CNG decoder, and verify that the active becomes NULL.
-  EXPECT_EQ(DecoderDatabase::kOK, db.Remove(13));
-  EXPECT_EQ(NULL, db.GetActiveCngDecoder());
-
-  // Try to set non-existing codecs as active.
-  EXPECT_EQ(DecoderDatabase::kDecoderNotFound,
-            db.SetActiveDecoder(17, &changed));
-  EXPECT_EQ(DecoderDatabase::kDecoderNotFound,
-            db.SetActiveCngDecoder(17));
-}
-}  // namespace webrtc
diff --git a/modules/audio_coding/neteq/defines.h b/modules/audio_coding/neteq/defines.h
deleted file mode 100644
index 3ed6b61..0000000
--- a/modules/audio_coding/neteq/defines.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- *  Copyright (c) 2012 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_NETEQ_DEFINES_H_
-#define WEBRTC_MODULES_AUDIO_CODING_NETEQ_DEFINES_H_
-
-namespace webrtc {
-
-enum Operations {
-  kNormal = 0,
-  kMerge,
-  kExpand,
-  kAccelerate,
-  kFastAccelerate,
-  kPreemptiveExpand,
-  kRfc3389Cng,
-  kRfc3389CngNoPacket,
-  kCodecInternalCng,
-  kDtmf,
-  kAlternativePlc,
-  kAlternativePlcIncreaseTimestamp,
-  kAudioRepetition,
-  kAudioRepetitionIncreaseTimestamp,
-  kUndefined = -1
-};
-
-enum Modes {
-  kModeNormal = 0,
-  kModeExpand,
-  kModeMerge,
-  kModeAccelerateSuccess,
-  kModeAccelerateLowEnergy,
-  kModeAccelerateFail,
-  kModePreemptiveExpandSuccess,
-  kModePreemptiveExpandLowEnergy,
-  kModePreemptiveExpandFail,
-  kModeRfc3389Cng,
-  kModeCodecInternalCng,
-  kModeDtmf,
-  kModeError,
-  kModeUndefined = -1
-};
-
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_AUDIO_CODING_NETEQ_DEFINES_H_
diff --git a/modules/audio_coding/neteq/delay_manager.cc b/modules/audio_coding/neteq/delay_manager.cc
deleted file mode 100644
index bf92588..0000000
--- a/modules/audio_coding/neteq/delay_manager.cc
+++ /dev/null
@@ -1,421 +0,0 @@
-/*
- *  Copyright (c) 2012 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/neteq/delay_manager.h"
-
-#include <assert.h>
-#include <math.h>
-
-#include <algorithm>  // max, min
-
-#include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
-#include "webrtc/modules/audio_coding/neteq/delay_peak_detector.h"
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/safe_conversions.h"
-
-namespace webrtc {
-
-DelayManager::DelayManager(size_t max_packets_in_buffer,
-                           DelayPeakDetector* peak_detector,
-                           const TickTimer* tick_timer)
-    : first_packet_received_(false),
-      max_packets_in_buffer_(max_packets_in_buffer),
-      iat_vector_(kMaxIat + 1, 0),
-      iat_factor_(0),
-      tick_timer_(tick_timer),
-      base_target_level_(4),  // In Q0 domain.
-      target_level_(base_target_level_ << 8),  // In Q8 domain.
-      packet_len_ms_(0),
-      streaming_mode_(false),
-      last_seq_no_(0),
-      last_timestamp_(0),
-      minimum_delay_ms_(0),
-      least_required_delay_ms_(target_level_),
-      maximum_delay_ms_(target_level_),
-      iat_cumulative_sum_(0),
-      max_iat_cumulative_sum_(0),
-      peak_detector_(*peak_detector),
-      last_pack_cng_or_dtmf_(1) {
-  assert(peak_detector);  // Should never be NULL.
-  Reset();
-}
-
-DelayManager::~DelayManager() {}
-
-const DelayManager::IATVector& DelayManager::iat_vector() const {
-  return iat_vector_;
-}
-
-// Set the histogram vector to an exponentially decaying distribution
-// iat_vector_[i] = 0.5^(i+1), i = 0, 1, 2, ...
-// iat_vector_ is in Q30.
-void DelayManager::ResetHistogram() {
-  // Set temp_prob to (slightly more than) 1 in Q14. This ensures that the sum
-  // of iat_vector_ is 1.
-  uint16_t temp_prob = 0x4002;  // 16384 + 2 = 100000000000010 binary.
-  IATVector::iterator it = iat_vector_.begin();
-  for (; it < iat_vector_.end(); it++) {
-    temp_prob >>= 1;
-    (*it) = temp_prob << 16;
-  }
-  base_target_level_ = 4;
-  target_level_ = base_target_level_ << 8;
-}
-
-int DelayManager::Update(uint16_t sequence_number,
-                         uint32_t timestamp,
-                         int sample_rate_hz) {
-  if (sample_rate_hz <= 0) {
-    return -1;
-  }
-
-  if (!first_packet_received_) {
-    // Prepare for next packet arrival.
-    packet_iat_stopwatch_ = tick_timer_->GetNewStopwatch();
-    last_seq_no_ = sequence_number;
-    last_timestamp_ = timestamp;
-    first_packet_received_ = true;
-    return 0;
-  }
-
-  // Try calculating packet length from current and previous timestamps.
-  int packet_len_ms;
-  if (!IsNewerTimestamp(timestamp, last_timestamp_) ||
-      !IsNewerSequenceNumber(sequence_number, last_seq_no_)) {
-    // Wrong timestamp or sequence order; use stored value.
-    packet_len_ms = packet_len_ms_;
-  } else {
-    // Calculate timestamps per packet and derive packet length in ms.
-    int64_t packet_len_samp =
-        static_cast<uint32_t>(timestamp - last_timestamp_) /
-        static_cast<uint16_t>(sequence_number - last_seq_no_);
-    packet_len_ms =
-        rtc::saturated_cast<int>(1000 * packet_len_samp / sample_rate_hz);
-  }
-
-  if (packet_len_ms > 0) {
-    // Cannot update statistics unless |packet_len_ms| is valid.
-    // Calculate inter-arrival time (IAT) in integer "packet times"
-    // (rounding down). This is the value used as index to the histogram
-    // vector |iat_vector_|.
-    int iat_packets = packet_iat_stopwatch_->ElapsedMs() / packet_len_ms;
-
-    if (streaming_mode_) {
-      UpdateCumulativeSums(packet_len_ms, sequence_number);
-    }
-
-    // Check for discontinuous packet sequence and re-ordering.
-    if (IsNewerSequenceNumber(sequence_number, last_seq_no_ + 1)) {
-      // Compensate for gap in the sequence numbers. Reduce IAT with the
-      // expected extra time due to lost packets, but ensure that the IAT is
-      // not negative.
-      iat_packets -= static_cast<uint16_t>(sequence_number - last_seq_no_ - 1);
-      iat_packets = std::max(iat_packets, 0);
-    } else if (!IsNewerSequenceNumber(sequence_number, last_seq_no_)) {
-      iat_packets += static_cast<uint16_t>(last_seq_no_ + 1 - sequence_number);
-    }
-
-    // Saturate IAT at maximum value.
-    const int max_iat = kMaxIat;
-    iat_packets = std::min(iat_packets, max_iat);
-    UpdateHistogram(iat_packets);
-    // Calculate new |target_level_| based on updated statistics.
-    target_level_ = CalculateTargetLevel(iat_packets);
-    if (streaming_mode_) {
-      target_level_ = std::max(target_level_, max_iat_cumulative_sum_);
-    }
-
-    LimitTargetLevel();
-  }  // End if (packet_len_ms > 0).
-
-  // Prepare for next packet arrival.
-  packet_iat_stopwatch_ = tick_timer_->GetNewStopwatch();
-  last_seq_no_ = sequence_number;
-  last_timestamp_ = timestamp;
-  return 0;
-}
-
-void DelayManager::UpdateCumulativeSums(int packet_len_ms,
-                                        uint16_t sequence_number) {
-  // Calculate IAT in Q8, including fractions of a packet (i.e., more
-  // accurate than |iat_packets|.
-  int iat_packets_q8 =
-      (packet_iat_stopwatch_->ElapsedMs() << 8) / packet_len_ms;
-  // Calculate cumulative sum IAT with sequence number compensation. The sum
-  // is zero if there is no clock-drift.
-  iat_cumulative_sum_ += (iat_packets_q8 -
-      (static_cast<int>(sequence_number - last_seq_no_) << 8));
-  // Subtract drift term.
-  iat_cumulative_sum_ -= kCumulativeSumDrift;
-  // Ensure not negative.
-  iat_cumulative_sum_ = std::max(iat_cumulative_sum_, 0);
-  if (iat_cumulative_sum_ > max_iat_cumulative_sum_) {
-    // Found a new maximum.
-    max_iat_cumulative_sum_ = iat_cumulative_sum_;
-    max_iat_stopwatch_ = tick_timer_->GetNewStopwatch();
-  }
-  if (max_iat_stopwatch_->ElapsedMs() > kMaxStreamingPeakPeriodMs) {
-    // Too long since the last maximum was observed; decrease max value.
-    max_iat_cumulative_sum_ -= kCumulativeSumDrift;
-  }
-}
-
-// Each element in the vector is first multiplied by the forgetting factor
-// |iat_factor_|. Then the vector element indicated by |iat_packets| is then
-// increased (additive) by 1 - |iat_factor_|. This way, the probability of
-// |iat_packets| is slightly increased, while the sum of the histogram remains
-// constant (=1).
-// Due to inaccuracies in the fixed-point arithmetic, the histogram may no
-// longer sum up to 1 (in Q30) after the update. To correct this, a correction
-// term is added or subtracted from the first element (or elements) of the
-// vector.
-// The forgetting factor |iat_factor_| is also updated. When the DelayManager
-// is reset, the factor is set to 0 to facilitate rapid convergence in the
-// beginning. With each update of the histogram, the factor is increased towards
-// the steady-state value |kIatFactor_|.
-void DelayManager::UpdateHistogram(size_t iat_packets) {
-  assert(iat_packets < iat_vector_.size());
-  int vector_sum = 0;  // Sum up the vector elements as they are processed.
-  // Multiply each element in |iat_vector_| with |iat_factor_|.
-  for (IATVector::iterator it = iat_vector_.begin();
-      it != iat_vector_.end(); ++it) {
-    *it = (static_cast<int64_t>(*it) * iat_factor_) >> 15;
-    vector_sum += *it;
-  }
-
-  // Increase the probability for the currently observed inter-arrival time
-  // by 1 - |iat_factor_|. The factor is in Q15, |iat_vector_| in Q30.
-  // Thus, left-shift 15 steps to obtain result in Q30.
-  iat_vector_[iat_packets] += (32768 - iat_factor_) << 15;
-  vector_sum += (32768 - iat_factor_) << 15;  // Add to vector sum.
-
-  // |iat_vector_| should sum up to 1 (in Q30), but it may not due to
-  // fixed-point rounding errors.
-  vector_sum -= 1 << 30;  // Should be zero. Compensate if not.
-  if (vector_sum != 0) {
-    // Modify a few values early in |iat_vector_|.
-    int flip_sign = vector_sum > 0 ? -1 : 1;
-    IATVector::iterator it = iat_vector_.begin();
-    while (it != iat_vector_.end() && abs(vector_sum) > 0) {
-      // Add/subtract 1/16 of the element, but not more than |vector_sum|.
-      int correction = flip_sign * std::min(abs(vector_sum), (*it) >> 4);
-      *it += correction;
-      vector_sum += correction;
-      ++it;
-    }
-  }
-  assert(vector_sum == 0);  // Verify that the above is correct.
-
-  // Update |iat_factor_| (changes only during the first seconds after a reset).
-  // The factor converges to |kIatFactor_|.
-  iat_factor_ += (kIatFactor_ - iat_factor_ + 3) >> 2;
-}
-
-// Enforces upper and lower limits for |target_level_|. The upper limit is
-// chosen to be minimum of i) 75% of |max_packets_in_buffer_|, to leave some
-// headroom for natural fluctuations around the target, and ii) equivalent of
-// |maximum_delay_ms_| in packets. Note that in practice, if no
-// |maximum_delay_ms_| is specified, this does not have any impact, since the
-// target level is far below the buffer capacity in all reasonable cases.
-// The lower limit is equivalent of |minimum_delay_ms_| in packets. We update
-// |least_required_level_| while the above limits are applied.
-// TODO(hlundin): Move this check to the buffer logistics class.
-void DelayManager::LimitTargetLevel() {
-  least_required_delay_ms_ = (target_level_ * packet_len_ms_) >> 8;
-
-  if (packet_len_ms_ > 0 && minimum_delay_ms_ > 0) {
-    int minimum_delay_packet_q8 =  (minimum_delay_ms_ << 8) / packet_len_ms_;
-    target_level_ = std::max(target_level_, minimum_delay_packet_q8);
-  }
-
-  if (maximum_delay_ms_ > 0 && packet_len_ms_ > 0) {
-    int maximum_delay_packet_q8 = (maximum_delay_ms_ << 8) / packet_len_ms_;
-    target_level_ = std::min(target_level_, maximum_delay_packet_q8);
-  }
-
-  // Shift to Q8, then 75%.;
-  int max_buffer_packets_q8 =
-      static_cast<int>((3 * (max_packets_in_buffer_ << 8)) / 4);
-  target_level_ = std::min(target_level_, max_buffer_packets_q8);
-
-  // Sanity check, at least 1 packet (in Q8).
-  target_level_ = std::max(target_level_, 1 << 8);
-}
-
-int DelayManager::CalculateTargetLevel(int iat_packets) {
-  int limit_probability = kLimitProbability;
-  if (streaming_mode_) {
-    limit_probability = kLimitProbabilityStreaming;
-  }
-
-  // Calculate target buffer level from inter-arrival time histogram.
-  // Find the |iat_index| for which the probability of observing an
-  // inter-arrival time larger than or equal to |iat_index| is less than or
-  // equal to |limit_probability|. The sought probability is estimated using
-  // the histogram as the reverse cumulant PDF, i.e., the sum of elements from
-  // the end up until |iat_index|. Now, since the sum of all elements is 1
-  // (in Q30) by definition, and since the solution is often a low value for
-  // |iat_index|, it is more efficient to start with |sum| = 1 and subtract
-  // elements from the start of the histogram.
-  size_t index = 0;  // Start from the beginning of |iat_vector_|.
-  int sum = 1 << 30;  // Assign to 1 in Q30.
-  sum -= iat_vector_[index];  // Ensure that target level is >= 1.
-
-  do {
-    // Subtract the probabilities one by one until the sum is no longer greater
-    // than limit_probability.
-    ++index;
-    sum -= iat_vector_[index];
-  } while ((sum > limit_probability) && (index < iat_vector_.size() - 1));
-
-  // This is the base value for the target buffer level.
-  int target_level = static_cast<int>(index);
-  base_target_level_ = static_cast<int>(index);
-
-  // Update detector for delay peaks.
-  bool delay_peak_found = peak_detector_.Update(iat_packets, target_level);
-  if (delay_peak_found) {
-    target_level = std::max(target_level, peak_detector_.MaxPeakHeight());
-  }
-
-  // Sanity check. |target_level| must be strictly positive.
-  target_level = std::max(target_level, 1);
-  // Scale to Q8 and assign to member variable.
-  target_level_ = target_level << 8;
-  return target_level_;
-}
-
-int DelayManager::SetPacketAudioLength(int length_ms) {
-  if (length_ms <= 0) {
-    LOG_F(LS_ERROR) << "length_ms = " << length_ms;
-    return -1;
-  }
-  packet_len_ms_ = length_ms;
-  peak_detector_.SetPacketAudioLength(packet_len_ms_);
-  packet_iat_stopwatch_ = tick_timer_->GetNewStopwatch();
-  last_pack_cng_or_dtmf_ = 1;  // TODO(hlundin): Legacy. Remove?
-  return 0;
-}
-
-
-void DelayManager::Reset() {
-  packet_len_ms_ = 0;  // Packet size unknown.
-  streaming_mode_ = false;
-  peak_detector_.Reset();
-  ResetHistogram();  // Resets target levels too.
-  iat_factor_ = 0;  // Adapt the histogram faster for the first few packets.
-  packet_iat_stopwatch_ = tick_timer_->GetNewStopwatch();
-  max_iat_stopwatch_ = tick_timer_->GetNewStopwatch();
-  iat_cumulative_sum_ = 0;
-  max_iat_cumulative_sum_ = 0;
-  last_pack_cng_or_dtmf_ = 1;
-}
-
-double DelayManager::EstimatedClockDriftPpm() const {
-  double sum = 0.0;
-  // Calculate the expected value based on the probabilities in |iat_vector_|.
-  for (size_t i = 0; i < iat_vector_.size(); ++i) {
-    sum += static_cast<double>(iat_vector_[i]) * i;
-  }
-  // The probabilities in |iat_vector_| are in Q30. Divide by 1 << 30 to convert
-  // to Q0; subtract the nominal inter-arrival time (1) to make a zero
-  // clockdrift represent as 0; mulitply by 1000000 to produce parts-per-million
-  // (ppm).
-  return (sum / (1 << 30) - 1) * 1e6;
-}
-
-bool DelayManager::PeakFound() const {
-  return peak_detector_.peak_found();
-}
-
-void DelayManager::ResetPacketIatCount() {
-  packet_iat_stopwatch_ = tick_timer_->GetNewStopwatch();
-}
-
-// Note that |low_limit| and |higher_limit| are not assigned to
-// |minimum_delay_ms_| and |maximum_delay_ms_| defined by the client of this
-// class. They are computed from |target_level_| and used for decision making.
-void DelayManager::BufferLimits(int* lower_limit, int* higher_limit) const {
-  if (!lower_limit || !higher_limit) {
-    LOG_F(LS_ERROR) << "NULL pointers supplied as input";
-    assert(false);
-    return;
-  }
-
-  int window_20ms = 0x7FFF;  // Default large value for legacy bit-exactness.
-  if (packet_len_ms_ > 0) {
-    window_20ms = (20 << 8) / packet_len_ms_;
-  }
-
-  // |target_level_| is in Q8 already.
-  *lower_limit = (target_level_ * 3) / 4;
-  // |higher_limit| is equal to |target_level_|, but should at
-  // least be 20 ms higher than |lower_limit_|.
-  *higher_limit = std::max(target_level_, *lower_limit + window_20ms);
-}
-
-int DelayManager::TargetLevel() const {
-  return target_level_;
-}
-
-void DelayManager::LastDecodedWasCngOrDtmf(bool it_was) {
-  if (it_was) {
-    last_pack_cng_or_dtmf_ = 1;
-  } else if (last_pack_cng_or_dtmf_ != 0) {
-    last_pack_cng_or_dtmf_ = -1;
-  }
-}
-
-void DelayManager::RegisterEmptyPacket() {
-  ++last_seq_no_;
-}
-
-bool DelayManager::SetMinimumDelay(int delay_ms) {
-  // Minimum delay shouldn't be more than maximum delay, if any maximum is set.
-  // Also, if possible check |delay| to less than 75% of
-  // |max_packets_in_buffer_|.
-  if ((maximum_delay_ms_ > 0 && delay_ms > maximum_delay_ms_) ||
-      (packet_len_ms_ > 0 &&
-       delay_ms >
-           static_cast<int>(3 * max_packets_in_buffer_ * packet_len_ms_ / 4))) {
-    return false;
-  }
-  minimum_delay_ms_ = delay_ms;
-  return true;
-}
-
-bool DelayManager::SetMaximumDelay(int delay_ms) {
-  if (delay_ms == 0) {
-    // Zero input unsets the maximum delay.
-    maximum_delay_ms_ = 0;
-    return true;
-  } else if (delay_ms < minimum_delay_ms_ || delay_ms < packet_len_ms_) {
-    // Maximum delay shouldn't be less than minimum delay or less than a packet.
-    return false;
-  }
-  maximum_delay_ms_ = delay_ms;
-  return true;
-}
-
-int DelayManager::least_required_delay_ms() const {
-  return least_required_delay_ms_;
-}
-
-int DelayManager::base_target_level() const { return base_target_level_; }
-void DelayManager::set_streaming_mode(bool value) { streaming_mode_ = value; }
-int DelayManager::last_pack_cng_or_dtmf() const {
-  return last_pack_cng_or_dtmf_;
-}
-
-void DelayManager::set_last_pack_cng_or_dtmf(int value) {
-  last_pack_cng_or_dtmf_ = value;
-}
-}  // namespace webrtc
diff --git a/modules/audio_coding/neteq/delay_manager.h b/modules/audio_coding/neteq/delay_manager.h
deleted file mode 100644
index ac1de25..0000000
--- a/modules/audio_coding/neteq/delay_manager.h
+++ /dev/null
@@ -1,174 +0,0 @@
-/*
- *  Copyright (c) 2012 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_NETEQ_DELAY_MANAGER_H_
-#define WEBRTC_MODULES_AUDIO_CODING_NETEQ_DELAY_MANAGER_H_
-
-#include <string.h>  // Provide access to size_t.
-
-#include <memory>
-#include <vector>
-
-#include "webrtc/modules/audio_coding/neteq/audio_decoder_impl.h"
-#include "webrtc/modules/audio_coding/neteq/tick_timer.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-// Forward declaration.
-class DelayPeakDetector;
-
-class DelayManager {
- public:
-  typedef std::vector<int> IATVector;
-
-  // Create a DelayManager object. Notify the delay manager that the packet
-  // buffer can hold no more than |max_packets_in_buffer| packets (i.e., this
-  // is the number of packet slots in the buffer). Supply a PeakDetector
-  // object to the DelayManager.
-  DelayManager(size_t max_packets_in_buffer,
-               DelayPeakDetector* peak_detector,
-               const TickTimer* tick_timer);
-
-  virtual ~DelayManager();
-
-  // Read the inter-arrival time histogram. Mainly for testing purposes.
-  virtual const IATVector& iat_vector() const;
-
-  // Updates the delay manager with a new incoming packet, with
-  // |sequence_number| and |timestamp| from the RTP header. This updates the
-  // inter-arrival time histogram and other statistics, as well as the
-  // associated DelayPeakDetector. A new target buffer level is calculated.
-  // Returns 0 on success, -1 on failure (invalid sample rate).
-  virtual int Update(uint16_t sequence_number,
-                     uint32_t timestamp,
-                     int sample_rate_hz);
-
-  // Calculates a new target buffer level. Called from the Update() method.
-  // Sets target_level_ (in Q8) and returns the same value. Also calculates
-  // and updates base_target_level_, which is the target buffer level before
-  // taking delay peaks into account.
-  virtual int CalculateTargetLevel(int iat_packets);
-
-  // Notifies the DelayManager of how much audio data is carried in each packet.
-  // The method updates the DelayPeakDetector too, and resets the inter-arrival
-  // time counter. Returns 0 on success, -1 on failure.
-  virtual int SetPacketAudioLength(int length_ms);
-
-  // Resets the DelayManager and the associated DelayPeakDetector.
-  virtual void Reset();
-
-  // Calculates the average inter-arrival time deviation from the histogram.
-  // The result is returned as parts-per-million deviation from the nominal
-  // inter-arrival time. That is, if the average inter-arrival time is equal to
-  // the nominal frame time, the return value is zero. A positive value
-  // corresponds to packet spacing being too large, while a negative value means
-  // that the packets arrive with less spacing than expected.
-  virtual double EstimatedClockDriftPpm() const;
-
-  // Returns true if peak-mode is active. That is, delay peaks were observed
-  // recently. This method simply asks for the same information from the
-  // DelayPeakDetector object.
-  virtual bool PeakFound() const;
-
-  // Reset the inter-arrival time counter to 0.
-  virtual void ResetPacketIatCount();
-
-  // Writes the lower and higher limits which the buffer level should stay
-  // within to the corresponding pointers. The values are in (fractions of)
-  // packets in Q8.
-  virtual void BufferLimits(int* lower_limit, int* higher_limit) const;
-
-  // Gets the target buffer level, in (fractions of) packets in Q8. This value
-  // includes any extra delay set through the set_extra_delay_ms() method.
-  virtual int TargetLevel() const;
-
-  // Informs the delay manager whether or not the last decoded packet contained
-  // speech.
-  virtual void LastDecodedWasCngOrDtmf(bool it_was);
-
-  // Notify the delay manager that empty packets have been received. These are
-  // packets that are part of the sequence number series, so that an empty
-  // packet will shift the sequence numbers for the following packets.
-  virtual void RegisterEmptyPacket();
-
-  // Accessors and mutators.
-  // Assuming |delay| is in valid range.
-  virtual bool SetMinimumDelay(int delay_ms);
-  virtual bool SetMaximumDelay(int delay_ms);
-  virtual int least_required_delay_ms() const;
-  virtual int base_target_level() const;
-  virtual void set_streaming_mode(bool value);
-  virtual int last_pack_cng_or_dtmf() const;
-  virtual void set_last_pack_cng_or_dtmf(int value);
-
- private:
-  static const int kLimitProbability = 53687091;  // 1/20 in Q30.
-  static const int kLimitProbabilityStreaming = 536871;  // 1/2000 in Q30.
-  static const int kMaxStreamingPeakPeriodMs = 600000;  // 10 minutes in ms.
-  static const int kCumulativeSumDrift = 2;  // Drift term for cumulative sum
-                                             // |iat_cumulative_sum_|.
-  // Steady-state forgetting factor for |iat_vector_|, 0.9993 in Q15.
-  static const int kIatFactor_ = 32745;
-  static const int kMaxIat = 64;  // Max inter-arrival time to register.
-
-  // Sets |iat_vector_| to the default start distribution and sets the
-  // |base_target_level_| and |target_level_| to the corresponding values.
-  void ResetHistogram();
-
-  // Updates |iat_cumulative_sum_| and |max_iat_cumulative_sum_|. (These are
-  // used by the streaming mode.) This method is called by Update().
-  void UpdateCumulativeSums(int packet_len_ms, uint16_t sequence_number);
-
-  // Updates the histogram |iat_vector_|. The probability for inter-arrival time
-  // equal to |iat_packets| (in integer packets) is increased slightly, while
-  // all other entries are decreased. This method is called by Update().
-  void UpdateHistogram(size_t iat_packets);
-
-  // Makes sure that |target_level_| is not too large, taking
-  // |max_packets_in_buffer_| and |extra_delay_ms_| into account. This method is
-  // called by Update().
-  void LimitTargetLevel();
-
-  bool first_packet_received_;
-  const size_t max_packets_in_buffer_;  // Capacity of the packet buffer.
-  IATVector iat_vector_;  // Histogram of inter-arrival times.
-  int iat_factor_;  // Forgetting factor for updating the IAT histogram (Q15).
-  const TickTimer* tick_timer_;
-  // Time elapsed since last packet.
-  std::unique_ptr<TickTimer::Stopwatch> packet_iat_stopwatch_;
-  int base_target_level_;   // Currently preferred buffer level before peak
-                            // detection and streaming mode (Q0).
-  // TODO(turajs) change the comment according to the implementation of
-  // minimum-delay.
-  int target_level_;  // Currently preferred buffer level in (fractions)
-                      // of packets (Q8), before adding any extra delay.
-  int packet_len_ms_;  // Length of audio in each incoming packet [ms].
-  bool streaming_mode_;
-  uint16_t last_seq_no_;  // Sequence number for last received packet.
-  uint32_t last_timestamp_;  // Timestamp for the last received packet.
-  int minimum_delay_ms_;  // Externally set minimum delay.
-  int least_required_delay_ms_;  // Smallest preferred buffer level (same unit
-                              // as |target_level_|), before applying
-                              // |minimum_delay_ms_| and/or |maximum_delay_ms_|.
-  int maximum_delay_ms_;  // Externally set maximum allowed delay.
-  int iat_cumulative_sum_;  // Cumulative sum of delta inter-arrival times.
-  int max_iat_cumulative_sum_;  // Max of |iat_cumulative_sum_|.
-  // Time elapsed since maximum was observed.
-  std::unique_ptr<TickTimer::Stopwatch> max_iat_stopwatch_;
-  DelayPeakDetector& peak_detector_;
-  int last_pack_cng_or_dtmf_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(DelayManager);
-};
-
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_AUDIO_CODING_NETEQ_DELAY_MANAGER_H_
diff --git a/modules/audio_coding/neteq/delay_manager_unittest.cc b/modules/audio_coding/neteq/delay_manager_unittest.cc
deleted file mode 100644
index a6ee58d..0000000
--- a/modules/audio_coding/neteq/delay_manager_unittest.cc
+++ /dev/null
@@ -1,338 +0,0 @@
-/*
- *  Copyright (c) 2012 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.
- */
-
-// Unit tests for DelayManager class.
-
-#include "webrtc/modules/audio_coding/neteq/delay_manager.h"
-
-#include <math.h>
-
-#include "webrtc/modules/audio_coding/neteq/mock/mock_delay_peak_detector.h"
-#include "webrtc/test/gmock.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-using ::testing::Return;
-using ::testing::_;
-
-class DelayManagerTest : public ::testing::Test {
- protected:
-  static const int kMaxNumberOfPackets = 240;
-  static const int kTimeStepMs = 10;
-  static const int kFs = 8000;
-  static const int kFrameSizeMs = 20;
-  static const int kTsIncrement = kFrameSizeMs * kFs / 1000;
-
-  DelayManagerTest();
-  virtual void SetUp();
-  virtual void TearDown();
-  void SetPacketAudioLength(int lengt_ms);
-  void InsertNextPacket();
-  void IncreaseTime(int inc_ms);
-
-  DelayManager* dm_;
-  TickTimer tick_timer_;
-  MockDelayPeakDetector detector_;
-  uint16_t seq_no_;
-  uint32_t ts_;
-};
-
-DelayManagerTest::DelayManagerTest()
-    : dm_(NULL), detector_(&tick_timer_), seq_no_(0x1234), ts_(0x12345678) {}
-
-void DelayManagerTest::SetUp() {
-  EXPECT_CALL(detector_, Reset())
-            .Times(1);
-  dm_ = new DelayManager(kMaxNumberOfPackets, &detector_, &tick_timer_);
-}
-
-void DelayManagerTest::SetPacketAudioLength(int lengt_ms) {
-  EXPECT_CALL(detector_, SetPacketAudioLength(lengt_ms));
-  dm_->SetPacketAudioLength(lengt_ms);
-}
-
-void DelayManagerTest::InsertNextPacket() {
-  EXPECT_EQ(0, dm_->Update(seq_no_, ts_, kFs));
-  seq_no_ += 1;
-  ts_ += kTsIncrement;
-}
-
-void DelayManagerTest::IncreaseTime(int inc_ms) {
-  for (int t = 0; t < inc_ms; t += kTimeStepMs) {
-    tick_timer_.Increment();
-  }
-}
-void DelayManagerTest::TearDown() {
-  EXPECT_CALL(detector_, Die());
-  delete dm_;
-}
-
-TEST_F(DelayManagerTest, CreateAndDestroy) {
-  // Nothing to do here. The test fixture creates and destroys the DelayManager
-  // object.
-}
-
-TEST_F(DelayManagerTest, VectorInitialization) {
-  const DelayManager::IATVector& vec = dm_->iat_vector();
-  double sum = 0.0;
-  for (size_t i = 0; i < vec.size(); i++) {
-    EXPECT_NEAR(ldexp(pow(0.5, static_cast<int>(i + 1)), 30), vec[i], 65537);
-    // Tolerance 65537 in Q30 corresponds to a delta of approximately 0.00006.
-    sum += vec[i];
-  }
-  EXPECT_EQ(1 << 30, static_cast<int>(sum));  // Should be 1 in Q30.
-}
-
-TEST_F(DelayManagerTest, SetPacketAudioLength) {
-  const int kLengthMs = 30;
-  // Expect DelayManager to pass on the new length to the detector object.
-  EXPECT_CALL(detector_, SetPacketAudioLength(kLengthMs))
-      .Times(1);
-  EXPECT_EQ(0, dm_->SetPacketAudioLength(kLengthMs));
-  EXPECT_EQ(-1, dm_->SetPacketAudioLength(-1));  // Illegal parameter value.
-}
-
-TEST_F(DelayManagerTest, PeakFound) {
-  // Expect DelayManager to pass on the question to the detector.
-  // Call twice, and let the detector return true the first time and false the
-  // second time.
-  EXPECT_CALL(detector_, peak_found())
-      .WillOnce(Return(true))
-      .WillOnce(Return(false));
-  EXPECT_TRUE(dm_->PeakFound());
-  EXPECT_FALSE(dm_->PeakFound());
-}
-
-TEST_F(DelayManagerTest, UpdateNormal) {
-  SetPacketAudioLength(kFrameSizeMs);
-  // First packet arrival.
-  InsertNextPacket();
-  // Advance time by one frame size.
-  IncreaseTime(kFrameSizeMs);
-  // Second packet arrival.
-  // Expect detector update method to be called once with inter-arrival time
-  // equal to 1 packet, and (base) target level equal to 1 as well.
-  // Return false to indicate no peaks found.
-  EXPECT_CALL(detector_, Update(1, 1))
-      .WillOnce(Return(false));
-  InsertNextPacket();
-  EXPECT_EQ(1 << 8, dm_->TargetLevel());  // In Q8.
-  EXPECT_EQ(1, dm_->base_target_level());
-  int lower, higher;
-  dm_->BufferLimits(&lower, &higher);
-  // Expect |lower| to be 75% of target level, and |higher| to be target level,
-  // but also at least 20 ms higher than |lower|, which is the limiting case
-  // here.
-  EXPECT_EQ((1 << 8) * 3 / 4, lower);
-  EXPECT_EQ(lower + (20 << 8) / kFrameSizeMs, higher);
-}
-
-TEST_F(DelayManagerTest, UpdateLongInterArrivalTime) {
-  SetPacketAudioLength(kFrameSizeMs);
-  // First packet arrival.
-  InsertNextPacket();
-  // Advance time by two frame size.
-  IncreaseTime(2 * kFrameSizeMs);
-  // Second packet arrival.
-  // Expect detector update method to be called once with inter-arrival time
-  // equal to 1 packet, and (base) target level equal to 1 as well.
-  // Return false to indicate no peaks found.
-  EXPECT_CALL(detector_, Update(2, 2))
-      .WillOnce(Return(false));
-  InsertNextPacket();
-  EXPECT_EQ(2 << 8, dm_->TargetLevel());  // In Q8.
-  EXPECT_EQ(2, dm_->base_target_level());
-  int lower, higher;
-  dm_->BufferLimits(&lower, &higher);
-  // Expect |lower| to be 75% of target level, and |higher| to be target level,
-  // but also at least 20 ms higher than |lower|, which is the limiting case
-  // here.
-  EXPECT_EQ((2 << 8) * 3 / 4, lower);
-  EXPECT_EQ(lower + (20 << 8) / kFrameSizeMs, higher);
-}
-
-TEST_F(DelayManagerTest, UpdatePeakFound) {
-  SetPacketAudioLength(kFrameSizeMs);
-  // First packet arrival.
-  InsertNextPacket();
-  // Advance time by one frame size.
-  IncreaseTime(kFrameSizeMs);
-  // Second packet arrival.
-  // Expect detector update method to be called once with inter-arrival time
-  // equal to 1 packet, and (base) target level equal to 1 as well.
-  // Return true to indicate that peaks are found. Let the peak height be 5.
-  EXPECT_CALL(detector_, Update(1, 1))
-      .WillOnce(Return(true));
-  EXPECT_CALL(detector_, MaxPeakHeight())
-      .WillOnce(Return(5));
-  InsertNextPacket();
-  EXPECT_EQ(5 << 8, dm_->TargetLevel());
-  EXPECT_EQ(1, dm_->base_target_level());  // Base target level is w/o peaks.
-  int lower, higher;
-  dm_->BufferLimits(&lower, &higher);
-  // Expect |lower| to be 75% of target level, and |higher| to be target level.
-  EXPECT_EQ((5 << 8) * 3 / 4, lower);
-  EXPECT_EQ(5 << 8, higher);
-}
-
-TEST_F(DelayManagerTest, TargetDelay) {
-  SetPacketAudioLength(kFrameSizeMs);
-  // First packet arrival.
-  InsertNextPacket();
-  // Advance time by one frame size.
-  IncreaseTime(kFrameSizeMs);
-  // Second packet arrival.
-  // Expect detector update method to be called once with inter-arrival time
-  // equal to 1 packet, and (base) target level equal to 1 as well.
-  // Return false to indicate no peaks found.
-  EXPECT_CALL(detector_, Update(1, 1))
-      .WillOnce(Return(false));
-  InsertNextPacket();
-  const int kExpectedTarget = 1;
-  EXPECT_EQ(kExpectedTarget << 8, dm_->TargetLevel());  // In Q8.
-  EXPECT_EQ(1, dm_->base_target_level());
-  int lower, higher;
-  dm_->BufferLimits(&lower, &higher);
-  // Expect |lower| to be 75% of base target level, and |higher| to be
-  // lower + 20 ms headroom.
-  EXPECT_EQ((1 << 8) * 3 / 4, lower);
-  EXPECT_EQ(lower + (20 << 8) / kFrameSizeMs, higher);
-}
-
-TEST_F(DelayManagerTest, MaxAndRequiredDelay) {
-  const int kExpectedTarget = 5;
-  const int kTimeIncrement = kExpectedTarget * kFrameSizeMs;
-  SetPacketAudioLength(kFrameSizeMs);
-  // First packet arrival.
-  InsertNextPacket();
-  // Second packet arrival.
-  // Expect detector update method to be called once with inter-arrival time
-  // equal to |kExpectedTarget| packet. Return true to indicate peaks found.
-  EXPECT_CALL(detector_, Update(kExpectedTarget, _))
-      .WillRepeatedly(Return(true));
-  EXPECT_CALL(detector_, MaxPeakHeight())
-      .WillRepeatedly(Return(kExpectedTarget));
-  IncreaseTime(kTimeIncrement);
-  InsertNextPacket();
-
-  // No limit is set.
-  EXPECT_EQ(kExpectedTarget << 8, dm_->TargetLevel());
-
-  int kMaxDelayPackets = kExpectedTarget - 2;
-  int kMaxDelayMs = kMaxDelayPackets * kFrameSizeMs;
-  EXPECT_TRUE(dm_->SetMaximumDelay(kMaxDelayMs));
-  IncreaseTime(kTimeIncrement);
-  InsertNextPacket();
-  EXPECT_EQ(kExpectedTarget * kFrameSizeMs, dm_->least_required_delay_ms());
-  EXPECT_EQ(kMaxDelayPackets << 8, dm_->TargetLevel());
-
-  // Target level at least should be one packet.
-  EXPECT_FALSE(dm_->SetMaximumDelay(kFrameSizeMs - 1));
-}
-
-TEST_F(DelayManagerTest, MinAndRequiredDelay) {
-  const int kExpectedTarget = 5;
-  const int kTimeIncrement = kExpectedTarget * kFrameSizeMs;
-  SetPacketAudioLength(kFrameSizeMs);
-  // First packet arrival.
-  InsertNextPacket();
-  // Second packet arrival.
-  // Expect detector update method to be called once with inter-arrival time
-  // equal to |kExpectedTarget| packet. Return true to indicate peaks found.
-  EXPECT_CALL(detector_, Update(kExpectedTarget, _))
-      .WillRepeatedly(Return(true));
-  EXPECT_CALL(detector_, MaxPeakHeight())
-      .WillRepeatedly(Return(kExpectedTarget));
-  IncreaseTime(kTimeIncrement);
-  InsertNextPacket();
-
-  // No limit is applied.
-  EXPECT_EQ(kExpectedTarget << 8, dm_->TargetLevel());
-
-  int kMinDelayPackets = kExpectedTarget + 2;
-  int kMinDelayMs = kMinDelayPackets * kFrameSizeMs;
-  dm_->SetMinimumDelay(kMinDelayMs);
-  IncreaseTime(kTimeIncrement);
-  InsertNextPacket();
-  EXPECT_EQ(kExpectedTarget * kFrameSizeMs, dm_->least_required_delay_ms());
-  EXPECT_EQ(kMinDelayPackets << 8, dm_->TargetLevel());
-}
-
-// Tests that skipped sequence numbers (simulating empty packets) are handled
-// correctly.
-TEST_F(DelayManagerTest, EmptyPacketsReported) {
-  SetPacketAudioLength(kFrameSizeMs);
-  // First packet arrival.
-  InsertNextPacket();
-
-  // Advance time by one frame size.
-  IncreaseTime(kFrameSizeMs);
-
-  // Advance the sequence number by 5, simulating that 5 empty packets were
-  // received, but never inserted.
-  seq_no_ += 10;
-  for (int j = 0; j < 10; ++j) {
-    dm_->RegisterEmptyPacket();
-  }
-
-  // Second packet arrival.
-  // Expect detector update method to be called once with inter-arrival time
-  // equal to 1 packet, and (base) target level equal to 1 as well.
-  // Return false to indicate no peaks found.
-  EXPECT_CALL(detector_, Update(1, 1)).WillOnce(Return(false));
-  InsertNextPacket();
-
-  EXPECT_EQ(1 << 8, dm_->TargetLevel());  // In Q8.
-}
-
-// Same as above, but do not call RegisterEmptyPacket. Observe the target level
-// increase dramatically.
-TEST_F(DelayManagerTest, EmptyPacketsNotReported) {
-  SetPacketAudioLength(kFrameSizeMs);
-  // First packet arrival.
-  InsertNextPacket();
-
-  // Advance time by one frame size.
-  IncreaseTime(kFrameSizeMs);
-
-  // Advance the sequence number by 5, simulating that 5 empty packets were
-  // received, but never inserted.
-  seq_no_ += 10;
-
-  // Second packet arrival.
-  // Expect detector update method to be called once with inter-arrival time
-  // equal to 1 packet, and (base) target level equal to 1 as well.
-  // Return false to indicate no peaks found.
-  EXPECT_CALL(detector_, Update(10, 10)).WillOnce(Return(false));
-  InsertNextPacket();
-
-  // Note 10 times higher target value.
-  EXPECT_EQ(10 * 1 << 8, dm_->TargetLevel());  // In Q8.
-}
-
-TEST_F(DelayManagerTest, Failures) {
-  // Wrong sample rate.
-  EXPECT_EQ(-1, dm_->Update(0, 0, -1));
-  // Wrong packet size.
-  EXPECT_EQ(-1, dm_->SetPacketAudioLength(0));
-  EXPECT_EQ(-1, dm_->SetPacketAudioLength(-1));
-
-  // Minimum delay higher than a maximum delay is not accepted.
-  EXPECT_TRUE(dm_->SetMaximumDelay(10));
-  EXPECT_FALSE(dm_->SetMinimumDelay(20));
-
-  // Maximum delay less than minimum delay is not accepted.
-  EXPECT_TRUE(dm_->SetMaximumDelay(100));
-  EXPECT_TRUE(dm_->SetMinimumDelay(80));
-  EXPECT_FALSE(dm_->SetMaximumDelay(60));
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/neteq/delay_peak_detector.cc b/modules/audio_coding/neteq/delay_peak_detector.cc
deleted file mode 100644
index b3fe8a7..0000000
--- a/modules/audio_coding/neteq/delay_peak_detector.cc
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- *  Copyright (c) 2012 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/neteq/delay_peak_detector.h"
-
-#include <algorithm>  // max
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/safe_conversions.h"
-
-namespace webrtc {
-
-// The DelayPeakDetector keeps track of severe inter-arrival times, called
-// delay peaks. When a peak is observed, the "height" (the time elapsed since
-// the previous packet arrival) and the peak "period" (the time since the last
-// observed peak) is recorded in a vector. When enough peaks have been observed,
-// peak-mode is engaged and the DelayManager asks the DelayPeakDetector for
-// the worst peak height.
-
-DelayPeakDetector::~DelayPeakDetector() = default;
-
-DelayPeakDetector::DelayPeakDetector(const TickTimer* tick_timer)
-    : peak_found_(false),
-      peak_detection_threshold_(0),
-      tick_timer_(tick_timer) {
-  RTC_DCHECK(!peak_period_stopwatch_);
-}
-
-void DelayPeakDetector::Reset() {
-  peak_period_stopwatch_.reset();
-  peak_found_ = false;
-  peak_history_.clear();
-}
-
-// Calculates the threshold in number of packets.
-void DelayPeakDetector::SetPacketAudioLength(int length_ms) {
-  if (length_ms > 0) {
-    peak_detection_threshold_ = kPeakHeightMs / length_ms;
-  }
-}
-
-bool DelayPeakDetector::peak_found() {
-  return peak_found_;
-}
-
-int DelayPeakDetector::MaxPeakHeight() const {
-  int max_height = -1;  // Returns -1 for an empty history.
-  std::list<Peak>::const_iterator it;
-  for (it = peak_history_.begin(); it != peak_history_.end(); ++it) {
-    max_height = std::max(max_height, it->peak_height_packets);
-  }
-  return max_height;
-}
-
-uint64_t DelayPeakDetector::MaxPeakPeriod() const {
-  auto max_period_element = std::max_element(
-      peak_history_.begin(), peak_history_.end(),
-      [](Peak a, Peak b) { return a.period_ms < b.period_ms; });
-  if (max_period_element == peak_history_.end()) {
-    return 0;  // |peak_history_| is empty.
-  }
-  RTC_DCHECK_GT(max_period_element->period_ms, 0);
-  return max_period_element->period_ms;
-}
-
-bool DelayPeakDetector::Update(int inter_arrival_time, int target_level) {
-  if (inter_arrival_time > target_level + peak_detection_threshold_ ||
-      inter_arrival_time > 2 * target_level) {
-    // A delay peak is observed.
-    if (!peak_period_stopwatch_) {
-      // This is the first peak. Reset the period counter.
-      peak_period_stopwatch_ = tick_timer_->GetNewStopwatch();
-    } else if (peak_period_stopwatch_->ElapsedMs() > 0) {
-      if (peak_period_stopwatch_->ElapsedMs() <= kMaxPeakPeriodMs) {
-        // This is not the first peak, and the period is valid.
-        // Store peak data in the vector.
-        Peak peak_data;
-        peak_data.period_ms = peak_period_stopwatch_->ElapsedMs();
-        peak_data.peak_height_packets = inter_arrival_time;
-        peak_history_.push_back(peak_data);
-        while (peak_history_.size() > kMaxNumPeaks) {
-          // Delete the oldest data point.
-          peak_history_.pop_front();
-        }
-        peak_period_stopwatch_ = tick_timer_->GetNewStopwatch();
-      } else if (peak_period_stopwatch_->ElapsedMs() <= 2 * kMaxPeakPeriodMs) {
-        // Invalid peak due to too long period. Reset period counter and start
-        // looking for next peak.
-        peak_period_stopwatch_ = tick_timer_->GetNewStopwatch();
-      } else {
-        // More than 2 times the maximum period has elapsed since the last peak
-        // was registered. It seams that the network conditions have changed.
-        // Reset the peak statistics.
-        Reset();
-      }
-    }
-  }
-  return CheckPeakConditions();
-}
-
-bool DelayPeakDetector::CheckPeakConditions() {
-  size_t s = peak_history_.size();
-  if (s >= kMinPeaksToTrigger &&
-      peak_period_stopwatch_->ElapsedMs() <= 2 * MaxPeakPeriod()) {
-    peak_found_ = true;
-  } else {
-    peak_found_ = false;
-  }
-  return peak_found_;
-}
-}  // namespace webrtc
diff --git a/modules/audio_coding/neteq/delay_peak_detector.h b/modules/audio_coding/neteq/delay_peak_detector.h
deleted file mode 100644
index 455d4e9..0000000
--- a/modules/audio_coding/neteq/delay_peak_detector.h
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- *  Copyright (c) 2012 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_NETEQ_DELAY_PEAK_DETECTOR_H_
-#define WEBRTC_MODULES_AUDIO_CODING_NETEQ_DELAY_PEAK_DETECTOR_H_
-
-#include <string.h>  // size_t
-
-#include <list>
-#include <memory>
-
-#include "webrtc/modules/audio_coding/neteq/tick_timer.h"
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace webrtc {
-
-class DelayPeakDetector {
- public:
-  DelayPeakDetector(const TickTimer* tick_timer);
-  virtual ~DelayPeakDetector();
-  virtual void Reset();
-
-  // Notifies the DelayPeakDetector of how much audio data is carried in each
-  // packet.
-  virtual void SetPacketAudioLength(int length_ms);
-
-  // Returns true if peak-mode is active. That is, delay peaks were observed
-  // recently.
-  virtual bool peak_found();
-
-  // Calculates and returns the maximum delay peak height. Returns -1 if no
-  // delay peaks have been observed recently. The unit is number of packets.
-  virtual int MaxPeakHeight() const;
-
-  // Calculates and returns the maximum delay peak distance in ms (strictly
-  // larger than 0), or 0 if no delay peaks have been observed recently.
-  virtual uint64_t MaxPeakPeriod() const;
-
-  // Updates the DelayPeakDetector with a new inter-arrival time (in packets)
-  // and the current target buffer level (needed to decide if a peak is observed
-  // or not). Returns true if peak-mode is active, false if not.
-  virtual bool Update(int inter_arrival_time, int target_level);
-
- private:
-  static const size_t kMaxNumPeaks = 8;
-  static const size_t kMinPeaksToTrigger = 2;
-  static const int kPeakHeightMs = 78;
-  static const int kMaxPeakPeriodMs = 10000;
-
-  typedef struct {
-    uint64_t period_ms;
-    int peak_height_packets;
-  } Peak;
-
-  bool CheckPeakConditions();
-
-  std::list<Peak> peak_history_;
-  bool peak_found_;
-  int peak_detection_threshold_;
-  const TickTimer* tick_timer_;
-  std::unique_ptr<TickTimer::Stopwatch> peak_period_stopwatch_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(DelayPeakDetector);
-};
-
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_AUDIO_CODING_NETEQ_DELAY_PEAK_DETECTOR_H_
diff --git a/modules/audio_coding/neteq/delay_peak_detector_unittest.cc b/modules/audio_coding/neteq/delay_peak_detector_unittest.cc
deleted file mode 100644
index e927593..0000000
--- a/modules/audio_coding/neteq/delay_peak_detector_unittest.cc
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- *  Copyright (c) 2012 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.
- */
-
-// Unit tests for DelayPeakDetector class.
-
-#include "webrtc/modules/audio_coding/neteq/delay_peak_detector.h"
-
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-TEST(DelayPeakDetector, CreateAndDestroy) {
-  TickTimer tick_timer;
-  DelayPeakDetector* detector = new DelayPeakDetector(&tick_timer);
-  EXPECT_FALSE(detector->peak_found());
-  delete detector;
-}
-
-TEST(DelayPeakDetector, EmptyHistory) {
-  TickTimer tick_timer;
-  DelayPeakDetector detector(&tick_timer);
-  EXPECT_EQ(-1, detector.MaxPeakHeight());
-  EXPECT_EQ(0u, detector.MaxPeakPeriod());
-}
-
-// Inject a series of packet arrivals into the detector. Three of the packets
-// have suffered delays. After the third delay peak, peak-mode is expected to
-// start. This should then continue until it is disengaged due to lack of peaks.
-TEST(DelayPeakDetector, TriggerPeakMode) {
-  TickTimer tick_timer;
-  DelayPeakDetector detector(&tick_timer);
-  const int kPacketSizeMs = 30;
-  detector.SetPacketAudioLength(kPacketSizeMs);
-
-  // Load up normal arrival times; 0 ms, 30 ms, 60 ms, 90 ms, ...
-  const int kNumPackets = 1000;
-  int arrival_times_ms[kNumPackets];
-  for (int i = 0; i < kNumPackets; ++i) {
-    arrival_times_ms[i] = i * kPacketSizeMs;
-  }
-
-  // Delay three packets.
-  const int kPeakDelayMs = 100;
-  // First delay peak.
-  arrival_times_ms[100] += kPeakDelayMs;
-  // Second delay peak.
-  arrival_times_ms[200] += kPeakDelayMs;
-  // Third delay peak. Trigger peak-mode after this packet.
-  arrival_times_ms[400] += kPeakDelayMs;
-  // The second peak period is the longest, 200 packets.
-  const uint64_t kWorstPeakPeriod = 200 * kPacketSizeMs;
-  int peak_mode_start_ms = arrival_times_ms[400];
-  // Expect to disengage after no peaks are observed for two period times.
-  int peak_mode_end_ms = peak_mode_start_ms + 2 * kWorstPeakPeriod;
-
-  // Load into detector.
-  int time = 0;
-  int next = 1;  // Start with the second packet to get a proper IAT.
-  while (next < kNumPackets) {
-    while (next < kNumPackets && arrival_times_ms[next] <= time) {
-      int iat_packets = (arrival_times_ms[next] - arrival_times_ms[next - 1]) /
-          kPacketSizeMs;
-      const int kTargetBufferLevel = 1;  // Define peaks to be iat > 2.
-      if (time < peak_mode_start_ms || time > peak_mode_end_ms) {
-        EXPECT_FALSE(detector.Update(iat_packets, kTargetBufferLevel));
-      } else {
-        EXPECT_TRUE(detector.Update(iat_packets, kTargetBufferLevel));
-        EXPECT_EQ(kWorstPeakPeriod, detector.MaxPeakPeriod());
-        EXPECT_EQ(kPeakDelayMs / kPacketSizeMs + 1, detector.MaxPeakHeight());
-      }
-      ++next;
-    }
-    tick_timer.Increment();
-    time += 10;  // Increase time 10 ms.
-  }
-}
-
-// Same test as TriggerPeakMode, but with base target buffer level increased to
-// 2, in order to raise the bar for delay peaks to inter-arrival times > 4.
-// The delay pattern has peaks with delay = 3, thus should not trigger.
-TEST(DelayPeakDetector, DoNotTriggerPeakMode) {
-  TickTimer tick_timer;
-  DelayPeakDetector detector(&tick_timer);
-  const int kPacketSizeMs = 30;
-  detector.SetPacketAudioLength(kPacketSizeMs);
-
-  // Load up normal arrival times; 0 ms, 30 ms, 60 ms, 90 ms, ...
-  const int kNumPackets = 1000;
-  int arrival_times_ms[kNumPackets];
-  for (int i = 0; i < kNumPackets; ++i) {
-    arrival_times_ms[i] = i * kPacketSizeMs;
-  }
-
-  // Delay three packets.
-  const int kPeakDelayMs = 100;
-  // First delay peak.
-  arrival_times_ms[100] += kPeakDelayMs;
-  // Second delay peak.
-  arrival_times_ms[200] += kPeakDelayMs;
-  // Third delay peak.
-  arrival_times_ms[400] += kPeakDelayMs;
-
-  // Load into detector.
-  int time = 0;
-  int next = 1;  // Start with the second packet to get a proper IAT.
-  while (next < kNumPackets) {
-    while (next < kNumPackets && arrival_times_ms[next] <= time) {
-      int iat_packets = (arrival_times_ms[next] - arrival_times_ms[next - 1]) /
-          kPacketSizeMs;
-      const int kTargetBufferLevel = 2;  // Define peaks to be iat > 4.
-      EXPECT_FALSE(detector.Update(iat_packets, kTargetBufferLevel));
-      ++next;
-    }
-    tick_timer.Increment();
-    time += 10;  // Increase time 10 ms.
-  }
-}
-
-// In situations with reordered packets, the DelayPeakDetector may be updated
-// back-to-back (i.e., without the tick_timer moving) but still with non-zero
-// inter-arrival time. This test is to make sure that this does not cause
-// problems.
-TEST(DelayPeakDetector, ZeroDistancePeaks) {
-  TickTimer tick_timer;
-  DelayPeakDetector detector(&tick_timer);
-  const int kPacketSizeMs = 30;
-  detector.SetPacketAudioLength(kPacketSizeMs);
-
-  const int kTargetBufferLevel = 2;  // Define peaks to be iat > 4.
-  const int kInterArrivalTime = 3 * kTargetBufferLevel;  // Will trigger a peak.
-  EXPECT_FALSE(detector.Update(kInterArrivalTime, kTargetBufferLevel));
-  EXPECT_FALSE(detector.Update(kInterArrivalTime, kTargetBufferLevel));
-  EXPECT_FALSE(detector.Update(kInterArrivalTime, kTargetBufferLevel));
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/neteq/dsp_helper.cc b/modules/audio_coding/neteq/dsp_helper.cc
deleted file mode 100644
index 3275665..0000000
--- a/modules/audio_coding/neteq/dsp_helper.cc
+++ /dev/null
@@ -1,368 +0,0 @@
-/*
- *  Copyright (c) 2012 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/neteq/dsp_helper.h"
-
-#include <assert.h>
-#include <string.h>  // Access to memset.
-
-#include <algorithm>  // Access to min, max.
-
-#include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
-
-namespace webrtc {
-
-// Table of constants used in method DspHelper::ParabolicFit().
-const int16_t DspHelper::kParabolaCoefficients[17][3] = {
-    { 120, 32, 64 },
-    { 140, 44, 75 },
-    { 150, 50, 80 },
-    { 160, 57, 85 },
-    { 180, 72, 96 },
-    { 200, 89, 107 },
-    { 210, 98, 112 },
-    { 220, 108, 117 },
-    { 240, 128, 128 },
-    { 260, 150, 139 },
-    { 270, 162, 144 },
-    { 280, 174, 149 },
-    { 300, 200, 160 },
-    { 320, 228, 171 },
-    { 330, 242, 176 },
-    { 340, 257, 181 },
-    { 360, 288, 192 } };
-
-// Filter coefficients used when downsampling from the indicated sample rates
-// (8, 16, 32, 48 kHz) to 4 kHz. Coefficients are in Q12. The corresponding Q0
-// values are provided in the comments before each array.
-
-// Q0 values: {0.3, 0.4, 0.3}.
-const int16_t DspHelper::kDownsample8kHzTbl[3] = { 1229, 1638, 1229 };
-
-// Q0 values: {0.15, 0.2, 0.3, 0.2, 0.15}.
-const int16_t DspHelper::kDownsample16kHzTbl[5] = { 614, 819, 1229, 819, 614 };
-
-// Q0 values: {0.1425, 0.1251, 0.1525, 0.1628, 0.1525, 0.1251, 0.1425}.
-const int16_t DspHelper::kDownsample32kHzTbl[7] = {
-    584, 512, 625, 667, 625, 512, 584 };
-
-// Q0 values: {0.2487, 0.0952, 0.1042, 0.1074, 0.1042, 0.0952, 0.2487}.
-const int16_t DspHelper::kDownsample48kHzTbl[7] = {
-    1019, 390, 427, 440, 427, 390, 1019 };
-
-int DspHelper::RampSignal(const int16_t* input,
-                          size_t length,
-                          int factor,
-                          int increment,
-                          int16_t* output) {
-  int factor_q20 = (factor << 6) + 32;
-  // TODO(hlundin): Add 32 to factor_q20 when converting back to Q14?
-  for (size_t i = 0; i < length; ++i) {
-    output[i] = (factor * input[i] + 8192) >> 14;
-    factor_q20 += increment;
-    factor_q20 = std::max(factor_q20, 0);  // Never go negative.
-    factor = std::min(factor_q20 >> 6, 16384);
-  }
-  return factor;
-}
-
-int DspHelper::RampSignal(int16_t* signal,
-                          size_t length,
-                          int factor,
-                          int increment) {
-  return RampSignal(signal, length, factor, increment, signal);
-}
-
-int DspHelper::RampSignal(AudioVector* signal,
-                          size_t start_index,
-                          size_t length,
-                          int factor,
-                          int increment) {
-  int factor_q20 = (factor << 6) + 32;
-  // TODO(hlundin): Add 32 to factor_q20 when converting back to Q14?
-  for (size_t i = start_index; i < start_index + length; ++i) {
-    (*signal)[i] = (factor * (*signal)[i] + 8192) >> 14;
-    factor_q20 += increment;
-    factor_q20 = std::max(factor_q20, 0);  // Never go negative.
-    factor = std::min(factor_q20 >> 6, 16384);
-  }
-  return factor;
-}
-
-int DspHelper::RampSignal(AudioMultiVector* signal,
-                          size_t start_index,
-                          size_t length,
-                          int factor,
-                          int increment) {
-  assert(start_index + length <= signal->Size());
-  if (start_index + length > signal->Size()) {
-    // Wrong parameters. Do nothing and return the scale factor unaltered.
-    return factor;
-  }
-  int end_factor = 0;
-  // Loop over the channels, starting at the same |factor| each time.
-  for (size_t channel = 0; channel < signal->Channels(); ++channel) {
-    end_factor =
-        RampSignal(&(*signal)[channel], start_index, length, factor, increment);
-  }
-  return end_factor;
-}
-
-void DspHelper::PeakDetection(int16_t* data, size_t data_length,
-                              size_t num_peaks, int fs_mult,
-                              size_t* peak_index, int16_t* peak_value) {
-  size_t min_index = 0;
-  size_t max_index = 0;
-
-  for (size_t i = 0; i <= num_peaks - 1; i++) {
-    if (num_peaks == 1) {
-      // Single peak.  The parabola fit assumes that an extra point is
-      // available; worst case it gets a zero on the high end of the signal.
-      // TODO(hlundin): This can potentially get much worse. It breaks the
-      // API contract, that the length of |data| is |data_length|.
-      data_length++;
-    }
-
-    peak_index[i] = WebRtcSpl_MaxIndexW16(data, data_length - 1);
-
-    if (i != num_peaks - 1) {
-      min_index = (peak_index[i] > 2) ? (peak_index[i] - 2) : 0;
-      max_index = std::min(data_length - 1, peak_index[i] + 2);
-    }
-
-    if ((peak_index[i] != 0) && (peak_index[i] != (data_length - 2))) {
-      ParabolicFit(&data[peak_index[i] - 1], fs_mult, &peak_index[i],
-                   &peak_value[i]);
-    } else {
-      if (peak_index[i] == data_length - 2) {
-        if (data[peak_index[i]] > data[peak_index[i] + 1]) {
-          ParabolicFit(&data[peak_index[i] - 1], fs_mult, &peak_index[i],
-                       &peak_value[i]);
-        } else if (data[peak_index[i]] <= data[peak_index[i] + 1]) {
-          // Linear approximation.
-          peak_value[i] = (data[peak_index[i]] + data[peak_index[i] + 1]) >> 1;
-          peak_index[i] = (peak_index[i] * 2 + 1) * fs_mult;
-        }
-      } else {
-        peak_value[i] = data[peak_index[i]];
-        peak_index[i] = peak_index[i] * 2 * fs_mult;
-      }
-    }
-
-    if (i != num_peaks - 1) {
-      memset(&data[min_index], 0,
-             sizeof(data[0]) * (max_index - min_index + 1));
-    }
-  }
-}
-
-void DspHelper::ParabolicFit(int16_t* signal_points, int fs_mult,
-                             size_t* peak_index, int16_t* peak_value) {
-  uint16_t fit_index[13];
-  if (fs_mult == 1) {
-    fit_index[0] = 0;
-    fit_index[1] = 8;
-    fit_index[2] = 16;
-  } else if (fs_mult == 2) {
-    fit_index[0] = 0;
-    fit_index[1] = 4;
-    fit_index[2] = 8;
-    fit_index[3] = 12;
-    fit_index[4] = 16;
-  } else if (fs_mult == 4) {
-    fit_index[0] = 0;
-    fit_index[1] = 2;
-    fit_index[2] = 4;
-    fit_index[3] = 6;
-    fit_index[4] = 8;
-    fit_index[5] = 10;
-    fit_index[6] = 12;
-    fit_index[7] = 14;
-    fit_index[8] = 16;
-  } else {
-    fit_index[0] = 0;
-    fit_index[1] = 1;
-    fit_index[2] = 3;
-    fit_index[3] = 4;
-    fit_index[4] = 5;
-    fit_index[5] = 7;
-    fit_index[6] = 8;
-    fit_index[7] = 9;
-    fit_index[8] = 11;
-    fit_index[9] = 12;
-    fit_index[10] = 13;
-    fit_index[11] = 15;
-    fit_index[12] = 16;
-  }
-
-  //  num = -3 * signal_points[0] + 4 * signal_points[1] - signal_points[2];
-  //  den =      signal_points[0] - 2 * signal_points[1] + signal_points[2];
-  int32_t num = (signal_points[0] * -3) + (signal_points[1] * 4)
-      - signal_points[2];
-  int32_t den = signal_points[0] + (signal_points[1] * -2) + signal_points[2];
-  int32_t temp = num * 120;
-  int flag = 1;
-  int16_t stp = kParabolaCoefficients[fit_index[fs_mult]][0]
-      - kParabolaCoefficients[fit_index[fs_mult - 1]][0];
-  int16_t strt = (kParabolaCoefficients[fit_index[fs_mult]][0]
-      + kParabolaCoefficients[fit_index[fs_mult - 1]][0]) / 2;
-  int16_t lmt;
-  if (temp < -den * strt) {
-    lmt = strt - stp;
-    while (flag) {
-      if ((flag == fs_mult) || (temp > -den * lmt)) {
-        *peak_value = (den * kParabolaCoefficients[fit_index[fs_mult - flag]][1]
-            + num * kParabolaCoefficients[fit_index[fs_mult - flag]][2]
-            + signal_points[0] * 256) / 256;
-        *peak_index = *peak_index * 2 * fs_mult - flag;
-        flag = 0;
-      } else {
-        flag++;
-        lmt -= stp;
-      }
-    }
-  } else if (temp > -den * (strt + stp)) {
-    lmt = strt + 2 * stp;
-    while (flag) {
-      if ((flag == fs_mult) || (temp < -den * lmt)) {
-        int32_t temp_term_1 =
-            den * kParabolaCoefficients[fit_index[fs_mult+flag]][1];
-        int32_t temp_term_2 =
-            num * kParabolaCoefficients[fit_index[fs_mult+flag]][2];
-        int32_t temp_term_3 = signal_points[0] * 256;
-        *peak_value = (temp_term_1 + temp_term_2 + temp_term_3) / 256;
-        *peak_index = *peak_index * 2 * fs_mult + flag;
-        flag = 0;
-      } else {
-        flag++;
-        lmt += stp;
-      }
-    }
-  } else {
-    *peak_value = signal_points[1];
-    *peak_index = *peak_index * 2 * fs_mult;
-  }
-}
-
-size_t DspHelper::MinDistortion(const int16_t* signal, size_t min_lag,
-                                size_t max_lag, size_t length,
-                                int32_t* distortion_value) {
-  size_t best_index = 0;
-  int32_t min_distortion = WEBRTC_SPL_WORD32_MAX;
-  for (size_t i = min_lag; i <= max_lag; i++) {
-    int32_t sum_diff = 0;
-    const int16_t* data1 = signal;
-    const int16_t* data2 = signal - i;
-    for (size_t j = 0; j < length; j++) {
-      sum_diff += WEBRTC_SPL_ABS_W32(data1[j] - data2[j]);
-    }
-    // Compare with previous minimum.
-    if (sum_diff < min_distortion) {
-      min_distortion = sum_diff;
-      best_index = i;
-    }
-  }
-  *distortion_value = min_distortion;
-  return best_index;
-}
-
-void DspHelper::CrossFade(const int16_t* input1, const int16_t* input2,
-                          size_t length, int16_t* mix_factor,
-                          int16_t factor_decrement, int16_t* output) {
-  int16_t factor = *mix_factor;
-  int16_t complement_factor = 16384 - factor;
-  for (size_t i = 0; i < length; i++) {
-    output[i] =
-        (factor * input1[i] + complement_factor * input2[i] + 8192) >> 14;
-    factor -= factor_decrement;
-    complement_factor += factor_decrement;
-  }
-  *mix_factor = factor;
-}
-
-void DspHelper::UnmuteSignal(const int16_t* input, size_t length,
-                             int16_t* factor, int increment,
-                             int16_t* output) {
-  uint16_t factor_16b = *factor;
-  int32_t factor_32b = (static_cast<int32_t>(factor_16b) << 6) + 32;
-  for (size_t i = 0; i < length; i++) {
-    output[i] = (factor_16b * input[i] + 8192) >> 14;
-    factor_32b = std::max(factor_32b + increment, 0);
-    factor_16b = std::min(16384, factor_32b >> 6);
-  }
-  *factor = factor_16b;
-}
-
-void DspHelper::MuteSignal(int16_t* signal, int mute_slope, size_t length) {
-  int32_t factor = (16384 << 6) + 32;
-  for (size_t i = 0; i < length; i++) {
-    signal[i] = ((factor >> 6) * signal[i] + 8192) >> 14;
-    factor -= mute_slope;
-  }
-}
-
-int DspHelper::DownsampleTo4kHz(const int16_t* input, size_t input_length,
-                                size_t output_length, int input_rate_hz,
-                                bool compensate_delay, int16_t* output) {
-  // Set filter parameters depending on input frequency.
-  // NOTE: The phase delay values are wrong compared to the true phase delay
-  // of the filters. However, the error is preserved (through the +1 term) for
-  // consistency.
-  const int16_t* filter_coefficients;  // Filter coefficients.
-  size_t filter_length;  // Number of coefficients.
-  size_t filter_delay;  // Phase delay in samples.
-  int16_t factor;  // Conversion rate (inFsHz / 8000).
-  switch (input_rate_hz) {
-    case 8000: {
-      filter_length = 3;
-      factor = 2;
-      filter_coefficients = kDownsample8kHzTbl;
-      filter_delay = 1 + 1;
-      break;
-    }
-    case 16000: {
-      filter_length = 5;
-      factor = 4;
-      filter_coefficients = kDownsample16kHzTbl;
-      filter_delay = 2 + 1;
-      break;
-    }
-    case 32000: {
-      filter_length = 7;
-      factor = 8;
-      filter_coefficients = kDownsample32kHzTbl;
-      filter_delay = 3 + 1;
-      break;
-    }
-    case 48000: {
-      filter_length = 7;
-      factor = 12;
-      filter_coefficients = kDownsample48kHzTbl;
-      filter_delay = 3 + 1;
-      break;
-    }
-    default: {
-      assert(false);
-      return -1;
-    }
-  }
-
-  if (!compensate_delay) {
-    // Disregard delay compensation.
-    filter_delay = 0;
-  }
-
-  // Returns -1 if input signal is too short; 0 otherwise.
-  return WebRtcSpl_DownsampleFast(
-      &input[filter_length - 1], input_length - filter_length + 1, output,
-      output_length, filter_coefficients, filter_length, factor, filter_delay);
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/neteq/dsp_helper.h b/modules/audio_coding/neteq/dsp_helper.h
deleted file mode 100644
index 599110a..0000000
--- a/modules/audio_coding/neteq/dsp_helper.h
+++ /dev/null
@@ -1,144 +0,0 @@
-/*
- *  Copyright (c) 2012 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_NETEQ_DSP_HELPER_H_
-#define WEBRTC_MODULES_AUDIO_CODING_NETEQ_DSP_HELPER_H_
-
-#include <string.h>  // Access to size_t.
-
-#include "webrtc/modules/audio_coding/neteq/audio_multi_vector.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-// This class contains various signal processing functions, all implemented as
-// static methods.
-class DspHelper {
- public:
-  // Filter coefficients used when downsampling from the indicated sample rates
-  // (8, 16, 32, 48 kHz) to 4 kHz. Coefficients are in Q12.
-  static const int16_t kDownsample8kHzTbl[3];
-  static const int16_t kDownsample16kHzTbl[5];
-  static const int16_t kDownsample32kHzTbl[7];
-  static const int16_t kDownsample48kHzTbl[7];
-
-  // Constants used to mute and unmute over 5 samples. The coefficients are
-  // in Q15.
-  static const int kMuteFactorStart8kHz = 27307;
-  static const int kMuteFactorIncrement8kHz = -5461;
-  static const int kUnmuteFactorStart8kHz = 5461;
-  static const int kUnmuteFactorIncrement8kHz = 5461;
-  static const int kMuteFactorStart16kHz = 29789;
-  static const int kMuteFactorIncrement16kHz = -2979;
-  static const int kUnmuteFactorStart16kHz = 2979;
-  static const int kUnmuteFactorIncrement16kHz = 2979;
-  static const int kMuteFactorStart32kHz = 31208;
-  static const int kMuteFactorIncrement32kHz = -1560;
-  static const int kUnmuteFactorStart32kHz = 1560;
-  static const int kUnmuteFactorIncrement32kHz = 1560;
-  static const int kMuteFactorStart48kHz = 31711;
-  static const int kMuteFactorIncrement48kHz = -1057;
-  static const int kUnmuteFactorStart48kHz = 1057;
-  static const int kUnmuteFactorIncrement48kHz = 1057;
-
-  // Multiplies the signal with a gradually changing factor.
-  // The first sample is multiplied with |factor| (in Q14). For each sample,
-  // |factor| is increased (additive) by the |increment| (in Q20), which can
-  // be negative. Returns the scale factor after the last increment.
-  static int RampSignal(const int16_t* input,
-                        size_t length,
-                        int factor,
-                        int increment,
-                        int16_t* output);
-
-  // Same as above, but with the samples of |signal| being modified in-place.
-  static int RampSignal(int16_t* signal,
-                        size_t length,
-                        int factor,
-                        int increment);
-
-  // Same as above, but processes |length| samples from |signal|, starting at
-  // |start_index|.
-  static int RampSignal(AudioVector* signal,
-                        size_t start_index,
-                        size_t length,
-                        int factor,
-                        int increment);
-
-  // Same as above, but for an AudioMultiVector.
-  static int RampSignal(AudioMultiVector* signal,
-                        size_t start_index,
-                        size_t length,
-                        int factor,
-                        int increment);
-
-  // Peak detection with parabolic fit. Looks for |num_peaks| maxima in |data|,
-  // having length |data_length| and sample rate multiplier |fs_mult|. The peak
-  // locations and values are written to the arrays |peak_index| and
-  // |peak_value|, respectively. Both arrays must hold at least |num_peaks|
-  // elements.
-  static void PeakDetection(int16_t* data, size_t data_length,
-                            size_t num_peaks, int fs_mult,
-                            size_t* peak_index, int16_t* peak_value);
-
-  // Estimates the height and location of a maximum. The three values in the
-  // array |signal_points| are used as basis for a parabolic fit, which is then
-  // used to find the maximum in an interpolated signal. The |signal_points| are
-  // assumed to be from a 4 kHz signal, while the maximum, written to
-  // |peak_index| and |peak_value| is given in the full sample rate, as
-  // indicated by the sample rate multiplier |fs_mult|.
-  static void ParabolicFit(int16_t* signal_points, int fs_mult,
-                           size_t* peak_index, int16_t* peak_value);
-
-  // Calculates the sum-abs-diff for |signal| when compared to a displaced
-  // version of itself. Returns the displacement lag that results in the minimum
-  // distortion. The resulting distortion is written to |distortion_value|.
-  // The values of |min_lag| and |max_lag| are boundaries for the search.
-  static size_t MinDistortion(const int16_t* signal, size_t min_lag,
-                           size_t max_lag, size_t length,
-                           int32_t* distortion_value);
-
-  // Mixes |length| samples from |input1| and |input2| together and writes the
-  // result to |output|. The gain for |input1| starts at |mix_factor| (Q14) and
-  // is decreased by |factor_decrement| (Q14) for each sample. The gain for
-  // |input2| is the complement 16384 - mix_factor.
-  static void CrossFade(const int16_t* input1, const int16_t* input2,
-                        size_t length, int16_t* mix_factor,
-                        int16_t factor_decrement, int16_t* output);
-
-  // Scales |input| with an increasing gain. Applies |factor| (Q14) to the first
-  // sample and increases the gain by |increment| (Q20) for each sample. The
-  // result is written to |output|. |length| samples are processed.
-  static void UnmuteSignal(const int16_t* input, size_t length, int16_t* factor,
-                           int increment, int16_t* output);
-
-  // Starts at unity gain and gradually fades out |signal|. For each sample,
-  // the gain is reduced by |mute_slope| (Q14). |length| samples are processed.
-  static void MuteSignal(int16_t* signal, int mute_slope, size_t length);
-
-  // Downsamples |input| from |sample_rate_hz| to 4 kHz sample rate. The input
-  // has |input_length| samples, and the method will write |output_length|
-  // samples to |output|. Compensates for the phase delay of the downsampling
-  // filters if |compensate_delay| is true. Returns -1 if the input is too short
-  // to produce |output_length| samples, otherwise 0.
-  static int DownsampleTo4kHz(const int16_t* input, size_t input_length,
-                              size_t output_length, int input_rate_hz,
-                              bool compensate_delay, int16_t* output);
-
- private:
-  // Table of constants used in method DspHelper::ParabolicFit().
-  static const int16_t kParabolaCoefficients[17][3];
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(DspHelper);
-};
-
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_AUDIO_CODING_NETEQ_DSP_HELPER_H_
diff --git a/modules/audio_coding/neteq/dsp_helper_unittest.cc b/modules/audio_coding/neteq/dsp_helper_unittest.cc
deleted file mode 100644
index fbdc047..0000000
--- a/modules/audio_coding/neteq/dsp_helper_unittest.cc
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- *  Copyright (c) 2012 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/neteq/dsp_helper.h"
-
-#include "webrtc/modules/audio_coding/neteq/audio_multi_vector.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-TEST(DspHelper, RampSignalArray) {
-  static const int kLen = 100;
-  int16_t input[kLen];
-  int16_t output[kLen];
-  // Fill input with 1000.
-  for (int i = 0; i < kLen; ++i) {
-    input[i] = 1000;
-  }
-  int start_factor = 0;
-  // Ramp from 0 to 1 (in Q14) over the array. Note that |increment| is in Q20,
-  // while the factor is in Q14, hence the shift by 6.
-  int increment = (16384 << 6) / kLen;
-
-  // Test first method.
-  int stop_factor = DspHelper::RampSignal(input, kLen, start_factor, increment,
-                                          output);
-  EXPECT_EQ(16383, stop_factor);  // Almost reach 1 in Q14.
-  for (int i = 0; i < kLen; ++i) {
-    EXPECT_EQ(1000 * i / kLen, output[i]);
-  }
-
-  // Test second method. (Note that this modifies |input|.)
-  stop_factor = DspHelper::RampSignal(input, kLen, start_factor, increment);
-  EXPECT_EQ(16383, stop_factor);  // Almost reach 1 in Q14.
-  for (int i = 0; i < kLen; ++i) {
-    EXPECT_EQ(1000 * i / kLen, input[i]);
-  }
-}
-
-TEST(DspHelper, RampSignalAudioMultiVector) {
-  static const int kLen = 100;
-  static const int kChannels = 5;
-  AudioMultiVector input(kChannels, kLen * 3);
-  // Fill input with 1000.
-  for (int i = 0; i < kLen * 3; ++i) {
-    for (int channel = 0; channel < kChannels; ++channel) {
-      input[channel][i] = 1000;
-    }
-  }
-  // We want to start ramping at |start_index| and keep ramping for |kLen|
-  // samples.
-  int start_index = kLen;
-  int start_factor = 0;
-  // Ramp from 0 to 1 (in Q14) in |kLen| samples. Note that |increment| is in
-  // Q20, while the factor is in Q14, hence the shift by 6.
-  int increment = (16384 << 6) / kLen;
-
-  int stop_factor = DspHelper::RampSignal(&input, start_index, kLen,
-                                          start_factor, increment);
-  EXPECT_EQ(16383, stop_factor);  // Almost reach 1 in Q14.
-  // Verify that the first |kLen| samples are left untouched.
-  int i;
-  for (i = 0; i < kLen; ++i) {
-    for (int channel = 0; channel < kChannels; ++channel) {
-      EXPECT_EQ(1000, input[channel][i]);
-    }
-  }
-  // Verify that the next block of |kLen| samples are ramped.
-  for (; i < 2 * kLen; ++i) {
-    for (int channel = 0; channel < kChannels; ++channel) {
-      EXPECT_EQ(1000 * (i - kLen) / kLen, input[channel][i]);
-    }
-  }
-  // Verify the last |kLen| samples are left untouched.
-  for (; i < 3 * kLen; ++i) {
-    for (int channel = 0; channel < kChannels; ++channel) {
-      EXPECT_EQ(1000, input[channel][i]);
-    }
-  }
-}
-}  // namespace webrtc
diff --git a/modules/audio_coding/neteq/dtmf_buffer.cc b/modules/audio_coding/neteq/dtmf_buffer.cc
deleted file mode 100644
index c5e5adf..0000000
--- a/modules/audio_coding/neteq/dtmf_buffer.cc
+++ /dev/null
@@ -1,248 +0,0 @@
-/*
- *  Copyright (c) 2012 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/neteq/dtmf_buffer.h"
-
-#include <assert.h>
-#include <algorithm>  // max
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-
-// Modify the code to obtain backwards bit-exactness. Once bit-exactness is no
-// longer required, this #define should be removed (and the code that it
-// enables).
-#define LEGACY_BITEXACT
-
-namespace webrtc {
-
-DtmfBuffer::DtmfBuffer(int fs_hz) {
-  SetSampleRate(fs_hz);
-}
-
-DtmfBuffer::~DtmfBuffer() = default;
-
-void DtmfBuffer::Flush() {
-  buffer_.clear();
-}
-
-// The ParseEvent method parses 4 bytes from |payload| according to this format
-// from RFC 4733:
-//
-//  0                   1                   2                   3
-//  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
-// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-// |     event     |E|R| volume    |          duration             |
-// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//
-// Legend (adapted from RFC 4733)
-// - event:    The event field is a number between 0 and 255 identifying a
-//             specific telephony event. The buffer will not accept any event
-//             numbers larger than 15.
-// - E:        If set to a value of one, the "end" bit indicates that this
-//             packet contains the end of the event.  For long-lasting events
-//             that have to be split into segments, only the final packet for
-//             the final segment will have the E bit set.
-// - R:        Reserved.
-// - volume:   For DTMF digits and other events representable as tones, this
-//             field describes the power level of the tone, expressed in dBm0
-//             after dropping the sign.  Power levels range from 0 to -63 dBm0.
-//             Thus, larger values denote lower volume. The buffer discards
-//             values larger than 36 (i.e., lower than -36 dBm0).
-// - duration: The duration field indicates the duration of the event or segment
-//             being reported, in timestamp units, expressed as an unsigned
-//             integer in network byte order.  For a non-zero value, the event
-//             or segment began at the instant identified by the RTP timestamp
-//             and has so far lasted as long as indicated by this parameter.
-//             The event may or may not have ended.  If the event duration
-//             exceeds the maximum representable by the duration field, the
-//             event is split into several contiguous segments. The buffer will
-//             discard zero-duration events.
-//
-int DtmfBuffer::ParseEvent(uint32_t rtp_timestamp,
-                           const uint8_t* payload,
-                           size_t payload_length_bytes,
-                           DtmfEvent* event) {
-  RTC_CHECK(payload);
-  RTC_CHECK(event);
-  if (payload_length_bytes < 4) {
-    LOG(LS_WARNING) << "ParseEvent payload too short";
-    return kPayloadTooShort;
-  }
-
-  event->event_no = payload[0];
-  event->end_bit = ((payload[1] & 0x80) != 0);
-  event->volume = (payload[1] & 0x3F);
-  event->duration = payload[2] << 8 | payload[3];
-  event->timestamp = rtp_timestamp;
-  return kOK;
-}
-
-// Inserts a DTMF event into the buffer. The event should be parsed from the
-// bit stream using the ParseEvent method above before inserting it in the
-// buffer.
-// DTMF events can be quite long, and in most cases the duration of the event
-// is not known when the first packet describing it is sent. To deal with that,
-// the RFC 4733 specifies that multiple packets are sent for one and the same
-// event as it is being created (typically, as the user is pressing the key).
-// These packets will all share the same start timestamp and event number,
-// while the duration will be the cumulative duration from the start. When
-// inserting a new event, the InsertEvent method tries to find a matching event
-// already in the buffer. If so, the new event is simply merged with the
-// existing one.
-int DtmfBuffer::InsertEvent(const DtmfEvent& event) {
-  if (event.event_no < 0 || event.event_no > 15 ||
-      event.volume < 0 || event.volume > 63 ||
-      event.duration <= 0 || event.duration > 65535) {
-    LOG(LS_WARNING) << "InsertEvent invalid parameters";
-    return kInvalidEventParameters;
-  }
-  DtmfList::iterator it = buffer_.begin();
-  while (it != buffer_.end()) {
-    if (MergeEvents(it, event)) {
-      // A matching event was found and the new event was merged.
-      return kOK;
-    }
-    ++it;
-  }
-  buffer_.push_back(event);
-  // Sort the buffer using CompareEvents to rank the events.
-  buffer_.sort(CompareEvents);
-  return kOK;
-}
-
-bool DtmfBuffer::GetEvent(uint32_t current_timestamp, DtmfEvent* event) {
-  DtmfList::iterator it = buffer_.begin();
-  while (it != buffer_.end()) {
-    // |event_end| is an estimate of where the current event ends. If the end
-    // bit is set, we know that the event ends at |timestamp| + |duration|.
-    uint32_t event_end = it->timestamp + it->duration;
-#ifdef LEGACY_BITEXACT
-    bool next_available = false;
-#endif
-    if (!it->end_bit) {
-      // If the end bit is not set, we allow extrapolation of the event for
-      // some time.
-      event_end += max_extrapolation_samples_;
-      DtmfList::iterator next = it;
-      ++next;
-      if (next != buffer_.end()) {
-        // If there is a next event in the buffer, we will not extrapolate over
-        // the start of that new event.
-        event_end = std::min(event_end, next->timestamp);
-#ifdef LEGACY_BITEXACT
-        next_available = true;
-#endif
-      }
-    }
-    if (current_timestamp >= it->timestamp
-        && current_timestamp <= event_end) {  // TODO(hlundin): Change to <.
-      // Found a matching event.
-      if (event) {
-        event->event_no = it->event_no;
-        event->end_bit = it->end_bit;
-        event->volume = it->volume;
-        event->duration = it->duration;
-        event->timestamp = it->timestamp;
-      }
-#ifdef LEGACY_BITEXACT
-      if (it->end_bit &&
-          current_timestamp + frame_len_samples_ >= event_end) {
-        // We are done playing this. Erase the event.
-        buffer_.erase(it);
-      }
-#endif
-      return true;
-    } else if (current_timestamp > event_end) {  // TODO(hlundin): Change to >=.
-      // Erase old event. Operation returns a valid pointer to the next element
-      // in the list.
-#ifdef LEGACY_BITEXACT
-      if (!next_available) {
-        if (event) {
-          event->event_no = it->event_no;
-          event->end_bit = it->end_bit;
-          event->volume = it->volume;
-          event->duration = it->duration;
-          event->timestamp = it->timestamp;
-        }
-        it = buffer_.erase(it);
-        return true;
-      } else {
-        it = buffer_.erase(it);
-      }
-#else
-      it = buffer_.erase(it);
-#endif
-    } else {
-      ++it;
-    }
-  }
-  return false;
-}
-
-size_t DtmfBuffer::Length() const {
-  return buffer_.size();
-}
-
-bool DtmfBuffer::Empty() const {
-  return buffer_.empty();
-}
-
-int DtmfBuffer::SetSampleRate(int fs_hz) {
-  if (fs_hz != 8000 &&
-      fs_hz != 16000 &&
-      fs_hz != 32000 &&
-      fs_hz != 48000) {
-    return kInvalidSampleRate;
-  }
-  max_extrapolation_samples_ = 7 * fs_hz / 100;
-  frame_len_samples_ = fs_hz / 100;
-  return kOK;
-}
-
-// The method returns true if the two events are considered to be the same.
-// The are defined as equal if they share the same timestamp and event number.
-// The special case with long-lasting events that have to be split into segments
-// is not handled in this method. These will be treated as separate events in
-// the buffer.
-bool DtmfBuffer::SameEvent(const DtmfEvent& a, const DtmfEvent& b) {
-  return (a.event_no == b.event_no) && (a.timestamp == b.timestamp);
-}
-
-bool DtmfBuffer::MergeEvents(DtmfList::iterator it, const DtmfEvent& event) {
-  if (SameEvent(*it, event)) {
-    if (!it->end_bit) {
-      // Do not extend the duration of an event for which the end bit was
-      // already received.
-      it->duration = std::max(event.duration, it->duration);
-    }
-    if (event.end_bit) {
-      it->end_bit = true;
-    }
-    return true;
-  } else {
-    return false;
-  }
-}
-
-// Returns true if |a| goes before |b| in the sorting order ("|a| < |b|").
-// The events are ranked using their start timestamp (taking wrap-around into
-// account). In the unlikely situation that two events share the same start
-// timestamp, the event number is used to rank the two. Note that packets
-// that belong to the same events, and therefore sharing the same start
-// timestamp, have already been merged before the sort method is called.
-bool DtmfBuffer::CompareEvents(const DtmfEvent& a, const DtmfEvent& b) {
-  if (a.timestamp == b.timestamp) {
-    return a.event_no < b.event_no;
-  }
-  // Take wrap-around into account.
-  return (static_cast<uint32_t>(b.timestamp - a.timestamp) < 0xFFFFFFFF / 2);
-}
-}  // namespace webrtc
diff --git a/modules/audio_coding/neteq/dtmf_buffer.h b/modules/audio_coding/neteq/dtmf_buffer.h
deleted file mode 100644
index 068ad64..0000000
--- a/modules/audio_coding/neteq/dtmf_buffer.h
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- *  Copyright (c) 2012 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_NETEQ_DTMF_BUFFER_H_
-#define WEBRTC_MODULES_AUDIO_CODING_NETEQ_DTMF_BUFFER_H_
-
-#include <list>
-#include <string>  // size_t
-
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-struct DtmfEvent {
-  uint32_t timestamp;
-  int event_no;
-  int volume;
-  int duration;
-  bool end_bit;
-
-  // Constructors
-  DtmfEvent()
-      : timestamp(0),
-        event_no(0),
-        volume(0),
-        duration(0),
-        end_bit(false) {
-  }
-  DtmfEvent(uint32_t ts, int ev, int vol, int dur, bool end)
-      : timestamp(ts),
-        event_no(ev),
-        volume(vol),
-        duration(dur),
-        end_bit(end) {
-  }
-};
-
-// This is the buffer holding DTMF events while waiting for them to be played.
-class DtmfBuffer {
- public:
-  enum BufferReturnCodes {
-    kOK = 0,
-    kInvalidPointer,
-    kPayloadTooShort,
-    kInvalidEventParameters,
-    kInvalidSampleRate
-  };
-
-  // Set up the buffer for use at sample rate |fs_hz|.
-  explicit DtmfBuffer(int fs_hz);
-
-  virtual ~DtmfBuffer();
-
-  // Flushes the buffer.
-  virtual void Flush();
-
-  // Static method to parse 4 bytes from |payload| as a DTMF event (RFC 4733)
-  // and write the parsed information into the struct |event|. Input variable
-  // |rtp_timestamp| is simply copied into the struct.
-  static int ParseEvent(uint32_t rtp_timestamp,
-                        const uint8_t* payload,
-                        size_t payload_length_bytes,
-                        DtmfEvent* event);
-
-  // Inserts |event| into the buffer. The method looks for a matching event and
-  // merges the two if a match is found.
-  virtual int InsertEvent(const DtmfEvent& event);
-
-  // Checks if a DTMF event should be played at time |current_timestamp|. If so,
-  // the method returns true; otherwise false. The parameters of the event to
-  // play will be written to |event|.
-  virtual bool GetEvent(uint32_t current_timestamp, DtmfEvent* event);
-
-  // Number of events in the buffer.
-  virtual size_t Length() const;
-
-  virtual bool Empty() const;
-
-  // Set a new sample rate.
-  virtual int SetSampleRate(int fs_hz);
-
- private:
-  typedef std::list<DtmfEvent> DtmfList;
-
-  int max_extrapolation_samples_;
-  int frame_len_samples_;  // TODO(hlundin): Remove this later.
-
-  // Compares two events and returns true if they are the same.
-  static bool SameEvent(const DtmfEvent& a, const DtmfEvent& b);
-
-  // Merges |event| to the event pointed out by |it|. The method checks that
-  // the two events are the same (using the SameEvent method), and merges them
-  // if that was the case, returning true. If the events are not the same, false
-  // is returned.
-  bool MergeEvents(DtmfList::iterator it, const DtmfEvent& event);
-
-  // Method used by the sort algorithm to rank events in the buffer.
-  static bool CompareEvents(const DtmfEvent& a, const DtmfEvent& b);
-
-  DtmfList buffer_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(DtmfBuffer);
-};
-
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_AUDIO_CODING_NETEQ_DTMF_BUFFER_H_
diff --git a/modules/audio_coding/neteq/dtmf_buffer_unittest.cc b/modules/audio_coding/neteq/dtmf_buffer_unittest.cc
deleted file mode 100644
index d906d1c..0000000
--- a/modules/audio_coding/neteq/dtmf_buffer_unittest.cc
+++ /dev/null
@@ -1,301 +0,0 @@
-/*
- *  Copyright (c) 2012 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/neteq/dtmf_buffer.h"
-
-#ifdef WIN32
-#include <winsock2.h>  // ntohl()
-#else
-#include <arpa/inet.h>  // ntohl()
-#endif
-
-#include <iostream>
-
-#include "webrtc/test/gtest.h"
-
-// Modify the tests so that they pass with the modifications done to DtmfBuffer
-// for backwards bit-exactness. Once bit-exactness is no longer required, this
-// #define should be removed (and the code that it enables).
-#define LEGACY_BITEXACT
-
-namespace webrtc {
-
-static int sample_rate_hz = 8000;
-
-static uint32_t MakeDtmfPayload(int event, bool end, int volume, int duration) {
-  uint32_t payload = 0;
-//  0                   1                   2                   3
-//  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
-// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-// |     event     |E|R| volume    |          duration             |
-// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-  payload |= (event & 0x00FF) << 24;
-  payload |= (end ? 0x00800000 : 0x00000000);
-  payload |= (volume & 0x003F) << 16;
-  payload |= (duration & 0xFFFF);
-  payload = ntohl(payload);
-  return payload;
-}
-
-static bool EqualEvents(const DtmfEvent& a,
-                        const DtmfEvent& b) {
-  return (a.duration == b.duration
-      && a.end_bit == b.end_bit
-      && a.event_no == b.event_no
-      && a.timestamp == b.timestamp
-      && a.volume == b.volume);
-}
-
-TEST(DtmfBuffer, CreateAndDestroy) {
-  DtmfBuffer* buffer = new DtmfBuffer(sample_rate_hz);
-  delete buffer;
-}
-
-// Test the event parser.
-TEST(DtmfBuffer, ParseEvent) {
-  int event_no = 7;
-  bool end_bit = true;
-  int volume = 17;
-  int duration = 4711;
-  uint32_t timestamp = 0x12345678;
-  uint32_t payload = MakeDtmfPayload(event_no, end_bit, volume, duration);
-  uint8_t* payload_ptr = reinterpret_cast<uint8_t*>(&payload);
-  DtmfEvent event;
-  EXPECT_EQ(DtmfBuffer::kOK,
-            DtmfBuffer::ParseEvent(timestamp, payload_ptr, sizeof(payload),
-                                   &event));
-  EXPECT_EQ(duration, event.duration);
-  EXPECT_EQ(end_bit, event.end_bit);
-  EXPECT_EQ(event_no, event.event_no);
-  EXPECT_EQ(timestamp, event.timestamp);
-  EXPECT_EQ(volume, event.volume);
-
-  EXPECT_EQ(DtmfBuffer::kPayloadTooShort,
-            DtmfBuffer::ParseEvent(timestamp, payload_ptr, 3, &event));
-}
-
-TEST(DtmfBuffer, SimpleInsertAndGet) {
-  int event_no = 7;
-  bool end_bit = true;
-  int volume = 17;
-  int duration = 4711;
-  uint32_t timestamp = 0x12345678;
-  DtmfEvent event(timestamp, event_no, volume, duration, end_bit);
-  DtmfBuffer buffer(sample_rate_hz);
-  EXPECT_EQ(DtmfBuffer::kOK, buffer.InsertEvent(event));
-  EXPECT_EQ(1u, buffer.Length());
-  EXPECT_FALSE(buffer.Empty());
-  DtmfEvent out_event;
-  // Too early to get event.
-  EXPECT_FALSE(buffer.GetEvent(timestamp - 10, &out_event));
-  EXPECT_EQ(1u, buffer.Length());
-  EXPECT_FALSE(buffer.Empty());
-  // Get the event at its starting timestamp.
-  EXPECT_TRUE(buffer.GetEvent(timestamp, &out_event));
-  EXPECT_TRUE(EqualEvents(event, out_event));
-  EXPECT_EQ(1u, buffer.Length());
-  EXPECT_FALSE(buffer.Empty());
-  // Get the event some time into the event.
-  EXPECT_TRUE(buffer.GetEvent(timestamp + duration / 2, &out_event));
-  EXPECT_TRUE(EqualEvents(event, out_event));
-  EXPECT_EQ(1u, buffer.Length());
-  EXPECT_FALSE(buffer.Empty());
-  // Give a "current" timestamp after the event has ended.
-#ifdef LEGACY_BITEXACT
-  EXPECT_TRUE(buffer.GetEvent(timestamp + duration + 10, &out_event));
-#endif
-  EXPECT_FALSE(buffer.GetEvent(timestamp + duration + 10, &out_event));
-  EXPECT_EQ(0u, buffer.Length());
-  EXPECT_TRUE(buffer.Empty());
-}
-
-TEST(DtmfBuffer, MergingPackets) {
-  int event_no = 0;
-  bool end_bit = false;
-  int volume = 17;
-  int duration = 80;
-  uint32_t timestamp = 0x12345678;
-  DtmfEvent event(timestamp, event_no, volume, duration, end_bit);
-  DtmfBuffer buffer(sample_rate_hz);
-  EXPECT_EQ(DtmfBuffer::kOK, buffer.InsertEvent(event));
-
-  event.duration += 80;
-  EXPECT_EQ(DtmfBuffer::kOK, buffer.InsertEvent(event));
-
-  event.duration += 80;
-  event.end_bit = true;
-  EXPECT_EQ(DtmfBuffer::kOK, buffer.InsertEvent(event));
-
-  EXPECT_EQ(1u, buffer.Length());
-
-  DtmfEvent out_event;
-  EXPECT_TRUE(buffer.GetEvent(timestamp, &out_event));
-  EXPECT_TRUE(EqualEvents(event, out_event));
-}
-
-// This test case inserts one shorter event completely overlapped by one longer
-// event. The expected outcome is that only the longer event is played.
-TEST(DtmfBuffer, OverlappingEvents) {
-  int event_no = 0;
-  bool end_bit = true;
-  int volume = 1;
-  int duration = 80;
-  uint32_t timestamp = 0x12345678 + 80;
-  DtmfEvent short_event(timestamp, event_no, volume, duration, end_bit);
-  DtmfBuffer buffer(sample_rate_hz);
-  EXPECT_EQ(DtmfBuffer::kOK, buffer.InsertEvent(short_event));
-
-  event_no = 10;
-  end_bit = false;
-  timestamp = 0x12345678;
-  DtmfEvent long_event(timestamp, event_no, volume, duration, end_bit);
-  EXPECT_EQ(DtmfBuffer::kOK, buffer.InsertEvent(long_event));
-
-  long_event.duration += 80;
-  EXPECT_EQ(DtmfBuffer::kOK, buffer.InsertEvent(long_event));
-
-  long_event.duration += 80;
-  long_event.end_bit = true;
-  EXPECT_EQ(DtmfBuffer::kOK, buffer.InsertEvent(long_event));
-
-  EXPECT_EQ(2u, buffer.Length());
-
-  DtmfEvent out_event;
-  // Expect to get the long event.
-  EXPECT_TRUE(buffer.GetEvent(timestamp, &out_event));
-  EXPECT_TRUE(EqualEvents(long_event, out_event));
-  // Expect no more events.
-#ifdef LEGACY_BITEXACT
-  EXPECT_TRUE(buffer.GetEvent(timestamp + long_event.duration + 10,
-                              &out_event));
-  EXPECT_TRUE(EqualEvents(long_event, out_event));
-  EXPECT_TRUE(buffer.GetEvent(timestamp + long_event.duration + 10,
-                              &out_event));
-  EXPECT_TRUE(EqualEvents(short_event, out_event));
-#else
-  EXPECT_FALSE(buffer.GetEvent(timestamp + long_event.duration + 10,
-                               &out_event));
-#endif
-  EXPECT_TRUE(buffer.Empty());
-}
-
-TEST(DtmfBuffer, ExtrapolationTime) {
-  int event_no = 0;
-  bool end_bit = false;
-  int volume = 1;
-  int duration = 80;
-  uint32_t timestamp = 0x12345678;
-  DtmfEvent event1(timestamp, event_no, volume, duration, end_bit);
-  DtmfBuffer buffer(sample_rate_hz);
-  EXPECT_EQ(DtmfBuffer::kOK, buffer.InsertEvent(event1));
-  EXPECT_EQ(1u, buffer.Length());
-
-  DtmfEvent out_event;
-  // Get the event at the start.
-  EXPECT_TRUE(buffer.GetEvent(timestamp, &out_event));
-  EXPECT_TRUE(EqualEvents(event1, out_event));
-  // Also get the event 100 samples after the end of the event (since we're
-  // missing the end bit).
-  uint32_t timestamp_now = timestamp + duration + 100;
-  EXPECT_TRUE(buffer.GetEvent(timestamp_now, &out_event));
-  EXPECT_TRUE(EqualEvents(event1, out_event));
-  // Insert another event starting back-to-back with the previous event.
-  timestamp += duration;
-  event_no = 1;
-  DtmfEvent event2(timestamp, event_no, volume, duration, end_bit);
-  EXPECT_EQ(DtmfBuffer::kOK, buffer.InsertEvent(event2));
-  EXPECT_EQ(2u, buffer.Length());
-  // Now we expect to get the new event when supplying |timestamp_now|.
-  EXPECT_TRUE(buffer.GetEvent(timestamp_now, &out_event));
-  EXPECT_TRUE(EqualEvents(event2, out_event));
-  // Expect the the first event to be erased now.
-  EXPECT_EQ(1u, buffer.Length());
-  // Move |timestamp_now| to more than 560 samples after the end of the second
-  // event. Expect that event to be erased.
-  timestamp_now = timestamp + duration + 600;
-#ifdef LEGACY_BITEXACT
-  EXPECT_TRUE(buffer.GetEvent(timestamp_now, &out_event));
-#endif
-  EXPECT_FALSE(buffer.GetEvent(timestamp_now, &out_event));
-  EXPECT_TRUE(buffer.Empty());
-}
-
-TEST(DtmfBuffer, TimestampWraparound) {
-  int event_no = 0;
-  bool end_bit = true;
-  int volume = 1;
-  int duration = 80;
-  uint32_t timestamp1 = 0xFFFFFFFF - duration;
-  DtmfEvent event1(timestamp1, event_no, volume, duration, end_bit);
-  uint32_t timestamp2 = 0;
-  DtmfEvent event2(timestamp2, event_no, volume, duration, end_bit);
-  DtmfBuffer buffer(sample_rate_hz);
-  EXPECT_EQ(DtmfBuffer::kOK, buffer.InsertEvent(event1));
-  EXPECT_EQ(DtmfBuffer::kOK, buffer.InsertEvent(event2));
-  EXPECT_EQ(2u, buffer.Length());
-  DtmfEvent out_event;
-  EXPECT_TRUE(buffer.GetEvent(timestamp1, &out_event));
-  EXPECT_TRUE(EqualEvents(event1, out_event));
-#ifdef LEGACY_BITEXACT
-  EXPECT_EQ(1u, buffer.Length());
-#else
-  EXPECT_EQ(2u, buffer.Length());
-#endif
-
-  buffer.Flush();
-  // Reverse the insert order. Expect same results.
-  EXPECT_EQ(DtmfBuffer::kOK, buffer.InsertEvent(event2));
-  EXPECT_EQ(DtmfBuffer::kOK, buffer.InsertEvent(event1));
-  EXPECT_EQ(2u, buffer.Length());
-  EXPECT_TRUE(buffer.GetEvent(timestamp1, &out_event));
-  EXPECT_TRUE(EqualEvents(event1, out_event));
-#ifdef LEGACY_BITEXACT
-  EXPECT_EQ(1u, buffer.Length());
-#else
-  EXPECT_EQ(2u, buffer.Length());
-#endif
-}
-
-TEST(DtmfBuffer, InvalidEvents) {
-  int event_no = 0;
-  bool end_bit = true;
-  int volume = 1;
-  int duration = 80;
-  uint32_t timestamp = 0x12345678;
-  DtmfEvent event(timestamp, event_no, volume, duration, end_bit);
-  DtmfBuffer buffer(sample_rate_hz);
-
-  // Invalid event number.
-  event.event_no = -1;
-  EXPECT_EQ(DtmfBuffer::kInvalidEventParameters, buffer.InsertEvent(event));
-  event.event_no = 16;
-  EXPECT_EQ(DtmfBuffer::kInvalidEventParameters, buffer.InsertEvent(event));
-  event.event_no = 0;  // Valid value;
-
-  // Invalid volume.
-  event.volume = -1;
-  EXPECT_EQ(DtmfBuffer::kInvalidEventParameters, buffer.InsertEvent(event));
-  event.volume = 64;
-  EXPECT_EQ(DtmfBuffer::kInvalidEventParameters, buffer.InsertEvent(event));
-  event.volume = 0;  // Valid value;
-
-  // Invalid duration.
-  event.duration = -1;
-  EXPECT_EQ(DtmfBuffer::kInvalidEventParameters, buffer.InsertEvent(event));
-  event.duration = 0;
-  EXPECT_EQ(DtmfBuffer::kInvalidEventParameters, buffer.InsertEvent(event));
-  event.duration = 0xFFFF + 1;
-  EXPECT_EQ(DtmfBuffer::kInvalidEventParameters, buffer.InsertEvent(event));
-  event.duration = 1;  // Valid value;
-
-  // Finish with a valid event, just to verify that all is ok.
-  EXPECT_EQ(DtmfBuffer::kOK, buffer.InsertEvent(event));
-}
-}  // namespace webrtc
diff --git a/modules/audio_coding/neteq/dtmf_tone_generator.cc b/modules/audio_coding/neteq/dtmf_tone_generator.cc
deleted file mode 100644
index 416835b..0000000
--- a/modules/audio_coding/neteq/dtmf_tone_generator.cc
+++ /dev/null
@@ -1,218 +0,0 @@
-/*
- *  Copyright (c) 2012 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.
- */
-
-// This class provides a generator for DTMF tones. The tone generation is based
-// on a sinusoid recursion. Each sinusoid is generated using a recursion
-// formula; x[n] = a * x[n-1] - x[n-2], where the coefficient
-// a = 2*cos(2*pi*f/fs). The recursion is started with x[-1] = 0 and
-// x[-2] = sin(2*pi*f/fs). (Note that with this initialization, the resulting
-// sinusoid gets a "negative" rotation; x[n] = sin(-2*pi*f/fs * n + phi), but
-// kept this way due to historical reasons.)
-// TODO(hlundin): Change to positive rotation?
-//
-// Each key on the telephone keypad corresponds to an "event", 0-15. Each event
-// is mapped to a tone pair, with a low and a high frequency. There are four
-// low and four high frequencies, each corresponding to a row and column,
-// respectively, on the keypad as illustrated below.
-//
-//          1209 Hz  1336 Hz  1477 Hz  1633 Hz
-// 697 Hz      1        2        3       12
-// 770 Hz      4        5        6       13
-// 852 Hz      7        8        9       14
-// 941 Hz     10        0       11       15
-
-#include "webrtc/modules/audio_coding/neteq/dtmf_tone_generator.h"
-
-#include "webrtc/rtc_base/arraysize.h"
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-
-// The filter coefficient a = 2*cos(2*pi*f/fs) for the low frequency tone, for
-// sample rates fs = {8000, 16000, 32000, 48000} Hz, and events 0 through 15.
-// Values are in Q14.
-const int DtmfToneGenerator::kCoeff1[4][16] = {
-    { 24219, 27980, 27980, 27980, 26956, 26956, 26956, 25701, 25701, 25701,
-      24219, 24219, 27980, 26956, 25701, 24219 },
-    { 30556, 31548, 31548, 31548, 31281, 31281, 31281, 30951, 30951, 30951,
-      30556, 30556, 31548, 31281, 30951, 30556 },
-    { 32210, 32462, 32462, 32462, 32394, 32394, 32394, 32311, 32311, 32311,
-      32210, 32210, 32462, 32394, 32311, 32210 },
-    { 32520, 32632, 32632, 32632, 32602, 32602, 32602, 32564, 32564, 32564,
-      32520, 32520, 32632, 32602, 32564, 32520 } };
-
-// The filter coefficient a = 2*cos(2*pi*f/fs) for the high frequency tone, for
-// sample rates fs = {8000, 16000, 32000, 48000} Hz, and events 0 through 15.
-// Values are in Q14.
-const int DtmfToneGenerator::kCoeff2[4][16] = {
-    { 16325, 19073, 16325, 13085, 19073, 16325, 13085, 19073, 16325, 13085,
-      19073, 13085, 9315, 9315, 9315, 9315},
-    { 28361, 29144, 28361, 27409, 29144, 28361, 27409, 29144, 28361, 27409,
-      29144, 27409, 26258, 26258, 26258, 26258},
-    { 31647, 31849, 31647, 31400, 31849, 31647, 31400, 31849, 31647, 31400,
-      31849, 31400, 31098, 31098, 31098, 31098},
-    { 32268, 32359, 32268, 32157, 32359, 32268, 32157, 32359, 32268, 32157,
-      32359, 32157, 32022, 32022, 32022, 32022} };
-
-// The initialization value x[-2] = sin(2*pi*f/fs) for the low frequency tone,
-// for sample rates fs = {8000, 16000, 32000, 48000} Hz, and events 0-15.
-// Values are in Q14.
-const int DtmfToneGenerator::kInitValue1[4][16] = {
-    { 11036, 8528, 8528, 8528, 9315, 9315, 9315, 10163, 10163, 10163, 11036,
-      11036, 8528, 9315, 10163, 11036},
-    { 5918, 4429, 4429, 4429, 4879, 4879, 4879, 5380, 5380, 5380, 5918, 5918,
-      4429, 4879, 5380, 5918},
-    { 3010, 2235, 2235, 2235, 2468, 2468, 2468, 2728, 2728, 2728, 3010, 3010,
-      2235, 2468, 2728, 3010},
-    { 2013, 1493, 1493, 1493, 1649, 1649, 1649, 1823, 1823, 1823, 2013, 2013,
-      1493, 1649, 1823, 2013 } };
-
-// The initialization value x[-2] = sin(2*pi*f/fs) for the high frequency tone,
-// for sample rates fs = {8000, 16000, 32000, 48000} Hz, and events 0-15.
-// Values are in Q14.
-const int DtmfToneGenerator::kInitValue2[4][16] = {
-    { 14206, 13323, 14206, 15021, 13323, 14206, 15021, 13323, 14206, 15021,
-      13323, 15021, 15708, 15708, 15708, 15708},
-    { 8207, 7490, 8207, 8979, 7490, 8207, 8979, 7490, 8207, 8979, 7490, 8979,
-      9801, 9801, 9801, 9801},
-    { 4249, 3853, 4249, 4685, 3853, 4249, 4685, 3853, 4249, 4685, 3853, 4685,
-      5164, 5164, 5164, 5164},
-    { 2851, 2582, 2851, 3148, 2582, 2851, 3148, 2582, 2851, 3148, 2582, 3148,
-      3476, 3476, 3476, 3476} };
-
-// Amplitude multipliers for volume values 0 through 63, corresponding to
-// 0 dBm0 through -63 dBm0. Values are in Q14.
-// for a in range(0, 64):
-//   print round(16141.0 * 10**(-float(a)/20))
-const int DtmfToneGenerator::kAmplitude[64] = {
-    16141, 14386, 12821, 11427, 10184, 9077, 8090, 7210, 6426, 5727, 5104, 4549,
-    4054, 3614, 3221, 2870, 2558, 2280, 2032, 1811, 1614, 1439, 1282, 1143,
-    1018, 908, 809, 721, 643, 573, 510, 455, 405, 361, 322, 287, 256, 228, 203,
-    181, 161, 144, 128, 114, 102, 91, 81, 72, 64, 57, 51, 45, 41, 36, 32, 29,
-    26, 23, 20, 18, 16, 14, 13, 11 };
-
-// Constructor.
-DtmfToneGenerator::DtmfToneGenerator()
-    : initialized_(false),
-      coeff1_(0),
-      coeff2_(0),
-      amplitude_(0) {
-}
-
-// Initialize the DTMF generator with sample rate fs Hz (8000, 16000, 32000,
-// 48000), event (0-15) and attenuation (0-36 dB).
-// Returns 0 on success, otherwise an error code.
-int DtmfToneGenerator::Init(int fs, int event, int attenuation) {
-  initialized_ = false;
-  size_t fs_index;
-  if (fs == 8000) {
-    fs_index = 0;
-  } else if (fs == 16000) {
-    fs_index = 1;
-  } else if (fs == 32000) {
-    fs_index = 2;
-  } else if (fs == 48000) {
-    fs_index = 3;
-  } else {
-    RTC_NOTREACHED();
-    fs_index = 1;  // Default to 8000 Hz.
-  }
-
-  if (event < 0 || event > 15) {
-    return kParameterError;  // Invalid event number.
-  }
-
-  if (attenuation < 0 || attenuation > 63) {
-    return kParameterError;  // Invalid attenuation.
-  }
-
-  // Look up oscillator coefficient for low and high frequencies.
-  RTC_DCHECK_LE(0, fs_index);
-  RTC_DCHECK_GT(arraysize(kCoeff1), fs_index);
-  RTC_DCHECK_GT(arraysize(kCoeff2), fs_index);
-  RTC_DCHECK_LE(0, event);
-  RTC_DCHECK_GT(arraysize(kCoeff1[fs_index]), event);
-  RTC_DCHECK_GT(arraysize(kCoeff2[fs_index]), event);
-  coeff1_ = kCoeff1[fs_index][event];
-  coeff2_ = kCoeff2[fs_index][event];
-
-  // Look up amplitude multiplier.
-  RTC_DCHECK_LE(0, attenuation);
-  RTC_DCHECK_GT(arraysize(kAmplitude), attenuation);
-  amplitude_ = kAmplitude[attenuation];
-
-  // Initialize sample history.
-  RTC_DCHECK_LE(0, fs_index);
-  RTC_DCHECK_GT(arraysize(kInitValue1), fs_index);
-  RTC_DCHECK_GT(arraysize(kInitValue2), fs_index);
-  RTC_DCHECK_LE(0, event);
-  RTC_DCHECK_GT(arraysize(kInitValue1[fs_index]), event);
-  RTC_DCHECK_GT(arraysize(kInitValue2[fs_index]), event);
-  sample_history1_[0] = kInitValue1[fs_index][event];
-  sample_history1_[1] = 0;
-  sample_history2_[0] = kInitValue2[fs_index][event];
-  sample_history2_[1] = 0;
-
-  initialized_ = true;
-  return 0;
-}
-
-// Reset tone generator to uninitialized state.
-void DtmfToneGenerator::Reset() {
-  initialized_ = false;
-}
-
-// Generate num_samples of DTMF signal and write to |output|.
-int DtmfToneGenerator::Generate(size_t num_samples,
-                                AudioMultiVector* output) {
-  if (!initialized_) {
-    return kNotInitialized;
-  }
-
-  if (!output) {
-    return kParameterError;
-  }
-
-  output->AssertSize(num_samples);
-  for (size_t i = 0; i < num_samples; ++i) {
-    // Use recursion formula y[n] = a * y[n - 1] - y[n - 2].
-    int16_t temp_val_low = ((coeff1_ * sample_history1_[1] + 8192) >> 14)
-        - sample_history1_[0];
-    int16_t temp_val_high = ((coeff2_ * sample_history2_[1] + 8192) >> 14)
-        - sample_history2_[0];
-
-    // Update recursion memory.
-    sample_history1_[0] = sample_history1_[1];
-    sample_history1_[1] = temp_val_low;
-    sample_history2_[0] = sample_history2_[1];
-    sample_history2_[1] = temp_val_high;
-
-    // Attenuate the low frequency tone 3 dB.
-    int32_t temp_val =
-        kAmpMultiplier * temp_val_low + temp_val_high * (1 << 15);
-    // Normalize the signal to Q14 with proper rounding.
-    temp_val = (temp_val + 16384) >> 15;
-    // Scale the signal to correct volume.
-    (*output)[0][i] =
-        static_cast<int16_t>((temp_val * amplitude_ + 8192) >> 14);
-  }
-  // Copy first channel to all other channels.
-  for (size_t channel = 1; channel < output->Channels(); ++channel) {
-    output->CopyChannel(0, channel);
-  }
-
-  return static_cast<int>(num_samples);
-}
-
-bool DtmfToneGenerator::initialized() const {
-  return initialized_;
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/neteq/dtmf_tone_generator.h b/modules/audio_coding/neteq/dtmf_tone_generator.h
deleted file mode 100644
index 713987d..0000000
--- a/modules/audio_coding/neteq/dtmf_tone_generator.h
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- *  Copyright (c) 2012 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_NETEQ_DTMF_TONE_GENERATOR_H_
-#define WEBRTC_MODULES_AUDIO_CODING_NETEQ_DTMF_TONE_GENERATOR_H_
-
-#include "webrtc/modules/audio_coding/neteq/audio_multi_vector.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-// This class provides a generator for DTMF tones.
-class DtmfToneGenerator {
- public:
-  enum ReturnCodes {
-    kNotInitialized = -1,
-    kParameterError = -2,
-  };
-
-  DtmfToneGenerator();
-  virtual ~DtmfToneGenerator() {}
-  virtual int Init(int fs, int event, int attenuation);
-  virtual void Reset();
-  virtual int Generate(size_t num_samples, AudioMultiVector* output);
-  virtual bool initialized() const;
-
- private:
-  static const int kCoeff1[4][16];  // 1st oscillator model coefficient table.
-  static const int kCoeff2[4][16];  // 2nd oscillator model coefficient table.
-  static const int kInitValue1[4][16];  // Initialization for 1st oscillator.
-  static const int kInitValue2[4][16];  // Initialization for 2nd oscillator.
-  static const int kAmplitude[64];  // Amplitude for 0 through -63 dBm0.
-  static const int16_t kAmpMultiplier = 23171;  // 3 dB attenuation (in Q15).
-
-  bool initialized_;            // True if generator is initialized properly.
-  int coeff1_;                  // 1st oscillator coefficient for this event.
-  int coeff2_;                  // 2nd oscillator coefficient for this event.
-  int amplitude_;               // Amplitude for this event.
-  int16_t sample_history1_[2];  // Last 2 samples for the 1st oscillator.
-  int16_t sample_history2_[2];  // Last 2 samples for the 2nd oscillator.
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(DtmfToneGenerator);
-};
-
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_AUDIO_CODING_NETEQ_DTMF_TONE_GENERATOR_H_
diff --git a/modules/audio_coding/neteq/dtmf_tone_generator_unittest.cc b/modules/audio_coding/neteq/dtmf_tone_generator_unittest.cc
deleted file mode 100644
index 9eea103..0000000
--- a/modules/audio_coding/neteq/dtmf_tone_generator_unittest.cc
+++ /dev/null
@@ -1,179 +0,0 @@
-/*
- *  Copyright (c) 2012 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.
- */
-
-// Unit tests for DtmfToneGenerator class.
-
-#include "webrtc/modules/audio_coding/neteq/dtmf_tone_generator.h"
-
-#include <math.h>
-
-#include "webrtc/modules/audio_coding/neteq/audio_multi_vector.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-class DtmfToneGeneratorTest : public ::testing::Test {
- protected:
-  static const double kLowFreqHz[16];
-  static const double kHighFreqHz[16];
-  // This is the attenuation applied to all cases.
-  const double kBaseAttenuation = 16141.0 / 16384.0;
-  const double k3dbAttenuation = 23171.0 / 32768;
-  const int kNumSamples = 10;
-
-  void TestAllTones(int fs_hz, int channels) {
-    AudioMultiVector signal(channels);
-
-    for (int event = 0; event <= 15; ++event) {
-      std::ostringstream ss;
-      ss << "Checking event " << event << " at sample rate " << fs_hz;
-      SCOPED_TRACE(ss.str());
-      const int kAttenuation = 0;
-      ASSERT_EQ(0, tone_gen_.Init(fs_hz, event, kAttenuation));
-      EXPECT_TRUE(tone_gen_.initialized());
-      EXPECT_EQ(kNumSamples, tone_gen_.Generate(kNumSamples, &signal));
-
-      double f1 = kLowFreqHz[event];
-      double f2 = kHighFreqHz[event];
-      const double pi = 3.14159265358979323846;
-
-      for (int n = 0; n < kNumSamples; ++n) {
-        double x = k3dbAttenuation * sin(2.0 * pi * f1 / fs_hz * (-n - 1)) +
-                   sin(2.0 * pi * f2 / fs_hz * (-n - 1));
-        x *= kBaseAttenuation;
-        x = ldexp(x, 14);  // Scale to Q14.
-        for (int channel = 0; channel < channels; ++channel) {
-          EXPECT_NEAR(x, static_cast<double>(signal[channel][n]), 25);
-        }
-      }
-
-      tone_gen_.Reset();
-      EXPECT_FALSE(tone_gen_.initialized());
-    }
-  }
-
-  void TestAmplitudes(int fs_hz, int channels) {
-    AudioMultiVector signal(channels);
-    AudioMultiVector ref_signal(channels);
-
-    const int event_vec[] = {0, 4, 9, 13};  // Test a few events.
-    for (int e = 0; e < 4; ++e) {
-      int event = event_vec[e];
-      // Create full-scale reference.
-      ASSERT_EQ(0, tone_gen_.Init(fs_hz, event, 0));  // 0 attenuation.
-      EXPECT_EQ(kNumSamples, tone_gen_.Generate(kNumSamples, &ref_signal));
-      // Test every 5 steps (to save time).
-      for (int attenuation = 1; attenuation <= 63; attenuation += 5) {
-        std::ostringstream ss;
-        ss << "Checking event " << event << " at sample rate " << fs_hz;
-        ss << "; attenuation " << attenuation;
-        SCOPED_TRACE(ss.str());
-        ASSERT_EQ(0, tone_gen_.Init(fs_hz, event, attenuation));
-        EXPECT_EQ(kNumSamples, tone_gen_.Generate(kNumSamples, &signal));
-        for (int n = 0; n < kNumSamples; ++n) {
-          double attenuation_factor =
-              pow(10, -static_cast<double>(attenuation) / 20);
-          // Verify that the attenuation is correct.
-          for (int channel = 0; channel < channels; ++channel) {
-            EXPECT_NEAR(attenuation_factor * ref_signal[channel][n],
-                        signal[channel][n],
-                        2);
-          }
-        }
-
-        tone_gen_.Reset();
-      }
-    }
-  }
-
-  DtmfToneGenerator tone_gen_;
-};
-
-// Low and high frequencies for events 0 through 15.
-const double DtmfToneGeneratorTest::kLowFreqHz[16] = {
-    941.0, 697.0, 697.0, 697.0, 770.0, 770.0, 770.0, 852.0,
-    852.0, 852.0, 941.0, 941.0, 697.0, 770.0, 852.0, 941.0};
-const double DtmfToneGeneratorTest::kHighFreqHz[16] = {
-    1336.0, 1209.0, 1336.0, 1477.0, 1209.0, 1336.0, 1477.0, 1209.0,
-    1336.0, 1477.0, 1209.0, 1477.0, 1633.0, 1633.0, 1633.0, 1633.0};
-
-TEST_F(DtmfToneGeneratorTest, Test8000Mono) {
-  TestAllTones(8000, 1);
-  TestAmplitudes(8000, 1);
-}
-
-TEST_F(DtmfToneGeneratorTest, Test16000Mono) {
-  TestAllTones(16000, 1);
-  TestAmplitudes(16000, 1);
-}
-
-TEST_F(DtmfToneGeneratorTest, Test32000Mono) {
-  TestAllTones(32000, 1);
-  TestAmplitudes(32000, 1);
-}
-
-TEST_F(DtmfToneGeneratorTest, Test48000Mono) {
-  TestAllTones(48000, 1);
-  TestAmplitudes(48000, 1);
-}
-
-TEST_F(DtmfToneGeneratorTest, Test8000Stereo) {
-  TestAllTones(8000, 2);
-  TestAmplitudes(8000, 2);
-}
-
-TEST_F(DtmfToneGeneratorTest, Test16000Stereo) {
-  TestAllTones(16000, 2);
-  TestAmplitudes(16000, 2);
-}
-
-TEST_F(DtmfToneGeneratorTest, Test32000Stereo) {
-  TestAllTones(32000, 2);
-  TestAmplitudes(32000, 2);
-}
-
-TEST_F(DtmfToneGeneratorTest, Test48000Stereo) {
-  TestAllTones(48000, 2);
-  TestAmplitudes(48000, 2);
-}
-
-TEST(DtmfToneGenerator, TestErrors) {
-  DtmfToneGenerator tone_gen;
-  const int kNumSamples = 10;
-  AudioMultiVector signal(1);  // One channel.
-
-  // Try to generate tones without initializing.
-  EXPECT_EQ(DtmfToneGenerator::kNotInitialized,
-            tone_gen.Generate(kNumSamples, &signal));
-
-  const int fs = 16000;       // Valid sample rate.
-  const int event = 7;        // Valid event.
-  const int attenuation = 0;  // Valid attenuation.
-  // Initialize with invalid event -1.
-  EXPECT_EQ(DtmfToneGenerator::kParameterError,
-            tone_gen.Init(fs, -1, attenuation));
-  // Initialize with invalid event 16.
-  EXPECT_EQ(DtmfToneGenerator::kParameterError,
-            tone_gen.Init(fs, 16, attenuation));
-  // Initialize with invalid attenuation -1.
-  EXPECT_EQ(DtmfToneGenerator::kParameterError, tone_gen.Init(fs, event, -1));
-  // Initialize with invalid attenuation 64.
-  EXPECT_EQ(DtmfToneGenerator::kParameterError, tone_gen.Init(fs, event, 64));
-  EXPECT_FALSE(tone_gen.initialized());  // Should still be uninitialized.
-
-  // Initialize with valid parameters.
-  ASSERT_EQ(0, tone_gen.Init(fs, event, attenuation));
-  EXPECT_TRUE(tone_gen.initialized());
-  // NULL pointer to destination.
-  EXPECT_EQ(DtmfToneGenerator::kParameterError,
-            tone_gen.Generate(kNumSamples, NULL));
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/neteq/expand.cc b/modules/audio_coding/neteq/expand.cc
deleted file mode 100644
index f8ae526..0000000
--- a/modules/audio_coding/neteq/expand.cc
+++ /dev/null
@@ -1,978 +0,0 @@
-/*
- *  Copyright (c) 2012 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/neteq/expand.h"
-
-#include <assert.h>
-#include <string.h>  // memset
-
-#include <algorithm>  // min, max
-#include <limits>  // numeric_limits<T>
-
-#include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
-#include "webrtc/modules/audio_coding/neteq/background_noise.h"
-#include "webrtc/modules/audio_coding/neteq/cross_correlation.h"
-#include "webrtc/modules/audio_coding/neteq/dsp_helper.h"
-#include "webrtc/modules/audio_coding/neteq/random_vector.h"
-#include "webrtc/modules/audio_coding/neteq/statistics_calculator.h"
-#include "webrtc/modules/audio_coding/neteq/sync_buffer.h"
-#include "webrtc/rtc_base/safe_conversions.h"
-
-namespace webrtc {
-
-Expand::Expand(BackgroundNoise* background_noise,
-               SyncBuffer* sync_buffer,
-               RandomVector* random_vector,
-               StatisticsCalculator* statistics,
-               int fs,
-               size_t num_channels)
-    : random_vector_(random_vector),
-      sync_buffer_(sync_buffer),
-      first_expand_(true),
-      fs_hz_(fs),
-      num_channels_(num_channels),
-      consecutive_expands_(0),
-      background_noise_(background_noise),
-      statistics_(statistics),
-      overlap_length_(5 * fs / 8000),
-      lag_index_direction_(0),
-      current_lag_index_(0),
-      stop_muting_(false),
-      expand_duration_samples_(0),
-      channel_parameters_(new ChannelParameters[num_channels_]) {
-  assert(fs == 8000 || fs == 16000 || fs == 32000 || fs == 48000);
-  assert(fs <= static_cast<int>(kMaxSampleRate));  // Should not be possible.
-  assert(num_channels_ > 0);
-  memset(expand_lags_, 0, sizeof(expand_lags_));
-  Reset();
-}
-
-Expand::~Expand() = default;
-
-void Expand::Reset() {
-  first_expand_ = true;
-  consecutive_expands_ = 0;
-  max_lag_ = 0;
-  for (size_t ix = 0; ix < num_channels_; ++ix) {
-    channel_parameters_[ix].expand_vector0.Clear();
-    channel_parameters_[ix].expand_vector1.Clear();
-  }
-}
-
-int Expand::Process(AudioMultiVector* output) {
-  int16_t random_vector[kMaxSampleRate / 8000 * 120 + 30];
-  int16_t scaled_random_vector[kMaxSampleRate / 8000 * 125];
-  static const int kTempDataSize = 3600;
-  int16_t temp_data[kTempDataSize];  // TODO(hlundin) Remove this.
-  int16_t* voiced_vector_storage = temp_data;
-  int16_t* voiced_vector = &voiced_vector_storage[overlap_length_];
-  static const size_t kNoiseLpcOrder = BackgroundNoise::kMaxLpcOrder;
-  int16_t unvoiced_array_memory[kNoiseLpcOrder + kMaxSampleRate / 8000 * 125];
-  int16_t* unvoiced_vector = unvoiced_array_memory + kUnvoicedLpcOrder;
-  int16_t* noise_vector = unvoiced_array_memory + kNoiseLpcOrder;
-
-  int fs_mult = fs_hz_ / 8000;
-
-  if (first_expand_) {
-    // Perform initial setup if this is the first expansion since last reset.
-    AnalyzeSignal(random_vector);
-    first_expand_ = false;
-    expand_duration_samples_ = 0;
-  } else {
-    // This is not the first expansion, parameters are already estimated.
-    // Extract a noise segment.
-    size_t rand_length = max_lag_;
-    // This only applies to SWB where length could be larger than 256.
-    assert(rand_length <= kMaxSampleRate / 8000 * 120 + 30);
-    GenerateRandomVector(2, rand_length, random_vector);
-  }
-
-
-  // Generate signal.
-  UpdateLagIndex();
-
-  // Voiced part.
-  // Generate a weighted vector with the current lag.
-  size_t expansion_vector_length = max_lag_ + overlap_length_;
-  size_t current_lag = expand_lags_[current_lag_index_];
-  // Copy lag+overlap data.
-  size_t expansion_vector_position = expansion_vector_length - current_lag -
-      overlap_length_;
-  size_t temp_length = current_lag + overlap_length_;
-  for (size_t channel_ix = 0; channel_ix < num_channels_; ++channel_ix) {
-    ChannelParameters& parameters = channel_parameters_[channel_ix];
-    if (current_lag_index_ == 0) {
-      // Use only expand_vector0.
-      assert(expansion_vector_position + temp_length <=
-             parameters.expand_vector0.Size());
-      parameters.expand_vector0.CopyTo(temp_length, expansion_vector_position,
-                                       voiced_vector_storage);
-    } else if (current_lag_index_ == 1) {
-      std::unique_ptr<int16_t[]> temp_0(new int16_t[temp_length]);
-      parameters.expand_vector0.CopyTo(temp_length, expansion_vector_position,
-                                       temp_0.get());
-      std::unique_ptr<int16_t[]> temp_1(new int16_t[temp_length]);
-      parameters.expand_vector1.CopyTo(temp_length, expansion_vector_position,
-                                       temp_1.get());
-      // Mix 3/4 of expand_vector0 with 1/4 of expand_vector1.
-      WebRtcSpl_ScaleAndAddVectorsWithRound(temp_0.get(), 3, temp_1.get(), 1, 2,
-                                            voiced_vector_storage, temp_length);
-    } else if (current_lag_index_ == 2) {
-      // Mix 1/2 of expand_vector0 with 1/2 of expand_vector1.
-      assert(expansion_vector_position + temp_length <=
-             parameters.expand_vector0.Size());
-      assert(expansion_vector_position + temp_length <=
-             parameters.expand_vector1.Size());
-
-      std::unique_ptr<int16_t[]> temp_0(new int16_t[temp_length]);
-      parameters.expand_vector0.CopyTo(temp_length, expansion_vector_position,
-                                       temp_0.get());
-      std::unique_ptr<int16_t[]> temp_1(new int16_t[temp_length]);
-      parameters.expand_vector1.CopyTo(temp_length, expansion_vector_position,
-                                       temp_1.get());
-      WebRtcSpl_ScaleAndAddVectorsWithRound(temp_0.get(), 1, temp_1.get(), 1, 1,
-                                            voiced_vector_storage, temp_length);
-    }
-
-    // Get tapering window parameters. Values are in Q15.
-    int16_t muting_window, muting_window_increment;
-    int16_t unmuting_window, unmuting_window_increment;
-    if (fs_hz_ == 8000) {
-      muting_window = DspHelper::kMuteFactorStart8kHz;
-      muting_window_increment = DspHelper::kMuteFactorIncrement8kHz;
-      unmuting_window = DspHelper::kUnmuteFactorStart8kHz;
-      unmuting_window_increment = DspHelper::kUnmuteFactorIncrement8kHz;
-    } else if (fs_hz_ == 16000) {
-      muting_window = DspHelper::kMuteFactorStart16kHz;
-      muting_window_increment = DspHelper::kMuteFactorIncrement16kHz;
-      unmuting_window = DspHelper::kUnmuteFactorStart16kHz;
-      unmuting_window_increment = DspHelper::kUnmuteFactorIncrement16kHz;
-    } else if (fs_hz_ == 32000) {
-      muting_window = DspHelper::kMuteFactorStart32kHz;
-      muting_window_increment = DspHelper::kMuteFactorIncrement32kHz;
-      unmuting_window = DspHelper::kUnmuteFactorStart32kHz;
-      unmuting_window_increment = DspHelper::kUnmuteFactorIncrement32kHz;
-    } else {  // fs_ == 48000
-      muting_window = DspHelper::kMuteFactorStart48kHz;
-      muting_window_increment = DspHelper::kMuteFactorIncrement48kHz;
-      unmuting_window = DspHelper::kUnmuteFactorStart48kHz;
-      unmuting_window_increment = DspHelper::kUnmuteFactorIncrement48kHz;
-    }
-
-    // Smooth the expanded if it has not been muted to a low amplitude and
-    // |current_voice_mix_factor| is larger than 0.5.
-    if ((parameters.mute_factor > 819) &&
-        (parameters.current_voice_mix_factor > 8192)) {
-      size_t start_ix = sync_buffer_->Size() - overlap_length_;
-      for (size_t i = 0; i < overlap_length_; i++) {
-        // Do overlap add between new vector and overlap.
-        (*sync_buffer_)[channel_ix][start_ix + i] =
-            (((*sync_buffer_)[channel_ix][start_ix + i] * muting_window) +
-                (((parameters.mute_factor * voiced_vector_storage[i]) >> 14) *
-                    unmuting_window) + 16384) >> 15;
-        muting_window += muting_window_increment;
-        unmuting_window += unmuting_window_increment;
-      }
-    } else if (parameters.mute_factor == 0) {
-      // The expanded signal will consist of only comfort noise if
-      // mute_factor = 0. Set the output length to 15 ms for best noise
-      // production.
-      // TODO(hlundin): This has been disabled since the length of
-      // parameters.expand_vector0 and parameters.expand_vector1 no longer
-      // match with expand_lags_, causing invalid reads and writes. Is it a good
-      // idea to enable this again, and solve the vector size problem?
-//      max_lag_ = fs_mult * 120;
-//      expand_lags_[0] = fs_mult * 120;
-//      expand_lags_[1] = fs_mult * 120;
-//      expand_lags_[2] = fs_mult * 120;
-    }
-
-    // Unvoiced part.
-    // Filter |scaled_random_vector| through |ar_filter_|.
-    memcpy(unvoiced_vector - kUnvoicedLpcOrder, parameters.ar_filter_state,
-           sizeof(int16_t) * kUnvoicedLpcOrder);
-    int32_t add_constant = 0;
-    if (parameters.ar_gain_scale > 0) {
-      add_constant = 1 << (parameters.ar_gain_scale - 1);
-    }
-    WebRtcSpl_AffineTransformVector(scaled_random_vector, random_vector,
-                                    parameters.ar_gain, add_constant,
-                                    parameters.ar_gain_scale,
-                                    current_lag);
-    WebRtcSpl_FilterARFastQ12(scaled_random_vector, unvoiced_vector,
-                              parameters.ar_filter, kUnvoicedLpcOrder + 1,
-                              current_lag);
-    memcpy(parameters.ar_filter_state,
-           &(unvoiced_vector[current_lag - kUnvoicedLpcOrder]),
-           sizeof(int16_t) * kUnvoicedLpcOrder);
-
-    // Combine voiced and unvoiced contributions.
-
-    // Set a suitable cross-fading slope.
-    // For lag =
-    //   <= 31 * fs_mult            => go from 1 to 0 in about 8 ms;
-    //  (>= 31 .. <= 63) * fs_mult  => go from 1 to 0 in about 16 ms;
-    //   >= 64 * fs_mult            => go from 1 to 0 in about 32 ms.
-    // temp_shift = getbits(max_lag_) - 5.
-    int temp_shift =
-        (31 - WebRtcSpl_NormW32(rtc::dchecked_cast<int32_t>(max_lag_))) - 5;
-    int16_t mix_factor_increment = 256 >> temp_shift;
-    if (stop_muting_) {
-      mix_factor_increment = 0;
-    }
-
-    // Create combined signal by shifting in more and more of unvoiced part.
-    temp_shift = 8 - temp_shift;  // = getbits(mix_factor_increment).
-    size_t temp_length = (parameters.current_voice_mix_factor -
-        parameters.voice_mix_factor) >> temp_shift;
-    temp_length = std::min(temp_length, current_lag);
-    DspHelper::CrossFade(voiced_vector, unvoiced_vector, temp_length,
-                         &parameters.current_voice_mix_factor,
-                         mix_factor_increment, temp_data);
-
-    // End of cross-fading period was reached before end of expanded signal
-    // path. Mix the rest with a fixed mixing factor.
-    if (temp_length < current_lag) {
-      if (mix_factor_increment != 0) {
-        parameters.current_voice_mix_factor = parameters.voice_mix_factor;
-      }
-      int16_t temp_scale = 16384 - parameters.current_voice_mix_factor;
-      WebRtcSpl_ScaleAndAddVectorsWithRound(
-          voiced_vector + temp_length, parameters.current_voice_mix_factor,
-          unvoiced_vector + temp_length, temp_scale, 14,
-          temp_data + temp_length, current_lag - temp_length);
-    }
-
-    // Select muting slope depending on how many consecutive expands we have
-    // done.
-    if (consecutive_expands_ == 3) {
-      // Let the mute factor decrease from 1.0 to 0.95 in 6.25 ms.
-      // mute_slope = 0.0010 / fs_mult in Q20.
-      parameters.mute_slope = std::max(parameters.mute_slope, 1049 / fs_mult);
-    }
-    if (consecutive_expands_ == 7) {
-      // Let the mute factor decrease from 1.0 to 0.90 in 6.25 ms.
-      // mute_slope = 0.0020 / fs_mult in Q20.
-      parameters.mute_slope = std::max(parameters.mute_slope, 2097 / fs_mult);
-    }
-
-    // Mute segment according to slope value.
-    if ((consecutive_expands_ != 0) || !parameters.onset) {
-      // Mute to the previous level, then continue with the muting.
-      WebRtcSpl_AffineTransformVector(temp_data, temp_data,
-                                      parameters.mute_factor, 8192,
-                                      14, current_lag);
-
-      if (!stop_muting_) {
-        DspHelper::MuteSignal(temp_data, parameters.mute_slope, current_lag);
-
-        // Shift by 6 to go from Q20 to Q14.
-        // TODO(hlundin): Adding 8192 before shifting 6 steps seems wrong.
-        // Legacy.
-        int16_t gain = static_cast<int16_t>(16384 -
-            (((current_lag * parameters.mute_slope) + 8192) >> 6));
-        gain = ((gain * parameters.mute_factor) + 8192) >> 14;
-
-        // Guard against getting stuck with very small (but sometimes audible)
-        // gain.
-        if ((consecutive_expands_ > 3) && (gain >= parameters.mute_factor)) {
-          parameters.mute_factor = 0;
-        } else {
-          parameters.mute_factor = gain;
-        }
-      }
-    }
-
-    // Background noise part.
-    GenerateBackgroundNoise(random_vector,
-                            channel_ix,
-                            channel_parameters_[channel_ix].mute_slope,
-                            TooManyExpands(),
-                            current_lag,
-                            unvoiced_array_memory);
-
-    // Add background noise to the combined voiced-unvoiced signal.
-    for (size_t i = 0; i < current_lag; i++) {
-      temp_data[i] = temp_data[i] + noise_vector[i];
-    }
-    if (channel_ix == 0) {
-      output->AssertSize(current_lag);
-    } else {
-      assert(output->Size() == current_lag);
-    }
-    (*output)[channel_ix].OverwriteAt(temp_data, current_lag, 0);
-  }
-
-  // Increase call number and cap it.
-  consecutive_expands_ = consecutive_expands_ >= kMaxConsecutiveExpands ?
-      kMaxConsecutiveExpands : consecutive_expands_ + 1;
-  expand_duration_samples_ += output->Size();
-  // Clamp the duration counter at 2 seconds.
-  expand_duration_samples_ = std::min(expand_duration_samples_,
-                                      rtc::dchecked_cast<size_t>(fs_hz_ * 2));
-  return 0;
-}
-
-void Expand::SetParametersForNormalAfterExpand() {
-  current_lag_index_ = 0;
-  lag_index_direction_ = 0;
-  stop_muting_ = true;  // Do not mute signal any more.
-  statistics_->LogDelayedPacketOutageEvent(
-      rtc::dchecked_cast<int>(expand_duration_samples_) / (fs_hz_ / 1000));
-}
-
-void Expand::SetParametersForMergeAfterExpand() {
-  current_lag_index_ = -1; /* out of the 3 possible ones */
-  lag_index_direction_ = 1; /* make sure we get the "optimal" lag */
-  stop_muting_ = true;
-}
-
-bool Expand::Muted() const {
-  if (first_expand_ || stop_muting_)
-    return false;
-  RTC_DCHECK(channel_parameters_);
-  for (size_t ch = 0; ch < num_channels_; ++ch) {
-    if (channel_parameters_[ch].mute_factor != 0)
-      return false;
-  }
-  return true;
-}
-
-size_t Expand::overlap_length() const {
-  return overlap_length_;
-}
-
-void Expand::InitializeForAnExpandPeriod() {
-  lag_index_direction_ = 1;
-  current_lag_index_ = -1;
-  stop_muting_ = false;
-  random_vector_->set_seed_increment(1);
-  consecutive_expands_ = 0;
-  for (size_t ix = 0; ix < num_channels_; ++ix) {
-    channel_parameters_[ix].current_voice_mix_factor = 16384;  // 1.0 in Q14.
-    channel_parameters_[ix].mute_factor = 16384;  // 1.0 in Q14.
-    // Start with 0 gain for background noise.
-    background_noise_->SetMuteFactor(ix, 0);
-  }
-}
-
-bool Expand::TooManyExpands() {
-  return consecutive_expands_ >= kMaxConsecutiveExpands;
-}
-
-void Expand::AnalyzeSignal(int16_t* random_vector) {
-  int32_t auto_correlation[kUnvoicedLpcOrder + 1];
-  int16_t reflection_coeff[kUnvoicedLpcOrder];
-  int16_t correlation_vector[kMaxSampleRate / 8000 * 102];
-  size_t best_correlation_index[kNumCorrelationCandidates];
-  int16_t best_correlation[kNumCorrelationCandidates];
-  size_t best_distortion_index[kNumCorrelationCandidates];
-  int16_t best_distortion[kNumCorrelationCandidates];
-  int32_t correlation_vector2[(99 * kMaxSampleRate / 8000) + 1];
-  int32_t best_distortion_w32[kNumCorrelationCandidates];
-  static const size_t kNoiseLpcOrder = BackgroundNoise::kMaxLpcOrder;
-  int16_t unvoiced_array_memory[kNoiseLpcOrder + kMaxSampleRate / 8000 * 125];
-  int16_t* unvoiced_vector = unvoiced_array_memory + kUnvoicedLpcOrder;
-
-  int fs_mult = fs_hz_ / 8000;
-
-  // Pre-calculate common multiplications with fs_mult.
-  size_t fs_mult_4 = static_cast<size_t>(fs_mult * 4);
-  size_t fs_mult_20 = static_cast<size_t>(fs_mult * 20);
-  size_t fs_mult_120 = static_cast<size_t>(fs_mult * 120);
-  size_t fs_mult_dist_len = fs_mult * kDistortionLength;
-  size_t fs_mult_lpc_analysis_len = fs_mult * kLpcAnalysisLength;
-
-  const size_t signal_length = static_cast<size_t>(256 * fs_mult);
-
-  const size_t audio_history_position = sync_buffer_->Size() - signal_length;
-  std::unique_ptr<int16_t[]> audio_history(new int16_t[signal_length]);
-  (*sync_buffer_)[0].CopyTo(signal_length, audio_history_position,
-                            audio_history.get());
-
-  // Initialize.
-  InitializeForAnExpandPeriod();
-
-  // Calculate correlation in downsampled domain (4 kHz sample rate).
-  size_t correlation_length = 51;  // TODO(hlundin): Legacy bit-exactness.
-  // If it is decided to break bit-exactness |correlation_length| should be
-  // initialized to the return value of Correlation().
-  Correlation(audio_history.get(), signal_length, correlation_vector);
-
-  // Find peaks in correlation vector.
-  DspHelper::PeakDetection(correlation_vector, correlation_length,
-                           kNumCorrelationCandidates, fs_mult,
-                           best_correlation_index, best_correlation);
-
-  // Adjust peak locations; cross-correlation lags start at 2.5 ms
-  // (20 * fs_mult samples).
-  best_correlation_index[0] += fs_mult_20;
-  best_correlation_index[1] += fs_mult_20;
-  best_correlation_index[2] += fs_mult_20;
-
-  // Calculate distortion around the |kNumCorrelationCandidates| best lags.
-  int distortion_scale = 0;
-  for (size_t i = 0; i < kNumCorrelationCandidates; i++) {
-    size_t min_index = std::max(fs_mult_20,
-                                best_correlation_index[i] - fs_mult_4);
-    size_t max_index = std::min(fs_mult_120 - 1,
-                                best_correlation_index[i] + fs_mult_4);
-    best_distortion_index[i] = DspHelper::MinDistortion(
-        &(audio_history[signal_length - fs_mult_dist_len]), min_index,
-        max_index, fs_mult_dist_len, &best_distortion_w32[i]);
-    distortion_scale = std::max(16 - WebRtcSpl_NormW32(best_distortion_w32[i]),
-                                distortion_scale);
-  }
-  // Shift the distortion values to fit in 16 bits.
-  WebRtcSpl_VectorBitShiftW32ToW16(best_distortion, kNumCorrelationCandidates,
-                                   best_distortion_w32, distortion_scale);
-
-  // Find the maximizing index |i| of the cost function
-  // f[i] = best_correlation[i] / best_distortion[i].
-  int32_t best_ratio = std::numeric_limits<int32_t>::min();
-  size_t best_index = std::numeric_limits<size_t>::max();
-  for (size_t i = 0; i < kNumCorrelationCandidates; ++i) {
-    int32_t ratio;
-    if (best_distortion[i] > 0) {
-      ratio = (best_correlation[i] * (1 << 16)) / best_distortion[i];
-    } else if (best_correlation[i] == 0) {
-      ratio = 0;  // No correlation set result to zero.
-    } else {
-      ratio = std::numeric_limits<int32_t>::max();  // Denominator is zero.
-    }
-    if (ratio > best_ratio) {
-      best_index = i;
-      best_ratio = ratio;
-    }
-  }
-
-  size_t distortion_lag = best_distortion_index[best_index];
-  size_t correlation_lag = best_correlation_index[best_index];
-  max_lag_ = std::max(distortion_lag, correlation_lag);
-
-  // Calculate the exact best correlation in the range between
-  // |correlation_lag| and |distortion_lag|.
-  correlation_length =
-      std::max(std::min(distortion_lag + 10, fs_mult_120),
-               static_cast<size_t>(60 * fs_mult));
-
-  size_t start_index = std::min(distortion_lag, correlation_lag);
-  size_t correlation_lags = static_cast<size_t>(
-      WEBRTC_SPL_ABS_W16((distortion_lag-correlation_lag)) + 1);
-  assert(correlation_lags <= static_cast<size_t>(99 * fs_mult + 1));
-
-  for (size_t channel_ix = 0; channel_ix < num_channels_; ++channel_ix) {
-    ChannelParameters& parameters = channel_parameters_[channel_ix];
-    // Calculate suitable scaling.
-    int16_t signal_max = WebRtcSpl_MaxAbsValueW16(
-        &audio_history[signal_length - correlation_length - start_index
-                       - correlation_lags],
-                       correlation_length + start_index + correlation_lags - 1);
-    int correlation_scale = (31 - WebRtcSpl_NormW32(signal_max * signal_max)) +
-        (31 - WebRtcSpl_NormW32(static_cast<int32_t>(correlation_length))) - 31;
-    correlation_scale = std::max(0, correlation_scale);
-
-    // Calculate the correlation, store in |correlation_vector2|.
-    WebRtcSpl_CrossCorrelation(
-        correlation_vector2,
-        &(audio_history[signal_length - correlation_length]),
-        &(audio_history[signal_length - correlation_length - start_index]),
-        correlation_length, correlation_lags, correlation_scale, -1);
-
-    // Find maximizing index.
-    best_index = WebRtcSpl_MaxIndexW32(correlation_vector2, correlation_lags);
-    int32_t max_correlation = correlation_vector2[best_index];
-    // Compensate index with start offset.
-    best_index = best_index + start_index;
-
-    // Calculate energies.
-    int32_t energy1 = WebRtcSpl_DotProductWithScale(
-        &(audio_history[signal_length - correlation_length]),
-        &(audio_history[signal_length - correlation_length]),
-        correlation_length, correlation_scale);
-    int32_t energy2 = WebRtcSpl_DotProductWithScale(
-        &(audio_history[signal_length - correlation_length - best_index]),
-        &(audio_history[signal_length - correlation_length - best_index]),
-        correlation_length, correlation_scale);
-
-    // Calculate the correlation coefficient between the two portions of the
-    // signal.
-    int32_t corr_coefficient;
-    if ((energy1 > 0) && (energy2 > 0)) {
-      int energy1_scale = std::max(16 - WebRtcSpl_NormW32(energy1), 0);
-      int energy2_scale = std::max(16 - WebRtcSpl_NormW32(energy2), 0);
-      // Make sure total scaling is even (to simplify scale factor after sqrt).
-      if ((energy1_scale + energy2_scale) & 1) {
-        // If sum is odd, add 1 to make it even.
-        energy1_scale += 1;
-      }
-      int32_t scaled_energy1 = energy1 >> energy1_scale;
-      int32_t scaled_energy2 = energy2 >> energy2_scale;
-      int16_t sqrt_energy_product = static_cast<int16_t>(
-          WebRtcSpl_SqrtFloor(scaled_energy1 * scaled_energy2));
-      // Calculate max_correlation / sqrt(energy1 * energy2) in Q14.
-      int cc_shift = 14 - (energy1_scale + energy2_scale) / 2;
-      max_correlation = WEBRTC_SPL_SHIFT_W32(max_correlation, cc_shift);
-      corr_coefficient = WebRtcSpl_DivW32W16(max_correlation,
-                                             sqrt_energy_product);
-      // Cap at 1.0 in Q14.
-      corr_coefficient = std::min(16384, corr_coefficient);
-    } else {
-      corr_coefficient = 0;
-    }
-
-    // Extract the two vectors expand_vector0 and expand_vector1 from
-    // |audio_history|.
-    size_t expansion_length = max_lag_ + overlap_length_;
-    const int16_t* vector1 = &(audio_history[signal_length - expansion_length]);
-    const int16_t* vector2 = vector1 - distortion_lag;
-    // Normalize the second vector to the same energy as the first.
-    energy1 = WebRtcSpl_DotProductWithScale(vector1, vector1, expansion_length,
-                                            correlation_scale);
-    energy2 = WebRtcSpl_DotProductWithScale(vector2, vector2, expansion_length,
-                                            correlation_scale);
-    // Confirm that amplitude ratio sqrt(energy1 / energy2) is within 0.5 - 2.0,
-    // i.e., energy1 / energy2 is within 0.25 - 4.
-    int16_t amplitude_ratio;
-    if ((energy1 / 4 < energy2) && (energy1 > energy2 / 4)) {
-      // Energy constraint fulfilled. Use both vectors and scale them
-      // accordingly.
-      int32_t scaled_energy2 = std::max(16 - WebRtcSpl_NormW32(energy2), 0);
-      int32_t scaled_energy1 = scaled_energy2 - 13;
-      // Calculate scaled_energy1 / scaled_energy2 in Q13.
-      int32_t energy_ratio = WebRtcSpl_DivW32W16(
-          WEBRTC_SPL_SHIFT_W32(energy1, -scaled_energy1),
-          static_cast<int16_t>(energy2 >> scaled_energy2));
-      // Calculate sqrt ratio in Q13 (sqrt of en1/en2 in Q26).
-      amplitude_ratio =
-          static_cast<int16_t>(WebRtcSpl_SqrtFloor(energy_ratio << 13));
-      // Copy the two vectors and give them the same energy.
-      parameters.expand_vector0.Clear();
-      parameters.expand_vector0.PushBack(vector1, expansion_length);
-      parameters.expand_vector1.Clear();
-      if (parameters.expand_vector1.Size() < expansion_length) {
-        parameters.expand_vector1.Extend(
-            expansion_length - parameters.expand_vector1.Size());
-      }
-      std::unique_ptr<int16_t[]> temp_1(new int16_t[expansion_length]);
-      WebRtcSpl_AffineTransformVector(temp_1.get(),
-                                      const_cast<int16_t*>(vector2),
-                                      amplitude_ratio,
-                                      4096,
-                                      13,
-                                      expansion_length);
-      parameters.expand_vector1.OverwriteAt(temp_1.get(), expansion_length, 0);
-    } else {
-      // Energy change constraint not fulfilled. Only use last vector.
-      parameters.expand_vector0.Clear();
-      parameters.expand_vector0.PushBack(vector1, expansion_length);
-      // Copy from expand_vector0 to expand_vector1.
-      parameters.expand_vector0.CopyTo(&parameters.expand_vector1);
-      // Set the energy_ratio since it is used by muting slope.
-      if ((energy1 / 4 < energy2) || (energy2 == 0)) {
-        amplitude_ratio = 4096;  // 0.5 in Q13.
-      } else {
-        amplitude_ratio = 16384;  // 2.0 in Q13.
-      }
-    }
-
-    // Set the 3 lag values.
-    if (distortion_lag == correlation_lag) {
-      expand_lags_[0] = distortion_lag;
-      expand_lags_[1] = distortion_lag;
-      expand_lags_[2] = distortion_lag;
-    } else {
-      // |distortion_lag| and |correlation_lag| are not equal; use different
-      // combinations of the two.
-      // First lag is |distortion_lag| only.
-      expand_lags_[0] = distortion_lag;
-      // Second lag is the average of the two.
-      expand_lags_[1] = (distortion_lag + correlation_lag) / 2;
-      // Third lag is the average again, but rounding towards |correlation_lag|.
-      if (distortion_lag > correlation_lag) {
-        expand_lags_[2] = (distortion_lag + correlation_lag - 1) / 2;
-      } else {
-        expand_lags_[2] = (distortion_lag + correlation_lag + 1) / 2;
-      }
-    }
-
-    // Calculate the LPC and the gain of the filters.
-
-    // Calculate kUnvoicedLpcOrder + 1 lags of the auto-correlation function.
-    size_t temp_index = signal_length - fs_mult_lpc_analysis_len -
-        kUnvoicedLpcOrder;
-    // Copy signal to temporary vector to be able to pad with leading zeros.
-    int16_t* temp_signal = new int16_t[fs_mult_lpc_analysis_len
-                                       + kUnvoicedLpcOrder];
-    memset(temp_signal, 0,
-           sizeof(int16_t) * (fs_mult_lpc_analysis_len + kUnvoicedLpcOrder));
-    memcpy(&temp_signal[kUnvoicedLpcOrder],
-           &audio_history[temp_index + kUnvoicedLpcOrder],
-           sizeof(int16_t) * fs_mult_lpc_analysis_len);
-    CrossCorrelationWithAutoShift(
-        &temp_signal[kUnvoicedLpcOrder], &temp_signal[kUnvoicedLpcOrder],
-        fs_mult_lpc_analysis_len, kUnvoicedLpcOrder + 1, -1, auto_correlation);
-    delete [] temp_signal;
-
-    // Verify that variance is positive.
-    if (auto_correlation[0] > 0) {
-      // Estimate AR filter parameters using Levinson-Durbin algorithm;
-      // kUnvoicedLpcOrder + 1 filter coefficients.
-      int16_t stability = WebRtcSpl_LevinsonDurbin(auto_correlation,
-                                                   parameters.ar_filter,
-                                                   reflection_coeff,
-                                                   kUnvoicedLpcOrder);
-
-      // Keep filter parameters only if filter is stable.
-      if (stability != 1) {
-        // Set first coefficient to 4096 (1.0 in Q12).
-        parameters.ar_filter[0] = 4096;
-        // Set remaining |kUnvoicedLpcOrder| coefficients to zero.
-        WebRtcSpl_MemSetW16(parameters.ar_filter + 1, 0, kUnvoicedLpcOrder);
-      }
-    }
-
-    if (channel_ix == 0) {
-      // Extract a noise segment.
-      size_t noise_length;
-      if (distortion_lag < 40) {
-        noise_length = 2 * distortion_lag + 30;
-      } else {
-        noise_length = distortion_lag + 30;
-      }
-      if (noise_length <= RandomVector::kRandomTableSize) {
-        memcpy(random_vector, RandomVector::kRandomTable,
-               sizeof(int16_t) * noise_length);
-      } else {
-        // Only applies to SWB where length could be larger than
-        // |kRandomTableSize|.
-        memcpy(random_vector, RandomVector::kRandomTable,
-               sizeof(int16_t) * RandomVector::kRandomTableSize);
-        assert(noise_length <= kMaxSampleRate / 8000 * 120 + 30);
-        random_vector_->IncreaseSeedIncrement(2);
-        random_vector_->Generate(
-            noise_length - RandomVector::kRandomTableSize,
-            &random_vector[RandomVector::kRandomTableSize]);
-      }
-    }
-
-    // Set up state vector and calculate scale factor for unvoiced filtering.
-    memcpy(parameters.ar_filter_state,
-           &(audio_history[signal_length - kUnvoicedLpcOrder]),
-           sizeof(int16_t) * kUnvoicedLpcOrder);
-    memcpy(unvoiced_vector - kUnvoicedLpcOrder,
-           &(audio_history[signal_length - 128 - kUnvoicedLpcOrder]),
-           sizeof(int16_t) * kUnvoicedLpcOrder);
-    WebRtcSpl_FilterMAFastQ12(&audio_history[signal_length - 128],
-                              unvoiced_vector,
-                              parameters.ar_filter,
-                              kUnvoicedLpcOrder + 1,
-                              128);
-    const int unvoiced_max_abs = [&] {
-      const int16_t max_abs = WebRtcSpl_MaxAbsValueW16(unvoiced_vector, 128);
-      // Since WebRtcSpl_MaxAbsValueW16 returns 2^15 - 1 when the input contains
-      // -2^15, we have to conservatively bump the return value by 1
-      // if it is 2^15 - 1.
-      return max_abs == WEBRTC_SPL_WORD16_MAX ? max_abs + 1 : max_abs;
-    }();
-    // Pick the smallest n such that 2^n > unvoiced_max_abs; then the maximum
-    // value of the dot product is less than 2^7 * 2^(2*n) = 2^(2*n + 7), so to
-    // prevent overflows we want 2n + 7 <= 31, which means we should shift by
-    // 2n + 7 - 31 bits, if this value is greater than zero.
-    int unvoiced_prescale =
-        std::max(0, 2 * WebRtcSpl_GetSizeInBits(unvoiced_max_abs) - 24);
-
-    int32_t unvoiced_energy = WebRtcSpl_DotProductWithScale(unvoiced_vector,
-                                                            unvoiced_vector,
-                                                            128,
-                                                            unvoiced_prescale);
-
-    // Normalize |unvoiced_energy| to 28 or 29 bits to preserve sqrt() accuracy.
-    int16_t unvoiced_scale = WebRtcSpl_NormW32(unvoiced_energy) - 3;
-    // Make sure we do an odd number of shifts since we already have 7 shifts
-    // from dividing with 128 earlier. This will make the total scale factor
-    // even, which is suitable for the sqrt.
-    unvoiced_scale += ((unvoiced_scale & 0x1) ^ 0x1);
-    unvoiced_energy = WEBRTC_SPL_SHIFT_W32(unvoiced_energy, unvoiced_scale);
-    int16_t unvoiced_gain =
-        static_cast<int16_t>(WebRtcSpl_SqrtFloor(unvoiced_energy));
-    parameters.ar_gain_scale = 13
-        + (unvoiced_scale + 7 - unvoiced_prescale) / 2;
-    parameters.ar_gain = unvoiced_gain;
-
-    // Calculate voice_mix_factor from corr_coefficient.
-    // Let x = corr_coefficient. Then, we compute:
-    // if (x > 0.48)
-    //   voice_mix_factor = (-5179 + 19931x - 16422x^2 + 5776x^3) / 4096;
-    // else
-    //   voice_mix_factor = 0;
-    if (corr_coefficient > 7875) {
-      int16_t x1, x2, x3;
-      // |corr_coefficient| is in Q14.
-      x1 = static_cast<int16_t>(corr_coefficient);
-      x2 = (x1 * x1) >> 14;   // Shift 14 to keep result in Q14.
-      x3 = (x1 * x2) >> 14;
-      static const int kCoefficients[4] = { -5179, 19931, -16422, 5776 };
-      int32_t temp_sum = kCoefficients[0] * 16384;
-      temp_sum += kCoefficients[1] * x1;
-      temp_sum += kCoefficients[2] * x2;
-      temp_sum += kCoefficients[3] * x3;
-      parameters.voice_mix_factor =
-          static_cast<int16_t>(std::min(temp_sum / 4096, 16384));
-      parameters.voice_mix_factor = std::max(parameters.voice_mix_factor,
-                                             static_cast<int16_t>(0));
-    } else {
-      parameters.voice_mix_factor = 0;
-    }
-
-    // Calculate muting slope. Reuse value from earlier scaling of
-    // |expand_vector0| and |expand_vector1|.
-    int16_t slope = amplitude_ratio;
-    if (slope > 12288) {
-      // slope > 1.5.
-      // Calculate (1 - (1 / slope)) / distortion_lag =
-      // (slope - 1) / (distortion_lag * slope).
-      // |slope| is in Q13, so 1 corresponds to 8192. Shift up to Q25 before
-      // the division.
-      // Shift the denominator from Q13 to Q5 before the division. The result of
-      // the division will then be in Q20.
-      int temp_ratio = WebRtcSpl_DivW32W16(
-          (slope - 8192) << 12,
-          static_cast<int16_t>((distortion_lag * slope) >> 8));
-      if (slope > 14746) {
-        // slope > 1.8.
-        // Divide by 2, with proper rounding.
-        parameters.mute_slope = (temp_ratio + 1) / 2;
-      } else {
-        // Divide by 8, with proper rounding.
-        parameters.mute_slope = (temp_ratio + 4) / 8;
-      }
-      parameters.onset = true;
-    } else {
-      // Calculate (1 - slope) / distortion_lag.
-      // Shift |slope| by 7 to Q20 before the division. The result is in Q20.
-      parameters.mute_slope = WebRtcSpl_DivW32W16(
-          (8192 - slope) * 128, static_cast<int16_t>(distortion_lag));
-      if (parameters.voice_mix_factor <= 13107) {
-        // Make sure the mute factor decreases from 1.0 to 0.9 in no more than
-        // 6.25 ms.
-        // mute_slope >= 0.005 / fs_mult in Q20.
-        parameters.mute_slope = std::max(5243 / fs_mult, parameters.mute_slope);
-      } else if (slope > 8028) {
-        parameters.mute_slope = 0;
-      }
-      parameters.onset = false;
-    }
-  }
-}
-
-Expand::ChannelParameters::ChannelParameters()
-    : mute_factor(16384),
-      ar_gain(0),
-      ar_gain_scale(0),
-      voice_mix_factor(0),
-      current_voice_mix_factor(0),
-      onset(false),
-      mute_slope(0) {
-  memset(ar_filter, 0, sizeof(ar_filter));
-  memset(ar_filter_state, 0, sizeof(ar_filter_state));
-}
-
-void Expand::Correlation(const int16_t* input,
-                         size_t input_length,
-                         int16_t* output) const {
-  // Set parameters depending on sample rate.
-  const int16_t* filter_coefficients;
-  size_t num_coefficients;
-  int16_t downsampling_factor;
-  if (fs_hz_ == 8000) {
-    num_coefficients = 3;
-    downsampling_factor = 2;
-    filter_coefficients = DspHelper::kDownsample8kHzTbl;
-  } else if (fs_hz_ == 16000) {
-    num_coefficients = 5;
-    downsampling_factor = 4;
-    filter_coefficients = DspHelper::kDownsample16kHzTbl;
-  } else if (fs_hz_ == 32000) {
-    num_coefficients = 7;
-    downsampling_factor = 8;
-    filter_coefficients = DspHelper::kDownsample32kHzTbl;
-  } else {  // fs_hz_ == 48000.
-    num_coefficients = 7;
-    downsampling_factor = 12;
-    filter_coefficients = DspHelper::kDownsample48kHzTbl;
-  }
-
-  // Correlate from lag 10 to lag 60 in downsampled domain.
-  // (Corresponds to 20-120 for narrow-band, 40-240 for wide-band, and so on.)
-  static const size_t kCorrelationStartLag = 10;
-  static const size_t kNumCorrelationLags = 54;
-  static const size_t kCorrelationLength = 60;
-  // Downsample to 4 kHz sample rate.
-  static const size_t kDownsampledLength = kCorrelationStartLag
-      + kNumCorrelationLags + kCorrelationLength;
-  int16_t downsampled_input[kDownsampledLength];
-  static const size_t kFilterDelay = 0;
-  WebRtcSpl_DownsampleFast(
-      input + input_length - kDownsampledLength * downsampling_factor,
-      kDownsampledLength * downsampling_factor, downsampled_input,
-      kDownsampledLength, filter_coefficients, num_coefficients,
-      downsampling_factor, kFilterDelay);
-
-  // Normalize |downsampled_input| to using all 16 bits.
-  int16_t max_value = WebRtcSpl_MaxAbsValueW16(downsampled_input,
-                                               kDownsampledLength);
-  int16_t norm_shift = 16 - WebRtcSpl_NormW32(max_value);
-  WebRtcSpl_VectorBitShiftW16(downsampled_input, kDownsampledLength,
-                              downsampled_input, norm_shift);
-
-  int32_t correlation[kNumCorrelationLags];
-  CrossCorrelationWithAutoShift(
-      &downsampled_input[kDownsampledLength - kCorrelationLength],
-      &downsampled_input[kDownsampledLength - kCorrelationLength
-          - kCorrelationStartLag],
-      kCorrelationLength, kNumCorrelationLags, -1, correlation);
-
-  // Normalize and move data from 32-bit to 16-bit vector.
-  int32_t max_correlation = WebRtcSpl_MaxAbsValueW32(correlation,
-                                                     kNumCorrelationLags);
-  int16_t norm_shift2 = static_cast<int16_t>(
-      std::max(18 - WebRtcSpl_NormW32(max_correlation), 0));
-  WebRtcSpl_VectorBitShiftW32ToW16(output, kNumCorrelationLags, correlation,
-                                   norm_shift2);
-}
-
-void Expand::UpdateLagIndex() {
-  current_lag_index_ = current_lag_index_ + lag_index_direction_;
-  // Change direction if needed.
-  if (current_lag_index_ <= 0) {
-    lag_index_direction_ = 1;
-  }
-  if (current_lag_index_ >= kNumLags - 1) {
-    lag_index_direction_ = -1;
-  }
-}
-
-Expand* ExpandFactory::Create(BackgroundNoise* background_noise,
-                              SyncBuffer* sync_buffer,
-                              RandomVector* random_vector,
-                              StatisticsCalculator* statistics,
-                              int fs,
-                              size_t num_channels) const {
-  return new Expand(background_noise, sync_buffer, random_vector, statistics,
-                    fs, num_channels);
-}
-
-// TODO(turajs): This can be moved to BackgroundNoise class.
-void Expand::GenerateBackgroundNoise(int16_t* random_vector,
-                                     size_t channel,
-                                     int mute_slope,
-                                     bool too_many_expands,
-                                     size_t num_noise_samples,
-                                     int16_t* buffer) {
-  static const size_t kNoiseLpcOrder = BackgroundNoise::kMaxLpcOrder;
-  int16_t scaled_random_vector[kMaxSampleRate / 8000 * 125];
-  assert(num_noise_samples <= (kMaxSampleRate / 8000 * 125));
-  int16_t* noise_samples = &buffer[kNoiseLpcOrder];
-  if (background_noise_->initialized()) {
-    // Use background noise parameters.
-    memcpy(noise_samples - kNoiseLpcOrder,
-           background_noise_->FilterState(channel),
-           sizeof(int16_t) * kNoiseLpcOrder);
-
-    int dc_offset = 0;
-    if (background_noise_->ScaleShift(channel) > 1) {
-      dc_offset = 1 << (background_noise_->ScaleShift(channel) - 1);
-    }
-
-    // Scale random vector to correct energy level.
-    WebRtcSpl_AffineTransformVector(
-        scaled_random_vector, random_vector,
-        background_noise_->Scale(channel), dc_offset,
-        background_noise_->ScaleShift(channel),
-        num_noise_samples);
-
-    WebRtcSpl_FilterARFastQ12(scaled_random_vector, noise_samples,
-                              background_noise_->Filter(channel),
-                              kNoiseLpcOrder + 1,
-                              num_noise_samples);
-
-    background_noise_->SetFilterState(
-        channel,
-        &(noise_samples[num_noise_samples - kNoiseLpcOrder]),
-        kNoiseLpcOrder);
-
-    // Unmute the background noise.
-    int16_t bgn_mute_factor = background_noise_->MuteFactor(channel);
-    NetEq::BackgroundNoiseMode bgn_mode = background_noise_->mode();
-    if (bgn_mode == NetEq::kBgnFade && too_many_expands &&
-        bgn_mute_factor > 0) {
-      // Fade BGN to zero.
-      // Calculate muting slope, approximately -2^18 / fs_hz.
-      int mute_slope;
-      if (fs_hz_ == 8000) {
-        mute_slope = -32;
-      } else if (fs_hz_ == 16000) {
-        mute_slope = -16;
-      } else if (fs_hz_ == 32000) {
-        mute_slope = -8;
-      } else {
-        mute_slope = -5;
-      }
-      // Use UnmuteSignal function with negative slope.
-      // |bgn_mute_factor| is in Q14. |mute_slope| is in Q20.
-      DspHelper::UnmuteSignal(noise_samples,
-                              num_noise_samples,
-                              &bgn_mute_factor,
-                              mute_slope,
-                              noise_samples);
-    } else if (bgn_mute_factor < 16384) {
-      // If mode is kBgnOn, or if kBgnFade has started fading,
-      // use regular |mute_slope|.
-      if (!stop_muting_ && bgn_mode != NetEq::kBgnOff &&
-          !(bgn_mode == NetEq::kBgnFade && too_many_expands)) {
-        DspHelper::UnmuteSignal(noise_samples,
-                                static_cast<int>(num_noise_samples),
-                                &bgn_mute_factor,
-                                mute_slope,
-                                noise_samples);
-      } else {
-        // kBgnOn and stop muting, or
-        // kBgnOff (mute factor is always 0), or
-        // kBgnFade has reached 0.
-        WebRtcSpl_AffineTransformVector(noise_samples, noise_samples,
-                                        bgn_mute_factor, 8192, 14,
-                                        num_noise_samples);
-      }
-    }
-    // Update mute_factor in BackgroundNoise class.
-    background_noise_->SetMuteFactor(channel, bgn_mute_factor);
-  } else {
-    // BGN parameters have not been initialized; use zero noise.
-    memset(noise_samples, 0, sizeof(int16_t) * num_noise_samples);
-  }
-}
-
-void Expand::GenerateRandomVector(int16_t seed_increment,
-                                  size_t length,
-                                  int16_t* random_vector) {
-  // TODO(turajs): According to hlundin The loop should not be needed. Should be
-  // just as good to generate all of the vector in one call.
-  size_t samples_generated = 0;
-  const size_t kMaxRandSamples = RandomVector::kRandomTableSize;
-  while (samples_generated < length) {
-    size_t rand_length = std::min(length - samples_generated, kMaxRandSamples);
-    random_vector_->IncreaseSeedIncrement(seed_increment);
-    random_vector_->Generate(rand_length, &random_vector[samples_generated]);
-    samples_generated += rand_length;
-  }
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/neteq/expand.h b/modules/audio_coding/neteq/expand.h
deleted file mode 100644
index af15432..0000000
--- a/modules/audio_coding/neteq/expand.h
+++ /dev/null
@@ -1,161 +0,0 @@
-/*
- *  Copyright (c) 2012 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_NETEQ_EXPAND_H_
-#define WEBRTC_MODULES_AUDIO_CODING_NETEQ_EXPAND_H_
-
-#include <assert.h>
-#include <memory>
-
-#include "webrtc/modules/audio_coding/neteq/audio_multi_vector.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-// Forward declarations.
-class BackgroundNoise;
-class RandomVector;
-class StatisticsCalculator;
-class SyncBuffer;
-
-// This class handles extrapolation of audio data from the sync_buffer to
-// produce packet-loss concealment.
-// TODO(hlundin): Refactor this class to divide the long methods into shorter
-// ones.
-class Expand {
- public:
-  Expand(BackgroundNoise* background_noise,
-         SyncBuffer* sync_buffer,
-         RandomVector* random_vector,
-         StatisticsCalculator* statistics,
-         int fs,
-         size_t num_channels);
-
-  virtual ~Expand();
-
-  // Resets the object.
-  virtual void Reset();
-
-  // The main method to produce concealment data. The data is appended to the
-  // end of |output|.
-  virtual int Process(AudioMultiVector* output);
-
-  // Prepare the object to do extra expansion during normal operation following
-  // a period of expands.
-  virtual void SetParametersForNormalAfterExpand();
-
-  // Prepare the object to do extra expansion during merge operation following
-  // a period of expands.
-  virtual void SetParametersForMergeAfterExpand();
-
-  // Returns the mute factor for |channel|.
-  int16_t MuteFactor(size_t channel) {
-    assert(channel < num_channels_);
-    return channel_parameters_[channel].mute_factor;
-  }
-
-  // Returns true if expansion has been faded down to zero amplitude (for all
-  // channels); false otherwise.
-  bool Muted() const;
-
-  // Accessors and mutators.
-  virtual size_t overlap_length() const;
-  size_t max_lag() const { return max_lag_; }
-
- protected:
-  static const int kMaxConsecutiveExpands = 200;
-  void GenerateRandomVector(int16_t seed_increment,
-                            size_t length,
-                            int16_t* random_vector);
-
-  void GenerateBackgroundNoise(int16_t* random_vector,
-                               size_t channel,
-                               int mute_slope,
-                               bool too_many_expands,
-                               size_t num_noise_samples,
-                               int16_t* buffer);
-
-  // Initializes member variables at the beginning of an expand period.
-  void InitializeForAnExpandPeriod();
-
-  bool TooManyExpands();
-
-  // Analyzes the signal history in |sync_buffer_|, and set up all parameters
-  // necessary to produce concealment data.
-  void AnalyzeSignal(int16_t* random_vector);
-
-  RandomVector* const random_vector_;
-  SyncBuffer* const sync_buffer_;
-  bool first_expand_;
-  const int fs_hz_;
-  const size_t num_channels_;
-  int consecutive_expands_;
-
- private:
-  static const size_t kUnvoicedLpcOrder = 6;
-  static const size_t kNumCorrelationCandidates = 3;
-  static const size_t kDistortionLength = 20;
-  static const size_t kLpcAnalysisLength = 160;
-  static const size_t kMaxSampleRate = 48000;
-  static const int kNumLags = 3;
-
-  struct ChannelParameters {
-    ChannelParameters();
-    int16_t mute_factor;
-    int16_t ar_filter[kUnvoicedLpcOrder + 1];
-    int16_t ar_filter_state[kUnvoicedLpcOrder];
-    int16_t ar_gain;
-    int16_t ar_gain_scale;
-    int16_t voice_mix_factor; /* Q14 */
-    int16_t current_voice_mix_factor; /* Q14 */
-    AudioVector expand_vector0;
-    AudioVector expand_vector1;
-    bool onset;
-    int mute_slope; /* Q20 */
-  };
-
-  // Calculate the auto-correlation of |input|, with length |input_length|
-  // samples. The correlation is calculated from a downsampled version of
-  // |input|, and is written to |output|.
-  void Correlation(const int16_t* input,
-                   size_t input_length,
-                   int16_t* output) const;
-
-  void UpdateLagIndex();
-
-  BackgroundNoise* const background_noise_;
-  StatisticsCalculator* const statistics_;
-  const size_t overlap_length_;
-  size_t max_lag_;
-  size_t expand_lags_[kNumLags];
-  int lag_index_direction_;
-  int current_lag_index_;
-  bool stop_muting_;
-  size_t expand_duration_samples_;
-  std::unique_ptr<ChannelParameters[]> channel_parameters_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(Expand);
-};
-
-struct ExpandFactory {
-  ExpandFactory() {}
-  virtual ~ExpandFactory() {}
-
-  virtual Expand* Create(BackgroundNoise* background_noise,
-                         SyncBuffer* sync_buffer,
-                         RandomVector* random_vector,
-                         StatisticsCalculator* statistics,
-                         int fs,
-                         size_t num_channels) const;
-};
-
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_AUDIO_CODING_NETEQ_EXPAND_H_
diff --git a/modules/audio_coding/neteq/expand_unittest.cc b/modules/audio_coding/neteq/expand_unittest.cc
deleted file mode 100644
index 40cb2eb..0000000
--- a/modules/audio_coding/neteq/expand_unittest.cc
+++ /dev/null
@@ -1,206 +0,0 @@
-/*
- *  Copyright (c) 2012 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.
- */
-
-// Unit tests for Expand class.
-
-#include "webrtc/modules/audio_coding/neteq/expand.h"
-
-#include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
-#include "webrtc/modules/audio_coding/neteq/background_noise.h"
-#include "webrtc/modules/audio_coding/neteq/random_vector.h"
-#include "webrtc/modules/audio_coding/neteq/statistics_calculator.h"
-#include "webrtc/modules/audio_coding/neteq/sync_buffer.h"
-#include "webrtc/modules/audio_coding/neteq/tools/resample_input_audio_file.h"
-#include "webrtc/rtc_base/safe_conversions.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/testsupport/fileutils.h"
-
-namespace webrtc {
-
-TEST(Expand, CreateAndDestroy) {
-  int fs = 8000;
-  size_t channels = 1;
-  BackgroundNoise bgn(channels);
-  SyncBuffer sync_buffer(1, 1000);
-  RandomVector random_vector;
-  StatisticsCalculator statistics;
-  Expand expand(&bgn, &sync_buffer, &random_vector, &statistics, fs, channels);
-}
-
-TEST(Expand, CreateUsingFactory) {
-  int fs = 8000;
-  size_t channels = 1;
-  BackgroundNoise bgn(channels);
-  SyncBuffer sync_buffer(1, 1000);
-  RandomVector random_vector;
-  StatisticsCalculator statistics;
-  ExpandFactory expand_factory;
-  Expand* expand = expand_factory.Create(&bgn, &sync_buffer, &random_vector,
-                                         &statistics, fs, channels);
-  EXPECT_TRUE(expand != NULL);
-  delete expand;
-}
-
-namespace {
-class FakeStatisticsCalculator : public StatisticsCalculator {
- public:
-  void LogDelayedPacketOutageEvent(int outage_duration_ms) override {
-    last_outage_duration_ms_ = outage_duration_ms;
-  }
-
-  int last_outage_duration_ms() const { return last_outage_duration_ms_; }
-
- private:
-  int last_outage_duration_ms_ = 0;
-};
-
-// This is the same size that is given to the SyncBuffer object in NetEq.
-const size_t kNetEqSyncBufferLengthMs = 720;
-}  // namespace
-
-class ExpandTest : public ::testing::Test {
- protected:
-  ExpandTest()
-      : input_file_(test::ResourcePath("audio_coding/testfile32kHz", "pcm"),
-                    32000),
-        test_sample_rate_hz_(32000),
-        num_channels_(1),
-        background_noise_(num_channels_),
-        sync_buffer_(num_channels_,
-                     kNetEqSyncBufferLengthMs * test_sample_rate_hz_ / 1000),
-        expand_(&background_noise_,
-                &sync_buffer_,
-                &random_vector_,
-                &statistics_,
-                test_sample_rate_hz_,
-                num_channels_) {
-    WebRtcSpl_Init();
-    input_file_.set_output_rate_hz(test_sample_rate_hz_);
-  }
-
-  void SetUp() override {
-    // Fast-forward the input file until there is speech (about 1.1 second into
-    // the file).
-    const size_t speech_start_samples =
-        static_cast<size_t>(test_sample_rate_hz_ * 1.1f);
-    ASSERT_TRUE(input_file_.Seek(speech_start_samples));
-
-    // Pre-load the sync buffer with speech data.
-    std::unique_ptr<int16_t[]> temp(new int16_t[sync_buffer_.Size()]);
-    ASSERT_TRUE(input_file_.Read(sync_buffer_.Size(), temp.get()));
-    sync_buffer_.Channel(0).OverwriteAt(temp.get(), sync_buffer_.Size(), 0);
-    ASSERT_EQ(1u, num_channels_) << "Fix: Must populate all channels.";
-  }
-
-  test::ResampleInputAudioFile input_file_;
-  int test_sample_rate_hz_;
-  size_t num_channels_;
-  BackgroundNoise background_noise_;
-  SyncBuffer sync_buffer_;
-  RandomVector random_vector_;
-  FakeStatisticsCalculator statistics_;
-  Expand expand_;
-};
-
-// This test calls the expand object to produce concealment data a few times,
-// and then ends by calling SetParametersForNormalAfterExpand. This simulates
-// the situation where the packet next up for decoding was just delayed, not
-// lost.
-TEST_F(ExpandTest, DelayedPacketOutage) {
-  AudioMultiVector output(num_channels_);
-  size_t sum_output_len_samples = 0;
-  for (int i = 0; i < 10; ++i) {
-    EXPECT_EQ(0, expand_.Process(&output));
-    EXPECT_GT(output.Size(), 0u);
-    sum_output_len_samples += output.Size();
-    EXPECT_EQ(0, statistics_.last_outage_duration_ms());
-  }
-  expand_.SetParametersForNormalAfterExpand();
-  // Convert |sum_output_len_samples| to milliseconds.
-  EXPECT_EQ(rtc::checked_cast<int>(sum_output_len_samples /
-                                   (test_sample_rate_hz_ / 1000)),
-            statistics_.last_outage_duration_ms());
-}
-
-// This test is similar to DelayedPacketOutage, but ends by calling
-// SetParametersForMergeAfterExpand. This simulates the situation where the
-// packet next up for decoding was actually lost (or at least a later packet
-// arrived before it).
-TEST_F(ExpandTest, LostPacketOutage) {
-  AudioMultiVector output(num_channels_);
-  size_t sum_output_len_samples = 0;
-  for (int i = 0; i < 10; ++i) {
-    EXPECT_EQ(0, expand_.Process(&output));
-    EXPECT_GT(output.Size(), 0u);
-    sum_output_len_samples += output.Size();
-    EXPECT_EQ(0, statistics_.last_outage_duration_ms());
-  }
-  expand_.SetParametersForMergeAfterExpand();
-  EXPECT_EQ(0, statistics_.last_outage_duration_ms());
-}
-
-// This test is similar to the DelayedPacketOutage test above, but with the
-// difference that Expand::Reset() is called after 5 calls to Expand::Process().
-// This should reset the statistics, and will in the end lead to an outage of
-// 5 periods instead of 10.
-TEST_F(ExpandTest, CheckOutageStatsAfterReset) {
-  AudioMultiVector output(num_channels_);
-  size_t sum_output_len_samples = 0;
-  for (int i = 0; i < 10; ++i) {
-    EXPECT_EQ(0, expand_.Process(&output));
-    EXPECT_GT(output.Size(), 0u);
-    sum_output_len_samples += output.Size();
-    if (i == 5) {
-      expand_.Reset();
-      sum_output_len_samples = 0;
-    }
-    EXPECT_EQ(0, statistics_.last_outage_duration_ms());
-  }
-  expand_.SetParametersForNormalAfterExpand();
-  // Convert |sum_output_len_samples| to milliseconds.
-  EXPECT_EQ(rtc::checked_cast<int>(sum_output_len_samples /
-                                   (test_sample_rate_hz_ / 1000)),
-            statistics_.last_outage_duration_ms());
-}
-
-namespace {
-// Runs expand until Muted() returns true. Times out after 1000 calls.
-void ExpandUntilMuted(size_t num_channels, Expand* expand) {
-  EXPECT_FALSE(expand->Muted()) << "Instance is muted from the start";
-  AudioMultiVector output(num_channels);
-  int num_calls = 0;
-  while (!expand->Muted()) {
-    ASSERT_LT(num_calls++, 1000) << "Test timed out";
-    EXPECT_EQ(0, expand->Process(&output));
-  }
-}
-}  // namespace
-
-// Verifies that Muted() returns true after a long expand period. Also verifies
-// that Muted() is reset to false after calling Reset(),
-// SetParametersForMergeAfterExpand() and SetParametersForNormalAfterExpand().
-TEST_F(ExpandTest, Muted) {
-  ExpandUntilMuted(num_channels_, &expand_);
-  expand_.Reset();
-  EXPECT_FALSE(expand_.Muted());  // Should be back to unmuted.
-
-  ExpandUntilMuted(num_channels_, &expand_);
-  expand_.SetParametersForMergeAfterExpand();
-  EXPECT_FALSE(expand_.Muted());  // Should be back to unmuted.
-
-  expand_.Reset();  // Must reset in order to start a new expand period.
-  ExpandUntilMuted(num_channels_, &expand_);
-  expand_.SetParametersForNormalAfterExpand();
-  EXPECT_FALSE(expand_.Muted());  // Should be back to unmuted.
-}
-
-// TODO(hlundin): Write more tests.
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/neteq/include/neteq.h b/modules/audio_coding/neteq/include/neteq.h
deleted file mode 100644
index 9f5af7c..0000000
--- a/modules/audio_coding/neteq/include/neteq.h
+++ /dev/null
@@ -1,314 +0,0 @@
-/*
- *  Copyright (c) 2012 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_NETEQ_INCLUDE_NETEQ_H_
-#define WEBRTC_MODULES_AUDIO_CODING_NETEQ_INCLUDE_NETEQ_H_
-
-#include <string.h>  // Provide access to size_t.
-
-#include <string>
-#include <vector>
-
-#include "webrtc/api/optional.h"
-#include "webrtc/common_types.h"
-#include "webrtc/modules/audio_coding/neteq/audio_decoder_impl.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/scoped_ref_ptr.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-// Forward declarations.
-class AudioFrame;
-class AudioDecoderFactory;
-
-struct NetEqNetworkStatistics {
-  uint16_t current_buffer_size_ms;  // Current jitter buffer size in ms.
-  uint16_t preferred_buffer_size_ms;  // Target buffer size in ms.
-  uint16_t jitter_peaks_found;  // 1 if adding extra delay due to peaky
-                                // jitter; 0 otherwise.
-  uint16_t packet_loss_rate;  // Loss rate (network + late) in Q14.
-  uint16_t expand_rate;  // Fraction (of original stream) of synthesized
-                         // audio inserted through expansion (in Q14).
-  uint16_t speech_expand_rate;  // Fraction (of original stream) of synthesized
-                                // speech inserted through expansion (in Q14).
-  uint16_t preemptive_rate;  // Fraction of data inserted through pre-emptive
-                             // expansion (in Q14).
-  uint16_t accelerate_rate;  // Fraction of data removed through acceleration
-                             // (in Q14).
-  uint16_t secondary_decoded_rate;  // Fraction of data coming from FEC/RED
-                                    // decoding (in Q14).
-  uint16_t secondary_discarded_rate;  // Fraction of discarded FEC/RED data (in
-                                      // Q14).
-  int32_t clockdrift_ppm;  // Average clock-drift in parts-per-million
-                           // (positive or negative).
-  size_t added_zero_samples;  // Number of zero samples added in "off" mode.
-  // Statistics for packet waiting times, i.e., the time between a packet
-  // arrives until it is decoded.
-  int mean_waiting_time_ms;
-  int median_waiting_time_ms;
-  int min_waiting_time_ms;
-  int max_waiting_time_ms;
-};
-
-// NetEq statistics that persist over the lifetime of the class.
-// These metrics are never reset.
-struct NetEqLifetimeStatistics {
-  // Total number of audio samples received, including synthesized samples.
-  // https://w3c.github.io/webrtc-stats/#dom-rtcmediastreamtrackstats-totalsamplesreceived
-  uint64_t total_samples_received = 0;
-  // Total number of inbound audio samples that are based on synthesized data to
-  // conceal packet loss.
-  // https://w3c.github.io/webrtc-stats/#dom-rtcmediastreamtrackstats-concealedsamples
-  uint64_t concealed_samples = 0;
-};
-
-enum NetEqPlayoutMode {
-  kPlayoutOn,
-  kPlayoutOff,
-  kPlayoutFax,
-  kPlayoutStreaming
-};
-
-// This is the interface class for NetEq.
-class NetEq {
- public:
-  enum BackgroundNoiseMode {
-    kBgnOn,    // Default behavior with eternal noise.
-    kBgnFade,  // Noise fades to zero after some time.
-    kBgnOff    // Background noise is always zero.
-  };
-
-  struct Config {
-    Config()
-        : sample_rate_hz(16000),
-          enable_post_decode_vad(false),
-          max_packets_in_buffer(50),
-          // |max_delay_ms| has the same effect as calling SetMaximumDelay().
-          max_delay_ms(2000),
-          background_noise_mode(kBgnOff),
-          playout_mode(kPlayoutOn),
-          enable_fast_accelerate(false) {}
-
-    std::string ToString() const;
-
-    int sample_rate_hz;  // Initial value. Will change with input data.
-    bool enable_post_decode_vad;
-    size_t max_packets_in_buffer;
-    int max_delay_ms;
-    BackgroundNoiseMode background_noise_mode;
-    NetEqPlayoutMode playout_mode;
-    bool enable_fast_accelerate;
-    bool enable_muted_state = false;
-  };
-
-  enum ReturnCodes {
-    kOK = 0,
-    kFail = -1,
-    kNotImplemented = -2
-  };
-
-  // Creates a new NetEq object, with parameters set in |config|. The |config|
-  // object will only have to be valid for the duration of the call to this
-  // method.
-  static NetEq* Create(
-      const NetEq::Config& config,
-      const rtc::scoped_refptr<AudioDecoderFactory>& decoder_factory);
-
-  virtual ~NetEq() {}
-
-  // Inserts a new packet into NetEq. The |receive_timestamp| is an indication
-  // of the time when the packet was received, and should be measured with
-  // the same tick rate as the RTP timestamp of the current payload.
-  // Returns 0 on success, -1 on failure.
-  virtual int InsertPacket(const RTPHeader& rtp_header,
-                           rtc::ArrayView<const uint8_t> payload,
-                           uint32_t receive_timestamp) = 0;
-
-  // Lets NetEq know that a packet arrived with an empty payload. This typically
-  // happens when empty packets are used for probing the network channel, and
-  // these packets use RTP sequence numbers from the same series as the actual
-  // audio packets.
-  virtual void InsertEmptyPacket(const RTPHeader& rtp_header) = 0;
-
-  // Instructs NetEq to deliver 10 ms of audio data. The data is written to
-  // |audio_frame|. All data in |audio_frame| is wiped; |data_|, |speech_type_|,
-  // |num_channels_|, |sample_rate_hz_|, |samples_per_channel_|, and
-  // |vad_activity_| are updated upon success. If an error is returned, some
-  // fields may not have been updated, or may contain inconsistent values.
-  // If muted state is enabled (through Config::enable_muted_state), |muted|
-  // may be set to true after a prolonged expand period. When this happens, the
-  // |data_| in |audio_frame| is not written, but should be interpreted as being
-  // all zeros.
-  // Returns kOK on success, or kFail in case of an error.
-  virtual int GetAudio(AudioFrame* audio_frame, bool* muted) = 0;
-
-  // Replaces the current set of decoders with the given one.
-  virtual void SetCodecs(const std::map<int, SdpAudioFormat>& codecs) = 0;
-
-  // Associates |rtp_payload_type| with |codec| and |codec_name|, and stores the
-  // information in the codec database. Returns 0 on success, -1 on failure.
-  // The name is only used to provide information back to the caller about the
-  // decoders. Hence, the name is arbitrary, and may be empty.
-  virtual int RegisterPayloadType(NetEqDecoder codec,
-                                  const std::string& codec_name,
-                                  uint8_t rtp_payload_type) = 0;
-
-  // Provides an externally created decoder object |decoder| to insert in the
-  // decoder database. The decoder implements a decoder of type |codec| and
-  // associates it with |rtp_payload_type| and |codec_name|. Returns kOK on
-  // success, kFail on failure. The name is only used to provide information
-  // back to the caller about the decoders. Hence, the name is arbitrary, and
-  // may be empty.
-  virtual int RegisterExternalDecoder(AudioDecoder* decoder,
-                                      NetEqDecoder codec,
-                                      const std::string& codec_name,
-                                      uint8_t rtp_payload_type) = 0;
-
-  // Associates |rtp_payload_type| with the given codec, which NetEq will
-  // instantiate when it needs it. Returns true iff successful.
-  virtual bool RegisterPayloadType(int rtp_payload_type,
-                                   const SdpAudioFormat& audio_format) = 0;
-
-  // Removes |rtp_payload_type| from the codec database. Returns 0 on success,
-  // -1 on failure. Removing a payload type that is not registered is ok and
-  // will not result in an error.
-  virtual int RemovePayloadType(uint8_t rtp_payload_type) = 0;
-
-  // Removes all payload types from the codec database.
-  virtual void RemoveAllPayloadTypes() = 0;
-
-  // Sets a minimum delay in millisecond for packet buffer. The minimum is
-  // maintained unless a higher latency is dictated by channel condition.
-  // Returns true if the minimum is successfully applied, otherwise false is
-  // returned.
-  virtual bool SetMinimumDelay(int delay_ms) = 0;
-
-  // Sets a maximum delay in milliseconds for packet buffer. The latency will
-  // not exceed the given value, even required delay (given the channel
-  // conditions) is higher. Calling this method has the same effect as setting
-  // the |max_delay_ms| value in the NetEq::Config struct.
-  virtual bool SetMaximumDelay(int delay_ms) = 0;
-
-  // The smallest latency required. This is computed bases on inter-arrival
-  // time and internal NetEq logic. Note that in computing this latency none of
-  // the user defined limits (applied by calling setMinimumDelay() and/or
-  // SetMaximumDelay()) are applied.
-  virtual int LeastRequiredDelayMs() const = 0;
-
-  // Not implemented.
-  virtual int SetTargetDelay() = 0;
-
-  // Returns the current target delay in ms. This includes any extra delay
-  // requested through SetMinimumDelay.
-  virtual int TargetDelayMs() = 0;
-
-  // Returns the current total delay (packet buffer and sync buffer) in ms.
-  virtual int CurrentDelayMs() const = 0;
-
-  // Returns the current total delay (packet buffer and sync buffer) in ms,
-  // with smoothing applied to even out short-time fluctuations due to jitter.
-  // The packet buffer part of the delay is not updated during DTX/CNG periods.
-  virtual int FilteredCurrentDelayMs() const = 0;
-
-  // Sets the playout mode to |mode|.
-  // Deprecated. Set the mode in the Config struct passed to the constructor.
-  // TODO(henrik.lundin) Delete.
-  virtual void SetPlayoutMode(NetEqPlayoutMode mode) = 0;
-
-  // Returns the current playout mode.
-  // Deprecated.
-  // TODO(henrik.lundin) Delete.
-  virtual NetEqPlayoutMode PlayoutMode() const = 0;
-
-  // Writes the current network statistics to |stats|. The statistics are reset
-  // after the call.
-  virtual int NetworkStatistics(NetEqNetworkStatistics* stats) = 0;
-
-  // Returns a copy of this class's lifetime statistics. These statistics are
-  // never reset.
-  virtual NetEqLifetimeStatistics GetLifetimeStatistics() const = 0;
-
-  // Writes the current RTCP statistics to |stats|. The statistics are reset
-  // and a new report period is started with the call.
-  virtual void GetRtcpStatistics(RtcpStatistics* stats) = 0;
-
-  // Same as RtcpStatistics(), but does not reset anything.
-  virtual void GetRtcpStatisticsNoReset(RtcpStatistics* stats) = 0;
-
-  // Enables post-decode VAD. When enabled, GetAudio() will return
-  // kOutputVADPassive when the signal contains no speech.
-  virtual void EnableVad() = 0;
-
-  // Disables post-decode VAD.
-  virtual void DisableVad() = 0;
-
-  // Returns the RTP timestamp for the last sample delivered by GetAudio().
-  // The return value will be empty if no valid timestamp is available.
-  virtual rtc::Optional<uint32_t> GetPlayoutTimestamp() const = 0;
-
-  // Returns the sample rate in Hz of the audio produced in the last GetAudio
-  // call. If GetAudio has not been called yet, the configured sample rate
-  // (Config::sample_rate_hz) is returned.
-  virtual int last_output_sample_rate_hz() const = 0;
-
-  // Returns info about the decoder for the given payload type, or an empty
-  // value if we have no decoder for that payload type.
-  virtual rtc::Optional<CodecInst> GetDecoder(int payload_type) const = 0;
-
-  // Returns the decoder format for the given payload type. Returns empty if no
-  // such payload type was registered.
-  virtual rtc::Optional<SdpAudioFormat> GetDecoderFormat(
-      int payload_type) const = 0;
-
-  // Not implemented.
-  virtual int SetTargetNumberOfChannels() = 0;
-
-  // Not implemented.
-  virtual int SetTargetSampleRate() = 0;
-
-  // Flushes both the packet buffer and the sync buffer.
-  virtual void FlushBuffers() = 0;
-
-  // Current usage of packet-buffer and it's limits.
-  virtual void PacketBufferStatistics(int* current_num_packets,
-                                      int* max_num_packets) const = 0;
-
-  // Enables NACK and sets the maximum size of the NACK list, which should be
-  // positive and no larger than Nack::kNackListSizeLimit. If NACK is already
-  // enabled then the maximum NACK list size is modified accordingly.
-  virtual void EnableNack(size_t max_nack_list_size) = 0;
-
-  virtual void DisableNack() = 0;
-
-  // Returns a list of RTP sequence numbers corresponding to packets to be
-  // retransmitted, given an estimate of the round-trip time in milliseconds.
-  virtual std::vector<uint16_t> GetNackList(
-      int64_t round_trip_time_ms) const = 0;
-
-  // Returns a vector containing the timestamps of the packets that were decoded
-  // in the last GetAudio call. If no packets were decoded in the last call, the
-  // vector is empty.
-  // Mainly intended for testing.
-  virtual std::vector<uint32_t> LastDecodedTimestamps() const = 0;
-
-  // Returns the length of the audio yet to play in the sync buffer.
-  // Mainly intended for testing.
-  virtual int SyncBufferSizeMs() const = 0;
-
- protected:
-  NetEq() {}
-
- private:
-  RTC_DISALLOW_COPY_AND_ASSIGN(NetEq);
-};
-
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_AUDIO_CODING_NETEQ_INCLUDE_NETEQ_H_
diff --git a/modules/audio_coding/neteq/merge.cc b/modules/audio_coding/neteq/merge.cc
deleted file mode 100644
index df4f792..0000000
--- a/modules/audio_coding/neteq/merge.cc
+++ /dev/null
@@ -1,381 +0,0 @@
-/*
- *  Copyright (c) 2012 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/neteq/merge.h"
-
-#include <assert.h>
-#include <string.h>  // memmove, memcpy, memset, size_t
-
-#include <algorithm>  // min, max
-#include <memory>
-
-#include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
-#include "webrtc/modules/audio_coding/neteq/audio_multi_vector.h"
-#include "webrtc/modules/audio_coding/neteq/cross_correlation.h"
-#include "webrtc/modules/audio_coding/neteq/dsp_helper.h"
-#include "webrtc/modules/audio_coding/neteq/expand.h"
-#include "webrtc/modules/audio_coding/neteq/sync_buffer.h"
-#include "webrtc/rtc_base/safe_conversions.h"
-#include "webrtc/rtc_base/safe_minmax.h"
-
-namespace webrtc {
-
-Merge::Merge(int fs_hz,
-             size_t num_channels,
-             Expand* expand,
-             SyncBuffer* sync_buffer)
-    : fs_hz_(fs_hz),
-      num_channels_(num_channels),
-      fs_mult_(fs_hz_ / 8000),
-      timestamps_per_call_(static_cast<size_t>(fs_hz_ / 100)),
-      expand_(expand),
-      sync_buffer_(sync_buffer),
-      expanded_(num_channels_) {
-  assert(num_channels_ > 0);
-}
-
-Merge::~Merge() = default;
-
-size_t Merge::Process(int16_t* input, size_t input_length,
-                      int16_t* external_mute_factor_array,
-                      AudioMultiVector* output) {
-  // TODO(hlundin): Change to an enumerator and skip assert.
-  assert(fs_hz_ == 8000 || fs_hz_ == 16000 || fs_hz_ ==  32000 ||
-         fs_hz_ == 48000);
-  assert(fs_hz_ <= kMaxSampleRate);  // Should not be possible.
-
-  size_t old_length;
-  size_t expand_period;
-  // Get expansion data to overlap and mix with.
-  size_t expanded_length = GetExpandedSignal(&old_length, &expand_period);
-
-  // Transfer input signal to an AudioMultiVector.
-  AudioMultiVector input_vector(num_channels_);
-  input_vector.PushBackInterleaved(input, input_length);
-  size_t input_length_per_channel = input_vector.Size();
-  assert(input_length_per_channel == input_length / num_channels_);
-
-  size_t best_correlation_index = 0;
-  size_t output_length = 0;
-
-  std::unique_ptr<int16_t[]> input_channel(
-      new int16_t[input_length_per_channel]);
-  std::unique_ptr<int16_t[]> expanded_channel(new int16_t[expanded_length]);
-  for (size_t channel = 0; channel < num_channels_; ++channel) {
-    input_vector[channel].CopyTo(
-        input_length_per_channel, 0, input_channel.get());
-    expanded_[channel].CopyTo(expanded_length, 0, expanded_channel.get());
-
-    int16_t new_mute_factor = SignalScaling(
-        input_channel.get(), input_length_per_channel, expanded_channel.get());
-
-    // Adjust muting factor (product of "main" muting factor and expand muting
-    // factor).
-    int16_t* external_mute_factor = &external_mute_factor_array[channel];
-    *external_mute_factor =
-        (*external_mute_factor * expand_->MuteFactor(channel)) >> 14;
-
-    // Update |external_mute_factor| if it is lower than |new_mute_factor|.
-    if (new_mute_factor > *external_mute_factor) {
-      *external_mute_factor = std::min(new_mute_factor,
-                                       static_cast<int16_t>(16384));
-    }
-
-    if (channel == 0) {
-      // Downsample, correlate, and find strongest correlation period for the
-      // master (i.e., first) channel only.
-      // Downsample to 4kHz sample rate.
-      Downsample(input_channel.get(), input_length_per_channel,
-                 expanded_channel.get(), expanded_length);
-
-      // Calculate the lag of the strongest correlation period.
-      best_correlation_index = CorrelateAndPeakSearch(
-          old_length, input_length_per_channel, expand_period);
-    }
-
-    temp_data_.resize(input_length_per_channel + best_correlation_index);
-    int16_t* decoded_output = temp_data_.data() + best_correlation_index;
-
-    // Mute the new decoded data if needed (and unmute it linearly).
-    // This is the overlapping part of expanded_signal.
-    size_t interpolation_length = std::min(
-        kMaxCorrelationLength * fs_mult_,
-        expanded_length - best_correlation_index);
-    interpolation_length = std::min(interpolation_length,
-                                    input_length_per_channel);
-    if (*external_mute_factor < 16384) {
-      // Set a suitable muting slope (Q20). 0.004 for NB, 0.002 for WB,
-      // and so on.
-      int increment = 4194 / fs_mult_;
-      *external_mute_factor =
-          static_cast<int16_t>(DspHelper::RampSignal(input_channel.get(),
-                                                     interpolation_length,
-                                                     *external_mute_factor,
-                                                     increment));
-      DspHelper::UnmuteSignal(&input_channel[interpolation_length],
-                              input_length_per_channel - interpolation_length,
-                              external_mute_factor, increment,
-                              &decoded_output[interpolation_length]);
-    } else {
-      // No muting needed.
-      memmove(
-          &decoded_output[interpolation_length],
-          &input_channel[interpolation_length],
-          sizeof(int16_t) * (input_length_per_channel - interpolation_length));
-    }
-
-    // Do overlap and mix linearly.
-    int16_t increment =
-        static_cast<int16_t>(16384 / (interpolation_length + 1));  // In Q14.
-    int16_t mute_factor = 16384 - increment;
-    memmove(temp_data_.data(), expanded_channel.get(),
-            sizeof(int16_t) * best_correlation_index);
-    DspHelper::CrossFade(&expanded_channel[best_correlation_index],
-                         input_channel.get(), interpolation_length,
-                         &mute_factor, increment, decoded_output);
-
-    output_length = best_correlation_index + input_length_per_channel;
-    if (channel == 0) {
-      assert(output->Empty());  // Output should be empty at this point.
-      output->AssertSize(output_length);
-    } else {
-      assert(output->Size() == output_length);
-    }
-    (*output)[channel].OverwriteAt(temp_data_.data(), output_length, 0);
-  }
-
-  // Copy back the first part of the data to |sync_buffer_| and remove it from
-  // |output|.
-  sync_buffer_->ReplaceAtIndex(*output, old_length, sync_buffer_->next_index());
-  output->PopFront(old_length);
-
-  // Return new added length. |old_length| samples were borrowed from
-  // |sync_buffer_|.
-  RTC_DCHECK_GE(output_length, old_length);
-  return output_length - old_length;
-}
-
-size_t Merge::GetExpandedSignal(size_t* old_length, size_t* expand_period) {
-  // Check how much data that is left since earlier.
-  *old_length = sync_buffer_->FutureLength();
-  // Should never be less than overlap_length.
-  assert(*old_length >= expand_->overlap_length());
-  // Generate data to merge the overlap with using expand.
-  expand_->SetParametersForMergeAfterExpand();
-
-  if (*old_length >= 210 * kMaxSampleRate / 8000) {
-    // TODO(hlundin): Write test case for this.
-    // The number of samples available in the sync buffer is more than what fits
-    // in expanded_signal. Keep the first 210 * kMaxSampleRate / 8000 samples,
-    // but shift them towards the end of the buffer. This is ok, since all of
-    // the buffer will be expand data anyway, so as long as the beginning is
-    // left untouched, we're fine.
-    size_t length_diff = *old_length - 210 * kMaxSampleRate / 8000;
-    sync_buffer_->InsertZerosAtIndex(length_diff, sync_buffer_->next_index());
-    *old_length = 210 * kMaxSampleRate / 8000;
-    // This is the truncated length.
-  }
-  // This assert should always be true thanks to the if statement above.
-  assert(210 * kMaxSampleRate / 8000 >= *old_length);
-
-  AudioMultiVector expanded_temp(num_channels_);
-  expand_->Process(&expanded_temp);
-  *expand_period = expanded_temp.Size();  // Samples per channel.
-
-  expanded_.Clear();
-  // Copy what is left since earlier into the expanded vector.
-  expanded_.PushBackFromIndex(*sync_buffer_, sync_buffer_->next_index());
-  assert(expanded_.Size() == *old_length);
-  assert(expanded_temp.Size() > 0);
-  // Do "ugly" copy and paste from the expanded in order to generate more data
-  // to correlate (but not interpolate) with.
-  const size_t required_length = static_cast<size_t>((120 + 80 + 2) * fs_mult_);
-  if (expanded_.Size() < required_length) {
-    while (expanded_.Size() < required_length) {
-      // Append one more pitch period each time.
-      expanded_.PushBack(expanded_temp);
-    }
-    // Trim the length to exactly |required_length|.
-    expanded_.PopBack(expanded_.Size() - required_length);
-  }
-  assert(expanded_.Size() >= required_length);
-  return required_length;
-}
-
-int16_t Merge::SignalScaling(const int16_t* input, size_t input_length,
-                             const int16_t* expanded_signal) const {
-  // Adjust muting factor if new vector is more or less of the BGN energy.
-  const auto mod_input_length = rtc::SafeMin<size_t>(
-      64 * rtc::dchecked_cast<size_t>(fs_mult_), input_length);
-  const int16_t expanded_max =
-      WebRtcSpl_MaxAbsValueW16(expanded_signal, mod_input_length);
-  int32_t factor = (expanded_max * expanded_max) /
-      (std::numeric_limits<int32_t>::max() /
-          static_cast<int32_t>(mod_input_length));
-  const int expanded_shift = factor == 0 ? 0 : 31 - WebRtcSpl_NormW32(factor);
-  int32_t energy_expanded = WebRtcSpl_DotProductWithScale(expanded_signal,
-                                                          expanded_signal,
-                                                          mod_input_length,
-                                                          expanded_shift);
-
-  // Calculate energy of input signal.
-  const int16_t input_max = WebRtcSpl_MaxAbsValueW16(input, mod_input_length);
-  factor = (input_max * input_max) / (std::numeric_limits<int32_t>::max() /
-      static_cast<int32_t>(mod_input_length));
-  const int input_shift = factor == 0 ? 0 : 31 - WebRtcSpl_NormW32(factor);
-  int32_t energy_input = WebRtcSpl_DotProductWithScale(input, input,
-                                                       mod_input_length,
-                                                       input_shift);
-
-  // Align to the same Q-domain.
-  if (input_shift > expanded_shift) {
-    energy_expanded = energy_expanded >> (input_shift - expanded_shift);
-  } else {
-    energy_input = energy_input >> (expanded_shift - input_shift);
-  }
-
-  // Calculate muting factor to use for new frame.
-  int16_t mute_factor;
-  if (energy_input > energy_expanded) {
-    // Normalize |energy_input| to 14 bits.
-    int16_t temp_shift = WebRtcSpl_NormW32(energy_input) - 17;
-    energy_input = WEBRTC_SPL_SHIFT_W32(energy_input, temp_shift);
-    // Put |energy_expanded| in a domain 14 higher, so that
-    // energy_expanded / energy_input is in Q14.
-    energy_expanded = WEBRTC_SPL_SHIFT_W32(energy_expanded, temp_shift + 14);
-    // Calculate sqrt(energy_expanded / energy_input) in Q14.
-    mute_factor = static_cast<int16_t>(
-        WebRtcSpl_SqrtFloor((energy_expanded / energy_input) << 14));
-  } else {
-    // Set to 1 (in Q14) when |expanded| has higher energy than |input|.
-    mute_factor = 16384;
-  }
-
-  return mute_factor;
-}
-
-// TODO(hlundin): There are some parameter values in this method that seem
-// strange. Compare with Expand::Correlation.
-void Merge::Downsample(const int16_t* input, size_t input_length,
-                       const int16_t* expanded_signal, size_t expanded_length) {
-  const int16_t* filter_coefficients;
-  size_t num_coefficients;
-  int decimation_factor = fs_hz_ / 4000;
-  static const size_t kCompensateDelay = 0;
-  size_t length_limit = static_cast<size_t>(fs_hz_ / 100);  // 10 ms in samples.
-  if (fs_hz_ == 8000) {
-    filter_coefficients = DspHelper::kDownsample8kHzTbl;
-    num_coefficients = 3;
-  } else if (fs_hz_ == 16000) {
-    filter_coefficients = DspHelper::kDownsample16kHzTbl;
-    num_coefficients = 5;
-  } else if (fs_hz_ == 32000) {
-    filter_coefficients = DspHelper::kDownsample32kHzTbl;
-    num_coefficients = 7;
-  } else {  // fs_hz_ == 48000
-    filter_coefficients = DspHelper::kDownsample48kHzTbl;
-    num_coefficients = 7;
-  }
-  size_t signal_offset = num_coefficients - 1;
-  WebRtcSpl_DownsampleFast(&expanded_signal[signal_offset],
-                           expanded_length - signal_offset,
-                           expanded_downsampled_, kExpandDownsampLength,
-                           filter_coefficients, num_coefficients,
-                           decimation_factor, kCompensateDelay);
-  if (input_length <= length_limit) {
-    // Not quite long enough, so we have to cheat a bit.
-    size_t temp_len = input_length - signal_offset;
-    // TODO(hlundin): Should |downsamp_temp_len| be corrected for round-off
-    // errors? I.e., (temp_len + decimation_factor - 1) / decimation_factor?
-    size_t downsamp_temp_len = temp_len / decimation_factor;
-    WebRtcSpl_DownsampleFast(&input[signal_offset], temp_len,
-                             input_downsampled_, downsamp_temp_len,
-                             filter_coefficients, num_coefficients,
-                             decimation_factor, kCompensateDelay);
-    memset(&input_downsampled_[downsamp_temp_len], 0,
-           sizeof(int16_t) * (kInputDownsampLength - downsamp_temp_len));
-  } else {
-    WebRtcSpl_DownsampleFast(&input[signal_offset],
-                             input_length - signal_offset, input_downsampled_,
-                             kInputDownsampLength, filter_coefficients,
-                             num_coefficients, decimation_factor,
-                             kCompensateDelay);
-  }
-}
-
-size_t Merge::CorrelateAndPeakSearch(size_t start_position, size_t input_length,
-                                     size_t expand_period) const {
-  // Calculate correlation without any normalization.
-  const size_t max_corr_length = kMaxCorrelationLength;
-  size_t stop_position_downsamp =
-      std::min(max_corr_length, expand_->max_lag() / (fs_mult_ * 2) + 1);
-
-  int32_t correlation[kMaxCorrelationLength];
-  CrossCorrelationWithAutoShift(input_downsampled_, expanded_downsampled_,
-                                kInputDownsampLength, stop_position_downsamp, 1,
-                                correlation);
-
-  // Normalize correlation to 14 bits and copy to a 16-bit array.
-  const size_t pad_length = expand_->overlap_length() - 1;
-  const size_t correlation_buffer_size = 2 * pad_length + kMaxCorrelationLength;
-  std::unique_ptr<int16_t[]> correlation16(
-      new int16_t[correlation_buffer_size]);
-  memset(correlation16.get(), 0, correlation_buffer_size * sizeof(int16_t));
-  int16_t* correlation_ptr = &correlation16[pad_length];
-  int32_t max_correlation = WebRtcSpl_MaxAbsValueW32(correlation,
-                                                     stop_position_downsamp);
-  int norm_shift = std::max(0, 17 - WebRtcSpl_NormW32(max_correlation));
-  WebRtcSpl_VectorBitShiftW32ToW16(correlation_ptr, stop_position_downsamp,
-                                   correlation, norm_shift);
-
-  // Calculate allowed starting point for peak finding.
-  // The peak location bestIndex must fulfill two criteria:
-  // (1) w16_bestIndex + input_length <
-  //     timestamps_per_call_ + expand_->overlap_length();
-  // (2) w16_bestIndex + input_length < start_position.
-  size_t start_index = timestamps_per_call_ + expand_->overlap_length();
-  start_index = std::max(start_position, start_index);
-  start_index = (input_length > start_index) ? 0 : (start_index - input_length);
-  // Downscale starting index to 4kHz domain. (fs_mult_ * 2 = fs_hz_ / 4000.)
-  size_t start_index_downsamp = start_index / (fs_mult_ * 2);
-
-  // Calculate a modified |stop_position_downsamp| to account for the increased
-  // start index |start_index_downsamp| and the effective array length.
-  size_t modified_stop_pos =
-      std::min(stop_position_downsamp,
-               kMaxCorrelationLength + pad_length - start_index_downsamp);
-  size_t best_correlation_index;
-  int16_t best_correlation;
-  static const size_t kNumCorrelationCandidates = 1;
-  DspHelper::PeakDetection(&correlation_ptr[start_index_downsamp],
-                           modified_stop_pos, kNumCorrelationCandidates,
-                           fs_mult_, &best_correlation_index,
-                           &best_correlation);
-  // Compensate for modified start index.
-  best_correlation_index += start_index;
-
-  // Ensure that underrun does not occur for 10ms case => we have to get at
-  // least 10ms + overlap . (This should never happen thanks to the above
-  // modification of peak-finding starting point.)
-  while (((best_correlation_index + input_length) <
-          (timestamps_per_call_ + expand_->overlap_length())) ||
-         ((best_correlation_index + input_length) < start_position)) {
-    assert(false);  // Should never happen.
-    best_correlation_index += expand_period;  // Jump one lag ahead.
-  }
-  return best_correlation_index;
-}
-
-size_t Merge::RequiredFutureSamples() {
-  return fs_hz_ / 100 * num_channels_;  // 10 ms.
-}
-
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/neteq/merge.h b/modules/audio_coding/neteq/merge.h
deleted file mode 100644
index 34e6639..0000000
--- a/modules/audio_coding/neteq/merge.h
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- *  Copyright (c) 2012 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_NETEQ_MERGE_H_
-#define WEBRTC_MODULES_AUDIO_CODING_NETEQ_MERGE_H_
-
-#include <assert.h>
-
-#include "webrtc/modules/audio_coding/neteq/audio_multi_vector.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-// Forward declarations.
-class Expand;
-class SyncBuffer;
-
-// This class handles the transition from expansion to normal operation.
-// When a packet is not available for decoding when needed, the expand operation
-// is called to generate extrapolation data. If the missing packet arrives,
-// i.e., it was just delayed, it can be decoded and appended directly to the
-// end of the expanded data (thanks to how the Expand class operates). However,
-// if a later packet arrives instead, the loss is a fact, and the new data must
-// be stitched together with the end of the expanded data. This stitching is
-// what the Merge class does.
-class Merge {
- public:
-  Merge(int fs_hz,
-        size_t num_channels,
-        Expand* expand,
-        SyncBuffer* sync_buffer);
-  virtual ~Merge();
-
-  // The main method to produce the audio data. The decoded data is supplied in
-  // |input|, having |input_length| samples in total for all channels
-  // (interleaved). The result is written to |output|. The number of channels
-  // allocated in |output| defines the number of channels that will be used when
-  // de-interleaving |input|. The values in |external_mute_factor_array| (Q14)
-  // will be used to scale the audio, and is updated in the process. The array
-  // must have |num_channels_| elements.
-  virtual size_t Process(int16_t* input, size_t input_length,
-                         int16_t* external_mute_factor_array,
-                         AudioMultiVector* output);
-
-  virtual size_t RequiredFutureSamples();
-
- protected:
-  const int fs_hz_;
-  const size_t num_channels_;
-
- private:
-  static const int kMaxSampleRate = 48000;
-  static const size_t kExpandDownsampLength = 100;
-  static const size_t kInputDownsampLength = 40;
-  static const size_t kMaxCorrelationLength = 60;
-
-  // Calls |expand_| to get more expansion data to merge with. The data is
-  // written to |expanded_signal_|. Returns the length of the expanded data,
-  // while |expand_period| will be the number of samples in one expansion period
-  // (typically one pitch period). The value of |old_length| will be the number
-  // of samples that were taken from the |sync_buffer_|.
-  size_t GetExpandedSignal(size_t* old_length, size_t* expand_period);
-
-  // Analyzes |input| and |expanded_signal| and returns muting factor (Q14) to
-  // be used on the new data.
-  int16_t SignalScaling(const int16_t* input, size_t input_length,
-                        const int16_t* expanded_signal) const;
-
-  // Downsamples |input| (|input_length| samples) and |expanded_signal| to
-  // 4 kHz sample rate. The downsampled signals are written to
-  // |input_downsampled_| and |expanded_downsampled_|, respectively.
-  void Downsample(const int16_t* input, size_t input_length,
-                  const int16_t* expanded_signal, size_t expanded_length);
-
-  // Calculates cross-correlation between |input_downsampled_| and
-  // |expanded_downsampled_|, and finds the correlation maximum. The maximizing
-  // lag is returned.
-  size_t CorrelateAndPeakSearch(size_t start_position, size_t input_length,
-                                size_t expand_period) const;
-
-  const int fs_mult_;  // fs_hz_ / 8000.
-  const size_t timestamps_per_call_;
-  Expand* expand_;
-  SyncBuffer* sync_buffer_;
-  int16_t expanded_downsampled_[kExpandDownsampLength];
-  int16_t input_downsampled_[kInputDownsampLength];
-  AudioMultiVector expanded_;
-  std::vector<int16_t> temp_data_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(Merge);
-};
-
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_AUDIO_CODING_NETEQ_MERGE_H_
diff --git a/modules/audio_coding/neteq/merge_unittest.cc b/modules/audio_coding/neteq/merge_unittest.cc
deleted file mode 100644
index bfabb22..0000000
--- a/modules/audio_coding/neteq/merge_unittest.cc
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- *  Copyright (c) 2012 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.
- */
-
-// Unit tests for Merge class.
-
-#include "webrtc/modules/audio_coding/neteq/merge.h"
-
-#include <vector>
-
-#include "webrtc/modules/audio_coding/neteq/background_noise.h"
-#include "webrtc/modules/audio_coding/neteq/expand.h"
-#include "webrtc/modules/audio_coding/neteq/random_vector.h"
-#include "webrtc/modules/audio_coding/neteq/statistics_calculator.h"
-#include "webrtc/modules/audio_coding/neteq/sync_buffer.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-TEST(Merge, CreateAndDestroy) {
-  int fs = 8000;
-  size_t channels = 1;
-  BackgroundNoise bgn(channels);
-  SyncBuffer sync_buffer(1, 1000);
-  RandomVector random_vector;
-  StatisticsCalculator statistics;
-  Expand expand(&bgn, &sync_buffer, &random_vector, &statistics, fs, channels);
-  Merge merge(fs, channels, &expand, &sync_buffer);
-}
-
-// TODO(hlundin): Write more tests.
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/neteq/mock/mock_buffer_level_filter.h b/modules/audio_coding/neteq/mock/mock_buffer_level_filter.h
deleted file mode 100644
index da22845..0000000
--- a/modules/audio_coding/neteq/mock/mock_buffer_level_filter.h
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- *  Copyright (c) 2012 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_NETEQ_MOCK_MOCK_BUFFER_LEVEL_FILTER_H_
-#define WEBRTC_MODULES_AUDIO_CODING_NETEQ_MOCK_MOCK_BUFFER_LEVEL_FILTER_H_
-
-#include "webrtc/modules/audio_coding/neteq/buffer_level_filter.h"
-
-#include "webrtc/test/gmock.h"
-
-namespace webrtc {
-
-class MockBufferLevelFilter : public BufferLevelFilter {
- public:
-  virtual ~MockBufferLevelFilter() { Die(); }
-  MOCK_METHOD0(Die,
-      void());
-  MOCK_METHOD0(Reset,
-      void());
-  MOCK_METHOD3(Update,
-      void(size_t buffer_size_packets, int time_stretched_samples,
-           size_t packet_len_samples));
-  MOCK_METHOD1(SetTargetBufferLevel,
-      void(int target_buffer_level));
-  MOCK_CONST_METHOD0(filtered_current_level,
-      int());
-};
-
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_AUDIO_CODING_NETEQ_MOCK_MOCK_BUFFER_LEVEL_FILTER_H_
diff --git a/modules/audio_coding/neteq/mock/mock_decoder_database.h b/modules/audio_coding/neteq/mock/mock_decoder_database.h
deleted file mode 100644
index 4018879..0000000
--- a/modules/audio_coding/neteq/mock/mock_decoder_database.h
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- *  Copyright (c) 2012 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_NETEQ_MOCK_MOCK_DECODER_DATABASE_H_
-#define WEBRTC_MODULES_AUDIO_CODING_NETEQ_MOCK_MOCK_DECODER_DATABASE_H_
-
-#include <string>
-
-#include "webrtc/modules/audio_coding/neteq/decoder_database.h"
-
-#include "webrtc/test/gmock.h"
-
-namespace webrtc {
-
-class MockDecoderDatabase : public DecoderDatabase {
- public:
-  explicit MockDecoderDatabase(
-      rtc::scoped_refptr<AudioDecoderFactory> factory = nullptr)
-      : DecoderDatabase(factory) {}
-  virtual ~MockDecoderDatabase() { Die(); }
-  MOCK_METHOD0(Die, void());
-  MOCK_CONST_METHOD0(Empty,
-      bool());
-  MOCK_CONST_METHOD0(Size,
-      int());
-  MOCK_METHOD0(Reset,
-      void());
-  MOCK_METHOD3(RegisterPayload,
-      int(uint8_t rtp_payload_type, NetEqDecoder codec_type,
-          const std::string& name));
-  MOCK_METHOD2(RegisterPayload,
-               int(int rtp_payload_type, const SdpAudioFormat& audio_format));
-  MOCK_METHOD4(InsertExternal,
-               int(uint8_t rtp_payload_type,
-                   NetEqDecoder codec_type,
-                   const std::string& codec_name,
-                   AudioDecoder* decoder));
-  MOCK_METHOD1(Remove,
-      int(uint8_t rtp_payload_type));
-  MOCK_METHOD0(RemoveAll, void());
-  MOCK_CONST_METHOD1(GetDecoderInfo,
-      const DecoderInfo*(uint8_t rtp_payload_type));
-  MOCK_METHOD2(SetActiveDecoder,
-      int(uint8_t rtp_payload_type, bool* new_decoder));
-  MOCK_CONST_METHOD0(GetActiveDecoder,
-      AudioDecoder*());
-  MOCK_METHOD1(SetActiveCngDecoder,
-      int(uint8_t rtp_payload_type));
-  MOCK_CONST_METHOD0(GetActiveCngDecoder,
-      ComfortNoiseDecoder*());
-};
-
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_AUDIO_CODING_NETEQ_MOCK_MOCK_DECODER_DATABASE_H_
diff --git a/modules/audio_coding/neteq/mock/mock_delay_manager.h b/modules/audio_coding/neteq/mock/mock_delay_manager.h
deleted file mode 100644
index 85ed71d..0000000
--- a/modules/audio_coding/neteq/mock/mock_delay_manager.h
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- *  Copyright (c) 2012 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_NETEQ_MOCK_MOCK_DELAY_MANAGER_H_
-#define WEBRTC_MODULES_AUDIO_CODING_NETEQ_MOCK_MOCK_DELAY_MANAGER_H_
-
-#include "webrtc/modules/audio_coding/neteq/delay_manager.h"
-
-#include "webrtc/test/gmock.h"
-
-namespace webrtc {
-
-class MockDelayManager : public DelayManager {
- public:
-  MockDelayManager(size_t max_packets_in_buffer,
-                   DelayPeakDetector* peak_detector,
-                   const TickTimer* tick_timer)
-      : DelayManager(max_packets_in_buffer, peak_detector, tick_timer) {}
-  virtual ~MockDelayManager() { Die(); }
-  MOCK_METHOD0(Die, void());
-  MOCK_CONST_METHOD0(iat_vector,
-      const IATVector&());
-  MOCK_METHOD3(Update,
-      int(uint16_t sequence_number, uint32_t timestamp, int sample_rate_hz));
-  MOCK_METHOD1(CalculateTargetLevel,
-      int(int iat_packets));
-  MOCK_METHOD1(SetPacketAudioLength,
-      int(int length_ms));
-  MOCK_METHOD0(Reset,
-      void());
-  MOCK_CONST_METHOD0(PeakFound,
-      bool());
-  MOCK_METHOD1(UpdateCounters,
-      void(int elapsed_time_ms));
-  MOCK_METHOD0(ResetPacketIatCount,
-      void());
-  MOCK_CONST_METHOD2(BufferLimits,
-      void(int* lower_limit, int* higher_limit));
-  MOCK_CONST_METHOD0(TargetLevel,
-      int());
-  MOCK_METHOD0(RegisterEmptyPacket, void());
-  MOCK_METHOD1(set_extra_delay_ms,
-      void(int16_t delay));
-  MOCK_CONST_METHOD0(base_target_level,
-      int());
-  MOCK_METHOD1(set_streaming_mode,
-      void(bool value));
-  MOCK_CONST_METHOD0(last_pack_cng_or_dtmf,
-      int());
-  MOCK_METHOD1(set_last_pack_cng_or_dtmf,
-      void(int value));
-};
-
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_AUDIO_CODING_NETEQ_MOCK_MOCK_DELAY_MANAGER_H_
diff --git a/modules/audio_coding/neteq/mock/mock_delay_peak_detector.h b/modules/audio_coding/neteq/mock/mock_delay_peak_detector.h
deleted file mode 100644
index 3a80cb4..0000000
--- a/modules/audio_coding/neteq/mock/mock_delay_peak_detector.h
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- *  Copyright (c) 2012 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_NETEQ_MOCK_MOCK_DELAY_PEAK_DETECTOR_H_
-#define WEBRTC_MODULES_AUDIO_CODING_NETEQ_MOCK_MOCK_DELAY_PEAK_DETECTOR_H_
-
-#include "webrtc/modules/audio_coding/neteq/delay_peak_detector.h"
-
-#include "webrtc/test/gmock.h"
-
-namespace webrtc {
-
-class MockDelayPeakDetector : public DelayPeakDetector {
- public:
-  MockDelayPeakDetector(const TickTimer* tick_timer)
-      : DelayPeakDetector(tick_timer) {}
-  virtual ~MockDelayPeakDetector() { Die(); }
-  MOCK_METHOD0(Die, void());
-  MOCK_METHOD0(Reset, void());
-  MOCK_METHOD1(SetPacketAudioLength, void(int length_ms));
-  MOCK_METHOD0(peak_found, bool());
-  MOCK_CONST_METHOD0(MaxPeakHeight, int());
-  MOCK_CONST_METHOD0(MaxPeakPeriod, uint64_t());
-  MOCK_METHOD2(Update, bool(int inter_arrival_time, int target_level));
-};
-
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_AUDIO_CODING_NETEQ_MOCK_MOCK_DELAY_PEAK_DETECTOR_H_
diff --git a/modules/audio_coding/neteq/mock/mock_dtmf_buffer.h b/modules/audio_coding/neteq/mock/mock_dtmf_buffer.h
deleted file mode 100644
index 0aac22c..0000000
--- a/modules/audio_coding/neteq/mock/mock_dtmf_buffer.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- *  Copyright (c) 2012 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_NETEQ_MOCK_MOCK_DTMF_BUFFER_H_
-#define WEBRTC_MODULES_AUDIO_CODING_NETEQ_MOCK_MOCK_DTMF_BUFFER_H_
-
-#include "webrtc/modules/audio_coding/neteq/dtmf_buffer.h"
-
-#include "webrtc/test/gmock.h"
-
-namespace webrtc {
-
-class MockDtmfBuffer : public DtmfBuffer {
- public:
-  MockDtmfBuffer(int fs) : DtmfBuffer(fs) {}
-  virtual ~MockDtmfBuffer() { Die(); }
-  MOCK_METHOD0(Die, void());
-  MOCK_METHOD0(Flush,
-      void());
-  MOCK_METHOD1(InsertEvent,
-      int(const DtmfEvent& event));
-  MOCK_METHOD2(GetEvent,
-      bool(uint32_t current_timestamp, DtmfEvent* event));
-  MOCK_CONST_METHOD0(Length,
-      size_t());
-  MOCK_CONST_METHOD0(Empty,
-      bool());
-};
-
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_AUDIO_CODING_NETEQ_MOCK_MOCK_DTMF_BUFFER_H_
diff --git a/modules/audio_coding/neteq/mock/mock_dtmf_tone_generator.h b/modules/audio_coding/neteq/mock/mock_dtmf_tone_generator.h
deleted file mode 100644
index bb0a535..0000000
--- a/modules/audio_coding/neteq/mock/mock_dtmf_tone_generator.h
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- *  Copyright (c) 2012 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_NETEQ_MOCK_MOCK_DTMF_TONE_GENERATOR_H_
-#define WEBRTC_MODULES_AUDIO_CODING_NETEQ_MOCK_MOCK_DTMF_TONE_GENERATOR_H_
-
-#include "webrtc/modules/audio_coding/neteq/dtmf_tone_generator.h"
-
-#include "webrtc/test/gmock.h"
-
-namespace webrtc {
-
-class MockDtmfToneGenerator : public DtmfToneGenerator {
- public:
-  virtual ~MockDtmfToneGenerator() { Die(); }
-  MOCK_METHOD0(Die, void());
-  MOCK_METHOD3(Init,
-      int(int fs, int event, int attenuation));
-  MOCK_METHOD0(Reset,
-      void());
-  MOCK_METHOD2(Generate,
-      int(size_t num_samples, AudioMultiVector* output));
-  MOCK_CONST_METHOD0(initialized,
-      bool());
-};
-
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_AUDIO_CODING_NETEQ_MOCK_MOCK_DTMF_TONE_GENERATOR_H_
diff --git a/modules/audio_coding/neteq/mock/mock_expand.h b/modules/audio_coding/neteq/mock/mock_expand.h
deleted file mode 100644
index 9465f6f..0000000
--- a/modules/audio_coding/neteq/mock/mock_expand.h
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- *  Copyright (c) 2014 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_NETEQ_MOCK_MOCK_EXPAND_H_
-#define WEBRTC_MODULES_AUDIO_CODING_NETEQ_MOCK_MOCK_EXPAND_H_
-
-#include "webrtc/modules/audio_coding/neteq/expand.h"
-
-#include "webrtc/test/gmock.h"
-
-namespace webrtc {
-
-class MockExpand : public Expand {
- public:
-  MockExpand(BackgroundNoise* background_noise,
-             SyncBuffer* sync_buffer,
-             RandomVector* random_vector,
-             StatisticsCalculator* statistics,
-             int fs,
-             size_t num_channels)
-      : Expand(background_noise,
-               sync_buffer,
-               random_vector,
-               statistics,
-               fs,
-               num_channels) {}
-  virtual ~MockExpand() { Die(); }
-  MOCK_METHOD0(Die, void());
-  MOCK_METHOD0(Reset,
-      void());
-  MOCK_METHOD1(Process,
-      int(AudioMultiVector* output));
-  MOCK_METHOD0(SetParametersForNormalAfterExpand,
-      void());
-  MOCK_METHOD0(SetParametersForMergeAfterExpand,
-      void());
-  MOCK_CONST_METHOD0(overlap_length,
-      size_t());
-};
-
-}  // namespace webrtc
-
-namespace webrtc {
-
-class MockExpandFactory : public ExpandFactory {
- public:
-  MOCK_CONST_METHOD6(Create,
-                     Expand*(BackgroundNoise* background_noise,
-                             SyncBuffer* sync_buffer,
-                             RandomVector* random_vector,
-                             StatisticsCalculator* statistics,
-                             int fs,
-                             size_t num_channels));
-};
-
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_AUDIO_CODING_NETEQ_MOCK_MOCK_EXPAND_H_
diff --git a/modules/audio_coding/neteq/mock/mock_external_decoder_pcm16b.h b/modules/audio_coding/neteq/mock/mock_external_decoder_pcm16b.h
deleted file mode 100644
index 3848680..0000000
--- a/modules/audio_coding/neteq/mock/mock_external_decoder_pcm16b.h
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- *  Copyright (c) 2013 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_NETEQ_MOCK_MOCK_EXTERNAL_DECODER_PCM16B_H_
-#define WEBRTC_MODULES_AUDIO_CODING_NETEQ_MOCK_MOCK_EXTERNAL_DECODER_PCM16B_H_
-
-#include "webrtc/api/audio_codecs/audio_decoder.h"
-#include "webrtc/modules/audio_coding/codecs/pcm16b/pcm16b.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/test/gmock.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-using ::testing::_;
-using ::testing::Invoke;
-
-// Implement an external version of the PCM16b decoder.
-class ExternalPcm16B : public AudioDecoder {
- public:
-  explicit ExternalPcm16B(int sample_rate_hz)
-      : sample_rate_hz_(sample_rate_hz) {}
-  void Reset() override {}
-
-  int DecodeInternal(const uint8_t* encoded,
-                     size_t encoded_len,
-                     int sample_rate_hz,
-                     int16_t* decoded,
-                     SpeechType* speech_type) override {
-    EXPECT_EQ(sample_rate_hz_, sample_rate_hz);
-    size_t ret = WebRtcPcm16b_Decode(encoded, encoded_len, decoded);
-    *speech_type = ConvertSpeechType(1);
-    return static_cast<int>(ret);
-  }
-  int SampleRateHz() const override { return sample_rate_hz_; }
-  size_t Channels() const override { return 1; }
-
- private:
-  const int sample_rate_hz_;
-  RTC_DISALLOW_COPY_AND_ASSIGN(ExternalPcm16B);
-};
-
-// Create a mock of ExternalPcm16B which delegates all calls to the real object.
-// The reason is that we can then track that the correct calls are being made.
-class MockExternalPcm16B : public AudioDecoder {
- public:
-  explicit MockExternalPcm16B(int sample_rate_hz) : real_(sample_rate_hz) {
-    // By default, all calls are delegated to the real object.
-    ON_CALL(*this, DecodeInternal(_, _, _, _, _))
-        .WillByDefault(Invoke(&real_, &ExternalPcm16B::DecodeInternal));
-    ON_CALL(*this, HasDecodePlc())
-        .WillByDefault(Invoke(&real_, &ExternalPcm16B::HasDecodePlc));
-    ON_CALL(*this, DecodePlc(_, _))
-        .WillByDefault(Invoke(&real_, &ExternalPcm16B::DecodePlc));
-    ON_CALL(*this, Reset())
-        .WillByDefault(Invoke(&real_, &ExternalPcm16B::Reset));
-    ON_CALL(*this, IncomingPacket(_, _, _, _, _))
-        .WillByDefault(Invoke(&real_, &ExternalPcm16B::IncomingPacket));
-    ON_CALL(*this, ErrorCode())
-        .WillByDefault(Invoke(&real_, &ExternalPcm16B::ErrorCode));
-  }
-  virtual ~MockExternalPcm16B() { Die(); }
-
-  MOCK_METHOD0(Die, void());
-  MOCK_METHOD5(DecodeInternal,
-               int(const uint8_t* encoded,
-                   size_t encoded_len,
-                   int sample_rate_hz,
-                   int16_t* decoded,
-                   SpeechType* speech_type));
-  MOCK_CONST_METHOD0(HasDecodePlc,
-      bool());
-  MOCK_METHOD2(DecodePlc,
-      size_t(size_t num_frames, int16_t* decoded));
-  MOCK_METHOD0(Reset, void());
-  MOCK_METHOD5(IncomingPacket,
-      int(const uint8_t* payload, size_t payload_len,
-          uint16_t rtp_sequence_number, uint32_t rtp_timestamp,
-          uint32_t arrival_timestamp));
-  MOCK_METHOD0(ErrorCode,
-      int());
-
-  int SampleRateHz() const /* override */ { return real_.SampleRateHz(); }
-  size_t Channels() const /* override */ { return real_.Channels(); }
-
- private:
-  ExternalPcm16B real_;
-};
-
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_AUDIO_CODING_NETEQ_MOCK_MOCK_EXTERNAL_DECODER_PCM16B_H_
diff --git a/modules/audio_coding/neteq/mock/mock_packet_buffer.h b/modules/audio_coding/neteq/mock/mock_packet_buffer.h
deleted file mode 100644
index 1530329..0000000
--- a/modules/audio_coding/neteq/mock/mock_packet_buffer.h
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- *  Copyright (c) 2012 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_NETEQ_MOCK_MOCK_PACKET_BUFFER_H_
-#define WEBRTC_MODULES_AUDIO_CODING_NETEQ_MOCK_MOCK_PACKET_BUFFER_H_
-
-#include "webrtc/modules/audio_coding/neteq/packet_buffer.h"
-
-#include "webrtc/test/gmock.h"
-
-namespace webrtc {
-
-class MockPacketBuffer : public PacketBuffer {
- public:
-  MockPacketBuffer(size_t max_number_of_packets, const TickTimer* tick_timer)
-      : PacketBuffer(max_number_of_packets, tick_timer) {}
-  virtual ~MockPacketBuffer() { Die(); }
-  MOCK_METHOD0(Die, void());
-  MOCK_METHOD0(Flush,
-      void());
-  MOCK_CONST_METHOD0(Empty,
-      bool());
-  int InsertPacket(Packet&& packet, StatisticsCalculator* stats) {
-    return InsertPacketWrapped(&packet, stats);
-  }
-  // Since gtest does not properly support move-only types, InsertPacket is
-  // implemented as a wrapper. You'll have to implement InsertPacketWrapped
-  // instead and move from |*packet|.
-  MOCK_METHOD2(InsertPacketWrapped,
-               int(Packet* packet, StatisticsCalculator* stats));
-  MOCK_METHOD5(InsertPacketList,
-               int(PacketList* packet_list,
-                   const DecoderDatabase& decoder_database,
-                   rtc::Optional<uint8_t>* current_rtp_payload_type,
-                   rtc::Optional<uint8_t>* current_cng_rtp_payload_type,
-                   StatisticsCalculator* stats));
-  MOCK_CONST_METHOD1(NextTimestamp,
-      int(uint32_t* next_timestamp));
-  MOCK_CONST_METHOD2(NextHigherTimestamp,
-      int(uint32_t timestamp, uint32_t* next_timestamp));
-  MOCK_CONST_METHOD0(PeekNextPacket,
-      const Packet*());
-  MOCK_METHOD0(GetNextPacket,
-      rtc::Optional<Packet>());
-  MOCK_METHOD1(DiscardNextPacket, int(StatisticsCalculator* stats));
-  MOCK_METHOD3(DiscardOldPackets,
-               void(uint32_t timestamp_limit,
-                    uint32_t horizon_samples,
-                    StatisticsCalculator* stats));
-  MOCK_METHOD2(DiscardAllOldPackets,
-               void(uint32_t timestamp_limit, StatisticsCalculator* stats));
-  MOCK_CONST_METHOD0(NumPacketsInBuffer,
-      size_t());
-  MOCK_METHOD1(IncrementWaitingTimes,
-      void(int));
-  MOCK_CONST_METHOD0(current_memory_bytes,
-      int());
-};
-
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_AUDIO_CODING_NETEQ_MOCK_MOCK_PACKET_BUFFER_H_
diff --git a/modules/audio_coding/neteq/mock/mock_red_payload_splitter.h b/modules/audio_coding/neteq/mock/mock_red_payload_splitter.h
deleted file mode 100644
index 8c6e939..0000000
--- a/modules/audio_coding/neteq/mock/mock_red_payload_splitter.h
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- *  Copyright (c) 2012 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_NETEQ_MOCK_MOCK_RED_PAYLOAD_SPLITTER_H_
-#define WEBRTC_MODULES_AUDIO_CODING_NETEQ_MOCK_MOCK_RED_PAYLOAD_SPLITTER_H_
-
-#include "webrtc/modules/audio_coding/neteq/red_payload_splitter.h"
-
-#include "webrtc/test/gmock.h"
-
-namespace webrtc {
-
-class MockRedPayloadSplitter : public RedPayloadSplitter {
- public:
-  MOCK_METHOD1(SplitRed, bool(PacketList* packet_list));
-  MOCK_METHOD2(CheckRedPayloads,
-               int(PacketList* packet_list,
-                   const DecoderDatabase& decoder_database));
-};
-
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_AUDIO_CODING_NETEQ_MOCK_MOCK_RED_PAYLOAD_SPLITTER_H_
diff --git a/modules/audio_coding/neteq/mock/mock_statistics_calculator.h b/modules/audio_coding/neteq/mock/mock_statistics_calculator.h
deleted file mode 100644
index c854b24..0000000
--- a/modules/audio_coding/neteq/mock/mock_statistics_calculator.h
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- *  Copyright (c) 2017 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_NETEQ_MOCK_MOCK_STATISTICS_CALCULATOR_H_
-#define WEBRTC_MODULES_AUDIO_CODING_NETEQ_MOCK_MOCK_STATISTICS_CALCULATOR_H_
-
-#include "webrtc/modules/audio_coding/neteq/statistics_calculator.h"
-
-#include "webrtc/test/gmock.h"
-
-namespace webrtc {
-
-class MockStatisticsCalculator : public StatisticsCalculator {
- public:
-  MOCK_METHOD1(PacketsDiscarded, void(size_t num_packets));
-  MOCK_METHOD1(SecondaryPacketsDiscarded, void(size_t num_packets));
-};
-
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_AUDIO_CODING_NETEQ_MOCK_MOCK_STATISTICS_CALCULATOR_H_
diff --git a/modules/audio_coding/neteq/nack_tracker.cc b/modules/audio_coding/neteq/nack_tracker.cc
deleted file mode 100644
index 9829cf9..0000000
--- a/modules/audio_coding/neteq/nack_tracker.cc
+++ /dev/null
@@ -1,232 +0,0 @@
-/*
- *  Copyright (c) 2013 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/neteq/nack_tracker.h"
-
-#include <assert.h>  // For assert.
-
-#include <algorithm>  // For std::max.
-
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-namespace {
-
-const int kDefaultSampleRateKhz = 48;
-const int kDefaultPacketSizeMs = 20;
-
-}  // namespace
-
-NackTracker::NackTracker(int nack_threshold_packets)
-    : nack_threshold_packets_(nack_threshold_packets),
-      sequence_num_last_received_rtp_(0),
-      timestamp_last_received_rtp_(0),
-      any_rtp_received_(false),
-      sequence_num_last_decoded_rtp_(0),
-      timestamp_last_decoded_rtp_(0),
-      any_rtp_decoded_(false),
-      sample_rate_khz_(kDefaultSampleRateKhz),
-      samples_per_packet_(sample_rate_khz_ * kDefaultPacketSizeMs),
-      max_nack_list_size_(kNackListSizeLimit) {}
-
-NackTracker::~NackTracker() = default;
-
-NackTracker* NackTracker::Create(int nack_threshold_packets) {
-  return new NackTracker(nack_threshold_packets);
-}
-
-void NackTracker::UpdateSampleRate(int sample_rate_hz) {
-  assert(sample_rate_hz > 0);
-  sample_rate_khz_ = sample_rate_hz / 1000;
-}
-
-void NackTracker::UpdateLastReceivedPacket(uint16_t sequence_number,
-                                           uint32_t timestamp) {
-  // Just record the value of sequence number and timestamp if this is the
-  // first packet.
-  if (!any_rtp_received_) {
-    sequence_num_last_received_rtp_ = sequence_number;
-    timestamp_last_received_rtp_ = timestamp;
-    any_rtp_received_ = true;
-    // If no packet is decoded, to have a reasonable estimate of time-to-play
-    // use the given values.
-    if (!any_rtp_decoded_) {
-      sequence_num_last_decoded_rtp_ = sequence_number;
-      timestamp_last_decoded_rtp_ = timestamp;
-    }
-    return;
-  }
-
-  if (sequence_number == sequence_num_last_received_rtp_)
-    return;
-
-  // Received RTP should not be in the list.
-  nack_list_.erase(sequence_number);
-
-  // If this is an old sequence number, no more action is required, return.
-  if (IsNewerSequenceNumber(sequence_num_last_received_rtp_, sequence_number))
-    return;
-
-  UpdateSamplesPerPacket(sequence_number, timestamp);
-
-  UpdateList(sequence_number);
-
-  sequence_num_last_received_rtp_ = sequence_number;
-  timestamp_last_received_rtp_ = timestamp;
-  LimitNackListSize();
-}
-
-void NackTracker::UpdateSamplesPerPacket(
-    uint16_t sequence_number_current_received_rtp,
-    uint32_t timestamp_current_received_rtp) {
-  uint32_t timestamp_increase =
-      timestamp_current_received_rtp - timestamp_last_received_rtp_;
-  uint16_t sequence_num_increase =
-      sequence_number_current_received_rtp - sequence_num_last_received_rtp_;
-
-  samples_per_packet_ = timestamp_increase / sequence_num_increase;
-}
-
-void NackTracker::UpdateList(uint16_t sequence_number_current_received_rtp) {
-  // Some of the packets which were considered late, now are considered missing.
-  ChangeFromLateToMissing(sequence_number_current_received_rtp);
-
-  if (IsNewerSequenceNumber(sequence_number_current_received_rtp,
-                            sequence_num_last_received_rtp_ + 1))
-    AddToList(sequence_number_current_received_rtp);
-}
-
-void NackTracker::ChangeFromLateToMissing(
-    uint16_t sequence_number_current_received_rtp) {
-  NackList::const_iterator lower_bound =
-      nack_list_.lower_bound(static_cast<uint16_t>(
-          sequence_number_current_received_rtp - nack_threshold_packets_));
-
-  for (NackList::iterator it = nack_list_.begin(); it != lower_bound; ++it)
-    it->second.is_missing = true;
-}
-
-uint32_t NackTracker::EstimateTimestamp(uint16_t sequence_num) {
-  uint16_t sequence_num_diff = sequence_num - sequence_num_last_received_rtp_;
-  return sequence_num_diff * samples_per_packet_ + timestamp_last_received_rtp_;
-}
-
-void NackTracker::AddToList(uint16_t sequence_number_current_received_rtp) {
-  assert(!any_rtp_decoded_ ||
-         IsNewerSequenceNumber(sequence_number_current_received_rtp,
-                               sequence_num_last_decoded_rtp_));
-
-  // Packets with sequence numbers older than |upper_bound_missing| are
-  // considered missing, and the rest are considered late.
-  uint16_t upper_bound_missing =
-      sequence_number_current_received_rtp - nack_threshold_packets_;
-
-  for (uint16_t n = sequence_num_last_received_rtp_ + 1;
-       IsNewerSequenceNumber(sequence_number_current_received_rtp, n); ++n) {
-    bool is_missing = IsNewerSequenceNumber(upper_bound_missing, n);
-    uint32_t timestamp = EstimateTimestamp(n);
-    NackElement nack_element(TimeToPlay(timestamp), timestamp, is_missing);
-    nack_list_.insert(nack_list_.end(), std::make_pair(n, nack_element));
-  }
-}
-
-void NackTracker::UpdateEstimatedPlayoutTimeBy10ms() {
-  while (!nack_list_.empty() &&
-         nack_list_.begin()->second.time_to_play_ms <= 10)
-    nack_list_.erase(nack_list_.begin());
-
-  for (NackList::iterator it = nack_list_.begin(); it != nack_list_.end(); ++it)
-    it->second.time_to_play_ms -= 10;
-}
-
-void NackTracker::UpdateLastDecodedPacket(uint16_t sequence_number,
-                                          uint32_t timestamp) {
-  if (IsNewerSequenceNumber(sequence_number, sequence_num_last_decoded_rtp_) ||
-      !any_rtp_decoded_) {
-    sequence_num_last_decoded_rtp_ = sequence_number;
-    timestamp_last_decoded_rtp_ = timestamp;
-    // Packets in the list with sequence numbers less than the
-    // sequence number of the decoded RTP should be removed from the lists.
-    // They will be discarded by the jitter buffer if they arrive.
-    nack_list_.erase(nack_list_.begin(),
-                     nack_list_.upper_bound(sequence_num_last_decoded_rtp_));
-
-    // Update estimated time-to-play.
-    for (NackList::iterator it = nack_list_.begin(); it != nack_list_.end();
-         ++it)
-      it->second.time_to_play_ms = TimeToPlay(it->second.estimated_timestamp);
-  } else {
-    assert(sequence_number == sequence_num_last_decoded_rtp_);
-
-    // Same sequence number as before. 10 ms is elapsed, update estimations for
-    // time-to-play.
-    UpdateEstimatedPlayoutTimeBy10ms();
-
-    // Update timestamp for better estimate of time-to-play, for packets which
-    // are added to NACK list later on.
-    timestamp_last_decoded_rtp_ += sample_rate_khz_ * 10;
-  }
-  any_rtp_decoded_ = true;
-}
-
-NackTracker::NackList NackTracker::GetNackList() const {
-  return nack_list_;
-}
-
-void NackTracker::Reset() {
-  nack_list_.clear();
-
-  sequence_num_last_received_rtp_ = 0;
-  timestamp_last_received_rtp_ = 0;
-  any_rtp_received_ = false;
-  sequence_num_last_decoded_rtp_ = 0;
-  timestamp_last_decoded_rtp_ = 0;
-  any_rtp_decoded_ = false;
-  sample_rate_khz_ = kDefaultSampleRateKhz;
-  samples_per_packet_ = sample_rate_khz_ * kDefaultPacketSizeMs;
-}
-
-void NackTracker::SetMaxNackListSize(size_t max_nack_list_size) {
-  RTC_CHECK_GT(max_nack_list_size, 0);
-  // Ugly hack to get around the problem of passing static consts by reference.
-  const size_t kNackListSizeLimitLocal = NackTracker::kNackListSizeLimit;
-  RTC_CHECK_LE(max_nack_list_size, kNackListSizeLimitLocal);
-
-  max_nack_list_size_ = max_nack_list_size;
-  LimitNackListSize();
-}
-
-void NackTracker::LimitNackListSize() {
-  uint16_t limit = sequence_num_last_received_rtp_ -
-                   static_cast<uint16_t>(max_nack_list_size_) - 1;
-  nack_list_.erase(nack_list_.begin(), nack_list_.upper_bound(limit));
-}
-
-int64_t NackTracker::TimeToPlay(uint32_t timestamp) const {
-  uint32_t timestamp_increase = timestamp - timestamp_last_decoded_rtp_;
-  return timestamp_increase / sample_rate_khz_;
-}
-
-// We don't erase elements with time-to-play shorter than round-trip-time.
-std::vector<uint16_t> NackTracker::GetNackList(
-    int64_t round_trip_time_ms) const {
-  RTC_DCHECK_GE(round_trip_time_ms, 0);
-  std::vector<uint16_t> sequence_numbers;
-  for (NackList::const_iterator it = nack_list_.begin(); it != nack_list_.end();
-       ++it) {
-    if (it->second.is_missing &&
-        it->second.time_to_play_ms > round_trip_time_ms)
-      sequence_numbers.push_back(it->first);
-  }
-  return sequence_numbers;
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/neteq/nack_tracker.h b/modules/audio_coding/neteq/nack_tracker.h
deleted file mode 100644
index 4f98c82..0000000
--- a/modules/audio_coding/neteq/nack_tracker.h
+++ /dev/null
@@ -1,208 +0,0 @@
-/*
- *  Copyright (c) 2013 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_NETEQ_NACK_TRACKER_H_
-#define WEBRTC_MODULES_AUDIO_CODING_NETEQ_NACK_TRACKER_H_
-
-#include <vector>
-#include <map>
-
-#include "webrtc/modules/audio_coding/include/audio_coding_module_typedefs.h"
-#include "webrtc/rtc_base/gtest_prod_util.h"
-
-//
-// The NackTracker class keeps track of the lost packets, an estimate of
-// time-to-play for each packet is also given.
-//
-// Every time a packet is pushed into NetEq, LastReceivedPacket() has to be
-// called to update the NACK list.
-//
-// Every time 10ms audio is pulled from NetEq LastDecodedPacket() should be
-// called, and time-to-play is updated at that moment.
-//
-// If packet N is received, any packet prior to |N - NackThreshold| which is not
-// arrived is considered lost, and should be labeled as "missing" (the size of
-// the list might be limited and older packet eliminated from the list). Packets
-// |N - NackThreshold|, |N - NackThreshold + 1|, ..., |N - 1| are considered
-// "late." A "late" packet with sequence number K is changed to "missing" any
-// time a packet with sequence number newer than |K + NackList| is arrived.
-//
-// The NackTracker class has to know about the sample rate of the packets to
-// compute time-to-play. So sample rate should be set as soon as the first
-// packet is received. If there is a change in the receive codec (sender changes
-// codec) then NackTracker should be reset. This is because NetEQ would flush
-// its buffer and re-transmission is meaning less for old packet. Therefore, in
-// that case, after reset the sampling rate has to be updated.
-//
-// Thread Safety
-// =============
-// Please note that this class in not thread safe. The class must be protected
-// if different APIs are called from different threads.
-//
-namespace webrtc {
-
-class NackTracker {
- public:
-  // A limit for the size of the NACK list.
-  static const size_t kNackListSizeLimit = 500;  // 10 seconds for 20 ms frame
-                                                 // packets.
-  // Factory method.
-  static NackTracker* Create(int nack_threshold_packets);
-
-  ~NackTracker();
-
-  // Set a maximum for the size of the NACK list. If the last received packet
-  // has sequence number of N, then NACK list will not contain any element
-  // with sequence number earlier than N - |max_nack_list_size|.
-  //
-  // The largest maximum size is defined by |kNackListSizeLimit|
-  void SetMaxNackListSize(size_t max_nack_list_size);
-
-  // Set the sampling rate.
-  //
-  // If associated sampling rate of the received packets is changed, call this
-  // function to update sampling rate. Note that if there is any change in
-  // received codec then NetEq will flush its buffer and NACK has to be reset.
-  // After Reset() is called sampling rate has to be set.
-  void UpdateSampleRate(int sample_rate_hz);
-
-  // Update the sequence number and the timestamp of the last decoded RTP. This
-  // API should be called every time 10 ms audio is pulled from NetEq.
-  void UpdateLastDecodedPacket(uint16_t sequence_number, uint32_t timestamp);
-
-  // Update the sequence number and the timestamp of the last received RTP. This
-  // API should be called every time a packet pushed into ACM.
-  void UpdateLastReceivedPacket(uint16_t sequence_number, uint32_t timestamp);
-
-  // Get a list of "missing" packets which have expected time-to-play larger
-  // than the given round-trip-time (in milliseconds).
-  // Note: Late packets are not included.
-  std::vector<uint16_t> GetNackList(int64_t round_trip_time_ms) const;
-
-  // Reset to default values. The NACK list is cleared.
-  // |nack_threshold_packets_| & |max_nack_list_size_| preserve their values.
-  void Reset();
-
- private:
-  // This test need to access the private method GetNackList().
-  FRIEND_TEST_ALL_PREFIXES(NackTrackerTest, EstimateTimestampAndTimeToPlay);
-
-  struct NackElement {
-    NackElement(int64_t initial_time_to_play_ms,
-                uint32_t initial_timestamp,
-                bool missing)
-        : time_to_play_ms(initial_time_to_play_ms),
-          estimated_timestamp(initial_timestamp),
-          is_missing(missing) {}
-
-    // Estimated time (ms) left for this packet to be decoded. This estimate is
-    // updated every time jitter buffer decodes a packet.
-    int64_t time_to_play_ms;
-
-    // A guess about the timestamp of the missing packet, it is used for
-    // estimation of |time_to_play_ms|. The estimate might be slightly wrong if
-    // there has been frame-size change since the last received packet and the
-    // missing packet. However, the risk of this is low, and in case of such
-    // errors, there will be a minor misestimation in time-to-play of missing
-    // packets. This will have a very minor effect on NACK performance.
-    uint32_t estimated_timestamp;
-
-    // True if the packet is considered missing. Otherwise indicates packet is
-    // late.
-    bool is_missing;
-  };
-
-  class NackListCompare {
-   public:
-    bool operator()(uint16_t sequence_number_old,
-                    uint16_t sequence_number_new) const {
-      return IsNewerSequenceNumber(sequence_number_new, sequence_number_old);
-    }
-  };
-
-  typedef std::map<uint16_t, NackElement, NackListCompare> NackList;
-
-  // Constructor.
-  explicit NackTracker(int nack_threshold_packets);
-
-  // This API is used only for testing to assess whether time-to-play is
-  // computed correctly.
-  NackList GetNackList() const;
-
-  // Given the |sequence_number_current_received_rtp| of currently received RTP,
-  // recognize packets which are not arrive and add to the list.
-  void AddToList(uint16_t sequence_number_current_received_rtp);
-
-  // This function subtracts 10 ms of time-to-play for all packets in NACK list.
-  // This is called when 10 ms elapsed with no new RTP packet decoded.
-  void UpdateEstimatedPlayoutTimeBy10ms();
-
-  // Given the |sequence_number_current_received_rtp| and
-  // |timestamp_current_received_rtp| of currently received RTP update number
-  // of samples per packet.
-  void UpdateSamplesPerPacket(uint16_t sequence_number_current_received_rtp,
-                              uint32_t timestamp_current_received_rtp);
-
-  // Given the |sequence_number_current_received_rtp| of currently received RTP
-  // update the list. That is; some packets will change from late to missing,
-  // some packets are inserted as missing and some inserted as late.
-  void UpdateList(uint16_t sequence_number_current_received_rtp);
-
-  // Packets which are considered late for too long (according to
-  // |nack_threshold_packets_|) are flagged as missing.
-  void ChangeFromLateToMissing(uint16_t sequence_number_current_received_rtp);
-
-  // Packets which have sequence number older that
-  // |sequence_num_last_received_rtp_| - |max_nack_list_size_| are removed
-  // from the NACK list.
-  void LimitNackListSize();
-
-  // Estimate timestamp of a missing packet given its sequence number.
-  uint32_t EstimateTimestamp(uint16_t sequence_number);
-
-  // Compute time-to-play given a timestamp.
-  int64_t TimeToPlay(uint32_t timestamp) const;
-
-  // If packet N is arrived, any packet prior to N - |nack_threshold_packets_|
-  // which is not arrived is considered missing, and should be in NACK list.
-  // Also any packet in the range of N-1 and N - |nack_threshold_packets_|,
-  // exclusive, which is not arrived is considered late, and should should be
-  // in the list of late packets.
-  const int nack_threshold_packets_;
-
-  // Valid if a packet is received.
-  uint16_t sequence_num_last_received_rtp_;
-  uint32_t timestamp_last_received_rtp_;
-  bool any_rtp_received_;  // If any packet received.
-
-  // Valid if a packet is decoded.
-  uint16_t sequence_num_last_decoded_rtp_;
-  uint32_t timestamp_last_decoded_rtp_;
-  bool any_rtp_decoded_;  // If any packet decoded.
-
-  int sample_rate_khz_;  // Sample rate in kHz.
-
-  // Number of samples per packet. We update this every time we receive a
-  // packet, not only for consecutive packets.
-  int samples_per_packet_;
-
-  // A list of missing packets to be retransmitted. Components of the list
-  // contain the sequence number of missing packets and the estimated time that
-  // each pack is going to be played out.
-  NackList nack_list_;
-
-  // NACK list will not keep track of missing packets prior to
-  // |sequence_num_last_received_rtp_| - |max_nack_list_size_|.
-  size_t max_nack_list_size_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_CODING_NETEQ_NACK_TRACKER_H_
diff --git a/modules/audio_coding/neteq/nack_tracker_unittest.cc b/modules/audio_coding/neteq/nack_tracker_unittest.cc
deleted file mode 100644
index f27b512..0000000
--- a/modules/audio_coding/neteq/nack_tracker_unittest.cc
+++ /dev/null
@@ -1,483 +0,0 @@
-/*
- *  Copyright (c) 2013 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/neteq/nack_tracker.h"
-
-#include <stdint.h>
-
-#include <algorithm>
-#include <memory>
-
-#include "webrtc/modules/audio_coding/include/audio_coding_module_typedefs.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-namespace {
-
-const int kNackThreshold = 3;
-const int kSampleRateHz = 16000;
-const int kPacketSizeMs = 30;
-const uint32_t kTimestampIncrement = 480;  // 30 ms.
-const int64_t kShortRoundTripTimeMs = 1;
-
-bool IsNackListCorrect(const std::vector<uint16_t>& nack_list,
-                       const uint16_t* lost_sequence_numbers,
-                       size_t num_lost_packets) {
-  if (nack_list.size() != num_lost_packets)
-    return false;
-
-  if (num_lost_packets == 0)
-    return true;
-
-  for (size_t k = 0; k < nack_list.size(); ++k) {
-    int seq_num = nack_list[k];
-    bool seq_num_matched = false;
-    for (size_t n = 0; n < num_lost_packets; ++n) {
-      if (seq_num == lost_sequence_numbers[n]) {
-        seq_num_matched = true;
-        break;
-      }
-    }
-    if (!seq_num_matched)
-      return false;
-  }
-  return true;
-}
-
-}  // namespace
-
-TEST(NackTrackerTest, EmptyListWhenNoPacketLoss) {
-  std::unique_ptr<NackTracker> nack(NackTracker::Create(kNackThreshold));
-  nack->UpdateSampleRate(kSampleRateHz);
-
-  int seq_num = 1;
-  uint32_t timestamp = 0;
-
-  std::vector<uint16_t> nack_list;
-  for (int n = 0; n < 100; n++) {
-    nack->UpdateLastReceivedPacket(seq_num, timestamp);
-    nack_list = nack->GetNackList(kShortRoundTripTimeMs);
-    seq_num++;
-    timestamp += kTimestampIncrement;
-    nack_list = nack->GetNackList(kShortRoundTripTimeMs);
-    EXPECT_TRUE(nack_list.empty());
-  }
-}
-
-TEST(NackTrackerTest, NoNackIfReorderWithinNackThreshold) {
-  std::unique_ptr<NackTracker> nack(NackTracker::Create(kNackThreshold));
-  nack->UpdateSampleRate(kSampleRateHz);
-
-  int seq_num = 1;
-  uint32_t timestamp = 0;
-  std::vector<uint16_t> nack_list;
-
-  nack->UpdateLastReceivedPacket(seq_num, timestamp);
-  nack_list = nack->GetNackList(kShortRoundTripTimeMs);
-  EXPECT_TRUE(nack_list.empty());
-  int num_late_packets = kNackThreshold + 1;
-
-  // Push in reverse order
-  while (num_late_packets > 0) {
-    nack->UpdateLastReceivedPacket(
-        seq_num + num_late_packets,
-        timestamp + num_late_packets * kTimestampIncrement);
-    nack_list = nack->GetNackList(kShortRoundTripTimeMs);
-    EXPECT_TRUE(nack_list.empty());
-    num_late_packets--;
-  }
-}
-
-TEST(NackTrackerTest, LatePacketsMovedToNackThenNackListDoesNotChange) {
-  const uint16_t kSequenceNumberLostPackets[] = {2, 3, 4, 5, 6, 7, 8, 9};
-  static const int kNumAllLostPackets = sizeof(kSequenceNumberLostPackets) /
-                                        sizeof(kSequenceNumberLostPackets[0]);
-
-  for (int k = 0; k < 2; k++) {  // Two iteration with/without wrap around.
-    std::unique_ptr<NackTracker> nack(NackTracker::Create(kNackThreshold));
-    nack->UpdateSampleRate(kSampleRateHz);
-
-    uint16_t sequence_num_lost_packets[kNumAllLostPackets];
-    for (int n = 0; n < kNumAllLostPackets; n++) {
-      sequence_num_lost_packets[n] =
-          kSequenceNumberLostPackets[n] +
-          k * 65531;  // Have wrap around in sequence numbers for |k == 1|.
-    }
-    uint16_t seq_num = sequence_num_lost_packets[0] - 1;
-
-    uint32_t timestamp = 0;
-    std::vector<uint16_t> nack_list;
-
-    nack->UpdateLastReceivedPacket(seq_num, timestamp);
-    nack_list = nack->GetNackList(kShortRoundTripTimeMs);
-    EXPECT_TRUE(nack_list.empty());
-
-    seq_num = sequence_num_lost_packets[kNumAllLostPackets - 1] + 1;
-    timestamp += kTimestampIncrement * (kNumAllLostPackets + 1);
-    int num_lost_packets = std::max(0, kNumAllLostPackets - kNackThreshold);
-
-    for (int n = 0; n < kNackThreshold + 1; ++n) {
-      nack->UpdateLastReceivedPacket(seq_num, timestamp);
-      nack_list = nack->GetNackList(kShortRoundTripTimeMs);
-      EXPECT_TRUE(IsNackListCorrect(nack_list, sequence_num_lost_packets,
-                                    num_lost_packets));
-      seq_num++;
-      timestamp += kTimestampIncrement;
-      num_lost_packets++;
-    }
-
-    for (int n = 0; n < 100; ++n) {
-      nack->UpdateLastReceivedPacket(seq_num, timestamp);
-      nack_list = nack->GetNackList(kShortRoundTripTimeMs);
-      EXPECT_TRUE(IsNackListCorrect(nack_list, sequence_num_lost_packets,
-                                    kNumAllLostPackets));
-      seq_num++;
-      timestamp += kTimestampIncrement;
-    }
-  }
-}
-
-TEST(NackTrackerTest, ArrivedPacketsAreRemovedFromNackList) {
-  const uint16_t kSequenceNumberLostPackets[] = {2, 3, 4, 5, 6, 7, 8, 9};
-  static const int kNumAllLostPackets = sizeof(kSequenceNumberLostPackets) /
-                                        sizeof(kSequenceNumberLostPackets[0]);
-
-  for (int k = 0; k < 2; ++k) {  // Two iteration with/without wrap around.
-    std::unique_ptr<NackTracker> nack(NackTracker::Create(kNackThreshold));
-    nack->UpdateSampleRate(kSampleRateHz);
-
-    uint16_t sequence_num_lost_packets[kNumAllLostPackets];
-    for (int n = 0; n < kNumAllLostPackets; ++n) {
-      sequence_num_lost_packets[n] = kSequenceNumberLostPackets[n] +
-                                     k * 65531;  // Wrap around for |k == 1|.
-    }
-
-    uint16_t seq_num = sequence_num_lost_packets[0] - 1;
-    uint32_t timestamp = 0;
-
-    nack->UpdateLastReceivedPacket(seq_num, timestamp);
-    std::vector<uint16_t> nack_list = nack->GetNackList(kShortRoundTripTimeMs);
-    EXPECT_TRUE(nack_list.empty());
-
-    size_t index_retransmitted_rtp = 0;
-    uint32_t timestamp_retransmitted_rtp = timestamp + kTimestampIncrement;
-
-    seq_num = sequence_num_lost_packets[kNumAllLostPackets - 1] + 1;
-    timestamp += kTimestampIncrement * (kNumAllLostPackets + 1);
-    size_t num_lost_packets = std::max(0, kNumAllLostPackets - kNackThreshold);
-    for (int n = 0; n < kNumAllLostPackets; ++n) {
-      // Number of lost packets does not change for the first
-      // |kNackThreshold + 1| packets, one is added to the list and one is
-      // removed. Thereafter, the list shrinks every iteration.
-      if (n >= kNackThreshold + 1)
-        num_lost_packets--;
-
-      nack->UpdateLastReceivedPacket(seq_num, timestamp);
-      nack_list = nack->GetNackList(kShortRoundTripTimeMs);
-      EXPECT_TRUE(IsNackListCorrect(
-          nack_list, &sequence_num_lost_packets[index_retransmitted_rtp],
-          num_lost_packets));
-      seq_num++;
-      timestamp += kTimestampIncrement;
-
-      // Retransmission of a lost RTP.
-      nack->UpdateLastReceivedPacket(
-          sequence_num_lost_packets[index_retransmitted_rtp],
-          timestamp_retransmitted_rtp);
-      index_retransmitted_rtp++;
-      timestamp_retransmitted_rtp += kTimestampIncrement;
-
-      nack_list = nack->GetNackList(kShortRoundTripTimeMs);
-      EXPECT_TRUE(IsNackListCorrect(
-          nack_list, &sequence_num_lost_packets[index_retransmitted_rtp],
-          num_lost_packets - 1));  // One less lost packet in the list.
-    }
-    ASSERT_TRUE(nack_list.empty());
-  }
-}
-
-// Assess if estimation of timestamps and time-to-play is correct. Introduce all
-// combinations that timestamps and sequence numbers might have wrap around.
-TEST(NackTrackerTest, EstimateTimestampAndTimeToPlay) {
-  const uint16_t kLostPackets[] = {2, 3,  4,  5,  6,  7,  8,
-                                   9, 10, 11, 12, 13, 14, 15};
-  static const int kNumAllLostPackets =
-      sizeof(kLostPackets) / sizeof(kLostPackets[0]);
-
-  for (int k = 0; k < 4; ++k) {
-    std::unique_ptr<NackTracker> nack(NackTracker::Create(kNackThreshold));
-    nack->UpdateSampleRate(kSampleRateHz);
-
-    // Sequence number wrap around if |k| is 2 or 3;
-    int seq_num_offset = (k < 2) ? 0 : 65531;
-
-    // Timestamp wrap around if |k| is 1 or 3.
-    uint32_t timestamp_offset =
-        (k & 0x1) ? static_cast<uint32_t>(0xffffffff) - 6 : 0;
-
-    uint32_t timestamp_lost_packets[kNumAllLostPackets];
-    uint16_t seq_num_lost_packets[kNumAllLostPackets];
-    for (int n = 0; n < kNumAllLostPackets; ++n) {
-      timestamp_lost_packets[n] =
-          timestamp_offset + kLostPackets[n] * kTimestampIncrement;
-      seq_num_lost_packets[n] = seq_num_offset + kLostPackets[n];
-    }
-
-    // We and to push two packets before lost burst starts.
-    uint16_t seq_num = seq_num_lost_packets[0] - 2;
-    uint32_t timestamp = timestamp_lost_packets[0] - 2 * kTimestampIncrement;
-
-    const uint16_t first_seq_num = seq_num;
-    const uint32_t first_timestamp = timestamp;
-
-    // Two consecutive packets to have a correct estimate of timestamp increase.
-    nack->UpdateLastReceivedPacket(seq_num, timestamp);
-    seq_num++;
-    timestamp += kTimestampIncrement;
-    nack->UpdateLastReceivedPacket(seq_num, timestamp);
-
-    // A packet after the last one which is supposed to be lost.
-    seq_num = seq_num_lost_packets[kNumAllLostPackets - 1] + 1;
-    timestamp =
-        timestamp_lost_packets[kNumAllLostPackets - 1] + kTimestampIncrement;
-    nack->UpdateLastReceivedPacket(seq_num, timestamp);
-
-    NackTracker::NackList nack_list = nack->GetNackList();
-    EXPECT_EQ(static_cast<size_t>(kNumAllLostPackets), nack_list.size());
-
-    // Pretend the first packet is decoded.
-    nack->UpdateLastDecodedPacket(first_seq_num, first_timestamp);
-    nack_list = nack->GetNackList();
-
-    NackTracker::NackList::iterator it = nack_list.begin();
-    while (it != nack_list.end()) {
-      seq_num = it->first - seq_num_offset;
-      int index = seq_num - kLostPackets[0];
-      EXPECT_EQ(timestamp_lost_packets[index], it->second.estimated_timestamp);
-      EXPECT_EQ((index + 2) * kPacketSizeMs, it->second.time_to_play_ms);
-      ++it;
-    }
-
-    // Pretend 10 ms is passed, and we had pulled audio from NetEq, it still
-    // reports the same sequence number as decoded, time-to-play should be
-    // updated by 10 ms.
-    nack->UpdateLastDecodedPacket(first_seq_num, first_timestamp);
-    nack_list = nack->GetNackList();
-    it = nack_list.begin();
-    while (it != nack_list.end()) {
-      seq_num = it->first - seq_num_offset;
-      int index = seq_num - kLostPackets[0];
-      EXPECT_EQ((index + 2) * kPacketSizeMs - 10, it->second.time_to_play_ms);
-      ++it;
-    }
-  }
-}
-
-TEST(NackTrackerTest,
-     MissingPacketsPriorToLastDecodedRtpShouldNotBeInNackList) {
-  for (int m = 0; m < 2; ++m) {
-    uint16_t seq_num_offset = (m == 0) ? 0 : 65531;  // Wrap around if |m| is 1.
-    std::unique_ptr<NackTracker> nack(NackTracker::Create(kNackThreshold));
-    nack->UpdateSampleRate(kSampleRateHz);
-
-    // Two consecutive packets to have a correct estimate of timestamp increase.
-    uint16_t seq_num = 0;
-    nack->UpdateLastReceivedPacket(seq_num_offset + seq_num,
-                                   seq_num * kTimestampIncrement);
-    seq_num++;
-    nack->UpdateLastReceivedPacket(seq_num_offset + seq_num,
-                                   seq_num * kTimestampIncrement);
-
-    // Skip 10 packets (larger than NACK threshold).
-    const int kNumLostPackets = 10;
-    seq_num += kNumLostPackets + 1;
-    nack->UpdateLastReceivedPacket(seq_num_offset + seq_num,
-                                   seq_num * kTimestampIncrement);
-
-    const size_t kExpectedListSize = kNumLostPackets - kNackThreshold;
-    std::vector<uint16_t> nack_list = nack->GetNackList(kShortRoundTripTimeMs);
-    EXPECT_EQ(kExpectedListSize, nack_list.size());
-
-    for (int k = 0; k < 2; ++k) {
-      // Decoding of the first and the second arrived packets.
-      for (int n = 0; n < kPacketSizeMs / 10; ++n) {
-        nack->UpdateLastDecodedPacket(seq_num_offset + k,
-                                      k * kTimestampIncrement);
-        nack_list = nack->GetNackList(kShortRoundTripTimeMs);
-        EXPECT_EQ(kExpectedListSize, nack_list.size());
-      }
-    }
-
-    // Decoding of the last received packet.
-    nack->UpdateLastDecodedPacket(seq_num + seq_num_offset,
-                                  seq_num * kTimestampIncrement);
-    nack_list = nack->GetNackList(kShortRoundTripTimeMs);
-    EXPECT_TRUE(nack_list.empty());
-
-    // Make sure list of late packets is also empty. To check that, push few
-    // packets, if the late list is not empty its content will pop up in NACK
-    // list.
-    for (int n = 0; n < kNackThreshold + 10; ++n) {
-      seq_num++;
-      nack->UpdateLastReceivedPacket(seq_num_offset + seq_num,
-                                     seq_num * kTimestampIncrement);
-      nack_list = nack->GetNackList(kShortRoundTripTimeMs);
-      EXPECT_TRUE(nack_list.empty());
-    }
-  }
-}
-
-TEST(NackTrackerTest, Reset) {
-  std::unique_ptr<NackTracker> nack(NackTracker::Create(kNackThreshold));
-  nack->UpdateSampleRate(kSampleRateHz);
-
-  // Two consecutive packets to have a correct estimate of timestamp increase.
-  uint16_t seq_num = 0;
-  nack->UpdateLastReceivedPacket(seq_num, seq_num * kTimestampIncrement);
-  seq_num++;
-  nack->UpdateLastReceivedPacket(seq_num, seq_num * kTimestampIncrement);
-
-  // Skip 10 packets (larger than NACK threshold).
-  const int kNumLostPackets = 10;
-  seq_num += kNumLostPackets + 1;
-  nack->UpdateLastReceivedPacket(seq_num, seq_num * kTimestampIncrement);
-
-  const size_t kExpectedListSize = kNumLostPackets - kNackThreshold;
-  std::vector<uint16_t> nack_list = nack->GetNackList(kShortRoundTripTimeMs);
-  EXPECT_EQ(kExpectedListSize, nack_list.size());
-
-  nack->Reset();
-  nack_list = nack->GetNackList(kShortRoundTripTimeMs);
-  EXPECT_TRUE(nack_list.empty());
-}
-
-TEST(NackTrackerTest, ListSizeAppliedFromBeginning) {
-  const size_t kNackListSize = 10;
-  for (int m = 0; m < 2; ++m) {
-    uint16_t seq_num_offset = (m == 0) ? 0 : 65525;  // Wrap around if |m| is 1.
-    std::unique_ptr<NackTracker> nack(NackTracker::Create(kNackThreshold));
-    nack->UpdateSampleRate(kSampleRateHz);
-    nack->SetMaxNackListSize(kNackListSize);
-
-    uint16_t seq_num = seq_num_offset;
-    uint32_t timestamp = 0x12345678;
-    nack->UpdateLastReceivedPacket(seq_num, timestamp);
-
-    // Packet lost more than NACK-list size limit.
-    uint16_t num_lost_packets = kNackThreshold + kNackListSize + 5;
-
-    seq_num += num_lost_packets + 1;
-    timestamp += (num_lost_packets + 1) * kTimestampIncrement;
-    nack->UpdateLastReceivedPacket(seq_num, timestamp);
-
-    std::vector<uint16_t> nack_list = nack->GetNackList(kShortRoundTripTimeMs);
-    EXPECT_EQ(kNackListSize - kNackThreshold, nack_list.size());
-  }
-}
-
-TEST(NackTrackerTest, ChangeOfListSizeAppliedAndOldElementsRemoved) {
-  const size_t kNackListSize = 10;
-  for (int m = 0; m < 2; ++m) {
-    uint16_t seq_num_offset = (m == 0) ? 0 : 65525;  // Wrap around if |m| is 1.
-    std::unique_ptr<NackTracker> nack(NackTracker::Create(kNackThreshold));
-    nack->UpdateSampleRate(kSampleRateHz);
-
-    uint16_t seq_num = seq_num_offset;
-    uint32_t timestamp = 0x87654321;
-    nack->UpdateLastReceivedPacket(seq_num, timestamp);
-
-    // Packet lost more than NACK-list size limit.
-    uint16_t num_lost_packets = kNackThreshold + kNackListSize + 5;
-
-    std::unique_ptr<uint16_t[]> seq_num_lost(new uint16_t[num_lost_packets]);
-    for (int n = 0; n < num_lost_packets; ++n) {
-      seq_num_lost[n] = ++seq_num;
-    }
-
-    ++seq_num;
-    timestamp += (num_lost_packets + 1) * kTimestampIncrement;
-    nack->UpdateLastReceivedPacket(seq_num, timestamp);
-    size_t expected_size = num_lost_packets - kNackThreshold;
-
-    std::vector<uint16_t> nack_list = nack->GetNackList(kShortRoundTripTimeMs);
-    EXPECT_EQ(expected_size, nack_list.size());
-
-    nack->SetMaxNackListSize(kNackListSize);
-    expected_size = kNackListSize - kNackThreshold;
-    nack_list = nack->GetNackList(kShortRoundTripTimeMs);
-    EXPECT_TRUE(IsNackListCorrect(
-        nack_list, &seq_num_lost[num_lost_packets - kNackListSize],
-        expected_size));
-
-    // NACK list does not change size but the content is changing. The oldest
-    // element is removed and one from late list is inserted.
-    size_t n;
-    for (n = 1; n <= static_cast<size_t>(kNackThreshold); ++n) {
-      ++seq_num;
-      timestamp += kTimestampIncrement;
-      nack->UpdateLastReceivedPacket(seq_num, timestamp);
-      nack_list = nack->GetNackList(kShortRoundTripTimeMs);
-      EXPECT_TRUE(IsNackListCorrect(
-          nack_list, &seq_num_lost[num_lost_packets - kNackListSize + n],
-          expected_size));
-    }
-
-    // NACK list should shrink.
-    for (; n < kNackListSize; ++n) {
-      ++seq_num;
-      timestamp += kTimestampIncrement;
-      nack->UpdateLastReceivedPacket(seq_num, timestamp);
-      --expected_size;
-      nack_list = nack->GetNackList(kShortRoundTripTimeMs);
-      EXPECT_TRUE(IsNackListCorrect(
-          nack_list, &seq_num_lost[num_lost_packets - kNackListSize + n],
-          expected_size));
-    }
-
-    // After this packet, NACK list should be empty.
-    ++seq_num;
-    timestamp += kTimestampIncrement;
-    nack->UpdateLastReceivedPacket(seq_num, timestamp);
-    nack_list = nack->GetNackList(kShortRoundTripTimeMs);
-    EXPECT_TRUE(nack_list.empty());
-  }
-}
-
-TEST(NackTrackerTest, RoudTripTimeIsApplied) {
-  const int kNackListSize = 200;
-  std::unique_ptr<NackTracker> nack(NackTracker::Create(kNackThreshold));
-  nack->UpdateSampleRate(kSampleRateHz);
-  nack->SetMaxNackListSize(kNackListSize);
-
-  uint16_t seq_num = 0;
-  uint32_t timestamp = 0x87654321;
-  nack->UpdateLastReceivedPacket(seq_num, timestamp);
-
-  // Packet lost more than NACK-list size limit.
-  uint16_t kNumLostPackets = kNackThreshold + 5;
-
-  seq_num += (1 + kNumLostPackets);
-  timestamp += (1 + kNumLostPackets) * kTimestampIncrement;
-  nack->UpdateLastReceivedPacket(seq_num, timestamp);
-
-  // Expected time-to-play are:
-  // kPacketSizeMs - 10, 2*kPacketSizeMs - 10, 3*kPacketSizeMs - 10, ...
-  //
-  // sequence number:  1,  2,  3,   4,   5
-  // time-to-play:    20, 50, 80, 110, 140
-  //
-  std::vector<uint16_t> nack_list = nack->GetNackList(100);
-  ASSERT_EQ(2u, nack_list.size());
-  EXPECT_EQ(4, nack_list[0]);
-  EXPECT_EQ(5, nack_list[1]);
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/neteq/neteq.cc b/modules/audio_coding/neteq/neteq.cc
deleted file mode 100644
index 73233c4..0000000
--- a/modules/audio_coding/neteq/neteq.cc
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- *  Copyright (c) 2012 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/neteq/include/neteq.h"
-
-#include <memory>
-#include <sstream>
-
-#include "webrtc/modules/audio_coding/neteq/neteq_impl.h"
-
-namespace webrtc {
-
-std::string NetEq::Config::ToString() const {
-  std::stringstream ss;
-  ss << "sample_rate_hz=" << sample_rate_hz
-     << ", enable_post_decode_vad="
-     << (enable_post_decode_vad ? "true" : "false")
-     << ", max_packets_in_buffer=" << max_packets_in_buffer
-     << ", background_noise_mode=" << background_noise_mode
-     << ", playout_mode=" << playout_mode
-     << ", enable_fast_accelerate="
-     << (enable_fast_accelerate ? " true": "false")
-     << ", enable_muted_state=" << (enable_muted_state ? " true": "false");
-  return ss.str();
-}
-
-// Creates all classes needed and inject them into a new NetEqImpl object.
-// Return the new object.
-NetEq* NetEq::Create(
-    const NetEq::Config& config,
-    const rtc::scoped_refptr<AudioDecoderFactory>& decoder_factory) {
-  return new NetEqImpl(config,
-                       NetEqImpl::Dependencies(config, decoder_factory));
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/neteq/neteq_decoder_enum.cc b/modules/audio_coding/neteq/neteq_decoder_enum.cc
deleted file mode 100644
index e9abf20..0000000
--- a/modules/audio_coding/neteq/neteq_decoder_enum.cc
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- *  Copyright (c) 2017 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 <map>
-#include <string>
-
-#include "webrtc/modules/audio_coding/neteq/neteq_decoder_enum.h"
-
-namespace webrtc {
-
-rtc::Optional<SdpAudioFormat> NetEqDecoderToSdpAudioFormat(NetEqDecoder nd) {
-  switch (nd) {
-    case NetEqDecoder::kDecoderPCMu:
-      return rtc::Optional<SdpAudioFormat>(SdpAudioFormat("pcmu", 8000, 1));
-    case NetEqDecoder::kDecoderPCMa:
-      return rtc::Optional<SdpAudioFormat>(SdpAudioFormat("pcma", 8000, 1));
-    case NetEqDecoder::kDecoderPCMu_2ch:
-      return rtc::Optional<SdpAudioFormat>(SdpAudioFormat("pcmu", 8000, 2));
-    case NetEqDecoder::kDecoderPCMa_2ch:
-      return rtc::Optional<SdpAudioFormat>(SdpAudioFormat("pcma", 8000, 2));
-    case NetEqDecoder::kDecoderILBC:
-      return rtc::Optional<SdpAudioFormat>(SdpAudioFormat("ilbc", 8000, 1));
-    case NetEqDecoder::kDecoderISAC:
-      return rtc::Optional<SdpAudioFormat>(SdpAudioFormat("isac", 16000, 1));
-    case NetEqDecoder::kDecoderISACswb:
-      return rtc::Optional<SdpAudioFormat>(SdpAudioFormat("isac", 32000, 1));
-    case NetEqDecoder::kDecoderPCM16B:
-      return rtc::Optional<SdpAudioFormat>(SdpAudioFormat("l16", 8000, 1));
-    case NetEqDecoder::kDecoderPCM16Bwb:
-      return rtc::Optional<SdpAudioFormat>(SdpAudioFormat("l16", 16000, 1));
-    case NetEqDecoder::kDecoderPCM16Bswb32kHz:
-      return rtc::Optional<SdpAudioFormat>(SdpAudioFormat("l16", 32000, 1));
-    case NetEqDecoder::kDecoderPCM16Bswb48kHz:
-      return rtc::Optional<SdpAudioFormat>(SdpAudioFormat("l16", 48000, 1));
-    case NetEqDecoder::kDecoderPCM16B_2ch:
-      return rtc::Optional<SdpAudioFormat>(SdpAudioFormat("l16", 8000, 2));
-    case NetEqDecoder::kDecoderPCM16Bwb_2ch:
-      return rtc::Optional<SdpAudioFormat>(SdpAudioFormat("l16", 16000, 2));
-    case NetEqDecoder::kDecoderPCM16Bswb32kHz_2ch:
-      return rtc::Optional<SdpAudioFormat>(SdpAudioFormat("l16", 32000, 2));
-    case NetEqDecoder::kDecoderPCM16Bswb48kHz_2ch:
-      return rtc::Optional<SdpAudioFormat>(SdpAudioFormat("l16", 48000, 2));
-    case NetEqDecoder::kDecoderPCM16B_5ch:
-      return rtc::Optional<SdpAudioFormat>(SdpAudioFormat("l16", 8000, 5));
-    case NetEqDecoder::kDecoderG722:
-      return rtc::Optional<SdpAudioFormat>(SdpAudioFormat("g722", 8000, 1));
-    case NetEqDecoder::kDecoderG722_2ch:
-      return rtc::Optional<SdpAudioFormat>(SdpAudioFormat("g722", 8000, 2));
-    case NetEqDecoder::kDecoderOpus:
-      return rtc::Optional<SdpAudioFormat>(SdpAudioFormat("opus", 48000, 2));
-    case NetEqDecoder::kDecoderOpus_2ch:
-      return rtc::Optional<SdpAudioFormat>(
-          SdpAudioFormat("opus", 48000, 2,
-                         std::map<std::string, std::string>{{"stereo", "1"}}));
-    case NetEqDecoder::kDecoderRED:
-      return rtc::Optional<SdpAudioFormat>(SdpAudioFormat("red", 8000, 1));
-    case NetEqDecoder::kDecoderAVT:
-      return rtc::Optional<SdpAudioFormat>(
-          SdpAudioFormat("telephone-event", 8000, 1));
-    case NetEqDecoder::kDecoderAVT16kHz:
-      return rtc::Optional<SdpAudioFormat>(
-          SdpAudioFormat("telephone-event", 16000, 1));
-    case NetEqDecoder::kDecoderAVT32kHz:
-      return rtc::Optional<SdpAudioFormat>(
-          SdpAudioFormat("telephone-event", 32000, 1));
-    case NetEqDecoder::kDecoderAVT48kHz:
-      return rtc::Optional<SdpAudioFormat>(
-          SdpAudioFormat("telephone-event", 48000, 1));
-    case NetEqDecoder::kDecoderCNGnb:
-      return rtc::Optional<SdpAudioFormat>(SdpAudioFormat("cn", 8000, 1));
-    case NetEqDecoder::kDecoderCNGwb:
-      return rtc::Optional<SdpAudioFormat>(SdpAudioFormat("cn", 16000, 1));
-    case NetEqDecoder::kDecoderCNGswb32kHz:
-      return rtc::Optional<SdpAudioFormat>(SdpAudioFormat("cn", 32000, 1));
-    case NetEqDecoder::kDecoderCNGswb48kHz:
-      return rtc::Optional<SdpAudioFormat>(SdpAudioFormat("cn", 48000, 1));
-    default:
-      return rtc::Optional<SdpAudioFormat>();
-  }
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/neteq/neteq_decoder_enum.h b/modules/audio_coding/neteq/neteq_decoder_enum.h
deleted file mode 100644
index e108ccf..0000000
--- a/modules/audio_coding/neteq/neteq_decoder_enum.h
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- *  Copyright (c) 2017 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_NETEQ_NETEQ_DECODER_ENUM_H_
-#define WEBRTC_MODULES_AUDIO_CODING_NETEQ_NETEQ_DECODER_ENUM_H_
-
-#include "webrtc/api/audio_codecs/audio_format.h"
-#include "webrtc/api/optional.h"
-
-namespace webrtc {
-
-enum class NetEqDecoder {
-  kDecoderPCMu,
-  kDecoderPCMa,
-  kDecoderPCMu_2ch,
-  kDecoderPCMa_2ch,
-  kDecoderILBC,
-  kDecoderISAC,
-  kDecoderISACswb,
-  kDecoderPCM16B,
-  kDecoderPCM16Bwb,
-  kDecoderPCM16Bswb32kHz,
-  kDecoderPCM16Bswb48kHz,
-  kDecoderPCM16B_2ch,
-  kDecoderPCM16Bwb_2ch,
-  kDecoderPCM16Bswb32kHz_2ch,
-  kDecoderPCM16Bswb48kHz_2ch,
-  kDecoderPCM16B_5ch,
-  kDecoderG722,
-  kDecoderG722_2ch,
-  kDecoderRED,
-  kDecoderAVT,
-  kDecoderAVT16kHz,
-  kDecoderAVT32kHz,
-  kDecoderAVT48kHz,
-  kDecoderCNGnb,
-  kDecoderCNGwb,
-  kDecoderCNGswb32kHz,
-  kDecoderCNGswb48kHz,
-  kDecoderArbitrary,
-  kDecoderOpus,
-  kDecoderOpus_2ch,
-};
-
-rtc::Optional<SdpAudioFormat> NetEqDecoderToSdpAudioFormat(NetEqDecoder nd);
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_CODING_NETEQ_NETEQ_DECODER_ENUM_H_
diff --git a/modules/audio_coding/neteq/neteq_external_decoder_unittest.cc b/modules/audio_coding/neteq/neteq_external_decoder_unittest.cc
deleted file mode 100644
index ecdcafa..0000000
--- a/modules/audio_coding/neteq/neteq_external_decoder_unittest.cc
+++ /dev/null
@@ -1,457 +0,0 @@
-/*
- *  Copyright (c) 2013 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.
- */
-
-// Test to verify correct operation for externally created decoders.
-
-#include <memory>
-
-#include "webrtc/api/audio_codecs/builtin_audio_decoder_factory.h"
-#include "webrtc/common_types.h"
-#include "webrtc/modules/audio_coding/neteq/mock/mock_external_decoder_pcm16b.h"
-#include "webrtc/modules/audio_coding/neteq/tools/input_audio_file.h"
-#include "webrtc/modules/audio_coding/neteq/tools/neteq_external_decoder_test.h"
-#include "webrtc/modules/audio_coding/neteq/tools/rtp_generator.h"
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/test/gmock.h"
-#include "webrtc/test/testsupport/fileutils.h"
-
-namespace webrtc {
-
-using ::testing::_;
-using ::testing::Return;
-
-class NetEqExternalDecoderUnitTest : public test::NetEqExternalDecoderTest {
- protected:
-  static const int kFrameSizeMs = 10;  // Frame size of Pcm16B.
-
-  NetEqExternalDecoderUnitTest(NetEqDecoder codec,
-                               int sample_rate_hz,
-                               MockExternalPcm16B* decoder)
-      : NetEqExternalDecoderTest(codec, sample_rate_hz, decoder),
-        external_decoder_(decoder),
-        samples_per_ms_(sample_rate_hz / 1000),
-        frame_size_samples_(kFrameSizeMs * samples_per_ms_),
-        rtp_generator_(new test::RtpGenerator(samples_per_ms_)),
-        input_(new int16_t[frame_size_samples_]),
-        // Payload should be no larger than input.
-        encoded_(new uint8_t[2 * frame_size_samples_]),
-        payload_size_bytes_(0),
-        last_send_time_(0),
-        last_arrival_time_(0) {
-    // NetEq is not allowed to delete the external decoder (hence Times(0)).
-    EXPECT_CALL(*external_decoder_, Die()).Times(0);
-    Init();
-
-    const std::string file_name =
-        webrtc::test::ResourcePath("audio_coding/testfile32kHz", "pcm");
-    input_file_.reset(new test::InputAudioFile(file_name));
-  }
-
-  virtual ~NetEqExternalDecoderUnitTest() {
-    delete [] input_;
-    delete [] encoded_;
-    // ~NetEqExternalDecoderTest() will delete |external_decoder_|, so expecting
-    // Die() to be called.
-    EXPECT_CALL(*external_decoder_, Die()).Times(1);
-  }
-
-  // Method to draw kFrameSizeMs audio and verify the output.
-  // Use gTest methods. e.g. ASSERT_EQ() inside to trigger errors.
-  virtual void GetAndVerifyOutput() = 0;
-
-  // Method to get the number of calls to the Decode() method of the external
-  // decoder.
-  virtual int NumExpectedDecodeCalls(int num_loops) = 0;
-
-  // Method to generate packets and return the send time of the packet.
-  int GetNewPacket() {
-    if (!input_file_->Read(frame_size_samples_, input_)) {
-      return -1;
-    }
-    payload_size_bytes_ = WebRtcPcm16b_Encode(input_, frame_size_samples_,
-                                              encoded_);
-
-    int next_send_time = rtp_generator_->GetRtpHeader(
-        kPayloadType, frame_size_samples_, &rtp_header_);
-    return next_send_time;
-  }
-
-  // Method to decide packet losses.
-  virtual bool Lost() { return false; }
-
-  // Method to calculate packet arrival time.
-  int GetArrivalTime(int send_time) {
-    int arrival_time = last_arrival_time_ + (send_time - last_send_time_);
-    last_send_time_ = send_time;
-    last_arrival_time_ = arrival_time;
-    return arrival_time;
-  }
-
-  void RunTest(int num_loops) {
-    // Get next input packets (mono and multi-channel).
-    uint32_t next_send_time;
-    uint32_t next_arrival_time;
-    do {
-      next_send_time = GetNewPacket();
-      next_arrival_time = GetArrivalTime(next_send_time);
-    } while (Lost());  // If lost, immediately read the next packet.
-
-    EXPECT_CALL(
-        *external_decoder_,
-        DecodeInternal(_, payload_size_bytes_, 1000 * samples_per_ms_, _, _))
-        .Times(NumExpectedDecodeCalls(num_loops));
-
-    uint32_t time_now = 0;
-    for (int k = 0; k < num_loops; ++k) {
-      while (time_now >= next_arrival_time) {
-        InsertPacket(rtp_header_, rtc::ArrayView<const uint8_t>(
-                                      encoded_, payload_size_bytes_),
-                     next_arrival_time);
-        // Get next input packet.
-        do {
-          next_send_time = GetNewPacket();
-          next_arrival_time = GetArrivalTime(next_send_time);
-        } while (Lost());  // If lost, immediately read the next packet.
-      }
-
-      std::ostringstream ss;
-      ss << "Lap number " << k << ".";
-      SCOPED_TRACE(ss.str());  // Print out the parameter values on failure.
-      // Compare mono and multi-channel.
-      ASSERT_NO_FATAL_FAILURE(GetAndVerifyOutput());
-
-      time_now += kOutputLengthMs;
-    }
-  }
-
-  void InsertPacket(RTPHeader rtp_header,
-                    rtc::ArrayView<const uint8_t> payload,
-                    uint32_t receive_timestamp) override {
-    EXPECT_CALL(*external_decoder_,
-                IncomingPacket(_, payload.size(), rtp_header.sequenceNumber,
-                               rtp_header.timestamp, receive_timestamp));
-    NetEqExternalDecoderTest::InsertPacket(rtp_header, payload,
-                                           receive_timestamp);
-  }
-
-  MockExternalPcm16B* external_decoder() { return external_decoder_.get(); }
-
-  void ResetRtpGenerator(test::RtpGenerator* rtp_generator) {
-    rtp_generator_.reset(rtp_generator);
-  }
-
-  int samples_per_ms() const { return samples_per_ms_; }
- private:
-  std::unique_ptr<MockExternalPcm16B> external_decoder_;
-  int samples_per_ms_;
-  size_t frame_size_samples_;
-  std::unique_ptr<test::RtpGenerator> rtp_generator_;
-  int16_t* input_;
-  uint8_t* encoded_;
-  size_t payload_size_bytes_;
-  uint32_t last_send_time_;
-  uint32_t last_arrival_time_;
-  std::unique_ptr<test::InputAudioFile> input_file_;
-  RTPHeader rtp_header_;
-};
-
-// This test encodes a few packets of PCM16b 32 kHz data and inserts it into two
-// different NetEq instances. The first instance uses the internal version of
-// the decoder object, while the second one uses an externally created decoder
-// object (ExternalPcm16B wrapped in MockExternalPcm16B, both defined above).
-// The test verifies that the output from both instances match.
-class NetEqExternalVsInternalDecoderTest : public NetEqExternalDecoderUnitTest,
-                                           public ::testing::Test {
- protected:
-  static const size_t kMaxBlockSize = 480;  // 10 ms @ 48 kHz.
-
-  NetEqExternalVsInternalDecoderTest()
-      : NetEqExternalDecoderUnitTest(NetEqDecoder::kDecoderPCM16Bswb32kHz,
-                                     32000,
-                                     new MockExternalPcm16B(32000)),
-        sample_rate_hz_(32000) {
-    NetEq::Config config;
-    config.sample_rate_hz = sample_rate_hz_;
-    neteq_internal_.reset(
-        NetEq::Create(config, CreateBuiltinAudioDecoderFactory()));
-  }
-
-  void SetUp() override {
-    ASSERT_EQ(true, neteq_internal_->RegisterPayloadType(
-                        kPayloadType, SdpAudioFormat("L16", 32000, 1)));
-  }
-
-  void GetAndVerifyOutput() override {
-    // Get audio from internal decoder instance.
-    bool muted;
-    EXPECT_EQ(NetEq::kOK, neteq_internal_->GetAudio(&output_internal_, &muted));
-    ASSERT_FALSE(muted);
-    EXPECT_EQ(1u, output_internal_.num_channels_);
-    EXPECT_EQ(static_cast<size_t>(kOutputLengthMs * sample_rate_hz_ / 1000),
-              output_internal_.samples_per_channel_);
-
-    // Get audio from external decoder instance.
-    GetOutputAudio(&output_);
-
-    const int16_t* output_data = output_.data();
-    const int16_t* output_internal_data = output_internal_.data();
-    for (size_t i = 0; i < output_.samples_per_channel_; ++i) {
-      ASSERT_EQ(output_data[i], output_internal_data[i])
-          << "Diff in sample " << i << ".";
-    }
-  }
-
-  void InsertPacket(RTPHeader rtp_header,
-                    rtc::ArrayView<const uint8_t> payload,
-                    uint32_t receive_timestamp) override {
-    // Insert packet in internal decoder.
-    ASSERT_EQ(NetEq::kOK, neteq_internal_->InsertPacket(rtp_header, payload,
-                                                        receive_timestamp));
-
-    // Insert packet in external decoder instance.
-    NetEqExternalDecoderUnitTest::InsertPacket(rtp_header, payload,
-                                               receive_timestamp);
-  }
-
-  int NumExpectedDecodeCalls(int num_loops) override { return num_loops; }
-
- private:
-  int sample_rate_hz_;
-  std::unique_ptr<NetEq> neteq_internal_;
-  AudioFrame output_internal_;
-  AudioFrame output_;
-};
-
-TEST_F(NetEqExternalVsInternalDecoderTest, RunTest) {
-  RunTest(100);  // Run 100 laps @ 10 ms each in the test loop.
-}
-
-class LargeTimestampJumpTest : public NetEqExternalDecoderUnitTest,
-                               public ::testing::Test {
- protected:
-  static const size_t kMaxBlockSize = 480;  // 10 ms @ 48 kHz.
-
-  enum TestStates {
-    kInitialPhase,
-    kNormalPhase,
-    kExpandPhase,
-    kFadedExpandPhase,
-    kRecovered
-  };
-
-  LargeTimestampJumpTest()
-      : NetEqExternalDecoderUnitTest(NetEqDecoder::kDecoderPCM16B,
-                                     8000,
-                                     new MockExternalPcm16B(8000)),
-        test_state_(kInitialPhase) {
-    EXPECT_CALL(*external_decoder(), HasDecodePlc())
-        .WillRepeatedly(Return(false));
-  }
-
-  virtual void UpdateState(AudioFrame::SpeechType output_type) {
-    switch (test_state_) {
-      case kInitialPhase: {
-        if (output_type == AudioFrame::kNormalSpeech) {
-          test_state_ = kNormalPhase;
-        }
-        break;
-      }
-      case kNormalPhase: {
-        if (output_type == AudioFrame::kPLC) {
-          test_state_ = kExpandPhase;
-        }
-        break;
-      }
-      case kExpandPhase: {
-        if (output_type == AudioFrame::kPLCCNG) {
-          test_state_ = kFadedExpandPhase;
-        } else if (output_type == AudioFrame::kNormalSpeech) {
-          test_state_ = kRecovered;
-        }
-        break;
-      }
-      case kFadedExpandPhase: {
-        if (output_type == AudioFrame::kNormalSpeech) {
-          test_state_ = kRecovered;
-        }
-        break;
-      }
-      case kRecovered: {
-        break;
-      }
-    }
-  }
-
-  void GetAndVerifyOutput() override {
-    AudioFrame output;
-    GetOutputAudio(&output);
-    UpdateState(output.speech_type_);
-
-    if (test_state_ == kExpandPhase || test_state_ == kFadedExpandPhase) {
-      // Don't verify the output in this phase of the test.
-      return;
-    }
-
-    ASSERT_EQ(1u, output.num_channels_);
-    const int16_t* output_data = output.data();
-    for (size_t i = 0; i < output.samples_per_channel_; ++i) {
-      if (output_data[i] != 0)
-        return;
-    }
-    EXPECT_TRUE(false)
-        << "Expected at least one non-zero sample in each output block.";
-  }
-
-  int NumExpectedDecodeCalls(int num_loops) override {
-    // Some packets at the end of the stream won't be decoded. When the jump in
-    // timestamp happens, NetEq will do Expand during one GetAudio call. In the
-    // next call it will decode the packet after the jump, but the net result is
-    // that the delay increased by 1 packet. In another call, a Pre-emptive
-    // Expand operation is performed, leading to delay increase by 1 packet. In
-    // total, the test will end with a 2-packet delay, which results in the 2
-    // last packets not being decoded.
-    return num_loops - 2;
-  }
-
-  TestStates test_state_;
-};
-
-TEST_F(LargeTimestampJumpTest, JumpLongerThanHalfRange) {
-  // Set the timestamp series to start at 2880, increase to 7200, then jump to
-  // 2869342376. The sequence numbers start at 42076 and increase by 1 for each
-  // packet, also when the timestamp jumps.
-  static const uint16_t kStartSeqeunceNumber = 42076;
-  static const uint32_t kStartTimestamp = 2880;
-  static const uint32_t kJumpFromTimestamp = 7200;
-  static const uint32_t kJumpToTimestamp = 2869342376;
-  static_assert(kJumpFromTimestamp < kJumpToTimestamp,
-                "timestamp jump should not result in wrap");
-  static_assert(
-      static_cast<uint32_t>(kJumpToTimestamp - kJumpFromTimestamp) > 0x7FFFFFFF,
-      "jump should be larger than half range");
-  // Replace the default RTP generator with one that jumps in timestamp.
-  ResetRtpGenerator(new test::TimestampJumpRtpGenerator(samples_per_ms(),
-                                                        kStartSeqeunceNumber,
-                                                        kStartTimestamp,
-                                                        kJumpFromTimestamp,
-                                                        kJumpToTimestamp));
-
-  RunTest(130);  // Run 130 laps @ 10 ms each in the test loop.
-  EXPECT_EQ(kRecovered, test_state_);
-}
-
-TEST_F(LargeTimestampJumpTest, JumpLongerThanHalfRangeAndWrap) {
-  // Make a jump larger than half the 32-bit timestamp range. Set the start
-  // timestamp such that the jump will result in a wrap around.
-  static const uint16_t kStartSeqeunceNumber = 42076;
-  // Set the jump length slightly larger than 2^31.
-  static const uint32_t kStartTimestamp = 3221223116;
-  static const uint32_t kJumpFromTimestamp = 3221223216;
-  static const uint32_t kJumpToTimestamp = 1073744278;
-  static_assert(kJumpToTimestamp < kJumpFromTimestamp,
-                "timestamp jump should result in wrap");
-  static_assert(
-      static_cast<uint32_t>(kJumpToTimestamp - kJumpFromTimestamp) > 0x7FFFFFFF,
-      "jump should be larger than half range");
-  // Replace the default RTP generator with one that jumps in timestamp.
-  ResetRtpGenerator(new test::TimestampJumpRtpGenerator(samples_per_ms(),
-                                                        kStartSeqeunceNumber,
-                                                        kStartTimestamp,
-                                                        kJumpFromTimestamp,
-                                                        kJumpToTimestamp));
-
-  RunTest(130);  // Run 130 laps @ 10 ms each in the test loop.
-  EXPECT_EQ(kRecovered, test_state_);
-}
-
-class ShortTimestampJumpTest : public LargeTimestampJumpTest {
- protected:
-  void UpdateState(AudioFrame::SpeechType output_type) override {
-    switch (test_state_) {
-      case kInitialPhase: {
-        if (output_type == AudioFrame::kNormalSpeech) {
-          test_state_ = kNormalPhase;
-        }
-        break;
-      }
-      case kNormalPhase: {
-        if (output_type == AudioFrame::kPLC) {
-          test_state_ = kExpandPhase;
-        }
-        break;
-      }
-      case kExpandPhase: {
-        if (output_type == AudioFrame::kNormalSpeech) {
-          test_state_ = kRecovered;
-        }
-        break;
-      }
-      case kRecovered: {
-        break;
-      }
-      default: { FAIL(); }
-    }
-  }
-
-  int NumExpectedDecodeCalls(int num_loops) override {
-    // Some packets won't be decoded because of the timestamp jump.
-    return num_loops - 2;
-  }
-};
-
-TEST_F(ShortTimestampJumpTest, JumpShorterThanHalfRange) {
-  // Make a jump shorter than half the 32-bit timestamp range. Set the start
-  // timestamp such that the jump will not result in a wrap around.
-  static const uint16_t kStartSeqeunceNumber = 42076;
-  // Set the jump length slightly smaller than 2^31.
-  static const uint32_t kStartTimestamp = 4711;
-  static const uint32_t kJumpFromTimestamp = 4811;
-  static const uint32_t kJumpToTimestamp = 2147483747;
-  static_assert(kJumpFromTimestamp < kJumpToTimestamp,
-                "timestamp jump should not result in wrap");
-  static_assert(
-      static_cast<uint32_t>(kJumpToTimestamp - kJumpFromTimestamp) < 0x7FFFFFFF,
-      "jump should be smaller than half range");
-  // Replace the default RTP generator with one that jumps in timestamp.
-  ResetRtpGenerator(new test::TimestampJumpRtpGenerator(samples_per_ms(),
-                                                        kStartSeqeunceNumber,
-                                                        kStartTimestamp,
-                                                        kJumpFromTimestamp,
-                                                        kJumpToTimestamp));
-
-  RunTest(130);  // Run 130 laps @ 10 ms each in the test loop.
-  EXPECT_EQ(kRecovered, test_state_);
-}
-
-TEST_F(ShortTimestampJumpTest, JumpShorterThanHalfRangeAndWrap) {
-  // Make a jump shorter than half the 32-bit timestamp range. Set the start
-  // timestamp such that the jump will result in a wrap around.
-  static const uint16_t kStartSeqeunceNumber = 42076;
-  // Set the jump length slightly smaller than 2^31.
-  static const uint32_t kStartTimestamp = 3221227827;
-  static const uint32_t kJumpFromTimestamp = 3221227927;
-  static const uint32_t kJumpToTimestamp = 1073739567;
-  static_assert(kJumpToTimestamp < kJumpFromTimestamp,
-                "timestamp jump should result in wrap");
-  static_assert(
-      static_cast<uint32_t>(kJumpToTimestamp - kJumpFromTimestamp) < 0x7FFFFFFF,
-      "jump should be smaller than half range");
-  // Replace the default RTP generator with one that jumps in timestamp.
-  ResetRtpGenerator(new test::TimestampJumpRtpGenerator(samples_per_ms(),
-                                                        kStartSeqeunceNumber,
-                                                        kStartTimestamp,
-                                                        kJumpFromTimestamp,
-                                                        kJumpToTimestamp));
-
-  RunTest(130);  // Run 130 laps @ 10 ms each in the test loop.
-  EXPECT_EQ(kRecovered, test_state_);
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/neteq/neteq_impl.cc b/modules/audio_coding/neteq/neteq_impl.cc
deleted file mode 100644
index 7858e84..0000000
--- a/modules/audio_coding/neteq/neteq_impl.cc
+++ /dev/null
@@ -1,2124 +0,0 @@
-/*
- *  Copyright (c) 2012 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/neteq/neteq_impl.h"
-
-#include <assert.h>
-
-#include <algorithm>
-#include <utility>
-#include <vector>
-
-#include "webrtc/api/audio_codecs/audio_decoder.h"
-#include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
-#include "webrtc/modules/audio_coding/neteq/accelerate.h"
-#include "webrtc/modules/audio_coding/neteq/background_noise.h"
-#include "webrtc/modules/audio_coding/neteq/buffer_level_filter.h"
-#include "webrtc/modules/audio_coding/neteq/comfort_noise.h"
-#include "webrtc/modules/audio_coding/neteq/decision_logic.h"
-#include "webrtc/modules/audio_coding/neteq/decoder_database.h"
-#include "webrtc/modules/audio_coding/neteq/defines.h"
-#include "webrtc/modules/audio_coding/neteq/delay_manager.h"
-#include "webrtc/modules/audio_coding/neteq/delay_peak_detector.h"
-#include "webrtc/modules/audio_coding/neteq/dtmf_buffer.h"
-#include "webrtc/modules/audio_coding/neteq/dtmf_tone_generator.h"
-#include "webrtc/modules/audio_coding/neteq/expand.h"
-#include "webrtc/modules/audio_coding/neteq/merge.h"
-#include "webrtc/modules/audio_coding/neteq/nack_tracker.h"
-#include "webrtc/modules/audio_coding/neteq/normal.h"
-#include "webrtc/modules/audio_coding/neteq/packet.h"
-#include "webrtc/modules/audio_coding/neteq/packet_buffer.h"
-#include "webrtc/modules/audio_coding/neteq/post_decode_vad.h"
-#include "webrtc/modules/audio_coding/neteq/preemptive_expand.h"
-#include "webrtc/modules/audio_coding/neteq/red_payload_splitter.h"
-#include "webrtc/modules/audio_coding/neteq/sync_buffer.h"
-#include "webrtc/modules/audio_coding/neteq/tick_timer.h"
-#include "webrtc/modules/audio_coding/neteq/timestamp_scaler.h"
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/safe_conversions.h"
-#include "webrtc/rtc_base/sanitizer.h"
-#include "webrtc/rtc_base/trace_event.h"
-
-namespace webrtc {
-
-NetEqImpl::Dependencies::Dependencies(
-    const NetEq::Config& config,
-    const rtc::scoped_refptr<AudioDecoderFactory>& decoder_factory)
-    : tick_timer(new TickTimer),
-      buffer_level_filter(new BufferLevelFilter),
-      decoder_database(new DecoderDatabase(decoder_factory)),
-      delay_peak_detector(new DelayPeakDetector(tick_timer.get())),
-      delay_manager(new DelayManager(config.max_packets_in_buffer,
-                                     delay_peak_detector.get(),
-                                     tick_timer.get())),
-      dtmf_buffer(new DtmfBuffer(config.sample_rate_hz)),
-      dtmf_tone_generator(new DtmfToneGenerator),
-      packet_buffer(
-          new PacketBuffer(config.max_packets_in_buffer, tick_timer.get())),
-      red_payload_splitter(new RedPayloadSplitter),
-      timestamp_scaler(new TimestampScaler(*decoder_database)),
-      accelerate_factory(new AccelerateFactory),
-      expand_factory(new ExpandFactory),
-      preemptive_expand_factory(new PreemptiveExpandFactory) {}
-
-NetEqImpl::Dependencies::~Dependencies() = default;
-
-NetEqImpl::NetEqImpl(const NetEq::Config& config,
-                     Dependencies&& deps,
-                     bool create_components)
-    : tick_timer_(std::move(deps.tick_timer)),
-      buffer_level_filter_(std::move(deps.buffer_level_filter)),
-      decoder_database_(std::move(deps.decoder_database)),
-      delay_manager_(std::move(deps.delay_manager)),
-      delay_peak_detector_(std::move(deps.delay_peak_detector)),
-      dtmf_buffer_(std::move(deps.dtmf_buffer)),
-      dtmf_tone_generator_(std::move(deps.dtmf_tone_generator)),
-      packet_buffer_(std::move(deps.packet_buffer)),
-      red_payload_splitter_(std::move(deps.red_payload_splitter)),
-      timestamp_scaler_(std::move(deps.timestamp_scaler)),
-      vad_(new PostDecodeVad()),
-      expand_factory_(std::move(deps.expand_factory)),
-      accelerate_factory_(std::move(deps.accelerate_factory)),
-      preemptive_expand_factory_(std::move(deps.preemptive_expand_factory)),
-      last_mode_(kModeNormal),
-      decoded_buffer_length_(kMaxFrameSize),
-      decoded_buffer_(new int16_t[decoded_buffer_length_]),
-      playout_timestamp_(0),
-      new_codec_(false),
-      timestamp_(0),
-      reset_decoder_(false),
-      ssrc_(0),
-      first_packet_(true),
-      background_noise_mode_(config.background_noise_mode),
-      playout_mode_(config.playout_mode),
-      enable_fast_accelerate_(config.enable_fast_accelerate),
-      nack_enabled_(false),
-      enable_muted_state_(config.enable_muted_state) {
-  LOG(LS_INFO) << "NetEq config: " << config.ToString();
-  int fs = config.sample_rate_hz;
-  if (fs != 8000 && fs != 16000 && fs != 32000 && fs != 48000) {
-    LOG(LS_ERROR) << "Sample rate " << fs << " Hz not supported. " <<
-        "Changing to 8000 Hz.";
-    fs = 8000;
-  }
-  delay_manager_->SetMaximumDelay(config.max_delay_ms);
-  fs_hz_ = fs;
-  fs_mult_ = fs / 8000;
-  last_output_sample_rate_hz_ = fs;
-  output_size_samples_ = static_cast<size_t>(kOutputSizeMs * 8 * fs_mult_);
-  decoder_frame_length_ = 3 * output_size_samples_;
-  WebRtcSpl_Init();
-  if (create_components) {
-    SetSampleRateAndChannels(fs, 1);  // Default is 1 channel.
-  }
-  RTC_DCHECK(!vad_->enabled());
-  if (config.enable_post_decode_vad) {
-    vad_->Enable();
-  }
-}
-
-NetEqImpl::~NetEqImpl() = default;
-
-int NetEqImpl::InsertPacket(const RTPHeader& rtp_header,
-                            rtc::ArrayView<const uint8_t> payload,
-                            uint32_t receive_timestamp) {
-  rtc::MsanCheckInitialized(payload);
-  TRACE_EVENT0("webrtc", "NetEqImpl::InsertPacket");
-  rtc::CritScope lock(&crit_sect_);
-  if (InsertPacketInternal(rtp_header, payload, receive_timestamp) != 0) {
-    return kFail;
-  }
-  return kOK;
-}
-
-void NetEqImpl::InsertEmptyPacket(const RTPHeader& /*rtp_header*/) {
-  // TODO(henrik.lundin) Handle NACK as well. This will make use of the
-  // rtp_header parameter.
-  // https://bugs.chromium.org/p/webrtc/issues/detail?id=7611
-  rtc::CritScope lock(&crit_sect_);
-  delay_manager_->RegisterEmptyPacket();
-}
-
-namespace {
-void SetAudioFrameActivityAndType(bool vad_enabled,
-                                  NetEqImpl::OutputType type,
-                                  AudioFrame::VADActivity last_vad_activity,
-                                  AudioFrame* audio_frame) {
-  switch (type) {
-    case NetEqImpl::OutputType::kNormalSpeech: {
-      audio_frame->speech_type_ = AudioFrame::kNormalSpeech;
-      audio_frame->vad_activity_ = AudioFrame::kVadActive;
-      break;
-    }
-    case NetEqImpl::OutputType::kVadPassive: {
-      // This should only be reached if the VAD is enabled.
-      RTC_DCHECK(vad_enabled);
-      audio_frame->speech_type_ = AudioFrame::kNormalSpeech;
-      audio_frame->vad_activity_ = AudioFrame::kVadPassive;
-      break;
-    }
-    case NetEqImpl::OutputType::kCNG: {
-      audio_frame->speech_type_ = AudioFrame::kCNG;
-      audio_frame->vad_activity_ = AudioFrame::kVadPassive;
-      break;
-    }
-    case NetEqImpl::OutputType::kPLC: {
-      audio_frame->speech_type_ = AudioFrame::kPLC;
-      audio_frame->vad_activity_ = last_vad_activity;
-      break;
-    }
-    case NetEqImpl::OutputType::kPLCCNG: {
-      audio_frame->speech_type_ = AudioFrame::kPLCCNG;
-      audio_frame->vad_activity_ = AudioFrame::kVadPassive;
-      break;
-    }
-    default:
-      RTC_NOTREACHED();
-  }
-  if (!vad_enabled) {
-    // Always set kVadUnknown when receive VAD is inactive.
-    audio_frame->vad_activity_ = AudioFrame::kVadUnknown;
-  }
-}
-}  // namespace
-
-int NetEqImpl::GetAudio(AudioFrame* audio_frame, bool* muted) {
-  TRACE_EVENT0("webrtc", "NetEqImpl::GetAudio");
-  rtc::CritScope lock(&crit_sect_);
-  if (GetAudioInternal(audio_frame, muted) != 0) {
-    return kFail;
-  }
-  RTC_DCHECK_EQ(
-      audio_frame->sample_rate_hz_,
-      rtc::dchecked_cast<int>(audio_frame->samples_per_channel_ * 100));
-  RTC_DCHECK_EQ(*muted, audio_frame->muted());
-  SetAudioFrameActivityAndType(vad_->enabled(), LastOutputType(),
-                               last_vad_activity_, audio_frame);
-  last_vad_activity_ = audio_frame->vad_activity_;
-  last_output_sample_rate_hz_ = audio_frame->sample_rate_hz_;
-  RTC_DCHECK(last_output_sample_rate_hz_ == 8000 ||
-             last_output_sample_rate_hz_ == 16000 ||
-             last_output_sample_rate_hz_ == 32000 ||
-             last_output_sample_rate_hz_ == 48000)
-      << "Unexpected sample rate " << last_output_sample_rate_hz_;
-  return kOK;
-}
-
-void NetEqImpl::SetCodecs(const std::map<int, SdpAudioFormat>& codecs) {
-  rtc::CritScope lock(&crit_sect_);
-  const std::vector<int> changed_payload_types =
-      decoder_database_->SetCodecs(codecs);
-  for (const int pt : changed_payload_types) {
-    packet_buffer_->DiscardPacketsWithPayloadType(pt, &stats_);
-  }
-}
-
-int NetEqImpl::RegisterPayloadType(NetEqDecoder codec,
-                                   const std::string& name,
-                                   uint8_t rtp_payload_type) {
-  rtc::CritScope lock(&crit_sect_);
-  LOG(LS_VERBOSE) << "RegisterPayloadType "
-                  << static_cast<int>(rtp_payload_type) << " "
-                  << static_cast<int>(codec);
-  if (decoder_database_->RegisterPayload(rtp_payload_type, codec, name) !=
-      DecoderDatabase::kOK) {
-    return kFail;
-  }
-  return kOK;
-}
-
-int NetEqImpl::RegisterExternalDecoder(AudioDecoder* decoder,
-                                       NetEqDecoder codec,
-                                       const std::string& codec_name,
-                                       uint8_t rtp_payload_type) {
-  rtc::CritScope lock(&crit_sect_);
-  LOG(LS_VERBOSE) << "RegisterExternalDecoder "
-                  << static_cast<int>(rtp_payload_type) << " "
-                  << static_cast<int>(codec);
-  if (!decoder) {
-    LOG(LS_ERROR) << "Cannot register external decoder with NULL pointer";
-    assert(false);
-    return kFail;
-  }
-  if (decoder_database_->InsertExternal(rtp_payload_type, codec, codec_name,
-                                        decoder) != DecoderDatabase::kOK) {
-    return kFail;
-  }
-  return kOK;
-}
-
-bool NetEqImpl::RegisterPayloadType(int rtp_payload_type,
-                                    const SdpAudioFormat& audio_format) {
-  LOG(LS_VERBOSE) << "NetEqImpl::RegisterPayloadType: payload type "
-                  << rtp_payload_type << ", codec " << audio_format;
-  rtc::CritScope lock(&crit_sect_);
-  return decoder_database_->RegisterPayload(rtp_payload_type, audio_format) ==
-         DecoderDatabase::kOK;
-}
-
-int NetEqImpl::RemovePayloadType(uint8_t rtp_payload_type) {
-  rtc::CritScope lock(&crit_sect_);
-  int ret = decoder_database_->Remove(rtp_payload_type);
-  if (ret == DecoderDatabase::kOK || ret == DecoderDatabase::kDecoderNotFound) {
-    packet_buffer_->DiscardPacketsWithPayloadType(rtp_payload_type, &stats_);
-    return kOK;
-  }
-  return kFail;
-}
-
-void NetEqImpl::RemoveAllPayloadTypes() {
-  rtc::CritScope lock(&crit_sect_);
-  decoder_database_->RemoveAll();
-}
-
-bool NetEqImpl::SetMinimumDelay(int delay_ms) {
-  rtc::CritScope lock(&crit_sect_);
-  if (delay_ms >= 0 && delay_ms < 10000) {
-    assert(delay_manager_.get());
-    return delay_manager_->SetMinimumDelay(delay_ms);
-  }
-  return false;
-}
-
-bool NetEqImpl::SetMaximumDelay(int delay_ms) {
-  rtc::CritScope lock(&crit_sect_);
-  if (delay_ms >= 0 && delay_ms < 10000) {
-    assert(delay_manager_.get());
-    return delay_manager_->SetMaximumDelay(delay_ms);
-  }
-  return false;
-}
-
-int NetEqImpl::LeastRequiredDelayMs() const {
-  rtc::CritScope lock(&crit_sect_);
-  assert(delay_manager_.get());
-  return delay_manager_->least_required_delay_ms();
-}
-
-int NetEqImpl::SetTargetDelay() {
-  return kNotImplemented;
-}
-
-int NetEqImpl::TargetDelayMs() {
-  rtc::CritScope lock(&crit_sect_);
-  RTC_DCHECK(delay_manager_.get());
-  // The value from TargetLevel() is in number of packets, represented in Q8.
-  const size_t target_delay_samples =
-      (delay_manager_->TargetLevel() * decoder_frame_length_) >> 8;
-  return static_cast<int>(target_delay_samples) /
-         rtc::CheckedDivExact(fs_hz_, 1000);
-}
-
-int NetEqImpl::CurrentDelayMs() const {
-  rtc::CritScope lock(&crit_sect_);
-  if (fs_hz_ == 0)
-    return 0;
-  // Sum up the samples in the packet buffer with the future length of the sync
-  // buffer, and divide the sum by the sample rate.
-  const size_t delay_samples =
-      packet_buffer_->NumSamplesInBuffer(decoder_frame_length_) +
-      sync_buffer_->FutureLength();
-  // The division below will truncate.
-  const int delay_ms =
-      static_cast<int>(delay_samples) / rtc::CheckedDivExact(fs_hz_, 1000);
-  return delay_ms;
-}
-
-int NetEqImpl::FilteredCurrentDelayMs() const {
-  rtc::CritScope lock(&crit_sect_);
-  // Calculate the filtered packet buffer level in samples. The value from
-  // |buffer_level_filter_| is in number of packets, represented in Q8.
-  const size_t packet_buffer_samples =
-      (buffer_level_filter_->filtered_current_level() *
-       decoder_frame_length_) >>
-      8;
-  // Sum up the filtered packet buffer level with the future length of the sync
-  // buffer, and divide the sum by the sample rate.
-  const size_t delay_samples =
-      packet_buffer_samples + sync_buffer_->FutureLength();
-  // The division below will truncate. The return value is in ms.
-  return static_cast<int>(delay_samples) / rtc::CheckedDivExact(fs_hz_, 1000);
-}
-
-// Deprecated.
-// TODO(henrik.lundin) Delete.
-void NetEqImpl::SetPlayoutMode(NetEqPlayoutMode mode) {
-  rtc::CritScope lock(&crit_sect_);
-  if (mode != playout_mode_) {
-    playout_mode_ = mode;
-    CreateDecisionLogic();
-  }
-}
-
-// Deprecated.
-// TODO(henrik.lundin) Delete.
-NetEqPlayoutMode NetEqImpl::PlayoutMode() const {
-  rtc::CritScope lock(&crit_sect_);
-  return playout_mode_;
-}
-
-int NetEqImpl::NetworkStatistics(NetEqNetworkStatistics* stats) {
-  rtc::CritScope lock(&crit_sect_);
-  assert(decoder_database_.get());
-  const size_t total_samples_in_buffers =
-      packet_buffer_->NumSamplesInBuffer(decoder_frame_length_) +
-      sync_buffer_->FutureLength();
-  assert(delay_manager_.get());
-  assert(decision_logic_.get());
-  stats_.GetNetworkStatistics(fs_hz_, total_samples_in_buffers,
-                              decoder_frame_length_, *delay_manager_.get(),
-                              *decision_logic_.get(), stats);
-  return 0;
-}
-
-NetEqLifetimeStatistics NetEqImpl::GetLifetimeStatistics() const {
-  rtc::CritScope lock(&crit_sect_);
-  return stats_.GetLifetimeStatistics();
-}
-
-void NetEqImpl::GetRtcpStatistics(RtcpStatistics* stats) {
-  rtc::CritScope lock(&crit_sect_);
-  if (stats) {
-    rtcp_.GetStatistics(false, stats);
-  }
-}
-
-void NetEqImpl::GetRtcpStatisticsNoReset(RtcpStatistics* stats) {
-  rtc::CritScope lock(&crit_sect_);
-  if (stats) {
-    rtcp_.GetStatistics(true, stats);
-  }
-}
-
-void NetEqImpl::EnableVad() {
-  rtc::CritScope lock(&crit_sect_);
-  assert(vad_.get());
-  vad_->Enable();
-}
-
-void NetEqImpl::DisableVad() {
-  rtc::CritScope lock(&crit_sect_);
-  assert(vad_.get());
-  vad_->Disable();
-}
-
-rtc::Optional<uint32_t> NetEqImpl::GetPlayoutTimestamp() const {
-  rtc::CritScope lock(&crit_sect_);
-  if (first_packet_ || last_mode_ == kModeRfc3389Cng ||
-      last_mode_ == kModeCodecInternalCng) {
-    // We don't have a valid RTP timestamp until we have decoded our first
-    // RTP packet. Also, the RTP timestamp is not accurate while playing CNG,
-    // which is indicated by returning an empty value.
-    return rtc::Optional<uint32_t>();
-  }
-  return rtc::Optional<uint32_t>(
-      timestamp_scaler_->ToExternal(playout_timestamp_));
-}
-
-int NetEqImpl::last_output_sample_rate_hz() const {
-  rtc::CritScope lock(&crit_sect_);
-  return last_output_sample_rate_hz_;
-}
-
-rtc::Optional<CodecInst> NetEqImpl::GetDecoder(int payload_type) const {
-  rtc::CritScope lock(&crit_sect_);
-  const DecoderDatabase::DecoderInfo* di =
-      decoder_database_->GetDecoderInfo(payload_type);
-  if (!di) {
-    return rtc::Optional<CodecInst>();
-  }
-
-  // Create a CodecInst with some fields set. The remaining fields are zeroed,
-  // but we tell MSan to consider them uninitialized.
-  CodecInst ci = {0};
-  rtc::MsanMarkUninitialized(rtc::MakeArrayView(&ci, 1));
-  ci.pltype = payload_type;
-  std::strncpy(ci.plname, di->get_name().c_str(), sizeof(ci.plname));
-  ci.plname[sizeof(ci.plname) - 1] = '\0';
-  ci.plfreq = di->IsRed() ? 8000 : di->SampleRateHz();
-  AudioDecoder* const decoder = di->GetDecoder();
-  ci.channels = decoder ? decoder->Channels() : 1;
-  return rtc::Optional<CodecInst>(ci);
-}
-
-rtc::Optional<SdpAudioFormat> NetEqImpl::GetDecoderFormat(
-    int payload_type) const {
-  rtc::CritScope lock(&crit_sect_);
-  const DecoderDatabase::DecoderInfo* const di =
-      decoder_database_->GetDecoderInfo(payload_type);
-  if (!di) {
-    return rtc::Optional<SdpAudioFormat>();  // Payload type not registered.
-  }
-  return rtc::Optional<SdpAudioFormat>(di->GetFormat());
-}
-
-int NetEqImpl::SetTargetNumberOfChannels() {
-  return kNotImplemented;
-}
-
-int NetEqImpl::SetTargetSampleRate() {
-  return kNotImplemented;
-}
-
-void NetEqImpl::FlushBuffers() {
-  rtc::CritScope lock(&crit_sect_);
-  LOG(LS_VERBOSE) << "FlushBuffers";
-  packet_buffer_->Flush();
-  assert(sync_buffer_.get());
-  assert(expand_.get());
-  sync_buffer_->Flush();
-  sync_buffer_->set_next_index(sync_buffer_->next_index() -
-                               expand_->overlap_length());
-  // Set to wait for new codec.
-  first_packet_ = true;
-}
-
-void NetEqImpl::PacketBufferStatistics(int* current_num_packets,
-                                       int* max_num_packets) const {
-  rtc::CritScope lock(&crit_sect_);
-  packet_buffer_->BufferStat(current_num_packets, max_num_packets);
-}
-
-void NetEqImpl::EnableNack(size_t max_nack_list_size) {
-  rtc::CritScope lock(&crit_sect_);
-  if (!nack_enabled_) {
-    const int kNackThresholdPackets = 2;
-    nack_.reset(NackTracker::Create(kNackThresholdPackets));
-    nack_enabled_ = true;
-    nack_->UpdateSampleRate(fs_hz_);
-  }
-  nack_->SetMaxNackListSize(max_nack_list_size);
-}
-
-void NetEqImpl::DisableNack() {
-  rtc::CritScope lock(&crit_sect_);
-  nack_.reset();
-  nack_enabled_ = false;
-}
-
-std::vector<uint16_t> NetEqImpl::GetNackList(int64_t round_trip_time_ms) const {
-  rtc::CritScope lock(&crit_sect_);
-  if (!nack_enabled_) {
-    return std::vector<uint16_t>();
-  }
-  RTC_DCHECK(nack_.get());
-  return nack_->GetNackList(round_trip_time_ms);
-}
-
-std::vector<uint32_t> NetEqImpl::LastDecodedTimestamps() const {
-  rtc::CritScope lock(&crit_sect_);
-  return last_decoded_timestamps_;
-}
-
-int NetEqImpl::SyncBufferSizeMs() const {
-  rtc::CritScope lock(&crit_sect_);
-  return rtc::dchecked_cast<int>(sync_buffer_->FutureLength() /
-                                 rtc::CheckedDivExact(fs_hz_, 1000));
-}
-
-const SyncBuffer* NetEqImpl::sync_buffer_for_test() const {
-  rtc::CritScope lock(&crit_sect_);
-  return sync_buffer_.get();
-}
-
-Operations NetEqImpl::last_operation_for_test() const {
-  rtc::CritScope lock(&crit_sect_);
-  return last_operation_;
-}
-
-// Methods below this line are private.
-
-int NetEqImpl::InsertPacketInternal(const RTPHeader& rtp_header,
-                                    rtc::ArrayView<const uint8_t> payload,
-                                    uint32_t receive_timestamp) {
-  if (payload.empty()) {
-    LOG_F(LS_ERROR) << "payload is empty";
-    return kInvalidPointer;
-  }
-
-  PacketList packet_list;
-  // Insert packet in a packet list.
-  packet_list.push_back([&rtp_header, &payload] {
-    // Convert to Packet.
-    Packet packet;
-    packet.payload_type = rtp_header.payloadType;
-    packet.sequence_number = rtp_header.sequenceNumber;
-    packet.timestamp = rtp_header.timestamp;
-    packet.payload.SetData(payload.data(), payload.size());
-    // Waiting time will be set upon inserting the packet in the buffer.
-    RTC_DCHECK(!packet.waiting_time);
-    return packet;
-  }());
-
-  bool update_sample_rate_and_channels =
-      first_packet_ || (rtp_header.ssrc != ssrc_);
-
-  if (update_sample_rate_and_channels) {
-    // Reset timestamp scaling.
-    timestamp_scaler_->Reset();
-  }
-
-  if (!decoder_database_->IsRed(rtp_header.payloadType)) {
-    // Scale timestamp to internal domain (only for some codecs).
-    timestamp_scaler_->ToInternal(&packet_list);
-  }
-
-  // Store these for later use, since the first packet may very well disappear
-  // before we need these values.
-  uint32_t main_timestamp = packet_list.front().timestamp;
-  uint8_t main_payload_type = packet_list.front().payload_type;
-  uint16_t main_sequence_number = packet_list.front().sequence_number;
-
-  // Reinitialize NetEq if it's needed (changed SSRC or first call).
-  if (update_sample_rate_and_channels) {
-    // Note: |first_packet_| will be cleared further down in this method, once
-    // the packet has been successfully inserted into the packet buffer.
-
-    rtcp_.Init(rtp_header.sequenceNumber);
-
-    // Flush the packet buffer and DTMF buffer.
-    packet_buffer_->Flush();
-    dtmf_buffer_->Flush();
-
-    // Store new SSRC.
-    ssrc_ = rtp_header.ssrc;
-
-    // Update audio buffer timestamp.
-    sync_buffer_->IncreaseEndTimestamp(main_timestamp - timestamp_);
-
-    // Update codecs.
-    timestamp_ = main_timestamp;
-  }
-
-  // Update RTCP statistics, only for regular packets.
-  rtcp_.Update(rtp_header, receive_timestamp);
-
-  if (nack_enabled_) {
-    RTC_DCHECK(nack_);
-    if (update_sample_rate_and_channels) {
-      nack_->Reset();
-    }
-    nack_->UpdateLastReceivedPacket(rtp_header.sequenceNumber,
-                                    rtp_header.timestamp);
-  }
-
-  // Check for RED payload type, and separate payloads into several packets.
-  if (decoder_database_->IsRed(rtp_header.payloadType)) {
-    if (!red_payload_splitter_->SplitRed(&packet_list)) {
-      return kRedundancySplitError;
-    }
-    // Only accept a few RED payloads of the same type as the main data,
-    // DTMF events and CNG.
-    red_payload_splitter_->CheckRedPayloads(&packet_list, *decoder_database_);
-  }
-
-  // Check payload types.
-  if (decoder_database_->CheckPayloadTypes(packet_list) ==
-      DecoderDatabase::kDecoderNotFound) {
-    return kUnknownRtpPayloadType;
-  }
-
-  RTC_DCHECK(!packet_list.empty());
-
-  // Update main_timestamp, if new packets appear in the list
-  // after RED splitting.
-  if (decoder_database_->IsRed(rtp_header.payloadType)) {
-    timestamp_scaler_->ToInternal(&packet_list);
-    main_timestamp = packet_list.front().timestamp;
-    main_payload_type = packet_list.front().payload_type;
-    main_sequence_number = packet_list.front().sequence_number;
-  }
-
-  // Process DTMF payloads. Cycle through the list of packets, and pick out any
-  // DTMF payloads found.
-  PacketList::iterator it = packet_list.begin();
-  while (it != packet_list.end()) {
-    const Packet& current_packet = (*it);
-    RTC_DCHECK(!current_packet.payload.empty());
-    if (decoder_database_->IsDtmf(current_packet.payload_type)) {
-      DtmfEvent event;
-      int ret = DtmfBuffer::ParseEvent(current_packet.timestamp,
-                                       current_packet.payload.data(),
-                                       current_packet.payload.size(), &event);
-      if (ret != DtmfBuffer::kOK) {
-        return kDtmfParsingError;
-      }
-      if (dtmf_buffer_->InsertEvent(event) != DtmfBuffer::kOK) {
-        return kDtmfInsertError;
-      }
-      it = packet_list.erase(it);
-    } else {
-      ++it;
-    }
-  }
-
-  // Update bandwidth estimate, if the packet is not comfort noise.
-  if (!packet_list.empty() &&
-      !decoder_database_->IsComfortNoise(main_payload_type)) {
-    // The list can be empty here if we got nothing but DTMF payloads.
-    AudioDecoder* decoder = decoder_database_->GetDecoder(main_payload_type);
-    RTC_DCHECK(decoder);  // Should always get a valid object, since we have
-                          // already checked that the payload types are known.
-    decoder->IncomingPacket(packet_list.front().payload.data(),
-                            packet_list.front().payload.size(),
-                            packet_list.front().sequence_number,
-                            packet_list.front().timestamp,
-                            receive_timestamp);
-  }
-
-  PacketList parsed_packet_list;
-  while (!packet_list.empty()) {
-    Packet& packet = packet_list.front();
-    const DecoderDatabase::DecoderInfo* info =
-        decoder_database_->GetDecoderInfo(packet.payload_type);
-    if (!info) {
-      LOG(LS_WARNING) << "SplitAudio unknown payload type";
-      return kUnknownRtpPayloadType;
-    }
-
-    if (info->IsComfortNoise()) {
-      // Carry comfort noise packets along.
-      parsed_packet_list.splice(parsed_packet_list.end(), packet_list,
-                                packet_list.begin());
-    } else {
-      const auto sequence_number = packet.sequence_number;
-      const auto payload_type = packet.payload_type;
-      const Packet::Priority original_priority = packet.priority;
-      auto packet_from_result = [&] (AudioDecoder::ParseResult& result) {
-        Packet new_packet;
-        new_packet.sequence_number = sequence_number;
-        new_packet.payload_type = payload_type;
-        new_packet.timestamp = result.timestamp;
-        new_packet.priority.codec_level = result.priority;
-        new_packet.priority.red_level = original_priority.red_level;
-        new_packet.frame = std::move(result.frame);
-        return new_packet;
-      };
-
-      std::vector<AudioDecoder::ParseResult> results =
-          info->GetDecoder()->ParsePayload(std::move(packet.payload),
-                                           packet.timestamp);
-      if (results.empty()) {
-        packet_list.pop_front();
-      } else {
-        bool first = true;
-        for (auto& result : results) {
-          RTC_DCHECK(result.frame);
-          RTC_DCHECK_GE(result.priority, 0);
-          if (first) {
-            // Re-use the node and move it to parsed_packet_list.
-            packet_list.front() = packet_from_result(result);
-            parsed_packet_list.splice(parsed_packet_list.end(), packet_list,
-                                      packet_list.begin());
-            first = false;
-          } else {
-            parsed_packet_list.push_back(packet_from_result(result));
-          }
-        }
-      }
-    }
-  }
-
-  // Insert packets in buffer.
-  const size_t buffer_length_before_insert =
-      packet_buffer_->NumPacketsInBuffer();
-  const int ret = packet_buffer_->InsertPacketList(
-      &parsed_packet_list, *decoder_database_, &current_rtp_payload_type_,
-      &current_cng_rtp_payload_type_, &stats_);
-  if (ret == PacketBuffer::kFlushed) {
-    // Reset DSP timestamp etc. if packet buffer flushed.
-    new_codec_ = true;
-    update_sample_rate_and_channels = true;
-  } else if (ret != PacketBuffer::kOK) {
-    return kOtherError;
-  }
-
-  if (first_packet_) {
-    first_packet_ = false;
-    // Update the codec on the next GetAudio call.
-    new_codec_ = true;
-  }
-
-  if (current_rtp_payload_type_) {
-    RTC_DCHECK(decoder_database_->GetDecoderInfo(*current_rtp_payload_type_))
-        << "Payload type " << static_cast<int>(*current_rtp_payload_type_)
-        << " is unknown where it shouldn't be";
-  }
-
-  if (update_sample_rate_and_channels && !packet_buffer_->Empty()) {
-    // We do not use |current_rtp_payload_type_| to |set payload_type|, but
-    // get the next RTP header from |packet_buffer_| to obtain the payload type.
-    // The reason for it is the following corner case. If NetEq receives a
-    // CNG packet with a sample rate different than the current CNG then it
-    // flushes its buffer, assuming send codec must have been changed. However,
-    // payload type of the hypothetically new send codec is not known.
-    const Packet* next_packet = packet_buffer_->PeekNextPacket();
-    RTC_DCHECK(next_packet);
-    const int payload_type = next_packet->payload_type;
-    size_t channels = 1;
-    if (!decoder_database_->IsComfortNoise(payload_type)) {
-      AudioDecoder* decoder = decoder_database_->GetDecoder(payload_type);
-      assert(decoder);  // Payloads are already checked to be valid.
-      channels = decoder->Channels();
-    }
-    const DecoderDatabase::DecoderInfo* decoder_info =
-        decoder_database_->GetDecoderInfo(payload_type);
-    assert(decoder_info);
-    if (decoder_info->SampleRateHz() != fs_hz_ ||
-        channels != algorithm_buffer_->Channels()) {
-      SetSampleRateAndChannels(decoder_info->SampleRateHz(),
-                               channels);
-    }
-    if (nack_enabled_) {
-      RTC_DCHECK(nack_);
-      // Update the sample rate even if the rate is not new, because of Reset().
-      nack_->UpdateSampleRate(fs_hz_);
-    }
-  }
-
-  // TODO(hlundin): Move this code to DelayManager class.
-  const DecoderDatabase::DecoderInfo* dec_info =
-      decoder_database_->GetDecoderInfo(main_payload_type);
-  assert(dec_info);  // Already checked that the payload type is known.
-  delay_manager_->LastDecodedWasCngOrDtmf(dec_info->IsComfortNoise() ||
-                                          dec_info->IsDtmf());
-  if (delay_manager_->last_pack_cng_or_dtmf() == 0) {
-    // Calculate the total speech length carried in each packet.
-    const size_t buffer_length_after_insert =
-        packet_buffer_->NumPacketsInBuffer();
-
-    if (buffer_length_after_insert > buffer_length_before_insert) {
-      const size_t packet_length_samples =
-          (buffer_length_after_insert - buffer_length_before_insert) *
-          decoder_frame_length_;
-      if (packet_length_samples != decision_logic_->packet_length_samples()) {
-        decision_logic_->set_packet_length_samples(packet_length_samples);
-        delay_manager_->SetPacketAudioLength(
-            rtc::dchecked_cast<int>((1000 * packet_length_samples) / fs_hz_));
-      }
-    }
-
-    // Update statistics.
-    if ((int32_t)(main_timestamp - timestamp_) >= 0 && !new_codec_) {
-      // Only update statistics if incoming packet is not older than last played
-      // out packet, and if new codec flag is not set.
-      delay_manager_->Update(main_sequence_number, main_timestamp, fs_hz_);
-    }
-  } else if (delay_manager_->last_pack_cng_or_dtmf() == -1) {
-    // This is first "normal" packet after CNG or DTMF.
-    // Reset packet time counter and measure time until next packet,
-    // but don't update statistics.
-    delay_manager_->set_last_pack_cng_or_dtmf(0);
-    delay_manager_->ResetPacketIatCount();
-  }
-  return 0;
-}
-
-int NetEqImpl::GetAudioInternal(AudioFrame* audio_frame, bool* muted) {
-  PacketList packet_list;
-  DtmfEvent dtmf_event;
-  Operations operation;
-  bool play_dtmf;
-  *muted = false;
-  last_decoded_timestamps_.clear();
-  tick_timer_->Increment();
-  stats_.IncreaseCounter(output_size_samples_, fs_hz_);
-
-  // Check for muted state.
-  if (enable_muted_state_ && expand_->Muted() && packet_buffer_->Empty()) {
-    RTC_DCHECK_EQ(last_mode_, kModeExpand);
-    audio_frame->Reset();
-    RTC_DCHECK(audio_frame->muted());  // Reset() should mute the frame.
-    playout_timestamp_ += static_cast<uint32_t>(output_size_samples_);
-    audio_frame->sample_rate_hz_ = fs_hz_;
-    audio_frame->samples_per_channel_ = output_size_samples_;
-    audio_frame->timestamp_ =
-        first_packet_
-            ? 0
-            : timestamp_scaler_->ToExternal(playout_timestamp_) -
-                  static_cast<uint32_t>(audio_frame->samples_per_channel_);
-    audio_frame->num_channels_ = sync_buffer_->Channels();
-    stats_.ExpandedNoiseSamples(output_size_samples_);
-    *muted = true;
-    return 0;
-  }
-
-  int return_value = GetDecision(&operation, &packet_list, &dtmf_event,
-                                 &play_dtmf);
-  if (return_value != 0) {
-    last_mode_ = kModeError;
-    return return_value;
-  }
-
-  AudioDecoder::SpeechType speech_type;
-  int length = 0;
-  int decode_return_value = Decode(&packet_list, &operation,
-                                   &length, &speech_type);
-
-  assert(vad_.get());
-  bool sid_frame_available =
-      (operation == kRfc3389Cng && !packet_list.empty());
-  vad_->Update(decoded_buffer_.get(), static_cast<size_t>(length), speech_type,
-               sid_frame_available, fs_hz_);
-
-  if (sid_frame_available || speech_type == AudioDecoder::kComfortNoise) {
-    // Start a new stopwatch since we are decoding a new CNG packet.
-    generated_noise_stopwatch_ = tick_timer_->GetNewStopwatch();
-  }
-
-  algorithm_buffer_->Clear();
-  switch (operation) {
-    case kNormal: {
-      DoNormal(decoded_buffer_.get(), length, speech_type, play_dtmf);
-      break;
-    }
-    case kMerge: {
-      DoMerge(decoded_buffer_.get(), length, speech_type, play_dtmf);
-      break;
-    }
-    case kExpand: {
-      return_value = DoExpand(play_dtmf);
-      break;
-    }
-    case kAccelerate:
-    case kFastAccelerate: {
-      const bool fast_accelerate =
-          enable_fast_accelerate_ && (operation == kFastAccelerate);
-      return_value = DoAccelerate(decoded_buffer_.get(), length, speech_type,
-                                  play_dtmf, fast_accelerate);
-      break;
-    }
-    case kPreemptiveExpand: {
-      return_value = DoPreemptiveExpand(decoded_buffer_.get(), length,
-                                        speech_type, play_dtmf);
-      break;
-    }
-    case kRfc3389Cng:
-    case kRfc3389CngNoPacket: {
-      return_value = DoRfc3389Cng(&packet_list, play_dtmf);
-      break;
-    }
-    case kCodecInternalCng: {
-      // This handles the case when there is no transmission and the decoder
-      // should produce internal comfort noise.
-      // TODO(hlundin): Write test for codec-internal CNG.
-      DoCodecInternalCng(decoded_buffer_.get(), length);
-      break;
-    }
-    case kDtmf: {
-      // TODO(hlundin): Write test for this.
-      return_value = DoDtmf(dtmf_event, &play_dtmf);
-      break;
-    }
-    case kAlternativePlc: {
-      // TODO(hlundin): Write test for this.
-      DoAlternativePlc(false);
-      break;
-    }
-    case kAlternativePlcIncreaseTimestamp: {
-      // TODO(hlundin): Write test for this.
-      DoAlternativePlc(true);
-      break;
-    }
-    case kAudioRepetitionIncreaseTimestamp: {
-      // TODO(hlundin): Write test for this.
-      sync_buffer_->IncreaseEndTimestamp(
-          static_cast<uint32_t>(output_size_samples_));
-      // Skipping break on purpose. Execution should move on into the
-      // next case.
-      FALLTHROUGH();
-    }
-    case kAudioRepetition: {
-      // TODO(hlundin): Write test for this.
-      // Copy last |output_size_samples_| from |sync_buffer_| to
-      // |algorithm_buffer|.
-      algorithm_buffer_->PushBackFromIndex(
-          *sync_buffer_, sync_buffer_->Size() - output_size_samples_);
-      expand_->Reset();
-      break;
-    }
-    case kUndefined: {
-      LOG(LS_ERROR) << "Invalid operation kUndefined.";
-      assert(false);  // This should not happen.
-      last_mode_ = kModeError;
-      return kInvalidOperation;
-    }
-  }  // End of switch.
-  last_operation_ = operation;
-  if (return_value < 0) {
-    return return_value;
-  }
-
-  if (last_mode_ != kModeRfc3389Cng) {
-    comfort_noise_->Reset();
-  }
-
-  // Copy from |algorithm_buffer| to |sync_buffer_|.
-  sync_buffer_->PushBack(*algorithm_buffer_);
-
-  // Extract data from |sync_buffer_| to |output|.
-  size_t num_output_samples_per_channel = output_size_samples_;
-  size_t num_output_samples = output_size_samples_ * sync_buffer_->Channels();
-  if (num_output_samples > AudioFrame::kMaxDataSizeSamples) {
-    LOG(LS_WARNING) << "Output array is too short. "
-                    << AudioFrame::kMaxDataSizeSamples << " < "
-                    << output_size_samples_ << " * "
-                    << sync_buffer_->Channels();
-    num_output_samples = AudioFrame::kMaxDataSizeSamples;
-    num_output_samples_per_channel =
-        AudioFrame::kMaxDataSizeSamples / sync_buffer_->Channels();
-  }
-  sync_buffer_->GetNextAudioInterleaved(num_output_samples_per_channel,
-                                        audio_frame);
-  audio_frame->sample_rate_hz_ = fs_hz_;
-  if (sync_buffer_->FutureLength() < expand_->overlap_length()) {
-    // The sync buffer should always contain |overlap_length| samples, but now
-    // too many samples have been extracted. Reinstall the |overlap_length|
-    // lookahead by moving the index.
-    const size_t missing_lookahead_samples =
-        expand_->overlap_length() - sync_buffer_->FutureLength();
-    RTC_DCHECK_GE(sync_buffer_->next_index(), missing_lookahead_samples);
-    sync_buffer_->set_next_index(sync_buffer_->next_index() -
-                                 missing_lookahead_samples);
-  }
-  if (audio_frame->samples_per_channel_ != output_size_samples_) {
-    LOG(LS_ERROR) << "audio_frame->samples_per_channel_ ("
-                  << audio_frame->samples_per_channel_
-                  << ") != output_size_samples_ (" << output_size_samples_
-                  << ")";
-    // TODO(minyue): treatment of under-run, filling zeros
-    audio_frame->Mute();
-    return kSampleUnderrun;
-  }
-
-  // Should always have overlap samples left in the |sync_buffer_|.
-  RTC_DCHECK_GE(sync_buffer_->FutureLength(), expand_->overlap_length());
-
-  // TODO(yujo): For muted frames, this can be a copy rather than an addition.
-  if (play_dtmf) {
-    return_value = DtmfOverdub(dtmf_event, sync_buffer_->Channels(),
-                               audio_frame->mutable_data());
-  }
-
-  // Update the background noise parameters if last operation wrote data
-  // straight from the decoder to the |sync_buffer_|. That is, none of the
-  // operations that modify the signal can be followed by a parameter update.
-  if ((last_mode_ == kModeNormal) ||
-      (last_mode_ == kModeAccelerateFail) ||
-      (last_mode_ == kModePreemptiveExpandFail) ||
-      (last_mode_ == kModeRfc3389Cng) ||
-      (last_mode_ == kModeCodecInternalCng)) {
-    background_noise_->Update(*sync_buffer_, *vad_.get());
-  }
-
-  if (operation == kDtmf) {
-    // DTMF data was written the end of |sync_buffer_|.
-    // Update index to end of DTMF data in |sync_buffer_|.
-    sync_buffer_->set_dtmf_index(sync_buffer_->Size());
-  }
-
-  if (last_mode_ != kModeExpand) {
-    // If last operation was not expand, calculate the |playout_timestamp_| from
-    // the |sync_buffer_|. However, do not update the |playout_timestamp_| if it
-    // would be moved "backwards".
-    uint32_t temp_timestamp = sync_buffer_->end_timestamp() -
-        static_cast<uint32_t>(sync_buffer_->FutureLength());
-    if (static_cast<int32_t>(temp_timestamp - playout_timestamp_) > 0) {
-      playout_timestamp_ = temp_timestamp;
-    }
-  } else {
-    // Use dead reckoning to estimate the |playout_timestamp_|.
-    playout_timestamp_ += static_cast<uint32_t>(output_size_samples_);
-  }
-  // Set the timestamp in the audio frame to zero before the first packet has
-  // been inserted. Otherwise, subtract the frame size in samples to get the
-  // timestamp of the first sample in the frame (playout_timestamp_ is the
-  // last + 1).
-  audio_frame->timestamp_ =
-      first_packet_
-          ? 0
-          : timestamp_scaler_->ToExternal(playout_timestamp_) -
-                static_cast<uint32_t>(audio_frame->samples_per_channel_);
-
-  if (!(last_mode_ == kModeRfc3389Cng ||
-      last_mode_ == kModeCodecInternalCng ||
-      last_mode_ == kModeExpand)) {
-    generated_noise_stopwatch_.reset();
-  }
-
-  if (decode_return_value) return decode_return_value;
-  return return_value;
-}
-
-int NetEqImpl::GetDecision(Operations* operation,
-                           PacketList* packet_list,
-                           DtmfEvent* dtmf_event,
-                           bool* play_dtmf) {
-  // Initialize output variables.
-  *play_dtmf = false;
-  *operation = kUndefined;
-
-  assert(sync_buffer_.get());
-  uint32_t end_timestamp = sync_buffer_->end_timestamp();
-  if (!new_codec_) {
-    const uint32_t five_seconds_samples = 5 * fs_hz_;
-    packet_buffer_->DiscardOldPackets(end_timestamp, five_seconds_samples,
-                                      &stats_);
-  }
-  const Packet* packet = packet_buffer_->PeekNextPacket();
-
-  RTC_DCHECK(!generated_noise_stopwatch_ ||
-             generated_noise_stopwatch_->ElapsedTicks() >= 1);
-  uint64_t generated_noise_samples =
-      generated_noise_stopwatch_
-          ? (generated_noise_stopwatch_->ElapsedTicks() - 1) *
-                    output_size_samples_ +
-                decision_logic_->noise_fast_forward()
-          : 0;
-
-  if (decision_logic_->CngRfc3389On() || last_mode_ == kModeRfc3389Cng) {
-    // Because of timestamp peculiarities, we have to "manually" disallow using
-    // a CNG packet with the same timestamp as the one that was last played.
-    // This can happen when using redundancy and will cause the timing to shift.
-    while (packet && decoder_database_->IsComfortNoise(packet->payload_type) &&
-           (end_timestamp >= packet->timestamp ||
-            end_timestamp + generated_noise_samples > packet->timestamp)) {
-      // Don't use this packet, discard it.
-      if (packet_buffer_->DiscardNextPacket(&stats_) != PacketBuffer::kOK) {
-        assert(false);  // Must be ok by design.
-      }
-      // Check buffer again.
-      if (!new_codec_) {
-        packet_buffer_->DiscardOldPackets(end_timestamp, 5 * fs_hz_, &stats_);
-      }
-      packet = packet_buffer_->PeekNextPacket();
-    }
-  }
-
-  assert(expand_.get());
-  const int samples_left = static_cast<int>(sync_buffer_->FutureLength() -
-      expand_->overlap_length());
-  if (last_mode_ == kModeAccelerateSuccess ||
-      last_mode_ == kModeAccelerateLowEnergy ||
-      last_mode_ == kModePreemptiveExpandSuccess ||
-      last_mode_ == kModePreemptiveExpandLowEnergy) {
-    // Subtract (samples_left + output_size_samples_) from sampleMemory.
-    decision_logic_->AddSampleMemory(
-        -(samples_left + rtc::dchecked_cast<int>(output_size_samples_)));
-  }
-
-  // Check if it is time to play a DTMF event.
-  if (dtmf_buffer_->GetEvent(
-      static_cast<uint32_t>(
-          end_timestamp + generated_noise_samples),
-      dtmf_event)) {
-    *play_dtmf = true;
-  }
-
-  // Get instruction.
-  assert(sync_buffer_.get());
-  assert(expand_.get());
-  generated_noise_samples =
-      generated_noise_stopwatch_
-          ? generated_noise_stopwatch_->ElapsedTicks() * output_size_samples_ +
-                decision_logic_->noise_fast_forward()
-          : 0;
-  *operation = decision_logic_->GetDecision(
-      *sync_buffer_, *expand_, decoder_frame_length_, packet, last_mode_,
-      *play_dtmf, generated_noise_samples, &reset_decoder_);
-
-  // Check if we already have enough samples in the |sync_buffer_|. If so,
-  // change decision to normal, unless the decision was merge, accelerate, or
-  // preemptive expand.
-  if (samples_left >= rtc::dchecked_cast<int>(output_size_samples_) &&
-      *operation != kMerge && *operation != kAccelerate &&
-      *operation != kFastAccelerate && *operation != kPreemptiveExpand) {
-    *operation = kNormal;
-    return 0;
-  }
-
-  decision_logic_->ExpandDecision(*operation);
-
-  // Check conditions for reset.
-  if (new_codec_ || *operation == kUndefined) {
-    // The only valid reason to get kUndefined is that new_codec_ is set.
-    assert(new_codec_);
-    if (*play_dtmf && !packet) {
-      timestamp_ = dtmf_event->timestamp;
-    } else {
-      if (!packet) {
-        LOG(LS_ERROR) << "Packet missing where it shouldn't.";
-        return -1;
-      }
-      timestamp_ = packet->timestamp;
-      if (*operation == kRfc3389CngNoPacket &&
-          decoder_database_->IsComfortNoise(packet->payload_type)) {
-        // Change decision to CNG packet, since we do have a CNG packet, but it
-        // was considered too early to use. Now, use it anyway.
-        *operation = kRfc3389Cng;
-      } else if (*operation != kRfc3389Cng) {
-        *operation = kNormal;
-      }
-    }
-    // Adjust |sync_buffer_| timestamp before setting |end_timestamp| to the
-    // new value.
-    sync_buffer_->IncreaseEndTimestamp(timestamp_ - end_timestamp);
-    end_timestamp = timestamp_;
-    new_codec_ = false;
-    decision_logic_->SoftReset();
-    buffer_level_filter_->Reset();
-    delay_manager_->Reset();
-    stats_.ResetMcu();
-  }
-
-  size_t required_samples = output_size_samples_;
-  const size_t samples_10_ms = static_cast<size_t>(80 * fs_mult_);
-  const size_t samples_20_ms = 2 * samples_10_ms;
-  const size_t samples_30_ms = 3 * samples_10_ms;
-
-  switch (*operation) {
-    case kExpand: {
-      timestamp_ = end_timestamp;
-      return 0;
-    }
-    case kRfc3389CngNoPacket:
-    case kCodecInternalCng: {
-      return 0;
-    }
-    case kDtmf: {
-      // TODO(hlundin): Write test for this.
-      // Update timestamp.
-      timestamp_ = end_timestamp;
-      const uint64_t generated_noise_samples =
-          generated_noise_stopwatch_
-              ? generated_noise_stopwatch_->ElapsedTicks() *
-                        output_size_samples_ +
-                    decision_logic_->noise_fast_forward()
-              : 0;
-      if (generated_noise_samples > 0 && last_mode_ != kModeDtmf) {
-        // Make a jump in timestamp due to the recently played comfort noise.
-        uint32_t timestamp_jump =
-            static_cast<uint32_t>(generated_noise_samples);
-        sync_buffer_->IncreaseEndTimestamp(timestamp_jump);
-        timestamp_ += timestamp_jump;
-      }
-      return 0;
-    }
-    case kAccelerate:
-    case kFastAccelerate: {
-      // In order to do an accelerate we need at least 30 ms of audio data.
-      if (samples_left >= static_cast<int>(samples_30_ms)) {
-        // Already have enough data, so we do not need to extract any more.
-        decision_logic_->set_sample_memory(samples_left);
-        decision_logic_->set_prev_time_scale(true);
-        return 0;
-      } else if (samples_left >= static_cast<int>(samples_10_ms) &&
-          decoder_frame_length_ >= samples_30_ms) {
-        // Avoid decoding more data as it might overflow the playout buffer.
-        *operation = kNormal;
-        return 0;
-      } else if (samples_left < static_cast<int>(samples_20_ms) &&
-          decoder_frame_length_ < samples_30_ms) {
-        // Build up decoded data by decoding at least 20 ms of audio data. Do
-        // not perform accelerate yet, but wait until we only need to do one
-        // decoding.
-        required_samples = 2 * output_size_samples_;
-        *operation = kNormal;
-      }
-      // If none of the above is true, we have one of two possible situations:
-      // (1) 20 ms <= samples_left < 30 ms and decoder_frame_length_ < 30 ms; or
-      // (2) samples_left < 10 ms and decoder_frame_length_ >= 30 ms.
-      // In either case, we move on with the accelerate decision, and decode one
-      // frame now.
-      break;
-    }
-    case kPreemptiveExpand: {
-      // In order to do a preemptive expand we need at least 30 ms of decoded
-      // audio data.
-      if ((samples_left >= static_cast<int>(samples_30_ms)) ||
-          (samples_left >= static_cast<int>(samples_10_ms) &&
-              decoder_frame_length_ >= samples_30_ms)) {
-        // Already have enough data, so we do not need to extract any more.
-        // Or, avoid decoding more data as it might overflow the playout buffer.
-        // Still try preemptive expand, though.
-        decision_logic_->set_sample_memory(samples_left);
-        decision_logic_->set_prev_time_scale(true);
-        return 0;
-      }
-      if (samples_left < static_cast<int>(samples_20_ms) &&
-          decoder_frame_length_ < samples_30_ms) {
-        // Build up decoded data by decoding at least 20 ms of audio data.
-        // Still try to perform preemptive expand.
-        required_samples = 2 * output_size_samples_;
-      }
-      // Move on with the preemptive expand decision.
-      break;
-    }
-    case kMerge: {
-      required_samples =
-          std::max(merge_->RequiredFutureSamples(), required_samples);
-      break;
-    }
-    default: {
-      // Do nothing.
-    }
-  }
-
-  // Get packets from buffer.
-  int extracted_samples = 0;
-  if (packet && *operation != kAlternativePlc &&
-      *operation != kAlternativePlcIncreaseTimestamp &&
-      *operation != kAudioRepetition &&
-      *operation != kAudioRepetitionIncreaseTimestamp) {
-    sync_buffer_->IncreaseEndTimestamp(packet->timestamp - end_timestamp);
-    if (decision_logic_->CngOff()) {
-      // Adjustment of timestamp only corresponds to an actual packet loss
-      // if comfort noise is not played. If comfort noise was just played,
-      // this adjustment of timestamp is only done to get back in sync with the
-      // stream timestamp; no loss to report.
-      stats_.LostSamples(packet->timestamp - end_timestamp);
-    }
-
-    if (*operation != kRfc3389Cng) {
-      // We are about to decode and use a non-CNG packet.
-      decision_logic_->SetCngOff();
-    }
-
-    extracted_samples = ExtractPackets(required_samples, packet_list);
-    if (extracted_samples < 0) {
-      return kPacketBufferCorruption;
-    }
-  }
-
-  if (*operation == kAccelerate || *operation == kFastAccelerate ||
-      *operation == kPreemptiveExpand) {
-    decision_logic_->set_sample_memory(samples_left + extracted_samples);
-    decision_logic_->set_prev_time_scale(true);
-  }
-
-  if (*operation == kAccelerate || *operation == kFastAccelerate) {
-    // Check that we have enough data (30ms) to do accelerate.
-    if (extracted_samples + samples_left < static_cast<int>(samples_30_ms)) {
-      // TODO(hlundin): Write test for this.
-      // Not enough, do normal operation instead.
-      *operation = kNormal;
-    }
-  }
-
-  timestamp_ = end_timestamp;
-  return 0;
-}
-
-int NetEqImpl::Decode(PacketList* packet_list, Operations* operation,
-                      int* decoded_length,
-                      AudioDecoder::SpeechType* speech_type) {
-  *speech_type = AudioDecoder::kSpeech;
-
-  // When packet_list is empty, we may be in kCodecInternalCng mode, and for
-  // that we use current active decoder.
-  AudioDecoder* decoder = decoder_database_->GetActiveDecoder();
-
-  if (!packet_list->empty()) {
-    const Packet& packet = packet_list->front();
-    uint8_t payload_type = packet.payload_type;
-    if (!decoder_database_->IsComfortNoise(payload_type)) {
-      decoder = decoder_database_->GetDecoder(payload_type);
-      assert(decoder);
-      if (!decoder) {
-        LOG(LS_WARNING) << "Unknown payload type "
-                        << static_cast<int>(payload_type);
-        packet_list->clear();
-        return kDecoderNotFound;
-      }
-      bool decoder_changed;
-      decoder_database_->SetActiveDecoder(payload_type, &decoder_changed);
-      if (decoder_changed) {
-        // We have a new decoder. Re-init some values.
-        const DecoderDatabase::DecoderInfo* decoder_info = decoder_database_
-            ->GetDecoderInfo(payload_type);
-        assert(decoder_info);
-        if (!decoder_info) {
-          LOG(LS_WARNING) << "Unknown payload type "
-                          << static_cast<int>(payload_type);
-          packet_list->clear();
-          return kDecoderNotFound;
-        }
-        // If sampling rate or number of channels has changed, we need to make
-        // a reset.
-        if (decoder_info->SampleRateHz() != fs_hz_ ||
-            decoder->Channels() != algorithm_buffer_->Channels()) {
-          // TODO(tlegrand): Add unittest to cover this event.
-          SetSampleRateAndChannels(decoder_info->SampleRateHz(),
-                                   decoder->Channels());
-        }
-        sync_buffer_->set_end_timestamp(timestamp_);
-        playout_timestamp_ = timestamp_;
-      }
-    }
-  }
-
-  if (reset_decoder_) {
-    // TODO(hlundin): Write test for this.
-    if (decoder)
-      decoder->Reset();
-
-    // Reset comfort noise decoder.
-    ComfortNoiseDecoder* cng_decoder = decoder_database_->GetActiveCngDecoder();
-    if (cng_decoder)
-      cng_decoder->Reset();
-
-    reset_decoder_ = false;
-  }
-
-  *decoded_length = 0;
-  // Update codec-internal PLC state.
-  if ((*operation == kMerge) && decoder && decoder->HasDecodePlc()) {
-    decoder->DecodePlc(1, &decoded_buffer_[*decoded_length]);
-  }
-
-  int return_value;
-  if (*operation == kCodecInternalCng) {
-    RTC_DCHECK(packet_list->empty());
-    return_value = DecodeCng(decoder, decoded_length, speech_type);
-  } else {
-    return_value = DecodeLoop(packet_list, *operation, decoder,
-                              decoded_length, speech_type);
-  }
-
-  if (*decoded_length < 0) {
-    // Error returned from the decoder.
-    *decoded_length = 0;
-    sync_buffer_->IncreaseEndTimestamp(
-        static_cast<uint32_t>(decoder_frame_length_));
-    int error_code = 0;
-    if (decoder)
-      error_code = decoder->ErrorCode();
-    if (error_code != 0) {
-      // Got some error code from the decoder.
-      return_value = kDecoderErrorCode;
-      LOG(LS_WARNING) << "Decoder returned error code: " << error_code;
-    } else {
-      // Decoder does not implement error codes. Return generic error.
-      return_value = kOtherDecoderError;
-      LOG(LS_WARNING) << "Decoder error (no error code)";
-    }
-    *operation = kExpand;  // Do expansion to get data instead.
-  }
-  if (*speech_type != AudioDecoder::kComfortNoise) {
-    // Don't increment timestamp if codec returned CNG speech type
-    // since in this case, the we will increment the CNGplayedTS counter.
-    // Increase with number of samples per channel.
-    assert(*decoded_length == 0 ||
-           (decoder && decoder->Channels() == sync_buffer_->Channels()));
-    sync_buffer_->IncreaseEndTimestamp(
-        *decoded_length / static_cast<int>(sync_buffer_->Channels()));
-  }
-  return return_value;
-}
-
-int NetEqImpl::DecodeCng(AudioDecoder* decoder, int* decoded_length,
-                         AudioDecoder::SpeechType* speech_type) {
-  if (!decoder) {
-    // This happens when active decoder is not defined.
-    *decoded_length = -1;
-    return 0;
-  }
-
-  while (*decoded_length < rtc::dchecked_cast<int>(output_size_samples_)) {
-    const int length = decoder->Decode(
-            nullptr, 0, fs_hz_,
-            (decoded_buffer_length_ - *decoded_length) * sizeof(int16_t),
-            &decoded_buffer_[*decoded_length], speech_type);
-    if (length > 0) {
-      *decoded_length += length;
-    } else {
-      // Error.
-      LOG(LS_WARNING) << "Failed to decode CNG";
-      *decoded_length = -1;
-      break;
-    }
-    if (*decoded_length > static_cast<int>(decoded_buffer_length_)) {
-      // Guard against overflow.
-      LOG(LS_WARNING) << "Decoded too much CNG.";
-      return kDecodedTooMuch;
-    }
-  }
-  return 0;
-}
-
-int NetEqImpl::DecodeLoop(PacketList* packet_list, const Operations& operation,
-                          AudioDecoder* decoder, int* decoded_length,
-                          AudioDecoder::SpeechType* speech_type) {
-  RTC_DCHECK(last_decoded_timestamps_.empty());
-
-  // Do decoding.
-  while (
-      !packet_list->empty() &&
-      !decoder_database_->IsComfortNoise(packet_list->front().payload_type)) {
-    assert(decoder);  // At this point, we must have a decoder object.
-    // The number of channels in the |sync_buffer_| should be the same as the
-    // number decoder channels.
-    assert(sync_buffer_->Channels() == decoder->Channels());
-    assert(decoded_buffer_length_ >= kMaxFrameSize * decoder->Channels());
-    assert(operation == kNormal || operation == kAccelerate ||
-           operation == kFastAccelerate || operation == kMerge ||
-           operation == kPreemptiveExpand);
-
-    auto opt_result = packet_list->front().frame->Decode(
-        rtc::ArrayView<int16_t>(&decoded_buffer_[*decoded_length],
-                                decoded_buffer_length_ - *decoded_length));
-    last_decoded_timestamps_.push_back(packet_list->front().timestamp);
-    packet_list->pop_front();
-    if (opt_result) {
-      const auto& result = *opt_result;
-      *speech_type = result.speech_type;
-      if (result.num_decoded_samples > 0) {
-        *decoded_length += rtc::dchecked_cast<int>(result.num_decoded_samples);
-        // Update |decoder_frame_length_| with number of samples per channel.
-        decoder_frame_length_ =
-            result.num_decoded_samples / decoder->Channels();
-      }
-    } else {
-      // Error.
-      // TODO(ossu): What to put here?
-      LOG(LS_WARNING) << "Decode error";
-      *decoded_length = -1;
-      packet_list->clear();
-      break;
-    }
-    if (*decoded_length > rtc::dchecked_cast<int>(decoded_buffer_length_)) {
-      // Guard against overflow.
-      LOG(LS_WARNING) << "Decoded too much.";
-      packet_list->clear();
-      return kDecodedTooMuch;
-    }
-  }  // End of decode loop.
-
-  // If the list is not empty at this point, either a decoding error terminated
-  // the while-loop, or list must hold exactly one CNG packet.
-  assert(
-      packet_list->empty() || *decoded_length < 0 ||
-      (packet_list->size() == 1 &&
-       decoder_database_->IsComfortNoise(packet_list->front().payload_type)));
-  return 0;
-}
-
-void NetEqImpl::DoNormal(const int16_t* decoded_buffer, size_t decoded_length,
-                         AudioDecoder::SpeechType speech_type, bool play_dtmf) {
-  assert(normal_.get());
-  assert(mute_factor_array_.get());
-  normal_->Process(decoded_buffer, decoded_length, last_mode_,
-                   mute_factor_array_.get(), algorithm_buffer_.get());
-  if (decoded_length != 0) {
-    last_mode_ = kModeNormal;
-  }
-
-  // If last packet was decoded as an inband CNG, set mode to CNG instead.
-  if ((speech_type == AudioDecoder::kComfortNoise)
-      || ((last_mode_ == kModeCodecInternalCng)
-          && (decoded_length == 0))) {
-    // TODO(hlundin): Remove second part of || statement above.
-    last_mode_ = kModeCodecInternalCng;
-  }
-
-  if (!play_dtmf) {
-    dtmf_tone_generator_->Reset();
-  }
-}
-
-void NetEqImpl::DoMerge(int16_t* decoded_buffer, size_t decoded_length,
-                        AudioDecoder::SpeechType speech_type, bool play_dtmf) {
-  assert(mute_factor_array_.get());
-  assert(merge_.get());
-  size_t new_length = merge_->Process(decoded_buffer, decoded_length,
-                                      mute_factor_array_.get(),
-                                      algorithm_buffer_.get());
-  // Correction can be negative.
-  int expand_length_correction =
-      rtc::dchecked_cast<int>(new_length) -
-      rtc::dchecked_cast<int>(decoded_length / algorithm_buffer_->Channels());
-
-  // Update in-call and post-call statistics.
-  if (expand_->MuteFactor(0) == 0) {
-    // Expand generates only noise.
-    stats_.ExpandedNoiseSamplesCorrection(expand_length_correction);
-  } else {
-    // Expansion generates more than only noise.
-    stats_.ExpandedVoiceSamplesCorrection(expand_length_correction);
-  }
-
-  last_mode_ = kModeMerge;
-  // If last packet was decoded as an inband CNG, set mode to CNG instead.
-  if (speech_type == AudioDecoder::kComfortNoise) {
-    last_mode_ = kModeCodecInternalCng;
-  }
-  expand_->Reset();
-  if (!play_dtmf) {
-    dtmf_tone_generator_->Reset();
-  }
-}
-
-int NetEqImpl::DoExpand(bool play_dtmf) {
-  while ((sync_buffer_->FutureLength() - expand_->overlap_length()) <
-      output_size_samples_) {
-    algorithm_buffer_->Clear();
-    int return_value = expand_->Process(algorithm_buffer_.get());
-    size_t length = algorithm_buffer_->Size();
-
-    // Update in-call and post-call statistics.
-    if (expand_->MuteFactor(0) == 0) {
-      // Expand operation generates only noise.
-      stats_.ExpandedNoiseSamples(length);
-    } else {
-      // Expand operation generates more than only noise.
-      stats_.ExpandedVoiceSamples(length);
-    }
-
-    last_mode_ = kModeExpand;
-
-    if (return_value < 0) {
-      return return_value;
-    }
-
-    sync_buffer_->PushBack(*algorithm_buffer_);
-    algorithm_buffer_->Clear();
-  }
-  if (!play_dtmf) {
-    dtmf_tone_generator_->Reset();
-  }
-
-  if (!generated_noise_stopwatch_) {
-    // Start a new stopwatch since we may be covering for a lost CNG packet.
-    generated_noise_stopwatch_ = tick_timer_->GetNewStopwatch();
-  }
-
-  return 0;
-}
-
-int NetEqImpl::DoAccelerate(int16_t* decoded_buffer,
-                            size_t decoded_length,
-                            AudioDecoder::SpeechType speech_type,
-                            bool play_dtmf,
-                            bool fast_accelerate) {
-  const size_t required_samples =
-      static_cast<size_t>(240 * fs_mult_);  // Must have 30 ms.
-  size_t borrowed_samples_per_channel = 0;
-  size_t num_channels = algorithm_buffer_->Channels();
-  size_t decoded_length_per_channel = decoded_length / num_channels;
-  if (decoded_length_per_channel < required_samples) {
-    // Must move data from the |sync_buffer_| in order to get 30 ms.
-    borrowed_samples_per_channel = static_cast<int>(required_samples -
-        decoded_length_per_channel);
-    memmove(&decoded_buffer[borrowed_samples_per_channel * num_channels],
-            decoded_buffer,
-            sizeof(int16_t) * decoded_length);
-    sync_buffer_->ReadInterleavedFromEnd(borrowed_samples_per_channel,
-                                         decoded_buffer);
-    decoded_length = required_samples * num_channels;
-  }
-
-  size_t samples_removed;
-  Accelerate::ReturnCodes return_code =
-      accelerate_->Process(decoded_buffer, decoded_length, fast_accelerate,
-                           algorithm_buffer_.get(), &samples_removed);
-  stats_.AcceleratedSamples(samples_removed);
-  switch (return_code) {
-    case Accelerate::kSuccess:
-      last_mode_ = kModeAccelerateSuccess;
-      break;
-    case Accelerate::kSuccessLowEnergy:
-      last_mode_ = kModeAccelerateLowEnergy;
-      break;
-    case Accelerate::kNoStretch:
-      last_mode_ = kModeAccelerateFail;
-      break;
-    case Accelerate::kError:
-      // TODO(hlundin): Map to kModeError instead?
-      last_mode_ = kModeAccelerateFail;
-      return kAccelerateError;
-  }
-
-  if (borrowed_samples_per_channel > 0) {
-    // Copy borrowed samples back to the |sync_buffer_|.
-    size_t length = algorithm_buffer_->Size();
-    if (length < borrowed_samples_per_channel) {
-      // This destroys the beginning of the buffer, but will not cause any
-      // problems.
-      sync_buffer_->ReplaceAtIndex(*algorithm_buffer_,
-                                   sync_buffer_->Size() -
-                                   borrowed_samples_per_channel);
-      sync_buffer_->PushFrontZeros(borrowed_samples_per_channel - length);
-      algorithm_buffer_->PopFront(length);
-      assert(algorithm_buffer_->Empty());
-    } else {
-      sync_buffer_->ReplaceAtIndex(*algorithm_buffer_,
-                                   borrowed_samples_per_channel,
-                                   sync_buffer_->Size() -
-                                   borrowed_samples_per_channel);
-      algorithm_buffer_->PopFront(borrowed_samples_per_channel);
-    }
-  }
-
-  // If last packet was decoded as an inband CNG, set mode to CNG instead.
-  if (speech_type == AudioDecoder::kComfortNoise) {
-    last_mode_ = kModeCodecInternalCng;
-  }
-  if (!play_dtmf) {
-    dtmf_tone_generator_->Reset();
-  }
-  expand_->Reset();
-  return 0;
-}
-
-int NetEqImpl::DoPreemptiveExpand(int16_t* decoded_buffer,
-                                  size_t decoded_length,
-                                  AudioDecoder::SpeechType speech_type,
-                                  bool play_dtmf) {
-  const size_t required_samples =
-      static_cast<size_t>(240 * fs_mult_);  // Must have 30 ms.
-  size_t num_channels = algorithm_buffer_->Channels();
-  size_t borrowed_samples_per_channel = 0;
-  size_t old_borrowed_samples_per_channel = 0;
-  size_t decoded_length_per_channel = decoded_length / num_channels;
-  if (decoded_length_per_channel < required_samples) {
-    // Must move data from the |sync_buffer_| in order to get 30 ms.
-    borrowed_samples_per_channel =
-        required_samples - decoded_length_per_channel;
-    // Calculate how many of these were already played out.
-    old_borrowed_samples_per_channel =
-        (borrowed_samples_per_channel > sync_buffer_->FutureLength()) ?
-        (borrowed_samples_per_channel - sync_buffer_->FutureLength()) : 0;
-    memmove(&decoded_buffer[borrowed_samples_per_channel * num_channels],
-            decoded_buffer,
-            sizeof(int16_t) * decoded_length);
-    sync_buffer_->ReadInterleavedFromEnd(borrowed_samples_per_channel,
-                                         decoded_buffer);
-    decoded_length = required_samples * num_channels;
-  }
-
-  size_t samples_added;
-  PreemptiveExpand::ReturnCodes return_code = preemptive_expand_->Process(
-      decoded_buffer, decoded_length,
-      old_borrowed_samples_per_channel,
-      algorithm_buffer_.get(), &samples_added);
-  stats_.PreemptiveExpandedSamples(samples_added);
-  switch (return_code) {
-    case PreemptiveExpand::kSuccess:
-      last_mode_ = kModePreemptiveExpandSuccess;
-      break;
-    case PreemptiveExpand::kSuccessLowEnergy:
-      last_mode_ = kModePreemptiveExpandLowEnergy;
-      break;
-    case PreemptiveExpand::kNoStretch:
-      last_mode_ = kModePreemptiveExpandFail;
-      break;
-    case PreemptiveExpand::kError:
-      // TODO(hlundin): Map to kModeError instead?
-      last_mode_ = kModePreemptiveExpandFail;
-      return kPreemptiveExpandError;
-  }
-
-  if (borrowed_samples_per_channel > 0) {
-    // Copy borrowed samples back to the |sync_buffer_|.
-    sync_buffer_->ReplaceAtIndex(
-        *algorithm_buffer_, borrowed_samples_per_channel,
-        sync_buffer_->Size() - borrowed_samples_per_channel);
-    algorithm_buffer_->PopFront(borrowed_samples_per_channel);
-  }
-
-  // If last packet was decoded as an inband CNG, set mode to CNG instead.
-  if (speech_type == AudioDecoder::kComfortNoise) {
-    last_mode_ = kModeCodecInternalCng;
-  }
-  if (!play_dtmf) {
-    dtmf_tone_generator_->Reset();
-  }
-  expand_->Reset();
-  return 0;
-}
-
-int NetEqImpl::DoRfc3389Cng(PacketList* packet_list, bool play_dtmf) {
-  if (!packet_list->empty()) {
-    // Must have exactly one SID frame at this point.
-    assert(packet_list->size() == 1);
-    const Packet& packet = packet_list->front();
-    if (!decoder_database_->IsComfortNoise(packet.payload_type)) {
-      LOG(LS_ERROR) << "Trying to decode non-CNG payload as CNG.";
-      return kOtherError;
-    }
-    if (comfort_noise_->UpdateParameters(packet) ==
-        ComfortNoise::kInternalError) {
-      algorithm_buffer_->Zeros(output_size_samples_);
-      return -comfort_noise_->internal_error_code();
-    }
-  }
-  int cn_return = comfort_noise_->Generate(output_size_samples_,
-                                           algorithm_buffer_.get());
-  expand_->Reset();
-  last_mode_ = kModeRfc3389Cng;
-  if (!play_dtmf) {
-    dtmf_tone_generator_->Reset();
-  }
-  if (cn_return == ComfortNoise::kInternalError) {
-    LOG(LS_WARNING) << "Comfort noise generator returned error code: "
-                    << comfort_noise_->internal_error_code();
-    return kComfortNoiseErrorCode;
-  } else if (cn_return == ComfortNoise::kUnknownPayloadType) {
-    return kUnknownRtpPayloadType;
-  }
-  return 0;
-}
-
-void NetEqImpl::DoCodecInternalCng(const int16_t* decoded_buffer,
-                                   size_t decoded_length) {
-  RTC_DCHECK(normal_.get());
-  RTC_DCHECK(mute_factor_array_.get());
-  normal_->Process(decoded_buffer, decoded_length, last_mode_,
-                   mute_factor_array_.get(), algorithm_buffer_.get());
-  last_mode_ = kModeCodecInternalCng;
-  expand_->Reset();
-}
-
-int NetEqImpl::DoDtmf(const DtmfEvent& dtmf_event, bool* play_dtmf) {
-  // This block of the code and the block further down, handling |dtmf_switch|
-  // are commented out. Otherwise playing out-of-band DTMF would fail in VoE
-  // test, DtmfTest.ManualSuccessfullySendsOutOfBandTelephoneEvents. This is
-  // equivalent to |dtmf_switch| always be false.
-  //
-  // See http://webrtc-codereview.appspot.com/1195004/ for discussion
-  // On this issue. This change might cause some glitches at the point of
-  // switch from audio to DTMF. Issue 1545 is filed to track this.
-  //
-  //  bool dtmf_switch = false;
-  //  if ((last_mode_ != kModeDtmf) && dtmf_tone_generator_->initialized()) {
-  //    // Special case; see below.
-  //    // We must catch this before calling Generate, since |initialized| is
-  //    // modified in that call.
-  //    dtmf_switch = true;
-  //  }
-
-  int dtmf_return_value = 0;
-  if (!dtmf_tone_generator_->initialized()) {
-    // Initialize if not already done.
-    dtmf_return_value = dtmf_tone_generator_->Init(fs_hz_, dtmf_event.event_no,
-                                                   dtmf_event.volume);
-  }
-
-  if (dtmf_return_value == 0) {
-    // Generate DTMF signal.
-    dtmf_return_value = dtmf_tone_generator_->Generate(output_size_samples_,
-                                                       algorithm_buffer_.get());
-  }
-
-  if (dtmf_return_value < 0) {
-    algorithm_buffer_->Zeros(output_size_samples_);
-    return dtmf_return_value;
-  }
-
-  //  if (dtmf_switch) {
-  //    // This is the special case where the previous operation was DTMF
-  //    // overdub, but the current instruction is "regular" DTMF. We must make
-  //    // sure that the DTMF does not have any discontinuities. The first DTMF
-  //    // sample that we generate now must be played out immediately, therefore
-  //    // it must be copied to the speech buffer.
-  //    // TODO(hlundin): This code seems incorrect. (Legacy.) Write test and
-  //    // verify correct operation.
-  //    assert(false);
-  //    // Must generate enough data to replace all of the |sync_buffer_|
-  //    // "future".
-  //    int required_length = sync_buffer_->FutureLength();
-  //    assert(dtmf_tone_generator_->initialized());
-  //    dtmf_return_value = dtmf_tone_generator_->Generate(required_length,
-  //                                                       algorithm_buffer_);
-  //    assert((size_t) required_length == algorithm_buffer_->Size());
-  //    if (dtmf_return_value < 0) {
-  //      algorithm_buffer_->Zeros(output_size_samples_);
-  //      return dtmf_return_value;
-  //    }
-  //
-  //    // Overwrite the "future" part of the speech buffer with the new DTMF
-  //    // data.
-  //    // TODO(hlundin): It seems that this overwriting has gone lost.
-  //    // Not adapted for multi-channel yet.
-  //    assert(algorithm_buffer_->Channels() == 1);
-  //    if (algorithm_buffer_->Channels() != 1) {
-  //      LOG(LS_WARNING) << "DTMF not supported for more than one channel";
-  //      return kStereoNotSupported;
-  //    }
-  //    // Shuffle the remaining data to the beginning of algorithm buffer.
-  //    algorithm_buffer_->PopFront(sync_buffer_->FutureLength());
-  //  }
-
-  sync_buffer_->IncreaseEndTimestamp(
-      static_cast<uint32_t>(output_size_samples_));
-  expand_->Reset();
-  last_mode_ = kModeDtmf;
-
-  // Set to false because the DTMF is already in the algorithm buffer.
-  *play_dtmf = false;
-  return 0;
-}
-
-void NetEqImpl::DoAlternativePlc(bool increase_timestamp) {
-  AudioDecoder* decoder = decoder_database_->GetActiveDecoder();
-  size_t length;
-  if (decoder && decoder->HasDecodePlc()) {
-    // Use the decoder's packet-loss concealment.
-    // TODO(hlundin): Will probably need a longer buffer for multi-channel.
-    int16_t decoded_buffer[kMaxFrameSize];
-    length = decoder->DecodePlc(1, decoded_buffer);
-    if (length > 0)
-      algorithm_buffer_->PushBackInterleaved(decoded_buffer, length);
-  } else {
-    // Do simple zero-stuffing.
-    length = output_size_samples_;
-    algorithm_buffer_->Zeros(length);
-    // By not advancing the timestamp, NetEq inserts samples.
-    stats_.AddZeros(length);
-  }
-  if (increase_timestamp) {
-    sync_buffer_->IncreaseEndTimestamp(static_cast<uint32_t>(length));
-  }
-  expand_->Reset();
-}
-
-int NetEqImpl::DtmfOverdub(const DtmfEvent& dtmf_event, size_t num_channels,
-                           int16_t* output) const {
-  size_t out_index = 0;
-  size_t overdub_length = output_size_samples_;  // Default value.
-
-  if (sync_buffer_->dtmf_index() > sync_buffer_->next_index()) {
-    // Special operation for transition from "DTMF only" to "DTMF overdub".
-    out_index = std::min(
-        sync_buffer_->dtmf_index() - sync_buffer_->next_index(),
-        output_size_samples_);
-    overdub_length = output_size_samples_ - out_index;
-  }
-
-  AudioMultiVector dtmf_output(num_channels);
-  int dtmf_return_value = 0;
-  if (!dtmf_tone_generator_->initialized()) {
-    dtmf_return_value = dtmf_tone_generator_->Init(fs_hz_, dtmf_event.event_no,
-                                                   dtmf_event.volume);
-  }
-  if (dtmf_return_value == 0) {
-    dtmf_return_value = dtmf_tone_generator_->Generate(overdub_length,
-                                                       &dtmf_output);
-    assert(overdub_length == dtmf_output.Size());
-  }
-  dtmf_output.ReadInterleaved(overdub_length, &output[out_index]);
-  return dtmf_return_value < 0 ? dtmf_return_value : 0;
-}
-
-int NetEqImpl::ExtractPackets(size_t required_samples,
-                              PacketList* packet_list) {
-  bool first_packet = true;
-  uint8_t prev_payload_type = 0;
-  uint32_t prev_timestamp = 0;
-  uint16_t prev_sequence_number = 0;
-  bool next_packet_available = false;
-
-  const Packet* next_packet = packet_buffer_->PeekNextPacket();
-  RTC_DCHECK(next_packet);
-  if (!next_packet) {
-    LOG(LS_ERROR) << "Packet buffer unexpectedly empty.";
-    return -1;
-  }
-  uint32_t first_timestamp = next_packet->timestamp;
-  size_t extracted_samples = 0;
-
-  // Packet extraction loop.
-  do {
-    timestamp_ = next_packet->timestamp;
-    rtc::Optional<Packet> packet = packet_buffer_->GetNextPacket();
-    // |next_packet| may be invalid after the |packet_buffer_| operation.
-    next_packet = nullptr;
-    if (!packet) {
-      LOG(LS_ERROR) << "Should always be able to extract a packet here";
-      assert(false);  // Should always be able to extract a packet here.
-      return -1;
-    }
-    stats_.StoreWaitingTime(packet->waiting_time->ElapsedMs());
-    RTC_DCHECK(!packet->empty());
-
-    if (first_packet) {
-      first_packet = false;
-      if (nack_enabled_) {
-        RTC_DCHECK(nack_);
-        // TODO(henrik.lundin): Should we update this for all decoded packets?
-        nack_->UpdateLastDecodedPacket(packet->sequence_number,
-                                       packet->timestamp);
-      }
-      prev_sequence_number = packet->sequence_number;
-      prev_timestamp = packet->timestamp;
-      prev_payload_type = packet->payload_type;
-    }
-
-    const bool has_cng_packet =
-        decoder_database_->IsComfortNoise(packet->payload_type);
-    // Store number of extracted samples.
-    size_t packet_duration = 0;
-    if (packet->frame) {
-      packet_duration = packet->frame->Duration();
-      // TODO(ossu): Is this the correct way to track Opus FEC packets?
-      if (packet->priority.codec_level > 0) {
-        stats_.SecondaryDecodedSamples(
-            rtc::dchecked_cast<int>(packet_duration));
-      }
-    } else if (!has_cng_packet) {
-      LOG(LS_WARNING) << "Unknown payload type "
-                      << static_cast<int>(packet->payload_type);
-      RTC_NOTREACHED();
-    }
-
-    if (packet_duration == 0) {
-      // Decoder did not return a packet duration. Assume that the packet
-      // contains the same number of samples as the previous one.
-      packet_duration = decoder_frame_length_;
-    }
-    extracted_samples = packet->timestamp - first_timestamp + packet_duration;
-
-    packet_list->push_back(std::move(*packet));  // Store packet in list.
-    packet = rtc::Optional<Packet>();  // Ensure it's never used after the move.
-
-    // Check what packet is available next.
-    next_packet = packet_buffer_->PeekNextPacket();
-    next_packet_available = false;
-    if (next_packet && prev_payload_type == next_packet->payload_type &&
-        !has_cng_packet) {
-      int16_t seq_no_diff = next_packet->sequence_number - prev_sequence_number;
-      size_t ts_diff = next_packet->timestamp - prev_timestamp;
-      if (seq_no_diff == 1 ||
-          (seq_no_diff == 0 && ts_diff == decoder_frame_length_)) {
-        // The next sequence number is available, or the next part of a packet
-        // that was split into pieces upon insertion.
-        next_packet_available = true;
-      }
-      prev_sequence_number = next_packet->sequence_number;
-    }
-  } while (extracted_samples < required_samples && next_packet_available);
-
-  if (extracted_samples > 0) {
-    // Delete old packets only when we are going to decode something. Otherwise,
-    // we could end up in the situation where we never decode anything, since
-    // all incoming packets are considered too old but the buffer will also
-    // never be flooded and flushed.
-    packet_buffer_->DiscardAllOldPackets(timestamp_, &stats_);
-  }
-
-  return rtc::dchecked_cast<int>(extracted_samples);
-}
-
-void NetEqImpl::UpdatePlcComponents(int fs_hz, size_t channels) {
-  // Delete objects and create new ones.
-  expand_.reset(expand_factory_->Create(background_noise_.get(),
-                                        sync_buffer_.get(), &random_vector_,
-                                        &stats_, fs_hz, channels));
-  merge_.reset(new Merge(fs_hz, channels, expand_.get(), sync_buffer_.get()));
-}
-
-void NetEqImpl::SetSampleRateAndChannels(int fs_hz, size_t channels) {
-  LOG(LS_VERBOSE) << "SetSampleRateAndChannels " << fs_hz << " " << channels;
-  // TODO(hlundin): Change to an enumerator and skip assert.
-  assert(fs_hz == 8000 || fs_hz == 16000 || fs_hz ==  32000 || fs_hz == 48000);
-  assert(channels > 0);
-
-  fs_hz_ = fs_hz;
-  fs_mult_ = fs_hz / 8000;
-  output_size_samples_ = static_cast<size_t>(kOutputSizeMs * 8 * fs_mult_);
-  decoder_frame_length_ = 3 * output_size_samples_;  // Initialize to 30ms.
-
-  last_mode_ = kModeNormal;
-
-  // Create a new array of mute factors and set all to 1.
-  mute_factor_array_.reset(new int16_t[channels]);
-  for (size_t i = 0; i < channels; ++i) {
-    mute_factor_array_[i] = 16384;  // 1.0 in Q14.
-  }
-
-  ComfortNoiseDecoder* cng_decoder = decoder_database_->GetActiveCngDecoder();
-  if (cng_decoder)
-    cng_decoder->Reset();
-
-  // Reinit post-decode VAD with new sample rate.
-  assert(vad_.get());  // Cannot be NULL here.
-  vad_->Init();
-
-  // Delete algorithm buffer and create a new one.
-  algorithm_buffer_.reset(new AudioMultiVector(channels));
-
-  // Delete sync buffer and create a new one.
-  sync_buffer_.reset(new SyncBuffer(channels, kSyncBufferSize * fs_mult_));
-
-  // Delete BackgroundNoise object and create a new one.
-  background_noise_.reset(new BackgroundNoise(channels));
-  background_noise_->set_mode(background_noise_mode_);
-
-  // Reset random vector.
-  random_vector_.Reset();
-
-  UpdatePlcComponents(fs_hz, channels);
-
-  // Move index so that we create a small set of future samples (all 0).
-  sync_buffer_->set_next_index(sync_buffer_->next_index() -
-      expand_->overlap_length());
-
-  normal_.reset(new Normal(fs_hz, decoder_database_.get(), *background_noise_,
-                           expand_.get()));
-  accelerate_.reset(
-      accelerate_factory_->Create(fs_hz, channels, *background_noise_));
-  preemptive_expand_.reset(preemptive_expand_factory_->Create(
-      fs_hz, channels, *background_noise_, expand_->overlap_length()));
-
-  // Delete ComfortNoise object and create a new one.
-  comfort_noise_.reset(new ComfortNoise(fs_hz, decoder_database_.get(),
-                                        sync_buffer_.get()));
-
-  // Verify that |decoded_buffer_| is long enough.
-  if (decoded_buffer_length_ < kMaxFrameSize * channels) {
-    // Reallocate to larger size.
-    decoded_buffer_length_ = kMaxFrameSize * channels;
-    decoded_buffer_.reset(new int16_t[decoded_buffer_length_]);
-  }
-
-  // Create DecisionLogic if it is not created yet, then communicate new sample
-  // rate and output size to DecisionLogic object.
-  if (!decision_logic_.get()) {
-    CreateDecisionLogic();
-  }
-  decision_logic_->SetSampleRate(fs_hz_, output_size_samples_);
-}
-
-NetEqImpl::OutputType NetEqImpl::LastOutputType() {
-  assert(vad_.get());
-  assert(expand_.get());
-  if (last_mode_ == kModeCodecInternalCng || last_mode_ == kModeRfc3389Cng) {
-    return OutputType::kCNG;
-  } else if (last_mode_ == kModeExpand && expand_->MuteFactor(0) == 0) {
-    // Expand mode has faded down to background noise only (very long expand).
-    return OutputType::kPLCCNG;
-  } else if (last_mode_ == kModeExpand) {
-    return OutputType::kPLC;
-  } else if (vad_->running() && !vad_->active_speech()) {
-    return OutputType::kVadPassive;
-  } else {
-    return OutputType::kNormalSpeech;
-  }
-}
-
-void NetEqImpl::CreateDecisionLogic() {
-  decision_logic_.reset(DecisionLogic::Create(
-      fs_hz_, output_size_samples_, playout_mode_, decoder_database_.get(),
-      *packet_buffer_.get(), delay_manager_.get(), buffer_level_filter_.get(),
-      tick_timer_.get()));
-}
-}  // namespace webrtc
diff --git a/modules/audio_coding/neteq/neteq_impl.h b/modules/audio_coding/neteq/neteq_impl.h
deleted file mode 100644
index ea10558..0000000
--- a/modules/audio_coding/neteq/neteq_impl.h
+++ /dev/null
@@ -1,449 +0,0 @@
-/*
- *  Copyright (c) 2012 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_NETEQ_NETEQ_IMPL_H_
-#define WEBRTC_MODULES_AUDIO_CODING_NETEQ_NETEQ_IMPL_H_
-
-#include <memory>
-#include <string>
-
-#include "webrtc/api/optional.h"
-#include "webrtc/modules/audio_coding/neteq/audio_multi_vector.h"
-#include "webrtc/modules/audio_coding/neteq/defines.h"
-#include "webrtc/modules/audio_coding/neteq/include/neteq.h"
-#include "webrtc/modules/audio_coding/neteq/packet.h"  // Declare PacketList.
-#include "webrtc/modules/audio_coding/neteq/random_vector.h"
-#include "webrtc/modules/audio_coding/neteq/rtcp.h"
-#include "webrtc/modules/audio_coding/neteq/statistics_calculator.h"
-#include "webrtc/modules/audio_coding/neteq/tick_timer.h"
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/thread_annotations.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-// Forward declarations.
-class Accelerate;
-class BackgroundNoise;
-class BufferLevelFilter;
-class ComfortNoise;
-class DecisionLogic;
-class DecoderDatabase;
-class DelayManager;
-class DelayPeakDetector;
-class DtmfBuffer;
-class DtmfToneGenerator;
-class Expand;
-class Merge;
-class NackTracker;
-class Normal;
-class PacketBuffer;
-class RedPayloadSplitter;
-class PostDecodeVad;
-class PreemptiveExpand;
-class RandomVector;
-class SyncBuffer;
-class TimestampScaler;
-struct AccelerateFactory;
-struct DtmfEvent;
-struct ExpandFactory;
-struct PreemptiveExpandFactory;
-
-class NetEqImpl : public webrtc::NetEq {
- public:
-  enum class OutputType {
-    kNormalSpeech,
-    kPLC,
-    kCNG,
-    kPLCCNG,
-    kVadPassive
-  };
-
-  enum ErrorCodes {
-    kNoError = 0,
-    kOtherError,
-    kUnknownRtpPayloadType,
-    kDecoderNotFound,
-    kInvalidPointer,
-    kAccelerateError,
-    kPreemptiveExpandError,
-    kComfortNoiseErrorCode,
-    kDecoderErrorCode,
-    kOtherDecoderError,
-    kInvalidOperation,
-    kDtmfParsingError,
-    kDtmfInsertError,
-    kSampleUnderrun,
-    kDecodedTooMuch,
-    kRedundancySplitError,
-    kPacketBufferCorruption
-  };
-
-  struct Dependencies {
-    // The constructor populates the Dependencies struct with the default
-    // implementations of the objects. They can all be replaced by the user
-    // before sending the struct to the NetEqImpl constructor. However, there
-    // are dependencies between some of the classes inside the struct, so
-    // swapping out one may make it necessary to re-create another one.
-    explicit Dependencies(
-        const NetEq::Config& config,
-        const rtc::scoped_refptr<AudioDecoderFactory>& decoder_factory);
-    ~Dependencies();
-
-    std::unique_ptr<TickTimer> tick_timer;
-    std::unique_ptr<BufferLevelFilter> buffer_level_filter;
-    std::unique_ptr<DecoderDatabase> decoder_database;
-    std::unique_ptr<DelayPeakDetector> delay_peak_detector;
-    std::unique_ptr<DelayManager> delay_manager;
-    std::unique_ptr<DtmfBuffer> dtmf_buffer;
-    std::unique_ptr<DtmfToneGenerator> dtmf_tone_generator;
-    std::unique_ptr<PacketBuffer> packet_buffer;
-    std::unique_ptr<RedPayloadSplitter> red_payload_splitter;
-    std::unique_ptr<TimestampScaler> timestamp_scaler;
-    std::unique_ptr<AccelerateFactory> accelerate_factory;
-    std::unique_ptr<ExpandFactory> expand_factory;
-    std::unique_ptr<PreemptiveExpandFactory> preemptive_expand_factory;
-  };
-
-  // Creates a new NetEqImpl object.
-  NetEqImpl(const NetEq::Config& config,
-            Dependencies&& deps,
-            bool create_components = true);
-
-  ~NetEqImpl() override;
-
-  // Inserts a new packet into NetEq. The |receive_timestamp| is an indication
-  // of the time when the packet was received, and should be measured with
-  // the same tick rate as the RTP timestamp of the current payload.
-  // Returns 0 on success, -1 on failure.
-  int InsertPacket(const RTPHeader& rtp_header,
-                   rtc::ArrayView<const uint8_t> payload,
-                   uint32_t receive_timestamp) override;
-
-  void InsertEmptyPacket(const RTPHeader& rtp_header) override;
-
-  int GetAudio(AudioFrame* audio_frame, bool* muted) override;
-
-  void SetCodecs(const std::map<int, SdpAudioFormat>& codecs) override;
-
-  int RegisterPayloadType(NetEqDecoder codec,
-                          const std::string& codec_name,
-                          uint8_t rtp_payload_type) override;
-
-  int RegisterExternalDecoder(AudioDecoder* decoder,
-                              NetEqDecoder codec,
-                              const std::string& codec_name,
-                              uint8_t rtp_payload_type) override;
-
-  bool RegisterPayloadType(int rtp_payload_type,
-                           const SdpAudioFormat& audio_format) override;
-
-  // Removes |rtp_payload_type| from the codec database. Returns 0 on success,
-  // -1 on failure.
-  int RemovePayloadType(uint8_t rtp_payload_type) override;
-
-  void RemoveAllPayloadTypes() override;
-
-  bool SetMinimumDelay(int delay_ms) override;
-
-  bool SetMaximumDelay(int delay_ms) override;
-
-  int LeastRequiredDelayMs() const override;
-
-  int SetTargetDelay() override;
-
-  int TargetDelayMs() override;
-
-  int CurrentDelayMs() const override;
-
-  int FilteredCurrentDelayMs() const override;
-
-  // Sets the playout mode to |mode|.
-  // Deprecated.
-  // TODO(henrik.lundin) Delete.
-  void SetPlayoutMode(NetEqPlayoutMode mode) override;
-
-  // Returns the current playout mode.
-  // Deprecated.
-  // TODO(henrik.lundin) Delete.
-  NetEqPlayoutMode PlayoutMode() const override;
-
-  // Writes the current network statistics to |stats|. The statistics are reset
-  // after the call.
-  int NetworkStatistics(NetEqNetworkStatistics* stats) override;
-
-  // Writes the current RTCP statistics to |stats|. The statistics are reset
-  // and a new report period is started with the call.
-  void GetRtcpStatistics(RtcpStatistics* stats) override;
-
-  NetEqLifetimeStatistics GetLifetimeStatistics() const override;
-
-  // Same as RtcpStatistics(), but does not reset anything.
-  void GetRtcpStatisticsNoReset(RtcpStatistics* stats) override;
-
-  // Enables post-decode VAD. When enabled, GetAudio() will return
-  // kOutputVADPassive when the signal contains no speech.
-  void EnableVad() override;
-
-  // Disables post-decode VAD.
-  void DisableVad() override;
-
-  rtc::Optional<uint32_t> GetPlayoutTimestamp() const override;
-
-  int last_output_sample_rate_hz() const override;
-
-  rtc::Optional<CodecInst> GetDecoder(int payload_type) const override;
-
-  rtc::Optional<SdpAudioFormat> GetDecoderFormat(
-      int payload_type) const override;
-
-  int SetTargetNumberOfChannels() override;
-
-  int SetTargetSampleRate() override;
-
-  // Flushes both the packet buffer and the sync buffer.
-  void FlushBuffers() override;
-
-  void PacketBufferStatistics(int* current_num_packets,
-                              int* max_num_packets) const override;
-
-  void EnableNack(size_t max_nack_list_size) override;
-
-  void DisableNack() override;
-
-  std::vector<uint16_t> GetNackList(int64_t round_trip_time_ms) const override;
-
-  std::vector<uint32_t> LastDecodedTimestamps() const override;
-
-  int SyncBufferSizeMs() const override;
-
-  // This accessor method is only intended for testing purposes.
-  const SyncBuffer* sync_buffer_for_test() const;
-  Operations last_operation_for_test() const;
-
- protected:
-  static const int kOutputSizeMs = 10;
-  static const size_t kMaxFrameSize = 5760;  // 120 ms @ 48 kHz.
-  // TODO(hlundin): Provide a better value for kSyncBufferSize.
-  // Current value is kMaxFrameSize + 60 ms * 48 kHz, which is enough for
-  // calculating correlations of current frame against history.
-  static const size_t kSyncBufferSize = kMaxFrameSize + 60 * 48;
-
-  // Inserts a new packet into NetEq. This is used by the InsertPacket method
-  // above. Returns 0 on success, otherwise an error code.
-  // TODO(hlundin): Merge this with InsertPacket above?
-  int InsertPacketInternal(const RTPHeader& rtp_header,
-                           rtc::ArrayView<const uint8_t> payload,
-                           uint32_t receive_timestamp)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_sect_);
-
-  // Delivers 10 ms of audio data. The data is written to |audio_frame|.
-  // Returns 0 on success, otherwise an error code.
-  int GetAudioInternal(AudioFrame* audio_frame, bool* muted)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_sect_);
-
-  // Provides a decision to the GetAudioInternal method. The decision what to
-  // do is written to |operation|. Packets to decode are written to
-  // |packet_list|, and a DTMF event to play is written to |dtmf_event|. When
-  // DTMF should be played, |play_dtmf| is set to true by the method.
-  // Returns 0 on success, otherwise an error code.
-  int GetDecision(Operations* operation,
-                  PacketList* packet_list,
-                  DtmfEvent* dtmf_event,
-                  bool* play_dtmf) RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_sect_);
-
-  // Decodes the speech packets in |packet_list|, and writes the results to
-  // |decoded_buffer|, which is allocated to hold |decoded_buffer_length|
-  // elements. The length of the decoded data is written to |decoded_length|.
-  // The speech type -- speech or (codec-internal) comfort noise -- is written
-  // to |speech_type|. If |packet_list| contains any SID frames for RFC 3389
-  // comfort noise, those are not decoded.
-  int Decode(PacketList* packet_list,
-             Operations* operation,
-             int* decoded_length,
-             AudioDecoder::SpeechType* speech_type)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_sect_);
-
-  // Sub-method to Decode(). Performs codec internal CNG.
-  int DecodeCng(AudioDecoder* decoder,
-                int* decoded_length,
-                AudioDecoder::SpeechType* speech_type)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_sect_);
-
-  // Sub-method to Decode(). Performs the actual decoding.
-  int DecodeLoop(PacketList* packet_list,
-                 const Operations& operation,
-                 AudioDecoder* decoder,
-                 int* decoded_length,
-                 AudioDecoder::SpeechType* speech_type)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_sect_);
-
-  // Sub-method which calls the Normal class to perform the normal operation.
-  void DoNormal(const int16_t* decoded_buffer,
-                size_t decoded_length,
-                AudioDecoder::SpeechType speech_type,
-                bool play_dtmf) RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_sect_);
-
-  // Sub-method which calls the Merge class to perform the merge operation.
-  void DoMerge(int16_t* decoded_buffer,
-               size_t decoded_length,
-               AudioDecoder::SpeechType speech_type,
-               bool play_dtmf) RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_sect_);
-
-  // Sub-method which calls the Expand class to perform the expand operation.
-  int DoExpand(bool play_dtmf) RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_sect_);
-
-  // Sub-method which calls the Accelerate class to perform the accelerate
-  // operation.
-  int DoAccelerate(int16_t* decoded_buffer,
-                   size_t decoded_length,
-                   AudioDecoder::SpeechType speech_type,
-                   bool play_dtmf,
-                   bool fast_accelerate)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_sect_);
-
-  // Sub-method which calls the PreemptiveExpand class to perform the
-  // preemtive expand operation.
-  int DoPreemptiveExpand(int16_t* decoded_buffer,
-                         size_t decoded_length,
-                         AudioDecoder::SpeechType speech_type,
-                         bool play_dtmf)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_sect_);
-
-  // Sub-method which calls the ComfortNoise class to generate RFC 3389 comfort
-  // noise. |packet_list| can either contain one SID frame to update the
-  // noise parameters, or no payload at all, in which case the previously
-  // received parameters are used.
-  int DoRfc3389Cng(PacketList* packet_list, bool play_dtmf)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_sect_);
-
-  // Calls the audio decoder to generate codec-internal comfort noise when
-  // no packet was received.
-  void DoCodecInternalCng(const int16_t* decoded_buffer, size_t decoded_length)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_sect_);
-
-  // Calls the DtmfToneGenerator class to generate DTMF tones.
-  int DoDtmf(const DtmfEvent& dtmf_event, bool* play_dtmf)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_sect_);
-
-  // Produces packet-loss concealment using alternative methods. If the codec
-  // has an internal PLC, it is called to generate samples. Otherwise, the
-  // method performs zero-stuffing.
-  void DoAlternativePlc(bool increase_timestamp)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_sect_);
-
-  // Overdub DTMF on top of |output|.
-  int DtmfOverdub(const DtmfEvent& dtmf_event,
-                  size_t num_channels,
-                  int16_t* output) const
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_sect_);
-
-  // Extracts packets from |packet_buffer_| to produce at least
-  // |required_samples| samples. The packets are inserted into |packet_list|.
-  // Returns the number of samples that the packets in the list will produce, or
-  // -1 in case of an error.
-  int ExtractPackets(size_t required_samples, PacketList* packet_list)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_sect_);
-
-  // Resets various variables and objects to new values based on the sample rate
-  // |fs_hz| and |channels| number audio channels.
-  void SetSampleRateAndChannels(int fs_hz, size_t channels)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_sect_);
-
-  // Returns the output type for the audio produced by the latest call to
-  // GetAudio().
-  OutputType LastOutputType() RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_sect_);
-
-  // Updates Expand and Merge.
-  virtual void UpdatePlcComponents(int fs_hz, size_t channels)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_sect_);
-
-  // Creates DecisionLogic object with the mode given by |playout_mode_|.
-  virtual void CreateDecisionLogic() RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_sect_);
-
-  rtc::CriticalSection crit_sect_;
-  const std::unique_ptr<TickTimer> tick_timer_ RTC_GUARDED_BY(crit_sect_);
-  const std::unique_ptr<BufferLevelFilter> buffer_level_filter_
-      RTC_GUARDED_BY(crit_sect_);
-  const std::unique_ptr<DecoderDatabase> decoder_database_
-      RTC_GUARDED_BY(crit_sect_);
-  const std::unique_ptr<DelayManager> delay_manager_ RTC_GUARDED_BY(crit_sect_);
-  const std::unique_ptr<DelayPeakDetector> delay_peak_detector_
-      RTC_GUARDED_BY(crit_sect_);
-  const std::unique_ptr<DtmfBuffer> dtmf_buffer_ RTC_GUARDED_BY(crit_sect_);
-  const std::unique_ptr<DtmfToneGenerator> dtmf_tone_generator_
-      RTC_GUARDED_BY(crit_sect_);
-  const std::unique_ptr<PacketBuffer> packet_buffer_ RTC_GUARDED_BY(crit_sect_);
-  const std::unique_ptr<RedPayloadSplitter> red_payload_splitter_
-      RTC_GUARDED_BY(crit_sect_);
-  const std::unique_ptr<TimestampScaler> timestamp_scaler_
-      RTC_GUARDED_BY(crit_sect_);
-  const std::unique_ptr<PostDecodeVad> vad_ RTC_GUARDED_BY(crit_sect_);
-  const std::unique_ptr<ExpandFactory> expand_factory_
-      RTC_GUARDED_BY(crit_sect_);
-  const std::unique_ptr<AccelerateFactory> accelerate_factory_
-      RTC_GUARDED_BY(crit_sect_);
-  const std::unique_ptr<PreemptiveExpandFactory> preemptive_expand_factory_
-      RTC_GUARDED_BY(crit_sect_);
-
-  std::unique_ptr<BackgroundNoise> background_noise_ RTC_GUARDED_BY(crit_sect_);
-  std::unique_ptr<DecisionLogic> decision_logic_ RTC_GUARDED_BY(crit_sect_);
-  std::unique_ptr<AudioMultiVector> algorithm_buffer_
-      RTC_GUARDED_BY(crit_sect_);
-  std::unique_ptr<SyncBuffer> sync_buffer_ RTC_GUARDED_BY(crit_sect_);
-  std::unique_ptr<Expand> expand_ RTC_GUARDED_BY(crit_sect_);
-  std::unique_ptr<Normal> normal_ RTC_GUARDED_BY(crit_sect_);
-  std::unique_ptr<Merge> merge_ RTC_GUARDED_BY(crit_sect_);
-  std::unique_ptr<Accelerate> accelerate_ RTC_GUARDED_BY(crit_sect_);
-  std::unique_ptr<PreemptiveExpand> preemptive_expand_
-      RTC_GUARDED_BY(crit_sect_);
-  RandomVector random_vector_ RTC_GUARDED_BY(crit_sect_);
-  std::unique_ptr<ComfortNoise> comfort_noise_ RTC_GUARDED_BY(crit_sect_);
-  Rtcp rtcp_ RTC_GUARDED_BY(crit_sect_);
-  StatisticsCalculator stats_ RTC_GUARDED_BY(crit_sect_);
-  int fs_hz_ RTC_GUARDED_BY(crit_sect_);
-  int fs_mult_ RTC_GUARDED_BY(crit_sect_);
-  int last_output_sample_rate_hz_ RTC_GUARDED_BY(crit_sect_);
-  size_t output_size_samples_ RTC_GUARDED_BY(crit_sect_);
-  size_t decoder_frame_length_ RTC_GUARDED_BY(crit_sect_);
-  Modes last_mode_ RTC_GUARDED_BY(crit_sect_);
-  Operations last_operation_ RTC_GUARDED_BY(crit_sect_);
-  std::unique_ptr<int16_t[]> mute_factor_array_ RTC_GUARDED_BY(crit_sect_);
-  size_t decoded_buffer_length_ RTC_GUARDED_BY(crit_sect_);
-  std::unique_ptr<int16_t[]> decoded_buffer_ RTC_GUARDED_BY(crit_sect_);
-  uint32_t playout_timestamp_ RTC_GUARDED_BY(crit_sect_);
-  bool new_codec_ RTC_GUARDED_BY(crit_sect_);
-  uint32_t timestamp_ RTC_GUARDED_BY(crit_sect_);
-  bool reset_decoder_ RTC_GUARDED_BY(crit_sect_);
-  rtc::Optional<uint8_t> current_rtp_payload_type_ RTC_GUARDED_BY(crit_sect_);
-  rtc::Optional<uint8_t> current_cng_rtp_payload_type_
-      RTC_GUARDED_BY(crit_sect_);
-  uint32_t ssrc_ RTC_GUARDED_BY(crit_sect_);
-  bool first_packet_ RTC_GUARDED_BY(crit_sect_);
-  const BackgroundNoiseMode background_noise_mode_ RTC_GUARDED_BY(crit_sect_);
-  NetEqPlayoutMode playout_mode_ RTC_GUARDED_BY(crit_sect_);
-  bool enable_fast_accelerate_ RTC_GUARDED_BY(crit_sect_);
-  std::unique_ptr<NackTracker> nack_ RTC_GUARDED_BY(crit_sect_);
-  bool nack_enabled_ RTC_GUARDED_BY(crit_sect_);
-  const bool enable_muted_state_ RTC_GUARDED_BY(crit_sect_);
-  AudioFrame::VADActivity last_vad_activity_ RTC_GUARDED_BY(crit_sect_) =
-      AudioFrame::kVadPassive;
-  std::unique_ptr<TickTimer::Stopwatch> generated_noise_stopwatch_
-      RTC_GUARDED_BY(crit_sect_);
-  std::vector<uint32_t> last_decoded_timestamps_ RTC_GUARDED_BY(crit_sect_);
-
- private:
-  RTC_DISALLOW_COPY_AND_ASSIGN(NetEqImpl);
-};
-
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_AUDIO_CODING_NETEQ_NETEQ_IMPL_H_
diff --git a/modules/audio_coding/neteq/neteq_impl_unittest.cc b/modules/audio_coding/neteq/neteq_impl_unittest.cc
deleted file mode 100644
index fafc2df..0000000
--- a/modules/audio_coding/neteq/neteq_impl_unittest.cc
+++ /dev/null
@@ -1,1520 +0,0 @@
-/*
- *  Copyright (c) 2012 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 <memory>
-
-#include "webrtc/api/audio_codecs/builtin_audio_decoder_factory.h"
-#include "webrtc/common_types.h"
-#include "webrtc/modules/audio_coding/neteq/accelerate.h"
-#include "webrtc/modules/audio_coding/neteq/expand.h"
-#include "webrtc/modules/audio_coding/neteq/include/neteq.h"
-#include "webrtc/modules/audio_coding/neteq/mock/mock_buffer_level_filter.h"
-#include "webrtc/modules/audio_coding/neteq/mock/mock_decoder_database.h"
-#include "webrtc/modules/audio_coding/neteq/mock/mock_delay_manager.h"
-#include "webrtc/modules/audio_coding/neteq/mock/mock_delay_peak_detector.h"
-#include "webrtc/modules/audio_coding/neteq/mock/mock_dtmf_buffer.h"
-#include "webrtc/modules/audio_coding/neteq/mock/mock_dtmf_tone_generator.h"
-#include "webrtc/modules/audio_coding/neteq/mock/mock_packet_buffer.h"
-#include "webrtc/modules/audio_coding/neteq/mock/mock_red_payload_splitter.h"
-#include "webrtc/modules/audio_coding/neteq/neteq_impl.h"
-#include "webrtc/modules/audio_coding/neteq/preemptive_expand.h"
-#include "webrtc/modules/audio_coding/neteq/sync_buffer.h"
-#include "webrtc/modules/audio_coding/neteq/timestamp_scaler.h"
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/rtc_base/safe_conversions.h"
-#include "webrtc/test/gmock.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/mock_audio_decoder.h"
-#include "webrtc/test/mock_audio_decoder_factory.h"
-
-using ::testing::AtLeast;
-using ::testing::Return;
-using ::testing::ReturnNull;
-using ::testing::_;
-using ::testing::SetArgPointee;
-using ::testing::SetArrayArgument;
-using ::testing::InSequence;
-using ::testing::Invoke;
-using ::testing::WithArg;
-using ::testing::Pointee;
-using ::testing::IsNull;
-
-namespace webrtc {
-
-// This function is called when inserting a packet list into the mock packet
-// buffer. The purpose is to delete all inserted packets properly, to avoid
-// memory leaks in the test.
-int DeletePacketsAndReturnOk(PacketList* packet_list) {
-  packet_list->clear();
-  return PacketBuffer::kOK;
-}
-
-class NetEqImplTest : public ::testing::Test {
- protected:
-  NetEqImplTest() { config_.sample_rate_hz = 8000; }
-
-  void CreateInstance() {
-    NetEqImpl::Dependencies deps(config_, CreateBuiltinAudioDecoderFactory());
-
-    // Get a local pointer to NetEq's TickTimer object.
-    tick_timer_ = deps.tick_timer.get();
-
-    if (use_mock_buffer_level_filter_) {
-      std::unique_ptr<MockBufferLevelFilter> mock(new MockBufferLevelFilter);
-      mock_buffer_level_filter_ = mock.get();
-      deps.buffer_level_filter = std::move(mock);
-    }
-    buffer_level_filter_ = deps.buffer_level_filter.get();
-
-    if (use_mock_decoder_database_) {
-      std::unique_ptr<MockDecoderDatabase> mock(new MockDecoderDatabase);
-      mock_decoder_database_ = mock.get();
-      EXPECT_CALL(*mock_decoder_database_, GetActiveCngDecoder())
-          .WillOnce(ReturnNull());
-      deps.decoder_database = std::move(mock);
-    }
-    decoder_database_ = deps.decoder_database.get();
-
-    if (use_mock_delay_peak_detector_) {
-      std::unique_ptr<MockDelayPeakDetector> mock(
-          new MockDelayPeakDetector(tick_timer_));
-      mock_delay_peak_detector_ = mock.get();
-      EXPECT_CALL(*mock_delay_peak_detector_, Reset()).Times(1);
-      deps.delay_peak_detector = std::move(mock);
-    }
-    delay_peak_detector_ = deps.delay_peak_detector.get();
-
-    if (use_mock_delay_manager_) {
-      std::unique_ptr<MockDelayManager> mock(new MockDelayManager(
-          config_.max_packets_in_buffer, delay_peak_detector_, tick_timer_));
-      mock_delay_manager_ = mock.get();
-      EXPECT_CALL(*mock_delay_manager_, set_streaming_mode(false)).Times(1);
-      deps.delay_manager = std::move(mock);
-    }
-    delay_manager_ = deps.delay_manager.get();
-
-    if (use_mock_dtmf_buffer_) {
-      std::unique_ptr<MockDtmfBuffer> mock(
-          new MockDtmfBuffer(config_.sample_rate_hz));
-      mock_dtmf_buffer_ = mock.get();
-      deps.dtmf_buffer = std::move(mock);
-    }
-    dtmf_buffer_ = deps.dtmf_buffer.get();
-
-    if (use_mock_dtmf_tone_generator_) {
-      std::unique_ptr<MockDtmfToneGenerator> mock(new MockDtmfToneGenerator);
-      mock_dtmf_tone_generator_ = mock.get();
-      deps.dtmf_tone_generator = std::move(mock);
-    }
-    dtmf_tone_generator_ = deps.dtmf_tone_generator.get();
-
-    if (use_mock_packet_buffer_) {
-      std::unique_ptr<MockPacketBuffer> mock(
-          new MockPacketBuffer(config_.max_packets_in_buffer, tick_timer_));
-      mock_packet_buffer_ = mock.get();
-      deps.packet_buffer = std::move(mock);
-    }
-    packet_buffer_ = deps.packet_buffer.get();
-
-    if (use_mock_payload_splitter_) {
-      std::unique_ptr<MockRedPayloadSplitter> mock(new MockRedPayloadSplitter);
-      mock_payload_splitter_ = mock.get();
-      deps.red_payload_splitter = std::move(mock);
-    }
-    red_payload_splitter_ = deps.red_payload_splitter.get();
-
-    deps.timestamp_scaler = std::unique_ptr<TimestampScaler>(
-        new TimestampScaler(*deps.decoder_database.get()));
-
-    neteq_.reset(new NetEqImpl(config_, std::move(deps)));
-    ASSERT_TRUE(neteq_ != NULL);
-  }
-
-  void UseNoMocks() {
-    ASSERT_TRUE(neteq_ == NULL) << "Must call UseNoMocks before CreateInstance";
-    use_mock_buffer_level_filter_ = false;
-    use_mock_decoder_database_ = false;
-    use_mock_delay_peak_detector_ = false;
-    use_mock_delay_manager_ = false;
-    use_mock_dtmf_buffer_ = false;
-    use_mock_dtmf_tone_generator_ = false;
-    use_mock_packet_buffer_ = false;
-    use_mock_payload_splitter_ = false;
-  }
-
-  virtual ~NetEqImplTest() {
-    if (use_mock_buffer_level_filter_) {
-      EXPECT_CALL(*mock_buffer_level_filter_, Die()).Times(1);
-    }
-    if (use_mock_decoder_database_) {
-      EXPECT_CALL(*mock_decoder_database_, Die()).Times(1);
-    }
-    if (use_mock_delay_manager_) {
-      EXPECT_CALL(*mock_delay_manager_, Die()).Times(1);
-    }
-    if (use_mock_delay_peak_detector_) {
-      EXPECT_CALL(*mock_delay_peak_detector_, Die()).Times(1);
-    }
-    if (use_mock_dtmf_buffer_) {
-      EXPECT_CALL(*mock_dtmf_buffer_, Die()).Times(1);
-    }
-    if (use_mock_dtmf_tone_generator_) {
-      EXPECT_CALL(*mock_dtmf_tone_generator_, Die()).Times(1);
-    }
-    if (use_mock_packet_buffer_) {
-      EXPECT_CALL(*mock_packet_buffer_, Die()).Times(1);
-    }
-  }
-
-  void TestDtmfPacket(NetEqDecoder decoder_type) {
-    const size_t kPayloadLength = 4;
-    const uint8_t kPayloadType = 110;
-    const uint32_t kReceiveTime = 17;
-    const int kSampleRateHz = 16000;
-    config_.sample_rate_hz = kSampleRateHz;
-    UseNoMocks();
-    CreateInstance();
-    // Event: 2, E bit, Volume: 17, Length: 4336.
-    uint8_t payload[kPayloadLength] = { 0x02, 0x80 + 0x11, 0x10, 0xF0 };
-    RTPHeader rtp_header;
-    rtp_header.payloadType = kPayloadType;
-    rtp_header.sequenceNumber = 0x1234;
-    rtp_header.timestamp = 0x12345678;
-    rtp_header.ssrc = 0x87654321;
-
-    EXPECT_EQ(NetEq::kOK, neteq_->RegisterPayloadType(
-        decoder_type, "telephone-event", kPayloadType));
-
-    // Insert first packet.
-    EXPECT_EQ(NetEq::kOK,
-              neteq_->InsertPacket(rtp_header, payload, kReceiveTime));
-
-    // Pull audio once.
-    const size_t kMaxOutputSize =
-        static_cast<size_t>(10 * kSampleRateHz / 1000);
-    AudioFrame output;
-    bool muted;
-    EXPECT_EQ(NetEq::kOK, neteq_->GetAudio(&output, &muted));
-    ASSERT_FALSE(muted);
-    ASSERT_EQ(kMaxOutputSize, output.samples_per_channel_);
-    EXPECT_EQ(1u, output.num_channels_);
-    EXPECT_EQ(AudioFrame::kNormalSpeech, output.speech_type_);
-
-    // Verify first 64 samples of actual output.
-    const std::vector<int16_t> kOutput({
-        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1578, -2816, -3460, -3403, -2709, -1594,
-        -363, 671, 1269, 1328, 908, 202, -513, -964, -955, -431, 504, 1617,
-        2602, 3164, 3101, 2364, 1073, -511, -2047, -3198, -3721, -3525, -2688,
-        -1440, -99, 1015, 1663, 1744, 1319, 588, -171, -680, -747, -315, 515,
-        1512, 2378, 2828, 2674, 1877, 568, -986, -2446, -3482, -3864, -3516,
-        -2534, -1163 });
-    ASSERT_GE(kMaxOutputSize, kOutput.size());
-    EXPECT_TRUE(std::equal(kOutput.begin(), kOutput.end(), output.data()));
-  }
-
-  std::unique_ptr<NetEqImpl> neteq_;
-  NetEq::Config config_;
-  TickTimer* tick_timer_ = nullptr;
-  MockBufferLevelFilter* mock_buffer_level_filter_ = nullptr;
-  BufferLevelFilter* buffer_level_filter_ = nullptr;
-  bool use_mock_buffer_level_filter_ = true;
-  MockDecoderDatabase* mock_decoder_database_ = nullptr;
-  DecoderDatabase* decoder_database_ = nullptr;
-  bool use_mock_decoder_database_ = true;
-  MockDelayPeakDetector* mock_delay_peak_detector_ = nullptr;
-  DelayPeakDetector* delay_peak_detector_ = nullptr;
-  bool use_mock_delay_peak_detector_ = true;
-  MockDelayManager* mock_delay_manager_ = nullptr;
-  DelayManager* delay_manager_ = nullptr;
-  bool use_mock_delay_manager_ = true;
-  MockDtmfBuffer* mock_dtmf_buffer_ = nullptr;
-  DtmfBuffer* dtmf_buffer_ = nullptr;
-  bool use_mock_dtmf_buffer_ = true;
-  MockDtmfToneGenerator* mock_dtmf_tone_generator_ = nullptr;
-  DtmfToneGenerator* dtmf_tone_generator_ = nullptr;
-  bool use_mock_dtmf_tone_generator_ = true;
-  MockPacketBuffer* mock_packet_buffer_ = nullptr;
-  PacketBuffer* packet_buffer_ = nullptr;
-  bool use_mock_packet_buffer_ = true;
-  MockRedPayloadSplitter* mock_payload_splitter_ = nullptr;
-  RedPayloadSplitter* red_payload_splitter_ = nullptr;
-  bool use_mock_payload_splitter_ = true;
-};
-
-
-// This tests the interface class NetEq.
-// TODO(hlundin): Move to separate file?
-TEST(NetEq, CreateAndDestroy) {
-  NetEq::Config config;
-  NetEq* neteq = NetEq::Create(config, CreateBuiltinAudioDecoderFactory());
-  delete neteq;
-}
-
-TEST_F(NetEqImplTest, RegisterPayloadTypeNetEqDecoder) {
-  CreateInstance();
-  uint8_t rtp_payload_type = 0;
-  NetEqDecoder codec_type = NetEqDecoder::kDecoderPCMu;
-  const std::string kCodecName = "Robert\'); DROP TABLE Students;";
-  EXPECT_CALL(*mock_decoder_database_,
-              RegisterPayload(rtp_payload_type, codec_type, kCodecName));
-  neteq_->RegisterPayloadType(codec_type, kCodecName, rtp_payload_type);
-}
-
-TEST_F(NetEqImplTest, RegisterPayloadType) {
-  CreateInstance();
-  constexpr int rtp_payload_type = 0;
-  const SdpAudioFormat format("pcmu", 8000, 1);
-  EXPECT_CALL(*mock_decoder_database_,
-              RegisterPayload(rtp_payload_type, format));
-  neteq_->RegisterPayloadType(rtp_payload_type, format);
-}
-
-TEST_F(NetEqImplTest, RemovePayloadType) {
-  CreateInstance();
-  uint8_t rtp_payload_type = 0;
-  EXPECT_CALL(*mock_decoder_database_, Remove(rtp_payload_type))
-      .WillOnce(Return(DecoderDatabase::kDecoderNotFound));
-  // Check that kOK is returned when database returns kDecoderNotFound, because
-  // removing a payload type that was never registered is not an error.
-  EXPECT_EQ(NetEq::kOK, neteq_->RemovePayloadType(rtp_payload_type));
-}
-
-TEST_F(NetEqImplTest, RemoveAllPayloadTypes) {
-  CreateInstance();
-  EXPECT_CALL(*mock_decoder_database_, RemoveAll()).WillOnce(Return());
-  neteq_->RemoveAllPayloadTypes();
-}
-
-TEST_F(NetEqImplTest, InsertPacket) {
-  CreateInstance();
-  const size_t kPayloadLength = 100;
-  const uint8_t kPayloadType = 0;
-  const uint16_t kFirstSequenceNumber = 0x1234;
-  const uint32_t kFirstTimestamp = 0x12345678;
-  const uint32_t kSsrc = 0x87654321;
-  const uint32_t kFirstReceiveTime = 17;
-  uint8_t payload[kPayloadLength] = {0};
-  RTPHeader rtp_header;
-  rtp_header.payloadType = kPayloadType;
-  rtp_header.sequenceNumber = kFirstSequenceNumber;
-  rtp_header.timestamp = kFirstTimestamp;
-  rtp_header.ssrc = kSsrc;
-  Packet fake_packet;
-  fake_packet.payload_type = kPayloadType;
-  fake_packet.sequence_number = kFirstSequenceNumber;
-  fake_packet.timestamp = kFirstTimestamp;
-
-  rtc::scoped_refptr<MockAudioDecoderFactory> mock_decoder_factory(
-      new rtc::RefCountedObject<MockAudioDecoderFactory>);
-  EXPECT_CALL(*mock_decoder_factory, MakeAudioDecoderMock(_, _))
-      .WillOnce(Invoke([&](const SdpAudioFormat& format,
-                           std::unique_ptr<AudioDecoder>* dec) {
-        EXPECT_EQ("pcmu", format.name);
-
-        std::unique_ptr<MockAudioDecoder> mock_decoder(new MockAudioDecoder);
-        EXPECT_CALL(*mock_decoder, Channels()).WillRepeatedly(Return(1));
-        EXPECT_CALL(*mock_decoder, SampleRateHz()).WillRepeatedly(Return(8000));
-        // BWE update function called with first packet.
-        EXPECT_CALL(*mock_decoder,
-                    IncomingPacket(_, kPayloadLength, kFirstSequenceNumber,
-                                   kFirstTimestamp, kFirstReceiveTime));
-        // BWE update function called with second packet.
-        EXPECT_CALL(
-            *mock_decoder,
-            IncomingPacket(_, kPayloadLength, kFirstSequenceNumber + 1,
-                           kFirstTimestamp + 160, kFirstReceiveTime + 155));
-        EXPECT_CALL(*mock_decoder, Die()).Times(1);  // Called when deleted.
-
-        *dec = std::move(mock_decoder);
-      }));
-  DecoderDatabase::DecoderInfo info(NetEqDecoder::kDecoderPCMu,
-                                    mock_decoder_factory);
-
-  // Expectations for decoder database.
-  EXPECT_CALL(*mock_decoder_database_, GetDecoderInfo(kPayloadType))
-      .WillRepeatedly(Return(&info));
-
-  // Expectations for packet buffer.
-  EXPECT_CALL(*mock_packet_buffer_, NumPacketsInBuffer())
-      .WillOnce(Return(0))   // First packet.
-      .WillOnce(Return(1))   // Second packet.
-      .WillOnce(Return(2));  // Second packet, checking after it was inserted.
-  EXPECT_CALL(*mock_packet_buffer_, Empty())
-      .WillOnce(Return(false));  // Called once after first packet is inserted.
-  EXPECT_CALL(*mock_packet_buffer_, Flush())
-      .Times(1);
-  EXPECT_CALL(*mock_packet_buffer_, InsertPacketList(_, _, _, _, _))
-      .Times(2)
-      .WillRepeatedly(
-          DoAll(SetArgPointee<2>(rtc::Optional<uint8_t>(kPayloadType)),
-                WithArg<0>(Invoke(DeletePacketsAndReturnOk))));
-  // SetArgPointee<2>(kPayloadType) means that the third argument (zero-based
-  // index) is a pointer, and the variable pointed to is set to kPayloadType.
-  // Also invoke the function DeletePacketsAndReturnOk to properly delete all
-  // packets in the list (to avoid memory leaks in the test).
-  EXPECT_CALL(*mock_packet_buffer_, PeekNextPacket())
-      .Times(1)
-      .WillOnce(Return(&fake_packet));
-
-  // Expectations for DTMF buffer.
-  EXPECT_CALL(*mock_dtmf_buffer_, Flush())
-      .Times(1);
-
-  // Expectations for delay manager.
-  {
-    // All expectations within this block must be called in this specific order.
-    InSequence sequence;  // Dummy variable.
-    // Expectations when the first packet is inserted.
-    EXPECT_CALL(*mock_delay_manager_, last_pack_cng_or_dtmf())
-        .Times(2)
-        .WillRepeatedly(Return(-1));
-    EXPECT_CALL(*mock_delay_manager_, set_last_pack_cng_or_dtmf(0))
-        .Times(1);
-    EXPECT_CALL(*mock_delay_manager_, ResetPacketIatCount()).Times(1);
-    // Expectations when the second packet is inserted. Slightly different.
-    EXPECT_CALL(*mock_delay_manager_, last_pack_cng_or_dtmf())
-        .WillOnce(Return(0));
-    EXPECT_CALL(*mock_delay_manager_, SetPacketAudioLength(30))
-        .WillOnce(Return(0));
-  }
-
-  // Insert first packet.
-  neteq_->InsertPacket(rtp_header, payload, kFirstReceiveTime);
-
-  // Insert second packet.
-  rtp_header.timestamp += 160;
-  rtp_header.sequenceNumber += 1;
-  neteq_->InsertPacket(rtp_header, payload, kFirstReceiveTime + 155);
-}
-
-TEST_F(NetEqImplTest, InsertPacketsUntilBufferIsFull) {
-  UseNoMocks();
-  CreateInstance();
-
-  const int kPayloadLengthSamples = 80;
-  const size_t kPayloadLengthBytes = 2 * kPayloadLengthSamples;  // PCM 16-bit.
-  const uint8_t kPayloadType = 17;  // Just an arbitrary number.
-  const uint32_t kReceiveTime = 17;  // Value doesn't matter for this test.
-  uint8_t payload[kPayloadLengthBytes] = {0};
-  RTPHeader rtp_header;
-  rtp_header.payloadType = kPayloadType;
-  rtp_header.sequenceNumber = 0x1234;
-  rtp_header.timestamp = 0x12345678;
-  rtp_header.ssrc = 0x87654321;
-
-  EXPECT_EQ(NetEq::kOK, neteq_->RegisterPayloadType(
-                            NetEqDecoder::kDecoderPCM16B, "", kPayloadType));
-
-  // Insert packets. The buffer should not flush.
-  for (size_t i = 1; i <= config_.max_packets_in_buffer; ++i) {
-    EXPECT_EQ(NetEq::kOK,
-              neteq_->InsertPacket(rtp_header, payload, kReceiveTime));
-    rtp_header.timestamp += kPayloadLengthSamples;
-    rtp_header.sequenceNumber += 1;
-    EXPECT_EQ(i, packet_buffer_->NumPacketsInBuffer());
-  }
-
-  // Insert one more packet and make sure the buffer got flushed. That is, it
-  // should only hold one single packet.
-  EXPECT_EQ(NetEq::kOK,
-            neteq_->InsertPacket(rtp_header, payload, kReceiveTime));
-  EXPECT_EQ(1u, packet_buffer_->NumPacketsInBuffer());
-  const Packet* test_packet = packet_buffer_->PeekNextPacket();
-  EXPECT_EQ(rtp_header.timestamp, test_packet->timestamp);
-  EXPECT_EQ(rtp_header.sequenceNumber, test_packet->sequence_number);
-}
-
-TEST_F(NetEqImplTest, TestDtmfPacketAVT) {
-  TestDtmfPacket(NetEqDecoder::kDecoderAVT);
-}
-
-TEST_F(NetEqImplTest, TestDtmfPacketAVT16kHz) {
-  TestDtmfPacket(NetEqDecoder::kDecoderAVT16kHz);
-}
-
-TEST_F(NetEqImplTest, TestDtmfPacketAVT32kHz) {
-  TestDtmfPacket(NetEqDecoder::kDecoderAVT32kHz);
-}
-
-TEST_F(NetEqImplTest, TestDtmfPacketAVT48kHz) {
-  TestDtmfPacket(NetEqDecoder::kDecoderAVT48kHz);
-}
-
-// This test verifies that timestamps propagate from the incoming packets
-// through to the sync buffer and to the playout timestamp.
-TEST_F(NetEqImplTest, VerifyTimestampPropagation) {
-  UseNoMocks();
-  CreateInstance();
-
-  const uint8_t kPayloadType = 17;   // Just an arbitrary number.
-  const uint32_t kReceiveTime = 17;  // Value doesn't matter for this test.
-  const int kSampleRateHz = 8000;
-  const size_t kPayloadLengthSamples =
-      static_cast<size_t>(10 * kSampleRateHz / 1000);  // 10 ms.
-  const size_t kPayloadLengthBytes = kPayloadLengthSamples;
-  uint8_t payload[kPayloadLengthBytes] = {0};
-  RTPHeader rtp_header;
-  rtp_header.payloadType = kPayloadType;
-  rtp_header.sequenceNumber = 0x1234;
-  rtp_header.timestamp = 0x12345678;
-  rtp_header.ssrc = 0x87654321;
-
-  // This is a dummy decoder that produces as many output samples as the input
-  // has bytes. The output is an increasing series, starting at 1 for the first
-  // sample, and then increasing by 1 for each sample.
-  class CountingSamplesDecoder : public AudioDecoder {
-   public:
-    CountingSamplesDecoder() : next_value_(1) {}
-
-    // Produce as many samples as input bytes (|encoded_len|).
-    int DecodeInternal(const uint8_t* encoded,
-                       size_t encoded_len,
-                       int /* sample_rate_hz */,
-                       int16_t* decoded,
-                       SpeechType* speech_type) override {
-      for (size_t i = 0; i < encoded_len; ++i) {
-        decoded[i] = next_value_++;
-      }
-      *speech_type = kSpeech;
-      return encoded_len;
-    }
-
-    void Reset() override { next_value_ = 1; }
-
-    int SampleRateHz() const override { return kSampleRateHz; }
-
-    size_t Channels() const override { return 1; }
-
-    uint16_t next_value() const { return next_value_; }
-
-   private:
-    int16_t next_value_;
-  } decoder_;
-
-  EXPECT_EQ(NetEq::kOK, neteq_->RegisterExternalDecoder(
-                            &decoder_, NetEqDecoder::kDecoderPCM16B,
-                            "dummy name", kPayloadType));
-
-  // Insert one packet.
-  EXPECT_EQ(NetEq::kOK,
-            neteq_->InsertPacket(rtp_header, payload, kReceiveTime));
-
-  // Pull audio once.
-  const size_t kMaxOutputSize = static_cast<size_t>(10 * kSampleRateHz / 1000);
-  AudioFrame output;
-  bool muted;
-  EXPECT_EQ(NetEq::kOK, neteq_->GetAudio(&output, &muted));
-  ASSERT_FALSE(muted);
-  ASSERT_EQ(kMaxOutputSize, output.samples_per_channel_);
-  EXPECT_EQ(1u, output.num_channels_);
-  EXPECT_EQ(AudioFrame::kNormalSpeech, output.speech_type_);
-
-  // Start with a simple check that the fake decoder is behaving as expected.
-  EXPECT_EQ(kPayloadLengthSamples,
-            static_cast<size_t>(decoder_.next_value() - 1));
-
-  // The value of the last of the output samples is the same as the number of
-  // samples played from the decoded packet. Thus, this number + the RTP
-  // timestamp should match the playout timestamp.
-  // Wrap the expected value in an rtc::Optional to compare them as such.
-  EXPECT_EQ(
-      rtc::Optional<uint32_t>(rtp_header.timestamp +
-                              output.data()[output.samples_per_channel_ - 1]),
-      neteq_->GetPlayoutTimestamp());
-
-  // Check the timestamp for the last value in the sync buffer. This should
-  // be one full frame length ahead of the RTP timestamp.
-  const SyncBuffer* sync_buffer = neteq_->sync_buffer_for_test();
-  ASSERT_TRUE(sync_buffer != NULL);
-  EXPECT_EQ(rtp_header.timestamp + kPayloadLengthSamples,
-            sync_buffer->end_timestamp());
-
-  // Check that the number of samples still to play from the sync buffer add
-  // up with what was already played out.
-  EXPECT_EQ(
-      kPayloadLengthSamples - output.data()[output.samples_per_channel_ - 1],
-      sync_buffer->FutureLength());
-}
-
-TEST_F(NetEqImplTest, ReorderedPacket) {
-  UseNoMocks();
-  CreateInstance();
-
-  const uint8_t kPayloadType = 17;   // Just an arbitrary number.
-  const uint32_t kReceiveTime = 17;  // Value doesn't matter for this test.
-  const int kSampleRateHz = 8000;
-  const size_t kPayloadLengthSamples =
-      static_cast<size_t>(10 * kSampleRateHz / 1000);  // 10 ms.
-  const size_t kPayloadLengthBytes = kPayloadLengthSamples;
-  uint8_t payload[kPayloadLengthBytes] = {0};
-  RTPHeader rtp_header;
-  rtp_header.payloadType = kPayloadType;
-  rtp_header.sequenceNumber = 0x1234;
-  rtp_header.timestamp = 0x12345678;
-  rtp_header.ssrc = 0x87654321;
-
-  // Create a mock decoder object.
-  MockAudioDecoder mock_decoder;
-  EXPECT_CALL(mock_decoder, Reset()).WillRepeatedly(Return());
-  EXPECT_CALL(mock_decoder, SampleRateHz())
-      .WillRepeatedly(Return(kSampleRateHz));
-  EXPECT_CALL(mock_decoder, Channels()).WillRepeatedly(Return(1));
-  EXPECT_CALL(mock_decoder, IncomingPacket(_, kPayloadLengthBytes, _, _, _))
-      .WillRepeatedly(Return(0));
-  EXPECT_CALL(mock_decoder, PacketDuration(_, kPayloadLengthBytes))
-      .WillRepeatedly(Return(kPayloadLengthSamples));
-  int16_t dummy_output[kPayloadLengthSamples] = {0};
-  // The below expectation will make the mock decoder write
-  // |kPayloadLengthSamples| zeros to the output array, and mark it as speech.
-  EXPECT_CALL(mock_decoder, DecodeInternal(Pointee(0), kPayloadLengthBytes,
-                                           kSampleRateHz, _, _))
-      .WillOnce(DoAll(SetArrayArgument<3>(dummy_output,
-                                          dummy_output + kPayloadLengthSamples),
-                      SetArgPointee<4>(AudioDecoder::kSpeech),
-                      Return(kPayloadLengthSamples)));
-  EXPECT_EQ(NetEq::kOK, neteq_->RegisterExternalDecoder(
-                            &mock_decoder, NetEqDecoder::kDecoderPCM16B,
-                            "dummy name", kPayloadType));
-
-  // Insert one packet.
-  EXPECT_EQ(NetEq::kOK,
-            neteq_->InsertPacket(rtp_header, payload, kReceiveTime));
-
-  // Pull audio once.
-  const size_t kMaxOutputSize = static_cast<size_t>(10 * kSampleRateHz / 1000);
-  AudioFrame output;
-  bool muted;
-  EXPECT_EQ(NetEq::kOK, neteq_->GetAudio(&output, &muted));
-  ASSERT_EQ(kMaxOutputSize, output.samples_per_channel_);
-  EXPECT_EQ(1u, output.num_channels_);
-  EXPECT_EQ(AudioFrame::kNormalSpeech, output.speech_type_);
-
-  // Insert two more packets. The first one is out of order, and is already too
-  // old, the second one is the expected next packet.
-  rtp_header.sequenceNumber -= 1;
-  rtp_header.timestamp -= kPayloadLengthSamples;
-  payload[0] = 1;
-  EXPECT_EQ(NetEq::kOK,
-            neteq_->InsertPacket(rtp_header, payload, kReceiveTime));
-  rtp_header.sequenceNumber += 2;
-  rtp_header.timestamp += 2 * kPayloadLengthSamples;
-  payload[0] = 2;
-  EXPECT_EQ(NetEq::kOK,
-            neteq_->InsertPacket(rtp_header, payload, kReceiveTime));
-
-  // Expect only the second packet to be decoded (the one with "2" as the first
-  // payload byte).
-  EXPECT_CALL(mock_decoder, DecodeInternal(Pointee(2), kPayloadLengthBytes,
-                                           kSampleRateHz, _, _))
-      .WillOnce(DoAll(SetArrayArgument<3>(dummy_output,
-                                          dummy_output + kPayloadLengthSamples),
-                      SetArgPointee<4>(AudioDecoder::kSpeech),
-                      Return(kPayloadLengthSamples)));
-
-  // Pull audio once.
-  EXPECT_EQ(NetEq::kOK, neteq_->GetAudio(&output, &muted));
-  ASSERT_EQ(kMaxOutputSize, output.samples_per_channel_);
-  EXPECT_EQ(1u, output.num_channels_);
-  EXPECT_EQ(AudioFrame::kNormalSpeech, output.speech_type_);
-
-  // Now check the packet buffer, and make sure it is empty, since the
-  // out-of-order packet should have been discarded.
-  EXPECT_TRUE(packet_buffer_->Empty());
-
-  EXPECT_CALL(mock_decoder, Die());
-}
-
-// This test verifies that NetEq can handle the situation where the first
-// incoming packet is rejected.
-TEST_F(NetEqImplTest, FirstPacketUnknown) {
-  UseNoMocks();
-  CreateInstance();
-
-  const uint8_t kPayloadType = 17;   // Just an arbitrary number.
-  const uint32_t kReceiveTime = 17;  // Value doesn't matter for this test.
-  const int kSampleRateHz = 8000;
-  const size_t kPayloadLengthSamples =
-      static_cast<size_t>(10 * kSampleRateHz / 1000);  // 10 ms.
-  const size_t kPayloadLengthBytes = kPayloadLengthSamples * 2;
-  uint8_t payload[kPayloadLengthBytes] = {0};
-  RTPHeader rtp_header;
-  rtp_header.payloadType = kPayloadType;
-  rtp_header.sequenceNumber = 0x1234;
-  rtp_header.timestamp = 0x12345678;
-  rtp_header.ssrc = 0x87654321;
-
-  // Insert one packet. Note that we have not registered any payload type, so
-  // this packet will be rejected.
-  EXPECT_EQ(NetEq::kFail,
-            neteq_->InsertPacket(rtp_header, payload, kReceiveTime));
-
-  // Pull audio once.
-  const size_t kMaxOutputSize = static_cast<size_t>(10 * kSampleRateHz / 1000);
-  AudioFrame output;
-  bool muted;
-  EXPECT_EQ(NetEq::kOK, neteq_->GetAudio(&output, &muted));
-  ASSERT_LE(output.samples_per_channel_, kMaxOutputSize);
-  EXPECT_EQ(kMaxOutputSize, output.samples_per_channel_);
-  EXPECT_EQ(1u, output.num_channels_);
-  EXPECT_EQ(AudioFrame::kPLC, output.speech_type_);
-
-  // Register the payload type.
-  EXPECT_EQ(NetEq::kOK, neteq_->RegisterPayloadType(
-                            NetEqDecoder::kDecoderPCM16B, "", kPayloadType));
-
-  // Insert 10 packets.
-  for (size_t i = 0; i < 10; ++i) {
-    rtp_header.sequenceNumber++;
-    rtp_header.timestamp += kPayloadLengthSamples;
-    EXPECT_EQ(NetEq::kOK,
-              neteq_->InsertPacket(rtp_header, payload, kReceiveTime));
-    EXPECT_EQ(i + 1, packet_buffer_->NumPacketsInBuffer());
-  }
-
-  // Pull audio repeatedly and make sure we get normal output, that is not PLC.
-  for (size_t i = 0; i < 3; ++i) {
-    EXPECT_EQ(NetEq::kOK, neteq_->GetAudio(&output, &muted));
-    ASSERT_LE(output.samples_per_channel_, kMaxOutputSize);
-    EXPECT_EQ(kMaxOutputSize, output.samples_per_channel_);
-    EXPECT_EQ(1u, output.num_channels_);
-    EXPECT_EQ(AudioFrame::kNormalSpeech, output.speech_type_)
-        << "NetEq did not decode the packets as expected.";
-  }
-}
-
-// This test verifies that NetEq can handle comfort noise and enters/quits codec
-// internal CNG mode properly.
-TEST_F(NetEqImplTest, CodecInternalCng) {
-  UseNoMocks();
-  CreateInstance();
-
-  const uint8_t kPayloadType = 17;   // Just an arbitrary number.
-  const uint32_t kReceiveTime = 17;  // Value doesn't matter for this test.
-  const int kSampleRateKhz = 48;
-  const size_t kPayloadLengthSamples =
-      static_cast<size_t>(20 * kSampleRateKhz);  // 20 ms.
-  const size_t kPayloadLengthBytes = 10;
-  uint8_t payload[kPayloadLengthBytes] = {0};
-  int16_t dummy_output[kPayloadLengthSamples] = {0};
-
-  RTPHeader rtp_header;
-  rtp_header.payloadType = kPayloadType;
-  rtp_header.sequenceNumber = 0x1234;
-  rtp_header.timestamp = 0x12345678;
-  rtp_header.ssrc = 0x87654321;
-
-  // Create a mock decoder object.
-  MockAudioDecoder mock_decoder;
-  EXPECT_CALL(mock_decoder, Reset()).WillRepeatedly(Return());
-  EXPECT_CALL(mock_decoder, SampleRateHz())
-      .WillRepeatedly(Return(kSampleRateKhz * 1000));
-  EXPECT_CALL(mock_decoder, Channels()).WillRepeatedly(Return(1));
-  EXPECT_CALL(mock_decoder, IncomingPacket(_, kPayloadLengthBytes, _, _, _))
-      .WillRepeatedly(Return(0));
-  EXPECT_CALL(mock_decoder, PacketDuration(_, kPayloadLengthBytes))
-      .WillRepeatedly(Return(kPayloadLengthSamples));
-  // Packed duration when asking the decoder for more CNG data (without a new
-  // packet).
-  EXPECT_CALL(mock_decoder, PacketDuration(nullptr, 0))
-      .WillRepeatedly(Return(kPayloadLengthSamples));
-
-  // Pointee(x) verifies that first byte of the payload equals x, this makes it
-  // possible to verify that the correct payload is fed to Decode().
-  EXPECT_CALL(mock_decoder, DecodeInternal(Pointee(0), kPayloadLengthBytes,
-                                           kSampleRateKhz * 1000, _, _))
-      .WillOnce(DoAll(SetArrayArgument<3>(dummy_output,
-                                          dummy_output + kPayloadLengthSamples),
-                      SetArgPointee<4>(AudioDecoder::kSpeech),
-                      Return(kPayloadLengthSamples)));
-
-  EXPECT_CALL(mock_decoder, DecodeInternal(Pointee(1), kPayloadLengthBytes,
-                                           kSampleRateKhz * 1000, _, _))
-      .WillOnce(DoAll(SetArrayArgument<3>(dummy_output,
-                                          dummy_output + kPayloadLengthSamples),
-                      SetArgPointee<4>(AudioDecoder::kComfortNoise),
-                      Return(kPayloadLengthSamples)));
-
-  EXPECT_CALL(mock_decoder,
-              DecodeInternal(IsNull(), 0, kSampleRateKhz * 1000, _, _))
-      .WillOnce(DoAll(SetArrayArgument<3>(dummy_output,
-                                          dummy_output + kPayloadLengthSamples),
-                      SetArgPointee<4>(AudioDecoder::kComfortNoise),
-                      Return(kPayloadLengthSamples)));
-
-  EXPECT_CALL(mock_decoder, DecodeInternal(Pointee(2), kPayloadLengthBytes,
-                                           kSampleRateKhz * 1000, _, _))
-      .WillOnce(DoAll(SetArrayArgument<3>(dummy_output,
-                                          dummy_output + kPayloadLengthSamples),
-                      SetArgPointee<4>(AudioDecoder::kSpeech),
-                      Return(kPayloadLengthSamples)));
-
-  EXPECT_EQ(NetEq::kOK, neteq_->RegisterExternalDecoder(
-                            &mock_decoder, NetEqDecoder::kDecoderOpus,
-                            "dummy name", kPayloadType));
-
-  // Insert one packet (decoder will return speech).
-  EXPECT_EQ(NetEq::kOK,
-            neteq_->InsertPacket(rtp_header, payload, kReceiveTime));
-
-  // Insert second packet (decoder will return CNG).
-  payload[0] = 1;
-  rtp_header.sequenceNumber++;
-  rtp_header.timestamp += kPayloadLengthSamples;
-  EXPECT_EQ(NetEq::kOK,
-            neteq_->InsertPacket(rtp_header, payload, kReceiveTime));
-
-  const size_t kMaxOutputSize = static_cast<size_t>(10 * kSampleRateKhz);
-  AudioFrame output;
-  AudioFrame::SpeechType expected_type[8] = {
-      AudioFrame::kNormalSpeech, AudioFrame::kNormalSpeech,
-      AudioFrame::kCNG, AudioFrame::kCNG,
-      AudioFrame::kCNG, AudioFrame::kCNG,
-      AudioFrame::kNormalSpeech, AudioFrame::kNormalSpeech
-  };
-  int expected_timestamp_increment[8] = {
-      -1,  // will not be used.
-      10 * kSampleRateKhz,
-      -1, -1,  // timestamp will be empty during CNG mode; indicated by -1 here.
-      -1, -1,
-      50 * kSampleRateKhz, 10 * kSampleRateKhz
-  };
-
-  bool muted;
-  EXPECT_EQ(NetEq::kOK, neteq_->GetAudio(&output, &muted));
-  rtc::Optional<uint32_t> last_timestamp = neteq_->GetPlayoutTimestamp();
-  ASSERT_TRUE(last_timestamp);
-
-  // Lambda for verifying the timestamps.
-  auto verify_timestamp = [&last_timestamp, &expected_timestamp_increment](
-      rtc::Optional<uint32_t> ts, size_t i) {
-    if (expected_timestamp_increment[i] == -1) {
-      // Expect to get an empty timestamp value during CNG and PLC.
-      EXPECT_FALSE(ts) << "i = " << i;
-    } else {
-      ASSERT_TRUE(ts) << "i = " << i;
-      EXPECT_EQ(*ts, *last_timestamp + expected_timestamp_increment[i])
-          << "i = " << i;
-      last_timestamp = ts;
-    }
-  };
-
-  for (size_t i = 1; i < 6; ++i) {
-    ASSERT_EQ(kMaxOutputSize, output.samples_per_channel_);
-    EXPECT_EQ(1u, output.num_channels_);
-    EXPECT_EQ(expected_type[i - 1], output.speech_type_);
-    EXPECT_EQ(NetEq::kOK, neteq_->GetAudio(&output, &muted));
-    SCOPED_TRACE("");
-    verify_timestamp(neteq_->GetPlayoutTimestamp(), i);
-  }
-
-  // Insert third packet, which leaves a gap from last packet.
-  payload[0] = 2;
-  rtp_header.sequenceNumber += 2;
-  rtp_header.timestamp += 2 * kPayloadLengthSamples;
-  EXPECT_EQ(NetEq::kOK,
-            neteq_->InsertPacket(rtp_header, payload, kReceiveTime));
-
-  for (size_t i = 6; i < 8; ++i) {
-    ASSERT_EQ(kMaxOutputSize, output.samples_per_channel_);
-    EXPECT_EQ(1u, output.num_channels_);
-    EXPECT_EQ(expected_type[i - 1], output.speech_type_);
-    EXPECT_EQ(NetEq::kOK, neteq_->GetAudio(&output, &muted));
-    SCOPED_TRACE("");
-    verify_timestamp(neteq_->GetPlayoutTimestamp(), i);
-  }
-
-  // Now check the packet buffer, and make sure it is empty.
-  EXPECT_TRUE(packet_buffer_->Empty());
-
-  EXPECT_CALL(mock_decoder, Die());
-}
-
-TEST_F(NetEqImplTest, UnsupportedDecoder) {
-  UseNoMocks();
-  CreateInstance();
-  static const size_t kNetEqMaxFrameSize = 5760;  // 120 ms @ 48 kHz.
-  static const size_t kChannels = 2;
-
-  const uint8_t kPayloadType = 17;   // Just an arbitrary number.
-  const uint32_t kReceiveTime = 17;  // Value doesn't matter for this test.
-  const int kSampleRateHz = 8000;
-
-  const size_t kPayloadLengthSamples =
-      static_cast<size_t>(10 * kSampleRateHz / 1000);  // 10 ms.
-  const size_t kPayloadLengthBytes = 1;
-  uint8_t payload[kPayloadLengthBytes] = {0};
-  int16_t dummy_output[kPayloadLengthSamples * kChannels] = {0};
-  RTPHeader rtp_header;
-  rtp_header.payloadType = kPayloadType;
-  rtp_header.sequenceNumber = 0x1234;
-  rtp_header.timestamp = 0x12345678;
-  rtp_header.ssrc = 0x87654321;
-
-  ::testing::NiceMock<MockAudioDecoder> decoder;
-
-  const uint8_t kFirstPayloadValue = 1;
-  const uint8_t kSecondPayloadValue = 2;
-
-  EXPECT_CALL(decoder,
-              PacketDuration(Pointee(kFirstPayloadValue), kPayloadLengthBytes))
-      .Times(AtLeast(1))
-      .WillRepeatedly(Return(kNetEqMaxFrameSize + 1));
-
-  EXPECT_CALL(decoder, DecodeInternal(Pointee(kFirstPayloadValue), _, _, _, _))
-      .Times(0);
-
-  EXPECT_CALL(decoder, DecodeInternal(Pointee(kSecondPayloadValue),
-                                      kPayloadLengthBytes, kSampleRateHz, _, _))
-      .Times(1)
-      .WillOnce(DoAll(
-          SetArrayArgument<3>(dummy_output,
-                              dummy_output + kPayloadLengthSamples * kChannels),
-          SetArgPointee<4>(AudioDecoder::kSpeech),
-          Return(static_cast<int>(kPayloadLengthSamples * kChannels))));
-
-  EXPECT_CALL(decoder,
-              PacketDuration(Pointee(kSecondPayloadValue), kPayloadLengthBytes))
-      .Times(AtLeast(1))
-      .WillRepeatedly(Return(kNetEqMaxFrameSize));
-
-  EXPECT_CALL(decoder, SampleRateHz())
-      .WillRepeatedly(Return(kSampleRateHz));
-
-  EXPECT_CALL(decoder, Channels())
-      .WillRepeatedly(Return(kChannels));
-
-  EXPECT_EQ(NetEq::kOK, neteq_->RegisterExternalDecoder(
-                            &decoder, NetEqDecoder::kDecoderPCM16B,
-                            "dummy name", kPayloadType));
-
-  // Insert one packet.
-  payload[0] = kFirstPayloadValue;  // This will make Decode() fail.
-  EXPECT_EQ(NetEq::kOK,
-            neteq_->InsertPacket(rtp_header, payload, kReceiveTime));
-
-  // Insert another packet.
-  payload[0] = kSecondPayloadValue;  // This will make Decode() successful.
-  rtp_header.sequenceNumber++;
-  // The second timestamp needs to be at least 30 ms after the first to make
-  // the second packet get decoded.
-  rtp_header.timestamp += 3 * kPayloadLengthSamples;
-  EXPECT_EQ(NetEq::kOK,
-            neteq_->InsertPacket(rtp_header, payload, kReceiveTime));
-
-  AudioFrame output;
-  bool muted;
-  // First call to GetAudio will try to decode the "faulty" packet.
-  // Expect kFail return value.
-  EXPECT_EQ(NetEq::kFail, neteq_->GetAudio(&output, &muted));
-  // Output size and number of channels should be correct.
-  const size_t kExpectedOutputSize = 10 * (kSampleRateHz / 1000) * kChannels;
-  EXPECT_EQ(kExpectedOutputSize, output.samples_per_channel_ * kChannels);
-  EXPECT_EQ(kChannels, output.num_channels_);
-
-  // Second call to GetAudio will decode the packet that is ok. No errors are
-  // expected.
-  EXPECT_EQ(NetEq::kOK, neteq_->GetAudio(&output, &muted));
-  EXPECT_EQ(kExpectedOutputSize, output.samples_per_channel_ * kChannels);
-  EXPECT_EQ(kChannels, output.num_channels_);
-
-  // Die isn't called through NiceMock (since it's called by the
-  // MockAudioDecoder constructor), so it needs to be mocked explicitly.
-  EXPECT_CALL(decoder, Die());
-}
-
-// This test inserts packets until the buffer is flushed. After that, it asks
-// NetEq for the network statistics. The purpose of the test is to make sure
-// that even though the buffer size increment is negative (which it becomes when
-// the packet causing a flush is inserted), the packet length stored in the
-// decision logic remains valid.
-TEST_F(NetEqImplTest, FloodBufferAndGetNetworkStats) {
-  UseNoMocks();
-  CreateInstance();
-
-  const size_t kPayloadLengthSamples = 80;
-  const size_t kPayloadLengthBytes = 2 * kPayloadLengthSamples;  // PCM 16-bit.
-  const uint8_t kPayloadType = 17;   // Just an arbitrary number.
-  const uint32_t kReceiveTime = 17;  // Value doesn't matter for this test.
-  uint8_t payload[kPayloadLengthBytes] = {0};
-  RTPHeader rtp_header;
-  rtp_header.payloadType = kPayloadType;
-  rtp_header.sequenceNumber = 0x1234;
-  rtp_header.timestamp = 0x12345678;
-  rtp_header.ssrc = 0x87654321;
-
-  EXPECT_EQ(NetEq::kOK, neteq_->RegisterPayloadType(
-                            NetEqDecoder::kDecoderPCM16B, "", kPayloadType));
-
-  // Insert packets until the buffer flushes.
-  for (size_t i = 0; i <= config_.max_packets_in_buffer; ++i) {
-    EXPECT_EQ(i, packet_buffer_->NumPacketsInBuffer());
-    EXPECT_EQ(NetEq::kOK,
-              neteq_->InsertPacket(rtp_header, payload, kReceiveTime));
-    rtp_header.timestamp += rtc::checked_cast<uint32_t>(kPayloadLengthSamples);
-    ++rtp_header.sequenceNumber;
-  }
-  EXPECT_EQ(1u, packet_buffer_->NumPacketsInBuffer());
-
-  // Ask for network statistics. This should not crash.
-  NetEqNetworkStatistics stats;
-  EXPECT_EQ(NetEq::kOK, neteq_->NetworkStatistics(&stats));
-}
-
-TEST_F(NetEqImplTest, DecodedPayloadTooShort) {
-  UseNoMocks();
-  CreateInstance();
-
-  const uint8_t kPayloadType = 17;   // Just an arbitrary number.
-  const uint32_t kReceiveTime = 17;  // Value doesn't matter for this test.
-  const int kSampleRateHz = 8000;
-  const size_t kPayloadLengthSamples =
-      static_cast<size_t>(10 * kSampleRateHz / 1000);  // 10 ms.
-  const size_t kPayloadLengthBytes = 2 * kPayloadLengthSamples;
-  uint8_t payload[kPayloadLengthBytes] = {0};
-  RTPHeader rtp_header;
-  rtp_header.payloadType = kPayloadType;
-  rtp_header.sequenceNumber = 0x1234;
-  rtp_header.timestamp = 0x12345678;
-  rtp_header.ssrc = 0x87654321;
-
-  // Create a mock decoder object.
-  MockAudioDecoder mock_decoder;
-  EXPECT_CALL(mock_decoder, Reset()).WillRepeatedly(Return());
-  EXPECT_CALL(mock_decoder, SampleRateHz())
-      .WillRepeatedly(Return(kSampleRateHz));
-  EXPECT_CALL(mock_decoder, Channels()).WillRepeatedly(Return(1));
-  EXPECT_CALL(mock_decoder, IncomingPacket(_, kPayloadLengthBytes, _, _, _))
-      .WillRepeatedly(Return(0));
-  EXPECT_CALL(mock_decoder, PacketDuration(_, _))
-      .WillRepeatedly(Return(kPayloadLengthSamples));
-  int16_t dummy_output[kPayloadLengthSamples] = {0};
-  // The below expectation will make the mock decoder write
-  // |kPayloadLengthSamples| - 5 zeros to the output array, and mark it as
-  // speech. That is, the decoded length is 5 samples shorter than the expected.
-  EXPECT_CALL(mock_decoder,
-              DecodeInternal(_, kPayloadLengthBytes, kSampleRateHz, _, _))
-      .WillOnce(
-          DoAll(SetArrayArgument<3>(dummy_output,
-                                    dummy_output + kPayloadLengthSamples - 5),
-                SetArgPointee<4>(AudioDecoder::kSpeech),
-                Return(kPayloadLengthSamples - 5)));
-  EXPECT_EQ(NetEq::kOK, neteq_->RegisterExternalDecoder(
-                            &mock_decoder, NetEqDecoder::kDecoderPCM16B,
-                            "dummy name", kPayloadType));
-
-  // Insert one packet.
-  EXPECT_EQ(NetEq::kOK,
-            neteq_->InsertPacket(rtp_header, payload, kReceiveTime));
-
-  EXPECT_EQ(5u, neteq_->sync_buffer_for_test()->FutureLength());
-
-  // Pull audio once.
-  const size_t kMaxOutputSize = static_cast<size_t>(10 * kSampleRateHz / 1000);
-  AudioFrame output;
-  bool muted;
-  EXPECT_EQ(NetEq::kOK, neteq_->GetAudio(&output, &muted));
-  ASSERT_EQ(kMaxOutputSize, output.samples_per_channel_);
-  EXPECT_EQ(1u, output.num_channels_);
-  EXPECT_EQ(AudioFrame::kNormalSpeech, output.speech_type_);
-
-  EXPECT_CALL(mock_decoder, Die());
-}
-
-// This test checks the behavior of NetEq when audio decoder fails.
-TEST_F(NetEqImplTest, DecodingError) {
-  UseNoMocks();
-  CreateInstance();
-
-  const uint8_t kPayloadType = 17;   // Just an arbitrary number.
-  const uint32_t kReceiveTime = 17;  // Value doesn't matter for this test.
-  const int kSampleRateHz = 8000;
-  const int kDecoderErrorCode = -97;  // Any negative number.
-
-  // We let decoder return 5 ms each time, and therefore, 2 packets make 10 ms.
-  const size_t kFrameLengthSamples =
-      static_cast<size_t>(5 * kSampleRateHz / 1000);
-
-  const size_t kPayloadLengthBytes = 1;  // This can be arbitrary.
-
-  uint8_t payload[kPayloadLengthBytes] = {0};
-
-  RTPHeader rtp_header;
-  rtp_header.payloadType = kPayloadType;
-  rtp_header.sequenceNumber = 0x1234;
-  rtp_header.timestamp = 0x12345678;
-  rtp_header.ssrc = 0x87654321;
-
-  // Create a mock decoder object.
-  MockAudioDecoder mock_decoder;
-  EXPECT_CALL(mock_decoder, Reset()).WillRepeatedly(Return());
-  EXPECT_CALL(mock_decoder, SampleRateHz())
-      .WillRepeatedly(Return(kSampleRateHz));
-  EXPECT_CALL(mock_decoder, Channels()).WillRepeatedly(Return(1));
-  EXPECT_CALL(mock_decoder, IncomingPacket(_, kPayloadLengthBytes, _, _, _))
-      .WillRepeatedly(Return(0));
-  EXPECT_CALL(mock_decoder, PacketDuration(_, _))
-      .WillRepeatedly(Return(kFrameLengthSamples));
-  EXPECT_CALL(mock_decoder, ErrorCode())
-      .WillOnce(Return(kDecoderErrorCode));
-  EXPECT_CALL(mock_decoder, HasDecodePlc())
-      .WillOnce(Return(false));
-  int16_t dummy_output[kFrameLengthSamples] = {0};
-
-  {
-    InSequence sequence;  // Dummy variable.
-    // Mock decoder works normally the first time.
-    EXPECT_CALL(mock_decoder,
-                DecodeInternal(_, kPayloadLengthBytes, kSampleRateHz, _, _))
-        .Times(3)
-        .WillRepeatedly(
-            DoAll(SetArrayArgument<3>(dummy_output,
-                                      dummy_output + kFrameLengthSamples),
-                  SetArgPointee<4>(AudioDecoder::kSpeech),
-                  Return(kFrameLengthSamples)))
-        .RetiresOnSaturation();
-
-    // Then mock decoder fails. A common reason for failure can be buffer being
-    // too short
-    EXPECT_CALL(mock_decoder,
-                DecodeInternal(_, kPayloadLengthBytes, kSampleRateHz, _, _))
-        .WillOnce(Return(-1))
-        .RetiresOnSaturation();
-
-    // Mock decoder finally returns to normal.
-    EXPECT_CALL(mock_decoder,
-                DecodeInternal(_, kPayloadLengthBytes, kSampleRateHz, _, _))
-        .Times(2)
-        .WillRepeatedly(
-            DoAll(SetArrayArgument<3>(dummy_output,
-                                      dummy_output + kFrameLengthSamples),
-                  SetArgPointee<4>(AudioDecoder::kSpeech),
-                  Return(kFrameLengthSamples)));
-  }
-
-  EXPECT_EQ(NetEq::kOK, neteq_->RegisterExternalDecoder(
-                            &mock_decoder, NetEqDecoder::kDecoderPCM16B,
-                            "dummy name", kPayloadType));
-
-  // Insert packets.
-  for (int i = 0; i < 6; ++i) {
-    rtp_header.sequenceNumber += 1;
-    rtp_header.timestamp += kFrameLengthSamples;
-    EXPECT_EQ(NetEq::kOK,
-              neteq_->InsertPacket(rtp_header, payload, kReceiveTime));
-  }
-
-  // Pull audio.
-  const size_t kMaxOutputSize = static_cast<size_t>(10 * kSampleRateHz / 1000);
-  AudioFrame output;
-  bool muted;
-  EXPECT_EQ(NetEq::kOK, neteq_->GetAudio(&output, &muted));
-  EXPECT_EQ(kMaxOutputSize, output.samples_per_channel_);
-  EXPECT_EQ(1u, output.num_channels_);
-  EXPECT_EQ(AudioFrame::kNormalSpeech, output.speech_type_);
-
-  // Pull audio again. Decoder fails.
-  EXPECT_EQ(NetEq::kFail, neteq_->GetAudio(&output, &muted));
-  EXPECT_EQ(kMaxOutputSize, output.samples_per_channel_);
-  EXPECT_EQ(1u, output.num_channels_);
-  // We are not expecting anything for output.speech_type_, since an error was
-  // returned.
-
-  // Pull audio again, should continue an expansion.
-  EXPECT_EQ(NetEq::kOK, neteq_->GetAudio(&output, &muted));
-  EXPECT_EQ(kMaxOutputSize, output.samples_per_channel_);
-  EXPECT_EQ(1u, output.num_channels_);
-  EXPECT_EQ(AudioFrame::kPLC, output.speech_type_);
-
-  // Pull audio again, should behave normal.
-  EXPECT_EQ(NetEq::kOK, neteq_->GetAudio(&output, &muted));
-  EXPECT_EQ(kMaxOutputSize, output.samples_per_channel_);
-  EXPECT_EQ(1u, output.num_channels_);
-  EXPECT_EQ(AudioFrame::kNormalSpeech, output.speech_type_);
-
-  EXPECT_CALL(mock_decoder, Die());
-}
-
-// This test checks the behavior of NetEq when audio decoder fails during CNG.
-TEST_F(NetEqImplTest, DecodingErrorDuringInternalCng) {
-  UseNoMocks();
-  CreateInstance();
-
-  const uint8_t kPayloadType = 17;   // Just an arbitrary number.
-  const uint32_t kReceiveTime = 17;  // Value doesn't matter for this test.
-  const int kSampleRateHz = 8000;
-  const int kDecoderErrorCode = -97;  // Any negative number.
-
-  // We let decoder return 5 ms each time, and therefore, 2 packets make 10 ms.
-  const size_t kFrameLengthSamples =
-      static_cast<size_t>(5 * kSampleRateHz / 1000);
-
-  const size_t kPayloadLengthBytes = 1;  // This can be arbitrary.
-
-  uint8_t payload[kPayloadLengthBytes] = {0};
-
-  RTPHeader rtp_header;
-  rtp_header.payloadType = kPayloadType;
-  rtp_header.sequenceNumber = 0x1234;
-  rtp_header.timestamp = 0x12345678;
-  rtp_header.ssrc = 0x87654321;
-
-  // Create a mock decoder object.
-  MockAudioDecoder mock_decoder;
-  EXPECT_CALL(mock_decoder, Reset()).WillRepeatedly(Return());
-  EXPECT_CALL(mock_decoder, SampleRateHz())
-      .WillRepeatedly(Return(kSampleRateHz));
-  EXPECT_CALL(mock_decoder, Channels()).WillRepeatedly(Return(1));
-  EXPECT_CALL(mock_decoder, IncomingPacket(_, kPayloadLengthBytes, _, _, _))
-      .WillRepeatedly(Return(0));
-  EXPECT_CALL(mock_decoder, PacketDuration(_, _))
-      .WillRepeatedly(Return(kFrameLengthSamples));
-  EXPECT_CALL(mock_decoder, ErrorCode())
-      .WillOnce(Return(kDecoderErrorCode));
-  int16_t dummy_output[kFrameLengthSamples] = {0};
-
-  {
-    InSequence sequence;  // Dummy variable.
-    // Mock decoder works normally the first 2 times.
-    EXPECT_CALL(mock_decoder,
-                DecodeInternal(_, kPayloadLengthBytes, kSampleRateHz, _, _))
-        .Times(2)
-        .WillRepeatedly(
-            DoAll(SetArrayArgument<3>(dummy_output,
-                                      dummy_output + kFrameLengthSamples),
-                  SetArgPointee<4>(AudioDecoder::kComfortNoise),
-                  Return(kFrameLengthSamples)))
-        .RetiresOnSaturation();
-
-    // Then mock decoder fails. A common reason for failure can be buffer being
-    // too short
-    EXPECT_CALL(mock_decoder, DecodeInternal(nullptr, 0, kSampleRateHz, _, _))
-        .WillOnce(Return(-1))
-        .RetiresOnSaturation();
-
-    // Mock decoder finally returns to normal.
-    EXPECT_CALL(mock_decoder, DecodeInternal(nullptr, 0, kSampleRateHz, _, _))
-        .Times(2)
-        .WillRepeatedly(
-            DoAll(SetArrayArgument<3>(dummy_output,
-                                      dummy_output + kFrameLengthSamples),
-                  SetArgPointee<4>(AudioDecoder::kComfortNoise),
-                  Return(kFrameLengthSamples)));
-  }
-
-  EXPECT_EQ(NetEq::kOK, neteq_->RegisterExternalDecoder(
-                            &mock_decoder, NetEqDecoder::kDecoderPCM16B,
-                            "dummy name", kPayloadType));
-
-  // Insert 2 packets. This will make netEq into codec internal CNG mode.
-  for (int i = 0; i < 2; ++i) {
-    rtp_header.sequenceNumber += 1;
-    rtp_header.timestamp += kFrameLengthSamples;
-    EXPECT_EQ(NetEq::kOK,
-              neteq_->InsertPacket(rtp_header, payload, kReceiveTime));
-  }
-
-  // Pull audio.
-  const size_t kMaxOutputSize = static_cast<size_t>(10 * kSampleRateHz / 1000);
-  AudioFrame output;
-  bool muted;
-  EXPECT_EQ(NetEq::kOK, neteq_->GetAudio(&output, &muted));
-  EXPECT_EQ(kMaxOutputSize, output.samples_per_channel_);
-  EXPECT_EQ(1u, output.num_channels_);
-  EXPECT_EQ(AudioFrame::kCNG, output.speech_type_);
-
-  // Pull audio again. Decoder fails.
-  EXPECT_EQ(NetEq::kFail, neteq_->GetAudio(&output, &muted));
-  EXPECT_EQ(kMaxOutputSize, output.samples_per_channel_);
-  EXPECT_EQ(1u, output.num_channels_);
-  // We are not expecting anything for output.speech_type_, since an error was
-  // returned.
-
-  // Pull audio again, should resume codec CNG.
-  EXPECT_EQ(NetEq::kOK, neteq_->GetAudio(&output, &muted));
-  EXPECT_EQ(kMaxOutputSize, output.samples_per_channel_);
-  EXPECT_EQ(1u, output.num_channels_);
-  EXPECT_EQ(AudioFrame::kCNG, output.speech_type_);
-
-  EXPECT_CALL(mock_decoder, Die());
-}
-
-// Tests that the return value from last_output_sample_rate_hz() is equal to the
-// configured inital sample rate.
-TEST_F(NetEqImplTest, InitialLastOutputSampleRate) {
-  UseNoMocks();
-  config_.sample_rate_hz = 48000;
-  CreateInstance();
-  EXPECT_EQ(48000, neteq_->last_output_sample_rate_hz());
-}
-
-TEST_F(NetEqImplTest, TickTimerIncrement) {
-  UseNoMocks();
-  CreateInstance();
-  ASSERT_TRUE(tick_timer_);
-  EXPECT_EQ(0u, tick_timer_->ticks());
-  AudioFrame output;
-  bool muted;
-  EXPECT_EQ(NetEq::kOK, neteq_->GetAudio(&output, &muted));
-  EXPECT_EQ(1u, tick_timer_->ticks());
-}
-
-TEST_F(NetEqImplTest, TargetDelayMs) {
-  UseNoMocks();
-  use_mock_delay_manager_ = true;
-  CreateInstance();
-  // Let the dummy target delay be 17 packets.
-  constexpr int kTargetLevelPacketsQ8 = 17 << 8;
-  EXPECT_CALL(*mock_delay_manager_, TargetLevel())
-      .WillOnce(Return(kTargetLevelPacketsQ8));
-  // Default packet size before any packet has been decoded is 30 ms, so we are
-  // expecting 17 * 30 = 510 ms target delay.
-  EXPECT_EQ(17 * 30, neteq_->TargetDelayMs());
-}
-
-TEST_F(NetEqImplTest, InsertEmptyPacket) {
-  UseNoMocks();
-  use_mock_delay_manager_ = true;
-  CreateInstance();
-
-  RTPHeader rtp_header;
-  rtp_header.payloadType = 17;
-  rtp_header.sequenceNumber = 0x1234;
-  rtp_header.timestamp = 0x12345678;
-  rtp_header.ssrc = 0x87654321;
-
-  EXPECT_CALL(*mock_delay_manager_, RegisterEmptyPacket());
-  neteq_->InsertEmptyPacket(rtp_header);
-}
-
-class Decoder120ms : public AudioDecoder {
- public:
-  Decoder120ms(int sample_rate_hz, SpeechType speech_type)
-      : sample_rate_hz_(sample_rate_hz),
-        next_value_(1),
-        speech_type_(speech_type) {}
-
-  int DecodeInternal(const uint8_t* encoded,
-                     size_t encoded_len,
-                     int sample_rate_hz,
-                     int16_t* decoded,
-                     SpeechType* speech_type) override {
-    EXPECT_EQ(sample_rate_hz_, sample_rate_hz);
-    size_t decoded_len =
-        rtc::CheckedDivExact(sample_rate_hz, 1000) * 120 * Channels();
-    for (size_t i = 0; i < decoded_len; ++i) {
-      decoded[i] = next_value_++;
-    }
-    *speech_type = speech_type_;
-    return decoded_len;
-  }
-
-  void Reset() override { next_value_ = 1; }
-  int SampleRateHz() const override { return sample_rate_hz_; }
-  size_t Channels() const override { return 2; }
-
- private:
-  int sample_rate_hz_;
-  int16_t next_value_;
-  SpeechType speech_type_;
-};
-
-class NetEqImplTest120ms : public NetEqImplTest {
- protected:
-  NetEqImplTest120ms() : NetEqImplTest() {}
-  virtual ~NetEqImplTest120ms() {}
-
-  void CreateInstanceNoMocks() {
-    UseNoMocks();
-    CreateInstance();
-  }
-
-  void CreateInstanceWithDelayManagerMock() {
-    UseNoMocks();
-    use_mock_delay_manager_ = true;
-    CreateInstance();
-  }
-
-  uint32_t timestamp_diff_between_packets() const {
-    return rtc::CheckedDivExact(kSamplingFreq_, 1000u) * 120;
-  }
-
-  uint32_t first_timestamp() const { return 10u; }
-
-  void GetFirstPacket() {
-    bool muted;
-    for (int i = 0; i < 12; i++) {
-      EXPECT_EQ(NetEq::kOK, neteq_->GetAudio(&output_, &muted));
-      EXPECT_FALSE(muted);
-    }
-  }
-
-  void InsertPacket(uint32_t timestamp) {
-    RTPHeader rtp_header;
-    rtp_header.payloadType = kPayloadType;
-    rtp_header.sequenceNumber = sequence_number_;
-    rtp_header.timestamp = timestamp;
-    rtp_header.ssrc = 15;
-    const size_t kPayloadLengthBytes = 1;  // This can be arbitrary.
-    uint8_t payload[kPayloadLengthBytes] = {0};
-    EXPECT_EQ(NetEq::kOK, neteq_->InsertPacket(rtp_header, payload, 10));
-    sequence_number_++;
-  }
-
-  void Register120msCodec(AudioDecoder::SpeechType speech_type) {
-    decoder_.reset(new Decoder120ms(kSamplingFreq_, speech_type));
-    ASSERT_EQ(2u, decoder_->Channels());
-    EXPECT_EQ(NetEq::kOK, neteq_->RegisterExternalDecoder(
-                              decoder_.get(), NetEqDecoder::kDecoderOpus_2ch,
-                              "120ms codec", kPayloadType));
-  }
-
-  std::unique_ptr<Decoder120ms> decoder_;
-  AudioFrame output_;
-  const uint32_t kPayloadType = 17;
-  const uint32_t kSamplingFreq_ = 48000;
-  uint16_t sequence_number_ = 1;
-};
-
-TEST_F(NetEqImplTest120ms, AudioRepetition) {
-  config_.playout_mode = kPlayoutFax;
-  CreateInstanceNoMocks();
-  Register120msCodec(AudioDecoder::kSpeech);
-
-  InsertPacket(first_timestamp());
-  GetFirstPacket();
-
-  bool muted;
-  EXPECT_EQ(NetEq::kOK, neteq_->GetAudio(&output_, &muted));
-  EXPECT_EQ(kAudioRepetition, neteq_->last_operation_for_test());
-}
-
-TEST_F(NetEqImplTest120ms, AlternativePlc) {
-  config_.playout_mode = kPlayoutOff;
-  CreateInstanceNoMocks();
-  Register120msCodec(AudioDecoder::kSpeech);
-
-  InsertPacket(first_timestamp());
-  GetFirstPacket();
-
-  bool muted;
-  EXPECT_EQ(NetEq::kOK, neteq_->GetAudio(&output_, &muted));
-  EXPECT_EQ(kAlternativePlc, neteq_->last_operation_for_test());
-}
-
-TEST_F(NetEqImplTest120ms, CodecInternalCng) {
-  CreateInstanceNoMocks();
-  Register120msCodec(AudioDecoder::kComfortNoise);
-
-  InsertPacket(first_timestamp());
-  GetFirstPacket();
-
-  bool muted;
-  EXPECT_EQ(NetEq::kOK, neteq_->GetAudio(&output_, &muted));
-  EXPECT_EQ(kCodecInternalCng, neteq_->last_operation_for_test());
-}
-
-TEST_F(NetEqImplTest120ms, Normal) {
-  CreateInstanceNoMocks();
-  Register120msCodec(AudioDecoder::kSpeech);
-
-  InsertPacket(first_timestamp());
-  GetFirstPacket();
-
-  EXPECT_EQ(kNormal, neteq_->last_operation_for_test());
-}
-
-TEST_F(NetEqImplTest120ms, Merge) {
-  CreateInstanceWithDelayManagerMock();
-
-  Register120msCodec(AudioDecoder::kSpeech);
-  InsertPacket(first_timestamp());
-
-  GetFirstPacket();
-  bool muted;
-  EXPECT_EQ(NetEq::kOK, neteq_->GetAudio(&output_, &muted));
-
-  InsertPacket(first_timestamp() + 2 * timestamp_diff_between_packets());
-
-  // Delay manager reports a target level which should cause a Merge.
-  EXPECT_CALL(*mock_delay_manager_, TargetLevel()).WillOnce(Return(-10));
-
-  EXPECT_EQ(NetEq::kOK, neteq_->GetAudio(&output_, &muted));
-  EXPECT_EQ(kMerge, neteq_->last_operation_for_test());
-}
-
-TEST_F(NetEqImplTest120ms, Expand) {
-  CreateInstanceNoMocks();
-  Register120msCodec(AudioDecoder::kSpeech);
-
-  InsertPacket(first_timestamp());
-  GetFirstPacket();
-
-  bool muted;
-  EXPECT_EQ(NetEq::kOK, neteq_->GetAudio(&output_, &muted));
-  EXPECT_EQ(kExpand, neteq_->last_operation_for_test());
-}
-
-TEST_F(NetEqImplTest120ms, FastAccelerate) {
-  CreateInstanceWithDelayManagerMock();
-  Register120msCodec(AudioDecoder::kSpeech);
-
-  InsertPacket(first_timestamp());
-  GetFirstPacket();
-  InsertPacket(first_timestamp() + timestamp_diff_between_packets());
-
-  // Delay manager report buffer limit which should cause a FastAccelerate.
-  EXPECT_CALL(*mock_delay_manager_, BufferLimits(_, _))
-      .Times(1)
-      .WillOnce(DoAll(SetArgPointee<0>(0), SetArgPointee<1>(0)));
-
-  bool muted;
-  EXPECT_EQ(NetEq::kOK, neteq_->GetAudio(&output_, &muted));
-  EXPECT_EQ(kFastAccelerate, neteq_->last_operation_for_test());
-}
-
-TEST_F(NetEqImplTest120ms, PreemptiveExpand) {
-  CreateInstanceWithDelayManagerMock();
-  Register120msCodec(AudioDecoder::kSpeech);
-
-  InsertPacket(first_timestamp());
-  GetFirstPacket();
-
-  InsertPacket(first_timestamp() + timestamp_diff_between_packets());
-
-  // Delay manager report buffer limit which should cause a PreemptiveExpand.
-  EXPECT_CALL(*mock_delay_manager_, BufferLimits(_, _))
-      .Times(1)
-      .WillOnce(DoAll(SetArgPointee<0>(100), SetArgPointee<1>(100)));
-
-  bool muted;
-  EXPECT_EQ(NetEq::kOK, neteq_->GetAudio(&output_, &muted));
-  EXPECT_EQ(kPreemptiveExpand, neteq_->last_operation_for_test());
-}
-
-TEST_F(NetEqImplTest120ms, Accelerate) {
-  CreateInstanceWithDelayManagerMock();
-  Register120msCodec(AudioDecoder::kSpeech);
-
-  InsertPacket(first_timestamp());
-  GetFirstPacket();
-
-  InsertPacket(first_timestamp() + timestamp_diff_between_packets());
-
-  // Delay manager report buffer limit which should cause a Accelerate.
-  EXPECT_CALL(*mock_delay_manager_, BufferLimits(_, _))
-      .Times(1)
-      .WillOnce(DoAll(SetArgPointee<0>(1), SetArgPointee<1>(2)));
-
-  bool muted;
-  EXPECT_EQ(NetEq::kOK, neteq_->GetAudio(&output_, &muted));
-  EXPECT_EQ(kAccelerate, neteq_->last_operation_for_test());
-}
-
-}// namespace webrtc
diff --git a/modules/audio_coding/neteq/neteq_network_stats_unittest.cc b/modules/audio_coding/neteq/neteq_network_stats_unittest.cc
deleted file mode 100644
index bfa9362..0000000
--- a/modules/audio_coding/neteq/neteq_network_stats_unittest.cc
+++ /dev/null
@@ -1,337 +0,0 @@
-/*
- *  Copyright (c) 2015 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 <memory>
-
-#include "webrtc/common_types.h"
-#include "webrtc/modules/audio_coding/neteq/tools/neteq_external_decoder_test.h"
-#include "webrtc/modules/audio_coding/neteq/tools/rtp_generator.h"
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/test/gmock.h"
-
-namespace webrtc {
-namespace test {
-
-using ::testing::_;
-using ::testing::SetArgPointee;
-using ::testing::Return;
-
-class MockAudioDecoder final : public AudioDecoder {
- public:
-  // TODO(nisse): Valid overrides commented out, because the gmock
-  // methods don't use any override declarations, and we want to avoid
-  // warnings from -Winconsistent-missing-override. See
-  // http://crbug.com/428099.
-  static const int kPacketDuration = 960;  // 48 kHz * 20 ms
-
-  MockAudioDecoder(int sample_rate_hz, size_t num_channels)
-      : sample_rate_hz_(sample_rate_hz),
-        num_channels_(num_channels),
-        fec_enabled_(false) {}
-  ~MockAudioDecoder() /* override */ { Die(); }
-  MOCK_METHOD0(Die, void());
-
-  MOCK_METHOD0(Reset, void());
-
-  class MockFrame : public AudioDecoder::EncodedAudioFrame {
-   public:
-    MockFrame(size_t num_channels) : num_channels_(num_channels) {}
-
-    size_t Duration() const override { return kPacketDuration; }
-
-    rtc::Optional<DecodeResult> Decode(
-        rtc::ArrayView<int16_t> decoded) const override {
-      const size_t output_size =
-          sizeof(int16_t) * kPacketDuration * num_channels_;
-      if (decoded.size() >= output_size) {
-        memset(decoded.data(), 0,
-               sizeof(int16_t) * kPacketDuration * num_channels_);
-        return rtc::Optional<DecodeResult>(
-            {kPacketDuration * num_channels_, kSpeech});
-      } else {
-        ADD_FAILURE() << "Expected decoded.size() to be >= output_size ("
-                      << decoded.size() << " vs. " << output_size << ")";
-        return rtc::Optional<DecodeResult>();
-      }
-    }
-
-   private:
-    const size_t num_channels_;
-  };
-
-  std::vector<ParseResult> ParsePayload(rtc::Buffer&& payload,
-                                        uint32_t timestamp) /* override */ {
-    std::vector<ParseResult> results;
-    if (fec_enabled_) {
-      std::unique_ptr<MockFrame> fec_frame(new MockFrame(num_channels_));
-      results.emplace_back(timestamp - kPacketDuration, 1,
-                           std::move(fec_frame));
-    }
-
-    std::unique_ptr<MockFrame> frame(new MockFrame(num_channels_));
-    results.emplace_back(timestamp, 0, std::move(frame));
-    return results;
-  }
-
-  int PacketDuration(const uint8_t* encoded, size_t encoded_len) const
-  /* override */ {
-    ADD_FAILURE() << "Since going through ParsePayload, PacketDuration should "
-                     "never get called.";
-    return kPacketDuration;
-  }
-
-  bool PacketHasFec(
-      const uint8_t* encoded, size_t encoded_len) const /* override */ {
-    ADD_FAILURE() << "Since going through ParsePayload, PacketHasFec should "
-                     "never get called.";
-    return fec_enabled_;
-  }
-
-  int SampleRateHz() const /* override */ { return sample_rate_hz_; }
-
-  size_t Channels() const /* override */ { return num_channels_; }
-
-  void set_fec_enabled(bool enable_fec) { fec_enabled_ = enable_fec; }
-
-  bool fec_enabled() const { return fec_enabled_; }
-
- protected:
-  int DecodeInternal(const uint8_t* encoded,
-                     size_t encoded_len,
-                     int sample_rate_hz,
-                     int16_t* decoded,
-                     SpeechType* speech_type) /* override */ {
-    ADD_FAILURE() << "Since going through ParsePayload, DecodeInternal should "
-                     "never get called.";
-    return -1;
-  }
-
- private:
-  const int sample_rate_hz_;
-  const size_t num_channels_;
-  bool fec_enabled_;
-};
-
-class NetEqNetworkStatsTest : public NetEqExternalDecoderTest {
- public:
-  static const int kPayloadSizeByte = 30;
-  static const int kFrameSizeMs = 20;
-
-enum logic {
-  kIgnore,
-  kEqual,
-  kSmallerThan,
-  kLargerThan,
-};
-
-struct NetEqNetworkStatsCheck {
-  logic current_buffer_size_ms;
-  logic preferred_buffer_size_ms;
-  logic jitter_peaks_found;
-  logic packet_loss_rate;
-  logic expand_rate;
-  logic speech_expand_rate;
-  logic preemptive_rate;
-  logic accelerate_rate;
-  logic secondary_decoded_rate;
-  logic secondary_discarded_rate;
-  logic clockdrift_ppm;
-  logic added_zero_samples;
-  NetEqNetworkStatistics stats_ref;
-};
-
-NetEqNetworkStatsTest(NetEqDecoder codec,
-                      int sample_rate_hz,
-                      MockAudioDecoder* decoder)
-    : NetEqExternalDecoderTest(codec, sample_rate_hz, decoder),
-      external_decoder_(decoder),
-      samples_per_ms_(sample_rate_hz / 1000),
-      frame_size_samples_(kFrameSizeMs * samples_per_ms_),
-      rtp_generator_(new test::RtpGenerator(samples_per_ms_)),
-      last_lost_time_(0),
-      packet_loss_interval_(0xffffffff) {
-  Init();
-  }
-
-  bool Lost(uint32_t send_time) {
-    if (send_time - last_lost_time_ >= packet_loss_interval_) {
-      last_lost_time_ = send_time;
-      return true;
-    }
-    return false;
-  }
-
-  void SetPacketLossRate(double loss_rate) {
-      packet_loss_interval_ = (loss_rate >= 1e-3 ?
-          static_cast<double>(kFrameSizeMs) / loss_rate : 0xffffffff);
-  }
-
-  // |stats_ref|
-  // expects.x = -1, do not care
-  // expects.x = 0, 'x' in current stats should equal 'x' in |stats_ref|
-  // expects.x = 1, 'x' in current stats should < 'x' in |stats_ref|
-  // expects.x = 2, 'x' in current stats should > 'x' in |stats_ref|
-  void CheckNetworkStatistics(NetEqNetworkStatsCheck expects) {
-    NetEqNetworkStatistics stats;
-    neteq()->NetworkStatistics(&stats);
-
-#define CHECK_NETEQ_NETWORK_STATS(x)\
-  switch (expects.x) {\
-    case kEqual:\
-      EXPECT_EQ(stats.x, expects.stats_ref.x);\
-      break;\
-    case kSmallerThan:\
-      EXPECT_LT(stats.x, expects.stats_ref.x);\
-      break;\
-    case kLargerThan:\
-      EXPECT_GT(stats.x, expects.stats_ref.x);\
-      break;\
-    default:\
-      break;\
-  }
-
-    CHECK_NETEQ_NETWORK_STATS(current_buffer_size_ms);
-    CHECK_NETEQ_NETWORK_STATS(preferred_buffer_size_ms);
-    CHECK_NETEQ_NETWORK_STATS(jitter_peaks_found);
-    CHECK_NETEQ_NETWORK_STATS(packet_loss_rate);
-    CHECK_NETEQ_NETWORK_STATS(expand_rate);
-    CHECK_NETEQ_NETWORK_STATS(speech_expand_rate);
-    CHECK_NETEQ_NETWORK_STATS(preemptive_rate);
-    CHECK_NETEQ_NETWORK_STATS(accelerate_rate);
-    CHECK_NETEQ_NETWORK_STATS(secondary_decoded_rate);
-    CHECK_NETEQ_NETWORK_STATS(secondary_discarded_rate);
-    CHECK_NETEQ_NETWORK_STATS(clockdrift_ppm);
-    CHECK_NETEQ_NETWORK_STATS(added_zero_samples);
-
-#undef CHECK_NETEQ_NETWORK_STATS
-
-    // Compare with CurrentDelay, which should be identical.
-    EXPECT_EQ(stats.current_buffer_size_ms, neteq()->CurrentDelayMs());
-  }
-
-  void RunTest(int num_loops, NetEqNetworkStatsCheck expects) {
-    uint32_t time_now;
-    uint32_t next_send_time;
-
-    // Initiate |last_lost_time_|.
-    time_now = next_send_time = last_lost_time_ =
-        rtp_generator_->GetRtpHeader(kPayloadType, frame_size_samples_,
-                                     &rtp_header_);
-    for (int k = 0; k < num_loops; ++k) {
-      // Delay by one frame such that the FEC can come in.
-      while (time_now + kFrameSizeMs >= next_send_time) {
-        next_send_time = rtp_generator_->GetRtpHeader(kPayloadType,
-                                                      frame_size_samples_,
-                                                      &rtp_header_);
-        if (!Lost(next_send_time)) {
-          static const uint8_t payload[kPayloadSizeByte] = {0};
-          InsertPacket(rtp_header_, payload, next_send_time);
-        }
-      }
-      GetOutputAudio(&output_frame_);
-      time_now += kOutputLengthMs;
-    }
-    CheckNetworkStatistics(expects);
-    neteq()->FlushBuffers();
-  }
-
-  void DecodeFecTest() {
-    external_decoder_->set_fec_enabled(false);
-    NetEqNetworkStatsCheck expects = {
-      kIgnore,  // current_buffer_size_ms
-      kIgnore,  // preferred_buffer_size_ms
-      kIgnore,  // jitter_peaks_found
-      kEqual,  // packet_loss_rate
-      kEqual,  // expand_rate
-      kEqual,  // voice_expand_rate
-      kIgnore,  // preemptive_rate
-      kEqual,  // accelerate_rate
-      kEqual,  // decoded_fec_rate
-      kEqual,  // discarded_fec_rate
-      kIgnore,  // clockdrift_ppm
-      kEqual,  // added_zero_samples
-      {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
-    };
-    RunTest(50, expects);
-
-    // Next we introduce packet losses.
-    SetPacketLossRate(0.1);
-    expects.stats_ref.packet_loss_rate = 1337;
-    expects.stats_ref.expand_rate = expects.stats_ref.speech_expand_rate = 1065;
-    RunTest(50, expects);
-
-    // Next we enable FEC.
-    external_decoder_->set_fec_enabled(true);
-    // If FEC fills in the lost packets, no packet loss will be counted.
-    expects.stats_ref.packet_loss_rate = 0;
-    expects.stats_ref.expand_rate = expects.stats_ref.speech_expand_rate = 0;
-    expects.stats_ref.secondary_decoded_rate = 2006;
-    expects.stats_ref.secondary_discarded_rate = 14336;
-    RunTest(50, expects);
-  }
-
-  void NoiseExpansionTest() {
-    NetEqNetworkStatsCheck expects = {
-      kIgnore,  // current_buffer_size_ms
-      kIgnore,  // preferred_buffer_size_ms
-      kIgnore,  // jitter_peaks_found
-      kEqual,  // packet_loss_rate
-      kEqual,  // expand_rate
-      kEqual,  // speech_expand_rate
-      kIgnore,  // preemptive_rate
-      kEqual,  // accelerate_rate
-      kEqual,  // decoded_fec_rate
-      kEqual,  // discard_fec_rate
-      kIgnore,  // clockdrift_ppm
-      kEqual,  // added_zero_samples
-      {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
-    };
-    RunTest(50, expects);
-
-    SetPacketLossRate(1);
-    expects.stats_ref.expand_rate = 16384;
-    expects.stats_ref.speech_expand_rate = 5324;
-    RunTest(10, expects);  // Lost 10 * 20ms in a row.
-  }
-
- private:
-  MockAudioDecoder* external_decoder_;
-  const int samples_per_ms_;
-  const size_t frame_size_samples_;
-  std::unique_ptr<test::RtpGenerator> rtp_generator_;
-  RTPHeader rtp_header_;
-  uint32_t last_lost_time_;
-  uint32_t packet_loss_interval_;
-  AudioFrame output_frame_;
-};
-
-TEST(NetEqNetworkStatsTest, DecodeFec) {
-  MockAudioDecoder decoder(48000, 1);
-  NetEqNetworkStatsTest test(NetEqDecoder::kDecoderOpus, 48000, &decoder);
-  test.DecodeFecTest();
-  EXPECT_CALL(decoder, Die()).Times(1);
-}
-
-TEST(NetEqNetworkStatsTest, StereoDecodeFec) {
-  MockAudioDecoder decoder(48000, 2);
-  NetEqNetworkStatsTest test(NetEqDecoder::kDecoderOpus, 48000, &decoder);
-  test.DecodeFecTest();
-  EXPECT_CALL(decoder, Die()).Times(1);
-}
-
-TEST(NetEqNetworkStatsTest, NoiseExpansionTest) {
-  MockAudioDecoder decoder(48000, 1);
-  NetEqNetworkStatsTest test(NetEqDecoder::kDecoderOpus, 48000, &decoder);
-  test.NoiseExpansionTest();
-  EXPECT_CALL(decoder, Die()).Times(1);
-}
-
-}  // namespace test
-}  // namespace webrtc
diff --git a/modules/audio_coding/neteq/neteq_stereo_unittest.cc b/modules/audio_coding/neteq/neteq_stereo_unittest.cc
deleted file mode 100644
index 7c25dd4..0000000
--- a/modules/audio_coding/neteq/neteq_stereo_unittest.cc
+++ /dev/null
@@ -1,442 +0,0 @@
-/*
- *  Copyright (c) 2013 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.
- */
-
-// Test to verify correct stereo and multi-channel operation.
-
-#include <algorithm>
-#include <memory>
-#include <string>
-#include <list>
-
-#include "webrtc/api/audio_codecs/builtin_audio_decoder_factory.h"
-#include "webrtc/common_types.h"
-#include "webrtc/modules/audio_coding/codecs/pcm16b/pcm16b.h"
-#include "webrtc/modules/audio_coding/neteq/include/neteq.h"
-#include "webrtc/modules/audio_coding/neteq/tools/input_audio_file.h"
-#include "webrtc/modules/audio_coding/neteq/tools/rtp_generator.h"
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/testsupport/fileutils.h"
-
-namespace webrtc {
-
-struct TestParameters {
-  int frame_size;
-  int sample_rate;
-  size_t num_channels;
-};
-
-// This is a parameterized test. The test parameters are supplied through a
-// TestParameters struct, which is obtained through the GetParam() method.
-//
-// The objective of the test is to create a mono input signal and a
-// multi-channel input signal, where each channel is identical to the mono
-// input channel. The two input signals are processed through their respective
-// NetEq instances. After that, the output signals are compared. The expected
-// result is that each channel in the multi-channel output is identical to the
-// mono output.
-class NetEqStereoTest : public ::testing::TestWithParam<TestParameters> {
- protected:
-  static const int kTimeStepMs = 10;
-  static const size_t kMaxBlockSize = 480;  // 10 ms @ 48 kHz.
-  static const uint8_t kPayloadTypeMono = 95;
-  static const uint8_t kPayloadTypeMulti = 96;
-
-  NetEqStereoTest()
-      : num_channels_(GetParam().num_channels),
-        sample_rate_hz_(GetParam().sample_rate),
-        samples_per_ms_(sample_rate_hz_ / 1000),
-        frame_size_ms_(GetParam().frame_size),
-        frame_size_samples_(
-            static_cast<size_t>(frame_size_ms_ * samples_per_ms_)),
-        output_size_samples_(10 * samples_per_ms_),
-        rtp_generator_mono_(samples_per_ms_),
-        rtp_generator_(samples_per_ms_),
-        payload_size_bytes_(0),
-        multi_payload_size_bytes_(0),
-        last_send_time_(0),
-        last_arrival_time_(0) {
-    NetEq::Config config;
-    config.sample_rate_hz = sample_rate_hz_;
-    rtc::scoped_refptr<AudioDecoderFactory> factory =
-        CreateBuiltinAudioDecoderFactory();
-    neteq_mono_ = NetEq::Create(config, factory);
-    neteq_ = NetEq::Create(config, factory);
-    input_ = new int16_t[frame_size_samples_];
-    encoded_ = new uint8_t[2 * frame_size_samples_];
-    input_multi_channel_ = new int16_t[frame_size_samples_ * num_channels_];
-    encoded_multi_channel_ = new uint8_t[frame_size_samples_ * 2 *
-                                         num_channels_];
-  }
-
-  ~NetEqStereoTest() {
-    delete neteq_mono_;
-    delete neteq_;
-    delete [] input_;
-    delete [] encoded_;
-    delete [] input_multi_channel_;
-    delete [] encoded_multi_channel_;
-  }
-
-  virtual void SetUp() {
-    const std::string file_name =
-        webrtc::test::ResourcePath("audio_coding/testfile32kHz", "pcm");
-    input_file_.reset(new test::InputAudioFile(file_name));
-    NetEqDecoder mono_decoder;
-    NetEqDecoder multi_decoder;
-    switch (sample_rate_hz_) {
-      case 8000:
-        mono_decoder = NetEqDecoder::kDecoderPCM16B;
-        if (num_channels_ == 2) {
-          multi_decoder = NetEqDecoder::kDecoderPCM16B_2ch;
-        } else if (num_channels_ == 5) {
-          multi_decoder = NetEqDecoder::kDecoderPCM16B_5ch;
-        } else {
-          FAIL() << "Only 2 and 5 channels supported for 8000 Hz.";
-        }
-        break;
-      case 16000:
-        mono_decoder = NetEqDecoder::kDecoderPCM16Bwb;
-        if (num_channels_ == 2) {
-          multi_decoder = NetEqDecoder::kDecoderPCM16Bwb_2ch;
-        } else {
-          FAIL() << "More than 2 channels is not supported for 16000 Hz.";
-        }
-        break;
-      case 32000:
-        mono_decoder = NetEqDecoder::kDecoderPCM16Bswb32kHz;
-        if (num_channels_ == 2) {
-          multi_decoder = NetEqDecoder::kDecoderPCM16Bswb32kHz_2ch;
-        } else {
-          FAIL() << "More than 2 channels is not supported for 32000 Hz.";
-        }
-        break;
-      case 48000:
-        mono_decoder = NetEqDecoder::kDecoderPCM16Bswb48kHz;
-        if (num_channels_ == 2) {
-          multi_decoder = NetEqDecoder::kDecoderPCM16Bswb48kHz_2ch;
-        } else {
-          FAIL() << "More than 2 channels is not supported for 48000 Hz.";
-        }
-        break;
-      default:
-        FAIL() << "We shouldn't get here.";
-    }
-    ASSERT_EQ(NetEq::kOK, neteq_mono_->RegisterPayloadType(mono_decoder, "mono",
-                                                           kPayloadTypeMono));
-    ASSERT_EQ(NetEq::kOK,
-              neteq_->RegisterPayloadType(multi_decoder, "multi-channel",
-                                          kPayloadTypeMulti));
-  }
-
-  virtual void TearDown() {}
-
-  int GetNewPackets() {
-    if (!input_file_->Read(frame_size_samples_, input_)) {
-      return -1;
-    }
-    payload_size_bytes_ = WebRtcPcm16b_Encode(input_, frame_size_samples_,
-                                             encoded_);
-    if (frame_size_samples_ * 2 != payload_size_bytes_) {
-      return -1;
-    }
-    int next_send_time = rtp_generator_mono_.GetRtpHeader(kPayloadTypeMono,
-                                                          frame_size_samples_,
-                                                          &rtp_header_mono_);
-    test::InputAudioFile::DuplicateInterleaved(input_, frame_size_samples_,
-                                               num_channels_,
-                                               input_multi_channel_);
-    multi_payload_size_bytes_ = WebRtcPcm16b_Encode(
-        input_multi_channel_, frame_size_samples_ * num_channels_,
-        encoded_multi_channel_);
-    if (frame_size_samples_ * 2 * num_channels_ != multi_payload_size_bytes_) {
-      return -1;
-    }
-    rtp_generator_.GetRtpHeader(kPayloadTypeMulti, frame_size_samples_,
-                                &rtp_header_);
-    return next_send_time;
-  }
-
-  virtual void VerifyOutput(size_t num_samples) {
-    const int16_t* output_data = output_.data();
-    const int16_t* output_multi_channel_data = output_multi_channel_.data();
-    for (size_t i = 0; i < num_samples; ++i) {
-      for (size_t j = 0; j < num_channels_; ++j) {
-        ASSERT_EQ(output_data[i],
-                  output_multi_channel_data[i * num_channels_ + j])
-            << "Diff in sample " << i << ", channel " << j << ".";
-      }
-    }
-  }
-
-  virtual int GetArrivalTime(int send_time) {
-    int arrival_time = last_arrival_time_ + (send_time - last_send_time_);
-    last_send_time_ = send_time;
-    last_arrival_time_ = arrival_time;
-    return arrival_time;
-  }
-
-  virtual bool Lost() { return false; }
-
-  void RunTest(int num_loops) {
-    // Get next input packets (mono and multi-channel).
-    int next_send_time;
-    int next_arrival_time;
-    do {
-      next_send_time = GetNewPackets();
-      ASSERT_NE(-1, next_send_time);
-      next_arrival_time = GetArrivalTime(next_send_time);
-    } while (Lost());  // If lost, immediately read the next packet.
-
-    int time_now = 0;
-    for (int k = 0; k < num_loops; ++k) {
-      while (time_now >= next_arrival_time) {
-        // Insert packet in mono instance.
-        ASSERT_EQ(NetEq::kOK,
-                  neteq_mono_->InsertPacket(rtp_header_mono_,
-                                            rtc::ArrayView<const uint8_t>(
-                                                encoded_, payload_size_bytes_),
-                                            next_arrival_time));
-        // Insert packet in multi-channel instance.
-        ASSERT_EQ(NetEq::kOK,
-                  neteq_->InsertPacket(
-                      rtp_header_,
-                      rtc::ArrayView<const uint8_t>(encoded_multi_channel_,
-                                                    multi_payload_size_bytes_),
-                      next_arrival_time));
-        // Get next input packets (mono and multi-channel).
-        do {
-          next_send_time = GetNewPackets();
-          ASSERT_NE(-1, next_send_time);
-          next_arrival_time = GetArrivalTime(next_send_time);
-        } while (Lost());  // If lost, immediately read the next packet.
-      }
-      // Get audio from mono instance.
-      bool muted;
-      EXPECT_EQ(NetEq::kOK, neteq_mono_->GetAudio(&output_, &muted));
-      ASSERT_FALSE(muted);
-      EXPECT_EQ(1u, output_.num_channels_);
-      EXPECT_EQ(output_size_samples_, output_.samples_per_channel_);
-      // Get audio from multi-channel instance.
-      ASSERT_EQ(NetEq::kOK, neteq_->GetAudio(&output_multi_channel_, &muted));
-      ASSERT_FALSE(muted);
-      EXPECT_EQ(num_channels_, output_multi_channel_.num_channels_);
-      EXPECT_EQ(output_size_samples_,
-                output_multi_channel_.samples_per_channel_);
-      std::ostringstream ss;
-      ss << "Lap number " << k << ".";
-      SCOPED_TRACE(ss.str());  // Print out the parameter values on failure.
-      // Compare mono and multi-channel.
-      ASSERT_NO_FATAL_FAILURE(VerifyOutput(output_size_samples_));
-
-      time_now += kTimeStepMs;
-    }
-  }
-
-  const size_t num_channels_;
-  const int sample_rate_hz_;
-  const int samples_per_ms_;
-  const int frame_size_ms_;
-  const size_t frame_size_samples_;
-  const size_t output_size_samples_;
-  NetEq* neteq_mono_;
-  NetEq* neteq_;
-  test::RtpGenerator rtp_generator_mono_;
-  test::RtpGenerator rtp_generator_;
-  int16_t* input_;
-  int16_t* input_multi_channel_;
-  uint8_t* encoded_;
-  uint8_t* encoded_multi_channel_;
-  AudioFrame output_;
-  AudioFrame output_multi_channel_;
-  RTPHeader rtp_header_mono_;
-  RTPHeader rtp_header_;
-  size_t payload_size_bytes_;
-  size_t multi_payload_size_bytes_;
-  int last_send_time_;
-  int last_arrival_time_;
-  std::unique_ptr<test::InputAudioFile> input_file_;
-};
-
-class NetEqStereoTestNoJitter : public NetEqStereoTest {
- protected:
-  NetEqStereoTestNoJitter()
-      : NetEqStereoTest() {
-    // Start the sender 100 ms before the receiver to pre-fill the buffer.
-    // This is to avoid doing preemptive expand early in the test.
-    // TODO(hlundin): Mock the decision making instead to control the modes.
-    last_arrival_time_ = -100;
-  }
-};
-
-TEST_P(NetEqStereoTestNoJitter, RunTest) {
-  RunTest(8);
-}
-
-class NetEqStereoTestPositiveDrift : public NetEqStereoTest {
- protected:
-  NetEqStereoTestPositiveDrift()
-      : NetEqStereoTest(),
-        drift_factor(0.9) {
-    // Start the sender 100 ms before the receiver to pre-fill the buffer.
-    // This is to avoid doing preemptive expand early in the test.
-    // TODO(hlundin): Mock the decision making instead to control the modes.
-    last_arrival_time_ = -100;
-  }
-  virtual int GetArrivalTime(int send_time) {
-    int arrival_time = last_arrival_time_ +
-        drift_factor * (send_time - last_send_time_);
-    last_send_time_ = send_time;
-    last_arrival_time_ = arrival_time;
-    return arrival_time;
-  }
-
-  double drift_factor;
-};
-
-TEST_P(NetEqStereoTestPositiveDrift, RunTest) {
-  RunTest(100);
-}
-
-class NetEqStereoTestNegativeDrift : public NetEqStereoTestPositiveDrift {
- protected:
-  NetEqStereoTestNegativeDrift()
-      : NetEqStereoTestPositiveDrift() {
-    drift_factor = 1.1;
-    last_arrival_time_ = 0;
-  }
-};
-
-TEST_P(NetEqStereoTestNegativeDrift, RunTest) {
-  RunTest(100);
-}
-
-class NetEqStereoTestDelays : public NetEqStereoTest {
- protected:
-  static const int kDelayInterval = 10;
-  static const int kDelay = 1000;
-  NetEqStereoTestDelays()
-      : NetEqStereoTest(),
-        frame_index_(0) {
-  }
-
-  virtual int GetArrivalTime(int send_time) {
-    // Deliver immediately, unless we have a back-log.
-    int arrival_time = std::min(last_arrival_time_, send_time);
-    if (++frame_index_ % kDelayInterval == 0) {
-      // Delay this packet.
-      arrival_time += kDelay;
-    }
-    last_send_time_ = send_time;
-    last_arrival_time_ = arrival_time;
-    return arrival_time;
-  }
-
-  int frame_index_;
-};
-
-TEST_P(NetEqStereoTestDelays, RunTest) {
-  RunTest(1000);
-}
-
-class NetEqStereoTestLosses : public NetEqStereoTest {
- protected:
-  static const int kLossInterval = 10;
-  NetEqStereoTestLosses()
-      : NetEqStereoTest(),
-        frame_index_(0) {
-  }
-
-  virtual bool Lost() {
-    return (++frame_index_) % kLossInterval == 0;
-  }
-
-  // TODO(hlundin): NetEq is not giving bitexact results for these cases.
-  virtual void VerifyOutput(size_t num_samples) {
-    for (size_t i = 0; i < num_samples; ++i) {
-      const int16_t* output_data = output_.data();
-      const int16_t* output_multi_channel_data = output_multi_channel_.data();
-      auto first_channel_sample =
-          output_multi_channel_data[i * num_channels_];
-      for (size_t j = 0; j < num_channels_; ++j) {
-        const int kErrorMargin = 200;
-        EXPECT_NEAR(output_data[i],
-                    output_multi_channel_data[i * num_channels_ + j],
-                    kErrorMargin)
-            << "Diff in sample " << i << ", channel " << j << ".";
-        EXPECT_EQ(first_channel_sample,
-                  output_multi_channel_data[i * num_channels_ + j]);
-      }
-    }
-  }
-
-  int frame_index_;
-};
-
-TEST_P(NetEqStereoTestLosses, RunTest) {
-  RunTest(100);
-}
-
-
-// Creates a list of parameter sets.
-std::list<TestParameters> GetTestParameters() {
-  std::list<TestParameters> l;
-  const int sample_rates[] = {8000, 16000, 32000};
-  const int num_rates = sizeof(sample_rates) / sizeof(sample_rates[0]);
-  // Loop through sample rates.
-  for (int rate_index = 0; rate_index < num_rates; ++rate_index) {
-    int sample_rate = sample_rates[rate_index];
-    // Loop through all frame sizes between 10 and 60 ms.
-    for (int frame_size = 10; frame_size <= 60; frame_size += 10) {
-      TestParameters p;
-      p.frame_size = frame_size;
-      p.sample_rate = sample_rate;
-      p.num_channels = 2;
-      l.push_back(p);
-      if (sample_rate == 8000) {
-        // Add a five-channel test for 8000 Hz.
-        p.num_channels = 5;
-        l.push_back(p);
-      }
-    }
-  }
-  return l;
-}
-
-// Pretty-printing the test parameters in case of an error.
-void PrintTo(const TestParameters& p, ::std::ostream* os) {
-  *os << "{frame_size = " << p.frame_size <<
-      ", num_channels = " << p.num_channels <<
-      ", sample_rate = " << p.sample_rate << "}";
-}
-
-// Instantiate the tests. Each test is instantiated using the function above,
-// so that all different parameter combinations are tested.
-INSTANTIATE_TEST_CASE_P(MultiChannel,
-                        NetEqStereoTestNoJitter,
-                        ::testing::ValuesIn(GetTestParameters()));
-
-INSTANTIATE_TEST_CASE_P(MultiChannel,
-                        NetEqStereoTestPositiveDrift,
-                        ::testing::ValuesIn(GetTestParameters()));
-
-INSTANTIATE_TEST_CASE_P(MultiChannel,
-                        NetEqStereoTestNegativeDrift,
-                        ::testing::ValuesIn(GetTestParameters()));
-
-INSTANTIATE_TEST_CASE_P(MultiChannel,
-                        NetEqStereoTestDelays,
-                        ::testing::ValuesIn(GetTestParameters()));
-
-INSTANTIATE_TEST_CASE_P(MultiChannel,
-                        NetEqStereoTestLosses,
-                        ::testing::ValuesIn(GetTestParameters()));
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/neteq/neteq_unittest.cc b/modules/audio_coding/neteq/neteq_unittest.cc
deleted file mode 100644
index 303973c..0000000
--- a/modules/audio_coding/neteq/neteq_unittest.cc
+++ /dev/null
@@ -1,1637 +0,0 @@
-/*
- *  Copyright (c) 2011 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/neteq/include/neteq.h"
-
-#include <math.h>
-#include <stdlib.h>
-#include <string.h>  // memset
-
-#include <algorithm>
-#include <memory>
-#include <set>
-#include <string>
-#include <vector>
-
-#include "webrtc/api/audio_codecs/builtin_audio_decoder_factory.h"
-#include "webrtc/common_types.h"
-#include "webrtc/modules/audio_coding/codecs/pcm16b/pcm16b.h"
-#include "webrtc/modules/audio_coding/neteq/tools/audio_loop.h"
-#include "webrtc/modules/audio_coding/neteq/tools/rtp_file_source.h"
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/rtc_base/flags.h"
-#include "webrtc/rtc_base/ignore_wundef.h"
-#include "webrtc/rtc_base/protobuf_utils.h"
-#include "webrtc/rtc_base/sha1digest.h"
-#include "webrtc/rtc_base/stringencode.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/testsupport/fileutils.h"
-#include "webrtc/typedefs.h"
-
-#ifdef WEBRTC_NETEQ_UNITTEST_BITEXACT
-RTC_PUSH_IGNORING_WUNDEF()
-#ifdef WEBRTC_ANDROID_PLATFORM_BUILD
-#include "external/webrtc/webrtc/modules/audio_coding/neteq/neteq_unittest.pb.h"
-#else
-#include "webrtc/modules/audio_coding/neteq/neteq_unittest.pb.h"
-#endif
-RTC_POP_IGNORING_WUNDEF()
-#endif
-
-DEFINE_bool(gen_ref, false, "Generate reference files.");
-
-namespace webrtc {
-
-namespace {
-
-const std::string& PlatformChecksum(const std::string& checksum_general,
-                                    const std::string& checksum_android,
-                                    const std::string& checksum_win_32,
-                                    const std::string& checksum_win_64) {
-#if defined(WEBRTC_ANDROID)
-    return checksum_android;
-#elif defined(WEBRTC_WIN)
-  #ifdef WEBRTC_ARCH_64_BITS
-    return checksum_win_64;
-  #else
-    return checksum_win_32;
-  #endif  // WEBRTC_ARCH_64_BITS
-#else
-  return checksum_general;
-#endif  // WEBRTC_WIN
-}
-
-#ifdef WEBRTC_NETEQ_UNITTEST_BITEXACT
-void Convert(const webrtc::NetEqNetworkStatistics& stats_raw,
-             webrtc::neteq_unittest::NetEqNetworkStatistics* stats) {
-  stats->set_current_buffer_size_ms(stats_raw.current_buffer_size_ms);
-  stats->set_preferred_buffer_size_ms(stats_raw.preferred_buffer_size_ms);
-  stats->set_jitter_peaks_found(stats_raw.jitter_peaks_found);
-  stats->set_packet_loss_rate(stats_raw.packet_loss_rate);
-  stats->set_expand_rate(stats_raw.expand_rate);
-  stats->set_speech_expand_rate(stats_raw.speech_expand_rate);
-  stats->set_preemptive_rate(stats_raw.preemptive_rate);
-  stats->set_accelerate_rate(stats_raw.accelerate_rate);
-  stats->set_secondary_decoded_rate(stats_raw.secondary_decoded_rate);
-  stats->set_secondary_discarded_rate(stats_raw.secondary_discarded_rate);
-  stats->set_clockdrift_ppm(stats_raw.clockdrift_ppm);
-  stats->set_added_zero_samples(stats_raw.added_zero_samples);
-  stats->set_mean_waiting_time_ms(stats_raw.mean_waiting_time_ms);
-  stats->set_median_waiting_time_ms(stats_raw.median_waiting_time_ms);
-  stats->set_min_waiting_time_ms(stats_raw.min_waiting_time_ms);
-  stats->set_max_waiting_time_ms(stats_raw.max_waiting_time_ms);
-}
-
-void Convert(const webrtc::RtcpStatistics& stats_raw,
-             webrtc::neteq_unittest::RtcpStatistics* stats) {
-  stats->set_fraction_lost(stats_raw.fraction_lost);
-  stats->set_cumulative_lost(stats_raw.packets_lost);
-  stats->set_extended_max_sequence_number(
-      stats_raw.extended_highest_sequence_number);
-  stats->set_jitter(stats_raw.jitter);
-}
-
-void AddMessage(FILE* file, rtc::MessageDigest* digest,
-                const std::string& message) {
-  int32_t size = message.length();
-  if (file)
-    ASSERT_EQ(1u, fwrite(&size, sizeof(size), 1, file));
-  digest->Update(&size, sizeof(size));
-
-  if (file)
-    ASSERT_EQ(static_cast<size_t>(size),
-              fwrite(message.data(), sizeof(char), size, file));
-  digest->Update(message.data(), sizeof(char) * size);
-}
-
-#endif  // WEBRTC_NETEQ_UNITTEST_BITEXACT
-
-void LoadDecoders(webrtc::NetEq* neteq) {
-  ASSERT_EQ(true,
-            neteq->RegisterPayloadType(0, SdpAudioFormat("pcmu", 8000, 1)));
-  // Use non-SdpAudioFormat argument when registering PCMa, so that we get test
-  // coverage for that as well.
-  ASSERT_EQ(0, neteq->RegisterPayloadType(webrtc::NetEqDecoder::kDecoderPCMa,
-                                          "pcma", 8));
-#ifdef WEBRTC_CODEC_ILBC
-  ASSERT_EQ(true,
-            neteq->RegisterPayloadType(102, SdpAudioFormat("ilbc", 8000, 1)));
-#endif
-#if defined(WEBRTC_CODEC_ISAC) || defined(WEBRTC_CODEC_ISACFX)
-  ASSERT_EQ(true,
-            neteq->RegisterPayloadType(103, SdpAudioFormat("isac", 16000, 1)));
-#endif
-#ifdef WEBRTC_CODEC_ISAC
-  ASSERT_EQ(true,
-            neteq->RegisterPayloadType(104, SdpAudioFormat("isac", 32000, 1)));
-#endif
-#ifdef WEBRTC_CODEC_OPUS
-  ASSERT_EQ(true,
-            neteq->RegisterPayloadType(
-                111, SdpAudioFormat("opus", 48000, 2, {{"stereo", "0"}})));
-#endif
-  ASSERT_EQ(true,
-            neteq->RegisterPayloadType(93, SdpAudioFormat("L16", 8000, 1)));
-  ASSERT_EQ(true,
-            neteq->RegisterPayloadType(94, SdpAudioFormat("L16", 16000, 1)));
-  ASSERT_EQ(true,
-            neteq->RegisterPayloadType(95, SdpAudioFormat("L16", 32000, 1)));
-  ASSERT_EQ(true,
-            neteq->RegisterPayloadType(13, SdpAudioFormat("cn", 8000, 1)));
-  ASSERT_EQ(true,
-            neteq->RegisterPayloadType(98, SdpAudioFormat("cn", 16000, 1)));
-}
-}  // namespace
-
-class ResultSink {
- public:
-  explicit ResultSink(const std::string& output_file);
-  ~ResultSink();
-
-  template<typename T> void AddResult(const T* test_results, size_t length);
-
-  void AddResult(const NetEqNetworkStatistics& stats);
-  void AddResult(const RtcpStatistics& stats);
-
-  void VerifyChecksum(const std::string& ref_check_sum);
-
- private:
-  FILE* output_fp_;
-  std::unique_ptr<rtc::MessageDigest> digest_;
-};
-
-ResultSink::ResultSink(const std::string &output_file)
-    : output_fp_(nullptr),
-      digest_(new rtc::Sha1Digest()) {
-  if (!output_file.empty()) {
-    output_fp_ = fopen(output_file.c_str(), "wb");
-    EXPECT_TRUE(output_fp_ != NULL);
-  }
-}
-
-ResultSink::~ResultSink() {
-  if (output_fp_)
-    fclose(output_fp_);
-}
-
-template<typename T>
-void ResultSink::AddResult(const T* test_results, size_t length) {
-  if (output_fp_) {
-    ASSERT_EQ(length, fwrite(test_results, sizeof(T), length, output_fp_));
-  }
-  digest_->Update(test_results, sizeof(T) * length);
-}
-
-void ResultSink::AddResult(const NetEqNetworkStatistics& stats_raw) {
-#ifdef WEBRTC_NETEQ_UNITTEST_BITEXACT
-  neteq_unittest::NetEqNetworkStatistics stats;
-  Convert(stats_raw, &stats);
-
-  ProtoString stats_string;
-  ASSERT_TRUE(stats.SerializeToString(&stats_string));
-  AddMessage(output_fp_, digest_.get(), stats_string);
-#else
-  FAIL() << "Writing to reference file requires Proto Buffer.";
-#endif  // WEBRTC_NETEQ_UNITTEST_BITEXACT
-}
-
-void ResultSink::AddResult(const RtcpStatistics& stats_raw) {
-#ifdef WEBRTC_NETEQ_UNITTEST_BITEXACT
-  neteq_unittest::RtcpStatistics stats;
-  Convert(stats_raw, &stats);
-
-  ProtoString stats_string;
-  ASSERT_TRUE(stats.SerializeToString(&stats_string));
-  AddMessage(output_fp_, digest_.get(), stats_string);
-#else
-  FAIL() << "Writing to reference file requires Proto Buffer.";
-#endif  // WEBRTC_NETEQ_UNITTEST_BITEXACT
-}
-
-void ResultSink::VerifyChecksum(const std::string& checksum) {
-  std::vector<char> buffer;
-  buffer.resize(digest_->Size());
-  digest_->Finish(&buffer[0], buffer.size());
-  const std::string result = rtc::hex_encode(&buffer[0], digest_->Size());
-  EXPECT_EQ(checksum, result);
-}
-
-class NetEqDecodingTest : public ::testing::Test {
- protected:
-  // NetEQ must be polled for data once every 10 ms. Thus, neither of the
-  // constants below can be changed.
-  static const int kTimeStepMs = 10;
-  static const size_t kBlockSize8kHz = kTimeStepMs * 8;
-  static const size_t kBlockSize16kHz = kTimeStepMs * 16;
-  static const size_t kBlockSize32kHz = kTimeStepMs * 32;
-  static const size_t kBlockSize48kHz = kTimeStepMs * 48;
-  static const int kInitSampleRateHz = 8000;
-
-  NetEqDecodingTest();
-  virtual void SetUp();
-  virtual void TearDown();
-  void SelectDecoders(NetEqDecoder* used_codec);
-  void OpenInputFile(const std::string &rtp_file);
-  void Process();
-
-  void DecodeAndCompare(const std::string& rtp_file,
-                        const std::string& output_checksum,
-                        const std::string& network_stats_checksum,
-                        const std::string& rtcp_stats_checksum,
-                        bool gen_ref);
-
-  static void PopulateRtpInfo(int frame_index,
-                              int timestamp,
-                              RTPHeader* rtp_info);
-  static void PopulateCng(int frame_index,
-                          int timestamp,
-                          RTPHeader* rtp_info,
-                          uint8_t* payload,
-                          size_t* payload_len);
-
-  void WrapTest(uint16_t start_seq_no, uint32_t start_timestamp,
-                const std::set<uint16_t>& drop_seq_numbers,
-                bool expect_seq_no_wrap, bool expect_timestamp_wrap);
-
-  void LongCngWithClockDrift(double drift_factor,
-                             double network_freeze_ms,
-                             bool pull_audio_during_freeze,
-                             int delay_tolerance_ms,
-                             int max_time_to_speech_ms);
-
-  void DuplicateCng();
-
-  NetEq* neteq_;
-  NetEq::Config config_;
-  std::unique_ptr<test::RtpFileSource> rtp_source_;
-  std::unique_ptr<test::Packet> packet_;
-  unsigned int sim_clock_;
-  AudioFrame out_frame_;
-  int output_sample_rate_;
-  int algorithmic_delay_ms_;
-};
-
-// Allocating the static const so that it can be passed by reference.
-const int NetEqDecodingTest::kTimeStepMs;
-const size_t NetEqDecodingTest::kBlockSize8kHz;
-const size_t NetEqDecodingTest::kBlockSize16kHz;
-const size_t NetEqDecodingTest::kBlockSize32kHz;
-const int NetEqDecodingTest::kInitSampleRateHz;
-
-NetEqDecodingTest::NetEqDecodingTest()
-    : neteq_(NULL),
-      config_(),
-      sim_clock_(0),
-      output_sample_rate_(kInitSampleRateHz),
-      algorithmic_delay_ms_(0) {
-  config_.sample_rate_hz = kInitSampleRateHz;
-}
-
-void NetEqDecodingTest::SetUp() {
-  neteq_ = NetEq::Create(config_, CreateBuiltinAudioDecoderFactory());
-  NetEqNetworkStatistics stat;
-  ASSERT_EQ(0, neteq_->NetworkStatistics(&stat));
-  algorithmic_delay_ms_ = stat.current_buffer_size_ms;
-  ASSERT_TRUE(neteq_);
-  LoadDecoders(neteq_);
-}
-
-void NetEqDecodingTest::TearDown() {
-  delete neteq_;
-}
-
-void NetEqDecodingTest::OpenInputFile(const std::string &rtp_file) {
-  rtp_source_.reset(test::RtpFileSource::Create(rtp_file));
-}
-
-void NetEqDecodingTest::Process() {
-  // Check if time to receive.
-  while (packet_ && sim_clock_ >= packet_->time_ms()) {
-    if (packet_->payload_length_bytes() > 0) {
-#ifndef WEBRTC_CODEC_ISAC
-      // Ignore payload type 104 (iSAC-swb) if ISAC is not supported.
-      if (packet_->header().payloadType != 104)
-#endif
-        ASSERT_EQ(0,
-                  neteq_->InsertPacket(
-                      packet_->header(),
-                      rtc::ArrayView<const uint8_t>(
-                          packet_->payload(), packet_->payload_length_bytes()),
-                      static_cast<uint32_t>(packet_->time_ms() *
-                                            (output_sample_rate_ / 1000))));
-    }
-    // Get next packet.
-    packet_ = rtp_source_->NextPacket();
-  }
-
-  // Get audio from NetEq.
-  bool muted;
-  ASSERT_EQ(0, neteq_->GetAudio(&out_frame_, &muted));
-  ASSERT_FALSE(muted);
-  ASSERT_TRUE((out_frame_.samples_per_channel_ == kBlockSize8kHz) ||
-              (out_frame_.samples_per_channel_ == kBlockSize16kHz) ||
-              (out_frame_.samples_per_channel_ == kBlockSize32kHz) ||
-              (out_frame_.samples_per_channel_ == kBlockSize48kHz));
-  output_sample_rate_ = out_frame_.sample_rate_hz_;
-  EXPECT_EQ(output_sample_rate_, neteq_->last_output_sample_rate_hz());
-
-  // Increase time.
-  sim_clock_ += kTimeStepMs;
-}
-
-void NetEqDecodingTest::DecodeAndCompare(
-    const std::string& rtp_file,
-    const std::string& output_checksum,
-    const std::string& network_stats_checksum,
-    const std::string& rtcp_stats_checksum,
-    bool gen_ref) {
-  OpenInputFile(rtp_file);
-
-  std::string ref_out_file =
-      gen_ref ? webrtc::test::OutputPath() + "neteq_universal_ref.pcm" : "";
-  ResultSink output(ref_out_file);
-
-  std::string stat_out_file =
-      gen_ref ? webrtc::test::OutputPath() + "neteq_network_stats.dat" : "";
-  ResultSink network_stats(stat_out_file);
-
-  std::string rtcp_out_file =
-      gen_ref ? webrtc::test::OutputPath() + "neteq_rtcp_stats.dat" : "";
-  ResultSink rtcp_stats(rtcp_out_file);
-
-  packet_ = rtp_source_->NextPacket();
-  int i = 0;
-  while (packet_) {
-    std::ostringstream ss;
-    ss << "Lap number " << i++ << " in DecodeAndCompare while loop";
-    SCOPED_TRACE(ss.str());  // Print out the parameter values on failure.
-    ASSERT_NO_FATAL_FAILURE(Process());
-    ASSERT_NO_FATAL_FAILURE(output.AddResult(
-        out_frame_.data(), out_frame_.samples_per_channel_));
-
-    // Query the network statistics API once per second
-    if (sim_clock_ % 1000 == 0) {
-      // Process NetworkStatistics.
-      NetEqNetworkStatistics current_network_stats;
-      ASSERT_EQ(0, neteq_->NetworkStatistics(&current_network_stats));
-      ASSERT_NO_FATAL_FAILURE(network_stats.AddResult(current_network_stats));
-
-      // Compare with CurrentDelay, which should be identical.
-      EXPECT_EQ(current_network_stats.current_buffer_size_ms,
-                neteq_->CurrentDelayMs());
-
-      // Process RTCPstat.
-      RtcpStatistics current_rtcp_stats;
-      neteq_->GetRtcpStatistics(&current_rtcp_stats);
-      ASSERT_NO_FATAL_FAILURE(rtcp_stats.AddResult(current_rtcp_stats));
-    }
-  }
-
-  SCOPED_TRACE("Check output audio.");
-  output.VerifyChecksum(output_checksum);
-  SCOPED_TRACE("Check network stats.");
-  network_stats.VerifyChecksum(network_stats_checksum);
-  SCOPED_TRACE("Check rtcp stats.");
-  rtcp_stats.VerifyChecksum(rtcp_stats_checksum);
-}
-
-void NetEqDecodingTest::PopulateRtpInfo(int frame_index,
-                                        int timestamp,
-                                        RTPHeader* rtp_info) {
-  rtp_info->sequenceNumber = frame_index;
-  rtp_info->timestamp = timestamp;
-  rtp_info->ssrc = 0x1234;     // Just an arbitrary SSRC.
-  rtp_info->payloadType = 94;  // PCM16b WB codec.
-  rtp_info->markerBit = 0;
-}
-
-void NetEqDecodingTest::PopulateCng(int frame_index,
-                                    int timestamp,
-                                    RTPHeader* rtp_info,
-                                    uint8_t* payload,
-                                    size_t* payload_len) {
-  rtp_info->sequenceNumber = frame_index;
-  rtp_info->timestamp = timestamp;
-  rtp_info->ssrc = 0x1234;     // Just an arbitrary SSRC.
-  rtp_info->payloadType = 98;  // WB CNG.
-  rtp_info->markerBit = 0;
-  payload[0] = 64;  // Noise level -64 dBov, quite arbitrarily chosen.
-  *payload_len = 1;  // Only noise level, no spectral parameters.
-}
-
-#if !defined(WEBRTC_IOS) && defined(WEBRTC_NETEQ_UNITTEST_BITEXACT) && \
-    (defined(WEBRTC_CODEC_ISAC) || defined(WEBRTC_CODEC_ISACFX)) &&    \
-    defined(WEBRTC_CODEC_ILBC) && defined(WEBRTC_CODEC_G722) &&        \
-    !defined(WEBRTC_ARCH_ARM64)
-#define MAYBE_TestBitExactness TestBitExactness
-#else
-#define MAYBE_TestBitExactness DISABLED_TestBitExactness
-#endif
-TEST_F(NetEqDecodingTest, MAYBE_TestBitExactness) {
-  const std::string input_rtp_file =
-      webrtc::test::ResourcePath("audio_coding/neteq_universal_new", "rtp");
-
-  const std::string output_checksum = PlatformChecksum(
-      "09fa7646e2ad032a0b156177b95f09012430f81f",
-      "1c64eb8b55ce8878676c6a1e6ddd78f48de0668b",
-      "09fa7646e2ad032a0b156177b95f09012430f81f",
-      "759fef89a5de52bd17e733dc255c671ce86be909");
-
-  const std::string network_stats_checksum =
-      PlatformChecksum("5b4262ca328e5f066af5d34f3380521583dd20de",
-                       "80235b6d727281203acb63b98f9a9e85d95f7ec0",
-                       "5b4262ca328e5f066af5d34f3380521583dd20de",
-                       "5b4262ca328e5f066af5d34f3380521583dd20de");
-
-  const std::string rtcp_stats_checksum = PlatformChecksum(
-      "b8880bf9fed2487efbddcb8d94b9937a29ae521d",
-      "f3f7b3d3e71d7e635240b5373b57df6a7e4ce9d4",
-      "b8880bf9fed2487efbddcb8d94b9937a29ae521d",
-      "b8880bf9fed2487efbddcb8d94b9937a29ae521d");
-
-  DecodeAndCompare(input_rtp_file,
-                   output_checksum,
-                   network_stats_checksum,
-                   rtcp_stats_checksum,
-                   FLAG_gen_ref);
-}
-
-#if !defined(WEBRTC_IOS) && !defined(WEBRTC_ANDROID) &&             \
-    defined(WEBRTC_NETEQ_UNITTEST_BITEXACT) &&                      \
-    defined(WEBRTC_CODEC_OPUS)
-#define MAYBE_TestOpusBitExactness TestOpusBitExactness
-#else
-#define MAYBE_TestOpusBitExactness DISABLED_TestOpusBitExactness
-#endif
-TEST_F(NetEqDecodingTest, MAYBE_TestOpusBitExactness) {
-  const std::string input_rtp_file =
-      webrtc::test::ResourcePath("audio_coding/neteq_opus", "rtp");
-
-  const std::string output_checksum = PlatformChecksum(
-      "721e1e0c6effe4b2401536a4eef11512c9fb709c",
-      "721e1e0c6effe4b2401536a4eef11512c9fb709c",
-      "721e1e0c6effe4b2401536a4eef11512c9fb709c",
-      "721e1e0c6effe4b2401536a4eef11512c9fb709c");
-
-  const std::string network_stats_checksum =
-      PlatformChecksum("4e749c46e2611877120ac7a20cbbe555cfbd70ea",
-                       "4e749c46e2611877120ac7a20cbbe555cfbd70ea",
-                       "4e749c46e2611877120ac7a20cbbe555cfbd70ea",
-                       "4e749c46e2611877120ac7a20cbbe555cfbd70ea");
-
-  const std::string rtcp_stats_checksum = PlatformChecksum(
-      "e37c797e3de6a64dda88c9ade7a013d022a2e1e0",
-      "e37c797e3de6a64dda88c9ade7a013d022a2e1e0",
-      "e37c797e3de6a64dda88c9ade7a013d022a2e1e0",
-      "e37c797e3de6a64dda88c9ade7a013d022a2e1e0");
-
-  DecodeAndCompare(input_rtp_file,
-                   output_checksum,
-                   network_stats_checksum,
-                   rtcp_stats_checksum,
-                   FLAG_gen_ref);
-}
-
-// Use fax mode to avoid time-scaling. This is to simplify the testing of
-// packet waiting times in the packet buffer.
-class NetEqDecodingTestFaxMode : public NetEqDecodingTest {
- protected:
-  NetEqDecodingTestFaxMode() : NetEqDecodingTest() {
-    config_.playout_mode = kPlayoutFax;
-  }
-};
-
-TEST_F(NetEqDecodingTestFaxMode, TestFrameWaitingTimeStatistics) {
-  // Insert 30 dummy packets at once. Each packet contains 10 ms 16 kHz audio.
-  size_t num_frames = 30;
-  const size_t kSamples = 10 * 16;
-  const size_t kPayloadBytes = kSamples * 2;
-  for (size_t i = 0; i < num_frames; ++i) {
-    const uint8_t payload[kPayloadBytes] = {0};
-    RTPHeader rtp_info;
-    rtp_info.sequenceNumber = i;
-    rtp_info.timestamp = i * kSamples;
-    rtp_info.ssrc = 0x1234;     // Just an arbitrary SSRC.
-    rtp_info.payloadType = 94;  // PCM16b WB codec.
-    rtp_info.markerBit = 0;
-    ASSERT_EQ(0, neteq_->InsertPacket(rtp_info, payload, 0));
-  }
-  // Pull out all data.
-  for (size_t i = 0; i < num_frames; ++i) {
-    bool muted;
-    ASSERT_EQ(0, neteq_->GetAudio(&out_frame_, &muted));
-    ASSERT_EQ(kBlockSize16kHz, out_frame_.samples_per_channel_);
-  }
-
-  NetEqNetworkStatistics stats;
-  EXPECT_EQ(0, neteq_->NetworkStatistics(&stats));
-  // Since all frames are dumped into NetEQ at once, but pulled out with 10 ms
-  // spacing (per definition), we expect the delay to increase with 10 ms for
-  // each packet. Thus, we are calculating the statistics for a series from 10
-  // to 300, in steps of 10 ms.
-  EXPECT_EQ(155, stats.mean_waiting_time_ms);
-  EXPECT_EQ(155, stats.median_waiting_time_ms);
-  EXPECT_EQ(10, stats.min_waiting_time_ms);
-  EXPECT_EQ(300, stats.max_waiting_time_ms);
-
-  // Check statistics again and make sure it's been reset.
-  EXPECT_EQ(0, neteq_->NetworkStatistics(&stats));
-  EXPECT_EQ(-1, stats.mean_waiting_time_ms);
-  EXPECT_EQ(-1, stats.median_waiting_time_ms);
-  EXPECT_EQ(-1, stats.min_waiting_time_ms);
-  EXPECT_EQ(-1, stats.max_waiting_time_ms);
-}
-
-TEST_F(NetEqDecodingTest, TestAverageInterArrivalTimeNegative) {
-  const int kNumFrames = 3000;  // Needed for convergence.
-  int frame_index = 0;
-  const size_t kSamples = 10 * 16;
-  const size_t kPayloadBytes = kSamples * 2;
-  while (frame_index < kNumFrames) {
-    // Insert one packet each time, except every 10th time where we insert two
-    // packets at once. This will create a negative clock-drift of approx. 10%.
-    int num_packets = (frame_index % 10 == 0 ? 2 : 1);
-    for (int n = 0; n < num_packets; ++n) {
-      uint8_t payload[kPayloadBytes] = {0};
-      RTPHeader rtp_info;
-      PopulateRtpInfo(frame_index, frame_index * kSamples, &rtp_info);
-      ASSERT_EQ(0, neteq_->InsertPacket(rtp_info, payload, 0));
-      ++frame_index;
-    }
-
-    // Pull out data once.
-    bool muted;
-    ASSERT_EQ(0, neteq_->GetAudio(&out_frame_, &muted));
-    ASSERT_EQ(kBlockSize16kHz, out_frame_.samples_per_channel_);
-  }
-
-  NetEqNetworkStatistics network_stats;
-  ASSERT_EQ(0, neteq_->NetworkStatistics(&network_stats));
-  EXPECT_EQ(-103192, network_stats.clockdrift_ppm);
-}
-
-TEST_F(NetEqDecodingTest, TestAverageInterArrivalTimePositive) {
-  const int kNumFrames = 5000;  // Needed for convergence.
-  int frame_index = 0;
-  const size_t kSamples = 10 * 16;
-  const size_t kPayloadBytes = kSamples * 2;
-  for (int i = 0; i < kNumFrames; ++i) {
-    // Insert one packet each time, except every 10th time where we don't insert
-    // any packet. This will create a positive clock-drift of approx. 11%.
-    int num_packets = (i % 10 == 9 ? 0 : 1);
-    for (int n = 0; n < num_packets; ++n) {
-      uint8_t payload[kPayloadBytes] = {0};
-      RTPHeader rtp_info;
-      PopulateRtpInfo(frame_index, frame_index * kSamples, &rtp_info);
-      ASSERT_EQ(0, neteq_->InsertPacket(rtp_info, payload, 0));
-      ++frame_index;
-    }
-
-    // Pull out data once.
-    bool muted;
-    ASSERT_EQ(0, neteq_->GetAudio(&out_frame_, &muted));
-    ASSERT_EQ(kBlockSize16kHz, out_frame_.samples_per_channel_);
-  }
-
-  NetEqNetworkStatistics network_stats;
-  ASSERT_EQ(0, neteq_->NetworkStatistics(&network_stats));
-  EXPECT_EQ(110953, network_stats.clockdrift_ppm);
-}
-
-void NetEqDecodingTest::LongCngWithClockDrift(double drift_factor,
-                                              double network_freeze_ms,
-                                              bool pull_audio_during_freeze,
-                                              int delay_tolerance_ms,
-                                              int max_time_to_speech_ms) {
-  uint16_t seq_no = 0;
-  uint32_t timestamp = 0;
-  const int kFrameSizeMs = 30;
-  const size_t kSamples = kFrameSizeMs * 16;
-  const size_t kPayloadBytes = kSamples * 2;
-  double next_input_time_ms = 0.0;
-  double t_ms;
-  bool muted;
-
-  // Insert speech for 5 seconds.
-  const int kSpeechDurationMs = 5000;
-  for (t_ms = 0; t_ms < kSpeechDurationMs; t_ms += 10) {
-    // Each turn in this for loop is 10 ms.
-    while (next_input_time_ms <= t_ms) {
-      // Insert one 30 ms speech frame.
-      uint8_t payload[kPayloadBytes] = {0};
-      RTPHeader rtp_info;
-      PopulateRtpInfo(seq_no, timestamp, &rtp_info);
-      ASSERT_EQ(0, neteq_->InsertPacket(rtp_info, payload, 0));
-      ++seq_no;
-      timestamp += kSamples;
-      next_input_time_ms += static_cast<double>(kFrameSizeMs) * drift_factor;
-    }
-    // Pull out data once.
-    ASSERT_EQ(0, neteq_->GetAudio(&out_frame_, &muted));
-    ASSERT_EQ(kBlockSize16kHz, out_frame_.samples_per_channel_);
-  }
-
-  EXPECT_EQ(AudioFrame::kNormalSpeech, out_frame_.speech_type_);
-  rtc::Optional<uint32_t> playout_timestamp = neteq_->GetPlayoutTimestamp();
-  ASSERT_TRUE(playout_timestamp);
-  int32_t delay_before = timestamp - *playout_timestamp;
-
-  // Insert CNG for 1 minute (= 60000 ms).
-  const int kCngPeriodMs = 100;
-  const int kCngPeriodSamples = kCngPeriodMs * 16;  // Period in 16 kHz samples.
-  const int kCngDurationMs = 60000;
-  for (; t_ms < kSpeechDurationMs + kCngDurationMs; t_ms += 10) {
-    // Each turn in this for loop is 10 ms.
-    while (next_input_time_ms <= t_ms) {
-      // Insert one CNG frame each 100 ms.
-      uint8_t payload[kPayloadBytes];
-      size_t payload_len;
-      RTPHeader rtp_info;
-      PopulateCng(seq_no, timestamp, &rtp_info, payload, &payload_len);
-      ASSERT_EQ(0, neteq_->InsertPacket(
-                       rtp_info,
-                       rtc::ArrayView<const uint8_t>(payload, payload_len), 0));
-      ++seq_no;
-      timestamp += kCngPeriodSamples;
-      next_input_time_ms += static_cast<double>(kCngPeriodMs) * drift_factor;
-    }
-    // Pull out data once.
-    ASSERT_EQ(0, neteq_->GetAudio(&out_frame_, &muted));
-    ASSERT_EQ(kBlockSize16kHz, out_frame_.samples_per_channel_);
-  }
-
-  EXPECT_EQ(AudioFrame::kCNG, out_frame_.speech_type_);
-
-  if (network_freeze_ms > 0) {
-    // First keep pulling audio for |network_freeze_ms| without inserting
-    // any data, then insert CNG data corresponding to |network_freeze_ms|
-    // without pulling any output audio.
-    const double loop_end_time = t_ms + network_freeze_ms;
-    for (; t_ms < loop_end_time; t_ms += 10) {
-      // Pull out data once.
-      ASSERT_EQ(0, neteq_->GetAudio(&out_frame_, &muted));
-      ASSERT_EQ(kBlockSize16kHz, out_frame_.samples_per_channel_);
-      EXPECT_EQ(AudioFrame::kCNG, out_frame_.speech_type_);
-    }
-    bool pull_once = pull_audio_during_freeze;
-    // If |pull_once| is true, GetAudio will be called once half-way through
-    // the network recovery period.
-    double pull_time_ms = (t_ms + next_input_time_ms) / 2;
-    while (next_input_time_ms <= t_ms) {
-      if (pull_once && next_input_time_ms >= pull_time_ms) {
-        pull_once = false;
-        // Pull out data once.
-        ASSERT_EQ(0, neteq_->GetAudio(&out_frame_, &muted));
-        ASSERT_EQ(kBlockSize16kHz, out_frame_.samples_per_channel_);
-        EXPECT_EQ(AudioFrame::kCNG, out_frame_.speech_type_);
-        t_ms += 10;
-      }
-      // Insert one CNG frame each 100 ms.
-      uint8_t payload[kPayloadBytes];
-      size_t payload_len;
-      RTPHeader rtp_info;
-      PopulateCng(seq_no, timestamp, &rtp_info, payload, &payload_len);
-      ASSERT_EQ(0, neteq_->InsertPacket(
-                       rtp_info,
-                       rtc::ArrayView<const uint8_t>(payload, payload_len), 0));
-      ++seq_no;
-      timestamp += kCngPeriodSamples;
-      next_input_time_ms += kCngPeriodMs * drift_factor;
-    }
-  }
-
-  // Insert speech again until output type is speech.
-  double speech_restart_time_ms = t_ms;
-  while (out_frame_.speech_type_ != AudioFrame::kNormalSpeech) {
-    // Each turn in this for loop is 10 ms.
-    while (next_input_time_ms <= t_ms) {
-      // Insert one 30 ms speech frame.
-      uint8_t payload[kPayloadBytes] = {0};
-      RTPHeader rtp_info;
-      PopulateRtpInfo(seq_no, timestamp, &rtp_info);
-      ASSERT_EQ(0, neteq_->InsertPacket(rtp_info, payload, 0));
-      ++seq_no;
-      timestamp += kSamples;
-      next_input_time_ms += kFrameSizeMs * drift_factor;
-    }
-    // Pull out data once.
-    ASSERT_EQ(0, neteq_->GetAudio(&out_frame_, &muted));
-    ASSERT_EQ(kBlockSize16kHz, out_frame_.samples_per_channel_);
-    // Increase clock.
-    t_ms += 10;
-  }
-
-  // Check that the speech starts again within reasonable time.
-  double time_until_speech_returns_ms = t_ms - speech_restart_time_ms;
-  EXPECT_LT(time_until_speech_returns_ms, max_time_to_speech_ms);
-  playout_timestamp = neteq_->GetPlayoutTimestamp();
-  ASSERT_TRUE(playout_timestamp);
-  int32_t delay_after = timestamp - *playout_timestamp;
-  // Compare delay before and after, and make sure it differs less than 20 ms.
-  EXPECT_LE(delay_after, delay_before + delay_tolerance_ms * 16);
-  EXPECT_GE(delay_after, delay_before - delay_tolerance_ms * 16);
-}
-
-TEST_F(NetEqDecodingTest, LongCngWithNegativeClockDrift) {
-  // Apply a clock drift of -25 ms / s (sender faster than receiver).
-  const double kDriftFactor = 1000.0 / (1000.0 + 25.0);
-  const double kNetworkFreezeTimeMs = 0.0;
-  const bool kGetAudioDuringFreezeRecovery = false;
-  const int kDelayToleranceMs = 20;
-  const int kMaxTimeToSpeechMs = 100;
-  LongCngWithClockDrift(kDriftFactor,
-                        kNetworkFreezeTimeMs,
-                        kGetAudioDuringFreezeRecovery,
-                        kDelayToleranceMs,
-                        kMaxTimeToSpeechMs);
-}
-
-TEST_F(NetEqDecodingTest, LongCngWithPositiveClockDrift) {
-  // Apply a clock drift of +25 ms / s (sender slower than receiver).
-  const double kDriftFactor = 1000.0 / (1000.0 - 25.0);
-  const double kNetworkFreezeTimeMs = 0.0;
-  const bool kGetAudioDuringFreezeRecovery = false;
-  const int kDelayToleranceMs = 20;
-  const int kMaxTimeToSpeechMs = 100;
-  LongCngWithClockDrift(kDriftFactor,
-                        kNetworkFreezeTimeMs,
-                        kGetAudioDuringFreezeRecovery,
-                        kDelayToleranceMs,
-                        kMaxTimeToSpeechMs);
-}
-
-TEST_F(NetEqDecodingTest, LongCngWithNegativeClockDriftNetworkFreeze) {
-  // Apply a clock drift of -25 ms / s (sender faster than receiver).
-  const double kDriftFactor = 1000.0 / (1000.0 + 25.0);
-  const double kNetworkFreezeTimeMs = 5000.0;
-  const bool kGetAudioDuringFreezeRecovery = false;
-  const int kDelayToleranceMs = 50;
-  const int kMaxTimeToSpeechMs = 200;
-  LongCngWithClockDrift(kDriftFactor,
-                        kNetworkFreezeTimeMs,
-                        kGetAudioDuringFreezeRecovery,
-                        kDelayToleranceMs,
-                        kMaxTimeToSpeechMs);
-}
-
-TEST_F(NetEqDecodingTest, LongCngWithPositiveClockDriftNetworkFreeze) {
-  // Apply a clock drift of +25 ms / s (sender slower than receiver).
-  const double kDriftFactor = 1000.0 / (1000.0 - 25.0);
-  const double kNetworkFreezeTimeMs = 5000.0;
-  const bool kGetAudioDuringFreezeRecovery = false;
-  const int kDelayToleranceMs = 20;
-  const int kMaxTimeToSpeechMs = 100;
-  LongCngWithClockDrift(kDriftFactor,
-                        kNetworkFreezeTimeMs,
-                        kGetAudioDuringFreezeRecovery,
-                        kDelayToleranceMs,
-                        kMaxTimeToSpeechMs);
-}
-
-TEST_F(NetEqDecodingTest, LongCngWithPositiveClockDriftNetworkFreezeExtraPull) {
-  // Apply a clock drift of +25 ms / s (sender slower than receiver).
-  const double kDriftFactor = 1000.0 / (1000.0 - 25.0);
-  const double kNetworkFreezeTimeMs = 5000.0;
-  const bool kGetAudioDuringFreezeRecovery = true;
-  const int kDelayToleranceMs = 20;
-  const int kMaxTimeToSpeechMs = 100;
-  LongCngWithClockDrift(kDriftFactor,
-                        kNetworkFreezeTimeMs,
-                        kGetAudioDuringFreezeRecovery,
-                        kDelayToleranceMs,
-                        kMaxTimeToSpeechMs);
-}
-
-TEST_F(NetEqDecodingTest, LongCngWithoutClockDrift) {
-  const double kDriftFactor = 1.0;  // No drift.
-  const double kNetworkFreezeTimeMs = 0.0;
-  const bool kGetAudioDuringFreezeRecovery = false;
-  const int kDelayToleranceMs = 10;
-  const int kMaxTimeToSpeechMs = 50;
-  LongCngWithClockDrift(kDriftFactor,
-                        kNetworkFreezeTimeMs,
-                        kGetAudioDuringFreezeRecovery,
-                        kDelayToleranceMs,
-                        kMaxTimeToSpeechMs);
-}
-
-TEST_F(NetEqDecodingTest, UnknownPayloadType) {
-  const size_t kPayloadBytes = 100;
-  uint8_t payload[kPayloadBytes] = {0};
-  RTPHeader rtp_info;
-  PopulateRtpInfo(0, 0, &rtp_info);
-  rtp_info.payloadType = 1;  // Not registered as a decoder.
-  EXPECT_EQ(NetEq::kFail, neteq_->InsertPacket(rtp_info, payload, 0));
-}
-
-#if defined(WEBRTC_CODEC_ISAC) || defined(WEBRTC_CODEC_ISACFX)
-#define MAYBE_DecoderError DecoderError
-#else
-#define MAYBE_DecoderError DISABLED_DecoderError
-#endif
-
-TEST_F(NetEqDecodingTest, MAYBE_DecoderError) {
-  const size_t kPayloadBytes = 100;
-  uint8_t payload[kPayloadBytes] = {0};
-  RTPHeader rtp_info;
-  PopulateRtpInfo(0, 0, &rtp_info);
-  rtp_info.payloadType = 103;  // iSAC, but the payload is invalid.
-  EXPECT_EQ(0, neteq_->InsertPacket(rtp_info, payload, 0));
-  // Set all of |out_data_| to 1, and verify that it was set to 0 by the call
-  // to GetAudio.
-  int16_t* out_frame_data = out_frame_.mutable_data();
-  for (size_t i = 0; i < AudioFrame::kMaxDataSizeSamples; ++i) {
-    out_frame_data[i] = 1;
-  }
-  bool muted;
-  EXPECT_EQ(NetEq::kFail, neteq_->GetAudio(&out_frame_, &muted));
-  ASSERT_FALSE(muted);
-
-  // Verify that the first 160 samples are set to 0.
-  static const int kExpectedOutputLength = 160;  // 10 ms at 16 kHz sample rate.
-  const int16_t* const_out_frame_data = out_frame_.data();
-  for (int i = 0; i < kExpectedOutputLength; ++i) {
-    std::ostringstream ss;
-    ss << "i = " << i;
-    SCOPED_TRACE(ss.str());  // Print out the parameter values on failure.
-    EXPECT_EQ(0, const_out_frame_data[i]);
-  }
-}
-
-TEST_F(NetEqDecodingTest, GetAudioBeforeInsertPacket) {
-  // Set all of |out_data_| to 1, and verify that it was set to 0 by the call
-  // to GetAudio.
-  int16_t* out_frame_data = out_frame_.mutable_data();
-  for (size_t i = 0; i < AudioFrame::kMaxDataSizeSamples; ++i) {
-    out_frame_data[i] = 1;
-  }
-  bool muted;
-  EXPECT_EQ(0, neteq_->GetAudio(&out_frame_, &muted));
-  ASSERT_FALSE(muted);
-  // Verify that the first block of samples is set to 0.
-  static const int kExpectedOutputLength =
-      kInitSampleRateHz / 100;  // 10 ms at initial sample rate.
-  const int16_t* const_out_frame_data = out_frame_.data();
-  for (int i = 0; i < kExpectedOutputLength; ++i) {
-    std::ostringstream ss;
-    ss << "i = " << i;
-    SCOPED_TRACE(ss.str());  // Print out the parameter values on failure.
-    EXPECT_EQ(0, const_out_frame_data[i]);
-  }
-  // Verify that the sample rate did not change from the initial configuration.
-  EXPECT_EQ(config_.sample_rate_hz, neteq_->last_output_sample_rate_hz());
-}
-
-class NetEqBgnTest : public NetEqDecodingTest {
- protected:
-  virtual void TestCondition(double sum_squared_noise,
-                             bool should_be_faded) = 0;
-
-  void CheckBgn(int sampling_rate_hz) {
-    size_t expected_samples_per_channel = 0;
-    uint8_t payload_type = 0xFF;  // Invalid.
-    if (sampling_rate_hz == 8000) {
-      expected_samples_per_channel = kBlockSize8kHz;
-      payload_type = 93;  // PCM 16, 8 kHz.
-    } else if (sampling_rate_hz == 16000) {
-      expected_samples_per_channel = kBlockSize16kHz;
-      payload_type = 94;  // PCM 16, 16 kHZ.
-    } else if (sampling_rate_hz == 32000) {
-      expected_samples_per_channel = kBlockSize32kHz;
-      payload_type = 95;  // PCM 16, 32 kHz.
-    } else {
-      ASSERT_TRUE(false);  // Unsupported test case.
-    }
-
-    AudioFrame output;
-    test::AudioLoop input;
-    // We are using the same 32 kHz input file for all tests, regardless of
-    // |sampling_rate_hz|. The output may sound weird, but the test is still
-    // valid.
-    ASSERT_TRUE(input.Init(
-        webrtc::test::ResourcePath("audio_coding/testfile32kHz", "pcm"),
-        10 * sampling_rate_hz,  // Max 10 seconds loop length.
-        expected_samples_per_channel));
-
-    // Payload of 10 ms of PCM16 32 kHz.
-    uint8_t payload[kBlockSize32kHz * sizeof(int16_t)];
-    RTPHeader rtp_info;
-    PopulateRtpInfo(0, 0, &rtp_info);
-    rtp_info.payloadType = payload_type;
-
-    uint32_t receive_timestamp = 0;
-    bool muted;
-    for (int n = 0; n < 10; ++n) {  // Insert few packets and get audio.
-      auto block = input.GetNextBlock();
-      ASSERT_EQ(expected_samples_per_channel, block.size());
-      size_t enc_len_bytes =
-          WebRtcPcm16b_Encode(block.data(), block.size(), payload);
-      ASSERT_EQ(enc_len_bytes, expected_samples_per_channel * 2);
-
-      ASSERT_EQ(0, neteq_->InsertPacket(
-                       rtp_info,
-                       rtc::ArrayView<const uint8_t>(payload, enc_len_bytes),
-                       receive_timestamp));
-      output.Reset();
-      ASSERT_EQ(0, neteq_->GetAudio(&output, &muted));
-      ASSERT_EQ(1u, output.num_channels_);
-      ASSERT_EQ(expected_samples_per_channel, output.samples_per_channel_);
-      ASSERT_EQ(AudioFrame::kNormalSpeech, output.speech_type_);
-
-      // Next packet.
-      rtp_info.timestamp += expected_samples_per_channel;
-      rtp_info.sequenceNumber++;
-      receive_timestamp += expected_samples_per_channel;
-    }
-
-    output.Reset();
-
-    // Get audio without inserting packets, expecting PLC and PLC-to-CNG. Pull
-    // one frame without checking speech-type. This is the first frame pulled
-    // without inserting any packet, and might not be labeled as PLC.
-    ASSERT_EQ(0, neteq_->GetAudio(&output, &muted));
-    ASSERT_EQ(1u, output.num_channels_);
-    ASSERT_EQ(expected_samples_per_channel, output.samples_per_channel_);
-
-    // To be able to test the fading of background noise we need at lease to
-    // pull 611 frames.
-    const int kFadingThreshold = 611;
-
-    // Test several CNG-to-PLC packet for the expected behavior. The number 20
-    // is arbitrary, but sufficiently large to test enough number of frames.
-    const int kNumPlcToCngTestFrames = 20;
-    bool plc_to_cng = false;
-    for (int n = 0; n < kFadingThreshold + kNumPlcToCngTestFrames; ++n) {
-      output.Reset();
-      // Set to non-zero.
-      memset(output.mutable_data(), 1, AudioFrame::kMaxDataSizeBytes);
-      ASSERT_EQ(0, neteq_->GetAudio(&output, &muted));
-      ASSERT_FALSE(muted);
-      ASSERT_EQ(1u, output.num_channels_);
-      ASSERT_EQ(expected_samples_per_channel, output.samples_per_channel_);
-      if (output.speech_type_ == AudioFrame::kPLCCNG) {
-        plc_to_cng = true;
-        double sum_squared = 0;
-        const int16_t* output_data = output.data();
-        for (size_t k = 0;
-             k < output.num_channels_ * output.samples_per_channel_; ++k)
-          sum_squared += output_data[k] * output_data[k];
-        TestCondition(sum_squared, n > kFadingThreshold);
-      } else {
-        EXPECT_EQ(AudioFrame::kPLC, output.speech_type_);
-      }
-    }
-    EXPECT_TRUE(plc_to_cng);  // Just to be sure that PLC-to-CNG has occurred.
-  }
-};
-
-class NetEqBgnTestOn : public NetEqBgnTest {
- protected:
-  NetEqBgnTestOn() : NetEqBgnTest() {
-    config_.background_noise_mode = NetEq::kBgnOn;
-  }
-
-  void TestCondition(double sum_squared_noise, bool /*should_be_faded*/) {
-    EXPECT_NE(0, sum_squared_noise);
-  }
-};
-
-class NetEqBgnTestOff : public NetEqBgnTest {
- protected:
-  NetEqBgnTestOff() : NetEqBgnTest() {
-    config_.background_noise_mode = NetEq::kBgnOff;
-  }
-
-  void TestCondition(double sum_squared_noise, bool /*should_be_faded*/) {
-    EXPECT_EQ(0, sum_squared_noise);
-  }
-};
-
-class NetEqBgnTestFade : public NetEqBgnTest {
- protected:
-  NetEqBgnTestFade() : NetEqBgnTest() {
-    config_.background_noise_mode = NetEq::kBgnFade;
-  }
-
-  void TestCondition(double sum_squared_noise, bool should_be_faded) {
-    if (should_be_faded)
-      EXPECT_EQ(0, sum_squared_noise);
-  }
-};
-
-TEST_F(NetEqBgnTestOn, RunTest) {
-  CheckBgn(8000);
-  CheckBgn(16000);
-  CheckBgn(32000);
-}
-
-TEST_F(NetEqBgnTestOff, RunTest) {
-  CheckBgn(8000);
-  CheckBgn(16000);
-  CheckBgn(32000);
-}
-
-TEST_F(NetEqBgnTestFade, RunTest) {
-  CheckBgn(8000);
-  CheckBgn(16000);
-  CheckBgn(32000);
-}
-
-void NetEqDecodingTest::WrapTest(uint16_t start_seq_no,
-                                 uint32_t start_timestamp,
-                                 const std::set<uint16_t>& drop_seq_numbers,
-                                 bool expect_seq_no_wrap,
-                                 bool expect_timestamp_wrap) {
-  uint16_t seq_no = start_seq_no;
-  uint32_t timestamp = start_timestamp;
-  const int kBlocksPerFrame = 3;  // Number of 10 ms blocks per frame.
-  const int kFrameSizeMs = kBlocksPerFrame * kTimeStepMs;
-  const int kSamples = kBlockSize16kHz * kBlocksPerFrame;
-  const size_t kPayloadBytes = kSamples * sizeof(int16_t);
-  double next_input_time_ms = 0.0;
-  uint32_t receive_timestamp = 0;
-
-  // Insert speech for 2 seconds.
-  const int kSpeechDurationMs = 2000;
-  int packets_inserted = 0;
-  uint16_t last_seq_no;
-  uint32_t last_timestamp;
-  bool timestamp_wrapped = false;
-  bool seq_no_wrapped = false;
-  for (double t_ms = 0; t_ms < kSpeechDurationMs; t_ms += 10) {
-    // Each turn in this for loop is 10 ms.
-    while (next_input_time_ms <= t_ms) {
-      // Insert one 30 ms speech frame.
-      uint8_t payload[kPayloadBytes] = {0};
-      RTPHeader rtp_info;
-      PopulateRtpInfo(seq_no, timestamp, &rtp_info);
-      if (drop_seq_numbers.find(seq_no) == drop_seq_numbers.end()) {
-        // This sequence number was not in the set to drop. Insert it.
-        ASSERT_EQ(0,
-                  neteq_->InsertPacket(rtp_info, payload, receive_timestamp));
-        ++packets_inserted;
-      }
-      NetEqNetworkStatistics network_stats;
-      ASSERT_EQ(0, neteq_->NetworkStatistics(&network_stats));
-
-      // Due to internal NetEq logic, preferred buffer-size is about 4 times the
-      // packet size for first few packets. Therefore we refrain from checking
-      // the criteria.
-      if (packets_inserted > 4) {
-        // Expect preferred and actual buffer size to be no more than 2 frames.
-        EXPECT_LE(network_stats.preferred_buffer_size_ms, kFrameSizeMs * 2);
-        EXPECT_LE(network_stats.current_buffer_size_ms, kFrameSizeMs * 2 +
-                  algorithmic_delay_ms_);
-      }
-      last_seq_no = seq_no;
-      last_timestamp = timestamp;
-
-      ++seq_no;
-      timestamp += kSamples;
-      receive_timestamp += kSamples;
-      next_input_time_ms += static_cast<double>(kFrameSizeMs);
-
-      seq_no_wrapped |= seq_no < last_seq_no;
-      timestamp_wrapped |= timestamp < last_timestamp;
-    }
-    // Pull out data once.
-    AudioFrame output;
-    bool muted;
-    ASSERT_EQ(0, neteq_->GetAudio(&output, &muted));
-    ASSERT_EQ(kBlockSize16kHz, output.samples_per_channel_);
-    ASSERT_EQ(1u, output.num_channels_);
-
-    // Expect delay (in samples) to be less than 2 packets.
-    rtc::Optional<uint32_t> playout_timestamp = neteq_->GetPlayoutTimestamp();
-    ASSERT_TRUE(playout_timestamp);
-    EXPECT_LE(timestamp - *playout_timestamp,
-              static_cast<uint32_t>(kSamples * 2));
-  }
-  // Make sure we have actually tested wrap-around.
-  ASSERT_EQ(expect_seq_no_wrap, seq_no_wrapped);
-  ASSERT_EQ(expect_timestamp_wrap, timestamp_wrapped);
-}
-
-TEST_F(NetEqDecodingTest, SequenceNumberWrap) {
-  // Start with a sequence number that will soon wrap.
-  std::set<uint16_t> drop_seq_numbers;  // Don't drop any packets.
-  WrapTest(0xFFFF - 10, 0, drop_seq_numbers, true, false);
-}
-
-TEST_F(NetEqDecodingTest, SequenceNumberWrapAndDrop) {
-  // Start with a sequence number that will soon wrap.
-  std::set<uint16_t> drop_seq_numbers;
-  drop_seq_numbers.insert(0xFFFF);
-  drop_seq_numbers.insert(0x0);
-  WrapTest(0xFFFF - 10, 0, drop_seq_numbers, true, false);
-}
-
-TEST_F(NetEqDecodingTest, TimestampWrap) {
-  // Start with a timestamp that will soon wrap.
-  std::set<uint16_t> drop_seq_numbers;
-  WrapTest(0, 0xFFFFFFFF - 3000, drop_seq_numbers, false, true);
-}
-
-TEST_F(NetEqDecodingTest, TimestampAndSequenceNumberWrap) {
-  // Start with a timestamp and a sequence number that will wrap at the same
-  // time.
-  std::set<uint16_t> drop_seq_numbers;
-  WrapTest(0xFFFF - 10, 0xFFFFFFFF - 5000, drop_seq_numbers, true, true);
-}
-
-void NetEqDecodingTest::DuplicateCng() {
-  uint16_t seq_no = 0;
-  uint32_t timestamp = 0;
-  const int kFrameSizeMs = 10;
-  const int kSampleRateKhz = 16;
-  const int kSamples = kFrameSizeMs * kSampleRateKhz;
-  const size_t kPayloadBytes = kSamples * 2;
-
-  const int algorithmic_delay_samples = std::max(
-      algorithmic_delay_ms_ * kSampleRateKhz, 5 * kSampleRateKhz / 8);
-  // Insert three speech packets. Three are needed to get the frame length
-  // correct.
-  uint8_t payload[kPayloadBytes] = {0};
-  RTPHeader rtp_info;
-  bool muted;
-  for (int i = 0; i < 3; ++i) {
-    PopulateRtpInfo(seq_no, timestamp, &rtp_info);
-    ASSERT_EQ(0, neteq_->InsertPacket(rtp_info, payload, 0));
-    ++seq_no;
-    timestamp += kSamples;
-
-    // Pull audio once.
-    ASSERT_EQ(0, neteq_->GetAudio(&out_frame_, &muted));
-    ASSERT_EQ(kBlockSize16kHz, out_frame_.samples_per_channel_);
-  }
-  // Verify speech output.
-  EXPECT_EQ(AudioFrame::kNormalSpeech, out_frame_.speech_type_);
-
-  // Insert same CNG packet twice.
-  const int kCngPeriodMs = 100;
-  const int kCngPeriodSamples = kCngPeriodMs * kSampleRateKhz;
-  size_t payload_len;
-  PopulateCng(seq_no, timestamp, &rtp_info, payload, &payload_len);
-  // This is the first time this CNG packet is inserted.
-  ASSERT_EQ(
-      0, neteq_->InsertPacket(
-             rtp_info, rtc::ArrayView<const uint8_t>(payload, payload_len), 0));
-
-  // Pull audio once and make sure CNG is played.
-  ASSERT_EQ(0, neteq_->GetAudio(&out_frame_, &muted));
-  ASSERT_EQ(kBlockSize16kHz, out_frame_.samples_per_channel_);
-  EXPECT_EQ(AudioFrame::kCNG, out_frame_.speech_type_);
-  EXPECT_FALSE(
-      neteq_->GetPlayoutTimestamp());  // Returns empty value during CNG.
-  EXPECT_EQ(timestamp - algorithmic_delay_samples,
-            out_frame_.timestamp_ + out_frame_.samples_per_channel_);
-
-  // Insert the same CNG packet again. Note that at this point it is old, since
-  // we have already decoded the first copy of it.
-  ASSERT_EQ(
-      0, neteq_->InsertPacket(
-             rtp_info, rtc::ArrayView<const uint8_t>(payload, payload_len), 0));
-
-  // Pull audio until we have played |kCngPeriodMs| of CNG. Start at 10 ms since
-  // we have already pulled out CNG once.
-  for (int cng_time_ms = 10; cng_time_ms < kCngPeriodMs; cng_time_ms += 10) {
-    ASSERT_EQ(0, neteq_->GetAudio(&out_frame_, &muted));
-    ASSERT_EQ(kBlockSize16kHz, out_frame_.samples_per_channel_);
-    EXPECT_EQ(AudioFrame::kCNG, out_frame_.speech_type_);
-    EXPECT_FALSE(
-        neteq_->GetPlayoutTimestamp());  // Returns empty value during CNG.
-    EXPECT_EQ(timestamp - algorithmic_delay_samples,
-              out_frame_.timestamp_ + out_frame_.samples_per_channel_);
-  }
-
-  // Insert speech again.
-  ++seq_no;
-  timestamp += kCngPeriodSamples;
-  PopulateRtpInfo(seq_no, timestamp, &rtp_info);
-  ASSERT_EQ(0, neteq_->InsertPacket(rtp_info, payload, 0));
-
-  // Pull audio once and verify that the output is speech again.
-  ASSERT_EQ(0, neteq_->GetAudio(&out_frame_, &muted));
-  ASSERT_EQ(kBlockSize16kHz, out_frame_.samples_per_channel_);
-  EXPECT_EQ(AudioFrame::kNormalSpeech, out_frame_.speech_type_);
-  rtc::Optional<uint32_t> playout_timestamp = neteq_->GetPlayoutTimestamp();
-  ASSERT_TRUE(playout_timestamp);
-  EXPECT_EQ(timestamp + kSamples - algorithmic_delay_samples,
-            *playout_timestamp);
-}
-
-TEST_F(NetEqDecodingTest, DiscardDuplicateCng) { DuplicateCng(); }
-
-TEST_F(NetEqDecodingTest, CngFirst) {
-  uint16_t seq_no = 0;
-  uint32_t timestamp = 0;
-  const int kFrameSizeMs = 10;
-  const int kSampleRateKhz = 16;
-  const int kSamples = kFrameSizeMs * kSampleRateKhz;
-  const int kPayloadBytes = kSamples * 2;
-  const int kCngPeriodMs = 100;
-  const int kCngPeriodSamples = kCngPeriodMs * kSampleRateKhz;
-  size_t payload_len;
-
-  uint8_t payload[kPayloadBytes] = {0};
-  RTPHeader rtp_info;
-
-  PopulateCng(seq_no, timestamp, &rtp_info, payload, &payload_len);
-  ASSERT_EQ(
-      NetEq::kOK,
-      neteq_->InsertPacket(
-          rtp_info, rtc::ArrayView<const uint8_t>(payload, payload_len), 0));
-  ++seq_no;
-  timestamp += kCngPeriodSamples;
-
-  // Pull audio once and make sure CNG is played.
-  bool muted;
-  ASSERT_EQ(0, neteq_->GetAudio(&out_frame_, &muted));
-  ASSERT_EQ(kBlockSize16kHz, out_frame_.samples_per_channel_);
-  EXPECT_EQ(AudioFrame::kCNG, out_frame_.speech_type_);
-
-  // Insert some speech packets.
-  const uint32_t first_speech_timestamp = timestamp;
-  int timeout_counter = 0;
-  do {
-    ASSERT_LT(timeout_counter++, 20) << "Test timed out";
-    PopulateRtpInfo(seq_no, timestamp, &rtp_info);
-    ASSERT_EQ(0, neteq_->InsertPacket(rtp_info, payload, 0));
-    ++seq_no;
-    timestamp += kSamples;
-
-    // Pull audio once.
-    ASSERT_EQ(0, neteq_->GetAudio(&out_frame_, &muted));
-    ASSERT_EQ(kBlockSize16kHz, out_frame_.samples_per_channel_);
-  } while (!IsNewerTimestamp(out_frame_.timestamp_, first_speech_timestamp));
-  // Verify speech output.
-  EXPECT_EQ(AudioFrame::kNormalSpeech, out_frame_.speech_type_);
-}
-
-class NetEqDecodingTestWithMutedState : public NetEqDecodingTest {
- public:
-  NetEqDecodingTestWithMutedState() : NetEqDecodingTest() {
-    config_.enable_muted_state = true;
-  }
-
- protected:
-  static constexpr size_t kSamples = 10 * 16;
-  static constexpr size_t kPayloadBytes = kSamples * 2;
-
-  void InsertPacket(uint32_t rtp_timestamp) {
-    uint8_t payload[kPayloadBytes] = {0};
-    RTPHeader rtp_info;
-    PopulateRtpInfo(0, rtp_timestamp, &rtp_info);
-    EXPECT_EQ(0, neteq_->InsertPacket(rtp_info, payload, 0));
-  }
-
-  void InsertCngPacket(uint32_t rtp_timestamp) {
-    uint8_t payload[kPayloadBytes] = {0};
-    RTPHeader rtp_info;
-    size_t payload_len;
-    PopulateCng(0, rtp_timestamp, &rtp_info, payload, &payload_len);
-    EXPECT_EQ(
-        NetEq::kOK,
-        neteq_->InsertPacket(
-            rtp_info, rtc::ArrayView<const uint8_t>(payload, payload_len), 0));
-  }
-
-  bool GetAudioReturnMuted() {
-    bool muted;
-    EXPECT_EQ(0, neteq_->GetAudio(&out_frame_, &muted));
-    return muted;
-  }
-
-  void GetAudioUntilMuted() {
-    while (!GetAudioReturnMuted()) {
-      ASSERT_LT(counter_++, 1000) << "Test timed out";
-    }
-  }
-
-  void GetAudioUntilNormal() {
-    bool muted = false;
-    while (out_frame_.speech_type_ != AudioFrame::kNormalSpeech) {
-      EXPECT_EQ(0, neteq_->GetAudio(&out_frame_, &muted));
-      ASSERT_LT(counter_++, 1000) << "Test timed out";
-    }
-    EXPECT_FALSE(muted);
-  }
-
-  int counter_ = 0;
-};
-
-// Verifies that NetEq goes in and out of muted state as expected.
-TEST_F(NetEqDecodingTestWithMutedState, MutedState) {
-  // Insert one speech packet.
-  InsertPacket(0);
-  // Pull out audio once and expect it not to be muted.
-  EXPECT_FALSE(GetAudioReturnMuted());
-  // Pull data until faded out.
-  GetAudioUntilMuted();
-  EXPECT_TRUE(out_frame_.muted());
-
-  // Verify that output audio is not written during muted mode. Other parameters
-  // should be correct, though.
-  AudioFrame new_frame;
-  int16_t* frame_data = new_frame.mutable_data();
-  for (size_t i = 0; i < AudioFrame::kMaxDataSizeSamples; i++) {
-    frame_data[i] = 17;
-  }
-  bool muted;
-  EXPECT_EQ(0, neteq_->GetAudio(&new_frame, &muted));
-  EXPECT_TRUE(muted);
-  EXPECT_TRUE(out_frame_.muted());
-  for (size_t i = 0; i < AudioFrame::kMaxDataSizeSamples; i++) {
-    EXPECT_EQ(17, frame_data[i]);
-  }
-  EXPECT_EQ(out_frame_.timestamp_ + out_frame_.samples_per_channel_,
-            new_frame.timestamp_);
-  EXPECT_EQ(out_frame_.samples_per_channel_, new_frame.samples_per_channel_);
-  EXPECT_EQ(out_frame_.sample_rate_hz_, new_frame.sample_rate_hz_);
-  EXPECT_EQ(out_frame_.num_channels_, new_frame.num_channels_);
-  EXPECT_EQ(out_frame_.speech_type_, new_frame.speech_type_);
-  EXPECT_EQ(out_frame_.vad_activity_, new_frame.vad_activity_);
-
-  // Insert new data. Timestamp is corrected for the time elapsed since the last
-  // packet. Verify that normal operation resumes.
-  InsertPacket(kSamples * counter_);
-  GetAudioUntilNormal();
-  EXPECT_FALSE(out_frame_.muted());
-
-  NetEqNetworkStatistics stats;
-  EXPECT_EQ(0, neteq_->NetworkStatistics(&stats));
-  // NetEqNetworkStatistics::expand_rate tells the fraction of samples that were
-  // concealment samples, in Q14 (16384 = 100%) .The vast majority should be
-  // concealment samples in this test.
-  EXPECT_GT(stats.expand_rate, 14000);
-  // And, it should be greater than the speech_expand_rate.
-  EXPECT_GT(stats.expand_rate, stats.speech_expand_rate);
-}
-
-// Verifies that NetEq goes out of muted state when given a delayed packet.
-TEST_F(NetEqDecodingTestWithMutedState, MutedStateDelayedPacket) {
-  // Insert one speech packet.
-  InsertPacket(0);
-  // Pull out audio once and expect it not to be muted.
-  EXPECT_FALSE(GetAudioReturnMuted());
-  // Pull data until faded out.
-  GetAudioUntilMuted();
-  // Insert new data. Timestamp is only corrected for the half of the time
-  // elapsed since the last packet. That is, the new packet is delayed. Verify
-  // that normal operation resumes.
-  InsertPacket(kSamples * counter_ / 2);
-  GetAudioUntilNormal();
-}
-
-// Verifies that NetEq goes out of muted state when given a future packet.
-TEST_F(NetEqDecodingTestWithMutedState, MutedStateFuturePacket) {
-  // Insert one speech packet.
-  InsertPacket(0);
-  // Pull out audio once and expect it not to be muted.
-  EXPECT_FALSE(GetAudioReturnMuted());
-  // Pull data until faded out.
-  GetAudioUntilMuted();
-  // Insert new data. Timestamp is over-corrected for the time elapsed since the
-  // last packet. That is, the new packet is too early. Verify that normal
-  // operation resumes.
-  InsertPacket(kSamples * counter_ * 2);
-  GetAudioUntilNormal();
-}
-
-// Verifies that NetEq goes out of muted state when given an old packet.
-TEST_F(NetEqDecodingTestWithMutedState, MutedStateOldPacket) {
-  // Insert one speech packet.
-  InsertPacket(0);
-  // Pull out audio once and expect it not to be muted.
-  EXPECT_FALSE(GetAudioReturnMuted());
-  // Pull data until faded out.
-  GetAudioUntilMuted();
-
-  EXPECT_NE(AudioFrame::kNormalSpeech, out_frame_.speech_type_);
-  // Insert packet which is older than the first packet.
-  InsertPacket(kSamples * (counter_ - 1000));
-  EXPECT_FALSE(GetAudioReturnMuted());
-  EXPECT_EQ(AudioFrame::kNormalSpeech, out_frame_.speech_type_);
-}
-
-// Verifies that NetEq doesn't enter muted state when CNG mode is active and the
-// packet stream is suspended for a long time.
-TEST_F(NetEqDecodingTestWithMutedState, DoNotMuteExtendedCngWithoutPackets) {
-  // Insert one CNG packet.
-  InsertCngPacket(0);
-
-  // Pull 10 seconds of audio (10 ms audio generated per lap).
-  for (int i = 0; i < 1000; ++i) {
-    bool muted;
-    EXPECT_EQ(0, neteq_->GetAudio(&out_frame_, &muted));
-    ASSERT_FALSE(muted);
-  }
-  EXPECT_EQ(AudioFrame::kCNG, out_frame_.speech_type_);
-}
-
-// Verifies that NetEq goes back to normal after a long CNG period with the
-// packet stream suspended.
-TEST_F(NetEqDecodingTestWithMutedState, RecoverAfterExtendedCngWithoutPackets) {
-  // Insert one CNG packet.
-  InsertCngPacket(0);
-
-  // Pull 10 seconds of audio (10 ms audio generated per lap).
-  for (int i = 0; i < 1000; ++i) {
-    bool muted;
-    EXPECT_EQ(0, neteq_->GetAudio(&out_frame_, &muted));
-  }
-
-  // Insert new data. Timestamp is corrected for the time elapsed since the last
-  // packet. Verify that normal operation resumes.
-  InsertPacket(kSamples * counter_);
-  GetAudioUntilNormal();
-}
-
-class NetEqDecodingTestTwoInstances : public NetEqDecodingTest {
- public:
-  NetEqDecodingTestTwoInstances() : NetEqDecodingTest() {}
-
-  void SetUp() override {
-    NetEqDecodingTest::SetUp();
-    config2_ = config_;
-  }
-
-  void CreateSecondInstance() {
-    neteq2_.reset(NetEq::Create(config2_, CreateBuiltinAudioDecoderFactory()));
-    ASSERT_TRUE(neteq2_);
-    LoadDecoders(neteq2_.get());
-  }
-
- protected:
-  std::unique_ptr<NetEq> neteq2_;
-  NetEq::Config config2_;
-};
-
-namespace {
-::testing::AssertionResult AudioFramesEqualExceptData(const AudioFrame& a,
-                                                      const AudioFrame& b) {
-  if (a.timestamp_ != b.timestamp_)
-    return ::testing::AssertionFailure() << "timestamp_ diff (" << a.timestamp_
-                                         << " != " << b.timestamp_ << ")";
-  if (a.sample_rate_hz_ != b.sample_rate_hz_)
-    return ::testing::AssertionFailure() << "sample_rate_hz_ diff ("
-                                         << a.sample_rate_hz_
-                                         << " != " << b.sample_rate_hz_ << ")";
-  if (a.samples_per_channel_ != b.samples_per_channel_)
-    return ::testing::AssertionFailure()
-           << "samples_per_channel_ diff (" << a.samples_per_channel_
-           << " != " << b.samples_per_channel_ << ")";
-  if (a.num_channels_ != b.num_channels_)
-    return ::testing::AssertionFailure() << "num_channels_ diff ("
-                                         << a.num_channels_
-                                         << " != " << b.num_channels_ << ")";
-  if (a.speech_type_ != b.speech_type_)
-    return ::testing::AssertionFailure() << "speech_type_ diff ("
-                                         << a.speech_type_
-                                         << " != " << b.speech_type_ << ")";
-  if (a.vad_activity_ != b.vad_activity_)
-    return ::testing::AssertionFailure() << "vad_activity_ diff ("
-                                         << a.vad_activity_
-                                         << " != " << b.vad_activity_ << ")";
-  return ::testing::AssertionSuccess();
-}
-
-::testing::AssertionResult AudioFramesEqual(const AudioFrame& a,
-                                            const AudioFrame& b) {
-  ::testing::AssertionResult res = AudioFramesEqualExceptData(a, b);
-  if (!res)
-    return res;
-  if (memcmp(
-      a.data(), b.data(),
-      a.samples_per_channel_ * a.num_channels_ * sizeof(*a.data())) != 0) {
-    return ::testing::AssertionFailure() << "data_ diff";
-  }
-  return ::testing::AssertionSuccess();
-}
-
-}  // namespace
-
-TEST_F(NetEqDecodingTestTwoInstances, CompareMutedStateOnOff) {
-  ASSERT_FALSE(config_.enable_muted_state);
-  config2_.enable_muted_state = true;
-  CreateSecondInstance();
-
-  // Insert one speech packet into both NetEqs.
-  const size_t kSamples = 10 * 16;
-  const size_t kPayloadBytes = kSamples * 2;
-  uint8_t payload[kPayloadBytes] = {0};
-  RTPHeader rtp_info;
-  PopulateRtpInfo(0, 0, &rtp_info);
-  EXPECT_EQ(0, neteq_->InsertPacket(rtp_info, payload, 0));
-  EXPECT_EQ(0, neteq2_->InsertPacket(rtp_info, payload, 0));
-
-  AudioFrame out_frame1, out_frame2;
-  bool muted;
-  for (int i = 0; i < 1000; ++i) {
-    std::ostringstream ss;
-    ss << "i = " << i;
-    SCOPED_TRACE(ss.str());  // Print out the loop iterator on failure.
-    EXPECT_EQ(0, neteq_->GetAudio(&out_frame1, &muted));
-    EXPECT_FALSE(muted);
-    EXPECT_EQ(0, neteq2_->GetAudio(&out_frame2, &muted));
-    if (muted) {
-      EXPECT_TRUE(AudioFramesEqualExceptData(out_frame1, out_frame2));
-    } else {
-      EXPECT_TRUE(AudioFramesEqual(out_frame1, out_frame2));
-    }
-  }
-  EXPECT_TRUE(muted);
-
-  // Insert new data. Timestamp is corrected for the time elapsed since the last
-  // packet.
-  PopulateRtpInfo(0, kSamples * 1000, &rtp_info);
-  EXPECT_EQ(0, neteq_->InsertPacket(rtp_info, payload, 0));
-  EXPECT_EQ(0, neteq2_->InsertPacket(rtp_info, payload, 0));
-
-  int counter = 0;
-  while (out_frame1.speech_type_ != AudioFrame::kNormalSpeech) {
-    ASSERT_LT(counter++, 1000) << "Test timed out";
-    std::ostringstream ss;
-    ss << "counter = " << counter;
-    SCOPED_TRACE(ss.str());  // Print out the loop iterator on failure.
-    EXPECT_EQ(0, neteq_->GetAudio(&out_frame1, &muted));
-    EXPECT_FALSE(muted);
-    EXPECT_EQ(0, neteq2_->GetAudio(&out_frame2, &muted));
-    if (muted) {
-      EXPECT_TRUE(AudioFramesEqualExceptData(out_frame1, out_frame2));
-    } else {
-      EXPECT_TRUE(AudioFramesEqual(out_frame1, out_frame2));
-    }
-  }
-  EXPECT_FALSE(muted);
-}
-
-TEST_F(NetEqDecodingTest, LastDecodedTimestampsEmpty) {
-  EXPECT_TRUE(neteq_->LastDecodedTimestamps().empty());
-
-  // Pull out data once.
-  AudioFrame output;
-  bool muted;
-  ASSERT_EQ(0, neteq_->GetAudio(&output, &muted));
-
-  EXPECT_TRUE(neteq_->LastDecodedTimestamps().empty());
-}
-
-TEST_F(NetEqDecodingTest, LastDecodedTimestampsOneDecoded) {
-  // Insert one packet with PCM16b WB data (this is what PopulateRtpInfo does by
-  // default). Make the length 10 ms.
-  constexpr size_t kPayloadSamples = 16 * 10;
-  constexpr size_t kPayloadBytes = 2 * kPayloadSamples;
-  uint8_t payload[kPayloadBytes] = {0};
-
-  RTPHeader rtp_info;
-  constexpr uint32_t kRtpTimestamp = 0x1234;
-  PopulateRtpInfo(0, kRtpTimestamp, &rtp_info);
-  EXPECT_EQ(0, neteq_->InsertPacket(rtp_info, payload, 0));
-
-  // Pull out data once.
-  AudioFrame output;
-  bool muted;
-  ASSERT_EQ(0, neteq_->GetAudio(&output, &muted));
-
-  EXPECT_EQ(std::vector<uint32_t>({kRtpTimestamp}),
-            neteq_->LastDecodedTimestamps());
-
-  // Nothing decoded on the second call.
-  ASSERT_EQ(0, neteq_->GetAudio(&output, &muted));
-  EXPECT_TRUE(neteq_->LastDecodedTimestamps().empty());
-}
-
-TEST_F(NetEqDecodingTest, LastDecodedTimestampsTwoDecoded) {
-  // Insert two packets with PCM16b WB data (this is what PopulateRtpInfo does
-  // by default). Make the length 5 ms so that NetEq must decode them both in
-  // the same GetAudio call.
-  constexpr size_t kPayloadSamples = 16 * 5;
-  constexpr size_t kPayloadBytes = 2 * kPayloadSamples;
-  uint8_t payload[kPayloadBytes] = {0};
-
-  RTPHeader rtp_info;
-  constexpr uint32_t kRtpTimestamp1 = 0x1234;
-  PopulateRtpInfo(0, kRtpTimestamp1, &rtp_info);
-  EXPECT_EQ(0, neteq_->InsertPacket(rtp_info, payload, 0));
-  constexpr uint32_t kRtpTimestamp2 = kRtpTimestamp1 + kPayloadSamples;
-  PopulateRtpInfo(1, kRtpTimestamp2, &rtp_info);
-  EXPECT_EQ(0, neteq_->InsertPacket(rtp_info, payload, 0));
-
-  // Pull out data once.
-  AudioFrame output;
-  bool muted;
-  ASSERT_EQ(0, neteq_->GetAudio(&output, &muted));
-
-  EXPECT_EQ(std::vector<uint32_t>({kRtpTimestamp1, kRtpTimestamp2}),
-            neteq_->LastDecodedTimestamps());
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/neteq/neteq_unittest.proto b/modules/audio_coding/neteq/neteq_unittest.proto
deleted file mode 100644
index 344dcf6..0000000
--- a/modules/audio_coding/neteq/neteq_unittest.proto
+++ /dev/null
@@ -1,32 +0,0 @@
-syntax = "proto2";
-option optimize_for = LITE_RUNTIME;
-package webrtc.neteq_unittest;
-
-message NetEqNetworkStatistics {
-  // Next field number 18.
-  optional uint32 current_buffer_size_ms = 1;
-  optional uint32 preferred_buffer_size_ms = 2;
-  optional uint32 jitter_peaks_found = 3;
-  optional uint32 packet_loss_rate = 4;
-  optional uint32 packet_discard_rate = 5 [deprecated = true];
-  optional uint32 expand_rate = 6;
-  optional uint32 speech_expand_rate = 7;
-  optional uint32 preemptive_rate = 8;
-  optional uint32 accelerate_rate = 9;
-  optional uint32 secondary_decoded_rate = 10;
-  optional uint32 secondary_discarded_rate = 17;
-  optional int32 clockdrift_ppm = 11;
-  optional uint64 added_zero_samples = 12;
-  optional int32 mean_waiting_time_ms = 13;
-  optional int32 median_waiting_time_ms = 14;
-  optional int32 min_waiting_time_ms = 15;
-  optional int32 max_waiting_time_ms = 16;
-}
-
-message RtcpStatistics {
-  optional uint32 fraction_lost = 1;
-  optional uint32 cumulative_lost = 2;
-  optional uint32 extended_max_sequence_number = 3;
-  optional uint32 jitter = 4;
-}
-
diff --git a/modules/audio_coding/neteq/normal.cc b/modules/audio_coding/neteq/normal.cc
deleted file mode 100644
index 551fd9b..0000000
--- a/modules/audio_coding/neteq/normal.cc
+++ /dev/null
@@ -1,216 +0,0 @@
-/*
- *  Copyright (c) 2012 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/neteq/normal.h"
-
-#include <string.h>  // memset, memcpy
-
-#include <algorithm>  // min
-
-#include "webrtc/api/audio_codecs/audio_decoder.h"
-#include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
-#include "webrtc/modules/audio_coding/neteq/audio_multi_vector.h"
-#include "webrtc/modules/audio_coding/neteq/background_noise.h"
-#include "webrtc/modules/audio_coding/neteq/decoder_database.h"
-#include "webrtc/modules/audio_coding/neteq/expand.h"
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-
-int Normal::Process(const int16_t* input,
-                    size_t length,
-                    Modes last_mode,
-                    int16_t* external_mute_factor_array,
-                    AudioMultiVector* output) {
-  if (length == 0) {
-    // Nothing to process.
-    output->Clear();
-    return static_cast<int>(length);
-  }
-
-  RTC_DCHECK(output->Empty());
-  // Output should be empty at this point.
-  if (length % output->Channels() != 0) {
-    // The length does not match the number of channels.
-    output->Clear();
-    return 0;
-  }
-  output->PushBackInterleaved(input, length);
-
-  const int fs_mult = fs_hz_ / 8000;
-  RTC_DCHECK_GT(fs_mult, 0);
-  // fs_shift = log2(fs_mult), rounded down.
-  // Note that |fs_shift| is not "exact" for 48 kHz.
-  // TODO(hlundin): Investigate this further.
-  const int fs_shift = 30 - WebRtcSpl_NormW32(fs_mult);
-
-  // Check if last RecOut call resulted in an Expand. If so, we have to take
-  // care of some cross-fading and unmuting.
-  if (last_mode == kModeExpand) {
-    // Generate interpolation data using Expand.
-    // First, set Expand parameters to appropriate values.
-    expand_->SetParametersForNormalAfterExpand();
-
-    // Call Expand.
-    AudioMultiVector expanded(output->Channels());
-    expand_->Process(&expanded);
-    expand_->Reset();
-
-    size_t length_per_channel = length / output->Channels();
-    std::unique_ptr<int16_t[]> signal(new int16_t[length_per_channel]);
-    for (size_t channel_ix = 0; channel_ix < output->Channels(); ++channel_ix) {
-      // Adjust muting factor (main muting factor times expand muting factor).
-      external_mute_factor_array[channel_ix] = static_cast<int16_t>(
-          (external_mute_factor_array[channel_ix] *
-          expand_->MuteFactor(channel_ix)) >> 14);
-
-      (*output)[channel_ix].CopyTo(length_per_channel, 0, signal.get());
-
-      // Find largest absolute value in new data.
-      int16_t decoded_max =
-          WebRtcSpl_MaxAbsValueW16(signal.get(), length_per_channel);
-      // Adjust muting factor if needed (to BGN level).
-      size_t energy_length =
-          std::min(static_cast<size_t>(fs_mult * 64), length_per_channel);
-      int scaling = 6 + fs_shift
-          - WebRtcSpl_NormW32(decoded_max * decoded_max);
-      scaling = std::max(scaling, 0);  // |scaling| should always be >= 0.
-      int32_t energy = WebRtcSpl_DotProductWithScale(signal.get(), signal.get(),
-                                                     energy_length, scaling);
-      int32_t scaled_energy_length =
-          static_cast<int32_t>(energy_length >> scaling);
-      if (scaled_energy_length > 0) {
-        energy = energy / scaled_energy_length;
-      } else {
-        energy = 0;
-      }
-
-      int mute_factor;
-      if ((energy != 0) &&
-          (energy > background_noise_.Energy(channel_ix))) {
-        // Normalize new frame energy to 15 bits.
-        scaling = WebRtcSpl_NormW32(energy) - 16;
-        // We want background_noise_.energy() / energy in Q14.
-        int32_t bgn_energy = WEBRTC_SPL_SHIFT_W32(
-            background_noise_.Energy(channel_ix), scaling + 14);
-        int16_t energy_scaled =
-            static_cast<int16_t>(WEBRTC_SPL_SHIFT_W32(energy, scaling));
-        int32_t ratio = WebRtcSpl_DivW32W16(bgn_energy, energy_scaled);
-        mute_factor = WebRtcSpl_SqrtFloor(ratio << 14);
-      } else {
-        mute_factor = 16384;  // 1.0 in Q14.
-      }
-      if (mute_factor > external_mute_factor_array[channel_ix]) {
-        external_mute_factor_array[channel_ix] =
-            static_cast<int16_t>(std::min(mute_factor, 16384));
-      }
-
-      // If muted increase by 0.64 for every 20 ms (NB/WB 0.0040/0.0020 in Q14).
-      int increment = 64 / fs_mult;
-      for (size_t i = 0; i < length_per_channel; i++) {
-        // Scale with mute factor.
-        RTC_DCHECK_LT(channel_ix, output->Channels());
-        RTC_DCHECK_LT(i, output->Size());
-        int32_t scaled_signal = (*output)[channel_ix][i] *
-            external_mute_factor_array[channel_ix];
-        // Shift 14 with proper rounding.
-        (*output)[channel_ix][i] =
-            static_cast<int16_t>((scaled_signal + 8192) >> 14);
-        // Increase mute_factor towards 16384.
-        external_mute_factor_array[channel_ix] = static_cast<int16_t>(std::min(
-            external_mute_factor_array[channel_ix] + increment, 16384));
-      }
-
-      // Interpolate the expanded data into the new vector.
-      // (NB/WB/SWB32/SWB48 8/16/32/48 samples.)
-      size_t win_length = samples_per_ms_;
-      int16_t win_slope_Q14 = default_win_slope_Q14_;
-      RTC_DCHECK_LT(channel_ix, output->Channels());
-      if (win_length > output->Size()) {
-        win_length = output->Size();
-        win_slope_Q14 = (1 << 14) / static_cast<int16_t>(win_length);
-      }
-      int16_t win_up_Q14 = 0;
-      for (size_t i = 0; i < win_length; i++) {
-        win_up_Q14 += win_slope_Q14;
-        (*output)[channel_ix][i] =
-            (win_up_Q14 * (*output)[channel_ix][i] +
-             ((1 << 14) - win_up_Q14) * expanded[channel_ix][i] + (1 << 13)) >>
-            14;
-      }
-      RTC_DCHECK_GT(win_up_Q14,
-                    (1 << 14) - 32);  // Worst case rouding is a length of 34
-    }
-  } else if (last_mode == kModeRfc3389Cng) {
-    RTC_DCHECK_EQ(output->Channels(), 1);  // Not adapted for multi-channel yet.
-    static const size_t kCngLength = 48;
-    RTC_DCHECK_LE(8 * fs_mult, kCngLength);
-    int16_t cng_output[kCngLength];
-    // Reset mute factor and start up fresh.
-    external_mute_factor_array[0] = 16384;
-    ComfortNoiseDecoder* cng_decoder = decoder_database_->GetActiveCngDecoder();
-
-    if (cng_decoder) {
-      // Generate long enough for 48kHz.
-      if (!cng_decoder->Generate(cng_output, 0)) {
-        // Error returned; set return vector to all zeros.
-        memset(cng_output, 0, sizeof(cng_output));
-      }
-    } else {
-      // If no CNG instance is defined, just copy from the decoded data.
-      // (This will result in interpolating the decoded with itself.)
-      (*output)[0].CopyTo(fs_mult * 8, 0, cng_output);
-    }
-    // Interpolate the CNG into the new vector.
-    // (NB/WB/SWB32/SWB48 8/16/32/48 samples.)
-    size_t win_length = samples_per_ms_;
-    int16_t win_slope_Q14 = default_win_slope_Q14_;
-    if (win_length > kCngLength) {
-      win_length = kCngLength;
-      win_slope_Q14 = (1 << 14) / static_cast<int16_t>(win_length);
-    }
-    int16_t win_up_Q14 = 0;
-    for (size_t i = 0; i < win_length; i++) {
-      win_up_Q14 += win_slope_Q14;
-      (*output)[0][i] =
-          (win_up_Q14 * (*output)[0][i] +
-           ((1 << 14) - win_up_Q14) * cng_output[i] + (1 << 13)) >>
-          14;
-    }
-    RTC_DCHECK_GT(win_up_Q14,
-                  (1 << 14) - 32);  // Worst case rouding is a length of 34
-  } else if (external_mute_factor_array[0] < 16384) {
-    // Previous was neither of Expand, FadeToBGN or RFC3389_CNG, but we are
-    // still ramping up from previous muting.
-    // If muted increase by 0.64 for every 20 ms (NB/WB 0.0040/0.0020 in Q14).
-    int increment = 64 / fs_mult;
-    size_t length_per_channel = length / output->Channels();
-    for (size_t i = 0; i < length_per_channel; i++) {
-      for (size_t channel_ix = 0; channel_ix < output->Channels();
-          ++channel_ix) {
-        // Scale with mute factor.
-        RTC_DCHECK_LT(channel_ix, output->Channels());
-        RTC_DCHECK_LT(i, output->Size());
-        int32_t scaled_signal = (*output)[channel_ix][i] *
-            external_mute_factor_array[channel_ix];
-        // Shift 14 with proper rounding.
-        (*output)[channel_ix][i] =
-            static_cast<int16_t>((scaled_signal + 8192) >> 14);
-        // Increase mute_factor towards 16384.
-        external_mute_factor_array[channel_ix] = static_cast<int16_t>(std::min(
-            16384, external_mute_factor_array[channel_ix] + increment));
-      }
-    }
-  }
-
-  return static_cast<int>(length);
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/neteq/normal.h b/modules/audio_coding/neteq/normal.h
deleted file mode 100644
index c764155..0000000
--- a/modules/audio_coding/neteq/normal.h
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- *  Copyright (c) 2012 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_NETEQ_NORMAL_H_
-#define WEBRTC_MODULES_AUDIO_CODING_NETEQ_NORMAL_H_
-
-#include <string.h>  // Access to size_t.
-
-#include <vector>
-
-#include "webrtc/modules/audio_coding/neteq/audio_multi_vector.h"
-#include "webrtc/modules/audio_coding/neteq/defines.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/safe_conversions.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-// Forward declarations.
-class BackgroundNoise;
-class DecoderDatabase;
-class Expand;
-
-// This class provides the "Normal" DSP operation, that is performed when
-// there is no data loss, no need to stretch the timing of the signal, and
-// no other "special circumstances" are at hand.
-class Normal {
- public:
-  Normal(int fs_hz,
-         DecoderDatabase* decoder_database,
-         const BackgroundNoise& background_noise,
-         Expand* expand)
-      : fs_hz_(fs_hz),
-        decoder_database_(decoder_database),
-        background_noise_(background_noise),
-        expand_(expand),
-        samples_per_ms_(rtc::CheckedDivExact(fs_hz_, 1000)),
-        default_win_slope_Q14_(
-            rtc::dchecked_cast<uint16_t>((1 << 14) / samples_per_ms_)) {}
-
-  virtual ~Normal() {}
-
-  // Performs the "Normal" operation. The decoder data is supplied in |input|,
-  // having |length| samples in total for all channels (interleaved). The
-  // result is written to |output|. The number of channels allocated in
-  // |output| defines the number of channels that will be used when
-  // de-interleaving |input|. |last_mode| contains the mode used in the previous
-  // GetAudio call (i.e., not the current one), and |external_mute_factor| is
-  // a pointer to the mute factor in the NetEqImpl class.
-  int Process(const int16_t* input, size_t length,
-              Modes last_mode,
-              int16_t* external_mute_factor_array,
-              AudioMultiVector* output);
-
- private:
-  int fs_hz_;
-  DecoderDatabase* decoder_database_;
-  const BackgroundNoise& background_noise_;
-  Expand* expand_;
-  const size_t samples_per_ms_;
-  const int16_t default_win_slope_Q14_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(Normal);
-};
-
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_AUDIO_CODING_NETEQ_NORMAL_H_
diff --git a/modules/audio_coding/neteq/normal_unittest.cc b/modules/audio_coding/neteq/normal_unittest.cc
deleted file mode 100644
index 1044c4b..0000000
--- a/modules/audio_coding/neteq/normal_unittest.cc
+++ /dev/null
@@ -1,176 +0,0 @@
-/*
- *  Copyright (c) 2012 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.
- */
-
-// Unit tests for Normal class.
-
-#include "webrtc/modules/audio_coding/neteq/normal.h"
-
-#include <memory>
-#include <vector>
-
-#include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
-#include "webrtc/modules/audio_coding/neteq/audio_multi_vector.h"
-#include "webrtc/modules/audio_coding/neteq/background_noise.h"
-#include "webrtc/modules/audio_coding/neteq/expand.h"
-#include "webrtc/modules/audio_coding/neteq/mock/mock_decoder_database.h"
-#include "webrtc/modules/audio_coding/neteq/mock/mock_expand.h"
-#include "webrtc/modules/audio_coding/neteq/random_vector.h"
-#include "webrtc/modules/audio_coding/neteq/statistics_calculator.h"
-#include "webrtc/modules/audio_coding/neteq/sync_buffer.h"
-#include "webrtc/test/gtest.h"
-
-using ::testing::_;
-using ::testing::Invoke;
-
-namespace webrtc {
-
-namespace {
-
-int ExpandProcess120ms(AudioMultiVector* output) {
-  AudioMultiVector dummy_audio(1, 11520u);
-  dummy_audio.CopyTo(output);
-  return 0;
-}
-
-} // namespace
-
-TEST(Normal, CreateAndDestroy) {
-  MockDecoderDatabase db;
-  int fs = 8000;
-  size_t channels = 1;
-  BackgroundNoise bgn(channels);
-  SyncBuffer sync_buffer(1, 1000);
-  RandomVector random_vector;
-  StatisticsCalculator statistics;
-  Expand expand(&bgn, &sync_buffer, &random_vector, &statistics, fs, channels);
-  Normal normal(fs, &db, bgn, &expand);
-  EXPECT_CALL(db, Die());  // Called when |db| goes out of scope.
-}
-
-TEST(Normal, AvoidDivideByZero) {
-  WebRtcSpl_Init();
-  MockDecoderDatabase db;
-  int fs = 8000;
-  size_t channels = 1;
-  BackgroundNoise bgn(channels);
-  SyncBuffer sync_buffer(1, 1000);
-  RandomVector random_vector;
-  StatisticsCalculator statistics;
-  MockExpand expand(&bgn, &sync_buffer, &random_vector, &statistics, fs,
-                    channels);
-  Normal normal(fs, &db, bgn, &expand);
-
-  int16_t input[1000] = {0};
-  std::unique_ptr<int16_t[]> mute_factor_array(new int16_t[channels]);
-  for (size_t i = 0; i < channels; ++i) {
-    mute_factor_array[i] = 16384;
-  }
-  AudioMultiVector output(channels);
-
-  // Zero input length.
-  EXPECT_EQ(
-      0,
-      normal.Process(input, 0, kModeExpand, mute_factor_array.get(), &output));
-  EXPECT_EQ(0u, output.Size());
-
-  // Try to make energy_length >> scaling = 0;
-  EXPECT_CALL(expand, SetParametersForNormalAfterExpand());
-  EXPECT_CALL(expand, Process(_));
-  EXPECT_CALL(expand, Reset());
-  // If input_size_samples < 64, then energy_length in Normal::Process() will
-  // be equal to input_size_samples. Since the input is all zeros, decoded_max
-  // will be zero, and scaling will be >= 6. Thus, energy_length >> scaling = 0,
-  // and using this as a denominator would lead to problems.
-  int input_size_samples = 63;
-  EXPECT_EQ(input_size_samples,
-            normal.Process(input,
-                           input_size_samples,
-                           kModeExpand,
-                           mute_factor_array.get(),
-                           &output));
-
-  EXPECT_CALL(db, Die());      // Called when |db| goes out of scope.
-  EXPECT_CALL(expand, Die());  // Called when |expand| goes out of scope.
-}
-
-TEST(Normal, InputLengthAndChannelsDoNotMatch) {
-  WebRtcSpl_Init();
-  MockDecoderDatabase db;
-  int fs = 8000;
-  size_t channels = 2;
-  BackgroundNoise bgn(channels);
-  SyncBuffer sync_buffer(channels, 1000);
-  RandomVector random_vector;
-  StatisticsCalculator statistics;
-  MockExpand expand(&bgn, &sync_buffer, &random_vector, &statistics, fs,
-                    channels);
-  Normal normal(fs, &db, bgn, &expand);
-
-  int16_t input[1000] = {0};
-  std::unique_ptr<int16_t[]> mute_factor_array(new int16_t[channels]);
-  for (size_t i = 0; i < channels; ++i) {
-    mute_factor_array[i] = 16384;
-  }
-  AudioMultiVector output(channels);
-
-  // Let the number of samples be one sample less than 80 samples per channel.
-  size_t input_len = 80 * channels - 1;
-  EXPECT_EQ(
-      0,
-      normal.Process(
-          input, input_len, kModeExpand, mute_factor_array.get(), &output));
-  EXPECT_EQ(0u, output.Size());
-
-  EXPECT_CALL(db, Die());      // Called when |db| goes out of scope.
-  EXPECT_CALL(expand, Die());  // Called when |expand| goes out of scope.
-}
-
-TEST(Normal, LastModeExpand120msPacket) {
-  WebRtcSpl_Init();
-  MockDecoderDatabase db;
-  const int kFs = 48000;
-  const size_t kPacketsizeBytes = 11520u;
-  const size_t kChannels = 1;
-  BackgroundNoise bgn(kChannels);
-  SyncBuffer sync_buffer(kChannels, 1000);
-  RandomVector random_vector;
-  StatisticsCalculator statistics;
-  MockExpand expand(&bgn, &sync_buffer, &random_vector, &statistics, kFs,
-                    kChannels);
-  Normal normal(kFs, &db, bgn, &expand);
-
-  int16_t input[kPacketsizeBytes] = {0};
-
-  std::unique_ptr<int16_t[]> mute_factor_array(new int16_t[kChannels]);
-  for (size_t i = 0; i < kChannels; ++i) {
-    mute_factor_array[i] = 16384;
-  }
-
-  AudioMultiVector output(kChannels);
-
-  EXPECT_CALL(expand, SetParametersForNormalAfterExpand());
-  EXPECT_CALL(expand, Process(_)).WillOnce(Invoke(ExpandProcess120ms));
-  EXPECT_CALL(expand, Reset());
-  EXPECT_EQ(static_cast<int>(kPacketsizeBytes),
-            normal.Process(input,
-                           kPacketsizeBytes,
-                           kModeExpand,
-                           mute_factor_array.get(),
-                           &output));
-
-  EXPECT_EQ(kPacketsizeBytes, output.Size());
-
-  EXPECT_CALL(db, Die());      // Called when |db| goes out of scope.
-  EXPECT_CALL(expand, Die());  // Called when |expand| goes out of scope.
-}
-
-// TODO(hlundin): Write more tests.
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/neteq/packet.cc b/modules/audio_coding/neteq/packet.cc
deleted file mode 100644
index f25f81a..0000000
--- a/modules/audio_coding/neteq/packet.cc
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- *  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/neteq/packet.h"
-
-namespace webrtc {
-
-Packet::Packet() = default;
-Packet::Packet(Packet&& b) = default;
-
-Packet::~Packet() = default;
-
-Packet& Packet::operator=(Packet&& b) = default;
-
-Packet Packet::Clone() const {
-  RTC_CHECK(!frame);
-
-  Packet clone;
-  clone.timestamp = timestamp;
-  clone.sequence_number = sequence_number;
-  clone.payload_type = payload_type;
-  clone.payload.SetData(payload.data(), payload.size());
-  clone.priority = priority;
-
-  return clone;
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/neteq/packet.h b/modules/audio_coding/neteq/packet.h
deleted file mode 100644
index 52a9a13..0000000
--- a/modules/audio_coding/neteq/packet.h
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- *  Copyright (c) 2012 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_NETEQ_PACKET_H_
-#define WEBRTC_MODULES_AUDIO_CODING_NETEQ_PACKET_H_
-
-#include <list>
-#include <memory>
-
-#include "webrtc/api/audio_codecs/audio_decoder.h"
-#include "webrtc/modules/audio_coding/neteq/tick_timer.h"
-#include "webrtc/rtc_base/buffer.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-// Struct for holding RTP packets.
-struct Packet {
-  struct Priority {
-    Priority() : codec_level(0), red_level(0) {}
-    Priority(int codec_level, int red_level)
-        : codec_level(codec_level), red_level(red_level) {
-      CheckInvariant();
-    }
-
-    int codec_level;
-    int red_level;
-
-    // Priorities are sorted low-to-high, first on the level the codec
-    // prioritizes it, then on the level of RED packet it is; i.e. if it is a
-    // primary or secondary payload of a RED packet. For example: with Opus, an
-    // Fec packet (which the decoder prioritizes lower than a regular packet)
-    // will not be used if there is _any_ RED payload for the same
-    // timeframe. The highest priority packet will have levels {0, 0}. Negative
-    // priorities are not allowed.
-    bool operator<(const Priority& b) const {
-      CheckInvariant();
-      b.CheckInvariant();
-      if (codec_level == b.codec_level)
-        return red_level < b.red_level;
-
-      return codec_level < b.codec_level;
-    }
-    bool operator==(const Priority& b) const {
-      CheckInvariant();
-      b.CheckInvariant();
-      return codec_level == b.codec_level && red_level == b.red_level;
-    }
-    bool operator!=(const Priority& b) const { return !(*this == b); }
-    bool operator>(const Priority& b) const { return b < *this; }
-    bool operator<=(const Priority& b) const { return !(b > *this); }
-    bool operator>=(const Priority& b) const { return !(b < *this); }
-
-   private:
-    void CheckInvariant() const {
-      RTC_DCHECK_GE(codec_level, 0);
-      RTC_DCHECK_GE(red_level, 0);
-    }
-  };
-
-  uint32_t timestamp;
-  uint16_t sequence_number;
-  uint8_t payload_type;
-  // Datagram excluding RTP header and header extension.
-  rtc::Buffer payload;
-  Priority priority;
-  std::unique_ptr<TickTimer::Stopwatch> waiting_time;
-  std::unique_ptr<AudioDecoder::EncodedAudioFrame> frame;
-
-  Packet();
-  Packet(Packet&& b);
-  ~Packet();
-
-  // Packets should generally be moved around but sometimes it's useful to make
-  // a copy, for example for testing purposes. NOTE: Will only work for
-  // un-parsed packets, i.e. |frame| must be unset. The payload will, however,
-  // be copied. |waiting_time| will also not be copied.
-  Packet Clone() const;
-
-  Packet& operator=(Packet&& b);
-
-  // Comparison operators. Establish a packet ordering based on (1) timestamp,
-  // (2) sequence number and (3) redundancy.
-  // Timestamp and sequence numbers are compared taking wrap-around into
-  // account. For two packets with the same sequence number and timestamp a
-  // primary payload is considered "smaller" than a secondary.
-  bool operator==(const Packet& rhs) const {
-    return (this->timestamp == rhs.timestamp &&
-            this->sequence_number == rhs.sequence_number &&
-            this->priority == rhs.priority);
-  }
-  bool operator!=(const Packet& rhs) const { return !operator==(rhs); }
-  bool operator<(const Packet& rhs) const {
-    if (this->timestamp == rhs.timestamp) {
-      if (this->sequence_number == rhs.sequence_number) {
-        // Timestamp and sequence numbers are identical - deem the left hand
-        // side to be "smaller" (i.e., "earlier") if it has higher priority.
-        return this->priority < rhs.priority;
-      }
-      return (static_cast<uint16_t>(rhs.sequence_number -
-                                    this->sequence_number) < 0xFFFF / 2);
-    }
-    return (static_cast<uint32_t>(rhs.timestamp - this->timestamp) <
-            0xFFFFFFFF / 2);
-  }
-  bool operator>(const Packet& rhs) const { return rhs.operator<(*this); }
-  bool operator<=(const Packet& rhs) const { return !operator>(rhs); }
-  bool operator>=(const Packet& rhs) const { return !operator<(rhs); }
-
-  bool empty() const { return !frame && payload.empty(); }
-};
-
-// A list of packets.
-typedef std::list<Packet> PacketList;
-
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_AUDIO_CODING_NETEQ_PACKET_H_
diff --git a/modules/audio_coding/neteq/packet_buffer.cc b/modules/audio_coding/neteq/packet_buffer.cc
deleted file mode 100644
index e0e2e9a..0000000
--- a/modules/audio_coding/neteq/packet_buffer.cc
+++ /dev/null
@@ -1,294 +0,0 @@
-/*
- *  Copyright (c) 2012 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.
- */
-
-// This is the implementation of the PacketBuffer class. It is mostly based on
-// an STL list. The list is kept sorted at all times so that the next packet to
-// decode is at the beginning of the list.
-
-#include "webrtc/modules/audio_coding/neteq/packet_buffer.h"
-
-#include <algorithm>  // find_if()
-
-#include "webrtc/api/audio_codecs/audio_decoder.h"
-#include "webrtc/modules/audio_coding/neteq/decoder_database.h"
-#include "webrtc/modules/audio_coding/neteq/statistics_calculator.h"
-#include "webrtc/modules/audio_coding/neteq/tick_timer.h"
-#include "webrtc/rtc_base/logging.h"
-
-namespace webrtc {
-namespace {
-// Predicate used when inserting packets in the buffer list.
-// Operator() returns true when |packet| goes before |new_packet|.
-class NewTimestampIsLarger {
- public:
-  explicit NewTimestampIsLarger(const Packet& new_packet)
-      : new_packet_(new_packet) {
-  }
-  bool operator()(const Packet& packet) {
-    return (new_packet_ >= packet);
-  }
-
- private:
-  const Packet& new_packet_;
-};
-
-// Returns true if both payload types are known to the decoder database, and
-// have the same sample rate.
-bool EqualSampleRates(uint8_t pt1,
-                      uint8_t pt2,
-                      const DecoderDatabase& decoder_database) {
-  auto* di1 = decoder_database.GetDecoderInfo(pt1);
-  auto* di2 = decoder_database.GetDecoderInfo(pt2);
-  return di1 && di2 && di1->SampleRateHz() == di2->SampleRateHz();
-}
-
-void LogPacketDiscarded(int codec_level, StatisticsCalculator* stats) {
-  RTC_CHECK(stats);
-  if (codec_level > 0) {
-    stats->SecondaryPacketsDiscarded(1);
-  } else {
-    stats->PacketsDiscarded(1);
-  }
-}
-
-}  // namespace
-
-PacketBuffer::PacketBuffer(size_t max_number_of_packets,
-                           const TickTimer* tick_timer)
-    : max_number_of_packets_(max_number_of_packets), tick_timer_(tick_timer) {}
-
-// Destructor. All packets in the buffer will be destroyed.
-PacketBuffer::~PacketBuffer() {
-  Flush();
-}
-
-// Flush the buffer. All packets in the buffer will be destroyed.
-void PacketBuffer::Flush() {
-  buffer_.clear();
-}
-
-bool PacketBuffer::Empty() const {
-  return buffer_.empty();
-}
-
-int PacketBuffer::InsertPacket(Packet&& packet, StatisticsCalculator* stats) {
-  if (packet.empty()) {
-    LOG(LS_WARNING) << "InsertPacket invalid packet";
-    return kInvalidPacket;
-  }
-
-  RTC_DCHECK_GE(packet.priority.codec_level, 0);
-  RTC_DCHECK_GE(packet.priority.red_level, 0);
-
-  int return_val = kOK;
-
-  packet.waiting_time = tick_timer_->GetNewStopwatch();
-
-  if (buffer_.size() >= max_number_of_packets_) {
-    // Buffer is full. Flush it.
-    Flush();
-    LOG(LS_WARNING) << "Packet buffer flushed";
-    return_val = kFlushed;
-  }
-
-  // Get an iterator pointing to the place in the buffer where the new packet
-  // should be inserted. The list is searched from the back, since the most
-  // likely case is that the new packet should be near the end of the list.
-  PacketList::reverse_iterator rit = std::find_if(
-      buffer_.rbegin(), buffer_.rend(),
-      NewTimestampIsLarger(packet));
-
-  // The new packet is to be inserted to the right of |rit|. If it has the same
-  // timestamp as |rit|, which has a higher priority, do not insert the new
-  // packet to list.
-  if (rit != buffer_.rend() && packet.timestamp == rit->timestamp) {
-    LogPacketDiscarded(packet.priority.codec_level, stats);
-    return return_val;
-  }
-
-  // The new packet is to be inserted to the left of |it|. If it has the same
-  // timestamp as |it|, which has a lower priority, replace |it| with the new
-  // packet.
-  PacketList::iterator it = rit.base();
-  if (it != buffer_.end() && packet.timestamp == it->timestamp) {
-    LogPacketDiscarded(packet.priority.codec_level, stats);
-    it = buffer_.erase(it);
-  }
-  buffer_.insert(it, std::move(packet));  // Insert the packet at that position.
-
-  return return_val;
-}
-
-int PacketBuffer::InsertPacketList(
-    PacketList* packet_list,
-    const DecoderDatabase& decoder_database,
-    rtc::Optional<uint8_t>* current_rtp_payload_type,
-    rtc::Optional<uint8_t>* current_cng_rtp_payload_type,
-    StatisticsCalculator* stats) {
-  RTC_DCHECK(stats);
-  bool flushed = false;
-  for (auto& packet : *packet_list) {
-    if (decoder_database.IsComfortNoise(packet.payload_type)) {
-      if (*current_cng_rtp_payload_type &&
-          **current_cng_rtp_payload_type != packet.payload_type) {
-        // New CNG payload type implies new codec type.
-        *current_rtp_payload_type = rtc::Optional<uint8_t>();
-        Flush();
-        flushed = true;
-      }
-      *current_cng_rtp_payload_type =
-          rtc::Optional<uint8_t>(packet.payload_type);
-    } else if (!decoder_database.IsDtmf(packet.payload_type)) {
-      // This must be speech.
-      if ((*current_rtp_payload_type &&
-           **current_rtp_payload_type != packet.payload_type) ||
-          (*current_cng_rtp_payload_type &&
-           !EqualSampleRates(packet.payload_type,
-                             **current_cng_rtp_payload_type,
-                             decoder_database))) {
-        *current_cng_rtp_payload_type = rtc::Optional<uint8_t>();
-        Flush();
-        flushed = true;
-      }
-      *current_rtp_payload_type = rtc::Optional<uint8_t>(packet.payload_type);
-    }
-    int return_val = InsertPacket(std::move(packet), stats);
-    if (return_val == kFlushed) {
-      // The buffer flushed, but this is not an error. We can still continue.
-      flushed = true;
-    } else if (return_val != kOK) {
-      // An error occurred. Delete remaining packets in list and return.
-      packet_list->clear();
-      return return_val;
-    }
-  }
-  packet_list->clear();
-  return flushed ? kFlushed : kOK;
-}
-
-int PacketBuffer::NextTimestamp(uint32_t* next_timestamp) const {
-  if (Empty()) {
-    return kBufferEmpty;
-  }
-  if (!next_timestamp) {
-    return kInvalidPointer;
-  }
-  *next_timestamp = buffer_.front().timestamp;
-  return kOK;
-}
-
-int PacketBuffer::NextHigherTimestamp(uint32_t timestamp,
-                                      uint32_t* next_timestamp) const {
-  if (Empty()) {
-    return kBufferEmpty;
-  }
-  if (!next_timestamp) {
-    return kInvalidPointer;
-  }
-  PacketList::const_iterator it;
-  for (it = buffer_.begin(); it != buffer_.end(); ++it) {
-    if (it->timestamp >= timestamp) {
-      // Found a packet matching the search.
-      *next_timestamp = it->timestamp;
-      return kOK;
-    }
-  }
-  return kNotFound;
-}
-
-const Packet* PacketBuffer::PeekNextPacket() const {
-  return buffer_.empty() ? nullptr : &buffer_.front();
-}
-
-rtc::Optional<Packet> PacketBuffer::GetNextPacket() {
-  if (Empty()) {
-    // Buffer is empty.
-    return rtc::Optional<Packet>();
-  }
-
-  rtc::Optional<Packet> packet(std::move(buffer_.front()));
-  // Assert that the packet sanity checks in InsertPacket method works.
-  RTC_DCHECK(!packet->empty());
-  buffer_.pop_front();
-
-  return packet;
-}
-
-int PacketBuffer::DiscardNextPacket(StatisticsCalculator* stats) {
-  if (Empty()) {
-    return kBufferEmpty;
-  }
-  // Assert that the packet sanity checks in InsertPacket method works.
-  const Packet& packet = buffer_.front();
-  RTC_DCHECK(!packet.empty());
-  LogPacketDiscarded(packet.priority.codec_level, stats);
-  buffer_.pop_front();
-  return kOK;
-}
-
-void PacketBuffer::DiscardOldPackets(uint32_t timestamp_limit,
-                                     uint32_t horizon_samples,
-                                     StatisticsCalculator* stats) {
-  buffer_.remove_if([timestamp_limit, horizon_samples, stats](const Packet& p) {
-    if (timestamp_limit == p.timestamp ||
-        !IsObsoleteTimestamp(p.timestamp, timestamp_limit, horizon_samples)) {
-      return false;
-    }
-    LogPacketDiscarded(p.priority.codec_level, stats);
-    return true;
-  });
-}
-
-void PacketBuffer::DiscardAllOldPackets(uint32_t timestamp_limit,
-                                        StatisticsCalculator* stats) {
-  DiscardOldPackets(timestamp_limit, 0, stats);
-}
-
-void PacketBuffer::DiscardPacketsWithPayloadType(uint8_t payload_type,
-                                                 StatisticsCalculator* stats) {
-  buffer_.remove_if([payload_type, stats](const Packet& p) {
-    if (p.payload_type != payload_type) {
-      return false;
-    }
-    LogPacketDiscarded(p.priority.codec_level, stats);
-    return true;
-  });
-}
-
-size_t PacketBuffer::NumPacketsInBuffer() const {
-  return buffer_.size();
-}
-
-size_t PacketBuffer::NumSamplesInBuffer(size_t last_decoded_length) const {
-  size_t num_samples = 0;
-  size_t last_duration = last_decoded_length;
-  for (const Packet& packet : buffer_) {
-    if (packet.frame) {
-      // TODO(hlundin): Verify that it's fine to count all packets and remove
-      // this check.
-      if (packet.priority != Packet::Priority(0, 0)) {
-        continue;
-      }
-      size_t duration = packet.frame->Duration();
-      if (duration > 0) {
-        last_duration = duration;  // Save the most up-to-date (valid) duration.
-      }
-    }
-    num_samples += last_duration;
-  }
-  return num_samples;
-}
-
-void PacketBuffer::BufferStat(int* num_packets, int* max_num_packets) const {
-  *num_packets = static_cast<int>(buffer_.size());
-  *max_num_packets = static_cast<int>(max_number_of_packets_);
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/neteq/packet_buffer.h b/modules/audio_coding/neteq/packet_buffer.h
deleted file mode 100644
index 5c2499c..0000000
--- a/modules/audio_coding/neteq/packet_buffer.h
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- *  Copyright (c) 2012 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_NETEQ_PACKET_BUFFER_H_
-#define WEBRTC_MODULES_AUDIO_CODING_NETEQ_PACKET_BUFFER_H_
-
-#include "webrtc/api/optional.h"
-#include "webrtc/modules/audio_coding/neteq/packet.h"
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-class DecoderDatabase;
-class StatisticsCalculator;
-class TickTimer;
-
-// This is the actual buffer holding the packets before decoding.
-class PacketBuffer {
- public:
-  enum BufferReturnCodes {
-    kOK = 0,
-    kFlushed,
-    kNotFound,
-    kBufferEmpty,
-    kInvalidPacket,
-    kInvalidPointer
-  };
-
-  // Constructor creates a buffer which can hold a maximum of
-  // |max_number_of_packets| packets.
-  PacketBuffer(size_t max_number_of_packets, const TickTimer* tick_timer);
-
-  // Deletes all packets in the buffer before destroying the buffer.
-  virtual ~PacketBuffer();
-
-  // Flushes the buffer and deletes all packets in it.
-  virtual void Flush();
-
-  // Returns true for an empty buffer.
-  virtual bool Empty() const;
-
-  // Inserts |packet| into the buffer. The buffer will take over ownership of
-  // the packet object.
-  // Returns PacketBuffer::kOK on success, PacketBuffer::kFlushed if the buffer
-  // was flushed due to overfilling.
-  virtual int InsertPacket(Packet&& packet, StatisticsCalculator* stats);
-
-  // Inserts a list of packets into the buffer. The buffer will take over
-  // ownership of the packet objects.
-  // Returns PacketBuffer::kOK if all packets were inserted successfully.
-  // If the buffer was flushed due to overfilling, only a subset of the list is
-  // inserted, and PacketBuffer::kFlushed is returned.
-  // The last three parameters are included for legacy compatibility.
-  // TODO(hlundin): Redesign to not use current_*_payload_type and
-  // decoder_database.
-  virtual int InsertPacketList(
-      PacketList* packet_list,
-      const DecoderDatabase& decoder_database,
-      rtc::Optional<uint8_t>* current_rtp_payload_type,
-      rtc::Optional<uint8_t>* current_cng_rtp_payload_type,
-      StatisticsCalculator* stats);
-
-  // Gets the timestamp for the first packet in the buffer and writes it to the
-  // output variable |next_timestamp|.
-  // Returns PacketBuffer::kBufferEmpty if the buffer is empty,
-  // PacketBuffer::kOK otherwise.
-  virtual int NextTimestamp(uint32_t* next_timestamp) const;
-
-  // Gets the timestamp for the first packet in the buffer with a timestamp no
-  // lower than the input limit |timestamp|. The result is written to the output
-  // variable |next_timestamp|.
-  // Returns PacketBuffer::kBufferEmpty if the buffer is empty,
-  // PacketBuffer::kOK otherwise.
-  virtual int NextHigherTimestamp(uint32_t timestamp,
-                                  uint32_t* next_timestamp) const;
-
-  // Returns a (constant) pointer to the first packet in the buffer. Returns
-  // NULL if the buffer is empty.
-  virtual const Packet* PeekNextPacket() const;
-
-  // Extracts the first packet in the buffer and returns it.
-  // Returns an empty optional if the buffer is empty.
-  virtual rtc::Optional<Packet> GetNextPacket();
-
-  // Discards the first packet in the buffer. The packet is deleted.
-  // Returns PacketBuffer::kBufferEmpty if the buffer is empty,
-  // PacketBuffer::kOK otherwise.
-  virtual int DiscardNextPacket(StatisticsCalculator* stats);
-
-  // Discards all packets that are (strictly) older than timestamp_limit,
-  // but newer than timestamp_limit - horizon_samples. Setting horizon_samples
-  // to zero implies that the horizon is set to half the timestamp range. That
-  // is, if a packet is more than 2^31 timestamps into the future compared with
-  // timestamp_limit (including wrap-around), it is considered old.
-  virtual void DiscardOldPackets(uint32_t timestamp_limit,
-                                 uint32_t horizon_samples,
-                                 StatisticsCalculator* stats);
-
-  // Discards all packets that are (strictly) older than timestamp_limit.
-  virtual void DiscardAllOldPackets(uint32_t timestamp_limit,
-                                    StatisticsCalculator* stats);
-
-  // Removes all packets with a specific payload type from the buffer.
-  virtual void DiscardPacketsWithPayloadType(uint8_t payload_type,
-                                             StatisticsCalculator* stats);
-
-  // Returns the number of packets in the buffer, including duplicates and
-  // redundant packets.
-  virtual size_t NumPacketsInBuffer() const;
-
-  // Returns the number of samples in the buffer, including samples carried in
-  // duplicate and redundant packets.
-  virtual size_t NumSamplesInBuffer(size_t last_decoded_length) const;
-
-  virtual void BufferStat(int* num_packets, int* max_num_packets) const;
-
-  // Static method returning true if |timestamp| is older than |timestamp_limit|
-  // but less than |horizon_samples| behind |timestamp_limit|. For instance,
-  // with timestamp_limit = 100 and horizon_samples = 10, a timestamp in the
-  // range (90, 100) is considered obsolete, and will yield true.
-  // Setting |horizon_samples| to 0 is the same as setting it to 2^31, i.e.,
-  // half the 32-bit timestamp range.
-  static bool IsObsoleteTimestamp(uint32_t timestamp,
-                                  uint32_t timestamp_limit,
-                                  uint32_t horizon_samples) {
-    return IsNewerTimestamp(timestamp_limit, timestamp) &&
-           (horizon_samples == 0 ||
-            IsNewerTimestamp(timestamp, timestamp_limit - horizon_samples));
-  }
-
- private:
-  size_t max_number_of_packets_;
-  PacketList buffer_;
-  const TickTimer* tick_timer_;
-  RTC_DISALLOW_COPY_AND_ASSIGN(PacketBuffer);
-};
-
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_AUDIO_CODING_NETEQ_PACKET_BUFFER_H_
diff --git a/modules/audio_coding/neteq/packet_buffer_unittest.cc b/modules/audio_coding/neteq/packet_buffer_unittest.cc
deleted file mode 100644
index 7dcf6c4..0000000
--- a/modules/audio_coding/neteq/packet_buffer_unittest.cc
+++ /dev/null
@@ -1,737 +0,0 @@
-/*
- *  Copyright (c) 2012 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.
- */
-
-// Unit tests for PacketBuffer class.
-
-#include "webrtc/modules/audio_coding/neteq/packet_buffer.h"
-#include "webrtc/api/audio_codecs/builtin_audio_decoder_factory.h"
-#include "webrtc/modules/audio_coding/neteq/mock/mock_decoder_database.h"
-#include "webrtc/modules/audio_coding/neteq/mock/mock_statistics_calculator.h"
-#include "webrtc/modules/audio_coding/neteq/packet.h"
-#include "webrtc/modules/audio_coding/neteq/tick_timer.h"
-#include "webrtc/test/gmock.h"
-#include "webrtc/test/gtest.h"
-
-using ::testing::Return;
-using ::testing::StrictMock;
-using ::testing::_;
-using ::testing::InSequence;
-using ::testing::MockFunction;
-
-namespace webrtc {
-
-// Helper class to generate packets. Packets must be deleted by the user.
-class PacketGenerator {
- public:
-  PacketGenerator(uint16_t seq_no, uint32_t ts, uint8_t pt, int frame_size);
-  virtual ~PacketGenerator() {}
-  void Reset(uint16_t seq_no, uint32_t ts, uint8_t pt, int frame_size);
-  Packet NextPacket(int payload_size_bytes);
-
-  uint16_t seq_no_;
-  uint32_t ts_;
-  uint8_t pt_;
-  int frame_size_;
-};
-
-PacketGenerator::PacketGenerator(uint16_t seq_no, uint32_t ts, uint8_t pt,
-                                 int frame_size) {
-  Reset(seq_no, ts, pt, frame_size);
-}
-
-void PacketGenerator::Reset(uint16_t seq_no, uint32_t ts, uint8_t pt,
-                            int frame_size) {
-  seq_no_ = seq_no;
-  ts_ = ts;
-  pt_ = pt;
-  frame_size_ = frame_size;
-}
-
-Packet PacketGenerator::NextPacket(int payload_size_bytes) {
-  Packet packet;
-  packet.sequence_number = seq_no_;
-  packet.timestamp = ts_;
-  packet.payload_type = pt_;
-  packet.payload.SetSize(payload_size_bytes);
-  ++seq_no_;
-  ts_ += frame_size_;
-  return packet;
-}
-
-struct PacketsToInsert {
-  uint16_t sequence_number;
-  uint32_t timestamp;
-  uint8_t payload_type;
-  bool primary;
-  // Order of this packet to appear upon extraction, after inserting a series
-  // of packets. A negative number means that it should have been discarded
-  // before extraction.
-  int extract_order;
-};
-
-// Start of test definitions.
-
-TEST(PacketBuffer, CreateAndDestroy) {
-  TickTimer tick_timer;
-  PacketBuffer* buffer = new PacketBuffer(10, &tick_timer);  // 10 packets.
-  EXPECT_TRUE(buffer->Empty());
-  delete buffer;
-}
-
-TEST(PacketBuffer, InsertPacket) {
-  TickTimer tick_timer;
-  PacketBuffer buffer(10, &tick_timer);  // 10 packets.
-  PacketGenerator gen(17u, 4711u, 0, 10);
-  StrictMock<MockStatisticsCalculator> mock_stats;
-
-  const int payload_len = 100;
-  const Packet packet = gen.NextPacket(payload_len);
-  EXPECT_EQ(0, buffer.InsertPacket(packet.Clone(), &mock_stats));
-  uint32_t next_ts;
-  EXPECT_EQ(PacketBuffer::kOK, buffer.NextTimestamp(&next_ts));
-  EXPECT_EQ(4711u, next_ts);
-  EXPECT_FALSE(buffer.Empty());
-  EXPECT_EQ(1u, buffer.NumPacketsInBuffer());
-  const Packet* next_packet = buffer.PeekNextPacket();
-  EXPECT_EQ(packet, *next_packet);  // Compare contents.
-
-  // Do not explicitly flush buffer or delete packet to test that it is deleted
-  // with the buffer. (Tested with Valgrind or similar tool.)
-}
-
-// Test to flush buffer.
-TEST(PacketBuffer, FlushBuffer) {
-  TickTimer tick_timer;
-  PacketBuffer buffer(10, &tick_timer);  // 10 packets.
-  PacketGenerator gen(0, 0, 0, 10);
-  const int payload_len = 10;
-  StrictMock<MockStatisticsCalculator> mock_stats;
-
-  // Insert 10 small packets; should be ok.
-  for (int i = 0; i < 10; ++i) {
-    EXPECT_EQ(PacketBuffer::kOK,
-              buffer.InsertPacket(gen.NextPacket(payload_len), &mock_stats));
-  }
-  EXPECT_EQ(10u, buffer.NumPacketsInBuffer());
-  EXPECT_FALSE(buffer.Empty());
-
-  buffer.Flush();
-  // Buffer should delete the payloads itself.
-  EXPECT_EQ(0u, buffer.NumPacketsInBuffer());
-  EXPECT_TRUE(buffer.Empty());
-}
-
-// Test to fill the buffer over the limits, and verify that it flushes.
-TEST(PacketBuffer, OverfillBuffer) {
-  TickTimer tick_timer;
-  PacketBuffer buffer(10, &tick_timer);  // 10 packets.
-  PacketGenerator gen(0, 0, 0, 10);
-  StrictMock<MockStatisticsCalculator> mock_stats;
-
-  // Insert 10 small packets; should be ok.
-  const int payload_len = 10;
-  int i;
-  for (i = 0; i < 10; ++i) {
-    EXPECT_EQ(PacketBuffer::kOK,
-              buffer.InsertPacket(gen.NextPacket(payload_len), &mock_stats));
-  }
-  EXPECT_EQ(10u, buffer.NumPacketsInBuffer());
-  uint32_t next_ts;
-  EXPECT_EQ(PacketBuffer::kOK, buffer.NextTimestamp(&next_ts));
-  EXPECT_EQ(0u, next_ts);  // Expect first inserted packet to be first in line.
-
-  const Packet packet = gen.NextPacket(payload_len);
-  // Insert 11th packet; should flush the buffer and insert it after flushing.
-  EXPECT_EQ(PacketBuffer::kFlushed,
-            buffer.InsertPacket(packet.Clone(), &mock_stats));
-  EXPECT_EQ(1u, buffer.NumPacketsInBuffer());
-  EXPECT_EQ(PacketBuffer::kOK, buffer.NextTimestamp(&next_ts));
-  // Expect last inserted packet to be first in line.
-  EXPECT_EQ(packet.timestamp, next_ts);
-
-  // Flush buffer to delete all packets.
-  buffer.Flush();
-}
-
-// Test inserting a list of packets.
-TEST(PacketBuffer, InsertPacketList) {
-  TickTimer tick_timer;
-  PacketBuffer buffer(10, &tick_timer);  // 10 packets.
-  PacketGenerator gen(0, 0, 0, 10);
-  PacketList list;
-  const int payload_len = 10;
-
-  // Insert 10 small packets.
-  for (int i = 0; i < 10; ++i) {
-    list.push_back(gen.NextPacket(payload_len));
-  }
-
-  MockDecoderDatabase decoder_database;
-  auto factory = CreateBuiltinAudioDecoderFactory();
-  const DecoderDatabase::DecoderInfo info(NetEqDecoder::kDecoderPCMu, factory);
-  EXPECT_CALL(decoder_database, GetDecoderInfo(0))
-      .WillRepeatedly(Return(&info));
-
-  StrictMock<MockStatisticsCalculator> mock_stats;
-
-  rtc::Optional<uint8_t> current_pt;
-  rtc::Optional<uint8_t> current_cng_pt;
-  EXPECT_EQ(PacketBuffer::kOK,
-            buffer.InsertPacketList(&list, decoder_database, &current_pt,
-                                    &current_cng_pt, &mock_stats));
-  EXPECT_TRUE(list.empty());  // The PacketBuffer should have depleted the list.
-  EXPECT_EQ(10u, buffer.NumPacketsInBuffer());
-  EXPECT_EQ(rtc::Optional<uint8_t>(0),
-            current_pt);         // Current payload type changed to 0.
-  EXPECT_FALSE(current_cng_pt);  // CNG payload type not changed.
-
-  buffer.Flush();  // Clean up.
-
-  EXPECT_CALL(decoder_database, Die());  // Called when object is deleted.
-}
-
-// Test inserting a list of packets. Last packet is of a different payload type.
-// Expecting the buffer to flush.
-// TODO(hlundin): Remove this test when legacy operation is no longer needed.
-TEST(PacketBuffer, InsertPacketListChangePayloadType) {
-  TickTimer tick_timer;
-  PacketBuffer buffer(10, &tick_timer);  // 10 packets.
-  PacketGenerator gen(0, 0, 0, 10);
-  PacketList list;
-  const int payload_len = 10;
-
-  // Insert 10 small packets.
-  for (int i = 0; i < 10; ++i) {
-    list.push_back(gen.NextPacket(payload_len));
-  }
-  // Insert 11th packet of another payload type (not CNG).
-  {
-    Packet packet = gen.NextPacket(payload_len);
-    packet.payload_type = 1;
-    list.push_back(std::move(packet));
-  }
-
-  MockDecoderDatabase decoder_database;
-  auto factory = CreateBuiltinAudioDecoderFactory();
-  const DecoderDatabase::DecoderInfo info0(NetEqDecoder::kDecoderPCMu, factory);
-  EXPECT_CALL(decoder_database, GetDecoderInfo(0))
-      .WillRepeatedly(Return(&info0));
-  const DecoderDatabase::DecoderInfo info1(NetEqDecoder::kDecoderPCMa, factory);
-  EXPECT_CALL(decoder_database, GetDecoderInfo(1))
-      .WillRepeatedly(Return(&info1));
-
-  StrictMock<MockStatisticsCalculator> mock_stats;
-
-  rtc::Optional<uint8_t> current_pt;
-  rtc::Optional<uint8_t> current_cng_pt;
-  EXPECT_EQ(PacketBuffer::kFlushed,
-            buffer.InsertPacketList(&list, decoder_database, &current_pt,
-                                    &current_cng_pt, &mock_stats));
-  EXPECT_TRUE(list.empty());  // The PacketBuffer should have depleted the list.
-  EXPECT_EQ(1u, buffer.NumPacketsInBuffer());  // Only the last packet.
-  EXPECT_EQ(rtc::Optional<uint8_t>(1),
-            current_pt);         // Current payload type changed to 1.
-  EXPECT_FALSE(current_cng_pt);  // CNG payload type not changed.
-
-  buffer.Flush();  // Clean up.
-
-  EXPECT_CALL(decoder_database, Die());  // Called when object is deleted.
-}
-
-TEST(PacketBuffer, ExtractOrderRedundancy) {
-  TickTimer tick_timer;
-  PacketBuffer buffer(100, &tick_timer);  // 100 packets.
-  const int kPackets = 18;
-  const int kFrameSize = 10;
-  const int kPayloadLength = 10;
-
-  PacketsToInsert packet_facts[kPackets] = {
-    {0xFFFD, 0xFFFFFFD7, 0, true, 0},
-    {0xFFFE, 0xFFFFFFE1, 0, true, 1},
-    {0xFFFE, 0xFFFFFFD7, 1, false, -1},
-    {0xFFFF, 0xFFFFFFEB, 0, true, 2},
-    {0xFFFF, 0xFFFFFFE1, 1, false, -1},
-    {0x0000, 0xFFFFFFF5, 0, true, 3},
-    {0x0000, 0xFFFFFFEB, 1, false, -1},
-    {0x0001, 0xFFFFFFFF, 0, true, 4},
-    {0x0001, 0xFFFFFFF5, 1, false, -1},
-    {0x0002, 0x0000000A, 0, true, 5},
-    {0x0002, 0xFFFFFFFF, 1, false, -1},
-    {0x0003, 0x0000000A, 1, false, -1},
-    {0x0004, 0x0000001E, 0, true, 7},
-    {0x0004, 0x00000014, 1, false, 6},
-    {0x0005, 0x0000001E, 0, true, -1},
-    {0x0005, 0x00000014, 1, false, -1},
-    {0x0006, 0x00000028, 0, true, 8},
-    {0x0006, 0x0000001E, 1, false, -1},
-  };
-
-  const size_t kExpectPacketsInBuffer = 9;
-
-  std::vector<Packet> expect_order(kExpectPacketsInBuffer);
-
-  PacketGenerator gen(0, 0, 0, kFrameSize);
-
-  StrictMock<MockStatisticsCalculator> mock_stats;
-
-  // Interleaving the EXPECT_CALL sequence with expectations on the MockFunction
-  // check ensures that exactly one call to PacketsDiscarded happens in each
-  // DiscardNextPacket call.
-  InSequence s;
-  MockFunction<void(int check_point_id)> check;
-  for (int i = 0; i < kPackets; ++i) {
-    gen.Reset(packet_facts[i].sequence_number,
-              packet_facts[i].timestamp,
-              packet_facts[i].payload_type,
-              kFrameSize);
-    Packet packet = gen.NextPacket(kPayloadLength);
-    packet.priority.codec_level = packet_facts[i].primary ? 0 : 1;
-    if (packet_facts[i].extract_order < 0) {
-      if (packet.priority.codec_level > 0) {
-        EXPECT_CALL(mock_stats, SecondaryPacketsDiscarded(1));
-      } else {
-        EXPECT_CALL(mock_stats, PacketsDiscarded(1));
-      }
-    }
-    EXPECT_CALL(check, Call(i));
-    EXPECT_EQ(PacketBuffer::kOK,
-              buffer.InsertPacket(packet.Clone(), &mock_stats));
-    if (packet_facts[i].extract_order >= 0) {
-      expect_order[packet_facts[i].extract_order] = std::move(packet);
-    }
-    check.Call(i);
-  }
-
-  EXPECT_EQ(kExpectPacketsInBuffer, buffer.NumPacketsInBuffer());
-
-  for (size_t i = 0; i < kExpectPacketsInBuffer; ++i) {
-    const rtc::Optional<Packet> packet = buffer.GetNextPacket();
-    EXPECT_EQ(packet, expect_order[i]);  // Compare contents.
-  }
-  EXPECT_TRUE(buffer.Empty());
-}
-
-TEST(PacketBuffer, DiscardPackets) {
-  TickTimer tick_timer;
-  PacketBuffer buffer(100, &tick_timer);  // 100 packets.
-  const uint16_t start_seq_no = 17;
-  const uint32_t start_ts = 4711;
-  const uint32_t ts_increment = 10;
-  PacketGenerator gen(start_seq_no, start_ts, 0, ts_increment);
-  PacketList list;
-  const int payload_len = 10;
-  StrictMock<MockStatisticsCalculator> mock_stats;
-
-  constexpr int kTotalPackets = 10;
-  // Insert 10 small packets.
-  for (int i = 0; i < kTotalPackets; ++i) {
-    buffer.InsertPacket(gen.NextPacket(payload_len), &mock_stats);
-  }
-  EXPECT_EQ(10u, buffer.NumPacketsInBuffer());
-
-  uint32_t current_ts = start_ts;
-
-  // Discard them one by one and make sure that the right packets are at the
-  // front of the buffer.
-  constexpr int kDiscardPackets = 5;
-
-  // Interleaving the EXPECT_CALL sequence with expectations on the MockFunction
-  // check ensures that exactly one call to PacketsDiscarded happens in each
-  // DiscardNextPacket call.
-  InSequence s;
-  MockFunction<void(int check_point_id)> check;
-  for (int i = 0; i < kDiscardPackets; ++i) {
-    uint32_t ts;
-    EXPECT_EQ(PacketBuffer::kOK, buffer.NextTimestamp(&ts));
-    EXPECT_EQ(current_ts, ts);
-    EXPECT_CALL(mock_stats, PacketsDiscarded(1));
-    EXPECT_CALL(check, Call(i));
-    EXPECT_EQ(PacketBuffer::kOK, buffer.DiscardNextPacket(&mock_stats));
-    current_ts += ts_increment;
-    check.Call(i);
-  }
-
-  constexpr int kRemainingPackets = kTotalPackets - kDiscardPackets;
-  // This will discard all remaining packets but one. The oldest packet is older
-  // than the indicated horizon_samples, and will thus be left in the buffer.
-  constexpr size_t kSkipPackets = 1;
-  EXPECT_CALL(mock_stats, PacketsDiscarded(1))
-      .Times(kRemainingPackets - kSkipPackets);
-  EXPECT_CALL(check, Call(17));  // Arbitrary id number.
-  buffer.DiscardOldPackets(start_ts + kTotalPackets * ts_increment,
-                           kRemainingPackets * ts_increment, &mock_stats);
-  check.Call(17);  // Same arbitrary id number.
-
-  EXPECT_EQ(kSkipPackets, buffer.NumPacketsInBuffer());
-  uint32_t ts;
-  EXPECT_EQ(PacketBuffer::kOK, buffer.NextTimestamp(&ts));
-  EXPECT_EQ(current_ts, ts);
-
-  // Discard all remaining packets.
-  EXPECT_CALL(mock_stats, PacketsDiscarded(kSkipPackets));
-  buffer.DiscardAllOldPackets(start_ts + kTotalPackets * ts_increment,
-                              &mock_stats);
-
-  EXPECT_TRUE(buffer.Empty());
-}
-
-TEST(PacketBuffer, Reordering) {
-  TickTimer tick_timer;
-  PacketBuffer buffer(100, &tick_timer);  // 100 packets.
-  const uint16_t start_seq_no = 17;
-  const uint32_t start_ts = 4711;
-  const uint32_t ts_increment = 10;
-  PacketGenerator gen(start_seq_no, start_ts, 0, ts_increment);
-  const int payload_len = 10;
-
-  // Generate 10 small packets and insert them into a PacketList. Insert every
-  // odd packet to the front, and every even packet to the back, thus creating
-  // a (rather strange) reordering.
-  PacketList list;
-  for (int i = 0; i < 10; ++i) {
-    Packet packet = gen.NextPacket(payload_len);
-    if (i % 2) {
-      list.push_front(std::move(packet));
-    } else {
-      list.push_back(std::move(packet));
-    }
-  }
-
-  MockDecoderDatabase decoder_database;
-  auto factory = CreateBuiltinAudioDecoderFactory();
-  const DecoderDatabase::DecoderInfo info(NetEqDecoder::kDecoderPCMu, factory);
-  EXPECT_CALL(decoder_database, GetDecoderInfo(0))
-      .WillRepeatedly(Return(&info));
-  rtc::Optional<uint8_t> current_pt;
-  rtc::Optional<uint8_t> current_cng_pt;
-
-  StrictMock<MockStatisticsCalculator> mock_stats;
-
-  EXPECT_EQ(PacketBuffer::kOK,
-            buffer.InsertPacketList(&list, decoder_database, &current_pt,
-                                    &current_cng_pt, &mock_stats));
-  EXPECT_EQ(10u, buffer.NumPacketsInBuffer());
-
-  // Extract them and make sure that come out in the right order.
-  uint32_t current_ts = start_ts;
-  for (int i = 0; i < 10; ++i) {
-    const rtc::Optional<Packet> packet = buffer.GetNextPacket();
-    ASSERT_TRUE(packet);
-    EXPECT_EQ(current_ts, packet->timestamp);
-    current_ts += ts_increment;
-  }
-  EXPECT_TRUE(buffer.Empty());
-
-  EXPECT_CALL(decoder_database, Die());  // Called when object is deleted.
-}
-
-// The test first inserts a packet with narrow-band CNG, then a packet with
-// wide-band speech. The expected behavior of the packet buffer is to detect a
-// change in sample rate, even though no speech packet has been inserted before,
-// and flush out the CNG packet.
-TEST(PacketBuffer, CngFirstThenSpeechWithNewSampleRate) {
-  TickTimer tick_timer;
-  PacketBuffer buffer(10, &tick_timer);  // 10 packets.
-  const uint8_t kCngPt = 13;
-  const int kPayloadLen = 10;
-  const uint8_t kSpeechPt = 100;
-
-  MockDecoderDatabase decoder_database;
-  auto factory = CreateBuiltinAudioDecoderFactory();
-  const DecoderDatabase::DecoderInfo info_cng(NetEqDecoder::kDecoderCNGnb,
-                                              factory);
-  EXPECT_CALL(decoder_database, GetDecoderInfo(kCngPt))
-      .WillRepeatedly(Return(&info_cng));
-  const DecoderDatabase::DecoderInfo info_speech(NetEqDecoder::kDecoderPCM16Bwb,
-                                                 factory);
-  EXPECT_CALL(decoder_database, GetDecoderInfo(kSpeechPt))
-      .WillRepeatedly(Return(&info_speech));
-
-  // Insert first packet, which is narrow-band CNG.
-  PacketGenerator gen(0, 0, kCngPt, 10);
-  PacketList list;
-  list.push_back(gen.NextPacket(kPayloadLen));
-  rtc::Optional<uint8_t> current_pt;
-  rtc::Optional<uint8_t> current_cng_pt;
-
-  StrictMock<MockStatisticsCalculator> mock_stats;
-
-  EXPECT_EQ(PacketBuffer::kOK,
-            buffer.InsertPacketList(&list, decoder_database, &current_pt,
-                                    &current_cng_pt, &mock_stats));
-  EXPECT_TRUE(list.empty());
-  EXPECT_EQ(1u, buffer.NumPacketsInBuffer());
-  ASSERT_TRUE(buffer.PeekNextPacket());
-  EXPECT_EQ(kCngPt, buffer.PeekNextPacket()->payload_type);
-  EXPECT_FALSE(current_pt);  // Current payload type not set.
-  EXPECT_EQ(rtc::Optional<uint8_t>(kCngPt),
-            current_cng_pt);  // CNG payload type set.
-
-  // Insert second packet, which is wide-band speech.
-  {
-    Packet packet = gen.NextPacket(kPayloadLen);
-    packet.payload_type = kSpeechPt;
-    list.push_back(std::move(packet));
-  }
-  // Expect the buffer to flush out the CNG packet, since it does not match the
-  // new speech sample rate.
-  EXPECT_EQ(PacketBuffer::kFlushed,
-            buffer.InsertPacketList(&list, decoder_database, &current_pt,
-                                    &current_cng_pt, &mock_stats));
-  EXPECT_TRUE(list.empty());
-  EXPECT_EQ(1u, buffer.NumPacketsInBuffer());
-  ASSERT_TRUE(buffer.PeekNextPacket());
-  EXPECT_EQ(kSpeechPt, buffer.PeekNextPacket()->payload_type);
-
-  EXPECT_EQ(rtc::Optional<uint8_t>(kSpeechPt),
-            current_pt);         // Current payload type set.
-  EXPECT_FALSE(current_cng_pt);  // CNG payload type reset.
-
-  buffer.Flush();                        // Clean up.
-  EXPECT_CALL(decoder_database, Die());  // Called when object is deleted.
-}
-
-TEST(PacketBuffer, Failures) {
-  const uint16_t start_seq_no = 17;
-  const uint32_t start_ts = 4711;
-  const uint32_t ts_increment = 10;
-  int payload_len = 100;
-  PacketGenerator gen(start_seq_no, start_ts, 0, ts_increment);
-  TickTimer tick_timer;
-  StrictMock<MockStatisticsCalculator> mock_stats;
-
-  PacketBuffer* buffer = new PacketBuffer(100, &tick_timer);  // 100 packets.
-  {
-    Packet packet = gen.NextPacket(payload_len);
-    packet.payload.Clear();
-    EXPECT_EQ(PacketBuffer::kInvalidPacket,
-              buffer->InsertPacket(std::move(packet), &mock_stats));
-  }
-  // Buffer should still be empty. Test all empty-checks.
-  uint32_t temp_ts;
-  EXPECT_EQ(PacketBuffer::kBufferEmpty, buffer->NextTimestamp(&temp_ts));
-  EXPECT_EQ(PacketBuffer::kBufferEmpty,
-            buffer->NextHigherTimestamp(0, &temp_ts));
-  EXPECT_EQ(NULL, buffer->PeekNextPacket());
-  EXPECT_FALSE(buffer->GetNextPacket());
-
-  // Discarding packets will not invoke mock_stats.PacketDiscarded() because the
-  // packet buffer is empty.
-  EXPECT_EQ(PacketBuffer::kBufferEmpty, buffer->DiscardNextPacket(&mock_stats));
-  buffer->DiscardAllOldPackets(0, &mock_stats);
-
-  // Insert one packet to make the buffer non-empty.
-  EXPECT_EQ(PacketBuffer::kOK,
-            buffer->InsertPacket(gen.NextPacket(payload_len), &mock_stats));
-  EXPECT_EQ(PacketBuffer::kInvalidPointer, buffer->NextTimestamp(NULL));
-  EXPECT_EQ(PacketBuffer::kInvalidPointer,
-            buffer->NextHigherTimestamp(0, NULL));
-  delete buffer;
-
-  // Insert packet list of three packets, where the second packet has an invalid
-  // payload.  Expect first packet to be inserted, and the remaining two to be
-  // discarded.
-  buffer = new PacketBuffer(100, &tick_timer);  // 100 packets.
-  PacketList list;
-  list.push_back(gen.NextPacket(payload_len));  // Valid packet.
-  {
-    Packet packet = gen.NextPacket(payload_len);
-    packet.payload.Clear();  // Invalid.
-    list.push_back(std::move(packet));
-  }
-  list.push_back(gen.NextPacket(payload_len));  // Valid packet.
-  MockDecoderDatabase decoder_database;
-  auto factory = CreateBuiltinAudioDecoderFactory();
-  const DecoderDatabase::DecoderInfo info(NetEqDecoder::kDecoderPCMu, factory);
-  EXPECT_CALL(decoder_database, GetDecoderInfo(0))
-      .WillRepeatedly(Return(&info));
-  rtc::Optional<uint8_t> current_pt;
-  rtc::Optional<uint8_t> current_cng_pt;
-  EXPECT_EQ(PacketBuffer::kInvalidPacket,
-            buffer->InsertPacketList(&list, decoder_database, &current_pt,
-                                     &current_cng_pt, &mock_stats));
-  EXPECT_TRUE(list.empty());  // The PacketBuffer should have depleted the list.
-  EXPECT_EQ(1u, buffer->NumPacketsInBuffer());
-  delete buffer;
-  EXPECT_CALL(decoder_database, Die());  // Called when object is deleted.
-}
-
-// Test packet comparison function.
-// The function should return true if the first packet "goes before" the second.
-TEST(PacketBuffer, ComparePackets) {
-  PacketGenerator gen(0, 0, 0, 10);
-  Packet a(gen.NextPacket(10));  // SN = 0, TS = 0.
-  Packet b(gen.NextPacket(10));  // SN = 1, TS = 10.
-  EXPECT_FALSE(a == b);
-  EXPECT_TRUE(a != b);
-  EXPECT_TRUE(a < b);
-  EXPECT_FALSE(a > b);
-  EXPECT_TRUE(a <= b);
-  EXPECT_FALSE(a >= b);
-
-  // Testing wrap-around case; 'a' is earlier but has a larger timestamp value.
-  a.timestamp = 0xFFFFFFFF - 10;
-  EXPECT_FALSE(a == b);
-  EXPECT_TRUE(a != b);
-  EXPECT_TRUE(a < b);
-  EXPECT_FALSE(a > b);
-  EXPECT_TRUE(a <= b);
-  EXPECT_FALSE(a >= b);
-
-  // Test equal packets.
-  EXPECT_TRUE(a == a);
-  EXPECT_FALSE(a != a);
-  EXPECT_FALSE(a < a);
-  EXPECT_FALSE(a > a);
-  EXPECT_TRUE(a <= a);
-  EXPECT_TRUE(a >= a);
-
-  // Test equal timestamps but different sequence numbers (0 and 1).
-  a.timestamp = b.timestamp;
-  EXPECT_FALSE(a == b);
-  EXPECT_TRUE(a != b);
-  EXPECT_TRUE(a < b);
-  EXPECT_FALSE(a > b);
-  EXPECT_TRUE(a <= b);
-  EXPECT_FALSE(a >= b);
-
-  // Test equal timestamps but different sequence numbers (32767 and 1).
-  a.sequence_number = 0xFFFF;
-  EXPECT_FALSE(a == b);
-  EXPECT_TRUE(a != b);
-  EXPECT_TRUE(a < b);
-  EXPECT_FALSE(a > b);
-  EXPECT_TRUE(a <= b);
-  EXPECT_FALSE(a >= b);
-
-  // Test equal timestamps and sequence numbers, but differing priorities.
-  a.sequence_number = b.sequence_number;
-  a.priority = {1, 0};
-  b.priority = {0, 0};
-  // a after b
-  EXPECT_FALSE(a == b);
-  EXPECT_TRUE(a != b);
-  EXPECT_FALSE(a < b);
-  EXPECT_TRUE(a > b);
-  EXPECT_FALSE(a <= b);
-  EXPECT_TRUE(a >= b);
-
-  Packet c(gen.NextPacket(0));  // SN = 2, TS = 20.
-  Packet d(gen.NextPacket(0));  // SN = 3, TS = 20.
-  c.timestamp = b.timestamp;
-  d.timestamp = b.timestamp;
-  c.sequence_number = b.sequence_number;
-  d.sequence_number = b.sequence_number;
-  c.priority = {1, 1};
-  d.priority = {0, 1};
-  // c after d
-  EXPECT_FALSE(c == d);
-  EXPECT_TRUE(c != d);
-  EXPECT_FALSE(c < d);
-  EXPECT_TRUE(c > d);
-  EXPECT_FALSE(c <= d);
-  EXPECT_TRUE(c >= d);
-
-  // c after a
-  EXPECT_FALSE(c == a);
-  EXPECT_TRUE(c != a);
-  EXPECT_FALSE(c < a);
-  EXPECT_TRUE(c > a);
-  EXPECT_FALSE(c <= a);
-  EXPECT_TRUE(c >= a);
-
-  // c after b
-  EXPECT_FALSE(c == b);
-  EXPECT_TRUE(c != b);
-  EXPECT_FALSE(c < b);
-  EXPECT_TRUE(c > b);
-  EXPECT_FALSE(c <= b);
-  EXPECT_TRUE(c >= b);
-
-  // a after d
-  EXPECT_FALSE(a == d);
-  EXPECT_TRUE(a != d);
-  EXPECT_FALSE(a < d);
-  EXPECT_TRUE(a > d);
-  EXPECT_FALSE(a <= d);
-  EXPECT_TRUE(a >= d);
-
-  // d after b
-  EXPECT_FALSE(d == b);
-  EXPECT_TRUE(d != b);
-  EXPECT_FALSE(d < b);
-  EXPECT_TRUE(d > b);
-  EXPECT_FALSE(d <= b);
-  EXPECT_TRUE(d >= b);
-}
-
-namespace {
-void TestIsObsoleteTimestamp(uint32_t limit_timestamp) {
-  // Check with zero horizon, which implies that the horizon is at 2^31, i.e.,
-  // half the timestamp range.
-  static const uint32_t kZeroHorizon = 0;
-  static const uint32_t k2Pow31Minus1 = 0x7FFFFFFF;
-  // Timestamp on the limit is not old.
-  EXPECT_FALSE(PacketBuffer::IsObsoleteTimestamp(
-      limit_timestamp, limit_timestamp, kZeroHorizon));
-  // 1 sample behind is old.
-  EXPECT_TRUE(PacketBuffer::IsObsoleteTimestamp(
-      limit_timestamp - 1, limit_timestamp, kZeroHorizon));
-  // 2^31 - 1 samples behind is old.
-  EXPECT_TRUE(PacketBuffer::IsObsoleteTimestamp(
-      limit_timestamp - k2Pow31Minus1, limit_timestamp, kZeroHorizon));
-  // 1 sample ahead is not old.
-  EXPECT_FALSE(PacketBuffer::IsObsoleteTimestamp(
-      limit_timestamp + 1, limit_timestamp, kZeroHorizon));
-  // If |t1-t2|=2^31 and t1>t2, t2 is older than t1 but not the opposite.
-  uint32_t other_timestamp = limit_timestamp + (1 << 31);
-  uint32_t lowest_timestamp = std::min(limit_timestamp, other_timestamp);
-  uint32_t highest_timestamp = std::max(limit_timestamp, other_timestamp);
-  EXPECT_TRUE(PacketBuffer::IsObsoleteTimestamp(
-      lowest_timestamp, highest_timestamp, kZeroHorizon));
-  EXPECT_FALSE(PacketBuffer::IsObsoleteTimestamp(
-      highest_timestamp, lowest_timestamp, kZeroHorizon));
-
-  // Fixed horizon at 10 samples.
-  static const uint32_t kHorizon = 10;
-  // Timestamp on the limit is not old.
-  EXPECT_FALSE(PacketBuffer::IsObsoleteTimestamp(
-      limit_timestamp, limit_timestamp, kHorizon));
-  // 1 sample behind is old.
-  EXPECT_TRUE(PacketBuffer::IsObsoleteTimestamp(
-      limit_timestamp - 1, limit_timestamp, kHorizon));
-  // 9 samples behind is old.
-  EXPECT_TRUE(PacketBuffer::IsObsoleteTimestamp(
-      limit_timestamp - 9, limit_timestamp, kHorizon));
-  // 10 samples behind is not old.
-  EXPECT_FALSE(PacketBuffer::IsObsoleteTimestamp(
-      limit_timestamp - 10, limit_timestamp, kHorizon));
-  // 2^31 - 1 samples behind is not old.
-  EXPECT_FALSE(PacketBuffer::IsObsoleteTimestamp(
-      limit_timestamp - k2Pow31Minus1, limit_timestamp, kHorizon));
-  // 1 sample ahead is not old.
-  EXPECT_FALSE(PacketBuffer::IsObsoleteTimestamp(
-      limit_timestamp + 1, limit_timestamp, kHorizon));
-  // 2^31 samples ahead is not old.
-  EXPECT_FALSE(PacketBuffer::IsObsoleteTimestamp(
-      limit_timestamp + (1 << 31), limit_timestamp, kHorizon));
-}
-}  // namespace
-
-// Test the IsObsoleteTimestamp method with different limit timestamps.
-TEST(PacketBuffer, IsObsoleteTimestamp) {
-  TestIsObsoleteTimestamp(0);
-  TestIsObsoleteTimestamp(1);
-  TestIsObsoleteTimestamp(0xFFFFFFFF);  // -1 in uint32_t.
-  TestIsObsoleteTimestamp(0x80000000);  // 2^31.
-  TestIsObsoleteTimestamp(0x80000001);  // 2^31 + 1.
-  TestIsObsoleteTimestamp(0x7FFFFFFF);  // 2^31 - 1.
-}
-}  // namespace webrtc
diff --git a/modules/audio_coding/neteq/post_decode_vad.cc b/modules/audio_coding/neteq/post_decode_vad.cc
deleted file mode 100644
index 714073a..0000000
--- a/modules/audio_coding/neteq/post_decode_vad.cc
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- *  Copyright (c) 2013 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/neteq/post_decode_vad.h"
-
-namespace webrtc {
-
-PostDecodeVad::~PostDecodeVad() {
-  if (vad_instance_)
-    WebRtcVad_Free(vad_instance_);
-}
-
-void PostDecodeVad::Enable() {
-  if (!vad_instance_) {
-    // Create the instance.
-    vad_instance_ = WebRtcVad_Create();
-    if (vad_instance_ == nullptr) {
-      // Failed to create instance.
-      Disable();
-      return;
-    }
-  }
-  Init();
-  enabled_ = true;
-}
-
-void PostDecodeVad::Disable() {
-  enabled_ = false;
-  running_ = false;
-}
-
-void PostDecodeVad::Init() {
-  running_ = false;
-  if (vad_instance_) {
-    WebRtcVad_Init(vad_instance_);
-    WebRtcVad_set_mode(vad_instance_, kVadMode);
-    running_ = true;
-  }
-}
-
-void PostDecodeVad::Update(int16_t* signal, size_t length,
-                           AudioDecoder::SpeechType speech_type,
-                           bool sid_frame,
-                           int fs_hz) {
-  if (!vad_instance_ || !enabled_) {
-    return;
-  }
-
-  if (speech_type == AudioDecoder::kComfortNoise || sid_frame ||
-      fs_hz > 16000) {
-    // TODO(hlundin): Remove restriction on fs_hz.
-    running_ = false;
-    active_speech_ = true;
-    sid_interval_counter_ = 0;
-  } else if (!running_) {
-    ++sid_interval_counter_;
-  }
-
-  if (sid_interval_counter_ >= kVadAutoEnable) {
-    Init();
-  }
-
-  if (length > 0 && running_) {
-    size_t vad_sample_index = 0;
-    active_speech_ = false;
-    // Loop through frame sizes 30, 20, and 10 ms.
-    for (int vad_frame_size_ms = 30; vad_frame_size_ms >= 10;
-        vad_frame_size_ms -= 10) {
-      size_t vad_frame_size_samples =
-          static_cast<size_t>(vad_frame_size_ms * fs_hz / 1000);
-      while (length - vad_sample_index >= vad_frame_size_samples) {
-        int vad_return = WebRtcVad_Process(
-            vad_instance_, fs_hz, &signal[vad_sample_index],
-            vad_frame_size_samples);
-        active_speech_ |= (vad_return == 1);
-        vad_sample_index += vad_frame_size_samples;
-      }
-    }
-  }
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/neteq/post_decode_vad.h b/modules/audio_coding/neteq/post_decode_vad.h
deleted file mode 100644
index a98992f..0000000
--- a/modules/audio_coding/neteq/post_decode_vad.h
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- *  Copyright (c) 2013 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_NETEQ_POST_DECODE_VAD_H_
-#define WEBRTC_MODULES_AUDIO_CODING_NETEQ_POST_DECODE_VAD_H_
-
-#include <string>  // size_t
-
-#include "webrtc/api/audio_codecs/audio_decoder.h"
-#include "webrtc/common_audio/vad/include/webrtc_vad.h"
-#include "webrtc/common_types.h"  // NULL
-#include "webrtc/modules/audio_coding/neteq/defines.h"
-#include "webrtc/modules/audio_coding/neteq/packet.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-class PostDecodeVad {
- public:
-  PostDecodeVad()
-      : enabled_(false),
-        running_(false),
-        active_speech_(true),
-        sid_interval_counter_(0),
-        vad_instance_(NULL) {
-  }
-
-  virtual ~PostDecodeVad();
-
-  // Enables post-decode VAD.
-  void Enable();
-
-  // Disables post-decode VAD.
-  void Disable();
-
-  // Initializes post-decode VAD.
-  void Init();
-
-  // Updates post-decode VAD with the audio data in |signal| having |length|
-  // samples. The data is of type |speech_type|, at the sample rate |fs_hz|.
-  void Update(int16_t* signal, size_t length,
-              AudioDecoder::SpeechType speech_type, bool sid_frame, int fs_hz);
-
-  // Accessors.
-  bool enabled() const { return enabled_; }
-  bool running() const { return running_; }
-  bool active_speech() const { return active_speech_; }
-
- private:
-  static const int kVadMode = 0;  // Sets aggressiveness to "Normal".
-  // Number of Update() calls without CNG/SID before re-enabling VAD.
-  static const int kVadAutoEnable = 3000;
-
-  bool enabled_;
-  bool running_;
-  bool active_speech_;
-  int sid_interval_counter_;
-  ::VadInst* vad_instance_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(PostDecodeVad);
-};
-
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_AUDIO_CODING_NETEQ_POST_DECODE_VAD_H_
diff --git a/modules/audio_coding/neteq/post_decode_vad_unittest.cc b/modules/audio_coding/neteq/post_decode_vad_unittest.cc
deleted file mode 100644
index 231d7f1..0000000
--- a/modules/audio_coding/neteq/post_decode_vad_unittest.cc
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- *  Copyright (c) 2013 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.
- */
-
-// Unit tests for PostDecodeVad class.
-
-#include "webrtc/modules/audio_coding/neteq/post_decode_vad.h"
-
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-TEST(PostDecodeVad, CreateAndDestroy) {
-  PostDecodeVad vad;
-}
-
-// TODO(hlundin): Write more tests.
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/neteq/preemptive_expand.cc b/modules/audio_coding/neteq/preemptive_expand.cc
deleted file mode 100644
index f51a5bd..0000000
--- a/modules/audio_coding/neteq/preemptive_expand.cc
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- *  Copyright (c) 2012 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/neteq/preemptive_expand.h"
-
-#include <algorithm>  // min, max
-
-#include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
-
-namespace webrtc {
-
-PreemptiveExpand::ReturnCodes PreemptiveExpand::Process(
-    const int16_t* input,
-    size_t input_length,
-    size_t old_data_length,
-    AudioMultiVector* output,
-    size_t* length_change_samples) {
-  old_data_length_per_channel_ = old_data_length;
-  // Input length must be (almost) 30 ms.
-  // Also, the new part must be at least |overlap_samples_| elements.
-  static const size_t k15ms = 120;  // 15 ms = 120 samples at 8 kHz sample rate.
-  if (num_channels_ == 0 ||
-      input_length / num_channels_ < (2 * k15ms - 1) * fs_mult_ ||
-      old_data_length >= input_length / num_channels_ - overlap_samples_) {
-    // Length of input data too short to do preemptive expand. Simply move all
-    // data from input to output.
-    output->PushBackInterleaved(input, input_length);
-    return kError;
-  }
-  const bool kFastMode = false;  // Fast mode is not available for PE Expand.
-  return TimeStretch::Process(input, input_length, kFastMode, output,
-                              length_change_samples);
-}
-
-void PreemptiveExpand::SetParametersForPassiveSpeech(size_t len,
-                                                     int16_t* best_correlation,
-                                                     size_t* peak_index) const {
-  // When the signal does not contain any active speech, the correlation does
-  // not matter. Simply set it to zero.
-  *best_correlation = 0;
-
-  // For low energy expansion, the new data can be less than 15 ms,
-  // but we must ensure that best_correlation is not larger than the length of
-  // the new data.
-  // but we must ensure that best_correlation is not larger than the new data.
-  *peak_index = std::min(*peak_index,
-                         len - old_data_length_per_channel_);
-}
-
-PreemptiveExpand::ReturnCodes PreemptiveExpand::CheckCriteriaAndStretch(
-    const int16_t* input,
-    size_t input_length,
-    size_t peak_index,
-    int16_t best_correlation,
-    bool active_speech,
-    bool /*fast_mode*/,
-    AudioMultiVector* output) const {
-  // Pre-calculate common multiplication with |fs_mult_|.
-  // 120 corresponds to 15 ms.
-  size_t fs_mult_120 = static_cast<size_t>(fs_mult_ * 120);
-  // Check for strong correlation (>0.9 in Q14) and at least 15 ms new data,
-  // or passive speech.
-  if (((best_correlation > kCorrelationThreshold) &&
-      (old_data_length_per_channel_ <= fs_mult_120)) ||
-      !active_speech) {
-    // Do accelerate operation by overlap add.
-
-    // Set length of the first part, not to be modified.
-    size_t unmodified_length = std::max(old_data_length_per_channel_,
-                                        fs_mult_120);
-    // Copy first part, including cross-fade region.
-    output->PushBackInterleaved(
-        input, (unmodified_length + peak_index) * num_channels_);
-    // Copy the last |peak_index| samples up to 15 ms to |temp_vector|.
-    AudioMultiVector temp_vector(num_channels_);
-    temp_vector.PushBackInterleaved(
-        &input[(unmodified_length - peak_index) * num_channels_],
-        peak_index * num_channels_);
-    // Cross-fade |temp_vector| onto the end of |output|.
-    output->CrossFade(temp_vector, peak_index);
-    // Copy the last unmodified part, 15 ms + pitch period until the end.
-    output->PushBackInterleaved(
-        &input[unmodified_length * num_channels_],
-        input_length - unmodified_length * num_channels_);
-
-    if (active_speech) {
-      return kSuccess;
-    } else {
-      return kSuccessLowEnergy;
-    }
-  } else {
-    // Accelerate not allowed. Simply move all data from decoded to outData.
-    output->PushBackInterleaved(input, input_length);
-    return kNoStretch;
-  }
-}
-
-PreemptiveExpand* PreemptiveExpandFactory::Create(
-    int sample_rate_hz,
-    size_t num_channels,
-    const BackgroundNoise& background_noise,
-    size_t overlap_samples) const {
-  return new PreemptiveExpand(
-      sample_rate_hz, num_channels, background_noise, overlap_samples);
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/neteq/preemptive_expand.h b/modules/audio_coding/neteq/preemptive_expand.h
deleted file mode 100644
index 1275a37..0000000
--- a/modules/audio_coding/neteq/preemptive_expand.h
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- *  Copyright (c) 2012 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_NETEQ_PREEMPTIVE_EXPAND_H_
-#define WEBRTC_MODULES_AUDIO_CODING_NETEQ_PREEMPTIVE_EXPAND_H_
-
-#include <assert.h>
-
-#include "webrtc/modules/audio_coding/neteq/audio_multi_vector.h"
-#include "webrtc/modules/audio_coding/neteq/time_stretch.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-// Forward declarations.
-class BackgroundNoise;
-
-// This class implements the PreemptiveExpand operation. Most of the work is
-// done in the base class TimeStretch, which is shared with the Accelerate
-// operation. In the PreemptiveExpand class, the operations that are specific to
-// PreemptiveExpand are implemented.
-class PreemptiveExpand : public TimeStretch {
- public:
-  PreemptiveExpand(int sample_rate_hz,
-                   size_t num_channels,
-                   const BackgroundNoise& background_noise,
-                   size_t overlap_samples)
-      : TimeStretch(sample_rate_hz, num_channels, background_noise),
-        old_data_length_per_channel_(0),
-        overlap_samples_(overlap_samples) {
-  }
-
-  // This method performs the actual PreemptiveExpand operation. The samples are
-  // read from |input|, of length |input_length| elements, and are written to
-  // |output|. The number of samples added through time-stretching is
-  // is provided in the output |length_change_samples|. The method returns
-  // the outcome of the operation as an enumerator value.
-  ReturnCodes Process(const int16_t *pw16_decoded,
-                      size_t len,
-                      size_t old_data_len,
-                      AudioMultiVector* output,
-                      size_t* length_change_samples);
-
- protected:
-  // Sets the parameters |best_correlation| and |peak_index| to suitable
-  // values when the signal contains no active speech.
-  void SetParametersForPassiveSpeech(size_t input_length,
-                                     int16_t* best_correlation,
-                                     size_t* peak_index) const override;
-
-  // Checks the criteria for performing the time-stretching operation and,
-  // if possible, performs the time-stretching.
-  ReturnCodes CheckCriteriaAndStretch(const int16_t* input,
-                                      size_t input_length,
-                                      size_t peak_index,
-                                      int16_t best_correlation,
-                                      bool active_speech,
-                                      bool /*fast_mode*/,
-                                      AudioMultiVector* output) const override;
-
- private:
-  size_t old_data_length_per_channel_;
-  size_t overlap_samples_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(PreemptiveExpand);
-};
-
-struct PreemptiveExpandFactory {
-  PreemptiveExpandFactory() {}
-  virtual ~PreemptiveExpandFactory() {}
-
-  virtual PreemptiveExpand* Create(
-      int sample_rate_hz,
-      size_t num_channels,
-      const BackgroundNoise& background_noise,
-      size_t overlap_samples) const;
-};
-
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_AUDIO_CODING_NETEQ_PREEMPTIVE_EXPAND_H_
diff --git a/modules/audio_coding/neteq/random_vector.cc b/modules/audio_coding/neteq/random_vector.cc
deleted file mode 100644
index b12f217..0000000
--- a/modules/audio_coding/neteq/random_vector.cc
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- *  Copyright (c) 2011 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/neteq/random_vector.h"
-
-namespace webrtc {
-
-const int16_t RandomVector::kRandomTable[RandomVector::kRandomTableSize] = {
-    2680, 5532, 441, 5520, 16170, -5146, -1024, -8733, 3115, 9598, -10380,
-    -4959, -1280, -21716, 7133, -1522, 13458, -3902, 2789, -675, 3441, 5016,
-    -13599, -4003, -2739, 3922, -7209, 13352, -11617, -7241, 12905, -2314, 5426,
-    10121, -9702, 11207, -13542, 1373, 816, -5934, -12504, 4798, 1811, 4112,
-    -613, 201, -10367, -2960, -2419, 3442, 4299, -6116, -6092, 1552, -1650,
-    -480, -1237, 18720, -11858, -8303, -8212, 865, -2890, -16968, 12052, -5845,
-    -5912, 9777, -5665, -6294, 5426, -4737, -6335, 1652, 761, 3832, 641, -8552,
-    -9084, -5753, 8146, 12156, -4915, 15086, -1231, -1869, 11749, -9319, -6403,
-    11407, 6232, -1683, 24340, -11166, 4017, -10448, 3153, -2936, 6212, 2891,
-    -866, -404, -4807, -2324, -1917, -2388, -6470, -3895, -10300, 5323, -5403,
-    2205, 4640, 7022, -21186, -6244, -882, -10031, -3395, -12885, 7155, -5339,
-    5079, -2645, -9515, 6622, 14651, 15852, 359, 122, 8246, -3502, -6696, -3679,
-    -13535, -1409, -704, -7403, -4007, 1798, 279, -420, -12796, -14219, 1141,
-    3359, 11434, 7049, -6684, -7473, 14283, -4115, -9123, -8969, 4152, 4117,
-    13792, 5742, 16168, 8661, -1609, -6095, 1881, 14380, -5588, 6758, -6425,
-    -22969, -7269, 7031, 1119, -1611, -5850, -11281, 3559, -8952, -10146, -4667,
-    -16251, -1538, 2062, -1012, -13073, 227, -3142, -5265, 20, 5770, -7559,
-    4740, -4819, 992, -8208, -7130, -4652, 6725, 7369, -1036, 13144, -1588,
-    -5304, -2344, -449, -5705, -8894, 5205, -17904, -11188, -1022, 4852, 10101,
-    -5255, -4200, -752, 7941, -1543, 5959, 14719, 13346, 17045, -15605, -1678,
-    -1600, -9230, 68, 23348, 1172, 7750, 11212, -18227, 9956, 4161, 883, 3947,
-    4341, 1014, -4889, -2603, 1246, -5630, -3596, -870, -1298, 2784, -3317,
-    -6612, -20541, 4166, 4181, -8625, 3562, 12890, 4761, 3205, -12259, -8579 };
-
-void RandomVector::Reset() {
-  seed_ = 777;
-  seed_increment_ = 1;
-}
-
-void RandomVector::Generate(size_t length, int16_t* output) {
-  for (size_t i = 0; i < length; i++) {
-    seed_ += seed_increment_;
-    size_t position = seed_ & (kRandomTableSize - 1);
-    output[i] = kRandomTable[position];
-  }
-}
-
-void RandomVector::IncreaseSeedIncrement(int16_t increase_by) {
-  seed_increment_+= increase_by;
-  seed_increment_ &= kRandomTableSize - 1;
-}
-}  // namespace webrtc
diff --git a/modules/audio_coding/neteq/random_vector.h b/modules/audio_coding/neteq/random_vector.h
deleted file mode 100644
index 394e940..0000000
--- a/modules/audio_coding/neteq/random_vector.h
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- *  Copyright (c) 2012 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_NETEQ_RANDOM_VECTOR_H_
-#define WEBRTC_MODULES_AUDIO_CODING_NETEQ_RANDOM_VECTOR_H_
-
-#include <string.h>  // size_t
-
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-// This class generates pseudo-random samples.
-class RandomVector {
- public:
-  static const size_t kRandomTableSize = 256;
-  static const int16_t kRandomTable[kRandomTableSize];
-
-  RandomVector()
-      : seed_(777),
-        seed_increment_(1) {
-  }
-
-  void Reset();
-
-  void Generate(size_t length, int16_t* output);
-
-  void IncreaseSeedIncrement(int16_t increase_by);
-
-  // Accessors and mutators.
-  int16_t seed_increment() { return seed_increment_; }
-  void set_seed_increment(int16_t value) { seed_increment_ = value; }
-
- private:
-  uint32_t seed_;
-  int16_t seed_increment_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(RandomVector);
-};
-
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_AUDIO_CODING_NETEQ_RANDOM_VECTOR_H_
diff --git a/modules/audio_coding/neteq/random_vector_unittest.cc b/modules/audio_coding/neteq/random_vector_unittest.cc
deleted file mode 100644
index ca0a378..0000000
--- a/modules/audio_coding/neteq/random_vector_unittest.cc
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- *  Copyright (c) 2012 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.
- */
-
-// Unit tests for RandomVector class.
-
-#include "webrtc/modules/audio_coding/neteq/random_vector.h"
-
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-TEST(RandomVector, CreateAndDestroy) {
-  RandomVector random_vector;
-}
-
-// TODO(hlundin): Write more tests.
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/neteq/red_payload_splitter.cc b/modules/audio_coding/neteq/red_payload_splitter.cc
deleted file mode 100644
index daf24e7..0000000
--- a/modules/audio_coding/neteq/red_payload_splitter.cc
+++ /dev/null
@@ -1,162 +0,0 @@
-/*
- *  Copyright (c) 2012 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/neteq/red_payload_splitter.h"
-
-#include <assert.h>
-#include <vector>
-
-#include "webrtc/modules/audio_coding/neteq/decoder_database.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/safe_conversions.h"
-
-namespace webrtc {
-
-// The method loops through a list of packets {A, B, C, ...}. Each packet is
-// split into its corresponding RED payloads, {A1, A2, ...}, which is
-// temporarily held in the list |new_packets|.
-// When the first packet in |packet_list| has been processed, the orignal packet
-// is replaced by the new ones in |new_packets|, so that |packet_list| becomes:
-// {A1, A2, ..., B, C, ...}. The method then continues with B, and C, until all
-// the original packets have been replaced by their split payloads.
-bool RedPayloadSplitter::SplitRed(PacketList* packet_list) {
-  // Too many RED blocks indicates that something is wrong. Clamp it at some
-  // reasonable value.
-  const size_t kMaxRedBlocks = 32;
-  bool ret = true;
-  PacketList::iterator it = packet_list->begin();
-  while (it != packet_list->end()) {
-    const Packet& red_packet = *it;
-    assert(!red_packet.payload.empty());
-    const uint8_t* payload_ptr = red_packet.payload.data();
-
-    // Read RED headers (according to RFC 2198):
-    //
-    //    0                   1                   2                   3
-    //    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
-    //   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-    //   |F|   block PT  |  timestamp offset         |   block length    |
-    //   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-    // Last RED header:
-    //    0 1 2 3 4 5 6 7
-    //   +-+-+-+-+-+-+-+-+
-    //   |0|   Block PT  |
-    //   +-+-+-+-+-+-+-+-+
-
-    struct RedHeader {
-      uint8_t payload_type;
-      uint32_t timestamp;
-      size_t payload_length;
-    };
-
-    std::vector<RedHeader> new_headers;
-    bool last_block = false;
-    size_t sum_length = 0;
-    while (!last_block) {
-      RedHeader new_header;
-      // Check the F bit. If F == 0, this was the last block.
-      last_block = ((*payload_ptr & 0x80) == 0);
-      // Bits 1 through 7 are payload type.
-      new_header.payload_type = payload_ptr[0] & 0x7F;
-      if (last_block) {
-        // No more header data to read.
-        ++sum_length;  // Account for RED header size of 1 byte.
-        new_header.timestamp = red_packet.timestamp;
-        new_header.payload_length = red_packet.payload.size() - sum_length;
-        payload_ptr += 1;  // Advance to first payload byte.
-      } else {
-        // Bits 8 through 21 are timestamp offset.
-        int timestamp_offset =
-            (payload_ptr[1] << 6) + ((payload_ptr[2] & 0xFC) >> 2);
-        new_header.timestamp = red_packet.timestamp - timestamp_offset;
-        // Bits 22 through 31 are payload length.
-        new_header.payload_length =
-            ((payload_ptr[2] & 0x03) << 8) + payload_ptr[3];
-        payload_ptr += 4;  // Advance to next RED header.
-      }
-      sum_length += new_header.payload_length;
-      sum_length += 4;  // Account for RED header size of 4 bytes.
-      // Store in new list of packets.
-      new_headers.push_back(new_header);
-    }
-
-    if (new_headers.size() <= kMaxRedBlocks) {
-      // Populate the new packets with payload data.
-      // |payload_ptr| now points at the first payload byte.
-      PacketList new_packets;  // An empty list to store the split packets in.
-      for (size_t i = 0; i != new_headers.size(); ++i) {
-        const auto& new_header = new_headers[i];
-        size_t payload_length = new_header.payload_length;
-        if (payload_ptr + payload_length >
-            red_packet.payload.data() + red_packet.payload.size()) {
-          // The block lengths in the RED headers do not match the overall
-          // packet length. Something is corrupt. Discard this and the remaining
-          // payloads from this packet.
-          LOG(LS_WARNING) << "SplitRed length mismatch";
-          ret = false;
-          break;
-        }
-
-        Packet new_packet;
-        new_packet.timestamp = new_header.timestamp;
-        new_packet.payload_type = new_header.payload_type;
-        new_packet.sequence_number = red_packet.sequence_number;
-        new_packet.priority.red_level =
-            rtc::dchecked_cast<int>((new_headers.size() - 1) - i);
-        new_packet.payload.SetData(payload_ptr, payload_length);
-        new_packets.push_front(std::move(new_packet));
-        payload_ptr += payload_length;
-      }
-      // Insert new packets into original list, before the element pointed to by
-      // iterator |it|.
-      packet_list->splice(it, std::move(new_packets));
-    } else {
-      LOG(LS_WARNING) << "SplitRed too many blocks: " << new_headers.size();
-      ret = false;
-    }
-    // Remove |it| from the packet list. This operation effectively moves the
-    // iterator |it| to the next packet in the list. Thus, we do not have to
-    // increment it manually.
-    it = packet_list->erase(it);
-  }
-  return ret;
-}
-
-int RedPayloadSplitter::CheckRedPayloads(
-    PacketList* packet_list,
-    const DecoderDatabase& decoder_database) {
-  int main_payload_type = -1;
-  int num_deleted_packets = 0;
-  for (auto it = packet_list->begin(); it != packet_list->end(); /* */) {
-    uint8_t this_payload_type = it->payload_type;
-    if (!decoder_database.IsDtmf(this_payload_type) &&
-        !decoder_database.IsComfortNoise(this_payload_type)) {
-      if (main_payload_type == -1) {
-        // This is the first packet in the list which is non-DTMF non-CNG.
-        main_payload_type = this_payload_type;
-      } else {
-        if (this_payload_type != main_payload_type) {
-          // We do not allow redundant payloads of a different type.
-          // Remove |it| from the packet list. This operation effectively
-          // moves the iterator |it| to the next packet in the list. Thus, we
-          // do not have to increment it manually.
-          it = packet_list->erase(it);
-          ++num_deleted_packets;
-          continue;
-        }
-      }
-    }
-    ++it;
-  }
-  return num_deleted_packets;
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/neteq/red_payload_splitter.h b/modules/audio_coding/neteq/red_payload_splitter.h
deleted file mode 100644
index 8134bfc..0000000
--- a/modules/audio_coding/neteq/red_payload_splitter.h
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- *  Copyright (c) 2012 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_NETEQ_RED_PAYLOAD_SPLITTER_H_
-#define WEBRTC_MODULES_AUDIO_CODING_NETEQ_RED_PAYLOAD_SPLITTER_H_
-
-#include "webrtc/modules/audio_coding/neteq/packet.h"
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace webrtc {
-
-// Forward declarations.
-class DecoderDatabase;
-
-// This class handles splitting of RED payloads into smaller parts.
-// Codec-specific packet splitting can be performed by
-// AudioDecoder::ParsePayload.
-class RedPayloadSplitter {
- public:
-  RedPayloadSplitter() {}
-
-  virtual ~RedPayloadSplitter() {}
-
-  // Splits each packet in |packet_list| into its separate RED payloads. Each
-  // RED payload is packetized into a Packet. The original elements in
-  // |packet_list| are properly deleted, and replaced by the new packets.
-  // Note that all packets in |packet_list| must be RED payloads, i.e., have
-  // RED headers according to RFC 2198 at the very beginning of the payload.
-  // Returns kOK or an error.
-  virtual bool SplitRed(PacketList* packet_list);
-
-  // Checks all packets in |packet_list|. Packets that are DTMF events or
-  // comfort noise payloads are kept. Except that, only one single payload type
-  // is accepted. Any packet with another payload type is discarded.  Returns
-  // the number of discarded packets.
-  virtual int CheckRedPayloads(PacketList* packet_list,
-                               const DecoderDatabase& decoder_database);
-
- private:
-  RTC_DISALLOW_COPY_AND_ASSIGN(RedPayloadSplitter);
-};
-
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_AUDIO_CODING_NETEQ_RED_PAYLOAD_SPLITTER_H_
diff --git a/modules/audio_coding/neteq/red_payload_splitter_unittest.cc b/modules/audio_coding/neteq/red_payload_splitter_unittest.cc
deleted file mode 100644
index 4a1fb9e..0000000
--- a/modules/audio_coding/neteq/red_payload_splitter_unittest.cc
+++ /dev/null
@@ -1,344 +0,0 @@
-/*
- *  Copyright (c) 2012 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.
- */
-
-// Unit tests for RedPayloadSplitter class.
-
-#include "webrtc/modules/audio_coding/neteq/red_payload_splitter.h"
-
-#include <assert.h>
-
-#include <memory>
-#include <utility>  // pair
-
-#include "webrtc/api/audio_codecs/builtin_audio_decoder_factory.h"
-#include "webrtc/modules/audio_coding/neteq/mock/mock_decoder_database.h"
-#include "webrtc/modules/audio_coding/neteq/packet.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/mock_audio_decoder_factory.h"
-
-using ::testing::Return;
-using ::testing::ReturnNull;
-
-namespace webrtc {
-
-static const int kRedPayloadType = 100;
-static const size_t kPayloadLength = 10;
-static const size_t kRedHeaderLength = 4;  // 4 bytes RED header.
-static const uint16_t kSequenceNumber = 0;
-static const uint32_t kBaseTimestamp = 0x12345678;
-
-// A possible Opus packet that contains FEC is the following.
-// The frame is 20 ms in duration.
-//
-// 0                   1                   2                   3
-// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
-// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-// |0|0|0|0|1|0|0|0|x|1|x|x|x|x|x|x|x|                             |
-// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                             |
-// |                    Compressed frame 1 (N-2 bytes)...          :
-// :                                                               |
-// |                                                               |
-// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-void CreateOpusFecPayload(uint8_t* payload,
-                          size_t payload_length,
-                          uint8_t payload_value) {
-  if (payload_length < 2) {
-    return;
-  }
-  payload[0] = 0x08;
-  payload[1] = 0x40;
-  memset(&payload[2], payload_value, payload_length - 2);
-}
-
-// RED headers (according to RFC 2198):
-//
-//    0                   1                   2                   3
-//    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
-//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//   |F|   block PT  |  timestamp offset         |   block length    |
-//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//
-// Last RED header:
-//    0 1 2 3 4 5 6 7
-//   +-+-+-+-+-+-+-+-+
-//   |0|   Block PT  |
-//   +-+-+-+-+-+-+-+-+
-
-// Creates a RED packet, with |num_payloads| payloads, with payload types given
-// by the values in array |payload_types| (which must be of length
-// |num_payloads|). Each redundant payload is |timestamp_offset| samples
-// "behind" the the previous payload.
-Packet CreateRedPayload(size_t num_payloads,
-                        uint8_t* payload_types,
-                        int timestamp_offset,
-                        bool embed_opus_fec = false) {
-  Packet packet;
-  packet.payload_type = kRedPayloadType;
-  packet.timestamp = kBaseTimestamp;
-  packet.sequence_number = kSequenceNumber;
-  packet.payload.SetSize((kPayloadLength + 1) +
-                         (num_payloads - 1) *
-                             (kPayloadLength + kRedHeaderLength));
-  uint8_t* payload_ptr = packet.payload.data();
-  for (size_t i = 0; i < num_payloads; ++i) {
-    // Write the RED headers.
-    if (i == num_payloads - 1) {
-      // Special case for last payload.
-      *payload_ptr = payload_types[i] & 0x7F;  // F = 0;
-      ++payload_ptr;
-      break;
-    }
-    *payload_ptr = payload_types[i] & 0x7F;
-    // Not the last block; set F = 1.
-    *payload_ptr |= 0x80;
-    ++payload_ptr;
-    int this_offset = (num_payloads - i - 1) * timestamp_offset;
-    *payload_ptr = this_offset >> 6;
-    ++payload_ptr;
-    assert(kPayloadLength <= 1023);  // Max length described by 10 bits.
-    *payload_ptr = ((this_offset & 0x3F) << 2) | (kPayloadLength >> 8);
-    ++payload_ptr;
-    *payload_ptr = kPayloadLength & 0xFF;
-    ++payload_ptr;
-  }
-  for (size_t i = 0; i < num_payloads; ++i) {
-    // Write |i| to all bytes in each payload.
-    if (embed_opus_fec) {
-      CreateOpusFecPayload(payload_ptr, kPayloadLength,
-                           static_cast<uint8_t>(i));
-    } else {
-      memset(payload_ptr, static_cast<int>(i), kPayloadLength);
-    }
-    payload_ptr += kPayloadLength;
-  }
-  return packet;
-}
-
-// Create a packet with all payload bytes set to |payload_value|.
-Packet CreatePacket(uint8_t payload_type,
-                    size_t payload_length,
-                    uint8_t payload_value,
-                    bool opus_fec = false) {
-  Packet packet;
-  packet.payload_type = payload_type;
-  packet.timestamp = kBaseTimestamp;
-  packet.sequence_number = kSequenceNumber;
-  packet.payload.SetSize(payload_length);
-  if (opus_fec) {
-    CreateOpusFecPayload(packet.payload.data(), packet.payload.size(),
-                         payload_value);
-  } else {
-    memset(packet.payload.data(), payload_value, packet.payload.size());
-  }
-  return packet;
-}
-
-// Checks that |packet| has the attributes given in the remaining parameters.
-void VerifyPacket(const Packet& packet,
-                  size_t payload_length,
-                  uint8_t payload_type,
-                  uint16_t sequence_number,
-                  uint32_t timestamp,
-                  uint8_t payload_value,
-                  Packet::Priority priority) {
-  EXPECT_EQ(payload_length, packet.payload.size());
-  EXPECT_EQ(payload_type, packet.payload_type);
-  EXPECT_EQ(sequence_number, packet.sequence_number);
-  EXPECT_EQ(timestamp, packet.timestamp);
-  EXPECT_EQ(priority, packet.priority);
-  ASSERT_FALSE(packet.payload.empty());
-  for (size_t i = 0; i < packet.payload.size(); ++i) {
-    ASSERT_EQ(payload_value, packet.payload.data()[i]);
-  }
-}
-
-void VerifyPacket(const Packet& packet,
-                  size_t payload_length,
-                  uint8_t payload_type,
-                  uint16_t sequence_number,
-                  uint32_t timestamp,
-                  uint8_t payload_value,
-                  bool primary) {
-  return VerifyPacket(packet, payload_length, payload_type, sequence_number,
-                      timestamp, payload_value,
-                      Packet::Priority{0, primary ? 0 : 1});
-}
-
-// Start of test definitions.
-
-TEST(RedPayloadSplitter, CreateAndDestroy) {
-  RedPayloadSplitter* splitter = new RedPayloadSplitter;
-  delete splitter;
-}
-
-// Packet A is split into A1 and A2.
-TEST(RedPayloadSplitter, OnePacketTwoPayloads) {
-  uint8_t payload_types[] = {0, 0};
-  const int kTimestampOffset = 160;
-  PacketList packet_list;
-  packet_list.push_back(CreateRedPayload(2, payload_types, kTimestampOffset));
-  RedPayloadSplitter splitter;
-  EXPECT_TRUE(splitter.SplitRed(&packet_list));
-  ASSERT_EQ(2u, packet_list.size());
-  // Check first packet. The first in list should always be the primary payload.
-  VerifyPacket(packet_list.front(), kPayloadLength, payload_types[1],
-               kSequenceNumber, kBaseTimestamp, 1, true);
-  packet_list.pop_front();
-  // Check second packet.
-  VerifyPacket(packet_list.front(), kPayloadLength, payload_types[0],
-               kSequenceNumber, kBaseTimestamp - kTimestampOffset, 0, false);
-}
-
-// Packets A and B are not split at all. Only the RED header in each packet is
-// removed.
-TEST(RedPayloadSplitter, TwoPacketsOnePayload) {
-  uint8_t payload_types[] = {0};
-  const int kTimestampOffset = 160;
-  // Create first packet, with a single RED payload.
-  PacketList packet_list;
-  packet_list.push_back(CreateRedPayload(1, payload_types, kTimestampOffset));
-  // Create second packet, with a single RED payload.
-  {
-    Packet packet = CreateRedPayload(1, payload_types, kTimestampOffset);
-    // Manually change timestamp and sequence number of second packet.
-    packet.timestamp += kTimestampOffset;
-    packet.sequence_number++;
-    packet_list.push_back(std::move(packet));
-  }
-  RedPayloadSplitter splitter;
-  EXPECT_TRUE(splitter.SplitRed(&packet_list));
-  ASSERT_EQ(2u, packet_list.size());
-  // Check first packet.
-  VerifyPacket(packet_list.front(), kPayloadLength, payload_types[0],
-               kSequenceNumber, kBaseTimestamp, 0, true);
-  packet_list.pop_front();
-  // Check second packet.
-  VerifyPacket(packet_list.front(), kPayloadLength, payload_types[0],
-               kSequenceNumber + 1, kBaseTimestamp + kTimestampOffset, 0, true);
-}
-
-// Packets A and B are split into packets A1, A2, A3, B1, B2, B3, with
-// attributes as follows:
-//
-//                  A1*   A2    A3    B1*   B2    B3
-// Payload type     0     1     2     0     1     2
-// Timestamp        b     b-o   b-2o  b+o   b     b-o
-// Sequence number  0     0     0     1     1     1
-//
-// b = kBaseTimestamp, o = kTimestampOffset, * = primary.
-TEST(RedPayloadSplitter, TwoPacketsThreePayloads) {
-  uint8_t payload_types[] = {2, 1, 0};  // Primary is the last one.
-  const int kTimestampOffset = 160;
-  // Create first packet, with 3 RED payloads.
-  PacketList packet_list;
-  packet_list.push_back(CreateRedPayload(3, payload_types, kTimestampOffset));
-  // Create first packet, with 3 RED payloads.
-  {
-    Packet packet = CreateRedPayload(3, payload_types, kTimestampOffset);
-    // Manually change timestamp and sequence number of second packet.
-    packet.timestamp += kTimestampOffset;
-    packet.sequence_number++;
-    packet_list.push_back(std::move(packet));
-  }
-  RedPayloadSplitter splitter;
-  EXPECT_TRUE(splitter.SplitRed(&packet_list));
-  ASSERT_EQ(6u, packet_list.size());
-  // Check first packet, A1.
-  VerifyPacket(packet_list.front(), kPayloadLength, payload_types[2],
-               kSequenceNumber, kBaseTimestamp, 2, {0, 0});
-  packet_list.pop_front();
-  // Check second packet, A2.
-  VerifyPacket(packet_list.front(), kPayloadLength, payload_types[1],
-               kSequenceNumber, kBaseTimestamp - kTimestampOffset, 1, {0, 1});
-  packet_list.pop_front();
-  // Check third packet, A3.
-  VerifyPacket(packet_list.front(), kPayloadLength, payload_types[0],
-               kSequenceNumber, kBaseTimestamp - 2 * kTimestampOffset, 0,
-               {0, 2});
-  packet_list.pop_front();
-  // Check fourth packet, B1.
-  VerifyPacket(packet_list.front(), kPayloadLength, payload_types[2],
-               kSequenceNumber + 1, kBaseTimestamp + kTimestampOffset, 2,
-               {0, 0});
-  packet_list.pop_front();
-  // Check fifth packet, B2.
-  VerifyPacket(packet_list.front(), kPayloadLength, payload_types[1],
-               kSequenceNumber + 1, kBaseTimestamp, 1, {0, 1});
-  packet_list.pop_front();
-  // Check sixth packet, B3.
-  VerifyPacket(packet_list.front(), kPayloadLength, payload_types[0],
-               kSequenceNumber + 1, kBaseTimestamp - kTimestampOffset, 0,
-               {0, 2});
-}
-
-// Creates a list with 4 packets with these payload types:
-// 0 = CNGnb
-// 1 = PCMu
-// 2 = DTMF (AVT)
-// 3 = iLBC
-// We expect the method CheckRedPayloads to discard the iLBC packet, since it
-// is a non-CNG, non-DTMF payload of another type than the first speech payload
-// found in the list (which is PCMu).
-TEST(RedPayloadSplitter, CheckRedPayloads) {
-  PacketList packet_list;
-  for (uint8_t i = 0; i <= 3; ++i) {
-    // Create packet with payload type |i|, payload length 10 bytes, all 0.
-    packet_list.push_back(CreatePacket(i, 10, 0));
-  }
-
-  // Use a real DecoderDatabase object here instead of a mock, since it is
-  // easier to just register the payload types and let the actual implementation
-  // do its job.
-  DecoderDatabase decoder_database(
-      new rtc::RefCountedObject<MockAudioDecoderFactory>);
-  decoder_database.RegisterPayload(0, NetEqDecoder::kDecoderCNGnb, "cng-nb");
-  decoder_database.RegisterPayload(1, NetEqDecoder::kDecoderPCMu, "pcmu");
-  decoder_database.RegisterPayload(2, NetEqDecoder::kDecoderAVT, "avt");
-  decoder_database.RegisterPayload(3, NetEqDecoder::kDecoderILBC, "ilbc");
-
-  RedPayloadSplitter splitter;
-  splitter.CheckRedPayloads(&packet_list, decoder_database);
-
-  ASSERT_EQ(3u, packet_list.size());  // Should have dropped the last packet.
-  // Verify packets. The loop verifies that payload types 0, 1, and 2 are in the
-  // list.
-  for (int i = 0; i <= 2; ++i) {
-    VerifyPacket(packet_list.front(), 10, i, kSequenceNumber, kBaseTimestamp, 0,
-                 true);
-    packet_list.pop_front();
-  }
-  EXPECT_TRUE(packet_list.empty());
-}
-
-// Packet A is split into A1, A2 and A3. But the length parameter is off, so
-// the last payloads should be discarded.
-TEST(RedPayloadSplitter, WrongPayloadLength) {
-  uint8_t payload_types[] = {0, 0, 0};
-  const int kTimestampOffset = 160;
-  PacketList packet_list;
-  {
-    Packet packet = CreateRedPayload(3, payload_types, kTimestampOffset);
-    // Manually tamper with the payload length of the packet.
-    // This is one byte too short for the second payload (out of three).
-    // We expect only the first payload to be returned.
-    packet.payload.SetSize(packet.payload.size() - (kPayloadLength + 1));
-    packet_list.push_back(std::move(packet));
-  }
-  RedPayloadSplitter splitter;
-  EXPECT_FALSE(splitter.SplitRed(&packet_list));
-  ASSERT_EQ(1u, packet_list.size());
-  // Check first packet.
-  VerifyPacket(packet_list.front(), kPayloadLength, payload_types[0],
-               kSequenceNumber, kBaseTimestamp - 2 * kTimestampOffset, 0,
-               {0, 2});
-  packet_list.pop_front();
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/neteq/rtcp.cc b/modules/audio_coding/neteq/rtcp.cc
deleted file mode 100644
index 3f8ef0e..0000000
--- a/modules/audio_coding/neteq/rtcp.cc
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- *  Copyright (c) 2011 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/neteq/rtcp.h"
-
-#include <stdlib.h>
-#include <string.h>
-
-#include <algorithm>
-
-#include "webrtc/modules/include/module_common_types.h"
-
-namespace webrtc {
-
-void Rtcp::Init(uint16_t start_sequence_number) {
-  cycles_ = 0;
-  max_seq_no_ = start_sequence_number;
-  base_seq_no_ = start_sequence_number;
-  received_packets_ = 0;
-  received_packets_prior_ = 0;
-  expected_prior_ = 0;
-  jitter_ = 0;
-  transit_ = 0;
-}
-
-void Rtcp::Update(const RTPHeader& rtp_header, uint32_t receive_timestamp) {
-  // Update number of received packets, and largest packet number received.
-  received_packets_++;
-  int16_t sn_diff = rtp_header.sequenceNumber - max_seq_no_;
-  if (sn_diff >= 0) {
-    if (rtp_header.sequenceNumber < max_seq_no_) {
-      // Wrap-around detected.
-      cycles_++;
-    }
-    max_seq_no_ = rtp_header.sequenceNumber;
-  }
-
-  // Calculate jitter according to RFC 3550, and update previous timestamps.
-  // Note that the value in |jitter_| is in Q4.
-  if (received_packets_ > 1) {
-    int32_t ts_diff = receive_timestamp - (rtp_header.timestamp - transit_);
-    int64_t jitter_diff = (std::abs(int64_t{ts_diff}) << 4) - jitter_;
-    // Calculate 15 * jitter_ / 16 + jitter_diff / 16 (with proper rounding).
-    jitter_ = jitter_ + ((jitter_diff + 8) >> 4);
-    RTC_DCHECK_GE(jitter_, 0);
-  }
-  transit_ = rtp_header.timestamp - receive_timestamp;
-}
-
-void Rtcp::GetStatistics(bool no_reset, RtcpStatistics* stats) {
-  // Extended highest sequence number received.
-  stats->extended_highest_sequence_number =
-      (static_cast<int>(cycles_) << 16) + max_seq_no_;
-
-  // Calculate expected number of packets and compare it with the number of
-  // packets that were actually received. The cumulative number of lost packets
-  // can be extracted.
-  uint32_t expected_packets =
-      stats->extended_highest_sequence_number - base_seq_no_ + 1;
-  if (received_packets_ == 0) {
-    // No packets received, assume none lost.
-    stats->packets_lost = 0;
-  } else if (expected_packets > received_packets_) {
-    stats->packets_lost = expected_packets - received_packets_;
-    if (stats->packets_lost > 0xFFFFFF) {
-      stats->packets_lost = 0xFFFFFF;
-    }
-  } else {
-    stats->packets_lost = 0;
-  }
-
-  // Fraction lost since last report.
-  uint32_t expected_since_last = expected_packets - expected_prior_;
-  uint32_t received_since_last = received_packets_ - received_packets_prior_;
-  if (!no_reset) {
-    expected_prior_ = expected_packets;
-    received_packets_prior_ = received_packets_;
-  }
-  int32_t lost = expected_since_last - received_since_last;
-  if (expected_since_last == 0 || lost <= 0 || received_packets_ == 0) {
-    stats->fraction_lost = 0;
-  } else {
-    stats->fraction_lost = std::min(0xFFU, (lost << 8) / expected_since_last);
-  }
-
-  stats->jitter = jitter_ >> 4;  // Scaling from Q4.
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/neteq/rtcp.h b/modules/audio_coding/neteq/rtcp.h
deleted file mode 100644
index ae0ed8d..0000000
--- a/modules/audio_coding/neteq/rtcp.h
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- *  Copyright (c) 2011 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_NETEQ_RTCP_H_
-#define WEBRTC_MODULES_AUDIO_CODING_NETEQ_RTCP_H_
-
-#include "webrtc/modules/audio_coding/neteq/include/neteq.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-// Forward declaration.
-struct RTPHeader;
-
-class Rtcp {
- public:
-  Rtcp() {
-    Init(0);
-  }
-
-  ~Rtcp() {}
-
-  // Resets the RTCP statistics, and sets the first received sequence number.
-  void Init(uint16_t start_sequence_number);
-
-  // Updates the RTCP statistics with a new received packet.
-  void Update(const RTPHeader& rtp_header, uint32_t receive_timestamp);
-
-  // Returns the current RTCP statistics. If |no_reset| is true, the statistics
-  // are not reset, otherwise they are.
-  void GetStatistics(bool no_reset, RtcpStatistics* stats);
-
- private:
-  uint16_t cycles_;  // The number of wrap-arounds for the sequence number.
-  uint16_t max_seq_no_;  // The maximum sequence number received. Starts over
-                         // from 0 after wrap-around.
-  uint16_t base_seq_no_;  // The sequence number of the first received packet.
-  uint32_t received_packets_;  // The number of packets that have been received.
-  uint32_t received_packets_prior_;  // Number of packets received when last
-                                     // report was generated.
-  uint32_t expected_prior_;  // Expected number of packets, at the time of the
-                             // last report.
-  int64_t jitter_;  // Current jitter value in Q4.
-  int32_t transit_;  // Clock difference for previous packet.
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(Rtcp);
-};
-
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_AUDIO_CODING_NETEQ_RTCP_H_
diff --git a/modules/audio_coding/neteq/statistics_calculator.cc b/modules/audio_coding/neteq/statistics_calculator.cc
deleted file mode 100644
index e47f92f..0000000
--- a/modules/audio_coding/neteq/statistics_calculator.cc
+++ /dev/null
@@ -1,335 +0,0 @@
-/*
- *  Copyright (c) 2013 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/neteq/statistics_calculator.h"
-
-#include <assert.h>
-#include <string.h>  // memset
-#include <algorithm>
-
-#include "webrtc/modules/audio_coding/neteq/decision_logic.h"
-#include "webrtc/modules/audio_coding/neteq/delay_manager.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/safe_conversions.h"
-#include "webrtc/system_wrappers/include/metrics.h"
-
-namespace webrtc {
-
-namespace {
-size_t AddIntToSizeTWithLowerCap(int a, size_t b) {
-  const size_t ret = b + a;
-  // If a + b is negative, resulting in a negative wrap, cap it to zero instead.
-  static_assert(sizeof(size_t) >= sizeof(int),
-                "int must not be wider than size_t for this to work");
-  return (a < 0 && ret > b) ? 0 : ret;
-}
-}  // namespace
-
-// Allocating the static const so that it can be passed by reference to
-// RTC_DCHECK.
-const size_t StatisticsCalculator::kLenWaitingTimes;
-
-StatisticsCalculator::PeriodicUmaLogger::PeriodicUmaLogger(
-    const std::string& uma_name,
-    int report_interval_ms,
-    int max_value)
-    : uma_name_(uma_name),
-      report_interval_ms_(report_interval_ms),
-      max_value_(max_value),
-      timer_(0) {
-}
-
-StatisticsCalculator::PeriodicUmaLogger::~PeriodicUmaLogger() = default;
-
-void StatisticsCalculator::PeriodicUmaLogger::AdvanceClock(int step_ms) {
-  timer_ += step_ms;
-  if (timer_ < report_interval_ms_) {
-    return;
-  }
-  LogToUma(Metric());
-  Reset();
-  timer_ -= report_interval_ms_;
-  RTC_DCHECK_GE(timer_, 0);
-}
-
-void StatisticsCalculator::PeriodicUmaLogger::LogToUma(int value) const {
-  RTC_HISTOGRAM_COUNTS_SPARSE(uma_name_, value, 1, max_value_, 50);
-}
-
-StatisticsCalculator::PeriodicUmaCount::PeriodicUmaCount(
-    const std::string& uma_name,
-    int report_interval_ms,
-    int max_value)
-    : PeriodicUmaLogger(uma_name, report_interval_ms, max_value) {
-}
-
-StatisticsCalculator::PeriodicUmaCount::~PeriodicUmaCount() {
-  // Log the count for the current (incomplete) interval.
-  LogToUma(Metric());
-}
-
-void StatisticsCalculator::PeriodicUmaCount::RegisterSample() {
-  ++counter_;
-}
-
-int StatisticsCalculator::PeriodicUmaCount::Metric() const {
-  return counter_;
-}
-
-void StatisticsCalculator::PeriodicUmaCount::Reset() {
-  counter_ = 0;
-}
-
-StatisticsCalculator::PeriodicUmaAverage::PeriodicUmaAverage(
-    const std::string& uma_name,
-    int report_interval_ms,
-    int max_value)
-    : PeriodicUmaLogger(uma_name, report_interval_ms, max_value) {
-}
-
-StatisticsCalculator::PeriodicUmaAverage::~PeriodicUmaAverage() {
-  // Log the average for the current (incomplete) interval.
-  LogToUma(Metric());
-}
-
-void StatisticsCalculator::PeriodicUmaAverage::RegisterSample(int value) {
-  sum_ += value;
-  ++counter_;
-}
-
-int StatisticsCalculator::PeriodicUmaAverage::Metric() const {
-  return counter_ == 0 ? 0 : static_cast<int>(sum_ / counter_);
-}
-
-void StatisticsCalculator::PeriodicUmaAverage::Reset() {
-  sum_ = 0.0;
-  counter_ = 0;
-}
-
-StatisticsCalculator::StatisticsCalculator()
-    : preemptive_samples_(0),
-      accelerate_samples_(0),
-      added_zero_samples_(0),
-      expanded_speech_samples_(0),
-      expanded_noise_samples_(0),
-      discarded_packets_(0),
-      lost_timestamps_(0),
-      timestamps_since_last_report_(0),
-      secondary_decoded_samples_(0),
-      discarded_secondary_packets_(0),
-      delayed_packet_outage_counter_(
-          "WebRTC.Audio.DelayedPacketOutageEventsPerMinute",
-          60000,  // 60 seconds report interval.
-          100),
-      excess_buffer_delay_("WebRTC.Audio.AverageExcessBufferDelayMs",
-                           60000,  // 60 seconds report interval.
-                           1000) {}
-
-StatisticsCalculator::~StatisticsCalculator() = default;
-
-void StatisticsCalculator::Reset() {
-  preemptive_samples_ = 0;
-  accelerate_samples_ = 0;
-  added_zero_samples_ = 0;
-  expanded_speech_samples_ = 0;
-  expanded_noise_samples_ = 0;
-  secondary_decoded_samples_ = 0;
-  discarded_secondary_packets_ = 0;
-  waiting_times_.clear();
-}
-
-void StatisticsCalculator::ResetMcu() {
-  discarded_packets_ = 0;
-  lost_timestamps_ = 0;
-  timestamps_since_last_report_ = 0;
-}
-
-void StatisticsCalculator::ExpandedVoiceSamples(size_t num_samples) {
-  expanded_speech_samples_ += num_samples;
-  lifetime_stats_.concealed_samples += num_samples;
-}
-
-void StatisticsCalculator::ExpandedNoiseSamples(size_t num_samples) {
-  expanded_noise_samples_ += num_samples;
-  lifetime_stats_.concealed_samples += num_samples;
-}
-
-void StatisticsCalculator::ExpandedVoiceSamplesCorrection(int num_samples) {
-  expanded_speech_samples_ =
-      AddIntToSizeTWithLowerCap(num_samples, expanded_speech_samples_);
-  lifetime_stats_.concealed_samples += num_samples;
-}
-
-void StatisticsCalculator::ExpandedNoiseSamplesCorrection(int num_samples) {
-  expanded_noise_samples_ =
-      AddIntToSizeTWithLowerCap(num_samples, expanded_noise_samples_);
-  lifetime_stats_.concealed_samples += num_samples;
-}
-
-void StatisticsCalculator::PreemptiveExpandedSamples(size_t num_samples) {
-  preemptive_samples_ += num_samples;
-  lifetime_stats_.concealed_samples += num_samples;
-}
-
-void StatisticsCalculator::AcceleratedSamples(size_t num_samples) {
-  accelerate_samples_ += num_samples;
-}
-
-void StatisticsCalculator::AddZeros(size_t num_samples) {
-  added_zero_samples_ += num_samples;
-}
-
-void StatisticsCalculator::PacketsDiscarded(size_t num_packets) {
-  discarded_packets_ += num_packets;
-}
-
-void StatisticsCalculator::SecondaryPacketsDiscarded(size_t num_packets) {
-  discarded_secondary_packets_ += num_packets;
-}
-
-void StatisticsCalculator::LostSamples(size_t num_samples) {
-  lost_timestamps_ += num_samples;
-}
-
-void StatisticsCalculator::IncreaseCounter(size_t num_samples, int fs_hz) {
-  const int time_step_ms =
-      rtc::CheckedDivExact(static_cast<int>(1000 * num_samples), fs_hz);
-  delayed_packet_outage_counter_.AdvanceClock(time_step_ms);
-  excess_buffer_delay_.AdvanceClock(time_step_ms);
-  timestamps_since_last_report_ += static_cast<uint32_t>(num_samples);
-  if (timestamps_since_last_report_ >
-      static_cast<uint32_t>(fs_hz * kMaxReportPeriod)) {
-    lost_timestamps_ = 0;
-    timestamps_since_last_report_ = 0;
-    discarded_packets_ = 0;
-  }
-  lifetime_stats_.total_samples_received += num_samples;
-}
-
-void StatisticsCalculator::SecondaryDecodedSamples(int num_samples) {
-  secondary_decoded_samples_ += num_samples;
-}
-
-void StatisticsCalculator::LogDelayedPacketOutageEvent(int outage_duration_ms) {
-  RTC_HISTOGRAM_COUNTS("WebRTC.Audio.DelayedPacketOutageEventMs",
-                       outage_duration_ms, 1 /* min */, 2000 /* max */,
-                       100 /* bucket count */);
-  delayed_packet_outage_counter_.RegisterSample();
-}
-
-void StatisticsCalculator::StoreWaitingTime(int waiting_time_ms) {
-  excess_buffer_delay_.RegisterSample(waiting_time_ms);
-  RTC_DCHECK_LE(waiting_times_.size(), kLenWaitingTimes);
-  if (waiting_times_.size() == kLenWaitingTimes) {
-    // Erase first value.
-    waiting_times_.pop_front();
-  }
-  waiting_times_.push_back(waiting_time_ms);
-}
-
-void StatisticsCalculator::GetNetworkStatistics(
-    int fs_hz,
-    size_t num_samples_in_buffers,
-    size_t samples_per_packet,
-    const DelayManager& delay_manager,
-    const DecisionLogic& decision_logic,
-    NetEqNetworkStatistics *stats) {
-  if (fs_hz <= 0 || !stats) {
-    assert(false);
-    return;
-  }
-
-  stats->added_zero_samples = added_zero_samples_;
-  stats->current_buffer_size_ms =
-      static_cast<uint16_t>(num_samples_in_buffers * 1000 / fs_hz);
-  const int ms_per_packet = rtc::dchecked_cast<int>(
-      decision_logic.packet_length_samples() / (fs_hz / 1000));
-  stats->preferred_buffer_size_ms = (delay_manager.TargetLevel() >> 8) *
-      ms_per_packet;
-  stats->jitter_peaks_found = delay_manager.PeakFound();
-  stats->clockdrift_ppm =
-      rtc::saturated_cast<int32_t>(delay_manager.EstimatedClockDriftPpm());
-
-  stats->packet_loss_rate =
-      CalculateQ14Ratio(lost_timestamps_, timestamps_since_last_report_);
-
-  stats->accelerate_rate =
-      CalculateQ14Ratio(accelerate_samples_, timestamps_since_last_report_);
-
-  stats->preemptive_rate =
-      CalculateQ14Ratio(preemptive_samples_, timestamps_since_last_report_);
-
-  stats->expand_rate =
-      CalculateQ14Ratio(expanded_speech_samples_ + expanded_noise_samples_,
-                        timestamps_since_last_report_);
-
-  stats->speech_expand_rate =
-      CalculateQ14Ratio(expanded_speech_samples_,
-                        timestamps_since_last_report_);
-
-  stats->secondary_decoded_rate =
-      CalculateQ14Ratio(secondary_decoded_samples_,
-                        timestamps_since_last_report_);
-
-  const size_t discarded_secondary_samples =
-      discarded_secondary_packets_ * samples_per_packet;
-  stats->secondary_discarded_rate = CalculateQ14Ratio(
-      discarded_secondary_samples,
-      static_cast<uint32_t>(discarded_secondary_samples +
-        secondary_decoded_samples_));
-
-  if (waiting_times_.size() == 0) {
-    stats->mean_waiting_time_ms = -1;
-    stats->median_waiting_time_ms = -1;
-    stats->min_waiting_time_ms = -1;
-    stats->max_waiting_time_ms = -1;
-  } else {
-    std::sort(waiting_times_.begin(), waiting_times_.end());
-    // Find mid-point elements. If the size is odd, the two values
-    // |middle_left| and |middle_right| will both be the one middle element; if
-    // the size is even, they will be the the two neighboring elements at the
-    // middle of the list.
-    const int middle_left = waiting_times_[(waiting_times_.size() - 1) / 2];
-    const int middle_right = waiting_times_[waiting_times_.size() / 2];
-    // Calculate the average of the two. (Works also for odd sizes.)
-    stats->median_waiting_time_ms = (middle_left + middle_right) / 2;
-    stats->min_waiting_time_ms = waiting_times_.front();
-    stats->max_waiting_time_ms = waiting_times_.back();
-    double sum = 0;
-    for (auto time : waiting_times_) {
-      sum += time;
-    }
-    stats->mean_waiting_time_ms = static_cast<int>(sum / waiting_times_.size());
-  }
-
-  // Reset counters.
-  ResetMcu();
-  Reset();
-}
-
-NetEqLifetimeStatistics StatisticsCalculator::GetLifetimeStatistics() const {
-  return lifetime_stats_;
-}
-
-uint16_t StatisticsCalculator::CalculateQ14Ratio(size_t numerator,
-                                                 uint32_t denominator) {
-  if (numerator == 0) {
-    return 0;
-  } else if (numerator < denominator) {
-    // Ratio must be smaller than 1 in Q14.
-    assert((numerator << 14) / denominator < (1 << 14));
-    return static_cast<uint16_t>((numerator << 14) / denominator);
-  } else {
-    // Will not produce a ratio larger than 1, since this is probably an error.
-    return 1 << 14;
-  }
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/neteq/statistics_calculator.h b/modules/audio_coding/neteq/statistics_calculator.h
deleted file mode 100644
index f261a66..0000000
--- a/modules/audio_coding/neteq/statistics_calculator.h
+++ /dev/null
@@ -1,185 +0,0 @@
-/*
- *  Copyright (c) 2013 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_NETEQ_STATISTICS_CALCULATOR_H_
-#define WEBRTC_MODULES_AUDIO_CODING_NETEQ_STATISTICS_CALCULATOR_H_
-
-#include <deque>
-#include <string>
-
-#include "webrtc/modules/audio_coding/neteq/include/neteq.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-// Forward declarations.
-class DecisionLogic;
-class DelayManager;
-
-// This class handles various network statistics in NetEq.
-class StatisticsCalculator {
- public:
-  StatisticsCalculator();
-
-  virtual ~StatisticsCalculator();
-
-  // Resets most of the counters.
-  void Reset();
-
-  // Resets the counters that are not handled by Reset().
-  void ResetMcu();
-
-  // Reports that |num_samples| samples were produced through expansion, and
-  // that the expansion produced other than just noise samples.
-  void ExpandedVoiceSamples(size_t num_samples);
-
-  // Reports that |num_samples| samples were produced through expansion, and
-  // that the expansion produced only noise samples.
-  void ExpandedNoiseSamples(size_t num_samples);
-
-  // Corrects the statistics for number of samples produced through non-noise
-  // expansion by adding |num_samples| (negative or positive) to the current
-  // value. The result is capped to zero to avoid negative values.
-  void ExpandedVoiceSamplesCorrection(int num_samples);
-
-  // Same as ExpandedVoiceSamplesCorrection but for noise samples.
-  void ExpandedNoiseSamplesCorrection(int num_samples);
-
-  // Reports that |num_samples| samples were produced through preemptive
-  // expansion.
-  void PreemptiveExpandedSamples(size_t num_samples);
-
-  // Reports that |num_samples| samples were removed through accelerate.
-  void AcceleratedSamples(size_t num_samples);
-
-  // Reports that |num_samples| zeros were inserted into the output.
-  void AddZeros(size_t num_samples);
-
-  // Reports that |num_packets| packets were discarded.
-  virtual void PacketsDiscarded(size_t num_packets);
-
-  // Reports that |num_packets| packets samples were discarded.
-  virtual void SecondaryPacketsDiscarded(size_t num_samples);
-
-  // Reports that |num_samples| were lost.
-  void LostSamples(size_t num_samples);
-
-  // Increases the report interval counter with |num_samples| at a sample rate
-  // of |fs_hz|. This is how the StatisticsCalculator gets notified that current
-  // time is increasing.
-  void IncreaseCounter(size_t num_samples, int fs_hz);
-
-  // Stores new packet waiting time in waiting time statistics.
-  void StoreWaitingTime(int waiting_time_ms);
-
-  // Reports that |num_samples| samples were decoded from secondary packets.
-  void SecondaryDecodedSamples(int num_samples);
-
-  // Logs a delayed packet outage event of |outage_duration_ms|. A delayed
-  // packet outage event is defined as an expand period caused not by an actual
-  // packet loss, but by a delayed packet.
-  virtual void LogDelayedPacketOutageEvent(int outage_duration_ms);
-
-  // Returns the current network statistics in |stats|. The current sample rate
-  // is |fs_hz|, the total number of samples in packet buffer and sync buffer
-  // yet to play out is |num_samples_in_buffers|, and the number of samples per
-  // packet is |samples_per_packet|.
-  void GetNetworkStatistics(int fs_hz,
-                            size_t num_samples_in_buffers,
-                            size_t samples_per_packet,
-                            const DelayManager& delay_manager,
-                            const DecisionLogic& decision_logic,
-                            NetEqNetworkStatistics *stats);
-
-  // Returns a copy of this class's lifetime statistics. These statistics are
-  // never reset.
-  NetEqLifetimeStatistics GetLifetimeStatistics() const;
-
- private:
-  static const int kMaxReportPeriod = 60;  // Seconds before auto-reset.
-  static const size_t kLenWaitingTimes = 100;
-
-  class PeriodicUmaLogger {
-   public:
-    PeriodicUmaLogger(const std::string& uma_name,
-                      int report_interval_ms,
-                      int max_value);
-    virtual ~PeriodicUmaLogger();
-    void AdvanceClock(int step_ms);
-
-   protected:
-    void LogToUma(int value) const;
-    virtual int Metric() const = 0;
-    virtual void Reset() = 0;
-
-    const std::string uma_name_;
-    const int report_interval_ms_;
-    const int max_value_;
-    int timer_ = 0;
-  };
-
-  class PeriodicUmaCount final : public PeriodicUmaLogger {
-   public:
-    PeriodicUmaCount(const std::string& uma_name,
-                     int report_interval_ms,
-                     int max_value);
-    ~PeriodicUmaCount() override;
-    void RegisterSample();
-
-   protected:
-    int Metric() const override;
-    void Reset() override;
-
-   private:
-    int counter_ = 0;
-  };
-
-  class PeriodicUmaAverage final : public PeriodicUmaLogger {
-   public:
-    PeriodicUmaAverage(const std::string& uma_name,
-                       int report_interval_ms,
-                       int max_value);
-    ~PeriodicUmaAverage() override;
-    void RegisterSample(int value);
-
-   protected:
-    int Metric() const override;
-    void Reset() override;
-
-   private:
-    double sum_ = 0.0;
-    int counter_ = 0;
-  };
-
-  // Calculates numerator / denominator, and returns the value in Q14.
-  static uint16_t CalculateQ14Ratio(size_t numerator, uint32_t denominator);
-
-  // TODO(steveanton): Add unit tests for the lifetime stats.
-  NetEqLifetimeStatistics lifetime_stats_;
-  size_t preemptive_samples_;
-  size_t accelerate_samples_;
-  size_t added_zero_samples_;
-  size_t expanded_speech_samples_;
-  size_t expanded_noise_samples_;
-  size_t discarded_packets_;
-  size_t lost_timestamps_;
-  uint32_t timestamps_since_last_report_;
-  std::deque<int> waiting_times_;
-  uint32_t secondary_decoded_samples_;
-  size_t discarded_secondary_packets_;
-  PeriodicUmaCount delayed_packet_outage_counter_;
-  PeriodicUmaAverage excess_buffer_delay_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(StatisticsCalculator);
-};
-
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_AUDIO_CODING_NETEQ_STATISTICS_CALCULATOR_H_
diff --git a/modules/audio_coding/neteq/sync_buffer.cc b/modules/audio_coding/neteq/sync_buffer.cc
deleted file mode 100644
index 49f8013..0000000
--- a/modules/audio_coding/neteq/sync_buffer.cc
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- *  Copyright (c) 2012 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 <algorithm>  // Access to min.
-
-#include "webrtc/modules/audio_coding/neteq/sync_buffer.h"
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-
-size_t SyncBuffer::FutureLength() const {
-  return Size() - next_index_;
-}
-
-void SyncBuffer::PushBack(const AudioMultiVector& append_this) {
-  size_t samples_added = append_this.Size();
-  AudioMultiVector::PushBack(append_this);
-  AudioMultiVector::PopFront(samples_added);
-  if (samples_added <= next_index_) {
-    next_index_ -= samples_added;
-  } else {
-    // This means that we are pushing out future data that was never used.
-//    assert(false);
-    // TODO(hlundin): This assert must be disabled to support 60 ms frames.
-    // This should not happen even for 60 ms frames, but it does. Investigate
-    // why.
-    next_index_ = 0;
-  }
-  dtmf_index_ -= std::min(dtmf_index_, samples_added);
-}
-
-void SyncBuffer::PushFrontZeros(size_t length) {
-  InsertZerosAtIndex(length, 0);
-}
-
-void SyncBuffer::InsertZerosAtIndex(size_t length, size_t position) {
-  position = std::min(position, Size());
-  length = std::min(length, Size() - position);
-  AudioMultiVector::PopBack(length);
-  for (size_t channel = 0; channel < Channels(); ++channel) {
-    channels_[channel]->InsertZerosAt(length, position);
-  }
-  if (next_index_ >= position) {
-    // We are moving the |next_index_| sample.
-    set_next_index(next_index_ + length);  // Overflow handled by subfunction.
-  }
-  if (dtmf_index_ > 0 && dtmf_index_ >= position) {
-    // We are moving the |dtmf_index_| sample.
-    set_dtmf_index(dtmf_index_ + length);  // Overflow handled by subfunction.
-  }
-}
-
-void SyncBuffer::ReplaceAtIndex(const AudioMultiVector& insert_this,
-                                size_t length,
-                                size_t position) {
-  position = std::min(position, Size());  // Cap |position| in the valid range.
-  length = std::min(length, Size() - position);
-  AudioMultiVector::OverwriteAt(insert_this, length, position);
-}
-
-void SyncBuffer::ReplaceAtIndex(const AudioMultiVector& insert_this,
-                                size_t position) {
-  ReplaceAtIndex(insert_this, insert_this.Size(), position);
-}
-
-void SyncBuffer::GetNextAudioInterleaved(size_t requested_len,
-                                         AudioFrame* output) {
-  RTC_DCHECK(output);
-  const size_t samples_to_read = std::min(FutureLength(), requested_len);
-  output->ResetWithoutMuting();
-  const size_t tot_samples_read =
-      ReadInterleavedFromIndex(next_index_, samples_to_read,
-                               output->mutable_data());
-  const size_t samples_read_per_channel = tot_samples_read / Channels();
-  next_index_ += samples_read_per_channel;
-  output->num_channels_ = Channels();
-  output->samples_per_channel_ = samples_read_per_channel;
-}
-
-void SyncBuffer::IncreaseEndTimestamp(uint32_t increment) {
-  end_timestamp_ += increment;
-}
-
-void SyncBuffer::Flush() {
-  Zeros(Size());
-  next_index_ = Size();
-  end_timestamp_ = 0;
-  dtmf_index_ = 0;
-}
-
-void SyncBuffer::set_next_index(size_t value) {
-  // Cannot set |next_index_| larger than the size of the buffer.
-  next_index_ = std::min(value, Size());
-}
-
-void SyncBuffer::set_dtmf_index(size_t value) {
-  // Cannot set |dtmf_index_| larger than the size of the buffer.
-  dtmf_index_ = std::min(value, Size());
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/neteq/sync_buffer.h b/modules/audio_coding/neteq/sync_buffer.h
deleted file mode 100644
index a3a78f5..0000000
--- a/modules/audio_coding/neteq/sync_buffer.h
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- *  Copyright (c) 2012 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_NETEQ_SYNC_BUFFER_H_
-#define WEBRTC_MODULES_AUDIO_CODING_NETEQ_SYNC_BUFFER_H_
-
-#include "webrtc/modules/audio_coding/neteq/audio_multi_vector.h"
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-class SyncBuffer : public AudioMultiVector {
- public:
-  SyncBuffer(size_t channels, size_t length)
-      : AudioMultiVector(channels, length),
-        next_index_(length),
-        end_timestamp_(0),
-        dtmf_index_(0) {}
-
-  // Returns the number of samples yet to play out from the buffer.
-  size_t FutureLength() const;
-
-  // Adds the contents of |append_this| to the back of the SyncBuffer. Removes
-  // the same number of samples from the beginning of the SyncBuffer, to
-  // maintain a constant buffer size. The |next_index_| is updated to reflect
-  // the move of the beginning of "future" data.
-  void PushBack(const AudioMultiVector& append_this) override;
-
-  // Adds |length| zeros to the beginning of each channel. Removes
-  // the same number of samples from the end of the SyncBuffer, to
-  // maintain a constant buffer size. The |next_index_| is updated to reflect
-  // the move of the beginning of "future" data.
-  // Note that this operation may delete future samples that are waiting to
-  // be played.
-  void PushFrontZeros(size_t length);
-
-  // Inserts |length| zeros into each channel at index |position|. The size of
-  // the SyncBuffer is kept constant, which means that the last |length|
-  // elements in each channel will be purged.
-  virtual void InsertZerosAtIndex(size_t length, size_t position);
-
-  // Overwrites each channel in this SyncBuffer with values taken from
-  // |insert_this|. The values are taken from the beginning of |insert_this| and
-  // are inserted starting at |position|. |length| values are written into each
-  // channel. The size of the SyncBuffer is kept constant. That is, if |length|
-  // and |position| are selected such that the new data would extend beyond the
-  // end of the current SyncBuffer, the buffer is not extended.
-  // The |next_index_| is not updated.
-  virtual void ReplaceAtIndex(const AudioMultiVector& insert_this,
-                              size_t length,
-                              size_t position);
-
-  // Same as the above method, but where all of |insert_this| is written (with
-  // the same constraints as above, that the SyncBuffer is not extended).
-  virtual void ReplaceAtIndex(const AudioMultiVector& insert_this,
-                              size_t position);
-
-  // Reads |requested_len| samples from each channel and writes them interleaved
-  // into |output|. The |next_index_| is updated to point to the sample to read
-  // next time. The AudioFrame |output| is first reset, and the |data_|,
-  // |num_channels_|, and |samples_per_channel_| fields are updated.
-  void GetNextAudioInterleaved(size_t requested_len, AudioFrame* output);
-
-  // Adds |increment| to |end_timestamp_|.
-  void IncreaseEndTimestamp(uint32_t increment);
-
-  // Flushes the buffer. The buffer will contain only zeros after the flush, and
-  // |next_index_| will point to the end, like when the buffer was first
-  // created.
-  void Flush();
-
-  const AudioVector& Channel(size_t n) const { return *channels_[n]; }
-  AudioVector& Channel(size_t n) { return *channels_[n]; }
-
-  // Accessors and mutators.
-  size_t next_index() const { return next_index_; }
-  void set_next_index(size_t value);
-  uint32_t end_timestamp() const { return end_timestamp_; }
-  void set_end_timestamp(uint32_t value) { end_timestamp_ = value; }
-  size_t dtmf_index() const { return dtmf_index_; }
-  void set_dtmf_index(size_t value);
-
- private:
-  size_t next_index_;
-  uint32_t end_timestamp_;  // The timestamp of the last sample in the buffer.
-  size_t dtmf_index_;  // Index to the first non-DTMF sample in the buffer.
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(SyncBuffer);
-};
-
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_AUDIO_CODING_NETEQ_SYNC_BUFFER_H_
diff --git a/modules/audio_coding/neteq/sync_buffer_unittest.cc b/modules/audio_coding/neteq/sync_buffer_unittest.cc
deleted file mode 100644
index cbf26e0..0000000
--- a/modules/audio_coding/neteq/sync_buffer_unittest.cc
+++ /dev/null
@@ -1,173 +0,0 @@
-/*
- *  Copyright (c) 2012 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/neteq/sync_buffer.h"
-
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-TEST(SyncBuffer, CreateAndDestroy) {
-  // Create a SyncBuffer with two channels and 10 samples each.
-  static const size_t kLen = 10;
-  static const size_t kChannels = 2;
-  SyncBuffer sync_buffer(kChannels, kLen);
-  EXPECT_EQ(kChannels, sync_buffer.Channels());
-  EXPECT_EQ(kLen, sync_buffer.Size());
-  // When the buffer is empty, the next index to play out is at the end.
-  EXPECT_EQ(kLen, sync_buffer.next_index());
-  // Verify that all elements are zero.
-  for (size_t channel = 0; channel < kChannels; ++channel) {
-    for (size_t i = 0; i < kLen; ++i) {
-      EXPECT_EQ(0, sync_buffer[channel][i]);
-    }
-  }
-}
-
-TEST(SyncBuffer, SetNextIndex) {
-  // Create a SyncBuffer with two channels and 100 samples each.
-  static const size_t kLen = 100;
-  static const size_t kChannels = 2;
-  SyncBuffer sync_buffer(kChannels, kLen);
-  sync_buffer.set_next_index(0);
-  EXPECT_EQ(0u, sync_buffer.next_index());
-  sync_buffer.set_next_index(kLen / 2);
-  EXPECT_EQ(kLen / 2, sync_buffer.next_index());
-  sync_buffer.set_next_index(kLen);
-  EXPECT_EQ(kLen, sync_buffer.next_index());
-  // Try to set larger than the buffer size; should cap at buffer size.
-  sync_buffer.set_next_index(kLen + 1);
-  EXPECT_EQ(kLen, sync_buffer.next_index());
-}
-
-TEST(SyncBuffer, PushBackAndFlush) {
-  // Create a SyncBuffer with two channels and 100 samples each.
-  static const size_t kLen = 100;
-  static const size_t kChannels = 2;
-  SyncBuffer sync_buffer(kChannels, kLen);
-  static const size_t kNewLen = 10;
-  AudioMultiVector new_data(kChannels, kNewLen);
-  // Populate |new_data|.
-  for (size_t channel = 0; channel < kChannels; ++channel) {
-    for (size_t i = 0; i < kNewLen; ++i) {
-      new_data[channel][i] = i;
-    }
-  }
-  // Push back |new_data| into |sync_buffer|. This operation should pop out
-  // data from the front of |sync_buffer|, so that the size of the buffer
-  // remains the same. The |next_index_| should also move with the same length.
-  sync_buffer.PushBack(new_data);
-  ASSERT_EQ(kLen, sync_buffer.Size());
-  // Verify that |next_index_| moved accordingly.
-  EXPECT_EQ(kLen - kNewLen, sync_buffer.next_index());
-  // Verify the new contents.
-  for (size_t channel = 0; channel < kChannels; ++channel) {
-    for (size_t i = 0; i < kNewLen; ++i) {
-      EXPECT_EQ(new_data[channel][i],
-                sync_buffer[channel][sync_buffer.next_index() + i]);
-    }
-  }
-
-  // Now flush the buffer, and verify that it is all zeros, and that next_index
-  // points to the end.
-  sync_buffer.Flush();
-  ASSERT_EQ(kLen, sync_buffer.Size());
-  EXPECT_EQ(kLen, sync_buffer.next_index());
-  for (size_t channel = 0; channel < kChannels; ++channel) {
-    for (size_t i = 0; i < kLen; ++i) {
-      EXPECT_EQ(0, sync_buffer[channel][i]);
-    }
-  }
-}
-
-TEST(SyncBuffer, PushFrontZeros) {
-  // Create a SyncBuffer with two channels and 100 samples each.
-  static const size_t kLen = 100;
-  static const size_t kChannels = 2;
-  SyncBuffer sync_buffer(kChannels, kLen);
-  static const size_t kNewLen = 10;
-  AudioMultiVector new_data(kChannels, kNewLen);
-  // Populate |new_data|.
-  for (size_t channel = 0; channel < kChannels; ++channel) {
-    for (size_t i = 0; i < kNewLen; ++i) {
-      new_data[channel][i] = 1000 + i;
-    }
-  }
-  sync_buffer.PushBack(new_data);
-  EXPECT_EQ(kLen, sync_buffer.Size());
-
-  // Push |kNewLen| - 1 zeros into each channel in the front of the SyncBuffer.
-  sync_buffer.PushFrontZeros(kNewLen - 1);
-  EXPECT_EQ(kLen, sync_buffer.Size());  // Size should remain the same.
-  // Verify that |next_index_| moved accordingly. Should be at the end - 1.
-  EXPECT_EQ(kLen - 1, sync_buffer.next_index());
-  // Verify the zeros.
-  for (size_t channel = 0; channel < kChannels; ++channel) {
-    for (size_t i = 0; i < kNewLen - 1; ++i) {
-      EXPECT_EQ(0, sync_buffer[channel][i]);
-    }
-  }
-  // Verify that the correct data is at the end of the SyncBuffer.
-  for (size_t channel = 0; channel < kChannels; ++channel) {
-    EXPECT_EQ(1000, sync_buffer[channel][sync_buffer.next_index()]);
-  }
-}
-
-TEST(SyncBuffer, GetNextAudioInterleaved) {
-  // Create a SyncBuffer with two channels and 100 samples each.
-  static const size_t kLen = 100;
-  static const size_t kChannels = 2;
-  SyncBuffer sync_buffer(kChannels, kLen);
-  static const size_t kNewLen = 10;
-  AudioMultiVector new_data(kChannels, kNewLen);
-  // Populate |new_data|.
-  for (size_t channel = 0; channel < kChannels; ++channel) {
-    for (size_t i = 0; i < kNewLen; ++i) {
-      new_data[channel][i] = i;
-    }
-  }
-  // Push back |new_data| into |sync_buffer|. This operation should pop out
-  // data from the front of |sync_buffer|, so that the size of the buffer
-  // remains the same. The |next_index_| should also move with the same length.
-  sync_buffer.PushBack(new_data);
-
-  // Read to interleaved output. Read in two batches, where each read operation
-  // should automatically update the |net_index_| in the SyncBuffer.
-  // Note that |samples_read| is the number of samples read from each channel.
-  // That is, the number of samples written to |output| is
-  // |samples_read| * |kChannels|.
-  AudioFrame output1;
-  sync_buffer.GetNextAudioInterleaved(kNewLen / 2, &output1);
-  EXPECT_EQ(kChannels, output1.num_channels_);
-  EXPECT_EQ(kNewLen / 2, output1.samples_per_channel_);
-
-  AudioFrame output2;
-  sync_buffer.GetNextAudioInterleaved(kNewLen / 2, &output2);
-  EXPECT_EQ(kChannels, output2.num_channels_);
-  EXPECT_EQ(kNewLen / 2, output2.samples_per_channel_);
-
-  // Verify the data.
-  const int16_t* output_ptr = output1.data();
-  for (size_t i = 0; i < kNewLen / 2; ++i) {
-    for (size_t channel = 0; channel < kChannels; ++channel) {
-      EXPECT_EQ(new_data[channel][i], *output_ptr);
-      ++output_ptr;
-    }
-  }
-  output_ptr = output2.data();
-  for (size_t i = kNewLen / 2; i < kNewLen; ++i) {
-    for (size_t channel = 0; channel < kChannels; ++channel) {
-      EXPECT_EQ(new_data[channel][i], *output_ptr);
-      ++output_ptr;
-    }
-  }
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/neteq/test/NETEQTEST_DummyRTPpacket.cc b/modules/audio_coding/neteq/test/NETEQTEST_DummyRTPpacket.cc
deleted file mode 100644
index 37e215b..0000000
--- a/modules/audio_coding/neteq/test/NETEQTEST_DummyRTPpacket.cc
+++ /dev/null
@@ -1,204 +0,0 @@
-/*
- *  Copyright (c) 2012 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 "NETEQTEST_DummyRTPpacket.h"
-
-#include <assert.h>
-#include <stdio.h>
-#include <string.h>
-
-#ifdef WIN32
-#include <winsock2.h>
-#else
-#include <netinet/in.h> // for htons, htonl, etc
-#endif
-
-int NETEQTEST_DummyRTPpacket::readFromFile(FILE *fp)
-{
-    if (!fp)
-    {
-        return -1;
-    }
-
-    uint16_t length, plen;
-    uint32_t offset;
-    int packetLen = 0;
-
-    bool readNextPacket = true;
-    while (readNextPacket) {
-        readNextPacket = false;
-        if (fread(&length, 2, 1, fp) == 0)
-        {
-            reset();
-            return -2;
-        }
-        length = ntohs(length);
-
-        if (fread(&plen, 2, 1, fp) == 0)
-        {
-            reset();
-            return -1;
-        }
-        packetLen = ntohs(plen);
-
-        if (fread(&offset, 4, 1, fp) == 0)
-        {
-            reset();
-            return -1;
-        }
-        // Store in local variable until we have passed the reset below.
-        uint32_t receiveTime = ntohl(offset);
-
-        // Use length here because a plen of 0 specifies rtcp.
-        length = (uint16_t) (length - _kRDHeaderLen);
-
-        // check buffer size
-        if (_datagram && _memSize < length + 1)
-        {
-            reset();
-        }
-
-        if (!_datagram)
-        {
-            // Add one extra byte, to be able to fake a dummy payload of 1 byte.
-            _datagram = new uint8_t[length + 1];
-            _memSize = length + 1;
-        }
-        memset(_datagram, 0, length + 1);
-
-        if (length == 0)
-        {
-            _datagramLen = 0;
-            _rtpParsed = false;
-            return packetLen;
-        }
-
-        // Read basic header
-        if (fread((unsigned short *) _datagram, 1, _kBasicHeaderLen, fp)
-            != (size_t)_kBasicHeaderLen)
-        {
-            reset();
-            return -1;
-        }
-        _receiveTime = receiveTime;
-        _datagramLen = _kBasicHeaderLen;
-
-        // Parse the basic header
-        webrtc::WebRtcRTPHeader tempRTPinfo;
-        int P, X, CC;
-        parseBasicHeader(&tempRTPinfo, &P, &X, &CC);
-
-        // Check if we have to extend the header
-        if (X != 0 || CC != 0)
-        {
-            int newLen = _kBasicHeaderLen + CC * 4 + X * 4;
-            assert(_memSize >= newLen);
-
-            // Read extension from file
-            size_t readLen = newLen - _kBasicHeaderLen;
-            if (fread(&_datagram[_kBasicHeaderLen], 1, readLen, fp) != readLen)
-            {
-                reset();
-                return -1;
-            }
-            _datagramLen = newLen;
-
-            if (X != 0)
-            {
-                int totHdrLen = calcHeaderLength(X, CC);
-                assert(_memSize >= totHdrLen);
-
-                // Read extension from file
-                size_t readLen = totHdrLen - newLen;
-                if (fread(&_datagram[newLen], 1, readLen, fp) != readLen)
-                {
-                    reset();
-                    return -1;
-                }
-                _datagramLen = totHdrLen;
-            }
-        }
-        _datagramLen = length;
-
-        if (!_blockList.empty() && _blockList.count(payloadType()) > 0)
-        {
-            readNextPacket = true;
-        }
-    }
-
-    _rtpParsed = false;
-    assert(_memSize > _datagramLen);
-    _payloadLen = 1;  // Set the length to 1 byte.
-    return packetLen;
-
-}
-
-int NETEQTEST_DummyRTPpacket::writeToFile(FILE *fp)
-{
-    if (!fp)
-    {
-        return -1;
-    }
-
-    uint16_t length, plen;
-    uint32_t offset;
-
-    // length including RTPplay header
-    length = htons(_datagramLen + _kRDHeaderLen);
-    if (fwrite(&length, 2, 1, fp) != 1)
-    {
-        return -1;
-    }
-
-    // payload length
-    plen = htons(_datagramLen);
-    if (fwrite(&plen, 2, 1, fp) != 1)
-    {
-        return -1;
-    }
-
-    // offset (=receive time)
-    offset = htonl(_receiveTime);
-    if (fwrite(&offset, 4, 1, fp) != 1)
-    {
-        return -1;
-    }
-
-    // Figure out the length of the RTP header.
-    int headerLen;
-    if (_datagramLen == 0)
-    {
-        // No payload at all; we are done writing to file.
-        headerLen = 0;
-    }
-    else
-    {
-        parseHeader();
-        headerLen = _payloadPtr - _datagram;
-        assert(headerLen >= 0);
-    }
-
-    // write RTP header
-    if (fwrite((unsigned short *) _datagram, 1, headerLen, fp) !=
-        static_cast<size_t>(headerLen))
-    {
-        return -1;
-    }
-
-    return (headerLen + _kRDHeaderLen); // total number of bytes written
-
-}
-
-void NETEQTEST_DummyRTPpacket::parseHeader() {
-  NETEQTEST_RTPpacket::parseHeader();
-  // Change _payloadLen to 1 byte. The memory should always be big enough.
-  assert(_memSize > _datagramLen);
-  _payloadLen = 1;
-}
diff --git a/modules/audio_coding/neteq/test/NETEQTEST_DummyRTPpacket.h b/modules/audio_coding/neteq/test/NETEQTEST_DummyRTPpacket.h
deleted file mode 100644
index 1ac6c9a..0000000
--- a/modules/audio_coding/neteq/test/NETEQTEST_DummyRTPpacket.h
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- *  Copyright (c) 2012 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 NETEQTEST_DUMMYRTPPACKET_H
-#define NETEQTEST_DUMMYRTPPACKET_H
-
-#include "NETEQTEST_RTPpacket.h"
-
-class NETEQTEST_DummyRTPpacket : public NETEQTEST_RTPpacket {
- public:
-  int readFromFile(FILE* fp) override;
-  int writeToFile(FILE* fp) override;
-  void parseHeader() override;
-};
-
-#endif  // NETEQTEST_DUMMYRTPPACKET_H
diff --git a/modules/audio_coding/neteq/test/NETEQTEST_RTPpacket.cc b/modules/audio_coding/neteq/test/NETEQTEST_RTPpacket.cc
deleted file mode 100644
index 3d44fbc..0000000
--- a/modules/audio_coding/neteq/test/NETEQTEST_RTPpacket.cc
+++ /dev/null
@@ -1,851 +0,0 @@
-/*
- *  Copyright (c) 2012 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 "NETEQTEST_RTPpacket.h"
-
-#include <assert.h>
-#include <stdlib.h>  // rand
-#include <string.h>
-
-#ifdef WIN32
-#include <winsock2.h>
-#else
-#include <netinet/in.h> // for htons, htonl, etc
-#endif
-
-const int NETEQTEST_RTPpacket::_kRDHeaderLen = 8;
-const int NETEQTEST_RTPpacket::_kBasicHeaderLen = 12;
-
-NETEQTEST_RTPpacket::NETEQTEST_RTPpacket()
-:
-_datagram(NULL),
-_payloadPtr(NULL),
-_memSize(0),
-_datagramLen(-1),
-_payloadLen(0),
-_rtpParsed(false),
-_receiveTime(0),
-_lost(false)
-{
-    memset(&_rtpInfo, 0, sizeof(_rtpInfo));
-    _blockList.clear();
-}
-
-NETEQTEST_RTPpacket::~NETEQTEST_RTPpacket()
-{
-    if(_datagram)
-    {
-        delete [] _datagram;
-    }
-}
-
-void NETEQTEST_RTPpacket::reset()
-{
-    if(_datagram) {
-        delete [] _datagram;
-    }
-    _datagram = NULL;
-    _memSize = 0;
-    _datagramLen = -1;
-    _payloadLen = 0;
-    _payloadPtr = NULL;
-    _receiveTime = 0;
-    memset(&_rtpInfo, 0, sizeof(_rtpInfo));
-    _rtpParsed = false;
-
-}
-
-int NETEQTEST_RTPpacket::skipFileHeader(FILE *fp)
-{
-    if (!fp) {
-        return -1;
-    }
-
-    const int kFirstLineLength = 40;
-    char firstline[kFirstLineLength];
-    if (fgets(firstline, kFirstLineLength, fp) == NULL) {
-        return -1;
-    }
-    if (strncmp(firstline, "#!rtpplay", 9) == 0) {
-        if (strncmp(firstline, "#!rtpplay1.0", 12) != 0) {
-            return -1;
-        }
-    }
-    else if (strncmp(firstline, "#!RTPencode", 11) == 0) {
-        if (strncmp(firstline, "#!RTPencode1.0", 14) != 0) {
-            return -1;
-        }
-    }
-    else
-    {
-        return -1;
-    }
-
-    const int kRtpDumpHeaderSize = 4 + 4 + 4 + 2 + 2;
-    if (fseek(fp, kRtpDumpHeaderSize, SEEK_CUR) != 0)
-    {
-        return -1;
-    }
-    return 0;
-}
-
-int NETEQTEST_RTPpacket::readFromFile(FILE *fp)
-{
-    if(!fp)
-    {
-        return(-1);
-    }
-
-    uint16_t length, plen;
-    uint32_t offset;
-    int packetLen = 0;
-
-    bool readNextPacket = true;
-    while (readNextPacket) {
-        readNextPacket = false;
-        if (fread(&length,2,1,fp)==0)
-        {
-            reset();
-            return(-2);
-        }
-        length = ntohs(length);
-
-        if (fread(&plen,2,1,fp)==0)
-        {
-            reset();
-            return(-1);
-        }
-        packetLen = ntohs(plen);
-
-        if (fread(&offset,4,1,fp)==0)
-        {
-            reset();
-            return(-1);
-        }
-        // store in local variable until we have passed the reset below
-        uint32_t receiveTime = ntohl(offset);
-
-        // Use length here because a plen of 0 specifies rtcp
-        length = (uint16_t) (length - _kRDHeaderLen);
-
-        // check buffer size
-        if (_datagram && _memSize < length)
-        {
-            reset();
-        }
-
-        if (!_datagram)
-        {
-            _datagram = new uint8_t[length];
-            _memSize = length;
-        }
-
-        if (fread((unsigned short *) _datagram,1,length,fp) != length)
-        {
-            reset();
-            return(-1);
-        }
-
-        _datagramLen = length;
-        _receiveTime = receiveTime;
-
-        if (!_blockList.empty() && _blockList.count(payloadType()) > 0)
-        {
-            readNextPacket = true;
-        }
-    }
-
-    _rtpParsed = false;
-    return(packetLen);
-
-}
-
-
-int NETEQTEST_RTPpacket::readFixedFromFile(FILE *fp, size_t length)
-{
-    if (!fp)
-    {
-        return -1;
-    }
-
-    // check buffer size
-    if (_datagram && _memSize < static_cast<int>(length))
-    {
-        reset();
-    }
-
-    if (!_datagram)
-    {
-        _datagram = new uint8_t[length];
-        _memSize = length;
-    }
-
-    if (fread(_datagram, 1, length, fp) != length)
-    {
-        reset();
-        return -1;
-    }
-
-    _datagramLen = length;
-    _receiveTime = 0;
-
-    if (!_blockList.empty() && _blockList.count(payloadType()) > 0)
-    {
-        // discard this payload
-        return readFromFile(fp);
-    }
-
-    _rtpParsed = false;
-    return length;
-
-}
-
-
-int NETEQTEST_RTPpacket::writeToFile(FILE *fp)
-{
-    if (!fp)
-    {
-        return -1;
-    }
-
-    uint16_t length, plen;
-    uint32_t offset;
-
-    // length including RTPplay header
-    length = htons(_datagramLen + _kRDHeaderLen);
-    if (fwrite(&length, 2, 1, fp) != 1)
-    {
-        return -1;
-    }
-
-    // payload length
-    plen = htons(_datagramLen);
-    if (fwrite(&plen, 2, 1, fp) != 1)
-    {
-        return -1;
-    }
-
-    // offset (=receive time)
-    offset = htonl(_receiveTime);
-    if (fwrite(&offset, 4, 1, fp) != 1)
-    {
-        return -1;
-    }
-
-
-    // write packet data
-    if (fwrite(_datagram, 1, _datagramLen, fp) !=
-            static_cast<size_t>(_datagramLen))
-    {
-        return -1;
-    }
-
-    return _datagramLen + _kRDHeaderLen; // total number of bytes written
-
-}
-
-
-void NETEQTEST_RTPpacket::blockPT(uint8_t pt)
-{
-    _blockList[pt] = true;
-}
-
-
-void NETEQTEST_RTPpacket::parseHeader()
-{
-    if (_rtpParsed)
-    {
-        // nothing to do
-        return;
-    }
-
-    if (_datagramLen < _kBasicHeaderLen)
-    {
-        // corrupt packet?
-        return;
-    }
-
-    _payloadLen = parseRTPheader(&_payloadPtr);
-
-    _rtpParsed = true;
-
-    return;
-
-}
-
-void NETEQTEST_RTPpacket::parseHeader(webrtc::WebRtcRTPHeader* rtp_header) {
-  if (!_rtpParsed) {
-    parseHeader();
-  }
-  if (rtp_header) {
-    rtp_header->header.markerBit = _rtpInfo.header.markerBit;
-    rtp_header->header.payloadType = _rtpInfo.header.payloadType;
-    rtp_header->header.sequenceNumber = _rtpInfo.header.sequenceNumber;
-    rtp_header->header.timestamp = _rtpInfo.header.timestamp;
-    rtp_header->header.ssrc = _rtpInfo.header.ssrc;
-  }
-}
-
-const webrtc::WebRtcRTPHeader* NETEQTEST_RTPpacket::RTPinfo() const
-{
-    if (_rtpParsed)
-    {
-        return &_rtpInfo;
-    }
-    else
-    {
-        return NULL;
-    }
-}
-
-uint8_t * NETEQTEST_RTPpacket::datagram() const
-{
-    if (_datagramLen > 0)
-    {
-        return _datagram;
-    }
-    else
-    {
-        return NULL;
-    }
-}
-
-uint8_t * NETEQTEST_RTPpacket::payload() const
-{
-    if (_payloadLen > 0)
-    {
-        return _payloadPtr;
-    }
-    else
-    {
-        return NULL;
-    }
-}
-
-size_t NETEQTEST_RTPpacket::payloadLen()
-{
-    parseHeader();
-    return _payloadLen;
-}
-
-int16_t NETEQTEST_RTPpacket::dataLen() const
-{
-    return _datagramLen;
-}
-
-bool NETEQTEST_RTPpacket::isParsed() const
-{
-    return _rtpParsed;
-}
-
-bool NETEQTEST_RTPpacket::isLost() const
-{
-    return _lost;
-}
-
-uint8_t  NETEQTEST_RTPpacket::payloadType() const
-{
-    if(_datagram && _datagramLen >= _kBasicHeaderLen)
-    {
-        webrtc::WebRtcRTPHeader tempRTPinfo;
-        parseRTPheader(&tempRTPinfo);
-        return tempRTPinfo.header.payloadType;
-    }
-    else
-    {
-        return 0;
-    }
-}
-
-uint16_t NETEQTEST_RTPpacket::sequenceNumber() const
-{
-    if(_datagram && _datagramLen >= _kBasicHeaderLen)
-    {
-        webrtc::WebRtcRTPHeader tempRTPinfo;
-        parseRTPheader(&tempRTPinfo);
-        return tempRTPinfo.header.sequenceNumber;
-    }
-    else
-    {
-        return 0;
-    }
-}
-
-uint32_t NETEQTEST_RTPpacket::timeStamp() const
-{
-    if(_datagram && _datagramLen >= _kBasicHeaderLen)
-    {
-        webrtc::WebRtcRTPHeader tempRTPinfo;
-        parseRTPheader(&tempRTPinfo);
-        return tempRTPinfo.header.timestamp;
-    }
-    else
-    {
-        return 0;
-    }
-}
-
-uint32_t NETEQTEST_RTPpacket::SSRC() const
-{
-    if(_datagram && _datagramLen >= _kBasicHeaderLen)
-    {
-        webrtc::WebRtcRTPHeader tempRTPinfo;
-        parseRTPheader(&tempRTPinfo);
-        return tempRTPinfo.header.ssrc;
-    }
-    else
-    {
-        return 0;
-    }
-}
-
-uint8_t  NETEQTEST_RTPpacket::markerBit() const
-{
-    if(_datagram && _datagramLen >= _kBasicHeaderLen)
-    {
-        webrtc::WebRtcRTPHeader tempRTPinfo;
-        parseRTPheader(&tempRTPinfo);
-        return tempRTPinfo.header.markerBit;
-    }
-    else
-    {
-        return 0;
-    }
-}
-
-
-
-int NETEQTEST_RTPpacket::setPayloadType(uint8_t pt)
-{
-
-    if (_datagramLen < 12)
-    {
-        return -1;
-    }
-
-    if (!_rtpParsed)
-    {
-        _rtpInfo.header.payloadType = pt;
-    }
-
-    _datagram[1] = pt;
-
-    return 0;
-
-}
-
-int NETEQTEST_RTPpacket::setSequenceNumber(uint16_t sn)
-{
-
-    if (_datagramLen < 12)
-    {
-        return -1;
-    }
-
-    if (!_rtpParsed)
-    {
-        _rtpInfo.header.sequenceNumber = sn;
-    }
-
-    _datagram[2]=(unsigned char)((sn>>8)&0xFF);
-    _datagram[3]=(unsigned char)((sn)&0xFF);
-
-    return 0;
-
-}
-
-int NETEQTEST_RTPpacket::setTimeStamp(uint32_t ts)
-{
-
-    if (_datagramLen < 12)
-    {
-        return -1;
-    }
-
-    if (!_rtpParsed)
-    {
-        _rtpInfo.header.timestamp = ts;
-    }
-
-    _datagram[4]=(unsigned char)((ts>>24)&0xFF);
-    _datagram[5]=(unsigned char)((ts>>16)&0xFF);
-    _datagram[6]=(unsigned char)((ts>>8)&0xFF);
-    _datagram[7]=(unsigned char)(ts & 0xFF);
-
-    return 0;
-
-}
-
-int NETEQTEST_RTPpacket::setSSRC(uint32_t ssrc)
-{
-
-    if (_datagramLen < 12)
-    {
-        return -1;
-    }
-
-    if (!_rtpParsed)
-    {
-        _rtpInfo.header.ssrc = ssrc;
-    }
-
-    _datagram[8]=(unsigned char)((ssrc>>24)&0xFF);
-    _datagram[9]=(unsigned char)((ssrc>>16)&0xFF);
-    _datagram[10]=(unsigned char)((ssrc>>8)&0xFF);
-    _datagram[11]=(unsigned char)(ssrc & 0xFF);
-
-    return 0;
-
-}
-
-int NETEQTEST_RTPpacket::setMarkerBit(uint8_t mb)
-{
-
-    if (_datagramLen < 12)
-    {
-        return -1;
-    }
-
-    if (_rtpParsed)
-    {
-        _rtpInfo.header.markerBit = mb;
-    }
-
-    if (mb)
-    {
-        _datagram[0] |= 0x01;
-    }
-    else
-    {
-        _datagram[0] &= 0xFE;
-    }
-
-    return 0;
-
-}
-
-int NETEQTEST_RTPpacket::setRTPheader(const webrtc::WebRtcRTPHeader* RTPinfo)
-{
-    if (_datagramLen < 12)
-    {
-        // this packet is not ok
-        return -1;
-    }
-
-    makeRTPheader(_datagram,
-        RTPinfo->header.payloadType,
-        RTPinfo->header.sequenceNumber,
-        RTPinfo->header.timestamp,
-        RTPinfo->header.ssrc,
-        RTPinfo->header.markerBit);
-
-    return 0;
-}
-
-
-int NETEQTEST_RTPpacket::splitStereo(NETEQTEST_RTPpacket* slaveRtp,
-                                     enum stereoModes mode)
-{
-    // if mono, do nothing
-    if (mode == stereoModeMono)
-    {
-        return 0;
-    }
-
-    // check that the RTP header info is parsed
-    parseHeader();
-
-    // start by copying the main rtp packet
-    *slaveRtp = *this;
-
-    if(_payloadLen == 0)
-    {
-        // do no more
-        return 0;
-    }
-
-    if(_payloadLen%2 != 0)
-    {
-        // length must be a factor of 2
-        return -1;
-    }
-
-    switch(mode)
-    {
-    case stereoModeSample1:
-        {
-            // sample based codec with 1-byte samples
-            splitStereoSample(slaveRtp, 1 /* 1 byte/sample */);
-            break;
-        }
-    case stereoModeSample2:
-        {
-            // sample based codec with 2-byte samples
-            splitStereoSample(slaveRtp, 2 /* 2 bytes/sample */);
-            break;
-        }
-    case stereoModeFrame:
-        {
-            // frame based codec
-            splitStereoFrame(slaveRtp);
-            break;
-        }
-    case stereoModeDuplicate:
-        {
-            // frame based codec, send the whole packet to both master and slave
-            splitStereoDouble(slaveRtp);
-            break;
-        }
-    case stereoModeMono:
-        {
-            assert(false);
-            return -1;
-        }
-    }
-
-    return 0;
-}
-
-
-void NETEQTEST_RTPpacket::makeRTPheader(unsigned char* rtp_data,
-                                        uint8_t payloadType,
-                                        uint16_t seqNo,
-                                        uint32_t timestamp,
-                                        uint32_t ssrc,
-                                        uint8_t markerBit) const
-{
-    rtp_data[0] = markerBit ? 0x81 : 0x80;
-    rtp_data[1] = payloadType;
-    rtp_data[2] = seqNo >> 8;
-    rtp_data[3] = seqNo & 0xFF;
-    rtp_data[4] = timestamp >> 24;
-    rtp_data[5] = (timestamp >> 16) & 0xFF;
-    rtp_data[6] = (timestamp >> 8) & 0xFF;
-    rtp_data[7] = timestamp & 0xFF;
-    rtp_data[8] = ssrc >> 24;
-    rtp_data[9] = (ssrc >> 16) & 0xFF;
-    rtp_data[10] = (ssrc >> 8) & 0xFF;
-    rtp_data[11] = ssrc & 0xFF;
-}
-
-uint16_t NETEQTEST_RTPpacket::parseRTPheader(webrtc::WebRtcRTPHeader* RTPinfo,
-                                             uint8_t **payloadPtr) const
-{
-    uint16_t* rtp_data = reinterpret_cast<uint16_t*>(_datagram);
-    int i_P, i_X, i_CC;
-
-    assert(_datagramLen >= 12);
-    parseBasicHeader(RTPinfo, &i_P, &i_X, &i_CC);
-
-    int i_startPosition = calcHeaderLength(i_X, i_CC);
-
-    int i_padlength = calcPadLength(i_P);
-
-    if (payloadPtr)
-    {
-        *payloadPtr =
-            reinterpret_cast<uint8_t*>(&rtp_data[i_startPosition >> 1]);
-    }
-
-    return static_cast<uint16_t>(_datagramLen - i_startPosition - i_padlength);
-}
-
-
-void NETEQTEST_RTPpacket::parseBasicHeader(webrtc::WebRtcRTPHeader* RTPinfo,
-                                           int *i_P, int *i_X, int *i_CC) const
-{
-    uint16_t* rtp_data = reinterpret_cast<uint16_t*>(_datagram);
-    if (_datagramLen < 12)
-    {
-        assert(false);
-        return;
-    }
-
-    *i_P = (rtp_data[0] >> 5) & 0x01;
-    *i_X = (rtp_data[0] >> 4) & 0x01;
-    *i_CC = rtp_data[0] & 0xF;
-    RTPinfo->header.markerBit = (rtp_data[0] >> 15) & 0x01;
-    RTPinfo->header.payloadType = (rtp_data[0] >> 8) & 0x7F;
-    RTPinfo->header.sequenceNumber =
-        (rtp_data[1] >> 8) | ((rtp_data[1] & 0xFF) << 8);
-    RTPinfo->header.timestamp =
-        ((rtp_data[2] & 0xFF) << 24) | ((rtp_data[2] & 0xFF00) << 8) |
-        (rtp_data[3] >> 8) | ((rtp_data[3] & 0xFF) << 8);
-    RTPinfo->header.ssrc =
-        ((rtp_data[4] & 0xFF) << 24) | ((rtp_data[4] & 0xFF00) << 8) |
-        (rtp_data[5] >> 8) | ((rtp_data[5] & 0xFF) << 8);
-}
-
-int NETEQTEST_RTPpacket::calcHeaderLength(int i_X, int i_CC) const
-{
-    int i_extlength = 0;
-    uint16_t* rtp_data = reinterpret_cast<uint16_t*>(_datagram);
-
-    if (i_X == 1)
-    {
-        // Extension header exists.
-        // Find out how many int32_t it consists of.
-        int offset = 7 + 2 * i_CC;
-        assert(_datagramLen > 2 * offset);
-        if (_datagramLen > 2 * offset)
-        {
-            i_extlength = 1 +
-                (((rtp_data[offset]) >> 8) | ((rtp_data[offset] & 0xFF) << 8));
-        }
-    }
-
-    return 12 + 4 * i_extlength + 4 * i_CC;
-}
-
-int NETEQTEST_RTPpacket::calcPadLength(int i_P) const
-{
-    uint16_t* rtp_data = reinterpret_cast<uint16_t*>(_datagram);
-    if (i_P == 1)
-    {
-        /* Padding exists. Find out how many bytes the padding consists of. */
-        if (_datagramLen & 0x1)
-        {
-            /* odd number of bytes => last byte in higher byte */
-            return rtp_data[_datagramLen >> 1] & 0xFF;
-        }
-        else
-        {
-            /* even number of bytes => last byte in lower byte */
-            return rtp_data[(_datagramLen >> 1) - 1] >> 8;
-        }
-    }
-    return 0;
-}
-
-void NETEQTEST_RTPpacket::splitStereoSample(NETEQTEST_RTPpacket* slaveRtp,
-                                            int stride)
-{
-    if(!_payloadPtr || !slaveRtp || !slaveRtp->_payloadPtr
-        || _payloadLen == 0 || slaveRtp->_memSize < _memSize)
-    {
-        return;
-    }
-
-    uint8_t *readDataPtr = _payloadPtr;
-    uint8_t *writeDataPtr = _payloadPtr;
-    uint8_t *slaveData = slaveRtp->_payloadPtr;
-
-    while (readDataPtr - _payloadPtr < static_cast<ptrdiff_t>(_payloadLen))
-    {
-        // master data
-        for (int ix = 0; ix < stride; ix++) {
-            *writeDataPtr = *readDataPtr;
-            writeDataPtr++;
-            readDataPtr++;
-        }
-
-        // slave data
-        for (int ix = 0; ix < stride; ix++) {
-            *slaveData = *readDataPtr;
-            slaveData++;
-            readDataPtr++;
-        }
-    }
-
-    _payloadLen /= 2;
-    slaveRtp->_payloadLen = _payloadLen;
-}
-
-
-void NETEQTEST_RTPpacket::splitStereoFrame(NETEQTEST_RTPpacket* slaveRtp)
-{
-    if(!_payloadPtr || !slaveRtp || !slaveRtp->_payloadPtr
-        || _payloadLen == 0 || slaveRtp->_memSize < _memSize)
-    {
-        return;
-    }
-
-    memmove(slaveRtp->_payloadPtr, _payloadPtr + _payloadLen/2, _payloadLen/2);
-
-    _payloadLen /= 2;
-    slaveRtp->_payloadLen = _payloadLen;
-}
-void NETEQTEST_RTPpacket::splitStereoDouble(NETEQTEST_RTPpacket* slaveRtp)
-{
-    if(!_payloadPtr || !slaveRtp || !slaveRtp->_payloadPtr
-        || _payloadLen == 0 || slaveRtp->_memSize < _memSize)
-    {
-        return;
-    }
-
-    memcpy(slaveRtp->_payloadPtr, _payloadPtr, _payloadLen);
-    slaveRtp->_payloadLen = _payloadLen;
-}
-
-// Get the RTP header for the RED payload indicated by argument index.
-// The first RED payload is index = 0.
-int NETEQTEST_RTPpacket::extractRED(int index, webrtc::WebRtcRTPHeader& red)
-{
-//
-//  0                   1                    2                   3
-//  0 1 2 3 4 5 6 7 8 9 0 1 2 3  4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
-// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-// |1|   block PT  |  timestamp offset         |   block length    |
-// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-// |1|    ...                                                      |
-// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-// |0|   block PT  |
-// +-+-+-+-+-+-+-+-+
-//
-
-    parseHeader();
-
-    uint8_t* ptr = payload();
-    uint8_t* payloadEndPtr = ptr + payloadLen();
-    int num_encodings = 0;
-    int total_len = 0;
-
-    while ((ptr < payloadEndPtr) && (*ptr & 0x80))
-    {
-        int len = ((ptr[2] & 0x03) << 8) + ptr[3];
-        if (num_encodings == index)
-        {
-            // Header found.
-            red.header.payloadType = ptr[0] & 0x7F;
-            uint32_t offset = (ptr[1] << 6) + (ptr[2] >> 2);
-            red.header.sequenceNumber = sequenceNumber();
-            red.header.timestamp = timeStamp() - offset;
-            red.header.markerBit = markerBit();
-            red.header.ssrc = SSRC();
-            return len;
-        }
-        ++num_encodings;
-        total_len += len;
-        ptr += 4;
-    }
-    if ((ptr < payloadEndPtr) && (num_encodings == index))
-    {
-        // Last header.
-        red.header.payloadType = ptr[0] & 0x7F;
-        red.header.sequenceNumber = sequenceNumber();
-        red.header.timestamp = timeStamp();
-        red.header.markerBit = markerBit();
-        red.header.ssrc = SSRC();
-        ++ptr;
-        return payloadLen() - (ptr - payload()) - total_len;
-    }
-    return -1;
-}
-
-// Randomize the payload, not the RTP header.
-void NETEQTEST_RTPpacket::scramblePayload(void)
-{
-    parseHeader();
-
-    for (size_t i = 0; i < _payloadLen; ++i)
-    {
-        _payloadPtr[i] = static_cast<uint8_t>(rand());
-    }
-}
diff --git a/modules/audio_coding/neteq/test/NETEQTEST_RTPpacket.h b/modules/audio_coding/neteq/test/NETEQTEST_RTPpacket.h
deleted file mode 100644
index 56ed72f..0000000
--- a/modules/audio_coding/neteq/test/NETEQTEST_RTPpacket.h
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- *  Copyright (c) 2012 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 NETEQTEST_RTPPACKET_H
-#define NETEQTEST_RTPPACKET_H
-
-#include <map>
-#include <stdio.h>
-#include "webrtc/typedefs.h"
-#include "webrtc/modules/include/module_common_types.h"
-
-enum stereoModes {
-    stereoModeMono,
-    stereoModeSample1,
-    stereoModeSample2,
-    stereoModeFrame,
-    stereoModeDuplicate
-};
-
-class NETEQTEST_RTPpacket
-{
-public:
-    NETEQTEST_RTPpacket();
-    bool operator !() const { return (dataLen() < 0); };
-    virtual ~NETEQTEST_RTPpacket();
-    void reset();
-    static int skipFileHeader(FILE *fp);
-    virtual int readFromFile(FILE *fp);
-    int readFixedFromFile(FILE *fp, size_t len);
-    virtual int writeToFile(FILE *fp);
-    void blockPT(uint8_t pt);
-    virtual void parseHeader();
-    void parseHeader(webrtc::WebRtcRTPHeader* rtp_header);
-    const webrtc::WebRtcRTPHeader* RTPinfo() const;
-    uint8_t * datagram() const;
-    uint8_t * payload() const;
-    size_t payloadLen();
-    int16_t dataLen() const;
-    bool isParsed() const;
-    bool isLost() const;
-    uint32_t time() const { return _receiveTime; };
-
-    uint8_t  payloadType() const;
-    uint16_t sequenceNumber() const;
-    uint32_t timeStamp() const;
-    uint32_t SSRC() const;
-    uint8_t  markerBit() const;
-
-    int setPayloadType(uint8_t pt);
-    int setSequenceNumber(uint16_t sn);
-    int setTimeStamp(uint32_t ts);
-    int setSSRC(uint32_t ssrc);
-    int setMarkerBit(uint8_t mb);
-    void setTime(uint32_t receiveTime) { _receiveTime = receiveTime; };
-
-    int setRTPheader(const webrtc::WebRtcRTPHeader* RTPinfo);
-
-    int splitStereo(NETEQTEST_RTPpacket* slaveRtp, enum stereoModes mode);
-
-    int extractRED(int index, webrtc::WebRtcRTPHeader& red);
-
-    void scramblePayload(void);
-
-    uint8_t *       _datagram;
-    uint8_t *       _payloadPtr;
-    int                 _memSize;
-    int16_t         _datagramLen;
-    size_t          _payloadLen;
-    webrtc::WebRtcRTPHeader _rtpInfo;
-    bool                _rtpParsed;
-    uint32_t        _receiveTime;
-    bool                _lost;
-    std::map<uint8_t, bool> _blockList;
-
-protected:
-    static const int _kRDHeaderLen;
-    static const int _kBasicHeaderLen;
-
-    void parseBasicHeader(webrtc::WebRtcRTPHeader* RTPinfo, int *i_P, int *i_X,
-                          int *i_CC) const;
-    int calcHeaderLength(int i_X, int i_CC) const;
-
-private:
-    void makeRTPheader(unsigned char* rtp_data, uint8_t payloadType,
-                       uint16_t seqNo, uint32_t timestamp,
-                       uint32_t ssrc, uint8_t markerBit) const;
-    uint16_t parseRTPheader(webrtc::WebRtcRTPHeader* RTPinfo,
-                            uint8_t **payloadPtr = NULL) const;
-    uint16_t parseRTPheader(uint8_t **payloadPtr = NULL)
-        { return parseRTPheader(&_rtpInfo, payloadPtr);};
-    int calcPadLength(int i_P) const;
-    void splitStereoSample(NETEQTEST_RTPpacket* slaveRtp, int stride);
-    void splitStereoFrame(NETEQTEST_RTPpacket* slaveRtp);
-    void splitStereoDouble(NETEQTEST_RTPpacket* slaveRtp);
-};
-
-#endif //NETEQTEST_RTPPACKET_H
diff --git a/modules/audio_coding/neteq/test/PayloadTypes.h b/modules/audio_coding/neteq/test/PayloadTypes.h
deleted file mode 100644
index 266595c..0000000
--- a/modules/audio_coding/neteq/test/PayloadTypes.h
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- *  Copyright (c) 2012 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.
- */
-
-/* PayloadTypes.h */
-/* Used by RTPencode application */
-// TODO(henrik.lundin) Remove this once RTPencode is refactored.
-
-/* RTP defined codepoints */
-#define NETEQ_CODEC_PCMU_PT				0
-#define NETEQ_CODEC_PCMA_PT				8
-#define NETEQ_CODEC_G722_PT				9
-#define NETEQ_CODEC_CN_PT				13
-
-/* Dynamic RTP codepoints */
-#define NETEQ_CODEC_ILBC_PT				102
-#define NETEQ_CODEC_ISAC_PT				103
-#define NETEQ_CODEC_ISACSWB_PT			104
-#define NETEQ_CODEC_AVT_PT				106
-#define NETEQ_CODEC_OPUS_PT             111
-#define NETEQ_CODEC_RED_PT				117
-#define NETEQ_CODEC_CN_WB_PT			105
-#define NETEQ_CODEC_CN_SWB_PT           126
-#define NETEQ_CODEC_PCM16B_PT			93
-#define NETEQ_CODEC_PCM16B_WB_PT		94
-#define NETEQ_CODEC_PCM16B_SWB32KHZ_PT	95
-#define NETEQ_CODEC_PCM16B_SWB48KHZ_PT	96
diff --git a/modules/audio_coding/neteq/test/RTPchange.cc b/modules/audio_coding/neteq/test/RTPchange.cc
deleted file mode 100644
index 54395c0..0000000
--- a/modules/audio_coding/neteq/test/RTPchange.cc
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- *  Copyright (c) 2012 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 <stdio.h>
-
-#include <algorithm>
-#include <vector>
-
-#include "webrtc/modules/audio_coding/neteq/test/NETEQTEST_DummyRTPpacket.h"
-#include "webrtc/modules/audio_coding/neteq/test/NETEQTEST_RTPpacket.h"
-
-#define FIRSTLINELEN 40
-//#define WEBRTC_DUMMY_RTP
-
-static bool pktCmp(NETEQTEST_RTPpacket *a, NETEQTEST_RTPpacket *b) {
-  return (a->time() < b->time());
-}
-
-int main(int argc, char* argv[]) {
-  FILE* in_file = fopen(argv[1], "rb");
-  if (!in_file) {
-    printf("Cannot open input file %s\n", argv[1]);
-    return -1;
-  }
-  printf("Input RTP file: %s\n", argv[1]);
-
-  FILE* stat_file = fopen(argv[2], "rt");
-  if (!stat_file) {
-    printf("Cannot open timing file %s\n", argv[2]);
-    return -1;
-  }
-  printf("Timing file: %s\n", argv[2]);
-
-  FILE* out_file = fopen(argv[3], "wb");
-  if (!out_file) {
-    printf("Cannot open output file %s\n", argv[3]);
-    return -1;
-  }
-  printf("Output RTP file: %s\n\n", argv[3]);
-
-  // Read all statistics and insert into map.
-  // Read first line.
-  char temp_str[100];
-  if (fgets(temp_str, 100, stat_file) == NULL) {
-    printf("Failed to read timing file %s\n", argv[2]);
-    return -1;
-  }
-  // Define map.
-  std::map<std::pair<uint16_t, uint32_t>, uint32_t> packet_stats;
-  uint16_t seq_no;
-  uint32_t ts;
-  uint32_t send_time;
-
-  while (fscanf(stat_file,
-                "%hu %u %u %*i %*i\n", &seq_no, &ts, &send_time) == 3) {
-    std::pair<uint16_t, uint32_t>
-        temp_pair = std::pair<uint16_t, uint32_t>(seq_no, ts);
-
-    packet_stats[temp_pair] = send_time;
-  }
-
-  fclose(stat_file);
-
-  // Read file header and write directly to output file.
-  char first_line[FIRSTLINELEN];
-  if (fgets(first_line, FIRSTLINELEN, in_file) == NULL) {
-    printf("Failed to read first line of input file %s\n", argv[1]);
-    return -1;
-  }
-  fputs(first_line, out_file);
-  // start_sec + start_usec + source + port + padding
-  const unsigned int kRtpDumpHeaderSize = 4 + 4 + 4 + 2 + 2;
-  if (fread(first_line, 1, kRtpDumpHeaderSize, in_file)
-      != kRtpDumpHeaderSize) {
-    printf("Failed to read RTP dump header from input file %s\n", argv[1]);
-    return -1;
-  }
-  if (fwrite(first_line, 1, kRtpDumpHeaderSize, out_file)
-      != kRtpDumpHeaderSize) {
-    printf("Failed to write RTP dump header to output file %s\n", argv[3]);
-    return -1;
-  }
-
-  std::vector<NETEQTEST_RTPpacket *> packet_vec;
-
-  while (1) {
-    // Insert in vector.
-#ifdef WEBRTC_DUMMY_RTP
-    NETEQTEST_RTPpacket *new_packet = new NETEQTEST_DummyRTPpacket();
-#else
-    NETEQTEST_RTPpacket *new_packet = new NETEQTEST_RTPpacket();
-#endif
-    if (new_packet->readFromFile(in_file) < 0) {
-      // End of file.
-      break;
-    }
-
-    // Look for new send time in statistics vector.
-    std::pair<uint16_t, uint32_t> temp_pair =
-        std::pair<uint16_t, uint32_t>(new_packet->sequenceNumber(),
-                                      new_packet->timeStamp());
-
-    uint32_t new_send_time = packet_stats[temp_pair];
-    new_packet->setTime(new_send_time);  // Set new send time.
-    packet_vec.push_back(new_packet);  // Insert in vector.
-  }
-
-  // Sort the vector according to send times.
-  std::sort(packet_vec.begin(), packet_vec.end(), pktCmp);
-
-  std::vector<NETEQTEST_RTPpacket *>::iterator it;
-  for (it = packet_vec.begin(); it != packet_vec.end(); it++) {
-    // Write to out file.
-    if ((*it)->writeToFile(out_file) < 0) {
-      printf("Error writing to file\n");
-      return -1;
-    }
-    // Delete packet.
-    delete *it;
-  }
-
-  fclose(in_file);
-  fclose(out_file);
-
-  return 0;
-}
diff --git a/modules/audio_coding/neteq/test/RTPencode.cc b/modules/audio_coding/neteq/test/RTPencode.cc
deleted file mode 100644
index 8ad5090..0000000
--- a/modules/audio_coding/neteq/test/RTPencode.cc
+++ /dev/null
@@ -1,1798 +0,0 @@
-/*
- *  Copyright (c) 2012 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.
- */
-
-// TODO(henrik.lundin): Refactor or replace all of this application.
-
-/* header includes */
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#ifdef WIN32
-#include <winsock2.h>
-#endif
-#ifdef WEBRTC_LINUX
-#include <netinet/in.h>
-#endif
-
-#include <assert.h>
-
-#include <algorithm>
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/typedefs.h"
-
-// needed for NetEqDecoder
-#include "webrtc/modules/audio_coding/neteq/audio_decoder_impl.h"
-#include "webrtc/modules/audio_coding/neteq/include/neteq.h"
-
-/************************/
-/* Define payload types */
-/************************/
-
-#include "PayloadTypes.h"
-
-namespace {
-const size_t kRtpDataSize = 8000;
-}
-
-/*********************/
-/* Misc. definitions */
-/*********************/
-
-#define STOPSENDTIME 3000
-#define RESTARTSENDTIME 0  // 162500
-#define FIRSTLINELEN 40
-#define CHECK_NOT_NULL(a)                                                \
-  if ((a) == 0) {                                                        \
-    printf("\n %s \n line: %d \nerror at %s\n", __FILE__, __LINE__, #a); \
-    return (-1);                                                         \
-  }
-
-//#define MULTIPLE_SAME_TIMESTAMP
-#define REPEAT_PACKET_DISTANCE 17
-#define REPEAT_PACKET_COUNT 1  // number of extra packets to send
-
-//#define INSERT_OLD_PACKETS
-#define OLD_PACKET 5  // how many seconds too old should the packet be?
-
-//#define TIMESTAMP_WRAPAROUND
-
-//#define RANDOM_DATA
-//#define RANDOM_PAYLOAD_DATA
-#define RANDOM_SEED 10
-
-//#define INSERT_DTMF_PACKETS
-//#define NO_DTMF_OVERDUB
-#define DTMF_PACKET_INTERVAL 2000
-#define DTMF_DURATION 500
-
-#define STEREO_MODE_FRAME 0
-#define STEREO_MODE_SAMPLE_1 1  // 1 octet per sample
-#define STEREO_MODE_SAMPLE_2 2  // 2 octets per sample
-
-/*************************/
-/* Function declarations */
-/*************************/
-
-void NetEQTest_GetCodec_and_PT(char* name,
-                               webrtc::NetEqDecoder* codec,
-                               int* PT,
-                               size_t frameLen,
-                               int* fs,
-                               int* bitrate,
-                               int* useRed);
-int NetEQTest_init_coders(webrtc::NetEqDecoder coder,
-                          size_t enc_frameSize,
-                          int bitrate,
-                          int sampfreq,
-                          int vad,
-                          size_t numChannels);
-void defineCodecs(webrtc::NetEqDecoder* usedCodec, int* noOfCodecs);
-int NetEQTest_free_coders(webrtc::NetEqDecoder coder, size_t numChannels);
-size_t NetEQTest_encode(webrtc::NetEqDecoder coder,
-                        int16_t* indata,
-                        size_t frameLen,
-                        unsigned char* encoded,
-                        int sampleRate,
-                        int* vad,
-                        int useVAD,
-                        int bitrate,
-                        size_t numChannels);
-void makeRTPheader(unsigned char* rtp_data,
-                   int payloadType,
-                   int seqNo,
-                   uint32_t timestamp,
-                   uint32_t ssrc);
-int makeRedundantHeader(unsigned char* rtp_data,
-                        int* payloadType,
-                        int numPayloads,
-                        uint32_t* timestamp,
-                        uint16_t* blockLen,
-                        int seqNo,
-                        uint32_t ssrc);
-size_t makeDTMFpayload(unsigned char* payload_data,
-                       int Event,
-                       int End,
-                       int Volume,
-                       int Duration);
-void stereoDeInterleave(int16_t* audioSamples, size_t numSamples);
-void stereoInterleave(unsigned char* data, size_t dataLen, size_t stride);
-
-/*********************/
-/* Codec definitions */
-/*********************/
-
-#include "webrtc_vad.h"
-
-#if ((defined CODEC_PCM16B) || (defined NETEQ_ARBITRARY_CODEC))
-#include "webrtc/modules/audio_coding/codecs/pcm16b/pcm16b.h"
-#endif
-#ifdef CODEC_G711
-#include "webrtc/modules/audio_coding/codecs/g711/g711_interface.h"
-#endif
-#ifdef CODEC_G729
-#include "G729Interface.h"
-#endif
-#ifdef CODEC_G729_1
-#include "G729_1Interface.h"
-#endif
-#ifdef CODEC_AMR
-#include "AMRInterface.h"
-#include "AMRCreation.h"
-#endif
-#ifdef CODEC_AMRWB
-#include "AMRWBInterface.h"
-#include "AMRWBCreation.h"
-#endif
-#ifdef CODEC_ILBC
-#include "webrtc/modules/audio_coding/codecs/ilbc/ilbc.h"
-#endif
-#if (defined CODEC_ISAC || defined CODEC_ISAC_SWB)
-#include "webrtc/modules/audio_coding/codecs/isac/main/include/isac.h"
-#endif
-#ifdef NETEQ_ISACFIX_CODEC
-#include "webrtc/modules/audio_coding/codecs/isac/fix/include/isacfix.h"
-#ifdef CODEC_ISAC
-#error Cannot have both ISAC and ISACfix defined. Please de-select one.
-#endif
-#endif
-#ifdef CODEC_G722
-#include "webrtc/modules/audio_coding/codecs/g722/g722_interface.h"
-#endif
-#ifdef CODEC_G722_1_24
-#include "G722_1Interface.h"
-#endif
-#ifdef CODEC_G722_1_32
-#include "G722_1Interface.h"
-#endif
-#ifdef CODEC_G722_1_16
-#include "G722_1Interface.h"
-#endif
-#ifdef CODEC_G722_1C_24
-#include "G722_1Interface.h"
-#endif
-#ifdef CODEC_G722_1C_32
-#include "G722_1Interface.h"
-#endif
-#ifdef CODEC_G722_1C_48
-#include "G722_1Interface.h"
-#endif
-#ifdef CODEC_G726
-#include "G726Creation.h"
-#include "G726Interface.h"
-#endif
-#ifdef CODEC_GSMFR
-#include "GSMFRInterface.h"
-#include "GSMFRCreation.h"
-#endif
-#if (defined(CODEC_CNGCODEC8) || defined(CODEC_CNGCODEC16) || \
-     defined(CODEC_CNGCODEC32) || defined(CODEC_CNGCODEC48))
-#include "webrtc/modules/audio_coding/codecs/cng/webrtc_cng.h"
-#endif
-#ifdef CODEC_OPUS
-#include "webrtc/modules/audio_coding/codecs/opus/opus_interface.h"
-#endif
-
-/***********************************/
-/* Global codec instance variables */
-/***********************************/
-
-WebRtcVadInst* VAD_inst[2];
-
-#ifdef CODEC_G722
-G722EncInst* g722EncState[2];
-#endif
-
-#ifdef CODEC_G722_1_24
-G722_1_24_encinst_t* G722_1_24enc_inst[2];
-#endif
-#ifdef CODEC_G722_1_32
-G722_1_32_encinst_t* G722_1_32enc_inst[2];
-#endif
-#ifdef CODEC_G722_1_16
-G722_1_16_encinst_t* G722_1_16enc_inst[2];
-#endif
-#ifdef CODEC_G722_1C_24
-G722_1C_24_encinst_t* G722_1C_24enc_inst[2];
-#endif
-#ifdef CODEC_G722_1C_32
-G722_1C_32_encinst_t* G722_1C_32enc_inst[2];
-#endif
-#ifdef CODEC_G722_1C_48
-G722_1C_48_encinst_t* G722_1C_48enc_inst[2];
-#endif
-#ifdef CODEC_G726
-G726_encinst_t* G726enc_inst[2];
-#endif
-#ifdef CODEC_G729
-G729_encinst_t* G729enc_inst[2];
-#endif
-#ifdef CODEC_G729_1
-G729_1_inst_t* G729_1_inst[2];
-#endif
-#ifdef CODEC_AMR
-AMR_encinst_t* AMRenc_inst[2];
-int16_t AMR_bitrate;
-#endif
-#ifdef CODEC_AMRWB
-AMRWB_encinst_t* AMRWBenc_inst[2];
-int16_t AMRWB_bitrate;
-#endif
-#ifdef CODEC_ILBC
-IlbcEncoderInstance* iLBCenc_inst[2];
-#endif
-#ifdef CODEC_ISAC
-ISACStruct* ISAC_inst[2];
-#endif
-#ifdef NETEQ_ISACFIX_CODEC
-ISACFIX_MainStruct* ISAC_inst[2];
-#endif
-#ifdef CODEC_ISAC_SWB
-ISACStruct* ISACSWB_inst[2];
-#endif
-#ifdef CODEC_GSMFR
-GSMFR_encinst_t* GSMFRenc_inst[2];
-#endif
-#if (defined(CODEC_CNGCODEC8) || defined(CODEC_CNGCODEC16) || \
-     defined(CODEC_CNGCODEC32) || defined(CODEC_CNGCODEC48))
-webrtc::ComfortNoiseEncoder *CNG_encoder[2];
-#endif
-#ifdef CODEC_OPUS
-OpusEncInst* opus_inst[2];
-#endif
-
-int main(int argc, char* argv[]) {
-  size_t packet_size;
-  int fs;
-  webrtc::NetEqDecoder usedCodec;
-  int payloadType;
-  int bitrate = 0;
-  int useVAD, vad;
-  int useRed = 0;
-  size_t len, enc_len;
-  int16_t org_data[4000];
-  unsigned char rtp_data[kRtpDataSize];
-  int16_t seqNo = 0xFFF;
-  uint32_t ssrc = 1235412312;
-  uint32_t timestamp = 0xAC1245;
-  uint16_t length, plen;
-  uint32_t offset;
-  double sendtime = 0;
-  int red_PT[2] = {0};
-  uint32_t red_TS[2] = {0};
-  uint16_t red_len[2] = {0};
-  size_t RTPheaderLen = 12;
-  uint8_t red_data[kRtpDataSize];
-#ifdef INSERT_OLD_PACKETS
-  uint16_t old_length, old_plen;
-  size_t old_enc_len;
-  int first_old_packet = 1;
-  unsigned char old_rtp_data[kRtpDataSize];
-  size_t packet_age = 0;
-#endif
-#ifdef INSERT_DTMF_PACKETS
-  int NTone = 1;
-  int DTMFfirst = 1;
-  uint32_t DTMFtimestamp;
-  bool dtmfSent = false;
-#endif
-  bool usingStereo = false;
-  size_t stereoMode = 0;
-  size_t numChannels = 1;
-
-  /* check number of parameters */
-  if ((argc != 6) && (argc != 7)) {
-    /* print help text and exit */
-    printf("Application to encode speech into an RTP stream.\n");
-    printf("The program reads a PCM file and encodes is using the specified "
-           "codec.\n");
-    printf(
-        "The coded speech is packetized in RTP packets and written to the "
-        "output file.\n");
-    printf("The format of the RTP stream file is simlilar to that of "
-           "rtpplay,\n");
-    printf("but with the receive time euqal to 0 for all packets.\n");
-    printf("Usage:\n\n");
-    printf("%s PCMfile RTPfile frameLen codec useVAD bitrate\n", argv[0]);
-    printf("where:\n");
-
-    printf("PCMfile      : PCM speech input file\n\n");
-
-    printf("RTPfile      : RTP stream output file\n\n");
-
-    printf("frameLen     : 80...960...  Number of samples per packet (limit "
-           "depends on codec)\n\n");
-
-    printf("codecName\n");
-#ifdef CODEC_PCM16B
-    printf("             : pcm16b       16 bit PCM (8kHz)\n");
-#endif
-#ifdef CODEC_PCM16B_WB
-    printf("             : pcm16b_wb   16 bit PCM (16kHz)\n");
-#endif
-#ifdef CODEC_PCM16B_32KHZ
-    printf("             : pcm16b_swb32 16 bit PCM (32kHz)\n");
-#endif
-#ifdef CODEC_PCM16B_48KHZ
-    printf("             : pcm16b_swb48 16 bit PCM (48kHz)\n");
-#endif
-#ifdef CODEC_G711
-    printf("             : pcma         g711 A-law (8kHz)\n");
-#endif
-#ifdef CODEC_G711
-    printf("             : pcmu         g711 u-law (8kHz)\n");
-#endif
-#ifdef CODEC_G729
-    printf("             : g729         G729 (8kHz and 8kbps) CELP (One-Three "
-           "frame(s)/packet)\n");
-#endif
-#ifdef CODEC_G729_1
-    printf("             : g729.1       G729.1 (16kHz) variable rate (8--32 "
-           "kbps)\n");
-#endif
-#ifdef CODEC_G722_1_16
-    printf("             : g722.1_16    G722.1 coder (16kHz) (g722.1 with "
-           "16kbps)\n");
-#endif
-#ifdef CODEC_G722_1_24
-    printf("             : g722.1_24    G722.1 coder (16kHz) (the 24kbps "
-           "version)\n");
-#endif
-#ifdef CODEC_G722_1_32
-    printf("             : g722.1_32    G722.1 coder (16kHz) (the 32kbps "
-           "version)\n");
-#endif
-#ifdef CODEC_G722_1C_24
-    printf("             : g722.1C_24    G722.1 C coder (32kHz) (the 24kbps "
-           "version)\n");
-#endif
-#ifdef CODEC_G722_1C_32
-    printf("             : g722.1C_32    G722.1 C coder (32kHz) (the 32kbps "
-           "version)\n");
-#endif
-#ifdef CODEC_G722_1C_48
-    printf("             : g722.1C_48    G722.1 C coder (32kHz) (the 48kbps "
-           "version)\n");
-#endif
-
-#ifdef CODEC_G726
-    printf("             : g726_16      G726 coder (8kHz) 16kbps\n");
-    printf("             : g726_24      G726 coder (8kHz) 24kbps\n");
-    printf("             : g726_32      G726 coder (8kHz) 32kbps\n");
-    printf("             : g726_40      G726 coder (8kHz) 40kbps\n");
-#endif
-#ifdef CODEC_AMR
-    printf("             : AMRXk        Adaptive Multi Rate CELP codec "
-           "(8kHz)\n");
-    printf("                            X = 4.75, 5.15, 5.9, 6.7, 7.4, 7.95, "
-           "10.2 or 12.2\n");
-#endif
-#ifdef CODEC_AMRWB
-    printf("             : AMRwbXk      Adaptive Multi Rate Wideband CELP "
-           "codec (16kHz)\n");
-    printf("                            X = 7, 9, 12, 14, 16, 18, 20, 23 or "
-           "24\n");
-#endif
-#ifdef CODEC_ILBC
-    printf("             : ilbc         iLBC codec (8kHz and 13.8kbps)\n");
-#endif
-#ifdef CODEC_ISAC
-    printf("             : isac         iSAC (16kHz and 32.0 kbps). To set "
-           "rate specify a rate parameter as last parameter\n");
-#endif
-#ifdef CODEC_ISAC_SWB
-    printf("             : isacswb       iSAC SWB (32kHz and 32.0-52.0 kbps). "
-           "To set rate specify a rate parameter as last parameter\n");
-#endif
-#ifdef CODEC_GSMFR
-    printf("             : gsmfr        GSM FR codec (8kHz and 13kbps)\n");
-#endif
-#ifdef CODEC_G722
-    printf("             : g722         g722 coder (16kHz) (the 64kbps "
-           "version)\n");
-#endif
-#ifdef CODEC_RED
-#ifdef CODEC_G711
-    printf("             : red_pcm      Redundancy RTP packet with 2*G711A "
-           "frames\n");
-#endif
-#ifdef CODEC_ISAC
-    printf("             : red_isac     Redundancy RTP packet with 2*iSAC "
-           "frames\n");
-#endif
-#endif  // CODEC_RED
-#ifdef CODEC_OPUS
-    printf("             : opus         Opus codec with FEC (48kHz, 32kbps, FEC"
-        " on and tuned for 5%% packet losses)\n");
-#endif
-    printf("\n");
-
-#if (defined(CODEC_CNGCODEC8) || defined(CODEC_CNGCODEC16) || \
-     defined(CODEC_CNGCODEC32) || defined(CODEC_CNGCODEC48))
-    printf("useVAD       : 0 Voice Activity Detection is switched off\n");
-    printf("             : 1 Voice Activity Detection is switched on\n\n");
-#else
-    printf("useVAD       : 0 Voice Activity Detection switched off (on not "
-           "supported)\n\n");
-#endif
-    printf("bitrate      : Codec bitrate in bps (only applies to vbr "
-           "codecs)\n\n");
-
-    return (0);
-  }
-
-  FILE* in_file = fopen(argv[1], "rb");
-  CHECK_NOT_NULL(in_file);
-  printf("Input file: %s\n", argv[1]);
-  FILE* out_file = fopen(argv[2], "wb");
-  CHECK_NOT_NULL(out_file);
-  printf("Output file: %s\n\n", argv[2]);
-  int packet_size_int = atoi(argv[3]);
-  if (packet_size_int <= 0) {
-     printf("Packet size %d must be positive", packet_size_int);
-     return -1;
-  }
-  printf("Packet size: %d\n", packet_size_int);
-  packet_size = static_cast<size_t>(packet_size_int);
-
-  // check for stereo
-  if (argv[4][strlen(argv[4]) - 1] == '*') {
-    // use stereo
-    usingStereo = true;
-    numChannels = 2;
-    argv[4][strlen(argv[4]) - 1] = '\0';
-  }
-
-  NetEQTest_GetCodec_and_PT(argv[4], &usedCodec, &payloadType, packet_size, &fs,
-                            &bitrate, &useRed);
-
-  if (useRed) {
-    RTPheaderLen = 12 + 4 + 1; /* standard RTP = 12; 4 bytes per redundant
-                                  payload, except last one which is 1 byte */
-  }
-
-  useVAD = atoi(argv[5]);
-#if !(defined(CODEC_CNGCODEC8) || defined(CODEC_CNGCODEC16) || \
-      defined(CODEC_CNGCODEC32) || defined(CODEC_CNGCODEC48))
-  if (useVAD != 0) {
-    printf("Error: this simulation does not support VAD/DTX/CNG\n");
-  }
-#endif
-
-  // check stereo type
-  if (usingStereo) {
-    switch (usedCodec) {
-      // sample based codecs
-      case webrtc::NetEqDecoder::kDecoderPCMu:
-      case webrtc::NetEqDecoder::kDecoderPCMa:
-      case webrtc::NetEqDecoder::kDecoderG722: {
-        // 1 octet per sample
-        stereoMode = STEREO_MODE_SAMPLE_1;
-        break;
-      }
-      case webrtc::NetEqDecoder::kDecoderPCM16B:
-      case webrtc::NetEqDecoder::kDecoderPCM16Bwb:
-      case webrtc::NetEqDecoder::kDecoderPCM16Bswb32kHz:
-      case webrtc::NetEqDecoder::kDecoderPCM16Bswb48kHz: {
-        // 2 octets per sample
-        stereoMode = STEREO_MODE_SAMPLE_2;
-        break;
-      }
-
-      // fixed-rate frame codecs (with internal VAD)
-      default: {
-        printf("Cannot use codec %s as stereo codec\n", argv[4]);
-        exit(0);
-      }
-    }
-  }
-
-  if ((usedCodec == webrtc::NetEqDecoder::kDecoderISAC) ||
-      (usedCodec == webrtc::NetEqDecoder::kDecoderISACswb)) {
-    if (argc != 7) {
-      if (usedCodec == webrtc::NetEqDecoder::kDecoderISAC) {
-        bitrate = 32000;
-        printf("Running iSAC at default bitrate of 32000 bps (to specify "
-               "explicitly add the bps as last parameter)\n");
-      } else  // (usedCodec==webrtc::kDecoderISACswb)
-      {
-        bitrate = 56000;
-        printf("Running iSAC at default bitrate of 56000 bps (to specify "
-               "explicitly add the bps as last parameter)\n");
-      }
-    } else {
-      bitrate = atoi(argv[6]);
-      if (usedCodec == webrtc::NetEqDecoder::kDecoderISAC) {
-        if ((bitrate < 10000) || (bitrate > 32000)) {
-          printf("Error: iSAC bitrate must be between 10000 and 32000 bps (%i "
-                 "is invalid)\n", bitrate);
-          exit(0);
-        }
-        printf("Running iSAC at bitrate of %i bps\n", bitrate);
-      } else  // (usedCodec==webrtc::kDecoderISACswb)
-      {
-        if ((bitrate < 32000) || (bitrate > 56000)) {
-          printf("Error: iSAC SWB bitrate must be between 32000 and 56000 bps "
-                 "(%i is invalid)\n", bitrate);
-          exit(0);
-        }
-      }
-    }
-  } else {
-    if (argc == 7) {
-      printf("Error: Bitrate parameter can only be specified for iSAC, G.723, "
-             "and G.729.1\n");
-      exit(0);
-    }
-  }
-
-  if (useRed) {
-    printf("Redundancy engaged. ");
-  }
-  printf("Used codec: %i\n", static_cast<int>(usedCodec));
-  printf("Payload type: %i\n", payloadType);
-
-  NetEQTest_init_coders(usedCodec, packet_size, bitrate, fs, useVAD,
-                        numChannels);
-
-  /* write file header */
-  // fprintf(out_file, "#!RTPencode%s\n", "1.0");
-  fprintf(out_file, "#!rtpplay%s \n",
-          "1.0");               // this is the string that rtpplay needs
-  uint32_t dummy_variable = 0;  // should be converted to network endian format,
-                                // but does not matter when 0
-  if (fwrite(&dummy_variable, 4, 1, out_file) != 1) {
-    return -1;
-  }
-  if (fwrite(&dummy_variable, 4, 1, out_file) != 1) {
-    return -1;
-  }
-  if (fwrite(&dummy_variable, 4, 1, out_file) != 1) {
-    return -1;
-  }
-  if (fwrite(&dummy_variable, 2, 1, out_file) != 1) {
-    return -1;
-  }
-  if (fwrite(&dummy_variable, 2, 1, out_file) != 1) {
-    return -1;
-  }
-
-#ifdef TIMESTAMP_WRAPAROUND
-  timestamp = 0xFFFFFFFF - fs * 10; /* should give wrap-around in 10 seconds */
-#endif
-#if defined(RANDOM_DATA) | defined(RANDOM_PAYLOAD_DATA)
-  srand(RANDOM_SEED);
-#endif
-
-  /* if redundancy is used, the first redundant payload is zero length */
-  red_len[0] = 0;
-
-  /* read first frame */
-  len = fread(org_data, 2, packet_size * numChannels, in_file) / numChannels;
-
-  /* de-interleave if stereo */
-  if (usingStereo) {
-    stereoDeInterleave(org_data, len * numChannels);
-  }
-
-  while (len == packet_size) {
-#ifdef INSERT_DTMF_PACKETS
-    dtmfSent = false;
-
-    if (sendtime >= NTone * DTMF_PACKET_INTERVAL) {
-      if (sendtime < NTone * DTMF_PACKET_INTERVAL + DTMF_DURATION) {
-        // tone has not ended
-        if (DTMFfirst == 1) {
-          DTMFtimestamp = timestamp;  // save this timestamp
-          DTMFfirst = 0;
-        }
-        makeRTPheader(rtp_data, NETEQ_CODEC_AVT_PT, seqNo, DTMFtimestamp, ssrc);
-        enc_len = makeDTMFpayload(
-            &rtp_data[12], NTone % 12, 0, 4,
-            (int)(sendtime - NTone * DTMF_PACKET_INTERVAL) * (fs / 1000) + len);
-      } else {
-        // tone has ended
-        makeRTPheader(rtp_data, NETEQ_CODEC_AVT_PT, seqNo, DTMFtimestamp, ssrc);
-        enc_len = makeDTMFpayload(&rtp_data[12], NTone % 12, 1, 4,
-                                  DTMF_DURATION * (fs / 1000));
-        NTone++;
-        DTMFfirst = 1;
-      }
-
-      /* write RTP packet to file */
-      length = htons(static_cast<unsigned short>(12 + enc_len + 8));
-      plen = htons(static_cast<unsigned short>(12 + enc_len));
-      offset = (uint32_t)sendtime;  //(timestamp/(fs/1000));
-      offset = htonl(offset);
-      if (fwrite(&length, 2, 1, out_file) != 1) {
-        return -1;
-      }
-      if (fwrite(&plen, 2, 1, out_file) != 1) {
-        return -1;
-      }
-      if (fwrite(&offset, 4, 1, out_file) != 1) {
-        return -1;
-      }
-      if (fwrite(rtp_data, 12 + enc_len, 1, out_file) != 1) {
-        return -1;
-      }
-
-      dtmfSent = true;
-    }
-#endif
-
-#ifdef NO_DTMF_OVERDUB
-    /* If DTMF is sent, we should not send any speech packets during the same
-     * time */
-    if (dtmfSent) {
-      enc_len = 0;
-    } else {
-#endif
-      /* encode frame */
-      enc_len =
-          NetEQTest_encode(usedCodec, org_data, packet_size, &rtp_data[12], fs,
-                           &vad, useVAD, bitrate, numChannels);
-
-      if (usingStereo && stereoMode != STEREO_MODE_FRAME && vad == 1) {
-        // interleave the encoded payload for sample-based codecs (not for CNG)
-        stereoInterleave(&rtp_data[12], enc_len, stereoMode);
-      }
-#ifdef NO_DTMF_OVERDUB
-    }
-#endif
-
-    if (enc_len > 0 &&
-        (sendtime <= STOPSENDTIME || sendtime > RESTARTSENDTIME)) {
-      if (useRed) {
-        if (red_len[0] > 0) {
-          memmove(&rtp_data[RTPheaderLen + red_len[0]], &rtp_data[12], enc_len);
-          memcpy(&rtp_data[RTPheaderLen], red_data, red_len[0]);
-
-          red_len[1] = static_cast<uint16_t>(enc_len);
-          red_TS[1] = timestamp;
-          if (vad)
-            red_PT[1] = payloadType;
-          else
-            red_PT[1] = NETEQ_CODEC_CN_PT;
-
-          makeRedundantHeader(rtp_data, red_PT, 2, red_TS, red_len, seqNo++,
-                              ssrc);
-
-          enc_len += red_len[0] + RTPheaderLen - 12;
-        } else {  // do not use redundancy payload for this packet, i.e., only
-                  // last payload
-          memmove(&rtp_data[RTPheaderLen - 4], &rtp_data[12], enc_len);
-          // memcpy(&rtp_data[RTPheaderLen], red_data, red_len[0]);
-
-          red_len[1] = static_cast<uint16_t>(enc_len);
-          red_TS[1] = timestamp;
-          if (vad)
-            red_PT[1] = payloadType;
-          else
-            red_PT[1] = NETEQ_CODEC_CN_PT;
-
-          makeRedundantHeader(rtp_data, red_PT, 2, red_TS, red_len, seqNo++,
-                              ssrc);
-
-          enc_len += red_len[0] + RTPheaderLen - 4 -
-                     12;  // 4 is length of redundancy header (not used)
-        }
-      } else {
-        /* make RTP header */
-        if (vad)  // regular speech data
-          makeRTPheader(rtp_data, payloadType, seqNo++, timestamp, ssrc);
-        else  // CNG data
-          makeRTPheader(rtp_data, NETEQ_CODEC_CN_PT, seqNo++, timestamp, ssrc);
-      }
-#ifdef MULTIPLE_SAME_TIMESTAMP
-      int mult_pack = 0;
-      do {
-#endif  // MULTIPLE_SAME_TIMESTAMP
-        /* write RTP packet to file */
-        length = htons(static_cast<unsigned short>(12 + enc_len + 8));
-        plen = htons(static_cast<unsigned short>(12 + enc_len));
-        offset = (uint32_t)sendtime;
-        //(timestamp/(fs/1000));
-        offset = htonl(offset);
-        if (fwrite(&length, 2, 1, out_file) != 1) {
-          return -1;
-        }
-        if (fwrite(&plen, 2, 1, out_file) != 1) {
-          return -1;
-        }
-        if (fwrite(&offset, 4, 1, out_file) != 1) {
-          return -1;
-        }
-#ifdef RANDOM_DATA
-        for (size_t k = 0; k < 12 + enc_len; k++) {
-          rtp_data[k] = rand() + rand();
-        }
-#endif
-#ifdef RANDOM_PAYLOAD_DATA
-        for (size_t k = 12; k < 12 + enc_len; k++) {
-          rtp_data[k] = rand() + rand();
-        }
-#endif
-        if (fwrite(rtp_data, 12 + enc_len, 1, out_file) != 1) {
-          return -1;
-        }
-#ifdef MULTIPLE_SAME_TIMESTAMP
-      } while ((seqNo % REPEAT_PACKET_DISTANCE == 0) &&
-               (mult_pack++ < REPEAT_PACKET_COUNT));
-#endif  // MULTIPLE_SAME_TIMESTAMP
-
-#ifdef INSERT_OLD_PACKETS
-      if (packet_age >= OLD_PACKET * fs) {
-        if (!first_old_packet) {
-          // send the old packet
-          if (fwrite(&old_length, 2, 1, out_file) != 1) {
-            return -1;
-          }
-          if (fwrite(&old_plen, 2, 1, out_file) != 1) {
-            return -1;
-          }
-          if (fwrite(&offset, 4, 1, out_file) != 1) {
-            return -1;
-          }
-          if (fwrite(old_rtp_data, 12 + old_enc_len, 1, out_file) != 1) {
-            return -1;
-          }
-        }
-        // store current packet as old
-        old_length = length;
-        old_plen = plen;
-        memcpy(old_rtp_data, rtp_data, 12 + enc_len);
-        old_enc_len = enc_len;
-        first_old_packet = 0;
-        packet_age = 0;
-      }
-      packet_age += packet_size;
-#endif
-
-      if (useRed) {
-/* move data to redundancy store */
-#ifdef CODEC_ISAC
-        if (usedCodec == webrtc::NetEqDecoder::kDecoderISAC) {
-          assert(!usingStereo);  // Cannot handle stereo yet
-          red_len[0] = WebRtcIsac_GetRedPayload(ISAC_inst[0], red_data);
-        } else {
-#endif
-          memcpy(red_data, &rtp_data[RTPheaderLen + red_len[0]], enc_len);
-          red_len[0] = red_len[1];
-#ifdef CODEC_ISAC
-        }
-#endif
-        red_TS[0] = red_TS[1];
-        red_PT[0] = red_PT[1];
-      }
-    }
-
-    /* read next frame */
-    len = fread(org_data, 2, packet_size * numChannels, in_file) / numChannels;
-    /* de-interleave if stereo */
-    if (usingStereo) {
-      stereoDeInterleave(org_data, len * numChannels);
-    }
-
-    if (payloadType == NETEQ_CODEC_G722_PT)
-      timestamp += len >> 1;
-    else
-      timestamp += len;
-
-    sendtime += (double)len / (fs / 1000);
-  }
-
-  NetEQTest_free_coders(usedCodec, numChannels);
-  fclose(in_file);
-  fclose(out_file);
-  printf("Done!\n");
-
-  return (0);
-}
-
-/****************/
-/* Subfunctions */
-/****************/
-
-void NetEQTest_GetCodec_and_PT(char* name,
-                               webrtc::NetEqDecoder* codec,
-                               int* PT,
-                               size_t frameLen,
-                               int* fs,
-                               int* bitrate,
-                               int* useRed) {
-  *bitrate = 0; /* Default bitrate setting */
-  *useRed = 0;  /* Default no redundancy */
-
-  if (!strcmp(name, "pcmu")) {
-    *codec = webrtc::NetEqDecoder::kDecoderPCMu;
-    *PT = NETEQ_CODEC_PCMU_PT;
-    *fs = 8000;
-  } else if (!strcmp(name, "pcma")) {
-    *codec = webrtc::NetEqDecoder::kDecoderPCMa;
-    *PT = NETEQ_CODEC_PCMA_PT;
-    *fs = 8000;
-  } else if (!strcmp(name, "pcm16b")) {
-    *codec = webrtc::NetEqDecoder::kDecoderPCM16B;
-    *PT = NETEQ_CODEC_PCM16B_PT;
-    *fs = 8000;
-  } else if (!strcmp(name, "pcm16b_wb")) {
-    *codec = webrtc::NetEqDecoder::kDecoderPCM16Bwb;
-    *PT = NETEQ_CODEC_PCM16B_WB_PT;
-    *fs = 16000;
-  } else if (!strcmp(name, "pcm16b_swb32")) {
-    *codec = webrtc::NetEqDecoder::kDecoderPCM16Bswb32kHz;
-    *PT = NETEQ_CODEC_PCM16B_SWB32KHZ_PT;
-    *fs = 32000;
-  } else if (!strcmp(name, "pcm16b_swb48")) {
-    *codec = webrtc::NetEqDecoder::kDecoderPCM16Bswb48kHz;
-    *PT = NETEQ_CODEC_PCM16B_SWB48KHZ_PT;
-    *fs = 48000;
-  } else if (!strcmp(name, "g722")) {
-    *codec = webrtc::NetEqDecoder::kDecoderG722;
-    *PT = NETEQ_CODEC_G722_PT;
-    *fs = 16000;
-  } else if ((!strcmp(name, "ilbc")) &&
-             ((frameLen % 240 == 0) || (frameLen % 160 == 0))) {
-    *fs = 8000;
-    *codec = webrtc::NetEqDecoder::kDecoderILBC;
-    *PT = NETEQ_CODEC_ILBC_PT;
-  } else if (!strcmp(name, "isac")) {
-    *fs = 16000;
-    *codec = webrtc::NetEqDecoder::kDecoderISAC;
-    *PT = NETEQ_CODEC_ISAC_PT;
-  } else if (!strcmp(name, "isacswb")) {
-    *fs = 32000;
-    *codec = webrtc::NetEqDecoder::kDecoderISACswb;
-    *PT = NETEQ_CODEC_ISACSWB_PT;
-  } else if (!strcmp(name, "red_pcm")) {
-    *codec = webrtc::NetEqDecoder::kDecoderPCMa;
-    *PT = NETEQ_CODEC_PCMA_PT; /* this will be the PT for the sub-headers */
-    *fs = 8000;
-    *useRed = 1;
-  } else if (!strcmp(name, "red_isac")) {
-    *codec = webrtc::NetEqDecoder::kDecoderISAC;
-    *PT = NETEQ_CODEC_ISAC_PT; /* this will be the PT for the sub-headers */
-    *fs = 16000;
-    *useRed = 1;
-  } else if (!strcmp(name, "opus")) {
-    *codec = webrtc::NetEqDecoder::kDecoderOpus;
-    *PT = NETEQ_CODEC_OPUS_PT; /* this will be the PT for the sub-headers */
-    *fs = 48000;
-  } else {
-    printf("Error: Not a supported codec (%s)\n", name);
-    exit(0);
-  }
-}
-
-int NetEQTest_init_coders(webrtc::NetEqDecoder coder,
-                          size_t enc_frameSize,
-                          int bitrate,
-                          int sampfreq,
-                          int vad,
-                          size_t numChannels) {
-  int ok = 0;
-
-  for (size_t k = 0; k < numChannels; k++) {
-    VAD_inst[k] = WebRtcVad_Create();
-    if (!VAD_inst[k]) {
-      printf("Error: Couldn't allocate memory for VAD instance\n");
-      exit(0);
-    }
-    ok = WebRtcVad_Init(VAD_inst[k]);
-    if (ok == -1) {
-      printf("Error: Initialization of VAD struct failed\n");
-      exit(0);
-    }
-
-#if (defined(CODEC_CNGCODEC8) || defined(CODEC_CNGCODEC16) || \
-     defined(CODEC_CNGCODEC32) || defined(CODEC_CNGCODEC48))
-    if (sampfreq <= 16000) {
-      CNG_encoder[k] = new webrtc::ComfortNoiseEncoder(sampfreq, 200, 5);
-    }
-#endif
-
-    switch (coder) {
-#ifdef CODEC_PCM16B
-      case webrtc::NetEqDecoder::kDecoderPCM16B:
-#endif
-#ifdef CODEC_PCM16B_WB
-      case webrtc::NetEqDecoder::kDecoderPCM16Bwb:
-#endif
-#ifdef CODEC_PCM16B_32KHZ
-      case webrtc::NetEqDecoder::kDecoderPCM16Bswb32kHz:
-#endif
-#ifdef CODEC_PCM16B_48KHZ
-      case webrtc::NetEqDecoder::kDecoderPCM16Bswb48kHz:
-#endif
-#ifdef CODEC_G711
-      case webrtc::NetEqDecoder::kDecoderPCMu:
-      case webrtc::NetEqDecoder::kDecoderPCMa:
-#endif
-        // do nothing
-        break;
-#ifdef CODEC_G729
-      case webrtc::kDecoderG729:
-        if (sampfreq == 8000) {
-          if ((enc_frameSize == 80) || (enc_frameSize == 160) ||
-              (enc_frameSize == 240) || (enc_frameSize == 320) ||
-              (enc_frameSize == 400) || (enc_frameSize == 480)) {
-            ok = WebRtcG729_CreateEnc(&G729enc_inst[k]);
-            if (ok != 0) {
-              printf("Error: Couldn't allocate memory for G729 encoding "
-                     "instance\n");
-              exit(0);
-            }
-          } else {
-            printf("\nError: g729 only supports 10, 20, 30, 40, 50 or 60 "
-                   "ms!!\n\n");
-            exit(0);
-          }
-          WebRtcG729_EncoderInit(G729enc_inst[k], vad);
-          if ((vad == 1) && (enc_frameSize != 80)) {
-            printf("\nError - This simulation only supports VAD for G729 at "
-                   "10ms packets (not %" PRIuS "ms)\n", (enc_frameSize >> 3));
-          }
-        } else {
-          printf("\nError - g729 is only developed for 8kHz \n");
-          exit(0);
-        }
-        break;
-#endif
-#ifdef CODEC_G729_1
-      case webrtc::kDecoderG729_1:
-        if (sampfreq == 16000) {
-          if ((enc_frameSize == 320) || (enc_frameSize == 640) ||
-              (enc_frameSize == 960)) {
-            ok = WebRtcG7291_Create(&G729_1_inst[k]);
-            if (ok != 0) {
-              printf("Error: Couldn't allocate memory for G.729.1 codec "
-                     "instance\n");
-              exit(0);
-            }
-          } else {
-            printf("\nError: G.729.1 only supports 20, 40 or 60 ms!!\n\n");
-            exit(0);
-          }
-          if (!(((bitrate >= 12000) && (bitrate <= 32000) &&
-                 (bitrate % 2000 == 0)) ||
-                (bitrate == 8000))) {
-            /* must be 8, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, or 32 kbps */
-            printf("\nError: G.729.1 bitrate must be 8000 or 12000--32000 in "
-                   "steps of 2000 bps\n");
-            exit(0);
-          }
-          WebRtcG7291_EncoderInit(G729_1_inst[k], bitrate, 0 /* flag8kHz*/,
-                                  0 /*flagG729mode*/);
-        } else {
-          printf("\nError - G.729.1 input is always 16 kHz \n");
-          exit(0);
-        }
-        break;
-#endif
-
-#ifdef CODEC_G722_1_16
-      case webrtc::kDecoderG722_1_16:
-        if (sampfreq == 16000) {
-          ok = WebRtcG7221_CreateEnc16(&G722_1_16enc_inst[k]);
-          if (ok != 0) {
-            printf("Error: Couldn't allocate memory for G.722.1 instance\n");
-            exit(0);
-          }
-          if (enc_frameSize == 320) {
-          } else {
-            printf("\nError: G722.1 only supports 20 ms!!\n\n");
-            exit(0);
-          }
-          WebRtcG7221_EncoderInit16((G722_1_16_encinst_t*)G722_1_16enc_inst[k]);
-        } else {
-          printf("\nError - G722.1 is only developed for 16kHz \n");
-          exit(0);
-        }
-        break;
-#endif
-#ifdef CODEC_G722_1_24
-      case webrtc::kDecoderG722_1_24:
-        if (sampfreq == 16000) {
-          ok = WebRtcG7221_CreateEnc24(&G722_1_24enc_inst[k]);
-          if (ok != 0) {
-            printf("Error: Couldn't allocate memory for G.722.1 instance\n");
-            exit(0);
-          }
-          if (enc_frameSize == 320) {
-          } else {
-            printf("\nError: G722.1 only supports 20 ms!!\n\n");
-            exit(0);
-          }
-          WebRtcG7221_EncoderInit24((G722_1_24_encinst_t*)G722_1_24enc_inst[k]);
-        } else {
-          printf("\nError - G722.1 is only developed for 16kHz \n");
-          exit(0);
-        }
-        break;
-#endif
-#ifdef CODEC_G722_1_32
-      case webrtc::kDecoderG722_1_32:
-        if (sampfreq == 16000) {
-          ok = WebRtcG7221_CreateEnc32(&G722_1_32enc_inst[k]);
-          if (ok != 0) {
-            printf("Error: Couldn't allocate memory for G.722.1 instance\n");
-            exit(0);
-          }
-          if (enc_frameSize == 320) {
-          } else {
-            printf("\nError: G722.1 only supports 20 ms!!\n\n");
-            exit(0);
-          }
-          WebRtcG7221_EncoderInit32((G722_1_32_encinst_t*)G722_1_32enc_inst[k]);
-        } else {
-          printf("\nError - G722.1 is only developed for 16kHz \n");
-          exit(0);
-        }
-        break;
-#endif
-#ifdef CODEC_G722_1C_24
-      case webrtc::kDecoderG722_1C_24:
-        if (sampfreq == 32000) {
-          ok = WebRtcG7221C_CreateEnc24(&G722_1C_24enc_inst[k]);
-          if (ok != 0) {
-            printf("Error: Couldn't allocate memory for G.722.1C instance\n");
-            exit(0);
-          }
-          if (enc_frameSize == 640) {
-          } else {
-            printf("\nError: G722.1 C only supports 20 ms!!\n\n");
-            exit(0);
-          }
-          WebRtcG7221C_EncoderInit24(
-              (G722_1C_24_encinst_t*)G722_1C_24enc_inst[k]);
-        } else {
-          printf("\nError - G722.1 C is only developed for 32kHz \n");
-          exit(0);
-        }
-        break;
-#endif
-#ifdef CODEC_G722_1C_32
-      case webrtc::kDecoderG722_1C_32:
-        if (sampfreq == 32000) {
-          ok = WebRtcG7221C_CreateEnc32(&G722_1C_32enc_inst[k]);
-          if (ok != 0) {
-            printf("Error: Couldn't allocate memory for G.722.1C instance\n");
-            exit(0);
-          }
-          if (enc_frameSize == 640) {
-          } else {
-            printf("\nError: G722.1 C only supports 20 ms!!\n\n");
-            exit(0);
-          }
-          WebRtcG7221C_EncoderInit32(
-              (G722_1C_32_encinst_t*)G722_1C_32enc_inst[k]);
-        } else {
-          printf("\nError - G722.1 C is only developed for 32kHz \n");
-          exit(0);
-        }
-        break;
-#endif
-#ifdef CODEC_G722_1C_48
-      case webrtc::kDecoderG722_1C_48:
-        if (sampfreq == 32000) {
-          ok = WebRtcG7221C_CreateEnc48(&G722_1C_48enc_inst[k]);
-          if (ok != 0) {
-            printf("Error: Couldn't allocate memory for G.722.1C instance\n");
-            exit(0);
-          }
-          if (enc_frameSize == 640) {
-          } else {
-            printf("\nError: G722.1 C only supports 20 ms!!\n\n");
-            exit(0);
-          }
-          WebRtcG7221C_EncoderInit48(
-              (G722_1C_48_encinst_t*)G722_1C_48enc_inst[k]);
-        } else {
-          printf("\nError - G722.1 C is only developed for 32kHz \n");
-          exit(0);
-        }
-        break;
-#endif
-#ifdef CODEC_G722
-      case webrtc::NetEqDecoder::kDecoderG722:
-        if (sampfreq == 16000) {
-          if (enc_frameSize % 2 == 0) {
-          } else {
-            printf(
-                "\nError - g722 frames must have an even number of "
-                "enc_frameSize\n");
-            exit(0);
-          }
-          WebRtcG722_CreateEncoder(&g722EncState[k]);
-          WebRtcG722_EncoderInit(g722EncState[k]);
-        } else {
-          printf("\nError - g722 is only developed for 16kHz \n");
-          exit(0);
-        }
-        break;
-#endif
-#ifdef CODEC_AMR
-      case webrtc::kDecoderAMR:
-        if (sampfreq == 8000) {
-          ok = WebRtcAmr_CreateEnc(&AMRenc_inst[k]);
-          if (ok != 0) {
-            printf(
-                "Error: Couldn't allocate memory for AMR encoding instance\n");
-            exit(0);
-          }
-          if ((enc_frameSize == 160) || (enc_frameSize == 320) ||
-              (enc_frameSize == 480)) {
-          } else {
-            printf("\nError - AMR must have a multiple of 160 enc_frameSize\n");
-            exit(0);
-          }
-          WebRtcAmr_EncoderInit(AMRenc_inst[k], vad);
-          WebRtcAmr_EncodeBitmode(AMRenc_inst[k], AMRBandwidthEfficient);
-          AMR_bitrate = bitrate;
-        } else {
-          printf("\nError - AMR is only developed for 8kHz \n");
-          exit(0);
-        }
-        break;
-#endif
-#ifdef CODEC_AMRWB
-      case webrtc::kDecoderAMRWB:
-        if (sampfreq == 16000) {
-          ok = WebRtcAmrWb_CreateEnc(&AMRWBenc_inst[k]);
-          if (ok != 0) {
-            printf("Error: Couldn't allocate memory for AMRWB encoding "
-                   "instance\n");
-            exit(0);
-          }
-          if (((enc_frameSize / 320) > 3) || ((enc_frameSize % 320) != 0)) {
-            printf("\nError - AMRwb must have frameSize of 20, 40 or 60ms\n");
-            exit(0);
-          }
-          WebRtcAmrWb_EncoderInit(AMRWBenc_inst[k], vad);
-          if (bitrate == 7000) {
-            AMRWB_bitrate = AMRWB_MODE_7k;
-          } else if (bitrate == 9000) {
-            AMRWB_bitrate = AMRWB_MODE_9k;
-          } else if (bitrate == 12000) {
-            AMRWB_bitrate = AMRWB_MODE_12k;
-          } else if (bitrate == 14000) {
-            AMRWB_bitrate = AMRWB_MODE_14k;
-          } else if (bitrate == 16000) {
-            AMRWB_bitrate = AMRWB_MODE_16k;
-          } else if (bitrate == 18000) {
-            AMRWB_bitrate = AMRWB_MODE_18k;
-          } else if (bitrate == 20000) {
-            AMRWB_bitrate = AMRWB_MODE_20k;
-          } else if (bitrate == 23000) {
-            AMRWB_bitrate = AMRWB_MODE_23k;
-          } else if (bitrate == 24000) {
-            AMRWB_bitrate = AMRWB_MODE_24k;
-          }
-          WebRtcAmrWb_EncodeBitmode(AMRWBenc_inst[k], AMRBandwidthEfficient);
-
-        } else {
-          printf("\nError - AMRwb is only developed for 16kHz \n");
-          exit(0);
-        }
-        break;
-#endif
-#ifdef CODEC_ILBC
-      case webrtc::NetEqDecoder::kDecoderILBC:
-        if (sampfreq == 8000) {
-          ok = WebRtcIlbcfix_EncoderCreate(&iLBCenc_inst[k]);
-          if (ok != 0) {
-            printf("Error: Couldn't allocate memory for iLBC encoding "
-                   "instance\n");
-            exit(0);
-          }
-          if ((enc_frameSize == 160) || (enc_frameSize == 240) ||
-              (enc_frameSize == 320) || (enc_frameSize == 480)) {
-          } else {
-            printf("\nError - iLBC only supports 160, 240, 320 and 480 "
-                   "enc_frameSize (20, 30, 40 and 60 ms)\n");
-            exit(0);
-          }
-          if ((enc_frameSize == 160) || (enc_frameSize == 320)) {
-            /* 20 ms version */
-            WebRtcIlbcfix_EncoderInit(iLBCenc_inst[k], 20);
-          } else {
-            /* 30 ms version */
-            WebRtcIlbcfix_EncoderInit(iLBCenc_inst[k], 30);
-          }
-        } else {
-          printf("\nError - iLBC is only developed for 8kHz \n");
-          exit(0);
-        }
-        break;
-#endif
-#ifdef CODEC_ISAC
-      case webrtc::NetEqDecoder::kDecoderISAC:
-        if (sampfreq == 16000) {
-          ok = WebRtcIsac_Create(&ISAC_inst[k]);
-          if (ok != 0) {
-            printf("Error: Couldn't allocate memory for iSAC instance\n");
-            exit(0);
-          }
-          if ((enc_frameSize == 480) || (enc_frameSize == 960)) {
-          } else {
-            printf("\nError - iSAC only supports frameSize (30 and 60 ms)\n");
-            exit(0);
-          }
-          WebRtcIsac_EncoderInit(ISAC_inst[k], 1);
-          if ((bitrate < 10000) || (bitrate > 32000)) {
-            printf("\nError - iSAC bitrate has to be between 10000 and 32000 "
-                   "bps (not %i)\n",
-                bitrate);
-            exit(0);
-          }
-          WebRtcIsac_Control(ISAC_inst[k], bitrate,
-                             static_cast<int>(enc_frameSize >> 4));
-        } else {
-          printf("\nError - iSAC only supports 480 or 960 enc_frameSize (30 or "
-                 "60 ms)\n");
-          exit(0);
-        }
-        break;
-#endif
-#ifdef NETEQ_ISACFIX_CODEC
-      case webrtc::kDecoderISAC:
-        if (sampfreq == 16000) {
-          ok = WebRtcIsacfix_Create(&ISAC_inst[k]);
-          if (ok != 0) {
-            printf("Error: Couldn't allocate memory for iSAC instance\n");
-            exit(0);
-          }
-          if ((enc_frameSize == 480) || (enc_frameSize == 960)) {
-          } else {
-            printf("\nError - iSAC only supports frameSize (30 and 60 ms)\n");
-            exit(0);
-          }
-          WebRtcIsacfix_EncoderInit(ISAC_inst[k], 1);
-          if ((bitrate < 10000) || (bitrate > 32000)) {
-            printf("\nError - iSAC bitrate has to be between 10000 and 32000 "
-                   "bps (not %i)\n", bitrate);
-            exit(0);
-          }
-          WebRtcIsacfix_Control(ISAC_inst[k], bitrate, enc_frameSize >> 4);
-        } else {
-          printf("\nError - iSAC only supports 480 or 960 enc_frameSize (30 or "
-                 "60 ms)\n");
-          exit(0);
-        }
-        break;
-#endif
-#ifdef CODEC_ISAC_SWB
-      case webrtc::NetEqDecoder::kDecoderISACswb:
-        if (sampfreq == 32000) {
-          ok = WebRtcIsac_Create(&ISACSWB_inst[k]);
-          if (ok != 0) {
-            printf("Error: Couldn't allocate memory for iSAC SWB instance\n");
-            exit(0);
-          }
-          if (enc_frameSize == 960) {
-          } else {
-            printf("\nError - iSAC SWB only supports frameSize 30 ms\n");
-            exit(0);
-          }
-          ok = WebRtcIsac_SetEncSampRate(ISACSWB_inst[k], 32000);
-          if (ok != 0) {
-            printf("Error: Couldn't set sample rate for iSAC SWB instance\n");
-            exit(0);
-          }
-          WebRtcIsac_EncoderInit(ISACSWB_inst[k], 1);
-          if ((bitrate < 32000) || (bitrate > 56000)) {
-            printf("\nError - iSAC SWB bitrate has to be between 32000 and "
-                   "56000 bps (not %i)\n", bitrate);
-            exit(0);
-          }
-          WebRtcIsac_Control(ISACSWB_inst[k], bitrate,
-                             static_cast<int>(enc_frameSize >> 5));
-        } else {
-          printf("\nError - iSAC SWB only supports 960 enc_frameSize (30 "
-                 "ms)\n");
-          exit(0);
-        }
-        break;
-#endif
-#ifdef CODEC_GSMFR
-      case webrtc::kDecoderGSMFR:
-        if (sampfreq == 8000) {
-          ok = WebRtcGSMFR_CreateEnc(&GSMFRenc_inst[k]);
-          if (ok != 0) {
-            printf("Error: Couldn't allocate memory for GSM FR encoding "
-                   "instance\n");
-            exit(0);
-          }
-          if ((enc_frameSize == 160) || (enc_frameSize == 320) ||
-              (enc_frameSize == 480)) {
-          } else {
-            printf("\nError - GSM FR must have a multiple of 160 "
-                   "enc_frameSize\n");
-            exit(0);
-          }
-          WebRtcGSMFR_EncoderInit(GSMFRenc_inst[k], 0);
-        } else {
-          printf("\nError - GSM FR is only developed for 8kHz \n");
-          exit(0);
-        }
-        break;
-#endif
-#ifdef CODEC_OPUS
-      case webrtc::NetEqDecoder::kDecoderOpus:
-        ok = WebRtcOpus_EncoderCreate(&opus_inst[k], 1, 0);
-        if (ok != 0) {
-          printf("Error: Couldn't allocate memory for Opus encoding "
-                 "instance\n");
-          exit(0);
-        }
-        WebRtcOpus_EnableFec(opus_inst[k]);
-        WebRtcOpus_SetPacketLossRate(opus_inst[k], 5);
-        break;
-#endif
-      default:
-        printf("Error: unknown codec in call to NetEQTest_init_coders.\n");
-        exit(0);
-        break;
-    }
-    if (ok != 0) {
-      return (ok);
-    }
-  }  // end for
-
-  return (0);
-}
-
-int NetEQTest_free_coders(webrtc::NetEqDecoder coder, size_t numChannels) {
-  for (size_t k = 0; k < numChannels; k++) {
-    WebRtcVad_Free(VAD_inst[k]);
-#if (defined(CODEC_CNGCODEC8) || defined(CODEC_CNGCODEC16) || \
-     defined(CODEC_CNGCODEC32) || defined(CODEC_CNGCODEC48))
-    delete CNG_encoder[k];
-    CNG_encoder[k] = nullptr;
-#endif
-
-    switch (coder) {
-#ifdef CODEC_PCM16B
-      case webrtc::NetEqDecoder::kDecoderPCM16B:
-#endif
-#ifdef CODEC_PCM16B_WB
-      case webrtc::NetEqDecoder::kDecoderPCM16Bwb:
-#endif
-#ifdef CODEC_PCM16B_32KHZ
-      case webrtc::NetEqDecoder::kDecoderPCM16Bswb32kHz:
-#endif
-#ifdef CODEC_PCM16B_48KHZ
-      case webrtc::NetEqDecoder::kDecoderPCM16Bswb48kHz:
-#endif
-#ifdef CODEC_G711
-      case webrtc::NetEqDecoder::kDecoderPCMu:
-      case webrtc::NetEqDecoder::kDecoderPCMa:
-#endif
-        // do nothing
-        break;
-#ifdef CODEC_G729
-      case webrtc::NetEqDecoder::kDecoderG729:
-        WebRtcG729_FreeEnc(G729enc_inst[k]);
-        break;
-#endif
-#ifdef CODEC_G729_1
-      case webrtc::NetEqDecoder::kDecoderG729_1:
-        WebRtcG7291_Free(G729_1_inst[k]);
-        break;
-#endif
-
-#ifdef CODEC_G722_1_16
-      case webrtc::NetEqDecoder::kDecoderG722_1_16:
-        WebRtcG7221_FreeEnc16(G722_1_16enc_inst[k]);
-        break;
-#endif
-#ifdef CODEC_G722_1_24
-      case webrtc::NetEqDecoder::kDecoderG722_1_24:
-        WebRtcG7221_FreeEnc24(G722_1_24enc_inst[k]);
-        break;
-#endif
-#ifdef CODEC_G722_1_32
-      case webrtc::NetEqDecoder::kDecoderG722_1_32:
-        WebRtcG7221_FreeEnc32(G722_1_32enc_inst[k]);
-        break;
-#endif
-#ifdef CODEC_G722_1C_24
-      case webrtc::NetEqDecoder::kDecoderG722_1C_24:
-        WebRtcG7221C_FreeEnc24(G722_1C_24enc_inst[k]);
-        break;
-#endif
-#ifdef CODEC_G722_1C_32
-      case webrtc::NetEqDecoder::kDecoderG722_1C_32:
-        WebRtcG7221C_FreeEnc32(G722_1C_32enc_inst[k]);
-        break;
-#endif
-#ifdef CODEC_G722_1C_48
-      case webrtc::NetEqDecoder::kDecoderG722_1C_48:
-        WebRtcG7221C_FreeEnc48(G722_1C_48enc_inst[k]);
-        break;
-#endif
-#ifdef CODEC_G722
-      case webrtc::NetEqDecoder::kDecoderG722:
-        WebRtcG722_FreeEncoder(g722EncState[k]);
-        break;
-#endif
-#ifdef CODEC_AMR
-      case webrtc::NetEqDecoder::kDecoderAMR:
-        WebRtcAmr_FreeEnc(AMRenc_inst[k]);
-        break;
-#endif
-#ifdef CODEC_AMRWB
-      case webrtc::NetEqDecoder::kDecoderAMRWB:
-        WebRtcAmrWb_FreeEnc(AMRWBenc_inst[k]);
-        break;
-#endif
-#ifdef CODEC_ILBC
-      case webrtc::NetEqDecoder::kDecoderILBC:
-        WebRtcIlbcfix_EncoderFree(iLBCenc_inst[k]);
-        break;
-#endif
-#ifdef CODEC_ISAC
-      case webrtc::NetEqDecoder::kDecoderISAC:
-        WebRtcIsac_Free(ISAC_inst[k]);
-        break;
-#endif
-#ifdef NETEQ_ISACFIX_CODEC
-      case webrtc::NetEqDecoder::kDecoderISAC:
-        WebRtcIsacfix_Free(ISAC_inst[k]);
-        break;
-#endif
-#ifdef CODEC_ISAC_SWB
-      case webrtc::NetEqDecoder::kDecoderISACswb:
-        WebRtcIsac_Free(ISACSWB_inst[k]);
-        break;
-#endif
-#ifdef CODEC_GSMFR
-      case webrtc::NetEqDecoder::kDecoderGSMFR:
-        WebRtcGSMFR_FreeEnc(GSMFRenc_inst[k]);
-        break;
-#endif
-#ifdef CODEC_OPUS
-      case webrtc::NetEqDecoder::kDecoderOpus:
-        WebRtcOpus_EncoderFree(opus_inst[k]);
-        break;
-#endif
-      default:
-        printf("Error: unknown codec in call to NetEQTest_init_coders.\n");
-        exit(0);
-        break;
-    }
-  }
-
-  return (0);
-}
-
-size_t NetEQTest_encode(webrtc::NetEqDecoder coder,
-                        int16_t* indata,
-                        size_t frameLen,
-                        unsigned char* encoded,
-                        int sampleRate,
-                        int* vad,
-                        int useVAD,
-                        int bitrate,
-                        size_t numChannels) {
-  size_t cdlen = 0;
-  int16_t* tempdata;
-  static bool first_cng = true;
-  size_t tempLen;
-  *vad = 1;
-
-  // check VAD first
-  if (useVAD) {
-    *vad = 0;
-
-    const size_t sampleRate_10 = static_cast<size_t>(10 * sampleRate / 1000);
-    const size_t sampleRate_20 = static_cast<size_t>(20 * sampleRate / 1000);
-    const size_t sampleRate_30 = static_cast<size_t>(30 * sampleRate / 1000);
-    for (size_t k = 0; k < numChannels; k++) {
-      tempLen = frameLen;
-      tempdata = &indata[k * frameLen];
-      int localVad = 0;
-      /* Partition the signal and test each chunk for VAD.
-         All chunks must be VAD=0 to produce a total VAD=0. */
-      while (tempLen >= sampleRate_10) {
-        if ((tempLen % sampleRate_30) == 0) {  // tempLen is multiple of 30ms
-          localVad |= WebRtcVad_Process(VAD_inst[k], sampleRate, tempdata,
-                                        sampleRate_30);
-          tempdata += sampleRate_30;
-          tempLen -= sampleRate_30;
-        } else if (tempLen >= sampleRate_20) {  // tempLen >= 20ms
-          localVad |= WebRtcVad_Process(VAD_inst[k], sampleRate, tempdata,
-                                        sampleRate_20);
-          tempdata += sampleRate_20;
-          tempLen -= sampleRate_20;
-        } else {  // use 10ms
-          localVad |= WebRtcVad_Process(VAD_inst[k], sampleRate, tempdata,
-                                        sampleRate_10);
-          tempdata += sampleRate_10;
-          tempLen -= sampleRate_10;
-        }
-      }
-
-      // aggregate all VAD decisions over all channels
-      *vad |= localVad;
-    }
-
-    if (!*vad) {
-      // all channels are silent
-      rtc::Buffer workaround;
-      cdlen = 0;
-      for (size_t k = 0; k < numChannels; k++) {
-        workaround.Clear();
-        tempLen = CNG_encoder[k]->Encode(
-            rtc::ArrayView<const int16_t>(
-                &indata[k * frameLen],
-                (frameLen <= 640 ? frameLen : 640) /* max 640 */),
-            first_cng,
-            &workaround);
-        memcpy(encoded, workaround.data(), tempLen);
-        encoded += tempLen;
-        cdlen += tempLen;
-      }
-      *vad = 0;
-      first_cng = false;
-      return (cdlen);
-    }
-  }
-
-  // loop over all channels
-  size_t totalLen = 0;
-
-  for (size_t k = 0; k < numChannels; k++) {
-    /* Encode with the selected coder type */
-    if (coder == webrtc::NetEqDecoder::kDecoderPCMu) { /*g711 u-law */
-#ifdef CODEC_G711
-      cdlen = WebRtcG711_EncodeU(indata, frameLen, encoded);
-#endif
-    } else if (coder == webrtc::NetEqDecoder::kDecoderPCMa) { /*g711 A-law */
-#ifdef CODEC_G711
-      cdlen = WebRtcG711_EncodeA(indata, frameLen, encoded);
-    }
-#endif
-#ifdef CODEC_PCM16B
-    else if ((coder == webrtc::NetEqDecoder::kDecoderPCM16B) ||
-             (coder == webrtc::NetEqDecoder::kDecoderPCM16Bwb) ||
-             (coder == webrtc::NetEqDecoder::kDecoderPCM16Bswb32kHz) ||
-             (coder == webrtc::NetEqDecoder::
-                           kDecoderPCM16Bswb48kHz)) { /*pcm16b (8kHz, 16kHz,
-                                                        32kHz or 48kHz) */
-      cdlen = WebRtcPcm16b_Encode(indata, frameLen, encoded);
-    }
-#endif
-#ifdef CODEC_G722
-    else if (coder == webrtc::NetEqDecoder::kDecoderG722) { /*g722 */
-      cdlen = WebRtcG722_Encode(g722EncState[k], indata, frameLen, encoded);
-      assert(cdlen == frameLen >> 1);
-    }
-#endif
-#ifdef CODEC_ILBC
-    else if (coder == webrtc::NetEqDecoder::kDecoderILBC) { /*iLBC */
-      cdlen = static_cast<size_t>(std::max(
-          WebRtcIlbcfix_Encode(iLBCenc_inst[k], indata, frameLen, encoded), 0));
-    }
-#endif
-#if (defined(CODEC_ISAC) || \
-     defined(NETEQ_ISACFIX_CODEC))            // TODO(hlundin): remove all
-                                              // NETEQ_ISACFIX_CODEC
-    else if (coder == webrtc::NetEqDecoder::kDecoderISAC) { /*iSAC */
-      int noOfCalls = 0;
-      int res = 0;
-      while (res <= 0) {
-#ifdef CODEC_ISAC /* floating point */
-        res =
-            WebRtcIsac_Encode(ISAC_inst[k], &indata[noOfCalls * 160], encoded);
-#else /* fixed point */
-        res = WebRtcIsacfix_Encode(ISAC_inst[k], &indata[noOfCalls * 160],
-                                   encoded);
-#endif
-        noOfCalls++;
-      }
-      cdlen = static_cast<size_t>(res);
-    }
-#endif
-#ifdef CODEC_ISAC_SWB
-    else if (coder == webrtc::NetEqDecoder::kDecoderISACswb) { /* iSAC SWB */
-      int noOfCalls = 0;
-      int res = 0;
-      while (res <= 0) {
-        res = WebRtcIsac_Encode(ISACSWB_inst[k], &indata[noOfCalls * 320],
-                                encoded);
-        noOfCalls++;
-      }
-      cdlen = static_cast<size_t>(res);
-    }
-#endif
-#ifdef CODEC_OPUS
-    cdlen = WebRtcOpus_Encode(opus_inst[k], indata, frameLen, kRtpDataSize - 12,
-                              encoded);
-    RTC_CHECK_GT(cdlen, 0);
-#endif
-    indata += frameLen;
-    encoded += cdlen;
-    totalLen += cdlen;
-
-  }  // end for
-
-  first_cng = true;
-  return (totalLen);
-}
-
-void makeRTPheader(unsigned char* rtp_data,
-                   int payloadType,
-                   int seqNo,
-                   uint32_t timestamp,
-                   uint32_t ssrc) {
-  rtp_data[0] = 0x80;
-  rtp_data[1] = payloadType & 0xFF;
-  rtp_data[2] = (seqNo >> 8) & 0xFF;
-  rtp_data[3] = seqNo & 0xFF;
-  rtp_data[4] = timestamp >> 24;
-  rtp_data[5] = (timestamp >> 16) & 0xFF;
-  rtp_data[6] = (timestamp >> 8) & 0xFF;
-  rtp_data[7] = timestamp & 0xFF;
-  rtp_data[8] = ssrc >> 24;
-  rtp_data[9] = (ssrc >> 16) & 0xFF;
-  rtp_data[10] = (ssrc >> 8) & 0xFF;
-  rtp_data[11] = ssrc & 0xFF;
-}
-
-int makeRedundantHeader(unsigned char* rtp_data,
-                        int* payloadType,
-                        int numPayloads,
-                        uint32_t* timestamp,
-                        uint16_t* blockLen,
-                        int seqNo,
-                        uint32_t ssrc) {
-  int i;
-  unsigned char* rtpPointer;
-  uint16_t offset;
-
-  /* first create "standard" RTP header */
-  makeRTPheader(rtp_data, NETEQ_CODEC_RED_PT, seqNo, timestamp[numPayloads - 1],
-                ssrc);
-
-  rtpPointer = &rtp_data[12];
-
-  /* add one sub-header for each redundant payload (not the primary) */
-  for (i = 0; i < numPayloads - 1; i++) {
-    if (blockLen[i] > 0) {
-      offset = static_cast<uint16_t>(timestamp[numPayloads - 1] - timestamp[i]);
-
-      // Byte |0|       |1       2     |  3       |
-      // Bit  |0|1234567|01234567012345|6701234567|
-      //      |F|payload|   timestamp  |   block  |
-      //      | |  type |    offset    |  length  |
-      rtpPointer[0] = (payloadType[i] & 0x7F) | 0x80;
-      rtpPointer[1] = (offset >> 6) & 0xFF;
-      rtpPointer[2] = ((offset & 0x3F) << 2) | ((blockLen[i] >> 8) & 0x03);
-      rtpPointer[3] = blockLen[i] & 0xFF;
-
-      rtpPointer += 4;
-    }
-  }
-
-  // Bit  |0|1234567|
-  //      |0|payload|
-  //      | |  type |
-  rtpPointer[0] = payloadType[numPayloads - 1] & 0x7F;
-  ++rtpPointer;
-
-  return rtpPointer - rtp_data;  // length of header in bytes
-}
-
-size_t makeDTMFpayload(unsigned char* payload_data,
-                       int Event,
-                       int End,
-                       int Volume,
-                       int Duration) {
-  unsigned char E, R, V;
-  R = 0;
-  V = (unsigned char)Volume;
-  if (End == 0) {
-    E = 0x00;
-  } else {
-    E = 0x80;
-  }
-  payload_data[0] = (unsigned char)Event;
-  payload_data[1] = (unsigned char)(E | R | V);
-  // Duration equals 8 times time_ms, default is 8000 Hz.
-  payload_data[2] = (unsigned char)((Duration >> 8) & 0xFF);
-  payload_data[3] = (unsigned char)(Duration & 0xFF);
-  return (4);
-}
-
-void stereoDeInterleave(int16_t* audioSamples, size_t numSamples) {
-  int16_t* tempVec;
-  int16_t* readPtr, *writeL, *writeR;
-
-  if (numSamples == 0)
-    return;
-
-  tempVec = (int16_t*)malloc(sizeof(int16_t) * numSamples);
-  if (tempVec == NULL) {
-    printf("Error allocating memory\n");
-    exit(0);
-  }
-
-  memcpy(tempVec, audioSamples, numSamples * sizeof(int16_t));
-
-  writeL = audioSamples;
-  writeR = &audioSamples[numSamples / 2];
-  readPtr = tempVec;
-
-  for (size_t k = 0; k < numSamples; k += 2) {
-    *writeL = *readPtr;
-    readPtr++;
-    *writeR = *readPtr;
-    readPtr++;
-    writeL++;
-    writeR++;
-  }
-
-  free(tempVec);
-}
-
-void stereoInterleave(unsigned char* data, size_t dataLen, size_t stride) {
-  unsigned char* ptrL, *ptrR;
-  unsigned char temp[10];
-
-  if (stride > 10) {
-    exit(0);
-  }
-
-  if (dataLen % 1 != 0) {
-    // must be even number of samples
-    printf("Error: cannot interleave odd sample number\n");
-    exit(0);
-  }
-
-  ptrL = data + stride;
-  ptrR = &data[dataLen / 2];
-
-  while (ptrL < ptrR) {
-    // copy from right pointer to temp
-    memcpy(temp, ptrR, stride);
-
-    // shift data between pointers
-    memmove(ptrL + stride, ptrL, ptrR - ptrL);
-
-    // copy from temp to left pointer
-    memcpy(ptrL, temp, stride);
-
-    // advance pointers
-    ptrL += stride * 2;
-    ptrR += stride;
-  }
-}
diff --git a/modules/audio_coding/neteq/test/RTPjitter.cc b/modules/audio_coding/neteq/test/RTPjitter.cc
deleted file mode 100644
index 391f051..0000000
--- a/modules/audio_coding/neteq/test/RTPjitter.cc
+++ /dev/null
@@ -1,229 +0,0 @@
-/*
- *  Copyright (c) 2012 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.
- */
-
-//TODO(hlundin): Reformat file to meet style guide.
-
-/* header includes */
-#include <float.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#ifdef WIN32
-#include <winsock2.h>
-#include <io.h>
-#endif
-#ifdef WEBRTC_LINUX
-#include <netinet/in.h>
-#endif
-
-#include <assert.h>
-
-#include "webrtc/test/gtest.h"
-#include "webrtc/typedefs.h"
-
-/*********************/
-/* Misc. definitions */
-/*********************/
-
-#define FIRSTLINELEN 40
-#define CHECK_NOT_NULL(a) if((a)==NULL){ \
-    fprintf(stderr,"\n %s \n line: %d \nerror at %s\n",__FILE__,__LINE__,#a ); \
-    return(-1);}
-
-struct arr_time {
-  float time;
-  uint32_t ix;
-};
-
-int filelen(FILE *fid)
-{
-  fpos_t cur_pos;
-  int len;
-
-  if (!fid || fgetpos(fid, &cur_pos)) {
-    return(-1);
-  }
-
-  fseek(fid, 0, SEEK_END);
-  len = ftell(fid);
-
-  fsetpos(fid, &cur_pos);
-
-  return (len);
-}
-
-int compare_arr_time(const void *x, const void *y);
-
-int main(int argc, char* argv[])
-{
-  unsigned int  dat_len, rtp_len, Npack, k;
-  arr_time    *time_vec;
-  char      firstline[FIRSTLINELEN];
-  unsigned char* rtp_vec = NULL;
-        unsigned char** packet_ptr = NULL;
-        unsigned char* temp_packet = NULL;
-  const unsigned int kRtpDumpHeaderSize = 4 + 4 + 4 + 2 + 2;
-  uint16_t      len;
-  uint32_t      *offset;
-
-/* check number of parameters */
-  if (argc != 4) {
-    /* print help text and exit */
-    printf("Apply jitter on RTP stream.\n");
-    printf("Reads an RTP stream and packet timing from two files.\n");
-    printf("The RTP stream is modified to have the same jitter as described in "
-           "the timing files.\n");
-    printf("The format of the RTP stream file should be the same as for \n");
-    printf("rtpplay, and can be obtained e.g., from Ethereal by using\n");
-    printf("Statistics -> RTP -> Show All Streams -> [select a stream] -> "
-           "Save As\n\n");
-    printf("Usage:\n\n");
-    printf("%s RTP_infile dat_file RTP_outfile\n", argv[0]);
-    printf("where:\n");
-
-    printf("RTP_infile       : RTP stream input file\n\n");
-
-    printf("dat_file         : file with packet arrival times in ms\n\n");
-
-    printf("RTP_outfile      : RTP stream output file\n\n");
-
-    return(0);
-  }
-
-  FILE* in_file=fopen(argv[1],"rb");
-  CHECK_NOT_NULL(in_file);
-  printf("Input file: %s\n",argv[1]);
-  FILE* dat_file=fopen(argv[2],"rb");
-  CHECK_NOT_NULL(dat_file);
-  printf("Dat-file: %s\n",argv[2]);
-  FILE* out_file=fopen(argv[3],"wb");
-  CHECK_NOT_NULL(out_file);
-  printf("Output file: %s\n\n",argv[3]);
-
-  // add 1000 bytes to avoid (rare) strange error.
-  time_vec = (arr_time *) malloc(sizeof(arr_time)
-                                 *(filelen(dat_file)/sizeof(float)) + 1000);
-  if (time_vec==NULL) {
-    fprintf(stderr, "Error: could not allocate memory for reading dat file\n");
-    goto closing;
-  }
-
-  dat_len=0;
-  while(fread(&(time_vec[dat_len].time),sizeof(float),1,dat_file)>0) {
-    time_vec[dat_len].ix=dat_len;
-    dat_len++;
-  }
-
-  if (dat_len == 0) {
-    fprintf(stderr, "Error: dat_file is empty, no arrival time is given.\n");
-    goto closing;
-  }
-
-  qsort(time_vec,dat_len,sizeof(arr_time),compare_arr_time);
-
-
-  rtp_vec = (unsigned char *) malloc(sizeof(unsigned char)*filelen(in_file));
-  if (rtp_vec==NULL) {
-    fprintf(stderr,"Error: could not allocate memory for reading rtp file\n");
-    goto closing;
-  }
-
-  // read file header and write directly to output file
-  EXPECT_TRUE(fgets(firstline, FIRSTLINELEN, in_file) != NULL);
-  EXPECT_GT(fputs(firstline, out_file), 0);
-  EXPECT_EQ(kRtpDumpHeaderSize, fread(firstline, 1, kRtpDumpHeaderSize,
-                                      in_file));
-  EXPECT_EQ(kRtpDumpHeaderSize, fwrite(firstline, 1, kRtpDumpHeaderSize,
-                                       out_file));
-
-  // read all RTP packets into vector
-  rtp_len=0;
-  Npack=0;
-
-  // read length of first packet.
-  len=(uint16_t) fread(&rtp_vec[rtp_len], sizeof(unsigned char), 2, in_file);
-  while(len==2) {
-    len = ntohs(*((uint16_t *)(rtp_vec + rtp_len)));
-    rtp_len += 2;
-    if(fread(&rtp_vec[rtp_len], sizeof(unsigned char),
-             len-2, in_file)!=(unsigned) (len-2)) {
-      fprintf(stderr,"Error: currupt packet length\n");
-      goto closing;
-    }
-    rtp_len += len-2;
-    Npack++;
-
-    // read length of next packet.
-    len=(uint16_t) fread(&rtp_vec[rtp_len], sizeof(unsigned char), 2, in_file);
-  }
-
-  if (Npack == 0) {
-    fprintf(stderr, "Error: No RTP packet found.\n");
-    goto closing;
-  }
-
-  packet_ptr = (unsigned char **) malloc(Npack*sizeof(unsigned char*));
-
-  packet_ptr[0]=rtp_vec;
-  k=1;
-  while(k<Npack) {
-    len = ntohs(*((uint16_t *) packet_ptr[k-1]));
-    packet_ptr[k]=packet_ptr[k-1]+len;
-    k++;
-  }
-
-  for(k=0; k<dat_len && k<Npack; k++) {
-    if(time_vec[k].time < FLT_MAX && time_vec[k].ix < Npack){
-      temp_packet = packet_ptr[time_vec[k].ix];
-      offset = (uint32_t *) (temp_packet+4);
-      if ( time_vec[k].time >= 0 ) {
-        *offset = htonl((uint32_t) time_vec[k].time);
-      }
-      else {
-        *offset = htonl((uint32_t) 0);
-        fprintf(stderr, "Warning: negative receive time in dat file transformed"
-                " to 0.\n");
-      }
-
-      // write packet to file
-      if (fwrite(temp_packet, sizeof(unsigned char),
-                 ntohs(*((uint16_t*) temp_packet)),
-                 out_file) !=
-          ntohs(*((uint16_t*) temp_packet))) {
-        return -1;
-      }
-    }
-  }
-
-
-closing:
-  free(time_vec);
-  free(rtp_vec);
-        if (packet_ptr != NULL) {
-    free(packet_ptr);
-        }
-        fclose(in_file);
-  fclose(dat_file);
-  fclose(out_file);
-
-  return(0);
-}
-
-
-
-int compare_arr_time(const void *xp, const void *yp) {
-
-  if(((arr_time *)xp)->time == ((arr_time *)yp)->time)
-    return(0);
-  else if(((arr_time *)xp)->time > ((arr_time *)yp)->time)
-    return(1);
-
-  return(-1);
-}
diff --git a/modules/audio_coding/neteq/test/RTPtimeshift.cc b/modules/audio_coding/neteq/test/RTPtimeshift.cc
deleted file mode 100644
index 3b7a53c..0000000
--- a/modules/audio_coding/neteq/test/RTPtimeshift.cc
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- *  Copyright (c) 2011 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 <stdio.h>
-#include <algorithm>
-#include <vector>
-
-#include "webrtc/modules/audio_coding/neteq/test/NETEQTEST_RTPpacket.h"
-#include "webrtc/test/gtest.h"
-
-#define FIRSTLINELEN 40
-
-int main(int argc, char* argv[]) {
-  if (argc < 4 || argc > 6) {
-    printf(
-        "Usage: RTPtimeshift in.rtp out.rtp newStartTS [newStartSN "
-        "[newStartArrTime]]\n");
-    exit(1);
-  }
-
-  FILE* inFile = fopen(argv[1], "rb");
-  if (!inFile) {
-    printf("Cannot open input file %s\n", argv[1]);
-    return (-1);
-  }
-  printf("Input RTP file: %s\n", argv[1]);
-
-  FILE* outFile = fopen(argv[2], "wb");
-  if (!outFile) {
-    printf("Cannot open output file %s\n", argv[2]);
-    return (-1);
-  }
-  printf("Output RTP file: %s\n\n", argv[2]);
-
-  // Read file header and write directly to output file.
-  const unsigned int kRtpDumpHeaderSize = 4 + 4 + 4 + 2 + 2;
-  char firstline[FIRSTLINELEN];
-  EXPECT_TRUE(fgets(firstline, FIRSTLINELEN, inFile) != NULL);
-  EXPECT_GT(fputs(firstline, outFile), 0);
-  EXPECT_EQ(kRtpDumpHeaderSize,
-            fread(firstline, 1, kRtpDumpHeaderSize, inFile));
-  EXPECT_EQ(kRtpDumpHeaderSize,
-            fwrite(firstline, 1, kRtpDumpHeaderSize, outFile));
-  NETEQTEST_RTPpacket packet;
-  int packLen = packet.readFromFile(inFile);
-  if (packLen < 0) {
-    exit(1);
-  }
-
-  // Get new start TS and start SeqNo from arguments.
-  uint32_t TSdiff = atoi(argv[3]) - packet.timeStamp();
-  uint16_t SNdiff = 0;
-  uint32_t ATdiff = 0;
-  if (argc > 4) {
-    int startSN = atoi(argv[4]);
-    if (startSN >= 0)
-      SNdiff = startSN - packet.sequenceNumber();
-    if (argc > 5) {
-      int startTS = atoi(argv[5]);
-      if (startTS >= 0)
-        ATdiff = startTS - packet.time();
-    }
-  }
-
-  while (packLen >= 0) {
-    packet.setTimeStamp(packet.timeStamp() + TSdiff);
-    packet.setSequenceNumber(packet.sequenceNumber() + SNdiff);
-    packet.setTime(packet.time() + ATdiff);
-
-    packet.writeToFile(outFile);
-
-    packLen = packet.readFromFile(inFile);
-  }
-
-  fclose(inFile);
-  fclose(outFile);
-
-  return 0;
-}
diff --git a/modules/audio_coding/neteq/test/delay_tool/parse_delay_file.m b/modules/audio_coding/neteq/test/delay_tool/parse_delay_file.m
deleted file mode 100644
index 031d8a3..0000000
--- a/modules/audio_coding/neteq/test/delay_tool/parse_delay_file.m
+++ /dev/null
@@ -1,201 +0,0 @@
-%
-%  Copyright (c) 2011 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.
-%
-
-function outStruct = parse_delay_file(file)
-
-fid = fopen(file, 'rb');
-if fid == -1
-    error('Cannot open file %s', file);
-end
-
-textline = fgetl(fid);
-if ~strncmp(textline, '#!NetEQ_Delay_Logging', 21)
-    error('Wrong file format');
-end
-
-ver = sscanf(textline, '#!NetEQ_Delay_Logging%d.%d');
-if ~all(ver == [2; 0])
-    error('Wrong version of delay logging function')
-end
-
-
-start_pos = ftell(fid);
-fseek(fid, -12, 'eof');
-textline = fgetl(fid);
-if ~strncmp(textline, 'End of file', 21)
-    error('File ending is not correct. Seems like the simulation ended abnormally.');
-end
-
-fseek(fid,-12-4, 'eof');
-Npackets = fread(fid, 1, 'int32');
-fseek(fid, start_pos, 'bof');
-
-rtpts = zeros(Npackets, 1);
-seqno = zeros(Npackets, 1);
-pt = zeros(Npackets, 1);
-plen = zeros(Npackets, 1);
-recin_t = nan*ones(Npackets, 1);
-decode_t = nan*ones(Npackets, 1);
-playout_delay = zeros(Npackets, 1);
-optbuf = zeros(Npackets, 1);
-
-fs_ix = 1;
-clock = 0;
-ts_ix = 1;
-ended = 0;
-late_packets = 0;
-fs_now = 8000;
-last_decode_k = 0;
-tot_expand = 0;
-tot_accelerate = 0;
-tot_preemptive = 0;
-
-while not(ended)
-    signal = fread(fid, 1, '*int32');
-    
-    switch signal
-        case 3 % NETEQ_DELAY_LOGGING_SIGNAL_CLOCK
-            clock = fread(fid, 1, '*float32');
-            
-            % keep on reading batches of M until the signal is no longer "3"
-            % read int32 + float32 in one go
-            % this is to save execution time
-            temp = [3; 0];
-            M = 120;
-            while all(temp(1,:) == 3)
-                fp = ftell(fid);
-                temp = fread(fid, [2 M], '*int32');
-            end
-            
-            % back up to last clock event
-            fseek(fid, fp - ftell(fid) + ...
-                (find(temp(1,:) ~= 3, 1 ) - 2) * 2 * 4 + 4, 'cof');
-            % read the last clock value
-            clock = fread(fid, 1, '*float32');
-            
-        case 1 % NETEQ_DELAY_LOGGING_SIGNAL_RECIN
-            temp_ts = fread(fid, 1, 'uint32');
-            
-            if late_packets > 0
-                temp_ix = ts_ix - 1;
-                while (temp_ix >= 1) && (rtpts(temp_ix) ~= temp_ts)
-                    % TODO(hlundin): use matlab vector search instead?
-                    temp_ix = temp_ix - 1;
-                end
-                
-                if temp_ix >= 1
-                    % the ts was found in the vector
-                    late_packets = late_packets - 1;
-                else
-                    temp_ix = ts_ix;
-                    ts_ix = ts_ix + 1;
-                end
-            else
-                temp_ix = ts_ix;
-                ts_ix = ts_ix + 1;
-            end
-            
-            rtpts(temp_ix) = temp_ts;
-            seqno(temp_ix) = fread(fid, 1, 'uint16');
-            pt(temp_ix) = fread(fid, 1, 'int32');
-            plen(temp_ix) = fread(fid, 1, 'int16');
-            recin_t(temp_ix) = clock;
-            
-        case 2 % NETEQ_DELAY_LOGGING_SIGNAL_FLUSH
-            % do nothing
-            
-        case 4 % NETEQ_DELAY_LOGGING_SIGNAL_EOF
-            ended = 1;
-            
-        case 5 % NETEQ_DELAY_LOGGING_SIGNAL_DECODE
-            last_decode_ts = fread(fid, 1, 'uint32');
-            temp_delay = fread(fid, 1, 'uint16');
-            
-            k = find(rtpts(1:(ts_ix - 1))==last_decode_ts,1,'last');
-            if ~isempty(k)
-                decode_t(k) = clock;
-                playout_delay(k) = temp_delay + ...
-                    5 *  fs_now / 8000; % add overlap length
-                last_decode_k = k;
-            end
-            
-        case 6 % NETEQ_DELAY_LOGGING_SIGNAL_CHANGE_FS
-            fsvec(fs_ix) = fread(fid, 1, 'uint16');
-            fschange_ts(fs_ix) = last_decode_ts;
-            fs_now = fsvec(fs_ix);
-            fs_ix = fs_ix + 1;
-            
-        case 7 % NETEQ_DELAY_LOGGING_SIGNAL_MERGE_INFO
-            playout_delay(last_decode_k) = playout_delay(last_decode_k) ...
-                + fread(fid, 1, 'int32');
-            
-        case 8 % NETEQ_DELAY_LOGGING_SIGNAL_EXPAND_INFO
-            temp = fread(fid, 1, 'int32');
-            if last_decode_k ~= 0
-                tot_expand = tot_expand + temp / (fs_now / 1000);
-            end                
-            
-        case 9 % NETEQ_DELAY_LOGGING_SIGNAL_ACCELERATE_INFO
-            temp = fread(fid, 1, 'int32');
-            if last_decode_k ~= 0
-                tot_accelerate = tot_accelerate + temp / (fs_now / 1000);
-            end                
-
-        case 10 % NETEQ_DELAY_LOGGING_SIGNAL_PREEMPTIVE_INFO
-            temp = fread(fid, 1, 'int32');
-            if last_decode_k ~= 0
-                tot_preemptive = tot_preemptive + temp / (fs_now / 1000);
-            end                
-            
-        case 11 % NETEQ_DELAY_LOGGING_SIGNAL_OPTBUF
-            optbuf(last_decode_k) = fread(fid, 1, 'int32');
-            
-        case 12 % NETEQ_DELAY_LOGGING_SIGNAL_DECODE_ONE_DESC
-            last_decode_ts = fread(fid, 1, 'uint32');
-            k = ts_ix - 1;
-            
-            while (k >= 1) && (rtpts(k) ~= last_decode_ts)
-                % TODO(hlundin): use matlab vector search instead?
-                k = k - 1;
-            end
-            
-            if k < 1
-                % packet not received yet
-                k = ts_ix;
-                rtpts(ts_ix) = last_decode_ts;
-                late_packets = late_packets + 1;
-            end
-            
-            decode_t(k) = clock;
-            playout_delay(k) = fread(fid, 1, 'uint16') + ...
-                5 *  fs_now / 8000; % add overlap length
-            last_decode_k = k;
-             
-    end
-    
-end
-
-
-fclose(fid);
-
-outStruct = struct(...
-    'ts', rtpts, ...
-    'sn', seqno, ...
-    'pt', pt,...
-    'plen', plen,...
-    'arrival', recin_t,...
-    'decode', decode_t,...
-    'fs', fsvec(:),...
-    'fschange_ts', fschange_ts(:),...
-    'playout_delay', playout_delay,...
-    'tot_expand', tot_expand,...
-    'tot_accelerate', tot_accelerate,...
-    'tot_preemptive', tot_preemptive,...
-    'optbuf', optbuf);
diff --git a/modules/audio_coding/neteq/test/delay_tool/plot_neteq_delay.m b/modules/audio_coding/neteq/test/delay_tool/plot_neteq_delay.m
deleted file mode 100644
index 86d533f..0000000
--- a/modules/audio_coding/neteq/test/delay_tool/plot_neteq_delay.m
+++ /dev/null
@@ -1,197 +0,0 @@
-%
-%  Copyright (c) 2011 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.
-%
-
-function [delay_struct, delayvalues] = plot_neteq_delay(delayfile, varargin)
-
-% InfoStruct = plot_neteq_delay(delayfile)
-% InfoStruct = plot_neteq_delay(delayfile, 'skipdelay', skip_seconds)
-%
-% Henrik Lundin, 2006-11-17
-% Henrik Lundin, 2011-05-17
-%
-
-try
-    s = parse_delay_file(delayfile);
-catch
-    error(lasterr);
-end
-
-delayskip=0;
-noplot=0;
-arg_ptr=1;
-delaypoints=[];
-
-s.sn=unwrap_seqno(s.sn);
-
-while arg_ptr+1 <= nargin
-    switch lower(varargin{arg_ptr})
-    case {'skipdelay', 'delayskip'}
-        % skip a number of seconds in the beginning when calculating delays
-        delayskip = varargin{arg_ptr+1};
-        arg_ptr = arg_ptr + 2;
-    case 'noplot'
-        noplot=1;
-        arg_ptr = arg_ptr + 1;
-    case {'get_delay', 'getdelay'}
-        % return a vector of delay values for the points in the given vector
-        delaypoints = varargin{arg_ptr+1};
-        arg_ptr = arg_ptr + 2;
-    otherwise
-        warning('Unknown switch %s\n', varargin{arg_ptr});
-        arg_ptr = arg_ptr + 1;
-    end
-end
-
-% find lost frames that were covered by one-descriptor decoding
-one_desc_ix=find(isnan(s.arrival));
-for k=1:length(one_desc_ix)
-    ix=find(s.ts==max(s.ts(s.ts(one_desc_ix(k))>s.ts)));
-    s.sn(one_desc_ix(k))=s.sn(ix)+1;
-    s.pt(one_desc_ix(k))=s.pt(ix);
-    s.arrival(one_desc_ix(k))=s.arrival(ix)+s.decode(one_desc_ix(k))-s.decode(ix);
-end
-
-% remove duplicate received frames that were never decoded (RED codec)
-if length(unique(s.ts(isfinite(s.ts)))) < length(s.ts(isfinite(s.ts)))
-    ix=find(isfinite(s.decode));
-    s.sn=s.sn(ix);
-    s.ts=s.ts(ix);
-    s.arrival=s.arrival(ix);
-    s.playout_delay=s.playout_delay(ix);
-    s.pt=s.pt(ix);
-    s.optbuf=s.optbuf(ix);
-    plen=plen(ix);
-    s.decode=s.decode(ix);
-end
-
-% find non-unique sequence numbers
-[~,un_ix]=unique(s.sn);
-nonun_ix=setdiff(1:length(s.sn),un_ix);
-if ~isempty(nonun_ix)
-    warning('RTP sequence numbers are in error');
-end
-            
-% sort vectors
-[s.sn,sort_ix]=sort(s.sn);
-s.ts=s.ts(sort_ix);
-s.arrival=s.arrival(sort_ix);
-s.decode=s.decode(sort_ix);
-s.playout_delay=s.playout_delay(sort_ix);
-s.pt=s.pt(sort_ix);
-
-send_t=s.ts-s.ts(1);
-if length(s.fs)<1
-    warning('No info about sample rate found in file. Using default 8000.');
-    s.fs(1)=8000;
-    s.fschange_ts(1)=min(s.ts);
-elseif s.fschange_ts(1)>min(s.ts)
-    s.fschange_ts(1)=min(s.ts);
-end
-
-end_ix=length(send_t);
-for k=length(s.fs):-1:1
-    start_ix=find(s.ts==s.fschange_ts(k));
-    send_t(start_ix:end_ix)=send_t(start_ix:end_ix)/s.fs(k)*1000;
-    s.playout_delay(start_ix:end_ix)=s.playout_delay(start_ix:end_ix)/s.fs(k)*1000;
-    s.optbuf(start_ix:end_ix)=s.optbuf(start_ix:end_ix)/s.fs(k)*1000;
-    end_ix=start_ix-1;
-end
-
-tot_time=max(send_t)-min(send_t);
-
-seq_ix=s.sn-min(s.sn)+1;
-send_t=send_t+max(min(s.arrival-send_t),0);
-
-plot_send_t=nan*ones(max(seq_ix),1);
-plot_send_t(seq_ix)=send_t;
-plot_nw_delay=nan*ones(max(seq_ix),1);
-plot_nw_delay(seq_ix)=s.arrival-send_t;
-
-cng_ix=find(s.pt~=13); % find those packets that are not CNG/SID
-    
-if noplot==0
-    h=plot(plot_send_t/1000,plot_nw_delay);
-    set(h,'color',0.75*[1 1 1]);
-    hold on
-    if any(s.optbuf~=0)
-        peak_ix=find(s.optbuf(cng_ix)<0); % peak mode is labeled with negative values
-        no_peak_ix=find(s.optbuf(cng_ix)>0); %setdiff(1:length(cng_ix),peak_ix);
-        h1=plot(send_t(cng_ix(peak_ix))/1000,...
-            s.arrival(cng_ix(peak_ix))+abs(s.optbuf(cng_ix(peak_ix)))-send_t(cng_ix(peak_ix)),...
-            'r.');
-        h2=plot(send_t(cng_ix(no_peak_ix))/1000,...
-            s.arrival(cng_ix(no_peak_ix))+abs(s.optbuf(cng_ix(no_peak_ix)))-send_t(cng_ix(no_peak_ix)),...
-            'g.');
-        set([h1, h2],'markersize',1)
-    end
-    %h=plot(send_t(seq_ix)/1000,s.decode+s.playout_delay-send_t(seq_ix));
-    h=plot(send_t(cng_ix)/1000,s.decode(cng_ix)+s.playout_delay(cng_ix)-send_t(cng_ix));
-    set(h,'linew',1.5);
-    hold off
-    ax1=axis;
-    axis tight
-    ax2=axis;
-    axis([ax2(1:3) ax1(4)])
-end
-
-
-% calculate delays and other parameters
-
-delayskip_ix = find(send_t-send_t(1)>=delayskip*1000, 1 );
-
-use_ix = intersect(cng_ix,... % use those that are not CNG/SID frames...
-    intersect(find(isfinite(s.decode)),... % ... that did arrive ...
-    (delayskip_ix:length(s.decode))')); % ... and are sent after delayskip seconds
-
-mean_delay = mean(s.decode(use_ix)+s.playout_delay(use_ix)-send_t(use_ix));
-neteq_delay = mean(s.decode(use_ix)+s.playout_delay(use_ix)-s.arrival(use_ix));
-
-Npack=max(s.sn(delayskip_ix:end))-min(s.sn(delayskip_ix:end))+1;
-nw_lossrate=(Npack-length(s.sn(delayskip_ix:end)))/Npack;
-neteq_lossrate=(length(s.sn(delayskip_ix:end))-length(use_ix))/Npack;
-
-delay_struct=struct('mean_delay',mean_delay,'neteq_delay',neteq_delay,...
-    'nw_lossrate',nw_lossrate,'neteq_lossrate',neteq_lossrate,...
-    'tot_expand',round(s.tot_expand),'tot_accelerate',round(s.tot_accelerate),...
-    'tot_preemptive',round(s.tot_preemptive),'tot_time',tot_time,...
-    'filename',delayfile,'units','ms','fs',unique(s.fs));
-    
-if not(isempty(delaypoints))
-    delayvalues=interp1(send_t(cng_ix),...
-        s.decode(cng_ix)+s.playout_delay(cng_ix)-send_t(cng_ix),...
-        delaypoints,'nearest',NaN);
-else
-    delayvalues=[];
-end
-
-
-
-% SUBFUNCTIONS %
-
-function y=unwrap_seqno(x)
-
-jumps=find(abs((diff(x)-1))>65000);
-
-while ~isempty(jumps)
-    n=jumps(1);
-    if x(n+1)-x(n) < 0
-        % negative jump
-        x(n+1:end)=x(n+1:end)+65536;
-    else
-        % positive jump
-        x(n+1:end)=x(n+1:end)-65536;
-    end
-    
-    jumps=find(abs((diff(x(n+1:end))-1))>65000);
-end
-
-y=x;
-
-return;
diff --git a/modules/audio_coding/neteq/test/neteq_ilbc_quality_test.cc b/modules/audio_coding/neteq/test/neteq_ilbc_quality_test.cc
deleted file mode 100644
index 2f8ca1b..0000000
--- a/modules/audio_coding/neteq/test/neteq_ilbc_quality_test.cc
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- *  Copyright (c) 2015 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 <memory>
-
-#include "webrtc/modules/audio_coding/codecs/ilbc/audio_encoder_ilbc.h"
-#include "webrtc/modules/audio_coding/neteq/tools/neteq_quality_test.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/flags.h"
-#include "webrtc/rtc_base/safe_conversions.h"
-#include "webrtc/test/testsupport/fileutils.h"
-
-using testing::InitGoogleTest;
-
-namespace webrtc {
-namespace test {
-namespace {
-static const int kInputSampleRateKhz = 8;
-static const int kOutputSampleRateKhz = 8;
-
-DEFINE_int(frame_size_ms, 20, "Codec frame size (milliseconds).");
-
-}  // namespace
-
-class NetEqIlbcQualityTest : public NetEqQualityTest {
- protected:
-  NetEqIlbcQualityTest()
-      : NetEqQualityTest(FLAG_frame_size_ms,
-                         kInputSampleRateKhz,
-                         kOutputSampleRateKhz,
-                         NetEqDecoder::kDecoderILBC) {
-    // Flag validation
-    RTC_CHECK(FLAG_frame_size_ms == 20 || FLAG_frame_size_ms == 30 ||
-              FLAG_frame_size_ms == 40 || FLAG_frame_size_ms == 60)
-        << "Invalid frame size, should be 20, 30, 40, or 60 ms.";
-  }
-
-  void SetUp() override {
-    ASSERT_EQ(1u, channels_) << "iLBC supports only mono audio.";
-    AudioEncoderIlbcConfig config;
-    config.frame_size_ms = FLAG_frame_size_ms;
-    encoder_.reset(new AudioEncoderIlbcImpl(config, 102));
-    NetEqQualityTest::SetUp();
-  }
-
-  int EncodeBlock(int16_t* in_data,
-                  size_t block_size_samples,
-                  rtc::Buffer* payload, size_t max_bytes) override {
-    const size_t kFrameSizeSamples = 80;  // Samples per 10 ms.
-    size_t encoded_samples = 0;
-    uint32_t dummy_timestamp = 0;
-    AudioEncoder::EncodedInfo info;
-    do {
-      info = encoder_->Encode(dummy_timestamp,
-                              rtc::ArrayView<const int16_t>(
-                                  in_data + encoded_samples, kFrameSizeSamples),
-                              payload);
-      encoded_samples += kFrameSizeSamples;
-    } while (info.encoded_bytes == 0);
-    return rtc::checked_cast<int>(info.encoded_bytes);
-  }
-
- private:
-  std::unique_ptr<AudioEncoderIlbcImpl> encoder_;
-};
-
-TEST_F(NetEqIlbcQualityTest, Test) {
-  Simulate();
-}
-
-}  // namespace test
-}  // namespace webrtc
diff --git a/modules/audio_coding/neteq/test/neteq_isac_quality_test.cc b/modules/audio_coding/neteq/test/neteq_isac_quality_test.cc
deleted file mode 100644
index 5a73a6a..0000000
--- a/modules/audio_coding/neteq/test/neteq_isac_quality_test.cc
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- *  Copyright (c) 2014 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/codecs/isac/fix/include/isacfix.h"
-#include "webrtc/modules/audio_coding/neteq/tools/neteq_quality_test.h"
-#include "webrtc/rtc_base/flags.h"
-
-using testing::InitGoogleTest;
-
-namespace webrtc {
-namespace test {
-namespace {
-static const int kIsacBlockDurationMs = 30;
-static const int kIsacInputSamplingKhz = 16;
-static const int kIsacOutputSamplingKhz = 16;
-
-DEFINE_int(bit_rate_kbps, 32, "Target bit rate (kbps).");
-
-}  // namespace
-
-class NetEqIsacQualityTest : public NetEqQualityTest {
- protected:
-  NetEqIsacQualityTest();
-  void SetUp() override;
-  void TearDown() override;
-  int EncodeBlock(int16_t* in_data, size_t block_size_samples,
-                  rtc::Buffer* payload, size_t max_bytes) override;
- private:
-  ISACFIX_MainStruct* isac_encoder_;
-  int bit_rate_kbps_;
-};
-
-NetEqIsacQualityTest::NetEqIsacQualityTest()
-    : NetEqQualityTest(kIsacBlockDurationMs,
-                       kIsacInputSamplingKhz,
-                       kIsacOutputSamplingKhz,
-                       NetEqDecoder::kDecoderISAC),
-      isac_encoder_(NULL),
-      bit_rate_kbps_(FLAG_bit_rate_kbps) {
-    // Flag validation
-    RTC_CHECK(FLAG_bit_rate_kbps >= 10 && FLAG_bit_rate_kbps <= 32)
-        << "Invalid bit rate, should be between 10 and 32 kbps.";
-  }
-
-void NetEqIsacQualityTest::SetUp() {
-  ASSERT_EQ(1u, channels_) << "iSAC supports only mono audio.";
-  // Create encoder memory.
-  WebRtcIsacfix_Create(&isac_encoder_);
-  ASSERT_TRUE(isac_encoder_ != NULL);
-  EXPECT_EQ(0, WebRtcIsacfix_EncoderInit(isac_encoder_, 1));
-  // Set bitrate and block length.
-  EXPECT_EQ(0, WebRtcIsacfix_Control(isac_encoder_, bit_rate_kbps_ * 1000,
-                                     kIsacBlockDurationMs));
-  NetEqQualityTest::SetUp();
-}
-
-void NetEqIsacQualityTest::TearDown() {
-  // Free memory.
-  EXPECT_EQ(0, WebRtcIsacfix_Free(isac_encoder_));
-  NetEqQualityTest::TearDown();
-}
-
-int NetEqIsacQualityTest::EncodeBlock(int16_t* in_data,
-                                      size_t block_size_samples,
-                                      rtc::Buffer* payload, size_t max_bytes) {
-  // ISAC takes 10 ms for every call.
-  const int subblocks = kIsacBlockDurationMs / 10;
-  const int subblock_length = 10 * kIsacInputSamplingKhz;
-  int value = 0;
-
-  int pointer = 0;
-  for (int idx = 0; idx < subblocks; idx++, pointer += subblock_length) {
-    // The Isac encoder does not perform encoding (and returns 0) until it
-    // receives a sequence of sub-blocks that amount to the frame duration.
-    EXPECT_EQ(0, value);
-    payload->AppendData(max_bytes, [&] (rtc::ArrayView<uint8_t> payload) {
-        value = WebRtcIsacfix_Encode(isac_encoder_, &in_data[pointer],
-                                     payload.data());
-        return (value >= 0) ? static_cast<size_t>(value) : 0;
-      });
-  }
-  EXPECT_GT(value, 0);
-  return value;
-}
-
-TEST_F(NetEqIsacQualityTest, Test) {
-  Simulate();
-}
-
-}  // namespace test
-}  // namespace webrtc
diff --git a/modules/audio_coding/neteq/test/neteq_opus_quality_test.cc b/modules/audio_coding/neteq/test/neteq_opus_quality_test.cc
deleted file mode 100644
index f4edf37..0000000
--- a/modules/audio_coding/neteq/test/neteq_opus_quality_test.cc
+++ /dev/null
@@ -1,174 +0,0 @@
-/*
- *  Copyright (c) 2014 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/codecs/opus/opus_interface.h"
-#include "webrtc/modules/audio_coding/codecs/opus/opus_inst.h"
-#include "webrtc/modules/audio_coding/neteq/tools/neteq_quality_test.h"
-#include "webrtc/rtc_base/flags.h"
-
-using testing::InitGoogleTest;
-
-namespace webrtc {
-namespace test {
-namespace {
-
-static const int kOpusBlockDurationMs = 20;
-static const int kOpusSamplingKhz = 48;
-
-DEFINE_int(bit_rate_kbps, 32, "Target bit rate (kbps).");
-
-DEFINE_int(complexity, 10, "Complexity: 0 ~ 10 -- defined as in Opus"
-    "specification.");
-
-DEFINE_int(maxplaybackrate, 48000, "Maximum playback rate (Hz).");
-
-DEFINE_int(application, 0, "Application mode: 0 -- VOIP, 1 -- Audio.");
-
-DEFINE_int(reported_loss_rate, 10, "Reported percentile of packet loss.");
-
-DEFINE_bool(fec, false, "Enable FEC for encoding (-nofec to disable).");
-
-DEFINE_bool(dtx, false, "Enable DTX for encoding (-nodtx to disable).");
-
-DEFINE_int(sub_packets, 1, "Number of sub packets to repacketize.");
-
-}  // namespace
-
-class NetEqOpusQualityTest : public NetEqQualityTest {
- protected:
-  NetEqOpusQualityTest();
-  void SetUp() override;
-  void TearDown() override;
-  int EncodeBlock(int16_t* in_data, size_t block_size_samples,
-                  rtc::Buffer* payload, size_t max_bytes) override;
- private:
-  WebRtcOpusEncInst* opus_encoder_;
-  OpusRepacketizer* repacketizer_;
-  size_t sub_block_size_samples_;
-  int bit_rate_kbps_;
-  bool fec_;
-  bool dtx_;
-  int complexity_;
-  int maxplaybackrate_;
-  int target_loss_rate_;
-  int sub_packets_;
-  int application_;
-};
-
-NetEqOpusQualityTest::NetEqOpusQualityTest()
-    : NetEqQualityTest(kOpusBlockDurationMs * FLAG_sub_packets,
-                       kOpusSamplingKhz,
-                       kOpusSamplingKhz,
-                       NetEqDecoder::kDecoderOpus),
-      opus_encoder_(NULL),
-      repacketizer_(NULL),
-      sub_block_size_samples_(
-          static_cast<size_t>(kOpusBlockDurationMs * kOpusSamplingKhz)),
-      bit_rate_kbps_(FLAG_bit_rate_kbps),
-      fec_(FLAG_fec),
-      dtx_(FLAG_dtx),
-      complexity_(FLAG_complexity),
-      maxplaybackrate_(FLAG_maxplaybackrate),
-      target_loss_rate_(FLAG_reported_loss_rate),
-      sub_packets_(FLAG_sub_packets) {
-  // Flag validation
-  RTC_CHECK(FLAG_bit_rate_kbps >= 6 && FLAG_bit_rate_kbps <= 510)
-      << "Invalid bit rate, should be between 6 and 510 kbps.";
-
-  RTC_CHECK(FLAG_complexity >= -1 && FLAG_complexity <= 10)
-      << "Invalid complexity setting, should be between 0 and 10.";
-
-  RTC_CHECK(FLAG_application == 0 || FLAG_application == 1)
-      << "Invalid application mode, should be 0 or 1.";
-
-  RTC_CHECK(FLAG_reported_loss_rate >= 0 && FLAG_reported_loss_rate <= 100)
-      << "Invalid packet loss percentile, should be between 0 and 100.";
-
-  RTC_CHECK(FLAG_sub_packets >= 1 && FLAG_sub_packets <= 3)
-      << "Invalid number of sub packets, should be between 1 and 3.";
-
-  // Redefine decoder type if input is stereo.
-  if (channels_ > 1) {
-    decoder_type_ = NetEqDecoder::kDecoderOpus_2ch;
-  }
-  application_ = FLAG_application;
-}
-
-void NetEqOpusQualityTest::SetUp() {
-  // Create encoder memory.
-  WebRtcOpus_EncoderCreate(&opus_encoder_, channels_, application_);
-  ASSERT_TRUE(opus_encoder_);
-
-  // Create repacketizer.
-  repacketizer_ = opus_repacketizer_create();
-  ASSERT_TRUE(repacketizer_);
-
-  // Set bitrate.
-  EXPECT_EQ(0, WebRtcOpus_SetBitRate(opus_encoder_, bit_rate_kbps_ * 1000));
-  if (fec_) {
-    EXPECT_EQ(0, WebRtcOpus_EnableFec(opus_encoder_));
-  }
-  if (dtx_) {
-    EXPECT_EQ(0, WebRtcOpus_EnableDtx(opus_encoder_));
-  }
-  EXPECT_EQ(0, WebRtcOpus_SetComplexity(opus_encoder_, complexity_));
-  EXPECT_EQ(0, WebRtcOpus_SetMaxPlaybackRate(opus_encoder_, maxplaybackrate_));
-  EXPECT_EQ(0, WebRtcOpus_SetPacketLossRate(opus_encoder_,
-                                            target_loss_rate_));
-  NetEqQualityTest::SetUp();
-}
-
-void NetEqOpusQualityTest::TearDown() {
-  // Free memory.
-  EXPECT_EQ(0, WebRtcOpus_EncoderFree(opus_encoder_));
-  opus_repacketizer_destroy(repacketizer_);
-  NetEqQualityTest::TearDown();
-}
-
-int NetEqOpusQualityTest::EncodeBlock(int16_t* in_data,
-                                      size_t block_size_samples,
-                                      rtc::Buffer* payload, size_t max_bytes) {
-  EXPECT_EQ(block_size_samples, sub_block_size_samples_ * sub_packets_);
-  int16_t* pointer = in_data;
-  int value;
-  opus_repacketizer_init(repacketizer_);
-  for (int idx = 0; idx < sub_packets_; idx++) {
-    payload->AppendData(max_bytes, [&] (rtc::ArrayView<uint8_t> payload) {
-        value = WebRtcOpus_Encode(opus_encoder_,
-                                  pointer, sub_block_size_samples_,
-                                  max_bytes, payload.data());
-
-        Log() << "Encoded a frame with Opus mode "
-              << (value == 0 ? 0 : payload[0] >> 3)
-              << std::endl;
-
-        return (value >= 0) ? static_cast<size_t>(value) : 0;
-      });
-
-    if (OPUS_OK != opus_repacketizer_cat(repacketizer_,
-                                         payload->data(), value)) {
-      opus_repacketizer_init(repacketizer_);
-      // If the repacketization fails, we discard this frame.
-      return 0;
-    }
-    pointer += sub_block_size_samples_ * channels_;
-  }
-  value = opus_repacketizer_out(repacketizer_, payload->data(),
-                                static_cast<opus_int32>(max_bytes));
-  EXPECT_GE(value, 0);
-  return value;
-}
-
-TEST_F(NetEqOpusQualityTest, Test) {
-  Simulate();
-}
-
-}  // namespace test
-}  // namespace webrtc
diff --git a/modules/audio_coding/neteq/test/neteq_pcmu_quality_test.cc b/modules/audio_coding/neteq/test/neteq_pcmu_quality_test.cc
deleted file mode 100644
index 5ea9056..0000000
--- a/modules/audio_coding/neteq/test/neteq_pcmu_quality_test.cc
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- *  Copyright (c) 2015 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 <memory>
-
-#include "webrtc/modules/audio_coding/codecs/g711/audio_encoder_pcm.h"
-#include "webrtc/modules/audio_coding/neteq/tools/neteq_quality_test.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/flags.h"
-#include "webrtc/rtc_base/safe_conversions.h"
-#include "webrtc/test/testsupport/fileutils.h"
-
-using testing::InitGoogleTest;
-
-namespace webrtc {
-namespace test {
-namespace {
-static const int kInputSampleRateKhz = 8;
-static const int kOutputSampleRateKhz = 8;
-
-DEFINE_int(frame_size_ms, 20, "Codec frame size (milliseconds).");
-
-}  // namespace
-
-class NetEqPcmuQualityTest : public NetEqQualityTest {
- protected:
-  NetEqPcmuQualityTest()
-      : NetEqQualityTest(FLAG_frame_size_ms,
-                         kInputSampleRateKhz,
-                         kOutputSampleRateKhz,
-                         NetEqDecoder::kDecoderPCMu) {
-    // Flag validation
-    RTC_CHECK(FLAG_frame_size_ms >= 10 && FLAG_frame_size_ms <= 60 &&
-              (FLAG_frame_size_ms % 10) == 0)
-        << "Invalid frame size, should be 10, 20, ..., 60 ms.";
-  }
-
-  void SetUp() override {
-    ASSERT_EQ(1u, channels_) << "PCMu supports only mono audio.";
-    AudioEncoderPcmU::Config config;
-    config.frame_size_ms = FLAG_frame_size_ms;
-    encoder_.reset(new AudioEncoderPcmU(config));
-    NetEqQualityTest::SetUp();
-  }
-
-  int EncodeBlock(int16_t* in_data,
-                  size_t block_size_samples,
-                  rtc::Buffer* payload, size_t max_bytes) override {
-    const size_t kFrameSizeSamples = 80;  // Samples per 10 ms.
-    size_t encoded_samples = 0;
-    uint32_t dummy_timestamp = 0;
-    AudioEncoder::EncodedInfo info;
-    do {
-      info = encoder_->Encode(dummy_timestamp,
-                              rtc::ArrayView<const int16_t>(
-                                  in_data + encoded_samples, kFrameSizeSamples),
-                              payload);
-      encoded_samples += kFrameSizeSamples;
-    } while (info.encoded_bytes == 0);
-    return rtc::checked_cast<int>(info.encoded_bytes);
-  }
-
- private:
-  std::unique_ptr<AudioEncoderPcmU> encoder_;
-};
-
-TEST_F(NetEqPcmuQualityTest, Test) {
-  Simulate();
-}
-
-}  // namespace test
-}  // namespace webrtc
diff --git a/modules/audio_coding/neteq/test/neteq_performance_unittest.cc b/modules/audio_coding/neteq/test/neteq_performance_unittest.cc
deleted file mode 100644
index e64def4..0000000
--- a/modules/audio_coding/neteq/test/neteq_performance_unittest.cc
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- *  Copyright (c) 2014 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/neteq/tools/neteq_performance_test.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/testsupport/perf_test.h"
-#include "webrtc/typedefs.h"
-#include "webrtc/system_wrappers/include/field_trial.h"
-
-// Runs a test with 10% packet losses and 10% clock drift, to exercise
-// both loss concealment and time-stretching code.
-TEST(NetEqPerformanceTest, Run) {
-  const int kSimulationTimeMs = 10000000;
-  const int kQuickSimulationTimeMs = 100000;
-  const int kLossPeriod = 10;  // Drop every 10th packet.
-  const double kDriftFactor = 0.1;
-  int64_t runtime = webrtc::test::NetEqPerformanceTest::Run(
-      webrtc::field_trial::IsEnabled("WebRTC-QuickPerfTest")
-          ? kQuickSimulationTimeMs
-          : kSimulationTimeMs,
-      kLossPeriod, kDriftFactor);
-  ASSERT_GT(runtime, 0);
-  webrtc::test::PrintResult(
-      "neteq_performance", "", "10_pl_10_drift", runtime, "ms", true);
-}
-
-// Runs a test with neither packet losses nor clock drift, to put
-// emphasis on the "good-weather" code path, which is presumably much
-// more lightweight.
-TEST(NetEqPerformanceTest, RunClean) {
-  const int kSimulationTimeMs = 10000000;
-  const int kQuickSimulationTimeMs = 100000;
-  const int kLossPeriod = 0;  // No losses.
-  const double kDriftFactor = 0.0;  // No clock drift.
-  int64_t runtime = webrtc::test::NetEqPerformanceTest::Run(
-      webrtc::field_trial::IsEnabled("WebRTC-QuickPerfTest")
-          ? kQuickSimulationTimeMs
-          : kSimulationTimeMs,
-      kLossPeriod, kDriftFactor);
-  ASSERT_GT(runtime, 0);
-  webrtc::test::PrintResult(
-      "neteq_performance", "", "0_pl_0_drift", runtime, "ms", true);
-}
diff --git a/modules/audio_coding/neteq/test/neteq_speed_test.cc b/modules/audio_coding/neteq/test/neteq_speed_test.cc
deleted file mode 100644
index c58381f..0000000
--- a/modules/audio_coding/neteq/test/neteq_speed_test.cc
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- *  Copyright (c) 2013 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 <stdio.h>
-
-#include <iostream>
-
-#include "webrtc/modules/audio_coding/neteq/tools/neteq_performance_test.h"
-#include "webrtc/rtc_base/flags.h"
-#include "webrtc/test/testsupport/fileutils.h"
-#include "webrtc/typedefs.h"
-
-// Define command line flags.
-DEFINE_int(runtime_ms, 10000, "Simulated runtime in ms.");
-DEFINE_int(lossrate, 10,
-           "Packet lossrate; drop every N packets.");
-DEFINE_float(drift, 0.1f,
-             "Clockdrift factor.");
-DEFINE_bool(help, false, "Print this message.");
-
-int main(int argc, char* argv[]) {
-  std::string program_name = argv[0];
-  std::string usage = "Tool for measuring the speed of NetEq.\n"
-      "Usage: " + program_name + " [options]\n\n"
-      "  --runtime_ms=N         runtime in ms; default is 10000 ms\n"
-      "  --lossrate=N           drop every N packets; default is 10\n"
-      "  --drift=F              clockdrift factor between 0.0 and 1.0; "
-      "default is 0.1\n";
-  webrtc::test::SetExecutablePath(argv[0]);
-  if (rtc::FlagList::SetFlagsFromCommandLine(&argc, argv, true) ||
-      FLAG_help || argc != 1) {
-    printf("%s", usage.c_str());
-    if (FLAG_help) {
-      rtc::FlagList::Print(nullptr, false);
-      return 0;
-    }
-    return 1;
-  }
-  RTC_CHECK_GT(FLAG_runtime_ms, 0);
-  RTC_CHECK_GE(FLAG_lossrate, 0);
-  RTC_CHECK(FLAG_drift >= 0.0 && FLAG_drift < 1.0);
-
-  int64_t result =
-      webrtc::test::NetEqPerformanceTest::Run(FLAG_runtime_ms, FLAG_lossrate,
-                                              FLAG_drift);
-  if (result <= 0) {
-    std::cout << "There was an error" << std::endl;
-    return -1;
-  }
-
-  std::cout << "Simulation done" << std::endl;
-  std::cout << "Runtime = " << result << " ms" << std::endl;
-  return 0;
-}
diff --git a/modules/audio_coding/neteq/tick_timer.cc b/modules/audio_coding/neteq/tick_timer.cc
deleted file mode 100644
index 4a1b9b7..0000000
--- a/modules/audio_coding/neteq/tick_timer.cc
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- *  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/neteq/tick_timer.h"
-
-namespace webrtc {
-
-TickTimer::Stopwatch::Stopwatch(const TickTimer& ticktimer)
-    : ticktimer_(ticktimer), starttick_(ticktimer.ticks()) {}
-
-TickTimer::Countdown::Countdown(const TickTimer& ticktimer,
-                                uint64_t ticks_to_count)
-    : stopwatch_(ticktimer.GetNewStopwatch()),
-      ticks_to_count_(ticks_to_count) {}
-
-TickTimer::Countdown::~Countdown() = default;
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/neteq/tick_timer.h b/modules/audio_coding/neteq/tick_timer.h
deleted file mode 100644
index 55e9eab..0000000
--- a/modules/audio_coding/neteq/tick_timer.h
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- *  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_NETEQ_TICK_TIMER_H_
-#define WEBRTC_MODULES_AUDIO_CODING_NETEQ_TICK_TIMER_H_
-
-#include <memory>
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-// Implements a time counter. The counter is advanced with the Increment()
-// methods, and is queried with the ticks() accessor. It is assumed that one
-// "tick" och the counter corresponds to 10 ms.
-// A TickTimer object can provide two types of associated time-measuring
-// objects: Stopwatch and Countdown.
-class TickTimer {
- public:
-  // Stopwatch measures time elapsed since it was started, by querying the
-  // associated TickTimer for the current time. The intended use is to request a
-  // new Stopwatch object from a TickTimer object with the GetNewStopwatch()
-  // method. Note: since the Stopwatch object contains a reference to the
-  // TickTimer it is associated with, it cannot outlive the TickTimer.
-  class Stopwatch {
-   public:
-    explicit Stopwatch(const TickTimer& ticktimer);
-
-    uint64_t ElapsedTicks() const { return ticktimer_.ticks() - starttick_; }
-
-    uint64_t ElapsedMs() const {
-      const uint64_t elapsed_ticks = ticktimer_.ticks() - starttick_;
-      const int ms_per_tick = ticktimer_.ms_per_tick();
-      return elapsed_ticks < UINT64_MAX / ms_per_tick
-                 ? elapsed_ticks * ms_per_tick
-                 : UINT64_MAX;
-    }
-
-   private:
-    const TickTimer& ticktimer_;
-    const uint64_t starttick_;
-  };
-
-  // Countdown counts down from a given start value with each tick of the
-  // associated TickTimer, until zero is reached. The Finished() method will
-  // return true if zero has been reached, false otherwise. The intended use is
-  // to request a new Countdown object from a TickTimer object with the
-  // GetNewCountdown() method. Note: since the Countdown object contains a
-  // reference to the TickTimer it is associated with, it cannot outlive the
-  // TickTimer.
-  class Countdown {
-   public:
-    Countdown(const TickTimer& ticktimer, uint64_t ticks_to_count);
-
-    ~Countdown();
-
-    bool Finished() const {
-      return stopwatch_->ElapsedTicks() >= ticks_to_count_;
-    }
-
-   private:
-    const std::unique_ptr<Stopwatch> stopwatch_;
-    const uint64_t ticks_to_count_;
-  };
-
-  TickTimer() : TickTimer(10) {}
-  explicit TickTimer(int ms_per_tick) : ms_per_tick_(ms_per_tick) {
-    RTC_DCHECK_GT(ms_per_tick_, 0);
-  }
-
-  void Increment() { ++ticks_; }
-
-  // Mainly intended for testing.
-  void Increment(uint64_t x) { ticks_ += x; }
-
-  uint64_t ticks() const { return ticks_; }
-
-  int ms_per_tick() const { return ms_per_tick_; }
-
-  // Returns a new Stopwatch object, based on the current TickTimer. Note that
-  // the new Stopwatch object contains a reference to the current TickTimer,
-  // and must therefore not outlive the TickTimer.
-  std::unique_ptr<Stopwatch> GetNewStopwatch() const {
-    return std::unique_ptr<Stopwatch>(new Stopwatch(*this));
-  }
-
-  // Returns a new Countdown object, based on the current TickTimer. Note that
-  // the new Countdown object contains a reference to the current TickTimer,
-  // and must therefore not outlive the TickTimer.
-  std::unique_ptr<Countdown> GetNewCountdown(uint64_t ticks_to_count) const {
-    return std::unique_ptr<Countdown>(new Countdown(*this, ticks_to_count));
-  }
-
- private:
-  uint64_t ticks_ = 0;
-  const int ms_per_tick_;
-  RTC_DISALLOW_COPY_AND_ASSIGN(TickTimer);
-};
-
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_AUDIO_CODING_NETEQ_TICK_TIMER_H_
diff --git a/modules/audio_coding/neteq/tick_timer_unittest.cc b/modules/audio_coding/neteq/tick_timer_unittest.cc
deleted file mode 100644
index 6f338d1..0000000
--- a/modules/audio_coding/neteq/tick_timer_unittest.cc
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
- *  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 <memory>
-
-#include "webrtc/modules/audio_coding/neteq/tick_timer.h"
-
-#include "webrtc/test/gmock.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-// Verify that the default value for ms_per_tick is 10.
-TEST(TickTimer, DefaultMsPerTick) {
-  TickTimer tt;
-  EXPECT_EQ(10, tt.ms_per_tick());
-}
-
-TEST(TickTimer, CustomMsPerTick) {
-  TickTimer tt(17);
-  EXPECT_EQ(17, tt.ms_per_tick());
-}
-
-TEST(TickTimer, Increment) {
-  TickTimer tt;
-  EXPECT_EQ(0u, tt.ticks());
-  tt.Increment();
-  EXPECT_EQ(1u, tt.ticks());
-
-  for (int i = 0; i < 17; ++i) {
-    tt.Increment();
-  }
-  EXPECT_EQ(18u, tt.ticks());
-
-  tt.Increment(17);
-  EXPECT_EQ(35u, tt.ticks());
-}
-
-TEST(TickTimer, WrapAround) {
-  TickTimer tt;
-  tt.Increment(UINT64_MAX);
-  EXPECT_EQ(UINT64_MAX, tt.ticks());
-  tt.Increment();
-  EXPECT_EQ(0u, tt.ticks());
-}
-
-TEST(TickTimer, Stopwatch) {
-  TickTimer tt;
-  // Increment it a "random" number of steps.
-  tt.Increment(17);
-
-  std::unique_ptr<TickTimer::Stopwatch> sw = tt.GetNewStopwatch();
-  ASSERT_TRUE(sw);
-
-  EXPECT_EQ(0u, sw->ElapsedTicks());  // Starts at zero.
-  EXPECT_EQ(0u, sw->ElapsedMs());
-  tt.Increment();
-  EXPECT_EQ(1u, sw->ElapsedTicks());  // Increases with the TickTimer.
-  EXPECT_EQ(10u, sw->ElapsedMs());
-}
-
-TEST(TickTimer, StopwatchWrapAround) {
-  TickTimer tt;
-  tt.Increment(UINT64_MAX);
-
-  std::unique_ptr<TickTimer::Stopwatch> sw = tt.GetNewStopwatch();
-  ASSERT_TRUE(sw);
-
-  tt.Increment();
-  EXPECT_EQ(0u, tt.ticks());
-  EXPECT_EQ(1u, sw->ElapsedTicks());
-  EXPECT_EQ(10u, sw->ElapsedMs());
-
-  tt.Increment();
-  EXPECT_EQ(1u, tt.ticks());
-  EXPECT_EQ(2u, sw->ElapsedTicks());
-  EXPECT_EQ(20u, sw->ElapsedMs());
-}
-
-TEST(TickTimer, StopwatchMsOverflow) {
-  TickTimer tt;
-  std::unique_ptr<TickTimer::Stopwatch> sw = tt.GetNewStopwatch();
-  ASSERT_TRUE(sw);
-
-  tt.Increment(UINT64_MAX / 10);
-  EXPECT_EQ(UINT64_MAX, sw->ElapsedMs());
-
-  tt.Increment();
-  EXPECT_EQ(UINT64_MAX, sw->ElapsedMs());
-
-  tt.Increment(UINT64_MAX - tt.ticks());
-  EXPECT_EQ(UINT64_MAX, tt.ticks());
-  EXPECT_EQ(UINT64_MAX, sw->ElapsedMs());
-}
-
-TEST(TickTimer, StopwatchWithCustomTicktime) {
-  const int kMsPerTick = 17;
-  TickTimer tt(kMsPerTick);
-  std::unique_ptr<TickTimer::Stopwatch> sw = tt.GetNewStopwatch();
-  ASSERT_TRUE(sw);
-
-  EXPECT_EQ(0u, sw->ElapsedMs());
-  tt.Increment();
-  EXPECT_EQ(static_cast<uint64_t>(kMsPerTick), sw->ElapsedMs());
-}
-
-TEST(TickTimer, Countdown) {
-  TickTimer tt;
-  // Increment it a "random" number of steps.
-  tt.Increment(4711);
-
-  std::unique_ptr<TickTimer::Countdown> cd = tt.GetNewCountdown(17);
-  ASSERT_TRUE(cd);
-
-  EXPECT_FALSE(cd->Finished());
-  tt.Increment();
-  EXPECT_FALSE(cd->Finished());
-
-  tt.Increment(16);  // Total increment is now 17.
-  EXPECT_TRUE(cd->Finished());
-
-  // Further increments do not change the state.
-  tt.Increment();
-  EXPECT_TRUE(cd->Finished());
-  tt.Increment(1234);
-  EXPECT_TRUE(cd->Finished());
-}
-}  // namespace webrtc
diff --git a/modules/audio_coding/neteq/time_stretch.cc b/modules/audio_coding/neteq/time_stretch.cc
deleted file mode 100644
index 630051b..0000000
--- a/modules/audio_coding/neteq/time_stretch.cc
+++ /dev/null
@@ -1,214 +0,0 @@
-/*
- *  Copyright (c) 2012 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/neteq/time_stretch.h"
-
-#include <algorithm>  // min, max
-#include <memory>
-
-#include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
-#include "webrtc/modules/audio_coding/neteq/background_noise.h"
-#include "webrtc/modules/audio_coding/neteq/cross_correlation.h"
-#include "webrtc/modules/audio_coding/neteq/dsp_helper.h"
-#include "webrtc/rtc_base/safe_conversions.h"
-
-namespace webrtc {
-
-TimeStretch::ReturnCodes TimeStretch::Process(const int16_t* input,
-                                              size_t input_len,
-                                              bool fast_mode,
-                                              AudioMultiVector* output,
-                                              size_t* length_change_samples) {
-  // Pre-calculate common multiplication with |fs_mult_|.
-  size_t fs_mult_120 =
-      static_cast<size_t>(fs_mult_ * 120);  // Corresponds to 15 ms.
-
-  const int16_t* signal;
-  std::unique_ptr<int16_t[]> signal_array;
-  size_t signal_len;
-  if (num_channels_ == 1) {
-    signal = input;
-    signal_len = input_len;
-  } else {
-    // We want |signal| to be only the first channel of |input|, which is
-    // interleaved. Thus, we take the first sample, skip forward |num_channels|
-    // samples, and continue like that.
-    signal_len = input_len / num_channels_;
-    signal_array.reset(new int16_t[signal_len]);
-    signal = signal_array.get();
-    size_t j = master_channel_;
-    for (size_t i = 0; i < signal_len; ++i) {
-      signal_array[i] = input[j];
-      j += num_channels_;
-    }
-  }
-
-  // Find maximum absolute value of input signal.
-  max_input_value_ = WebRtcSpl_MaxAbsValueW16(signal, signal_len);
-
-  // Downsample to 4 kHz sample rate and calculate auto-correlation.
-  DspHelper::DownsampleTo4kHz(signal, signal_len, kDownsampledLen,
-                              sample_rate_hz_, true /* compensate delay*/,
-                              downsampled_input_);
-  AutoCorrelation();
-
-  // Find the strongest correlation peak.
-  static const size_t kNumPeaks = 1;
-  size_t peak_index;
-  int16_t peak_value;
-  DspHelper::PeakDetection(auto_correlation_, kCorrelationLen, kNumPeaks,
-                           fs_mult_, &peak_index, &peak_value);
-  // Assert that |peak_index| stays within boundaries.
-  assert(peak_index <= (2 * kCorrelationLen - 1) * fs_mult_);
-
-  // Compensate peak_index for displaced starting position. The displacement
-  // happens in AutoCorrelation(). Here, |kMinLag| is in the down-sampled 4 kHz
-  // domain, while the |peak_index| is in the original sample rate; hence, the
-  // multiplication by fs_mult_ * 2.
-  peak_index += kMinLag * fs_mult_ * 2;
-  // Assert that |peak_index| stays within boundaries.
-  assert(peak_index >= static_cast<size_t>(20 * fs_mult_));
-  assert(peak_index <= 20 * fs_mult_ + (2 * kCorrelationLen - 1) * fs_mult_);
-
-  // Calculate scaling to ensure that |peak_index| samples can be square-summed
-  // without overflowing.
-  int scaling = 31 - WebRtcSpl_NormW32(max_input_value_ * max_input_value_) -
-      WebRtcSpl_NormW32(static_cast<int32_t>(peak_index));
-  scaling = std::max(0, scaling);
-
-  // |vec1| starts at 15 ms minus one pitch period.
-  const int16_t* vec1 = &signal[fs_mult_120 - peak_index];
-  // |vec2| start at 15 ms.
-  const int16_t* vec2 = &signal[fs_mult_120];
-  // Calculate energies for |vec1| and |vec2|, assuming they both contain
-  // |peak_index| samples.
-  int32_t vec1_energy =
-      WebRtcSpl_DotProductWithScale(vec1, vec1, peak_index, scaling);
-  int32_t vec2_energy =
-      WebRtcSpl_DotProductWithScale(vec2, vec2, peak_index, scaling);
-
-  // Calculate cross-correlation between |vec1| and |vec2|.
-  int32_t cross_corr =
-      WebRtcSpl_DotProductWithScale(vec1, vec2, peak_index, scaling);
-
-  // Check if the signal seems to be active speech or not (simple VAD).
-  bool active_speech = SpeechDetection(vec1_energy, vec2_energy, peak_index,
-                                       scaling);
-
-  int16_t best_correlation;
-  if (!active_speech) {
-    SetParametersForPassiveSpeech(signal_len, &best_correlation, &peak_index);
-  } else {
-    // Calculate correlation:
-    // cross_corr / sqrt(vec1_energy * vec2_energy).
-
-    // Start with calculating scale values.
-    int energy1_scale = std::max(0, 16 - WebRtcSpl_NormW32(vec1_energy));
-    int energy2_scale = std::max(0, 16 - WebRtcSpl_NormW32(vec2_energy));
-
-    // Make sure total scaling is even (to simplify scale factor after sqrt).
-    if ((energy1_scale + energy2_scale) & 1) {
-      // The sum is odd.
-      energy1_scale += 1;
-    }
-
-    // Scale energies to int16_t.
-    int16_t vec1_energy_int16 =
-        static_cast<int16_t>(vec1_energy >> energy1_scale);
-    int16_t vec2_energy_int16 =
-        static_cast<int16_t>(vec2_energy >> energy2_scale);
-
-    // Calculate square-root of energy product.
-    int16_t sqrt_energy_prod = WebRtcSpl_SqrtFloor(vec1_energy_int16 *
-                                                   vec2_energy_int16);
-
-    // Calculate cross_corr / sqrt(en1*en2) in Q14.
-    int temp_scale = 14 - (energy1_scale + energy2_scale) / 2;
-    cross_corr = WEBRTC_SPL_SHIFT_W32(cross_corr, temp_scale);
-    cross_corr = std::max(0, cross_corr);  // Don't use if negative.
-    best_correlation = WebRtcSpl_DivW32W16(cross_corr, sqrt_energy_prod);
-    // Make sure |best_correlation| is no larger than 1 in Q14.
-    best_correlation = std::min(static_cast<int16_t>(16384), best_correlation);
-  }
-
-
-  // Check accelerate criteria and stretch the signal.
-  ReturnCodes return_value =
-      CheckCriteriaAndStretch(input, input_len, peak_index, best_correlation,
-                              active_speech, fast_mode, output);
-  switch (return_value) {
-    case kSuccess:
-      *length_change_samples = peak_index;
-      break;
-    case kSuccessLowEnergy:
-      *length_change_samples = peak_index;
-      break;
-    case kNoStretch:
-    case kError:
-      *length_change_samples = 0;
-      break;
-  }
-  return return_value;
-}
-
-void TimeStretch::AutoCorrelation() {
-  // Calculate correlation from lag kMinLag to lag kMaxLag in 4 kHz domain.
-  int32_t auto_corr[kCorrelationLen];
-  CrossCorrelationWithAutoShift(
-      &downsampled_input_[kMaxLag], &downsampled_input_[kMaxLag - kMinLag],
-      kCorrelationLen, kMaxLag - kMinLag, -1, auto_corr);
-
-  // Normalize correlation to 14 bits and write to |auto_correlation_|.
-  int32_t max_corr = WebRtcSpl_MaxAbsValueW32(auto_corr, kCorrelationLen);
-  int scaling = std::max(0, 17 - WebRtcSpl_NormW32(max_corr));
-  WebRtcSpl_VectorBitShiftW32ToW16(auto_correlation_, kCorrelationLen,
-                                   auto_corr, scaling);
-}
-
-bool TimeStretch::SpeechDetection(int32_t vec1_energy, int32_t vec2_energy,
-                                  size_t peak_index, int scaling) const {
-  // Check if the signal seems to be active speech or not (simple VAD).
-  // If (vec1_energy + vec2_energy) / (2 * peak_index) <=
-  // 8 * background_noise_energy, then we say that the signal contains no
-  // active speech.
-  // Rewrite the inequality as:
-  // (vec1_energy + vec2_energy) / 16 <= peak_index * background_noise_energy.
-  // The two sides of the inequality will be denoted |left_side| and
-  // |right_side|.
-  int32_t left_side = rtc::saturated_cast<int32_t>(
-      (static_cast<int64_t>(vec1_energy) + vec2_energy) / 16);
-  int32_t right_side;
-  if (background_noise_.initialized()) {
-    right_side = background_noise_.Energy(master_channel_);
-  } else {
-    // If noise parameters have not been estimated, use a fixed threshold.
-    right_side = 75000;
-  }
-  int right_scale = 16 - WebRtcSpl_NormW32(right_side);
-  right_scale = std::max(0, right_scale);
-  left_side = left_side >> right_scale;
-  right_side =
-      rtc::dchecked_cast<int32_t>(peak_index) * (right_side >> right_scale);
-
-  // Scale |left_side| properly before comparing with |right_side|.
-  // (|scaling| is the scale factor before energy calculation, thus the scale
-  // factor for the energy is 2 * scaling.)
-  if (WebRtcSpl_NormW32(left_side) < 2 * scaling) {
-    // Cannot scale only |left_side|, must scale |right_side| too.
-    int temp_scale = WebRtcSpl_NormW32(left_side);
-    left_side = left_side << temp_scale;
-    right_side = right_side >> (2 * scaling - temp_scale);
-  } else {
-    left_side = left_side << 2 * scaling;
-  }
-  return left_side > right_side;
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/neteq/time_stretch.h b/modules/audio_coding/neteq/time_stretch.h
deleted file mode 100644
index ff056e6..0000000
--- a/modules/audio_coding/neteq/time_stretch.h
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- *  Copyright (c) 2012 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_NETEQ_TIME_STRETCH_H_
-#define WEBRTC_MODULES_AUDIO_CODING_NETEQ_TIME_STRETCH_H_
-
-#include <assert.h>
-#include <string.h>  // memset, size_t
-
-#include "webrtc/modules/audio_coding/neteq/audio_multi_vector.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-// Forward declarations.
-class BackgroundNoise;
-
-// This is the base class for Accelerate and PreemptiveExpand. This class
-// cannot be instantiated, but must be used through either of the derived
-// classes.
-class TimeStretch {
- public:
-  enum ReturnCodes {
-    kSuccess = 0,
-    kSuccessLowEnergy = 1,
-    kNoStretch = 2,
-    kError = -1
-  };
-
-  TimeStretch(int sample_rate_hz, size_t num_channels,
-              const BackgroundNoise& background_noise)
-      : sample_rate_hz_(sample_rate_hz),
-        fs_mult_(sample_rate_hz / 8000),
-        num_channels_(num_channels),
-        master_channel_(0),  // First channel is master.
-        background_noise_(background_noise),
-        max_input_value_(0) {
-    assert(sample_rate_hz_ == 8000 ||
-           sample_rate_hz_ == 16000 ||
-           sample_rate_hz_ == 32000 ||
-           sample_rate_hz_ == 48000);
-    assert(num_channels_ > 0);
-    assert(master_channel_ < num_channels_);
-    memset(auto_correlation_, 0, sizeof(auto_correlation_));
-  }
-
-  virtual ~TimeStretch() {}
-
-  // This method performs the processing common to both Accelerate and
-  // PreemptiveExpand.
-  ReturnCodes Process(const int16_t* input,
-                      size_t input_len,
-                      bool fast_mode,
-                      AudioMultiVector* output,
-                      size_t* length_change_samples);
-
- protected:
-  // Sets the parameters |best_correlation| and |peak_index| to suitable
-  // values when the signal contains no active speech. This method must be
-  // implemented by the sub-classes.
-  virtual void SetParametersForPassiveSpeech(size_t input_length,
-                                             int16_t* best_correlation,
-                                             size_t* peak_index) const = 0;
-
-  // Checks the criteria for performing the time-stretching operation and,
-  // if possible, performs the time-stretching. This method must be implemented
-  // by the sub-classes.
-  virtual ReturnCodes CheckCriteriaAndStretch(
-      const int16_t* input,
-      size_t input_length,
-      size_t peak_index,
-      int16_t best_correlation,
-      bool active_speech,
-      bool fast_mode,
-      AudioMultiVector* output) const = 0;
-
-  static const size_t kCorrelationLen = 50;
-  static const size_t kLogCorrelationLen = 6;  // >= log2(kCorrelationLen).
-  static const size_t kMinLag = 10;
-  static const size_t kMaxLag = 60;
-  static const size_t kDownsampledLen = kCorrelationLen + kMaxLag;
-  static const int kCorrelationThreshold = 14746;  // 0.9 in Q14.
-
-  const int sample_rate_hz_;
-  const int fs_mult_;  // Sample rate multiplier = sample_rate_hz_ / 8000.
-  const size_t num_channels_;
-  const size_t master_channel_;
-  const BackgroundNoise& background_noise_;
-  int16_t max_input_value_;
-  int16_t downsampled_input_[kDownsampledLen];
-  // Adding 1 to the size of |auto_correlation_| because of how it is used
-  // by the peak-detection algorithm.
-  int16_t auto_correlation_[kCorrelationLen + 1];
-
- private:
-  // Calculates the auto-correlation of |downsampled_input_| and writes the
-  // result to |auto_correlation_|.
-  void AutoCorrelation();
-
-  // Performs a simple voice-activity detection based on the input parameters.
-  bool SpeechDetection(int32_t vec1_energy, int32_t vec2_energy,
-                       size_t peak_index, int scaling) const;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(TimeStretch);
-};
-
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_AUDIO_CODING_NETEQ_TIME_STRETCH_H_
diff --git a/modules/audio_coding/neteq/time_stretch_unittest.cc b/modules/audio_coding/neteq/time_stretch_unittest.cc
deleted file mode 100644
index f549b27..0000000
--- a/modules/audio_coding/neteq/time_stretch_unittest.cc
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- *  Copyright (c) 2012 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.
- */
-
-// Unit tests for Accelerate and PreemptiveExpand classes.
-
-#include "webrtc/modules/audio_coding/neteq/accelerate.h"
-#include "webrtc/modules/audio_coding/neteq/preemptive_expand.h"
-
-#include <map>
-#include <memory>
-
-#include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
-#include "webrtc/modules/audio_coding/neteq/background_noise.h"
-#include "webrtc/modules/audio_coding/neteq/tools/input_audio_file.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/testsupport/fileutils.h"
-
-namespace webrtc {
-
-namespace {
-const size_t kNumChannels = 1;
-}
-
-TEST(TimeStretch, CreateAndDestroy) {
-  const int kSampleRate = 8000;
-  const int kOverlapSamples = 5 * kSampleRate / 8000;
-  BackgroundNoise bgn(kNumChannels);
-  Accelerate accelerate(kSampleRate, kNumChannels, bgn);
-  PreemptiveExpand preemptive_expand(
-      kSampleRate, kNumChannels, bgn, kOverlapSamples);
-}
-
-TEST(TimeStretch, CreateUsingFactory) {
-  const int kSampleRate = 8000;
-  const int kOverlapSamples = 5 * kSampleRate / 8000;
-  BackgroundNoise bgn(kNumChannels);
-
-  AccelerateFactory accelerate_factory;
-  Accelerate* accelerate =
-      accelerate_factory.Create(kSampleRate, kNumChannels, bgn);
-  EXPECT_TRUE(accelerate != NULL);
-  delete accelerate;
-
-  PreemptiveExpandFactory preemptive_expand_factory;
-  PreemptiveExpand* preemptive_expand = preemptive_expand_factory.Create(
-      kSampleRate, kNumChannels, bgn, kOverlapSamples);
-  EXPECT_TRUE(preemptive_expand != NULL);
-  delete preemptive_expand;
-}
-
-class TimeStretchTest : public ::testing::Test {
- protected:
-  TimeStretchTest()
-      : input_file_(new test::InputAudioFile(
-            test::ResourcePath("audio_coding/testfile32kHz", "pcm"))),
-        sample_rate_hz_(32000),
-        block_size_(30 * sample_rate_hz_ / 1000),  // 30 ms
-        audio_(new int16_t[block_size_]),
-        background_noise_(kNumChannels) {
-    WebRtcSpl_Init();
-  }
-
-  const int16_t* Next30Ms() {
-    RTC_CHECK(input_file_->Read(block_size_, audio_.get()));
-    return audio_.get();
-  }
-
-  // Returns the total length change (in samples) that the accelerate operation
-  // resulted in during the run.
-  size_t TestAccelerate(size_t loops, bool fast_mode) {
-    Accelerate accelerate(sample_rate_hz_, kNumChannels, background_noise_);
-    size_t total_length_change = 0;
-    for (size_t i = 0; i < loops; ++i) {
-      AudioMultiVector output(kNumChannels);
-      size_t length_change;
-      UpdateReturnStats(accelerate.Process(Next30Ms(), block_size_, fast_mode,
-                                           &output, &length_change));
-      total_length_change += length_change;
-    }
-    return total_length_change;
-  }
-
-  void UpdateReturnStats(TimeStretch::ReturnCodes ret) {
-    switch (ret) {
-      case TimeStretch::kSuccess:
-      case TimeStretch::kSuccessLowEnergy:
-      case TimeStretch::kNoStretch:
-        ++return_stats_[ret];
-        break;
-      case TimeStretch::kError:
-        FAIL() << "Process returned an error";
-    }
-  }
-
-  std::unique_ptr<test::InputAudioFile> input_file_;
-  const int sample_rate_hz_;
-  const size_t block_size_;
-  std::unique_ptr<int16_t[]> audio_;
-  std::map<TimeStretch::ReturnCodes, int> return_stats_;
-  BackgroundNoise background_noise_;
-};
-
-TEST_F(TimeStretchTest, Accelerate) {
-  // TestAccelerate returns the total length change in samples.
-  EXPECT_EQ(15268U, TestAccelerate(100, false));
-  EXPECT_EQ(9, return_stats_[TimeStretch::kSuccess]);
-  EXPECT_EQ(58, return_stats_[TimeStretch::kSuccessLowEnergy]);
-  EXPECT_EQ(33, return_stats_[TimeStretch::kNoStretch]);
-}
-
-TEST_F(TimeStretchTest, AccelerateFastMode) {
-  // TestAccelerate returns the total length change in samples.
-  EXPECT_EQ(21400U, TestAccelerate(100, true));
-  EXPECT_EQ(31, return_stats_[TimeStretch::kSuccess]);
-  EXPECT_EQ(58, return_stats_[TimeStretch::kSuccessLowEnergy]);
-  EXPECT_EQ(11, return_stats_[TimeStretch::kNoStretch]);
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/neteq/timestamp_scaler.cc b/modules/audio_coding/neteq/timestamp_scaler.cc
deleted file mode 100644
index f246cbe..0000000
--- a/modules/audio_coding/neteq/timestamp_scaler.cc
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- *  Copyright (c) 2012 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/neteq/timestamp_scaler.h"
-
-#include "webrtc/modules/audio_coding/neteq/decoder_database.h"
-
-namespace webrtc {
-
-void TimestampScaler::Reset() {
-  first_packet_received_ = false;
-}
-
-void TimestampScaler::ToInternal(Packet* packet) {
-  if (!packet) {
-    return;
-  }
-  packet->timestamp = ToInternal(packet->timestamp, packet->payload_type);
-}
-
-void TimestampScaler::ToInternal(PacketList* packet_list) {
-  PacketList::iterator it;
-  for (it = packet_list->begin(); it != packet_list->end(); ++it) {
-    ToInternal(&(*it));
-  }
-}
-
-uint32_t TimestampScaler::ToInternal(uint32_t external_timestamp,
-                                     uint8_t rtp_payload_type) {
-  const DecoderDatabase::DecoderInfo* info =
-      decoder_database_.GetDecoderInfo(rtp_payload_type);
-  if (!info) {
-    // Payload type is unknown. Do not scale.
-    return external_timestamp;
-  }
-  if (!(info->IsComfortNoise() || info->IsDtmf())) {
-    // Do not change the timestamp scaling settings for DTMF or CNG.
-    numerator_ = info->SampleRateHz();
-    if (info->GetFormat().clockrate_hz == 0) {
-      // If the clockrate is invalid (i.e. with an old-style external codec)
-      // we cannot do any timestamp scaling.
-      denominator_ = numerator_;
-    } else {
-      denominator_ = info->GetFormat().clockrate_hz;
-    }
-  }
-  if (numerator_ != denominator_) {
-    // We have a scale factor != 1.
-    if (!first_packet_received_) {
-      external_ref_ = external_timestamp;
-      internal_ref_ = external_timestamp;
-      first_packet_received_ = true;
-    }
-    const int64_t external_diff = int64_t{external_timestamp} - external_ref_;
-    assert(denominator_ > 0);  // Should not be possible.
-    external_ref_ = external_timestamp;
-    internal_ref_ += (external_diff * numerator_) / denominator_;
-    return internal_ref_;
-  } else {
-    // No scaling.
-    return external_timestamp;
-  }
-}
-
-
-uint32_t TimestampScaler::ToExternal(uint32_t internal_timestamp) const {
-  if (!first_packet_received_ || (numerator_ == denominator_)) {
-    // Not initialized, or scale factor is 1.
-    return internal_timestamp;
-  } else {
-    const int64_t internal_diff = int64_t{internal_timestamp} - internal_ref_;
-    assert(numerator_ > 0);  // Should not be possible.
-    // Do not update references in this method.
-    // Switch |denominator_| and |numerator_| to convert the other way.
-    return external_ref_ + (internal_diff * denominator_) / numerator_;
-  }
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/neteq/timestamp_scaler.h b/modules/audio_coding/neteq/timestamp_scaler.h
deleted file mode 100644
index bfb8d9c..0000000
--- a/modules/audio_coding/neteq/timestamp_scaler.h
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- *  Copyright (c) 2012 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_NETEQ_TIMESTAMP_SCALER_H_
-#define WEBRTC_MODULES_AUDIO_CODING_NETEQ_TIMESTAMP_SCALER_H_
-
-#include "webrtc/modules/audio_coding/neteq/packet.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-// Forward declaration.
-class DecoderDatabase;
-
-// This class scales timestamps for codecs that need timestamp scaling.
-// This is done for codecs where one RTP timestamp does not correspond to
-// one sample.
-class TimestampScaler {
- public:
-  explicit TimestampScaler(const DecoderDatabase& decoder_database)
-      : first_packet_received_(false),
-        numerator_(1),
-        denominator_(1),
-        external_ref_(0),
-        internal_ref_(0),
-        decoder_database_(decoder_database) {}
-
-  virtual ~TimestampScaler() {}
-
-  // Start over.
-  virtual void Reset();
-
-  // Scale the timestamp in |packet| from external to internal.
-  virtual void ToInternal(Packet* packet);
-
-  // Scale the timestamp for all packets in |packet_list| from external to
-  // internal.
-  virtual void ToInternal(PacketList* packet_list);
-
-  // Returns the internal equivalent of |external_timestamp|, given the
-  // RTP payload type |rtp_payload_type|.
-  virtual uint32_t ToInternal(uint32_t external_timestamp,
-                              uint8_t rtp_payload_type);
-
-  // Scales back to external timestamp. This is the inverse of ToInternal().
-  virtual uint32_t ToExternal(uint32_t internal_timestamp) const;
-
- private:
-  bool first_packet_received_;
-  int numerator_;
-  int denominator_;
-  uint32_t external_ref_;
-  uint32_t internal_ref_;
-  const DecoderDatabase& decoder_database_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(TimestampScaler);
-};
-
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_AUDIO_CODING_NETEQ_TIMESTAMP_SCALER_H_
diff --git a/modules/audio_coding/neteq/timestamp_scaler_unittest.cc b/modules/audio_coding/neteq/timestamp_scaler_unittest.cc
deleted file mode 100644
index 13c4554..0000000
--- a/modules/audio_coding/neteq/timestamp_scaler_unittest.cc
+++ /dev/null
@@ -1,315 +0,0 @@
-/*
- *  Copyright (c) 2012 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/api/audio_codecs/builtin_audio_decoder_factory.h"
-#include "webrtc/modules/audio_coding/neteq/mock/mock_decoder_database.h"
-#include "webrtc/modules/audio_coding/neteq/packet.h"
-#include "webrtc/modules/audio_coding/neteq/timestamp_scaler.h"
-#include "webrtc/test/gmock.h"
-#include "webrtc/test/gtest.h"
-
-using ::testing::Return;
-using ::testing::ReturnNull;
-using ::testing::_;
-
-namespace webrtc {
-
-TEST(TimestampScaler, TestNoScaling) {
-  MockDecoderDatabase db;
-  auto factory = CreateBuiltinAudioDecoderFactory();
-  // Use PCMu, because it doesn't use scaled timestamps.
-  const DecoderDatabase::DecoderInfo info(NetEqDecoder::kDecoderPCMu, factory);
-  static const uint8_t kRtpPayloadType = 0;
-  EXPECT_CALL(db, GetDecoderInfo(kRtpPayloadType))
-      .WillRepeatedly(Return(&info));
-
-  TimestampScaler scaler(db);
-  // Test both sides of the timestamp wrap-around.
-  for (uint32_t timestamp = 0xFFFFFFFF - 5; timestamp != 5; ++timestamp) {
-    // Scale to internal timestamp.
-    EXPECT_EQ(timestamp, scaler.ToInternal(timestamp, kRtpPayloadType));
-    // Scale back.
-    EXPECT_EQ(timestamp, scaler.ToExternal(timestamp));
-  }
-
-  EXPECT_CALL(db, Die());  // Called when database object is deleted.
-}
-
-TEST(TimestampScaler, TestNoScalingLargeStep) {
-  MockDecoderDatabase db;
-  auto factory = CreateBuiltinAudioDecoderFactory();
-  // Use PCMu, because it doesn't use scaled timestamps.
-  const DecoderDatabase::DecoderInfo info(NetEqDecoder::kDecoderPCMu, factory);
-  static const uint8_t kRtpPayloadType = 0;
-  EXPECT_CALL(db, GetDecoderInfo(kRtpPayloadType))
-      .WillRepeatedly(Return(&info));
-
-  TimestampScaler scaler(db);
-  // Test both sides of the timestamp wrap-around.
-  static const uint32_t kStep = 160;
-  uint32_t start_timestamp = 0;
-  // |external_timestamp| will be a large positive value.
-  start_timestamp = start_timestamp - 5 * kStep;
-  for (uint32_t timestamp = start_timestamp; timestamp != 5 * kStep;
-      timestamp += kStep) {
-    // Scale to internal timestamp.
-    EXPECT_EQ(timestamp, scaler.ToInternal(timestamp, kRtpPayloadType));
-    // Scale back.
-    EXPECT_EQ(timestamp, scaler.ToExternal(timestamp));
-  }
-
-  EXPECT_CALL(db, Die());  // Called when database object is deleted.
-}
-
-TEST(TimestampScaler, TestG722) {
-  MockDecoderDatabase db;
-  auto factory = CreateBuiltinAudioDecoderFactory();
-  // Use G722, which has a factor 2 scaling.
-  const DecoderDatabase::DecoderInfo info(NetEqDecoder::kDecoderG722, factory);
-  static const uint8_t kRtpPayloadType = 17;
-  EXPECT_CALL(db, GetDecoderInfo(kRtpPayloadType))
-      .WillRepeatedly(Return(&info));
-
-  TimestampScaler scaler(db);
-  // Test both sides of the timestamp wrap-around.
-  uint32_t external_timestamp = 0xFFFFFFFF - 5;
-  uint32_t internal_timestamp = external_timestamp;
-  for (; external_timestamp != 5; ++external_timestamp) {
-    // Scale to internal timestamp.
-    EXPECT_EQ(internal_timestamp,
-              scaler.ToInternal(external_timestamp, kRtpPayloadType));
-    // Scale back.
-    EXPECT_EQ(external_timestamp, scaler.ToExternal(internal_timestamp));
-    internal_timestamp += 2;
-  }
-
-  EXPECT_CALL(db, Die());  // Called when database object is deleted.
-}
-
-TEST(TimestampScaler, TestG722LargeStep) {
-  MockDecoderDatabase db;
-  auto factory = CreateBuiltinAudioDecoderFactory();
-  // Use G722, which has a factor 2 scaling.
-  const DecoderDatabase::DecoderInfo info(NetEqDecoder::kDecoderG722, factory);
-  static const uint8_t kRtpPayloadType = 17;
-  EXPECT_CALL(db, GetDecoderInfo(kRtpPayloadType))
-      .WillRepeatedly(Return(&info));
-
-  TimestampScaler scaler(db);
-  // Test both sides of the timestamp wrap-around.
-  static const uint32_t kStep = 320;
-  uint32_t external_timestamp = 0;
-  // |external_timestamp| will be a large positive value.
-  external_timestamp = external_timestamp - 5 * kStep;
-  uint32_t internal_timestamp = external_timestamp;
-  for (; external_timestamp != 5 * kStep; external_timestamp += kStep) {
-    // Scale to internal timestamp.
-    EXPECT_EQ(internal_timestamp,
-              scaler.ToInternal(external_timestamp, kRtpPayloadType));
-    // Scale back.
-    EXPECT_EQ(external_timestamp, scaler.ToExternal(internal_timestamp));
-    // Internal timestamp should be incremented with twice the step.
-    internal_timestamp += 2 * kStep;
-  }
-
-  EXPECT_CALL(db, Die());  // Called when database object is deleted.
-}
-
-TEST(TimestampScaler, TestG722WithCng) {
-  MockDecoderDatabase db;
-  auto factory = CreateBuiltinAudioDecoderFactory();
-  // Use G722, which has a factor 2 scaling.
-  const DecoderDatabase::DecoderInfo info_g722(NetEqDecoder::kDecoderG722,
-                                               factory);
-  const DecoderDatabase::DecoderInfo info_cng(NetEqDecoder::kDecoderCNGwb,
-                                              factory);
-  static const uint8_t kRtpPayloadTypeG722 = 17;
-  static const uint8_t kRtpPayloadTypeCng = 13;
-  EXPECT_CALL(db, GetDecoderInfo(kRtpPayloadTypeG722))
-      .WillRepeatedly(Return(&info_g722));
-  EXPECT_CALL(db, GetDecoderInfo(kRtpPayloadTypeCng))
-      .WillRepeatedly(Return(&info_cng));
-
-  TimestampScaler scaler(db);
-  // Test both sides of the timestamp wrap-around.
-  uint32_t external_timestamp = 0xFFFFFFFF - 5;
-  uint32_t internal_timestamp = external_timestamp;
-  bool next_is_cng = false;
-  for (; external_timestamp != 5; ++external_timestamp) {
-    // Alternate between G.722 and CNG every other packet.
-    if (next_is_cng) {
-      // Scale to internal timestamp.
-      EXPECT_EQ(internal_timestamp,
-                scaler.ToInternal(external_timestamp, kRtpPayloadTypeCng));
-      next_is_cng = false;
-    } else {
-      // Scale to internal timestamp.
-      EXPECT_EQ(internal_timestamp,
-                scaler.ToInternal(external_timestamp, kRtpPayloadTypeG722));
-      next_is_cng = true;
-    }
-    // Scale back.
-    EXPECT_EQ(external_timestamp, scaler.ToExternal(internal_timestamp));
-    internal_timestamp += 2;
-  }
-
-  EXPECT_CALL(db, Die());  // Called when database object is deleted.
-}
-
-// Make sure that the method ToInternal(Packet* packet) is wired up correctly.
-// Since it is simply calling the other ToInternal method, we are not doing
-// as many tests here.
-TEST(TimestampScaler, TestG722Packet) {
-  MockDecoderDatabase db;
-  auto factory = CreateBuiltinAudioDecoderFactory();
-  // Use G722, which has a factor 2 scaling.
-  const DecoderDatabase::DecoderInfo info(NetEqDecoder::kDecoderG722, factory);
-  static const uint8_t kRtpPayloadType = 17;
-  EXPECT_CALL(db, GetDecoderInfo(kRtpPayloadType))
-      .WillRepeatedly(Return(&info));
-
-  TimestampScaler scaler(db);
-  // Test both sides of the timestamp wrap-around.
-  uint32_t external_timestamp = 0xFFFFFFFF - 5;
-  uint32_t internal_timestamp = external_timestamp;
-  Packet packet;
-  packet.payload_type = kRtpPayloadType;
-  for (; external_timestamp != 5; ++external_timestamp) {
-    packet.timestamp = external_timestamp;
-    // Scale to internal timestamp.
-    scaler.ToInternal(&packet);
-    EXPECT_EQ(internal_timestamp, packet.timestamp);
-    internal_timestamp += 2;
-  }
-
-  EXPECT_CALL(db, Die());  // Called when database object is deleted.
-}
-
-// Make sure that the method ToInternal(PacketList* packet_list) is wired up
-// correctly. Since it is simply calling the ToInternal(Packet* packet) method,
-// we are not doing as many tests here.
-TEST(TimestampScaler, TestG722PacketList) {
-  MockDecoderDatabase db;
-  auto factory = CreateBuiltinAudioDecoderFactory();
-  // Use G722, which has a factor 2 scaling.
-  const DecoderDatabase::DecoderInfo info(NetEqDecoder::kDecoderG722, factory);
-  static const uint8_t kRtpPayloadType = 17;
-  EXPECT_CALL(db, GetDecoderInfo(kRtpPayloadType))
-      .WillRepeatedly(Return(&info));
-
-  TimestampScaler scaler(db);
-  // Test both sides of the timestamp wrap-around.
-  uint32_t external_timestamp = 0xFFFFFFFF - 5;
-  uint32_t internal_timestamp = external_timestamp;
-  PacketList packet_list;
-  {
-    Packet packet1;
-    packet1.payload_type = kRtpPayloadType;
-    packet1.timestamp = external_timestamp;
-    Packet packet2;
-    packet2.payload_type = kRtpPayloadType;
-    packet2.timestamp = external_timestamp + 10;
-    packet_list.push_back(std::move(packet1));
-    packet_list.push_back(std::move(packet2));
-  }
-
-  scaler.ToInternal(&packet_list);
-  EXPECT_EQ(internal_timestamp, packet_list.front().timestamp);
-  packet_list.pop_front();
-  EXPECT_EQ(internal_timestamp + 20, packet_list.front().timestamp);
-
-  EXPECT_CALL(db, Die());  // Called when database object is deleted.
-}
-
-TEST(TimestampScaler, TestG722Reset) {
-  MockDecoderDatabase db;
-  auto factory = CreateBuiltinAudioDecoderFactory();
-  // Use G722, which has a factor 2 scaling.
-  const DecoderDatabase::DecoderInfo info(NetEqDecoder::kDecoderG722, factory);
-  static const uint8_t kRtpPayloadType = 17;
-  EXPECT_CALL(db, GetDecoderInfo(kRtpPayloadType))
-      .WillRepeatedly(Return(&info));
-
-  TimestampScaler scaler(db);
-  // Test both sides of the timestamp wrap-around.
-  uint32_t external_timestamp = 0xFFFFFFFF - 5;
-  uint32_t internal_timestamp = external_timestamp;
-  for (; external_timestamp != 5; ++external_timestamp) {
-    // Scale to internal timestamp.
-    EXPECT_EQ(internal_timestamp,
-              scaler.ToInternal(external_timestamp, kRtpPayloadType));
-    // Scale back.
-    EXPECT_EQ(external_timestamp, scaler.ToExternal(internal_timestamp));
-    internal_timestamp += 2;
-  }
-  // Reset the scaler. After this, we expect the internal and external to start
-  // over at the same value again.
-  scaler.Reset();
-  internal_timestamp = external_timestamp;
-  for (; external_timestamp != 15; ++external_timestamp) {
-    // Scale to internal timestamp.
-    EXPECT_EQ(internal_timestamp,
-              scaler.ToInternal(external_timestamp, kRtpPayloadType));
-    // Scale back.
-    EXPECT_EQ(external_timestamp, scaler.ToExternal(internal_timestamp));
-    internal_timestamp += 2;
-  }
-
-  EXPECT_CALL(db, Die());  // Called when database object is deleted.
-}
-
-// TODO(minyue): This test becomes trivial since Opus does not need a timestamp
-// scaler. Therefore, this test may be removed in future. There is no harm to
-// keep it, since it can be taken as a test case for the situation of a trivial
-// timestamp scaler.
-TEST(TimestampScaler, TestOpusLargeStep) {
-  MockDecoderDatabase db;
-  auto factory = CreateBuiltinAudioDecoderFactory();
-  const DecoderDatabase::DecoderInfo info(NetEqDecoder::kDecoderOpus, factory);
-  static const uint8_t kRtpPayloadType = 17;
-  EXPECT_CALL(db, GetDecoderInfo(kRtpPayloadType))
-      .WillRepeatedly(Return(&info));
-
-  TimestampScaler scaler(db);
-  // Test both sides of the timestamp wrap-around.
-  static const uint32_t kStep = 960;
-  uint32_t external_timestamp = 0;
-  // |external_timestamp| will be a large positive value.
-  external_timestamp = external_timestamp - 5 * kStep;
-  uint32_t internal_timestamp = external_timestamp;
-  for (; external_timestamp != 5 * kStep; external_timestamp += kStep) {
-    // Scale to internal timestamp.
-    EXPECT_EQ(internal_timestamp,
-              scaler.ToInternal(external_timestamp, kRtpPayloadType));
-    // Scale back.
-    EXPECT_EQ(external_timestamp, scaler.ToExternal(internal_timestamp));
-    internal_timestamp += kStep;
-  }
-
-  EXPECT_CALL(db, Die());  // Called when database object is deleted.
-}
-
-TEST(TimestampScaler, Failures) {
-  static const uint8_t kRtpPayloadType = 17;
-  MockDecoderDatabase db;
-  EXPECT_CALL(db, GetDecoderInfo(kRtpPayloadType))
-      .WillOnce(ReturnNull());  // Return NULL to indicate unknown payload type.
-
-  TimestampScaler scaler(db);
-  uint32_t timestamp = 4711;  // Some number.
-  EXPECT_EQ(timestamp, scaler.ToInternal(timestamp, kRtpPayloadType));
-
-  Packet* packet = NULL;
-  scaler.ToInternal(packet);  // Should not crash. That's all we can test.
-
-  EXPECT_CALL(db, Die());  // Called when database object is deleted.
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/neteq/tools/DEPS b/modules/audio_coding/neteq/tools/DEPS
deleted file mode 100644
index 0f16a4f..0000000
--- a/modules/audio_coding/neteq/tools/DEPS
+++ /dev/null
@@ -1,3 +0,0 @@
-include_rules = [
-  "+webrtc/logging/rtc_event_log",
-]
diff --git a/modules/audio_coding/neteq/tools/audio_checksum.h b/modules/audio_coding/neteq/tools/audio_checksum.h
deleted file mode 100644
index 48fde65..0000000
--- a/modules/audio_coding/neteq/tools/audio_checksum.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- *  Copyright (c) 2014 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_NETEQ_TOOLS_AUDIO_CHECKSUM_H_
-#define WEBRTC_MODULES_AUDIO_CODING_NETEQ_TOOLS_AUDIO_CHECKSUM_H_
-
-#include <string>
-
-#include "webrtc/modules/audio_coding/neteq/tools/audio_sink.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/md5digest.h"
-#include "webrtc/rtc_base/stringencode.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-namespace test {
-
-class AudioChecksum : public AudioSink {
- public:
-  AudioChecksum() : finished_(false) {}
-
-  bool WriteArray(const int16_t* audio, size_t num_samples) override {
-    if (finished_)
-      return false;
-
-#ifndef WEBRTC_ARCH_LITTLE_ENDIAN
-#error "Big-endian gives a different checksum"
-#endif
-    checksum_.Update(audio, num_samples * sizeof(*audio));
-    return true;
-  }
-
-  // Finalizes the computations, and returns the checksum.
-  std::string Finish() {
-    if (!finished_) {
-      finished_ = true;
-      checksum_.Finish(checksum_result_, rtc::Md5Digest::kSize);
-    }
-    return rtc::hex_encode(checksum_result_, rtc::Md5Digest::kSize);
-  }
-
- private:
-  rtc::Md5Digest checksum_;
-  char checksum_result_[rtc::Md5Digest::kSize];
-  bool finished_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(AudioChecksum);
-};
-
-}  // namespace test
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_AUDIO_CODING_NETEQ_TOOLS_AUDIO_CHECKSUM_H_
diff --git a/modules/audio_coding/neteq/tools/audio_loop.cc b/modules/audio_coding/neteq/tools/audio_loop.cc
deleted file mode 100644
index 56765aa..0000000
--- a/modules/audio_coding/neteq/tools/audio_loop.cc
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- *  Copyright (c) 2013 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/neteq/tools/audio_loop.h"
-
-#include <assert.h>
-#include <stdio.h>
-#include <string.h>
-
-namespace webrtc {
-namespace test {
-
-bool AudioLoop::Init(const std::string file_name,
-                     size_t max_loop_length_samples,
-                     size_t block_length_samples) {
-  FILE* fp = fopen(file_name.c_str(), "rb");
-  if (!fp) return false;
-
-  audio_array_.reset(new int16_t[max_loop_length_samples +
-                                 block_length_samples]);
-  size_t samples_read = fread(audio_array_.get(), sizeof(int16_t),
-                              max_loop_length_samples, fp);
-  fclose(fp);
-
-  // Block length must be shorter than the loop length.
-  if (block_length_samples > samples_read) return false;
-
-  // Add an extra block length of samples to the end of the array, starting
-  // over again from the beginning of the array. This is done to simplify
-  // the reading process when reading over the end of the loop.
-  memcpy(&audio_array_[samples_read], audio_array_.get(),
-         block_length_samples * sizeof(int16_t));
-
-  loop_length_samples_ = samples_read;
-  block_length_samples_ = block_length_samples;
-  next_index_ = 0;
-  return true;
-}
-
-rtc::ArrayView<const int16_t> AudioLoop::GetNextBlock() {
-  // Check that the AudioLoop is initialized.
-  if (block_length_samples_ == 0)
-    return rtc::ArrayView<const int16_t>();
-
-  const int16_t* output_ptr = &audio_array_[next_index_];
-  next_index_ = (next_index_ + block_length_samples_) % loop_length_samples_;
-  return rtc::ArrayView<const int16_t>(output_ptr, block_length_samples_);
-}
-
-
-}  // namespace test
-}  // namespace webrtc
diff --git a/modules/audio_coding/neteq/tools/audio_loop.h b/modules/audio_coding/neteq/tools/audio_loop.h
deleted file mode 100644
index d226df4..0000000
--- a/modules/audio_coding/neteq/tools/audio_loop.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- *  Copyright (c) 2013 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_NETEQ_TOOLS_AUDIO_LOOP_H_
-#define WEBRTC_MODULES_AUDIO_CODING_NETEQ_TOOLS_AUDIO_LOOP_H_
-
-#include <memory>
-#include <string>
-
-#include "webrtc/api/array_view.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-namespace test {
-
-// Class serving as an infinite source of audio, realized by looping an audio
-// clip.
-class AudioLoop {
- public:
-  AudioLoop()
-      : next_index_(0),
-        loop_length_samples_(0),
-        block_length_samples_(0) {
-  }
-
-  virtual ~AudioLoop() {}
-
-  // Initializes the AudioLoop by reading from |file_name|. The loop will be no
-  // longer than |max_loop_length_samples|, if the length of the file is
-  // greater. Otherwise, the loop length is the same as the file length.
-  // The audio will be delivered in blocks of |block_length_samples|.
-  // Returns false if the initialization failed, otherwise true.
-  bool Init(const std::string file_name, size_t max_loop_length_samples,
-            size_t block_length_samples);
-
-  // Returns a (pointer,size) pair for the next block of audio. The size is
-  // equal to the |block_length_samples| Init() argument.
-  rtc::ArrayView<const int16_t> GetNextBlock();
-
- private:
-  size_t next_index_;
-  size_t loop_length_samples_;
-  size_t block_length_samples_;
-  std::unique_ptr<int16_t[]> audio_array_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(AudioLoop);
-};
-
-}  // namespace test
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_AUDIO_CODING_NETEQ_TOOLS_AUDIO_LOOP_H_
diff --git a/modules/audio_coding/neteq/tools/audio_sink.cc b/modules/audio_coding/neteq/tools/audio_sink.cc
deleted file mode 100644
index 665dc41..0000000
--- a/modules/audio_coding/neteq/tools/audio_sink.cc
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- *  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/neteq/tools/audio_sink.h"
-
-namespace webrtc {
-namespace test {
-
-bool AudioSinkFork::WriteArray(const int16_t* audio, size_t num_samples) {
-  return left_sink_->WriteArray(audio, num_samples) &&
-         right_sink_->WriteArray(audio, num_samples);
-}
-
-bool VoidAudioSink::WriteArray(const int16_t* audio, size_t num_samples) {
-  return true;
-}
-
-}  // namespace test
-}  // namespace webrtc
diff --git a/modules/audio_coding/neteq/tools/audio_sink.h b/modules/audio_coding/neteq/tools/audio_sink.h
deleted file mode 100644
index 076b408..0000000
--- a/modules/audio_coding/neteq/tools/audio_sink.h
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- *  Copyright (c) 2014 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_NETEQ_TOOLS_AUDIO_SINK_H_
-#define WEBRTC_MODULES_AUDIO_CODING_NETEQ_TOOLS_AUDIO_SINK_H_
-
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-namespace test {
-
-// Interface class for an object receiving raw output audio from test
-// applications.
-class AudioSink {
- public:
-  AudioSink() {}
-  virtual ~AudioSink() {}
-
-  // Writes |num_samples| from |audio| to the AudioSink. Returns true if
-  // successful, otherwise false.
-  virtual bool WriteArray(const int16_t* audio, size_t num_samples) = 0;
-
-  // Writes |audio_frame| to the AudioSink. Returns true if successful,
-  // otherwise false.
-  bool WriteAudioFrame(const AudioFrame& audio_frame) {
-    return WriteArray(
-        audio_frame.data(),
-        audio_frame.samples_per_channel_ * audio_frame.num_channels_);
-  }
-
- private:
-  RTC_DISALLOW_COPY_AND_ASSIGN(AudioSink);
-};
-
-// Forks the output audio to two AudioSink objects.
-class AudioSinkFork : public AudioSink {
- public:
-  AudioSinkFork(AudioSink* left, AudioSink* right)
-      : left_sink_(left), right_sink_(right) {}
-
-  bool WriteArray(const int16_t* audio, size_t num_samples) override;
-
- private:
-  AudioSink* left_sink_;
-  AudioSink* right_sink_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(AudioSinkFork);
-};
-
-// An AudioSink implementation that does nothing.
-class VoidAudioSink : public AudioSink {
- public:
-  VoidAudioSink() = default;
-  bool WriteArray(const int16_t* audio, size_t num_samples) override;
-
- private:
-  RTC_DISALLOW_COPY_AND_ASSIGN(VoidAudioSink);
-};
-
-}  // namespace test
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_AUDIO_CODING_NETEQ_TOOLS_AUDIO_SINK_H_
diff --git a/modules/audio_coding/neteq/tools/constant_pcm_packet_source.cc b/modules/audio_coding/neteq/tools/constant_pcm_packet_source.cc
deleted file mode 100644
index 29e3402..0000000
--- a/modules/audio_coding/neteq/tools/constant_pcm_packet_source.cc
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- *  Copyright (c) 2014 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/neteq/tools/constant_pcm_packet_source.h"
-
-#include <algorithm>
-
-#include "webrtc/modules/audio_coding/codecs/pcm16b/pcm16b.h"
-#include "webrtc/modules/audio_coding/neteq/tools/packet.h"
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-namespace test {
-
-ConstantPcmPacketSource::ConstantPcmPacketSource(size_t payload_len_samples,
-                                                 int16_t sample_value,
-                                                 int sample_rate_hz,
-                                                 int payload_type)
-    : payload_len_samples_(payload_len_samples),
-      packet_len_bytes_(2 * payload_len_samples_ + kHeaderLenBytes),
-      samples_per_ms_(sample_rate_hz / 1000),
-      next_arrival_time_ms_(0.0),
-      payload_type_(payload_type),
-      seq_number_(0),
-      timestamp_(0),
-      payload_ssrc_(0xABCD1234) {
-  size_t encoded_len = WebRtcPcm16b_Encode(&sample_value, 1, encoded_sample_);
-  RTC_CHECK_EQ(2U, encoded_len);
-}
-
-std::unique_ptr<Packet> ConstantPcmPacketSource::NextPacket() {
-  RTC_CHECK_GT(packet_len_bytes_, kHeaderLenBytes);
-  uint8_t* packet_memory = new uint8_t[packet_len_bytes_];
-  // Fill the payload part of the packet memory with the pre-encoded value.
-  for (unsigned i = 0; i < 2 * payload_len_samples_; ++i)
-    packet_memory[kHeaderLenBytes + i] = encoded_sample_[i % 2];
-  WriteHeader(packet_memory);
-  // |packet| assumes ownership of |packet_memory|.
-  std::unique_ptr<Packet> packet(
-      new Packet(packet_memory, packet_len_bytes_, next_arrival_time_ms_));
-  next_arrival_time_ms_ += payload_len_samples_ / samples_per_ms_;
-  return packet;
-}
-
-void ConstantPcmPacketSource::WriteHeader(uint8_t* packet_memory) {
-  packet_memory[0] = 0x80;
-  packet_memory[1] = static_cast<uint8_t>(payload_type_);
-  packet_memory[2] = seq_number_ >> 8;
-  packet_memory[3] = seq_number_ & 0xFF;
-  packet_memory[4] = timestamp_ >> 24;
-  packet_memory[5] = (timestamp_ >> 16) & 0xFF;
-  packet_memory[6] = (timestamp_ >> 8) & 0xFF;
-  packet_memory[7] = timestamp_ & 0xFF;
-  packet_memory[8] = payload_ssrc_ >> 24;
-  packet_memory[9] = (payload_ssrc_ >> 16) & 0xFF;
-  packet_memory[10] = (payload_ssrc_ >> 8) & 0xFF;
-  packet_memory[11] = payload_ssrc_ & 0xFF;
-  ++seq_number_;
-  timestamp_ += static_cast<uint32_t>(payload_len_samples_);
-}
-
-}  // namespace test
-}  // namespace webrtc
diff --git a/modules/audio_coding/neteq/tools/constant_pcm_packet_source.h b/modules/audio_coding/neteq/tools/constant_pcm_packet_source.h
deleted file mode 100644
index 1250333..0000000
--- a/modules/audio_coding/neteq/tools/constant_pcm_packet_source.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- *  Copyright (c) 2014 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_NETEQ_TOOLS_CONSTANT_PCM_PACKET_SOURCE_H_
-#define WEBRTC_MODULES_AUDIO_CODING_NETEQ_TOOLS_CONSTANT_PCM_PACKET_SOURCE_H_
-
-#include <stdio.h>
-#include <string>
-
-#include "webrtc/common_types.h"
-#include "webrtc/modules/audio_coding/neteq/tools/packet_source.h"
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace webrtc {
-namespace test {
-
-// This class implements a packet source that delivers PCM16b encoded packets
-// with a constant sample value. The payload length, constant sample value,
-// sample rate, and payload type are all set in the constructor.
-class ConstantPcmPacketSource : public PacketSource {
- public:
-  ConstantPcmPacketSource(size_t payload_len_samples,
-                          int16_t sample_value,
-                          int sample_rate_hz,
-                          int payload_type);
-
-  std::unique_ptr<Packet> NextPacket() override;
-
- private:
-  void WriteHeader(uint8_t* packet_memory);
-
-  const size_t kHeaderLenBytes = 12;
-  const size_t payload_len_samples_;
-  const size_t packet_len_bytes_;
-  uint8_t encoded_sample_[2];
-  const int samples_per_ms_;
-  double next_arrival_time_ms_;
-  const int payload_type_;
-  uint16_t seq_number_;
-  uint32_t timestamp_;
-  const uint32_t payload_ssrc_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(ConstantPcmPacketSource);
-};
-
-}  // namespace test
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_AUDIO_CODING_NETEQ_TOOLS_CONSTANT_PCM_PACKET_SOURCE_H_
diff --git a/modules/audio_coding/neteq/tools/encode_neteq_input.cc b/modules/audio_coding/neteq/tools/encode_neteq_input.cc
deleted file mode 100644
index 41bed7c..0000000
--- a/modules/audio_coding/neteq/tools/encode_neteq_input.cc
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- *  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/neteq/tools/encode_neteq_input.h"
-
-#include <utility>
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/safe_conversions.h"
-
-namespace webrtc {
-namespace test {
-
-EncodeNetEqInput::EncodeNetEqInput(std::unique_ptr<Generator> generator,
-                                   std::unique_ptr<AudioEncoder> encoder,
-                                   int64_t input_duration_ms)
-    : generator_(std::move(generator)),
-      encoder_(std::move(encoder)),
-      input_duration_ms_(input_duration_ms) {
-  CreatePacket();
-}
-
-rtc::Optional<int64_t> EncodeNetEqInput::NextPacketTime() const {
-  RTC_DCHECK(packet_data_);
-  return rtc::Optional<int64_t>(static_cast<int64_t>(packet_data_->time_ms));
-}
-
-rtc::Optional<int64_t> EncodeNetEqInput::NextOutputEventTime() const {
-  return rtc::Optional<int64_t>(next_output_event_ms_);
-}
-
-std::unique_ptr<NetEqInput::PacketData> EncodeNetEqInput::PopPacket() {
-  RTC_DCHECK(packet_data_);
-  // Grab the packet to return...
-  std::unique_ptr<PacketData> packet_to_return = std::move(packet_data_);
-  // ... and line up the next packet for future use.
-  CreatePacket();
-
-  return packet_to_return;
-}
-
-void EncodeNetEqInput::AdvanceOutputEvent() {
-  next_output_event_ms_ += kOutputPeriodMs;
-}
-
-rtc::Optional<RTPHeader> EncodeNetEqInput::NextHeader() const {
-  RTC_DCHECK(packet_data_);
-  return rtc::Optional<RTPHeader>(packet_data_->header);
-}
-
-void EncodeNetEqInput::CreatePacket() {
-  // Create a new PacketData object.
-  RTC_DCHECK(!packet_data_);
-  packet_data_.reset(new NetEqInput::PacketData);
-  RTC_DCHECK_EQ(packet_data_->payload.size(), 0);
-
-  // Loop until we get a packet.
-  AudioEncoder::EncodedInfo info;
-  RTC_DCHECK(!info.send_even_if_empty);
-  int num_blocks = 0;
-  while (packet_data_->payload.size() == 0 && !info.send_even_if_empty) {
-    const size_t num_samples = rtc::CheckedDivExact(
-        static_cast<int>(encoder_->SampleRateHz() * kOutputPeriodMs), 1000);
-
-    info = encoder_->Encode(rtp_timestamp_, generator_->Generate(num_samples),
-                            &packet_data_->payload);
-
-    rtp_timestamp_ += rtc::dchecked_cast<uint32_t>(
-        num_samples * encoder_->RtpTimestampRateHz() /
-        encoder_->SampleRateHz());
-    ++num_blocks;
-  }
-  packet_data_->header.timestamp = info.encoded_timestamp;
-  packet_data_->header.payloadType = info.payload_type;
-  packet_data_->header.sequenceNumber = sequence_number_++;
-  packet_data_->time_ms = next_packet_time_ms_;
-  next_packet_time_ms_ += num_blocks * kOutputPeriodMs;
-}
-
-}  // namespace test
-}  // namespace webrtc
diff --git a/modules/audio_coding/neteq/tools/encode_neteq_input.h b/modules/audio_coding/neteq/tools/encode_neteq_input.h
deleted file mode 100644
index df78e2a..0000000
--- a/modules/audio_coding/neteq/tools/encode_neteq_input.h
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- *  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_NETEQ_TOOLS_ENCODE_NETEQ_INPUT_H_
-#define WEBRTC_MODULES_AUDIO_CODING_NETEQ_TOOLS_ENCODE_NETEQ_INPUT_H_
-
-#include <memory>
-
-#include "webrtc/api/audio_codecs/audio_encoder.h"
-#include "webrtc/modules/audio_coding/neteq/tools/neteq_input.h"
-#include "webrtc/modules/include/module_common_types.h"
-
-namespace webrtc {
-namespace test {
-
-// This class provides a NetEqInput that takes audio from a generator object and
-// encodes it using a given audio encoder.
-class EncodeNetEqInput : public NetEqInput {
- public:
-  // Generator class, to be provided to the EncodeNetEqInput constructor.
-  class Generator {
-   public:
-    virtual ~Generator() = default;
-    // Returns the next num_samples values from the signal generator.
-    virtual rtc::ArrayView<const int16_t> Generate(size_t num_samples) = 0;
-  };
-
-  // The source will end after the given input duration.
-  EncodeNetEqInput(std::unique_ptr<Generator> generator,
-                   std::unique_ptr<AudioEncoder> encoder,
-                   int64_t input_duration_ms);
-
-  rtc::Optional<int64_t> NextPacketTime() const override;
-
-  rtc::Optional<int64_t> NextOutputEventTime() const override;
-
-  std::unique_ptr<PacketData> PopPacket() override;
-
-  void AdvanceOutputEvent() override;
-
-  bool ended() const override {
-    return next_output_event_ms_ <= input_duration_ms_;
-  }
-
-  rtc::Optional<RTPHeader> NextHeader() const override;
-
- private:
-  static constexpr int64_t kOutputPeriodMs = 10;
-
-  void CreatePacket();
-
-  std::unique_ptr<Generator> generator_;
-  std::unique_ptr<AudioEncoder> encoder_;
-  std::unique_ptr<PacketData> packet_data_;
-  uint32_t rtp_timestamp_ = 0;
-  int16_t sequence_number_ = 0;
-  int64_t next_packet_time_ms_ = 0;
-  int64_t next_output_event_ms_ = 0;
-  const int64_t input_duration_ms_;
-};
-
-}  // namespace test
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_AUDIO_CODING_NETEQ_TOOLS_ENCODE_NETEQ_INPUT_H_
diff --git a/modules/audio_coding/neteq/tools/fake_decode_from_file.cc b/modules/audio_coding/neteq/tools/fake_decode_from_file.cc
deleted file mode 100644
index eef32df..0000000
--- a/modules/audio_coding/neteq/tools/fake_decode_from_file.cc
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- *  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/neteq/tools/fake_decode_from_file.h"
-
-#include "webrtc/modules/rtp_rtcp/source/byte_io.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/safe_conversions.h"
-
-namespace webrtc {
-namespace test {
-
-int FakeDecodeFromFile::DecodeInternal(const uint8_t* encoded,
-                                       size_t encoded_len,
-                                       int sample_rate_hz,
-                                       int16_t* decoded,
-                                       SpeechType* speech_type) {
-  if (encoded_len == 0) {
-    // Decoder is asked to produce codec-internal comfort noise.
-    RTC_DCHECK(!encoded);  // NetEq always sends nullptr in this case.
-    RTC_DCHECK(cng_mode_);
-    RTC_DCHECK_GT(last_decoded_length_, 0);
-    std::fill_n(decoded, last_decoded_length_, 0);
-    *speech_type = kComfortNoise;
-    return rtc::dchecked_cast<int>(last_decoded_length_);
-  }
-
-  RTC_CHECK_GE(encoded_len, 12);
-  uint32_t timestamp_to_decode =
-      ByteReader<uint32_t>::ReadLittleEndian(encoded);
-  uint32_t samples_to_decode =
-      ByteReader<uint32_t>::ReadLittleEndian(&encoded[4]);
-  if (samples_to_decode == 0) {
-    // Number of samples in packet is unknown.
-    if (last_decoded_length_ > 0) {
-      // Use length of last decoded packet, but since this is the total for all
-      // channels, we have to divide by 2 in the stereo case.
-      samples_to_decode = rtc::dchecked_cast<int>(rtc::CheckedDivExact(
-          last_decoded_length_, static_cast<size_t>(stereo_ ? 2uL : 1uL)));
-    } else {
-      // This is the first packet to decode, and we do not know the length of
-      // it. Set it to 10 ms.
-      samples_to_decode = rtc::CheckedDivExact(sample_rate_hz, 100);
-    }
-  }
-
-  if (next_timestamp_from_input_ &&
-      timestamp_to_decode != *next_timestamp_from_input_) {
-    // A gap in the timestamp sequence is detected. Skip the same number of
-    // samples from the file.
-    uint32_t jump = timestamp_to_decode - *next_timestamp_from_input_;
-    RTC_CHECK(input_->Seek(jump));
-  }
-
-  next_timestamp_from_input_ =
-      rtc::Optional<uint32_t>(timestamp_to_decode + samples_to_decode);
-
-  uint32_t original_payload_size_bytes =
-      ByteReader<uint32_t>::ReadLittleEndian(&encoded[8]);
-  if (original_payload_size_bytes == 1) {
-    // This is a comfort noise payload.
-    RTC_DCHECK_GT(last_decoded_length_, 0);
-    std::fill_n(decoded, last_decoded_length_, 0);
-    *speech_type = kComfortNoise;
-    cng_mode_ = true;
-    return rtc::dchecked_cast<int>(last_decoded_length_);
-  }
-
-  cng_mode_ = false;
-  RTC_CHECK(input_->Read(static_cast<size_t>(samples_to_decode), decoded));
-
-  if (stereo_) {
-    InputAudioFile::DuplicateInterleaved(decoded, samples_to_decode, 2,
-                                         decoded);
-    samples_to_decode *= 2;
-  }
-
-  *speech_type = kSpeech;
-  last_decoded_length_ = samples_to_decode;
-  return rtc::dchecked_cast<int>(last_decoded_length_);
-}
-
-void FakeDecodeFromFile::PrepareEncoded(uint32_t timestamp,
-                                        size_t samples,
-                                        size_t original_payload_size_bytes,
-                                        rtc::ArrayView<uint8_t> encoded) {
-  RTC_CHECK_GE(encoded.size(), 12);
-  ByteWriter<uint32_t>::WriteLittleEndian(&encoded[0], timestamp);
-  ByteWriter<uint32_t>::WriteLittleEndian(&encoded[4],
-                                          rtc::checked_cast<uint32_t>(samples));
-  ByteWriter<uint32_t>::WriteLittleEndian(
-      &encoded[8], rtc::checked_cast<uint32_t>(original_payload_size_bytes));
-}
-
-}  // namespace test
-}  // namespace webrtc
diff --git a/modules/audio_coding/neteq/tools/fake_decode_from_file.h b/modules/audio_coding/neteq/tools/fake_decode_from_file.h
deleted file mode 100644
index 09c2e78..0000000
--- a/modules/audio_coding/neteq/tools/fake_decode_from_file.h
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- *  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_NETEQ_TOOLS_FAKE_DECODE_FROM_FILE_H_
-#define WEBRTC_MODULES_AUDIO_CODING_NETEQ_TOOLS_FAKE_DECODE_FROM_FILE_H_
-
-#include <memory>
-
-#include "webrtc/api/array_view.h"
-#include "webrtc/api/audio_codecs/audio_decoder.h"
-#include "webrtc/api/optional.h"
-#include "webrtc/modules/audio_coding/neteq/tools/input_audio_file.h"
-
-namespace webrtc {
-namespace test {
-
-// Provides an AudioDecoder implementation that delivers audio data from a file.
-// The "encoded" input should contain information about what RTP timestamp the
-// encoding represents, and how many samples the decoder should produce for that
-// encoding. A helper method PrepareEncoded is provided to prepare such
-// encodings. If packets are missing, as determined from the timestamps, the
-// file reading will skip forward to match the loss.
-class FakeDecodeFromFile : public AudioDecoder {
- public:
-  FakeDecodeFromFile(std::unique_ptr<InputAudioFile> input,
-                     int sample_rate_hz,
-                     bool stereo)
-      : input_(std::move(input)),
-        sample_rate_hz_(sample_rate_hz),
-        stereo_(stereo) {}
-
-  ~FakeDecodeFromFile() = default;
-
-  void Reset() override {}
-
-  int SampleRateHz() const override { return sample_rate_hz_; }
-
-  size_t Channels() const override { return stereo_ ? 2 : 1; }
-
-  int DecodeInternal(const uint8_t* encoded,
-                     size_t encoded_len,
-                     int sample_rate_hz,
-                     int16_t* decoded,
-                     SpeechType* speech_type) override;
-
-  // Helper method. Writes |timestamp|, |samples| and
-  // |original_payload_size_bytes| to |encoded| in a format that the
-  // FakeDecodeFromFile decoder will understand. |encoded| must be at least 12
-  // bytes long.
-  static void PrepareEncoded(uint32_t timestamp,
-                             size_t samples,
-                             size_t original_payload_size_bytes,
-                             rtc::ArrayView<uint8_t> encoded);
-
- private:
-  std::unique_ptr<InputAudioFile> input_;
-  rtc::Optional<uint32_t> next_timestamp_from_input_;
-  const int sample_rate_hz_;
-  const bool stereo_;
-  size_t last_decoded_length_ = 0;
-  bool cng_mode_ = false;
-};
-
-}  // namespace test
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_AUDIO_CODING_NETEQ_TOOLS_FAKE_DECODE_FROM_FILE_H_
diff --git a/modules/audio_coding/neteq/tools/input_audio_file.cc b/modules/audio_coding/neteq/tools/input_audio_file.cc
deleted file mode 100644
index 97d20bc..0000000
--- a/modules/audio_coding/neteq/tools/input_audio_file.cc
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- *  Copyright (c) 2013 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/neteq/tools/input_audio_file.h"
-
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-namespace test {
-
-InputAudioFile::InputAudioFile(const std::string file_name) {
-  fp_ = fopen(file_name.c_str(), "rb");
-}
-
-InputAudioFile::~InputAudioFile() { fclose(fp_); }
-
-bool InputAudioFile::Read(size_t samples, int16_t* destination) {
-  if (!fp_) {
-    return false;
-  }
-  size_t samples_read = fread(destination, sizeof(int16_t), samples, fp_);
-  if (samples_read < samples) {
-    // Rewind and read the missing samples.
-    rewind(fp_);
-    size_t missing_samples = samples - samples_read;
-    if (fread(destination + samples_read, sizeof(int16_t), missing_samples,
-              fp_) < missing_samples) {
-      // Could not read enough even after rewinding the file.
-      return false;
-    }
-  }
-  return true;
-}
-
-bool InputAudioFile::Seek(int samples) {
-  if (!fp_) {
-    return false;
-  }
-  // Find file boundaries.
-  const long current_pos = ftell(fp_);
-  RTC_CHECK_NE(EOF, current_pos)
-      << "Error returned when getting file position.";
-  RTC_CHECK_EQ(0, fseek(fp_, 0, SEEK_END));  // Move to end of file.
-  const long file_size = ftell(fp_);
-  RTC_CHECK_NE(EOF, file_size) << "Error returned when getting file position.";
-  // Find new position.
-  long new_pos = current_pos + sizeof(int16_t) * samples;  // Samples to bytes.
-  RTC_CHECK_GE(new_pos, 0)
-      << "Trying to move to before the beginning of the file";
-  new_pos = new_pos % file_size;  // Wrap around the end of the file.
-  // Move to new position relative to the beginning of the file.
-  RTC_CHECK_EQ(0, fseek(fp_, new_pos, SEEK_SET));
-  return true;
-}
-
-void InputAudioFile::DuplicateInterleaved(const int16_t* source, size_t samples,
-                                          size_t channels,
-                                          int16_t* destination) {
-  // Start from the end of |source| and |destination|, and work towards the
-  // beginning. This is to allow in-place interleaving of the same array (i.e.,
-  // |source| and |destination| are the same array).
-  for (int i = static_cast<int>(samples - 1); i >= 0; --i) {
-    for (int j = static_cast<int>(channels - 1); j >= 0; --j) {
-      destination[i * channels + j] = source[i];
-    }
-  }
-}
-
-}  // namespace test
-}  // namespace webrtc
diff --git a/modules/audio_coding/neteq/tools/input_audio_file.h b/modules/audio_coding/neteq/tools/input_audio_file.h
deleted file mode 100644
index 271c513..0000000
--- a/modules/audio_coding/neteq/tools/input_audio_file.h
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- *  Copyright (c) 2013 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_NETEQ_TOOLS_INPUT_AUDIO_FILE_H_
-#define WEBRTC_MODULES_AUDIO_CODING_NETEQ_TOOLS_INPUT_AUDIO_FILE_H_
-
-#include <stdio.h>
-
-#include <string>
-
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-namespace test {
-
-// Class for handling a looping input audio file.
-class InputAudioFile {
- public:
-  explicit InputAudioFile(const std::string file_name);
-
-  virtual ~InputAudioFile();
-
-  // Reads |samples| elements from source file to |destination|. Returns true
-  // if the read was successful, otherwise false. If the file end is reached,
-  // the file is rewound and reading continues from the beginning.
-  // The output |destination| must have the capacity to hold |samples| elements.
-  virtual bool Read(size_t samples, int16_t* destination);
-
-  // Fast-forwards (|samples| > 0) or -backwards (|samples| < 0) the file by the
-  // indicated number of samples. Just like Read(), Seek() starts over at the
-  // beginning of the file if the end is reached. However, seeking backwards
-  // past the beginning of the file is not possible.
-  virtual bool Seek(int samples);
-
-  // Creates a multi-channel signal from a mono signal. Each sample is repeated
-  // |channels| times to create an interleaved multi-channel signal where all
-  // channels are identical. The output |destination| must have the capacity to
-  // hold samples * channels elements. Note that |source| and |destination| can
-  // be the same array (i.e., point to the same address).
-  static void DuplicateInterleaved(const int16_t* source, size_t samples,
-                                   size_t channels, int16_t* destination);
-
- private:
-  FILE* fp_;
-  RTC_DISALLOW_COPY_AND_ASSIGN(InputAudioFile);
-};
-
-}  // namespace test
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_AUDIO_CODING_NETEQ_TOOLS_INPUT_AUDIO_FILE_H_
diff --git a/modules/audio_coding/neteq/tools/input_audio_file_unittest.cc b/modules/audio_coding/neteq/tools/input_audio_file_unittest.cc
deleted file mode 100644
index ff795d8..0000000
--- a/modules/audio_coding/neteq/tools/input_audio_file_unittest.cc
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- *  Copyright (c) 2014 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.
- */
-
-// Unit tests for test InputAudioFile class.
-
-#include "webrtc/modules/audio_coding/neteq/tools/input_audio_file.h"
-
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-namespace test {
-
-TEST(TestInputAudioFile, DuplicateInterleaveSeparateSrcDst) {
-  static const size_t kSamples = 10;
-  static const size_t kChannels = 2;
-  int16_t input[kSamples];
-  for (size_t i = 0; i < kSamples; ++i) {
-    input[i] = i;
-  }
-  int16_t output[kSamples * kChannels];
-  InputAudioFile::DuplicateInterleaved(input, kSamples, kChannels, output);
-
-  // Verify output
-  int16_t* output_ptr = output;
-  for (size_t i = 0; i < kSamples; ++i) {
-    for (size_t j = 0; j < kChannels; ++j) {
-      EXPECT_EQ(static_cast<int16_t>(i), *output_ptr++);
-    }
-  }
-}
-
-TEST(TestInputAudioFile, DuplicateInterleaveSameSrcDst) {
-  static const size_t kSamples = 10;
-  static const size_t kChannels = 5;
-  int16_t input[kSamples * kChannels];
-  for (size_t i = 0; i < kSamples; ++i) {
-    input[i] = i;
-  }
-  InputAudioFile::DuplicateInterleaved(input, kSamples, kChannels, input);
-
-  // Verify output
-  int16_t* output_ptr = input;
-  for (size_t i = 0; i < kSamples; ++i) {
-    for (size_t j = 0; j < kChannels; ++j) {
-      EXPECT_EQ(static_cast<int16_t>(i), *output_ptr++);
-    }
-  }
-}
-
-}  // namespace test
-}  // namespace webrtc
diff --git a/modules/audio_coding/neteq/tools/neteq_delay_analyzer.cc b/modules/audio_coding/neteq/tools/neteq_delay_analyzer.cc
deleted file mode 100644
index a0f5aa7..0000000
--- a/modules/audio_coding/neteq/tools/neteq_delay_analyzer.cc
+++ /dev/null
@@ -1,257 +0,0 @@
-/*
- *  Copyright (c) 2017 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/neteq/tools/neteq_delay_analyzer.h"
-
-#include <algorithm>
-#include <fstream>
-#include <ios>
-#include <iterator>
-#include <limits>
-#include <utility>
-
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-namespace test {
-namespace {
-// Helper function for NetEqDelayAnalyzer::CreateGraphs. Returns the
-// interpolated value of a function at the point x. Vector x_vec contains the
-// sample points, and y_vec contains the function values at these points. The
-// return value is a linear interpolation between y_vec values.
-double LinearInterpolate(double x,
-                         const std::vector<int64_t>& x_vec,
-                         const std::vector<int64_t>& y_vec) {
-  // Find first element which is larger than x.
-  auto it = std::upper_bound(x_vec.begin(), x_vec.end(), x);
-  if (it == x_vec.end()) {
-    --it;
-  }
-  const size_t upper_ix = it - x_vec.begin();
-
-  size_t lower_ix;
-  if (upper_ix == 0 || x_vec[upper_ix] <= x) {
-    lower_ix = upper_ix;
-  } else {
-    lower_ix = upper_ix - 1;
-  }
-  double y;
-  if (lower_ix == upper_ix) {
-    y = y_vec[lower_ix];
-  } else {
-    RTC_DCHECK_NE(x_vec[lower_ix], x_vec[upper_ix]);
-    y = (x - x_vec[lower_ix]) * (y_vec[upper_ix] - y_vec[lower_ix]) /
-            (x_vec[upper_ix] - x_vec[lower_ix]) +
-        y_vec[lower_ix];
-  }
-  return y;
-}
-}  // namespace
-
-void NetEqDelayAnalyzer::AfterInsertPacket(
-    const test::NetEqInput::PacketData& packet,
-    NetEq* neteq) {
-  data_.insert(
-      std::make_pair(packet.header.timestamp, TimingData(packet.time_ms)));
-  ssrcs_.insert(packet.header.ssrc);
-  payload_types_.insert(packet.header.payloadType);
-}
-
-void NetEqDelayAnalyzer::BeforeGetAudio(NetEq* neteq) {
-  last_sync_buffer_ms_ = neteq->SyncBufferSizeMs();
-}
-
-void NetEqDelayAnalyzer::AfterGetAudio(int64_t time_now_ms,
-                                       const AudioFrame& audio_frame,
-                                       bool /*muted*/,
-                                       NetEq* neteq) {
-  get_audio_time_ms_.push_back(time_now_ms);
-  // Check what timestamps were decoded in the last GetAudio call.
-  std::vector<uint32_t> dec_ts = neteq->LastDecodedTimestamps();
-  // Find those timestamps in data_, insert their decoding time and sync
-  // delay.
-  for (uint32_t ts : dec_ts) {
-    auto it = data_.find(ts);
-    if (it == data_.end()) {
-      // This is a packet that was split out from another packet. Skip it.
-      continue;
-    }
-    auto& it_timing = it->second;
-    RTC_CHECK(!it_timing.decode_get_audio_count)
-        << "Decode time already written";
-    it_timing.decode_get_audio_count = rtc::Optional<int64_t>(get_audio_count_);
-    RTC_CHECK(!it_timing.sync_delay_ms) << "Decode time already written";
-    it_timing.sync_delay_ms = rtc::Optional<int64_t>(last_sync_buffer_ms_);
-    it_timing.target_delay_ms = rtc::Optional<int>(neteq->TargetDelayMs());
-    it_timing.current_delay_ms =
-        rtc::Optional<int>(neteq->FilteredCurrentDelayMs());
-  }
-  last_sample_rate_hz_ = audio_frame.sample_rate_hz_;
-  ++get_audio_count_;
-}
-
-void NetEqDelayAnalyzer::CreateGraphs(
-    std::vector<float>* send_time_s,
-    std::vector<float>* arrival_delay_ms,
-    std::vector<float>* corrected_arrival_delay_ms,
-    std::vector<rtc::Optional<float>>* playout_delay_ms,
-    std::vector<rtc::Optional<float>>* target_delay_ms) const {
-  if (get_audio_time_ms_.empty()) {
-    return;
-  }
-  // Create nominal_get_audio_time_ms, a vector starting at
-  // get_audio_time_ms_[0] and increasing by 10 for each element.
-  std::vector<int64_t> nominal_get_audio_time_ms(get_audio_time_ms_.size());
-  nominal_get_audio_time_ms[0] = get_audio_time_ms_[0];
-  std::transform(
-      nominal_get_audio_time_ms.begin(), nominal_get_audio_time_ms.end() - 1,
-      nominal_get_audio_time_ms.begin() + 1, [](int64_t& x) { return x + 10; });
-  RTC_DCHECK(
-      std::is_sorted(get_audio_time_ms_.begin(), get_audio_time_ms_.end()));
-
-  std::vector<double> rtp_timestamps_ms;
-  double offset = std::numeric_limits<double>::max();
-  TimestampUnwrapper unwrapper;
-  // This loop traverses data_ and populates rtp_timestamps_ms as well as
-  // calculates the base offset.
-  for (auto& d : data_) {
-    rtp_timestamps_ms.push_back(
-        unwrapper.Unwrap(d.first) /
-        rtc::CheckedDivExact(last_sample_rate_hz_, 1000));
-    offset =
-        std::min(offset, d.second.arrival_time_ms - rtp_timestamps_ms.back());
-  }
-
-  // Calculate send times in seconds for each packet. This is the (unwrapped)
-  // RTP timestamp in ms divided by 1000.
-  send_time_s->resize(rtp_timestamps_ms.size());
-  std::transform(rtp_timestamps_ms.begin(), rtp_timestamps_ms.end(),
-                 send_time_s->begin(), [rtp_timestamps_ms](double x) {
-                   return (x - rtp_timestamps_ms[0]) / 1000.f;
-                 });
-  RTC_DCHECK_EQ(send_time_s->size(), rtp_timestamps_ms.size());
-
-  // This loop traverses the data again and populates the graph vectors. The
-  // reason to have two loops and traverse twice is that the offset cannot be
-  // known until the first traversal is done. Meanwhile, the final offset must
-  // be known already at the start of this second loop.
-  auto data_it = data_.cbegin();
-  for (size_t i = 0; i < send_time_s->size(); ++i, ++data_it) {
-    RTC_DCHECK(data_it != data_.end());
-    const double offset_send_time_ms = rtp_timestamps_ms[i] + offset;
-    const auto& timing = data_it->second;
-    corrected_arrival_delay_ms->push_back(
-        LinearInterpolate(timing.arrival_time_ms, get_audio_time_ms_,
-                          nominal_get_audio_time_ms) -
-        offset_send_time_ms);
-    arrival_delay_ms->push_back(timing.arrival_time_ms - offset_send_time_ms);
-
-    if (timing.decode_get_audio_count) {
-      // This packet was decoded.
-      RTC_DCHECK(timing.sync_delay_ms);
-      const float playout_ms = *timing.decode_get_audio_count * 10 +
-                               get_audio_time_ms_[0] + *timing.sync_delay_ms -
-                               offset_send_time_ms;
-      playout_delay_ms->push_back(rtc::Optional<float>(playout_ms));
-      RTC_DCHECK(timing.target_delay_ms);
-      RTC_DCHECK(timing.current_delay_ms);
-      const float target =
-          playout_ms - *timing.current_delay_ms + *timing.target_delay_ms;
-      target_delay_ms->push_back(rtc::Optional<float>(target));
-    } else {
-      // This packet was never decoded. Mark target and playout delays as empty.
-      playout_delay_ms->push_back(rtc::Optional<float>());
-      target_delay_ms->push_back(rtc::Optional<float>());
-    }
-  }
-  RTC_DCHECK(data_it == data_.end());
-  RTC_DCHECK_EQ(send_time_s->size(), corrected_arrival_delay_ms->size());
-  RTC_DCHECK_EQ(send_time_s->size(), playout_delay_ms->size());
-  RTC_DCHECK_EQ(send_time_s->size(), target_delay_ms->size());
-}
-
-void NetEqDelayAnalyzer::CreateMatlabScript(
-    const std::string& script_name) const {
-  std::vector<float> send_time_s;
-  std::vector<float> arrival_delay_ms;
-  std::vector<float> corrected_arrival_delay_ms;
-  std::vector<rtc::Optional<float>> playout_delay_ms;
-  std::vector<rtc::Optional<float>> target_delay_ms;
-  CreateGraphs(&send_time_s, &arrival_delay_ms, &corrected_arrival_delay_ms,
-               &playout_delay_ms, &target_delay_ms);
-
-  // Create an output file stream to Matlab script file.
-  std::ofstream output(script_name);
-  // The iterator is used to batch-output comma-separated values from vectors.
-  std::ostream_iterator<float> output_iterator(output, ",");
-
-  output << "send_time_s = [ ";
-  std::copy(send_time_s.begin(), send_time_s.end(), output_iterator);
-  output << "];" << std::endl;
-
-  output << "arrival_delay_ms = [ ";
-  std::copy(arrival_delay_ms.begin(), arrival_delay_ms.end(), output_iterator);
-  output << "];" << std::endl;
-
-  output << "corrected_arrival_delay_ms = [ ";
-  std::copy(corrected_arrival_delay_ms.begin(),
-            corrected_arrival_delay_ms.end(), output_iterator);
-  output << "];" << std::endl;
-
-  output << "playout_delay_ms = [ ";
-  for (const auto& v : playout_delay_ms) {
-    if (!v) {
-      output << "nan, ";
-    } else {
-      output << *v << ", ";
-    }
-  }
-  output << "];" << std::endl;
-
-  output << "target_delay_ms = [ ";
-  for (const auto& v : target_delay_ms) {
-    if (!v) {
-      output << "nan, ";
-    } else {
-      output << *v << ", ";
-    }
-  }
-  output << "];" << std::endl;
-
-  output << "h=plot(send_time_s, arrival_delay_ms, "
-         << "send_time_s, target_delay_ms, 'g.', "
-         << "send_time_s, playout_delay_ms);" << std::endl;
-  output << "set(h(1),'color',0.75*[1 1 1]);" << std::endl;
-  output << "set(h(2),'markersize',6);" << std::endl;
-  output << "set(h(3),'linew',1.5);" << std::endl;
-  output << "ax1=axis;" << std::endl;
-  output << "axis tight" << std::endl;
-  output << "ax2=axis;" << std::endl;
-  output << "axis([ax2(1:3) ax1(4)])" << std::endl;
-  output << "xlabel('send time [s]');" << std::endl;
-  output << "ylabel('relative delay [ms]');" << std::endl;
-  if (!ssrcs_.empty()) {
-    auto ssrc_it = ssrcs_.cbegin();
-    output << "title('SSRC: 0x" << std::hex << static_cast<int64_t>(*ssrc_it++);
-    while (ssrc_it != ssrcs_.end()) {
-      output << ", 0x" << std::hex << static_cast<int64_t>(*ssrc_it++);
-    }
-    output << std::dec;
-    auto pt_it = payload_types_.cbegin();
-    output << "; Payload Types: " << *pt_it++;
-    while (pt_it != payload_types_.end()) {
-      output << ", " << *pt_it++;
-    }
-    output << "');" << std::endl;
-  }
-}
-
-}  // namespace test
-}  // namespace webrtc
diff --git a/modules/audio_coding/neteq/tools/neteq_delay_analyzer.h b/modules/audio_coding/neteq/tools/neteq_delay_analyzer.h
deleted file mode 100644
index e142a3b..0000000
--- a/modules/audio_coding/neteq/tools/neteq_delay_analyzer.h
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- *  Copyright (c) 2017 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_NETEQ_TOOLS_NETEQ_DELAY_ANALYZER_H_
-#define WEBRTC_MODULES_AUDIO_CODING_NETEQ_TOOLS_NETEQ_DELAY_ANALYZER_H_
-
-#include <map>
-#include <set>
-#include <string>
-#include <vector>
-
-#include "webrtc/api/optional.h"
-#include "webrtc/modules/audio_coding/neteq/tools/neteq_input.h"
-#include "webrtc/modules/audio_coding/neteq/tools/neteq_test.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-namespace test {
-
-class NetEqDelayAnalyzer : public test::NetEqPostInsertPacket,
-                           public test::NetEqGetAudioCallback {
- public:
-  void AfterInsertPacket(const test::NetEqInput::PacketData& packet,
-                         NetEq* neteq) override;
-
-  void BeforeGetAudio(NetEq* neteq) override;
-
-  void AfterGetAudio(int64_t time_now_ms,
-                     const AudioFrame& audio_frame,
-                     bool muted,
-                     NetEq* neteq) override;
-
-  void CreateGraphs(std::vector<float>* send_times_s,
-                    std::vector<float>* arrival_delay_ms,
-                    std::vector<float>* corrected_arrival_delay_ms,
-                    std::vector<rtc::Optional<float>>* playout_delay_ms,
-                    std::vector<rtc::Optional<float>>* target_delay_ms) const;
-
-  // Creates a matlab script with file name script_name. When executed in
-  // Matlab, the script will generate graphs with the same timing information
-  // as provided by CreateGraphs.
-  void CreateMatlabScript(const std::string& script_name) const;
-
- private:
-  struct TimingData {
-    explicit TimingData(double at) : arrival_time_ms(at) {}
-    double arrival_time_ms;
-    rtc::Optional<int64_t> decode_get_audio_count;
-    rtc::Optional<int64_t> sync_delay_ms;
-    rtc::Optional<int> target_delay_ms;
-    rtc::Optional<int> current_delay_ms;
-  };
-  std::map<uint32_t, TimingData> data_;
-  std::vector<int64_t> get_audio_time_ms_;
-  size_t get_audio_count_ = 0;
-  size_t last_sync_buffer_ms_ = 0;
-  int last_sample_rate_hz_ = 0;
-  std::set<uint32_t> ssrcs_;
-  std::set<int> payload_types_;
-};
-
-}  // namespace test
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_AUDIO_CODING_NETEQ_TOOLS_NETEQ_DELAY_ANALYZER_H_
diff --git a/modules/audio_coding/neteq/tools/neteq_external_decoder_test.cc b/modules/audio_coding/neteq/tools/neteq_external_decoder_test.cc
deleted file mode 100644
index 8d88b08..0000000
--- a/modules/audio_coding/neteq/tools/neteq_external_decoder_test.cc
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- *  Copyright (c) 2015 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/neteq/tools/neteq_external_decoder_test.h"
-
-#include "webrtc/api/audio_codecs/builtin_audio_decoder_factory.h"
-#include "webrtc/rtc_base/format_macros.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-namespace test {
-
-NetEqExternalDecoderTest::NetEqExternalDecoderTest(NetEqDecoder codec,
-                                                   int sample_rate_hz,
-                                                   AudioDecoder* decoder)
-    : codec_(codec),
-      decoder_(decoder),
-      sample_rate_hz_(sample_rate_hz),
-      channels_(decoder_->Channels()) {
-  NetEq::Config config;
-  config.sample_rate_hz = sample_rate_hz_;
-  neteq_.reset(NetEq::Create(config, CreateBuiltinAudioDecoderFactory()));
-}
-
-void NetEqExternalDecoderTest::Init() {
-  ASSERT_EQ(NetEq::kOK,
-            neteq_->RegisterExternalDecoder(decoder_, codec_, name_,
-                                            kPayloadType));
-}
-
-void NetEqExternalDecoderTest::InsertPacket(
-    RTPHeader rtp_header,
-    rtc::ArrayView<const uint8_t> payload,
-    uint32_t receive_timestamp) {
-  ASSERT_EQ(NetEq::kOK,
-            neteq_->InsertPacket(rtp_header, payload, receive_timestamp));
-}
-
-void NetEqExternalDecoderTest::GetOutputAudio(AudioFrame* output) {
-  // Get audio from regular instance.
-  bool muted;
-  EXPECT_EQ(NetEq::kOK, neteq_->GetAudio(output, &muted));
-  ASSERT_FALSE(muted);
-  EXPECT_EQ(channels_, output->num_channels_);
-  EXPECT_EQ(static_cast<size_t>(kOutputLengthMs * sample_rate_hz_ / 1000),
-            output->samples_per_channel_);
-  EXPECT_EQ(sample_rate_hz_, neteq_->last_output_sample_rate_hz());
-}
-
-}  // namespace test
-}  // namespace webrtc
diff --git a/modules/audio_coding/neteq/tools/neteq_external_decoder_test.h b/modules/audio_coding/neteq/tools/neteq_external_decoder_test.h
deleted file mode 100644
index fc66c0f..0000000
--- a/modules/audio_coding/neteq/tools/neteq_external_decoder_test.h
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- *  Copyright (c) 2015 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_NETEQ_TOOLS_NETEQ_EXTERNAL_DECODER_TEST_H_
-#define WEBRTC_MODULES_AUDIO_CODING_NETEQ_TOOLS_NETEQ_EXTERNAL_DECODER_TEST_H_
-
-#include <memory>
-#include <string>
-
-#include "webrtc/api/audio_codecs/audio_decoder.h"
-#include "webrtc/common_types.h"
-#include "webrtc/modules/audio_coding/neteq/include/neteq.h"
-#include "webrtc/modules/include/module_common_types.h"
-
-namespace webrtc {
-namespace test {
-// This test class provides a way run NetEQ with an external decoder.
-class NetEqExternalDecoderTest {
- protected:
-  static const uint8_t kPayloadType = 95;
-  static const int kOutputLengthMs = 10;
-
-  // The external decoder |decoder| is suppose to be of type |codec|.
-  NetEqExternalDecoderTest(NetEqDecoder codec,
-                           int sample_rate_hz,
-                           AudioDecoder* decoder);
-
-  virtual ~NetEqExternalDecoderTest() { }
-
-  // In Init(), we register the external decoder.
-  void Init();
-
-  // Inserts a new packet with |rtp_header| and |payload| of
-  // |payload_size_bytes| bytes. The |receive_timestamp| is an indication
-  // of the time when the packet was received, and should be measured with
-  // the same tick rate as the RTP timestamp of the current payload.
-  virtual void InsertPacket(RTPHeader rtp_header,
-                            rtc::ArrayView<const uint8_t> payload,
-                            uint32_t receive_timestamp);
-
-  // Get 10 ms of audio data.
-  void GetOutputAudio(AudioFrame* output);
-
-  NetEq* neteq() { return neteq_.get(); }
-
- private:
-  NetEqDecoder codec_;
-  std::string name_ = "dummy name";
-  AudioDecoder* decoder_;
-  int sample_rate_hz_;
-  size_t channels_;
-  std::unique_ptr<NetEq> neteq_;
-};
-
-}  // namespace test
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_CODING_NETEQ_TOOLS_NETEQ_EXTERNAL_DECODER_TEST_H_
diff --git a/modules/audio_coding/neteq/tools/neteq_input.cc b/modules/audio_coding/neteq/tools/neteq_input.cc
deleted file mode 100644
index 752bb29..0000000
--- a/modules/audio_coding/neteq/tools/neteq_input.cc
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- *  Copyright (c) 2017 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/neteq/tools/neteq_input.h"
-
-#include <sstream>
-
-namespace webrtc {
-namespace test {
-
-std::string NetEqInput::PacketData::ToString() const {
-  std::stringstream ss;
-  ss << "{"
-     << "time_ms: " << static_cast<int64_t>(time_ms) << ", "
-     << "header: {"
-     << "pt: " << static_cast<int>(header.payloadType) << ", "
-     << "sn: " << header.sequenceNumber << ", "
-     << "ts: " << header.timestamp << ", "
-     << "ssrc: " << header.ssrc << "}, "
-     << "payload bytes: " << payload.size() << "}";
-  return ss.str();
-}
-
-}  // namespace test
-}  // namespace webrtc
diff --git a/modules/audio_coding/neteq/tools/neteq_input.h b/modules/audio_coding/neteq/tools/neteq_input.h
deleted file mode 100644
index 08f554b..0000000
--- a/modules/audio_coding/neteq/tools/neteq_input.h
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- *  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_NETEQ_TOOLS_NETEQ_INPUT_H_
-#define WEBRTC_MODULES_AUDIO_CODING_NETEQ_TOOLS_NETEQ_INPUT_H_
-
-#include <algorithm>
-#include <memory>
-#include <string>
-
-#include "webrtc/api/optional.h"
-#include "webrtc/common_types.h"
-#include "webrtc/modules/audio_coding/neteq/tools/packet.h"
-#include "webrtc/modules/audio_coding/neteq/tools/packet_source.h"
-#include "webrtc/rtc_base/buffer.h"
-
-namespace webrtc {
-namespace test {
-
-// Interface class for input to the NetEqTest class.
-class NetEqInput {
- public:
-  struct PacketData {
-    std::string ToString() const;
-
-    RTPHeader header;
-    rtc::Buffer payload;
-    double time_ms;
-  };
-
-  virtual ~NetEqInput() = default;
-
-  // Returns at what time (in ms) NetEq::InsertPacket should be called next, or
-  // empty if the source is out of packets.
-  virtual rtc::Optional<int64_t> NextPacketTime() const = 0;
-
-  // Returns at what time (in ms) NetEq::GetAudio should be called next, or
-  // empty if no more output events are available.
-  virtual rtc::Optional<int64_t> NextOutputEventTime() const = 0;
-
-  // Returns the time (in ms) for the next event from either NextPacketTime()
-  // or NextOutputEventTime(), or empty if both are out of events.
-  rtc::Optional<int64_t> NextEventTime() const {
-    const auto a = NextPacketTime();
-    const auto b = NextOutputEventTime();
-    // Return the minimum of non-empty |a| and |b|, or empty if both are empty.
-    if (a) {
-      return b ? rtc::Optional<int64_t>(std::min(*a, *b)) : a;
-    }
-    return b ? b : rtc::Optional<int64_t>();
-  }
-
-  // Returns the next packet to be inserted into NetEq. The packet following the
-  // returned one is pre-fetched in the NetEqInput object, such that future
-  // calls to NextPacketTime() or NextHeader() will return information from that
-  // packet.
-  virtual std::unique_ptr<PacketData> PopPacket() = 0;
-
-  // Move to the next output event. This will make NextOutputEventTime() return
-  // a new value (potentially the same if several output events share the same
-  // time).
-  virtual void AdvanceOutputEvent() = 0;
-
-  // Returns true if the source has come to an end. An implementation must
-  // eventually return true from this method, or the test will end up in an
-  // infinite loop.
-  virtual bool ended() const = 0;
-
-  // Returns the RTP header for the next packet, i.e., the packet that will be
-  // delivered next by PopPacket().
-  virtual rtc::Optional<RTPHeader> NextHeader() const = 0;
-};
-
-}  // namespace test
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_AUDIO_CODING_NETEQ_TOOLS_NETEQ_INPUT_H_
diff --git a/modules/audio_coding/neteq/tools/neteq_packet_source_input.cc b/modules/audio_coding/neteq/tools/neteq_packet_source_input.cc
deleted file mode 100644
index 13a061f..0000000
--- a/modules/audio_coding/neteq/tools/neteq_packet_source_input.cc
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- *  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/neteq/tools/neteq_packet_source_input.h"
-
-#include <algorithm>
-#include <limits>
-
-#include "webrtc/modules/audio_coding/neteq/tools/rtc_event_log_source.h"
-#include "webrtc/modules/audio_coding/neteq/tools/rtp_file_source.h"
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-namespace test {
-
-NetEqPacketSourceInput::NetEqPacketSourceInput() : next_output_event_ms_(0) {}
-
-rtc::Optional<int64_t> NetEqPacketSourceInput::NextPacketTime() const {
-  return packet_
-             ? rtc::Optional<int64_t>(static_cast<int64_t>(packet_->time_ms()))
-             : rtc::Optional<int64_t>();
-}
-
-rtc::Optional<RTPHeader> NetEqPacketSourceInput::NextHeader() const {
-  return packet_ ? rtc::Optional<RTPHeader>(packet_->header())
-                 : rtc::Optional<RTPHeader>();
-}
-
-void NetEqPacketSourceInput::LoadNextPacket() {
-  packet_ = source()->NextPacket();
-}
-
-std::unique_ptr<NetEqInput::PacketData> NetEqPacketSourceInput::PopPacket() {
-  if (!packet_) {
-    return std::unique_ptr<PacketData>();
-  }
-  std::unique_ptr<PacketData> packet_data(new PacketData);
-  packet_data->header = packet_->header();
-  if (packet_->payload_length_bytes() == 0 &&
-      packet_->virtual_payload_length_bytes() > 0) {
-    // This is a header-only "dummy" packet. Set the payload to all zeros, with
-    // length according to the virtual length.
-    packet_data->payload.SetSize(packet_->virtual_payload_length_bytes());
-    std::fill_n(packet_data->payload.data(), packet_data->payload.size(), 0);
-  } else {
-    packet_data->payload.SetData(packet_->payload(),
-                                 packet_->payload_length_bytes());
-  }
-  packet_data->time_ms = packet_->time_ms();
-
-  LoadNextPacket();
-
-  return packet_data;
-}
-
-NetEqRtpDumpInput::NetEqRtpDumpInput(const std::string& file_name,
-                                     const RtpHeaderExtensionMap& hdr_ext_map)
-    : source_(RtpFileSource::Create(file_name)) {
-  for (const auto& ext_pair : hdr_ext_map) {
-    source_->RegisterRtpHeaderExtension(ext_pair.second, ext_pair.first);
-  }
-  LoadNextPacket();
-}
-
-rtc::Optional<int64_t> NetEqRtpDumpInput::NextOutputEventTime() const {
-  return next_output_event_ms_;
-}
-
-void NetEqRtpDumpInput::AdvanceOutputEvent() {
-  if (next_output_event_ms_) {
-    *next_output_event_ms_ += kOutputPeriodMs;
-  }
-  if (!NextPacketTime()) {
-    next_output_event_ms_ = rtc::Optional<int64_t>();
-  }
-}
-
-PacketSource* NetEqRtpDumpInput::source() {
-  return source_.get();
-}
-
-NetEqEventLogInput::NetEqEventLogInput(const std::string& file_name,
-                                       const RtpHeaderExtensionMap& hdr_ext_map)
-    : source_(RtcEventLogSource::Create(file_name)) {
-  for (const auto& ext_pair : hdr_ext_map) {
-    source_->RegisterRtpHeaderExtension(ext_pair.second, ext_pair.first);
-  }
-  LoadNextPacket();
-  AdvanceOutputEvent();
-}
-
-rtc::Optional<int64_t> NetEqEventLogInput::NextOutputEventTime() const {
-  return rtc::Optional<int64_t>(next_output_event_ms_);
-}
-
-void NetEqEventLogInput::AdvanceOutputEvent() {
-  next_output_event_ms_ =
-      rtc::Optional<int64_t>(source_->NextAudioOutputEventMs());
-  if (*next_output_event_ms_ == std::numeric_limits<int64_t>::max()) {
-    next_output_event_ms_ = rtc::Optional<int64_t>();
-  }
-}
-
-PacketSource* NetEqEventLogInput::source() {
-  return source_.get();
-}
-
-}  // namespace test
-}  // namespace webrtc
diff --git a/modules/audio_coding/neteq/tools/neteq_packet_source_input.h b/modules/audio_coding/neteq/tools/neteq_packet_source_input.h
deleted file mode 100644
index 35b54fa..0000000
--- a/modules/audio_coding/neteq/tools/neteq_packet_source_input.h
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- *  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_NETEQ_TOOLS_NETEQ_PACKET_SOURCE_INPUT_H_
-#define WEBRTC_MODULES_AUDIO_CODING_NETEQ_TOOLS_NETEQ_PACKET_SOURCE_INPUT_H_
-
-#include <map>
-#include <string>
-
-#include "webrtc/modules/audio_coding/neteq/tools/neteq_input.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
-
-namespace webrtc {
-namespace test {
-
-class RtpFileSource;
-class RtcEventLogSource;
-
-// An adapter class to dress up a PacketSource object as a NetEqInput.
-class NetEqPacketSourceInput : public NetEqInput {
- public:
-  using RtpHeaderExtensionMap = std::map<int, webrtc::RTPExtensionType>;
-
-  NetEqPacketSourceInput();
-  rtc::Optional<int64_t> NextPacketTime() const override;
-  std::unique_ptr<PacketData> PopPacket() override;
-  rtc::Optional<RTPHeader> NextHeader() const override;
-  bool ended() const override { return !next_output_event_ms_; }
-
- protected:
-  virtual PacketSource* source() = 0;
-  void LoadNextPacket();
-
-  rtc::Optional<int64_t> next_output_event_ms_;
-
- private:
-  std::unique_ptr<Packet> packet_;
-};
-
-// Implementation of NetEqPacketSourceInput to be used with an RtpFileSource.
-class NetEqRtpDumpInput final : public NetEqPacketSourceInput {
- public:
-  NetEqRtpDumpInput(const std::string& file_name,
-                    const RtpHeaderExtensionMap& hdr_ext_map);
-
-  rtc::Optional<int64_t> NextOutputEventTime() const override;
-  void AdvanceOutputEvent() override;
-
- protected:
-  PacketSource* source() override;
-
- private:
-  static constexpr int64_t kOutputPeriodMs = 10;
-
-  std::unique_ptr<RtpFileSource> source_;
-};
-
-// Implementation of NetEqPacketSourceInput to be used with an
-// RtcEventLogSource.
-class NetEqEventLogInput final : public NetEqPacketSourceInput {
- public:
-  NetEqEventLogInput(const std::string& file_name,
-                     const RtpHeaderExtensionMap& hdr_ext_map);
-
-  rtc::Optional<int64_t> NextOutputEventTime() const override;
-  void AdvanceOutputEvent() override;
-
- protected:
-  PacketSource* source() override;
-
- private:
-  std::unique_ptr<RtcEventLogSource> source_;
-};
-
-}  // namespace test
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_AUDIO_CODING_NETEQ_TOOLS_NETEQ_PACKET_SOURCE_INPUT_H_
diff --git a/modules/audio_coding/neteq/tools/neteq_performance_test.cc b/modules/audio_coding/neteq/tools/neteq_performance_test.cc
deleted file mode 100644
index 8d0cf90..0000000
--- a/modules/audio_coding/neteq/tools/neteq_performance_test.cc
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- *  Copyright (c) 2014 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/neteq/tools/neteq_performance_test.h"
-
-#include "webrtc/api/audio_codecs/builtin_audio_decoder_factory.h"
-#include "webrtc/common_types.h"
-#include "webrtc/modules/audio_coding/codecs/pcm16b/pcm16b.h"
-#include "webrtc/modules/audio_coding/neteq/include/neteq.h"
-#include "webrtc/modules/audio_coding/neteq/tools/audio_loop.h"
-#include "webrtc/modules/audio_coding/neteq/tools/rtp_generator.h"
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/system_wrappers/include/clock.h"
-#include "webrtc/test/testsupport/fileutils.h"
-#include "webrtc/typedefs.h"
-
-using webrtc::NetEq;
-using webrtc::test::AudioLoop;
-using webrtc::test::RtpGenerator;
-
-namespace webrtc {
-namespace test {
-
-int64_t NetEqPerformanceTest::Run(int runtime_ms,
-                                  int lossrate,
-                                  double drift_factor) {
-  const std::string kInputFileName =
-      webrtc::test::ResourcePath("audio_coding/testfile32kHz", "pcm");
-  const int kSampRateHz = 32000;
-  const webrtc::NetEqDecoder kDecoderType =
-      webrtc::NetEqDecoder::kDecoderPCM16Bswb32kHz;
-  const std::string kDecoderName = "pcm16-swb32";
-  const int kPayloadType = 95;
-
-  // Initialize NetEq instance.
-  NetEq::Config config;
-  config.sample_rate_hz = kSampRateHz;
-  NetEq* neteq = NetEq::Create(config, CreateBuiltinAudioDecoderFactory());
-  // Register decoder in |neteq|.
-  if (neteq->RegisterPayloadType(kDecoderType, kDecoderName, kPayloadType) != 0)
-    return -1;
-
-  // Set up AudioLoop object.
-  AudioLoop audio_loop;
-  const size_t kMaxLoopLengthSamples = kSampRateHz * 10;  // 10 second loop.
-  const size_t kInputBlockSizeSamples = 60 * kSampRateHz / 1000;  // 60 ms.
-  if (!audio_loop.Init(kInputFileName, kMaxLoopLengthSamples,
-                       kInputBlockSizeSamples))
-    return -1;
-
-  int32_t time_now_ms = 0;
-
-  // Get first input packet.
-  RTPHeader rtp_header;
-  RtpGenerator rtp_gen(kSampRateHz / 1000);
-  // Start with positive drift first half of simulation.
-  rtp_gen.set_drift_factor(drift_factor);
-  bool drift_flipped = false;
-  int32_t packet_input_time_ms =
-      rtp_gen.GetRtpHeader(kPayloadType, kInputBlockSizeSamples, &rtp_header);
-  auto input_samples = audio_loop.GetNextBlock();
-  if (input_samples.empty())
-    exit(1);
-  uint8_t input_payload[kInputBlockSizeSamples * sizeof(int16_t)];
-  size_t payload_len = WebRtcPcm16b_Encode(input_samples.data(),
-                                           input_samples.size(), input_payload);
-  RTC_CHECK_EQ(sizeof(input_payload), payload_len);
-
-  // Main loop.
-  webrtc::Clock* clock = webrtc::Clock::GetRealTimeClock();
-  int64_t start_time_ms = clock->TimeInMilliseconds();
-  AudioFrame out_frame;
-  while (time_now_ms < runtime_ms) {
-    while (packet_input_time_ms <= time_now_ms) {
-      // Drop every N packets, where N = FLAG_lossrate.
-      bool lost = false;
-      if (lossrate > 0) {
-        lost = ((rtp_header.sequenceNumber - 1) % lossrate) == 0;
-      }
-      if (!lost) {
-        // Insert packet.
-        int error =
-            neteq->InsertPacket(rtp_header, input_payload,
-                                packet_input_time_ms * kSampRateHz / 1000);
-        if (error != NetEq::kOK)
-          return -1;
-      }
-
-      // Get next packet.
-      packet_input_time_ms = rtp_gen.GetRtpHeader(kPayloadType,
-                                                  kInputBlockSizeSamples,
-                                                  &rtp_header);
-      input_samples = audio_loop.GetNextBlock();
-      if (input_samples.empty())
-        return -1;
-      payload_len = WebRtcPcm16b_Encode(input_samples.data(),
-                                        input_samples.size(), input_payload);
-      assert(payload_len == kInputBlockSizeSamples * sizeof(int16_t));
-    }
-
-    // Get output audio, but don't do anything with it.
-    bool muted;
-    int error = neteq->GetAudio(&out_frame, &muted);
-    RTC_CHECK(!muted);
-    if (error != NetEq::kOK)
-      return -1;
-
-    assert(out_frame.samples_per_channel_ ==
-           static_cast<size_t>(kSampRateHz * 10 / 1000));
-
-    static const int kOutputBlockSizeMs = 10;
-    time_now_ms += kOutputBlockSizeMs;
-    if (time_now_ms >= runtime_ms / 2 && !drift_flipped) {
-      // Apply negative drift second half of simulation.
-      rtp_gen.set_drift_factor(-drift_factor);
-      drift_flipped = true;
-    }
-  }
-  int64_t end_time_ms = clock->TimeInMilliseconds();
-  delete neteq;
-  return end_time_ms - start_time_ms;
-}
-
-}  // namespace test
-}  // namespace webrtc
diff --git a/modules/audio_coding/neteq/tools/neteq_performance_test.h b/modules/audio_coding/neteq/tools/neteq_performance_test.h
deleted file mode 100644
index d094db0..0000000
--- a/modules/audio_coding/neteq/tools/neteq_performance_test.h
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- *  Copyright (c) 2014 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_NETEQ_TOOLS_NETEQ_PERFORMANCE_TEST_H_
-#define WEBRTC_MODULES_AUDIO_CODING_NETEQ_TOOLS_NETEQ_PERFORMANCE_TEST_H_
-
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-namespace test {
-
-class NetEqPerformanceTest {
- public:
-  // Runs a performance test with parameters as follows:
-  //   |runtime_ms|: the simulation time, i.e., the duration of the audio data.
-  //   |lossrate|: drop one out of |lossrate| packets, e.g., one out of 10.
-  //   |drift_factor|: clock drift in [0, 1].
-  // Returns the runtime in ms.
-  static int64_t Run(int runtime_ms, int lossrate, double drift_factor);
-};
-
-}  // namespace test
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_CODING_NETEQ_TOOLS_NETEQ_PERFORMANCE_TEST_H_
diff --git a/modules/audio_coding/neteq/tools/neteq_quality_test.cc b/modules/audio_coding/neteq/tools/neteq_quality_test.cc
deleted file mode 100644
index 85adb59..0000000
--- a/modules/audio_coding/neteq/tools/neteq_quality_test.cc
+++ /dev/null
@@ -1,377 +0,0 @@
-/*
- *  Copyright (c) 2014 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 <math.h>
-#include <stdio.h>
-
-#include "webrtc/api/audio_codecs/builtin_audio_decoder_factory.h"
-#include "webrtc/modules/audio_coding/neteq/tools/neteq_quality_test.h"
-#include "webrtc/modules/audio_coding/neteq/tools/output_audio_file.h"
-#include "webrtc/modules/audio_coding/neteq/tools/output_wav_file.h"
-#include "webrtc/modules/audio_coding/neteq/tools/resample_input_audio_file.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/test/testsupport/fileutils.h"
-
-namespace webrtc {
-namespace test {
-
-const uint8_t kPayloadType = 95;
-const int kOutputSizeMs = 10;
-const int kInitSeed = 0x12345678;
-const int kPacketLossTimeUnitMs = 10;
-
-const std::string& DefaultInFilename() {
-  static const std::string path =
-      ResourcePath("audio_coding/speech_mono_16kHz", "pcm");
-  return path;
-}
-
-const std::string& DefaultOutFilename() {
-  static const std::string path = OutputPath() + "neteq_quality_test_out.pcm";
-  return path;
-}
-
-// Common validator for file names.
-static bool ValidateFilename(const std::string& value, bool write) {
-  FILE* fid = write ? fopen(value.c_str(), "wb") : fopen(value.c_str(), "rb");
-  if (fid == nullptr)
-    return false;
-  fclose(fid);
-  return true;
-}
-
-DEFINE_string(in_filename, DefaultInFilename().c_str(),
-    "Filename for input audio (specify sample rate with --input_sample_rate, "
-    "and channels with --channels).");
-
-DEFINE_int(input_sample_rate, 16000, "Sample rate of input file in Hz.");
-
-DEFINE_int(channels, 1, "Number of channels in input audio.");
-
-DEFINE_string(out_filename, DefaultOutFilename().c_str(),
-    "Name of output audio file.");
-
-DEFINE_int(runtime_ms, 10000, "Simulated runtime (milliseconds).");
-
-DEFINE_int(packet_loss_rate, 10, "Percentile of packet loss.");
-
-DEFINE_int(random_loss_mode, 1,
-    "Random loss mode: 0--no loss, 1--uniform loss, 2--Gilbert Elliot loss.");
-
-DEFINE_int(burst_length, 30,
-    "Burst length in milliseconds, only valid for Gilbert Elliot loss.");
-
-DEFINE_float(drift_factor, 0.0, "Time drift factor.");
-
-// ProbTrans00Solver() is to calculate the transition probability from no-loss
-// state to itself in a modified Gilbert Elliot packet loss model. The result is
-// to achieve the target packet loss rate |loss_rate|, when a packet is not
-// lost only if all |units| drawings within the duration of the packet result in
-// no-loss.
-static double ProbTrans00Solver(int units, double loss_rate,
-                                double prob_trans_10) {
-  if (units == 1)
-    return prob_trans_10 / (1.0f - loss_rate) - prob_trans_10;
-// 0 == prob_trans_00 ^ (units - 1) + (1 - loss_rate) / prob_trans_10 *
-//     prob_trans_00 - (1 - loss_rate) * (1 + 1 / prob_trans_10).
-// There is a unique solution between 0.0 and 1.0, due to the monotonicity and
-// an opposite sign at 0.0 and 1.0.
-// For simplicity, we reformulate the equation as
-//     f(x) = x ^ (units - 1) + a x + b.
-// Its derivative is
-//     f'(x) = (units - 1) x ^ (units - 2) + a.
-// The derivative is strictly greater than 0 when x is between 0 and 1.
-// We use Newton's method to solve the equation, iteration is
-//     x(k+1) = x(k) - f(x) / f'(x);
-  const double kPrecision = 0.001f;
-  const int kIterations = 100;
-  const double a = (1.0f - loss_rate) / prob_trans_10;
-  const double b = (loss_rate - 1.0f) * (1.0f + 1.0f / prob_trans_10);
-  double x = 0.0f;  // Starting point;
-  double f = b;
-  double f_p;
-  int iter = 0;
-  while ((f >= kPrecision || f <= -kPrecision) && iter < kIterations) {
-    f_p = (units - 1.0f) * pow(x, units - 2) + a;
-    x -= f / f_p;
-    if (x > 1.0f) {
-      x = 1.0f;
-    } else if (x < 0.0f) {
-      x = 0.0f;
-    }
-    f = pow(x, units - 1) + a * x + b;
-    iter ++;
-  }
-  return x;
-}
-
-NetEqQualityTest::NetEqQualityTest(int block_duration_ms,
-                                   int in_sampling_khz,
-                                   int out_sampling_khz,
-                                   NetEqDecoder decoder_type)
-    : decoder_type_(decoder_type),
-      channels_(static_cast<size_t>(FLAG_channels)),
-      decoded_time_ms_(0),
-      decodable_time_ms_(0),
-      drift_factor_(FLAG_drift_factor),
-      packet_loss_rate_(FLAG_packet_loss_rate),
-      block_duration_ms_(block_duration_ms),
-      in_sampling_khz_(in_sampling_khz),
-      out_sampling_khz_(out_sampling_khz),
-      in_size_samples_(
-          static_cast<size_t>(in_sampling_khz_ * block_duration_ms_)),
-      payload_size_bytes_(0),
-      max_payload_bytes_(0),
-      in_file_(new ResampleInputAudioFile(FLAG_in_filename,
-                                          FLAG_input_sample_rate,
-                                          in_sampling_khz * 1000)),
-      rtp_generator_(
-          new RtpGenerator(in_sampling_khz_, 0, 0, decodable_time_ms_)),
-      total_payload_size_bytes_(0) {
-  // Flag validation
-  RTC_CHECK(ValidateFilename(FLAG_in_filename, false))
-      << "Invalid input filename.";
-
-  RTC_CHECK(FLAG_input_sample_rate == 8000 || FLAG_input_sample_rate == 16000 ||
-            FLAG_input_sample_rate == 32000 || FLAG_input_sample_rate == 48000)
-      << "Invalid sample rate should be 8000, 16000, 32000 or 48000 Hz.";
-
-  RTC_CHECK_EQ(FLAG_channels, 1)
-      << "Invalid number of channels, current support only 1.";
-
-  RTC_CHECK(ValidateFilename(FLAG_out_filename, true))
-      << "Invalid output filename.";
-
-  RTC_CHECK_GT(FLAG_runtime_ms, 0)
-      << "Invalid runtime, should be greater than 0.";
-
-  RTC_CHECK(FLAG_packet_loss_rate >= 0 && FLAG_packet_loss_rate <= 100)
-      << "Invalid packet loss percentile, should be between 0 and 100.";
-
-  RTC_CHECK(FLAG_random_loss_mode >= 0 && FLAG_random_loss_mode <= 2)
-      << "Invalid random packet loss mode, should be between 0 and 2.";
-
-  RTC_CHECK_GE(FLAG_burst_length, kPacketLossTimeUnitMs)
-      << "Invalid burst length, should be greater than or equal to "
-      << kPacketLossTimeUnitMs << " ms.";
-
-  RTC_CHECK_GT(FLAG_drift_factor, -0.1)
-      << "Invalid drift factor, should be greater than -0.1.";
-
-  const std::string out_filename = FLAG_out_filename;
-  const std::string log_filename = out_filename + ".log";
-  log_file_.open(log_filename.c_str(), std::ofstream::out);
-  RTC_CHECK(log_file_.is_open());
-
-  if (out_filename.size() >= 4 &&
-      out_filename.substr(out_filename.size() - 4) == ".wav") {
-    // Open a wav file.
-    output_.reset(
-        new webrtc::test::OutputWavFile(out_filename, 1000 * out_sampling_khz));
-  } else {
-    // Open a pcm file.
-    output_.reset(new webrtc::test::OutputAudioFile(out_filename));
-  }
-
-  NetEq::Config config;
-  config.sample_rate_hz = out_sampling_khz_ * 1000;
-  neteq_.reset(
-      NetEq::Create(config, webrtc::CreateBuiltinAudioDecoderFactory()));
-  max_payload_bytes_ = in_size_samples_ * channels_ * sizeof(int16_t);
-  in_data_.reset(new int16_t[in_size_samples_ * channels_]);
-}
-
-NetEqQualityTest::~NetEqQualityTest() {
-  log_file_.close();
-}
-
-bool NoLoss::Lost() {
-  return false;
-}
-
-UniformLoss::UniformLoss(double loss_rate)
-    : loss_rate_(loss_rate) {
-}
-
-bool UniformLoss::Lost() {
-  int drop_this = rand();
-  return (drop_this < loss_rate_ * RAND_MAX);
-}
-
-GilbertElliotLoss::GilbertElliotLoss(double prob_trans_11, double prob_trans_01)
-    : prob_trans_11_(prob_trans_11),
-      prob_trans_01_(prob_trans_01),
-      lost_last_(false),
-      uniform_loss_model_(new UniformLoss(0)) {
-}
-
-GilbertElliotLoss::~GilbertElliotLoss() {}
-
-bool GilbertElliotLoss::Lost() {
-  // Simulate bursty channel (Gilbert model).
-  // (1st order) Markov chain model with memory of the previous/last
-  // packet state (lost or received).
-  if (lost_last_) {
-    // Previous packet was not received.
-    uniform_loss_model_->set_loss_rate(prob_trans_11_);
-    return lost_last_ = uniform_loss_model_->Lost();
-  } else {
-    uniform_loss_model_->set_loss_rate(prob_trans_01_);
-    return lost_last_ = uniform_loss_model_->Lost();
-  }
-}
-
-void NetEqQualityTest::SetUp() {
-  ASSERT_EQ(0,
-            neteq_->RegisterPayloadType(decoder_type_, "noname", kPayloadType));
-  rtp_generator_->set_drift_factor(drift_factor_);
-
-  int units = block_duration_ms_ / kPacketLossTimeUnitMs;
-  switch (FLAG_random_loss_mode) {
-    case 1: {
-      // |unit_loss_rate| is the packet loss rate for each unit time interval
-      // (kPacketLossTimeUnitMs). Since a packet loss event is generated if any
-      // of |block_duration_ms_ / kPacketLossTimeUnitMs| unit time intervals of
-      // a full packet duration is drawn with a loss, |unit_loss_rate| fulfills
-      // (1 - unit_loss_rate) ^ (block_duration_ms_ / kPacketLossTimeUnitMs) ==
-      // 1 - packet_loss_rate.
-      double unit_loss_rate = (1.0f - pow(1.0f - 0.01f * packet_loss_rate_,
-          1.0f / units));
-      loss_model_.reset(new UniformLoss(unit_loss_rate));
-      break;
-    }
-    case 2: {
-      // |FLAG_burst_length| should be integer times of kPacketLossTimeUnitMs.
-      ASSERT_EQ(0, FLAG_burst_length % kPacketLossTimeUnitMs);
-
-      // We do not allow 100 percent packet loss in Gilbert Elliot model, which
-      // makes no sense.
-      ASSERT_GT(100, packet_loss_rate_);
-
-      // To guarantee the overall packet loss rate, transition probabilities
-      // need to satisfy:
-      // pi_0 * (1 - prob_trans_01_) ^ units +
-      //     pi_1 * prob_trans_10_ ^ (units - 1) == 1 - loss_rate
-      // pi_0 = prob_trans_10 / (prob_trans_10 + prob_trans_01_)
-      //     is the stationary state probability of no-loss
-      // pi_1 = prob_trans_01_ / (prob_trans_10 + prob_trans_01_)
-      //     is the stationary state probability of loss
-      // After a derivation prob_trans_00 should satisfy:
-      // prob_trans_00 ^ (units - 1) = (loss_rate - 1) / prob_trans_10 *
-      //     prob_trans_00 + (1 - loss_rate) * (1 + 1 / prob_trans_10).
-      double loss_rate = 0.01f * packet_loss_rate_;
-      double prob_trans_10 = 1.0f * kPacketLossTimeUnitMs / FLAG_burst_length;
-      double prob_trans_00 = ProbTrans00Solver(units, loss_rate, prob_trans_10);
-      loss_model_.reset(new GilbertElliotLoss(1.0f - prob_trans_10,
-                                              1.0f - prob_trans_00));
-      break;
-    }
-    default: {
-      loss_model_.reset(new NoLoss);
-      break;
-    }
-  }
-
-  // Make sure that the packet loss profile is same for all derived tests.
-  srand(kInitSeed);
-}
-
-std::ofstream& NetEqQualityTest::Log() {
-  return log_file_;
-}
-
-bool NetEqQualityTest::PacketLost() {
-  int cycles = block_duration_ms_ / kPacketLossTimeUnitMs;
-
-  // The loop is to make sure that codecs with different block lengths share the
-  // same packet loss profile.
-  bool lost = false;
-  for (int idx = 0; idx < cycles; idx ++) {
-    if (loss_model_->Lost()) {
-      // The packet will be lost if any of the drawings indicates a loss, but
-      // the loop has to go on to make sure that codecs with different block
-      // lengths keep the same pace.
-      lost = true;
-    }
-  }
-  return lost;
-}
-
-int NetEqQualityTest::Transmit() {
-  int packet_input_time_ms =
-      rtp_generator_->GetRtpHeader(kPayloadType, in_size_samples_,
-                                   &rtp_header_);
-  Log() << "Packet of size "
-        << payload_size_bytes_
-        << " bytes, for frame at "
-        << packet_input_time_ms
-        << " ms ";
-  if (payload_size_bytes_ > 0) {
-    if (!PacketLost()) {
-      int ret = neteq_->InsertPacket(
-          rtp_header_,
-          rtc::ArrayView<const uint8_t>(payload_.data(), payload_size_bytes_),
-          packet_input_time_ms * in_sampling_khz_);
-      if (ret != NetEq::kOK)
-        return -1;
-      Log() << "was sent.";
-    } else {
-      Log() << "was lost.";
-    }
-  }
-  Log() << std::endl;
-  return packet_input_time_ms;
-}
-
-int NetEqQualityTest::DecodeBlock() {
-  bool muted;
-  int ret = neteq_->GetAudio(&out_frame_, &muted);
-  RTC_CHECK(!muted);
-
-  if (ret != NetEq::kOK) {
-    return -1;
-  } else {
-    RTC_DCHECK_EQ(out_frame_.num_channels_, channels_);
-    RTC_DCHECK_EQ(out_frame_.samples_per_channel_,
-                  static_cast<size_t>(kOutputSizeMs * out_sampling_khz_));
-    RTC_CHECK(output_->WriteArray(
-        out_frame_.data(),
-        out_frame_.samples_per_channel_ * out_frame_.num_channels_));
-    return static_cast<int>(out_frame_.samples_per_channel_);
-  }
-}
-
-void NetEqQualityTest::Simulate() {
-  int audio_size_samples;
-
-  while (decoded_time_ms_ < FLAG_runtime_ms) {
-    // Assume 10 packets in packets buffer.
-    while (decodable_time_ms_ - 10 * block_duration_ms_ < decoded_time_ms_) {
-      ASSERT_TRUE(in_file_->Read(in_size_samples_ * channels_, &in_data_[0]));
-      payload_.Clear();
-      payload_size_bytes_ = EncodeBlock(&in_data_[0],
-                                        in_size_samples_, &payload_,
-                                        max_payload_bytes_);
-      total_payload_size_bytes_ += payload_size_bytes_;
-      decodable_time_ms_ = Transmit() + block_duration_ms_;
-    }
-    audio_size_samples = DecodeBlock();
-    if (audio_size_samples > 0) {
-      decoded_time_ms_ += audio_size_samples / out_sampling_khz_;
-    }
-  }
-  Log() << "Average bit rate was "
-        << 8.0f * total_payload_size_bytes_ / FLAG_runtime_ms
-        << " kbps"
-        << std::endl;
-}
-
-}  // namespace test
-}  // namespace webrtc
diff --git a/modules/audio_coding/neteq/tools/neteq_quality_test.h b/modules/audio_coding/neteq/tools/neteq_quality_test.h
deleted file mode 100644
index c1964b6..0000000
--- a/modules/audio_coding/neteq/tools/neteq_quality_test.h
+++ /dev/null
@@ -1,140 +0,0 @@
-/*
- *  Copyright (c) 2014 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_NETEQ_TOOLS_NETEQ_QUALITY_TEST_H_
-#define WEBRTC_MODULES_AUDIO_CODING_NETEQ_TOOLS_NETEQ_QUALITY_TEST_H_
-
-#include <fstream>
-#include <memory>
-
-#include "webrtc/common_types.h"
-#include "webrtc/modules/audio_coding/neteq/include/neteq.h"
-#include "webrtc/modules/audio_coding/neteq/tools/audio_sink.h"
-#include "webrtc/modules/audio_coding/neteq/tools/input_audio_file.h"
-#include "webrtc/modules/audio_coding/neteq/tools/rtp_generator.h"
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/rtc_base/flags.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-namespace test {
-
-class LossModel {
- public:
-  virtual ~LossModel() {};
-  virtual bool Lost() = 0;
-};
-
-class NoLoss : public LossModel {
- public:
-  bool Lost() override;
-};
-
-class UniformLoss : public LossModel {
- public:
-  UniformLoss(double loss_rate);
-  bool Lost() override;
-  void set_loss_rate(double loss_rate) { loss_rate_ = loss_rate; }
-
- private:
-  double loss_rate_;
-};
-
-class GilbertElliotLoss : public LossModel {
- public:
-  GilbertElliotLoss(double prob_trans_11, double prob_trans_01);
-  ~GilbertElliotLoss() override;
-  bool Lost() override;
-
- private:
-  // Prob. of losing current packet, when previous packet is lost.
-  double prob_trans_11_;
-  // Prob. of losing current packet, when previous packet is not lost.
-  double prob_trans_01_;
-  bool lost_last_;
-  std::unique_ptr<UniformLoss> uniform_loss_model_;
-};
-
-class NetEqQualityTest : public ::testing::Test {
- protected:
-  NetEqQualityTest(int block_duration_ms,
-                   int in_sampling_khz,
-                   int out_sampling_khz,
-                   NetEqDecoder decoder_type);
-  ~NetEqQualityTest() override;
-
-  void SetUp() override;
-
-  // EncodeBlock(...) does the following:
-  // 1. encodes a block of audio, saved in |in_data| and has a length of
-  // |block_size_samples| (samples per channel),
-  // 2. save the bit stream to |payload| of |max_bytes| bytes in size,
-  // 3. returns the length of the payload (in bytes),
-  virtual int EncodeBlock(int16_t* in_data, size_t block_size_samples,
-                          rtc::Buffer* payload, size_t max_bytes) = 0;
-
-  // PacketLost(...) determines weather a packet sent at an indicated time gets
-  // lost or not.
-  bool PacketLost();
-
-  // DecodeBlock() decodes a block of audio using the payload stored in
-  // |payload_| with the length of |payload_size_bytes_| (bytes). The decoded
-  // audio is to be stored in |out_data_|.
-  int DecodeBlock();
-
-  // Transmit() uses |rtp_generator_| to generate a packet and passes it to
-  // |neteq_|.
-  int Transmit();
-
-  // Runs encoding / transmitting / decoding.
-  void Simulate();
-
-  // Write to log file. Usage Log() << ...
-  std::ofstream& Log();
-
-  NetEqDecoder decoder_type_;
-  const size_t channels_;
-
- private:
-  int decoded_time_ms_;
-  int decodable_time_ms_;
-  double drift_factor_;
-  int packet_loss_rate_;
-  const int block_duration_ms_;
-  const int in_sampling_khz_;
-  const int out_sampling_khz_;
-
-  // Number of samples per channel in a frame.
-  const size_t in_size_samples_;
-
-  size_t payload_size_bytes_;
-  size_t max_payload_bytes_;
-
-  std::unique_ptr<InputAudioFile> in_file_;
-  std::unique_ptr<AudioSink> output_;
-  std::ofstream log_file_;
-
-  std::unique_ptr<RtpGenerator> rtp_generator_;
-  std::unique_ptr<NetEq> neteq_;
-  std::unique_ptr<LossModel> loss_model_;
-
-  std::unique_ptr<int16_t[]> in_data_;
-  rtc::Buffer payload_;
-  AudioFrame out_frame_;
-  RTPHeader rtp_header_;
-
-  size_t total_payload_size_bytes_;
-};
-
-}  // namespace test
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_CODING_NETEQ_TOOLS_NETEQ_QUALITY_TEST_H_
diff --git a/modules/audio_coding/neteq/tools/neteq_replacement_input.cc b/modules/audio_coding/neteq/tools/neteq_replacement_input.cc
deleted file mode 100644
index 553c71f..0000000
--- a/modules/audio_coding/neteq/tools/neteq_replacement_input.cc
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- *  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/neteq/tools/neteq_replacement_input.h"
-
-#include "webrtc/modules/audio_coding/neteq/tools/fake_decode_from_file.h"
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-namespace test {
-
-NetEqReplacementInput::NetEqReplacementInput(
-    std::unique_ptr<NetEqInput> source,
-    uint8_t replacement_payload_type,
-    const std::set<uint8_t>& comfort_noise_types,
-    const std::set<uint8_t>& forbidden_types)
-    : source_(std::move(source)),
-      replacement_payload_type_(replacement_payload_type),
-      comfort_noise_types_(comfort_noise_types),
-      forbidden_types_(forbidden_types) {
-  RTC_CHECK(source_);
-  packet_ = source_->PopPacket();
-  ReplacePacket();
-  RTC_CHECK(packet_);
-}
-
-rtc::Optional<int64_t> NetEqReplacementInput::NextPacketTime() const {
-  return packet_
-             ? rtc::Optional<int64_t>(static_cast<int64_t>(packet_->time_ms))
-             : rtc::Optional<int64_t>();
-}
-
-rtc::Optional<int64_t> NetEqReplacementInput::NextOutputEventTime() const {
-  return source_->NextOutputEventTime();
-}
-
-std::unique_ptr<NetEqInput::PacketData> NetEqReplacementInput::PopPacket() {
-  std::unique_ptr<PacketData> to_return = std::move(packet_);
-  packet_ = source_->PopPacket();
-  ReplacePacket();
-  return to_return;
-}
-
-void NetEqReplacementInput::AdvanceOutputEvent() {
-  source_->AdvanceOutputEvent();
-}
-
-bool NetEqReplacementInput::ended() const {
-  return source_->ended();
-}
-
-rtc::Optional<RTPHeader> NetEqReplacementInput::NextHeader() const {
-  return source_->NextHeader();
-}
-
-void NetEqReplacementInput::ReplacePacket() {
-  if (!source_->NextPacketTime()) {
-    // End of input. Cannot do proper replacement on the very last packet, so we
-    // delete it instead.
-    packet_.reset();
-    return;
-  }
-
-  RTC_DCHECK(packet_);
-
-  RTC_CHECK_EQ(forbidden_types_.count(packet_->header.payloadType), 0)
-      << "Payload type " << static_cast<int>(packet_->header.payloadType)
-      << " is forbidden.";
-
-  // Check if this packet is comfort noise.
-  if (comfort_noise_types_.count(packet_->header.payloadType) != 0) {
-    // If CNG, simply insert a zero-energy one-byte payload.
-    uint8_t cng_payload[1] = {127};  // Max attenuation of CNG.
-    packet_->payload.SetData(cng_payload);
-    return;
-  }
-
-  rtc::Optional<RTPHeader> next_hdr = source_->NextHeader();
-  RTC_DCHECK(next_hdr);
-  uint8_t payload[12];
-  RTC_DCHECK_LE(last_frame_size_timestamps_, 120 * 48);
-  uint32_t input_frame_size_timestamps = last_frame_size_timestamps_;
-  const uint32_t timestamp_diff =
-      next_hdr->timestamp - packet_->header.timestamp;
-  if (next_hdr->sequenceNumber == packet_->header.sequenceNumber + 1 &&
-      timestamp_diff <= 120 * 48) {
-    // Packets are in order and the timestamp diff is less than 5760 samples.
-    // Accept the timestamp diff as a valid frame size.
-    input_frame_size_timestamps = timestamp_diff;
-    last_frame_size_timestamps_ = input_frame_size_timestamps;
-  }
-  RTC_DCHECK_LE(input_frame_size_timestamps, 120 * 48);
-  FakeDecodeFromFile::PrepareEncoded(packet_->header.timestamp,
-                                     input_frame_size_timestamps,
-                                     packet_->payload.size(), payload);
-  packet_->payload.SetData(payload);
-  packet_->header.payloadType = replacement_payload_type_;
-  return;
-}
-
-}  // namespace test
-}  // namespace webrtc
diff --git a/modules/audio_coding/neteq/tools/neteq_replacement_input.h b/modules/audio_coding/neteq/tools/neteq_replacement_input.h
deleted file mode 100644
index ee1e4ae..0000000
--- a/modules/audio_coding/neteq/tools/neteq_replacement_input.h
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- *  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_NETEQ_TOOLS_NETEQ_REPLACEMENT_INPUT_H_
-#define WEBRTC_MODULES_AUDIO_CODING_NETEQ_TOOLS_NETEQ_REPLACEMENT_INPUT_H_
-
-#include <memory>
-#include <set>
-
-#include "webrtc/modules/audio_coding/neteq/tools/neteq_input.h"
-
-namespace webrtc {
-namespace test {
-
-// This class converts the packets from a NetEqInput to fake encodings to be
-// decoded by a FakeDecodeFromFile decoder.
-class NetEqReplacementInput : public NetEqInput {
- public:
-  NetEqReplacementInput(std::unique_ptr<NetEqInput> source,
-                        uint8_t replacement_payload_type,
-                        const std::set<uint8_t>& comfort_noise_types,
-                        const std::set<uint8_t>& forbidden_types);
-
-  rtc::Optional<int64_t> NextPacketTime() const override;
-  rtc::Optional<int64_t> NextOutputEventTime() const override;
-  std::unique_ptr<PacketData> PopPacket() override;
-  void AdvanceOutputEvent() override;
-  bool ended() const override;
-  rtc::Optional<RTPHeader> NextHeader() const override;
-
- private:
-  void ReplacePacket();
-
-  std::unique_ptr<NetEqInput> source_;
-  const uint8_t replacement_payload_type_;
-  const std::set<uint8_t> comfort_noise_types_;
-  const std::set<uint8_t> forbidden_types_;
-  std::unique_ptr<PacketData> packet_;  // The next packet to deliver.
-  uint32_t last_frame_size_timestamps_ = 960;  // Initial guess: 20 ms @ 48 kHz.
-};
-
-}  // namespace test
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_AUDIO_CODING_NETEQ_TOOLS_NETEQ_REPLACEMENT_INPUT_H_
diff --git a/modules/audio_coding/neteq/tools/neteq_rtpplay.cc b/modules/audio_coding/neteq/tools/neteq_rtpplay.cc
deleted file mode 100644
index d6647e4..0000000
--- a/modules/audio_coding/neteq/tools/neteq_rtpplay.cc
+++ /dev/null
@@ -1,668 +0,0 @@
-/*
- *  Copyright (c) 2013 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 <errno.h>
-#include <inttypes.h>
-#include <limits.h>  // For ULONG_MAX returned by strtoul.
-#include <stdio.h>
-#include <stdlib.h>  // For strtoul.
-#include <string.h>
-
-#include <algorithm>
-#include <ios>
-#include <iostream>
-#include <memory>
-#include <numeric>
-#include <string>
-
-#include "webrtc/modules/audio_coding/neteq/include/neteq.h"
-#include "webrtc/modules/audio_coding/neteq/tools/fake_decode_from_file.h"
-#include "webrtc/modules/audio_coding/neteq/tools/input_audio_file.h"
-#include "webrtc/modules/audio_coding/neteq/tools/neteq_delay_analyzer.h"
-#include "webrtc/modules/audio_coding/neteq/tools/neteq_packet_source_input.h"
-#include "webrtc/modules/audio_coding/neteq/tools/neteq_replacement_input.h"
-#include "webrtc/modules/audio_coding/neteq/tools/neteq_test.h"
-#include "webrtc/modules/audio_coding/neteq/tools/output_audio_file.h"
-#include "webrtc/modules/audio_coding/neteq/tools/output_wav_file.h"
-#include "webrtc/modules/audio_coding/neteq/tools/rtp_file_source.h"
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/flags.h"
-#include "webrtc/test/testsupport/fileutils.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-namespace test {
-namespace {
-
-// Parses the input string for a valid SSRC (at the start of the string). If a
-// valid SSRC is found, it is written to the output variable |ssrc|, and true is
-// returned. Otherwise, false is returned.
-bool ParseSsrc(const std::string& str, uint32_t* ssrc) {
-  if (str.empty())
-    return true;
-  int base = 10;
-  // Look for "0x" or "0X" at the start and change base to 16 if found.
-  if ((str.compare(0, 2, "0x") == 0) || (str.compare(0, 2, "0X") == 0))
-    base = 16;
-  errno = 0;
-  char* end_ptr;
-  unsigned long value = strtoul(str.c_str(), &end_ptr, base);
-  if (value == ULONG_MAX && errno == ERANGE)
-    return false;  // Value out of range for unsigned long.
-  if (sizeof(unsigned long) > sizeof(uint32_t) && value > 0xFFFFFFFF)
-    return false;  // Value out of range for uint32_t.
-  if (end_ptr - str.c_str() < static_cast<ptrdiff_t>(str.length()))
-    return false;  // Part of the string was not parsed.
-  *ssrc = static_cast<uint32_t>(value);
-  return true;
-}
-
-// Flag validators.
-bool ValidatePayloadType(int value) {
-  if (value >= 0 && value <= 127)  // Value is ok.
-    return true;
-  printf("Payload type must be between 0 and 127, not %d\n",
-         static_cast<int>(value));
-  return false;
-}
-
-bool ValidateSsrcValue(const std::string& str) {
-  uint32_t dummy_ssrc;
-  if (ParseSsrc(str, &dummy_ssrc)) // Value is ok.
-    return true;
-  printf("Invalid SSRC: %s\n", str.c_str());
-  return false;
-}
-
-static bool ValidateExtensionId(int value) {
-  if (value > 0 && value <= 255)  // Value is ok.
-    return true;
-  printf("Extension ID must be between 1 and 255, not %d\n",
-         static_cast<int>(value));
-  return false;
-}
-
-// Define command line flags.
-DEFINE_int(pcmu, 0, "RTP payload type for PCM-u");
-DEFINE_int(pcma, 8, "RTP payload type for PCM-a");
-DEFINE_int(ilbc, 102, "RTP payload type for iLBC");
-DEFINE_int(isac, 103, "RTP payload type for iSAC");
-DEFINE_int(isac_swb, 104, "RTP payload type for iSAC-swb (32 kHz)");
-DEFINE_int(opus, 111, "RTP payload type for Opus");
-DEFINE_int(pcm16b, 93, "RTP payload type for PCM16b-nb (8 kHz)");
-DEFINE_int(pcm16b_wb, 94, "RTP payload type for PCM16b-wb (16 kHz)");
-DEFINE_int(pcm16b_swb32, 95, "RTP payload type for PCM16b-swb32 (32 kHz)");
-DEFINE_int(pcm16b_swb48, 96, "RTP payload type for PCM16b-swb48 (48 kHz)");
-DEFINE_int(g722, 9, "RTP payload type for G.722");
-DEFINE_int(avt, 106, "RTP payload type for AVT/DTMF (8 kHz)");
-DEFINE_int(avt_16, 114, "RTP payload type for AVT/DTMF (16 kHz)");
-DEFINE_int(avt_32, 115, "RTP payload type for AVT/DTMF (32 kHz)");
-DEFINE_int(avt_48, 116, "RTP payload type for AVT/DTMF (48 kHz)");
-DEFINE_int(red, 117, "RTP payload type for redundant audio (RED)");
-DEFINE_int(cn_nb, 13, "RTP payload type for comfort noise (8 kHz)");
-DEFINE_int(cn_wb, 98, "RTP payload type for comfort noise (16 kHz)");
-DEFINE_int(cn_swb32, 99, "RTP payload type for comfort noise (32 kHz)");
-DEFINE_int(cn_swb48, 100, "RTP payload type for comfort noise (48 kHz)");
-DEFINE_bool(codec_map, false, "Prints the mapping between RTP payload type and "
-    "codec");
-DEFINE_string(replacement_audio_file, "",
-              "A PCM file that will be used to populate ""dummy"" RTP packets");
-DEFINE_string(ssrc,
-              "",
-              "Only use packets with this SSRC (decimal or hex, the latter "
-              "starting with 0x)");
-DEFINE_int(audio_level, 1, "Extension ID for audio level (RFC 6464)");
-DEFINE_int(abs_send_time, 3, "Extension ID for absolute sender time");
-DEFINE_int(transport_seq_no, 5, "Extension ID for transport sequence number");
-DEFINE_bool(matlabplot,
-            false,
-            "Generates a matlab script for plotting the delay profile");
-DEFINE_bool(help, false, "Prints this message");
-
-// Maps a codec type to a printable name string.
-std::string CodecName(NetEqDecoder codec) {
-  switch (codec) {
-    case NetEqDecoder::kDecoderPCMu:
-      return "PCM-u";
-    case NetEqDecoder::kDecoderPCMa:
-      return "PCM-a";
-    case NetEqDecoder::kDecoderILBC:
-      return "iLBC";
-    case NetEqDecoder::kDecoderISAC:
-      return "iSAC";
-    case NetEqDecoder::kDecoderISACswb:
-      return "iSAC-swb (32 kHz)";
-    case NetEqDecoder::kDecoderOpus:
-      return "Opus";
-    case NetEqDecoder::kDecoderPCM16B:
-      return "PCM16b-nb (8 kHz)";
-    case NetEqDecoder::kDecoderPCM16Bwb:
-      return "PCM16b-wb (16 kHz)";
-    case NetEqDecoder::kDecoderPCM16Bswb32kHz:
-      return "PCM16b-swb32 (32 kHz)";
-    case NetEqDecoder::kDecoderPCM16Bswb48kHz:
-      return "PCM16b-swb48 (48 kHz)";
-    case NetEqDecoder::kDecoderG722:
-      return "G.722";
-    case NetEqDecoder::kDecoderRED:
-      return "redundant audio (RED)";
-    case NetEqDecoder::kDecoderAVT:
-      return "AVT/DTMF (8 kHz)";
-    case NetEqDecoder::kDecoderAVT16kHz:
-      return "AVT/DTMF (16 kHz)";
-    case NetEqDecoder::kDecoderAVT32kHz:
-      return "AVT/DTMF (32 kHz)";
-    case NetEqDecoder::kDecoderAVT48kHz:
-      return "AVT/DTMF (48 kHz)";
-    case NetEqDecoder::kDecoderCNGnb:
-      return "comfort noise (8 kHz)";
-    case NetEqDecoder::kDecoderCNGwb:
-      return "comfort noise (16 kHz)";
-    case NetEqDecoder::kDecoderCNGswb32kHz:
-      return "comfort noise (32 kHz)";
-    case NetEqDecoder::kDecoderCNGswb48kHz:
-      return "comfort noise (48 kHz)";
-    default:
-      FATAL();
-      return "undefined";
-  }
-}
-
-void PrintCodecMappingEntry(NetEqDecoder codec, int flag) {
-  std::cout << CodecName(codec) << ": " << flag << std::endl;
-}
-
-void PrintCodecMapping() {
-  PrintCodecMappingEntry(NetEqDecoder::kDecoderPCMu, FLAG_pcmu);
-  PrintCodecMappingEntry(NetEqDecoder::kDecoderPCMa, FLAG_pcma);
-  PrintCodecMappingEntry(NetEqDecoder::kDecoderILBC, FLAG_ilbc);
-  PrintCodecMappingEntry(NetEqDecoder::kDecoderISAC, FLAG_isac);
-  PrintCodecMappingEntry(NetEqDecoder::kDecoderISACswb, FLAG_isac_swb);
-  PrintCodecMappingEntry(NetEqDecoder::kDecoderOpus, FLAG_opus);
-  PrintCodecMappingEntry(NetEqDecoder::kDecoderPCM16B, FLAG_pcm16b);
-  PrintCodecMappingEntry(NetEqDecoder::kDecoderPCM16Bwb, FLAG_pcm16b_wb);
-  PrintCodecMappingEntry(NetEqDecoder::kDecoderPCM16Bswb32kHz,
-                         FLAG_pcm16b_swb32);
-  PrintCodecMappingEntry(NetEqDecoder::kDecoderPCM16Bswb48kHz,
-                         FLAG_pcm16b_swb48);
-  PrintCodecMappingEntry(NetEqDecoder::kDecoderG722, FLAG_g722);
-  PrintCodecMappingEntry(NetEqDecoder::kDecoderAVT, FLAG_avt);
-  PrintCodecMappingEntry(NetEqDecoder::kDecoderAVT16kHz, FLAG_avt_16);
-  PrintCodecMappingEntry(NetEqDecoder::kDecoderAVT32kHz, FLAG_avt_32);
-  PrintCodecMappingEntry(NetEqDecoder::kDecoderAVT48kHz, FLAG_avt_48);
-  PrintCodecMappingEntry(NetEqDecoder::kDecoderRED, FLAG_red);
-  PrintCodecMappingEntry(NetEqDecoder::kDecoderCNGnb, FLAG_cn_nb);
-  PrintCodecMappingEntry(NetEqDecoder::kDecoderCNGwb, FLAG_cn_wb);
-  PrintCodecMappingEntry(NetEqDecoder::kDecoderCNGswb32kHz, FLAG_cn_swb32);
-  PrintCodecMappingEntry(NetEqDecoder::kDecoderCNGswb48kHz, FLAG_cn_swb48);
-}
-
-rtc::Optional<int> CodecSampleRate(uint8_t payload_type) {
-  if (payload_type == FLAG_pcmu || payload_type == FLAG_pcma ||
-      payload_type == FLAG_ilbc || payload_type == FLAG_pcm16b ||
-      payload_type == FLAG_cn_nb || payload_type == FLAG_avt)
-    return rtc::Optional<int>(8000);
-  if (payload_type == FLAG_isac || payload_type == FLAG_pcm16b_wb ||
-      payload_type == FLAG_g722 || payload_type == FLAG_cn_wb ||
-      payload_type == FLAG_avt_16)
-    return rtc::Optional<int>(16000);
-  if (payload_type == FLAG_isac_swb || payload_type == FLAG_pcm16b_swb32 ||
-      payload_type == FLAG_cn_swb32 || payload_type == FLAG_avt_32)
-    return rtc::Optional<int>(32000);
-  if (payload_type == FLAG_opus || payload_type == FLAG_pcm16b_swb48 ||
-      payload_type == FLAG_cn_swb48 || payload_type == FLAG_avt_48)
-    return rtc::Optional<int>(48000);
-  if (payload_type == FLAG_red)
-    return rtc::Optional<int>(0);
-  return rtc::Optional<int>();
-}
-
-// Class to let through only the packets with a given SSRC. Should be used as an
-// outer layer on another NetEqInput object.
-class FilterSsrcInput : public NetEqInput {
- public:
-  FilterSsrcInput(std::unique_ptr<NetEqInput> source, uint32_t ssrc)
-      : source_(std::move(source)), ssrc_(ssrc) {
-    FindNextWithCorrectSsrc();
-    RTC_CHECK(source_->NextHeader()) << "Found no packet with SSRC = 0x"
-                                     << std::hex << ssrc_;
-  }
-
-  // All methods but PopPacket() simply relay to the |source_| object.
-  rtc::Optional<int64_t> NextPacketTime() const override {
-    return source_->NextPacketTime();
-  }
-  rtc::Optional<int64_t> NextOutputEventTime() const override {
-    return source_->NextOutputEventTime();
-  }
-
-  // Returns the next packet, and throws away upcoming packets that do not match
-  // the desired SSRC.
-  std::unique_ptr<PacketData> PopPacket() override {
-    std::unique_ptr<PacketData> packet_to_return = source_->PopPacket();
-    RTC_DCHECK(!packet_to_return || packet_to_return->header.ssrc == ssrc_);
-    // Pre-fetch the next packet with correct SSRC. Hence, |source_| will always
-    // be have a valid packet (or empty if no more packets are available) when
-    // this method returns.
-    FindNextWithCorrectSsrc();
-    return packet_to_return;
-  }
-
-  void AdvanceOutputEvent() override { source_->AdvanceOutputEvent(); }
-
-  bool ended() const override { return source_->ended(); }
-
-  rtc::Optional<RTPHeader> NextHeader() const override {
-    return source_->NextHeader();
-  }
-
- private:
-  void FindNextWithCorrectSsrc() {
-    while (source_->NextHeader() && source_->NextHeader()->ssrc != ssrc_) {
-      source_->PopPacket();
-    }
-  }
-
-  std::unique_ptr<NetEqInput> source_;
-  uint32_t ssrc_;
-};
-
-// A callback class which prints whenver the inserted packet stream changes
-// the SSRC.
-class SsrcSwitchDetector : public NetEqPostInsertPacket {
- public:
-  // Takes a pointer to another callback object, which will be invoked after
-  // this object finishes. This does not transfer ownership, and null is a
-  // valid value.
-  explicit SsrcSwitchDetector(NetEqPostInsertPacket* other_callback)
-      : other_callback_(other_callback) {}
-
-  void AfterInsertPacket(const NetEqInput::PacketData& packet,
-                         NetEq* neteq) override {
-    if (last_ssrc_ && packet.header.ssrc != *last_ssrc_) {
-      std::cout << "Changing streams from 0x" << std::hex << *last_ssrc_
-                << " to 0x" << std::hex << packet.header.ssrc
-                << std::dec << " (payload type "
-                << static_cast<int>(packet.header.payloadType) << ")"
-                << std::endl;
-    }
-    last_ssrc_ = rtc::Optional<uint32_t>(packet.header.ssrc);
-    if (other_callback_) {
-      other_callback_->AfterInsertPacket(packet, neteq);
-    }
-  }
-
- private:
-  NetEqPostInsertPacket* other_callback_;
-  rtc::Optional<uint32_t> last_ssrc_;
-};
-
-class StatsGetter : public NetEqGetAudioCallback {
- public:
-  // This struct is a replica of webrtc::NetEqNetworkStatistics, but with all
-  // values stored in double precision.
-  struct Stats {
-    double current_buffer_size_ms = 0.0;
-    double preferred_buffer_size_ms = 0.0;
-    double jitter_peaks_found = 0.0;
-    double packet_loss_rate = 0.0;
-    double expand_rate = 0.0;
-    double speech_expand_rate = 0.0;
-    double preemptive_rate = 0.0;
-    double accelerate_rate = 0.0;
-    double secondary_decoded_rate = 0.0;
-    double secondary_discarded_rate = 0.0;
-    double clockdrift_ppm = 0.0;
-    double added_zero_samples = 0.0;
-    double mean_waiting_time_ms = 0.0;
-    double median_waiting_time_ms = 0.0;
-    double min_waiting_time_ms = 0.0;
-    double max_waiting_time_ms = 0.0;
-  };
-
-  // Takes a pointer to another callback object, which will be invoked after
-  // this object finishes. This does not transfer ownership, and null is a
-  // valid value.
-  explicit StatsGetter(NetEqGetAudioCallback* other_callback)
-      : other_callback_(other_callback) {}
-
-  void BeforeGetAudio(NetEq* neteq) override {
-    if (other_callback_) {
-      other_callback_->BeforeGetAudio(neteq);
-    }
-  }
-
-  void AfterGetAudio(int64_t time_now_ms,
-                     const AudioFrame& audio_frame,
-                     bool muted,
-                     NetEq* neteq) override {
-    if (++counter_ >= 100) {
-      counter_ = 0;
-      NetEqNetworkStatistics stats;
-      RTC_CHECK_EQ(neteq->NetworkStatistics(&stats), 0);
-      stats_.push_back(stats);
-    }
-    if (other_callback_) {
-      other_callback_->AfterGetAudio(time_now_ms, audio_frame, muted, neteq);
-    }
-  }
-
-  double AverageSpeechExpandRate() const {
-    double sum_speech_expand =
-        std::accumulate(stats_.begin(), stats_.end(), double{0.0},
-                        [](double a, NetEqNetworkStatistics b) {
-                          return a + static_cast<double>(b.speech_expand_rate);
-                        });
-    return sum_speech_expand / 16384.0 / stats_.size();
-  }
-
-  Stats AverageStats() const {
-    Stats sum_stats = std::accumulate(
-        stats_.begin(), stats_.end(), Stats(),
-        [](Stats a, NetEqNetworkStatistics b) {
-          a.current_buffer_size_ms += b.current_buffer_size_ms;
-          a.preferred_buffer_size_ms += b.preferred_buffer_size_ms;
-          a.jitter_peaks_found += b.jitter_peaks_found;
-          a.packet_loss_rate += b.packet_loss_rate / 16384.0;
-          a.expand_rate += b.expand_rate / 16384.0;
-          a.speech_expand_rate += b.speech_expand_rate / 16384.0;
-          a.preemptive_rate += b.preemptive_rate / 16384.0;
-          a.accelerate_rate += b.accelerate_rate / 16384.0;
-          a.secondary_decoded_rate += b.secondary_decoded_rate / 16384.0;
-          a.secondary_discarded_rate += b.secondary_discarded_rate / 16384.0;
-          a.clockdrift_ppm += b.clockdrift_ppm;
-          a.added_zero_samples += b.added_zero_samples;
-          a.mean_waiting_time_ms += b.mean_waiting_time_ms;
-          a.median_waiting_time_ms += b.median_waiting_time_ms;
-          a.min_waiting_time_ms =
-              std::min(a.min_waiting_time_ms,
-                       static_cast<double>(b.min_waiting_time_ms));
-          a.max_waiting_time_ms =
-              std::max(a.max_waiting_time_ms,
-                       static_cast<double>(b.max_waiting_time_ms));
-          return a;
-        });
-
-    sum_stats.current_buffer_size_ms /= stats_.size();
-    sum_stats.preferred_buffer_size_ms /= stats_.size();
-    sum_stats.jitter_peaks_found /= stats_.size();
-    sum_stats.packet_loss_rate /= stats_.size();
-    sum_stats.expand_rate /= stats_.size();
-    sum_stats.speech_expand_rate /= stats_.size();
-    sum_stats.preemptive_rate /= stats_.size();
-    sum_stats.accelerate_rate /= stats_.size();
-    sum_stats.secondary_decoded_rate /= stats_.size();
-    sum_stats.secondary_discarded_rate /= stats_.size();
-    sum_stats.clockdrift_ppm /= stats_.size();
-    sum_stats.added_zero_samples /= stats_.size();
-    sum_stats.mean_waiting_time_ms /= stats_.size();
-    sum_stats.median_waiting_time_ms /= stats_.size();
-
-    return sum_stats;
-  }
-
- private:
-  NetEqGetAudioCallback* other_callback_;
-  size_t counter_ = 0;
-  std::vector<NetEqNetworkStatistics> stats_;
-};
-
-int RunTest(int argc, char* argv[]) {
-  std::string program_name = argv[0];
-  std::string usage = "Tool for decoding an RTP dump file using NetEq.\n"
-      "Run " + program_name + " --help for usage.\n"
-      "Example usage:\n" + program_name +
-      " input.rtp output.{pcm, wav}\n";
-  if (rtc::FlagList::SetFlagsFromCommandLine(&argc, argv, true)) {
-    return 1;
-  }
-  if (FLAG_help) {
-    std::cout << usage;
-    rtc::FlagList::Print(nullptr, false);
-    return 0;
-  }
-
-  if (FLAG_codec_map) {
-    PrintCodecMapping();
-  }
-
-  if (argc != 3) {
-    if (FLAG_codec_map) {
-      // We have already printed the codec map. Just end the program.
-      return 0;
-    }
-    // Print usage information.
-    std::cout << usage;
-    return 0;
-  }
-  RTC_CHECK(ValidatePayloadType(FLAG_pcmu));
-  RTC_CHECK(ValidatePayloadType(FLAG_pcma));
-  RTC_CHECK(ValidatePayloadType(FLAG_ilbc));
-  RTC_CHECK(ValidatePayloadType(FLAG_isac));
-  RTC_CHECK(ValidatePayloadType(FLAG_isac_swb));
-  RTC_CHECK(ValidatePayloadType(FLAG_opus));
-  RTC_CHECK(ValidatePayloadType(FLAG_pcm16b));
-  RTC_CHECK(ValidatePayloadType(FLAG_pcm16b_wb));
-  RTC_CHECK(ValidatePayloadType(FLAG_pcm16b_swb32));
-  RTC_CHECK(ValidatePayloadType(FLAG_pcm16b_swb48));
-  RTC_CHECK(ValidatePayloadType(FLAG_g722));
-  RTC_CHECK(ValidatePayloadType(FLAG_avt));
-  RTC_CHECK(ValidatePayloadType(FLAG_avt_16));
-  RTC_CHECK(ValidatePayloadType(FLAG_avt_32));
-  RTC_CHECK(ValidatePayloadType(FLAG_avt_48));
-  RTC_CHECK(ValidatePayloadType(FLAG_red));
-  RTC_CHECK(ValidatePayloadType(FLAG_cn_nb));
-  RTC_CHECK(ValidatePayloadType(FLAG_cn_wb));
-  RTC_CHECK(ValidatePayloadType(FLAG_cn_swb32));
-  RTC_CHECK(ValidatePayloadType(FLAG_cn_swb48));
-  RTC_CHECK(ValidateSsrcValue(FLAG_ssrc));
-  RTC_CHECK(ValidateExtensionId(FLAG_audio_level));
-  RTC_CHECK(ValidateExtensionId(FLAG_abs_send_time));
-  RTC_CHECK(ValidateExtensionId(FLAG_transport_seq_no));
-
-  // Gather RTP header extensions in a map.
-  NetEqPacketSourceInput::RtpHeaderExtensionMap rtp_ext_map = {
-      {FLAG_audio_level, kRtpExtensionAudioLevel},
-      {FLAG_abs_send_time, kRtpExtensionAbsoluteSendTime},
-      {FLAG_transport_seq_no, kRtpExtensionTransportSequenceNumber}};
-
-  const std::string input_file_name = argv[1];
-  std::unique_ptr<NetEqInput> input;
-  if (RtpFileSource::ValidRtpDump(input_file_name) ||
-      RtpFileSource::ValidPcap(input_file_name)) {
-    input.reset(new NetEqRtpDumpInput(input_file_name, rtp_ext_map));
-  } else {
-    input.reset(new NetEqEventLogInput(input_file_name, rtp_ext_map));
-  }
-
-  std::cout << "Input file: " << input_file_name << std::endl;
-  RTC_CHECK(input) << "Cannot open input file";
-  RTC_CHECK(!input->ended()) << "Input file is empty";
-
-  // Check if an SSRC value was provided.
-  if (strlen(FLAG_ssrc) > 0) {
-    uint32_t ssrc;
-    RTC_CHECK(ParseSsrc(FLAG_ssrc, &ssrc)) << "Flag verification has failed.";
-    input.reset(new FilterSsrcInput(std::move(input), ssrc));
-  }
-
-  // Check the sample rate.
-  rtc::Optional<int> sample_rate_hz;
-  std::set<std::pair<int, uint32_t>> discarded_pt_and_ssrc;
-  while (input->NextHeader()) {
-    rtc::Optional<RTPHeader> first_rtp_header = input->NextHeader();
-    RTC_DCHECK(first_rtp_header);
-    sample_rate_hz = CodecSampleRate(first_rtp_header->payloadType);
-    if (sample_rate_hz) {
-      std::cout << "Found valid packet with payload type "
-                << static_cast<int>(first_rtp_header->payloadType)
-                << " and SSRC 0x" << std::hex << first_rtp_header->ssrc
-                << std::dec << std::endl;
-      break;
-    }
-    // Discard this packet and move to the next. Keep track of discarded payload
-    // types and SSRCs.
-    discarded_pt_and_ssrc.emplace(first_rtp_header->payloadType,
-                                  first_rtp_header->ssrc);
-    input->PopPacket();
-  }
-  if (!discarded_pt_and_ssrc.empty()) {
-    std::cout << "Discarded initial packets with the following payload types "
-                 "and SSRCs:"
-              << std::endl;
-    for (const auto& d : discarded_pt_and_ssrc) {
-      std::cout << "PT " << d.first << "; SSRC 0x" << std::hex
-                << static_cast<int>(d.second) << std::dec << std::endl;
-    }
-  }
-  if (!sample_rate_hz) {
-    std::cout << "Cannot find any packets with known payload types"
-              << std::endl;
-    RTC_NOTREACHED();
-  }
-
-  // Open the output file now that we know the sample rate. (Rate is only needed
-  // for wav files.)
-  const std::string output_file_name = argv[2];
-  std::unique_ptr<AudioSink> output;
-  if (output_file_name.size() >= 4 &&
-      output_file_name.substr(output_file_name.size() - 4) == ".wav") {
-    // Open a wav file.
-    output.reset(new OutputWavFile(output_file_name, *sample_rate_hz));
-  } else {
-    // Open a pcm file.
-    output.reset(new OutputAudioFile(output_file_name));
-  }
-
-  std::cout << "Output file: " << output_file_name << std::endl;
-
-  NetEqTest::DecoderMap codecs = {
-      {FLAG_pcmu, std::make_pair(NetEqDecoder::kDecoderPCMu, "pcmu")},
-      {FLAG_pcma, std::make_pair(NetEqDecoder::kDecoderPCMa, "pcma")},
-      {FLAG_ilbc, std::make_pair(NetEqDecoder::kDecoderILBC, "ilbc")},
-      {FLAG_isac, std::make_pair(NetEqDecoder::kDecoderISAC, "isac")},
-      {FLAG_isac_swb,
-       std::make_pair(NetEqDecoder::kDecoderISACswb, "isac-swb")},
-      {FLAG_opus, std::make_pair(NetEqDecoder::kDecoderOpus, "opus")},
-      {FLAG_pcm16b, std::make_pair(NetEqDecoder::kDecoderPCM16B, "pcm16-nb")},
-      {FLAG_pcm16b_wb,
-       std::make_pair(NetEqDecoder::kDecoderPCM16Bwb, "pcm16-wb")},
-      {FLAG_pcm16b_swb32,
-       std::make_pair(NetEqDecoder::kDecoderPCM16Bswb32kHz, "pcm16-swb32")},
-      {FLAG_pcm16b_swb48,
-       std::make_pair(NetEqDecoder::kDecoderPCM16Bswb48kHz, "pcm16-swb48")},
-      {FLAG_g722, std::make_pair(NetEqDecoder::kDecoderG722, "g722")},
-      {FLAG_avt, std::make_pair(NetEqDecoder::kDecoderAVT, "avt")},
-      {FLAG_avt_16, std::make_pair(NetEqDecoder::kDecoderAVT16kHz, "avt-16")},
-      {FLAG_avt_32,
-       std::make_pair(NetEqDecoder::kDecoderAVT32kHz, "avt-32")},
-      {FLAG_avt_48,
-       std::make_pair(NetEqDecoder::kDecoderAVT48kHz, "avt-48")},
-      {FLAG_red, std::make_pair(NetEqDecoder::kDecoderRED, "red")},
-      {FLAG_cn_nb, std::make_pair(NetEqDecoder::kDecoderCNGnb, "cng-nb")},
-      {FLAG_cn_wb, std::make_pair(NetEqDecoder::kDecoderCNGwb, "cng-wb")},
-      {FLAG_cn_swb32,
-       std::make_pair(NetEqDecoder::kDecoderCNGswb32kHz, "cng-swb32")},
-      {FLAG_cn_swb48,
-       std::make_pair(NetEqDecoder::kDecoderCNGswb48kHz, "cng-swb48")}};
-
-  // Check if a replacement audio file was provided.
-  std::unique_ptr<AudioDecoder> replacement_decoder;
-  NetEqTest::ExtDecoderMap ext_codecs;
-  if (strlen(FLAG_replacement_audio_file) > 0) {
-    // Find largest unused payload type.
-    int replacement_pt = 127;
-    while (!(codecs.find(replacement_pt) == codecs.end() &&
-             ext_codecs.find(replacement_pt) == ext_codecs.end())) {
-      --replacement_pt;
-      RTC_CHECK_GE(replacement_pt, 0);
-    }
-
-    auto std_set_int32_to_uint8 = [](const std::set<int32_t>& a) {
-      std::set<uint8_t> b;
-      for (auto& x : a) {
-        b.insert(static_cast<uint8_t>(x));
-      }
-      return b;
-    };
-
-    std::set<uint8_t> cn_types = std_set_int32_to_uint8(
-        {FLAG_cn_nb, FLAG_cn_wb, FLAG_cn_swb32, FLAG_cn_swb48});
-    std::set<uint8_t> forbidden_types =
-        std_set_int32_to_uint8({FLAG_g722, FLAG_red, FLAG_avt,
-                                FLAG_avt_16, FLAG_avt_32, FLAG_avt_48});
-    input.reset(new NetEqReplacementInput(std::move(input), replacement_pt,
-                                          cn_types, forbidden_types));
-
-    replacement_decoder.reset(new FakeDecodeFromFile(
-        std::unique_ptr<InputAudioFile>(
-            new InputAudioFile(FLAG_replacement_audio_file)),
-        48000, false));
-    NetEqTest::ExternalDecoderInfo ext_dec_info = {
-        replacement_decoder.get(), NetEqDecoder::kDecoderArbitrary,
-        "replacement codec"};
-    ext_codecs[replacement_pt] = ext_dec_info;
-  }
-
-  NetEqTest::Callbacks callbacks;
-  std::unique_ptr<NetEqDelayAnalyzer> delay_analyzer;
-  if (FLAG_matlabplot) {
-    delay_analyzer.reset(new NetEqDelayAnalyzer);
-  }
-
-  SsrcSwitchDetector ssrc_switch_detector(delay_analyzer.get());
-  callbacks.post_insert_packet = &ssrc_switch_detector;
-  StatsGetter stats_getter(delay_analyzer.get());
-  callbacks.get_audio_callback = &stats_getter;
-  NetEq::Config config;
-  config.sample_rate_hz = *sample_rate_hz;
-  NetEqTest test(config, codecs, ext_codecs, std::move(input),
-                 std::move(output), callbacks);
-
-  int64_t test_duration_ms = test.Run();
-
-  if (FLAG_matlabplot) {
-    auto matlab_script_name = output_file_name;
-    std::replace(matlab_script_name.begin(), matlab_script_name.end(), '.',
-                 '_');
-    std::cout << "Creating Matlab plot script " << matlab_script_name + ".m"
-              << std::endl;
-    delay_analyzer->CreateMatlabScript(matlab_script_name + ".m");
-  }
-
-  printf("Simulation statistics:\n");
-  printf("  output duration: %" PRId64 " ms\n", test_duration_ms);
-  auto stats = stats_getter.AverageStats();
-  printf("  packet_loss_rate: %f %%\n", 100.0 * stats.packet_loss_rate);
-  printf("  expand_rate: %f %%\n", 100.0 * stats.expand_rate);
-  printf("  speech_expand_rate: %f %%\n", 100.0 * stats.speech_expand_rate);
-  printf("  preemptive_rate: %f %%\n", 100.0 * stats.preemptive_rate);
-  printf("  accelerate_rate: %f %%\n", 100.0 * stats.accelerate_rate);
-  printf("  secondary_decoded_rate: %f %%\n",
-         100.0 * stats.secondary_decoded_rate);
-  printf("  secondary_discarded_rate: %f %%\n",
-         100.0 * stats.secondary_discarded_rate);
-  printf("  clockdrift_ppm: %f ppm\n", stats.clockdrift_ppm);
-  printf("  mean_waiting_time_ms: %f ms\n", stats.mean_waiting_time_ms);
-  printf("  median_waiting_time_ms: %f ms\n", stats.median_waiting_time_ms);
-  printf("  min_waiting_time_ms: %f ms\n", stats.min_waiting_time_ms);
-  printf("  max_waiting_time_ms: %f ms\n", stats.max_waiting_time_ms);
-
-  return 0;
-}
-
-}  // namespace
-}  // namespace test
-}  // namespace webrtc
-
-int main(int argc, char* argv[]) {
-  webrtc::test::RunTest(argc, argv);
-}
diff --git a/modules/audio_coding/neteq/tools/neteq_test.cc b/modules/audio_coding/neteq/tools/neteq_test.cc
deleted file mode 100644
index 598ffd7..0000000
--- a/modules/audio_coding/neteq/tools/neteq_test.cc
+++ /dev/null
@@ -1,136 +0,0 @@
-/*
- *  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/neteq/tools/neteq_test.h"
-
-#include <iostream>
-
-#include "webrtc/api/audio_codecs/builtin_audio_decoder_factory.h"
-
-namespace webrtc {
-namespace test {
-
-void DefaultNetEqTestErrorCallback::OnInsertPacketError(
-    const NetEqInput::PacketData& packet) {
-  std::cerr << "InsertPacket returned an error." << std::endl;
-  std::cerr << "Packet data: " << packet.ToString() << std::endl;
-  FATAL();
-}
-
-void DefaultNetEqTestErrorCallback::OnGetAudioError() {
-  std::cerr << "GetAudio returned an error." << std::endl;
-  FATAL();
-}
-
-NetEqTest::NetEqTest(const NetEq::Config& config,
-                     const DecoderMap& codecs,
-                     const ExtDecoderMap& ext_codecs,
-                     std::unique_ptr<NetEqInput> input,
-                     std::unique_ptr<AudioSink> output,
-                     Callbacks callbacks)
-    : neteq_(NetEq::Create(config, CreateBuiltinAudioDecoderFactory())),
-      input_(std::move(input)),
-      output_(std::move(output)),
-      callbacks_(callbacks),
-      sample_rate_hz_(config.sample_rate_hz) {
-  RTC_CHECK(!config.enable_muted_state)
-      << "The code does not handle enable_muted_state";
-  RegisterDecoders(codecs);
-  RegisterExternalDecoders(ext_codecs);
-}
-
-int64_t NetEqTest::Run() {
-  const int64_t start_time_ms = *input_->NextEventTime();
-  int64_t time_now_ms = start_time_ms;
-
-  while (!input_->ended()) {
-    // Advance time to next event.
-    RTC_DCHECK(input_->NextEventTime());
-    time_now_ms = *input_->NextEventTime();
-    // Check if it is time to insert packet.
-    if (input_->NextPacketTime() && time_now_ms >= *input_->NextPacketTime()) {
-      std::unique_ptr<NetEqInput::PacketData> packet_data = input_->PopPacket();
-      RTC_CHECK(packet_data);
-      int error = neteq_->InsertPacket(
-          packet_data->header,
-          rtc::ArrayView<const uint8_t>(packet_data->payload),
-          static_cast<uint32_t>(packet_data->time_ms * sample_rate_hz_ / 1000));
-      if (error != NetEq::kOK && callbacks_.error_callback) {
-        callbacks_.error_callback->OnInsertPacketError(*packet_data);
-      }
-      if (callbacks_.post_insert_packet) {
-        callbacks_.post_insert_packet->AfterInsertPacket(*packet_data,
-                                                         neteq_.get());
-      }
-    }
-
-    // Check if it is time to get output audio.
-    if (input_->NextOutputEventTime() &&
-        time_now_ms >= *input_->NextOutputEventTime()) {
-      if (callbacks_.get_audio_callback) {
-        callbacks_.get_audio_callback->BeforeGetAudio(neteq_.get());
-      }
-      AudioFrame out_frame;
-      bool muted;
-      int error = neteq_->GetAudio(&out_frame, &muted);
-      RTC_CHECK(!muted) << "The code does not handle enable_muted_state";
-      if (error != NetEq::kOK) {
-        if (callbacks_.error_callback) {
-          callbacks_.error_callback->OnGetAudioError();
-        }
-      } else {
-        sample_rate_hz_ = out_frame.sample_rate_hz_;
-      }
-      if (callbacks_.get_audio_callback) {
-        callbacks_.get_audio_callback->AfterGetAudio(time_now_ms, out_frame,
-                                                     muted, neteq_.get());
-      }
-
-      if (output_) {
-        RTC_CHECK(output_->WriteArray(
-            out_frame.data(),
-            out_frame.samples_per_channel_ * out_frame.num_channels_));
-      }
-
-      input_->AdvanceOutputEvent();
-    }
-  }
-  return time_now_ms - start_time_ms;
-}
-
-NetEqNetworkStatistics NetEqTest::SimulationStats() {
-  NetEqNetworkStatistics stats;
-  RTC_CHECK_EQ(neteq_->NetworkStatistics(&stats), 0);
-  return stats;
-}
-
-void NetEqTest::RegisterDecoders(const DecoderMap& codecs) {
-  for (const auto& c : codecs) {
-    RTC_CHECK_EQ(
-        neteq_->RegisterPayloadType(c.second.first, c.second.second, c.first),
-        NetEq::kOK)
-        << "Cannot register " << c.second.second << " to payload type "
-        << c.first;
-  }
-}
-
-void NetEqTest::RegisterExternalDecoders(const ExtDecoderMap& codecs) {
-  for (const auto& c : codecs) {
-    RTC_CHECK_EQ(
-        neteq_->RegisterExternalDecoder(c.second.decoder, c.second.codec,
-                                        c.second.codec_name, c.first),
-        NetEq::kOK)
-        << "Cannot register " << c.second.codec_name << " to payload type "
-        << c.first;
-  }
-}
-
-}  // namespace test
-}  // namespace webrtc
diff --git a/modules/audio_coding/neteq/tools/neteq_test.h b/modules/audio_coding/neteq/tools/neteq_test.h
deleted file mode 100644
index 18fad9a..0000000
--- a/modules/audio_coding/neteq/tools/neteq_test.h
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- *  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_NETEQ_TOOLS_NETEQ_TEST_H_
-#define WEBRTC_MODULES_AUDIO_CODING_NETEQ_TOOLS_NETEQ_TEST_H_
-
-#include <map>
-#include <memory>
-#include <string>
-#include <utility>
-
-#include "webrtc/modules/audio_coding/neteq/include/neteq.h"
-#include "webrtc/modules/audio_coding/neteq/tools/audio_sink.h"
-#include "webrtc/modules/audio_coding/neteq/tools/neteq_input.h"
-
-namespace webrtc {
-namespace test {
-
-class NetEqTestErrorCallback {
- public:
-  virtual ~NetEqTestErrorCallback() = default;
-  virtual void OnInsertPacketError(const NetEqInput::PacketData& packet) {}
-  virtual void OnGetAudioError() {}
-};
-
-class DefaultNetEqTestErrorCallback : public NetEqTestErrorCallback {
-  void OnInsertPacketError(const NetEqInput::PacketData& packet) override;
-  void OnGetAudioError() override;
-};
-
-class NetEqPostInsertPacket {
- public:
-  virtual ~NetEqPostInsertPacket() = default;
-  virtual void AfterInsertPacket(const NetEqInput::PacketData& packet,
-                                 NetEq* neteq) = 0;
-};
-
-class NetEqGetAudioCallback {
- public:
-  virtual ~NetEqGetAudioCallback() = default;
-  virtual void BeforeGetAudio(NetEq* neteq) = 0;
-  virtual void AfterGetAudio(int64_t time_now_ms,
-                             const AudioFrame& audio_frame,
-                             bool muted,
-                             NetEq* neteq) = 0;
-};
-
-// Class that provides an input--output test for NetEq. The input (both packets
-// and output events) is provided by a NetEqInput object, while the output is
-// directed to an AudioSink object.
-class NetEqTest {
- public:
-  using DecoderMap = std::map<int, std::pair<NetEqDecoder, std::string> >;
-
-  struct ExternalDecoderInfo {
-    AudioDecoder* decoder;
-    NetEqDecoder codec;
-    std::string codec_name;
-  };
-
-  using ExtDecoderMap = std::map<int, ExternalDecoderInfo>;
-
-  struct Callbacks {
-    NetEqTestErrorCallback* error_callback = nullptr;
-    NetEqPostInsertPacket* post_insert_packet = nullptr;
-    NetEqGetAudioCallback* get_audio_callback = nullptr;
-  };
-
-  // Sets up the test with given configuration, codec mappings, input, ouput,
-  // and callback objects for error reporting.
-  NetEqTest(const NetEq::Config& config,
-            const DecoderMap& codecs,
-            const ExtDecoderMap& ext_codecs,
-            std::unique_ptr<NetEqInput> input,
-            std::unique_ptr<AudioSink> output,
-            Callbacks callbacks);
-
-  ~NetEqTest() = default;
-
-  // Runs the test. Returns the duration of the produced audio in ms.
-  int64_t Run();
-
-  // Returns the statistics from NetEq.
-  NetEqNetworkStatistics SimulationStats();
-
- private:
-  void RegisterDecoders(const DecoderMap& codecs);
-  void RegisterExternalDecoders(const ExtDecoderMap& codecs);
-
-  std::unique_ptr<NetEq> neteq_;
-  std::unique_ptr<NetEqInput> input_;
-  std::unique_ptr<AudioSink> output_;
-  Callbacks callbacks_;
-  int sample_rate_hz_;
-};
-
-}  // namespace test
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_AUDIO_CODING_NETEQ_TOOLS_NETEQ_TEST_H_
diff --git a/modules/audio_coding/neteq/tools/output_audio_file.h b/modules/audio_coding/neteq/tools/output_audio_file.h
deleted file mode 100644
index 7934470..0000000
--- a/modules/audio_coding/neteq/tools/output_audio_file.h
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- *  Copyright (c) 2014 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_NETEQ_TOOLS_OUTPUT_AUDIO_FILE_H_
-#define WEBRTC_MODULES_AUDIO_CODING_NETEQ_TOOLS_OUTPUT_AUDIO_FILE_H_
-
-#include <assert.h>
-#include <stdio.h>
-#include <string>
-
-#include "webrtc/modules/audio_coding/neteq/tools/audio_sink.h"
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace webrtc {
-namespace test {
-
-class OutputAudioFile : public AudioSink {
- public:
-  // Creates an OutputAudioFile, opening a file named |file_name| for writing.
-  // The file format is 16-bit signed host-endian PCM.
-  explicit OutputAudioFile(const std::string& file_name) {
-    out_file_ = fopen(file_name.c_str(), "wb");
-  }
-
-  virtual ~OutputAudioFile() {
-    if (out_file_)
-      fclose(out_file_);
-  }
-
-  bool WriteArray(const int16_t* audio, size_t num_samples) override {
-    assert(out_file_);
-    return fwrite(audio, sizeof(*audio), num_samples, out_file_) == num_samples;
-  }
-
- private:
-  FILE* out_file_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(OutputAudioFile);
-};
-
-}  // namespace test
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_AUDIO_CODING_NETEQ_TOOLS_OUTPUT_AUDIO_FILE_H_
diff --git a/modules/audio_coding/neteq/tools/output_wav_file.h b/modules/audio_coding/neteq/tools/output_wav_file.h
deleted file mode 100644
index 7b3431d..0000000
--- a/modules/audio_coding/neteq/tools/output_wav_file.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- *  Copyright (c) 2014 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_NETEQ_TOOLS_OUTPUT_WAV_FILE_H_
-#define WEBRTC_MODULES_AUDIO_CODING_NETEQ_TOOLS_OUTPUT_WAV_FILE_H_
-
-#include <string>
-
-#include "webrtc/common_audio/wav_file.h"
-#include "webrtc/modules/audio_coding/neteq/tools/audio_sink.h"
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace webrtc {
-namespace test {
-
-class OutputWavFile : public AudioSink {
- public:
-  // Creates an OutputWavFile, opening a file named |file_name| for writing.
-  // The output file is a PCM encoded wav file.
-  OutputWavFile(const std::string& file_name, int sample_rate_hz)
-      : wav_writer_(file_name, sample_rate_hz, 1) {}
-
-  bool WriteArray(const int16_t* audio, size_t num_samples) override {
-    wav_writer_.WriteSamples(audio, num_samples);
-    return true;
-  }
-
- private:
-  WavWriter wav_writer_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(OutputWavFile);
-};
-
-}  // namespace test
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_AUDIO_CODING_NETEQ_TOOLS_OUTPUT_WAV_FILE_H_
diff --git a/modules/audio_coding/neteq/tools/packet.cc b/modules/audio_coding/neteq/tools/packet.cc
deleted file mode 100644
index b5b1b2f..0000000
--- a/modules/audio_coding/neteq/tools/packet.cc
+++ /dev/null
@@ -1,170 +0,0 @@
-/*
- *  Copyright (c) 2014 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/neteq/tools/packet.h"
-
-#include <string.h>
-
-#include <memory>
-
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_header_parser.h"
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-namespace test {
-
-Packet::Packet(uint8_t* packet_memory,
-               size_t allocated_bytes,
-               double time_ms,
-               const RtpHeaderParser& parser)
-    : payload_memory_(packet_memory),
-      payload_(NULL),
-      packet_length_bytes_(allocated_bytes),
-      payload_length_bytes_(0),
-      virtual_packet_length_bytes_(allocated_bytes),
-      virtual_payload_length_bytes_(0),
-      time_ms_(time_ms) {
-  valid_header_ = ParseHeader(parser);
-}
-
-Packet::Packet(uint8_t* packet_memory,
-               size_t allocated_bytes,
-               size_t virtual_packet_length_bytes,
-               double time_ms,
-               const RtpHeaderParser& parser)
-    : payload_memory_(packet_memory),
-      payload_(NULL),
-      packet_length_bytes_(allocated_bytes),
-      payload_length_bytes_(0),
-      virtual_packet_length_bytes_(virtual_packet_length_bytes),
-      virtual_payload_length_bytes_(0),
-      time_ms_(time_ms) {
-  valid_header_ = ParseHeader(parser);
-}
-
-Packet::Packet(uint8_t* packet_memory, size_t allocated_bytes, double time_ms)
-    : payload_memory_(packet_memory),
-      payload_(NULL),
-      packet_length_bytes_(allocated_bytes),
-      payload_length_bytes_(0),
-      virtual_packet_length_bytes_(allocated_bytes),
-      virtual_payload_length_bytes_(0),
-      time_ms_(time_ms) {
-  std::unique_ptr<RtpHeaderParser> parser(RtpHeaderParser::Create());
-  valid_header_ = ParseHeader(*parser);
-}
-
-Packet::Packet(uint8_t* packet_memory,
-               size_t allocated_bytes,
-               size_t virtual_packet_length_bytes,
-               double time_ms)
-    : payload_memory_(packet_memory),
-      payload_(NULL),
-      packet_length_bytes_(allocated_bytes),
-      payload_length_bytes_(0),
-      virtual_packet_length_bytes_(virtual_packet_length_bytes),
-      virtual_payload_length_bytes_(0),
-      time_ms_(time_ms) {
-  std::unique_ptr<RtpHeaderParser> parser(RtpHeaderParser::Create());
-  valid_header_ = ParseHeader(*parser);
-}
-
-Packet::~Packet() = default;
-
-bool Packet::ExtractRedHeaders(std::list<RTPHeader*>* headers) const {
-  //
-  //  0                   1                    2                   3
-  //  0 1 2 3 4 5 6 7 8 9 0 1 2 3  4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
-  // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-  // |1|   block PT  |  timestamp offset         |   block length    |
-  // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-  // |1|    ...                                                      |
-  // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-  // |0|   block PT  |
-  // +-+-+-+-+-+-+-+-+
-  //
-
-  assert(payload_);
-  const uint8_t* payload_ptr = payload_;
-  const uint8_t* payload_end_ptr = payload_ptr + payload_length_bytes_;
-
-  // Find all RED headers with the extension bit set to 1. That is, all headers
-  // but the last one.
-  while ((payload_ptr < payload_end_ptr) && (*payload_ptr & 0x80)) {
-    RTPHeader* header = new RTPHeader;
-    CopyToHeader(header);
-    header->payloadType = payload_ptr[0] & 0x7F;
-    uint32_t offset = (payload_ptr[1] << 6) + ((payload_ptr[2] & 0xFC) >> 2);
-    header->timestamp -= offset;
-    headers->push_front(header);
-    payload_ptr += 4;
-  }
-  // Last header.
-  assert(payload_ptr < payload_end_ptr);
-  if (payload_ptr >= payload_end_ptr) {
-    return false;  // Payload too short.
-  }
-  RTPHeader* header = new RTPHeader;
-  CopyToHeader(header);
-  header->payloadType = payload_ptr[0] & 0x7F;
-  headers->push_front(header);
-  return true;
-}
-
-void Packet::DeleteRedHeaders(std::list<RTPHeader*>* headers) {
-  while (!headers->empty()) {
-    delete headers->front();
-    headers->pop_front();
-  }
-}
-
-bool Packet::ParseHeader(const RtpHeaderParser& parser) {
-  bool valid_header = parser.Parse(
-      payload_memory_.get(), static_cast<int>(packet_length_bytes_), &header_);
-  // Special case for dummy packets that have padding marked in the RTP header.
-  // This causes the RTP header parser to report failure, but is fine in this
-  // context.
-  const bool header_only_with_padding =
-      (header_.headerLength == packet_length_bytes_ &&
-       header_.paddingLength > 0);
-  if (!valid_header && !header_only_with_padding) {
-    return false;
-  }
-  assert(header_.headerLength <= packet_length_bytes_);
-  payload_ = &payload_memory_[header_.headerLength];
-  assert(packet_length_bytes_ >= header_.headerLength);
-  payload_length_bytes_ = packet_length_bytes_ - header_.headerLength;
-  RTC_CHECK_GE(virtual_packet_length_bytes_, packet_length_bytes_);
-  assert(virtual_packet_length_bytes_ >= header_.headerLength);
-  virtual_payload_length_bytes_ =
-      virtual_packet_length_bytes_ - header_.headerLength;
-  return true;
-}
-
-void Packet::CopyToHeader(RTPHeader* destination) const {
-  destination->markerBit = header_.markerBit;
-  destination->payloadType = header_.payloadType;
-  destination->sequenceNumber = header_.sequenceNumber;
-  destination->timestamp = header_.timestamp;
-  destination->ssrc = header_.ssrc;
-  destination->numCSRCs = header_.numCSRCs;
-  destination->paddingLength = header_.paddingLength;
-  destination->headerLength = header_.headerLength;
-  destination->payload_type_frequency = header_.payload_type_frequency;
-  memcpy(&destination->arrOfCSRCs,
-         &header_.arrOfCSRCs,
-         sizeof(header_.arrOfCSRCs));
-  memcpy(
-      &destination->extension, &header_.extension, sizeof(header_.extension));
-}
-
-}  // namespace test
-}  // namespace webrtc
diff --git a/modules/audio_coding/neteq/tools/packet.h b/modules/audio_coding/neteq/tools/packet.h
deleted file mode 100644
index ce9ef5a..0000000
--- a/modules/audio_coding/neteq/tools/packet.h
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- *  Copyright (c) 2014 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_NETEQ_TOOLS_PACKET_H_
-#define WEBRTC_MODULES_AUDIO_CODING_NETEQ_TOOLS_PACKET_H_
-
-#include <list>
-#include <memory>
-
-#include "webrtc/common_types.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-class RtpHeaderParser;
-
-namespace test {
-
-// Class for handling RTP packets in test applications.
-class Packet {
- public:
-  // Creates a packet, with the packet payload (including header bytes) in
-  // |packet_memory|. The length of |packet_memory| is |allocated_bytes|.
-  // The new object assumes ownership of |packet_memory| and will delete it
-  // when the Packet object is deleted. The |time_ms| is an extra time
-  // associated with this packet, typically used to denote arrival time.
-  // The first bytes in |packet_memory| will be parsed using |parser|.
-  Packet(uint8_t* packet_memory,
-         size_t allocated_bytes,
-         double time_ms,
-         const RtpHeaderParser& parser);
-
-  // Same as above, but with the extra argument |virtual_packet_length_bytes|.
-  // This is typically used when reading RTP dump files that only contain the
-  // RTP headers, and no payload (a.k.a RTP dummy files or RTP light). The
-  // |virtual_packet_length_bytes| tells what size the packet had on wire,
-  // including the now discarded payload, whereas |allocated_bytes| is the
-  // length of the remaining payload (typically only the RTP header).
-  Packet(uint8_t* packet_memory,
-         size_t allocated_bytes,
-         size_t virtual_packet_length_bytes,
-         double time_ms,
-         const RtpHeaderParser& parser);
-
-  // The following two constructors are the same as above, but without a
-  // parser. Note that when the object is constructed using any of these
-  // methods, the header will be parsed using a default RtpHeaderParser object.
-  // In particular, RTP header extensions won't be parsed.
-  Packet(uint8_t* packet_memory, size_t allocated_bytes, double time_ms);
-
-  Packet(uint8_t* packet_memory,
-         size_t allocated_bytes,
-         size_t virtual_packet_length_bytes,
-         double time_ms);
-
-  virtual ~Packet();
-
-  // Parses the first bytes of the RTP payload, interpreting them as RED headers
-  // according to RFC 2198. The headers will be inserted into |headers|. The
-  // caller of the method assumes ownership of the objects in the list, and
-  // must delete them properly.
-  bool ExtractRedHeaders(std::list<RTPHeader*>* headers) const;
-
-  // Deletes all RTPHeader objects in |headers|, but does not delete |headers|
-  // itself.
-  static void DeleteRedHeaders(std::list<RTPHeader*>* headers);
-
-  const uint8_t* payload() const { return payload_; }
-
-  size_t packet_length_bytes() const { return packet_length_bytes_; }
-
-  size_t payload_length_bytes() const { return payload_length_bytes_; }
-
-  size_t virtual_packet_length_bytes() const {
-    return virtual_packet_length_bytes_;
-  }
-
-  size_t virtual_payload_length_bytes() const {
-    return virtual_payload_length_bytes_;
-  }
-
-  const RTPHeader& header() const { return header_; }
-
-  void set_time_ms(double time) { time_ms_ = time; }
-  double time_ms() const { return time_ms_; }
-  bool valid_header() const { return valid_header_; }
-
- private:
-  bool ParseHeader(const RtpHeaderParser& parser);
-  void CopyToHeader(RTPHeader* destination) const;
-
-  RTPHeader header_;
-  std::unique_ptr<uint8_t[]> payload_memory_;
-  const uint8_t* payload_;            // First byte after header.
-  const size_t packet_length_bytes_;  // Total length of packet.
-  size_t payload_length_bytes_;  // Length of the payload, after RTP header.
-                                 // Zero for dummy RTP packets.
-  // Virtual lengths are used when parsing RTP header files (dummy RTP files).
-  const size_t virtual_packet_length_bytes_;
-  size_t virtual_payload_length_bytes_;
-  double time_ms_;     // Used to denote a packet's arrival time.
-  bool valid_header_;  // Set by the RtpHeaderParser.
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(Packet);
-};
-
-}  // namespace test
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_AUDIO_CODING_NETEQ_TOOLS_PACKET_H_
diff --git a/modules/audio_coding/neteq/tools/packet_source.cc b/modules/audio_coding/neteq/tools/packet_source.cc
deleted file mode 100644
index d6cb37e..0000000
--- a/modules/audio_coding/neteq/tools/packet_source.cc
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- *  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/neteq/tools/packet_source.h"
-
-namespace webrtc {
-namespace test {
-
-PacketSource::PacketSource() : use_ssrc_filter_(false), ssrc_(0) {}
-
-PacketSource::~PacketSource() = default;
-
-void PacketSource::FilterOutPayloadType(uint8_t payload_type) {
-  filter_.set(payload_type, true);
-}
-
-void PacketSource::SelectSsrc(uint32_t ssrc) {
-  use_ssrc_filter_ = true;
-  ssrc_ = ssrc;
-}
-
-}  // namespace test
-}  // namespace webrtc
diff --git a/modules/audio_coding/neteq/tools/packet_source.h b/modules/audio_coding/neteq/tools/packet_source.h
deleted file mode 100644
index 233ddec..0000000
--- a/modules/audio_coding/neteq/tools/packet_source.h
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- *  Copyright (c) 2014 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_NETEQ_TOOLS_PACKET_SOURCE_H_
-#define WEBRTC_MODULES_AUDIO_CODING_NETEQ_TOOLS_PACKET_SOURCE_H_
-
-#include <bitset>
-#include <memory>
-
-#include "webrtc/modules/audio_coding/neteq/tools/packet.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-namespace test {
-
-// Interface class for an object delivering RTP packets to test applications.
-class PacketSource {
- public:
-  PacketSource();
-  virtual ~PacketSource();
-
-  // Returns next packet. Returns nullptr if the source is depleted, or if an
-  // error occurred.
-  virtual std::unique_ptr<Packet> NextPacket() = 0;
-
-  virtual void FilterOutPayloadType(uint8_t payload_type);
-
-  virtual void SelectSsrc(uint32_t ssrc);
-
- protected:
-  std::bitset<128> filter_;  // Payload type is 7 bits in the RFC.
-  // If SSRC filtering discards all packet that do not match the SSRC.
-  bool use_ssrc_filter_;  // True when SSRC filtering is active.
-  uint32_t ssrc_;  // The selected SSRC. All other SSRCs will be discarded.
-
- private:
-  RTC_DISALLOW_COPY_AND_ASSIGN(PacketSource);
-};
-
-}  // namespace test
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_AUDIO_CODING_NETEQ_TOOLS_PACKET_SOURCE_H_
diff --git a/modules/audio_coding/neteq/tools/packet_unittest.cc b/modules/audio_coding/neteq/tools/packet_unittest.cc
deleted file mode 100644
index 940276b..0000000
--- a/modules/audio_coding/neteq/tools/packet_unittest.cc
+++ /dev/null
@@ -1,202 +0,0 @@
-/*
- *  Copyright (c) 2014 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.
- */
-
-// Unit tests for test Packet class.
-
-#include "webrtc/modules/audio_coding/neteq/tools/packet.h"
-
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-namespace test {
-
-namespace {
-const int kHeaderLengthBytes = 12;
-
-void MakeRtpHeader(int payload_type,
-                   int seq_number,
-                   uint32_t timestamp,
-                   uint32_t ssrc,
-                   uint8_t* rtp_data) {
-  rtp_data[0] = 0x80;
-  rtp_data[1] = static_cast<uint8_t>(payload_type);
-  rtp_data[2] = (seq_number >> 8) & 0xFF;
-  rtp_data[3] = (seq_number) & 0xFF;
-  rtp_data[4] = timestamp >> 24;
-  rtp_data[5] = (timestamp >> 16) & 0xFF;
-  rtp_data[6] = (timestamp >> 8) & 0xFF;
-  rtp_data[7] = timestamp & 0xFF;
-  rtp_data[8] = ssrc >> 24;
-  rtp_data[9] = (ssrc >> 16) & 0xFF;
-  rtp_data[10] = (ssrc >> 8) & 0xFF;
-  rtp_data[11] = ssrc & 0xFF;
-}
-}  // namespace
-
-TEST(TestPacket, RegularPacket) {
-  const size_t kPacketLengthBytes = 100;
-  uint8_t* packet_memory = new uint8_t[kPacketLengthBytes];
-  const uint8_t kPayloadType = 17;
-  const uint16_t kSequenceNumber = 4711;
-  const uint32_t kTimestamp = 47114711;
-  const uint32_t kSsrc = 0x12345678;
-  MakeRtpHeader(
-      kPayloadType, kSequenceNumber, kTimestamp, kSsrc, packet_memory);
-  const double kPacketTime = 1.0;
-  // Hand over ownership of |packet_memory| to |packet|.
-  Packet packet(packet_memory, kPacketLengthBytes, kPacketTime);
-  ASSERT_TRUE(packet.valid_header());
-  EXPECT_EQ(kPayloadType, packet.header().payloadType);
-  EXPECT_EQ(kSequenceNumber, packet.header().sequenceNumber);
-  EXPECT_EQ(kTimestamp, packet.header().timestamp);
-  EXPECT_EQ(kSsrc, packet.header().ssrc);
-  EXPECT_EQ(0, packet.header().numCSRCs);
-  EXPECT_EQ(kPacketLengthBytes, packet.packet_length_bytes());
-  EXPECT_EQ(kPacketLengthBytes - kHeaderLengthBytes,
-            packet.payload_length_bytes());
-  EXPECT_EQ(kPacketLengthBytes, packet.virtual_packet_length_bytes());
-  EXPECT_EQ(kPacketLengthBytes - kHeaderLengthBytes,
-            packet.virtual_payload_length_bytes());
-  EXPECT_EQ(kPacketTime, packet.time_ms());
-}
-
-TEST(TestPacket, DummyPacket) {
-  const size_t kPacketLengthBytes = kHeaderLengthBytes;  // Only RTP header.
-  const size_t kVirtualPacketLengthBytes = 100;
-  uint8_t* packet_memory = new uint8_t[kPacketLengthBytes];
-  const uint8_t kPayloadType = 17;
-  const uint16_t kSequenceNumber = 4711;
-  const uint32_t kTimestamp = 47114711;
-  const uint32_t kSsrc = 0x12345678;
-  MakeRtpHeader(
-      kPayloadType, kSequenceNumber, kTimestamp, kSsrc, packet_memory);
-  const double kPacketTime = 1.0;
-  // Hand over ownership of |packet_memory| to |packet|.
-  Packet packet(packet_memory,
-                kPacketLengthBytes,
-                kVirtualPacketLengthBytes,
-                kPacketTime);
-  ASSERT_TRUE(packet.valid_header());
-  EXPECT_EQ(kPayloadType, packet.header().payloadType);
-  EXPECT_EQ(kSequenceNumber, packet.header().sequenceNumber);
-  EXPECT_EQ(kTimestamp, packet.header().timestamp);
-  EXPECT_EQ(kSsrc, packet.header().ssrc);
-  EXPECT_EQ(0, packet.header().numCSRCs);
-  EXPECT_EQ(kPacketLengthBytes, packet.packet_length_bytes());
-  EXPECT_EQ(kPacketLengthBytes - kHeaderLengthBytes,
-            packet.payload_length_bytes());
-  EXPECT_EQ(kVirtualPacketLengthBytes, packet.virtual_packet_length_bytes());
-  EXPECT_EQ(kVirtualPacketLengthBytes - kHeaderLengthBytes,
-            packet.virtual_payload_length_bytes());
-  EXPECT_EQ(kPacketTime, packet.time_ms());
-}
-
-namespace {
-// Writes one RED block header starting at |rtp_data|, according to RFC 2198.
-// returns the number of bytes written (1 or 4).
-//
-// Format if |last_payoad| is false:
-// 0                   1                    2                   3
-// 0 1 2 3 4 5 6 7 8 9 0 1 2 3  4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
-// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-// |1|   block PT  |  timestamp offset         |   block length    |
-// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//
-// Format if |last_payoad| is true:
-// 0 1 2 3 4 5 6 7
-// +-+-+-+-+-+-+-+-+
-// |0|   Block PT  |
-// +-+-+-+-+-+-+-+-+
-
-int MakeRedHeader(int payload_type,
-                  uint32_t timestamp_offset,
-                  int block_length,
-                  bool last_payload,
-                  uint8_t* rtp_data) {
-  rtp_data[0] = 0x80 | (payload_type & 0x7F);  // Set the first bit to 1.
-  if (last_payload) {
-    rtp_data[0] &= 0x7F;  // Reset the first but to 0 to indicate last block.
-    return 1;
-  }
-  rtp_data[1] = timestamp_offset >> 6;
-  rtp_data[2] = (timestamp_offset & 0x3F) << 2;
-  rtp_data[2] |= block_length >> 8;
-  rtp_data[3] = block_length & 0xFF;
-  return 4;
-}
-}  // namespace
-
-TEST(TestPacket, RED) {
-  const size_t kPacketLengthBytes = 100;
-  uint8_t* packet_memory = new uint8_t[kPacketLengthBytes];
-  const uint8_t kRedPayloadType = 17;
-  const uint16_t kSequenceNumber = 4711;
-  const uint32_t kTimestamp = 47114711;
-  const uint32_t kSsrc = 0x12345678;
-  MakeRtpHeader(
-      kRedPayloadType, kSequenceNumber, kTimestamp, kSsrc, packet_memory);
-  // Create four RED headers.
-  // Payload types are just the same as the block index the offset is 100 times
-  // the block index.
-  const int kRedBlocks = 4;
-  uint8_t* payload_ptr =
-      &packet_memory[kHeaderLengthBytes];  // First byte after header.
-  for (int i = 0; i < kRedBlocks; ++i) {
-    int payload_type = i;
-    // Offset value is not used for the last block.
-    uint32_t timestamp_offset = 100 * i;
-    int block_length = 10 * i;
-    bool last_block = (i == kRedBlocks - 1) ? true : false;
-    payload_ptr += MakeRedHeader(
-        payload_type, timestamp_offset, block_length, last_block, payload_ptr);
-  }
-  const double kPacketTime = 1.0;
-  // Hand over ownership of |packet_memory| to |packet|.
-  Packet packet(packet_memory, kPacketLengthBytes, kPacketTime);
-  ASSERT_TRUE(packet.valid_header());
-  EXPECT_EQ(kRedPayloadType, packet.header().payloadType);
-  EXPECT_EQ(kSequenceNumber, packet.header().sequenceNumber);
-  EXPECT_EQ(kTimestamp, packet.header().timestamp);
-  EXPECT_EQ(kSsrc, packet.header().ssrc);
-  EXPECT_EQ(0, packet.header().numCSRCs);
-  EXPECT_EQ(kPacketLengthBytes, packet.packet_length_bytes());
-  EXPECT_EQ(kPacketLengthBytes - kHeaderLengthBytes,
-            packet.payload_length_bytes());
-  EXPECT_EQ(kPacketLengthBytes, packet.virtual_packet_length_bytes());
-  EXPECT_EQ(kPacketLengthBytes - kHeaderLengthBytes,
-            packet.virtual_payload_length_bytes());
-  EXPECT_EQ(kPacketTime, packet.time_ms());
-  std::list<RTPHeader*> red_headers;
-  EXPECT_TRUE(packet.ExtractRedHeaders(&red_headers));
-  EXPECT_EQ(kRedBlocks, static_cast<int>(red_headers.size()));
-  int block_index = 0;
-  for (std::list<RTPHeader*>::reverse_iterator it = red_headers.rbegin();
-       it != red_headers.rend();
-       ++it) {
-    // Reading list from the back, since the extraction puts the main payload
-    // (which is the last one on wire) first.
-    RTPHeader* red_block = *it;
-    EXPECT_EQ(block_index, red_block->payloadType);
-    EXPECT_EQ(kSequenceNumber, red_block->sequenceNumber);
-    if (block_index == kRedBlocks - 1) {
-      // Last block has zero offset per definition.
-      EXPECT_EQ(kTimestamp, red_block->timestamp);
-    } else {
-      EXPECT_EQ(kTimestamp - 100 * block_index, red_block->timestamp);
-    }
-    EXPECT_EQ(kSsrc, red_block->ssrc);
-    EXPECT_EQ(0, red_block->numCSRCs);
-    ++block_index;
-  }
-  Packet::DeleteRedHeaders(&red_headers);
-}
-
-}  // namespace test
-}  // namespace webrtc
diff --git a/modules/audio_coding/neteq/tools/resample_input_audio_file.cc b/modules/audio_coding/neteq/tools/resample_input_audio_file.cc
deleted file mode 100644
index 45c5b20..0000000
--- a/modules/audio_coding/neteq/tools/resample_input_audio_file.cc
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- *  Copyright (c) 2014 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/neteq/tools/resample_input_audio_file.h"
-
-#include <memory>
-
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-namespace test {
-
-bool ResampleInputAudioFile::Read(size_t samples,
-                                  int output_rate_hz,
-                                  int16_t* destination) {
-  const size_t samples_to_read = samples * file_rate_hz_ / output_rate_hz;
-  RTC_CHECK_EQ(samples_to_read * output_rate_hz, samples * file_rate_hz_)
-      << "Frame size and sample rates don't add up to an integer.";
-  std::unique_ptr<int16_t[]> temp_destination(new int16_t[samples_to_read]);
-  if (!InputAudioFile::Read(samples_to_read, temp_destination.get()))
-    return false;
-  resampler_.ResetIfNeeded(file_rate_hz_, output_rate_hz, 1);
-  size_t output_length = 0;
-  RTC_CHECK_EQ(resampler_.Push(temp_destination.get(), samples_to_read,
-                               destination, samples, output_length),
-               0);
-  RTC_CHECK_EQ(samples, output_length);
-  return true;
-}
-
-bool ResampleInputAudioFile::Read(size_t samples, int16_t* destination) {
-  RTC_CHECK_GT(output_rate_hz_, 0) << "Output rate not set.";
-  return Read(samples, output_rate_hz_, destination);
-}
-
-void ResampleInputAudioFile::set_output_rate_hz(int rate_hz) {
-  output_rate_hz_ = rate_hz;
-}
-
-}  // namespace test
-}  // namespace webrtc
diff --git a/modules/audio_coding/neteq/tools/resample_input_audio_file.h b/modules/audio_coding/neteq/tools/resample_input_audio_file.h
deleted file mode 100644
index b008d19..0000000
--- a/modules/audio_coding/neteq/tools/resample_input_audio_file.h
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- *  Copyright (c) 2014 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_NETEQ_TOOLS_RESAMPLE_INPUT_AUDIO_FILE_H_
-#define WEBRTC_MODULES_AUDIO_CODING_NETEQ_TOOLS_RESAMPLE_INPUT_AUDIO_FILE_H_
-
-#include <string>
-
-#include "webrtc/common_audio/resampler/include/resampler.h"
-#include "webrtc/modules/audio_coding/neteq/tools/input_audio_file.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-namespace test {
-
-// Class for handling a looping input audio file with resampling.
-class ResampleInputAudioFile : public InputAudioFile {
- public:
-  ResampleInputAudioFile(const std::string file_name, int file_rate_hz)
-      : InputAudioFile(file_name),
-        file_rate_hz_(file_rate_hz),
-        output_rate_hz_(-1) {}
-  ResampleInputAudioFile(const std::string file_name,
-                         int file_rate_hz,
-                         int output_rate_hz)
-      : InputAudioFile(file_name),
-        file_rate_hz_(file_rate_hz),
-        output_rate_hz_(output_rate_hz) {}
-
-  bool Read(size_t samples, int output_rate_hz, int16_t* destination);
-  bool Read(size_t samples, int16_t* destination) override;
-  void set_output_rate_hz(int rate_hz);
-
- private:
-  const int file_rate_hz_;
-  int output_rate_hz_;
-  Resampler resampler_;
-  RTC_DISALLOW_COPY_AND_ASSIGN(ResampleInputAudioFile);
-};
-
-}  // namespace test
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_AUDIO_CODING_NETEQ_TOOLS_RESAMPLE_INPUT_AUDIO_FILE_H_
diff --git a/modules/audio_coding/neteq/tools/rtc_event_log_source.cc b/modules/audio_coding/neteq/tools/rtc_event_log_source.cc
deleted file mode 100644
index f54f91e..0000000
--- a/modules/audio_coding/neteq/tools/rtc_event_log_source.cc
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- *  Copyright (c) 2015 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/neteq/tools/rtc_event_log_source.h"
-
-#include <assert.h>
-#include <string.h>
-#include <iostream>
-#include <limits>
-
-#include "webrtc/call/call.h"
-#include "webrtc/modules/audio_coding/neteq/tools/packet.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_header_parser.h"
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-namespace test {
-
-RtcEventLogSource* RtcEventLogSource::Create(const std::string& file_name) {
-  RtcEventLogSource* source = new RtcEventLogSource();
-  RTC_CHECK(source->OpenFile(file_name));
-  return source;
-}
-
-RtcEventLogSource::~RtcEventLogSource() {}
-
-bool RtcEventLogSource::RegisterRtpHeaderExtension(RTPExtensionType type,
-                                                   uint8_t id) {
-  RTC_CHECK(parser_.get());
-  return parser_->RegisterRtpHeaderExtension(type, id);
-}
-
-std::unique_ptr<Packet> RtcEventLogSource::NextPacket() {
-  for (; rtp_packet_index_ < parsed_stream_.GetNumberOfEvents();
-       rtp_packet_index_++) {
-    if (parsed_stream_.GetEventType(rtp_packet_index_) ==
-        ParsedRtcEventLog::RTP_EVENT) {
-      PacketDirection direction;
-      size_t header_length;
-      size_t packet_length;
-      uint64_t timestamp_us = parsed_stream_.GetTimestamp(rtp_packet_index_);
-      parsed_stream_.GetRtpHeader(rtp_packet_index_, &direction, nullptr,
-                                  &header_length, &packet_length);
-
-      if (direction != kIncomingPacket) {
-        continue;
-      }
-
-      uint8_t* packet_header = new uint8_t[header_length];
-      parsed_stream_.GetRtpHeader(rtp_packet_index_, nullptr, packet_header,
-                                  nullptr, nullptr);
-      std::unique_ptr<Packet> packet(
-          new Packet(packet_header, header_length, packet_length,
-                     static_cast<double>(timestamp_us) / 1000, *parser_.get()));
-
-      if (!packet->valid_header()) {
-        std::cout << "Warning: Packet with index " << rtp_packet_index_
-                  << " has an invalid header and will be ignored." << std::endl;
-        continue;
-      }
-
-      if (parsed_stream_.GetMediaType(packet->header().ssrc, direction) !=
-          webrtc::ParsedRtcEventLog::MediaType::AUDIO) {
-        continue;
-      }
-
-      // Check if the packet should not be filtered out.
-      if (!filter_.test(packet->header().payloadType) &&
-          !(use_ssrc_filter_ && packet->header().ssrc != ssrc_)) {
-        ++rtp_packet_index_;
-        return packet;
-      }
-    }
-  }
-  return nullptr;
-}
-
-int64_t RtcEventLogSource::NextAudioOutputEventMs() {
-  while (audio_output_index_ < parsed_stream_.GetNumberOfEvents()) {
-    if (parsed_stream_.GetEventType(audio_output_index_) ==
-        ParsedRtcEventLog::AUDIO_PLAYOUT_EVENT) {
-      uint64_t timestamp_us = parsed_stream_.GetTimestamp(audio_output_index_);
-      // We call GetAudioPlayout only to check that the protobuf event is
-      // well-formed.
-      parsed_stream_.GetAudioPlayout(audio_output_index_, nullptr);
-      audio_output_index_++;
-      return timestamp_us / 1000;
-    }
-    audio_output_index_++;
-  }
-  return std::numeric_limits<int64_t>::max();
-}
-
-RtcEventLogSource::RtcEventLogSource()
-    : PacketSource(), parser_(RtpHeaderParser::Create()) {}
-
-bool RtcEventLogSource::OpenFile(const std::string& file_name) {
-  return parsed_stream_.ParseFile(file_name);
-}
-
-}  // namespace test
-}  // namespace webrtc
diff --git a/modules/audio_coding/neteq/tools/rtc_event_log_source.h b/modules/audio_coding/neteq/tools/rtc_event_log_source.h
deleted file mode 100644
index 15e3ce7..0000000
--- a/modules/audio_coding/neteq/tools/rtc_event_log_source.h
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- *  Copyright (c) 2015 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_NETEQ_TOOLS_RTC_EVENT_LOG_SOURCE_H_
-#define WEBRTC_MODULES_AUDIO_CODING_NETEQ_TOOLS_RTC_EVENT_LOG_SOURCE_H_
-
-#include <memory>
-#include <string>
-
-#include "webrtc/logging/rtc_event_log/rtc_event_log_parser.h"
-#include "webrtc/modules/audio_coding/neteq/tools/packet_source.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace webrtc {
-
-class RtpHeaderParser;
-
-namespace test {
-
-class Packet;
-
-class RtcEventLogSource : public PacketSource {
- public:
-  // Creates an RtcEventLogSource reading from |file_name|. If the file cannot
-  // be opened, or has the wrong format, NULL will be returned.
-  static RtcEventLogSource* Create(const std::string& file_name);
-
-  virtual ~RtcEventLogSource();
-
-  // Registers an RTP header extension and binds it to |id|.
-  virtual bool RegisterRtpHeaderExtension(RTPExtensionType type, uint8_t id);
-
-  std::unique_ptr<Packet> NextPacket() override;
-
-  // Returns the timestamp of the next audio output event, in milliseconds. The
-  // maximum value of int64_t is returned if there are no more audio output
-  // events available.
-  int64_t NextAudioOutputEventMs();
-
- private:
-  RtcEventLogSource();
-
-  bool OpenFile(const std::string& file_name);
-
-  size_t rtp_packet_index_ = 0;
-  size_t audio_output_index_ = 0;
-
-  ParsedRtcEventLog parsed_stream_;
-  std::unique_ptr<RtpHeaderParser> parser_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(RtcEventLogSource);
-};
-
-}  // namespace test
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_CODING_NETEQ_TOOLS_RTC_EVENT_LOG_SOURCE_H_
diff --git a/modules/audio_coding/neteq/tools/rtp_analyze.cc b/modules/audio_coding/neteq/tools/rtp_analyze.cc
deleted file mode 100644
index 23f96c5..0000000
--- a/modules/audio_coding/neteq/tools/rtp_analyze.cc
+++ /dev/null
@@ -1,174 +0,0 @@
-/*
- *  Copyright (c) 2012 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 <assert.h>
-#include <stdio.h>
-
-#include <memory>
-#include <vector>
-
-#include "webrtc/modules/audio_coding/neteq/tools/packet.h"
-#include "webrtc/modules/audio_coding/neteq/tools/rtp_file_source.h"
-#include "webrtc/rtc_base/flags.h"
-
-// Define command line flags.
-DEFINE_int(red, 117, "RTP payload type for RED");
-DEFINE_int(audio_level, -1, "Extension ID for audio level (RFC 6464); "
-                            "-1 not to print audio level");
-DEFINE_int(abs_send_time, -1, "Extension ID for absolute sender time; "
-                             "-1 not to print absolute send time");
-DEFINE_bool(help, false, "Print this message");
-
-int main(int argc, char* argv[]) {
-  std::string program_name = argv[0];
-  std::string usage =
-      "Tool for parsing an RTP dump file to text output.\n"
-      "Run " +
-      program_name +
-      " --help for usage.\n"
-      "Example usage:\n" +
-      program_name + " input.rtp output.txt\n\n" +
-      "Output is sent to stdout if no output file is given. " +
-      "Note that this tool can read files with or without payloads.\n";
-  if (rtc::FlagList::SetFlagsFromCommandLine(&argc, argv, true) ||
-      FLAG_help || (argc != 2 && argc != 3)) {
-    printf("%s", usage.c_str());
-    if (FLAG_help) {
-      rtc::FlagList::Print(nullptr, false);
-      return 0;
-    }
-    return 1;
-  }
-
-  RTC_CHECK(FLAG_red >= 0 && FLAG_red <= 127);  // Payload type
-  RTC_CHECK(FLAG_audio_level == -1 ||  // Default
-      (FLAG_audio_level > 0 && FLAG_audio_level <= 255));  // Extension ID
-  RTC_CHECK(FLAG_abs_send_time == -1 ||  // Default
-      (FLAG_abs_send_time > 0 && FLAG_abs_send_time <= 255));  // Extension ID
-
-  printf("Input file: %s\n", argv[1]);
-  std::unique_ptr<webrtc::test::RtpFileSource> file_source(
-      webrtc::test::RtpFileSource::Create(argv[1]));
-  assert(file_source.get());
-  // Set RTP extension IDs.
-  bool print_audio_level = false;
-  if (FLAG_audio_level != -1) {
-    print_audio_level = true;
-    file_source->RegisterRtpHeaderExtension(webrtc::kRtpExtensionAudioLevel,
-                                            FLAG_audio_level);
-  }
-  bool print_abs_send_time = false;
-  if (FLAG_abs_send_time != -1) {
-    print_abs_send_time = true;
-    file_source->RegisterRtpHeaderExtension(
-        webrtc::kRtpExtensionAbsoluteSendTime, FLAG_abs_send_time);
-  }
-
-  FILE* out_file;
-  if (argc == 3) {
-    out_file = fopen(argv[2], "wt");
-    if (!out_file) {
-      printf("Cannot open output file %s\n", argv[2]);
-      return -1;
-    }
-    printf("Output file: %s\n\n", argv[2]);
-  } else {
-    out_file = stdout;
-  }
-
-  // Print file header.
-  fprintf(out_file, "SeqNo  TimeStamp   SendTime  Size    PT  M       SSRC");
-  if (print_audio_level) {
-    fprintf(out_file, " AuLvl (V)");
-  }
-  if (print_abs_send_time) {
-    fprintf(out_file, " AbsSendTime");
-  }
-  fprintf(out_file, "\n");
-
-  uint32_t max_abs_send_time = 0;
-  int cycles = -1;
-  std::unique_ptr<webrtc::test::Packet> packet;
-  while (true) {
-    packet = file_source->NextPacket();
-    if (!packet.get()) {
-      // End of file reached.
-      break;
-    }
-    // Write packet data to file. Use virtual_packet_length_bytes so that the
-    // correct packet sizes are printed also for RTP header-only dumps.
-    fprintf(out_file,
-            "%5u %10u %10u %5i %5i %2i %#08X",
-            packet->header().sequenceNumber,
-            packet->header().timestamp,
-            static_cast<unsigned int>(packet->time_ms()),
-            static_cast<int>(packet->virtual_packet_length_bytes()),
-            packet->header().payloadType,
-            packet->header().markerBit,
-            packet->header().ssrc);
-    if (print_audio_level && packet->header().extension.hasAudioLevel) {
-      fprintf(out_file,
-              " %5u (%1i)",
-              packet->header().extension.audioLevel,
-              packet->header().extension.voiceActivity);
-    }
-    if (print_abs_send_time && packet->header().extension.hasAbsoluteSendTime) {
-      if (cycles == -1) {
-        // Initialize.
-        max_abs_send_time = packet->header().extension.absoluteSendTime;
-        cycles = 0;
-      }
-      // Abs sender time is 24 bit 6.18 fixed point. Shift by 8 to normalize to
-      // 32 bits (unsigned). Calculate the difference between this packet's
-      // send time and the maximum observed. Cast to signed 32-bit to get the
-      // desired wrap-around behavior.
-      if (static_cast<int32_t>(
-              (packet->header().extension.absoluteSendTime << 8) -
-              (max_abs_send_time << 8)) >= 0) {
-        // The difference is non-negative, meaning that this packet is newer
-        // than the previously observed maximum absolute send time.
-        if (packet->header().extension.absoluteSendTime < max_abs_send_time) {
-          // Wrap detected.
-          cycles++;
-        }
-        max_abs_send_time = packet->header().extension.absoluteSendTime;
-      }
-      // Abs sender time is 24 bit 6.18 fixed point. Divide by 2^18 to convert
-      // to floating point representation.
-      double send_time_seconds =
-          static_cast<double>(packet->header().extension.absoluteSendTime) /
-              262144 +
-          64.0 * cycles;
-      fprintf(out_file, " %11f", send_time_seconds);
-    }
-    fprintf(out_file, "\n");
-
-    if (packet->header().payloadType == FLAG_red) {
-      std::list<webrtc::RTPHeader*> red_headers;
-      packet->ExtractRedHeaders(&red_headers);
-      while (!red_headers.empty()) {
-        webrtc::RTPHeader* red = red_headers.front();
-        assert(red);
-        fprintf(out_file,
-                "* %5u %10u %10u %5i\n",
-                red->sequenceNumber,
-                red->timestamp,
-                static_cast<unsigned int>(packet->time_ms()),
-                red->payloadType);
-        red_headers.pop_front();
-        delete red;
-      }
-    }
-  }
-
-  fclose(out_file);
-
-  return 0;
-}
diff --git a/modules/audio_coding/neteq/tools/rtp_file_source.cc b/modules/audio_coding/neteq/tools/rtp_file_source.cc
deleted file mode 100644
index 5ea8de9..0000000
--- a/modules/audio_coding/neteq/tools/rtp_file_source.cc
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- *  Copyright (c) 2014 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/neteq/tools/rtp_file_source.h"
-
-#include <assert.h>
-#include <string.h>
-#ifdef WIN32
-#include <winsock2.h>
-#else
-#include <netinet/in.h>
-#endif
-
-#include <memory>
-
-#include "webrtc/modules/audio_coding/neteq/tools/packet.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_header_parser.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/test/rtp_file_reader.h"
-
-namespace webrtc {
-namespace test {
-
-RtpFileSource* RtpFileSource::Create(const std::string& file_name) {
-  RtpFileSource* source = new RtpFileSource();
-  RTC_CHECK(source->OpenFile(file_name));
-  return source;
-}
-
-bool RtpFileSource::ValidRtpDump(const std::string& file_name) {
-  std::unique_ptr<RtpFileReader> temp_file(
-      RtpFileReader::Create(RtpFileReader::kRtpDump, file_name));
-  return !!temp_file;
-}
-
-bool RtpFileSource::ValidPcap(const std::string& file_name) {
-  std::unique_ptr<RtpFileReader> temp_file(
-      RtpFileReader::Create(RtpFileReader::kPcap, file_name));
-  return !!temp_file;
-}
-
-RtpFileSource::~RtpFileSource() {
-}
-
-bool RtpFileSource::RegisterRtpHeaderExtension(RTPExtensionType type,
-                                               uint8_t id) {
-  assert(parser_.get());
-  return parser_->RegisterRtpHeaderExtension(type, id);
-}
-
-std::unique_ptr<Packet> RtpFileSource::NextPacket() {
-  while (true) {
-    RtpPacket temp_packet;
-    if (!rtp_reader_->NextPacket(&temp_packet)) {
-      return NULL;
-    }
-    if (temp_packet.original_length == 0) {
-      // May be an RTCP packet.
-      // Read the next one.
-      continue;
-    }
-    std::unique_ptr<uint8_t[]> packet_memory(new uint8_t[temp_packet.length]);
-    memcpy(packet_memory.get(), temp_packet.data, temp_packet.length);
-    std::unique_ptr<Packet> packet(new Packet(
-        packet_memory.release(), temp_packet.length,
-        temp_packet.original_length, temp_packet.time_ms, *parser_.get()));
-    if (!packet->valid_header()) {
-      continue;
-    }
-    if (filter_.test(packet->header().payloadType) ||
-        (use_ssrc_filter_ && packet->header().ssrc != ssrc_)) {
-      // This payload type should be filtered out. Continue to the next packet.
-      continue;
-    }
-    return packet;
-  }
-}
-
-RtpFileSource::RtpFileSource()
-    : PacketSource(),
-      parser_(RtpHeaderParser::Create()) {}
-
-bool RtpFileSource::OpenFile(const std::string& file_name) {
-  rtp_reader_.reset(RtpFileReader::Create(RtpFileReader::kRtpDump, file_name));
-  if (rtp_reader_)
-    return true;
-  rtp_reader_.reset(RtpFileReader::Create(RtpFileReader::kPcap, file_name));
-  if (!rtp_reader_) {
-    FATAL() << "Couldn't open input file as either a rtpdump or .pcap. Note "
-               "that .pcapng is not supported.";
-  }
-  return true;
-}
-
-}  // namespace test
-}  // namespace webrtc
diff --git a/modules/audio_coding/neteq/tools/rtp_file_source.h b/modules/audio_coding/neteq/tools/rtp_file_source.h
deleted file mode 100644
index 9b0160f..0000000
--- a/modules/audio_coding/neteq/tools/rtp_file_source.h
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- *  Copyright (c) 2014 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_NETEQ_TOOLS_RTP_FILE_SOURCE_H_
-#define WEBRTC_MODULES_AUDIO_CODING_NETEQ_TOOLS_RTP_FILE_SOURCE_H_
-
-#include <stdio.h>
-
-#include <memory>
-#include <string>
-
-#include "webrtc/common_types.h"
-#include "webrtc/modules/audio_coding/neteq/tools/packet_source.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace webrtc {
-
-class RtpHeaderParser;
-
-namespace test {
-
-class RtpFileReader;
-
-class RtpFileSource : public PacketSource {
- public:
-  // Creates an RtpFileSource reading from |file_name|. If the file cannot be
-  // opened, or has the wrong format, NULL will be returned.
-  static RtpFileSource* Create(const std::string& file_name);
-
-  // Checks whether a files is a valid RTP dump or PCAP (Wireshark) file.
-  static bool ValidRtpDump(const std::string& file_name);
-  static bool ValidPcap(const std::string& file_name);
-
-  virtual ~RtpFileSource();
-
-  // Registers an RTP header extension and binds it to |id|.
-  virtual bool RegisterRtpHeaderExtension(RTPExtensionType type, uint8_t id);
-
-  std::unique_ptr<Packet> NextPacket() override;
-
- private:
-  static const int kFirstLineLength = 40;
-  static const int kRtpFileHeaderSize = 4 + 4 + 4 + 2 + 2;
-  static const size_t kPacketHeaderSize = 8;
-
-  RtpFileSource();
-
-  bool OpenFile(const std::string& file_name);
-
-  std::unique_ptr<RtpFileReader> rtp_reader_;
-  std::unique_ptr<RtpHeaderParser> parser_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(RtpFileSource);
-};
-
-}  // namespace test
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_AUDIO_CODING_NETEQ_TOOLS_RTP_FILE_SOURCE_H_
diff --git a/modules/audio_coding/neteq/tools/rtp_generator.cc b/modules/audio_coding/neteq/tools/rtp_generator.cc
deleted file mode 100644
index a6e883d..0000000
--- a/modules/audio_coding/neteq/tools/rtp_generator.cc
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- *  Copyright (c) 2013 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 <assert.h>
-
-#include "webrtc/modules/audio_coding/neteq/tools/rtp_generator.h"
-
-namespace webrtc {
-namespace test {
-
-uint32_t RtpGenerator::GetRtpHeader(uint8_t payload_type,
-                                    size_t payload_length_samples,
-                                    RTPHeader* rtp_header) {
-  assert(rtp_header);
-  if (!rtp_header) {
-    return 0;
-  }
-  rtp_header->sequenceNumber = seq_number_++;
-  rtp_header->timestamp = timestamp_;
-  timestamp_ += static_cast<uint32_t>(payload_length_samples);
-  rtp_header->payloadType = payload_type;
-  rtp_header->markerBit = false;
-  rtp_header->ssrc = ssrc_;
-  rtp_header->numCSRCs = 0;
-
-  uint32_t this_send_time = next_send_time_ms_;
-  assert(samples_per_ms_ > 0);
-  next_send_time_ms_ += ((1.0 + drift_factor_) * payload_length_samples) /
-      samples_per_ms_;
-  return this_send_time;
-}
-
-void RtpGenerator::set_drift_factor(double factor) {
-  if (factor > -1.0) {
-    drift_factor_ = factor;
-  }
-}
-
-uint32_t TimestampJumpRtpGenerator::GetRtpHeader(uint8_t payload_type,
-                                                 size_t payload_length_samples,
-                                                 RTPHeader* rtp_header) {
-  uint32_t ret = RtpGenerator::GetRtpHeader(
-      payload_type, payload_length_samples, rtp_header);
-  if (timestamp_ - static_cast<uint32_t>(payload_length_samples) <=
-          jump_from_timestamp_ &&
-      timestamp_ > jump_from_timestamp_) {
-    // We just moved across the |jump_from_timestamp_| timestamp. Do the jump.
-    timestamp_ = jump_to_timestamp_;
-  }
-  return ret;
-}
-
-}  // namespace test
-}  // namespace webrtc
diff --git a/modules/audio_coding/neteq/tools/rtp_generator.h b/modules/audio_coding/neteq/tools/rtp_generator.h
deleted file mode 100644
index 154a38c..0000000
--- a/modules/audio_coding/neteq/tools/rtp_generator.h
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- *  Copyright (c) 2012 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_NETEQ_TOOLS_RTP_GENERATOR_H_
-#define WEBRTC_MODULES_AUDIO_CODING_NETEQ_TOOLS_RTP_GENERATOR_H_
-
-#include "webrtc/common_types.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-namespace test {
-
-// Class for generating RTP headers.
-class RtpGenerator {
- public:
-  RtpGenerator(int samples_per_ms,
-               uint16_t start_seq_number = 0,
-               uint32_t start_timestamp = 0,
-               uint32_t start_send_time_ms = 0,
-               uint32_t ssrc = 0x12345678)
-      : seq_number_(start_seq_number),
-        timestamp_(start_timestamp),
-        next_send_time_ms_(start_send_time_ms),
-        ssrc_(ssrc),
-        samples_per_ms_(samples_per_ms),
-        drift_factor_(0.0) {
-  }
-
-  virtual ~RtpGenerator() {}
-
-  // Writes the next RTP header to |rtp_header|, which will be of type
-  // |payload_type|. Returns the send time for this packet (in ms). The value of
-  // |payload_length_samples| determines the send time for the next packet.
-  virtual uint32_t GetRtpHeader(uint8_t payload_type,
-                                size_t payload_length_samples,
-                                RTPHeader* rtp_header);
-
-  void set_drift_factor(double factor);
-
- protected:
-  uint16_t seq_number_;
-  uint32_t timestamp_;
-  uint32_t next_send_time_ms_;
-  const uint32_t ssrc_;
-  const int samples_per_ms_;
-  double drift_factor_;
-
- private:
-  RTC_DISALLOW_COPY_AND_ASSIGN(RtpGenerator);
-};
-
-class TimestampJumpRtpGenerator : public RtpGenerator {
- public:
-  TimestampJumpRtpGenerator(int samples_per_ms,
-                            uint16_t start_seq_number,
-                            uint32_t start_timestamp,
-                            uint32_t jump_from_timestamp,
-                            uint32_t jump_to_timestamp)
-      : RtpGenerator(samples_per_ms, start_seq_number, start_timestamp),
-        jump_from_timestamp_(jump_from_timestamp),
-        jump_to_timestamp_(jump_to_timestamp) {}
-
-  uint32_t GetRtpHeader(uint8_t payload_type,
-                        size_t payload_length_samples,
-                        RTPHeader* rtp_header) override;
-
- private:
-  uint32_t jump_from_timestamp_;
-  uint32_t jump_to_timestamp_;
-  RTC_DISALLOW_COPY_AND_ASSIGN(TimestampJumpRtpGenerator);
-};
-
-}  // namespace test
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_AUDIO_CODING_NETEQ_TOOLS_RTP_GENERATOR_H_
diff --git a/modules/audio_coding/neteq/tools/rtpcat.cc b/modules/audio_coding/neteq/tools/rtpcat.cc
deleted file mode 100644
index d903ca2..0000000
--- a/modules/audio_coding/neteq/tools/rtpcat.cc
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- *  Copyright (c) 2011 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 <stdio.h>
-
-#include <memory>
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/test/rtp_file_reader.h"
-#include "webrtc/test/rtp_file_writer.h"
-
-using webrtc::test::RtpFileReader;
-using webrtc::test::RtpFileWriter;
-
-int main(int argc, char* argv[]) {
-  if (argc < 3) {
-    printf("Concatenates multiple rtpdump files into one.\n");
-    printf("Usage: rtpcat in1.rtp int2.rtp [...] out.rtp\n");
-    exit(1);
-  }
-
-  std::unique_ptr<RtpFileWriter> output(
-      RtpFileWriter::Create(RtpFileWriter::kRtpDump, argv[argc - 1]));
-  RTC_CHECK(output.get() != NULL) << "Cannot open output file.";
-  printf("Output RTP file: %s\n", argv[argc - 1]);
-
-  for (int i = 1; i < argc - 1; i++) {
-    std::unique_ptr<RtpFileReader> input(
-        RtpFileReader::Create(RtpFileReader::kRtpDump, argv[i]));
-    RTC_CHECK(input.get() != NULL) << "Cannot open input file " << argv[i];
-    printf("Input RTP file: %s\n", argv[i]);
-
-    webrtc::test::RtpPacket packet;
-    while (input->NextPacket(&packet))
-      RTC_CHECK(output->WritePacket(&packet));
-  }
-  return 0;
-}
diff --git a/modules/audio_coding/test/ACMTest.h b/modules/audio_coding/test/ACMTest.h
deleted file mode 100644
index d7e87d3..0000000
--- a/modules/audio_coding/test/ACMTest.h
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- *  Copyright (c) 2011 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_TEST_ACMTEST_H_
-#define WEBRTC_MODULES_AUDIO_CODING_TEST_ACMTEST_H_
-
-class ACMTest {
- public:
-  ACMTest() {}
-  virtual ~ACMTest() {}
-  virtual void Perform() = 0;
-};
-
-#endif  // WEBRTC_MODULES_AUDIO_CODING_TEST_ACMTEST_H_
diff --git a/modules/audio_coding/test/APITest.cc b/modules/audio_coding/test/APITest.cc
deleted file mode 100644
index 7e67e3f..0000000
--- a/modules/audio_coding/test/APITest.cc
+++ /dev/null
@@ -1,1114 +0,0 @@
-/*
- *  Copyright (c) 2012 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/test/APITest.h"
-
-#include <ctype.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include <iostream>
-#include <ostream>
-#include <string>
-
-#include "webrtc/common_types.h"
-#include "webrtc/modules/audio_coding/codecs/audio_format_conversion.h"
-#include "webrtc/modules/audio_coding/test/utility.h"
-#include "webrtc/rtc_base/platform_thread.h"
-#include "webrtc/rtc_base/timeutils.h"
-#include "webrtc/system_wrappers/include/event_wrapper.h"
-#include "webrtc/system_wrappers/include/trace.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/testsupport/fileutils.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-#define TEST_DURATION_SEC 600
-#define NUMBER_OF_SENDER_TESTS 6
-#define MAX_FILE_NAME_LENGTH_BYTE 500
-
-void APITest::Wait(uint32_t waitLengthMs) {
-  if (_randomTest) {
-    return;
-  } else {
-    EventWrapper* myEvent = EventWrapper::Create();
-    myEvent->Wait(waitLengthMs);
-    delete myEvent;
-    return;
-  }
-}
-
-APITest::APITest()
-    : _acmA(AudioCodingModule::Create(1)),
-      _acmB(AudioCodingModule::Create(2)),
-      _channel_A2B(NULL),
-      _channel_B2A(NULL),
-      _writeToFile(true),
-      _pullEventA(NULL),
-      _pushEventA(NULL),
-      _processEventA(NULL),
-      _apiEventA(NULL),
-      _pullEventB(NULL),
-      _pushEventB(NULL),
-      _processEventB(NULL),
-      _apiEventB(NULL),
-      _codecCntrA(0),
-      _codecCntrB(0),
-      _thereIsEncoderA(false),
-      _thereIsEncoderB(false),
-      _thereIsDecoderA(false),
-      _thereIsDecoderB(false),
-      _sendVADA(false),
-      _sendDTXA(false),
-      _sendVADModeA(VADNormal),
-      _sendVADB(false),
-      _sendDTXB(false),
-      _sendVADModeB(VADNormal),
-      _minDelayA(0),
-      _minDelayB(0),
-      _dotPositionA(0),
-      _dotMoveDirectionA(1),
-      _dotPositionB(39),
-      _dotMoveDirectionB(-1),
-      _vadCallbackA(NULL),
-      _vadCallbackB(NULL),
-      _apiTestRWLock(*RWLockWrapper::CreateRWLock()),
-      _randomTest(false),
-      _testNumA(0),
-      _testNumB(1) {
-  int n;
-  for (n = 0; n < 32; n++) {
-    _payloadUsed[n] = false;
-  }
-
-  _movingDot[40] = '\0';
-
-  for (int n = 0; n < 40; n++) {
-    _movingDot[n] = ' ';
-  }
-}
-
-APITest::~APITest() {
-  DELETE_POINTER(_channel_A2B);
-  DELETE_POINTER(_channel_B2A);
-
-  DELETE_POINTER(_pushEventA);
-  DELETE_POINTER(_pullEventA);
-  DELETE_POINTER(_processEventA);
-  DELETE_POINTER(_apiEventA);
-
-  DELETE_POINTER(_pushEventB);
-  DELETE_POINTER(_pullEventB);
-  DELETE_POINTER(_processEventB);
-  DELETE_POINTER(_apiEventB);
-
-  _inFileA.Close();
-  _outFileA.Close();
-
-  _inFileB.Close();
-  _outFileB.Close();
-
-  DELETE_POINTER(_vadCallbackA);
-  DELETE_POINTER(_vadCallbackB);
-
-  delete &_apiTestRWLock;
-}
-
-int16_t APITest::SetUp() {
-  CodecInst dummyCodec;
-  int lastPayloadType = 0;
-
-  int16_t numCodecs = _acmA->NumberOfCodecs();
-  for (uint8_t n = 0; n < numCodecs; n++) {
-    AudioCodingModule::Codec(n, &dummyCodec);
-    if ((STR_CASE_CMP(dummyCodec.plname, "CN") == 0)
-        && (dummyCodec.plfreq == 32000)) {
-      continue;
-    }
-
-    printf("Register Receive Codec %s  ", dummyCodec.plname);
-
-    if ((n != 0) && !FixedPayloadTypeCodec(dummyCodec.plname)) {
-      // Check registration with an already occupied payload type
-      int currentPayloadType = dummyCodec.pltype;
-      dummyCodec.pltype = 97;  //lastPayloadType;
-      EXPECT_EQ(true, _acmB->RegisterReceiveCodec(dummyCodec.pltype,
-                                                  CodecInstToSdp(dummyCodec)));
-      dummyCodec.pltype = currentPayloadType;
-    }
-
-    if ((n < numCodecs - 1) && !FixedPayloadTypeCodec(dummyCodec.plname)) {
-      // test if re-registration works;
-      CodecInst nextCodec;
-      int currentPayloadType = dummyCodec.pltype;
-      AudioCodingModule::Codec(n + 1, &nextCodec);
-      dummyCodec.pltype = nextCodec.pltype;
-      if (!FixedPayloadTypeCodec(nextCodec.plname)) {
-        _acmB->RegisterReceiveCodec(dummyCodec.pltype,
-                                    CodecInstToSdp(dummyCodec));
-      }
-      dummyCodec.pltype = currentPayloadType;
-    }
-
-    if ((n < numCodecs - 1) && !FixedPayloadTypeCodec(dummyCodec.plname)) {
-      // test if un-registration works;
-      CodecInst nextCodec;
-      AudioCodingModule::Codec(n + 1, &nextCodec);
-      nextCodec.pltype = dummyCodec.pltype;
-      if (!FixedPayloadTypeCodec(nextCodec.plname)) {
-        EXPECT_EQ(true, _acmA->RegisterReceiveCodec(nextCodec.pltype,
-                                                    CodecInstToSdp(nextCodec)));
-        CHECK_ERROR_MT(_acmA->UnregisterReceiveCodec(nextCodec.pltype));
-      }
-    }
-
-    EXPECT_EQ(true, _acmA->RegisterReceiveCodec(dummyCodec.pltype,
-                                                CodecInstToSdp(dummyCodec)));
-    printf("   side A done!");
-    EXPECT_EQ(true, _acmB->RegisterReceiveCodec(dummyCodec.pltype,
-                                                CodecInstToSdp(dummyCodec)));
-    printf("   side B done!\n");
-
-    if (!strcmp(dummyCodec.plname, "CN")) {
-      CHECK_ERROR_MT(_acmA->RegisterSendCodec(dummyCodec));
-      CHECK_ERROR_MT(_acmB->RegisterSendCodec(dummyCodec));
-    }
-    lastPayloadType = dummyCodec.pltype;
-    if ((lastPayloadType >= 96) && (lastPayloadType <= 127)) {
-      _payloadUsed[lastPayloadType - 96] = true;
-    }
-  }
-  _thereIsDecoderA = true;
-  _thereIsDecoderB = true;
-
-  // Register Send Codec
-  AudioCodingModule::Codec((uint8_t) _codecCntrA, &dummyCodec);
-  CHECK_ERROR_MT(_acmA->RegisterSendCodec(dummyCodec));
-  _thereIsEncoderA = true;
-  //
-  AudioCodingModule::Codec((uint8_t) _codecCntrB, &dummyCodec);
-  CHECK_ERROR_MT(_acmB->RegisterSendCodec(dummyCodec));
-  _thereIsEncoderB = true;
-
-  uint16_t frequencyHz;
-
-  printf("\n\nAPI Test\n");
-  printf("========\n");
-  printf("Hit enter to accept the default values indicated in []\n\n");
-
-  //--- Input A
-  std::string file_name = webrtc::test::ResourcePath(
-      "audio_coding/testfile32kHz", "pcm");
-  frequencyHz = 32000;
-  printf("Enter input file at side A [%s]: ", file_name.c_str());
-  PCMFile::ChooseFile(&file_name, 499, &frequencyHz);
-  _inFileA.Open(file_name, frequencyHz, "rb", true);
-
-  //--- Output A
-  std::string out_file_a = webrtc::test::OutputPath() + "outA.pcm";
-  printf("Enter output file at side A [%s]: ", out_file_a.c_str());
-  PCMFile::ChooseFile(&out_file_a, 499, &frequencyHz);
-  _outFileA.Open(out_file_a, frequencyHz, "wb");
-
-  //--- Input B
-  file_name = webrtc::test::ResourcePath("audio_coding/testfile32kHz", "pcm");
-  printf("\n\nEnter input file at side B [%s]: ", file_name.c_str());
-  PCMFile::ChooseFile(&file_name, 499, &frequencyHz);
-  _inFileB.Open(file_name, frequencyHz, "rb", true);
-
-  //--- Output B
-  std::string out_file_b = webrtc::test::OutputPath() + "outB.pcm";
-  printf("Enter output file at side B [%s]: ", out_file_b.c_str());
-  PCMFile::ChooseFile(&out_file_b, 499, &frequencyHz);
-  _outFileB.Open(out_file_b, frequencyHz, "wb");
-
-  //--- Set A-to-B channel
-  _channel_A2B = new Channel(2);
-  CHECK_ERROR_MT(_acmA->RegisterTransportCallback(_channel_A2B));
-  _channel_A2B->RegisterReceiverACM(_acmB.get());
-
-  //--- Set B-to-A channel
-  _channel_B2A = new Channel(1);
-  CHECK_ERROR_MT(_acmB->RegisterTransportCallback(_channel_B2A));
-  _channel_B2A->RegisterReceiverACM(_acmA.get());
-
-  //--- EVENT TIMERS
-  // A
-  _pullEventA = EventTimerWrapper::Create();
-  _pushEventA = EventTimerWrapper::Create();
-  _processEventA = EventTimerWrapper::Create();
-  _apiEventA = EventWrapper::Create();
-  // B
-  _pullEventB = EventTimerWrapper::Create();
-  _pushEventB = EventTimerWrapper::Create();
-  _processEventB = EventTimerWrapper::Create();
-  _apiEventB = EventWrapper::Create();
-
-  //--- I/O params
-  // A
-  _outFreqHzA = _outFileA.SamplingFrequency();
-  // B
-  _outFreqHzB = _outFileB.SamplingFrequency();
-
-  //Trace::SetEncryptedTraceFile("ACMAPITestEncrypted.txt");
-
-  char print[11];
-
-  // Create a trace file.
-  Trace::CreateTrace();
-  Trace::SetTraceFile(
-      (webrtc::test::OutputPath() + "acm_api_trace.txt").c_str());
-
-  printf("\nRandom Test (y/n)?");
-  EXPECT_TRUE(fgets(print, 10, stdin) != NULL);
-  print[10] = '\0';
-  if (strstr(print, "y") != NULL) {
-    _randomTest = true;
-    _verbose = false;
-    _writeToFile = false;
-  } else {
-    _randomTest = false;
-    printf("\nPrint Tests (y/n)? ");
-    EXPECT_TRUE(fgets(print, 10, stdin) != NULL);
-    print[10] = '\0';
-    if (strstr(print, "y") == NULL) {
-      EXPECT_TRUE(freopen("APITest_log.txt", "w", stdout) != 0);
-      _verbose = false;
-    }
-  }
-
-  _vadCallbackA = new VADCallback;
-  _vadCallbackB = new VADCallback;
-
-  return 0;
-}
-
-bool APITest::PushAudioThreadA(void* obj) {
-  return static_cast<APITest*>(obj)->PushAudioRunA();
-}
-
-bool APITest::PushAudioThreadB(void* obj) {
-  return static_cast<APITest*>(obj)->PushAudioRunB();
-}
-
-bool APITest::PullAudioThreadA(void* obj) {
-  return static_cast<APITest*>(obj)->PullAudioRunA();
-}
-
-bool APITest::PullAudioThreadB(void* obj) {
-  return static_cast<APITest*>(obj)->PullAudioRunB();
-}
-
-bool APITest::ProcessThreadA(void* obj) {
-  return static_cast<APITest*>(obj)->ProcessRunA();
-}
-
-bool APITest::ProcessThreadB(void* obj) {
-  return static_cast<APITest*>(obj)->ProcessRunB();
-}
-
-bool APITest::APIThreadA(void* obj) {
-  return static_cast<APITest*>(obj)->APIRunA();
-}
-
-bool APITest::APIThreadB(void* obj) {
-  return static_cast<APITest*>(obj)->APIRunB();
-}
-
-bool APITest::PullAudioRunA() {
-  _pullEventA->Wait(100);
-  AudioFrame audioFrame;
-  bool muted;
-  if (_acmA->PlayoutData10Ms(_outFreqHzA, &audioFrame, &muted) < 0) {
-    bool thereIsDecoder;
-    {
-      ReadLockScoped rl(_apiTestRWLock);
-      thereIsDecoder = _thereIsDecoderA;
-    }
-    if (thereIsDecoder) {
-      fprintf(stderr, "\n>>>>>>    cannot pull audio A       <<<<<<<< \n");
-    }
-  } else {
-    if (_writeToFile) {
-      _outFileA.Write10MsData(audioFrame);
-    }
-  }
-  return true;
-}
-
-bool APITest::PullAudioRunB() {
-  _pullEventB->Wait(100);
-  AudioFrame audioFrame;
-  bool muted;
-  if (_acmB->PlayoutData10Ms(_outFreqHzB, &audioFrame, &muted) < 0) {
-    bool thereIsDecoder;
-    {
-      ReadLockScoped rl(_apiTestRWLock);
-      thereIsDecoder = _thereIsDecoderB;
-    }
-    if (thereIsDecoder) {
-      fprintf(stderr, "\n>>>>>>    cannot pull audio B       <<<<<<<< \n");
-      fprintf(stderr, "%d %d\n", _testNumA, _testNumB);
-    }
-  } else {
-    if (_writeToFile) {
-      _outFileB.Write10MsData(audioFrame);
-    }
-  }
-  return true;
-}
-
-bool APITest::PushAudioRunA() {
-  _pushEventA->Wait(100);
-  AudioFrame audioFrame;
-  _inFileA.Read10MsData(audioFrame);
-  if (_acmA->Add10MsData(audioFrame) < 0) {
-    bool thereIsEncoder;
-    {
-      ReadLockScoped rl(_apiTestRWLock);
-      thereIsEncoder = _thereIsEncoderA;
-    }
-    if (thereIsEncoder) {
-      fprintf(stderr, "\n>>>>        add10MsData at A failed       <<<<\n");
-    }
-  }
-  return true;
-}
-
-bool APITest::PushAudioRunB() {
-  _pushEventB->Wait(100);
-  AudioFrame audioFrame;
-  _inFileB.Read10MsData(audioFrame);
-  if (_acmB->Add10MsData(audioFrame) < 0) {
-    bool thereIsEncoder;
-    {
-      ReadLockScoped rl(_apiTestRWLock);
-      thereIsEncoder = _thereIsEncoderB;
-    }
-
-    if (thereIsEncoder) {
-      fprintf(stderr, "\n>>>>   cannot add audio to B    <<<<");
-    }
-  }
-
-  return true;
-}
-
-bool APITest::ProcessRunA() {
-  _processEventA->Wait(100);
-  return true;
-}
-
-bool APITest::ProcessRunB() {
-  _processEventB->Wait(100);
-  return true;
-}
-
-/*/
- *
- * In side A we test the APIs which are related to sender Side.
- *
-/*/
-
-void APITest::RunTest(char thread) {
-  int testNum;
-  {
-    WriteLockScoped cs(_apiTestRWLock);
-    if (thread == 'A') {
-      _testNumA = (_testNumB + 1 + (rand() % 3)) % 4;
-      testNum = _testNumA;
-
-      _movingDot[_dotPositionA] = ' ';
-      if (_dotPositionA == 0) {
-        _dotMoveDirectionA = 1;
-      }
-      if (_dotPositionA == 19) {
-        _dotMoveDirectionA = -1;
-      }
-      _dotPositionA += _dotMoveDirectionA;
-      _movingDot[_dotPositionA] = (_dotMoveDirectionA > 0) ? '>' : '<';
-    } else {
-      _testNumB = (_testNumA + 1 + (rand() % 3)) % 4;
-      testNum = _testNumB;
-
-      _movingDot[_dotPositionB] = ' ';
-      if (_dotPositionB == 20) {
-        _dotMoveDirectionB = 1;
-      }
-      if (_dotPositionB == 39) {
-        _dotMoveDirectionB = -1;
-      }
-      _dotPositionB += _dotMoveDirectionB;
-      _movingDot[_dotPositionB] = (_dotMoveDirectionB > 0) ? '>' : '<';
-    }
-    //fprintf(stderr, "%c: %d \n", thread, testNum);
-    //fflush(stderr);
-  }
-  switch (testNum) {
-    case 0:
-      CurrentCodec('A');
-      ChangeCodec('A');
-      break;
-    case 1:
-      if (!_randomTest) {
-        fprintf(stdout, "\nTesting Delay ...\n");
-      }
-      TestDelay('A');
-      break;
-    case 2:
-      TestSendVAD('A');
-      break;
-    case 3:
-      TestRegisteration('A');
-      break;
-    default:
-      fprintf(stderr, "Wrong Test Number\n");
-      getc(stdin);
-      exit(1);
-  }
-}
-
-bool APITest::APIRunA() {
-  _apiEventA->Wait(50);
-
-  bool randomTest;
-  {
-    ReadLockScoped rl(_apiTestRWLock);
-    randomTest = _randomTest;
-  }
-  if (randomTest) {
-    RunTest('A');
-  } else {
-    CurrentCodec('A');
-    ChangeCodec('A');
-    if (_codecCntrA == 0) {
-      fprintf(stdout, "\nTesting Delay ...\n");
-      TestDelay('A');
-    }
-    // VAD TEST
-    TestSendVAD('A');
-    TestRegisteration('A');
-  }
-  return true;
-}
-
-bool APITest::APIRunB() {
-  _apiEventB->Wait(50);
-  bool randomTest;
-  {
-    ReadLockScoped rl(_apiTestRWLock);
-    randomTest = _randomTest;
-  }
-  //_apiEventB->Wait(2000);
-  if (randomTest) {
-    RunTest('B');
-  }
-
-  return true;
-}
-
-void APITest::Perform() {
-  SetUp();
-
-  //--- THREADS
-  // A
-  // PUSH
-  rtc::PlatformThread myPushAudioThreadA(PushAudioThreadA, this,
-                                         "PushAudioThreadA");
-  myPushAudioThreadA.Start();
-  // PULL
-  rtc::PlatformThread myPullAudioThreadA(PullAudioThreadA, this,
-                                         "PullAudioThreadA");
-  myPullAudioThreadA.Start();
-  // Process
-  rtc::PlatformThread myProcessThreadA(ProcessThreadA, this, "ProcessThreadA");
-  myProcessThreadA.Start();
-  // API
-  rtc::PlatformThread myAPIThreadA(APIThreadA, this, "APIThreadA");
-  myAPIThreadA.Start();
-  // B
-  // PUSH
-  rtc::PlatformThread myPushAudioThreadB(PushAudioThreadB, this,
-                                         "PushAudioThreadB");
-  myPushAudioThreadB.Start();
-  // PULL
-  rtc::PlatformThread myPullAudioThreadB(PullAudioThreadB, this,
-                                         "PullAudioThreadB");
-  myPullAudioThreadB.Start();
-  // Process
-  rtc::PlatformThread myProcessThreadB(ProcessThreadB, this, "ProcessThreadB");
-  myProcessThreadB.Start();
-  // API
-  rtc::PlatformThread myAPIThreadB(APIThreadB, this, "APIThreadB");
-  myAPIThreadB.Start();
-
-  //_apiEventA->StartTimer(true, 5000);
-  //_apiEventB->StartTimer(true, 5000);
-
-  _processEventA->StartTimer(true, 10);
-  _processEventB->StartTimer(true, 10);
-
-  _pullEventA->StartTimer(true, 10);
-  _pullEventB->StartTimer(true, 10);
-
-  _pushEventA->StartTimer(true, 10);
-  _pushEventB->StartTimer(true, 10);
-
-  // Keep main thread waiting for sender/receiver
-  // threads to complete
-  EventWrapper* completeEvent = EventWrapper::Create();
-  uint64_t startTime = rtc::TimeMillis();
-  uint64_t currentTime;
-  // Run test in 2 minutes (120000 ms).
-  do {
-    {
-      //ReadLockScoped rl(_apiTestRWLock);
-      //fprintf(stderr, "\r%s", _movingDot);
-    }
-    //fflush(stderr);
-    completeEvent->Wait(50);
-    currentTime = rtc::TimeMillis();
-  } while ((currentTime - startTime) < 120000);
-
-  //completeEvent->Wait(0xFFFFFFFF);
-  //(unsigned long)((unsigned long)TEST_DURATION_SEC * (unsigned long)1000));
-  delete completeEvent;
-
-  myPushAudioThreadA.Stop();
-  myPullAudioThreadA.Stop();
-  myProcessThreadA.Stop();
-  myAPIThreadA.Stop();
-
-  myPushAudioThreadB.Stop();
-  myPullAudioThreadB.Stop();
-  myProcessThreadB.Stop();
-  myAPIThreadB.Stop();
-}
-
-void APITest::CheckVADStatus(char side) {
-
-  bool dtxEnabled;
-  bool vadEnabled;
-  ACMVADMode vadMode;
-
-  if (side == 'A') {
-    _acmA->VAD(&dtxEnabled, &vadEnabled, &vadMode);
-    _acmA->RegisterVADCallback(NULL);
-    _vadCallbackA->Reset();
-    _acmA->RegisterVADCallback(_vadCallbackA);
-
-    if (!_randomTest) {
-      if (_verbose) {
-        fprintf(stdout, "DTX %3s, VAD %3s, Mode %d", dtxEnabled ? "ON" : "OFF",
-                vadEnabled ? "ON" : "OFF", (int) vadMode);
-        Wait(5000);
-        fprintf(stdout, " => bit-rate %3.0f kbps\n", _channel_A2B->BitRate());
-      } else {
-        Wait(5000);
-        fprintf(stdout, "DTX %3s, VAD %3s, Mode %d => bit-rate %3.0f kbps\n",
-                dtxEnabled ? "ON" : "OFF", vadEnabled ? "ON" : "OFF",
-                (int) vadMode, _channel_A2B->BitRate());
-      }
-      _vadCallbackA->PrintFrameTypes();
-    }
-
-    if (dtxEnabled != _sendDTXA) {
-      fprintf(stderr, ">>>   Error Enabling DTX    <<<\n");
-    }
-    if ((vadEnabled != _sendVADA) && (!dtxEnabled)) {
-      fprintf(stderr, ">>>   Error Enabling VAD    <<<\n");
-    }
-    if ((vadMode != _sendVADModeA) && vadEnabled) {
-      fprintf(stderr, ">>>   Error setting VAD-mode    <<<\n");
-    }
-  } else {
-    _acmB->VAD(&dtxEnabled, &vadEnabled, &vadMode);
-
-    _acmB->RegisterVADCallback(NULL);
-    _vadCallbackB->Reset();
-    _acmB->RegisterVADCallback(_vadCallbackB);
-
-    if (!_randomTest) {
-      if (_verbose) {
-        fprintf(stdout, "DTX %3s, VAD %3s, Mode %d", dtxEnabled ? "ON" : "OFF",
-                vadEnabled ? "ON" : "OFF", (int) vadMode);
-        Wait(5000);
-        fprintf(stdout, " => bit-rate %3.0f kbps\n", _channel_B2A->BitRate());
-      } else {
-        Wait(5000);
-        fprintf(stdout, "DTX %3s, VAD %3s, Mode %d => bit-rate %3.0f kbps\n",
-                dtxEnabled ? "ON" : "OFF", vadEnabled ? "ON" : "OFF",
-                (int) vadMode, _channel_B2A->BitRate());
-      }
-      _vadCallbackB->PrintFrameTypes();
-    }
-
-    if (dtxEnabled != _sendDTXB) {
-      fprintf(stderr, ">>>   Error Enabling DTX    <<<\n");
-    }
-    if ((vadEnabled != _sendVADB) && (!dtxEnabled)) {
-      fprintf(stderr, ">>>   Error Enabling VAD    <<<\n");
-    }
-    if ((vadMode != _sendVADModeB) && vadEnabled) {
-      fprintf(stderr, ">>>   Error setting VAD-mode    <<<\n");
-    }
-  }
-}
-
-// Set Min delay, get delay, playout timestamp
-void APITest::TestDelay(char side) {
-  AudioCodingModule* myACM;
-  Channel* myChannel;
-  int32_t* myMinDelay;
-  EventTimerWrapper* myEvent = EventTimerWrapper::Create();
-
-  uint32_t inTimestamp = 0;
-  double estimDelay = 0;
-
-  double averageEstimDelay = 0;
-  double averageDelay = 0;
-
-  test::CircularBuffer estimDelayCB(100);
-  estimDelayCB.SetArithMean(true);
-
-  if (side == 'A') {
-    myACM = _acmA.get();
-    myChannel = _channel_B2A;
-    myMinDelay = &_minDelayA;
-  } else {
-    myACM = _acmB.get();
-    myChannel = _channel_A2B;
-    myMinDelay = &_minDelayB;
-  }
-
-  CHECK_ERROR_MT(myACM->SetMinimumPlayoutDelay(*myMinDelay));
-
-  inTimestamp = myChannel->LastInTimestamp();
-  rtc::Optional<uint32_t> outTimestamp = myACM->PlayoutTimestamp();
-  CHECK_ERROR_MT(outTimestamp ? 0 : -1);
-
-  if (!_randomTest) {
-    myEvent->StartTimer(true, 30);
-    int n = 0;
-    int settlePoint = 5000;
-    while (n < settlePoint + 400) {
-      myEvent->Wait(1000);
-
-      inTimestamp = myChannel->LastInTimestamp();
-      outTimestamp = myACM->PlayoutTimestamp();
-      CHECK_ERROR_MT(outTimestamp ? 0 : -1);
-
-      //std::cout << outTimestamp << std::endl << std::flush;
-      estimDelay = (double)((uint32_t)(inTimestamp - *outTimestamp)) /
-                   ((double)myACM->ReceiveFrequency() / 1000.0);
-
-      estimDelayCB.Update(estimDelay);
-
-      estimDelayCB.ArithMean(averageEstimDelay);
-      //printf("\n %6.1f \n", estimDelay);
-      //std::cout << " " << std::flush;
-
-      if (_verbose) {
-        fprintf(stdout,
-                "\rExpected: %4d,    retreived: %6.1f,   measured: %6.1f",
-                *myMinDelay, averageDelay, averageEstimDelay);
-        std::cout << " " << std::flush;
-      }
-      if ((averageDelay > *myMinDelay) && (n < settlePoint)) {
-        settlePoint = n;
-      }
-      n++;
-    }
-    myEvent->StopTimer();
-  }
-
-  if ((!_verbose) && (!_randomTest)) {
-    fprintf(stdout, "\nExpected: %4d,    retreived: %6.1f,   measured: %6.1f",
-            *myMinDelay, averageDelay, averageEstimDelay);
-  }
-
-  *myMinDelay = (rand() % 1000) + 1;
-
-  NetworkStatistics networkStat;
-  CHECK_ERROR_MT(myACM->GetNetworkStatistics(&networkStat));
-
-  if (!_randomTest) {
-    fprintf(stdout, "\n\nJitter Statistics at Side %c\n", side);
-    fprintf(stdout, "--------------------------------------\n");
-    fprintf(stdout, "buffer-size............. %d\n",
-            networkStat.currentBufferSize);
-    fprintf(stdout, "Preferred buffer-size... %d\n",
-            networkStat.preferredBufferSize);
-    fprintf(stdout, "Peaky jitter mode........%d\n",
-            networkStat.jitterPeaksFound);
-    fprintf(stdout, "packet-size rate........ %d\n",
-            networkStat.currentPacketLossRate);
-    fprintf(stdout, "expand rate............. %d\n",
-            networkStat.currentExpandRate);
-    fprintf(stdout, "speech expand rate...... %d\n",
-            networkStat.currentSpeechExpandRate);
-    fprintf(stdout, "Preemptive rate......... %d\n",
-            networkStat.currentPreemptiveRate);
-    fprintf(stdout, "Accelerate rate......... %d\n",
-            networkStat.currentAccelerateRate);
-    fprintf(stdout, "Secondary decoded rate.. %d\n",
-            networkStat.currentSecondaryDecodedRate);
-    fprintf(stdout, "Secondary discarded rate.%d\n",
-            networkStat.currentSecondaryDiscardedRate);
-    fprintf(stdout, "Clock-drift............. %d\n", networkStat.clockDriftPPM);
-    fprintf(stdout, "Mean waiting time....... %d\n",
-            networkStat.meanWaitingTimeMs);
-    fprintf(stdout, "Median waiting time..... %d\n",
-            networkStat.medianWaitingTimeMs);
-    fprintf(stdout, "Min waiting time........ %d\n",
-            networkStat.minWaitingTimeMs);
-    fprintf(stdout, "Max waiting time........ %d\n",
-            networkStat.maxWaitingTimeMs);
-  }
-
-  CHECK_ERROR_MT(myACM->SetMinimumPlayoutDelay(*myMinDelay));
-
-  if (!_randomTest) {
-    myEvent->Wait(500);
-    fprintf(stdout, "\n");
-    fprintf(stdout, "\n");
-  }
-  delete myEvent;
-}
-
-// Unregister a codec & register again.
-void APITest::TestRegisteration(char sendSide) {
-  AudioCodingModule* sendACM;
-  AudioCodingModule* receiveACM;
-  bool* thereIsDecoder;
-  EventWrapper* myEvent = EventWrapper::Create();
-
-  if (!_randomTest) {
-    fprintf(stdout, "\n\n");
-    fprintf(stdout,
-            "---------------------------------------------------------\n");
-    fprintf(stdout, "           Unregister/register Receive Codec\n");
-    fprintf(stdout,
-            "---------------------------------------------------------\n");
-  }
-
-  switch (sendSide) {
-    case 'A': {
-      sendACM = _acmA.get();
-      receiveACM = _acmB.get();
-      thereIsDecoder = &_thereIsDecoderB;
-      break;
-    }
-    case 'B': {
-      sendACM = _acmB.get();
-      receiveACM = _acmA.get();
-      thereIsDecoder = &_thereIsDecoderA;
-      break;
-    }
-    default:
-      fprintf(stderr, "Invalid sender-side in TestRegistration(%c)\n",
-              sendSide);
-      exit(-1);
-  }
-
-  auto myCodec = sendACM->SendCodec();
-  if (!myCodec) {
-    CodecInst ci;
-    AudioCodingModule::Codec(_codecCntrA, &ci);
-    myCodec = rtc::Optional<CodecInst>(ci);
-  }
-
-  if (!_randomTest) {
-    fprintf(stdout, "Unregistering reveive codec, NO AUDIO.\n");
-    fflush (stdout);
-  }
-  {
-    WriteLockScoped wl(_apiTestRWLock);
-    *thereIsDecoder = false;
-  }
-  //myEvent->Wait(20);
-  CHECK_ERROR_MT(receiveACM->UnregisterReceiveCodec(myCodec->pltype));
-  Wait(1000);
-
-  int currentPayload = myCodec->pltype;
-
-  if (!FixedPayloadTypeCodec(myCodec->plname)) {
-    int32_t i;
-    for (i = 0; i < 32; i++) {
-      if (!_payloadUsed[i]) {
-        if (!_randomTest) {
-          fprintf(stdout,
-                  "Register receive codec with new Payload, AUDIO BACK.\n");
-        }
-        //myCodec->pltype = i + 96;
-        //CHECK_ERROR_MT(receiveACM->RegisterReceiveCodec(*myCodec));
-        //CHECK_ERROR_MT(sendACM->RegisterSendCodec(*myCodec));
-        //myEvent->Wait(20);
-        //{
-        //    WriteLockScoped wl(_apiTestRWLock);
-        //    *thereIsDecoder = true;
-        //}
-        Wait(1000);
-
-        if (!_randomTest) {
-          fprintf(stdout, "Unregistering reveive codec, NO AUDIO.\n");
-        }
-        //{
-        //    WriteLockScoped wl(_apiTestRWLock);
-        //    *thereIsDecoder = false;
-        //}
-        //myEvent->Wait(20);
-        //CHECK_ERROR_MT(receiveACM->UnregisterReceiveCodec(myCodec->pltype));
-        Wait(1000);
-
-        myCodec->pltype = currentPayload;
-        if (!_randomTest) {
-          fprintf(stdout,
-                  "Register receive codec with default Payload, AUDIO BACK.\n");
-          fflush (stdout);
-        }
-        EXPECT_EQ(true, receiveACM->RegisterReceiveCodec(
-                            myCodec->pltype, CodecInstToSdp(*myCodec)));
-        //CHECK_ERROR_MT(sendACM->RegisterSendCodec(*myCodec));
-        myEvent->Wait(20);
-        {
-          WriteLockScoped wl(_apiTestRWLock);
-          *thereIsDecoder = true;
-        }
-        Wait(1000);
-
-        break;
-      }
-    }
-    if (i == 32) {
-      EXPECT_EQ(true, receiveACM->RegisterReceiveCodec(
-                          myCodec->pltype, CodecInstToSdp(*myCodec)));
-      {
-        WriteLockScoped wl(_apiTestRWLock);
-        *thereIsDecoder = true;
-      }
-    }
-  } else {
-    if (!_randomTest) {
-      fprintf(stdout,
-              "Register receive codec with fixed Payload, AUDIO BACK.\n");
-      fflush (stdout);
-    }
-    EXPECT_EQ(true, receiveACM->RegisterReceiveCodec(myCodec->pltype,
-                                                     CodecInstToSdp(*myCodec)));
-    //CHECK_ERROR_MT(receiveACM->UnregisterReceiveCodec(myCodec->pltype));
-    //CHECK_ERROR_MT(receiveACM->RegisterReceiveCodec(*myCodec));
-    myEvent->Wait(20);
-    {
-      WriteLockScoped wl(_apiTestRWLock);
-      *thereIsDecoder = true;
-    }
-  }
-  delete myEvent;
-  if (!_randomTest) {
-    fprintf(stdout,
-            "---------------------------------------------------------\n");
-  }
-}
-
-void APITest::TestSendVAD(char side) {
-  if (_randomTest) {
-    return;
-  }
-
-  bool* vad;
-  bool* dtx;
-  ACMVADMode* mode;
-  Channel* myChannel;
-  AudioCodingModule* myACM;
-
-  CodecInst myCodec;
-  if (!_randomTest) {
-    fprintf(stdout, "\n\n");
-    fprintf(stdout, "-----------------------------------------------\n");
-    fprintf(stdout, "                Test VAD API\n");
-    fprintf(stdout, "-----------------------------------------------\n");
-  }
-
-  if (side == 'A') {
-    AudioCodingModule::Codec(_codecCntrA, &myCodec);
-    vad = &_sendVADA;
-    dtx = &_sendDTXA;
-    mode = &_sendVADModeA;
-    myChannel = _channel_A2B;
-    myACM = _acmA.get();
-  } else {
-    AudioCodingModule::Codec(_codecCntrB, &myCodec);
-    vad = &_sendVADB;
-    dtx = &_sendDTXB;
-    mode = &_sendVADModeB;
-    myChannel = _channel_B2A;
-    myACM = _acmB.get();
-  }
-
-  CheckVADStatus(side);
-  if (!_randomTest) {
-    fprintf(stdout, "\n\n");
-  }
-
-  switch (*mode) {
-    case VADNormal:
-      *vad = true;
-      *dtx = true;
-      *mode = VADAggr;
-      break;
-    case VADLowBitrate:
-      *vad = true;
-      *dtx = true;
-      *mode = VADVeryAggr;
-      break;
-    case VADAggr:
-      *vad = true;
-      *dtx = true;
-      *mode = VADLowBitrate;
-      break;
-    case VADVeryAggr:
-      *vad = false;
-      *dtx = false;
-      *mode = VADNormal;
-      break;
-    default:
-      *mode = VADNormal;
-  }
-
-  *dtx = (myCodec.plfreq == 32000) ? false : *dtx;
-
-  CHECK_ERROR_MT(myACM->SetVAD(*dtx, *vad, *mode));
-  myChannel->ResetStats();
-
-  CheckVADStatus(side);
-  if (!_randomTest) {
-    fprintf(stdout, "\n");
-    fprintf(stdout, "-----------------------------------------------\n");
-  }
-
-  // Fault Test
-  CHECK_PROTECTED_MT(myACM->SetVAD(false, true, (ACMVADMode) - 1));
-  CHECK_PROTECTED_MT(myACM->SetVAD(false, true, (ACMVADMode) 4));
-
-}
-
-void APITest::CurrentCodec(char side) {
-  auto myCodec = (side == 'A' ? _acmA : _acmB)->SendCodec();
-
-  if (!_randomTest) {
-    fprintf(stdout, "\n\n");
-    fprintf(stdout, "Send codec in Side A\n");
-    fprintf(stdout, "----------------------------\n");
-    fprintf(stdout, "Name................. %s\n", myCodec->plname);
-    fprintf(stdout, "Sampling Frequency... %d\n", myCodec->plfreq);
-    fprintf(stdout, "Rate................. %d\n", myCodec->rate);
-    fprintf(stdout, "Payload-type......... %d\n", myCodec->pltype);
-    fprintf(stdout, "Packet-size.......... %d\n", myCodec->pacsize);
-  }
-
-  Wait(100);
-}
-
-void APITest::ChangeCodec(char side) {
-  CodecInst myCodec;
-  AudioCodingModule* myACM;
-  uint8_t* codecCntr;
-  bool* thereIsEncoder;
-  bool* vad;
-  bool* dtx;
-  ACMVADMode* mode;
-  Channel* myChannel;
-  // Reset and Wait
-  if (!_randomTest) {
-    fprintf(stdout, "Reset Encoder Side A \n");
-  }
-  if (side == 'A') {
-    myACM = _acmA.get();
-    codecCntr = &_codecCntrA;
-    {
-      WriteLockScoped wl(_apiTestRWLock);
-      thereIsEncoder = &_thereIsEncoderA;
-    }
-    vad = &_sendVADA;
-    dtx = &_sendDTXA;
-    mode = &_sendVADModeA;
-    myChannel = _channel_A2B;
-  } else {
-    myACM = _acmB.get();
-    codecCntr = &_codecCntrB;
-    {
-      WriteLockScoped wl(_apiTestRWLock);
-      thereIsEncoder = &_thereIsEncoderB;
-    }
-    vad = &_sendVADB;
-    dtx = &_sendDTXB;
-    mode = &_sendVADModeB;
-    myChannel = _channel_B2A;
-  }
-
-  Wait(100);
-
-  // Register the next codec
-  do {
-    *codecCntr =
-        (*codecCntr < AudioCodingModule::NumberOfCodecs() - 1) ?
-            (*codecCntr + 1) : 0;
-
-    if (*codecCntr == 0) {
-      //printf("Initialize Sender Side A \n");
-      {
-        WriteLockScoped wl(_apiTestRWLock);
-        *thereIsEncoder = false;
-      }
-      // After Initialization CN is lost, re-register them
-      if (AudioCodingModule::Codec("CN", &myCodec, 8000, 1) >= 0) {
-        CHECK_ERROR_MT(myACM->RegisterSendCodec(myCodec));
-      }
-      if (AudioCodingModule::Codec("CN", &myCodec, 16000, 1) >= 0) {
-        CHECK_ERROR_MT(myACM->RegisterSendCodec(myCodec));
-      }
-      // VAD & DTX are disabled after initialization
-      *vad = false;
-      *dtx = false;
-      _writeToFile = false;
-    }
-
-    AudioCodingModule::Codec(*codecCntr, &myCodec);
-  } while (!STR_CASE_CMP(myCodec.plname, "CN")
-      || !STR_CASE_CMP(myCodec.plname, "telephone-event")
-      || !STR_CASE_CMP(myCodec.plname, "RED"));
-
-  if (!_randomTest) {
-    fprintf(stdout,"\n=====================================================\n");
-    fprintf(stdout, "      Registering New Codec %s, %d kHz, %d kbps\n",
-            myCodec.plname, myCodec.plfreq / 1000, myCodec.rate / 1000);
-  }
-  //std::cout<< std::flush;
-
-  // NO DTX for supe-wideband codec at this point
-  if (myCodec.plfreq == 32000) {
-    *dtx = false;
-    CHECK_ERROR_MT(myACM->SetVAD(*dtx, *vad, *mode));
-
-  }
-
-  CHECK_ERROR_MT(myACM->RegisterSendCodec(myCodec));
-  myChannel->ResetStats();
-  {
-    WriteLockScoped wl(_apiTestRWLock);
-    *thereIsEncoder = true;
-  }
-  Wait(500);
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/test/APITest.h b/modules/audio_coding/test/APITest.h
deleted file mode 100644
index 99a7201..0000000
--- a/modules/audio_coding/test/APITest.h
+++ /dev/null
@@ -1,162 +0,0 @@
-/*
- *  Copyright (c) 2012 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_TEST_APITEST_H_
-#define WEBRTC_MODULES_AUDIO_CODING_TEST_APITEST_H_
-
-#include <memory>
-
-#include "webrtc/modules/audio_coding/include/audio_coding_module.h"
-#include "webrtc/modules/audio_coding/test/ACMTest.h"
-#include "webrtc/modules/audio_coding/test/Channel.h"
-#include "webrtc/modules/audio_coding/test/PCMFile.h"
-#include "webrtc/modules/audio_coding/test/utility.h"
-#include "webrtc/system_wrappers/include/event_wrapper.h"
-#include "webrtc/system_wrappers/include/rw_lock_wrapper.h"
-
-namespace webrtc {
-
-enum APITESTAction {
-  TEST_CHANGE_CODEC_ONLY = 0,
-  DTX_TEST = 1
-};
-
-class APITest : public ACMTest {
- public:
-  APITest();
-  ~APITest();
-
-  void Perform();
- private:
-  int16_t SetUp();
-
-  static bool PushAudioThreadA(void* obj);
-  static bool PullAudioThreadA(void* obj);
-  static bool ProcessThreadA(void* obj);
-  static bool APIThreadA(void* obj);
-
-  static bool PushAudioThreadB(void* obj);
-  static bool PullAudioThreadB(void* obj);
-  static bool ProcessThreadB(void* obj);
-  static bool APIThreadB(void* obj);
-
-  void CheckVADStatus(char side);
-
-  // Set Min delay, get delay, playout timestamp
-  void TestDelay(char side);
-
-  // Unregister a codec & register again.
-  void TestRegisteration(char side);
-
-  // Playout Mode, background noise mode.
-  // Receiver Frequency, playout frequency.
-  void TestPlayout(char receiveSide);
-
-  //
-  void TestSendVAD(char side);
-
-  void CurrentCodec(char side);
-
-  void ChangeCodec(char side);
-
-  void Wait(uint32_t waitLengthMs);
-
-  void RunTest(char thread);
-
-  bool PushAudioRunA();
-  bool PullAudioRunA();
-  bool ProcessRunA();
-  bool APIRunA();
-
-  bool PullAudioRunB();
-  bool PushAudioRunB();
-  bool ProcessRunB();
-  bool APIRunB();
-
-  //--- ACMs
-  std::unique_ptr<AudioCodingModule> _acmA;
-  std::unique_ptr<AudioCodingModule> _acmB;
-
-  //--- Channels
-  Channel* _channel_A2B;
-  Channel* _channel_B2A;
-
-  //--- I/O files
-  // A
-  PCMFile _inFileA;
-  PCMFile _outFileA;
-  // B
-  PCMFile _outFileB;
-  PCMFile _inFileB;
-
-  //--- I/O params
-  // A
-  int32_t _outFreqHzA;
-  // B
-  int32_t _outFreqHzB;
-
-  // Should we write to file.
-  // we might skip writing to file if we
-  // run the test for a long time.
-  bool _writeToFile;
-  //--- Events
-  // A
-  EventTimerWrapper* _pullEventA;      // pulling data from ACM
-  EventTimerWrapper* _pushEventA;      // pushing data to ACM
-  EventTimerWrapper* _processEventA;   // process
-  EventWrapper* _apiEventA;       // API calls
-  // B
-  EventTimerWrapper* _pullEventB;      // pulling data from ACM
-  EventTimerWrapper* _pushEventB;      // pushing data to ACM
-  EventTimerWrapper* _processEventB;   // process
-  EventWrapper* _apiEventB;       // API calls
-
-  // keep track of the codec in either side.
-  uint8_t _codecCntrA;
-  uint8_t _codecCntrB;
-
-  // Is set to true if there is no encoder in either side
-  bool _thereIsEncoderA;
-  bool _thereIsEncoderB;
-  bool _thereIsDecoderA;
-  bool _thereIsDecoderB;
-
-  bool _sendVADA;
-  bool _sendDTXA;
-  ACMVADMode _sendVADModeA;
-
-  bool _sendVADB;
-  bool _sendDTXB;
-  ACMVADMode _sendVADModeB;
-
-  int32_t _minDelayA;
-  int32_t _minDelayB;
-  bool _payloadUsed[32];
-
-  bool _verbose;
-
-  int _dotPositionA;
-  int _dotMoveDirectionA;
-  int _dotPositionB;
-  int _dotMoveDirectionB;
-
-  char _movingDot[41];
-
-  VADCallback* _vadCallbackA;
-  VADCallback* _vadCallbackB;
-  RWLockWrapper& _apiTestRWLock;
-  bool _randomTest;
-  int _testNumA;
-  int _testNumB;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_CODING_TEST_APITEST_H_
diff --git a/modules/audio_coding/test/Channel.cc b/modules/audio_coding/test/Channel.cc
deleted file mode 100644
index 4c65953..0000000
--- a/modules/audio_coding/test/Channel.cc
+++ /dev/null
@@ -1,421 +0,0 @@
-/*
- *  Copyright (c) 2012 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/test/Channel.h"
-
-#include <assert.h>
-#include <iostream>
-
-#include "webrtc/rtc_base/format_macros.h"
-#include "webrtc/rtc_base/timeutils.h"
-
-namespace webrtc {
-
-int32_t Channel::SendData(FrameType frameType,
-                          uint8_t payloadType,
-                          uint32_t timeStamp,
-                          const uint8_t* payloadData,
-                          size_t payloadSize,
-                          const RTPFragmentationHeader* fragmentation) {
-  WebRtcRTPHeader rtpInfo;
-  int32_t status;
-  size_t payloadDataSize = payloadSize;
-
-  rtpInfo.header.markerBit = false;
-  rtpInfo.header.ssrc = 0;
-  rtpInfo.header.sequenceNumber = (external_sequence_number_ < 0) ?
-      _seqNo++ : static_cast<uint16_t>(external_sequence_number_);
-  rtpInfo.header.payloadType = payloadType;
-  rtpInfo.header.timestamp = (external_send_timestamp_ < 0) ? timeStamp :
-      static_cast<uint32_t>(external_send_timestamp_);
-
-  if (frameType == kAudioFrameCN) {
-    rtpInfo.type.Audio.isCNG = true;
-  } else {
-    rtpInfo.type.Audio.isCNG = false;
-  }
-  if (frameType == kEmptyFrame) {
-    // When frame is empty, we should not transmit it. The frame size of the
-    // next non-empty frame will be based on the previous frame size.
-    _useLastFrameSize = _lastFrameSizeSample > 0;
-    return 0;
-  }
-
-  rtpInfo.type.Audio.channel = 1;
-  // Treat fragmentation separately
-  if (fragmentation != NULL) {
-    // If silence for too long, send only new data.
-    if ((fragmentation->fragmentationVectorSize == 2) &&
-        (fragmentation->fragmentationTimeDiff[1] <= 0x3fff)) {
-      // only 0x80 if we have multiple blocks
-      _payloadData[0] = 0x80 + fragmentation->fragmentationPlType[1];
-      size_t REDheader = (fragmentation->fragmentationTimeDiff[1] << 10) +
-          fragmentation->fragmentationLength[1];
-      _payloadData[1] = uint8_t((REDheader >> 16) & 0x000000FF);
-      _payloadData[2] = uint8_t((REDheader >> 8) & 0x000000FF);
-      _payloadData[3] = uint8_t(REDheader & 0x000000FF);
-
-      _payloadData[4] = fragmentation->fragmentationPlType[0];
-      // copy the RED data
-      memcpy(_payloadData + 5,
-             payloadData + fragmentation->fragmentationOffset[1],
-             fragmentation->fragmentationLength[1]);
-      // copy the normal data
-      memcpy(_payloadData + 5 + fragmentation->fragmentationLength[1],
-             payloadData + fragmentation->fragmentationOffset[0],
-             fragmentation->fragmentationLength[0]);
-      payloadDataSize += 5;
-    } else {
-      // single block (newest one)
-      memcpy(_payloadData, payloadData + fragmentation->fragmentationOffset[0],
-             fragmentation->fragmentationLength[0]);
-      payloadDataSize = fragmentation->fragmentationLength[0];
-      rtpInfo.header.payloadType = fragmentation->fragmentationPlType[0];
-    }
-  } else {
-    memcpy(_payloadData, payloadData, payloadDataSize);
-    if (_isStereo) {
-      if (_leftChannel) {
-        memcpy(&_rtpInfo, &rtpInfo, sizeof(WebRtcRTPHeader));
-        _leftChannel = false;
-        rtpInfo.type.Audio.channel = 1;
-      } else {
-        memcpy(&rtpInfo, &_rtpInfo, sizeof(WebRtcRTPHeader));
-        _leftChannel = true;
-        rtpInfo.type.Audio.channel = 2;
-      }
-    }
-  }
-
-  _channelCritSect.Enter();
-  if (_saveBitStream) {
-    //fwrite(payloadData, sizeof(uint8_t), payloadSize, _bitStreamFile);
-  }
-
-  if (!_isStereo) {
-    CalcStatistics(rtpInfo, payloadSize);
-  }
-  _useLastFrameSize = false;
-  _lastInTimestamp = timeStamp;
-  _totalBytes += payloadDataSize;
-  _channelCritSect.Leave();
-
-  if (_useFECTestWithPacketLoss) {
-    _packetLoss += 1;
-    if (_packetLoss == 3) {
-      _packetLoss = 0;
-      return 0;
-    }
-  }
-
-  if (num_packets_to_drop_ > 0) {
-    num_packets_to_drop_--;
-    return 0;
-  }
-
-  status = _receiverACM->IncomingPacket(_payloadData, payloadDataSize, rtpInfo);
-
-  return status;
-}
-
-// TODO(turajs): rewite this method.
-void Channel::CalcStatistics(WebRtcRTPHeader& rtpInfo, size_t payloadSize) {
-  int n;
-  if ((rtpInfo.header.payloadType != _lastPayloadType)
-      && (_lastPayloadType != -1)) {
-    // payload-type is changed.
-    // we have to terminate the calculations on the previous payload type
-    // we ignore the last packet in that payload type just to make things
-    // easier.
-    for (n = 0; n < MAX_NUM_PAYLOADS; n++) {
-      if (_lastPayloadType == _payloadStats[n].payloadType) {
-        _payloadStats[n].newPacket = true;
-        break;
-      }
-    }
-  }
-  _lastPayloadType = rtpInfo.header.payloadType;
-
-  bool newPayload = true;
-  ACMTestPayloadStats* currentPayloadStr = NULL;
-  for (n = 0; n < MAX_NUM_PAYLOADS; n++) {
-    if (rtpInfo.header.payloadType == _payloadStats[n].payloadType) {
-      newPayload = false;
-      currentPayloadStr = &_payloadStats[n];
-      break;
-    }
-  }
-
-  if (!newPayload) {
-    if (!currentPayloadStr->newPacket) {
-      if (!_useLastFrameSize) {
-        _lastFrameSizeSample = (uint32_t) ((uint32_t) rtpInfo.header.timestamp -
-            (uint32_t) currentPayloadStr->lastTimestamp);
-      }
-      assert(_lastFrameSizeSample > 0);
-      int k = 0;
-      for (; k < MAX_NUM_FRAMESIZES; ++k) {
-        if ((currentPayloadStr->frameSizeStats[k].frameSizeSample ==
-            _lastFrameSizeSample) ||
-            (currentPayloadStr->frameSizeStats[k].frameSizeSample == 0)) {
-          break;
-        }
-      }
-      if (k == MAX_NUM_FRAMESIZES) {
-        // New frame size found but no space to count statistics on it. Skip it.
-        printf("No memory to store statistics for payload %d : frame size %d\n",
-               _lastPayloadType, _lastFrameSizeSample);
-        return;
-      }
-      ACMTestFrameSizeStats* currentFrameSizeStats = &(currentPayloadStr
-          ->frameSizeStats[k]);
-      currentFrameSizeStats->frameSizeSample = (int16_t) _lastFrameSizeSample;
-
-      // increment the number of encoded samples.
-      currentFrameSizeStats->totalEncodedSamples += _lastFrameSizeSample;
-      // increment the number of recveived packets
-      currentFrameSizeStats->numPackets++;
-      // increment the total number of bytes (this is based on
-      // the previous payload we don't know the frame-size of
-      // the current payload.
-      currentFrameSizeStats->totalPayloadLenByte += currentPayloadStr
-          ->lastPayloadLenByte;
-      // store the maximum payload-size (this is based on
-      // the previous payload we don't know the frame-size of
-      // the current payload.
-      if (currentFrameSizeStats->maxPayloadLen
-          < currentPayloadStr->lastPayloadLenByte) {
-        currentFrameSizeStats->maxPayloadLen = currentPayloadStr
-            ->lastPayloadLenByte;
-      }
-      // store the current values for the next time
-      currentPayloadStr->lastTimestamp = rtpInfo.header.timestamp;
-      currentPayloadStr->lastPayloadLenByte = payloadSize;
-    } else {
-      currentPayloadStr->newPacket = false;
-      currentPayloadStr->lastPayloadLenByte = payloadSize;
-      currentPayloadStr->lastTimestamp = rtpInfo.header.timestamp;
-      currentPayloadStr->payloadType = rtpInfo.header.payloadType;
-      memset(currentPayloadStr->frameSizeStats, 0, MAX_NUM_FRAMESIZES *
-             sizeof(ACMTestFrameSizeStats));
-    }
-  } else {
-    n = 0;
-    while (_payloadStats[n].payloadType != -1) {
-      n++;
-    }
-    // first packet
-    _payloadStats[n].newPacket = false;
-    _payloadStats[n].lastPayloadLenByte = payloadSize;
-    _payloadStats[n].lastTimestamp = rtpInfo.header.timestamp;
-    _payloadStats[n].payloadType = rtpInfo.header.payloadType;
-    memset(_payloadStats[n].frameSizeStats, 0, MAX_NUM_FRAMESIZES *
-           sizeof(ACMTestFrameSizeStats));
-  }
-}
-
-Channel::Channel(int16_t chID)
-    : _receiverACM(NULL),
-      _seqNo(0),
-      _bitStreamFile(NULL),
-      _saveBitStream(false),
-      _lastPayloadType(-1),
-      _isStereo(false),
-      _leftChannel(true),
-      _lastInTimestamp(0),
-      _useLastFrameSize(false),
-      _lastFrameSizeSample(0),
-      _packetLoss(0),
-      _useFECTestWithPacketLoss(false),
-      _beginTime(rtc::TimeMillis()),
-      _totalBytes(0),
-      external_send_timestamp_(-1),
-      external_sequence_number_(-1),
-      num_packets_to_drop_(0) {
-  int n;
-  int k;
-  for (n = 0; n < MAX_NUM_PAYLOADS; n++) {
-    _payloadStats[n].payloadType = -1;
-    _payloadStats[n].newPacket = true;
-    for (k = 0; k < MAX_NUM_FRAMESIZES; k++) {
-      _payloadStats[n].frameSizeStats[k].frameSizeSample = 0;
-      _payloadStats[n].frameSizeStats[k].maxPayloadLen = 0;
-      _payloadStats[n].frameSizeStats[k].numPackets = 0;
-      _payloadStats[n].frameSizeStats[k].totalPayloadLenByte = 0;
-      _payloadStats[n].frameSizeStats[k].totalEncodedSamples = 0;
-    }
-  }
-  if (chID >= 0) {
-    _saveBitStream = true;
-    char bitStreamFileName[500];
-    sprintf(bitStreamFileName, "bitStream_%d.dat", chID);
-    _bitStreamFile = fopen(bitStreamFileName, "wb");
-  } else {
-    _saveBitStream = false;
-  }
-}
-
-Channel::~Channel() {
-}
-
-void Channel::RegisterReceiverACM(AudioCodingModule* acm) {
-  _receiverACM = acm;
-  return;
-}
-
-void Channel::ResetStats() {
-  int n;
-  int k;
-  _channelCritSect.Enter();
-  _lastPayloadType = -1;
-  for (n = 0; n < MAX_NUM_PAYLOADS; n++) {
-    _payloadStats[n].payloadType = -1;
-    _payloadStats[n].newPacket = true;
-    for (k = 0; k < MAX_NUM_FRAMESIZES; k++) {
-      _payloadStats[n].frameSizeStats[k].frameSizeSample = 0;
-      _payloadStats[n].frameSizeStats[k].maxPayloadLen = 0;
-      _payloadStats[n].frameSizeStats[k].numPackets = 0;
-      _payloadStats[n].frameSizeStats[k].totalPayloadLenByte = 0;
-      _payloadStats[n].frameSizeStats[k].totalEncodedSamples = 0;
-    }
-  }
-  _beginTime = rtc::TimeMillis();
-  _totalBytes = 0;
-  _channelCritSect.Leave();
-}
-
-int16_t Channel::Stats(CodecInst& codecInst,
-                       ACMTestPayloadStats& payloadStats) {
-  _channelCritSect.Enter();
-  int n;
-  payloadStats.payloadType = -1;
-  for (n = 0; n < MAX_NUM_PAYLOADS; n++) {
-    if (_payloadStats[n].payloadType == codecInst.pltype) {
-      memcpy(&payloadStats, &_payloadStats[n], sizeof(ACMTestPayloadStats));
-      break;
-    }
-  }
-  if (payloadStats.payloadType == -1) {
-    _channelCritSect.Leave();
-    return -1;
-  }
-  for (n = 0; n < MAX_NUM_FRAMESIZES; n++) {
-    if (payloadStats.frameSizeStats[n].frameSizeSample == 0) {
-      _channelCritSect.Leave();
-      return 0;
-    }
-    payloadStats.frameSizeStats[n].usageLenSec = (double) payloadStats
-        .frameSizeStats[n].totalEncodedSamples / (double) codecInst.plfreq;
-
-    payloadStats.frameSizeStats[n].rateBitPerSec =
-        payloadStats.frameSizeStats[n].totalPayloadLenByte * 8
-            / payloadStats.frameSizeStats[n].usageLenSec;
-
-  }
-  _channelCritSect.Leave();
-  return 0;
-}
-
-void Channel::Stats(uint32_t* numPackets) {
-  _channelCritSect.Enter();
-  int k;
-  int n;
-  memset(numPackets, 0, MAX_NUM_PAYLOADS * sizeof(uint32_t));
-  for (k = 0; k < MAX_NUM_PAYLOADS; k++) {
-    if (_payloadStats[k].payloadType == -1) {
-      break;
-    }
-    numPackets[k] = 0;
-    for (n = 0; n < MAX_NUM_FRAMESIZES; n++) {
-      if (_payloadStats[k].frameSizeStats[n].frameSizeSample == 0) {
-        break;
-      }
-      numPackets[k] += _payloadStats[k].frameSizeStats[n].numPackets;
-    }
-  }
-  _channelCritSect.Leave();
-}
-
-void Channel::Stats(uint8_t* payloadType, uint32_t* payloadLenByte) {
-  _channelCritSect.Enter();
-
-  int k;
-  int n;
-  memset(payloadLenByte, 0, MAX_NUM_PAYLOADS * sizeof(uint32_t));
-  for (k = 0; k < MAX_NUM_PAYLOADS; k++) {
-    if (_payloadStats[k].payloadType == -1) {
-      break;
-    }
-    payloadType[k] = (uint8_t) _payloadStats[k].payloadType;
-    payloadLenByte[k] = 0;
-    for (n = 0; n < MAX_NUM_FRAMESIZES; n++) {
-      if (_payloadStats[k].frameSizeStats[n].frameSizeSample == 0) {
-        break;
-      }
-      payloadLenByte[k] += (uint16_t) _payloadStats[k].frameSizeStats[n]
-          .totalPayloadLenByte;
-    }
-  }
-
-  _channelCritSect.Leave();
-}
-
-void Channel::PrintStats(CodecInst& codecInst) {
-  ACMTestPayloadStats payloadStats;
-  Stats(codecInst, payloadStats);
-  printf("%s %d kHz\n", codecInst.plname, codecInst.plfreq / 1000);
-  printf("=====================================================\n");
-  if (payloadStats.payloadType == -1) {
-    printf("No Packets are sent with payload-type %d (%s)\n\n",
-           codecInst.pltype, codecInst.plname);
-    return;
-  }
-  for (int k = 0; k < MAX_NUM_FRAMESIZES; k++) {
-    if (payloadStats.frameSizeStats[k].frameSizeSample == 0) {
-      break;
-    }
-    printf("Frame-size.................... %d samples\n",
-           payloadStats.frameSizeStats[k].frameSizeSample);
-    printf("Average Rate.................. %.0f bits/sec\n",
-           payloadStats.frameSizeStats[k].rateBitPerSec);
-    printf("Maximum Payload-Size.......... %" PRIuS " Bytes\n",
-           payloadStats.frameSizeStats[k].maxPayloadLen);
-    printf(
-        "Maximum Instantaneous Rate.... %.0f bits/sec\n",
-        ((double) payloadStats.frameSizeStats[k].maxPayloadLen * 8.0
-            * (double) codecInst.plfreq)
-            / (double) payloadStats.frameSizeStats[k].frameSizeSample);
-    printf("Number of Packets............. %u\n",
-           (unsigned int) payloadStats.frameSizeStats[k].numPackets);
-    printf("Duration...................... %0.3f sec\n\n",
-           payloadStats.frameSizeStats[k].usageLenSec);
-
-  }
-
-}
-
-uint32_t Channel::LastInTimestamp() {
-  uint32_t timestamp;
-  _channelCritSect.Enter();
-  timestamp = _lastInTimestamp;
-  _channelCritSect.Leave();
-  return timestamp;
-}
-
-double Channel::BitRate() {
-  double rate;
-  uint64_t currTime = rtc::TimeMillis();
-  _channelCritSect.Enter();
-  rate = ((double) _totalBytes * 8.0) / (double) (currTime - _beginTime);
-  _channelCritSect.Leave();
-  return rate;
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/test/Channel.h b/modules/audio_coding/test/Channel.h
deleted file mode 100644
index aeb535a..0000000
--- a/modules/audio_coding/test/Channel.h
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- *  Copyright (c) 2012 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_TEST_CHANNEL_H_
-#define WEBRTC_MODULES_AUDIO_CODING_TEST_CHANNEL_H_
-
-#include <stdio.h>
-
-#include "webrtc/modules/audio_coding/include/audio_coding_module.h"
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-#define MAX_NUM_PAYLOADS   50
-#define MAX_NUM_FRAMESIZES  6
-
-// TODO(turajs): Write constructor for this structure.
-struct ACMTestFrameSizeStats {
-  uint16_t frameSizeSample;
-  size_t maxPayloadLen;
-  uint32_t numPackets;
-  uint64_t totalPayloadLenByte;
-  uint64_t totalEncodedSamples;
-  double rateBitPerSec;
-  double usageLenSec;
-};
-
-// TODO(turajs): Write constructor for this structure.
-struct ACMTestPayloadStats {
-  bool newPacket;
-  int16_t payloadType;
-  size_t lastPayloadLenByte;
-  uint32_t lastTimestamp;
-  ACMTestFrameSizeStats frameSizeStats[MAX_NUM_FRAMESIZES];
-};
-
-class Channel : public AudioPacketizationCallback {
- public:
-
-  Channel(int16_t chID = -1);
-  ~Channel() override;
-
-  int32_t SendData(FrameType frameType,
-                   uint8_t payloadType,
-                   uint32_t timeStamp,
-                   const uint8_t* payloadData,
-                   size_t payloadSize,
-                   const RTPFragmentationHeader* fragmentation) override;
-
-  void RegisterReceiverACM(AudioCodingModule *acm);
-
-  void ResetStats();
-
-  int16_t Stats(CodecInst& codecInst, ACMTestPayloadStats& payloadStats);
-
-  void Stats(uint32_t* numPackets);
-
-  void Stats(uint8_t* payloadType, uint32_t* payloadLenByte);
-
-  void PrintStats(CodecInst& codecInst);
-
-  void SetIsStereo(bool isStereo) {
-    _isStereo = isStereo;
-  }
-
-  uint32_t LastInTimestamp();
-
-  void SetFECTestWithPacketLoss(bool usePacketLoss) {
-    _useFECTestWithPacketLoss = usePacketLoss;
-  }
-
-  double BitRate();
-
-  void set_send_timestamp(uint32_t new_send_ts) {
-    external_send_timestamp_ = new_send_ts;
-  }
-
-  void set_sequence_number(uint16_t new_sequence_number) {
-    external_sequence_number_ = new_sequence_number;
-  }
-
-  void set_num_packets_to_drop(int new_num_packets_to_drop) {
-    num_packets_to_drop_ = new_num_packets_to_drop;
-  }
-
- private:
-  void CalcStatistics(WebRtcRTPHeader& rtpInfo, size_t payloadSize);
-
-  AudioCodingModule* _receiverACM;
-  uint16_t _seqNo;
-  // 60msec * 32 sample(max)/msec * 2 description (maybe) * 2 bytes/sample
-  uint8_t _payloadData[60 * 32 * 2 * 2];
-
-  rtc::CriticalSection _channelCritSect;
-  FILE* _bitStreamFile;
-  bool _saveBitStream;
-  int16_t _lastPayloadType;
-  ACMTestPayloadStats _payloadStats[MAX_NUM_PAYLOADS];
-  bool _isStereo;
-  WebRtcRTPHeader _rtpInfo;
-  bool _leftChannel;
-  uint32_t _lastInTimestamp;
-  bool _useLastFrameSize;
-  uint32_t _lastFrameSizeSample;
-  // FEC Test variables
-  int16_t _packetLoss;
-  bool _useFECTestWithPacketLoss;
-  uint64_t _beginTime;
-  uint64_t _totalBytes;
-
-  // External timing info, defaulted to -1. Only used if they are
-  // non-negative.
-  int64_t external_send_timestamp_;
-  int32_t external_sequence_number_;
-  int num_packets_to_drop_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_CODING_TEST_CHANNEL_H_
diff --git a/modules/audio_coding/test/EncodeDecodeTest.cc b/modules/audio_coding/test/EncodeDecodeTest.cc
deleted file mode 100644
index 24d0719..0000000
--- a/modules/audio_coding/test/EncodeDecodeTest.cc
+++ /dev/null
@@ -1,361 +0,0 @@
-/*
- *  Copyright (c) 2012 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/test/EncodeDecodeTest.h"
-
-#include <memory>
-#include <sstream>
-#include <stdio.h>
-#include <stdlib.h>
-
-#include "webrtc/common_types.h"
-#include "webrtc/modules/audio_coding/codecs/audio_format_conversion.h"
-#include "webrtc/modules/audio_coding/include/audio_coding_module.h"
-#include "webrtc/modules/audio_coding/test/utility.h"
-#include "webrtc/system_wrappers/include/trace.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/testsupport/fileutils.h"
-
-namespace webrtc {
-
-TestPacketization::TestPacketization(RTPStream *rtpStream, uint16_t frequency)
-    : _rtpStream(rtpStream),
-      _frequency(frequency),
-      _seqNo(0) {
-}
-
-TestPacketization::~TestPacketization() {
-}
-
-int32_t TestPacketization::SendData(
-    const FrameType /* frameType */, const uint8_t payloadType,
-    const uint32_t timeStamp, const uint8_t* payloadData,
-    const size_t payloadSize,
-    const RTPFragmentationHeader* /* fragmentation */) {
-  _rtpStream->Write(payloadType, timeStamp, _seqNo++, payloadData, payloadSize,
-                    _frequency);
-  return 1;
-}
-
-Sender::Sender()
-    : _acm(NULL),
-      _pcmFile(),
-      _audioFrame(),
-      _packetization(NULL) {
-}
-
-void Sender::Setup(AudioCodingModule *acm, RTPStream *rtpStream,
-                   std::string in_file_name, int sample_rate, size_t channels) {
-  struct CodecInst sendCodec;
-  int noOfCodecs = acm->NumberOfCodecs();
-  int codecNo;
-
-  // Open input file
-  const std::string file_name = webrtc::test::ResourcePath(in_file_name, "pcm");
-  _pcmFile.Open(file_name, sample_rate, "rb");
-  if (channels == 2) {
-    _pcmFile.ReadStereo(true);
-  }
-  // Set test length to 500 ms (50 blocks of 10 ms each).
-  _pcmFile.SetNum10MsBlocksToRead(50);
-  // Fast-forward 1 second (100 blocks) since the file starts with silence.
-  _pcmFile.FastForward(100);
-
-  // Set the codec for the current test.
-  if ((testMode == 0) || (testMode == 1)) {
-    // Set the codec id.
-    codecNo = codeId;
-  } else {
-    // Choose codec on command line.
-    printf("List of supported codec.\n");
-    for (int n = 0; n < noOfCodecs; n++) {
-      EXPECT_EQ(0, acm->Codec(n, &sendCodec));
-      printf("%d %s\n", n, sendCodec.plname);
-    }
-    printf("Choose your codec:");
-    ASSERT_GT(scanf("%d", &codecNo), 0);
-  }
-
-  EXPECT_EQ(0, acm->Codec(codecNo, &sendCodec));
-
-  sendCodec.channels = channels;
-
-  EXPECT_EQ(0, acm->RegisterSendCodec(sendCodec));
-  _packetization = new TestPacketization(rtpStream, sendCodec.plfreq);
-  EXPECT_EQ(0, acm->RegisterTransportCallback(_packetization));
-
-  _acm = acm;
-}
-
-void Sender::Teardown() {
-  _pcmFile.Close();
-  delete _packetization;
-}
-
-bool Sender::Add10MsData() {
-  if (!_pcmFile.EndOfFile()) {
-    EXPECT_GT(_pcmFile.Read10MsData(_audioFrame), 0);
-    int32_t ok = _acm->Add10MsData(_audioFrame);
-    EXPECT_GE(ok, 0);
-    return ok >= 0 ? true : false;
-  }
-  return false;
-}
-
-void Sender::Run() {
-  while (true) {
-    if (!Add10MsData()) {
-      break;
-    }
-  }
-}
-
-Receiver::Receiver()
-    : _playoutLengthSmpls(WEBRTC_10MS_PCM_AUDIO),
-      _payloadSizeBytes(MAX_INCOMING_PAYLOAD) {
-}
-
-void Receiver::Setup(AudioCodingModule *acm, RTPStream *rtpStream,
-                     std::string out_file_name, size_t channels) {
-  struct CodecInst recvCodec = CodecInst();
-  int noOfCodecs;
-  EXPECT_EQ(0, acm->InitializeReceiver());
-
-  noOfCodecs = acm->NumberOfCodecs();
-  for (int i = 0; i < noOfCodecs; i++) {
-    EXPECT_EQ(0, acm->Codec(i, &recvCodec));
-    if (recvCodec.channels == channels)
-      EXPECT_EQ(true, acm->RegisterReceiveCodec(recvCodec.pltype,
-                                                CodecInstToSdp(recvCodec)));
-    // Forces mono/stereo for Opus.
-    if (!strcmp(recvCodec.plname, "opus")) {
-      recvCodec.channels = channels;
-      EXPECT_EQ(true, acm->RegisterReceiveCodec(recvCodec.pltype,
-                                                CodecInstToSdp(recvCodec)));
-    }
-  }
-
-  int playSampFreq;
-  std::string file_name;
-  std::stringstream file_stream;
-  file_stream << webrtc::test::OutputPath() << out_file_name
-      << static_cast<int>(codeId) << ".pcm";
-  file_name = file_stream.str();
-  _rtpStream = rtpStream;
-
-  if (testMode == 1) {
-    playSampFreq = recvCodec.plfreq;
-    _pcmFile.Open(file_name, recvCodec.plfreq, "wb+");
-  } else if (testMode == 0) {
-    playSampFreq = 32000;
-    _pcmFile.Open(file_name, 32000, "wb+");
-  } else {
-    printf("\nValid output frequencies:\n");
-    printf("8000\n16000\n32000\n-1,");
-    printf("which means output frequency equal to received signal frequency");
-    printf("\n\nChoose output sampling frequency: ");
-    ASSERT_GT(scanf("%d", &playSampFreq), 0);
-    file_name = webrtc::test::OutputPath() + out_file_name + ".pcm";
-    _pcmFile.Open(file_name, playSampFreq, "wb+");
-  }
-
-  _realPayloadSizeBytes = 0;
-  _playoutBuffer = new int16_t[WEBRTC_10MS_PCM_AUDIO];
-  _frequency = playSampFreq;
-  _acm = acm;
-  _firstTime = true;
-}
-
-void Receiver::Teardown() {
-  delete[] _playoutBuffer;
-  _pcmFile.Close();
-  if (testMode > 1) {
-    Trace::ReturnTrace();
-  }
-}
-
-bool Receiver::IncomingPacket() {
-  if (!_rtpStream->EndOfFile()) {
-    if (_firstTime) {
-      _firstTime = false;
-      _realPayloadSizeBytes = _rtpStream->Read(&_rtpInfo, _incomingPayload,
-                                               _payloadSizeBytes, &_nextTime);
-      if (_realPayloadSizeBytes == 0) {
-        if (_rtpStream->EndOfFile()) {
-          _firstTime = true;
-          return true;
-        } else {
-          return false;
-        }
-      }
-    }
-
-    EXPECT_EQ(0, _acm->IncomingPacket(_incomingPayload, _realPayloadSizeBytes,
-                                      _rtpInfo));
-    _realPayloadSizeBytes = _rtpStream->Read(&_rtpInfo, _incomingPayload,
-                                             _payloadSizeBytes, &_nextTime);
-    if (_realPayloadSizeBytes == 0 && _rtpStream->EndOfFile()) {
-      _firstTime = true;
-    }
-  }
-  return true;
-}
-
-bool Receiver::PlayoutData() {
-  AudioFrame audioFrame;
-  bool muted;
-  int32_t ok = _acm->PlayoutData10Ms(_frequency, &audioFrame, &muted);
-  if (muted) {
-    ADD_FAILURE();
-    return false;
-  }
-  EXPECT_EQ(0, ok);
-  if (ok < 0){
-    return false;
-  }
-  if (_playoutLengthSmpls == 0) {
-    return false;
-  }
-  _pcmFile.Write10MsData(audioFrame.data(),
-      audioFrame.samples_per_channel_ * audioFrame.num_channels_);
-  return true;
-}
-
-void Receiver::Run() {
-  uint8_t counter500Ms = 50;
-  uint32_t clock = 0;
-
-  while (counter500Ms > 0) {
-    if (clock == 0 || clock >= _nextTime) {
-      EXPECT_TRUE(IncomingPacket());
-      if (clock == 0) {
-        clock = _nextTime;
-      }
-    }
-    if ((clock % 10) == 0) {
-      if (!PlayoutData()) {
-        clock++;
-        continue;
-      }
-    }
-    if (_rtpStream->EndOfFile()) {
-      counter500Ms--;
-    }
-    clock++;
-  }
-}
-
-EncodeDecodeTest::EncodeDecodeTest() {
-  _testMode = 2;
-  Trace::CreateTrace();
-  Trace::SetTraceFile(
-      (webrtc::test::OutputPath() + "acm_encdec_trace.txt").c_str());
-}
-
-EncodeDecodeTest::EncodeDecodeTest(int testMode) {
-  //testMode == 0 for autotest
-  //testMode == 1 for testing all codecs/parameters
-  //testMode > 1 for specific user-input test (as it was used before)
-  _testMode = testMode;
-  if (_testMode != 0) {
-    Trace::CreateTrace();
-    Trace::SetTraceFile(
-        (webrtc::test::OutputPath() + "acm_encdec_trace.txt").c_str());
-  }
-}
-
-void EncodeDecodeTest::Perform() {
-  int numCodecs = 1;
-  int codePars[3];  // Frequency, packet size, rate.
-  int numPars[52];  // Number of codec parameters sets (freq, pacsize, rate)
-                    // to test, for a given codec.
-
-  codePars[0] = 0;
-  codePars[1] = 0;
-  codePars[2] = 0;
-
-  std::unique_ptr<AudioCodingModule> acm(AudioCodingModule::Create(0));
-  struct CodecInst sendCodecTmp;
-  numCodecs = acm->NumberOfCodecs();
-
-  if (_testMode != 2) {
-    for (int n = 0; n < numCodecs; n++) {
-      EXPECT_EQ(0, acm->Codec(n, &sendCodecTmp));
-      if (STR_CASE_CMP(sendCodecTmp.plname, "telephone-event") == 0) {
-        numPars[n] = 0;
-      } else if (STR_CASE_CMP(sendCodecTmp.plname, "cn") == 0) {
-        numPars[n] = 0;
-      } else if (STR_CASE_CMP(sendCodecTmp.plname, "red") == 0) {
-        numPars[n] = 0;
-      } else if (sendCodecTmp.channels == 2) {
-        numPars[n] = 0;
-      } else {
-        numPars[n] = 1;
-      }
-    }
-  } else {
-    numCodecs = 1;
-    numPars[0] = 1;
-  }
-
-  _receiver.testMode = _testMode;
-
-  // Loop over all mono codecs:
-  for (int codeId = 0; codeId < numCodecs; codeId++) {
-    // Only encode using real mono encoders, not telephone-event and cng.
-    for (int loopPars = 1; loopPars <= numPars[codeId]; loopPars++) {
-      // Encode all data to file.
-      std::string fileName = EncodeToFile(1, codeId, codePars, _testMode);
-
-      RTPFile rtpFile;
-      rtpFile.Open(fileName.c_str(), "rb");
-
-      _receiver.codeId = codeId;
-
-      rtpFile.ReadHeader();
-      _receiver.Setup(acm.get(), &rtpFile, "encodeDecode_out", 1);
-      _receiver.Run();
-      _receiver.Teardown();
-      rtpFile.Close();
-    }
-  }
-
-  // End tracing.
-  if (_testMode == 1) {
-    Trace::ReturnTrace();
-  }
-}
-
-std::string EncodeDecodeTest::EncodeToFile(int fileType,
-                                           int codeId,
-                                           int* codePars,
-                                           int testMode) {
-  std::unique_ptr<AudioCodingModule> acm(AudioCodingModule::Create(1));
-  RTPFile rtpFile;
-  std::string fileName = webrtc::test::TempFilename(webrtc::test::OutputPath(),
-                                                    "encode_decode_rtp");
-  rtpFile.Open(fileName.c_str(), "wb+");
-  rtpFile.WriteHeader();
-
-  // Store for auto_test and logging.
-  _sender.testMode = testMode;
-  _sender.codeId = codeId;
-
-  _sender.Setup(acm.get(), &rtpFile, "audio_coding/testfile32kHz", 32000, 1);
-  if (acm->SendCodec()) {
-    _sender.Run();
-  }
-  _sender.Teardown();
-  rtpFile.Close();
-
-  return fileName;
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/test/EncodeDecodeTest.h b/modules/audio_coding/test/EncodeDecodeTest.h
deleted file mode 100644
index f9a9a5b..0000000
--- a/modules/audio_coding/test/EncodeDecodeTest.h
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- *  Copyright (c) 2012 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_TEST_ENCODEDECODETEST_H_
-#define WEBRTC_MODULES_AUDIO_CODING_TEST_ENCODEDECODETEST_H_
-
-#include <stdio.h>
-#include <string.h>
-
-#include "webrtc/modules/audio_coding/include/audio_coding_module.h"
-#include "webrtc/modules/audio_coding/test/ACMTest.h"
-#include "webrtc/modules/audio_coding/test/PCMFile.h"
-#include "webrtc/modules/audio_coding/test/RTPFile.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-#define MAX_INCOMING_PAYLOAD 8096
-
-// TestPacketization callback which writes the encoded payloads to file
-class TestPacketization : public AudioPacketizationCallback {
- public:
-  TestPacketization(RTPStream *rtpStream, uint16_t frequency);
-  ~TestPacketization();
-  int32_t SendData(const FrameType frameType,
-                   const uint8_t payloadType,
-                   const uint32_t timeStamp,
-                   const uint8_t* payloadData,
-                   const size_t payloadSize,
-                   const RTPFragmentationHeader* fragmentation) override;
-
- private:
-  static void MakeRTPheader(uint8_t* rtpHeader, uint8_t payloadType,
-                            int16_t seqNo, uint32_t timeStamp, uint32_t ssrc);
-  RTPStream* _rtpStream;
-  int32_t _frequency;
-  int16_t _seqNo;
-};
-
-class Sender {
- public:
-  Sender();
-  void Setup(AudioCodingModule *acm, RTPStream *rtpStream,
-             std::string in_file_name, int sample_rate, size_t channels);
-  void Teardown();
-  void Run();
-  bool Add10MsData();
-
-  //for auto_test and logging
-  uint8_t testMode;
-  uint8_t codeId;
-
- protected:
-  AudioCodingModule* _acm;
-
- private:
-  PCMFile _pcmFile;
-  AudioFrame _audioFrame;
-  TestPacketization* _packetization;
-};
-
-class Receiver {
- public:
-  Receiver();
-  virtual ~Receiver() {};
-  void Setup(AudioCodingModule *acm, RTPStream *rtpStream,
-             std::string out_file_name, size_t channels);
-  void Teardown();
-  void Run();
-  virtual bool IncomingPacket();
-  bool PlayoutData();
-
-  //for auto_test and logging
-  uint8_t codeId;
-  uint8_t testMode;
-
- private:
-  PCMFile _pcmFile;
-  int16_t* _playoutBuffer;
-  uint16_t _playoutLengthSmpls;
-  int32_t _frequency;
-  bool _firstTime;
-
- protected:
-  AudioCodingModule* _acm;
-  uint8_t _incomingPayload[MAX_INCOMING_PAYLOAD];
-  RTPStream* _rtpStream;
-  WebRtcRTPHeader _rtpInfo;
-  size_t _realPayloadSizeBytes;
-  size_t _payloadSizeBytes;
-  uint32_t _nextTime;
-};
-
-class EncodeDecodeTest : public ACMTest {
- public:
-  EncodeDecodeTest();
-  explicit EncodeDecodeTest(int testMode);
-  void Perform() override;
-
-  uint16_t _playoutFreq;
-  uint8_t _testMode;
-
- private:
-  std::string EncodeToFile(int fileType,
-                           int codeId,
-                           int* codePars,
-                           int testMode);
-
- protected:
-  Sender _sender;
-  Receiver _receiver;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_CODING_TEST_ENCODEDECODETEST_H_
diff --git a/modules/audio_coding/test/PCMFile.cc b/modules/audio_coding/test/PCMFile.cc
deleted file mode 100644
index 03d4fa7..0000000
--- a/modules/audio_coding/test/PCMFile.cc
+++ /dev/null
@@ -1,231 +0,0 @@
-/*
- *  Copyright (c) 2012 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/test/PCMFile.h"
-
-#include <ctype.h>
-#include <stdio.h>
-#include <string.h>
-
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-#define MAX_FILE_NAME_LENGTH_BYTE 500
-
-PCMFile::PCMFile()
-    : pcm_file_(NULL),
-      samples_10ms_(160),
-      frequency_(16000),
-      end_of_file_(false),
-      auto_rewind_(false),
-      rewinded_(false),
-      read_stereo_(false),
-      save_stereo_(false) {
-  timestamp_ = (((uint32_t) rand() & 0x0000FFFF) << 16) |
-      ((uint32_t) rand() & 0x0000FFFF);
-}
-
-PCMFile::PCMFile(uint32_t timestamp)
-    : pcm_file_(NULL),
-      samples_10ms_(160),
-      frequency_(16000),
-      end_of_file_(false),
-      auto_rewind_(false),
-      rewinded_(false),
-      read_stereo_(false),
-      save_stereo_(false) {
-  timestamp_ = timestamp;
-}
-
-PCMFile::~PCMFile() {
-  if (pcm_file_) {
-    fclose(pcm_file_);
-  }
-}
-
-int16_t PCMFile::ChooseFile(std::string* file_name, int16_t max_len,
-                            uint16_t* frequency_hz) {
-  char tmp_name[MAX_FILE_NAME_LENGTH_BYTE];
-
-  EXPECT_TRUE(fgets(tmp_name, MAX_FILE_NAME_LENGTH_BYTE, stdin) != NULL);
-  tmp_name[MAX_FILE_NAME_LENGTH_BYTE - 1] = '\0';
-  int16_t n = 0;
-
-  // Removing trailing spaces.
-  while ((isspace(tmp_name[n]) || iscntrl(tmp_name[n])) && (tmp_name[n] != 0)
-      && (n < MAX_FILE_NAME_LENGTH_BYTE)) {
-    n++;
-  }
-  if (n > 0) {
-    memmove(tmp_name, &tmp_name[n], MAX_FILE_NAME_LENGTH_BYTE - n);
-  }
-
-  // Removing trailing spaces.
-  n = (int16_t)(strlen(tmp_name) - 1);
-  if (n >= 0) {
-    while ((isspace(tmp_name[n]) || iscntrl(tmp_name[n])) && (n >= 0)) {
-      n--;
-    }
-  }
-  if (n >= 0) {
-    tmp_name[n + 1] = '\0';
-  }
-
-  int16_t len = (int16_t) strlen(tmp_name);
-  if (len > max_len) {
-    return -1;
-  }
-  if (len > 0) {
-    std::string tmp_string(tmp_name, len + 1);
-    *file_name = tmp_string;
-  }
-  printf("Enter the sampling frequency (in Hz) of the above file [%u]: ",
-         *frequency_hz);
-  EXPECT_TRUE(fgets(tmp_name, 10, stdin) != NULL);
-  uint16_t tmp_frequency = (uint16_t) atoi(tmp_name);
-  if (tmp_frequency > 0) {
-    *frequency_hz = tmp_frequency;
-  }
-  return 0;
-}
-
-void PCMFile::Open(const std::string& file_name, uint16_t frequency,
-                   const char* mode, bool auto_rewind) {
-  if ((pcm_file_ = fopen(file_name.c_str(), mode)) == NULL) {
-    printf("Cannot open file %s.\n", file_name.c_str());
-    ADD_FAILURE() << "Unable to read file";
-  }
-  frequency_ = frequency;
-  samples_10ms_ = (uint16_t)(frequency_ / 100);
-  auto_rewind_ = auto_rewind;
-  end_of_file_ = false;
-  rewinded_ = false;
-}
-
-int32_t PCMFile::SamplingFrequency() const {
-  return frequency_;
-}
-
-uint16_t PCMFile::PayloadLength10Ms() const {
-  return samples_10ms_;
-}
-
-int32_t PCMFile::Read10MsData(AudioFrame& audio_frame) {
-  uint16_t channels = 1;
-  if (read_stereo_) {
-    channels = 2;
-  }
-
-  int32_t payload_size = (int32_t) fread(audio_frame.mutable_data(),
-                                         sizeof(uint16_t),
-                                         samples_10ms_ * channels, pcm_file_);
-  if (payload_size < samples_10ms_ * channels) {
-    int16_t* frame_data = audio_frame.mutable_data();
-    for (int k = payload_size; k < samples_10ms_ * channels; k++) {
-      frame_data[k] = 0;
-    }
-    if (auto_rewind_) {
-      rewind(pcm_file_);
-      rewinded_ = true;
-    } else {
-      end_of_file_ = true;
-    }
-  }
-  audio_frame.samples_per_channel_ = samples_10ms_;
-  audio_frame.sample_rate_hz_ = frequency_;
-  audio_frame.num_channels_ = channels;
-  audio_frame.timestamp_ = timestamp_;
-  timestamp_ += samples_10ms_;
-  ++blocks_read_;
-  if (num_10ms_blocks_to_read_ && blocks_read_ >= *num_10ms_blocks_to_read_)
-    end_of_file_ = true;
-  return samples_10ms_;
-}
-
-void PCMFile::Write10MsData(const AudioFrame& audio_frame) {
-  if (audio_frame.num_channels_ == 1) {
-    if (!save_stereo_) {
-      if (fwrite(audio_frame.data(), sizeof(uint16_t),
-                 audio_frame.samples_per_channel_, pcm_file_) !=
-          static_cast<size_t>(audio_frame.samples_per_channel_)) {
-        return;
-      }
-    } else {
-      const int16_t* frame_data = audio_frame.data();
-      int16_t* stereo_audio = new int16_t[2 * audio_frame.samples_per_channel_];
-      for (size_t k = 0; k < audio_frame.samples_per_channel_; k++) {
-        stereo_audio[k << 1] = frame_data[k];
-        stereo_audio[(k << 1) + 1] = frame_data[k];
-      }
-      if (fwrite(stereo_audio, sizeof(int16_t),
-                 2 * audio_frame.samples_per_channel_, pcm_file_) !=
-          static_cast<size_t>(2 * audio_frame.samples_per_channel_)) {
-        return;
-      }
-      delete[] stereo_audio;
-    }
-  } else {
-    if (fwrite(audio_frame.data(), sizeof(int16_t),
-               audio_frame.num_channels_ * audio_frame.samples_per_channel_,
-               pcm_file_) !=
-        static_cast<size_t>(audio_frame.num_channels_ *
-                            audio_frame.samples_per_channel_)) {
-      return;
-    }
-  }
-}
-
-void PCMFile::Write10MsData(const int16_t* playout_buffer,
-                            size_t length_smpls) {
-  if (fwrite(playout_buffer, sizeof(uint16_t), length_smpls, pcm_file_) !=
-      length_smpls) {
-    return;
-  }
-}
-
-void PCMFile::Close() {
-  fclose(pcm_file_);
-  pcm_file_ = NULL;
-  blocks_read_ = 0;
-}
-
-void PCMFile::FastForward(int num_10ms_blocks) {
-  const int channels = read_stereo_ ? 2 : 1;
-  long num_bytes_to_move =
-      num_10ms_blocks * sizeof(int16_t) * samples_10ms_ * channels;
-  int error = fseek(pcm_file_, num_bytes_to_move, SEEK_CUR);
-  RTC_DCHECK_EQ(error, 0);
-}
-
-void PCMFile::Rewind() {
-  rewind(pcm_file_);
-  end_of_file_ = false;
-  blocks_read_ = 0;
-}
-
-bool PCMFile::Rewinded() {
-  return rewinded_;
-}
-
-void PCMFile::SaveStereo(bool is_stereo) {
-  save_stereo_ = is_stereo;
-}
-
-void PCMFile::ReadStereo(bool is_stereo) {
-  read_stereo_ = is_stereo;
-}
-
-void PCMFile::SetNum10MsBlocksToRead(int value) {
-  num_10ms_blocks_to_read_ = rtc::Optional<int>(value);
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/test/PCMFile.h b/modules/audio_coding/test/PCMFile.h
deleted file mode 100644
index 3576dc6..0000000
--- a/modules/audio_coding/test/PCMFile.h
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- *  Copyright (c) 2012 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_TEST_PCMFILE_H_
-#define WEBRTC_MODULES_AUDIO_CODING_TEST_PCMFILE_H_
-
-#include <stdio.h>
-#include <stdlib.h>
-
-#include <string>
-
-#include "webrtc/api/optional.h"
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-class PCMFile {
- public:
-  PCMFile();
-  PCMFile(uint32_t timestamp);
-  ~PCMFile();
-
-  void Open(const std::string& filename, uint16_t frequency, const char* mode,
-            bool auto_rewind = false);
-
-  int32_t Read10MsData(AudioFrame& audio_frame);
-
-  void Write10MsData(const int16_t *playout_buffer, size_t length_smpls);
-  void Write10MsData(const AudioFrame& audio_frame);
-
-  uint16_t PayloadLength10Ms() const;
-  int32_t SamplingFrequency() const;
-  void Close();
-  bool EndOfFile() const {
-    return end_of_file_;
-  }
-  // Moves forward the specified number of 10 ms blocks. If a limit has been set
-  // with SetNum10MsBlocksToRead, fast-forwarding does not count towards this
-  // limit.
-  void FastForward(int num_10ms_blocks);
-  void Rewind();
-  static int16_t ChooseFile(std::string* file_name, int16_t max_len,
-                            uint16_t* frequency_hz);
-  bool Rewinded();
-  void SaveStereo(bool is_stereo = true);
-  void ReadStereo(bool is_stereo = true);
-  // If set, the reading will stop after the specified number of blocks have
-  // been read. When that has happened, EndOfFile() will return true. Calling
-  // Rewind() will reset the counter and start over.
-  void SetNum10MsBlocksToRead(int value);
-
- private:
-  FILE* pcm_file_;
-  uint16_t samples_10ms_;
-  int32_t frequency_;
-  bool end_of_file_;
-  bool auto_rewind_;
-  bool rewinded_;
-  uint32_t timestamp_;
-  bool read_stereo_;
-  bool save_stereo_;
-  rtc::Optional<int> num_10ms_blocks_to_read_;
-  int blocks_read_ = 0;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_CODING_TEST_PCMFILE_H_
diff --git a/modules/audio_coding/test/PacketLossTest.cc b/modules/audio_coding/test/PacketLossTest.cc
deleted file mode 100644
index 68f2615..0000000
--- a/modules/audio_coding/test/PacketLossTest.cc
+++ /dev/null
@@ -1,168 +0,0 @@
-/*
- *  Copyright (c) 2014 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/test/PacketLossTest.h"
-
-#include <memory>
-
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/testsupport/fileutils.h"
-
-namespace webrtc {
-
-ReceiverWithPacketLoss::ReceiverWithPacketLoss()
-    : loss_rate_(0),
-      burst_length_(1),
-      packet_counter_(0),
-      lost_packet_counter_(0),
-      burst_lost_counter_(burst_length_) {
-}
-
-void ReceiverWithPacketLoss::Setup(AudioCodingModule *acm,
-                                   RTPStream *rtpStream,
-                                   std::string out_file_name,
-                                   int channels,
-                                   int loss_rate,
-                                   int burst_length) {
-  loss_rate_ = loss_rate;
-  burst_length_ = burst_length;
-  burst_lost_counter_ = burst_length_;  // To prevent first packet gets lost.
-  std::stringstream ss;
-  ss << out_file_name << "_" << loss_rate_ << "_" << burst_length_ << "_";
-  Receiver::Setup(acm, rtpStream, ss.str(), channels);
-}
-
-bool ReceiverWithPacketLoss::IncomingPacket() {
-  if (!_rtpStream->EndOfFile()) {
-    if (packet_counter_ == 0) {
-      _realPayloadSizeBytes = _rtpStream->Read(&_rtpInfo, _incomingPayload,
-                                               _payloadSizeBytes, &_nextTime);
-      if (_realPayloadSizeBytes == 0) {
-        if (_rtpStream->EndOfFile()) {
-          packet_counter_ = 0;
-          return true;
-        } else {
-          return false;
-        }
-      }
-    }
-
-    if (!PacketLost()) {
-      _acm->IncomingPacket(_incomingPayload, _realPayloadSizeBytes, _rtpInfo);
-    }
-    packet_counter_++;
-    _realPayloadSizeBytes = _rtpStream->Read(&_rtpInfo, _incomingPayload,
-                                             _payloadSizeBytes, &_nextTime);
-    if (_realPayloadSizeBytes == 0 && _rtpStream->EndOfFile()) {
-      packet_counter_ = 0;
-      lost_packet_counter_ = 0;
-    }
-  }
-  return true;
-}
-
-bool ReceiverWithPacketLoss::PacketLost() {
-  if (burst_lost_counter_ < burst_length_) {
-    lost_packet_counter_++;
-    burst_lost_counter_++;
-    return true;
-  }
-
-  if (lost_packet_counter_ * 100 < loss_rate_ * packet_counter_) {
-    lost_packet_counter_++;
-    burst_lost_counter_ = 1;
-    return true;
-  }
-  return false;
-}
-
-SenderWithFEC::SenderWithFEC()
-    : expected_loss_rate_(0) {
-}
-
-void SenderWithFEC::Setup(AudioCodingModule *acm, RTPStream *rtpStream,
-                          std::string in_file_name, int sample_rate,
-                          int channels, int expected_loss_rate) {
-  Sender::Setup(acm, rtpStream, in_file_name, sample_rate, channels);
-  EXPECT_TRUE(SetFEC(true));
-  EXPECT_TRUE(SetPacketLossRate(expected_loss_rate));
-}
-
-bool SenderWithFEC::SetFEC(bool enable_fec) {
-  if (_acm->SetCodecFEC(enable_fec) == 0) {
-    return true;
-  }
-  return false;
-}
-
-bool SenderWithFEC::SetPacketLossRate(int expected_loss_rate) {
-  if (_acm->SetPacketLossRate(expected_loss_rate) == 0) {
-    expected_loss_rate_ = expected_loss_rate;
-    return true;
-  }
-  return false;
-}
-
-PacketLossTest::PacketLossTest(int channels, int expected_loss_rate,
-                               int actual_loss_rate, int burst_length)
-    : channels_(channels),
-      in_file_name_(channels_ == 1 ? "audio_coding/testfile32kHz" :
-                    "audio_coding/teststereo32kHz"),
-      sample_rate_hz_(32000),
-      sender_(new SenderWithFEC),
-      receiver_(new ReceiverWithPacketLoss),
-      expected_loss_rate_(expected_loss_rate),
-      actual_loss_rate_(actual_loss_rate),
-      burst_length_(burst_length) {
-}
-
-void PacketLossTest::Perform() {
-#ifndef WEBRTC_CODEC_OPUS
-  return;
-#else
-  std::unique_ptr<AudioCodingModule> acm(AudioCodingModule::Create(0));
-
-  int codec_id = acm->Codec("opus", 48000, channels_);
-
-  RTPFile rtpFile;
-  std::string fileName = webrtc::test::TempFilename(webrtc::test::OutputPath(),
-                                                    "packet_loss_test");
-
-  // Encode to file
-  rtpFile.Open(fileName.c_str(), "wb+");
-  rtpFile.WriteHeader();
-
-  sender_->testMode = 0;
-  sender_->codeId = codec_id;
-
-  sender_->Setup(acm.get(), &rtpFile, in_file_name_, sample_rate_hz_, channels_,
-                 expected_loss_rate_);
-  if (acm->SendCodec()) {
-    sender_->Run();
-  }
-  sender_->Teardown();
-  rtpFile.Close();
-
-  // Decode to file
-  rtpFile.Open(fileName.c_str(), "rb");
-  rtpFile.ReadHeader();
-
-  receiver_->testMode = 0;
-  receiver_->codeId = codec_id;
-
-  receiver_->Setup(acm.get(), &rtpFile, "packetLoss_out", channels_,
-                   actual_loss_rate_, burst_length_);
-  receiver_->Run();
-  receiver_->Teardown();
-  rtpFile.Close();
-#endif
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/test/PacketLossTest.h b/modules/audio_coding/test/PacketLossTest.h
deleted file mode 100644
index 705fe73..0000000
--- a/modules/audio_coding/test/PacketLossTest.h
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- *  Copyright (c) 2014 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_TEST_PACKETLOSSTEST_H_
-#define WEBRTC_MODULES_AUDIO_CODING_TEST_PACKETLOSSTEST_H_
-
-#include <memory>
-#include <string>
-#include "webrtc/modules/audio_coding/test/EncodeDecodeTest.h"
-
-namespace webrtc {
-
-class ReceiverWithPacketLoss : public Receiver {
- public:
-  ReceiverWithPacketLoss();
-  void Setup(AudioCodingModule *acm, RTPStream *rtpStream,
-             std::string out_file_name, int channels, int loss_rate,
-             int burst_length);
-  bool IncomingPacket() override;
-
- protected:
-  bool PacketLost();
-  int loss_rate_;
-  int burst_length_;
-  int packet_counter_;
-  int lost_packet_counter_;
-  int burst_lost_counter_;
-};
-
-class SenderWithFEC : public Sender {
- public:
-  SenderWithFEC();
-  void Setup(AudioCodingModule *acm, RTPStream *rtpStream,
-             std::string in_file_name, int sample_rate, int channels,
-             int expected_loss_rate);
-  bool SetPacketLossRate(int expected_loss_rate);
-  bool SetFEC(bool enable_fec);
- protected:
-  int expected_loss_rate_;
-};
-
-class PacketLossTest : public ACMTest {
- public:
-  PacketLossTest(int channels, int expected_loss_rate_, int actual_loss_rate,
-                 int burst_length);
-  void Perform();
- protected:
-  int channels_;
-  std::string in_file_name_;
-  int sample_rate_hz_;
-  std::unique_ptr<SenderWithFEC> sender_;
-  std::unique_ptr<ReceiverWithPacketLoss> receiver_;
-  int expected_loss_rate_;
-  int actual_loss_rate_;
-  int burst_length_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_CODING_TEST_PACKETLOSSTEST_H_
diff --git a/modules/audio_coding/test/RTPFile.cc b/modules/audio_coding/test/RTPFile.cc
deleted file mode 100644
index 4bf4c98..0000000
--- a/modules/audio_coding/test/RTPFile.cc
+++ /dev/null
@@ -1,227 +0,0 @@
-/*
- *  Copyright (c) 2012 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 "RTPFile.h"
-
-#include <stdlib.h>
-#include <limits>
-
-#ifdef WIN32
-#   include <Winsock2.h>
-#else
-#   include <arpa/inet.h>
-#endif
-
-#include "audio_coding_module.h"
-#include "webrtc/system_wrappers/include/rw_lock_wrapper.h"
-// TODO(tlegrand): Consider removing usage of gtest.
-#include "webrtc/test/gtest.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-void RTPStream::ParseRTPHeader(WebRtcRTPHeader* rtpInfo,
-                               const uint8_t* rtpHeader) {
-  rtpInfo->header.payloadType = rtpHeader[1];
-  rtpInfo->header.sequenceNumber = (static_cast<uint16_t>(rtpHeader[2]) << 8) |
-      rtpHeader[3];
-  rtpInfo->header.timestamp = (static_cast<uint32_t>(rtpHeader[4]) << 24) |
-      (static_cast<uint32_t>(rtpHeader[5]) << 16) |
-      (static_cast<uint32_t>(rtpHeader[6]) << 8) | rtpHeader[7];
-  rtpInfo->header.ssrc = (static_cast<uint32_t>(rtpHeader[8]) << 24) |
-      (static_cast<uint32_t>(rtpHeader[9]) << 16) |
-      (static_cast<uint32_t>(rtpHeader[10]) << 8) | rtpHeader[11];
-}
-
-void RTPStream::MakeRTPheader(uint8_t* rtpHeader, uint8_t payloadType,
-                              int16_t seqNo, uint32_t timeStamp,
-                              uint32_t ssrc) {
-  rtpHeader[0] = 0x80;
-  rtpHeader[1] = payloadType;
-  rtpHeader[2] = (seqNo >> 8) & 0xFF;
-  rtpHeader[3] = seqNo & 0xFF;
-  rtpHeader[4] = timeStamp >> 24;
-  rtpHeader[5] = (timeStamp >> 16) & 0xFF;
-  rtpHeader[6] = (timeStamp >> 8) & 0xFF;
-  rtpHeader[7] = timeStamp & 0xFF;
-  rtpHeader[8] = ssrc >> 24;
-  rtpHeader[9] = (ssrc >> 16) & 0xFF;
-  rtpHeader[10] = (ssrc >> 8) & 0xFF;
-  rtpHeader[11] = ssrc & 0xFF;
-}
-
-RTPPacket::RTPPacket(uint8_t payloadType, uint32_t timeStamp, int16_t seqNo,
-                     const uint8_t* payloadData, size_t payloadSize,
-                     uint32_t frequency)
-    : payloadType(payloadType),
-      timeStamp(timeStamp),
-      seqNo(seqNo),
-      payloadSize(payloadSize),
-      frequency(frequency) {
-  if (payloadSize > 0) {
-    this->payloadData = new uint8_t[payloadSize];
-    memcpy(this->payloadData, payloadData, payloadSize);
-  }
-}
-
-RTPPacket::~RTPPacket() {
-  delete[] payloadData;
-}
-
-RTPBuffer::RTPBuffer() {
-  _queueRWLock = RWLockWrapper::CreateRWLock();
-}
-
-RTPBuffer::~RTPBuffer() {
-  delete _queueRWLock;
-}
-
-void RTPBuffer::Write(const uint8_t payloadType, const uint32_t timeStamp,
-                      const int16_t seqNo, const uint8_t* payloadData,
-                      const size_t payloadSize, uint32_t frequency) {
-  RTPPacket *packet = new RTPPacket(payloadType, timeStamp, seqNo, payloadData,
-                                    payloadSize, frequency);
-  _queueRWLock->AcquireLockExclusive();
-  _rtpQueue.push(packet);
-  _queueRWLock->ReleaseLockExclusive();
-}
-
-size_t RTPBuffer::Read(WebRtcRTPHeader* rtpInfo, uint8_t* payloadData,
-                       size_t payloadSize, uint32_t* offset) {
-  _queueRWLock->AcquireLockShared();
-  RTPPacket *packet = _rtpQueue.front();
-  _rtpQueue.pop();
-  _queueRWLock->ReleaseLockShared();
-  rtpInfo->header.markerBit = 1;
-  rtpInfo->header.payloadType = packet->payloadType;
-  rtpInfo->header.sequenceNumber = packet->seqNo;
-  rtpInfo->header.ssrc = 0;
-  rtpInfo->header.timestamp = packet->timeStamp;
-  if (packet->payloadSize > 0 && payloadSize >= packet->payloadSize) {
-    memcpy(payloadData, packet->payloadData, packet->payloadSize);
-  } else {
-    return 0;
-  }
-  *offset = (packet->timeStamp / (packet->frequency / 1000));
-
-  return packet->payloadSize;
-}
-
-bool RTPBuffer::EndOfFile() const {
-  _queueRWLock->AcquireLockShared();
-  bool eof = _rtpQueue.empty();
-  _queueRWLock->ReleaseLockShared();
-  return eof;
-}
-
-void RTPFile::Open(const char *filename, const char *mode) {
-  if ((_rtpFile = fopen(filename, mode)) == NULL) {
-    printf("Cannot write file %s.\n", filename);
-    ADD_FAILURE() << "Unable to write file";
-    exit(1);
-  }
-}
-
-void RTPFile::Close() {
-  if (_rtpFile != NULL) {
-    fclose(_rtpFile);
-    _rtpFile = NULL;
-  }
-}
-
-void RTPFile::WriteHeader() {
-  // Write data in a format that NetEQ and RTP Play can parse
-  fprintf(_rtpFile, "#!RTPencode%s\n", "1.0");
-  uint32_t dummy_variable = 0;
-  // should be converted to network endian format, but does not matter when 0
-  EXPECT_EQ(1u, fwrite(&dummy_variable, 4, 1, _rtpFile));
-  EXPECT_EQ(1u, fwrite(&dummy_variable, 4, 1, _rtpFile));
-  EXPECT_EQ(1u, fwrite(&dummy_variable, 4, 1, _rtpFile));
-  EXPECT_EQ(1u, fwrite(&dummy_variable, 2, 1, _rtpFile));
-  EXPECT_EQ(1u, fwrite(&dummy_variable, 2, 1, _rtpFile));
-  fflush(_rtpFile);
-}
-
-void RTPFile::ReadHeader() {
-  uint32_t start_sec, start_usec, source;
-  uint16_t port, padding;
-  char fileHeader[40];
-  EXPECT_TRUE(fgets(fileHeader, 40, _rtpFile) != 0);
-  EXPECT_EQ(1u, fread(&start_sec, 4, 1, _rtpFile));
-  start_sec = ntohl(start_sec);
-  EXPECT_EQ(1u, fread(&start_usec, 4, 1, _rtpFile));
-  start_usec = ntohl(start_usec);
-  EXPECT_EQ(1u, fread(&source, 4, 1, _rtpFile));
-  source = ntohl(source);
-  EXPECT_EQ(1u, fread(&port, 2, 1, _rtpFile));
-  port = ntohs(port);
-  EXPECT_EQ(1u, fread(&padding, 2, 1, _rtpFile));
-  padding = ntohs(padding);
-}
-
-void RTPFile::Write(const uint8_t payloadType, const uint32_t timeStamp,
-                    const int16_t seqNo, const uint8_t* payloadData,
-                    const size_t payloadSize, uint32_t frequency) {
-  /* write RTP packet to file */
-  uint8_t rtpHeader[12];
-  MakeRTPheader(rtpHeader, payloadType, seqNo, timeStamp, 0);
-  ASSERT_LE(12 + payloadSize + 8, std::numeric_limits<u_short>::max());
-  uint16_t lengthBytes = htons(static_cast<u_short>(12 + payloadSize + 8));
-  uint16_t plen = htons(static_cast<u_short>(12 + payloadSize));
-  uint32_t offsetMs;
-
-  offsetMs = (timeStamp / (frequency / 1000));
-  offsetMs = htonl(offsetMs);
-  EXPECT_EQ(1u, fwrite(&lengthBytes, 2, 1, _rtpFile));
-  EXPECT_EQ(1u, fwrite(&plen, 2, 1, _rtpFile));
-  EXPECT_EQ(1u, fwrite(&offsetMs, 4, 1, _rtpFile));
-  EXPECT_EQ(1u, fwrite(&rtpHeader, 12, 1, _rtpFile));
-  EXPECT_EQ(payloadSize, fwrite(payloadData, 1, payloadSize, _rtpFile));
-}
-
-size_t RTPFile::Read(WebRtcRTPHeader* rtpInfo, uint8_t* payloadData,
-                     size_t payloadSize, uint32_t* offset) {
-  uint16_t lengthBytes;
-  uint16_t plen;
-  uint8_t rtpHeader[12];
-  size_t read_len = fread(&lengthBytes, 2, 1, _rtpFile);
-  /* Check if we have reached end of file. */
-  if ((read_len == 0) && feof(_rtpFile)) {
-    _rtpEOF = true;
-    return 0;
-  }
-  EXPECT_EQ(1u, fread(&plen, 2, 1, _rtpFile));
-  EXPECT_EQ(1u, fread(offset, 4, 1, _rtpFile));
-  lengthBytes = ntohs(lengthBytes);
-  plen = ntohs(plen);
-  *offset = ntohl(*offset);
-  EXPECT_GT(plen, 11);
-
-  EXPECT_EQ(1u, fread(rtpHeader, 12, 1, _rtpFile));
-  ParseRTPHeader(rtpInfo, rtpHeader);
-  rtpInfo->type.Audio.isCNG = false;
-  rtpInfo->type.Audio.channel = 1;
-  EXPECT_EQ(lengthBytes, plen + 8);
-
-  if (plen == 0) {
-    return 0;
-  }
-  if (lengthBytes < 20) {
-    return 0;
-  }
-  if (payloadSize < static_cast<size_t>((lengthBytes - 20))) {
-    return 0;
-  }
-  lengthBytes -= 20;
-  EXPECT_EQ(lengthBytes, fread(payloadData, 1, lengthBytes, _rtpFile));
-  return lengthBytes;
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/test/RTPFile.h b/modules/audio_coding/test/RTPFile.h
deleted file mode 100644
index 696d41e..0000000
--- a/modules/audio_coding/test/RTPFile.h
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
- *  Copyright (c) 2012 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_TEST_RTPFILE_H_
-#define WEBRTC_MODULES_AUDIO_CODING_TEST_RTPFILE_H_
-
-#include <stdio.h>
-#include <queue>
-
-#include "webrtc/modules/audio_coding/include/audio_coding_module.h"
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/system_wrappers/include/rw_lock_wrapper.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-class RTPStream {
- public:
-  virtual ~RTPStream() {
-  }
-
-  virtual void Write(const uint8_t payloadType, const uint32_t timeStamp,
-                     const int16_t seqNo, const uint8_t* payloadData,
-                     const size_t payloadSize, uint32_t frequency) = 0;
-
-  // Returns the packet's payload size. Zero should be treated as an
-  // end-of-stream (in the case that EndOfFile() is true) or an error.
-  virtual size_t Read(WebRtcRTPHeader* rtpInfo, uint8_t* payloadData,
-                      size_t payloadSize, uint32_t* offset) = 0;
-  virtual bool EndOfFile() const = 0;
-
- protected:
-  void MakeRTPheader(uint8_t* rtpHeader, uint8_t payloadType, int16_t seqNo,
-                     uint32_t timeStamp, uint32_t ssrc);
-
-  void ParseRTPHeader(WebRtcRTPHeader* rtpInfo, const uint8_t* rtpHeader);
-};
-
-class RTPPacket {
- public:
-  RTPPacket(uint8_t payloadType, uint32_t timeStamp, int16_t seqNo,
-            const uint8_t* payloadData, size_t payloadSize,
-            uint32_t frequency);
-
-  ~RTPPacket();
-
-  uint8_t payloadType;
-  uint32_t timeStamp;
-  int16_t seqNo;
-  uint8_t* payloadData;
-  size_t payloadSize;
-  uint32_t frequency;
-};
-
-class RTPBuffer : public RTPStream {
- public:
-  RTPBuffer();
-
-  ~RTPBuffer();
-
-  void Write(const uint8_t payloadType,
-             const uint32_t timeStamp,
-             const int16_t seqNo,
-             const uint8_t* payloadData,
-             const size_t payloadSize,
-             uint32_t frequency) override;
-
-  size_t Read(WebRtcRTPHeader* rtpInfo,
-              uint8_t* payloadData,
-              size_t payloadSize,
-              uint32_t* offset) override;
-
-  bool EndOfFile() const override;
-
- private:
-  RWLockWrapper* _queueRWLock;
-  std::queue<RTPPacket *> _rtpQueue;
-};
-
-class RTPFile : public RTPStream {
- public:
-  ~RTPFile() {
-  }
-
-  RTPFile()
-      : _rtpFile(NULL),
-        _rtpEOF(false) {
-  }
-
-  void Open(const char *outFilename, const char *mode);
-
-  void Close();
-
-  void WriteHeader();
-
-  void ReadHeader();
-
-  void Write(const uint8_t payloadType,
-             const uint32_t timeStamp,
-             const int16_t seqNo,
-             const uint8_t* payloadData,
-             const size_t payloadSize,
-             uint32_t frequency) override;
-
-  size_t Read(WebRtcRTPHeader* rtpInfo,
-              uint8_t* payloadData,
-              size_t payloadSize,
-              uint32_t* offset) override;
-
-  bool EndOfFile() const override { return _rtpEOF; }
-
- private:
-  FILE* _rtpFile;
-  bool _rtpEOF;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_CODING_TEST_RTPFILE_H_
diff --git a/modules/audio_coding/test/TestAllCodecs.cc b/modules/audio_coding/test/TestAllCodecs.cc
deleted file mode 100644
index aedf82c..0000000
--- a/modules/audio_coding/test/TestAllCodecs.cc
+++ /dev/null
@@ -1,490 +0,0 @@
-/*
- *  Copyright (c) 2012 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/test/TestAllCodecs.h"
-
-#include <cstdio>
-#include <limits>
-#include <string>
-
-#include "webrtc/common_types.h"
-#include "webrtc/modules/audio_coding/codecs/audio_format_conversion.h"
-#include "webrtc/modules/audio_coding/include/audio_coding_module.h"
-#include "webrtc/modules/audio_coding/include/audio_coding_module_typedefs.h"
-#include "webrtc/modules/audio_coding/test/utility.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/testsupport/fileutils.h"
-#include "webrtc/typedefs.h"
-
-// Description of the test:
-// In this test we set up a one-way communication channel from a participant
-// called "a" to a participant called "b".
-// a -> channel_a_to_b -> b
-//
-// The test loops through all available mono codecs, encode at "a" sends over
-// the channel, and decodes at "b".
-
-namespace {
-const size_t kVariableSize = std::numeric_limits<size_t>::max();
-}
-
-namespace webrtc {
-
-// Class for simulating packet handling.
-TestPack::TestPack()
-    : receiver_acm_(NULL),
-      sequence_number_(0),
-      timestamp_diff_(0),
-      last_in_timestamp_(0),
-      total_bytes_(0),
-      payload_size_(0) {
-}
-
-TestPack::~TestPack() {
-}
-
-void TestPack::RegisterReceiverACM(AudioCodingModule* acm) {
-  receiver_acm_ = acm;
-  return;
-}
-
-int32_t TestPack::SendData(FrameType frame_type, uint8_t payload_type,
-                           uint32_t timestamp, const uint8_t* payload_data,
-                           size_t payload_size,
-                           const RTPFragmentationHeader* fragmentation) {
-  WebRtcRTPHeader rtp_info;
-  int32_t status;
-
-  rtp_info.header.markerBit = false;
-  rtp_info.header.ssrc = 0;
-  rtp_info.header.sequenceNumber = sequence_number_++;
-  rtp_info.header.payloadType = payload_type;
-  rtp_info.header.timestamp = timestamp;
-  if (frame_type == kAudioFrameCN) {
-    rtp_info.type.Audio.isCNG = true;
-  } else {
-    rtp_info.type.Audio.isCNG = false;
-  }
-  if (frame_type == kEmptyFrame) {
-    // Skip this frame.
-    return 0;
-  }
-
-  // Only run mono for all test cases.
-  rtp_info.type.Audio.channel = 1;
-  memcpy(payload_data_, payload_data, payload_size);
-
-  status = receiver_acm_->IncomingPacket(payload_data_, payload_size, rtp_info);
-
-  payload_size_ = payload_size;
-  timestamp_diff_ = timestamp - last_in_timestamp_;
-  last_in_timestamp_ = timestamp;
-  total_bytes_ += payload_size;
-  return status;
-}
-
-size_t TestPack::payload_size() {
-  return payload_size_;
-}
-
-uint32_t TestPack::timestamp_diff() {
-  return timestamp_diff_;
-}
-
-void TestPack::reset_payload_size() {
-  payload_size_ = 0;
-}
-
-TestAllCodecs::TestAllCodecs(int test_mode)
-    : acm_a_(AudioCodingModule::Create(0)),
-      acm_b_(AudioCodingModule::Create(1)),
-      channel_a_to_b_(NULL),
-      test_count_(0),
-      packet_size_samples_(0),
-      packet_size_bytes_(0) {
-  // test_mode = 0 for silent test (auto test)
-  test_mode_ = test_mode;
-}
-
-TestAllCodecs::~TestAllCodecs() {
-  if (channel_a_to_b_ != NULL) {
-    delete channel_a_to_b_;
-    channel_a_to_b_ = NULL;
-  }
-}
-
-void TestAllCodecs::Perform() {
-  const std::string file_name = webrtc::test::ResourcePath(
-      "audio_coding/testfile32kHz", "pcm");
-  infile_a_.Open(file_name, 32000, "rb");
-
-  if (test_mode_ == 0) {
-    LOG(LS_INFO) << "---------- TestAllCodecs ----------";
-  }
-
-  acm_a_->InitializeReceiver();
-  acm_b_->InitializeReceiver();
-
-  uint8_t num_encoders = acm_a_->NumberOfCodecs();
-  CodecInst my_codec_param;
-  for (uint8_t n = 0; n < num_encoders; n++) {
-    acm_b_->Codec(n, &my_codec_param);
-    if (!strcmp(my_codec_param.plname, "opus")) {
-      my_codec_param.channels = 1;
-    }
-    acm_b_->RegisterReceiveCodec(my_codec_param.pltype,
-                                 CodecInstToSdp(my_codec_param));
-  }
-
-  // Create and connect the channel
-  channel_a_to_b_ = new TestPack;
-  acm_a_->RegisterTransportCallback(channel_a_to_b_);
-  channel_a_to_b_->RegisterReceiverACM(acm_b_.get());
-
-  // All codecs are tested for all allowed sampling frequencies, rates and
-  // packet sizes.
-#ifdef WEBRTC_CODEC_G722
-  if (test_mode_ != 0) {
-    printf("===============================================================\n");
-  }
-  test_count_++;
-  OpenOutFile(test_count_);
-  char codec_g722[] = "G722";
-  RegisterSendCodec('A', codec_g722, 16000, 64000, 160, 0);
-  Run(channel_a_to_b_);
-  RegisterSendCodec('A', codec_g722, 16000, 64000, 320, 0);
-  Run(channel_a_to_b_);
-  RegisterSendCodec('A', codec_g722, 16000, 64000, 480, 0);
-  Run(channel_a_to_b_);
-  RegisterSendCodec('A', codec_g722, 16000, 64000, 640, 0);
-  Run(channel_a_to_b_);
-  RegisterSendCodec('A', codec_g722, 16000, 64000, 800, 0);
-  Run(channel_a_to_b_);
-  RegisterSendCodec('A', codec_g722, 16000, 64000, 960, 0);
-  Run(channel_a_to_b_);
-  outfile_b_.Close();
-#endif
-#ifdef WEBRTC_CODEC_ILBC
-  if (test_mode_ != 0) {
-    printf("===============================================================\n");
-  }
-  test_count_++;
-  OpenOutFile(test_count_);
-  char codec_ilbc[] = "ILBC";
-  RegisterSendCodec('A', codec_ilbc, 8000, 13300, 240, 0);
-  Run(channel_a_to_b_);
-  RegisterSendCodec('A', codec_ilbc, 8000, 13300, 480, 0);
-  Run(channel_a_to_b_);
-  RegisterSendCodec('A', codec_ilbc, 8000, 15200, 160, 0);
-  Run(channel_a_to_b_);
-  RegisterSendCodec('A', codec_ilbc, 8000, 15200, 320, 0);
-  Run(channel_a_to_b_);
-  outfile_b_.Close();
-#endif
-#if (defined(WEBRTC_CODEC_ISAC) || defined(WEBRTC_CODEC_ISACFX))
-  if (test_mode_ != 0) {
-    printf("===============================================================\n");
-  }
-  test_count_++;
-  OpenOutFile(test_count_);
-  char codec_isac[] = "ISAC";
-  RegisterSendCodec('A', codec_isac, 16000, -1, 480, kVariableSize);
-  Run(channel_a_to_b_);
-  RegisterSendCodec('A', codec_isac, 16000, -1, 960, kVariableSize);
-  Run(channel_a_to_b_);
-  RegisterSendCodec('A', codec_isac, 16000, 15000, 480, kVariableSize);
-  Run(channel_a_to_b_);
-  RegisterSendCodec('A', codec_isac, 16000, 32000, 960, kVariableSize);
-  Run(channel_a_to_b_);
-  outfile_b_.Close();
-#endif
-#ifdef WEBRTC_CODEC_ISAC
-  if (test_mode_ != 0) {
-    printf("===============================================================\n");
-  }
-  test_count_++;
-  OpenOutFile(test_count_);
-  RegisterSendCodec('A', codec_isac, 32000, -1, 960, kVariableSize);
-  Run(channel_a_to_b_);
-  RegisterSendCodec('A', codec_isac, 32000, 56000, 960, kVariableSize);
-  Run(channel_a_to_b_);
-  RegisterSendCodec('A', codec_isac, 32000, 37000, 960, kVariableSize);
-  Run(channel_a_to_b_);
-  RegisterSendCodec('A', codec_isac, 32000, 32000, 960, kVariableSize);
-  Run(channel_a_to_b_);
-  outfile_b_.Close();
-#endif
-  if (test_mode_ != 0) {
-    printf("===============================================================\n");
-  }
-  test_count_++;
-  OpenOutFile(test_count_);
-  char codec_l16[] = "L16";
-  RegisterSendCodec('A', codec_l16, 8000, 128000, 80, 0);
-  Run(channel_a_to_b_);
-  RegisterSendCodec('A', codec_l16, 8000, 128000, 160, 0);
-  Run(channel_a_to_b_);
-  RegisterSendCodec('A', codec_l16, 8000, 128000, 240, 0);
-  Run(channel_a_to_b_);
-  RegisterSendCodec('A', codec_l16, 8000, 128000, 320, 0);
-  Run(channel_a_to_b_);
-  outfile_b_.Close();
-  if (test_mode_ != 0) {
-    printf("===============================================================\n");
-  }
-  test_count_++;
-  OpenOutFile(test_count_);
-  RegisterSendCodec('A', codec_l16, 16000, 256000, 160, 0);
-  Run(channel_a_to_b_);
-  RegisterSendCodec('A', codec_l16, 16000, 256000, 320, 0);
-  Run(channel_a_to_b_);
-  RegisterSendCodec('A', codec_l16, 16000, 256000, 480, 0);
-  Run(channel_a_to_b_);
-  RegisterSendCodec('A', codec_l16, 16000, 256000, 640, 0);
-  Run(channel_a_to_b_);
-  outfile_b_.Close();
-  if (test_mode_ != 0) {
-    printf("===============================================================\n");
-  }
-  test_count_++;
-  OpenOutFile(test_count_);
-  RegisterSendCodec('A', codec_l16, 32000, 512000, 320, 0);
-  Run(channel_a_to_b_);
-  RegisterSendCodec('A', codec_l16, 32000, 512000, 640, 0);
-  Run(channel_a_to_b_);
-  outfile_b_.Close();
-  if (test_mode_ != 0) {
-    printf("===============================================================\n");
-  }
-  test_count_++;
-  OpenOutFile(test_count_);
-  char codec_pcma[] = "PCMA";
-  RegisterSendCodec('A', codec_pcma, 8000, 64000, 80, 0);
-  Run(channel_a_to_b_);
-  RegisterSendCodec('A', codec_pcma, 8000, 64000, 160, 0);
-  Run(channel_a_to_b_);
-  RegisterSendCodec('A', codec_pcma, 8000, 64000, 240, 0);
-  Run(channel_a_to_b_);
-  RegisterSendCodec('A', codec_pcma, 8000, 64000, 320, 0);
-  Run(channel_a_to_b_);
-  RegisterSendCodec('A', codec_pcma, 8000, 64000, 400, 0);
-  Run(channel_a_to_b_);
-  RegisterSendCodec('A', codec_pcma, 8000, 64000, 480, 0);
-  Run(channel_a_to_b_);
-  if (test_mode_ != 0) {
-    printf("===============================================================\n");
-  }
-  char codec_pcmu[] = "PCMU";
-  RegisterSendCodec('A', codec_pcmu, 8000, 64000, 80, 0);
-  Run(channel_a_to_b_);
-  RegisterSendCodec('A', codec_pcmu, 8000, 64000, 160, 0);
-  Run(channel_a_to_b_);
-  RegisterSendCodec('A', codec_pcmu, 8000, 64000, 240, 0);
-  Run(channel_a_to_b_);
-  RegisterSendCodec('A', codec_pcmu, 8000, 64000, 320, 0);
-  Run(channel_a_to_b_);
-  RegisterSendCodec('A', codec_pcmu, 8000, 64000, 400, 0);
-  Run(channel_a_to_b_);
-  RegisterSendCodec('A', codec_pcmu, 8000, 64000, 480, 0);
-  Run(channel_a_to_b_);
-  outfile_b_.Close();
-#ifdef WEBRTC_CODEC_OPUS
-  if (test_mode_ != 0) {
-    printf("===============================================================\n");
-  }
-  test_count_++;
-  OpenOutFile(test_count_);
-  char codec_opus[] = "OPUS";
-  RegisterSendCodec('A', codec_opus, 48000, 6000, 480, kVariableSize);
-  Run(channel_a_to_b_);
-  RegisterSendCodec('A', codec_opus, 48000, 20000, 480*2, kVariableSize);
-  Run(channel_a_to_b_);
-  RegisterSendCodec('A', codec_opus, 48000, 32000, 480*4, kVariableSize);
-  Run(channel_a_to_b_);
-  RegisterSendCodec('A', codec_opus, 48000, 48000, 480, kVariableSize);
-  Run(channel_a_to_b_);
-  RegisterSendCodec('A', codec_opus, 48000, 64000, 480*4, kVariableSize);
-  Run(channel_a_to_b_);
-  RegisterSendCodec('A', codec_opus, 48000, 96000, 480*6, kVariableSize);
-  Run(channel_a_to_b_);
-  RegisterSendCodec('A', codec_opus, 48000, 500000, 480*2, kVariableSize);
-  Run(channel_a_to_b_);
-  outfile_b_.Close();
-#endif
-  if (test_mode_ != 0) {
-    printf("===============================================================\n");
-
-    /* Print out all codecs that were not tested in the run */
-    printf("The following codecs was not included in the test:\n");
-#ifndef WEBRTC_CODEC_G722
-    printf("   G.722\n");
-#endif
-#ifndef WEBRTC_CODEC_ILBC
-    printf("   iLBC\n");
-#endif
-#ifndef WEBRTC_CODEC_ISAC
-    printf("   ISAC float\n");
-#endif
-#ifndef WEBRTC_CODEC_ISACFX
-    printf("   ISAC fix\n");
-#endif
-
-    printf("\nTo complete the test, listen to the %d number of output files.\n",
-           test_count_);
-  }
-}
-
-// Register Codec to use in the test
-//
-// Input:  side             - which ACM to use, 'A' or 'B'
-//         codec_name       - name to use when register the codec
-//         sampling_freq_hz - sampling frequency in Herz
-//         rate             - bitrate in bytes
-//         packet_size      - packet size in samples
-//         extra_byte       - if extra bytes needed compared to the bitrate
-//                            used when registering, can be an internal header
-//                            set to kVariableSize if the codec is a variable
-//                            rate codec
-void TestAllCodecs::RegisterSendCodec(char side, char* codec_name,
-                                      int32_t sampling_freq_hz, int rate,
-                                      int packet_size, size_t extra_byte) {
-  if (test_mode_ != 0) {
-    // Print out codec and settings.
-    printf("codec: %s Freq: %d Rate: %d PackSize: %d\n", codec_name,
-           sampling_freq_hz, rate, packet_size);
-  }
-
-  // Store packet-size in samples, used to validate the received packet.
-  // If G.722, store half the size to compensate for the timestamp bug in the
-  // RFC for G.722.
-  // If iSAC runs in adaptive mode, packet size in samples can change on the
-  // fly, so we exclude this test by setting |packet_size_samples_| to -1.
-  if (!strcmp(codec_name, "G722")) {
-    packet_size_samples_ = packet_size / 2;
-  } else if (!strcmp(codec_name, "ISAC") && (rate == -1)) {
-    packet_size_samples_ = -1;
-  } else {
-    packet_size_samples_ = packet_size;
-  }
-
-  // Store the expected packet size in bytes, used to validate the received
-  // packet. If variable rate codec (extra_byte == -1), set to -1.
-  if (extra_byte != kVariableSize) {
-    // Add 0.875 to always round up to a whole byte
-    packet_size_bytes_ = static_cast<size_t>(
-        static_cast<float>(packet_size * rate) /
-        static_cast<float>(sampling_freq_hz * 8) + 0.875) + extra_byte;
-  } else {
-    // Packets will have a variable size.
-    packet_size_bytes_ = kVariableSize;
-  }
-
-  // Set pointer to the ACM where to register the codec.
-  AudioCodingModule* my_acm = NULL;
-  switch (side) {
-    case 'A': {
-      my_acm = acm_a_.get();
-      break;
-    }
-    case 'B': {
-      my_acm = acm_b_.get();
-      break;
-    }
-    default: {
-      break;
-    }
-  }
-  ASSERT_TRUE(my_acm != NULL);
-
-  // Get all codec parameters before registering
-  CodecInst my_codec_param;
-  CHECK_ERROR(AudioCodingModule::Codec(codec_name, &my_codec_param,
-                                       sampling_freq_hz, 1));
-  my_codec_param.rate = rate;
-  my_codec_param.pacsize = packet_size;
-  CHECK_ERROR(my_acm->RegisterSendCodec(my_codec_param));
-}
-
-void TestAllCodecs::Run(TestPack* channel) {
-  AudioFrame audio_frame;
-
-  int32_t out_freq_hz = outfile_b_.SamplingFrequency();
-  size_t receive_size;
-  uint32_t timestamp_diff;
-  channel->reset_payload_size();
-  int error_count = 0;
-  int counter = 0;
-  // Set test length to 500 ms (50 blocks of 10 ms each).
-  infile_a_.SetNum10MsBlocksToRead(50);
-  // Fast-forward 1 second (100 blocks) since the file starts with silence.
-  infile_a_.FastForward(100);
-
-  while (!infile_a_.EndOfFile()) {
-    // Add 10 msec to ACM.
-    infile_a_.Read10MsData(audio_frame);
-    CHECK_ERROR(acm_a_->Add10MsData(audio_frame));
-
-    // Verify that the received packet size matches the settings.
-    receive_size = channel->payload_size();
-    if (receive_size) {
-      if ((receive_size != packet_size_bytes_) &&
-          (packet_size_bytes_ != kVariableSize)) {
-        error_count++;
-      }
-
-      // Verify that the timestamp is updated with expected length. The counter
-      // is used to avoid problems when switching codec or frame size in the
-      // test.
-      timestamp_diff = channel->timestamp_diff();
-      if ((counter > 10) &&
-          (static_cast<int>(timestamp_diff) != packet_size_samples_) &&
-          (packet_size_samples_ > -1))
-        error_count++;
-    }
-
-    // Run received side of ACM.
-    bool muted;
-    CHECK_ERROR(acm_b_->PlayoutData10Ms(out_freq_hz, &audio_frame, &muted));
-    ASSERT_FALSE(muted);
-
-    // Write output speech to file.
-    outfile_b_.Write10MsData(audio_frame.data(),
-                             audio_frame.samples_per_channel_);
-
-    // Update loop counter
-    counter++;
-  }
-
-  EXPECT_EQ(0, error_count);
-
-  if (infile_a_.EndOfFile()) {
-    infile_a_.Rewind();
-  }
-}
-
-void TestAllCodecs::OpenOutFile(int test_number) {
-  std::string filename = webrtc::test::OutputPath();
-  std::ostringstream test_number_str;
-  test_number_str << test_number;
-  filename += "testallcodecs_out_";
-  filename += test_number_str.str();
-  filename += ".pcm";
-  outfile_b_.Open(filename, 32000, "wb");
-}
-
-void TestAllCodecs::DisplaySendReceiveCodec() {
-  CodecInst my_codec_param;
-  printf("%s -> ", acm_a_->SendCodec()->plname);
-  acm_b_->ReceiveCodec(&my_codec_param);
-  printf("%s\n", my_codec_param.plname);
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/test/TestAllCodecs.h b/modules/audio_coding/test/TestAllCodecs.h
deleted file mode 100644
index 7df139b..0000000
--- a/modules/audio_coding/test/TestAllCodecs.h
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- *  Copyright (c) 2012 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_TEST_TESTALLCODECS_H_
-#define WEBRTC_MODULES_AUDIO_CODING_TEST_TESTALLCODECS_H_
-
-#include <memory>
-
-#include "webrtc/modules/audio_coding/test/ACMTest.h"
-#include "webrtc/modules/audio_coding/test/Channel.h"
-#include "webrtc/modules/audio_coding/test/PCMFile.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-class TestPack : public AudioPacketizationCallback {
- public:
-  TestPack();
-  ~TestPack();
-
-  void RegisterReceiverACM(AudioCodingModule* acm);
-
-  int32_t SendData(FrameType frame_type,
-                   uint8_t payload_type,
-                   uint32_t timestamp,
-                   const uint8_t* payload_data,
-                   size_t payload_size,
-                   const RTPFragmentationHeader* fragmentation) override;
-
-  size_t payload_size();
-  uint32_t timestamp_diff();
-  void reset_payload_size();
-
- private:
-  AudioCodingModule* receiver_acm_;
-  uint16_t sequence_number_;
-  uint8_t payload_data_[60 * 32 * 2 * 2];
-  uint32_t timestamp_diff_;
-  uint32_t last_in_timestamp_;
-  uint64_t total_bytes_;
-  size_t payload_size_;
-};
-
-class TestAllCodecs : public ACMTest {
- public:
-  explicit TestAllCodecs(int test_mode);
-  ~TestAllCodecs();
-
-  void Perform() override;
-
- private:
-  // The default value of '-1' indicates that the registration is based only on
-  // codec name, and a sampling frequency matching is not required.
-  // This is useful for codecs which support several sampling frequency.
-  // Note! Only mono mode is tested in this test.
-  void RegisterSendCodec(char side, char* codec_name, int32_t sampling_freq_hz,
-                         int rate, int packet_size, size_t extra_byte);
-
-  void Run(TestPack* channel);
-  void OpenOutFile(int test_number);
-  void DisplaySendReceiveCodec();
-
-  int test_mode_;
-  std::unique_ptr<AudioCodingModule> acm_a_;
-  std::unique_ptr<AudioCodingModule> acm_b_;
-  TestPack* channel_a_to_b_;
-  PCMFile infile_a_;
-  PCMFile outfile_b_;
-  int test_count_;
-  int packet_size_samples_;
-  size_t packet_size_bytes_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_CODING_TEST_TESTALLCODECS_H_
diff --git a/modules/audio_coding/test/TestRedFec.cc b/modules/audio_coding/test/TestRedFec.cc
deleted file mode 100644
index 4ec3ed1..0000000
--- a/modules/audio_coding/test/TestRedFec.cc
+++ /dev/null
@@ -1,482 +0,0 @@
-/*
- *  Copyright (c) 2012 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/test/TestRedFec.h"
-
-#include <assert.h>
-
-#include "webrtc/common_types.h"
-#include "webrtc/modules/audio_coding/codecs/audio_format_conversion.h"
-#include "webrtc/modules/audio_coding/include/audio_coding_module_typedefs.h"
-#include "webrtc/modules/audio_coding/test/utility.h"
-#include "webrtc/test/testsupport/fileutils.h"
-#include "webrtc/typedefs.h"
-
-#ifdef SUPPORT_RED_WB
-#undef SUPPORT_RED_WB
-#endif
-
-#ifdef SUPPORT_RED_SWB
-#undef SUPPORT_RED_SWB
-#endif
-
-#ifdef SUPPORT_RED_FB
-#undef SUPPORT_RED_FB
-#endif
-
-namespace webrtc {
-
-namespace {
-  const char kNameL16[] = "L16";
-  const char kNamePCMU[] = "PCMU";
-  const char kNameCN[] = "CN";
-  const char kNameRED[] = "RED";
-
-  // These three are only used by code #ifdeffed on WEBRTC_CODEC_G722.
-#ifdef WEBRTC_CODEC_G722
-  const char kNameISAC[] = "ISAC";
-  const char kNameG722[] = "G722";
-  const char kNameOPUS[] = "opus";
-#endif
-}
-
-TestRedFec::TestRedFec()
-    : _acmA(AudioCodingModule::Create(0)),
-      _acmB(AudioCodingModule::Create(1)),
-      _channelA2B(NULL),
-      _testCntr(0) {
-}
-
-TestRedFec::~TestRedFec() {
-  if (_channelA2B != NULL) {
-    delete _channelA2B;
-    _channelA2B = NULL;
-  }
-}
-
-void TestRedFec::Perform() {
-  const std::string file_name = webrtc::test::ResourcePath(
-      "audio_coding/testfile32kHz", "pcm");
-  _inFileA.Open(file_name, 32000, "rb");
-
-  ASSERT_EQ(0, _acmA->InitializeReceiver());
-  ASSERT_EQ(0, _acmB->InitializeReceiver());
-
-  uint8_t numEncoders = _acmA->NumberOfCodecs();
-  CodecInst myCodecParam;
-  for (uint8_t n = 0; n < numEncoders; n++) {
-    EXPECT_EQ(0, _acmB->Codec(n, &myCodecParam));
-    // Default number of channels is 2 for opus, so we change to 1 in this test.
-    if (!strcmp(myCodecParam.plname, "opus")) {
-      myCodecParam.channels = 1;
-    }
-    EXPECT_EQ(true, _acmB->RegisterReceiveCodec(myCodecParam.pltype,
-                                                CodecInstToSdp(myCodecParam)));
-  }
-
-  // Create and connect the channel
-  _channelA2B = new Channel;
-  _acmA->RegisterTransportCallback(_channelA2B);
-  _channelA2B->RegisterReceiverACM(_acmB.get());
-
-  EXPECT_EQ(0, RegisterSendCodec('A', kNameL16, 8000));
-  EXPECT_EQ(0, RegisterSendCodec('A', kNameCN, 8000));
-  EXPECT_EQ(0, RegisterSendCodec('A', kNameRED));
-  EXPECT_EQ(0, SetVAD(true, true, VADAggr));
-  EXPECT_EQ(0, _acmA->SetREDStatus(true));
-  EXPECT_TRUE(_acmA->REDStatus());
-
-  OpenOutFile(_testCntr);
-  Run();
-  _outFileB.Close();
-
-  RegisterSendCodec('A', kNamePCMU, 8000);
-  // Switch to another 8 kHz codec, RED should remain switched on.
-  EXPECT_TRUE(_acmA->REDStatus());
-  OpenOutFile(_testCntr);
-  Run();
-  _outFileB.Close();
-
-#ifndef WEBRTC_CODEC_G722
-  EXPECT_TRUE(false);
-  printf("G722 needs to be activated to run this test\n");
-  return;
-#else
-  EXPECT_EQ(0, RegisterSendCodec('A', kNameG722, 16000));
-  EXPECT_EQ(0, RegisterSendCodec('A', kNameCN, 16000));
-
-#ifdef SUPPORT_RED_WB
-  // Switch codec, RED should remain.
-  EXPECT_TRUE(_acmA->REDStatus());
-#else
-  // Switch to a 16 kHz codec, RED should have been switched off.
-  EXPECT_FALSE(_acmA->REDStatus());
-#endif
-
-  OpenOutFile(_testCntr);
-  EXPECT_EQ(0, SetVAD(true, true, VADAggr));
-  EXPECT_EQ(0, _acmA->SetREDStatus(false));
-  EXPECT_FALSE(_acmA->REDStatus());
-  Run();
-#ifdef SUPPORT_RED_WB
-  EXPECT_EQ(0, _acmA->SetREDStatus(true));
-  EXPECT_TRUE(_acmA->REDStatus());
-#else
-  EXPECT_EQ(-1, _acmA->SetREDStatus(true));
-  EXPECT_FALSE(_acmA->REDStatus());
-#endif
-  Run();
-  _outFileB.Close();
-
-  RegisterSendCodec('A', kNameISAC, 16000);
-
-#ifdef SUPPORT_RED_WB
-  // Switch codec, RED should remain.
-  EXPECT_TRUE(_acmA->REDStatus());
-#else
-  EXPECT_FALSE(_acmA->REDStatus());
-#endif
-
-  OpenOutFile(_testCntr);
-  EXPECT_EQ(0, SetVAD(true, true, VADVeryAggr));
-  EXPECT_EQ(0, _acmA->SetREDStatus(false));
-  EXPECT_FALSE(_acmA->REDStatus());
-  Run();
-  _outFileB.Close();
-
-#ifdef SUPPORT_RED_WB
-  EXPECT_EQ(0, _acmA->SetREDStatus(true));
-  EXPECT_TRUE(_acmA->REDStatus());
-#else
-  EXPECT_EQ(-1, _acmA->SetREDStatus(true));
-  EXPECT_FALSE(_acmA->REDStatus());
-#endif
-  OpenOutFile(_testCntr);
-  Run();
-  _outFileB.Close();
-
-  RegisterSendCodec('A', kNameISAC, 32000);
-
-#if defined(SUPPORT_RED_SWB) && defined(SUPPORT_RED_WB)
-  // Switch codec, RED should remain.
-  EXPECT_TRUE(_acmA->REDStatus());
-#else
-  // Switch to a 32 kHz codec, RED should have been switched off.
-  EXPECT_FALSE(_acmA->REDStatus());
-#endif
-
-  OpenOutFile(_testCntr);
-  EXPECT_EQ(0, SetVAD(true, true, VADVeryAggr));
-  EXPECT_EQ(0, _acmA->SetREDStatus(false));
-  EXPECT_FALSE(_acmA->REDStatus());
-  Run();
-  _outFileB.Close();
-
-#ifdef SUPPORT_RED_SWB
-  EXPECT_EQ(0, _acmA->SetREDStatus(true));
-  EXPECT_TRUE(_acmA->REDStatus());
-#else
-  EXPECT_EQ(-1, _acmA->SetREDStatus(true));
-  EXPECT_FALSE(_acmA->REDStatus());
-#endif
-  OpenOutFile(_testCntr);
-  Run();
-  _outFileB.Close();
-
-  RegisterSendCodec('A', kNameISAC, 32000);
-  EXPECT_EQ(0, SetVAD(false, false, VADNormal));
-
-#if defined(SUPPORT_RED_SWB) && defined(SUPPORT_RED_WB)
-  OpenOutFile(_testCntr);
-  EXPECT_EQ(0, _acmA->SetREDStatus(true));
-  EXPECT_TRUE(_acmA->REDStatus());
-  Run();
-
-  RegisterSendCodec('A', kNameISAC, 16000);
-  EXPECT_TRUE(_acmA->REDStatus());
-  Run();
-
-  RegisterSendCodec('A', kNameISAC, 32000);
-  EXPECT_TRUE(_acmA->REDStatus());
-  Run();
-
-  RegisterSendCodec('A', kNameISAC, 16000);
-  EXPECT_TRUE(_acmA->REDStatus());
-  Run();
-  _outFileB.Close();
-#else
-  EXPECT_EQ(-1, _acmA->SetREDStatus(true));
-  EXPECT_FALSE(_acmA->REDStatus());
-#endif
-
-  _channelA2B->SetFECTestWithPacketLoss(true);
-  // Following tests are under packet losses.
-
-  EXPECT_EQ(0, RegisterSendCodec('A', kNameG722));
-  EXPECT_EQ(0, RegisterSendCodec('A', kNameCN, 16000));
-
-#if defined(SUPPORT_RED_WB) && defined(SUPPORT_RED_SWB)
-  // Switch codec, RED should remain.
-  EXPECT_TRUE(_acmA->REDStatus());
-#else
-  // Switch to a 16 kHz codec, RED should have been switched off.
-  EXPECT_FALSE(_acmA->REDStatus());
-#endif
-
-  OpenOutFile(_testCntr);
-  EXPECT_EQ(0, SetVAD(true, true, VADAggr));
-  EXPECT_EQ(0, _acmA->SetREDStatus(false));
-  EXPECT_FALSE(_acmA->REDStatus());
-  Run();
-  _outFileB.Close();
-
-#ifdef SUPPORT_RED_WB
-  EXPECT_EQ(0, _acmA->SetREDStatus(true));
-  EXPECT_TRUE(_acmA->REDStatus());
-#else
-  EXPECT_EQ(-1, _acmA->SetREDStatus(true));
-  EXPECT_FALSE(_acmA->REDStatus());
-#endif
-  OpenOutFile(_testCntr);
-  Run();
-  _outFileB.Close();
-
-  RegisterSendCodec('A', kNameISAC, 16000);
-
-#ifdef SUPPORT_RED_WB
-  // Switch codec, RED should remain.
-  EXPECT_TRUE(_acmA->REDStatus());
-#else
-  // Switch to a 16 kHz codec, RED should have been switched off.
-  EXPECT_FALSE(_acmA->REDStatus());
-#endif
-
-  OpenOutFile(_testCntr);
-  EXPECT_EQ(0, SetVAD(true, true, VADVeryAggr));
-  EXPECT_EQ(0, _acmA->SetREDStatus(false));
-  EXPECT_FALSE(_acmA->REDStatus());
-  Run();
-  _outFileB.Close();
-#ifdef SUPPORT_RED_WB
-  EXPECT_EQ(0, _acmA->SetREDStatus(true));
-  EXPECT_TRUE(_acmA->REDStatus());
-#else
-  EXPECT_EQ(-1, _acmA->SetREDStatus(true));
-  EXPECT_FALSE(_acmA->REDStatus());
-#endif
-  OpenOutFile(_testCntr);
-  Run();
-  _outFileB.Close();
-
-  RegisterSendCodec('A', kNameISAC, 32000);
-
-#if defined(SUPPORT_RED_SWB) && defined(SUPPORT_RED_WB)
-  // Switch codec, RED should remain.
-  EXPECT_TRUE(_acmA->REDStatus());
-#else
-  // Switch to a 32 kHz codec, RED should have been switched off.
-  EXPECT_FALSE(_acmA->REDStatus());
-#endif
-
-  OpenOutFile(_testCntr);
-  EXPECT_EQ(0, SetVAD(true, true, VADVeryAggr));
-  EXPECT_EQ(0, _acmA->SetREDStatus(false));
-  EXPECT_FALSE(_acmA->REDStatus());
-#ifdef SUPPORT_RED_SWB
-  EXPECT_EQ(0, _acmA->SetREDStatus(true));
-  EXPECT_TRUE(_acmA->REDStatus());
-#else
-  EXPECT_EQ(-1, _acmA->SetREDStatus(true));
-  EXPECT_FALSE(_acmA->REDStatus());
-#endif
-  OpenOutFile(_testCntr);
-  Run();
-  _outFileB.Close();
-
-  RegisterSendCodec('A', kNameISAC, 32000);
-  EXPECT_EQ(0, SetVAD(false, false, VADNormal));
-#if defined(SUPPORT_RED_SWB) && defined(SUPPORT_RED_WB)
-  OpenOutFile(_testCntr);
-  EXPECT_EQ(0, _acmA->SetREDStatus(true));
-  EXPECT_TRUE(_acmA->REDStatus());
-  Run();
-
-  RegisterSendCodec('A', kNameISAC, 16000);
-  EXPECT_TRUE(_acmA->REDStatus());
-  Run();
-
-  RegisterSendCodec('A', kNameISAC, 32000);
-  EXPECT_TRUE(_acmA->REDStatus());
-  Run();
-
-  RegisterSendCodec('A', kNameISAC, 16000);
-  EXPECT_TRUE(_acmA->REDStatus());
-  Run();
-  _outFileB.Close();
-#else
-  EXPECT_EQ(-1, _acmA->SetREDStatus(true));
-  EXPECT_FALSE(_acmA->REDStatus());
-#endif
-
-#ifndef WEBRTC_CODEC_OPUS
-  EXPECT_TRUE(false);
-  printf("Opus needs to be activated to run this test\n");
-  return;
-#endif
-
-  RegisterSendCodec('A', kNameOPUS, 48000);
-
-#if defined(SUPPORT_RED_FB) && defined(SUPPORT_RED_SWB) &&\
-  defined(SUPPORT_RED_WB)
-  // Switch to codec, RED should remain switched on.
-  EXPECT_TRUE(_acmA->REDStatus());
-#else
-  EXPECT_FALSE(_acmA->REDStatus());
-#endif
-
-  // _channelA2B imposes 25% packet loss rate.
-  EXPECT_EQ(0, _acmA->SetPacketLossRate(25));
-
-#ifdef SUPPORT_RED_FB
-  EXPECT_EQ(0, _acmA->SetREDStatus(true));
-  EXPECT_TRUE(_acmA->REDStatus());
-  // Codec FEC and RED are mutually exclusive.
-  EXPECT_EQ(-1, _acmA->SetCodecFEC(true));
-
-  EXPECT_EQ(0, _acmA->SetREDStatus(false));
-  EXPECT_EQ(0, _acmA->SetCodecFEC(true));
-
-  // Codec FEC and RED are mutually exclusive.
-  EXPECT_EQ(-1, _acmA->SetREDStatus(true));
-#else
-  EXPECT_EQ(-1, _acmA->SetREDStatus(true));
-  EXPECT_FALSE(_acmA->REDStatus());
-  EXPECT_EQ(0, _acmA->SetCodecFEC(true));
-#endif
-
-  EXPECT_TRUE(_acmA->CodecFEC());
-  OpenOutFile(_testCntr);
-  Run();
-
-  // Switch to L16 with RED.
-  RegisterSendCodec('A', kNameL16, 8000);
-  EXPECT_EQ(0, SetVAD(false, false, VADNormal));
-
-  // L16 does not support FEC, so FEC should be turned off automatically.
-  EXPECT_FALSE(_acmA->CodecFEC());
-
-  EXPECT_EQ(0, _acmA->SetREDStatus(true));
-  EXPECT_TRUE(_acmA->REDStatus());
-  Run();
-
-  // Switch to Opus again.
-  RegisterSendCodec('A', kNameOPUS, 48000);
-#ifdef SUPPORT_RED_FB
-  // Switch to codec, RED should remain switched on.
-  EXPECT_TRUE(_acmA->REDStatus());
-#else
-  EXPECT_FALSE(_acmA->REDStatus());
-#endif
-  EXPECT_EQ(0, _acmA->SetREDStatus(false));
-  EXPECT_EQ(0, _acmA->SetCodecFEC(false));
-  Run();
-
-  EXPECT_EQ(0, _acmA->SetCodecFEC(true));
-  _outFileB.Close();
-
-  // Codecs does not support internal FEC, cannot enable FEC.
-  RegisterSendCodec('A', kNameG722, 16000);
-  EXPECT_FALSE(_acmA->REDStatus());
-  EXPECT_EQ(-1, _acmA->SetCodecFEC(true));
-  EXPECT_FALSE(_acmA->CodecFEC());
-
-  RegisterSendCodec('A', kNameISAC, 16000);
-  EXPECT_FALSE(_acmA->REDStatus());
-  EXPECT_EQ(-1, _acmA->SetCodecFEC(true));
-  EXPECT_FALSE(_acmA->CodecFEC());
-
-  // Codecs does not support internal FEC, disable FEC does not trigger failure.
-  RegisterSendCodec('A', kNameG722, 16000);
-  EXPECT_FALSE(_acmA->REDStatus());
-  EXPECT_EQ(0, _acmA->SetCodecFEC(false));
-  EXPECT_FALSE(_acmA->CodecFEC());
-
-  RegisterSendCodec('A', kNameISAC, 16000);
-  EXPECT_FALSE(_acmA->REDStatus());
-  EXPECT_EQ(0, _acmA->SetCodecFEC(false));
-  EXPECT_FALSE(_acmA->CodecFEC());
-
-#endif  // defined(WEBRTC_CODEC_G722)
-}
-
-int32_t TestRedFec::SetVAD(bool enableDTX, bool enableVAD, ACMVADMode vadMode) {
-  return _acmA->SetVAD(enableDTX, enableVAD, vadMode);
-}
-
-int16_t TestRedFec::RegisterSendCodec(char side, const char* codecName,
-                                      int32_t samplingFreqHz) {
-  std::cout << std::flush;
-  AudioCodingModule* myACM;
-  switch (side) {
-    case 'A': {
-      myACM = _acmA.get();
-      break;
-    }
-    case 'B': {
-      myACM = _acmB.get();
-      break;
-    }
-    default:
-      return -1;
-  }
-
-  if (myACM == NULL) {
-    assert(false);
-    return -1;
-  }
-  CodecInst myCodecParam;
-  EXPECT_GT(AudioCodingModule::Codec(codecName, &myCodecParam,
-                                     samplingFreqHz, 1), -1);
-  EXPECT_GT(myACM->RegisterSendCodec(myCodecParam), -1);
-
-  // Initialization was successful.
-  return 0;
-}
-
-void TestRedFec::Run() {
-  AudioFrame audioFrame;
-  int32_t outFreqHzB = _outFileB.SamplingFrequency();
-  // Set test length to 500 ms (50 blocks of 10 ms each).
-  _inFileA.SetNum10MsBlocksToRead(50);
-  // Fast-forward 1 second (100 blocks) since the file starts with silence.
-  _inFileA.FastForward(100);
-
-  while (!_inFileA.EndOfFile()) {
-    EXPECT_GT(_inFileA.Read10MsData(audioFrame), 0);
-    EXPECT_GE(_acmA->Add10MsData(audioFrame), 0);
-    bool muted;
-    EXPECT_EQ(0, _acmB->PlayoutData10Ms(outFreqHzB, &audioFrame, &muted));
-    ASSERT_FALSE(muted);
-    _outFileB.Write10MsData(audioFrame.data(), audioFrame.samples_per_channel_);
-  }
-  _inFileA.Rewind();
-}
-
-void TestRedFec::OpenOutFile(int16_t test_number) {
-  std::string file_name;
-  std::stringstream file_stream;
-  file_stream << webrtc::test::OutputPath();
-  file_stream << "TestRedFec_outFile_";
-  file_stream << test_number << ".pcm";
-  file_name = file_stream.str();
-  _outFileB.Open(file_name, 16000, "wb");
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/test/TestRedFec.h b/modules/audio_coding/test/TestRedFec.h
deleted file mode 100644
index 09d9259..0000000
--- a/modules/audio_coding/test/TestRedFec.h
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- *  Copyright (c) 2011 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_TEST_TESTREDFEC_H_
-#define WEBRTC_MODULES_AUDIO_CODING_TEST_TESTREDFEC_H_
-
-#include <memory>
-#include <string>
-
-#include "webrtc/modules/audio_coding/test/ACMTest.h"
-#include "webrtc/modules/audio_coding/test/Channel.h"
-#include "webrtc/modules/audio_coding/test/PCMFile.h"
-
-namespace webrtc {
-
-class TestRedFec : public ACMTest {
- public:
-  explicit TestRedFec();
-  ~TestRedFec();
-
-  void Perform();
- private:
-  // The default value of '-1' indicates that the registration is based only on
-  // codec name and a sampling frequency matching is not required. This is
-  // useful for codecs which support several sampling frequency.
-  int16_t RegisterSendCodec(char side, const char* codecName,
-                            int32_t sampFreqHz = -1);
-  void Run();
-  void OpenOutFile(int16_t testNumber);
-  int32_t SetVAD(bool enableDTX, bool enableVAD, ACMVADMode vadMode);
-  std::unique_ptr<AudioCodingModule> _acmA;
-  std::unique_ptr<AudioCodingModule> _acmB;
-
-  Channel* _channelA2B;
-
-  PCMFile _inFileA;
-  PCMFile _outFileB;
-  int16_t _testCntr;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_CODING_TEST_TESTREDFEC_H_
diff --git a/modules/audio_coding/test/TestStereo.cc b/modules/audio_coding/test/TestStereo.cc
deleted file mode 100644
index 02bc141..0000000
--- a/modules/audio_coding/test/TestStereo.cc
+++ /dev/null
@@ -1,854 +0,0 @@
-/*
- *  Copyright (c) 2012 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/test/TestStereo.h"
-
-#include <assert.h>
-
-#include <string>
-
-#include "webrtc/common_types.h"
-#include "webrtc/modules/audio_coding/codecs/audio_format_conversion.h"
-#include "webrtc/modules/audio_coding/include/audio_coding_module_typedefs.h"
-#include "webrtc/modules/audio_coding/test/utility.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/testsupport/fileutils.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-// Class for simulating packet handling
-TestPackStereo::TestPackStereo()
-    : receiver_acm_(NULL),
-      seq_no_(0),
-      timestamp_diff_(0),
-      last_in_timestamp_(0),
-      total_bytes_(0),
-      payload_size_(0),
-      codec_mode_(kNotSet),
-      lost_packet_(false) {
-}
-
-TestPackStereo::~TestPackStereo() {
-}
-
-void TestPackStereo::RegisterReceiverACM(AudioCodingModule* acm) {
-  receiver_acm_ = acm;
-  return;
-}
-
-int32_t TestPackStereo::SendData(const FrameType frame_type,
-                                 const uint8_t payload_type,
-                                 const uint32_t timestamp,
-                                 const uint8_t* payload_data,
-                                 const size_t payload_size,
-                                 const RTPFragmentationHeader* fragmentation) {
-  WebRtcRTPHeader rtp_info;
-  int32_t status = 0;
-
-  rtp_info.header.markerBit = false;
-  rtp_info.header.ssrc = 0;
-  rtp_info.header.sequenceNumber = seq_no_++;
-  rtp_info.header.payloadType = payload_type;
-  rtp_info.header.timestamp = timestamp;
-  if (frame_type == kEmptyFrame) {
-    // Skip this frame
-    return 0;
-  }
-
-  if (lost_packet_ == false) {
-    if (frame_type != kAudioFrameCN) {
-      rtp_info.type.Audio.isCNG = false;
-      rtp_info.type.Audio.channel = static_cast<int>(codec_mode_);
-    } else {
-      rtp_info.type.Audio.isCNG = true;
-      rtp_info.type.Audio.channel = static_cast<int>(kMono);
-    }
-    status = receiver_acm_->IncomingPacket(payload_data, payload_size,
-                                           rtp_info);
-
-    if (frame_type != kAudioFrameCN) {
-      payload_size_ = static_cast<int>(payload_size);
-    } else {
-      payload_size_ = -1;
-    }
-
-    timestamp_diff_ = timestamp - last_in_timestamp_;
-    last_in_timestamp_ = timestamp;
-    total_bytes_ += payload_size;
-  }
-  return status;
-}
-
-uint16_t TestPackStereo::payload_size() {
-  return static_cast<uint16_t>(payload_size_);
-}
-
-uint32_t TestPackStereo::timestamp_diff() {
-  return timestamp_diff_;
-}
-
-void TestPackStereo::reset_payload_size() {
-  payload_size_ = 0;
-}
-
-void TestPackStereo::set_codec_mode(enum StereoMonoMode mode) {
-  codec_mode_ = mode;
-}
-
-void TestPackStereo::set_lost_packet(bool lost) {
-  lost_packet_ = lost;
-}
-
-TestStereo::TestStereo(int test_mode)
-    : acm_a_(AudioCodingModule::Create(0)),
-      acm_b_(AudioCodingModule::Create(1)),
-      channel_a2b_(NULL),
-      test_cntr_(0),
-      pack_size_samp_(0),
-      pack_size_bytes_(0),
-      counter_(0)
-#ifdef WEBRTC_CODEC_G722
-      , g722_pltype_(0)
-#endif
-      , l16_8khz_pltype_(-1)
-      , l16_16khz_pltype_(-1)
-      , l16_32khz_pltype_(-1)
-#ifdef PCMA_AND_PCMU
-      , pcma_pltype_(-1)
-      , pcmu_pltype_(-1)
-#endif
-#ifdef WEBRTC_CODEC_OPUS
-      , opus_pltype_(-1)
-#endif
-      {
-  // test_mode = 0 for silent test (auto test)
-  test_mode_ = test_mode;
-}
-
-TestStereo::~TestStereo() {
-  if (channel_a2b_ != NULL) {
-    delete channel_a2b_;
-    channel_a2b_ = NULL;
-  }
-}
-
-void TestStereo::Perform() {
-  uint16_t frequency_hz;
-  int audio_channels;
-  int codec_channels;
-  bool dtx;
-  bool vad;
-  ACMVADMode vad_mode;
-
-  // Open both mono and stereo test files in 32 kHz.
-  const std::string file_name_stereo = webrtc::test::ResourcePath(
-      "audio_coding/teststereo32kHz", "pcm");
-  const std::string file_name_mono = webrtc::test::ResourcePath(
-      "audio_coding/testfile32kHz", "pcm");
-  frequency_hz = 32000;
-  in_file_stereo_ = new PCMFile();
-  in_file_mono_ = new PCMFile();
-  in_file_stereo_->Open(file_name_stereo, frequency_hz, "rb");
-  in_file_stereo_->ReadStereo(true);
-  in_file_mono_->Open(file_name_mono, frequency_hz, "rb");
-  in_file_mono_->ReadStereo(false);
-
-  // Create and initialize two ACMs, one for each side of a one-to-one call.
-  ASSERT_TRUE((acm_a_.get() != NULL) && (acm_b_.get() != NULL));
-  EXPECT_EQ(0, acm_a_->InitializeReceiver());
-  EXPECT_EQ(0, acm_b_->InitializeReceiver());
-
-  // Register all available codes as receiving codecs.
-  uint8_t num_encoders = acm_a_->NumberOfCodecs();
-  CodecInst my_codec_param;
-  for (uint8_t n = 0; n < num_encoders; n++) {
-    EXPECT_EQ(0, acm_b_->Codec(n, &my_codec_param));
-    EXPECT_EQ(true, acm_b_->RegisterReceiveCodec(
-                        my_codec_param.pltype, CodecInstToSdp(my_codec_param)));
-  }
-
-  // Test that unregister all receive codecs works.
-  for (uint8_t n = 0; n < num_encoders; n++) {
-    EXPECT_EQ(0, acm_b_->Codec(n, &my_codec_param));
-    EXPECT_EQ(0, acm_b_->UnregisterReceiveCodec(my_codec_param.pltype));
-  }
-
-  // Register all available codes as receiving codecs once more.
-  for (uint8_t n = 0; n < num_encoders; n++) {
-    EXPECT_EQ(0, acm_b_->Codec(n, &my_codec_param));
-    EXPECT_EQ(true, acm_b_->RegisterReceiveCodec(
-                        my_codec_param.pltype, CodecInstToSdp(my_codec_param)));
-  }
-
-  // Create and connect the channel.
-  channel_a2b_ = new TestPackStereo;
-  EXPECT_EQ(0, acm_a_->RegisterTransportCallback(channel_a2b_));
-  channel_a2b_->RegisterReceiverACM(acm_b_.get());
-
-  // Start with setting VAD/DTX, before we know we will send stereo.
-  // Continue with setting a stereo codec as send codec and verify that
-  // VAD/DTX gets turned off.
-  EXPECT_EQ(0, acm_a_->SetVAD(true, true, VADNormal));
-  EXPECT_EQ(0, acm_a_->VAD(&dtx, &vad, &vad_mode));
-  EXPECT_TRUE(dtx);
-  EXPECT_TRUE(vad);
-  char codec_pcma_temp[] = "PCMA";
-  RegisterSendCodec('A', codec_pcma_temp, 8000, 64000, 80, 2, pcma_pltype_);
-  EXPECT_EQ(0, acm_a_->VAD(&dtx, &vad, &vad_mode));
-  EXPECT_FALSE(dtx);
-  EXPECT_FALSE(vad);
-  if (test_mode_ != 0) {
-    printf("\n");
-  }
-
-  //
-  // Test Stereo-To-Stereo for all codecs.
-  //
-  audio_channels = 2;
-  codec_channels = 2;
-
-  // All codecs are tested for all allowed sampling frequencies, rates and
-  // packet sizes.
-#ifdef WEBRTC_CODEC_G722
-  if (test_mode_ != 0) {
-    printf("===========================================================\n");
-    printf("Test number: %d\n", test_cntr_ + 1);
-    printf("Test type: Stereo-to-stereo\n");
-  }
-  channel_a2b_->set_codec_mode(kStereo);
-  test_cntr_++;
-  OpenOutFile(test_cntr_);
-  char codec_g722[] = "G722";
-  RegisterSendCodec('A', codec_g722, 16000, 64000, 160, codec_channels,
-      g722_pltype_);
-  Run(channel_a2b_, audio_channels, codec_channels);
-  RegisterSendCodec('A', codec_g722, 16000, 64000, 320, codec_channels,
-      g722_pltype_);
-  Run(channel_a2b_, audio_channels, codec_channels);
-  RegisterSendCodec('A', codec_g722, 16000, 64000, 480, codec_channels,
-      g722_pltype_);
-  Run(channel_a2b_, audio_channels, codec_channels);
-  RegisterSendCodec('A', codec_g722, 16000, 64000, 640, codec_channels,
-      g722_pltype_);
-  Run(channel_a2b_, audio_channels, codec_channels);
-  RegisterSendCodec('A', codec_g722, 16000, 64000, 800, codec_channels,
-      g722_pltype_);
-  Run(channel_a2b_, audio_channels, codec_channels);
-  RegisterSendCodec('A', codec_g722, 16000, 64000, 960, codec_channels,
-      g722_pltype_);
-  Run(channel_a2b_, audio_channels, codec_channels);
-  out_file_.Close();
-#endif
-  if (test_mode_ != 0) {
-    printf("===========================================================\n");
-    printf("Test number: %d\n", test_cntr_ + 1);
-    printf("Test type: Stereo-to-stereo\n");
-  }
-  channel_a2b_->set_codec_mode(kStereo);
-  test_cntr_++;
-  OpenOutFile(test_cntr_);
-  char codec_l16[] = "L16";
-  RegisterSendCodec('A', codec_l16, 8000, 128000, 80, codec_channels,
-      l16_8khz_pltype_);
-  Run(channel_a2b_, audio_channels, codec_channels);
-  RegisterSendCodec('A', codec_l16, 8000, 128000, 160, codec_channels,
-      l16_8khz_pltype_);
-  Run(channel_a2b_, audio_channels, codec_channels);
-  RegisterSendCodec('A', codec_l16, 8000, 128000, 240, codec_channels,
-      l16_8khz_pltype_);
-  Run(channel_a2b_, audio_channels, codec_channels);
-  RegisterSendCodec('A', codec_l16, 8000, 128000, 320, codec_channels,
-      l16_8khz_pltype_);
-  Run(channel_a2b_, audio_channels, codec_channels);
-  out_file_.Close();
-
-  if (test_mode_ != 0) {
-    printf("===========================================================\n");
-    printf("Test number: %d\n", test_cntr_ + 1);
-    printf("Test type: Stereo-to-stereo\n");
-  }
-  test_cntr_++;
-  OpenOutFile(test_cntr_);
-  RegisterSendCodec('A', codec_l16, 16000, 256000, 160, codec_channels,
-      l16_16khz_pltype_);
-  Run(channel_a2b_, audio_channels, codec_channels);
-  RegisterSendCodec('A', codec_l16, 16000, 256000, 320, codec_channels,
-      l16_16khz_pltype_);
-  Run(channel_a2b_, audio_channels, codec_channels);
-  RegisterSendCodec('A', codec_l16, 16000, 256000, 480, codec_channels,
-      l16_16khz_pltype_);
-  Run(channel_a2b_, audio_channels, codec_channels);
-  RegisterSendCodec('A', codec_l16, 16000, 256000, 640, codec_channels,
-      l16_16khz_pltype_);
-  Run(channel_a2b_, audio_channels, codec_channels);
-  out_file_.Close();
-
-  if (test_mode_ != 0) {
-    printf("===========================================================\n");
-    printf("Test number: %d\n", test_cntr_ + 1);
-    printf("Test type: Stereo-to-stereo\n");
-  }
-  test_cntr_++;
-  OpenOutFile(test_cntr_);
-  RegisterSendCodec('A', codec_l16, 32000, 512000, 320, codec_channels,
-      l16_32khz_pltype_);
-  Run(channel_a2b_, audio_channels, codec_channels);
-  RegisterSendCodec('A', codec_l16, 32000, 512000, 640, codec_channels,
-      l16_32khz_pltype_);
-  Run(channel_a2b_, audio_channels, codec_channels);
-  out_file_.Close();
-#ifdef PCMA_AND_PCMU
-  if (test_mode_ != 0) {
-    printf("===========================================================\n");
-    printf("Test number: %d\n", test_cntr_ + 1);
-    printf("Test type: Stereo-to-stereo\n");
-  }
-  channel_a2b_->set_codec_mode(kStereo);
-  audio_channels = 2;
-  codec_channels = 2;
-  test_cntr_++;
-  OpenOutFile(test_cntr_);
-  char codec_pcma[] = "PCMA";
-  RegisterSendCodec('A', codec_pcma, 8000, 64000, 80, codec_channels,
-                    pcma_pltype_);
-  Run(channel_a2b_, audio_channels, codec_channels);
-  RegisterSendCodec('A', codec_pcma, 8000, 64000, 160, codec_channels,
-                    pcma_pltype_);
-  Run(channel_a2b_, audio_channels, codec_channels);
-  RegisterSendCodec('A', codec_pcma, 8000, 64000, 240, codec_channels,
-                    pcma_pltype_);
-  Run(channel_a2b_, audio_channels, codec_channels);
-  RegisterSendCodec('A', codec_pcma, 8000, 64000, 320, codec_channels,
-                    pcma_pltype_);
-  Run(channel_a2b_, audio_channels, codec_channels);
-  RegisterSendCodec('A', codec_pcma, 8000, 64000, 400, codec_channels,
-                    pcma_pltype_);
-  Run(channel_a2b_, audio_channels, codec_channels);
-  RegisterSendCodec('A', codec_pcma, 8000, 64000, 480, codec_channels,
-                    pcma_pltype_);
-  Run(channel_a2b_, audio_channels, codec_channels);
-
-  // Test that VAD/DTX cannot be turned on while sending stereo.
-  EXPECT_EQ(-1, acm_a_->SetVAD(true, true, VADNormal));
-  EXPECT_EQ(0, acm_a_->VAD(&dtx, &vad, &vad_mode));
-  EXPECT_FALSE(dtx);
-  EXPECT_FALSE(vad);
-  EXPECT_EQ(0, acm_a_->SetVAD(false, false, VADNormal));
-  EXPECT_EQ(0, acm_a_->VAD(&dtx, &vad, &vad_mode));
-  EXPECT_FALSE(dtx);
-  EXPECT_FALSE(vad);
-
-  out_file_.Close();
-  if (test_mode_ != 0) {
-    printf("===========================================================\n");
-    printf("Test number: %d\n", test_cntr_ + 1);
-    printf("Test type: Stereo-to-stereo\n");
-  }
-  test_cntr_++;
-  OpenOutFile(test_cntr_);
-  char codec_pcmu[] = "PCMU";
-  RegisterSendCodec('A', codec_pcmu, 8000, 64000, 80, codec_channels,
-                    pcmu_pltype_);
-  Run(channel_a2b_, audio_channels, codec_channels);
-  RegisterSendCodec('A', codec_pcmu, 8000, 64000, 160, codec_channels,
-                    pcmu_pltype_);
-  Run(channel_a2b_, audio_channels, codec_channels);
-  RegisterSendCodec('A', codec_pcmu, 8000, 64000, 240, codec_channels,
-                    pcmu_pltype_);
-  Run(channel_a2b_, audio_channels, codec_channels);
-  RegisterSendCodec('A', codec_pcmu, 8000, 64000, 320, codec_channels,
-                    pcmu_pltype_);
-  Run(channel_a2b_, audio_channels, codec_channels);
-  RegisterSendCodec('A', codec_pcmu, 8000, 64000, 400, codec_channels,
-                    pcmu_pltype_);
-  Run(channel_a2b_, audio_channels, codec_channels);
-  RegisterSendCodec('A', codec_pcmu, 8000, 64000, 480, codec_channels,
-                    pcmu_pltype_);
-  Run(channel_a2b_, audio_channels, codec_channels);
-  out_file_.Close();
-#endif
-#ifdef WEBRTC_CODEC_OPUS
-  if (test_mode_ != 0) {
-    printf("===========================================================\n");
-    printf("Test number: %d\n", test_cntr_ + 1);
-    printf("Test type: Stereo-to-stereo\n");
-  }
-  channel_a2b_->set_codec_mode(kStereo);
-  audio_channels = 2;
-  codec_channels = 2;
-  test_cntr_++;
-  OpenOutFile(test_cntr_);
-
-  char codec_opus[] = "opus";
-  // Run Opus with 10 ms frame size.
-  RegisterSendCodec('A', codec_opus, 48000, 64000, 480, codec_channels,
-      opus_pltype_);
-  Run(channel_a2b_, audio_channels, codec_channels);
-  // Run Opus with 20 ms frame size.
-  RegisterSendCodec('A', codec_opus, 48000, 64000, 480*2, codec_channels,
-      opus_pltype_);
-  Run(channel_a2b_, audio_channels, codec_channels);
-  // Run Opus with 40 ms frame size.
-  RegisterSendCodec('A', codec_opus, 48000, 64000, 480*4, codec_channels,
-      opus_pltype_);
-  Run(channel_a2b_, audio_channels, codec_channels);
-  // Run Opus with 60 ms frame size.
-  RegisterSendCodec('A', codec_opus, 48000, 64000, 480*6, codec_channels,
-      opus_pltype_);
-  Run(channel_a2b_, audio_channels, codec_channels);
-  // Run Opus with 20 ms frame size and different bitrates.
-  RegisterSendCodec('A', codec_opus, 48000, 40000, 960, codec_channels,
-      opus_pltype_);
-  Run(channel_a2b_, audio_channels, codec_channels);
-  RegisterSendCodec('A', codec_opus, 48000, 510000, 960, codec_channels,
-      opus_pltype_);
-  Run(channel_a2b_, audio_channels, codec_channels);
-  out_file_.Close();
-#endif
-  //
-  // Test Mono-To-Stereo for all codecs.
-  //
-  audio_channels = 1;
-  codec_channels = 2;
-
-#ifdef WEBRTC_CODEC_G722
-  if (test_mode_ != 0) {
-    printf("===============================================================\n");
-    printf("Test number: %d\n", test_cntr_ + 1);
-    printf("Test type: Mono-to-stereo\n");
-  }
-  test_cntr_++;
-  channel_a2b_->set_codec_mode(kStereo);
-  OpenOutFile(test_cntr_);
-  RegisterSendCodec('A', codec_g722, 16000, 64000, 160, codec_channels,
-      g722_pltype_);
-  Run(channel_a2b_, audio_channels, codec_channels);
-  out_file_.Close();
-#endif
-  if (test_mode_ != 0) {
-    printf("===============================================================\n");
-    printf("Test number: %d\n", test_cntr_ + 1);
-    printf("Test type: Mono-to-stereo\n");
-  }
-  test_cntr_++;
-  channel_a2b_->set_codec_mode(kStereo);
-  OpenOutFile(test_cntr_);
-  RegisterSendCodec('A', codec_l16, 8000, 128000, 80, codec_channels,
-      l16_8khz_pltype_);
-  Run(channel_a2b_, audio_channels, codec_channels);
-  out_file_.Close();
-  if (test_mode_ != 0) {
-    printf("===============================================================\n");
-    printf("Test number: %d\n", test_cntr_ + 1);
-    printf("Test type: Mono-to-stereo\n");
-  }
-  test_cntr_++;
-  OpenOutFile(test_cntr_);
-  RegisterSendCodec('A', codec_l16, 16000, 256000, 160, codec_channels,
-      l16_16khz_pltype_);
-  Run(channel_a2b_, audio_channels, codec_channels);
-  out_file_.Close();
-  if (test_mode_ != 0) {
-    printf("===============================================================\n");
-    printf("Test number: %d\n", test_cntr_ + 1);
-    printf("Test type: Mono-to-stereo\n");
-  }
-  test_cntr_++;
-  OpenOutFile(test_cntr_);
-  RegisterSendCodec('A', codec_l16, 32000, 512000, 320, codec_channels,
-      l16_32khz_pltype_);
-  Run(channel_a2b_, audio_channels, codec_channels);
-  out_file_.Close();
-#ifdef PCMA_AND_PCMU
-  if (test_mode_ != 0) {
-    printf("===============================================================\n");
-    printf("Test number: %d\n", test_cntr_ + 1);
-    printf("Test type: Mono-to-stereo\n");
-  }
-  test_cntr_++;
-  channel_a2b_->set_codec_mode(kStereo);
-  OpenOutFile(test_cntr_);
-  RegisterSendCodec('A', codec_pcmu, 8000, 64000, 80, codec_channels,
-                    pcmu_pltype_);
-  Run(channel_a2b_, audio_channels, codec_channels);
-  RegisterSendCodec('A', codec_pcma, 8000, 64000, 80, codec_channels,
-                    pcma_pltype_);
-  Run(channel_a2b_, audio_channels, codec_channels);
-  out_file_.Close();
-#endif
-#ifdef WEBRTC_CODEC_OPUS
-  if (test_mode_ != 0) {
-    printf("===============================================================\n");
-    printf("Test number: %d\n", test_cntr_ + 1);
-    printf("Test type: Mono-to-stereo\n");
-  }
-
-  // Keep encode and decode in stereo.
-  test_cntr_++;
-  channel_a2b_->set_codec_mode(kStereo);
-  OpenOutFile(test_cntr_);
-  RegisterSendCodec('A', codec_opus, 48000, 64000, 960, codec_channels,
-      opus_pltype_);
-  Run(channel_a2b_, audio_channels, codec_channels);
-
-  // Encode in mono, decode in stereo mode.
-  RegisterSendCodec('A', codec_opus, 48000, 64000, 960, 1, opus_pltype_);
-  Run(channel_a2b_, audio_channels, codec_channels);
-  out_file_.Close();
-#endif
-
-  //
-  // Test Stereo-To-Mono for all codecs.
-  //
-  audio_channels = 2;
-  codec_channels = 1;
-  channel_a2b_->set_codec_mode(kMono);
-
-#ifdef WEBRTC_CODEC_G722
-  // Run stereo audio and mono codec.
-  if (test_mode_ != 0) {
-    printf("===============================================================\n");
-    printf("Test number: %d\n", test_cntr_ + 1);
-    printf("Test type: Stereo-to-mono\n");
-  }
-  test_cntr_++;
-  OpenOutFile(test_cntr_);
-  RegisterSendCodec('A', codec_g722, 16000, 64000, 160, codec_channels,
-      g722_pltype_);
-
-  // Make sure it is possible to set VAD/CNG, now that we are sending mono
-  // again.
-  EXPECT_EQ(0, acm_a_->SetVAD(true, true, VADNormal));
-  EXPECT_EQ(0, acm_a_->VAD(&dtx, &vad, &vad_mode));
-  EXPECT_TRUE(dtx);
-  EXPECT_TRUE(vad);
-  EXPECT_EQ(0, acm_a_->SetVAD(false, false, VADNormal));
-  Run(channel_a2b_, audio_channels, codec_channels);
-  out_file_.Close();
-#endif
-  if (test_mode_ != 0) {
-    printf("===============================================================\n");
-    printf("Test number: %d\n", test_cntr_ + 1);
-    printf("Test type: Stereo-to-mono\n");
-  }
-  test_cntr_++;
-  OpenOutFile(test_cntr_);
-  RegisterSendCodec('A', codec_l16, 8000, 128000, 80, codec_channels,
-      l16_8khz_pltype_);
-  Run(channel_a2b_, audio_channels, codec_channels);
-  out_file_.Close();
-  if (test_mode_ != 0) {
-    printf("===============================================================\n");
-    printf("Test number: %d\n", test_cntr_ + 1);
-    printf("Test type: Stereo-to-mono\n");
-  }
-  test_cntr_++;
-  OpenOutFile(test_cntr_);
-  RegisterSendCodec('A', codec_l16, 16000, 256000, 160, codec_channels,
-      l16_16khz_pltype_);
-  Run(channel_a2b_, audio_channels, codec_channels);
-  out_file_.Close();
-  if (test_mode_ != 0) {
-    printf("==============================================================\n");
-    printf("Test number: %d\n", test_cntr_ + 1);
-    printf("Test type: Stereo-to-mono\n");
-  }
-  test_cntr_++;
-  OpenOutFile(test_cntr_);
-  RegisterSendCodec('A', codec_l16, 32000, 512000, 320, codec_channels,
-      l16_32khz_pltype_);
-  Run(channel_a2b_, audio_channels, codec_channels);
-  out_file_.Close();
-#ifdef PCMA_AND_PCMU
-  if (test_mode_ != 0) {
-    printf("===============================================================\n");
-    printf("Test number: %d\n", test_cntr_ + 1);
-    printf("Test type: Stereo-to-mono\n");
-  }
-  test_cntr_++;
-  OpenOutFile(test_cntr_);
-  RegisterSendCodec('A', codec_pcmu, 8000, 64000, 80, codec_channels,
-                    pcmu_pltype_);
-  Run(channel_a2b_, audio_channels, codec_channels);
-  RegisterSendCodec('A', codec_pcma, 8000, 64000, 80, codec_channels,
-                    pcma_pltype_);
-  Run(channel_a2b_, audio_channels, codec_channels);
-  out_file_.Close();
-#endif
-#ifdef WEBRTC_CODEC_OPUS
-  if (test_mode_ != 0) {
-    printf("===============================================================\n");
-    printf("Test number: %d\n", test_cntr_ + 1);
-    printf("Test type: Stereo-to-mono\n");
-  }
-  test_cntr_++;
-  OpenOutFile(test_cntr_);
-  // Encode and decode in mono.
-  RegisterSendCodec('A', codec_opus, 48000, 32000, 960, codec_channels,
-      opus_pltype_);
-  CodecInst opus_codec_param;
-  for (uint8_t n = 0; n < num_encoders; n++) {
-    EXPECT_EQ(0, acm_b_->Codec(n, &opus_codec_param));
-    if (!strcmp(opus_codec_param.plname, "opus")) {
-      opus_codec_param.channels = 1;
-      EXPECT_EQ(true,
-                acm_b_->RegisterReceiveCodec(opus_codec_param.pltype,
-                                             CodecInstToSdp(opus_codec_param)));
-      break;
-    }
-  }
-  Run(channel_a2b_, audio_channels, codec_channels);
-
-  // Encode in stereo, decode in mono.
-  RegisterSendCodec('A', codec_opus, 48000, 32000, 960, 2, opus_pltype_);
-  Run(channel_a2b_, audio_channels, codec_channels);
-
-  out_file_.Close();
-
-  // Test switching between decoding mono and stereo for Opus.
-
-  // Decode in mono.
-  test_cntr_++;
-  OpenOutFile(test_cntr_);
-  if (test_mode_ != 0) {
-    // Print out codec and settings
-    printf("Test number: %d\nCodec: Opus Freq: 48000 Rate :32000 PackSize: 960"
-        " Decode: mono\n", test_cntr_);
-  }
-  Run(channel_a2b_, audio_channels, codec_channels);
-  out_file_.Close();
-  // Decode in stereo.
-  test_cntr_++;
-  OpenOutFile(test_cntr_);
-  if (test_mode_ != 0) {
-    // Print out codec and settings
-    printf("Test number: %d\nCodec: Opus Freq: 48000 Rate :32000 PackSize: 960"
-        " Decode: stereo\n", test_cntr_);
-  }
-  opus_codec_param.channels = 2;
-  EXPECT_EQ(true,
-            acm_b_->RegisterReceiveCodec(opus_codec_param.pltype,
-                                         CodecInstToSdp(opus_codec_param)));
-  Run(channel_a2b_, audio_channels, 2);
-  out_file_.Close();
-  // Decode in mono.
-  test_cntr_++;
-  OpenOutFile(test_cntr_);
-  if (test_mode_ != 0) {
-    // Print out codec and settings
-    printf("Test number: %d\nCodec: Opus Freq: 48000 Rate :32000 PackSize: 960"
-        " Decode: mono\n", test_cntr_);
-  }
-  opus_codec_param.channels = 1;
-  EXPECT_EQ(true,
-            acm_b_->RegisterReceiveCodec(opus_codec_param.pltype,
-                                         CodecInstToSdp(opus_codec_param)));
-  Run(channel_a2b_, audio_channels, codec_channels);
-  out_file_.Close();
-
-#endif
-
-  // Print out which codecs were tested, and which were not, in the run.
-  if (test_mode_ != 0) {
-    printf("\nThe following codecs was INCLUDED in the test:\n");
-#ifdef WEBRTC_CODEC_G722
-    printf("   G.722\n");
-#endif
-    printf("   PCM16\n");
-    printf("   G.711\n");
-#ifdef WEBRTC_CODEC_OPUS
-    printf("   Opus\n");
-#endif
-    printf("\nTo complete the test, listen to the %d number of output "
-           "files.\n",
-           test_cntr_);
-  }
-
-  // Delete the file pointers.
-  delete in_file_stereo_;
-  delete in_file_mono_;
-}
-
-// Register Codec to use in the test
-//
-// Input:   side             - which ACM to use, 'A' or 'B'
-//          codec_name       - name to use when register the codec
-//          sampling_freq_hz - sampling frequency in Herz
-//          rate             - bitrate in bytes
-//          pack_size        - packet size in samples
-//          channels         - number of channels; 1 for mono, 2 for stereo
-//          payload_type     - payload type for the codec
-void TestStereo::RegisterSendCodec(char side, char* codec_name,
-                                   int32_t sampling_freq_hz, int rate,
-                                   int pack_size, int channels,
-                                   int payload_type) {
-  if (test_mode_ != 0) {
-    // Print out codec and settings
-    printf("Codec: %s Freq: %d Rate: %d PackSize: %d\n", codec_name,
-           sampling_freq_hz, rate, pack_size);
-  }
-
-  // Store packet size in samples, used to validate the received packet
-  pack_size_samp_ = pack_size;
-
-  // Store the expected packet size in bytes, used to validate the received
-  // packet. Add 0.875 to always round up to a whole byte.
-  pack_size_bytes_ = (uint16_t)(static_cast<float>(pack_size * rate) /
-                                    static_cast<float>(sampling_freq_hz * 8) +
-                                0.875);
-
-  // Set pointer to the ACM where to register the codec
-  AudioCodingModule* my_acm = NULL;
-  switch (side) {
-    case 'A': {
-      my_acm = acm_a_.get();
-      break;
-    }
-    case 'B': {
-      my_acm = acm_b_.get();
-      break;
-    }
-    default:
-      break;
-  }
-  ASSERT_TRUE(my_acm != NULL);
-
-  CodecInst my_codec_param;
-  // Get all codec parameters before registering
-  EXPECT_GT(AudioCodingModule::Codec(codec_name, &my_codec_param,
-                                     sampling_freq_hz, channels), -1);
-  my_codec_param.rate = rate;
-  my_codec_param.pacsize = pack_size;
-  EXPECT_EQ(0, my_acm->RegisterSendCodec(my_codec_param));
-
-  send_codec_name_ = codec_name;
-}
-
-void TestStereo::Run(TestPackStereo* channel, int in_channels, int out_channels,
-                     int percent_loss) {
-  AudioFrame audio_frame;
-
-  int32_t out_freq_hz_b = out_file_.SamplingFrequency();
-  uint16_t rec_size;
-  uint32_t time_stamp_diff;
-  channel->reset_payload_size();
-  int error_count = 0;
-  int variable_bytes = 0;
-  int variable_packets = 0;
-  // Set test length to 500 ms (50 blocks of 10 ms each).
-  in_file_mono_->SetNum10MsBlocksToRead(50);
-  in_file_stereo_->SetNum10MsBlocksToRead(50);
-  // Fast-forward 1 second (100 blocks) since the files start with silence.
-  in_file_stereo_->FastForward(100);
-  in_file_mono_->FastForward(100);
-
-  while (1) {
-    // Simulate packet loss by setting |packet_loss_| to "true" in
-    // |percent_loss| percent of the loops.
-    if (percent_loss > 0) {
-      if (counter_ == floor((100 / percent_loss) + 0.5)) {
-        counter_ = 0;
-        channel->set_lost_packet(true);
-      } else {
-        channel->set_lost_packet(false);
-      }
-      counter_++;
-    }
-
-    // Add 10 msec to ACM
-    if (in_channels == 1) {
-      if (in_file_mono_->EndOfFile()) {
-        break;
-      }
-      in_file_mono_->Read10MsData(audio_frame);
-    } else {
-      if (in_file_stereo_->EndOfFile()) {
-        break;
-      }
-      in_file_stereo_->Read10MsData(audio_frame);
-    }
-    EXPECT_GE(acm_a_->Add10MsData(audio_frame), 0);
-
-    // Verify that the received packet size matches the settings.
-    rec_size = channel->payload_size();
-    if ((0 < rec_size) & (rec_size < 65535)) {
-      if (strcmp(send_codec_name_, "opus") == 0) {
-        // Opus is a variable rate codec, hence calculate the average packet
-        // size, and later make sure the average is in the right range.
-        variable_bytes += rec_size;
-        variable_packets++;
-      } else {
-        // For fixed rate codecs, check that packet size is correct.
-        if ((rec_size != pack_size_bytes_ * out_channels)
-            && (pack_size_bytes_ < 65535)) {
-          error_count++;
-        }
-      }
-      // Verify that the timestamp is updated with expected length
-      time_stamp_diff = channel->timestamp_diff();
-      if ((counter_ > 10) && (time_stamp_diff != pack_size_samp_)) {
-        error_count++;
-      }
-    }
-
-    // Run received side of ACM
-    bool muted;
-    EXPECT_EQ(0, acm_b_->PlayoutData10Ms(out_freq_hz_b, &audio_frame, &muted));
-    ASSERT_FALSE(muted);
-
-    // Write output speech to file
-    out_file_.Write10MsData(
-        audio_frame.data(),
-        audio_frame.samples_per_channel_ * audio_frame.num_channels_);
-  }
-
-  EXPECT_EQ(0, error_count);
-
-  // Check that packet size is in the right range for variable rate codecs,
-  // such as Opus.
-  if (variable_packets > 0) {
-    variable_bytes /= variable_packets;
-    EXPECT_NEAR(variable_bytes, pack_size_bytes_, 18);
-  }
-
-  if (in_file_mono_->EndOfFile()) {
-    in_file_mono_->Rewind();
-  }
-  if (in_file_stereo_->EndOfFile()) {
-    in_file_stereo_->Rewind();
-  }
-  // Reset in case we ended with a lost packet
-  channel->set_lost_packet(false);
-}
-
-void TestStereo::OpenOutFile(int16_t test_number) {
-  std::string file_name;
-  std::stringstream file_stream;
-  file_stream << webrtc::test::OutputPath() << "teststereo_out_" << test_number
-      << ".pcm";
-  file_name = file_stream.str();
-  out_file_.Open(file_name, 32000, "wb");
-}
-
-void TestStereo::DisplaySendReceiveCodec() {
-  auto send_codec = acm_a_->SendCodec();
-  if (test_mode_ != 0) {
-    ASSERT_TRUE(send_codec);
-    printf("%s -> ", send_codec->plname);
-  }
-  CodecInst receive_codec;
-  acm_b_->ReceiveCodec(&receive_codec);
-  if (test_mode_ != 0) {
-    printf("%s\n", receive_codec.plname);
-  }
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/test/TestStereo.h b/modules/audio_coding/test/TestStereo.h
deleted file mode 100644
index 3489421..0000000
--- a/modules/audio_coding/test/TestStereo.h
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- *  Copyright (c) 2012 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_TEST_TESTSTEREO_H_
-#define WEBRTC_MODULES_AUDIO_CODING_TEST_TESTSTEREO_H_
-
-#include <math.h>
-
-#include <memory>
-
-#include "webrtc/modules/audio_coding/test/ACMTest.h"
-#include "webrtc/modules/audio_coding/test/Channel.h"
-#include "webrtc/modules/audio_coding/test/PCMFile.h"
-
-#define PCMA_AND_PCMU
-
-namespace webrtc {
-
-enum StereoMonoMode {
-  kNotSet,
-  kMono,
-  kStereo
-};
-
-class TestPackStereo : public AudioPacketizationCallback {
- public:
-  TestPackStereo();
-  ~TestPackStereo();
-
-  void RegisterReceiverACM(AudioCodingModule* acm);
-
-  int32_t SendData(const FrameType frame_type,
-                   const uint8_t payload_type,
-                   const uint32_t timestamp,
-                   const uint8_t* payload_data,
-                   const size_t payload_size,
-                   const RTPFragmentationHeader* fragmentation) override;
-
-  uint16_t payload_size();
-  uint32_t timestamp_diff();
-  void reset_payload_size();
-  void set_codec_mode(StereoMonoMode mode);
-  void set_lost_packet(bool lost);
-
- private:
-  AudioCodingModule* receiver_acm_;
-  int16_t seq_no_;
-  uint32_t timestamp_diff_;
-  uint32_t last_in_timestamp_;
-  uint64_t total_bytes_;
-  int payload_size_;
-  StereoMonoMode codec_mode_;
-  // Simulate packet losses
-  bool lost_packet_;
-};
-
-class TestStereo : public ACMTest {
- public:
-  explicit TestStereo(int test_mode);
-  ~TestStereo();
-
-  void Perform() override;
-
- private:
-  // The default value of '-1' indicates that the registration is based only on
-  // codec name and a sampling frequncy matching is not required. This is useful
-  // for codecs which support several sampling frequency.
-  void RegisterSendCodec(char side, char* codec_name, int32_t samp_freq_hz,
-                         int rate, int pack_size, int channels,
-                         int payload_type);
-
-  void Run(TestPackStereo* channel, int in_channels, int out_channels,
-           int percent_loss = 0);
-  void OpenOutFile(int16_t test_number);
-  void DisplaySendReceiveCodec();
-
-  int test_mode_;
-
-  std::unique_ptr<AudioCodingModule> acm_a_;
-  std::unique_ptr<AudioCodingModule> acm_b_;
-
-  TestPackStereo* channel_a2b_;
-
-  PCMFile* in_file_stereo_;
-  PCMFile* in_file_mono_;
-  PCMFile out_file_;
-  int16_t test_cntr_;
-  uint16_t pack_size_samp_;
-  uint16_t pack_size_bytes_;
-  int counter_;
-  char* send_codec_name_;
-
-  // Payload types for stereo codecs and CNG
-#ifdef WEBRTC_CODEC_G722
-  int g722_pltype_;
-#endif
-  int l16_8khz_pltype_;
-  int l16_16khz_pltype_;
-  int l16_32khz_pltype_;
-#ifdef PCMA_AND_PCMU
-  int pcma_pltype_;
-  int pcmu_pltype_;
-#endif
-#ifdef WEBRTC_CODEC_OPUS
-  int opus_pltype_;
-#endif
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_CODING_TEST_TESTSTEREO_H_
diff --git a/modules/audio_coding/test/TestVADDTX.cc b/modules/audio_coding/test/TestVADDTX.cc
deleted file mode 100644
index ad5e066..0000000
--- a/modules/audio_coding/test/TestVADDTX.cc
+++ /dev/null
@@ -1,279 +0,0 @@
-/*
- *  Copyright (c) 2012 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/test/TestVADDTX.h"
-
-#include <string>
-
-#include "webrtc/modules/audio_coding/codecs/audio_format_conversion.h"
-#include "webrtc/modules/audio_coding/test/PCMFile.h"
-#include "webrtc/modules/audio_coding/test/utility.h"
-#include "webrtc/test/testsupport/fileutils.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-#ifdef WEBRTC_CODEC_ISAC
-const CodecInst kIsacWb = {103, "ISAC", 16000, 480, 1, 32000};
-const CodecInst kIsacSwb = {104, "ISAC", 32000, 960, 1, 56000};
-#endif
-
-#ifdef WEBRTC_CODEC_ILBC
-const CodecInst kIlbc = {102, "ILBC", 8000, 240, 1, 13300};
-#endif
-
-#ifdef WEBRTC_CODEC_OPUS
-const CodecInst kOpus = {120, "opus", 48000, 960, 1, 64000};
-const CodecInst kOpusStereo = {120, "opus", 48000, 960, 2, 64000};
-#endif
-
-ActivityMonitor::ActivityMonitor() {
-  ResetStatistics();
-}
-
-int32_t ActivityMonitor::InFrameType(FrameType frame_type) {
-  counter_[frame_type]++;
-  return 0;
-}
-
-void ActivityMonitor::PrintStatistics() {
-  printf("\n");
-  printf("kEmptyFrame       %u\n", counter_[kEmptyFrame]);
-  printf("kAudioFrameSpeech %u\n", counter_[kAudioFrameSpeech]);
-  printf("kAudioFrameCN     %u\n", counter_[kAudioFrameCN]);
-  printf("kVideoFrameKey    %u\n", counter_[kVideoFrameKey]);
-  printf("kVideoFrameDelta  %u\n", counter_[kVideoFrameDelta]);
-  printf("\n\n");
-}
-
-void ActivityMonitor::ResetStatistics() {
-  memset(counter_, 0, sizeof(counter_));
-}
-
-void ActivityMonitor::GetStatistics(uint32_t* counter) {
-  memcpy(counter, counter_, sizeof(counter_));
-}
-
-TestVadDtx::TestVadDtx()
-    : acm_send_(AudioCodingModule::Create(0)),
-      acm_receive_(AudioCodingModule::Create(1)),
-      channel_(new Channel),
-      monitor_(new ActivityMonitor) {
-  EXPECT_EQ(0, acm_send_->RegisterTransportCallback(channel_.get()));
-  channel_->RegisterReceiverACM(acm_receive_.get());
-  EXPECT_EQ(0, acm_send_->RegisterVADCallback(monitor_.get()));
-}
-
-void TestVadDtx::RegisterCodec(CodecInst codec_param) {
-  // Set the codec for sending and receiving.
-  EXPECT_EQ(0, acm_send_->RegisterSendCodec(codec_param));
-  EXPECT_EQ(true, acm_receive_->RegisterReceiveCodec(
-                      codec_param.pltype, CodecInstToSdp(codec_param)));
-  channel_->SetIsStereo(codec_param.channels > 1);
-}
-
-// Encoding a file and see if the numbers that various packets occur follow
-// the expectation.
-void TestVadDtx::Run(std::string in_filename, int frequency, int channels,
-                     std::string out_filename, bool append,
-                     const int* expects) {
-  monitor_->ResetStatistics();
-
-  PCMFile in_file;
-  in_file.Open(in_filename, frequency, "rb");
-  in_file.ReadStereo(channels > 1);
-  // Set test length to 1000 ms (100 blocks of 10 ms each).
-  in_file.SetNum10MsBlocksToRead(100);
-  // Fast-forward both files 500 ms (50 blocks). The first second of the file is
-  // silence, but we want to keep half of that to test silence periods.
-  in_file.FastForward(50);
-
-  PCMFile out_file;
-  if (append) {
-    out_file.Open(out_filename, kOutputFreqHz, "ab");
-  } else {
-    out_file.Open(out_filename, kOutputFreqHz, "wb");
-  }
-
-  uint16_t frame_size_samples = in_file.PayloadLength10Ms();
-  AudioFrame audio_frame;
-  while (!in_file.EndOfFile()) {
-    in_file.Read10MsData(audio_frame);
-    audio_frame.timestamp_ = time_stamp_;
-    time_stamp_ += frame_size_samples;
-    EXPECT_GE(acm_send_->Add10MsData(audio_frame), 0);
-    bool muted;
-    acm_receive_->PlayoutData10Ms(kOutputFreqHz, &audio_frame, &muted);
-    ASSERT_FALSE(muted);
-    out_file.Write10MsData(audio_frame);
-  }
-
-  in_file.Close();
-  out_file.Close();
-
-#ifdef PRINT_STAT
-  monitor_->PrintStatistics();
-#endif
-
-  uint32_t stats[5];
-  monitor_->GetStatistics(stats);
-  monitor_->ResetStatistics();
-
-  for (const auto& st : stats) {
-    int i = &st - stats;  // Calculate the current position in stats.
-    switch (expects[i]) {
-      case 0: {
-        EXPECT_EQ(0u, st) << "stats[" << i << "] error.";
-        break;
-      }
-      case 1: {
-        EXPECT_GT(st, 0u) << "stats[" << i << "] error.";
-        break;
-      }
-    }
-  }
-}
-
-// Following is the implementation of TestWebRtcVadDtx.
-TestWebRtcVadDtx::TestWebRtcVadDtx()
-    : vad_enabled_(false),
-      dtx_enabled_(false),
-      output_file_num_(0) {
-}
-
-void TestWebRtcVadDtx::Perform() {
-  // Go through various test cases.
-#ifdef WEBRTC_CODEC_ISAC
-  // Register iSAC WB as send codec
-  RegisterCodec(kIsacWb);
-  RunTestCases();
-
-  // Register iSAC SWB as send codec
-  RegisterCodec(kIsacSwb);
-  RunTestCases();
-#endif
-
-#ifdef WEBRTC_CODEC_ILBC
-  // Register iLBC as send codec
-  RegisterCodec(kIlbc);
-  RunTestCases();
-#endif
-
-#ifdef WEBRTC_CODEC_OPUS
-  // Register Opus as send codec
-  RegisterCodec(kOpus);
-  RunTestCases();
-#endif
-}
-
-// Test various configurations on VAD/DTX.
-void TestWebRtcVadDtx::RunTestCases() {
-  // #1 DTX = OFF, VAD = OFF, VADNormal
-  SetVAD(false, false, VADNormal);
-  Test(true);
-
-  // #2 DTX = ON, VAD = ON, VADAggr
-  SetVAD(true, true, VADAggr);
-  Test(false);
-
-  // #3 DTX = ON, VAD = ON, VADLowBitrate
-  SetVAD(true, true, VADLowBitrate);
-  Test(false);
-
-  // #4 DTX = ON, VAD = ON, VADVeryAggr
-  SetVAD(true, true, VADVeryAggr);
-  Test(false);
-
-  // #5 DTX = ON, VAD = ON, VADNormal
-  SetVAD(true, true, VADNormal);
-  Test(false);
-}
-
-// Set the expectation and run the test.
-void TestWebRtcVadDtx::Test(bool new_outfile) {
-  int expects[] = {-1, 1, dtx_enabled_, 0, 0};
-  if (new_outfile) {
-    output_file_num_++;
-  }
-  std::stringstream out_filename;
-  out_filename << webrtc::test::OutputPath()
-               << "testWebRtcVadDtx_outFile_"
-               << output_file_num_
-               << ".pcm";
-  Run(webrtc::test::ResourcePath("audio_coding/testfile32kHz", "pcm"),
-      32000, 1, out_filename.str(), !new_outfile, expects);
-}
-
-void TestWebRtcVadDtx::SetVAD(bool enable_dtx, bool enable_vad,
-                              ACMVADMode vad_mode) {
-  ACMVADMode mode;
-  EXPECT_EQ(0, acm_send_->SetVAD(enable_dtx, enable_vad, vad_mode));
-  EXPECT_EQ(0, acm_send_->VAD(&dtx_enabled_, &vad_enabled_, &mode));
-
-  auto codec_param = acm_send_->SendCodec();
-  ASSERT_TRUE(codec_param);
-  if (STR_CASE_CMP(codec_param->plname, "opus") == 0) {
-    // If send codec is Opus, WebRTC VAD/DTX cannot be used.
-    enable_dtx = enable_vad = false;
-  }
-
-  EXPECT_EQ(dtx_enabled_ , enable_dtx); // DTX should be set as expected.
-
-  if (dtx_enabled_) {
-    EXPECT_TRUE(vad_enabled_); // WebRTC DTX cannot run without WebRTC VAD.
-  } else {
-    // Using no DTX should not affect setting of VAD.
-    EXPECT_EQ(enable_vad, vad_enabled_);
-  }
-}
-
-// Following is the implementation of TestOpusDtx.
-void TestOpusDtx::Perform() {
-#ifdef WEBRTC_CODEC_ISAC
-  // If we set other codec than Opus, DTX cannot be switched on.
-  RegisterCodec(kIsacWb);
-  EXPECT_EQ(-1, acm_send_->EnableOpusDtx());
-  EXPECT_EQ(0, acm_send_->DisableOpusDtx());
-#endif
-
-#ifdef WEBRTC_CODEC_OPUS
-  int expects[] = {0, 1, 0, 0, 0};
-
-  // Register Opus as send codec
-  std::string out_filename = webrtc::test::OutputPath() +
-      "testOpusDtx_outFile_mono.pcm";
-  RegisterCodec(kOpus);
-  EXPECT_EQ(0, acm_send_->DisableOpusDtx());
-
-  Run(webrtc::test::ResourcePath("audio_coding/testfile32kHz", "pcm"),
-      32000, 1, out_filename, false, expects);
-
-  EXPECT_EQ(0, acm_send_->EnableOpusDtx());
-  expects[kEmptyFrame] = 1;
-  Run(webrtc::test::ResourcePath("audio_coding/testfile32kHz", "pcm"),
-      32000, 1, out_filename, true, expects);
-
-  // Register stereo Opus as send codec
-  out_filename = webrtc::test::OutputPath() + "testOpusDtx_outFile_stereo.pcm";
-  RegisterCodec(kOpusStereo);
-  EXPECT_EQ(0, acm_send_->DisableOpusDtx());
-  expects[kEmptyFrame] = 0;
-  Run(webrtc::test::ResourcePath("audio_coding/teststereo32kHz", "pcm"),
-      32000, 2, out_filename, false, expects);
-
-  EXPECT_EQ(0, acm_send_->EnableOpusDtx());
-
-  expects[kEmptyFrame] = 1;
-  Run(webrtc::test::ResourcePath("audio_coding/teststereo32kHz", "pcm"),
-      32000, 2, out_filename, true, expects);
-#endif
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/test/TestVADDTX.h b/modules/audio_coding/test/TestVADDTX.h
deleted file mode 100644
index b7e9871..0000000
--- a/modules/audio_coding/test/TestVADDTX.h
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- *  Copyright (c) 2011 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_TEST_TESTVADDTX_H_
-#define WEBRTC_MODULES_AUDIO_CODING_TEST_TESTVADDTX_H_
-
-#include <memory>
-
-#include "webrtc/common_types.h"
-#include "webrtc/modules/audio_coding/include/audio_coding_module.h"
-#include "webrtc/modules/audio_coding/include/audio_coding_module_typedefs.h"
-#include "webrtc/modules/audio_coding/test/ACMTest.h"
-#include "webrtc/modules/audio_coding/test/Channel.h"
-
-namespace webrtc {
-
-class ActivityMonitor : public ACMVADCallback {
- public:
-  ActivityMonitor();
-  int32_t InFrameType(FrameType frame_type);
-  void PrintStatistics();
-  void ResetStatistics();
-  void GetStatistics(uint32_t* stats);
- private:
-  // 0 - kEmptyFrame
-  // 1 - kAudioFrameSpeech
-  // 2 - kAudioFrameCN
-  // 3 - kVideoFrameKey (not used by audio)
-  // 4 - kVideoFrameDelta (not used by audio)
-  uint32_t counter_[5];
-};
-
-
-// TestVadDtx is to verify that VAD/DTX perform as they should. It runs through
-// an audio file and check if the occurrence of various packet types follows
-// expectation. TestVadDtx needs its derived class to implement the Perform()
-// to put the test together.
-class TestVadDtx : public ACMTest {
- public:
-  static const int kOutputFreqHz = 16000;
-
-  TestVadDtx();
-
-  virtual void Perform() = 0;
-
- protected:
-  void RegisterCodec(CodecInst codec_param);
-
-  // Encoding a file and see if the numbers that various packets occur follow
-  // the expectation. Saves result to a file.
-  // expects[x] means
-  // -1 : do not care,
-  // 0  : there have been no packets of type |x|,
-  // 1  : there have been packets of type |x|,
-  // with |x| indicates the following packet types
-  // 0 - kEmptyFrame
-  // 1 - kAudioFrameSpeech
-  // 2 - kAudioFrameCN
-  // 3 - kVideoFrameKey (not used by audio)
-  // 4 - kVideoFrameDelta (not used by audio)
-  void Run(std::string in_filename, int frequency, int channels,
-           std::string out_filename, bool append, const int* expects);
-
-  std::unique_ptr<AudioCodingModule> acm_send_;
-  std::unique_ptr<AudioCodingModule> acm_receive_;
-  std::unique_ptr<Channel> channel_;
-  std::unique_ptr<ActivityMonitor> monitor_;
-  uint32_t time_stamp_ = 0x12345678;
-};
-
-// TestWebRtcVadDtx is to verify that the WebRTC VAD/DTX perform as they should.
-class TestWebRtcVadDtx final : public TestVadDtx {
- public:
-  TestWebRtcVadDtx();
-
-  void Perform() override;
-
- private:
-  void RunTestCases();
-  void Test(bool new_outfile);
-  void SetVAD(bool enable_dtx, bool enable_vad, ACMVADMode vad_mode);
-
-  bool vad_enabled_;
-  bool dtx_enabled_;
-  int output_file_num_;
-};
-
-// TestOpusDtx is to verify that the Opus DTX performs as it should.
-class TestOpusDtx final : public TestVadDtx {
- public:
-  void Perform() override;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_CODING_TEST_TESTVADDTX_H_
diff --git a/modules/audio_coding/test/Tester.cc b/modules/audio_coding/test/Tester.cc
deleted file mode 100644
index 0d3f3f4..0000000
--- a/modules/audio_coding/test/Tester.cc
+++ /dev/null
@@ -1,198 +0,0 @@
-/*
- *  Copyright (c) 2012 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 <stdio.h>
-#include <string>
-#include <vector>
-
-#include "webrtc/modules/audio_coding/include/audio_coding_module.h"
-#include "webrtc/modules/audio_coding/test/APITest.h"
-#include "webrtc/modules/audio_coding/test/EncodeDecodeTest.h"
-#include "webrtc/modules/audio_coding/test/PacketLossTest.h"
-#include "webrtc/modules/audio_coding/test/TestAllCodecs.h"
-#include "webrtc/modules/audio_coding/test/TestRedFec.h"
-#include "webrtc/modules/audio_coding/test/TestStereo.h"
-#include "webrtc/modules/audio_coding/test/TestVADDTX.h"
-#include "webrtc/modules/audio_coding/test/TwoWayCommunication.h"
-#include "webrtc/modules/audio_coding/test/iSACTest.h"
-#include "webrtc/modules/audio_coding/test/opus_test.h"
-#include "webrtc/system_wrappers/include/trace.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/testsupport/fileutils.h"
-
-using webrtc::Trace;
-
-// This parameter is used to describe how to run the tests. It is normally
-// set to 0, and all tests are run in quite mode.
-#define ACM_TEST_MODE 0
-
-TEST(AudioCodingModuleTest, TestAllCodecs) {
-  Trace::CreateTrace();
-  Trace::SetTraceFile((webrtc::test::OutputPath() +
-          "acm_allcodecs_trace.txt").c_str());
-  webrtc::TestAllCodecs(ACM_TEST_MODE).Perform();
-  Trace::ReturnTrace();
-}
-
-#if defined(WEBRTC_ANDROID)
-TEST(AudioCodingModuleTest, DISABLED_TestEncodeDecode) {
-#else
-TEST(AudioCodingModuleTest, TestEncodeDecode) {
-#endif
-  Trace::CreateTrace();
-  Trace::SetTraceFile((webrtc::test::OutputPath() +
-      "acm_encodedecode_trace.txt").c_str());
-  webrtc::EncodeDecodeTest(ACM_TEST_MODE).Perform();
-  Trace::ReturnTrace();
-}
-
-#if defined(WEBRTC_CODEC_RED)
-#if defined(WEBRTC_ANDROID)
-TEST(AudioCodingModuleTest, DISABLED_TestRedFec) {
-#else
-TEST(AudioCodingModuleTest, TestRedFec) {
-#endif
-  Trace::CreateTrace();
-  Trace::SetTraceFile((webrtc::test::OutputPath() +
-      "acm_fec_trace.txt").c_str());
-  webrtc::TestRedFec().Perform();
-  Trace::ReturnTrace();
-}
-#endif
-
-#if defined(WEBRTC_CODEC_ISAC) || defined(WEBRTC_CODEC_ISACFX)
-#if defined(WEBRTC_ANDROID)
-TEST(AudioCodingModuleTest, DISABLED_TestIsac) {
-#else
-TEST(AudioCodingModuleTest, TestIsac) {
-#endif
-  Trace::CreateTrace();
-  Trace::SetTraceFile((webrtc::test::OutputPath() +
-      "acm_isac_trace.txt").c_str());
-  webrtc::ISACTest(ACM_TEST_MODE).Perform();
-  Trace::ReturnTrace();
-}
-#endif
-
-#if (defined(WEBRTC_CODEC_ISAC) || defined(WEBRTC_CODEC_ISACFX)) && \
-    defined(WEBRTC_CODEC_ILBC) && defined(WEBRTC_CODEC_G722)
-#if defined(WEBRTC_ANDROID)
-TEST(AudioCodingModuleTest, DISABLED_TwoWayCommunication) {
-#else
-TEST(AudioCodingModuleTest, TwoWayCommunication) {
-#endif
-  Trace::CreateTrace();
-  Trace::SetTraceFile((webrtc::test::OutputPath() +
-      "acm_twowaycom_trace.txt").c_str());
-  webrtc::TwoWayCommunication(ACM_TEST_MODE).Perform();
-  Trace::ReturnTrace();
-}
-#endif
-
-// Disabled on ios as flaky, see https://crbug.com/webrtc/7057
-#if defined(WEBRTC_ANDROID) || defined(WEBRTC_IOS)
-TEST(AudioCodingModuleTest, DISABLED_TestStereo) {
-#else
-TEST(AudioCodingModuleTest, TestStereo) {
-#endif
-  Trace::CreateTrace();
-  Trace::SetTraceFile((webrtc::test::OutputPath() +
-      "acm_stereo_trace.txt").c_str());
-  webrtc::TestStereo(ACM_TEST_MODE).Perform();
-  Trace::ReturnTrace();
-}
-
-// Disabled on ios as flaky, see https://crbug.com/webrtc/7057
-#if defined(WEBRTC_ANDROID) || defined(WEBRTC_IOS)
-TEST(AudioCodingModuleTest, DISABLED_TestWebRtcVadDtx) {
-#else
-TEST(AudioCodingModuleTest, TestWebRtcVadDtx) {
-#endif
-  Trace::CreateTrace();
-  Trace::SetTraceFile((webrtc::test::OutputPath() +
-      "acm_vaddtx_trace.txt").c_str());
-  webrtc::TestWebRtcVadDtx().Perform();
-  Trace::ReturnTrace();
-}
-
-TEST(AudioCodingModuleTest, TestOpusDtx) {
-  Trace::CreateTrace();
-  Trace::SetTraceFile((webrtc::test::OutputPath() +
-      "acm_opusdtx_trace.txt").c_str());
-  webrtc::TestOpusDtx().Perform();
-  Trace::ReturnTrace();
-}
-
-// Disabled on ios as flaky, see https://crbug.com/webrtc/7057
-#if defined(WEBRTC_IOS)
-TEST(AudioCodingModuleTest, DISABLED_TestOpus) {
-#else
-TEST(AudioCodingModuleTest, TestOpus) {
-#endif
-  Trace::CreateTrace();
-  Trace::SetTraceFile((webrtc::test::OutputPath() +
-      "acm_opus_trace.txt").c_str());
-  webrtc::OpusTest().Perform();
-  Trace::ReturnTrace();
-}
-
-TEST(AudioCodingModuleTest, TestPacketLoss) {
-  Trace::CreateTrace();
-  Trace::SetTraceFile((webrtc::test::OutputPath() +
-      "acm_packetloss_trace.txt").c_str());
-  webrtc::PacketLossTest(1, 10, 10, 1).Perform();
-  Trace::ReturnTrace();
-}
-
-TEST(AudioCodingModuleTest, TestPacketLossBurst) {
-  Trace::CreateTrace();
-  Trace::SetTraceFile((webrtc::test::OutputPath() +
-      "acm_packetloss_burst_trace.txt").c_str());
-  webrtc::PacketLossTest(1, 10, 10, 2).Perform();
-  Trace::ReturnTrace();
-}
-
-// Disabled on ios as flake, see https://crbug.com/webrtc/7057
-#if defined(WEBRTC_IOS)
-TEST(AudioCodingModuleTest, DISABLED_TestPacketLossStereo) {
-#else
-  TEST(AudioCodingModuleTest, TestPacketLossStereo) {
-#endif
-  Trace::CreateTrace();
-  Trace::SetTraceFile((webrtc::test::OutputPath() +
-      "acm_packetloss_trace.txt").c_str());
-  webrtc::PacketLossTest(2, 10, 10, 1).Perform();
-  Trace::ReturnTrace();
-}
-
-// Disabled on ios as flake, see https://crbug.com/webrtc/7057
-#if defined(WEBRTC_IOS)
-TEST(AudioCodingModuleTest, DISABLED_TestPacketLossStereoBurst) {
-#else
-TEST(AudioCodingModuleTest, TestPacketLossStereoBurst) {
-#endif
-  Trace::CreateTrace();
-  Trace::SetTraceFile((webrtc::test::OutputPath() +
-      "acm_packetloss_burst_trace.txt").c_str());
-  webrtc::PacketLossTest(2, 10, 10, 2).Perform();
-  Trace::ReturnTrace();
-}
-
-// The full API test is too long to run automatically on bots, but can be used
-// for offline testing. User interaction is needed.
-#ifdef ACM_TEST_FULL_API
-  TEST(AudioCodingModuleTest, TestAPI) {
-    Trace::CreateTrace();
-    Trace::SetTraceFile((webrtc::test::OutputPath() +
-        "acm_apitest_trace.txt").c_str());
-    webrtc::APITest().Perform();
-    Trace::ReturnTrace();
-  }
-#endif
diff --git a/modules/audio_coding/test/TwoWayCommunication.cc b/modules/audio_coding/test/TwoWayCommunication.cc
deleted file mode 100644
index 3287c91..0000000
--- a/modules/audio_coding/test/TwoWayCommunication.cc
+++ /dev/null
@@ -1,309 +0,0 @@
-/*
- *  Copyright (c) 2012 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 "TwoWayCommunication.h"
-
-#include <ctype.h>
-#include <stdio.h>
-#include <string.h>
-
-#include <memory>
-
-#ifdef WIN32
-#include <Windows.h>
-#endif
-
-#include "webrtc/api/audio_codecs/builtin_audio_decoder_factory.h"
-#include "webrtc/common_types.h"
-#include "webrtc/modules/audio_coding/codecs/audio_format_conversion.h"
-#include "webrtc/modules/audio_coding/test/PCMFile.h"
-#include "webrtc/modules/audio_coding/test/utility.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/testsupport/fileutils.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-#define MAX_FILE_NAME_LENGTH_BYTE 500
-
-TwoWayCommunication::TwoWayCommunication(int testMode)
-    : _acmA(AudioCodingModule::Create(1)),
-      _acmRefA(AudioCodingModule::Create(3)),
-      _testMode(testMode) {
-  AudioCodingModule::Config config;
-  // The clicks will be more obvious in FAX mode. TODO(henrik.lundin) Really?
-  config.neteq_config.playout_mode = kPlayoutFax;
-  config.id = 2;
-  config.decoder_factory = CreateBuiltinAudioDecoderFactory();
-  _acmB.reset(AudioCodingModule::Create(config));
-  config.id = 4;
-  _acmRefB.reset(AudioCodingModule::Create(config));
-}
-
-TwoWayCommunication::~TwoWayCommunication() {
-  delete _channel_A2B;
-  delete _channel_B2A;
-  delete _channelRef_A2B;
-  delete _channelRef_B2A;
-  _inFileA.Close();
-  _inFileB.Close();
-  _outFileA.Close();
-  _outFileB.Close();
-  _outFileRefA.Close();
-  _outFileRefB.Close();
-}
-
-void TwoWayCommunication::ChooseCodec(uint8_t* codecID_A,
-                                      uint8_t* codecID_B) {
-  std::unique_ptr<AudioCodingModule> tmpACM(AudioCodingModule::Create(0));
-  uint8_t noCodec = tmpACM->NumberOfCodecs();
-  CodecInst codecInst;
-  printf("List of Supported Codecs\n");
-  printf("========================\n");
-  for (uint8_t codecCntr = 0; codecCntr < noCodec; codecCntr++) {
-    EXPECT_EQ(tmpACM->Codec(codecCntr, &codecInst), 0);
-    printf("%d- %s\n", codecCntr, codecInst.plname);
-  }
-  printf("\nChoose a send codec for side A [0]: ");
-  char myStr[15] = "";
-  EXPECT_TRUE(fgets(myStr, 10, stdin) != NULL);
-  *codecID_A = (uint8_t) atoi(myStr);
-
-  printf("\nChoose a send codec for side B [0]: ");
-  EXPECT_TRUE(fgets(myStr, 10, stdin) != NULL);
-  *codecID_B = (uint8_t) atoi(myStr);
-
-  printf("\n");
-}
-
-void TwoWayCommunication::SetUp() {
-  uint8_t codecID_A;
-  uint8_t codecID_B;
-
-  ChooseCodec(&codecID_A, &codecID_B);
-  CodecInst codecInst_A;
-  CodecInst codecInst_B;
-  CodecInst dummyCodec;
-  EXPECT_EQ(0, _acmA->Codec(codecID_A, &codecInst_A));
-  EXPECT_EQ(0, _acmB->Codec(codecID_B, &codecInst_B));
-  EXPECT_EQ(0, _acmA->Codec(6, &dummyCodec));
-
-  //--- Set A codecs
-  EXPECT_EQ(0, _acmA->RegisterSendCodec(codecInst_A));
-  EXPECT_EQ(true, _acmA->RegisterReceiveCodec(codecInst_B.pltype,
-                                              CodecInstToSdp(codecInst_B)));
-  //--- Set ref-A codecs
-  EXPECT_EQ(0, _acmRefA->RegisterSendCodec(codecInst_A));
-  EXPECT_EQ(true, _acmRefA->RegisterReceiveCodec(codecInst_B.pltype,
-                                                 CodecInstToSdp(codecInst_B)));
-
-  //--- Set B codecs
-  EXPECT_EQ(0, _acmB->RegisterSendCodec(codecInst_B));
-  EXPECT_EQ(true, _acmB->RegisterReceiveCodec(codecInst_A.pltype,
-                                              CodecInstToSdp(codecInst_A)));
-
-  //--- Set ref-B codecs
-  EXPECT_EQ(0, _acmRefB->RegisterSendCodec(codecInst_B));
-  EXPECT_EQ(true, _acmRefB->RegisterReceiveCodec(codecInst_A.pltype,
-                                                 CodecInstToSdp(codecInst_A)));
-
-  uint16_t frequencyHz;
-
-  //--- Input A
-  std::string in_file_name = webrtc::test::ResourcePath(
-      "audio_coding/testfile32kHz", "pcm");
-  frequencyHz = 32000;
-  printf("Enter input file at side A [%s]: ", in_file_name.c_str());
-  PCMFile::ChooseFile(&in_file_name, 499, &frequencyHz);
-  _inFileA.Open(in_file_name, frequencyHz, "rb");
-
-  //--- Output A
-  std::string out_file_a = webrtc::test::OutputPath() + "outA.pcm";
-  printf("Output file at side A: %s\n", out_file_a.c_str());
-  printf("Sampling frequency (in Hz) of the above file: %u\n", frequencyHz);
-  _outFileA.Open(out_file_a, frequencyHz, "wb");
-  std::string ref_file_name = webrtc::test::OutputPath() + "ref_outA.pcm";
-  _outFileRefA.Open(ref_file_name, frequencyHz, "wb");
-
-  //--- Input B
-  in_file_name = webrtc::test::ResourcePath("audio_coding/testfile32kHz",
-                                            "pcm");
-  frequencyHz = 32000;
-  printf("\n\nEnter input file at side B [%s]: ", in_file_name.c_str());
-  PCMFile::ChooseFile(&in_file_name, 499, &frequencyHz);
-  _inFileB.Open(in_file_name, frequencyHz, "rb");
-
-  //--- Output B
-  std::string out_file_b = webrtc::test::OutputPath() + "outB.pcm";
-  printf("Output file at side B: %s\n", out_file_b.c_str());
-  printf("Sampling frequency (in Hz) of the above file: %u\n", frequencyHz);
-  _outFileB.Open(out_file_b, frequencyHz, "wb");
-  ref_file_name = webrtc::test::OutputPath() + "ref_outB.pcm";
-  _outFileRefB.Open(ref_file_name, frequencyHz, "wb");
-
-  //--- Set A-to-B channel
-  _channel_A2B = new Channel;
-  _acmA->RegisterTransportCallback(_channel_A2B);
-  _channel_A2B->RegisterReceiverACM(_acmB.get());
-  //--- Do the same for the reference
-  _channelRef_A2B = new Channel;
-  _acmRefA->RegisterTransportCallback(_channelRef_A2B);
-  _channelRef_A2B->RegisterReceiverACM(_acmRefB.get());
-
-  //--- Set B-to-A channel
-  _channel_B2A = new Channel;
-  _acmB->RegisterTransportCallback(_channel_B2A);
-  _channel_B2A->RegisterReceiverACM(_acmA.get());
-  //--- Do the same for reference
-  _channelRef_B2A = new Channel;
-  _acmRefB->RegisterTransportCallback(_channelRef_B2A);
-  _channelRef_B2A->RegisterReceiverACM(_acmRefA.get());
-}
-
-void TwoWayCommunication::SetUpAutotest() {
-  CodecInst codecInst_A;
-  CodecInst codecInst_B;
-  CodecInst dummyCodec;
-
-  EXPECT_EQ(0, _acmA->Codec("ISAC", &codecInst_A, 16000, 1));
-  EXPECT_EQ(0, _acmB->Codec("L16", &codecInst_B, 8000, 1));
-  EXPECT_EQ(0, _acmA->Codec(6, &dummyCodec));
-
-  //--- Set A codecs
-  EXPECT_EQ(0, _acmA->RegisterSendCodec(codecInst_A));
-  EXPECT_EQ(true, _acmA->RegisterReceiveCodec(codecInst_B.pltype,
-                                              CodecInstToSdp(codecInst_B)));
-
-  //--- Set ref-A codecs
-  EXPECT_GT(_acmRefA->RegisterSendCodec(codecInst_A), -1);
-  EXPECT_EQ(true, _acmRefA->RegisterReceiveCodec(codecInst_B.pltype,
-                                                 CodecInstToSdp(codecInst_B)));
-
-  //--- Set B codecs
-  EXPECT_GT(_acmB->RegisterSendCodec(codecInst_B), -1);
-  EXPECT_EQ(true, _acmB->RegisterReceiveCodec(codecInst_A.pltype,
-                                              CodecInstToSdp(codecInst_A)));
-
-  //--- Set ref-B codecs
-  EXPECT_EQ(0, _acmRefB->RegisterSendCodec(codecInst_B));
-  EXPECT_EQ(true, _acmRefB->RegisterReceiveCodec(codecInst_A.pltype,
-                                                 CodecInstToSdp(codecInst_A)));
-
-  uint16_t frequencyHz;
-
-  //--- Input A and B
-  std::string in_file_name = webrtc::test::ResourcePath(
-      "audio_coding/testfile32kHz", "pcm");
-  frequencyHz = 16000;
-  _inFileA.Open(in_file_name, frequencyHz, "rb");
-  _inFileB.Open(in_file_name, frequencyHz, "rb");
-
-  //--- Output A
-  std::string output_file_a = webrtc::test::OutputPath() + "outAutotestA.pcm";
-  frequencyHz = 16000;
-  _outFileA.Open(output_file_a, frequencyHz, "wb");
-  std::string output_ref_file_a = webrtc::test::OutputPath()
-      + "ref_outAutotestA.pcm";
-  _outFileRefA.Open(output_ref_file_a, frequencyHz, "wb");
-
-  //--- Output B
-  std::string output_file_b = webrtc::test::OutputPath() + "outAutotestB.pcm";
-  frequencyHz = 16000;
-  _outFileB.Open(output_file_b, frequencyHz, "wb");
-  std::string output_ref_file_b = webrtc::test::OutputPath()
-      + "ref_outAutotestB.pcm";
-  _outFileRefB.Open(output_ref_file_b, frequencyHz, "wb");
-
-  //--- Set A-to-B channel
-  _channel_A2B = new Channel;
-  _acmA->RegisterTransportCallback(_channel_A2B);
-  _channel_A2B->RegisterReceiverACM(_acmB.get());
-  //--- Do the same for the reference
-  _channelRef_A2B = new Channel;
-  _acmRefA->RegisterTransportCallback(_channelRef_A2B);
-  _channelRef_A2B->RegisterReceiverACM(_acmRefB.get());
-
-  //--- Set B-to-A channel
-  _channel_B2A = new Channel;
-  _acmB->RegisterTransportCallback(_channel_B2A);
-  _channel_B2A->RegisterReceiverACM(_acmA.get());
-  //--- Do the same for reference
-  _channelRef_B2A = new Channel;
-  _acmRefB->RegisterTransportCallback(_channelRef_B2A);
-  _channelRef_B2A->RegisterReceiverACM(_acmRefA.get());
-}
-
-void TwoWayCommunication::Perform() {
-  if (_testMode == 0) {
-    SetUpAutotest();
-  } else {
-    SetUp();
-  }
-  unsigned int msecPassed = 0;
-  unsigned int secPassed = 0;
-
-  int32_t outFreqHzA = _outFileA.SamplingFrequency();
-  int32_t outFreqHzB = _outFileB.SamplingFrequency();
-
-  AudioFrame audioFrame;
-
-  auto codecInst_B = _acmB->SendCodec();
-  ASSERT_TRUE(codecInst_B);
-
-  // In the following loop we tests that the code can handle misuse of the APIs.
-  // In the middle of a session with data flowing between two sides, called A
-  // and B, APIs will be called, and the code should continue to run, and be
-  // able to recover.
-  while (!_inFileA.EndOfFile() && !_inFileB.EndOfFile()) {
-    msecPassed += 10;
-    EXPECT_GT(_inFileA.Read10MsData(audioFrame), 0);
-    EXPECT_GE(_acmA->Add10MsData(audioFrame), 0);
-    EXPECT_GE(_acmRefA->Add10MsData(audioFrame), 0);
-
-    EXPECT_GT(_inFileB.Read10MsData(audioFrame), 0);
-
-    EXPECT_GE(_acmB->Add10MsData(audioFrame), 0);
-    EXPECT_GE(_acmRefB->Add10MsData(audioFrame), 0);
-    bool muted;
-    EXPECT_EQ(0, _acmA->PlayoutData10Ms(outFreqHzA, &audioFrame, &muted));
-    ASSERT_FALSE(muted);
-    _outFileA.Write10MsData(audioFrame);
-    EXPECT_EQ(0, _acmRefA->PlayoutData10Ms(outFreqHzA, &audioFrame, &muted));
-    ASSERT_FALSE(muted);
-    _outFileRefA.Write10MsData(audioFrame);
-    EXPECT_EQ(0, _acmB->PlayoutData10Ms(outFreqHzB, &audioFrame, &muted));
-    ASSERT_FALSE(muted);
-    _outFileB.Write10MsData(audioFrame);
-    EXPECT_EQ(0, _acmRefB->PlayoutData10Ms(outFreqHzB, &audioFrame, &muted));
-    ASSERT_FALSE(muted);
-    _outFileRefB.Write10MsData(audioFrame);
-
-    // Update time counters each time a second of data has passed.
-    if (msecPassed >= 1000) {
-      msecPassed = 0;
-      secPassed++;
-    }
-    // Re-register send codec on side B.
-    if (((secPassed % 5) == 4) && (msecPassed >= 990)) {
-      EXPECT_EQ(0, _acmB->RegisterSendCodec(*codecInst_B));
-      EXPECT_TRUE(_acmB->SendCodec());
-    }
-    // Initialize receiver on side A.
-    if (((secPassed % 7) == 6) && (msecPassed == 0))
-      EXPECT_EQ(0, _acmA->InitializeReceiver());
-    // Re-register codec on side A.
-    if (((secPassed % 7) == 6) && (msecPassed >= 990)) {
-      EXPECT_EQ(true, _acmA->RegisterReceiveCodec(
-                          codecInst_B->pltype, CodecInstToSdp(*codecInst_B)));
-    }
-  }
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/test/TwoWayCommunication.h b/modules/audio_coding/test/TwoWayCommunication.h
deleted file mode 100644
index f9d37f7..0000000
--- a/modules/audio_coding/test/TwoWayCommunication.h
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- *  Copyright (c) 2012 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_TEST_TWOWAYCOMMUNICATION_H_
-#define WEBRTC_MODULES_AUDIO_CODING_TEST_TWOWAYCOMMUNICATION_H_
-
-#include <memory>
-
-#include "webrtc/modules/audio_coding/include/audio_coding_module.h"
-#include "webrtc/modules/audio_coding/test/ACMTest.h"
-#include "webrtc/modules/audio_coding/test/Channel.h"
-#include "webrtc/modules/audio_coding/test/PCMFile.h"
-#include "webrtc/modules/audio_coding/test/utility.h"
-
-namespace webrtc {
-
-class TwoWayCommunication : public ACMTest {
- public:
-  explicit TwoWayCommunication(int testMode);
-  ~TwoWayCommunication();
-
-  void Perform();
- private:
-  void ChooseCodec(uint8_t* codecID_A, uint8_t* codecID_B);
-  void SetUp();
-  void SetUpAutotest();
-
-  std::unique_ptr<AudioCodingModule> _acmA;
-  std::unique_ptr<AudioCodingModule> _acmB;
-
-  std::unique_ptr<AudioCodingModule> _acmRefA;
-  std::unique_ptr<AudioCodingModule> _acmRefB;
-
-  Channel* _channel_A2B;
-  Channel* _channel_B2A;
-
-  Channel* _channelRef_A2B;
-  Channel* _channelRef_B2A;
-
-  PCMFile _inFileA;
-  PCMFile _inFileB;
-
-  PCMFile _outFileA;
-  PCMFile _outFileB;
-
-  PCMFile _outFileRefA;
-  PCMFile _outFileRefB;
-
-  int _testMode;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_CODING_TEST_TWOWAYCOMMUNICATION_H_
diff --git a/modules/audio_coding/test/delay_test.cc b/modules/audio_coding/test/delay_test.cc
deleted file mode 100644
index 0ce7fd2..0000000
--- a/modules/audio_coding/test/delay_test.cc
+++ /dev/null
@@ -1,277 +0,0 @@
-/*
- *  Copyright (c) 2013 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 <assert.h>
-#include <math.h>
-#include <string.h>
-
-#include <iostream>
-#include <memory>
-
-#include "webrtc/common_types.h"
-#include "webrtc/modules/audio_coding/codecs/audio_format_conversion.h"
-#include "webrtc/modules/audio_coding/include/audio_coding_module.h"
-#include "webrtc/modules/audio_coding/include/audio_coding_module_typedefs.h"
-#include "webrtc/modules/audio_coding/test/Channel.h"
-#include "webrtc/modules/audio_coding/test/PCMFile.h"
-#include "webrtc/modules/audio_coding/test/utility.h"
-#include "webrtc/rtc_base/flags.h"
-#include "webrtc/system_wrappers/include/event_wrapper.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/testsupport/fileutils.h"
-#include "webrtc/typedefs.h"
-
-DEFINE_string(codec, "isac", "Codec Name");
-DEFINE_int(sample_rate_hz, 16000, "Sampling rate in Hertz.");
-DEFINE_int(num_channels, 1, "Number of Channels.");
-DEFINE_string(input_file, "", "Input file, PCM16 32 kHz, optional.");
-DEFINE_int(delay, 0, "Delay in millisecond.");
-DEFINE_bool(dtx, false, "Enable DTX at the sender side.");
-DEFINE_bool(packet_loss, false, "Apply packet loss, c.f. Channel{.cc, .h}.");
-DEFINE_bool(fec, false, "Use Forward Error Correction (FEC).");
-DEFINE_bool(help, false, "Print this message.");
-
-namespace webrtc {
-
-namespace {
-
-struct CodecSettings {
-  char name[50];
-  int sample_rate_hz;
-  int num_channels;
-};
-
-struct AcmSettings {
-  bool dtx;
-  bool fec;
-};
-
-struct TestSettings {
-  CodecSettings codec;
-  AcmSettings acm;
-  bool packet_loss;
-};
-
-}  // namespace
-
-class DelayTest {
- public:
-  DelayTest()
-      : acm_a_(AudioCodingModule::Create(0)),
-        acm_b_(AudioCodingModule::Create(1)),
-        channel_a2b_(new Channel),
-        test_cntr_(0),
-        encoding_sample_rate_hz_(8000) {}
-
-  ~DelayTest() {
-    if (channel_a2b_ != NULL) {
-      delete channel_a2b_;
-      channel_a2b_ = NULL;
-    }
-    in_file_a_.Close();
-  }
-
-  void Initialize() {
-    test_cntr_ = 0;
-    std::string file_name = webrtc::test::ResourcePath(
-        "audio_coding/testfile32kHz", "pcm");
-    if (strlen(FLAG_input_file) > 0)
-      file_name = FLAG_input_file;
-    in_file_a_.Open(file_name, 32000, "rb");
-    ASSERT_EQ(0, acm_a_->InitializeReceiver()) <<
-        "Couldn't initialize receiver.\n";
-    ASSERT_EQ(0, acm_b_->InitializeReceiver()) <<
-        "Couldn't initialize receiver.\n";
-
-    if (FLAG_delay > 0) {
-      ASSERT_EQ(0, acm_b_->SetMinimumPlayoutDelay(FLAG_delay)) <<
-          "Failed to set minimum delay.\n";
-    }
-
-    int num_encoders = acm_a_->NumberOfCodecs();
-    CodecInst my_codec_param;
-    for (int n = 0; n < num_encoders; n++) {
-      EXPECT_EQ(0, acm_b_->Codec(n, &my_codec_param)) <<
-          "Failed to get codec.";
-      if (STR_CASE_CMP(my_codec_param.plname, "opus") == 0)
-        my_codec_param.channels = 1;
-      else if (my_codec_param.channels > 1)
-        continue;
-      if (STR_CASE_CMP(my_codec_param.plname, "CN") == 0 &&
-          my_codec_param.plfreq == 48000)
-        continue;
-      if (STR_CASE_CMP(my_codec_param.plname, "telephone-event") == 0)
-        continue;
-      ASSERT_EQ(true,
-                acm_b_->RegisterReceiveCodec(my_codec_param.pltype,
-                                             CodecInstToSdp(my_codec_param)));
-    }
-
-    // Create and connect the channel
-    ASSERT_EQ(0, acm_a_->RegisterTransportCallback(channel_a2b_)) <<
-        "Couldn't register Transport callback.\n";
-    channel_a2b_->RegisterReceiverACM(acm_b_.get());
-  }
-
-  void Perform(const TestSettings* config, size_t num_tests, int duration_sec,
-               const char* output_prefix) {
-    for (size_t n = 0; n < num_tests; ++n) {
-      ApplyConfig(config[n]);
-      Run(duration_sec, output_prefix);
-    }
-  }
-
- private:
-  void ApplyConfig(const TestSettings& config) {
-    printf("====================================\n");
-    printf("Test %d \n"
-           "Codec: %s, %d kHz, %d channel(s)\n"
-           "ACM: DTX %s, FEC %s\n"
-           "Channel: %s\n",
-           ++test_cntr_, config.codec.name, config.codec.sample_rate_hz,
-           config.codec.num_channels, config.acm.dtx ? "on" : "off",
-           config.acm.fec ? "on" : "off",
-           config.packet_loss ? "with packet-loss" : "no packet-loss");
-    SendCodec(config.codec);
-    ConfigAcm(config.acm);
-    ConfigChannel(config.packet_loss);
-  }
-
-  void SendCodec(const CodecSettings& config) {
-    CodecInst my_codec_param;
-    ASSERT_EQ(0, AudioCodingModule::Codec(
-              config.name, &my_codec_param, config.sample_rate_hz,
-              config.num_channels)) << "Specified codec is not supported.\n";
-
-    encoding_sample_rate_hz_ = my_codec_param.plfreq;
-    ASSERT_EQ(0, acm_a_->RegisterSendCodec(my_codec_param)) <<
-        "Failed to register send-codec.\n";
-  }
-
-  void ConfigAcm(const AcmSettings& config) {
-    ASSERT_EQ(0, acm_a_->SetVAD(config.dtx, config.dtx, VADAggr)) <<
-        "Failed to set VAD.\n";
-    ASSERT_EQ(0, acm_a_->SetREDStatus(config.fec)) <<
-        "Failed to set RED.\n";
-  }
-
-  void ConfigChannel(bool packet_loss) {
-    channel_a2b_->SetFECTestWithPacketLoss(packet_loss);
-  }
-
-  void OpenOutFile(const char* output_id) {
-    std::stringstream file_stream;
-    file_stream << "delay_test_" << FLAG_codec << "_" << FLAG_sample_rate_hz
-        << "Hz" << "_" << FLAG_delay << "ms.pcm";
-    std::cout << "Output file: " << file_stream.str() << std::endl << std::endl;
-    std::string file_name = webrtc::test::OutputPath() + file_stream.str();
-    out_file_b_.Open(file_name.c_str(), 32000, "wb");
-  }
-
-  void Run(int duration_sec, const char* output_prefix) {
-    OpenOutFile(output_prefix);
-    AudioFrame audio_frame;
-    uint32_t out_freq_hz_b = out_file_b_.SamplingFrequency();
-
-    int num_frames = 0;
-    int in_file_frames = 0;
-    uint32_t received_ts;
-    double average_delay = 0;
-    double inst_delay_sec = 0;
-    while (num_frames < (duration_sec * 100)) {
-      if (in_file_a_.EndOfFile()) {
-        in_file_a_.Rewind();
-      }
-
-      // Print delay information every 16 frame
-      if ((num_frames & 0x3F) == 0x3F) {
-        NetworkStatistics statistics;
-        acm_b_->GetNetworkStatistics(&statistics);
-        fprintf(stdout, "delay: min=%3d  max=%3d  mean=%3d  median=%3d"
-                " ts-based average = %6.3f, "
-                "curr buff-lev = %4u opt buff-lev = %4u \n",
-                statistics.minWaitingTimeMs, statistics.maxWaitingTimeMs,
-                statistics.meanWaitingTimeMs, statistics.medianWaitingTimeMs,
-                average_delay, statistics.currentBufferSize,
-                statistics.preferredBufferSize);
-        fflush (stdout);
-      }
-
-      in_file_a_.Read10MsData(audio_frame);
-      ASSERT_GE(acm_a_->Add10MsData(audio_frame), 0);
-      bool muted;
-      ASSERT_EQ(0,
-                acm_b_->PlayoutData10Ms(out_freq_hz_b, &audio_frame, &muted));
-      RTC_DCHECK(!muted);
-      out_file_b_.Write10MsData(
-          audio_frame.data(),
-          audio_frame.samples_per_channel_ * audio_frame.num_channels_);
-      received_ts = channel_a2b_->LastInTimestamp();
-      rtc::Optional<uint32_t> playout_timestamp = acm_b_->PlayoutTimestamp();
-      ASSERT_TRUE(playout_timestamp);
-      inst_delay_sec = static_cast<uint32_t>(received_ts - *playout_timestamp) /
-                       static_cast<double>(encoding_sample_rate_hz_);
-
-      if (num_frames > 10)
-        average_delay = 0.95 * average_delay + 0.05 * inst_delay_sec;
-
-      ++num_frames;
-      ++in_file_frames;
-    }
-    out_file_b_.Close();
-  }
-
-  std::unique_ptr<AudioCodingModule> acm_a_;
-  std::unique_ptr<AudioCodingModule> acm_b_;
-
-  Channel* channel_a2b_;
-
-  PCMFile in_file_a_;
-  PCMFile out_file_b_;
-  int test_cntr_;
-  int encoding_sample_rate_hz_;
-};
-
-}  // namespace webrtc
-
-int main(int argc, char* argv[]) {
-  if (rtc::FlagList::SetFlagsFromCommandLine(&argc, argv, true)) {
-    return 1;
-  }
-  if (FLAG_help) {
-    rtc::FlagList::Print(nullptr, false);
-    return 0;
-  }
-
-  webrtc::TestSettings test_setting;
-  strcpy(test_setting.codec.name, FLAG_codec);
-
-  if (FLAG_sample_rate_hz != 8000 &&
-      FLAG_sample_rate_hz != 16000 &&
-      FLAG_sample_rate_hz != 32000 &&
-      FLAG_sample_rate_hz != 48000) {
-    std::cout << "Invalid sampling rate.\n";
-    return 1;
-  }
-  test_setting.codec.sample_rate_hz = FLAG_sample_rate_hz;
-  if (FLAG_num_channels < 1 || FLAG_num_channels > 2) {
-    std::cout << "Only mono and stereo are supported.\n";
-    return 1;
-  }
-  test_setting.codec.num_channels = FLAG_num_channels;
-  test_setting.acm.dtx = FLAG_dtx;
-  test_setting.acm.fec = FLAG_fec;
-  test_setting.packet_loss = FLAG_packet_loss;
-
-  webrtc::DelayTest delay_test;
-  delay_test.Initialize();
-  delay_test.Perform(&test_setting, 1, 240, "delay_test");
-  return 0;
-}
diff --git a/modules/audio_coding/test/iSACTest.cc b/modules/audio_coding/test/iSACTest.cc
deleted file mode 100644
index 531fe96..0000000
--- a/modules/audio_coding/test/iSACTest.cc
+++ /dev/null
@@ -1,348 +0,0 @@
-/*
- *  Copyright (c) 2012 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/test/iSACTest.h"
-
-#include <ctype.h>
-#include <stdio.h>
-#include <string.h>
-
-#ifdef _WIN32
-#include <windows.h>
-#elif defined(WEBRTC_LINUX)
-#include <time.h>
-#else
-#include <sys/time.h>
-#include <time.h>
-#endif
-
-#include "webrtc/modules/audio_coding/codecs/audio_format_conversion.h"
-#include "webrtc/modules/audio_coding/test/utility.h"
-#include "webrtc/system_wrappers/include/event_wrapper.h"
-#include "webrtc/test/testsupport/fileutils.h"
-
-namespace webrtc {
-
-void SetISACConfigDefault(ACMTestISACConfig& isacConfig) {
-  isacConfig.currentRateBitPerSec = 0;
-  isacConfig.currentFrameSizeMsec = 0;
-  isacConfig.encodingMode = -1;
-  isacConfig.initRateBitPerSec = 0;
-  isacConfig.initFrameSizeInMsec = 0;
-  isacConfig.enforceFrameSize = false;
-  return;
-}
-
-int16_t SetISAConfig(ACMTestISACConfig& isacConfig, AudioCodingModule* acm,
-                     int testMode) {
-
-  if ((isacConfig.currentRateBitPerSec != 0)
-      || (isacConfig.currentFrameSizeMsec != 0)) {
-    auto sendCodec = acm->SendCodec();
-    EXPECT_TRUE(sendCodec);
-    if (isacConfig.currentRateBitPerSec < 0) {
-      // Register iSAC in adaptive (channel-dependent) mode.
-      sendCodec->rate = -1;
-      EXPECT_EQ(0, acm->RegisterSendCodec(*sendCodec));
-    } else {
-      if (isacConfig.currentRateBitPerSec != 0) {
-        sendCodec->rate = isacConfig.currentRateBitPerSec;
-      }
-      if (isacConfig.currentFrameSizeMsec != 0) {
-        sendCodec->pacsize = isacConfig.currentFrameSizeMsec
-            * (sendCodec->plfreq / 1000);
-      }
-      EXPECT_EQ(0, acm->RegisterSendCodec(*sendCodec));
-    }
-  }
-
-  return 0;
-}
-
-ISACTest::ISACTest(int testMode)
-    : _acmA(AudioCodingModule::Create(1)),
-      _acmB(AudioCodingModule::Create(2)),
-      _testMode(testMode) {}
-
-ISACTest::~ISACTest() {}
-
-void ISACTest::Setup() {
-  int codecCntr;
-  CodecInst codecParam;
-
-  for (codecCntr = 0; codecCntr < AudioCodingModule::NumberOfCodecs();
-      codecCntr++) {
-    EXPECT_EQ(0, AudioCodingModule::Codec(codecCntr, &codecParam));
-    if (!STR_CASE_CMP(codecParam.plname, "ISAC")
-        && codecParam.plfreq == 16000) {
-      memcpy(&_paramISAC16kHz, &codecParam, sizeof(CodecInst));
-      _idISAC16kHz = codecCntr;
-    }
-    if (!STR_CASE_CMP(codecParam.plname, "ISAC")
-        && codecParam.plfreq == 32000) {
-      memcpy(&_paramISAC32kHz, &codecParam, sizeof(CodecInst));
-      _idISAC32kHz = codecCntr;
-    }
-  }
-
-  // Register both iSAC-wb & iSAC-swb in both sides as receiver codecs.
-  EXPECT_EQ(true, _acmA->RegisterReceiveCodec(_paramISAC16kHz.pltype,
-                                              CodecInstToSdp(_paramISAC16kHz)));
-  EXPECT_EQ(true, _acmA->RegisterReceiveCodec(_paramISAC32kHz.pltype,
-                                              CodecInstToSdp(_paramISAC32kHz)));
-  EXPECT_EQ(true, _acmB->RegisterReceiveCodec(_paramISAC16kHz.pltype,
-                                              CodecInstToSdp(_paramISAC16kHz)));
-  EXPECT_EQ(true, _acmB->RegisterReceiveCodec(_paramISAC32kHz.pltype,
-                                              CodecInstToSdp(_paramISAC32kHz)));
-
-  //--- Set A-to-B channel
-  _channel_A2B.reset(new Channel);
-  EXPECT_EQ(0, _acmA->RegisterTransportCallback(_channel_A2B.get()));
-  _channel_A2B->RegisterReceiverACM(_acmB.get());
-
-  //--- Set B-to-A channel
-  _channel_B2A.reset(new Channel);
-  EXPECT_EQ(0, _acmB->RegisterTransportCallback(_channel_B2A.get()));
-  _channel_B2A->RegisterReceiverACM(_acmA.get());
-
-  file_name_swb_ = webrtc::test::ResourcePath("audio_coding/testfile32kHz",
-                                              "pcm");
-
-  EXPECT_EQ(0, _acmB->RegisterSendCodec(_paramISAC16kHz));
-  EXPECT_EQ(0, _acmA->RegisterSendCodec(_paramISAC32kHz));
-
-  _inFileA.Open(file_name_swb_, 32000, "rb");
-  // Set test length to 500 ms (50 blocks of 10 ms each).
-  _inFileA.SetNum10MsBlocksToRead(50);
-  // Fast-forward 1 second (100 blocks) since the files start with silence.
-  _inFileA.FastForward(100);
-  std::string fileNameA = webrtc::test::OutputPath() + "testisac_a.pcm";
-  std::string fileNameB = webrtc::test::OutputPath() + "testisac_b.pcm";
-  _outFileA.Open(fileNameA, 32000, "wb");
-  _outFileB.Open(fileNameB, 32000, "wb");
-
-  while (!_inFileA.EndOfFile()) {
-    Run10ms();
-  }
-  CodecInst receiveCodec;
-  EXPECT_EQ(0, _acmA->ReceiveCodec(&receiveCodec));
-  EXPECT_EQ(0, _acmB->ReceiveCodec(&receiveCodec));
-
-  _inFileA.Close();
-  _outFileA.Close();
-  _outFileB.Close();
-}
-
-void ISACTest::Perform() {
-  Setup();
-
-  int16_t testNr = 0;
-  ACMTestISACConfig wbISACConfig;
-  ACMTestISACConfig swbISACConfig;
-
-  SetISACConfigDefault(wbISACConfig);
-  SetISACConfigDefault(swbISACConfig);
-
-  wbISACConfig.currentRateBitPerSec = -1;
-  swbISACConfig.currentRateBitPerSec = -1;
-  testNr++;
-  EncodeDecode(testNr, wbISACConfig, swbISACConfig);
-
-  if (_testMode != 0) {
-    SetISACConfigDefault(wbISACConfig);
-    SetISACConfigDefault(swbISACConfig);
-
-    wbISACConfig.currentRateBitPerSec = -1;
-    swbISACConfig.currentRateBitPerSec = -1;
-    wbISACConfig.initRateBitPerSec = 13000;
-    wbISACConfig.initFrameSizeInMsec = 60;
-    swbISACConfig.initRateBitPerSec = 20000;
-    swbISACConfig.initFrameSizeInMsec = 30;
-    testNr++;
-    EncodeDecode(testNr, wbISACConfig, swbISACConfig);
-
-    SetISACConfigDefault(wbISACConfig);
-    SetISACConfigDefault(swbISACConfig);
-
-    wbISACConfig.currentRateBitPerSec = 20000;
-    swbISACConfig.currentRateBitPerSec = 48000;
-    testNr++;
-    EncodeDecode(testNr, wbISACConfig, swbISACConfig);
-
-    wbISACConfig.currentRateBitPerSec = 16000;
-    swbISACConfig.currentRateBitPerSec = 30000;
-    wbISACConfig.currentFrameSizeMsec = 60;
-    testNr++;
-    EncodeDecode(testNr, wbISACConfig, swbISACConfig);
-  }
-
-  SetISACConfigDefault(wbISACConfig);
-  SetISACConfigDefault(swbISACConfig);
-  testNr++;
-  EncodeDecode(testNr, wbISACConfig, swbISACConfig);
-
-  testNr++;
-  if (_testMode == 0) {
-    SwitchingSamplingRate(testNr, 4);
-  } else {
-    SwitchingSamplingRate(testNr, 80);
-  }
-}
-
-void ISACTest::Run10ms() {
-  AudioFrame audioFrame;
-  EXPECT_GT(_inFileA.Read10MsData(audioFrame), 0);
-  EXPECT_GE(_acmA->Add10MsData(audioFrame), 0);
-  EXPECT_GE(_acmB->Add10MsData(audioFrame), 0);
-  bool muted;
-  EXPECT_EQ(0, _acmA->PlayoutData10Ms(32000, &audioFrame, &muted));
-  ASSERT_FALSE(muted);
-  _outFileA.Write10MsData(audioFrame);
-  EXPECT_EQ(0, _acmB->PlayoutData10Ms(32000, &audioFrame, &muted));
-  ASSERT_FALSE(muted);
-  _outFileB.Write10MsData(audioFrame);
-}
-
-void ISACTest::EncodeDecode(int testNr, ACMTestISACConfig& wbISACConfig,
-                            ACMTestISACConfig& swbISACConfig) {
-  // Files in Side A and B
-  _inFileA.Open(file_name_swb_, 32000, "rb", true);
-  _inFileB.Open(file_name_swb_, 32000, "rb", true);
-
-  std::string file_name_out;
-  std::stringstream file_stream_a;
-  std::stringstream file_stream_b;
-  file_stream_a << webrtc::test::OutputPath();
-  file_stream_b << webrtc::test::OutputPath();
-  file_stream_a << "out_iSACTest_A_" << testNr << ".pcm";
-  file_stream_b << "out_iSACTest_B_" << testNr << ".pcm";
-  file_name_out = file_stream_a.str();
-  _outFileA.Open(file_name_out, 32000, "wb");
-  file_name_out = file_stream_b.str();
-  _outFileB.Open(file_name_out, 32000, "wb");
-
-  EXPECT_EQ(0, _acmA->RegisterSendCodec(_paramISAC16kHz));
-  EXPECT_EQ(0, _acmA->RegisterSendCodec(_paramISAC32kHz));
-  EXPECT_EQ(0, _acmB->RegisterSendCodec(_paramISAC32kHz));
-  EXPECT_EQ(0, _acmB->RegisterSendCodec(_paramISAC16kHz));
-
-  // Side A is sending super-wideband, and side B is sending wideband.
-  SetISAConfig(swbISACConfig, _acmA.get(), _testMode);
-  SetISAConfig(wbISACConfig, _acmB.get(), _testMode);
-
-  bool adaptiveMode = false;
-  if ((swbISACConfig.currentRateBitPerSec == -1)
-      || (wbISACConfig.currentRateBitPerSec == -1)) {
-    adaptiveMode = true;
-  }
-  _myTimer.Reset();
-  _channel_A2B->ResetStats();
-  _channel_B2A->ResetStats();
-
-  char currentTime[500];
-  EventTimerWrapper* myEvent = EventTimerWrapper::Create();
-  EXPECT_TRUE(myEvent->StartTimer(true, 10));
-  while (!(_inFileA.EndOfFile() || _inFileA.Rewinded())) {
-    Run10ms();
-    _myTimer.Tick10ms();
-    _myTimer.CurrentTimeHMS(currentTime);
-
-    if ((adaptiveMode) && (_testMode != 0)) {
-      myEvent->Wait(5000);
-      EXPECT_TRUE(_acmA->SendCodec());
-      EXPECT_TRUE(_acmB->SendCodec());
-    }
-  }
-
-  if (_testMode != 0) {
-    printf("\n\nSide A statistics\n\n");
-    _channel_A2B->PrintStats(_paramISAC32kHz);
-
-    printf("\n\nSide B statistics\n\n");
-    _channel_B2A->PrintStats(_paramISAC16kHz);
-  }
-
-  _channel_A2B->ResetStats();
-  _channel_B2A->ResetStats();
-
-  _outFileA.Close();
-  _outFileB.Close();
-  _inFileA.Close();
-  _inFileB.Close();
-}
-
-void ISACTest::SwitchingSamplingRate(int testNr, int maxSampRateChange) {
-  // Files in Side A
-  _inFileA.Open(file_name_swb_, 32000, "rb");
-  _inFileB.Open(file_name_swb_, 32000, "rb");
-
-  std::string file_name_out;
-  std::stringstream file_stream_a;
-  std::stringstream file_stream_b;
-  file_stream_a << webrtc::test::OutputPath();
-  file_stream_b << webrtc::test::OutputPath();
-  file_stream_a << "out_iSACTest_A_" << testNr << ".pcm";
-  file_stream_b << "out_iSACTest_B_" << testNr << ".pcm";
-  file_name_out = file_stream_a.str();
-  _outFileA.Open(file_name_out, 32000, "wb");
-  file_name_out = file_stream_b.str();
-  _outFileB.Open(file_name_out, 32000, "wb");
-
-  // Start with side A sending super-wideband and side B seding wideband.
-  // Toggle sending wideband/super-wideband in this test.
-  EXPECT_EQ(0, _acmA->RegisterSendCodec(_paramISAC32kHz));
-  EXPECT_EQ(0, _acmB->RegisterSendCodec(_paramISAC16kHz));
-
-  int numSendCodecChanged = 0;
-  _myTimer.Reset();
-  char currentTime[50];
-  while (numSendCodecChanged < (maxSampRateChange << 1)) {
-    Run10ms();
-    _myTimer.Tick10ms();
-    _myTimer.CurrentTimeHMS(currentTime);
-    if (_testMode == 2)
-      printf("\r%s", currentTime);
-    if (_inFileA.EndOfFile()) {
-      if (_inFileA.SamplingFrequency() == 16000) {
-        // Switch side A to send super-wideband.
-        _inFileA.Close();
-        _inFileA.Open(file_name_swb_, 32000, "rb");
-        EXPECT_EQ(0, _acmA->RegisterSendCodec(_paramISAC32kHz));
-      } else {
-        // Switch side A to send wideband.
-        _inFileA.Close();
-        _inFileA.Open(file_name_swb_, 32000, "rb");
-        EXPECT_EQ(0, _acmA->RegisterSendCodec(_paramISAC16kHz));
-      }
-      numSendCodecChanged++;
-    }
-
-    if (_inFileB.EndOfFile()) {
-      if (_inFileB.SamplingFrequency() == 16000) {
-        // Switch side B to send super-wideband.
-        _inFileB.Close();
-        _inFileB.Open(file_name_swb_, 32000, "rb");
-        EXPECT_EQ(0, _acmB->RegisterSendCodec(_paramISAC32kHz));
-      } else {
-        // Switch side B to send wideband.
-        _inFileB.Close();
-        _inFileB.Open(file_name_swb_, 32000, "rb");
-        EXPECT_EQ(0, _acmB->RegisterSendCodec(_paramISAC16kHz));
-      }
-      numSendCodecChanged++;
-    }
-  }
-  _outFileA.Close();
-  _outFileB.Close();
-  _inFileA.Close();
-  _inFileB.Close();
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/test/iSACTest.h b/modules/audio_coding/test/iSACTest.h
deleted file mode 100644
index 7d3a77e..0000000
--- a/modules/audio_coding/test/iSACTest.h
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- *  Copyright (c) 2012 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_TEST_ISACTEST_H_
-#define WEBRTC_MODULES_AUDIO_CODING_TEST_ISACTEST_H_
-
-#include <string.h>
-
-#include <memory>
-
-#include "webrtc/common_types.h"
-#include "webrtc/modules/audio_coding/include/audio_coding_module.h"
-#include "webrtc/modules/audio_coding/test/ACMTest.h"
-#include "webrtc/modules/audio_coding/test/Channel.h"
-#include "webrtc/modules/audio_coding/test/PCMFile.h"
-#include "webrtc/modules/audio_coding/test/utility.h"
-
-#define MAX_FILE_NAME_LENGTH_BYTE 500
-#define NO_OF_CLIENTS             15
-
-namespace webrtc {
-
-struct ACMTestISACConfig {
-  int32_t currentRateBitPerSec;
-  int16_t currentFrameSizeMsec;
-  int16_t encodingMode;
-  uint32_t initRateBitPerSec;
-  int16_t initFrameSizeInMsec;
-  bool enforceFrameSize;
-};
-
-class ISACTest : public ACMTest {
- public:
-  explicit ISACTest(int testMode);
-  ~ISACTest();
-
-  void Perform();
- private:
-  void Setup();
-
-  void Run10ms();
-
-  void EncodeDecode(int testNr, ACMTestISACConfig& wbISACConfig,
-                    ACMTestISACConfig& swbISACConfig);
-
-  void SwitchingSamplingRate(int testNr, int maxSampRateChange);
-
-  std::unique_ptr<AudioCodingModule> _acmA;
-  std::unique_ptr<AudioCodingModule> _acmB;
-
-  std::unique_ptr<Channel> _channel_A2B;
-  std::unique_ptr<Channel> _channel_B2A;
-
-  PCMFile _inFileA;
-  PCMFile _inFileB;
-
-  PCMFile _outFileA;
-  PCMFile _outFileB;
-
-  uint8_t _idISAC16kHz;
-  uint8_t _idISAC32kHz;
-  CodecInst _paramISAC16kHz;
-  CodecInst _paramISAC32kHz;
-
-  std::string file_name_swb_;
-
-  ACMTestTimer _myTimer;
-  int _testMode;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_CODING_TEST_ISACTEST_H_
diff --git a/modules/audio_coding/test/insert_packet_with_timing.cc b/modules/audio_coding/test/insert_packet_with_timing.cc
deleted file mode 100644
index db58289..0000000
--- a/modules/audio_coding/test/insert_packet_with_timing.cc
+++ /dev/null
@@ -1,322 +0,0 @@
-/*
- *  Copyright (c) 2013 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 <stdio.h>
-#include <string.h>
-
-#include <memory>
-
-#include "webrtc/common_types.h"
-#include "webrtc/modules/audio_coding/codecs/audio_format_conversion.h"
-#include "webrtc/modules/audio_coding/include/audio_coding_module.h"
-#include "webrtc/modules/audio_coding/test/Channel.h"
-#include "webrtc/modules/audio_coding/test/PCMFile.h"
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/rtc_base/flags.h"
-#include "webrtc/system_wrappers/include/clock.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/testsupport/fileutils.h"
-
-// Codec.
-DEFINE_string(codec, "opus", "Codec Name");
-DEFINE_int(codec_sample_rate_hz, 48000, "Sampling rate in Hertz.");
-DEFINE_int(codec_channels, 1, "Number of channels of the codec.");
-
-// PCM input/output.
-DEFINE_string(input, "", "Input PCM file at 16 kHz.");
-DEFINE_bool(input_stereo, false, "Input is stereo.");
-DEFINE_int(input_fs_hz, 32000, "Input sample rate Hz.");
-DEFINE_string(output, "insert_rtp_with_timing_out.pcm", "OutputFile");
-DEFINE_int(output_fs_hz, 32000, "Output sample rate Hz");
-
-// Timing files
-DEFINE_string(seq_num, "seq_num", "Sequence number file.");
-DEFINE_string(send_ts, "send_timestamp", "Send timestamp file.");
-DEFINE_string(receive_ts, "last_rec_timestamp", "Receive timestamp file");
-
-// Delay logging
-DEFINE_string(delay, "", "Log for delay.");
-
-// Other setups
-DEFINE_bool(verbose, false, "Verbosity.");
-DEFINE_float(loss_rate, 0, "Rate of packet loss < 1");
-
-DEFINE_bool(help, false, "Prints this message.");
-
-const int32_t kAudioPlayedOut = 0x00000001;
-const int32_t kPacketPushedIn = 0x00000001 << 1;
-const int kPlayoutPeriodMs = 10;
-
-namespace webrtc {
-
-class InsertPacketWithTiming {
- public:
-  InsertPacketWithTiming()
-      : sender_clock_(new SimulatedClock(0)),
-        receiver_clock_(new SimulatedClock(0)),
-        send_acm_(AudioCodingModule::Create(0, sender_clock_)),
-        receive_acm_(AudioCodingModule::Create(0, receiver_clock_)),
-        channel_(new Channel),
-        seq_num_fid_(fopen(FLAG_seq_num, "rt")),
-        send_ts_fid_(fopen(FLAG_send_ts, "rt")),
-        receive_ts_fid_(fopen(FLAG_receive_ts, "rt")),
-        pcm_out_fid_(fopen(FLAG_output, "wb")),
-        samples_in_1ms_(48),
-        num_10ms_in_codec_frame_(2),  // Typical 20 ms frames.
-        time_to_insert_packet_ms_(3),  // An arbitrary offset on pushing packet.
-        next_receive_ts_(0),
-        time_to_playout_audio_ms_(kPlayoutPeriodMs),
-        loss_threshold_(0),
-        playout_timing_fid_(fopen("playout_timing.txt", "wt")) {}
-
-  void SetUp() {
-    ASSERT_TRUE(sender_clock_ != NULL);
-    ASSERT_TRUE(receiver_clock_ != NULL);
-
-    ASSERT_TRUE(send_acm_.get() != NULL);
-    ASSERT_TRUE(receive_acm_.get() != NULL);
-    ASSERT_TRUE(channel_ != NULL);
-
-    ASSERT_TRUE(seq_num_fid_ != NULL);
-    ASSERT_TRUE(send_ts_fid_ != NULL);
-    ASSERT_TRUE(receive_ts_fid_ != NULL);
-
-    ASSERT_TRUE(playout_timing_fid_ != NULL);
-
-    next_receive_ts_ = ReceiveTimestamp();
-
-    CodecInst codec;
-    ASSERT_EQ(0, AudioCodingModule::Codec(FLAG_codec, &codec,
-                             FLAG_codec_sample_rate_hz,
-                             FLAG_codec_channels));
-    ASSERT_EQ(0, receive_acm_->InitializeReceiver());
-    ASSERT_EQ(0, send_acm_->RegisterSendCodec(codec));
-    ASSERT_EQ(true, receive_acm_->RegisterReceiveCodec(codec.pltype,
-                                                       CodecInstToSdp(codec)));
-
-    // Set codec-dependent parameters.
-    samples_in_1ms_ = codec.plfreq / 1000;
-    num_10ms_in_codec_frame_ = codec.pacsize / (codec.plfreq / 100);
-
-    channel_->RegisterReceiverACM(receive_acm_.get());
-    send_acm_->RegisterTransportCallback(channel_);
-
-    if (strlen(FLAG_input) == 0) {
-      std::string file_name = test::ResourcePath("audio_coding/testfile32kHz",
-                                                 "pcm");
-      pcm_in_fid_.Open(file_name, 32000, "r", true);  // auto-rewind
-      std::cout << "Input file " << file_name << " 32 kHz mono." << std::endl;
-    } else {
-      pcm_in_fid_.Open(FLAG_input, static_cast<uint16_t>(FLAG_input_fs_hz),
-                    "r", true);  // auto-rewind
-      std::cout << "Input file " << FLAG_input << "at " << FLAG_input_fs_hz
-          << " Hz in " << ((FLAG_input_stereo) ? "stereo." : "mono.")
-          << std::endl;
-      pcm_in_fid_.ReadStereo(FLAG_input_stereo);
-    }
-
-    ASSERT_TRUE(pcm_out_fid_ != NULL);
-    std::cout << "Output file " << FLAG_output << " at " << FLAG_output_fs_hz
-        << " Hz." << std::endl;
-
-    // Other setups
-    if (FLAG_loss_rate > 0)
-      loss_threshold_ = RAND_MAX * FLAG_loss_rate;
-    else
-      loss_threshold_ = 0;
-  }
-
-  void TickOneMillisecond(uint32_t* action) {
-    // One millisecond passed.
-    time_to_insert_packet_ms_--;
-    time_to_playout_audio_ms_--;
-    sender_clock_->AdvanceTimeMilliseconds(1);
-    receiver_clock_->AdvanceTimeMilliseconds(1);
-
-    // Reset action.
-    *action = 0;
-
-    // Is it time to pull audio?
-    if (time_to_playout_audio_ms_ == 0) {
-      time_to_playout_audio_ms_ = kPlayoutPeriodMs;
-      bool muted;
-      receive_acm_->PlayoutData10Ms(static_cast<int>(FLAG_output_fs_hz),
-                                    &frame_, &muted);
-      ASSERT_FALSE(muted);
-      fwrite(frame_.data(), sizeof(*frame_.data()),
-             frame_.samples_per_channel_ * frame_.num_channels_, pcm_out_fid_);
-      *action |= kAudioPlayedOut;
-    }
-
-    // Is it time to push in next packet?
-    if (time_to_insert_packet_ms_ <= .5) {
-      *action |= kPacketPushedIn;
-
-      // Update time-to-insert packet.
-      uint32_t t = next_receive_ts_;
-      next_receive_ts_ = ReceiveTimestamp();
-      time_to_insert_packet_ms_ += static_cast<float>(next_receive_ts_ - t) /
-          samples_in_1ms_;
-
-      // Push in just enough audio.
-      for (int n = 0; n < num_10ms_in_codec_frame_; n++) {
-        pcm_in_fid_.Read10MsData(frame_);
-        EXPECT_GE(send_acm_->Add10MsData(frame_), 0);
-      }
-
-      // Set the parameters for the packet to be pushed in receiver ACM right
-      // now.
-      uint32_t ts = SendTimestamp();
-      int seq_num = SequenceNumber();
-      bool lost = false;
-      channel_->set_send_timestamp(ts);
-      channel_->set_sequence_number(seq_num);
-      if (loss_threshold_ > 0 && rand() < loss_threshold_) {
-        channel_->set_num_packets_to_drop(1);
-        lost = true;
-      }
-
-      if (FLAG_verbose) {
-        if (!lost) {
-          std::cout << "\nInserting packet number " << seq_num
-              << " timestamp " << ts << std::endl;
-        } else {
-          std::cout << "\nLost packet number " << seq_num
-              << " timestamp " << ts << std::endl;
-        }
-      }
-    }
-  }
-
-  void TearDown() {
-    delete channel_;
-
-    fclose(seq_num_fid_);
-    fclose(send_ts_fid_);
-    fclose(receive_ts_fid_);
-    fclose(pcm_out_fid_);
-    pcm_in_fid_.Close();
-  }
-
-  ~InsertPacketWithTiming() {
-    delete sender_clock_;
-    delete receiver_clock_;
-  }
-
-  // Are there more info to simulate.
-  bool HasPackets() {
-    if (feof(seq_num_fid_) || feof(send_ts_fid_) || feof(receive_ts_fid_))
-      return false;
-    return true;
-  }
-
-  // Jitter buffer delay.
-  void Delay(int* optimal_delay, int* current_delay) {
-    NetworkStatistics statistics;
-    receive_acm_->GetNetworkStatistics(&statistics);
-    *optimal_delay = statistics.preferredBufferSize;
-    *current_delay = statistics.currentBufferSize;
-  }
-
- private:
-  uint32_t SendTimestamp() {
-    uint32_t t;
-    EXPECT_EQ(1, fscanf(send_ts_fid_, "%u\n", &t));
-    return t;
-  }
-
-  uint32_t ReceiveTimestamp() {
-    uint32_t t;
-    EXPECT_EQ(1, fscanf(receive_ts_fid_, "%u\n", &t));
-    return t;
-  }
-
-  int SequenceNumber() {
-    int n;
-    EXPECT_EQ(1, fscanf(seq_num_fid_, "%d\n", &n));
-    return n;
-  }
-
-  // This class just creates these pointers, not deleting them. They are deleted
-  // by the associated ACM.
-  SimulatedClock* sender_clock_;
-  SimulatedClock* receiver_clock_;
-
-  std::unique_ptr<AudioCodingModule> send_acm_;
-  std::unique_ptr<AudioCodingModule> receive_acm_;
-  Channel* channel_;
-
-  FILE* seq_num_fid_;  // Input (text), one sequence number per line.
-  FILE* send_ts_fid_;  // Input (text), one send timestamp per line.
-  FILE* receive_ts_fid_;  // Input (text), one receive timestamp per line.
-  FILE* pcm_out_fid_;  // Output PCM16.
-
-  PCMFile pcm_in_fid_;  // Input PCM16.
-
-  int samples_in_1ms_;
-
-  // TODO(turajs): this can be computed from the send timestamp, but there is
-  // some complication to account for lost and reordered packets.
-  int num_10ms_in_codec_frame_;
-
-  float time_to_insert_packet_ms_;
-  uint32_t next_receive_ts_;
-  uint32_t time_to_playout_audio_ms_;
-
-  AudioFrame frame_;
-
-  double loss_threshold_;
-
-  // Output (text), sequence number, playout timestamp, time (ms) of playout,
-  // per line.
-  FILE* playout_timing_fid_;
-};
-
-}  // webrtc
-
-int main(int argc, char* argv[]) {
-  if (rtc::FlagList::SetFlagsFromCommandLine(&argc, argv, true)) {
-    return 1;
-  }
-  if (FLAG_help) {
-    rtc::FlagList::Print(nullptr, false);
-    return 0;
-  }
-
-  webrtc::InsertPacketWithTiming test;
-  test.SetUp();
-
-  FILE* delay_log = NULL;
-  if (strlen(FLAG_delay) > 0) {
-    delay_log = fopen(FLAG_delay, "wt");
-    if (delay_log == NULL) {
-      std::cout << "Cannot open the file to log delay values." << std::endl;
-      exit(1);
-    }
-  }
-
-  uint32_t action_taken;
-  int optimal_delay_ms;
-  int current_delay_ms;
-  while (test.HasPackets()) {
-    test.TickOneMillisecond(&action_taken);
-
-    if (action_taken != 0) {
-      test.Delay(&optimal_delay_ms, &current_delay_ms);
-      if (delay_log != NULL) {
-        fprintf(delay_log, "%3d %3d\n", optimal_delay_ms, current_delay_ms);
-      }
-    }
-  }
-  std::cout << std::endl;
-  test.TearDown();
-  if (delay_log != NULL)
-    fclose(delay_log);
-}
diff --git a/modules/audio_coding/test/opus_test.cc b/modules/audio_coding/test/opus_test.cc
deleted file mode 100644
index 9f5720b..0000000
--- a/modules/audio_coding/test/opus_test.cc
+++ /dev/null
@@ -1,390 +0,0 @@
-/*
- *  Copyright (c) 2013 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/test/opus_test.h"
-
-#include <assert.h>
-
-#include <string>
-
-#include "webrtc/common_types.h"
-#include "webrtc/modules/audio_coding/codecs/audio_format_conversion.h"
-#include "webrtc/modules/audio_coding/codecs/opus/opus_interface.h"
-#include "webrtc/modules/audio_coding/include/audio_coding_module_typedefs.h"
-#include "webrtc/modules/audio_coding/test/TestStereo.h"
-#include "webrtc/modules/audio_coding/test/utility.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/testsupport/fileutils.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-OpusTest::OpusTest()
-    : acm_receiver_(AudioCodingModule::Create(0)),
-      channel_a2b_(NULL),
-      counter_(0),
-      payload_type_(255),
-      rtp_timestamp_(0) {}
-
-OpusTest::~OpusTest() {
-  if (channel_a2b_ != NULL) {
-    delete channel_a2b_;
-    channel_a2b_ = NULL;
-  }
-  if (opus_mono_encoder_ != NULL) {
-    WebRtcOpus_EncoderFree(opus_mono_encoder_);
-    opus_mono_encoder_ = NULL;
-  }
-  if (opus_stereo_encoder_ != NULL) {
-    WebRtcOpus_EncoderFree(opus_stereo_encoder_);
-    opus_stereo_encoder_ = NULL;
-  }
-  if (opus_mono_decoder_ != NULL) {
-    WebRtcOpus_DecoderFree(opus_mono_decoder_);
-    opus_mono_decoder_ = NULL;
-  }
-  if (opus_stereo_decoder_ != NULL) {
-    WebRtcOpus_DecoderFree(opus_stereo_decoder_);
-    opus_stereo_decoder_ = NULL;
-  }
-}
-
-void OpusTest::Perform() {
-#ifndef WEBRTC_CODEC_OPUS
-  // Opus isn't defined, exit.
-  return;
-#else
-  uint16_t frequency_hz;
-  size_t audio_channels;
-  int16_t test_cntr = 0;
-
-  // Open both mono and stereo test files in 32 kHz.
-  const std::string file_name_stereo =
-      webrtc::test::ResourcePath("audio_coding/teststereo32kHz", "pcm");
-  const std::string file_name_mono =
-      webrtc::test::ResourcePath("audio_coding/testfile32kHz", "pcm");
-  frequency_hz = 32000;
-  in_file_stereo_.Open(file_name_stereo, frequency_hz, "rb");
-  in_file_stereo_.ReadStereo(true);
-  in_file_mono_.Open(file_name_mono, frequency_hz, "rb");
-  in_file_mono_.ReadStereo(false);
-
-  // Create Opus encoders for mono and stereo.
-  ASSERT_GT(WebRtcOpus_EncoderCreate(&opus_mono_encoder_, 1, 0), -1);
-  ASSERT_GT(WebRtcOpus_EncoderCreate(&opus_stereo_encoder_, 2, 1), -1);
-
-  // Create Opus decoders for mono and stereo for stand-alone testing of Opus.
-  ASSERT_GT(WebRtcOpus_DecoderCreate(&opus_mono_decoder_, 1), -1);
-  ASSERT_GT(WebRtcOpus_DecoderCreate(&opus_stereo_decoder_, 2), -1);
-  WebRtcOpus_DecoderInit(opus_mono_decoder_);
-  WebRtcOpus_DecoderInit(opus_stereo_decoder_);
-
-  ASSERT_TRUE(acm_receiver_.get() != NULL);
-  EXPECT_EQ(0, acm_receiver_->InitializeReceiver());
-
-  // Register Opus stereo as receiving codec.
-  CodecInst opus_codec_param;
-  int codec_id = acm_receiver_->Codec("opus", 48000, 2);
-  EXPECT_EQ(0, acm_receiver_->Codec(codec_id, &opus_codec_param));
-  payload_type_ = opus_codec_param.pltype;
-  EXPECT_EQ(true,
-            acm_receiver_->RegisterReceiveCodec(
-                opus_codec_param.pltype, CodecInstToSdp(opus_codec_param)));
-
-  // Create and connect the channel.
-  channel_a2b_ = new TestPackStereo;
-  channel_a2b_->RegisterReceiverACM(acm_receiver_.get());
-
-  //
-  // Test Stereo.
-  //
-
-  channel_a2b_->set_codec_mode(kStereo);
-  audio_channels = 2;
-  test_cntr++;
-  OpenOutFile(test_cntr);
-
-  // Run Opus with 2.5 ms frame size.
-  Run(channel_a2b_, audio_channels, 64000, 120);
-
-  // Run Opus with 5 ms frame size.
-  Run(channel_a2b_, audio_channels, 64000, 240);
-
-  // Run Opus with 10 ms frame size.
-  Run(channel_a2b_, audio_channels, 64000, 480);
-
-  // Run Opus with 20 ms frame size.
-  Run(channel_a2b_, audio_channels, 64000, 960);
-
-  // Run Opus with 40 ms frame size.
-  Run(channel_a2b_, audio_channels, 64000, 1920);
-
-  // Run Opus with 60 ms frame size.
-  Run(channel_a2b_, audio_channels, 64000, 2880);
-
-  out_file_.Close();
-  out_file_standalone_.Close();
-
-  //
-  // Test Opus stereo with packet-losses.
-  //
-
-  test_cntr++;
-  OpenOutFile(test_cntr);
-
-  // Run Opus with 20 ms frame size, 1% packet loss.
-  Run(channel_a2b_, audio_channels, 64000, 960, 1);
-
-  // Run Opus with 20 ms frame size, 5% packet loss.
-  Run(channel_a2b_, audio_channels, 64000, 960, 5);
-
-  // Run Opus with 20 ms frame size, 10% packet loss.
-  Run(channel_a2b_, audio_channels, 64000, 960, 10);
-
-  out_file_.Close();
-  out_file_standalone_.Close();
-
-  //
-  // Test Mono.
-  //
-  channel_a2b_->set_codec_mode(kMono);
-  audio_channels = 1;
-  test_cntr++;
-  OpenOutFile(test_cntr);
-
-  // Register Opus mono as receiving codec.
-  opus_codec_param.channels = 1;
-  EXPECT_EQ(true,
-            acm_receiver_->RegisterReceiveCodec(
-                opus_codec_param.pltype, CodecInstToSdp(opus_codec_param)));
-
-  // Run Opus with 2.5 ms frame size.
-  Run(channel_a2b_, audio_channels, 32000, 120);
-
-  // Run Opus with 5 ms frame size.
-  Run(channel_a2b_, audio_channels, 32000, 240);
-
-  // Run Opus with 10 ms frame size.
-  Run(channel_a2b_, audio_channels, 32000, 480);
-
-  // Run Opus with 20 ms frame size.
-  Run(channel_a2b_, audio_channels, 32000, 960);
-
-  // Run Opus with 40 ms frame size.
-  Run(channel_a2b_, audio_channels, 32000, 1920);
-
-  // Run Opus with 60 ms frame size.
-  Run(channel_a2b_, audio_channels, 32000, 2880);
-
-  out_file_.Close();
-  out_file_standalone_.Close();
-
-  //
-  // Test Opus mono with packet-losses.
-  //
-  test_cntr++;
-  OpenOutFile(test_cntr);
-
-  // Run Opus with 20 ms frame size, 1% packet loss.
-  Run(channel_a2b_, audio_channels, 64000, 960, 1);
-
-  // Run Opus with 20 ms frame size, 5% packet loss.
-  Run(channel_a2b_, audio_channels, 64000, 960, 5);
-
-  // Run Opus with 20 ms frame size, 10% packet loss.
-  Run(channel_a2b_, audio_channels, 64000, 960, 10);
-
-  // Close the files.
-  in_file_stereo_.Close();
-  in_file_mono_.Close();
-  out_file_.Close();
-  out_file_standalone_.Close();
-#endif
-}
-
-void OpusTest::Run(TestPackStereo* channel, size_t channels, int bitrate,
-                   size_t frame_length, int percent_loss) {
-  AudioFrame audio_frame;
-  int32_t out_freq_hz_b = out_file_.SamplingFrequency();
-  const size_t kBufferSizeSamples = 480 * 12 * 2;  // 120 ms stereo audio.
-  int16_t audio[kBufferSizeSamples];
-  int16_t out_audio[kBufferSizeSamples];
-  int16_t audio_type;
-  size_t written_samples = 0;
-  size_t read_samples = 0;
-  size_t decoded_samples = 0;
-  bool first_packet = true;
-  uint32_t start_time_stamp = 0;
-
-  channel->reset_payload_size();
-  counter_ = 0;
-
-  // Set encoder rate.
-  EXPECT_EQ(0, WebRtcOpus_SetBitRate(opus_mono_encoder_, bitrate));
-  EXPECT_EQ(0, WebRtcOpus_SetBitRate(opus_stereo_encoder_, bitrate));
-
-#if defined(WEBRTC_ANDROID) || defined(WEBRTC_IOS) || defined(WEBRTC_ARCH_ARM)
-  // If we are on Android, iOS and/or ARM, use a lower complexity setting as
-  // default.
-  const int kOpusComplexity5 = 5;
-  EXPECT_EQ(0, WebRtcOpus_SetComplexity(opus_mono_encoder_, kOpusComplexity5));
-  EXPECT_EQ(0, WebRtcOpus_SetComplexity(opus_stereo_encoder_,
-                                        kOpusComplexity5));
-#endif
-
-  // Fast-forward 1 second (100 blocks) since the files start with silence.
-  in_file_stereo_.FastForward(100);
-  in_file_mono_.FastForward(100);
-
-  // Limit the runtime to 1000 blocks of 10 ms each.
-  for (size_t audio_length = 0; audio_length < 1000; audio_length += 10) {
-    bool lost_packet = false;
-
-    // Get 10 msec of audio.
-    if (channels == 1) {
-      if (in_file_mono_.EndOfFile()) {
-        break;
-      }
-      in_file_mono_.Read10MsData(audio_frame);
-    } else {
-      if (in_file_stereo_.EndOfFile()) {
-        break;
-      }
-      in_file_stereo_.Read10MsData(audio_frame);
-    }
-
-    // If input audio is sampled at 32 kHz, resampling to 48 kHz is required.
-    EXPECT_EQ(480,
-              resampler_.Resample10Msec(audio_frame.data(),
-                                        audio_frame.sample_rate_hz_,
-                                        48000,
-                                        channels,
-                                        kBufferSizeSamples - written_samples,
-                                        &audio[written_samples]));
-    written_samples += 480 * channels;
-
-    // Sometimes we need to loop over the audio vector to produce the right
-    // number of packets.
-    size_t loop_encode = (written_samples - read_samples) /
-        (channels * frame_length);
-
-    if (loop_encode > 0) {
-      const size_t kMaxBytes = 1000;  // Maximum number of bytes for one packet.
-      size_t bitstream_len_byte;
-      uint8_t bitstream[kMaxBytes];
-      for (size_t i = 0; i < loop_encode; i++) {
-        int bitstream_len_byte_int = WebRtcOpus_Encode(
-            (channels == 1) ? opus_mono_encoder_ : opus_stereo_encoder_,
-            &audio[read_samples], frame_length, kMaxBytes, bitstream);
-        ASSERT_GE(bitstream_len_byte_int, 0);
-        bitstream_len_byte = static_cast<size_t>(bitstream_len_byte_int);
-
-        // Simulate packet loss by setting |packet_loss_| to "true" in
-        // |percent_loss| percent of the loops.
-        // TODO(tlegrand): Move handling of loss simulation to TestPackStereo.
-        if (percent_loss > 0) {
-          if (counter_ == floor((100 / percent_loss) + 0.5)) {
-            counter_ = 0;
-            lost_packet = true;
-            channel->set_lost_packet(true);
-          } else {
-            lost_packet = false;
-            channel->set_lost_packet(false);
-          }
-          counter_++;
-        }
-
-        // Run stand-alone Opus decoder, or decode PLC.
-        if (channels == 1) {
-          if (!lost_packet) {
-            decoded_samples += WebRtcOpus_Decode(
-                opus_mono_decoder_, bitstream, bitstream_len_byte,
-                &out_audio[decoded_samples * channels], &audio_type);
-          } else {
-            decoded_samples += WebRtcOpus_DecodePlc(
-                opus_mono_decoder_, &out_audio[decoded_samples * channels], 1);
-          }
-        } else {
-          if (!lost_packet) {
-            decoded_samples += WebRtcOpus_Decode(
-                opus_stereo_decoder_, bitstream, bitstream_len_byte,
-                &out_audio[decoded_samples * channels], &audio_type);
-          } else {
-            decoded_samples += WebRtcOpus_DecodePlc(
-                opus_stereo_decoder_, &out_audio[decoded_samples * channels],
-                1);
-          }
-        }
-
-        // Send data to the channel. "channel" will handle the loss simulation.
-        channel->SendData(kAudioFrameSpeech, payload_type_, rtp_timestamp_,
-                          bitstream, bitstream_len_byte, NULL);
-        if (first_packet) {
-          first_packet = false;
-          start_time_stamp = rtp_timestamp_;
-        }
-        rtp_timestamp_ += static_cast<uint32_t>(frame_length);
-        read_samples += frame_length * channels;
-      }
-      if (read_samples == written_samples) {
-        read_samples = 0;
-        written_samples = 0;
-      }
-    }
-
-    // Run received side of ACM.
-    bool muted;
-    ASSERT_EQ(
-        0, acm_receiver_->PlayoutData10Ms(out_freq_hz_b, &audio_frame, &muted));
-    ASSERT_FALSE(muted);
-
-    // Write output speech to file.
-    out_file_.Write10MsData(
-        audio_frame.data(),
-        audio_frame.samples_per_channel_ * audio_frame.num_channels_);
-
-    // Write stand-alone speech to file.
-    out_file_standalone_.Write10MsData(out_audio, decoded_samples * channels);
-
-    if (audio_frame.timestamp_ > start_time_stamp) {
-      // Number of channels should be the same for both stand-alone and
-      // ACM-decoding.
-      EXPECT_EQ(audio_frame.num_channels_, channels);
-    }
-
-    decoded_samples = 0;
-  }
-
-  if (in_file_mono_.EndOfFile()) {
-    in_file_mono_.Rewind();
-  }
-  if (in_file_stereo_.EndOfFile()) {
-    in_file_stereo_.Rewind();
-  }
-  // Reset in case we ended with a lost packet.
-  channel->set_lost_packet(false);
-}
-
-void OpusTest::OpenOutFile(int test_number) {
-  std::string file_name;
-  std::stringstream file_stream;
-  file_stream << webrtc::test::OutputPath() << "opustest_out_"
-      << test_number << ".pcm";
-  file_name = file_stream.str();
-  out_file_.Open(file_name, 48000, "wb");
-  file_stream.str("");
-  file_name = file_stream.str();
-  file_stream << webrtc::test::OutputPath() << "opusstandalone_out_"
-      << test_number << ".pcm";
-  file_name = file_stream.str();
-  out_file_standalone_.Open(file_name, 48000, "wb");
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/test/opus_test.h b/modules/audio_coding/test/opus_test.h
deleted file mode 100644
index ce570f6..0000000
--- a/modules/audio_coding/test/opus_test.h
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- *  Copyright (c) 2012 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_TEST_OPUS_TEST_H_
-#define WEBRTC_MODULES_AUDIO_CODING_TEST_OPUS_TEST_H_
-
-#include <math.h>
-
-#include <memory>
-
-#include "webrtc/modules/audio_coding/codecs/opus/opus_interface.h"
-#include "webrtc/modules/audio_coding/acm2/acm_resampler.h"
-#include "webrtc/modules/audio_coding/test/ACMTest.h"
-#include "webrtc/modules/audio_coding/test/Channel.h"
-#include "webrtc/modules/audio_coding/test/PCMFile.h"
-#include "webrtc/modules/audio_coding/test/TestStereo.h"
-
-namespace webrtc {
-
-class OpusTest : public ACMTest {
- public:
-  OpusTest();
-  ~OpusTest();
-
-  void Perform();
-
- private:
-  void Run(TestPackStereo* channel,
-           size_t channels,
-           int bitrate,
-           size_t frame_length,
-           int percent_loss = 0);
-
-  void OpenOutFile(int test_number);
-
-  std::unique_ptr<AudioCodingModule> acm_receiver_;
-  TestPackStereo* channel_a2b_;
-  PCMFile in_file_stereo_;
-  PCMFile in_file_mono_;
-  PCMFile out_file_;
-  PCMFile out_file_standalone_;
-  int counter_;
-  uint8_t payload_type_;
-  uint32_t rtp_timestamp_;
-  acm2::ACMResampler resampler_;
-  WebRtcOpusEncInst* opus_mono_encoder_;
-  WebRtcOpusEncInst* opus_stereo_encoder_;
-  WebRtcOpusDecInst* opus_mono_decoder_;
-  WebRtcOpusDecInst* opus_stereo_decoder_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_CODING_TEST_OPUS_TEST_H_
diff --git a/modules/audio_coding/test/target_delay_unittest.cc b/modules/audio_coding/test/target_delay_unittest.cc
deleted file mode 100644
index 7aec5d0..0000000
--- a/modules/audio_coding/test/target_delay_unittest.cc
+++ /dev/null
@@ -1,255 +0,0 @@
-/*
- *  Copyright (c) 2013 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 <memory>
-
-#include "webrtc/common_types.h"
-#include "webrtc/modules/audio_coding/codecs/pcm16b/pcm16b.h"
-#include "webrtc/modules/audio_coding/include/audio_coding_module.h"
-#include "webrtc/modules/audio_coding/test/utility.h"
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/testsupport/fileutils.h"
-
-namespace webrtc {
-
-class TargetDelayTest : public ::testing::Test {
- protected:
-  TargetDelayTest() : acm_(AudioCodingModule::Create(0)) {}
-
-  ~TargetDelayTest() {}
-
-  void SetUp() {
-    EXPECT_TRUE(acm_.get() != NULL);
-
-    ASSERT_EQ(0, acm_->InitializeReceiver());
-    constexpr int pltype = 108;
-    ASSERT_EQ(true,
-              acm_->RegisterReceiveCodec(pltype, {"L16", kSampleRateHz, 1}));
-
-    rtp_info_.header.payloadType = pltype;
-    rtp_info_.header.timestamp = 0;
-    rtp_info_.header.ssrc = 0x12345678;
-    rtp_info_.header.markerBit = false;
-    rtp_info_.header.sequenceNumber = 0;
-    rtp_info_.type.Audio.channel = 1;
-    rtp_info_.type.Audio.isCNG = false;
-    rtp_info_.frameType = kAudioFrameSpeech;
-
-    int16_t audio[kFrameSizeSamples];
-    const int kRange = 0x7FF;  // 2047, easy for masking.
-    for (size_t n = 0; n < kFrameSizeSamples; ++n)
-      audio[n] = (rand() & kRange) - kRange / 2;
-    WebRtcPcm16b_Encode(audio, kFrameSizeSamples, payload_);
-  }
-
-  void OutOfRangeInput() {
-    EXPECT_EQ(-1, SetMinimumDelay(-1));
-    EXPECT_EQ(-1, SetMinimumDelay(10001));
-  }
-
-  void NoTargetDelayBufferSizeChanges() {
-    for (int n = 0; n < 30; ++n)  // Run enough iterations.
-      Run(true);
-    int clean_optimal_delay = GetCurrentOptimalDelayMs();
-    Run(false);  // Run with jitter.
-    int jittery_optimal_delay = GetCurrentOptimalDelayMs();
-    EXPECT_GT(jittery_optimal_delay, clean_optimal_delay);
-    int required_delay = RequiredDelay();
-    EXPECT_GT(required_delay, 0);
-    EXPECT_NEAR(required_delay, jittery_optimal_delay, 1);
-  }
-
-  void WithTargetDelayBufferNotChanging() {
-    // A target delay that is one packet larger than jitter.
-    const int kTargetDelayMs = (kInterarrivalJitterPacket + 1) *
-        kNum10msPerFrame * 10;
-    ASSERT_EQ(0, SetMinimumDelay(kTargetDelayMs));
-    for (int n = 0; n < 30; ++n)  // Run enough iterations to fill the buffer.
-      Run(true);
-    int clean_optimal_delay = GetCurrentOptimalDelayMs();
-    EXPECT_EQ(kTargetDelayMs, clean_optimal_delay);
-    Run(false);  // Run with jitter.
-    int jittery_optimal_delay = GetCurrentOptimalDelayMs();
-    EXPECT_EQ(jittery_optimal_delay, clean_optimal_delay);
-  }
-
-  void RequiredDelayAtCorrectRange() {
-    for (int n = 0; n < 30; ++n)  // Run clean and store delay.
-      Run(true);
-    int clean_optimal_delay = GetCurrentOptimalDelayMs();
-
-    // A relatively large delay.
-    const int kTargetDelayMs = (kInterarrivalJitterPacket + 10) *
-        kNum10msPerFrame * 10;
-    ASSERT_EQ(0, SetMinimumDelay(kTargetDelayMs));
-    for (int n = 0; n < 300; ++n)  // Run enough iterations to fill the buffer.
-      Run(true);
-    Run(false);  // Run with jitter.
-
-    int jittery_optimal_delay = GetCurrentOptimalDelayMs();
-    EXPECT_EQ(kTargetDelayMs, jittery_optimal_delay);
-
-    int required_delay = RequiredDelay();
-
-    // Checking |required_delay| is in correct range.
-    EXPECT_GT(required_delay, 0);
-    EXPECT_GT(jittery_optimal_delay, required_delay);
-    EXPECT_GT(required_delay, clean_optimal_delay);
-
-    // A tighter check for the value of |required_delay|.
-    // The jitter forces a delay of
-    // |kInterarrivalJitterPacket * kNum10msPerFrame * 10| milliseconds. So we
-    // expect |required_delay| be close to that.
-    EXPECT_NEAR(kInterarrivalJitterPacket * kNum10msPerFrame * 10,
-                required_delay, 1);
-  }
-
-  void TargetDelayBufferMinMax() {
-    const int kTargetMinDelayMs = kNum10msPerFrame * 10;
-    ASSERT_EQ(0, SetMinimumDelay(kTargetMinDelayMs));
-    for (int m = 0; m < 30; ++m)  // Run enough iterations to fill the buffer.
-      Run(true);
-    int clean_optimal_delay = GetCurrentOptimalDelayMs();
-    EXPECT_EQ(kTargetMinDelayMs, clean_optimal_delay);
-
-    const int kTargetMaxDelayMs = 2 * (kNum10msPerFrame * 10);
-    ASSERT_EQ(0, SetMaximumDelay(kTargetMaxDelayMs));
-    for (int n = 0; n < 30; ++n)  // Run enough iterations to fill the buffer.
-      Run(false);
-
-    int capped_optimal_delay = GetCurrentOptimalDelayMs();
-    EXPECT_EQ(kTargetMaxDelayMs, capped_optimal_delay);
-  }
-
- private:
-  static const int kSampleRateHz = 16000;
-  static const int kNum10msPerFrame = 2;
-  static const size_t kFrameSizeSamples = 320;  // 20 ms @ 16 kHz.
-  // payload-len = frame-samples * 2 bytes/sample.
-  static const int kPayloadLenBytes = 320 * 2;
-  // Inter-arrival time in number of packets in a jittery channel. One is no
-  // jitter.
-  static const int kInterarrivalJitterPacket = 2;
-
-  void Push() {
-    rtp_info_.header.timestamp += kFrameSizeSamples;
-    rtp_info_.header.sequenceNumber++;
-    ASSERT_EQ(0, acm_->IncomingPacket(payload_, kFrameSizeSamples * 2,
-                                      rtp_info_));
-  }
-
-  // Pull audio equivalent to the amount of audio in one RTP packet.
-  void Pull() {
-    AudioFrame frame;
-    bool muted;
-    for (int k = 0; k < kNum10msPerFrame; ++k) {  // Pull one frame.
-      ASSERT_EQ(0, acm_->PlayoutData10Ms(-1, &frame, &muted));
-      ASSERT_FALSE(muted);
-      // Had to use ASSERT_TRUE, ASSERT_EQ generated error.
-      ASSERT_TRUE(kSampleRateHz == frame.sample_rate_hz_);
-      ASSERT_EQ(1u, frame.num_channels_);
-      ASSERT_TRUE(kSampleRateHz / 100 == frame.samples_per_channel_);
-    }
-  }
-
-  void Run(bool clean) {
-    for (int n = 0; n < 10; ++n) {
-      for (int m = 0; m < 5; ++m) {
-        Push();
-        Pull();
-      }
-
-      if (!clean) {
-        for (int m = 0; m < 10; ++m) {  // Long enough to trigger delay change.
-          Push();
-          for (int n = 0; n < kInterarrivalJitterPacket; ++n)
-            Pull();
-        }
-      }
-    }
-  }
-
-  int SetMinimumDelay(int delay_ms) {
-    return acm_->SetMinimumPlayoutDelay(delay_ms);
-  }
-
-  int SetMaximumDelay(int delay_ms) {
-    return acm_->SetMaximumPlayoutDelay(delay_ms);
-  }
-
-  int GetCurrentOptimalDelayMs() {
-    NetworkStatistics stats;
-    acm_->GetNetworkStatistics(&stats);
-    return stats.preferredBufferSize;
-  }
-
-  int RequiredDelay() {
-    return acm_->LeastRequiredDelayMs();
-  }
-
-  std::unique_ptr<AudioCodingModule> acm_;
-  WebRtcRTPHeader rtp_info_;
-  uint8_t payload_[kPayloadLenBytes];
-};
-
-// Flaky on iOS: webrtc:7057.
-#if defined(WEBRTC_ANDROID) || defined(WEBRTC_IOS)
-#define MAYBE_OutOfRangeInput DISABLED_OutOfRangeInput
-#else
-#define MAYBE_OutOfRangeInput OutOfRangeInput
-#endif
-TEST_F(TargetDelayTest, MAYBE_OutOfRangeInput) {
-  OutOfRangeInput();
-}
-
-// Flaky on iOS: webrtc:7057.
-#if defined(WEBRTC_ANDROID) || defined(WEBRTC_IOS)
-#define MAYBE_NoTargetDelayBufferSizeChanges \
-  DISABLED_NoTargetDelayBufferSizeChanges
-#else
-#define MAYBE_NoTargetDelayBufferSizeChanges NoTargetDelayBufferSizeChanges
-#endif
-TEST_F(TargetDelayTest, MAYBE_NoTargetDelayBufferSizeChanges) {
-  NoTargetDelayBufferSizeChanges();
-}
-
-// Flaky on iOS: webrtc:7057.
-#if defined(WEBRTC_ANDROID) || defined(WEBRTC_IOS)
-#define MAYBE_WithTargetDelayBufferNotChanging \
-  DISABLED_WithTargetDelayBufferNotChanging
-#else
-#define MAYBE_WithTargetDelayBufferNotChanging WithTargetDelayBufferNotChanging
-#endif
-TEST_F(TargetDelayTest, MAYBE_WithTargetDelayBufferNotChanging) {
-  WithTargetDelayBufferNotChanging();
-}
-
-// Flaky on iOS: webrtc:7057.
-#if defined(WEBRTC_ANDROID) || defined(WEBRTC_IOS)
-#define MAYBE_RequiredDelayAtCorrectRange DISABLED_RequiredDelayAtCorrectRange
-#else
-#define MAYBE_RequiredDelayAtCorrectRange RequiredDelayAtCorrectRange
-#endif
-TEST_F(TargetDelayTest, MAYBE_RequiredDelayAtCorrectRange) {
-  RequiredDelayAtCorrectRange();
-}
-
-// Flaky on iOS: webrtc:7057.
-#if defined(WEBRTC_ANDROID) || defined(WEBRTC_IOS)
-#define MAYBE_TargetDelayBufferMinMax DISABLED_TargetDelayBufferMinMax
-#else
-#define MAYBE_TargetDelayBufferMinMax TargetDelayBufferMinMax
-#endif
-TEST_F(TargetDelayTest, MAYBE_TargetDelayBufferMinMax) {
-  TargetDelayBufferMinMax();
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/test/utility.cc b/modules/audio_coding/test/utility.cc
deleted file mode 100644
index 043e6b9..0000000
--- a/modules/audio_coding/test/utility.cc
+++ /dev/null
@@ -1,305 +0,0 @@
-/*
- *  Copyright (c) 2011 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.h"
-
-#include <assert.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "webrtc/common_types.h"
-#include "webrtc/modules/audio_coding/include/audio_coding_module.h"
-#include "webrtc/test/gtest.h"
-
-#define NUM_CODECS_WITH_FIXED_PAYLOAD_TYPE 13
-
-namespace webrtc {
-
-ACMTestTimer::ACMTestTimer()
-    : _msec(0),
-      _sec(0),
-      _min(0),
-      _hour(0) {
-  return;
-}
-
-ACMTestTimer::~ACMTestTimer() {
-  return;
-}
-
-void ACMTestTimer::Reset() {
-  _msec = 0;
-  _sec = 0;
-  _min = 0;
-  _hour = 0;
-  return;
-}
-void ACMTestTimer::Tick10ms() {
-  _msec += 10;
-  Adjust();
-  return;
-}
-
-void ACMTestTimer::Tick1ms() {
-  _msec++;
-  Adjust();
-  return;
-}
-
-void ACMTestTimer::Tick100ms() {
-  _msec += 100;
-  Adjust();
-  return;
-}
-
-void ACMTestTimer::Tick1sec() {
-  _sec++;
-  Adjust();
-  return;
-}
-
-void ACMTestTimer::CurrentTimeHMS(char* currTime) {
-  sprintf(currTime, "%4lu:%02u:%06.3f", _hour, _min,
-          (double) _sec + (double) _msec / 1000.);
-  return;
-}
-
-void ACMTestTimer::CurrentTime(unsigned long& h, unsigned char& m,
-                               unsigned char& s, unsigned short& ms) {
-  h = _hour;
-  m = _min;
-  s = _sec;
-  ms = _msec;
-  return;
-}
-
-void ACMTestTimer::Adjust() {
-  unsigned int n;
-  if (_msec >= 1000) {
-    n = _msec / 1000;
-    _msec -= (1000 * n);
-    _sec += n;
-  }
-  if (_sec >= 60) {
-    n = _sec / 60;
-    _sec -= (n * 60);
-    _min += n;
-  }
-  if (_min >= 60) {
-    n = _min / 60;
-    _min -= (n * 60);
-    _hour += n;
-  }
-}
-
-int16_t ChooseCodec(CodecInst& codecInst) {
-
-  PrintCodecs();
-  //AudioCodingModule* tmpACM = AudioCodingModule::Create(0);
-  uint8_t noCodec = AudioCodingModule::NumberOfCodecs();
-  int8_t codecID;
-  bool outOfRange = false;
-  char myStr[15] = "";
-  do {
-    printf("\nChoose a codec [0]: ");
-    EXPECT_TRUE(fgets(myStr, 10, stdin) != NULL);
-    codecID = atoi(myStr);
-    if ((codecID < 0) || (codecID >= noCodec)) {
-      printf("\nOut of range.\n");
-      outOfRange = true;
-    }
-  } while (outOfRange);
-
-  CHECK_ERROR(AudioCodingModule::Codec((uint8_t )codecID, &codecInst));
-  return 0;
-}
-
-void PrintCodecs() {
-  uint8_t noCodec = AudioCodingModule::NumberOfCodecs();
-
-  CodecInst codecInst;
-  printf("No  Name                [Hz]    [bps]\n");
-  for (uint8_t codecCntr = 0; codecCntr < noCodec; codecCntr++) {
-    AudioCodingModule::Codec(codecCntr, &codecInst);
-    printf("%2d- %-18s %5d   %6d\n", codecCntr, codecInst.plname,
-           codecInst.plfreq, codecInst.rate);
-  }
-
-}
-
-namespace test {
-
-CircularBuffer::CircularBuffer(uint32_t len)
-    : _buff(NULL),
-      _idx(0),
-      _buffIsFull(false),
-      _calcAvg(false),
-      _calcVar(false),
-      _sum(0),
-      _sumSqr(0) {
-  _buff = new double[len];
-  if (_buff == NULL) {
-    _buffLen = 0;
-  } else {
-    for (uint32_t n = 0; n < len; n++) {
-      _buff[n] = 0;
-    }
-    _buffLen = len;
-  }
-}
-
-CircularBuffer::~CircularBuffer() {
-  if (_buff != NULL) {
-    delete[] _buff;
-    _buff = NULL;
-  }
-}
-
-void CircularBuffer::Update(const double newVal) {
-  assert(_buffLen > 0);
-
-  // store the value that is going to be overwritten
-  double oldVal = _buff[_idx];
-  // record the new value
-  _buff[_idx] = newVal;
-  // increment the index, to point to where we would
-  // write next
-  _idx++;
-  // it is a circular buffer, if we are at the end
-  // we have to cycle to the beginning
-  if (_idx >= _buffLen) {
-    // flag that the buffer is filled up.
-    _buffIsFull = true;
-    _idx = 0;
-  }
-
-  // Update
-
-  if (_calcAvg) {
-    // for the average we have to update
-    // the sum
-    _sum += (newVal - oldVal);
-  }
-
-  if (_calcVar) {
-    // to calculate variance we have to update
-    // the sum of squares
-    _sumSqr += (double) (newVal - oldVal) * (double) (newVal + oldVal);
-  }
-}
-
-void CircularBuffer::SetArithMean(bool enable) {
-  assert(_buffLen > 0);
-
-  if (enable && !_calcAvg) {
-    uint32_t lim;
-    if (_buffIsFull) {
-      lim = _buffLen;
-    } else {
-      lim = _idx;
-    }
-    _sum = 0;
-    for (uint32_t n = 0; n < lim; n++) {
-      _sum += _buff[n];
-    }
-  }
-  _calcAvg = enable;
-}
-
-void CircularBuffer::SetVariance(bool enable) {
-  assert(_buffLen > 0);
-
-  if (enable && !_calcVar) {
-    uint32_t lim;
-    if (_buffIsFull) {
-      lim = _buffLen;
-    } else {
-      lim = _idx;
-    }
-    _sumSqr = 0;
-    for (uint32_t n = 0; n < lim; n++) {
-      _sumSqr += _buff[n] * _buff[n];
-    }
-  }
-  _calcAvg = enable;
-}
-
-int16_t CircularBuffer::ArithMean(double& mean) {
-  assert(_buffLen > 0);
-
-  if (_buffIsFull) {
-
-    mean = _sum / (double) _buffLen;
-    return 0;
-  } else {
-    if (_idx > 0) {
-      mean = _sum / (double) _idx;
-      return 0;
-    } else {
-      return -1;
-    }
-
-  }
-}
-
-int16_t CircularBuffer::Variance(double& var) {
-  assert(_buffLen > 0);
-
-  if (_buffIsFull) {
-    var = _sumSqr / (double) _buffLen;
-    return 0;
-  } else {
-    if (_idx > 0) {
-      var = _sumSqr / (double) _idx;
-      return 0;
-    } else {
-      return -1;
-    }
-  }
-}
-
-}  // namespace test
-
-bool FixedPayloadTypeCodec(const char* payloadName) {
-  char fixPayloadTypeCodecs[NUM_CODECS_WITH_FIXED_PAYLOAD_TYPE][32] = { "PCMU",
-      "PCMA", "GSM", "G723", "DVI4", "LPC", "PCMA", "G722", "QCELP", "CN",
-      "MPA", "G728", "G729" };
-
-  for (int n = 0; n < NUM_CODECS_WITH_FIXED_PAYLOAD_TYPE; n++) {
-    if (!STR_CASE_CMP(payloadName, fixPayloadTypeCodecs[n])) {
-      return true;
-    }
-  }
-  return false;
-}
-
-void VADCallback::Reset() {
-  memset(_numFrameTypes, 0, sizeof(_numFrameTypes));
-}
-
-VADCallback::VADCallback() {
-  memset(_numFrameTypes, 0, sizeof(_numFrameTypes));
-}
-
-void VADCallback::PrintFrameTypes() {
-  printf("kEmptyFrame......... %d\n", _numFrameTypes[kEmptyFrame]);
-  printf("kAudioFrameSpeech... %d\n", _numFrameTypes[kAudioFrameSpeech]);
-  printf("kAudioFrameCN....... %d\n", _numFrameTypes[kAudioFrameCN]);
-  printf("kVideoFrameKey...... %d\n", _numFrameTypes[kVideoFrameKey]);
-  printf("kVideoFrameDelta.... %d\n", _numFrameTypes[kVideoFrameDelta]);
-}
-
-int32_t VADCallback::InFrameType(FrameType frame_type) {
-  _numFrameTypes[frame_type]++;
-  return 0;
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_coding/test/utility.h b/modules/audio_coding/test/utility.h
deleted file mode 100644
index 8af3675..0000000
--- a/modules/audio_coding/test/utility.h
+++ /dev/null
@@ -1,138 +0,0 @@
-/*
- *  Copyright (c) 2011 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_TEST_UTILITY_H_
-#define WEBRTC_MODULES_AUDIO_CODING_TEST_UTILITY_H_
-
-#include "webrtc/modules/audio_coding/include/audio_coding_module.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-//-----------------------------
-#define CHECK_ERROR(f)                                                         \
-  do {                                                                         \
-    EXPECT_GE(f, 0) << "Error Calling API";                                    \
-  } while(0)
-
-//-----------------------------
-#define CHECK_PROTECTED(f)                                                     \
-  do {                                                                         \
-    if (f >= 0) {                                                              \
-      ADD_FAILURE() << "Error Calling API";                                    \
-    } else {                                                                   \
-      printf("An expected error is caught.\n");                                \
-    }                                                                          \
-  } while(0)
-
-//----------------------------
-#define CHECK_ERROR_MT(f)                                                      \
-  do {                                                                         \
-    if (f < 0) {                                                               \
-      fprintf(stderr, "Error Calling API in file %s at line %d \n",            \
-              __FILE__, __LINE__);                                             \
-    }                                                                          \
-  } while(0)
-
-//----------------------------
-#define CHECK_PROTECTED_MT(f)                                                  \
-  do {                                                                         \
-    if (f >= 0) {                                                              \
-      fprintf(stderr, "Error Calling API in file %s at line %d \n",            \
-              __FILE__, __LINE__);                                             \
-    } else {                                                                   \
-      printf("An expected error is caught.\n");                                \
-    }                                                                          \
-  } while(0)
-
-#define DELETE_POINTER(p)                                                      \
-  do {                                                                         \
-    if (p != NULL) {                                                           \
-      delete p;                                                                \
-      p = NULL;                                                                \
-    }                                                                          \
-  } while(0)
-
-class ACMTestTimer {
- public:
-  ACMTestTimer();
-  ~ACMTestTimer();
-
-  void Reset();
-  void Tick10ms();
-  void Tick1ms();
-  void Tick100ms();
-  void Tick1sec();
-  void CurrentTimeHMS(char* currTime);
-  void CurrentTime(unsigned long& h, unsigned char& m, unsigned char& s,
-                   unsigned short& ms);
-
- private:
-  void Adjust();
-
-  unsigned short _msec;
-  unsigned char _sec;
-  unsigned char _min;
-  unsigned long _hour;
-};
-
-// To avoid clashes with CircularBuffer in APM.
-namespace test {
-
-class CircularBuffer {
- public:
-  CircularBuffer(uint32_t len);
-  ~CircularBuffer();
-
-  void SetArithMean(bool enable);
-  void SetVariance(bool enable);
-
-  void Update(const double newVal);
-  void IsBufferFull();
-
-  int16_t Variance(double& var);
-  int16_t ArithMean(double& mean);
-
- protected:
-  double* _buff;
-  uint32_t _idx;
-  uint32_t _buffLen;
-
-  bool _buffIsFull;
-  bool _calcAvg;
-  bool _calcVar;
-  double _sum;
-  double _sumSqr;
-};
-
-}  // namespace test
-
-int16_t ChooseCodec(CodecInst& codecInst);
-
-void PrintCodecs();
-
-bool FixedPayloadTypeCodec(const char* payloadName);
-
-class VADCallback : public ACMVADCallback {
- public:
-  VADCallback();
-
-  int32_t InFrameType(FrameType frame_type) override;
-
-  void PrintFrameTypes();
-  void Reset();
-
- private:
-  uint32_t _numFrameTypes[5];
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_CODING_TEST_UTILITY_H_
diff --git a/modules/audio_conference_mixer/BUILD.gn b/modules/audio_conference_mixer/BUILD.gn
deleted file mode 100644
index 16a62b8..0000000
--- a/modules/audio_conference_mixer/BUILD.gn
+++ /dev/null
@@ -1,80 +0,0 @@
-# Copyright (c) 2014 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.
-
-import("../../webrtc.gni")
-
-config("audio_conference_mixer_config") {
-  visibility = [ ":*" ]  # Only targets in this file can depend on this.
-  include_dirs = [
-    "include",
-    "../include",
-  ]
-}
-
-rtc_static_library("audio_conference_mixer") {
-  sources = [
-    "include/audio_conference_mixer.h",
-    "include/audio_conference_mixer_defines.h",
-    "source/audio_conference_mixer_impl.cc",
-    "source/audio_conference_mixer_impl.h",
-    "source/audio_frame_manipulator.cc",
-    "source/audio_frame_manipulator.h",
-    "source/memory_pool.h",
-    "source/memory_pool_posix.h",
-    "source/memory_pool_win.h",
-    "source/time_scheduler.cc",
-    "source/time_scheduler.h",
-  ]
-
-  public_configs = [ ":audio_conference_mixer_config" ]
-
-  if (!build_with_chromium && is_clang) {
-    # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-    suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-  }
-
-  deps = [
-    "..:module_api",
-    "../..:webrtc_common",
-    "../../audio/utility:audio_frame_operations",
-    "../../rtc_base:rtc_base_approved",
-    "../../system_wrappers",
-    "../audio_processing",
-  ]
-}
-
-if (rtc_include_tests) {
-  rtc_source_set("audio_conference_mixer_unittests") {
-    testonly = true
-
-    # Skip restricting visibility on mobile platforms since the tests on those
-    # gets additional generated targets which would require many lines here to
-    # cover (which would be confusing to read and hard to maintain).
-    if (!is_android && !is_ios) {
-      visibility = [ "..:modules_unittests" ]
-    }
-    sources = [
-      "test/audio_conference_mixer_unittest.cc",
-    ]
-    deps = [
-      ":audio_conference_mixer",
-      "../../test:test_support",
-      "//testing/gmock",
-    ]
-    if (is_win) {
-      cflags = [
-        # TODO(kjellander): bugs.webrtc.org/261: Fix this warning.
-        "/wd4373",  # virtual function override.
-      ]
-    }
-    if (!build_with_chromium && is_clang) {
-      # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-    }
-  }
-}
diff --git a/modules/audio_conference_mixer/DEPS b/modules/audio_conference_mixer/DEPS
deleted file mode 100644
index 031c602..0000000
--- a/modules/audio_conference_mixer/DEPS
+++ /dev/null
@@ -1,4 +0,0 @@
-include_rules = [
-  "+webrtc/audio/utility/audio_frame_operations.h",
-  "+webrtc/system_wrappers",
-]
diff --git a/modules/audio_conference_mixer/OWNERS b/modules/audio_conference_mixer/OWNERS
deleted file mode 100644
index 6df09bb..0000000
--- a/modules/audio_conference_mixer/OWNERS
+++ /dev/null
@@ -1,6 +0,0 @@
-minyue@webrtc.org
-
-# These are for the common case of adding or renaming files. If you're doing
-# structural changes, please get a review from a reviewer in this file.
-per-file *.gn=*
-per-file *.gni=*
diff --git a/modules/audio_conference_mixer/include/audio_conference_mixer.h b/modules/audio_conference_mixer/include/audio_conference_mixer.h
deleted file mode 100644
index 7b14f2f..0000000
--- a/modules/audio_conference_mixer/include/audio_conference_mixer.h
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- *  Copyright (c) 2011 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_CONFERENCE_MIXER_INCLUDE_AUDIO_CONFERENCE_MIXER_H_
-#define WEBRTC_MODULES_AUDIO_CONFERENCE_MIXER_INCLUDE_AUDIO_CONFERENCE_MIXER_H_
-
-#include "webrtc/modules/audio_conference_mixer/include/audio_conference_mixer_defines.h"
-#include "webrtc/modules/include/module.h"
-#include "webrtc/modules/include/module_common_types.h"
-
-namespace webrtc {
-class AudioMixerOutputReceiver;
-class MixerParticipant;
-class Trace;
-
-class AudioConferenceMixer : public Module
-{
-public:
-    enum {kMaximumAmountOfMixedParticipants = 3};
-    enum Frequency
-    {
-        kNbInHz           = 8000,
-        kWbInHz           = 16000,
-        kSwbInHz          = 32000,
-        kFbInHz           = 48000,
-        kLowestPossible   = -1,
-        kDefaultFrequency = kWbInHz
-    };
-
-    // Factory method. Constructor disabled.
-    static AudioConferenceMixer* Create(int id);
-    virtual ~AudioConferenceMixer() {}
-
-    // Module functions
-    int64_t TimeUntilNextProcess() override = 0;
-    void Process() override = 0;
-
-    // Register/unregister a callback class for receiving the mixed audio.
-    virtual int32_t RegisterMixedStreamCallback(
-        AudioMixerOutputReceiver* receiver) = 0;
-    virtual int32_t UnRegisterMixedStreamCallback() = 0;
-
-    // Add/remove participants as candidates for mixing.
-    virtual int32_t SetMixabilityStatus(MixerParticipant* participant,
-                                        bool mixable) = 0;
-    // Returns true if a participant is a candidate for mixing.
-    virtual bool MixabilityStatus(
-        const MixerParticipant& participant) const = 0;
-
-    // Inform the mixer that the participant should always be mixed and not
-    // count toward the number of mixed participants. Note that a participant
-    // must have been added to the mixer (by calling SetMixabilityStatus())
-    // before this function can be successfully called.
-    virtual int32_t SetAnonymousMixabilityStatus(
-        MixerParticipant* participant, bool mixable) = 0;
-    // Returns true if the participant is mixed anonymously.
-    virtual bool AnonymousMixabilityStatus(
-        const MixerParticipant& participant) const = 0;
-
-    // Set the minimum sampling frequency at which to mix. The mixing algorithm
-    // may still choose to mix at a higher samling frequency to avoid
-    // downsampling of audio contributing to the mixed audio.
-    virtual int32_t SetMinimumMixingFrequency(Frequency freq) = 0;
-
-protected:
-    AudioConferenceMixer() {}
-};
-}  // namespace webrtc
-
-#endif // WEBRTC_MODULES_AUDIO_CONFERENCE_MIXER_INCLUDE_AUDIO_CONFERENCE_MIXER_H_
diff --git a/modules/audio_conference_mixer/include/audio_conference_mixer_defines.h b/modules/audio_conference_mixer/include/audio_conference_mixer_defines.h
deleted file mode 100644
index c7b07a0..0000000
--- a/modules/audio_conference_mixer/include/audio_conference_mixer_defines.h
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- *  Copyright (c) 2011 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_CONFERENCE_MIXER_INCLUDE_AUDIO_CONFERENCE_MIXER_DEFINES_H_
-#define WEBRTC_MODULES_AUDIO_CONFERENCE_MIXER_INCLUDE_AUDIO_CONFERENCE_MIXER_DEFINES_H_
-
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-class MixHistory;
-
-// A callback class that all mixer participants must inherit from/implement.
-class MixerParticipant
-{
-public:
-    // The implementation of this function should update audioFrame with new
-    // audio every time it's called.
-    //
-    // If it returns -1, the frame will not be added to the mix.
-    //
-    // NOTE: This function should not be called. It will remain for a short
-    // time so that subclasses can override it without getting warnings.
-    // TODO(henrik.lundin) Remove this function.
-    virtual int32_t GetAudioFrame(int32_t id,
-                                  AudioFrame* audioFrame) {
-      RTC_CHECK(false);
-      return -1;
-    }
-
-
-    // The implementation of GetAudioFrameWithMuted should update audio_frame
-    // with new audio every time it's called. The return value will be
-    // interpreted as follows.
-    enum class AudioFrameInfo {
-      kNormal,  // The samples in audio_frame are valid and should be used.
-      kMuted,   // The samples in audio_frame should not be used, but should be
-                // implicitly interpreted as zero. Other fields in audio_frame
-                // may be read and should contain meaningful values.
-      kError    // audio_frame will not be used.
-    };
-
-    virtual AudioFrameInfo GetAudioFrameWithMuted(int32_t id,
-                                                  AudioFrame* audio_frame) {
-      return GetAudioFrame(id, audio_frame) == -1 ?
-          AudioFrameInfo::kError :
-          AudioFrameInfo::kNormal;
-    }
-
-    // Returns true if the participant was mixed this mix iteration.
-    bool IsMixed() const;
-
-    // This function specifies the sampling frequency needed for the AudioFrame
-    // for future GetAudioFrame(..) calls.
-    virtual int32_t NeededFrequency(int32_t id) const = 0;
-
-    MixHistory* _mixHistory;
-protected:
-    MixerParticipant();
-    virtual ~MixerParticipant();
-};
-
-class AudioMixerOutputReceiver
-{
-public:
-    // This callback function provides the mixed audio for this mix iteration.
-    // Note that uniqueAudioFrames is an array of AudioFrame pointers with the
-    // size according to the size parameter.
-    virtual void NewMixedAudio(const int32_t id,
-                               const AudioFrame& generalAudioFrame,
-                               const AudioFrame** uniqueAudioFrames,
-                               const uint32_t size) = 0;
-protected:
-    AudioMixerOutputReceiver() {}
-    virtual ~AudioMixerOutputReceiver() {}
-};
-}  // namespace webrtc
-
-#endif // WEBRTC_MODULES_AUDIO_CONFERENCE_MIXER_INCLUDE_AUDIO_CONFERENCE_MIXER_DEFINES_H_
diff --git a/modules/audio_conference_mixer/source/audio_conference_mixer_impl.cc b/modules/audio_conference_mixer/source/audio_conference_mixer_impl.cc
deleted file mode 100644
index 8e8b657..0000000
--- a/modules/audio_conference_mixer/source/audio_conference_mixer_impl.cc
+++ /dev/null
@@ -1,904 +0,0 @@
-/*
- *  Copyright (c) 2012 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_conference_mixer/source/audio_conference_mixer_impl.h"
-#include "webrtc/audio/utility/audio_frame_operations.h"
-#include "webrtc/modules/audio_conference_mixer/include/audio_conference_mixer_defines.h"
-#include "webrtc/modules/audio_conference_mixer/source/audio_frame_manipulator.h"
-#include "webrtc/modules/audio_processing/include/audio_processing.h"
-#include "webrtc/rtc_base/logging.h"
-
-namespace webrtc {
-namespace {
-
-struct ParticipantFrameStruct {
-  ParticipantFrameStruct(MixerParticipant* p, AudioFrame* a, bool m)
-      : participant(p), audioFrame(a), muted(m) {}
-  MixerParticipant* participant;
-  AudioFrame* audioFrame;
-  bool muted;
-};
-
-typedef std::list<ParticipantFrameStruct*> ParticipantFrameStructList;
-
-// Mix |frame| into |mixed_frame|, with saturation protection and upmixing.
-// These effects are applied to |frame| itself prior to mixing. Assumes that
-// |mixed_frame| always has at least as many channels as |frame|. Supports
-// stereo at most.
-//
-// TODO(andrew): consider not modifying |frame| here.
-void MixFrames(AudioFrame* mixed_frame, AudioFrame* frame, bool use_limiter) {
-  assert(mixed_frame->num_channels_ >= frame->num_channels_);
-  if (use_limiter) {
-    // This is to avoid saturation in the mixing. It is only
-    // meaningful if the limiter will be used.
-    AudioFrameOperations::ApplyHalfGain(frame);
-  }
-  if (mixed_frame->num_channels_ > frame->num_channels_) {
-    // We only support mono-to-stereo.
-    assert(mixed_frame->num_channels_ == 2 &&
-           frame->num_channels_ == 1);
-    AudioFrameOperations::MonoToStereo(frame);
-  }
-
-  AudioFrameOperations::Add(*frame, mixed_frame);
-}
-
-// Return the max number of channels from a |list| composed of AudioFrames.
-size_t MaxNumChannels(const AudioFrameList* list) {
-  size_t max_num_channels = 1;
-  for (AudioFrameList::const_iterator iter = list->begin();
-       iter != list->end();
-       ++iter) {
-    max_num_channels = std::max(max_num_channels, (*iter).frame->num_channels_);
-  }
-  return max_num_channels;
-}
-
-}  // namespace
-
-MixerParticipant::MixerParticipant()
-    : _mixHistory(new MixHistory()) {
-}
-
-MixerParticipant::~MixerParticipant() {
-    delete _mixHistory;
-}
-
-bool MixerParticipant::IsMixed() const {
-    return _mixHistory->IsMixed();
-}
-
-MixHistory::MixHistory()
-    : _isMixed(0) {
-}
-
-MixHistory::~MixHistory() {
-}
-
-bool MixHistory::IsMixed() const {
-    return _isMixed;
-}
-
-bool MixHistory::WasMixed() const {
-    // Was mixed is the same as is mixed depending on perspective. This function
-    // is for the perspective of AudioConferenceMixerImpl.
-    return IsMixed();
-}
-
-int32_t MixHistory::SetIsMixed(const bool mixed) {
-    _isMixed = mixed;
-    return 0;
-}
-
-void MixHistory::ResetMixedStatus() {
-    _isMixed = false;
-}
-
-AudioConferenceMixer* AudioConferenceMixer::Create(int id) {
-    AudioConferenceMixerImpl* mixer = new AudioConferenceMixerImpl(id);
-    if(!mixer->Init()) {
-        delete mixer;
-        return NULL;
-    }
-    return mixer;
-}
-
-AudioConferenceMixerImpl::AudioConferenceMixerImpl(int id)
-    : _id(id),
-      _minimumMixingFreq(kLowestPossible),
-      _mixReceiver(NULL),
-      _outputFrequency(kDefaultFrequency),
-      _sampleSize(0),
-      _audioFramePool(NULL),
-      _participantList(),
-      _additionalParticipantList(),
-      _numMixedParticipants(0),
-      use_limiter_(true),
-      _timeStamp(0),
-      _timeScheduler(kProcessPeriodicityInMs),
-      _processCalls(0) {}
-
-bool AudioConferenceMixerImpl::Init() {
-    Config config;
-    config.Set<ExperimentalAgc>(new ExperimentalAgc(false));
-    _limiter.reset(AudioProcessing::Create(config));
-    if(!_limiter.get())
-        return false;
-
-    MemoryPool<AudioFrame>::CreateMemoryPool(_audioFramePool,
-                                             DEFAULT_AUDIO_FRAME_POOLSIZE);
-    if(_audioFramePool == NULL)
-        return false;
-
-    if(SetOutputFrequency(kDefaultFrequency) == -1)
-        return false;
-
-    if(_limiter->gain_control()->set_mode(GainControl::kFixedDigital) !=
-        _limiter->kNoError)
-        return false;
-
-    // We smoothly limit the mixed frame to -7 dbFS. -6 would correspond to the
-    // divide-by-2 but -7 is used instead to give a bit of headroom since the
-    // AGC is not a hard limiter.
-    if(_limiter->gain_control()->set_target_level_dbfs(7) != _limiter->kNoError)
-        return false;
-
-    if(_limiter->gain_control()->set_compression_gain_db(0)
-        != _limiter->kNoError)
-        return false;
-
-    if(_limiter->gain_control()->enable_limiter(true) != _limiter->kNoError)
-        return false;
-
-    if(_limiter->gain_control()->Enable(true) != _limiter->kNoError)
-        return false;
-
-    return true;
-}
-
-AudioConferenceMixerImpl::~AudioConferenceMixerImpl() {
-    MemoryPool<AudioFrame>::DeleteMemoryPool(_audioFramePool);
-    assert(_audioFramePool == NULL);
-}
-
-// Process should be called every kProcessPeriodicityInMs ms
-int64_t AudioConferenceMixerImpl::TimeUntilNextProcess() {
-    int64_t timeUntilNextProcess = 0;
-    rtc::CritScope cs(&_crit);
-    if(_timeScheduler.TimeToNextUpdate(timeUntilNextProcess) != 0) {
-        LOG(LS_ERROR) << "failed in TimeToNextUpdate() call";
-        // Sanity check
-        assert(false);
-        return -1;
-    }
-    return timeUntilNextProcess;
-}
-
-void AudioConferenceMixerImpl::Process() {
-    size_t remainingParticipantsAllowedToMix =
-        kMaximumAmountOfMixedParticipants;
-    {
-        rtc::CritScope cs(&_crit);
-        assert(_processCalls == 0);
-        _processCalls++;
-
-        // Let the scheduler know that we are running one iteration.
-        _timeScheduler.UpdateScheduler();
-    }
-
-    AudioFrameList mixList;
-    AudioFrameList rampOutList;
-    AudioFrameList additionalFramesList;
-    std::map<int, MixerParticipant*> mixedParticipantsMap;
-    {
-        rtc::CritScope cs(&_cbCrit);
-
-        int32_t lowFreq = GetLowestMixingFrequency();
-        // SILK can run in 12 kHz and 24 kHz. These frequencies are not
-        // supported so use the closest higher frequency to not lose any
-        // information.
-        // TODO(henrike): this is probably more appropriate to do in
-        //                GetLowestMixingFrequency().
-        if (lowFreq == 12000) {
-            lowFreq = 16000;
-        } else if (lowFreq == 24000) {
-            lowFreq = 32000;
-        }
-        if(lowFreq <= 0) {
-          rtc::CritScope cs(&_crit);
-          _processCalls--;
-          return;
-        } else {
-            switch(lowFreq) {
-            case 8000:
-                if(OutputFrequency() != kNbInHz) {
-                    SetOutputFrequency(kNbInHz);
-                }
-                break;
-            case 16000:
-                if(OutputFrequency() != kWbInHz) {
-                    SetOutputFrequency(kWbInHz);
-                }
-                break;
-            case 32000:
-                if(OutputFrequency() != kSwbInHz) {
-                    SetOutputFrequency(kSwbInHz);
-                }
-                break;
-            case 48000:
-                if(OutputFrequency() != kFbInHz) {
-                    SetOutputFrequency(kFbInHz);
-                }
-                break;
-            default:
-                assert(false);
-
-                rtc::CritScope cs(&_crit);
-                _processCalls--;
-                return;
-            }
-        }
-
-        UpdateToMix(&mixList, &rampOutList, &mixedParticipantsMap,
-                    &remainingParticipantsAllowedToMix);
-
-        GetAdditionalAudio(&additionalFramesList);
-        UpdateMixedStatus(mixedParticipantsMap);
-    }
-
-    // Get an AudioFrame for mixing from the memory pool.
-    AudioFrame* mixedAudio = NULL;
-    if(_audioFramePool->PopMemory(mixedAudio) == -1) {
-        LOG(LS_ERROR) << "failed PopMemory() call";
-        assert(false);
-        return;
-    }
-
-    {
-        rtc::CritScope cs(&_crit);
-
-        // TODO(henrike): it might be better to decide the number of channels
-        //                with an API instead of dynamically.
-
-        // Find the max channels over all mixing lists.
-        const size_t num_mixed_channels = std::max(MaxNumChannels(&mixList),
-            std::max(MaxNumChannels(&additionalFramesList),
-                     MaxNumChannels(&rampOutList)));
-
-        mixedAudio->UpdateFrame(-1, _timeStamp, NULL, 0, _outputFrequency,
-                                AudioFrame::kNormalSpeech,
-                                AudioFrame::kVadPassive, num_mixed_channels);
-
-        _timeStamp += static_cast<uint32_t>(_sampleSize);
-
-        // We only use the limiter if it supports the output sample rate and
-        // we're actually mixing multiple streams.
-        use_limiter_ =
-            _numMixedParticipants > 1 &&
-            _outputFrequency <= AudioProcessing::kMaxNativeSampleRateHz;
-
-        MixFromList(mixedAudio, mixList);
-        MixAnonomouslyFromList(mixedAudio, additionalFramesList);
-        MixAnonomouslyFromList(mixedAudio, rampOutList);
-
-        if(mixedAudio->samples_per_channel_ == 0) {
-            // Nothing was mixed, set the audio samples to silence.
-            mixedAudio->samples_per_channel_ = _sampleSize;
-            AudioFrameOperations::Mute(mixedAudio);
-        } else {
-            // Only call the limiter if we have something to mix.
-            LimitMixedAudio(mixedAudio);
-        }
-    }
-
-    {
-        rtc::CritScope cs(&_cbCrit);
-        if(_mixReceiver != NULL) {
-            const AudioFrame** dummy = NULL;
-            _mixReceiver->NewMixedAudio(
-                _id,
-                *mixedAudio,
-                dummy,
-                0);
-        }
-    }
-
-    // Reclaim all outstanding memory.
-    _audioFramePool->PushMemory(mixedAudio);
-    ClearAudioFrameList(&mixList);
-    ClearAudioFrameList(&rampOutList);
-    ClearAudioFrameList(&additionalFramesList);
-    {
-        rtc::CritScope cs(&_crit);
-        _processCalls--;
-    }
-    return;
-}
-
-int32_t AudioConferenceMixerImpl::RegisterMixedStreamCallback(
-    AudioMixerOutputReceiver* mixReceiver) {
-    rtc::CritScope cs(&_cbCrit);
-    if(_mixReceiver != NULL) {
-        return -1;
-    }
-    _mixReceiver = mixReceiver;
-    return 0;
-}
-
-int32_t AudioConferenceMixerImpl::UnRegisterMixedStreamCallback() {
-    rtc::CritScope cs(&_cbCrit);
-    if(_mixReceiver == NULL) {
-        return -1;
-    }
-    _mixReceiver = NULL;
-    return 0;
-}
-
-int32_t AudioConferenceMixerImpl::SetOutputFrequency(
-    const Frequency& frequency) {
-    rtc::CritScope cs(&_crit);
-
-    _outputFrequency = frequency;
-    _sampleSize =
-        static_cast<size_t>((_outputFrequency*kProcessPeriodicityInMs) / 1000);
-
-    return 0;
-}
-
-AudioConferenceMixer::Frequency
-AudioConferenceMixerImpl::OutputFrequency() const {
-    rtc::CritScope cs(&_crit);
-    return _outputFrequency;
-}
-
-int32_t AudioConferenceMixerImpl::SetMixabilityStatus(
-    MixerParticipant* participant, bool mixable) {
-    if (!mixable) {
-        // Anonymous participants are in a separate list. Make sure that the
-        // participant is in the _participantList if it is being mixed.
-        SetAnonymousMixabilityStatus(participant, false);
-    }
-    size_t numMixedParticipants;
-    {
-        rtc::CritScope cs(&_cbCrit);
-        const bool isMixed =
-            IsParticipantInList(*participant, _participantList);
-        // API must be called with a new state.
-        if(!(mixable ^ isMixed)) {
-            LOG(LS_ERROR) << "Mixable is aready " <<
-                (isMixed ? "ON" : "off");
-            return -1;
-        }
-        bool success = false;
-        if(mixable) {
-            success = AddParticipantToList(participant, &_participantList);
-        } else {
-            success = RemoveParticipantFromList(participant, &_participantList);
-        }
-        if(!success) {
-            LOG(LS_ERROR) << "failed to " << (mixable ? "add" : "remove")
-                          << " participant";
-            assert(false);
-            return -1;
-        }
-
-        size_t numMixedNonAnonymous = _participantList.size();
-        if (numMixedNonAnonymous > kMaximumAmountOfMixedParticipants) {
-            numMixedNonAnonymous = kMaximumAmountOfMixedParticipants;
-        }
-        numMixedParticipants =
-            numMixedNonAnonymous + _additionalParticipantList.size();
-    }
-    // A MixerParticipant was added or removed. Make sure the scratch
-    // buffer is updated if necessary.
-    // Note: The scratch buffer may only be updated in Process().
-    rtc::CritScope cs(&_crit);
-    _numMixedParticipants = numMixedParticipants;
-    return 0;
-}
-
-bool AudioConferenceMixerImpl::MixabilityStatus(
-    const MixerParticipant& participant) const {
-    rtc::CritScope cs(&_cbCrit);
-    return IsParticipantInList(participant, _participantList);
-}
-
-int32_t AudioConferenceMixerImpl::SetAnonymousMixabilityStatus(
-    MixerParticipant* participant, bool anonymous) {
-    rtc::CritScope cs(&_cbCrit);
-    if(IsParticipantInList(*participant, _additionalParticipantList)) {
-        if(anonymous) {
-            return 0;
-        }
-        if(!RemoveParticipantFromList(participant,
-                                      &_additionalParticipantList)) {
-            LOG(LS_ERROR) << "unable to remove participant from anonymous list";
-            assert(false);
-            return -1;
-        }
-        return AddParticipantToList(participant, &_participantList) ? 0 : -1;
-    }
-    if(!anonymous) {
-        return 0;
-    }
-    const bool mixable = RemoveParticipantFromList(participant,
-                                                   &_participantList);
-    if(!mixable) {
-        LOG(LS_WARNING) <<
-          "participant must be registered before turning it into anonymous";
-        // Setting anonymous status is only possible if MixerParticipant is
-        // already registered.
-        return -1;
-    }
-    return AddParticipantToList(participant, &_additionalParticipantList) ?
-        0 : -1;
-}
-
-bool AudioConferenceMixerImpl::AnonymousMixabilityStatus(
-    const MixerParticipant& participant) const {
-    rtc::CritScope cs(&_cbCrit);
-    return IsParticipantInList(participant, _additionalParticipantList);
-}
-
-int32_t AudioConferenceMixerImpl::SetMinimumMixingFrequency(
-    Frequency freq) {
-    // Make sure that only allowed sampling frequencies are used. Use closest
-    // higher sampling frequency to avoid losing information.
-    if (static_cast<int>(freq) == 12000) {
-         freq = kWbInHz;
-    } else if (static_cast<int>(freq) == 24000) {
-        freq = kSwbInHz;
-    }
-
-    if((freq == kNbInHz) || (freq == kWbInHz) || (freq == kSwbInHz) ||
-       (freq == kLowestPossible)) {
-        _minimumMixingFreq=freq;
-        return 0;
-    } else {
-        LOG(LS_ERROR) << "SetMinimumMixingFrequency incorrect frequency: "
-                      << freq;
-        assert(false);
-        return -1;
-    }
-}
-
-// Check all AudioFrames that are to be mixed. The highest sampling frequency
-// found is the lowest that can be used without losing information.
-int32_t AudioConferenceMixerImpl::GetLowestMixingFrequency() const {
-    const int participantListFrequency =
-        GetLowestMixingFrequencyFromList(_participantList);
-    const int anonymousListFrequency =
-        GetLowestMixingFrequencyFromList(_additionalParticipantList);
-    const int highestFreq =
-        (participantListFrequency > anonymousListFrequency) ?
-            participantListFrequency : anonymousListFrequency;
-    // Check if the user specified a lowest mixing frequency.
-    if(_minimumMixingFreq != kLowestPossible) {
-        if(_minimumMixingFreq > highestFreq) {
-            return _minimumMixingFreq;
-        }
-    }
-    return highestFreq;
-}
-
-int32_t AudioConferenceMixerImpl::GetLowestMixingFrequencyFromList(
-    const MixerParticipantList& mixList) const {
-    int32_t highestFreq = 8000;
-    for (MixerParticipantList::const_iterator iter = mixList.begin();
-         iter != mixList.end();
-         ++iter) {
-        const int32_t neededFrequency = (*iter)->NeededFrequency(_id);
-        if(neededFrequency > highestFreq) {
-            highestFreq = neededFrequency;
-        }
-    }
-    return highestFreq;
-}
-
-void AudioConferenceMixerImpl::UpdateToMix(
-    AudioFrameList* mixList,
-    AudioFrameList* rampOutList,
-    std::map<int, MixerParticipant*>* mixParticipantList,
-    size_t* maxAudioFrameCounter) const {
-    LOG(LS_VERBOSE) <<
-        "UpdateToMix(mixList,rampOutList,mixParticipantList," <<
-        *maxAudioFrameCounter << ")";
-    const size_t mixListStartSize = mixList->size();
-    AudioFrameList activeList;
-    // Struct needed by the passive lists to keep track of which AudioFrame
-    // belongs to which MixerParticipant.
-    ParticipantFrameStructList passiveWasNotMixedList;
-    ParticipantFrameStructList passiveWasMixedList;
-    for (MixerParticipantList::const_iterator participant =
-        _participantList.begin(); participant != _participantList.end();
-         ++participant) {
-        // Stop keeping track of passive participants if there are already
-        // enough participants available (they wont be mixed anyway).
-        bool mustAddToPassiveList = (*maxAudioFrameCounter >
-                                    (activeList.size() +
-                                     passiveWasMixedList.size() +
-                                     passiveWasNotMixedList.size()));
-
-        bool wasMixed = false;
-        wasMixed = (*participant)->_mixHistory->WasMixed();
-        AudioFrame* audioFrame = NULL;
-        if(_audioFramePool->PopMemory(audioFrame) == -1) {
-            LOG(LS_ERROR) << "failed PopMemory() call";
-            assert(false);
-            return;
-        }
-        audioFrame->sample_rate_hz_ = _outputFrequency;
-
-        auto ret = (*participant)->GetAudioFrameWithMuted(_id, audioFrame);
-        if (ret == MixerParticipant::AudioFrameInfo::kError) {
-            LOG(LS_WARNING)
-              << "failed to GetAudioFrameWithMuted() from participant";
-            _audioFramePool->PushMemory(audioFrame);
-            continue;
-        }
-        const bool muted = (ret == MixerParticipant::AudioFrameInfo::kMuted);
-        if (_participantList.size() != 1) {
-          // TODO(wu): Issue 3390, add support for multiple participants case.
-          audioFrame->ntp_time_ms_ = -1;
-        }
-
-        // TODO(henrike): this assert triggers in some test cases where SRTP is
-        // used which prevents NetEQ from making a VAD. Temporarily disable this
-        // assert until the problem is fixed on a higher level.
-        // assert(audioFrame->vad_activity_ != AudioFrame::kVadUnknown);
-        if (audioFrame->vad_activity_ == AudioFrame::kVadUnknown) {
-            LOG(LS_WARNING) << "invalid VAD state from participant";
-        }
-
-        if(audioFrame->vad_activity_ == AudioFrame::kVadActive) {
-            if(!wasMixed && !muted) {
-                RampIn(*audioFrame);
-            }
-
-            if(activeList.size() >= *maxAudioFrameCounter) {
-                // There are already more active participants than should be
-                // mixed. Only keep the ones with the highest energy.
-                AudioFrameList::iterator replaceItem;
-                uint32_t lowestEnergy =
-                    muted ? 0 : CalculateEnergy(*audioFrame);
-
-                bool found_replace_item = false;
-                for (AudioFrameList::iterator iter = activeList.begin();
-                     iter != activeList.end();
-                     ++iter) {
-                    const uint32_t energy =
-                        muted ? 0 : CalculateEnergy(*iter->frame);
-                    if(energy < lowestEnergy) {
-                        replaceItem = iter;
-                        lowestEnergy = energy;
-                        found_replace_item = true;
-                    }
-                }
-                if(found_replace_item) {
-                    RTC_DCHECK(!muted);  // Cannot replace with a muted frame.
-                    FrameAndMuteInfo replaceFrame = *replaceItem;
-
-                    bool replaceWasMixed = false;
-                    std::map<int, MixerParticipant*>::const_iterator it =
-                        mixParticipantList->find(replaceFrame.frame->id_);
-
-                    // When a frame is pushed to |activeList| it is also pushed
-                    // to mixParticipantList with the frame's id. This means
-                    // that the Find call above should never fail.
-                    assert(it != mixParticipantList->end());
-                    replaceWasMixed = it->second->_mixHistory->WasMixed();
-
-                    mixParticipantList->erase(replaceFrame.frame->id_);
-                    activeList.erase(replaceItem);
-
-                    activeList.push_front(FrameAndMuteInfo(audioFrame, muted));
-                    (*mixParticipantList)[audioFrame->id_] = *participant;
-                    assert(mixParticipantList->size() <=
-                           kMaximumAmountOfMixedParticipants);
-
-                    if (replaceWasMixed) {
-                      if (!replaceFrame.muted) {
-                        RampOut(*replaceFrame.frame);
-                      }
-                      rampOutList->push_back(replaceFrame);
-                      assert(rampOutList->size() <=
-                             kMaximumAmountOfMixedParticipants);
-                    } else {
-                      _audioFramePool->PushMemory(replaceFrame.frame);
-                    }
-                } else {
-                    if(wasMixed) {
-                        if (!muted) {
-                            RampOut(*audioFrame);
-                        }
-                        rampOutList->push_back(FrameAndMuteInfo(audioFrame,
-                                                                muted));
-                        assert(rampOutList->size() <=
-                               kMaximumAmountOfMixedParticipants);
-                    } else {
-                        _audioFramePool->PushMemory(audioFrame);
-                    }
-                }
-            } else {
-                activeList.push_front(FrameAndMuteInfo(audioFrame, muted));
-                (*mixParticipantList)[audioFrame->id_] = *participant;
-                assert(mixParticipantList->size() <=
-                       kMaximumAmountOfMixedParticipants);
-            }
-        } else {
-            if(wasMixed) {
-                ParticipantFrameStruct* part_struct =
-                    new ParticipantFrameStruct(*participant, audioFrame, muted);
-                passiveWasMixedList.push_back(part_struct);
-            } else if(mustAddToPassiveList) {
-                if (!muted) {
-                    RampIn(*audioFrame);
-                }
-                ParticipantFrameStruct* part_struct =
-                    new ParticipantFrameStruct(*participant, audioFrame, muted);
-                passiveWasNotMixedList.push_back(part_struct);
-            } else {
-                _audioFramePool->PushMemory(audioFrame);
-            }
-        }
-    }
-    assert(activeList.size() <= *maxAudioFrameCounter);
-    // At this point it is known which participants should be mixed. Transfer
-    // this information to this functions output parameters.
-    for (AudioFrameList::const_iterator iter = activeList.begin();
-         iter != activeList.end();
-         ++iter) {
-        mixList->push_back(*iter);
-    }
-    activeList.clear();
-    // Always mix a constant number of AudioFrames. If there aren't enough
-    // active participants mix passive ones. Starting with those that was mixed
-    // last iteration.
-    for (ParticipantFrameStructList::const_iterator
-        iter = passiveWasMixedList.begin(); iter != passiveWasMixedList.end();
-         ++iter) {
-        if(mixList->size() < *maxAudioFrameCounter + mixListStartSize) {
-            mixList->push_back(FrameAndMuteInfo((*iter)->audioFrame,
-                                                (*iter)->muted));
-            (*mixParticipantList)[(*iter)->audioFrame->id_] =
-                (*iter)->participant;
-            assert(mixParticipantList->size() <=
-                   kMaximumAmountOfMixedParticipants);
-        } else {
-            _audioFramePool->PushMemory((*iter)->audioFrame);
-        }
-        delete *iter;
-    }
-    // And finally the ones that have not been mixed for a while.
-    for (ParticipantFrameStructList::const_iterator iter =
-             passiveWasNotMixedList.begin();
-         iter != passiveWasNotMixedList.end();
-         ++iter) {
-        if(mixList->size() <  *maxAudioFrameCounter + mixListStartSize) {
-          mixList->push_back(FrameAndMuteInfo((*iter)->audioFrame,
-                                              (*iter)->muted));
-            (*mixParticipantList)[(*iter)->audioFrame->id_] =
-                (*iter)->participant;
-            assert(mixParticipantList->size() <=
-                   kMaximumAmountOfMixedParticipants);
-        } else {
-            _audioFramePool->PushMemory((*iter)->audioFrame);
-        }
-        delete *iter;
-    }
-    assert(*maxAudioFrameCounter + mixListStartSize >= mixList->size());
-    *maxAudioFrameCounter += mixListStartSize - mixList->size();
-}
-
-void AudioConferenceMixerImpl::GetAdditionalAudio(
-    AudioFrameList* additionalFramesList) const {
-    LOG(LS_VERBOSE) << "GetAdditionalAudio(additionalFramesList)";
-    // The GetAudioFrameWithMuted() callback may result in the participant being
-    // removed from additionalParticipantList_. If that happens it will
-    // invalidate any iterators. Create a copy of the participants list such
-    // that the list of participants can be traversed safely.
-    MixerParticipantList additionalParticipantList;
-    additionalParticipantList.insert(additionalParticipantList.begin(),
-                                     _additionalParticipantList.begin(),
-                                     _additionalParticipantList.end());
-
-    for (MixerParticipantList::const_iterator participant =
-             additionalParticipantList.begin();
-         participant != additionalParticipantList.end();
-         ++participant) {
-        AudioFrame* audioFrame = NULL;
-        if(_audioFramePool->PopMemory(audioFrame) == -1) {
-          LOG(LS_ERROR) << "failed PopMemory() call";
-            assert(false);
-            return;
-        }
-        audioFrame->sample_rate_hz_ = _outputFrequency;
-        auto ret = (*participant)->GetAudioFrameWithMuted(_id, audioFrame);
-        if (ret == MixerParticipant::AudioFrameInfo::kError) {
-            LOG(LS_WARNING)
-                << "failed to GetAudioFrameWithMuted() from participant";
-            _audioFramePool->PushMemory(audioFrame);
-            continue;
-        }
-        if(audioFrame->samples_per_channel_ == 0) {
-            // Empty frame. Don't use it.
-            _audioFramePool->PushMemory(audioFrame);
-            continue;
-        }
-        additionalFramesList->push_back(FrameAndMuteInfo(
-            audioFrame, ret == MixerParticipant::AudioFrameInfo::kMuted));
-    }
-}
-
-void AudioConferenceMixerImpl::UpdateMixedStatus(
-    const std::map<int, MixerParticipant*>& mixedParticipantsMap) const {
-    LOG(LS_VERBOSE) << "UpdateMixedStatus(mixedParticipantsMap)";
-    assert(mixedParticipantsMap.size() <= kMaximumAmountOfMixedParticipants);
-
-    // Loop through all participants. If they are in the mix map they
-    // were mixed.
-    for (MixerParticipantList::const_iterator
-        participant =_participantList.begin();
-        participant != _participantList.end();
-         ++participant) {
-        bool isMixed = false;
-        for (auto it = mixedParticipantsMap.begin();
-             it != mixedParticipantsMap.end();
-             ++it) {
-          if (it->second == *participant) {
-            isMixed = true;
-            break;
-          }
-        }
-        (*participant)->_mixHistory->SetIsMixed(isMixed);
-    }
-}
-
-void AudioConferenceMixerImpl::ClearAudioFrameList(
-    AudioFrameList* audioFrameList) const {
-    LOG(LS_VERBOSE) << "ClearAudioFrameList(audioFrameList)";
-    for (AudioFrameList::iterator iter = audioFrameList->begin();
-         iter != audioFrameList->end();
-         ++iter) {
-        _audioFramePool->PushMemory(iter->frame);
-    }
-    audioFrameList->clear();
-}
-
-bool AudioConferenceMixerImpl::IsParticipantInList(
-    const MixerParticipant& participant,
-    const MixerParticipantList& participantList) const {
-    LOG(LS_VERBOSE) << "IsParticipantInList(participant,participantList)";
-    for (MixerParticipantList::const_iterator iter = participantList.begin();
-         iter != participantList.end();
-         ++iter) {
-        if(&participant == *iter) {
-            return true;
-        }
-    }
-    return false;
-}
-
-bool AudioConferenceMixerImpl::AddParticipantToList(
-    MixerParticipant* participant,
-    MixerParticipantList* participantList) const {
-    LOG(LS_VERBOSE) << "AddParticipantToList(participant, participantList)";
-    participantList->push_back(participant);
-    // Make sure that the mixed status is correct for new MixerParticipant.
-    participant->_mixHistory->ResetMixedStatus();
-    return true;
-}
-
-bool AudioConferenceMixerImpl::RemoveParticipantFromList(
-    MixerParticipant* participant,
-    MixerParticipantList* participantList) const {
-    LOG(LS_VERBOSE)
-        << "RemoveParticipantFromList(participant, participantList)";
-    for (MixerParticipantList::iterator iter = participantList->begin();
-         iter != participantList->end();
-         ++iter) {
-        if(*iter == participant) {
-            participantList->erase(iter);
-            // Participant is no longer mixed, reset to default.
-            participant->_mixHistory->ResetMixedStatus();
-            return true;
-        }
-    }
-    return false;
-}
-
-int32_t AudioConferenceMixerImpl::MixFromList(
-    AudioFrame* mixedAudio,
-    const AudioFrameList& audioFrameList) const {
-
-    LOG(LS_VERBOSE) << "MixFromList(mixedAudio, audioFrameList)";
-    if(audioFrameList.empty()) return 0;
-
-    uint32_t position = 0;
-
-    if (_numMixedParticipants == 1) {
-      mixedAudio->timestamp_ = audioFrameList.front().frame->timestamp_;
-      mixedAudio->elapsed_time_ms_ =
-          audioFrameList.front().frame->elapsed_time_ms_;
-    } else {
-      // TODO(wu): Issue 3390.
-      // Audio frame timestamp is only supported in one channel case.
-      mixedAudio->timestamp_ = 0;
-      mixedAudio->elapsed_time_ms_ = -1;
-    }
-
-    for (AudioFrameList::const_iterator iter = audioFrameList.begin();
-         iter != audioFrameList.end();
-         ++iter) {
-        if(position >= kMaximumAmountOfMixedParticipants) {
-            LOG(LS_ERROR) <<
-                "Trying to mix more than max amount of mixed participants:"
-                       << kMaximumAmountOfMixedParticipants << "!";
-            // Assert and avoid crash
-            assert(false);
-            position = 0;
-        }
-        if (!iter->muted) {
-          MixFrames(mixedAudio, iter->frame, use_limiter_);
-        }
-
-        position++;
-    }
-
-    return 0;
-}
-
-// TODO(andrew): consolidate this function with MixFromList.
-int32_t AudioConferenceMixerImpl::MixAnonomouslyFromList(
-    AudioFrame* mixedAudio,
-    const AudioFrameList& audioFrameList) const {
-    LOG(LS_VERBOSE) << "MixAnonomouslyFromList(mixedAudio, audioFrameList)";
-
-    if(audioFrameList.empty()) return 0;
-
-    for (AudioFrameList::const_iterator iter = audioFrameList.begin();
-         iter != audioFrameList.end();
-         ++iter) {
-        if (!iter->muted) {
-            MixFrames(mixedAudio, iter->frame, use_limiter_);
-        }
-    }
-    return 0;
-}
-
-bool AudioConferenceMixerImpl::LimitMixedAudio(AudioFrame* mixedAudio) const {
-    if (!use_limiter_) {
-      return true;
-    }
-
-    // Smoothly limit the mixed frame.
-    const int error = _limiter->ProcessStream(mixedAudio);
-
-    // And now we can safely restore the level. This procedure results in
-    // some loss of resolution, deemed acceptable.
-    //
-    // It's possible to apply the gain in the AGC (with a target level of 0 dbFS
-    // and compression gain of 6 dB). However, in the transition frame when this
-    // is enabled (moving from one to two participants) it has the potential to
-    // create discontinuities in the mixed frame.
-    //
-    // Instead we double the frame (with addition since left-shifting a
-    // negative value is undefined).
-    AudioFrameOperations::Add(*mixedAudio, mixedAudio);
-
-    if(error != _limiter->kNoError) {
-        LOG(LS_ERROR) << "Error from AudioProcessing: " << error;
-        assert(false);
-        return false;
-    }
-    return true;
-}
-}  // namespace webrtc
diff --git a/modules/audio_conference_mixer/source/audio_conference_mixer_impl.h b/modules/audio_conference_mixer/source/audio_conference_mixer_impl.h
deleted file mode 100644
index 865de6f..0000000
--- a/modules/audio_conference_mixer/source/audio_conference_mixer_impl.h
+++ /dev/null
@@ -1,192 +0,0 @@
-/*
- *  Copyright (c) 2012 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_CONFERENCE_MIXER_SOURCE_AUDIO_CONFERENCE_MIXER_IMPL_H_
-#define WEBRTC_MODULES_AUDIO_CONFERENCE_MIXER_SOURCE_AUDIO_CONFERENCE_MIXER_IMPL_H_
-
-#include <list>
-#include <map>
-#include <memory>
-
-#include "webrtc/modules/audio_conference_mixer/include/audio_conference_mixer.h"
-#include "webrtc/modules/audio_conference_mixer/source/memory_pool.h"
-#include "webrtc/modules/audio_conference_mixer/source/time_scheduler.h"
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-class AudioProcessing;
-
-struct FrameAndMuteInfo {
-  FrameAndMuteInfo(AudioFrame* f, bool m) : frame(f), muted(m) {}
-  AudioFrame* frame;
-  bool muted;
-};
-
-typedef std::list<FrameAndMuteInfo> AudioFrameList;
-typedef std::list<MixerParticipant*> MixerParticipantList;
-
-// Cheshire cat implementation of MixerParticipant's non virtual functions.
-class MixHistory
-{
-public:
-    MixHistory();
-    ~MixHistory();
-
-    // Returns true if the participant is being mixed.
-    bool IsMixed() const;
-
-    // Returns true if the participant was mixed previous mix
-    // iteration.
-    bool WasMixed() const;
-
-    // Updates the mixed status.
-    int32_t SetIsMixed(bool mixed);
-
-    void ResetMixedStatus();
-private:
-    bool _isMixed;
-};
-
-class AudioConferenceMixerImpl : public AudioConferenceMixer
-{
-public:
-    // AudioProcessing only accepts 10 ms frames.
-    enum {kProcessPeriodicityInMs = 10};
-
-    AudioConferenceMixerImpl(int id);
-    ~AudioConferenceMixerImpl();
-
-    // Must be called after ctor.
-    bool Init();
-
-    // Module functions
-    int64_t TimeUntilNextProcess() override;
-    void Process() override;
-
-    // AudioConferenceMixer functions
-    int32_t RegisterMixedStreamCallback(
-        AudioMixerOutputReceiver* mixReceiver) override;
-    int32_t UnRegisterMixedStreamCallback() override;
-    int32_t SetMixabilityStatus(MixerParticipant* participant,
-                                bool mixable) override;
-    bool MixabilityStatus(const MixerParticipant& participant) const override;
-    int32_t SetMinimumMixingFrequency(Frequency freq) override;
-    int32_t SetAnonymousMixabilityStatus(
-        MixerParticipant* participant, bool mixable) override;
-    bool AnonymousMixabilityStatus(
-        const MixerParticipant& participant) const override;
-
-private:
-    enum{DEFAULT_AUDIO_FRAME_POOLSIZE = 50};
-
-    // Set/get mix frequency
-    int32_t SetOutputFrequency(const Frequency& frequency);
-    Frequency OutputFrequency() const;
-
-    // Fills mixList with the AudioFrames pointers that should be used when
-    // mixing.
-    // maxAudioFrameCounter both input and output specifies how many more
-    // AudioFrames that are allowed to be mixed.
-    // rampOutList contain AudioFrames corresponding to an audio stream that
-    // used to be mixed but shouldn't be mixed any longer. These AudioFrames
-    // should be ramped out over this AudioFrame to avoid audio discontinuities.
-    void UpdateToMix(
-        AudioFrameList* mixList,
-        AudioFrameList* rampOutList,
-        std::map<int, MixerParticipant*>* mixParticipantList,
-        size_t* maxAudioFrameCounter) const;
-
-    // Return the lowest mixing frequency that can be used without having to
-    // downsample any audio.
-    int32_t GetLowestMixingFrequency() const;
-    int32_t GetLowestMixingFrequencyFromList(
-        const MixerParticipantList& mixList) const;
-
-    // Return the AudioFrames that should be mixed anonymously.
-    void GetAdditionalAudio(AudioFrameList* additionalFramesList) const;
-
-    // Update the MixHistory of all MixerParticipants. mixedParticipantsList
-    // should contain a map of MixerParticipants that have been mixed.
-    void UpdateMixedStatus(
-        const std::map<int, MixerParticipant*>& mixedParticipantsList) const;
-
-    // Clears audioFrameList and reclaims all memory associated with it.
-    void ClearAudioFrameList(AudioFrameList* audioFrameList) const;
-
-    // This function returns true if it finds the MixerParticipant in the
-    // specified list of MixerParticipants.
-    bool IsParticipantInList(const MixerParticipant& participant,
-                             const MixerParticipantList& participantList) const;
-
-    // Add/remove the MixerParticipant to the specified
-    // MixerParticipant list.
-    bool AddParticipantToList(
-        MixerParticipant* participant,
-        MixerParticipantList* participantList) const;
-    bool RemoveParticipantFromList(
-        MixerParticipant* removeParticipant,
-        MixerParticipantList* participantList) const;
-
-    // Mix the AudioFrames stored in audioFrameList into mixedAudio.
-    int32_t MixFromList(AudioFrame* mixedAudio,
-                        const AudioFrameList& audioFrameList) const;
-
-    // Mix the AudioFrames stored in audioFrameList into mixedAudio. No
-    // record will be kept of this mix (e.g. the corresponding MixerParticipants
-    // will not be marked as IsMixed()
-    int32_t MixAnonomouslyFromList(AudioFrame* mixedAudio,
-                                   const AudioFrameList& audioFrameList) const;
-
-    bool LimitMixedAudio(AudioFrame* mixedAudio) const;
-
-    rtc::CriticalSection _crit;
-    rtc::CriticalSection _cbCrit;
-
-    int32_t _id;
-
-    Frequency _minimumMixingFreq;
-
-    // Mix result callback
-    AudioMixerOutputReceiver* _mixReceiver;
-
-    // The current sample frequency and sample size when mixing.
-    Frequency _outputFrequency;
-    size_t _sampleSize;
-
-    // Memory pool to avoid allocating/deallocating AudioFrames
-    MemoryPool<AudioFrame>* _audioFramePool;
-
-    // List of all participants. Note all lists are disjunct
-    MixerParticipantList _participantList;              // May be mixed.
-    // Always mixed, anonomously.
-    MixerParticipantList _additionalParticipantList;
-
-    size_t _numMixedParticipants;
-    // Determines if we will use a limiter for clipping protection during
-    // mixing.
-    bool use_limiter_;
-
-    uint32_t _timeStamp;
-
-    // Metronome class.
-    TimeScheduler _timeScheduler;
-
-    // Counter keeping track of concurrent calls to process.
-    // Note: should never be higher than 1 or lower than 0.
-    int16_t _processCalls;
-
-    // Used for inhibiting saturation in mixing.
-    std::unique_ptr<AudioProcessing> _limiter;
-};
-}  // namespace webrtc
-
-#endif // WEBRTC_MODULES_AUDIO_CONFERENCE_MIXER_SOURCE_AUDIO_CONFERENCE_MIXER_IMPL_H_
diff --git a/modules/audio_conference_mixer/source/audio_frame_manipulator.cc b/modules/audio_conference_mixer/source/audio_frame_manipulator.cc
deleted file mode 100644
index 8e7351d..0000000
--- a/modules/audio_conference_mixer/source/audio_frame_manipulator.cc
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- *  Copyright (c) 2012 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_conference_mixer/source/audio_frame_manipulator.h"
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/typedefs.h"
-
-namespace {
-// Linear ramping over 80 samples.
-// TODO(hellner): ramp using fix point?
-const float rampArray[] = {0.0000f, 0.0127f, 0.0253f, 0.0380f,
-                           0.0506f, 0.0633f, 0.0759f, 0.0886f,
-                           0.1013f, 0.1139f, 0.1266f, 0.1392f,
-                           0.1519f, 0.1646f, 0.1772f, 0.1899f,
-                           0.2025f, 0.2152f, 0.2278f, 0.2405f,
-                           0.2532f, 0.2658f, 0.2785f, 0.2911f,
-                           0.3038f, 0.3165f, 0.3291f, 0.3418f,
-                           0.3544f, 0.3671f, 0.3797f, 0.3924f,
-                           0.4051f, 0.4177f, 0.4304f, 0.4430f,
-                           0.4557f, 0.4684f, 0.4810f, 0.4937f,
-                           0.5063f, 0.5190f, 0.5316f, 0.5443f,
-                           0.5570f, 0.5696f, 0.5823f, 0.5949f,
-                           0.6076f, 0.6203f, 0.6329f, 0.6456f,
-                           0.6582f, 0.6709f, 0.6835f, 0.6962f,
-                           0.7089f, 0.7215f, 0.7342f, 0.7468f,
-                           0.7595f, 0.7722f, 0.7848f, 0.7975f,
-                           0.8101f, 0.8228f, 0.8354f, 0.8481f,
-                           0.8608f, 0.8734f, 0.8861f, 0.8987f,
-                           0.9114f, 0.9241f, 0.9367f, 0.9494f,
-                           0.9620f, 0.9747f, 0.9873f, 1.0000f};
-const size_t rampSize = sizeof(rampArray)/sizeof(rampArray[0]);
-}  // namespace
-
-namespace webrtc {
-uint32_t CalculateEnergy(const AudioFrame& audioFrame)
-{
-    if (audioFrame.muted()) return 0;
-
-    uint32_t energy = 0;
-    const int16_t* frame_data = audioFrame.data();
-    for(size_t position = 0; position < audioFrame.samples_per_channel_;
-        position++)
-    {
-        // TODO(andrew): this can easily overflow.
-        energy += frame_data[position] * frame_data[position];
-    }
-    return energy;
-}
-
-void RampIn(AudioFrame& audioFrame)
-{
-    assert(rampSize <= audioFrame.samples_per_channel_);
-    if (audioFrame.muted()) return;
-
-    int16_t* frame_data = audioFrame.mutable_data();
-    for(size_t i = 0; i < rampSize; i++)
-    {
-        frame_data[i] = static_cast<int16_t>(rampArray[i] * frame_data[i]);
-    }
-}
-
-void RampOut(AudioFrame& audioFrame)
-{
-    assert(rampSize <= audioFrame.samples_per_channel_);
-    if (audioFrame.muted()) return;
-
-    int16_t* frame_data = audioFrame.mutable_data();
-    for(size_t i = 0; i < rampSize; i++)
-    {
-        const size_t rampPos = rampSize - 1 - i;
-        frame_data[i] = static_cast<int16_t>(rampArray[rampPos] *
-                                             frame_data[i]);
-    }
-    memset(&frame_data[rampSize], 0,
-           (audioFrame.samples_per_channel_ - rampSize) *
-           sizeof(frame_data[0]));
-}
-}  // namespace webrtc
diff --git a/modules/audio_conference_mixer/source/audio_frame_manipulator.h b/modules/audio_conference_mixer/source/audio_frame_manipulator.h
deleted file mode 100644
index c136597..0000000
--- a/modules/audio_conference_mixer/source/audio_frame_manipulator.h
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- *  Copyright (c) 2011 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_CONFERENCE_MIXER_SOURCE_AUDIO_FRAME_MANIPULATOR_H_
-#define WEBRTC_MODULES_AUDIO_CONFERENCE_MIXER_SOURCE_AUDIO_FRAME_MANIPULATOR_H_
-
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-class AudioFrame;
-
-// Updates the audioFrame's energy (based on its samples).
-uint32_t CalculateEnergy(const AudioFrame& audioFrame);
-
-// Apply linear step function that ramps in/out the audio samples in audioFrame
-void RampIn(AudioFrame& audioFrame);
-void RampOut(AudioFrame& audioFrame);
-
-}  // namespace webrtc
-
-#endif // WEBRTC_MODULES_AUDIO_CONFERENCE_MIXER_SOURCE_AUDIO_FRAME_MANIPULATOR_H_
diff --git a/modules/audio_conference_mixer/source/memory_pool.h b/modules/audio_conference_mixer/source/memory_pool.h
deleted file mode 100644
index c0a8131..0000000
--- a/modules/audio_conference_mixer/source/memory_pool.h
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- *  Copyright (c) 2011 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_CONFERENCE_MIXER_SOURCE_MEMORY_POOL_H_
-#define WEBRTC_MODULES_AUDIO_CONFERENCE_MIXER_SOURCE_MEMORY_POOL_H_
-
-#include <assert.h>
-
-#include "webrtc/typedefs.h"
-
-#ifdef _WIN32
-#include "webrtc/modules/audio_conference_mixer/source/memory_pool_win.h"
-#else
-#include "webrtc/modules/audio_conference_mixer/source/memory_pool_posix.h"
-#endif
-
-namespace webrtc {
-
-template<class MemoryType>
-class MemoryPool
-{
-public:
-    // Factory method, constructor disabled.
-    static int32_t CreateMemoryPool(MemoryPool*& memoryPool,
-                                    uint32_t initialPoolSize);
-
-    // Try to delete the memory pool. Fail with return value -1 if there is
-    // outstanding memory.
-    static int32_t DeleteMemoryPool(
-        MemoryPool*& memoryPool);
-
-    // Get/return unused memory.
-    int32_t PopMemory(MemoryType*&  memory);
-    int32_t PushMemory(MemoryType*& memory);
-private:
-    MemoryPool(int32_t initialPoolSize);
-    ~MemoryPool();
-
-    MemoryPoolImpl<MemoryType>* _ptrImpl;
-};
-
-template<class MemoryType>
-MemoryPool<MemoryType>::MemoryPool(int32_t initialPoolSize)
-{
-    _ptrImpl = new MemoryPoolImpl<MemoryType>(initialPoolSize);
-}
-
-template<class MemoryType>
-MemoryPool<MemoryType>::~MemoryPool()
-{
-    delete _ptrImpl;
-}
-
-template<class MemoryType> int32_t
-MemoryPool<MemoryType>::CreateMemoryPool(MemoryPool*&   memoryPool,
-                                         uint32_t initialPoolSize)
-{
-    memoryPool = new MemoryPool(initialPoolSize);
-    if(memoryPool == NULL)
-    {
-        return -1;
-    }
-    if(memoryPool->_ptrImpl == NULL)
-    {
-        delete memoryPool;
-        memoryPool = NULL;
-        return -1;
-    }
-    if(!memoryPool->_ptrImpl->Initialize())
-    {
-        delete memoryPool;
-        memoryPool = NULL;
-        return -1;
-    }
-    return 0;
-}
-
-template<class MemoryType>
-int32_t MemoryPool<MemoryType>::DeleteMemoryPool(MemoryPool*& memoryPool)
-{
-    if(memoryPool == NULL)
-    {
-        return -1;
-    }
-    if(memoryPool->_ptrImpl == NULL)
-    {
-        return -1;
-    }
-    if(memoryPool->_ptrImpl->Terminate() == -1)
-    {
-        return -1;
-    }
-    delete memoryPool;
-    memoryPool = NULL;
-    return 0;
-}
-
-template<class MemoryType>
-int32_t MemoryPool<MemoryType>::PopMemory(MemoryType*& memory)
-{
-    return _ptrImpl->PopMemory(memory);
-}
-
-template<class MemoryType>
-int32_t MemoryPool<MemoryType>::PushMemory(MemoryType*& memory)
-{
-    if(memory == NULL)
-    {
-        return -1;
-    }
-    return _ptrImpl->PushMemory(memory);
-}
-}  // namespace webrtc
-
-#endif // WEBRTC_MODULES_AUDIO_CONFERENCE_MIXER_SOURCE_MEMORY_POOL_H_
diff --git a/modules/audio_conference_mixer/source/memory_pool_posix.h b/modules/audio_conference_mixer/source/memory_pool_posix.h
deleted file mode 100644
index 695878d..0000000
--- a/modules/audio_conference_mixer/source/memory_pool_posix.h
+++ /dev/null
@@ -1,156 +0,0 @@
-/*
- *  Copyright (c) 2011 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_CONFERENCE_MIXER_SOURCE_MEMORY_POOL_GENERIC_H_
-#define WEBRTC_MODULES_AUDIO_CONFERENCE_MIXER_SOURCE_MEMORY_POOL_GENERIC_H_
-
-#include <assert.h>
-#include <list>
-
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-template<class MemoryType>
-class MemoryPoolImpl
-{
-public:
-    // MemoryPool functions.
-    int32_t PopMemory(MemoryType*&  memory);
-    int32_t PushMemory(MemoryType*& memory);
-
-    MemoryPoolImpl(int32_t initialPoolSize);
-    ~MemoryPoolImpl();
-
-    // Atomic functions
-    int32_t Terminate();
-    bool Initialize();
-private:
-    // Non-atomic function.
-    int32_t CreateMemory(uint32_t amountToCreate);
-
-    rtc::CriticalSection _crit;
-
-    bool _terminate;
-
-    std::list<MemoryType*> _memoryPool;
-
-    uint32_t _initialPoolSize;
-    uint32_t _createdMemory;
-    uint32_t _outstandingMemory;
-};
-
-template<class MemoryType>
-MemoryPoolImpl<MemoryType>::MemoryPoolImpl(int32_t initialPoolSize)
-    : _terminate(false),
-      _initialPoolSize(initialPoolSize),
-      _createdMemory(0),
-      _outstandingMemory(0)
-{
-}
-
-template<class MemoryType>
-MemoryPoolImpl<MemoryType>::~MemoryPoolImpl()
-{
-    // Trigger assert if there is outstanding memory.
-    assert(_createdMemory == 0);
-    assert(_outstandingMemory == 0);
-}
-
-template<class MemoryType>
-int32_t MemoryPoolImpl<MemoryType>::PopMemory(MemoryType*& memory)
-{
-    rtc::CritScope cs(&_crit);
-    if(_terminate)
-    {
-        memory = NULL;
-        return -1;
-    }
-    if (_memoryPool.empty()) {
-        // _memoryPool empty create new memory.
-        CreateMemory(_initialPoolSize);
-        if(_memoryPool.empty())
-        {
-            memory = NULL;
-            return -1;
-        }
-    }
-    memory = _memoryPool.front();
-    _memoryPool.pop_front();
-    _outstandingMemory++;
-    return 0;
-}
-
-template<class MemoryType>
-int32_t MemoryPoolImpl<MemoryType>::PushMemory(MemoryType*& memory)
-{
-    if(memory == NULL)
-    {
-        return -1;
-    }
-    rtc::CritScope cs(&_crit);
-    _outstandingMemory--;
-    if(_memoryPool.size() > (_initialPoolSize << 1))
-    {
-        // Reclaim memory if less than half of the pool is unused.
-        _createdMemory--;
-        delete memory;
-        memory = NULL;
-        return 0;
-    }
-    _memoryPool.push_back(memory);
-    memory = NULL;
-    return 0;
-}
-
-template<class MemoryType>
-bool MemoryPoolImpl<MemoryType>::Initialize()
-{
-    rtc::CritScope cs(&_crit);
-    return CreateMemory(_initialPoolSize) == 0;
-}
-
-template<class MemoryType>
-int32_t MemoryPoolImpl<MemoryType>::Terminate()
-{
-    rtc::CritScope cs(&_crit);
-    assert(_createdMemory == _outstandingMemory + _memoryPool.size());
-
-    _terminate = true;
-    // Reclaim all memory.
-    while(_createdMemory > 0)
-    {
-        MemoryType* memory = _memoryPool.front();
-        _memoryPool.pop_front();
-        delete memory;
-        _createdMemory--;
-    }
-    return 0;
-}
-
-template<class MemoryType>
-int32_t MemoryPoolImpl<MemoryType>::CreateMemory(
-    uint32_t amountToCreate)
-{
-    for(uint32_t i = 0; i < amountToCreate; i++)
-    {
-        MemoryType* memory = new MemoryType();
-        if(memory == NULL)
-        {
-            return -1;
-        }
-        _memoryPool.push_back(memory);
-        _createdMemory++;
-    }
-    return 0;
-}
-}  // namespace webrtc
-
-#endif // WEBRTC_MODULES_AUDIO_CONFERENCE_MIXER_SOURCE_MEMORY_POOL_GENERIC_H_
diff --git a/modules/audio_conference_mixer/source/memory_pool_win.h b/modules/audio_conference_mixer/source/memory_pool_win.h
deleted file mode 100644
index 3ec9187..0000000
--- a/modules/audio_conference_mixer/source/memory_pool_win.h
+++ /dev/null
@@ -1,199 +0,0 @@
-/*
- *  Copyright (c) 2012 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_CONFERENCE_MIXER_SOURCE_MEMORY_POOL_WINDOWS_H_
-#define WEBRTC_MODULES_AUDIO_CONFERENCE_MIXER_SOURCE_MEMORY_POOL_WINDOWS_H_
-
-#include <assert.h>
-#include <windows.h>
-
-#include "webrtc/system_wrappers/include/aligned_malloc.h"
-#include "webrtc/system_wrappers/include/atomic32.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-template<class MemoryType> struct MemoryPoolItem;
-
-template<class MemoryType>
-struct MemoryPoolItemPayload
-{
-    MemoryPoolItemPayload()
-        : memoryType(),
-          base(NULL)
-    {
-    }
-    MemoryType                  memoryType;
-    MemoryPoolItem<MemoryType>* base;
-};
-
-template<class MemoryType>
-struct MemoryPoolItem
-{
-    // Atomic single linked list entry header.
-    SLIST_ENTRY itemEntry;
-    // Atomic single linked list payload.
-    MemoryPoolItemPayload<MemoryType>* payload;
-};
-
-template<class MemoryType>
-class MemoryPoolImpl
-{
-public:
-    // MemoryPool functions.
-    int32_t PopMemory(MemoryType*&  memory);
-    int32_t PushMemory(MemoryType*& memory);
-
-    MemoryPoolImpl(int32_t /*initialPoolSize*/);
-    ~MemoryPoolImpl();
-
-    // Atomic functions.
-    int32_t Terminate();
-    bool Initialize();
-private:
-    // Non-atomic function.
-    MemoryPoolItem<MemoryType>* CreateMemory();
-
-    // Windows implementation of single linked atomic list, documented here:
-    // http://msdn.microsoft.com/en-us/library/ms686962(VS.85).aspx
-
-    // Atomic single linked list head.
-    PSLIST_HEADER _pListHead;
-
-    Atomic32 _createdMemory;
-    Atomic32 _outstandingMemory;
-};
-
-template<class MemoryType>
-MemoryPoolImpl<MemoryType>::MemoryPoolImpl(
-    int32_t /*initialPoolSize*/)
-    : _pListHead(NULL),
-      _createdMemory(0),
-      _outstandingMemory(0)
-{
-}
-
-template<class MemoryType>
-MemoryPoolImpl<MemoryType>::~MemoryPoolImpl()
-{
-    Terminate();
-    if(_pListHead != NULL)
-    {
-        AlignedFree(reinterpret_cast<void*>(_pListHead));
-        _pListHead = NULL;
-    }
-    // Trigger assert if there is outstanding memory.
-    assert(_createdMemory.Value() == 0);
-    assert(_outstandingMemory.Value() == 0);
-}
-
-template<class MemoryType>
-int32_t MemoryPoolImpl<MemoryType>::PopMemory(MemoryType*& memory)
-{
-    PSLIST_ENTRY pListEntry = InterlockedPopEntrySList(_pListHead);
-    if(pListEntry == NULL)
-    {
-        MemoryPoolItem<MemoryType>* item = CreateMemory();
-        if(item == NULL)
-        {
-            return -1;
-        }
-        pListEntry = &(item->itemEntry);
-    }
-    ++_outstandingMemory;
-    memory = &((MemoryPoolItem<MemoryType>*)pListEntry)->payload->memoryType;
-    return 0;
-}
-
-template<class MemoryType>
-int32_t MemoryPoolImpl<MemoryType>::PushMemory(MemoryType*& memory)
-{
-    if(memory == NULL)
-    {
-        return -1;
-    }
-
-    MemoryPoolItem<MemoryType>* item =
-        ((MemoryPoolItemPayload<MemoryType>*)memory)->base;
-
-    const int32_t usedItems  = --_outstandingMemory;
-    const int32_t totalItems = _createdMemory.Value();
-    const int32_t freeItems  = totalItems - usedItems;
-    if(freeItems < 0)
-    {
-        assert(false);
-        delete item->payload;
-        AlignedFree(item);
-        return -1;
-    }
-    if(freeItems >= totalItems>>1)
-    {
-        delete item->payload;
-        AlignedFree(item);
-        --_createdMemory;
-        return 0;
-    }
-    InterlockedPushEntrySList(_pListHead,&(item->itemEntry));
-    return 0;
-}
-
-template<class MemoryType>
-bool MemoryPoolImpl<MemoryType>::Initialize()
-{
-    _pListHead = (PSLIST_HEADER)AlignedMalloc(sizeof(SLIST_HEADER),
-                                              MEMORY_ALLOCATION_ALIGNMENT);
-    if(_pListHead == NULL)
-    {
-        return false;
-    }
-    InitializeSListHead(_pListHead);
-    return true;
-}
-
-template<class MemoryType>
-int32_t MemoryPoolImpl<MemoryType>::Terminate()
-{
-    int32_t itemsFreed = 0;
-    PSLIST_ENTRY pListEntry = InterlockedPopEntrySList(_pListHead);
-    while(pListEntry != NULL)
-    {
-        MemoryPoolItem<MemoryType>* item = ((MemoryPoolItem<MemoryType>*)pListEntry);
-        delete item->payload;
-        AlignedFree(item);
-        --_createdMemory;
-        itemsFreed++;
-        pListEntry = InterlockedPopEntrySList(_pListHead);
-    }
-    return itemsFreed;
-}
-
-template<class MemoryType>
-MemoryPoolItem<MemoryType>* MemoryPoolImpl<MemoryType>::CreateMemory()
-{
-    MemoryPoolItem<MemoryType>* returnValue = (MemoryPoolItem<MemoryType>*)
-        AlignedMalloc(sizeof(MemoryPoolItem<MemoryType>),
-                      MEMORY_ALLOCATION_ALIGNMENT);
-    if(returnValue == NULL)
-    {
-        return NULL;
-    }
-
-    returnValue->payload = new MemoryPoolItemPayload<MemoryType>();
-    if(returnValue->payload == NULL)
-    {
-        delete returnValue;
-        return NULL;
-    }
-    returnValue->payload->base = returnValue;
-    ++_createdMemory;
-    return returnValue;
-}
-}  // namespace webrtc
-
-#endif // WEBRTC_MODULES_AUDIO_CONFERENCE_MIXER_SOURCE_MEMORY_POOL_WINDOWS_H_
diff --git a/modules/audio_conference_mixer/source/time_scheduler.cc b/modules/audio_conference_mixer/source/time_scheduler.cc
deleted file mode 100644
index 5600e0c..0000000
--- a/modules/audio_conference_mixer/source/time_scheduler.cc
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- *  Copyright (c) 2011 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_conference_mixer/source/time_scheduler.h"
-#include "webrtc/rtc_base/timeutils.h"
-
-namespace webrtc {
-TimeScheduler::TimeScheduler(const int64_t periodicityInMs)
-    : _isStarted(false),
-      _lastPeriodMark(),
-      _periodicityInMs(periodicityInMs),
-      _periodicityInTicks(periodicityInMs * rtc::kNumNanosecsPerMillisec),
-      _missedPeriods(0) {}
-
-int32_t TimeScheduler::UpdateScheduler() {
-    rtc::CritScope cs(&_crit);
-    if(!_isStarted)
-    {
-        _isStarted = true;
-        _lastPeriodMark = rtc::TimeNanos();
-        return 0;
-    }
-    // Don't perform any calculations until the debt of pending periods have
-    // been worked off.
-    if(_missedPeriods > 0)
-    {
-        _missedPeriods--;
-        return 0;
-    }
-
-    // Calculate the time that has past since previous call to this function.
-    int64_t tickNow = rtc::TimeNanos();
-    int64_t amassedTicks = tickNow - _lastPeriodMark;
-    int64_t amassedMs = amassedTicks / rtc::kNumNanosecsPerMillisec;
-
-    // Calculate the number of periods the time that has passed correspond to.
-    int64_t periodsToClaim = amassedMs / _periodicityInMs;
-
-    // One period will be worked off by this call. Make sure that the number of
-    // pending periods don't end up being negative (e.g. if this function is
-    // called to often).
-    if(periodsToClaim < 1)
-    {
-        periodsToClaim = 1;
-    }
-
-    // Update the last period mark without introducing any drifting.
-    // Note that if this fuunction is called to often _lastPeriodMark can
-    // refer to a time in the future which in turn will yield TimeToNextUpdate
-    // that is greater than the periodicity
-    for(int64_t i = 0; i < periodsToClaim; i++)
-    {
-        _lastPeriodMark += _periodicityInTicks;
-    }
-
-    // Update the total amount of missed periods note that we have processed
-    // one period hence the - 1
-    _missedPeriods += periodsToClaim - 1;
-    return 0;
-}
-
-int32_t TimeScheduler::TimeToNextUpdate(
-    int64_t& updateTimeInMS) const
-{
-    rtc::CritScope cs(&_crit);
-    // Missed periods means that the next UpdateScheduler() should happen
-    // immediately.
-    if(_missedPeriods > 0)
-    {
-        updateTimeInMS = 0;
-        return 0;
-    }
-
-    // Calculate the time (in ms) that has past since last call to
-    // UpdateScheduler()
-    int64_t tickNow = rtc::TimeNanos();
-    int64_t ticksSinceLastUpdate = tickNow - _lastPeriodMark;
-    const int64_t millisecondsSinceLastUpdate =
-      ticksSinceLastUpdate / rtc::kNumNanosecsPerMillisec;
-
-    updateTimeInMS = _periodicityInMs - millisecondsSinceLastUpdate;
-    updateTimeInMS =  (updateTimeInMS < 0) ? 0 : updateTimeInMS;
-    return 0;
-}
-}  // namespace webrtc
diff --git a/modules/audio_conference_mixer/source/time_scheduler.h b/modules/audio_conference_mixer/source/time_scheduler.h
deleted file mode 100644
index e3531c4..0000000
--- a/modules/audio_conference_mixer/source/time_scheduler.h
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-// The TimeScheduler class keeps track of periodic events. It is non-drifting
-// and keeps track of any missed periods so that it is possible to catch up.
-// (compare to a metronome)
-#include "webrtc/rtc_base/criticalsection.h"
-
-#ifndef WEBRTC_MODULES_AUDIO_CONFERENCE_MIXER_SOURCE_TIME_SCHEDULER_H_
-#define WEBRTC_MODULES_AUDIO_CONFERENCE_MIXER_SOURCE_TIME_SCHEDULER_H_
-
-namespace webrtc {
-
-class TimeScheduler {
-public:
-    TimeScheduler(const int64_t periodicityInMs);
-    ~TimeScheduler() = default;
-
-    // Signal that a periodic event has been triggered.
-    int32_t UpdateScheduler();
-
-    // Set updateTimeInMs to the amount of time until UpdateScheduler() should
-    // be called. This time will never be negative.
-    int32_t TimeToNextUpdate(int64_t& updateTimeInMS) const;
-
-private:
-    rtc::CriticalSection _crit;
-
-    bool _isStarted;
-    int64_t _lastPeriodMark; // In ns
-
-    int64_t _periodicityInMs;
-    int64_t _periodicityInTicks;
-    uint32_t _missedPeriods;
-};
-}  // namespace webrtc
-
-#endif // WEBRTC_MODULES_AUDIO_CONFERENCE_MIXER_SOURCE_TIME_SCHEDULER_H_
diff --git a/modules/audio_conference_mixer/test/audio_conference_mixer_unittest.cc b/modules/audio_conference_mixer/test/audio_conference_mixer_unittest.cc
deleted file mode 100644
index ce18d91..0000000
--- a/modules/audio_conference_mixer/test/audio_conference_mixer_unittest.cc
+++ /dev/null
@@ -1,166 +0,0 @@
-/*
- *  Copyright (c) 2015 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 <memory>
-
-#include "webrtc/modules/audio_conference_mixer/include/audio_conference_mixer.h"
-#include "webrtc/modules/audio_conference_mixer/include/audio_conference_mixer_defines.h"
-#include "webrtc/test/gmock.h"
-
-namespace webrtc {
-
-using testing::_;
-using testing::AtLeast;
-using testing::Invoke;
-using testing::Return;
-
-class MockAudioMixerOutputReceiver : public AudioMixerOutputReceiver {
- public:
-  MOCK_METHOD4(NewMixedAudio, void(const int32_t id,
-                                   const AudioFrame& general_audio_frame,
-                                   const AudioFrame** unique_audio_frames,
-                                   const uint32_t size));
-};
-
-class MockMixerParticipant : public MixerParticipant {
- public:
-  MockMixerParticipant() {
-    ON_CALL(*this, GetAudioFrame(_, _))
-        .WillByDefault(Invoke(this, &MockMixerParticipant::FakeAudioFrame));
-  }
-  MOCK_METHOD2(GetAudioFrame,
-               int32_t(const int32_t id, AudioFrame* audio_frame));
-  MOCK_CONST_METHOD1(NeededFrequency, int32_t(const int32_t id));
-  AudioFrame* fake_frame() { return &fake_frame_; }
-
- private:
-  AudioFrame fake_frame_;
-  int32_t FakeAudioFrame(const int32_t id, AudioFrame* audio_frame) {
-    audio_frame->CopyFrom(fake_frame_);
-    return 0;
-  }
-};
-
-TEST(AudioConferenceMixer, AnonymousAndNamed) {
-  const int kId = 1;
-  // Should not matter even if partipants are more than
-  // kMaximumAmountOfMixedParticipants.
-  const int kNamed =
-      AudioConferenceMixer::kMaximumAmountOfMixedParticipants + 1;
-  const int kAnonymous =
-      AudioConferenceMixer::kMaximumAmountOfMixedParticipants + 1;
-
-  std::unique_ptr<AudioConferenceMixer> mixer(
-      AudioConferenceMixer::Create(kId));
-
-  MockMixerParticipant named[kNamed];
-  MockMixerParticipant anonymous[kAnonymous];
-
-  for (int i = 0; i < kNamed; ++i) {
-    EXPECT_EQ(0, mixer->SetMixabilityStatus(&named[i], true));
-    EXPECT_TRUE(mixer->MixabilityStatus(named[i]));
-  }
-
-  for (int i = 0; i < kAnonymous; ++i) {
-    // Participant must be registered before turning it into anonymous.
-    EXPECT_EQ(-1, mixer->SetAnonymousMixabilityStatus(&anonymous[i], true));
-    EXPECT_EQ(0, mixer->SetMixabilityStatus(&anonymous[i], true));
-    EXPECT_TRUE(mixer->MixabilityStatus(anonymous[i]));
-    EXPECT_FALSE(mixer->AnonymousMixabilityStatus(anonymous[i]));
-
-    EXPECT_EQ(0, mixer->SetAnonymousMixabilityStatus(&anonymous[i], true));
-    EXPECT_TRUE(mixer->AnonymousMixabilityStatus(anonymous[i]));
-
-    // Anonymous participants do not show status by MixabilityStatus.
-    EXPECT_FALSE(mixer->MixabilityStatus(anonymous[i]));
-  }
-
-  for (int i = 0; i < kNamed; ++i) {
-    EXPECT_EQ(0, mixer->SetMixabilityStatus(&named[i], false));
-    EXPECT_FALSE(mixer->MixabilityStatus(named[i]));
-  }
-
-  for (int i = 0; i < kAnonymous - 1; i++) {
-    EXPECT_EQ(0, mixer->SetAnonymousMixabilityStatus(&anonymous[i], false));
-    EXPECT_FALSE(mixer->AnonymousMixabilityStatus(anonymous[i]));
-
-    // SetAnonymousMixabilityStatus(anonymous, false) moves anonymous to the
-    // named group.
-    EXPECT_TRUE(mixer->MixabilityStatus(anonymous[i]));
-  }
-
-  // SetMixabilityStatus(anonymous, false) will remove anonymous from both
-  // anonymous and named groups.
-  EXPECT_EQ(0, mixer->SetMixabilityStatus(&anonymous[kAnonymous - 1], false));
-  EXPECT_FALSE(mixer->AnonymousMixabilityStatus(anonymous[kAnonymous - 1]));
-  EXPECT_FALSE(mixer->MixabilityStatus(anonymous[kAnonymous - 1]));
-}
-
-TEST(AudioConferenceMixer, LargestEnergyVadActiveMixed) {
-  const int kId = 1;
-  const int kParticipants =
-      AudioConferenceMixer::kMaximumAmountOfMixedParticipants + 3;
-  const int kSampleRateHz = 32000;
-
-  std::unique_ptr<AudioConferenceMixer> mixer(
-      AudioConferenceMixer::Create(kId));
-
-  MockAudioMixerOutputReceiver output_receiver;
-  EXPECT_EQ(0, mixer->RegisterMixedStreamCallback(&output_receiver));
-
-  MockMixerParticipant participants[kParticipants];
-
-  for (int i = 0; i < kParticipants; ++i) {
-    participants[i].fake_frame()->id_ = i;
-    participants[i].fake_frame()->sample_rate_hz_ = kSampleRateHz;
-    participants[i].fake_frame()->speech_type_ =  AudioFrame::kNormalSpeech;
-    participants[i].fake_frame()->vad_activity_ = AudioFrame::kVadActive;
-    participants[i].fake_frame()->num_channels_ = 1;
-
-    // Frame duration 10ms.
-    participants[i].fake_frame()->samples_per_channel_ = kSampleRateHz / 100;
-
-    // We set the 80-th sample value since the first 80 samples may be
-    // modified by a ramped-in window.
-    participants[i].fake_frame()->mutable_data()[80] = i;
-
-    EXPECT_EQ(0, mixer->SetMixabilityStatus(&participants[i], true));
-    EXPECT_CALL(participants[i], GetAudioFrame(_, _))
-        .Times(AtLeast(1));
-    EXPECT_CALL(participants[i], NeededFrequency(_))
-        .WillRepeatedly(Return(kSampleRateHz));
-  }
-
-  // Last participant gives audio frame with passive VAD, although it has the
-  // largest energy.
-  participants[kParticipants - 1].fake_frame()->vad_activity_ =
-      AudioFrame::kVadPassive;
-
-  EXPECT_CALL(output_receiver, NewMixedAudio(_, _, _, _))
-      .Times(AtLeast(1));
-
-  mixer->Process();
-
-  for (int i = 0; i < kParticipants; ++i) {
-    bool is_mixed = participants[i].IsMixed();
-    if (i == kParticipants - 1 || i < kParticipants - 1 -
-        AudioConferenceMixer::kMaximumAmountOfMixedParticipants) {
-      EXPECT_FALSE(is_mixed) << "Mixing status of Participant #"
-                             << i << " wrong.";
-    } else {
-      EXPECT_TRUE(is_mixed) << "Mixing status of Participant #"
-                            << i << " wrong.";
-    }
-  }
-
-  EXPECT_EQ(0, mixer->UnRegisterMixedStreamCallback());
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_device/BUILD.gn b/modules/audio_device/BUILD.gn
deleted file mode 100644
index e50041f..0000000
--- a/modules/audio_device/BUILD.gn
+++ /dev/null
@@ -1,387 +0,0 @@
-# Copyright (c) 2014 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.
-
-import("../../webrtc.gni")
-
-if (is_android) {
-  import("//build/config/android/config.gni")
-  import("//build/config/android/rules.gni")
-}
-
-config("audio_device_config") {
-  include_dirs = [
-    "../include",
-    "include",
-    "dummy",  # Contains dummy audio device implementations.
-  ]
-}
-
-config("audio_device_warnings_config") {
-  if (is_win && is_clang) {
-    cflags = [
-      # Disable warnings failing when compiling with Clang on Windows.
-      # https://bugs.chromium.org/p/webrtc/issues/detail?id=5366
-      "-Wno-bool-conversion",
-      "-Wno-delete-non-virtual-dtor",
-      "-Wno-logical-op-parentheses",
-      "-Wno-microsoft-extra-qualification",
-      "-Wno-microsoft-goto",
-      "-Wno-missing-braces",
-      "-Wno-parentheses-equality",
-      "-Wno-reorder",
-      "-Wno-shift-overflow",
-      "-Wno-tautological-compare",
-
-      # See https://bugs.chromium.org/p/webrtc/issues/detail?id=6265
-      # for -Wno-thread-safety-analysis
-      "-Wno-thread-safety-analysis",
-      "-Wno-unused-private-field",
-    ]
-  }
-}
-
-rtc_source_set("audio_device") {
-  public_deps = [
-    ":audio_device_generic",
-  ]
-  if (rtc_include_internal_audio_device && is_ios) {
-    public_deps += [ ":audio_device_ios_objc" ]
-  }
-}
-
-if (rtc_include_internal_audio_device && is_ios) {
-  rtc_source_set("audio_device_ios_objc") {
-    visibility = [ ":audio_device" ]
-    sources = [
-      "ios/audio_device_ios.h",
-      "ios/audio_device_ios.mm",
-      "ios/audio_device_not_implemented_ios.mm",
-      "ios/audio_session_observer.h",
-      "ios/objc/RTCAudioSessionDelegateAdapter.h",
-      "ios/objc/RTCAudioSessionDelegateAdapter.mm",
-      "ios/voice_processing_audio_unit.h",
-      "ios/voice_processing_audio_unit.mm",
-    ]
-    libs = [
-      "AudioToolbox.framework",
-      "AVFoundation.framework",
-      "Foundation.framework",
-      "UIKit.framework",
-    ]
-    deps = [
-      ":audio_device_generic",
-      "../../api:array_view",
-      "../../rtc_base:gtest_prod",
-      "../../rtc_base:rtc_base",
-      "../../sdk:audio_objc",
-      "../../sdk:common_objc",
-      "../../system_wrappers:metrics_api",
-    ]
-    if (!build_with_chromium && is_clang) {
-      # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-    }
-  }
-}
-
-rtc_source_set("audio_device_generic") {
-  visibility = [
-    ":audio_device",
-    ":audio_device_ios_objc",
-  ]
-  public_configs = [ ":audio_device_config" ]
-
-  deps = [
-    "..:module_api",
-    "../..:webrtc_common",
-    "../../api:array_view",
-    "../../common_audio",
-    "../../rtc_base:rtc_base_approved",
-    "../../rtc_base:rtc_task_queue",
-    "../../system_wrappers",
-    "../utility",
-  ]
-
-  sources = [
-    "audio_device_buffer.cc",
-    "audio_device_buffer.h",
-    "audio_device_config.h",
-    "audio_device_generic.cc",
-    "audio_device_generic.h",
-    "dummy/audio_device_dummy.cc",
-    "dummy/audio_device_dummy.h",
-    "dummy/file_audio_device.cc",
-    "dummy/file_audio_device.h",
-    "fine_audio_buffer.cc",
-    "fine_audio_buffer.h",
-    "include/audio_device.h",
-    "include/audio_device_defines.h",
-  ]
-
-  include_dirs = []
-  if (is_linux) {
-    include_dirs += [ "linux" ]
-  }
-  if (is_ios) {
-    include_dirs += [ "ios" ]
-  }
-  if (is_mac) {
-    include_dirs += [ "mac" ]
-  }
-  if (is_win) {
-    include_dirs += [ "win" ]
-  }
-  if (is_android) {
-    include_dirs += [ "android" ]
-  }
-  defines = []
-  cflags = []
-  if (rtc_audio_device_plays_sinus_tone) {
-    defines += [ "AUDIO_DEVICE_PLAYS_SINUS_TONE" ]
-  }
-  if (rtc_include_internal_audio_device) {
-    sources += [
-      "audio_device_data_observer.cc",
-      "audio_device_impl.cc",
-      "audio_device_impl.h",
-      "include/audio_device_data_observer.h",
-    ]
-    if (is_android) {
-      sources += [
-        "android/audio_device_template.h",
-        "android/audio_manager.cc",
-        "android/audio_manager.h",
-        "android/audio_record_jni.cc",
-        "android/audio_record_jni.h",
-        "android/audio_track_jni.cc",
-        "android/audio_track_jni.h",
-        "android/build_info.cc",
-        "android/build_info.h",
-        "android/opensles_common.cc",
-        "android/opensles_common.h",
-        "android/opensles_player.cc",
-        "android/opensles_player.h",
-        "android/opensles_recorder.cc",
-        "android/opensles_recorder.h",
-      ]
-      libs = [
-        "log",
-        "OpenSLES",
-      ]
-    }
-    if (rtc_use_dummy_audio_file_devices) {
-      defines += [ "WEBRTC_DUMMY_FILE_DEVICES" ]
-    } else {
-      if (is_linux) {
-        sources += [
-          "linux/alsasymboltable_linux.cc",
-          "linux/alsasymboltable_linux.h",
-          "linux/audio_device_alsa_linux.cc",
-          "linux/audio_device_alsa_linux.h",
-          "linux/audio_mixer_manager_alsa_linux.cc",
-          "linux/audio_mixer_manager_alsa_linux.h",
-          "linux/latebindingsymboltable_linux.cc",
-          "linux/latebindingsymboltable_linux.h",
-        ]
-        defines += [ "LINUX_ALSA" ]
-        libs = [ "dl" ]
-        if (use_x11) {
-          libs += [ "X11" ]
-        }
-        if (rtc_include_pulse_audio) {
-          sources += [
-            "linux/audio_device_pulse_linux.cc",
-            "linux/audio_device_pulse_linux.h",
-            "linux/audio_mixer_manager_pulse_linux.cc",
-            "linux/audio_mixer_manager_pulse_linux.h",
-            "linux/pulseaudiosymboltable_linux.cc",
-            "linux/pulseaudiosymboltable_linux.h",
-          ]
-          defines += [ "LINUX_PULSE" ]
-        }
-      }
-      if (is_mac) {
-        sources += [
-          "mac/audio_device_mac.cc",
-          "mac/audio_device_mac.h",
-          "mac/audio_mixer_manager_mac.cc",
-          "mac/audio_mixer_manager_mac.h",
-        ]
-        deps += [ ":mac_portaudio" ]
-        libs = [
-          # Needed for CoreGraphics:
-          "ApplicationServices.framework",
-
-          "AudioToolbox.framework",
-          "CoreAudio.framework",
-
-          # Needed for CGEventSourceKeyState in audio_device_mac.cc:
-          "CoreGraphics.framework",
-        ]
-      }
-      if (is_win) {
-        sources += [
-          "win/audio_device_core_win.cc",
-          "win/audio_device_core_win.h",
-        ]
-        libs = [
-          # Required for the built-in WASAPI AEC.
-          "dmoguids.lib",
-          "wmcodecdspuuid.lib",
-          "amstrmid.lib",
-          "msdmo.lib",
-        ]
-      }
-      configs += [ ":audio_device_warnings_config" ]
-    }
-  } else {
-    defines = [ "WEBRTC_DUMMY_AUDIO_BUILD" ]
-  }
-
-  if (!build_with_chromium) {
-    sources += [
-      # Do not link these into Chrome since they contain static data.
-      "dummy/file_audio_device_factory.cc",
-      "dummy/file_audio_device_factory.h",
-    ]
-  }
-
-  if (!build_with_chromium && is_clang) {
-    # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-    suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-  }
-}
-
-rtc_source_set("mac_portaudio") {
-  visibility = [ ":*" ]  # Only targets in this file can depend on this.
-  sources = [
-    "mac/portaudio/pa_memorybarrier.h",
-    "mac/portaudio/pa_ringbuffer.c",
-    "mac/portaudio/pa_ringbuffer.h",
-  ]
-}
-
-config("mock_audio_device_config") {
-  if (is_win) {
-    cflags = [
-      # TODO(phoglund): get rid of 4373 supression when
-      # http://code.google.com/p/webrtc/issues/detail?id=261 is solved.
-      # legacy warning for ignoring const / volatile in signatures.
-      "/wd4373",
-    ]
-  }
-}
-
-rtc_source_set("mock_audio_device") {
-  testonly = true
-  sources = [
-    "include/mock_audio_device.h",
-    "include/mock_audio_transport.h",
-  ]
-  deps = [
-    ":audio_device",
-    "../../test:test_support",
-  ]
-  all_dependent_configs = [ ":mock_audio_device_config" ]
-}
-
-if (rtc_include_tests) {
-  # TODO(kthelgason): Reenable these tests on simulator.
-  # See bugs.webrtc.org/7812
-  if (is_ios && !use_ios_simulator) {
-    rtc_source_set("audio_device_ios_objc_unittests") {
-      testonly = true
-      visibility = [ ":*" ]
-      sources = [
-        "ios/audio_device_unittest_ios.mm",
-      ]
-      deps = [
-        ":audio_device",
-        ":mock_audio_device",
-        "../../rtc_base:rtc_base_approved",
-        "../../sdk:audio_objc",
-        "../../system_wrappers",
-        "../../test:test_support",
-        "//testing/gmock",
-        "//third_party/ocmock",
-      ]
-      if (!build_with_chromium && is_clang) {
-        # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-        suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-      }
-    }
-  }
-
-  rtc_source_set("audio_device_unittests") {
-    testonly = true
-
-    # Skip restricting visibility on mobile platforms since the tests on those
-    # gets additional generated targets which would require many lines here to
-    # cover (which would be confusing to read and hard to maintain).
-    if (!is_android && !is_ios) {
-      visibility = [ "..:modules_unittests" ]
-    }
-    sources = [
-      "fine_audio_buffer_unittest.cc",
-    ]
-    deps = [
-      ":audio_device",
-      ":mock_audio_device",
-      "../../api:array_view",
-      "../../api:optional",
-      "../../rtc_base:rtc_base_approved",
-      "../../system_wrappers",
-      "../../test:test_support",
-      "../utility:utility",
-      "//testing/gmock",
-    ]
-    if (is_linux || is_mac || is_win) {
-      sources += [ "audio_device_unittest.cc" ]
-    }
-    if (is_android) {
-      # Need to disable error due to the line in
-      # base/android/jni_android.h triggering it:
-      # const BASE_EXPORT jobject GetApplicationContext()
-      # error: type qualifiers ignored on function return type
-      cflags = [ "-Wno-ignored-qualifiers" ]
-      sources += [
-        "android/audio_device_unittest.cc",
-        "android/audio_manager_unittest.cc",
-        "android/ensure_initialized.cc",
-        "android/ensure_initialized.h",
-      ]
-      deps += [
-        "../../../base",
-        "../../sdk/android:libjingle_peerconnection_java",
-      ]
-    }
-    if (!build_with_chromium && is_clang) {
-      # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-    }
-  }
-}
-
-if (!build_with_chromium && is_android) {
-  android_library("audio_device_java") {
-    java_files = [
-      "android/java/src/org/webrtc/voiceengine/BuildInfo.java",
-      "android/java/src/org/webrtc/voiceengine/WebRtcAudioEffects.java",
-      "android/java/src/org/webrtc/voiceengine/WebRtcAudioManager.java",
-      "android/java/src/org/webrtc/voiceengine/WebRtcAudioRecord.java",
-      "android/java/src/org/webrtc/voiceengine/WebRtcAudioTrack.java",
-      "android/java/src/org/webrtc/voiceengine/WebRtcAudioUtils.java",
-    ]
-    deps = [
-      "../../rtc_base:base_java",
-    ]
-
-    # TODO(sakal): Fix build hooks crbug.com/webrtc/8148
-    no_build_hooks = true
-  }
-}
diff --git a/modules/audio_device/DEPS b/modules/audio_device/DEPS
deleted file mode 100644
index 51e8957..0000000
--- a/modules/audio_device/DEPS
+++ /dev/null
@@ -1,31 +0,0 @@
-include_rules = [
-  "+webrtc/common_audio",
-  "+webrtc/system_wrappers",
-]
-
-specific_include_rules = {
-  "ensure_initialized\.cc": [
-    "+base/android",
-  ],
-  "audio_device_ios\.h": [
-    "+webrtc/sdk/objc",
-  ],
-  "audio_device_ios\.mm": [
-    "+webrtc/sdk/objc",
-  ],
-  "audio_device_unittest_ios\.mm": [
-    "+webrtc/sdk/objc",
-  ],
-  "RTCAudioSession\.h": [
-    "+webrtc/sdk/objc",
-  ],
-  "RTCAudioSessionConfiguration\.h": [
-    "+webrtc/sdk/objc",
-  ],
-  "RTCAudioSessionDelegateAdapter\.h": [
-    "+webrtc/sdk/objc",
-  ],
-  "voice_processing_audio_unit\.mm": [
-    "+webrtc/sdk/objc",
-  ],
-}
diff --git a/modules/audio_device/OWNERS b/modules/audio_device/OWNERS
deleted file mode 100644
index f216978..0000000
--- a/modules/audio_device/OWNERS
+++ /dev/null
@@ -1,9 +0,0 @@
-henrikg@webrtc.org
-henrika@webrtc.org
-niklas.enbom@webrtc.org
-tkchin@webrtc.org
-
-# These are for the common case of adding or renaming files. If you're doing
-# structural changes, please get a review from a reviewer in this file.
-per-file *.gn=*
-per-file *.gni=*
diff --git a/modules/audio_device/android/audio_common.h b/modules/audio_device/android/audio_common.h
deleted file mode 100644
index 5361865..0000000
--- a/modules/audio_device/android/audio_common.h
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- *  Copyright (c) 2013 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_DEVICE_ANDROID_AUDIO_COMMON_H_
-#define WEBRTC_MODULES_AUDIO_DEVICE_ANDROID_AUDIO_COMMON_H_
-
-namespace webrtc {
-
-const int kDefaultSampleRate = 44100;
-// Delay estimates for the two different supported modes. These values are based
-// on real-time round-trip delay estimates on a large set of devices and they
-// are lower bounds since the filter length is 128 ms, so the AEC works for
-// delays in the range [50, ~170] ms and [150, ~270] ms. Note that, in most
-// cases, the lowest delay estimate will not be utilized since devices that
-// support low-latency output audio often supports HW AEC as well.
-const int kLowLatencyModeDelayEstimateInMilliseconds = 50;
-const int kHighLatencyModeDelayEstimateInMilliseconds = 150;
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_DEVICE_ANDROID_AUDIO_COMMON_H_
diff --git a/modules/audio_device/android/audio_device_template.h b/modules/audio_device/android/audio_device_template.h
deleted file mode 100644
index 0970659..0000000
--- a/modules/audio_device/android/audio_device_template.h
+++ /dev/null
@@ -1,518 +0,0 @@
-/*
- *  Copyright (c) 2013 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_DEVICE_ANDROID_AUDIO_DEVICE_TEMPLATE_H_
-#define WEBRTC_MODULES_AUDIO_DEVICE_ANDROID_AUDIO_DEVICE_TEMPLATE_H_
-
-#include "webrtc/modules/audio_device/android/audio_manager.h"
-#include "webrtc/modules/audio_device/audio_device_generic.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/thread_checker.h"
-
-namespace webrtc {
-
-// InputType/OutputType can be any class that implements the capturing/rendering
-// part of the AudioDeviceGeneric API.
-// Construction and destruction must be done on one and the same thread. Each
-// internal implementation of InputType and OutputType will RTC_DCHECK if that
-// is not the case. All implemented methods must also be called on the same
-// thread. See comments in each InputType/OutputType class for more info.
-// It is possible to call the two static methods (SetAndroidAudioDeviceObjects
-// and ClearAndroidAudioDeviceObjects) from a different thread but both will
-// RTC_CHECK that the calling thread is attached to a Java VM.
-
-template <class InputType, class OutputType>
-class AudioDeviceTemplate : public AudioDeviceGeneric {
- public:
-  AudioDeviceTemplate(AudioDeviceModule::AudioLayer audio_layer,
-                      AudioManager* audio_manager)
-      : audio_layer_(audio_layer),
-        audio_manager_(audio_manager),
-        output_(audio_manager_),
-        input_(audio_manager_),
-        initialized_(false) {
-    LOG(INFO) << __FUNCTION__;
-    RTC_CHECK(audio_manager);
-    audio_manager_->SetActiveAudioLayer(audio_layer);
-  }
-
-  virtual ~AudioDeviceTemplate() { LOG(INFO) << __FUNCTION__; }
-
-  int32_t ActiveAudioLayer(
-      AudioDeviceModule::AudioLayer& audioLayer) const override {
-    LOG(INFO) << __FUNCTION__;
-    audioLayer = audio_layer_;
-    return 0;
-  }
-
-  InitStatus Init() override {
-    LOG(INFO) << __FUNCTION__;
-    RTC_DCHECK(thread_checker_.CalledOnValidThread());
-    RTC_DCHECK(!initialized_);
-    if (!audio_manager_->Init()) {
-      return InitStatus::OTHER_ERROR;
-    }
-    if (output_.Init() != 0) {
-      audio_manager_->Close();
-      return InitStatus::PLAYOUT_ERROR;
-    }
-    if (input_.Init() != 0) {
-      output_.Terminate();
-      audio_manager_->Close();
-      return InitStatus::RECORDING_ERROR;
-    }
-    initialized_ = true;
-    return InitStatus::OK;
-  }
-
-  int32_t Terminate() override {
-    LOG(INFO) << __FUNCTION__;
-    RTC_DCHECK(thread_checker_.CalledOnValidThread());
-    int32_t err = input_.Terminate();
-    err |= output_.Terminate();
-    err |= !audio_manager_->Close();
-    initialized_ = false;
-    RTC_DCHECK_EQ(err, 0);
-    return err;
-  }
-
-  bool Initialized() const override {
-    LOG(INFO) << __FUNCTION__;
-    RTC_DCHECK(thread_checker_.CalledOnValidThread());
-    return initialized_;
-  }
-
-  int16_t PlayoutDevices() override {
-    LOG(INFO) << __FUNCTION__;
-    return 1;
-  }
-
-  int16_t RecordingDevices() override {
-    LOG(INFO) << __FUNCTION__;
-    return 1;
-  }
-
-  int32_t PlayoutDeviceName(
-      uint16_t index,
-      char name[kAdmMaxDeviceNameSize],
-      char guid[kAdmMaxGuidSize]) override {
-    FATAL() << "Should never be called";
-    return -1;
-  }
-
-  int32_t RecordingDeviceName(
-      uint16_t index,
-      char name[kAdmMaxDeviceNameSize],
-      char guid[kAdmMaxGuidSize]) override {
-    FATAL() << "Should never be called";
-    return -1;
-  }
-
-  int32_t SetPlayoutDevice(uint16_t index) override {
-    // OK to use but it has no effect currently since device selection is
-    // done using Andoid APIs instead.
-    LOG(INFO) << __FUNCTION__;
-    return 0;
-  }
-
-  int32_t SetPlayoutDevice(
-      AudioDeviceModule::WindowsDeviceType device) override {
-    FATAL() << "Should never be called";
-    return -1;
-  }
-
-  int32_t SetRecordingDevice(uint16_t index) override {
-    // OK to use but it has no effect currently since device selection is
-    // done using Andoid APIs instead.
-    LOG(INFO) << __FUNCTION__;
-    return 0;
-  }
-
-  int32_t SetRecordingDevice(
-      AudioDeviceModule::WindowsDeviceType device) override {
-    FATAL() << "Should never be called";
-    return -1;
-  }
-
-  int32_t PlayoutIsAvailable(bool& available) override {
-    LOG(INFO) << __FUNCTION__;
-    available = true;
-    return 0;
-  }
-
-  int32_t InitPlayout() override {
-    LOG(INFO) << __FUNCTION__;
-    return output_.InitPlayout();
-  }
-
-  bool PlayoutIsInitialized() const override {
-    LOG(INFO) << __FUNCTION__;
-    return output_.PlayoutIsInitialized();
-  }
-
-  int32_t RecordingIsAvailable(bool& available) override {
-    LOG(INFO) << __FUNCTION__;
-    available = true;
-    return 0;
-  }
-
-  int32_t InitRecording() override {
-    LOG(INFO) << __FUNCTION__;
-    return input_.InitRecording();
-  }
-
-  bool RecordingIsInitialized() const override {
-    LOG(INFO) << __FUNCTION__;
-    return input_.RecordingIsInitialized();
-  }
-
-  int32_t StartPlayout() override {
-    LOG(INFO) << __FUNCTION__;
-    if (!audio_manager_->IsCommunicationModeEnabled()) {
-      LOG(WARNING)
-          << "The application should use MODE_IN_COMMUNICATION audio mode!";
-    }
-    return output_.StartPlayout();
-  }
-
-  int32_t StopPlayout() override {
-    // Avoid using audio manger (JNI/Java cost) if playout was inactive.
-    if (!Playing())
-      return 0;
-    LOG(INFO) << __FUNCTION__;
-    int32_t err = output_.StopPlayout();
-    return err;
-  }
-
-  bool Playing() const override {
-    LOG(INFO) << __FUNCTION__;
-    return output_.Playing();
-  }
-
-  int32_t StartRecording() override {
-    LOG(INFO) << __FUNCTION__;
-    if (!audio_manager_->IsCommunicationModeEnabled()) {
-      LOG(WARNING)
-          << "The application should use MODE_IN_COMMUNICATION audio mode!";
-    }
-    return input_.StartRecording();
-  }
-
-  int32_t StopRecording() override {
-    // Avoid using audio manger (JNI/Java cost) if recording was inactive.
-    LOG(INFO) << __FUNCTION__;
-    if (!Recording())
-      return 0;
-    int32_t err = input_.StopRecording();
-    return err;
-  }
-
-  bool Recording() const override {
-    return input_.Recording() ;
-  }
-
-  int32_t SetAGC(bool enable) override {
-    if (enable) {
-      FATAL() << "Should never be called";
-    }
-    return -1;
-  }
-
-  bool AGC() const override {
-    LOG(INFO) << __FUNCTION__;
-    return false;
-  }
-
-  int32_t InitSpeaker() override {
-    LOG(INFO) << __FUNCTION__;
-    return 0;
-  }
-
-  bool SpeakerIsInitialized() const override {
-    LOG(INFO) << __FUNCTION__;
-    return true;
-  }
-
-  int32_t InitMicrophone() override {
-    LOG(INFO) << __FUNCTION__;
-    return 0;
-  }
-
-  bool MicrophoneIsInitialized() const override {
-    LOG(INFO) << __FUNCTION__;
-    return true;
-  }
-
-  int32_t SpeakerVolumeIsAvailable(bool& available) override {
-    LOG(INFO) << __FUNCTION__;
-    return output_.SpeakerVolumeIsAvailable(available);
-  }
-
-  int32_t SetSpeakerVolume(uint32_t volume) override {
-    LOG(INFO) << __FUNCTION__;
-    return output_.SetSpeakerVolume(volume);
-  }
-
-  int32_t SpeakerVolume(uint32_t& volume) const override {
-    LOG(INFO) << __FUNCTION__;
-    return output_.SpeakerVolume(volume);
-  }
-
-  int32_t MaxSpeakerVolume(uint32_t& maxVolume) const override {
-    LOG(INFO) << __FUNCTION__;
-    return output_.MaxSpeakerVolume(maxVolume);
-  }
-
-  int32_t MinSpeakerVolume(uint32_t& minVolume) const override {
-    LOG(INFO) << __FUNCTION__;
-    return output_.MinSpeakerVolume(minVolume);
-  }
-
-  int32_t MicrophoneVolumeIsAvailable(bool& available) override{
-    available = false;
-    return -1;
-  }
-
-  int32_t SetMicrophoneVolume(uint32_t volume) override {
-    FATAL() << "Should never be called";
-    return -1;
-  }
-
-  int32_t MicrophoneVolume(uint32_t& volume) const override {
-    FATAL() << "Should never be called";
-    return -1;
-  }
-
-  int32_t MaxMicrophoneVolume(uint32_t& maxVolume) const override {
-    FATAL() << "Should never be called";
-    return -1;
-  }
-
-  int32_t MinMicrophoneVolume(uint32_t& minVolume) const override {
-    FATAL() << "Should never be called";
-    return -1;
-  }
-
-  int32_t SpeakerMuteIsAvailable(bool& available) override {
-    FATAL() << "Should never be called";
-    return -1;
-  }
-
-  int32_t SetSpeakerMute(bool enable) override {
-    FATAL() << "Should never be called";
-    return -1;
-  }
-
-  int32_t SpeakerMute(bool& enabled) const override {
-    FATAL() << "Should never be called";
-    return -1;
-  }
-
-  int32_t MicrophoneMuteIsAvailable(bool& available) override {
-    FATAL() << "Not implemented";
-    return -1;
-  }
-
-  int32_t SetMicrophoneMute(bool enable) override {
-    FATAL() << "Not implemented";
-    return -1;
-  }
-
-  int32_t MicrophoneMute(bool& enabled) const override {
-    FATAL() << "Not implemented";
-    return -1;
-  }
-
-  // Returns true if the audio manager has been configured to support stereo
-  // and false otherwised. Default is mono.
-  int32_t StereoPlayoutIsAvailable(bool& available) override {
-    LOG(INFO) << __FUNCTION__;
-    available = audio_manager_->IsStereoPlayoutSupported();
-    return 0;
-  }
-
-  int32_t SetStereoPlayout(bool enable) override {
-    LOG(INFO) << __FUNCTION__;
-    bool available = audio_manager_->IsStereoPlayoutSupported();
-    // Android does not support changes between mono and stero on the fly.
-    // Instead, the native audio layer is configured via the audio manager
-    // to either support mono or stereo. It is allowed to call this method
-    // if that same state is not modified.
-    return (enable == available) ? 0 : -1;
-  }
-
-  int32_t StereoPlayout(bool& enabled) const override {
-    enabled = audio_manager_->IsStereoPlayoutSupported();
-    return 0;
-  }
-
-  int32_t StereoRecordingIsAvailable(bool& available) override {
-    LOG(INFO) << __FUNCTION__;
-    available = audio_manager_->IsStereoRecordSupported();
-    return 0;
-  }
-
-  int32_t SetStereoRecording(bool enable) override {
-    LOG(INFO) << __FUNCTION__;
-    bool available = audio_manager_->IsStereoRecordSupported();
-    // Android does not support changes between mono and stero on the fly.
-    // Instead, the native audio layer is configured via the audio manager
-    // to either support mono or stereo. It is allowed to call this method
-    // if that same state is not modified.
-    return (enable == available) ? 0 : -1;
-  }
-
-  int32_t StereoRecording(bool& enabled) const override {
-    LOG(INFO) << __FUNCTION__;
-    enabled = audio_manager_->IsStereoRecordSupported();
-    return 0;
-  }
-
-  int32_t PlayoutDelay(uint16_t& delay_ms) const override {
-    // Best guess we can do is to use half of the estimated total delay.
-    delay_ms = audio_manager_->GetDelayEstimateInMilliseconds() / 2;
-    RTC_DCHECK_GT(delay_ms, 0);
-    return 0;
-  }
-
-  int32_t RecordingDelay(uint16_t& delay_ms) const override {
-    // Best guess we can do is to use half of the estimated total delay.
-    LOG(INFO) << __FUNCTION__;
-    delay_ms = audio_manager_->GetDelayEstimateInMilliseconds() / 2;
-    RTC_DCHECK_GT(delay_ms, 0);
-    return 0;
-  }
-
-  bool PlayoutWarning() const override {
-    return false;
-  }
-
-  bool PlayoutError() const override {
-    return false;
-  }
-
-  bool RecordingWarning() const override {
-    return false;
-  }
-
-  bool RecordingError() const override {
-    return false;
-  }
-
-  void ClearPlayoutWarning() override { LOG(INFO) << __FUNCTION__; }
-
-  void ClearPlayoutError() override { LOG(INFO) << __FUNCTION__; }
-
-  void ClearRecordingWarning() override { LOG(INFO) << __FUNCTION__; }
-
-  void ClearRecordingError() override { LOG(INFO) << __FUNCTION__; }
-
-  void AttachAudioBuffer(AudioDeviceBuffer* audioBuffer) override {
-    LOG(INFO) << __FUNCTION__;
-    output_.AttachAudioBuffer(audioBuffer);
-    input_.AttachAudioBuffer(audioBuffer);
-  }
-
-  // TODO(henrika): remove
-  int32_t SetPlayoutSampleRate(const uint32_t samplesPerSec) override {
-    FATAL() << "Should never be called";
-    return -1;
-  }
-
-  int32_t SetLoudspeakerStatus(bool enable) override {
-    FATAL() << "Should never be called";
-    return -1;
-  }
-
-  int32_t GetLoudspeakerStatus(bool& enable) const override {
-    FATAL() << "Should never be called";
-    return -1;
-  }
-
-  // Returns true if the device both supports built in AEC and the device
-  // is not blacklisted.
-  // Currently, if OpenSL ES is used in both directions, this method will still
-  // report the correct value and it has the correct effect. As an example:
-  // a device supports built in AEC and this method returns true. Libjingle
-  // will then disable the WebRTC based AEC and that will work for all devices
-  // (mainly Nexus) even when OpenSL ES is used for input since our current
-  // implementation will enable built-in AEC by default also for OpenSL ES.
-  // The only "bad" thing that happens today is that when Libjingle calls
-  // OpenSLESRecorder::EnableBuiltInAEC() it will not have any real effect and
-  // a "Not Implemented" log will be filed. This non-perfect state will remain
-  // until I have added full support for audio effects based on OpenSL ES APIs.
-  bool BuiltInAECIsAvailable() const override {
-    LOG(INFO) << __FUNCTION__;
-    return audio_manager_->IsAcousticEchoCancelerSupported();
-  }
-
-  // TODO(henrika): add implementation for OpenSL ES based audio as well.
-  int32_t EnableBuiltInAEC(bool enable) override {
-    LOG(INFO) << __FUNCTION__ << "(" << enable << ")";
-    RTC_CHECK(BuiltInAECIsAvailable()) << "HW AEC is not available";
-    return input_.EnableBuiltInAEC(enable);
-  }
-
-  // Returns true if the device both supports built in AGC and the device
-  // is not blacklisted.
-  // TODO(henrika): add implementation for OpenSL ES based audio as well.
-  // In addition, see comments for BuiltInAECIsAvailable().
-  bool BuiltInAGCIsAvailable() const override {
-    LOG(INFO) << __FUNCTION__;
-    return audio_manager_->IsAutomaticGainControlSupported();
-  }
-
-  // TODO(henrika): add implementation for OpenSL ES based audio as well.
-  int32_t EnableBuiltInAGC(bool enable) override {
-    LOG(INFO) << __FUNCTION__ << "(" << enable << ")";
-    RTC_CHECK(BuiltInAGCIsAvailable()) << "HW AGC is not available";
-    return input_.EnableBuiltInAGC(enable);
-  }
-
-  // Returns true if the device both supports built in NS and the device
-  // is not blacklisted.
-  // TODO(henrika): add implementation for OpenSL ES based audio as well.
-  // In addition, see comments for BuiltInAECIsAvailable().
-  bool BuiltInNSIsAvailable() const override {
-    LOG(INFO) << __FUNCTION__;
-    return audio_manager_->IsNoiseSuppressorSupported();
-  }
-
-  // TODO(henrika): add implementation for OpenSL ES based audio as well.
-  int32_t EnableBuiltInNS(bool enable) override {
-    LOG(INFO) << __FUNCTION__ << "(" << enable << ")";
-    RTC_CHECK(BuiltInNSIsAvailable()) << "HW NS is not available";
-    return input_.EnableBuiltInNS(enable);
-  }
-
- private:
-  rtc::ThreadChecker thread_checker_;
-
-  // Local copy of the audio layer set during construction of the
-  // AudioDeviceModuleImpl instance. Read only value.
-  const AudioDeviceModule::AudioLayer audio_layer_;
-
-  // Non-owning raw pointer to AudioManager instance given to use at
-  // construction. The real object is owned by AudioDeviceModuleImpl and the
-  // life time is the same as that of the AudioDeviceModuleImpl, hence there
-  // is no risk of reading a NULL pointer at any time in this class.
-  AudioManager* const audio_manager_;
-
-  OutputType output_;
-
-  InputType input_;
-
-  bool initialized_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_DEVICE_ANDROID_AUDIO_DEVICE_TEMPLATE_H_
diff --git a/modules/audio_device/android/audio_device_unittest.cc b/modules/audio_device/android/audio_device_unittest.cc
deleted file mode 100644
index 49403c9..0000000
--- a/modules/audio_device/android/audio_device_unittest.cc
+++ /dev/null
@@ -1,1022 +0,0 @@
-/*
- *  Copyright (c) 2015 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 <algorithm>
-#include <limits>
-#include <list>
-#include <memory>
-#include <numeric>
-#include <string>
-#include <vector>
-
-#include "webrtc/modules/audio_device/android/audio_common.h"
-#include "webrtc/modules/audio_device/android/audio_manager.h"
-#include "webrtc/modules/audio_device/android/build_info.h"
-#include "webrtc/modules/audio_device/android/ensure_initialized.h"
-#include "webrtc/modules/audio_device/audio_device_impl.h"
-#include "webrtc/modules/audio_device/include/audio_device.h"
-#include "webrtc/modules/audio_device/include/mock_audio_transport.h"
-#include "webrtc/rtc_base/arraysize.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/format_macros.h"
-#include "webrtc/rtc_base/scoped_ref_ptr.h"
-#include "webrtc/rtc_base/timeutils.h"
-#include "webrtc/system_wrappers/include/event_wrapper.h"
-#include "webrtc/test/gmock.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/testsupport/fileutils.h"
-
-using std::cout;
-using std::endl;
-using ::testing::_;
-using ::testing::AtLeast;
-using ::testing::Gt;
-using ::testing::Invoke;
-using ::testing::NiceMock;
-using ::testing::NotNull;
-using ::testing::Return;
-
-// #define ENABLE_DEBUG_PRINTF
-#ifdef ENABLE_DEBUG_PRINTF
-#define PRINTD(...) fprintf(stderr, __VA_ARGS__);
-#else
-#define PRINTD(...) ((void)0)
-#endif
-#define PRINT(...) fprintf(stderr, __VA_ARGS__);
-
-namespace webrtc {
-
-// Number of callbacks (input or output) the tests waits for before we set
-// an event indicating that the test was OK.
-static const size_t kNumCallbacks = 10;
-// Max amount of time we wait for an event to be set while counting callbacks.
-static const int kTestTimeOutInMilliseconds = 10 * 1000;
-// Average number of audio callbacks per second assuming 10ms packet size.
-static const size_t kNumCallbacksPerSecond = 100;
-// Play out a test file during this time (unit is in seconds).
-static const int kFilePlayTimeInSec = 5;
-static const size_t kBitsPerSample = 16;
-static const size_t kBytesPerSample = kBitsPerSample / 8;
-// Run the full-duplex test during this time (unit is in seconds).
-// Note that first |kNumIgnoreFirstCallbacks| are ignored.
-static const int kFullDuplexTimeInSec = 5;
-// Wait for the callback sequence to stabilize by ignoring this amount of the
-// initial callbacks (avoids initial FIFO access).
-// Only used in the RunPlayoutAndRecordingInFullDuplex test.
-static const size_t kNumIgnoreFirstCallbacks = 50;
-// Sets the number of impulses per second in the latency test.
-static const int kImpulseFrequencyInHz = 1;
-// Length of round-trip latency measurements. Number of transmitted impulses
-// is kImpulseFrequencyInHz * kMeasureLatencyTimeInSec - 1.
-static const int kMeasureLatencyTimeInSec = 11;
-// Utilized in round-trip latency measurements to avoid capturing noise samples.
-static const int kImpulseThreshold = 1000;
-static const char kTag[] = "[..........] ";
-
-enum TransportType {
-  kPlayout = 0x1,
-  kRecording = 0x2,
-};
-
-// Interface for processing the audio stream. Real implementations can e.g.
-// run audio in loopback, read audio from a file or perform latency
-// measurements.
-class AudioStreamInterface {
- public:
-  virtual void Write(const void* source, size_t num_frames) = 0;
-  virtual void Read(void* destination, size_t num_frames) = 0;
- protected:
-  virtual ~AudioStreamInterface() {}
-};
-
-// Reads audio samples from a PCM file where the file is stored in memory at
-// construction.
-class FileAudioStream : public AudioStreamInterface {
- public:
-  FileAudioStream(
-      size_t num_callbacks, const std::string& file_name, int sample_rate)
-      : file_size_in_bytes_(0),
-        sample_rate_(sample_rate),
-        file_pos_(0) {
-    file_size_in_bytes_ = test::GetFileSize(file_name);
-    sample_rate_ = sample_rate;
-    EXPECT_GE(file_size_in_callbacks(), num_callbacks)
-        << "Size of test file is not large enough to last during the test.";
-    const size_t num_16bit_samples =
-        test::GetFileSize(file_name) / kBytesPerSample;
-    file_.reset(new int16_t[num_16bit_samples]);
-    FILE* audio_file = fopen(file_name.c_str(), "rb");
-    EXPECT_NE(audio_file, nullptr);
-    size_t num_samples_read = fread(
-        file_.get(), sizeof(int16_t), num_16bit_samples, audio_file);
-    EXPECT_EQ(num_samples_read, num_16bit_samples);
-    fclose(audio_file);
-  }
-
-  // AudioStreamInterface::Write() is not implemented.
-  void Write(const void* source, size_t num_frames) override {}
-
-  // Read samples from file stored in memory (at construction) and copy
-  // |num_frames| (<=> 10ms) to the |destination| byte buffer.
-  void Read(void* destination, size_t num_frames) override {
-    memcpy(destination,
-           static_cast<int16_t*> (&file_[file_pos_]),
-           num_frames * sizeof(int16_t));
-    file_pos_ += num_frames;
-  }
-
-  int file_size_in_seconds() const {
-    return static_cast<int>(
-        file_size_in_bytes_ / (kBytesPerSample * sample_rate_));
-  }
-  size_t file_size_in_callbacks() const {
-    return file_size_in_seconds() * kNumCallbacksPerSecond;
-  }
-
- private:
-  size_t file_size_in_bytes_;
-  int sample_rate_;
-  std::unique_ptr<int16_t[]> file_;
-  size_t file_pos_;
-};
-
-// Simple first in first out (FIFO) class that wraps a list of 16-bit audio
-// buffers of fixed size and allows Write and Read operations. The idea is to
-// store recorded audio buffers (using Write) and then read (using Read) these
-// stored buffers with as short delay as possible when the audio layer needs
-// data to play out. The number of buffers in the FIFO will stabilize under
-// normal conditions since there will be a balance between Write and Read calls.
-// The container is a std::list container and access is protected with a lock
-// since both sides (playout and recording) are driven by its own thread.
-class FifoAudioStream : public AudioStreamInterface {
- public:
-  explicit FifoAudioStream(size_t frames_per_buffer)
-      : frames_per_buffer_(frames_per_buffer),
-        bytes_per_buffer_(frames_per_buffer_ * sizeof(int16_t)),
-        fifo_(new AudioBufferList),
-        largest_size_(0),
-        total_written_elements_(0),
-        write_count_(0) {
-    EXPECT_NE(fifo_.get(), nullptr);
-  }
-
-  ~FifoAudioStream() {
-    Flush();
-  }
-
-  // Allocate new memory, copy |num_frames| samples from |source| into memory
-  // and add pointer to the memory location to end of the list.
-  // Increases the size of the FIFO by one element.
-  void Write(const void* source, size_t num_frames) override {
-    ASSERT_EQ(num_frames, frames_per_buffer_);
-    PRINTD("+");
-    if (write_count_++ < kNumIgnoreFirstCallbacks) {
-      return;
-    }
-    int16_t* memory = new int16_t[frames_per_buffer_];
-    memcpy(static_cast<int16_t*> (&memory[0]),
-           source,
-           bytes_per_buffer_);
-    rtc::CritScope lock(&lock_);
-    fifo_->push_back(memory);
-    const size_t size = fifo_->size();
-    if (size > largest_size_) {
-      largest_size_ = size;
-      PRINTD("(%" PRIuS ")", largest_size_);
-    }
-    total_written_elements_ += size;
-  }
-
-  // Read pointer to data buffer from front of list, copy |num_frames| of stored
-  // data into |destination| and delete the utilized memory allocation.
-  // Decreases the size of the FIFO by one element.
-  void Read(void* destination, size_t num_frames) override {
-    ASSERT_EQ(num_frames, frames_per_buffer_);
-    PRINTD("-");
-    rtc::CritScope lock(&lock_);
-    if (fifo_->empty()) {
-      memset(destination, 0, bytes_per_buffer_);
-    } else {
-      int16_t* memory = fifo_->front();
-      fifo_->pop_front();
-      memcpy(destination,
-             static_cast<int16_t*> (&memory[0]),
-             bytes_per_buffer_);
-      delete memory;
-    }
-  }
-
-  size_t size() const {
-    return fifo_->size();
-  }
-
-  size_t largest_size() const {
-    return largest_size_;
-  }
-
-  size_t average_size() const {
-    return (total_written_elements_ == 0) ? 0.0 : 0.5 + static_cast<float> (
-      total_written_elements_) / (write_count_ - kNumIgnoreFirstCallbacks);
-  }
-
- private:
-  void Flush() {
-    for (auto it = fifo_->begin(); it != fifo_->end(); ++it) {
-      delete *it;
-    }
-    fifo_->clear();
-  }
-
-  using AudioBufferList = std::list<int16_t*>;
-  rtc::CriticalSection lock_;
-  const size_t frames_per_buffer_;
-  const size_t bytes_per_buffer_;
-  std::unique_ptr<AudioBufferList> fifo_;
-  size_t largest_size_;
-  size_t total_written_elements_;
-  size_t write_count_;
-};
-
-// Inserts periodic impulses and measures the latency between the time of
-// transmission and time of receiving the same impulse.
-// Usage requires a special hardware called Audio Loopback Dongle.
-// See http://source.android.com/devices/audio/loopback.html for details.
-class LatencyMeasuringAudioStream : public AudioStreamInterface {
- public:
-  explicit LatencyMeasuringAudioStream(size_t frames_per_buffer)
-      : frames_per_buffer_(frames_per_buffer),
-        bytes_per_buffer_(frames_per_buffer_ * sizeof(int16_t)),
-        play_count_(0),
-        rec_count_(0),
-        pulse_time_(0) {
-  }
-
-  // Insert periodic impulses in first two samples of |destination|.
-  void Read(void* destination, size_t num_frames) override {
-    ASSERT_EQ(num_frames, frames_per_buffer_);
-    if (play_count_ == 0) {
-      PRINT("[");
-    }
-    play_count_++;
-    memset(destination, 0, bytes_per_buffer_);
-    if (play_count_ % (kNumCallbacksPerSecond / kImpulseFrequencyInHz) == 0) {
-      if (pulse_time_ == 0) {
-        pulse_time_ = rtc::TimeMillis();
-      }
-      PRINT(".");
-      const int16_t impulse = std::numeric_limits<int16_t>::max();
-      int16_t* ptr16 = static_cast<int16_t*> (destination);
-      for (size_t i = 0; i < 2; ++i) {
-        ptr16[i] = impulse;
-      }
-    }
-  }
-
-  // Detect received impulses in |source|, derive time between transmission and
-  // detection and add the calculated delay to list of latencies.
-  void Write(const void* source, size_t num_frames) override {
-    ASSERT_EQ(num_frames, frames_per_buffer_);
-    rec_count_++;
-    if (pulse_time_ == 0) {
-      // Avoid detection of new impulse response until a new impulse has
-      // been transmitted (sets |pulse_time_| to value larger than zero).
-      return;
-    }
-    const int16_t* ptr16 = static_cast<const int16_t*> (source);
-    std::vector<int16_t> vec(ptr16, ptr16 + num_frames);
-    // Find max value in the audio buffer.
-    int max = *std::max_element(vec.begin(), vec.end());
-    // Find index (element position in vector) of the max element.
-    int index_of_max = std::distance(vec.begin(),
-                                     std::find(vec.begin(), vec.end(),
-                                     max));
-    if (max > kImpulseThreshold) {
-      PRINTD("(%d,%d)", max, index_of_max);
-      int64_t now_time = rtc::TimeMillis();
-      int extra_delay = IndexToMilliseconds(static_cast<double> (index_of_max));
-      PRINTD("[%d]", static_cast<int> (now_time - pulse_time_));
-      PRINTD("[%d]", extra_delay);
-      // Total latency is the difference between transmit time and detection
-      // tome plus the extra delay within the buffer in which we detected the
-      // received impulse. It is transmitted at sample 0 but can be received
-      // at sample N where N > 0. The term |extra_delay| accounts for N and it
-      // is a value between 0 and 10ms.
-      latencies_.push_back(now_time - pulse_time_ + extra_delay);
-      pulse_time_ = 0;
-    } else {
-      PRINTD("-");
-    }
-  }
-
-  size_t num_latency_values() const {
-    return latencies_.size();
-  }
-
-  int min_latency() const {
-    if (latencies_.empty())
-      return 0;
-    return *std::min_element(latencies_.begin(), latencies_.end());
-  }
-
-  int max_latency() const {
-    if (latencies_.empty())
-      return 0;
-    return *std::max_element(latencies_.begin(), latencies_.end());
-  }
-
-  int average_latency() const {
-    if (latencies_.empty())
-      return 0;
-    return 0.5 + static_cast<double> (
-        std::accumulate(latencies_.begin(), latencies_.end(), 0)) /
-        latencies_.size();
-  }
-
-  void PrintResults() const {
-    PRINT("] ");
-    for (auto it = latencies_.begin(); it != latencies_.end(); ++it) {
-      PRINT("%d ", *it);
-    }
-    PRINT("\n");
-    PRINT("%s[min, max, avg]=[%d, %d, %d] ms\n", kTag,
-        min_latency(), max_latency(), average_latency());
-  }
-
-  int IndexToMilliseconds(double index) const {
-    return static_cast<int>(10.0 * (index / frames_per_buffer_) + 0.5);
-  }
-
- private:
-  const size_t frames_per_buffer_;
-  const size_t bytes_per_buffer_;
-  size_t play_count_;
-  size_t rec_count_;
-  int64_t pulse_time_;
-  std::vector<int> latencies_;
-};
-
-// Mocks the AudioTransport object and proxies actions for the two callbacks
-// (RecordedDataIsAvailable and NeedMorePlayData) to different implementations
-// of AudioStreamInterface.
-class MockAudioTransportAndroid : public test::MockAudioTransport {
- public:
-  explicit MockAudioTransportAndroid(int type)
-      : num_callbacks_(0),
-        type_(type),
-        play_count_(0),
-        rec_count_(0),
-        audio_stream_(nullptr) {}
-
-  virtual ~MockAudioTransportAndroid() {}
-
-  // Set default actions of the mock object. We are delegating to fake
-  // implementations (of AudioStreamInterface) here.
-  void HandleCallbacks(EventWrapper* test_is_done,
-                       AudioStreamInterface* audio_stream,
-                       int num_callbacks) {
-    test_is_done_ = test_is_done;
-    audio_stream_ = audio_stream;
-    num_callbacks_ = num_callbacks;
-    if (play_mode()) {
-      ON_CALL(*this, NeedMorePlayData(_, _, _, _, _, _, _, _))
-          .WillByDefault(
-              Invoke(this, &MockAudioTransportAndroid::RealNeedMorePlayData));
-    }
-    if (rec_mode()) {
-      ON_CALL(*this, RecordedDataIsAvailable(_, _, _, _, _, _, _, _, _, _))
-          .WillByDefault(Invoke(
-              this, &MockAudioTransportAndroid::RealRecordedDataIsAvailable));
-    }
-  }
-
-  int32_t RealRecordedDataIsAvailable(const void* audioSamples,
-                                      const size_t nSamples,
-                                      const size_t nBytesPerSample,
-                                      const size_t nChannels,
-                                      const uint32_t samplesPerSec,
-                                      const uint32_t totalDelayMS,
-                                      const int32_t clockDrift,
-                                      const uint32_t currentMicLevel,
-                                      const bool keyPressed,
-                                      uint32_t& newMicLevel) {
-    EXPECT_TRUE(rec_mode()) << "No test is expecting these callbacks.";
-    rec_count_++;
-    // Process the recorded audio stream if an AudioStreamInterface
-    // implementation exists.
-    if (audio_stream_) {
-      audio_stream_->Write(audioSamples, nSamples);
-    }
-    if (ReceivedEnoughCallbacks()) {
-      test_is_done_->Set();
-    }
-    return 0;
-  }
-
-  int32_t RealNeedMorePlayData(const size_t nSamples,
-                               const size_t nBytesPerSample,
-                               const size_t nChannels,
-                               const uint32_t samplesPerSec,
-                               void* audioSamples,
-                               size_t& nSamplesOut,
-                               int64_t* elapsed_time_ms,
-                               int64_t* ntp_time_ms) {
-    EXPECT_TRUE(play_mode()) << "No test is expecting these callbacks.";
-    play_count_++;
-    nSamplesOut = nSamples;
-    // Read (possibly processed) audio stream samples to be played out if an
-    // AudioStreamInterface implementation exists.
-    if (audio_stream_) {
-      audio_stream_->Read(audioSamples, nSamples);
-    }
-    if (ReceivedEnoughCallbacks()) {
-      test_is_done_->Set();
-    }
-    return 0;
-  }
-
-  bool ReceivedEnoughCallbacks() {
-    bool recording_done = false;
-    if (rec_mode())
-      recording_done = rec_count_ >= num_callbacks_;
-    else
-      recording_done = true;
-
-    bool playout_done = false;
-    if (play_mode())
-      playout_done = play_count_ >= num_callbacks_;
-    else
-      playout_done = true;
-
-    return recording_done && playout_done;
-  }
-
-  bool play_mode() const { return type_ & kPlayout; }
-  bool rec_mode() const { return type_ & kRecording; }
-
- private:
-  EventWrapper* test_is_done_;
-  size_t num_callbacks_;
-  int type_;
-  size_t play_count_;
-  size_t rec_count_;
-  AudioStreamInterface* audio_stream_;
-  std::unique_ptr<LatencyMeasuringAudioStream> latency_audio_stream_;
-};
-
-// AudioDeviceTest test fixture.
-class AudioDeviceTest : public ::testing::Test {
- protected:
-  AudioDeviceTest()
-      : test_is_done_(EventWrapper::Create()) {
-    // One-time initialization of JVM and application context. Ensures that we
-    // can do calls between C++ and Java. Initializes both Java and OpenSL ES
-    // implementations.
-    webrtc::audiodevicemodule::EnsureInitialized();
-    // Creates an audio device using a default audio layer.
-    audio_device_ = CreateAudioDevice(AudioDeviceModule::kPlatformDefaultAudio);
-    EXPECT_NE(audio_device_.get(), nullptr);
-    EXPECT_EQ(0, audio_device_->Init());
-    playout_parameters_ = audio_manager()->GetPlayoutAudioParameters();
-    record_parameters_ = audio_manager()->GetRecordAudioParameters();
-    build_info_.reset(new BuildInfo());
-  }
-  virtual ~AudioDeviceTest() {
-    EXPECT_EQ(0, audio_device_->Terminate());
-  }
-
-  int playout_sample_rate() const {
-    return playout_parameters_.sample_rate();
-  }
-  int record_sample_rate() const {
-    return record_parameters_.sample_rate();
-  }
-  size_t playout_channels() const {
-    return playout_parameters_.channels();
-  }
-  size_t record_channels() const {
-    return record_parameters_.channels();
-  }
-  size_t playout_frames_per_10ms_buffer() const {
-    return playout_parameters_.frames_per_10ms_buffer();
-  }
-  size_t record_frames_per_10ms_buffer() const {
-    return record_parameters_.frames_per_10ms_buffer();
-  }
-
-  int total_delay_ms() const {
-    return audio_manager()->GetDelayEstimateInMilliseconds();
-  }
-
-  rtc::scoped_refptr<AudioDeviceModule> audio_device() const {
-    return audio_device_;
-  }
-
-  AudioDeviceModuleImpl* audio_device_impl() const {
-    return static_cast<AudioDeviceModuleImpl*>(audio_device_.get());
-  }
-
-  AudioManager* audio_manager() const {
-    return audio_device_impl()->GetAndroidAudioManagerForTest();
-  }
-
-  AudioManager* GetAudioManager(AudioDeviceModule* adm) const {
-    return static_cast<AudioDeviceModuleImpl*>(adm)->
-        GetAndroidAudioManagerForTest();
-  }
-
-  AudioDeviceBuffer* audio_device_buffer() const {
-    return audio_device_impl()->GetAudioDeviceBuffer();
-  }
-
-  rtc::scoped_refptr<AudioDeviceModule> CreateAudioDevice(
-      AudioDeviceModule::AudioLayer audio_layer) {
-    rtc::scoped_refptr<AudioDeviceModule> module(
-        AudioDeviceModule::Create(0, audio_layer));
-    return module;
-  }
-
-  // Returns file name relative to the resource root given a sample rate.
-  std::string GetFileName(int sample_rate) {
-    EXPECT_TRUE(sample_rate == 48000 || sample_rate == 44100);
-    char fname[64];
-    snprintf(fname,
-             sizeof(fname),
-             "audio_device/audio_short%d",
-             sample_rate / 1000);
-    std::string file_name(webrtc::test::ResourcePath(fname, "pcm"));
-    EXPECT_TRUE(test::FileExists(file_name));
-#ifdef ENABLE_PRINTF
-    PRINT("file name: %s\n", file_name.c_str());
-    const size_t bytes = test::GetFileSize(file_name);
-    PRINT("file size: %" PRIuS " [bytes]\n", bytes);
-    PRINT("file size: %" PRIuS " [samples]\n", bytes / kBytesPerSample);
-    const int seconds =
-        static_cast<int>(bytes / (sample_rate * kBytesPerSample));
-    PRINT("file size: %d [secs]\n", seconds);
-    PRINT("file size: %" PRIuS " [callbacks]\n",
-          seconds * kNumCallbacksPerSecond);
-#endif
-    return file_name;
-  }
-
-  AudioDeviceModule::AudioLayer GetActiveAudioLayer() const {
-    AudioDeviceModule::AudioLayer audio_layer;
-    EXPECT_EQ(0, audio_device()->ActiveAudioLayer(&audio_layer));
-    return audio_layer;
-  }
-
-  int TestDelayOnAudioLayer(
-      const AudioDeviceModule::AudioLayer& layer_to_test) {
-    rtc::scoped_refptr<AudioDeviceModule> audio_device;
-    audio_device = CreateAudioDevice(layer_to_test);
-    EXPECT_NE(audio_device.get(), nullptr);
-    AudioManager* audio_manager = GetAudioManager(audio_device.get());
-    EXPECT_NE(audio_manager, nullptr);
-    return audio_manager->GetDelayEstimateInMilliseconds();
-  }
-
-  AudioDeviceModule::AudioLayer TestActiveAudioLayer(
-      const AudioDeviceModule::AudioLayer& layer_to_test) {
-    rtc::scoped_refptr<AudioDeviceModule> audio_device;
-    audio_device = CreateAudioDevice(layer_to_test);
-    EXPECT_NE(audio_device.get(), nullptr);
-    AudioDeviceModule::AudioLayer active;
-    EXPECT_EQ(0, audio_device->ActiveAudioLayer(&active));
-    return active;
-  }
-
-  bool DisableTestForThisDevice(const std::string& model) {
-    return (build_info_->GetDeviceModel() == model);
-  }
-
-  // Volume control is currently only supported for the Java output audio layer.
-  // For OpenSL ES, the internal stream volume is always on max level and there
-  // is no need for this test to set it to max.
-  bool AudioLayerSupportsVolumeControl() const {
-    return GetActiveAudioLayer() == AudioDeviceModule::kAndroidJavaAudio;
-  }
-
-  void SetMaxPlayoutVolume() {
-    if (!AudioLayerSupportsVolumeControl())
-      return;
-    uint32_t max_volume;
-    EXPECT_EQ(0, audio_device()->MaxSpeakerVolume(&max_volume));
-    EXPECT_EQ(0, audio_device()->SetSpeakerVolume(max_volume));
-  }
-
-  void DisableBuiltInAECIfAvailable() {
-    if (audio_device()->BuiltInAECIsAvailable()) {
-      EXPECT_EQ(0, audio_device()->EnableBuiltInAEC(false));
-    }
-  }
-
-  void StartPlayout() {
-    EXPECT_FALSE(audio_device()->PlayoutIsInitialized());
-    EXPECT_FALSE(audio_device()->Playing());
-    EXPECT_EQ(0, audio_device()->InitPlayout());
-    EXPECT_TRUE(audio_device()->PlayoutIsInitialized());
-    EXPECT_EQ(0, audio_device()->StartPlayout());
-    EXPECT_TRUE(audio_device()->Playing());
-  }
-
-  void StopPlayout() {
-    EXPECT_EQ(0, audio_device()->StopPlayout());
-    EXPECT_FALSE(audio_device()->Playing());
-    EXPECT_FALSE(audio_device()->PlayoutIsInitialized());
-  }
-
-  void StartRecording() {
-    EXPECT_FALSE(audio_device()->RecordingIsInitialized());
-    EXPECT_FALSE(audio_device()->Recording());
-    EXPECT_EQ(0, audio_device()->InitRecording());
-    EXPECT_TRUE(audio_device()->RecordingIsInitialized());
-    EXPECT_EQ(0, audio_device()->StartRecording());
-    EXPECT_TRUE(audio_device()->Recording());
-  }
-
-  void StopRecording() {
-    EXPECT_EQ(0, audio_device()->StopRecording());
-    EXPECT_FALSE(audio_device()->Recording());
-  }
-
-  int GetMaxSpeakerVolume() const {
-    uint32_t max_volume(0);
-    EXPECT_EQ(0, audio_device()->MaxSpeakerVolume(&max_volume));
-    return max_volume;
-  }
-
-  int GetMinSpeakerVolume() const {
-    uint32_t min_volume(0);
-    EXPECT_EQ(0, audio_device()->MinSpeakerVolume(&min_volume));
-    return min_volume;
-  }
-
-  int GetSpeakerVolume() const {
-    uint32_t volume(0);
-    EXPECT_EQ(0, audio_device()->SpeakerVolume(&volume));
-    return volume;
-  }
-
-  std::unique_ptr<EventWrapper> test_is_done_;
-  rtc::scoped_refptr<AudioDeviceModule> audio_device_;
-  AudioParameters playout_parameters_;
-  AudioParameters record_parameters_;
-  std::unique_ptr<BuildInfo> build_info_;
-};
-
-TEST_F(AudioDeviceTest, ConstructDestruct) {
-  // Using the test fixture to create and destruct the audio device module.
-}
-
-// We always ask for a default audio layer when the ADM is constructed. But the
-// ADM will then internally set the best suitable combination of audio layers,
-// for input and output based on if low-latency output and/or input audio in
-// combination with OpenSL ES is supported or not. This test ensures that the
-// correct selection is done.
-TEST_F(AudioDeviceTest, VerifyDefaultAudioLayer) {
-  const AudioDeviceModule::AudioLayer audio_layer = GetActiveAudioLayer();
-  bool low_latency_output = audio_manager()->IsLowLatencyPlayoutSupported();
-  bool low_latency_input = audio_manager()->IsLowLatencyRecordSupported();
-  AudioDeviceModule::AudioLayer expected_audio_layer;
-  if (low_latency_output && low_latency_input) {
-    expected_audio_layer = AudioDeviceModule::kAndroidOpenSLESAudio;
-  } else if (low_latency_output && !low_latency_input) {
-    expected_audio_layer =
-        AudioDeviceModule::kAndroidJavaInputAndOpenSLESOutputAudio;
-  } else {
-    expected_audio_layer = AudioDeviceModule::kAndroidJavaAudio;
-  }
-  EXPECT_EQ(expected_audio_layer, audio_layer);
-}
-
-// Verify that it is possible to explicitly create the two types of supported
-// ADMs. These two tests overrides the default selection of native audio layer
-// by ignoring if the device supports low-latency output or not.
-TEST_F(AudioDeviceTest, CorrectAudioLayerIsUsedForCombinedJavaOpenSLCombo) {
-  AudioDeviceModule::AudioLayer expected_layer =
-      AudioDeviceModule::kAndroidJavaInputAndOpenSLESOutputAudio;
-  AudioDeviceModule::AudioLayer active_layer = TestActiveAudioLayer(
-      expected_layer);
-  EXPECT_EQ(expected_layer, active_layer);
-}
-
-TEST_F(AudioDeviceTest, CorrectAudioLayerIsUsedForJavaInBothDirections) {
-  AudioDeviceModule::AudioLayer expected_layer =
-      AudioDeviceModule::kAndroidJavaAudio;
-  AudioDeviceModule::AudioLayer active_layer = TestActiveAudioLayer(
-      expected_layer);
-  EXPECT_EQ(expected_layer, active_layer);
-}
-
-TEST_F(AudioDeviceTest, CorrectAudioLayerIsUsedForOpenSLInBothDirections) {
-  AudioDeviceModule::AudioLayer expected_layer =
-      AudioDeviceModule::kAndroidOpenSLESAudio;
-  AudioDeviceModule::AudioLayer active_layer =
-      TestActiveAudioLayer(expected_layer);
-  EXPECT_EQ(expected_layer, active_layer);
-}
-
-// The Android ADM supports two different delay reporting modes. One for the
-// low-latency output path (in combination with OpenSL ES), and one for the
-// high-latency output path (Java backends in both directions). These two tests
-// verifies that the audio manager reports correct delay estimate given the
-// selected audio layer. Note that, this delay estimate will only be utilized
-// if the HW AEC is disabled.
-TEST_F(AudioDeviceTest, UsesCorrectDelayEstimateForHighLatencyOutputPath) {
-  EXPECT_EQ(kHighLatencyModeDelayEstimateInMilliseconds,
-            TestDelayOnAudioLayer(AudioDeviceModule::kAndroidJavaAudio));
-}
-
-TEST_F(AudioDeviceTest, UsesCorrectDelayEstimateForLowLatencyOutputPath) {
-  EXPECT_EQ(kLowLatencyModeDelayEstimateInMilliseconds,
-            TestDelayOnAudioLayer(
-      AudioDeviceModule::kAndroidJavaInputAndOpenSLESOutputAudio));
-}
-
-// Ensure that the ADM internal audio device buffer is configured to use the
-// correct set of parameters.
-TEST_F(AudioDeviceTest, VerifyAudioDeviceBufferParameters) {
-  EXPECT_EQ(playout_parameters_.sample_rate(),
-            audio_device_buffer()->PlayoutSampleRate());
-  EXPECT_EQ(record_parameters_.sample_rate(),
-            audio_device_buffer()->RecordingSampleRate());
-  EXPECT_EQ(playout_parameters_.channels(),
-            audio_device_buffer()->PlayoutChannels());
-  EXPECT_EQ(record_parameters_.channels(),
-            audio_device_buffer()->RecordingChannels());
-}
-
-
-TEST_F(AudioDeviceTest, InitTerminate) {
-  // Initialization is part of the test fixture.
-  EXPECT_TRUE(audio_device()->Initialized());
-  EXPECT_EQ(0, audio_device()->Terminate());
-  EXPECT_FALSE(audio_device()->Initialized());
-}
-
-TEST_F(AudioDeviceTest, Devices) {
-  // Device enumeration is not supported. Verify fixed values only.
-  EXPECT_EQ(1, audio_device()->PlayoutDevices());
-  EXPECT_EQ(1, audio_device()->RecordingDevices());
-}
-
-TEST_F(AudioDeviceTest, SpeakerVolumeShouldBeAvailable) {
-  // The OpenSL ES output audio path does not support volume control.
-  if (!AudioLayerSupportsVolumeControl())
-    return;
-  bool available;
-  EXPECT_EQ(0, audio_device()->SpeakerVolumeIsAvailable(&available));
-  EXPECT_TRUE(available);
-}
-
-TEST_F(AudioDeviceTest, MaxSpeakerVolumeIsPositive) {
-  // The OpenSL ES output audio path does not support volume control.
-  if (!AudioLayerSupportsVolumeControl())
-    return;
-  StartPlayout();
-  EXPECT_GT(GetMaxSpeakerVolume(), 0);
-  StopPlayout();
-}
-
-TEST_F(AudioDeviceTest, MinSpeakerVolumeIsZero) {
-  // The OpenSL ES output audio path does not support volume control.
-  if (!AudioLayerSupportsVolumeControl())
-    return;
-  EXPECT_EQ(GetMinSpeakerVolume(), 0);
-}
-
-TEST_F(AudioDeviceTest, DefaultSpeakerVolumeIsWithinMinMax) {
-  // The OpenSL ES output audio path does not support volume control.
-  if (!AudioLayerSupportsVolumeControl())
-    return;
-  const int default_volume = GetSpeakerVolume();
-  EXPECT_GE(default_volume, GetMinSpeakerVolume());
-  EXPECT_LE(default_volume, GetMaxSpeakerVolume());
-}
-
-TEST_F(AudioDeviceTest, SetSpeakerVolumeActuallySetsVolume) {
-  // The OpenSL ES output audio path does not support volume control.
-  if (!AudioLayerSupportsVolumeControl())
-    return;
-  const int default_volume = GetSpeakerVolume();
-  const int max_volume = GetMaxSpeakerVolume();
-  EXPECT_EQ(0, audio_device()->SetSpeakerVolume(max_volume));
-  int new_volume = GetSpeakerVolume();
-  EXPECT_EQ(new_volume, max_volume);
-  EXPECT_EQ(0, audio_device()->SetSpeakerVolume(default_volume));
-}
-
-// Tests that playout can be initiated, started and stopped. No audio callback
-// is registered in this test.
-TEST_F(AudioDeviceTest, StartStopPlayout) {
-  StartPlayout();
-  StopPlayout();
-  StartPlayout();
-  StopPlayout();
-}
-
-// Tests that recording can be initiated, started and stopped. No audio callback
-// is registered in this test.
-TEST_F(AudioDeviceTest, StartStopRecording) {
-  StartRecording();
-  StopRecording();
-  StartRecording();
-  StopRecording();
-}
-
-// Verify that calling StopPlayout() will leave us in an uninitialized state
-// which will require a new call to InitPlayout(). This test does not call
-// StartPlayout() while being uninitialized since doing so will hit a
-// RTC_DCHECK and death tests are not supported on Android.
-TEST_F(AudioDeviceTest, StopPlayoutRequiresInitToRestart) {
-  EXPECT_EQ(0, audio_device()->InitPlayout());
-  EXPECT_EQ(0, audio_device()->StartPlayout());
-  EXPECT_EQ(0, audio_device()->StopPlayout());
-  EXPECT_FALSE(audio_device()->PlayoutIsInitialized());
-}
-
-// Verify that calling StopRecording() will leave us in an uninitialized state
-// which will require a new call to InitRecording(). This test does not call
-// StartRecording() while being uninitialized since doing so will hit a
-// RTC_DCHECK and death tests are not supported on Android.
-TEST_F(AudioDeviceTest, StopRecordingRequiresInitToRestart) {
-  EXPECT_EQ(0, audio_device()->InitRecording());
-  EXPECT_EQ(0, audio_device()->StartRecording());
-  EXPECT_EQ(0, audio_device()->StopRecording());
-  EXPECT_FALSE(audio_device()->RecordingIsInitialized());
-}
-
-// Start playout and verify that the native audio layer starts asking for real
-// audio samples to play out using the NeedMorePlayData callback.
-TEST_F(AudioDeviceTest, StartPlayoutVerifyCallbacks) {
-  MockAudioTransportAndroid mock(kPlayout);
-  mock.HandleCallbacks(test_is_done_.get(), nullptr, kNumCallbacks);
-  EXPECT_CALL(mock, NeedMorePlayData(playout_frames_per_10ms_buffer(),
-                                     kBytesPerSample,
-                                     playout_channels(),
-                                     playout_sample_rate(),
-                                     NotNull(),
-                                     _, _, _))
-      .Times(AtLeast(kNumCallbacks));
-  EXPECT_EQ(0, audio_device()->RegisterAudioCallback(&mock));
-  StartPlayout();
-  test_is_done_->Wait(kTestTimeOutInMilliseconds);
-  StopPlayout();
-}
-
-// Start recording and verify that the native audio layer starts feeding real
-// audio samples via the RecordedDataIsAvailable callback.
-TEST_F(AudioDeviceTest, StartRecordingVerifyCallbacks) {
-  MockAudioTransportAndroid mock(kRecording);
-  mock.HandleCallbacks(test_is_done_.get(), nullptr, kNumCallbacks);
-  EXPECT_CALL(mock, RecordedDataIsAvailable(NotNull(),
-                                            record_frames_per_10ms_buffer(),
-                                            kBytesPerSample,
-                                            record_channels(),
-                                            record_sample_rate(),
-                                            total_delay_ms(),
-                                            0,
-                                            0,
-                                            false,
-                                            _))
-      .Times(AtLeast(kNumCallbacks));
-
-  EXPECT_EQ(0, audio_device()->RegisterAudioCallback(&mock));
-  StartRecording();
-  test_is_done_->Wait(kTestTimeOutInMilliseconds);
-  StopRecording();
-}
-
-
-// Start playout and recording (full-duplex audio) and verify that audio is
-// active in both directions.
-TEST_F(AudioDeviceTest, StartPlayoutAndRecordingVerifyCallbacks) {
-  MockAudioTransportAndroid mock(kPlayout | kRecording);
-  mock.HandleCallbacks(test_is_done_.get(), nullptr,  kNumCallbacks);
-  EXPECT_CALL(mock, NeedMorePlayData(playout_frames_per_10ms_buffer(),
-                                     kBytesPerSample,
-                                     playout_channels(),
-                                     playout_sample_rate(),
-                                     NotNull(),
-                                     _, _, _))
-      .Times(AtLeast(kNumCallbacks));
-  EXPECT_CALL(mock, RecordedDataIsAvailable(NotNull(),
-                                            record_frames_per_10ms_buffer(),
-                                            kBytesPerSample,
-                                            record_channels(),
-                                            record_sample_rate(),
-                                            total_delay_ms(),
-                                            0,
-                                            0,
-                                            false,
-                                            _))
-      .Times(AtLeast(kNumCallbacks));
-  EXPECT_EQ(0, audio_device()->RegisterAudioCallback(&mock));
-  StartPlayout();
-  StartRecording();
-  test_is_done_->Wait(kTestTimeOutInMilliseconds);
-  StopRecording();
-  StopPlayout();
-}
-
-// Start playout and read audio from an external PCM file when the audio layer
-// asks for data to play out. Real audio is played out in this test but it does
-// not contain any explicit verification that the audio quality is perfect.
-TEST_F(AudioDeviceTest, RunPlayoutWithFileAsSource) {
-  // TODO(henrika): extend test when mono output is supported.
-  EXPECT_EQ(1u, playout_channels());
-  NiceMock<MockAudioTransportAndroid> mock(kPlayout);
-  const int num_callbacks = kFilePlayTimeInSec * kNumCallbacksPerSecond;
-  std::string file_name = GetFileName(playout_sample_rate());
-  std::unique_ptr<FileAudioStream> file_audio_stream(
-      new FileAudioStream(num_callbacks, file_name, playout_sample_rate()));
-  mock.HandleCallbacks(test_is_done_.get(),
-                       file_audio_stream.get(),
-                       num_callbacks);
-  // SetMaxPlayoutVolume();
-  EXPECT_EQ(0, audio_device()->RegisterAudioCallback(&mock));
-  StartPlayout();
-  test_is_done_->Wait(kTestTimeOutInMilliseconds);
-  StopPlayout();
-}
-
-// Start playout and recording and store recorded data in an intermediate FIFO
-// buffer from which the playout side then reads its samples in the same order
-// as they were stored. Under ideal circumstances, a callback sequence would
-// look like: ...+-+-+-+-+-+-+-..., where '+' means 'packet recorded' and '-'
-// means 'packet played'. Under such conditions, the FIFO would only contain
-// one packet on average. However, under more realistic conditions, the size
-// of the FIFO will vary more due to an unbalance between the two sides.
-// This test tries to verify that the device maintains a balanced callback-
-// sequence by running in loopback for ten seconds while measuring the size
-// (max and average) of the FIFO. The size of the FIFO is increased by the
-// recording side and decreased by the playout side.
-// TODO(henrika): tune the final test parameters after running tests on several
-// different devices.
-TEST_F(AudioDeviceTest, RunPlayoutAndRecordingInFullDuplex) {
-  EXPECT_EQ(record_channels(), playout_channels());
-  EXPECT_EQ(record_sample_rate(), playout_sample_rate());
-  NiceMock<MockAudioTransportAndroid> mock(kPlayout | kRecording);
-  std::unique_ptr<FifoAudioStream> fifo_audio_stream(
-      new FifoAudioStream(playout_frames_per_10ms_buffer()));
-  mock.HandleCallbacks(test_is_done_.get(),
-                       fifo_audio_stream.get(),
-                       kFullDuplexTimeInSec * kNumCallbacksPerSecond);
-  SetMaxPlayoutVolume();
-  EXPECT_EQ(0, audio_device()->RegisterAudioCallback(&mock));
-  StartRecording();
-  StartPlayout();
-  test_is_done_->Wait(std::max(kTestTimeOutInMilliseconds,
-                               1000 * kFullDuplexTimeInSec));
-  StopPlayout();
-  StopRecording();
-
-  // These thresholds are set rather high to accomodate differences in hardware
-  // in several devices, so this test can be used in swarming.
-  // See http://bugs.webrtc.org/6464
-  EXPECT_LE(fifo_audio_stream->average_size(), 60u);
-  EXPECT_LE(fifo_audio_stream->largest_size(), 70u);
-}
-
-// Measures loopback latency and reports the min, max and average values for
-// a full duplex audio session.
-// The latency is measured like so:
-// - Insert impulses periodically on the output side.
-// - Detect the impulses on the input side.
-// - Measure the time difference between the transmit time and receive time.
-// - Store time differences in a vector and calculate min, max and average.
-// This test requires a special hardware called Audio Loopback Dongle.
-// See http://source.android.com/devices/audio/loopback.html for details.
-TEST_F(AudioDeviceTest, DISABLED_MeasureLoopbackLatency) {
-  EXPECT_EQ(record_channels(), playout_channels());
-  EXPECT_EQ(record_sample_rate(), playout_sample_rate());
-  NiceMock<MockAudioTransportAndroid> mock(kPlayout | kRecording);
-  std::unique_ptr<LatencyMeasuringAudioStream> latency_audio_stream(
-      new LatencyMeasuringAudioStream(playout_frames_per_10ms_buffer()));
-  mock.HandleCallbacks(test_is_done_.get(),
-                       latency_audio_stream.get(),
-                       kMeasureLatencyTimeInSec * kNumCallbacksPerSecond);
-  EXPECT_EQ(0, audio_device()->RegisterAudioCallback(&mock));
-  SetMaxPlayoutVolume();
-  DisableBuiltInAECIfAvailable();
-  StartRecording();
-  StartPlayout();
-  test_is_done_->Wait(std::max(kTestTimeOutInMilliseconds,
-                               1000 * kMeasureLatencyTimeInSec));
-  StopPlayout();
-  StopRecording();
-  // Verify that the correct number of transmitted impulses are detected.
-  EXPECT_EQ(latency_audio_stream->num_latency_values(),
-            static_cast<size_t>(
-                kImpulseFrequencyInHz * kMeasureLatencyTimeInSec - 1));
-  latency_audio_stream->PrintResults();
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_device/android/audio_manager.cc b/modules/audio_device/android/audio_manager.cc
deleted file mode 100644
index 60a1d9a..0000000
--- a/modules/audio_device/android/audio_manager.cc
+++ /dev/null
@@ -1,310 +0,0 @@
-/*
- *  Copyright (c) 2015 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_device/android/audio_manager.h"
-
-#include <utility>
-
-#include <android/log.h>
-
-#include "webrtc/modules/audio_device/android/audio_common.h"
-#include "webrtc/modules/utility/include/helpers_android.h"
-#include "webrtc/rtc_base/arraysize.h"
-#include "webrtc/rtc_base/checks.h"
-
-#define TAG "AudioManager"
-#define ALOGV(...) __android_log_print(ANDROID_LOG_VERBOSE, TAG, __VA_ARGS__)
-#define ALOGD(...) __android_log_print(ANDROID_LOG_DEBUG, TAG, __VA_ARGS__)
-#define ALOGE(...) __android_log_print(ANDROID_LOG_ERROR, TAG, __VA_ARGS__)
-#define ALOGW(...) __android_log_print(ANDROID_LOG_WARN, TAG, __VA_ARGS__)
-#define ALOGI(...) __android_log_print(ANDROID_LOG_INFO, TAG, __VA_ARGS__)
-
-namespace webrtc {
-
-// AudioManager::JavaAudioManager implementation
-AudioManager::JavaAudioManager::JavaAudioManager(
-    NativeRegistration* native_reg,
-    std::unique_ptr<GlobalRef> audio_manager)
-    : audio_manager_(std::move(audio_manager)),
-      init_(native_reg->GetMethodId("init", "()Z")),
-      dispose_(native_reg->GetMethodId("dispose", "()V")),
-      is_communication_mode_enabled_(
-          native_reg->GetMethodId("isCommunicationModeEnabled", "()Z")),
-      is_device_blacklisted_for_open_sles_usage_(
-          native_reg->GetMethodId("isDeviceBlacklistedForOpenSLESUsage",
-                                  "()Z")) {
-  ALOGD("JavaAudioManager::ctor%s", GetThreadInfo().c_str());
-}
-
-AudioManager::JavaAudioManager::~JavaAudioManager() {
-  ALOGD("JavaAudioManager::dtor%s", GetThreadInfo().c_str());
-}
-
-bool AudioManager::JavaAudioManager::Init() {
-  return audio_manager_->CallBooleanMethod(init_);
-}
-
-void AudioManager::JavaAudioManager::Close() {
-  audio_manager_->CallVoidMethod(dispose_);
-}
-
-bool AudioManager::JavaAudioManager::IsCommunicationModeEnabled() {
-  return audio_manager_->CallBooleanMethod(is_communication_mode_enabled_);
-}
-
-bool AudioManager::JavaAudioManager::IsDeviceBlacklistedForOpenSLESUsage() {
-  return audio_manager_->CallBooleanMethod(
-      is_device_blacklisted_for_open_sles_usage_);
-}
-
-// AudioManager implementation
-AudioManager::AudioManager()
-    : j_environment_(JVM::GetInstance()->environment()),
-      audio_layer_(AudioDeviceModule::kPlatformDefaultAudio),
-      initialized_(false),
-      hardware_aec_(false),
-      hardware_agc_(false),
-      hardware_ns_(false),
-      low_latency_playout_(false),
-      low_latency_record_(false),
-      delay_estimate_in_milliseconds_(0) {
-  ALOGD("ctor%s", GetThreadInfo().c_str());
-  RTC_CHECK(j_environment_);
-  JNINativeMethod native_methods[] = {
-      {"nativeCacheAudioParameters", "(IIIZZZZZZIIJ)V",
-       reinterpret_cast<void*>(&webrtc::AudioManager::CacheAudioParameters)}};
-  j_native_registration_ = j_environment_->RegisterNatives(
-      "org/webrtc/voiceengine/WebRtcAudioManager", native_methods,
-      arraysize(native_methods));
-  j_audio_manager_.reset(
-      new JavaAudioManager(j_native_registration_.get(),
-                           j_native_registration_->NewObject(
-                               "<init>", "(J)V", PointerTojlong(this))));
-}
-
-AudioManager::~AudioManager() {
-  ALOGD("~dtor%s", GetThreadInfo().c_str());
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  Close();
-}
-
-void AudioManager::SetActiveAudioLayer(
-    AudioDeviceModule::AudioLayer audio_layer) {
-  ALOGD("SetActiveAudioLayer(%d)%s", audio_layer, GetThreadInfo().c_str());
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  RTC_DCHECK(!initialized_);
-  // Store the currently utilized audio layer.
-  audio_layer_ = audio_layer;
-  // The delay estimate can take one of two fixed values depending on if the
-  // device supports low-latency output or not. However, it is also possible
-  // that the user explicitly selects the high-latency audio path, hence we use
-  // the selected |audio_layer| here to set the delay estimate.
-  delay_estimate_in_milliseconds_ =
-      (audio_layer == AudioDeviceModule::kAndroidJavaAudio) ?
-      kHighLatencyModeDelayEstimateInMilliseconds :
-      kLowLatencyModeDelayEstimateInMilliseconds;
-  ALOGD("delay_estimate_in_milliseconds: %d", delay_estimate_in_milliseconds_);
-}
-
-SLObjectItf AudioManager::GetOpenSLEngine() {
-  ALOGD("GetOpenSLEngine%s", GetThreadInfo().c_str());
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  // Only allow usage of OpenSL ES if such an audio layer has been specified.
-  if (audio_layer_ != AudioDeviceModule::kAndroidOpenSLESAudio &&
-      audio_layer_ !=
-          AudioDeviceModule::kAndroidJavaInputAndOpenSLESOutputAudio) {
-    ALOGI("Unable to create OpenSL engine for the current audio layer: %d",
-          audio_layer_);
-    return nullptr;
-  }
-  // OpenSL ES for Android only supports a single engine per application.
-  // If one already has been created, return existing object instead of
-  // creating a new.
-  if (engine_object_.Get() != nullptr) {
-    ALOGI("The OpenSL ES engine object has already been created");
-    return engine_object_.Get();
-  }
-  // Create the engine object in thread safe mode.
-  const SLEngineOption option[] = {
-      {SL_ENGINEOPTION_THREADSAFE, static_cast<SLuint32>(SL_BOOLEAN_TRUE)}};
-  SLresult result =
-      slCreateEngine(engine_object_.Receive(), 1, option, 0, NULL, NULL);
-  if (result != SL_RESULT_SUCCESS) {
-    ALOGE("slCreateEngine() failed: %s", GetSLErrorString(result));
-    engine_object_.Reset();
-    return nullptr;
-  }
-  // Realize the SL Engine in synchronous mode.
-  result = engine_object_->Realize(engine_object_.Get(), SL_BOOLEAN_FALSE);
-  if (result != SL_RESULT_SUCCESS) {
-    ALOGE("Realize() failed: %s", GetSLErrorString(result));
-    engine_object_.Reset();
-    return nullptr;
-  }
-  // Finally return the SLObjectItf interface of the engine object.
-  return engine_object_.Get();
-}
-
-bool AudioManager::Init() {
-  ALOGD("Init%s", GetThreadInfo().c_str());
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  RTC_DCHECK(!initialized_);
-  RTC_DCHECK_NE(audio_layer_, AudioDeviceModule::kPlatformDefaultAudio);
-  if (!j_audio_manager_->Init()) {
-    ALOGE("init failed!");
-    return false;
-  }
-  initialized_ = true;
-  return true;
-}
-
-bool AudioManager::Close() {
-  ALOGD("Close%s", GetThreadInfo().c_str());
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  if (!initialized_)
-    return true;
-  j_audio_manager_->Close();
-  initialized_ = false;
-  return true;
-}
-
-bool AudioManager::IsCommunicationModeEnabled() const {
-  ALOGD("IsCommunicationModeEnabled()");
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  return j_audio_manager_->IsCommunicationModeEnabled();
-}
-
-bool AudioManager::IsAcousticEchoCancelerSupported() const {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  return hardware_aec_;
-}
-
-bool AudioManager::IsAutomaticGainControlSupported() const {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  return hardware_agc_;
-}
-
-bool AudioManager::IsNoiseSuppressorSupported() const {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  return hardware_ns_;
-}
-
-bool AudioManager::IsLowLatencyPlayoutSupported() const {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  ALOGD("IsLowLatencyPlayoutSupported()");
-  // Some devices are blacklisted for usage of OpenSL ES even if they report
-  // that low-latency playout is supported. See b/21485703 for details.
-  return j_audio_manager_->IsDeviceBlacklistedForOpenSLESUsage() ?
-      false : low_latency_playout_;
-}
-
-bool AudioManager::IsLowLatencyRecordSupported() const {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  ALOGD("IsLowLatencyRecordSupported()");
-  return low_latency_record_;
-}
-
-bool AudioManager::IsProAudioSupported() const {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  ALOGD("IsProAudioSupported()");
-  // TODO(henrika): return the state independently of if OpenSL ES is
-  // blacklisted or not for now. We could use the same approach as in
-  // IsLowLatencyPlayoutSupported() but I can't see the need for it yet.
-  return pro_audio_;
-}
-
-bool AudioManager::IsStereoPlayoutSupported() const {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  ALOGD("IsStereoPlayoutSupported()");
-  return (playout_parameters_.channels() == 2);
-}
-
-bool AudioManager::IsStereoRecordSupported() const {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  ALOGD("IsStereoRecordSupported()");
-  return (record_parameters_.channels() == 2);
-}
-
-int AudioManager::GetDelayEstimateInMilliseconds() const {
-  return delay_estimate_in_milliseconds_;
-}
-
-void JNICALL AudioManager::CacheAudioParameters(JNIEnv* env,
-                                                jobject obj,
-                                                jint sample_rate,
-                                                jint output_channels,
-                                                jint input_channels,
-                                                jboolean hardware_aec,
-                                                jboolean hardware_agc,
-                                                jboolean hardware_ns,
-                                                jboolean low_latency_output,
-                                                jboolean low_latency_input,
-                                                jboolean pro_audio,
-                                                jint output_buffer_size,
-                                                jint input_buffer_size,
-                                                jlong native_audio_manager) {
-  webrtc::AudioManager* this_object =
-      reinterpret_cast<webrtc::AudioManager*>(native_audio_manager);
-  this_object->OnCacheAudioParameters(
-      env, sample_rate, output_channels, input_channels, hardware_aec,
-      hardware_agc, hardware_ns, low_latency_output, low_latency_input,
-      pro_audio, output_buffer_size, input_buffer_size);
-}
-
-void AudioManager::OnCacheAudioParameters(JNIEnv* env,
-                                          jint sample_rate,
-                                          jint output_channels,
-                                          jint input_channels,
-                                          jboolean hardware_aec,
-                                          jboolean hardware_agc,
-                                          jboolean hardware_ns,
-                                          jboolean low_latency_output,
-                                          jboolean low_latency_input,
-                                          jboolean pro_audio,
-                                          jint output_buffer_size,
-                                          jint input_buffer_size) {
-  ALOGD("OnCacheAudioParameters%s", GetThreadInfo().c_str());
-  ALOGD("hardware_aec: %d", hardware_aec);
-  ALOGD("hardware_agc: %d", hardware_agc);
-  ALOGD("hardware_ns: %d", hardware_ns);
-  ALOGD("low_latency_output: %d", low_latency_output);
-  ALOGD("low_latency_input: %d", low_latency_input);
-  ALOGD("pro_audio: %d", pro_audio);
-  ALOGD("sample_rate: %d", sample_rate);
-  ALOGD("output_channels: %d", output_channels);
-  ALOGD("input_channels: %d", input_channels);
-  ALOGD("output_buffer_size: %d", output_buffer_size);
-  ALOGD("input_buffer_size: %d", input_buffer_size);
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  hardware_aec_ = hardware_aec;
-  hardware_agc_ = hardware_agc;
-  hardware_ns_ = hardware_ns;
-  low_latency_playout_ = low_latency_output;
-  low_latency_record_ = low_latency_input;
-  pro_audio_ = pro_audio;
-  playout_parameters_.reset(sample_rate, static_cast<size_t>(output_channels),
-                            static_cast<size_t>(output_buffer_size));
-  record_parameters_.reset(sample_rate, static_cast<size_t>(input_channels),
-                           static_cast<size_t>(input_buffer_size));
-}
-
-const AudioParameters& AudioManager::GetPlayoutAudioParameters() {
-  RTC_CHECK(playout_parameters_.is_valid());
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  return playout_parameters_;
-}
-
-const AudioParameters& AudioManager::GetRecordAudioParameters() {
-  RTC_CHECK(record_parameters_.is_valid());
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  return record_parameters_;
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_device/android/audio_manager.h b/modules/audio_device/android/audio_manager.h
deleted file mode 100644
index 638b085..0000000
--- a/modules/audio_device/android/audio_manager.h
+++ /dev/null
@@ -1,216 +0,0 @@
-/*
- *  Copyright (c) 2015 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_DEVICE_ANDROID_AUDIO_MANAGER_H_
-#define WEBRTC_MODULES_AUDIO_DEVICE_ANDROID_AUDIO_MANAGER_H_
-
-#include <memory>
-
-#include <jni.h>
-#include <SLES/OpenSLES.h>
-
-#include "webrtc/modules/audio_device/android/audio_common.h"
-#include "webrtc/modules/audio_device/android/opensles_common.h"
-#include "webrtc/modules/audio_device/audio_device_config.h"
-#include "webrtc/modules/audio_device/audio_device_generic.h"
-#include "webrtc/modules/audio_device/include/audio_device_defines.h"
-#include "webrtc/modules/utility/include/helpers_android.h"
-#include "webrtc/modules/utility/include/jvm_android.h"
-#include "webrtc/rtc_base/thread_checker.h"
-
-namespace webrtc {
-
-// Implements support for functions in the WebRTC audio stack for Android that
-// relies on the AudioManager in android.media. It also populates an
-// AudioParameter structure with native audio parameters detected at
-// construction. This class does not make any audio-related modifications
-// unless Init() is called. Caching audio parameters makes no changes but only
-// reads data from the Java side.
-class AudioManager {
- public:
-  // Wraps the Java specific parts of the AudioManager into one helper class.
-  // Stores method IDs for all supported methods at construction and then
-  // allows calls like JavaAudioManager::Close() while hiding the Java/JNI
-  // parts that are associated with this call.
-  class JavaAudioManager {
-   public:
-    JavaAudioManager(NativeRegistration* native_registration,
-                     std::unique_ptr<GlobalRef> audio_manager);
-    ~JavaAudioManager();
-
-    bool Init();
-    void Close();
-    bool IsCommunicationModeEnabled();
-    bool IsDeviceBlacklistedForOpenSLESUsage();
-
-   private:
-    std::unique_ptr<GlobalRef> audio_manager_;
-    jmethodID init_;
-    jmethodID dispose_;
-    jmethodID is_communication_mode_enabled_;
-    jmethodID is_device_blacklisted_for_open_sles_usage_;
-  };
-
-  AudioManager();
-  ~AudioManager();
-
-  // Sets the currently active audio layer combination. Must be called before
-  // Init().
-  void SetActiveAudioLayer(AudioDeviceModule::AudioLayer audio_layer);
-
-  // Creates and realizes the main (global) Open SL engine object and returns
-  // a reference to it. The engine object is only created at the first call
-  // since OpenSL ES for Android only supports a single engine per application.
-  // Subsequent calls returns the already created engine. The SL engine object
-  // is destroyed when the AudioManager object is deleted. It means that the
-  // engine object will be the first OpenSL ES object to be created and last
-  // object to be destroyed.
-  // Note that NULL will be returned unless the audio layer is specified as
-  // AudioDeviceModule::kAndroidOpenSLESAudio or
-  // AudioDeviceModule::kAndroidJavaInputAndOpenSLESOutputAudio.
-  SLObjectItf GetOpenSLEngine();
-
-  // Initializes the audio manager and stores the current audio mode.
-  bool Init();
-  // Revert any setting done by Init().
-  bool Close();
-
-  // Returns true if current audio mode is AudioManager.MODE_IN_COMMUNICATION.
-  bool IsCommunicationModeEnabled() const;
-
-  // Native audio parameters stored during construction.
-  const AudioParameters& GetPlayoutAudioParameters();
-  const AudioParameters& GetRecordAudioParameters();
-
-  // Returns true if the device supports built-in audio effects for AEC, AGC
-  // and NS. Some devices can also be blacklisted for use in combination with
-  // platform effects and these devices will return false.
-  // Can currently only be used in combination with a Java based audio backend
-  // for the recoring side (i.e. using the android.media.AudioRecord API).
-  bool IsAcousticEchoCancelerSupported() const;
-  bool IsAutomaticGainControlSupported() const;
-  bool IsNoiseSuppressorSupported() const;
-
-  // Returns true if the device supports the low-latency audio paths in
-  // combination with OpenSL ES.
-  bool IsLowLatencyPlayoutSupported() const;
-  bool IsLowLatencyRecordSupported() const;
-
-  // Returns true if the device supports (and has been configured for) stereo.
-  // Call the Java API WebRtcAudioManager.setStereoOutput/Input() with true as
-  // paramter to enable stereo. Default is mono in both directions and the
-  // setting is set once and for all when the audio manager object is created.
-  // TODO(henrika): stereo is not supported in combination with OpenSL ES.
-  bool IsStereoPlayoutSupported() const;
-  bool IsStereoRecordSupported() const;
-
-  // Returns true if the device supports pro-audio features in combination with
-  // OpenSL ES.
-  bool IsProAudioSupported() const;
-
-  // Returns the estimated total delay of this device. Unit is in milliseconds.
-  // The vaule is set once at construction and never changes after that.
-  // Possible values are webrtc::kLowLatencyModeDelayEstimateInMilliseconds and
-  // webrtc::kHighLatencyModeDelayEstimateInMilliseconds.
-  int GetDelayEstimateInMilliseconds() const;
-
- private:
-  // Called from Java side so we can cache the native audio parameters.
-  // This method will be called by the WebRtcAudioManager constructor, i.e.
-  // on the same thread that this object is created on.
-  static void JNICALL CacheAudioParameters(JNIEnv* env,
-                                           jobject obj,
-                                           jint sample_rate,
-                                           jint output_channels,
-                                           jint input_channels,
-                                           jboolean hardware_aec,
-                                           jboolean hardware_agc,
-                                           jboolean hardware_ns,
-                                           jboolean low_latency_output,
-                                           jboolean low_latency_input,
-                                           jboolean pro_audio,
-                                           jint output_buffer_size,
-                                           jint input_buffer_size,
-                                           jlong native_audio_manager);
-  void OnCacheAudioParameters(JNIEnv* env,
-                              jint sample_rate,
-                              jint output_channels,
-                              jint input_channels,
-                              jboolean hardware_aec,
-                              jboolean hardware_agc,
-                              jboolean hardware_ns,
-                              jboolean low_latency_output,
-                              jboolean low_latency_input,
-                              jboolean pro_audio,
-                              jint output_buffer_size,
-                              jint input_buffer_size);
-
-  // Stores thread ID in the constructor.
-  // We can then use ThreadChecker::CalledOnValidThread() to ensure that
-  // other methods are called from the same thread.
-  rtc::ThreadChecker thread_checker_;
-
-  // Calls AttachCurrentThread() if this thread is not attached at construction.
-  // Also ensures that DetachCurrentThread() is called at destruction.
-  AttachCurrentThreadIfNeeded attach_thread_if_needed_;
-
-  // Wraps the JNI interface pointer and methods associated with it.
-  std::unique_ptr<JNIEnvironment> j_environment_;
-
-  // Contains factory method for creating the Java object.
-  std::unique_ptr<NativeRegistration> j_native_registration_;
-
-  // Wraps the Java specific parts of the AudioManager.
-  std::unique_ptr<AudioManager::JavaAudioManager> j_audio_manager_;
-
-  // Contains the selected audio layer specified by the AudioLayer enumerator
-  // in the AudioDeviceModule class.
-  AudioDeviceModule::AudioLayer audio_layer_;
-
-  // This object is the global entry point of the OpenSL ES API.
-  // After creating the engine object, the application can obtain this object‘s
-  // SLEngineItf interface. This interface contains creation methods for all
-  // the other object types in the API. None of these interface are realized
-  // by this class. It only provides access to the global engine object.
-  webrtc::ScopedSLObjectItf engine_object_;
-
-  // Set to true by Init() and false by Close().
-  bool initialized_;
-
-  // True if device supports hardware (or built-in) AEC.
-  bool hardware_aec_;
-  // True if device supports hardware (or built-in) AGC.
-  bool hardware_agc_;
-  // True if device supports hardware (or built-in) NS.
-  bool hardware_ns_;
-
-  // True if device supports the low-latency OpenSL ES audio path for output.
-  bool low_latency_playout_;
-
-  // True if device supports the low-latency OpenSL ES audio path for input.
-  bool low_latency_record_;
-
-  // True if device supports the low-latency OpenSL ES pro-audio path.
-  bool pro_audio_;
-
-  // The delay estimate can take one of two fixed values depending on if the
-  // device supports low-latency output or not.
-  int delay_estimate_in_milliseconds_;
-
-  // Contains native parameters (e.g. sample rate, channel configuration).
-  // Set at construction in OnCacheAudioParameters() which is called from
-  // Java on the same thread as this object is created on.
-  AudioParameters playout_parameters_;
-  AudioParameters record_parameters_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_DEVICE_ANDROID_AUDIO_MANAGER_H_
diff --git a/modules/audio_device/android/audio_manager_unittest.cc b/modules/audio_device/android/audio_manager_unittest.cc
deleted file mode 100644
index e82376d..0000000
--- a/modules/audio_device/android/audio_manager_unittest.cc
+++ /dev/null
@@ -1,241 +0,0 @@
-/*
- *  Copyright (c) 2015 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 <SLES/OpenSLES_Android.h>
-
-#include "webrtc/modules/audio_device/android/audio_manager.h"
-#include "webrtc/modules/audio_device/android/build_info.h"
-#include "webrtc/modules/audio_device/android/ensure_initialized.h"
-#include "webrtc/rtc_base/arraysize.h"
-#include "webrtc/rtc_base/format_macros.h"
-#include "webrtc/test/gtest.h"
-
-#define PRINT(...) fprintf(stderr, __VA_ARGS__);
-
-namespace webrtc {
-
-static const char kTag[] = "  ";
-
-class AudioManagerTest : public ::testing::Test {
- protected:
-  AudioManagerTest() {
-    // One-time initialization of JVM and application context. Ensures that we
-    // can do calls between C++ and Java.
-    webrtc::audiodevicemodule::EnsureInitialized();
-    audio_manager_.reset(new AudioManager());
-    SetActiveAudioLayer();
-    playout_parameters_ = audio_manager()->GetPlayoutAudioParameters();
-    record_parameters_ = audio_manager()->GetRecordAudioParameters();
-  }
-
-  AudioManager* audio_manager() const { return audio_manager_.get(); }
-
-  // A valid audio layer must always be set before calling Init(), hence we
-  // might as well make it a part of the test fixture.
-  void SetActiveAudioLayer() {
-    EXPECT_EQ(0, audio_manager()->GetDelayEstimateInMilliseconds());
-    audio_manager()->SetActiveAudioLayer(AudioDeviceModule::kAndroidJavaAudio);
-    EXPECT_NE(0, audio_manager()->GetDelayEstimateInMilliseconds());
-  }
-
-  // One way to ensure that the engine object is valid is to create an
-  // SL Engine interface since it exposes creation methods of all the OpenSL ES
-  // object types and it is only supported on the engine object. This method
-  // also verifies that the engine interface supports at least one interface.
-  // Note that, the test below is not a full test of the SLEngineItf object
-  // but only a simple sanity test to check that the global engine object is OK.
-  void ValidateSLEngine(SLObjectItf engine_object) {
-    EXPECT_NE(nullptr, engine_object);
-    // Get the SL Engine interface which is exposed by the engine object.
-    SLEngineItf engine;
-    SLresult result =
-        (*engine_object)->GetInterface(engine_object, SL_IID_ENGINE, &engine);
-    EXPECT_EQ(result, SL_RESULT_SUCCESS) << "GetInterface() on engine failed";
-    // Ensure that the SL Engine interface exposes at least one interface.
-    SLuint32 object_id = SL_OBJECTID_ENGINE;
-    SLuint32 num_supported_interfaces = 0;
-    result = (*engine)->QueryNumSupportedInterfaces(engine, object_id,
-                                                    &num_supported_interfaces);
-    EXPECT_EQ(result, SL_RESULT_SUCCESS)
-        << "QueryNumSupportedInterfaces() failed";
-    EXPECT_GE(num_supported_interfaces, 1u);
-  }
-
-  std::unique_ptr<AudioManager> audio_manager_;
-  AudioParameters playout_parameters_;
-  AudioParameters record_parameters_;
-};
-
-TEST_F(AudioManagerTest, ConstructDestruct) {
-}
-
-// It should not be possible to create an OpenSL engine object if Java based
-// audio is requested in both directions.
-TEST_F(AudioManagerTest, GetOpenSLEngineShouldFailForJavaAudioLayer) {
-  audio_manager()->SetActiveAudioLayer(AudioDeviceModule::kAndroidJavaAudio);
-  SLObjectItf engine_object = audio_manager()->GetOpenSLEngine();
-  EXPECT_EQ(nullptr, engine_object);
-}
-
-// It should be possible to create an OpenSL engine object if OpenSL ES based
-// audio is requested in any direction.
-TEST_F(AudioManagerTest, GetOpenSLEngineShouldSucceedForOpenSLESAudioLayer) {
-  // List of supported audio layers that uses OpenSL ES audio.
-  const AudioDeviceModule::AudioLayer opensles_audio[] = {
-      AudioDeviceModule::kAndroidOpenSLESAudio,
-      AudioDeviceModule::kAndroidJavaInputAndOpenSLESOutputAudio};
-  // Verify that the global (singleton) OpenSL Engine can be acquired for all
-  // audio layes that uses OpenSL ES. Note that the engine is only created once.
-  for (const AudioDeviceModule::AudioLayer audio_layer : opensles_audio) {
-    audio_manager()->SetActiveAudioLayer(audio_layer);
-    SLObjectItf engine_object = audio_manager()->GetOpenSLEngine();
-    EXPECT_NE(nullptr, engine_object);
-    // Perform a simple sanity check of the created engine object.
-    ValidateSLEngine(engine_object);
-  }
-}
-
-TEST_F(AudioManagerTest, InitClose) {
-  EXPECT_TRUE(audio_manager()->Init());
-  EXPECT_TRUE(audio_manager()->Close());
-}
-
-TEST_F(AudioManagerTest, IsAcousticEchoCancelerSupported) {
-  PRINT("%sAcoustic Echo Canceler support: %s\n", kTag,
-        audio_manager()->IsAcousticEchoCancelerSupported() ? "Yes" : "No");
-}
-
-TEST_F(AudioManagerTest, IsAutomaticGainControlSupported) {
-  EXPECT_FALSE(audio_manager()->IsAutomaticGainControlSupported());
-}
-
-TEST_F(AudioManagerTest, IsNoiseSuppressorSupported) {
-  PRINT("%sNoise Suppressor support: %s\n", kTag,
-        audio_manager()->IsNoiseSuppressorSupported() ? "Yes" : "No");
-}
-
-TEST_F(AudioManagerTest, IsLowLatencyPlayoutSupported) {
-  PRINT("%sLow latency output support: %s\n", kTag,
-        audio_manager()->IsLowLatencyPlayoutSupported() ? "Yes" : "No");
-}
-
-TEST_F(AudioManagerTest, IsLowLatencyRecordSupported) {
-  PRINT("%sLow latency input support: %s\n", kTag,
-        audio_manager()->IsLowLatencyRecordSupported() ? "Yes" : "No");
-}
-
-TEST_F(AudioManagerTest, IsProAudioSupported) {
-  PRINT("%sPro audio support: %s\n", kTag,
-        audio_manager()->IsProAudioSupported() ? "Yes" : "No");
-}
-
-// Verify that playout side is configured for mono by default.
-TEST_F(AudioManagerTest, IsStereoPlayoutSupported) {
-  EXPECT_FALSE(audio_manager()->IsStereoPlayoutSupported());
-}
-
-// Verify that recording side is configured for mono by default.
-TEST_F(AudioManagerTest, IsStereoRecordSupported) {
-  EXPECT_FALSE(audio_manager()->IsStereoRecordSupported());
-}
-
-TEST_F(AudioManagerTest, ShowAudioParameterInfo) {
-  const bool low_latency_out = audio_manager()->IsLowLatencyPlayoutSupported();
-  const bool low_latency_in = audio_manager()->IsLowLatencyRecordSupported();
-  PRINT("PLAYOUT:\n");
-  PRINT("%saudio layer: %s\n", kTag,
-        low_latency_out ? "Low latency OpenSL" : "Java/JNI based AudioTrack");
-  PRINT("%ssample rate: %d Hz\n", kTag, playout_parameters_.sample_rate());
-  PRINT("%schannels: %" PRIuS "\n", kTag, playout_parameters_.channels());
-  PRINT("%sframes per buffer: %" PRIuS " <=> %.2f ms\n", kTag,
-        playout_parameters_.frames_per_buffer(),
-        playout_parameters_.GetBufferSizeInMilliseconds());
-  PRINT("RECORD: \n");
-  PRINT("%saudio layer: %s\n", kTag,
-        low_latency_in ? "Low latency OpenSL" : "Java/JNI based AudioRecord");
-  PRINT("%ssample rate: %d Hz\n", kTag, record_parameters_.sample_rate());
-  PRINT("%schannels: %" PRIuS "\n", kTag, record_parameters_.channels());
-  PRINT("%sframes per buffer: %" PRIuS " <=> %.2f ms\n", kTag,
-        record_parameters_.frames_per_buffer(),
-        record_parameters_.GetBufferSizeInMilliseconds());
-}
-
-// The audio device module only suppors the same sample rate in both directions.
-// In addition, in full-duplex low-latency mode (OpenSL ES), both input and
-// output must use the same native buffer size to allow for usage of the fast
-// audio track in Android.
-TEST_F(AudioManagerTest, VerifyAudioParameters) {
-  const bool low_latency_out = audio_manager()->IsLowLatencyPlayoutSupported();
-  const bool low_latency_in = audio_manager()->IsLowLatencyRecordSupported();
-  EXPECT_EQ(playout_parameters_.sample_rate(),
-            record_parameters_.sample_rate());
-  if (low_latency_out && low_latency_in) {
-    EXPECT_EQ(playout_parameters_.frames_per_buffer(),
-              record_parameters_.frames_per_buffer());
-  }
-}
-
-// Add device-specific information to the test for logging purposes.
-TEST_F(AudioManagerTest, ShowDeviceInfo) {
-  BuildInfo build_info;
-  PRINT("%smodel: %s\n", kTag, build_info.GetDeviceModel().c_str());
-  PRINT("%sbrand: %s\n", kTag, build_info.GetBrand().c_str());
-  PRINT("%smanufacturer: %s\n",
-        kTag, build_info.GetDeviceManufacturer().c_str());
-}
-
-// Add Android build information to the test for logging purposes.
-TEST_F(AudioManagerTest, ShowBuildInfo) {
-  BuildInfo build_info;
-  PRINT("%sbuild release: %s\n", kTag, build_info.GetBuildRelease().c_str());
-  PRINT("%sbuild id: %s\n", kTag, build_info.GetAndroidBuildId().c_str());
-  PRINT("%sbuild type: %s\n", kTag, build_info.GetBuildType().c_str());
-  PRINT("%sSDK version: %d\n", kTag, build_info.GetSdkVersion());
-}
-
-// Basic test of the AudioParameters class using default construction where
-// all members are set to zero.
-TEST_F(AudioManagerTest, AudioParametersWithDefaultConstruction) {
-  AudioParameters params;
-  EXPECT_FALSE(params.is_valid());
-  EXPECT_EQ(0, params.sample_rate());
-  EXPECT_EQ(0U, params.channels());
-  EXPECT_EQ(0U, params.frames_per_buffer());
-  EXPECT_EQ(0U, params.frames_per_10ms_buffer());
-  EXPECT_EQ(0U, params.GetBytesPerFrame());
-  EXPECT_EQ(0U, params.GetBytesPerBuffer());
-  EXPECT_EQ(0U, params.GetBytesPer10msBuffer());
-  EXPECT_EQ(0.0f, params.GetBufferSizeInMilliseconds());
-}
-
-// Basic test of the AudioParameters class using non default construction.
-TEST_F(AudioManagerTest, AudioParametersWithNonDefaultConstruction) {
-  const int kSampleRate = 48000;
-  const size_t kChannels = 1;
-  const size_t kFramesPerBuffer = 480;
-  const size_t kFramesPer10msBuffer = 480;
-  const size_t kBytesPerFrame = 2;
-  const float kBufferSizeInMs = 10.0f;
-  AudioParameters params(kSampleRate, kChannels, kFramesPerBuffer);
-  EXPECT_TRUE(params.is_valid());
-  EXPECT_EQ(kSampleRate, params.sample_rate());
-  EXPECT_EQ(kChannels, params.channels());
-  EXPECT_EQ(kFramesPerBuffer, params.frames_per_buffer());
-  EXPECT_EQ(static_cast<size_t>(kSampleRate / 100),
-            params.frames_per_10ms_buffer());
-  EXPECT_EQ(kBytesPerFrame, params.GetBytesPerFrame());
-  EXPECT_EQ(kBytesPerFrame * kFramesPerBuffer, params.GetBytesPerBuffer());
-  EXPECT_EQ(kBytesPerFrame * kFramesPer10msBuffer,
-            params.GetBytesPer10msBuffer());
-  EXPECT_EQ(kBufferSizeInMs, params.GetBufferSizeInMilliseconds());
-}
-
-}  // namespace webrtc
-
diff --git a/modules/audio_device/android/audio_record_jni.cc b/modules/audio_device/android/audio_record_jni.cc
deleted file mode 100644
index ad8c027..0000000
--- a/modules/audio_device/android/audio_record_jni.cc
+++ /dev/null
@@ -1,256 +0,0 @@
-/*
- *  Copyright (c) 2013 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_device/android/audio_record_jni.h"
-
-#include <utility>
-
-#include <android/log.h>
-
-#include "webrtc/modules/audio_device/android/audio_common.h"
-#include "webrtc/rtc_base/arraysize.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/format_macros.h"
-
-#define TAG "AudioRecordJni"
-#define ALOGV(...) __android_log_print(ANDROID_LOG_VERBOSE, TAG, __VA_ARGS__)
-#define ALOGD(...) __android_log_print(ANDROID_LOG_DEBUG, TAG, __VA_ARGS__)
-#define ALOGE(...) __android_log_print(ANDROID_LOG_ERROR, TAG, __VA_ARGS__)
-#define ALOGW(...) __android_log_print(ANDROID_LOG_WARN, TAG, __VA_ARGS__)
-#define ALOGI(...) __android_log_print(ANDROID_LOG_INFO, TAG, __VA_ARGS__)
-
-namespace webrtc {
-
-// AudioRecordJni::JavaAudioRecord implementation.
-AudioRecordJni::JavaAudioRecord::JavaAudioRecord(
-    NativeRegistration* native_reg,
-    std::unique_ptr<GlobalRef> audio_record)
-    : audio_record_(std::move(audio_record)),
-      init_recording_(native_reg->GetMethodId("initRecording", "(II)I")),
-      start_recording_(native_reg->GetMethodId("startRecording", "()Z")),
-      stop_recording_(native_reg->GetMethodId("stopRecording", "()Z")),
-      enable_built_in_aec_(native_reg->GetMethodId("enableBuiltInAEC", "(Z)Z")),
-      enable_built_in_ns_(native_reg->GetMethodId("enableBuiltInNS", "(Z)Z")) {}
-
-AudioRecordJni::JavaAudioRecord::~JavaAudioRecord() {}
-
-int AudioRecordJni::JavaAudioRecord::InitRecording(
-    int sample_rate, size_t channels) {
-  return audio_record_->CallIntMethod(init_recording_,
-                                      static_cast<jint>(sample_rate),
-                                      static_cast<jint>(channels));
-}
-
-bool AudioRecordJni::JavaAudioRecord::StartRecording() {
-  return audio_record_->CallBooleanMethod(start_recording_);
-}
-
-bool AudioRecordJni::JavaAudioRecord::StopRecording() {
-  return audio_record_->CallBooleanMethod(stop_recording_);
-}
-
-bool AudioRecordJni::JavaAudioRecord::EnableBuiltInAEC(bool enable) {
-  return audio_record_->CallBooleanMethod(enable_built_in_aec_,
-                                          static_cast<jboolean>(enable));
-}
-
-bool AudioRecordJni::JavaAudioRecord::EnableBuiltInNS(bool enable) {
-  return audio_record_->CallBooleanMethod(enable_built_in_ns_,
-                                          static_cast<jboolean>(enable));
-}
-
-// AudioRecordJni implementation.
-AudioRecordJni::AudioRecordJni(AudioManager* audio_manager)
-    : j_environment_(JVM::GetInstance()->environment()),
-      audio_manager_(audio_manager),
-      audio_parameters_(audio_manager->GetRecordAudioParameters()),
-      total_delay_in_milliseconds_(0),
-      direct_buffer_address_(nullptr),
-      direct_buffer_capacity_in_bytes_(0),
-      frames_per_buffer_(0),
-      initialized_(false),
-      recording_(false),
-      audio_device_buffer_(nullptr) {
-  ALOGD("ctor%s", GetThreadInfo().c_str());
-  RTC_DCHECK(audio_parameters_.is_valid());
-  RTC_CHECK(j_environment_);
-  JNINativeMethod native_methods[] = {
-      {"nativeCacheDirectBufferAddress", "(Ljava/nio/ByteBuffer;J)V",
-      reinterpret_cast<void*>(
-          &webrtc::AudioRecordJni::CacheDirectBufferAddress)},
-      {"nativeDataIsRecorded", "(IJ)V",
-      reinterpret_cast<void*>(&webrtc::AudioRecordJni::DataIsRecorded)}};
-  j_native_registration_ = j_environment_->RegisterNatives(
-      "org/webrtc/voiceengine/WebRtcAudioRecord", native_methods,
-      arraysize(native_methods));
-  j_audio_record_.reset(
-      new JavaAudioRecord(j_native_registration_.get(),
-                          j_native_registration_->NewObject(
-                              "<init>", "(J)V", PointerTojlong(this))));
-  // Detach from this thread since we want to use the checker to verify calls
-  // from the Java based audio thread.
-  thread_checker_java_.DetachFromThread();
-}
-
-AudioRecordJni::~AudioRecordJni() {
-  ALOGD("~dtor%s", GetThreadInfo().c_str());
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  Terminate();
-}
-
-int32_t AudioRecordJni::Init() {
-  ALOGD("Init%s", GetThreadInfo().c_str());
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  return 0;
-}
-
-int32_t AudioRecordJni::Terminate() {
-  ALOGD("Terminate%s", GetThreadInfo().c_str());
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  StopRecording();
-  return 0;
-}
-
-int32_t AudioRecordJni::InitRecording() {
-  ALOGD("InitRecording%s", GetThreadInfo().c_str());
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  RTC_DCHECK(!initialized_);
-  RTC_DCHECK(!recording_);
-  int frames_per_buffer = j_audio_record_->InitRecording(
-      audio_parameters_.sample_rate(), audio_parameters_.channels());
-  if (frames_per_buffer < 0) {
-    ALOGE("InitRecording failed!");
-    return -1;
-  }
-  frames_per_buffer_ = static_cast<size_t>(frames_per_buffer);
-  ALOGD("frames_per_buffer: %" PRIuS, frames_per_buffer_);
-  const size_t bytes_per_frame = audio_parameters_.channels() * sizeof(int16_t);
-  RTC_CHECK_EQ(direct_buffer_capacity_in_bytes_,
-               frames_per_buffer_ * bytes_per_frame);
-  RTC_CHECK_EQ(frames_per_buffer_, audio_parameters_.frames_per_10ms_buffer());
-  initialized_ = true;
-  return 0;
-}
-
-int32_t AudioRecordJni::StartRecording() {
-  ALOGD("StartRecording%s", GetThreadInfo().c_str());
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  RTC_DCHECK(initialized_);
-  RTC_DCHECK(!recording_);
-  if (!j_audio_record_->StartRecording()) {
-    ALOGE("StartRecording failed!");
-    return -1;
-  }
-  recording_ = true;
-  return 0;
-}
-
-int32_t AudioRecordJni::StopRecording() {
-  ALOGD("StopRecording%s", GetThreadInfo().c_str());
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  if (!initialized_ || !recording_) {
-    return 0;
-  }
-  if (!j_audio_record_->StopRecording()) {
-    ALOGE("StopRecording failed!");
-    return -1;
-  }
-  // If we don't detach here, we will hit a RTC_DCHECK in OnDataIsRecorded()
-  // next time StartRecording() is called since it will create a new Java
-  // thread.
-  thread_checker_java_.DetachFromThread();
-  initialized_ = false;
-  recording_ = false;
-  direct_buffer_address_= nullptr;
-  return 0;
-}
-
-void AudioRecordJni::AttachAudioBuffer(AudioDeviceBuffer* audioBuffer) {
-  ALOGD("AttachAudioBuffer");
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  audio_device_buffer_ = audioBuffer;
-  const int sample_rate_hz = audio_parameters_.sample_rate();
-  ALOGD("SetRecordingSampleRate(%d)", sample_rate_hz);
-  audio_device_buffer_->SetRecordingSampleRate(sample_rate_hz);
-  const size_t channels = audio_parameters_.channels();
-  ALOGD("SetRecordingChannels(%" PRIuS ")", channels);
-  audio_device_buffer_->SetRecordingChannels(channels);
-  total_delay_in_milliseconds_ =
-      audio_manager_->GetDelayEstimateInMilliseconds();
-  RTC_DCHECK_GT(total_delay_in_milliseconds_, 0);
-  ALOGD("total_delay_in_milliseconds: %d", total_delay_in_milliseconds_);
-}
-
-int32_t AudioRecordJni::EnableBuiltInAEC(bool enable) {
-  ALOGD("EnableBuiltInAEC%s", GetThreadInfo().c_str());
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  return j_audio_record_->EnableBuiltInAEC(enable) ? 0 : -1;
-}
-
-int32_t AudioRecordJni::EnableBuiltInAGC(bool enable) {
-  // TODO(henrika): possibly remove when no longer used by any client.
-  FATAL() << "Should never be called";
-  return -1;
-}
-
-int32_t AudioRecordJni::EnableBuiltInNS(bool enable) {
-  ALOGD("EnableBuiltInNS%s", GetThreadInfo().c_str());
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  return j_audio_record_->EnableBuiltInNS(enable) ? 0 : -1;
-}
-
-void JNICALL AudioRecordJni::CacheDirectBufferAddress(
-    JNIEnv* env, jobject obj, jobject byte_buffer, jlong nativeAudioRecord) {
-  webrtc::AudioRecordJni* this_object =
-      reinterpret_cast<webrtc::AudioRecordJni*> (nativeAudioRecord);
-  this_object->OnCacheDirectBufferAddress(env, byte_buffer);
-}
-
-void AudioRecordJni::OnCacheDirectBufferAddress(
-    JNIEnv* env, jobject byte_buffer) {
-  ALOGD("OnCacheDirectBufferAddress");
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  RTC_DCHECK(!direct_buffer_address_);
-  direct_buffer_address_ =
-      env->GetDirectBufferAddress(byte_buffer);
-  jlong capacity = env->GetDirectBufferCapacity(byte_buffer);
-  ALOGD("direct buffer capacity: %lld", capacity);
-  direct_buffer_capacity_in_bytes_ = static_cast<size_t>(capacity);
-}
-
-void JNICALL AudioRecordJni::DataIsRecorded(
-  JNIEnv* env, jobject obj, jint length, jlong nativeAudioRecord) {
-  webrtc::AudioRecordJni* this_object =
-      reinterpret_cast<webrtc::AudioRecordJni*> (nativeAudioRecord);
-  this_object->OnDataIsRecorded(length);
-}
-
-// This method is called on a high-priority thread from Java. The name of
-// the thread is 'AudioRecordThread'.
-void AudioRecordJni::OnDataIsRecorded(int length) {
-  RTC_DCHECK(thread_checker_java_.CalledOnValidThread());
-  if (!audio_device_buffer_) {
-    ALOGE("AttachAudioBuffer has not been called!");
-    return;
-  }
-  audio_device_buffer_->SetRecordedBuffer(direct_buffer_address_,
-                                          frames_per_buffer_);
-  // We provide one (combined) fixed delay estimate for the APM and use the
-  // |playDelayMs| parameter only. Components like the AEC only sees the sum
-  // of |playDelayMs| and |recDelayMs|, hence the distributions does not matter.
-  audio_device_buffer_->SetVQEData(total_delay_in_milliseconds_,
-                                   0,   // recDelayMs
-                                   0);  // clockDrift
-  if (audio_device_buffer_->DeliverRecordedData() == -1) {
-    ALOGE("AudioDeviceBuffer::DeliverRecordedData failed!");
-  }
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_device/android/audio_record_jni.h b/modules/audio_device/android/audio_record_jni.h
deleted file mode 100644
index 385c9ad..0000000
--- a/modules/audio_device/android/audio_record_jni.h
+++ /dev/null
@@ -1,163 +0,0 @@
-/*
- *  Copyright (c) 2013 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_DEVICE_ANDROID_AUDIO_RECORD_JNI_H_
-#define WEBRTC_MODULES_AUDIO_DEVICE_ANDROID_AUDIO_RECORD_JNI_H_
-
-#include <memory>
-
-#include <jni.h>
-
-#include "webrtc/modules/audio_device/android/audio_manager.h"
-#include "webrtc/modules/audio_device/audio_device_generic.h"
-#include "webrtc/modules/audio_device/include/audio_device_defines.h"
-#include "webrtc/modules/utility/include/helpers_android.h"
-#include "webrtc/modules/utility/include/jvm_android.h"
-#include "webrtc/rtc_base/thread_checker.h"
-
-namespace webrtc {
-
-// Implements 16-bit mono PCM audio input support for Android using the Java
-// AudioRecord interface. Most of the work is done by its Java counterpart in
-// WebRtcAudioRecord.java. This class is created and lives on a thread in
-// C++-land, but recorded audio buffers are delivered on a high-priority
-// thread managed by the Java class.
-//
-// The Java class makes use of AudioEffect features (mainly AEC) which are
-// first available in Jelly Bean. If it is instantiated running against earlier
-// SDKs, the AEC provided by the APM in WebRTC must be used and enabled
-// separately instead.
-//
-// An instance must be created and destroyed on one and the same thread.
-// All public methods must also be called on the same thread. A thread checker
-// will RTC_DCHECK if any method is called on an invalid thread.
-//
-// This class uses AttachCurrentThreadIfNeeded to attach to a Java VM if needed
-// and detach when the object goes out of scope. Additional thread checking
-// guarantees that no other (possibly non attached) thread is used.
-class AudioRecordJni {
- public:
-  // Wraps the Java specific parts of the AudioRecordJni into one helper class.
-  class JavaAudioRecord {
-   public:
-    JavaAudioRecord(NativeRegistration* native_registration,
-                   std::unique_ptr<GlobalRef> audio_track);
-    ~JavaAudioRecord();
-
-    int InitRecording(int sample_rate, size_t channels);
-    bool StartRecording();
-    bool StopRecording();
-    bool EnableBuiltInAEC(bool enable);
-    bool EnableBuiltInNS(bool enable);
-
-   private:
-    std::unique_ptr<GlobalRef> audio_record_;
-    jmethodID init_recording_;
-    jmethodID start_recording_;
-    jmethodID stop_recording_;
-    jmethodID enable_built_in_aec_;
-    jmethodID enable_built_in_ns_;
-  };
-
-  explicit AudioRecordJni(AudioManager* audio_manager);
-  ~AudioRecordJni();
-
-  int32_t Init();
-  int32_t Terminate();
-
-  int32_t InitRecording();
-  bool RecordingIsInitialized() const { return initialized_; }
-
-  int32_t StartRecording();
-  int32_t StopRecording();
-  bool Recording() const { return recording_; }
-
-  void AttachAudioBuffer(AudioDeviceBuffer* audioBuffer);
-
-  int32_t EnableBuiltInAEC(bool enable);
-  int32_t EnableBuiltInAGC(bool enable);
-  int32_t EnableBuiltInNS(bool enable);
-
- private:
-  // Called from Java side so we can cache the address of the Java-manged
-  // |byte_buffer| in |direct_buffer_address_|. The size of the buffer
-  // is also stored in |direct_buffer_capacity_in_bytes_|.
-  // This method will be called by the WebRtcAudioRecord constructor, i.e.,
-  // on the same thread that this object is created on.
-  static void JNICALL CacheDirectBufferAddress(
-    JNIEnv* env, jobject obj, jobject byte_buffer, jlong nativeAudioRecord);
-  void OnCacheDirectBufferAddress(JNIEnv* env, jobject byte_buffer);
-
-  // Called periodically by the Java based WebRtcAudioRecord object when
-  // recording has started. Each call indicates that there are |length| new
-  // bytes recorded in the memory area |direct_buffer_address_| and it is
-  // now time to send these to the consumer.
-  // This method is called on a high-priority thread from Java. The name of
-  // the thread is 'AudioRecordThread'.
-  static void JNICALL DataIsRecorded(
-    JNIEnv* env, jobject obj, jint length, jlong nativeAudioRecord);
-  void OnDataIsRecorded(int length);
-
-  // Stores thread ID in constructor.
-  rtc::ThreadChecker thread_checker_;
-
-  // Stores thread ID in first call to OnDataIsRecorded() from high-priority
-  // thread in Java. Detached during construction of this object.
-  rtc::ThreadChecker thread_checker_java_;
-
-  // Calls AttachCurrentThread() if this thread is not attached at construction.
-  // Also ensures that DetachCurrentThread() is called at destruction.
-  AttachCurrentThreadIfNeeded attach_thread_if_needed_;
-
-  // Wraps the JNI interface pointer and methods associated with it.
-  std::unique_ptr<JNIEnvironment> j_environment_;
-
-  // Contains factory method for creating the Java object.
-  std::unique_ptr<NativeRegistration> j_native_registration_;
-
-  // Wraps the Java specific parts of the AudioRecordJni class.
-  std::unique_ptr<AudioRecordJni::JavaAudioRecord> j_audio_record_;
-
-  // Raw pointer to the audio manger.
-  const AudioManager* audio_manager_;
-
-  // Contains audio parameters provided to this class at construction by the
-  // AudioManager.
-  const AudioParameters audio_parameters_;
-
-  // Delay estimate of the total round-trip delay (input + output).
-  // Fixed value set once in AttachAudioBuffer() and it can take one out of two
-  // possible values. See audio_common.h for details.
-  int total_delay_in_milliseconds_;
-
-  // Cached copy of address to direct audio buffer owned by |j_audio_record_|.
-  void* direct_buffer_address_;
-
-  // Number of bytes in the direct audio buffer owned by |j_audio_record_|.
-  size_t direct_buffer_capacity_in_bytes_;
-
-  // Number audio frames per audio buffer. Each audio frame corresponds to
-  // one sample of PCM mono data at 16 bits per sample. Hence, each audio
-  // frame contains 2 bytes (given that the Java layer only supports mono).
-  // Example: 480 for 48000 Hz or 441 for 44100 Hz.
-  size_t frames_per_buffer_;
-
-  bool initialized_;
-
-  bool recording_;
-
-  // Raw pointer handle provided to us in AttachAudioBuffer(). Owned by the
-  // AudioDeviceModuleImpl class and called by AudioDeviceModule::Create().
-  AudioDeviceBuffer* audio_device_buffer_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_DEVICE_ANDROID_AUDIO_RECORD_JNI_H_
diff --git a/modules/audio_device/android/audio_track_jni.cc b/modules/audio_device/android/audio_track_jni.cc
deleted file mode 100644
index e4a2198..0000000
--- a/modules/audio_device/android/audio_track_jni.cc
+++ /dev/null
@@ -1,264 +0,0 @@
-/*
- *  Copyright (c) 2013 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_device/android/audio_manager.h"
-#include "webrtc/modules/audio_device/android/audio_track_jni.h"
-
-#include <utility>
-
-#include <android/log.h>
-
-#include "webrtc/rtc_base/arraysize.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/format_macros.h"
-
-#define TAG "AudioTrackJni"
-#define ALOGV(...) __android_log_print(ANDROID_LOG_VERBOSE, TAG, __VA_ARGS__)
-#define ALOGD(...) __android_log_print(ANDROID_LOG_DEBUG, TAG, __VA_ARGS__)
-#define ALOGE(...) __android_log_print(ANDROID_LOG_ERROR, TAG, __VA_ARGS__)
-#define ALOGW(...) __android_log_print(ANDROID_LOG_WARN, TAG, __VA_ARGS__)
-#define ALOGI(...) __android_log_print(ANDROID_LOG_INFO, TAG, __VA_ARGS__)
-
-namespace webrtc {
-
-// AudioTrackJni::JavaAudioTrack implementation.
-AudioTrackJni::JavaAudioTrack::JavaAudioTrack(
-    NativeRegistration* native_reg,
-    std::unique_ptr<GlobalRef> audio_track)
-    : audio_track_(std::move(audio_track)),
-      init_playout_(native_reg->GetMethodId("initPlayout", "(II)Z")),
-      start_playout_(native_reg->GetMethodId("startPlayout", "()Z")),
-      stop_playout_(native_reg->GetMethodId("stopPlayout", "()Z")),
-      set_stream_volume_(native_reg->GetMethodId("setStreamVolume", "(I)Z")),
-      get_stream_max_volume_(
-          native_reg->GetMethodId("getStreamMaxVolume", "()I")),
-      get_stream_volume_(native_reg->GetMethodId("getStreamVolume", "()I")) {}
-
-AudioTrackJni::JavaAudioTrack::~JavaAudioTrack() {}
-
-bool AudioTrackJni::JavaAudioTrack::InitPlayout(int sample_rate, int channels) {
-  return audio_track_->CallBooleanMethod(init_playout_, sample_rate, channels);
-}
-
-bool AudioTrackJni::JavaAudioTrack::StartPlayout() {
-  return audio_track_->CallBooleanMethod(start_playout_);
-}
-
-bool AudioTrackJni::JavaAudioTrack::StopPlayout() {
-  return audio_track_->CallBooleanMethod(stop_playout_);
-}
-
-bool AudioTrackJni::JavaAudioTrack::SetStreamVolume(int volume) {
-  return audio_track_->CallBooleanMethod(set_stream_volume_, volume);
-}
-
-int AudioTrackJni::JavaAudioTrack::GetStreamMaxVolume() {
-  return audio_track_->CallIntMethod(get_stream_max_volume_);
-}
-
-int AudioTrackJni::JavaAudioTrack::GetStreamVolume() {
-  return audio_track_->CallIntMethod(get_stream_volume_);
-}
-
-// TODO(henrika): possible extend usage of AudioManager and add it as member.
-AudioTrackJni::AudioTrackJni(AudioManager* audio_manager)
-    : j_environment_(JVM::GetInstance()->environment()),
-      audio_parameters_(audio_manager->GetPlayoutAudioParameters()),
-      direct_buffer_address_(nullptr),
-      direct_buffer_capacity_in_bytes_(0),
-      frames_per_buffer_(0),
-      initialized_(false),
-      playing_(false),
-      audio_device_buffer_(nullptr) {
-  ALOGD("ctor%s", GetThreadInfo().c_str());
-  RTC_DCHECK(audio_parameters_.is_valid());
-  RTC_CHECK(j_environment_);
-  JNINativeMethod native_methods[] = {
-      {"nativeCacheDirectBufferAddress", "(Ljava/nio/ByteBuffer;J)V",
-      reinterpret_cast<void*>(
-          &webrtc::AudioTrackJni::CacheDirectBufferAddress)},
-      {"nativeGetPlayoutData", "(IJ)V",
-      reinterpret_cast<void*>(&webrtc::AudioTrackJni::GetPlayoutData)}};
-  j_native_registration_ = j_environment_->RegisterNatives(
-      "org/webrtc/voiceengine/WebRtcAudioTrack", native_methods,
-      arraysize(native_methods));
-  j_audio_track_.reset(
-      new JavaAudioTrack(j_native_registration_.get(),
-                         j_native_registration_->NewObject(
-                             "<init>", "(J)V", PointerTojlong(this))));
-  // Detach from this thread since we want to use the checker to verify calls
-  // from the Java based audio thread.
-  thread_checker_java_.DetachFromThread();
-}
-
-AudioTrackJni::~AudioTrackJni() {
-  ALOGD("~dtor%s", GetThreadInfo().c_str());
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  Terminate();
-}
-
-int32_t AudioTrackJni::Init() {
-  ALOGD("Init%s", GetThreadInfo().c_str());
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  return 0;
-}
-
-int32_t AudioTrackJni::Terminate() {
-  ALOGD("Terminate%s", GetThreadInfo().c_str());
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  StopPlayout();
-  return 0;
-}
-
-int32_t AudioTrackJni::InitPlayout() {
-  ALOGD("InitPlayout%s", GetThreadInfo().c_str());
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  RTC_DCHECK(!initialized_);
-  RTC_DCHECK(!playing_);
-  if (!j_audio_track_->InitPlayout(
-      audio_parameters_.sample_rate(), audio_parameters_.channels())) {
-    ALOGE("InitPlayout failed!");
-    return -1;
-  }
-  initialized_ = true;
-  return 0;
-}
-
-int32_t AudioTrackJni::StartPlayout() {
-  ALOGD("StartPlayout%s", GetThreadInfo().c_str());
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  RTC_DCHECK(initialized_);
-  RTC_DCHECK(!playing_);
-  if (!j_audio_track_->StartPlayout()) {
-    ALOGE("StartPlayout failed!");
-    return -1;
-  }
-  playing_ = true;
-  return 0;
-}
-
-int32_t AudioTrackJni::StopPlayout() {
-  ALOGD("StopPlayout%s", GetThreadInfo().c_str());
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  if (!initialized_ || !playing_) {
-    return 0;
-  }
-  if (!j_audio_track_->StopPlayout()) {
-    ALOGE("StopPlayout failed!");
-    return -1;
-  }
-  // If we don't detach here, we will hit a RTC_DCHECK in OnDataIsRecorded()
-  // next time StartRecording() is called since it will create a new Java
-  // thread.
-  thread_checker_java_.DetachFromThread();
-  initialized_ = false;
-  playing_ = false;
-  direct_buffer_address_ = nullptr;
-  return 0;
-}
-
-int AudioTrackJni::SpeakerVolumeIsAvailable(bool& available) {
-  available = true;
-  return 0;
-}
-
-int AudioTrackJni::SetSpeakerVolume(uint32_t volume) {
-  ALOGD("SetSpeakerVolume(%d)%s", volume, GetThreadInfo().c_str());
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  return j_audio_track_->SetStreamVolume(volume) ? 0 : -1;
-}
-
-int AudioTrackJni::MaxSpeakerVolume(uint32_t& max_volume) const {
-  ALOGD("MaxSpeakerVolume%s", GetThreadInfo().c_str());
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  max_volume = j_audio_track_->GetStreamMaxVolume();
-  return 0;
-}
-
-int AudioTrackJni::MinSpeakerVolume(uint32_t& min_volume) const {
-  ALOGD("MaxSpeakerVolume%s", GetThreadInfo().c_str());
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  min_volume = 0;
-  return 0;
-}
-
-int AudioTrackJni::SpeakerVolume(uint32_t& volume) const {
-  ALOGD("SpeakerVolume%s", GetThreadInfo().c_str());
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  volume = j_audio_track_->GetStreamVolume();
-  return 0;
-}
-
-// TODO(henrika): possibly add stereo support.
-void AudioTrackJni::AttachAudioBuffer(AudioDeviceBuffer* audioBuffer) {
-  ALOGD("AttachAudioBuffer%s", GetThreadInfo().c_str());
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  audio_device_buffer_ = audioBuffer;
-  const int sample_rate_hz = audio_parameters_.sample_rate();
-  ALOGD("SetPlayoutSampleRate(%d)", sample_rate_hz);
-  audio_device_buffer_->SetPlayoutSampleRate(sample_rate_hz);
-  const size_t channels = audio_parameters_.channels();
-  ALOGD("SetPlayoutChannels(%" PRIuS ")", channels);
-  audio_device_buffer_->SetPlayoutChannels(channels);
-}
-
-void JNICALL AudioTrackJni::CacheDirectBufferAddress(
-    JNIEnv* env, jobject obj, jobject byte_buffer, jlong nativeAudioTrack) {
-  webrtc::AudioTrackJni* this_object =
-      reinterpret_cast<webrtc::AudioTrackJni*> (nativeAudioTrack);
-  this_object->OnCacheDirectBufferAddress(env, byte_buffer);
-}
-
-void AudioTrackJni::OnCacheDirectBufferAddress(
-    JNIEnv* env, jobject byte_buffer) {
-  ALOGD("OnCacheDirectBufferAddress");
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  RTC_DCHECK(!direct_buffer_address_);
-  direct_buffer_address_ =
-      env->GetDirectBufferAddress(byte_buffer);
-  jlong capacity = env->GetDirectBufferCapacity(byte_buffer);
-  ALOGD("direct buffer capacity: %lld", capacity);
-  direct_buffer_capacity_in_bytes_ = static_cast<size_t>(capacity);
-  const size_t bytes_per_frame = audio_parameters_.channels() * sizeof(int16_t);
-  frames_per_buffer_ = direct_buffer_capacity_in_bytes_ / bytes_per_frame;
-  ALOGD("frames_per_buffer: %" PRIuS, frames_per_buffer_);
-}
-
-void JNICALL AudioTrackJni::GetPlayoutData(
-  JNIEnv* env, jobject obj, jint length, jlong nativeAudioTrack) {
-  webrtc::AudioTrackJni* this_object =
-      reinterpret_cast<webrtc::AudioTrackJni*> (nativeAudioTrack);
-  this_object->OnGetPlayoutData(static_cast<size_t>(length));
-}
-
-// This method is called on a high-priority thread from Java. The name of
-// the thread is 'AudioRecordTrack'.
-void AudioTrackJni::OnGetPlayoutData(size_t length) {
-  RTC_DCHECK(thread_checker_java_.CalledOnValidThread());
-  const size_t bytes_per_frame = audio_parameters_.channels() * sizeof(int16_t);
-  RTC_DCHECK_EQ(frames_per_buffer_, length / bytes_per_frame);
-  if (!audio_device_buffer_) {
-    ALOGE("AttachAudioBuffer has not been called!");
-    return;
-  }
-  // Pull decoded data (in 16-bit PCM format) from jitter buffer.
-  int samples = audio_device_buffer_->RequestPlayoutData(frames_per_buffer_);
-  if (samples <= 0) {
-    ALOGE("AudioDeviceBuffer::RequestPlayoutData failed!");
-    return;
-  }
-  RTC_DCHECK_EQ(samples, frames_per_buffer_);
-  // Copy decoded data into common byte buffer to ensure that it can be
-  // written to the Java based audio track.
-  samples = audio_device_buffer_->GetPlayoutData(direct_buffer_address_);
-  RTC_DCHECK_EQ(length, bytes_per_frame * samples);
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_device/android/audio_track_jni.h b/modules/audio_device/android/audio_track_jni.h
deleted file mode 100644
index 392299b..0000000
--- a/modules/audio_device/android/audio_track_jni.h
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
- *  Copyright (c) 2013 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_DEVICE_ANDROID_AUDIO_TRACK_JNI_H_
-#define WEBRTC_MODULES_AUDIO_DEVICE_ANDROID_AUDIO_TRACK_JNI_H_
-
-#include <memory>
-
-#include <jni.h>
-
-#include "webrtc/modules/audio_device/android/audio_common.h"
-#include "webrtc/modules/audio_device/android/audio_manager.h"
-#include "webrtc/modules/audio_device/audio_device_generic.h"
-#include "webrtc/modules/audio_device/include/audio_device_defines.h"
-#include "webrtc/modules/utility/include/helpers_android.h"
-#include "webrtc/modules/utility/include/jvm_android.h"
-#include "webrtc/rtc_base/thread_checker.h"
-
-namespace webrtc {
-
-// Implements 16-bit mono PCM audio output support for Android using the Java
-// AudioTrack interface. Most of the work is done by its Java counterpart in
-// WebRtcAudioTrack.java. This class is created and lives on a thread in
-// C++-land, but decoded audio buffers are requested on a high-priority
-// thread managed by the Java class.
-//
-// An instance must be created and destroyed on one and the same thread.
-// All public methods must also be called on the same thread. A thread checker
-// will RTC_DCHECK if any method is called on an invalid thread.
-//
-// This class uses AttachCurrentThreadIfNeeded to attach to a Java VM if needed
-// and detach when the object goes out of scope. Additional thread checking
-// guarantees that no other (possibly non attached) thread is used.
-class AudioTrackJni {
- public:
-  // Wraps the Java specific parts of the AudioTrackJni into one helper class.
-  class JavaAudioTrack {
-   public:
-    JavaAudioTrack(NativeRegistration* native_registration,
-                   std::unique_ptr<GlobalRef> audio_track);
-    ~JavaAudioTrack();
-
-    bool InitPlayout(int sample_rate, int channels);
-    bool StartPlayout();
-    bool StopPlayout();
-    bool SetStreamVolume(int volume);
-    int GetStreamMaxVolume();
-    int GetStreamVolume();
-
-   private:
-    std::unique_ptr<GlobalRef> audio_track_;
-    jmethodID init_playout_;
-    jmethodID start_playout_;
-    jmethodID stop_playout_;
-    jmethodID set_stream_volume_;
-    jmethodID get_stream_max_volume_;
-    jmethodID get_stream_volume_;
-  };
-
-  explicit AudioTrackJni(AudioManager* audio_manager);
-  ~AudioTrackJni();
-
-  int32_t Init();
-  int32_t Terminate();
-
-  int32_t InitPlayout();
-  bool PlayoutIsInitialized() const { return initialized_; }
-
-  int32_t StartPlayout();
-  int32_t StopPlayout();
-  bool Playing() const { return playing_; }
-
-  int SpeakerVolumeIsAvailable(bool& available);
-  int SetSpeakerVolume(uint32_t volume);
-  int SpeakerVolume(uint32_t& volume) const;
-  int MaxSpeakerVolume(uint32_t& max_volume) const;
-  int MinSpeakerVolume(uint32_t& min_volume) const;
-
-  void AttachAudioBuffer(AudioDeviceBuffer* audioBuffer);
-
- private:
-  // Called from Java side so we can cache the address of the Java-manged
-  // |byte_buffer| in |direct_buffer_address_|. The size of the buffer
-  // is also stored in |direct_buffer_capacity_in_bytes_|.
-  // Called on the same thread as the creating thread.
-  static void JNICALL CacheDirectBufferAddress(
-    JNIEnv* env, jobject obj, jobject byte_buffer, jlong nativeAudioTrack);
-  void OnCacheDirectBufferAddress(JNIEnv* env, jobject byte_buffer);
-
-  // Called periodically by the Java based WebRtcAudioTrack object when
-  // playout has started. Each call indicates that |length| new bytes should
-  // be written to the memory area |direct_buffer_address_| for playout.
-  // This method is called on a high-priority thread from Java. The name of
-  // the thread is 'AudioTrackThread'.
-  static void JNICALL GetPlayoutData(
-    JNIEnv* env, jobject obj, jint length, jlong nativeAudioTrack);
-  void OnGetPlayoutData(size_t length);
-
-  // Stores thread ID in constructor.
-  rtc::ThreadChecker thread_checker_;
-
-  // Stores thread ID in first call to OnGetPlayoutData() from high-priority
-  // thread in Java. Detached during construction of this object.
-  rtc::ThreadChecker thread_checker_java_;
-
-  // Calls AttachCurrentThread() if this thread is not attached at construction.
-  // Also ensures that DetachCurrentThread() is called at destruction.
-  AttachCurrentThreadIfNeeded attach_thread_if_needed_;
-
-  // Wraps the JNI interface pointer and methods associated with it.
-  std::unique_ptr<JNIEnvironment> j_environment_;
-
-  // Contains factory method for creating the Java object.
-  std::unique_ptr<NativeRegistration> j_native_registration_;
-
-  // Wraps the Java specific parts of the AudioTrackJni class.
-  std::unique_ptr<AudioTrackJni::JavaAudioTrack> j_audio_track_;
-
-  // Contains audio parameters provided to this class at construction by the
-  // AudioManager.
-  const AudioParameters audio_parameters_;
-
-  // Cached copy of address to direct audio buffer owned by |j_audio_track_|.
-  void* direct_buffer_address_;
-
-  // Number of bytes in the direct audio buffer owned by |j_audio_track_|.
-  size_t direct_buffer_capacity_in_bytes_;
-
-  // Number of audio frames per audio buffer. Each audio frame corresponds to
-  // one sample of PCM mono data at 16 bits per sample. Hence, each audio
-  // frame contains 2 bytes (given that the Java layer only supports mono).
-  // Example: 480 for 48000 Hz or 441 for 44100 Hz.
-  size_t frames_per_buffer_;
-
-  bool initialized_;
-
-  bool playing_;
-
-  // Raw pointer handle provided to us in AttachAudioBuffer(). Owned by the
-  // AudioDeviceModuleImpl class and called by AudioDeviceModule::Create().
-  // The AudioDeviceBuffer is a member of the AudioDeviceModuleImpl instance
-  // and therefore outlives this object.
-  AudioDeviceBuffer* audio_device_buffer_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_DEVICE_ANDROID_AUDIO_TRACK_JNI_H_
diff --git a/modules/audio_device/android/build_info.cc b/modules/audio_device/android/build_info.cc
deleted file mode 100644
index 3628e40..0000000
--- a/modules/audio_device/android/build_info.cc
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- *  Copyright (c) 2015 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_device/android/build_info.h"
-
-#include "webrtc/modules/utility/include/helpers_android.h"
-
-namespace webrtc {
-
-BuildInfo::BuildInfo()
-    : j_environment_(JVM::GetInstance()->environment()),
-      j_build_info_(
-          JVM::GetInstance()->GetClass("org/webrtc/voiceengine/BuildInfo")) {}
-
-std::string BuildInfo::GetStringFromJava(const char* name) {
-  jmethodID id = j_build_info_.GetStaticMethodId(name, "()Ljava/lang/String;");
-  jstring j_string = static_cast<jstring>(
-      j_build_info_.CallStaticObjectMethod(id));
-  return j_environment_->JavaToStdString(j_string);
-}
-
-std::string BuildInfo::GetDeviceModel() {
-  return GetStringFromJava("getDeviceModel");
-}
-
-std::string BuildInfo::GetBrand() {
-  return GetStringFromJava("getBrand");
-}
-
-std::string BuildInfo::GetDeviceManufacturer() {
-  return GetStringFromJava("getDeviceManufacturer");
-}
-
-std::string BuildInfo::GetAndroidBuildId() {
-  return GetStringFromJava("getAndroidBuildId");
-}
-
-std::string BuildInfo::GetBuildType() {
-  return GetStringFromJava("getBuildType");
-}
-
-std::string BuildInfo::GetBuildRelease() {
-  return GetStringFromJava("getBuildRelease");
-}
-
-SdkCode BuildInfo::GetSdkVersion() {
-  jmethodID id = j_build_info_.GetStaticMethodId("getSdkVersion", "()I");
-  jint j_version = j_build_info_.CallStaticIntMethod(id);
-  return static_cast<SdkCode>(j_version);
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_device/android/build_info.h b/modules/audio_device/android/build_info.h
deleted file mode 100644
index d9640dd..0000000
--- a/modules/audio_device/android/build_info.h
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- *  Copyright (c) 2015 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_DEVICE_ANDROID_BUILD_INFO_H_
-#define WEBRTC_MODULES_AUDIO_DEVICE_ANDROID_BUILD_INFO_H_
-
-#include <jni.h>
-#include <memory>
-#include <string>
-
-#include "webrtc/modules/utility/include/jvm_android.h"
-
-namespace webrtc {
-
-// This enumeration maps to the values returned by BuildInfo::GetSdkVersion(),
-// indicating the Android release associated with a given SDK version.
-// See https://developer.android.com/guide/topics/manifest/uses-sdk-element.html
-// for details.
-enum SdkCode {
-  SDK_CODE_JELLY_BEAN = 16,      // Android 4.1
-  SDK_CODE_JELLY_BEAN_MR1 = 17,  // Android 4.2
-  SDK_CODE_JELLY_BEAN_MR2 = 18,  // Android 4.3
-  SDK_CODE_KITKAT = 19,          // Android 4.4
-  SDK_CODE_WATCH = 20,           // Android 4.4W
-  SDK_CODE_LOLLIPOP = 21,        // Android 5.0
-  SDK_CODE_LOLLIPOP_MR1 = 22,    // Android 5.1
-  SDK_CODE_MARSHMALLOW = 23,     // Android 6.0
-  SDK_CODE_N = 24,
-};
-
-// Utility class used to query the Java class (org/webrtc/voiceengine/BuildInfo)
-// for device and Android build information.
-// The calling thread is attached to the JVM at construction if needed and a
-// valid Java environment object is also created.
-// All Get methods must be called on the creating thread. If not, the code will
-// hit RTC_DCHECKs when calling JNIEnvironment::JavaToStdString().
-class BuildInfo {
- public:
-  BuildInfo();
-  ~BuildInfo() {}
-
-  // End-user-visible name for the end product (e.g. "Nexus 6").
-  std::string GetDeviceModel();
-  // Consumer-visible brand (e.g. "google").
-  std::string GetBrand();
-  // Manufacturer of the product/hardware (e.g. "motorola").
-  std::string GetDeviceManufacturer();
-  // Android build ID (e.g. LMY47D).
-  std::string GetAndroidBuildId();
-  // The type of build (e.g. "user" or "eng").
-  std::string GetBuildType();
-  // The user-visible version string (e.g. "5.1").
-  std::string GetBuildRelease();
-  // The user-visible SDK version of the framework (e.g. 21). See SdkCode enum
-  // for translation.
-  SdkCode GetSdkVersion();
-
- private:
-  // Helper method which calls a static getter method with |name| and returns
-  // a string from Java.
-  std::string GetStringFromJava(const char* name);
-
-  // Ensures that this class can access a valid JNI interface pointer even
-  // if the creating thread was not attached to the JVM.
-  AttachCurrentThreadIfNeeded attach_thread_if_needed_;
-
-  // Provides access to the JNIEnv interface pointer and the JavaToStdString()
-  // method which is used to translate Java strings to std strings.
-  std::unique_ptr<JNIEnvironment> j_environment_;
-
-  // Holds the jclass object and provides access to CallStaticObjectMethod().
-  // Used by GetStringFromJava() during construction only.
-  JavaClass j_build_info_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_DEVICE_ANDROID_BUILD_INFO_H_
diff --git a/modules/audio_device/android/ensure_initialized.cc b/modules/audio_device/android/ensure_initialized.cc
deleted file mode 100644
index 6407a64..0000000
--- a/modules/audio_device/android/ensure_initialized.cc
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- *  Copyright (c) 2015 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_device/android/ensure_initialized.h"
-
-#include <pthread.h>
-
-#include "webrtc/rtc_base/ignore_wundef.h"
-
-// Note: this dependency is dangerous since it reaches into Chromium's base.
-// There's a risk of e.g. macro clashes. This file may only be used in tests.
-RTC_PUSH_IGNORING_WUNDEF()
-#include "base/android/jni_android.h"
-RTC_POP_IGNORING_WUNDEF()
-#include "webrtc/modules/audio_device/android/audio_record_jni.h"
-#include "webrtc/modules/audio_device/android/audio_track_jni.h"
-#include "webrtc/modules/utility/include/jvm_android.h"
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-namespace audiodevicemodule {
-
-static pthread_once_t g_initialize_once = PTHREAD_ONCE_INIT;
-
-void EnsureInitializedOnce() {
-  RTC_CHECK(::base::android::IsVMInitialized());
-  JNIEnv* jni = ::base::android::AttachCurrentThread();
-  JavaVM* jvm = NULL;
-  RTC_CHECK_EQ(0, jni->GetJavaVM(&jvm));
-
-  // Initialize the Java environment (currently only used by the audio manager).
-  webrtc::JVM::Initialize(jvm);
-}
-
-void EnsureInitialized() {
-  RTC_CHECK_EQ(0, pthread_once(&g_initialize_once, &EnsureInitializedOnce));
-}
-
-}  // namespace audiodevicemodule
-}  // namespace webrtc
diff --git a/modules/audio_device/android/ensure_initialized.h b/modules/audio_device/android/ensure_initialized.h
deleted file mode 100644
index c1997b4..0000000
--- a/modules/audio_device/android/ensure_initialized.h
+++ /dev/null
@@ -1,17 +0,0 @@
-/*
- *  Copyright (c) 2015 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.
- */
-
-namespace webrtc {
-namespace audiodevicemodule {
-
-void EnsureInitialized();
-
-}  // namespace audiodevicemodule
-}  // namespace webrtc
diff --git a/modules/audio_device/android/java/src/org/webrtc/voiceengine/BuildInfo.java b/modules/audio_device/android/java/src/org/webrtc/voiceengine/BuildInfo.java
deleted file mode 100644
index aed8a06..0000000
--- a/modules/audio_device/android/java/src/org/webrtc/voiceengine/BuildInfo.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- *  Copyright (c) 2015 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.
- */
-
-package org.webrtc.voiceengine;
-
-import android.os.Build;
-
-public final class BuildInfo {
-  public static String getDevice() {
-    return Build.DEVICE;
-  }
-
-  public static String getDeviceModel() {
-    return Build.MODEL;
-  }
-
-  public static String getProduct() {
-    return Build.PRODUCT;
-  }
-
-  public static String getBrand() {
-    return Build.BRAND;
-  }
-
-  public static String getDeviceManufacturer() {
-    return Build.MANUFACTURER;
-  }
-
-  public static String getAndroidBuildId() {
-    return Build.ID;
-  }
-
-  public static String getBuildType() {
-    return Build.TYPE;
-  }
-
-  public static String getBuildRelease() {
-    return Build.VERSION.RELEASE;
-  }
-
-  public static int getSdkVersion() {
-    return Build.VERSION.SDK_INT;
-  }
-}
diff --git a/modules/audio_device/android/java/src/org/webrtc/voiceengine/WebRtcAudioEffects.java b/modules/audio_device/android/java/src/org/webrtc/voiceengine/WebRtcAudioEffects.java
deleted file mode 100644
index 90a48d3..0000000
--- a/modules/audio_device/android/java/src/org/webrtc/voiceengine/WebRtcAudioEffects.java
+++ /dev/null
@@ -1,321 +0,0 @@
-/*
- *  Copyright (c) 2015 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.
- */
-
-package org.webrtc.voiceengine;
-
-import android.annotation.TargetApi;
-import android.media.audiofx.AcousticEchoCanceler;
-import android.media.audiofx.AudioEffect;
-import android.media.audiofx.AudioEffect.Descriptor;
-import android.media.audiofx.AutomaticGainControl;
-import android.media.audiofx.NoiseSuppressor;
-import android.os.Build;
-import java.util.List;
-import java.util.UUID;
-import org.webrtc.Logging;
-
-// This class wraps control of three different platform effects. Supported
-// effects are: AcousticEchoCanceler (AEC) and NoiseSuppressor (NS).
-// Calling enable() will active all effects that are
-// supported by the device if the corresponding |shouldEnableXXX| member is set.
-public class WebRtcAudioEffects {
-  private static final boolean DEBUG = false;
-
-  private static final String TAG = "WebRtcAudioEffects";
-
-  // UUIDs for Software Audio Effects that we want to avoid using.
-  // The implementor field will be set to "The Android Open Source Project".
-  private static final UUID AOSP_ACOUSTIC_ECHO_CANCELER =
-      UUID.fromString("bb392ec0-8d4d-11e0-a896-0002a5d5c51b");
-  private static final UUID AOSP_NOISE_SUPPRESSOR =
-      UUID.fromString("c06c8400-8e06-11e0-9cb6-0002a5d5c51b");
-
-  // Contains the available effect descriptors returned from the
-  // AudioEffect.getEffects() call. This result is cached to avoid doing the
-  // slow OS call multiple times.
-  private static Descriptor[] cachedEffects = null;
-
-  // Contains the audio effect objects. Created in enable() and destroyed
-  // in release().
-  private AcousticEchoCanceler aec = null;
-  private NoiseSuppressor ns = null;
-
-  // Affects the final state given to the setEnabled() method on each effect.
-  // The default state is set to "disabled" but each effect can also be enabled
-  // by calling setAEC() and setNS().
-  // To enable an effect, both the shouldEnableXXX member and the static
-  // canUseXXX() must be true.
-  private boolean shouldEnableAec = false;
-  private boolean shouldEnableNs = false;
-
-  // Checks if the device implements Acoustic Echo Cancellation (AEC).
-  // Returns true if the device implements AEC, false otherwise.
-  public static boolean isAcousticEchoCancelerSupported() {
-    // Note: we're using isAcousticEchoCancelerEffectAvailable() instead of
-    // AcousticEchoCanceler.isAvailable() to avoid the expensive getEffects()
-    // OS API call.
-    return isAcousticEchoCancelerEffectAvailable();
-  }
-
-  // Checks if the device implements Noise Suppression (NS).
-  // Returns true if the device implements NS, false otherwise.
-  public static boolean isNoiseSuppressorSupported() {
-    // Note: we're using isNoiseSuppressorEffectAvailable() instead of
-    // NoiseSuppressor.isAvailable() to avoid the expensive getEffects()
-    // OS API call.
-    return isNoiseSuppressorEffectAvailable();
-  }
-
-  // Returns true if the device is blacklisted for HW AEC usage.
-  public static boolean isAcousticEchoCancelerBlacklisted() {
-    List<String> blackListedModels = WebRtcAudioUtils.getBlackListedModelsForAecUsage();
-    boolean isBlacklisted = blackListedModels.contains(Build.MODEL);
-    if (isBlacklisted) {
-      Logging.w(TAG, Build.MODEL + " is blacklisted for HW AEC usage!");
-    }
-    return isBlacklisted;
-  }
-
-  // Returns true if the device is blacklisted for HW NS usage.
-  public static boolean isNoiseSuppressorBlacklisted() {
-    List<String> blackListedModels = WebRtcAudioUtils.getBlackListedModelsForNsUsage();
-    boolean isBlacklisted = blackListedModels.contains(Build.MODEL);
-    if (isBlacklisted) {
-      Logging.w(TAG, Build.MODEL + " is blacklisted for HW NS usage!");
-    }
-    return isBlacklisted;
-  }
-
-  // Returns true if the platform AEC should be excluded based on its UUID.
-  // AudioEffect.queryEffects() can throw IllegalStateException.
-  @TargetApi(18)
-  private static boolean isAcousticEchoCancelerExcludedByUUID() {
-    for (Descriptor d : getAvailableEffects()) {
-      if (d.type.equals(AudioEffect.EFFECT_TYPE_AEC)
-          && d.uuid.equals(AOSP_ACOUSTIC_ECHO_CANCELER)) {
-        return true;
-      }
-    }
-    return false;
-  }
-
-  // Returns true if the platform NS should be excluded based on its UUID.
-  // AudioEffect.queryEffects() can throw IllegalStateException.
-  @TargetApi(18)
-  private static boolean isNoiseSuppressorExcludedByUUID() {
-    for (Descriptor d : getAvailableEffects()) {
-      if (d.type.equals(AudioEffect.EFFECT_TYPE_NS) && d.uuid.equals(AOSP_NOISE_SUPPRESSOR)) {
-        return true;
-      }
-    }
-    return false;
-  }
-
-  // Returns true if the device supports Acoustic Echo Cancellation (AEC).
-  @TargetApi(18)
-  private static boolean isAcousticEchoCancelerEffectAvailable() {
-    return isEffectTypeAvailable(AudioEffect.EFFECT_TYPE_AEC);
-  }
-
-  // Returns true if the device supports Noise Suppression (NS).
-  @TargetApi(18)
-  private static boolean isNoiseSuppressorEffectAvailable() {
-    return isEffectTypeAvailable(AudioEffect.EFFECT_TYPE_NS);
-  }
-
-  // Returns true if all conditions for supporting the HW AEC are fulfilled.
-  // It will not be possible to enable the HW AEC if this method returns false.
-  public static boolean canUseAcousticEchoCanceler() {
-    boolean canUseAcousticEchoCanceler = isAcousticEchoCancelerSupported()
-        && !WebRtcAudioUtils.useWebRtcBasedAcousticEchoCanceler()
-        && !isAcousticEchoCancelerBlacklisted() && !isAcousticEchoCancelerExcludedByUUID();
-    Logging.d(TAG, "canUseAcousticEchoCanceler: " + canUseAcousticEchoCanceler);
-    return canUseAcousticEchoCanceler;
-  }
-
-  // Returns true if all conditions for supporting the HW NS are fulfilled.
-  // It will not be possible to enable the HW NS if this method returns false.
-  public static boolean canUseNoiseSuppressor() {
-    boolean canUseNoiseSuppressor = isNoiseSuppressorSupported()
-        && !WebRtcAudioUtils.useWebRtcBasedNoiseSuppressor() && !isNoiseSuppressorBlacklisted()
-        && !isNoiseSuppressorExcludedByUUID();
-    Logging.d(TAG, "canUseNoiseSuppressor: " + canUseNoiseSuppressor);
-    return canUseNoiseSuppressor;
-  }
-
-  public static WebRtcAudioEffects create() {
-    return new WebRtcAudioEffects();
-  }
-
-  private WebRtcAudioEffects() {
-    Logging.d(TAG, "ctor" + WebRtcAudioUtils.getThreadInfo());
-  }
-
-  // Call this method to enable or disable the platform AEC. It modifies
-  // |shouldEnableAec| which is used in enable() where the actual state
-  // of the AEC effect is modified. Returns true if HW AEC is supported and
-  // false otherwise.
-  public boolean setAEC(boolean enable) {
-    Logging.d(TAG, "setAEC(" + enable + ")");
-    if (!canUseAcousticEchoCanceler()) {
-      Logging.w(TAG, "Platform AEC is not supported");
-      shouldEnableAec = false;
-      return false;
-    }
-    if (aec != null && (enable != shouldEnableAec)) {
-      Logging.e(TAG, "Platform AEC state can't be modified while recording");
-      return false;
-    }
-    shouldEnableAec = enable;
-    return true;
-  }
-
-  // Call this method to enable or disable the platform NS. It modifies
-  // |shouldEnableNs| which is used in enable() where the actual state
-  // of the NS effect is modified. Returns true if HW NS is supported and
-  // false otherwise.
-  public boolean setNS(boolean enable) {
-    Logging.d(TAG, "setNS(" + enable + ")");
-    if (!canUseNoiseSuppressor()) {
-      Logging.w(TAG, "Platform NS is not supported");
-      shouldEnableNs = false;
-      return false;
-    }
-    if (ns != null && (enable != shouldEnableNs)) {
-      Logging.e(TAG, "Platform NS state can't be modified while recording");
-      return false;
-    }
-    shouldEnableNs = enable;
-    return true;
-  }
-
-  public void enable(int audioSession) {
-    Logging.d(TAG, "enable(audioSession=" + audioSession + ")");
-    assertTrue(aec == null);
-    assertTrue(ns == null);
-
-    if (DEBUG) {
-      // Add logging of supported effects but filter out "VoIP effects", i.e.,
-      // AEC, AEC and NS. Avoid calling AudioEffect.queryEffects() unless the
-      // DEBUG flag is set since we have seen crashes in this API.
-      for (Descriptor d : AudioEffect.queryEffects()) {
-        if (effectTypeIsVoIP(d.type)) {
-          Logging.d(TAG, "name: " + d.name + ", "
-                  + "mode: " + d.connectMode + ", "
-                  + "implementor: " + d.implementor + ", "
-                  + "UUID: " + d.uuid);
-        }
-      }
-    }
-
-    if (isAcousticEchoCancelerSupported()) {
-      // Create an AcousticEchoCanceler and attach it to the AudioRecord on
-      // the specified audio session.
-      aec = AcousticEchoCanceler.create(audioSession);
-      if (aec != null) {
-        boolean enabled = aec.getEnabled();
-        boolean enable = shouldEnableAec && canUseAcousticEchoCanceler();
-        if (aec.setEnabled(enable) != AudioEffect.SUCCESS) {
-          Logging.e(TAG, "Failed to set the AcousticEchoCanceler state");
-        }
-        Logging.d(TAG, "AcousticEchoCanceler: was " + (enabled ? "enabled" : "disabled")
-                + ", enable: " + enable + ", is now: "
-                + (aec.getEnabled() ? "enabled" : "disabled"));
-      } else {
-        Logging.e(TAG, "Failed to create the AcousticEchoCanceler instance");
-      }
-    }
-
-    if (isNoiseSuppressorSupported()) {
-      // Create an NoiseSuppressor and attach it to the AudioRecord on the
-      // specified audio session.
-      ns = NoiseSuppressor.create(audioSession);
-      if (ns != null) {
-        boolean enabled = ns.getEnabled();
-        boolean enable = shouldEnableNs && canUseNoiseSuppressor();
-        if (ns.setEnabled(enable) != AudioEffect.SUCCESS) {
-          Logging.e(TAG, "Failed to set the NoiseSuppressor state");
-        }
-        Logging.d(TAG, "NoiseSuppressor: was " + (enabled ? "enabled" : "disabled") + ", enable: "
-                + enable + ", is now: " + (ns.getEnabled() ? "enabled" : "disabled"));
-      } else {
-        Logging.e(TAG, "Failed to create the NoiseSuppressor instance");
-      }
-    }
-  }
-
-  // Releases all native audio effect resources. It is a good practice to
-  // release the effect engine when not in use as control can be returned
-  // to other applications or the native resources released.
-  public void release() {
-    Logging.d(TAG, "release");
-    if (aec != null) {
-      aec.release();
-      aec = null;
-    }
-    if (ns != null) {
-      ns.release();
-      ns = null;
-    }
-  }
-
-  // Returns true for effect types in |type| that are of "VoIP" types:
-  // Acoustic Echo Canceler (AEC) or Automatic Gain Control (AGC) or
-  // Noise Suppressor (NS). Note that, an extra check for support is needed
-  // in each comparison since some devices includes effects in the
-  // AudioEffect.Descriptor array that are actually not available on the device.
-  // As an example: Samsung Galaxy S6 includes an AGC in the descriptor but
-  // AutomaticGainControl.isAvailable() returns false.
-  @TargetApi(18)
-  private boolean effectTypeIsVoIP(UUID type) {
-    if (!WebRtcAudioUtils.runningOnJellyBeanMR2OrHigher())
-      return false;
-
-    return (AudioEffect.EFFECT_TYPE_AEC.equals(type) && isAcousticEchoCancelerSupported())
-        || (AudioEffect.EFFECT_TYPE_NS.equals(type) && isNoiseSuppressorSupported());
-  }
-
-  // Helper method which throws an exception when an assertion has failed.
-  private static void assertTrue(boolean condition) {
-    if (!condition) {
-      throw new AssertionError("Expected condition to be true");
-    }
-  }
-
-  // Returns the cached copy of the audio effects array, if available, or
-  // queries the operating system for the list of effects.
-  private static Descriptor[] getAvailableEffects() {
-    if (cachedEffects != null) {
-      return cachedEffects;
-    }
-    // The caching is best effort only - if this method is called from several
-    // threads in parallel, they may end up doing the underlying OS call
-    // multiple times. It's normally only called on one thread so there's no
-    // real need to optimize for the multiple threads case.
-    cachedEffects = AudioEffect.queryEffects();
-    return cachedEffects;
-  }
-
-  // Returns true if an effect of the specified type is available. Functionally
-  // equivalent to (NoiseSuppressor|AutomaticGainControl|...).isAvailable(), but
-  // faster as it avoids the expensive OS call to enumerate effects.
-  private static boolean isEffectTypeAvailable(UUID effectType) {
-    Descriptor[] effects = getAvailableEffects();
-    if (effects == null) {
-      return false;
-    }
-    for (Descriptor d : effects) {
-      if (d.type.equals(effectType)) {
-        return true;
-      }
-    }
-    return false;
-  }
-}
diff --git a/modules/audio_device/android/java/src/org/webrtc/voiceengine/WebRtcAudioManager.java b/modules/audio_device/android/java/src/org/webrtc/voiceengine/WebRtcAudioManager.java
deleted file mode 100644
index 2d2ee3e..0000000
--- a/modules/audio_device/android/java/src/org/webrtc/voiceengine/WebRtcAudioManager.java
+++ /dev/null
@@ -1,357 +0,0 @@
-/*
- *  Copyright (c) 2015 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.
- */
-
-package org.webrtc.voiceengine;
-
-import android.annotation.TargetApi;
-import android.content.Context;
-import android.content.pm.PackageManager;
-import android.media.AudioFormat;
-import android.media.AudioManager;
-import android.media.AudioRecord;
-import android.media.AudioTrack;
-import android.os.Build;
-import java.util.Timer;
-import java.util.TimerTask;
-import org.webrtc.ContextUtils;
-import org.webrtc.Logging;
-
-// WebRtcAudioManager handles tasks that uses android.media.AudioManager.
-// At construction, storeAudioParameters() is called and it retrieves
-// fundamental audio parameters like native sample rate and number of channels.
-// The result is then provided to the caller by nativeCacheAudioParameters().
-// It is also possible to call init() to set up the audio environment for best
-// possible "VoIP performance". All settings done in init() are reverted by
-// dispose(). This class can also be used without calling init() if the user
-// prefers to set up the audio environment separately. However, it is
-// recommended to always use AudioManager.MODE_IN_COMMUNICATION.
-public class WebRtcAudioManager {
-  private static final boolean DEBUG = false;
-
-  private static final String TAG = "WebRtcAudioManager";
-
-  // Use mono as default for both audio directions.
-  private static boolean useStereoOutput = false;
-  private static boolean useStereoInput = false;
-
-  private static boolean blacklistDeviceForOpenSLESUsage = false;
-  private static boolean blacklistDeviceForOpenSLESUsageIsOverridden = false;
-
-  // Call this method to override the default list of blacklisted devices
-  // specified in WebRtcAudioUtils.BLACKLISTED_OPEN_SL_ES_MODELS.
-  // Allows an app to take control over which devices to exclude from using
-  // the OpenSL ES audio output path
-  public static synchronized void setBlacklistDeviceForOpenSLESUsage(boolean enable) {
-    blacklistDeviceForOpenSLESUsageIsOverridden = true;
-    blacklistDeviceForOpenSLESUsage = enable;
-  }
-
-  // Call these methods to override the default mono audio modes for the specified direction(s)
-  // (input and/or output).
-  public static synchronized void setStereoOutput(boolean enable) {
-    Logging.w(TAG, "Overriding default output behavior: setStereoOutput(" + enable + ')');
-    useStereoOutput = enable;
-  }
-  public static synchronized void setStereoInput(boolean enable) {
-    Logging.w(TAG, "Overriding default input behavior: setStereoInput(" + enable + ')');
-    useStereoInput = enable;
-  }
-
-  public static synchronized boolean getStereoOutput() {
-    return useStereoOutput;
-  }
-  public static synchronized boolean getStereoInput() {
-    return useStereoInput;
-  }
-
-  // Default audio data format is PCM 16 bit per sample.
-  // Guaranteed to be supported by all devices.
-  private static final int BITS_PER_SAMPLE = 16;
-
-  private static final int DEFAULT_FRAME_PER_BUFFER = 256;
-
-  // List of possible audio modes.
-  private static final String[] AUDIO_MODES = new String[] {
-      "MODE_NORMAL", "MODE_RINGTONE", "MODE_IN_CALL", "MODE_IN_COMMUNICATION",
-  };
-
-  // Private utility class that periodically checks and logs the volume level
-  // of the audio stream that is currently controlled by the volume control.
-  // A timer triggers logs once every 30 seconds and the timer's associated
-  // thread is named "WebRtcVolumeLevelLoggerThread".
-  private static class VolumeLogger {
-    private static final String THREAD_NAME = "WebRtcVolumeLevelLoggerThread";
-    private static final int TIMER_PERIOD_IN_SECONDS = 30;
-
-    private final AudioManager audioManager;
-    private Timer timer;
-
-    public VolumeLogger(AudioManager audioManager) {
-      this.audioManager = audioManager;
-    }
-
-    public void start() {
-      timer = new Timer(THREAD_NAME);
-      timer.schedule(new LogVolumeTask(audioManager.getStreamMaxVolume(AudioManager.STREAM_RING),
-                         audioManager.getStreamMaxVolume(AudioManager.STREAM_VOICE_CALL)),
-          0, TIMER_PERIOD_IN_SECONDS * 1000);
-    }
-
-    private class LogVolumeTask extends TimerTask {
-      private final int maxRingVolume;
-      private final int maxVoiceCallVolume;
-
-      LogVolumeTask(int maxRingVolume, int maxVoiceCallVolume) {
-        this.maxRingVolume = maxRingVolume;
-        this.maxVoiceCallVolume = maxVoiceCallVolume;
-      }
-
-      public void run() {
-        final int mode = audioManager.getMode();
-        if (mode == AudioManager.MODE_RINGTONE) {
-          Logging.d(TAG, "STREAM_RING stream volume: "
-                  + audioManager.getStreamVolume(AudioManager.STREAM_RING) + " (max="
-                  + maxRingVolume + ")");
-        } else if (mode == AudioManager.MODE_IN_COMMUNICATION) {
-          Logging.d(TAG, "VOICE_CALL stream volume: "
-                  + audioManager.getStreamVolume(AudioManager.STREAM_VOICE_CALL) + " (max="
-                  + maxVoiceCallVolume + ")");
-        }
-      }
-    }
-
-    private void stop() {
-      if (timer != null) {
-        timer.cancel();
-        timer = null;
-      }
-    }
-  }
-
-  private final long nativeAudioManager;
-  private final AudioManager audioManager;
-
-  private boolean initialized = false;
-  private int nativeSampleRate;
-  private int nativeChannels;
-
-  private boolean hardwareAEC;
-  private boolean hardwareAGC;
-  private boolean hardwareNS;
-  private boolean lowLatencyOutput;
-  private boolean lowLatencyInput;
-  private boolean proAudio;
-  private int sampleRate;
-  private int outputChannels;
-  private int inputChannels;
-  private int outputBufferSize;
-  private int inputBufferSize;
-
-  private final VolumeLogger volumeLogger;
-
-  WebRtcAudioManager(long nativeAudioManager) {
-    Logging.d(TAG, "ctor" + WebRtcAudioUtils.getThreadInfo());
-    this.nativeAudioManager = nativeAudioManager;
-    audioManager =
-        (AudioManager) ContextUtils.getApplicationContext().getSystemService(Context.AUDIO_SERVICE);
-    if (DEBUG) {
-      WebRtcAudioUtils.logDeviceInfo(TAG);
-    }
-    volumeLogger = new VolumeLogger(audioManager);
-    storeAudioParameters();
-    nativeCacheAudioParameters(sampleRate, outputChannels, inputChannels, hardwareAEC, hardwareAGC,
-        hardwareNS, lowLatencyOutput, lowLatencyInput, proAudio, outputBufferSize, inputBufferSize,
-        nativeAudioManager);
-  }
-
-  private boolean init() {
-    Logging.d(TAG, "init" + WebRtcAudioUtils.getThreadInfo());
-    if (initialized) {
-      return true;
-    }
-    Logging.d(TAG, "audio mode is: " + AUDIO_MODES[audioManager.getMode()]);
-    initialized = true;
-    volumeLogger.start();
-    return true;
-  }
-
-  private void dispose() {
-    Logging.d(TAG, "dispose" + WebRtcAudioUtils.getThreadInfo());
-    if (!initialized) {
-      return;
-    }
-    volumeLogger.stop();
-  }
-
-  private boolean isCommunicationModeEnabled() {
-    return (audioManager.getMode() == AudioManager.MODE_IN_COMMUNICATION);
-  }
-
-  private boolean isDeviceBlacklistedForOpenSLESUsage() {
-    boolean blacklisted = blacklistDeviceForOpenSLESUsageIsOverridden
-        ? blacklistDeviceForOpenSLESUsage
-        : WebRtcAudioUtils.deviceIsBlacklistedForOpenSLESUsage();
-    if (blacklisted) {
-      Logging.d(TAG, Build.MODEL + " is blacklisted for OpenSL ES usage!");
-    }
-    return blacklisted;
-  }
-
-  private void storeAudioParameters() {
-    outputChannels = getStereoOutput() ? 2 : 1;
-    inputChannels = getStereoInput() ? 2 : 1;
-    sampleRate = getNativeOutputSampleRate();
-    hardwareAEC = isAcousticEchoCancelerSupported();
-    // TODO(henrika): use of hardware AGC is no longer supported. Currently
-    // hardcoded to false. To be removed.
-    hardwareAGC = false;
-    hardwareNS = isNoiseSuppressorSupported();
-    lowLatencyOutput = isLowLatencyOutputSupported();
-    lowLatencyInput = isLowLatencyInputSupported();
-    proAudio = isProAudioSupported();
-    outputBufferSize = lowLatencyOutput ? getLowLatencyOutputFramesPerBuffer()
-                                        : getMinOutputFrameSize(sampleRate, outputChannels);
-    inputBufferSize = lowLatencyInput ? getLowLatencyInputFramesPerBuffer()
-                                      : getMinInputFrameSize(sampleRate, inputChannels);
-  }
-
-  // Gets the current earpiece state.
-  private boolean hasEarpiece() {
-    return ContextUtils.getApplicationContext().getPackageManager().hasSystemFeature(
-        PackageManager.FEATURE_TELEPHONY);
-  }
-
-  // Returns true if low-latency audio output is supported.
-  private boolean isLowLatencyOutputSupported() {
-    return ContextUtils.getApplicationContext().getPackageManager().hasSystemFeature(
-        PackageManager.FEATURE_AUDIO_LOW_LATENCY);
-  }
-
-  // Returns true if low-latency audio input is supported.
-  // TODO(henrika): remove the hardcoded false return value when OpenSL ES
-  // input performance has been evaluated and tested more.
-  public boolean isLowLatencyInputSupported() {
-    // TODO(henrika): investigate if some sort of device list is needed here
-    // as well. The NDK doc states that: "As of API level 21, lower latency
-    // audio input is supported on select devices. To take advantage of this
-    // feature, first confirm that lower latency output is available".
-    return WebRtcAudioUtils.runningOnLollipopOrHigher() && isLowLatencyOutputSupported();
-  }
-
-  // Returns true if the device has professional audio level of functionality
-  // and therefore supports the lowest possible round-trip latency.
-  @TargetApi(23)
-  private boolean isProAudioSupported() {
-    return WebRtcAudioUtils.runningOnMarshmallowOrHigher()
-        && ContextUtils.getApplicationContext().getPackageManager().hasSystemFeature(
-               PackageManager.FEATURE_AUDIO_PRO);
-  }
-
-  // Returns the native output sample rate for this device's output stream.
-  private int getNativeOutputSampleRate() {
-    // Override this if we're running on an old emulator image which only
-    // supports 8 kHz and doesn't support PROPERTY_OUTPUT_SAMPLE_RATE.
-    if (WebRtcAudioUtils.runningOnEmulator()) {
-      Logging.d(TAG, "Running emulator, overriding sample rate to 8 kHz.");
-      return 8000;
-    }
-    // Default can be overriden by WebRtcAudioUtils.setDefaultSampleRateHz().
-    // If so, use that value and return here.
-    if (WebRtcAudioUtils.isDefaultSampleRateOverridden()) {
-      Logging.d(TAG, "Default sample rate is overriden to "
-              + WebRtcAudioUtils.getDefaultSampleRateHz() + " Hz");
-      return WebRtcAudioUtils.getDefaultSampleRateHz();
-    }
-    // No overrides available. Deliver best possible estimate based on default
-    // Android AudioManager APIs.
-    final int sampleRateHz;
-    if (WebRtcAudioUtils.runningOnJellyBeanMR1OrHigher()) {
-      sampleRateHz = getSampleRateOnJellyBeanMR10OrHigher();
-    } else {
-      sampleRateHz = WebRtcAudioUtils.getDefaultSampleRateHz();
-    }
-    Logging.d(TAG, "Sample rate is set to " + sampleRateHz + " Hz");
-    return sampleRateHz;
-  }
-
-  @TargetApi(17)
-  private int getSampleRateOnJellyBeanMR10OrHigher() {
-    String sampleRateString = audioManager.getProperty(AudioManager.PROPERTY_OUTPUT_SAMPLE_RATE);
-    return (sampleRateString == null) ? WebRtcAudioUtils.getDefaultSampleRateHz()
-                                      : Integer.parseInt(sampleRateString);
-  }
-
-  // Returns the native output buffer size for low-latency output streams.
-  @TargetApi(17)
-  private int getLowLatencyOutputFramesPerBuffer() {
-    assertTrue(isLowLatencyOutputSupported());
-    if (!WebRtcAudioUtils.runningOnJellyBeanMR1OrHigher()) {
-      return DEFAULT_FRAME_PER_BUFFER;
-    }
-    String framesPerBuffer =
-        audioManager.getProperty(AudioManager.PROPERTY_OUTPUT_FRAMES_PER_BUFFER);
-    return framesPerBuffer == null ? DEFAULT_FRAME_PER_BUFFER : Integer.parseInt(framesPerBuffer);
-  }
-
-  // Returns true if the device supports an audio effect (AEC or NS).
-  // Four conditions must be fulfilled if functions are to return true:
-  // 1) the platform must support the built-in (HW) effect,
-  // 2) explicit use (override) of a WebRTC based version must not be set,
-  // 3) the device must not be blacklisted for use of the effect, and
-  // 4) the UUID of the effect must be approved (some UUIDs can be excluded).
-  private static boolean isAcousticEchoCancelerSupported() {
-    return WebRtcAudioEffects.canUseAcousticEchoCanceler();
-  }
-  private static boolean isNoiseSuppressorSupported() {
-    return WebRtcAudioEffects.canUseNoiseSuppressor();
-  }
-
-  // Returns the minimum output buffer size for Java based audio (AudioTrack).
-  // This size can also be used for OpenSL ES implementations on devices that
-  // lacks support of low-latency output.
-  private static int getMinOutputFrameSize(int sampleRateInHz, int numChannels) {
-    final int bytesPerFrame = numChannels * (BITS_PER_SAMPLE / 8);
-    final int channelConfig =
-        (numChannels == 1 ? AudioFormat.CHANNEL_OUT_MONO : AudioFormat.CHANNEL_OUT_STEREO);
-    return AudioTrack.getMinBufferSize(
-               sampleRateInHz, channelConfig, AudioFormat.ENCODING_PCM_16BIT)
-        / bytesPerFrame;
-  }
-
-  // Returns the native input buffer size for input streams.
-  private int getLowLatencyInputFramesPerBuffer() {
-    assertTrue(isLowLatencyInputSupported());
-    return getLowLatencyOutputFramesPerBuffer();
-  }
-
-  // Returns the minimum input buffer size for Java based audio (AudioRecord).
-  // This size can calso be used for OpenSL ES implementations on devices that
-  // lacks support of low-latency input.
-  private static int getMinInputFrameSize(int sampleRateInHz, int numChannels) {
-    final int bytesPerFrame = numChannels * (BITS_PER_SAMPLE / 8);
-    final int channelConfig =
-        (numChannels == 1 ? AudioFormat.CHANNEL_IN_MONO : AudioFormat.CHANNEL_IN_STEREO);
-    return AudioRecord.getMinBufferSize(
-               sampleRateInHz, channelConfig, AudioFormat.ENCODING_PCM_16BIT)
-        / bytesPerFrame;
-  }
-
-  // Helper method which throws an exception  when an assertion has failed.
-  private static void assertTrue(boolean condition) {
-    if (!condition) {
-      throw new AssertionError("Expected condition to be true");
-    }
-  }
-
-  private native void nativeCacheAudioParameters(int sampleRate, int outputChannels,
-      int inputChannels, boolean hardwareAEC, boolean hardwareAGC, boolean hardwareNS,
-      boolean lowLatencyOutput, boolean lowLatencyInput, boolean proAudio, int outputBufferSize,
-      int inputBufferSize, long nativeAudioManager);
-}
diff --git a/modules/audio_device/android/java/src/org/webrtc/voiceengine/WebRtcAudioRecord.java b/modules/audio_device/android/java/src/org/webrtc/voiceengine/WebRtcAudioRecord.java
deleted file mode 100644
index 729ff37..0000000
--- a/modules/audio_device/android/java/src/org/webrtc/voiceengine/WebRtcAudioRecord.java
+++ /dev/null
@@ -1,393 +0,0 @@
-/*
- *  Copyright (c) 2015 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.
- */
-
-package org.webrtc.voiceengine;
-
-import android.annotation.TargetApi;
-import android.content.Context;
-import android.media.AudioFormat;
-import android.media.AudioRecord;
-import android.media.MediaRecorder.AudioSource;
-import android.os.Process;
-import java.lang.System;
-import java.nio.ByteBuffer;
-import java.util.concurrent.TimeUnit;
-import org.webrtc.ContextUtils;
-import org.webrtc.Logging;
-import org.webrtc.ThreadUtils;
-
-public class WebRtcAudioRecord {
-  private static final boolean DEBUG = false;
-
-  private static final String TAG = "WebRtcAudioRecord";
-
-  // Default audio data format is PCM 16 bit per sample.
-  // Guaranteed to be supported by all devices.
-  private static final int BITS_PER_SAMPLE = 16;
-
-  // Requested size of each recorded buffer provided to the client.
-  private static final int CALLBACK_BUFFER_SIZE_MS = 10;
-
-  // Average number of callbacks per second.
-  private static final int BUFFERS_PER_SECOND = 1000 / CALLBACK_BUFFER_SIZE_MS;
-
-  // We ask for a native buffer size of BUFFER_SIZE_FACTOR * (minimum required
-  // buffer size). The extra space is allocated to guard against glitches under
-  // high load.
-  private static final int BUFFER_SIZE_FACTOR = 2;
-
-  // The AudioRecordJavaThread is allowed to wait for successful call to join()
-  // but the wait times out afther this amount of time.
-  private static final long AUDIO_RECORD_THREAD_JOIN_TIMEOUT_MS = 2000;
-
-  private final long nativeAudioRecord;
-  private final ThreadUtils.ThreadChecker threadChecker = new ThreadUtils.ThreadChecker();
-
-  private WebRtcAudioEffects effects = null;
-
-  private ByteBuffer byteBuffer;
-
-  private AudioRecord audioRecord = null;
-  private AudioRecordThread audioThread = null;
-
-  private static volatile boolean microphoneMute = false;
-  private byte[] emptyBytes;
-
-  // Audio recording error handler functions.
-  public enum AudioRecordStartErrorCode {
-    AUDIO_RECORD_START_EXCEPTION,
-    AUDIO_RECORD_START_STATE_MISMATCH,
-  }
-
-  public static interface WebRtcAudioRecordErrorCallback {
-    void onWebRtcAudioRecordInitError(String errorMessage);
-    void onWebRtcAudioRecordStartError(AudioRecordStartErrorCode errorCode, String errorMessage);
-    void onWebRtcAudioRecordError(String errorMessage);
-  }
-
-  private static WebRtcAudioRecordErrorCallback errorCallback = null;
-
-  public static void setErrorCallback(WebRtcAudioRecordErrorCallback errorCallback) {
-    Logging.d(TAG, "Set error callback");
-    WebRtcAudioRecord.errorCallback = errorCallback;
-  }
-
-  /**
-   * Audio thread which keeps calling ByteBuffer.read() waiting for audio
-   * to be recorded. Feeds recorded data to the native counterpart as a
-   * periodic sequence of callbacks using DataIsRecorded().
-   * This thread uses a Process.THREAD_PRIORITY_URGENT_AUDIO priority.
-   */
-  private class AudioRecordThread extends Thread {
-    private volatile boolean keepAlive = true;
-
-    public AudioRecordThread(String name) {
-      super(name);
-    }
-
-    @Override
-    public void run() {
-      Process.setThreadPriority(Process.THREAD_PRIORITY_URGENT_AUDIO);
-      Logging.d(TAG, "AudioRecordThread" + WebRtcAudioUtils.getThreadInfo());
-      assertTrue(audioRecord.getRecordingState() == AudioRecord.RECORDSTATE_RECORDING);
-
-      long lastTime = System.nanoTime();
-      while (keepAlive) {
-        int bytesRead = audioRecord.read(byteBuffer, byteBuffer.capacity());
-        if (bytesRead == byteBuffer.capacity()) {
-          if (microphoneMute) {
-            byteBuffer.clear();
-            byteBuffer.put(emptyBytes);
-          }
-          // It's possible we've been shut down during the read, and stopRecording() tried and
-          // failed to join this thread. To be a bit safer, try to avoid calling any native methods
-          // in case they've been unregistered after stopRecording() returned.
-          if (keepAlive) {
-            nativeDataIsRecorded(bytesRead, nativeAudioRecord);
-          }
-        } else {
-          String errorMessage = "AudioRecord.read failed: " + bytesRead;
-          Logging.e(TAG, errorMessage);
-          if (bytesRead == AudioRecord.ERROR_INVALID_OPERATION) {
-            keepAlive = false;
-            reportWebRtcAudioRecordError(errorMessage);
-          }
-        }
-        if (DEBUG) {
-          long nowTime = System.nanoTime();
-          long durationInMs = TimeUnit.NANOSECONDS.toMillis((nowTime - lastTime));
-          lastTime = nowTime;
-          Logging.d(TAG, "bytesRead[" + durationInMs + "] " + bytesRead);
-        }
-      }
-
-      try {
-        if (audioRecord != null) {
-          audioRecord.stop();
-        }
-      } catch (IllegalStateException e) {
-        Logging.e(TAG, "AudioRecord.stop failed: " + e.getMessage());
-      }
-    }
-
-    // Stops the inner thread loop and also calls AudioRecord.stop().
-    // Does not block the calling thread.
-    public void stopThread() {
-      Logging.d(TAG, "stopThread");
-      keepAlive = false;
-    }
-  }
-
-  WebRtcAudioRecord(long nativeAudioRecord) {
-    threadChecker.checkIsOnValidThread();
-    Logging.d(TAG, "ctor" + WebRtcAudioUtils.getThreadInfo());
-    this.nativeAudioRecord = nativeAudioRecord;
-    if (DEBUG) {
-      WebRtcAudioUtils.logDeviceInfo(TAG);
-    }
-    effects = WebRtcAudioEffects.create();
-  }
-
-  private boolean enableBuiltInAEC(boolean enable) {
-    threadChecker.checkIsOnValidThread();
-    Logging.d(TAG, "enableBuiltInAEC(" + enable + ')');
-    if (effects == null) {
-      Logging.e(TAG, "Built-in AEC is not supported on this platform");
-      return false;
-    }
-    return effects.setAEC(enable);
-  }
-
-  private boolean enableBuiltInNS(boolean enable) {
-    threadChecker.checkIsOnValidThread();
-    Logging.d(TAG, "enableBuiltInNS(" + enable + ')');
-    if (effects == null) {
-      Logging.e(TAG, "Built-in NS is not supported on this platform");
-      return false;
-    }
-    return effects.setNS(enable);
-  }
-
-  private int initRecording(int sampleRate, int channels) {
-    threadChecker.checkIsOnValidThread();
-    Logging.d(TAG, "initRecording(sampleRate=" + sampleRate + ", channels=" + channels + ")");
-    if (!WebRtcAudioUtils.hasPermission(
-            ContextUtils.getApplicationContext(), android.Manifest.permission.RECORD_AUDIO)) {
-      reportWebRtcAudioRecordInitError("RECORD_AUDIO permission is missing");
-      return -1;
-    }
-    if (audioRecord != null) {
-      reportWebRtcAudioRecordInitError("InitRecording called twice without StopRecording.");
-      return -1;
-    }
-    final int bytesPerFrame = channels * (BITS_PER_SAMPLE / 8);
-    final int framesPerBuffer = sampleRate / BUFFERS_PER_SECOND;
-    byteBuffer = ByteBuffer.allocateDirect(bytesPerFrame * framesPerBuffer);
-    Logging.d(TAG, "byteBuffer.capacity: " + byteBuffer.capacity());
-    emptyBytes = new byte[byteBuffer.capacity()];
-    // Rather than passing the ByteBuffer with every callback (requiring
-    // the potentially expensive GetDirectBufferAddress) we simply have the
-    // the native class cache the address to the memory once.
-    nativeCacheDirectBufferAddress(byteBuffer, nativeAudioRecord);
-
-    // Get the minimum buffer size required for the successful creation of
-    // an AudioRecord object, in byte units.
-    // Note that this size doesn't guarantee a smooth recording under load.
-    final int channelConfig = channelCountToConfiguration(channels);
-    int minBufferSize =
-        AudioRecord.getMinBufferSize(sampleRate, channelConfig, AudioFormat.ENCODING_PCM_16BIT);
-    if (minBufferSize == AudioRecord.ERROR || minBufferSize == AudioRecord.ERROR_BAD_VALUE) {
-      reportWebRtcAudioRecordInitError("AudioRecord.getMinBufferSize failed: " + minBufferSize);
-      return -1;
-    }
-    Logging.d(TAG, "AudioRecord.getMinBufferSize: " + minBufferSize);
-
-    // Use a larger buffer size than the minimum required when creating the
-    // AudioRecord instance to ensure smooth recording under load. It has been
-    // verified that it does not increase the actual recording latency.
-    int bufferSizeInBytes = Math.max(BUFFER_SIZE_FACTOR * minBufferSize, byteBuffer.capacity());
-    Logging.d(TAG, "bufferSizeInBytes: " + bufferSizeInBytes);
-    try {
-      if (WebRtcAudioUtils.runningOnMarshmallowOrHigher()) {
-        // Use AudioRecord.Builder to create the AudioRecord instance if we are on API level 23 or
-        // higher.
-        audioRecord = createAudioRecordOnMarshmallowOrHigher(
-            sampleRate, channelConfig, bufferSizeInBytes);
-      } else {
-        // Use default constructor for API levels below 23.
-        audioRecord = new AudioRecord(AudioSource.VOICE_COMMUNICATION, sampleRate,
-            channelConfig, AudioFormat.ENCODING_PCM_16BIT, bufferSizeInBytes);
-      }
-    } catch (IllegalArgumentException e) {
-      reportWebRtcAudioRecordInitError("AudioRecord ctor error: " + e.getMessage());
-      releaseAudioResources();
-      return -1;
-    }
-    if (audioRecord == null || audioRecord.getState() != AudioRecord.STATE_INITIALIZED) {
-      reportWebRtcAudioRecordInitError("Failed to create a new AudioRecord instance");
-      releaseAudioResources();
-      return -1;
-    }
-    if (effects != null) {
-      effects.enable(audioRecord.getAudioSessionId());
-    }
-    logMainParameters();
-    logMainParametersExtended();
-    return framesPerBuffer;
-  }
-
-  private boolean startRecording() {
-    threadChecker.checkIsOnValidThread();
-    Logging.d(TAG, "startRecording");
-    assertTrue(audioRecord != null);
-    assertTrue(audioThread == null);
-
-    // Starts recording from the AudioRecord instance.
-    try {
-      audioRecord.startRecording();
-    } catch (IllegalStateException e) {
-      reportWebRtcAudioRecordStartError(AudioRecordStartErrorCode.AUDIO_RECORD_START_EXCEPTION,
-          "AudioRecord.startRecording failed: " + e.getMessage());
-      return false;
-    }
-
-    // Verify the recording state up to two times (with a sleep in between)
-    // before returning false and reporting an error.
-    int numberOfStateChecks = 0;
-    while (audioRecord.getRecordingState() != AudioRecord.RECORDSTATE_RECORDING &&
-           ++numberOfStateChecks < 2) {
-      threadSleep(200);
-    }
-    if (audioRecord.getRecordingState() != AudioRecord.RECORDSTATE_RECORDING) {
-      reportWebRtcAudioRecordStartError(
-          AudioRecordStartErrorCode.AUDIO_RECORD_START_STATE_MISMATCH,
-          "AudioRecord.startRecording failed - incorrect state :"
-          + audioRecord.getRecordingState());
-      return false;
-    }
-
-    // Create and start new high-priority thread which calls AudioRecord.read()
-    // and where we also call the native DataIsRecorded() callback to feed
-    // WebRTC with recorded audio.
-    audioThread = new AudioRecordThread("AudioRecordJavaThread");
-    audioThread.start();
-    return true;
-  }
-
-  private boolean stopRecording() {
-    threadChecker.checkIsOnValidThread();
-    Logging.d(TAG, "stopRecording");
-    assertTrue(audioThread != null);
-    audioThread.stopThread();
-    if (!ThreadUtils.joinUninterruptibly(audioThread, AUDIO_RECORD_THREAD_JOIN_TIMEOUT_MS)) {
-      Logging.e(TAG, "Join of AudioRecordJavaThread timed out");
-    }
-    audioThread = null;
-    if (effects != null) {
-      effects.release();
-    }
-    releaseAudioResources();
-    return true;
-  }
-
-  private void logMainParameters() {
-    Logging.d(TAG, "AudioRecord: "
-            + "session ID: " + audioRecord.getAudioSessionId() + ", "
-            + "channels: " + audioRecord.getChannelCount() + ", "
-            + "sample rate: " + audioRecord.getSampleRate());
-  }
-
-  @TargetApi(23)
-  private void logMainParametersExtended() {
-    if (WebRtcAudioUtils.runningOnMarshmallowOrHigher()) {
-      Logging.d(TAG, "AudioRecord: "
-              // The frame count of the native AudioRecord buffer.
-              + "buffer size in frames: " + audioRecord.getBufferSizeInFrames());
-    }
-  }
-
-  // Creates an AudioRecord instance using AudioRecord.Builder which was added in API level 23.
-  @TargetApi(23)
-  private AudioRecord createAudioRecordOnMarshmallowOrHigher(
-    int sampleRateInHz, int channelConfig, int bufferSizeInBytes) {
-    Logging.d(TAG, "createAudioRecordOnMarshmallowOrHigher");
-    return new AudioRecord.Builder()
-        .setAudioSource(AudioSource.VOICE_COMMUNICATION)
-        .setAudioFormat(new AudioFormat.Builder()
-            .setEncoding(AudioFormat.ENCODING_PCM_16BIT)
-            .setSampleRate(sampleRateInHz)
-            .setChannelMask(channelConfig)
-            .build())
-        .setBufferSizeInBytes(bufferSizeInBytes)
-        .build();
-  }
-
-  // Helper method which throws an exception  when an assertion has failed.
-  private static void assertTrue(boolean condition) {
-    if (!condition) {
-      throw new AssertionError("Expected condition to be true");
-    }
-  }
-
-  private int channelCountToConfiguration(int channels) {
-    return (channels == 1 ? AudioFormat.CHANNEL_IN_MONO : AudioFormat.CHANNEL_IN_STEREO);
-  }
-
-  private native void nativeCacheDirectBufferAddress(ByteBuffer byteBuffer, long nativeAudioRecord);
-
-  private native void nativeDataIsRecorded(int bytes, long nativeAudioRecord);
-
-  // Sets all recorded samples to zero if |mute| is true, i.e., ensures that
-  // the microphone is muted.
-  public static void setMicrophoneMute(boolean mute) {
-    Logging.w(TAG, "setMicrophoneMute(" + mute + ")");
-    microphoneMute = mute;
-  }
-
-  // Releases the native AudioRecord resources.
-  private void releaseAudioResources() {
-    if (audioRecord != null) {
-      audioRecord.release();
-      audioRecord = null;
-    }
-  }
-
-  private void reportWebRtcAudioRecordInitError(String errorMessage) {
-    Logging.e(TAG, "Init recording error: " + errorMessage);
-    if (errorCallback != null) {
-      errorCallback.onWebRtcAudioRecordInitError(errorMessage);
-    }
-  }
-
-  private void reportWebRtcAudioRecordStartError(
-      AudioRecordStartErrorCode errorCode, String errorMessage) {
-    Logging.e(TAG, "Start recording error: " + errorCode + ". " + errorMessage);
-    if (errorCallback != null) {
-      errorCallback.onWebRtcAudioRecordStartError(errorCode, errorMessage);
-    }
-  }
-
-  private void reportWebRtcAudioRecordError(String errorMessage) {
-    Logging.e(TAG, "Run-time recording error: " + errorMessage);
-    if (errorCallback != null) {
-      errorCallback.onWebRtcAudioRecordError(errorMessage);
-    }
-  }
-
-  // Causes the currently executing thread to sleep for the specified number
-  // of milliseconds.
-  private void threadSleep(long millis) {
-    try {
-      Thread.sleep(millis);
-    } catch (InterruptedException e) {
-      Logging.e(TAG, "Thread.sleep failed: " + e.getMessage());
-    }
-  }
-}
diff --git a/modules/audio_device/android/java/src/org/webrtc/voiceengine/WebRtcAudioTrack.java b/modules/audio_device/android/java/src/org/webrtc/voiceengine/WebRtcAudioTrack.java
deleted file mode 100644
index ab55567..0000000
--- a/modules/audio_device/android/java/src/org/webrtc/voiceengine/WebRtcAudioTrack.java
+++ /dev/null
@@ -1,474 +0,0 @@
-/*
- *  Copyright (c) 2015 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.
- */
-
-package org.webrtc.voiceengine;
-
-import android.annotation.TargetApi;
-import android.content.Context;
-import android.media.AudioAttributes;
-import android.media.AudioFormat;
-import android.media.AudioManager;
-import android.media.AudioTrack;
-import android.os.Process;
-import java.lang.Thread;
-import java.nio.ByteBuffer;
-import org.webrtc.ContextUtils;
-import org.webrtc.Logging;
-import org.webrtc.ThreadUtils;
-
-public class WebRtcAudioTrack {
-  private static final boolean DEBUG = false;
-
-  private static final String TAG = "WebRtcAudioTrack";
-
-  // Default audio data format is PCM 16 bit per sample.
-  // Guaranteed to be supported by all devices.
-  private static final int BITS_PER_SAMPLE = 16;
-
-  // Requested size of each recorded buffer provided to the client.
-  private static final int CALLBACK_BUFFER_SIZE_MS = 10;
-
-  // Average number of callbacks per second.
-  private static final int BUFFERS_PER_SECOND = 1000 / CALLBACK_BUFFER_SIZE_MS;
-
-  // The AudioTrackThread is allowed to wait for successful call to join()
-  // but the wait times out afther this amount of time.
-  private static final long AUDIO_TRACK_THREAD_JOIN_TIMEOUT_MS = 2000;
-
-  // By default, WebRTC creates audio tracks with a usage attribute
-  // corresponding to voice communications, such as telephony or VoIP.
-  private static final int DEFAULT_USAGE = getDefaultUsageAttribute();
-  private static int usageAttribute = DEFAULT_USAGE;
-
-  // This method overrides the default usage attribute and allows the user
-  // to set it to something else than AudioAttributes.USAGE_VOICE_COMMUNICATION.
-  // NOTE: calling this method will most likely break existing VoIP tuning.
-  public static synchronized void setAudioTrackUsageAttribute(int usage) {
-    Logging.w(TAG, "Default usage attribute is changed from: "
-        + DEFAULT_USAGE + " to " + usage);
-    usageAttribute = usage;
-  }
-
-  private static int getDefaultUsageAttribute() {
-    if (WebRtcAudioUtils.runningOnLollipopOrHigher()) {
-      return getDefaultUsageAttributeOnLollipopOrHigher();
-    } else {
-      // Not used on SDKs lower than L.
-      return 0;
-    }
-  }
-
-  @TargetApi(21)
-  private static int getDefaultUsageAttributeOnLollipopOrHigher() {
-    return AudioAttributes.USAGE_VOICE_COMMUNICATION;
-  }
-
-  private final long nativeAudioTrack;
-  private final AudioManager audioManager;
-
-  private ByteBuffer byteBuffer;
-
-  private AudioTrack audioTrack = null;
-  private AudioTrackThread audioThread = null;
-
-  // Samples to be played are replaced by zeros if |speakerMute| is set to true.
-  // Can be used to ensure that the speaker is fully muted.
-  private static volatile boolean speakerMute = false;
-  private byte[] emptyBytes;
-
-  public static interface WebRtcAudioTrackErrorCallback {
-    void onWebRtcAudioTrackInitError(String errorMessage);
-    void onWebRtcAudioTrackStartError(String errorMessage);
-    void onWebRtcAudioTrackError(String errorMessage);
-  }
-
-  private static WebRtcAudioTrackErrorCallback errorCallback = null;
-
-  public static void setErrorCallback(WebRtcAudioTrackErrorCallback errorCallback) {
-    Logging.d(TAG, "Set error callback");
-    WebRtcAudioTrack.errorCallback = errorCallback;
-  }
-
-  /**
-   * Audio thread which keeps calling AudioTrack.write() to stream audio.
-   * Data is periodically acquired from the native WebRTC layer using the
-   * nativeGetPlayoutData callback function.
-   * This thread uses a Process.THREAD_PRIORITY_URGENT_AUDIO priority.
-   */
-  private class AudioTrackThread extends Thread {
-    private volatile boolean keepAlive = true;
-
-    public AudioTrackThread(String name) {
-      super(name);
-    }
-
-    @Override
-    public void run() {
-      Process.setThreadPriority(Process.THREAD_PRIORITY_URGENT_AUDIO);
-      Logging.d(TAG, "AudioTrackThread" + WebRtcAudioUtils.getThreadInfo());
-
-      try {
-        // In MODE_STREAM mode we can optionally prime the output buffer by
-        // writing up to bufferSizeInBytes (from constructor) before starting.
-        // This priming will avoid an immediate underrun, but is not required.
-        // TODO(henrika): initial tests have shown that priming is not required.
-        audioTrack.play();
-        assertTrue(audioTrack.getPlayState() == AudioTrack.PLAYSTATE_PLAYING);
-      } catch (IllegalStateException e) {
-        reportWebRtcAudioTrackStartError("AudioTrack.play failed: " + e.getMessage());
-        releaseAudioResources();
-        return;
-      }
-
-      // Fixed size in bytes of each 10ms block of audio data that we ask for
-      // using callbacks to the native WebRTC client.
-      final int sizeInBytes = byteBuffer.capacity();
-
-      while (keepAlive) {
-        // Get 10ms of PCM data from the native WebRTC client. Audio data is
-        // written into the common ByteBuffer using the address that was
-        // cached at construction.
-        nativeGetPlayoutData(sizeInBytes, nativeAudioTrack);
-        // Write data until all data has been written to the audio sink.
-        // Upon return, the buffer position will have been advanced to reflect
-        // the amount of data that was successfully written to the AudioTrack.
-        assertTrue(sizeInBytes <= byteBuffer.remaining());
-        if (speakerMute) {
-          byteBuffer.clear();
-          byteBuffer.put(emptyBytes);
-          byteBuffer.position(0);
-        }
-        int bytesWritten = 0;
-        if (WebRtcAudioUtils.runningOnLollipopOrHigher()) {
-          bytesWritten = writeOnLollipop(audioTrack, byteBuffer, sizeInBytes);
-        } else {
-          bytesWritten = writePreLollipop(audioTrack, byteBuffer, sizeInBytes);
-        }
-        if (bytesWritten != sizeInBytes) {
-          Logging.e(TAG, "AudioTrack.write played invalid number of bytes: " + bytesWritten);
-          // If a write() returns a negative value, an error has occurred.
-          // Stop playing and report an error in this case.
-          if (bytesWritten < 0) {
-            keepAlive = false;
-            reportWebRtcAudioTrackError("AudioTrack.write failed: " + bytesWritten);
-          }
-        }
-        // The byte buffer must be rewinded since byteBuffer.position() is
-        // increased at each call to AudioTrack.write(). If we don't do this,
-        // next call to AudioTrack.write() will fail.
-        byteBuffer.rewind();
-
-        // TODO(henrika): it is possible to create a delay estimate here by
-        // counting number of written frames and subtracting the result from
-        // audioTrack.getPlaybackHeadPosition().
-      }
-
-      // Stops playing the audio data. Since the instance was created in
-      // MODE_STREAM mode, audio will stop playing after the last buffer that
-      // was written has been played.
-      if (audioTrack != null) {
-        Logging.d(TAG, "Stopping the audio track...");
-        try {
-          audioTrack.stop();
-          Logging.d(TAG, "The audio track has now been stopped.");
-        } catch (IllegalStateException e) {
-          Logging.e(TAG, "AudioTrack.stop failed: " + e.getMessage());
-        }
-      }
-    }
-
-    @TargetApi(21)
-    private int writeOnLollipop(AudioTrack audioTrack, ByteBuffer byteBuffer, int sizeInBytes) {
-      return audioTrack.write(byteBuffer, sizeInBytes, AudioTrack.WRITE_BLOCKING);
-    }
-
-    private int writePreLollipop(AudioTrack audioTrack, ByteBuffer byteBuffer, int sizeInBytes) {
-      return audioTrack.write(byteBuffer.array(), byteBuffer.arrayOffset(), sizeInBytes);
-    }
-
-    // Stops the inner thread loop and also calls AudioTrack.pause() and flush().
-    // Does not block the calling thread.
-    public void stopThread() {
-      Logging.d(TAG, "stopThread");
-      keepAlive = false;
-    }
-  }
-
-  WebRtcAudioTrack(long nativeAudioTrack) {
-    Logging.d(TAG, "ctor" + WebRtcAudioUtils.getThreadInfo());
-    this.nativeAudioTrack = nativeAudioTrack;
-    audioManager =
-        (AudioManager) ContextUtils.getApplicationContext().getSystemService(Context.AUDIO_SERVICE);
-    if (DEBUG) {
-      WebRtcAudioUtils.logDeviceInfo(TAG);
-    }
-  }
-
-  private boolean initPlayout(int sampleRate, int channels) {
-    Logging.d(TAG, "initPlayout(sampleRate=" + sampleRate + ", channels=" + channels + ")");
-    final int bytesPerFrame = channels * (BITS_PER_SAMPLE / 8);
-    byteBuffer = byteBuffer.allocateDirect(bytesPerFrame * (sampleRate / BUFFERS_PER_SECOND));
-    Logging.d(TAG, "byteBuffer.capacity: " + byteBuffer.capacity());
-    emptyBytes = new byte[byteBuffer.capacity()];
-    // Rather than passing the ByteBuffer with every callback (requiring
-    // the potentially expensive GetDirectBufferAddress) we simply have the
-    // the native class cache the address to the memory once.
-    nativeCacheDirectBufferAddress(byteBuffer, nativeAudioTrack);
-
-    // Get the minimum buffer size required for the successful creation of an
-    // AudioTrack object to be created in the MODE_STREAM mode.
-    // Note that this size doesn't guarantee a smooth playback under load.
-    // TODO(henrika): should we extend the buffer size to avoid glitches?
-    final int channelConfig = channelCountToConfiguration(channels);
-    final int minBufferSizeInBytes =
-        AudioTrack.getMinBufferSize(sampleRate, channelConfig, AudioFormat.ENCODING_PCM_16BIT);
-    Logging.d(TAG, "AudioTrack.getMinBufferSize: " + minBufferSizeInBytes);
-    // For the streaming mode, data must be written to the audio sink in
-    // chunks of size (given by byteBuffer.capacity()) less than or equal
-    // to the total buffer size |minBufferSizeInBytes|. But, we have seen
-    // reports of "getMinBufferSize(): error querying hardware". Hence, it
-    // can happen that |minBufferSizeInBytes| contains an invalid value.
-    if (minBufferSizeInBytes < byteBuffer.capacity()) {
-      reportWebRtcAudioTrackInitError("AudioTrack.getMinBufferSize returns an invalid value.");
-      return false;
-    }
-
-    // Ensure that prevision audio session was stopped correctly before trying
-    // to create a new AudioTrack.
-    if (audioTrack != null) {
-      reportWebRtcAudioTrackInitError("Conflict with existing AudioTrack.");
-      return false;
-    }
-    try {
-      // Create an AudioTrack object and initialize its associated audio buffer.
-      // The size of this buffer determines how long an AudioTrack can play
-      // before running out of data.
-      if (WebRtcAudioUtils.runningOnLollipopOrHigher()) {
-        // If we are on API level 21 or higher, it is possible to use a special AudioTrack
-        // constructor that uses AudioAttributes and AudioFormat as input. It allows us to
-        // supersede the notion of stream types for defining the behavior of audio playback,
-        // and to allow certain platforms or routing policies to use this information for more
-        // refined volume or routing decisions.
-        audioTrack = createAudioTrackOnLollipopOrHigher(
-            sampleRate, channelConfig, minBufferSizeInBytes);
-      } else {
-        // Use default constructor for API levels below 21.
-        // Note that, this constructor will be deprecated in API level O (25).
-        audioTrack = new AudioTrack(AudioManager.STREAM_VOICE_CALL, sampleRate, channelConfig,
-            AudioFormat.ENCODING_PCM_16BIT, minBufferSizeInBytes, AudioTrack.MODE_STREAM);
-      }
-    } catch (IllegalArgumentException e) {
-      reportWebRtcAudioTrackInitError(e.getMessage());
-      releaseAudioResources();
-      return false;
-    }
-
-    // It can happen that an AudioTrack is created but it was not successfully
-    // initialized upon creation. Seems to be the case e.g. when the maximum
-    // number of globally available audio tracks is exceeded.
-    if (audioTrack == null || audioTrack.getState() != AudioTrack.STATE_INITIALIZED) {
-      reportWebRtcAudioTrackInitError("Initialization of audio track failed.");
-      releaseAudioResources();
-      return false;
-    }
-    logMainParameters();
-    logMainParametersExtended();
-    return true;
-  }
-
-  private boolean startPlayout() {
-    Logging.d(TAG, "startPlayout");
-    assertTrue(audioTrack != null);
-    assertTrue(audioThread == null);
-    if (audioTrack.getState() != AudioTrack.STATE_INITIALIZED) {
-      reportWebRtcAudioTrackStartError("AudioTrack instance is not successfully initialized.");
-      return false;
-    }
-    audioThread = new AudioTrackThread("AudioTrackJavaThread");
-    audioThread.start();
-    return true;
-  }
-
-  private boolean stopPlayout() {
-    Logging.d(TAG, "stopPlayout");
-    assertTrue(audioThread != null);
-    logUnderrunCount();
-    audioThread.stopThread();
-
-    final Thread aThread = audioThread;
-    audioThread = null;
-    if (aThread != null) {
-      Logging.d(TAG, "Stopping the AudioTrackThread...");
-      aThread.interrupt();
-      if (!ThreadUtils.joinUninterruptibly(aThread, AUDIO_TRACK_THREAD_JOIN_TIMEOUT_MS)) {
-        Logging.e(TAG, "Join of AudioTrackThread timed out.");
-      }
-      Logging.d(TAG, "AudioTrackThread has now been stopped.");
-    }
-
-    releaseAudioResources();
-    return true;
-  }
-
-  // Get max possible volume index for a phone call audio stream.
-  private int getStreamMaxVolume() {
-    Logging.d(TAG, "getStreamMaxVolume");
-    assertTrue(audioManager != null);
-    return audioManager.getStreamMaxVolume(AudioManager.STREAM_VOICE_CALL);
-  }
-
-  // Set current volume level for a phone call audio stream.
-  private boolean setStreamVolume(int volume) {
-    Logging.d(TAG, "setStreamVolume(" + volume + ")");
-    assertTrue(audioManager != null);
-    if (isVolumeFixed()) {
-      Logging.e(TAG, "The device implements a fixed volume policy.");
-      return false;
-    }
-    audioManager.setStreamVolume(AudioManager.STREAM_VOICE_CALL, volume, 0);
-    return true;
-  }
-
-  private boolean isVolumeFixed() {
-    if (!WebRtcAudioUtils.runningOnLollipopOrHigher())
-      return false;
-    return audioManager.isVolumeFixed();
-  }
-
-  /** Get current volume level for a phone call audio stream. */
-  private int getStreamVolume() {
-    Logging.d(TAG, "getStreamVolume");
-    assertTrue(audioManager != null);
-    return audioManager.getStreamVolume(AudioManager.STREAM_VOICE_CALL);
-  }
-
-  private void logMainParameters() {
-    Logging.d(TAG, "AudioTrack: "
-            + "session ID: " + audioTrack.getAudioSessionId() + ", "
-            + "channels: " + audioTrack.getChannelCount() + ", "
-            + "sample rate: " + audioTrack.getSampleRate() + ", "
-            // Gain (>=1.0) expressed as linear multiplier on sample values.
-            + "max gain: " + audioTrack.getMaxVolume());
-  }
-
-  // Creates and AudioTrack instance using AudioAttributes and AudioFormat as input.
-  // It allows certain platforms or routing policies to use this information for more
-  // refined volume or routing decisions.
-  @TargetApi(21)
-  private AudioTrack createAudioTrackOnLollipopOrHigher(
-    int sampleRateInHz, int channelConfig, int bufferSizeInBytes) {
-    Logging.d(TAG, "createAudioTrackOnLollipopOrHigher");
-    // TODO(henrika): use setPerformanceMode(int) with PERFORMANCE_MODE_LOW_LATENCY to control
-    // performance when Android O is supported. Add some logging in the mean time.
-    final int nativeOutputSampleRate =
-        AudioTrack.getNativeOutputSampleRate(AudioManager.STREAM_VOICE_CALL);
-    Logging.d(TAG, "nativeOutputSampleRate: " + nativeOutputSampleRate);
-    if (sampleRateInHz != nativeOutputSampleRate) {
-      Logging.w(TAG, "Unable to use fast mode since requested sample rate is not native");
-    }
-    if (usageAttribute != DEFAULT_USAGE) {
-      Logging.w(TAG, "A non default usage attribute is used: " + usageAttribute);
-    }
-    // Create an audio track where the audio usage is for VoIP and the content type is speech.
-    return new AudioTrack(
-        new AudioAttributes.Builder()
-            .setUsage(usageAttribute)
-            .setContentType(AudioAttributes.CONTENT_TYPE_SPEECH)
-        .build(),
-        new AudioFormat.Builder()
-          .setEncoding(AudioFormat.ENCODING_PCM_16BIT)
-          .setSampleRate(sampleRateInHz)
-          .setChannelMask(channelConfig)
-          .build(),
-        bufferSizeInBytes,
-        AudioTrack.MODE_STREAM,
-        AudioManager.AUDIO_SESSION_ID_GENERATE);
-  }
-
-  @TargetApi(24)
-  private void logMainParametersExtended() {
-    if (WebRtcAudioUtils.runningOnMarshmallowOrHigher()) {
-      Logging.d(TAG, "AudioTrack: "
-              // The effective size of the AudioTrack buffer that the app writes to.
-              + "buffer size in frames: " + audioTrack.getBufferSizeInFrames());
-    }
-    if (WebRtcAudioUtils.runningOnNougatOrHigher()) {
-      Logging.d(TAG, "AudioTrack: "
-              // Maximum size of the AudioTrack buffer in frames.
-              + "buffer capacity in frames: " + audioTrack.getBufferCapacityInFrames());
-    }
-  }
-
-  // Prints the number of underrun occurrences in the application-level write
-  // buffer since the AudioTrack was created. An underrun occurs if the app does
-  // not write audio data quickly enough, causing the buffer to underflow and a
-  // potential audio glitch.
-  // TODO(henrika): keep track of this value in the field and possibly add new
-  // UMA stat if needed.
-  @TargetApi(24)
-  private void logUnderrunCount() {
-    if (WebRtcAudioUtils.runningOnNougatOrHigher()) {
-      Logging.d(TAG, "underrun count: " + audioTrack.getUnderrunCount());
-    }
-  }
-
-  // Helper method which throws an exception  when an assertion has failed.
-  private static void assertTrue(boolean condition) {
-    if (!condition) {
-      throw new AssertionError("Expected condition to be true");
-    }
-  }
-
-  private int channelCountToConfiguration(int channels) {
-    return (channels == 1 ? AudioFormat.CHANNEL_OUT_MONO : AudioFormat.CHANNEL_OUT_STEREO);
-  }
-
-  private native void nativeCacheDirectBufferAddress(ByteBuffer byteBuffer, long nativeAudioRecord);
-
-  private native void nativeGetPlayoutData(int bytes, long nativeAudioRecord);
-
-  // Sets all samples to be played out to zero if |mute| is true, i.e.,
-  // ensures that the speaker is muted.
-  public static void setSpeakerMute(boolean mute) {
-    Logging.w(TAG, "setSpeakerMute(" + mute + ")");
-    speakerMute = mute;
-  }
-
-  // Releases the native AudioTrack resources.
-  private void releaseAudioResources() {
-    Logging.d(TAG, "releaseAudioResources");
-    if (audioTrack != null) {
-      audioTrack.release();
-      audioTrack = null;
-    }
-  }
-
-  private void reportWebRtcAudioTrackInitError(String errorMessage) {
-    Logging.e(TAG, "Init error: " + errorMessage);
-    if (errorCallback != null) {
-      errorCallback.onWebRtcAudioTrackInitError(errorMessage);
-    }
-  }
-
-  private void reportWebRtcAudioTrackStartError(String errorMessage) {
-    Logging.e(TAG, "Start error: " + errorMessage);
-    if (errorCallback != null) {
-      errorCallback.onWebRtcAudioTrackStartError(errorMessage);
-    }
-  }
-
-  private void reportWebRtcAudioTrackError(String errorMessage) {
-    Logging.e(TAG, "Run-time playback error: " + errorMessage);
-    if (errorCallback != null) {
-      errorCallback.onWebRtcAudioTrackError(errorMessage);
-    }
-  }
-
-}
diff --git a/modules/audio_device/android/java/src/org/webrtc/voiceengine/WebRtcAudioUtils.java b/modules/audio_device/android/java/src/org/webrtc/voiceengine/WebRtcAudioUtils.java
deleted file mode 100644
index 5689d20..0000000
--- a/modules/audio_device/android/java/src/org/webrtc/voiceengine/WebRtcAudioUtils.java
+++ /dev/null
@@ -1,194 +0,0 @@
-/*
- *  Copyright (c) 2015 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.
- */
-
-package org.webrtc.voiceengine;
-
-import android.content.Context;
-import android.content.pm.PackageManager;
-import android.os.Build;
-import android.os.Process;
-import java.lang.Thread;
-import java.util.Arrays;
-import java.util.List;
-import org.webrtc.Logging;
-
-public final class WebRtcAudioUtils {
-  private static final String TAG = "WebRtcAudioUtils";
-
-  // List of devices where we have seen issues (e.g. bad audio quality) using
-  // the low latency output mode in combination with OpenSL ES.
-  // The device name is given by Build.MODEL.
-  private static final String[] BLACKLISTED_OPEN_SL_ES_MODELS = new String[] {
-      // It is recommended to maintain a list of blacklisted models outside
-      // this package and instead call
-      // WebRtcAudioManager.setBlacklistDeviceForOpenSLESUsage(true)
-      // from the client for devices where OpenSL ES shall be disabled.
-  };
-
-  // List of devices where it has been verified that the built-in effect
-  // bad and where it makes sense to avoid using it and instead rely on the
-  // native WebRTC version instead. The device name is given by Build.MODEL.
-  private static final String[] BLACKLISTED_AEC_MODELS = new String[] {
-      // It is recommended to maintain a list of blacklisted models outside
-      // this package and instead call setWebRtcBasedAcousticEchoCanceler(true)
-      // from the client for devices where the built-in AEC shall be disabled.
-  };
-  private static final String[] BLACKLISTED_NS_MODELS = new String[] {
-    // It is recommended to maintain a list of blacklisted models outside
-    // this package and instead call setWebRtcBasedNoiseSuppressor(true)
-    // from the client for devices where the built-in NS shall be disabled.
-  };
-
-  // Use 16kHz as the default sample rate. A higher sample rate might prevent
-  // us from supporting communication mode on some older (e.g. ICS) devices.
-  private static final int DEFAULT_SAMPLE_RATE_HZ = 16000;
-  private static int defaultSampleRateHz = DEFAULT_SAMPLE_RATE_HZ;
-  // Set to true if setDefaultSampleRateHz() has been called.
-  private static boolean isDefaultSampleRateOverridden = false;
-
-  // By default, utilize hardware based audio effects for AEC and NS when
-  // available.
-  private static boolean useWebRtcBasedAcousticEchoCanceler = false;
-  private static boolean useWebRtcBasedNoiseSuppressor = false;
-
-  // Call these methods if any hardware based effect shall be replaced by a
-  // software based version provided by the WebRTC stack instead.
-  public static synchronized void setWebRtcBasedAcousticEchoCanceler(boolean enable) {
-    useWebRtcBasedAcousticEchoCanceler = enable;
-  }
-  public static synchronized void setWebRtcBasedNoiseSuppressor(boolean enable) {
-    useWebRtcBasedNoiseSuppressor = enable;
-  }
-  public static synchronized void setWebRtcBasedAutomaticGainControl(boolean enable) {
-    // TODO(henrika): deprecated; remove when no longer used by any client.
-    Logging.w(TAG, "setWebRtcBasedAutomaticGainControl() is deprecated");
-  }
-
-  public static synchronized boolean useWebRtcBasedAcousticEchoCanceler() {
-    if (useWebRtcBasedAcousticEchoCanceler) {
-      Logging.w(TAG, "Overriding default behavior; now using WebRTC AEC!");
-    }
-    return useWebRtcBasedAcousticEchoCanceler;
-  }
-  public static synchronized boolean useWebRtcBasedNoiseSuppressor() {
-    if (useWebRtcBasedNoiseSuppressor) {
-      Logging.w(TAG, "Overriding default behavior; now using WebRTC NS!");
-    }
-    return useWebRtcBasedNoiseSuppressor;
-  }
-  // TODO(henrika): deprecated; remove when no longer used by any client.
-  public static synchronized boolean useWebRtcBasedAutomaticGainControl() {
-    // Always return true here to avoid trying to use any built-in AGC.
-    return true;
-  }
-
-  // Returns true if the device supports an audio effect (AEC or NS).
-  // Four conditions must be fulfilled if functions are to return true:
-  // 1) the platform must support the built-in (HW) effect,
-  // 2) explicit use (override) of a WebRTC based version must not be set,
-  // 3) the device must not be blacklisted for use of the effect, and
-  // 4) the UUID of the effect must be approved (some UUIDs can be excluded).
-  public static boolean isAcousticEchoCancelerSupported() {
-    return WebRtcAudioEffects.canUseAcousticEchoCanceler();
-  }
-  public static boolean isNoiseSuppressorSupported() {
-    return WebRtcAudioEffects.canUseNoiseSuppressor();
-  }
-  // TODO(henrika): deprecated; remove when no longer used by any client.
-  public static boolean isAutomaticGainControlSupported() {
-    // Always return false here to avoid trying to use any built-in AGC.
-    return false;
-  }
-
-  // Call this method if the default handling of querying the native sample
-  // rate shall be overridden. Can be useful on some devices where the
-  // available Android APIs are known to return invalid results.
-  public static synchronized void setDefaultSampleRateHz(int sampleRateHz) {
-    isDefaultSampleRateOverridden = true;
-    defaultSampleRateHz = sampleRateHz;
-  }
-
-  public static synchronized boolean isDefaultSampleRateOverridden() {
-    return isDefaultSampleRateOverridden;
-  }
-
-  public static synchronized int getDefaultSampleRateHz() {
-    return defaultSampleRateHz;
-  }
-
-  public static List<String> getBlackListedModelsForAecUsage() {
-    return Arrays.asList(WebRtcAudioUtils.BLACKLISTED_AEC_MODELS);
-  }
-
-  public static List<String> getBlackListedModelsForNsUsage() {
-    return Arrays.asList(WebRtcAudioUtils.BLACKLISTED_NS_MODELS);
-  }
-
-  public static boolean runningOnJellyBeanMR1OrHigher() {
-    // November 2012: Android 4.2. API Level 17.
-    return Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1;
-  }
-
-  public static boolean runningOnJellyBeanMR2OrHigher() {
-    // July 24, 2013: Android 4.3. API Level 18.
-    return Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2;
-  }
-
-  public static boolean runningOnLollipopOrHigher() {
-    // API Level 21.
-    return Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP;
-  }
-
-  public static boolean runningOnMarshmallowOrHigher() {
-    // API Level 23.
-    return Build.VERSION.SDK_INT >= Build.VERSION_CODES.M;
-  }
-
-  public static boolean runningOnNougatOrHigher() {
-    // API Level 24.
-    return Build.VERSION.SDK_INT >= Build.VERSION_CODES.N;
-  }
-
-  // Helper method for building a string of thread information.
-  public static String getThreadInfo() {
-    return "@[name=" + Thread.currentThread().getName() + ", id=" + Thread.currentThread().getId()
-        + "]";
-  }
-
-  // Returns true if we're running on emulator.
-  public static boolean runningOnEmulator() {
-    return Build.HARDWARE.equals("goldfish") && Build.BRAND.startsWith("generic_");
-  }
-
-  // Returns true if the device is blacklisted for OpenSL ES usage.
-  public static boolean deviceIsBlacklistedForOpenSLESUsage() {
-    List<String> blackListedModels = Arrays.asList(BLACKLISTED_OPEN_SL_ES_MODELS);
-    return blackListedModels.contains(Build.MODEL);
-  }
-
-  // Information about the current build, taken from system properties.
-  public static void logDeviceInfo(String tag) {
-    Logging.d(tag, "Android SDK: " + Build.VERSION.SDK_INT + ", "
-            + "Release: " + Build.VERSION.RELEASE + ", "
-            + "Brand: " + Build.BRAND + ", "
-            + "Device: " + Build.DEVICE + ", "
-            + "Id: " + Build.ID + ", "
-            + "Hardware: " + Build.HARDWARE + ", "
-            + "Manufacturer: " + Build.MANUFACTURER + ", "
-            + "Model: " + Build.MODEL + ", "
-            + "Product: " + Build.PRODUCT);
-  }
-
-  // Checks if the process has as specified permission or not.
-  public static boolean hasPermission(Context context, String permission) {
-    return context.checkPermission(permission, Process.myPid(), Process.myUid())
-        == PackageManager.PERMISSION_GRANTED;
-  }
-}
diff --git a/modules/audio_device/android/opensles_common.cc b/modules/audio_device/android/opensles_common.cc
deleted file mode 100644
index 65ffbbe..0000000
--- a/modules/audio_device/android/opensles_common.cc
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- *  Copyright (c) 2013 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_device/android/opensles_common.h"
-
-#include <SLES/OpenSLES.h>
-
-#include "webrtc/rtc_base/arraysize.h"
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-
-// Returns a string representation given an integer SL_RESULT_XXX code.
-// The mapping can be found in <SLES/OpenSLES.h>.
-const char* GetSLErrorString(size_t code) {
-  static const char* sl_error_strings[] = {
-      "SL_RESULT_SUCCESS",                 // 0
-      "SL_RESULT_PRECONDITIONS_VIOLATED",  // 1
-      "SL_RESULT_PARAMETER_INVALID",       // 2
-      "SL_RESULT_MEMORY_FAILURE",          // 3
-      "SL_RESULT_RESOURCE_ERROR",          // 4
-      "SL_RESULT_RESOURCE_LOST",           // 5
-      "SL_RESULT_IO_ERROR",                // 6
-      "SL_RESULT_BUFFER_INSUFFICIENT",     // 7
-      "SL_RESULT_CONTENT_CORRUPTED",       // 8
-      "SL_RESULT_CONTENT_UNSUPPORTED",     // 9
-      "SL_RESULT_CONTENT_NOT_FOUND",       // 10
-      "SL_RESULT_PERMISSION_DENIED",       // 11
-      "SL_RESULT_FEATURE_UNSUPPORTED",     // 12
-      "SL_RESULT_INTERNAL_ERROR",          // 13
-      "SL_RESULT_UNKNOWN_ERROR",           // 14
-      "SL_RESULT_OPERATION_ABORTED",       // 15
-      "SL_RESULT_CONTROL_LOST",            // 16
-  };
-
-  if (code >= arraysize(sl_error_strings)) {
-    return "SL_RESULT_UNKNOWN_ERROR";
-  }
-  return sl_error_strings[code];
-}
-
-SLDataFormat_PCM CreatePCMConfiguration(size_t channels,
-                                        int sample_rate,
-                                        size_t bits_per_sample) {
-  RTC_CHECK_EQ(bits_per_sample, SL_PCMSAMPLEFORMAT_FIXED_16);
-  SLDataFormat_PCM format;
-  format.formatType = SL_DATAFORMAT_PCM;
-  format.numChannels = static_cast<SLuint32>(channels);
-  // Note that, the unit of sample rate is actually in milliHertz and not Hertz.
-  switch (sample_rate) {
-    case 8000:
-      format.samplesPerSec = SL_SAMPLINGRATE_8;
-      break;
-    case 16000:
-      format.samplesPerSec = SL_SAMPLINGRATE_16;
-      break;
-    case 22050:
-      format.samplesPerSec = SL_SAMPLINGRATE_22_05;
-      break;
-    case 32000:
-      format.samplesPerSec = SL_SAMPLINGRATE_32;
-      break;
-    case 44100:
-      format.samplesPerSec = SL_SAMPLINGRATE_44_1;
-      break;
-    case 48000:
-      format.samplesPerSec = SL_SAMPLINGRATE_48;
-      break;
-    case 64000:
-      format.samplesPerSec = SL_SAMPLINGRATE_64;
-      break;
-    case 88200:
-      format.samplesPerSec = SL_SAMPLINGRATE_88_2;
-      break;
-    case 96000:
-      format.samplesPerSec = SL_SAMPLINGRATE_96;
-      break;
-    default:
-      RTC_CHECK(false) << "Unsupported sample rate: " << sample_rate;
-      break;
-  }
-  format.bitsPerSample = SL_PCMSAMPLEFORMAT_FIXED_16;
-  format.containerSize = SL_PCMSAMPLEFORMAT_FIXED_16;
-  format.endianness = SL_BYTEORDER_LITTLEENDIAN;
-  if (format.numChannels == 1) {
-    format.channelMask = SL_SPEAKER_FRONT_CENTER;
-  } else if (format.numChannels == 2) {
-    format.channelMask = SL_SPEAKER_FRONT_LEFT | SL_SPEAKER_FRONT_RIGHT;
-  } else {
-    RTC_CHECK(false) << "Unsupported number of channels: "
-                     << format.numChannels;
-  }
-  return format;
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_device/android/opensles_common.h b/modules/audio_device/android/opensles_common.h
deleted file mode 100644
index c71ae8d..0000000
--- a/modules/audio_device/android/opensles_common.h
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- *  Copyright (c) 2013 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_DEVICE_ANDROID_OPENSLES_COMMON_H_
-#define WEBRTC_MODULES_AUDIO_DEVICE_ANDROID_OPENSLES_COMMON_H_
-
-#include <stddef.h>
-#include <SLES/OpenSLES.h>
-
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-
-// Returns a string representation given an integer SL_RESULT_XXX code.
-// The mapping can be found in <SLES/OpenSLES.h>.
-const char* GetSLErrorString(size_t code);
-
-// Configures an SL_DATAFORMAT_PCM structure based on native audio parameters.
-SLDataFormat_PCM CreatePCMConfiguration(size_t channels,
-                                        int sample_rate,
-                                        size_t bits_per_sample);
-
-// Helper class for using SLObjectItf interfaces.
-template <typename SLType, typename SLDerefType>
-class ScopedSLObject {
- public:
-  ScopedSLObject() : obj_(nullptr) {}
-
-  ~ScopedSLObject() { Reset(); }
-
-  SLType* Receive() {
-    RTC_DCHECK(!obj_);
-    return &obj_;
-  }
-
-  SLDerefType operator->() { return *obj_; }
-
-  SLType Get() const { return obj_; }
-
-  void Reset() {
-    if (obj_) {
-      (*obj_)->Destroy(obj_);
-      obj_ = nullptr;
-    }
-  }
-
- private:
-  SLType obj_;
-};
-
-typedef ScopedSLObject<SLObjectItf, const SLObjectItf_*> ScopedSLObjectItf;
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_DEVICE_ANDROID_OPENSLES_COMMON_H_
diff --git a/modules/audio_device/android/opensles_player.cc b/modules/audio_device/android/opensles_player.cc
deleted file mode 100644
index 3a40bf4..0000000
--- a/modules/audio_device/android/opensles_player.cc
+++ /dev/null
@@ -1,430 +0,0 @@
-/*
- *  Copyright (c) 2015 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_device/android/opensles_player.h"
-
-#include <android/log.h>
-
-#include "webrtc/api/array_view.h"
-#include "webrtc/modules/audio_device/android/audio_common.h"
-#include "webrtc/modules/audio_device/android/audio_manager.h"
-#include "webrtc/modules/audio_device/fine_audio_buffer.h"
-#include "webrtc/rtc_base/arraysize.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/format_macros.h"
-#include "webrtc/rtc_base/timeutils.h"
-
-#define TAG "OpenSLESPlayer"
-#define ALOGV(...) __android_log_print(ANDROID_LOG_VERBOSE, TAG, __VA_ARGS__)
-#define ALOGD(...) __android_log_print(ANDROID_LOG_DEBUG, TAG, __VA_ARGS__)
-#define ALOGE(...) __android_log_print(ANDROID_LOG_ERROR, TAG, __VA_ARGS__)
-#define ALOGW(...) __android_log_print(ANDROID_LOG_WARN, TAG, __VA_ARGS__)
-#define ALOGI(...) __android_log_print(ANDROID_LOG_INFO, TAG, __VA_ARGS__)
-
-#define RETURN_ON_ERROR(op, ...)                          \
-  do {                                                    \
-    SLresult err = (op);                                  \
-    if (err != SL_RESULT_SUCCESS) {                       \
-      ALOGE("%s failed: %s", #op, GetSLErrorString(err)); \
-      return __VA_ARGS__;                                 \
-    }                                                     \
-  } while (0)
-
-namespace webrtc {
-
-OpenSLESPlayer::OpenSLESPlayer(AudioManager* audio_manager)
-    : audio_manager_(audio_manager),
-      audio_parameters_(audio_manager->GetPlayoutAudioParameters()),
-      audio_device_buffer_(nullptr),
-      initialized_(false),
-      playing_(false),
-      buffer_index_(0),
-      engine_(nullptr),
-      player_(nullptr),
-      simple_buffer_queue_(nullptr),
-      volume_(nullptr),
-      last_play_time_(0) {
-  ALOGD("ctor%s", GetThreadInfo().c_str());
-  // Use native audio output parameters provided by the audio manager and
-  // define the PCM format structure.
-  pcm_format_ = CreatePCMConfiguration(audio_parameters_.channels(),
-                                       audio_parameters_.sample_rate(),
-                                       audio_parameters_.bits_per_sample());
-  // Detach from this thread since we want to use the checker to verify calls
-  // from the internal  audio thread.
-  thread_checker_opensles_.DetachFromThread();
-}
-
-OpenSLESPlayer::~OpenSLESPlayer() {
-  ALOGD("dtor%s", GetThreadInfo().c_str());
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  Terminate();
-  DestroyAudioPlayer();
-  DestroyMix();
-  engine_ = nullptr;
-  RTC_DCHECK(!engine_);
-  RTC_DCHECK(!output_mix_.Get());
-  RTC_DCHECK(!player_);
-  RTC_DCHECK(!simple_buffer_queue_);
-  RTC_DCHECK(!volume_);
-}
-
-int OpenSLESPlayer::Init() {
-  ALOGD("Init%s", GetThreadInfo().c_str());
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  if (audio_parameters_.channels() == 2) {
-    // TODO(henrika): FineAudioBuffer needs more work to support stereo.
-    ALOGE("OpenSLESPlayer does not support stereo");
-    return -1;
-  }
-  return 0;
-}
-
-int OpenSLESPlayer::Terminate() {
-  ALOGD("Terminate%s", GetThreadInfo().c_str());
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  StopPlayout();
-  return 0;
-}
-
-int OpenSLESPlayer::InitPlayout() {
-  ALOGD("InitPlayout%s", GetThreadInfo().c_str());
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  RTC_DCHECK(!initialized_);
-  RTC_DCHECK(!playing_);
-  if (!ObtainEngineInterface()) {
-    ALOGE("Failed to obtain SL Engine interface");
-    return -1;
-  }
-  CreateMix();
-  initialized_ = true;
-  buffer_index_ = 0;
-  return 0;
-}
-
-int OpenSLESPlayer::StartPlayout() {
-  ALOGD("StartPlayout%s", GetThreadInfo().c_str());
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  RTC_DCHECK(initialized_);
-  RTC_DCHECK(!playing_);
-  if (fine_audio_buffer_) {
-    fine_audio_buffer_->ResetPlayout();
-  }
-  // The number of lower latency audio players is limited, hence we create the
-  // audio player in Start() and destroy it in Stop().
-  CreateAudioPlayer();
-  // Fill up audio buffers to avoid initial glitch and to ensure that playback
-  // starts when mode is later changed to SL_PLAYSTATE_PLAYING.
-  // TODO(henrika): we can save some delay by only making one call to
-  // EnqueuePlayoutData. Most likely not worth the risk of adding a glitch.
-  last_play_time_ = rtc::Time();
-  for (int i = 0; i < kNumOfOpenSLESBuffers; ++i) {
-    EnqueuePlayoutData(true);
-  }
-  // Start streaming data by setting the play state to SL_PLAYSTATE_PLAYING.
-  // For a player object, when the object is in the SL_PLAYSTATE_PLAYING
-  // state, adding buffers will implicitly start playback.
-  RETURN_ON_ERROR((*player_)->SetPlayState(player_, SL_PLAYSTATE_PLAYING), -1);
-  playing_ = (GetPlayState() == SL_PLAYSTATE_PLAYING);
-  RTC_DCHECK(playing_);
-  return 0;
-}
-
-int OpenSLESPlayer::StopPlayout() {
-  ALOGD("StopPlayout%s", GetThreadInfo().c_str());
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  if (!initialized_ || !playing_) {
-    return 0;
-  }
-  // Stop playing by setting the play state to SL_PLAYSTATE_STOPPED.
-  RETURN_ON_ERROR((*player_)->SetPlayState(player_, SL_PLAYSTATE_STOPPED), -1);
-  // Clear the buffer queue to flush out any remaining data.
-  RETURN_ON_ERROR((*simple_buffer_queue_)->Clear(simple_buffer_queue_), -1);
-#if RTC_DCHECK_IS_ON
-  // Verify that the buffer queue is in fact cleared as it should.
-  SLAndroidSimpleBufferQueueState buffer_queue_state;
-  (*simple_buffer_queue_)->GetState(simple_buffer_queue_, &buffer_queue_state);
-  RTC_DCHECK_EQ(0, buffer_queue_state.count);
-  RTC_DCHECK_EQ(0, buffer_queue_state.index);
-#endif
-  // The number of lower latency audio players is limited, hence we create the
-  // audio player in Start() and destroy it in Stop().
-  DestroyAudioPlayer();
-  thread_checker_opensles_.DetachFromThread();
-  initialized_ = false;
-  playing_ = false;
-  return 0;
-}
-
-int OpenSLESPlayer::SpeakerVolumeIsAvailable(bool& available) {
-  available = false;
-  return 0;
-}
-
-int OpenSLESPlayer::MaxSpeakerVolume(uint32_t& maxVolume) const {
-  return -1;
-}
-
-int OpenSLESPlayer::MinSpeakerVolume(uint32_t& minVolume) const {
-  return -1;
-}
-
-int OpenSLESPlayer::SetSpeakerVolume(uint32_t volume) {
-  return -1;
-}
-
-int OpenSLESPlayer::SpeakerVolume(uint32_t& volume) const {
-  return -1;
-}
-
-void OpenSLESPlayer::AttachAudioBuffer(AudioDeviceBuffer* audioBuffer) {
-  ALOGD("AttachAudioBuffer");
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  audio_device_buffer_ = audioBuffer;
-  const int sample_rate_hz = audio_parameters_.sample_rate();
-  ALOGD("SetPlayoutSampleRate(%d)", sample_rate_hz);
-  audio_device_buffer_->SetPlayoutSampleRate(sample_rate_hz);
-  const size_t channels = audio_parameters_.channels();
-  ALOGD("SetPlayoutChannels(%" PRIuS ")", channels);
-  audio_device_buffer_->SetPlayoutChannels(channels);
-  RTC_CHECK(audio_device_buffer_);
-  AllocateDataBuffers();
-}
-
-void OpenSLESPlayer::AllocateDataBuffers() {
-  ALOGD("AllocateDataBuffers");
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  RTC_DCHECK(!simple_buffer_queue_);
-  RTC_CHECK(audio_device_buffer_);
-  // Create a modified audio buffer class which allows us to ask for any number
-  // of samples (and not only multiple of 10ms) to match the native OpenSL ES
-  // buffer size. The native buffer size corresponds to the
-  // PROPERTY_OUTPUT_FRAMES_PER_BUFFER property which is the number of audio
-  // frames that the HAL (Hardware Abstraction Layer) buffer can hold. It is
-  // recommended to construct audio buffers so that they contain an exact
-  // multiple of this number. If so, callbacks will occur at regular intervals,
-  // which reduces jitter.
-  const size_t buffer_size_in_bytes = audio_parameters_.GetBytesPerBuffer();
-  ALOGD("native buffer size: %" PRIuS, buffer_size_in_bytes);
-  ALOGD("native buffer size in ms: %.2f",
-        audio_parameters_.GetBufferSizeInMilliseconds());
-  fine_audio_buffer_.reset(new FineAudioBuffer(audio_device_buffer_,
-                                               audio_parameters_.sample_rate(),
-                                               2 * buffer_size_in_bytes));
-  // Allocated memory for audio buffers.
-  for (int i = 0; i < kNumOfOpenSLESBuffers; ++i) {
-    audio_buffers_[i].reset(new SLint8[buffer_size_in_bytes]);
-  }
-}
-
-bool OpenSLESPlayer::ObtainEngineInterface() {
-  ALOGD("ObtainEngineInterface");
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  if (engine_)
-    return true;
-  // Get access to (or create if not already existing) the global OpenSL Engine
-  // object.
-  SLObjectItf engine_object = audio_manager_->GetOpenSLEngine();
-  if (engine_object == nullptr) {
-    ALOGE("Failed to access the global OpenSL engine");
-    return false;
-  }
-  // Get the SL Engine Interface which is implicit.
-  RETURN_ON_ERROR(
-      (*engine_object)->GetInterface(engine_object, SL_IID_ENGINE, &engine_),
-      false);
-  return true;
-}
-
-bool OpenSLESPlayer::CreateMix() {
-  ALOGD("CreateMix");
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  RTC_DCHECK(engine_);
-  if (output_mix_.Get())
-    return true;
-
-  // Create the ouput mix on the engine object. No interfaces will be used.
-  RETURN_ON_ERROR((*engine_)->CreateOutputMix(engine_, output_mix_.Receive(), 0,
-                                              nullptr, nullptr),
-                  false);
-  RETURN_ON_ERROR(output_mix_->Realize(output_mix_.Get(), SL_BOOLEAN_FALSE),
-                  false);
-  return true;
-}
-
-void OpenSLESPlayer::DestroyMix() {
-  ALOGD("DestroyMix");
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  if (!output_mix_.Get())
-    return;
-  output_mix_.Reset();
-}
-
-bool OpenSLESPlayer::CreateAudioPlayer() {
-  ALOGD("CreateAudioPlayer");
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  RTC_DCHECK(output_mix_.Get());
-  if (player_object_.Get())
-    return true;
-  RTC_DCHECK(!player_);
-  RTC_DCHECK(!simple_buffer_queue_);
-  RTC_DCHECK(!volume_);
-
-  // source: Android Simple Buffer Queue Data Locator is source.
-  SLDataLocator_AndroidSimpleBufferQueue simple_buffer_queue = {
-      SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE,
-      static_cast<SLuint32>(kNumOfOpenSLESBuffers)};
-  SLDataSource audio_source = {&simple_buffer_queue, &pcm_format_};
-
-  // sink: OutputMix-based data is sink.
-  SLDataLocator_OutputMix locator_output_mix = {SL_DATALOCATOR_OUTPUTMIX,
-                                                output_mix_.Get()};
-  SLDataSink audio_sink = {&locator_output_mix, nullptr};
-
-  // Define interfaces that we indend to use and realize.
-  const SLInterfaceID interface_ids[] = {
-      SL_IID_ANDROIDCONFIGURATION, SL_IID_BUFFERQUEUE, SL_IID_VOLUME};
-  const SLboolean interface_required[] = {
-      SL_BOOLEAN_TRUE, SL_BOOLEAN_TRUE, SL_BOOLEAN_TRUE};
-
-  // Create the audio player on the engine interface.
-  RETURN_ON_ERROR(
-      (*engine_)->CreateAudioPlayer(
-          engine_, player_object_.Receive(), &audio_source, &audio_sink,
-          arraysize(interface_ids), interface_ids, interface_required),
-      false);
-
-  // Use the Android configuration interface to set platform-specific
-  // parameters. Should be done before player is realized.
-  SLAndroidConfigurationItf player_config;
-  RETURN_ON_ERROR(
-      player_object_->GetInterface(player_object_.Get(),
-                                   SL_IID_ANDROIDCONFIGURATION, &player_config),
-      false);
-  // Set audio player configuration to SL_ANDROID_STREAM_VOICE which
-  // corresponds to android.media.AudioManager.STREAM_VOICE_CALL.
-  SLint32 stream_type = SL_ANDROID_STREAM_VOICE;
-  RETURN_ON_ERROR(
-      (*player_config)
-          ->SetConfiguration(player_config, SL_ANDROID_KEY_STREAM_TYPE,
-                             &stream_type, sizeof(SLint32)),
-      false);
-
-  // Realize the audio player object after configuration has been set.
-  RETURN_ON_ERROR(
-      player_object_->Realize(player_object_.Get(), SL_BOOLEAN_FALSE), false);
-
-  // Get the SLPlayItf interface on the audio player.
-  RETURN_ON_ERROR(
-      player_object_->GetInterface(player_object_.Get(), SL_IID_PLAY, &player_),
-      false);
-
-  // Get the SLAndroidSimpleBufferQueueItf interface on the audio player.
-  RETURN_ON_ERROR(
-      player_object_->GetInterface(player_object_.Get(), SL_IID_BUFFERQUEUE,
-                                   &simple_buffer_queue_),
-      false);
-
-  // Register callback method for the Android Simple Buffer Queue interface.
-  // This method will be called when the native audio layer needs audio data.
-  RETURN_ON_ERROR((*simple_buffer_queue_)
-                      ->RegisterCallback(simple_buffer_queue_,
-                                         SimpleBufferQueueCallback, this),
-                  false);
-
-  // Get the SLVolumeItf interface on the audio player.
-  RETURN_ON_ERROR(player_object_->GetInterface(player_object_.Get(),
-                                               SL_IID_VOLUME, &volume_),
-                  false);
-
-  // TODO(henrika): might not be required to set volume to max here since it
-  // seems to be default on most devices. Might be required for unit tests.
-  // RETURN_ON_ERROR((*volume_)->SetVolumeLevel(volume_, 0), false);
-
-  return true;
-}
-
-void OpenSLESPlayer::DestroyAudioPlayer() {
-  ALOGD("DestroyAudioPlayer");
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  if (!player_object_.Get())
-    return;
-  (*simple_buffer_queue_)
-      ->RegisterCallback(simple_buffer_queue_, nullptr, nullptr);
-  player_object_.Reset();
-  player_ = nullptr;
-  simple_buffer_queue_ = nullptr;
-  volume_ = nullptr;
-}
-
-// static
-void OpenSLESPlayer::SimpleBufferQueueCallback(
-    SLAndroidSimpleBufferQueueItf caller,
-    void* context) {
-  OpenSLESPlayer* stream = reinterpret_cast<OpenSLESPlayer*>(context);
-  stream->FillBufferQueue();
-}
-
-void OpenSLESPlayer::FillBufferQueue() {
-  RTC_DCHECK(thread_checker_opensles_.CalledOnValidThread());
-  SLuint32 state = GetPlayState();
-  if (state != SL_PLAYSTATE_PLAYING) {
-    ALOGW("Buffer callback in non-playing state!");
-    return;
-  }
-  EnqueuePlayoutData(false);
-}
-
-void OpenSLESPlayer::EnqueuePlayoutData(bool silence) {
-  // Check delta time between two successive callbacks and provide a warning
-  // if it becomes very large.
-  // TODO(henrika): using 150ms as upper limit but this value is rather random.
-  const uint32_t current_time = rtc::Time();
-  const uint32_t diff = current_time - last_play_time_;
-  if (diff > 150) {
-    ALOGW("Bad OpenSL ES playout timing, dT=%u [ms]", diff);
-  }
-  last_play_time_ = current_time;
-  SLint8* audio_ptr = audio_buffers_[buffer_index_].get();
-  if (silence) {
-    RTC_DCHECK(thread_checker_.CalledOnValidThread());
-    // Avoid aquiring real audio data from WebRTC and fill the buffer with
-    // zeros instead. Used to prime the buffer with silence and to avoid asking
-    // for audio data from two different threads.
-    memset(audio_ptr, 0, audio_parameters_.GetBytesPerBuffer());
-  } else {
-    RTC_DCHECK(thread_checker_opensles_.CalledOnValidThread());
-    // Read audio data from the WebRTC source using the FineAudioBuffer object
-    // to adjust for differences in buffer size between WebRTC (10ms) and native
-    // OpenSL ES.
-    fine_audio_buffer_->GetPlayoutData(rtc::ArrayView<SLint8>(
-        audio_ptr, audio_parameters_.GetBytesPerBuffer()));
-  }
-  // Enqueue the decoded audio buffer for playback.
-  SLresult err = (*simple_buffer_queue_)
-                     ->Enqueue(simple_buffer_queue_, audio_ptr,
-                               audio_parameters_.GetBytesPerBuffer());
-  if (SL_RESULT_SUCCESS != err) {
-    ALOGE("Enqueue failed: %d", err);
-  }
-  buffer_index_ = (buffer_index_ + 1) % kNumOfOpenSLESBuffers;
-}
-
-SLuint32 OpenSLESPlayer::GetPlayState() const {
-  RTC_DCHECK(player_);
-  SLuint32 state;
-  SLresult err = (*player_)->GetPlayState(player_, &state);
-  if (SL_RESULT_SUCCESS != err) {
-    ALOGE("GetPlayState failed: %d", err);
-  }
-  return state;
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_device/android/opensles_player.h b/modules/audio_device/android/opensles_player.h
deleted file mode 100644
index d6fcd46..0000000
--- a/modules/audio_device/android/opensles_player.h
+++ /dev/null
@@ -1,196 +0,0 @@
-/*
- *  Copyright (c) 2015 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_DEVICE_ANDROID_OPENSLES_PLAYER_H_
-#define WEBRTC_MODULES_AUDIO_DEVICE_ANDROID_OPENSLES_PLAYER_H_
-
-#include <SLES/OpenSLES.h>
-#include <SLES/OpenSLES_Android.h>
-#include <SLES/OpenSLES_AndroidConfiguration.h>
-
-#include "webrtc/modules/audio_device/android/audio_common.h"
-#include "webrtc/modules/audio_device/android/audio_manager.h"
-#include "webrtc/modules/audio_device/android/opensles_common.h"
-#include "webrtc/modules/audio_device/audio_device_generic.h"
-#include "webrtc/modules/audio_device/include/audio_device_defines.h"
-#include "webrtc/modules/utility/include/helpers_android.h"
-#include "webrtc/rtc_base/thread_checker.h"
-
-namespace webrtc {
-
-class FineAudioBuffer;
-
-// Implements 16-bit mono PCM audio output support for Android using the
-// C based OpenSL ES API. No calls from C/C++ to Java using JNI is done.
-//
-// An instance must be created and destroyed on one and the same thread.
-// All public methods must also be called on the same thread. A thread checker
-// will RTC_DCHECK if any method is called on an invalid thread. Decoded audio
-// buffers are requested on a dedicated internal thread managed by the OpenSL
-// ES layer.
-//
-// The existing design forces the user to call InitPlayout() after Stoplayout()
-// to be able to call StartPlayout() again. This is inline with how the Java-
-// based implementation works.
-//
-// OpenSL ES is a native C API which have no Dalvik-related overhead such as
-// garbage collection pauses and it supports reduced audio output latency.
-// If the device doesn't claim this feature but supports API level 9 (Android
-// platform version 2.3) or later, then we can still use the OpenSL ES APIs but
-// the output latency may be higher.
-class OpenSLESPlayer {
- public:
-  // Beginning with API level 17 (Android 4.2), a buffer count of 2 or more is
-  // required for lower latency. Beginning with API level 18 (Android 4.3), a
-  // buffer count of 1 is sufficient for lower latency. In addition, the buffer
-  // size and sample rate must be compatible with the device's native output
-  // configuration provided via the audio manager at construction.
-  // TODO(henrika): perhaps set this value dynamically based on OS version.
-  static const int kNumOfOpenSLESBuffers = 2;
-
-  explicit OpenSLESPlayer(AudioManager* audio_manager);
-  ~OpenSLESPlayer();
-
-  int Init();
-  int Terminate();
-
-  int InitPlayout();
-  bool PlayoutIsInitialized() const { return initialized_; }
-
-  int StartPlayout();
-  int StopPlayout();
-  bool Playing() const { return playing_; }
-
-  int SpeakerVolumeIsAvailable(bool& available);
-  int SetSpeakerVolume(uint32_t volume);
-  int SpeakerVolume(uint32_t& volume) const;
-  int MaxSpeakerVolume(uint32_t& maxVolume) const;
-  int MinSpeakerVolume(uint32_t& minVolume) const;
-
-  void AttachAudioBuffer(AudioDeviceBuffer* audioBuffer);
-
- private:
-  // These callback methods are called when data is required for playout.
-  // They are both called from an internal "OpenSL ES thread" which is not
-  // attached to the Dalvik VM.
-  static void SimpleBufferQueueCallback(SLAndroidSimpleBufferQueueItf caller,
-                                        void* context);
-  void FillBufferQueue();
-  // Reads audio data in PCM format using the AudioDeviceBuffer.
-  // Can be called both on the main thread (during Start()) and from the
-  // internal audio thread while output streaming is active.
-  // If the |silence| flag is set, the audio is filled with zeros instead of
-  // asking the WebRTC layer for real audio data. This procedure is also known
-  // as audio priming.
-  void EnqueuePlayoutData(bool silence);
-
-  // Allocate memory for audio buffers which will be used to render audio
-  // via the SLAndroidSimpleBufferQueueItf interface.
-  void AllocateDataBuffers();
-
-  // Obtaines the SL Engine Interface from the existing global Engine object.
-  // The interface exposes creation methods of all the OpenSL ES object types.
-  // This method defines the |engine_| member variable.
-  bool ObtainEngineInterface();
-
-  // Creates/destroys the output mix object.
-  bool CreateMix();
-  void DestroyMix();
-
-  // Creates/destroys the audio player and the simple-buffer object.
-  // Also creates the volume object.
-  bool CreateAudioPlayer();
-  void DestroyAudioPlayer();
-
-  SLuint32 GetPlayState() const;
-
-  // Ensures that methods are called from the same thread as this object is
-  // created on.
-  rtc::ThreadChecker thread_checker_;
-
-  // Stores thread ID in first call to SimpleBufferQueueCallback() from internal
-  // non-application thread which is not attached to the Dalvik JVM.
-  // Detached during construction of this object.
-  rtc::ThreadChecker thread_checker_opensles_;
-
-  // Raw pointer to the audio manager injected at construction. Used to cache
-  // audio parameters and to access the global SL engine object needed by the
-  // ObtainEngineInterface() method. The audio manager outlives any instance of
-  // this class.
-  AudioManager* audio_manager_;
-
-  // Contains audio parameters provided to this class at construction by the
-  // AudioManager.
-  const AudioParameters audio_parameters_;
-
-  // Raw pointer handle provided to us in AttachAudioBuffer(). Owned by the
-  // AudioDeviceModuleImpl class and called by AudioDeviceModule::Create().
-  AudioDeviceBuffer* audio_device_buffer_;
-
-  bool initialized_;
-  bool playing_;
-
-  // PCM-type format definition.
-  // TODO(henrika): add support for SLAndroidDataFormat_PCM_EX (android-21) if
-  // 32-bit float representation is needed.
-  SLDataFormat_PCM pcm_format_;
-
-  // Queue of audio buffers to be used by the player object for rendering
-  // audio. They will be used in a Round-robin way and the size of each buffer
-  // is given by FineAudioBuffer::RequiredBufferSizeBytes().
-  std::unique_ptr<SLint8[]> audio_buffers_[kNumOfOpenSLESBuffers];
-
-  // FineAudioBuffer takes an AudioDeviceBuffer which delivers audio data
-  // in chunks of 10ms. It then allows for this data to be pulled in
-  // a finer or coarser granularity. I.e. interacting with this class instead
-  // of directly with the AudioDeviceBuffer one can ask for any number of
-  // audio data samples.
-  // Example: native buffer size can be 192 audio frames at 48kHz sample rate.
-  // WebRTC will provide 480 audio frames per 10ms but OpenSL ES asks for 192
-  // in each callback (one every 4th ms). This class can then ask for 192 and
-  // the FineAudioBuffer will ask WebRTC for new data approximately only every
-  // second callback and also cache non-utilized audio.
-  std::unique_ptr<FineAudioBuffer> fine_audio_buffer_;
-
-  // Keeps track of active audio buffer 'n' in the audio_buffers_[n] queue.
-  // Example (kNumOfOpenSLESBuffers = 2): counts 0, 1, 0, 1, ...
-  int buffer_index_;
-
-  // This interface exposes creation methods for all the OpenSL ES object types.
-  // It is the OpenSL ES API entry point.
-  SLEngineItf engine_;
-
-  // Output mix object to be used by the player object.
-  webrtc::ScopedSLObjectItf output_mix_;
-
-  // The audio player media object plays out audio to the speakers. It also
-  // supports volume control.
-  webrtc::ScopedSLObjectItf player_object_;
-
-  // This interface is supported on the audio player and it controls the state
-  // of the audio player.
-  SLPlayItf player_;
-
-  // The Android Simple Buffer Queue interface is supported on the audio player
-  // and it provides methods to send audio data from the source to the audio
-  // player for rendering.
-  SLAndroidSimpleBufferQueueItf simple_buffer_queue_;
-
-  // This interface exposes controls for manipulating the object’s audio volume
-  // properties. This interface is supported on the Audio Player object.
-  SLVolumeItf volume_;
-
-  // Last time the OpenSL ES layer asked for audio data to play out.
-  uint32_t last_play_time_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_DEVICE_ANDROID_OPENSLES_PLAYER_H_
diff --git a/modules/audio_device/android/opensles_recorder.cc b/modules/audio_device/android/opensles_recorder.cc
deleted file mode 100644
index df94ba8..0000000
--- a/modules/audio_device/android/opensles_recorder.cc
+++ /dev/null
@@ -1,433 +0,0 @@
-/*
- *  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_device/android/opensles_recorder.h"
-
-#include <android/log.h>
-
-#include "webrtc/api/array_view.h"
-#include "webrtc/modules/audio_device/android/audio_common.h"
-#include "webrtc/modules/audio_device/android/audio_manager.h"
-#include "webrtc/modules/audio_device/fine_audio_buffer.h"
-#include "webrtc/rtc_base/arraysize.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/format_macros.h"
-#include "webrtc/rtc_base/timeutils.h"
-
-#define TAG "OpenSLESRecorder"
-#define ALOGV(...) __android_log_print(ANDROID_LOG_VERBOSE, TAG, __VA_ARGS__)
-#define ALOGD(...) __android_log_print(ANDROID_LOG_DEBUG, TAG, __VA_ARGS__)
-#define ALOGE(...) __android_log_print(ANDROID_LOG_ERROR, TAG, __VA_ARGS__)
-#define ALOGW(...) __android_log_print(ANDROID_LOG_WARN, TAG, __VA_ARGS__)
-#define ALOGI(...) __android_log_print(ANDROID_LOG_INFO, TAG, __VA_ARGS__)
-
-#define LOG_ON_ERROR(op)                                    \
-  [](SLresult err) {                                        \
-    if (err != SL_RESULT_SUCCESS) {                         \
-      ALOGE("%s:%d %s failed: %s", __FILE__, __LINE__, #op, \
-            GetSLErrorString(err));                         \
-      return true;                                          \
-    }                                                       \
-    return false;                                           \
-  }(op)
-
-namespace webrtc {
-
-OpenSLESRecorder::OpenSLESRecorder(AudioManager* audio_manager)
-    : audio_manager_(audio_manager),
-      audio_parameters_(audio_manager->GetRecordAudioParameters()),
-      audio_device_buffer_(nullptr),
-      initialized_(false),
-      recording_(false),
-      engine_(nullptr),
-      recorder_(nullptr),
-      simple_buffer_queue_(nullptr),
-      buffer_index_(0),
-      last_rec_time_(0) {
-  ALOGD("ctor%s", GetThreadInfo().c_str());
-  // Detach from this thread since we want to use the checker to verify calls
-  // from the internal  audio thread.
-  thread_checker_opensles_.DetachFromThread();
-  // Use native audio output parameters provided by the audio manager and
-  // define the PCM format structure.
-  pcm_format_ = CreatePCMConfiguration(audio_parameters_.channels(),
-                                       audio_parameters_.sample_rate(),
-                                       audio_parameters_.bits_per_sample());
-}
-
-OpenSLESRecorder::~OpenSLESRecorder() {
-  ALOGD("dtor%s", GetThreadInfo().c_str());
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  Terminate();
-  DestroyAudioRecorder();
-  engine_ = nullptr;
-  RTC_DCHECK(!engine_);
-  RTC_DCHECK(!recorder_);
-  RTC_DCHECK(!simple_buffer_queue_);
-}
-
-int OpenSLESRecorder::Init() {
-  ALOGD("Init%s", GetThreadInfo().c_str());
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  if (audio_parameters_.channels() == 2) {
-    // TODO(henrika): FineAudioBuffer needs more work to support stereo.
-    ALOGE("OpenSLESRecorder does not support stereo");
-    return -1;
-  }
-  return 0;
-}
-
-int OpenSLESRecorder::Terminate() {
-  ALOGD("Terminate%s", GetThreadInfo().c_str());
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  StopRecording();
-  return 0;
-}
-
-int OpenSLESRecorder::InitRecording() {
-  ALOGD("InitRecording%s", GetThreadInfo().c_str());
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  RTC_DCHECK(!initialized_);
-  RTC_DCHECK(!recording_);
-  if (!ObtainEngineInterface()) {
-    ALOGE("Failed to obtain SL Engine interface");
-    return -1;
-  }
-  CreateAudioRecorder();
-  initialized_ = true;
-  buffer_index_ = 0;
-  return 0;
-}
-
-int OpenSLESRecorder::StartRecording() {
-  ALOGD("StartRecording%s", GetThreadInfo().c_str());
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  RTC_DCHECK(initialized_);
-  RTC_DCHECK(!recording_);
-  if (fine_audio_buffer_) {
-    fine_audio_buffer_->ResetRecord();
-  }
-  // Add buffers to the queue before changing state to SL_RECORDSTATE_RECORDING
-  // to ensure that recording starts as soon as the state is modified. On some
-  // devices, SLAndroidSimpleBufferQueue::Clear() used in Stop() does not flush
-  // the buffers as intended and we therefore check the number of buffers
-  // already queued first. Enqueue() can return SL_RESULT_BUFFER_INSUFFICIENT
-  // otherwise.
-  int num_buffers_in_queue = GetBufferCount();
-  for (int i = 0; i < kNumOfOpenSLESBuffers - num_buffers_in_queue; ++i) {
-    if (!EnqueueAudioBuffer()) {
-      recording_ = false;
-      return -1;
-    }
-  }
-  num_buffers_in_queue = GetBufferCount();
-  RTC_DCHECK_EQ(num_buffers_in_queue, kNumOfOpenSLESBuffers);
-  LogBufferState();
-  // Start audio recording by changing the state to SL_RECORDSTATE_RECORDING.
-  // Given that buffers are already enqueued, recording should start at once.
-  // The macro returns -1 if recording fails to start.
-  last_rec_time_ = rtc::Time();
-  if (LOG_ON_ERROR(
-          (*recorder_)->SetRecordState(recorder_, SL_RECORDSTATE_RECORDING))) {
-    return -1;
-  }
-  recording_ = (GetRecordState() == SL_RECORDSTATE_RECORDING);
-  RTC_DCHECK(recording_);
-  return 0;
-}
-
-int OpenSLESRecorder::StopRecording() {
-  ALOGD("StopRecording%s", GetThreadInfo().c_str());
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  if (!initialized_ || !recording_) {
-    return 0;
-  }
-  // Stop recording by setting the record state to SL_RECORDSTATE_STOPPED.
-  if (LOG_ON_ERROR(
-          (*recorder_)->SetRecordState(recorder_, SL_RECORDSTATE_STOPPED))) {
-    return -1;
-  }
-  // Clear the buffer queue to get rid of old data when resuming recording.
-  if (LOG_ON_ERROR((*simple_buffer_queue_)->Clear(simple_buffer_queue_))) {
-    return -1;
-  }
-  thread_checker_opensles_.DetachFromThread();
-  initialized_ = false;
-  recording_ = false;
-  return 0;
-}
-
-void OpenSLESRecorder::AttachAudioBuffer(AudioDeviceBuffer* audio_buffer) {
-  ALOGD("AttachAudioBuffer");
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  RTC_CHECK(audio_buffer);
-  audio_device_buffer_ = audio_buffer;
-  // Ensure that the audio device buffer is informed about the native sample
-  // rate used on the recording side.
-  const int sample_rate_hz = audio_parameters_.sample_rate();
-  ALOGD("SetRecordingSampleRate(%d)", sample_rate_hz);
-  audio_device_buffer_->SetRecordingSampleRate(sample_rate_hz);
-  // Ensure that the audio device buffer is informed about the number of
-  // channels preferred by the OS on the recording side.
-  const size_t channels = audio_parameters_.channels();
-  ALOGD("SetRecordingChannels(%" PRIuS ")", channels);
-  audio_device_buffer_->SetRecordingChannels(channels);
-  // Allocated memory for internal data buffers given existing audio parameters.
-  AllocateDataBuffers();
-}
-
-int OpenSLESRecorder::EnableBuiltInAEC(bool enable) {
-  ALOGD("EnableBuiltInAEC(%d)", enable);
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  ALOGE("Not implemented");
-  return 0;
-}
-
-int OpenSLESRecorder::EnableBuiltInAGC(bool enable) {
-  ALOGD("EnableBuiltInAGC(%d)", enable);
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  ALOGE("Not implemented");
-  return 0;
-}
-
-int OpenSLESRecorder::EnableBuiltInNS(bool enable) {
-  ALOGD("EnableBuiltInNS(%d)", enable);
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  ALOGE("Not implemented");
-  return 0;
-}
-
-bool OpenSLESRecorder::ObtainEngineInterface() {
-  ALOGD("ObtainEngineInterface");
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  if (engine_)
-    return true;
-  // Get access to (or create if not already existing) the global OpenSL Engine
-  // object.
-  SLObjectItf engine_object = audio_manager_->GetOpenSLEngine();
-  if (engine_object == nullptr) {
-    ALOGE("Failed to access the global OpenSL engine");
-    return false;
-  }
-  // Get the SL Engine Interface which is implicit.
-  if (LOG_ON_ERROR(
-          (*engine_object)
-              ->GetInterface(engine_object, SL_IID_ENGINE, &engine_))) {
-    return false;
-  }
-  return true;
-}
-
-bool OpenSLESRecorder::CreateAudioRecorder() {
-  ALOGD("CreateAudioRecorder");
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  if (recorder_object_.Get())
-    return true;
-  RTC_DCHECK(!recorder_);
-  RTC_DCHECK(!simple_buffer_queue_);
-
-  // Audio source configuration.
-  SLDataLocator_IODevice mic_locator = {SL_DATALOCATOR_IODEVICE,
-                                        SL_IODEVICE_AUDIOINPUT,
-                                        SL_DEFAULTDEVICEID_AUDIOINPUT, NULL};
-  SLDataSource audio_source = {&mic_locator, NULL};
-
-  // Audio sink configuration.
-  SLDataLocator_AndroidSimpleBufferQueue buffer_queue = {
-      SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE,
-      static_cast<SLuint32>(kNumOfOpenSLESBuffers)};
-  SLDataSink audio_sink = {&buffer_queue, &pcm_format_};
-
-  // Create the audio recorder object (requires the RECORD_AUDIO permission).
-  // Do not realize the recorder yet. Set the configuration first.
-  const SLInterfaceID interface_id[] = {SL_IID_ANDROIDSIMPLEBUFFERQUEUE,
-                                        SL_IID_ANDROIDCONFIGURATION};
-  const SLboolean interface_required[] = {SL_BOOLEAN_TRUE, SL_BOOLEAN_TRUE};
-  if (LOG_ON_ERROR((*engine_)->CreateAudioRecorder(
-          engine_, recorder_object_.Receive(), &audio_source, &audio_sink,
-          arraysize(interface_id), interface_id, interface_required))) {
-    return false;
-  }
-
-  // Configure the audio recorder (before it is realized).
-  SLAndroidConfigurationItf recorder_config;
-  if (LOG_ON_ERROR((recorder_object_->GetInterface(recorder_object_.Get(),
-                                                   SL_IID_ANDROIDCONFIGURATION,
-                                                   &recorder_config)))) {
-    return false;
-  }
-
-  // Uses the default microphone tuned for audio communication.
-  // Note that, SL_ANDROID_RECORDING_PRESET_VOICE_RECOGNITION leads to a fast
-  // track but also excludes usage of required effects like AEC, AGC and NS.
-  // SL_ANDROID_RECORDING_PRESET_VOICE_COMMUNICATION
-  SLint32 stream_type = SL_ANDROID_RECORDING_PRESET_VOICE_COMMUNICATION;
-  if (LOG_ON_ERROR(((*recorder_config)
-                        ->SetConfiguration(recorder_config,
-                                           SL_ANDROID_KEY_RECORDING_PRESET,
-                                           &stream_type, sizeof(SLint32))))) {
-    return false;
-  }
-
-  // The audio recorder can now be realized (in synchronous mode).
-  if (LOG_ON_ERROR((recorder_object_->Realize(recorder_object_.Get(),
-                                              SL_BOOLEAN_FALSE)))) {
-    return false;
-  }
-
-  // Get the implicit recorder interface (SL_IID_RECORD).
-  if (LOG_ON_ERROR((recorder_object_->GetInterface(
-          recorder_object_.Get(), SL_IID_RECORD, &recorder_)))) {
-    return false;
-  }
-
-  // Get the simple buffer queue interface (SL_IID_ANDROIDSIMPLEBUFFERQUEUE).
-  // It was explicitly requested.
-  if (LOG_ON_ERROR((recorder_object_->GetInterface(
-          recorder_object_.Get(), SL_IID_ANDROIDSIMPLEBUFFERQUEUE,
-          &simple_buffer_queue_)))) {
-    return false;
-  }
-
-  // Register the input callback for the simple buffer queue.
-  // This callback will be called when receiving new data from the device.
-  if (LOG_ON_ERROR(((*simple_buffer_queue_)
-                        ->RegisterCallback(simple_buffer_queue_,
-                                           SimpleBufferQueueCallback, this)))) {
-    return false;
-  }
-  return true;
-}
-
-void OpenSLESRecorder::DestroyAudioRecorder() {
-  ALOGD("DestroyAudioRecorder");
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  if (!recorder_object_.Get())
-    return;
-  (*simple_buffer_queue_)
-      ->RegisterCallback(simple_buffer_queue_, nullptr, nullptr);
-  recorder_object_.Reset();
-  recorder_ = nullptr;
-  simple_buffer_queue_ = nullptr;
-}
-
-void OpenSLESRecorder::SimpleBufferQueueCallback(
-    SLAndroidSimpleBufferQueueItf buffer_queue,
-    void* context) {
-  OpenSLESRecorder* stream = static_cast<OpenSLESRecorder*>(context);
-  stream->ReadBufferQueue();
-}
-
-void OpenSLESRecorder::AllocateDataBuffers() {
-  ALOGD("AllocateDataBuffers");
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  RTC_DCHECK(!simple_buffer_queue_);
-  RTC_CHECK(audio_device_buffer_);
-  // Create a modified audio buffer class which allows us to deliver any number
-  // of samples (and not only multiple of 10ms) to match the native audio unit
-  // buffer size.
-  ALOGD("frames per native buffer: %" PRIuS,
-        audio_parameters_.frames_per_buffer());
-  ALOGD("frames per 10ms buffer: %" PRIuS,
-        audio_parameters_.frames_per_10ms_buffer());
-  ALOGD("bytes per native buffer: %" PRIuS,
-        audio_parameters_.GetBytesPerBuffer());
-  ALOGD("native sample rate: %d", audio_parameters_.sample_rate());
-  RTC_DCHECK(audio_device_buffer_);
-  fine_audio_buffer_.reset(
-      new FineAudioBuffer(audio_device_buffer_, audio_parameters_.sample_rate(),
-                          2 * audio_parameters_.GetBytesPerBuffer()));
-  // Allocate queue of audio buffers that stores recorded audio samples.
-  const int data_size_bytes = audio_parameters_.GetBytesPerBuffer();
-  audio_buffers_.reset(new std::unique_ptr<SLint8[]>[kNumOfOpenSLESBuffers]);
-  for (int i = 0; i < kNumOfOpenSLESBuffers; ++i) {
-    audio_buffers_[i].reset(new SLint8[data_size_bytes]);
-  }
-}
-
-void OpenSLESRecorder::ReadBufferQueue() {
-  RTC_DCHECK(thread_checker_opensles_.CalledOnValidThread());
-  SLuint32 state = GetRecordState();
-  if (state != SL_RECORDSTATE_RECORDING) {
-    ALOGW("Buffer callback in non-recording state!");
-    return;
-  }
-  // Check delta time between two successive callbacks and provide a warning
-  // if it becomes very large.
-  // TODO(henrika): using 150ms as upper limit but this value is rather random.
-  const uint32_t current_time = rtc::Time();
-  const uint32_t diff = current_time - last_rec_time_;
-  if (diff > 150) {
-    ALOGW("Bad OpenSL ES record timing, dT=%u [ms]", diff);
-  }
-  last_rec_time_ = current_time;
-  // Send recorded audio data to the WebRTC sink.
-  // TODO(henrika): fix delay estimates. It is OK to use fixed values for now
-  // since there is no support to turn off built-in EC in combination with
-  // OpenSL ES anyhow. Hence, as is, the WebRTC based AEC (which would use
-  // these estimates) will never be active.
-  const size_t size_in_bytes =
-      static_cast<size_t>(audio_parameters_.GetBytesPerBuffer());
-  const int8_t* data =
-      static_cast<const int8_t*>(audio_buffers_[buffer_index_].get());
-  fine_audio_buffer_->DeliverRecordedData(
-      rtc::ArrayView<const int8_t>(data, size_in_bytes), 25, 25);
-  // Enqueue the utilized audio buffer and use if for recording again.
-  EnqueueAudioBuffer();
-}
-
-bool OpenSLESRecorder::EnqueueAudioBuffer() {
-  SLresult err =
-      (*simple_buffer_queue_)
-          ->Enqueue(simple_buffer_queue_, audio_buffers_[buffer_index_].get(),
-                    audio_parameters_.GetBytesPerBuffer());
-  if (SL_RESULT_SUCCESS != err) {
-    ALOGE("Enqueue failed: %s", GetSLErrorString(err));
-    return false;
-  }
-  buffer_index_ = (buffer_index_ + 1) % kNumOfOpenSLESBuffers;
-  return true;
-}
-
-SLuint32 OpenSLESRecorder::GetRecordState() const {
-  RTC_DCHECK(recorder_);
-  SLuint32 state;
-  SLresult err = (*recorder_)->GetRecordState(recorder_, &state);
-  if (SL_RESULT_SUCCESS != err) {
-    ALOGE("GetRecordState failed: %s", GetSLErrorString(err));
-  }
-  return state;
-}
-
-SLAndroidSimpleBufferQueueState OpenSLESRecorder::GetBufferQueueState() const {
-  RTC_DCHECK(simple_buffer_queue_);
-  // state.count: Number of buffers currently in the queue.
-  // state.index: Index of the currently filling buffer. This is a linear index
-  // that keeps a cumulative count of the number of buffers recorded.
-  SLAndroidSimpleBufferQueueState state;
-  SLresult err =
-      (*simple_buffer_queue_)->GetState(simple_buffer_queue_, &state);
-  if (SL_RESULT_SUCCESS != err) {
-    ALOGE("GetState failed: %s", GetSLErrorString(err));
-  }
-  return state;
-}
-
-void OpenSLESRecorder::LogBufferState() const {
-  SLAndroidSimpleBufferQueueState state = GetBufferQueueState();
-  ALOGD("state.count:%d state.index:%d", state.count, state.index);
-}
-
-SLuint32 OpenSLESRecorder::GetBufferCount() {
-  SLAndroidSimpleBufferQueueState state = GetBufferQueueState();
-  return state.count;
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_device/android/opensles_recorder.h b/modules/audio_device/android/opensles_recorder.h
deleted file mode 100644
index 5f8da40..0000000
--- a/modules/audio_device/android/opensles_recorder.h
+++ /dev/null
@@ -1,193 +0,0 @@
-/*
- *  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_DEVICE_ANDROID_OPENSLES_RECORDER_H_
-#define WEBRTC_MODULES_AUDIO_DEVICE_ANDROID_OPENSLES_RECORDER_H_
-
-#include <SLES/OpenSLES.h>
-#include <SLES/OpenSLES_Android.h>
-#include <SLES/OpenSLES_AndroidConfiguration.h>
-
-#include <memory>
-
-#include "webrtc/modules/audio_device/android/audio_common.h"
-#include "webrtc/modules/audio_device/android/audio_manager.h"
-#include "webrtc/modules/audio_device/android/opensles_common.h"
-#include "webrtc/modules/audio_device/audio_device_generic.h"
-#include "webrtc/modules/audio_device/include/audio_device_defines.h"
-#include "webrtc/modules/utility/include/helpers_android.h"
-#include "webrtc/rtc_base/thread_checker.h"
-
-namespace webrtc {
-
-class FineAudioBuffer;
-
-// Implements 16-bit mono PCM audio input support for Android using the
-// C based OpenSL ES API. No calls from C/C++ to Java using JNI is done.
-//
-// An instance must be created and destroyed on one and the same thread.
-// All public methods must also be called on the same thread. A thread checker
-// will RTC_DCHECK if any method is called on an invalid thread. Recorded audio
-// buffers are provided on a dedicated internal thread managed by the OpenSL
-// ES layer.
-//
-// The existing design forces the user to call InitRecording() after
-// StopRecording() to be able to call StartRecording() again. This is inline
-// with how the Java-based implementation works.
-//
-// As of API level 21, lower latency audio input is supported on select devices.
-// To take advantage of this feature, first confirm that lower latency output is
-// available. The capability for lower latency output is a prerequisite for the
-// lower latency input feature. Then, create an AudioRecorder with the same
-// sample rate and buffer size as would be used for output. OpenSL ES interfaces
-// for input effects preclude the lower latency path.
-// See https://developer.android.com/ndk/guides/audio/opensl-prog-notes.html
-// for more details.
-class OpenSLESRecorder {
- public:
-  // Beginning with API level 17 (Android 4.2), a buffer count of 2 or more is
-  // required for lower latency. Beginning with API level 18 (Android 4.3), a
-  // buffer count of 1 is sufficient for lower latency. In addition, the buffer
-  // size and sample rate must be compatible with the device's native input
-  // configuration provided via the audio manager at construction.
-  // TODO(henrika): perhaps set this value dynamically based on OS version.
-  static const int kNumOfOpenSLESBuffers = 2;
-
-  explicit OpenSLESRecorder(AudioManager* audio_manager);
-  ~OpenSLESRecorder();
-
-  int Init();
-  int Terminate();
-
-  int InitRecording();
-  bool RecordingIsInitialized() const { return initialized_; }
-
-  int StartRecording();
-  int StopRecording();
-  bool Recording() const { return recording_; }
-
-  void AttachAudioBuffer(AudioDeviceBuffer* audio_buffer);
-
-  // TODO(henrika): add support using OpenSL ES APIs when available.
-  int EnableBuiltInAEC(bool enable);
-  int EnableBuiltInAGC(bool enable);
-  int EnableBuiltInNS(bool enable);
-
- private:
-  // Obtaines the SL Engine Interface from the existing global Engine object.
-  // The interface exposes creation methods of all the OpenSL ES object types.
-  // This method defines the |engine_| member variable.
-  bool ObtainEngineInterface();
-
-  // Creates/destroys the audio recorder and the simple-buffer queue object.
-  bool CreateAudioRecorder();
-  void DestroyAudioRecorder();
-
-  // Allocate memory for audio buffers which will be used to capture audio
-  // via the SLAndroidSimpleBufferQueueItf interface.
-  void AllocateDataBuffers();
-
-  // These callback methods are called when data has been written to the input
-  // buffer queue. They are both called from an internal "OpenSL ES thread"
-  // which is not attached to the Dalvik VM.
-  static void SimpleBufferQueueCallback(SLAndroidSimpleBufferQueueItf caller,
-                                        void* context);
-  void ReadBufferQueue();
-
-  // Wraps calls to SLAndroidSimpleBufferQueueState::Enqueue() and it can be
-  // called both on the main thread (but before recording has started) and from
-  // the internal audio thread while input streaming is active. It uses
-  // |simple_buffer_queue_| but no lock is needed since the initial calls from
-  // the main thread and the native callback thread are mutually exclusive.
-  bool EnqueueAudioBuffer();
-
-  // Returns the current recorder state.
-  SLuint32 GetRecordState() const;
-
-  // Returns the current buffer queue state.
-  SLAndroidSimpleBufferQueueState GetBufferQueueState() const;
-
-  // Number of buffers currently in the queue.
-  SLuint32 GetBufferCount();
-
-  // Prints a log message of the current queue state. Can be used for debugging
-  // purposes.
-  void LogBufferState() const;
-
-  // Ensures that methods are called from the same thread as this object is
-  // created on.
-  rtc::ThreadChecker thread_checker_;
-
-  // Stores thread ID in first call to SimpleBufferQueueCallback() from internal
-  // non-application thread which is not attached to the Dalvik JVM.
-  // Detached during construction of this object.
-  rtc::ThreadChecker thread_checker_opensles_;
-
-  // Raw pointer to the audio manager injected at construction. Used to cache
-  // audio parameters and to access the global SL engine object needed by the
-  // ObtainEngineInterface() method. The audio manager outlives any instance of
-  // this class.
-  AudioManager* const audio_manager_;
-
-  // Contains audio parameters provided to this class at construction by the
-  // AudioManager.
-  const AudioParameters audio_parameters_;
-
-  // Raw pointer handle provided to us in AttachAudioBuffer(). Owned by the
-  // AudioDeviceModuleImpl class and called by AudioDeviceModule::Create().
-  AudioDeviceBuffer* audio_device_buffer_;
-
-  // PCM-type format definition.
-  // TODO(henrika): add support for SLAndroidDataFormat_PCM_EX (android-21) if
-  // 32-bit float representation is needed.
-  SLDataFormat_PCM pcm_format_;
-
-  bool initialized_;
-  bool recording_;
-
-  // This interface exposes creation methods for all the OpenSL ES object types.
-  // It is the OpenSL ES API entry point.
-  SLEngineItf engine_;
-
-  // The audio recorder media object records audio to the destination specified
-  // by the data sink capturing it from the input specified by the data source.
-  webrtc::ScopedSLObjectItf recorder_object_;
-
-  // This interface is supported on the audio recorder object and it controls
-  // the state of the audio recorder.
-  SLRecordItf recorder_;
-
-  // The Android Simple Buffer Queue interface is supported on the audio
-  // recorder. For recording, an app should enqueue empty buffers. When a
-  // registered callback sends notification that the system has finished writing
-  // data to the buffer, the app can read the buffer.
-  SLAndroidSimpleBufferQueueItf simple_buffer_queue_;
-
-  // Consumes audio of native buffer size and feeds the WebRTC layer with 10ms
-  // chunks of audio.
-  std::unique_ptr<FineAudioBuffer> fine_audio_buffer_;
-
-  // Queue of audio buffers to be used by the recorder object for capturing
-  // audio. They will be used in a Round-robin way and the size of each buffer
-  // is given by AudioParameters::GetBytesPerBuffer(), i.e., it corresponds to
-  // the native OpenSL ES buffer size.
-  std::unique_ptr<std::unique_ptr<SLint8[]>[]> audio_buffers_;
-
-  // Keeps track of active audio buffer 'n' in the audio_buffers_[n] queue.
-  // Example (kNumOfOpenSLESBuffers = 2): counts 0, 1, 0, 1, ...
-  int buffer_index_;
-
-  // Last time the OpenSL ES layer delivered recorded audio data.
-  uint32_t last_rec_time_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_DEVICE_ANDROID_OPENSLES_RECORDER_H_
diff --git a/modules/audio_device/audio_device_buffer.cc b/modules/audio_device/audio_device_buffer.cc
deleted file mode 100644
index 063c65f..0000000
--- a/modules/audio_device/audio_device_buffer.cc
+++ /dev/null
@@ -1,514 +0,0 @@
-/*
- *  Copyright (c) 2012 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 <algorithm>
-#include <cmath>
-
-#include "webrtc/modules/audio_device/audio_device_buffer.h"
-
-#include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
-#include "webrtc/modules/audio_device/audio_device_config.h"
-#include "webrtc/rtc_base/arraysize.h"
-#include "webrtc/rtc_base/bind.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/format_macros.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/timeutils.h"
-#include "webrtc/system_wrappers/include/metrics.h"
-
-namespace webrtc {
-
-static const char kTimerQueueName[] = "AudioDeviceBufferTimer";
-
-// Time between two sucessive calls to LogStats().
-static const size_t kTimerIntervalInSeconds = 10;
-static const size_t kTimerIntervalInMilliseconds =
-    kTimerIntervalInSeconds * rtc::kNumMillisecsPerSec;
-// Min time required to qualify an audio session as a "call". If playout or
-// recording has been active for less than this time we will not store any
-// logs or UMA stats but instead consider the call as too short.
-static const size_t kMinValidCallTimeTimeInSeconds = 10;
-static const size_t kMinValidCallTimeTimeInMilliseconds =
-    kMinValidCallTimeTimeInSeconds * rtc::kNumMillisecsPerSec;
-#ifdef AUDIO_DEVICE_PLAYS_SINUS_TONE
-static const double k2Pi = 6.28318530717959;
-#endif
-
-AudioDeviceBuffer::AudioDeviceBuffer()
-    : task_queue_(kTimerQueueName),
-      audio_transport_cb_(nullptr),
-      rec_sample_rate_(0),
-      play_sample_rate_(0),
-      rec_channels_(0),
-      play_channels_(0),
-      playing_(false),
-      recording_(false),
-      current_mic_level_(0),
-      new_mic_level_(0),
-      typing_status_(false),
-      play_delay_ms_(0),
-      rec_delay_ms_(0),
-      clock_drift_(0),
-      num_stat_reports_(0),
-      last_timer_task_time_(0),
-      rec_stat_count_(0),
-      play_stat_count_(0),
-      play_start_time_(0),
-      only_silence_recorded_(true),
-      log_stats_(false) {
-  LOG(INFO) << "AudioDeviceBuffer::ctor";
-#ifdef AUDIO_DEVICE_PLAYS_SINUS_TONE
-  phase_ = 0.0;
-  LOG(WARNING) << "AUDIO_DEVICE_PLAYS_SINUS_TONE is defined!";
-#endif
-  playout_thread_checker_.DetachFromThread();
-  recording_thread_checker_.DetachFromThread();
-}
-
-AudioDeviceBuffer::~AudioDeviceBuffer() {
-  RTC_DCHECK_RUN_ON(&main_thread_checker_);
-  RTC_DCHECK(!playing_);
-  RTC_DCHECK(!recording_);
-  LOG(INFO) << "AudioDeviceBuffer::~dtor";
-}
-
-int32_t AudioDeviceBuffer::RegisterAudioCallback(
-    AudioTransport* audio_callback) {
-  RTC_DCHECK_RUN_ON(&main_thread_checker_);
-  LOG(INFO) << __FUNCTION__;
-  if (playing_ || recording_) {
-    LOG(LS_ERROR) << "Failed to set audio transport since media was active";
-    return -1;
-  }
-  audio_transport_cb_ = audio_callback;
-  return 0;
-}
-
-void AudioDeviceBuffer::StartPlayout() {
-  RTC_DCHECK_RUN_ON(&main_thread_checker_);
-  // TODO(henrika): allow for usage of DCHECK(!playing_) here instead. Today the
-  // ADM allows calling Start(), Start() by ignoring the second call but it
-  // makes more sense to only allow one call.
-  if (playing_) {
-    return;
-  }
-  LOG(INFO) << __FUNCTION__;
-  playout_thread_checker_.DetachFromThread();
-  // Clear members tracking playout stats and do it on the task queue.
-  task_queue_.PostTask([this] { ResetPlayStats(); });
-  // Start a periodic timer based on task queue if not already done by the
-  // recording side.
-  if (!recording_) {
-    StartPeriodicLogging();
-  }
-  const int64_t now_time = rtc::TimeMillis();
-  // Clear members that are only touched on the main (creating) thread.
-  play_start_time_ = now_time;
-  playing_ = true;
-}
-
-void AudioDeviceBuffer::StartRecording() {
-  RTC_DCHECK_RUN_ON(&main_thread_checker_);
-  if (recording_) {
-    return;
-  }
-  LOG(INFO) << __FUNCTION__;
-  recording_thread_checker_.DetachFromThread();
-  // Clear members tracking recording stats and do it on the task queue.
-  task_queue_.PostTask([this] { ResetRecStats(); });
-  // Start a periodic timer based on task queue if not already done by the
-  // playout side.
-  if (!playing_) {
-    StartPeriodicLogging();
-  }
-  // Clear members that will be touched on the main (creating) thread.
-  rec_start_time_ = rtc::TimeMillis();
-  recording_ = true;
-  // And finally a member which can be modified on the native audio thread.
-  // It is safe to do so since we know by design that the owning ADM has not
-  // yet started the native audio recording.
-  only_silence_recorded_ = true;
-}
-
-void AudioDeviceBuffer::StopPlayout() {
-  RTC_DCHECK_RUN_ON(&main_thread_checker_);
-  if (!playing_) {
-    return;
-  }
-  LOG(INFO) << __FUNCTION__;
-  playing_ = false;
-  // Stop periodic logging if no more media is active.
-  if (!recording_) {
-    StopPeriodicLogging();
-  }
-  LOG(INFO) << "total playout time: " << rtc::TimeSince(play_start_time_);
-}
-
-void AudioDeviceBuffer::StopRecording() {
-  RTC_DCHECK_RUN_ON(&main_thread_checker_);
-  if (!recording_) {
-    return;
-  }
-  LOG(INFO) << __FUNCTION__;
-  recording_ = false;
-  // Stop periodic logging if no more media is active.
-  if (!playing_) {
-    StopPeriodicLogging();
-  }
-  // Add UMA histogram to keep track of the case when only zeros have been
-  // recorded. Measurements (max of absolute level) are taken twice per second,
-  // which means that if e.g 10 seconds of audio has been recorded, a total of
-  // 20 level estimates must all be identical to zero to trigger the histogram.
-  // |only_silence_recorded_| can only be cleared on the native audio thread
-  // that drives audio capture but we know by design that the audio has stopped
-  // when this method is called, hence there should not be aby conflicts. Also,
-  // the fact that |only_silence_recorded_| can be affected during the complete
-  // call makes chances of conflicts with potentially one last callback very
-  // small.
-  const size_t time_since_start = rtc::TimeSince(rec_start_time_);
-  if (time_since_start > kMinValidCallTimeTimeInMilliseconds) {
-    const int only_zeros = static_cast<int>(only_silence_recorded_);
-    RTC_HISTOGRAM_BOOLEAN("WebRTC.Audio.RecordedOnlyZeros", only_zeros);
-    LOG(INFO) << "HISTOGRAM(WebRTC.Audio.RecordedOnlyZeros): " << only_zeros;
-  }
-  LOG(INFO) << "total recording time: " << time_since_start;
-}
-
-int32_t AudioDeviceBuffer::SetRecordingSampleRate(uint32_t fsHz) {
-  RTC_DCHECK(main_thread_checker_.CalledOnValidThread());
-  LOG(INFO) << "SetRecordingSampleRate(" << fsHz << ")";
-  rec_sample_rate_ = fsHz;
-  return 0;
-}
-
-int32_t AudioDeviceBuffer::SetPlayoutSampleRate(uint32_t fsHz) {
-  RTC_DCHECK(main_thread_checker_.CalledOnValidThread());
-  LOG(INFO) << "SetPlayoutSampleRate(" << fsHz << ")";
-  play_sample_rate_ = fsHz;
-  return 0;
-}
-
-int32_t AudioDeviceBuffer::RecordingSampleRate() const {
-  RTC_DCHECK(main_thread_checker_.CalledOnValidThread());
-  return rec_sample_rate_;
-}
-
-int32_t AudioDeviceBuffer::PlayoutSampleRate() const {
-  RTC_DCHECK(main_thread_checker_.CalledOnValidThread());
-  return play_sample_rate_;
-}
-
-int32_t AudioDeviceBuffer::SetRecordingChannels(size_t channels) {
-  RTC_DCHECK(main_thread_checker_.CalledOnValidThread());
-  LOG(INFO) << "SetRecordingChannels(" << channels << ")";
-  rec_channels_ = channels;
-  return 0;
-}
-
-int32_t AudioDeviceBuffer::SetPlayoutChannels(size_t channels) {
-  RTC_DCHECK(main_thread_checker_.CalledOnValidThread());
-  LOG(INFO) << "SetPlayoutChannels(" << channels << ")";
-  play_channels_ = channels;
-  return 0;
-}
-
-int32_t AudioDeviceBuffer::SetRecordingChannel(
-    const AudioDeviceModule::ChannelType channel) {
-  LOG(INFO) << "SetRecordingChannel(" << channel << ")";
-  LOG(LS_WARNING) << "Not implemented";
-  // Add DCHECK to ensure that user does not try to use this API with a non-
-  // default parameter.
-  RTC_DCHECK_EQ(channel, AudioDeviceModule::kChannelBoth);
-  return -1;
-}
-
-int32_t AudioDeviceBuffer::RecordingChannel(
-    AudioDeviceModule::ChannelType& channel) const {
-  LOG(LS_WARNING) << "Not implemented";
-  return -1;
-}
-
-size_t AudioDeviceBuffer::RecordingChannels() const {
-  RTC_DCHECK(main_thread_checker_.CalledOnValidThread());
-  return rec_channels_;
-}
-
-size_t AudioDeviceBuffer::PlayoutChannels() const {
-  RTC_DCHECK(main_thread_checker_.CalledOnValidThread());
-  return play_channels_;
-}
-
-int32_t AudioDeviceBuffer::SetCurrentMicLevel(uint32_t level) {
-#if !defined(WEBRTC_WIN)
-  // Windows uses a dedicated thread for volume APIs.
-  RTC_DCHECK_RUN_ON(&recording_thread_checker_);
-#endif
-  current_mic_level_ = level;
-  return 0;
-}
-
-int32_t AudioDeviceBuffer::SetTypingStatus(bool typing_status) {
-  RTC_DCHECK_RUN_ON(&recording_thread_checker_);
-  typing_status_ = typing_status;
-  return 0;
-}
-
-void AudioDeviceBuffer::NativeAudioInterrupted() {
-  RTC_DCHECK(main_thread_checker_.CalledOnValidThread());
-  playout_thread_checker_.DetachFromThread();
-  recording_thread_checker_.DetachFromThread();
-}
-
-uint32_t AudioDeviceBuffer::NewMicLevel() const {
-  RTC_DCHECK_RUN_ON(&recording_thread_checker_);
-  return new_mic_level_;
-}
-
-void AudioDeviceBuffer::SetVQEData(int play_delay_ms,
-                                   int rec_delay_ms,
-                                   int clock_drift) {
-  RTC_DCHECK_RUN_ON(&recording_thread_checker_);
-  play_delay_ms_ = play_delay_ms;
-  rec_delay_ms_ = rec_delay_ms;
-  clock_drift_ = clock_drift;
-}
-
-int32_t AudioDeviceBuffer::SetRecordedBuffer(const void* audio_buffer,
-                                             size_t samples_per_channel) {
-  RTC_DCHECK_RUN_ON(&recording_thread_checker_);
-  // Copy the complete input buffer to the local buffer.
-  const size_t old_size = rec_buffer_.size();
-  rec_buffer_.SetData(static_cast<const int16_t*>(audio_buffer),
-                      rec_channels_ * samples_per_channel);
-  // Keep track of the size of the recording buffer. Only updated when the
-  // size changes, which is a rare event.
-  if (old_size != rec_buffer_.size()) {
-    LOG(LS_INFO) << "Size of recording buffer: " << rec_buffer_.size();
-  }
-
-  // Derive a new level value twice per second and check if it is non-zero.
-  int16_t max_abs = 0;
-  RTC_DCHECK_LT(rec_stat_count_, 50);
-  if (++rec_stat_count_ >= 50) {
-    // Returns the largest absolute value in a signed 16-bit vector.
-    max_abs = WebRtcSpl_MaxAbsValueW16(rec_buffer_.data(), rec_buffer_.size());
-    rec_stat_count_ = 0;
-    // Set |only_silence_recorded_| to false as soon as at least one detection
-    // of a non-zero audio packet is found. It can only be restored to true
-    // again by restarting the call.
-    if (max_abs > 0) {
-      only_silence_recorded_ = false;
-    }
-  }
-  // Update recording stats which is used as base for periodic logging of the
-  // audio input state.
-  UpdateRecStats(max_abs, samples_per_channel);
-  return 0;
-}
-
-int32_t AudioDeviceBuffer::DeliverRecordedData() {
-  RTC_DCHECK_RUN_ON(&recording_thread_checker_);
-  if (!audio_transport_cb_) {
-    LOG(LS_WARNING) << "Invalid audio transport";
-    return 0;
-  }
-  const size_t frames = rec_buffer_.size() / rec_channels_;
-  const size_t bytes_per_frame = rec_channels_ * sizeof(int16_t);
-  uint32_t new_mic_level(0);
-  uint32_t total_delay_ms = play_delay_ms_ + rec_delay_ms_;
-  int32_t res = audio_transport_cb_->RecordedDataIsAvailable(
-      rec_buffer_.data(), frames, bytes_per_frame, rec_channels_,
-      rec_sample_rate_, total_delay_ms, clock_drift_, current_mic_level_,
-      typing_status_, new_mic_level);
-  if (res != -1) {
-    new_mic_level_ = new_mic_level;
-  } else {
-    LOG(LS_ERROR) << "RecordedDataIsAvailable() failed";
-  }
-  return 0;
-}
-
-int32_t AudioDeviceBuffer::RequestPlayoutData(size_t samples_per_channel) {
-  RTC_DCHECK_RUN_ON(&playout_thread_checker_);
-  // The consumer can change the requested size on the fly and we therefore
-  // resize the buffer accordingly. Also takes place at the first call to this
-  // method.
-  const size_t total_samples = play_channels_ * samples_per_channel;
-  if (play_buffer_.size() != total_samples) {
-    play_buffer_.SetSize(total_samples);
-    LOG(LS_INFO) << "Size of playout buffer: " << play_buffer_.size();
-  }
-
-  size_t num_samples_out(0);
-  // It is currently supported to start playout without a valid audio
-  // transport object. Leads to warning and silence.
-  if (!audio_transport_cb_) {
-    LOG(LS_WARNING) << "Invalid audio transport";
-    return 0;
-  }
-
-  // Retrieve new 16-bit PCM audio data using the audio transport instance.
-  int64_t elapsed_time_ms = -1;
-  int64_t ntp_time_ms = -1;
-  const size_t bytes_per_frame = play_channels_ * sizeof(int16_t);
-  uint32_t res = audio_transport_cb_->NeedMorePlayData(
-      samples_per_channel, bytes_per_frame, play_channels_, play_sample_rate_,
-      play_buffer_.data(), num_samples_out, &elapsed_time_ms, &ntp_time_ms);
-  if (res != 0) {
-    LOG(LS_ERROR) << "NeedMorePlayData() failed";
-  }
-
-  // Derive a new level value twice per second.
-  int16_t max_abs = 0;
-  RTC_DCHECK_LT(play_stat_count_, 50);
-  if (++play_stat_count_ >= 50) {
-    // Returns the largest absolute value in a signed 16-bit vector.
-    max_abs =
-        WebRtcSpl_MaxAbsValueW16(play_buffer_.data(), play_buffer_.size());
-    play_stat_count_ = 0;
-  }
-  // Update playout stats which is used as base for periodic logging of the
-  // audio output state.
-  UpdatePlayStats(max_abs, num_samples_out / play_channels_);
-  return static_cast<int32_t>(num_samples_out / play_channels_);
-}
-
-int32_t AudioDeviceBuffer::GetPlayoutData(void* audio_buffer) {
-  RTC_DCHECK_RUN_ON(&playout_thread_checker_);
-  RTC_DCHECK_GT(play_buffer_.size(), 0);
-#ifdef AUDIO_DEVICE_PLAYS_SINUS_TONE
-  const double phase_increment =
-      k2Pi * 440.0 / static_cast<double>(play_sample_rate_);
-  int16_t* destination_r = reinterpret_cast<int16_t*>(audio_buffer);
-  for (size_t i = 0; i < play_buffer_.size(); ++i) {
-    destination_r[i] = static_cast<int16_t>((sin(phase_) * (1 << 14)));
-    phase_ += phase_increment;
-  }
-#else
-  memcpy(audio_buffer, play_buffer_.data(),
-         play_buffer_.size() * sizeof(int16_t));
-#endif
-  // Return samples per channel or number of frames.
-  return static_cast<int32_t>(play_buffer_.size() / play_channels_);
-}
-
-void AudioDeviceBuffer::StartPeriodicLogging() {
-  task_queue_.PostTask(rtc::Bind(&AudioDeviceBuffer::LogStats, this,
-                                 AudioDeviceBuffer::LOG_START));
-}
-
-void AudioDeviceBuffer::StopPeriodicLogging() {
-  task_queue_.PostTask(rtc::Bind(&AudioDeviceBuffer::LogStats, this,
-                                 AudioDeviceBuffer::LOG_STOP));
-}
-
-void AudioDeviceBuffer::LogStats(LogState state) {
-  RTC_DCHECK_RUN_ON(&task_queue_);
-  int64_t now_time = rtc::TimeMillis();
-
-  if (state == AudioDeviceBuffer::LOG_START) {
-    // Reset counters at start. We will not add any logging in this state but
-    // the timer will started by posting a new (delayed) task.
-    num_stat_reports_ = 0;
-    last_timer_task_time_ = now_time;
-    log_stats_ = true;
-  } else if (state == AudioDeviceBuffer::LOG_STOP) {
-    // Stop logging and posting new tasks.
-    log_stats_ = false;
-  } else if (state == AudioDeviceBuffer::LOG_ACTIVE) {
-    // Keep logging unless logging was disabled while task was posted.
-  }
-
-  // Avoid adding more logs since we are in STOP mode.
-  if (!log_stats_) {
-    return;
-  }
-
-  int64_t next_callback_time = now_time + kTimerIntervalInMilliseconds;
-  int64_t time_since_last = rtc::TimeDiff(now_time, last_timer_task_time_);
-  last_timer_task_time_ = now_time;
-
-  Stats stats;
-  {
-    rtc::CritScope cs(&lock_);
-    stats = stats_;
-    stats_.max_rec_level = 0;
-    stats_.max_play_level = 0;
-  }
-
-  // Log the latest statistics but skip the first round just after state was
-  // set to LOG_START. Hence, first printed log will be after ~10 seconds.
-  if (++num_stat_reports_ > 1 && time_since_last > 0) {
-    uint32_t diff_samples = stats.rec_samples - last_stats_.rec_samples;
-    float rate = diff_samples / (static_cast<float>(time_since_last) / 1000.0);
-    LOG(INFO) << "[REC : " << time_since_last << "msec, "
-              << rec_sample_rate_ / 1000 << "kHz] callbacks: "
-              << stats.rec_callbacks - last_stats_.rec_callbacks << ", "
-              << "samples: " << diff_samples << ", "
-              << "rate: " << static_cast<int>(rate + 0.5) << ", "
-              << "level: " << stats.max_rec_level;
-
-    diff_samples = stats.play_samples - last_stats_.play_samples;
-    rate = diff_samples / (static_cast<float>(time_since_last) / 1000.0);
-    LOG(INFO) << "[PLAY: " << time_since_last << "msec, "
-              << play_sample_rate_ / 1000 << "kHz] callbacks: "
-              << stats.play_callbacks - last_stats_.play_callbacks << ", "
-              << "samples: " << diff_samples << ", "
-              << "rate: " << static_cast<int>(rate + 0.5) << ", "
-              << "level: " << stats.max_play_level;
-    last_stats_ = stats;
-  }
-
-  int64_t time_to_wait_ms = next_callback_time - rtc::TimeMillis();
-  RTC_DCHECK_GT(time_to_wait_ms, 0) << "Invalid timer interval";
-
-  // Keep posting new (delayed) tasks until state is changed to kLogStop.
-  task_queue_.PostDelayedTask(rtc::Bind(&AudioDeviceBuffer::LogStats, this,
-                                        AudioDeviceBuffer::LOG_ACTIVE),
-                              time_to_wait_ms);
-}
-
-void AudioDeviceBuffer::ResetRecStats() {
-  RTC_DCHECK_RUN_ON(&task_queue_);
-  last_stats_.ResetRecStats();
-  rtc::CritScope cs(&lock_);
-  stats_.ResetRecStats();
-}
-
-void AudioDeviceBuffer::ResetPlayStats() {
-  RTC_DCHECK_RUN_ON(&task_queue_);
-  last_stats_.ResetPlayStats();
-  rtc::CritScope cs(&lock_);
-  stats_.ResetPlayStats();
-}
-
-void AudioDeviceBuffer::UpdateRecStats(int16_t max_abs,
-                                       size_t samples_per_channel) {
-  RTC_DCHECK_RUN_ON(&recording_thread_checker_);
-  rtc::CritScope cs(&lock_);
-  ++stats_.rec_callbacks;
-  stats_.rec_samples += samples_per_channel;
-  if (max_abs > stats_.max_rec_level) {
-    stats_.max_rec_level = max_abs;
-  }
-}
-
-void AudioDeviceBuffer::UpdatePlayStats(int16_t max_abs,
-                                        size_t samples_per_channel) {
-  RTC_DCHECK_RUN_ON(&playout_thread_checker_);
-  rtc::CritScope cs(&lock_);
-  ++stats_.play_callbacks;
-  stats_.play_samples += samples_per_channel;
-  if (max_abs > stats_.max_play_level) {
-    stats_.max_play_level = max_abs;
-  }
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_device/audio_device_buffer.h b/modules/audio_device/audio_device_buffer.h
deleted file mode 100644
index ed8b1f7..0000000
--- a/modules/audio_device/audio_device_buffer.h
+++ /dev/null
@@ -1,263 +0,0 @@
-/*
- *  Copyright (c) 2012 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_DEVICE_AUDIO_DEVICE_BUFFER_H_
-#define WEBRTC_MODULES_AUDIO_DEVICE_AUDIO_DEVICE_BUFFER_H_
-
-#include "webrtc/modules/audio_device/include/audio_device.h"
-#include "webrtc/rtc_base/buffer.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/task_queue.h"
-#include "webrtc/rtc_base/thread_annotations.h"
-#include "webrtc/rtc_base/thread_checker.h"
-#include "webrtc/system_wrappers/include/file_wrapper.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-// Delta times between two successive playout callbacks are limited to this
-// value before added to an internal array.
-const size_t kMaxDeltaTimeInMs = 500;
-// TODO(henrika): remove when no longer used by external client.
-const size_t kMaxBufferSizeBytes = 3840;  // 10ms in stereo @ 96kHz
-
-class AudioDeviceObserver;
-
-class AudioDeviceBuffer {
- public:
-  enum LogState {
-    LOG_START = 0,
-    LOG_STOP,
-    LOG_ACTIVE,
-  };
-
-  struct Stats {
-    void ResetRecStats() {
-      rec_callbacks = 0;
-      rec_samples = 0;
-      max_rec_level = 0;
-    }
-
-    void ResetPlayStats() {
-      play_callbacks = 0;
-      play_samples = 0;
-      max_play_level = 0;
-    }
-
-    // Total number of recording callbacks where the source provides 10ms audio
-    // data each time.
-    uint64_t rec_callbacks = 0;
-
-    // Total number of playback callbacks where the sink asks for 10ms audio
-    // data each time.
-    uint64_t play_callbacks = 0;
-
-    // Total number of recorded audio samples.
-    uint64_t rec_samples = 0;
-
-    // Total number of played audio samples.
-    uint64_t play_samples = 0;
-
-    // Contains max level (max(abs(x))) of recorded audio packets over the last
-    // 10 seconds where a new measurement is done twice per second. The level
-    // is reset to zero at each call to LogStats().
-    int16_t max_rec_level = 0;
-
-    // Contains max level of recorded audio packets over the last 10 seconds
-    // where a new measurement is done twice per second.
-    int16_t max_play_level = 0;
-  };
-
-  AudioDeviceBuffer();
-  virtual ~AudioDeviceBuffer();
-
-  void SetId(uint32_t id) {};
-  int32_t RegisterAudioCallback(AudioTransport* audio_callback);
-
-  void StartPlayout();
-  void StartRecording();
-  void StopPlayout();
-  void StopRecording();
-
-  int32_t SetRecordingSampleRate(uint32_t fsHz);
-  int32_t SetPlayoutSampleRate(uint32_t fsHz);
-  int32_t RecordingSampleRate() const;
-  int32_t PlayoutSampleRate() const;
-
-  int32_t SetRecordingChannels(size_t channels);
-  int32_t SetPlayoutChannels(size_t channels);
-  size_t RecordingChannels() const;
-  size_t PlayoutChannels() const;
-  int32_t SetRecordingChannel(const AudioDeviceModule::ChannelType channel);
-  int32_t RecordingChannel(AudioDeviceModule::ChannelType& channel) const;
-
-  virtual int32_t SetRecordedBuffer(const void* audio_buffer,
-                                    size_t samples_per_channel);
-  int32_t SetCurrentMicLevel(uint32_t level);
-  virtual void SetVQEData(int play_delay_ms, int rec_delay_ms, int clock_drift);
-  virtual int32_t DeliverRecordedData();
-  uint32_t NewMicLevel() const;
-
-  virtual int32_t RequestPlayoutData(size_t samples_per_channel);
-  virtual int32_t GetPlayoutData(void* audio_buffer);
-
-  int32_t SetTypingStatus(bool typing_status);
-
-  // Called on iOS where the native audio layer can be interrupted by other
-  // audio applications. This method can then be used to reset internal
-  // states and detach thread checkers to allow for a new audio session where
-  // native callbacks may come from a new set of I/O threads.
-  void NativeAudioInterrupted();
-
- private:
-  // Starts/stops periodic logging of audio stats.
-  void StartPeriodicLogging();
-  void StopPeriodicLogging();
-
-  // Called periodically on the internal thread created by the TaskQueue.
-  // Updates some stats but dooes it on the task queue to ensure that access of
-  // members is serialized hence avoiding usage of locks.
-  // state = LOG_START => members are initialized and the timer starts.
-  // state = LOG_STOP => no logs are printed and the timer stops.
-  // state = LOG_ACTIVE => logs are printed and the timer is kept alive.
-  void LogStats(LogState state);
-
-  // Updates counters in each play/record callback. These counters are later
-  // (periodically) read by LogStats() using a lock.
-  void UpdateRecStats(int16_t max_abs, size_t samples_per_channel);
-  void UpdatePlayStats(int16_t max_abs, size_t samples_per_channel);
-
-  // Clears all members tracking stats for recording and playout.
-  // These methods both run on the task queue.
-  void ResetRecStats();
-  void ResetPlayStats();
-
-  // This object lives on the main (creating) thread and most methods are
-  // called on that same thread. When audio has started some methods will be
-  // called on either a native audio thread for playout or a native thread for
-  // recording. Some members are not annotated since they are "protected by
-  // design" and adding e.g. a race checker can cause failuries for very few
-  // edge cases and it is IMHO not worth the risk to use them in this class.
-  // TODO(henrika): see if it is possible to refactor and annotate all members.
-
-  // Main thread on which this object is created.
-  rtc::ThreadChecker main_thread_checker_;
-
-  // Native (platform specific) audio thread driving the playout side.
-  rtc::ThreadChecker playout_thread_checker_;
-
-  // Native (platform specific) audio thread driving the recording side.
-  rtc::ThreadChecker recording_thread_checker_;
-
-  rtc::CriticalSection lock_;
-
-  // Task queue used to invoke LogStats() periodically. Tasks are executed on a
-  // worker thread but it does not necessarily have to be the same thread for
-  // each task.
-  rtc::TaskQueue task_queue_;
-
-  // Raw pointer to AudioTransport instance. Supplied to RegisterAudioCallback()
-  // and it must outlive this object. It is not possible to change this member
-  // while any media is active. It is possible to start media without calling
-  // RegisterAudioCallback() but that will lead to ignored audio callbacks in
-  // both directions where native audio will be acive but no audio samples will
-  // be transported.
-  AudioTransport* audio_transport_cb_;
-
-  // The members below that are not annotated are protected by design. They are
-  // all set on the main thread (verified by |main_thread_checker_|) and then
-  // read on either the playout or recording audio thread. But, media will never
-  // be active when the member is set; hence no conflict exists. It is too
-  // complex to ensure and verify that this is actually the case.
-
-  // Sample rate in Hertz.
-  uint32_t rec_sample_rate_;
-  uint32_t play_sample_rate_;
-
-  // Number of audio channels.
-  size_t rec_channels_;
-  size_t play_channels_;
-
-  // Keeps track of if playout/recording are active or not. A combination
-  // of these states are used to determine when to start and stop the timer.
-  // Only used on the creating thread and not used to control any media flow.
-  bool playing_ RTC_ACCESS_ON(main_thread_checker_);
-  bool recording_ RTC_ACCESS_ON(main_thread_checker_);
-
-  // Buffer used for audio samples to be played out. Size can be changed
-  // dynamically. The 16-bit samples are interleaved, hence the size is
-  // proportional to the number of channels.
-  rtc::BufferT<int16_t> play_buffer_ RTC_ACCESS_ON(playout_thread_checker_);
-
-  // Byte buffer used for recorded audio samples. Size can be changed
-  // dynamically.
-  rtc::BufferT<int16_t> rec_buffer_ RTC_ACCESS_ON(recording_thread_checker_);
-
-  // AGC parameters.
-#if !defined(WEBRTC_WIN)
-  uint32_t current_mic_level_ RTC_ACCESS_ON(recording_thread_checker_);
-#else
-  // Windows uses a dedicated thread for volume APIs.
-  uint32_t current_mic_level_;
-#endif
-  uint32_t new_mic_level_ RTC_ACCESS_ON(recording_thread_checker_);
-
-  // Contains true of a key-press has been detected.
-  bool typing_status_ RTC_ACCESS_ON(recording_thread_checker_);
-
-  // Delay values used by the AEC.
-  int play_delay_ms_ RTC_ACCESS_ON(recording_thread_checker_);
-  int rec_delay_ms_ RTC_ACCESS_ON(recording_thread_checker_);
-
-  // Contains a clock-drift measurement.
-  int clock_drift_ RTC_ACCESS_ON(recording_thread_checker_);
-
-  // Counts number of times LogStats() has been called.
-  size_t num_stat_reports_ RTC_ACCESS_ON(task_queue_);
-
-  // Time stamp of last timer task (drives logging).
-  int64_t last_timer_task_time_ RTC_ACCESS_ON(task_queue_);
-
-  // Counts number of audio callbacks modulo 50 to create a signal when
-  // a new storage of audio stats shall be done.
-  int16_t rec_stat_count_ RTC_ACCESS_ON(recording_thread_checker_);
-  int16_t play_stat_count_ RTC_ACCESS_ON(playout_thread_checker_);
-
-  // Time stamps of when playout and recording starts.
-  int64_t play_start_time_ RTC_ACCESS_ON(main_thread_checker_);
-  int64_t rec_start_time_ RTC_ACCESS_ON(main_thread_checker_);
-
-  // Contains counters for playout and recording statistics.
-  Stats stats_ RTC_GUARDED_BY(lock_);
-
-  // Stores current stats at each timer task. Used to calculate differences
-  // between two successive timer events.
-  Stats last_stats_ RTC_ACCESS_ON(task_queue_);
-
-  // Set to true at construction and modified to false as soon as one audio-
-  // level estimate larger than zero is detected.
-  bool only_silence_recorded_;
-
-  // Set to true when logging of audio stats is enabled for the first time in
-  // StartPeriodicLogging() and set to false by StopPeriodicLogging().
-  // Setting this member to false prevents (possiby invalid) log messages from
-  // being printed in the LogStats() task.
-  bool log_stats_ RTC_ACCESS_ON(task_queue_);
-
-// Should *never* be defined in production builds. Only used for testing.
-// When defined, the output signal will be replaced by a sinus tone at 440Hz.
-#ifdef AUDIO_DEVICE_PLAYS_SINUS_TONE
-  double phase_ RTC_ACCESS_ON(playout_thread_checker_);
-#endif
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_DEVICE_AUDIO_DEVICE_BUFFER_H_
diff --git a/modules/audio_device/audio_device_config.h b/modules/audio_device/audio_device_config.h
deleted file mode 100644
index 3204cf5..0000000
--- a/modules/audio_device/audio_device_config.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- *  Copyright (c) 2011 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_AUDIO_DEVICE_AUDIO_DEVICE_CONFIG_H_
-#define WEBRTC_AUDIO_DEVICE_AUDIO_DEVICE_CONFIG_H_
-
-// Enumerators
-//
-enum { kAdmMaxIdleTimeProcess = 1000 };
-enum { GET_MIC_VOLUME_INTERVAL_MS = 1000 };
-
-// Platform specifics
-//
-#if defined(_WIN32)
-#if (_MSC_VER >= 1400)
-// Windows Core Audio is the default audio layer in Windows.
-// Only supported for VS 2005 and higher.
-#define WEBRTC_WINDOWS_CORE_AUDIO_BUILD
-#endif
-#endif
-
-#endif  // WEBRTC_AUDIO_DEVICE_AUDIO_DEVICE_CONFIG_H_
-
diff --git a/modules/audio_device/audio_device_data_observer.cc b/modules/audio_device/audio_device_data_observer.cc
deleted file mode 100644
index 23c3b9d..0000000
--- a/modules/audio_device/audio_device_data_observer.cc
+++ /dev/null
@@ -1,337 +0,0 @@
-/*
- *  Copyright (c) 2017 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_device/include/audio_device_data_observer.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/refcountedobject.h"
-
-namespace webrtc {
-
-namespace {
-
-// A wrapper over AudioDeviceModule that registers itself as AudioTransport
-// callback and redirects the PCM data to AudioDeviceDataObserver callback.
-class ADMWrapper : public AudioDeviceModule, public AudioTransport {
- public:
-  ADMWrapper(const int32_t id,
-             const AudioLayer audio_layer,
-             AudioDeviceDataObserver* observer)
-      : impl_(AudioDeviceModule::Create(id, audio_layer)), observer_(observer) {
-    // Register self as the audio transport callback for underlying ADM impl.
-    auto res = impl_->RegisterAudioCallback(this);
-    is_valid_ = (impl_.get() != nullptr) && (res == 0);
-  }
-  virtual ~ADMWrapper() {
-    audio_transport_ = nullptr;
-    observer_ = nullptr;
-  }
-
-  // Make sure we have a valid ADM before returning it to user.
-  bool IsValid() { return is_valid_; }
-
-  // RefCountedModule methods overrides.
-  int64_t TimeUntilNextProcess() override {
-    return impl_->TimeUntilNextProcess();
-  }
-  void Process() override { return impl_->Process(); }
-
-  // AudioTransport methods overrides.
-  int32_t RecordedDataIsAvailable(const void* audioSamples,
-                                  const size_t nSamples,
-                                  const size_t nBytesPerSample,
-                                  const size_t nChannels,
-                                  const uint32_t samples_per_sec,
-                                  const uint32_t total_delay_ms,
-                                  const int32_t clockDrift,
-                                  const uint32_t currentMicLevel,
-                                  const bool keyPressed,
-                                  uint32_t& newMicLevel) override {
-    int32_t res = 0;
-    // Capture PCM data of locally captured audio.
-    if (observer_) {
-      observer_->OnCaptureData(audioSamples, nSamples, nBytesPerSample,
-                               nChannels, samples_per_sec);
-    }
-
-    // Send to the actual audio transport.
-    if (audio_transport_) {
-      res = audio_transport_->RecordedDataIsAvailable(
-          audioSamples, nSamples, nBytesPerSample, nChannels, samples_per_sec,
-          total_delay_ms, clockDrift, currentMicLevel, keyPressed, newMicLevel);
-    }
-
-    return res;
-  }
-
-  int32_t NeedMorePlayData(const size_t nSamples,
-                           const size_t nBytesPerSample,
-                           const size_t nChannels,
-                           const uint32_t samples_per_sec,
-                           void* audioSamples,
-                           size_t& nSamplesOut,
-                           int64_t* elapsed_time_ms,
-                           int64_t* ntp_time_ms) override {
-    int32_t res = 0;
-    // Request data from audio transport.
-    if (audio_transport_) {
-      res = audio_transport_->NeedMorePlayData(
-          nSamples, nBytesPerSample, nChannels, samples_per_sec, audioSamples,
-          nSamplesOut, elapsed_time_ms, ntp_time_ms);
-    }
-
-    // Capture rendered data.
-    if (observer_) {
-      observer_->OnRenderData(audioSamples, nSamples, nBytesPerSample,
-                              nChannels, samples_per_sec);
-    }
-
-    return res;
-  }
-
-  void PushCaptureData(int voe_channel,
-                       const void* audio_data,
-                       int bits_per_sample,
-                       int sample_rate,
-                       size_t number_of_channels,
-                       size_t number_of_frames) override {
-    RTC_NOTREACHED();
-  }
-
-  void PullRenderData(int bits_per_sample,
-                      int sample_rate,
-                      size_t number_of_channels,
-                      size_t number_of_frames,
-                      void* audio_data,
-                      int64_t* elapsed_time_ms,
-                      int64_t* ntp_time_ms) override {
-    RTC_NOTREACHED();
-  }
-
-  // Override AudioDeviceModule's RegisterAudioCallback method to remember the
-  // actual audio transport (e.g.: voice engine).
-  int32_t RegisterAudioCallback(AudioTransport* audio_callback) override {
-    // Remember the audio callback to forward PCM data
-    audio_transport_ = audio_callback;
-    return 0;
-  }
-
-  // AudioDeviceModule pass through method overrides.
-  int32_t ActiveAudioLayer(AudioLayer* audio_layer) const override {
-    return impl_->ActiveAudioLayer(audio_layer);
-  }
-  ErrorCode LastError() const override { return impl_->LastError(); }
-  int32_t RegisterEventObserver(AudioDeviceObserver* event_callback) override {
-    return impl_->RegisterEventObserver(event_callback);
-  }
-  int32_t Init() override { return impl_->Init(); }
-  int32_t Terminate() override { return impl_->Terminate(); }
-  bool Initialized() const override { return impl_->Initialized(); }
-  int16_t PlayoutDevices() override { return impl_->PlayoutDevices(); }
-  int16_t RecordingDevices() override { return impl_->RecordingDevices(); }
-  int32_t PlayoutDeviceName(uint16_t index,
-                            char name[kAdmMaxDeviceNameSize],
-                            char guid[kAdmMaxGuidSize]) override {
-    return impl_->PlayoutDeviceName(index, name, guid);
-  }
-  int32_t RecordingDeviceName(uint16_t index,
-                              char name[kAdmMaxDeviceNameSize],
-                              char guid[kAdmMaxGuidSize]) override {
-    return impl_->RecordingDeviceName(index, name, guid);
-  }
-  int32_t SetPlayoutDevice(uint16_t index) override {
-    return impl_->SetPlayoutDevice(index);
-  }
-  int32_t SetPlayoutDevice(WindowsDeviceType device) override {
-    return impl_->SetPlayoutDevice(device);
-  }
-  int32_t SetRecordingDevice(uint16_t index) override {
-    return impl_->SetRecordingDevice(index);
-  }
-  int32_t SetRecordingDevice(WindowsDeviceType device) override {
-    return impl_->SetRecordingDevice(device);
-  }
-  int32_t PlayoutIsAvailable(bool* available) override {
-    return impl_->PlayoutIsAvailable(available);
-  }
-  int32_t InitPlayout() override { return impl_->InitPlayout(); }
-  bool PlayoutIsInitialized() const override {
-    return impl_->PlayoutIsInitialized();
-  }
-  int32_t RecordingIsAvailable(bool* available) override {
-    return impl_->RecordingIsAvailable(available);
-  }
-  int32_t InitRecording() override { return impl_->InitRecording(); }
-  bool RecordingIsInitialized() const override {
-    return impl_->RecordingIsInitialized();
-  }
-  int32_t StartPlayout() override { return impl_->StartPlayout(); }
-  int32_t StopPlayout() override { return impl_->StopPlayout(); }
-  bool Playing() const override { return impl_->Playing(); }
-  int32_t StartRecording() override { return impl_->StartRecording(); }
-  int32_t StopRecording() override { return impl_->StopRecording(); }
-  bool Recording() const override { return impl_->Recording(); }
-  int32_t SetAGC(bool enable) override { return impl_->SetAGC(enable); }
-  bool AGC() const override { return impl_->AGC(); }
-  int32_t InitSpeaker() override { return impl_->InitSpeaker(); }
-  bool SpeakerIsInitialized() const override {
-    return impl_->SpeakerIsInitialized();
-  }
-  int32_t InitMicrophone() override { return impl_->InitMicrophone(); }
-  bool MicrophoneIsInitialized() const override {
-    return impl_->MicrophoneIsInitialized();
-  }
-  int32_t SpeakerVolumeIsAvailable(bool* available) override {
-    return impl_->SpeakerVolumeIsAvailable(available);
-  }
-  int32_t SetSpeakerVolume(uint32_t volume) override {
-    return impl_->SetSpeakerVolume(volume);
-  }
-  int32_t SpeakerVolume(uint32_t* volume) const override {
-    return impl_->SpeakerVolume(volume);
-  }
-  int32_t MaxSpeakerVolume(uint32_t* max_volume) const override {
-    return impl_->MaxSpeakerVolume(max_volume);
-  }
-  int32_t MinSpeakerVolume(uint32_t* min_volume) const override {
-    return impl_->MinSpeakerVolume(min_volume);
-  }
-  int32_t MicrophoneVolumeIsAvailable(bool* available) override {
-    return impl_->MicrophoneVolumeIsAvailable(available);
-  }
-  int32_t SetMicrophoneVolume(uint32_t volume) override {
-    return impl_->SetMicrophoneVolume(volume);
-  }
-  int32_t MicrophoneVolume(uint32_t* volume) const override {
-    return impl_->MicrophoneVolume(volume);
-  }
-  int32_t MaxMicrophoneVolume(uint32_t* max_volume) const override {
-    return impl_->MaxMicrophoneVolume(max_volume);
-  }
-  int32_t MinMicrophoneVolume(uint32_t* min_volume) const override {
-    return impl_->MinMicrophoneVolume(min_volume);
-  }
-  int32_t SpeakerMuteIsAvailable(bool* available) override {
-    return impl_->SpeakerMuteIsAvailable(available);
-  }
-  int32_t SetSpeakerMute(bool enable) override {
-    return impl_->SetSpeakerMute(enable);
-  }
-  int32_t SpeakerMute(bool* enabled) const override {
-    return impl_->SpeakerMute(enabled);
-  }
-  int32_t MicrophoneMuteIsAvailable(bool* available) override {
-    return impl_->MicrophoneMuteIsAvailable(available);
-  }
-  int32_t SetMicrophoneMute(bool enable) override {
-    return impl_->SetMicrophoneMute(enable);
-  }
-  int32_t MicrophoneMute(bool* enabled) const override {
-    return impl_->MicrophoneMute(enabled);
-  }
-  int32_t StereoPlayoutIsAvailable(bool* available) const override {
-    return impl_->StereoPlayoutIsAvailable(available);
-  }
-  int32_t SetStereoPlayout(bool enable) override {
-    return impl_->SetStereoPlayout(enable);
-  }
-  int32_t StereoPlayout(bool* enabled) const override {
-    return impl_->StereoPlayout(enabled);
-  }
-  int32_t StereoRecordingIsAvailable(bool* available) const override {
-    return impl_->StereoRecordingIsAvailable(available);
-  }
-  int32_t SetStereoRecording(bool enable) override {
-    return impl_->SetStereoRecording(enable);
-  }
-  int32_t StereoRecording(bool* enabled) const override {
-    return impl_->StereoRecording(enabled);
-  }
-  int32_t SetRecordingChannel(const ChannelType channel) override {
-    return impl_->SetRecordingChannel(channel);
-  }
-  int32_t RecordingChannel(ChannelType* channel) const override {
-    return impl_->RecordingChannel(channel);
-  }
-  int32_t PlayoutDelay(uint16_t* delay_ms) const override {
-    return impl_->PlayoutDelay(delay_ms);
-  }
-  int32_t RecordingDelay(uint16_t* delay_ms) const override {
-    return impl_->RecordingDelay(delay_ms);
-  }
-  int32_t SetRecordingSampleRate(const uint32_t samples_per_sec) override {
-    return impl_->SetRecordingSampleRate(samples_per_sec);
-  }
-  int32_t RecordingSampleRate(uint32_t* samples_per_sec) const override {
-    return impl_->RecordingSampleRate(samples_per_sec);
-  }
-  int32_t SetPlayoutSampleRate(const uint32_t samples_per_sec) override {
-    return impl_->SetPlayoutSampleRate(samples_per_sec);
-  }
-  int32_t PlayoutSampleRate(uint32_t* samples_per_sec) const override {
-    return impl_->PlayoutSampleRate(samples_per_sec);
-  }
-  int32_t SetLoudspeakerStatus(bool enable) override {
-    return impl_->SetLoudspeakerStatus(enable);
-  }
-  int32_t GetLoudspeakerStatus(bool* enabled) const override {
-    return impl_->GetLoudspeakerStatus(enabled);
-  }
-  bool BuiltInAECIsAvailable() const override {
-    return impl_->BuiltInAECIsAvailable();
-  }
-  bool BuiltInAGCIsAvailable() const override {
-    return impl_->BuiltInAGCIsAvailable();
-  }
-  bool BuiltInNSIsAvailable() const override {
-    return impl_->BuiltInNSIsAvailable();
-  }
-  int32_t EnableBuiltInAEC(bool enable) override {
-    return impl_->EnableBuiltInAEC(enable);
-  }
-  int32_t EnableBuiltInAGC(bool enable) override {
-    return impl_->EnableBuiltInAGC(enable);
-  }
-  int32_t EnableBuiltInNS(bool enable) override {
-    return impl_->EnableBuiltInNS(enable);
-  }
-// Only supported on iOS.
-#if defined(WEBRTC_IOS)
-  int GetPlayoutAudioParameters(AudioParameters* params) const override {
-    return impl_->GetPlayoutAudioParameters(params);
-  }
-  int GetRecordAudioParameters(AudioParameters* params) const override {
-    return impl_->GetRecordAudioParameters(params);
-  }
-#endif  // WEBRTC_IOS
-
- protected:
-  rtc::scoped_refptr<AudioDeviceModule> impl_;
-  AudioDeviceDataObserver* observer_ = nullptr;
-  AudioTransport* audio_transport_ = nullptr;
-  bool is_valid_ = false;
-};
-
-}  // namespace
-
-rtc::scoped_refptr<AudioDeviceModule> CreateAudioDeviceWithDataObserver(
-    const int32_t id,
-    const AudioDeviceModule::AudioLayer audio_layer,
-    AudioDeviceDataObserver* observer) {
-  rtc::scoped_refptr<ADMWrapper> audio_device(
-      new rtc::RefCountedObject<ADMWrapper>(id, audio_layer, observer));
-
-  if (!audio_device->IsValid()) {
-    return nullptr;
-  }
-
-  return audio_device;
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_device/audio_device_generic.cc b/modules/audio_device/audio_device_generic.cc
deleted file mode 100644
index f865d03..0000000
--- a/modules/audio_device/audio_device_generic.cc
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- *  Copyright (c) 2011 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_device/audio_device_generic.h"
-#include "webrtc/rtc_base/logging.h"
-
-namespace webrtc {
-
-int32_t AudioDeviceGeneric::SetRecordingSampleRate(
-    const uint32_t samplesPerSec) {
-  LOG_F(LS_ERROR) << "Not supported on this platform";
-  return -1;
-}
-
-int32_t AudioDeviceGeneric::SetPlayoutSampleRate(const uint32_t samplesPerSec) {
-  LOG_F(LS_ERROR) << "Not supported on this platform";
-  return -1;
-}
-
-int32_t AudioDeviceGeneric::SetLoudspeakerStatus(bool enable) {
-  LOG_F(LS_ERROR) << "Not supported on this platform";
-  return -1;
-}
-
-int32_t AudioDeviceGeneric::GetLoudspeakerStatus(bool& enable) const {
-  LOG_F(LS_ERROR) << "Not supported on this platform";
-  return -1;
-}
-
-bool AudioDeviceGeneric::BuiltInAECIsAvailable() const {
-  LOG_F(LS_ERROR) << "Not supported on this platform";
-  return false;
-}
-
-int32_t AudioDeviceGeneric::EnableBuiltInAEC(bool enable) {
-  LOG_F(LS_ERROR) << "Not supported on this platform";
-  return -1;
-}
-
-bool AudioDeviceGeneric::BuiltInAGCIsAvailable() const {
-  LOG_F(LS_ERROR) << "Not supported on this platform";
-  return false;
-}
-
-int32_t AudioDeviceGeneric::EnableBuiltInAGC(bool enable) {
-  LOG_F(LS_ERROR) << "Not supported on this platform";
-  return -1;
-}
-
-bool AudioDeviceGeneric::BuiltInNSIsAvailable() const {
-  LOG_F(LS_ERROR) << "Not supported on this platform";
-  return false;
-}
-
-int32_t AudioDeviceGeneric::EnableBuiltInNS(bool enable) {
-  LOG_F(LS_ERROR) << "Not supported on this platform";
-  return -1;
-}
-
-#if defined(WEBRTC_IOS)
-int AudioDeviceGeneric::GetPlayoutAudioParameters(
-    AudioParameters* params) const {
-  LOG_F(LS_ERROR) << "Not supported on this platform";
-  return -1;
-}
-
-int AudioDeviceGeneric::GetRecordAudioParameters(
-    AudioParameters* params) const {
-  LOG_F(LS_ERROR) << "Not supported on this platform";
-  return -1;
-}
-#endif  // WEBRTC_IOS
-
-}  // namespace webrtc
diff --git a/modules/audio_device/audio_device_generic.h b/modules/audio_device/audio_device_generic.h
deleted file mode 100644
index cdcb934..0000000
--- a/modules/audio_device/audio_device_generic.h
+++ /dev/null
@@ -1,161 +0,0 @@
-/*
- *  Copyright (c) 2012 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_AUDIO_DEVICE_AUDIO_DEVICE_GENERIC_H
-#define WEBRTC_AUDIO_DEVICE_AUDIO_DEVICE_GENERIC_H
-
-#include "webrtc/modules/audio_device/audio_device_buffer.h"
-#include "webrtc/modules/audio_device/include/audio_device.h"
-
-namespace webrtc {
-
-class AudioDeviceGeneric {
- public:
-  // For use with UMA logging. Must be kept in sync with histograms.xml in
-  // Chrome, located at
-  // https://cs.chromium.org/chromium/src/tools/metrics/histograms/histograms.xml
-  enum class InitStatus {
-    OK = 0,
-    PLAYOUT_ERROR = 1,
-    RECORDING_ERROR = 2,
-    OTHER_ERROR = 3,
-    NUM_STATUSES = 4
-  };
-  // Retrieve the currently utilized audio layer
-  virtual int32_t ActiveAudioLayer(
-      AudioDeviceModule::AudioLayer& audioLayer) const = 0;
-
-  // Main initializaton and termination
-  virtual InitStatus Init() = 0;
-  virtual int32_t Terminate() = 0;
-  virtual bool Initialized() const = 0;
-
-  // Device enumeration
-  virtual int16_t PlayoutDevices() = 0;
-  virtual int16_t RecordingDevices() = 0;
-  virtual int32_t PlayoutDeviceName(uint16_t index,
-                                    char name[kAdmMaxDeviceNameSize],
-                                    char guid[kAdmMaxGuidSize]) = 0;
-  virtual int32_t RecordingDeviceName(uint16_t index,
-                                      char name[kAdmMaxDeviceNameSize],
-                                      char guid[kAdmMaxGuidSize]) = 0;
-
-  // Device selection
-  virtual int32_t SetPlayoutDevice(uint16_t index) = 0;
-  virtual int32_t SetPlayoutDevice(
-      AudioDeviceModule::WindowsDeviceType device) = 0;
-  virtual int32_t SetRecordingDevice(uint16_t index) = 0;
-  virtual int32_t SetRecordingDevice(
-      AudioDeviceModule::WindowsDeviceType device) = 0;
-
-  // Audio transport initialization
-  virtual int32_t PlayoutIsAvailable(bool& available) = 0;
-  virtual int32_t InitPlayout() = 0;
-  virtual bool PlayoutIsInitialized() const = 0;
-  virtual int32_t RecordingIsAvailable(bool& available) = 0;
-  virtual int32_t InitRecording() = 0;
-  virtual bool RecordingIsInitialized() const = 0;
-
-  // Audio transport control
-  virtual int32_t StartPlayout() = 0;
-  virtual int32_t StopPlayout() = 0;
-  virtual bool Playing() const = 0;
-  virtual int32_t StartRecording() = 0;
-  virtual int32_t StopRecording() = 0;
-  virtual bool Recording() const = 0;
-
-  // Microphone Automatic Gain Control (AGC)
-  virtual int32_t SetAGC(bool enable) = 0;
-  virtual bool AGC() const = 0;
-
-  // Audio mixer initialization
-  virtual int32_t InitSpeaker() = 0;
-  virtual bool SpeakerIsInitialized() const = 0;
-  virtual int32_t InitMicrophone() = 0;
-  virtual bool MicrophoneIsInitialized() const = 0;
-
-  // Speaker volume controls
-  virtual int32_t SpeakerVolumeIsAvailable(bool& available) = 0;
-  virtual int32_t SetSpeakerVolume(uint32_t volume) = 0;
-  virtual int32_t SpeakerVolume(uint32_t& volume) const = 0;
-  virtual int32_t MaxSpeakerVolume(uint32_t& maxVolume) const = 0;
-  virtual int32_t MinSpeakerVolume(uint32_t& minVolume) const = 0;
-
-  // Microphone volume controls
-  virtual int32_t MicrophoneVolumeIsAvailable(bool& available) = 0;
-  virtual int32_t SetMicrophoneVolume(uint32_t volume) = 0;
-  virtual int32_t MicrophoneVolume(uint32_t& volume) const = 0;
-  virtual int32_t MaxMicrophoneVolume(uint32_t& maxVolume) const = 0;
-  virtual int32_t MinMicrophoneVolume(uint32_t& minVolume) const = 0;
-
-  // Speaker mute control
-  virtual int32_t SpeakerMuteIsAvailable(bool& available) = 0;
-  virtual int32_t SetSpeakerMute(bool enable) = 0;
-  virtual int32_t SpeakerMute(bool& enabled) const = 0;
-
-  // Microphone mute control
-  virtual int32_t MicrophoneMuteIsAvailable(bool& available) = 0;
-  virtual int32_t SetMicrophoneMute(bool enable) = 0;
-  virtual int32_t MicrophoneMute(bool& enabled) const = 0;
-
-  // Stereo support
-  virtual int32_t StereoPlayoutIsAvailable(bool& available) = 0;
-  virtual int32_t SetStereoPlayout(bool enable) = 0;
-  virtual int32_t StereoPlayout(bool& enabled) const = 0;
-  virtual int32_t StereoRecordingIsAvailable(bool& available) = 0;
-  virtual int32_t SetStereoRecording(bool enable) = 0;
-  virtual int32_t StereoRecording(bool& enabled) const = 0;
-
-  // Delay information and control
-  virtual int32_t PlayoutDelay(uint16_t& delayMS) const = 0;
-  virtual int32_t RecordingDelay(uint16_t& delayMS) const = 0;
-
-  // Native sample rate controls (samples/sec)
-  virtual int32_t SetRecordingSampleRate(const uint32_t samplesPerSec);
-  virtual int32_t SetPlayoutSampleRate(const uint32_t samplesPerSec);
-
-  // Speaker audio routing (for mobile devices)
-  virtual int32_t SetLoudspeakerStatus(bool enable);
-  virtual int32_t GetLoudspeakerStatus(bool& enable) const;
-
-  // Android only
-  virtual bool BuiltInAECIsAvailable() const;
-  virtual bool BuiltInAGCIsAvailable() const;
-  virtual bool BuiltInNSIsAvailable() const;
-
-  // Windows Core Audio and Android only.
-  virtual int32_t EnableBuiltInAEC(bool enable);
-  virtual int32_t EnableBuiltInAGC(bool enable);
-  virtual int32_t EnableBuiltInNS(bool enable);
-
-  // iOS only.
-  // TODO(henrika): add Android support.
-#if defined(WEBRTC_IOS)
-  virtual int GetPlayoutAudioParameters(AudioParameters* params) const;
-  virtual int GetRecordAudioParameters(AudioParameters* params) const;
-#endif  // WEBRTC_IOS
-
-  virtual bool PlayoutWarning() const = 0;
-  virtual bool PlayoutError() const = 0;
-  virtual bool RecordingWarning() const = 0;
-  virtual bool RecordingError() const = 0;
-  virtual void ClearPlayoutWarning() = 0;
-  virtual void ClearPlayoutError() = 0;
-  virtual void ClearRecordingWarning() = 0;
-  virtual void ClearRecordingError() = 0;
-
-  virtual void AttachAudioBuffer(AudioDeviceBuffer* audioBuffer) = 0;
-
-  virtual ~AudioDeviceGeneric() {}
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_AUDIO_DEVICE_AUDIO_DEVICE_GENERIC_H
diff --git a/modules/audio_device/audio_device_impl.cc b/modules/audio_device/audio_device_impl.cc
deleted file mode 100644
index e8a3a72..0000000
--- a/modules/audio_device/audio_device_impl.cc
+++ /dev/null
@@ -1,1578 +0,0 @@
-/*
- *  Copyright (c) 2012 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_device/audio_device_impl.h"
-#include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
-#include "webrtc/modules/audio_device/audio_device_config.h"
-#include "webrtc/modules/audio_device/audio_device_generic.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/refcount.h"
-#include "webrtc/rtc_base/timeutils.h"
-#include "webrtc/system_wrappers/include/metrics.h"
-
-#include <assert.h>
-#include <string.h>
-
-#if defined(_WIN32)
-#if defined(WEBRTC_WINDOWS_CORE_AUDIO_BUILD)
-#include "audio_device_core_win.h"
-#endif
-#elif defined(WEBRTC_ANDROID)
-#include <stdlib.h>
-#include "webrtc/modules/audio_device/android/audio_device_template.h"
-#include "webrtc/modules/audio_device/android/audio_manager.h"
-#include "webrtc/modules/audio_device/android/audio_record_jni.h"
-#include "webrtc/modules/audio_device/android/audio_track_jni.h"
-#include "webrtc/modules/audio_device/android/opensles_player.h"
-#include "webrtc/modules/audio_device/android/opensles_recorder.h"
-#elif defined(WEBRTC_LINUX)
-#if defined(LINUX_ALSA)
-#include "audio_device_alsa_linux.h"
-#endif
-#if defined(LINUX_PULSE)
-#include "audio_device_pulse_linux.h"
-#endif
-#elif defined(WEBRTC_IOS)
-#include "audio_device_ios.h"
-#elif defined(WEBRTC_MAC)
-#include "audio_device_mac.h"
-#endif
-
-#if defined(WEBRTC_DUMMY_FILE_DEVICES)
-#include "webrtc/modules/audio_device/dummy/file_audio_device_factory.h"
-#endif
-
-#include "webrtc/modules/audio_device/dummy/audio_device_dummy.h"
-#include "webrtc/modules/audio_device/dummy/file_audio_device.h"
-
-#define CHECK_INITIALIZED() \
-  {                         \
-    if (!_initialized) {    \
-      return -1;            \
-    };                      \
-  }
-
-#define CHECK_INITIALIZED_BOOL() \
-  {                              \
-    if (!_initialized) {         \
-      return false;              \
-    };                           \
-  }
-
-namespace webrtc {
-
-// ============================================================================
-//                                   Static methods
-// ============================================================================
-
-// ----------------------------------------------------------------------------
-//  AudioDeviceModule::Create()
-// ----------------------------------------------------------------------------
-
-rtc::scoped_refptr<AudioDeviceModule> AudioDeviceModule::Create(
-    const int32_t id,
-    const AudioLayer audio_layer) {
-  LOG(INFO) << __FUNCTION__;
-  // Create the generic ref counted (platform independent) implementation.
-  rtc::scoped_refptr<AudioDeviceModuleImpl> audioDevice(
-      new rtc::RefCountedObject<AudioDeviceModuleImpl>(id, audio_layer));
-
-  // Ensure that the current platform is supported.
-  if (audioDevice->CheckPlatform() == -1) {
-    return nullptr;
-  }
-
-  // Create the platform-dependent implementation.
-  if (audioDevice->CreatePlatformSpecificObjects() == -1) {
-    return nullptr;
-  }
-
-  // Ensure that the generic audio buffer can communicate with the
-  // platform-specific parts.
-  if (audioDevice->AttachAudioBuffer() == -1) {
-    return nullptr;
-  }
-
-  WebRtcSpl_Init();
-
-  return audioDevice;
-}
-
-// ============================================================================
-//                            Construction & Destruction
-// ============================================================================
-
-// ----------------------------------------------------------------------------
-//  AudioDeviceModuleImpl - ctor
-// ----------------------------------------------------------------------------
-
-AudioDeviceModuleImpl::AudioDeviceModuleImpl(const int32_t id,
-                                             const AudioLayer audioLayer)
-    : _ptrCbAudioDeviceObserver(NULL),
-      _ptrAudioDevice(NULL),
-      _id(id),
-      _platformAudioLayer(audioLayer),
-      _lastProcessTime(rtc::TimeMillis()),
-      _platformType(kPlatformNotSupported),
-      _initialized(false),
-      _lastError(kAdmErrNone) {
-  LOG(INFO) << __FUNCTION__;
-}
-
-// ----------------------------------------------------------------------------
-//  CheckPlatform
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceModuleImpl::CheckPlatform() {
-  LOG(INFO) << __FUNCTION__;
-
-  // Ensure that the current platform is supported
-  //
-  PlatformType platform(kPlatformNotSupported);
-
-#if defined(_WIN32)
-  platform = kPlatformWin32;
-  LOG(INFO) << "current platform is Win32";
-#elif defined(WEBRTC_ANDROID)
-  platform = kPlatformAndroid;
-  LOG(INFO) << "current platform is Android";
-#elif defined(WEBRTC_LINUX)
-  platform = kPlatformLinux;
-  LOG(INFO) << "current platform is Linux";
-#elif defined(WEBRTC_IOS)
-  platform = kPlatformIOS;
-  LOG(INFO) << "current platform is IOS";
-#elif defined(WEBRTC_MAC)
-  platform = kPlatformMac;
-  LOG(INFO) << "current platform is Mac";
-#endif
-
-  if (platform == kPlatformNotSupported) {
-    LOG(LERROR) << "current platform is not supported => this module will self "
-                   "destruct!";
-    return -1;
-  }
-
-  // Store valid output results
-  //
-  _platformType = platform;
-
-  return 0;
-}
-
-// ----------------------------------------------------------------------------
-//  CreatePlatformSpecificObjects
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceModuleImpl::CreatePlatformSpecificObjects() {
-  LOG(INFO) << __FUNCTION__;
-
-  AudioDeviceGeneric* ptrAudioDevice(NULL);
-
-#if defined(WEBRTC_DUMMY_AUDIO_BUILD)
-  ptrAudioDevice = new AudioDeviceDummy(Id());
-  LOG(INFO) << "Dummy Audio APIs will be utilized";
-#elif defined(WEBRTC_DUMMY_FILE_DEVICES)
-  ptrAudioDevice = FileAudioDeviceFactory::CreateFileAudioDevice(Id());
-  if (ptrAudioDevice) {
-    LOG(INFO) << "Will use file-playing dummy device.";
-  } else {
-    // Create a dummy device instead.
-    ptrAudioDevice = new AudioDeviceDummy(Id());
-    LOG(INFO) << "Dummy Audio APIs will be utilized";
-  }
-#else
-  AudioLayer audioLayer(PlatformAudioLayer());
-
-// Create the *Windows* implementation of the Audio Device
-//
-#if defined(WEBRTC_WINDOWS_CORE_AUDIO_BUILD)
-  if ((audioLayer == kWindowsCoreAudio) ||
-      (audioLayer == kPlatformDefaultAudio)) {
-    LOG(INFO) << "attempting to use the Windows Core Audio APIs...";
-
-    if (AudioDeviceWindowsCore::CoreAudioIsSupported()) {
-      // create *Windows Core Audio* implementation
-      ptrAudioDevice = new AudioDeviceWindowsCore();
-      LOG(INFO) << "Windows Core Audio APIs will be utilized";
-    }
-  }
-#endif  // defined(WEBRTC_WINDOWS_CORE_AUDIO_BUILD)
-
-#if defined(WEBRTC_ANDROID)
-  // Create an Android audio manager.
-  _audioManagerAndroid.reset(new AudioManager());
-  // Select best possible combination of audio layers.
-  if (audioLayer == kPlatformDefaultAudio) {
-    if (_audioManagerAndroid->IsLowLatencyPlayoutSupported() &&
-        _audioManagerAndroid->IsLowLatencyRecordSupported()) {
-      // Use OpenSL ES for both playout and recording.
-      audioLayer = kAndroidOpenSLESAudio;
-    } else if (_audioManagerAndroid->IsLowLatencyPlayoutSupported() &&
-               !_audioManagerAndroid->IsLowLatencyRecordSupported()) {
-      // Use OpenSL ES for output on devices that only supports the
-      // low-latency output audio path.
-      audioLayer = kAndroidJavaInputAndOpenSLESOutputAudio;
-    } else {
-      // Use Java-based audio in both directions when low-latency output is
-      // not supported.
-      audioLayer = kAndroidJavaAudio;
-    }
-  }
-  AudioManager* audio_manager = _audioManagerAndroid.get();
-  if (audioLayer == kAndroidJavaAudio) {
-    // Java audio for both input and output audio.
-    ptrAudioDevice = new AudioDeviceTemplate<AudioRecordJni, AudioTrackJni>(
-        audioLayer, audio_manager);
-  } else if (audioLayer == kAndroidOpenSLESAudio) {
-    // OpenSL ES based audio for both input and output audio.
-    ptrAudioDevice = new AudioDeviceTemplate<OpenSLESRecorder, OpenSLESPlayer>(
-        audioLayer, audio_manager);
-  } else if (audioLayer == kAndroidJavaInputAndOpenSLESOutputAudio) {
-    // Java audio for input and OpenSL ES for output audio (i.e. mixed APIs).
-    // This combination provides low-latency output audio and at the same
-    // time support for HW AEC using the AudioRecord Java API.
-    ptrAudioDevice = new AudioDeviceTemplate<AudioRecordJni, OpenSLESPlayer>(
-        audioLayer, audio_manager);
-  } else {
-    // Invalid audio layer.
-    ptrAudioDevice = nullptr;
-  }
-// END #if defined(WEBRTC_ANDROID)
-
-// Create the *Linux* implementation of the Audio Device
-//
-#elif defined(WEBRTC_LINUX)
-  if ((audioLayer == kLinuxPulseAudio) ||
-      (audioLayer == kPlatformDefaultAudio)) {
-#if defined(LINUX_PULSE)
-    LOG(INFO) << "attempting to use the Linux PulseAudio APIs...";
-
-    // create *Linux PulseAudio* implementation
-    AudioDeviceLinuxPulse* pulseDevice = new AudioDeviceLinuxPulse();
-    if (pulseDevice->Init() == AudioDeviceGeneric::InitStatus::OK) {
-      ptrAudioDevice = pulseDevice;
-      LOG(INFO) << "Linux PulseAudio APIs will be utilized";
-    } else {
-      delete pulseDevice;
-#endif
-#if defined(LINUX_ALSA)
-      // create *Linux ALSA Audio* implementation
-      ptrAudioDevice = new AudioDeviceLinuxALSA();
-      if (ptrAudioDevice != NULL) {
-        // Pulse Audio was not supported => revert to ALSA instead
-        _platformAudioLayer =
-            kLinuxAlsaAudio;  // modify the state set at construction
-        LOG(WARNING) << "Linux PulseAudio is *not* supported => ALSA APIs will "
-                        "be utilized instead";
-      }
-#endif
-#if defined(LINUX_PULSE)
-    }
-#endif
-  } else if (audioLayer == kLinuxAlsaAudio) {
-#if defined(LINUX_ALSA)
-    // create *Linux ALSA Audio* implementation
-    ptrAudioDevice = new AudioDeviceLinuxALSA();
-    LOG(INFO) << "Linux ALSA APIs will be utilized";
-#endif
-  }
-#endif  // #if defined(WEBRTC_LINUX)
-
-// Create the *iPhone* implementation of the Audio Device
-//
-#if defined(WEBRTC_IOS)
-  if (audioLayer == kPlatformDefaultAudio) {
-    // Create iOS Audio Device implementation.
-    ptrAudioDevice = new AudioDeviceIOS();
-    LOG(INFO) << "iPhone Audio APIs will be utilized";
-  }
-// END #if defined(WEBRTC_IOS)
-
-// Create the *Mac* implementation of the Audio Device
-//
-#elif defined(WEBRTC_MAC)
-  if (audioLayer == kPlatformDefaultAudio) {
-    // Create *Mac Audio* implementation
-    ptrAudioDevice = new AudioDeviceMac();
-    LOG(INFO) << "Mac OS X Audio APIs will be utilized";
-  }
-#endif  // WEBRTC_MAC
-
-  // Create the *Dummy* implementation of the Audio Device
-  // Available for all platforms
-  //
-  if (audioLayer == kDummyAudio) {
-    // Create *Dummy Audio* implementation
-    assert(!ptrAudioDevice);
-    ptrAudioDevice = new AudioDeviceDummy(Id());
-    LOG(INFO) << "Dummy Audio APIs will be utilized";
-  }
-#endif  // if defined(WEBRTC_DUMMY_AUDIO_BUILD)
-
-  if (ptrAudioDevice == NULL) {
-    LOG(LERROR)
-        << "unable to create the platform specific audio device implementation";
-    return -1;
-  }
-
-  // Store valid output pointers
-  //
-  _ptrAudioDevice = ptrAudioDevice;
-
-  return 0;
-}
-
-// ----------------------------------------------------------------------------
-//  AttachAudioBuffer
-//
-//  Install "bridge" between the platform implemetation and the generic
-//  implementation. The "child" shall set the native sampling rate and the
-//  number of channels in this function call.
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceModuleImpl::AttachAudioBuffer() {
-  LOG(INFO) << __FUNCTION__;
-
-  _audioDeviceBuffer.SetId(_id);
-  _ptrAudioDevice->AttachAudioBuffer(&_audioDeviceBuffer);
-  return 0;
-}
-
-// ----------------------------------------------------------------------------
-//  ~AudioDeviceModuleImpl - dtor
-// ----------------------------------------------------------------------------
-
-AudioDeviceModuleImpl::~AudioDeviceModuleImpl() {
-  LOG(INFO) << __FUNCTION__;
-  if (_ptrAudioDevice) {
-    delete _ptrAudioDevice;
-    _ptrAudioDevice = NULL;
-  }
-}
-
-// ============================================================================
-//                                  Module
-// ============================================================================
-
-// ----------------------------------------------------------------------------
-//  Module::TimeUntilNextProcess
-//
-//  Returns the number of milliseconds until the module want a worker thread
-//  to call Process().
-// ----------------------------------------------------------------------------
-
-int64_t AudioDeviceModuleImpl::TimeUntilNextProcess() {
-  int64_t now = rtc::TimeMillis();
-  int64_t deltaProcess = kAdmMaxIdleTimeProcess - (now - _lastProcessTime);
-  return deltaProcess;
-}
-
-// ----------------------------------------------------------------------------
-//  Module::Process
-//
-//  Check for posted error and warning reports. Generate callbacks if
-//  new reports exists.
-// ----------------------------------------------------------------------------
-
-void AudioDeviceModuleImpl::Process() {
-  _lastProcessTime = rtc::TimeMillis();
-
-  // kPlayoutWarning
-  if (_ptrAudioDevice->PlayoutWarning()) {
-    rtc::CritScope lock(&_critSectEventCb);
-    if (_ptrCbAudioDeviceObserver) {
-      LOG(WARNING) << "=> OnWarningIsReported(kPlayoutWarning)";
-      _ptrCbAudioDeviceObserver->OnWarningIsReported(
-          AudioDeviceObserver::kPlayoutWarning);
-    }
-    _ptrAudioDevice->ClearPlayoutWarning();
-  }
-
-  // kPlayoutError
-  if (_ptrAudioDevice->PlayoutError()) {
-    rtc::CritScope lock(&_critSectEventCb);
-    if (_ptrCbAudioDeviceObserver) {
-      LOG(LERROR) << "=> OnErrorIsReported(kPlayoutError)";
-      _ptrCbAudioDeviceObserver->OnErrorIsReported(
-          AudioDeviceObserver::kPlayoutError);
-    }
-    _ptrAudioDevice->ClearPlayoutError();
-  }
-
-  // kRecordingWarning
-  if (_ptrAudioDevice->RecordingWarning()) {
-    rtc::CritScope lock(&_critSectEventCb);
-    if (_ptrCbAudioDeviceObserver) {
-      LOG(WARNING) << "=> OnWarningIsReported(kRecordingWarning)";
-      _ptrCbAudioDeviceObserver->OnWarningIsReported(
-          AudioDeviceObserver::kRecordingWarning);
-    }
-    _ptrAudioDevice->ClearRecordingWarning();
-  }
-
-  // kRecordingError
-  if (_ptrAudioDevice->RecordingError()) {
-    rtc::CritScope lock(&_critSectEventCb);
-    if (_ptrCbAudioDeviceObserver) {
-      LOG(LERROR) << "=> OnErrorIsReported(kRecordingError)";
-      _ptrCbAudioDeviceObserver->OnErrorIsReported(
-          AudioDeviceObserver::kRecordingError);
-    }
-    _ptrAudioDevice->ClearRecordingError();
-  }
-}
-
-// ============================================================================
-//                                    Public API
-// ============================================================================
-
-// ----------------------------------------------------------------------------
-//  ActiveAudioLayer
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceModuleImpl::ActiveAudioLayer(AudioLayer* audioLayer) const {
-  LOG(INFO) << __FUNCTION__;
-  AudioLayer activeAudio;
-  if (_ptrAudioDevice->ActiveAudioLayer(activeAudio) == -1) {
-    return -1;
-  }
-  *audioLayer = activeAudio;
-  return 0;
-}
-
-// ----------------------------------------------------------------------------
-//  LastError
-// ----------------------------------------------------------------------------
-
-AudioDeviceModule::ErrorCode AudioDeviceModuleImpl::LastError() const {
-  LOG(INFO) << __FUNCTION__;
-  return _lastError;
-}
-
-// ----------------------------------------------------------------------------
-//  Init
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceModuleImpl::Init() {
-  LOG(INFO) << __FUNCTION__;
-  if (_initialized)
-    return 0;
-  RTC_CHECK(_ptrAudioDevice);
-
-  AudioDeviceGeneric::InitStatus status = _ptrAudioDevice->Init();
-  RTC_HISTOGRAM_ENUMERATION(
-      "WebRTC.Audio.InitializationResult", static_cast<int>(status),
-      static_cast<int>(AudioDeviceGeneric::InitStatus::NUM_STATUSES));
-  if (status != AudioDeviceGeneric::InitStatus::OK) {
-    LOG(LS_ERROR) << "Audio device initialization failed.";
-    return -1;
-  }
-
-  _initialized = true;
-  return 0;
-}
-
-// ----------------------------------------------------------------------------
-//  Terminate
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceModuleImpl::Terminate() {
-  LOG(INFO) << __FUNCTION__;
-  if (!_initialized)
-    return 0;
-
-  if (_ptrAudioDevice->Terminate() == -1) {
-    return -1;
-  }
-
-  _initialized = false;
-  return 0;
-}
-
-// ----------------------------------------------------------------------------
-//  Initialized
-// ----------------------------------------------------------------------------
-
-bool AudioDeviceModuleImpl::Initialized() const {
-  LOG(INFO) << __FUNCTION__ << ": " << _initialized;
-  return (_initialized);
-}
-
-// ----------------------------------------------------------------------------
-//  InitSpeaker
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceModuleImpl::InitSpeaker() {
-  LOG(INFO) << __FUNCTION__;
-  CHECK_INITIALIZED();
-  return (_ptrAudioDevice->InitSpeaker());
-}
-
-// ----------------------------------------------------------------------------
-//  InitMicrophone
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceModuleImpl::InitMicrophone() {
-  LOG(INFO) << __FUNCTION__;
-  CHECK_INITIALIZED();
-  return (_ptrAudioDevice->InitMicrophone());
-}
-
-// ----------------------------------------------------------------------------
-//  SpeakerVolumeIsAvailable
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceModuleImpl::SpeakerVolumeIsAvailable(bool* available) {
-  LOG(INFO) << __FUNCTION__;
-  CHECK_INITIALIZED();
-
-  bool isAvailable(0);
-
-  if (_ptrAudioDevice->SpeakerVolumeIsAvailable(isAvailable) == -1) {
-    return -1;
-  }
-
-  *available = isAvailable;
-  LOG(INFO) << "output: " << isAvailable;
-  return (0);
-}
-
-// ----------------------------------------------------------------------------
-//  SetSpeakerVolume
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceModuleImpl::SetSpeakerVolume(uint32_t volume) {
-  LOG(INFO) << __FUNCTION__ << "(" << volume << ")";
-  CHECK_INITIALIZED();
-  return (_ptrAudioDevice->SetSpeakerVolume(volume));
-}
-
-// ----------------------------------------------------------------------------
-//  SpeakerVolume
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceModuleImpl::SpeakerVolume(uint32_t* volume) const {
-  LOG(INFO) << __FUNCTION__;
-  CHECK_INITIALIZED();
-
-  uint32_t level(0);
-
-  if (_ptrAudioDevice->SpeakerVolume(level) == -1) {
-    return -1;
-  }
-
-  *volume = level;
-  LOG(INFO) << "output: " << *volume;
-  return (0);
-}
-
-// ----------------------------------------------------------------------------
-//  SpeakerIsInitialized
-// ----------------------------------------------------------------------------
-
-bool AudioDeviceModuleImpl::SpeakerIsInitialized() const {
-  LOG(INFO) << __FUNCTION__;
-  CHECK_INITIALIZED_BOOL();
-
-  bool isInitialized = _ptrAudioDevice->SpeakerIsInitialized();
-  LOG(INFO) << "output: " << isInitialized;
-  return (isInitialized);
-}
-
-// ----------------------------------------------------------------------------
-//  MicrophoneIsInitialized
-// ----------------------------------------------------------------------------
-
-bool AudioDeviceModuleImpl::MicrophoneIsInitialized() const {
-  LOG(INFO) << __FUNCTION__;
-  CHECK_INITIALIZED_BOOL();
-
-  bool isInitialized = _ptrAudioDevice->MicrophoneIsInitialized();
-  LOG(INFO) << "output: " << isInitialized;
-  return (isInitialized);
-}
-
-// ----------------------------------------------------------------------------
-//  MaxSpeakerVolume
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceModuleImpl::MaxSpeakerVolume(uint32_t* maxVolume) const {
-  CHECK_INITIALIZED();
-
-  uint32_t maxVol(0);
-
-  if (_ptrAudioDevice->MaxSpeakerVolume(maxVol) == -1) {
-    return -1;
-  }
-
-  *maxVolume = maxVol;
-  return (0);
-}
-
-// ----------------------------------------------------------------------------
-//  MinSpeakerVolume
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceModuleImpl::MinSpeakerVolume(uint32_t* minVolume) const {
-  CHECK_INITIALIZED();
-
-  uint32_t minVol(0);
-
-  if (_ptrAudioDevice->MinSpeakerVolume(minVol) == -1) {
-    return -1;
-  }
-
-  *minVolume = minVol;
-  return (0);
-}
-
-// ----------------------------------------------------------------------------
-//  SpeakerMuteIsAvailable
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceModuleImpl::SpeakerMuteIsAvailable(bool* available) {
-  LOG(INFO) << __FUNCTION__;
-  CHECK_INITIALIZED();
-
-  bool isAvailable(0);
-
-  if (_ptrAudioDevice->SpeakerMuteIsAvailable(isAvailable) == -1) {
-    return -1;
-  }
-
-  *available = isAvailable;
-  LOG(INFO) << "output: " << isAvailable;
-  return (0);
-}
-
-// ----------------------------------------------------------------------------
-//  SetSpeakerMute
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceModuleImpl::SetSpeakerMute(bool enable) {
-  LOG(INFO) << __FUNCTION__ << "(" << enable << ")";
-  CHECK_INITIALIZED();
-  return (_ptrAudioDevice->SetSpeakerMute(enable));
-}
-
-// ----------------------------------------------------------------------------
-//  SpeakerMute
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceModuleImpl::SpeakerMute(bool* enabled) const {
-  LOG(INFO) << __FUNCTION__;
-  CHECK_INITIALIZED();
-
-  bool muted(false);
-
-  if (_ptrAudioDevice->SpeakerMute(muted) == -1) {
-    return -1;
-  }
-
-  *enabled = muted;
-  LOG(INFO) << "output: " << muted;
-  return (0);
-}
-
-// ----------------------------------------------------------------------------
-//  MicrophoneMuteIsAvailable
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceModuleImpl::MicrophoneMuteIsAvailable(bool* available) {
-  LOG(INFO) << __FUNCTION__;
-  CHECK_INITIALIZED();
-
-  bool isAvailable(0);
-
-  if (_ptrAudioDevice->MicrophoneMuteIsAvailable(isAvailable) == -1) {
-    return -1;
-  }
-
-  *available = isAvailable;
-  LOG(INFO) << "output: " << isAvailable;
-  return (0);
-}
-
-// ----------------------------------------------------------------------------
-//  SetMicrophoneMute
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceModuleImpl::SetMicrophoneMute(bool enable) {
-  LOG(INFO) << __FUNCTION__ << "(" << enable << ")";
-  CHECK_INITIALIZED();
-  return (_ptrAudioDevice->SetMicrophoneMute(enable));
-}
-
-// ----------------------------------------------------------------------------
-//  MicrophoneMute
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceModuleImpl::MicrophoneMute(bool* enabled) const {
-  LOG(INFO) << __FUNCTION__;
-  CHECK_INITIALIZED();
-
-  bool muted(false);
-
-  if (_ptrAudioDevice->MicrophoneMute(muted) == -1) {
-    return -1;
-  }
-
-  *enabled = muted;
-  LOG(INFO) << "output: " << muted;
-  return (0);
-}
-
-// ----------------------------------------------------------------------------
-//  MicrophoneVolumeIsAvailable
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceModuleImpl::MicrophoneVolumeIsAvailable(bool* available) {
-  LOG(INFO) << __FUNCTION__;
-  CHECK_INITIALIZED();
-
-  bool isAvailable(0);
-
-  if (_ptrAudioDevice->MicrophoneVolumeIsAvailable(isAvailable) == -1) {
-    return -1;
-  }
-
-  *available = isAvailable;
-  LOG(INFO) << "output: " << isAvailable;
-  return (0);
-}
-
-// ----------------------------------------------------------------------------
-//  SetMicrophoneVolume
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceModuleImpl::SetMicrophoneVolume(uint32_t volume) {
-  LOG(INFO) << __FUNCTION__ << "(" << volume << ")";
-  CHECK_INITIALIZED();
-  return (_ptrAudioDevice->SetMicrophoneVolume(volume));
-}
-
-// ----------------------------------------------------------------------------
-//  MicrophoneVolume
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceModuleImpl::MicrophoneVolume(uint32_t* volume) const {
-  LOG(INFO) << __FUNCTION__;
-  CHECK_INITIALIZED();
-
-  uint32_t level(0);
-
-  if (_ptrAudioDevice->MicrophoneVolume(level) == -1) {
-    return -1;
-  }
-
-  *volume = level;
-  LOG(INFO) << "output: " << *volume;
-  return (0);
-}
-
-// ----------------------------------------------------------------------------
-//  StereoRecordingIsAvailable
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceModuleImpl::StereoRecordingIsAvailable(
-    bool* available) const {
-  LOG(INFO) << __FUNCTION__;
-  CHECK_INITIALIZED();
-
-  bool isAvailable(0);
-
-  if (_ptrAudioDevice->StereoRecordingIsAvailable(isAvailable) == -1) {
-    return -1;
-  }
-
-  *available = isAvailable;
-  LOG(INFO) << "output: " << isAvailable;
-  return (0);
-}
-
-// ----------------------------------------------------------------------------
-//  SetStereoRecording
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceModuleImpl::SetStereoRecording(bool enable) {
-  LOG(INFO) << __FUNCTION__ << "(" << enable << ")";
-  CHECK_INITIALIZED();
-
-  if (_ptrAudioDevice->RecordingIsInitialized()) {
-    LOG(WARNING) << "recording in stereo is not supported";
-    return -1;
-  }
-
-  if (_ptrAudioDevice->SetStereoRecording(enable) == -1) {
-    LOG(WARNING) << "failed to change stereo recording";
-    return -1;
-  }
-
-  int8_t nChannels(1);
-  if (enable) {
-    nChannels = 2;
-  }
-  _audioDeviceBuffer.SetRecordingChannels(nChannels);
-
-  return 0;
-}
-
-// ----------------------------------------------------------------------------
-//  StereoRecording
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceModuleImpl::StereoRecording(bool* enabled) const {
-  LOG(INFO) << __FUNCTION__;
-  CHECK_INITIALIZED();
-
-  bool stereo(false);
-
-  if (_ptrAudioDevice->StereoRecording(stereo) == -1) {
-    return -1;
-  }
-
-  *enabled = stereo;
-  LOG(INFO) << "output: " << stereo;
-  return (0);
-}
-
-// ----------------------------------------------------------------------------
-//  SetRecordingChannel
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceModuleImpl::SetRecordingChannel(const ChannelType channel) {
-  if (channel == kChannelBoth) {
-    LOG(INFO) << __FUNCTION__ << "(both)";
-  } else if (channel == kChannelLeft) {
-    LOG(INFO) << __FUNCTION__ << "(left)";
-  } else {
-    LOG(INFO) << __FUNCTION__ << "(right)";
-  }
-  CHECK_INITIALIZED();
-
-  bool stereo(false);
-
-  if (_ptrAudioDevice->StereoRecording(stereo) == -1) {
-    LOG(WARNING) << "recording in stereo is not supported";
-    return -1;
-  }
-
-  return (_audioDeviceBuffer.SetRecordingChannel(channel));
-}
-
-// ----------------------------------------------------------------------------
-//  RecordingChannel
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceModuleImpl::RecordingChannel(ChannelType* channel) const {
-  LOG(INFO) << __FUNCTION__;
-  CHECK_INITIALIZED();
-
-  ChannelType chType;
-
-  if (_audioDeviceBuffer.RecordingChannel(chType) == -1) {
-    return -1;
-  }
-
-  *channel = chType;
-  if (*channel == kChannelBoth) {
-    LOG(INFO) << "output: both";
-  } else if (*channel == kChannelLeft) {
-    LOG(INFO) << "output: left";
-  } else {
-    LOG(INFO) << "output: right";
-  }
-  return (0);
-}
-
-// ----------------------------------------------------------------------------
-//  StereoPlayoutIsAvailable
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceModuleImpl::StereoPlayoutIsAvailable(bool* available) const {
-  LOG(INFO) << __FUNCTION__;
-  CHECK_INITIALIZED();
-
-  bool isAvailable(0);
-
-  if (_ptrAudioDevice->StereoPlayoutIsAvailable(isAvailable) == -1) {
-    return -1;
-  }
-
-  *available = isAvailable;
-  LOG(INFO) << "output: " << isAvailable;
-  return (0);
-}
-
-// ----------------------------------------------------------------------------
-//  SetStereoPlayout
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceModuleImpl::SetStereoPlayout(bool enable) {
-  LOG(INFO) << __FUNCTION__ << "(" << enable << ")";
-  CHECK_INITIALIZED();
-
-  if (_ptrAudioDevice->PlayoutIsInitialized()) {
-    LOG(LERROR)
-        << "unable to set stereo mode while playing side is initialized";
-    return -1;
-  }
-
-  if (_ptrAudioDevice->SetStereoPlayout(enable)) {
-    LOG(WARNING) << "stereo playout is not supported";
-    return -1;
-  }
-
-  int8_t nChannels(1);
-  if (enable) {
-    nChannels = 2;
-  }
-  _audioDeviceBuffer.SetPlayoutChannels(nChannels);
-
-  return 0;
-}
-
-// ----------------------------------------------------------------------------
-//  StereoPlayout
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceModuleImpl::StereoPlayout(bool* enabled) const {
-  LOG(INFO) << __FUNCTION__;
-  CHECK_INITIALIZED();
-
-  bool stereo(false);
-
-  if (_ptrAudioDevice->StereoPlayout(stereo) == -1) {
-    return -1;
-  }
-
-  *enabled = stereo;
-  LOG(INFO) << "output: " << stereo;
-  return (0);
-}
-
-// ----------------------------------------------------------------------------
-//  SetAGC
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceModuleImpl::SetAGC(bool enable) {
-  LOG(INFO) << __FUNCTION__ << "(" << enable << ")";
-  CHECK_INITIALIZED();
-  return (_ptrAudioDevice->SetAGC(enable));
-}
-
-// ----------------------------------------------------------------------------
-//  AGC
-// ----------------------------------------------------------------------------
-
-bool AudioDeviceModuleImpl::AGC() const {
-  LOG(INFO) << __FUNCTION__;
-  CHECK_INITIALIZED_BOOL();
-  return (_ptrAudioDevice->AGC());
-}
-
-// ----------------------------------------------------------------------------
-//  PlayoutIsAvailable
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceModuleImpl::PlayoutIsAvailable(bool* available) {
-  LOG(INFO) << __FUNCTION__;
-  CHECK_INITIALIZED();
-
-  bool isAvailable(0);
-
-  if (_ptrAudioDevice->PlayoutIsAvailable(isAvailable) == -1) {
-    return -1;
-  }
-
-  *available = isAvailable;
-  LOG(INFO) << "output: " << isAvailable;
-  return (0);
-}
-
-// ----------------------------------------------------------------------------
-//  RecordingIsAvailable
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceModuleImpl::RecordingIsAvailable(bool* available) {
-  LOG(INFO) << __FUNCTION__;
-  CHECK_INITIALIZED();
-
-  bool isAvailable(0);
-
-  if (_ptrAudioDevice->RecordingIsAvailable(isAvailable) == -1) {
-    return -1;
-  }
-
-  *available = isAvailable;
-  LOG(INFO) << "output: " << isAvailable;
-  return (0);
-}
-
-// ----------------------------------------------------------------------------
-//  MaxMicrophoneVolume
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceModuleImpl::MaxMicrophoneVolume(uint32_t* maxVolume) const {
-  CHECK_INITIALIZED();
-
-  uint32_t maxVol(0);
-
-  if (_ptrAudioDevice->MaxMicrophoneVolume(maxVol) == -1) {
-    return -1;
-  }
-
-  *maxVolume = maxVol;
-  return (0);
-}
-
-// ----------------------------------------------------------------------------
-//  MinMicrophoneVolume
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceModuleImpl::MinMicrophoneVolume(uint32_t* minVolume) const {
-  CHECK_INITIALIZED();
-
-  uint32_t minVol(0);
-
-  if (_ptrAudioDevice->MinMicrophoneVolume(minVol) == -1) {
-    return -1;
-  }
-
-  *minVolume = minVol;
-  return (0);
-}
-
-// ----------------------------------------------------------------------------
-//  PlayoutDevices
-// ----------------------------------------------------------------------------
-
-int16_t AudioDeviceModuleImpl::PlayoutDevices() {
-  LOG(INFO) << __FUNCTION__;
-  CHECK_INITIALIZED();
-
-  uint16_t nPlayoutDevices = _ptrAudioDevice->PlayoutDevices();
-  LOG(INFO) << "output: " << nPlayoutDevices;
-  return ((int16_t)(nPlayoutDevices));
-}
-
-// ----------------------------------------------------------------------------
-//  SetPlayoutDevice I (II)
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceModuleImpl::SetPlayoutDevice(uint16_t index) {
-  LOG(INFO) << __FUNCTION__ << "(" << index << ")";
-  CHECK_INITIALIZED();
-  return (_ptrAudioDevice->SetPlayoutDevice(index));
-}
-
-// ----------------------------------------------------------------------------
-//  SetPlayoutDevice II (II)
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceModuleImpl::SetPlayoutDevice(WindowsDeviceType device) {
-  LOG(INFO) << __FUNCTION__;
-  CHECK_INITIALIZED();
-
-  return (_ptrAudioDevice->SetPlayoutDevice(device));
-}
-
-// ----------------------------------------------------------------------------
-//  PlayoutDeviceName
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceModuleImpl::PlayoutDeviceName(
-    uint16_t index,
-    char name[kAdmMaxDeviceNameSize],
-    char guid[kAdmMaxGuidSize]) {
-  LOG(INFO) << __FUNCTION__ << "(" << index << ", ...)";
-  CHECK_INITIALIZED();
-
-  if (name == NULL) {
-    _lastError = kAdmErrArgument;
-    return -1;
-  }
-
-  if (_ptrAudioDevice->PlayoutDeviceName(index, name, guid) == -1) {
-    return -1;
-  }
-
-  if (name != NULL) {
-    LOG(INFO) << "output: name = " << name;
-  }
-  if (guid != NULL) {
-    LOG(INFO) << "output: guid = " << guid;
-  }
-
-  return (0);
-}
-
-// ----------------------------------------------------------------------------
-//  RecordingDeviceName
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceModuleImpl::RecordingDeviceName(
-    uint16_t index,
-    char name[kAdmMaxDeviceNameSize],
-    char guid[kAdmMaxGuidSize]) {
-  LOG(INFO) << __FUNCTION__ << "(" << index << ", ...)";
-  CHECK_INITIALIZED();
-
-  if (name == NULL) {
-    _lastError = kAdmErrArgument;
-    return -1;
-  }
-
-  if (_ptrAudioDevice->RecordingDeviceName(index, name, guid) == -1) {
-    return -1;
-  }
-
-  if (name != NULL) {
-    LOG(INFO) << "output: name = " << name;
-  }
-  if (guid != NULL) {
-    LOG(INFO) << "output: guid = " << guid;
-  }
-
-  return (0);
-}
-
-// ----------------------------------------------------------------------------
-//  RecordingDevices
-// ----------------------------------------------------------------------------
-
-int16_t AudioDeviceModuleImpl::RecordingDevices() {
-  LOG(INFO) << __FUNCTION__;
-  CHECK_INITIALIZED();
-
-  uint16_t nRecordingDevices = _ptrAudioDevice->RecordingDevices();
-
-  LOG(INFO) << "output: " << nRecordingDevices;
-  return ((int16_t)nRecordingDevices);
-}
-
-// ----------------------------------------------------------------------------
-//  SetRecordingDevice I (II)
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceModuleImpl::SetRecordingDevice(uint16_t index) {
-  LOG(INFO) << __FUNCTION__ << "(" << index << ")";
-  CHECK_INITIALIZED();
-  return (_ptrAudioDevice->SetRecordingDevice(index));
-}
-
-// ----------------------------------------------------------------------------
-//  SetRecordingDevice II (II)
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceModuleImpl::SetRecordingDevice(WindowsDeviceType device) {
-  LOG(INFO) << __FUNCTION__;
-  CHECK_INITIALIZED();
-
-  return (_ptrAudioDevice->SetRecordingDevice(device));
-}
-
-// ----------------------------------------------------------------------------
-//  InitPlayout
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceModuleImpl::InitPlayout() {
-  LOG(INFO) << __FUNCTION__;
-  CHECK_INITIALIZED();
-  if (PlayoutIsInitialized()) {
-    return 0;
-  }
-  int32_t result = _ptrAudioDevice->InitPlayout();
-  LOG(INFO) << "output: " << result;
-  RTC_HISTOGRAM_BOOLEAN("WebRTC.Audio.InitPlayoutSuccess",
-                        static_cast<int>(result == 0));
-  return result;
-}
-
-// ----------------------------------------------------------------------------
-//  InitRecording
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceModuleImpl::InitRecording() {
-  LOG(INFO) << __FUNCTION__;
-  CHECK_INITIALIZED();
-  if (RecordingIsInitialized()) {
-    return 0;
-  }
-  int32_t result = _ptrAudioDevice->InitRecording();
-  LOG(INFO) << "output: " << result;
-  RTC_HISTOGRAM_BOOLEAN("WebRTC.Audio.InitRecordingSuccess",
-                        static_cast<int>(result == 0));
-  return result;
-}
-
-// ----------------------------------------------------------------------------
-//  PlayoutIsInitialized
-// ----------------------------------------------------------------------------
-
-bool AudioDeviceModuleImpl::PlayoutIsInitialized() const {
-  LOG(INFO) << __FUNCTION__;
-  CHECK_INITIALIZED_BOOL();
-  return (_ptrAudioDevice->PlayoutIsInitialized());
-}
-
-// ----------------------------------------------------------------------------
-//  RecordingIsInitialized
-// ----------------------------------------------------------------------------
-
-bool AudioDeviceModuleImpl::RecordingIsInitialized() const {
-  LOG(INFO) << __FUNCTION__;
-  CHECK_INITIALIZED_BOOL();
-  return (_ptrAudioDevice->RecordingIsInitialized());
-}
-
-// ----------------------------------------------------------------------------
-//  StartPlayout
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceModuleImpl::StartPlayout() {
-  LOG(INFO) << __FUNCTION__;
-  CHECK_INITIALIZED();
-  if (Playing()) {
-    return 0;
-  }
-  _audioDeviceBuffer.StartPlayout();
-  int32_t result = _ptrAudioDevice->StartPlayout();
-  LOG(INFO) << "output: " << result;
-  RTC_HISTOGRAM_BOOLEAN("WebRTC.Audio.StartPlayoutSuccess",
-                        static_cast<int>(result == 0));
-  return result;
-}
-
-// ----------------------------------------------------------------------------
-//  StopPlayout
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceModuleImpl::StopPlayout() {
-  LOG(INFO) << __FUNCTION__;
-  CHECK_INITIALIZED();
-  int32_t result = _ptrAudioDevice->StopPlayout();
-  _audioDeviceBuffer.StopPlayout();
-  LOG(INFO) << "output: " << result;
-  RTC_HISTOGRAM_BOOLEAN("WebRTC.Audio.StopPlayoutSuccess",
-                        static_cast<int>(result == 0));
-  return result;
-}
-
-// ----------------------------------------------------------------------------
-//  Playing
-// ----------------------------------------------------------------------------
-
-bool AudioDeviceModuleImpl::Playing() const {
-  LOG(INFO) << __FUNCTION__;
-  CHECK_INITIALIZED_BOOL();
-  return (_ptrAudioDevice->Playing());
-}
-
-// ----------------------------------------------------------------------------
-//  StartRecording
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceModuleImpl::StartRecording() {
-  LOG(INFO) << __FUNCTION__;
-  CHECK_INITIALIZED();
-  if (Recording()) {
-    return 0;
-  }
-  _audioDeviceBuffer.StartRecording();
-  int32_t result = _ptrAudioDevice->StartRecording();
-  LOG(INFO) << "output: " << result;
-  RTC_HISTOGRAM_BOOLEAN("WebRTC.Audio.StartRecordingSuccess",
-                        static_cast<int>(result == 0));
-  return result;
-}
-// ----------------------------------------------------------------------------
-//  StopRecording
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceModuleImpl::StopRecording() {
-  LOG(INFO) << __FUNCTION__;
-  CHECK_INITIALIZED();
-  int32_t result = _ptrAudioDevice->StopRecording();
-  _audioDeviceBuffer.StopRecording();
-  LOG(INFO) << "output: " << result;
-  RTC_HISTOGRAM_BOOLEAN("WebRTC.Audio.StopRecordingSuccess",
-                        static_cast<int>(result == 0));
-  return result;
-}
-
-// ----------------------------------------------------------------------------
-//  Recording
-// ----------------------------------------------------------------------------
-
-bool AudioDeviceModuleImpl::Recording() const {
-  LOG(INFO) << __FUNCTION__;
-  CHECK_INITIALIZED_BOOL();
-  return (_ptrAudioDevice->Recording());
-}
-
-// ----------------------------------------------------------------------------
-//  RegisterEventObserver
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceModuleImpl::RegisterEventObserver(
-    AudioDeviceObserver* eventCallback) {
-  LOG(INFO) << __FUNCTION__;
-  rtc::CritScope lock(&_critSectEventCb);
-  _ptrCbAudioDeviceObserver = eventCallback;
-
-  return 0;
-}
-
-// ----------------------------------------------------------------------------
-//  RegisterAudioCallback
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceModuleImpl::RegisterAudioCallback(
-    AudioTransport* audioCallback) {
-  LOG(INFO) << __FUNCTION__;
-  rtc::CritScope lock(&_critSectAudioCb);
-  return _audioDeviceBuffer.RegisterAudioCallback(audioCallback);
-}
-
-// ----------------------------------------------------------------------------
-//  PlayoutDelay
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceModuleImpl::PlayoutDelay(uint16_t* delayMS) const {
-  CHECK_INITIALIZED();
-
-  uint16_t delay(0);
-
-  if (_ptrAudioDevice->PlayoutDelay(delay) == -1) {
-    LOG(LERROR) << "failed to retrieve the playout delay";
-    return -1;
-  }
-
-  *delayMS = delay;
-  return (0);
-}
-
-// ----------------------------------------------------------------------------
-//  RecordingDelay
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceModuleImpl::RecordingDelay(uint16_t* delayMS) const {
-  LOG(INFO) << __FUNCTION__;
-  CHECK_INITIALIZED();
-
-  uint16_t delay(0);
-
-  if (_ptrAudioDevice->RecordingDelay(delay) == -1) {
-    LOG(LERROR) << "failed to retrieve the recording delay";
-    return -1;
-  }
-
-  *delayMS = delay;
-  LOG(INFO) << "output: " << *delayMS;
-  return (0);
-}
-
-// ----------------------------------------------------------------------------
-//  SetRecordingSampleRate
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceModuleImpl::SetRecordingSampleRate(
-    const uint32_t samplesPerSec) {
-  LOG(INFO) << __FUNCTION__ << "(" << samplesPerSec << ")";
-  CHECK_INITIALIZED();
-
-  if (_ptrAudioDevice->SetRecordingSampleRate(samplesPerSec) != 0) {
-    return -1;
-  }
-
-  return (0);
-}
-
-// ----------------------------------------------------------------------------
-//  RecordingSampleRate
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceModuleImpl::RecordingSampleRate(
-    uint32_t* samplesPerSec) const {
-  LOG(INFO) << __FUNCTION__;
-  CHECK_INITIALIZED();
-
-  int32_t sampleRate = _audioDeviceBuffer.RecordingSampleRate();
-
-  if (sampleRate == -1) {
-    LOG(LERROR) << "failed to retrieve the sample rate";
-    return -1;
-  }
-
-  *samplesPerSec = sampleRate;
-  LOG(INFO) << "output: " << *samplesPerSec;
-  return (0);
-}
-
-// ----------------------------------------------------------------------------
-//  SetPlayoutSampleRate
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceModuleImpl::SetPlayoutSampleRate(
-    const uint32_t samplesPerSec) {
-  LOG(INFO) << __FUNCTION__ << "(" << samplesPerSec << ")";
-  CHECK_INITIALIZED();
-
-  if (_ptrAudioDevice->SetPlayoutSampleRate(samplesPerSec) != 0) {
-    return -1;
-  }
-
-  return (0);
-}
-
-// ----------------------------------------------------------------------------
-//  PlayoutSampleRate
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceModuleImpl::PlayoutSampleRate(
-    uint32_t* samplesPerSec) const {
-  LOG(INFO) << __FUNCTION__;
-  CHECK_INITIALIZED();
-
-  int32_t sampleRate = _audioDeviceBuffer.PlayoutSampleRate();
-
-  if (sampleRate == -1) {
-    LOG(LERROR) << "failed to retrieve the sample rate";
-    return -1;
-  }
-
-  *samplesPerSec = sampleRate;
-  LOG(INFO) << "output: " << *samplesPerSec;
-  return (0);
-}
-
-// ----------------------------------------------------------------------------
-//  SetLoudspeakerStatus
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceModuleImpl::SetLoudspeakerStatus(bool enable) {
-  LOG(INFO) << __FUNCTION__ << "(" << enable << ")";
-  CHECK_INITIALIZED();
-
-  if (_ptrAudioDevice->SetLoudspeakerStatus(enable) != 0) {
-    return -1;
-  }
-
-  return 0;
-}
-
-// ----------------------------------------------------------------------------
-//  GetLoudspeakerStatus
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceModuleImpl::GetLoudspeakerStatus(bool* enabled) const {
-  LOG(INFO) << __FUNCTION__;
-  CHECK_INITIALIZED();
-  int32_t ok = 0;
-  if (_ptrAudioDevice->GetLoudspeakerStatus(*enabled) != 0) {
-    ok = -1;
-  }
-  LOG(INFO) << "output: " << ok;
-  return ok;
-}
-
-bool AudioDeviceModuleImpl::BuiltInAECIsAvailable() const {
-  LOG(INFO) << __FUNCTION__;
-  CHECK_INITIALIZED_BOOL();
-  bool isAvailable = _ptrAudioDevice->BuiltInAECIsAvailable();
-  LOG(INFO) << "output: " << isAvailable;
-  return isAvailable;
-}
-
-int32_t AudioDeviceModuleImpl::EnableBuiltInAEC(bool enable) {
-  LOG(INFO) << __FUNCTION__ << "(" << enable << ")";
-  CHECK_INITIALIZED();
-  int32_t ok = _ptrAudioDevice->EnableBuiltInAEC(enable);
-  LOG(INFO) << "output: " << ok;
-  return ok;
-}
-
-bool AudioDeviceModuleImpl::BuiltInAGCIsAvailable() const {
-  LOG(INFO) << __FUNCTION__;
-  CHECK_INITIALIZED_BOOL();
-  bool isAvailable = _ptrAudioDevice->BuiltInAGCIsAvailable();
-  LOG(INFO) << "output: " << isAvailable;
-  return isAvailable;
-}
-
-int32_t AudioDeviceModuleImpl::EnableBuiltInAGC(bool enable) {
-  LOG(INFO) << __FUNCTION__ << "(" << enable << ")";
-  CHECK_INITIALIZED();
-  int32_t ok = _ptrAudioDevice->EnableBuiltInAGC(enable);
-  LOG(INFO) << "output: " << ok;
-  return ok;
-}
-
-bool AudioDeviceModuleImpl::BuiltInNSIsAvailable() const {
-  LOG(INFO) << __FUNCTION__;
-  CHECK_INITIALIZED_BOOL();
-  bool isAvailable = _ptrAudioDevice->BuiltInNSIsAvailable();
-  LOG(INFO) << "output: " << isAvailable;
-  return isAvailable;
-}
-
-int32_t AudioDeviceModuleImpl::EnableBuiltInNS(bool enable) {
-  LOG(INFO) << __FUNCTION__ << "(" << enable << ")";
-  CHECK_INITIALIZED();
-  int32_t ok = _ptrAudioDevice->EnableBuiltInNS(enable);
-  LOG(INFO) << "output: " << ok;
-  return ok;
-}
-
-#if defined(WEBRTC_IOS)
-int AudioDeviceModuleImpl::GetPlayoutAudioParameters(
-    AudioParameters* params) const {
-  LOG(INFO) << __FUNCTION__;
-  int r = _ptrAudioDevice->GetPlayoutAudioParameters(params);
-  LOG(INFO) << "output: " << r;
-  return r;
-}
-
-int AudioDeviceModuleImpl::GetRecordAudioParameters(
-    AudioParameters* params) const {
-  LOG(INFO) << __FUNCTION__;
-  int r = _ptrAudioDevice->GetRecordAudioParameters(params);
-  LOG(INFO) << "output: " << r;
-  return r;
-}
-#endif  // WEBRTC_IOS
-
-// ============================================================================
-//                                 Private Methods
-// ============================================================================
-
-// ----------------------------------------------------------------------------
-//  Platform
-// ----------------------------------------------------------------------------
-
-AudioDeviceModuleImpl::PlatformType AudioDeviceModuleImpl::Platform() const {
-  LOG(INFO) << __FUNCTION__;
-  return _platformType;
-}
-
-// ----------------------------------------------------------------------------
-//  PlatformAudioLayer
-// ----------------------------------------------------------------------------
-
-AudioDeviceModule::AudioLayer AudioDeviceModuleImpl::PlatformAudioLayer()
-    const {
-  LOG(INFO) << __FUNCTION__;
-  return _platformAudioLayer;
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_device/audio_device_impl.h b/modules/audio_device/audio_device_impl.h
deleted file mode 100644
index 69e32d4..0000000
--- a/modules/audio_device/audio_device_impl.h
+++ /dev/null
@@ -1,204 +0,0 @@
-/*
- *  Copyright (c) 2012 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_AUDIO_DEVICE_AUDIO_DEVICE_IMPL_H
-#define WEBRTC_AUDIO_DEVICE_AUDIO_DEVICE_IMPL_H
-
-#if defined(WEBRTC_INCLUDE_INTERNAL_AUDIO_DEVICE)
-
-#include <memory>
-
-#include "webrtc/modules/audio_device/audio_device_buffer.h"
-#include "webrtc/modules/audio_device/include/audio_device.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/criticalsection.h"
-
-namespace webrtc {
-
-class AudioDeviceGeneric;
-class AudioManager;
-
-class AudioDeviceModuleImpl : public AudioDeviceModule {
- public:
-  enum PlatformType {
-    kPlatformNotSupported = 0,
-    kPlatformWin32 = 1,
-    kPlatformWinCe = 2,
-    kPlatformLinux = 3,
-    kPlatformMac = 4,
-    kPlatformAndroid = 5,
-    kPlatformIOS = 6
-  };
-
-  int32_t CheckPlatform();
-  int32_t CreatePlatformSpecificObjects();
-  int32_t AttachAudioBuffer();
-
-  AudioDeviceModuleImpl(const int32_t id, const AudioLayer audioLayer);
-  ~AudioDeviceModuleImpl() override;
-
-  int64_t TimeUntilNextProcess() override;
-  void Process() override;
-
-  // Retrieve the currently utilized audio layer
-  int32_t ActiveAudioLayer(AudioLayer* audioLayer) const override;
-
-  // Error handling
-  ErrorCode LastError() const override;
-  int32_t RegisterEventObserver(AudioDeviceObserver* eventCallback) override;
-
-  // Full-duplex transportation of PCM audio
-  int32_t RegisterAudioCallback(AudioTransport* audioCallback) override;
-
-  // Main initializaton and termination
-  int32_t Init() override;
-  int32_t Terminate() override;
-  bool Initialized() const override;
-
-  // Device enumeration
-  int16_t PlayoutDevices() override;
-  int16_t RecordingDevices() override;
-  int32_t PlayoutDeviceName(uint16_t index,
-                            char name[kAdmMaxDeviceNameSize],
-                            char guid[kAdmMaxGuidSize]) override;
-  int32_t RecordingDeviceName(uint16_t index,
-                              char name[kAdmMaxDeviceNameSize],
-                              char guid[kAdmMaxGuidSize]) override;
-
-  // Device selection
-  int32_t SetPlayoutDevice(uint16_t index) override;
-  int32_t SetPlayoutDevice(WindowsDeviceType device) override;
-  int32_t SetRecordingDevice(uint16_t index) override;
-  int32_t SetRecordingDevice(WindowsDeviceType device) override;
-
-  // Audio transport initialization
-  int32_t PlayoutIsAvailable(bool* available) override;
-  int32_t InitPlayout() override;
-  bool PlayoutIsInitialized() const override;
-  int32_t RecordingIsAvailable(bool* available) override;
-  int32_t InitRecording() override;
-  bool RecordingIsInitialized() const override;
-
-  // Audio transport control
-  int32_t StartPlayout() override;
-  int32_t StopPlayout() override;
-  bool Playing() const override;
-  int32_t StartRecording() override;
-  int32_t StopRecording() override;
-  bool Recording() const override;
-
-  // Microphone Automatic Gain Control (AGC)
-  int32_t SetAGC(bool enable) override;
-  bool AGC() const override;
-
-  // Audio mixer initialization
-  int32_t InitSpeaker() override;
-  bool SpeakerIsInitialized() const override;
-  int32_t InitMicrophone() override;
-  bool MicrophoneIsInitialized() const override;
-
-  // Speaker volume controls
-  int32_t SpeakerVolumeIsAvailable(bool* available) override;
-  int32_t SetSpeakerVolume(uint32_t volume) override;
-  int32_t SpeakerVolume(uint32_t* volume) const override;
-  int32_t MaxSpeakerVolume(uint32_t* maxVolume) const override;
-  int32_t MinSpeakerVolume(uint32_t* minVolume) const override;
-
-  // Microphone volume controls
-  int32_t MicrophoneVolumeIsAvailable(bool* available) override;
-  int32_t SetMicrophoneVolume(uint32_t volume) override;
-  int32_t MicrophoneVolume(uint32_t* volume) const override;
-  int32_t MaxMicrophoneVolume(uint32_t* maxVolume) const override;
-  int32_t MinMicrophoneVolume(uint32_t* minVolume) const override;
-
-  // Speaker mute control
-  int32_t SpeakerMuteIsAvailable(bool* available) override;
-  int32_t SetSpeakerMute(bool enable) override;
-  int32_t SpeakerMute(bool* enabled) const override;
-
-  // Microphone mute control
-  int32_t MicrophoneMuteIsAvailable(bool* available) override;
-  int32_t SetMicrophoneMute(bool enable) override;
-  int32_t MicrophoneMute(bool* enabled) const override;
-
-  // Stereo support
-  int32_t StereoPlayoutIsAvailable(bool* available) const override;
-  int32_t SetStereoPlayout(bool enable) override;
-  int32_t StereoPlayout(bool* enabled) const override;
-  int32_t StereoRecordingIsAvailable(bool* available) const override;
-  int32_t SetStereoRecording(bool enable) override;
-  int32_t StereoRecording(bool* enabled) const override;
-  int32_t SetRecordingChannel(const ChannelType channel) override;
-  int32_t RecordingChannel(ChannelType* channel) const override;
-
-  // Delay information and control
-  int32_t PlayoutDelay(uint16_t* delayMS) const override;
-  int32_t RecordingDelay(uint16_t* delayMS) const override;
-
-  // Native sample rate controls (samples/sec)
-  int32_t SetRecordingSampleRate(const uint32_t samplesPerSec) override;
-  int32_t RecordingSampleRate(uint32_t* samplesPerSec) const override;
-  int32_t SetPlayoutSampleRate(const uint32_t samplesPerSec) override;
-  int32_t PlayoutSampleRate(uint32_t* samplesPerSec) const override;
-
-  // Mobile device specific functions
-  int32_t SetLoudspeakerStatus(bool enable) override;
-  int32_t GetLoudspeakerStatus(bool* enabled) const override;
-
-  bool BuiltInAECIsAvailable() const override;
-  int32_t EnableBuiltInAEC(bool enable) override;
-  bool BuiltInAGCIsAvailable() const override;
-  int32_t EnableBuiltInAGC(bool enable) override;
-  bool BuiltInNSIsAvailable() const override;
-  int32_t EnableBuiltInNS(bool enable) override;
-
-#if defined(WEBRTC_IOS)
-  int GetPlayoutAudioParameters(AudioParameters* params) const override;
-  int GetRecordAudioParameters(AudioParameters* params) const override;
-#endif  // WEBRTC_IOS
-
-  int32_t Id() { return _id; }
-#if defined(WEBRTC_ANDROID)
-  // Only use this acccessor for test purposes on Android.
-  AudioManager* GetAndroidAudioManagerForTest() {
-    return _audioManagerAndroid.get();
-  }
-#endif
-  AudioDeviceBuffer* GetAudioDeviceBuffer() { return &_audioDeviceBuffer; }
-
- private:
-  PlatformType Platform() const;
-  AudioLayer PlatformAudioLayer() const;
-
-  rtc::CriticalSection _critSect;
-  rtc::CriticalSection _critSectEventCb;
-  rtc::CriticalSection _critSectAudioCb;
-
-  AudioDeviceObserver* _ptrCbAudioDeviceObserver;
-
-  AudioDeviceGeneric* _ptrAudioDevice;
-
-  AudioDeviceBuffer _audioDeviceBuffer;
-#if defined(WEBRTC_ANDROID)
-  std::unique_ptr<AudioManager> _audioManagerAndroid;
-#endif
-  int32_t _id;
-  AudioLayer _platformAudioLayer;
-  int64_t _lastProcessTime;
-  PlatformType _platformType;
-  bool _initialized;
-  mutable ErrorCode _lastError;
-};
-
-}  // namespace webrtc
-
-#endif  // defined(WEBRTC_INCLUDE_INTERNAL_AUDIO_DEVICE)
-
-#endif  // WEBRTC_MODULES_INTERFACE_AUDIO_DEVICE_IMPL_H_
diff --git a/modules/audio_device/audio_device_unittest.cc b/modules/audio_device/audio_device_unittest.cc
deleted file mode 100644
index 24db9ae..0000000
--- a/modules/audio_device/audio_device_unittest.cc
+++ /dev/null
@@ -1,699 +0,0 @@
-/*
- *  Copyright (c) 2017 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 <algorithm>
-#include <cstring>
-#include <numeric>
-
-#include "webrtc/api/array_view.h"
-#include "webrtc/api/optional.h"
-#include "webrtc/modules/audio_device/audio_device_impl.h"
-#include "webrtc/modules/audio_device/include/audio_device.h"
-#include "webrtc/modules/audio_device/include/mock_audio_transport.h"
-#include "webrtc/rtc_base/buffer.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/event.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/race_checker.h"
-#include "webrtc/rtc_base/safe_conversions.h"
-#include "webrtc/rtc_base/scoped_ref_ptr.h"
-#include "webrtc/rtc_base/thread_annotations.h"
-#include "webrtc/rtc_base/thread_checker.h"
-#include "webrtc/rtc_base/timeutils.h"
-#include "webrtc/test/gmock.h"
-#include "webrtc/test/gtest.h"
-
-using ::testing::_;
-using ::testing::AtLeast;
-using ::testing::Ge;
-using ::testing::Invoke;
-using ::testing::NiceMock;
-using ::testing::NotNull;
-
-namespace webrtc {
-namespace {
-
-// #define ENABLE_DEBUG_PRINTF
-#ifdef ENABLE_DEBUG_PRINTF
-#define PRINTD(...) fprintf(stderr, __VA_ARGS__);
-#else
-#define PRINTD(...) ((void)0)
-#endif
-#define PRINT(...) fprintf(stderr, __VA_ARGS__);
-
-// Don't run these tests in combination with sanitizers.
-#if !defined(ADDRESS_SANITIZER) && !defined(MEMORY_SANITIZER)
-#define SKIP_TEST_IF_NOT(requirements_satisfied) \
-  do {                                           \
-    if (!requirements_satisfied) {               \
-      return;                                    \
-    }                                            \
-  } while (false)
-#else
-// Or if other audio-related requirements are not met.
-#define SKIP_TEST_IF_NOT(requirements_satisfied) \
-  do {                                           \
-    return;                                      \
-  } while (false)
-#endif
-
-// Number of callbacks (input or output) the tests waits for before we set
-// an event indicating that the test was OK.
-static constexpr size_t kNumCallbacks = 10;
-// Max amount of time we wait for an event to be set while counting callbacks.
-static constexpr size_t kTestTimeOutInMilliseconds = 10 * 1000;
-// Average number of audio callbacks per second assuming 10ms packet size.
-static constexpr size_t kNumCallbacksPerSecond = 100;
-// Run the full-duplex test during this time (unit is in seconds).
-static constexpr size_t kFullDuplexTimeInSec = 5;
-// Length of round-trip latency measurements. Number of deteced impulses
-// shall be kImpulseFrequencyInHz * kMeasureLatencyTimeInSec - 1 since the
-// last transmitted pulse is not used.
-static constexpr size_t kMeasureLatencyTimeInSec = 10;
-// Sets the number of impulses per second in the latency test.
-static constexpr size_t kImpulseFrequencyInHz = 1;
-// Utilized in round-trip latency measurements to avoid capturing noise samples.
-static constexpr int kImpulseThreshold = 1000;
-
-enum class TransportType {
-  kInvalid,
-  kPlay,
-  kRecord,
-  kPlayAndRecord,
-};
-
-// Interface for processing the audio stream. Real implementations can e.g.
-// run audio in loopback, read audio from a file or perform latency
-// measurements.
-class AudioStream {
- public:
-  virtual void Write(rtc::ArrayView<const int16_t> source, size_t channels) = 0;
-  virtual void Read(rtc::ArrayView<int16_t> destination, size_t channels) = 0;
-
-  virtual ~AudioStream() = default;
-};
-
-// Converts index corresponding to position within a 10ms buffer into a
-// delay value in milliseconds.
-// Example: index=240, frames_per_10ms_buffer=480 => 5ms as output.
-int IndexToMilliseconds(size_t index, size_t frames_per_10ms_buffer) {
-  return rtc::checked_cast<int>(
-      10.0 * (static_cast<double>(index) / frames_per_10ms_buffer) + 0.5);
-}
-
-}  // namespace
-
-// Simple first in first out (FIFO) class that wraps a list of 16-bit audio
-// buffers of fixed size and allows Write and Read operations. The idea is to
-// store recorded audio buffers (using Write) and then read (using Read) these
-// stored buffers with as short delay as possible when the audio layer needs
-// data to play out. The number of buffers in the FIFO will stabilize under
-// normal conditions since there will be a balance between Write and Read calls.
-// The container is a std::list container and access is protected with a lock
-// since both sides (playout and recording) are driven by its own thread.
-// Note that, we know by design that the size of the audio buffer will not
-// change over time and that both sides will use the same size.
-class FifoAudioStream : public AudioStream {
- public:
-  void Write(rtc::ArrayView<const int16_t> source, size_t channels) override {
-    EXPECT_EQ(channels, 1u);
-    RTC_DCHECK_RUNS_SERIALIZED(&race_checker_);
-    const size_t size = [&] {
-      rtc::CritScope lock(&lock_);
-      fifo_.push_back(Buffer16(source.data(), source.size()));
-      return fifo_.size();
-    }();
-    if (size > max_size_) {
-      max_size_ = size;
-    }
-    // Add marker once per second to signal that audio is active.
-    if (write_count_++ % 100 == 0) {
-      PRINT(".");
-    }
-    written_elements_ += size;
-  }
-
-  void Read(rtc::ArrayView<int16_t> destination, size_t channels) override {
-    EXPECT_EQ(channels, 1u);
-    rtc::CritScope lock(&lock_);
-    if (fifo_.empty()) {
-      std::fill(destination.begin(), destination.end(), 0);
-    } else {
-      const Buffer16& buffer = fifo_.front();
-      RTC_CHECK_EQ(buffer.size(), destination.size());
-      std::copy(buffer.begin(), buffer.end(), destination.begin());
-      fifo_.pop_front();
-    }
-  }
-
-  size_t size() const {
-    rtc::CritScope lock(&lock_);
-    return fifo_.size();
-  }
-
-  size_t max_size() const {
-    RTC_DCHECK_RUNS_SERIALIZED(&race_checker_);
-    return max_size_;
-  }
-
-  size_t average_size() const {
-    RTC_DCHECK_RUNS_SERIALIZED(&race_checker_);
-    return 0.5 + static_cast<float>(written_elements_ / write_count_);
-  }
-
-  using Buffer16 = rtc::BufferT<int16_t>;
-
-  rtc::CriticalSection lock_;
-  rtc::RaceChecker race_checker_;
-
-  std::list<Buffer16> fifo_ RTC_GUARDED_BY(lock_);
-  size_t write_count_ RTC_GUARDED_BY(race_checker_) = 0;
-  size_t max_size_ RTC_GUARDED_BY(race_checker_) = 0;
-  size_t written_elements_ RTC_GUARDED_BY(race_checker_) = 0;
-};
-
-// Inserts periodic impulses and measures the latency between the time of
-// transmission and time of receiving the same impulse.
-class LatencyAudioStream : public AudioStream {
- public:
-  LatencyAudioStream() {
-    // Delay thread checkers from being initialized until first callback from
-    // respective thread.
-    read_thread_checker_.DetachFromThread();
-    write_thread_checker_.DetachFromThread();
-  }
-
-  // Insert periodic impulses in first two samples of |destination|.
-  void Read(rtc::ArrayView<int16_t> destination, size_t channels) override {
-    RTC_DCHECK_RUN_ON(&read_thread_checker_);
-    EXPECT_EQ(channels, 1u);
-    if (read_count_ == 0) {
-      PRINT("[");
-    }
-    read_count_++;
-    std::fill(destination.begin(), destination.end(), 0);
-    if (read_count_ % (kNumCallbacksPerSecond / kImpulseFrequencyInHz) == 0) {
-      PRINT(".");
-      {
-        rtc::CritScope lock(&lock_);
-        if (!pulse_time_) {
-          pulse_time_ = rtc::Optional<int64_t>(rtc::TimeMillis());
-        }
-      }
-      constexpr int16_t impulse = std::numeric_limits<int16_t>::max();
-      std::fill_n(destination.begin(), 2, impulse);
-    }
-  }
-
-  // Detect received impulses in |source|, derive time between transmission and
-  // detection and add the calculated delay to list of latencies.
-  void Write(rtc::ArrayView<const int16_t> source, size_t channels) override {
-    EXPECT_EQ(channels, 1u);
-    RTC_DCHECK_RUN_ON(&write_thread_checker_);
-    RTC_DCHECK_RUNS_SERIALIZED(&race_checker_);
-    rtc::CritScope lock(&lock_);
-    write_count_++;
-    if (!pulse_time_) {
-      // Avoid detection of new impulse response until a new impulse has
-      // been transmitted (sets |pulse_time_| to value larger than zero).
-      return;
-    }
-    // Find index (element position in vector) of the max element.
-    const size_t index_of_max =
-        std::max_element(source.begin(), source.end()) - source.begin();
-    // Derive time between transmitted pulse and received pulse if the level
-    // is high enough (removes noise).
-    const size_t max = source[index_of_max];
-    if (max > kImpulseThreshold) {
-      PRINTD("(%zu, %zu)", max, index_of_max);
-      int64_t now_time = rtc::TimeMillis();
-      int extra_delay = IndexToMilliseconds(index_of_max, source.size());
-      PRINTD("[%d]", rtc::checked_cast<int>(now_time - pulse_time_));
-      PRINTD("[%d]", extra_delay);
-      // Total latency is the difference between transmit time and detection
-      // tome plus the extra delay within the buffer in which we detected the
-      // received impulse. It is transmitted at sample 0 but can be received
-      // at sample N where N > 0. The term |extra_delay| accounts for N and it
-      // is a value between 0 and 10ms.
-      latencies_.push_back(now_time - *pulse_time_ + extra_delay);
-      pulse_time_.reset();
-    } else {
-      PRINTD("-");
-    }
-  }
-
-  size_t num_latency_values() const {
-    RTC_DCHECK_RUNS_SERIALIZED(&race_checker_);
-    return latencies_.size();
-  }
-
-  int min_latency() const {
-    RTC_DCHECK_RUNS_SERIALIZED(&race_checker_);
-    if (latencies_.empty())
-      return 0;
-    return *std::min_element(latencies_.begin(), latencies_.end());
-  }
-
-  int max_latency() const {
-    RTC_DCHECK_RUNS_SERIALIZED(&race_checker_);
-    if (latencies_.empty())
-      return 0;
-    return *std::max_element(latencies_.begin(), latencies_.end());
-  }
-
-  int average_latency() const {
-    RTC_DCHECK_RUNS_SERIALIZED(&race_checker_);
-    if (latencies_.empty())
-      return 0;
-    return 0.5 + static_cast<double>(
-                     std::accumulate(latencies_.begin(), latencies_.end(), 0)) /
-                     latencies_.size();
-  }
-
-  void PrintResults() const {
-    RTC_DCHECK_RUNS_SERIALIZED(&race_checker_);
-    PRINT("] ");
-    for (auto it = latencies_.begin(); it != latencies_.end(); ++it) {
-      PRINTD("%d ", *it);
-    }
-    PRINT("\n");
-    PRINT("[..........] [min, max, avg]=[%d, %d, %d] ms\n", min_latency(),
-          max_latency(), average_latency());
-  }
-
-  rtc::CriticalSection lock_;
-  rtc::RaceChecker race_checker_;
-  rtc::ThreadChecker read_thread_checker_;
-  rtc::ThreadChecker write_thread_checker_;
-
-  rtc::Optional<int64_t> pulse_time_ RTC_GUARDED_BY(lock_);
-  std::vector<int> latencies_ RTC_GUARDED_BY(race_checker_);
-  size_t read_count_ RTC_ACCESS_ON(read_thread_checker_) = 0;
-  size_t write_count_ RTC_ACCESS_ON(write_thread_checker_) = 0;
-};
-
-// Mocks the AudioTransport object and proxies actions for the two callbacks
-// (RecordedDataIsAvailable and NeedMorePlayData) to different implementations
-// of AudioStreamInterface.
-class MockAudioTransport : public test::MockAudioTransport {
- public:
-  explicit MockAudioTransport(TransportType type) : type_(type) {}
-  ~MockAudioTransport() {}
-
-  // Set default actions of the mock object. We are delegating to fake
-  // implementation where the number of callbacks is counted and an event
-  // is set after a certain number of callbacks. Audio parameters are also
-  // checked.
-  void HandleCallbacks(rtc::Event* event,
-                       AudioStream* audio_stream,
-                       int num_callbacks) {
-    event_ = event;
-    audio_stream_ = audio_stream;
-    num_callbacks_ = num_callbacks;
-    if (play_mode()) {
-      ON_CALL(*this, NeedMorePlayData(_, _, _, _, _, _, _, _))
-          .WillByDefault(
-              Invoke(this, &MockAudioTransport::RealNeedMorePlayData));
-    }
-    if (rec_mode()) {
-      ON_CALL(*this, RecordedDataIsAvailable(_, _, _, _, _, _, _, _, _, _))
-          .WillByDefault(
-              Invoke(this, &MockAudioTransport::RealRecordedDataIsAvailable));
-    }
-  }
-
-  int32_t RealRecordedDataIsAvailable(const void* audio_buffer,
-                                      const size_t samples_per_channel,
-                                      const size_t bytes_per_frame,
-                                      const size_t channels,
-                                      const uint32_t sample_rate,
-                                      const uint32_t total_delay_ms,
-                                      const int32_t clock_drift,
-                                      const uint32_t current_mic_level,
-                                      const bool typing_status,
-                                      uint32_t& new_mic_level) {
-    EXPECT_TRUE(rec_mode()) << "No test is expecting these callbacks.";
-    LOG(INFO) << "+";
-    // Store audio parameters once in the first callback. For all other
-    // callbacks, verify that the provided audio parameters are maintained and
-    // that each callback corresponds to 10ms for any given sample rate.
-    if (!record_parameters_.is_complete()) {
-      record_parameters_.reset(sample_rate, channels, samples_per_channel);
-    } else {
-      EXPECT_EQ(samples_per_channel, record_parameters_.frames_per_buffer());
-      EXPECT_EQ(bytes_per_frame, record_parameters_.GetBytesPerFrame());
-      EXPECT_EQ(channels, record_parameters_.channels());
-      EXPECT_EQ(static_cast<int>(sample_rate),
-                record_parameters_.sample_rate());
-      EXPECT_EQ(samples_per_channel,
-                record_parameters_.frames_per_10ms_buffer());
-    }
-    rec_count_++;
-    // Write audio data to audio stream object if one has been injected.
-    if (audio_stream_) {
-      audio_stream_->Write(
-          rtc::MakeArrayView(static_cast<const int16_t*>(audio_buffer),
-                             samples_per_channel * channels),
-          channels);
-    }
-    // Signal the event after given amount of callbacks.
-    if (ReceivedEnoughCallbacks()) {
-      event_->Set();
-    }
-    return 0;
-  }
-
-  int32_t RealNeedMorePlayData(const size_t samples_per_channel,
-                               const size_t bytes_per_frame,
-                               const size_t channels,
-                               const uint32_t sample_rate,
-                               void* audio_buffer,
-                               size_t& samples_per_channel_out,
-                               int64_t* elapsed_time_ms,
-                               int64_t* ntp_time_ms) {
-    EXPECT_TRUE(play_mode()) << "No test is expecting these callbacks.";
-    LOG(INFO) << "-";
-    // Store audio parameters once in the first callback. For all other
-    // callbacks, verify that the provided audio parameters are maintained and
-    // that each callback corresponds to 10ms for any given sample rate.
-    if (!playout_parameters_.is_complete()) {
-      playout_parameters_.reset(sample_rate, channels, samples_per_channel);
-    } else {
-      EXPECT_EQ(samples_per_channel, playout_parameters_.frames_per_buffer());
-      EXPECT_EQ(bytes_per_frame, playout_parameters_.GetBytesPerFrame());
-      EXPECT_EQ(channels, playout_parameters_.channels());
-      EXPECT_EQ(static_cast<int>(sample_rate),
-                playout_parameters_.sample_rate());
-      EXPECT_EQ(samples_per_channel,
-                playout_parameters_.frames_per_10ms_buffer());
-    }
-    play_count_++;
-    samples_per_channel_out = samples_per_channel;
-    // Read audio data from audio stream object if one has been injected.
-    if (audio_stream_) {
-      audio_stream_->Read(
-          rtc::MakeArrayView(static_cast<int16_t*>(audio_buffer),
-                             samples_per_channel * channels),
-          channels);
-    } else {
-      // Fill the audio buffer with zeros to avoid disturbing audio.
-      const size_t num_bytes = samples_per_channel * bytes_per_frame;
-      std::memset(audio_buffer, 0, num_bytes);
-    }
-    // Signal the event after given amount of callbacks.
-    if (ReceivedEnoughCallbacks()) {
-      event_->Set();
-    }
-    return 0;
-  }
-
-  bool ReceivedEnoughCallbacks() {
-    bool recording_done = false;
-    if (rec_mode()) {
-      recording_done = rec_count_ >= num_callbacks_;
-    } else {
-      recording_done = true;
-    }
-    bool playout_done = false;
-    if (play_mode()) {
-      playout_done = play_count_ >= num_callbacks_;
-    } else {
-      playout_done = true;
-    }
-    return recording_done && playout_done;
-  }
-
-  bool play_mode() const {
-    return type_ == TransportType::kPlay ||
-           type_ == TransportType::kPlayAndRecord;
-  }
-
-  bool rec_mode() const {
-    return type_ == TransportType::kRecord ||
-           type_ == TransportType::kPlayAndRecord;
-  }
-
- private:
-  TransportType type_ = TransportType::kInvalid;
-  rtc::Event* event_ = nullptr;
-  AudioStream* audio_stream_ = nullptr;
-  size_t num_callbacks_ = 0;
-  size_t play_count_ = 0;
-  size_t rec_count_ = 0;
-  AudioParameters playout_parameters_;
-  AudioParameters record_parameters_;
-};
-
-// AudioDeviceTest test fixture.
-class AudioDeviceTest : public ::testing::Test {
- protected:
-  AudioDeviceTest() : event_(false, false) {
-#if !defined(ADDRESS_SANITIZER) && !defined(MEMORY_SANITIZER)
-    rtc::LogMessage::LogToDebug(rtc::LS_INFO);
-    // Add extra logging fields here if needed for debugging.
-    // rtc::LogMessage::LogTimestamps();
-    // rtc::LogMessage::LogThreads();
-    audio_device_ =
-        AudioDeviceModule::Create(0, AudioDeviceModule::kPlatformDefaultAudio);
-    EXPECT_NE(audio_device_.get(), nullptr);
-    AudioDeviceModule::AudioLayer audio_layer;
-    int got_platform_audio_layer =
-        audio_device_->ActiveAudioLayer(&audio_layer);
-    if (got_platform_audio_layer != 0 ||
-        audio_layer == AudioDeviceModule::kLinuxAlsaAudio) {
-      requirements_satisfied_ = false;
-    }
-    if (requirements_satisfied_) {
-      EXPECT_EQ(0, audio_device_->Init());
-      const int16_t num_playout_devices = audio_device_->PlayoutDevices();
-      const int16_t num_record_devices = audio_device_->RecordingDevices();
-      requirements_satisfied_ =
-          num_playout_devices > 0 && num_record_devices > 0;
-    }
-#else
-    requirements_satisfied_ = false;
-#endif
-    if (requirements_satisfied_) {
-      EXPECT_EQ(0, audio_device_->SetPlayoutDevice(0));
-      EXPECT_EQ(0, audio_device_->InitSpeaker());
-      EXPECT_EQ(0, audio_device_->SetRecordingDevice(0));
-      EXPECT_EQ(0, audio_device_->InitMicrophone());
-      EXPECT_EQ(0, audio_device_->StereoPlayoutIsAvailable(&stereo_playout_));
-      EXPECT_EQ(0, audio_device_->SetStereoPlayout(stereo_playout_));
-      // Avoid asking for input stereo support and always record in mono
-      // since asking can cause issues in combination with remote desktop.
-      // See https://bugs.chromium.org/p/webrtc/issues/detail?id=7397 for
-      // details.
-      EXPECT_EQ(0, audio_device_->SetStereoRecording(false));
-      EXPECT_EQ(0, audio_device_->SetAGC(false));
-      EXPECT_FALSE(audio_device_->AGC());
-    }
-  }
-
-  virtual ~AudioDeviceTest() {
-    if (audio_device_) {
-      EXPECT_EQ(0, audio_device_->Terminate());
-    }
-  }
-
-  bool requirements_satisfied() const { return requirements_satisfied_; }
-  rtc::Event* event() { return &event_; }
-
-  const rtc::scoped_refptr<AudioDeviceModule>& audio_device() const {
-    return audio_device_;
-  }
-
-  void StartPlayout() {
-    EXPECT_FALSE(audio_device()->Playing());
-    EXPECT_EQ(0, audio_device()->InitPlayout());
-    EXPECT_TRUE(audio_device()->PlayoutIsInitialized());
-    EXPECT_EQ(0, audio_device()->StartPlayout());
-    EXPECT_TRUE(audio_device()->Playing());
-  }
-
-  void StopPlayout() {
-    EXPECT_EQ(0, audio_device()->StopPlayout());
-    EXPECT_FALSE(audio_device()->Playing());
-    EXPECT_FALSE(audio_device()->PlayoutIsInitialized());
-  }
-
-  void StartRecording() {
-    EXPECT_FALSE(audio_device()->Recording());
-    EXPECT_EQ(0, audio_device()->InitRecording());
-    EXPECT_TRUE(audio_device()->RecordingIsInitialized());
-    EXPECT_EQ(0, audio_device()->StartRecording());
-    EXPECT_TRUE(audio_device()->Recording());
-  }
-
-  void StopRecording() {
-    EXPECT_EQ(0, audio_device()->StopRecording());
-    EXPECT_FALSE(audio_device()->Recording());
-    EXPECT_FALSE(audio_device()->RecordingIsInitialized());
-  }
-
- private:
-  bool requirements_satisfied_ = true;
-  rtc::Event event_;
-  rtc::scoped_refptr<AudioDeviceModule> audio_device_;
-  bool stereo_playout_ = false;
-};
-
-// Uses the test fixture to create, initialize and destruct the ADM.
-TEST_F(AudioDeviceTest, ConstructDestruct) {}
-
-TEST_F(AudioDeviceTest, InitTerminate) {
-  SKIP_TEST_IF_NOT(requirements_satisfied());
-  // Initialization is part of the test fixture.
-  EXPECT_TRUE(audio_device()->Initialized());
-  EXPECT_EQ(0, audio_device()->Terminate());
-  EXPECT_FALSE(audio_device()->Initialized());
-}
-
-// Tests Start/Stop playout without any registered audio callback.
-TEST_F(AudioDeviceTest, StartStopPlayout) {
-  SKIP_TEST_IF_NOT(requirements_satisfied());
-  StartPlayout();
-  StopPlayout();
-  StartPlayout();
-  StopPlayout();
-}
-
-// Tests Start/Stop recording without any registered audio callback.
-TEST_F(AudioDeviceTest, StartStopRecording) {
-  SKIP_TEST_IF_NOT(requirements_satisfied());
-  StartRecording();
-  StopRecording();
-  StartRecording();
-  StopRecording();
-}
-
-// Start playout and verify that the native audio layer starts asking for real
-// audio samples to play out using the NeedMorePlayData() callback.
-// Note that we can't add expectations on audio parameters in EXPECT_CALL
-// since parameter are not provided in the each callback. We therefore test and
-// verify the parameters in the fake audio transport implementation instead.
-TEST_F(AudioDeviceTest, StartPlayoutVerifyCallbacks) {
-  SKIP_TEST_IF_NOT(requirements_satisfied());
-  MockAudioTransport mock(TransportType::kPlay);
-  mock.HandleCallbacks(event(), nullptr, kNumCallbacks);
-  EXPECT_CALL(mock, NeedMorePlayData(_, _, _, _, NotNull(), _, _, _))
-      .Times(AtLeast(kNumCallbacks));
-  EXPECT_EQ(0, audio_device()->RegisterAudioCallback(&mock));
-  StartPlayout();
-  event()->Wait(kTestTimeOutInMilliseconds);
-  StopPlayout();
-}
-
-// Start recording and verify that the native audio layer starts providing real
-// audio samples using the RecordedDataIsAvailable() callback.
-TEST_F(AudioDeviceTest, StartRecordingVerifyCallbacks) {
-  SKIP_TEST_IF_NOT(requirements_satisfied());
-  MockAudioTransport mock(TransportType::kRecord);
-  mock.HandleCallbacks(event(), nullptr, kNumCallbacks);
-  EXPECT_CALL(mock, RecordedDataIsAvailable(NotNull(), _, _, _, _, Ge(0u), 0, _,
-                                            false, _))
-      .Times(AtLeast(kNumCallbacks));
-  EXPECT_EQ(0, audio_device()->RegisterAudioCallback(&mock));
-  StartRecording();
-  event()->Wait(kTestTimeOutInMilliseconds);
-  StopRecording();
-}
-
-// Start playout and recording (full-duplex audio) and verify that audio is
-// active in both directions.
-TEST_F(AudioDeviceTest, StartPlayoutAndRecordingVerifyCallbacks) {
-  SKIP_TEST_IF_NOT(requirements_satisfied());
-  MockAudioTransport mock(TransportType::kPlayAndRecord);
-  mock.HandleCallbacks(event(), nullptr, kNumCallbacks);
-  EXPECT_CALL(mock, NeedMorePlayData(_, _, _, _, NotNull(), _, _, _))
-      .Times(AtLeast(kNumCallbacks));
-  EXPECT_CALL(mock, RecordedDataIsAvailable(NotNull(), _, _, _, _, Ge(0u), 0, _,
-                                            false, _))
-      .Times(AtLeast(kNumCallbacks));
-  EXPECT_EQ(0, audio_device()->RegisterAudioCallback(&mock));
-  StartPlayout();
-  StartRecording();
-  event()->Wait(kTestTimeOutInMilliseconds);
-  StopRecording();
-  StopPlayout();
-}
-
-// Start playout and recording and store recorded data in an intermediate FIFO
-// buffer from which the playout side then reads its samples in the same order
-// as they were stored. Under ideal circumstances, a callback sequence would
-// look like: ...+-+-+-+-+-+-+-..., where '+' means 'packet recorded' and '-'
-// means 'packet played'. Under such conditions, the FIFO would contain max 1,
-// with an average somewhere in (0,1) depending on how long the packets are
-// buffered. However, under more realistic conditions, the size
-// of the FIFO will vary more due to an unbalance between the two sides.
-// This test tries to verify that the device maintains a balanced callback-
-// sequence by running in loopback for a few seconds while measuring the size
-// (max and average) of the FIFO. The size of the FIFO is increased by the
-// recording side and decreased by the playout side.
-TEST_F(AudioDeviceTest, RunPlayoutAndRecordingInFullDuplex) {
-  SKIP_TEST_IF_NOT(requirements_satisfied());
-  NiceMock<MockAudioTransport> mock(TransportType::kPlayAndRecord);
-  FifoAudioStream audio_stream;
-  mock.HandleCallbacks(event(), &audio_stream,
-                       kFullDuplexTimeInSec * kNumCallbacksPerSecond);
-  EXPECT_EQ(0, audio_device()->RegisterAudioCallback(&mock));
-  // Run both sides in mono to make the loopback packet handling less complex.
-  // The test works for stereo as well; the only requirement is that both sides
-  // use the same configuration.
-  EXPECT_EQ(0, audio_device()->SetStereoPlayout(false));
-  EXPECT_EQ(0, audio_device()->SetStereoRecording(false));
-  StartPlayout();
-  StartRecording();
-  event()->Wait(static_cast<int>(
-      std::max(kTestTimeOutInMilliseconds, 1000 * kFullDuplexTimeInSec)));
-  StopRecording();
-  StopPlayout();
-  // This thresholds is set rather high to accommodate differences in hardware
-  // in several devices. The main idea is to capture cases where a very large
-  // latency is built up.
-  EXPECT_LE(audio_stream.average_size(), 5u);
-  PRINT("\n");
-}
-
-// Measures loopback latency and reports the min, max and average values for
-// a full duplex audio session.
-// The latency is measured like so:
-// - Insert impulses periodically on the output side.
-// - Detect the impulses on the input side.
-// - Measure the time difference between the transmit time and receive time.
-// - Store time differences in a vector and calculate min, max and average.
-// This test needs the '--gtest_also_run_disabled_tests' flag to run and also
-// some sort of audio feedback loop. E.g. a headset where the mic is placed
-// close to the speaker to ensure highest possible echo. It is also recommended
-// to run the test at highest possible output volume.
-TEST_F(AudioDeviceTest, DISABLED_MeasureLoopbackLatency) {
-  SKIP_TEST_IF_NOT(requirements_satisfied());
-  NiceMock<MockAudioTransport> mock(TransportType::kPlayAndRecord);
-  LatencyAudioStream audio_stream;
-  mock.HandleCallbacks(event(), &audio_stream,
-                       kMeasureLatencyTimeInSec * kNumCallbacksPerSecond);
-  EXPECT_EQ(0, audio_device()->RegisterAudioCallback(&mock));
-  EXPECT_EQ(0, audio_device()->SetStereoPlayout(false));
-  EXPECT_EQ(0, audio_device()->SetStereoRecording(false));
-  StartPlayout();
-  StartRecording();
-  event()->Wait(static_cast<int>(
-      std::max(kTestTimeOutInMilliseconds, 1000 * kMeasureLatencyTimeInSec)));
-  StopRecording();
-  StopPlayout();
-  // Verify that the correct number of transmitted impulses are detected.
-  EXPECT_EQ(audio_stream.num_latency_values(),
-            static_cast<size_t>(
-                kImpulseFrequencyInHz * kMeasureLatencyTimeInSec - 1));
-  // Print out min, max and average delay values for debugging purposes.
-  audio_stream.PrintResults();
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_device/dummy/audio_device_dummy.cc b/modules/audio_device/dummy/audio_device_dummy.cc
deleted file mode 100644
index 91033b7..0000000
--- a/modules/audio_device/dummy/audio_device_dummy.cc
+++ /dev/null
@@ -1,178 +0,0 @@
-/*
- *  Copyright (c) 2013 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_device/dummy/audio_device_dummy.h"
-
-namespace webrtc {
-
-int32_t AudioDeviceDummy::ActiveAudioLayer(
-    AudioDeviceModule::AudioLayer& audioLayer) const {
-  return -1;
-}
-
-AudioDeviceGeneric::InitStatus AudioDeviceDummy::Init() {
-  return InitStatus::OK;
-}
-
-int32_t AudioDeviceDummy::Terminate() { return 0; }
-
-bool AudioDeviceDummy::Initialized() const { return true; }
-
-int16_t AudioDeviceDummy::PlayoutDevices() { return -1; }
-
-int16_t AudioDeviceDummy::RecordingDevices() { return -1; }
-
-int32_t AudioDeviceDummy::PlayoutDeviceName(uint16_t index,
-                                            char name[kAdmMaxDeviceNameSize],
-                                            char guid[kAdmMaxGuidSize]) {
-  return -1;
-}
-
-int32_t AudioDeviceDummy::RecordingDeviceName(uint16_t index,
-                                              char name[kAdmMaxDeviceNameSize],
-                                              char guid[kAdmMaxGuidSize]) {
-  return -1;
-}
-
-int32_t AudioDeviceDummy::SetPlayoutDevice(uint16_t index) { return -1; }
-
-int32_t AudioDeviceDummy::SetPlayoutDevice(
-    AudioDeviceModule::WindowsDeviceType device) {
-  return -1;
-}
-
-int32_t AudioDeviceDummy::SetRecordingDevice(uint16_t index) { return -1; }
-
-int32_t AudioDeviceDummy::SetRecordingDevice(
-    AudioDeviceModule::WindowsDeviceType device) {
-  return -1;
-}
-
-int32_t AudioDeviceDummy::PlayoutIsAvailable(bool& available) { return -1; }
-
-int32_t AudioDeviceDummy::InitPlayout() { return -1; }
-
-bool AudioDeviceDummy::PlayoutIsInitialized() const { return false; }
-
-int32_t AudioDeviceDummy::RecordingIsAvailable(bool& available) { return -1; }
-
-int32_t AudioDeviceDummy::InitRecording() { return -1; }
-
-bool AudioDeviceDummy::RecordingIsInitialized() const { return false; }
-
-int32_t AudioDeviceDummy::StartPlayout() { return -1; }
-
-int32_t AudioDeviceDummy::StopPlayout() { return 0; }
-
-bool AudioDeviceDummy::Playing() const { return false; }
-
-int32_t AudioDeviceDummy::StartRecording() { return -1; }
-
-int32_t AudioDeviceDummy::StopRecording() { return 0; }
-
-bool AudioDeviceDummy::Recording() const { return false; }
-
-int32_t AudioDeviceDummy::SetAGC(bool enable) { return -1; }
-
-bool AudioDeviceDummy::AGC() const { return false; }
-
-int32_t AudioDeviceDummy::InitSpeaker() { return -1; }
-
-bool AudioDeviceDummy::SpeakerIsInitialized() const { return false; }
-
-int32_t AudioDeviceDummy::InitMicrophone() { return -1; }
-
-bool AudioDeviceDummy::MicrophoneIsInitialized() const { return false; }
-
-int32_t AudioDeviceDummy::SpeakerVolumeIsAvailable(bool& available) {
-  return -1;
-}
-
-int32_t AudioDeviceDummy::SetSpeakerVolume(uint32_t volume) { return -1; }
-
-int32_t AudioDeviceDummy::SpeakerVolume(uint32_t& volume) const { return -1; }
-
-int32_t AudioDeviceDummy::MaxSpeakerVolume(uint32_t& maxVolume) const {
-  return -1;
-}
-
-int32_t AudioDeviceDummy::MinSpeakerVolume(uint32_t& minVolume) const {
-  return -1;
-}
-
-int32_t AudioDeviceDummy::MicrophoneVolumeIsAvailable(bool& available) {
-  return -1;
-}
-
-int32_t AudioDeviceDummy::SetMicrophoneVolume(uint32_t volume) { return -1; }
-
-int32_t AudioDeviceDummy::MicrophoneVolume(uint32_t& volume) const {
-  return -1;
-}
-
-int32_t AudioDeviceDummy::MaxMicrophoneVolume(uint32_t& maxVolume) const {
-  return -1;
-}
-
-int32_t AudioDeviceDummy::MinMicrophoneVolume(uint32_t& minVolume) const {
-  return -1;
-}
-
-int32_t AudioDeviceDummy::SpeakerMuteIsAvailable(bool& available) { return -1; }
-
-int32_t AudioDeviceDummy::SetSpeakerMute(bool enable) { return -1; }
-
-int32_t AudioDeviceDummy::SpeakerMute(bool& enabled) const { return -1; }
-
-int32_t AudioDeviceDummy::MicrophoneMuteIsAvailable(bool& available) {
-  return -1;
-}
-
-int32_t AudioDeviceDummy::SetMicrophoneMute(bool enable) { return -1; }
-
-int32_t AudioDeviceDummy::MicrophoneMute(bool& enabled) const { return -1; }
-
-int32_t AudioDeviceDummy::StereoPlayoutIsAvailable(bool& available) {
-  return -1;
-}
-int32_t AudioDeviceDummy::SetStereoPlayout(bool enable) { return -1; }
-
-int32_t AudioDeviceDummy::StereoPlayout(bool& enabled) const { return -1; }
-
-int32_t AudioDeviceDummy::StereoRecordingIsAvailable(bool& available) {
-  return -1;
-}
-
-int32_t AudioDeviceDummy::SetStereoRecording(bool enable) { return -1; }
-
-int32_t AudioDeviceDummy::StereoRecording(bool& enabled) const { return -1; }
-
-int32_t AudioDeviceDummy::PlayoutDelay(uint16_t& delayMS) const { return -1; }
-
-int32_t AudioDeviceDummy::RecordingDelay(uint16_t& delayMS) const { return -1; }
-
-bool AudioDeviceDummy::PlayoutWarning() const { return false; }
-
-bool AudioDeviceDummy::PlayoutError() const { return false; }
-
-bool AudioDeviceDummy::RecordingWarning() const { return false; }
-
-bool AudioDeviceDummy::RecordingError() const { return false; }
-
-void AudioDeviceDummy::ClearPlayoutWarning() {}
-
-void AudioDeviceDummy::ClearPlayoutError() {}
-
-void AudioDeviceDummy::ClearRecordingWarning() {}
-
-void AudioDeviceDummy::ClearRecordingError() {}
-
-void AudioDeviceDummy::AttachAudioBuffer(AudioDeviceBuffer* audioBuffer) {}
-}  // namespace webrtc
diff --git a/modules/audio_device/dummy/audio_device_dummy.h b/modules/audio_device/dummy/audio_device_dummy.h
deleted file mode 100644
index bbadbdd..0000000
--- a/modules/audio_device/dummy/audio_device_dummy.h
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- *  Copyright (c) 2012 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_AUDIO_DEVICE_AUDIO_DEVICE_DUMMY_H
-#define WEBRTC_AUDIO_DEVICE_AUDIO_DEVICE_DUMMY_H
-
-#include <stdio.h>
-
-#include "webrtc/modules/audio_device/audio_device_generic.h"
-
-namespace webrtc {
-
-class AudioDeviceDummy : public AudioDeviceGeneric {
- public:
-  AudioDeviceDummy(const int32_t id) {}
-  virtual ~AudioDeviceDummy() {}
-
-  // Retrieve the currently utilized audio layer
-  int32_t ActiveAudioLayer(
-      AudioDeviceModule::AudioLayer& audioLayer) const override;
-
-  // Main initializaton and termination
-  InitStatus Init() override;
-  int32_t Terminate() override;
-  bool Initialized() const override;
-
-  // Device enumeration
-  int16_t PlayoutDevices() override;
-  int16_t RecordingDevices() override;
-  int32_t PlayoutDeviceName(uint16_t index,
-                            char name[kAdmMaxDeviceNameSize],
-                            char guid[kAdmMaxGuidSize]) override;
-  int32_t RecordingDeviceName(uint16_t index,
-                              char name[kAdmMaxDeviceNameSize],
-                              char guid[kAdmMaxGuidSize]) override;
-
-  // Device selection
-  int32_t SetPlayoutDevice(uint16_t index) override;
-  int32_t SetPlayoutDevice(
-      AudioDeviceModule::WindowsDeviceType device) override;
-  int32_t SetRecordingDevice(uint16_t index) override;
-  int32_t SetRecordingDevice(
-      AudioDeviceModule::WindowsDeviceType device) override;
-
-  // Audio transport initialization
-  int32_t PlayoutIsAvailable(bool& available) override;
-  int32_t InitPlayout() override;
-  bool PlayoutIsInitialized() const override;
-  int32_t RecordingIsAvailable(bool& available) override;
-  int32_t InitRecording() override;
-  bool RecordingIsInitialized() const override;
-
-  // Audio transport control
-  int32_t StartPlayout() override;
-  int32_t StopPlayout() override;
-  bool Playing() const override;
-  int32_t StartRecording() override;
-  int32_t StopRecording() override;
-  bool Recording() const override;
-
-  // Microphone Automatic Gain Control (AGC)
-  int32_t SetAGC(bool enable) override;
-  bool AGC() const override;
-
-  // Audio mixer initialization
-  int32_t InitSpeaker() override;
-  bool SpeakerIsInitialized() const override;
-  int32_t InitMicrophone() override;
-  bool MicrophoneIsInitialized() const override;
-
-  // Speaker volume controls
-  int32_t SpeakerVolumeIsAvailable(bool& available) override;
-  int32_t SetSpeakerVolume(uint32_t volume) override;
-  int32_t SpeakerVolume(uint32_t& volume) const override;
-  int32_t MaxSpeakerVolume(uint32_t& maxVolume) const override;
-  int32_t MinSpeakerVolume(uint32_t& minVolume) const override;
-
-  // Microphone volume controls
-  int32_t MicrophoneVolumeIsAvailable(bool& available) override;
-  int32_t SetMicrophoneVolume(uint32_t volume) override;
-  int32_t MicrophoneVolume(uint32_t& volume) const override;
-  int32_t MaxMicrophoneVolume(uint32_t& maxVolume) const override;
-  int32_t MinMicrophoneVolume(uint32_t& minVolume) const override;
-
-  // Speaker mute control
-  int32_t SpeakerMuteIsAvailable(bool& available) override;
-  int32_t SetSpeakerMute(bool enable) override;
-  int32_t SpeakerMute(bool& enabled) const override;
-
-  // Microphone mute control
-  int32_t MicrophoneMuteIsAvailable(bool& available) override;
-  int32_t SetMicrophoneMute(bool enable) override;
-  int32_t MicrophoneMute(bool& enabled) const override;
-
-  // Stereo support
-  int32_t StereoPlayoutIsAvailable(bool& available) override;
-  int32_t SetStereoPlayout(bool enable) override;
-  int32_t StereoPlayout(bool& enabled) const override;
-  int32_t StereoRecordingIsAvailable(bool& available) override;
-  int32_t SetStereoRecording(bool enable) override;
-  int32_t StereoRecording(bool& enabled) const override;
-
-  // Delay information and control
-  int32_t PlayoutDelay(uint16_t& delayMS) const override;
-  int32_t RecordingDelay(uint16_t& delayMS) const override;
-
-  bool PlayoutWarning() const override;
-  bool PlayoutError() const override;
-  bool RecordingWarning() const override;
-  bool RecordingError() const override;
-  void ClearPlayoutWarning() override;
-  void ClearPlayoutError() override;
-  void ClearRecordingWarning() override;
-  void ClearRecordingError() override;
-
-  void AttachAudioBuffer(AudioDeviceBuffer* audioBuffer) override;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_AUDIO_DEVICE_AUDIO_DEVICE_DUMMY_H
diff --git a/modules/audio_device/dummy/file_audio_device.cc b/modules/audio_device/dummy/file_audio_device.cc
deleted file mode 100644
index 4d8e11a..0000000
--- a/modules/audio_device/dummy/file_audio_device.cc
+++ /dev/null
@@ -1,508 +0,0 @@
-/*
- *  Copyright (c) 2014 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_device/dummy/file_audio_device.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/platform_thread.h"
-#include "webrtc/system_wrappers/include/sleep.h"
-
-namespace webrtc {
-
-const int kRecordingFixedSampleRate = 48000;
-const size_t kRecordingNumChannels = 2;
-const int kPlayoutFixedSampleRate = 48000;
-const size_t kPlayoutNumChannels = 2;
-const size_t kPlayoutBufferSize =
-    kPlayoutFixedSampleRate / 100 * kPlayoutNumChannels * 2;
-const size_t kRecordingBufferSize =
-    kRecordingFixedSampleRate / 100 * kRecordingNumChannels * 2;
-
-FileAudioDevice::FileAudioDevice(const int32_t id,
-                                 const char* inputFilename,
-                                 const char* outputFilename):
-    _ptrAudioBuffer(NULL),
-    _recordingBuffer(NULL),
-    _playoutBuffer(NULL),
-    _recordingFramesLeft(0),
-    _playoutFramesLeft(0),
-    _recordingBufferSizeIn10MS(0),
-    _recordingFramesIn10MS(0),
-    _playoutFramesIn10MS(0),
-    _playing(false),
-    _recording(false),
-    _lastCallPlayoutMillis(0),
-    _lastCallRecordMillis(0),
-    _outputFile(*FileWrapper::Create()),
-    _inputFile(*FileWrapper::Create()),
-    _outputFilename(outputFilename),
-    _inputFilename(inputFilename) {
-}
-
-FileAudioDevice::~FileAudioDevice() {
-  delete &_outputFile;
-  delete &_inputFile;
-}
-
-int32_t FileAudioDevice::ActiveAudioLayer(
-    AudioDeviceModule::AudioLayer& audioLayer) const {
-  return -1;
-}
-
-AudioDeviceGeneric::InitStatus FileAudioDevice::Init() {
-  return InitStatus::OK;
-}
-
-int32_t FileAudioDevice::Terminate() { return 0; }
-
-bool FileAudioDevice::Initialized() const { return true; }
-
-int16_t FileAudioDevice::PlayoutDevices() {
-  return 1;
-}
-
-int16_t FileAudioDevice::RecordingDevices() {
-  return 1;
-}
-
-int32_t FileAudioDevice::PlayoutDeviceName(uint16_t index,
-                                            char name[kAdmMaxDeviceNameSize],
-                                            char guid[kAdmMaxGuidSize]) {
-  const char* kName = "dummy_device";
-  const char* kGuid = "dummy_device_unique_id";
-  if (index < 1) {
-    memset(name, 0, kAdmMaxDeviceNameSize);
-    memset(guid, 0, kAdmMaxGuidSize);
-    memcpy(name, kName, strlen(kName));
-    memcpy(guid, kGuid, strlen(guid));
-    return 0;
-  }
-  return -1;
-}
-
-int32_t FileAudioDevice::RecordingDeviceName(uint16_t index,
-                                              char name[kAdmMaxDeviceNameSize],
-                                              char guid[kAdmMaxGuidSize]) {
-  const char* kName = "dummy_device";
-  const char* kGuid = "dummy_device_unique_id";
-  if (index < 1) {
-    memset(name, 0, kAdmMaxDeviceNameSize);
-    memset(guid, 0, kAdmMaxGuidSize);
-    memcpy(name, kName, strlen(kName));
-    memcpy(guid, kGuid, strlen(guid));
-    return 0;
-  }
-  return -1;
-}
-
-int32_t FileAudioDevice::SetPlayoutDevice(uint16_t index) {
-  if (index == 0) {
-    _playout_index = index;
-    return 0;
-  }
-  return -1;
-}
-
-int32_t FileAudioDevice::SetPlayoutDevice(
-    AudioDeviceModule::WindowsDeviceType device) {
-  return -1;
-}
-
-int32_t FileAudioDevice::SetRecordingDevice(uint16_t index) {
-  if (index == 0) {
-    _record_index = index;
-    return _record_index;
-  }
-  return -1;
-}
-
-int32_t FileAudioDevice::SetRecordingDevice(
-    AudioDeviceModule::WindowsDeviceType device) {
-  return -1;
-}
-
-int32_t FileAudioDevice::PlayoutIsAvailable(bool& available) {
-  if (_playout_index == 0) {
-    available = true;
-    return _playout_index;
-  }
-  available = false;
-  return -1;
-}
-
-int32_t FileAudioDevice::InitPlayout() {
-  if (_ptrAudioBuffer) {
-      // Update webrtc audio buffer with the selected parameters
-      _ptrAudioBuffer->SetPlayoutSampleRate(kPlayoutFixedSampleRate);
-      _ptrAudioBuffer->SetPlayoutChannels(kPlayoutNumChannels);
-  }
-  return 0;
-}
-
-bool FileAudioDevice::PlayoutIsInitialized() const {
-  return true;
-}
-
-int32_t FileAudioDevice::RecordingIsAvailable(bool& available) {
-  if (_record_index == 0) {
-    available = true;
-    return _record_index;
-  }
-  available = false;
-  return -1;
-}
-
-int32_t FileAudioDevice::InitRecording() {
-  rtc::CritScope lock(&_critSect);
-
-  if (_recording) {
-    return -1;
-  }
-
-  _recordingFramesIn10MS = static_cast<size_t>(kRecordingFixedSampleRate / 100);
-
-  if (_ptrAudioBuffer) {
-    _ptrAudioBuffer->SetRecordingSampleRate(kRecordingFixedSampleRate);
-    _ptrAudioBuffer->SetRecordingChannels(kRecordingNumChannels);
-  }
-  return 0;
-}
-
-bool FileAudioDevice::RecordingIsInitialized() const {
-  return _recordingFramesIn10MS != 0;
-}
-
-int32_t FileAudioDevice::StartPlayout() {
-  if (_playing) {
-      return 0;
-  }
-
-  _playoutFramesIn10MS = static_cast<size_t>(kPlayoutFixedSampleRate / 100);
-  _playing = true;
-  _playoutFramesLeft = 0;
-
-  if (!_playoutBuffer) {
-      _playoutBuffer = new int8_t[kPlayoutBufferSize];
-  }
-  if (!_playoutBuffer) {
-    _playing = false;
-    return -1;
-  }
-
-  // PLAYOUT
-  if (!_outputFilename.empty() &&
-      !_outputFile.OpenFile(_outputFilename.c_str(), false)) {
-    LOG(LS_ERROR) << "Failed to open playout file: " << _outputFilename;
-    _playing = false;
-    delete [] _playoutBuffer;
-    _playoutBuffer = NULL;
-    return -1;
-  }
-
-  _ptrThreadPlay.reset(new rtc::PlatformThread(
-      PlayThreadFunc, this, "webrtc_audio_module_play_thread"));
-  _ptrThreadPlay->Start();
-  _ptrThreadPlay->SetPriority(rtc::kRealtimePriority);
-
-  LOG(LS_INFO) << "Started playout capture to output file: "
-               << _outputFilename;
-  return 0;
-}
-
-int32_t FileAudioDevice::StopPlayout() {
-  {
-      rtc::CritScope lock(&_critSect);
-      _playing = false;
-  }
-
-  // stop playout thread first
-  if (_ptrThreadPlay) {
-      _ptrThreadPlay->Stop();
-      _ptrThreadPlay.reset();
-  }
-
-  rtc::CritScope lock(&_critSect);
-
-  _playoutFramesLeft = 0;
-  delete [] _playoutBuffer;
-  _playoutBuffer = NULL;
-  _outputFile.CloseFile();
-
-  LOG(LS_INFO) << "Stopped playout capture to output file: "
-               << _outputFilename;
-  return 0;
-}
-
-bool FileAudioDevice::Playing() const {
-  return true;
-}
-
-int32_t FileAudioDevice::StartRecording() {
-  _recording = true;
-
-  // Make sure we only create the buffer once.
-  _recordingBufferSizeIn10MS = _recordingFramesIn10MS *
-                               kRecordingNumChannels *
-                               2;
-  if (!_recordingBuffer) {
-      _recordingBuffer = new int8_t[_recordingBufferSizeIn10MS];
-  }
-
-  if (!_inputFilename.empty() &&
-      !_inputFile.OpenFile(_inputFilename.c_str(), true)) {
-    LOG(LS_ERROR) << "Failed to open audio input file: " << _inputFilename;
-    _recording = false;
-    delete[] _recordingBuffer;
-    _recordingBuffer = NULL;
-    return -1;
-  }
-
-  _ptrThreadRec.reset(new rtc::PlatformThread(
-      RecThreadFunc, this, "webrtc_audio_module_capture_thread"));
-
-  _ptrThreadRec->Start();
-  _ptrThreadRec->SetPriority(rtc::kRealtimePriority);
-
-  LOG(LS_INFO) << "Started recording from input file: "
-               << _inputFilename;
-
-  return 0;
-}
-
-
-int32_t FileAudioDevice::StopRecording() {
-  {
-    rtc::CritScope lock(&_critSect);
-    _recording = false;
-  }
-
-  if (_ptrThreadRec) {
-      _ptrThreadRec->Stop();
-      _ptrThreadRec.reset();
-  }
-
-  rtc::CritScope lock(&_critSect);
-  _recordingFramesLeft = 0;
-  if (_recordingBuffer) {
-      delete [] _recordingBuffer;
-      _recordingBuffer = NULL;
-  }
-  _inputFile.CloseFile();
-
-  LOG(LS_INFO) << "Stopped recording from input file: "
-               << _inputFilename;
-  return 0;
-}
-
-bool FileAudioDevice::Recording() const {
-  return _recording;
-}
-
-int32_t FileAudioDevice::SetAGC(bool enable) { return -1; }
-
-bool FileAudioDevice::AGC() const { return false; }
-
-int32_t FileAudioDevice::InitSpeaker() { return -1; }
-
-bool FileAudioDevice::SpeakerIsInitialized() const { return false; }
-
-int32_t FileAudioDevice::InitMicrophone() { return 0; }
-
-bool FileAudioDevice::MicrophoneIsInitialized() const { return true; }
-
-int32_t FileAudioDevice::SpeakerVolumeIsAvailable(bool& available) {
-  return -1;
-}
-
-int32_t FileAudioDevice::SetSpeakerVolume(uint32_t volume) { return -1; }
-
-int32_t FileAudioDevice::SpeakerVolume(uint32_t& volume) const { return -1; }
-
-int32_t FileAudioDevice::MaxSpeakerVolume(uint32_t& maxVolume) const {
-  return -1;
-}
-
-int32_t FileAudioDevice::MinSpeakerVolume(uint32_t& minVolume) const {
-  return -1;
-}
-
-int32_t FileAudioDevice::MicrophoneVolumeIsAvailable(bool& available) {
-  return -1;
-}
-
-int32_t FileAudioDevice::SetMicrophoneVolume(uint32_t volume) { return -1; }
-
-int32_t FileAudioDevice::MicrophoneVolume(uint32_t& volume) const {
-  return -1;
-}
-
-int32_t FileAudioDevice::MaxMicrophoneVolume(uint32_t& maxVolume) const {
-  return -1;
-}
-
-int32_t FileAudioDevice::MinMicrophoneVolume(uint32_t& minVolume) const {
-  return -1;
-}
-
-int32_t FileAudioDevice::SpeakerMuteIsAvailable(bool& available) { return -1; }
-
-int32_t FileAudioDevice::SetSpeakerMute(bool enable) { return -1; }
-
-int32_t FileAudioDevice::SpeakerMute(bool& enabled) const { return -1; }
-
-int32_t FileAudioDevice::MicrophoneMuteIsAvailable(bool& available) {
-  return -1;
-}
-
-int32_t FileAudioDevice::SetMicrophoneMute(bool enable) { return -1; }
-
-int32_t FileAudioDevice::MicrophoneMute(bool& enabled) const { return -1; }
-
-int32_t FileAudioDevice::StereoPlayoutIsAvailable(bool& available) {
-  available = true;
-  return 0;
-}
-int32_t FileAudioDevice::SetStereoPlayout(bool enable) {
-  return 0;
-}
-
-int32_t FileAudioDevice::StereoPlayout(bool& enabled) const {
-  enabled = true;
-  return 0;
-}
-
-int32_t FileAudioDevice::StereoRecordingIsAvailable(bool& available) {
-  available = true;
-  return 0;
-}
-
-int32_t FileAudioDevice::SetStereoRecording(bool enable) {
-  return 0;
-}
-
-int32_t FileAudioDevice::StereoRecording(bool& enabled) const {
-  enabled = true;
-  return 0;
-}
-
-int32_t FileAudioDevice::PlayoutDelay(uint16_t& delayMS) const {
-  return 0;
-}
-
-int32_t FileAudioDevice::RecordingDelay(uint16_t& delayMS) const { return -1; }
-
-bool FileAudioDevice::PlayoutWarning() const { return false; }
-
-bool FileAudioDevice::PlayoutError() const { return false; }
-
-bool FileAudioDevice::RecordingWarning() const { return false; }
-
-bool FileAudioDevice::RecordingError() const { return false; }
-
-void FileAudioDevice::ClearPlayoutWarning() {}
-
-void FileAudioDevice::ClearPlayoutError() {}
-
-void FileAudioDevice::ClearRecordingWarning() {}
-
-void FileAudioDevice::ClearRecordingError() {}
-
-void FileAudioDevice::AttachAudioBuffer(AudioDeviceBuffer* audioBuffer) {
-  rtc::CritScope lock(&_critSect);
-
-  _ptrAudioBuffer = audioBuffer;
-
-  // Inform the AudioBuffer about default settings for this implementation.
-  // Set all values to zero here since the actual settings will be done by
-  // InitPlayout and InitRecording later.
-  _ptrAudioBuffer->SetRecordingSampleRate(0);
-  _ptrAudioBuffer->SetPlayoutSampleRate(0);
-  _ptrAudioBuffer->SetRecordingChannels(0);
-  _ptrAudioBuffer->SetPlayoutChannels(0);
-}
-
-bool FileAudioDevice::PlayThreadFunc(void* pThis)
-{
-    return (static_cast<FileAudioDevice*>(pThis)->PlayThreadProcess());
-}
-
-bool FileAudioDevice::RecThreadFunc(void* pThis)
-{
-    return (static_cast<FileAudioDevice*>(pThis)->RecThreadProcess());
-}
-
-bool FileAudioDevice::PlayThreadProcess()
-{
-    if (!_playing) {
-        return false;
-    }
-    int64_t currentTime = rtc::TimeMillis();
-    _critSect.Enter();
-
-    if (_lastCallPlayoutMillis == 0 ||
-        currentTime - _lastCallPlayoutMillis >= 10) {
-        _critSect.Leave();
-        _ptrAudioBuffer->RequestPlayoutData(_playoutFramesIn10MS);
-        _critSect.Enter();
-
-        _playoutFramesLeft = _ptrAudioBuffer->GetPlayoutData(_playoutBuffer);
-        RTC_DCHECK_EQ(_playoutFramesIn10MS, _playoutFramesLeft);
-        if (_outputFile.is_open()) {
-          _outputFile.Write(_playoutBuffer, kPlayoutBufferSize);
-        }
-        _lastCallPlayoutMillis = currentTime;
-    }
-    _playoutFramesLeft = 0;
-    _critSect.Leave();
-
-    int64_t deltaTimeMillis = rtc::TimeMillis() - currentTime;
-    if (deltaTimeMillis < 10) {
-      SleepMs(10 - deltaTimeMillis);
-    }
-
-    return true;
-}
-
-bool FileAudioDevice::RecThreadProcess()
-{
-    if (!_recording) {
-        return false;
-    }
-
-    int64_t currentTime = rtc::TimeMillis();
-    _critSect.Enter();
-
-    if (_lastCallRecordMillis == 0 ||
-        currentTime - _lastCallRecordMillis >= 10) {
-      if (_inputFile.is_open()) {
-        if (_inputFile.Read(_recordingBuffer, kRecordingBufferSize) > 0) {
-          _ptrAudioBuffer->SetRecordedBuffer(_recordingBuffer,
-                                             _recordingFramesIn10MS);
-        } else {
-          _inputFile.Rewind();
-        }
-        _lastCallRecordMillis = currentTime;
-        _critSect.Leave();
-        _ptrAudioBuffer->DeliverRecordedData();
-        _critSect.Enter();
-      }
-    }
-
-    _critSect.Leave();
-
-    int64_t deltaTimeMillis = rtc::TimeMillis() - currentTime;
-    if (deltaTimeMillis < 10) {
-      SleepMs(10 - deltaTimeMillis);
-    }
-
-    return true;
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_device/dummy/file_audio_device.h b/modules/audio_device/dummy/file_audio_device.h
deleted file mode 100644
index 615c137..0000000
--- a/modules/audio_device/dummy/file_audio_device.h
+++ /dev/null
@@ -1,182 +0,0 @@
-/*
- *  Copyright (c) 2014 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_AUDIO_DEVICE_FILE_AUDIO_DEVICE_H
-#define WEBRTC_AUDIO_DEVICE_FILE_AUDIO_DEVICE_H
-
-#include <stdio.h>
-
-#include <memory>
-#include <string>
-
-#include "webrtc/modules/audio_device/audio_device_generic.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/timeutils.h"
-#include "webrtc/system_wrappers/include/file_wrapper.h"
-
-namespace rtc {
-class PlatformThread;
-}  // namespace rtc
-
-namespace webrtc {
-class EventWrapper;
-
-// This is a fake audio device which plays audio from a file as its microphone
-// and plays out into a file.
-class FileAudioDevice : public AudioDeviceGeneric {
- public:
-  // Constructs a file audio device with |id|. It will read audio from
-  // |inputFilename| and record output audio to |outputFilename|.
-  //
-  // The input file should be a readable 48k stereo raw file, and the output
-  // file should point to a writable location. The output format will also be
-  // 48k stereo raw audio.
-  FileAudioDevice(const int32_t id,
-                  const char* inputFilename,
-                  const char* outputFilename);
-  virtual ~FileAudioDevice();
-
-  // Retrieve the currently utilized audio layer
-  int32_t ActiveAudioLayer(
-      AudioDeviceModule::AudioLayer& audioLayer) const override;
-
-  // Main initializaton and termination
-  InitStatus Init() override;
-  int32_t Terminate() override;
-  bool Initialized() const override;
-
-  // Device enumeration
-  int16_t PlayoutDevices() override;
-  int16_t RecordingDevices() override;
-  int32_t PlayoutDeviceName(uint16_t index,
-                            char name[kAdmMaxDeviceNameSize],
-                            char guid[kAdmMaxGuidSize]) override;
-  int32_t RecordingDeviceName(uint16_t index,
-                              char name[kAdmMaxDeviceNameSize],
-                              char guid[kAdmMaxGuidSize]) override;
-
-  // Device selection
-  int32_t SetPlayoutDevice(uint16_t index) override;
-  int32_t SetPlayoutDevice(
-      AudioDeviceModule::WindowsDeviceType device) override;
-  int32_t SetRecordingDevice(uint16_t index) override;
-  int32_t SetRecordingDevice(
-      AudioDeviceModule::WindowsDeviceType device) override;
-
-  // Audio transport initialization
-  int32_t PlayoutIsAvailable(bool& available) override;
-  int32_t InitPlayout() override;
-  bool PlayoutIsInitialized() const override;
-  int32_t RecordingIsAvailable(bool& available) override;
-  int32_t InitRecording() override;
-  bool RecordingIsInitialized() const override;
-
-  // Audio transport control
-  int32_t StartPlayout() override;
-  int32_t StopPlayout() override;
-  bool Playing() const override;
-  int32_t StartRecording() override;
-  int32_t StopRecording() override;
-  bool Recording() const override;
-
-  // Microphone Automatic Gain Control (AGC)
-  int32_t SetAGC(bool enable) override;
-  bool AGC() const override;
-
-  // Audio mixer initialization
-  int32_t InitSpeaker() override;
-  bool SpeakerIsInitialized() const override;
-  int32_t InitMicrophone() override;
-  bool MicrophoneIsInitialized() const override;
-
-  // Speaker volume controls
-  int32_t SpeakerVolumeIsAvailable(bool& available) override;
-  int32_t SetSpeakerVolume(uint32_t volume) override;
-  int32_t SpeakerVolume(uint32_t& volume) const override;
-  int32_t MaxSpeakerVolume(uint32_t& maxVolume) const override;
-  int32_t MinSpeakerVolume(uint32_t& minVolume) const override;
-
-  // Microphone volume controls
-  int32_t MicrophoneVolumeIsAvailable(bool& available) override;
-  int32_t SetMicrophoneVolume(uint32_t volume) override;
-  int32_t MicrophoneVolume(uint32_t& volume) const override;
-  int32_t MaxMicrophoneVolume(uint32_t& maxVolume) const override;
-  int32_t MinMicrophoneVolume(uint32_t& minVolume) const override;
-
-  // Speaker mute control
-  int32_t SpeakerMuteIsAvailable(bool& available) override;
-  int32_t SetSpeakerMute(bool enable) override;
-  int32_t SpeakerMute(bool& enabled) const override;
-
-  // Microphone mute control
-  int32_t MicrophoneMuteIsAvailable(bool& available) override;
-  int32_t SetMicrophoneMute(bool enable) override;
-  int32_t MicrophoneMute(bool& enabled) const override;
-
-  // Stereo support
-  int32_t StereoPlayoutIsAvailable(bool& available) override;
-  int32_t SetStereoPlayout(bool enable) override;
-  int32_t StereoPlayout(bool& enabled) const override;
-  int32_t StereoRecordingIsAvailable(bool& available) override;
-  int32_t SetStereoRecording(bool enable) override;
-  int32_t StereoRecording(bool& enabled) const override;
-
-  // Delay information and control
-  int32_t PlayoutDelay(uint16_t& delayMS) const override;
-  int32_t RecordingDelay(uint16_t& delayMS) const override;
-
-  bool PlayoutWarning() const override;
-  bool PlayoutError() const override;
-  bool RecordingWarning() const override;
-  bool RecordingError() const override;
-  void ClearPlayoutWarning() override;
-  void ClearPlayoutError() override;
-  void ClearRecordingWarning() override;
-  void ClearRecordingError() override;
-
-  void AttachAudioBuffer(AudioDeviceBuffer* audioBuffer) override;
-
- private:
-  static bool RecThreadFunc(void*);
-  static bool PlayThreadFunc(void*);
-  bool RecThreadProcess();
-  bool PlayThreadProcess();
-
-  int32_t _playout_index;
-  int32_t _record_index;
-  AudioDeviceBuffer* _ptrAudioBuffer;
-  int8_t* _recordingBuffer;  // In bytes.
-  int8_t* _playoutBuffer;  // In bytes.
-  uint32_t _recordingFramesLeft;
-  uint32_t _playoutFramesLeft;
-  rtc::CriticalSection _critSect;
-
-  size_t _recordingBufferSizeIn10MS;
-  size_t _recordingFramesIn10MS;
-  size_t _playoutFramesIn10MS;
-
-  // TODO(pbos): Make plain members instead of pointers and stop resetting them.
-  std::unique_ptr<rtc::PlatformThread> _ptrThreadRec;
-  std::unique_ptr<rtc::PlatformThread> _ptrThreadPlay;
-
-  bool _playing;
-  bool _recording;
-  int64_t _lastCallPlayoutMillis;
-  int64_t _lastCallRecordMillis;
-
-  FileWrapper& _outputFile;
-  FileWrapper& _inputFile;
-  std::string _outputFilename;
-  std::string _inputFilename;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_AUDIO_DEVICE_FILE_AUDIO_DEVICE_H
diff --git a/modules/audio_device/dummy/file_audio_device_factory.cc b/modules/audio_device/dummy/file_audio_device_factory.cc
deleted file mode 100644
index 9aeba20..0000000
--- a/modules/audio_device/dummy/file_audio_device_factory.cc
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- *  Copyright (c) 2014 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_device/dummy/file_audio_device_factory.h"
-
-#include <cstdlib>
-#include <cstring>
-
-#include "webrtc/modules/audio_device/dummy/file_audio_device.h"
-#include "webrtc/rtc_base/logging.h"
-
-namespace webrtc {
-
-bool FileAudioDeviceFactory::_isConfigured = false;
-char FileAudioDeviceFactory::_inputAudioFilename[MAX_FILENAME_LEN] = "";
-char FileAudioDeviceFactory::_outputAudioFilename[MAX_FILENAME_LEN] = "";
-
-FileAudioDevice* FileAudioDeviceFactory::CreateFileAudioDevice(
-    const int32_t id) {
-  // Bail out here if the files haven't been set explicitly.
-  // audio_device_impl.cc should then fall back to dummy audio.
-  if (!_isConfigured) {
-    LOG(LS_WARNING) << "WebRTC configured with WEBRTC_DUMMY_FILE_DEVICES but "
-                    << "no device files supplied. Will fall back to dummy "
-                    << "audio.";
-
-    return nullptr;
-  }
-  return new FileAudioDevice(id, _inputAudioFilename, _outputAudioFilename);
-}
-
-void FileAudioDeviceFactory::SetFilenamesToUse(
-    const char* inputAudioFilename, const char* outputAudioFilename) {
-#ifdef WEBRTC_DUMMY_FILE_DEVICES
-  RTC_DCHECK_LT(strlen(inputAudioFilename), MAX_FILENAME_LEN);
-  RTC_DCHECK_LT(strlen(outputAudioFilename), MAX_FILENAME_LEN);
-
-  // Copy the strings since we don't know the lifetime of the input pointers.
-  strncpy(_inputAudioFilename, inputAudioFilename, MAX_FILENAME_LEN);
-  strncpy(_outputAudioFilename, outputAudioFilename, MAX_FILENAME_LEN);
-  _isConfigured = true;
-#else
-  // Sanity: must be compiled with the right define to run this.
-  printf("Trying to use dummy file devices, but is not compiled "
-         "with WEBRTC_DUMMY_FILE_DEVICES. Bailing out.\n");
-  std::exit(1);
-#endif
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_device/dummy/file_audio_device_factory.h b/modules/audio_device/dummy/file_audio_device_factory.h
deleted file mode 100644
index 6763e02..0000000
--- a/modules/audio_device/dummy/file_audio_device_factory.h
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- *  Copyright (c) 2014 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_AUDIO_DEVICE_FILE_AUDIO_DEVICE_FACTORY_H
-#define WEBRTC_AUDIO_DEVICE_FILE_AUDIO_DEVICE_FACTORY_H
-
-#include "webrtc/common_types.h"
-
-namespace webrtc {
-
-class FileAudioDevice;
-
-// This class is used by audio_device_impl.cc when WebRTC is compiled with
-// WEBRTC_DUMMY_FILE_DEVICES. The application must include this file and set the
-// filenames to use before the audio device module is initialized. This is
-// intended for test tools which use the audio device module.
-class FileAudioDeviceFactory {
- public:
-  static FileAudioDevice* CreateFileAudioDevice(const int32_t id);
-
-  // The input file must be a readable 48k stereo raw file. The output
-  // file must be writable. The strings will be copied.
-  static void SetFilenamesToUse(const char* inputAudioFilename,
-                                const char* outputAudioFilename);
-
- private:
-  enum : uint32_t { MAX_FILENAME_LEN = 512 };
-  static bool _isConfigured;
-  static char _inputAudioFilename[MAX_FILENAME_LEN];
-  static char _outputAudioFilename[MAX_FILENAME_LEN];
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_AUDIO_DEVICE_FILE_AUDIO_DEVICE_FACTORY_H
diff --git a/modules/audio_device/fine_audio_buffer.cc b/modules/audio_device/fine_audio_buffer.cc
deleted file mode 100644
index 8487210..0000000
--- a/modules/audio_device/fine_audio_buffer.cc
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- *  Copyright (c) 2013 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_device/fine_audio_buffer.h"
-
-#include <memory.h>
-#include <stdio.h>
-#include <algorithm>
-
-#include "webrtc/modules/audio_device/audio_device_buffer.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-
-namespace webrtc {
-
-FineAudioBuffer::FineAudioBuffer(AudioDeviceBuffer* device_buffer,
-                                 int sample_rate,
-                                 size_t capacity)
-    : device_buffer_(device_buffer),
-      sample_rate_(sample_rate),
-      samples_per_10_ms_(static_cast<size_t>(sample_rate_ * 10 / 1000)),
-      bytes_per_10_ms_(samples_per_10_ms_ * sizeof(int16_t)),
-      playout_buffer_(0, capacity),
-      record_buffer_(0, capacity) {
-  LOG(INFO) << "samples_per_10_ms_:" << samples_per_10_ms_;
-}
-
-FineAudioBuffer::~FineAudioBuffer() {}
-
-void FineAudioBuffer::ResetPlayout() {
-  playout_buffer_.Clear();
-}
-
-void FineAudioBuffer::ResetRecord() {
-  record_buffer_.Clear();
-}
-
-void FineAudioBuffer::GetPlayoutData(rtc::ArrayView<int8_t> audio_buffer) {
-  // Ask WebRTC for new data in chunks of 10ms until we have enough to
-  // fulfill the request. It is possible that the buffer already contains
-  // enough samples from the last round.
-  const size_t num_bytes = audio_buffer.size();
-  while (playout_buffer_.size() < num_bytes) {
-    // Get 10ms decoded audio from WebRTC.
-    device_buffer_->RequestPlayoutData(samples_per_10_ms_);
-    // Append |bytes_per_10_ms_| elements to the end of the buffer.
-    const size_t bytes_written = playout_buffer_.AppendData(
-        bytes_per_10_ms_, [&](rtc::ArrayView<int8_t> buf) {
-          const size_t samples_per_channel =
-              device_buffer_->GetPlayoutData(buf.data());
-          // TODO(henrika): this class is only used on mobile devices and is
-          // currently limited to mono. Modifications are needed for stereo.
-          return sizeof(int16_t) * samples_per_channel;
-        });
-    RTC_DCHECK_EQ(bytes_per_10_ms_, bytes_written);
-  }
-  // Provide the requested number of bytes to the consumer.
-  memcpy(audio_buffer.data(), playout_buffer_.data(), num_bytes);
-  // Move remaining samples to start of buffer to prepare for next round.
-  memmove(playout_buffer_.data(), playout_buffer_.data() + num_bytes,
-          playout_buffer_.size() - num_bytes);
-  playout_buffer_.SetSize(playout_buffer_.size() - num_bytes);
-}
-
-void FineAudioBuffer::DeliverRecordedData(
-    rtc::ArrayView<const int8_t> audio_buffer,
-    int playout_delay_ms,
-    int record_delay_ms) {
-  // Always append new data and grow the buffer if needed.
-  record_buffer_.AppendData(audio_buffer.data(), audio_buffer.size());
-  // Consume samples from buffer in chunks of 10ms until there is not
-  // enough data left. The number of remaining bytes in the cache is given by
-  // the new size of the buffer.
-  while (record_buffer_.size() >= bytes_per_10_ms_) {
-    device_buffer_->SetRecordedBuffer(record_buffer_.data(),
-                                      samples_per_10_ms_);
-    device_buffer_->SetVQEData(playout_delay_ms, record_delay_ms, 0);
-    device_buffer_->DeliverRecordedData();
-    memmove(record_buffer_.data(), record_buffer_.data() + bytes_per_10_ms_,
-            record_buffer_.size() - bytes_per_10_ms_);
-    record_buffer_.SetSize(record_buffer_.size() - bytes_per_10_ms_);
-  }
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_device/fine_audio_buffer.h b/modules/audio_device/fine_audio_buffer.h
deleted file mode 100644
index df806db..0000000
--- a/modules/audio_device/fine_audio_buffer.h
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- *  Copyright (c) 2013 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_DEVICE_FINE_AUDIO_BUFFER_H_
-#define WEBRTC_MODULES_AUDIO_DEVICE_FINE_AUDIO_BUFFER_H_
-
-#include <memory>
-
-#include "webrtc/api/array_view.h"
-#include "webrtc/rtc_base/buffer.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-class AudioDeviceBuffer;
-
-// FineAudioBuffer takes an AudioDeviceBuffer (ADB) which deals with audio data
-// corresponding to 10ms of data. It then allows for this data to be pulled in
-// a finer or coarser granularity. I.e. interacting with this class instead of
-// directly with the AudioDeviceBuffer one can ask for any number of audio data
-// samples. This class also ensures that audio data can be delivered to the ADB
-// in 10ms chunks when the size of the provided audio buffers differs from 10ms.
-// As an example: calling DeliverRecordedData() with 5ms buffers will deliver
-// accumulated 10ms worth of data to the ADB every second call.
-// TODO(henrika): add support for stereo when mobile platforms need it.
-class FineAudioBuffer {
- public:
-  // |device_buffer| is a buffer that provides 10ms of audio data.
-  // |sample_rate| is the sample rate of the audio data. This is needed because
-  // |device_buffer| delivers 10ms of data. Given the sample rate the number
-  // of samples can be calculated. The |capacity| ensures that the buffer size
-  // can be increased to at least capacity without further reallocation.
-  FineAudioBuffer(AudioDeviceBuffer* device_buffer,
-                  int sample_rate,
-                  size_t capacity);
-  ~FineAudioBuffer();
-
-  // Clears buffers and counters dealing with playour and/or recording.
-  void ResetPlayout();
-  void ResetRecord();
-
-  // Copies audio samples into |audio_buffer| where number of requested
-  // elements is specified by |audio_buffer.size()|. The producer will always
-  // fill up the audio buffer and if no audio exists, the buffer will contain
-  // silence instead.
-  void GetPlayoutData(rtc::ArrayView<int8_t> audio_buffer);
-
-  // Consumes the audio data in |audio_buffer| and sends it to the WebRTC layer
-  // in chunks of 10ms. The provided delay estimates in |playout_delay_ms| and
-  // |record_delay_ms| are given to the AEC in the audio processing module.
-  // They can be fixed values on most platforms and they are ignored if an
-  // external (hardware/built-in) AEC is used.
-  // Example: buffer size is 5ms => call #1 stores 5ms of data, call #2 stores
-  // 5ms of data and sends a total of 10ms to WebRTC and clears the intenal
-  // cache. Call #3 restarts the scheme above.
-  void DeliverRecordedData(rtc::ArrayView<const int8_t> audio_buffer,
-                           int playout_delay_ms,
-                           int record_delay_ms);
-
- private:
-  // Device buffer that works with 10ms chunks of data both for playout and
-  // for recording. I.e., the WebRTC side will always be asked for audio to be
-  // played out in 10ms chunks and recorded audio will be sent to WebRTC in
-  // 10ms chunks as well. This pointer is owned by the constructor of this
-  // class and the owner must ensure that the pointer is valid during the life-
-  // time of this object.
-  AudioDeviceBuffer* const device_buffer_;
-  // Sample rate in Hertz.
-  const int sample_rate_;
-  // Number of audio samples per 10ms.
-  const size_t samples_per_10_ms_;
-  // Number of audio bytes per 10ms.
-  const size_t bytes_per_10_ms_;
-  // Storage for output samples from which a consumer can read audio buffers
-  // in any size using GetPlayoutData().
-  rtc::BufferT<int8_t> playout_buffer_;
-  // Storage for input samples that are about to be delivered to the WebRTC
-  // ADB or remains from the last successful delivery of a 10ms audio buffer.
-  rtc::BufferT<int8_t> record_buffer_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_DEVICE_FINE_AUDIO_BUFFER_H_
diff --git a/modules/audio_device/fine_audio_buffer_unittest.cc b/modules/audio_device/fine_audio_buffer_unittest.cc
deleted file mode 100644
index ada14e0..0000000
--- a/modules/audio_device/fine_audio_buffer_unittest.cc
+++ /dev/null
@@ -1,145 +0,0 @@
-/*
- *  Copyright (c) 2013 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_device/fine_audio_buffer.h"
-
-#include <limits.h>
-#include <memory>
-
-#include "webrtc/api/array_view.h"
-#include "webrtc/modules/audio_device/mock_audio_device_buffer.h"
-#include "webrtc/test/gmock.h"
-#include "webrtc/test/gtest.h"
-
-using ::testing::_;
-using ::testing::AtLeast;
-using ::testing::InSequence;
-using ::testing::Return;
-
-namespace webrtc {
-
-const int kSampleRate = 44100;
-const int kSamplesPer10Ms = kSampleRate * 10 / 1000;
-
-// The fake audio data is 0,1,..SCHAR_MAX-1,0,1,... This is to make it easy
-// to detect errors. This function verifies that the buffers contain such data.
-// E.g. if there are two buffers of size 3, buffer 1 would contain 0,1,2 and
-// buffer 2 would contain 3,4,5. Note that SCHAR_MAX is 127 so wrap-around
-// will happen.
-// |buffer| is the audio buffer to verify.
-bool VerifyBuffer(const int8_t* buffer, int buffer_number, int size) {
-  int start_value = (buffer_number * size) % SCHAR_MAX;
-  for (int i = 0; i < size; ++i) {
-    if (buffer[i] != (i + start_value) % SCHAR_MAX) {
-      return false;
-    }
-  }
-  return true;
-}
-
-// This function replaces the real AudioDeviceBuffer::GetPlayoutData when it's
-// called (which is done implicitly when calling GetBufferData). It writes the
-// sequence 0,1,..SCHAR_MAX-1,0,1,... to the buffer. Note that this is likely a
-// buffer of different size than the one VerifyBuffer verifies.
-// |iteration| is the number of calls made to UpdateBuffer prior to this call.
-// |samples_per_10_ms| is the number of samples that should be written to the
-// buffer (|arg0|).
-ACTION_P2(UpdateBuffer, iteration, samples_per_10_ms) {
-  int8_t* buffer = static_cast<int8_t*>(arg0);
-  int bytes_per_10_ms = samples_per_10_ms * static_cast<int>(sizeof(int16_t));
-  int start_value = (iteration * bytes_per_10_ms) % SCHAR_MAX;
-  for (int i = 0; i < bytes_per_10_ms; ++i) {
-    buffer[i] = (i + start_value) % SCHAR_MAX;
-  }
-  return samples_per_10_ms;
-}
-
-// Writes a periodic ramp pattern to the supplied |buffer|. See UpdateBuffer()
-// for details.
-void UpdateInputBuffer(int8_t* buffer, int iteration, int size) {
-  int start_value = (iteration * size) % SCHAR_MAX;
-  for (int i = 0; i < size; ++i) {
-    buffer[i] = (i + start_value) % SCHAR_MAX;
-  }
-}
-
-// Action macro which verifies that the recorded 10ms chunk of audio data
-// (in |arg0|) contains the correct reference values even if they have been
-// supplied using a buffer size that is smaller or larger than 10ms.
-// See VerifyBuffer() for details.
-ACTION_P2(VerifyInputBuffer, iteration, samples_per_10_ms) {
-  const int8_t* buffer = static_cast<const int8_t*>(arg0);
-  int bytes_per_10_ms = samples_per_10_ms * static_cast<int>(sizeof(int16_t));
-  int start_value = (iteration * bytes_per_10_ms) % SCHAR_MAX;
-  for (int i = 0; i < bytes_per_10_ms; ++i) {
-    EXPECT_EQ(buffer[i], (i + start_value) % SCHAR_MAX);
-  }
-  return 0;
-}
-
-void RunFineBufferTest(int frame_size_in_samples) {
-  const int kFrameSizeBytes =
-      frame_size_in_samples * static_cast<int>(sizeof(int16_t));
-  const int kNumberOfFrames = 5;
-  // Ceiling of integer division: 1 + ((x - 1) / y)
-  const int kNumberOfUpdateBufferCalls =
-      1 + ((kNumberOfFrames * frame_size_in_samples - 1) / kSamplesPer10Ms);
-
-  MockAudioDeviceBuffer audio_device_buffer;
-  EXPECT_CALL(audio_device_buffer, RequestPlayoutData(_))
-      .WillRepeatedly(Return(kSamplesPer10Ms));
-  {
-    InSequence s;
-    for (int i = 0; i < kNumberOfUpdateBufferCalls; ++i) {
-      EXPECT_CALL(audio_device_buffer, GetPlayoutData(_))
-          .WillOnce(UpdateBuffer(i, kSamplesPer10Ms))
-          .RetiresOnSaturation();
-    }
-  }
-  {
-    InSequence s;
-    for (int j = 0; j < kNumberOfUpdateBufferCalls - 1; ++j) {
-      EXPECT_CALL(audio_device_buffer, SetRecordedBuffer(_, kSamplesPer10Ms))
-          .WillOnce(VerifyInputBuffer(j, kSamplesPer10Ms))
-          .RetiresOnSaturation();
-    }
-  }
-  EXPECT_CALL(audio_device_buffer, SetVQEData(_, _, _))
-      .Times(kNumberOfUpdateBufferCalls - 1);
-  EXPECT_CALL(audio_device_buffer, DeliverRecordedData())
-      .Times(kNumberOfUpdateBufferCalls - 1)
-      .WillRepeatedly(Return(kSamplesPer10Ms));
-
-  FineAudioBuffer fine_buffer(&audio_device_buffer, kSampleRate,
-                              kFrameSizeBytes);
-  std::unique_ptr<int8_t[]> out_buffer(new int8_t[kFrameSizeBytes]);
-  std::unique_ptr<int8_t[]> in_buffer(new int8_t[kFrameSizeBytes]);
-
-  for (int i = 0; i < kNumberOfFrames; ++i) {
-    fine_buffer.GetPlayoutData(
-        rtc::ArrayView<int8_t>(out_buffer.get(), kFrameSizeBytes));
-    EXPECT_TRUE(VerifyBuffer(out_buffer.get(), i, kFrameSizeBytes));
-    UpdateInputBuffer(in_buffer.get(), i, kFrameSizeBytes);
-    fine_buffer.DeliverRecordedData(
-        rtc::ArrayView<const int8_t>(in_buffer.get(), kFrameSizeBytes), 0, 0);
-  }
-}
-
-TEST(FineBufferTest, BufferLessThan10ms) {
-  const int kFrameSizeSamples = kSamplesPer10Ms - 50;
-  RunFineBufferTest(kFrameSizeSamples);
-}
-
-TEST(FineBufferTest, GreaterThan10ms) {
-  const int kFrameSizeSamples = kSamplesPer10Ms + 50;
-  RunFineBufferTest(kFrameSizeSamples);
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_device/include/audio_device.h b/modules/audio_device/include/audio_device.h
deleted file mode 100644
index 8a27c15..0000000
--- a/modules/audio_device/include/audio_device.h
+++ /dev/null
@@ -1,182 +0,0 @@
-/*
- *  Copyright (c) 2012 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 MODULES_AUDIO_DEVICE_INCLUDE_AUDIO_DEVICE_H_
-#define MODULES_AUDIO_DEVICE_INCLUDE_AUDIO_DEVICE_H_
-
-#include "webrtc/modules/audio_device/include/audio_device_defines.h"
-#include "webrtc/modules/include/module.h"
-#include "webrtc/rtc_base/scoped_ref_ptr.h"
-
-namespace webrtc {
-
-class AudioDeviceModule : public RefCountedModule {
- public:
-  enum ErrorCode {
-    kAdmErrNone = 0,
-    kAdmErrArgument = 1
-  };
-
-  enum AudioLayer {
-    kPlatformDefaultAudio = 0,
-    kWindowsCoreAudio = 2,
-    kLinuxAlsaAudio = 3,
-    kLinuxPulseAudio = 4,
-    kAndroidJavaAudio = 5,
-    kAndroidOpenSLESAudio = 6,
-    kAndroidJavaInputAndOpenSLESOutputAudio = 7,
-    kDummyAudio = 8
-  };
-
-  enum WindowsDeviceType {
-    kDefaultCommunicationDevice = -1,
-    kDefaultDevice = -2
-  };
-
-  enum ChannelType {
-    kChannelLeft = 0,
-    kChannelRight = 1,
-    kChannelBoth = 2
-  };
-
- public:
-  // Create an ADM.
-  static rtc::scoped_refptr<AudioDeviceModule> Create(
-      const int32_t id,
-      const AudioLayer audio_layer);
-
-  // Retrieve the currently utilized audio layer
-  virtual int32_t ActiveAudioLayer(AudioLayer* audioLayer) const = 0;
-
-  // Error handling
-  virtual ErrorCode LastError() const = 0;
-  virtual int32_t RegisterEventObserver(AudioDeviceObserver* eventCallback) = 0;
-
-  // Full-duplex transportation of PCM audio
-  virtual int32_t RegisterAudioCallback(AudioTransport* audioCallback) = 0;
-
-  // Main initialization and termination
-  virtual int32_t Init() = 0;
-  virtual int32_t Terminate() = 0;
-  virtual bool Initialized() const = 0;
-
-  // Device enumeration
-  virtual int16_t PlayoutDevices() = 0;
-  virtual int16_t RecordingDevices() = 0;
-  virtual int32_t PlayoutDeviceName(uint16_t index,
-                                    char name[kAdmMaxDeviceNameSize],
-                                    char guid[kAdmMaxGuidSize]) = 0;
-  virtual int32_t RecordingDeviceName(uint16_t index,
-                                      char name[kAdmMaxDeviceNameSize],
-                                      char guid[kAdmMaxGuidSize]) = 0;
-
-  // Device selection
-  virtual int32_t SetPlayoutDevice(uint16_t index) = 0;
-  virtual int32_t SetPlayoutDevice(WindowsDeviceType device) = 0;
-  virtual int32_t SetRecordingDevice(uint16_t index) = 0;
-  virtual int32_t SetRecordingDevice(WindowsDeviceType device) = 0;
-
-  // Audio transport initialization
-  virtual int32_t PlayoutIsAvailable(bool* available) = 0;
-  virtual int32_t InitPlayout() = 0;
-  virtual bool PlayoutIsInitialized() const = 0;
-  virtual int32_t RecordingIsAvailable(bool* available) = 0;
-  virtual int32_t InitRecording() = 0;
-  virtual bool RecordingIsInitialized() const = 0;
-
-  // Audio transport control
-  virtual int32_t StartPlayout() = 0;
-  virtual int32_t StopPlayout() = 0;
-  virtual bool Playing() const = 0;
-  virtual int32_t StartRecording() = 0;
-  virtual int32_t StopRecording() = 0;
-  virtual bool Recording() const = 0;
-
-  // Microphone Automatic Gain Control (AGC)
-  virtual int32_t SetAGC(bool enable) = 0;
-  virtual bool AGC() const = 0;
-
-  // Audio mixer initialization
-  virtual int32_t InitSpeaker() = 0;
-  virtual bool SpeakerIsInitialized() const = 0;
-  virtual int32_t InitMicrophone() = 0;
-  virtual bool MicrophoneIsInitialized() const = 0;
-
-  // Speaker volume controls
-  virtual int32_t SpeakerVolumeIsAvailable(bool* available) = 0;
-  virtual int32_t SetSpeakerVolume(uint32_t volume) = 0;
-  virtual int32_t SpeakerVolume(uint32_t* volume) const = 0;
-  virtual int32_t MaxSpeakerVolume(uint32_t* maxVolume) const = 0;
-  virtual int32_t MinSpeakerVolume(uint32_t* minVolume) const = 0;
-
-  // Microphone volume controls
-  virtual int32_t MicrophoneVolumeIsAvailable(bool* available) = 0;
-  virtual int32_t SetMicrophoneVolume(uint32_t volume) = 0;
-  virtual int32_t MicrophoneVolume(uint32_t* volume) const = 0;
-  virtual int32_t MaxMicrophoneVolume(uint32_t* maxVolume) const = 0;
-  virtual int32_t MinMicrophoneVolume(uint32_t* minVolume) const = 0;
-
-  // Speaker mute control
-  virtual int32_t SpeakerMuteIsAvailable(bool* available) = 0;
-  virtual int32_t SetSpeakerMute(bool enable) = 0;
-  virtual int32_t SpeakerMute(bool* enabled) const = 0;
-
-  // Microphone mute control
-  virtual int32_t MicrophoneMuteIsAvailable(bool* available) = 0;
-  virtual int32_t SetMicrophoneMute(bool enable) = 0;
-  virtual int32_t MicrophoneMute(bool* enabled) const = 0;
-
-  // Stereo support
-  virtual int32_t StereoPlayoutIsAvailable(bool* available) const = 0;
-  virtual int32_t SetStereoPlayout(bool enable) = 0;
-  virtual int32_t StereoPlayout(bool* enabled) const = 0;
-  virtual int32_t StereoRecordingIsAvailable(bool* available) const = 0;
-  virtual int32_t SetStereoRecording(bool enable) = 0;
-  virtual int32_t StereoRecording(bool* enabled) const = 0;
-  virtual int32_t SetRecordingChannel(const ChannelType channel) = 0;
-  virtual int32_t RecordingChannel(ChannelType* channel) const = 0;
-
-  // Delay information and control
-  virtual int32_t PlayoutDelay(uint16_t* delayMS) const = 0;
-  virtual int32_t RecordingDelay(uint16_t* delayMS) const = 0;
-
-  // Native sample rate controls (samples/sec)
-  virtual int32_t SetRecordingSampleRate(const uint32_t samplesPerSec) = 0;
-  virtual int32_t RecordingSampleRate(uint32_t* samplesPerSec) const = 0;
-  virtual int32_t SetPlayoutSampleRate(const uint32_t samplesPerSec) = 0;
-  virtual int32_t PlayoutSampleRate(uint32_t* samplesPerSec) const = 0;
-
-  // Mobile device specific functions
-  virtual int32_t SetLoudspeakerStatus(bool enable) = 0;
-  virtual int32_t GetLoudspeakerStatus(bool* enabled) const = 0;
-
-  // Only supported on Android.
-  virtual bool BuiltInAECIsAvailable() const = 0;
-  virtual bool BuiltInAGCIsAvailable() const = 0;
-  virtual bool BuiltInNSIsAvailable() const = 0;
-
-  // Enables the built-in audio effects. Only supported on Android.
-  virtual int32_t EnableBuiltInAEC(bool enable) = 0;
-  virtual int32_t EnableBuiltInAGC(bool enable) = 0;
-  virtual int32_t EnableBuiltInNS(bool enable) = 0;
-
-// Only supported on iOS.
-#if defined(WEBRTC_IOS)
-  virtual int GetPlayoutAudioParameters(AudioParameters* params) const = 0;
-  virtual int GetRecordAudioParameters(AudioParameters* params) const = 0;
-#endif  // WEBRTC_IOS
-
- protected:
-  ~AudioDeviceModule() override {}
-};
-
-}  // namespace webrtc
-
-#endif  // MODULES_AUDIO_DEVICE_INCLUDE_AUDIO_DEVICE_H_
diff --git a/modules/audio_device/include/audio_device_data_observer.h b/modules/audio_device/include/audio_device_data_observer.h
deleted file mode 100644
index e96720c..0000000
--- a/modules/audio_device/include/audio_device_data_observer.h
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- *  Copyright (c) 2017 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_DEVICE_INCLUDE_AUDIO_DEVICE_DATA_OBSERVER_H_
-#define WEBRTC_MODULES_AUDIO_DEVICE_INCLUDE_AUDIO_DEVICE_DATA_OBSERVER_H_
-
-#include "webrtc/modules/audio_device/include/audio_device.h"
-#include "webrtc/rtc_base/scoped_ref_ptr.h"
-
-namespace webrtc {
-
-// This interface will capture the raw PCM data of both the local captured as
-// well as the mixed/rendered remote audio.
-class AudioDeviceDataObserver {
- public:
-  virtual void OnCaptureData(const void* audio_samples,
-                             const size_t num_samples,
-                             const size_t bytes_per_sample,
-                             const size_t num_channels,
-                             const uint32_t samples_per_sec) = 0;
-
-  virtual void OnRenderData(const void* audio_samples,
-                            const size_t num_samples,
-                            const size_t bytes_per_sample,
-                            const size_t num_channels,
-                            const uint32_t samples_per_sec) = 0;
-
-  AudioDeviceDataObserver() = default;
-  virtual ~AudioDeviceDataObserver() = default;
-};
-
-// Creates an ADM instance with AudioDeviceDataObserver registered.
-rtc::scoped_refptr<AudioDeviceModule> CreateAudioDeviceWithDataObserver(
-    const int32_t id,
-    const AudioDeviceModule::AudioLayer audio_layer,
-    AudioDeviceDataObserver* observer);
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_DEVICE_INCLUDE_AUDIO_DEVICE_DATA_OBSERVER_H_
diff --git a/modules/audio_device/include/audio_device_defines.h b/modules/audio_device/include/audio_device_defines.h
deleted file mode 100644
index ccc263c..0000000
--- a/modules/audio_device/include/audio_device_defines.h
+++ /dev/null
@@ -1,168 +0,0 @@
-/*
- *  Copyright (c) 2011 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_DEVICE_INCLUDE_AUDIO_DEVICE_DEFINES_H_
-#define WEBRTC_MODULES_AUDIO_DEVICE_INCLUDE_AUDIO_DEVICE_DEFINES_H_
-
-#include <stddef.h>
-
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-static const int kAdmMaxDeviceNameSize = 128;
-static const int kAdmMaxFileNameSize = 512;
-static const int kAdmMaxGuidSize = 128;
-
-static const int kAdmMinPlayoutBufferSizeMs = 10;
-static const int kAdmMaxPlayoutBufferSizeMs = 250;
-
-// ----------------------------------------------------------------------------
-//  AudioDeviceObserver
-// ----------------------------------------------------------------------------
-
-class AudioDeviceObserver {
- public:
-  enum ErrorCode { kRecordingError = 0, kPlayoutError = 1 };
-  enum WarningCode { kRecordingWarning = 0, kPlayoutWarning = 1 };
-
-  virtual void OnErrorIsReported(const ErrorCode error) = 0;
-  virtual void OnWarningIsReported(const WarningCode warning) = 0;
-
- protected:
-  virtual ~AudioDeviceObserver() {}
-};
-
-// ----------------------------------------------------------------------------
-//  AudioTransport
-// ----------------------------------------------------------------------------
-
-class AudioTransport {
- public:
-  virtual int32_t RecordedDataIsAvailable(const void* audioSamples,
-                                          const size_t nSamples,
-                                          const size_t nBytesPerSample,
-                                          const size_t nChannels,
-                                          const uint32_t samplesPerSec,
-                                          const uint32_t totalDelayMS,
-                                          const int32_t clockDrift,
-                                          const uint32_t currentMicLevel,
-                                          const bool keyPressed,
-                                          uint32_t& newMicLevel) = 0;
-
-  virtual int32_t NeedMorePlayData(const size_t nSamples,
-                                   const size_t nBytesPerSample,
-                                   const size_t nChannels,
-                                   const uint32_t samplesPerSec,
-                                   void* audioSamples,
-                                   size_t& nSamplesOut,
-                                   int64_t* elapsed_time_ms,
-                                   int64_t* ntp_time_ms) = 0;
-
-  // Method to push the captured audio data to the specific VoE channel.
-  // The data will not undergo audio processing.
-  // |voe_channel| is the id of the VoE channel which is the sink to the
-  // capture data.
-  virtual void PushCaptureData(int voe_channel,
-                               const void* audio_data,
-                               int bits_per_sample,
-                               int sample_rate,
-                               size_t number_of_channels,
-                               size_t number_of_frames) = 0;
-
-  // Method to pull mixed render audio data from all active VoE channels.
-  // The data will not be passed as reference for audio processing internally.
-  // TODO(xians): Support getting the unmixed render data from specific VoE
-  // channel.
-  virtual void PullRenderData(int bits_per_sample,
-                              int sample_rate,
-                              size_t number_of_channels,
-                              size_t number_of_frames,
-                              void* audio_data,
-                              int64_t* elapsed_time_ms,
-                              int64_t* ntp_time_ms) = 0;
-
- protected:
-  virtual ~AudioTransport() {}
-};
-
-// Helper class for storage of fundamental audio parameters such as sample rate,
-// number of channels, native buffer size etc.
-// Note that one audio frame can contain more than one channel sample and each
-// sample is assumed to be a 16-bit PCM sample. Hence, one audio frame in
-// stereo contains 2 * (16/8) = 4 bytes of data.
-class AudioParameters {
- public:
-  // This implementation does only support 16-bit PCM samples.
-  static const size_t kBitsPerSample = 16;
-  AudioParameters()
-      : sample_rate_(0),
-        channels_(0),
-        frames_per_buffer_(0),
-        frames_per_10ms_buffer_(0) {}
-  AudioParameters(int sample_rate, size_t channels, size_t frames_per_buffer)
-      : sample_rate_(sample_rate),
-        channels_(channels),
-        frames_per_buffer_(frames_per_buffer),
-        frames_per_10ms_buffer_(static_cast<size_t>(sample_rate / 100)) {}
-  void reset(int sample_rate, size_t channels, size_t frames_per_buffer) {
-    sample_rate_ = sample_rate;
-    channels_ = channels;
-    frames_per_buffer_ = frames_per_buffer;
-    frames_per_10ms_buffer_ = static_cast<size_t>(sample_rate / 100);
-  }
-  size_t bits_per_sample() const { return kBitsPerSample; }
-  void reset(int sample_rate, size_t channels, double ms_per_buffer) {
-    reset(sample_rate, channels,
-          static_cast<size_t>(sample_rate * ms_per_buffer + 0.5));
-  }
-  void reset(int sample_rate, size_t channels) {
-    reset(sample_rate, channels, static_cast<size_t>(0));
-  }
-  int sample_rate() const { return sample_rate_; }
-  size_t channels() const { return channels_; }
-  size_t frames_per_buffer() const { return frames_per_buffer_; }
-  size_t frames_per_10ms_buffer() const { return frames_per_10ms_buffer_; }
-  size_t GetBytesPerFrame() const { return channels_ * kBitsPerSample / 8; }
-  size_t GetBytesPerBuffer() const {
-    return frames_per_buffer_ * GetBytesPerFrame();
-  }
-  // The WebRTC audio device buffer (ADB) only requires that the sample rate
-  // and number of channels are configured. Hence, to be "valid", only these
-  // two attributes must be set.
-  bool is_valid() const { return ((sample_rate_ > 0) && (channels_ > 0)); }
-  // Most platforms also require that a native buffer size is defined.
-  // An audio parameter instance is considered to be "complete" if it is both
-  // "valid" (can be used by the ADB) and also has a native frame size.
-  bool is_complete() const { return (is_valid() && (frames_per_buffer_ > 0)); }
-  size_t GetBytesPer10msBuffer() const {
-    return frames_per_10ms_buffer_ * GetBytesPerFrame();
-  }
-  double GetBufferSizeInMilliseconds() const {
-    if (sample_rate_ == 0)
-      return 0.0;
-    return frames_per_buffer_ / (sample_rate_ / 1000.0);
-  }
-  double GetBufferSizeInSeconds() const {
-    if (sample_rate_ == 0)
-      return 0.0;
-    return static_cast<double>(frames_per_buffer_) / (sample_rate_);
-  }
-
- private:
-  int sample_rate_;
-  size_t channels_;
-  size_t frames_per_buffer_;
-  size_t frames_per_10ms_buffer_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_DEVICE_INCLUDE_AUDIO_DEVICE_DEFINES_H_
diff --git a/modules/audio_device/include/fake_audio_device.h b/modules/audio_device/include/fake_audio_device.h
deleted file mode 100644
index 8b38088..0000000
--- a/modules/audio_device/include/fake_audio_device.h
+++ /dev/null
@@ -1,156 +0,0 @@
-/*
- *  Copyright (c) 2013 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_DEVICE_INCLUDE_FAKE_AUDIO_DEVICE_H_
-#define WEBRTC_MODULES_AUDIO_DEVICE_INCLUDE_FAKE_AUDIO_DEVICE_H_
-
-#include "webrtc/modules/audio_device/include/audio_device.h"
-
-namespace webrtc {
-
-class FakeAudioDeviceModule : public AudioDeviceModule {
- public:
-  FakeAudioDeviceModule() {}
-  virtual ~FakeAudioDeviceModule() {}
-  virtual int32_t AddRef() const { return 0; }
-  virtual int32_t Release() const { return 0; }
-
- private:
-  virtual int32_t RegisterEventObserver(AudioDeviceObserver* eventCallback) {
-    return 0;
-  }
-  virtual int32_t RegisterAudioCallback(AudioTransport* audioCallback) {
-    return 0;
-  }
-  virtual int32_t Init() { return 0; }
-  virtual int32_t InitSpeaker() { return 0; }
-  virtual int32_t SetPlayoutDevice(uint16_t index) { return 0; }
-  virtual int32_t SetPlayoutDevice(WindowsDeviceType device) { return 0; }
-  virtual int32_t SetStereoPlayout(bool enable) { return 0; }
-  virtual int32_t StopPlayout() { return 0; }
-  virtual int32_t InitMicrophone() { return 0; }
-  virtual int32_t SetRecordingDevice(uint16_t index) { return 0; }
-  virtual int32_t SetRecordingDevice(WindowsDeviceType device) { return 0; }
-  virtual int32_t SetStereoRecording(bool enable) { return 0; }
-  virtual int32_t SetAGC(bool enable) { return 0; }
-  virtual int32_t StopRecording() { return 0; }
-
-  // If the subclass doesn't override the ProcessThread implementation,
-  // we'll fall back on an implementation that doesn't eat too much CPU.
-  virtual int64_t TimeUntilNextProcess() {
-    if (turn_off_module_callbacks_)
-      return 7 * 24 * 60 * 60 * 1000;  // call me next week.
-    uses_default_module_implementation_ = true;
-    return 10;
-  }
-
-  virtual void Process() {
-    turn_off_module_callbacks_ = uses_default_module_implementation_;
-  }
-
-  virtual int32_t Terminate() { return 0; }
-
-  virtual int32_t ActiveAudioLayer(AudioLayer* audioLayer) const { return 0; }
-  virtual ErrorCode LastError() const { return kAdmErrNone; }
-  virtual bool Initialized() const { return true; }
-  virtual int16_t PlayoutDevices() { return 0; }
-  virtual int16_t RecordingDevices() { return 0; }
-  virtual int32_t PlayoutDeviceName(uint16_t index,
-                            char name[kAdmMaxDeviceNameSize],
-                            char guid[kAdmMaxGuidSize]) {
-    return 0;
-  }
-  virtual int32_t RecordingDeviceName(uint16_t index,
-                              char name[kAdmMaxDeviceNameSize],
-                              char guid[kAdmMaxGuidSize]) {
-    return 0;
-  }
-  virtual int32_t PlayoutIsAvailable(bool* available) { return 0; }
-  virtual int32_t InitPlayout() { return 0; }
-  virtual bool PlayoutIsInitialized() const { return true; }
-  virtual int32_t RecordingIsAvailable(bool* available) { return 0; }
-  virtual int32_t InitRecording() { return 0; }
-  virtual bool RecordingIsInitialized() const { return true; }
-  virtual int32_t StartPlayout() { return 0; }
-  virtual bool Playing() const { return false; }
-  virtual int32_t StartRecording() { return 0; }
-  virtual bool Recording() const { return false; }
-  virtual bool AGC() const { return true; }
-  virtual bool SpeakerIsInitialized() const { return true; }
-  virtual bool MicrophoneIsInitialized() const { return true; }
-  virtual int32_t SpeakerVolumeIsAvailable(bool* available) { return 0; }
-  virtual int32_t SetSpeakerVolume(uint32_t volume) { return 0; }
-  virtual int32_t SpeakerVolume(uint32_t* volume) const { return 0; }
-  virtual int32_t MaxSpeakerVolume(uint32_t* maxVolume) const { return 0; }
-  virtual int32_t MinSpeakerVolume(uint32_t* minVolume) const { return 0; }
-  virtual int32_t MicrophoneVolumeIsAvailable(bool* available) { return 0; }
-  virtual int32_t SetMicrophoneVolume(uint32_t volume) { return 0; }
-  virtual int32_t MicrophoneVolume(uint32_t* volume) const { return 0; }
-  virtual int32_t MaxMicrophoneVolume(uint32_t* maxVolume) const { return 0; }
-  virtual int32_t MinMicrophoneVolume(uint32_t* minVolume) const { return 0; }
-  virtual int32_t SpeakerMuteIsAvailable(bool* available) { return 0; }
-  virtual int32_t SetSpeakerMute(bool enable) { return 0; }
-  virtual int32_t SpeakerMute(bool* enabled) const { return 0; }
-  virtual int32_t MicrophoneMuteIsAvailable(bool* available) { return 0; }
-  virtual int32_t SetMicrophoneMute(bool enable) { return 0; }
-  virtual int32_t MicrophoneMute(bool* enabled) const { return 0; }
-  virtual int32_t StereoPlayoutIsAvailable(bool* available) const {
-    *available = false;
-    return 0;
-  }
-  virtual int32_t StereoPlayout(bool* enabled) const { return 0; }
-  virtual int32_t StereoRecordingIsAvailable(bool* available) const {
-    *available = false;
-    return 0;
-  }
-  virtual int32_t StereoRecording(bool* enabled) const { return 0; }
-  virtual int32_t SetRecordingChannel(const ChannelType channel) { return 0; }
-  virtual int32_t RecordingChannel(ChannelType* channel) const { return 0; }
-  virtual int32_t PlayoutDelay(uint16_t* delayMS) const {
-    *delayMS = 0;
-    return 0;
-  }
-  virtual int32_t RecordingDelay(uint16_t* delayMS) const { return 0; }
-  virtual int32_t SetRecordingSampleRate(const uint32_t samplesPerSec) {
-    return 0;
-  }
-  virtual int32_t RecordingSampleRate(uint32_t* samplesPerSec) const {
-    return 0;
-  }
-  virtual int32_t SetPlayoutSampleRate(const uint32_t samplesPerSec) {
-    return 0;
-  }
-  virtual int32_t PlayoutSampleRate(uint32_t* samplesPerSec) const { return 0; }
-  virtual int32_t SetLoudspeakerStatus(bool enable) { return 0; }
-  virtual int32_t GetLoudspeakerStatus(bool* enabled) const { return 0; }
-  virtual bool BuiltInAECIsAvailable() const { return false; }
-  virtual int32_t EnableBuiltInAEC(bool enable) { return -1; }
-  virtual bool BuiltInAGCIsAvailable() const { return false; }
-  virtual int32_t EnableBuiltInAGC(bool enable) { return -1; }
-  virtual bool BuiltInNSIsAvailable() const { return false; }
-  virtual int32_t EnableBuiltInNS(bool enable) { return -1; }
-
-#if defined(WEBRTC_IOS)
-  virtual int GetPlayoutAudioParameters(AudioParameters* params) const {
-    return -1;
-  }
-  virtual int GetRecordAudioParameters(AudioParameters* params) const {
-    return -1;
-  }
-#endif  // WEBRTC_IOS
-
- private:
-  bool uses_default_module_implementation_ = false;
-  bool turn_off_module_callbacks_ = false;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_DEVICE_INCLUDE_FAKE_AUDIO_DEVICE_H_
diff --git a/modules/audio_device/include/mock_audio_device.h b/modules/audio_device/include/mock_audio_device.h
deleted file mode 100644
index 1b80f7e..0000000
--- a/modules/audio_device/include/mock_audio_device.h
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- *  Copyright (c) 2015 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_DEVICE_INCLUDE_MOCK_AUDIO_DEVICE_H_
-#define WEBRTC_MODULES_AUDIO_DEVICE_INCLUDE_MOCK_AUDIO_DEVICE_H_
-
-#include <string>
-
-#include "webrtc/modules/audio_device/include/audio_device.h"
-#include "webrtc/test/gmock.h"
-
-namespace webrtc {
-namespace test {
-
-class MockAudioDeviceModule : public AudioDeviceModule {
- public:
-  // Module.
-  MOCK_METHOD0(TimeUntilNextProcess, int64_t());
-  MOCK_METHOD0(Process, void());
-  MOCK_METHOD1(ProcessThreadAttached, void(ProcessThread*));
-  // RefCountedModule.
-  MOCK_CONST_METHOD0(AddRef, int32_t());
-  MOCK_CONST_METHOD0(Release, int32_t());
-  // AudioDeviceModule.
-  MOCK_CONST_METHOD1(ActiveAudioLayer, int32_t(AudioLayer* audioLayer));
-  MOCK_CONST_METHOD0(LastError, ErrorCode());
-  MOCK_METHOD1(RegisterEventObserver,
-               int32_t(AudioDeviceObserver* eventCallback));
-  MOCK_METHOD1(RegisterAudioCallback, int32_t(AudioTransport* audioCallback));
-  MOCK_METHOD0(Init, int32_t());
-  MOCK_METHOD0(Terminate, int32_t());
-  MOCK_CONST_METHOD0(Initialized, bool());
-  MOCK_METHOD0(PlayoutDevices, int16_t());
-  MOCK_METHOD0(RecordingDevices, int16_t());
-  MOCK_METHOD3(PlayoutDeviceName, int32_t(uint16_t index,
-                                          char name[kAdmMaxDeviceNameSize],
-                                          char guid[kAdmMaxGuidSize]));
-  MOCK_METHOD3(RecordingDeviceName, int32_t(uint16_t index,
-                                            char name[kAdmMaxDeviceNameSize],
-                                            char guid[kAdmMaxGuidSize]));
-  MOCK_METHOD1(SetPlayoutDevice, int32_t(uint16_t index));
-  MOCK_METHOD1(SetPlayoutDevice, int32_t(WindowsDeviceType device));
-  MOCK_METHOD1(SetRecordingDevice, int32_t(uint16_t index));
-  MOCK_METHOD1(SetRecordingDevice, int32_t(WindowsDeviceType device));
-  MOCK_METHOD1(PlayoutIsAvailable, int32_t(bool* available));
-  MOCK_METHOD0(InitPlayout, int32_t());
-  MOCK_CONST_METHOD0(PlayoutIsInitialized, bool());
-  MOCK_METHOD1(RecordingIsAvailable, int32_t(bool* available));
-  MOCK_METHOD0(InitRecording, int32_t());
-  MOCK_CONST_METHOD0(RecordingIsInitialized, bool());
-  MOCK_METHOD0(StartPlayout, int32_t());
-  MOCK_METHOD0(StopPlayout, int32_t());
-  MOCK_CONST_METHOD0(Playing, bool());
-  MOCK_METHOD0(StartRecording, int32_t());
-  MOCK_METHOD0(StopRecording, int32_t());
-  MOCK_CONST_METHOD0(Recording, bool());
-  MOCK_METHOD1(SetAGC, int32_t(bool enable));
-  MOCK_CONST_METHOD0(AGC, bool());
-  MOCK_METHOD0(InitSpeaker, int32_t());
-  MOCK_CONST_METHOD0(SpeakerIsInitialized, bool());
-  MOCK_METHOD0(InitMicrophone, int32_t());
-  MOCK_CONST_METHOD0(MicrophoneIsInitialized, bool());
-  MOCK_METHOD1(SpeakerVolumeIsAvailable, int32_t(bool* available));
-  MOCK_METHOD1(SetSpeakerVolume, int32_t(uint32_t volume));
-  MOCK_CONST_METHOD1(SpeakerVolume, int32_t(uint32_t* volume));
-  MOCK_CONST_METHOD1(MaxSpeakerVolume, int32_t(uint32_t* maxVolume));
-  MOCK_CONST_METHOD1(MinSpeakerVolume, int32_t(uint32_t* minVolume));
-  MOCK_METHOD1(MicrophoneVolumeIsAvailable, int32_t(bool* available));
-  MOCK_METHOD1(SetMicrophoneVolume, int32_t(uint32_t volume));
-  MOCK_CONST_METHOD1(MicrophoneVolume, int32_t(uint32_t* volume));
-  MOCK_CONST_METHOD1(MaxMicrophoneVolume, int32_t(uint32_t* maxVolume));
-  MOCK_CONST_METHOD1(MinMicrophoneVolume, int32_t(uint32_t* minVolume));
-  MOCK_METHOD1(SpeakerMuteIsAvailable, int32_t(bool* available));
-  MOCK_METHOD1(SetSpeakerMute, int32_t(bool enable));
-  MOCK_CONST_METHOD1(SpeakerMute, int32_t(bool* enabled));
-  MOCK_METHOD1(MicrophoneMuteIsAvailable, int32_t(bool* available));
-  MOCK_METHOD1(SetMicrophoneMute, int32_t(bool enable));
-  MOCK_CONST_METHOD1(MicrophoneMute, int32_t(bool* enabled));
-  MOCK_CONST_METHOD1(StereoPlayoutIsAvailable, int32_t(bool* available));
-  MOCK_METHOD1(SetStereoPlayout, int32_t(bool enable));
-  MOCK_CONST_METHOD1(StereoPlayout, int32_t(bool* enabled));
-  MOCK_CONST_METHOD1(StereoRecordingIsAvailable, int32_t(bool* available));
-  MOCK_METHOD1(SetStereoRecording, int32_t(bool enable));
-  MOCK_CONST_METHOD1(StereoRecording, int32_t(bool* enabled));
-  MOCK_METHOD1(SetRecordingChannel, int32_t(const ChannelType channel));
-  MOCK_CONST_METHOD1(RecordingChannel, int32_t(ChannelType* channel));
-  MOCK_CONST_METHOD1(PlayoutDelay, int32_t(uint16_t* delayMS));
-  MOCK_CONST_METHOD1(RecordingDelay, int32_t(uint16_t* delayMS));
-  MOCK_METHOD1(SetRecordingSampleRate, int32_t(const uint32_t samplesPerSec));
-  MOCK_CONST_METHOD1(RecordingSampleRate, int32_t(uint32_t* samplesPerSec));
-  MOCK_METHOD1(SetPlayoutSampleRate, int32_t(const uint32_t samplesPerSec));
-  MOCK_CONST_METHOD1(PlayoutSampleRate, int32_t(uint32_t* samplesPerSec));
-  MOCK_METHOD1(SetLoudspeakerStatus, int32_t(bool enable));
-  MOCK_CONST_METHOD1(GetLoudspeakerStatus, int32_t(bool* enabled));
-  MOCK_CONST_METHOD0(BuiltInAECIsAvailable, bool());
-  MOCK_CONST_METHOD0(BuiltInAGCIsAvailable, bool());
-  MOCK_CONST_METHOD0(BuiltInNSIsAvailable, bool());
-  MOCK_METHOD1(EnableBuiltInAEC, int32_t(bool enable));
-  MOCK_METHOD1(EnableBuiltInAGC, int32_t(bool enable));
-  MOCK_METHOD1(EnableBuiltInNS, int32_t(bool enable));
-#if defined(WEBRTC_IOS)
-  MOCK_CONST_METHOD1(GetPlayoutAudioParameters, int(AudioParameters* params));
-  MOCK_CONST_METHOD1(GetRecordAudioParameters, int(AudioParameters* params));
-#endif  // WEBRTC_IOS
-};
-}  // namespace test
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_DEVICE_INCLUDE_MOCK_AUDIO_DEVICE_H_
diff --git a/modules/audio_device/include/mock_audio_transport.h b/modules/audio_device/include/mock_audio_transport.h
deleted file mode 100644
index a05e7ea..0000000
--- a/modules/audio_device/include/mock_audio_transport.h
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- *  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_DEVICE_INCLUDE_MOCK_AUDIO_TRANSPORT_H_
-#define WEBRTC_MODULES_AUDIO_DEVICE_INCLUDE_MOCK_AUDIO_TRANSPORT_H_
-
-#include "webrtc/modules/audio_device/include/audio_device_defines.h"
-#include "webrtc/test/gmock.h"
-
-namespace webrtc {
-namespace test {
-
-class MockAudioTransport : public AudioTransport {
- public:
-  MockAudioTransport() {}
-  ~MockAudioTransport() {}
-
-  MOCK_METHOD10(RecordedDataIsAvailable,
-                int32_t(const void* audioSamples,
-                        const size_t nSamples,
-                        const size_t nBytesPerSample,
-                        const size_t nChannels,
-                        const uint32_t samplesPerSec,
-                        const uint32_t totalDelayMS,
-                        const int32_t clockDrift,
-                        const uint32_t currentMicLevel,
-                        const bool keyPressed,
-                        uint32_t& newMicLevel));
-
-  MOCK_METHOD8(NeedMorePlayData,
-               int32_t(const size_t nSamples,
-                       const size_t nBytesPerSample,
-                       const size_t nChannels,
-                       const uint32_t samplesPerSec,
-                       void* audioSamples,
-                       size_t& nSamplesOut,
-                       int64_t* elapsed_time_ms,
-                       int64_t* ntp_time_ms));
-
-  MOCK_METHOD6(PushCaptureData,
-               void(int voe_channel,
-                    const void* audio_data,
-                    int bits_per_sample,
-                    int sample_rate,
-                    size_t number_of_channels,
-                    size_t number_of_frames));
-
-  MOCK_METHOD7(PullRenderData,
-               void(int bits_per_sample,
-                    int sample_rate,
-                    size_t number_of_channels,
-                    size_t number_of_frames,
-                    void* audio_data,
-                    int64_t* elapsed_time_ms,
-                    int64_t* ntp_time_ms));
-};
-
-}  // namespace test
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_DEVICE_INCLUDE_MOCK_AUDIO_TRANSPORT_H_
diff --git a/modules/audio_device/ios/audio_device_ios.h b/modules/audio_device/ios/audio_device_ios.h
deleted file mode 100644
index 2067d88..0000000
--- a/modules/audio_device/ios/audio_device_ios.h
+++ /dev/null
@@ -1,307 +0,0 @@
-/*
- *  Copyright (c) 2012 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_DEVICE_IOS_AUDIO_DEVICE_IOS_H_
-#define WEBRTC_MODULES_AUDIO_DEVICE_IOS_AUDIO_DEVICE_IOS_H_
-
-#include <memory>
-
-#include "webrtc/sdk/objc/Framework/Headers/WebRTC/RTCMacros.h"
-#include "webrtc/modules/audio_device/audio_device_generic.h"
-#include "webrtc/modules/audio_device/ios/audio_session_observer.h"
-#include "webrtc/modules/audio_device/ios/voice_processing_audio_unit.h"
-#include "webrtc/rtc_base/buffer.h"
-#include "webrtc/rtc_base/gtest_prod_util.h"
-#include "webrtc/rtc_base/thread.h"
-#include "webrtc/rtc_base/thread_annotations.h"
-#include "webrtc/rtc_base/thread_checker.h"
-
-RTC_FWD_DECL_OBJC_CLASS(RTCAudioSessionDelegateAdapter);
-
-namespace webrtc {
-
-class FineAudioBuffer;
-
-// Implements full duplex 16-bit mono PCM audio support for iOS using a
-// Voice-Processing (VP) I/O audio unit in Core Audio. The VP I/O audio unit
-// supports audio echo cancellation. It also adds automatic gain control,
-// adjustment of voice-processing quality and muting.
-//
-// An instance must be created and destroyed on one and the same thread.
-// All supported public methods must also be called on the same thread.
-// A thread checker will RTC_DCHECK if any supported method is called on an
-// invalid thread.
-//
-// Recorded audio will be delivered on a real-time internal I/O thread in the
-// audio unit. The audio unit will also ask for audio data to play out on this
-// same thread.
-class AudioDeviceIOS : public AudioDeviceGeneric,
-                       public AudioSessionObserver,
-                       public VoiceProcessingAudioUnitObserver,
-                       public rtc::MessageHandler {
- public:
-  AudioDeviceIOS();
-  ~AudioDeviceIOS();
-
-  void AttachAudioBuffer(AudioDeviceBuffer* audioBuffer) override;
-
-  InitStatus Init() override;
-  int32_t Terminate() override;
-  bool Initialized() const override;
-
-  int32_t InitPlayout() override;
-  bool PlayoutIsInitialized() const override;
-
-  int32_t InitRecording() override;
-  bool RecordingIsInitialized() const override;
-
-  int32_t StartPlayout() override;
-  int32_t StopPlayout() override;
-  bool Playing() const override { return playing_; }
-
-  int32_t StartRecording() override;
-  int32_t StopRecording() override;
-  bool Recording() const override { return recording_; }
-
-  int32_t SetLoudspeakerStatus(bool enable) override;
-  int32_t GetLoudspeakerStatus(bool& enabled) const override;
-
-  // These methods returns hard-coded delay values and not dynamic delay
-  // estimates. The reason is that iOS supports a built-in AEC and the WebRTC
-  // AEC will always be disabled in the Libjingle layer to avoid running two
-  // AEC implementations at the same time. And, it saves resources to avoid
-  // updating these delay values continuously.
-  // TODO(henrika): it would be possible to mark these two methods as not
-  // implemented since they are only called for A/V-sync purposes today and
-  // A/V-sync is not supported on iOS. However, we avoid adding error messages
-  // the log by using these dummy implementations instead.
-  int32_t PlayoutDelay(uint16_t& delayMS) const override;
-  int32_t RecordingDelay(uint16_t& delayMS) const override;
-
-  // Native audio parameters stored during construction.
-  // These methods are unique for the iOS implementation.
-  int GetPlayoutAudioParameters(AudioParameters* params) const override;
-  int GetRecordAudioParameters(AudioParameters* params) const override;
-
-  // These methods are currently not fully implemented on iOS:
-
-  // See audio_device_not_implemented.cc for trivial implementations.
-  int32_t ActiveAudioLayer(
-      AudioDeviceModule::AudioLayer& audioLayer) const override;
-  int32_t PlayoutIsAvailable(bool& available) override;
-  int32_t RecordingIsAvailable(bool& available) override;
-  int32_t SetAGC(bool enable) override;
-  bool AGC() const override;
-  int16_t PlayoutDevices() override;
-  int16_t RecordingDevices() override;
-  int32_t PlayoutDeviceName(uint16_t index,
-                            char name[kAdmMaxDeviceNameSize],
-                            char guid[kAdmMaxGuidSize]) override;
-  int32_t RecordingDeviceName(uint16_t index,
-                              char name[kAdmMaxDeviceNameSize],
-                              char guid[kAdmMaxGuidSize]) override;
-  int32_t SetPlayoutDevice(uint16_t index) override;
-  int32_t SetPlayoutDevice(
-      AudioDeviceModule::WindowsDeviceType device) override;
-  int32_t SetRecordingDevice(uint16_t index) override;
-  int32_t SetRecordingDevice(
-      AudioDeviceModule::WindowsDeviceType device) override;
-  int32_t InitSpeaker() override;
-  bool SpeakerIsInitialized() const override;
-  int32_t InitMicrophone() override;
-  bool MicrophoneIsInitialized() const override;
-  int32_t SpeakerVolumeIsAvailable(bool& available) override;
-  int32_t SetSpeakerVolume(uint32_t volume) override;
-  int32_t SpeakerVolume(uint32_t& volume) const override;
-  int32_t MaxSpeakerVolume(uint32_t& maxVolume) const override;
-  int32_t MinSpeakerVolume(uint32_t& minVolume) const override;
-  int32_t MicrophoneVolumeIsAvailable(bool& available) override;
-  int32_t SetMicrophoneVolume(uint32_t volume) override;
-  int32_t MicrophoneVolume(uint32_t& volume) const override;
-  int32_t MaxMicrophoneVolume(uint32_t& maxVolume) const override;
-  int32_t MinMicrophoneVolume(uint32_t& minVolume) const override;
-  int32_t MicrophoneMuteIsAvailable(bool& available) override;
-  int32_t SetMicrophoneMute(bool enable) override;
-  int32_t MicrophoneMute(bool& enabled) const override;
-  int32_t SpeakerMuteIsAvailable(bool& available) override;
-  int32_t SetSpeakerMute(bool enable) override;
-  int32_t SpeakerMute(bool& enabled) const override;
-  int32_t StereoPlayoutIsAvailable(bool& available) override;
-  int32_t SetStereoPlayout(bool enable) override;
-  int32_t StereoPlayout(bool& enabled) const override;
-  int32_t StereoRecordingIsAvailable(bool& available) override;
-  int32_t SetStereoRecording(bool enable) override;
-  int32_t StereoRecording(bool& enabled) const override;
-  bool PlayoutWarning() const override;
-  bool PlayoutError() const override;
-  bool RecordingWarning() const override;
-  bool RecordingError() const override;
-  void ClearPlayoutWarning() override {}
-  void ClearPlayoutError() override {}
-  void ClearRecordingWarning() override {}
-  void ClearRecordingError() override {}
-
-  // AudioSessionObserver methods. May be called from any thread.
-  void OnInterruptionBegin() override;
-  void OnInterruptionEnd() override;
-  void OnValidRouteChange() override;
-  void OnCanPlayOrRecordChange(bool can_play_or_record) override;
-  void OnChangedOutputVolume() override;
-
-  // VoiceProcessingAudioUnitObserver methods.
-  OSStatus OnDeliverRecordedData(AudioUnitRenderActionFlags* flags,
-                                 const AudioTimeStamp* time_stamp,
-                                 UInt32 bus_number,
-                                 UInt32 num_frames,
-                                 AudioBufferList* io_data) override;
-  OSStatus OnGetPlayoutData(AudioUnitRenderActionFlags* flags,
-                            const AudioTimeStamp* time_stamp,
-                            UInt32 bus_number,
-                            UInt32 num_frames,
-                            AudioBufferList* io_data) override;
-
-  // Handles messages from posts.
-  void OnMessage(rtc::Message *msg) override;
-
- private:
-  // Called by the relevant AudioSessionObserver methods on |thread_|.
-  void HandleInterruptionBegin();
-  void HandleInterruptionEnd();
-  void HandleValidRouteChange();
-  void HandleCanPlayOrRecordChange(bool can_play_or_record);
-  void HandleSampleRateChange(float sample_rate);
-  void HandlePlayoutGlitchDetected();
-  void HandleOutputVolumeChange();
-
-  // Uses current |playout_parameters_| and |record_parameters_| to inform the
-  // audio device buffer (ADB) about our internal audio parameters.
-  void UpdateAudioDeviceBuffer();
-
-  // Since the preferred audio parameters are only hints to the OS, the actual
-  // values may be different once the AVAudioSession has been activated.
-  // This method asks for the current hardware parameters and takes actions
-  // if they should differ from what we have asked for initially. It also
-  // defines |playout_parameters_| and |record_parameters_|.
-  void SetupAudioBuffersForActiveAudioSession();
-
-  // Creates the audio unit.
-  bool CreateAudioUnit();
-
-  // Updates the audio unit state based on current state.
-  void UpdateAudioUnit(bool can_play_or_record);
-
-  // Configures the audio session for WebRTC.
-  bool ConfigureAudioSession();
-  // Unconfigures the audio session.
-  void UnconfigureAudioSession();
-
-  // Activates our audio session, creates and initializes the voice-processing
-  // audio unit and verifies that we got the preferred native audio parameters.
-  bool InitPlayOrRecord();
-
-  // Closes and deletes the voice-processing I/O unit.
-  void ShutdownPlayOrRecord();
-
-  // Ensures that methods are called from the same thread as this object is
-  // created on.
-  rtc::ThreadChecker thread_checker_;
-
-  // Native I/O audio thread checker.
-  rtc::ThreadChecker io_thread_checker_;
-
-  // Thread that this object is created on.
-  rtc::Thread* thread_;
-
-  // Raw pointer handle provided to us in AttachAudioBuffer(). Owned by the
-  // AudioDeviceModuleImpl class and called by AudioDeviceModule::Create().
-  // The AudioDeviceBuffer is a member of the AudioDeviceModuleImpl instance
-  // and therefore outlives this object.
-  AudioDeviceBuffer* audio_device_buffer_;
-
-  // Contains audio parameters (sample rate, #channels, buffer size etc.) for
-  // the playout and recording sides. These structure is set in two steps:
-  // first, native sample rate and #channels are defined in Init(). Next, the
-  // audio session is activated and we verify that the preferred parameters
-  // were granted by the OS. At this stage it is also possible to add a third
-  // component to the parameters; the native I/O buffer duration.
-  // A RTC_CHECK will be hit if we for some reason fail to open an audio session
-  // using the specified parameters.
-  AudioParameters playout_parameters_;
-  AudioParameters record_parameters_;
-
-  // The AudioUnit used to play and record audio.
-  std::unique_ptr<VoiceProcessingAudioUnit> audio_unit_;
-
-  // FineAudioBuffer takes an AudioDeviceBuffer which delivers audio data
-  // in chunks of 10ms. It then allows for this data to be pulled in
-  // a finer or coarser granularity. I.e. interacting with this class instead
-  // of directly with the AudioDeviceBuffer one can ask for any number of
-  // audio data samples. Is also supports a similar scheme for the recording
-  // side.
-  // Example: native buffer size can be 128 audio frames at 16kHz sample rate.
-  // WebRTC will provide 480 audio frames per 10ms but iOS asks for 128
-  // in each callback (one every 8ms). This class can then ask for 128 and the
-  // FineAudioBuffer will ask WebRTC for new data only when needed and also
-  // cache non-utilized audio between callbacks. On the recording side, iOS
-  // can provide audio data frames of size 128 and these are accumulated until
-  // enough data to supply one 10ms call exists. This 10ms chunk is then sent
-  // to WebRTC and the remaining part is stored.
-  std::unique_ptr<FineAudioBuffer> fine_audio_buffer_;
-
-  // Temporary storage for recorded data. AudioUnitRender() renders into this
-  // array as soon as a frame of the desired buffer size has been recorded.
-  // On real iOS devices, the size will be fixed and set once. For iOS
-  // simulators, the size can vary from callback to callback and the size
-  // will be changed dynamically to account for this behavior.
-  rtc::BufferT<int8_t> record_audio_buffer_;
-
-  // Set to 1 when recording is active and 0 otherwise.
-  volatile int recording_;
-
-  // Set to 1 when playout is active and 0 otherwise.
-  volatile int playing_;
-
-  // Set to true after successful call to Init(), false otherwise.
-  bool initialized_ RTC_ACCESS_ON(thread_checker_);
-
-  // Set to true after successful call to InitRecording() or InitPlayout(),
-  // false otherwise.
-  bool audio_is_initialized_;
-
-  // Set to true if audio session is interrupted, false otherwise.
-  bool is_interrupted_;
-
-  // Audio interruption observer instance.
-  RTCAudioSessionDelegateAdapter* audio_session_observer_
-      RTC_ACCESS_ON(thread_checker_);
-
-  // Set to true if we've activated the audio session.
-  bool has_configured_session_ RTC_ACCESS_ON(thread_checker_);
-
-  // Counts number of detected audio glitches on the playout side.
-  int64_t num_detected_playout_glitches_ RTC_ACCESS_ON(thread_checker_);
-  int64_t last_playout_time_ RTC_ACCESS_ON(io_thread_checker_);
-
-  // Counts number of playout callbacks per call.
-  // The value isupdated on the native I/O thread and later read on the
-  // creating thread (see thread_checker_) but at this stage no audio is
-  // active. Hence, it is a "thread safe" design and no lock is needed.
-  int64_t num_playout_callbacks_;
-
-  // Contains the time for when the last output volume change was detected.
-  int64_t last_output_volume_change_time_ RTC_ACCESS_ON(thread_checker_);
-
-  // Exposes private members for testing purposes only.
-  FRIEND_TEST_ALL_PREFIXES(AudioDeviceTest, testInterruptedAudioSession);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_DEVICE_IOS_AUDIO_DEVICE_IOS_H_
diff --git a/modules/audio_device/ios/audio_device_ios.mm b/modules/audio_device/ios/audio_device_ios.mm
deleted file mode 100644
index 81558b5..0000000
--- a/modules/audio_device/ios/audio_device_ios.mm
+++ /dev/null
@@ -1,964 +0,0 @@
-/*
- *  Copyright (c) 2012 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.
- */
-
-#import <AVFoundation/AVFoundation.h>
-#import <Foundation/Foundation.h>
-
-#include "webrtc/modules/audio_device/ios/audio_device_ios.h"
-
-#include <cmath>
-
-#include "webrtc/api/array_view.h"
-#include "webrtc/modules/audio_device/fine_audio_buffer.h"
-#include "webrtc/rtc_base/atomicops.h"
-#include "webrtc/rtc_base/bind.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/thread.h"
-#include "webrtc/rtc_base/thread_annotations.h"
-#include "webrtc/rtc_base/timeutils.h"
-#include "webrtc/sdk/objc/Framework/Classes/Common/helpers.h"
-#include "webrtc/system_wrappers/include/metrics.h"
-
-#import "WebRTC/RTCLogging.h"
-#import "webrtc/modules/audio_device/ios/objc/RTCAudioSessionDelegateAdapter.h"
-#import "webrtc/sdk/objc/Framework/Classes/Audio/RTCAudioSession+Private.h"
-#import "webrtc/sdk/objc/Framework/Headers/WebRTC/RTCAudioSession.h"
-#import "webrtc/sdk/objc/Framework/Headers/WebRTC/RTCAudioSessionConfiguration.h"
-
-
-namespace webrtc {
-
-#define LOGI() LOG(LS_INFO) << "AudioDeviceIOS::"
-
-#define LOG_AND_RETURN_IF_ERROR(error, message) \
-  do {                                          \
-    OSStatus err = error;                       \
-    if (err) {                                  \
-      LOG(LS_ERROR) << message << ": " << err;  \
-      return false;                             \
-    }                                           \
-  } while (0)
-
-#define LOG_IF_ERROR(error, message)           \
-  do {                                         \
-    OSStatus err = error;                      \
-    if (err) {                                 \
-      LOG(LS_ERROR) << message << ": " << err; \
-    }                                          \
-  } while (0)
-
-
-// Hardcoded delay estimates based on real measurements.
-// TODO(henrika): these value is not used in combination with built-in AEC.
-// Can most likely be removed.
-const UInt16 kFixedPlayoutDelayEstimate = 30;
-const UInt16 kFixedRecordDelayEstimate = 30;
-
-enum AudioDeviceMessageType : uint32_t {
-  kMessageTypeInterruptionBegin,
-  kMessageTypeInterruptionEnd,
-  kMessageTypeValidRouteChange,
-  kMessageTypeCanPlayOrRecordChange,
-  kMessageTypePlayoutGlitchDetected,
-  kMessageOutputVolumeChange,
-};
-
-using ios::CheckAndLogError;
-
-#if !defined(NDEBUG)
-// Returns true when the code runs on a device simulator.
-static bool DeviceIsSimulator() {
-  return ios::GetDeviceName() == "x86_64";
-}
-
-// Helper method that logs essential device information strings.
-static void LogDeviceInfo() {
-  LOG(LS_INFO) << "LogDeviceInfo";
-  @autoreleasepool {
-    LOG(LS_INFO) << " system name: " << ios::GetSystemName();
-    LOG(LS_INFO) << " system version 1(2): " << ios::GetSystemVersionAsString();
-    LOG(LS_INFO) << " system version 2(2): " << ios::GetSystemVersion();
-    LOG(LS_INFO) << " device type: " << ios::GetDeviceType();
-    LOG(LS_INFO) << " device name: " << ios::GetDeviceName();
-    LOG(LS_INFO) << " process name: " << ios::GetProcessName();
-    LOG(LS_INFO) << " process ID: " << ios::GetProcessID();
-    LOG(LS_INFO) << " OS version: " << ios::GetOSVersionString();
-    LOG(LS_INFO) << " processing cores: " << ios::GetProcessorCount();
-#if defined(__IPHONE_9_0) && defined(__IPHONE_OS_VERSION_MAX_ALLOWED) \
-    && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_9_0
-    LOG(LS_INFO) << " low power mode: " << ios::GetLowPowerModeEnabled();
-#endif
-#if TARGET_IPHONE_SIMULATOR
-    LOG(LS_INFO) << " TARGET_IPHONE_SIMULATOR is defined";
-#endif
-    LOG(LS_INFO) << " DeviceIsSimulator: " << DeviceIsSimulator();
-  }
-}
-#endif  // !defined(NDEBUG)
-
-AudioDeviceIOS::AudioDeviceIOS()
-    : audio_device_buffer_(nullptr),
-      audio_unit_(nullptr),
-      recording_(0),
-      playing_(0),
-      initialized_(false),
-      audio_is_initialized_(false),
-      is_interrupted_(false),
-      has_configured_session_(false),
-      num_detected_playout_glitches_(0),
-      last_playout_time_(0),
-      num_playout_callbacks_(0),
-      last_output_volume_change_time_(0) {
-  LOGI() << "ctor" << ios::GetCurrentThreadDescription();
-  io_thread_checker_.DetachFromThread();
-  thread_ = rtc::Thread::Current();
-  audio_session_observer_ =
-      [[RTCAudioSessionDelegateAdapter alloc] initWithObserver:this];
-}
-
-AudioDeviceIOS::~AudioDeviceIOS() {
-  LOGI() << "~dtor" << ios::GetCurrentThreadDescription();
-  audio_session_observer_ = nil;
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  Terminate();
-}
-
-void AudioDeviceIOS::AttachAudioBuffer(AudioDeviceBuffer* audioBuffer) {
-  LOGI() << "AttachAudioBuffer";
-  RTC_DCHECK(audioBuffer);
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  audio_device_buffer_ = audioBuffer;
-}
-
-AudioDeviceGeneric::InitStatus AudioDeviceIOS::Init() {
-  LOGI() << "Init";
-  RTC_DCHECK_RUN_ON(&thread_checker_);
-  if (initialized_) {
-    return InitStatus::OK;
-  }
-#if !defined(NDEBUG)
-  LogDeviceInfo();
-#endif
-  // Store the preferred sample rate and preferred number of channels already
-  // here. They have not been set and confirmed yet since configureForWebRTC
-  // is not called until audio is about to start. However, it makes sense to
-  // store the parameters now and then verify at a later stage.
-  RTCAudioSessionConfiguration* config =
-      [RTCAudioSessionConfiguration webRTCConfiguration];
-  playout_parameters_.reset(config.sampleRate,
-                            config.outputNumberOfChannels);
-  record_parameters_.reset(config.sampleRate,
-                           config.inputNumberOfChannels);
-  // Ensure that the audio device buffer (ADB) knows about the internal audio
-  // parameters. Note that, even if we are unable to get a mono audio session,
-  // we will always tell the I/O audio unit to do a channel format conversion
-  // to guarantee mono on the "input side" of the audio unit.
-  UpdateAudioDeviceBuffer();
-  initialized_ = true;
-  return InitStatus::OK;
-}
-
-int32_t AudioDeviceIOS::Terminate() {
-  LOGI() << "Terminate";
-  RTC_DCHECK_RUN_ON(&thread_checker_);
-  if (!initialized_) {
-    return 0;
-  }
-  StopPlayout();
-  StopRecording();
-  initialized_ = false;
-  return 0;
-}
-
-bool AudioDeviceIOS::Initialized() const {
-  RTC_DCHECK_RUN_ON(&thread_checker_);
-  return initialized_;
-}
-
-int32_t AudioDeviceIOS::InitPlayout() {
-  LOGI() << "InitPlayout";
-  RTC_DCHECK_RUN_ON(&thread_checker_);
-  RTC_DCHECK(initialized_);
-  RTC_DCHECK(!audio_is_initialized_);
-  RTC_DCHECK(!playing_);
-  if (!audio_is_initialized_) {
-    if (!InitPlayOrRecord()) {
-      LOG_F(LS_ERROR) << "InitPlayOrRecord failed for InitPlayout!";
-      return -1;
-    }
-  }
-  audio_is_initialized_ = true;
-  return 0;
-}
-
-bool AudioDeviceIOS::PlayoutIsInitialized() const {
-  RTC_DCHECK_RUN_ON(&thread_checker_);
-  return audio_is_initialized_;
-}
-
-bool AudioDeviceIOS::RecordingIsInitialized() const {
-  RTC_DCHECK_RUN_ON(&thread_checker_);
-  return audio_is_initialized_;
-}
-
-int32_t AudioDeviceIOS::InitRecording() {
-  LOGI() << "InitRecording";
-  RTC_DCHECK_RUN_ON(&thread_checker_);
-  RTC_DCHECK(initialized_);
-  RTC_DCHECK(!audio_is_initialized_);
-  RTC_DCHECK(!recording_);
-  if (!audio_is_initialized_) {
-    if (!InitPlayOrRecord()) {
-      LOG_F(LS_ERROR) << "InitPlayOrRecord failed for InitRecording!";
-      return -1;
-    }
-  }
-  audio_is_initialized_ = true;
-  return 0;
-}
-
-int32_t AudioDeviceIOS::StartPlayout() {
-  LOGI() << "StartPlayout";
-  RTC_DCHECK_RUN_ON(&thread_checker_);
-  RTC_DCHECK(audio_is_initialized_);
-  RTC_DCHECK(!playing_);
-  RTC_DCHECK(audio_unit_);
-  if (fine_audio_buffer_) {
-    fine_audio_buffer_->ResetPlayout();
-  }
-  if (!recording_ &&
-      audio_unit_->GetState() == VoiceProcessingAudioUnit::kInitialized) {
-    if (!audio_unit_->Start()) {
-      RTCLogError(@"StartPlayout failed to start audio unit.");
-      return -1;
-    }
-    LOG(LS_INFO) << "Voice-Processing I/O audio unit is now started";
-  }
-  rtc::AtomicOps::ReleaseStore(&playing_, 1);
-  num_playout_callbacks_ = 0;
-  num_detected_playout_glitches_ = 0;
-  return 0;
-}
-
-int32_t AudioDeviceIOS::StopPlayout() {
-  LOGI() << "StopPlayout";
-  RTC_DCHECK_RUN_ON(&thread_checker_);
-  if (!audio_is_initialized_ || !playing_) {
-    return 0;
-  }
-  if (!recording_) {
-    ShutdownPlayOrRecord();
-    audio_is_initialized_ = false;
-  }
-  rtc::AtomicOps::ReleaseStore(&playing_, 0);
-
-  // Derive average number of calls to OnGetPlayoutData() between detected
-  // audio glitches and add the result to a histogram.
-  int average_number_of_playout_callbacks_between_glitches = 100000;
-  RTC_DCHECK_GE(num_playout_callbacks_, num_detected_playout_glitches_);
-  if (num_detected_playout_glitches_ > 0) {
-    average_number_of_playout_callbacks_between_glitches =
-        num_playout_callbacks_ / num_detected_playout_glitches_;
-  }
-  RTC_HISTOGRAM_COUNTS_100000(
-      "WebRTC.Audio.AveragePlayoutCallbacksBetweenGlitches",
-      average_number_of_playout_callbacks_between_glitches);
-  RTCLog(@"Average number of playout callbacks between glitches: %d",
-         average_number_of_playout_callbacks_between_glitches);
-  return 0;
-}
-
-int32_t AudioDeviceIOS::StartRecording() {
-  LOGI() << "StartRecording";
-  RTC_DCHECK_RUN_ON(&thread_checker_);
-  RTC_DCHECK(audio_is_initialized_);
-  RTC_DCHECK(!recording_);
-  RTC_DCHECK(audio_unit_);
-  if (fine_audio_buffer_) {
-    fine_audio_buffer_->ResetRecord();
-  }
-  if (!playing_ &&
-      audio_unit_->GetState() == VoiceProcessingAudioUnit::kInitialized) {
-    if (!audio_unit_->Start()) {
-      RTCLogError(@"StartRecording failed to start audio unit.");
-      return -1;
-    }
-    LOG(LS_INFO) << "Voice-Processing I/O audio unit is now started";
-  }
-  rtc::AtomicOps::ReleaseStore(&recording_, 1);
-  return 0;
-}
-
-int32_t AudioDeviceIOS::StopRecording() {
-  LOGI() << "StopRecording";
-  RTC_DCHECK_RUN_ON(&thread_checker_);
-  if (!audio_is_initialized_ || !recording_) {
-    return 0;
-  }
-  if (!playing_) {
-    ShutdownPlayOrRecord();
-    audio_is_initialized_ = false;
-  }
-  rtc::AtomicOps::ReleaseStore(&recording_, 0);
-  return 0;
-}
-
-// Change the default receiver playout route to speaker.
-int32_t AudioDeviceIOS::SetLoudspeakerStatus(bool enable) {
-  LOGI() << "SetLoudspeakerStatus(" << enable << ")";
-
-  RTCAudioSession* session = [RTCAudioSession sharedInstance];
-  [session lockForConfiguration];
-  NSString* category = session.category;
-  AVAudioSessionCategoryOptions options = session.categoryOptions;
-  // Respect old category options if category is
-  // AVAudioSessionCategoryPlayAndRecord. Otherwise reset it since old options
-  // might not be valid for this category.
-  if ([category isEqualToString:AVAudioSessionCategoryPlayAndRecord]) {
-    if (enable) {
-      options |= AVAudioSessionCategoryOptionDefaultToSpeaker;
-    } else {
-      options &= ~AVAudioSessionCategoryOptionDefaultToSpeaker;
-    }
-  } else {
-    options = AVAudioSessionCategoryOptionDefaultToSpeaker;
-  }
-  NSError* error = nil;
-  BOOL success = [session setCategory:AVAudioSessionCategoryPlayAndRecord
-                          withOptions:options
-                                error:&error];
-  ios::CheckAndLogError(success, error);
-  [session unlockForConfiguration];
-  return (error == nil) ? 0 : -1;
-}
-
-int32_t AudioDeviceIOS::GetLoudspeakerStatus(bool& enabled) const {
-  LOGI() << "GetLoudspeakerStatus";
-  RTCAudioSession* session = [RTCAudioSession sharedInstance];
-  AVAudioSessionCategoryOptions options = session.categoryOptions;
-  enabled = options & AVAudioSessionCategoryOptionDefaultToSpeaker;
-  return 0;
-}
-
-int32_t AudioDeviceIOS::PlayoutDelay(uint16_t& delayMS) const {
-  delayMS = kFixedPlayoutDelayEstimate;
-  return 0;
-}
-
-int32_t AudioDeviceIOS::RecordingDelay(uint16_t& delayMS) const {
-  delayMS = kFixedRecordDelayEstimate;
-  return 0;
-}
-
-int AudioDeviceIOS::GetPlayoutAudioParameters(AudioParameters* params) const {
-  LOGI() << "GetPlayoutAudioParameters";
-  RTC_DCHECK(playout_parameters_.is_valid());
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  *params = playout_parameters_;
-  return 0;
-}
-
-int AudioDeviceIOS::GetRecordAudioParameters(AudioParameters* params) const {
-  LOGI() << "GetRecordAudioParameters";
-  RTC_DCHECK(record_parameters_.is_valid());
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  *params = record_parameters_;
-  return 0;
-}
-
-void AudioDeviceIOS::OnInterruptionBegin() {
-  RTC_DCHECK(thread_);
-  LOGI() << "OnInterruptionBegin";
-  thread_->Post(RTC_FROM_HERE, this, kMessageTypeInterruptionBegin);
-}
-
-void AudioDeviceIOS::OnInterruptionEnd() {
-  RTC_DCHECK(thread_);
-  LOGI() << "OnInterruptionEnd";
-  thread_->Post(RTC_FROM_HERE, this, kMessageTypeInterruptionEnd);
-}
-
-void AudioDeviceIOS::OnValidRouteChange() {
-  RTC_DCHECK(thread_);
-  thread_->Post(RTC_FROM_HERE, this, kMessageTypeValidRouteChange);
-}
-
-void AudioDeviceIOS::OnCanPlayOrRecordChange(bool can_play_or_record) {
-  RTC_DCHECK(thread_);
-  thread_->Post(RTC_FROM_HERE, this, kMessageTypeCanPlayOrRecordChange,
-                new rtc::TypedMessageData<bool>(can_play_or_record));
-}
-
-void AudioDeviceIOS::OnChangedOutputVolume() {
-  RTC_DCHECK(thread_);
-  thread_->Post(RTC_FROM_HERE, this, kMessageOutputVolumeChange);
-}
-
-OSStatus AudioDeviceIOS::OnDeliverRecordedData(AudioUnitRenderActionFlags* flags,
-                                               const AudioTimeStamp* time_stamp,
-                                               UInt32 bus_number,
-                                               UInt32 num_frames,
-                                               AudioBufferList* /* io_data */) {
-  RTC_DCHECK_RUN_ON(&io_thread_checker_);
-  OSStatus result = noErr;
-  // Simply return if recording is not enabled.
-  if (!rtc::AtomicOps::AcquireLoad(&recording_))
-    return result;
-
-  const size_t num_bytes =
-      num_frames * VoiceProcessingAudioUnit::kBytesPerSample;
-  // Set the size of our own audio buffer and clear it first to avoid copying
-  // in combination with potential reallocations.
-  // On real iOS devices, the size will only be set once (at first callback).
-  record_audio_buffer_.Clear();
-  record_audio_buffer_.SetSize(num_bytes);
-
-  // Allocate AudioBuffers to be used as storage for the received audio.
-  // The AudioBufferList structure works as a placeholder for the
-  // AudioBuffer structure, which holds a pointer to the actual data buffer
-  // in |record_audio_buffer_|. Recorded audio will be rendered into this memory
-  // at each input callback when calling AudioUnitRender().
-  AudioBufferList audio_buffer_list;
-  audio_buffer_list.mNumberBuffers = 1;
-  AudioBuffer* audio_buffer = &audio_buffer_list.mBuffers[0];
-  audio_buffer->mNumberChannels = record_parameters_.channels();
-  audio_buffer->mDataByteSize = record_audio_buffer_.size();
-  audio_buffer->mData = record_audio_buffer_.data();
-
-  // Obtain the recorded audio samples by initiating a rendering cycle.
-  // Since it happens on the input bus, the |io_data| parameter is a reference
-  // to the preallocated audio buffer list that the audio unit renders into.
-  // We can make the audio unit provide a buffer instead in io_data, but we
-  // currently just use our own.
-  // TODO(henrika): should error handling be improved?
-  result = audio_unit_->Render(
-      flags, time_stamp, bus_number, num_frames, &audio_buffer_list);
-  if (result != noErr) {
-    RTCLogError(@"Failed to render audio.");
-    return result;
-  }
-
-  // Get a pointer to the recorded audio and send it to the WebRTC ADB.
-  // Use the FineAudioBuffer instance to convert between native buffer size
-  // and the 10ms buffer size used by WebRTC.
-  fine_audio_buffer_->DeliverRecordedData(record_audio_buffer_,
-                                          kFixedPlayoutDelayEstimate,
-                                          kFixedRecordDelayEstimate);
-  return noErr;
-}
-
-OSStatus AudioDeviceIOS::OnGetPlayoutData(AudioUnitRenderActionFlags* flags,
-                                          const AudioTimeStamp* time_stamp,
-                                          UInt32 bus_number,
-                                          UInt32 num_frames,
-                                          AudioBufferList* io_data) {
-  RTC_DCHECK_RUN_ON(&io_thread_checker_);
-  // Verify 16-bit, noninterleaved mono PCM signal format.
-  RTC_DCHECK_EQ(1, io_data->mNumberBuffers);
-  AudioBuffer* audio_buffer = &io_data->mBuffers[0];
-  RTC_DCHECK_EQ(1, audio_buffer->mNumberChannels);
-
-  // Get pointer to internal audio buffer to which new audio data shall be
-  // written.
-  const size_t size_in_bytes = audio_buffer->mDataByteSize;
-  RTC_CHECK_EQ(size_in_bytes / VoiceProcessingAudioUnit::kBytesPerSample,
-               num_frames);
-  int8_t* destination = reinterpret_cast<int8_t*>(audio_buffer->mData);
-  // Produce silence and give audio unit a hint about it if playout is not
-  // activated.
-  if (!rtc::AtomicOps::AcquireLoad(&playing_)) {
-    *flags |= kAudioUnitRenderAction_OutputIsSilence;
-    memset(destination, 0, size_in_bytes);
-    return noErr;
-  }
-
-  // Measure time since last call to OnGetPlayoutData() and see if it is larger
-  // than a well defined threshold which depends on the current IO buffer size.
-  // If so, we have an indication of a glitch in the output audio since the
-  // core audio layer will most likely run dry in this state.
-  ++num_playout_callbacks_;
-  const int64_t now_time = rtc::TimeMillis();
-  if (time_stamp->mSampleTime != num_frames) {
-    const int64_t delta_time = now_time - last_playout_time_;
-    const int glitch_threshold = 1.6 * playout_parameters_.GetBufferSizeInMilliseconds();
-    if (delta_time > glitch_threshold) {
-      RTCLogWarning(@"Possible playout audio glitch detected.\n"
-                     "  Time since last OnGetPlayoutData was %lld ms.\n",
-                    delta_time);
-      // Exclude extreme delta values since they do most likely not correspond
-      // to a real glitch. Instead, the most probable cause is that a headset
-      // has been plugged in or out. There are more direct ways to detect
-      // audio device changes (see HandleValidRouteChange()) but experiments
-      // show that using it leads to more complex implementations.
-      // TODO(henrika): more tests might be needed to come up with an even
-      // better upper limit.
-      if (glitch_threshold < 120 && delta_time > 120) {
-        RTCLog(@"Glitch warning is ignored. Probably caused by device switch.");
-      } else {
-        thread_->Post(RTC_FROM_HERE, this, kMessageTypePlayoutGlitchDetected);
-      }
-    }
-  }
-  last_playout_time_ = now_time;
-
-  // Read decoded 16-bit PCM samples from WebRTC (using a size that matches
-  // the native I/O audio unit) and copy the result to the audio buffer in the
-  // |io_data| destination.
-  fine_audio_buffer_->GetPlayoutData(
-      rtc::ArrayView<int8_t>(destination, size_in_bytes));
-  return noErr;
-}
-
-void AudioDeviceIOS::OnMessage(rtc::Message *msg) {
-  switch (msg->message_id) {
-    case kMessageTypeInterruptionBegin:
-      HandleInterruptionBegin();
-      break;
-    case kMessageTypeInterruptionEnd:
-      HandleInterruptionEnd();
-      break;
-    case kMessageTypeValidRouteChange:
-      HandleValidRouteChange();
-      break;
-    case kMessageTypeCanPlayOrRecordChange: {
-      rtc::TypedMessageData<bool>* data =
-          static_cast<rtc::TypedMessageData<bool>*>(msg->pdata);
-      HandleCanPlayOrRecordChange(data->data());
-      delete data;
-      break;
-    }
-    case kMessageTypePlayoutGlitchDetected:
-      HandlePlayoutGlitchDetected();
-      break;
-    case kMessageOutputVolumeChange:
-      HandleOutputVolumeChange();
-      break;
-  }
-}
-
-void AudioDeviceIOS::HandleInterruptionBegin() {
-  RTC_DCHECK_RUN_ON(&thread_checker_);
-  RTCLog(@"Interruption begin. IsInterrupted changed from %d to 1.",
-         is_interrupted_);
-  if (audio_unit_ &&
-      audio_unit_->GetState() == VoiceProcessingAudioUnit::kStarted) {
-    RTCLog(@"Stopping the audio unit due to interruption begin.");
-    if (!audio_unit_->Stop()) {
-      RTCLogError(@"Failed to stop the audio unit for interruption begin.");
-    } else {
-      // The audio unit has been stopped but will be restarted when the
-      // interruption ends in HandleInterruptionEnd(). It will result in audio
-      // callbacks from a new native I/O thread which means that we must detach
-      // thread checkers here to be prepared for an upcoming new audio stream.
-      io_thread_checker_.DetachFromThread();
-      // The audio device buffer must also be informed about the interrupted
-      // state so it can detach its thread checkers as well.
-      audio_device_buffer_->NativeAudioInterrupted();
-    }
-  }
-  is_interrupted_ = true;
-}
-
-void AudioDeviceIOS::HandleInterruptionEnd() {
-  RTC_DCHECK_RUN_ON(&thread_checker_);
-  RTCLog(@"Interruption ended. IsInterrupted changed from %d to 0. "
-         "Updating audio unit state.", is_interrupted_);
-  is_interrupted_ = false;
-  UpdateAudioUnit([RTCAudioSession sharedInstance].canPlayOrRecord);
-}
-
-void AudioDeviceIOS::HandleValidRouteChange() {
-  RTC_DCHECK_RUN_ON(&thread_checker_);
-  RTCAudioSession* session = [RTCAudioSession sharedInstance];
-  RTCLog(@"%@", session);
-  HandleSampleRateChange(session.sampleRate);
-}
-
-void AudioDeviceIOS::HandleCanPlayOrRecordChange(bool can_play_or_record) {
-  RTCLog(@"Handling CanPlayOrRecord change to: %d", can_play_or_record);
-  UpdateAudioUnit(can_play_or_record);
-}
-
-void AudioDeviceIOS::HandleSampleRateChange(float sample_rate) {
-  RTC_DCHECK_RUN_ON(&thread_checker_);
-  RTCLog(@"Handling sample rate change to %f.", sample_rate);
-
-  // Don't do anything if we're interrupted.
-  if (is_interrupted_) {
-    RTCLog(@"Ignoring sample rate change to %f due to interruption.",
-           sample_rate);
-    return;
-  }
-
-  // If we don't have an audio unit yet, or the audio unit is uninitialized,
-  // there is no work to do.
-  if (!audio_unit_ ||
-      audio_unit_->GetState() < VoiceProcessingAudioUnit::kInitialized) {
-    return;
-  }
-
-  // The audio unit is already initialized or started.
-  // Check to see if the sample rate or buffer size has changed.
-  RTCAudioSession* session = [RTCAudioSession sharedInstance];
-  const double session_sample_rate = session.sampleRate;
-  const NSTimeInterval session_buffer_duration = session.IOBufferDuration;
-  const size_t session_frames_per_buffer =
-      static_cast<size_t>(session_sample_rate * session_buffer_duration + .5);
-  const double current_sample_rate = playout_parameters_.sample_rate();
-  const size_t current_frames_per_buffer =
-      playout_parameters_.frames_per_buffer();
-  RTCLog(@"Handling playout sample rate change to: %f\n"
-          "  Session sample rate: %f frames_per_buffer: %lu\n"
-          "  ADM sample rate: %f frames_per_buffer: %lu",
-         sample_rate,
-         session_sample_rate,
-         (unsigned long)session_frames_per_buffer,
-         current_sample_rate,
-         (unsigned long)current_frames_per_buffer);
-
-  // Sample rate and buffer size are the same, no work to do.
-  if (std::abs(current_sample_rate - session_sample_rate) <= DBL_EPSILON &&
-      current_frames_per_buffer == session_frames_per_buffer) {
-    RTCLog(@"Ignoring sample rate change since audio parameters are intact.");
-    return;
-  }
-
-  // Extra sanity check to ensure that the new sample rate is valid.
-  if (session_sample_rate <= 0.0) {
-    RTCLogError(@"Sample rate is invalid: %f", session_sample_rate);
-    return;
-  }
-
-  // We need to adjust our format and buffer sizes.
-  // The stream format is about to be changed and it requires that we first
-  // stop and uninitialize the audio unit to deallocate its resources.
-  RTCLog(@"Stopping and uninitializing audio unit to adjust buffers.");
-  bool restart_audio_unit = false;
-  if (audio_unit_->GetState() == VoiceProcessingAudioUnit::kStarted) {
-    audio_unit_->Stop();
-    restart_audio_unit = true;
-  }
-  if (audio_unit_->GetState() == VoiceProcessingAudioUnit::kInitialized) {
-    audio_unit_->Uninitialize();
-  }
-
-  // Allocate new buffers given the new stream format.
-  SetupAudioBuffersForActiveAudioSession();
-
-  // Initialize the audio unit again with the new sample rate.
-  RTC_DCHECK_EQ(playout_parameters_.sample_rate(), session_sample_rate);
-  if (!audio_unit_->Initialize(session_sample_rate)) {
-    RTCLogError(@"Failed to initialize the audio unit with sample rate: %f",
-                session_sample_rate);
-    return;
-  }
-
-  // Restart the audio unit if it was already running.
-  if (restart_audio_unit && !audio_unit_->Start()) {
-    RTCLogError(@"Failed to start audio unit with sample rate: %f",
-                session_sample_rate);
-    return;
-  }
-  RTCLog(@"Successfully handled sample rate change.");
-}
-
-void AudioDeviceIOS::HandlePlayoutGlitchDetected() {
-  RTC_DCHECK_RUN_ON(&thread_checker_);
-  // Don't update metrics if we're interrupted since a "glitch" is expected
-  // in this state.
-  if (is_interrupted_) {
-    RTCLog(@"Ignoring audio glitch due to interruption.");
-    return;
-  }
-  // Avoid doing glitch detection for two seconds after a volume change
-  // has been detected to reduce the risk of false alarm.
-  if (last_output_volume_change_time_ > 0 &&
-      rtc::TimeSince(last_output_volume_change_time_) < 2000) {
-    RTCLog(@"Ignoring audio glitch due to recent output volume change.");
-    return;
-  }
-  num_detected_playout_glitches_++;
-  RTCLog(@"Number of detected playout glitches: %lld",
-         num_detected_playout_glitches_);
-
-  int64_t glitch_count = num_detected_playout_glitches_;
-  dispatch_async(dispatch_get_main_queue(), ^{
-    RTCAudioSession* session = [RTCAudioSession sharedInstance];
-    [session notifyDidDetectPlayoutGlitch:glitch_count];
-  });
-}
-
-void AudioDeviceIOS::HandleOutputVolumeChange() {
-  RTC_DCHECK_RUN_ON(&thread_checker_);
-  RTCLog(@"Output volume change detected.");
-  // Store time of this detection so it can be used to defer detection of
-  // glitches too close in time to this event.
-  last_output_volume_change_time_ = rtc::TimeMillis();
-}
-
-void AudioDeviceIOS::UpdateAudioDeviceBuffer() {
-  LOGI() << "UpdateAudioDevicebuffer";
-  // AttachAudioBuffer() is called at construction by the main class but check
-  // just in case.
-  RTC_DCHECK(audio_device_buffer_) << "AttachAudioBuffer must be called first";
-  // Inform the audio device buffer (ADB) about the new audio format.
-  audio_device_buffer_->SetPlayoutSampleRate(playout_parameters_.sample_rate());
-  audio_device_buffer_->SetPlayoutChannels(playout_parameters_.channels());
-  audio_device_buffer_->SetRecordingSampleRate(
-      record_parameters_.sample_rate());
-  audio_device_buffer_->SetRecordingChannels(record_parameters_.channels());
-}
-
-void AudioDeviceIOS::SetupAudioBuffersForActiveAudioSession() {
-  LOGI() << "SetupAudioBuffersForActiveAudioSession";
-  // Verify the current values once the audio session has been activated.
-  RTCAudioSession* session = [RTCAudioSession sharedInstance];
-  double sample_rate = session.sampleRate;
-  NSTimeInterval io_buffer_duration = session.IOBufferDuration;
-  RTCLog(@"%@", session);
-
-  // Log a warning message for the case when we are unable to set the preferred
-  // hardware sample rate but continue and use the non-ideal sample rate after
-  // reinitializing the audio parameters. Most BT headsets only support 8kHz or
-  // 16kHz.
-  RTCAudioSessionConfiguration* webRTCConfig =
-      [RTCAudioSessionConfiguration webRTCConfiguration];
-  if (sample_rate != webRTCConfig.sampleRate) {
-    LOG(LS_WARNING) << "Unable to set the preferred sample rate";
-  }
-
-  // At this stage, we also know the exact IO buffer duration and can add
-  // that info to the existing audio parameters where it is converted into
-  // number of audio frames.
-  // Example: IO buffer size = 0.008 seconds <=> 128 audio frames at 16kHz.
-  // Hence, 128 is the size we expect to see in upcoming render callbacks.
-  playout_parameters_.reset(sample_rate, playout_parameters_.channels(),
-                            io_buffer_duration);
-  RTC_DCHECK(playout_parameters_.is_complete());
-  record_parameters_.reset(sample_rate, record_parameters_.channels(),
-                           io_buffer_duration);
-  RTC_DCHECK(record_parameters_.is_complete());
-  LOG(LS_INFO) << " frames per I/O buffer: "
-               << playout_parameters_.frames_per_buffer();
-  LOG(LS_INFO) << " bytes per I/O buffer: "
-               << playout_parameters_.GetBytesPerBuffer();
-  RTC_DCHECK_EQ(playout_parameters_.GetBytesPerBuffer(),
-                record_parameters_.GetBytesPerBuffer());
-
-  // Update the ADB parameters since the sample rate might have changed.
-  UpdateAudioDeviceBuffer();
-
-  // Create a modified audio buffer class which allows us to ask for,
-  // or deliver, any number of samples (and not only multiple of 10ms) to match
-  // the native audio unit buffer size. Use a reasonable capacity to avoid
-  // reallocations while audio is played to reduce risk of glitches.
-  RTC_DCHECK(audio_device_buffer_);
-  const size_t capacity_in_bytes = 2 * playout_parameters_.GetBytesPerBuffer();
-  fine_audio_buffer_.reset(new FineAudioBuffer(
-      audio_device_buffer_, playout_parameters_.sample_rate(), capacity_in_bytes));
-}
-
-bool AudioDeviceIOS::CreateAudioUnit() {
-  RTC_DCHECK(!audio_unit_);
-
-  audio_unit_.reset(new VoiceProcessingAudioUnit(this));
-  if (!audio_unit_->Init()) {
-    audio_unit_.reset();
-    return false;
-  }
-
-  return true;
-}
-
-void AudioDeviceIOS::UpdateAudioUnit(bool can_play_or_record) {
-  RTC_DCHECK_RUN_ON(&thread_checker_);
-  RTCLog(@"Updating audio unit state. CanPlayOrRecord=%d IsInterrupted=%d",
-         can_play_or_record, is_interrupted_);
-
-  if (is_interrupted_) {
-    RTCLog(@"Ignoring audio unit update due to interruption.");
-    return;
-  }
-
-  // If we're not initialized we don't need to do anything. Audio unit will
-  // be initialized on initialization.
-  if (!audio_is_initialized_)
-    return;
-
-  // If we're initialized, we must have an audio unit.
-  RTC_DCHECK(audio_unit_);
-
-  bool should_initialize_audio_unit = false;
-  bool should_uninitialize_audio_unit = false;
-  bool should_start_audio_unit = false;
-  bool should_stop_audio_unit = false;
-
-  switch (audio_unit_->GetState()) {
-    case VoiceProcessingAudioUnit::kInitRequired:
-      RTCLog(@"VPAU state: InitRequired");
-      RTC_NOTREACHED();
-      break;
-    case VoiceProcessingAudioUnit::kUninitialized:
-      RTCLog(@"VPAU state: Uninitialized");
-      should_initialize_audio_unit = can_play_or_record;
-      should_start_audio_unit = should_initialize_audio_unit &&
-          (playing_ || recording_);
-      break;
-    case VoiceProcessingAudioUnit::kInitialized:
-      RTCLog(@"VPAU state: Initialized");
-      should_start_audio_unit =
-          can_play_or_record && (playing_ || recording_);
-      should_uninitialize_audio_unit = !can_play_or_record;
-      break;
-    case VoiceProcessingAudioUnit::kStarted:
-      RTCLog(@"VPAU state: Started");
-      RTC_DCHECK(playing_ || recording_);
-      should_stop_audio_unit = !can_play_or_record;
-      should_uninitialize_audio_unit = should_stop_audio_unit;
-      break;
-  }
-
-  if (should_initialize_audio_unit) {
-    RTCLog(@"Initializing audio unit for UpdateAudioUnit");
-    ConfigureAudioSession();
-    SetupAudioBuffersForActiveAudioSession();
-    if (!audio_unit_->Initialize(playout_parameters_.sample_rate())) {
-      RTCLogError(@"Failed to initialize audio unit.");
-      return;
-    }
-  }
-
-  if (should_start_audio_unit) {
-    RTCLog(@"Starting audio unit for UpdateAudioUnit");
-    // Log session settings before trying to start audio streaming.
-    RTCAudioSession* session = [RTCAudioSession sharedInstance];
-    RTCLog(@"%@", session);
-    if (!audio_unit_->Start()) {
-      RTCLogError(@"Failed to start audio unit.");
-      return;
-    }
-  }
-
-  if (should_stop_audio_unit) {
-    RTCLog(@"Stopping audio unit for UpdateAudioUnit");
-    if (!audio_unit_->Stop()) {
-      RTCLogError(@"Failed to stop audio unit.");
-      return;
-    }
-  }
-
-  if (should_uninitialize_audio_unit) {
-    RTCLog(@"Uninitializing audio unit for UpdateAudioUnit");
-    audio_unit_->Uninitialize();
-    UnconfigureAudioSession();
-  }
-}
-
-bool AudioDeviceIOS::ConfigureAudioSession() {
-  RTC_DCHECK_RUN_ON(&thread_checker_);
-  RTCLog(@"Configuring audio session.");
-  if (has_configured_session_) {
-    RTCLogWarning(@"Audio session already configured.");
-    return false;
-  }
-  RTCAudioSession* session = [RTCAudioSession sharedInstance];
-  [session lockForConfiguration];
-  bool success = [session configureWebRTCSession:nil];
-  [session unlockForConfiguration];
-  if (success) {
-    has_configured_session_ = true;
-    RTCLog(@"Configured audio session.");
-  } else {
-    RTCLog(@"Failed to configure audio session.");
-  }
-  return success;
-}
-
-void AudioDeviceIOS::UnconfigureAudioSession() {
-  RTC_DCHECK_RUN_ON(&thread_checker_);
-  RTCLog(@"Unconfiguring audio session.");
-  if (!has_configured_session_) {
-    RTCLogWarning(@"Audio session already unconfigured.");
-    return;
-  }
-  RTCAudioSession* session = [RTCAudioSession sharedInstance];
-  [session lockForConfiguration];
-  [session unconfigureWebRTCSession:nil];
-  [session unlockForConfiguration];
-  has_configured_session_ = false;
-  RTCLog(@"Unconfigured audio session.");
-}
-
-bool AudioDeviceIOS::InitPlayOrRecord() {
-  LOGI() << "InitPlayOrRecord";
-  RTC_DCHECK_RUN_ON(&thread_checker_);
-
-  // There should be no audio unit at this point.
-  if (!CreateAudioUnit()) {
-    return false;
-  }
-
-  RTCAudioSession* session = [RTCAudioSession sharedInstance];
-  // Subscribe to audio session events.
-  [session pushDelegate:audio_session_observer_];
-  is_interrupted_ = session.isInterrupted ? true : false;
-
-  // Lock the session to make configuration changes.
-  [session lockForConfiguration];
-  NSError* error = nil;
-  if (![session beginWebRTCSession:&error]) {
-    [session unlockForConfiguration];
-    RTCLogError(@"Failed to begin WebRTC session: %@",
-                error.localizedDescription);
-    return false;
-  }
-
-  // If we are ready to play or record, initialize the audio unit.
-  if (session.canPlayOrRecord) {
-    ConfigureAudioSession();
-    SetupAudioBuffersForActiveAudioSession();
-    audio_unit_->Initialize(playout_parameters_.sample_rate());
-  }
-
-  // Release the lock.
-  [session unlockForConfiguration];
-
-  return true;
-}
-
-void AudioDeviceIOS::ShutdownPlayOrRecord() {
-  LOGI() << "ShutdownPlayOrRecord";
-  RTC_DCHECK_RUN_ON(&thread_checker_);
-
-  // Stop the audio unit to prevent any additional audio callbacks.
-  audio_unit_->Stop();
-
-  // Close and delete the voice-processing I/O unit.
-  audio_unit_.reset();
-
-  // Detach thread checker for the AURemoteIO::IOThread to ensure that the
-  // next session uses a fresh thread id.
-  io_thread_checker_.DetachFromThread();
-
-  // Remove audio session notification observers.
-  RTCAudioSession* session = [RTCAudioSession sharedInstance];
-  [session removeDelegate:audio_session_observer_];
-
-  // All I/O should be stopped or paused prior to deactivating the audio
-  // session, hence we deactivate as last action.
-  [session lockForConfiguration];
-  UnconfigureAudioSession();
-  [session endWebRTCSession:nil];
-  [session unlockForConfiguration];
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_device/ios/audio_device_not_implemented_ios.mm b/modules/audio_device/ios/audio_device_not_implemented_ios.mm
deleted file mode 100644
index f67c0a9..0000000
--- a/modules/audio_device/ios/audio_device_not_implemented_ios.mm
+++ /dev/null
@@ -1,234 +0,0 @@
-/*
- *  Copyright (c) 2015 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_device/ios/audio_device_ios.h"
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-
-namespace webrtc {
-
-int32_t AudioDeviceIOS::ActiveAudioLayer(
-    AudioDeviceModule::AudioLayer& audioLayer) const {
-  audioLayer = AudioDeviceModule::kPlatformDefaultAudio;
-  return 0;
-}
-
-int16_t AudioDeviceIOS::PlayoutDevices() {
-  // TODO(henrika): improve.
-  LOG_F(LS_WARNING) << "Not implemented";
-  return (int16_t)1;
-}
-
-int16_t AudioDeviceIOS::RecordingDevices() {
-  // TODO(henrika): improve.
-  LOG_F(LS_WARNING) << "Not implemented";
-  return (int16_t)1;
-}
-
-int32_t AudioDeviceIOS::InitSpeaker() {
-  return 0;
-}
-
-bool AudioDeviceIOS::SpeakerIsInitialized() const {
-  return true;
-}
-
-int32_t AudioDeviceIOS::SpeakerVolumeIsAvailable(bool& available) {
-  available = false;
-  return 0;
-}
-
-int32_t AudioDeviceIOS::SetSpeakerVolume(uint32_t volume) {
-  RTC_NOTREACHED() << "Not implemented";
-  return -1;
-}
-
-int32_t AudioDeviceIOS::SpeakerVolume(uint32_t& volume) const {
-  RTC_NOTREACHED() << "Not implemented";
-  return -1;
-}
-
-int32_t AudioDeviceIOS::MaxSpeakerVolume(uint32_t& maxVolume) const {
-  RTC_NOTREACHED() << "Not implemented";
-  return -1;
-}
-
-int32_t AudioDeviceIOS::MinSpeakerVolume(uint32_t& minVolume) const {
-  RTC_NOTREACHED() << "Not implemented";
-  return -1;
-}
-
-int32_t AudioDeviceIOS::SpeakerMuteIsAvailable(bool& available) {
-  available = false;
-  return 0;
-}
-
-int32_t AudioDeviceIOS::SetSpeakerMute(bool enable) {
-  RTC_NOTREACHED() << "Not implemented";
-  return -1;
-}
-
-int32_t AudioDeviceIOS::SpeakerMute(bool& enabled) const {
-  RTC_NOTREACHED() << "Not implemented";
-  return -1;
-}
-
-int32_t AudioDeviceIOS::SetPlayoutDevice(uint16_t index) {
-  LOG_F(LS_WARNING) << "Not implemented";
-  return 0;
-}
-
-int32_t AudioDeviceIOS::SetPlayoutDevice(AudioDeviceModule::WindowsDeviceType) {
-  RTC_NOTREACHED() << "Not implemented";
-  return -1;
-}
-
-bool AudioDeviceIOS::PlayoutWarning() const {
-  return false;
-}
-
-bool AudioDeviceIOS::PlayoutError() const {
-  return false;
-}
-
-bool AudioDeviceIOS::RecordingWarning() const {
-  return false;
-}
-
-bool AudioDeviceIOS::RecordingError() const {
-  return false;
-}
-
-int32_t AudioDeviceIOS::InitMicrophone() {
-  return 0;
-}
-
-bool AudioDeviceIOS::MicrophoneIsInitialized() const {
-  return true;
-}
-
-int32_t AudioDeviceIOS::MicrophoneMuteIsAvailable(bool& available) {
-  available = false;
-  return 0;
-}
-
-int32_t AudioDeviceIOS::SetMicrophoneMute(bool enable) {
-  RTC_NOTREACHED() << "Not implemented";
-  return -1;
-}
-
-int32_t AudioDeviceIOS::MicrophoneMute(bool& enabled) const {
-  RTC_NOTREACHED() << "Not implemented";
-  return -1;
-}
-
-int32_t AudioDeviceIOS::StereoRecordingIsAvailable(bool& available) {
-  available = false;
-  return 0;
-}
-
-int32_t AudioDeviceIOS::SetStereoRecording(bool enable) {
-  LOG_F(LS_WARNING) << "Not implemented";
-  return -1;
-}
-
-int32_t AudioDeviceIOS::StereoRecording(bool& enabled) const {
-  enabled = false;
-  return 0;
-}
-
-int32_t AudioDeviceIOS::StereoPlayoutIsAvailable(bool& available) {
-  available = false;
-  return 0;
-}
-
-int32_t AudioDeviceIOS::SetStereoPlayout(bool enable) {
-  LOG_F(LS_WARNING) << "Not implemented";
-  return -1;
-}
-
-int32_t AudioDeviceIOS::StereoPlayout(bool& enabled) const {
-  enabled = false;
-  return 0;
-}
-
-int32_t AudioDeviceIOS::SetAGC(bool enable) {
-  if (enable) {
-    RTC_NOTREACHED() << "Should never be called";
-  }
-  return -1;
-}
-
-bool AudioDeviceIOS::AGC() const {
-  return false;
-}
-
-int32_t AudioDeviceIOS::MicrophoneVolumeIsAvailable(bool& available) {
-  available = false;
-  return 0;
-}
-
-int32_t AudioDeviceIOS::SetMicrophoneVolume(uint32_t volume) {
-  RTC_NOTREACHED() << "Not implemented";
-  return -1;
-}
-
-int32_t AudioDeviceIOS::MicrophoneVolume(uint32_t& volume) const {
-  RTC_NOTREACHED() << "Not implemented";
-  return -1;
-}
-
-int32_t AudioDeviceIOS::MaxMicrophoneVolume(uint32_t& maxVolume) const {
-  RTC_NOTREACHED() << "Not implemented";
-  return -1;
-}
-
-int32_t AudioDeviceIOS::MinMicrophoneVolume(uint32_t& minVolume) const {
-  RTC_NOTREACHED() << "Not implemented";
-  return -1;
-}
-
-int32_t AudioDeviceIOS::PlayoutDeviceName(uint16_t index,
-                                          char name[kAdmMaxDeviceNameSize],
-                                          char guid[kAdmMaxGuidSize]) {
-  RTC_NOTREACHED() << "Not implemented";
-  return -1;
-}
-
-int32_t AudioDeviceIOS::RecordingDeviceName(uint16_t index,
-                                            char name[kAdmMaxDeviceNameSize],
-                                            char guid[kAdmMaxGuidSize]) {
-  RTC_NOTREACHED() << "Not implemented";
-  return -1;
-}
-
-int32_t AudioDeviceIOS::SetRecordingDevice(uint16_t index) {
-  LOG_F(LS_WARNING) << "Not implemented";
-  return 0;
-}
-
-int32_t AudioDeviceIOS::SetRecordingDevice(
-    AudioDeviceModule::WindowsDeviceType) {
-  RTC_NOTREACHED() << "Not implemented";
-  return -1;
-}
-
-int32_t AudioDeviceIOS::PlayoutIsAvailable(bool& available) {
-  available = true;
-  return 0;
-}
-
-int32_t AudioDeviceIOS::RecordingIsAvailable(bool& available) {
-  available = true;
-  return 0;
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_device/ios/audio_device_unittest_ios.mm b/modules/audio_device/ios/audio_device_unittest_ios.mm
deleted file mode 100644
index 4e805ad..0000000
--- a/modules/audio_device/ios/audio_device_unittest_ios.mm
+++ /dev/null
@@ -1,880 +0,0 @@
-/*
- *  Copyright (c) 2015 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 <algorithm>
-#include <limits>
-#include <list>
-#include <memory>
-#include <numeric>
-#include <string>
-#include <vector>
-
-#include "webrtc/modules/audio_device/audio_device_impl.h"
-#include "webrtc/modules/audio_device/include/audio_device.h"
-#include "webrtc/modules/audio_device/include/mock_audio_transport.h"
-#include "webrtc/modules/audio_device/ios/audio_device_ios.h"
-#include "webrtc/rtc_base/arraysize.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/format_macros.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/scoped_ref_ptr.h"
-#include "webrtc/rtc_base/timeutils.h"
-#include "webrtc/system_wrappers/include/event_wrapper.h"
-#include "webrtc/test/gmock.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/testsupport/fileutils.h"
-
-#import "webrtc/sdk/objc/Framework/Classes/Audio/RTCAudioSession+Private.h"
-#import "webrtc/sdk/objc/Framework/Headers/WebRTC/RTCAudioSession.h"
-
-using std::cout;
-using std::endl;
-using ::testing::_;
-using ::testing::AtLeast;
-using ::testing::Gt;
-using ::testing::Invoke;
-using ::testing::NiceMock;
-using ::testing::NotNull;
-using ::testing::Return;
-
-// #define ENABLE_DEBUG_PRINTF
-#ifdef ENABLE_DEBUG_PRINTF
-#define PRINTD(...) fprintf(stderr, __VA_ARGS__);
-#else
-#define PRINTD(...) ((void)0)
-#endif
-#define PRINT(...) fprintf(stderr, __VA_ARGS__);
-
-namespace webrtc {
-
-// Number of callbacks (input or output) the tests waits for before we set
-// an event indicating that the test was OK.
-static const size_t kNumCallbacks = 10;
-// Max amount of time we wait for an event to be set while counting callbacks.
-static const int kTestTimeOutInMilliseconds = 10 * 1000;
-// Number of bits per PCM audio sample.
-static const size_t kBitsPerSample = 16;
-// Number of bytes per PCM audio sample.
-static const size_t kBytesPerSample = kBitsPerSample / 8;
-// Average number of audio callbacks per second assuming 10ms packet size.
-static const size_t kNumCallbacksPerSecond = 100;
-// Play out a test file during this time (unit is in seconds).
-static const int kFilePlayTimeInSec = 15;
-// Run the full-duplex test during this time (unit is in seconds).
-// Note that first |kNumIgnoreFirstCallbacks| are ignored.
-static const int kFullDuplexTimeInSec = 10;
-// Wait for the callback sequence to stabilize by ignoring this amount of the
-// initial callbacks (avoids initial FIFO access).
-// Only used in the RunPlayoutAndRecordingInFullDuplex test.
-static const size_t kNumIgnoreFirstCallbacks = 50;
-// Sets the number of impulses per second in the latency test.
-// TODO(henrika): fine tune this setting for iOS.
-static const int kImpulseFrequencyInHz = 1;
-// Length of round-trip latency measurements. Number of transmitted impulses
-// is kImpulseFrequencyInHz * kMeasureLatencyTimeInSec - 1.
-// TODO(henrika): fine tune this setting for iOS.
-static const int kMeasureLatencyTimeInSec = 5;
-// Utilized in round-trip latency measurements to avoid capturing noise samples.
-// TODO(henrika): fine tune this setting for iOS.
-static const int kImpulseThreshold = 50;
-static const char kTag[] = "[..........] ";
-
-enum TransportType {
-  kPlayout = 0x1,
-  kRecording = 0x2,
-};
-
-// Interface for processing the audio stream. Real implementations can e.g.
-// run audio in loopback, read audio from a file or perform latency
-// measurements.
-class AudioStreamInterface {
- public:
-  virtual void Write(const void* source, size_t num_frames) = 0;
-  virtual void Read(void* destination, size_t num_frames) = 0;
-
- protected:
-  virtual ~AudioStreamInterface() {}
-};
-
-// Reads audio samples from a PCM file where the file is stored in memory at
-// construction.
-class FileAudioStream : public AudioStreamInterface {
- public:
-  FileAudioStream(size_t num_callbacks,
-                  const std::string& file_name,
-                  int sample_rate)
-      : file_size_in_bytes_(0), sample_rate_(sample_rate), file_pos_(0) {
-    file_size_in_bytes_ = test::GetFileSize(file_name);
-    sample_rate_ = sample_rate;
-    EXPECT_GE(file_size_in_callbacks(), num_callbacks)
-        << "Size of test file is not large enough to last during the test.";
-    const size_t num_16bit_samples =
-        test::GetFileSize(file_name) / kBytesPerSample;
-    file_.reset(new int16_t[num_16bit_samples]);
-    FILE* audio_file = fopen(file_name.c_str(), "rb");
-    EXPECT_NE(audio_file, nullptr);
-    size_t num_samples_read =
-        fread(file_.get(), sizeof(int16_t), num_16bit_samples, audio_file);
-    EXPECT_EQ(num_samples_read, num_16bit_samples);
-    fclose(audio_file);
-  }
-
-  // AudioStreamInterface::Write() is not implemented.
-  void Write(const void* source, size_t num_frames) override {}
-
-  // Read samples from file stored in memory (at construction) and copy
-  // |num_frames| (<=> 10ms) to the |destination| byte buffer.
-  void Read(void* destination, size_t num_frames) override {
-    memcpy(destination, static_cast<int16_t*>(&file_[file_pos_]),
-           num_frames * sizeof(int16_t));
-    file_pos_ += num_frames;
-  }
-
-  int file_size_in_seconds() const {
-    return static_cast<int>(
-        file_size_in_bytes_ / (kBytesPerSample * sample_rate_));
-  }
-  size_t file_size_in_callbacks() const {
-    return file_size_in_seconds() * kNumCallbacksPerSecond;
-  }
-
- private:
-  size_t file_size_in_bytes_;
-  int sample_rate_;
-  std::unique_ptr<int16_t[]> file_;
-  size_t file_pos_;
-};
-
-// Simple first in first out (FIFO) class that wraps a list of 16-bit audio
-// buffers of fixed size and allows Write and Read operations. The idea is to
-// store recorded audio buffers (using Write) and then read (using Read) these
-// stored buffers with as short delay as possible when the audio layer needs
-// data to play out. The number of buffers in the FIFO will stabilize under
-// normal conditions since there will be a balance between Write and Read calls.
-// The container is a std::list container and access is protected with a lock
-// since both sides (playout and recording) are driven by its own thread.
-class FifoAudioStream : public AudioStreamInterface {
- public:
-  explicit FifoAudioStream(size_t frames_per_buffer)
-      : frames_per_buffer_(frames_per_buffer),
-        bytes_per_buffer_(frames_per_buffer_ * sizeof(int16_t)),
-        fifo_(new AudioBufferList),
-        largest_size_(0),
-        total_written_elements_(0),
-        write_count_(0) {
-    EXPECT_NE(fifo_.get(), nullptr);
-  }
-
-  ~FifoAudioStream() { Flush(); }
-
-  // Allocate new memory, copy |num_frames| samples from |source| into memory
-  // and add pointer to the memory location to end of the list.
-  // Increases the size of the FIFO by one element.
-  void Write(const void* source, size_t num_frames) override {
-    ASSERT_EQ(num_frames, frames_per_buffer_);
-    PRINTD("+");
-    if (write_count_++ < kNumIgnoreFirstCallbacks) {
-      return;
-    }
-    int16_t* memory = new int16_t[frames_per_buffer_];
-    memcpy(static_cast<int16_t*>(&memory[0]), source, bytes_per_buffer_);
-    rtc::CritScope lock(&lock_);
-    fifo_->push_back(memory);
-    const size_t size = fifo_->size();
-    if (size > largest_size_) {
-      largest_size_ = size;
-      PRINTD("(%" PRIuS ")", largest_size_);
-    }
-    total_written_elements_ += size;
-  }
-
-  // Read pointer to data buffer from front of list, copy |num_frames| of stored
-  // data into |destination| and delete the utilized memory allocation.
-  // Decreases the size of the FIFO by one element.
-  void Read(void* destination, size_t num_frames) override {
-    ASSERT_EQ(num_frames, frames_per_buffer_);
-    PRINTD("-");
-    rtc::CritScope lock(&lock_);
-    if (fifo_->empty()) {
-      memset(destination, 0, bytes_per_buffer_);
-    } else {
-      int16_t* memory = fifo_->front();
-      fifo_->pop_front();
-      memcpy(destination, static_cast<int16_t*>(&memory[0]), bytes_per_buffer_);
-      delete memory;
-    }
-  }
-
-  size_t size() const { return fifo_->size(); }
-
-  size_t largest_size() const { return largest_size_; }
-
-  size_t average_size() const {
-    return (total_written_elements_ == 0)
-               ? 0.0
-               : 0.5 +
-                     static_cast<float>(total_written_elements_) /
-                         (write_count_ - kNumIgnoreFirstCallbacks);
-  }
-
- private:
-  void Flush() {
-    for (auto it = fifo_->begin(); it != fifo_->end(); ++it) {
-      delete *it;
-    }
-    fifo_->clear();
-  }
-
-  using AudioBufferList = std::list<int16_t*>;
-  rtc::CriticalSection lock_;
-  const size_t frames_per_buffer_;
-  const size_t bytes_per_buffer_;
-  std::unique_ptr<AudioBufferList> fifo_;
-  size_t largest_size_;
-  size_t total_written_elements_;
-  size_t write_count_;
-};
-
-// Inserts periodic impulses and measures the latency between the time of
-// transmission and time of receiving the same impulse.
-// Usage requires a special hardware called Audio Loopback Dongle.
-// See http://source.android.com/devices/audio/loopback.html for details.
-class LatencyMeasuringAudioStream : public AudioStreamInterface {
- public:
-  explicit LatencyMeasuringAudioStream(size_t frames_per_buffer)
-      : frames_per_buffer_(frames_per_buffer),
-        bytes_per_buffer_(frames_per_buffer_ * sizeof(int16_t)),
-        play_count_(0),
-        rec_count_(0),
-        pulse_time_(0) {}
-
-  // Insert periodic impulses in first two samples of |destination|.
-  void Read(void* destination, size_t num_frames) override {
-    ASSERT_EQ(num_frames, frames_per_buffer_);
-    if (play_count_ == 0) {
-      PRINT("[");
-    }
-    play_count_++;
-    memset(destination, 0, bytes_per_buffer_);
-    if (play_count_ % (kNumCallbacksPerSecond / kImpulseFrequencyInHz) == 0) {
-      if (pulse_time_ == 0) {
-        pulse_time_ = rtc::TimeMillis();
-      }
-      PRINT(".");
-      const int16_t impulse = std::numeric_limits<int16_t>::max();
-      int16_t* ptr16 = static_cast<int16_t*>(destination);
-      for (size_t i = 0; i < 2; ++i) {
-        ptr16[i] = impulse;
-      }
-    }
-  }
-
-  // Detect received impulses in |source|, derive time between transmission and
-  // detection and add the calculated delay to list of latencies.
-  void Write(const void* source, size_t num_frames) override {
-    ASSERT_EQ(num_frames, frames_per_buffer_);
-    rec_count_++;
-    if (pulse_time_ == 0) {
-      // Avoid detection of new impulse response until a new impulse has
-      // been transmitted (sets |pulse_time_| to value larger than zero).
-      return;
-    }
-    const int16_t* ptr16 = static_cast<const int16_t*>(source);
-    std::vector<int16_t> vec(ptr16, ptr16 + num_frames);
-    // Find max value in the audio buffer.
-    int max = *std::max_element(vec.begin(), vec.end());
-    // Find index (element position in vector) of the max element.
-    int index_of_max =
-        std::distance(vec.begin(), std::find(vec.begin(), vec.end(), max));
-    if (max > kImpulseThreshold) {
-      PRINTD("(%d,%d)", max, index_of_max);
-      int64_t now_time = rtc::TimeMillis();
-      int extra_delay = IndexToMilliseconds(static_cast<double>(index_of_max));
-      PRINTD("[%d]", static_cast<int>(now_time - pulse_time_));
-      PRINTD("[%d]", extra_delay);
-      // Total latency is the difference between transmit time and detection
-      // tome plus the extra delay within the buffer in which we detected the
-      // received impulse. It is transmitted at sample 0 but can be received
-      // at sample N where N > 0. The term |extra_delay| accounts for N and it
-      // is a value between 0 and 10ms.
-      latencies_.push_back(now_time - pulse_time_ + extra_delay);
-      pulse_time_ = 0;
-    } else {
-      PRINTD("-");
-    }
-  }
-
-  size_t num_latency_values() const { return latencies_.size(); }
-
-  int min_latency() const {
-    if (latencies_.empty())
-      return 0;
-    return *std::min_element(latencies_.begin(), latencies_.end());
-  }
-
-  int max_latency() const {
-    if (latencies_.empty())
-      return 0;
-    return *std::max_element(latencies_.begin(), latencies_.end());
-  }
-
-  int average_latency() const {
-    if (latencies_.empty())
-      return 0;
-    return 0.5 +
-           static_cast<double>(
-               std::accumulate(latencies_.begin(), latencies_.end(), 0)) /
-               latencies_.size();
-  }
-
-  void PrintResults() const {
-    PRINT("] ");
-    for (auto it = latencies_.begin(); it != latencies_.end(); ++it) {
-      PRINT("%d ", *it);
-    }
-    PRINT("\n");
-    PRINT("%s[min, max, avg]=[%d, %d, %d] ms\n", kTag, min_latency(),
-          max_latency(), average_latency());
-  }
-
-  int IndexToMilliseconds(double index) const {
-    return 10.0 * (index / frames_per_buffer_) + 0.5;
-  }
-
- private:
-  const size_t frames_per_buffer_;
-  const size_t bytes_per_buffer_;
-  size_t play_count_;
-  size_t rec_count_;
-  int64_t pulse_time_;
-  std::vector<int> latencies_;
-};
-// Mocks the AudioTransport object and proxies actions for the two callbacks
-// (RecordedDataIsAvailable and NeedMorePlayData) to different implementations
-// of AudioStreamInterface.
-class MockAudioTransportIOS : public test::MockAudioTransport {
- public:
-  explicit MockAudioTransportIOS(int type)
-      : num_callbacks_(0),
-        type_(type),
-        play_count_(0),
-        rec_count_(0),
-        audio_stream_(nullptr) {}
-
-  virtual ~MockAudioTransportIOS() {}
-
-  // Set default actions of the mock object. We are delegating to fake
-  // implementations (of AudioStreamInterface) here.
-  void HandleCallbacks(EventWrapper* test_is_done,
-                       AudioStreamInterface* audio_stream,
-                       size_t num_callbacks) {
-    test_is_done_ = test_is_done;
-    audio_stream_ = audio_stream;
-    num_callbacks_ = num_callbacks;
-    if (play_mode()) {
-      ON_CALL(*this, NeedMorePlayData(_, _, _, _, _, _, _, _))
-          .WillByDefault(
-              Invoke(this, &MockAudioTransportIOS::RealNeedMorePlayData));
-    }
-    if (rec_mode()) {
-      ON_CALL(*this, RecordedDataIsAvailable(_, _, _, _, _, _, _, _, _, _))
-          .WillByDefault(Invoke(
-              this, &MockAudioTransportIOS::RealRecordedDataIsAvailable));
-    }
-  }
-
-  int32_t RealRecordedDataIsAvailable(const void* audioSamples,
-                                      const size_t nSamples,
-                                      const size_t nBytesPerSample,
-                                      const size_t nChannels,
-                                      const uint32_t samplesPerSec,
-                                      const uint32_t totalDelayMS,
-                                      const int32_t clockDrift,
-                                      const uint32_t currentMicLevel,
-                                      const bool keyPressed,
-                                      uint32_t& newMicLevel) {
-    EXPECT_TRUE(rec_mode()) << "No test is expecting these callbacks.";
-    rec_count_++;
-    // Process the recorded audio stream if an AudioStreamInterface
-    // implementation exists.
-    if (audio_stream_) {
-      audio_stream_->Write(audioSamples, nSamples);
-    }
-    if (ReceivedEnoughCallbacks()) {
-      if (test_is_done_) {
-        test_is_done_->Set();
-      }
-    }
-    return 0;
-  }
-
-  int32_t RealNeedMorePlayData(const size_t nSamples,
-                               const size_t nBytesPerSample,
-                               const size_t nChannels,
-                               const uint32_t samplesPerSec,
-                               void* audioSamples,
-                               size_t& nSamplesOut,
-                               int64_t* elapsed_time_ms,
-                               int64_t* ntp_time_ms) {
-    EXPECT_TRUE(play_mode()) << "No test is expecting these callbacks.";
-    play_count_++;
-    nSamplesOut = nSamples;
-    // Read (possibly processed) audio stream samples to be played out if an
-    // AudioStreamInterface implementation exists.
-    if (audio_stream_) {
-      audio_stream_->Read(audioSamples, nSamples);
-    } else {
-      memset(audioSamples, 0, nSamples * nBytesPerSample);
-    }
-    if (ReceivedEnoughCallbacks()) {
-      if (test_is_done_) {
-        test_is_done_->Set();
-      }
-    }
-    return 0;
-  }
-
-  bool ReceivedEnoughCallbacks() {
-    bool recording_done = false;
-    if (rec_mode())
-      recording_done = rec_count_ >= num_callbacks_;
-    else
-      recording_done = true;
-
-    bool playout_done = false;
-    if (play_mode())
-      playout_done = play_count_ >= num_callbacks_;
-    else
-      playout_done = true;
-
-    return recording_done && playout_done;
-  }
-
-  bool play_mode() const { return type_ & kPlayout; }
-  bool rec_mode() const { return type_ & kRecording; }
-
- private:
-  EventWrapper* test_is_done_;
-  size_t num_callbacks_;
-  int type_;
-  size_t play_count_;
-  size_t rec_count_;
-  AudioStreamInterface* audio_stream_;
-};
-
-// AudioDeviceTest test fixture.
-class AudioDeviceTest : public ::testing::Test {
- protected:
-  AudioDeviceTest() : test_is_done_(EventWrapper::Create()) {
-    old_sev_ = rtc::LogMessage::GetLogToDebug();
-    // Set suitable logging level here. Change to rtc::LS_INFO for more verbose
-    // output. See webrtc/rtc_base/logging.h for complete list of options.
-    rtc::LogMessage::LogToDebug(rtc::LS_INFO);
-    // Add extra logging fields here (timestamps and thread id).
-    // rtc::LogMessage::LogTimestamps();
-    rtc::LogMessage::LogThreads();
-    // Creates an audio device using a default audio layer.
-    audio_device_ = CreateAudioDevice(AudioDeviceModule::kPlatformDefaultAudio);
-    EXPECT_NE(audio_device_.get(), nullptr);
-    EXPECT_EQ(0, audio_device_->Init());
-    EXPECT_EQ(0,
-              audio_device()->GetPlayoutAudioParameters(&playout_parameters_));
-    EXPECT_EQ(0, audio_device()->GetRecordAudioParameters(&record_parameters_));
-  }
-  virtual ~AudioDeviceTest() {
-    EXPECT_EQ(0, audio_device_->Terminate());
-    rtc::LogMessage::LogToDebug(old_sev_);
-  }
-
-  int playout_sample_rate() const { return playout_parameters_.sample_rate(); }
-  int record_sample_rate() const { return record_parameters_.sample_rate(); }
-  int playout_channels() const { return playout_parameters_.channels(); }
-  int record_channels() const { return record_parameters_.channels(); }
-  size_t playout_frames_per_10ms_buffer() const {
-    return playout_parameters_.frames_per_10ms_buffer();
-  }
-  size_t record_frames_per_10ms_buffer() const {
-    return record_parameters_.frames_per_10ms_buffer();
-  }
-
-  rtc::scoped_refptr<AudioDeviceModule> audio_device() const {
-    return audio_device_;
-  }
-
-  AudioDeviceModuleImpl* audio_device_impl() const {
-    return static_cast<AudioDeviceModuleImpl*>(audio_device_.get());
-  }
-
-  AudioDeviceBuffer* audio_device_buffer() const {
-    return audio_device_impl()->GetAudioDeviceBuffer();
-  }
-
-  rtc::scoped_refptr<AudioDeviceModule> CreateAudioDevice(
-      AudioDeviceModule::AudioLayer audio_layer) {
-    rtc::scoped_refptr<AudioDeviceModule> module(
-        AudioDeviceModule::Create(0, audio_layer));
-    return module;
-  }
-
-  // Returns file name relative to the resource root given a sample rate.
-  std::string GetFileName(int sample_rate) {
-    EXPECT_TRUE(sample_rate == 48000 || sample_rate == 44100 ||
-                sample_rate == 16000);
-    char fname[64];
-    snprintf(fname, sizeof(fname), "audio_device/audio_short%d",
-             sample_rate / 1000);
-    std::string file_name(webrtc::test::ResourcePath(fname, "pcm"));
-    EXPECT_TRUE(test::FileExists(file_name));
-#ifdef ENABLE_DEBUG_PRINTF
-    PRINTD("file name: %s\n", file_name.c_str());
-    const size_t bytes = test::GetFileSize(file_name);
-    PRINTD("file size: %" PRIuS " [bytes]\n", bytes);
-    PRINTD("file size: %" PRIuS " [samples]\n", bytes / kBytesPerSample);
-    const int seconds =
-        static_cast<int>(bytes / (sample_rate * kBytesPerSample));
-    PRINTD("file size: %d [secs]\n", seconds);
-    PRINTD("file size: %" PRIuS " [callbacks]\n",
-           seconds * kNumCallbacksPerSecond);
-#endif
-    return file_name;
-  }
-
-  void StartPlayout() {
-    EXPECT_FALSE(audio_device()->Playing());
-    EXPECT_EQ(0, audio_device()->InitPlayout());
-    EXPECT_TRUE(audio_device()->PlayoutIsInitialized());
-    EXPECT_EQ(0, audio_device()->StartPlayout());
-    EXPECT_TRUE(audio_device()->Playing());
-  }
-
-  void StopPlayout() {
-    EXPECT_EQ(0, audio_device()->StopPlayout());
-    EXPECT_FALSE(audio_device()->Playing());
-  }
-
-  void StartRecording() {
-    EXPECT_FALSE(audio_device()->Recording());
-    EXPECT_EQ(0, audio_device()->InitRecording());
-    EXPECT_TRUE(audio_device()->RecordingIsInitialized());
-    EXPECT_EQ(0, audio_device()->StartRecording());
-    EXPECT_TRUE(audio_device()->Recording());
-  }
-
-  void StopRecording() {
-    EXPECT_EQ(0, audio_device()->StopRecording());
-    EXPECT_FALSE(audio_device()->Recording());
-  }
-
-  std::unique_ptr<EventWrapper> test_is_done_;
-  rtc::scoped_refptr<AudioDeviceModule> audio_device_;
-  AudioParameters playout_parameters_;
-  AudioParameters record_parameters_;
-  rtc::LoggingSeverity old_sev_;
-};
-
-TEST_F(AudioDeviceTest, ConstructDestruct) {
-  // Using the test fixture to create and destruct the audio device module.
-}
-
-TEST_F(AudioDeviceTest, InitTerminate) {
-  // Initialization is part of the test fixture.
-  EXPECT_TRUE(audio_device()->Initialized());
-  EXPECT_EQ(0, audio_device()->Terminate());
-  EXPECT_FALSE(audio_device()->Initialized());
-}
-
-// Tests that playout can be initiated, started and stopped. No audio callback
-// is registered in this test.
-// Failing when running on real iOS devices: bugs.webrtc.org/6889.
-TEST_F(AudioDeviceTest, DISABLED_StartStopPlayout) {
-  StartPlayout();
-  StopPlayout();
-  StartPlayout();
-  StopPlayout();
-}
-
-// Tests that recording can be initiated, started and stopped. No audio callback
-// is registered in this test.
-// Can sometimes fail when running on real devices: bugs.webrtc.org/7888.
-TEST_F(AudioDeviceTest, DISABLED_StartStopRecording) {
-  StartRecording();
-  StopRecording();
-  StartRecording();
-  StopRecording();
-}
-
-// Verify that calling StopPlayout() will leave us in an uninitialized state
-// which will require a new call to InitPlayout(). This test does not call
-// StartPlayout() while being uninitialized since doing so will hit a
-// RTC_DCHECK.
-TEST_F(AudioDeviceTest, StopPlayoutRequiresInitToRestart) {
-  EXPECT_EQ(0, audio_device()->InitPlayout());
-  EXPECT_EQ(0, audio_device()->StartPlayout());
-  EXPECT_EQ(0, audio_device()->StopPlayout());
-  EXPECT_FALSE(audio_device()->PlayoutIsInitialized());
-}
-
-// Verify that we can create two ADMs and start playing on the second ADM.
-// Only the first active instance shall activate an audio session and the
-// last active instance shall deactivate the audio session. The test does not
-// explicitly verify correct audio session calls but instead focuses on
-// ensuring that audio starts for both ADMs.
-
-// Failing when running on real iOS devices: bugs.webrtc.org/6889.
-TEST_F(AudioDeviceTest, DISABLED_StartPlayoutOnTwoInstances) {
-  // Create and initialize a second/extra ADM instance. The default ADM is
-  // created by the test harness.
-  rtc::scoped_refptr<AudioDeviceModule> second_audio_device =
-      CreateAudioDevice(AudioDeviceModule::kPlatformDefaultAudio);
-  EXPECT_NE(second_audio_device.get(), nullptr);
-  EXPECT_EQ(0, second_audio_device->Init());
-
-  // Start playout for the default ADM but don't wait here. Instead use the
-  // upcoming second stream for that. We set the same expectation on number
-  // of callbacks as for the second stream.
-  NiceMock<MockAudioTransportIOS> mock(kPlayout);
-  mock.HandleCallbacks(nullptr, nullptr, 0);
-  EXPECT_CALL(
-      mock, NeedMorePlayData(playout_frames_per_10ms_buffer(), kBytesPerSample,
-                             playout_channels(), playout_sample_rate(),
-                             NotNull(), _, _, _))
-      .Times(AtLeast(kNumCallbacks));
-  EXPECT_EQ(0, audio_device()->RegisterAudioCallback(&mock));
-  StartPlayout();
-
-  // Initialize playout for the second ADM. If all is OK, the second ADM shall
-  // reuse the audio session activated when the first ADM started playing.
-  // This call will also ensure that we avoid a problem related to initializing
-  // two different audio unit instances back to back (see webrtc:5166 for
-  // details).
-  EXPECT_EQ(0, second_audio_device->InitPlayout());
-  EXPECT_TRUE(second_audio_device->PlayoutIsInitialized());
-
-  // Start playout for the second ADM and verify that it starts as intended.
-  // Passing this test ensures that initialization of the second audio unit
-  // has been done successfully and that there is no conflict with the already
-  // playing first ADM.
-  MockAudioTransportIOS mock2(kPlayout);
-  mock2.HandleCallbacks(test_is_done_.get(), nullptr, kNumCallbacks);
-  EXPECT_CALL(
-      mock2, NeedMorePlayData(playout_frames_per_10ms_buffer(), kBytesPerSample,
-                              playout_channels(), playout_sample_rate(),
-                              NotNull(), _, _, _))
-      .Times(AtLeast(kNumCallbacks));
-  EXPECT_EQ(0, second_audio_device->RegisterAudioCallback(&mock2));
-  EXPECT_EQ(0, second_audio_device->StartPlayout());
-  EXPECT_TRUE(second_audio_device->Playing());
-  test_is_done_->Wait(kTestTimeOutInMilliseconds);
-  EXPECT_EQ(0, second_audio_device->StopPlayout());
-  EXPECT_FALSE(second_audio_device->Playing());
-  EXPECT_FALSE(second_audio_device->PlayoutIsInitialized());
-
-  EXPECT_EQ(0, second_audio_device->Terminate());
-}
-
-// Start playout and verify that the native audio layer starts asking for real
-// audio samples to play out using the NeedMorePlayData callback.
-TEST_F(AudioDeviceTest, StartPlayoutVerifyCallbacks) {
-  MockAudioTransportIOS mock(kPlayout);
-  mock.HandleCallbacks(test_is_done_.get(), nullptr, kNumCallbacks);
-  EXPECT_CALL(mock, NeedMorePlayData(playout_frames_per_10ms_buffer(),
-                                     kBytesPerSample, playout_channels(),
-                                     playout_sample_rate(), NotNull(), _, _, _))
-      .Times(AtLeast(kNumCallbacks));
-  EXPECT_EQ(0, audio_device()->RegisterAudioCallback(&mock));
-  StartPlayout();
-  test_is_done_->Wait(kTestTimeOutInMilliseconds);
-  StopPlayout();
-}
-
-// Start recording and verify that the native audio layer starts feeding real
-// audio samples via the RecordedDataIsAvailable callback.
-TEST_F(AudioDeviceTest, StartRecordingVerifyCallbacks) {
-  MockAudioTransportIOS mock(kRecording);
-  mock.HandleCallbacks(test_is_done_.get(), nullptr, kNumCallbacks);
-  EXPECT_CALL(mock,
-              RecordedDataIsAvailable(
-                  NotNull(), record_frames_per_10ms_buffer(), kBytesPerSample,
-                  record_channels(), record_sample_rate(),
-                  _,  // TODO(henrika): fix delay
-                  0, 0, false, _)).Times(AtLeast(kNumCallbacks));
-
-  EXPECT_EQ(0, audio_device()->RegisterAudioCallback(&mock));
-  StartRecording();
-  test_is_done_->Wait(kTestTimeOutInMilliseconds);
-  StopRecording();
-}
-
-// Start playout and recording (full-duplex audio) and verify that audio is
-// active in both directions.
-TEST_F(AudioDeviceTest, StartPlayoutAndRecordingVerifyCallbacks) {
-  MockAudioTransportIOS mock(kPlayout | kRecording);
-  mock.HandleCallbacks(test_is_done_.get(), nullptr, kNumCallbacks);
-  EXPECT_CALL(mock, NeedMorePlayData(playout_frames_per_10ms_buffer(),
-                                     kBytesPerSample, playout_channels(),
-                                     playout_sample_rate(), NotNull(), _, _, _))
-      .Times(AtLeast(kNumCallbacks));
-  EXPECT_CALL(mock,
-              RecordedDataIsAvailable(
-                  NotNull(), record_frames_per_10ms_buffer(), kBytesPerSample,
-                  record_channels(), record_sample_rate(),
-                  _,  // TODO(henrika): fix delay
-                  0, 0, false, _)).Times(AtLeast(kNumCallbacks));
-  EXPECT_EQ(0, audio_device()->RegisterAudioCallback(&mock));
-  StartPlayout();
-  StartRecording();
-  test_is_done_->Wait(kTestTimeOutInMilliseconds);
-  StopRecording();
-  StopPlayout();
-}
-
-// Start playout and read audio from an external PCM file when the audio layer
-// asks for data to play out. Real audio is played out in this test but it does
-// not contain any explicit verification that the audio quality is perfect.
-TEST_F(AudioDeviceTest, RunPlayoutWithFileAsSource) {
-  // TODO(henrika): extend test when mono output is supported.
-  EXPECT_EQ(1, playout_channels());
-  NiceMock<MockAudioTransportIOS> mock(kPlayout);
-  const int num_callbacks = kFilePlayTimeInSec * kNumCallbacksPerSecond;
-  std::string file_name = GetFileName(playout_sample_rate());
-  std::unique_ptr<FileAudioStream> file_audio_stream(
-      new FileAudioStream(num_callbacks, file_name, playout_sample_rate()));
-  mock.HandleCallbacks(test_is_done_.get(), file_audio_stream.get(),
-                       num_callbacks);
-  // SetMaxPlayoutVolume();
-  EXPECT_EQ(0, audio_device()->RegisterAudioCallback(&mock));
-  StartPlayout();
-  test_is_done_->Wait(kTestTimeOutInMilliseconds);
-  StopPlayout();
-}
-
-TEST_F(AudioDeviceTest, Devices) {
-  // Device enumeration is not supported. Verify fixed values only.
-  EXPECT_EQ(1, audio_device()->PlayoutDevices());
-  EXPECT_EQ(1, audio_device()->RecordingDevices());
-}
-
-// Start playout and recording and store recorded data in an intermediate FIFO
-// buffer from which the playout side then reads its samples in the same order
-// as they were stored. Under ideal circumstances, a callback sequence would
-// look like: ...+-+-+-+-+-+-+-..., where '+' means 'packet recorded' and '-'
-// means 'packet played'. Under such conditions, the FIFO would only contain
-// one packet on average. However, under more realistic conditions, the size
-// of the FIFO will vary more due to an unbalance between the two sides.
-// This test tries to verify that the device maintains a balanced callback-
-// sequence by running in loopback for ten seconds while measuring the size
-// (max and average) of the FIFO. The size of the FIFO is increased by the
-// recording side and decreased by the playout side.
-// TODO(henrika): tune the final test parameters after running tests on several
-// different devices.
-TEST_F(AudioDeviceTest, RunPlayoutAndRecordingInFullDuplex) {
-  EXPECT_EQ(record_channels(), playout_channels());
-  EXPECT_EQ(record_sample_rate(), playout_sample_rate());
-  NiceMock<MockAudioTransportIOS> mock(kPlayout | kRecording);
-  std::unique_ptr<FifoAudioStream> fifo_audio_stream(
-      new FifoAudioStream(playout_frames_per_10ms_buffer()));
-  mock.HandleCallbacks(test_is_done_.get(), fifo_audio_stream.get(),
-                       kFullDuplexTimeInSec * kNumCallbacksPerSecond);
-  // SetMaxPlayoutVolume();
-  EXPECT_EQ(0, audio_device()->RegisterAudioCallback(&mock));
-  StartRecording();
-  StartPlayout();
-  test_is_done_->Wait(
-      std::max(kTestTimeOutInMilliseconds, 1000 * kFullDuplexTimeInSec));
-  StopPlayout();
-  StopRecording();
-  EXPECT_LE(fifo_audio_stream->average_size(), 10u);
-  EXPECT_LE(fifo_audio_stream->largest_size(), 20u);
-}
-
-// Measures loopback latency and reports the min, max and average values for
-// a full duplex audio session.
-// The latency is measured like so:
-// - Insert impulses periodically on the output side.
-// - Detect the impulses on the input side.
-// - Measure the time difference between the transmit time and receive time.
-// - Store time differences in a vector and calculate min, max and average.
-// This test requires a special hardware called Audio Loopback Dongle.
-// See http://source.android.com/devices/audio/loopback.html for details.
-TEST_F(AudioDeviceTest, DISABLED_MeasureLoopbackLatency) {
-  EXPECT_EQ(record_channels(), playout_channels());
-  EXPECT_EQ(record_sample_rate(), playout_sample_rate());
-  NiceMock<MockAudioTransportIOS> mock(kPlayout | kRecording);
-  std::unique_ptr<LatencyMeasuringAudioStream> latency_audio_stream(
-      new LatencyMeasuringAudioStream(playout_frames_per_10ms_buffer()));
-  mock.HandleCallbacks(test_is_done_.get(), latency_audio_stream.get(),
-                       kMeasureLatencyTimeInSec * kNumCallbacksPerSecond);
-  EXPECT_EQ(0, audio_device()->RegisterAudioCallback(&mock));
-  // SetMaxPlayoutVolume();
-  // DisableBuiltInAECIfAvailable();
-  StartRecording();
-  StartPlayout();
-  test_is_done_->Wait(
-      std::max(kTestTimeOutInMilliseconds, 1000 * kMeasureLatencyTimeInSec));
-  StopPlayout();
-  StopRecording();
-  // Verify that the correct number of transmitted impulses are detected.
-  EXPECT_EQ(latency_audio_stream->num_latency_values(),
-            static_cast<size_t>(
-                kImpulseFrequencyInHz * kMeasureLatencyTimeInSec - 1));
-  latency_audio_stream->PrintResults();
-}
-
-// Verifies that the AudioDeviceIOS is_interrupted_ flag is reset correctly
-// after an iOS AVAudioSessionInterruptionTypeEnded notification event.
-// AudioDeviceIOS listens to RTCAudioSession interrupted notifications by:
-// - In AudioDeviceIOS.InitPlayOrRecord registers its audio_session_observer_
-//   callback with RTCAudioSession's delegate list.
-// - When RTCAudioSession receives an iOS audio interrupted notification, it
-//   passes the notification to callbacks in its delegate list which sets
-//   AudioDeviceIOS's is_interrupted_ flag to true.
-// - When AudioDeviceIOS.ShutdownPlayOrRecord is called, its
-//   audio_session_observer_ callback is removed from RTCAudioSessions's
-//   delegate list.
-//   So if RTCAudioSession receives an iOS end audio interruption notification,
-//   AudioDeviceIOS is not notified as its callback is not in RTCAudioSession's
-//   delegate list. This causes AudioDeviceIOS's is_interrupted_ flag to be in
-//   the wrong (true) state and the audio session will ignore audio changes.
-// As RTCAudioSession keeps its own interrupted state, the fix is to initialize
-// AudioDeviceIOS's is_interrupted_ flag to RTCAudioSession's isInterrupted
-// flag in AudioDeviceIOS.InitPlayOrRecord.
-TEST_F(AudioDeviceTest, testInterruptedAudioSession) {
-  RTCAudioSession *session = [RTCAudioSession sharedInstance];
-  std::unique_ptr<webrtc::AudioDeviceIOS> audio_device;
-  audio_device.reset(new webrtc::AudioDeviceIOS());
-  std::unique_ptr<webrtc::AudioDeviceBuffer> audio_buffer;
-  audio_buffer.reset(new webrtc::AudioDeviceBuffer());
-  audio_device->AttachAudioBuffer(audio_buffer.get());
-  audio_device->Init();
-  audio_device->InitPlayout();
-  // Force interruption.
-  [session notifyDidBeginInterruption];
-
-  // Wait for notification to propagate.
-  rtc::MessageQueueManager::ProcessAllMessageQueues();
-  EXPECT_TRUE(audio_device->is_interrupted_);
-
-  // Force it for testing.
-  audio_device->playing_ = false;
-  audio_device->ShutdownPlayOrRecord();
-  // Force it for testing.
-  audio_device->audio_is_initialized_ = false;
-
-  [session notifyDidEndInterruptionWithShouldResumeSession:YES];
-  // Wait for notification to propagate.
-  rtc::MessageQueueManager::ProcessAllMessageQueues();
-  EXPECT_TRUE(audio_device->is_interrupted_);
-
-  audio_device->Init();
-  audio_device->InitPlayout();
-  EXPECT_FALSE(audio_device->is_interrupted_);
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_device/ios/audio_session_observer.h b/modules/audio_device/ios/audio_session_observer.h
deleted file mode 100644
index 459226f..0000000
--- a/modules/audio_device/ios/audio_session_observer.h
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- *  Copyright 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_DEVICE_IOS_AUDIO_SESSION_OBSERVER_H_
-#define WEBRTC_MODULES_AUDIO_DEVICE_IOS_AUDIO_SESSION_OBSERVER_H_
-
-#include "webrtc/rtc_base/asyncinvoker.h"
-#include "webrtc/rtc_base/thread.h"
-
-namespace webrtc {
-
-// Observer interface for listening to AVAudioSession events.
-class AudioSessionObserver {
- public:
-  // Called when audio session interruption begins.
-  virtual void OnInterruptionBegin() = 0;
-
-  // Called when audio session interruption ends.
-  virtual void OnInterruptionEnd() = 0;
-
-  // Called when audio route changes.
-  virtual void OnValidRouteChange() = 0;
-
-  // Called when the ability to play or record changes.
-  virtual void OnCanPlayOrRecordChange(bool can_play_or_record) = 0;
-
-  virtual void OnChangedOutputVolume() = 0;
-
- protected:
-  virtual ~AudioSessionObserver() {}
-};
-
-}  // namespace webrtc
-
-#endif  //  WEBRTC_MODULES_AUDIO_DEVICE_IOS_AUDIO_SESSION_OBSERVER_H_
diff --git a/modules/audio_device/ios/objc/RTCAudioSession.h b/modules/audio_device/ios/objc/RTCAudioSession.h
deleted file mode 100644
index 2f52ca3..0000000
--- a/modules/audio_device/ios/objc/RTCAudioSession.h
+++ /dev/null
@@ -1,11 +0,0 @@
-/*
- *  Copyright 2017 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.
- */
-
-#import "webrtc/sdk/objc/Framework/Headers/WebRTC/RTCAudioSession.h"
diff --git a/modules/audio_device/ios/objc/RTCAudioSessionConfiguration.h b/modules/audio_device/ios/objc/RTCAudioSessionConfiguration.h
deleted file mode 100644
index e409108..0000000
--- a/modules/audio_device/ios/objc/RTCAudioSessionConfiguration.h
+++ /dev/null
@@ -1,11 +0,0 @@
-/*
- *  Copyright 2017 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.
- */
-
-#import "webrtc/sdk/objc/Framework/Headers/WebRTC/RTCAudioSessionConfiguration.h"
diff --git a/modules/audio_device/ios/objc/RTCAudioSessionDelegateAdapter.h b/modules/audio_device/ios/objc/RTCAudioSessionDelegateAdapter.h
deleted file mode 100644
index 9f71e97..0000000
--- a/modules/audio_device/ios/objc/RTCAudioSessionDelegateAdapter.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- *  Copyright 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.
- */
-
-#import "webrtc/sdk/objc/Framework/Headers/WebRTC/RTCAudioSession.h"
-
-namespace webrtc {
-class AudioSessionObserver;
-}
-
-/** Adapter that forwards RTCAudioSessionDelegate calls to the appropriate
- *  methods on the AudioSessionObserver.
- */
-@interface RTCAudioSessionDelegateAdapter : NSObject <RTCAudioSessionDelegate>
-
-- (instancetype)init NS_UNAVAILABLE;
-
-/** |observer| is a raw pointer and should be kept alive
- *  for this object's lifetime.
- */
-- (instancetype)initWithObserver:(webrtc::AudioSessionObserver *)observer
-    NS_DESIGNATED_INITIALIZER;
-
-@end
diff --git a/modules/audio_device/ios/objc/RTCAudioSessionDelegateAdapter.mm b/modules/audio_device/ios/objc/RTCAudioSessionDelegateAdapter.mm
deleted file mode 100644
index 6ef1261..0000000
--- a/modules/audio_device/ios/objc/RTCAudioSessionDelegateAdapter.mm
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- *  Copyright 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.
- */
-
-#import "webrtc/modules/audio_device/ios/objc/RTCAudioSessionDelegateAdapter.h"
-
-#include "webrtc/modules/audio_device/ios/audio_session_observer.h"
-
-#import "WebRTC/RTCLogging.h"
-
-@implementation RTCAudioSessionDelegateAdapter {
-  webrtc::AudioSessionObserver *_observer;
-}
-
-- (instancetype)initWithObserver:(webrtc::AudioSessionObserver *)observer {
-  NSParameterAssert(observer);
-  if (self = [super init]) {
-    _observer = observer;
-  }
-  return self;
-}
-
-#pragma mark - RTCAudioSessionDelegate
-
-- (void)audioSessionDidBeginInterruption:(RTCAudioSession *)session {
-  _observer->OnInterruptionBegin();
-}
-
-- (void)audioSessionDidEndInterruption:(RTCAudioSession *)session
-                   shouldResumeSession:(BOOL)shouldResumeSession {
-  _observer->OnInterruptionEnd();
-}
-
-- (void)audioSessionDidChangeRoute:(RTCAudioSession *)session
-           reason:(AVAudioSessionRouteChangeReason)reason
-    previousRoute:(AVAudioSessionRouteDescription *)previousRoute {
-  switch (reason) {
-    case AVAudioSessionRouteChangeReasonUnknown:
-    case AVAudioSessionRouteChangeReasonNewDeviceAvailable:
-    case AVAudioSessionRouteChangeReasonOldDeviceUnavailable:
-    case AVAudioSessionRouteChangeReasonCategoryChange:
-      // It turns out that we see a category change (at least in iOS 9.2)
-      // when making a switch from a BT device to e.g. Speaker using the
-      // iOS Control Center and that we therefore must check if the sample
-      // rate has changed. And if so is the case, restart the audio unit.
-    case AVAudioSessionRouteChangeReasonOverride:
-    case AVAudioSessionRouteChangeReasonWakeFromSleep:
-    case AVAudioSessionRouteChangeReasonNoSuitableRouteForCategory:
-      _observer->OnValidRouteChange();
-      break;
-    case AVAudioSessionRouteChangeReasonRouteConfigurationChange:
-      // The set of input and output ports has not changed, but their
-      // configuration has, e.g., a port’s selected data source has
-      // changed. Ignore this type of route change since we are focusing
-      // on detecting headset changes.
-      RTCLog(@"Ignoring RouteConfigurationChange");
-      break;
-  }
-}
-
-- (void)audioSessionMediaServerTerminated:(RTCAudioSession *)session {
-}
-
-- (void)audioSessionMediaServerReset:(RTCAudioSession *)session {
-}
-
-- (void)audioSession:(RTCAudioSession *)session
-    didChangeCanPlayOrRecord:(BOOL)canPlayOrRecord {
-  _observer->OnCanPlayOrRecordChange(canPlayOrRecord);
-}
-
-- (void)audioSessionDidStartPlayOrRecord:(RTCAudioSession *)session {
-}
-
-- (void)audioSessionDidStopPlayOrRecord:(RTCAudioSession *)session {
-}
-
-- (void)audioSession:(RTCAudioSession *)audioSession
-    didChangeOutputVolume:(float)outputVolume {
-  _observer->OnChangedOutputVolume();
-}
-
-@end
diff --git a/modules/audio_device/ios/voice_processing_audio_unit.h b/modules/audio_device/ios/voice_processing_audio_unit.h
deleted file mode 100644
index 2f881e7..0000000
--- a/modules/audio_device/ios/voice_processing_audio_unit.h
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
- *  Copyright 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_DEVICE_IOS_VOICE_PROCESSING_AUDIO_UNIT_H_
-#define WEBRTC_MODULES_AUDIO_DEVICE_IOS_VOICE_PROCESSING_AUDIO_UNIT_H_
-
-#include <AudioUnit/AudioUnit.h>
-
-namespace webrtc {
-
-class VoiceProcessingAudioUnitObserver {
- public:
-  // Callback function called on a real-time priority I/O thread from the audio
-  // unit. This method is used to signal that recorded audio is available.
-  virtual OSStatus OnDeliverRecordedData(AudioUnitRenderActionFlags* flags,
-                                         const AudioTimeStamp* time_stamp,
-                                         UInt32 bus_number,
-                                         UInt32 num_frames,
-                                         AudioBufferList* io_data) = 0;
-
-  // Callback function called on a real-time priority I/O thread from the audio
-  // unit. This method is used to provide audio samples to the audio unit.
-  virtual OSStatus OnGetPlayoutData(AudioUnitRenderActionFlags* io_action_flags,
-                                    const AudioTimeStamp* time_stamp,
-                                    UInt32 bus_number,
-                                    UInt32 num_frames,
-                                    AudioBufferList* io_data) = 0;
-
- protected:
-  ~VoiceProcessingAudioUnitObserver() {}
-};
-
-// Convenience class to abstract away the management of a Voice Processing
-// I/O Audio Unit. The Voice Processing I/O unit has the same characteristics
-// as the Remote I/O unit (supports full duplex low-latency audio input and
-// output) and adds AEC for for two-way duplex communication. It also adds AGC,
-// adjustment of voice-processing quality, and muting. Hence, ideal for
-// VoIP applications.
-class VoiceProcessingAudioUnit {
- public:
-  explicit VoiceProcessingAudioUnit(VoiceProcessingAudioUnitObserver* observer);
-  ~VoiceProcessingAudioUnit();
-
-  // TODO(tkchin): enum for state and state checking.
-  enum State : int32_t {
-    // Init() should be called.
-    kInitRequired,
-    // Audio unit created but not initialized.
-    kUninitialized,
-    // Initialized but not started. Equivalent to stopped.
-    kInitialized,
-    // Initialized and started.
-    kStarted,
-  };
-
-  // Number of bytes per audio sample for 16-bit signed integer representation.
-  static const UInt32 kBytesPerSample;
-
-  // Initializes this class by creating the underlying audio unit instance.
-  // Creates a Voice-Processing I/O unit and configures it for full-duplex
-  // audio. The selected stream format is selected to avoid internal resampling
-  // and to match the 10ms callback rate for WebRTC as well as possible.
-  // Does not intialize the audio unit.
-  bool Init();
-
-  VoiceProcessingAudioUnit::State GetState() const;
-
-  // Initializes the underlying audio unit with the given sample rate.
-  bool Initialize(Float64 sample_rate);
-
-  // Starts the underlying audio unit.
-  bool Start();
-
-  // Stops the underlying audio unit.
-  bool Stop();
-
-  // Uninitializes the underlying audio unit.
-  bool Uninitialize();
-
-  // Calls render on the underlying audio unit.
-  OSStatus Render(AudioUnitRenderActionFlags* flags,
-                  const AudioTimeStamp* time_stamp,
-                  UInt32 output_bus_number,
-                  UInt32 num_frames,
-                  AudioBufferList* io_data);
-
- private:
-  // The C API used to set callbacks requires static functions. When these are
-  // called, they will invoke the relevant instance method by casting
-  // in_ref_con to VoiceProcessingAudioUnit*.
-  static OSStatus OnGetPlayoutData(void* in_ref_con,
-                                   AudioUnitRenderActionFlags* flags,
-                                   const AudioTimeStamp* time_stamp,
-                                   UInt32 bus_number,
-                                   UInt32 num_frames,
-                                   AudioBufferList* io_data);
-  static OSStatus OnDeliverRecordedData(void* in_ref_con,
-                                        AudioUnitRenderActionFlags* flags,
-                                        const AudioTimeStamp* time_stamp,
-                                        UInt32 bus_number,
-                                        UInt32 num_frames,
-                                        AudioBufferList* io_data);
-
-  // Notifies observer that samples are needed for playback.
-  OSStatus NotifyGetPlayoutData(AudioUnitRenderActionFlags* flags,
-                                const AudioTimeStamp* time_stamp,
-                                UInt32 bus_number,
-                                UInt32 num_frames,
-                                AudioBufferList* io_data);
-  // Notifies observer that recorded samples are available for render.
-  OSStatus NotifyDeliverRecordedData(AudioUnitRenderActionFlags* flags,
-                                     const AudioTimeStamp* time_stamp,
-                                     UInt32 bus_number,
-                                     UInt32 num_frames,
-                                     AudioBufferList* io_data);
-
-  // Returns the predetermined format with a specific sample rate. See
-  // implementation file for details on format.
-  AudioStreamBasicDescription GetFormat(Float64 sample_rate) const;
-
-  // Deletes the underlying audio unit.
-  void DisposeAudioUnit();
-
-  VoiceProcessingAudioUnitObserver* observer_;
-  AudioUnit vpio_unit_;
-  VoiceProcessingAudioUnit::State state_;
-};
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_DEVICE_IOS_VOICE_PROCESSING_AUDIO_UNIT_H_
diff --git a/modules/audio_device/ios/voice_processing_audio_unit.mm b/modules/audio_device/ios/voice_processing_audio_unit.mm
deleted file mode 100644
index 3701f3f..0000000
--- a/modules/audio_device/ios/voice_processing_audio_unit.mm
+++ /dev/null
@@ -1,457 +0,0 @@
-/*
- *  Copyright 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.
- */
-
-#import "webrtc/modules/audio_device/ios/voice_processing_audio_unit.h"
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/system_wrappers/include/metrics.h"
-
-#import "WebRTC/RTCLogging.h"
-#import "webrtc/sdk/objc/Framework/Headers/WebRTC/RTCAudioSessionConfiguration.h"
-
-#if !defined(NDEBUG)
-static void LogStreamDescription(AudioStreamBasicDescription description) {
-  char formatIdString[5];
-  UInt32 formatId = CFSwapInt32HostToBig(description.mFormatID);
-  bcopy(&formatId, formatIdString, 4);
-  formatIdString[4] = '\0';
-  RTCLog(@"AudioStreamBasicDescription: {\n"
-          "  mSampleRate: %.2f\n"
-          "  formatIDString: %s\n"
-          "  mFormatFlags: 0x%X\n"
-          "  mBytesPerPacket: %u\n"
-          "  mFramesPerPacket: %u\n"
-          "  mBytesPerFrame: %u\n"
-          "  mChannelsPerFrame: %u\n"
-          "  mBitsPerChannel: %u\n"
-          "  mReserved: %u\n}",
-         description.mSampleRate, formatIdString,
-         static_cast<unsigned int>(description.mFormatFlags),
-         static_cast<unsigned int>(description.mBytesPerPacket),
-         static_cast<unsigned int>(description.mFramesPerPacket),
-         static_cast<unsigned int>(description.mBytesPerFrame),
-         static_cast<unsigned int>(description.mChannelsPerFrame),
-         static_cast<unsigned int>(description.mBitsPerChannel),
-         static_cast<unsigned int>(description.mReserved));
-}
-#endif
-
-namespace webrtc {
-
-// Calls to AudioUnitInitialize() can fail if called back-to-back on different
-// ADM instances. A fall-back solution is to allow multiple sequential calls
-// with as small delay between each. This factor sets the max number of allowed
-// initialization attempts.
-static const int kMaxNumberOfAudioUnitInitializeAttempts = 5;
-// A VP I/O unit's bus 1 connects to input hardware (microphone).
-static const AudioUnitElement kInputBus = 1;
-// A VP I/O unit's bus 0 connects to output hardware (speaker).
-static const AudioUnitElement kOutputBus = 0;
-
-// Returns the automatic gain control (AGC) state on the processed microphone
-// signal. Should be on by default for Voice Processing audio units.
-static OSStatus GetAGCState(AudioUnit audio_unit, UInt32* enabled) {
-  RTC_DCHECK(audio_unit);
-  UInt32 size = sizeof(*enabled);
-  OSStatus result = AudioUnitGetProperty(audio_unit,
-                                         kAUVoiceIOProperty_VoiceProcessingEnableAGC,
-                                         kAudioUnitScope_Global,
-                                         kInputBus,
-                                         enabled,
-                                         &size);
-  RTCLog(@"VPIO unit AGC: %u", static_cast<unsigned int>(*enabled));
-  return result;
-}
-
-VoiceProcessingAudioUnit::VoiceProcessingAudioUnit(
-    VoiceProcessingAudioUnitObserver* observer)
-    : observer_(observer), vpio_unit_(nullptr), state_(kInitRequired) {
-  RTC_DCHECK(observer);
-}
-
-VoiceProcessingAudioUnit::~VoiceProcessingAudioUnit() {
-  DisposeAudioUnit();
-}
-
-const UInt32 VoiceProcessingAudioUnit::kBytesPerSample = 2;
-
-bool VoiceProcessingAudioUnit::Init() {
-  RTC_DCHECK_EQ(state_, kInitRequired);
-
-  // Create an audio component description to identify the Voice Processing
-  // I/O audio unit.
-  AudioComponentDescription vpio_unit_description;
-  vpio_unit_description.componentType = kAudioUnitType_Output;
-  vpio_unit_description.componentSubType = kAudioUnitSubType_VoiceProcessingIO;
-  vpio_unit_description.componentManufacturer = kAudioUnitManufacturer_Apple;
-  vpio_unit_description.componentFlags = 0;
-  vpio_unit_description.componentFlagsMask = 0;
-
-  // Obtain an audio unit instance given the description.
-  AudioComponent found_vpio_unit_ref =
-      AudioComponentFindNext(nullptr, &vpio_unit_description);
-
-  // Create a Voice Processing IO audio unit.
-  OSStatus result = noErr;
-  result = AudioComponentInstanceNew(found_vpio_unit_ref, &vpio_unit_);
-  if (result != noErr) {
-    vpio_unit_ = nullptr;
-    RTCLogError(@"AudioComponentInstanceNew failed. Error=%ld.", (long)result);
-    return false;
-  }
-
-  // Enable input on the input scope of the input element.
-  UInt32 enable_input = 1;
-  result = AudioUnitSetProperty(vpio_unit_, kAudioOutputUnitProperty_EnableIO,
-                                kAudioUnitScope_Input, kInputBus, &enable_input,
-                                sizeof(enable_input));
-  if (result != noErr) {
-    DisposeAudioUnit();
-    RTCLogError(@"Failed to enable input on input scope of input element. "
-                 "Error=%ld.",
-                (long)result);
-    return false;
-  }
-
-  // Enable output on the output scope of the output element.
-  UInt32 enable_output = 1;
-  result = AudioUnitSetProperty(vpio_unit_, kAudioOutputUnitProperty_EnableIO,
-                                kAudioUnitScope_Output, kOutputBus,
-                                &enable_output, sizeof(enable_output));
-  if (result != noErr) {
-    DisposeAudioUnit();
-    RTCLogError(@"Failed to enable output on output scope of output element. "
-                 "Error=%ld.",
-                (long)result);
-    return false;
-  }
-
-  // Specify the callback function that provides audio samples to the audio
-  // unit.
-  AURenderCallbackStruct render_callback;
-  render_callback.inputProc = OnGetPlayoutData;
-  render_callback.inputProcRefCon = this;
-  result = AudioUnitSetProperty(
-      vpio_unit_, kAudioUnitProperty_SetRenderCallback, kAudioUnitScope_Input,
-      kOutputBus, &render_callback, sizeof(render_callback));
-  if (result != noErr) {
-    DisposeAudioUnit();
-    RTCLogError(@"Failed to specify the render callback on the output bus. "
-                 "Error=%ld.",
-                (long)result);
-    return false;
-  }
-
-  // Disable AU buffer allocation for the recorder, we allocate our own.
-  // TODO(henrika): not sure that it actually saves resource to make this call.
-  UInt32 flag = 0;
-  result = AudioUnitSetProperty(
-      vpio_unit_, kAudioUnitProperty_ShouldAllocateBuffer,
-      kAudioUnitScope_Output, kInputBus, &flag, sizeof(flag));
-  if (result != noErr) {
-    DisposeAudioUnit();
-    RTCLogError(@"Failed to disable buffer allocation on the input bus. "
-                 "Error=%ld.",
-                (long)result);
-    return false;
-  }
-
-  // Specify the callback to be called by the I/O thread to us when input audio
-  // is available. The recorded samples can then be obtained by calling the
-  // AudioUnitRender() method.
-  AURenderCallbackStruct input_callback;
-  input_callback.inputProc = OnDeliverRecordedData;
-  input_callback.inputProcRefCon = this;
-  result = AudioUnitSetProperty(vpio_unit_,
-                                kAudioOutputUnitProperty_SetInputCallback,
-                                kAudioUnitScope_Global, kInputBus,
-                                &input_callback, sizeof(input_callback));
-  if (result != noErr) {
-    DisposeAudioUnit();
-    RTCLogError(@"Failed to specify the input callback on the input bus. "
-                 "Error=%ld.",
-                (long)result);
-    return false;
-  }
-
-  state_ = kUninitialized;
-  return true;
-}
-
-VoiceProcessingAudioUnit::State VoiceProcessingAudioUnit::GetState() const {
-  return state_;
-}
-
-bool VoiceProcessingAudioUnit::Initialize(Float64 sample_rate) {
-  RTC_DCHECK_GE(state_, kUninitialized);
-  RTCLog(@"Initializing audio unit with sample rate: %f", sample_rate);
-
-  OSStatus result = noErr;
-  AudioStreamBasicDescription format = GetFormat(sample_rate);
-  UInt32 size = sizeof(format);
-#if !defined(NDEBUG)
-  LogStreamDescription(format);
-#endif
-
-  // Set the format on the output scope of the input element/bus.
-  result =
-      AudioUnitSetProperty(vpio_unit_, kAudioUnitProperty_StreamFormat,
-                           kAudioUnitScope_Output, kInputBus, &format, size);
-  if (result != noErr) {
-    RTCLogError(@"Failed to set format on output scope of input bus. "
-                 "Error=%ld.",
-                (long)result);
-    return false;
-  }
-
-  // Set the format on the input scope of the output element/bus.
-  result =
-      AudioUnitSetProperty(vpio_unit_, kAudioUnitProperty_StreamFormat,
-                           kAudioUnitScope_Input, kOutputBus, &format, size);
-  if (result != noErr) {
-    RTCLogError(@"Failed to set format on input scope of output bus. "
-                 "Error=%ld.",
-                (long)result);
-    return false;
-  }
-
-  // Initialize the Voice Processing I/O unit instance.
-  // Calls to AudioUnitInitialize() can fail if called back-to-back on
-  // different ADM instances. The error message in this case is -66635 which is
-  // undocumented. Tests have shown that calling AudioUnitInitialize a second
-  // time, after a short sleep, avoids this issue.
-  // See webrtc:5166 for details.
-  int failed_initalize_attempts = 0;
-  result = AudioUnitInitialize(vpio_unit_);
-  while (result != noErr) {
-    RTCLogError(@"Failed to initialize the Voice Processing I/O unit. "
-                 "Error=%ld.",
-                (long)result);
-    ++failed_initalize_attempts;
-    if (failed_initalize_attempts == kMaxNumberOfAudioUnitInitializeAttempts) {
-      // Max number of initialization attempts exceeded, hence abort.
-      RTCLogError(@"Too many initialization attempts.");
-      return false;
-    }
-    RTCLog(@"Pause 100ms and try audio unit initialization again...");
-    [NSThread sleepForTimeInterval:0.1f];
-    result = AudioUnitInitialize(vpio_unit_);
-  }
-  if (result == noErr) {
-    RTCLog(@"Voice Processing I/O unit is now initialized.");
-  }
-
-  // AGC should be enabled by default for Voice Processing I/O units but it is
-  // checked below and enabled explicitly if needed. This scheme is used
-  // to be absolutely sure that the AGC is enabled since we have seen cases
-  // where only zeros are recorded and a disabled AGC could be one of the
-  // reasons why it happens.
-  int agc_was_enabled_by_default = 1;
-  UInt32 agc_is_enabled = 0;
-  result = GetAGCState(vpio_unit_, &agc_is_enabled);
-  if (result != noErr) {
-    RTCLogError(@"Failed to get AGC state (1st attempt). "
-                 "Error=%ld.",
-                (long)result);
-  } else if (!agc_is_enabled) {
-    // Remember that the AGC was disabled by default. Will be used in UMA.
-    agc_was_enabled_by_default = 0;
-    // Try to enable the AGC.
-    UInt32 enable_agc = 1;
-    result =
-        AudioUnitSetProperty(vpio_unit_,
-                             kAUVoiceIOProperty_VoiceProcessingEnableAGC,
-                             kAudioUnitScope_Global, kInputBus, &enable_agc,
-                             sizeof(enable_agc));
-    if (result != noErr) {
-      RTCLogError(@"Failed to enable the built-in AGC. "
-                   "Error=%ld.",
-                  (long)result);
-    }
-    result = GetAGCState(vpio_unit_, &agc_is_enabled);
-    if (result != noErr) {
-      RTCLogError(@"Failed to get AGC state (2nd attempt). "
-                   "Error=%ld.",
-                  (long)result);
-    }
-  }
-
-  // Track if the built-in AGC was enabled by default (as it should) or not.
-  RTC_HISTOGRAM_BOOLEAN("WebRTC.Audio.BuiltInAGCWasEnabledByDefault",
-                        agc_was_enabled_by_default);
-  RTCLog(@"WebRTC.Audio.BuiltInAGCWasEnabledByDefault: %d",
-         agc_was_enabled_by_default);
-  // As a final step, add an UMA histogram for tracking the AGC state.
-  // At this stage, the AGC should be enabled, and if it is not, more work is
-  // needed to find out the root cause.
-  RTC_HISTOGRAM_BOOLEAN("WebRTC.Audio.BuiltInAGCIsEnabled", agc_is_enabled);
-  RTCLog(@"WebRTC.Audio.BuiltInAGCIsEnabled: %u",
-         static_cast<unsigned int>(agc_is_enabled));
-
-  state_ = kInitialized;
-  return true;
-}
-
-bool VoiceProcessingAudioUnit::Start() {
-  RTC_DCHECK_GE(state_, kUninitialized);
-  RTCLog(@"Starting audio unit.");
-
-  OSStatus result = AudioOutputUnitStart(vpio_unit_);
-  if (result != noErr) {
-    RTCLogError(@"Failed to start audio unit. Error=%ld", (long)result);
-    return false;
-  } else {
-    RTCLog(@"Started audio unit");
-  }
-  state_ = kStarted;
-  return true;
-}
-
-bool VoiceProcessingAudioUnit::Stop() {
-  RTC_DCHECK_GE(state_, kUninitialized);
-  RTCLog(@"Stopping audio unit.");
-
-  OSStatus result = AudioOutputUnitStop(vpio_unit_);
-  if (result != noErr) {
-    RTCLogError(@"Failed to stop audio unit. Error=%ld", (long)result);
-    return false;
-  } else {
-    RTCLog(@"Stopped audio unit");
-  }
-
-  state_ = kInitialized;
-  return true;
-}
-
-bool VoiceProcessingAudioUnit::Uninitialize() {
-  RTC_DCHECK_GE(state_, kUninitialized);
-  RTCLog(@"Unintializing audio unit.");
-
-  OSStatus result = AudioUnitUninitialize(vpio_unit_);
-  if (result != noErr) {
-    RTCLogError(@"Failed to uninitialize audio unit. Error=%ld", (long)result);
-    return false;
-  } else {
-    RTCLog(@"Uninitialized audio unit.");
-  }
-
-  state_ = kUninitialized;
-  return true;
-}
-
-OSStatus VoiceProcessingAudioUnit::Render(AudioUnitRenderActionFlags* flags,
-                                          const AudioTimeStamp* time_stamp,
-                                          UInt32 output_bus_number,
-                                          UInt32 num_frames,
-                                          AudioBufferList* io_data) {
-  RTC_DCHECK(vpio_unit_) << "Init() not called.";
-
-  OSStatus result = AudioUnitRender(vpio_unit_, flags, time_stamp,
-                                    output_bus_number, num_frames, io_data);
-  if (result != noErr) {
-    RTCLogError(@"Failed to render audio unit. Error=%ld", (long)result);
-  }
-  return result;
-}
-
-OSStatus VoiceProcessingAudioUnit::OnGetPlayoutData(
-    void* in_ref_con,
-    AudioUnitRenderActionFlags* flags,
-    const AudioTimeStamp* time_stamp,
-    UInt32 bus_number,
-    UInt32 num_frames,
-    AudioBufferList* io_data) {
-  VoiceProcessingAudioUnit* audio_unit =
-      static_cast<VoiceProcessingAudioUnit*>(in_ref_con);
-  return audio_unit->NotifyGetPlayoutData(flags, time_stamp, bus_number,
-                                          num_frames, io_data);
-}
-
-OSStatus VoiceProcessingAudioUnit::OnDeliverRecordedData(
-    void* in_ref_con,
-    AudioUnitRenderActionFlags* flags,
-    const AudioTimeStamp* time_stamp,
-    UInt32 bus_number,
-    UInt32 num_frames,
-    AudioBufferList* io_data) {
-  VoiceProcessingAudioUnit* audio_unit =
-      static_cast<VoiceProcessingAudioUnit*>(in_ref_con);
-  return audio_unit->NotifyDeliverRecordedData(flags, time_stamp, bus_number,
-                                               num_frames, io_data);
-}
-
-OSStatus VoiceProcessingAudioUnit::NotifyGetPlayoutData(
-    AudioUnitRenderActionFlags* flags,
-    const AudioTimeStamp* time_stamp,
-    UInt32 bus_number,
-    UInt32 num_frames,
-    AudioBufferList* io_data) {
-  return observer_->OnGetPlayoutData(flags, time_stamp, bus_number, num_frames,
-                                     io_data);
-}
-
-OSStatus VoiceProcessingAudioUnit::NotifyDeliverRecordedData(
-    AudioUnitRenderActionFlags* flags,
-    const AudioTimeStamp* time_stamp,
-    UInt32 bus_number,
-    UInt32 num_frames,
-    AudioBufferList* io_data) {
-  return observer_->OnDeliverRecordedData(flags, time_stamp, bus_number,
-                                          num_frames, io_data);
-}
-
-AudioStreamBasicDescription VoiceProcessingAudioUnit::GetFormat(
-    Float64 sample_rate) const {
-  // Set the application formats for input and output:
-  // - use same format in both directions
-  // - avoid resampling in the I/O unit by using the hardware sample rate
-  // - linear PCM => noncompressed audio data format with one frame per packet
-  // - no need to specify interleaving since only mono is supported
-  AudioStreamBasicDescription format = {0};
-  RTC_DCHECK_EQ(1, kRTCAudioSessionPreferredNumberOfChannels);
-  format.mSampleRate = sample_rate;
-  format.mFormatID = kAudioFormatLinearPCM;
-  format.mFormatFlags =
-      kLinearPCMFormatFlagIsSignedInteger | kLinearPCMFormatFlagIsPacked;
-  format.mBytesPerPacket = kBytesPerSample;
-  format.mFramesPerPacket = 1;  // uncompressed.
-  format.mBytesPerFrame = kBytesPerSample;
-  format.mChannelsPerFrame = kRTCAudioSessionPreferredNumberOfChannels;
-  format.mBitsPerChannel = 8 * kBytesPerSample;
-  return format;
-}
-
-void VoiceProcessingAudioUnit::DisposeAudioUnit() {
-  if (vpio_unit_) {
-    switch (state_) {
-      case kStarted:
-        Stop();
-        // Fall through.
-        FALLTHROUGH();
-      case kInitialized:
-        Uninitialize();
-        break;
-      case kUninitialized:
-        FALLTHROUGH();
-      case kInitRequired:
-        break;
-    }
-
-    RTCLog(@"Disposing audio unit.");
-    OSStatus result = AudioComponentInstanceDispose(vpio_unit_);
-    if (result != noErr) {
-      RTCLogError(@"AudioComponentInstanceDispose failed. Error=%ld.",
-                  (long)result);
-    }
-    vpio_unit_ = nullptr;
-  }
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_device/linux/alsasymboltable_linux.cc b/modules/audio_device/linux/alsasymboltable_linux.cc
deleted file mode 100644
index 2459625..0000000
--- a/modules/audio_device/linux/alsasymboltable_linux.cc
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * libjingle
- * Copyright 2004--2010, Google Inc.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- *  1. Redistributions of source code must retain the above copyright notice,
- *     this list of conditions and the following disclaimer.
- *  2. Redistributions in binary form must reproduce the above copyright notice,
- *     this list of conditions and the following disclaimer in the documentation
- *     and/or other materials provided with the distribution.
- *  3. The name of the author may not be used to endorse or promote products
- *     derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
- * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
- * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
- * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
- * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "webrtc/modules/audio_device/linux/alsasymboltable_linux.h"
-
-namespace webrtc {
-namespace adm_linux_alsa {
-
-LATE_BINDING_SYMBOL_TABLE_DEFINE_BEGIN(AlsaSymbolTable, "libasound.so.2")
-#define X(sym) \
-    LATE_BINDING_SYMBOL_TABLE_DEFINE_ENTRY(AlsaSymbolTable, sym)
-ALSA_SYMBOLS_LIST
-#undef X
-LATE_BINDING_SYMBOL_TABLE_DEFINE_END(AlsaSymbolTable)
-
-}  // namespace adm_linux_alsa
-}  // namespace webrtc
diff --git a/modules/audio_device/linux/alsasymboltable_linux.h b/modules/audio_device/linux/alsasymboltable_linux.h
deleted file mode 100644
index 14b016c..0000000
--- a/modules/audio_device/linux/alsasymboltable_linux.h
+++ /dev/null
@@ -1,149 +0,0 @@
-/*
- * libjingle
- * Copyright 2004--2010, Google Inc.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- *  1. Redistributions of source code must retain the above copyright notice,
- *     this list of conditions and the following disclaimer.
- *  2. Redistributions in binary form must reproduce the above copyright notice,
- *     this list of conditions and the following disclaimer in the documentation
- *     and/or other materials provided with the distribution.
- *  3. The name of the author may not be used to endorse or promote products
- *     derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
- * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
- * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
- * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
- * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef WEBRTC_AUDIO_DEVICE_ALSASYMBOLTABLE_LINUX_H
-#define WEBRTC_AUDIO_DEVICE_ALSASYMBOLTABLE_LINUX_H
-
-#include "webrtc/modules/audio_device/linux/latebindingsymboltable_linux.h"
-
-namespace webrtc {
-namespace adm_linux_alsa {
-
-// The ALSA symbols we need, as an X-Macro list.
-// This list must contain precisely every libasound function that is used in
-// alsasoundsystem.cc.
-#define ALSA_SYMBOLS_LIST \
-  X(snd_device_name_free_hint) \
-  X(snd_device_name_get_hint) \
-  X(snd_device_name_hint) \
-  X(snd_pcm_avail_update) \
-  X(snd_pcm_close) \
-  X(snd_pcm_delay) \
-  X(snd_pcm_drop) \
-  X(snd_pcm_open) \
-  X(snd_pcm_prepare) \
-  X(snd_pcm_readi) \
-  X(snd_pcm_recover) \
-  X(snd_pcm_resume) \
-  X(snd_pcm_reset) \
-  X(snd_pcm_state) \
-  X(snd_pcm_set_params) \
-  X(snd_pcm_get_params) \
-  X(snd_pcm_start) \
-  X(snd_pcm_stream) \
-  X(snd_pcm_frames_to_bytes) \
-  X(snd_pcm_bytes_to_frames) \
-  X(snd_pcm_wait) \
-  X(snd_pcm_writei) \
-  X(snd_pcm_info_get_class) \
-  X(snd_pcm_info_get_subdevices_avail) \
-  X(snd_pcm_info_get_subdevice_name) \
-  X(snd_pcm_info_set_subdevice) \
-  X(snd_pcm_info_get_id) \
-  X(snd_pcm_info_set_device) \
-  X(snd_pcm_info_set_stream) \
-  X(snd_pcm_info_get_name) \
-  X(snd_pcm_info_get_subdevices_count) \
-  X(snd_pcm_info_sizeof) \
-  X(snd_pcm_hw_params) \
-  X(snd_pcm_hw_params_malloc) \
-  X(snd_pcm_hw_params_free) \
-  X(snd_pcm_hw_params_any) \
-  X(snd_pcm_hw_params_set_access) \
-  X(snd_pcm_hw_params_set_format) \
-  X(snd_pcm_hw_params_set_channels) \
-  X(snd_pcm_hw_params_set_rate_near) \
-  X(snd_pcm_hw_params_set_buffer_size_near) \
-  X(snd_card_next) \
-  X(snd_card_get_name) \
-  X(snd_config_update) \
-  X(snd_config_copy) \
-  X(snd_config_get_id) \
-  X(snd_ctl_open) \
-  X(snd_ctl_close) \
-  X(snd_ctl_card_info) \
-  X(snd_ctl_card_info_sizeof) \
-  X(snd_ctl_card_info_get_id) \
-  X(snd_ctl_card_info_get_name) \
-  X(snd_ctl_pcm_next_device) \
-  X(snd_ctl_pcm_info) \
-  X(snd_mixer_load) \
-  X(snd_mixer_free) \
-  X(snd_mixer_detach) \
-  X(snd_mixer_close) \
-  X(snd_mixer_open) \
-  X(snd_mixer_attach) \
-  X(snd_mixer_first_elem) \
-  X(snd_mixer_elem_next) \
-  X(snd_mixer_selem_get_name) \
-  X(snd_mixer_selem_is_active) \
-  X(snd_mixer_selem_register) \
-  X(snd_mixer_selem_set_playback_volume_all) \
-  X(snd_mixer_selem_get_playback_volume) \
-  X(snd_mixer_selem_has_playback_volume) \
-  X(snd_mixer_selem_get_playback_volume_range) \
-  X(snd_mixer_selem_has_playback_switch) \
-  X(snd_mixer_selem_get_playback_switch) \
-  X(snd_mixer_selem_set_playback_switch_all) \
-  X(snd_mixer_selem_has_capture_switch) \
-  X(snd_mixer_selem_get_capture_switch) \
-  X(snd_mixer_selem_set_capture_switch_all) \
-  X(snd_mixer_selem_has_capture_volume) \
-  X(snd_mixer_selem_set_capture_volume_all) \
-  X(snd_mixer_selem_get_capture_volume) \
-  X(snd_mixer_selem_get_capture_volume_range) \
-  X(snd_dlopen) \
-  X(snd_dlclose) \
-  X(snd_config) \
-  X(snd_config_search) \
-  X(snd_config_get_string) \
-  X(snd_config_search_definition) \
-  X(snd_config_get_type) \
-  X(snd_config_delete) \
-  X(snd_config_iterator_entry) \
-  X(snd_config_iterator_first) \
-  X(snd_config_iterator_next) \
-  X(snd_config_iterator_end) \
-  X(snd_config_delete_compound_members) \
-  X(snd_config_get_integer) \
-  X(snd_config_get_bool) \
-  X(snd_dlsym) \
-  X(snd_strerror) \
-  X(snd_lib_error) \
-  X(snd_lib_error_set_handler)
-
-LATE_BINDING_SYMBOL_TABLE_DECLARE_BEGIN(AlsaSymbolTable)
-#define X(sym) \
-    LATE_BINDING_SYMBOL_TABLE_DECLARE_ENTRY(AlsaSymbolTable, sym)
-ALSA_SYMBOLS_LIST
-#undef X
-LATE_BINDING_SYMBOL_TABLE_DECLARE_END(AlsaSymbolTable)
-
-}  // namespace adm_linux_alsa
-}  // namespace webrtc
-
-#endif  // WEBRTC_AUDIO_DEVICE_ALSASYMBOLTABLE_LINUX_H
diff --git a/modules/audio_device/linux/audio_device_alsa_linux.cc b/modules/audio_device/linux/audio_device_alsa_linux.cc
deleted file mode 100644
index 9e2c5b1..0000000
--- a/modules/audio_device/linux/audio_device_alsa_linux.cc
+++ /dev/null
@@ -1,2018 +0,0 @@
-/*
- *  Copyright (c) 2012 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 <assert.h>
-
-#include "webrtc/modules/audio_device/audio_device_config.h"
-#include "webrtc/modules/audio_device/linux/audio_device_alsa_linux.h"
-#include "webrtc/rtc_base/logging.h"
-
-#include "webrtc/system_wrappers/include/event_wrapper.h"
-#include "webrtc/system_wrappers/include/sleep.h"
-webrtc::adm_linux_alsa::AlsaSymbolTable AlsaSymbolTable;
-
-// Accesses ALSA functions through our late-binding symbol table instead of
-// directly. This way we don't have to link to libasound, which means our binary
-// will work on systems that don't have it.
-#define LATE(sym) \
-  LATESYM_GET(webrtc::adm_linux_alsa::AlsaSymbolTable, &AlsaSymbolTable, sym)
-
-// Redefine these here to be able to do late-binding
-#undef snd_ctl_card_info_alloca
-#define snd_ctl_card_info_alloca(ptr) \
-        do { *ptr = (snd_ctl_card_info_t *) \
-            __builtin_alloca (LATE(snd_ctl_card_info_sizeof)()); \
-            memset(*ptr, 0, LATE(snd_ctl_card_info_sizeof)()); } while (0)
-
-#undef snd_pcm_info_alloca
-#define snd_pcm_info_alloca(pInfo) \
-       do { *pInfo = (snd_pcm_info_t *) \
-       __builtin_alloca (LATE(snd_pcm_info_sizeof)()); \
-       memset(*pInfo, 0, LATE(snd_pcm_info_sizeof)()); } while (0)
-
-// snd_lib_error_handler_t
-void WebrtcAlsaErrorHandler(const char *file,
-                          int line,
-                          const char *function,
-                          int err,
-                          const char *fmt,...){};
-
-namespace webrtc
-{
-static const unsigned int ALSA_PLAYOUT_FREQ = 48000;
-static const unsigned int ALSA_PLAYOUT_CH = 2;
-static const unsigned int ALSA_PLAYOUT_LATENCY = 40*1000; // in us
-static const unsigned int ALSA_CAPTURE_FREQ = 48000;
-static const unsigned int ALSA_CAPTURE_CH = 2;
-static const unsigned int ALSA_CAPTURE_LATENCY = 40*1000; // in us
-static const unsigned int ALSA_CAPTURE_WAIT_TIMEOUT = 5; // in ms
-
-#define FUNC_GET_NUM_OF_DEVICE 0
-#define FUNC_GET_DEVICE_NAME 1
-#define FUNC_GET_DEVICE_NAME_FOR_AN_ENUM 2
-
-AudioDeviceLinuxALSA::AudioDeviceLinuxALSA() :
-    _ptrAudioBuffer(NULL),
-    _inputDeviceIndex(0),
-    _outputDeviceIndex(0),
-    _inputDeviceIsSpecified(false),
-    _outputDeviceIsSpecified(false),
-    _handleRecord(NULL),
-    _handlePlayout(NULL),
-    _recordingBuffersizeInFrame(0),
-    _recordingPeriodSizeInFrame(0),
-    _playoutBufferSizeInFrame(0),
-    _playoutPeriodSizeInFrame(0),
-    _recordingBufferSizeIn10MS(0),
-    _playoutBufferSizeIn10MS(0),
-    _recordingFramesIn10MS(0),
-    _playoutFramesIn10MS(0),
-    _recordingFreq(ALSA_CAPTURE_FREQ),
-    _playoutFreq(ALSA_PLAYOUT_FREQ),
-    _recChannels(ALSA_CAPTURE_CH),
-    _playChannels(ALSA_PLAYOUT_CH),
-    _recordingBuffer(NULL),
-    _playoutBuffer(NULL),
-    _recordingFramesLeft(0),
-    _playoutFramesLeft(0),
-    _initialized(false),
-    _recording(false),
-    _playing(false),
-    _recIsInitialized(false),
-    _playIsInitialized(false),
-    _AGC(false),
-    _recordingDelay(0),
-    _playoutDelay(0),
-    _playWarning(0),
-    _playError(0),
-    _recWarning(0),
-    _recError(0)
-{
-    memset(_oldKeyState, 0, sizeof(_oldKeyState));
-    LOG(LS_INFO) << __FUNCTION__ << " created";
-}
-
-// ----------------------------------------------------------------------------
-//  AudioDeviceLinuxALSA - dtor
-// ----------------------------------------------------------------------------
-
-AudioDeviceLinuxALSA::~AudioDeviceLinuxALSA()
-{
-    LOG(LS_INFO) << __FUNCTION__ << " destroyed";
-
-    Terminate();
-
-    // Clean up the recording buffer and playout buffer.
-    if (_recordingBuffer)
-    {
-        delete [] _recordingBuffer;
-        _recordingBuffer = NULL;
-    }
-    if (_playoutBuffer)
-    {
-        delete [] _playoutBuffer;
-        _playoutBuffer = NULL;
-    }
-}
-
-void AudioDeviceLinuxALSA::AttachAudioBuffer(AudioDeviceBuffer* audioBuffer)
-{
-
-    rtc::CritScope lock(&_critSect);
-
-    _ptrAudioBuffer = audioBuffer;
-
-    // Inform the AudioBuffer about default settings for this implementation.
-    // Set all values to zero here since the actual settings will be done by
-    // InitPlayout and InitRecording later.
-    _ptrAudioBuffer->SetRecordingSampleRate(0);
-    _ptrAudioBuffer->SetPlayoutSampleRate(0);
-    _ptrAudioBuffer->SetRecordingChannels(0);
-    _ptrAudioBuffer->SetPlayoutChannels(0);
-}
-
-int32_t AudioDeviceLinuxALSA::ActiveAudioLayer(
-    AudioDeviceModule::AudioLayer& audioLayer) const
-{
-    audioLayer = AudioDeviceModule::kLinuxAlsaAudio;
-    return 0;
-}
-
-AudioDeviceGeneric::InitStatus AudioDeviceLinuxALSA::Init() {
-  rtc::CritScope lock(&_critSect);
-
-  // Load libasound
-  if (!AlsaSymbolTable.Load()) {
-    // Alsa is not installed on this system
-    LOG(LS_ERROR) << "failed to load symbol table";
-    return InitStatus::OTHER_ERROR;
-  }
-
-  if (_initialized) {
-    return InitStatus::OK;
-  }
-#if defined(USE_X11)
-    //Get X display handle for typing detection
-    _XDisplay = XOpenDisplay(NULL);
-    if (!_XDisplay) {
-      LOG(LS_WARNING)
-          << "failed to open X display, typing detection will not work";
-    }
-#endif
-    _playWarning = 0;
-    _playError = 0;
-    _recWarning = 0;
-    _recError = 0;
-
-    _initialized = true;
-
-    return InitStatus::OK;
-}
-
-int32_t AudioDeviceLinuxALSA::Terminate()
-{
-    if (!_initialized)
-    {
-        return 0;
-    }
-
-    rtc::CritScope lock(&_critSect);
-
-    _mixerManager.Close();
-
-    // RECORDING
-    if (_ptrThreadRec)
-    {
-        rtc::PlatformThread* tmpThread = _ptrThreadRec.release();
-        _critSect.Leave();
-
-        tmpThread->Stop();
-        delete tmpThread;
-
-        _critSect.Enter();
-    }
-
-    // PLAYOUT
-    if (_ptrThreadPlay)
-    {
-        rtc::PlatformThread* tmpThread = _ptrThreadPlay.release();
-        _critSect.Leave();
-
-        tmpThread->Stop();
-        delete tmpThread;
-
-        _critSect.Enter();
-    }
-#if defined(USE_X11)
-    if (_XDisplay)
-    {
-      XCloseDisplay(_XDisplay);
-      _XDisplay = NULL;
-    }
-#endif
-    _initialized = false;
-    _outputDeviceIsSpecified = false;
-    _inputDeviceIsSpecified = false;
-
-    return 0;
-}
-
-bool AudioDeviceLinuxALSA::Initialized() const
-{
-    return (_initialized);
-}
-
-int32_t AudioDeviceLinuxALSA::InitSpeaker()
-{
-
-    rtc::CritScope lock(&_critSect);
-
-    if (_playing)
-    {
-        return -1;
-    }
-
-    char devName[kAdmMaxDeviceNameSize] = {0};
-    GetDevicesInfo(2, true, _outputDeviceIndex, devName, kAdmMaxDeviceNameSize);
-    return _mixerManager.OpenSpeaker(devName);
-}
-
-int32_t AudioDeviceLinuxALSA::InitMicrophone()
-{
-
-    rtc::CritScope lock(&_critSect);
-
-    if (_recording)
-    {
-        return -1;
-    }
-
-    char devName[kAdmMaxDeviceNameSize] = {0};
-    GetDevicesInfo(2, false, _inputDeviceIndex, devName, kAdmMaxDeviceNameSize);
-    return _mixerManager.OpenMicrophone(devName);
-}
-
-bool AudioDeviceLinuxALSA::SpeakerIsInitialized() const
-{
-    return (_mixerManager.SpeakerIsInitialized());
-}
-
-bool AudioDeviceLinuxALSA::MicrophoneIsInitialized() const
-{
-    return (_mixerManager.MicrophoneIsInitialized());
-}
-
-int32_t AudioDeviceLinuxALSA::SpeakerVolumeIsAvailable(bool& available)
-{
-
-    bool wasInitialized = _mixerManager.SpeakerIsInitialized();
-
-    // Make an attempt to open up the
-    // output mixer corresponding to the currently selected output device.
-    if (!wasInitialized && InitSpeaker() == -1)
-    {
-        // If we end up here it means that the selected speaker has no volume
-        // control.
-        available = false;
-        return 0;
-    }
-
-    // Given that InitSpeaker was successful, we know that a volume control
-    // exists
-    available = true;
-
-    // Close the initialized output mixer
-    if (!wasInitialized)
-    {
-        _mixerManager.CloseSpeaker();
-    }
-
-    return 0;
-}
-
-int32_t AudioDeviceLinuxALSA::SetSpeakerVolume(uint32_t volume)
-{
-
-    return (_mixerManager.SetSpeakerVolume(volume));
-}
-
-int32_t AudioDeviceLinuxALSA::SpeakerVolume(uint32_t& volume) const
-{
-
-    uint32_t level(0);
-
-    if (_mixerManager.SpeakerVolume(level) == -1)
-    {
-        return -1;
-    }
-
-    volume = level;
-
-    return 0;
-}
-
-int32_t AudioDeviceLinuxALSA::MaxSpeakerVolume(
-    uint32_t& maxVolume) const
-{
-
-    uint32_t maxVol(0);
-
-    if (_mixerManager.MaxSpeakerVolume(maxVol) == -1)
-    {
-        return -1;
-    }
-
-    maxVolume = maxVol;
-
-    return 0;
-}
-
-int32_t AudioDeviceLinuxALSA::MinSpeakerVolume(
-    uint32_t& minVolume) const
-{
-
-    uint32_t minVol(0);
-
-    if (_mixerManager.MinSpeakerVolume(minVol) == -1)
-    {
-        return -1;
-    }
-
-    minVolume = minVol;
-
-    return 0;
-}
-
-int32_t AudioDeviceLinuxALSA::SpeakerMuteIsAvailable(bool& available)
-{
-
-    bool isAvailable(false);
-    bool wasInitialized = _mixerManager.SpeakerIsInitialized();
-
-    // Make an attempt to open up the
-    // output mixer corresponding to the currently selected output device.
-    //
-    if (!wasInitialized && InitSpeaker() == -1)
-    {
-        // If we end up here it means that the selected speaker has no volume
-        // control, hence it is safe to state that there is no mute control
-        // already at this stage.
-        available = false;
-        return 0;
-    }
-
-    // Check if the selected speaker has a mute control
-    _mixerManager.SpeakerMuteIsAvailable(isAvailable);
-
-    available = isAvailable;
-
-    // Close the initialized output mixer
-    if (!wasInitialized)
-    {
-        _mixerManager.CloseSpeaker();
-    }
-
-    return 0;
-}
-
-int32_t AudioDeviceLinuxALSA::SetSpeakerMute(bool enable)
-{
-    return (_mixerManager.SetSpeakerMute(enable));
-}
-
-int32_t AudioDeviceLinuxALSA::SpeakerMute(bool& enabled) const
-{
-
-    bool muted(0);
-
-    if (_mixerManager.SpeakerMute(muted) == -1)
-    {
-        return -1;
-    }
-
-    enabled = muted;
-
-    return 0;
-}
-
-int32_t AudioDeviceLinuxALSA::MicrophoneMuteIsAvailable(bool& available)
-{
-
-    bool isAvailable(false);
-    bool wasInitialized = _mixerManager.MicrophoneIsInitialized();
-
-    // Make an attempt to open up the
-    // input mixer corresponding to the currently selected input device.
-    //
-    if (!wasInitialized && InitMicrophone() == -1)
-    {
-        // If we end up here it means that the selected microphone has no volume
-        // control, hence it is safe to state that there is no mute control
-        // already at this stage.
-        available = false;
-        return 0;
-    }
-
-    // Check if the selected microphone has a mute control
-    //
-    _mixerManager.MicrophoneMuteIsAvailable(isAvailable);
-    available = isAvailable;
-
-    // Close the initialized input mixer
-    //
-    if (!wasInitialized)
-    {
-        _mixerManager.CloseMicrophone();
-    }
-
-    return 0;
-}
-
-int32_t AudioDeviceLinuxALSA::SetMicrophoneMute(bool enable)
-{
-    return (_mixerManager.SetMicrophoneMute(enable));
-}
-
-// ----------------------------------------------------------------------------
-//  MicrophoneMute
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceLinuxALSA::MicrophoneMute(bool& enabled) const
-{
-
-    bool muted(0);
-
-    if (_mixerManager.MicrophoneMute(muted) == -1)
-    {
-        return -1;
-    }
-
-    enabled = muted;
-    return 0;
-}
-
-int32_t AudioDeviceLinuxALSA::StereoRecordingIsAvailable(bool& available)
-{
-
-    rtc::CritScope lock(&_critSect);
-
-    // If we already have initialized in stereo it's obviously available
-    if (_recIsInitialized && (2 == _recChannels))
-    {
-        available = true;
-        return 0;
-    }
-
-    // Save rec states and the number of rec channels
-    bool recIsInitialized = _recIsInitialized;
-    bool recording = _recording;
-    int recChannels = _recChannels;
-
-    available = false;
-
-    // Stop/uninitialize recording if initialized (and possibly started)
-    if (_recIsInitialized)
-    {
-        StopRecording();
-    }
-
-    // Try init in stereo;
-    _recChannels = 2;
-    if (InitRecording() == 0)
-    {
-        available = true;
-    }
-
-    // Stop/uninitialize recording
-    StopRecording();
-
-    // Recover previous states
-    _recChannels = recChannels;
-    if (recIsInitialized)
-    {
-        InitRecording();
-    }
-    if (recording)
-    {
-        StartRecording();
-    }
-
-    return 0;
-}
-
-int32_t AudioDeviceLinuxALSA::SetStereoRecording(bool enable)
-{
-
-    if (enable)
-        _recChannels = 2;
-    else
-        _recChannels = 1;
-
-    return 0;
-}
-
-int32_t AudioDeviceLinuxALSA::StereoRecording(bool& enabled) const
-{
-
-    if (_recChannels == 2)
-        enabled = true;
-    else
-        enabled = false;
-
-    return 0;
-}
-
-int32_t AudioDeviceLinuxALSA::StereoPlayoutIsAvailable(bool& available)
-{
-
-    rtc::CritScope lock(&_critSect);
-
-    // If we already have initialized in stereo it's obviously available
-    if (_playIsInitialized && (2 == _playChannels))
-    {
-        available = true;
-        return 0;
-    }
-
-    // Save rec states and the number of rec channels
-    bool playIsInitialized = _playIsInitialized;
-    bool playing = _playing;
-    int playChannels = _playChannels;
-
-    available = false;
-
-    // Stop/uninitialize recording if initialized (and possibly started)
-    if (_playIsInitialized)
-    {
-        StopPlayout();
-    }
-
-    // Try init in stereo;
-    _playChannels = 2;
-    if (InitPlayout() == 0)
-    {
-        available = true;
-    }
-
-    // Stop/uninitialize recording
-    StopPlayout();
-
-    // Recover previous states
-    _playChannels = playChannels;
-    if (playIsInitialized)
-    {
-        InitPlayout();
-    }
-    if (playing)
-    {
-        StartPlayout();
-    }
-
-    return 0;
-}
-
-int32_t AudioDeviceLinuxALSA::SetStereoPlayout(bool enable)
-{
-
-    if (enable)
-        _playChannels = 2;
-    else
-        _playChannels = 1;
-
-    return 0;
-}
-
-int32_t AudioDeviceLinuxALSA::StereoPlayout(bool& enabled) const
-{
-
-    if (_playChannels == 2)
-        enabled = true;
-    else
-        enabled = false;
-
-    return 0;
-}
-
-int32_t AudioDeviceLinuxALSA::SetAGC(bool enable)
-{
-
-    _AGC = enable;
-
-    return 0;
-}
-
-bool AudioDeviceLinuxALSA::AGC() const
-{
-
-    return _AGC;
-}
-
-int32_t AudioDeviceLinuxALSA::MicrophoneVolumeIsAvailable(bool& available)
-{
-
-    bool wasInitialized = _mixerManager.MicrophoneIsInitialized();
-
-    // Make an attempt to open up the
-    // input mixer corresponding to the currently selected output device.
-    if (!wasInitialized && InitMicrophone() == -1)
-    {
-        // If we end up here it means that the selected microphone has no volume
-        // control.
-        available = false;
-        return 0;
-    }
-
-    // Given that InitMicrophone was successful, we know that a volume control
-    // exists
-    available = true;
-
-    // Close the initialized input mixer
-    if (!wasInitialized)
-    {
-        _mixerManager.CloseMicrophone();
-    }
-
-    return 0;
-}
-
-int32_t AudioDeviceLinuxALSA::SetMicrophoneVolume(uint32_t volume)
-{
-
-    return (_mixerManager.SetMicrophoneVolume(volume));
-
-    return 0;
-}
-
-int32_t AudioDeviceLinuxALSA::MicrophoneVolume(uint32_t& volume) const
-{
-
-    uint32_t level(0);
-
-    if (_mixerManager.MicrophoneVolume(level) == -1)
-    {
-        LOG(LS_WARNING) << "failed to retrive current microphone level";
-        return -1;
-    }
-
-    volume = level;
-
-    return 0;
-}
-
-int32_t AudioDeviceLinuxALSA::MaxMicrophoneVolume(
-    uint32_t& maxVolume) const
-{
-
-    uint32_t maxVol(0);
-
-    if (_mixerManager.MaxMicrophoneVolume(maxVol) == -1)
-    {
-        return -1;
-    }
-
-    maxVolume = maxVol;
-
-    return 0;
-}
-
-int32_t AudioDeviceLinuxALSA::MinMicrophoneVolume(
-    uint32_t& minVolume) const
-{
-
-    uint32_t minVol(0);
-
-    if (_mixerManager.MinMicrophoneVolume(minVol) == -1)
-    {
-        return -1;
-    }
-
-    minVolume = minVol;
-
-    return 0;
-}
-
-int16_t AudioDeviceLinuxALSA::PlayoutDevices()
-{
-
-    return (int16_t)GetDevicesInfo(0, true);
-}
-
-int32_t AudioDeviceLinuxALSA::SetPlayoutDevice(uint16_t index)
-{
-
-    if (_playIsInitialized)
-    {
-        return -1;
-    }
-
-    uint32_t nDevices = GetDevicesInfo(0, true);
-    LOG(LS_VERBOSE) << "number of available audio output devices is "
-                    << nDevices;
-
-    if (index > (nDevices-1))
-    {
-        LOG(LS_ERROR) << "device index is out of range [0," << (nDevices-1)
-                      << "]";
-        return -1;
-    }
-
-    _outputDeviceIndex = index;
-    _outputDeviceIsSpecified = true;
-
-    return 0;
-}
-
-int32_t AudioDeviceLinuxALSA::SetPlayoutDevice(
-    AudioDeviceModule::WindowsDeviceType /*device*/)
-{
-    LOG(LS_ERROR) << "WindowsDeviceType not supported";
-    return -1;
-}
-
-int32_t AudioDeviceLinuxALSA::PlayoutDeviceName(
-    uint16_t index,
-    char name[kAdmMaxDeviceNameSize],
-    char guid[kAdmMaxGuidSize])
-{
-
-    const uint16_t nDevices(PlayoutDevices());
-
-    if ((index > (nDevices-1)) || (name == NULL))
-    {
-        return -1;
-    }
-
-    memset(name, 0, kAdmMaxDeviceNameSize);
-
-    if (guid != NULL)
-    {
-        memset(guid, 0, kAdmMaxGuidSize);
-    }
-
-    return GetDevicesInfo(1, true, index, name, kAdmMaxDeviceNameSize);
-}
-
-int32_t AudioDeviceLinuxALSA::RecordingDeviceName(
-    uint16_t index,
-    char name[kAdmMaxDeviceNameSize],
-    char guid[kAdmMaxGuidSize])
-{
-
-    const uint16_t nDevices(RecordingDevices());
-
-    if ((index > (nDevices-1)) || (name == NULL))
-    {
-        return -1;
-    }
-
-    memset(name, 0, kAdmMaxDeviceNameSize);
-
-    if (guid != NULL)
-    {
-        memset(guid, 0, kAdmMaxGuidSize);
-    }
-
-    return GetDevicesInfo(1, false, index, name, kAdmMaxDeviceNameSize);
-}
-
-int16_t AudioDeviceLinuxALSA::RecordingDevices()
-{
-
-    return (int16_t)GetDevicesInfo(0, false);
-}
-
-int32_t AudioDeviceLinuxALSA::SetRecordingDevice(uint16_t index)
-{
-
-    if (_recIsInitialized)
-    {
-        return -1;
-    }
-
-    uint32_t nDevices = GetDevicesInfo(0, false);
-    LOG(LS_VERBOSE) << "number of availiable audio input devices is "
-                    << nDevices;
-
-    if (index > (nDevices-1))
-    {
-        LOG(LS_ERROR) << "device index is out of range [0," << (nDevices-1)
-                      << "]";
-        return -1;
-    }
-
-    _inputDeviceIndex = index;
-    _inputDeviceIsSpecified = true;
-
-    return 0;
-}
-
-// ----------------------------------------------------------------------------
-//  SetRecordingDevice II (II)
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceLinuxALSA::SetRecordingDevice(
-    AudioDeviceModule::WindowsDeviceType /*device*/)
-{
-    LOG(LS_ERROR) << "WindowsDeviceType not supported";
-    return -1;
-}
-
-int32_t AudioDeviceLinuxALSA::PlayoutIsAvailable(bool& available)
-{
-
-    available = false;
-
-    // Try to initialize the playout side with mono
-    // Assumes that user set num channels after calling this function
-    _playChannels = 1;
-    int32_t res = InitPlayout();
-
-    // Cancel effect of initialization
-    StopPlayout();
-
-    if (res != -1)
-    {
-        available = true;
-    }
-    else
-    {
-        // It may be possible to play out in stereo
-        res = StereoPlayoutIsAvailable(available);
-        if (available)
-        {
-            // Then set channels to 2 so InitPlayout doesn't fail
-            _playChannels = 2;
-        }
-    }
-
-    return res;
-}
-
-int32_t AudioDeviceLinuxALSA::RecordingIsAvailable(bool& available)
-{
-
-    available = false;
-
-    // Try to initialize the recording side with mono
-    // Assumes that user set num channels after calling this function
-    _recChannels = 1;
-    int32_t res = InitRecording();
-
-    // Cancel effect of initialization
-    StopRecording();
-
-    if (res != -1)
-    {
-        available = true;
-    }
-    else
-    {
-        // It may be possible to record in stereo
-        res = StereoRecordingIsAvailable(available);
-        if (available)
-        {
-            // Then set channels to 2 so InitPlayout doesn't fail
-            _recChannels = 2;
-        }
-    }
-
-    return res;
-}
-
-int32_t AudioDeviceLinuxALSA::InitPlayout()
-{
-
-    int errVal = 0;
-
-    rtc::CritScope lock(&_critSect);
-    if (_playing)
-    {
-        return -1;
-    }
-
-    if (!_outputDeviceIsSpecified)
-    {
-        return -1;
-    }
-
-    if (_playIsInitialized)
-    {
-        return 0;
-    }
-    // Initialize the speaker (devices might have been added or removed)
-    if (InitSpeaker() == -1)
-    {
-        LOG(LS_WARNING) << "InitSpeaker() failed";
-    }
-
-    // Start by closing any existing wave-output devices
-    //
-    if (_handlePlayout != NULL)
-    {
-        LATE(snd_pcm_close)(_handlePlayout);
-        _handlePlayout = NULL;
-        _playIsInitialized = false;
-        if (errVal < 0)
-        {
-            LOG(LS_ERROR)
-                << "Error closing current playout sound device, error: "
-                << LATE(snd_strerror)(errVal);
-        }
-    }
-
-    // Open PCM device for playout
-    char deviceName[kAdmMaxDeviceNameSize] = {0};
-    GetDevicesInfo(2, true, _outputDeviceIndex, deviceName,
-                   kAdmMaxDeviceNameSize);
-
-    LOG(LS_VERBOSE) << "InitPlayout open (" << deviceName << ")";
-
-    errVal = LATE(snd_pcm_open)
-                 (&_handlePlayout,
-                  deviceName,
-                  SND_PCM_STREAM_PLAYBACK,
-                  SND_PCM_NONBLOCK);
-
-    if (errVal == -EBUSY) // Device busy - try some more!
-    {
-        for (int i=0; i < 5; i++)
-        {
-            SleepMs(1000);
-            errVal = LATE(snd_pcm_open)
-                         (&_handlePlayout,
-                          deviceName,
-                          SND_PCM_STREAM_PLAYBACK,
-                          SND_PCM_NONBLOCK);
-            if (errVal == 0)
-            {
-                break;
-            }
-        }
-    }
-    if (errVal < 0)
-    {
-        LOG(LS_ERROR) << "unable to open playback device: "
-                      << LATE(snd_strerror)(errVal) << " (" << errVal << ")";
-        _handlePlayout = NULL;
-        return -1;
-    }
-
-    _playoutFramesIn10MS = _playoutFreq/100;
-    if ((errVal = LATE(snd_pcm_set_params)( _handlePlayout,
-#if defined(WEBRTC_ARCH_BIG_ENDIAN)
-        SND_PCM_FORMAT_S16_BE,
-#else
-        SND_PCM_FORMAT_S16_LE, //format
-#endif
-        SND_PCM_ACCESS_RW_INTERLEAVED, //access
-        _playChannels, //channels
-        _playoutFreq, //rate
-        1, //soft_resample
-        ALSA_PLAYOUT_LATENCY //40*1000 //latency required overall latency in us
-    )) < 0)
-    {   /* 0.5sec */
-        _playoutFramesIn10MS = 0;
-        LOG(LS_ERROR) << "unable to set playback device: "
-                      << LATE(snd_strerror)(errVal) << " (" << errVal << ")";
-        ErrorRecovery(errVal, _handlePlayout);
-        errVal = LATE(snd_pcm_close)(_handlePlayout);
-        _handlePlayout = NULL;
-        return -1;
-    }
-
-    errVal = LATE(snd_pcm_get_params)(_handlePlayout,
-        &_playoutBufferSizeInFrame, &_playoutPeriodSizeInFrame);
-    if (errVal < 0)
-    {
-        LOG(LS_ERROR) << "snd_pcm_get_params: " << LATE(snd_strerror)(errVal)
-                      << " (" << errVal << ")";
-        _playoutBufferSizeInFrame = 0;
-        _playoutPeriodSizeInFrame = 0;
-    }
-    else {
-        LOG(LS_VERBOSE) << "playout snd_pcm_get_params buffer_size:"
-                        << _playoutBufferSizeInFrame << " period_size :"
-                        << _playoutPeriodSizeInFrame;
-    }
-
-    if (_ptrAudioBuffer)
-    {
-        // Update webrtc audio buffer with the selected parameters
-        _ptrAudioBuffer->SetPlayoutSampleRate(_playoutFreq);
-        _ptrAudioBuffer->SetPlayoutChannels(_playChannels);
-    }
-
-    // Set play buffer size
-    _playoutBufferSizeIn10MS = LATE(snd_pcm_frames_to_bytes)(
-        _handlePlayout, _playoutFramesIn10MS);
-
-    // Init varaibles used for play
-    _playWarning = 0;
-    _playError = 0;
-
-    if (_handlePlayout != NULL)
-    {
-        _playIsInitialized = true;
-        return 0;
-    }
-    else
-    {
-        return -1;
-    }
-
-    return 0;
-}
-
-int32_t AudioDeviceLinuxALSA::InitRecording()
-{
-
-    int errVal = 0;
-
-    rtc::CritScope lock(&_critSect);
-
-    if (_recording)
-    {
-        return -1;
-    }
-
-    if (!_inputDeviceIsSpecified)
-    {
-        return -1;
-    }
-
-    if (_recIsInitialized)
-    {
-        return 0;
-    }
-
-    // Initialize the microphone (devices might have been added or removed)
-    if (InitMicrophone() == -1)
-    {
-        LOG(LS_WARNING) << "InitMicrophone() failed";
-    }
-
-    // Start by closing any existing pcm-input devices
-    //
-    if (_handleRecord != NULL)
-    {
-        int errVal = LATE(snd_pcm_close)(_handleRecord);
-        _handleRecord = NULL;
-        _recIsInitialized = false;
-        if (errVal < 0)
-        {
-            LOG(LS_ERROR)
-                << "Error closing current recording sound device, error: "
-                << LATE(snd_strerror)(errVal);
-        }
-    }
-
-    // Open PCM device for recording
-    // The corresponding settings for playout are made after the record settings
-    char deviceName[kAdmMaxDeviceNameSize] = {0};
-    GetDevicesInfo(2, false, _inputDeviceIndex, deviceName,
-                   kAdmMaxDeviceNameSize);
-
-    LOG(LS_VERBOSE) << "InitRecording open (" << deviceName << ")";
-    errVal = LATE(snd_pcm_open)
-                 (&_handleRecord,
-                  deviceName,
-                  SND_PCM_STREAM_CAPTURE,
-                  SND_PCM_NONBLOCK);
-
-    // Available modes: 0 = blocking, SND_PCM_NONBLOCK, SND_PCM_ASYNC
-    if (errVal == -EBUSY) // Device busy - try some more!
-    {
-        for (int i=0; i < 5; i++)
-        {
-            SleepMs(1000);
-            errVal = LATE(snd_pcm_open)
-                         (&_handleRecord,
-                          deviceName,
-                          SND_PCM_STREAM_CAPTURE,
-                          SND_PCM_NONBLOCK);
-            if (errVal == 0)
-            {
-                break;
-            }
-        }
-    }
-    if (errVal < 0)
-    {
-        LOG(LS_ERROR) << "unable to open record device: "
-                      << LATE(snd_strerror)(errVal);
-        _handleRecord = NULL;
-        return -1;
-    }
-
-    _recordingFramesIn10MS = _recordingFreq/100;
-    if ((errVal = LATE(snd_pcm_set_params)(_handleRecord,
-#if defined(WEBRTC_ARCH_BIG_ENDIAN)
-        SND_PCM_FORMAT_S16_BE, //format
-#else
-        SND_PCM_FORMAT_S16_LE, //format
-#endif
-        SND_PCM_ACCESS_RW_INTERLEAVED, //access
-        _recChannels, //channels
-        _recordingFreq, //rate
-        1, //soft_resample
-        ALSA_CAPTURE_LATENCY //latency in us
-    )) < 0)
-    {
-         // Fall back to another mode then.
-         if (_recChannels == 1)
-           _recChannels = 2;
-         else
-           _recChannels = 1;
-
-         if ((errVal = LATE(snd_pcm_set_params)(_handleRecord,
-#if defined(WEBRTC_ARCH_BIG_ENDIAN)
-             SND_PCM_FORMAT_S16_BE, //format
-#else
-             SND_PCM_FORMAT_S16_LE, //format
-#endif
-             SND_PCM_ACCESS_RW_INTERLEAVED, //access
-             _recChannels, //channels
-             _recordingFreq, //rate
-             1, //soft_resample
-             ALSA_CAPTURE_LATENCY //latency in us
-         )) < 0)
-         {
-             _recordingFramesIn10MS = 0;
-             LOG(LS_ERROR) << "unable to set record settings: "
-                           << LATE(snd_strerror)(errVal) << " (" << errVal
-                           << ")";
-             ErrorRecovery(errVal, _handleRecord);
-             errVal = LATE(snd_pcm_close)(_handleRecord);
-             _handleRecord = NULL;
-             return -1;
-         }
-    }
-
-    errVal = LATE(snd_pcm_get_params)(_handleRecord,
-        &_recordingBuffersizeInFrame, &_recordingPeriodSizeInFrame);
-    if (errVal < 0)
-    {
-        LOG(LS_ERROR) << "snd_pcm_get_params " << LATE(snd_strerror)(errVal)
-                      << " (" << errVal << ")";
-        _recordingBuffersizeInFrame = 0;
-        _recordingPeriodSizeInFrame = 0;
-    }
-    else {
-        LOG(LS_VERBOSE) << "capture snd_pcm_get_params, buffer_size:"
-                        << _recordingBuffersizeInFrame << ", period_size:"
-                        << _recordingPeriodSizeInFrame;
-    }
-
-    if (_ptrAudioBuffer)
-    {
-        // Update webrtc audio buffer with the selected parameters
-        _ptrAudioBuffer->SetRecordingSampleRate(_recordingFreq);
-        _ptrAudioBuffer->SetRecordingChannels(_recChannels);
-    }
-
-    // Set rec buffer size and create buffer
-    _recordingBufferSizeIn10MS = LATE(snd_pcm_frames_to_bytes)(
-        _handleRecord, _recordingFramesIn10MS);
-
-    if (_handleRecord != NULL)
-    {
-        // Mark recording side as initialized
-        _recIsInitialized = true;
-        return 0;
-    }
-    else
-    {
-        return -1;
-    }
-
-    return 0;
-}
-
-int32_t AudioDeviceLinuxALSA::StartRecording()
-{
-
-    if (!_recIsInitialized)
-    {
-        return -1;
-    }
-
-    if (_recording)
-    {
-        return 0;
-    }
-
-    _recording = true;
-
-    int errVal = 0;
-    _recordingFramesLeft = _recordingFramesIn10MS;
-
-    // Make sure we only create the buffer once.
-    if (!_recordingBuffer)
-        _recordingBuffer = new int8_t[_recordingBufferSizeIn10MS];
-    if (!_recordingBuffer)
-    {
-        LOG(LS_ERROR) << "failed to alloc recording buffer";
-        _recording = false;
-        return -1;
-    }
-    // RECORDING
-    _ptrThreadRec.reset(new rtc::PlatformThread(
-        RecThreadFunc, this, "webrtc_audio_module_capture_thread"));
-
-    _ptrThreadRec->Start();
-    _ptrThreadRec->SetPriority(rtc::kRealtimePriority);
-
-    errVal = LATE(snd_pcm_prepare)(_handleRecord);
-    if (errVal < 0)
-    {
-        LOG(LS_ERROR) << "capture snd_pcm_prepare failed ("
-                      << LATE(snd_strerror)(errVal) << ")\n";
-        // just log error
-        // if snd_pcm_open fails will return -1
-    }
-
-    errVal = LATE(snd_pcm_start)(_handleRecord);
-    if (errVal < 0)
-    {
-        LOG(LS_ERROR) << "capture snd_pcm_start err: "
-                      << LATE(snd_strerror)(errVal);
-        errVal = LATE(snd_pcm_start)(_handleRecord);
-        if (errVal < 0)
-        {
-            LOG(LS_ERROR) << "capture snd_pcm_start 2nd try err: "
-                          << LATE(snd_strerror)(errVal);
-            StopRecording();
-            return -1;
-        }
-    }
-
-    return 0;
-}
-
-int32_t AudioDeviceLinuxALSA::StopRecording()
-{
-
-    {
-      rtc::CritScope lock(&_critSect);
-
-      if (!_recIsInitialized)
-      {
-          return 0;
-      }
-
-      if (_handleRecord == NULL)
-      {
-          return -1;
-      }
-
-      // Make sure we don't start recording (it's asynchronous).
-      _recIsInitialized = false;
-      _recording = false;
-    }
-
-    if (_ptrThreadRec)
-    {
-        _ptrThreadRec->Stop();
-        _ptrThreadRec.reset();
-    }
-
-    rtc::CritScope lock(&_critSect);
-    _recordingFramesLeft = 0;
-    if (_recordingBuffer)
-    {
-        delete [] _recordingBuffer;
-        _recordingBuffer = NULL;
-    }
-
-    // Stop and close pcm recording device.
-    int errVal = LATE(snd_pcm_drop)(_handleRecord);
-    if (errVal < 0)
-    {
-        LOG(LS_ERROR) << "Error stop recording: " << LATE(snd_strerror)(errVal);
-        return -1;
-    }
-
-    errVal = LATE(snd_pcm_close)(_handleRecord);
-    if (errVal < 0)
-    {
-        LOG(LS_ERROR) << "Error closing record sound device, error: "
-                      << LATE(snd_strerror)(errVal);
-        return -1;
-    }
-
-    // Check if we have muted and unmute if so.
-    bool muteEnabled = false;
-    MicrophoneMute(muteEnabled);
-    if (muteEnabled)
-    {
-        SetMicrophoneMute(false);
-    }
-
-    // set the pcm input handle to NULL
-    _handleRecord = NULL;
-    return 0;
-}
-
-bool AudioDeviceLinuxALSA::RecordingIsInitialized() const
-{
-    return (_recIsInitialized);
-}
-
-bool AudioDeviceLinuxALSA::Recording() const
-{
-    return (_recording);
-}
-
-bool AudioDeviceLinuxALSA::PlayoutIsInitialized() const
-{
-    return (_playIsInitialized);
-}
-
-int32_t AudioDeviceLinuxALSA::StartPlayout()
-{
-    if (!_playIsInitialized)
-    {
-        return -1;
-    }
-
-    if (_playing)
-    {
-        return 0;
-    }
-
-    _playing = true;
-
-    _playoutFramesLeft = 0;
-    if (!_playoutBuffer)
-        _playoutBuffer = new int8_t[_playoutBufferSizeIn10MS];
-    if (!_playoutBuffer)
-    {
-      LOG(LS_ERROR) << "failed to alloc playout buf";
-      _playing = false;
-      return -1;
-    }
-
-    // PLAYOUT
-    _ptrThreadPlay.reset(new rtc::PlatformThread(
-        PlayThreadFunc, this, "webrtc_audio_module_play_thread"));
-    _ptrThreadPlay->Start();
-    _ptrThreadPlay->SetPriority(rtc::kRealtimePriority);
-
-    int errVal = LATE(snd_pcm_prepare)(_handlePlayout);
-    if (errVal < 0)
-    {
-        LOG(LS_ERROR) << "playout snd_pcm_prepare failed ("
-                      << LATE(snd_strerror)(errVal) << ")\n";
-        // just log error
-        // if snd_pcm_open fails will return -1
-    }
-
-    return 0;
-}
-
-int32_t AudioDeviceLinuxALSA::StopPlayout()
-{
-
-    {
-        rtc::CritScope lock(&_critSect);
-
-        if (!_playIsInitialized)
-        {
-            return 0;
-        }
-
-        if (_handlePlayout == NULL)
-        {
-            return -1;
-        }
-
-        _playing = false;
-    }
-
-    // stop playout thread first
-    if (_ptrThreadPlay)
-    {
-        _ptrThreadPlay->Stop();
-        _ptrThreadPlay.reset();
-    }
-
-    rtc::CritScope lock(&_critSect);
-
-    _playoutFramesLeft = 0;
-    delete [] _playoutBuffer;
-    _playoutBuffer = NULL;
-
-    // stop and close pcm playout device
-    int errVal = LATE(snd_pcm_drop)(_handlePlayout);
-    if (errVal < 0)
-    {
-        LOG(LS_ERROR) << "Error stop playing: " << LATE(snd_strerror)(errVal);
-    }
-
-    errVal = LATE(snd_pcm_close)(_handlePlayout);
-     if (errVal < 0)
-         LOG(LS_ERROR) << "Error closing playout sound device, error: "
-                       << LATE(snd_strerror)(errVal);
-
-     // set the pcm input handle to NULL
-     _playIsInitialized = false;
-     _handlePlayout = NULL;
-     LOG(LS_VERBOSE) << "handle_playout is now set to NULL";
-
-     return 0;
-}
-
-int32_t AudioDeviceLinuxALSA::PlayoutDelay(uint16_t& delayMS) const
-{
-    delayMS = (uint16_t)_playoutDelay * 1000 / _playoutFreq;
-    return 0;
-}
-
-int32_t AudioDeviceLinuxALSA::RecordingDelay(uint16_t& delayMS) const
-{
-    // Adding 10ms adjusted value to the record delay due to 10ms buffering.
-    delayMS = (uint16_t)(10 + _recordingDelay * 1000 / _recordingFreq);
-    return 0;
-}
-
-bool AudioDeviceLinuxALSA::Playing() const
-{
-    return (_playing);
-}
-
-bool AudioDeviceLinuxALSA::PlayoutWarning() const
-{
-    rtc::CritScope lock(&_critSect);
-    return (_playWarning > 0);
-}
-
-bool AudioDeviceLinuxALSA::PlayoutError() const
-{
-    rtc::CritScope lock(&_critSect);
-    return (_playError > 0);
-}
-
-bool AudioDeviceLinuxALSA::RecordingWarning() const
-{
-    rtc::CritScope lock(&_critSect);
-    return (_recWarning > 0);
-}
-
-bool AudioDeviceLinuxALSA::RecordingError() const
-{
-    rtc::CritScope lock(&_critSect);
-    return (_recError > 0);
-}
-
-void AudioDeviceLinuxALSA::ClearPlayoutWarning()
-{
-    rtc::CritScope lock(&_critSect);
-    _playWarning = 0;
-}
-
-void AudioDeviceLinuxALSA::ClearPlayoutError()
-{
-    rtc::CritScope lock(&_critSect);
-    _playError = 0;
-}
-
-void AudioDeviceLinuxALSA::ClearRecordingWarning()
-{
-    rtc::CritScope lock(&_critSect);
-    _recWarning = 0;
-}
-
-void AudioDeviceLinuxALSA::ClearRecordingError()
-{
-    rtc::CritScope lock(&_critSect);
-    _recError = 0;
-}
-
-// ============================================================================
-//                                 Private Methods
-// ============================================================================
-
-int32_t AudioDeviceLinuxALSA::GetDevicesInfo(
-    const int32_t function,
-    const bool playback,
-    const int32_t enumDeviceNo,
-    char* enumDeviceName,
-    const int32_t ednLen) const
-{
-
-    // Device enumeration based on libjingle implementation
-    // by Tristan Schmelcher at Google Inc.
-
-    const char *type = playback ? "Output" : "Input";
-    // dmix and dsnoop are only for playback and capture, respectively, but ALSA
-    // stupidly includes them in both lists.
-    const char *ignorePrefix = playback ? "dsnoop:" : "dmix:" ;
-    // (ALSA lists many more "devices" of questionable interest, but we show them
-    // just in case the weird devices may actually be desirable for some
-    // users/systems.)
-
-    int err;
-    int enumCount(0);
-    bool keepSearching(true);
-
-    // From Chromium issue 95797
-    // Loop through the sound cards to get Alsa device hints.
-    // Don't use snd_device_name_hint(-1,..) since there is a access violation
-    // inside this ALSA API with libasound.so.2.0.0.
-    int card = -1;
-    while (!(LATE(snd_card_next)(&card)) && (card >= 0) && keepSearching) {
-        void **hints;
-        err = LATE(snd_device_name_hint)(card, "pcm", &hints);
-        if (err != 0)
-        {
-            LOG(LS_ERROR) << "GetDevicesInfo - device name hint error: "
-                          << LATE(snd_strerror)(err);
-            return -1;
-        }
-
-        enumCount++; // default is 0
-        if ((function == FUNC_GET_DEVICE_NAME ||
-            function == FUNC_GET_DEVICE_NAME_FOR_AN_ENUM) && enumDeviceNo == 0)
-        {
-            strcpy(enumDeviceName, "default");
-
-            err = LATE(snd_device_name_free_hint)(hints);
-            if (err != 0)
-            {
-                LOG(LS_ERROR)
-                    << "GetDevicesInfo - device name free hint error: "
-                    << LATE(snd_strerror)(err);
-            }
-
-            return 0;
-        }
-
-        for (void **list = hints; *list != NULL; ++list)
-        {
-            char *actualType = LATE(snd_device_name_get_hint)(*list, "IOID");
-            if (actualType)
-            {   // NULL means it's both.
-                bool wrongType = (strcmp(actualType, type) != 0);
-                free(actualType);
-                if (wrongType)
-                {
-                    // Wrong type of device (i.e., input vs. output).
-                    continue;
-                }
-            }
-
-            char *name = LATE(snd_device_name_get_hint)(*list, "NAME");
-            if (!name)
-            {
-                LOG(LS_ERROR) << "Device has no name";
-                // Skip it.
-                continue;
-            }
-
-            // Now check if we actually want to show this device.
-            if (strcmp(name, "default") != 0 &&
-                strcmp(name, "null") != 0 &&
-                strcmp(name, "pulse") != 0 &&
-                strncmp(name, ignorePrefix, strlen(ignorePrefix)) != 0)
-            {
-                // Yes, we do.
-                char *desc = LATE(snd_device_name_get_hint)(*list, "DESC");
-                if (!desc)
-                {
-                    // Virtual devices don't necessarily have descriptions.
-                    // Use their names instead.
-                    desc = name;
-                }
-
-                if (FUNC_GET_NUM_OF_DEVICE == function)
-                {
-                    LOG(LS_VERBOSE) << "Enum device " << enumCount << " - "
-                                    << name;
-
-                }
-                if ((FUNC_GET_DEVICE_NAME == function) &&
-                    (enumDeviceNo == enumCount))
-                {
-                    // We have found the enum device, copy the name to buffer.
-                    strncpy(enumDeviceName, desc, ednLen);
-                    enumDeviceName[ednLen-1] = '\0';
-                    keepSearching = false;
-                    // Replace '\n' with '-'.
-                    char * pret = strchr(enumDeviceName, '\n'/*0xa*/); //LF
-                    if (pret)
-                        *pret = '-';
-                }
-                if ((FUNC_GET_DEVICE_NAME_FOR_AN_ENUM == function) &&
-                    (enumDeviceNo == enumCount))
-                {
-                    // We have found the enum device, copy the name to buffer.
-                    strncpy(enumDeviceName, name, ednLen);
-                    enumDeviceName[ednLen-1] = '\0';
-                    keepSearching = false;
-                }
-
-                if (keepSearching)
-                    ++enumCount;
-
-                if (desc != name)
-                    free(desc);
-            }
-
-            free(name);
-
-            if (!keepSearching)
-                break;
-        }
-
-        err = LATE(snd_device_name_free_hint)(hints);
-        if (err != 0)
-        {
-            LOG(LS_ERROR) << "GetDevicesInfo - device name free hint error: "
-                          << LATE(snd_strerror)(err);
-            // Continue and return true anyway, since we did get the whole list.
-        }
-    }
-
-    if (FUNC_GET_NUM_OF_DEVICE == function)
-    {
-        if (enumCount == 1) // only default?
-            enumCount = 0;
-        return enumCount; // Normal return point for function 0
-    }
-
-    if (keepSearching)
-    {
-        // If we get here for function 1 and 2, we didn't find the specified
-        // enum device.
-        LOG(LS_ERROR)
-            << "GetDevicesInfo - Could not find device name or numbers";
-        return -1;
-    }
-
-    return 0;
-}
-
-int32_t AudioDeviceLinuxALSA::InputSanityCheckAfterUnlockedPeriod() const
-{
-    if (_handleRecord == NULL)
-    {
-        LOG(LS_ERROR) << "input state has been modified during unlocked period";
-        return -1;
-    }
-    return 0;
-}
-
-int32_t AudioDeviceLinuxALSA::OutputSanityCheckAfterUnlockedPeriod() const
-{
-    if (_handlePlayout == NULL)
-    {
-        LOG(LS_ERROR)
-            << "output state has been modified during unlocked period";
-        return -1;
-    }
-    return 0;
-}
-
-int32_t AudioDeviceLinuxALSA::ErrorRecovery(int32_t error,
-                                            snd_pcm_t* deviceHandle)
-{
-    int st = LATE(snd_pcm_state)(deviceHandle);
-    LOG(LS_VERBOSE) << "Trying to recover from "
-         << ((LATE(snd_pcm_stream)(deviceHandle) == SND_PCM_STREAM_CAPTURE)
-         ? "capture" : "playout") << " error: " << LATE(snd_strerror)(error)
-         << " (" << error << ") (state " << st << ")";
-
-    // It is recommended to use snd_pcm_recover for all errors. If that function
-    // cannot handle the error, the input error code will be returned, otherwise
-    // 0 is returned. From snd_pcm_recover API doc: "This functions handles
-    // -EINTR (4) (interrupted system call), -EPIPE (32) (playout overrun or
-    // capture underrun) and -ESTRPIPE (86) (stream is suspended) error codes
-    // trying to prepare given stream for next I/O."
-
-    /** Open */
-    //    SND_PCM_STATE_OPEN = 0,
-    /** Setup installed */
-    //    SND_PCM_STATE_SETUP,
-    /** Ready to start */
-    //    SND_PCM_STATE_PREPARED,
-    /** Running */
-    //    SND_PCM_STATE_RUNNING,
-    /** Stopped: underrun (playback) or overrun (capture) detected */
-    //    SND_PCM_STATE_XRUN,= 4
-    /** Draining: running (playback) or stopped (capture) */
-    //    SND_PCM_STATE_DRAINING,
-    /** Paused */
-    //    SND_PCM_STATE_PAUSED,
-    /** Hardware is suspended */
-    //    SND_PCM_STATE_SUSPENDED,
-    //  ** Hardware is disconnected */
-    //    SND_PCM_STATE_DISCONNECTED,
-    //    SND_PCM_STATE_LAST = SND_PCM_STATE_DISCONNECTED
-
-    // snd_pcm_recover isn't available in older alsa, e.g. on the FC4 machine
-    // in Sthlm lab.
-
-    int res = LATE(snd_pcm_recover)(deviceHandle, error, 1);
-    if (0 == res)
-    {
-        LOG(LS_VERBOSE) << "Recovery - snd_pcm_recover OK";
-
-        if ((error == -EPIPE || error == -ESTRPIPE) && // Buf underrun/overrun.
-            _recording &&
-            LATE(snd_pcm_stream)(deviceHandle) == SND_PCM_STREAM_CAPTURE)
-        {
-            // For capture streams we also have to repeat the explicit start()
-            // to get data flowing again.
-            int err = LATE(snd_pcm_start)(deviceHandle);
-            if (err != 0)
-            {
-                LOG(LS_ERROR) << "Recovery - snd_pcm_start error: " << err;
-                return -1;
-            }
-        }
-
-        if ((error == -EPIPE || error == -ESTRPIPE) &&  // Buf underrun/overrun.
-            _playing &&
-            LATE(snd_pcm_stream)(deviceHandle) == SND_PCM_STREAM_PLAYBACK)
-        {
-            // For capture streams we also have to repeat the explicit start() to get
-            // data flowing again.
-            int err = LATE(snd_pcm_start)(deviceHandle);
-            if (err != 0)
-            {
-              LOG(LS_ERROR) << "Recovery - snd_pcm_start error: "
-                            << LATE(snd_strerror)(err);
-              return -1;
-            }
-        }
-
-        return -EPIPE == error ? 1 : 0;
-    }
-    else {
-        LOG(LS_ERROR) << "Unrecoverable alsa stream error: " << res;
-    }
-
-    return res;
-}
-
-// ============================================================================
-//                                  Thread Methods
-// ============================================================================
-
-bool AudioDeviceLinuxALSA::PlayThreadFunc(void* pThis)
-{
-    return (static_cast<AudioDeviceLinuxALSA*>(pThis)->PlayThreadProcess());
-}
-
-bool AudioDeviceLinuxALSA::RecThreadFunc(void* pThis)
-{
-    return (static_cast<AudioDeviceLinuxALSA*>(pThis)->RecThreadProcess());
-}
-
-bool AudioDeviceLinuxALSA::PlayThreadProcess()
-{
-    if(!_playing)
-        return false;
-
-    int err;
-    snd_pcm_sframes_t frames;
-    snd_pcm_sframes_t avail_frames;
-
-    Lock();
-    //return a positive number of frames ready otherwise a negative error code
-    avail_frames = LATE(snd_pcm_avail_update)(_handlePlayout);
-    if (avail_frames < 0)
-    {
-        LOG(LS_ERROR) << "playout snd_pcm_avail_update error: "
-                      << LATE(snd_strerror)(avail_frames);
-        ErrorRecovery(avail_frames, _handlePlayout);
-        UnLock();
-        return true;
-    }
-    else if (avail_frames == 0)
-    {
-        UnLock();
-
-        //maximum tixe in milliseconds to wait, a negative value means infinity
-        err = LATE(snd_pcm_wait)(_handlePlayout, 2);
-        if (err == 0)
-        { //timeout occured
-            LOG(LS_VERBOSE) << "playout snd_pcm_wait timeout";
-        }
-
-        return true;
-    }
-
-    if (_playoutFramesLeft <= 0)
-    {
-        UnLock();
-        _ptrAudioBuffer->RequestPlayoutData(_playoutFramesIn10MS);
-        Lock();
-
-        _playoutFramesLeft = _ptrAudioBuffer->GetPlayoutData(_playoutBuffer);
-        assert(_playoutFramesLeft == _playoutFramesIn10MS);
-    }
-
-    if (static_cast<uint32_t>(avail_frames) > _playoutFramesLeft)
-        avail_frames = _playoutFramesLeft;
-
-    int size = LATE(snd_pcm_frames_to_bytes)(_handlePlayout,
-        _playoutFramesLeft);
-    frames = LATE(snd_pcm_writei)(
-        _handlePlayout,
-        &_playoutBuffer[_playoutBufferSizeIn10MS - size],
-        avail_frames);
-
-    if (frames < 0)
-    {
-        LOG(LS_VERBOSE) << "playout snd_pcm_writei error: "
-                        << LATE(snd_strerror)(frames);
-        _playoutFramesLeft = 0;
-        ErrorRecovery(frames, _handlePlayout);
-        UnLock();
-        return true;
-    }
-    else {
-        assert(frames==avail_frames);
-        _playoutFramesLeft -= frames;
-    }
-
-    UnLock();
-    return true;
-}
-
-bool AudioDeviceLinuxALSA::RecThreadProcess()
-{
-    if (!_recording)
-        return false;
-
-    int err;
-    snd_pcm_sframes_t frames;
-    snd_pcm_sframes_t avail_frames;
-    int8_t buffer[_recordingBufferSizeIn10MS];
-
-    Lock();
-
-    //return a positive number of frames ready otherwise a negative error code
-    avail_frames = LATE(snd_pcm_avail_update)(_handleRecord);
-    if (avail_frames < 0)
-    {
-        LOG(LS_ERROR) << "capture snd_pcm_avail_update error: "
-                      << LATE(snd_strerror)(avail_frames);
-        ErrorRecovery(avail_frames, _handleRecord);
-        UnLock();
-        return true;
-    }
-    else if (avail_frames == 0)
-    { // no frame is available now
-        UnLock();
-
-        //maximum time in milliseconds to wait, a negative value means infinity
-        err = LATE(snd_pcm_wait)(_handleRecord,
-            ALSA_CAPTURE_WAIT_TIMEOUT);
-        if (err == 0) //timeout occured
-            LOG(LS_VERBOSE) << "capture snd_pcm_wait timeout";
-
-        return true;
-    }
-
-    if (static_cast<uint32_t>(avail_frames) > _recordingFramesLeft)
-        avail_frames = _recordingFramesLeft;
-
-    frames = LATE(snd_pcm_readi)(_handleRecord,
-        buffer, avail_frames); // frames to be written
-    if (frames < 0)
-    {
-        LOG(LS_ERROR) << "capture snd_pcm_readi error: "
-                      << LATE(snd_strerror)(frames);
-        ErrorRecovery(frames, _handleRecord);
-        UnLock();
-        return true;
-    }
-    else if (frames > 0)
-    {
-        assert(frames == avail_frames);
-
-        int left_size = LATE(snd_pcm_frames_to_bytes)(_handleRecord,
-            _recordingFramesLeft);
-        int size = LATE(snd_pcm_frames_to_bytes)(_handleRecord, frames);
-
-        memcpy(&_recordingBuffer[_recordingBufferSizeIn10MS - left_size],
-               buffer, size);
-        _recordingFramesLeft -= frames;
-
-        if (!_recordingFramesLeft)
-        { // buf is full
-            _recordingFramesLeft = _recordingFramesIn10MS;
-
-            // store the recorded buffer (no action will be taken if the
-            // #recorded samples is not a full buffer)
-            _ptrAudioBuffer->SetRecordedBuffer(_recordingBuffer,
-                                               _recordingFramesIn10MS);
-
-            uint32_t currentMicLevel = 0;
-            uint32_t newMicLevel = 0;
-
-            if (AGC())
-            {
-                // store current mic level in the audio buffer if AGC is enabled
-                if (MicrophoneVolume(currentMicLevel) == 0)
-                {
-                    if (currentMicLevel == 0xffffffff)
-                        currentMicLevel = 100;
-                    // this call does not affect the actual microphone volume
-                    _ptrAudioBuffer->SetCurrentMicLevel(currentMicLevel);
-                }
-            }
-
-            // calculate delay
-            _playoutDelay = 0;
-            _recordingDelay = 0;
-            if (_handlePlayout)
-            {
-                err = LATE(snd_pcm_delay)(_handlePlayout,
-                    &_playoutDelay); // returned delay in frames
-                if (err < 0)
-                {
-                    // TODO(xians): Shall we call ErrorRecovery() here?
-                    _playoutDelay = 0;
-                    LOG(LS_ERROR) << "playout snd_pcm_delay: "
-                                  << LATE(snd_strerror)(err);
-                }
-            }
-
-            err = LATE(snd_pcm_delay)(_handleRecord,
-                &_recordingDelay); // returned delay in frames
-            if (err < 0)
-            {
-                // TODO(xians): Shall we call ErrorRecovery() here?
-                _recordingDelay = 0;
-                LOG(LS_ERROR) << "capture snd_pcm_delay: "
-                              << LATE(snd_strerror)(err);
-            }
-
-           // TODO(xians): Shall we add 10ms buffer delay to the record delay?
-            _ptrAudioBuffer->SetVQEData(
-                _playoutDelay * 1000 / _playoutFreq,
-                _recordingDelay * 1000 / _recordingFreq, 0);
-
-            _ptrAudioBuffer->SetTypingStatus(KeyPressed());
-
-            // Deliver recorded samples at specified sample rate, mic level etc.
-            // to the observer using callback.
-            UnLock();
-            _ptrAudioBuffer->DeliverRecordedData();
-            Lock();
-
-            if (AGC())
-            {
-                newMicLevel = _ptrAudioBuffer->NewMicLevel();
-                if (newMicLevel != 0)
-                {
-                    // The VQE will only deliver non-zero microphone levels when a
-                    // change is needed. Set this new mic level (received from the
-                    // observer as return value in the callback).
-                    if (SetMicrophoneVolume(newMicLevel) == -1)
-                        LOG(LS_WARNING)
-                            << "the required modification of the microphone volume failed";
-                }
-            }
-        }
-    }
-
-    UnLock();
-    return true;
-}
-
-
-bool AudioDeviceLinuxALSA::KeyPressed() const{
-#if defined(USE_X11)
-  char szKey[32];
-  unsigned int i = 0;
-  char state = 0;
-
-  if (!_XDisplay)
-    return false;
-
-  // Check key map status
-  XQueryKeymap(_XDisplay, szKey);
-
-  // A bit change in keymap means a key is pressed
-  for (i = 0; i < sizeof(szKey); i++)
-    state |= (szKey[i] ^ _oldKeyState[i]) & szKey[i];
-
-  // Save old state
-  memcpy((char*)_oldKeyState, (char*)szKey, sizeof(_oldKeyState));
-  return (state != 0);
-#else
-  return false;
-#endif
-}
-}  // namespace webrtc
diff --git a/modules/audio_device/linux/audio_device_alsa_linux.h b/modules/audio_device/linux/audio_device_alsa_linux.h
deleted file mode 100644
index 034f083..0000000
--- a/modules/audio_device/linux/audio_device_alsa_linux.h
+++ /dev/null
@@ -1,222 +0,0 @@
-/*
- *  Copyright (c) 2012 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_AUDIO_DEVICE_AUDIO_DEVICE_ALSA_LINUX_H
-#define WEBRTC_AUDIO_DEVICE_AUDIO_DEVICE_ALSA_LINUX_H
-
-#include <memory>
-
-#include "webrtc/modules/audio_device/audio_device_generic.h"
-#include "webrtc/modules/audio_device/linux/audio_mixer_manager_alsa_linux.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/platform_thread.h"
-
-#if defined(USE_X11)
-#include <X11/Xlib.h>
-#endif
-#include <alsa/asoundlib.h>
-#include <sys/ioctl.h>
-#include <sys/soundcard.h>
-
-
-namespace webrtc
-{
-class EventWrapper;
-
-class AudioDeviceLinuxALSA : public AudioDeviceGeneric
-{
-public:
-    AudioDeviceLinuxALSA();
-    virtual ~AudioDeviceLinuxALSA();
-
-    // Retrieve the currently utilized audio layer
-    int32_t ActiveAudioLayer(
-        AudioDeviceModule::AudioLayer& audioLayer) const override;
-
-    // Main initializaton and termination
-    InitStatus Init() override;
-    int32_t Terminate() override;
-    bool Initialized() const override;
-
-    // Device enumeration
-    int16_t PlayoutDevices() override;
-    int16_t RecordingDevices() override;
-    int32_t PlayoutDeviceName(uint16_t index,
-                              char name[kAdmMaxDeviceNameSize],
-                              char guid[kAdmMaxGuidSize]) override;
-    int32_t RecordingDeviceName(uint16_t index,
-                                char name[kAdmMaxDeviceNameSize],
-                                char guid[kAdmMaxGuidSize]) override;
-
-    // Device selection
-    int32_t SetPlayoutDevice(uint16_t index) override;
-    int32_t SetPlayoutDevice(
-        AudioDeviceModule::WindowsDeviceType device) override;
-    int32_t SetRecordingDevice(uint16_t index) override;
-    int32_t SetRecordingDevice(
-        AudioDeviceModule::WindowsDeviceType device) override;
-
-    // Audio transport initialization
-    int32_t PlayoutIsAvailable(bool& available) override;
-    int32_t InitPlayout() override;
-    bool PlayoutIsInitialized() const override;
-    int32_t RecordingIsAvailable(bool& available) override;
-    int32_t InitRecording() override;
-    bool RecordingIsInitialized() const override;
-
-    // Audio transport control
-    int32_t StartPlayout() override;
-    int32_t StopPlayout() override;
-    bool Playing() const override;
-    int32_t StartRecording() override;
-    int32_t StopRecording() override;
-    bool Recording() const override;
-
-    // Microphone Automatic Gain Control (AGC)
-    int32_t SetAGC(bool enable) override;
-    bool AGC() const override;
-
-    // Audio mixer initialization
-    int32_t InitSpeaker() override;
-    bool SpeakerIsInitialized() const override;
-    int32_t InitMicrophone() override;
-    bool MicrophoneIsInitialized() const override;
-
-    // Speaker volume controls
-    int32_t SpeakerVolumeIsAvailable(bool& available) override;
-    int32_t SetSpeakerVolume(uint32_t volume) override;
-    int32_t SpeakerVolume(uint32_t& volume) const override;
-    int32_t MaxSpeakerVolume(uint32_t& maxVolume) const override;
-    int32_t MinSpeakerVolume(uint32_t& minVolume) const override;
-
-    // Microphone volume controls
-    int32_t MicrophoneVolumeIsAvailable(bool& available) override;
-    int32_t SetMicrophoneVolume(uint32_t volume) override;
-    int32_t MicrophoneVolume(uint32_t& volume) const override;
-    int32_t MaxMicrophoneVolume(uint32_t& maxVolume) const override;
-    int32_t MinMicrophoneVolume(uint32_t& minVolume) const override;
-
-    // Speaker mute control
-    int32_t SpeakerMuteIsAvailable(bool& available) override;
-    int32_t SetSpeakerMute(bool enable) override;
-    int32_t SpeakerMute(bool& enabled) const override;
-
-    // Microphone mute control
-    int32_t MicrophoneMuteIsAvailable(bool& available) override;
-    int32_t SetMicrophoneMute(bool enable) override;
-    int32_t MicrophoneMute(bool& enabled) const override;
-
-    // Stereo support
-    int32_t StereoPlayoutIsAvailable(bool& available) override;
-    int32_t SetStereoPlayout(bool enable) override;
-    int32_t StereoPlayout(bool& enabled) const override;
-    int32_t StereoRecordingIsAvailable(bool& available) override;
-    int32_t SetStereoRecording(bool enable) override;
-    int32_t StereoRecording(bool& enabled) const override;
-
-    // Delay information and control
-    int32_t PlayoutDelay(uint16_t& delayMS) const override;
-    int32_t RecordingDelay(uint16_t& delayMS) const override;
-
-    bool PlayoutWarning() const override;
-    bool PlayoutError() const override;
-    bool RecordingWarning() const override;
-    bool RecordingError() const override;
-    void ClearPlayoutWarning() override;
-    void ClearPlayoutError() override;
-    void ClearRecordingWarning() override;
-    void ClearRecordingError() override;
-
-    void AttachAudioBuffer(AudioDeviceBuffer* audioBuffer) override;
-
-private:
-    int32_t GetDevicesInfo(const int32_t function,
-                           const bool playback,
-                           const int32_t enumDeviceNo = 0,
-                           char* enumDeviceName = NULL,
-                           const int32_t ednLen = 0) const;
-    int32_t ErrorRecovery(int32_t error, snd_pcm_t* deviceHandle);
-
-    bool KeyPressed() const;
-
-    void Lock() RTC_EXCLUSIVE_LOCK_FUNCTION(_critSect) { _critSect.Enter(); };
-    void UnLock() RTC_UNLOCK_FUNCTION(_critSect) { _critSect.Leave(); };
-
-    inline int32_t InputSanityCheckAfterUnlockedPeriod() const;
-    inline int32_t OutputSanityCheckAfterUnlockedPeriod() const;
-
-    static bool RecThreadFunc(void*);
-    static bool PlayThreadFunc(void*);
-    bool RecThreadProcess();
-    bool PlayThreadProcess();
-
-    AudioDeviceBuffer* _ptrAudioBuffer;
-
-    rtc::CriticalSection _critSect;
-
-    // TODO(pbos): Make plain members and start/stop instead of resetting these
-    // pointers. A thread can be reused.
-    std::unique_ptr<rtc::PlatformThread> _ptrThreadRec;
-    std::unique_ptr<rtc::PlatformThread> _ptrThreadPlay;
-
-    AudioMixerManagerLinuxALSA _mixerManager;
-
-    uint16_t _inputDeviceIndex;
-    uint16_t _outputDeviceIndex;
-    bool _inputDeviceIsSpecified;
-    bool _outputDeviceIsSpecified;
-
-    snd_pcm_t* _handleRecord;
-    snd_pcm_t* _handlePlayout;
-
-    snd_pcm_uframes_t _recordingBuffersizeInFrame;
-    snd_pcm_uframes_t _recordingPeriodSizeInFrame;
-    snd_pcm_uframes_t _playoutBufferSizeInFrame;
-    snd_pcm_uframes_t _playoutPeriodSizeInFrame;
-
-    ssize_t _recordingBufferSizeIn10MS;
-    ssize_t _playoutBufferSizeIn10MS;
-    uint32_t _recordingFramesIn10MS;
-    uint32_t _playoutFramesIn10MS;
-
-    uint32_t _recordingFreq;
-    uint32_t _playoutFreq;
-    uint8_t _recChannels;
-    uint8_t _playChannels;
-
-    int8_t* _recordingBuffer; // in byte
-    int8_t* _playoutBuffer; // in byte
-    uint32_t _recordingFramesLeft;
-    uint32_t _playoutFramesLeft;
-
-    bool _initialized;
-    bool _recording;
-    bool _playing;
-    bool _recIsInitialized;
-    bool _playIsInitialized;
-    bool _AGC;
-
-    snd_pcm_sframes_t _recordingDelay;
-    snd_pcm_sframes_t _playoutDelay;
-
-    uint16_t _playWarning;
-    uint16_t _playError;
-    uint16_t _recWarning;
-    uint16_t _recError;
-
-    char _oldKeyState[32];
-#if defined(USE_X11)
-    Display* _XDisplay;
-#endif
-};
-
-}
-
-#endif  // MODULES_AUDIO_DEVICE_MAIN_SOURCE_LINUX_AUDIO_DEVICE_ALSA_LINUX_H_
diff --git a/modules/audio_device/linux/audio_device_pulse_linux.cc b/modules/audio_device/linux/audio_device_pulse_linux.cc
deleted file mode 100644
index 02f03c7..0000000
--- a/modules/audio_device/linux/audio_device_pulse_linux.cc
+++ /dev/null
@@ -1,2407 +0,0 @@
-/*
- *  Copyright (c) 2012 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 <assert.h>
-
-#include "webrtc/modules/audio_device/audio_device_config.h"
-#include "webrtc/modules/audio_device/linux/audio_device_pulse_linux.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/system_wrappers/include/event_wrapper.h"
-
-webrtc::adm_linux_pulse::PulseAudioSymbolTable PaSymbolTable;
-
-// Accesses Pulse functions through our late-binding symbol table instead of
-// directly. This way we don't have to link to libpulse, which means our binary
-// will work on systems that don't have it.
-#define LATE(sym)                                                             \
-  LATESYM_GET(webrtc::adm_linux_pulse::PulseAudioSymbolTable, &PaSymbolTable, \
-              sym)
-
-namespace webrtc {
-
-AudioDeviceLinuxPulse::AudioDeviceLinuxPulse()
-    : _ptrAudioBuffer(NULL),
-      _timeEventRec(*EventWrapper::Create()),
-      _timeEventPlay(*EventWrapper::Create()),
-      _recStartEvent(*EventWrapper::Create()),
-      _playStartEvent(*EventWrapper::Create()),
-      _inputDeviceIndex(0),
-      _outputDeviceIndex(0),
-      _inputDeviceIsSpecified(false),
-      _outputDeviceIsSpecified(false),
-      sample_rate_hz_(0),
-      _recChannels(1),
-      _playChannels(1),
-      _initialized(false),
-      _recording(false),
-      _playing(false),
-      _recIsInitialized(false),
-      _playIsInitialized(false),
-      _startRec(false),
-      _stopRec(false),
-      _startPlay(false),
-      _stopPlay(false),
-      _AGC(false),
-      update_speaker_volume_at_startup_(false),
-      _sndCardPlayDelay(0),
-      _sndCardRecDelay(0),
-      _writeErrors(0),
-      _playWarning(0),
-      _playError(0),
-      _recWarning(0),
-      _recError(0),
-      _deviceIndex(-1),
-      _numPlayDevices(0),
-      _numRecDevices(0),
-      _playDeviceName(NULL),
-      _recDeviceName(NULL),
-      _playDisplayDeviceName(NULL),
-      _recDisplayDeviceName(NULL),
-      _playBuffer(NULL),
-      _playbackBufferSize(0),
-      _playbackBufferUnused(0),
-      _tempBufferSpace(0),
-      _recBuffer(NULL),
-      _recordBufferSize(0),
-      _recordBufferUsed(0),
-      _tempSampleData(NULL),
-      _tempSampleDataSize(0),
-      _configuredLatencyPlay(0),
-      _configuredLatencyRec(0),
-      _paDeviceIndex(-1),
-      _paStateChanged(false),
-      _paMainloop(NULL),
-      _paMainloopApi(NULL),
-      _paContext(NULL),
-      _recStream(NULL),
-      _playStream(NULL),
-      _recStreamFlags(0),
-      _playStreamFlags(0) {
-  LOG(LS_INFO) << __FUNCTION__ << " created";
-
-  memset(_paServerVersion, 0, sizeof(_paServerVersion));
-  memset(&_playBufferAttr, 0, sizeof(_playBufferAttr));
-  memset(&_recBufferAttr, 0, sizeof(_recBufferAttr));
-  memset(_oldKeyState, 0, sizeof(_oldKeyState));
-}
-
-AudioDeviceLinuxPulse::~AudioDeviceLinuxPulse() {
-  LOG(LS_INFO) << __FUNCTION__ << " destroyed";
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  Terminate();
-
-  if (_recBuffer) {
-    delete[] _recBuffer;
-    _recBuffer = NULL;
-  }
-  if (_playBuffer) {
-    delete[] _playBuffer;
-    _playBuffer = NULL;
-  }
-  if (_playDeviceName) {
-    delete[] _playDeviceName;
-    _playDeviceName = NULL;
-  }
-  if (_recDeviceName) {
-    delete[] _recDeviceName;
-    _recDeviceName = NULL;
-  }
-
-  delete &_recStartEvent;
-  delete &_playStartEvent;
-  delete &_timeEventRec;
-  delete &_timeEventPlay;
-}
-
-void AudioDeviceLinuxPulse::AttachAudioBuffer(AudioDeviceBuffer* audioBuffer) {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-
-  _ptrAudioBuffer = audioBuffer;
-
-  // Inform the AudioBuffer about default settings for this implementation.
-  // Set all values to zero here since the actual settings will be done by
-  // InitPlayout and InitRecording later.
-  _ptrAudioBuffer->SetRecordingSampleRate(0);
-  _ptrAudioBuffer->SetPlayoutSampleRate(0);
-  _ptrAudioBuffer->SetRecordingChannels(0);
-  _ptrAudioBuffer->SetPlayoutChannels(0);
-}
-
-// ----------------------------------------------------------------------------
-//  ActiveAudioLayer
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceLinuxPulse::ActiveAudioLayer(
-    AudioDeviceModule::AudioLayer& audioLayer) const {
-  audioLayer = AudioDeviceModule::kLinuxPulseAudio;
-  return 0;
-}
-
-AudioDeviceGeneric::InitStatus AudioDeviceLinuxPulse::Init() {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  if (_initialized) {
-    return InitStatus::OK;
-  }
-
-  // Initialize PulseAudio
-  if (InitPulseAudio() < 0) {
-    LOG(LS_ERROR) << "failed to initialize PulseAudio";
-    if (TerminatePulseAudio() < 0) {
-      LOG(LS_ERROR) << "failed to terminate PulseAudio";
-    }
-    return InitStatus::OTHER_ERROR;
-  }
-
-  _playWarning = 0;
-  _playError = 0;
-  _recWarning = 0;
-  _recError = 0;
-
-  // Get X display handle for typing detection
-  _XDisplay = XOpenDisplay(NULL);
-  if (!_XDisplay) {
-    LOG(LS_WARNING)
-        << "failed to open X display, typing detection will not work";
-  }
-
-  // RECORDING
-  _ptrThreadRec.reset(new rtc::PlatformThread(
-      RecThreadFunc, this, "webrtc_audio_module_rec_thread"));
-
-  _ptrThreadRec->Start();
-  _ptrThreadRec->SetPriority(rtc::kRealtimePriority);
-
-  // PLAYOUT
-  _ptrThreadPlay.reset(new rtc::PlatformThread(
-      PlayThreadFunc, this, "webrtc_audio_module_play_thread"));
-  _ptrThreadPlay->Start();
-  _ptrThreadPlay->SetPriority(rtc::kRealtimePriority);
-
-  _initialized = true;
-
-  return InitStatus::OK;
-}
-
-int32_t AudioDeviceLinuxPulse::Terminate() {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  if (!_initialized) {
-    return 0;
-  }
-
-  _mixerManager.Close();
-
-  // RECORDING
-  if (_ptrThreadRec) {
-    rtc::PlatformThread* tmpThread = _ptrThreadRec.release();
-
-    _timeEventRec.Set();
-    tmpThread->Stop();
-    delete tmpThread;
-  }
-
-  // PLAYOUT
-  if (_ptrThreadPlay) {
-    rtc::PlatformThread* tmpThread = _ptrThreadPlay.release();
-
-    _timeEventPlay.Set();
-    tmpThread->Stop();
-    delete tmpThread;
-  }
-
-  // Terminate PulseAudio
-  if (TerminatePulseAudio() < 0) {
-    LOG(LS_ERROR) << "failed to terminate PulseAudio";
-    return -1;
-  }
-
-  if (_XDisplay) {
-    XCloseDisplay(_XDisplay);
-    _XDisplay = NULL;
-  }
-
-  _initialized = false;
-  _outputDeviceIsSpecified = false;
-  _inputDeviceIsSpecified = false;
-
-  return 0;
-}
-
-bool AudioDeviceLinuxPulse::Initialized() const {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  return (_initialized);
-}
-
-int32_t AudioDeviceLinuxPulse::InitSpeaker() {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-
-  if (_playing) {
-    return -1;
-  }
-
-  if (!_outputDeviceIsSpecified) {
-    return -1;
-  }
-
-  // check if default device
-  if (_outputDeviceIndex == 0) {
-    uint16_t deviceIndex = 0;
-    GetDefaultDeviceInfo(false, NULL, deviceIndex);
-    _paDeviceIndex = deviceIndex;
-  } else {
-    // get the PA device index from
-    // the callback
-    _deviceIndex = _outputDeviceIndex;
-
-    // get playout devices
-    PlayoutDevices();
-  }
-
-  // the callback has now set the _paDeviceIndex to
-  // the PulseAudio index of the device
-  if (_mixerManager.OpenSpeaker(_paDeviceIndex) == -1) {
-    return -1;
-  }
-
-  // clear _deviceIndex
-  _deviceIndex = -1;
-  _paDeviceIndex = -1;
-
-  return 0;
-}
-
-int32_t AudioDeviceLinuxPulse::InitMicrophone() {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  if (_recording) {
-    return -1;
-  }
-
-  if (!_inputDeviceIsSpecified) {
-    return -1;
-  }
-
-  // Check if default device
-  if (_inputDeviceIndex == 0) {
-    uint16_t deviceIndex = 0;
-    GetDefaultDeviceInfo(true, NULL, deviceIndex);
-    _paDeviceIndex = deviceIndex;
-  } else {
-    // Get the PA device index from
-    // the callback
-    _deviceIndex = _inputDeviceIndex;
-
-    // get recording devices
-    RecordingDevices();
-  }
-
-  // The callback has now set the _paDeviceIndex to
-  // the PulseAudio index of the device
-  if (_mixerManager.OpenMicrophone(_paDeviceIndex) == -1) {
-    return -1;
-  }
-
-  // Clear _deviceIndex
-  _deviceIndex = -1;
-  _paDeviceIndex = -1;
-
-  return 0;
-}
-
-bool AudioDeviceLinuxPulse::SpeakerIsInitialized() const {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  return (_mixerManager.SpeakerIsInitialized());
-}
-
-bool AudioDeviceLinuxPulse::MicrophoneIsInitialized() const {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  return (_mixerManager.MicrophoneIsInitialized());
-}
-
-int32_t AudioDeviceLinuxPulse::SpeakerVolumeIsAvailable(bool& available) {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  bool wasInitialized = _mixerManager.SpeakerIsInitialized();
-
-  // Make an attempt to open up the
-  // output mixer corresponding to the currently selected output device.
-  if (!wasInitialized && InitSpeaker() == -1) {
-    // If we end up here it means that the selected speaker has no volume
-    // control.
-    available = false;
-    return 0;
-  }
-
-  // Given that InitSpeaker was successful, we know volume control exists.
-  available = true;
-
-  // Close the initialized output mixer
-  if (!wasInitialized) {
-    _mixerManager.CloseSpeaker();
-  }
-
-  return 0;
-}
-
-int32_t AudioDeviceLinuxPulse::SetSpeakerVolume(uint32_t volume) {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  if (!_playing) {
-    // Only update the volume if it's been set while we weren't playing.
-    update_speaker_volume_at_startup_ = true;
-  }
-  return (_mixerManager.SetSpeakerVolume(volume));
-}
-
-int32_t AudioDeviceLinuxPulse::SpeakerVolume(uint32_t& volume) const {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  uint32_t level(0);
-
-  if (_mixerManager.SpeakerVolume(level) == -1) {
-    return -1;
-  }
-
-  volume = level;
-
-  return 0;
-}
-
-int32_t AudioDeviceLinuxPulse::MaxSpeakerVolume(uint32_t& maxVolume) const {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  uint32_t maxVol(0);
-
-  if (_mixerManager.MaxSpeakerVolume(maxVol) == -1) {
-    return -1;
-  }
-
-  maxVolume = maxVol;
-
-  return 0;
-}
-
-int32_t AudioDeviceLinuxPulse::MinSpeakerVolume(uint32_t& minVolume) const {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  uint32_t minVol(0);
-
-  if (_mixerManager.MinSpeakerVolume(minVol) == -1) {
-    return -1;
-  }
-
-  minVolume = minVol;
-
-  return 0;
-}
-
-int32_t AudioDeviceLinuxPulse::SpeakerMuteIsAvailable(bool& available) {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  bool isAvailable(false);
-  bool wasInitialized = _mixerManager.SpeakerIsInitialized();
-
-  // Make an attempt to open up the
-  // output mixer corresponding to the currently selected output device.
-  //
-  if (!wasInitialized && InitSpeaker() == -1) {
-    // If we end up here it means that the selected speaker has no volume
-    // control, hence it is safe to state that there is no mute control
-    // already at this stage.
-    available = false;
-    return 0;
-  }
-
-  // Check if the selected speaker has a mute control
-  _mixerManager.SpeakerMuteIsAvailable(isAvailable);
-
-  available = isAvailable;
-
-  // Close the initialized output mixer
-  if (!wasInitialized) {
-    _mixerManager.CloseSpeaker();
-  }
-
-  return 0;
-}
-
-int32_t AudioDeviceLinuxPulse::SetSpeakerMute(bool enable) {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  return (_mixerManager.SetSpeakerMute(enable));
-}
-
-int32_t AudioDeviceLinuxPulse::SpeakerMute(bool& enabled) const {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  bool muted(0);
-  if (_mixerManager.SpeakerMute(muted) == -1) {
-    return -1;
-  }
-
-  enabled = muted;
-  return 0;
-}
-
-int32_t AudioDeviceLinuxPulse::MicrophoneMuteIsAvailable(bool& available) {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  bool isAvailable(false);
-  bool wasInitialized = _mixerManager.MicrophoneIsInitialized();
-
-  // Make an attempt to open up the
-  // input mixer corresponding to the currently selected input device.
-  //
-  if (!wasInitialized && InitMicrophone() == -1) {
-    // If we end up here it means that the selected microphone has no
-    // volume control, hence it is safe to state that there is no
-    // boost control already at this stage.
-    available = false;
-    return 0;
-  }
-
-  // Check if the selected microphone has a mute control
-  //
-  _mixerManager.MicrophoneMuteIsAvailable(isAvailable);
-  available = isAvailable;
-
-  // Close the initialized input mixer
-  //
-  if (!wasInitialized) {
-    _mixerManager.CloseMicrophone();
-  }
-
-  return 0;
-}
-
-int32_t AudioDeviceLinuxPulse::SetMicrophoneMute(bool enable) {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  return (_mixerManager.SetMicrophoneMute(enable));
-}
-
-int32_t AudioDeviceLinuxPulse::MicrophoneMute(bool& enabled) const {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  bool muted(0);
-  if (_mixerManager.MicrophoneMute(muted) == -1) {
-    return -1;
-  }
-
-  enabled = muted;
-  return 0;
-}
-
-int32_t AudioDeviceLinuxPulse::StereoRecordingIsAvailable(bool& available) {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  if (_recChannels == 2 && _recording) {
-    available = true;
-    return 0;
-  }
-
-  available = false;
-  bool wasInitialized = _mixerManager.MicrophoneIsInitialized();
-  int error = 0;
-
-  if (!wasInitialized && InitMicrophone() == -1) {
-    // Cannot open the specified device
-    available = false;
-    return 0;
-  }
-
-  // Check if the selected microphone can record stereo.
-  bool isAvailable(false);
-  error = _mixerManager.StereoRecordingIsAvailable(isAvailable);
-  if (!error)
-    available = isAvailable;
-
-  // Close the initialized input mixer
-  if (!wasInitialized) {
-    _mixerManager.CloseMicrophone();
-  }
-
-  return error;
-}
-
-int32_t AudioDeviceLinuxPulse::SetStereoRecording(bool enable) {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  if (enable)
-    _recChannels = 2;
-  else
-    _recChannels = 1;
-
-  return 0;
-}
-
-int32_t AudioDeviceLinuxPulse::StereoRecording(bool& enabled) const {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  if (_recChannels == 2)
-    enabled = true;
-  else
-    enabled = false;
-
-  return 0;
-}
-
-int32_t AudioDeviceLinuxPulse::StereoPlayoutIsAvailable(bool& available) {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  if (_playChannels == 2 && _playing) {
-    available = true;
-    return 0;
-  }
-
-  available = false;
-  bool wasInitialized = _mixerManager.SpeakerIsInitialized();
-  int error = 0;
-
-  if (!wasInitialized && InitSpeaker() == -1) {
-    // Cannot open the specified device.
-    return -1;
-  }
-
-  // Check if the selected speaker can play stereo.
-  bool isAvailable(false);
-  error = _mixerManager.StereoPlayoutIsAvailable(isAvailable);
-  if (!error)
-    available = isAvailable;
-
-  // Close the initialized input mixer
-  if (!wasInitialized) {
-    _mixerManager.CloseSpeaker();
-  }
-
-  return error;
-}
-
-int32_t AudioDeviceLinuxPulse::SetStereoPlayout(bool enable) {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  if (enable)
-    _playChannels = 2;
-  else
-    _playChannels = 1;
-
-  return 0;
-}
-
-int32_t AudioDeviceLinuxPulse::StereoPlayout(bool& enabled) const {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  if (_playChannels == 2)
-    enabled = true;
-  else
-    enabled = false;
-
-  return 0;
-}
-
-int32_t AudioDeviceLinuxPulse::SetAGC(bool enable) {
-  rtc::CritScope lock(&_critSect);
-  _AGC = enable;
-
-  return 0;
-}
-
-bool AudioDeviceLinuxPulse::AGC() const {
-  rtc::CritScope lock(&_critSect);
-  return _AGC;
-}
-
-int32_t AudioDeviceLinuxPulse::MicrophoneVolumeIsAvailable(bool& available) {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  bool wasInitialized = _mixerManager.MicrophoneIsInitialized();
-
-  // Make an attempt to open up the
-  // input mixer corresponding to the currently selected output device.
-  if (!wasInitialized && InitMicrophone() == -1) {
-    // If we end up here it means that the selected microphone has no
-    // volume control.
-    available = false;
-    return 0;
-  }
-
-  // Given that InitMicrophone was successful, we know that a volume control
-  // exists.
-  available = true;
-
-  // Close the initialized input mixer
-  if (!wasInitialized) {
-    _mixerManager.CloseMicrophone();
-  }
-
-  return 0;
-}
-
-int32_t AudioDeviceLinuxPulse::SetMicrophoneVolume(uint32_t volume) {
-  return (_mixerManager.SetMicrophoneVolume(volume));
-}
-
-int32_t AudioDeviceLinuxPulse::MicrophoneVolume(uint32_t& volume) const {
-  uint32_t level(0);
-
-  if (_mixerManager.MicrophoneVolume(level) == -1) {
-    LOG(LS_WARNING) << "failed to retrieve current microphone level";
-    return -1;
-  }
-
-  volume = level;
-
-  return 0;
-}
-
-int32_t AudioDeviceLinuxPulse::MaxMicrophoneVolume(uint32_t& maxVolume) const {
-  uint32_t maxVol(0);
-
-  if (_mixerManager.MaxMicrophoneVolume(maxVol) == -1) {
-    return -1;
-  }
-
-  maxVolume = maxVol;
-
-  return 0;
-}
-
-int32_t AudioDeviceLinuxPulse::MinMicrophoneVolume(uint32_t& minVolume) const {
-  uint32_t minVol(0);
-
-  if (_mixerManager.MinMicrophoneVolume(minVol) == -1) {
-    return -1;
-  }
-
-  minVolume = minVol;
-
-  return 0;
-}
-
-int16_t AudioDeviceLinuxPulse::PlayoutDevices() {
-  PaLock();
-
-  pa_operation* paOperation = NULL;
-  _numPlayDevices = 1;  // init to 1 to account for "default"
-
-  // get the whole list of devices and update _numPlayDevices
-  paOperation =
-      LATE(pa_context_get_sink_info_list)(_paContext, PaSinkInfoCallback, this);
-
-  WaitForOperationCompletion(paOperation);
-
-  PaUnLock();
-
-  return _numPlayDevices;
-}
-
-int32_t AudioDeviceLinuxPulse::SetPlayoutDevice(uint16_t index) {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  if (_playIsInitialized) {
-    return -1;
-  }
-
-  const uint16_t nDevices = PlayoutDevices();
-
-  LOG(LS_VERBOSE) << "number of availiable output devices is " << nDevices;
-
-  if (index > (nDevices - 1)) {
-    LOG(LS_ERROR) << "device index is out of range [0," << (nDevices - 1)
-                  << "]";
-    return -1;
-  }
-
-  _outputDeviceIndex = index;
-  _outputDeviceIsSpecified = true;
-
-  return 0;
-}
-
-int32_t AudioDeviceLinuxPulse::SetPlayoutDevice(
-    AudioDeviceModule::WindowsDeviceType /*device*/) {
-  LOG(LS_ERROR) << "WindowsDeviceType not supported";
-  return -1;
-}
-
-int32_t AudioDeviceLinuxPulse::PlayoutDeviceName(
-    uint16_t index,
-    char name[kAdmMaxDeviceNameSize],
-    char guid[kAdmMaxGuidSize]) {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  const uint16_t nDevices = PlayoutDevices();
-
-  if ((index > (nDevices - 1)) || (name == NULL)) {
-    return -1;
-  }
-
-  memset(name, 0, kAdmMaxDeviceNameSize);
-
-  if (guid != NULL) {
-    memset(guid, 0, kAdmMaxGuidSize);
-  }
-
-  // Check if default device
-  if (index == 0) {
-    uint16_t deviceIndex = 0;
-    return GetDefaultDeviceInfo(false, name, deviceIndex);
-  }
-
-  // Tell the callback that we want
-  // The name for this device
-  _playDisplayDeviceName = name;
-  _deviceIndex = index;
-
-  // get playout devices
-  PlayoutDevices();
-
-  // clear device name and index
-  _playDisplayDeviceName = NULL;
-  _deviceIndex = -1;
-
-  return 0;
-}
-
-int32_t AudioDeviceLinuxPulse::RecordingDeviceName(
-    uint16_t index,
-    char name[kAdmMaxDeviceNameSize],
-    char guid[kAdmMaxGuidSize]) {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  const uint16_t nDevices(RecordingDevices());
-
-  if ((index > (nDevices - 1)) || (name == NULL)) {
-    return -1;
-  }
-
-  memset(name, 0, kAdmMaxDeviceNameSize);
-
-  if (guid != NULL) {
-    memset(guid, 0, kAdmMaxGuidSize);
-  }
-
-  // Check if default device
-  if (index == 0) {
-    uint16_t deviceIndex = 0;
-    return GetDefaultDeviceInfo(true, name, deviceIndex);
-  }
-
-  // Tell the callback that we want
-  // the name for this device
-  _recDisplayDeviceName = name;
-  _deviceIndex = index;
-
-  // Get recording devices
-  RecordingDevices();
-
-  // Clear device name and index
-  _recDisplayDeviceName = NULL;
-  _deviceIndex = -1;
-
-  return 0;
-}
-
-int16_t AudioDeviceLinuxPulse::RecordingDevices() {
-  PaLock();
-
-  pa_operation* paOperation = NULL;
-  _numRecDevices = 1;  // Init to 1 to account for "default"
-
-  // Get the whole list of devices and update _numRecDevices
-  paOperation = LATE(pa_context_get_source_info_list)(
-      _paContext, PaSourceInfoCallback, this);
-
-  WaitForOperationCompletion(paOperation);
-
-  PaUnLock();
-
-  return _numRecDevices;
-}
-
-int32_t AudioDeviceLinuxPulse::SetRecordingDevice(uint16_t index) {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  if (_recIsInitialized) {
-    return -1;
-  }
-
-  const uint16_t nDevices(RecordingDevices());
-
-  LOG(LS_VERBOSE) << "number of availiable input devices is " << nDevices;
-
-  if (index > (nDevices - 1)) {
-    LOG(LS_ERROR) << "device index is out of range [0," << (nDevices - 1)
-                  << "]";
-    return -1;
-  }
-
-  _inputDeviceIndex = index;
-  _inputDeviceIsSpecified = true;
-
-  return 0;
-}
-
-int32_t AudioDeviceLinuxPulse::SetRecordingDevice(
-    AudioDeviceModule::WindowsDeviceType /*device*/) {
-  LOG(LS_ERROR) << "WindowsDeviceType not supported";
-  return -1;
-}
-
-int32_t AudioDeviceLinuxPulse::PlayoutIsAvailable(bool& available) {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  available = false;
-
-  // Try to initialize the playout side
-  int32_t res = InitPlayout();
-
-  // Cancel effect of initialization
-  StopPlayout();
-
-  if (res != -1) {
-    available = true;
-  }
-
-  return res;
-}
-
-int32_t AudioDeviceLinuxPulse::RecordingIsAvailable(bool& available) {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  available = false;
-
-  // Try to initialize the playout side
-  int32_t res = InitRecording();
-
-  // Cancel effect of initialization
-  StopRecording();
-
-  if (res != -1) {
-    available = true;
-  }
-
-  return res;
-}
-
-int32_t AudioDeviceLinuxPulse::InitPlayout() {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-
-  if (_playing) {
-    return -1;
-  }
-
-  if (!_outputDeviceIsSpecified) {
-    return -1;
-  }
-
-  if (_playIsInitialized) {
-    return 0;
-  }
-
-  // Initialize the speaker (devices might have been added or removed)
-  if (InitSpeaker() == -1) {
-    LOG(LS_WARNING) << "InitSpeaker() failed";
-  }
-
-  // Set the play sample specification
-  pa_sample_spec playSampleSpec;
-  playSampleSpec.channels = _playChannels;
-  playSampleSpec.format = PA_SAMPLE_S16LE;
-  playSampleSpec.rate = sample_rate_hz_;
-
-  // Create a new play stream
-  _playStream =
-      LATE(pa_stream_new)(_paContext, "playStream", &playSampleSpec, NULL);
-
-  if (!_playStream) {
-    LOG(LS_ERROR) << "failed to create play stream, err="
-                  << LATE(pa_context_errno)(_paContext);
-    return -1;
-  }
-
-  // Provide the playStream to the mixer
-  _mixerManager.SetPlayStream(_playStream);
-
-  if (_ptrAudioBuffer) {
-    // Update audio buffer with the selected parameters
-    _ptrAudioBuffer->SetPlayoutSampleRate(sample_rate_hz_);
-    _ptrAudioBuffer->SetPlayoutChannels((uint8_t)_playChannels);
-  }
-
-  LOG(LS_VERBOSE) << "stream state " << LATE(pa_stream_get_state)(_playStream);
-
-  // Set stream flags
-  _playStreamFlags = (pa_stream_flags_t)(PA_STREAM_AUTO_TIMING_UPDATE |
-                                         PA_STREAM_INTERPOLATE_TIMING);
-
-  if (_configuredLatencyPlay != WEBRTC_PA_NO_LATENCY_REQUIREMENTS) {
-    // If configuring a specific latency then we want to specify
-    // PA_STREAM_ADJUST_LATENCY to make the server adjust parameters
-    // automatically to reach that target latency. However, that flag
-    // doesn't exist in Ubuntu 8.04 and many people still use that,
-    // so we have to check the protocol version of libpulse.
-    if (LATE(pa_context_get_protocol_version)(_paContext) >=
-        WEBRTC_PA_ADJUST_LATENCY_PROTOCOL_VERSION) {
-      _playStreamFlags |= PA_STREAM_ADJUST_LATENCY;
-    }
-
-    const pa_sample_spec* spec = LATE(pa_stream_get_sample_spec)(_playStream);
-    if (!spec) {
-      LOG(LS_ERROR) << "pa_stream_get_sample_spec()";
-      return -1;
-    }
-
-    size_t bytesPerSec = LATE(pa_bytes_per_second)(spec);
-    uint32_t latency = bytesPerSec * WEBRTC_PA_PLAYBACK_LATENCY_MINIMUM_MSECS /
-                       WEBRTC_PA_MSECS_PER_SEC;
-
-    // Set the play buffer attributes
-    _playBufferAttr.maxlength = latency;  // num bytes stored in the buffer
-    _playBufferAttr.tlength = latency;    // target fill level of play buffer
-    // minimum free num bytes before server request more data
-    _playBufferAttr.minreq = latency / WEBRTC_PA_PLAYBACK_REQUEST_FACTOR;
-    // prebuffer tlength before starting playout
-    _playBufferAttr.prebuf = _playBufferAttr.tlength - _playBufferAttr.minreq;
-
-    _configuredLatencyPlay = latency;
-  }
-
-  // num samples in bytes * num channels
-  _playbackBufferSize = sample_rate_hz_ / 100 * 2 * _playChannels;
-  _playbackBufferUnused = _playbackBufferSize;
-  _playBuffer = new int8_t[_playbackBufferSize];
-
-  // Enable underflow callback
-  LATE(pa_stream_set_underflow_callback)
-  (_playStream, PaStreamUnderflowCallback, this);
-
-  // Set the state callback function for the stream
-  LATE(pa_stream_set_state_callback)(_playStream, PaStreamStateCallback, this);
-
-  // Mark playout side as initialized
-  _playIsInitialized = true;
-  _sndCardPlayDelay = 0;
-  _sndCardRecDelay = 0;
-
-  return 0;
-}
-
-int32_t AudioDeviceLinuxPulse::InitRecording() {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-
-  if (_recording) {
-    return -1;
-  }
-
-  if (!_inputDeviceIsSpecified) {
-    return -1;
-  }
-
-  if (_recIsInitialized) {
-    return 0;
-  }
-
-  // Initialize the microphone (devices might have been added or removed)
-  if (InitMicrophone() == -1) {
-    LOG(LS_WARNING) << "InitMicrophone() failed";
-  }
-
-  // Set the rec sample specification
-  pa_sample_spec recSampleSpec;
-  recSampleSpec.channels = _recChannels;
-  recSampleSpec.format = PA_SAMPLE_S16LE;
-  recSampleSpec.rate = sample_rate_hz_;
-
-  // Create a new rec stream
-  _recStream =
-      LATE(pa_stream_new)(_paContext, "recStream", &recSampleSpec, NULL);
-  if (!_recStream) {
-    LOG(LS_ERROR) << "failed to create rec stream, err="
-                  << LATE(pa_context_errno)(_paContext);
-    return -1;
-  }
-
-  // Provide the recStream to the mixer
-  _mixerManager.SetRecStream(_recStream);
-
-  if (_ptrAudioBuffer) {
-    // Update audio buffer with the selected parameters
-    _ptrAudioBuffer->SetRecordingSampleRate(sample_rate_hz_);
-    _ptrAudioBuffer->SetRecordingChannels((uint8_t)_recChannels);
-  }
-
-  if (_configuredLatencyRec != WEBRTC_PA_NO_LATENCY_REQUIREMENTS) {
-    _recStreamFlags = (pa_stream_flags_t)(PA_STREAM_AUTO_TIMING_UPDATE |
-                                          PA_STREAM_INTERPOLATE_TIMING);
-
-    // If configuring a specific latency then we want to specify
-    // PA_STREAM_ADJUST_LATENCY to make the server adjust parameters
-    // automatically to reach that target latency. However, that flag
-    // doesn't exist in Ubuntu 8.04 and many people still use that,
-    //  so we have to check the protocol version of libpulse.
-    if (LATE(pa_context_get_protocol_version)(_paContext) >=
-        WEBRTC_PA_ADJUST_LATENCY_PROTOCOL_VERSION) {
-      _recStreamFlags |= PA_STREAM_ADJUST_LATENCY;
-    }
-
-    const pa_sample_spec* spec = LATE(pa_stream_get_sample_spec)(_recStream);
-    if (!spec) {
-      LOG(LS_ERROR) << "pa_stream_get_sample_spec(rec)";
-      return -1;
-    }
-
-    size_t bytesPerSec = LATE(pa_bytes_per_second)(spec);
-    uint32_t latency = bytesPerSec * WEBRTC_PA_LOW_CAPTURE_LATENCY_MSECS /
-                       WEBRTC_PA_MSECS_PER_SEC;
-
-    // Set the rec buffer attributes
-    // Note: fragsize specifies a maximum transfer size, not a minimum, so
-    // it is not possible to force a high latency setting, only a low one.
-    _recBufferAttr.fragsize = latency;  // size of fragment
-    _recBufferAttr.maxlength =
-        latency + bytesPerSec * WEBRTC_PA_CAPTURE_BUFFER_EXTRA_MSECS /
-                      WEBRTC_PA_MSECS_PER_SEC;
-
-    _configuredLatencyRec = latency;
-  }
-
-  _recordBufferSize = sample_rate_hz_ / 100 * 2 * _recChannels;
-  _recordBufferUsed = 0;
-  _recBuffer = new int8_t[_recordBufferSize];
-
-  // Enable overflow callback
-  LATE(pa_stream_set_overflow_callback)
-  (_recStream, PaStreamOverflowCallback, this);
-
-  // Set the state callback function for the stream
-  LATE(pa_stream_set_state_callback)(_recStream, PaStreamStateCallback, this);
-
-  // Mark recording side as initialized
-  _recIsInitialized = true;
-
-  return 0;
-}
-
-int32_t AudioDeviceLinuxPulse::StartRecording() {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  if (!_recIsInitialized) {
-    return -1;
-  }
-
-  if (_recording) {
-    return 0;
-  }
-
-  // Set state to ensure that the recording starts from the audio thread.
-  _startRec = true;
-
-  // The audio thread will signal when recording has started.
-  _timeEventRec.Set();
-  if (kEventTimeout == _recStartEvent.Wait(10000)) {
-    {
-      rtc::CritScope lock(&_critSect);
-      _startRec = false;
-    }
-    StopRecording();
-    LOG(LS_ERROR) << "failed to activate recording";
-    return -1;
-  }
-
-  {
-    rtc::CritScope lock(&_critSect);
-    if (_recording) {
-      // The recording state is set by the audio thread after recording
-      // has started.
-    } else {
-      LOG(LS_ERROR) << "failed to activate recording";
-      return -1;
-    }
-  }
-
-  return 0;
-}
-
-int32_t AudioDeviceLinuxPulse::StopRecording() {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  rtc::CritScope lock(&_critSect);
-
-  if (!_recIsInitialized) {
-    return 0;
-  }
-
-  if (_recStream == NULL) {
-    return -1;
-  }
-
-  _recIsInitialized = false;
-  _recording = false;
-
-  LOG(LS_VERBOSE) << "stopping recording";
-
-  // Stop Recording
-  PaLock();
-
-  DisableReadCallback();
-  LATE(pa_stream_set_overflow_callback)(_recStream, NULL, NULL);
-
-  // Unset this here so that we don't get a TERMINATED callback
-  LATE(pa_stream_set_state_callback)(_recStream, NULL, NULL);
-
-  if (LATE(pa_stream_get_state)(_recStream) != PA_STREAM_UNCONNECTED) {
-    // Disconnect the stream
-    if (LATE(pa_stream_disconnect)(_recStream) != PA_OK) {
-      LOG(LS_ERROR) << "failed to disconnect rec stream, err="
-                    << LATE(pa_context_errno)(_paContext);
-      PaUnLock();
-      return -1;
-    }
-
-    LOG(LS_VERBOSE) << "disconnected recording";
-  }
-
-  LATE(pa_stream_unref)(_recStream);
-  _recStream = NULL;
-
-  PaUnLock();
-
-  // Provide the recStream to the mixer
-  _mixerManager.SetRecStream(_recStream);
-
-  if (_recBuffer) {
-    delete[] _recBuffer;
-    _recBuffer = NULL;
-  }
-
-  return 0;
-}
-
-bool AudioDeviceLinuxPulse::RecordingIsInitialized() const {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  return (_recIsInitialized);
-}
-
-bool AudioDeviceLinuxPulse::Recording() const {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  return (_recording);
-}
-
-bool AudioDeviceLinuxPulse::PlayoutIsInitialized() const {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  return (_playIsInitialized);
-}
-
-int32_t AudioDeviceLinuxPulse::StartPlayout() {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-
-  if (!_playIsInitialized) {
-    return -1;
-  }
-
-  if (_playing) {
-    return 0;
-  }
-
-  // Set state to ensure that playout starts from the audio thread.
-  {
-    rtc::CritScope lock(&_critSect);
-    _startPlay = true;
-  }
-
-  // Both |_startPlay| and |_playing| needs protction since they are also
-  // accessed on the playout thread.
-
-  // The audio thread will signal when playout has started.
-  _timeEventPlay.Set();
-  if (kEventTimeout == _playStartEvent.Wait(10000)) {
-    {
-      rtc::CritScope lock(&_critSect);
-      _startPlay = false;
-    }
-    StopPlayout();
-    LOG(LS_ERROR) << "failed to activate playout";
-    return -1;
-  }
-
-  {
-    rtc::CritScope lock(&_critSect);
-    if (_playing) {
-      // The playing state is set by the audio thread after playout
-      // has started.
-    } else {
-      LOG(LS_ERROR) << "failed to activate playing";
-      return -1;
-    }
-  }
-
-  return 0;
-}
-
-int32_t AudioDeviceLinuxPulse::StopPlayout() {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  rtc::CritScope lock(&_critSect);
-
-  if (!_playIsInitialized) {
-    return 0;
-  }
-
-  if (_playStream == NULL) {
-    return -1;
-  }
-
-  _playIsInitialized = false;
-  _playing = false;
-  _sndCardPlayDelay = 0;
-  _sndCardRecDelay = 0;
-
-  LOG(LS_VERBOSE) << "stopping playback";
-
-  // Stop Playout
-  PaLock();
-
-  DisableWriteCallback();
-  LATE(pa_stream_set_underflow_callback)(_playStream, NULL, NULL);
-
-  // Unset this here so that we don't get a TERMINATED callback
-  LATE(pa_stream_set_state_callback)(_playStream, NULL, NULL);
-
-  if (LATE(pa_stream_get_state)(_playStream) != PA_STREAM_UNCONNECTED) {
-    // Disconnect the stream
-    if (LATE(pa_stream_disconnect)(_playStream) != PA_OK) {
-      LOG(LS_ERROR) << "failed to disconnect play stream, err="
-                    << LATE(pa_context_errno)(_paContext);
-      PaUnLock();
-      return -1;
-    }
-
-    LOG(LS_VERBOSE) << "disconnected playback";
-  }
-
-  LATE(pa_stream_unref)(_playStream);
-  _playStream = NULL;
-
-  PaUnLock();
-
-  // Provide the playStream to the mixer
-  _mixerManager.SetPlayStream(_playStream);
-
-  if (_playBuffer) {
-    delete[] _playBuffer;
-    _playBuffer = NULL;
-  }
-
-  return 0;
-}
-
-int32_t AudioDeviceLinuxPulse::PlayoutDelay(uint16_t& delayMS) const {
-  rtc::CritScope lock(&_critSect);
-  delayMS = (uint16_t)_sndCardPlayDelay;
-  return 0;
-}
-
-int32_t AudioDeviceLinuxPulse::RecordingDelay(uint16_t& delayMS) const {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  delayMS = (uint16_t)_sndCardRecDelay;
-  return 0;
-}
-
-bool AudioDeviceLinuxPulse::Playing() const {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  return (_playing);
-}
-
-bool AudioDeviceLinuxPulse::PlayoutWarning() const {
-  rtc::CritScope lock(&_critSect);
-  return (_playWarning > 0);
-}
-
-bool AudioDeviceLinuxPulse::PlayoutError() const {
-  rtc::CritScope lock(&_critSect);
-  return (_playError > 0);
-}
-
-bool AudioDeviceLinuxPulse::RecordingWarning() const {
-  rtc::CritScope lock(&_critSect);
-  return (_recWarning > 0);
-}
-
-bool AudioDeviceLinuxPulse::RecordingError() const {
-  rtc::CritScope lock(&_critSect);
-  return (_recError > 0);
-}
-
-void AudioDeviceLinuxPulse::ClearPlayoutWarning() {
-  rtc::CritScope lock(&_critSect);
-  _playWarning = 0;
-}
-
-void AudioDeviceLinuxPulse::ClearPlayoutError() {
-  rtc::CritScope lock(&_critSect);
-  _playError = 0;
-}
-
-void AudioDeviceLinuxPulse::ClearRecordingWarning() {
-  rtc::CritScope lock(&_critSect);
-  _recWarning = 0;
-}
-
-void AudioDeviceLinuxPulse::ClearRecordingError() {
-  rtc::CritScope lock(&_critSect);
-  _recError = 0;
-}
-
-// ============================================================================
-//                                 Private Methods
-// ============================================================================
-
-void AudioDeviceLinuxPulse::PaContextStateCallback(pa_context* c, void* pThis) {
-  static_cast<AudioDeviceLinuxPulse*>(pThis)->PaContextStateCallbackHandler(c);
-}
-
-// ----------------------------------------------------------------------------
-//  PaSinkInfoCallback
-// ----------------------------------------------------------------------------
-
-void AudioDeviceLinuxPulse::PaSinkInfoCallback(pa_context* /*c*/,
-                                               const pa_sink_info* i,
-                                               int eol,
-                                               void* pThis) {
-  static_cast<AudioDeviceLinuxPulse*>(pThis)->PaSinkInfoCallbackHandler(i, eol);
-}
-
-void AudioDeviceLinuxPulse::PaSourceInfoCallback(pa_context* /*c*/,
-                                                 const pa_source_info* i,
-                                                 int eol,
-                                                 void* pThis) {
-  static_cast<AudioDeviceLinuxPulse*>(pThis)->PaSourceInfoCallbackHandler(i,
-                                                                          eol);
-}
-
-void AudioDeviceLinuxPulse::PaServerInfoCallback(pa_context* /*c*/,
-                                                 const pa_server_info* i,
-                                                 void* pThis) {
-  static_cast<AudioDeviceLinuxPulse*>(pThis)->PaServerInfoCallbackHandler(i);
-}
-
-void AudioDeviceLinuxPulse::PaStreamStateCallback(pa_stream* p, void* pThis) {
-  static_cast<AudioDeviceLinuxPulse*>(pThis)->PaStreamStateCallbackHandler(p);
-}
-
-void AudioDeviceLinuxPulse::PaContextStateCallbackHandler(pa_context* c) {
-  LOG(LS_VERBOSE) << "context state cb";
-
-  pa_context_state_t state = LATE(pa_context_get_state)(c);
-  switch (state) {
-    case PA_CONTEXT_UNCONNECTED:
-      LOG(LS_VERBOSE) << "unconnected";
-      break;
-    case PA_CONTEXT_CONNECTING:
-    case PA_CONTEXT_AUTHORIZING:
-    case PA_CONTEXT_SETTING_NAME:
-      LOG(LS_VERBOSE) << "no state";
-      break;
-    case PA_CONTEXT_FAILED:
-    case PA_CONTEXT_TERMINATED:
-      LOG(LS_VERBOSE) << "failed";
-      _paStateChanged = true;
-      LATE(pa_threaded_mainloop_signal)(_paMainloop, 0);
-      break;
-    case PA_CONTEXT_READY:
-      LOG(LS_VERBOSE) << "ready";
-      _paStateChanged = true;
-      LATE(pa_threaded_mainloop_signal)(_paMainloop, 0);
-      break;
-  }
-}
-
-void AudioDeviceLinuxPulse::PaSinkInfoCallbackHandler(const pa_sink_info* i,
-                                                      int eol) {
-  if (eol) {
-    // Signal that we are done
-    LATE(pa_threaded_mainloop_signal)(_paMainloop, 0);
-    return;
-  }
-
-  if (_numPlayDevices == _deviceIndex) {
-    // Convert the device index to the one of the sink
-    _paDeviceIndex = i->index;
-
-    if (_playDeviceName) {
-      // Copy the sink name
-      strncpy(_playDeviceName, i->name, kAdmMaxDeviceNameSize);
-      _playDeviceName[kAdmMaxDeviceNameSize - 1] = '\0';
-    }
-    if (_playDisplayDeviceName) {
-      // Copy the sink display name
-      strncpy(_playDisplayDeviceName, i->description, kAdmMaxDeviceNameSize);
-      _playDisplayDeviceName[kAdmMaxDeviceNameSize - 1] = '\0';
-    }
-  }
-
-  _numPlayDevices++;
-}
-
-void AudioDeviceLinuxPulse::PaSourceInfoCallbackHandler(const pa_source_info* i,
-                                                        int eol) {
-  if (eol) {
-    // Signal that we are done
-    LATE(pa_threaded_mainloop_signal)(_paMainloop, 0);
-    return;
-  }
-
-  // We don't want to list output devices
-  if (i->monitor_of_sink == PA_INVALID_INDEX) {
-    if (_numRecDevices == _deviceIndex) {
-      // Convert the device index to the one of the source
-      _paDeviceIndex = i->index;
-
-      if (_recDeviceName) {
-        // copy the source name
-        strncpy(_recDeviceName, i->name, kAdmMaxDeviceNameSize);
-        _recDeviceName[kAdmMaxDeviceNameSize - 1] = '\0';
-      }
-      if (_recDisplayDeviceName) {
-        // Copy the source display name
-        strncpy(_recDisplayDeviceName, i->description, kAdmMaxDeviceNameSize);
-        _recDisplayDeviceName[kAdmMaxDeviceNameSize - 1] = '\0';
-      }
-    }
-
-    _numRecDevices++;
-  }
-}
-
-void AudioDeviceLinuxPulse::PaServerInfoCallbackHandler(
-    const pa_server_info* i) {
-  // Use PA native sampling rate
-  sample_rate_hz_ = i->sample_spec.rate;
-
-  // Copy the PA server version
-  strncpy(_paServerVersion, i->server_version, 31);
-  _paServerVersion[31] = '\0';
-
-  if (_recDisplayDeviceName) {
-    // Copy the source name
-    strncpy(_recDisplayDeviceName, i->default_source_name,
-            kAdmMaxDeviceNameSize);
-    _recDisplayDeviceName[kAdmMaxDeviceNameSize - 1] = '\0';
-  }
-
-  if (_playDisplayDeviceName) {
-    // Copy the sink name
-    strncpy(_playDisplayDeviceName, i->default_sink_name,
-            kAdmMaxDeviceNameSize);
-    _playDisplayDeviceName[kAdmMaxDeviceNameSize - 1] = '\0';
-  }
-
-  LATE(pa_threaded_mainloop_signal)(_paMainloop, 0);
-}
-
-void AudioDeviceLinuxPulse::PaStreamStateCallbackHandler(pa_stream* p) {
-  LOG(LS_VERBOSE) << "stream state cb";
-
-  pa_stream_state_t state = LATE(pa_stream_get_state)(p);
-  switch (state) {
-    case PA_STREAM_UNCONNECTED:
-      LOG(LS_VERBOSE) << "unconnected";
-      break;
-    case PA_STREAM_CREATING:
-      LOG(LS_VERBOSE) << "creating";
-      break;
-    case PA_STREAM_FAILED:
-    case PA_STREAM_TERMINATED:
-      LOG(LS_VERBOSE) << "failed";
-      break;
-    case PA_STREAM_READY:
-      LOG(LS_VERBOSE) << "ready";
-      break;
-  }
-
-  LATE(pa_threaded_mainloop_signal)(_paMainloop, 0);
-}
-
-int32_t AudioDeviceLinuxPulse::CheckPulseAudioVersion() {
-  PaLock();
-
-  pa_operation* paOperation = NULL;
-
-  // get the server info and update deviceName
-  paOperation =
-      LATE(pa_context_get_server_info)(_paContext, PaServerInfoCallback, this);
-
-  WaitForOperationCompletion(paOperation);
-
-  PaUnLock();
-
-  LOG(LS_VERBOSE) << "checking PulseAudio version: " << _paServerVersion;
-
-  return 0;
-}
-
-int32_t AudioDeviceLinuxPulse::InitSamplingFrequency() {
-  PaLock();
-
-  pa_operation* paOperation = NULL;
-
-  // Get the server info and update sample_rate_hz_
-  paOperation =
-      LATE(pa_context_get_server_info)(_paContext, PaServerInfoCallback, this);
-
-  WaitForOperationCompletion(paOperation);
-
-  PaUnLock();
-
-  return 0;
-}
-
-int32_t AudioDeviceLinuxPulse::GetDefaultDeviceInfo(bool recDevice,
-                                                    char* name,
-                                                    uint16_t& index) {
-  char tmpName[kAdmMaxDeviceNameSize] = {0};
-  // subtract length of "default: "
-  uint16_t nameLen = kAdmMaxDeviceNameSize - 9;
-  char* pName = NULL;
-
-  if (name) {
-    // Add "default: "
-    strcpy(name, "default: ");
-    pName = &name[9];
-  }
-
-  // Tell the callback that we want
-  // the name for this device
-  if (recDevice) {
-    _recDisplayDeviceName = tmpName;
-  } else {
-    _playDisplayDeviceName = tmpName;
-  }
-
-  // Set members
-  _paDeviceIndex = -1;
-  _deviceIndex = 0;
-  _numPlayDevices = 0;
-  _numRecDevices = 0;
-
-  PaLock();
-
-  pa_operation* paOperation = NULL;
-
-  // Get the server info and update deviceName
-  paOperation =
-      LATE(pa_context_get_server_info)(_paContext, PaServerInfoCallback, this);
-
-  WaitForOperationCompletion(paOperation);
-
-  // Get the device index
-  if (recDevice) {
-    paOperation = LATE(pa_context_get_source_info_by_name)(
-        _paContext, (char*)tmpName, PaSourceInfoCallback, this);
-  } else {
-    paOperation = LATE(pa_context_get_sink_info_by_name)(
-        _paContext, (char*)tmpName, PaSinkInfoCallback, this);
-  }
-
-  WaitForOperationCompletion(paOperation);
-
-  PaUnLock();
-
-  // Set the index
-  index = _paDeviceIndex;
-
-  if (name) {
-    // Copy to name string
-    strncpy(pName, tmpName, nameLen);
-  }
-
-  // Clear members
-  _playDisplayDeviceName = NULL;
-  _recDisplayDeviceName = NULL;
-  _paDeviceIndex = -1;
-  _deviceIndex = -1;
-  _numPlayDevices = 0;
-  _numRecDevices = 0;
-
-  return 0;
-}
-
-int32_t AudioDeviceLinuxPulse::InitPulseAudio() {
-  int retVal = 0;
-
-  // Load libpulse
-  if (!PaSymbolTable.Load()) {
-    // Most likely the Pulse library and sound server are not installed on
-    // this system
-    LOG(LS_ERROR) << "failed to load symbol table";
-    return -1;
-  }
-
-  // Create a mainloop API and connection to the default server
-  // the mainloop is the internal asynchronous API event loop
-  if (_paMainloop) {
-    LOG(LS_ERROR) << "PA mainloop has already existed";
-    return -1;
-  }
-  _paMainloop = LATE(pa_threaded_mainloop_new)();
-  if (!_paMainloop) {
-    LOG(LS_ERROR) << "could not create mainloop";
-    return -1;
-  }
-
-  // Start the threaded main loop
-  retVal = LATE(pa_threaded_mainloop_start)(_paMainloop);
-  if (retVal != PA_OK) {
-    LOG(LS_ERROR) << "failed to start main loop, error=" << retVal;
-    return -1;
-  }
-
-  LOG(LS_VERBOSE) << "mainloop running!";
-
-  PaLock();
-
-  _paMainloopApi = LATE(pa_threaded_mainloop_get_api)(_paMainloop);
-  if (!_paMainloopApi) {
-    LOG(LS_ERROR) << "could not create mainloop API";
-    PaUnLock();
-    return -1;
-  }
-
-  // Create a new PulseAudio context
-  if (_paContext) {
-    LOG(LS_ERROR) << "PA context has already existed";
-    PaUnLock();
-    return -1;
-  }
-  _paContext = LATE(pa_context_new)(_paMainloopApi, "WEBRTC VoiceEngine");
-
-  if (!_paContext) {
-    LOG(LS_ERROR) << "could not create context";
-    PaUnLock();
-    return -1;
-  }
-
-  // Set state callback function
-  LATE(pa_context_set_state_callback)(_paContext, PaContextStateCallback, this);
-
-  // Connect the context to a server (default)
-  _paStateChanged = false;
-  retVal =
-      LATE(pa_context_connect)(_paContext, NULL, PA_CONTEXT_NOAUTOSPAWN, NULL);
-
-  if (retVal != PA_OK) {
-    LOG(LS_ERROR) << "failed to connect context, error=" << retVal;
-    PaUnLock();
-    return -1;
-  }
-
-  // Wait for state change
-  while (!_paStateChanged) {
-    LATE(pa_threaded_mainloop_wait)(_paMainloop);
-  }
-
-  // Now check to see what final state we reached.
-  pa_context_state_t state = LATE(pa_context_get_state)(_paContext);
-
-  if (state != PA_CONTEXT_READY) {
-    if (state == PA_CONTEXT_FAILED) {
-      LOG(LS_ERROR) << "failed to connect to PulseAudio sound server";
-    } else if (state == PA_CONTEXT_TERMINATED) {
-      LOG(LS_ERROR) << "PulseAudio connection terminated early";
-    } else {
-      // Shouldn't happen, because we only signal on one of those three
-      // states
-      LOG(LS_ERROR) << "unknown problem connecting to PulseAudio";
-    }
-    PaUnLock();
-    return -1;
-  }
-
-  PaUnLock();
-
-  // Give the objects to the mixer manager
-  _mixerManager.SetPulseAudioObjects(_paMainloop, _paContext);
-
-  // Check the version
-  if (CheckPulseAudioVersion() < 0) {
-    LOG(LS_ERROR) << "PulseAudio version " << _paServerVersion
-                  << " not supported";
-    return -1;
-  }
-
-  // Initialize sampling frequency
-  if (InitSamplingFrequency() < 0 || sample_rate_hz_ == 0) {
-    LOG(LS_ERROR) << "failed to initialize sampling frequency, set to "
-                  << sample_rate_hz_ << " Hz";
-    return -1;
-  }
-
-  return 0;
-}
-
-int32_t AudioDeviceLinuxPulse::TerminatePulseAudio() {
-  // Do nothing if the instance doesn't exist
-  // likely PaSymbolTable.Load() fails
-  if (!_paMainloop) {
-    return 0;
-  }
-
-  PaLock();
-
-  // Disconnect the context
-  if (_paContext) {
-    LATE(pa_context_disconnect)(_paContext);
-  }
-
-  // Unreference the context
-  if (_paContext) {
-    LATE(pa_context_unref)(_paContext);
-  }
-
-  PaUnLock();
-  _paContext = NULL;
-
-  // Stop the threaded main loop
-  if (_paMainloop) {
-    LATE(pa_threaded_mainloop_stop)(_paMainloop);
-  }
-
-  // Free the mainloop
-  if (_paMainloop) {
-    LATE(pa_threaded_mainloop_free)(_paMainloop);
-  }
-
-  _paMainloop = NULL;
-
-  LOG(LS_VERBOSE) << "PulseAudio terminated";
-
-  return 0;
-}
-
-void AudioDeviceLinuxPulse::PaLock() {
-  LATE(pa_threaded_mainloop_lock)(_paMainloop);
-}
-
-void AudioDeviceLinuxPulse::PaUnLock() {
-  LATE(pa_threaded_mainloop_unlock)(_paMainloop);
-}
-
-void AudioDeviceLinuxPulse::WaitForOperationCompletion(
-    pa_operation* paOperation) const {
-  if (!paOperation) {
-    LOG(LS_ERROR) << "paOperation NULL in WaitForOperationCompletion";
-    return;
-  }
-
-  while (LATE(pa_operation_get_state)(paOperation) == PA_OPERATION_RUNNING) {
-    LATE(pa_threaded_mainloop_wait)(_paMainloop);
-  }
-
-  LATE(pa_operation_unref)(paOperation);
-}
-
-// ============================================================================
-//                                  Thread Methods
-// ============================================================================
-
-void AudioDeviceLinuxPulse::EnableWriteCallback() {
-  if (LATE(pa_stream_get_state)(_playStream) == PA_STREAM_READY) {
-    // May already have available space. Must check.
-    _tempBufferSpace = LATE(pa_stream_writable_size)(_playStream);
-    if (_tempBufferSpace > 0) {
-      // Yup, there is already space available, so if we register a
-      // write callback then it will not receive any event. So dispatch
-      // one ourself instead.
-      _timeEventPlay.Set();
-      return;
-    }
-  }
-
-  LATE(pa_stream_set_write_callback)(_playStream, &PaStreamWriteCallback, this);
-}
-
-void AudioDeviceLinuxPulse::DisableWriteCallback() {
-  LATE(pa_stream_set_write_callback)(_playStream, NULL, NULL);
-}
-
-void AudioDeviceLinuxPulse::PaStreamWriteCallback(pa_stream* /*unused*/,
-                                                  size_t buffer_space,
-                                                  void* pThis) {
-  static_cast<AudioDeviceLinuxPulse*>(pThis)->PaStreamWriteCallbackHandler(
-      buffer_space);
-}
-
-void AudioDeviceLinuxPulse::PaStreamWriteCallbackHandler(size_t bufferSpace) {
-  _tempBufferSpace = bufferSpace;
-
-  // Since we write the data asynchronously on a different thread, we have
-  // to temporarily disable the write callback or else Pulse will call it
-  // continuously until we write the data. We re-enable it below.
-  DisableWriteCallback();
-  _timeEventPlay.Set();
-}
-
-void AudioDeviceLinuxPulse::PaStreamUnderflowCallback(pa_stream* /*unused*/,
-                                                      void* pThis) {
-  static_cast<AudioDeviceLinuxPulse*>(pThis)
-      ->PaStreamUnderflowCallbackHandler();
-}
-
-void AudioDeviceLinuxPulse::PaStreamUnderflowCallbackHandler() {
-  LOG(LS_WARNING) << "Playout underflow";
-
-  if (_configuredLatencyPlay == WEBRTC_PA_NO_LATENCY_REQUIREMENTS) {
-    // We didn't configure a pa_buffer_attr before, so switching to
-    // one now would be questionable.
-    return;
-  }
-
-  // Otherwise reconfigure the stream with a higher target latency.
-
-  const pa_sample_spec* spec = LATE(pa_stream_get_sample_spec)(_playStream);
-  if (!spec) {
-    LOG(LS_ERROR) << "pa_stream_get_sample_spec()";
-    return;
-  }
-
-  size_t bytesPerSec = LATE(pa_bytes_per_second)(spec);
-  uint32_t newLatency =
-      _configuredLatencyPlay + bytesPerSec *
-                                   WEBRTC_PA_PLAYBACK_LATENCY_INCREMENT_MSECS /
-                                   WEBRTC_PA_MSECS_PER_SEC;
-
-  // Set the play buffer attributes
-  _playBufferAttr.maxlength = newLatency;
-  _playBufferAttr.tlength = newLatency;
-  _playBufferAttr.minreq = newLatency / WEBRTC_PA_PLAYBACK_REQUEST_FACTOR;
-  _playBufferAttr.prebuf = _playBufferAttr.tlength - _playBufferAttr.minreq;
-
-  pa_operation* op = LATE(pa_stream_set_buffer_attr)(
-      _playStream, &_playBufferAttr, NULL, NULL);
-  if (!op) {
-    LOG(LS_ERROR) << "pa_stream_set_buffer_attr()";
-    return;
-  }
-
-  // Don't need to wait for this to complete.
-  LATE(pa_operation_unref)(op);
-
-  // Save the new latency in case we underflow again.
-  _configuredLatencyPlay = newLatency;
-}
-
-void AudioDeviceLinuxPulse::EnableReadCallback() {
-  LATE(pa_stream_set_read_callback)(_recStream, &PaStreamReadCallback, this);
-}
-
-void AudioDeviceLinuxPulse::DisableReadCallback() {
-  LATE(pa_stream_set_read_callback)(_recStream, NULL, NULL);
-}
-
-void AudioDeviceLinuxPulse::PaStreamReadCallback(pa_stream* /*unused1*/,
-                                                 size_t /*unused2*/,
-                                                 void* pThis) {
-  static_cast<AudioDeviceLinuxPulse*>(pThis)->PaStreamReadCallbackHandler();
-}
-
-void AudioDeviceLinuxPulse::PaStreamReadCallbackHandler() {
-  // We get the data pointer and size now in order to save one Lock/Unlock
-  // in the worker thread.
-  if (LATE(pa_stream_peek)(_recStream, &_tempSampleData,
-                           &_tempSampleDataSize) != 0) {
-    LOG(LS_ERROR) << "Can't read data!";
-    return;
-  }
-
-  // Since we consume the data asynchronously on a different thread, we have
-  // to temporarily disable the read callback or else Pulse will call it
-  // continuously until we consume the data. We re-enable it below.
-  DisableReadCallback();
-  _timeEventRec.Set();
-}
-
-void AudioDeviceLinuxPulse::PaStreamOverflowCallback(pa_stream* /*unused*/,
-                                                     void* pThis) {
-  static_cast<AudioDeviceLinuxPulse*>(pThis)->PaStreamOverflowCallbackHandler();
-}
-
-void AudioDeviceLinuxPulse::PaStreamOverflowCallbackHandler() {
-  LOG(LS_WARNING) << "Recording overflow";
-}
-
-int32_t AudioDeviceLinuxPulse::LatencyUsecs(pa_stream* stream) {
-  if (!WEBRTC_PA_REPORT_LATENCY) {
-    return 0;
-  }
-
-  if (!stream) {
-    return 0;
-  }
-
-  pa_usec_t latency;
-  int negative;
-  if (LATE(pa_stream_get_latency)(stream, &latency, &negative) != 0) {
-    LOG(LS_ERROR) << "Can't query latency";
-    // We'd rather continue playout/capture with an incorrect delay than
-    // stop it altogether, so return a valid value.
-    return 0;
-  }
-
-  if (negative) {
-    LOG(LS_VERBOSE) << "warning: pa_stream_get_latency reported negative delay";
-
-    // The delay can be negative for monitoring streams if the captured
-    // samples haven't been played yet. In such a case, "latency"
-    // contains the magnitude, so we must negate it to get the real value.
-    int32_t tmpLatency = (int32_t)-latency;
-    if (tmpLatency < 0) {
-      // Make sure that we don't use a negative delay.
-      tmpLatency = 0;
-    }
-
-    return tmpLatency;
-  } else {
-    return (int32_t)latency;
-  }
-}
-
-int32_t AudioDeviceLinuxPulse::ReadRecordedData(const void* bufferData,
-                                                size_t bufferSize)
-    RTC_EXCLUSIVE_LOCKS_REQUIRED(_critSect) {
-  size_t size = bufferSize;
-  uint32_t numRecSamples = _recordBufferSize / (2 * _recChannels);
-
-  // Account for the peeked data and the used data.
-  uint32_t recDelay =
-      (uint32_t)((LatencyUsecs(_recStream) / 1000) +
-                 10 * ((size + _recordBufferUsed) / _recordBufferSize));
-
-  _sndCardRecDelay = recDelay;
-
-  if (_playStream) {
-    // Get the playout delay.
-    _sndCardPlayDelay = (uint32_t)(LatencyUsecs(_playStream) / 1000);
-  }
-
-  if (_recordBufferUsed > 0) {
-    // Have to copy to the buffer until it is full.
-    size_t copy = _recordBufferSize - _recordBufferUsed;
-    if (size < copy) {
-      copy = size;
-    }
-
-    memcpy(&_recBuffer[_recordBufferUsed], bufferData, copy);
-    _recordBufferUsed += copy;
-    bufferData = static_cast<const char*>(bufferData) + copy;
-    size -= copy;
-
-    if (_recordBufferUsed != _recordBufferSize) {
-      // Not enough data yet to pass to VoE.
-      return 0;
-    }
-
-    // Provide data to VoiceEngine.
-    if (ProcessRecordedData(_recBuffer, numRecSamples, recDelay) == -1) {
-      // We have stopped recording.
-      return -1;
-    }
-
-    _recordBufferUsed = 0;
-  }
-
-  // Now process full 10ms sample sets directly from the input.
-  while (size >= _recordBufferSize) {
-    // Provide data to VoiceEngine.
-    if (ProcessRecordedData(static_cast<int8_t*>(const_cast<void*>(bufferData)),
-                            numRecSamples, recDelay) == -1) {
-      // We have stopped recording.
-      return -1;
-    }
-
-    bufferData = static_cast<const char*>(bufferData) + _recordBufferSize;
-    size -= _recordBufferSize;
-
-    // We have consumed 10ms of data.
-    recDelay -= 10;
-  }
-
-  // Now save any leftovers for later.
-  if (size > 0) {
-    memcpy(_recBuffer, bufferData, size);
-    _recordBufferUsed = size;
-  }
-
-  return 0;
-}
-
-int32_t AudioDeviceLinuxPulse::ProcessRecordedData(int8_t* bufferData,
-                                                   uint32_t bufferSizeInSamples,
-                                                   uint32_t recDelay)
-    RTC_EXCLUSIVE_LOCKS_REQUIRED(_critSect) {
-  uint32_t currentMicLevel(0);
-  uint32_t newMicLevel(0);
-
-  _ptrAudioBuffer->SetRecordedBuffer(bufferData, bufferSizeInSamples);
-
-  if (AGC()) {
-    // Store current mic level in the audio buffer if AGC is enabled
-    if (MicrophoneVolume(currentMicLevel) == 0) {
-      // This call does not affect the actual microphone volume
-      _ptrAudioBuffer->SetCurrentMicLevel(currentMicLevel);
-    }
-  }
-
-  const uint32_t clockDrift(0);
-  // TODO(andrew): this is a temporary hack, to avoid non-causal far- and
-  // near-end signals at the AEC for PulseAudio. I think the system delay is
-  // being correctly calculated here, but for legacy reasons we add +10 ms
-  // to the value in the AEC. The real fix will be part of a larger
-  // investigation into managing system delay in the AEC.
-  if (recDelay > 10)
-    recDelay -= 10;
-  else
-    recDelay = 0;
-  _ptrAudioBuffer->SetVQEData(_sndCardPlayDelay, recDelay, clockDrift);
-  _ptrAudioBuffer->SetTypingStatus(KeyPressed());
-  // Deliver recorded samples at specified sample rate,
-  // mic level etc. to the observer using callback.
-  UnLock();
-  _ptrAudioBuffer->DeliverRecordedData();
-  Lock();
-
-  // We have been unlocked - check the flag again.
-  if (!_recording) {
-    return -1;
-  }
-
-  if (AGC()) {
-    newMicLevel = _ptrAudioBuffer->NewMicLevel();
-    if (newMicLevel != 0) {
-      // The VQE will only deliver non-zero microphone levels when a
-      // change is needed.
-      // Set this new mic level (received from the observer as return
-      // value in the callback).
-      LOG(LS_VERBOSE) << "AGC change of volume: old=" << currentMicLevel
-                      << " => new=" << newMicLevel;
-      if (SetMicrophoneVolume(newMicLevel) == -1) {
-        LOG(LS_WARNING)
-            << "the required modification of the microphone volume failed";
-      }
-    }
-  }
-
-  return 0;
-}
-
-bool AudioDeviceLinuxPulse::PlayThreadFunc(void* pThis) {
-  return (static_cast<AudioDeviceLinuxPulse*>(pThis)->PlayThreadProcess());
-}
-
-bool AudioDeviceLinuxPulse::RecThreadFunc(void* pThis) {
-  return (static_cast<AudioDeviceLinuxPulse*>(pThis)->RecThreadProcess());
-}
-
-bool AudioDeviceLinuxPulse::PlayThreadProcess() {
-  switch (_timeEventPlay.Wait(1000)) {
-    case kEventSignaled:
-      break;
-    case kEventError:
-      LOG(LS_WARNING) << "EventWrapper::Wait() failed";
-      return true;
-    case kEventTimeout:
-      return true;
-  }
-
-  rtc::CritScope lock(&_critSect);
-
-  if (_startPlay) {
-    LOG(LS_VERBOSE) << "_startPlay true, performing initial actions";
-
-    _startPlay = false;
-    _playDeviceName = NULL;
-
-    // Set if not default device
-    if (_outputDeviceIndex > 0) {
-      // Get the playout device name
-      _playDeviceName = new char[kAdmMaxDeviceNameSize];
-      _deviceIndex = _outputDeviceIndex;
-      PlayoutDevices();
-    }
-
-    // Start muted only supported on 0.9.11 and up
-    if (LATE(pa_context_get_protocol_version)(_paContext) >=
-        WEBRTC_PA_ADJUST_LATENCY_PROTOCOL_VERSION) {
-      // Get the currently saved speaker mute status
-      // and set the initial mute status accordingly
-      bool enabled(false);
-      _mixerManager.SpeakerMute(enabled);
-      if (enabled) {
-        _playStreamFlags |= PA_STREAM_START_MUTED;
-      }
-    }
-
-    // Get the currently saved speaker volume
-    uint32_t volume = 0;
-    if (update_speaker_volume_at_startup_)
-      _mixerManager.SpeakerVolume(volume);
-
-    PaLock();
-
-    // NULL gives PA the choice of startup volume.
-    pa_cvolume* ptr_cvolume = NULL;
-    if (update_speaker_volume_at_startup_) {
-      pa_cvolume cVolumes;
-      ptr_cvolume = &cVolumes;
-
-      // Set the same volume for all channels
-      const pa_sample_spec* spec = LATE(pa_stream_get_sample_spec)(_playStream);
-      LATE(pa_cvolume_set)(&cVolumes, spec->channels, volume);
-      update_speaker_volume_at_startup_ = false;
-    }
-
-    // Connect the stream to a sink
-    if (LATE(pa_stream_connect_playback)(
-            _playStream, _playDeviceName, &_playBufferAttr,
-            (pa_stream_flags_t)_playStreamFlags, ptr_cvolume, NULL) != PA_OK) {
-      LOG(LS_ERROR) << "failed to connect play stream, err="
-                    << LATE(pa_context_errno)(_paContext);
-    }
-
-    LOG(LS_VERBOSE) << "play stream connected";
-
-    // Wait for state change
-    while (LATE(pa_stream_get_state)(_playStream) != PA_STREAM_READY) {
-      LATE(pa_threaded_mainloop_wait)(_paMainloop);
-    }
-
-    LOG(LS_VERBOSE) << "play stream ready";
-
-    // We can now handle write callbacks
-    EnableWriteCallback();
-
-    PaUnLock();
-
-    // Clear device name
-    if (_playDeviceName) {
-      delete[] _playDeviceName;
-      _playDeviceName = NULL;
-    }
-
-    _playing = true;
-    _playStartEvent.Set();
-
-    return true;
-  }
-
-  if (_playing) {
-    if (!_recording) {
-      // Update the playout delay
-      _sndCardPlayDelay = (uint32_t)(LatencyUsecs(_playStream) / 1000);
-    }
-
-    if (_playbackBufferUnused < _playbackBufferSize) {
-      size_t write = _playbackBufferSize - _playbackBufferUnused;
-      if (_tempBufferSpace < write) {
-        write = _tempBufferSpace;
-      }
-
-      PaLock();
-      if (LATE(pa_stream_write)(
-              _playStream, (void*)&_playBuffer[_playbackBufferUnused], write,
-              NULL, (int64_t)0, PA_SEEK_RELATIVE) != PA_OK) {
-        _writeErrors++;
-        if (_writeErrors > 10) {
-          if (_playError == 1) {
-            LOG(LS_WARNING) << "pending playout error exists";
-          }
-          // Triggers callback from module process thread.
-          _playError = 1;
-          LOG(LS_ERROR) << "kPlayoutError message posted: _writeErrors="
-                        << _writeErrors
-                        << ", error=" << LATE(pa_context_errno)(_paContext);
-          _writeErrors = 0;
-        }
-      }
-      PaUnLock();
-
-      _playbackBufferUnused += write;
-      _tempBufferSpace -= write;
-    }
-
-    uint32_t numPlaySamples = _playbackBufferSize / (2 * _playChannels);
-    // Might have been reduced to zero by the above.
-    if (_tempBufferSpace > 0) {
-      // Ask for new PCM data to be played out using the
-      // AudioDeviceBuffer ensure that this callback is executed
-      // without taking the audio-thread lock.
-      UnLock();
-      LOG(LS_VERBOSE) << "requesting data";
-      uint32_t nSamples = _ptrAudioBuffer->RequestPlayoutData(numPlaySamples);
-      Lock();
-
-      // We have been unlocked - check the flag again.
-      if (!_playing) {
-        return true;
-      }
-
-      nSamples = _ptrAudioBuffer->GetPlayoutData(_playBuffer);
-      if (nSamples != numPlaySamples) {
-        LOG(LS_ERROR) << "invalid number of output samples(" << nSamples << ")";
-      }
-
-      size_t write = _playbackBufferSize;
-      if (_tempBufferSpace < write) {
-        write = _tempBufferSpace;
-      }
-
-      LOG(LS_VERBOSE) << "will write";
-      PaLock();
-      if (LATE(pa_stream_write)(_playStream, (void*)&_playBuffer[0], write,
-                                NULL, (int64_t)0, PA_SEEK_RELATIVE) != PA_OK) {
-        _writeErrors++;
-        if (_writeErrors > 10) {
-          if (_playError == 1) {
-            LOG(LS_WARNING) << "pending playout error exists";
-          }
-          // Triggers callback from module process thread.
-          _playError = 1;
-          LOG(LS_ERROR) << "kPlayoutError message posted: _writeErrors="
-                        << _writeErrors
-                        << ", error=" << LATE(pa_context_errno)(_paContext);
-          _writeErrors = 0;
-        }
-      }
-      PaUnLock();
-
-      _playbackBufferUnused = write;
-    }
-
-    _tempBufferSpace = 0;
-    PaLock();
-    EnableWriteCallback();
-    PaUnLock();
-
-  }  // _playing
-
-  return true;
-}
-
-bool AudioDeviceLinuxPulse::RecThreadProcess() {
-  switch (_timeEventRec.Wait(1000)) {
-    case kEventSignaled:
-      break;
-    case kEventError:
-      LOG(LS_WARNING) << "EventWrapper::Wait() failed";
-      return true;
-    case kEventTimeout:
-      return true;
-  }
-
-  rtc::CritScope lock(&_critSect);
-
-  if (_startRec) {
-    LOG(LS_VERBOSE) << "_startRec true, performing initial actions";
-
-    _recDeviceName = NULL;
-
-    // Set if not default device
-    if (_inputDeviceIndex > 0) {
-      // Get the recording device name
-      _recDeviceName = new char[kAdmMaxDeviceNameSize];
-      _deviceIndex = _inputDeviceIndex;
-      RecordingDevices();
-    }
-
-    PaLock();
-
-    LOG(LS_VERBOSE) << "connecting stream";
-
-    // Connect the stream to a source
-    if (LATE(pa_stream_connect_record)(
-            _recStream, _recDeviceName, &_recBufferAttr,
-            (pa_stream_flags_t)_recStreamFlags) != PA_OK) {
-      LOG(LS_ERROR) << "failed to connect rec stream, err="
-                    << LATE(pa_context_errno)(_paContext);
-    }
-
-    LOG(LS_VERBOSE) << "connected";
-
-    // Wait for state change
-    while (LATE(pa_stream_get_state)(_recStream) != PA_STREAM_READY) {
-      LATE(pa_threaded_mainloop_wait)(_paMainloop);
-    }
-
-    LOG(LS_VERBOSE) << "done";
-
-    // We can now handle read callbacks
-    EnableReadCallback();
-
-    PaUnLock();
-
-    // Clear device name
-    if (_recDeviceName) {
-      delete[] _recDeviceName;
-      _recDeviceName = NULL;
-    }
-
-    _startRec = false;
-    _recording = true;
-    _recStartEvent.Set();
-
-    return true;
-  }
-
-  if (_recording) {
-    // Read data and provide it to VoiceEngine
-    if (ReadRecordedData(_tempSampleData, _tempSampleDataSize) == -1) {
-      return true;
-    }
-
-    _tempSampleData = NULL;
-    _tempSampleDataSize = 0;
-
-    PaLock();
-    while (true) {
-      // Ack the last thing we read
-      if (LATE(pa_stream_drop)(_recStream) != 0) {
-        LOG(LS_WARNING) << "failed to drop, err="
-                        << LATE(pa_context_errno)(_paContext);
-      }
-
-      if (LATE(pa_stream_readable_size)(_recStream) <= 0) {
-        // Then that was all the data
-        break;
-      }
-
-      // Else more data.
-      const void* sampleData;
-      size_t sampleDataSize;
-
-      if (LATE(pa_stream_peek)(_recStream, &sampleData, &sampleDataSize) != 0) {
-        _recError = 1;  // triggers callback from module process thread
-        LOG(LS_ERROR) << "RECORD_ERROR message posted, error = "
-                      << LATE(pa_context_errno)(_paContext);
-        break;
-      }
-
-      _sndCardRecDelay = (uint32_t)(LatencyUsecs(_recStream) / 1000);
-
-      // Drop lock for sigslot dispatch, which could take a while.
-      PaUnLock();
-      // Read data and provide it to VoiceEngine
-      if (ReadRecordedData(sampleData, sampleDataSize) == -1) {
-        return true;
-      }
-      PaLock();
-
-      // Return to top of loop for the ack and the check for more data.
-    }
-
-    EnableReadCallback();
-    PaUnLock();
-
-  }  // _recording
-
-  return true;
-}
-
-bool AudioDeviceLinuxPulse::KeyPressed() const {
-  char szKey[32];
-  unsigned int i = 0;
-  char state = 0;
-
-  if (!_XDisplay)
-    return false;
-
-  // Check key map status
-  XQueryKeymap(_XDisplay, szKey);
-
-  // A bit change in keymap means a key is pressed
-  for (i = 0; i < sizeof(szKey); i++)
-    state |= (szKey[i] ^ _oldKeyState[i]) & szKey[i];
-
-  // Save old state
-  memcpy((char*)_oldKeyState, (char*)szKey, sizeof(_oldKeyState));
-  return (state != 0);
-}
-}  // namespace webrtc
diff --git a/modules/audio_device/linux/audio_device_pulse_linux.h b/modules/audio_device/linux/audio_device_pulse_linux.h
deleted file mode 100644
index 6170944..0000000
--- a/modules/audio_device/linux/audio_device_pulse_linux.h
+++ /dev/null
@@ -1,356 +0,0 @@
-/*
- *  Copyright (c) 2012 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_AUDIO_DEVICE_AUDIO_DEVICE_PULSE_LINUX_H
-#define WEBRTC_AUDIO_DEVICE_AUDIO_DEVICE_PULSE_LINUX_H
-
-#include <memory>
-
-#include "webrtc/modules/audio_device/audio_device_generic.h"
-#include "webrtc/modules/audio_device/linux/audio_mixer_manager_pulse_linux.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/platform_thread.h"
-#include "webrtc/rtc_base/thread_checker.h"
-
-#include <X11/Xlib.h>
-#include <pulse/pulseaudio.h>
-
-// We define this flag if it's missing from our headers, because we want to be
-// able to compile against old headers but still use PA_STREAM_ADJUST_LATENCY
-// if run against a recent version of the library.
-#ifndef PA_STREAM_ADJUST_LATENCY
-#define PA_STREAM_ADJUST_LATENCY 0x2000U
-#endif
-#ifndef PA_STREAM_START_MUTED
-#define PA_STREAM_START_MUTED 0x1000U
-#endif
-
-// Set this constant to 0 to disable latency reading
-const uint32_t WEBRTC_PA_REPORT_LATENCY = 1;
-
-// Constants from implementation by Tristan Schmelcher [tschmelcher@google.com]
-
-// First PulseAudio protocol version that supports PA_STREAM_ADJUST_LATENCY.
-const uint32_t WEBRTC_PA_ADJUST_LATENCY_PROTOCOL_VERSION = 13;
-
-// Some timing constants for optimal operation. See
-// https://tango.0pointer.de/pipermail/pulseaudio-discuss/2008-January/001170.html
-// for a good explanation of some of the factors that go into this.
-
-// Playback.
-
-// For playback, there is a round-trip delay to fill the server-side playback
-// buffer, so setting too low of a latency is a buffer underflow risk. We will
-// automatically increase the latency if a buffer underflow does occur, but we
-// also enforce a sane minimum at start-up time. Anything lower would be
-// virtually guaranteed to underflow at least once, so there's no point in
-// allowing lower latencies.
-const uint32_t WEBRTC_PA_PLAYBACK_LATENCY_MINIMUM_MSECS = 20;
-
-// Every time a playback stream underflows, we will reconfigure it with target
-// latency that is greater by this amount.
-const uint32_t WEBRTC_PA_PLAYBACK_LATENCY_INCREMENT_MSECS = 20;
-
-// We also need to configure a suitable request size. Too small and we'd burn
-// CPU from the overhead of transfering small amounts of data at once. Too large
-// and the amount of data remaining in the buffer right before refilling it
-// would be a buffer underflow risk. We set it to half of the buffer size.
-const uint32_t WEBRTC_PA_PLAYBACK_REQUEST_FACTOR = 2;
-
-// Capture.
-
-// For capture, low latency is not a buffer overflow risk, but it makes us burn
-// CPU from the overhead of transfering small amounts of data at once, so we set
-// a recommended value that we use for the kLowLatency constant (but if the user
-// explicitly requests something lower then we will honour it).
-// 1ms takes about 6-7% CPU. 5ms takes about 5%. 10ms takes about 4.x%.
-const uint32_t WEBRTC_PA_LOW_CAPTURE_LATENCY_MSECS = 10;
-
-// There is a round-trip delay to ack the data to the server, so the
-// server-side buffer needs extra space to prevent buffer overflow. 20ms is
-// sufficient, but there is no penalty to making it bigger, so we make it huge.
-// (750ms is libpulse's default value for the _total_ buffer size in the
-// kNoLatencyRequirements case.)
-const uint32_t WEBRTC_PA_CAPTURE_BUFFER_EXTRA_MSECS = 750;
-
-const uint32_t WEBRTC_PA_MSECS_PER_SEC = 1000;
-
-// Init _configuredLatencyRec/Play to this value to disable latency requirements
-const int32_t WEBRTC_PA_NO_LATENCY_REQUIREMENTS = -1;
-
-// Set this const to 1 to account for peeked and used data in latency calculation
-const uint32_t WEBRTC_PA_CAPTURE_BUFFER_LATENCY_ADJUSTMENT = 0;
-
-namespace webrtc
-{
-class EventWrapper;
-
-class AudioDeviceLinuxPulse: public AudioDeviceGeneric
-{
-public:
-    AudioDeviceLinuxPulse();
-    virtual ~AudioDeviceLinuxPulse();
-
-    // Retrieve the currently utilized audio layer
-    int32_t ActiveAudioLayer(
-        AudioDeviceModule::AudioLayer& audioLayer) const override;
-
-    // Main initializaton and termination
-    InitStatus Init() override;
-    int32_t Terminate() override;
-    bool Initialized() const override;
-
-    // Device enumeration
-    int16_t PlayoutDevices() override;
-    int16_t RecordingDevices() override;
-    int32_t PlayoutDeviceName(uint16_t index,
-                              char name[kAdmMaxDeviceNameSize],
-                              char guid[kAdmMaxGuidSize]) override;
-    int32_t RecordingDeviceName(uint16_t index,
-                                char name[kAdmMaxDeviceNameSize],
-                                char guid[kAdmMaxGuidSize]) override;
-
-    // Device selection
-    int32_t SetPlayoutDevice(uint16_t index) override;
-    int32_t SetPlayoutDevice(
-        AudioDeviceModule::WindowsDeviceType device) override;
-    int32_t SetRecordingDevice(uint16_t index) override;
-    int32_t SetRecordingDevice(
-        AudioDeviceModule::WindowsDeviceType device) override;
-
-    // Audio transport initialization
-    int32_t PlayoutIsAvailable(bool& available) override;
-    int32_t InitPlayout() override;
-    bool PlayoutIsInitialized() const override;
-    int32_t RecordingIsAvailable(bool& available) override;
-    int32_t InitRecording() override;
-    bool RecordingIsInitialized() const override;
-
-    // Audio transport control
-    int32_t StartPlayout() override;
-    int32_t StopPlayout() override;
-    bool Playing() const override;
-    int32_t StartRecording() override;
-    int32_t StopRecording() override;
-    bool Recording() const override;
-
-    // Microphone Automatic Gain Control (AGC)
-    int32_t SetAGC(bool enable) override;
-    bool AGC() const override;
-
-    // Audio mixer initialization
-    int32_t InitSpeaker() override;
-    bool SpeakerIsInitialized() const override;
-    int32_t InitMicrophone() override;
-    bool MicrophoneIsInitialized() const override;
-
-    // Speaker volume controls
-    int32_t SpeakerVolumeIsAvailable(bool& available) override;
-    int32_t SetSpeakerVolume(uint32_t volume) override;
-    int32_t SpeakerVolume(uint32_t& volume) const override;
-    int32_t MaxSpeakerVolume(uint32_t& maxVolume) const override;
-    int32_t MinSpeakerVolume(uint32_t& minVolume) const override;
-
-    // Microphone volume controls
-    int32_t MicrophoneVolumeIsAvailable(bool& available) override;
-    int32_t SetMicrophoneVolume(uint32_t volume) override;
-    int32_t MicrophoneVolume(uint32_t& volume) const override;
-    int32_t MaxMicrophoneVolume(uint32_t& maxVolume) const override;
-    int32_t MinMicrophoneVolume(uint32_t& minVolume) const override;
-
-    // Speaker mute control
-    int32_t SpeakerMuteIsAvailable(bool& available) override;
-    int32_t SetSpeakerMute(bool enable) override;
-    int32_t SpeakerMute(bool& enabled) const override;
-
-    // Microphone mute control
-    int32_t MicrophoneMuteIsAvailable(bool& available) override;
-    int32_t SetMicrophoneMute(bool enable) override;
-    int32_t MicrophoneMute(bool& enabled) const override;
-
-    // Stereo support
-    int32_t StereoPlayoutIsAvailable(bool& available) override;
-    int32_t SetStereoPlayout(bool enable) override;
-    int32_t StereoPlayout(bool& enabled) const override;
-    int32_t StereoRecordingIsAvailable(bool& available) override;
-    int32_t SetStereoRecording(bool enable) override;
-    int32_t StereoRecording(bool& enabled) const override;
-
-    // Delay information and control
-    int32_t PlayoutDelay(uint16_t& delayMS) const override;
-    int32_t RecordingDelay(uint16_t& delayMS) const override;
-
-    bool PlayoutWarning() const override;
-    bool PlayoutError() const override;
-    bool RecordingWarning() const override;
-    bool RecordingError() const override;
-    void ClearPlayoutWarning() override;
-    void ClearPlayoutError() override;
-    void ClearRecordingWarning() override;
-    void ClearRecordingError() override;
-
-   void AttachAudioBuffer(AudioDeviceBuffer* audioBuffer) override;
-
-private:
- void Lock() RTC_EXCLUSIVE_LOCK_FUNCTION(_critSect) { _critSect.Enter(); }
- void UnLock() RTC_UNLOCK_FUNCTION(_critSect) { _critSect.Leave(); }
- void WaitForOperationCompletion(pa_operation* paOperation) const;
- void WaitForSuccess(pa_operation* paOperation) const;
-
- bool KeyPressed() const;
-
- static void PaContextStateCallback(pa_context* c, void* pThis);
- static void PaSinkInfoCallback(pa_context* c,
-                                const pa_sink_info* i,
-                                int eol,
-                                void* pThis);
- static void PaSourceInfoCallback(pa_context* c,
-                                  const pa_source_info* i,
-                                  int eol,
-                                  void* pThis);
- static void PaServerInfoCallback(pa_context* c,
-                                  const pa_server_info* i,
-                                  void* pThis);
- static void PaStreamStateCallback(pa_stream* p, void* pThis);
- void PaContextStateCallbackHandler(pa_context* c);
- void PaSinkInfoCallbackHandler(const pa_sink_info* i, int eol);
- void PaSourceInfoCallbackHandler(const pa_source_info* i, int eol);
- void PaServerInfoCallbackHandler(const pa_server_info* i);
- void PaStreamStateCallbackHandler(pa_stream* p);
-
- void EnableWriteCallback();
- void DisableWriteCallback();
- static void PaStreamWriteCallback(pa_stream* unused,
-                                   size_t buffer_space,
-                                   void* pThis);
- void PaStreamWriteCallbackHandler(size_t buffer_space);
- static void PaStreamUnderflowCallback(pa_stream* unused, void* pThis);
- void PaStreamUnderflowCallbackHandler();
- void EnableReadCallback();
- void DisableReadCallback();
- static void PaStreamReadCallback(pa_stream* unused1,
-                                  size_t unused2,
-                                  void* pThis);
- void PaStreamReadCallbackHandler();
- static void PaStreamOverflowCallback(pa_stream* unused, void* pThis);
- void PaStreamOverflowCallbackHandler();
- int32_t LatencyUsecs(pa_stream* stream);
- int32_t ReadRecordedData(const void* bufferData, size_t bufferSize);
- int32_t ProcessRecordedData(int8_t* bufferData,
-                             uint32_t bufferSizeInSamples,
-                             uint32_t recDelay);
-
- int32_t CheckPulseAudioVersion();
- int32_t InitSamplingFrequency();
- int32_t GetDefaultDeviceInfo(bool recDevice, char* name, uint16_t& index);
- int32_t InitPulseAudio();
- int32_t TerminatePulseAudio();
-
- void PaLock();
- void PaUnLock();
-
- static bool RecThreadFunc(void*);
- static bool PlayThreadFunc(void*);
- bool RecThreadProcess();
- bool PlayThreadProcess();
-
- AudioDeviceBuffer* _ptrAudioBuffer;
-
- rtc::CriticalSection _critSect;
- EventWrapper& _timeEventRec;
- EventWrapper& _timeEventPlay;
- EventWrapper& _recStartEvent;
- EventWrapper& _playStartEvent;
-
- // TODO(pbos): Remove unique_ptr and use directly without resetting.
- std::unique_ptr<rtc::PlatformThread> _ptrThreadPlay;
- std::unique_ptr<rtc::PlatformThread> _ptrThreadRec;
-
- AudioMixerManagerLinuxPulse _mixerManager;
-
- uint16_t _inputDeviceIndex;
- uint16_t _outputDeviceIndex;
- bool _inputDeviceIsSpecified;
- bool _outputDeviceIsSpecified;
-
- int sample_rate_hz_;
- uint8_t _recChannels;
- uint8_t _playChannels;
-
- // Stores thread ID in constructor.
- // We can then use ThreadChecker::CalledOnValidThread() to ensure that
- // other methods are called from the same thread.
- // Currently only does RTC_DCHECK(thread_checker_.CalledOnValidThread()).
- rtc::ThreadChecker thread_checker_;
-
- bool _initialized;
- bool _recording;
- bool _playing;
- bool _recIsInitialized;
- bool _playIsInitialized;
- bool _startRec;
- bool _stopRec;
- bool _startPlay;
- bool _stopPlay;
- bool _AGC;
- bool update_speaker_volume_at_startup_;
-
- uint32_t _sndCardPlayDelay;
- uint32_t _sndCardRecDelay;
-
- int32_t _writeErrors;
- uint16_t _playWarning;
- uint16_t _playError;
- uint16_t _recWarning;
- uint16_t _recError;
-
- uint16_t _deviceIndex;
- int16_t _numPlayDevices;
- int16_t _numRecDevices;
- char* _playDeviceName;
- char* _recDeviceName;
- char* _playDisplayDeviceName;
- char* _recDisplayDeviceName;
- char _paServerVersion[32];
-
- int8_t* _playBuffer;
- size_t _playbackBufferSize;
- size_t _playbackBufferUnused;
- size_t _tempBufferSpace;
- int8_t* _recBuffer;
- size_t _recordBufferSize;
- size_t _recordBufferUsed;
- const void* _tempSampleData;
- size_t _tempSampleDataSize;
- int32_t _configuredLatencyPlay;
- int32_t _configuredLatencyRec;
-
- // PulseAudio
- uint16_t _paDeviceIndex;
- bool _paStateChanged;
-
- pa_threaded_mainloop* _paMainloop;
- pa_mainloop_api* _paMainloopApi;
- pa_context* _paContext;
-
- pa_stream* _recStream;
- pa_stream* _playStream;
- uint32_t _recStreamFlags;
- uint32_t _playStreamFlags;
- pa_buffer_attr _playBufferAttr;
- pa_buffer_attr _recBufferAttr;
-
- char _oldKeyState[32];
- Display* _XDisplay;
-};
-
-}
-
-#endif  // MODULES_AUDIO_DEVICE_MAIN_SOURCE_LINUX_AUDIO_DEVICE_PULSE_LINUX_H_
diff --git a/modules/audio_device/linux/audio_mixer_manager_alsa_linux.cc b/modules/audio_device/linux/audio_mixer_manager_alsa_linux.cc
deleted file mode 100644
index 9ce0ca1..0000000
--- a/modules/audio_device/linux/audio_mixer_manager_alsa_linux.cc
+++ /dev/null
@@ -1,1117 +0,0 @@
-/*
- *  Copyright (c) 2012 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 <assert.h>
-
-#include "webrtc/modules/audio_device/linux/audio_mixer_manager_alsa_linux.h"
-#include "webrtc/rtc_base/logging.h"
-
-extern webrtc::adm_linux_alsa::AlsaSymbolTable AlsaSymbolTable;
-
-// Accesses ALSA functions through our late-binding symbol table instead of
-// directly. This way we don't have to link to libalsa, which means our binary
-// will work on systems that don't have it.
-#define LATE(sym) \
-  LATESYM_GET(webrtc::adm_linux_alsa::AlsaSymbolTable, &AlsaSymbolTable, sym)
-
-namespace webrtc
-{
-
-AudioMixerManagerLinuxALSA::AudioMixerManagerLinuxALSA() :
-    _outputMixerHandle(NULL),
-    _inputMixerHandle(NULL),
-    _outputMixerElement(NULL),
-    _inputMixerElement(NULL)
-{
-    LOG(LS_INFO) << __FUNCTION__ << " created";
-
-    memset(_outputMixerStr, 0, kAdmMaxDeviceNameSize);
-    memset(_inputMixerStr, 0, kAdmMaxDeviceNameSize);
-}
-
-AudioMixerManagerLinuxALSA::~AudioMixerManagerLinuxALSA()
-{
-    LOG(LS_INFO) << __FUNCTION__ << " destroyed";
-    Close();
-}
-
-// ============================================================================
-//                                    PUBLIC METHODS
-// ============================================================================
-
-int32_t AudioMixerManagerLinuxALSA::Close()
-{
-    LOG(LS_VERBOSE) << __FUNCTION__;
-
-    rtc::CritScope lock(&_critSect);
-
-    CloseSpeaker();
-    CloseMicrophone();
-
-    return 0;
-
-}
-
-int32_t AudioMixerManagerLinuxALSA::CloseSpeaker()
-{
-    LOG(LS_VERBOSE) << __FUNCTION__;
-
-    rtc::CritScope lock(&_critSect);
-
-    int errVal = 0;
-
-    if (_outputMixerHandle != NULL)
-    {
-        LOG(LS_VERBOSE) << "Closing playout mixer";
-        LATE(snd_mixer_free)(_outputMixerHandle);
-        if (errVal < 0)
-        {
-            LOG(LS_ERROR) << "Error freeing playout mixer: "
-                          << LATE(snd_strerror)(errVal);
-        }
-        errVal = LATE(snd_mixer_detach)(_outputMixerHandle, _outputMixerStr);
-        if (errVal < 0)
-        {
-            LOG(LS_ERROR) << "Error detaching playout mixer: "
-                          << LATE(snd_strerror)(errVal);
-        }
-        errVal = LATE(snd_mixer_close)(_outputMixerHandle);
-        if (errVal < 0)
-        {
-            LOG(LS_ERROR) << "Error snd_mixer_close(handleMixer) errVal="
-                          << errVal;
-        }
-        _outputMixerHandle = NULL;
-        _outputMixerElement = NULL;
-    }
-    memset(_outputMixerStr, 0, kAdmMaxDeviceNameSize);
-
-    return 0;
-}
-
-int32_t AudioMixerManagerLinuxALSA::CloseMicrophone()
-{
-    LOG(LS_VERBOSE) << __FUNCTION__;
-
-    rtc::CritScope lock(&_critSect);
-
-    int errVal = 0;
-
-    if (_inputMixerHandle != NULL)
-    {
-        LOG(LS_VERBOSE) << "Closing record mixer";
-
-        LATE(snd_mixer_free)(_inputMixerHandle);
-        if (errVal < 0)
-        {
-            LOG(LS_ERROR) << "Error freeing record mixer: "
-                          << LATE(snd_strerror)(errVal);
-        }
-        LOG(LS_VERBOSE) << "Closing record mixer 2";
-
-        errVal = LATE(snd_mixer_detach)(_inputMixerHandle, _inputMixerStr);
-        if (errVal < 0)
-        {
-            LOG(LS_ERROR) << "Error detaching record mixer: "
-                          << LATE(snd_strerror)(errVal);
-        }
-        LOG(LS_VERBOSE) << "Closing record mixer 3";
-
-        errVal = LATE(snd_mixer_close)(_inputMixerHandle);
-        if (errVal < 0)
-        {
-            LOG(LS_ERROR) << "Error snd_mixer_close(handleMixer) errVal="
-                          << errVal;
-        }
-
-        LOG(LS_VERBOSE) << "Closing record mixer 4";
-        _inputMixerHandle = NULL;
-        _inputMixerElement = NULL;
-    }
-    memset(_inputMixerStr, 0, kAdmMaxDeviceNameSize);
-
-    return 0;
-}
-
-int32_t AudioMixerManagerLinuxALSA::OpenSpeaker(char* deviceName)
-{
-    LOG(LS_VERBOSE) << "AudioMixerManagerLinuxALSA::OpenSpeaker(name="
-                    << deviceName << ")";
-
-    rtc::CritScope lock(&_critSect);
-
-    int errVal = 0;
-
-    // Close any existing output mixer handle
-    //
-    if (_outputMixerHandle != NULL)
-    {
-        LOG(LS_VERBOSE) << "Closing playout mixer";
-
-        LATE(snd_mixer_free)(_outputMixerHandle);
-        if (errVal < 0)
-        {
-            LOG(LS_ERROR) << "Error freeing playout mixer: "
-                          << LATE(snd_strerror)(errVal);
-        }
-        errVal = LATE(snd_mixer_detach)(_outputMixerHandle, _outputMixerStr);
-        if (errVal < 0)
-        {
-            LOG(LS_ERROR) << "Error detaching playout mixer: "
-                          << LATE(snd_strerror)(errVal);
-        }
-        errVal = LATE(snd_mixer_close)(_outputMixerHandle);
-        if (errVal < 0)
-        {
-            LOG(LS_ERROR) << "Error snd_mixer_close(handleMixer) errVal="
-                          << errVal;
-        }
-    }
-    _outputMixerHandle = NULL;
-    _outputMixerElement = NULL;
-
-    errVal = LATE(snd_mixer_open)(&_outputMixerHandle, 0);
-    if (errVal < 0)
-    {
-        LOG(LS_ERROR) << "snd_mixer_open(&_outputMixerHandle, 0) - error";
-        return -1;
-    }
-
-    char controlName[kAdmMaxDeviceNameSize] = { 0 };
-    GetControlName(controlName, deviceName);
-
-    LOG(LS_VERBOSE) << "snd_mixer_attach(_outputMixerHandle, " << controlName
-                    << ")";
-
-    errVal = LATE(snd_mixer_attach)(_outputMixerHandle, controlName);
-    if (errVal < 0)
-    {
-        LOG(LS_ERROR) << "snd_mixer_attach(_outputMixerHandle, " << controlName
-                      << ") error: " << LATE(snd_strerror)(errVal);
-        _outputMixerHandle = NULL;
-        return -1;
-    }
-    strcpy(_outputMixerStr, controlName);
-
-    errVal = LATE(snd_mixer_selem_register)(_outputMixerHandle, NULL, NULL);
-    if (errVal < 0)
-    {
-        LOG(LS_ERROR)
-            << "snd_mixer_selem_register(_outputMixerHandle, NULL, NULL), "
-            << "error: " << LATE(snd_strerror)(errVal);
-        _outputMixerHandle = NULL;
-        return -1;
-    }
-
-    // Load and find the proper mixer element
-    if (LoadSpeakerMixerElement() < 0)
-    {
-        return -1;
-    }
-
-    if (_outputMixerHandle != NULL)
-    {
-        LOG(LS_VERBOSE) << "the output mixer device is now open ("
-                        << _outputMixerHandle << ")";
-    }
-
-    return 0;
-}
-
-int32_t AudioMixerManagerLinuxALSA::OpenMicrophone(char *deviceName)
-{
-    LOG(LS_VERBOSE) << "AudioMixerManagerLinuxALSA::OpenMicrophone(name="
-                    << deviceName << ")";
-
-    rtc::CritScope lock(&_critSect);
-
-    int errVal = 0;
-
-    // Close any existing input mixer handle
-    //
-    if (_inputMixerHandle != NULL)
-    {
-        LOG(LS_VERBOSE) << "Closing record mixer";
-
-        LATE(snd_mixer_free)(_inputMixerHandle);
-        if (errVal < 0)
-        {
-            LOG(LS_ERROR) << "Error freeing record mixer: "
-                          << LATE(snd_strerror)(errVal);
-        }
-        LOG(LS_VERBOSE) << "Closing record mixer";
-
-        errVal = LATE(snd_mixer_detach)(_inputMixerHandle, _inputMixerStr);
-        if (errVal < 0)
-        {
-            LOG(LS_ERROR) << "Error detaching record mixer: "
-                          << LATE(snd_strerror)(errVal);
-        }
-        LOG(LS_VERBOSE) << "Closing record mixer";
-
-        errVal = LATE(snd_mixer_close)(_inputMixerHandle);
-        if (errVal < 0)
-        {
-            LOG(LS_ERROR) << "Error snd_mixer_close(handleMixer) errVal="
-                          << errVal;
-        }
-        LOG(LS_VERBOSE) << "Closing record mixer";
-    }
-    _inputMixerHandle = NULL;
-    _inputMixerElement = NULL;
-
-    errVal = LATE(snd_mixer_open)(&_inputMixerHandle, 0);
-    if (errVal < 0)
-    {
-        LOG(LS_ERROR) << "snd_mixer_open(&_inputMixerHandle, 0) - error";
-        return -1;
-    }
-
-    char controlName[kAdmMaxDeviceNameSize] = { 0 };
-    GetControlName(controlName, deviceName);
-
-    LOG(LS_VERBOSE) << "snd_mixer_attach(_inputMixerHandle, " << controlName
-                    << ")";
-
-    errVal = LATE(snd_mixer_attach)(_inputMixerHandle, controlName);
-    if (errVal < 0)
-    {
-        LOG(LS_ERROR) << "snd_mixer_attach(_inputMixerHandle, " << controlName
-                      << ") error: " << LATE(snd_strerror)(errVal);
-
-        _inputMixerHandle = NULL;
-        return -1;
-    }
-    strcpy(_inputMixerStr, controlName);
-
-    errVal = LATE(snd_mixer_selem_register)(_inputMixerHandle, NULL, NULL);
-    if (errVal < 0)
-    {
-        LOG(LS_ERROR)
-            << "snd_mixer_selem_register(_inputMixerHandle, NULL, NULL), "
-            << "error: " << LATE(snd_strerror)(errVal);
-
-        _inputMixerHandle = NULL;
-        return -1;
-    }
-    // Load and find the proper mixer element
-    if (LoadMicMixerElement() < 0)
-    {
-        return -1;
-    }
-
-    if (_inputMixerHandle != NULL)
-    {
-        LOG(LS_VERBOSE) << "the input mixer device is now open ("
-                        << _inputMixerHandle << ")";
-    }
-
-    return 0;
-}
-
-bool AudioMixerManagerLinuxALSA::SpeakerIsInitialized() const
-{
-    LOG(LS_INFO) << __FUNCTION__;
-
-    return (_outputMixerHandle != NULL);
-}
-
-bool AudioMixerManagerLinuxALSA::MicrophoneIsInitialized() const
-{
-    LOG(LS_INFO) << __FUNCTION__;
-
-    return (_inputMixerHandle != NULL);
-}
-
-int32_t AudioMixerManagerLinuxALSA::SetSpeakerVolume(
-    uint32_t volume)
-{
-    LOG(LS_VERBOSE) << "AudioMixerManagerLinuxALSA::SetSpeakerVolume(volume="
-                    << volume << ")";
-
-    rtc::CritScope lock(&_critSect);
-
-    if (_outputMixerElement == NULL)
-    {
-        LOG(LS_WARNING) << "no avaliable output mixer element exists";
-        return -1;
-    }
-
-    int errVal =
-        LATE(snd_mixer_selem_set_playback_volume_all)(_outputMixerElement,
-                                                      volume);
-    if (errVal < 0)
-    {
-        LOG(LS_ERROR) << "Error changing master volume: "
-                      << LATE(snd_strerror)(errVal);
-        return -1;
-    }
-
-    return (0);
-}
-
-int32_t AudioMixerManagerLinuxALSA::SpeakerVolume(
-    uint32_t& volume) const
-{
-
-    if (_outputMixerElement == NULL)
-    {
-        LOG(LS_WARNING) << "no avaliable output mixer element exists";
-        return -1;
-    }
-
-    long int vol(0);
-
-    int
-        errVal = LATE(snd_mixer_selem_get_playback_volume)(
-            _outputMixerElement,
-            (snd_mixer_selem_channel_id_t) 0,
-            &vol);
-    if (errVal < 0)
-    {
-        LOG(LS_ERROR) << "Error getting outputvolume: "
-                      << LATE(snd_strerror)(errVal);
-        return -1;
-    }
-    LOG(LS_VERBOSE) << "AudioMixerManagerLinuxALSA::SpeakerVolume() => vol="
-                    << vol;
-
-    volume = static_cast<uint32_t> (vol);
-
-    return 0;
-}
-
-int32_t AudioMixerManagerLinuxALSA::MaxSpeakerVolume(
-    uint32_t& maxVolume) const
-{
-
-    if (_outputMixerElement == NULL)
-    {
-        LOG(LS_WARNING) << "no avilable output mixer element exists";
-        return -1;
-    }
-
-    long int minVol(0);
-    long int maxVol(0);
-
-    int errVal =
-        LATE(snd_mixer_selem_get_playback_volume_range)(_outputMixerElement,
-                                                        &minVol, &maxVol);
-
-    LOG(LS_VERBOSE) << "Playout hardware volume range, min: " << minVol
-                    << ", max: " << maxVol;
-
-    if (maxVol <= minVol)
-    {
-        LOG(LS_ERROR) << "Error getting get_playback_volume_range: "
-                      << LATE(snd_strerror)(errVal);
-    }
-
-    maxVolume = static_cast<uint32_t> (maxVol);
-
-    return 0;
-}
-
-int32_t AudioMixerManagerLinuxALSA::MinSpeakerVolume(
-    uint32_t& minVolume) const
-{
-
-    if (_outputMixerElement == NULL)
-    {
-        LOG(LS_WARNING) << "no avaliable output mixer element exists";
-        return -1;
-    }
-
-    long int minVol(0);
-    long int maxVol(0);
-
-    int errVal =
-        LATE(snd_mixer_selem_get_playback_volume_range)(_outputMixerElement,
-                                                        &minVol, &maxVol);
-
-    LOG(LS_VERBOSE) << "Playout hardware volume range, min: " << minVol
-                    << ", max: " << maxVol;
-
-    if (maxVol <= minVol)
-    {
-        LOG(LS_ERROR) << "Error getting get_playback_volume_range: "
-                      << LATE(snd_strerror)(errVal);
-    }
-
-    minVolume = static_cast<uint32_t> (minVol);
-
-    return 0;
-}
-
-// TL: Have done testnig with these but they don't seem reliable and
-// they were therefore not added
-/*
- // ----------------------------------------------------------------------------
- //    SetMaxSpeakerVolume
- // ----------------------------------------------------------------------------
-
- int32_t AudioMixerManagerLinuxALSA::SetMaxSpeakerVolume(
-     uint32_t maxVolume)
- {
-
- if (_outputMixerElement == NULL)
- {
- LOG(LS_WARNING) << "no avaliable output mixer element exists";
- return -1;
- }
-
- long int minVol(0);
- long int maxVol(0);
-
- int errVal = snd_mixer_selem_get_playback_volume_range(
- _outputMixerElement, &minVol, &maxVol);
- if ((maxVol <= minVol) || (errVal != 0))
- {
- LOG(LS_WARNING) << "Error getting playback volume range: "
-                 << snd_strerror(errVal);
- }
-
- maxVol = maxVolume;
- errVal = snd_mixer_selem_set_playback_volume_range(
- _outputMixerElement, minVol, maxVol);
- LOG(LS_VERBOSE) << "Playout hardware volume range, min: " << minVol
-                 << ", max: " << maxVol;
- if (errVal != 0)
- {
- LOG(LS_ERROR) << "Error setting playback volume range: "
-               << snd_strerror(errVal);
- return -1;
- }
-
- return 0;
- }
-
- // ----------------------------------------------------------------------------
- //    SetMinSpeakerVolume
- // ----------------------------------------------------------------------------
-
- int32_t AudioMixerManagerLinuxALSA::SetMinSpeakerVolume(
-     uint32_t minVolume)
- {
-
- if (_outputMixerElement == NULL)
- {
- LOG(LS_WARNING) << "no avaliable output mixer element exists";
- return -1;
- }
-
- long int minVol(0);
- long int maxVol(0);
-
- int errVal = snd_mixer_selem_get_playback_volume_range(
- _outputMixerElement, &minVol, &maxVol);
- if ((maxVol <= minVol) || (errVal != 0))
- {
- LOG(LS_WARNING) << "Error getting playback volume range: "
-                 << snd_strerror(errVal);
- }
-
- minVol = minVolume;
- errVal = snd_mixer_selem_set_playback_volume_range(
- _outputMixerElement, minVol, maxVol);
- LOG(LS_VERBOSE) << "Playout hardware volume range, min: " << minVol
-                 << ", max: " << maxVol;
- if (errVal != 0)
- {
- LOG(LS_ERROR) << "Error setting playback volume range: "
-               << snd_strerror(errVal);
- return -1;
- }
-
- return 0;
- }
- */
-
-int32_t AudioMixerManagerLinuxALSA::SpeakerVolumeIsAvailable(
-    bool& available)
-{
-    if (_outputMixerElement == NULL)
-    {
-        LOG(LS_WARNING) << "no avaliable output mixer element exists";
-        return -1;
-    }
-
-    available = LATE(snd_mixer_selem_has_playback_volume)(_outputMixerElement);
-
-    return 0;
-}
-
-int32_t AudioMixerManagerLinuxALSA::SpeakerMuteIsAvailable(
-    bool& available)
-{
-    if (_outputMixerElement == NULL)
-    {
-        LOG(LS_WARNING) << "no avaliable output mixer element exists";
-        return -1;
-    }
-
-    available = LATE(snd_mixer_selem_has_playback_switch)(_outputMixerElement);
-
-    return 0;
-}
-
-int32_t AudioMixerManagerLinuxALSA::SetSpeakerMute(bool enable)
-{
-    LOG(LS_VERBOSE) << "AudioMixerManagerLinuxALSA::SetSpeakerMute(enable="
-                    << enable << ")";
-
-    rtc::CritScope lock(&_critSect);
-
-    if (_outputMixerElement == NULL)
-    {
-        LOG(LS_WARNING) << "no avaliable output mixer element exists";
-        return -1;
-    }
-
-    // Ensure that the selected speaker destination has a valid mute control.
-    bool available(false);
-    SpeakerMuteIsAvailable(available);
-    if (!available)
-    {
-        LOG(LS_WARNING) << "it is not possible to mute the speaker";
-        return -1;
-    }
-
-    // Note value = 0 (off) means muted
-    int errVal =
-        LATE(snd_mixer_selem_set_playback_switch_all)(_outputMixerElement,
-                                                      !enable);
-    if (errVal < 0)
-    {
-        LOG(LS_ERROR) << "Error setting playback switch: "
-                      << LATE(snd_strerror)(errVal);
-        return -1;
-    }
-
-    return (0);
-}
-
-int32_t AudioMixerManagerLinuxALSA::SpeakerMute(bool& enabled) const
-{
-
-    if (_outputMixerElement == NULL)
-    {
-        LOG(LS_WARNING) << "no avaliable output mixer exists";
-        return -1;
-    }
-
-    // Ensure that the selected speaker destination has a valid mute control.
-    bool available =
-        LATE(snd_mixer_selem_has_playback_switch)(_outputMixerElement);
-    if (!available)
-    {
-        LOG(LS_WARNING) << "it is not possible to mute the speaker";
-        return -1;
-    }
-
-    int value(false);
-
-    // Retrieve one boolean control value for a specified mute-control
-    //
-    int
-        errVal = LATE(snd_mixer_selem_get_playback_switch)(
-            _outputMixerElement,
-            (snd_mixer_selem_channel_id_t) 0,
-            &value);
-    if (errVal < 0)
-    {
-        LOG(LS_ERROR) << "Error getting playback switch: "
-                      << LATE(snd_strerror)(errVal);
-        return -1;
-    }
-
-    // Note value = 0 (off) means muted
-    enabled = (bool) !value;
-
-    return 0;
-}
-
-int32_t AudioMixerManagerLinuxALSA::MicrophoneMuteIsAvailable(
-    bool& available)
-{
-    if (_inputMixerElement == NULL)
-    {
-        LOG(LS_WARNING) << "no avaliable input mixer element exists";
-        return -1;
-    }
-
-    available = LATE(snd_mixer_selem_has_capture_switch)(_inputMixerElement);
-    return 0;
-}
-
-int32_t AudioMixerManagerLinuxALSA::SetMicrophoneMute(bool enable)
-{
-    LOG(LS_VERBOSE) << "AudioMixerManagerLinuxALSA::SetMicrophoneMute(enable="
-                    << enable << ")";
-
-    rtc::CritScope lock(&_critSect);
-
-    if (_inputMixerElement == NULL)
-    {
-        LOG(LS_WARNING) << "no avaliable input mixer element exists";
-        return -1;
-    }
-
-    // Ensure that the selected microphone destination has a valid mute control.
-    bool available(false);
-    MicrophoneMuteIsAvailable(available);
-    if (!available)
-    {
-        LOG(LS_WARNING) << "it is not possible to mute the microphone";
-        return -1;
-    }
-
-    // Note value = 0 (off) means muted
-    int errVal =
-        LATE(snd_mixer_selem_set_capture_switch_all)(_inputMixerElement,
-                                                     !enable);
-    if (errVal < 0)
-    {
-        LOG(LS_ERROR) << "Error setting capture switch: "
-                      << LATE(snd_strerror)(errVal);
-        return -1;
-    }
-
-    return (0);
-}
-
-int32_t AudioMixerManagerLinuxALSA::MicrophoneMute(bool& enabled) const
-{
-
-    if (_inputMixerElement == NULL)
-    {
-        LOG(LS_WARNING) << "no avaliable input mixer exists";
-        return -1;
-    }
-
-    // Ensure that the selected microphone destination has a valid mute control.
-    bool available =
-        LATE(snd_mixer_selem_has_capture_switch)(_inputMixerElement);
-    if (!available)
-    {
-        LOG(LS_WARNING) << "it is not possible to mute the microphone";
-        return -1;
-    }
-
-    int value(false);
-
-    // Retrieve one boolean control value for a specified mute-control
-    //
-    int
-        errVal = LATE(snd_mixer_selem_get_capture_switch)(
-            _inputMixerElement,
-            (snd_mixer_selem_channel_id_t) 0,
-            &value);
-    if (errVal < 0)
-    {
-        LOG(LS_ERROR) << "Error getting capture switch: "
-                      << LATE(snd_strerror)(errVal);
-        return -1;
-    }
-
-    // Note value = 0 (off) means muted
-    enabled = (bool) !value;
-
-    return 0;
-}
-
-int32_t AudioMixerManagerLinuxALSA::MicrophoneVolumeIsAvailable(
-    bool& available)
-{
-    if (_inputMixerElement == NULL)
-    {
-        LOG(LS_WARNING) << "no avaliable input mixer element exists";
-        return -1;
-    }
-
-    available = LATE(snd_mixer_selem_has_capture_volume)(_inputMixerElement);
-
-    return 0;
-}
-
-int32_t AudioMixerManagerLinuxALSA::SetMicrophoneVolume(
-    uint32_t volume)
-{
-    LOG(LS_VERBOSE) << "AudioMixerManagerLinuxALSA::SetMicrophoneVolume(volume="
-                    << volume << ")";
-
-    rtc::CritScope lock(&_critSect);
-
-    if (_inputMixerElement == NULL)
-    {
-        LOG(LS_WARNING) << "no avaliable input mixer element exists";
-        return -1;
-    }
-
-    int
-        errVal =
-            LATE(snd_mixer_selem_set_capture_volume_all)(_inputMixerElement,
-                                                         volume);
-    if (errVal < 0)
-    {
-        LOG(LS_ERROR) << "Error changing microphone volume: "
-                      << LATE(snd_strerror)(errVal);
-        return -1;
-    }
-
-    return (0);
-}
-
-// TL: Have done testnig with these but they don't seem reliable and
-// they were therefore not added
-/*
- // ----------------------------------------------------------------------------
- //    SetMaxMicrophoneVolume
- // ----------------------------------------------------------------------------
-
- int32_t AudioMixerManagerLinuxALSA::SetMaxMicrophoneVolume(
-     uint32_t maxVolume)
- {
-
- if (_inputMixerElement == NULL)
- {
- LOG(LS_WARNING) << "no avaliable output mixer element exists";
- return -1;
- }
-
- long int minVol(0);
- long int maxVol(0);
-
- int errVal = snd_mixer_selem_get_capture_volume_range(_inputMixerElement,
-  &minVol, &maxVol);
- if ((maxVol <= minVol) || (errVal != 0))
- {
- LOG(LS_WARNING) << "Error getting capture volume range: "
-                 << snd_strerror(errVal);
- }
-
- maxVol = (long int)maxVolume;
- printf("min %d max %d", minVol, maxVol);
- errVal = snd_mixer_selem_set_capture_volume_range(_inputMixerElement, minVol, maxVol);
- LOG(LS_VERBOSE) << "Capture hardware volume range, min: " << minVol
-                 << ", max: " << maxVol;
- if (errVal != 0)
- {
- LOG(LS_ERROR) << "Error setting capture volume range: "
-               << snd_strerror(errVal);
- return -1;
- }
-
- return 0;
- }
-
- // ----------------------------------------------------------------------------
- //    SetMinMicrophoneVolume
- // ----------------------------------------------------------------------------
-
- int32_t AudioMixerManagerLinuxALSA::SetMinMicrophoneVolume(
- uint32_t minVolume)
- {
-
- if (_inputMixerElement == NULL)
- {
- LOG(LS_WARNING) << "no avaliable output mixer element exists";
- return -1;
- }
-
- long int minVol(0);
- long int maxVol(0);
-
- int errVal = snd_mixer_selem_get_capture_volume_range(
- _inputMixerElement, &minVol, &maxVol);
- if (maxVol <= minVol)
- {
- //maxVol = 255;
- LOG(LS_WARNING) << "Error getting capture volume range: "
-                 << snd_strerror(errVal);
- }
-
- printf("min %d max %d", minVol, maxVol);
- minVol = (long int)minVolume;
- errVal = snd_mixer_selem_set_capture_volume_range(
- _inputMixerElement, minVol, maxVol);
- LOG(LS_VERBOSE) << "Capture hardware volume range, min: " << minVol
-                 << ", max: " << maxVol;
- if (errVal != 0)
- {
- LOG(LS_ERROR) << "Error setting capture volume range: "
-               << snd_strerror(errVal);
- return -1;
- }
-
- return 0;
- }
- */
-
-int32_t AudioMixerManagerLinuxALSA::MicrophoneVolume(
-    uint32_t& volume) const
-{
-
-    if (_inputMixerElement == NULL)
-    {
-        LOG(LS_WARNING) << "no avaliable input mixer element exists";
-        return -1;
-    }
-
-    long int vol(0);
-
-    int
-        errVal =
-            LATE(snd_mixer_selem_get_capture_volume)(
-                _inputMixerElement,
-                (snd_mixer_selem_channel_id_t) 0,
-                &vol);
-    if (errVal < 0)
-    {
-        LOG(LS_ERROR) << "Error getting inputvolume: "
-                      << LATE(snd_strerror)(errVal);
-        return -1;
-    }
-    LOG(LS_VERBOSE) << "AudioMixerManagerLinuxALSA::MicrophoneVolume() => vol="
-                    << vol;
-
-    volume = static_cast<uint32_t> (vol);
-
-    return 0;
-}
-
-int32_t AudioMixerManagerLinuxALSA::MaxMicrophoneVolume(
-    uint32_t& maxVolume) const
-{
-
-    if (_inputMixerElement == NULL)
-    {
-        LOG(LS_WARNING) << "no avaliable input mixer element exists";
-        return -1;
-    }
-
-    long int minVol(0);
-    long int maxVol(0);
-
-    // check if we have mic volume at all
-    if (!LATE(snd_mixer_selem_has_capture_volume)(_inputMixerElement))
-    {
-        LOG(LS_ERROR) << "No microphone volume available";
-        return -1;
-    }
-
-    int errVal =
-        LATE(snd_mixer_selem_get_capture_volume_range)(_inputMixerElement,
-                                                       &minVol, &maxVol);
-
-    LOG(LS_VERBOSE) << "Microphone hardware volume range, min: " << minVol
-                    << ", max: " << maxVol;
-    if (maxVol <= minVol)
-    {
-        LOG(LS_ERROR) << "Error getting microphone volume range: "
-                      << LATE(snd_strerror)(errVal);
-    }
-
-    maxVolume = static_cast<uint32_t> (maxVol);
-
-    return 0;
-}
-
-int32_t AudioMixerManagerLinuxALSA::MinMicrophoneVolume(
-    uint32_t& minVolume) const
-{
-
-    if (_inputMixerElement == NULL)
-    {
-        LOG(LS_WARNING) << "no avaliable input mixer element exists";
-        return -1;
-    }
-
-    long int minVol(0);
-    long int maxVol(0);
-
-    int errVal =
-        LATE(snd_mixer_selem_get_capture_volume_range)(_inputMixerElement,
-                                                       &minVol, &maxVol);
-
-    LOG(LS_VERBOSE) << "Microphone hardware volume range, min: " << minVol
-                    << ", max: " << maxVol;
-    if (maxVol <= minVol)
-    {
-        LOG(LS_ERROR) << "Error getting microphone volume range: "
-                      << LATE(snd_strerror)(errVal);
-    }
-
-    minVolume = static_cast<uint32_t> (minVol);
-
-    return 0;
-}
-
-// ============================================================================
-//                                 Private Methods
-// ============================================================================
-
-int32_t AudioMixerManagerLinuxALSA::LoadMicMixerElement() const
-{
-    int errVal = LATE(snd_mixer_load)(_inputMixerHandle);
-    if (errVal < 0)
-    {
-        LOG(LS_ERROR) << "snd_mixer_load(_inputMixerHandle), error: "
-                      << LATE(snd_strerror)(errVal);
-        _inputMixerHandle = NULL;
-        return -1;
-    }
-
-    snd_mixer_elem_t *elem = NULL;
-    snd_mixer_elem_t *micElem = NULL;
-    unsigned mixerIdx = 0;
-    const char *selemName = NULL;
-
-    // Find and store handles to the right mixer elements
-    for (elem = LATE(snd_mixer_first_elem)(_inputMixerHandle); elem; elem
-        = LATE(snd_mixer_elem_next)(elem), mixerIdx++)
-    {
-        if (LATE(snd_mixer_selem_is_active)(elem))
-        {
-            selemName = LATE(snd_mixer_selem_get_name)(elem);
-            if (strcmp(selemName, "Capture") == 0) // "Capture", "Mic"
-            {
-                _inputMixerElement = elem;
-                LOG(LS_VERBOSE) << "Capture element set";
-            } else if (strcmp(selemName, "Mic") == 0)
-            {
-                micElem = elem;
-                LOG(LS_VERBOSE) << "Mic element found";
-            }
-        }
-
-        if (_inputMixerElement)
-        {
-            // Use the first Capture element that is found
-            // The second one may not work
-            break;
-        }
-    }
-
-    if (_inputMixerElement == NULL)
-    {
-        // We didn't find a Capture handle, use Mic.
-        if (micElem != NULL)
-        {
-            _inputMixerElement = micElem;
-            LOG(LS_VERBOSE) << "Using Mic as capture volume.";
-        } else
-        {
-            _inputMixerElement = NULL;
-            LOG(LS_ERROR) << "Could not find capture volume on the mixer.";
-
-            return -1;
-        }
-    }
-
-    return 0;
-}
-
-int32_t AudioMixerManagerLinuxALSA::LoadSpeakerMixerElement() const
-{
-    int errVal = LATE(snd_mixer_load)(_outputMixerHandle);
-    if (errVal < 0)
-    {
-        LOG(LS_ERROR) << "snd_mixer_load(_outputMixerHandle), error: "
-                      << LATE(snd_strerror)(errVal);
-        _outputMixerHandle = NULL;
-        return -1;
-    }
-
-    snd_mixer_elem_t *elem = NULL;
-    snd_mixer_elem_t *masterElem = NULL;
-    snd_mixer_elem_t *speakerElem = NULL;
-    unsigned mixerIdx = 0;
-    const char *selemName = NULL;
-
-    // Find and store handles to the right mixer elements
-    for (elem = LATE(snd_mixer_first_elem)(_outputMixerHandle); elem; elem
-        = LATE(snd_mixer_elem_next)(elem), mixerIdx++)
-    {
-        if (LATE(snd_mixer_selem_is_active)(elem))
-        {
-            selemName = LATE(snd_mixer_selem_get_name)(elem);
-            LOG(LS_VERBOSE) << "snd_mixer_selem_get_name " << mixerIdx << ": "
-                            << selemName << " =" << elem;
-
-            // "Master", "PCM", "Wave", "Master Mono", "PC Speaker", "PCM", "Wave"
-            if (strcmp(selemName, "PCM") == 0)
-            {
-                _outputMixerElement = elem;
-                LOG(LS_VERBOSE) << "PCM element set";
-            } else if (strcmp(selemName, "Master") == 0)
-            {
-                masterElem = elem;
-                LOG(LS_VERBOSE) << "Master element found";
-            } else if (strcmp(selemName, "Speaker") == 0)
-            {
-                speakerElem = elem;
-                LOG(LS_VERBOSE) << "Speaker element found";
-            }
-        }
-
-        if (_outputMixerElement)
-        {
-            // We have found the element we want
-            break;
-        }
-    }
-
-    // If we didn't find a PCM Handle, use Master or Speaker
-    if (_outputMixerElement == NULL)
-    {
-        if (masterElem != NULL)
-        {
-            _outputMixerElement = masterElem;
-            LOG(LS_VERBOSE) << "Using Master as output volume.";
-        } else if (speakerElem != NULL)
-        {
-            _outputMixerElement = speakerElem;
-            LOG(LS_VERBOSE) << "Using Speaker as output volume.";
-        } else
-        {
-            _outputMixerElement = NULL;
-            LOG(LS_ERROR) << "Could not find output volume in the mixer.";
-            return -1;
-        }
-    }
-
-    return 0;
-}
-
-void AudioMixerManagerLinuxALSA::GetControlName(char* controlName,
-                                                char* deviceName) const
-{
-    // Example
-    // deviceName: "front:CARD=Intel,DEV=0"
-    // controlName: "hw:CARD=Intel"
-    char* pos1 = strchr(deviceName, ':');
-    char* pos2 = strchr(deviceName, ',');
-    if (!pos2) {
-        // Can also be default:CARD=Intel
-        pos2 = &deviceName[strlen(deviceName)];
-    }
-    if (pos1 && pos2) {
-        strcpy(controlName, "hw");
-        int nChar = (int) (pos2 - pos1);
-        strncpy(&controlName[2], pos1, nChar);
-        controlName[2 + nChar] = '\0';
-    } else {
-        strcpy(controlName, deviceName);
-    }
-
-}
-
-}
diff --git a/modules/audio_device/linux/audio_mixer_manager_alsa_linux.h b/modules/audio_device/linux/audio_mixer_manager_alsa_linux.h
deleted file mode 100644
index 58fb400..0000000
--- a/modules/audio_device/linux/audio_mixer_manager_alsa_linux.h
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- *  Copyright (c) 2011 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_AUDIO_DEVICE_AUDIO_MIXER_MANAGER_ALSA_LINUX_H
-#define WEBRTC_AUDIO_DEVICE_AUDIO_MIXER_MANAGER_ALSA_LINUX_H
-
-#include "webrtc/modules/audio_device/include/audio_device.h"
-#include "webrtc/modules/audio_device/linux/alsasymboltable_linux.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/typedefs.h"
-
-#include <alsa/asoundlib.h>
-
-namespace webrtc
-{
-
-class AudioMixerManagerLinuxALSA
-{
-public:
-    int32_t OpenSpeaker(char* deviceName);
-    int32_t OpenMicrophone(char* deviceName);
-    int32_t SetSpeakerVolume(uint32_t volume);
-    int32_t SpeakerVolume(uint32_t& volume) const;
-    int32_t MaxSpeakerVolume(uint32_t& maxVolume) const;
-    int32_t MinSpeakerVolume(uint32_t& minVolume) const;
-    int32_t SpeakerVolumeIsAvailable(bool& available);
-    int32_t SpeakerMuteIsAvailable(bool& available);
-    int32_t SetSpeakerMute(bool enable);
-    int32_t SpeakerMute(bool& enabled) const;
-    int32_t MicrophoneMuteIsAvailable(bool& available);
-    int32_t SetMicrophoneMute(bool enable);
-    int32_t MicrophoneMute(bool& enabled) const;
-    int32_t MicrophoneVolumeIsAvailable(bool& available);
-    int32_t SetMicrophoneVolume(uint32_t volume);
-    int32_t MicrophoneVolume(uint32_t& volume) const;
-    int32_t MaxMicrophoneVolume(uint32_t& maxVolume) const;
-    int32_t MinMicrophoneVolume(uint32_t& minVolume) const;
-    int32_t Close();
-    int32_t CloseSpeaker();
-    int32_t CloseMicrophone();
-    bool SpeakerIsInitialized() const;
-    bool MicrophoneIsInitialized() const;
-
-public:
-    AudioMixerManagerLinuxALSA();
-    ~AudioMixerManagerLinuxALSA();
-
-private:
-    int32_t LoadMicMixerElement() const;
-    int32_t LoadSpeakerMixerElement() const;
-    void GetControlName(char *controlName, char* deviceName) const;
-
-private:
-    rtc::CriticalSection _critSect;
-    mutable snd_mixer_t* _outputMixerHandle;
-    char _outputMixerStr[kAdmMaxDeviceNameSize];
-    mutable snd_mixer_t* _inputMixerHandle;
-    char _inputMixerStr[kAdmMaxDeviceNameSize];
-    mutable snd_mixer_elem_t* _outputMixerElement;
-    mutable snd_mixer_elem_t* _inputMixerElement;
-};
-
-}
-
-#endif  // MODULES_AUDIO_DEVICE_MAIN_SOURCE_LINUX_AUDIO_MIXER_MANAGER_ALSA_LINUX_H_
diff --git a/modules/audio_device/linux/audio_mixer_manager_pulse_linux.cc b/modules/audio_device/linux/audio_mixer_manager_pulse_linux.cc
deleted file mode 100644
index afffc1d..0000000
--- a/modules/audio_device/linux/audio_mixer_manager_pulse_linux.cc
+++ /dev/null
@@ -1,977 +0,0 @@
-/*
- *  Copyright (c) 2012 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 <assert.h>
-
-#include "webrtc/modules/audio_device/linux/audio_mixer_manager_pulse_linux.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-
-extern webrtc::adm_linux_pulse::PulseAudioSymbolTable PaSymbolTable;
-
-// Accesses Pulse functions through our late-binding symbol table instead of
-// directly. This way we don't have to link to libpulse, which means our
-// binary will work on systems that don't have it.
-#define LATE(sym)                                                             \
-  LATESYM_GET(webrtc::adm_linux_pulse::PulseAudioSymbolTable, &PaSymbolTable, \
-              sym)
-
-namespace webrtc
-{
-
-class AutoPulseLock {
- public:
-  explicit AutoPulseLock(pa_threaded_mainloop* pa_mainloop)
-      : pa_mainloop_(pa_mainloop) {
-    LATE(pa_threaded_mainloop_lock)(pa_mainloop_);
-  }
-
-  ~AutoPulseLock() {
-    LATE(pa_threaded_mainloop_unlock)(pa_mainloop_);
-  }
-
- private:
-  pa_threaded_mainloop* const pa_mainloop_;
-};
-
-AudioMixerManagerLinuxPulse::AudioMixerManagerLinuxPulse() :
-    _paOutputDeviceIndex(-1),
-    _paInputDeviceIndex(-1),
-    _paPlayStream(NULL),
-    _paRecStream(NULL),
-    _paMainloop(NULL),
-    _paContext(NULL),
-    _paVolume(0),
-    _paMute(0),
-    _paVolSteps(0),
-    _paSpeakerMute(false),
-    _paSpeakerVolume(PA_VOLUME_NORM),
-    _paChannels(0),
-    _paObjectsSet(false)
-{
-    LOG(LS_INFO) << __FUNCTION__ << " created";
-}
-
-AudioMixerManagerLinuxPulse::~AudioMixerManagerLinuxPulse()
-{
-    RTC_DCHECK(thread_checker_.CalledOnValidThread());
-    LOG(LS_INFO) << __FUNCTION__ << " destroyed";
-
-    Close();
-}
-
-// ===========================================================================
-//                                    PUBLIC METHODS
-// ===========================================================================
-
-int32_t AudioMixerManagerLinuxPulse::SetPulseAudioObjects(
-    pa_threaded_mainloop* mainloop,
-    pa_context* context)
-{
-    RTC_DCHECK(thread_checker_.CalledOnValidThread());
-    LOG(LS_VERBOSE) << __FUNCTION__;
-
-    if (!mainloop || !context)
-    {
-        LOG(LS_ERROR) << "could not set PulseAudio objects for mixer";
-        return -1;
-    }
-
-    _paMainloop = mainloop;
-    _paContext = context;
-    _paObjectsSet = true;
-
-    LOG(LS_VERBOSE) << "the PulseAudio objects for the mixer has been set";
-
-    return 0;
-}
-
-int32_t AudioMixerManagerLinuxPulse::Close()
-{
-    RTC_DCHECK(thread_checker_.CalledOnValidThread());
-    LOG(LS_VERBOSE) << __FUNCTION__;
-
-    CloseSpeaker();
-    CloseMicrophone();
-
-    _paMainloop = NULL;
-    _paContext = NULL;
-    _paObjectsSet = false;
-
-    return 0;
-
-}
-
-int32_t AudioMixerManagerLinuxPulse::CloseSpeaker()
-{
-    RTC_DCHECK(thread_checker_.CalledOnValidThread());
-    LOG(LS_VERBOSE) << __FUNCTION__;
-
-    // Reset the index to -1
-    _paOutputDeviceIndex = -1;
-    _paPlayStream = NULL;
-
-    return 0;
-}
-
-int32_t AudioMixerManagerLinuxPulse::CloseMicrophone()
-{
-    RTC_DCHECK(thread_checker_.CalledOnValidThread());
-    LOG(LS_VERBOSE) << __FUNCTION__;
-
-    // Reset the index to -1
-    _paInputDeviceIndex = -1;
-    _paRecStream = NULL;
-
-    return 0;
-}
-
-int32_t AudioMixerManagerLinuxPulse::SetPlayStream(pa_stream* playStream)
-{
-    RTC_DCHECK(thread_checker_.CalledOnValidThread());
-    LOG(LS_VERBOSE) << "AudioMixerManagerLinuxPulse::SetPlayStream(playStream)";
-
-    _paPlayStream = playStream;
-    return 0;
-}
-
-int32_t AudioMixerManagerLinuxPulse::SetRecStream(pa_stream* recStream)
-{
-    RTC_DCHECK(thread_checker_.CalledOnValidThread());
-    LOG(LS_VERBOSE) << "AudioMixerManagerLinuxPulse::SetRecStream(recStream)";
-
-    _paRecStream = recStream;
-    return 0;
-}
-
-int32_t AudioMixerManagerLinuxPulse::OpenSpeaker(
-    uint16_t deviceIndex)
-{
-    RTC_DCHECK(thread_checker_.CalledOnValidThread());
-    LOG(LS_VERBOSE) << "AudioMixerManagerLinuxPulse::OpenSpeaker(deviceIndex="
-                    << deviceIndex << ")";
-
-    // No point in opening the speaker
-    // if PA objects have not been set
-    if (!_paObjectsSet)
-    {
-        LOG(LS_ERROR) << "PulseAudio objects has not been set";
-        return -1;
-    }
-
-    // Set the index for the PulseAudio
-    // output device to control
-    _paOutputDeviceIndex = deviceIndex;
-
-    LOG(LS_VERBOSE) << "the output mixer device is now open";
-
-    return 0;
-}
-
-int32_t AudioMixerManagerLinuxPulse::OpenMicrophone(
-    uint16_t deviceIndex)
-{
-    RTC_DCHECK(thread_checker_.CalledOnValidThread());
-    LOG(LS_VERBOSE)
-        << "AudioMixerManagerLinuxPulse::OpenMicrophone(deviceIndex="
-        << deviceIndex << ")";
-
-    // No point in opening the microphone
-    // if PA objects have not been set
-    if (!_paObjectsSet)
-    {
-        LOG(LS_ERROR) << "PulseAudio objects have not been set";
-        return -1;
-    }
-
-    // Set the index for the PulseAudio
-    // input device to control
-    _paInputDeviceIndex = deviceIndex;
-
-    LOG(LS_VERBOSE) << "the input mixer device is now open";
-
-    return 0;
-}
-
-bool AudioMixerManagerLinuxPulse::SpeakerIsInitialized() const
-{
-    RTC_DCHECK(thread_checker_.CalledOnValidThread());
-    LOG(LS_INFO) << __FUNCTION__;
-
-    return (_paOutputDeviceIndex != -1);
-}
-
-bool AudioMixerManagerLinuxPulse::MicrophoneIsInitialized() const
-{
-    RTC_DCHECK(thread_checker_.CalledOnValidThread());
-    LOG(LS_INFO) << __FUNCTION__;
-
-    return (_paInputDeviceIndex != -1);
-}
-
-int32_t AudioMixerManagerLinuxPulse::SetSpeakerVolume(
-    uint32_t volume)
-{
-    RTC_DCHECK(thread_checker_.CalledOnValidThread());
-    LOG(LS_VERBOSE) << "AudioMixerManagerLinuxPulse::SetSpeakerVolume(volume="
-                    << volume << ")";
-
-    if (_paOutputDeviceIndex == -1)
-    {
-        LOG(LS_WARNING) << "output device index has not been set";
-        return -1;
-    }
-
-    bool setFailed(false);
-
-    if (_paPlayStream && (LATE(pa_stream_get_state)(_paPlayStream)
-        != PA_STREAM_UNCONNECTED))
-    {
-        // We can only really set the volume if we have a connected stream
-        AutoPulseLock auto_lock(_paMainloop);
-
-        // Get the number of channels from the sample specification
-        const pa_sample_spec *spec =
-            LATE(pa_stream_get_sample_spec)(_paPlayStream);
-        if (!spec)
-        {
-            LOG(LS_ERROR) << "could not get sample specification";
-            return -1;
-        }
-
-        // Set the same volume for all channels
-        pa_cvolume cVolumes;
-        LATE(pa_cvolume_set)(&cVolumes, spec->channels, volume);
-
-        pa_operation* paOperation = NULL;
-        paOperation = LATE(pa_context_set_sink_input_volume)(
-            _paContext,
-            LATE(pa_stream_get_index)(_paPlayStream),
-            &cVolumes,
-            PaSetVolumeCallback, NULL);
-        if (!paOperation)
-        {
-            setFailed = true;
-        }
-
-        // Don't need to wait for the completion
-        LATE(pa_operation_unref)(paOperation);
-    } else
-    {
-        // We have not created a stream or it's not connected to the sink
-        // Save the volume to be set at connection
-        _paSpeakerVolume = volume;
-    }
-
-    if (setFailed)
-    {
-        LOG(LS_WARNING) << "could not set speaker volume, error="
-                        << LATE(pa_context_errno)(_paContext);
-
-        return -1;
-    }
-
-    return 0;
-}
-
-int32_t
-AudioMixerManagerLinuxPulse::SpeakerVolume(uint32_t& volume) const
-{
-    if (_paOutputDeviceIndex == -1)
-    {
-        LOG(LS_WARNING) << "output device index has not been set";
-        return -1;
-    }
-
-    if (_paPlayStream && (LATE(pa_stream_get_state)(_paPlayStream)
-        != PA_STREAM_UNCONNECTED))
-    {
-        // We can only get the volume if we have a connected stream
-        if (!GetSinkInputInfo())
-          return -1;
-
-        AutoPulseLock auto_lock(_paMainloop);
-        volume = static_cast<uint32_t> (_paVolume);
-    } else
-    {
-        AutoPulseLock auto_lock(_paMainloop);
-        volume = _paSpeakerVolume;
-    }
-
-    LOG(LS_VERBOSE) << "AudioMixerManagerLinuxPulse::SpeakerVolume() => vol="
-                    << volume;
-
-    return 0;
-}
-
-int32_t
-AudioMixerManagerLinuxPulse::MaxSpeakerVolume(uint32_t& maxVolume) const
-{
-
-    if (_paOutputDeviceIndex == -1)
-    {
-        LOG(LS_WARNING) << "output device index has not been set";
-        return -1;
-    }
-
-    // PA_VOLUME_NORM corresponds to 100% (0db)
-    // but PA allows up to 150 db amplification
-    maxVolume = static_cast<uint32_t> (PA_VOLUME_NORM);
-
-    return 0;
-}
-
-int32_t
-AudioMixerManagerLinuxPulse::MinSpeakerVolume(uint32_t& minVolume) const
-{
-
-    if (_paOutputDeviceIndex == -1)
-    {
-        LOG(LS_WARNING) << "output device index has not been set";
-        return -1;
-    }
-
-    minVolume = static_cast<uint32_t> (PA_VOLUME_MUTED);
-
-    return 0;
-}
-
-int32_t
-AudioMixerManagerLinuxPulse::SpeakerVolumeIsAvailable(bool& available)
-{
-    RTC_DCHECK(thread_checker_.CalledOnValidThread());
-    if (_paOutputDeviceIndex == -1)
-    {
-        LOG(LS_WARNING) << "output device index has not been set";
-        return -1;
-    }
-
-    // Always available in Pulse Audio
-    available = true;
-
-    return 0;
-}
-
-int32_t
-AudioMixerManagerLinuxPulse::SpeakerMuteIsAvailable(bool& available)
-{
-    RTC_DCHECK(thread_checker_.CalledOnValidThread());
-    if (_paOutputDeviceIndex == -1)
-    {
-        LOG(LS_WARNING) << "output device index has not been set";
-        return -1;
-    }
-
-    // Always available in Pulse Audio
-    available = true;
-
-    return 0;
-}
-
-int32_t AudioMixerManagerLinuxPulse::SetSpeakerMute(bool enable)
-{
-    RTC_DCHECK(thread_checker_.CalledOnValidThread());
-    LOG(LS_VERBOSE) << "AudioMixerManagerLinuxPulse::SetSpeakerMute(enable="
-                    << enable << ")";
-
-    if (_paOutputDeviceIndex == -1)
-    {
-        LOG(LS_WARNING) << "output device index has not been set";
-        return -1;
-    }
-
-    bool setFailed(false);
-
-    if (_paPlayStream && (LATE(pa_stream_get_state)(_paPlayStream)
-        != PA_STREAM_UNCONNECTED))
-    {
-        // We can only really mute if we have a connected stream
-        AutoPulseLock auto_lock(_paMainloop);
-
-        pa_operation* paOperation = NULL;
-        paOperation = LATE(pa_context_set_sink_input_mute)(
-            _paContext,
-            LATE(pa_stream_get_index)(_paPlayStream),
-            (int) enable,
-            PaSetVolumeCallback,
-            NULL);
-        if (!paOperation)
-        {
-            setFailed = true;
-        }
-
-        // Don't need to wait for the completion
-        LATE(pa_operation_unref)(paOperation);
-    } else
-    {
-        // We have not created a stream or it's not connected to the sink
-        // Save the mute status to be set at connection
-        _paSpeakerMute = enable;
-    }
-
-    if (setFailed)
-    {
-        LOG(LS_WARNING) << "could not mute speaker, error="
-                        << LATE(pa_context_errno)(_paContext);
-        return -1;
-    }
-
-    return 0;
-}
-
-int32_t AudioMixerManagerLinuxPulse::SpeakerMute(bool& enabled) const
-{
-
-    if (_paOutputDeviceIndex == -1)
-    {
-        LOG(LS_WARNING) << "output device index has not been set";
-        return -1;
-    }
-
-    if (_paPlayStream && (LATE(pa_stream_get_state)(_paPlayStream)
-        != PA_STREAM_UNCONNECTED))
-    {
-        // We can only get the mute status if we have a connected stream
-        if (!GetSinkInputInfo())
-          return -1;
-
-        enabled = static_cast<bool> (_paMute);
-    } else
-    {
-        enabled = _paSpeakerMute;
-    }
-    LOG(LS_VERBOSE) << "AudioMixerManagerLinuxPulse::SpeakerMute() => enabled="
-                    << enabled;
-
-    return 0;
-}
-
-int32_t
-AudioMixerManagerLinuxPulse::StereoPlayoutIsAvailable(bool& available)
-{
-    RTC_DCHECK(thread_checker_.CalledOnValidThread());
-    if (_paOutputDeviceIndex == -1)
-    {
-        LOG(LS_WARNING) << "output device index has not been set";
-        return -1;
-    }
-
-    uint32_t deviceIndex = (uint32_t) _paOutputDeviceIndex;
-
-    {
-        AutoPulseLock auto_lock(_paMainloop);
-
-        // Get the actual stream device index if we have a connected stream
-        // The device used by the stream can be changed
-        // during the call
-        if (_paPlayStream && (LATE(pa_stream_get_state)(_paPlayStream)
-            != PA_STREAM_UNCONNECTED))
-        {
-            deviceIndex = LATE(pa_stream_get_device_index)(_paPlayStream);
-        }
-    }
-
-    if (!GetSinkInfoByIndex(deviceIndex))
-      return -1;
-
-    available = static_cast<bool> (_paChannels == 2);
-
-    return 0;
-}
-
-int32_t
-AudioMixerManagerLinuxPulse::StereoRecordingIsAvailable(bool& available)
-{
-    RTC_DCHECK(thread_checker_.CalledOnValidThread());
-    if (_paInputDeviceIndex == -1)
-    {
-        LOG(LS_WARNING) << "input device index has not been set";
-        return -1;
-    }
-
-    uint32_t deviceIndex = (uint32_t) _paInputDeviceIndex;
-
-    AutoPulseLock auto_lock(_paMainloop);
-
-    // Get the actual stream device index if we have a connected stream
-    // The device used by the stream can be changed
-    // during the call
-    if (_paRecStream && (LATE(pa_stream_get_state)(_paRecStream)
-        != PA_STREAM_UNCONNECTED))
-    {
-        deviceIndex = LATE(pa_stream_get_device_index)(_paRecStream);
-    }
-
-    pa_operation* paOperation = NULL;
-
-    // Get info for this source
-    // We want to know if the actual device can record in stereo
-    paOperation = LATE(pa_context_get_source_info_by_index)(
-        _paContext, deviceIndex,
-        PaSourceInfoCallback,
-        (void*) this);
-
-    WaitForOperationCompletion(paOperation);
-
-    available = static_cast<bool> (_paChannels == 2);
-
-    LOG(LS_VERBOSE)
-        << "AudioMixerManagerLinuxPulse::StereoRecordingIsAvailable()"
-        << " => available=" << available;
-
-    return 0;
-}
-
-int32_t AudioMixerManagerLinuxPulse::MicrophoneMuteIsAvailable(
-    bool& available)
-{
-    RTC_DCHECK(thread_checker_.CalledOnValidThread());
-    if (_paInputDeviceIndex == -1)
-    {
-        LOG(LS_WARNING) << "input device index has not been set";
-        return -1;
-    }
-
-    // Always available in Pulse Audio
-    available = true;
-
-    return 0;
-}
-
-int32_t AudioMixerManagerLinuxPulse::SetMicrophoneMute(bool enable)
-{
-    RTC_DCHECK(thread_checker_.CalledOnValidThread());
-    LOG(LS_VERBOSE) << "AudioMixerManagerLinuxPulse::SetMicrophoneMute(enable="
-                    << enable << ")";
-
-    if (_paInputDeviceIndex == -1)
-    {
-        LOG(LS_WARNING) << "input device index has not been set";
-        return -1;
-    }
-
-    bool setFailed(false);
-    pa_operation* paOperation = NULL;
-
-    uint32_t deviceIndex = (uint32_t) _paInputDeviceIndex;
-
-    AutoPulseLock auto_lock(_paMainloop);
-
-    // Get the actual stream device index if we have a connected stream
-    // The device used by the stream can be changed
-    // during the call
-    if (_paRecStream && (LATE(pa_stream_get_state)(_paRecStream)
-        != PA_STREAM_UNCONNECTED))
-    {
-        deviceIndex = LATE(pa_stream_get_device_index)(_paRecStream);
-    }
-
-    // Set mute switch for the source
-    paOperation = LATE(pa_context_set_source_mute_by_index)(
-        _paContext, deviceIndex,
-        enable,
-        PaSetVolumeCallback, NULL);
-
-    if (!paOperation)
-    {
-        setFailed = true;
-    }
-
-    // Don't need to wait for this to complete.
-    LATE(pa_operation_unref)(paOperation);
-
-    if (setFailed)
-    {
-        LOG(LS_WARNING) << "could not mute microphone, error="
-                        << LATE(pa_context_errno)(_paContext);
-        return -1;
-    }
-
-    return 0;
-}
-
-int32_t AudioMixerManagerLinuxPulse::MicrophoneMute(bool& enabled) const
-{
-    RTC_DCHECK(thread_checker_.CalledOnValidThread());
-    if (_paInputDeviceIndex == -1)
-    {
-        LOG(LS_WARNING) << "input device index has not been set";
-        return -1;
-    }
-
-    uint32_t deviceIndex = (uint32_t) _paInputDeviceIndex;
-
-    {
-        AutoPulseLock auto_lock(_paMainloop);
-        // Get the actual stream device index if we have a connected stream
-        // The device used by the stream can be changed
-        // during the call
-        if (_paRecStream && (LATE(pa_stream_get_state)(_paRecStream)
-            != PA_STREAM_UNCONNECTED))
-        {
-            deviceIndex = LATE(pa_stream_get_device_index)(_paRecStream);
-        }
-    }
-
-    if (!GetSourceInfoByIndex(deviceIndex))
-      return -1;
-
-    enabled = static_cast<bool> (_paMute);
-
-    LOG(LS_VERBOSE)
-        << "AudioMixerManagerLinuxPulse::MicrophoneMute() => enabled="
-        << enabled;
-
-    return 0;
-}
-
-int32_t AudioMixerManagerLinuxPulse::MicrophoneVolumeIsAvailable(
-    bool& available)
-{
-    RTC_DCHECK(thread_checker_.CalledOnValidThread());
-    if (_paInputDeviceIndex == -1)
-    {
-        LOG(LS_WARNING) << "input device index has not been set";
-        return -1;
-    }
-
-    // Always available in Pulse Audio
-    available = true;
-
-    return 0;
-}
-
-int32_t
-AudioMixerManagerLinuxPulse::SetMicrophoneVolume(uint32_t volume)
-{
-    LOG(LS_VERBOSE)
-        << "AudioMixerManagerLinuxPulse::SetMicrophoneVolume(volume=" << volume
-        << ")";
-
-    if (_paInputDeviceIndex == -1)
-    {
-        LOG(LS_WARNING) << "input device index has not been set";
-        return -1;
-    }
-
-    // Unlike output streams, input streams have no concept of a stream
-    // volume, only a device volume. So we have to change the volume of the
-    // device itself.
-
-    // The device may have a different number of channels than the stream and
-    // their mapping may be different, so we don't want to use the channel
-    // count from our sample spec. We could use PA_CHANNELS_MAX to cover our
-    // bases, and the server allows that even if the device's channel count
-    // is lower, but some buggy PA clients don't like that (the pavucontrol
-    // on Hardy dies in an assert if the channel count is different). So
-    // instead we look up the actual number of channels that the device has.
-    AutoPulseLock auto_lock(_paMainloop);
-    uint32_t deviceIndex = (uint32_t) _paInputDeviceIndex;
-
-    // Get the actual stream device index if we have a connected stream
-    // The device used by the stream can be changed
-    // during the call
-    if (_paRecStream && (LATE(pa_stream_get_state)(_paRecStream)
-        != PA_STREAM_UNCONNECTED))
-    {
-        deviceIndex = LATE(pa_stream_get_device_index)(_paRecStream);
-    }
-
-    bool setFailed(false);
-    pa_operation* paOperation = NULL;
-
-    // Get the number of channels for this source
-    paOperation
-        = LATE(pa_context_get_source_info_by_index)(_paContext, deviceIndex,
-                                                    PaSourceInfoCallback,
-                                                    (void*) this);
-
-    WaitForOperationCompletion(paOperation);
-
-    uint8_t channels = _paChannels;
-    pa_cvolume cVolumes;
-    LATE(pa_cvolume_set)(&cVolumes, channels, volume);
-
-    // Set the volume for the source
-    paOperation
-        = LATE(pa_context_set_source_volume_by_index)(_paContext, deviceIndex,
-                                                      &cVolumes,
-                                                      PaSetVolumeCallback,
-                                                      NULL);
-
-    if (!paOperation)
-    {
-        setFailed = true;
-    }
-
-    // Don't need to wait for this to complete.
-    LATE(pa_operation_unref)(paOperation);
-
-    if (setFailed)
-    {
-        LOG(LS_WARNING) << "could not set microphone volume, error="
-                        << LATE(pa_context_errno)(_paContext);
-        return -1;
-    }
-
-    return 0;
-}
-
-int32_t
-AudioMixerManagerLinuxPulse::MicrophoneVolume(uint32_t& volume) const
-{
-
-    if (_paInputDeviceIndex == -1)
-    {
-        LOG(LS_WARNING) << "input device index has not been set";
-        return -1;
-    }
-
-    uint32_t deviceIndex = (uint32_t) _paInputDeviceIndex;
-
-    {
-      AutoPulseLock auto_lock(_paMainloop);
-      // Get the actual stream device index if we have a connected stream.
-      // The device used by the stream can be changed during the call.
-      if (_paRecStream && (LATE(pa_stream_get_state)(_paRecStream)
-          != PA_STREAM_UNCONNECTED))
-      {
-          deviceIndex = LATE(pa_stream_get_device_index)(_paRecStream);
-      }
-    }
-
-    if (!GetSourceInfoByIndex(deviceIndex))
-        return -1;
-
-    {
-        AutoPulseLock auto_lock(_paMainloop);
-        volume = static_cast<uint32_t> (_paVolume);
-    }
-
-    LOG(LS_VERBOSE)
-        << "AudioMixerManagerLinuxPulse::MicrophoneVolume() => vol="
-        << volume;
-
-    return 0;
-}
-
-int32_t
-AudioMixerManagerLinuxPulse::MaxMicrophoneVolume(uint32_t& maxVolume) const
-{
-
-    if (_paInputDeviceIndex == -1)
-    {
-        LOG(LS_WARNING) << "input device index has not been set";
-        return -1;
-    }
-
-    // PA_VOLUME_NORM corresponds to 100% (0db)
-    // PA allows up to 150 db amplification (PA_VOLUME_MAX)
-    // but that doesn't work well for all sound cards
-    maxVolume = static_cast<uint32_t> (PA_VOLUME_NORM);
-
-    return 0;
-}
-
-int32_t
-AudioMixerManagerLinuxPulse::MinMicrophoneVolume(uint32_t& minVolume) const
-{
-
-    if (_paInputDeviceIndex == -1)
-    {
-        LOG(LS_WARNING) << "input device index has not been set";
-        return -1;
-    }
-
-    minVolume = static_cast<uint32_t> (PA_VOLUME_MUTED);
-
-    return 0;
-}
-
-// ===========================================================================
-//                                 Private Methods
-// ===========================================================================
-
-void
-AudioMixerManagerLinuxPulse::PaSinkInfoCallback(pa_context */*c*/,
-                                                const pa_sink_info *i,
-                                                int eol,
-                                                void *pThis)
-{
-    static_cast<AudioMixerManagerLinuxPulse*> (pThis)->
-        PaSinkInfoCallbackHandler(i, eol);
-}
-
-void
-AudioMixerManagerLinuxPulse::PaSinkInputInfoCallback(
-    pa_context */*c*/,
-    const pa_sink_input_info *i,
-    int eol,
-    void *pThis)
-{
-    static_cast<AudioMixerManagerLinuxPulse*> (pThis)->
-        PaSinkInputInfoCallbackHandler(i, eol);
-}
-
-
-void
-AudioMixerManagerLinuxPulse::PaSourceInfoCallback(pa_context */*c*/,
-                                                  const pa_source_info *i,
-                                                  int eol,
-                                                  void *pThis)
-{
-    static_cast<AudioMixerManagerLinuxPulse*> (pThis)->
-        PaSourceInfoCallbackHandler(i, eol);
-}
-
-void
-AudioMixerManagerLinuxPulse::PaSetVolumeCallback(pa_context * c,
-                                                 int success,
-                                                 void */*pThis*/)
-{
-    if (!success)
-    {
-        LOG(LS_ERROR) << "failed to set volume";
-    }
-}
-
-void AudioMixerManagerLinuxPulse::PaSinkInfoCallbackHandler(
-    const pa_sink_info *i,
-    int eol)
-{
-    if (eol)
-    {
-        // Signal that we are done
-        LATE(pa_threaded_mainloop_signal)(_paMainloop, 0);
-        return;
-    }
-
-    _paChannels = i->channel_map.channels; // Get number of channels
-    pa_volume_t paVolume = PA_VOLUME_MUTED; // Minimum possible value.
-    for (int j = 0; j < _paChannels; ++j)
-    {
-        if (paVolume < i->volume.values[j])
-        {
-            paVolume = i->volume.values[j];
-        }
-    }
-    _paVolume = paVolume; // get the max volume for any channel
-    _paMute = i->mute; // get mute status
-
-    // supported since PA 0.9.15
-    //_paVolSteps = i->n_volume_steps; // get the number of volume steps
-    // default value is PA_VOLUME_NORM+1
-    _paVolSteps = PA_VOLUME_NORM + 1;
-}
-
-void AudioMixerManagerLinuxPulse::PaSinkInputInfoCallbackHandler(
-    const pa_sink_input_info *i,
-    int eol)
-{
-    if (eol)
-    {
-        // Signal that we are done
-        LATE(pa_threaded_mainloop_signal)(_paMainloop, 0);
-        return;
-    }
-
-    _paChannels = i->channel_map.channels; // Get number of channels
-    pa_volume_t paVolume = PA_VOLUME_MUTED; // Minimum possible value.
-    for (int j = 0; j < _paChannels; ++j)
-    {
-        if (paVolume < i->volume.values[j])
-        {
-            paVolume = i->volume.values[j];
-        }
-    }
-    _paVolume = paVolume; // Get the max volume for any channel
-    _paMute = i->mute; // Get mute status
-}
-
-void AudioMixerManagerLinuxPulse::PaSourceInfoCallbackHandler(
-    const pa_source_info *i,
-    int eol)
-{
-    if (eol)
-    {
-        // Signal that we are done
-        LATE(pa_threaded_mainloop_signal)(_paMainloop, 0);
-        return;
-    }
-
-    _paChannels = i->channel_map.channels; // Get number of channels
-    pa_volume_t paVolume = PA_VOLUME_MUTED; // Minimum possible value.
-    for (int j = 0; j < _paChannels; ++j)
-    {
-        if (paVolume < i->volume.values[j])
-        {
-            paVolume = i->volume.values[j];
-        }
-    }
-    _paVolume = paVolume; // Get the max volume for any channel
-    _paMute = i->mute; // Get mute status
-
-    // supported since PA 0.9.15
-    //_paVolSteps = i->n_volume_steps; // Get the number of volume steps
-    // default value is PA_VOLUME_NORM+1
-    _paVolSteps = PA_VOLUME_NORM + 1;
-}
-
-void AudioMixerManagerLinuxPulse::WaitForOperationCompletion(
-    pa_operation* paOperation) const
-{
-    while (LATE(pa_operation_get_state)(paOperation) == PA_OPERATION_RUNNING)
-    {
-        LATE(pa_threaded_mainloop_wait)(_paMainloop);
-    }
-
-    LATE(pa_operation_unref)(paOperation);
-}
-
-bool AudioMixerManagerLinuxPulse::GetSinkInputInfo() const {
-  pa_operation* paOperation = NULL;
-
-  AutoPulseLock auto_lock(_paMainloop);
-  // Get info for this stream (sink input).
-  paOperation = LATE(pa_context_get_sink_input_info)(
-      _paContext,
-      LATE(pa_stream_get_index)(_paPlayStream),
-      PaSinkInputInfoCallback,
-      (void*) this);
-
-  WaitForOperationCompletion(paOperation);
-  return true;
-}
-
-bool AudioMixerManagerLinuxPulse::GetSinkInfoByIndex(
-    int device_index) const {
-  pa_operation* paOperation = NULL;
-
-  AutoPulseLock auto_lock(_paMainloop);
-  paOperation = LATE(pa_context_get_sink_info_by_index)(_paContext,
-      device_index, PaSinkInfoCallback, (void*) this);
-
-  WaitForOperationCompletion(paOperation);
-  return true;
-}
-
-bool AudioMixerManagerLinuxPulse::GetSourceInfoByIndex(
-    int device_index) const {
-  pa_operation* paOperation = NULL;
-
-  AutoPulseLock auto_lock(_paMainloop);
-  paOperation  = LATE(pa_context_get_source_info_by_index)(
-      _paContext, device_index, PaSourceInfoCallback, (void*) this);
-
-  WaitForOperationCompletion(paOperation);
-  return true;
-}
-
-}
diff --git a/modules/audio_device/linux/audio_mixer_manager_pulse_linux.h b/modules/audio_device/linux/audio_mixer_manager_pulse_linux.h
deleted file mode 100644
index f639e82..0000000
--- a/modules/audio_device/linux/audio_mixer_manager_pulse_linux.h
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- *  Copyright (c) 2012 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_AUDIO_DEVICE_AUDIO_MIXER_MANAGER_PULSE_LINUX_H
-#define WEBRTC_AUDIO_DEVICE_AUDIO_MIXER_MANAGER_PULSE_LINUX_H
-
-#include "webrtc/modules/audio_device/include/audio_device.h"
-#include "webrtc/modules/audio_device/linux/pulseaudiosymboltable_linux.h"
-#include "webrtc/rtc_base/thread_checker.h"
-#include "webrtc/typedefs.h"
-
-#include <pulse/pulseaudio.h>
-#include <stdint.h>
-
-#ifndef UINT32_MAX
-#define UINT32_MAX  ((uint32_t)-1)
-#endif
-
-namespace webrtc
-{
-
-class AudioMixerManagerLinuxPulse
-{
-public:
-    int32_t SetPlayStream(pa_stream* playStream);
-    int32_t SetRecStream(pa_stream* recStream);
-    int32_t OpenSpeaker(uint16_t deviceIndex);
-    int32_t OpenMicrophone(uint16_t deviceIndex);
-    int32_t SetSpeakerVolume(uint32_t volume);
-    int32_t SpeakerVolume(uint32_t& volume) const;
-    int32_t MaxSpeakerVolume(uint32_t& maxVolume) const;
-    int32_t MinSpeakerVolume(uint32_t& minVolume) const;
-    int32_t SpeakerVolumeIsAvailable(bool& available);
-    int32_t SpeakerMuteIsAvailable(bool& available);
-    int32_t SetSpeakerMute(bool enable);
-    int32_t StereoPlayoutIsAvailable(bool& available);
-    int32_t StereoRecordingIsAvailable(bool& available);
-    int32_t SpeakerMute(bool& enabled) const;
-    int32_t MicrophoneMuteIsAvailable(bool& available);
-    int32_t SetMicrophoneMute(bool enable);
-    int32_t MicrophoneMute(bool& enabled) const;
-    int32_t MicrophoneVolumeIsAvailable(bool& available);
-    int32_t SetMicrophoneVolume(uint32_t volume);
-    int32_t MicrophoneVolume(uint32_t& volume) const;
-    int32_t MaxMicrophoneVolume(uint32_t& maxVolume) const;
-    int32_t MinMicrophoneVolume(uint32_t& minVolume) const;
-    int32_t SetPulseAudioObjects(pa_threaded_mainloop* mainloop,
-                                 pa_context* context);
-    int32_t Close();
-    int32_t CloseSpeaker();
-    int32_t CloseMicrophone();
-    bool SpeakerIsInitialized() const;
-    bool MicrophoneIsInitialized() const;
-
-public:
-    AudioMixerManagerLinuxPulse();
-    ~AudioMixerManagerLinuxPulse();
-
-private:
-    static void PaSinkInfoCallback(pa_context *c, const pa_sink_info *i,
-                                   int eol, void *pThis);
-    static void PaSinkInputInfoCallback(pa_context *c,
-                                        const pa_sink_input_info *i, int eol,
-                                        void *pThis);
-    static void PaSourceInfoCallback(pa_context *c, const pa_source_info *i,
-                                     int eol, void *pThis);
-    static void
-        PaSetVolumeCallback(pa_context* /*c*/, int success, void* /*pThis*/);
-    void PaSinkInfoCallbackHandler(const pa_sink_info *i, int eol);
-    void PaSinkInputInfoCallbackHandler(const pa_sink_input_info *i, int eol);
-    void PaSourceInfoCallbackHandler(const pa_source_info *i, int eol);
-
-    void WaitForOperationCompletion(pa_operation* paOperation) const;
-
-    bool GetSinkInputInfo() const;
-    bool GetSinkInfoByIndex(int device_index)const ;
-    bool GetSourceInfoByIndex(int device_index) const;
-
-private:
-    int16_t _paOutputDeviceIndex;
-    int16_t _paInputDeviceIndex;
-
-    pa_stream* _paPlayStream;
-    pa_stream* _paRecStream;
-
-    pa_threaded_mainloop* _paMainloop;
-    pa_context* _paContext;
-
-    mutable uint32_t _paVolume;
-    mutable uint32_t _paMute;
-    mutable uint32_t _paVolSteps;
-    bool _paSpeakerMute;
-    mutable uint32_t _paSpeakerVolume;
-    mutable uint8_t _paChannels;
-    bool _paObjectsSet;
-
-    // Stores thread ID in constructor.
-    // We can then use ThreadChecker::CalledOnValidThread() to ensure that
-    // other methods are called from the same thread.
-    // Currently only does RTC_DCHECK(thread_checker_.CalledOnValidThread()).
-    rtc::ThreadChecker thread_checker_;
-};
-
-}
-
-#endif  // MODULES_AUDIO_DEVICE_MAIN_SOURCE_LINUX_AUDIO_MIXER_MANAGER_PULSE_LINUX_H_
diff --git a/modules/audio_device/linux/latebindingsymboltable_linux.cc b/modules/audio_device/linux/latebindingsymboltable_linux.cc
deleted file mode 100644
index 549f6e9..0000000
--- a/modules/audio_device/linux/latebindingsymboltable_linux.cc
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- *  Copyright (c) 2010 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_device/linux/latebindingsymboltable_linux.h"
-
-#include "webrtc/rtc_base/logging.h"
-
-#ifdef WEBRTC_LINUX
-#include <dlfcn.h>
-#endif
-
-namespace webrtc {
-namespace adm_linux {
-
-inline static const char *GetDllError() {
-#ifdef WEBRTC_LINUX
-  char *err = dlerror();
-  if (err) {
-    return err;
-  } else {
-    return "No error";
-  }
-#else
-#error Not implemented
-#endif
-}
-
-DllHandle InternalLoadDll(const char dll_name[]) {
-#ifdef WEBRTC_LINUX
-  DllHandle handle = dlopen(dll_name, RTLD_NOW);
-#else
-#error Not implemented
-#endif
-  if (handle == kInvalidDllHandle) {
-    LOG(LS_WARNING) << "Can't load " << dll_name << " : " << GetDllError();
-  }
-  return handle;
-}
-
-void InternalUnloadDll(DllHandle handle) {
-#ifdef WEBRTC_LINUX
-// TODO(pbos): Remove this dlclose() exclusion when leaks and suppressions from
-// here are gone (or AddressSanitizer can display them properly).
-//
-// Skip dlclose() on AddressSanitizer as leaks including this module in the
-// stack trace gets displayed as <unknown module> instead of the actual library
-// -> it can not be suppressed.
-// https://code.google.com/p/address-sanitizer/issues/detail?id=89
-#if !defined(ADDRESS_SANITIZER)
-  if (dlclose(handle) != 0) {
-    LOG(LS_ERROR) << GetDllError();
-  }
-#endif  // !defined(ADDRESS_SANITIZER)
-#else
-#error Not implemented
-#endif
-}
-
-static bool LoadSymbol(DllHandle handle,
-                       const char *symbol_name,
-                       void **symbol) {
-#ifdef WEBRTC_LINUX
-  *symbol = dlsym(handle, symbol_name);
-  char *err = dlerror();
-  if (err) {
-    LOG(LS_ERROR) << "Error loading symbol " << symbol_name << " : " << err;
-    return false;
-  } else if (!*symbol) {
-    LOG(LS_ERROR) << "Symbol " << symbol_name << " is NULL";
-    return false;
-  }
-  return true;
-#else
-#error Not implemented
-#endif
-}
-
-// This routine MUST assign SOME value for every symbol, even if that value is
-// NULL, or else some symbols may be left with uninitialized data that the
-// caller may later interpret as a valid address.
-bool InternalLoadSymbols(DllHandle handle,
-                         int num_symbols,
-                         const char *const symbol_names[],
-                         void *symbols[]) {
-#ifdef WEBRTC_LINUX
-  // Clear any old errors.
-  dlerror();
-#endif
-  for (int i = 0; i < num_symbols; ++i) {
-    if (!LoadSymbol(handle, symbol_names[i], &symbols[i])) {
-      return false;
-    }
-  }
-  return true;
-}
-
-}  // namespace adm_linux
-}  // namespace webrtc
diff --git a/modules/audio_device/linux/latebindingsymboltable_linux.h b/modules/audio_device/linux/latebindingsymboltable_linux.h
deleted file mode 100644
index 03f0b71..0000000
--- a/modules/audio_device/linux/latebindingsymboltable_linux.h
+++ /dev/null
@@ -1,178 +0,0 @@
-/*
- *  Copyright (c) 2010 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_AUDIO_DEVICE_LATEBINDINGSYMBOLTABLE_LINUX_H
-#define WEBRTC_AUDIO_DEVICE_LATEBINDINGSYMBOLTABLE_LINUX_H
-
-#include <assert.h>
-#include <stddef.h>  // for NULL
-#include <string.h>
-
-#include "webrtc/rtc_base/constructormagic.h"
-
-// This file provides macros for creating "symbol table" classes to simplify the
-// dynamic loading of symbols from DLLs. Currently the implementation only
-// supports Linux and pure C symbols.
-// See talk/sound/pulseaudiosymboltable.(h|cc) for an example.
-
-namespace webrtc {
-namespace adm_linux {
-
-#ifdef WEBRTC_LINUX
-typedef void *DllHandle;
-
-const DllHandle kInvalidDllHandle = NULL;
-#else
-#error Not implemented
-#endif
-
-// These are helpers for use only by the class below.
-DllHandle InternalLoadDll(const char dll_name[]);
-
-void InternalUnloadDll(DllHandle handle);
-
-bool InternalLoadSymbols(DllHandle handle,
-                         int num_symbols,
-                         const char *const symbol_names[],
-                         void *symbols[]);
-
-template <int SYMBOL_TABLE_SIZE,
-          const char kDllName[],
-          const char *const kSymbolNames[]>
-class LateBindingSymbolTable {
- public:
-  LateBindingSymbolTable()
-      : handle_(kInvalidDllHandle),
-        undefined_symbols_(false) {
-    memset(symbols_, 0, sizeof(symbols_));
-  }
-
-  ~LateBindingSymbolTable() {
-    Unload();
-  }
-
-  static int NumSymbols() {
-    return SYMBOL_TABLE_SIZE;
-  }
-
-  // We do not use this, but we offer it for theoretical convenience.
-  static const char *GetSymbolName(int index) {
-    assert(index < NumSymbols());
-    return kSymbolNames[index];
-  }
-
-  bool IsLoaded() const {
-    return handle_ != kInvalidDllHandle;
-  }
-
-  // Loads the DLL and the symbol table. Returns true iff the DLL and symbol
-  // table loaded successfully.
-  bool Load() {
-    if (IsLoaded()) {
-      return true;
-    }
-    if (undefined_symbols_) {
-      // We do not attempt to load again because repeated attempts are not
-      // likely to succeed and DLL loading is costly.
-      return false;
-    }
-    handle_ = InternalLoadDll(kDllName);
-    if (!IsLoaded()) {
-      return false;
-    }
-    if (!InternalLoadSymbols(handle_, NumSymbols(), kSymbolNames, symbols_)) {
-      undefined_symbols_ = true;
-      Unload();
-      return false;
-    }
-    return true;
-  }
-
-  void Unload() {
-    if (!IsLoaded()) {
-      return;
-    }
-    InternalUnloadDll(handle_);
-    handle_ = kInvalidDllHandle;
-    memset(symbols_, 0, sizeof(symbols_));
-  }
-
-  // Retrieves the given symbol. NOTE: Recommended to use LATESYM_GET below
-  // instead of this.
-  void *GetSymbol(int index) const {
-    assert(IsLoaded());
-    assert(index < NumSymbols());
-    return symbols_[index];
-  }
-
- private:
-  DllHandle handle_;
-  bool undefined_symbols_;
-  void *symbols_[SYMBOL_TABLE_SIZE];
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(LateBindingSymbolTable);
-};
-
-// This macro must be invoked in a header to declare a symbol table class.
-#define LATE_BINDING_SYMBOL_TABLE_DECLARE_BEGIN(ClassName) \
-enum {
-
-// This macro must be invoked in the header declaration once for each symbol
-// (recommended to use an X-Macro to avoid duplication).
-// This macro defines an enum with names built from the symbols, which
-// essentially creates a hash table in the compiler from symbol names to their
-// indices in the symbol table class.
-#define LATE_BINDING_SYMBOL_TABLE_DECLARE_ENTRY(ClassName, sym) \
-  ClassName##_SYMBOL_TABLE_INDEX_##sym,
-
-// This macro completes the header declaration.
-#define LATE_BINDING_SYMBOL_TABLE_DECLARE_END(ClassName)       \
-  ClassName##_SYMBOL_TABLE_SIZE                                \
-  }                                                            \
-  ;                                                            \
-                                                               \
-  extern const char ClassName##_kDllName[];                    \
-  extern const char* const                                     \
-      ClassName##_kSymbolNames[ClassName##_SYMBOL_TABLE_SIZE]; \
-                                                               \
-  typedef ::webrtc::adm_linux::LateBindingSymbolTable<         \
-      ClassName##_SYMBOL_TABLE_SIZE, ClassName##_kDllName,     \
-      ClassName##_kSymbolNames>                                \
-      ClassName;
-
-// This macro must be invoked in a .cc file to define a previously-declared
-// symbol table class.
-#define LATE_BINDING_SYMBOL_TABLE_DEFINE_BEGIN(ClassName, dllName) \
-const char ClassName##_kDllName[] = dllName; \
-const char *const ClassName##_kSymbolNames[ClassName##_SYMBOL_TABLE_SIZE] = {
-
-// This macro must be invoked in the .cc definition once for each symbol
-// (recommended to use an X-Macro to avoid duplication).
-// This would have to use the mangled name if we were to ever support C++
-// symbols.
-#define LATE_BINDING_SYMBOL_TABLE_DEFINE_ENTRY(ClassName, sym) \
-  #sym,
-
-#define LATE_BINDING_SYMBOL_TABLE_DEFINE_END(ClassName) \
-};
-
-// Index of a given symbol in the given symbol table class.
-#define LATESYM_INDEXOF(ClassName, sym) \
-  (ClassName##_SYMBOL_TABLE_INDEX_##sym)
-
-// Returns a reference to the given late-binded symbol, with the correct type.
-#define LATESYM_GET(ClassName, inst, sym) \
-  (*reinterpret_cast<typeof(&sym)>( \
-      (inst)->GetSymbol(LATESYM_INDEXOF(ClassName, sym))))
-
-}  // namespace adm_linux
-}  // namespace webrtc
-
-#endif  // WEBRTC_ADM_LATEBINDINGSYMBOLTABLE_LINUX_H
diff --git a/modules/audio_device/linux/pulseaudiosymboltable_linux.cc b/modules/audio_device/linux/pulseaudiosymboltable_linux.cc
deleted file mode 100644
index 26a173d..0000000
--- a/modules/audio_device/linux/pulseaudiosymboltable_linux.cc
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * libjingle
- * Copyright 2004--2010, Google Inc.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- *  1. Redistributions of source code must retain the above copyright notice,
- *     this list of conditions and the following disclaimer.
- *  2. Redistributions in binary form must reproduce the above copyright notice,
- *     this list of conditions and the following disclaimer in the documentation
- *     and/or other materials provided with the distribution.
- *  3. The name of the author may not be used to endorse or promote products
- *     derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
- * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
- * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
- * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
- * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "webrtc/modules/audio_device/linux/pulseaudiosymboltable_linux.h"
-
-namespace webrtc {
-namespace adm_linux_pulse {
-
-LATE_BINDING_SYMBOL_TABLE_DEFINE_BEGIN(PulseAudioSymbolTable, "libpulse.so.0")
-#define X(sym) \
-    LATE_BINDING_SYMBOL_TABLE_DEFINE_ENTRY(PulseAudioSymbolTable, sym)
-PULSE_AUDIO_SYMBOLS_LIST
-#undef X
-LATE_BINDING_SYMBOL_TABLE_DEFINE_END(PulseAudioSymbolTable)
-
-}  // namespace adm_linux_pulse
-}  // namespace webrtc
diff --git a/modules/audio_device/linux/pulseaudiosymboltable_linux.h b/modules/audio_device/linux/pulseaudiosymboltable_linux.h
deleted file mode 100644
index f0d6d38..0000000
--- a/modules/audio_device/linux/pulseaudiosymboltable_linux.h
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * libjingle
- * Copyright 2004--2010, Google Inc.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- *  1. Redistributions of source code must retain the above copyright notice,
- *     this list of conditions and the following disclaimer.
- *  2. Redistributions in binary form must reproduce the above copyright notice,
- *     this list of conditions and the following disclaimer in the documentation
- *     and/or other materials provided with the distribution.
- *  3. The name of the author may not be used to endorse or promote products
- *     derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
- * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
- * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
- * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
- * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef WEBRTC_AUDIO_DEVICE_PULSEAUDIOSYMBOLTABLE_LINUX_H
-#define WEBRTC_AUDIO_DEVICE_PULSEAUDIOSYMBOLTABLE_LINUX_H
-
-#include "webrtc/modules/audio_device/linux/latebindingsymboltable_linux.h"
-
-namespace webrtc {
-namespace adm_linux_pulse {
-
-// The PulseAudio symbols we need, as an X-Macro list.
-// This list must contain precisely every libpulse function that is used in
-// the ADM LINUX PULSE Device and Mixer classes
-#define PULSE_AUDIO_SYMBOLS_LIST \
-  X(pa_bytes_per_second) \
-  X(pa_context_connect) \
-  X(pa_context_disconnect) \
-  X(pa_context_errno) \
-  X(pa_context_get_protocol_version) \
-  X(pa_context_get_server_info) \
-  X(pa_context_get_sink_info_list) \
-  X(pa_context_get_sink_info_by_index) \
-  X(pa_context_get_sink_info_by_name) \
-  X(pa_context_get_sink_input_info) \
-  X(pa_context_get_source_info_by_index) \
-  X(pa_context_get_source_info_by_name) \
-  X(pa_context_get_source_info_list) \
-  X(pa_context_get_state) \
-  X(pa_context_new) \
-  X(pa_context_set_sink_input_volume) \
-  X(pa_context_set_sink_input_mute) \
-  X(pa_context_set_source_volume_by_index) \
-  X(pa_context_set_source_mute_by_index) \
-  X(pa_context_set_state_callback) \
-  X(pa_context_unref) \
-  X(pa_cvolume_set) \
-  X(pa_operation_get_state) \
-  X(pa_operation_unref) \
-  X(pa_stream_connect_playback) \
-  X(pa_stream_connect_record) \
-  X(pa_stream_disconnect) \
-  X(pa_stream_drop) \
-  X(pa_stream_get_device_index) \
-  X(pa_stream_get_index) \
-  X(pa_stream_get_latency) \
-  X(pa_stream_get_sample_spec) \
-  X(pa_stream_get_state) \
-  X(pa_stream_new) \
-  X(pa_stream_peek) \
-  X(pa_stream_readable_size) \
-  X(pa_stream_set_buffer_attr) \
-  X(pa_stream_set_overflow_callback) \
-  X(pa_stream_set_read_callback) \
-  X(pa_stream_set_state_callback) \
-  X(pa_stream_set_underflow_callback) \
-  X(pa_stream_set_write_callback) \
-  X(pa_stream_unref) \
-  X(pa_stream_writable_size) \
-  X(pa_stream_write) \
-  X(pa_strerror) \
-  X(pa_threaded_mainloop_free) \
-  X(pa_threaded_mainloop_get_api) \
-  X(pa_threaded_mainloop_lock) \
-  X(pa_threaded_mainloop_new) \
-  X(pa_threaded_mainloop_signal) \
-  X(pa_threaded_mainloop_start) \
-  X(pa_threaded_mainloop_stop) \
-  X(pa_threaded_mainloop_unlock) \
-  X(pa_threaded_mainloop_wait)
-
-LATE_BINDING_SYMBOL_TABLE_DECLARE_BEGIN(PulseAudioSymbolTable)
-#define X(sym) \
-    LATE_BINDING_SYMBOL_TABLE_DECLARE_ENTRY(PulseAudioSymbolTable, sym)
-PULSE_AUDIO_SYMBOLS_LIST
-#undef X
-LATE_BINDING_SYMBOL_TABLE_DECLARE_END(PulseAudioSymbolTable)
-
-}  // namespace adm_linux_pulse
-}  // namespace webrtc
-
-#endif  // WEBRTC_AUDIO_DEVICE_PULSEAUDIOSYMBOLTABLE_LINUX_H
diff --git a/modules/audio_device/mac/audio_device_mac.cc b/modules/audio_device/mac/audio_device_mac.cc
deleted file mode 100644
index 0de5009..0000000
--- a/modules/audio_device/mac/audio_device_mac.cc
+++ /dev/null
@@ -1,2611 +0,0 @@
-/*
- *  Copyright (c) 2012 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_device/mac/audio_device_mac.h"
-#include "webrtc/modules/audio_device/audio_device_config.h"
-#include "webrtc/modules/audio_device/mac/portaudio/pa_ringbuffer.h"
-#include "webrtc/rtc_base/arraysize.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/platform_thread.h"
-#include "webrtc/system_wrappers/include/event_wrapper.h"
-
-#include <ApplicationServices/ApplicationServices.h>
-#include <libkern/OSAtomic.h>  // OSAtomicCompareAndSwap()
-#include <mach/mach.h>         // mach_task_self()
-#include <sys/sysctl.h>        // sysctlbyname()
-
-namespace webrtc {
-
-#define WEBRTC_CA_RETURN_ON_ERR(expr)                                  \
-  do {                                                                 \
-    err = expr;                                                        \
-    if (err != noErr) {                                                \
-      logCAMsg(rtc::LS_ERROR, "Error in " #expr,                       \
-               (const char*) & err);                                   \
-      return -1;                                                       \
-    }                                                                  \
-  } while (0)
-
-#define WEBRTC_CA_LOG_ERR(expr)                                        \
-  do {                                                                 \
-    err = expr;                                                        \
-    if (err != noErr) {                                                \
-      logCAMsg(rtc::LS_ERROR, "Error in " #expr,                       \
-               (const char*) & err);                                   \
-    }                                                                  \
-  } while (0)
-
-#define WEBRTC_CA_LOG_WARN(expr)                                         \
-  do {                                                                   \
-    err = expr;                                                          \
-    if (err != noErr) {                                                  \
-      logCAMsg(rtc::LS_WARNING, "Error in " #expr,                       \
-               (const char*) & err);                                     \
-    }                                                                    \
-  } while (0)
-
-enum { MaxNumberDevices = 64 };
-
-void AudioDeviceMac::AtomicSet32(int32_t* theValue, int32_t newValue) {
-  while (1) {
-    int32_t oldValue = *theValue;
-    if (OSAtomicCompareAndSwap32Barrier(oldValue, newValue, theValue) == true) {
-      return;
-    }
-  }
-}
-
-int32_t AudioDeviceMac::AtomicGet32(int32_t* theValue) {
-  while (1) {
-    int32_t value = *theValue;
-    if (OSAtomicCompareAndSwap32Barrier(value, value, theValue) == true) {
-      return value;
-    }
-  }
-}
-
-// CoreAudio errors are best interpreted as four character strings.
-void AudioDeviceMac::logCAMsg(const rtc::LoggingSeverity sev,
-                              const char* msg,
-                              const char* err) {
-  RTC_DCHECK(msg != NULL);
-  RTC_DCHECK(err != NULL);
-
-#ifdef WEBRTC_ARCH_BIG_ENDIAN
-  switch (sev) {
-    case rtc::LS_ERROR:
-      LOG(LS_ERROR) << msg << ": " << err[0] << err[1] << err[2] << err[3];
-      break;
-    case rtc::LS_WARNING:
-      LOG(LS_WARNING) << msg << ": " << err[0] << err[1] << err[2] << err[3];
-      break;
-    case rtc::LS_VERBOSE:
-      LOG(LS_VERBOSE) << msg << ": " << err[0] << err[1] << err[2] << err[3];
-      break;
-    default:
-      break;
-  }
-#else
-  // We need to flip the characters in this case.
-   switch (sev) {
-    case rtc::LS_ERROR:
-      LOG(LS_ERROR) << msg << ": " << err[3] << err[2] << err[1] << err[0];
-      break;
-    case rtc::LS_WARNING:
-      LOG(LS_WARNING) << msg << ": " << err[3] << err[2] << err[1] << err[0];
-      break;
-    case rtc::LS_VERBOSE:
-      LOG(LS_VERBOSE) << msg << ": " << err[3] << err[2] << err[1] << err[0];
-      break;
-    default:
-      break;
-  }
-#endif
-}
-
-AudioDeviceMac::AudioDeviceMac()
-    : _ptrAudioBuffer(NULL),
-      _stopEventRec(*EventWrapper::Create()),
-      _stopEvent(*EventWrapper::Create()),
-      _mixerManager(),
-      _inputDeviceIndex(0),
-      _outputDeviceIndex(0),
-      _inputDeviceID(kAudioObjectUnknown),
-      _outputDeviceID(kAudioObjectUnknown),
-      _inputDeviceIsSpecified(false),
-      _outputDeviceIsSpecified(false),
-      _recChannels(N_REC_CHANNELS),
-      _playChannels(N_PLAY_CHANNELS),
-      _captureBufData(NULL),
-      _renderBufData(NULL),
-      _initialized(false),
-      _isShutDown(false),
-      _recording(false),
-      _playing(false),
-      _recIsInitialized(false),
-      _playIsInitialized(false),
-      _AGC(false),
-      _renderDeviceIsAlive(1),
-      _captureDeviceIsAlive(1),
-      _twoDevices(true),
-      _doStop(false),
-      _doStopRec(false),
-      _macBookPro(false),
-      _macBookProPanRight(false),
-      _captureLatencyUs(0),
-      _renderLatencyUs(0),
-      _captureDelayUs(0),
-      _renderDelayUs(0),
-      _renderDelayOffsetSamples(0),
-      _playWarning(0),
-      _playError(0),
-      _recWarning(0),
-      _recError(0),
-      _paCaptureBuffer(NULL),
-      _paRenderBuffer(NULL),
-      _captureBufSizeSamples(0),
-      _renderBufSizeSamples(0),
-      prev_key_state_(),
-      get_mic_volume_counter_ms_(0) {
-  LOG(LS_INFO) << __FUNCTION__ << " created";
-
-  RTC_DCHECK(&_stopEvent != NULL);
-  RTC_DCHECK(&_stopEventRec != NULL);
-
-  memset(_renderConvertData, 0, sizeof(_renderConvertData));
-  memset(&_outStreamFormat, 0, sizeof(AudioStreamBasicDescription));
-  memset(&_outDesiredFormat, 0, sizeof(AudioStreamBasicDescription));
-  memset(&_inStreamFormat, 0, sizeof(AudioStreamBasicDescription));
-  memset(&_inDesiredFormat, 0, sizeof(AudioStreamBasicDescription));
-}
-
-AudioDeviceMac::~AudioDeviceMac() {
-  LOG(LS_INFO) << __FUNCTION__ << " destroyed";
-
-  if (!_isShutDown) {
-    Terminate();
-  }
-
-  RTC_DCHECK(!capture_worker_thread_.get());
-  RTC_DCHECK(!render_worker_thread_.get());
-
-  if (_paRenderBuffer) {
-    delete _paRenderBuffer;
-    _paRenderBuffer = NULL;
-  }
-
-  if (_paCaptureBuffer) {
-    delete _paCaptureBuffer;
-    _paCaptureBuffer = NULL;
-  }
-
-  if (_renderBufData) {
-    delete[] _renderBufData;
-    _renderBufData = NULL;
-  }
-
-  if (_captureBufData) {
-    delete[] _captureBufData;
-    _captureBufData = NULL;
-  }
-
-  kern_return_t kernErr = KERN_SUCCESS;
-  kernErr = semaphore_destroy(mach_task_self(), _renderSemaphore);
-  if (kernErr != KERN_SUCCESS) {
-    LOG(LS_ERROR) << "semaphore_destroy() error: " << kernErr;
-  }
-
-  kernErr = semaphore_destroy(mach_task_self(), _captureSemaphore);
-  if (kernErr != KERN_SUCCESS) {
-    LOG(LS_ERROR) << "semaphore_destroy() error: " << kernErr;
-  }
-
-  delete &_stopEvent;
-  delete &_stopEventRec;
-}
-
-// ============================================================================
-//                                     API
-// ============================================================================
-
-void AudioDeviceMac::AttachAudioBuffer(AudioDeviceBuffer* audioBuffer) {
-  rtc::CritScope lock(&_critSect);
-
-  _ptrAudioBuffer = audioBuffer;
-
-  // inform the AudioBuffer about default settings for this implementation
-  _ptrAudioBuffer->SetRecordingSampleRate(N_REC_SAMPLES_PER_SEC);
-  _ptrAudioBuffer->SetPlayoutSampleRate(N_PLAY_SAMPLES_PER_SEC);
-  _ptrAudioBuffer->SetRecordingChannels(N_REC_CHANNELS);
-  _ptrAudioBuffer->SetPlayoutChannels(N_PLAY_CHANNELS);
-}
-
-int32_t AudioDeviceMac::ActiveAudioLayer(
-    AudioDeviceModule::AudioLayer& audioLayer) const {
-  audioLayer = AudioDeviceModule::kPlatformDefaultAudio;
-  return 0;
-}
-
-AudioDeviceGeneric::InitStatus AudioDeviceMac::Init() {
-  rtc::CritScope lock(&_critSect);
-
-  if (_initialized) {
-    return InitStatus::OK;
-  }
-
-  OSStatus err = noErr;
-
-  _isShutDown = false;
-
-  // PortAudio ring buffers require an elementCount which is a power of two.
-  if (_renderBufData == NULL) {
-    UInt32 powerOfTwo = 1;
-    while (powerOfTwo < PLAY_BUF_SIZE_IN_SAMPLES) {
-      powerOfTwo <<= 1;
-    }
-    _renderBufSizeSamples = powerOfTwo;
-    _renderBufData = new SInt16[_renderBufSizeSamples];
-  }
-
-  if (_paRenderBuffer == NULL) {
-    _paRenderBuffer = new PaUtilRingBuffer;
-    PaRingBufferSize bufSize = -1;
-    bufSize = PaUtil_InitializeRingBuffer(
-        _paRenderBuffer, sizeof(SInt16), _renderBufSizeSamples, _renderBufData);
-    if (bufSize == -1) {
-      LOG(LS_ERROR) << "PaUtil_InitializeRingBuffer() error";
-      return InitStatus::PLAYOUT_ERROR;
-    }
-  }
-
-  if (_captureBufData == NULL) {
-    UInt32 powerOfTwo = 1;
-    while (powerOfTwo < REC_BUF_SIZE_IN_SAMPLES) {
-      powerOfTwo <<= 1;
-    }
-    _captureBufSizeSamples = powerOfTwo;
-    _captureBufData = new Float32[_captureBufSizeSamples];
-  }
-
-  if (_paCaptureBuffer == NULL) {
-    _paCaptureBuffer = new PaUtilRingBuffer;
-    PaRingBufferSize bufSize = -1;
-    bufSize =
-        PaUtil_InitializeRingBuffer(_paCaptureBuffer, sizeof(Float32),
-                                    _captureBufSizeSamples, _captureBufData);
-    if (bufSize == -1) {
-      LOG(LS_ERROR) << "PaUtil_InitializeRingBuffer() error";
-      return InitStatus::RECORDING_ERROR;
-    }
-  }
-
-  kern_return_t kernErr = KERN_SUCCESS;
-  kernErr = semaphore_create(mach_task_self(), &_renderSemaphore,
-                             SYNC_POLICY_FIFO, 0);
-  if (kernErr != KERN_SUCCESS) {
-    LOG(LS_ERROR) << "semaphore_create() error: " << kernErr;
-    return InitStatus::OTHER_ERROR;
-  }
-
-  kernErr = semaphore_create(mach_task_self(), &_captureSemaphore,
-                             SYNC_POLICY_FIFO, 0);
-  if (kernErr != KERN_SUCCESS) {
-    LOG(LS_ERROR) << "semaphore_create() error: " << kernErr;
-    return InitStatus::OTHER_ERROR;
-  }
-
-  // Setting RunLoop to NULL here instructs HAL to manage its own thread for
-  // notifications. This was the default behaviour on OS X 10.5 and earlier,
-  // but now must be explicitly specified. HAL would otherwise try to use the
-  // main thread to issue notifications.
-  AudioObjectPropertyAddress propertyAddress = {
-      kAudioHardwarePropertyRunLoop, kAudioObjectPropertyScopeGlobal,
-      kAudioObjectPropertyElementMaster};
-  CFRunLoopRef runLoop = NULL;
-  UInt32 size = sizeof(CFRunLoopRef);
-  int aoerr = AudioObjectSetPropertyData(
-      kAudioObjectSystemObject, &propertyAddress, 0, NULL, size, &runLoop);
-  if (aoerr != noErr) {
-    LOG(LS_ERROR) << "Error in AudioObjectSetPropertyData: "
-                  << (const char*)&aoerr;
-    return InitStatus::OTHER_ERROR;
-  }
-
-  // Listen for any device changes.
-  propertyAddress.mSelector = kAudioHardwarePropertyDevices;
-  WEBRTC_CA_LOG_ERR(AudioObjectAddPropertyListener(
-      kAudioObjectSystemObject, &propertyAddress, &objectListenerProc, this));
-
-  // Determine if this is a MacBook Pro
-  _macBookPro = false;
-  _macBookProPanRight = false;
-  char buf[128];
-  size_t length = sizeof(buf);
-  memset(buf, 0, length);
-
-  int intErr = sysctlbyname("hw.model", buf, &length, NULL, 0);
-  if (intErr != 0) {
-    LOG(LS_ERROR) << "Error in sysctlbyname(): " << err;
-  } else {
-    LOG(LS_VERBOSE) << "Hardware model: " << buf;
-    if (strncmp(buf, "MacBookPro", 10) == 0) {
-      _macBookPro = true;
-    }
-  }
-
-  _playWarning = 0;
-  _playError = 0;
-  _recWarning = 0;
-  _recError = 0;
-
-  get_mic_volume_counter_ms_ = 0;
-
-  _initialized = true;
-
-  return InitStatus::OK;
-}
-
-int32_t AudioDeviceMac::Terminate() {
-  if (!_initialized) {
-    return 0;
-  }
-
-  if (_recording) {
-    LOG(LS_ERROR) << "Recording must be stopped";
-    return -1;
-  }
-
-  if (_playing) {
-    LOG(LS_ERROR) << "Playback must be stopped";
-    return -1;
-  }
-
-  _critSect.Enter();
-
-  _mixerManager.Close();
-
-  OSStatus err = noErr;
-  int retVal = 0;
-
-  AudioObjectPropertyAddress propertyAddress = {
-      kAudioHardwarePropertyDevices, kAudioObjectPropertyScopeGlobal,
-      kAudioObjectPropertyElementMaster};
-  WEBRTC_CA_LOG_WARN(AudioObjectRemovePropertyListener(
-      kAudioObjectSystemObject, &propertyAddress, &objectListenerProc, this));
-
-  err = AudioHardwareUnload();
-  if (err != noErr) {
-    logCAMsg(rtc::LS_ERROR,
-             "Error in AudioHardwareUnload()", (const char*)&err);
-    retVal = -1;
-  }
-
-  _isShutDown = true;
-  _initialized = false;
-  _outputDeviceIsSpecified = false;
-  _inputDeviceIsSpecified = false;
-
-  _critSect.Leave();
-
-  return retVal;
-}
-
-bool AudioDeviceMac::Initialized() const {
-  return (_initialized);
-}
-
-int32_t AudioDeviceMac::SpeakerIsAvailable(bool& available) {
-  bool wasInitialized = _mixerManager.SpeakerIsInitialized();
-
-  // Make an attempt to open up the
-  // output mixer corresponding to the currently selected output device.
-  //
-  if (!wasInitialized && InitSpeaker() == -1) {
-    available = false;
-    return 0;
-  }
-
-  // Given that InitSpeaker was successful, we know that a valid speaker
-  // exists.
-  available = true;
-
-  // Close the initialized output mixer
-  //
-  if (!wasInitialized) {
-    _mixerManager.CloseSpeaker();
-  }
-
-  return 0;
-}
-
-int32_t AudioDeviceMac::InitSpeaker() {
-  rtc::CritScope lock(&_critSect);
-
-  if (_playing) {
-    return -1;
-  }
-
-  if (InitDevice(_outputDeviceIndex, _outputDeviceID, false) == -1) {
-    return -1;
-  }
-
-  if (_inputDeviceID == _outputDeviceID) {
-    _twoDevices = false;
-  } else {
-    _twoDevices = true;
-  }
-
-  if (_mixerManager.OpenSpeaker(_outputDeviceID) == -1) {
-    return -1;
-  }
-
-  return 0;
-}
-
-int32_t AudioDeviceMac::MicrophoneIsAvailable(bool& available) {
-  bool wasInitialized = _mixerManager.MicrophoneIsInitialized();
-
-  // Make an attempt to open up the
-  // input mixer corresponding to the currently selected output device.
-  //
-  if (!wasInitialized && InitMicrophone() == -1) {
-    available = false;
-    return 0;
-  }
-
-  // Given that InitMicrophone was successful, we know that a valid microphone
-  // exists.
-  available = true;
-
-  // Close the initialized input mixer
-  //
-  if (!wasInitialized) {
-    _mixerManager.CloseMicrophone();
-  }
-
-  return 0;
-}
-
-int32_t AudioDeviceMac::InitMicrophone() {
-  rtc::CritScope lock(&_critSect);
-
-  if (_recording) {
-    return -1;
-  }
-
-  if (InitDevice(_inputDeviceIndex, _inputDeviceID, true) == -1) {
-    return -1;
-  }
-
-  if (_inputDeviceID == _outputDeviceID) {
-    _twoDevices = false;
-  } else {
-    _twoDevices = true;
-  }
-
-  if (_mixerManager.OpenMicrophone(_inputDeviceID) == -1) {
-    return -1;
-  }
-
-  return 0;
-}
-
-bool AudioDeviceMac::SpeakerIsInitialized() const {
-  return (_mixerManager.SpeakerIsInitialized());
-}
-
-bool AudioDeviceMac::MicrophoneIsInitialized() const {
-  return (_mixerManager.MicrophoneIsInitialized());
-}
-
-int32_t AudioDeviceMac::SpeakerVolumeIsAvailable(bool& available) {
-  bool wasInitialized = _mixerManager.SpeakerIsInitialized();
-
-  // Make an attempt to open up the
-  // output mixer corresponding to the currently selected output device.
-  //
-  if (!wasInitialized && InitSpeaker() == -1) {
-    // If we end up here it means that the selected speaker has no volume
-    // control.
-    available = false;
-    return 0;
-  }
-
-  // Given that InitSpeaker was successful, we know that a volume control exists
-  //
-  available = true;
-
-  // Close the initialized output mixer
-  //
-  if (!wasInitialized) {
-    _mixerManager.CloseSpeaker();
-  }
-
-  return 0;
-}
-
-int32_t AudioDeviceMac::SetSpeakerVolume(uint32_t volume) {
-  return (_mixerManager.SetSpeakerVolume(volume));
-}
-
-int32_t AudioDeviceMac::SpeakerVolume(uint32_t& volume) const {
-  uint32_t level(0);
-
-  if (_mixerManager.SpeakerVolume(level) == -1) {
-    return -1;
-  }
-
-  volume = level;
-  return 0;
-}
-
-int32_t AudioDeviceMac::MaxSpeakerVolume(uint32_t& maxVolume) const {
-  uint32_t maxVol(0);
-
-  if (_mixerManager.MaxSpeakerVolume(maxVol) == -1) {
-    return -1;
-  }
-
-  maxVolume = maxVol;
-  return 0;
-}
-
-int32_t AudioDeviceMac::MinSpeakerVolume(uint32_t& minVolume) const {
-  uint32_t minVol(0);
-
-  if (_mixerManager.MinSpeakerVolume(minVol) == -1) {
-    return -1;
-  }
-
-  minVolume = minVol;
-  return 0;
-}
-
-int32_t AudioDeviceMac::SpeakerMuteIsAvailable(bool& available) {
-  bool isAvailable(false);
-  bool wasInitialized = _mixerManager.SpeakerIsInitialized();
-
-  // Make an attempt to open up the
-  // output mixer corresponding to the currently selected output device.
-  //
-  if (!wasInitialized && InitSpeaker() == -1) {
-    // If we end up here it means that the selected speaker has no volume
-    // control, hence it is safe to state that there is no mute control
-    // already at this stage.
-    available = false;
-    return 0;
-  }
-
-  // Check if the selected speaker has a mute control
-  //
-  _mixerManager.SpeakerMuteIsAvailable(isAvailable);
-
-  available = isAvailable;
-
-  // Close the initialized output mixer
-  //
-  if (!wasInitialized) {
-    _mixerManager.CloseSpeaker();
-  }
-
-  return 0;
-}
-
-int32_t AudioDeviceMac::SetSpeakerMute(bool enable) {
-  return (_mixerManager.SetSpeakerMute(enable));
-}
-
-int32_t AudioDeviceMac::SpeakerMute(bool& enabled) const {
-  bool muted(0);
-
-  if (_mixerManager.SpeakerMute(muted) == -1) {
-    return -1;
-  }
-
-  enabled = muted;
-  return 0;
-}
-
-int32_t AudioDeviceMac::MicrophoneMuteIsAvailable(bool& available) {
-  bool isAvailable(false);
-  bool wasInitialized = _mixerManager.MicrophoneIsInitialized();
-
-  // Make an attempt to open up the
-  // input mixer corresponding to the currently selected input device.
-  //
-  if (!wasInitialized && InitMicrophone() == -1) {
-    // If we end up here it means that the selected microphone has no volume
-    // control, hence it is safe to state that there is no boost control
-    // already at this stage.
-    available = false;
-    return 0;
-  }
-
-  // Check if the selected microphone has a mute control
-  //
-  _mixerManager.MicrophoneMuteIsAvailable(isAvailable);
-  available = isAvailable;
-
-  // Close the initialized input mixer
-  //
-  if (!wasInitialized) {
-    _mixerManager.CloseMicrophone();
-  }
-
-  return 0;
-}
-
-int32_t AudioDeviceMac::SetMicrophoneMute(bool enable) {
-  return (_mixerManager.SetMicrophoneMute(enable));
-}
-
-int32_t AudioDeviceMac::MicrophoneMute(bool& enabled) const {
-  bool muted(0);
-
-  if (_mixerManager.MicrophoneMute(muted) == -1) {
-    return -1;
-  }
-
-  enabled = muted;
-  return 0;
-}
-
-int32_t AudioDeviceMac::StereoRecordingIsAvailable(bool& available) {
-  bool isAvailable(false);
-  bool wasInitialized = _mixerManager.MicrophoneIsInitialized();
-
-  if (!wasInitialized && InitMicrophone() == -1) {
-    // Cannot open the specified device
-    available = false;
-    return 0;
-  }
-
-  // Check if the selected microphone can record stereo
-  //
-  _mixerManager.StereoRecordingIsAvailable(isAvailable);
-  available = isAvailable;
-
-  // Close the initialized input mixer
-  //
-  if (!wasInitialized) {
-    _mixerManager.CloseMicrophone();
-  }
-
-  return 0;
-}
-
-int32_t AudioDeviceMac::SetStereoRecording(bool enable) {
-  if (enable)
-    _recChannels = 2;
-  else
-    _recChannels = 1;
-
-  return 0;
-}
-
-int32_t AudioDeviceMac::StereoRecording(bool& enabled) const {
-  if (_recChannels == 2)
-    enabled = true;
-  else
-    enabled = false;
-
-  return 0;
-}
-
-int32_t AudioDeviceMac::StereoPlayoutIsAvailable(bool& available) {
-  bool isAvailable(false);
-  bool wasInitialized = _mixerManager.SpeakerIsInitialized();
-
-  if (!wasInitialized && InitSpeaker() == -1) {
-    // Cannot open the specified device
-    available = false;
-    return 0;
-  }
-
-  // Check if the selected microphone can record stereo
-  //
-  _mixerManager.StereoPlayoutIsAvailable(isAvailable);
-  available = isAvailable;
-
-  // Close the initialized input mixer
-  //
-  if (!wasInitialized) {
-    _mixerManager.CloseSpeaker();
-  }
-
-  return 0;
-}
-
-int32_t AudioDeviceMac::SetStereoPlayout(bool enable) {
-  if (enable)
-    _playChannels = 2;
-  else
-    _playChannels = 1;
-
-  return 0;
-}
-
-int32_t AudioDeviceMac::StereoPlayout(bool& enabled) const {
-  if (_playChannels == 2)
-    enabled = true;
-  else
-    enabled = false;
-
-  return 0;
-}
-
-int32_t AudioDeviceMac::SetAGC(bool enable) {
-  _AGC = enable;
-
-  return 0;
-}
-
-bool AudioDeviceMac::AGC() const {
-  return _AGC;
-}
-
-int32_t AudioDeviceMac::MicrophoneVolumeIsAvailable(bool& available) {
-  bool wasInitialized = _mixerManager.MicrophoneIsInitialized();
-
-  // Make an attempt to open up the
-  // input mixer corresponding to the currently selected output device.
-  //
-  if (!wasInitialized && InitMicrophone() == -1) {
-    // If we end up here it means that the selected microphone has no volume
-    // control.
-    available = false;
-    return 0;
-  }
-
-  // Given that InitMicrophone was successful, we know that a volume control
-  // exists
-  //
-  available = true;
-
-  // Close the initialized input mixer
-  //
-  if (!wasInitialized) {
-    _mixerManager.CloseMicrophone();
-  }
-
-  return 0;
-}
-
-int32_t AudioDeviceMac::SetMicrophoneVolume(uint32_t volume) {
-  return (_mixerManager.SetMicrophoneVolume(volume));
-}
-
-int32_t AudioDeviceMac::MicrophoneVolume(uint32_t& volume) const {
-  uint32_t level(0);
-
-  if (_mixerManager.MicrophoneVolume(level) == -1) {
-    LOG(LS_WARNING) << "failed to retrieve current microphone level";
-    return -1;
-  }
-
-  volume = level;
-  return 0;
-}
-
-int32_t AudioDeviceMac::MaxMicrophoneVolume(uint32_t& maxVolume) const {
-  uint32_t maxVol(0);
-
-  if (_mixerManager.MaxMicrophoneVolume(maxVol) == -1) {
-    return -1;
-  }
-
-  maxVolume = maxVol;
-  return 0;
-}
-
-int32_t AudioDeviceMac::MinMicrophoneVolume(uint32_t& minVolume) const {
-  uint32_t minVol(0);
-
-  if (_mixerManager.MinMicrophoneVolume(minVol) == -1) {
-    return -1;
-  }
-
-  minVolume = minVol;
-  return 0;
-}
-
-int16_t AudioDeviceMac::PlayoutDevices() {
-  AudioDeviceID playDevices[MaxNumberDevices];
-  return GetNumberDevices(kAudioDevicePropertyScopeOutput, playDevices,
-                          MaxNumberDevices);
-}
-
-int32_t AudioDeviceMac::SetPlayoutDevice(uint16_t index) {
-  rtc::CritScope lock(&_critSect);
-
-  if (_playIsInitialized) {
-    return -1;
-  }
-
-  AudioDeviceID playDevices[MaxNumberDevices];
-  uint32_t nDevices = GetNumberDevices(kAudioDevicePropertyScopeOutput,
-                                       playDevices, MaxNumberDevices);
-  LOG(LS_VERBOSE) << "number of available waveform-audio output devices is "
-                  << nDevices;
-
-  if (index > (nDevices - 1)) {
-    LOG(LS_ERROR) << "device index is out of range [0," << (nDevices - 1)
-                  << "]";
-    return -1;
-  }
-
-  _outputDeviceIndex = index;
-  _outputDeviceIsSpecified = true;
-
-  return 0;
-}
-
-int32_t AudioDeviceMac::SetPlayoutDevice(
-    AudioDeviceModule::WindowsDeviceType /*device*/) {
-  LOG(LS_ERROR) << "WindowsDeviceType not supported";
-  return -1;
-}
-
-int32_t AudioDeviceMac::PlayoutDeviceName(uint16_t index,
-                                          char name[kAdmMaxDeviceNameSize],
-                                          char guid[kAdmMaxGuidSize]) {
-  const uint16_t nDevices(PlayoutDevices());
-
-  if ((index > (nDevices - 1)) || (name == NULL)) {
-    return -1;
-  }
-
-  memset(name, 0, kAdmMaxDeviceNameSize);
-
-  if (guid != NULL) {
-    memset(guid, 0, kAdmMaxGuidSize);
-  }
-
-  return GetDeviceName(kAudioDevicePropertyScopeOutput, index, name);
-}
-
-int32_t AudioDeviceMac::RecordingDeviceName(uint16_t index,
-                                            char name[kAdmMaxDeviceNameSize],
-                                            char guid[kAdmMaxGuidSize]) {
-  const uint16_t nDevices(RecordingDevices());
-
-  if ((index > (nDevices - 1)) || (name == NULL)) {
-    return -1;
-  }
-
-  memset(name, 0, kAdmMaxDeviceNameSize);
-
-  if (guid != NULL) {
-    memset(guid, 0, kAdmMaxGuidSize);
-  }
-
-  return GetDeviceName(kAudioDevicePropertyScopeInput, index, name);
-}
-
-int16_t AudioDeviceMac::RecordingDevices() {
-  AudioDeviceID recDevices[MaxNumberDevices];
-  return GetNumberDevices(kAudioDevicePropertyScopeInput, recDevices,
-                          MaxNumberDevices);
-}
-
-int32_t AudioDeviceMac::SetRecordingDevice(uint16_t index) {
-  if (_recIsInitialized) {
-    return -1;
-  }
-
-  AudioDeviceID recDevices[MaxNumberDevices];
-  uint32_t nDevices = GetNumberDevices(kAudioDevicePropertyScopeInput,
-                                       recDevices, MaxNumberDevices);
-  LOG(LS_VERBOSE) << "number of available waveform-audio input devices is "
-                  << nDevices;
-
-  if (index > (nDevices - 1)) {
-    LOG(LS_ERROR) << "device index is out of range [0," << (nDevices - 1)
-                  << "]";
-    return -1;
-  }
-
-  _inputDeviceIndex = index;
-  _inputDeviceIsSpecified = true;
-
-  return 0;
-}
-
-int32_t AudioDeviceMac::SetRecordingDevice(
-    AudioDeviceModule::WindowsDeviceType /*device*/) {
-  LOG(LS_ERROR) << "WindowsDeviceType not supported";
-  return -1;
-}
-
-int32_t AudioDeviceMac::PlayoutIsAvailable(bool& available) {
-  available = true;
-
-  // Try to initialize the playout side
-  if (InitPlayout() == -1) {
-    available = false;
-  }
-
-  // We destroy the IOProc created by InitPlayout() in implDeviceIOProc().
-  // We must actually start playout here in order to have the IOProc
-  // deleted by calling StopPlayout().
-  if (StartPlayout() == -1) {
-    available = false;
-  }
-
-  // Cancel effect of initialization
-  if (StopPlayout() == -1) {
-    available = false;
-  }
-
-  return 0;
-}
-
-int32_t AudioDeviceMac::RecordingIsAvailable(bool& available) {
-  available = true;
-
-  // Try to initialize the recording side
-  if (InitRecording() == -1) {
-    available = false;
-  }
-
-  // We destroy the IOProc created by InitRecording() in implInDeviceIOProc().
-  // We must actually start recording here in order to have the IOProc
-  // deleted by calling StopRecording().
-  if (StartRecording() == -1) {
-    available = false;
-  }
-
-  // Cancel effect of initialization
-  if (StopRecording() == -1) {
-    available = false;
-  }
-
-  return 0;
-}
-
-int32_t AudioDeviceMac::InitPlayout() {
-  rtc::CritScope lock(&_critSect);
-
-  if (_playing) {
-    return -1;
-  }
-
-  if (!_outputDeviceIsSpecified) {
-    return -1;
-  }
-
-  if (_playIsInitialized) {
-    return 0;
-  }
-
-  // Initialize the speaker (devices might have been added or removed)
-  if (InitSpeaker() == -1) {
-    LOG(LS_WARNING) << "InitSpeaker() failed";
-  }
-
-  if (!MicrophoneIsInitialized()) {
-    // Make this call to check if we are using
-    // one or two devices (_twoDevices)
-    bool available = false;
-    if (MicrophoneIsAvailable(available) == -1) {
-      LOG(LS_WARNING) << "MicrophoneIsAvailable() failed";
-    }
-  }
-
-  PaUtil_FlushRingBuffer(_paRenderBuffer);
-
-  OSStatus err = noErr;
-  UInt32 size = 0;
-  _renderDelayOffsetSamples = 0;
-  _renderDelayUs = 0;
-  _renderLatencyUs = 0;
-  _renderDeviceIsAlive = 1;
-  _doStop = false;
-
-  // The internal microphone of a MacBook Pro is located under the left speaker
-  // grille. When the internal speakers are in use, we want to fully stereo
-  // pan to the right.
-  AudioObjectPropertyAddress propertyAddress = {
-      kAudioDevicePropertyDataSource, kAudioDevicePropertyScopeOutput, 0};
-  if (_macBookPro) {
-    _macBookProPanRight = false;
-    Boolean hasProperty =
-        AudioObjectHasProperty(_outputDeviceID, &propertyAddress);
-    if (hasProperty) {
-      UInt32 dataSource = 0;
-      size = sizeof(dataSource);
-      WEBRTC_CA_LOG_WARN(AudioObjectGetPropertyData(
-          _outputDeviceID, &propertyAddress, 0, NULL, &size, &dataSource));
-
-      if (dataSource == 'ispk') {
-        _macBookProPanRight = true;
-        LOG(LS_VERBOSE)
-            << "MacBook Pro using internal speakers; stereo panning right";
-      } else {
-        LOG(LS_VERBOSE) << "MacBook Pro not using internal speakers";
-      }
-
-      // Add a listener to determine if the status changes.
-      WEBRTC_CA_LOG_WARN(AudioObjectAddPropertyListener(
-          _outputDeviceID, &propertyAddress, &objectListenerProc, this));
-    }
-  }
-
-  // Get current stream description
-  propertyAddress.mSelector = kAudioDevicePropertyStreamFormat;
-  memset(&_outStreamFormat, 0, sizeof(_outStreamFormat));
-  size = sizeof(_outStreamFormat);
-  WEBRTC_CA_RETURN_ON_ERR(AudioObjectGetPropertyData(
-      _outputDeviceID, &propertyAddress, 0, NULL, &size, &_outStreamFormat));
-
-  if (_outStreamFormat.mFormatID != kAudioFormatLinearPCM) {
-    logCAMsg(rtc::LS_ERROR,
-             "Unacceptable output stream format -> mFormatID",
-             (const char*)&_outStreamFormat.mFormatID);
-    return -1;
-  }
-
-  if (_outStreamFormat.mChannelsPerFrame > N_DEVICE_CHANNELS) {
-    LOG(LS_ERROR) << "Too many channels on output device (mChannelsPerFrame = "
-                  << _outStreamFormat.mChannelsPerFrame << ")";
-    return -1;
-  }
-
-  if (_outStreamFormat.mFormatFlags & kAudioFormatFlagIsNonInterleaved) {
-    LOG(LS_ERROR) << "Non-interleaved audio data is not supported."
-                  << "AudioHardware streams should not have this format.";
-    return -1;
-  }
-
-  LOG(LS_VERBOSE) << "Ouput stream format:";
-  LOG(LS_VERBOSE) << "mSampleRate = " << _outStreamFormat.mSampleRate
-                  << ", mChannelsPerFrame = "
-                  << _outStreamFormat.mChannelsPerFrame;
-  LOG(LS_VERBOSE) << "mBytesPerPacket = " << _outStreamFormat.mBytesPerPacket
-                  << ", mFramesPerPacket = "
-                  << _outStreamFormat.mFramesPerPacket;
-  LOG(LS_VERBOSE) << "mBytesPerFrame = " << _outStreamFormat.mBytesPerFrame
-                  << ", mBitsPerChannel = " << _outStreamFormat.mBitsPerChannel;
-  LOG(LS_VERBOSE) << "mFormatFlags = " << _outStreamFormat.mFormatFlags;
-  logCAMsg(rtc::LS_VERBOSE, "mFormatID",
-           (const char*)&_outStreamFormat.mFormatID);
-
-  // Our preferred format to work with.
-  if (_outStreamFormat.mChannelsPerFrame < 2) {
-    // Disable stereo playout when we only have one channel on the device.
-    _playChannels = 1;
-    LOG(LS_VERBOSE) << "Stereo playout unavailable on this device";
-  }
-  WEBRTC_CA_RETURN_ON_ERR(SetDesiredPlayoutFormat());
-
-  // Listen for format changes.
-  propertyAddress.mSelector = kAudioDevicePropertyStreamFormat;
-  WEBRTC_CA_LOG_WARN(AudioObjectAddPropertyListener(
-      _outputDeviceID, &propertyAddress, &objectListenerProc, this));
-
-  // Listen for processor overloads.
-  propertyAddress.mSelector = kAudioDeviceProcessorOverload;
-  WEBRTC_CA_LOG_WARN(AudioObjectAddPropertyListener(
-      _outputDeviceID, &propertyAddress, &objectListenerProc, this));
-
-  if (_twoDevices || !_recIsInitialized) {
-    WEBRTC_CA_RETURN_ON_ERR(AudioDeviceCreateIOProcID(
-        _outputDeviceID, deviceIOProc, this, &_deviceIOProcID));
-  }
-
-  _playIsInitialized = true;
-
-  return 0;
-}
-
-int32_t AudioDeviceMac::InitRecording() {
-  rtc::CritScope lock(&_critSect);
-
-  if (_recording) {
-    return -1;
-  }
-
-  if (!_inputDeviceIsSpecified) {
-    return -1;
-  }
-
-  if (_recIsInitialized) {
-    return 0;
-  }
-
-  // Initialize the microphone (devices might have been added or removed)
-  if (InitMicrophone() == -1) {
-    LOG(LS_WARNING) << "InitMicrophone() failed";
-  }
-
-  if (!SpeakerIsInitialized()) {
-    // Make this call to check if we are using
-    // one or two devices (_twoDevices)
-    bool available = false;
-    if (SpeakerIsAvailable(available) == -1) {
-      LOG(LS_WARNING) << "SpeakerIsAvailable() failed";
-    }
-  }
-
-  OSStatus err = noErr;
-  UInt32 size = 0;
-
-  PaUtil_FlushRingBuffer(_paCaptureBuffer);
-
-  _captureDelayUs = 0;
-  _captureLatencyUs = 0;
-  _captureDeviceIsAlive = 1;
-  _doStopRec = false;
-
-  // Get current stream description
-  AudioObjectPropertyAddress propertyAddress = {
-      kAudioDevicePropertyStreamFormat, kAudioDevicePropertyScopeInput, 0};
-  memset(&_inStreamFormat, 0, sizeof(_inStreamFormat));
-  size = sizeof(_inStreamFormat);
-  WEBRTC_CA_RETURN_ON_ERR(AudioObjectGetPropertyData(
-      _inputDeviceID, &propertyAddress, 0, NULL, &size, &_inStreamFormat));
-
-  if (_inStreamFormat.mFormatID != kAudioFormatLinearPCM) {
-    logCAMsg(rtc::LS_ERROR,
-             "Unacceptable input stream format -> mFormatID",
-             (const char*)&_inStreamFormat.mFormatID);
-    return -1;
-  }
-
-  if (_inStreamFormat.mChannelsPerFrame > N_DEVICE_CHANNELS) {
-    LOG(LS_ERROR) << "Too many channels on input device (mChannelsPerFrame = "
-                  << _inStreamFormat.mChannelsPerFrame << ")";
-    return -1;
-  }
-
-  const int io_block_size_samples = _inStreamFormat.mChannelsPerFrame *
-                                    _inStreamFormat.mSampleRate / 100 *
-                                    N_BLOCKS_IO;
-  if (io_block_size_samples > _captureBufSizeSamples) {
-    LOG(LS_ERROR) << "Input IO block size (" << io_block_size_samples
-                  << ") is larger than ring buffer (" << _captureBufSizeSamples
-                  << ")";
-    return -1;
-  }
-
-  LOG(LS_VERBOSE) << "Input stream format:";
-  LOG(LS_VERBOSE) << "mSampleRate = " << _inStreamFormat.mSampleRate
-                  << ", mChannelsPerFrame = "
-                  << _inStreamFormat.mChannelsPerFrame;
-  LOG(LS_VERBOSE) << "mBytesPerPacket = " << _inStreamFormat.mBytesPerPacket
-                  << ", mFramesPerPacket = "
-                  << _inStreamFormat.mFramesPerPacket;
-  LOG(LS_VERBOSE) << "mBytesPerFrame = " << _inStreamFormat.mBytesPerFrame
-                  << ", mBitsPerChannel = " << _inStreamFormat.mBitsPerChannel;
-  LOG(LS_VERBOSE) << "mFormatFlags = " << _inStreamFormat.mFormatFlags;
-  logCAMsg(rtc::LS_VERBOSE, "mFormatID",
-           (const char*)&_inStreamFormat.mFormatID);
-
-  // Our preferred format to work with
-  if (_inStreamFormat.mChannelsPerFrame >= 2 && (_recChannels == 2)) {
-    _inDesiredFormat.mChannelsPerFrame = 2;
-  } else {
-    // Disable stereo recording when we only have one channel on the device.
-    _inDesiredFormat.mChannelsPerFrame = 1;
-    _recChannels = 1;
-    LOG(LS_VERBOSE) << "Stereo recording unavailable on this device";
-  }
-
-  if (_ptrAudioBuffer) {
-    // Update audio buffer with the selected parameters
-    _ptrAudioBuffer->SetRecordingSampleRate(N_REC_SAMPLES_PER_SEC);
-    _ptrAudioBuffer->SetRecordingChannels((uint8_t)_recChannels);
-  }
-
-  _inDesiredFormat.mSampleRate = N_REC_SAMPLES_PER_SEC;
-  _inDesiredFormat.mBytesPerPacket =
-      _inDesiredFormat.mChannelsPerFrame * sizeof(SInt16);
-  _inDesiredFormat.mFramesPerPacket = 1;
-  _inDesiredFormat.mBytesPerFrame =
-      _inDesiredFormat.mChannelsPerFrame * sizeof(SInt16);
-  _inDesiredFormat.mBitsPerChannel = sizeof(SInt16) * 8;
-
-  _inDesiredFormat.mFormatFlags =
-      kLinearPCMFormatFlagIsSignedInteger | kLinearPCMFormatFlagIsPacked;
-#ifdef WEBRTC_ARCH_BIG_ENDIAN
-  _inDesiredFormat.mFormatFlags |= kLinearPCMFormatFlagIsBigEndian;
-#endif
-  _inDesiredFormat.mFormatID = kAudioFormatLinearPCM;
-
-  WEBRTC_CA_RETURN_ON_ERR(AudioConverterNew(&_inStreamFormat, &_inDesiredFormat,
-                                            &_captureConverter));
-
-  // First try to set buffer size to desired value (10 ms * N_BLOCKS_IO)
-  // TODO(xians): investigate this block.
-  UInt32 bufByteCount =
-      (UInt32)((_inStreamFormat.mSampleRate / 1000.0) * 10.0 * N_BLOCKS_IO *
-               _inStreamFormat.mChannelsPerFrame * sizeof(Float32));
-  if (_inStreamFormat.mFramesPerPacket != 0) {
-    if (bufByteCount % _inStreamFormat.mFramesPerPacket != 0) {
-      bufByteCount =
-          ((UInt32)(bufByteCount / _inStreamFormat.mFramesPerPacket) + 1) *
-          _inStreamFormat.mFramesPerPacket;
-    }
-  }
-
-  // Ensure the buffer size is within the acceptable range provided by the
-  // device.
-  propertyAddress.mSelector = kAudioDevicePropertyBufferSizeRange;
-  AudioValueRange range;
-  size = sizeof(range);
-  WEBRTC_CA_RETURN_ON_ERR(AudioObjectGetPropertyData(
-      _inputDeviceID, &propertyAddress, 0, NULL, &size, &range));
-  if (range.mMinimum > bufByteCount) {
-    bufByteCount = range.mMinimum;
-  } else if (range.mMaximum < bufByteCount) {
-    bufByteCount = range.mMaximum;
-  }
-
-  propertyAddress.mSelector = kAudioDevicePropertyBufferSize;
-  size = sizeof(bufByteCount);
-  WEBRTC_CA_RETURN_ON_ERR(AudioObjectSetPropertyData(
-      _inputDeviceID, &propertyAddress, 0, NULL, size, &bufByteCount));
-
-  // Get capture device latency
-  propertyAddress.mSelector = kAudioDevicePropertyLatency;
-  UInt32 latency = 0;
-  size = sizeof(UInt32);
-  WEBRTC_CA_RETURN_ON_ERR(AudioObjectGetPropertyData(
-      _inputDeviceID, &propertyAddress, 0, NULL, &size, &latency));
-  _captureLatencyUs = (UInt32)((1.0e6 * latency) / _inStreamFormat.mSampleRate);
-
-  // Get capture stream latency
-  propertyAddress.mSelector = kAudioDevicePropertyStreams;
-  AudioStreamID stream = 0;
-  size = sizeof(AudioStreamID);
-  WEBRTC_CA_RETURN_ON_ERR(AudioObjectGetPropertyData(
-      _inputDeviceID, &propertyAddress, 0, NULL, &size, &stream));
-  propertyAddress.mSelector = kAudioStreamPropertyLatency;
-  size = sizeof(UInt32);
-  latency = 0;
-  WEBRTC_CA_RETURN_ON_ERR(AudioObjectGetPropertyData(
-      _inputDeviceID, &propertyAddress, 0, NULL, &size, &latency));
-  _captureLatencyUs +=
-      (UInt32)((1.0e6 * latency) / _inStreamFormat.mSampleRate);
-
-  // Listen for format changes
-  // TODO(xians): should we be using kAudioDevicePropertyDeviceHasChanged?
-  propertyAddress.mSelector = kAudioDevicePropertyStreamFormat;
-  WEBRTC_CA_LOG_WARN(AudioObjectAddPropertyListener(
-      _inputDeviceID, &propertyAddress, &objectListenerProc, this));
-
-  // Listen for processor overloads
-  propertyAddress.mSelector = kAudioDeviceProcessorOverload;
-  WEBRTC_CA_LOG_WARN(AudioObjectAddPropertyListener(
-      _inputDeviceID, &propertyAddress, &objectListenerProc, this));
-
-  if (_twoDevices) {
-    WEBRTC_CA_RETURN_ON_ERR(AudioDeviceCreateIOProcID(
-        _inputDeviceID, inDeviceIOProc, this, &_inDeviceIOProcID));
-  } else if (!_playIsInitialized) {
-    WEBRTC_CA_RETURN_ON_ERR(AudioDeviceCreateIOProcID(
-        _inputDeviceID, deviceIOProc, this, &_deviceIOProcID));
-  }
-
-  // Mark recording side as initialized
-  _recIsInitialized = true;
-
-  return 0;
-}
-
-int32_t AudioDeviceMac::StartRecording() {
-  rtc::CritScope lock(&_critSect);
-
-  if (!_recIsInitialized) {
-    return -1;
-  }
-
-  if (_recording) {
-    return 0;
-  }
-
-  if (!_initialized) {
-    LOG(LS_ERROR) << "Recording worker thread has not been started";
-    return -1;
-  }
-
-  RTC_DCHECK(!capture_worker_thread_.get());
-  capture_worker_thread_.reset(
-      new rtc::PlatformThread(RunCapture, this, "CaptureWorkerThread"));
-  RTC_DCHECK(capture_worker_thread_.get());
-  capture_worker_thread_->Start();
-  capture_worker_thread_->SetPriority(rtc::kRealtimePriority);
-
-  OSStatus err = noErr;
-  if (_twoDevices) {
-    WEBRTC_CA_RETURN_ON_ERR(
-        AudioDeviceStart(_inputDeviceID, _inDeviceIOProcID));
-  } else if (!_playing) {
-    WEBRTC_CA_RETURN_ON_ERR(AudioDeviceStart(_inputDeviceID, _deviceIOProcID));
-  }
-
-  _recording = true;
-
-  return 0;
-}
-
-int32_t AudioDeviceMac::StopRecording() {
-  rtc::CritScope lock(&_critSect);
-
-  if (!_recIsInitialized) {
-    return 0;
-  }
-
-  OSStatus err = noErr;
-
-  // Stop device
-  int32_t captureDeviceIsAlive = AtomicGet32(&_captureDeviceIsAlive);
-  if (_twoDevices) {
-    if (_recording && captureDeviceIsAlive == 1) {
-      _recording = false;
-      _doStopRec = true;  // Signal to io proc to stop audio device
-      _critSect.Leave();  // Cannot be under lock, risk of deadlock
-      if (kEventTimeout == _stopEventRec.Wait(2000)) {
-        rtc::CritScope critScoped(&_critSect);
-        LOG(LS_WARNING)
-            << "Timed out stopping the capture IOProc."
-            << "We may have failed to detect a device removal.";
-
-        WEBRTC_CA_LOG_WARN(AudioDeviceStop(_inputDeviceID, _inDeviceIOProcID));
-        WEBRTC_CA_LOG_WARN(
-            AudioDeviceDestroyIOProcID(_inputDeviceID, _inDeviceIOProcID));
-      }
-      _critSect.Enter();
-      _doStopRec = false;
-      LOG(LS_VERBOSE) << "Recording stopped";
-    }
-  } else {
-    // We signal a stop for a shared device even when rendering has
-    // not yet ended. This is to ensure the IOProc will return early as
-    // intended (by checking |_recording|) before accessing
-    // resources we free below (e.g. the capture converter).
-    //
-    // In the case of a shared devcie, the IOProc will verify
-    // rendering has ended before stopping itself.
-    if (_recording && captureDeviceIsAlive == 1) {
-      _recording = false;
-      _doStop = true;     // Signal to io proc to stop audio device
-      _critSect.Leave();  // Cannot be under lock, risk of deadlock
-      if (kEventTimeout == _stopEvent.Wait(2000)) {
-        rtc::CritScope critScoped(&_critSect);
-        LOG(LS_WARNING)
-            << "Timed out stopping the shared IOProc."
-            << "We may have failed to detect a device removal.";
-
-        // We assume rendering on a shared device has stopped as well if
-        // the IOProc times out.
-        WEBRTC_CA_LOG_WARN(AudioDeviceStop(_outputDeviceID, _deviceIOProcID));
-        WEBRTC_CA_LOG_WARN(
-            AudioDeviceDestroyIOProcID(_outputDeviceID, _deviceIOProcID));
-      }
-      _critSect.Enter();
-      _doStop = false;
-      LOG(LS_VERBOSE) << "Recording stopped (shared)";
-    }
-  }
-
-  // Setting this signal will allow the worker thread to be stopped.
-  AtomicSet32(&_captureDeviceIsAlive, 0);
-
-  if (capture_worker_thread_.get()) {
-    _critSect.Leave();
-    capture_worker_thread_->Stop();
-    capture_worker_thread_.reset();
-    _critSect.Enter();
-  }
-
-  WEBRTC_CA_LOG_WARN(AudioConverterDispose(_captureConverter));
-
-  // Remove listeners.
-  AudioObjectPropertyAddress propertyAddress = {
-      kAudioDevicePropertyStreamFormat, kAudioDevicePropertyScopeInput, 0};
-  WEBRTC_CA_LOG_WARN(AudioObjectRemovePropertyListener(
-      _inputDeviceID, &propertyAddress, &objectListenerProc, this));
-
-  propertyAddress.mSelector = kAudioDeviceProcessorOverload;
-  WEBRTC_CA_LOG_WARN(AudioObjectRemovePropertyListener(
-      _inputDeviceID, &propertyAddress, &objectListenerProc, this));
-
-  _recIsInitialized = false;
-  _recording = false;
-
-  return 0;
-}
-
-bool AudioDeviceMac::RecordingIsInitialized() const {
-  return (_recIsInitialized);
-}
-
-bool AudioDeviceMac::Recording() const {
-  return (_recording);
-}
-
-bool AudioDeviceMac::PlayoutIsInitialized() const {
-  return (_playIsInitialized);
-}
-
-int32_t AudioDeviceMac::StartPlayout() {
-  rtc::CritScope lock(&_critSect);
-
-  if (!_playIsInitialized) {
-    return -1;
-  }
-
-  if (_playing) {
-    return 0;
-  }
-
-  RTC_DCHECK(!render_worker_thread_.get());
-  render_worker_thread_.reset(
-      new rtc::PlatformThread(RunRender, this, "RenderWorkerThread"));
-  render_worker_thread_->Start();
-  render_worker_thread_->SetPriority(rtc::kRealtimePriority);
-
-  if (_twoDevices || !_recording) {
-    OSStatus err = noErr;
-    WEBRTC_CA_RETURN_ON_ERR(AudioDeviceStart(_outputDeviceID, _deviceIOProcID));
-  }
-  _playing = true;
-
-  return 0;
-}
-
-int32_t AudioDeviceMac::StopPlayout() {
-  rtc::CritScope lock(&_critSect);
-
-  if (!_playIsInitialized) {
-    return 0;
-  }
-
-  OSStatus err = noErr;
-
-  int32_t renderDeviceIsAlive = AtomicGet32(&_renderDeviceIsAlive);
-  if (_playing && renderDeviceIsAlive == 1) {
-    // We signal a stop for a shared device even when capturing has not
-    // yet ended. This is to ensure the IOProc will return early as
-    // intended (by checking |_playing|) before accessing resources we
-    // free below (e.g. the render converter).
-    //
-    // In the case of a shared device, the IOProc will verify capturing
-    // has ended before stopping itself.
-    _playing = false;
-    _doStop = true;     // Signal to io proc to stop audio device
-    _critSect.Leave();  // Cannot be under lock, risk of deadlock
-    if (kEventTimeout == _stopEvent.Wait(2000)) {
-      rtc::CritScope critScoped(&_critSect);
-      LOG(LS_WARNING)
-          << "Timed out stopping the render IOProc."
-          << "We may have failed to detect a device removal.";
-
-      // We assume capturing on a shared device has stopped as well if the
-      // IOProc times out.
-      WEBRTC_CA_LOG_WARN(AudioDeviceStop(_outputDeviceID, _deviceIOProcID));
-      WEBRTC_CA_LOG_WARN(
-          AudioDeviceDestroyIOProcID(_outputDeviceID, _deviceIOProcID));
-    }
-    _critSect.Enter();
-    _doStop = false;
-    LOG(LS_VERBOSE) << "Playout stopped";
-  }
-
-  // Setting this signal will allow the worker thread to be stopped.
-  AtomicSet32(&_renderDeviceIsAlive, 0);
-  if (render_worker_thread_.get()) {
-    _critSect.Leave();
-    render_worker_thread_->Stop();
-    render_worker_thread_.reset();
-    _critSect.Enter();
-  }
-
-  WEBRTC_CA_LOG_WARN(AudioConverterDispose(_renderConverter));
-
-  // Remove listeners.
-  AudioObjectPropertyAddress propertyAddress = {
-      kAudioDevicePropertyStreamFormat, kAudioDevicePropertyScopeOutput, 0};
-  WEBRTC_CA_LOG_WARN(AudioObjectRemovePropertyListener(
-      _outputDeviceID, &propertyAddress, &objectListenerProc, this));
-
-  propertyAddress.mSelector = kAudioDeviceProcessorOverload;
-  WEBRTC_CA_LOG_WARN(AudioObjectRemovePropertyListener(
-      _outputDeviceID, &propertyAddress, &objectListenerProc, this));
-
-  if (_macBookPro) {
-    Boolean hasProperty =
-        AudioObjectHasProperty(_outputDeviceID, &propertyAddress);
-    if (hasProperty) {
-      propertyAddress.mSelector = kAudioDevicePropertyDataSource;
-      WEBRTC_CA_LOG_WARN(AudioObjectRemovePropertyListener(
-          _outputDeviceID, &propertyAddress, &objectListenerProc, this));
-    }
-  }
-
-  _playIsInitialized = false;
-  _playing = false;
-
-  return 0;
-}
-
-int32_t AudioDeviceMac::PlayoutDelay(uint16_t& delayMS) const {
-  int32_t renderDelayUs = AtomicGet32(&_renderDelayUs);
-  delayMS =
-      static_cast<uint16_t>(1e-3 * (renderDelayUs + _renderLatencyUs) + 0.5);
-  return 0;
-}
-
-int32_t AudioDeviceMac::RecordingDelay(uint16_t& delayMS) const {
-  int32_t captureDelayUs = AtomicGet32(&_captureDelayUs);
-  delayMS =
-      static_cast<uint16_t>(1e-3 * (captureDelayUs + _captureLatencyUs) + 0.5);
-  return 0;
-}
-
-bool AudioDeviceMac::Playing() const {
-  return (_playing);
-}
-
-bool AudioDeviceMac::PlayoutWarning() const {
-  return (_playWarning > 0);
-}
-
-bool AudioDeviceMac::PlayoutError() const {
-  return (_playError > 0);
-}
-
-bool AudioDeviceMac::RecordingWarning() const {
-  return (_recWarning > 0);
-}
-
-bool AudioDeviceMac::RecordingError() const {
-  return (_recError > 0);
-}
-
-void AudioDeviceMac::ClearPlayoutWarning() {
-  _playWarning = 0;
-}
-
-void AudioDeviceMac::ClearPlayoutError() {
-  _playError = 0;
-}
-
-void AudioDeviceMac::ClearRecordingWarning() {
-  _recWarning = 0;
-}
-
-void AudioDeviceMac::ClearRecordingError() {
-  _recError = 0;
-}
-
-// ============================================================================
-//                                 Private Methods
-// ============================================================================
-
-int32_t AudioDeviceMac::GetNumberDevices(const AudioObjectPropertyScope scope,
-                                         AudioDeviceID scopedDeviceIds[],
-                                         const uint32_t deviceListLength) {
-  OSStatus err = noErr;
-
-  AudioObjectPropertyAddress propertyAddress = {
-      kAudioHardwarePropertyDevices, kAudioObjectPropertyScopeGlobal,
-      kAudioObjectPropertyElementMaster};
-  UInt32 size = 0;
-  WEBRTC_CA_RETURN_ON_ERR(AudioObjectGetPropertyDataSize(
-      kAudioObjectSystemObject, &propertyAddress, 0, NULL, &size));
-  if (size == 0) {
-    LOG(LS_WARNING) << "No devices";
-    return 0;
-  }
-
-  AudioDeviceID* deviceIds = (AudioDeviceID*)malloc(size);
-  UInt32 numberDevices = size / sizeof(AudioDeviceID);
-  AudioBufferList* bufferList = NULL;
-  UInt32 numberScopedDevices = 0;
-
-  // First check if there is a default device and list it
-  UInt32 hardwareProperty = 0;
-  if (scope == kAudioDevicePropertyScopeOutput) {
-    hardwareProperty = kAudioHardwarePropertyDefaultOutputDevice;
-  } else {
-    hardwareProperty = kAudioHardwarePropertyDefaultInputDevice;
-  }
-
-  AudioObjectPropertyAddress propertyAddressDefault = {
-      hardwareProperty, kAudioObjectPropertyScopeGlobal,
-      kAudioObjectPropertyElementMaster};
-
-  AudioDeviceID usedID;
-  UInt32 uintSize = sizeof(UInt32);
-  WEBRTC_CA_RETURN_ON_ERR(AudioObjectGetPropertyData(kAudioObjectSystemObject,
-                                                     &propertyAddressDefault, 0,
-                                                     NULL, &uintSize, &usedID));
-  if (usedID != kAudioDeviceUnknown) {
-    scopedDeviceIds[numberScopedDevices] = usedID;
-    numberScopedDevices++;
-  } else {
-    LOG(LS_WARNING) << "GetNumberDevices(): Default device unknown";
-  }
-
-  // Then list the rest of the devices
-  bool listOK = true;
-
-  WEBRTC_CA_LOG_ERR(AudioObjectGetPropertyData(
-      kAudioObjectSystemObject, &propertyAddress, 0, NULL, &size, deviceIds));
-  if (err != noErr) {
-    listOK = false;
-  } else {
-    propertyAddress.mSelector = kAudioDevicePropertyStreamConfiguration;
-    propertyAddress.mScope = scope;
-    propertyAddress.mElement = 0;
-    for (UInt32 i = 0; i < numberDevices; i++) {
-      // Check for input channels
-      WEBRTC_CA_LOG_ERR(AudioObjectGetPropertyDataSize(
-          deviceIds[i], &propertyAddress, 0, NULL, &size));
-      if (err == kAudioHardwareBadDeviceError) {
-        // This device doesn't actually exist; continue iterating.
-        continue;
-      } else if (err != noErr) {
-        listOK = false;
-        break;
-      }
-
-      bufferList = (AudioBufferList*)malloc(size);
-      WEBRTC_CA_LOG_ERR(AudioObjectGetPropertyData(
-          deviceIds[i], &propertyAddress, 0, NULL, &size, bufferList));
-      if (err != noErr) {
-        listOK = false;
-        break;
-      }
-
-      if (bufferList->mNumberBuffers > 0) {
-        if (numberScopedDevices >= deviceListLength) {
-          LOG(LS_ERROR) << "Device list is not long enough";
-          listOK = false;
-          break;
-        }
-
-        scopedDeviceIds[numberScopedDevices] = deviceIds[i];
-        numberScopedDevices++;
-      }
-
-      free(bufferList);
-      bufferList = NULL;
-    }  // for
-  }
-
-  if (!listOK) {
-    if (deviceIds) {
-      free(deviceIds);
-      deviceIds = NULL;
-    }
-
-    if (bufferList) {
-      free(bufferList);
-      bufferList = NULL;
-    }
-
-    return -1;
-  }
-
-  // Happy ending
-  if (deviceIds) {
-    free(deviceIds);
-    deviceIds = NULL;
-  }
-
-  return numberScopedDevices;
-}
-
-int32_t AudioDeviceMac::GetDeviceName(const AudioObjectPropertyScope scope,
-                                      const uint16_t index,
-                                      char* name) {
-  OSStatus err = noErr;
-  UInt32 len = kAdmMaxDeviceNameSize;
-  AudioDeviceID deviceIds[MaxNumberDevices];
-
-  int numberDevices = GetNumberDevices(scope, deviceIds, MaxNumberDevices);
-  if (numberDevices < 0) {
-    return -1;
-  } else if (numberDevices == 0) {
-    LOG(LS_ERROR) << "No devices";
-    return -1;
-  }
-
-  // If the number is below the number of devices, assume it's "WEBRTC ID"
-  // otherwise assume it's a CoreAudio ID
-  AudioDeviceID usedID;
-
-  // Check if there is a default device
-  bool isDefaultDevice = false;
-  if (index == 0) {
-    UInt32 hardwareProperty = 0;
-    if (scope == kAudioDevicePropertyScopeOutput) {
-      hardwareProperty = kAudioHardwarePropertyDefaultOutputDevice;
-    } else {
-      hardwareProperty = kAudioHardwarePropertyDefaultInputDevice;
-    }
-    AudioObjectPropertyAddress propertyAddress = {
-        hardwareProperty, kAudioObjectPropertyScopeGlobal,
-        kAudioObjectPropertyElementMaster};
-    UInt32 size = sizeof(UInt32);
-    WEBRTC_CA_RETURN_ON_ERR(AudioObjectGetPropertyData(
-        kAudioObjectSystemObject, &propertyAddress, 0, NULL, &size, &usedID));
-    if (usedID == kAudioDeviceUnknown) {
-      LOG(LS_WARNING) << "GetDeviceName(): Default device unknown";
-    } else {
-      isDefaultDevice = true;
-    }
-  }
-
-  AudioObjectPropertyAddress propertyAddress = {kAudioDevicePropertyDeviceName,
-                                                scope, 0};
-
-  if (isDefaultDevice) {
-    char devName[len];
-
-    WEBRTC_CA_RETURN_ON_ERR(AudioObjectGetPropertyData(usedID, &propertyAddress,
-                                                       0, NULL, &len, devName));
-
-    sprintf(name, "default (%s)", devName);
-  } else {
-    if (index < numberDevices) {
-      usedID = deviceIds[index];
-    } else {
-      usedID = index;
-    }
-
-    WEBRTC_CA_RETURN_ON_ERR(AudioObjectGetPropertyData(usedID, &propertyAddress,
-                                                       0, NULL, &len, name));
-  }
-
-  return 0;
-}
-
-int32_t AudioDeviceMac::InitDevice(const uint16_t userDeviceIndex,
-                                   AudioDeviceID& deviceId,
-                                   const bool isInput) {
-  OSStatus err = noErr;
-  UInt32 size = 0;
-  AudioObjectPropertyScope deviceScope;
-  AudioObjectPropertySelector defaultDeviceSelector;
-  AudioDeviceID deviceIds[MaxNumberDevices];
-
-  if (isInput) {
-    deviceScope = kAudioDevicePropertyScopeInput;
-    defaultDeviceSelector = kAudioHardwarePropertyDefaultInputDevice;
-  } else {
-    deviceScope = kAudioDevicePropertyScopeOutput;
-    defaultDeviceSelector = kAudioHardwarePropertyDefaultOutputDevice;
-  }
-
-  AudioObjectPropertyAddress propertyAddress = {
-      defaultDeviceSelector, kAudioObjectPropertyScopeGlobal,
-      kAudioObjectPropertyElementMaster};
-
-  // Get the actual device IDs
-  int numberDevices =
-      GetNumberDevices(deviceScope, deviceIds, MaxNumberDevices);
-  if (numberDevices < 0) {
-    return -1;
-  } else if (numberDevices == 0) {
-    LOG(LS_ERROR) << "InitDevice(): No devices";
-    return -1;
-  }
-
-  bool isDefaultDevice = false;
-  deviceId = kAudioDeviceUnknown;
-  if (userDeviceIndex == 0) {
-    // Try to use default system device
-    size = sizeof(AudioDeviceID);
-    WEBRTC_CA_RETURN_ON_ERR(AudioObjectGetPropertyData(
-        kAudioObjectSystemObject, &propertyAddress, 0, NULL, &size, &deviceId));
-    if (deviceId == kAudioDeviceUnknown) {
-      LOG(LS_WARNING) << "No default device exists";
-    } else {
-      isDefaultDevice = true;
-    }
-  }
-
-  if (!isDefaultDevice) {
-    deviceId = deviceIds[userDeviceIndex];
-  }
-
-  // Obtain device name and manufacturer for logging.
-  // Also use this as a test to ensure a user-set device ID is valid.
-  char devName[128];
-  char devManf[128];
-  memset(devName, 0, sizeof(devName));
-  memset(devManf, 0, sizeof(devManf));
-
-  propertyAddress.mSelector = kAudioDevicePropertyDeviceName;
-  propertyAddress.mScope = deviceScope;
-  propertyAddress.mElement = 0;
-  size = sizeof(devName);
-  WEBRTC_CA_RETURN_ON_ERR(AudioObjectGetPropertyData(deviceId, &propertyAddress,
-                                                     0, NULL, &size, devName));
-
-  propertyAddress.mSelector = kAudioDevicePropertyDeviceManufacturer;
-  size = sizeof(devManf);
-  WEBRTC_CA_RETURN_ON_ERR(AudioObjectGetPropertyData(deviceId, &propertyAddress,
-                                                     0, NULL, &size, devManf));
-
-  if (isInput) {
-    LOG(LS_VERBOSE) << "Input device: " << devManf << " " << devName;
-  } else {
-    LOG(LS_VERBOSE) << "Output device: " << devManf << " " << devName;
-  }
-
-  return 0;
-}
-
-OSStatus AudioDeviceMac::SetDesiredPlayoutFormat() {
-  // Our preferred format to work with.
-  _outDesiredFormat.mSampleRate = N_PLAY_SAMPLES_PER_SEC;
-  _outDesiredFormat.mChannelsPerFrame = _playChannels;
-
-  if (_ptrAudioBuffer) {
-    // Update audio buffer with the selected parameters.
-    _ptrAudioBuffer->SetPlayoutSampleRate(N_PLAY_SAMPLES_PER_SEC);
-    _ptrAudioBuffer->SetPlayoutChannels((uint8_t)_playChannels);
-  }
-
-  _renderDelayOffsetSamples = _renderBufSizeSamples -
-                              N_BUFFERS_OUT * ENGINE_PLAY_BUF_SIZE_IN_SAMPLES *
-                                  _outDesiredFormat.mChannelsPerFrame;
-
-  _outDesiredFormat.mBytesPerPacket =
-      _outDesiredFormat.mChannelsPerFrame * sizeof(SInt16);
-  // In uncompressed audio, a packet is one frame.
-  _outDesiredFormat.mFramesPerPacket = 1;
-  _outDesiredFormat.mBytesPerFrame =
-      _outDesiredFormat.mChannelsPerFrame * sizeof(SInt16);
-  _outDesiredFormat.mBitsPerChannel = sizeof(SInt16) * 8;
-
-  _outDesiredFormat.mFormatFlags =
-      kLinearPCMFormatFlagIsSignedInteger | kLinearPCMFormatFlagIsPacked;
-#ifdef WEBRTC_ARCH_BIG_ENDIAN
-  _outDesiredFormat.mFormatFlags |= kLinearPCMFormatFlagIsBigEndian;
-#endif
-  _outDesiredFormat.mFormatID = kAudioFormatLinearPCM;
-
-  OSStatus err = noErr;
-  WEBRTC_CA_RETURN_ON_ERR(AudioConverterNew(
-      &_outDesiredFormat, &_outStreamFormat, &_renderConverter));
-
-  // Try to set buffer size to desired value set to 20ms.
-  const uint16_t kPlayBufDelayFixed = 20;
-  UInt32 bufByteCount = static_cast<UInt32>(
-      (_outStreamFormat.mSampleRate / 1000.0) * kPlayBufDelayFixed *
-      _outStreamFormat.mChannelsPerFrame * sizeof(Float32));
-  if (_outStreamFormat.mFramesPerPacket != 0) {
-    if (bufByteCount % _outStreamFormat.mFramesPerPacket != 0) {
-      bufByteCount = (static_cast<UInt32>(bufByteCount /
-                                          _outStreamFormat.mFramesPerPacket) +
-                      1) *
-                     _outStreamFormat.mFramesPerPacket;
-    }
-  }
-
-  // Ensure the buffer size is within the range provided by the device.
-  AudioObjectPropertyAddress propertyAddress = {
-      kAudioDevicePropertyDataSource, kAudioDevicePropertyScopeOutput, 0};
-  propertyAddress.mSelector = kAudioDevicePropertyBufferSizeRange;
-  AudioValueRange range;
-  UInt32 size = sizeof(range);
-  WEBRTC_CA_RETURN_ON_ERR(AudioObjectGetPropertyData(
-      _outputDeviceID, &propertyAddress, 0, NULL, &size, &range));
-  if (range.mMinimum > bufByteCount) {
-    bufByteCount = range.mMinimum;
-  } else if (range.mMaximum < bufByteCount) {
-    bufByteCount = range.mMaximum;
-  }
-
-  propertyAddress.mSelector = kAudioDevicePropertyBufferSize;
-  size = sizeof(bufByteCount);
-  WEBRTC_CA_RETURN_ON_ERR(AudioObjectSetPropertyData(
-      _outputDeviceID, &propertyAddress, 0, NULL, size, &bufByteCount));
-
-  // Get render device latency.
-  propertyAddress.mSelector = kAudioDevicePropertyLatency;
-  UInt32 latency = 0;
-  size = sizeof(UInt32);
-  WEBRTC_CA_RETURN_ON_ERR(AudioObjectGetPropertyData(
-      _outputDeviceID, &propertyAddress, 0, NULL, &size, &latency));
-  _renderLatencyUs =
-      static_cast<uint32_t>((1.0e6 * latency) / _outStreamFormat.mSampleRate);
-
-  // Get render stream latency.
-  propertyAddress.mSelector = kAudioDevicePropertyStreams;
-  AudioStreamID stream = 0;
-  size = sizeof(AudioStreamID);
-  WEBRTC_CA_RETURN_ON_ERR(AudioObjectGetPropertyData(
-      _outputDeviceID, &propertyAddress, 0, NULL, &size, &stream));
-  propertyAddress.mSelector = kAudioStreamPropertyLatency;
-  size = sizeof(UInt32);
-  latency = 0;
-  WEBRTC_CA_RETURN_ON_ERR(AudioObjectGetPropertyData(
-      _outputDeviceID, &propertyAddress, 0, NULL, &size, &latency));
-  _renderLatencyUs +=
-      static_cast<uint32_t>((1.0e6 * latency) / _outStreamFormat.mSampleRate);
-
-  LOG(LS_VERBOSE) << "initial playout status: _renderDelayOffsetSamples="
-                  << _renderDelayOffsetSamples << ", _renderDelayUs="
-                  << _renderDelayUs << ", _renderLatencyUs="
-                  << _renderLatencyUs;
-  return 0;
-}
-
-OSStatus AudioDeviceMac::objectListenerProc(
-    AudioObjectID objectId,
-    UInt32 numberAddresses,
-    const AudioObjectPropertyAddress addresses[],
-    void* clientData) {
-  AudioDeviceMac* ptrThis = (AudioDeviceMac*)clientData;
-  RTC_DCHECK(ptrThis != NULL);
-
-  ptrThis->implObjectListenerProc(objectId, numberAddresses, addresses);
-
-  // AudioObjectPropertyListenerProc functions are supposed to return 0
-  return 0;
-}
-
-OSStatus AudioDeviceMac::implObjectListenerProc(
-    const AudioObjectID objectId,
-    const UInt32 numberAddresses,
-    const AudioObjectPropertyAddress addresses[]) {
-  LOG(LS_VERBOSE) << "AudioDeviceMac::implObjectListenerProc()";
-
-  for (UInt32 i = 0; i < numberAddresses; i++) {
-    if (addresses[i].mSelector == kAudioHardwarePropertyDevices) {
-      HandleDeviceChange();
-    } else if (addresses[i].mSelector == kAudioDevicePropertyStreamFormat) {
-      HandleStreamFormatChange(objectId, addresses[i]);
-    } else if (addresses[i].mSelector == kAudioDevicePropertyDataSource) {
-      HandleDataSourceChange(objectId, addresses[i]);
-    } else if (addresses[i].mSelector == kAudioDeviceProcessorOverload) {
-      HandleProcessorOverload(addresses[i]);
-    }
-  }
-
-  return 0;
-}
-
-int32_t AudioDeviceMac::HandleDeviceChange() {
-  OSStatus err = noErr;
-
-  LOG(LS_VERBOSE) << "kAudioHardwarePropertyDevices";
-
-  // A device has changed. Check if our registered devices have been removed.
-  // Ensure the devices have been initialized, meaning the IDs are valid.
-  if (MicrophoneIsInitialized()) {
-    AudioObjectPropertyAddress propertyAddress = {
-        kAudioDevicePropertyDeviceIsAlive, kAudioDevicePropertyScopeInput, 0};
-    UInt32 deviceIsAlive = 1;
-    UInt32 size = sizeof(UInt32);
-    err = AudioObjectGetPropertyData(_inputDeviceID, &propertyAddress, 0, NULL,
-                                     &size, &deviceIsAlive);
-
-    if (err == kAudioHardwareBadDeviceError || deviceIsAlive == 0) {
-      LOG(LS_WARNING) << "Capture device is not alive (probably removed)";
-      AtomicSet32(&_captureDeviceIsAlive, 0);
-      _mixerManager.CloseMicrophone();
-      if (_recError == 1) {
-        LOG(LS_WARNING) << "pending recording error exists";
-      }
-      _recError = 1;  // triggers callback from module process thread
-    } else if (err != noErr) {
-      logCAMsg(rtc::LS_ERROR,
-               "Error in AudioDeviceGetProperty()", (const char*)&err);
-      return -1;
-    }
-  }
-
-  if (SpeakerIsInitialized()) {
-    AudioObjectPropertyAddress propertyAddress = {
-        kAudioDevicePropertyDeviceIsAlive, kAudioDevicePropertyScopeOutput, 0};
-    UInt32 deviceIsAlive = 1;
-    UInt32 size = sizeof(UInt32);
-    err = AudioObjectGetPropertyData(_outputDeviceID, &propertyAddress, 0, NULL,
-                                     &size, &deviceIsAlive);
-
-    if (err == kAudioHardwareBadDeviceError || deviceIsAlive == 0) {
-      LOG(LS_WARNING) << "Render device is not alive (probably removed)";
-      AtomicSet32(&_renderDeviceIsAlive, 0);
-      _mixerManager.CloseSpeaker();
-      if (_playError == 1) {
-        LOG(LS_WARNING) << "pending playout error exists";
-      }
-      _playError = 1;  // triggers callback from module process thread
-    } else if (err != noErr) {
-      logCAMsg(rtc::LS_ERROR,
-               "Error in AudioDeviceGetProperty()", (const char*)&err);
-      return -1;
-    }
-  }
-
-  return 0;
-}
-
-int32_t AudioDeviceMac::HandleStreamFormatChange(
-    const AudioObjectID objectId,
-    const AudioObjectPropertyAddress propertyAddress) {
-  OSStatus err = noErr;
-
-  LOG(LS_VERBOSE) << "Stream format changed";
-
-  if (objectId != _inputDeviceID && objectId != _outputDeviceID) {
-    return 0;
-  }
-
-  // Get the new device format
-  AudioStreamBasicDescription streamFormat;
-  UInt32 size = sizeof(streamFormat);
-  WEBRTC_CA_RETURN_ON_ERR(AudioObjectGetPropertyData(
-      objectId, &propertyAddress, 0, NULL, &size, &streamFormat));
-
-  if (streamFormat.mFormatID != kAudioFormatLinearPCM) {
-    logCAMsg(rtc::LS_ERROR,
-             "Unacceptable input stream format -> mFormatID",
-             (const char*)&streamFormat.mFormatID);
-    return -1;
-  }
-
-  if (streamFormat.mChannelsPerFrame > N_DEVICE_CHANNELS) {
-    LOG(LS_ERROR) << "Too many channels on device (mChannelsPerFrame = "
-                  << streamFormat.mChannelsPerFrame << ")";
-    return -1;
-  }
-
-  LOG(LS_VERBOSE) << "Stream format:";
-  LOG(LS_VERBOSE) << "mSampleRate = " << streamFormat.mSampleRate
-                  << ", mChannelsPerFrame = " << streamFormat.mChannelsPerFrame;
-  LOG(LS_VERBOSE) << "mBytesPerPacket = " << streamFormat.mBytesPerPacket
-                  << ", mFramesPerPacket = " << streamFormat.mFramesPerPacket;
-  LOG(LS_VERBOSE) << "mBytesPerFrame = " << streamFormat.mBytesPerFrame
-                  << ", mBitsPerChannel = " << streamFormat.mBitsPerChannel;
-  LOG(LS_VERBOSE) << "mFormatFlags = " << streamFormat.mFormatFlags;
-  logCAMsg(rtc::LS_VERBOSE, "mFormatID",
-           (const char*)&streamFormat.mFormatID);
-
-  if (propertyAddress.mScope == kAudioDevicePropertyScopeInput) {
-    const int io_block_size_samples = streamFormat.mChannelsPerFrame *
-                                      streamFormat.mSampleRate / 100 *
-                                      N_BLOCKS_IO;
-    if (io_block_size_samples > _captureBufSizeSamples) {
-      LOG(LS_ERROR) << "Input IO block size (" << io_block_size_samples
-                    << ") is larger than ring buffer ("
-                    << _captureBufSizeSamples << ")";
-      return -1;
-    }
-
-    memcpy(&_inStreamFormat, &streamFormat, sizeof(streamFormat));
-
-    if (_inStreamFormat.mChannelsPerFrame >= 2 && (_recChannels == 2)) {
-      _inDesiredFormat.mChannelsPerFrame = 2;
-    } else {
-      // Disable stereo recording when we only have one channel on the device.
-      _inDesiredFormat.mChannelsPerFrame = 1;
-      _recChannels = 1;
-      LOG(LS_VERBOSE) << "Stereo recording unavailable on this device";
-    }
-
-    if (_ptrAudioBuffer) {
-      // Update audio buffer with the selected parameters
-      _ptrAudioBuffer->SetRecordingSampleRate(N_REC_SAMPLES_PER_SEC);
-      _ptrAudioBuffer->SetRecordingChannels((uint8_t)_recChannels);
-    }
-
-    // Recreate the converter with the new format
-    // TODO(xians): make this thread safe
-    WEBRTC_CA_RETURN_ON_ERR(AudioConverterDispose(_captureConverter));
-
-    WEBRTC_CA_RETURN_ON_ERR(AudioConverterNew(&streamFormat, &_inDesiredFormat,
-                                              &_captureConverter));
-  } else {
-    memcpy(&_outStreamFormat, &streamFormat, sizeof(streamFormat));
-
-    // Our preferred format to work with
-    if (_outStreamFormat.mChannelsPerFrame < 2) {
-      _playChannels = 1;
-      LOG(LS_VERBOSE) << "Stereo playout unavailable on this device";
-    }
-    WEBRTC_CA_RETURN_ON_ERR(SetDesiredPlayoutFormat());
-  }
-  return 0;
-}
-
-int32_t AudioDeviceMac::HandleDataSourceChange(
-    const AudioObjectID objectId,
-    const AudioObjectPropertyAddress propertyAddress) {
-  OSStatus err = noErr;
-
-  if (_macBookPro &&
-      propertyAddress.mScope == kAudioDevicePropertyScopeOutput) {
-    LOG(LS_VERBOSE) << "Data source changed";
-
-    _macBookProPanRight = false;
-    UInt32 dataSource = 0;
-    UInt32 size = sizeof(UInt32);
-    WEBRTC_CA_RETURN_ON_ERR(AudioObjectGetPropertyData(
-        objectId, &propertyAddress, 0, NULL, &size, &dataSource));
-    if (dataSource == 'ispk') {
-      _macBookProPanRight = true;
-      LOG(LS_VERBOSE)
-          << "MacBook Pro using internal speakers; stereo panning right";
-    } else {
-      LOG(LS_VERBOSE) << "MacBook Pro not using internal speakers";
-    }
-  }
-
-  return 0;
-}
-int32_t AudioDeviceMac::HandleProcessorOverload(
-    const AudioObjectPropertyAddress propertyAddress) {
-  // TODO(xians): we probably want to notify the user in some way of the
-  // overload. However, the Windows interpretations of these errors seem to
-  // be more severe than what ProcessorOverload is thrown for.
-  //
-  // We don't log the notification, as it's sent from the HAL's IO thread. We
-  // don't want to slow it down even further.
-  if (propertyAddress.mScope == kAudioDevicePropertyScopeInput) {
-    // LOG(LS_WARNING) << "Capture processor // overload";
-    //_callback->ProblemIsReported(
-    // SndCardStreamObserver::ERecordingProblem);
-  } else {
-    // LOG(LS_WARNING) << "Render processor overload";
-    //_callback->ProblemIsReported(
-    // SndCardStreamObserver::EPlaybackProblem);
-  }
-
-  return 0;
-}
-
-// ============================================================================
-//                                  Thread Methods
-// ============================================================================
-
-OSStatus AudioDeviceMac::deviceIOProc(AudioDeviceID,
-                                      const AudioTimeStamp*,
-                                      const AudioBufferList* inputData,
-                                      const AudioTimeStamp* inputTime,
-                                      AudioBufferList* outputData,
-                                      const AudioTimeStamp* outputTime,
-                                      void* clientData) {
-  AudioDeviceMac* ptrThis = (AudioDeviceMac*)clientData;
-  RTC_DCHECK(ptrThis != NULL);
-
-  ptrThis->implDeviceIOProc(inputData, inputTime, outputData, outputTime);
-
-  // AudioDeviceIOProc functions are supposed to return 0
-  return 0;
-}
-
-OSStatus AudioDeviceMac::outConverterProc(AudioConverterRef,
-                                          UInt32* numberDataPackets,
-                                          AudioBufferList* data,
-                                          AudioStreamPacketDescription**,
-                                          void* userData) {
-  AudioDeviceMac* ptrThis = (AudioDeviceMac*)userData;
-  RTC_DCHECK(ptrThis != NULL);
-
-  return ptrThis->implOutConverterProc(numberDataPackets, data);
-}
-
-OSStatus AudioDeviceMac::inDeviceIOProc(AudioDeviceID,
-                                        const AudioTimeStamp*,
-                                        const AudioBufferList* inputData,
-                                        const AudioTimeStamp* inputTime,
-                                        AudioBufferList*,
-                                        const AudioTimeStamp*,
-                                        void* clientData) {
-  AudioDeviceMac* ptrThis = (AudioDeviceMac*)clientData;
-  RTC_DCHECK(ptrThis != NULL);
-
-  ptrThis->implInDeviceIOProc(inputData, inputTime);
-
-  // AudioDeviceIOProc functions are supposed to return 0
-  return 0;
-}
-
-OSStatus AudioDeviceMac::inConverterProc(
-    AudioConverterRef,
-    UInt32* numberDataPackets,
-    AudioBufferList* data,
-    AudioStreamPacketDescription** /*dataPacketDescription*/,
-    void* userData) {
-  AudioDeviceMac* ptrThis = static_cast<AudioDeviceMac*>(userData);
-  RTC_DCHECK(ptrThis != NULL);
-
-  return ptrThis->implInConverterProc(numberDataPackets, data);
-}
-
-OSStatus AudioDeviceMac::implDeviceIOProc(const AudioBufferList* inputData,
-                                          const AudioTimeStamp* inputTime,
-                                          AudioBufferList* outputData,
-                                          const AudioTimeStamp* outputTime) {
-  OSStatus err = noErr;
-  UInt64 outputTimeNs = AudioConvertHostTimeToNanos(outputTime->mHostTime);
-  UInt64 nowNs = AudioConvertHostTimeToNanos(AudioGetCurrentHostTime());
-
-  if (!_twoDevices && _recording) {
-    implInDeviceIOProc(inputData, inputTime);
-  }
-
-  // Check if we should close down audio device
-  // Double-checked locking optimization to remove locking overhead
-  if (_doStop) {
-    _critSect.Enter();
-    if (_doStop) {
-      if (_twoDevices || (!_recording && !_playing)) {
-        // In the case of a shared device, the single driving ioProc
-        // is stopped here
-        WEBRTC_CA_LOG_ERR(AudioDeviceStop(_outputDeviceID, _deviceIOProcID));
-        WEBRTC_CA_LOG_WARN(
-            AudioDeviceDestroyIOProcID(_outputDeviceID, _deviceIOProcID));
-        if (err == noErr) {
-          LOG(LS_VERBOSE) << "Playout or shared device stopped";
-        }
-      }
-
-      _doStop = false;
-      _stopEvent.Set();
-      _critSect.Leave();
-      return 0;
-    }
-    _critSect.Leave();
-  }
-
-  if (!_playing) {
-    // This can be the case when a shared device is capturing but not
-    // rendering. We allow the checks above before returning to avoid a
-    // timeout when capturing is stopped.
-    return 0;
-  }
-
-  RTC_DCHECK(_outStreamFormat.mBytesPerFrame != 0);
-  UInt32 size =
-      outputData->mBuffers->mDataByteSize / _outStreamFormat.mBytesPerFrame;
-
-  // TODO(xians): signal an error somehow?
-  err = AudioConverterFillComplexBuffer(_renderConverter, outConverterProc,
-                                        this, &size, outputData, NULL);
-  if (err != noErr) {
-    if (err == 1) {
-      // This is our own error.
-      LOG(LS_ERROR) << "Error in AudioConverterFillComplexBuffer()";
-      return 1;
-    } else {
-      logCAMsg(rtc::LS_ERROR,
-               "Error in AudioConverterFillComplexBuffer()", (const char*)&err);
-      return 1;
-    }
-  }
-
-  PaRingBufferSize bufSizeSamples =
-      PaUtil_GetRingBufferReadAvailable(_paRenderBuffer);
-
-  int32_t renderDelayUs =
-      static_cast<int32_t>(1e-3 * (outputTimeNs - nowNs) + 0.5);
-  renderDelayUs += static_cast<int32_t>(
-      (1.0e6 * bufSizeSamples) / _outDesiredFormat.mChannelsPerFrame /
-          _outDesiredFormat.mSampleRate +
-      0.5);
-
-  AtomicSet32(&_renderDelayUs, renderDelayUs);
-
-  return 0;
-}
-
-OSStatus AudioDeviceMac::implOutConverterProc(UInt32* numberDataPackets,
-                                              AudioBufferList* data) {
-  RTC_DCHECK(data->mNumberBuffers == 1);
-  PaRingBufferSize numSamples =
-      *numberDataPackets * _outDesiredFormat.mChannelsPerFrame;
-
-  data->mBuffers->mNumberChannels = _outDesiredFormat.mChannelsPerFrame;
-  // Always give the converter as much as it wants, zero padding as required.
-  data->mBuffers->mDataByteSize =
-      *numberDataPackets * _outDesiredFormat.mBytesPerPacket;
-  data->mBuffers->mData = _renderConvertData;
-  memset(_renderConvertData, 0, sizeof(_renderConvertData));
-
-  PaUtil_ReadRingBuffer(_paRenderBuffer, _renderConvertData, numSamples);
-
-  kern_return_t kernErr = semaphore_signal_all(_renderSemaphore);
-  if (kernErr != KERN_SUCCESS) {
-    LOG(LS_ERROR) << "semaphore_signal_all() error: " << kernErr;
-    return 1;
-  }
-
-  return 0;
-}
-
-OSStatus AudioDeviceMac::implInDeviceIOProc(const AudioBufferList* inputData,
-                                            const AudioTimeStamp* inputTime) {
-  OSStatus err = noErr;
-  UInt64 inputTimeNs = AudioConvertHostTimeToNanos(inputTime->mHostTime);
-  UInt64 nowNs = AudioConvertHostTimeToNanos(AudioGetCurrentHostTime());
-
-  // Check if we should close down audio device
-  // Double-checked locking optimization to remove locking overhead
-  if (_doStopRec) {
-    _critSect.Enter();
-    if (_doStopRec) {
-      // This will be signalled only when a shared device is not in use.
-      WEBRTC_CA_LOG_ERR(AudioDeviceStop(_inputDeviceID, _inDeviceIOProcID));
-      WEBRTC_CA_LOG_WARN(
-          AudioDeviceDestroyIOProcID(_inputDeviceID, _inDeviceIOProcID));
-      if (err == noErr) {
-        LOG(LS_VERBOSE) << "Recording device stopped";
-      }
-
-      _doStopRec = false;
-      _stopEventRec.Set();
-      _critSect.Leave();
-      return 0;
-    }
-    _critSect.Leave();
-  }
-
-  if (!_recording) {
-    // Allow above checks to avoid a timeout on stopping capture.
-    return 0;
-  }
-
-  PaRingBufferSize bufSizeSamples =
-      PaUtil_GetRingBufferReadAvailable(_paCaptureBuffer);
-
-  int32_t captureDelayUs =
-      static_cast<int32_t>(1e-3 * (nowNs - inputTimeNs) + 0.5);
-  captureDelayUs += static_cast<int32_t>((1.0e6 * bufSizeSamples) /
-                                             _inStreamFormat.mChannelsPerFrame /
-                                             _inStreamFormat.mSampleRate +
-                                         0.5);
-
-  AtomicSet32(&_captureDelayUs, captureDelayUs);
-
-  RTC_DCHECK(inputData->mNumberBuffers == 1);
-  PaRingBufferSize numSamples = inputData->mBuffers->mDataByteSize *
-                                _inStreamFormat.mChannelsPerFrame /
-                                _inStreamFormat.mBytesPerPacket;
-  PaUtil_WriteRingBuffer(_paCaptureBuffer, inputData->mBuffers->mData,
-                         numSamples);
-
-  kern_return_t kernErr = semaphore_signal_all(_captureSemaphore);
-  if (kernErr != KERN_SUCCESS) {
-    LOG(LS_ERROR) << "semaphore_signal_all() error: " << kernErr;
-  }
-
-  return err;
-}
-
-OSStatus AudioDeviceMac::implInConverterProc(UInt32* numberDataPackets,
-                                             AudioBufferList* data) {
-  RTC_DCHECK(data->mNumberBuffers == 1);
-  PaRingBufferSize numSamples =
-      *numberDataPackets * _inStreamFormat.mChannelsPerFrame;
-
-  while (PaUtil_GetRingBufferReadAvailable(_paCaptureBuffer) < numSamples) {
-    mach_timespec_t timeout;
-    timeout.tv_sec = 0;
-    timeout.tv_nsec = TIMER_PERIOD_MS;
-
-    kern_return_t kernErr = semaphore_timedwait(_captureSemaphore, timeout);
-    if (kernErr == KERN_OPERATION_TIMED_OUT) {
-      int32_t signal = AtomicGet32(&_captureDeviceIsAlive);
-      if (signal == 0) {
-        // The capture device is no longer alive; stop the worker thread.
-        *numberDataPackets = 0;
-        return 1;
-      }
-    } else if (kernErr != KERN_SUCCESS) {
-      LOG(LS_ERROR) << "semaphore_wait() error: " << kernErr;
-    }
-  }
-
-  // Pass the read pointer directly to the converter to avoid a memcpy.
-  void* dummyPtr;
-  PaRingBufferSize dummySize;
-  PaUtil_GetRingBufferReadRegions(_paCaptureBuffer, numSamples,
-                                  &data->mBuffers->mData, &numSamples,
-                                  &dummyPtr, &dummySize);
-  PaUtil_AdvanceRingBufferReadIndex(_paCaptureBuffer, numSamples);
-
-  data->mBuffers->mNumberChannels = _inStreamFormat.mChannelsPerFrame;
-  *numberDataPackets = numSamples / _inStreamFormat.mChannelsPerFrame;
-  data->mBuffers->mDataByteSize =
-      *numberDataPackets * _inStreamFormat.mBytesPerPacket;
-
-  return 0;
-}
-
-bool AudioDeviceMac::RunRender(void* ptrThis) {
-  return static_cast<AudioDeviceMac*>(ptrThis)->RenderWorkerThread();
-}
-
-bool AudioDeviceMac::RenderWorkerThread() {
-  PaRingBufferSize numSamples =
-      ENGINE_PLAY_BUF_SIZE_IN_SAMPLES * _outDesiredFormat.mChannelsPerFrame;
-  while (PaUtil_GetRingBufferWriteAvailable(_paRenderBuffer) -
-             _renderDelayOffsetSamples <
-         numSamples) {
-    mach_timespec_t timeout;
-    timeout.tv_sec = 0;
-    timeout.tv_nsec = TIMER_PERIOD_MS;
-
-    kern_return_t kernErr = semaphore_timedwait(_renderSemaphore, timeout);
-    if (kernErr == KERN_OPERATION_TIMED_OUT) {
-      int32_t signal = AtomicGet32(&_renderDeviceIsAlive);
-      if (signal == 0) {
-        // The render device is no longer alive; stop the worker thread.
-        return false;
-      }
-    } else if (kernErr != KERN_SUCCESS) {
-      LOG(LS_ERROR) << "semaphore_timedwait() error: " << kernErr;
-    }
-  }
-
-  int8_t playBuffer[4 * ENGINE_PLAY_BUF_SIZE_IN_SAMPLES];
-
-  if (!_ptrAudioBuffer) {
-    LOG(LS_ERROR) << "capture AudioBuffer is invalid";
-    return false;
-  }
-
-  // Ask for new PCM data to be played out using the AudioDeviceBuffer.
-  uint32_t nSamples =
-      _ptrAudioBuffer->RequestPlayoutData(ENGINE_PLAY_BUF_SIZE_IN_SAMPLES);
-
-  nSamples = _ptrAudioBuffer->GetPlayoutData(playBuffer);
-  if (nSamples != ENGINE_PLAY_BUF_SIZE_IN_SAMPLES) {
-    LOG(LS_ERROR) << "invalid number of output samples(" << nSamples << ")";
-  }
-
-  uint32_t nOutSamples = nSamples * _outDesiredFormat.mChannelsPerFrame;
-
-  SInt16* pPlayBuffer = (SInt16*)&playBuffer;
-  if (_macBookProPanRight && (_playChannels == 2)) {
-    // Mix entirely into the right channel and zero the left channel.
-    SInt32 sampleInt32 = 0;
-    for (uint32_t sampleIdx = 0; sampleIdx < nOutSamples; sampleIdx += 2) {
-      sampleInt32 = pPlayBuffer[sampleIdx];
-      sampleInt32 += pPlayBuffer[sampleIdx + 1];
-      sampleInt32 /= 2;
-
-      if (sampleInt32 > 32767) {
-        sampleInt32 = 32767;
-      } else if (sampleInt32 < -32768) {
-        sampleInt32 = -32768;
-      }
-
-      pPlayBuffer[sampleIdx] = 0;
-      pPlayBuffer[sampleIdx + 1] = static_cast<SInt16>(sampleInt32);
-    }
-  }
-
-  PaUtil_WriteRingBuffer(_paRenderBuffer, pPlayBuffer, nOutSamples);
-
-  return true;
-}
-
-bool AudioDeviceMac::RunCapture(void* ptrThis) {
-  return static_cast<AudioDeviceMac*>(ptrThis)->CaptureWorkerThread();
-}
-
-bool AudioDeviceMac::CaptureWorkerThread() {
-  OSStatus err = noErr;
-  UInt32 noRecSamples =
-      ENGINE_REC_BUF_SIZE_IN_SAMPLES * _inDesiredFormat.mChannelsPerFrame;
-  SInt16 recordBuffer[noRecSamples];
-  UInt32 size = ENGINE_REC_BUF_SIZE_IN_SAMPLES;
-
-  AudioBufferList engineBuffer;
-  engineBuffer.mNumberBuffers = 1;  // Interleaved channels.
-  engineBuffer.mBuffers->mNumberChannels = _inDesiredFormat.mChannelsPerFrame;
-  engineBuffer.mBuffers->mDataByteSize =
-      _inDesiredFormat.mBytesPerPacket * noRecSamples;
-  engineBuffer.mBuffers->mData = recordBuffer;
-
-  err = AudioConverterFillComplexBuffer(_captureConverter, inConverterProc,
-                                        this, &size, &engineBuffer, NULL);
-  if (err != noErr) {
-    if (err == 1) {
-      // This is our own error.
-      return false;
-    } else {
-      logCAMsg(rtc::LS_ERROR,
-               "Error in AudioConverterFillComplexBuffer()", (const char*)&err);
-      return false;
-    }
-  }
-
-  // TODO(xians): what if the returned size is incorrect?
-  if (size == ENGINE_REC_BUF_SIZE_IN_SAMPLES) {
-    uint32_t currentMicLevel(0);
-    uint32_t newMicLevel(0);
-    int32_t msecOnPlaySide;
-    int32_t msecOnRecordSide;
-
-    int32_t captureDelayUs = AtomicGet32(&_captureDelayUs);
-    int32_t renderDelayUs = AtomicGet32(&_renderDelayUs);
-
-    msecOnPlaySide =
-        static_cast<int32_t>(1e-3 * (renderDelayUs + _renderLatencyUs) + 0.5);
-    msecOnRecordSide =
-        static_cast<int32_t>(1e-3 * (captureDelayUs + _captureLatencyUs) + 0.5);
-
-    if (!_ptrAudioBuffer) {
-      LOG(LS_ERROR) << "capture AudioBuffer is invalid";
-      return false;
-    }
-
-    // store the recorded buffer (no action will be taken if the
-    // #recorded samples is not a full buffer)
-    _ptrAudioBuffer->SetRecordedBuffer((int8_t*)&recordBuffer, (uint32_t)size);
-
-    if (AGC()) {
-      // Use mod to ensure we check the volume on the first pass.
-      if (get_mic_volume_counter_ms_ % kGetMicVolumeIntervalMs == 0) {
-        get_mic_volume_counter_ms_ = 0;
-        // store current mic level in the audio buffer if AGC is enabled
-        if (MicrophoneVolume(currentMicLevel) == 0) {
-          // this call does not affect the actual microphone volume
-          _ptrAudioBuffer->SetCurrentMicLevel(currentMicLevel);
-        }
-      }
-      get_mic_volume_counter_ms_ += kBufferSizeMs;
-    }
-
-    _ptrAudioBuffer->SetVQEData(msecOnPlaySide, msecOnRecordSide, 0);
-
-    _ptrAudioBuffer->SetTypingStatus(KeyPressed());
-
-    // deliver recorded samples at specified sample rate, mic level etc.
-    // to the observer using callback
-    _ptrAudioBuffer->DeliverRecordedData();
-
-    if (AGC()) {
-      newMicLevel = _ptrAudioBuffer->NewMicLevel();
-      if (newMicLevel != 0) {
-        // The VQE will only deliver non-zero microphone levels when
-        // a change is needed.
-        // Set this new mic level (received from the observer as return
-        // value in the callback).
-        LOG(LS_VERBOSE) << "AGC change of volume: old=" << currentMicLevel
-                        << " => new=" << newMicLevel;
-        if (SetMicrophoneVolume(newMicLevel) == -1) {
-          LOG(LS_WARNING)
-              << "the required modification of the microphone volume failed";
-        }
-      }
-    }
-  }
-
-  return true;
-}
-
-bool AudioDeviceMac::KeyPressed() {
-  bool key_down = false;
-  // Loop through all Mac virtual key constant values.
-  for (unsigned int key_index = 0; key_index < arraysize(prev_key_state_);
-       ++key_index) {
-    bool keyState =
-        CGEventSourceKeyState(kCGEventSourceStateHIDSystemState, key_index);
-    // A false -> true change in keymap means a key is pressed.
-    key_down |= (keyState && !prev_key_state_[key_index]);
-    // Save current state.
-    prev_key_state_[key_index] = keyState;
-  }
-  return key_down;
-}
-}  // namespace webrtc
diff --git a/modules/audio_device/mac/audio_device_mac.h b/modules/audio_device/mac/audio_device_mac.h
deleted file mode 100644
index bdd8d83..0000000
--- a/modules/audio_device/mac/audio_device_mac.h
+++ /dev/null
@@ -1,359 +0,0 @@
-/*
- *  Copyright (c) 2012 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_AUDIO_DEVICE_AUDIO_DEVICE_MAC_H
-#define WEBRTC_AUDIO_DEVICE_AUDIO_DEVICE_MAC_H
-
-#include <memory>
-
-#include "webrtc/modules/audio_device/audio_device_generic.h"
-#include "webrtc/modules/audio_device/mac/audio_mixer_manager_mac.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/thread_annotations.h"
-#include "webrtc/system_wrappers/include/event_wrapper.h"
-
-#include <AudioToolbox/AudioConverter.h>
-#include <CoreAudio/CoreAudio.h>
-#include <mach/semaphore.h>
-
-struct PaUtilRingBuffer;
-
-namespace rtc {
-class PlatformThread;
-}  // namespace rtc
-
-namespace webrtc {
-class EventWrapper;
-
-const uint32_t N_REC_SAMPLES_PER_SEC = 48000;
-const uint32_t N_PLAY_SAMPLES_PER_SEC = 48000;
-
-const uint32_t N_REC_CHANNELS = 1;   // default is mono recording
-const uint32_t N_PLAY_CHANNELS = 2;  // default is stereo playout
-const uint32_t N_DEVICE_CHANNELS = 64;
-
-const int kBufferSizeMs = 10;
-
-const uint32_t ENGINE_REC_BUF_SIZE_IN_SAMPLES =
-    N_REC_SAMPLES_PER_SEC * kBufferSizeMs / 1000;
-const uint32_t ENGINE_PLAY_BUF_SIZE_IN_SAMPLES =
-    N_PLAY_SAMPLES_PER_SEC * kBufferSizeMs / 1000;
-
-const int N_BLOCKS_IO = 2;
-const int N_BUFFERS_IN = 2;   // Must be at least N_BLOCKS_IO.
-const int N_BUFFERS_OUT = 3;  // Must be at least N_BLOCKS_IO.
-
-const uint32_t TIMER_PERIOD_MS = 2 * 10 * N_BLOCKS_IO * 1000000;
-
-const uint32_t REC_BUF_SIZE_IN_SAMPLES =
-    ENGINE_REC_BUF_SIZE_IN_SAMPLES * N_DEVICE_CHANNELS * N_BUFFERS_IN;
-const uint32_t PLAY_BUF_SIZE_IN_SAMPLES =
-    ENGINE_PLAY_BUF_SIZE_IN_SAMPLES * N_PLAY_CHANNELS * N_BUFFERS_OUT;
-
-const int kGetMicVolumeIntervalMs = 1000;
-
-class AudioDeviceMac : public AudioDeviceGeneric {
- public:
-  AudioDeviceMac();
-  ~AudioDeviceMac();
-
-  // Retrieve the currently utilized audio layer
-  virtual int32_t ActiveAudioLayer(
-      AudioDeviceModule::AudioLayer& audioLayer) const;
-
-  // Main initializaton and termination
-  virtual InitStatus Init();
-  virtual int32_t Terminate();
-  virtual bool Initialized() const;
-
-  // Device enumeration
-  virtual int16_t PlayoutDevices();
-  virtual int16_t RecordingDevices();
-  virtual int32_t PlayoutDeviceName(uint16_t index,
-                                    char name[kAdmMaxDeviceNameSize],
-                                    char guid[kAdmMaxGuidSize]);
-  virtual int32_t RecordingDeviceName(uint16_t index,
-                                      char name[kAdmMaxDeviceNameSize],
-                                      char guid[kAdmMaxGuidSize]);
-
-  // Device selection
-  virtual int32_t SetPlayoutDevice(uint16_t index);
-  virtual int32_t SetPlayoutDevice(AudioDeviceModule::WindowsDeviceType device);
-  virtual int32_t SetRecordingDevice(uint16_t index);
-  virtual int32_t SetRecordingDevice(
-      AudioDeviceModule::WindowsDeviceType device);
-
-  // Audio transport initialization
-  virtual int32_t PlayoutIsAvailable(bool& available);
-  virtual int32_t InitPlayout();
-  virtual bool PlayoutIsInitialized() const;
-  virtual int32_t RecordingIsAvailable(bool& available);
-  virtual int32_t InitRecording();
-  virtual bool RecordingIsInitialized() const;
-
-  // Audio transport control
-  virtual int32_t StartPlayout();
-  virtual int32_t StopPlayout();
-  virtual bool Playing() const;
-  virtual int32_t StartRecording();
-  virtual int32_t StopRecording();
-  virtual bool Recording() const;
-
-  // Microphone Automatic Gain Control (AGC)
-  virtual int32_t SetAGC(bool enable);
-  virtual bool AGC() const;
-
-  // Audio mixer initialization
-  virtual int32_t InitSpeaker();
-  virtual bool SpeakerIsInitialized() const;
-  virtual int32_t InitMicrophone();
-  virtual bool MicrophoneIsInitialized() const;
-
-  // Speaker volume controls
-  virtual int32_t SpeakerVolumeIsAvailable(bool& available);
-  virtual int32_t SetSpeakerVolume(uint32_t volume);
-  virtual int32_t SpeakerVolume(uint32_t& volume) const;
-  virtual int32_t MaxSpeakerVolume(uint32_t& maxVolume) const;
-  virtual int32_t MinSpeakerVolume(uint32_t& minVolume) const;
-
-  // Microphone volume controls
-  virtual int32_t MicrophoneVolumeIsAvailable(bool& available);
-  virtual int32_t SetMicrophoneVolume(uint32_t volume);
-  virtual int32_t MicrophoneVolume(uint32_t& volume) const;
-  virtual int32_t MaxMicrophoneVolume(uint32_t& maxVolume) const;
-  virtual int32_t MinMicrophoneVolume(uint32_t& minVolume) const;
-
-  // Microphone mute control
-  virtual int32_t MicrophoneMuteIsAvailable(bool& available);
-  virtual int32_t SetMicrophoneMute(bool enable);
-  virtual int32_t MicrophoneMute(bool& enabled) const;
-
-  // Speaker mute control
-  virtual int32_t SpeakerMuteIsAvailable(bool& available);
-  virtual int32_t SetSpeakerMute(bool enable);
-  virtual int32_t SpeakerMute(bool& enabled) const;
-
-  // Stereo support
-  virtual int32_t StereoPlayoutIsAvailable(bool& available);
-  virtual int32_t SetStereoPlayout(bool enable);
-  virtual int32_t StereoPlayout(bool& enabled) const;
-  virtual int32_t StereoRecordingIsAvailable(bool& available);
-  virtual int32_t SetStereoRecording(bool enable);
-  virtual int32_t StereoRecording(bool& enabled) const;
-
-  // Delay information and control
-  virtual int32_t PlayoutDelay(uint16_t& delayMS) const;
-  virtual int32_t RecordingDelay(uint16_t& delayMS) const;
-
-  virtual bool PlayoutWarning() const;
-  virtual bool PlayoutError() const;
-  virtual bool RecordingWarning() const;
-  virtual bool RecordingError() const;
-  virtual void ClearPlayoutWarning();
-  virtual void ClearPlayoutError();
-  virtual void ClearRecordingWarning();
-  virtual void ClearRecordingError();
-
-  virtual void AttachAudioBuffer(AudioDeviceBuffer* audioBuffer);
-
- private:
-  virtual int32_t MicrophoneIsAvailable(bool& available);
-  virtual int32_t SpeakerIsAvailable(bool& available);
-
-  static void AtomicSet32(int32_t* theValue, int32_t newValue);
-  static int32_t AtomicGet32(int32_t* theValue);
-
-  static void logCAMsg(const rtc::LoggingSeverity sev,
-                       const char* msg,
-                       const char* err);
-
-  int32_t GetNumberDevices(const AudioObjectPropertyScope scope,
-                           AudioDeviceID scopedDeviceIds[],
-                           const uint32_t deviceListLength);
-
-  int32_t GetDeviceName(const AudioObjectPropertyScope scope,
-                        const uint16_t index,
-                        char* name);
-
-  int32_t InitDevice(uint16_t userDeviceIndex,
-                     AudioDeviceID& deviceId,
-                     bool isInput);
-
-  // Always work with our preferred playout format inside VoE.
-  // Then convert the output to the OS setting using an AudioConverter.
-  OSStatus SetDesiredPlayoutFormat();
-
-  static OSStatus objectListenerProc(
-      AudioObjectID objectId,
-      UInt32 numberAddresses,
-      const AudioObjectPropertyAddress addresses[],
-      void* clientData);
-
-  OSStatus implObjectListenerProc(AudioObjectID objectId,
-                                  UInt32 numberAddresses,
-                                  const AudioObjectPropertyAddress addresses[]);
-
-  int32_t HandleDeviceChange();
-
-  int32_t HandleStreamFormatChange(AudioObjectID objectId,
-                                   AudioObjectPropertyAddress propertyAddress);
-
-  int32_t HandleDataSourceChange(AudioObjectID objectId,
-                                 AudioObjectPropertyAddress propertyAddress);
-
-  int32_t HandleProcessorOverload(AudioObjectPropertyAddress propertyAddress);
-
-  static OSStatus deviceIOProc(AudioDeviceID device,
-                               const AudioTimeStamp* now,
-                               const AudioBufferList* inputData,
-                               const AudioTimeStamp* inputTime,
-                               AudioBufferList* outputData,
-                               const AudioTimeStamp* outputTime,
-                               void* clientData);
-
-  static OSStatus outConverterProc(
-      AudioConverterRef audioConverter,
-      UInt32* numberDataPackets,
-      AudioBufferList* data,
-      AudioStreamPacketDescription** dataPacketDescription,
-      void* userData);
-
-  static OSStatus inDeviceIOProc(AudioDeviceID device,
-                                 const AudioTimeStamp* now,
-                                 const AudioBufferList* inputData,
-                                 const AudioTimeStamp* inputTime,
-                                 AudioBufferList* outputData,
-                                 const AudioTimeStamp* outputTime,
-                                 void* clientData);
-
-  static OSStatus inConverterProc(
-      AudioConverterRef audioConverter,
-      UInt32* numberDataPackets,
-      AudioBufferList* data,
-      AudioStreamPacketDescription** dataPacketDescription,
-      void* inUserData);
-
-  OSStatus implDeviceIOProc(const AudioBufferList* inputData,
-                            const AudioTimeStamp* inputTime,
-                            AudioBufferList* outputData,
-                            const AudioTimeStamp* outputTime);
-
-  OSStatus implOutConverterProc(UInt32* numberDataPackets,
-                                AudioBufferList* data);
-
-  OSStatus implInDeviceIOProc(const AudioBufferList* inputData,
-                              const AudioTimeStamp* inputTime);
-
-  OSStatus implInConverterProc(UInt32* numberDataPackets,
-                               AudioBufferList* data);
-
-  static bool RunCapture(void*);
-  static bool RunRender(void*);
-  bool CaptureWorkerThread();
-  bool RenderWorkerThread();
-
-  bool KeyPressed();
-
-  AudioDeviceBuffer* _ptrAudioBuffer;
-
-  rtc::CriticalSection _critSect;
-
-  EventWrapper& _stopEventRec;
-  EventWrapper& _stopEvent;
-
-  // TODO(pbos): Replace with direct members, just start/stop, no need to
-  // recreate the thread.
-  // Only valid/running between calls to StartRecording and StopRecording.
-  std::unique_ptr<rtc::PlatformThread> capture_worker_thread_;
-
-  // Only valid/running between calls to StartPlayout and StopPlayout.
-  std::unique_ptr<rtc::PlatformThread> render_worker_thread_;
-
-  AudioMixerManagerMac _mixerManager;
-
-  uint16_t _inputDeviceIndex;
-  uint16_t _outputDeviceIndex;
-  AudioDeviceID _inputDeviceID;
-  AudioDeviceID _outputDeviceID;
-#if __MAC_OS_X_VERSION_MAX_ALLOWED >= 1050
-  AudioDeviceIOProcID _inDeviceIOProcID;
-  AudioDeviceIOProcID _deviceIOProcID;
-#endif
-  bool _inputDeviceIsSpecified;
-  bool _outputDeviceIsSpecified;
-
-  uint8_t _recChannels;
-  uint8_t _playChannels;
-
-  Float32* _captureBufData;
-  SInt16* _renderBufData;
-
-  SInt16 _renderConvertData[PLAY_BUF_SIZE_IN_SAMPLES];
-
-  bool _initialized;
-  bool _isShutDown;
-  bool _recording;
-  bool _playing;
-  bool _recIsInitialized;
-  bool _playIsInitialized;
-  bool _AGC;
-
-  // Atomically set varaibles
-  int32_t _renderDeviceIsAlive;
-  int32_t _captureDeviceIsAlive;
-
-  bool _twoDevices;
-  bool _doStop;  // For play if not shared device or play+rec if shared device
-  bool _doStopRec;  // For rec if not shared device
-  bool _macBookPro;
-  bool _macBookProPanRight;
-
-  AudioConverterRef _captureConverter;
-  AudioConverterRef _renderConverter;
-
-  AudioStreamBasicDescription _outStreamFormat;
-  AudioStreamBasicDescription _outDesiredFormat;
-  AudioStreamBasicDescription _inStreamFormat;
-  AudioStreamBasicDescription _inDesiredFormat;
-
-  uint32_t _captureLatencyUs;
-  uint32_t _renderLatencyUs;
-
-  // Atomically set variables
-  mutable int32_t _captureDelayUs;
-  mutable int32_t _renderDelayUs;
-
-  int32_t _renderDelayOffsetSamples;
-
-  uint16_t _playWarning;
-  uint16_t _playError;
-  uint16_t _recWarning;
-  uint16_t _recError;
-
-  PaUtilRingBuffer* _paCaptureBuffer;
-  PaUtilRingBuffer* _paRenderBuffer;
-
-  semaphore_t _renderSemaphore;
-  semaphore_t _captureSemaphore;
-
-  int _captureBufSizeSamples;
-  int _renderBufSizeSamples;
-
-  // Typing detection
-  // 0x5c is key "9", after that comes function keys.
-  bool prev_key_state_[0x5d];
-
-  int get_mic_volume_counter_ms_;
-};
-
-}  // namespace webrtc
-
-#endif  // MODULES_AUDIO_DEVICE_MAIN_SOURCE_MAC_AUDIO_DEVICE_MAC_H_
diff --git a/modules/audio_device/mac/audio_mixer_manager_mac.cc b/modules/audio_device/mac/audio_mixer_manager_mac.cc
deleted file mode 100644
index 6bf6dbd..0000000
--- a/modules/audio_device/mac/audio_mixer_manager_mac.cc
+++ /dev/null
@@ -1,912 +0,0 @@
-/*
- *  Copyright (c) 2012 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_device/mac/audio_mixer_manager_mac.h"
-
-#include <unistd.h>  // getpid()
-
-namespace webrtc {
-
-#define WEBRTC_CA_RETURN_ON_ERR(expr)                                  \
-  do {                                                                 \
-    err = expr;                                                        \
-    if (err != noErr) {                                                \
-      logCAMsg(rtc::LS_ERROR, "Error in " #expr,                       \
-               (const char*) & err);                                   \
-      return -1;                                                       \
-    }                                                                  \
-  } while (0)
-
-#define WEBRTC_CA_LOG_ERR(expr)                                        \
-  do {                                                                 \
-    err = expr;                                                        \
-    if (err != noErr) {                                                \
-      logCAMsg(rtc::LS_ERROR, "Error in " #expr,                       \
-               (const char*) & err);                                   \
-    }                                                                  \
-  } while (0)
-
-#define WEBRTC_CA_LOG_WARN(expr)                                         \
-  do {                                                                   \
-    err = expr;                                                          \
-    if (err != noErr) {                                                  \
-      logCAMsg(rtc::LS_WARNING, "Error in " #expr,                       \
-               (const char*) & err);                                     \
-    }                                                                    \
-  } while (0)
-
-AudioMixerManagerMac::AudioMixerManagerMac()
-    : _inputDeviceID(kAudioObjectUnknown),
-      _outputDeviceID(kAudioObjectUnknown),
-      _noInputChannels(0),
-      _noOutputChannels(0) {
-  LOG(LS_INFO) << __FUNCTION__ << " created";
-}
-
-AudioMixerManagerMac::~AudioMixerManagerMac() {
-  LOG(LS_INFO) << __FUNCTION__ << " destroyed";
-  Close();
-}
-
-// ============================================================================
-//	                                PUBLIC METHODS
-// ============================================================================
-
-int32_t AudioMixerManagerMac::Close() {
-  LOG(LS_VERBOSE) << __FUNCTION__;
-
-  rtc::CritScope lock(&_critSect);
-
-  CloseSpeaker();
-  CloseMicrophone();
-
-  return 0;
-}
-
-int32_t AudioMixerManagerMac::CloseSpeaker() {
-  LOG(LS_VERBOSE) << __FUNCTION__;
-
-  rtc::CritScope lock(&_critSect);
-
-  _outputDeviceID = kAudioObjectUnknown;
-  _noOutputChannels = 0;
-
-  return 0;
-}
-
-int32_t AudioMixerManagerMac::CloseMicrophone() {
-  LOG(LS_VERBOSE) << __FUNCTION__;
-
-  rtc::CritScope lock(&_critSect);
-
-  _inputDeviceID = kAudioObjectUnknown;
-  _noInputChannels = 0;
-
-  return 0;
-}
-
-int32_t AudioMixerManagerMac::OpenSpeaker(AudioDeviceID deviceID) {
-  LOG(LS_VERBOSE) << "AudioMixerManagerMac::OpenSpeaker(id=" << deviceID << ")";
-
-  rtc::CritScope lock(&_critSect);
-
-  OSStatus err = noErr;
-  UInt32 size = 0;
-  pid_t hogPid = -1;
-
-  _outputDeviceID = deviceID;
-
-  // Check which process, if any, has hogged the device.
-  AudioObjectPropertyAddress propertyAddress = {
-      kAudioDevicePropertyHogMode, kAudioDevicePropertyScopeOutput, 0};
-
-  size = sizeof(hogPid);
-  WEBRTC_CA_RETURN_ON_ERR(AudioObjectGetPropertyData(
-      _outputDeviceID, &propertyAddress, 0, NULL, &size, &hogPid));
-
-  if (hogPid == -1) {
-    LOG(LS_VERBOSE) << "No process has hogged the input device";
-  }
-  // getpid() is apparently "always successful"
-  else if (hogPid == getpid()) {
-    LOG(LS_VERBOSE) << "Our process has hogged the input device";
-  } else {
-    LOG(LS_WARNING) << "Another process (pid = " << static_cast<int>(hogPid)
-                    << ") has hogged the input device";
-
-    return -1;
-  }
-
-  // get number of channels from stream format
-  propertyAddress.mSelector = kAudioDevicePropertyStreamFormat;
-
-  // Get the stream format, to be able to read the number of channels.
-  AudioStreamBasicDescription streamFormat;
-  size = sizeof(AudioStreamBasicDescription);
-  memset(&streamFormat, 0, size);
-  WEBRTC_CA_RETURN_ON_ERR(AudioObjectGetPropertyData(
-      _outputDeviceID, &propertyAddress, 0, NULL, &size, &streamFormat));
-
-  _noOutputChannels = streamFormat.mChannelsPerFrame;
-
-  return 0;
-}
-
-int32_t AudioMixerManagerMac::OpenMicrophone(AudioDeviceID deviceID) {
-  LOG(LS_VERBOSE) << "AudioMixerManagerMac::OpenMicrophone(id=" << deviceID
-                  << ")";
-
-  rtc::CritScope lock(&_critSect);
-
-  OSStatus err = noErr;
-  UInt32 size = 0;
-  pid_t hogPid = -1;
-
-  _inputDeviceID = deviceID;
-
-  // Check which process, if any, has hogged the device.
-  AudioObjectPropertyAddress propertyAddress = {
-      kAudioDevicePropertyHogMode, kAudioDevicePropertyScopeInput, 0};
-  size = sizeof(hogPid);
-  WEBRTC_CA_RETURN_ON_ERR(AudioObjectGetPropertyData(
-      _inputDeviceID, &propertyAddress, 0, NULL, &size, &hogPid));
-  if (hogPid == -1) {
-    LOG(LS_VERBOSE) << "No process has hogged the input device";
-  }
-  // getpid() is apparently "always successful"
-  else if (hogPid == getpid()) {
-    LOG(LS_VERBOSE) << "Our process has hogged the input device";
-  } else {
-    LOG(LS_WARNING) << "Another process (pid = " << static_cast<int>(hogPid)
-                    << ") has hogged the input device";
-
-    return -1;
-  }
-
-  // get number of channels from stream format
-  propertyAddress.mSelector = kAudioDevicePropertyStreamFormat;
-
-  // Get the stream format, to be able to read the number of channels.
-  AudioStreamBasicDescription streamFormat;
-  size = sizeof(AudioStreamBasicDescription);
-  memset(&streamFormat, 0, size);
-  WEBRTC_CA_RETURN_ON_ERR(AudioObjectGetPropertyData(
-      _inputDeviceID, &propertyAddress, 0, NULL, &size, &streamFormat));
-
-  _noInputChannels = streamFormat.mChannelsPerFrame;
-
-  return 0;
-}
-
-bool AudioMixerManagerMac::SpeakerIsInitialized() const {
-  LOG(LS_INFO) << __FUNCTION__;
-
-  return (_outputDeviceID != kAudioObjectUnknown);
-}
-
-bool AudioMixerManagerMac::MicrophoneIsInitialized() const {
-  LOG(LS_INFO) << __FUNCTION__;
-
-  return (_inputDeviceID != kAudioObjectUnknown);
-}
-
-int32_t AudioMixerManagerMac::SetSpeakerVolume(uint32_t volume) {
-  LOG(LS_VERBOSE) << "AudioMixerManagerMac::SetSpeakerVolume(volume=" << volume
-                  << ")";
-
-  rtc::CritScope lock(&_critSect);
-
-  if (_outputDeviceID == kAudioObjectUnknown) {
-    LOG(LS_WARNING) << "device ID has not been set";
-    return -1;
-  }
-
-  OSStatus err = noErr;
-  UInt32 size = 0;
-  bool success = false;
-
-  // volume range is 0.0 - 1.0, convert from 0 -255
-  const Float32 vol = (Float32)(volume / 255.0);
-
-  assert(vol <= 1.0 && vol >= 0.0);
-
-  // Does the capture device have a master volume control?
-  // If so, use it exclusively.
-  AudioObjectPropertyAddress propertyAddress = {
-      kAudioDevicePropertyVolumeScalar, kAudioDevicePropertyScopeOutput, 0};
-  Boolean isSettable = false;
-  err = AudioObjectIsPropertySettable(_outputDeviceID, &propertyAddress,
-                                      &isSettable);
-  if (err == noErr && isSettable) {
-    size = sizeof(vol);
-    WEBRTC_CA_RETURN_ON_ERR(AudioObjectSetPropertyData(
-        _outputDeviceID, &propertyAddress, 0, NULL, size, &vol));
-
-    return 0;
-  }
-
-  // Otherwise try to set each channel.
-  for (UInt32 i = 1; i <= _noOutputChannels; i++) {
-    propertyAddress.mElement = i;
-    isSettable = false;
-    err = AudioObjectIsPropertySettable(_outputDeviceID, &propertyAddress,
-                                        &isSettable);
-    if (err == noErr && isSettable) {
-      size = sizeof(vol);
-      WEBRTC_CA_RETURN_ON_ERR(AudioObjectSetPropertyData(
-          _outputDeviceID, &propertyAddress, 0, NULL, size, &vol));
-    }
-    success = true;
-  }
-
-  if (!success) {
-    LOG(LS_WARNING) << "Unable to set a volume on any output channel";
-    return -1;
-  }
-
-  return 0;
-}
-
-int32_t AudioMixerManagerMac::SpeakerVolume(uint32_t& volume) const {
-  if (_outputDeviceID == kAudioObjectUnknown) {
-    LOG(LS_WARNING) << "device ID has not been set";
-    return -1;
-  }
-
-  OSStatus err = noErr;
-  UInt32 size = 0;
-  unsigned int channels = 0;
-  Float32 channelVol = 0;
-  Float32 vol = 0;
-
-  // Does the device have a master volume control?
-  // If so, use it exclusively.
-  AudioObjectPropertyAddress propertyAddress = {
-      kAudioDevicePropertyVolumeScalar, kAudioDevicePropertyScopeOutput, 0};
-  Boolean hasProperty =
-      AudioObjectHasProperty(_outputDeviceID, &propertyAddress);
-  if (hasProperty) {
-    size = sizeof(vol);
-    WEBRTC_CA_RETURN_ON_ERR(AudioObjectGetPropertyData(
-        _outputDeviceID, &propertyAddress, 0, NULL, &size, &vol));
-
-    // vol 0.0 to 1.0 -> convert to 0 - 255
-    volume = static_cast<uint32_t>(vol * 255 + 0.5);
-  } else {
-    // Otherwise get the average volume across channels.
-    vol = 0;
-    for (UInt32 i = 1; i <= _noOutputChannels; i++) {
-      channelVol = 0;
-      propertyAddress.mElement = i;
-      hasProperty = AudioObjectHasProperty(_outputDeviceID, &propertyAddress);
-      if (hasProperty) {
-        size = sizeof(channelVol);
-        WEBRTC_CA_RETURN_ON_ERR(AudioObjectGetPropertyData(
-            _outputDeviceID, &propertyAddress, 0, NULL, &size, &channelVol));
-
-        vol += channelVol;
-        channels++;
-      }
-    }
-
-    if (channels == 0) {
-      LOG(LS_WARNING) << "Unable to get a volume on any channel";
-      return -1;
-    }
-
-    assert(channels > 0);
-    // vol 0.0 to 1.0 -> convert to 0 - 255
-    volume = static_cast<uint32_t>(255 * vol / channels + 0.5);
-  }
-
-  LOG(LS_VERBOSE) << "AudioMixerManagerMac::SpeakerVolume() => vol=" << vol;
-
-  return 0;
-}
-
-int32_t AudioMixerManagerMac::MaxSpeakerVolume(uint32_t& maxVolume) const {
-  if (_outputDeviceID == kAudioObjectUnknown) {
-    LOG(LS_WARNING) << "device ID has not been set";
-    return -1;
-  }
-
-  // volume range is 0.0 to 1.0
-  // we convert that to 0 - 255
-  maxVolume = 255;
-
-  return 0;
-}
-
-int32_t AudioMixerManagerMac::MinSpeakerVolume(uint32_t& minVolume) const {
-  if (_outputDeviceID == kAudioObjectUnknown) {
-    LOG(LS_WARNING) << "device ID has not been set";
-    return -1;
-  }
-
-  // volume range is 0.0 to 1.0
-  // we convert that to 0 - 255
-  minVolume = 0;
-
-  return 0;
-}
-
-int32_t AudioMixerManagerMac::SpeakerVolumeIsAvailable(bool& available) {
-  if (_outputDeviceID == kAudioObjectUnknown) {
-    LOG(LS_WARNING) << "device ID has not been set";
-    return -1;
-  }
-
-  OSStatus err = noErr;
-
-  // Does the capture device have a master volume control?
-  // If so, use it exclusively.
-  AudioObjectPropertyAddress propertyAddress = {
-      kAudioDevicePropertyVolumeScalar, kAudioDevicePropertyScopeOutput, 0};
-  Boolean isSettable = false;
-  err = AudioObjectIsPropertySettable(_outputDeviceID, &propertyAddress,
-                                      &isSettable);
-  if (err == noErr && isSettable) {
-    available = true;
-    return 0;
-  }
-
-  // Otherwise try to set each channel.
-  for (UInt32 i = 1; i <= _noOutputChannels; i++) {
-    propertyAddress.mElement = i;
-    isSettable = false;
-    err = AudioObjectIsPropertySettable(_outputDeviceID, &propertyAddress,
-                                        &isSettable);
-    if (err != noErr || !isSettable) {
-      available = false;
-      LOG(LS_WARNING) << "Volume cannot be set for output channel " << i
-                      << ", err=" << err;
-      return -1;
-    }
-  }
-
-  available = true;
-  return 0;
-}
-
-int32_t AudioMixerManagerMac::SpeakerMuteIsAvailable(bool& available) {
-  if (_outputDeviceID == kAudioObjectUnknown) {
-    LOG(LS_WARNING) << "device ID has not been set";
-    return -1;
-  }
-
-  OSStatus err = noErr;
-
-  // Does the capture device have a master mute control?
-  // If so, use it exclusively.
-  AudioObjectPropertyAddress propertyAddress = {
-      kAudioDevicePropertyMute, kAudioDevicePropertyScopeOutput, 0};
-  Boolean isSettable = false;
-  err = AudioObjectIsPropertySettable(_outputDeviceID, &propertyAddress,
-                                      &isSettable);
-  if (err == noErr && isSettable) {
-    available = true;
-    return 0;
-  }
-
-  // Otherwise try to set each channel.
-  for (UInt32 i = 1; i <= _noOutputChannels; i++) {
-    propertyAddress.mElement = i;
-    isSettable = false;
-    err = AudioObjectIsPropertySettable(_outputDeviceID, &propertyAddress,
-                                        &isSettable);
-    if (err != noErr || !isSettable) {
-      available = false;
-      LOG(LS_WARNING) << "Mute cannot be set for output channel " << i
-                      << ", err=" << err;
-      return -1;
-    }
-  }
-
-  available = true;
-  return 0;
-}
-
-int32_t AudioMixerManagerMac::SetSpeakerMute(bool enable) {
-  LOG(LS_VERBOSE) << "AudioMixerManagerMac::SetSpeakerMute(enable=" << enable
-                  << ")";
-
-  rtc::CritScope lock(&_critSect);
-
-  if (_outputDeviceID == kAudioObjectUnknown) {
-    LOG(LS_WARNING) << "device ID has not been set";
-    return -1;
-  }
-
-  OSStatus err = noErr;
-  UInt32 size = 0;
-  UInt32 mute = enable ? 1 : 0;
-  bool success = false;
-
-  // Does the render device have a master mute control?
-  // If so, use it exclusively.
-  AudioObjectPropertyAddress propertyAddress = {
-      kAudioDevicePropertyMute, kAudioDevicePropertyScopeOutput, 0};
-  Boolean isSettable = false;
-  err = AudioObjectIsPropertySettable(_outputDeviceID, &propertyAddress,
-                                      &isSettable);
-  if (err == noErr && isSettable) {
-    size = sizeof(mute);
-    WEBRTC_CA_RETURN_ON_ERR(AudioObjectSetPropertyData(
-        _outputDeviceID, &propertyAddress, 0, NULL, size, &mute));
-
-    return 0;
-  }
-
-  // Otherwise try to set each channel.
-  for (UInt32 i = 1; i <= _noOutputChannels; i++) {
-    propertyAddress.mElement = i;
-    isSettable = false;
-    err = AudioObjectIsPropertySettable(_outputDeviceID, &propertyAddress,
-                                        &isSettable);
-    if (err == noErr && isSettable) {
-      size = sizeof(mute);
-      WEBRTC_CA_RETURN_ON_ERR(AudioObjectSetPropertyData(
-          _outputDeviceID, &propertyAddress, 0, NULL, size, &mute));
-    }
-    success = true;
-  }
-
-  if (!success) {
-    LOG(LS_WARNING) << "Unable to set mute on any input channel";
-    return -1;
-  }
-
-  return 0;
-}
-
-int32_t AudioMixerManagerMac::SpeakerMute(bool& enabled) const {
-  if (_outputDeviceID == kAudioObjectUnknown) {
-    LOG(LS_WARNING) << "device ID has not been set";
-    return -1;
-  }
-
-  OSStatus err = noErr;
-  UInt32 size = 0;
-  unsigned int channels = 0;
-  UInt32 channelMuted = 0;
-  UInt32 muted = 0;
-
-  // Does the device have a master volume control?
-  // If so, use it exclusively.
-  AudioObjectPropertyAddress propertyAddress = {
-      kAudioDevicePropertyMute, kAudioDevicePropertyScopeOutput, 0};
-  Boolean hasProperty =
-      AudioObjectHasProperty(_outputDeviceID, &propertyAddress);
-  if (hasProperty) {
-    size = sizeof(muted);
-    WEBRTC_CA_RETURN_ON_ERR(AudioObjectGetPropertyData(
-        _outputDeviceID, &propertyAddress, 0, NULL, &size, &muted));
-
-    // 1 means muted
-    enabled = static_cast<bool>(muted);
-  } else {
-    // Otherwise check if all channels are muted.
-    for (UInt32 i = 1; i <= _noOutputChannels; i++) {
-      muted = 0;
-      propertyAddress.mElement = i;
-      hasProperty = AudioObjectHasProperty(_outputDeviceID, &propertyAddress);
-      if (hasProperty) {
-        size = sizeof(channelMuted);
-        WEBRTC_CA_RETURN_ON_ERR(AudioObjectGetPropertyData(
-            _outputDeviceID, &propertyAddress, 0, NULL, &size, &channelMuted));
-
-        muted = (muted && channelMuted);
-        channels++;
-      }
-    }
-
-    if (channels == 0) {
-      LOG(LS_WARNING) << "Unable to get mute for any channel";
-      return -1;
-    }
-
-    assert(channels > 0);
-    // 1 means muted
-    enabled = static_cast<bool>(muted);
-  }
-
-  LOG(LS_VERBOSE) << "AudioMixerManagerMac::SpeakerMute() => enabled="
-                  << enabled;
-
-  return 0;
-}
-
-int32_t AudioMixerManagerMac::StereoPlayoutIsAvailable(bool& available) {
-  if (_outputDeviceID == kAudioObjectUnknown) {
-    LOG(LS_WARNING) << "device ID has not been set";
-    return -1;
-  }
-
-  available = (_noOutputChannels == 2);
-  return 0;
-}
-
-int32_t AudioMixerManagerMac::StereoRecordingIsAvailable(bool& available) {
-  if (_inputDeviceID == kAudioObjectUnknown) {
-    LOG(LS_WARNING) << "device ID has not been set";
-    return -1;
-  }
-
-  available = (_noInputChannels == 2);
-  return 0;
-}
-
-int32_t AudioMixerManagerMac::MicrophoneMuteIsAvailable(bool& available) {
-  if (_inputDeviceID == kAudioObjectUnknown) {
-    LOG(LS_WARNING) << "device ID has not been set";
-    return -1;
-  }
-
-  OSStatus err = noErr;
-
-  // Does the capture device have a master mute control?
-  // If so, use it exclusively.
-  AudioObjectPropertyAddress propertyAddress = {
-      kAudioDevicePropertyMute, kAudioDevicePropertyScopeInput, 0};
-  Boolean isSettable = false;
-  err = AudioObjectIsPropertySettable(_inputDeviceID, &propertyAddress,
-                                      &isSettable);
-  if (err == noErr && isSettable) {
-    available = true;
-    return 0;
-  }
-
-  // Otherwise try to set each channel.
-  for (UInt32 i = 1; i <= _noInputChannels; i++) {
-    propertyAddress.mElement = i;
-    isSettable = false;
-    err = AudioObjectIsPropertySettable(_inputDeviceID, &propertyAddress,
-                                        &isSettable);
-    if (err != noErr || !isSettable) {
-      available = false;
-      LOG(LS_WARNING) << "Mute cannot be set for output channel " << i
-                      << ", err=" << err;
-      return -1;
-    }
-  }
-
-  available = true;
-  return 0;
-}
-
-int32_t AudioMixerManagerMac::SetMicrophoneMute(bool enable) {
-  LOG(LS_VERBOSE) << "AudioMixerManagerMac::SetMicrophoneMute(enable=" << enable
-                  << ")";
-
-  rtc::CritScope lock(&_critSect);
-
-  if (_inputDeviceID == kAudioObjectUnknown) {
-    LOG(LS_WARNING) << "device ID has not been set";
-    return -1;
-  }
-
-  OSStatus err = noErr;
-  UInt32 size = 0;
-  UInt32 mute = enable ? 1 : 0;
-  bool success = false;
-
-  // Does the capture device have a master mute control?
-  // If so, use it exclusively.
-  AudioObjectPropertyAddress propertyAddress = {
-      kAudioDevicePropertyMute, kAudioDevicePropertyScopeInput, 0};
-  Boolean isSettable = false;
-  err = AudioObjectIsPropertySettable(_inputDeviceID, &propertyAddress,
-                                      &isSettable);
-  if (err == noErr && isSettable) {
-    size = sizeof(mute);
-    WEBRTC_CA_RETURN_ON_ERR(AudioObjectSetPropertyData(
-        _inputDeviceID, &propertyAddress, 0, NULL, size, &mute));
-
-    return 0;
-  }
-
-  // Otherwise try to set each channel.
-  for (UInt32 i = 1; i <= _noInputChannels; i++) {
-    propertyAddress.mElement = i;
-    isSettable = false;
-    err = AudioObjectIsPropertySettable(_inputDeviceID, &propertyAddress,
-                                        &isSettable);
-    if (err == noErr && isSettable) {
-      size = sizeof(mute);
-      WEBRTC_CA_RETURN_ON_ERR(AudioObjectSetPropertyData(
-          _inputDeviceID, &propertyAddress, 0, NULL, size, &mute));
-    }
-    success = true;
-  }
-
-  if (!success) {
-    LOG(LS_WARNING) << "Unable to set mute on any input channel";
-    return -1;
-  }
-
-  return 0;
-}
-
-int32_t AudioMixerManagerMac::MicrophoneMute(bool& enabled) const {
-  if (_inputDeviceID == kAudioObjectUnknown) {
-    LOG(LS_WARNING) << "device ID has not been set";
-    return -1;
-  }
-
-  OSStatus err = noErr;
-  UInt32 size = 0;
-  unsigned int channels = 0;
-  UInt32 channelMuted = 0;
-  UInt32 muted = 0;
-
-  // Does the device have a master volume control?
-  // If so, use it exclusively.
-  AudioObjectPropertyAddress propertyAddress = {
-      kAudioDevicePropertyMute, kAudioDevicePropertyScopeInput, 0};
-  Boolean hasProperty =
-      AudioObjectHasProperty(_inputDeviceID, &propertyAddress);
-  if (hasProperty) {
-    size = sizeof(muted);
-    WEBRTC_CA_RETURN_ON_ERR(AudioObjectGetPropertyData(
-        _inputDeviceID, &propertyAddress, 0, NULL, &size, &muted));
-
-    // 1 means muted
-    enabled = static_cast<bool>(muted);
-  } else {
-    // Otherwise check if all channels are muted.
-    for (UInt32 i = 1; i <= _noInputChannels; i++) {
-      muted = 0;
-      propertyAddress.mElement = i;
-      hasProperty = AudioObjectHasProperty(_inputDeviceID, &propertyAddress);
-      if (hasProperty) {
-        size = sizeof(channelMuted);
-        WEBRTC_CA_RETURN_ON_ERR(AudioObjectGetPropertyData(
-            _inputDeviceID, &propertyAddress, 0, NULL, &size, &channelMuted));
-
-        muted = (muted && channelMuted);
-        channels++;
-      }
-    }
-
-    if (channels == 0) {
-      LOG(LS_WARNING) << "Unable to get mute for any channel";
-      return -1;
-    }
-
-    assert(channels > 0);
-    // 1 means muted
-    enabled = static_cast<bool>(muted);
-  }
-
-  LOG(LS_VERBOSE) << "AudioMixerManagerMac::MicrophoneMute() => enabled="
-                  << enabled;
-
-  return 0;
-}
-
-int32_t AudioMixerManagerMac::MicrophoneVolumeIsAvailable(bool& available) {
-  if (_inputDeviceID == kAudioObjectUnknown) {
-    LOG(LS_WARNING) << "device ID has not been set";
-    return -1;
-  }
-
-  OSStatus err = noErr;
-
-  // Does the capture device have a master volume control?
-  // If so, use it exclusively.
-  AudioObjectPropertyAddress propertyAddress = {
-      kAudioDevicePropertyVolumeScalar, kAudioDevicePropertyScopeInput, 0};
-  Boolean isSettable = false;
-  err = AudioObjectIsPropertySettable(_inputDeviceID, &propertyAddress,
-                                      &isSettable);
-  if (err == noErr && isSettable) {
-    available = true;
-    return 0;
-  }
-
-  // Otherwise try to set each channel.
-  for (UInt32 i = 1; i <= _noInputChannels; i++) {
-    propertyAddress.mElement = i;
-    isSettable = false;
-    err = AudioObjectIsPropertySettable(_inputDeviceID, &propertyAddress,
-                                        &isSettable);
-    if (err != noErr || !isSettable) {
-      available = false;
-      LOG(LS_WARNING) << "Volume cannot be set for input channel " << i
-                      << ", err=" << err;
-      return -1;
-    }
-  }
-
-  available = true;
-  return 0;
-}
-
-int32_t AudioMixerManagerMac::SetMicrophoneVolume(uint32_t volume) {
-  LOG(LS_VERBOSE) << "AudioMixerManagerMac::SetMicrophoneVolume(volume="
-                  << volume << ")";
-
-  rtc::CritScope lock(&_critSect);
-
-  if (_inputDeviceID == kAudioObjectUnknown) {
-    LOG(LS_WARNING) << "device ID has not been set";
-    return -1;
-  }
-
-  OSStatus err = noErr;
-  UInt32 size = 0;
-  bool success = false;
-
-  // volume range is 0.0 - 1.0, convert from 0 - 255
-  const Float32 vol = (Float32)(volume / 255.0);
-
-  assert(vol <= 1.0 && vol >= 0.0);
-
-  // Does the capture device have a master volume control?
-  // If so, use it exclusively.
-  AudioObjectPropertyAddress propertyAddress = {
-      kAudioDevicePropertyVolumeScalar, kAudioDevicePropertyScopeInput, 0};
-  Boolean isSettable = false;
-  err = AudioObjectIsPropertySettable(_inputDeviceID, &propertyAddress,
-                                      &isSettable);
-  if (err == noErr && isSettable) {
-    size = sizeof(vol);
-    WEBRTC_CA_RETURN_ON_ERR(AudioObjectSetPropertyData(
-        _inputDeviceID, &propertyAddress, 0, NULL, size, &vol));
-
-    return 0;
-  }
-
-  // Otherwise try to set each channel.
-  for (UInt32 i = 1; i <= _noInputChannels; i++) {
-    propertyAddress.mElement = i;
-    isSettable = false;
-    err = AudioObjectIsPropertySettable(_inputDeviceID, &propertyAddress,
-                                        &isSettable);
-    if (err == noErr && isSettable) {
-      size = sizeof(vol);
-      WEBRTC_CA_RETURN_ON_ERR(AudioObjectSetPropertyData(
-          _inputDeviceID, &propertyAddress, 0, NULL, size, &vol));
-    }
-    success = true;
-  }
-
-  if (!success) {
-    LOG(LS_WARNING) << "Unable to set a level on any input channel";
-    return -1;
-  }
-
-  return 0;
-}
-
-int32_t AudioMixerManagerMac::MicrophoneVolume(uint32_t& volume) const {
-  if (_inputDeviceID == kAudioObjectUnknown) {
-    LOG(LS_WARNING) << "device ID has not been set";
-    return -1;
-  }
-
-  OSStatus err = noErr;
-  UInt32 size = 0;
-  unsigned int channels = 0;
-  Float32 channelVol = 0;
-  Float32 volFloat32 = 0;
-
-  // Does the device have a master volume control?
-  // If so, use it exclusively.
-  AudioObjectPropertyAddress propertyAddress = {
-      kAudioDevicePropertyVolumeScalar, kAudioDevicePropertyScopeInput, 0};
-  Boolean hasProperty =
-      AudioObjectHasProperty(_inputDeviceID, &propertyAddress);
-  if (hasProperty) {
-    size = sizeof(volFloat32);
-    WEBRTC_CA_RETURN_ON_ERR(AudioObjectGetPropertyData(
-        _inputDeviceID, &propertyAddress, 0, NULL, &size, &volFloat32));
-
-    // vol 0.0 to 1.0 -> convert to 0 - 255
-    volume = static_cast<uint32_t>(volFloat32 * 255 + 0.5);
-  } else {
-    // Otherwise get the average volume across channels.
-    volFloat32 = 0;
-    for (UInt32 i = 1; i <= _noInputChannels; i++) {
-      channelVol = 0;
-      propertyAddress.mElement = i;
-      hasProperty = AudioObjectHasProperty(_inputDeviceID, &propertyAddress);
-      if (hasProperty) {
-        size = sizeof(channelVol);
-        WEBRTC_CA_RETURN_ON_ERR(AudioObjectGetPropertyData(
-            _inputDeviceID, &propertyAddress, 0, NULL, &size, &channelVol));
-
-        volFloat32 += channelVol;
-        channels++;
-      }
-    }
-
-    if (channels == 0) {
-      LOG(LS_WARNING) << "Unable to get a level on any channel";
-      return -1;
-    }
-
-    assert(channels > 0);
-    // vol 0.0 to 1.0 -> convert to 0 - 255
-    volume = static_cast<uint32_t>(255 * volFloat32 / channels + 0.5);
-  }
-
-  LOG(LS_VERBOSE) << "AudioMixerManagerMac::MicrophoneVolume() => vol="
-                  << volume;
-
-  return 0;
-}
-
-int32_t AudioMixerManagerMac::MaxMicrophoneVolume(uint32_t& maxVolume) const {
-  if (_inputDeviceID == kAudioObjectUnknown) {
-    LOG(LS_WARNING) << "device ID has not been set";
-    return -1;
-  }
-
-  // volume range is 0.0 to 1.0
-  // we convert that to 0 - 255
-  maxVolume = 255;
-
-  return 0;
-}
-
-int32_t AudioMixerManagerMac::MinMicrophoneVolume(uint32_t& minVolume) const {
-  if (_inputDeviceID == kAudioObjectUnknown) {
-    LOG(LS_WARNING) << "device ID has not been set";
-    return -1;
-  }
-
-  // volume range is 0.0 to 1.0
-  // we convert that to 0 - 10
-  minVolume = 0;
-
-  return 0;
-}
-
-// ============================================================================
-//                                 Private Methods
-// ============================================================================
-
-// CoreAudio errors are best interpreted as four character strings.
-void AudioMixerManagerMac::logCAMsg(const rtc::LoggingSeverity sev,
-                              const char* msg,
-                              const char* err) {
-  RTC_DCHECK(msg != NULL);
-  RTC_DCHECK(err != NULL);
-  RTC_DCHECK(sev == rtc::LS_ERROR || sev == rtc::LS_WARNING);
-
-#ifdef WEBRTC_ARCH_BIG_ENDIAN
-  switch (sev) {
-    case rtc::LS_ERROR:
-      LOG(LS_ERROR) << msg << ": " << err[0] << err[1] << err[2] << err[3];
-      break;
-    case rtc::LS_WARNING:
-      LOG(LS_WARNING) << msg << ": " << err[0] << err[1] << err[2] << err[3];
-      break;
-    default:
-      break;
-  }
-#else
-  // We need to flip the characters in this case.
-   switch (sev) {
-    case rtc::LS_ERROR:
-      LOG(LS_ERROR) << msg << ": " << err[3] << err[2] << err[1] << err[0];
-      break;
-    case rtc::LS_WARNING:
-      LOG(LS_WARNING) << msg << ": " << err[3] << err[2] << err[1] << err[0];
-      break;
-    default:
-      break;
-  }
-#endif
-}
-
-}  // namespace webrtc
-// EOF
diff --git a/modules/audio_device/mac/audio_mixer_manager_mac.h b/modules/audio_device/mac/audio_mixer_manager_mac.h
deleted file mode 100644
index 74d17ba..0000000
--- a/modules/audio_device/mac/audio_mixer_manager_mac.h
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- *  Copyright (c) 2011 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_AUDIO_DEVICE_AUDIO_MIXER_MANAGER_MAC_H
-#define WEBRTC_AUDIO_DEVICE_AUDIO_MIXER_MANAGER_MAC_H
-
-#include "webrtc/modules/audio_device/include/audio_device.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/typedefs.h"
-
-#include <CoreAudio/CoreAudio.h>
-
-namespace webrtc {
-
-class AudioMixerManagerMac {
- public:
-  int32_t OpenSpeaker(AudioDeviceID deviceID);
-  int32_t OpenMicrophone(AudioDeviceID deviceID);
-  int32_t SetSpeakerVolume(uint32_t volume);
-  int32_t SpeakerVolume(uint32_t& volume) const;
-  int32_t MaxSpeakerVolume(uint32_t& maxVolume) const;
-  int32_t MinSpeakerVolume(uint32_t& minVolume) const;
-  int32_t SpeakerVolumeIsAvailable(bool& available);
-  int32_t SpeakerMuteIsAvailable(bool& available);
-  int32_t SetSpeakerMute(bool enable);
-  int32_t SpeakerMute(bool& enabled) const;
-  int32_t StereoPlayoutIsAvailable(bool& available);
-  int32_t StereoRecordingIsAvailable(bool& available);
-  int32_t MicrophoneMuteIsAvailable(bool& available);
-  int32_t SetMicrophoneMute(bool enable);
-  int32_t MicrophoneMute(bool& enabled) const;
-  int32_t MicrophoneVolumeIsAvailable(bool& available);
-  int32_t SetMicrophoneVolume(uint32_t volume);
-  int32_t MicrophoneVolume(uint32_t& volume) const;
-  int32_t MaxMicrophoneVolume(uint32_t& maxVolume) const;
-  int32_t MinMicrophoneVolume(uint32_t& minVolume) const;
-  int32_t Close();
-  int32_t CloseSpeaker();
-  int32_t CloseMicrophone();
-  bool SpeakerIsInitialized() const;
-  bool MicrophoneIsInitialized() const;
-
- public:
-  AudioMixerManagerMac();
-  ~AudioMixerManagerMac();
-
- private:
-  static void logCAMsg(const rtc::LoggingSeverity sev,
-                       const char* msg,
-                       const char* err);
-
- private:
-  rtc::CriticalSection _critSect;
-
-  AudioDeviceID _inputDeviceID;
-  AudioDeviceID _outputDeviceID;
-
-  uint16_t _noInputChannels;
-  uint16_t _noOutputChannels;
-};
-
-}  // namespace webrtc
-
-#endif  // AUDIO_MIXER_MAC_H
diff --git a/modules/audio_device/mac/portaudio/pa_memorybarrier.h b/modules/audio_device/mac/portaudio/pa_memorybarrier.h
deleted file mode 100644
index f689622..0000000
--- a/modules/audio_device/mac/portaudio/pa_memorybarrier.h
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- * $Id: pa_memorybarrier.h 1240 2007-07-17 13:05:07Z bjornroche $
- * Portable Audio I/O Library
- * Memory barrier utilities
- *
- * Author: Bjorn Roche, XO Audio, LLC
- *
- * This program uses the PortAudio Portable Audio Library.
- * For more information see: http://www.portaudio.com
- * Copyright (c) 1999-2000 Ross Bencina and Phil Burk
- *
- * Permission is hereby granted, free of charge, to any person obtaining
- * a copy of this software and associated documentation files
- * (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge,
- * publish, distribute, sublicense, and/or sell copies of the Software,
- * and to permit persons to whom the Software is furnished to do so,
- * subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
- * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR
- * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
- * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
- * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-
-/*
- * The text above constitutes the entire PortAudio license; however, 
- * the PortAudio community also makes the following non-binding requests:
- *
- * Any person wishing to distribute modifications to the Software is
- * requested to send the modifications to the original developer so that
- * they can be incorporated into the canonical version. It is also 
- * requested that these non-binding requests be included along with the 
- * license above.
- */
-
-/**
- @file pa_memorybarrier.h
- @ingroup common_src
-*/
-
-/****************
- * Some memory barrier primitives based on the system.
- * right now only OS X, FreeBSD, and Linux are supported. In addition to providing
- * memory barriers, these functions should ensure that data cached in registers
- * is written out to cache where it can be snooped by other CPUs. (ie, the volatile
- * keyword should not be required)
- *
- * the primitives that must be defined are:
- *
- * PaUtil_FullMemoryBarrier()
- * PaUtil_ReadMemoryBarrier()
- * PaUtil_WriteMemoryBarrier()
- *
- ****************/
-
-#if defined(__APPLE__)
-#   include <libkern/OSAtomic.h>
-    /* Here are the memory barrier functions. Mac OS X only provides
-       full memory barriers, so the three types of barriers are the same,
-       however, these barriers are superior to compiler-based ones. */
-#   define PaUtil_FullMemoryBarrier()  OSMemoryBarrier()
-#   define PaUtil_ReadMemoryBarrier()  OSMemoryBarrier()
-#   define PaUtil_WriteMemoryBarrier() OSMemoryBarrier()
-#elif defined(__GNUC__)
-    /* GCC >= 4.1 has built-in intrinsics. We'll use those */
-#   if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 1)
-#      define PaUtil_FullMemoryBarrier()  __sync_synchronize()
-#      define PaUtil_ReadMemoryBarrier()  __sync_synchronize()
-#      define PaUtil_WriteMemoryBarrier() __sync_synchronize()
-    /* as a fallback, GCC understands volatile asm and "memory" to mean it
-     * should not reorder memory read/writes */
-    /* Note that it is not clear that any compiler actually defines __PPC__,
-     * it can probably removed safely. */
-#   elif defined( __ppc__ ) || defined( __powerpc__) || defined( __PPC__ )
-#      define PaUtil_FullMemoryBarrier()  asm volatile("sync":::"memory")
-#      define PaUtil_ReadMemoryBarrier()  asm volatile("sync":::"memory")
-#      define PaUtil_WriteMemoryBarrier() asm volatile("sync":::"memory")
-#   elif defined( __i386__ ) || defined( __i486__ ) || defined( __i586__ ) || \
-         defined( __i686__ ) || defined( __x86_64__ )
-#      define PaUtil_FullMemoryBarrier()  asm volatile("mfence":::"memory")
-#      define PaUtil_ReadMemoryBarrier()  asm volatile("lfence":::"memory")
-#      define PaUtil_WriteMemoryBarrier() asm volatile("sfence":::"memory")
-#   else
-#      ifdef ALLOW_SMP_DANGERS
-#         warning Memory barriers not defined on this system or system unknown
-#         warning For SMP safety, you should fix this.
-#         define PaUtil_FullMemoryBarrier()
-#         define PaUtil_ReadMemoryBarrier()
-#         define PaUtil_WriteMemoryBarrier()
-#      else
-#         error Memory barriers are not defined on this system. You can still compile by defining ALLOW_SMP_DANGERS, but SMP safety will not be guaranteed.
-#      endif
-#   endif
-#elif (_MSC_VER >= 1400) && !defined(_WIN32_WCE)
-#   include <intrin.h>
-#   pragma intrinsic(_ReadWriteBarrier)
-#   pragma intrinsic(_ReadBarrier)
-#   pragma intrinsic(_WriteBarrier)
-#   define PaUtil_FullMemoryBarrier()  _ReadWriteBarrier()
-#   define PaUtil_ReadMemoryBarrier()  _ReadBarrier()
-#   define PaUtil_WriteMemoryBarrier() _WriteBarrier()
-#elif defined(_WIN32_WCE)
-#   define PaUtil_FullMemoryBarrier()
-#   define PaUtil_ReadMemoryBarrier()
-#   define PaUtil_WriteMemoryBarrier()
-#elif defined(_MSC_VER) || defined(__BORLANDC__)
-#   define PaUtil_FullMemoryBarrier()  _asm { lock add    [esp], 0 }
-#   define PaUtil_ReadMemoryBarrier()  _asm { lock add    [esp], 0 }
-#   define PaUtil_WriteMemoryBarrier() _asm { lock add    [esp], 0 }
-#else
-#   ifdef ALLOW_SMP_DANGERS
-#      warning Memory barriers not defined on this system or system unknown
-#      warning For SMP safety, you should fix this.
-#      define PaUtil_FullMemoryBarrier()
-#      define PaUtil_ReadMemoryBarrier()
-#      define PaUtil_WriteMemoryBarrier()
-#   else
-#      error Memory barriers are not defined on this system. You can still compile by defining ALLOW_SMP_DANGERS, but SMP safety will not be guaranteed.
-#   endif
-#endif
diff --git a/modules/audio_device/mac/portaudio/pa_ringbuffer.c b/modules/audio_device/mac/portaudio/pa_ringbuffer.c
deleted file mode 100644
index 19c8d75..0000000
--- a/modules/audio_device/mac/portaudio/pa_ringbuffer.c
+++ /dev/null
@@ -1,237 +0,0 @@
-/*
- * $Id: pa_ringbuffer.c 1421 2009-11-18 16:09:05Z bjornroche $
- * Portable Audio I/O Library
- * Ring Buffer utility.
- *
- * Author: Phil Burk, http://www.softsynth.com
- * modified for SMP safety on Mac OS X by Bjorn Roche
- * modified for SMP safety on Linux by Leland Lucius
- * also, allowed for const where possible
- * modified for multiple-byte-sized data elements by Sven Fischer 
- *
- * Note that this is safe only for a single-thread reader and a
- * single-thread writer.
- *
- * This program uses the PortAudio Portable Audio Library.
- * For more information see: http://www.portaudio.com
- * Copyright (c) 1999-2000 Ross Bencina and Phil Burk
- *
- * Permission is hereby granted, free of charge, to any person obtaining
- * a copy of this software and associated documentation files
- * (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge,
- * publish, distribute, sublicense, and/or sell copies of the Software,
- * and to permit persons to whom the Software is furnished to do so,
- * subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
- * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR
- * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
- * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
- * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-
-/*
- * The text above constitutes the entire PortAudio license; however, 
- * the PortAudio community also makes the following non-binding requests:
- *
- * Any person wishing to distribute modifications to the Software is
- * requested to send the modifications to the original developer so that
- * they can be incorporated into the canonical version. It is also 
- * requested that these non-binding requests be included along with the 
- * license above.
- */
-
-/**
- @file
- @ingroup common_src
-*/
-
-#include <math.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include "webrtc/modules/audio_device/mac/portaudio/pa_memorybarrier.h"
-#include "webrtc/modules/audio_device/mac/portaudio/pa_ringbuffer.h"
-
-/***************************************************************************
- * Initialize FIFO.
- * elementCount must be power of 2, returns -1 if not.
- */
-PaRingBufferSize PaUtil_InitializeRingBuffer(PaUtilRingBuffer* rbuf,
-                                             PaRingBufferSize elementSizeBytes,
-                                             PaRingBufferSize elementCount,
-                                             void* dataPtr) {
-    if( ((elementCount-1) & elementCount) != 0) return -1; /* Not Power of two. */
-    rbuf->bufferSize = elementCount;
-    rbuf->buffer = (char *)dataPtr;
-    PaUtil_FlushRingBuffer( rbuf );
-    rbuf->bigMask = (elementCount*2)-1;
-    rbuf->smallMask = (elementCount)-1;
-    rbuf->elementSizeBytes = elementSizeBytes;
-    return 0;
-}
-
-/***************************************************************************
-** Return number of elements available for reading. */
-PaRingBufferSize PaUtil_GetRingBufferReadAvailable( PaUtilRingBuffer *rbuf )
-{
-    PaUtil_ReadMemoryBarrier();
-    return ( (rbuf->writeIndex - rbuf->readIndex) & rbuf->bigMask );
-}
-/***************************************************************************
-** Return number of elements available for writing. */
-PaRingBufferSize PaUtil_GetRingBufferWriteAvailable( PaUtilRingBuffer *rbuf )
-{
-    /* Since we are calling PaUtil_GetRingBufferReadAvailable, we don't need an aditional MB */
-    return ( rbuf->bufferSize - PaUtil_GetRingBufferReadAvailable(rbuf));
-}
-
-/***************************************************************************
-** Clear buffer. Should only be called when buffer is NOT being read. */
-void PaUtil_FlushRingBuffer( PaUtilRingBuffer *rbuf )
-{
-    rbuf->writeIndex = rbuf->readIndex = 0;
-}
-
-/***************************************************************************
-** Get address of region(s) to which we can write data.
-** If the region is contiguous, size2 will be zero.
-** If non-contiguous, size2 will be the size of second region.
-** Returns room available to be written or elementCount, whichever is smaller.
-*/
-PaRingBufferSize PaUtil_GetRingBufferWriteRegions(PaUtilRingBuffer* rbuf,
-                                                  PaRingBufferSize elementCount,
-                                                  void** dataPtr1,
-                                                  PaRingBufferSize* sizePtr1,
-                                                  void** dataPtr2,
-                                                  PaRingBufferSize* sizePtr2) {
-    PaRingBufferSize   index;
-    PaRingBufferSize   available = PaUtil_GetRingBufferWriteAvailable( rbuf );
-    if( elementCount > available ) elementCount = available;
-    /* Check to see if write is not contiguous. */
-    index = rbuf->writeIndex & rbuf->smallMask;
-    if( (index + elementCount) > rbuf->bufferSize )
-    {
-        /* Write data in two blocks that wrap the buffer. */
-        PaRingBufferSize   firstHalf = rbuf->bufferSize - index;
-        *dataPtr1 = &rbuf->buffer[index*rbuf->elementSizeBytes];
-        *sizePtr1 = firstHalf;
-        *dataPtr2 = &rbuf->buffer[0];
-        *sizePtr2 = elementCount - firstHalf;
-    }
-    else
-    {
-        *dataPtr1 = &rbuf->buffer[index*rbuf->elementSizeBytes];
-        *sizePtr1 = elementCount;
-        *dataPtr2 = NULL;
-        *sizePtr2 = 0;
-    }
-    return elementCount;
-}
-
-
-/***************************************************************************
-*/
-PaRingBufferSize PaUtil_AdvanceRingBufferWriteIndex(
-    PaUtilRingBuffer* rbuf,
-    PaRingBufferSize elementCount) {
-    /* we need to ensure that previous writes are seen before we update the write index */
-    PaUtil_WriteMemoryBarrier();
-    return rbuf->writeIndex = (rbuf->writeIndex + elementCount) & rbuf->bigMask;
-}
-
-/***************************************************************************
-** Get address of region(s) from which we can read data.
-** If the region is contiguous, size2 will be zero.
-** If non-contiguous, size2 will be the size of second region.
-** Returns room available to be written or elementCount, whichever is smaller.
-*/
-PaRingBufferSize PaUtil_GetRingBufferReadRegions(PaUtilRingBuffer* rbuf,
-                                                 PaRingBufferSize elementCount,
-                                                 void** dataPtr1,
-                                                 PaRingBufferSize* sizePtr1,
-                                                 void** dataPtr2,
-                                                 PaRingBufferSize* sizePtr2) {
-    PaRingBufferSize   index;
-    PaRingBufferSize   available = PaUtil_GetRingBufferReadAvailable( rbuf );
-    if( elementCount > available ) elementCount = available;
-    /* Check to see if read is not contiguous. */
-    index = rbuf->readIndex & rbuf->smallMask;
-    if( (index + elementCount) > rbuf->bufferSize )
-    {
-        /* Write data in two blocks that wrap the buffer. */
-        PaRingBufferSize firstHalf = rbuf->bufferSize - index;
-        *dataPtr1 = &rbuf->buffer[index*rbuf->elementSizeBytes];
-        *sizePtr1 = firstHalf;
-        *dataPtr2 = &rbuf->buffer[0];
-        *sizePtr2 = elementCount - firstHalf;
-    }
-    else
-    {
-        *dataPtr1 = &rbuf->buffer[index*rbuf->elementSizeBytes];
-        *sizePtr1 = elementCount;
-        *dataPtr2 = NULL;
-        *sizePtr2 = 0;
-    }
-    return elementCount;
-}
-/***************************************************************************
-*/
-PaRingBufferSize PaUtil_AdvanceRingBufferReadIndex(
-    PaUtilRingBuffer* rbuf,
-    PaRingBufferSize elementCount) {
-    /* we need to ensure that previous writes are always seen before updating the index. */
-    PaUtil_WriteMemoryBarrier();
-    return rbuf->readIndex = (rbuf->readIndex + elementCount) & rbuf->bigMask;
-}
-
-/***************************************************************************
-** Return elements written. */
-PaRingBufferSize PaUtil_WriteRingBuffer(PaUtilRingBuffer* rbuf,
-                                        const void* data,
-                                        PaRingBufferSize elementCount) {
-    PaRingBufferSize size1, size2, numWritten;
-    void *data1, *data2;
-    numWritten = PaUtil_GetRingBufferWriteRegions( rbuf, elementCount, &data1, &size1, &data2, &size2 );
-    if( size2 > 0 )
-    {
-
-        memcpy( data1, data, size1*rbuf->elementSizeBytes );
-        data = ((char *)data) + size1*rbuf->elementSizeBytes;
-        memcpy( data2, data, size2*rbuf->elementSizeBytes );
-    }
-    else
-    {
-        memcpy( data1, data, size1*rbuf->elementSizeBytes );
-    }
-    PaUtil_AdvanceRingBufferWriteIndex( rbuf, numWritten );
-    return numWritten;
-}
-
-/***************************************************************************
-** Return elements read. */
-PaRingBufferSize PaUtil_ReadRingBuffer(PaUtilRingBuffer* rbuf,
-                                       void* data,
-                                       PaRingBufferSize elementCount) {
-    PaRingBufferSize size1, size2, numRead;
-    void *data1, *data2;
-    numRead = PaUtil_GetRingBufferReadRegions( rbuf, elementCount, &data1, &size1, &data2, &size2 );
-    if( size2 > 0 )
-    {
-        memcpy( data, data1, size1*rbuf->elementSizeBytes );
-        data = ((char *)data) + size1*rbuf->elementSizeBytes;
-        memcpy( data, data2, size2*rbuf->elementSizeBytes );
-    }
-    else
-    {
-        memcpy( data, data1, size1*rbuf->elementSizeBytes );
-    }
-    PaUtil_AdvanceRingBufferReadIndex( rbuf, numRead );
-    return numRead;
-}
diff --git a/modules/audio_device/mac/portaudio/pa_ringbuffer.h b/modules/audio_device/mac/portaudio/pa_ringbuffer.h
deleted file mode 100644
index 541a872..0000000
--- a/modules/audio_device/mac/portaudio/pa_ringbuffer.h
+++ /dev/null
@@ -1,233 +0,0 @@
-#ifndef WEBRTC_AUDIO_DEVICE_PA_RINGBUFFER_H
-#define WEBRTC_AUDIO_DEVICE_PA_RINGBUFFER_H
-/*
- * $Id: pa_ringbuffer.h 1421 2009-11-18 16:09:05Z bjornroche $
- * Portable Audio I/O Library
- * Ring Buffer utility.
- *
- * Author: Phil Burk, http://www.softsynth.com
- * modified for SMP safety on OS X by Bjorn Roche.
- * also allowed for const where possible.
- * modified for multiple-byte-sized data elements by Sven Fischer 
- *
- * Note that this is safe only for a single-thread reader
- * and a single-thread writer.
- *
- * This program is distributed with the PortAudio Portable Audio Library.
- * For more information see: http://www.portaudio.com
- * Copyright (c) 1999-2000 Ross Bencina and Phil Burk
- *
- * Permission is hereby granted, free of charge, to any person obtaining
- * a copy of this software and associated documentation files
- * (the "Software"), to deal in the Software without restriction,
- * including without limitation the rights to use, copy, modify, merge,
- * publish, distribute, sublicense, and/or sell copies of the Software,
- * and to permit persons to whom the Software is furnished to do so,
- * subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
- * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR
- * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
- * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
- * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-
-/*
- * The text above constitutes the entire PortAudio license; however, 
- * the PortAudio community also makes the following non-binding requests:
- *
- * Any person wishing to distribute modifications to the Software is
- * requested to send the modifications to the original developer so that
- * they can be incorporated into the canonical version. It is also 
- * requested that these non-binding requests be included along with the 
- * license above.
- */
-
-/** @file
- @ingroup common_src
- @brief Single-reader single-writer lock-free ring buffer
-
- PaUtilRingBuffer is a ring buffer used to transport samples between
- different execution contexts (threads, OS callbacks, interrupt handlers)
- without requiring the use of any locks. This only works when there is
- a single reader and a single writer (ie. one thread or callback writes
- to the ring buffer, another thread or callback reads from it).
-
- The PaUtilRingBuffer structure manages a ring buffer containing N 
- elements, where N must be a power of two. An element may be any size 
- (specified in bytes).
-
- The memory area used to store the buffer elements must be allocated by 
- the client prior to calling PaUtil_InitializeRingBuffer() and must outlive
- the use of the ring buffer.
-*/
-
-#if defined(__APPLE__)
-#include <sys/types.h>
-typedef int32_t PaRingBufferSize;
-#elif defined( __GNUC__ )
-typedef long PaRingBufferSize;
-#elif (_MSC_VER >= 1400)
-typedef long PaRingBufferSize;
-#elif defined(_MSC_VER) || defined(__BORLANDC__)
-typedef long PaRingBufferSize;
-#else
-typedef long PaRingBufferSize;
-#endif
-
-
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif /* __cplusplus */
-
-typedef struct PaUtilRingBuffer
-{
-    PaRingBufferSize  bufferSize; /**< Number of elements in FIFO. Power of 2. Set by PaUtil_InitRingBuffer. */
-    PaRingBufferSize  writeIndex; /**< Index of next writable element. Set by PaUtil_AdvanceRingBufferWriteIndex. */
-    PaRingBufferSize  readIndex;  /**< Index of next readable element. Set by PaUtil_AdvanceRingBufferReadIndex. */
-    PaRingBufferSize  bigMask;    /**< Used for wrapping indices with extra bit to distinguish full/empty. */
-    PaRingBufferSize  smallMask;  /**< Used for fitting indices to buffer. */
-    PaRingBufferSize  elementSizeBytes; /**< Number of bytes per element. */
-    char  *buffer;    /**< Pointer to the buffer containing the actual data. */
-}PaUtilRingBuffer;
-
-/** Initialize Ring Buffer.
-
- @param rbuf The ring buffer.
-
- @param elementSizeBytes The size of a single data element in bytes.
-
- @param elementCount The number of elements in the buffer (must be power of 2).
-
- @param dataPtr A pointer to a previously allocated area where the data
- will be maintained.  It must be elementCount*elementSizeBytes long.
-
- @return -1 if elementCount is not a power of 2, otherwise 0.
-*/
-PaRingBufferSize PaUtil_InitializeRingBuffer( PaUtilRingBuffer *rbuf, PaRingBufferSize elementSizeBytes, PaRingBufferSize elementCount, void *dataPtr );
-
-/** Clear buffer. Should only be called when buffer is NOT being read.
-
- @param rbuf The ring buffer.
-*/
-void PaUtil_FlushRingBuffer( PaUtilRingBuffer *rbuf );
-
-/** Retrieve the number of elements available in the ring buffer for writing.
-
- @param rbuf The ring buffer.
-
- @return The number of elements available for writing.
-*/
-PaRingBufferSize PaUtil_GetRingBufferWriteAvailable( PaUtilRingBuffer *rbuf );
-
-/** Retrieve the number of elements available in the ring buffer for reading.
-
- @param rbuf The ring buffer.
-
- @return The number of elements available for reading.
-*/
-PaRingBufferSize PaUtil_GetRingBufferReadAvailable( PaUtilRingBuffer *rbuf );
-
-/** Write data to the ring buffer.
-
- @param rbuf The ring buffer.
-
- @param data The address of new data to write to the buffer.
-
- @param elementCount The number of elements to be written.
-
- @return The number of elements written.
-*/
-PaRingBufferSize PaUtil_WriteRingBuffer( PaUtilRingBuffer *rbuf, const void *data, PaRingBufferSize elementCount );
-
-/** Read data from the ring buffer.
-
- @param rbuf The ring buffer.
-
- @param data The address where the data should be stored.
-
- @param elementCount The number of elements to be read.
-
- @return The number of elements read.
-*/
-PaRingBufferSize PaUtil_ReadRingBuffer( PaUtilRingBuffer *rbuf, void *data, PaRingBufferSize elementCount );
-
-/** Get address of region(s) to which we can write data.
-
- @param rbuf The ring buffer.
-
- @param elementCount The number of elements desired.
-
- @param dataPtr1 The address where the first (or only) region pointer will be
- stored.
-
- @param sizePtr1 The address where the first (or only) region length will be
- stored.
-
- @param dataPtr2 The address where the second region pointer will be stored if
- the first region is too small to satisfy elementCount.
-
- @param sizePtr2 The address where the second region length will be stored if
- the first region is too small to satisfy elementCount.
-
- @return The room available to be written or elementCount, whichever is smaller.
-*/
-PaRingBufferSize PaUtil_GetRingBufferWriteRegions( PaUtilRingBuffer *rbuf, PaRingBufferSize elementCount,
-                                       void **dataPtr1, PaRingBufferSize *sizePtr1,
-                                       void **dataPtr2, PaRingBufferSize *sizePtr2 );
-
-/** Advance the write index to the next location to be written.
-
- @param rbuf The ring buffer.
-
- @param elementCount The number of elements to advance.
-
- @return The new position.
-*/
-PaRingBufferSize PaUtil_AdvanceRingBufferWriteIndex( PaUtilRingBuffer *rbuf, PaRingBufferSize elementCount );
-
-/** Get address of region(s) from which we can write data.
-
- @param rbuf The ring buffer.
-
- @param elementCount The number of elements desired.
-
- @param dataPtr1 The address where the first (or only) region pointer will be
- stored.
-
- @param sizePtr1 The address where the first (or only) region length will be
- stored.
-
- @param dataPtr2 The address where the second region pointer will be stored if
- the first region is too small to satisfy elementCount.
-
- @param sizePtr2 The address where the second region length will be stored if
- the first region is too small to satisfy elementCount.
-
- @return The number of elements available for reading.
-*/
-PaRingBufferSize PaUtil_GetRingBufferReadRegions( PaUtilRingBuffer *rbuf, PaRingBufferSize elementCount,
-                                      void **dataPtr1, PaRingBufferSize *sizePtr1,
-                                      void **dataPtr2, PaRingBufferSize *sizePtr2 );
-
-/** Advance the read index to the next location to be read.
-
- @param rbuf The ring buffer.
-
- @param elementCount The number of elements to advance.
-
- @return The new position.
-*/
-PaRingBufferSize PaUtil_AdvanceRingBufferReadIndex( PaUtilRingBuffer *rbuf, PaRingBufferSize elementCount );
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-#endif /* MODULES_AUDIO_DEVICE_MAIN_SOURCE_MAC_PORTAUDIO_PA_RINGBUFFER_H_ */
diff --git a/modules/audio_device/mock_audio_device_buffer.h b/modules/audio_device/mock_audio_device_buffer.h
deleted file mode 100644
index bfef605..0000000
--- a/modules/audio_device/mock_audio_device_buffer.h
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- *  Copyright (c) 2013 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_DEVICE_MOCK_AUDIO_DEVICE_BUFFER_H_
-#define WEBRTC_MODULES_AUDIO_DEVICE_MOCK_AUDIO_DEVICE_BUFFER_H_
-
-#include "webrtc/modules/audio_device/audio_device_buffer.h"
-#include "webrtc/test/gmock.h"
-
-namespace webrtc {
-
-class MockAudioDeviceBuffer : public AudioDeviceBuffer {
- public:
-  MockAudioDeviceBuffer() {}
-  virtual ~MockAudioDeviceBuffer() {}
-  MOCK_METHOD1(RequestPlayoutData, int32_t(size_t nSamples));
-  MOCK_METHOD1(GetPlayoutData, int32_t(void* audioBuffer));
-  MOCK_METHOD2(SetRecordedBuffer,
-               int32_t(const void* audioBuffer, size_t nSamples));
-  MOCK_METHOD3(SetVQEData,
-               void(int playDelayMS, int recDelayMS, int clockDrift));
-  MOCK_METHOD0(DeliverRecordedData, int32_t());
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_DEVICE_MOCK_AUDIO_DEVICE_BUFFER_H_
diff --git a/modules/audio_device/win/audio_device_core_win.cc b/modules/audio_device/win/audio_device_core_win.cc
deleted file mode 100644
index 0c6d34e..0000000
--- a/modules/audio_device/win/audio_device_core_win.cc
+++ /dev/null
@@ -1,4969 +0,0 @@
-/*
- *  Copyright (c) 2012 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.
- */
-
-#pragma warning(disable: 4995)  // name was marked as #pragma deprecated
-
-#if (_MSC_VER >= 1310) && (_MSC_VER < 1400)
-// Reports the major and minor versions of the compiler.
-// For example, 1310 for Microsoft Visual C++ .NET 2003. 1310 represents version 13 and a 1.0 point release.
-// The Visual C++ 2005 compiler version is 1400.
-// Type cl /? at the command line to see the major and minor versions of your compiler along with the build number.
-#pragma message(">> INFO: Windows Core Audio is not supported in VS 2003")
-#endif
-
-#include "webrtc/modules/audio_device/audio_device_config.h"
-
-#ifdef WEBRTC_WINDOWS_CORE_AUDIO_BUILD
-
-#include "webrtc/modules/audio_device/win/audio_device_core_win.h"
-
-#include <assert.h>
-#include <string.h>
-
-#include <windows.h>
-#include <comdef.h>
-#include <dmo.h>
-#include <Functiondiscoverykeys_devpkey.h>
-#include <mmsystem.h>
-#include <strsafe.h>
-#include <uuids.h>
-
-#include <iomanip>
-
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/platform_thread.h"
-#include "webrtc/system_wrappers/include/sleep.h"
-
-// Macro that calls a COM method returning HRESULT value.
-#define EXIT_ON_ERROR(hres)    do { if (FAILED(hres)) goto Exit; } while(0)
-
-// Macro that continues to a COM error.
-#define CONTINUE_ON_ERROR(hres) do { if (FAILED(hres)) goto Next; } while(0)
-
-// Macro that releases a COM object if not NULL.
-#define SAFE_RELEASE(p)     do { if ((p)) { (p)->Release(); (p) = NULL; } } while(0)
-
-#define ROUND(x) ((x) >=0 ? (int)((x) + 0.5) : (int)((x) - 0.5))
-
-// REFERENCE_TIME time units per millisecond
-#define REFTIMES_PER_MILLISEC  10000
-
-typedef struct tagTHREADNAME_INFO
-{
-   DWORD dwType;        // must be 0x1000
-   LPCSTR szName;       // pointer to name (in user addr space)
-   DWORD dwThreadID;    // thread ID (-1=caller thread)
-   DWORD dwFlags;       // reserved for future use, must be zero
-} THREADNAME_INFO;
-
-namespace webrtc {
-namespace {
-
-enum { COM_THREADING_MODEL = COINIT_MULTITHREADED };
-
-enum
-{
-    kAecCaptureStreamIndex = 0,
-    kAecRenderStreamIndex = 1
-};
-
-// An implementation of IMediaBuffer, as required for
-// IMediaObject::ProcessOutput(). After consuming data provided by
-// ProcessOutput(), call SetLength() to update the buffer availability.
-//
-// Example implementation:
-// http://msdn.microsoft.com/en-us/library/dd376684(v=vs.85).aspx
-class MediaBufferImpl : public IMediaBuffer
-{
-public:
-    explicit MediaBufferImpl(DWORD maxLength)
-        : _data(new BYTE[maxLength]),
-          _length(0),
-          _maxLength(maxLength),
-          _refCount(0)
-    {}
-
-    // IMediaBuffer methods.
-    STDMETHOD(GetBufferAndLength(BYTE** ppBuffer, DWORD* pcbLength))
-    {
-        if (!ppBuffer || !pcbLength)
-        {
-            return E_POINTER;
-        }
-
-        *ppBuffer = _data;
-        *pcbLength = _length;
-
-        return S_OK;
-    }
-
-    STDMETHOD(GetMaxLength(DWORD* pcbMaxLength))
-    {
-        if (!pcbMaxLength)
-        {
-            return E_POINTER;
-        }
-
-        *pcbMaxLength = _maxLength;
-        return S_OK;
-    }
-
-    STDMETHOD(SetLength(DWORD cbLength))
-    {
-        if (cbLength > _maxLength)
-        {
-            return E_INVALIDARG;
-        }
-
-        _length = cbLength;
-        return S_OK;
-    }
-
-    // IUnknown methods.
-    STDMETHOD_(ULONG, AddRef())
-    {
-        return InterlockedIncrement(&_refCount);
-    }
-
-    STDMETHOD(QueryInterface(REFIID riid, void** ppv))
-    {
-        if (!ppv)
-        {
-            return E_POINTER;
-        }
-        else if (riid != IID_IMediaBuffer && riid != IID_IUnknown)
-        {
-            return E_NOINTERFACE;
-        }
-
-        *ppv = static_cast<IMediaBuffer*>(this);
-        AddRef();
-        return S_OK;
-    }
-
-    STDMETHOD_(ULONG, Release())
-    {
-        LONG refCount = InterlockedDecrement(&_refCount);
-        if (refCount == 0)
-        {
-            delete this;
-        }
-
-        return refCount;
-    }
-
-private:
-    ~MediaBufferImpl()
-    {
-        delete [] _data;
-    }
-
-    BYTE* _data;
-    DWORD _length;
-    const DWORD _maxLength;
-    LONG _refCount;
-};
-}  // namespace
-
-// ============================================================================
-//                              Static Methods
-// ============================================================================
-
-// ----------------------------------------------------------------------------
-//  CoreAudioIsSupported
-// ----------------------------------------------------------------------------
-
-bool AudioDeviceWindowsCore::CoreAudioIsSupported()
-{
-    LOG(LS_VERBOSE) << __FUNCTION__;
-
-    bool MMDeviceIsAvailable(false);
-    bool coreAudioIsSupported(false);
-
-    HRESULT hr(S_OK);
-    TCHAR buf[MAXERRORLENGTH];
-    TCHAR errorText[MAXERRORLENGTH];
-
-    // 1) Check if Windows version is Vista SP1 or later.
-    //
-    // CoreAudio is only available on Vista SP1 and later.
-    //
-    OSVERSIONINFOEX osvi;
-    DWORDLONG dwlConditionMask = 0;
-    int op = VER_LESS_EQUAL;
-
-    // Initialize the OSVERSIONINFOEX structure.
-    ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));
-    osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
-    osvi.dwMajorVersion = 6;
-    osvi.dwMinorVersion = 0;
-    osvi.wServicePackMajor = 0;
-    osvi.wServicePackMinor = 0;
-    osvi.wProductType = VER_NT_WORKSTATION;
-
-    // Initialize the condition mask.
-    VER_SET_CONDITION(dwlConditionMask, VER_MAJORVERSION, op);
-    VER_SET_CONDITION(dwlConditionMask, VER_MINORVERSION, op);
-    VER_SET_CONDITION(dwlConditionMask, VER_SERVICEPACKMAJOR, op);
-    VER_SET_CONDITION(dwlConditionMask, VER_SERVICEPACKMINOR, op);
-    VER_SET_CONDITION(dwlConditionMask, VER_PRODUCT_TYPE, VER_EQUAL);
-
-    DWORD dwTypeMask = VER_MAJORVERSION | VER_MINORVERSION |
-                       VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR |
-                       VER_PRODUCT_TYPE;
-
-    // Perform the test.
-    BOOL isVistaRTMorXP = VerifyVersionInfo(&osvi, dwTypeMask,
-                                            dwlConditionMask);
-    if (isVistaRTMorXP != 0)
-    {
-        LOG(LS_VERBOSE)
-            << "*** Windows Core Audio is only supported on Vista SP1 or later"
-            << " => will revert to the Wave API ***";
-        return false;
-    }
-
-    // 2) Initializes the COM library for use by the calling thread.
-
-    // The COM init wrapper sets the thread's concurrency model to MTA,
-    // and creates a new apartment for the thread if one is required. The
-    // wrapper also ensures that each call to CoInitializeEx is balanced
-    // by a corresponding call to CoUninitialize.
-    //
-    ScopedCOMInitializer comInit(ScopedCOMInitializer::kMTA);
-    if (!comInit.succeeded()) {
-      // Things will work even if an STA thread is calling this method but we
-      // want to ensure that MTA is used and therefore return false here.
-      return false;
-    }
-
-    // 3) Check if the MMDevice API is available.
-    //
-    // The Windows Multimedia Device (MMDevice) API enables audio clients to
-    // discover audio endpoint devices, determine their capabilities, and create
-    // driver instances for those devices.
-    // Header file Mmdeviceapi.h defines the interfaces in the MMDevice API.
-    // The MMDevice API consists of several interfaces. The first of these is the
-    // IMMDeviceEnumerator interface. To access the interfaces in the MMDevice API,
-    // a client obtains a reference to the IMMDeviceEnumerator interface of a
-    // device-enumerator object by calling the CoCreateInstance function.
-    //
-    // Through the IMMDeviceEnumerator interface, the client can obtain references
-    // to the other interfaces in the MMDevice API. The MMDevice API implements
-    // the following interfaces:
-    //
-    // IMMDevice            Represents an audio device.
-    // IMMDeviceCollection  Represents a collection of audio devices.
-    // IMMDeviceEnumerator  Provides methods for enumerating audio devices.
-    // IMMEndpoint          Represents an audio endpoint device.
-    //
-    IMMDeviceEnumerator* pIMMD(NULL);
-    const CLSID CLSID_MMDeviceEnumerator = __uuidof(MMDeviceEnumerator);
-    const IID IID_IMMDeviceEnumerator = __uuidof(IMMDeviceEnumerator);
-
-    hr = CoCreateInstance(
-            CLSID_MMDeviceEnumerator,   // GUID value of MMDeviceEnumerator coclass
-            NULL,
-            CLSCTX_ALL,
-            IID_IMMDeviceEnumerator,    // GUID value of the IMMDeviceEnumerator interface
-            (void**)&pIMMD );
-
-    if (FAILED(hr))
-    {
-        LOG(LS_ERROR) << "AudioDeviceWindowsCore::CoreAudioIsSupported()"
-                      << " Failed to create the required COM object (hr="
-                      << hr << ")";
-        LOG(LS_VERBOSE) << "AudioDeviceWindowsCore::CoreAudioIsSupported()"
-                        << " CoCreateInstance(MMDeviceEnumerator) failed (hr="
-                        << hr << ")";
-
-        const DWORD dwFlags = FORMAT_MESSAGE_FROM_SYSTEM |
-                              FORMAT_MESSAGE_IGNORE_INSERTS;
-        const DWORD dwLangID = MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US);
-
-        // Gets the system's human readable message string for this HRESULT.
-        // All error message in English by default.
-        DWORD messageLength = ::FormatMessageW(dwFlags,
-                                               0,
-                                               hr,
-                                               dwLangID,
-                                               errorText,
-                                               MAXERRORLENGTH,
-                                               NULL);
-
-        assert(messageLength <= MAXERRORLENGTH);
-
-        // Trims tailing white space (FormatMessage() leaves a trailing cr-lf.).
-        for (; messageLength && ::isspace(errorText[messageLength - 1]);
-             --messageLength)
-        {
-            errorText[messageLength - 1] = '\0';
-        }
-
-        StringCchPrintf(buf, MAXERRORLENGTH, TEXT("Error details: "));
-        StringCchCat(buf, MAXERRORLENGTH, errorText);
-        LOG(LS_VERBOSE) << buf;
-    }
-    else
-    {
-        MMDeviceIsAvailable = true;
-        LOG(LS_VERBOSE) << "AudioDeviceWindowsCore::CoreAudioIsSupported()"
-            << " CoCreateInstance(MMDeviceEnumerator) succeeded (hr=" << hr
-            << ")";
-        SAFE_RELEASE(pIMMD);
-    }
-
-    // 4) Verify that we can create and initialize our Core Audio class.
-    //
-    // Also, perform a limited "API test" to ensure that Core Audio is supported for all devices.
-    //
-    if (MMDeviceIsAvailable)
-    {
-        coreAudioIsSupported = false;
-
-        AudioDeviceWindowsCore* p = new AudioDeviceWindowsCore();
-        if (p == NULL)
-        {
-            return false;
-        }
-
-        int ok(0);
-        int temp_ok(0);
-        bool available(false);
-
-        if (p->Init() != InitStatus::OK) {
-          ok |= -1;
-        }
-
-        int16_t numDevsRec = p->RecordingDevices();
-        for (uint16_t i = 0; i < numDevsRec; i++)
-        {
-            ok |= p->SetRecordingDevice(i);
-            temp_ok = p->RecordingIsAvailable(available);
-            ok |= temp_ok;
-            ok |= (available == false);
-            if (available)
-            {
-                ok |= p->InitMicrophone();
-            }
-            if (ok)
-            {
-                LOG(LS_WARNING)
-                    << "AudioDeviceWindowsCore::CoreAudioIsSupported()"
-                    << " Failed to use Core Audio Recording for device id="
-                    << i;
-            }
-        }
-
-        int16_t numDevsPlay = p->PlayoutDevices();
-        for (uint16_t i = 0; i < numDevsPlay; i++)
-        {
-            ok |= p->SetPlayoutDevice(i);
-            temp_ok = p->PlayoutIsAvailable(available);
-            ok |= temp_ok;
-            ok |= (available == false);
-            if (available)
-            {
-                ok |= p->InitSpeaker();
-            }
-            if (ok)
-            {
-                LOG(LS_WARNING)
-                    << "AudioDeviceWindowsCore::CoreAudioIsSupported()"
-                    << " Failed to use Core Audio Playout for device id=" << i;
-            }
-        }
-
-        ok |= p->Terminate();
-
-        if (ok == 0)
-        {
-            coreAudioIsSupported = true;
-        }
-
-        delete p;
-    }
-
-    if (coreAudioIsSupported)
-    {
-        LOG(LS_VERBOSE) << "*** Windows Core Audio is supported ***";
-    }
-    else
-    {
-        LOG(LS_VERBOSE) << "*** Windows Core Audio is NOT supported"
-                        << " => will revert to the Wave API ***";
-    }
-
-    return (coreAudioIsSupported);
-}
-
-// ============================================================================
-//                            Construction & Destruction
-// ============================================================================
-
-// ----------------------------------------------------------------------------
-//  AudioDeviceWindowsCore() - ctor
-// ----------------------------------------------------------------------------
-
-AudioDeviceWindowsCore::AudioDeviceWindowsCore()
-    : _comInit(ScopedCOMInitializer::kMTA),
-      _ptrAudioBuffer(NULL),
-      _ptrEnumerator(NULL),
-      _ptrRenderCollection(NULL),
-      _ptrCaptureCollection(NULL),
-      _ptrDeviceOut(NULL),
-      _ptrDeviceIn(NULL),
-      _ptrClientOut(NULL),
-      _ptrClientIn(NULL),
-      _ptrRenderClient(NULL),
-      _ptrCaptureClient(NULL),
-      _ptrCaptureVolume(NULL),
-      _ptrRenderSimpleVolume(NULL),
-      _dmo(NULL),
-      _mediaBuffer(NULL),
-      _builtInAecEnabled(false),
-      _playAudioFrameSize(0),
-      _playSampleRate(0),
-      _playBlockSizeInFrames(0),
-      _playBlockSizeInSamples(0),
-      _playChannels(2),
-      _sndCardPlayDelay(0),
-      _sndCardRecDelay(0),
-      _writtenSamples(0),
-      _readSamples(0),
-      _recAudioFrameSize(0),
-      _recSampleRate(0),
-      _recBlockSize(0),
-      _recChannels(2),
-      _avrtLibrary(NULL),
-      _winSupportAvrt(false),
-      _hRenderSamplesReadyEvent(NULL),
-      _hPlayThread(NULL),
-      _hCaptureSamplesReadyEvent(NULL),
-      _hRecThread(NULL),
-      _hShutdownRenderEvent(NULL),
-      _hShutdownCaptureEvent(NULL),
-      _hRenderStartedEvent(NULL),
-      _hCaptureStartedEvent(NULL),
-      _hGetCaptureVolumeThread(NULL),
-      _hSetCaptureVolumeThread(NULL),
-      _hSetCaptureVolumeEvent(NULL),
-      _hMmTask(NULL),
-      _initialized(false),
-      _recording(false),
-      _playing(false),
-      _recIsInitialized(false),
-      _playIsInitialized(false),
-      _speakerIsInitialized(false),
-      _microphoneIsInitialized(false),
-      _AGC(false),
-      _playWarning(0),
-      _playError(0),
-      _recWarning(0),
-      _recError(0),
-      _playBufDelay(80),
-      _usingInputDeviceIndex(false),
-      _usingOutputDeviceIndex(false),
-      _inputDevice(AudioDeviceModule::kDefaultCommunicationDevice),
-      _outputDevice(AudioDeviceModule::kDefaultCommunicationDevice),
-      _inputDeviceIndex(0),
-      _outputDeviceIndex(0),
-      _newMicLevel(0) {
-  LOG(LS_INFO) << __FUNCTION__ << " created";
-  assert(_comInit.succeeded());
-
-  // Try to load the Avrt DLL
-  if (!_avrtLibrary) {
-    // Get handle to the Avrt DLL module.
-    _avrtLibrary = LoadLibrary(TEXT("Avrt.dll"));
-    if (_avrtLibrary) {
-      // Handle is valid (should only happen if OS larger than vista & win7).
-      // Try to get the function addresses.
-      LOG(LS_VERBOSE) << "AudioDeviceWindowsCore::AudioDeviceWindowsCore()"
-                      << " The Avrt DLL module is now loaded";
-
-      _PAvRevertMmThreadCharacteristics =
-          (PAvRevertMmThreadCharacteristics)GetProcAddress(
-              _avrtLibrary, "AvRevertMmThreadCharacteristics");
-      _PAvSetMmThreadCharacteristicsA =
-          (PAvSetMmThreadCharacteristicsA)GetProcAddress(
-              _avrtLibrary, "AvSetMmThreadCharacteristicsA");
-      _PAvSetMmThreadPriority = (PAvSetMmThreadPriority)GetProcAddress(
-          _avrtLibrary, "AvSetMmThreadPriority");
-
-      if (_PAvRevertMmThreadCharacteristics &&
-          _PAvSetMmThreadCharacteristicsA && _PAvSetMmThreadPriority) {
-        LOG(LS_VERBOSE) << "AudioDeviceWindowsCore::AudioDeviceWindowsCore()"
-                        << " AvRevertMmThreadCharacteristics() is OK";
-        LOG(LS_VERBOSE) << "AudioDeviceWindowsCore::AudioDeviceWindowsCore()"
-                        << " AvSetMmThreadCharacteristicsA() is OK";
-        LOG(LS_VERBOSE) << "AudioDeviceWindowsCore::AudioDeviceWindowsCore()"
-                        << " AvSetMmThreadPriority() is OK";
-        _winSupportAvrt = true;
-      }
-    }
-  }
-
-  // Create our samples ready events - we want auto reset events that start in
-  // the not-signaled state. The state of an auto-reset event object remains
-  // signaled until a single waiting thread is released, at which time the
-  // system automatically sets the state to nonsignaled. If no threads are
-  // waiting, the event object's state remains signaled. (Except for
-  // _hShutdownCaptureEvent, which is used to shutdown multiple threads).
-  _hRenderSamplesReadyEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
-  _hCaptureSamplesReadyEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
-  _hShutdownRenderEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
-  _hShutdownCaptureEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
-  _hRenderStartedEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
-  _hCaptureStartedEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
-  _hSetCaptureVolumeEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
-
-  _perfCounterFreq.QuadPart = 1;
-  _perfCounterFactor = 0.0;
-
-  // list of number of channels to use on recording side
-  _recChannelsPrioList[0] = 2;  // stereo is prio 1
-  _recChannelsPrioList[1] = 1;  // mono is prio 2
-  _recChannelsPrioList[2] = 4;  // quad is prio 3
-
-  // list of number of channels to use on playout side
-  _playChannelsPrioList[0] = 2;  // stereo is prio 1
-  _playChannelsPrioList[1] = 1;  // mono is prio 2
-
-  HRESULT hr;
-
-  // We know that this API will work since it has already been verified in
-  // CoreAudioIsSupported, hence no need to check for errors here as well.
-
-  // Retrive the IMMDeviceEnumerator API (should load the MMDevAPI.dll)
-  // TODO(henrika): we should probably move this allocation to Init() instead
-  // and deallocate in Terminate() to make the implementation more symmetric.
-  CoCreateInstance(__uuidof(MMDeviceEnumerator), NULL, CLSCTX_ALL,
-                   __uuidof(IMMDeviceEnumerator),
-                   reinterpret_cast<void**>(&_ptrEnumerator));
-  assert(NULL != _ptrEnumerator);
-
-  // DMO initialization for built-in WASAPI AEC.
-  {
-    IMediaObject* ptrDMO = NULL;
-    hr = CoCreateInstance(CLSID_CWMAudioAEC, NULL, CLSCTX_INPROC_SERVER,
-                          IID_IMediaObject, reinterpret_cast<void**>(&ptrDMO));
-    if (FAILED(hr) || ptrDMO == NULL) {
-      // Since we check that _dmo is non-NULL in EnableBuiltInAEC(), the
-      // feature is prevented from being enabled.
-      _builtInAecEnabled = false;
-      _TraceCOMError(hr);
-    }
-    _dmo = ptrDMO;
-    SAFE_RELEASE(ptrDMO);
-  }
-}
-
-// ----------------------------------------------------------------------------
-//  AudioDeviceWindowsCore() - dtor
-// ----------------------------------------------------------------------------
-
-AudioDeviceWindowsCore::~AudioDeviceWindowsCore()
-{
-    LOG(LS_INFO) << __FUNCTION__ << " destroyed";
-
-    Terminate();
-
-    // The IMMDeviceEnumerator is created during construction. Must release
-    // it here and not in Terminate() since we don't recreate it in Init().
-    SAFE_RELEASE(_ptrEnumerator);
-
-    _ptrAudioBuffer = NULL;
-
-    if (NULL != _hRenderSamplesReadyEvent)
-    {
-        CloseHandle(_hRenderSamplesReadyEvent);
-        _hRenderSamplesReadyEvent = NULL;
-    }
-
-    if (NULL != _hCaptureSamplesReadyEvent)
-    {
-        CloseHandle(_hCaptureSamplesReadyEvent);
-        _hCaptureSamplesReadyEvent = NULL;
-    }
-
-    if (NULL != _hRenderStartedEvent)
-    {
-        CloseHandle(_hRenderStartedEvent);
-        _hRenderStartedEvent = NULL;
-    }
-
-    if (NULL != _hCaptureStartedEvent)
-    {
-        CloseHandle(_hCaptureStartedEvent);
-        _hCaptureStartedEvent = NULL;
-    }
-
-    if (NULL != _hShutdownRenderEvent)
-    {
-        CloseHandle(_hShutdownRenderEvent);
-        _hShutdownRenderEvent = NULL;
-    }
-
-    if (NULL != _hShutdownCaptureEvent)
-    {
-        CloseHandle(_hShutdownCaptureEvent);
-        _hShutdownCaptureEvent = NULL;
-    }
-
-    if (NULL != _hSetCaptureVolumeEvent)
-    {
-        CloseHandle(_hSetCaptureVolumeEvent);
-        _hSetCaptureVolumeEvent = NULL;
-    }
-
-    if (_avrtLibrary)
-    {
-        BOOL freeOK = FreeLibrary(_avrtLibrary);
-        if (!freeOK)
-        {
-            LOG(LS_WARNING)
-                << "AudioDeviceWindowsCore::~AudioDeviceWindowsCore()"
-                << " failed to free the loaded Avrt DLL module correctly";
-        }
-        else
-        {
-            LOG(LS_WARNING)
-                << "AudioDeviceWindowsCore::~AudioDeviceWindowsCore()"
-                << " the Avrt DLL module is now unloaded";
-        }
-    }
-}
-
-// ============================================================================
-//                                     API
-// ============================================================================
-
-// ----------------------------------------------------------------------------
-//  AttachAudioBuffer
-// ----------------------------------------------------------------------------
-
-void AudioDeviceWindowsCore::AttachAudioBuffer(AudioDeviceBuffer* audioBuffer)
-{
-
-    _ptrAudioBuffer = audioBuffer;
-
-    // Inform the AudioBuffer about default settings for this implementation.
-    // Set all values to zero here since the actual settings will be done by
-    // InitPlayout and InitRecording later.
-    _ptrAudioBuffer->SetRecordingSampleRate(0);
-    _ptrAudioBuffer->SetPlayoutSampleRate(0);
-    _ptrAudioBuffer->SetRecordingChannels(0);
-    _ptrAudioBuffer->SetPlayoutChannels(0);
-}
-
-// ----------------------------------------------------------------------------
-//  ActiveAudioLayer
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceWindowsCore::ActiveAudioLayer(AudioDeviceModule::AudioLayer& audioLayer) const
-{
-    audioLayer = AudioDeviceModule::kWindowsCoreAudio;
-    return 0;
-}
-
-// ----------------------------------------------------------------------------
-//  Init
-// ----------------------------------------------------------------------------
-
-AudioDeviceGeneric::InitStatus AudioDeviceWindowsCore::Init() {
-  rtc::CritScope lock(&_critSect);
-
-  if (_initialized) {
-    return InitStatus::OK;
-  }
-
-  _playWarning = 0;
-  _playError = 0;
-  _recWarning = 0;
-  _recError = 0;
-
-  // Enumerate all audio rendering and capturing endpoint devices.
-  // Note that, some of these will not be able to select by the user.
-  // The complete collection is for internal use only.
-  _EnumerateEndpointDevicesAll(eRender);
-  _EnumerateEndpointDevicesAll(eCapture);
-
-  _initialized = true;
-
-  return InitStatus::OK;
-}
-
-// ----------------------------------------------------------------------------
-//  Terminate
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceWindowsCore::Terminate()
-{
-
-    rtc::CritScope lock(&_critSect);
-
-    if (!_initialized) {
-        return 0;
-    }
-
-    _initialized = false;
-    _speakerIsInitialized = false;
-    _microphoneIsInitialized = false;
-    _playing = false;
-    _recording = false;
-
-    SAFE_RELEASE(_ptrRenderCollection);
-    SAFE_RELEASE(_ptrCaptureCollection);
-    SAFE_RELEASE(_ptrDeviceOut);
-    SAFE_RELEASE(_ptrDeviceIn);
-    SAFE_RELEASE(_ptrClientOut);
-    SAFE_RELEASE(_ptrClientIn);
-    SAFE_RELEASE(_ptrRenderClient);
-    SAFE_RELEASE(_ptrCaptureClient);
-    SAFE_RELEASE(_ptrCaptureVolume);
-    SAFE_RELEASE(_ptrRenderSimpleVolume);
-
-    return 0;
-}
-
-// ----------------------------------------------------------------------------
-//  Initialized
-// ----------------------------------------------------------------------------
-
-bool AudioDeviceWindowsCore::Initialized() const
-{
-    return (_initialized);
-}
-
-// ----------------------------------------------------------------------------
-//  InitSpeaker
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceWindowsCore::InitSpeaker()
-{
-
-    rtc::CritScope lock(&_critSect);
-
-    if (_playing)
-    {
-        return -1;
-    }
-
-    if (_ptrDeviceOut == NULL)
-    {
-        return -1;
-    }
-
-    if (_usingOutputDeviceIndex)
-    {
-        int16_t nDevices = PlayoutDevices();
-        if (_outputDeviceIndex > (nDevices - 1))
-        {
-            LOG(LS_ERROR) << "current device selection is invalid => unable to"
-                          << " initialize";
-            return -1;
-        }
-    }
-
-    int32_t ret(0);
-
-    SAFE_RELEASE(_ptrDeviceOut);
-    if (_usingOutputDeviceIndex)
-    {
-        // Refresh the selected rendering endpoint device using current index
-        ret = _GetListDevice(eRender, _outputDeviceIndex, &_ptrDeviceOut);
-    }
-    else
-    {
-        ERole role;
-        (_outputDevice == AudioDeviceModule::kDefaultDevice) ? role = eConsole : role = eCommunications;
-        // Refresh the selected rendering endpoint device using role
-        ret = _GetDefaultDevice(eRender, role, &_ptrDeviceOut);
-    }
-
-    if (ret != 0 || (_ptrDeviceOut == NULL))
-    {
-        LOG(LS_ERROR) << "failed to initialize the rendering enpoint device";
-        SAFE_RELEASE(_ptrDeviceOut);
-        return -1;
-    }
-
-    IAudioSessionManager* pManager = NULL;
-    ret = _ptrDeviceOut->Activate(__uuidof(IAudioSessionManager),
-                                  CLSCTX_ALL,
-                                  NULL,
-                                  (void**)&pManager);
-    if (ret != 0 || pManager == NULL)
-    {
-        LOG(LS_ERROR) << "failed to initialize the render manager";
-        SAFE_RELEASE(pManager);
-        return -1;
-    }
-
-    SAFE_RELEASE(_ptrRenderSimpleVolume);
-    ret = pManager->GetSimpleAudioVolume(NULL, FALSE, &_ptrRenderSimpleVolume);
-    if (ret != 0 || _ptrRenderSimpleVolume == NULL)
-    {
-        LOG(LS_ERROR) << "failed to initialize the render simple volume";
-        SAFE_RELEASE(pManager);
-        SAFE_RELEASE(_ptrRenderSimpleVolume);
-        return -1;
-    }
-    SAFE_RELEASE(pManager);
-
-    _speakerIsInitialized = true;
-
-    return 0;
-}
-
-// ----------------------------------------------------------------------------
-//  InitMicrophone
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceWindowsCore::InitMicrophone()
-{
-
-    rtc::CritScope lock(&_critSect);
-
-    if (_recording)
-    {
-        return -1;
-    }
-
-    if (_ptrDeviceIn == NULL)
-    {
-        return -1;
-    }
-
-    if (_usingInputDeviceIndex)
-    {
-        int16_t nDevices = RecordingDevices();
-        if (_inputDeviceIndex > (nDevices - 1))
-        {
-            LOG(LS_ERROR) << "current device selection is invalid => unable to"
-                          << " initialize";
-            return -1;
-        }
-    }
-
-    int32_t ret(0);
-
-    SAFE_RELEASE(_ptrDeviceIn);
-    if (_usingInputDeviceIndex)
-    {
-        // Refresh the selected capture endpoint device using current index
-        ret = _GetListDevice(eCapture, _inputDeviceIndex, &_ptrDeviceIn);
-    }
-    else
-    {
-        ERole role;
-        (_inputDevice == AudioDeviceModule::kDefaultDevice) ? role = eConsole : role = eCommunications;
-        // Refresh the selected capture endpoint device using role
-        ret = _GetDefaultDevice(eCapture, role, &_ptrDeviceIn);
-    }
-
-    if (ret != 0 || (_ptrDeviceIn == NULL))
-    {
-        LOG(LS_ERROR) << "failed to initialize the capturing enpoint device";
-        SAFE_RELEASE(_ptrDeviceIn);
-        return -1;
-    }
-
-    SAFE_RELEASE(_ptrCaptureVolume);
-    ret = _ptrDeviceIn->Activate(__uuidof(IAudioEndpointVolume),
-                                 CLSCTX_ALL,
-                                 NULL,
-                                 reinterpret_cast<void **>(&_ptrCaptureVolume));
-    if (ret != 0 || _ptrCaptureVolume == NULL)
-    {
-        LOG(LS_ERROR) << "failed to initialize the capture volume";
-        SAFE_RELEASE(_ptrCaptureVolume);
-        return -1;
-    }
-
-    _microphoneIsInitialized = true;
-
-    return 0;
-}
-
-// ----------------------------------------------------------------------------
-//  SpeakerIsInitialized
-// ----------------------------------------------------------------------------
-
-bool AudioDeviceWindowsCore::SpeakerIsInitialized() const
-{
-
-    return (_speakerIsInitialized);
-}
-
-// ----------------------------------------------------------------------------
-//  MicrophoneIsInitialized
-// ----------------------------------------------------------------------------
-
-bool AudioDeviceWindowsCore::MicrophoneIsInitialized() const
-{
-
-    return (_microphoneIsInitialized);
-}
-
-// ----------------------------------------------------------------------------
-//  SpeakerVolumeIsAvailable
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceWindowsCore::SpeakerVolumeIsAvailable(bool& available)
-{
-
-    rtc::CritScope lock(&_critSect);
-
-    if (_ptrDeviceOut == NULL)
-    {
-        return -1;
-    }
-
-    HRESULT hr = S_OK;
-    IAudioSessionManager* pManager = NULL;
-    ISimpleAudioVolume* pVolume = NULL;
-
-    hr = _ptrDeviceOut->Activate(__uuidof(IAudioSessionManager), CLSCTX_ALL, NULL, (void**)&pManager);
-    EXIT_ON_ERROR(hr);
-
-    hr = pManager->GetSimpleAudioVolume(NULL, FALSE, &pVolume);
-    EXIT_ON_ERROR(hr);
-
-    float volume(0.0f);
-    hr = pVolume->GetMasterVolume(&volume);
-    if (FAILED(hr))
-    {
-        available = false;
-    }
-    available = true;
-
-    SAFE_RELEASE(pManager);
-    SAFE_RELEASE(pVolume);
-
-    return 0;
-
-Exit:
-    _TraceCOMError(hr);
-    SAFE_RELEASE(pManager);
-    SAFE_RELEASE(pVolume);
-    return -1;
-}
-
-// ----------------------------------------------------------------------------
-//  SetSpeakerVolume
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceWindowsCore::SetSpeakerVolume(uint32_t volume)
-{
-
-    {
-        rtc::CritScope lock(&_critSect);
-
-        if (!_speakerIsInitialized)
-        {
-        return -1;
-        }
-
-        if (_ptrDeviceOut == NULL)
-        {
-            return -1;
-        }
-    }
-
-    if (volume < (uint32_t)MIN_CORE_SPEAKER_VOLUME ||
-        volume > (uint32_t)MAX_CORE_SPEAKER_VOLUME)
-    {
-        return -1;
-    }
-
-    HRESULT hr = S_OK;
-
-    // scale input volume to valid range (0.0 to 1.0)
-    const float fLevel = (float)volume/MAX_CORE_SPEAKER_VOLUME;
-    _volumeMutex.Enter();
-    hr = _ptrRenderSimpleVolume->SetMasterVolume(fLevel,NULL);
-    _volumeMutex.Leave();
-    EXIT_ON_ERROR(hr);
-
-    return 0;
-
-Exit:
-    _TraceCOMError(hr);
-    return -1;
-}
-
-// ----------------------------------------------------------------------------
-//  SpeakerVolume
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceWindowsCore::SpeakerVolume(uint32_t& volume) const
-{
-
-    {
-        rtc::CritScope lock(&_critSect);
-
-        if (!_speakerIsInitialized)
-        {
-            return -1;
-        }
-
-        if (_ptrDeviceOut == NULL)
-        {
-            return -1;
-        }
-    }
-
-    HRESULT hr = S_OK;
-    float fLevel(0.0f);
-
-    _volumeMutex.Enter();
-    hr = _ptrRenderSimpleVolume->GetMasterVolume(&fLevel);
-    _volumeMutex.Leave();
-    EXIT_ON_ERROR(hr);
-
-    // scale input volume range [0.0,1.0] to valid output range
-    volume = static_cast<uint32_t> (fLevel*MAX_CORE_SPEAKER_VOLUME);
-
-    return 0;
-
-Exit:
-    _TraceCOMError(hr);
-    return -1;
-}
-
-// ----------------------------------------------------------------------------
-//  MaxSpeakerVolume
-//
-//  The internal range for Core Audio is 0.0 to 1.0, where 0.0 indicates
-//  silence and 1.0 indicates full volume (no attenuation).
-//  We add our (webrtc-internal) own max level to match the Wave API and
-//  how it is used today in VoE.
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceWindowsCore::MaxSpeakerVolume(uint32_t& maxVolume) const
-{
-
-    if (!_speakerIsInitialized)
-    {
-        return -1;
-    }
-
-    maxVolume = static_cast<uint32_t> (MAX_CORE_SPEAKER_VOLUME);
-
-    return 0;
-}
-
-// ----------------------------------------------------------------------------
-//  MinSpeakerVolume
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceWindowsCore::MinSpeakerVolume(uint32_t& minVolume) const
-{
-
-    if (!_speakerIsInitialized)
-    {
-        return -1;
-    }
-
-    minVolume = static_cast<uint32_t> (MIN_CORE_SPEAKER_VOLUME);
-
-    return 0;
-}
-
-// ----------------------------------------------------------------------------
-//  SpeakerMuteIsAvailable
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceWindowsCore::SpeakerMuteIsAvailable(bool& available)
-{
-
-    rtc::CritScope lock(&_critSect);
-
-    if (_ptrDeviceOut == NULL)
-    {
-        return -1;
-    }
-
-    HRESULT hr = S_OK;
-    IAudioEndpointVolume* pVolume = NULL;
-
-    // Query the speaker system mute state.
-    hr = _ptrDeviceOut->Activate(__uuidof(IAudioEndpointVolume),
-        CLSCTX_ALL, NULL,  reinterpret_cast<void**>(&pVolume));
-    EXIT_ON_ERROR(hr);
-
-    BOOL mute;
-    hr = pVolume->GetMute(&mute);
-    if (FAILED(hr))
-        available = false;
-    else
-        available = true;
-
-    SAFE_RELEASE(pVolume);
-
-    return 0;
-
-Exit:
-    _TraceCOMError(hr);
-    SAFE_RELEASE(pVolume);
-    return -1;
-}
-
-// ----------------------------------------------------------------------------
-//  SetSpeakerMute
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceWindowsCore::SetSpeakerMute(bool enable)
-{
-
-    rtc::CritScope lock(&_critSect);
-
-    if (!_speakerIsInitialized)
-    {
-        return -1;
-    }
-
-    if (_ptrDeviceOut == NULL)
-    {
-        return -1;
-    }
-
-    HRESULT hr = S_OK;
-    IAudioEndpointVolume* pVolume = NULL;
-
-    // Set the speaker system mute state.
-    hr = _ptrDeviceOut->Activate(__uuidof(IAudioEndpointVolume), CLSCTX_ALL, NULL,  reinterpret_cast<void**>(&pVolume));
-    EXIT_ON_ERROR(hr);
-
-    const BOOL mute(enable);
-    hr = pVolume->SetMute(mute, NULL);
-    EXIT_ON_ERROR(hr);
-
-    SAFE_RELEASE(pVolume);
-
-    return 0;
-
-Exit:
-    _TraceCOMError(hr);
-    SAFE_RELEASE(pVolume);
-    return -1;
-}
-
-// ----------------------------------------------------------------------------
-//  SpeakerMute
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceWindowsCore::SpeakerMute(bool& enabled) const
-{
-
-    if (!_speakerIsInitialized)
-    {
-        return -1;
-    }
-
-    if (_ptrDeviceOut == NULL)
-    {
-        return -1;
-    }
-
-    HRESULT hr = S_OK;
-    IAudioEndpointVolume* pVolume = NULL;
-
-    // Query the speaker system mute state.
-    hr = _ptrDeviceOut->Activate(__uuidof(IAudioEndpointVolume), CLSCTX_ALL, NULL,  reinterpret_cast<void**>(&pVolume));
-    EXIT_ON_ERROR(hr);
-
-    BOOL mute;
-    hr = pVolume->GetMute(&mute);
-    EXIT_ON_ERROR(hr);
-
-    enabled = (mute == TRUE) ? true : false;
-
-    SAFE_RELEASE(pVolume);
-
-    return 0;
-
-Exit:
-    _TraceCOMError(hr);
-    SAFE_RELEASE(pVolume);
-    return -1;
-}
-
-// ----------------------------------------------------------------------------
-//  MicrophoneMuteIsAvailable
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceWindowsCore::MicrophoneMuteIsAvailable(bool& available)
-{
-
-    rtc::CritScope lock(&_critSect);
-
-    if (_ptrDeviceIn == NULL)
-    {
-        return -1;
-    }
-
-    HRESULT hr = S_OK;
-    IAudioEndpointVolume* pVolume = NULL;
-
-    // Query the microphone system mute state.
-    hr = _ptrDeviceIn->Activate(__uuidof(IAudioEndpointVolume), CLSCTX_ALL, NULL,  reinterpret_cast<void**>(&pVolume));
-    EXIT_ON_ERROR(hr);
-
-    BOOL mute;
-    hr = pVolume->GetMute(&mute);
-    if (FAILED(hr))
-        available = false;
-    else
-        available = true;
-
-    SAFE_RELEASE(pVolume);
-    return 0;
-
-Exit:
-    _TraceCOMError(hr);
-    SAFE_RELEASE(pVolume);
-    return -1;
-}
-
-// ----------------------------------------------------------------------------
-//  SetMicrophoneMute
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceWindowsCore::SetMicrophoneMute(bool enable)
-{
-
-    if (!_microphoneIsInitialized)
-    {
-        return -1;
-    }
-
-    if (_ptrDeviceIn == NULL)
-    {
-        return -1;
-    }
-
-    HRESULT hr = S_OK;
-    IAudioEndpointVolume* pVolume = NULL;
-
-    // Set the microphone system mute state.
-    hr = _ptrDeviceIn->Activate(__uuidof(IAudioEndpointVolume), CLSCTX_ALL, NULL,  reinterpret_cast<void**>(&pVolume));
-    EXIT_ON_ERROR(hr);
-
-    const BOOL mute(enable);
-    hr = pVolume->SetMute(mute, NULL);
-    EXIT_ON_ERROR(hr);
-
-    SAFE_RELEASE(pVolume);
-    return 0;
-
-Exit:
-    _TraceCOMError(hr);
-    SAFE_RELEASE(pVolume);
-    return -1;
-}
-
-// ----------------------------------------------------------------------------
-//  MicrophoneMute
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceWindowsCore::MicrophoneMute(bool& enabled) const
-{
-
-    if (!_microphoneIsInitialized)
-    {
-        return -1;
-    }
-
-    HRESULT hr = S_OK;
-    IAudioEndpointVolume* pVolume = NULL;
-
-    // Query the microphone system mute state.
-    hr = _ptrDeviceIn->Activate(__uuidof(IAudioEndpointVolume), CLSCTX_ALL, NULL,  reinterpret_cast<void**>(&pVolume));
-    EXIT_ON_ERROR(hr);
-
-    BOOL mute;
-    hr = pVolume->GetMute(&mute);
-    EXIT_ON_ERROR(hr);
-
-    enabled = (mute == TRUE) ? true : false;
-
-    SAFE_RELEASE(pVolume);
-    return 0;
-
-Exit:
-    _TraceCOMError(hr);
-    SAFE_RELEASE(pVolume);
-    return -1;
-}
-
-// ----------------------------------------------------------------------------
-//  StereoRecordingIsAvailable
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceWindowsCore::StereoRecordingIsAvailable(bool& available)
-{
-
-    available = true;
-    return 0;
-}
-
-// ----------------------------------------------------------------------------
-//  SetStereoRecording
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceWindowsCore::SetStereoRecording(bool enable)
-{
-
-    rtc::CritScope lock(&_critSect);
-
-    if (enable)
-    {
-        _recChannelsPrioList[0] = 2;    // try stereo first
-        _recChannelsPrioList[1] = 1;
-        _recChannels = 2;
-    }
-    else
-    {
-        _recChannelsPrioList[0] = 1;    // try mono first
-        _recChannelsPrioList[1] = 2;
-        _recChannels = 1;
-    }
-
-    return 0;
-}
-
-// ----------------------------------------------------------------------------
-//  StereoRecording
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceWindowsCore::StereoRecording(bool& enabled) const
-{
-
-    if (_recChannels == 2)
-        enabled = true;
-    else
-        enabled = false;
-
-    return 0;
-}
-
-// ----------------------------------------------------------------------------
-//  StereoPlayoutIsAvailable
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceWindowsCore::StereoPlayoutIsAvailable(bool& available)
-{
-
-    available = true;
-    return 0;
-}
-
-// ----------------------------------------------------------------------------
-//  SetStereoPlayout
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceWindowsCore::SetStereoPlayout(bool enable)
-{
-
-    rtc::CritScope lock(&_critSect);
-
-    if (enable)
-    {
-        _playChannelsPrioList[0] = 2;    // try stereo first
-        _playChannelsPrioList[1] = 1;
-        _playChannels = 2;
-    }
-    else
-    {
-        _playChannelsPrioList[0] = 1;    // try mono first
-        _playChannelsPrioList[1] = 2;
-        _playChannels = 1;
-    }
-
-    return 0;
-}
-
-// ----------------------------------------------------------------------------
-//  StereoPlayout
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceWindowsCore::StereoPlayout(bool& enabled) const
-{
-
-    if (_playChannels == 2)
-        enabled = true;
-    else
-        enabled = false;
-
-    return 0;
-}
-
-// ----------------------------------------------------------------------------
-//  SetAGC
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceWindowsCore::SetAGC(bool enable)
-{
-    rtc::CritScope lock(&_critSect);
-    _AGC = enable;
-    return 0;
-}
-
-// ----------------------------------------------------------------------------
-//  AGC
-// ----------------------------------------------------------------------------
-
-bool AudioDeviceWindowsCore::AGC() const
-{
-    rtc::CritScope lock(&_critSect);
-    return _AGC;
-}
-
-// ----------------------------------------------------------------------------
-//  MicrophoneVolumeIsAvailable
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceWindowsCore::MicrophoneVolumeIsAvailable(bool& available)
-{
-
-    rtc::CritScope lock(&_critSect);
-
-    if (_ptrDeviceIn == NULL)
-    {
-        return -1;
-    }
-
-    HRESULT hr = S_OK;
-    IAudioEndpointVolume* pVolume = NULL;
-
-    hr = _ptrDeviceIn->Activate(__uuidof(IAudioEndpointVolume), CLSCTX_ALL, NULL, reinterpret_cast<void**>(&pVolume));
-    EXIT_ON_ERROR(hr);
-
-    float volume(0.0f);
-    hr = pVolume->GetMasterVolumeLevelScalar(&volume);
-    if (FAILED(hr))
-    {
-        available = false;
-    }
-    available = true;
-
-    SAFE_RELEASE(pVolume);
-    return 0;
-
-Exit:
-    _TraceCOMError(hr);
-    SAFE_RELEASE(pVolume);
-    return -1;
-}
-
-// ----------------------------------------------------------------------------
-//  SetMicrophoneVolume
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceWindowsCore::SetMicrophoneVolume(uint32_t volume)
-{
-    LOG(LS_VERBOSE) << "AudioDeviceWindowsCore::SetMicrophoneVolume(volume="
-                    << volume << ")";
-
-    {
-        rtc::CritScope lock(&_critSect);
-
-        if (!_microphoneIsInitialized)
-        {
-            return -1;
-        }
-
-        if (_ptrDeviceIn == NULL)
-        {
-            return -1;
-        }
-    }
-
-    if (volume < static_cast<uint32_t>(MIN_CORE_MICROPHONE_VOLUME) ||
-        volume > static_cast<uint32_t>(MAX_CORE_MICROPHONE_VOLUME))
-    {
-        return -1;
-    }
-
-    HRESULT hr = S_OK;
-    // scale input volume to valid range (0.0 to 1.0)
-    const float fLevel = static_cast<float>(volume)/MAX_CORE_MICROPHONE_VOLUME;
-    _volumeMutex.Enter();
-    _ptrCaptureVolume->SetMasterVolumeLevelScalar(fLevel, NULL);
-    _volumeMutex.Leave();
-    EXIT_ON_ERROR(hr);
-
-    return 0;
-
-Exit:
-    _TraceCOMError(hr);
-    return -1;
-}
-
-// ----------------------------------------------------------------------------
-//  MicrophoneVolume
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceWindowsCore::MicrophoneVolume(uint32_t& volume) const
-{
-    {
-        rtc::CritScope lock(&_critSect);
-
-        if (!_microphoneIsInitialized)
-        {
-            return -1;
-        }
-
-        if (_ptrDeviceIn == NULL)
-        {
-            return -1;
-        }
-    }
-
-    HRESULT hr = S_OK;
-    float fLevel(0.0f);
-    volume = 0;
-    _volumeMutex.Enter();
-    hr = _ptrCaptureVolume->GetMasterVolumeLevelScalar(&fLevel);
-    _volumeMutex.Leave();
-    EXIT_ON_ERROR(hr);
-
-    // scale input volume range [0.0,1.0] to valid output range
-    volume = static_cast<uint32_t> (fLevel*MAX_CORE_MICROPHONE_VOLUME);
-
-    return 0;
-
-Exit:
-    _TraceCOMError(hr);
-    return -1;
-}
-
-// ----------------------------------------------------------------------------
-//  MaxMicrophoneVolume
-//
-//  The internal range for Core Audio is 0.0 to 1.0, where 0.0 indicates
-//  silence and 1.0 indicates full volume (no attenuation).
-//  We add our (webrtc-internal) own max level to match the Wave API and
-//  how it is used today in VoE.
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceWindowsCore::MaxMicrophoneVolume(uint32_t& maxVolume) const
-{
-    LOG(LS_VERBOSE) << __FUNCTION__;
-
-    if (!_microphoneIsInitialized)
-    {
-        return -1;
-    }
-
-    maxVolume = static_cast<uint32_t> (MAX_CORE_MICROPHONE_VOLUME);
-
-    return 0;
-}
-
-// ----------------------------------------------------------------------------
-//  MinMicrophoneVolume
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceWindowsCore::MinMicrophoneVolume(uint32_t& minVolume) const
-{
-
-    if (!_microphoneIsInitialized)
-    {
-        return -1;
-    }
-
-    minVolume = static_cast<uint32_t> (MIN_CORE_MICROPHONE_VOLUME);
-
-    return 0;
-}
-
-// ----------------------------------------------------------------------------
-//  PlayoutDevices
-// ----------------------------------------------------------------------------
-
-int16_t AudioDeviceWindowsCore::PlayoutDevices()
-{
-
-    rtc::CritScope lock(&_critSect);
-
-    if (_RefreshDeviceList(eRender) != -1)
-    {
-        return (_DeviceListCount(eRender));
-    }
-
-    return -1;
-}
-
-// ----------------------------------------------------------------------------
-//  SetPlayoutDevice I (II)
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceWindowsCore::SetPlayoutDevice(uint16_t index)
-{
-
-    if (_playIsInitialized)
-    {
-        return -1;
-    }
-
-    // Get current number of available rendering endpoint devices and refresh the rendering collection.
-    UINT nDevices = PlayoutDevices();
-
-    if (index < 0 || index > (nDevices-1))
-    {
-        LOG(LS_ERROR) << "device index is out of range [0," << (nDevices-1)
-                      << "]";
-        return -1;
-    }
-
-    rtc::CritScope lock(&_critSect);
-
-    HRESULT hr(S_OK);
-
-    assert(_ptrRenderCollection != NULL);
-
-    //  Select an endpoint rendering device given the specified index
-    SAFE_RELEASE(_ptrDeviceOut);
-    hr = _ptrRenderCollection->Item(
-                                 index,
-                                 &_ptrDeviceOut);
-    if (FAILED(hr))
-    {
-        _TraceCOMError(hr);
-        SAFE_RELEASE(_ptrDeviceOut);
-        return -1;
-    }
-
-    WCHAR szDeviceName[MAX_PATH];
-    const int bufferLen = sizeof(szDeviceName)/sizeof(szDeviceName)[0];
-
-    // Get the endpoint device's friendly-name
-    if (_GetDeviceName(_ptrDeviceOut, szDeviceName, bufferLen) == 0)
-    {
-        LOG(LS_VERBOSE) << "friendly name: \"" << szDeviceName << "\"";
-    }
-
-    _usingOutputDeviceIndex = true;
-    _outputDeviceIndex = index;
-
-    return 0;
-}
-
-// ----------------------------------------------------------------------------
-//  SetPlayoutDevice II (II)
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceWindowsCore::SetPlayoutDevice(AudioDeviceModule::WindowsDeviceType device)
-{
-    if (_playIsInitialized)
-    {
-        return -1;
-    }
-
-    ERole role(eCommunications);
-
-    if (device == AudioDeviceModule::kDefaultDevice)
-    {
-        role = eConsole;
-    }
-    else if (device == AudioDeviceModule::kDefaultCommunicationDevice)
-    {
-        role = eCommunications;
-    }
-
-    rtc::CritScope lock(&_critSect);
-
-    // Refresh the list of rendering endpoint devices
-    _RefreshDeviceList(eRender);
-
-    HRESULT hr(S_OK);
-
-    assert(_ptrEnumerator != NULL);
-
-    //  Select an endpoint rendering device given the specified role
-    SAFE_RELEASE(_ptrDeviceOut);
-    hr = _ptrEnumerator->GetDefaultAudioEndpoint(
-                           eRender,
-                           role,
-                           &_ptrDeviceOut);
-    if (FAILED(hr))
-    {
-        _TraceCOMError(hr);
-        SAFE_RELEASE(_ptrDeviceOut);
-        return -1;
-    }
-
-    WCHAR szDeviceName[MAX_PATH];
-    const int bufferLen = sizeof(szDeviceName)/sizeof(szDeviceName)[0];
-
-    // Get the endpoint device's friendly-name
-    if (_GetDeviceName(_ptrDeviceOut, szDeviceName, bufferLen) == 0)
-    {
-        LOG(LS_VERBOSE) << "friendly name: \"" << szDeviceName << "\"";
-    }
-
-    _usingOutputDeviceIndex = false;
-    _outputDevice = device;
-
-    return 0;
-}
-
-// ----------------------------------------------------------------------------
-//  PlayoutDeviceName
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceWindowsCore::PlayoutDeviceName(
-    uint16_t index,
-    char name[kAdmMaxDeviceNameSize],
-    char guid[kAdmMaxGuidSize])
-{
-
-    bool defaultCommunicationDevice(false);
-    const int16_t nDevices(PlayoutDevices());  // also updates the list of devices
-
-    // Special fix for the case when the user selects '-1' as index (<=> Default Communication Device)
-    if (index == (uint16_t)(-1))
-    {
-        defaultCommunicationDevice = true;
-        index = 0;
-        LOG(LS_VERBOSE) << "Default Communication endpoint device will be used";
-    }
-
-    if ((index > (nDevices-1)) || (name == NULL))
-    {
-        return -1;
-    }
-
-    memset(name, 0, kAdmMaxDeviceNameSize);
-
-    if (guid != NULL)
-    {
-        memset(guid, 0, kAdmMaxGuidSize);
-    }
-
-    rtc::CritScope lock(&_critSect);
-
-    int32_t ret(-1);
-    WCHAR szDeviceName[MAX_PATH];
-    const int bufferLen = sizeof(szDeviceName)/sizeof(szDeviceName)[0];
-
-    // Get the endpoint device's friendly-name
-    if (defaultCommunicationDevice)
-    {
-        ret = _GetDefaultDeviceName(eRender, eCommunications, szDeviceName, bufferLen);
-    }
-    else
-    {
-        ret = _GetListDeviceName(eRender, index, szDeviceName, bufferLen);
-    }
-
-    if (ret == 0)
-    {
-        // Convert the endpoint device's friendly-name to UTF-8
-        if (WideCharToMultiByte(CP_UTF8, 0, szDeviceName, -1, name, kAdmMaxDeviceNameSize, NULL, NULL) == 0)
-        {
-            LOG(LS_ERROR)
-                << "WideCharToMultiByte(CP_UTF8) failed with error code "
-                << GetLastError();
-        }
-    }
-
-    // Get the endpoint ID string (uniquely identifies the device among all audio endpoint devices)
-    if (defaultCommunicationDevice)
-    {
-        ret = _GetDefaultDeviceID(eRender, eCommunications, szDeviceName, bufferLen);
-    }
-    else
-    {
-        ret = _GetListDeviceID(eRender, index, szDeviceName, bufferLen);
-    }
-
-    if (guid != NULL && ret == 0)
-    {
-        // Convert the endpoint device's ID string to UTF-8
-        if (WideCharToMultiByte(CP_UTF8, 0, szDeviceName, -1, guid, kAdmMaxGuidSize, NULL, NULL) == 0)
-        {
-            LOG(LS_ERROR)
-                << "WideCharToMultiByte(CP_UTF8) failed with error code "
-                << GetLastError();
-        }
-    }
-
-    return ret;
-}
-
-// ----------------------------------------------------------------------------
-//  RecordingDeviceName
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceWindowsCore::RecordingDeviceName(
-    uint16_t index,
-    char name[kAdmMaxDeviceNameSize],
-    char guid[kAdmMaxGuidSize])
-{
-
-    bool defaultCommunicationDevice(false);
-    const int16_t nDevices(RecordingDevices());  // also updates the list of devices
-
-    // Special fix for the case when the user selects '-1' as index (<=> Default Communication Device)
-    if (index == (uint16_t)(-1))
-    {
-        defaultCommunicationDevice = true;
-        index = 0;
-        LOG(LS_VERBOSE) << "Default Communication endpoint device will be used";
-    }
-
-    if ((index > (nDevices-1)) || (name == NULL))
-    {
-        return -1;
-    }
-
-    memset(name, 0, kAdmMaxDeviceNameSize);
-
-    if (guid != NULL)
-    {
-        memset(guid, 0, kAdmMaxGuidSize);
-    }
-
-    rtc::CritScope lock(&_critSect);
-
-    int32_t ret(-1);
-    WCHAR szDeviceName[MAX_PATH];
-    const int bufferLen = sizeof(szDeviceName)/sizeof(szDeviceName)[0];
-
-    // Get the endpoint device's friendly-name
-    if (defaultCommunicationDevice)
-    {
-        ret = _GetDefaultDeviceName(eCapture, eCommunications, szDeviceName, bufferLen);
-    }
-    else
-    {
-        ret = _GetListDeviceName(eCapture, index, szDeviceName, bufferLen);
-    }
-
-    if (ret == 0)
-    {
-        // Convert the endpoint device's friendly-name to UTF-8
-        if (WideCharToMultiByte(CP_UTF8, 0, szDeviceName, -1, name, kAdmMaxDeviceNameSize, NULL, NULL) == 0)
-        {
-            LOG(LS_ERROR)
-                << "WideCharToMultiByte(CP_UTF8) failed with error code "
-                << GetLastError();
-        }
-    }
-
-    // Get the endpoint ID string (uniquely identifies the device among all audio endpoint devices)
-    if (defaultCommunicationDevice)
-    {
-        ret = _GetDefaultDeviceID(eCapture, eCommunications, szDeviceName, bufferLen);
-    }
-    else
-    {
-        ret = _GetListDeviceID(eCapture, index, szDeviceName, bufferLen);
-    }
-
-    if (guid != NULL && ret == 0)
-    {
-        // Convert the endpoint device's ID string to UTF-8
-        if (WideCharToMultiByte(CP_UTF8, 0, szDeviceName, -1, guid, kAdmMaxGuidSize, NULL, NULL) == 0)
-        {
-            LOG(LS_ERROR)
-                << "WideCharToMultiByte(CP_UTF8) failed with error code "
-                << GetLastError();
-        }
-    }
-
-    return ret;
-}
-
-// ----------------------------------------------------------------------------
-//  RecordingDevices
-// ----------------------------------------------------------------------------
-
-int16_t AudioDeviceWindowsCore::RecordingDevices()
-{
-
-    rtc::CritScope lock(&_critSect);
-
-    if (_RefreshDeviceList(eCapture) != -1)
-    {
-        return (_DeviceListCount(eCapture));
-    }
-
-    return -1;
-}
-
-// ----------------------------------------------------------------------------
-//  SetRecordingDevice I (II)
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceWindowsCore::SetRecordingDevice(uint16_t index)
-{
-
-    if (_recIsInitialized)
-    {
-        return -1;
-    }
-
-    // Get current number of available capture endpoint devices and refresh the capture collection.
-    UINT nDevices = RecordingDevices();
-
-    if (index < 0 || index > (nDevices-1))
-    {
-        LOG(LS_ERROR) << "device index is out of range [0," << (nDevices-1)
-                      << "]";
-        return -1;
-    }
-
-    rtc::CritScope lock(&_critSect);
-
-    HRESULT hr(S_OK);
-
-    assert(_ptrCaptureCollection != NULL);
-
-    // Select an endpoint capture device given the specified index
-    SAFE_RELEASE(_ptrDeviceIn);
-    hr = _ptrCaptureCollection->Item(
-                                 index,
-                                 &_ptrDeviceIn);
-    if (FAILED(hr))
-    {
-        _TraceCOMError(hr);
-        SAFE_RELEASE(_ptrDeviceIn);
-        return -1;
-    }
-
-    WCHAR szDeviceName[MAX_PATH];
-    const int bufferLen = sizeof(szDeviceName)/sizeof(szDeviceName)[0];
-
-    // Get the endpoint device's friendly-name
-    if (_GetDeviceName(_ptrDeviceIn, szDeviceName, bufferLen) == 0)
-    {
-        LOG(LS_VERBOSE) << "friendly name: \"" << szDeviceName << "\"";
-    }
-
-    _usingInputDeviceIndex = true;
-    _inputDeviceIndex = index;
-
-    return 0;
-}
-
-// ----------------------------------------------------------------------------
-//  SetRecordingDevice II (II)
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceWindowsCore::SetRecordingDevice(AudioDeviceModule::WindowsDeviceType device)
-{
-    if (_recIsInitialized)
-    {
-        return -1;
-    }
-
-    ERole role(eCommunications);
-
-    if (device == AudioDeviceModule::kDefaultDevice)
-    {
-        role = eConsole;
-    }
-    else if (device == AudioDeviceModule::kDefaultCommunicationDevice)
-    {
-        role = eCommunications;
-    }
-
-    rtc::CritScope lock(&_critSect);
-
-    // Refresh the list of capture endpoint devices
-    _RefreshDeviceList(eCapture);
-
-    HRESULT hr(S_OK);
-
-    assert(_ptrEnumerator != NULL);
-
-    //  Select an endpoint capture device given the specified role
-    SAFE_RELEASE(_ptrDeviceIn);
-    hr = _ptrEnumerator->GetDefaultAudioEndpoint(
-                           eCapture,
-                           role,
-                           &_ptrDeviceIn);
-    if (FAILED(hr))
-    {
-        _TraceCOMError(hr);
-        SAFE_RELEASE(_ptrDeviceIn);
-        return -1;
-    }
-
-    WCHAR szDeviceName[MAX_PATH];
-    const int bufferLen = sizeof(szDeviceName)/sizeof(szDeviceName)[0];
-
-    // Get the endpoint device's friendly-name
-    if (_GetDeviceName(_ptrDeviceIn, szDeviceName, bufferLen) == 0)
-    {
-        LOG(LS_VERBOSE) << "friendly name: \"" << szDeviceName << "\"";
-    }
-
-    _usingInputDeviceIndex = false;
-    _inputDevice = device;
-
-    return 0;
-}
-
-// ----------------------------------------------------------------------------
-//  PlayoutIsAvailable
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceWindowsCore::PlayoutIsAvailable(bool& available)
-{
-
-    available = false;
-
-    // Try to initialize the playout side
-    int32_t res = InitPlayout();
-
-    // Cancel effect of initialization
-    StopPlayout();
-
-    if (res != -1)
-    {
-        available = true;
-    }
-
-    return 0;
-}
-
-// ----------------------------------------------------------------------------
-//  RecordingIsAvailable
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceWindowsCore::RecordingIsAvailable(bool& available)
-{
-
-    available = false;
-
-    // Try to initialize the recording side
-    int32_t res = InitRecording();
-
-    // Cancel effect of initialization
-    StopRecording();
-
-    if (res != -1)
-    {
-        available = true;
-    }
-
-    return 0;
-}
-
-// ----------------------------------------------------------------------------
-//  InitPlayout
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceWindowsCore::InitPlayout()
-{
-
-    rtc::CritScope lock(&_critSect);
-
-    if (_playing)
-    {
-        return -1;
-    }
-
-    if (_playIsInitialized)
-    {
-        return 0;
-    }
-
-    if (_ptrDeviceOut == NULL)
-    {
-        return -1;
-    }
-
-    // Initialize the speaker (devices might have been added or removed)
-    if (InitSpeaker() == -1)
-    {
-        LOG(LS_WARNING) << "InitSpeaker() failed";
-    }
-
-    // Ensure that the updated rendering endpoint device is valid
-    if (_ptrDeviceOut == NULL)
-    {
-        return -1;
-    }
-
-    if (_builtInAecEnabled && _recIsInitialized)
-    {
-        // Ensure the correct render device is configured in case
-        // InitRecording() was called before InitPlayout().
-        if (SetDMOProperties() == -1)
-        {
-            return -1;
-        }
-    }
-
-    HRESULT hr = S_OK;
-    WAVEFORMATEX* pWfxOut = NULL;
-    WAVEFORMATEX Wfx = WAVEFORMATEX();
-    WAVEFORMATEX* pWfxClosestMatch = NULL;
-
-    // Create COM object with IAudioClient interface.
-    SAFE_RELEASE(_ptrClientOut);
-    hr = _ptrDeviceOut->Activate(
-                          __uuidof(IAudioClient),
-                          CLSCTX_ALL,
-                          NULL,
-                          (void**)&_ptrClientOut);
-    EXIT_ON_ERROR(hr);
-
-    // Retrieve the stream format that the audio engine uses for its internal
-    // processing (mixing) of shared-mode streams.
-    hr = _ptrClientOut->GetMixFormat(&pWfxOut);
-    if (SUCCEEDED(hr))
-    {
-        LOG(LS_VERBOSE) << "Audio Engine's current rendering mix format:";
-        // format type
-        LOG(LS_VERBOSE) << "wFormatTag     : 0x" << std::hex
-                        << pWfxOut->wFormatTag << std::dec << " ("
-                        << pWfxOut->wFormatTag << ")";
-        // number of channels (i.e. mono, stereo...)
-        LOG(LS_VERBOSE) << "nChannels      : " << pWfxOut->nChannels;
-        // sample rate
-        LOG(LS_VERBOSE) << "nSamplesPerSec : " << pWfxOut->nSamplesPerSec;
-        // for buffer estimation
-        LOG(LS_VERBOSE) << "nAvgBytesPerSec: " << pWfxOut->nAvgBytesPerSec;
-        // block size of data
-        LOG(LS_VERBOSE) << "nBlockAlign    : " << pWfxOut->nBlockAlign;
-        // number of bits per sample of mono data
-        LOG(LS_VERBOSE) << "wBitsPerSample : " << pWfxOut->wBitsPerSample;
-        LOG(LS_VERBOSE) << "cbSize         : " << pWfxOut->cbSize;
-    }
-
-    // Set wave format
-    Wfx.wFormatTag = WAVE_FORMAT_PCM;
-    Wfx.wBitsPerSample = 16;
-    Wfx.cbSize = 0;
-
-    const int freqs[] = {48000, 44100, 16000, 96000, 32000, 8000};
-    hr = S_FALSE;
-
-    // Iterate over frequencies and channels, in order of priority
-    for (unsigned int freq = 0; freq < sizeof(freqs)/sizeof(freqs[0]); freq++)
-    {
-        for (unsigned int chan = 0; chan < sizeof(_playChannelsPrioList)/sizeof(_playChannelsPrioList[0]); chan++)
-        {
-            Wfx.nChannels = _playChannelsPrioList[chan];
-            Wfx.nSamplesPerSec = freqs[freq];
-            Wfx.nBlockAlign = Wfx.nChannels * Wfx.wBitsPerSample / 8;
-            Wfx.nAvgBytesPerSec = Wfx.nSamplesPerSec * Wfx.nBlockAlign;
-            // If the method succeeds and the audio endpoint device supports the specified stream format,
-            // it returns S_OK. If the method succeeds and provides a closest match to the specified format,
-            // it returns S_FALSE.
-            hr = _ptrClientOut->IsFormatSupported(
-                                  AUDCLNT_SHAREMODE_SHARED,
-                                  &Wfx,
-                                  &pWfxClosestMatch);
-            if (hr == S_OK)
-            {
-                break;
-            }
-            else
-            {
-                if (pWfxClosestMatch)
-                {
-                    LOG(INFO) << "nChannels=" << Wfx.nChannels <<
-                        ", nSamplesPerSec=" << Wfx.nSamplesPerSec <<
-                        " is not supported. Closest match: " <<
-                        "nChannels=" << pWfxClosestMatch->nChannels <<
-                        ", nSamplesPerSec=" << pWfxClosestMatch->nSamplesPerSec;
-                    CoTaskMemFree(pWfxClosestMatch);
-                    pWfxClosestMatch = NULL;
-                }
-                else
-                {
-                    LOG(INFO) << "nChannels=" << Wfx.nChannels <<
-                        ", nSamplesPerSec=" << Wfx.nSamplesPerSec <<
-                        " is not supported. No closest match.";
-                }
-            }
-        }
-        if (hr == S_OK)
-            break;
-    }
-
-    // TODO(andrew): what happens in the event of failure in the above loop?
-    //   Is _ptrClientOut->Initialize expected to fail?
-    //   Same in InitRecording().
-    if (hr == S_OK)
-    {
-        _playAudioFrameSize = Wfx.nBlockAlign;
-        // Block size in frames is the number of samples each channel in 10ms.
-        _playBlockSizeInFrames = Wfx.nSamplesPerSec / 100;
-        // Block size in samples is block size in frames times number of
-        // channels.
-        _playBlockSizeInSamples = _playBlockSizeInFrames * Wfx.nChannels;
-        _playSampleRate = Wfx.nSamplesPerSec;
-        _devicePlaySampleRate = Wfx.nSamplesPerSec; // The device itself continues to run at 44.1 kHz.
-        _devicePlayBlockSize = Wfx.nSamplesPerSec/100;
-        _playChannels = Wfx.nChannels;
-
-        LOG(LS_VERBOSE) << "VoE selected this rendering format:";
-        LOG(LS_VERBOSE) << "wFormatTag         : 0x" << std::hex
-                        << Wfx.wFormatTag << std::dec << " (" << Wfx.wFormatTag
-                        << ")";
-        LOG(LS_VERBOSE) << "nChannels          : " << Wfx.nChannels;
-        LOG(LS_VERBOSE) << "nSamplesPerSec     : " << Wfx.nSamplesPerSec;
-        LOG(LS_VERBOSE) << "nAvgBytesPerSec    : " << Wfx.nAvgBytesPerSec;
-        LOG(LS_VERBOSE) << "nBlockAlign        : " << Wfx.nBlockAlign;
-        LOG(LS_VERBOSE) << "wBitsPerSample     : " << Wfx.wBitsPerSample;
-        LOG(LS_VERBOSE) << "cbSize             : " << Wfx.cbSize;
-        LOG(LS_VERBOSE) << "Additional settings:";
-        LOG(LS_VERBOSE) << "_playAudioFrameSize: " << _playAudioFrameSize;
-        LOG(LS_VERBOSE) << "_playBlockSizeInFrames     : "
-                        << _playBlockSizeInFrames;
-        LOG(LS_VERBOSE) << "_playChannels      : " << _playChannels;
-    }
-
-    // Create a rendering stream.
-    //
-    // ****************************************************************************
-    // For a shared-mode stream that uses event-driven buffering, the caller must
-    // set both hnsPeriodicity and hnsBufferDuration to 0. The Initialize method
-    // determines how large a buffer to allocate based on the scheduling period
-    // of the audio engine. Although the client's buffer processing thread is
-    // event driven, the basic buffer management process, as described previously,
-    // is unaltered.
-    // Each time the thread awakens, it should call IAudioClient::GetCurrentPadding
-    // to determine how much data to write to a rendering buffer or read from a capture
-    // buffer. In contrast to the two buffers that the Initialize method allocates
-    // for an exclusive-mode stream that uses event-driven buffering, a shared-mode
-    // stream requires a single buffer.
-    // ****************************************************************************
-    //
-    REFERENCE_TIME hnsBufferDuration = 0;  // ask for minimum buffer size (default)
-    if (_devicePlaySampleRate == 44100)
-    {
-        // Ask for a larger buffer size (30ms) when using 44.1kHz as render rate.
-        // There seems to be a larger risk of underruns for 44.1 compared
-        // with the default rate (48kHz). When using default, we set the requested
-        // buffer duration to 0, which sets the buffer to the minimum size
-        // required by the engine thread. The actual buffer size can then be
-        // read by GetBufferSize() and it is 20ms on most machines.
-        hnsBufferDuration = 30*10000;
-    }
-    hr = _ptrClientOut->Initialize(
-                          AUDCLNT_SHAREMODE_SHARED,             // share Audio Engine with other applications
-                          AUDCLNT_STREAMFLAGS_EVENTCALLBACK,    // processing of the audio buffer by the client will be event driven
-                          hnsBufferDuration,                    // requested buffer capacity as a time value (in 100-nanosecond units)
-                          0,                                    // periodicity
-                          &Wfx,                                 // selected wave format
-                          NULL);                                // session GUID
-
-    if (FAILED(hr))
-    {
-        LOG(LS_ERROR) << "IAudioClient::Initialize() failed:";
-    }
-    EXIT_ON_ERROR(hr);
-
-    if (_ptrAudioBuffer)
-    {
-        // Update the audio buffer with the selected parameters
-        _ptrAudioBuffer->SetPlayoutSampleRate(_playSampleRate);
-        _ptrAudioBuffer->SetPlayoutChannels((uint8_t)_playChannels);
-    }
-    else
-    {
-        // We can enter this state during CoreAudioIsSupported() when no AudioDeviceImplementation
-        // has been created, hence the AudioDeviceBuffer does not exist.
-        // It is OK to end up here since we don't initiate any media in CoreAudioIsSupported().
-        LOG(LS_VERBOSE)
-            << "AudioDeviceBuffer must be attached before streaming can start";
-    }
-
-    // Get the actual size of the shared (endpoint buffer).
-    // Typical value is 960 audio frames <=> 20ms @ 48kHz sample rate.
-    UINT bufferFrameCount(0);
-    hr = _ptrClientOut->GetBufferSize(
-                          &bufferFrameCount);
-    if (SUCCEEDED(hr))
-    {
-        LOG(LS_VERBOSE) << "IAudioClient::GetBufferSize() => "
-                        << bufferFrameCount << " (<=> "
-                        << bufferFrameCount*_playAudioFrameSize << " bytes)";
-    }
-
-    // Set the event handle that the system signals when an audio buffer is ready
-    // to be processed by the client.
-    hr = _ptrClientOut->SetEventHandle(
-                          _hRenderSamplesReadyEvent);
-    EXIT_ON_ERROR(hr);
-
-    // Get an IAudioRenderClient interface.
-    SAFE_RELEASE(_ptrRenderClient);
-    hr = _ptrClientOut->GetService(
-                          __uuidof(IAudioRenderClient),
-                          (void**)&_ptrRenderClient);
-    EXIT_ON_ERROR(hr);
-
-    // Mark playout side as initialized
-    _playIsInitialized = true;
-
-    CoTaskMemFree(pWfxOut);
-    CoTaskMemFree(pWfxClosestMatch);
-
-    LOG(LS_VERBOSE) << "render side is now initialized";
-    return 0;
-
-Exit:
-    _TraceCOMError(hr);
-    CoTaskMemFree(pWfxOut);
-    CoTaskMemFree(pWfxClosestMatch);
-    SAFE_RELEASE(_ptrClientOut);
-    SAFE_RELEASE(_ptrRenderClient);
-    return -1;
-}
-
-// Capture initialization when the built-in AEC DirectX Media Object (DMO) is
-// used. Called from InitRecording(), most of which is skipped over. The DMO
-// handles device initialization itself.
-// Reference: http://msdn.microsoft.com/en-us/library/ff819492(v=vs.85).aspx
-int32_t AudioDeviceWindowsCore::InitRecordingDMO()
-{
-    assert(_builtInAecEnabled);
-    assert(_dmo != NULL);
-
-    if (SetDMOProperties() == -1)
-    {
-        return -1;
-    }
-
-    DMO_MEDIA_TYPE mt = {0};
-    HRESULT hr = MoInitMediaType(&mt, sizeof(WAVEFORMATEX));
-    if (FAILED(hr))
-    {
-        MoFreeMediaType(&mt);
-        _TraceCOMError(hr);
-        return -1;
-    }
-    mt.majortype = MEDIATYPE_Audio;
-    mt.subtype = MEDIASUBTYPE_PCM;
-    mt.formattype = FORMAT_WaveFormatEx;
-
-    // Supported formats
-    // nChannels: 1 (in AEC-only mode)
-    // nSamplesPerSec: 8000, 11025, 16000, 22050
-    // wBitsPerSample: 16
-    WAVEFORMATEX* ptrWav = reinterpret_cast<WAVEFORMATEX*>(mt.pbFormat);
-    ptrWav->wFormatTag = WAVE_FORMAT_PCM;
-    ptrWav->nChannels = 1;
-    // 16000 is the highest we can support with our resampler.
-    ptrWav->nSamplesPerSec = 16000;
-    ptrWav->nAvgBytesPerSec = 32000;
-    ptrWav->nBlockAlign = 2;
-    ptrWav->wBitsPerSample = 16;
-    ptrWav->cbSize = 0;
-
-    // Set the VoE format equal to the AEC output format.
-    _recAudioFrameSize = ptrWav->nBlockAlign;
-    _recSampleRate = ptrWav->nSamplesPerSec;
-    _recBlockSize = ptrWav->nSamplesPerSec / 100;
-    _recChannels = ptrWav->nChannels;
-
-    // Set the DMO output format parameters.
-    hr = _dmo->SetOutputType(kAecCaptureStreamIndex, &mt, 0);
-    MoFreeMediaType(&mt);
-    if (FAILED(hr))
-    {
-        _TraceCOMError(hr);
-        return -1;
-    }
-
-    if (_ptrAudioBuffer)
-    {
-        _ptrAudioBuffer->SetRecordingSampleRate(_recSampleRate);
-        _ptrAudioBuffer->SetRecordingChannels(_recChannels);
-    }
-    else
-    {
-        // Refer to InitRecording() for comments.
-        LOG(LS_VERBOSE)
-            << "AudioDeviceBuffer must be attached before streaming can start";
-    }
-
-    _mediaBuffer = new MediaBufferImpl(_recBlockSize * _recAudioFrameSize);
-
-    // Optional, but if called, must be after media types are set.
-    hr = _dmo->AllocateStreamingResources();
-    if (FAILED(hr))
-    {
-         _TraceCOMError(hr);
-        return -1;
-    }
-
-    _recIsInitialized = true;
-    LOG(LS_VERBOSE) << "Capture side is now initialized";
-
-    return 0;
-}
-
-// ----------------------------------------------------------------------------
-//  InitRecording
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceWindowsCore::InitRecording()
-{
-
-    rtc::CritScope lock(&_critSect);
-
-    if (_recording)
-    {
-        return -1;
-    }
-
-    if (_recIsInitialized)
-    {
-        return 0;
-    }
-
-    if (QueryPerformanceFrequency(&_perfCounterFreq) == 0)
-    {
-        return -1;
-    }
-    _perfCounterFactor = 10000000.0 / (double)_perfCounterFreq.QuadPart;
-
-    if (_ptrDeviceIn == NULL)
-    {
-        return -1;
-    }
-
-    // Initialize the microphone (devices might have been added or removed)
-    if (InitMicrophone() == -1)
-    {
-        LOG(LS_WARNING) << "InitMicrophone() failed";
-    }
-
-    // Ensure that the updated capturing endpoint device is valid
-    if (_ptrDeviceIn == NULL)
-    {
-        return -1;
-    }
-
-    if (_builtInAecEnabled)
-    {
-        // The DMO will configure the capture device.
-        return InitRecordingDMO();
-    }
-
-    HRESULT hr = S_OK;
-    WAVEFORMATEX* pWfxIn = NULL;
-    WAVEFORMATEXTENSIBLE Wfx = WAVEFORMATEXTENSIBLE();
-    WAVEFORMATEX* pWfxClosestMatch = NULL;
-
-    // Create COM object with IAudioClient interface.
-    SAFE_RELEASE(_ptrClientIn);
-    hr = _ptrDeviceIn->Activate(
-                          __uuidof(IAudioClient),
-                          CLSCTX_ALL,
-                          NULL,
-                          (void**)&_ptrClientIn);
-    EXIT_ON_ERROR(hr);
-
-    // Retrieve the stream format that the audio engine uses for its internal
-    // processing (mixing) of shared-mode streams.
-    hr = _ptrClientIn->GetMixFormat(&pWfxIn);
-    if (SUCCEEDED(hr))
-    {
-        LOG(LS_VERBOSE) << "Audio Engine's current capturing mix format:";
-        // format type
-        LOG(LS_VERBOSE) << "wFormatTag     : 0x" << std::hex
-                        << pWfxIn->wFormatTag << std::dec << " ("
-                        << pWfxIn->wFormatTag << ")";
-        // number of channels (i.e. mono, stereo...)
-        LOG(LS_VERBOSE) << "nChannels      : " << pWfxIn->nChannels;
-        // sample rate
-        LOG(LS_VERBOSE) << "nSamplesPerSec : " << pWfxIn->nSamplesPerSec;
-        // for buffer estimation
-        LOG(LS_VERBOSE) << "nAvgBytesPerSec: " << pWfxIn->nAvgBytesPerSec;
-        // block size of data
-        LOG(LS_VERBOSE) << "nBlockAlign    : " << pWfxIn->nBlockAlign;
-        // number of bits per sample of mono data
-        LOG(LS_VERBOSE) << "wBitsPerSample : " << pWfxIn->wBitsPerSample;
-        LOG(LS_VERBOSE) << "cbSize         : " << pWfxIn->cbSize;
-    }
-
-    // Set wave format
-    Wfx.Format.wFormatTag = WAVE_FORMAT_EXTENSIBLE;
-    Wfx.Format.wBitsPerSample = 16;
-    Wfx.Format.cbSize = 22;
-    Wfx.dwChannelMask = 0;
-    Wfx.Samples.wValidBitsPerSample = Wfx.Format.wBitsPerSample;
-    Wfx.SubFormat = KSDATAFORMAT_SUBTYPE_PCM;
-
-    const int freqs[6] = {48000, 44100, 16000, 96000, 32000, 8000};
-    hr = S_FALSE;
-
-    // Iterate over frequencies and channels, in order of priority
-    for (unsigned int freq = 0; freq < sizeof(freqs)/sizeof(freqs[0]); freq++)
-    {
-        for (unsigned int chan = 0; chan < sizeof(_recChannelsPrioList)/sizeof(_recChannelsPrioList[0]); chan++)
-        {
-            Wfx.Format.nChannels = _recChannelsPrioList[chan];
-            Wfx.Format.nSamplesPerSec = freqs[freq];
-            Wfx.Format.nBlockAlign = Wfx.Format.nChannels *
-                                     Wfx.Format.wBitsPerSample / 8;
-            Wfx.Format.nAvgBytesPerSec = Wfx.Format.nSamplesPerSec *
-                                         Wfx.Format.nBlockAlign;
-            // If the method succeeds and the audio endpoint device supports the specified stream format,
-            // it returns S_OK. If the method succeeds and provides a closest match to the specified format,
-            // it returns S_FALSE.
-            hr = _ptrClientIn->IsFormatSupported(
-                                  AUDCLNT_SHAREMODE_SHARED,
-                                  (WAVEFORMATEX*)&Wfx,
-                                  &pWfxClosestMatch);
-            if (hr == S_OK)
-            {
-                break;
-            }
-            else
-            {
-                if (pWfxClosestMatch)
-                {
-                    LOG(INFO) << "nChannels=" << Wfx.Format.nChannels <<
-                        ", nSamplesPerSec=" << Wfx.Format.nSamplesPerSec <<
-                        " is not supported. Closest match: " <<
-                        "nChannels=" << pWfxClosestMatch->nChannels <<
-                        ", nSamplesPerSec=" << pWfxClosestMatch->nSamplesPerSec;
-                    CoTaskMemFree(pWfxClosestMatch);
-                    pWfxClosestMatch = NULL;
-                }
-                else
-                {
-                    LOG(INFO) << "nChannels=" << Wfx.Format.nChannels <<
-                        ", nSamplesPerSec=" << Wfx.Format.nSamplesPerSec <<
-                        " is not supported. No closest match.";
-                }
-            }
-        }
-        if (hr == S_OK)
-            break;
-    }
-
-    if (hr == S_OK)
-    {
-        _recAudioFrameSize = Wfx.Format.nBlockAlign;
-        _recSampleRate = Wfx.Format.nSamplesPerSec;
-        _recBlockSize = Wfx.Format.nSamplesPerSec/100;
-        _recChannels = Wfx.Format.nChannels;
-
-        LOG(LS_VERBOSE) << "VoE selected this capturing format:";
-        LOG(LS_VERBOSE) << "wFormatTag        : 0x" << std::hex
-                        << Wfx.Format.wFormatTag << std::dec
-                        << " (" << Wfx.Format.wFormatTag << ")";
-        LOG(LS_VERBOSE) << "nChannels         : " << Wfx.Format.nChannels;
-        LOG(LS_VERBOSE) << "nSamplesPerSec    : " << Wfx.Format.nSamplesPerSec;
-        LOG(LS_VERBOSE) << "nAvgBytesPerSec   : " << Wfx.Format.nAvgBytesPerSec;
-        LOG(LS_VERBOSE) << "nBlockAlign       : " << Wfx.Format.nBlockAlign;
-        LOG(LS_VERBOSE) << "wBitsPerSample    : " << Wfx.Format.wBitsPerSample;
-        LOG(LS_VERBOSE) << "cbSize            : " << Wfx.Format.cbSize;
-        LOG(LS_VERBOSE) << "Additional settings:";
-        LOG(LS_VERBOSE) << "_recAudioFrameSize: " << _recAudioFrameSize;
-        LOG(LS_VERBOSE) << "_recBlockSize     : " << _recBlockSize;
-        LOG(LS_VERBOSE) << "_recChannels      : " << _recChannels;
-    }
-
-    // Create a capturing stream.
-    hr = _ptrClientIn->Initialize(
-                          AUDCLNT_SHAREMODE_SHARED,             // share Audio Engine with other applications
-                          AUDCLNT_STREAMFLAGS_EVENTCALLBACK |   // processing of the audio buffer by the client will be event driven
-                          AUDCLNT_STREAMFLAGS_NOPERSIST,        // volume and mute settings for an audio session will not persist across system restarts
-                          0,                                    // required for event-driven shared mode
-                          0,                                    // periodicity
-                          (WAVEFORMATEX*)&Wfx,                  // selected wave format
-                          NULL);                                // session GUID
-
-
-    if (hr != S_OK)
-    {
-        LOG(LS_ERROR) << "IAudioClient::Initialize() failed:";
-    }
-    EXIT_ON_ERROR(hr);
-
-    if (_ptrAudioBuffer)
-    {
-        // Update the audio buffer with the selected parameters
-        _ptrAudioBuffer->SetRecordingSampleRate(_recSampleRate);
-        _ptrAudioBuffer->SetRecordingChannels((uint8_t)_recChannels);
-    }
-    else
-    {
-        // We can enter this state during CoreAudioIsSupported() when no AudioDeviceImplementation
-        // has been created, hence the AudioDeviceBuffer does not exist.
-        // It is OK to end up here since we don't initiate any media in CoreAudioIsSupported().
-        LOG(LS_VERBOSE)
-            << "AudioDeviceBuffer must be attached before streaming can start";
-    }
-
-    // Get the actual size of the shared (endpoint buffer).
-    // Typical value is 960 audio frames <=> 20ms @ 48kHz sample rate.
-    UINT bufferFrameCount(0);
-    hr = _ptrClientIn->GetBufferSize(
-                          &bufferFrameCount);
-    if (SUCCEEDED(hr))
-    {
-        LOG(LS_VERBOSE) << "IAudioClient::GetBufferSize() => "
-                        << bufferFrameCount << " (<=> "
-                        << bufferFrameCount*_recAudioFrameSize << " bytes)";
-    }
-
-    // Set the event handle that the system signals when an audio buffer is ready
-    // to be processed by the client.
-    hr = _ptrClientIn->SetEventHandle(
-                          _hCaptureSamplesReadyEvent);
-    EXIT_ON_ERROR(hr);
-
-    // Get an IAudioCaptureClient interface.
-    SAFE_RELEASE(_ptrCaptureClient);
-    hr = _ptrClientIn->GetService(
-                          __uuidof(IAudioCaptureClient),
-                          (void**)&_ptrCaptureClient);
-    EXIT_ON_ERROR(hr);
-
-    // Mark capture side as initialized
-    _recIsInitialized = true;
-
-    CoTaskMemFree(pWfxIn);
-    CoTaskMemFree(pWfxClosestMatch);
-
-    LOG(LS_VERBOSE) << "capture side is now initialized";
-    return 0;
-
-Exit:
-    _TraceCOMError(hr);
-    CoTaskMemFree(pWfxIn);
-    CoTaskMemFree(pWfxClosestMatch);
-    SAFE_RELEASE(_ptrClientIn);
-    SAFE_RELEASE(_ptrCaptureClient);
-    return -1;
-}
-
-// ----------------------------------------------------------------------------
-//  StartRecording
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceWindowsCore::StartRecording()
-{
-
-    if (!_recIsInitialized)
-    {
-        return -1;
-    }
-
-    if (_hRecThread != NULL)
-    {
-        return 0;
-    }
-
-    if (_recording)
-    {
-        return 0;
-    }
-
-    {
-        rtc::CritScope critScoped(&_critSect);
-
-        // Create thread which will drive the capturing
-        LPTHREAD_START_ROUTINE lpStartAddress = WSAPICaptureThread;
-        if (_builtInAecEnabled)
-        {
-            // Redirect to the DMO polling method.
-            lpStartAddress = WSAPICaptureThreadPollDMO;
-
-            if (!_playing)
-            {
-                // The DMO won't provide us captured output data unless we
-                // give it render data to process.
-                LOG(LS_ERROR)
-                    << "Playout must be started before recording when using"
-                    << " the built-in AEC";
-                return -1;
-            }
-        }
-
-        assert(_hRecThread == NULL);
-        _hRecThread = CreateThread(NULL,
-                                   0,
-                                   lpStartAddress,
-                                   this,
-                                   0,
-                                   NULL);
-        if (_hRecThread == NULL)
-        {
-            LOG(LS_ERROR) << "failed to create the recording thread";
-            return -1;
-        }
-
-        // Set thread priority to highest possible
-        SetThreadPriority(_hRecThread, THREAD_PRIORITY_TIME_CRITICAL);
-
-        assert(_hGetCaptureVolumeThread == NULL);
-        _hGetCaptureVolumeThread = CreateThread(NULL,
-                                                0,
-                                                GetCaptureVolumeThread,
-                                                this,
-                                                0,
-                                                NULL);
-        if (_hGetCaptureVolumeThread == NULL)
-        {
-            LOG(LS_ERROR) << "failed to create the volume getter thread";
-            return -1;
-        }
-
-        assert(_hSetCaptureVolumeThread == NULL);
-        _hSetCaptureVolumeThread = CreateThread(NULL,
-                                                0,
-                                                SetCaptureVolumeThread,
-                                                this,
-                                                0,
-                                                NULL);
-        if (_hSetCaptureVolumeThread == NULL)
-        {
-            LOG(LS_ERROR) << "failed to create the volume setter thread";
-            return -1;
-        }
-    }  // critScoped
-
-    DWORD ret = WaitForSingleObject(_hCaptureStartedEvent, 1000);
-    if (ret != WAIT_OBJECT_0)
-    {
-        LOG(LS_VERBOSE) << "capturing did not start up properly";
-        return -1;
-    }
-    LOG(LS_VERBOSE) << "capture audio stream has now started...";
-
-    _recording = true;
-
-    return 0;
-}
-
-// ----------------------------------------------------------------------------
-//  StopRecording
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceWindowsCore::StopRecording()
-{
-    int32_t err = 0;
-
-    if (!_recIsInitialized)
-    {
-        return 0;
-    }
-
-    _Lock();
-
-    if (_hRecThread == NULL)
-    {
-        LOG(LS_VERBOSE)
-            << "no capturing stream is active => close down WASAPI only";
-        SAFE_RELEASE(_ptrClientIn);
-        SAFE_RELEASE(_ptrCaptureClient);
-        _recIsInitialized = false;
-        _recording = false;
-        _UnLock();
-        return 0;
-    }
-
-    // Stop the driving thread...
-    LOG(LS_VERBOSE) << "closing down the webrtc_core_audio_capture_thread...";
-    // Manual-reset event; it will remain signalled to stop all capture threads.
-    SetEvent(_hShutdownCaptureEvent);
-
-    _UnLock();
-    DWORD ret = WaitForSingleObject(_hRecThread, 2000);
-    if (ret != WAIT_OBJECT_0)
-    {
-        LOG(LS_ERROR)
-            << "failed to close down webrtc_core_audio_capture_thread";
-        err = -1;
-    }
-    else
-    {
-        LOG(LS_VERBOSE) << "webrtc_core_audio_capture_thread is now closed";
-    }
-
-    ret = WaitForSingleObject(_hGetCaptureVolumeThread, 2000);
-    if (ret != WAIT_OBJECT_0)
-    {
-        // the thread did not stop as it should
-        LOG(LS_ERROR) << "failed to close down volume getter thread";
-        err = -1;
-    }
-    else
-    {
-        LOG(LS_VERBOSE) << "volume getter thread is now closed";
-    }
-
-    ret = WaitForSingleObject(_hSetCaptureVolumeThread, 2000);
-    if (ret != WAIT_OBJECT_0)
-    {
-        // the thread did not stop as it should
-        LOG(LS_ERROR) << "failed to close down volume setter thread";
-        err = -1;
-    }
-    else
-    {
-        LOG(LS_VERBOSE) << "volume setter thread is now closed";
-    }
-    _Lock();
-
-    ResetEvent(_hShutdownCaptureEvent); // Must be manually reset.
-    // Ensure that the thread has released these interfaces properly.
-    assert(err == -1 || _ptrClientIn == NULL);
-    assert(err == -1 || _ptrCaptureClient == NULL);
-
-    _recIsInitialized = false;
-    _recording = false;
-
-    // These will create thread leaks in the result of an error,
-    // but we can at least resume the call.
-    CloseHandle(_hRecThread);
-    _hRecThread = NULL;
-
-    CloseHandle(_hGetCaptureVolumeThread);
-    _hGetCaptureVolumeThread = NULL;
-
-    CloseHandle(_hSetCaptureVolumeThread);
-    _hSetCaptureVolumeThread = NULL;
-
-    if (_builtInAecEnabled)
-    {
-        assert(_dmo != NULL);
-        // This is necessary. Otherwise the DMO can generate garbage render
-        // audio even after rendering has stopped.
-        HRESULT hr = _dmo->FreeStreamingResources();
-        if (FAILED(hr))
-        {
-            _TraceCOMError(hr);
-            err = -1;
-        }
-    }
-
-    // Reset the recording delay value.
-    _sndCardRecDelay = 0;
-
-    _UnLock();
-
-    return err;
-}
-
-// ----------------------------------------------------------------------------
-//  RecordingIsInitialized
-// ----------------------------------------------------------------------------
-
-bool AudioDeviceWindowsCore::RecordingIsInitialized() const
-{
-    return (_recIsInitialized);
-}
-
-// ----------------------------------------------------------------------------
-//  Recording
-// ----------------------------------------------------------------------------
-
-bool AudioDeviceWindowsCore::Recording() const
-{
-    return (_recording);
-}
-
-// ----------------------------------------------------------------------------
-//  PlayoutIsInitialized
-// ----------------------------------------------------------------------------
-
-bool AudioDeviceWindowsCore::PlayoutIsInitialized() const
-{
-
-    return (_playIsInitialized);
-}
-
-// ----------------------------------------------------------------------------
-//  StartPlayout
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceWindowsCore::StartPlayout()
-{
-
-    if (!_playIsInitialized)
-    {
-        return -1;
-    }
-
-    if (_hPlayThread != NULL)
-    {
-        return 0;
-    }
-
-    if (_playing)
-    {
-        return 0;
-    }
-
-    {
-        rtc::CritScope critScoped(&_critSect);
-
-        // Create thread which will drive the rendering.
-        assert(_hPlayThread == NULL);
-        _hPlayThread = CreateThread(
-                         NULL,
-                         0,
-                         WSAPIRenderThread,
-                         this,
-                         0,
-                         NULL);
-        if (_hPlayThread == NULL)
-        {
-            LOG(LS_ERROR) << "failed to create the playout thread";
-            return -1;
-        }
-
-        // Set thread priority to highest possible.
-        SetThreadPriority(_hPlayThread, THREAD_PRIORITY_TIME_CRITICAL);
-    }  // critScoped
-
-    DWORD ret = WaitForSingleObject(_hRenderStartedEvent, 1000);
-    if (ret != WAIT_OBJECT_0)
-    {
-        LOG(LS_VERBOSE) << "rendering did not start up properly";
-        return -1;
-    }
-
-    _playing = true;
-    LOG(LS_VERBOSE) << "rendering audio stream has now started...";
-
-    return 0;
-}
-
-// ----------------------------------------------------------------------------
-//  StopPlayout
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceWindowsCore::StopPlayout()
-{
-
-    if (!_playIsInitialized)
-    {
-        return 0;
-    }
-
-    {
-        rtc::CritScope critScoped(&_critSect) ;
-
-        if (_hPlayThread == NULL)
-        {
-            LOG(LS_VERBOSE)
-                << "no rendering stream is active => close down WASAPI only";
-            SAFE_RELEASE(_ptrClientOut);
-            SAFE_RELEASE(_ptrRenderClient);
-            _playIsInitialized = false;
-            _playing = false;
-            return 0;
-        }
-
-        // stop the driving thread...
-        LOG(LS_VERBOSE)
-            << "closing down the webrtc_core_audio_render_thread...";
-        SetEvent(_hShutdownRenderEvent);
-    }  // critScoped
-
-    DWORD ret = WaitForSingleObject(_hPlayThread, 2000);
-    if (ret != WAIT_OBJECT_0)
-    {
-        // the thread did not stop as it should
-        LOG(LS_ERROR) << "failed to close down webrtc_core_audio_render_thread";
-        CloseHandle(_hPlayThread);
-        _hPlayThread = NULL;
-        _playIsInitialized = false;
-        _playing = false;
-        return -1;
-    }
-
-    {
-        rtc::CritScope critScoped(&_critSect);
-        LOG(LS_VERBOSE) << "webrtc_core_audio_render_thread is now closed";
-
-        // to reset this event manually at each time we finish with it,
-        // in case that the render thread has exited before StopPlayout(),
-        // this event might be caught by the new render thread within same VoE instance.
-        ResetEvent(_hShutdownRenderEvent);
-
-        SAFE_RELEASE(_ptrClientOut);
-        SAFE_RELEASE(_ptrRenderClient);
-
-        _playIsInitialized = false;
-        _playing = false;
-
-        CloseHandle(_hPlayThread);
-        _hPlayThread = NULL;
-
-        if (_builtInAecEnabled && _recording)
-        {
-            // The DMO won't provide us captured output data unless we
-            // give it render data to process.
-            //
-            // We still permit the playout to shutdown, and trace a warning.
-            // Otherwise, VoE can get into a state which will never permit
-            // playout to stop properly.
-            LOG(LS_WARNING)
-                << "Recording should be stopped before playout when using the"
-                << " built-in AEC";
-        }
-
-        // Reset the playout delay value.
-        _sndCardPlayDelay = 0;
-    }  // critScoped
-
-    return 0;
-}
-
-// ----------------------------------------------------------------------------
-//  PlayoutDelay
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceWindowsCore::PlayoutDelay(uint16_t& delayMS) const
-{
-    rtc::CritScope critScoped(&_critSect);
-    delayMS = static_cast<uint16_t>(_sndCardPlayDelay);
-    return 0;
-}
-
-// ----------------------------------------------------------------------------
-//  RecordingDelay
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceWindowsCore::RecordingDelay(uint16_t& delayMS) const
-{
-    rtc::CritScope critScoped(&_critSect);
-    delayMS = static_cast<uint16_t>(_sndCardRecDelay);
-    return 0;
-}
-
-// ----------------------------------------------------------------------------
-//  Playing
-// ----------------------------------------------------------------------------
-
-bool AudioDeviceWindowsCore::Playing() const
-{
-    return (_playing);
-}
-
-// ----------------------------------------------------------------------------
-//  PlayoutWarning
-// ----------------------------------------------------------------------------
-
-bool AudioDeviceWindowsCore::PlayoutWarning() const
-{
-    return ( _playWarning > 0);
-}
-
-// ----------------------------------------------------------------------------
-//  PlayoutError
-// ----------------------------------------------------------------------------
-
-bool AudioDeviceWindowsCore::PlayoutError() const
-{
-    return ( _playError > 0);
-}
-
-// ----------------------------------------------------------------------------
-//  RecordingWarning
-// ----------------------------------------------------------------------------
-
-bool AudioDeviceWindowsCore::RecordingWarning() const
-{
-    return ( _recWarning > 0);
-}
-
-// ----------------------------------------------------------------------------
-//  RecordingError
-// ----------------------------------------------------------------------------
-
-bool AudioDeviceWindowsCore::RecordingError() const
-{
-    return ( _recError > 0);
-}
-
-// ----------------------------------------------------------------------------
-//  ClearPlayoutWarning
-// ----------------------------------------------------------------------------
-
-void AudioDeviceWindowsCore::ClearPlayoutWarning()
-{
-    _playWarning = 0;
-}
-
-// ----------------------------------------------------------------------------
-//  ClearPlayoutError
-// ----------------------------------------------------------------------------
-
-void AudioDeviceWindowsCore::ClearPlayoutError()
-{
-    _playError = 0;
-}
-
-// ----------------------------------------------------------------------------
-//  ClearRecordingWarning
-// ----------------------------------------------------------------------------
-
-void AudioDeviceWindowsCore::ClearRecordingWarning()
-{
-    _recWarning = 0;
-}
-
-// ----------------------------------------------------------------------------
-//  ClearRecordingError
-// ----------------------------------------------------------------------------
-
-void AudioDeviceWindowsCore::ClearRecordingError()
-{
-    _recError = 0;
-}
-
-// ============================================================================
-//                                 Private Methods
-// ============================================================================
-
-// ----------------------------------------------------------------------------
-//  [static] WSAPIRenderThread
-// ----------------------------------------------------------------------------
-
-DWORD WINAPI AudioDeviceWindowsCore::WSAPIRenderThread(LPVOID context)
-{
-    return reinterpret_cast<AudioDeviceWindowsCore*>(context)->
-        DoRenderThread();
-}
-
-// ----------------------------------------------------------------------------
-//  [static] WSAPICaptureThread
-// ----------------------------------------------------------------------------
-
-DWORD WINAPI AudioDeviceWindowsCore::WSAPICaptureThread(LPVOID context)
-{
-    return reinterpret_cast<AudioDeviceWindowsCore*>(context)->
-        DoCaptureThread();
-}
-
-DWORD WINAPI AudioDeviceWindowsCore::WSAPICaptureThreadPollDMO(LPVOID context)
-{
-    return reinterpret_cast<AudioDeviceWindowsCore*>(context)->
-        DoCaptureThreadPollDMO();
-}
-
-DWORD WINAPI AudioDeviceWindowsCore::GetCaptureVolumeThread(LPVOID context)
-{
-    return reinterpret_cast<AudioDeviceWindowsCore*>(context)->
-        DoGetCaptureVolumeThread();
-}
-
-DWORD WINAPI AudioDeviceWindowsCore::SetCaptureVolumeThread(LPVOID context)
-{
-    return reinterpret_cast<AudioDeviceWindowsCore*>(context)->
-        DoSetCaptureVolumeThread();
-}
-
-DWORD AudioDeviceWindowsCore::DoGetCaptureVolumeThread()
-{
-    HANDLE waitObject = _hShutdownCaptureEvent;
-
-    while (1)
-    {
-        if (AGC())
-        {
-            uint32_t currentMicLevel = 0;
-            if (MicrophoneVolume(currentMicLevel) == 0)
-            {
-                // This doesn't set the system volume, just stores it.
-                _Lock();
-                if (_ptrAudioBuffer)
-                {
-                    _ptrAudioBuffer->SetCurrentMicLevel(currentMicLevel);
-                }
-                _UnLock();
-            }
-        }
-
-        DWORD waitResult = WaitForSingleObject(waitObject,
-                                               GET_MIC_VOLUME_INTERVAL_MS);
-        switch (waitResult)
-        {
-            case WAIT_OBJECT_0: // _hShutdownCaptureEvent
-                return 0;
-            case WAIT_TIMEOUT:  // timeout notification
-                break;
-            default:            // unexpected error
-                LOG(LS_WARNING)
-                    << "unknown wait termination on get volume thread";
-                return 1;
-        }
-    }
-}
-
-DWORD AudioDeviceWindowsCore::DoSetCaptureVolumeThread()
-{
-    HANDLE waitArray[2] = {_hShutdownCaptureEvent, _hSetCaptureVolumeEvent};
-
-    while (1)
-    {
-        DWORD waitResult = WaitForMultipleObjects(2, waitArray, FALSE, INFINITE);
-        switch (waitResult)
-        {
-            case WAIT_OBJECT_0:      // _hShutdownCaptureEvent
-                return 0;
-            case WAIT_OBJECT_0 + 1:  // _hSetCaptureVolumeEvent
-                break;
-            default:                 // unexpected error
-                LOG(LS_WARNING)
-                    << "unknown wait termination on set volume thread";
-                    return 1;
-        }
-
-        _Lock();
-        uint32_t newMicLevel = _newMicLevel;
-        _UnLock();
-
-        if (SetMicrophoneVolume(newMicLevel) == -1)
-        {
-            LOG(LS_WARNING)
-                << "the required modification of the microphone volume failed";
-        }
-    }
-}
-
-// ----------------------------------------------------------------------------
-//  DoRenderThread
-// ----------------------------------------------------------------------------
-
-DWORD AudioDeviceWindowsCore::DoRenderThread()
-{
-
-    bool keepPlaying = true;
-    HANDLE waitArray[2] = {_hShutdownRenderEvent, _hRenderSamplesReadyEvent};
-    HRESULT hr = S_OK;
-    HANDLE hMmTask = NULL;
-
-    // Initialize COM as MTA in this thread.
-    ScopedCOMInitializer comInit(ScopedCOMInitializer::kMTA);
-    if (!comInit.succeeded()) {
-      LOG(LS_ERROR) << "failed to initialize COM in render thread";
-      return 1;
-    }
-
-    rtc::SetCurrentThreadName("webrtc_core_audio_render_thread");
-
-    // Use Multimedia Class Scheduler Service (MMCSS) to boost the thread priority.
-    //
-    if (_winSupportAvrt)
-    {
-        DWORD taskIndex(0);
-        hMmTask = _PAvSetMmThreadCharacteristicsA("Pro Audio", &taskIndex);
-        if (hMmTask)
-        {
-            if (FALSE == _PAvSetMmThreadPriority(hMmTask, AVRT_PRIORITY_CRITICAL))
-            {
-                LOG(LS_WARNING) << "failed to boost play-thread using MMCSS";
-            }
-            LOG(LS_VERBOSE)
-                << "render thread is now registered with MMCSS (taskIndex="
-                << taskIndex << ")";
-        }
-        else
-        {
-            LOG(LS_WARNING) << "failed to enable MMCSS on render thread (err="
-                            << GetLastError() << ")";
-            _TraceCOMError(GetLastError());
-        }
-    }
-
-    _Lock();
-
-    IAudioClock* clock = NULL;
-
-    // Get size of rendering buffer (length is expressed as the number of audio frames the buffer can hold).
-    // This value is fixed during the rendering session.
-    //
-    UINT32 bufferLength = 0;
-    hr = _ptrClientOut->GetBufferSize(&bufferLength);
-    EXIT_ON_ERROR(hr);
-    LOG(LS_VERBOSE) << "[REND] size of buffer       : " << bufferLength;
-
-    // Get maximum latency for the current stream (will not change for the lifetime  of the IAudioClient object).
-    //
-    REFERENCE_TIME latency;
-    _ptrClientOut->GetStreamLatency(&latency);
-    LOG(LS_VERBOSE) << "[REND] max stream latency   : " << (DWORD)latency
-                    << " (" << (double)(latency/10000.0) << " ms)";
-
-    // Get the length of the periodic interval separating successive processing passes by
-    // the audio engine on the data in the endpoint buffer.
-    //
-    // The period between processing passes by the audio engine is fixed for a particular
-    // audio endpoint device and represents the smallest processing quantum for the audio engine.
-    // This period plus the stream latency between the buffer and endpoint device represents
-    // the minimum possible latency that an audio application can achieve.
-    // Typical value: 100000 <=> 0.01 sec = 10ms.
-    //
-    REFERENCE_TIME devPeriod = 0;
-    REFERENCE_TIME devPeriodMin = 0;
-    _ptrClientOut->GetDevicePeriod(&devPeriod, &devPeriodMin);
-    LOG(LS_VERBOSE) << "[REND] device period        : " << (DWORD)devPeriod
-                    << " (" << (double)(devPeriod/10000.0) << " ms)";
-
-    // Derive initial rendering delay.
-    // Example: 10*(960/480) + 15 = 20 + 15 = 35ms
-    //
-    int playout_delay = 10 * (bufferLength / _playBlockSizeInFrames) +
-                        (int)((latency + devPeriod) / 10000);
-    _sndCardPlayDelay = playout_delay;
-    _writtenSamples = 0;
-    LOG(LS_VERBOSE) << "[REND] initial delay        : " << playout_delay;
-
-    double endpointBufferSizeMS = 10.0 * ((double)bufferLength / (double)_devicePlayBlockSize);
-    LOG(LS_VERBOSE) << "[REND] endpointBufferSizeMS : " << endpointBufferSizeMS;
-
-    // Before starting the stream, fill the rendering buffer with silence.
-    //
-    BYTE *pData = NULL;
-    hr = _ptrRenderClient->GetBuffer(bufferLength, &pData);
-    EXIT_ON_ERROR(hr);
-
-    hr = _ptrRenderClient->ReleaseBuffer(bufferLength, AUDCLNT_BUFFERFLAGS_SILENT);
-    EXIT_ON_ERROR(hr);
-
-    _writtenSamples += bufferLength;
-
-    hr = _ptrClientOut->GetService(__uuidof(IAudioClock), (void**)&clock);
-    if (FAILED(hr)) {
-      LOG(LS_WARNING)
-          << "failed to get IAudioClock interface from the IAudioClient";
-    }
-
-    // Start up the rendering audio stream.
-    hr = _ptrClientOut->Start();
-    EXIT_ON_ERROR(hr);
-
-    _UnLock();
-
-    // Set event which will ensure that the calling thread modifies the playing state to true.
-    //
-    SetEvent(_hRenderStartedEvent);
-
-    // >> ------------------ THREAD LOOP ------------------
-
-    while (keepPlaying)
-    {
-        // Wait for a render notification event or a shutdown event
-        DWORD waitResult = WaitForMultipleObjects(2, waitArray, FALSE, 500);
-        switch (waitResult)
-        {
-        case WAIT_OBJECT_0 + 0:     // _hShutdownRenderEvent
-            keepPlaying = false;
-            break;
-        case WAIT_OBJECT_0 + 1:     // _hRenderSamplesReadyEvent
-            break;
-        case WAIT_TIMEOUT:          // timeout notification
-            LOG(LS_WARNING) << "render event timed out after 0.5 seconds";
-            goto Exit;
-        default:                    // unexpected error
-            LOG(LS_WARNING) << "unknown wait termination on render side";
-            goto Exit;
-        }
-
-        while (keepPlaying)
-        {
-            _Lock();
-
-            // Sanity check to ensure that essential states are not modified
-            // during the unlocked period.
-            if (_ptrRenderClient == NULL || _ptrClientOut == NULL)
-            {
-                _UnLock();
-                LOG(LS_ERROR)
-                    << "output state has been modified during unlocked period";
-                goto Exit;
-            }
-
-            // Get the number of frames of padding (queued up to play) in the endpoint buffer.
-            UINT32 padding = 0;
-            hr = _ptrClientOut->GetCurrentPadding(&padding);
-            EXIT_ON_ERROR(hr);
-
-            // Derive the amount of available space in the output buffer
-            uint32_t framesAvailable = bufferLength - padding;
-
-            // Do we have 10 ms available in the render buffer?
-            if (framesAvailable < _playBlockSizeInFrames) {
-              // Not enough space in render buffer to store next render packet.
-              _UnLock();
-              break;
-            }
-
-            // Write n*10ms buffers to the render buffer
-            const uint32_t n10msBuffers =
-                (framesAvailable / _playBlockSizeInFrames);
-            for (uint32_t n = 0; n < n10msBuffers; n++)
-            {
-                // Get pointer (i.e., grab the buffer) to next space in the shared render buffer.
-                hr =
-                    _ptrRenderClient->GetBuffer(_playBlockSizeInFrames, &pData);
-                EXIT_ON_ERROR(hr);
-
-                if (_ptrAudioBuffer)
-                {
-                  // Request data to be played out (#bytes =
-                  // _playBlockSizeInFrames*_audioFrameSize)
-                  _UnLock();
-                  int32_t nSamples = _ptrAudioBuffer->RequestPlayoutData(
-                      _playBlockSizeInFrames);
-                  _Lock();
-
-                  if (nSamples == -1) {
-                    _UnLock();
-                    LOG(LS_ERROR) << "failed to read data from render client";
-                    goto Exit;
-                    }
-
-                    // Sanity check to ensure that essential states are not modified during the unlocked period
-                    if (_ptrRenderClient == NULL || _ptrClientOut == NULL)
-                    {
-                        _UnLock();
-                        LOG(LS_ERROR)
-                            << "output state has been modified during unlocked"
-                            << " period";
-                        goto Exit;
-                    }
-                    if (nSamples !=
-                        static_cast<int32_t>(_playBlockSizeInSamples)) {
-                      LOG(LS_WARNING)
-                          << "nSamples(" << nSamples
-                          << ") != _playBlockSizeInSamples("
-                          << _playBlockSizeInSamples << ")";
-                    }
-
-                    // Get the actual (stored) data
-                    nSamples = _ptrAudioBuffer->GetPlayoutData((int8_t*)pData);
-                }
-
-                DWORD dwFlags(0);
-                hr = _ptrRenderClient->ReleaseBuffer(_playBlockSizeInFrames,
-                                                     dwFlags);
-                // See http://msdn.microsoft.com/en-us/library/dd316605(VS.85).aspx
-                // for more details regarding AUDCLNT_E_DEVICE_INVALIDATED.
-                EXIT_ON_ERROR(hr);
-
-                _writtenSamples += _playBlockSizeInFrames;
-            }
-
-            // Check the current delay on the playout side.
-            if (clock) {
-              UINT64 pos = 0;
-              UINT64 freq = 1;
-              clock->GetPosition(&pos, NULL);
-              clock->GetFrequency(&freq);
-              playout_delay = ROUND((double(_writtenSamples) /
-                  _devicePlaySampleRate - double(pos) / freq) * 1000.0);
-              _sndCardPlayDelay = playout_delay;
-            }
-
-            _UnLock();
-        }
-    }
-
-    // ------------------ THREAD LOOP ------------------ <<
-
-    SleepMs(static_cast<DWORD>(endpointBufferSizeMS+0.5));
-    hr = _ptrClientOut->Stop();
-
-Exit:
-    SAFE_RELEASE(clock);
-
-    if (FAILED(hr))
-    {
-        _ptrClientOut->Stop();
-        _UnLock();
-        _TraceCOMError(hr);
-    }
-
-    if (_winSupportAvrt)
-    {
-        if (NULL != hMmTask)
-        {
-            _PAvRevertMmThreadCharacteristics(hMmTask);
-        }
-    }
-
-    _Lock();
-
-    if (keepPlaying)
-    {
-        if (_ptrClientOut != NULL)
-        {
-            hr = _ptrClientOut->Stop();
-            if (FAILED(hr))
-            {
-                _TraceCOMError(hr);
-            }
-            hr = _ptrClientOut->Reset();
-            if (FAILED(hr))
-            {
-                _TraceCOMError(hr);
-            }
-        }
-        // Trigger callback from module process thread
-        _playError = 1;
-        LOG(LS_ERROR)
-            << "kPlayoutError message posted: rendering thread has ended"
-            << " pre-maturely";
-    }
-    else
-    {
-        LOG(LS_VERBOSE) << "_Rendering thread is now terminated properly";
-    }
-
-    _UnLock();
-
-    return (DWORD)hr;
-}
-
-DWORD AudioDeviceWindowsCore::InitCaptureThreadPriority()
-{
-    _hMmTask = NULL;
-
-    rtc::SetCurrentThreadName("webrtc_core_audio_capture_thread");
-
-    // Use Multimedia Class Scheduler Service (MMCSS) to boost the thread
-    // priority.
-    if (_winSupportAvrt)
-    {
-        DWORD taskIndex(0);
-        _hMmTask = _PAvSetMmThreadCharacteristicsA("Pro Audio", &taskIndex);
-        if (_hMmTask)
-        {
-            if (!_PAvSetMmThreadPriority(_hMmTask, AVRT_PRIORITY_CRITICAL))
-            {
-                LOG(LS_WARNING) << "failed to boost rec-thread using MMCSS";
-            }
-            LOG(LS_VERBOSE)
-                << "capture thread is now registered with MMCSS (taskIndex="
-                << taskIndex << ")";
-        }
-        else
-        {
-            LOG(LS_WARNING) << "failed to enable MMCSS on capture thread (err="
-                            << GetLastError() << ")";
-            _TraceCOMError(GetLastError());
-        }
-    }
-
-    return S_OK;
-}
-
-void AudioDeviceWindowsCore::RevertCaptureThreadPriority()
-{
-    if (_winSupportAvrt)
-    {
-        if (NULL != _hMmTask)
-        {
-            _PAvRevertMmThreadCharacteristics(_hMmTask);
-        }
-    }
-
-    _hMmTask = NULL;
-}
-
-DWORD AudioDeviceWindowsCore::DoCaptureThreadPollDMO()
-{
-    assert(_mediaBuffer != NULL);
-    bool keepRecording = true;
-
-    // Initialize COM as MTA in this thread.
-    ScopedCOMInitializer comInit(ScopedCOMInitializer::kMTA);
-    if (!comInit.succeeded()) {
-      LOG(LS_ERROR) << "failed to initialize COM in polling DMO thread";
-      return 1;
-    }
-
-    HRESULT hr = InitCaptureThreadPriority();
-    if (FAILED(hr))
-    {
-        return hr;
-    }
-
-    // Set event which will ensure that the calling thread modifies the
-    // recording state to true.
-    SetEvent(_hCaptureStartedEvent);
-
-    // >> ---------------------------- THREAD LOOP ----------------------------
-    while (keepRecording)
-    {
-        // Poll the DMO every 5 ms.
-        // (The same interval used in the Wave implementation.)
-        DWORD waitResult = WaitForSingleObject(_hShutdownCaptureEvent, 5);
-        switch (waitResult)
-        {
-        case WAIT_OBJECT_0:         // _hShutdownCaptureEvent
-            keepRecording = false;
-            break;
-        case WAIT_TIMEOUT:          // timeout notification
-            break;
-        default:                    // unexpected error
-            LOG(LS_WARNING) << "Unknown wait termination on capture side";
-            hr = -1; // To signal an error callback.
-            keepRecording = false;
-            break;
-        }
-
-        while (keepRecording)
-        {
-            rtc::CritScope critScoped(&_critSect);
-
-            DWORD dwStatus = 0;
-            {
-                DMO_OUTPUT_DATA_BUFFER dmoBuffer = {0};
-                dmoBuffer.pBuffer = _mediaBuffer;
-                dmoBuffer.pBuffer->AddRef();
-
-                // Poll the DMO for AEC processed capture data. The DMO will
-                // copy available data to |dmoBuffer|, and should only return
-                // 10 ms frames. The value of |dwStatus| should be ignored.
-                hr = _dmo->ProcessOutput(0, 1, &dmoBuffer, &dwStatus);
-                SAFE_RELEASE(dmoBuffer.pBuffer);
-                dwStatus = dmoBuffer.dwStatus;
-            }
-            if (FAILED(hr))
-            {
-                _TraceCOMError(hr);
-                keepRecording = false;
-                assert(false);
-                break;
-            }
-
-            ULONG bytesProduced = 0;
-            BYTE* data;
-            // Get a pointer to the data buffer. This should be valid until
-            // the next call to ProcessOutput.
-            hr = _mediaBuffer->GetBufferAndLength(&data, &bytesProduced);
-            if (FAILED(hr))
-            {
-                _TraceCOMError(hr);
-                keepRecording = false;
-                assert(false);
-                break;
-            }
-
-            // TODO(andrew): handle AGC.
-
-            if (bytesProduced > 0)
-            {
-                const int kSamplesProduced = bytesProduced / _recAudioFrameSize;
-                // TODO(andrew): verify that this is always satisfied. It might
-                // be that ProcessOutput will try to return more than 10 ms if
-                // we fail to call it frequently enough.
-                assert(kSamplesProduced == static_cast<int>(_recBlockSize));
-                assert(sizeof(BYTE) == sizeof(int8_t));
-                _ptrAudioBuffer->SetRecordedBuffer(
-                    reinterpret_cast<int8_t*>(data),
-                    kSamplesProduced);
-                _ptrAudioBuffer->SetVQEData(0, 0, 0);
-
-                _UnLock();  // Release lock while making the callback.
-                _ptrAudioBuffer->DeliverRecordedData();
-                _Lock();
-            }
-
-            // Reset length to indicate buffer availability.
-            hr = _mediaBuffer->SetLength(0);
-            if (FAILED(hr))
-            {
-                _TraceCOMError(hr);
-                keepRecording = false;
-                assert(false);
-                break;
-            }
-
-            if (!(dwStatus & DMO_OUTPUT_DATA_BUFFERF_INCOMPLETE))
-            {
-                // The DMO cannot currently produce more data. This is the
-                // normal case; otherwise it means the DMO had more than 10 ms
-                // of data available and ProcessOutput should be called again.
-                break;
-            }
-        }
-    }
-    // ---------------------------- THREAD LOOP ---------------------------- <<
-
-    RevertCaptureThreadPriority();
-
-    if (FAILED(hr))
-    {
-        // Trigger callback from module process thread
-        _recError = 1;
-        LOG(LS_ERROR) << "kRecordingError message posted: capturing thread has"
-                      << " ended prematurely";
-    }
-    else
-    {
-        LOG(LS_VERBOSE) << "Capturing thread is now terminated properly";
-    }
-
-    return hr;
-}
-
-
-// ----------------------------------------------------------------------------
-//  DoCaptureThread
-// ----------------------------------------------------------------------------
-
-DWORD AudioDeviceWindowsCore::DoCaptureThread()
-{
-
-    bool keepRecording = true;
-    HANDLE waitArray[2] = {_hShutdownCaptureEvent, _hCaptureSamplesReadyEvent};
-    HRESULT hr = S_OK;
-
-    LARGE_INTEGER t1;
-
-    BYTE* syncBuffer = NULL;
-    UINT32 syncBufIndex = 0;
-
-    _readSamples = 0;
-
-    // Initialize COM as MTA in this thread.
-    ScopedCOMInitializer comInit(ScopedCOMInitializer::kMTA);
-    if (!comInit.succeeded()) {
-      LOG(LS_ERROR) << "failed to initialize COM in capture thread";
-      return 1;
-    }
-
-    hr = InitCaptureThreadPriority();
-    if (FAILED(hr))
-    {
-        return hr;
-    }
-
-    _Lock();
-
-    // Get size of capturing buffer (length is expressed as the number of audio frames the buffer can hold).
-    // This value is fixed during the capturing session.
-    //
-    UINT32 bufferLength = 0;
-    if (_ptrClientIn == NULL)
-    {
-      LOG(LS_ERROR)
-          << "input state has been modified before capture loop starts.";
-      return 1;
-    }
-    hr = _ptrClientIn->GetBufferSize(&bufferLength);
-    EXIT_ON_ERROR(hr);
-    LOG(LS_VERBOSE) << "[CAPT] size of buffer       : " << bufferLength;
-
-    // Allocate memory for sync buffer.
-    // It is used for compensation between native 44.1 and internal 44.0 and
-    // for cases when the capture buffer is larger than 10ms.
-    //
-    const UINT32 syncBufferSize = 2*(bufferLength * _recAudioFrameSize);
-    syncBuffer = new BYTE[syncBufferSize];
-    if (syncBuffer == NULL)
-    {
-        return (DWORD)E_POINTER;
-    }
-    LOG(LS_VERBOSE) << "[CAPT] size of sync buffer  : " << syncBufferSize
-                    << " [bytes]";
-
-    // Get maximum latency for the current stream (will not change for the lifetime of the IAudioClient object).
-    //
-    REFERENCE_TIME latency;
-    _ptrClientIn->GetStreamLatency(&latency);
-    LOG(LS_VERBOSE) << "[CAPT] max stream latency   : " << (DWORD)latency
-                    << " (" << (double)(latency / 10000.0) << " ms)";
-
-    // Get the length of the periodic interval separating successive processing passes by
-    // the audio engine on the data in the endpoint buffer.
-    //
-    REFERENCE_TIME devPeriod = 0;
-    REFERENCE_TIME devPeriodMin = 0;
-    _ptrClientIn->GetDevicePeriod(&devPeriod, &devPeriodMin);
-    LOG(LS_VERBOSE) << "[CAPT] device period        : " << (DWORD)devPeriod
-                    << " (" << (double)(devPeriod / 10000.0) << " ms)";
-
-    double extraDelayMS = (double)((latency + devPeriod) / 10000.0);
-    LOG(LS_VERBOSE) << "[CAPT] extraDelayMS         : " << extraDelayMS;
-
-    double endpointBufferSizeMS = 10.0 * ((double)bufferLength / (double)_recBlockSize);
-    LOG(LS_VERBOSE) << "[CAPT] endpointBufferSizeMS : " << endpointBufferSizeMS;
-
-    // Start up the capturing stream.
-    //
-    hr = _ptrClientIn->Start();
-    EXIT_ON_ERROR(hr);
-
-    _UnLock();
-
-    // Set event which will ensure that the calling thread modifies the recording state to true.
-    //
-    SetEvent(_hCaptureStartedEvent);
-
-    // >> ---------------------------- THREAD LOOP ----------------------------
-
-    while (keepRecording)
-    {
-        // Wait for a capture notification event or a shutdown event
-        DWORD waitResult = WaitForMultipleObjects(2, waitArray, FALSE, 500);
-        switch (waitResult)
-        {
-        case WAIT_OBJECT_0 + 0:        // _hShutdownCaptureEvent
-            keepRecording = false;
-            break;
-        case WAIT_OBJECT_0 + 1:        // _hCaptureSamplesReadyEvent
-            break;
-        case WAIT_TIMEOUT:            // timeout notification
-            LOG(LS_WARNING) << "capture event timed out after 0.5 seconds";
-            goto Exit;
-        default:                    // unexpected error
-            LOG(LS_WARNING) << "unknown wait termination on capture side";
-            goto Exit;
-        }
-
-        while (keepRecording)
-        {
-            BYTE *pData = 0;
-            UINT32 framesAvailable = 0;
-            DWORD flags = 0;
-            UINT64 recTime = 0;
-            UINT64 recPos = 0;
-
-            _Lock();
-
-            // Sanity check to ensure that essential states are not modified
-            // during the unlocked period.
-            if (_ptrCaptureClient == NULL || _ptrClientIn == NULL)
-            {
-                _UnLock();
-                LOG(LS_ERROR)
-                    << "input state has been modified during unlocked period";
-                goto Exit;
-            }
-
-            //  Find out how much capture data is available
-            //
-            hr = _ptrCaptureClient->GetBuffer(&pData,           // packet which is ready to be read by used
-                                              &framesAvailable, // #frames in the captured packet (can be zero)
-                                              &flags,           // support flags (check)
-                                              &recPos,          // device position of first audio frame in data packet
-                                              &recTime);        // value of performance counter at the time of recording the first audio frame
-
-            if (SUCCEEDED(hr))
-            {
-                if (AUDCLNT_S_BUFFER_EMPTY == hr)
-                {
-                    // Buffer was empty => start waiting for a new capture notification event
-                    _UnLock();
-                    break;
-                }
-
-                if (flags & AUDCLNT_BUFFERFLAGS_SILENT)
-                {
-                    // Treat all of the data in the packet as silence and ignore the actual data values.
-                    LOG(LS_WARNING) << "AUDCLNT_BUFFERFLAGS_SILENT";
-                    pData = NULL;
-                }
-
-                assert(framesAvailable != 0);
-
-                if (pData)
-                {
-                    CopyMemory(&syncBuffer[syncBufIndex*_recAudioFrameSize], pData, framesAvailable*_recAudioFrameSize);
-                }
-                else
-                {
-                    ZeroMemory(&syncBuffer[syncBufIndex*_recAudioFrameSize], framesAvailable*_recAudioFrameSize);
-                }
-                assert(syncBufferSize >= (syncBufIndex*_recAudioFrameSize)+framesAvailable*_recAudioFrameSize);
-
-                // Release the capture buffer
-                //
-                hr = _ptrCaptureClient->ReleaseBuffer(framesAvailable);
-                EXIT_ON_ERROR(hr);
-
-                _readSamples += framesAvailable;
-                syncBufIndex += framesAvailable;
-
-                QueryPerformanceCounter(&t1);
-
-                // Get the current recording and playout delay.
-                uint32_t sndCardRecDelay = (uint32_t)
-                    (((((UINT64)t1.QuadPart * _perfCounterFactor) - recTime)
-                        / 10000) + (10*syncBufIndex) / _recBlockSize - 10);
-                uint32_t sndCardPlayDelay =
-                    static_cast<uint32_t>(_sndCardPlayDelay);
-
-                _sndCardRecDelay = sndCardRecDelay;
-
-                while (syncBufIndex >= _recBlockSize)
-                {
-                    if (_ptrAudioBuffer)
-                    {
-                        _ptrAudioBuffer->SetRecordedBuffer((const int8_t*)syncBuffer, _recBlockSize);
-                        _ptrAudioBuffer->SetVQEData(sndCardPlayDelay,
-                                                    sndCardRecDelay,
-                                                    0);
-
-                        _ptrAudioBuffer->SetTypingStatus(KeyPressed());
-
-                        _UnLock();  // release lock while making the callback
-                        _ptrAudioBuffer->DeliverRecordedData();
-                        _Lock();    // restore the lock
-
-                        // Sanity check to ensure that essential states are not modified during the unlocked period
-                        if (_ptrCaptureClient == NULL || _ptrClientIn == NULL)
-                        {
-                            _UnLock();
-                            LOG(LS_ERROR)
-                                << "input state has been modified during"
-                                << " unlocked period";
-                            goto Exit;
-                        }
-                    }
-
-                    // store remaining data which was not able to deliver as 10ms segment
-                    MoveMemory(&syncBuffer[0], &syncBuffer[_recBlockSize*_recAudioFrameSize], (syncBufIndex-_recBlockSize)*_recAudioFrameSize);
-                    syncBufIndex -= _recBlockSize;
-                    sndCardRecDelay -= 10;
-                }
-
-                if (_AGC)
-                {
-                    uint32_t newMicLevel = _ptrAudioBuffer->NewMicLevel();
-                    if (newMicLevel != 0)
-                    {
-                        // The VQE will only deliver non-zero microphone levels when a change is needed.
-                        // Set this new mic level (received from the observer as return value in the callback).
-                        LOG(LS_VERBOSE) << "AGC change of volume: new="
-                                        << newMicLevel;
-                        // We store this outside of the audio buffer to avoid
-                        // having it overwritten by the getter thread.
-                        _newMicLevel = newMicLevel;
-                        SetEvent(_hSetCaptureVolumeEvent);
-                    }
-                }
-            }
-            else
-            {
-                // If GetBuffer returns AUDCLNT_E_BUFFER_ERROR, the thread consuming the audio samples
-                // must wait for the next processing pass. The client might benefit from keeping a count
-                // of the failed GetBuffer calls. If GetBuffer returns this error repeatedly, the client
-                // can start a new processing loop after shutting down the current client by calling
-                // IAudioClient::Stop, IAudioClient::Reset, and releasing the audio client.
-                LOG(LS_ERROR) << "IAudioCaptureClient::GetBuffer returned"
-                              << " AUDCLNT_E_BUFFER_ERROR, hr = 0x"
-                              << std::hex << hr << std::dec;
-                goto Exit;
-            }
-
-            _UnLock();
-        }
-    }
-
-    // ---------------------------- THREAD LOOP ---------------------------- <<
-
-    if (_ptrClientIn)
-    {
-        hr = _ptrClientIn->Stop();
-    }
-
-Exit:
-    if (FAILED(hr))
-    {
-        _ptrClientIn->Stop();
-        _UnLock();
-        _TraceCOMError(hr);
-    }
-
-    RevertCaptureThreadPriority();
-
-    _Lock();
-
-    if (keepRecording)
-    {
-        if (_ptrClientIn != NULL)
-        {
-            hr = _ptrClientIn->Stop();
-            if (FAILED(hr))
-            {
-                _TraceCOMError(hr);
-            }
-            hr = _ptrClientIn->Reset();
-            if (FAILED(hr))
-            {
-                _TraceCOMError(hr);
-            }
-        }
-
-        // Trigger callback from module process thread
-        _recError = 1;
-        LOG(LS_ERROR)
-            << "kRecordingError message posted: capturing thread has ended"
-            << " pre-maturely";
-    }
-    else
-    {
-        LOG(LS_VERBOSE) << "_Capturing thread is now terminated properly";
-    }
-
-    SAFE_RELEASE(_ptrClientIn);
-    SAFE_RELEASE(_ptrCaptureClient);
-
-    _UnLock();
-
-    if (syncBuffer)
-    {
-        delete [] syncBuffer;
-    }
-
-    return (DWORD)hr;
-}
-
-int32_t AudioDeviceWindowsCore::EnableBuiltInAEC(bool enable)
-{
-
-    if (_recIsInitialized)
-    {
-        LOG(LS_ERROR)
-            << "Attempt to set Windows AEC with recording already initialized";
-        return -1;
-    }
-
-    if (_dmo == NULL)
-    {
-        LOG(LS_ERROR)
-            << "Built-in AEC DMO was not initialized properly at create time";
-        return -1;
-    }
-
-    _builtInAecEnabled = enable;
-    return 0;
-}
-
-int AudioDeviceWindowsCore::SetDMOProperties()
-{
-    HRESULT hr = S_OK;
-    assert(_dmo != NULL);
-
-    rtc::scoped_refptr<IPropertyStore> ps;
-    {
-        IPropertyStore* ptrPS = NULL;
-        hr = _dmo->QueryInterface(IID_IPropertyStore,
-                                  reinterpret_cast<void**>(&ptrPS));
-        if (FAILED(hr) || ptrPS == NULL)
-        {
-            _TraceCOMError(hr);
-            return -1;
-        }
-        ps = ptrPS;
-        SAFE_RELEASE(ptrPS);
-    }
-
-    // Set the AEC system mode.
-    // SINGLE_CHANNEL_AEC - AEC processing only.
-    if (SetVtI4Property(ps,
-                        MFPKEY_WMAAECMA_SYSTEM_MODE,
-                        SINGLE_CHANNEL_AEC))
-    {
-        return -1;
-    }
-
-    // Set the AEC source mode.
-    // VARIANT_TRUE - Source mode (we poll the AEC for captured data).
-    if (SetBoolProperty(ps,
-                        MFPKEY_WMAAECMA_DMO_SOURCE_MODE,
-                        VARIANT_TRUE) == -1)
-    {
-        return -1;
-    }
-
-    // Enable the feature mode.
-    // This lets us override all the default processing settings below.
-    if (SetBoolProperty(ps,
-                        MFPKEY_WMAAECMA_FEATURE_MODE,
-                        VARIANT_TRUE) == -1)
-    {
-        return -1;
-    }
-
-    // Disable analog AGC (default enabled).
-    if (SetBoolProperty(ps,
-                        MFPKEY_WMAAECMA_MIC_GAIN_BOUNDER,
-                        VARIANT_FALSE) == -1)
-    {
-        return -1;
-    }
-
-    // Disable noise suppression (default enabled).
-    // 0 - Disabled, 1 - Enabled
-    if (SetVtI4Property(ps,
-                        MFPKEY_WMAAECMA_FEATR_NS,
-                        0) == -1)
-    {
-        return -1;
-    }
-
-    // Relevant parameters to leave at default settings:
-    // MFPKEY_WMAAECMA_FEATR_AGC - Digital AGC (disabled).
-    // MFPKEY_WMAAECMA_FEATR_CENTER_CLIP - AEC center clipping (enabled).
-    // MFPKEY_WMAAECMA_FEATR_ECHO_LENGTH - Filter length (256 ms).
-    //   TODO(andrew): investigate decresing the length to 128 ms.
-    // MFPKEY_WMAAECMA_FEATR_FRAME_SIZE - Frame size (0).
-    //   0 is automatic; defaults to 160 samples (or 10 ms frames at the
-    //   selected 16 kHz) as long as mic array processing is disabled.
-    // MFPKEY_WMAAECMA_FEATR_NOISE_FILL - Comfort noise (enabled).
-    // MFPKEY_WMAAECMA_FEATR_VAD - VAD (disabled).
-
-    // Set the devices selected by VoE. If using a default device, we need to
-    // search for the device index.
-    int inDevIndex = _inputDeviceIndex;
-    int outDevIndex = _outputDeviceIndex;
-    if (!_usingInputDeviceIndex)
-    {
-        ERole role = eCommunications;
-        if (_inputDevice == AudioDeviceModule::kDefaultDevice)
-        {
-            role = eConsole;
-        }
-
-        if (_GetDefaultDeviceIndex(eCapture, role, &inDevIndex) == -1)
-        {
-            return -1;
-        }
-    }
-
-    if (!_usingOutputDeviceIndex)
-    {
-        ERole role = eCommunications;
-        if (_outputDevice == AudioDeviceModule::kDefaultDevice)
-        {
-            role = eConsole;
-        }
-
-        if (_GetDefaultDeviceIndex(eRender, role, &outDevIndex) == -1)
-        {
-            return -1;
-        }
-    }
-
-    DWORD devIndex = static_cast<uint32_t>(outDevIndex << 16) +
-                     static_cast<uint32_t>(0x0000ffff & inDevIndex);
-    LOG(LS_VERBOSE) << "Capture device index: " << inDevIndex
-                    << ", render device index: " << outDevIndex;
-    if (SetVtI4Property(ps,
-                        MFPKEY_WMAAECMA_DEVICE_INDEXES,
-                        devIndex) == -1)
-    {
-        return -1;
-    }
-
-    return 0;
-}
-
-int AudioDeviceWindowsCore::SetBoolProperty(IPropertyStore* ptrPS,
-                                            REFPROPERTYKEY key,
-                                            VARIANT_BOOL value)
-{
-    PROPVARIANT pv;
-    PropVariantInit(&pv);
-    pv.vt = VT_BOOL;
-    pv.boolVal = value;
-    HRESULT hr = ptrPS->SetValue(key, pv);
-    PropVariantClear(&pv);
-    if (FAILED(hr))
-    {
-        _TraceCOMError(hr);
-        return -1;
-    }
-    return 0;
-}
-
-int AudioDeviceWindowsCore::SetVtI4Property(IPropertyStore* ptrPS,
-                                            REFPROPERTYKEY key,
-                                            LONG value)
-{
-    PROPVARIANT pv;
-    PropVariantInit(&pv);
-    pv.vt = VT_I4;
-    pv.lVal = value;
-    HRESULT hr = ptrPS->SetValue(key, pv);
-    PropVariantClear(&pv);
-    if (FAILED(hr))
-    {
-        _TraceCOMError(hr);
-        return -1;
-    }
-    return 0;
-}
-
-// ----------------------------------------------------------------------------
-//  _RefreshDeviceList
-//
-//  Creates a new list of endpoint rendering or capture devices after
-//  deleting any previously created (and possibly out-of-date) list of
-//  such devices.
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceWindowsCore::_RefreshDeviceList(EDataFlow dir)
-{
-    LOG(LS_VERBOSE) << __FUNCTION__;
-
-    HRESULT hr = S_OK;
-    IMMDeviceCollection *pCollection = NULL;
-
-    assert(dir == eRender || dir == eCapture);
-    assert(_ptrEnumerator != NULL);
-
-    // Create a fresh list of devices using the specified direction
-    hr = _ptrEnumerator->EnumAudioEndpoints(
-                           dir,
-                           DEVICE_STATE_ACTIVE,
-                           &pCollection);
-    if (FAILED(hr))
-    {
-        _TraceCOMError(hr);
-        SAFE_RELEASE(pCollection);
-        return -1;
-    }
-
-    if (dir == eRender)
-    {
-        SAFE_RELEASE(_ptrRenderCollection);
-        _ptrRenderCollection = pCollection;
-    }
-    else
-    {
-        SAFE_RELEASE(_ptrCaptureCollection);
-        _ptrCaptureCollection = pCollection;
-    }
-
-    return 0;
-}
-
-// ----------------------------------------------------------------------------
-//  _DeviceListCount
-//
-//  Gets a count of the endpoint rendering or capture devices in the
-//  current list of such devices.
-// ----------------------------------------------------------------------------
-
-int16_t AudioDeviceWindowsCore::_DeviceListCount(EDataFlow dir)
-{
-    LOG(LS_VERBOSE) << __FUNCTION__;
-
-    HRESULT hr = S_OK;
-    UINT count = 0;
-
-    assert(eRender == dir || eCapture == dir);
-
-    if (eRender == dir && NULL != _ptrRenderCollection)
-    {
-        hr = _ptrRenderCollection->GetCount(&count);
-    }
-    else if (NULL != _ptrCaptureCollection)
-    {
-        hr = _ptrCaptureCollection->GetCount(&count);
-    }
-
-    if (FAILED(hr))
-    {
-        _TraceCOMError(hr);
-        return -1;
-    }
-
-    return static_cast<int16_t> (count);
-}
-
-// ----------------------------------------------------------------------------
-//  _GetListDeviceName
-//
-//  Gets the friendly name of an endpoint rendering or capture device
-//  from the current list of such devices. The caller uses an index
-//  into the list to identify the device.
-//
-//  Uses: _ptrRenderCollection or _ptrCaptureCollection which is updated
-//  in _RefreshDeviceList().
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceWindowsCore::_GetListDeviceName(EDataFlow dir, int index, LPWSTR szBuffer, int bufferLen)
-{
-    LOG(LS_VERBOSE) << __FUNCTION__;
-
-    HRESULT hr = S_OK;
-    IMMDevice *pDevice = NULL;
-
-    assert(dir == eRender || dir == eCapture);
-
-    if (eRender == dir && NULL != _ptrRenderCollection)
-    {
-        hr = _ptrRenderCollection->Item(index, &pDevice);
-    }
-    else if (NULL != _ptrCaptureCollection)
-    {
-        hr = _ptrCaptureCollection->Item(index, &pDevice);
-    }
-
-    if (FAILED(hr))
-    {
-        _TraceCOMError(hr);
-        SAFE_RELEASE(pDevice);
-        return -1;
-    }
-
-    int32_t res = _GetDeviceName(pDevice, szBuffer, bufferLen);
-    SAFE_RELEASE(pDevice);
-    return res;
-}
-
-// ----------------------------------------------------------------------------
-//  _GetDefaultDeviceName
-//
-//  Gets the friendly name of an endpoint rendering or capture device
-//  given a specified device role.
-//
-//  Uses: _ptrEnumerator
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceWindowsCore::_GetDefaultDeviceName(EDataFlow dir, ERole role, LPWSTR szBuffer, int bufferLen)
-{
-    LOG(LS_VERBOSE) << __FUNCTION__;
-
-    HRESULT hr = S_OK;
-    IMMDevice *pDevice = NULL;
-
-    assert(dir == eRender || dir == eCapture);
-    assert(role == eConsole || role == eCommunications);
-    assert(_ptrEnumerator != NULL);
-
-    hr = _ptrEnumerator->GetDefaultAudioEndpoint(
-                           dir,
-                           role,
-                           &pDevice);
-
-    if (FAILED(hr))
-    {
-        _TraceCOMError(hr);
-        SAFE_RELEASE(pDevice);
-        return -1;
-    }
-
-    int32_t res = _GetDeviceName(pDevice, szBuffer, bufferLen);
-    SAFE_RELEASE(pDevice);
-    return res;
-}
-
-// ----------------------------------------------------------------------------
-//  _GetListDeviceID
-//
-//  Gets the unique ID string of an endpoint rendering or capture device
-//  from the current list of such devices. The caller uses an index
-//  into the list to identify the device.
-//
-//  Uses: _ptrRenderCollection or _ptrCaptureCollection which is updated
-//  in _RefreshDeviceList().
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceWindowsCore::_GetListDeviceID(EDataFlow dir, int index, LPWSTR szBuffer, int bufferLen)
-{
-    LOG(LS_VERBOSE) << __FUNCTION__;
-
-    HRESULT hr = S_OK;
-    IMMDevice *pDevice = NULL;
-
-    assert(dir == eRender || dir == eCapture);
-
-    if (eRender == dir && NULL != _ptrRenderCollection)
-    {
-        hr = _ptrRenderCollection->Item(index, &pDevice);
-    }
-    else if (NULL != _ptrCaptureCollection)
-    {
-        hr = _ptrCaptureCollection->Item(index, &pDevice);
-    }
-
-    if (FAILED(hr))
-    {
-        _TraceCOMError(hr);
-        SAFE_RELEASE(pDevice);
-        return -1;
-    }
-
-    int32_t res = _GetDeviceID(pDevice, szBuffer, bufferLen);
-    SAFE_RELEASE(pDevice);
-    return res;
-}
-
-// ----------------------------------------------------------------------------
-//  _GetDefaultDeviceID
-//
-//  Gets the uniqe device ID of an endpoint rendering or capture device
-//  given a specified device role.
-//
-//  Uses: _ptrEnumerator
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceWindowsCore::_GetDefaultDeviceID(EDataFlow dir, ERole role, LPWSTR szBuffer, int bufferLen)
-{
-    LOG(LS_VERBOSE) << __FUNCTION__;
-
-    HRESULT hr = S_OK;
-    IMMDevice *pDevice = NULL;
-
-    assert(dir == eRender || dir == eCapture);
-    assert(role == eConsole || role == eCommunications);
-    assert(_ptrEnumerator != NULL);
-
-    hr = _ptrEnumerator->GetDefaultAudioEndpoint(
-                           dir,
-                           role,
-                           &pDevice);
-
-    if (FAILED(hr))
-    {
-        _TraceCOMError(hr);
-        SAFE_RELEASE(pDevice);
-        return -1;
-    }
-
-    int32_t res = _GetDeviceID(pDevice, szBuffer, bufferLen);
-    SAFE_RELEASE(pDevice);
-    return res;
-}
-
-int32_t AudioDeviceWindowsCore::_GetDefaultDeviceIndex(EDataFlow dir,
-                                                       ERole role,
-                                                       int* index)
-{
-    LOG(LS_VERBOSE) << __FUNCTION__;
-
-    HRESULT hr = S_OK;
-    WCHAR szDefaultDeviceID[MAX_PATH] = {0};
-    WCHAR szDeviceID[MAX_PATH] = {0};
-
-    const size_t kDeviceIDLength = sizeof(szDeviceID)/sizeof(szDeviceID[0]);
-    assert(kDeviceIDLength ==
-        sizeof(szDefaultDeviceID) / sizeof(szDefaultDeviceID[0]));
-
-    if (_GetDefaultDeviceID(dir,
-                            role,
-                            szDefaultDeviceID,
-                            kDeviceIDLength) == -1)
-    {
-        return -1;
-    }
-
-    IMMDeviceCollection* collection = _ptrCaptureCollection;
-    if (dir == eRender)
-    {
-        collection = _ptrRenderCollection;
-    }
-
-    if (!collection)
-    {
-        LOG(LS_ERROR) << "Device collection not valid";
-        return -1;
-    }
-
-    UINT count = 0;
-    hr = collection->GetCount(&count);
-    if (FAILED(hr))
-    {
-        _TraceCOMError(hr);
-        return -1;
-    }
-
-    *index = -1;
-    for (UINT i = 0; i < count; i++)
-    {
-        memset(szDeviceID, 0, sizeof(szDeviceID));
-        rtc::scoped_refptr<IMMDevice> device;
-        {
-            IMMDevice* ptrDevice = NULL;
-            hr = collection->Item(i, &ptrDevice);
-            if (FAILED(hr) || ptrDevice == NULL)
-            {
-                _TraceCOMError(hr);
-                return -1;
-            }
-            device = ptrDevice;
-            SAFE_RELEASE(ptrDevice);
-        }
-
-        if (_GetDeviceID(device, szDeviceID, kDeviceIDLength) == -1)
-        {
-           return -1;
-        }
-
-        if (wcsncmp(szDefaultDeviceID, szDeviceID, kDeviceIDLength) == 0)
-        {
-            // Found a match.
-            *index = i;
-            break;
-        }
-
-    }
-
-    if (*index == -1)
-    {
-        LOG(LS_ERROR) << "Unable to find collection index for default device";
-        return -1;
-    }
-
-    return 0;
-}
-
-// ----------------------------------------------------------------------------
-//  _GetDeviceName
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceWindowsCore::_GetDeviceName(IMMDevice* pDevice,
-                                               LPWSTR pszBuffer,
-                                               int bufferLen)
-{
-    LOG(LS_VERBOSE) << __FUNCTION__;
-
-    static const WCHAR szDefault[] = L"<Device not available>";
-
-    HRESULT hr = E_FAIL;
-    IPropertyStore *pProps = NULL;
-    PROPVARIANT varName;
-
-    assert(pszBuffer != NULL);
-    assert(bufferLen > 0);
-
-    if (pDevice != NULL)
-    {
-        hr = pDevice->OpenPropertyStore(STGM_READ, &pProps);
-        if (FAILED(hr))
-        {
-            LOG(LS_ERROR) << "IMMDevice::OpenPropertyStore failed, hr = 0x"
-                          << std::hex << hr << std::dec;
-        }
-    }
-
-    // Initialize container for property value.
-    PropVariantInit(&varName);
-
-    if (SUCCEEDED(hr))
-    {
-        // Get the endpoint device's friendly-name property.
-        hr = pProps->GetValue(PKEY_Device_FriendlyName, &varName);
-        if (FAILED(hr))
-        {
-            LOG(LS_ERROR) << "IPropertyStore::GetValue failed, hr = 0x"
-                          << std::hex << hr << std::dec;
-        }
-    }
-
-    if ((SUCCEEDED(hr)) && (VT_EMPTY == varName.vt))
-    {
-        hr = E_FAIL;
-            LOG(LS_ERROR) << "IPropertyStore::GetValue returned no value,"
-                          << " hr = 0x" << std::hex << hr << std::dec;
-    }
-
-    if ((SUCCEEDED(hr)) && (VT_LPWSTR != varName.vt))
-    {
-        // The returned value is not a wide null terminated string.
-        hr = E_UNEXPECTED;
-            LOG(LS_ERROR) << "IPropertyStore::GetValue returned unexpected"
-                          << " type, hr = 0x" << std::hex << hr << std::dec;
-    }
-
-    if (SUCCEEDED(hr) && (varName.pwszVal != NULL))
-    {
-        // Copy the valid device name to the provided ouput buffer.
-        wcsncpy_s(pszBuffer, bufferLen, varName.pwszVal, _TRUNCATE);
-    }
-    else
-    {
-        // Failed to find the device name.
-        wcsncpy_s(pszBuffer, bufferLen, szDefault, _TRUNCATE);
-    }
-
-    PropVariantClear(&varName);
-    SAFE_RELEASE(pProps);
-
-    return 0;
-}
-
-// ----------------------------------------------------------------------------
-//  _GetDeviceID
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceWindowsCore::_GetDeviceID(IMMDevice* pDevice, LPWSTR pszBuffer, int bufferLen)
-{
-    LOG(LS_VERBOSE) << __FUNCTION__;
-
-    static const WCHAR szDefault[] = L"<Device not available>";
-
-    HRESULT hr = E_FAIL;
-    LPWSTR pwszID = NULL;
-
-    assert(pszBuffer != NULL);
-    assert(bufferLen > 0);
-
-    if (pDevice != NULL)
-    {
-        hr = pDevice->GetId(&pwszID);
-    }
-
-    if (hr == S_OK)
-    {
-        // Found the device ID.
-        wcsncpy_s(pszBuffer, bufferLen, pwszID, _TRUNCATE);
-    }
-    else
-    {
-        // Failed to find the device ID.
-        wcsncpy_s(pszBuffer, bufferLen, szDefault, _TRUNCATE);
-    }
-
-    CoTaskMemFree(pwszID);
-    return 0;
-}
-
-// ----------------------------------------------------------------------------
-//  _GetDefaultDevice
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceWindowsCore::_GetDefaultDevice(EDataFlow dir, ERole role, IMMDevice** ppDevice)
-{
-    LOG(LS_VERBOSE) << __FUNCTION__;
-
-    HRESULT hr(S_OK);
-
-    assert(_ptrEnumerator != NULL);
-
-    hr = _ptrEnumerator->GetDefaultAudioEndpoint(
-                                   dir,
-                                   role,
-                                   ppDevice);
-    if (FAILED(hr))
-    {
-        _TraceCOMError(hr);
-        return -1;
-    }
-
-    return 0;
-}
-
-// ----------------------------------------------------------------------------
-//  _GetListDevice
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceWindowsCore::_GetListDevice(EDataFlow dir, int index, IMMDevice** ppDevice)
-{
-    HRESULT hr(S_OK);
-
-    assert(_ptrEnumerator != NULL);
-
-    IMMDeviceCollection *pCollection = NULL;
-
-    hr = _ptrEnumerator->EnumAudioEndpoints(
-                               dir,
-                               DEVICE_STATE_ACTIVE,        // only active endpoints are OK
-                               &pCollection);
-    if (FAILED(hr))
-    {
-        _TraceCOMError(hr);
-        SAFE_RELEASE(pCollection);
-        return -1;
-    }
-
-    hr = pCollection->Item(
-                        index,
-                        ppDevice);
-    if (FAILED(hr))
-    {
-        _TraceCOMError(hr);
-        SAFE_RELEASE(pCollection);
-        return -1;
-    }
-
-    return 0;
-}
-
-// ----------------------------------------------------------------------------
-//  _EnumerateEndpointDevicesAll
-// ----------------------------------------------------------------------------
-
-int32_t AudioDeviceWindowsCore::_EnumerateEndpointDevicesAll(EDataFlow dataFlow) const
-{
-    LOG(LS_VERBOSE) << __FUNCTION__;
-
-    assert(_ptrEnumerator != NULL);
-
-    HRESULT hr = S_OK;
-    IMMDeviceCollection *pCollection = NULL;
-    IMMDevice *pEndpoint = NULL;
-    IPropertyStore *pProps = NULL;
-    IAudioEndpointVolume* pEndpointVolume = NULL;
-    LPWSTR pwszID = NULL;
-
-    // Generate a collection of audio endpoint devices in the system.
-    // Get states for *all* endpoint devices.
-    // Output: IMMDeviceCollection interface.
-    hr = _ptrEnumerator->EnumAudioEndpoints(
-                                 dataFlow,            // data-flow direction (input parameter)
-                                 DEVICE_STATE_ACTIVE | DEVICE_STATE_DISABLED | DEVICE_STATE_UNPLUGGED,
-                                 &pCollection);        // release interface when done
-
-    EXIT_ON_ERROR(hr);
-
-    // use the IMMDeviceCollection interface...
-
-    UINT count = 0;
-
-    // Retrieve a count of the devices in the device collection.
-    hr = pCollection->GetCount(&count);
-    EXIT_ON_ERROR(hr);
-    if (dataFlow == eRender)
-        LOG(LS_VERBOSE) << "#rendering endpoint devices (counting all): "
-                        << count;
-    else if (dataFlow == eCapture)
-        LOG(LS_VERBOSE) << "#capturing endpoint devices (counting all): "
-                        << count;
-
-    if (count == 0)
-    {
-        return 0;
-    }
-
-    // Each loop prints the name of an endpoint device.
-    for (ULONG i = 0; i < count; i++)
-    {
-        LOG(LS_VERBOSE) << "Endpoint " << i << ":";
-
-        // Get pointer to endpoint number i.
-        // Output: IMMDevice interface.
-        hr = pCollection->Item(
-                            i,
-                            &pEndpoint);
-        CONTINUE_ON_ERROR(hr);
-
-        // use the IMMDevice interface of the specified endpoint device...
-
-        // Get the endpoint ID string (uniquely identifies the device among all audio endpoint devices)
-        hr = pEndpoint->GetId(&pwszID);
-        CONTINUE_ON_ERROR(hr);
-        LOG(LS_VERBOSE) << "ID string    : " << pwszID;
-
-        // Retrieve an interface to the device's property store.
-        // Output: IPropertyStore interface.
-        hr = pEndpoint->OpenPropertyStore(
-                          STGM_READ,
-                          &pProps);
-        CONTINUE_ON_ERROR(hr);
-
-        // use the IPropertyStore interface...
-
-        PROPVARIANT varName;
-        // Initialize container for property value.
-        PropVariantInit(&varName);
-
-        // Get the endpoint's friendly-name property.
-        // Example: "Speakers (Realtek High Definition Audio)"
-        hr = pProps->GetValue(
-                       PKEY_Device_FriendlyName,
-                       &varName);
-        CONTINUE_ON_ERROR(hr);
-        LOG(LS_VERBOSE) << "friendly name: \"" << varName.pwszVal << "\"";
-
-        // Get the endpoint's current device state
-        DWORD dwState;
-        hr = pEndpoint->GetState(&dwState);
-        CONTINUE_ON_ERROR(hr);
-        if (dwState & DEVICE_STATE_ACTIVE)
-            LOG(LS_VERBOSE) << "state (0x" << std::hex << dwState << std::dec
-                            << ")  : *ACTIVE*";
-        if (dwState & DEVICE_STATE_DISABLED)
-            LOG(LS_VERBOSE) << "state (0x" << std::hex << dwState << std::dec
-                            << ")  : DISABLED";
-        if (dwState & DEVICE_STATE_NOTPRESENT)
-            LOG(LS_VERBOSE) << "state (0x" << std::hex << dwState << std::dec
-                            << ")  : NOTPRESENT";
-        if (dwState & DEVICE_STATE_UNPLUGGED)
-            LOG(LS_VERBOSE) << "state (0x" << std::hex << dwState << std::dec
-                            << ")  : UNPLUGGED";
-
-        // Check the hardware volume capabilities.
-        DWORD dwHwSupportMask = 0;
-        hr = pEndpoint->Activate(__uuidof(IAudioEndpointVolume), CLSCTX_ALL,
-                               NULL, (void**)&pEndpointVolume);
-        CONTINUE_ON_ERROR(hr);
-        hr = pEndpointVolume->QueryHardwareSupport(&dwHwSupportMask);
-        CONTINUE_ON_ERROR(hr);
-        if (dwHwSupportMask & ENDPOINT_HARDWARE_SUPPORT_VOLUME)
-            // The audio endpoint device supports a hardware volume control
-            LOG(LS_VERBOSE) << "hwmask (0x" << std::hex << dwHwSupportMask
-                            << std::dec << ") : HARDWARE_SUPPORT_VOLUME";
-        if (dwHwSupportMask & ENDPOINT_HARDWARE_SUPPORT_MUTE)
-            // The audio endpoint device supports a hardware mute control
-            LOG(LS_VERBOSE) << "hwmask (0x" << std::hex << dwHwSupportMask
-                            << std::dec << ") : HARDWARE_SUPPORT_MUTE";
-        if (dwHwSupportMask & ENDPOINT_HARDWARE_SUPPORT_METER)
-            // The audio endpoint device supports a hardware peak meter
-            LOG(LS_VERBOSE) << "hwmask (0x" << std::hex << dwHwSupportMask
-                            << std::dec << ") : HARDWARE_SUPPORT_METER";
-
-        // Check the channel count (#channels in the audio stream that enters or leaves the audio endpoint device)
-        UINT nChannelCount(0);
-        hr = pEndpointVolume->GetChannelCount(
-                                &nChannelCount);
-        CONTINUE_ON_ERROR(hr);
-        LOG(LS_VERBOSE) << "#channels    : " << nChannelCount;
-
-        if (dwHwSupportMask & ENDPOINT_HARDWARE_SUPPORT_VOLUME)
-        {
-            // Get the volume range.
-            float fLevelMinDB(0.0);
-            float fLevelMaxDB(0.0);
-            float fVolumeIncrementDB(0.0);
-            hr = pEndpointVolume->GetVolumeRange(
-                                    &fLevelMinDB,
-                                    &fLevelMaxDB,
-                                    &fVolumeIncrementDB);
-            CONTINUE_ON_ERROR(hr);
-            LOG(LS_VERBOSE) << "volume range : " << fLevelMinDB << " (min), "
-                            << fLevelMaxDB << " (max), " << fVolumeIncrementDB
-                            << " (inc) [dB]";
-
-            // The volume range from vmin = fLevelMinDB to vmax = fLevelMaxDB is divided
-            // into n uniform intervals of size vinc = fVolumeIncrementDB, where
-            // n = (vmax ?vmin) / vinc.
-            // The values vmin, vmax, and vinc are measured in decibels. The client can set
-            // the volume level to one of n + 1 discrete values in the range from vmin to vmax.
-            int n = (int)((fLevelMaxDB-fLevelMinDB)/fVolumeIncrementDB);
-            LOG(LS_VERBOSE) << "#intervals   : " << n;
-
-            // Get information about the current step in the volume range.
-            // This method represents the volume level of the audio stream that enters or leaves
-            // the audio endpoint device as an index or "step" in a range of discrete volume levels.
-            // Output value nStepCount is the number of steps in the range. Output value nStep
-            // is the step index of the current volume level. If the number of steps is n = nStepCount,
-            // then step index nStep can assume values from 0 (minimum volume) to n ?1 (maximum volume).
-            UINT nStep(0);
-            UINT nStepCount(0);
-            hr = pEndpointVolume->GetVolumeStepInfo(
-                                    &nStep,
-                                    &nStepCount);
-            CONTINUE_ON_ERROR(hr);
-            LOG(LS_VERBOSE) << "volume steps : " << nStep << " (nStep), "
-                            << nStepCount << " (nStepCount)";
-        }
-Next:
-        if (FAILED(hr)) {
-          LOG(LS_VERBOSE) << "Error when logging device information";
-        }
-        CoTaskMemFree(pwszID);
-        pwszID = NULL;
-        PropVariantClear(&varName);
-        SAFE_RELEASE(pProps);
-        SAFE_RELEASE(pEndpoint);
-        SAFE_RELEASE(pEndpointVolume);
-    }
-    SAFE_RELEASE(pCollection);
-    return 0;
-
-Exit:
-    _TraceCOMError(hr);
-    CoTaskMemFree(pwszID);
-    pwszID = NULL;
-    SAFE_RELEASE(pCollection);
-    SAFE_RELEASE(pEndpoint);
-    SAFE_RELEASE(pEndpointVolume);
-    SAFE_RELEASE(pProps);
-    return -1;
-}
-
-// ----------------------------------------------------------------------------
-//  _TraceCOMError
-// ----------------------------------------------------------------------------
-
-void AudioDeviceWindowsCore::_TraceCOMError(HRESULT hr) const
-{
-    TCHAR buf[MAXERRORLENGTH];
-    TCHAR errorText[MAXERRORLENGTH];
-
-    const DWORD dwFlags = FORMAT_MESSAGE_FROM_SYSTEM |
-                          FORMAT_MESSAGE_IGNORE_INSERTS;
-    const DWORD dwLangID = MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US);
-
-    // Gets the system's human readable message string for this HRESULT.
-    // All error message in English by default.
-    DWORD messageLength = ::FormatMessageW(dwFlags,
-                                           0,
-                                           hr,
-                                           dwLangID,
-                                           errorText,
-                                           MAXERRORLENGTH,
-                                           NULL);
-
-    assert(messageLength <= MAXERRORLENGTH);
-
-    // Trims tailing white space (FormatMessage() leaves a trailing cr-lf.).
-    for (; messageLength && ::isspace(errorText[messageLength - 1]);
-         --messageLength)
-    {
-        errorText[messageLength - 1] = '\0';
-    }
-
-    LOG(LS_ERROR) << "Core Audio method failed (hr=" << hr << ")";
-    StringCchPrintf(buf, MAXERRORLENGTH, TEXT("Error details: "));
-    StringCchCat(buf, MAXERRORLENGTH, errorText);
-    LOG(LS_ERROR) << WideToUTF8(buf);
-}
-
-// ----------------------------------------------------------------------------
-//  WideToUTF8
-// ----------------------------------------------------------------------------
-
-char* AudioDeviceWindowsCore::WideToUTF8(const TCHAR* src) const {
-#ifdef UNICODE
-    const size_t kStrLen = sizeof(_str);
-    memset(_str, 0, kStrLen);
-    // Get required size (in bytes) to be able to complete the conversion.
-    unsigned int required_size = (unsigned int)WideCharToMultiByte(CP_UTF8, 0, src, -1, _str, 0, 0, 0);
-    if (required_size <= kStrLen)
-    {
-        // Process the entire input string, including the terminating null char.
-        if (WideCharToMultiByte(CP_UTF8, 0, src, -1, _str, kStrLen, 0, 0) == 0)
-            memset(_str, 0, kStrLen);
-    }
-    return _str;
-#else
-    return const_cast<char*>(src);
-#endif
-}
-
-
-bool AudioDeviceWindowsCore::KeyPressed() const{
-
-  int key_down = 0;
-  for (int key = VK_SPACE; key < VK_NUMLOCK; key++) {
-    short res = GetAsyncKeyState(key);
-    key_down |= res & 0x1; // Get the LSB
-  }
-  return (key_down > 0);
-}
-}  // namespace webrtc
-
-#endif  // WEBRTC_WINDOWS_CORE_AUDIO_BUILD
diff --git a/modules/audio_device/win/audio_device_core_win.h b/modules/audio_device/win/audio_device_core_win.h
deleted file mode 100644
index 34dfee6..0000000
--- a/modules/audio_device/win/audio_device_core_win.h
+++ /dev/null
@@ -1,351 +0,0 @@
-/*
- *  Copyright (c) 2012 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_AUDIO_DEVICE_AUDIO_DEVICE_CORE_WIN_H_
-#define WEBRTC_AUDIO_DEVICE_AUDIO_DEVICE_CORE_WIN_H_
-
-#if (_MSC_VER >= 1400)  // only include for VS 2005 and higher
-
-#include "webrtc/modules/audio_device/audio_device_generic.h"
-
-#include <wmcodecdsp.h>      // CLSID_CWMAudioAEC
-                             // (must be before audioclient.h)
-#include <Audioclient.h>     // WASAPI
-#include <Audiopolicy.h>
-#include <Mmdeviceapi.h>     // MMDevice
-#include <avrt.h>            // Avrt
-#include <endpointvolume.h>
-#include <mediaobj.h>        // IMediaObject
-
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/scoped_ref_ptr.h"
-
-// Use Multimedia Class Scheduler Service (MMCSS) to boost the thread priority
-#pragma comment( lib, "avrt.lib" )
-// AVRT function pointers
-typedef BOOL (WINAPI *PAvRevertMmThreadCharacteristics)(HANDLE);
-typedef HANDLE (WINAPI *PAvSetMmThreadCharacteristicsA)(LPCSTR, LPDWORD);
-typedef BOOL (WINAPI *PAvSetMmThreadPriority)(HANDLE, AVRT_PRIORITY);
-
-namespace webrtc {
-
-const float MAX_CORE_SPEAKER_VOLUME = 255.0f;
-const float MIN_CORE_SPEAKER_VOLUME = 0.0f;
-const float MAX_CORE_MICROPHONE_VOLUME = 255.0f;
-const float MIN_CORE_MICROPHONE_VOLUME = 0.0f;
-const uint16_t CORE_SPEAKER_VOLUME_STEP_SIZE = 1;
-const uint16_t CORE_MICROPHONE_VOLUME_STEP_SIZE = 1;
-
-// Utility class which initializes COM in the constructor (STA or MTA),
-// and uninitializes COM in the destructor.
-class ScopedCOMInitializer {
- public:
-  // Enum value provided to initialize the thread as an MTA instead of STA.
-  enum SelectMTA { kMTA };
-
-  // Constructor for STA initialization.
-  ScopedCOMInitializer() {
-    Initialize(COINIT_APARTMENTTHREADED);
-  }
-
-  // Constructor for MTA initialization.
-  explicit ScopedCOMInitializer(SelectMTA mta) {
-    Initialize(COINIT_MULTITHREADED);
-  }
-
-  ScopedCOMInitializer::~ScopedCOMInitializer() {
-    if (SUCCEEDED(hr_))
-      CoUninitialize();
-  }
-
-  bool succeeded() const { return SUCCEEDED(hr_); }
-
- private:
-  void Initialize(COINIT init) {
-    hr_ = CoInitializeEx(NULL, init);
-  }
-
-  HRESULT hr_;
-
-  ScopedCOMInitializer(const ScopedCOMInitializer&);
-  void operator=(const ScopedCOMInitializer&);
-};
-
-
-class AudioDeviceWindowsCore : public AudioDeviceGeneric
-{
-public:
-    AudioDeviceWindowsCore();
-    ~AudioDeviceWindowsCore();
-
-    static bool CoreAudioIsSupported();
-
-    // Retrieve the currently utilized audio layer
-    virtual int32_t ActiveAudioLayer(AudioDeviceModule::AudioLayer& audioLayer) const;
-
-    // Main initializaton and termination
-    virtual InitStatus Init();
-    virtual int32_t Terminate();
-    virtual bool Initialized() const;
-
-    // Device enumeration
-    virtual int16_t PlayoutDevices();
-    virtual int16_t RecordingDevices();
-    virtual int32_t PlayoutDeviceName(
-        uint16_t index,
-        char name[kAdmMaxDeviceNameSize],
-        char guid[kAdmMaxGuidSize]);
-    virtual int32_t RecordingDeviceName(
-        uint16_t index,
-        char name[kAdmMaxDeviceNameSize],
-        char guid[kAdmMaxGuidSize]);
-
-    // Device selection
-    virtual int32_t SetPlayoutDevice(uint16_t index);
-    virtual int32_t SetPlayoutDevice(AudioDeviceModule::WindowsDeviceType device);
-    virtual int32_t SetRecordingDevice(uint16_t index);
-    virtual int32_t SetRecordingDevice(AudioDeviceModule::WindowsDeviceType device);
-
-    // Audio transport initialization
-    virtual int32_t PlayoutIsAvailable(bool& available);
-    virtual int32_t InitPlayout();
-    virtual bool PlayoutIsInitialized() const;
-    virtual int32_t RecordingIsAvailable(bool& available);
-    virtual int32_t InitRecording();
-    virtual bool RecordingIsInitialized() const;
-
-    // Audio transport control
-    virtual int32_t StartPlayout();
-    virtual int32_t StopPlayout();
-    virtual bool Playing() const;
-    virtual int32_t StartRecording();
-    virtual int32_t StopRecording();
-    virtual bool Recording() const;
-
-    // Microphone Automatic Gain Control (AGC)
-    virtual int32_t SetAGC(bool enable);
-    virtual bool AGC() const;
-
-    // Audio mixer initialization
-    virtual int32_t InitSpeaker();
-    virtual bool SpeakerIsInitialized() const;
-    virtual int32_t InitMicrophone();
-    virtual bool MicrophoneIsInitialized() const;
-
-    // Speaker volume controls
-    virtual int32_t SpeakerVolumeIsAvailable(bool& available);
-    virtual int32_t SetSpeakerVolume(uint32_t volume);
-    virtual int32_t SpeakerVolume(uint32_t& volume) const;
-    virtual int32_t MaxSpeakerVolume(uint32_t& maxVolume) const;
-    virtual int32_t MinSpeakerVolume(uint32_t& minVolume) const;
-
-    // Microphone volume controls
-    virtual int32_t MicrophoneVolumeIsAvailable(bool& available);
-    virtual int32_t SetMicrophoneVolume(uint32_t volume);
-    virtual int32_t MicrophoneVolume(uint32_t& volume) const;
-    virtual int32_t MaxMicrophoneVolume(uint32_t& maxVolume) const;
-    virtual int32_t MinMicrophoneVolume(uint32_t& minVolume) const;
-
-    // Speaker mute control
-    virtual int32_t SpeakerMuteIsAvailable(bool& available);
-    virtual int32_t SetSpeakerMute(bool enable);
-    virtual int32_t SpeakerMute(bool& enabled) const;
-
-    // Microphone mute control
-    virtual int32_t MicrophoneMuteIsAvailable(bool& available);
-    virtual int32_t SetMicrophoneMute(bool enable);
-    virtual int32_t MicrophoneMute(bool& enabled) const;
-
-    // Stereo support
-    virtual int32_t StereoPlayoutIsAvailable(bool& available);
-    virtual int32_t SetStereoPlayout(bool enable);
-    virtual int32_t StereoPlayout(bool& enabled) const;
-    virtual int32_t StereoRecordingIsAvailable(bool& available);
-    virtual int32_t SetStereoRecording(bool enable);
-    virtual int32_t StereoRecording(bool& enabled) const;
-
-    // Delay information and control
-    virtual int32_t PlayoutDelay(uint16_t& delayMS) const;
-    virtual int32_t RecordingDelay(uint16_t& delayMS) const;
-
-    virtual int32_t EnableBuiltInAEC(bool enable);
-
-public:
-    virtual bool PlayoutWarning() const;
-    virtual bool PlayoutError() const;
-    virtual bool RecordingWarning() const;
-    virtual bool RecordingError() const;
-    virtual void ClearPlayoutWarning();
-    virtual void ClearPlayoutError();
-    virtual void ClearRecordingWarning();
-    virtual void ClearRecordingError();
-
-public:
-    virtual void AttachAudioBuffer(AudioDeviceBuffer* audioBuffer);
-
-private:
-    bool KeyPressed() const;
-
-private:    // avrt function pointers
-    PAvRevertMmThreadCharacteristics    _PAvRevertMmThreadCharacteristics;
-    PAvSetMmThreadCharacteristicsA      _PAvSetMmThreadCharacteristicsA;
-    PAvSetMmThreadPriority              _PAvSetMmThreadPriority;
-    HMODULE                             _avrtLibrary;
-    bool                                _winSupportAvrt;
-
-private:    // thread functions
-    DWORD InitCaptureThreadPriority();
-    void RevertCaptureThreadPriority();
-    static DWORD WINAPI WSAPICaptureThread(LPVOID context);
-    DWORD DoCaptureThread();
-
-    static DWORD WINAPI WSAPICaptureThreadPollDMO(LPVOID context);
-    DWORD DoCaptureThreadPollDMO();
-
-    static DWORD WINAPI WSAPIRenderThread(LPVOID context);
-    DWORD DoRenderThread();
-
-    static DWORD WINAPI GetCaptureVolumeThread(LPVOID context);
-    DWORD DoGetCaptureVolumeThread();
-
-    static DWORD WINAPI SetCaptureVolumeThread(LPVOID context);
-    DWORD DoSetCaptureVolumeThread();
-
-    void _Lock() { _critSect.Enter(); };
-    void _UnLock() { _critSect.Leave(); };
-
-    int SetDMOProperties();
-
-    int SetBoolProperty(IPropertyStore* ptrPS,
-                        REFPROPERTYKEY key,
-                        VARIANT_BOOL value);
-
-    int SetVtI4Property(IPropertyStore* ptrPS,
-                        REFPROPERTYKEY key,
-                        LONG value);
-
-    int32_t _EnumerateEndpointDevicesAll(EDataFlow dataFlow) const;
-    void _TraceCOMError(HRESULT hr) const;
-
-    int32_t _RefreshDeviceList(EDataFlow dir);
-    int16_t _DeviceListCount(EDataFlow dir);
-    int32_t _GetDefaultDeviceName(EDataFlow dir, ERole role, LPWSTR szBuffer, int bufferLen);
-    int32_t _GetListDeviceName(EDataFlow dir, int index, LPWSTR szBuffer, int bufferLen);
-    int32_t _GetDeviceName(IMMDevice* pDevice, LPWSTR pszBuffer, int bufferLen);
-    int32_t _GetListDeviceID(EDataFlow dir, int index, LPWSTR szBuffer, int bufferLen);
-    int32_t _GetDefaultDeviceID(EDataFlow dir, ERole role, LPWSTR szBuffer, int bufferLen);
-    int32_t _GetDefaultDeviceIndex(EDataFlow dir, ERole role, int* index);
-    int32_t _GetDeviceID(IMMDevice* pDevice, LPWSTR pszBuffer, int bufferLen);
-    int32_t _GetDefaultDevice(EDataFlow dir, ERole role, IMMDevice** ppDevice);
-    int32_t _GetListDevice(EDataFlow dir, int index, IMMDevice** ppDevice);
-
-    // Converts from wide-char to UTF-8 if UNICODE is defined.
-    // Does nothing if UNICODE is undefined.
-    char* WideToUTF8(const TCHAR* src) const;
-
-    int32_t InitRecordingDMO();
-
-    ScopedCOMInitializer                    _comInit;
-    AudioDeviceBuffer*                      _ptrAudioBuffer;
-    rtc::CriticalSection                    _critSect;
-    rtc::CriticalSection                    _volumeMutex;
-
-    IMMDeviceEnumerator*                    _ptrEnumerator;
-    IMMDeviceCollection*                    _ptrRenderCollection;
-    IMMDeviceCollection*                    _ptrCaptureCollection;
-    IMMDevice*                              _ptrDeviceOut;
-    IMMDevice*                              _ptrDeviceIn;
-
-    IAudioClient*                           _ptrClientOut;
-    IAudioClient*                           _ptrClientIn;
-    IAudioRenderClient*                     _ptrRenderClient;
-    IAudioCaptureClient*                    _ptrCaptureClient;
-    IAudioEndpointVolume*                   _ptrCaptureVolume;
-    ISimpleAudioVolume*                     _ptrRenderSimpleVolume;
-
-    // DirectX Media Object (DMO) for the built-in AEC.
-    rtc::scoped_refptr<IMediaObject> _dmo;
-    rtc::scoped_refptr<IMediaBuffer> _mediaBuffer;
-    bool                                    _builtInAecEnabled;
-
-    HANDLE                                  _hRenderSamplesReadyEvent;
-    HANDLE                                  _hPlayThread;
-    HANDLE                                  _hRenderStartedEvent;
-    HANDLE                                  _hShutdownRenderEvent;
-
-    HANDLE                                  _hCaptureSamplesReadyEvent;
-    HANDLE                                  _hRecThread;
-    HANDLE                                  _hCaptureStartedEvent;
-    HANDLE                                  _hShutdownCaptureEvent;
-
-    HANDLE                                  _hGetCaptureVolumeThread;
-    HANDLE                                  _hSetCaptureVolumeThread;
-    HANDLE                                  _hSetCaptureVolumeEvent;
-
-    HANDLE                                  _hMmTask;
-
-    UINT                                    _playAudioFrameSize;
-    uint32_t                          _playSampleRate;
-    uint32_t                          _devicePlaySampleRate;
-    uint32_t                          _playBlockSizeInFrames;
-    uint32_t                          _playBlockSizeInSamples;
-    uint32_t                          _devicePlayBlockSize;
-    uint32_t                          _playChannels;
-    uint32_t                          _sndCardPlayDelay;
-    UINT64                                  _writtenSamples;
-
-    UINT                                    _recAudioFrameSize;
-    uint32_t                          _recSampleRate;
-    uint32_t                          _recBlockSize;
-    uint32_t                          _recChannels;
-    UINT64                                  _readSamples;
-    uint32_t                          _sndCardRecDelay;
-
-    uint16_t                          _recChannelsPrioList[3];
-    uint16_t                          _playChannelsPrioList[2];
-
-    LARGE_INTEGER                           _perfCounterFreq;
-    double                                  _perfCounterFactor;
-
-private:
-    bool                                    _initialized;
-    bool                                    _recording;
-    bool                                    _playing;
-    bool                                    _recIsInitialized;
-    bool                                    _playIsInitialized;
-    bool                                    _speakerIsInitialized;
-    bool                                    _microphoneIsInitialized;
-
-    bool                                    _usingInputDeviceIndex;
-    bool                                    _usingOutputDeviceIndex;
-    AudioDeviceModule::WindowsDeviceType    _inputDevice;
-    AudioDeviceModule::WindowsDeviceType    _outputDevice;
-    uint16_t                          _inputDeviceIndex;
-    uint16_t                          _outputDeviceIndex;
-
-    bool                                    _AGC;
-
-    uint16_t                          _playWarning;
-    uint16_t                          _playError;
-    uint16_t                          _recWarning;
-    uint16_t                          _recError;
-
-    uint16_t                          _playBufDelay;
-
-    uint16_t                          _newMicLevel;
-
-    mutable char                            _str[512];
-};
-
-#endif    // #if (_MSC_VER >= 1400)
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_AUDIO_DEVICE_AUDIO_DEVICE_CORE_WIN_H_
diff --git a/modules/audio_mixer/BUILD.gn b/modules/audio_mixer/BUILD.gn
deleted file mode 100644
index 5b03a9a..0000000
--- a/modules/audio_mixer/BUILD.gn
+++ /dev/null
@@ -1,101 +0,0 @@
-# Copyright (c) 2014 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.
-
-import("../../webrtc.gni")
-
-group("audio_mixer") {
-  public_deps = [
-    ":audio_frame_manipulator",
-    ":audio_mixer_impl",
-  ]
-}
-
-rtc_static_library("audio_mixer_impl") {
-  sources = [
-    "audio_mixer_impl.cc",
-    "audio_mixer_impl.h",
-    "default_output_rate_calculator.cc",
-    "default_output_rate_calculator.h",
-    "frame_combiner.cc",
-    "frame_combiner.h",
-    "output_rate_calculator.h",
-  ]
-
-  public = [
-    "audio_mixer_impl.h",
-    "default_output_rate_calculator.h",  # For creating a mixer with limiter disabled.
-    "frame_combiner.h",
-  ]
-
-  public_deps = [
-    "../../api:audio_mixer_api",
-  ]
-
-  deps = [
-    ":audio_frame_manipulator",
-    "..:module_api",
-    "../..:webrtc_common",
-    "../../api:array_view",
-    "../../audio/utility:audio_frame_operations",
-    "../../rtc_base:rtc_base_approved",
-    "../../system_wrappers",
-    "../audio_processing",
-  ]
-}
-
-rtc_static_library("audio_frame_manipulator") {
-  visibility = [
-    ":*",
-    "../../modules:*",
-  ]
-
-  sources = [
-    "audio_frame_manipulator.cc",
-    "audio_frame_manipulator.h",
-  ]
-
-  deps = [
-    "..:module_api",
-    "../../audio/utility",
-    "../../rtc_base:rtc_base_approved",
-  ]
-}
-
-if (rtc_include_tests) {
-  rtc_source_set("audio_mixer_unittests") {
-    testonly = true
-
-    # Skip restricting visibility on mobile platforms since the tests on those
-    # gets additional generated targets which would require many lines here to
-    # cover (which would be confusing to read and hard to maintain).
-    if (!is_android && !is_ios) {
-      visibility = [ "..:modules_unittests" ]
-    }
-    sources = [
-      "audio_frame_manipulator_unittest.cc",
-      "audio_mixer_impl_unittest.cc",
-      "frame_combiner_unittest.cc",
-      "gain_change_calculator.cc",
-      "gain_change_calculator.h",
-      "sine_wave_generator.cc",
-      "sine_wave_generator.h",
-    ]
-    deps = [
-      ":audio_frame_manipulator",
-      ":audio_mixer_impl",
-      "..:module_api",
-      "../../api:array_view",
-      "../../api:audio_mixer_api",
-      "../../audio/utility:audio_frame_operations",
-      "../../rtc_base:rtc_base_approved",
-      "../../rtc_base:rtc_task_queue",
-      "../../test:test_support",
-      "//testing/gmock",
-    ]
-  }
-}
diff --git a/modules/audio_mixer/DEPS b/modules/audio_mixer/DEPS
deleted file mode 100644
index 025ce05..0000000
--- a/modules/audio_mixer/DEPS
+++ /dev/null
@@ -1,15 +0,0 @@
-include_rules = [
-  "+webrtc/audio/utility/audio_frame_operations.h",
-  "+webrtc/call",
-  "+webrtc/common_audio",
-  "+webrtc/modules/audio_coding",
-  "+webrtc/modules/audio_conference_mixer",
-  "+webrtc/modules/audio_device",
-  "+webrtc/modules/audio_processing",
-  "+webrtc/modules/media_file",
-  "+webrtc/modules/pacing",
-  "+webrtc/modules/rtp_rtcp",
-  "+webrtc/modules/utility",
-  "+webrtc/system_wrappers",
-  "+webrtc/voice_engine",
-]
diff --git a/modules/audio_mixer/OWNERS b/modules/audio_mixer/OWNERS
deleted file mode 100644
index 633cd56..0000000
--- a/modules/audio_mixer/OWNERS
+++ /dev/null
@@ -1,7 +0,0 @@
-aleloi@webrtc.org
-henrik.lundin@webrtc.org
-
-# These are for the common case of adding or renaming files. If you're doing
-# structural changes, please get a review from a reviewer in this file.
-per-file *.gn=*
-per-file *.gni=*
diff --git a/modules/audio_mixer/audio_frame_manipulator.cc b/modules/audio_mixer/audio_frame_manipulator.cc
deleted file mode 100644
index 3f16bf7..0000000
--- a/modules/audio_mixer/audio_frame_manipulator.cc
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- *  Copyright (c) 2012 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_mixer/audio_frame_manipulator.h"
-#include "webrtc/audio/utility/audio_frame_operations.h"
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-
-uint32_t AudioMixerCalculateEnergy(const AudioFrame& audio_frame) {
-  if (audio_frame.muted()) {
-    return 0;
-  }
-
-  uint32_t energy = 0;
-  const int16_t* frame_data = audio_frame.data();
-  for (size_t position = 0; position < audio_frame.samples_per_channel_;
-       position++) {
-    // TODO(aleloi): This can overflow. Convert to floats.
-    energy += frame_data[position] * frame_data[position];
-  }
-  return energy;
-}
-
-void Ramp(float start_gain, float target_gain, AudioFrame* audio_frame) {
-  RTC_DCHECK(audio_frame);
-  RTC_DCHECK_GE(start_gain, 0.0f);
-  RTC_DCHECK_GE(target_gain, 0.0f);
-  if (start_gain == target_gain || audio_frame->muted()) {
-    return;
-  }
-
-  size_t samples = audio_frame->samples_per_channel_;
-  RTC_DCHECK_LT(0, samples);
-  float increment = (target_gain - start_gain) / samples;
-  float gain = start_gain;
-  int16_t* frame_data = audio_frame->mutable_data();
-  for (size_t i = 0; i < samples; ++i) {
-    // If the audio is interleaved of several channels, we want to
-    // apply the same gain change to the ith sample of every channel.
-    for (size_t ch = 0; ch < audio_frame->num_channels_; ++ch) {
-      frame_data[audio_frame->num_channels_ * i + ch] *= gain;
-    }
-    gain += increment;
-  }
-}
-
-void RemixFrame(size_t target_number_of_channels, AudioFrame* frame) {
-  RTC_DCHECK_GE(target_number_of_channels, 1);
-  RTC_DCHECK_LE(target_number_of_channels, 2);
-  if (frame->num_channels_ == 1 && target_number_of_channels == 2) {
-    AudioFrameOperations::MonoToStereo(frame);
-  } else if (frame->num_channels_ == 2 && target_number_of_channels == 1) {
-    AudioFrameOperations::StereoToMono(frame);
-  }
-}
-}  // namespace webrtc
diff --git a/modules/audio_mixer/audio_frame_manipulator.h b/modules/audio_mixer/audio_frame_manipulator.h
deleted file mode 100644
index 20b66ca..0000000
--- a/modules/audio_mixer/audio_frame_manipulator.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- *  Copyright (c) 2011 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_MIXER_AUDIO_FRAME_MANIPULATOR_H_
-#define WEBRTC_MODULES_AUDIO_MIXER_AUDIO_FRAME_MANIPULATOR_H_
-
-#include "webrtc/modules/include/module_common_types.h"
-
-namespace webrtc {
-
-// Updates the audioFrame's energy (based on its samples).
-uint32_t AudioMixerCalculateEnergy(const AudioFrame& audio_frame);
-
-// Ramps up or down the provided audio frame. Ramp(0, 1, frame) will
-// linearly increase the samples in the frame from 0 to full volume.
-void Ramp(float start_gain, float target_gain, AudioFrame* audio_frame);
-
-// Downmixes or upmixes a frame between stereo and mono.
-void RemixFrame(size_t target_number_of_channels, AudioFrame* frame);
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_MIXER_AUDIO_FRAME_MANIPULATOR_H_
diff --git a/modules/audio_mixer/audio_frame_manipulator_unittest.cc b/modules/audio_mixer/audio_frame_manipulator_unittest.cc
deleted file mode 100644
index e163d0f..0000000
--- a/modules/audio_mixer/audio_frame_manipulator_unittest.cc
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- *  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 <algorithm>
-
-#include "webrtc/modules/audio_mixer/audio_frame_manipulator.h"
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-namespace {
-
-void FillFrameWithConstants(size_t samples_per_channel,
-                            size_t number_of_channels,
-                            int16_t value,
-                            AudioFrame* frame) {
-  frame->num_channels_ = number_of_channels;
-  frame->samples_per_channel_ = samples_per_channel;
-  int16_t* frame_data = frame->mutable_data();
-  std::fill(frame_data,
-            frame_data + samples_per_channel * number_of_channels, value);
-}
-}  // namespace
-
-TEST(AudioFrameManipulator, CompareForwardRampWithExpectedResultStereo) {
-  constexpr int kSamplesPerChannel = 5;
-  constexpr int kNumberOfChannels = 2;
-
-  // Create a frame with values 5, 5, 5, ... and channels & samples as above.
-  AudioFrame frame;
-  FillFrameWithConstants(kSamplesPerChannel, kNumberOfChannels, 5, &frame);
-
-  Ramp(0.0f, 1.0f, &frame);
-
-  const int total_samples = kSamplesPerChannel * kNumberOfChannels;
-  const int16_t expected_result[total_samples] = {0, 0, 1, 1, 2, 2, 3, 3, 4, 4};
-  const int16_t* frame_data = frame.data();
-  EXPECT_TRUE(
-      std::equal(frame_data, frame_data + total_samples, expected_result));
-}
-
-TEST(AudioFrameManipulator, CompareBackwardRampWithExpectedResultMono) {
-  constexpr int kSamplesPerChannel = 5;
-  constexpr int kNumberOfChannels = 1;
-
-  // Create a frame with values 5, 5, 5, ... and channels & samples as above.
-  AudioFrame frame;
-  FillFrameWithConstants(kSamplesPerChannel, kNumberOfChannels, 5, &frame);
-
-  Ramp(1.0f, 0.0f, &frame);
-
-  const int total_samples = kSamplesPerChannel * kNumberOfChannels;
-  const int16_t expected_result[total_samples] = {5, 4, 3, 2, 1};
-  const int16_t* frame_data = frame.data();
-  EXPECT_TRUE(
-      std::equal(frame_data, frame_data + total_samples, expected_result));
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_mixer/audio_mixer_impl.cc b/modules/audio_mixer/audio_mixer_impl.cc
deleted file mode 100644
index 2ad4a34..0000000
--- a/modules/audio_mixer/audio_mixer_impl.cc
+++ /dev/null
@@ -1,248 +0,0 @@
-/*
- *  Copyright (c) 2012 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_mixer/audio_mixer_impl.h"
-
-#include <algorithm>
-#include <functional>
-#include <iterator>
-#include <utility>
-
-#include "webrtc/modules/audio_mixer/audio_frame_manipulator.h"
-#include "webrtc/modules/audio_mixer/default_output_rate_calculator.h"
-#include "webrtc/rtc_base/logging.h"
-
-namespace webrtc {
-namespace {
-
-struct SourceFrame {
-  SourceFrame(AudioMixerImpl::SourceStatus* source_status,
-              AudioFrame* audio_frame,
-              bool muted)
-      : source_status(source_status), audio_frame(audio_frame), muted(muted) {
-    RTC_DCHECK(source_status);
-    RTC_DCHECK(audio_frame);
-    if (!muted) {
-      energy = AudioMixerCalculateEnergy(*audio_frame);
-    }
-  }
-
-  SourceFrame(AudioMixerImpl::SourceStatus* source_status,
-              AudioFrame* audio_frame,
-              bool muted,
-              uint32_t energy)
-      : source_status(source_status),
-        audio_frame(audio_frame),
-        muted(muted),
-        energy(energy) {
-    RTC_DCHECK(source_status);
-    RTC_DCHECK(audio_frame);
-  }
-
-  AudioMixerImpl::SourceStatus* source_status = nullptr;
-  AudioFrame* audio_frame = nullptr;
-  bool muted = true;
-  uint32_t energy = 0;
-};
-
-// ShouldMixBefore(a, b) is used to select mixer sources.
-bool ShouldMixBefore(const SourceFrame& a, const SourceFrame& b) {
-  if (a.muted != b.muted) {
-    return b.muted;
-  }
-
-  const auto a_activity = a.audio_frame->vad_activity_;
-  const auto b_activity = b.audio_frame->vad_activity_;
-
-  if (a_activity != b_activity) {
-    return a_activity == AudioFrame::kVadActive;
-  }
-
-  return a.energy > b.energy;
-}
-
-void RampAndUpdateGain(
-    const std::vector<SourceFrame>& mixed_sources_and_frames) {
-  for (const auto& source_frame : mixed_sources_and_frames) {
-    float target_gain = source_frame.source_status->is_mixed ? 1.0f : 0.0f;
-    Ramp(source_frame.source_status->gain, target_gain,
-         source_frame.audio_frame);
-    source_frame.source_status->gain = target_gain;
-  }
-}
-
-AudioMixerImpl::SourceStatusList::const_iterator FindSourceInList(
-    AudioMixerImpl::Source const* audio_source,
-    AudioMixerImpl::SourceStatusList const* audio_source_list) {
-  return std::find_if(
-      audio_source_list->begin(), audio_source_list->end(),
-      [audio_source](const std::unique_ptr<AudioMixerImpl::SourceStatus>& p) {
-        return p->audio_source == audio_source;
-      });
-}
-
-// TODO(aleloi): remove non-const version when WEBRTC only supports modern STL.
-AudioMixerImpl::SourceStatusList::iterator FindSourceInList(
-    AudioMixerImpl::Source const* audio_source,
-    AudioMixerImpl::SourceStatusList* audio_source_list) {
-  return std::find_if(
-      audio_source_list->begin(), audio_source_list->end(),
-      [audio_source](const std::unique_ptr<AudioMixerImpl::SourceStatus>& p) {
-        return p->audio_source == audio_source;
-      });
-}
-
-}  // namespace
-
-AudioMixerImpl::AudioMixerImpl(
-    std::unique_ptr<OutputRateCalculator> output_rate_calculator,
-    bool use_limiter)
-    : output_rate_calculator_(std::move(output_rate_calculator)),
-      output_frequency_(0),
-      sample_size_(0),
-      audio_source_list_(),
-      frame_combiner_(use_limiter) {}
-
-AudioMixerImpl::~AudioMixerImpl() {}
-
-rtc::scoped_refptr<AudioMixerImpl> AudioMixerImpl::Create() {
-  return Create(std::unique_ptr<DefaultOutputRateCalculator>(
-                    new DefaultOutputRateCalculator()),
-                true);
-}
-
-rtc::scoped_refptr<AudioMixerImpl> AudioMixerImpl::Create(
-    std::unique_ptr<OutputRateCalculator> output_rate_calculator,
-    bool use_limiter) {
-  return rtc::scoped_refptr<AudioMixerImpl>(
-      new rtc::RefCountedObject<AudioMixerImpl>(
-          std::move(output_rate_calculator), use_limiter));
-}
-
-void AudioMixerImpl::Mix(size_t number_of_channels,
-                         AudioFrame* audio_frame_for_mixing) {
-  RTC_DCHECK(number_of_channels == 1 || number_of_channels == 2);
-  RTC_DCHECK_RUNS_SERIALIZED(&race_checker_);
-
-  CalculateOutputFrequency();
-
-  {
-    rtc::CritScope lock(&crit_);
-    const size_t number_of_streams = audio_source_list_.size();
-    frame_combiner_.Combine(GetAudioFromSources(), number_of_channels,
-                            OutputFrequency(), number_of_streams,
-                            audio_frame_for_mixing);
-  }
-
-  return;
-}
-
-void AudioMixerImpl::CalculateOutputFrequency() {
-  RTC_DCHECK_RUNS_SERIALIZED(&race_checker_);
-  rtc::CritScope lock(&crit_);
-
-  std::vector<int> preferred_rates;
-  std::transform(audio_source_list_.begin(), audio_source_list_.end(),
-                 std::back_inserter(preferred_rates),
-                 [&](std::unique_ptr<SourceStatus>& a) {
-                   return a->audio_source->PreferredSampleRate();
-                 });
-
-  output_frequency_ =
-      output_rate_calculator_->CalculateOutputRate(preferred_rates);
-  sample_size_ = (output_frequency_ * kFrameDurationInMs) / 1000;
-}
-
-int AudioMixerImpl::OutputFrequency() const {
-  RTC_DCHECK_RUNS_SERIALIZED(&race_checker_);
-  return output_frequency_;
-}
-
-bool AudioMixerImpl::AddSource(Source* audio_source) {
-  RTC_DCHECK(audio_source);
-  rtc::CritScope lock(&crit_);
-  RTC_DCHECK(FindSourceInList(audio_source, &audio_source_list_) ==
-             audio_source_list_.end())
-      << "Source already added to mixer";
-  audio_source_list_.emplace_back(new SourceStatus(audio_source, false, 0));
-  return true;
-}
-
-void AudioMixerImpl::RemoveSource(Source* audio_source) {
-  RTC_DCHECK(audio_source);
-  rtc::CritScope lock(&crit_);
-  const auto iter = FindSourceInList(audio_source, &audio_source_list_);
-  RTC_DCHECK(iter != audio_source_list_.end()) << "Source not present in mixer";
-  audio_source_list_.erase(iter);
-}
-
-AudioFrameList AudioMixerImpl::GetAudioFromSources() {
-  RTC_DCHECK_RUNS_SERIALIZED(&race_checker_);
-  AudioFrameList result;
-  std::vector<SourceFrame> audio_source_mixing_data_list;
-  std::vector<SourceFrame> ramp_list;
-
-  // Get audio from the audio sources and put it in the SourceFrame vector.
-  for (auto& source_and_status : audio_source_list_) {
-    const auto audio_frame_info =
-        source_and_status->audio_source->GetAudioFrameWithInfo(
-            OutputFrequency(), &source_and_status->audio_frame);
-
-    if (audio_frame_info == Source::AudioFrameInfo::kError) {
-      LOG_F(LS_WARNING) << "failed to GetAudioFrameWithInfo() from source";
-      continue;
-    }
-    audio_source_mixing_data_list.emplace_back(
-        source_and_status.get(), &source_and_status->audio_frame,
-        audio_frame_info == Source::AudioFrameInfo::kMuted);
-  }
-
-  // Sort frames by sorting function.
-  std::sort(audio_source_mixing_data_list.begin(),
-            audio_source_mixing_data_list.end(), ShouldMixBefore);
-
-  int max_audio_frame_counter = kMaximumAmountOfMixedAudioSources;
-
-  // Go through list in order and put unmuted frames in result list.
-  for (const auto& p : audio_source_mixing_data_list) {
-    // Filter muted.
-    if (p.muted) {
-      p.source_status->is_mixed = false;
-      continue;
-    }
-
-    // Add frame to result vector for mixing.
-    bool is_mixed = false;
-    if (max_audio_frame_counter > 0) {
-      --max_audio_frame_counter;
-      result.push_back(p.audio_frame);
-      ramp_list.emplace_back(p.source_status, p.audio_frame, false, -1);
-      is_mixed = true;
-    }
-    p.source_status->is_mixed = is_mixed;
-  }
-  RampAndUpdateGain(ramp_list);
-  return result;
-}
-
-bool AudioMixerImpl::GetAudioSourceMixabilityStatusForTest(
-    AudioMixerImpl::Source* audio_source) const {
-  RTC_DCHECK_RUNS_SERIALIZED(&race_checker_);
-  rtc::CritScope lock(&crit_);
-
-  const auto iter = FindSourceInList(audio_source, &audio_source_list_);
-  if (iter != audio_source_list_.end()) {
-    return (*iter)->is_mixed;
-  }
-
-  LOG(LS_ERROR) << "Audio source unknown";
-  return false;
-}
-}  // namespace webrtc
diff --git a/modules/audio_mixer/audio_mixer_impl.h b/modules/audio_mixer/audio_mixer_impl.h
deleted file mode 100644
index abc98f1..0000000
--- a/modules/audio_mixer/audio_mixer_impl.h
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- *  Copyright (c) 2012 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_MIXER_AUDIO_MIXER_IMPL_H_
-#define WEBRTC_MODULES_AUDIO_MIXER_AUDIO_MIXER_IMPL_H_
-
-#include <memory>
-#include <vector>
-
-#include "webrtc/api/audio/audio_mixer.h"
-#include "webrtc/modules/audio_mixer/frame_combiner.h"
-#include "webrtc/modules/audio_mixer/output_rate_calculator.h"
-#include "webrtc/modules/audio_processing/include/audio_processing.h"
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/rtc_base/race_checker.h"
-#include "webrtc/rtc_base/scoped_ref_ptr.h"
-#include "webrtc/rtc_base/thread_annotations.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-typedef std::vector<AudioFrame*> AudioFrameList;
-
-class AudioMixerImpl : public AudioMixer {
- public:
-  struct SourceStatus {
-    SourceStatus(Source* audio_source, bool is_mixed, float gain)
-        : audio_source(audio_source), is_mixed(is_mixed), gain(gain) {}
-    Source* audio_source = nullptr;
-    bool is_mixed = false;
-    float gain = 0.0f;
-
-    // A frame that will be passed to audio_source->GetAudioFrameWithInfo.
-    AudioFrame audio_frame;
-  };
-
-  using SourceStatusList = std::vector<std::unique_ptr<SourceStatus>>;
-
-  // AudioProcessing only accepts 10 ms frames.
-  static const int kFrameDurationInMs = 10;
-  static const int kMaximumAmountOfMixedAudioSources = 3;
-
-  static rtc::scoped_refptr<AudioMixerImpl> Create();
-
-  static rtc::scoped_refptr<AudioMixerImpl> Create(
-      std::unique_ptr<OutputRateCalculator> output_rate_calculator,
-      bool use_limiter);
-
-  ~AudioMixerImpl() override;
-
-  // AudioMixer functions
-  bool AddSource(Source* audio_source) override;
-  void RemoveSource(Source* audio_source) override;
-
-  void Mix(size_t number_of_channels,
-           AudioFrame* audio_frame_for_mixing) override
-      RTC_LOCKS_EXCLUDED(crit_);
-
-  // Returns true if the source was mixed last round. Returns
-  // false and logs an error if the source was never added to the
-  // mixer.
-  bool GetAudioSourceMixabilityStatusForTest(Source* audio_source) const;
-
- protected:
-  AudioMixerImpl(std::unique_ptr<OutputRateCalculator> output_rate_calculator,
-                 bool use_limiter);
-
- private:
-  // Set mixing frequency through OutputFrequencyCalculator.
-  void CalculateOutputFrequency();
-  // Get mixing frequency.
-  int OutputFrequency() const;
-
-  // Compute what audio sources to mix from audio_source_list_. Ramp
-  // in and out. Update mixed status. Mixes up to
-  // kMaximumAmountOfMixedAudioSources audio sources.
-  AudioFrameList GetAudioFromSources() RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_);
-
-  // Add/remove the MixerAudioSource to the specified
-  // MixerAudioSource list.
-  bool AddAudioSourceToList(Source* audio_source,
-                            SourceStatusList* audio_source_list) const;
-  bool RemoveAudioSourceFromList(Source* remove_audio_source,
-                                 SourceStatusList* audio_source_list) const;
-
-  // The critical section lock guards audio source insertion and
-  // removal, which can be done from any thread. The race checker
-  // checks that mixing is done sequentially.
-  rtc::CriticalSection crit_;
-  rtc::RaceChecker race_checker_;
-
-  std::unique_ptr<OutputRateCalculator> output_rate_calculator_;
-  // The current sample frequency and sample size when mixing.
-  int output_frequency_ RTC_GUARDED_BY(race_checker_);
-  size_t sample_size_ RTC_GUARDED_BY(race_checker_);
-
-  // List of all audio sources. Note all lists are disjunct
-  SourceStatusList audio_source_list_ RTC_GUARDED_BY(crit_);  // May be mixed.
-
-  // Component that handles actual adding of audio frames.
-  FrameCombiner frame_combiner_ RTC_GUARDED_BY(race_checker_);
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(AudioMixerImpl);
-};
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_MIXER_AUDIO_MIXER_IMPL_H_
diff --git a/modules/audio_mixer/audio_mixer_impl_unittest.cc b/modules/audio_mixer/audio_mixer_impl_unittest.cc
deleted file mode 100644
index ac7783b..0000000
--- a/modules/audio_mixer/audio_mixer_impl_unittest.cc
+++ /dev/null
@@ -1,545 +0,0 @@
-/*
- *  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 <string.h>
-
-#include <limits>
-#include <memory>
-#include <sstream>
-#include <string>
-#include <utility>
-
-#include "webrtc/api/audio/audio_mixer.h"
-#include "webrtc/modules/audio_mixer/audio_mixer_impl.h"
-#include "webrtc/modules/audio_mixer/default_output_rate_calculator.h"
-#include "webrtc/rtc_base/bind.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/event.h"
-#include "webrtc/rtc_base/task_queue.h"
-#include "webrtc/test/gmock.h"
-
-using testing::_;
-using testing::Exactly;
-using testing::Invoke;
-using testing::Return;
-
-namespace webrtc {
-
-namespace {
-
-constexpr int kDefaultSampleRateHz = 48000;
-constexpr int kId = 1;
-
-// Utility function that resets the frame member variables with
-// sensible defaults.
-void ResetFrame(AudioFrame* frame) {
-  frame->id_ = kId;
-  frame->sample_rate_hz_ = kDefaultSampleRateHz;
-  frame->num_channels_ = 1;
-
-  // Frame duration 10ms.
-  frame->samples_per_channel_ = kDefaultSampleRateHz / 100;
-  frame->vad_activity_ = AudioFrame::kVadActive;
-  frame->speech_type_ = AudioFrame::kNormalSpeech;
-}
-
-std::string ProduceDebugText(int sample_rate_hz,
-                             int number_of_channels,
-                             int number_of_sources) {
-  std::ostringstream ss;
-  ss << "Sample rate: " << sample_rate_hz << " ";
-  ss << "Number of channels: " << number_of_channels << " ";
-  ss << "Number of sources: " << number_of_sources;
-  return ss.str();
-}
-
-AudioFrame frame_for_mixing;
-
-}  // namespace
-
-class MockMixerAudioSource : public AudioMixer::Source {
- public:
-  MockMixerAudioSource()
-      : fake_audio_frame_info_(AudioMixer::Source::AudioFrameInfo::kNormal) {
-    ON_CALL(*this, GetAudioFrameWithInfo(_, _))
-        .WillByDefault(
-            Invoke(this, &MockMixerAudioSource::FakeAudioFrameWithInfo));
-    ON_CALL(*this, PreferredSampleRate())
-        .WillByDefault(Return(kDefaultSampleRateHz));
-  }
-
-  MOCK_METHOD2(GetAudioFrameWithInfo,
-               AudioFrameInfo(int sample_rate_hz, AudioFrame* audio_frame));
-
-  MOCK_CONST_METHOD0(PreferredSampleRate, int());
-  MOCK_CONST_METHOD0(Ssrc, int());
-
-  AudioFrame* fake_frame() { return &fake_frame_; }
-  AudioFrameInfo fake_info() { return fake_audio_frame_info_; }
-  void set_fake_info(const AudioFrameInfo audio_frame_info) {
-    fake_audio_frame_info_ = audio_frame_info;
-  }
-
- private:
-  AudioFrameInfo FakeAudioFrameWithInfo(int sample_rate_hz,
-                                        AudioFrame* audio_frame) {
-    audio_frame->CopyFrom(fake_frame_);
-    audio_frame->sample_rate_hz_ = sample_rate_hz;
-    audio_frame->samples_per_channel_ =
-        rtc::CheckedDivExact(sample_rate_hz, 100);
-    return fake_info();
-  }
-
-  AudioFrame fake_frame_;
-  AudioFrameInfo fake_audio_frame_info_;
-};
-
-class CustomRateCalculator : public OutputRateCalculator {
- public:
-  explicit CustomRateCalculator(int rate) : rate_(rate) {}
-  int CalculateOutputRate(const std::vector<int>& preferred_rates) override {
-    return rate_;
-  }
-
- private:
-  const int rate_;
-};
-
-// Creates participants from |frames| and |frame_info| and adds them
-// to the mixer. Compares mixed status with |expected_status|
-void MixAndCompare(
-    const std::vector<AudioFrame>& frames,
-    const std::vector<AudioMixer::Source::AudioFrameInfo>& frame_info,
-    const std::vector<bool>& expected_status) {
-  const size_t num_audio_sources = frames.size();
-  RTC_DCHECK(frames.size() == frame_info.size());
-  RTC_DCHECK(frame_info.size() == expected_status.size());
-
-  const auto mixer = AudioMixerImpl::Create();
-  std::vector<MockMixerAudioSource> participants(num_audio_sources);
-
-  for (size_t i = 0; i < num_audio_sources; ++i) {
-    participants[i].fake_frame()->CopyFrom(frames[i]);
-    participants[i].set_fake_info(frame_info[i]);
-  }
-
-  for (size_t i = 0; i < num_audio_sources; ++i) {
-    EXPECT_TRUE(mixer->AddSource(&participants[i]));
-    EXPECT_CALL(participants[i], GetAudioFrameWithInfo(kDefaultSampleRateHz, _))
-        .Times(Exactly(1));
-  }
-
-  mixer->Mix(1, &frame_for_mixing);
-
-  for (size_t i = 0; i < num_audio_sources; ++i) {
-    EXPECT_EQ(expected_status[i],
-              mixer->GetAudioSourceMixabilityStatusForTest(&participants[i]))
-        << "Mixed status of AudioSource #" << i << " wrong.";
-  }
-}
-
-void MixMonoAtGivenNativeRate(int native_sample_rate,
-                              AudioFrame* mix_frame,
-                              rtc::scoped_refptr<AudioMixer> mixer,
-                              MockMixerAudioSource* audio_source) {
-  ON_CALL(*audio_source, PreferredSampleRate())
-      .WillByDefault(Return(native_sample_rate));
-  audio_source->fake_frame()->sample_rate_hz_ = native_sample_rate;
-  audio_source->fake_frame()->samples_per_channel_ = native_sample_rate / 100;
-
-  mixer->Mix(1, mix_frame);
-}
-
-TEST(AudioMixer, LargestEnergyVadActiveMixed) {
-  constexpr int kAudioSources =
-      AudioMixerImpl::kMaximumAmountOfMixedAudioSources + 3;
-
-  const auto mixer = AudioMixerImpl::Create();
-
-  MockMixerAudioSource participants[kAudioSources];
-
-  for (int i = 0; i < kAudioSources; ++i) {
-    ResetFrame(participants[i].fake_frame());
-
-    // We set the 80-th sample value since the first 80 samples may be
-    // modified by a ramped-in window.
-    participants[i].fake_frame()->mutable_data()[80] = i;
-
-    EXPECT_TRUE(mixer->AddSource(&participants[i]));
-    EXPECT_CALL(participants[i], GetAudioFrameWithInfo(_, _)).Times(Exactly(1));
-  }
-
-  // Last participant gives audio frame with passive VAD, although it has the
-  // largest energy.
-  participants[kAudioSources - 1].fake_frame()->vad_activity_ =
-      AudioFrame::kVadPassive;
-
-  AudioFrame audio_frame;
-  mixer->Mix(1,  // number of channels
-             &audio_frame);
-
-  for (int i = 0; i < kAudioSources; ++i) {
-    bool is_mixed =
-        mixer->GetAudioSourceMixabilityStatusForTest(&participants[i]);
-    if (i == kAudioSources - 1 ||
-        i < kAudioSources - 1 -
-                AudioMixerImpl::kMaximumAmountOfMixedAudioSources) {
-      EXPECT_FALSE(is_mixed) << "Mixing status of AudioSource #" << i
-                             << " wrong.";
-    } else {
-      EXPECT_TRUE(is_mixed) << "Mixing status of AudioSource #" << i
-                            << " wrong.";
-    }
-  }
-}
-
-TEST(AudioMixer, FrameNotModifiedForSingleParticipant) {
-  const auto mixer = AudioMixerImpl::Create();
-
-  MockMixerAudioSource participant;
-
-  ResetFrame(participant.fake_frame());
-  const size_t n_samples = participant.fake_frame()->samples_per_channel_;
-
-  // Modify the frame so that it's not zero.
-  int16_t* fake_frame_data = participant.fake_frame()->mutable_data();
-  for (size_t j = 0; j < n_samples; ++j) {
-    fake_frame_data[j] = static_cast<int16_t>(j);
-  }
-
-  EXPECT_TRUE(mixer->AddSource(&participant));
-  EXPECT_CALL(participant, GetAudioFrameWithInfo(_, _)).Times(Exactly(2));
-
-  AudioFrame audio_frame;
-  // Two mix iteration to compare after the ramp-up step.
-  for (int i = 0; i < 2; ++i) {
-    mixer->Mix(1,  // number of channels
-               &audio_frame);
-  }
-
-  EXPECT_EQ(
-      0,
-      memcmp(participant.fake_frame()->data(), audio_frame.data(), n_samples));
-}
-
-TEST(AudioMixer, SourceAtNativeRateShouldNeverResample) {
-  const auto mixer = AudioMixerImpl::Create();
-
-  MockMixerAudioSource audio_source;
-  ResetFrame(audio_source.fake_frame());
-
-  mixer->AddSource(&audio_source);
-
-  for (auto frequency : {8000, 16000, 32000, 48000}) {
-    EXPECT_CALL(audio_source, GetAudioFrameWithInfo(frequency, _))
-        .Times(Exactly(1));
-
-    MixMonoAtGivenNativeRate(frequency, &frame_for_mixing, mixer,
-                             &audio_source);
-  }
-}
-
-TEST(AudioMixer, MixerShouldMixAtNativeSourceRate) {
-  const auto mixer = AudioMixerImpl::Create();
-
-  MockMixerAudioSource audio_source;
-  ResetFrame(audio_source.fake_frame());
-
-  mixer->AddSource(&audio_source);
-
-  for (auto frequency : {8000, 16000, 32000, 48000}) {
-    MixMonoAtGivenNativeRate(frequency, &frame_for_mixing, mixer,
-                             &audio_source);
-
-    EXPECT_EQ(frequency, frame_for_mixing.sample_rate_hz_);
-  }
-}
-
-TEST(AudioMixer, MixerShouldAlwaysMixAtNativeRate) {
-  const auto mixer = AudioMixerImpl::Create();
-
-  MockMixerAudioSource participant;
-  ResetFrame(participant.fake_frame());
-  mixer->AddSource(&participant);
-
-  const int needed_frequency = 44100;
-  ON_CALL(participant, PreferredSampleRate())
-      .WillByDefault(Return(needed_frequency));
-
-  // We expect mixing frequency to be native and >= needed_frequency.
-  const int expected_mix_frequency = 48000;
-  EXPECT_CALL(participant, GetAudioFrameWithInfo(expected_mix_frequency, _))
-      .Times(Exactly(1));
-  participant.fake_frame()->sample_rate_hz_ = expected_mix_frequency;
-  participant.fake_frame()->samples_per_channel_ = expected_mix_frequency / 100;
-
-  mixer->Mix(1, &frame_for_mixing);
-
-  EXPECT_EQ(48000, frame_for_mixing.sample_rate_hz_);
-}
-
-// Check that the mixing rate is always >= participants preferred rate.
-TEST(AudioMixer, ShouldNotCauseQualityLossForMultipleSources) {
-  const auto mixer = AudioMixerImpl::Create();
-
-  std::vector<MockMixerAudioSource> audio_sources(2);
-  const std::vector<int> source_sample_rates = {8000, 16000};
-  for (int i = 0; i < 2; ++i) {
-    auto& source = audio_sources[i];
-    ResetFrame(source.fake_frame());
-    mixer->AddSource(&source);
-    const auto sample_rate = source_sample_rates[i];
-    EXPECT_CALL(source, PreferredSampleRate()).WillOnce(Return(sample_rate));
-
-    EXPECT_CALL(source, GetAudioFrameWithInfo(testing::Ge(sample_rate), _));
-  }
-  mixer->Mix(1, &frame_for_mixing);
-}
-
-TEST(AudioMixer, ParticipantNumberOfChannels) {
-  const auto mixer = AudioMixerImpl::Create();
-
-  MockMixerAudioSource participant;
-  ResetFrame(participant.fake_frame());
-
-  EXPECT_TRUE(mixer->AddSource(&participant));
-  for (size_t number_of_channels : {1, 2}) {
-    EXPECT_CALL(participant, GetAudioFrameWithInfo(kDefaultSampleRateHz, _))
-        .Times(Exactly(1));
-    mixer->Mix(number_of_channels, &frame_for_mixing);
-    EXPECT_EQ(number_of_channels, frame_for_mixing.num_channels_);
-  }
-}
-
-// Maximal amount of participants are mixed one iteration, then
-// another participant with higher energy is added.
-TEST(AudioMixer, RampedOutSourcesShouldNotBeMarkedMixed) {
-  constexpr int kAudioSources =
-      AudioMixerImpl::kMaximumAmountOfMixedAudioSources + 1;
-
-  const auto mixer = AudioMixerImpl::Create();
-  MockMixerAudioSource participants[kAudioSources];
-
-  for (int i = 0; i < kAudioSources; ++i) {
-    ResetFrame(participants[i].fake_frame());
-    // Set the participant audio energy to increase with the index
-    // |i|.
-    participants[i].fake_frame()->mutable_data()[0] = 100 * i;
-  }
-
-  // Add all participants but the loudest for mixing.
-  for (int i = 0; i < kAudioSources - 1; ++i) {
-    EXPECT_TRUE(mixer->AddSource(&participants[i]));
-    EXPECT_CALL(participants[i], GetAudioFrameWithInfo(kDefaultSampleRateHz, _))
-        .Times(Exactly(1));
-  }
-
-  // First mixer iteration
-  mixer->Mix(1, &frame_for_mixing);
-
-  // All participants but the loudest should have been mixed.
-  for (int i = 0; i < kAudioSources - 1; ++i) {
-    EXPECT_TRUE(mixer->GetAudioSourceMixabilityStatusForTest(&participants[i]))
-        << "Mixed status of AudioSource #" << i << " wrong.";
-  }
-
-  // Add new participant with higher energy.
-  EXPECT_TRUE(mixer->AddSource(&participants[kAudioSources - 1]));
-  for (int i = 0; i < kAudioSources; ++i) {
-    EXPECT_CALL(participants[i], GetAudioFrameWithInfo(kDefaultSampleRateHz, _))
-        .Times(Exactly(1));
-  }
-
-  mixer->Mix(1, &frame_for_mixing);
-
-  // The most quiet participant should not have been mixed.
-  EXPECT_FALSE(mixer->GetAudioSourceMixabilityStatusForTest(&participants[0]))
-      << "Mixed status of AudioSource #0 wrong.";
-
-  // The loudest participants should have been mixed.
-  for (int i = 1; i < kAudioSources; ++i) {
-    EXPECT_EQ(true,
-              mixer->GetAudioSourceMixabilityStatusForTest(&participants[i]))
-        << "Mixed status of AudioSource #" << i << " wrong.";
-  }
-}
-
-// This test checks that the initialization and participant addition
-// can be done on a different thread.
-TEST(AudioMixer, ConstructFromOtherThread) {
-  rtc::TaskQueue init_queue("init");
-  rtc::scoped_refptr<AudioMixer> mixer;
-  rtc::Event event(false, false);
-  init_queue.PostTask([&mixer, &event]() {
-    mixer = AudioMixerImpl::Create();
-    event.Set();
-  });
-  event.Wait(rtc::Event::kForever);
-
-  MockMixerAudioSource participant;
-  EXPECT_CALL(participant, PreferredSampleRate())
-      .WillRepeatedly(Return(kDefaultSampleRateHz));
-
-  ResetFrame(participant.fake_frame());
-
-  rtc::TaskQueue participant_queue("participant");
-  participant_queue.PostTask([&mixer, &event, &participant]() {
-    mixer->AddSource(&participant);
-    event.Set();
-  });
-  event.Wait(rtc::Event::kForever);
-
-  EXPECT_CALL(participant, GetAudioFrameWithInfo(kDefaultSampleRateHz, _))
-      .Times(Exactly(1));
-
-  // Do one mixer iteration
-  mixer->Mix(1, &frame_for_mixing);
-}
-
-TEST(AudioMixer, MutedShouldMixAfterUnmuted) {
-  constexpr int kAudioSources =
-      AudioMixerImpl::kMaximumAmountOfMixedAudioSources + 1;
-
-  std::vector<AudioFrame> frames(kAudioSources);
-  for (auto& frame : frames) {
-    ResetFrame(&frame);
-  }
-
-  std::vector<AudioMixer::Source::AudioFrameInfo> frame_info(
-      kAudioSources, AudioMixer::Source::AudioFrameInfo::kNormal);
-  frame_info[0] = AudioMixer::Source::AudioFrameInfo::kMuted;
-  std::vector<bool> expected_status(kAudioSources, true);
-  expected_status[0] = false;
-
-  MixAndCompare(frames, frame_info, expected_status);
-}
-
-TEST(AudioMixer, PassiveShouldMixAfterNormal) {
-  constexpr int kAudioSources =
-      AudioMixerImpl::kMaximumAmountOfMixedAudioSources + 1;
-
-  std::vector<AudioFrame> frames(kAudioSources);
-  for (auto& frame : frames) {
-    ResetFrame(&frame);
-  }
-
-  std::vector<AudioMixer::Source::AudioFrameInfo> frame_info(
-      kAudioSources, AudioMixer::Source::AudioFrameInfo::kNormal);
-  frames[0].vad_activity_ = AudioFrame::kVadPassive;
-  std::vector<bool> expected_status(kAudioSources, true);
-  expected_status[0] = false;
-
-  MixAndCompare(frames, frame_info, expected_status);
-}
-
-TEST(AudioMixer, ActiveShouldMixBeforeLoud) {
-  constexpr int kAudioSources =
-      AudioMixerImpl::kMaximumAmountOfMixedAudioSources + 1;
-
-  std::vector<AudioFrame> frames(kAudioSources);
-  for (auto& frame : frames) {
-    ResetFrame(&frame);
-  }
-
-  std::vector<AudioMixer::Source::AudioFrameInfo> frame_info(
-      kAudioSources, AudioMixer::Source::AudioFrameInfo::kNormal);
-  frames[0].vad_activity_ = AudioFrame::kVadPassive;
-  int16_t* frame_data = frames[0].mutable_data();
-  std::fill(frame_data, frame_data + kDefaultSampleRateHz / 100,
-            std::numeric_limits<int16_t>::max());
-  std::vector<bool> expected_status(kAudioSources, true);
-  expected_status[0] = false;
-
-  MixAndCompare(frames, frame_info, expected_status);
-}
-
-TEST(AudioMixer, UnmutedShouldMixBeforeLoud) {
-  constexpr int kAudioSources =
-      AudioMixerImpl::kMaximumAmountOfMixedAudioSources + 1;
-
-  std::vector<AudioFrame> frames(kAudioSources);
-  for (auto& frame : frames) {
-    ResetFrame(&frame);
-  }
-
-  std::vector<AudioMixer::Source::AudioFrameInfo> frame_info(
-      kAudioSources, AudioMixer::Source::AudioFrameInfo::kNormal);
-  frame_info[0] = AudioMixer::Source::AudioFrameInfo::kMuted;
-  int16_t* frame_data = frames[0].mutable_data();
-  std::fill(frame_data, frame_data + kDefaultSampleRateHz / 100,
-            std::numeric_limits<int16_t>::max());
-  std::vector<bool> expected_status(kAudioSources, true);
-  expected_status[0] = false;
-
-  MixAndCompare(frames, frame_info, expected_status);
-}
-
-TEST(AudioMixer, MixingRateShouldBeDecidedByRateCalculator) {
-  constexpr int kOutputRate = 22000;
-  const auto mixer =
-      AudioMixerImpl::Create(std::unique_ptr<OutputRateCalculator>(
-                                 new CustomRateCalculator(kOutputRate)),
-                             true);
-  MockMixerAudioSource audio_source;
-  mixer->AddSource(&audio_source);
-  ResetFrame(audio_source.fake_frame());
-
-  EXPECT_CALL(audio_source, GetAudioFrameWithInfo(kOutputRate, _))
-      .Times(Exactly(1));
-
-  mixer->Mix(1, &frame_for_mixing);
-}
-
-TEST(AudioMixer, ZeroSourceRateShouldBeDecidedByRateCalculator) {
-  constexpr int kOutputRate = 8000;
-  const auto mixer =
-      AudioMixerImpl::Create(std::unique_ptr<OutputRateCalculator>(
-                                 new CustomRateCalculator(kOutputRate)),
-                             true);
-
-  mixer->Mix(1, &frame_for_mixing);
-
-  EXPECT_EQ(kOutputRate, frame_for_mixing.sample_rate_hz_);
-}
-
-TEST(AudioMixer, NoLimiterBasicApiCalls) {
-  const auto mixer = AudioMixerImpl::Create(
-      std::unique_ptr<OutputRateCalculator>(new DefaultOutputRateCalculator()),
-      false);
-  mixer->Mix(1, &frame_for_mixing);
-}
-
-TEST(AudioMixer, AnyRateIsPossibleWithNoLimiter) {
-  // No APM limiter means no AudioProcessing::NativeRate restriction
-  // on mixing rate. The rate has to be divisible by 100 since we use
-  // 10 ms frames, though.
-  for (const auto rate : {8000, 20000, 24000, 32000, 44100}) {
-    for (const size_t number_of_channels : {1, 2}) {
-      for (const auto number_of_sources : {0, 1, 2, 3, 4}) {
-        SCOPED_TRACE(
-            ProduceDebugText(rate, number_of_sources, number_of_sources));
-        const auto mixer =
-            AudioMixerImpl::Create(std::unique_ptr<OutputRateCalculator>(
-                                       new CustomRateCalculator(rate)),
-                                   false);
-
-        std::vector<MockMixerAudioSource> sources(number_of_sources);
-        for (auto& source : sources) {
-          mixer->AddSource(&source);
-        }
-
-        mixer->Mix(number_of_channels, &frame_for_mixing);
-        EXPECT_EQ(rate, frame_for_mixing.sample_rate_hz_);
-        EXPECT_EQ(number_of_channels, frame_for_mixing.num_channels_);
-      }
-    }
-  }
-}
-}  // namespace webrtc
diff --git a/modules/audio_mixer/default_output_rate_calculator.cc b/modules/audio_mixer/default_output_rate_calculator.cc
deleted file mode 100644
index b46ca88..0000000
--- a/modules/audio_mixer/default_output_rate_calculator.cc
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- *  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_mixer/default_output_rate_calculator.h"
-
-#include <algorithm>
-
-#include "webrtc/modules/audio_processing/include/audio_processing.h"
-
-namespace webrtc {
-
-int DefaultOutputRateCalculator::CalculateOutputRate(
-    const std::vector<int>& preferred_sample_rates) {
-  if (preferred_sample_rates.empty()) {
-    return DefaultOutputRateCalculator::kDefaultFrequency;
-  }
-  using NativeRate = AudioProcessing::NativeRate;
-  const int maximal_frequency = *std::max_element(
-      preferred_sample_rates.begin(), preferred_sample_rates.end());
-
-  RTC_DCHECK_LE(NativeRate::kSampleRate8kHz, maximal_frequency);
-  RTC_DCHECK_GE(NativeRate::kSampleRate48kHz, maximal_frequency);
-
-  static constexpr NativeRate native_rates[] = {
-      NativeRate::kSampleRate8kHz, NativeRate::kSampleRate16kHz,
-      NativeRate::kSampleRate32kHz, NativeRate::kSampleRate48kHz};
-  const auto* rounded_up_index = std::lower_bound(
-      std::begin(native_rates), std::end(native_rates), maximal_frequency);
-  RTC_DCHECK(rounded_up_index != std::end(native_rates));
-  return *rounded_up_index;
-}
-}  // namespace webrtc
diff --git a/modules/audio_mixer/default_output_rate_calculator.h b/modules/audio_mixer/default_output_rate_calculator.h
deleted file mode 100644
index 02c724d..0000000
--- a/modules/audio_mixer/default_output_rate_calculator.h
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- *  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_MIXER_DEFAULT_OUTPUT_RATE_CALCULATOR_H_
-#define WEBRTC_MODULES_AUDIO_MIXER_DEFAULT_OUTPUT_RATE_CALCULATOR_H_
-
-#include <vector>
-
-#include "webrtc/modules/audio_mixer/output_rate_calculator.h"
-
-namespace webrtc {
-
-class DefaultOutputRateCalculator : public OutputRateCalculator {
- public:
-  static const int kDefaultFrequency = 48000;
-
-  // Produces the least native rate greater or equal to the preferred
-  // sample rates. A native rate is one in
-  // AudioProcessing::NativeRate. If |preferred_sample_rates| is
-  // empty, returns |kDefaultFrequency|.
-  int CalculateOutputRate(
-      const std::vector<int>& preferred_sample_rates) override;
-  ~DefaultOutputRateCalculator() override {}
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_MIXER_DEFAULT_OUTPUT_RATE_CALCULATOR_H_
diff --git a/modules/audio_mixer/frame_combiner.cc b/modules/audio_mixer/frame_combiner.cc
deleted file mode 100644
index ad9ddaf..0000000
--- a/modules/audio_mixer/frame_combiner.cc
+++ /dev/null
@@ -1,218 +0,0 @@
-/*
- *  Copyright (c) 2017 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_mixer/frame_combiner.h"
-
-#include <algorithm>
-#include <array>
-#include <functional>
-#include <memory>
-
-#include "webrtc/api/array_view.h"
-#include "webrtc/audio/utility/audio_frame_operations.h"
-#include "webrtc/modules/audio_mixer/audio_frame_manipulator.h"
-#include "webrtc/modules/audio_mixer/audio_mixer_impl.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-
-namespace webrtc {
-namespace {
-
-// Stereo, 48 kHz, 10 ms.
-constexpr int kMaximalFrameSize = 2 * 48 * 10;
-
-void CombineZeroFrames(bool use_limiter,
-                       AudioProcessing* limiter,
-                       AudioFrame* audio_frame_for_mixing) {
-  audio_frame_for_mixing->elapsed_time_ms_ = -1;
-  AudioFrameOperations::Mute(audio_frame_for_mixing);
-  // The limiter should still process a zero frame to avoid jumps in
-  // its gain curve.
-  if (use_limiter) {
-    RTC_DCHECK(limiter);
-    // The limiter smoothly increases frames with half gain to full
-    // volume.  Here there's no need to apply half gain, since the frame
-    // is zero anyway.
-    limiter->ProcessStream(audio_frame_for_mixing);
-  }
-}
-
-void CombineOneFrame(const AudioFrame* input_frame,
-                     bool use_limiter,
-                     AudioProcessing* limiter,
-                     AudioFrame* audio_frame_for_mixing) {
-  audio_frame_for_mixing->timestamp_ = input_frame->timestamp_;
-  audio_frame_for_mixing->elapsed_time_ms_ = input_frame->elapsed_time_ms_;
-  // TODO(yujo): can we optimize muted frames?
-  std::copy(input_frame->data(),
-            input_frame->data() +
-                input_frame->num_channels_ * input_frame->samples_per_channel_,
-            audio_frame_for_mixing->mutable_data());
-  if (use_limiter) {
-    AudioFrameOperations::ApplyHalfGain(audio_frame_for_mixing);
-    RTC_DCHECK(limiter);
-    limiter->ProcessStream(audio_frame_for_mixing);
-    AudioFrameOperations::Add(*audio_frame_for_mixing, audio_frame_for_mixing);
-  }
-}
-
-// Lower-level helper function called from Combine(...) when there
-// are several input frames.
-//
-// TODO(aleloi): change interface to ArrayView<int16_t> output_frame
-// once we have gotten rid of the APM limiter.
-//
-// Only the 'data' field of output_frame should be modified. The
-// rest are used for potentially sending the output to the APM
-// limiter.
-void CombineMultipleFrames(
-    const std::vector<rtc::ArrayView<const int16_t>>& input_frames,
-    bool use_limiter,
-    AudioProcessing* limiter,
-    AudioFrame* audio_frame_for_mixing) {
-  RTC_DCHECK(!input_frames.empty());
-  RTC_DCHECK(audio_frame_for_mixing);
-
-  const size_t frame_length = input_frames.front().size();
-  for (const auto& frame : input_frames) {
-    RTC_DCHECK_EQ(frame_length, frame.size());
-  }
-
-  // Algorithm: int16 frames are added to a sufficiently large
-  // statically allocated int32 buffer. For > 2 participants this is
-  // more efficient than addition in place in the int16 audio
-  // frame. The audio quality loss due to halving the samples is
-  // smaller than 16-bit addition in place.
-  RTC_DCHECK_GE(kMaximalFrameSize, frame_length);
-  std::array<int32_t, kMaximalFrameSize> add_buffer;
-
-  add_buffer.fill(0);
-
-  for (const auto& frame : input_frames) {
-    // TODO(yujo): skip this for muted frames.
-    std::transform(frame.begin(), frame.end(), add_buffer.begin(),
-                   add_buffer.begin(), std::plus<int32_t>());
-  }
-
-  if (use_limiter) {
-    // Halve all samples to avoid saturation before limiting.
-    std::transform(add_buffer.begin(), add_buffer.begin() + frame_length,
-                   audio_frame_for_mixing->mutable_data(), [](int32_t a) {
-                     return rtc::saturated_cast<int16_t>(a / 2);
-                   });
-
-    // Smoothly limit the audio.
-    RTC_DCHECK(limiter);
-    const int error = limiter->ProcessStream(audio_frame_for_mixing);
-    if (error != limiter->kNoError) {
-      LOG_F(LS_ERROR) << "Error from AudioProcessing: " << error;
-      RTC_NOTREACHED();
-    }
-
-    // And now we can safely restore the level. This procedure results in
-    // some loss of resolution, deemed acceptable.
-    //
-    // It's possible to apply the gain in the AGC (with a target level of 0 dbFS
-    // and compression gain of 6 dB). However, in the transition frame when this
-    // is enabled (moving from one to two audio sources) it has the potential to
-    // create discontinuities in the mixed frame.
-    //
-    // Instead we double the frame (with addition since left-shifting a
-    // negative value is undefined).
-    AudioFrameOperations::Add(*audio_frame_for_mixing, audio_frame_for_mixing);
-  } else {
-    std::transform(add_buffer.begin(), add_buffer.begin() + frame_length,
-                   audio_frame_for_mixing->mutable_data(),
-                   [](int32_t a) { return rtc::saturated_cast<int16_t>(a); });
-  }
-}
-
-std::unique_ptr<AudioProcessing> CreateLimiter() {
-  Config config;
-  config.Set<ExperimentalAgc>(new ExperimentalAgc(false));
-
-  std::unique_ptr<AudioProcessing> limiter(AudioProcessing::Create(config));
-  RTC_DCHECK(limiter);
-
-  webrtc::AudioProcessing::Config apm_config;
-  apm_config.residual_echo_detector.enabled = false;
-  limiter->ApplyConfig(apm_config);
-
-  const auto check_no_error = [](int x) {
-    RTC_DCHECK_EQ(x, AudioProcessing::kNoError);
-  };
-  auto* const gain_control = limiter->gain_control();
-  check_no_error(gain_control->set_mode(GainControl::kFixedDigital));
-
-  // We smoothly limit the mixed frame to -7 dbFS. -6 would correspond to the
-  // divide-by-2 but -7 is used instead to give a bit of headroom since the
-  // AGC is not a hard limiter.
-  check_no_error(gain_control->set_target_level_dbfs(7));
-
-  check_no_error(gain_control->set_compression_gain_db(0));
-  check_no_error(gain_control->enable_limiter(true));
-  check_no_error(gain_control->Enable(true));
-  return limiter;
-}
-}  // namespace
-
-FrameCombiner::FrameCombiner(bool use_apm_limiter)
-    : use_apm_limiter_(use_apm_limiter),
-      limiter_(use_apm_limiter ? CreateLimiter() : nullptr) {}
-
-FrameCombiner::~FrameCombiner() = default;
-
-void FrameCombiner::Combine(const std::vector<AudioFrame*>& mix_list,
-                            size_t number_of_channels,
-                            int sample_rate,
-                            size_t number_of_streams,
-                            AudioFrame* audio_frame_for_mixing) const {
-  RTC_DCHECK(audio_frame_for_mixing);
-  const size_t samples_per_channel = static_cast<size_t>(
-      (sample_rate * webrtc::AudioMixerImpl::kFrameDurationInMs) / 1000);
-
-  for (const auto* frame : mix_list) {
-    RTC_DCHECK_EQ(samples_per_channel, frame->samples_per_channel_);
-    RTC_DCHECK_EQ(sample_rate, frame->sample_rate_hz_);
-  }
-
-  // Frames could be both stereo and mono.
-  for (auto* frame : mix_list) {
-    RemixFrame(number_of_channels, frame);
-  }
-
-  // TODO(aleloi): Issue bugs.webrtc.org/3390.
-  // Audio frame timestamp. The 'timestamp_' field is set to dummy
-  // value '0', because it is only supported in the one channel case and
-  // is then updated in the helper functions.
-  audio_frame_for_mixing->UpdateFrame(
-      -1, 0, nullptr, samples_per_channel, sample_rate, AudioFrame::kUndefined,
-      AudioFrame::kVadUnknown, number_of_channels);
-
-  const bool use_limiter_this_round = use_apm_limiter_ && number_of_streams > 1;
-
-  if (mix_list.empty()) {
-    CombineZeroFrames(use_limiter_this_round, limiter_.get(),
-                      audio_frame_for_mixing);
-  } else if (mix_list.size() == 1) {
-    CombineOneFrame(mix_list.front(), use_limiter_this_round, limiter_.get(),
-                    audio_frame_for_mixing);
-  } else {
-    std::vector<rtc::ArrayView<const int16_t>> input_frames;
-    for (size_t i = 0; i < mix_list.size(); ++i) {
-      input_frames.push_back(rtc::ArrayView<const int16_t>(
-          mix_list[i]->data(), samples_per_channel * number_of_channels));
-    }
-    CombineMultipleFrames(input_frames, use_limiter_this_round, limiter_.get(),
-                          audio_frame_for_mixing);
-  }
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_mixer/frame_combiner.h b/modules/audio_mixer/frame_combiner.h
deleted file mode 100644
index 7b7e240..0000000
--- a/modules/audio_mixer/frame_combiner.h
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- *  Copyright (c) 2017 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_MIXER_FRAME_COMBINER_H_
-#define WEBRTC_MODULES_AUDIO_MIXER_FRAME_COMBINER_H_
-
-#include <memory>
-#include <vector>
-
-#include "webrtc/modules/audio_processing/include/audio_processing.h"
-#include "webrtc/modules/include/module_common_types.h"
-
-namespace webrtc {
-
-class FrameCombiner {
- public:
-  explicit FrameCombiner(bool use_apm_limiter);
-  ~FrameCombiner();
-
-  // Combine several frames into one. Assumes sample_rate,
-  // samples_per_channel of the input frames match the parameters. The
-  // parameters 'number_of_channels' and 'sample_rate' are needed
-  // because 'mix_list' can be empty. The parameter
-  // 'number_of_streams' is used for determining whether to pass the
-  // data through a limiter.
-  void Combine(const std::vector<AudioFrame*>& mix_list,
-               size_t number_of_channels,
-               int sample_rate,
-               size_t number_of_streams,
-               AudioFrame* audio_frame_for_mixing) const;
-
- private:
-  const bool use_apm_limiter_;
-  std::unique_ptr<AudioProcessing> limiter_;
-};
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_MIXER_FRAME_COMBINER_H_
diff --git a/modules/audio_mixer/frame_combiner_unittest.cc b/modules/audio_mixer/frame_combiner_unittest.cc
deleted file mode 100644
index fc048d0..0000000
--- a/modules/audio_mixer/frame_combiner_unittest.cc
+++ /dev/null
@@ -1,206 +0,0 @@
-/*
- *  Copyright (c) 2017 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_mixer/frame_combiner.h"
-
-#include <numeric>
-#include <sstream>
-#include <string>
-
-#include "webrtc/audio/utility/audio_frame_operations.h"
-#include "webrtc/modules/audio_mixer/gain_change_calculator.h"
-#include "webrtc/modules/audio_mixer/sine_wave_generator.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-namespace {
-std::string ProduceDebugText(int sample_rate_hz,
-                             int number_of_channels,
-                             int number_of_sources) {
-  std::ostringstream ss;
-  ss << "Sample rate: " << sample_rate_hz << " ,";
-  ss << "number of channels: " << number_of_channels << " ,";
-  ss << "number of sources: " << number_of_sources;
-  return ss.str();
-}
-
-std::string ProduceDebugText(int sample_rate_hz,
-                             int number_of_channels,
-                             int number_of_sources,
-                             bool limiter_active,
-                             float wave_frequency) {
-  std::ostringstream ss;
-  ss << "Sample rate: " << sample_rate_hz << " ,";
-  ss << "number of channels: " << number_of_channels << " ,";
-  ss << "number of sources: " << number_of_sources << " ,";
-  ss << "limiter active: " << (limiter_active ? "true" : "false") << " ,";
-  ss << "wave frequency: " << wave_frequency << " ,";
-  return ss.str();
-}
-
-AudioFrame frame1;
-AudioFrame frame2;
-AudioFrame audio_frame_for_mixing;
-
-void SetUpFrames(int sample_rate_hz, int number_of_channels) {
-  for (auto* frame : {&frame1, &frame2}) {
-    frame->UpdateFrame(-1, 0, nullptr,
-                       rtc::CheckedDivExact(sample_rate_hz, 100),
-                       sample_rate_hz, AudioFrame::kNormalSpeech,
-                       AudioFrame::kVadActive, number_of_channels);
-  }
-}
-}  // namespace
-
-TEST(FrameCombiner, BasicApiCallsLimiter) {
-  FrameCombiner combiner(true);
-  for (const int rate : {8000, 16000, 32000, 48000}) {
-    for (const int number_of_channels : {1, 2}) {
-      const std::vector<AudioFrame*> all_frames = {&frame1, &frame2};
-      SetUpFrames(rate, number_of_channels);
-
-      for (const int number_of_frames : {0, 1, 2}) {
-        SCOPED_TRACE(
-            ProduceDebugText(rate, number_of_channels, number_of_frames));
-        const std::vector<AudioFrame*> frames_to_combine(
-            all_frames.begin(), all_frames.begin() + number_of_frames);
-        combiner.Combine(frames_to_combine, number_of_channels, rate,
-                         frames_to_combine.size(), &audio_frame_for_mixing);
-      }
-    }
-  }
-}
-
-// No APM limiter means no AudioProcessing::NativeRate restriction
-// on rate. The rate has to be divisible by 100 since we use
-// 10 ms frames, though.
-TEST(FrameCombiner, BasicApiCallsNoLimiter) {
-  FrameCombiner combiner(false);
-  for (const int rate : {8000, 10000, 11000, 32000, 44100}) {
-    for (const int number_of_channels : {1, 2}) {
-      const std::vector<AudioFrame*> all_frames = {&frame1, &frame2};
-      SetUpFrames(rate, number_of_channels);
-
-      for (const int number_of_frames : {0, 1, 2}) {
-        SCOPED_TRACE(
-            ProduceDebugText(rate, number_of_channels, number_of_frames));
-        const std::vector<AudioFrame*> frames_to_combine(
-            all_frames.begin(), all_frames.begin() + number_of_frames);
-        combiner.Combine(frames_to_combine, number_of_channels, rate,
-                         frames_to_combine.size(), &audio_frame_for_mixing);
-      }
-    }
-  }
-}
-
-TEST(FrameCombiner, CombiningZeroFramesShouldProduceSilence) {
-  FrameCombiner combiner(false);
-  for (const int rate : {8000, 10000, 11000, 32000, 44100}) {
-    for (const int number_of_channels : {1, 2}) {
-      SCOPED_TRACE(ProduceDebugText(rate, number_of_channels, 0));
-
-      const std::vector<AudioFrame*> frames_to_combine;
-      combiner.Combine(frames_to_combine, number_of_channels, rate,
-                       frames_to_combine.size(), &audio_frame_for_mixing);
-
-      const int16_t* audio_frame_for_mixing_data =
-          audio_frame_for_mixing.data();
-      const std::vector<int16_t> mixed_data(
-          audio_frame_for_mixing_data,
-          audio_frame_for_mixing_data + number_of_channels * rate / 100);
-
-      const std::vector<int16_t> expected(number_of_channels * rate / 100, 0);
-      EXPECT_EQ(mixed_data, expected);
-    }
-  }
-}
-
-TEST(FrameCombiner, CombiningOneFrameShouldNotChangeFrame) {
-  FrameCombiner combiner(false);
-  for (const int rate : {8000, 10000, 11000, 32000, 44100}) {
-    for (const int number_of_channels : {1, 2}) {
-      SCOPED_TRACE(ProduceDebugText(rate, number_of_channels, 1));
-
-      SetUpFrames(rate, number_of_channels);
-      int16_t* frame1_data = frame1.mutable_data();
-      std::iota(frame1_data, frame1_data + number_of_channels * rate / 100, 0);
-      const std::vector<AudioFrame*> frames_to_combine = {&frame1};
-      combiner.Combine(frames_to_combine, number_of_channels, rate,
-                       frames_to_combine.size(), &audio_frame_for_mixing);
-
-      const int16_t* audio_frame_for_mixing_data =
-          audio_frame_for_mixing.data();
-      const std::vector<int16_t> mixed_data(
-          audio_frame_for_mixing_data,
-          audio_frame_for_mixing_data + number_of_channels * rate / 100);
-
-      std::vector<int16_t> expected(number_of_channels * rate / 100);
-      std::iota(expected.begin(), expected.end(), 0);
-      EXPECT_EQ(mixed_data, expected);
-    }
-  }
-}
-
-// Send a sine wave through the FrameCombiner, and check that the
-// difference between input and output varies smoothly. This is to
-// catch issues like chromium:695993.
-TEST(FrameCombiner, GainCurveIsSmoothForAlternatingNumberOfStreams) {
-  // Test doesn't work with rates requiring a band split, because it
-  // introduces a small delay measured in single samples, and this
-  // test cannot handle it.
-  //
-  // TODO(aleloi): Add more rates when APM limiter doesn't use band
-  // split.
-  for (const bool use_limiter : {true, false}) {
-    for (const int rate : {8000, 16000}) {
-      constexpr int number_of_channels = 2;
-      for (const float wave_frequency : {50, 400, 3200}) {
-        SCOPED_TRACE(ProduceDebugText(rate, number_of_channels, 1, use_limiter,
-                                      wave_frequency));
-
-        FrameCombiner combiner(use_limiter);
-
-        constexpr int16_t wave_amplitude = 30000;
-        SineWaveGenerator wave_generator(wave_frequency, wave_amplitude);
-
-        GainChangeCalculator change_calculator;
-        float cumulative_change = 0.f;
-
-        constexpr size_t iterations = 100;
-
-        for (size_t i = 0; i < iterations; ++i) {
-          SetUpFrames(rate, number_of_channels);
-          wave_generator.GenerateNextFrame(&frame1);
-          AudioFrameOperations::Mute(&frame2);
-
-          std::vector<AudioFrame*> frames_to_combine = {&frame1};
-          if (i % 2 == 0) {
-            frames_to_combine.push_back(&frame2);
-          }
-          const size_t number_of_samples =
-              frame1.samples_per_channel_ * number_of_channels;
-
-          // Ensures limiter is on if 'use_limiter'.
-          constexpr size_t number_of_streams = 2;
-          combiner.Combine(frames_to_combine, number_of_channels, rate,
-                           number_of_streams, &audio_frame_for_mixing);
-          cumulative_change += change_calculator.CalculateGainChange(
-              rtc::ArrayView<const int16_t>(frame1.data(), number_of_samples),
-              rtc::ArrayView<const int16_t>(audio_frame_for_mixing.data(),
-                                            number_of_samples));
-        }
-        RTC_DCHECK_LT(cumulative_change, 10);
-      }
-    }
-  }
-}
-}  // namespace webrtc
diff --git a/modules/audio_mixer/gain_change_calculator.cc b/modules/audio_mixer/gain_change_calculator.cc
deleted file mode 100644
index 13017d4..0000000
--- a/modules/audio_mixer/gain_change_calculator.cc
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- *  Copyright (c) 2017 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_mixer/gain_change_calculator.h"
-
-#include <math.h>
-#include <vector>
-
-namespace webrtc {
-
-namespace {
-constexpr int16_t kReliabilityThreshold = 100;
-}  // namespace
-
-float GainChangeCalculator::CalculateGainChange(
-    rtc::ArrayView<const int16_t> in,
-    rtc::ArrayView<const int16_t> out) {
-  RTC_DCHECK_EQ(in.size(), out.size());
-
-  std::vector<float> gain(in.size());
-  CalculateGain(in, out, gain);
-  return CalculateDifferences(gain);
-}
-
-void GainChangeCalculator::CalculateGain(rtc::ArrayView<const int16_t> in,
-                                         rtc::ArrayView<const int16_t> out,
-                                         rtc::ArrayView<float> gain) {
-  RTC_DCHECK_EQ(in.size(), out.size());
-  RTC_DCHECK_EQ(in.size(), gain.size());
-
-  for (size_t i = 0; i < in.size(); ++i) {
-    if (std::abs(in[i]) >= kReliabilityThreshold) {
-      last_reliable_gain_ = out[i] / static_cast<float>(in[i]);
-    }
-    gain[i] = last_reliable_gain_;
-  }
-}
-
-float GainChangeCalculator::CalculateDifferences(
-    rtc::ArrayView<const float> values) {
-  float res = 0;
-  for (float f : values) {
-    res += fabs(f - last_value_);
-    last_value_ = f;
-  }
-  return res;
-}
-}  // namespace webrtc
diff --git a/modules/audio_mixer/gain_change_calculator.h b/modules/audio_mixer/gain_change_calculator.h
deleted file mode 100644
index e234384..0000000
--- a/modules/audio_mixer/gain_change_calculator.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- *  Copyright (c) 2017 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_MIXER_GAIN_CHANGE_CALCULATOR_H_
-#define WEBRTC_MODULES_AUDIO_MIXER_GAIN_CHANGE_CALCULATOR_H_
-
-#include "webrtc/api/array_view.h"
-
-namespace webrtc {
-
-class GainChangeCalculator {
- public:
-  // The 'out' signal is assumed to be produced from 'in' by applying
-  // a smoothly varying gain. This method computes variations of the
-  // gain and handles special cases when the samples are small.
-  float CalculateGainChange(rtc::ArrayView<const int16_t> in,
-                            rtc::ArrayView<const int16_t> out);
-
- private:
-  void CalculateGain(rtc::ArrayView<const int16_t> in,
-                     rtc::ArrayView<const int16_t> out,
-                     rtc::ArrayView<float> gain);
-
-  float CalculateDifferences(rtc::ArrayView<const float> values);
-  float last_value_ = 0.f;
-  float last_reliable_gain_ = 1.0f;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_MIXER_GAIN_CHANGE_CALCULATOR_H_
diff --git a/modules/audio_mixer/output_rate_calculator.h b/modules/audio_mixer/output_rate_calculator.h
deleted file mode 100644
index f9c7e1d..0000000
--- a/modules/audio_mixer/output_rate_calculator.h
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- *  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_MIXER_OUTPUT_RATE_CALCULATOR_H_
-#define WEBRTC_MODULES_AUDIO_MIXER_OUTPUT_RATE_CALCULATOR_H_
-
-#include <vector>
-
-namespace webrtc {
-
-// Decides the sample rate of a mixing iteration given the preferred
-// sample rates of the sources.
-class OutputRateCalculator {
- public:
-  virtual int CalculateOutputRate(
-      const std::vector<int>& preferred_sample_rates) = 0;
-  virtual ~OutputRateCalculator() {}
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_MIXER_OUTPUT_RATE_CALCULATOR_H_
diff --git a/modules/audio_mixer/sine_wave_generator.cc b/modules/audio_mixer/sine_wave_generator.cc
deleted file mode 100644
index e3acfe4..0000000
--- a/modules/audio_mixer/sine_wave_generator.cc
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- *  Copyright (c) 2017 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_mixer/sine_wave_generator.h"
-
-#include <math.h>
-
-#include "webrtc/rtc_base/safe_conversions.h"
-
-namespace webrtc {
-
-namespace {
-constexpr float kPi = 3.14159265f;
-}  // namespace
-
-void SineWaveGenerator::GenerateNextFrame(AudioFrame* frame) {
-  RTC_DCHECK(frame);
-  int16_t* frame_data = frame->mutable_data();
-  for (size_t i = 0; i < frame->samples_per_channel_; ++i) {
-    for (size_t ch = 0; ch < frame->num_channels_; ++ch) {
-      frame_data[frame->num_channels_ * i + ch] =
-          rtc::saturated_cast<int16_t>(amplitude_ * sinf(phase_));
-    }
-    phase_ += wave_frequency_hz_ * 2 * kPi / frame->sample_rate_hz_;
-  }
-}
-}  // namespace webrtc
diff --git a/modules/audio_mixer/sine_wave_generator.h b/modules/audio_mixer/sine_wave_generator.h
deleted file mode 100644
index 910f5ae..0000000
--- a/modules/audio_mixer/sine_wave_generator.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- *  Copyright (c) 2017 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_MIXER_SINE_WAVE_GENERATOR_H_
-#define WEBRTC_MODULES_AUDIO_MIXER_SINE_WAVE_GENERATOR_H_
-
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-
-class SineWaveGenerator {
- public:
-  SineWaveGenerator(float wave_frequency_hz, int16_t amplitude)
-      : wave_frequency_hz_(wave_frequency_hz), amplitude_(amplitude) {
-    RTC_DCHECK_GT(wave_frequency_hz, 0);
-  }
-
-  // Produces appropriate output based on frame->num_channels_,
-  // frame->sample_rate_hz_.
-  void GenerateNextFrame(AudioFrame* frame);
-
- private:
-  float phase_ = 0.f;
-  const float wave_frequency_hz_;
-  const int16_t amplitude_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_MIXER_SINE_WAVE_GENERATOR_H_
diff --git a/modules/audio_processing/BUILD.gn b/modules/audio_processing/BUILD.gn
deleted file mode 100644
index 3f8b70a..0000000
--- a/modules/audio_processing/BUILD.gn
+++ /dev/null
@@ -1,883 +0,0 @@
-# Copyright (c) 2014 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.
-
-import("//build/config/arm.gni")
-import("//third_party/protobuf/proto_library.gni")
-import("../../webrtc.gni")
-
-declare_args() {
-  # Disables the usual mode where we trust the reported system delay
-  # values the AEC receives. The corresponding define is set appropriately
-  # in the code, but it can be force-enabled here for testing.
-  aec_untrusted_delay_for_testing = false
-}
-
-rtc_static_library("audio_processing") {
-  sources = [
-    "aec/aec_core.cc",
-    "aec/aec_core.h",
-    "aec/aec_core_optimized_methods.h",
-    "aec/aec_resampler.cc",
-    "aec/aec_resampler.h",
-    "aec/echo_cancellation.cc",
-    "aec/echo_cancellation.h",
-    "aec3/adaptive_fir_filter.cc",
-    "aec3/adaptive_fir_filter.h",
-    "aec3/aec3_common.cc",
-    "aec3/aec3_common.h",
-    "aec3/aec3_fft.cc",
-    "aec3/aec3_fft.h",
-    "aec3/aec_state.cc",
-    "aec3/aec_state.h",
-    "aec3/block_framer.cc",
-    "aec3/block_framer.h",
-    "aec3/block_processor.cc",
-    "aec3/block_processor.h",
-    "aec3/block_processor_metrics.cc",
-    "aec3/block_processor_metrics.h",
-    "aec3/cascaded_biquad_filter.cc",
-    "aec3/cascaded_biquad_filter.h",
-    "aec3/comfort_noise_generator.cc",
-    "aec3/comfort_noise_generator.h",
-    "aec3/decimator_by_4.cc",
-    "aec3/decimator_by_4.h",
-    "aec3/downsampled_render_buffer.cc",
-    "aec3/downsampled_render_buffer.h",
-    "aec3/echo_canceller3.cc",
-    "aec3/echo_canceller3.h",
-    "aec3/echo_path_delay_estimator.cc",
-    "aec3/echo_path_delay_estimator.h",
-    "aec3/echo_path_variability.cc",
-    "aec3/echo_path_variability.h",
-    "aec3/echo_remover.cc",
-    "aec3/echo_remover.h",
-    "aec3/echo_remover_metrics.cc",
-    "aec3/echo_remover_metrics.h",
-    "aec3/erl_estimator.cc",
-    "aec3/erl_estimator.h",
-    "aec3/erle_estimator.cc",
-    "aec3/erle_estimator.h",
-    "aec3/fft_data.h",
-    "aec3/frame_blocker.cc",
-    "aec3/frame_blocker.h",
-    "aec3/main_filter_update_gain.cc",
-    "aec3/main_filter_update_gain.h",
-    "aec3/matched_filter.cc",
-    "aec3/matched_filter.h",
-    "aec3/matched_filter_lag_aggregator.cc",
-    "aec3/matched_filter_lag_aggregator.h",
-    "aec3/output_selector.cc",
-    "aec3/output_selector.h",
-    "aec3/render_buffer.cc",
-    "aec3/render_buffer.h",
-    "aec3/render_delay_buffer.cc",
-    "aec3/render_delay_buffer.h",
-    "aec3/render_delay_controller.cc",
-    "aec3/render_delay_controller.h",
-    "aec3/render_delay_controller_metrics.cc",
-    "aec3/render_delay_controller_metrics.h",
-    "aec3/render_signal_analyzer.cc",
-    "aec3/render_signal_analyzer.h",
-    "aec3/residual_echo_estimator.cc",
-    "aec3/residual_echo_estimator.h",
-    "aec3/shadow_filter_update_gain.cc",
-    "aec3/shadow_filter_update_gain.h",
-    "aec3/subtractor.cc",
-    "aec3/subtractor.h",
-    "aec3/subtractor_output.h",
-    "aec3/suppression_filter.cc",
-    "aec3/suppression_filter.h",
-    "aec3/suppression_gain.cc",
-    "aec3/suppression_gain.h",
-    "aec3/vector_math.h",
-    "aecm/aecm_core.cc",
-    "aecm/aecm_core.h",
-    "aecm/echo_control_mobile.cc",
-    "aecm/echo_control_mobile.h",
-    "agc/agc.cc",
-    "agc/agc.h",
-    "agc/agc_manager_direct.cc",
-    "agc/agc_manager_direct.h",
-    "agc/gain_map_internal.h",
-    "agc/loudness_histogram.cc",
-    "agc/loudness_histogram.h",
-    "agc/utility.cc",
-    "agc/utility.h",
-    "agc2/digital_gain_applier.cc",
-    "agc2/digital_gain_applier.h",
-    "agc2/gain_controller2.cc",
-    "agc2/gain_controller2.h",
-    "audio_buffer.cc",
-    "audio_buffer.h",
-    "audio_processing_impl.cc",
-    "audio_processing_impl.h",
-    "beamformer/array_util.cc",
-    "beamformer/array_util.h",
-    "beamformer/complex_matrix.h",
-    "beamformer/covariance_matrix_generator.cc",
-    "beamformer/covariance_matrix_generator.h",
-    "beamformer/matrix.h",
-    "beamformer/nonlinear_beamformer.cc",
-    "beamformer/nonlinear_beamformer.h",
-    "common.h",
-    "echo_cancellation_impl.cc",
-    "echo_cancellation_impl.h",
-    "echo_control_mobile_impl.cc",
-    "echo_control_mobile_impl.h",
-    "echo_detector/circular_buffer.cc",
-    "echo_detector/circular_buffer.h",
-    "echo_detector/mean_variance_estimator.cc",
-    "echo_detector/mean_variance_estimator.h",
-    "echo_detector/moving_max.cc",
-    "echo_detector/moving_max.h",
-    "echo_detector/normalized_covariance_estimator.cc",
-    "echo_detector/normalized_covariance_estimator.h",
-    "gain_control_for_experimental_agc.cc",
-    "gain_control_for_experimental_agc.h",
-    "gain_control_impl.cc",
-    "gain_control_impl.h",
-    "include/audio_processing.cc",
-    "include/audio_processing.h",
-    "include/config.cc",
-    "include/config.h",
-    "level_controller/biquad_filter.cc",
-    "level_controller/biquad_filter.h",
-    "level_controller/down_sampler.cc",
-    "level_controller/down_sampler.h",
-    "level_controller/gain_applier.cc",
-    "level_controller/gain_applier.h",
-    "level_controller/gain_selector.cc",
-    "level_controller/gain_selector.h",
-    "level_controller/level_controller.cc",
-    "level_controller/level_controller.h",
-    "level_controller/level_controller_constants.h",
-    "level_controller/noise_level_estimator.cc",
-    "level_controller/noise_level_estimator.h",
-    "level_controller/noise_spectrum_estimator.cc",
-    "level_controller/noise_spectrum_estimator.h",
-    "level_controller/peak_level_estimator.cc",
-    "level_controller/peak_level_estimator.h",
-    "level_controller/saturating_gain_estimator.cc",
-    "level_controller/saturating_gain_estimator.h",
-    "level_controller/signal_classifier.cc",
-    "level_controller/signal_classifier.h",
-    "level_estimator_impl.cc",
-    "level_estimator_impl.h",
-    "logging/apm_data_dumper.cc",
-    "logging/apm_data_dumper.h",
-    "low_cut_filter.cc",
-    "low_cut_filter.h",
-    "noise_suppression_impl.cc",
-    "noise_suppression_impl.h",
-    "render_queue_item_verifier.h",
-    "residual_echo_detector.cc",
-    "residual_echo_detector.h",
-    "rms_level.cc",
-    "rms_level.h",
-    "splitting_filter.cc",
-    "splitting_filter.h",
-    "three_band_filter_bank.cc",
-    "three_band_filter_bank.h",
-    "transient/common.h",
-    "transient/daubechies_8_wavelet_coeffs.h",
-    "transient/dyadic_decimator.h",
-    "transient/moving_moments.cc",
-    "transient/moving_moments.h",
-    "transient/transient_detector.cc",
-    "transient/transient_detector.h",
-    "transient/transient_suppressor.cc",
-    "transient/transient_suppressor.h",
-    "transient/wpd_node.cc",
-    "transient/wpd_node.h",
-    "transient/wpd_tree.cc",
-    "transient/wpd_tree.h",
-    "typing_detection.cc",
-    "typing_detection.h",
-    "utility/block_mean_calculator.cc",
-    "utility/block_mean_calculator.h",
-    "utility/delay_estimator.cc",
-    "utility/delay_estimator.h",
-    "utility/delay_estimator_internal.h",
-    "utility/delay_estimator_wrapper.cc",
-    "utility/delay_estimator_wrapper.h",
-    "utility/ooura_fft.cc",
-    "utility/ooura_fft.h",
-    "utility/ooura_fft_tables_common.h",
-    "vad/common.h",
-    "vad/gmm.cc",
-    "vad/gmm.h",
-    "vad/noise_gmm_tables.h",
-    "vad/pitch_based_vad.cc",
-    "vad/pitch_based_vad.h",
-    "vad/pitch_internal.cc",
-    "vad/pitch_internal.h",
-    "vad/pole_zero_filter.cc",
-    "vad/pole_zero_filter.h",
-    "vad/standalone_vad.cc",
-    "vad/standalone_vad.h",
-    "vad/vad_audio_proc.cc",
-    "vad/vad_audio_proc.h",
-    "vad/vad_audio_proc_internal.h",
-    "vad/vad_circular_buffer.cc",
-    "vad/vad_circular_buffer.h",
-    "vad/voice_activity_detector.cc",
-    "vad/voice_activity_detector.h",
-    "vad/voice_gmm_tables.h",
-    "voice_detection_impl.cc",
-    "voice_detection_impl.h",
-  ]
-
-  defines = []
-  deps = [
-    ":aec_dump_interface",
-    "..:module_api",
-    "../..:webrtc_common",
-    "../../api:array_view",
-    "../../api:optional",
-    "../../audio/utility:audio_frame_operations",
-    "../../rtc_base:gtest_prod",
-    "../../rtc_base:protobuf_utils",
-    "../audio_coding:isac",
-  ]
-  public_deps = [
-    ":audio_processing_c",
-  ]
-
-  if (apm_debug_dump) {
-    defines += [ "WEBRTC_APM_DEBUG_DUMP=1" ]
-  } else {
-    defines += [ "WEBRTC_APM_DEBUG_DUMP=0" ]
-  }
-
-  if (aec_untrusted_delay_for_testing) {
-    defines += [ "WEBRTC_UNTRUSTED_DELAY" ]
-  }
-
-  if (rtc_enable_protobuf) {
-    defines += [ "WEBRTC_AUDIOPROC_DEBUG_DUMP" ]
-    deps += [ ":audioproc_debug_proto" ]
-  }
-
-  if (rtc_enable_intelligibility_enhancer) {
-    defines += [ "WEBRTC_INTELLIGIBILITY_ENHANCER=1" ]
-    sources += [
-      "intelligibility/intelligibility_enhancer.cc",
-      "intelligibility/intelligibility_enhancer.h",
-      "intelligibility/intelligibility_utils.cc",
-      "intelligibility/intelligibility_utils.h",
-    ]
-  } else {
-    defines += [ "WEBRTC_INTELLIGIBILITY_ENHANCER=0" ]
-  }
-
-  if (rtc_prefer_fixed_point) {
-    defines += [ "WEBRTC_NS_FIXED" ]
-  } else {
-    defines += [ "WEBRTC_NS_FLOAT" ]
-  }
-
-  if (current_cpu == "x86" || current_cpu == "x64") {
-    deps += [ ":audio_processing_sse2" ]
-  }
-
-  if (rtc_build_with_neon) {
-    deps += [ ":audio_processing_neon" ]
-  }
-
-  if (current_cpu == "mipsel") {
-    sources += [ "aecm/aecm_core_mips.cc" ]
-    if (mips_float_abi == "hard") {
-      sources += [
-        "aec/aec_core_mips.cc",
-        "utility/ooura_fft_mips.cc",
-      ]
-    }
-  } else {
-    sources += [ "aecm/aecm_core_c.cc" ]
-  }
-
-  # TODO(jschuh): Bug 1348: fix this warning.
-  configs += [ "//build/config/compiler:no_size_t_to_int_warning" ]
-
-  deps += [
-    "../../common_audio",
-    "../../rtc_base:rtc_base_approved",
-    "../../system_wrappers",
-  ]
-}
-
-rtc_source_set("aec_dump_interface") {
-  sources = [
-    "include/aec_dump.cc",
-    "include/aec_dump.h",
-  ]
-
-  deps = [
-    "../../api:array_view",
-    "../../rtc_base:rtc_base_approved",
-  ]
-}
-
-rtc_source_set("audio_processing_c") {
-  visibility = [ ":*" ]  # Only targets in this file can depend on this.
-  sources = [
-    "agc/legacy/analog_agc.c",
-    "agc/legacy/analog_agc.h",
-    "agc/legacy/digital_agc.c",
-    "agc/legacy/digital_agc.h",
-    "agc/legacy/gain_control.h",
-  ]
-
-  if (rtc_prefer_fixed_point) {
-    sources += [
-      "ns/noise_suppression_x.c",
-      "ns/noise_suppression_x.h",
-      "ns/nsx_core.c",
-      "ns/nsx_core.h",
-      "ns/nsx_defines.h",
-    ]
-    if (current_cpu == "mipsel") {
-      sources += [ "ns/nsx_core_mips.c" ]
-    } else {
-      sources += [ "ns/nsx_core_c.c" ]
-    }
-  } else {
-    sources += [
-      "ns/defines.h",
-      "ns/noise_suppression.c",
-      "ns/noise_suppression.h",
-      "ns/ns_core.c",
-      "ns/ns_core.h",
-      "ns/windows_private.h",
-    ]
-  }
-
-  deps = [
-    "../..:webrtc_common",
-    "../../common_audio",
-    "../../rtc_base:rtc_base_approved",
-    "../../system_wrappers",
-  ]
-
-  if (rtc_build_with_neon) {
-    deps += [ ":audio_processing_neon_c" ]
-  }
-}
-
-if (rtc_enable_protobuf) {
-  proto_library("audioproc_debug_proto") {
-    sources = [
-      "debug.proto",
-    ]
-
-    proto_out_dir = "webrtc/modules/audio_processing"
-  }
-}
-
-if (current_cpu == "x86" || current_cpu == "x64") {
-  rtc_static_library("audio_processing_sse2") {
-    # TODO(ehmaldonado): Remove (bugs.webrtc.org/6828)
-    # Errors on cyclic dependency with :audio_processing if enabled.
-    check_includes = false
-
-    sources = [
-      "aec/aec_core_sse2.cc",
-      "utility/ooura_fft_sse2.cc",
-      "utility/ooura_fft_tables_neon_sse2.h",
-    ]
-
-    if (is_posix) {
-      cflags = [ "-msse2" ]
-    }
-
-    if (apm_debug_dump) {
-      defines = [ "WEBRTC_APM_DEBUG_DUMP=1" ]
-    } else {
-      defines = [ "WEBRTC_APM_DEBUG_DUMP=0" ]
-    }
-  }
-}
-
-if (rtc_build_with_neon) {
-  rtc_static_library("audio_processing_neon") {
-    # TODO(ehmaldonado): Remove (bugs.webrtc.org/6828)
-    # Errors on cyclic dependency with :audio_processing if enabled.
-    check_includes = false
-
-    sources = [
-      "aec/aec_core_neon.cc",
-      "aecm/aecm_core_neon.cc",
-      "utility/ooura_fft_neon.cc",
-      "utility/ooura_fft_tables_neon_sse2.h",
-    ]
-
-    if (current_cpu != "arm64") {
-      # Enable compilation for the NEON instruction set. This is needed
-      # since //build/config/arm.gni only enables NEON for iOS, not Android.
-      # This provides the same functionality as webrtc/build/arm_neon.gypi.
-      suppressed_configs += [ "//build/config/compiler:compiler_arm_fpu" ]
-      cflags = [ "-mfpu=neon" ]
-    }
-
-    # Disable LTO on NEON targets due to compiler bug.
-    # TODO(fdegans): Enable this. See crbug.com/408997.
-    if (rtc_use_lto) {
-      cflags -= [
-        "-flto",
-        "-ffat-lto-objects",
-      ]
-    }
-
-    deps = [
-      "../../common_audio",
-    ]
-    public_deps = [
-      ":audio_processing_neon_c",
-    ]
-
-    if (apm_debug_dump) {
-      defines = [ "WEBRTC_APM_DEBUG_DUMP=1" ]
-    } else {
-      defines = [ "WEBRTC_APM_DEBUG_DUMP=0" ]
-    }
-  }
-
-  rtc_static_library("audio_processing_neon_c") {
-    # TODO(mbonadei): Remove (bugs.webrtc.org/6828)
-    # Errors on cyclic dependency with :audio_processing_c if enabled.
-    check_includes = false
-
-    sources = [
-      "ns/nsx_core_neon.c",
-    ]
-
-    if (current_cpu != "arm64") {
-      # Enable compilation for the NEON instruction set. This is needed
-      # since //build/config/arm.gni only enables NEON for iOS, not Android.
-      # This provides the same functionality as webrtc/build/arm_neon.gypi.
-      suppressed_configs += [ "//build/config/compiler:compiler_arm_fpu" ]
-      cflags = [ "-mfpu=neon" ]
-    }
-
-    # Disable LTO on NEON targets due to compiler bug.
-    # TODO(fdegans): Enable this. See crbug.com/408997.
-    if (rtc_use_lto) {
-      cflags -= [
-        "-flto",
-        "-ffat-lto-objects",
-      ]
-    }
-    deps = [
-      "../../rtc_base:rtc_base_approved",
-    ]
-  }
-}
-
-if (rtc_include_tests) {
-  group("audio_processing_tests") {
-    testonly = true
-    public_deps = [
-      ":audioproc_test_utils",
-      ":click_annotate",
-      ":nonlinear_beamformer_test",
-      ":transient_suppression_test",
-    ]
-
-    if (rtc_enable_intelligibility_enhancer) {
-      public_deps += [ ":intelligibility_proc" ]
-    }
-
-    if (rtc_enable_protobuf) {
-      public_deps += [
-        ":audioproc_f",
-        ":audioproc_unittest_proto",
-        ":unpack_aecdump",
-        "test/conversational_speech",
-        "test/py_quality_assessment",
-      ]
-    }
-  }
-
-  rtc_source_set("audio_processing_unittests") {
-    testonly = true
-
-    # Skip restricting visibility on mobile platforms since the tests on those
-    # gets additional generated targets which would require many lines here to
-    # cover (which would be confusing to read and hard to maintain).
-    if (!is_android && !is_ios) {
-      visibility = [ "..:modules_unittests" ]
-    }
-    sources = [
-      "aec/echo_cancellation_unittest.cc",
-      "aec/system_delay_unittest.cc",
-      "agc/agc_manager_direct_unittest.cc",
-      "agc/loudness_histogram_unittest.cc",
-      "agc/mock_agc.h",
-      "audio_buffer_unittest.cc",
-      "beamformer/array_util_unittest.cc",
-      "beamformer/complex_matrix_unittest.cc",
-      "beamformer/covariance_matrix_generator_unittest.cc",
-      "beamformer/matrix_unittest.cc",
-      "beamformer/mock_nonlinear_beamformer.h",
-      "config_unittest.cc",
-      "echo_cancellation_impl_unittest.cc",
-      "splitting_filter_unittest.cc",
-      "transient/dyadic_decimator_unittest.cc",
-      "transient/file_utils.cc",
-      "transient/file_utils.h",
-      "transient/file_utils_unittest.cc",
-      "transient/moving_moments_unittest.cc",
-      "transient/transient_detector_unittest.cc",
-      "transient/transient_suppressor_unittest.cc",
-      "transient/wpd_node_unittest.cc",
-      "transient/wpd_tree_unittest.cc",
-      "utility/block_mean_calculator_unittest.cc",
-      "utility/delay_estimator_unittest.cc",
-      "vad/gmm_unittest.cc",
-      "vad/pitch_based_vad_unittest.cc",
-      "vad/pitch_internal_unittest.cc",
-      "vad/pole_zero_filter_unittest.cc",
-      "vad/standalone_vad_unittest.cc",
-      "vad/vad_audio_proc_unittest.cc",
-      "vad/vad_circular_buffer_unittest.cc",
-      "vad/voice_activity_detector_unittest.cc",
-    ]
-
-    deps = [
-      ":audio_processing",
-      ":audioproc_test_utils",
-      "..:module_api",
-      "../..:webrtc_common",
-      "../../api:array_view",
-      "../../api:optional",
-      "../../common_audio:common_audio",
-      "../../rtc_base:gtest_prod",
-      "../../rtc_base:protobuf_utils",
-      "../../rtc_base:rtc_base",
-      "../../rtc_base:rtc_base_approved",
-      "../../system_wrappers:system_wrappers",
-      "../../test:test_support",
-      "../audio_coding:neteq_tools",
-      "aec_dump:mock_aec_dump_unittests",
-      "test/conversational_speech:unittest",
-      "//testing/gmock",
-      "//testing/gtest",
-    ]
-
-    defines = []
-
-    if (apm_debug_dump) {
-      defines += [ "WEBRTC_APM_DEBUG_DUMP=1" ]
-    } else {
-      defines += [ "WEBRTC_APM_DEBUG_DUMP=0" ]
-    }
-
-    if (rtc_enable_intelligibility_enhancer) {
-      defines += [ "WEBRTC_INTELLIGIBILITY_ENHANCER=1" ]
-      sources += [
-        "intelligibility/intelligibility_enhancer_unittest.cc",
-        "intelligibility/intelligibility_utils_unittest.cc",
-      ]
-    } else {
-      defines += [ "WEBRTC_INTELLIGIBILITY_ENHANCER=0" ]
-    }
-
-    if (rtc_prefer_fixed_point) {
-      defines += [ "WEBRTC_AUDIOPROC_FIXED_PROFILE" ]
-    } else {
-      defines += [ "WEBRTC_AUDIOPROC_FLOAT_PROFILE" ]
-    }
-
-    if (rtc_enable_protobuf) {
-      defines += [ "WEBRTC_AUDIOPROC_DEBUG_DUMP" ]
-      deps += [
-        ":audioproc_debug_proto",
-        ":audioproc_protobuf_utils",
-        ":audioproc_test_utils",
-        ":audioproc_unittest_proto",
-        "../../rtc_base:rtc_task_queue",
-        "aec_dump",
-        "aec_dump:aec_dump_unittests",
-      ]
-      sources += [
-        "aec3/adaptive_fir_filter_unittest.cc",
-        "aec3/aec3_fft_unittest.cc",
-        "aec3/aec_state_unittest.cc",
-        "aec3/block_framer_unittest.cc",
-        "aec3/block_processor_metrics_unittest.cc",
-        "aec3/block_processor_unittest.cc",
-        "aec3/cascaded_biquad_filter_unittest.cc",
-        "aec3/comfort_noise_generator_unittest.cc",
-        "aec3/decimator_by_4_unittest.cc",
-        "aec3/echo_canceller3_unittest.cc",
-        "aec3/echo_path_delay_estimator_unittest.cc",
-        "aec3/echo_path_variability_unittest.cc",
-        "aec3/echo_remover_metrics_unittest.cc",
-        "aec3/echo_remover_unittest.cc",
-        "aec3/erl_estimator_unittest.cc",
-        "aec3/erle_estimator_unittest.cc",
-        "aec3/fft_data_unittest.cc",
-        "aec3/frame_blocker_unittest.cc",
-        "aec3/main_filter_update_gain_unittest.cc",
-        "aec3/matched_filter_lag_aggregator_unittest.cc",
-        "aec3/matched_filter_unittest.cc",
-        "aec3/output_selector_unittest.cc",
-        "aec3/render_buffer_unittest.cc",
-        "aec3/render_delay_buffer_unittest.cc",
-        "aec3/render_delay_controller_metrics_unittest.cc",
-        "aec3/render_delay_controller_unittest.cc",
-        "aec3/render_signal_analyzer_unittest.cc",
-        "aec3/residual_echo_estimator_unittest.cc",
-        "aec3/shadow_filter_update_gain_unittest.cc",
-        "aec3/subtractor_unittest.cc",
-        "aec3/suppression_filter_unittest.cc",
-        "aec3/suppression_gain_unittest.cc",
-        "aec3/vector_math_unittest.cc",
-        "agc2/gain_controller2_unittest.cc",
-        "audio_processing_impl_locking_unittest.cc",
-        "audio_processing_impl_unittest.cc",
-        "audio_processing_unittest.cc",
-        "beamformer/nonlinear_beamformer_unittest.cc",
-        "echo_cancellation_bit_exact_unittest.cc",
-        "echo_control_mobile_unittest.cc",
-        "echo_detector/circular_buffer_unittest.cc",
-        "echo_detector/mean_variance_estimator_unittest.cc",
-        "echo_detector/moving_max_unittest.cc",
-        "echo_detector/normalized_covariance_estimator_unittest.cc",
-        "gain_control_unittest.cc",
-        "level_controller/level_controller_unittest.cc",
-        "level_estimator_unittest.cc",
-        "low_cut_filter_unittest.cc",
-        "noise_suppression_unittest.cc",
-        "residual_echo_detector_unittest.cc",
-        "rms_level_unittest.cc",
-        "test/debug_dump_replayer.cc",
-        "test/debug_dump_replayer.h",
-        "test/debug_dump_test.cc",
-        "test/echo_canceller_test_tools.cc",
-        "test/echo_canceller_test_tools.h",
-        "test/echo_canceller_test_tools_unittest.cc",
-        "test/test_utils.h",
-        "voice_detection_unittest.cc",
-      ]
-    }
-
-    if ((!build_with_chromium || is_win) && is_clang) {
-      # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-    }
-  }
-
-  rtc_source_set("audio_processing_perf_tests") {
-    # Has problems with autogenerated targets on Android and iOS
-    # Dependency chain (there may also be others):
-    #  :audio_processing_perf_tests -->
-    #  ..:modules_unittests --[private]-->
-    #  ..:modules_unittests_apk -->
-    #  ..:modules_unittests_apk__create -->
-    #  ..:modules_unittests_apk__create__finalize -->
-    #  ..:modules_unittests_apk__create__package --[private]-->
-    #  ..:_modules_unittests__library
-    check_includes = false
-    testonly = true
-
-    # Skip restricting visibility on mobile platforms since the tests on those
-    # gets additional generated targets which would require many lines here to
-    # cover (which would be confusing to read and hard to maintain).
-    if (!is_android && !is_ios) {
-      visibility = [ "../..:webrtc_perf_tests" ]
-    }
-    sources = [
-      "audio_processing_performance_unittest.cc",
-      "level_controller/level_controller_complexity_unittest.cc",
-      "residual_echo_detector_complexity_unittest.cc",
-    ]
-    deps = [
-      ":audio_processing",
-      ":audioproc_test_utils",
-      "../../rtc_base:protobuf_utils",
-      "//testing/gtest",
-    ]
-
-    if (rtc_enable_intelligibility_enhancer) {
-      defines = [ "WEBRTC_INTELLIGIBILITY_ENHANCER=1" ]
-    } else {
-      defines = [ "WEBRTC_INTELLIGIBILITY_ENHANCER=0" ]
-    }
-  }
-
-  if (rtc_enable_protobuf) {
-    rtc_executable("unpack_aecdump") {
-      testonly = true
-      sources = [
-        "test/unpack.cc",
-      ]
-
-      deps = [
-        ":audio_processing",
-        ":audioproc_debug_proto",
-        ":audioproc_protobuf_utils",
-        ":audioproc_test_utils",
-        "../..:webrtc_common",
-        "../../common_audio",
-        "../../rtc_base:protobuf_utils",
-        "../../rtc_base:rtc_base_approved",
-        "../../system_wrappers:system_wrappers_default",
-      ]
-    }  # unpack_aecdump
-
-    rtc_executable("audioproc_f") {
-      testonly = true
-      sources = [
-        "test/aec_dump_based_simulator.cc",
-        "test/aec_dump_based_simulator.h",
-        "test/audio_processing_simulator.cc",
-        "test/audio_processing_simulator.h",
-        "test/audioproc_float.cc",
-        "test/wav_based_simulator.cc",
-        "test/wav_based_simulator.h",
-      ]
-
-      deps = [
-        ":audio_processing",
-        ":audioproc_debug_proto",
-        ":audioproc_protobuf_utils",
-        ":audioproc_test_utils",
-        "../../api:optional",
-        "../../common_audio:common_audio",
-        "../../rtc_base:protobuf_utils",
-        "../../rtc_base:rtc_base_approved",
-        "../../rtc_base:rtc_task_queue",
-        "../../system_wrappers",
-        "../../system_wrappers:system_wrappers_default",
-        "../../test:test_support",
-        "aec_dump",
-        "aec_dump:aec_dump_impl",
-        "//testing/gtest",
-      ]
-    }  # audioproc_f
-  }
-
-  rtc_source_set("audioproc_test_utils") {
-    testonly = true
-    sources = [
-      "test/audio_buffer_tools.cc",
-      "test/audio_buffer_tools.h",
-      "test/bitexactness_tools.cc",
-      "test/bitexactness_tools.h",
-      "test/performance_timer.cc",
-      "test/performance_timer.h",
-      "test/simulator_buffers.cc",
-      "test/simulator_buffers.h",
-      "test/test_utils.cc",
-      "test/test_utils.h",
-    ]
-
-    deps = [
-      ":audio_processing",
-      "..:module_api",
-      "../../api:array_view",
-      "../../api:optional",
-      "../../common_audio",
-      "../../rtc_base:rtc_base_approved",
-      "../../system_wrappers:system_wrappers",
-      "../../test:test_support",
-      "../audio_coding:neteq_tools",
-      "//testing/gtest",
-    ]
-  }
-
-  rtc_executable("transient_suppression_test") {
-    testonly = true
-    sources = [
-      "transient/file_utils.cc",
-      "transient/file_utils.h",
-      "transient/transient_suppression_test.cc",
-    ]
-    deps = [
-      ":audio_processing",
-      "..:module_api",
-      "../..:webrtc_common",
-      "../../common_audio:common_audio",
-      "../../rtc_base:rtc_base_approved",
-      "../../system_wrappers:metrics_default",
-      "../../system_wrappers:system_wrappers",
-      "../../test:test_support",
-      "//testing/gtest",
-    ]
-  }
-
-  rtc_executable("click_annotate") {
-    testonly = true
-    sources = [
-      "transient/click_annotate.cc",
-      "transient/file_utils.cc",
-      "transient/file_utils.h",
-    ]
-    deps = [
-      ":audio_processing",
-      "../..:webrtc_common",
-      "../../system_wrappers:metrics_default",
-      "../../system_wrappers:system_wrappers",
-    ]
-  }
-
-  rtc_executable("nonlinear_beamformer_test") {
-    testonly = true
-    sources = [
-      "beamformer/nonlinear_beamformer_test.cc",
-    ]
-    deps = [
-      ":audio_processing",
-      ":audioproc_test_utils",
-      "../../common_audio:common_audio",
-      "../../rtc_base:rtc_base_approved",
-      "../../system_wrappers:metrics_default",
-    ]
-  }
-
-  if (rtc_enable_intelligibility_enhancer) {
-    rtc_executable("intelligibility_proc") {
-      testonly = true
-      sources = [
-        "intelligibility/test/intelligibility_proc.cc",
-      ]
-      deps = [
-        ":audio_processing",
-        ":audioproc_test_utils",
-        "../../rtc_base:rtc_base_approved",
-        "../../system_wrappers:metrics_default",
-        "../../test:test_support",
-        "//testing/gtest",
-      ]
-    }
-  }
-
-  if (rtc_enable_protobuf) {
-    proto_library("audioproc_unittest_proto") {
-      sources = [
-        "test/unittest.proto",
-      ]
-      proto_out_dir = "webrtc/modules/audio_processing/test"
-    }
-
-    rtc_static_library("audioproc_protobuf_utils") {
-      sources = [
-        "test/protobuf_utils.cc",
-        "test/protobuf_utils.h",
-      ]
-
-      deps = [
-        ":audioproc_debug_proto",
-        "../..:webrtc_common",
-        "../../rtc_base:protobuf_utils",
-        "../../rtc_base:rtc_base_approved",
-      ]
-    }
-  }
-}
diff --git a/modules/audio_processing/DEPS b/modules/audio_processing/DEPS
deleted file mode 100644
index 742971f..0000000
--- a/modules/audio_processing/DEPS
+++ /dev/null
@@ -1,14 +0,0 @@
-include_rules = [
-  "+webrtc/audio/utility/audio_frame_operations.h",
-  "+webrtc/common_audio",
-  "+webrtc/system_wrappers",
-]
-
-specific_include_rules = {
-  ".*test\.cc": [
-    "+webrtc/rtc_tools",
-    # Android platform build has different paths.
-    "+gtest",
-    "+external/webrtc",
-  ],
-}
diff --git a/modules/audio_processing/OWNERS b/modules/audio_processing/OWNERS
deleted file mode 100644
index 9c521d2..0000000
--- a/modules/audio_processing/OWNERS
+++ /dev/null
@@ -1,9 +0,0 @@
-aleloi@webrtc.org
-aluebs@webrtc.org
-henrik.lundin@webrtc.org
-peah@webrtc.org
-
-# These are for the common case of adding or renaming files. If you're doing
-# structural changes, please get a review from a reviewer in this file.
-per-file *.gn=*
-per-file *.gni=*
diff --git a/modules/audio_processing/aec/aec_common.h b/modules/audio_processing/aec/aec_common.h
deleted file mode 100644
index 0e3cdde..0000000
--- a/modules/audio_processing/aec/aec_common.h
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- *  Copyright (c) 2014 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_PROCESSING_AEC_AEC_COMMON_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_AEC_AEC_COMMON_H_
-
-#include "webrtc/typedefs.h"
-
-#ifdef _MSC_VER /* visual c++ */
-#define ALIGN16_BEG __declspec(align(16))
-#define ALIGN16_END
-#else /* gcc or icc */
-#define ALIGN16_BEG
-#define ALIGN16_END __attribute__((aligned(16)))
-#endif
-
-#ifdef __cplusplus
-namespace webrtc {
-#endif
-
-extern ALIGN16_BEG const float ALIGN16_END WebRtcAec_sqrtHanning[65];
-extern ALIGN16_BEG const float ALIGN16_END WebRtcAec_weightCurve[65];
-extern ALIGN16_BEG const float ALIGN16_END WebRtcAec_overDriveCurve[65];
-extern const float WebRtcAec_kExtendedSmoothingCoefficients[2][2];
-extern const float WebRtcAec_kNormalSmoothingCoefficients[2][2];
-extern const float WebRtcAec_kMinFarendPSD;
-
-#ifdef __cplusplus
-}  // namespace webrtc
-#endif
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_AEC_AEC_COMMON_H_
diff --git a/modules/audio_processing/aec/aec_core.cc b/modules/audio_processing/aec/aec_core.cc
deleted file mode 100644
index d580690..0000000
--- a/modules/audio_processing/aec/aec_core.cc
+++ /dev/null
@@ -1,2050 +0,0 @@
-/*
- *  Copyright (c) 2012 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.
- */
-
-/*
- * The core AEC algorithm, which is presented with time-aligned signals.
- */
-
-#include "webrtc/modules/audio_processing/aec/aec_core.h"
-
-#include <algorithm>
-#include <math.h>
-#include <stddef.h>  // size_t
-#include <stdlib.h>
-#include <string.h>
-
-#include "webrtc/rtc_base/checks.h"
-extern "C" {
-#include "webrtc/common_audio/ring_buffer.h"
-}
-#include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
-#include "webrtc/modules/audio_processing/aec/aec_common.h"
-#include "webrtc/modules/audio_processing/aec/aec_core_optimized_methods.h"
-#include "webrtc/modules/audio_processing/logging/apm_data_dumper.h"
-#include "webrtc/modules/audio_processing/utility/delay_estimator_wrapper.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/system_wrappers/include/cpu_features_wrapper.h"
-#include "webrtc/system_wrappers/include/metrics.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-namespace {
-enum class DelaySource {
-  kSystemDelay,    // The delay values come from the OS.
-  kDelayAgnostic,  // The delay values come from the DA-AEC.
-};
-
-constexpr int kMinDelayLogValue = -200;
-constexpr int kMaxDelayLogValue = 200;
-constexpr int kNumDelayLogBuckets = 100;
-
-void MaybeLogDelayAdjustment(int moved_ms, DelaySource source) {
-  if (moved_ms == 0)
-    return;
-  switch (source) {
-    case DelaySource::kSystemDelay:
-      RTC_HISTOGRAM_COUNTS("WebRTC.Audio.AecDelayAdjustmentMsSystemValue",
-                           moved_ms, kMinDelayLogValue, kMaxDelayLogValue,
-                           kNumDelayLogBuckets);
-      return;
-    case DelaySource::kDelayAgnostic:
-      RTC_HISTOGRAM_COUNTS("WebRTC.Audio.AecDelayAdjustmentMsAgnosticValue",
-                           moved_ms, kMinDelayLogValue, kMaxDelayLogValue,
-                           kNumDelayLogBuckets);
-      return;
-  }
-}
-}  // namespace
-
-// Buffer size (samples)
-static const size_t kBufferSizeBlocks = 250;  // 1 second of audio in 16 kHz.
-
-// Metrics
-static const size_t kSubCountLen = 4;
-static const size_t kCountLen = 50;
-static const int kDelayMetricsAggregationWindow = 1250;  // 5 seconds at 16 kHz.
-
-// Divergence metric is based on audio level, which gets updated every
-// |kSubCountLen + 1| * PART_LEN samples. Divergence metric takes the statistics
-// of |kDivergentFilterFractionAggregationWindowSize| audio levels. The
-// following value corresponds to 1 second at 16 kHz.
-static const int kDivergentFilterFractionAggregationWindowSize = 50;
-
-// Quantities to control H band scaling for SWB input
-static const float cnScaleHband = 0.4f;  // scale for comfort noise in H band.
-// Initial bin for averaging nlp gain in low band
-static const int freqAvgIc = PART_LEN / 2;
-
-// Matlab code to produce table:
-// win = sqrt(hanning(63)); win = [0 ; win(1:32)];
-// fprintf(1, '\t%.14f, %.14f, %.14f,\n', win);
-ALIGN16_BEG const float ALIGN16_END WebRtcAec_sqrtHanning[65] = {
-    0.00000000000000f, 0.02454122852291f, 0.04906767432742f, 0.07356456359967f,
-    0.09801714032956f, 0.12241067519922f, 0.14673047445536f, 0.17096188876030f,
-    0.19509032201613f, 0.21910124015687f, 0.24298017990326f, 0.26671275747490f,
-    0.29028467725446f, 0.31368174039889f, 0.33688985339222f, 0.35989503653499f,
-    0.38268343236509f, 0.40524131400499f, 0.42755509343028f, 0.44961132965461f,
-    0.47139673682600f, 0.49289819222978f, 0.51410274419322f, 0.53499761988710f,
-    0.55557023301960f, 0.57580819141785f, 0.59569930449243f, 0.61523159058063f,
-    0.63439328416365f, 0.65317284295378f, 0.67155895484702f, 0.68954054473707f,
-    0.70710678118655f, 0.72424708295147f, 0.74095112535496f, 0.75720884650648f,
-    0.77301045336274f, 0.78834642762661f, 0.80320753148064f, 0.81758481315158f,
-    0.83146961230255f, 0.84485356524971f, 0.85772861000027f, 0.87008699110871f,
-    0.88192126434835f, 0.89322430119552f, 0.90398929312344f, 0.91420975570353f,
-    0.92387953251129f, 0.93299279883474f, 0.94154406518302f, 0.94952818059304f,
-    0.95694033573221f, 0.96377606579544f, 0.97003125319454f, 0.97570213003853f,
-    0.98078528040323f, 0.98527764238894f, 0.98917650996478f, 0.99247953459871f,
-    0.99518472667220f, 0.99729045667869f, 0.99879545620517f, 0.99969881869620f,
-    1.00000000000000f};
-
-// Matlab code to produce table:
-// weightCurve = [0 ; 0.3 * sqrt(linspace(0,1,64))' + 0.1];
-// fprintf(1, '\t%.4f, %.4f, %.4f, %.4f, %.4f, %.4f,\n', weightCurve);
-ALIGN16_BEG const float ALIGN16_END WebRtcAec_weightCurve[65] = {
-    0.0000f, 0.1000f, 0.1378f, 0.1535f, 0.1655f, 0.1756f, 0.1845f, 0.1926f,
-    0.2000f, 0.2069f, 0.2134f, 0.2195f, 0.2254f, 0.2309f, 0.2363f, 0.2414f,
-    0.2464f, 0.2512f, 0.2558f, 0.2604f, 0.2648f, 0.2690f, 0.2732f, 0.2773f,
-    0.2813f, 0.2852f, 0.2890f, 0.2927f, 0.2964f, 0.3000f, 0.3035f, 0.3070f,
-    0.3104f, 0.3138f, 0.3171f, 0.3204f, 0.3236f, 0.3268f, 0.3299f, 0.3330f,
-    0.3360f, 0.3390f, 0.3420f, 0.3449f, 0.3478f, 0.3507f, 0.3535f, 0.3563f,
-    0.3591f, 0.3619f, 0.3646f, 0.3673f, 0.3699f, 0.3726f, 0.3752f, 0.3777f,
-    0.3803f, 0.3828f, 0.3854f, 0.3878f, 0.3903f, 0.3928f, 0.3952f, 0.3976f,
-    0.4000f};
-
-// Matlab code to produce table:
-// overDriveCurve = [sqrt(linspace(0,1,65))' + 1];
-// fprintf(1, '\t%.4f, %.4f, %.4f, %.4f, %.4f, %.4f,\n', overDriveCurve);
-ALIGN16_BEG const float ALIGN16_END WebRtcAec_overDriveCurve[65] = {
-    1.0000f, 1.1250f, 1.1768f, 1.2165f, 1.2500f, 1.2795f, 1.3062f, 1.3307f,
-    1.3536f, 1.3750f, 1.3953f, 1.4146f, 1.4330f, 1.4507f, 1.4677f, 1.4841f,
-    1.5000f, 1.5154f, 1.5303f, 1.5449f, 1.5590f, 1.5728f, 1.5863f, 1.5995f,
-    1.6124f, 1.6250f, 1.6374f, 1.6495f, 1.6614f, 1.6731f, 1.6847f, 1.6960f,
-    1.7071f, 1.7181f, 1.7289f, 1.7395f, 1.7500f, 1.7603f, 1.7706f, 1.7806f,
-    1.7906f, 1.8004f, 1.8101f, 1.8197f, 1.8292f, 1.8385f, 1.8478f, 1.8570f,
-    1.8660f, 1.8750f, 1.8839f, 1.8927f, 1.9014f, 1.9100f, 1.9186f, 1.9270f,
-    1.9354f, 1.9437f, 1.9520f, 1.9601f, 1.9682f, 1.9763f, 1.9843f, 1.9922f,
-    2.0000f};
-
-// Delay Agnostic AEC parameters, still under development and may change.
-static const float kDelayQualityThresholdMax = 0.07f;
-static const float kDelayQualityThresholdMin = 0.01f;
-static const int kInitialShiftOffset = 5;
-#if !defined(WEBRTC_ANDROID)
-static const int kDelayCorrectionStart = 1500;  // 10 ms chunks
-#endif
-
-// Target suppression levels for nlp modes.
-// log{0.001, 0.00001, 0.00000001}
-static const float kTargetSupp[3] = {-6.9f, -11.5f, -18.4f};
-
-// Two sets of parameters, one for the extended filter mode.
-static const float kExtendedMinOverDrive[3] = {3.0f, 6.0f, 15.0f};
-static const float kNormalMinOverDrive[3] = {1.0f, 2.0f, 5.0f};
-const float WebRtcAec_kExtendedSmoothingCoefficients[2][2] = {{0.9f, 0.1f},
-                                                              {0.92f, 0.08f}};
-const float WebRtcAec_kNormalSmoothingCoefficients[2][2] = {{0.9f, 0.1f},
-                                                            {0.93f, 0.07f}};
-
-// Number of partitions forming the NLP's "preferred" bands.
-enum { kPrefBandSize = 24 };
-
-WebRtcAecFilterFar WebRtcAec_FilterFar;
-WebRtcAecScaleErrorSignal WebRtcAec_ScaleErrorSignal;
-WebRtcAecFilterAdaptation WebRtcAec_FilterAdaptation;
-WebRtcAecOverdrive WebRtcAec_Overdrive;
-WebRtcAecSuppress WebRtcAec_Suppress;
-WebRtcAecComputeCoherence WebRtcAec_ComputeCoherence;
-WebRtcAecUpdateCoherenceSpectra WebRtcAec_UpdateCoherenceSpectra;
-WebRtcAecStoreAsComplex WebRtcAec_StoreAsComplex;
-WebRtcAecPartitionDelay WebRtcAec_PartitionDelay;
-WebRtcAecWindowData WebRtcAec_WindowData;
-
-__inline static float MulRe(float aRe, float aIm, float bRe, float bIm) {
-  return aRe * bRe - aIm * bIm;
-}
-
-__inline static float MulIm(float aRe, float aIm, float bRe, float bIm) {
-  return aRe * bIm + aIm * bRe;
-}
-
-// TODO(minyue): Due to a legacy bug, |framelevel| and |averagelevel| use a
-// window, of which the length is 1 unit longer than indicated. Remove "+1" when
-// the code is refactored.
-PowerLevel::PowerLevel()
-    : framelevel(kSubCountLen + 1),
-      averagelevel(kCountLen + 1) {
-}
-
-BlockBuffer::BlockBuffer() {
-  buffer_ = WebRtc_CreateBuffer(kBufferSizeBlocks, sizeof(float) * PART_LEN);
-  RTC_CHECK(buffer_);
-  ReInit();
-}
-
-BlockBuffer::~BlockBuffer() {
-  WebRtc_FreeBuffer(buffer_);
-}
-
-void BlockBuffer::ReInit() {
-  WebRtc_InitBuffer(buffer_);
-}
-
-void BlockBuffer::Insert(const float block[PART_LEN]) {
-  WebRtc_WriteBuffer(buffer_, block, 1);
-}
-
-void BlockBuffer::ExtractExtendedBlock(float extended_block[PART_LEN2]) {
-  float* block_ptr = NULL;
-  RTC_DCHECK_LT(0, AvaliableSpace());
-
-  // Extract the previous block.
-  WebRtc_MoveReadPtr(buffer_, -1);
-  size_t read_elements = WebRtc_ReadBuffer(
-      buffer_, reinterpret_cast<void**>(&block_ptr), &extended_block[0], 1);
-  if (read_elements == 0u) {
-    std::fill_n(&extended_block[0], PART_LEN, 0.0f);
-  } else if (block_ptr != &extended_block[0]) {
-    memcpy(&extended_block[0], block_ptr, PART_LEN * sizeof(float));
-  }
-
-  // Extract the current block.
-  read_elements =
-      WebRtc_ReadBuffer(buffer_, reinterpret_cast<void**>(&block_ptr),
-                        &extended_block[PART_LEN], 1);
-  if (read_elements == 0u) {
-    std::fill_n(&extended_block[PART_LEN], PART_LEN, 0.0f);
-  } else if (block_ptr != &extended_block[PART_LEN]) {
-    memcpy(&extended_block[PART_LEN], block_ptr, PART_LEN * sizeof(float));
-  }
-}
-
-int BlockBuffer::AdjustSize(int buffer_size_decrease) {
-  return WebRtc_MoveReadPtr(buffer_, buffer_size_decrease);
-}
-
-size_t BlockBuffer::Size() {
-  return static_cast<int>(WebRtc_available_read(buffer_));
-}
-
-size_t BlockBuffer::AvaliableSpace() {
-  return WebRtc_available_write(buffer_);
-}
-
-DivergentFilterFraction::DivergentFilterFraction()
-    : count_(0),
-      occurrence_(0),
-      fraction_(-1.0) {
-}
-
-void DivergentFilterFraction::Reset() {
-  Clear();
-  fraction_ = -1.0;
-}
-
-void DivergentFilterFraction::AddObservation(const PowerLevel& nearlevel,
-                                             const PowerLevel& linoutlevel,
-                                             const PowerLevel& nlpoutlevel) {
-  const float near_level = nearlevel.framelevel.GetLatestMean();
-  const float level_increase =
-      linoutlevel.framelevel.GetLatestMean() - near_level;
-  const bool output_signal_active = nlpoutlevel.framelevel.GetLatestMean() >
-          40.0 * nlpoutlevel.minlevel;
-  // Level increase should be, in principle, negative, when the filter
-  // does not diverge. Here we allow some margin (0.01 * near end level) and
-  // numerical error (1.0). We count divergence only when the AEC output
-  // signal is active.
-  if (output_signal_active &&
-      level_increase > std::max(0.01 * near_level, 1.0))
-    occurrence_++;
-  ++count_;
-  if (count_ == kDivergentFilterFractionAggregationWindowSize) {
-    fraction_ = static_cast<float>(occurrence_) /
-        kDivergentFilterFractionAggregationWindowSize;
-    Clear();
-  }
-}
-
-float DivergentFilterFraction::GetLatestFraction() const {
-  return fraction_;
-}
-
-void DivergentFilterFraction::Clear() {
-  count_ = 0;
-  occurrence_ = 0;
-}
-
-// TODO(minyue): Moving some initialization from WebRtcAec_CreateAec() to ctor.
-AecCore::AecCore(int instance_index)
-    : data_dumper(new ApmDataDumper(instance_index)) {}
-
-AecCore::~AecCore() {}
-
-static int CmpFloat(const void* a, const void* b) {
-  const float* da = (const float*)a;
-  const float* db = (const float*)b;
-
-  return (*da > *db) - (*da < *db);
-}
-
-static void FilterFar(int num_partitions,
-                      int x_fft_buf_block_pos,
-                      float x_fft_buf[2][kExtendedNumPartitions * PART_LEN1],
-                      float h_fft_buf[2][kExtendedNumPartitions * PART_LEN1],
-                      float y_fft[2][PART_LEN1]) {
-  int i;
-  for (i = 0; i < num_partitions; i++) {
-    int j;
-    int xPos = (i + x_fft_buf_block_pos) * PART_LEN1;
-    int pos = i * PART_LEN1;
-    // Check for wrap
-    if (i + x_fft_buf_block_pos >= num_partitions) {
-      xPos -= num_partitions * (PART_LEN1);
-    }
-
-    for (j = 0; j < PART_LEN1; j++) {
-      y_fft[0][j] += MulRe(x_fft_buf[0][xPos + j], x_fft_buf[1][xPos + j],
-                           h_fft_buf[0][pos + j], h_fft_buf[1][pos + j]);
-      y_fft[1][j] += MulIm(x_fft_buf[0][xPos + j], x_fft_buf[1][xPos + j],
-                           h_fft_buf[0][pos + j], h_fft_buf[1][pos + j]);
-    }
-  }
-}
-
-static void ScaleErrorSignal(float mu,
-                             float error_threshold,
-                             float x_pow[PART_LEN1],
-                             float ef[2][PART_LEN1]) {
-  int i;
-  float abs_ef;
-  for (i = 0; i < (PART_LEN1); i++) {
-    ef[0][i] /= (x_pow[i] + 1e-10f);
-    ef[1][i] /= (x_pow[i] + 1e-10f);
-    abs_ef = sqrtf(ef[0][i] * ef[0][i] + ef[1][i] * ef[1][i]);
-
-    if (abs_ef > error_threshold) {
-      abs_ef = error_threshold / (abs_ef + 1e-10f);
-      ef[0][i] *= abs_ef;
-      ef[1][i] *= abs_ef;
-    }
-
-    // Stepsize factor
-    ef[0][i] *= mu;
-    ef[1][i] *= mu;
-  }
-}
-
-static void FilterAdaptation(
-    const OouraFft& ooura_fft,
-    int num_partitions,
-    int x_fft_buf_block_pos,
-    float x_fft_buf[2][kExtendedNumPartitions * PART_LEN1],
-    float e_fft[2][PART_LEN1],
-    float h_fft_buf[2][kExtendedNumPartitions * PART_LEN1]) {
-  int i, j;
-  float fft[PART_LEN2];
-  for (i = 0; i < num_partitions; i++) {
-    int xPos = (i + x_fft_buf_block_pos) * (PART_LEN1);
-    int pos;
-    // Check for wrap
-    if (i + x_fft_buf_block_pos >= num_partitions) {
-      xPos -= num_partitions * PART_LEN1;
-    }
-
-    pos = i * PART_LEN1;
-
-    for (j = 0; j < PART_LEN; j++) {
-      fft[2 * j] = MulRe(x_fft_buf[0][xPos + j], -x_fft_buf[1][xPos + j],
-                         e_fft[0][j], e_fft[1][j]);
-      fft[2 * j + 1] = MulIm(x_fft_buf[0][xPos + j], -x_fft_buf[1][xPos + j],
-                             e_fft[0][j], e_fft[1][j]);
-    }
-    fft[1] =
-        MulRe(x_fft_buf[0][xPos + PART_LEN], -x_fft_buf[1][xPos + PART_LEN],
-              e_fft[0][PART_LEN], e_fft[1][PART_LEN]);
-
-    ooura_fft.InverseFft(fft);
-    memset(fft + PART_LEN, 0, sizeof(float) * PART_LEN);
-
-    // fft scaling
-    {
-      float scale = 2.0f / PART_LEN2;
-      for (j = 0; j < PART_LEN; j++) {
-        fft[j] *= scale;
-      }
-    }
-    ooura_fft.Fft(fft);
-
-    h_fft_buf[0][pos] += fft[0];
-    h_fft_buf[0][pos + PART_LEN] += fft[1];
-
-    for (j = 1; j < PART_LEN; j++) {
-      h_fft_buf[0][pos + j] += fft[2 * j];
-      h_fft_buf[1][pos + j] += fft[2 * j + 1];
-    }
-  }
-}
-
-static void Overdrive(float overdrive_scaling,
-                      const float hNlFb,
-                      float hNl[PART_LEN1]) {
-  for (int i = 0; i < PART_LEN1; ++i) {
-    // Weight subbands
-    if (hNl[i] > hNlFb) {
-      hNl[i] = WebRtcAec_weightCurve[i] * hNlFb +
-               (1 - WebRtcAec_weightCurve[i]) * hNl[i];
-    }
-    hNl[i] = powf(hNl[i], overdrive_scaling * WebRtcAec_overDriveCurve[i]);
-  }
-}
-
-static void Suppress(const float hNl[PART_LEN1], float efw[2][PART_LEN1]) {
-  for (int i = 0; i < PART_LEN1; ++i) {
-    // Suppress error signal
-    efw[0][i] *= hNl[i];
-    efw[1][i] *= hNl[i];
-
-    // Ooura fft returns incorrect sign on imaginary component. It matters here
-    // because we are making an additive change with comfort noise.
-    efw[1][i] *= -1;
-  }
-}
-
-static int PartitionDelay(int num_partitions,
-                          float h_fft_buf[2]
-                                         [kExtendedNumPartitions * PART_LEN1]) {
-  // Measures the energy in each filter partition and returns the partition with
-  // highest energy.
-  // TODO(bjornv): Spread computational cost by computing one partition per
-  // block?
-  float wfEnMax = 0;
-  int i;
-  int delay = 0;
-
-  for (i = 0; i < num_partitions; i++) {
-    int j;
-    int pos = i * PART_LEN1;
-    float wfEn = 0;
-    for (j = 0; j < PART_LEN1; j++) {
-      wfEn += h_fft_buf[0][pos + j] * h_fft_buf[0][pos + j] +
-              h_fft_buf[1][pos + j] * h_fft_buf[1][pos + j];
-    }
-
-    if (wfEn > wfEnMax) {
-      wfEnMax = wfEn;
-      delay = i;
-    }
-  }
-  return delay;
-}
-
-// Update metric with 10 * log10(numerator / denominator).
-static void UpdateLogRatioMetric(Stats* metric, float numerator,
-                                 float denominator) {
-  RTC_DCHECK(metric);
-  RTC_CHECK(numerator >= 0);
-  RTC_CHECK(denominator >= 0);
-
-  const float log_numerator = log10(numerator + 1e-10f);
-  const float log_denominator = log10(denominator + 1e-10f);
-  metric->instant = 10.0f * (log_numerator - log_denominator);
-
-  // Max.
-  if (metric->instant > metric->max)
-    metric->max = metric->instant;
-
-  // Min.
-  if (metric->instant < metric->min)
-    metric->min = metric->instant;
-
-  // Average.
-  metric->counter++;
-  // This is to protect overflow, which should almost never happen.
-  RTC_CHECK_NE(0, metric->counter);
-  metric->sum += metric->instant;
-  metric->average = metric->sum / metric->counter;
-
-  // Upper mean.
-  if (metric->instant > metric->average) {
-    metric->hicounter++;
-    // This is to protect overflow, which should almost never happen.
-    RTC_CHECK_NE(0, metric->hicounter);
-    metric->hisum += metric->instant;
-    metric->himean = metric->hisum / metric->hicounter;
-  }
-}
-
-// Threshold to protect against the ill-effects of a zero far-end.
-const float WebRtcAec_kMinFarendPSD = 15;
-
-// Updates the following smoothed Power Spectral Densities (PSD):
-//  - sd  : near-end
-//  - se  : residual echo
-//  - sx  : far-end
-//  - sde : cross-PSD of near-end and residual echo
-//  - sxd : cross-PSD of near-end and far-end
-//
-// In addition to updating the PSDs, also the filter diverge state is
-// determined.
-static void UpdateCoherenceSpectra(int mult,
-                                   bool extended_filter_enabled,
-                                   float efw[2][PART_LEN1],
-                                   float dfw[2][PART_LEN1],
-                                   float xfw[2][PART_LEN1],
-                                   CoherenceState* coherence_state,
-                                   short* filter_divergence_state,
-                                   int* extreme_filter_divergence) {
-  // Power estimate smoothing coefficients.
-  const float* ptrGCoh =
-      extended_filter_enabled
-          ? WebRtcAec_kExtendedSmoothingCoefficients[mult - 1]
-          : WebRtcAec_kNormalSmoothingCoefficients[mult - 1];
-  int i;
-  float sdSum = 0, seSum = 0;
-
-  for (i = 0; i < PART_LEN1; i++) {
-    coherence_state->sd[i] =
-        ptrGCoh[0] * coherence_state->sd[i] +
-        ptrGCoh[1] * (dfw[0][i] * dfw[0][i] + dfw[1][i] * dfw[1][i]);
-    coherence_state->se[i] =
-        ptrGCoh[0] * coherence_state->se[i] +
-        ptrGCoh[1] * (efw[0][i] * efw[0][i] + efw[1][i] * efw[1][i]);
-    // We threshold here to protect against the ill-effects of a zero farend.
-    // The threshold is not arbitrarily chosen, but balances protection and
-    // adverse interaction with the algorithm's tuning.
-    // TODO(bjornv): investigate further why this is so sensitive.
-    coherence_state->sx[i] =
-        ptrGCoh[0] * coherence_state->sx[i] +
-        ptrGCoh[1] *
-            WEBRTC_SPL_MAX(xfw[0][i] * xfw[0][i] + xfw[1][i] * xfw[1][i],
-                           WebRtcAec_kMinFarendPSD);
-
-    coherence_state->sde[i][0] =
-        ptrGCoh[0] * coherence_state->sde[i][0] +
-        ptrGCoh[1] * (dfw[0][i] * efw[0][i] + dfw[1][i] * efw[1][i]);
-    coherence_state->sde[i][1] =
-        ptrGCoh[0] * coherence_state->sde[i][1] +
-        ptrGCoh[1] * (dfw[0][i] * efw[1][i] - dfw[1][i] * efw[0][i]);
-
-    coherence_state->sxd[i][0] =
-        ptrGCoh[0] * coherence_state->sxd[i][0] +
-        ptrGCoh[1] * (dfw[0][i] * xfw[0][i] + dfw[1][i] * xfw[1][i]);
-    coherence_state->sxd[i][1] =
-        ptrGCoh[0] * coherence_state->sxd[i][1] +
-        ptrGCoh[1] * (dfw[0][i] * xfw[1][i] - dfw[1][i] * xfw[0][i]);
-
-    sdSum += coherence_state->sd[i];
-    seSum += coherence_state->se[i];
-  }
-
-  // Divergent filter safeguard update.
-  *filter_divergence_state =
-      (*filter_divergence_state ? 1.05f : 1.0f) * seSum > sdSum;
-
-  // Signal extreme filter divergence if the error is significantly larger
-  // than the nearend (13 dB).
-  *extreme_filter_divergence = (seSum > (19.95f * sdSum));
-}
-
-// Window time domain data to be used by the fft.
-__inline static void WindowData(float* x_windowed, const float* x) {
-  int i;
-  for (i = 0; i < PART_LEN; i++) {
-    x_windowed[i] = x[i] * WebRtcAec_sqrtHanning[i];
-    x_windowed[PART_LEN + i] =
-        x[PART_LEN + i] * WebRtcAec_sqrtHanning[PART_LEN - i];
-  }
-}
-
-// Puts fft output data into a complex valued array.
-__inline static void StoreAsComplex(const float* data,
-                                    float data_complex[2][PART_LEN1]) {
-  int i;
-  data_complex[0][0] = data[0];
-  data_complex[1][0] = 0;
-  for (i = 1; i < PART_LEN; i++) {
-    data_complex[0][i] = data[2 * i];
-    data_complex[1][i] = data[2 * i + 1];
-  }
-  data_complex[0][PART_LEN] = data[1];
-  data_complex[1][PART_LEN] = 0;
-}
-
-static void ComputeCoherence(const CoherenceState* coherence_state,
-                             float* cohde,
-                             float* cohxd) {
-  // Subband coherence
-  for (int i = 0; i < PART_LEN1; i++) {
-    cohde[i] = (coherence_state->sde[i][0] * coherence_state->sde[i][0] +
-                coherence_state->sde[i][1] * coherence_state->sde[i][1]) /
-               (coherence_state->sd[i] * coherence_state->se[i] + 1e-10f);
-    cohxd[i] = (coherence_state->sxd[i][0] * coherence_state->sxd[i][0] +
-                coherence_state->sxd[i][1] * coherence_state->sxd[i][1]) /
-               (coherence_state->sx[i] * coherence_state->sd[i] + 1e-10f);
-  }
-}
-
-static void GetHighbandGain(const float* lambda, float* nlpGainHband) {
-  int i;
-
-  *nlpGainHband = 0.0f;
-  for (i = freqAvgIc; i < PART_LEN1 - 1; i++) {
-    *nlpGainHband += lambda[i];
-  }
-  *nlpGainHband /= static_cast<float>(PART_LEN1 - 1 - freqAvgIc);
-}
-
-static void GenerateComplexNoise(uint32_t* seed, float noise[2][PART_LEN1]) {
-  const float kPi2 = 6.28318530717959f;
-  int16_t randW16[PART_LEN];
-  WebRtcSpl_RandUArray(randW16, PART_LEN, seed);
-
-  noise[0][0] = 0;
-  noise[1][0] = 0;
-  for (size_t i = 1; i < PART_LEN1; i++) {
-    float tmp = kPi2 * randW16[i - 1] / 32768.f;
-    noise[0][i] = cosf(tmp);
-    noise[1][i] = -sinf(tmp);
-  }
-  noise[1][PART_LEN] = 0;
-}
-
-static void ComfortNoise(bool generate_high_frequency_noise,
-                         uint32_t* seed,
-                         float e_fft[2][PART_LEN1],
-                         float high_frequency_comfort_noise[2][PART_LEN1],
-                         const float* noise_spectrum,
-                         const float* suppressor_gain) {
-  float complex_noise[2][PART_LEN1];
-
-  GenerateComplexNoise(seed, complex_noise);
-
-  // Shape, scale and add comfort noise.
-  for (int i = 1; i < PART_LEN1; ++i) {
-    float noise_scaling =
-        sqrtf(WEBRTC_SPL_MAX(1 - suppressor_gain[i] * suppressor_gain[i], 0)) *
-        sqrtf(noise_spectrum[i]);
-    e_fft[0][i] += noise_scaling * complex_noise[0][i];
-    e_fft[1][i] += noise_scaling * complex_noise[1][i];
-  }
-
-  // Form comfort noise for higher frequencies.
-  if (generate_high_frequency_noise) {
-    // Compute average noise power and nlp gain over the second half of freq
-    // spectrum (i.e., 4->8khz).
-    int start_avg_band = PART_LEN1 / 2;
-    float upper_bands_noise_power = 0.f;
-    float upper_bands_suppressor_gain = 0.f;
-    for (int i = start_avg_band; i < PART_LEN1; ++i) {
-      upper_bands_noise_power += sqrtf(noise_spectrum[i]);
-      upper_bands_suppressor_gain +=
-          sqrtf(WEBRTC_SPL_MAX(1 - suppressor_gain[i] * suppressor_gain[i], 0));
-    }
-    upper_bands_noise_power /= (PART_LEN1 - start_avg_band);
-    upper_bands_suppressor_gain /= (PART_LEN1 - start_avg_band);
-
-    // Shape, scale and add comfort noise.
-    float noise_scaling = upper_bands_suppressor_gain * upper_bands_noise_power;
-    high_frequency_comfort_noise[0][0] = 0;
-    high_frequency_comfort_noise[1][0] = 0;
-    for (int i = 1; i < PART_LEN1; ++i) {
-      high_frequency_comfort_noise[0][i] = noise_scaling * complex_noise[0][i];
-      high_frequency_comfort_noise[1][i] = noise_scaling * complex_noise[1][i];
-    }
-    high_frequency_comfort_noise[1][PART_LEN] = 0;
-  } else {
-    memset(high_frequency_comfort_noise, 0,
-           2 * PART_LEN1 * sizeof(high_frequency_comfort_noise[0][0]));
-  }
-}
-
-static void InitLevel(PowerLevel* level) {
-  const float kBigFloat = 1E17f;
-  level->averagelevel.Reset();
-  level->framelevel.Reset();
-  level->minlevel = kBigFloat;
-}
-
-static void InitStats(Stats* stats) {
-  stats->instant = kOffsetLevel;
-  stats->average = kOffsetLevel;
-  stats->max = kOffsetLevel;
-  stats->min = kOffsetLevel * (-1);
-  stats->sum = 0;
-  stats->hisum = 0;
-  stats->himean = kOffsetLevel;
-  stats->counter = 0;
-  stats->hicounter = 0;
-}
-
-static void InitMetrics(AecCore* self) {
-  self->stateCounter = 0;
-  InitLevel(&self->farlevel);
-  InitLevel(&self->nearlevel);
-  InitLevel(&self->linoutlevel);
-  InitLevel(&self->nlpoutlevel);
-
-  InitStats(&self->erl);
-  InitStats(&self->erle);
-  InitStats(&self->aNlp);
-  InitStats(&self->rerl);
-
-  self->divergent_filter_fraction.Reset();
-}
-
-static float CalculatePower(const float* in, size_t num_samples) {
-  size_t k;
-  float energy = 0.0f;
-
-  for (k = 0; k < num_samples; ++k) {
-    energy += in[k] * in[k];
-  }
-  return energy / num_samples;
-}
-
-static void UpdateLevel(PowerLevel* level, float power) {
-  level->framelevel.AddValue(power);
-  if (level->framelevel.EndOfBlock()) {
-    const float new_frame_level = level->framelevel.GetLatestMean();
-    if (new_frame_level > 0) {
-      if (new_frame_level < level->minlevel) {
-        level->minlevel = new_frame_level;  // New minimum.
-      } else {
-        level->minlevel *= (1 + 0.001f);  // Small increase.
-      }
-    }
-    level->averagelevel.AddValue(new_frame_level);
-  }
-}
-
-static void UpdateMetrics(AecCore* aec) {
-  const float actThresholdNoisy = 8.0f;
-  const float actThresholdClean = 40.0f;
-
-  const float noisyPower = 300000.0f;
-
-  float actThreshold;
-
-  if (aec->echoState) {  // Check if echo is likely present
-    aec->stateCounter++;
-  }
-
-  if (aec->linoutlevel.framelevel.EndOfBlock()) {
-    aec->divergent_filter_fraction.AddObservation(aec->nearlevel,
-                                                  aec->linoutlevel,
-                                                  aec->nlpoutlevel);
-  }
-
-  if (aec->farlevel.averagelevel.EndOfBlock()) {
-    if (aec->farlevel.minlevel < noisyPower) {
-      actThreshold = actThresholdClean;
-    } else {
-      actThreshold = actThresholdNoisy;
-    }
-
-    const float far_average_level = aec->farlevel.averagelevel.GetLatestMean();
-
-    // The last condition is to let estimation be made in active far-end
-    // segments only.
-    if ((aec->stateCounter > (0.5f * kCountLen * kSubCountLen)) &&
-        (aec->farlevel.framelevel.EndOfBlock()) &&
-        (far_average_level > (actThreshold * aec->farlevel.minlevel))) {
-
-      // ERL: error return loss.
-      const float near_average_level =
-          aec->nearlevel.averagelevel.GetLatestMean();
-      UpdateLogRatioMetric(&aec->erl, far_average_level, near_average_level);
-
-      // A_NLP: error return loss enhanced before the nonlinear suppression.
-      const float linout_average_level =
-          aec->linoutlevel.averagelevel.GetLatestMean();
-      UpdateLogRatioMetric(&aec->aNlp, near_average_level,
-                           linout_average_level);
-
-      // ERLE: error return loss enhanced.
-      const float nlpout_average_level =
-          aec->nlpoutlevel.averagelevel.GetLatestMean();
-      UpdateLogRatioMetric(&aec->erle, near_average_level,
-                           nlpout_average_level);
-    }
-
-    aec->stateCounter = 0;
-  }
-}
-
-static void UpdateDelayMetrics(AecCore* self) {
-  int i = 0;
-  int delay_values = 0;
-  int median = 0;
-  int lookahead = WebRtc_lookahead(self->delay_estimator);
-  const int kMsPerBlock = PART_LEN / (self->mult * 8);
-  int64_t l1_norm = 0;
-
-  if (self->num_delay_values == 0) {
-    // We have no new delay value data. Even though -1 is a valid |median| in
-    // the sense that we allow negative values, it will practically never be
-    // used since multiples of |kMsPerBlock| will always be returned.
-    // We therefore use -1 to indicate in the logs that the delay estimator was
-    // not able to estimate the delay.
-    self->delay_median = -1;
-    self->delay_std = -1;
-    self->fraction_poor_delays = -1;
-    return;
-  }
-
-  // Start value for median count down.
-  delay_values = self->num_delay_values >> 1;
-  // Get median of delay values since last update.
-  for (i = 0; i < kHistorySizeBlocks; i++) {
-    delay_values -= self->delay_histogram[i];
-    if (delay_values < 0) {
-      median = i;
-      break;
-    }
-  }
-  // Account for lookahead.
-  self->delay_median = (median - lookahead) * kMsPerBlock;
-
-  // Calculate the L1 norm, with median value as central moment.
-  for (i = 0; i < kHistorySizeBlocks; i++) {
-    l1_norm += abs(i - median) * self->delay_histogram[i];
-  }
-  self->delay_std =
-      static_cast<int>((l1_norm + self->num_delay_values / 2) /
-                       self->num_delay_values) * kMsPerBlock;
-
-  // Determine fraction of delays that are out of bounds, that is, either
-  // negative (anti-causal system) or larger than the AEC filter length.
-  {
-    int num_delays_out_of_bounds = self->num_delay_values;
-    const int histogram_length =
-        sizeof(self->delay_histogram) / sizeof(self->delay_histogram[0]);
-    for (i = lookahead; i < lookahead + self->num_partitions; ++i) {
-      if (i < histogram_length)
-        num_delays_out_of_bounds -= self->delay_histogram[i];
-    }
-    self->fraction_poor_delays =
-        static_cast<float>(num_delays_out_of_bounds) / self->num_delay_values;
-  }
-
-  // Reset histogram.
-  memset(self->delay_histogram, 0, sizeof(self->delay_histogram));
-  self->num_delay_values = 0;
-}
-
-static void ScaledInverseFft(const OouraFft& ooura_fft,
-                             float freq_data[2][PART_LEN1],
-                             float time_data[PART_LEN2],
-                             float scale,
-                             int conjugate) {
-  int i;
-  const float normalization = scale / static_cast<float>(PART_LEN2);
-  const float sign = (conjugate ? -1 : 1);
-  time_data[0] = freq_data[0][0] * normalization;
-  time_data[1] = freq_data[0][PART_LEN] * normalization;
-  for (i = 1; i < PART_LEN; i++) {
-    time_data[2 * i] = freq_data[0][i] * normalization;
-    time_data[2 * i + 1] = sign * freq_data[1][i] * normalization;
-  }
-  ooura_fft.InverseFft(time_data);
-}
-
-static void Fft(const OouraFft& ooura_fft,
-                float time_data[PART_LEN2],
-                float freq_data[2][PART_LEN1]) {
-  int i;
-  ooura_fft.Fft(time_data);
-
-  // Reorder fft output data.
-  freq_data[1][0] = 0;
-  freq_data[1][PART_LEN] = 0;
-  freq_data[0][0] = time_data[0];
-  freq_data[0][PART_LEN] = time_data[1];
-  for (i = 1; i < PART_LEN; i++) {
-    freq_data[0][i] = time_data[2 * i];
-    freq_data[1][i] = time_data[2 * i + 1];
-  }
-}
-
-static int SignalBasedDelayCorrection(AecCore* self) {
-  int delay_correction = 0;
-  int last_delay = -2;
-  RTC_DCHECK(self);
-#if !defined(WEBRTC_ANDROID)
-  // On desktops, turn on correction after |kDelayCorrectionStart| frames.  This
-  // is to let the delay estimation get a chance to converge.  Also, if the
-  // playout audio volume is low (or even muted) the delay estimation can return
-  // a very large delay, which will break the AEC if it is applied.
-  if (self->frame_count < kDelayCorrectionStart) {
-    self->data_dumper->DumpRaw("aec_da_reported_delay", 1, &last_delay);
-    return 0;
-  }
-#endif
-
-  // 1. Check for non-negative delay estimate.  Note that the estimates we get
-  //    from the delay estimation are not compensated for lookahead.  Hence, a
-  //    negative |last_delay| is an invalid one.
-  // 2. Verify that there is a delay change.  In addition, only allow a change
-  //    if the delay is outside a certain region taking the AEC filter length
-  //    into account.
-  // TODO(bjornv): Investigate if we can remove the non-zero delay change check.
-  // 3. Only allow delay correction if the delay estimation quality exceeds
-  //    |delay_quality_threshold|.
-  // 4. Finally, verify that the proposed |delay_correction| is feasible by
-  //    comparing with the size of the far-end buffer.
-  last_delay = WebRtc_last_delay(self->delay_estimator);
-  self->data_dumper->DumpRaw("aec_da_reported_delay", 1, &last_delay);
-  if ((last_delay >= 0) && (last_delay != self->previous_delay) &&
-      (WebRtc_last_delay_quality(self->delay_estimator) >
-       self->delay_quality_threshold)) {
-    int delay = last_delay - WebRtc_lookahead(self->delay_estimator);
-    // Allow for a slack in the actual delay, defined by a |lower_bound| and an
-    // |upper_bound|.  The adaptive echo cancellation filter is currently
-    // |num_partitions| (of 64 samples) long.  If the delay estimate is negative
-    // or at least 3/4 of the filter length we open up for correction.
-    const int lower_bound = 0;
-    const int upper_bound = self->num_partitions * 3 / 4;
-    const int do_correction = delay <= lower_bound || delay > upper_bound;
-    if (do_correction == 1) {
-      int available_read = self->farend_block_buffer_.Size();
-      // With |shift_offset| we gradually rely on the delay estimates.  For
-      // positive delays we reduce the correction by |shift_offset| to lower the
-      // risk of pushing the AEC into a non causal state.  For negative delays
-      // we rely on the values up to a rounding error, hence compensate by 1
-      // element to make sure to push the delay into the causal region.
-      delay_correction = -delay;
-      delay_correction += delay > self->shift_offset ? self->shift_offset : 1;
-      self->shift_offset--;
-      self->shift_offset = (self->shift_offset <= 1 ? 1 : self->shift_offset);
-      if (delay_correction > available_read - self->mult - 1) {
-        // There is not enough data in the buffer to perform this shift.  Hence,
-        // we do not rely on the delay estimate and do nothing.
-        delay_correction = 0;
-      } else {
-        self->previous_delay = last_delay;
-        ++self->delay_correction_count;
-      }
-    }
-  }
-  // Update the |delay_quality_threshold| once we have our first delay
-  // correction.
-  if (self->delay_correction_count > 0) {
-    float delay_quality = WebRtc_last_delay_quality(self->delay_estimator);
-    delay_quality =
-        (delay_quality > kDelayQualityThresholdMax ? kDelayQualityThresholdMax
-                                                   : delay_quality);
-    self->delay_quality_threshold =
-        (delay_quality > self->delay_quality_threshold
-             ? delay_quality
-             : self->delay_quality_threshold);
-  }
-  self->data_dumper->DumpRaw("aec_da_delay_correction", 1, &delay_correction);
-
-  return delay_correction;
-}
-
-static void RegressorPower(int num_partitions,
-                           int latest_added_partition,
-                           float x_fft_buf[2]
-                                          [kExtendedNumPartitions * PART_LEN1],
-                           float x_pow[PART_LEN1]) {
-  RTC_DCHECK_LT(latest_added_partition, num_partitions);
-  memset(x_pow, 0, PART_LEN1 * sizeof(x_pow[0]));
-
-  int partition = latest_added_partition;
-  int x_fft_buf_position = partition * PART_LEN1;
-  for (int i = 0; i < num_partitions; ++i) {
-    for (int bin = 0; bin < PART_LEN1; ++bin) {
-      float re = x_fft_buf[0][x_fft_buf_position];
-      float im = x_fft_buf[1][x_fft_buf_position];
-      x_pow[bin] += re * re + im * im;
-      ++x_fft_buf_position;
-    }
-
-    ++partition;
-    if (partition == num_partitions) {
-      partition = 0;
-      RTC_DCHECK_EQ(num_partitions * PART_LEN1, x_fft_buf_position);
-      x_fft_buf_position = 0;
-    }
-  }
-}
-
-static void EchoSubtraction(const OouraFft& ooura_fft,
-                            int num_partitions,
-                            int extended_filter_enabled,
-                            int* extreme_filter_divergence,
-                            float filter_step_size,
-                            float error_threshold,
-                            float* x_fft,
-                            int* x_fft_buf_block_pos,
-                            float x_fft_buf[2]
-                                           [kExtendedNumPartitions * PART_LEN1],
-                            float* const y,
-                            float x_pow[PART_LEN1],
-                            float h_fft_buf[2]
-                                           [kExtendedNumPartitions * PART_LEN1],
-                            float echo_subtractor_output[PART_LEN]) {
-  float s_fft[2][PART_LEN1];
-  float e_extended[PART_LEN2];
-  float s_extended[PART_LEN2];
-  float* s;
-  float e[PART_LEN];
-  float e_fft[2][PART_LEN1];
-  int i;
-
-  // Update the x_fft_buf block position.
-  (*x_fft_buf_block_pos)--;
-  if ((*x_fft_buf_block_pos) == -1) {
-    *x_fft_buf_block_pos = num_partitions - 1;
-  }
-
-  // Buffer x_fft.
-  memcpy(x_fft_buf[0] + (*x_fft_buf_block_pos) * PART_LEN1, x_fft,
-         sizeof(float) * PART_LEN1);
-  memcpy(x_fft_buf[1] + (*x_fft_buf_block_pos) * PART_LEN1, &x_fft[PART_LEN1],
-         sizeof(float) * PART_LEN1);
-
-  memset(s_fft, 0, sizeof(s_fft));
-
-  // Conditionally reset the echo subtraction filter if the filter has diverged
-  // significantly.
-  if (!extended_filter_enabled && *extreme_filter_divergence) {
-    memset(h_fft_buf, 0,
-           2 * kExtendedNumPartitions * PART_LEN1 * sizeof(h_fft_buf[0][0]));
-    *extreme_filter_divergence = 0;
-  }
-
-  // Produce echo estimate s_fft.
-  WebRtcAec_FilterFar(num_partitions, *x_fft_buf_block_pos, x_fft_buf,
-                      h_fft_buf, s_fft);
-
-  // Compute the time-domain echo estimate s.
-  ScaledInverseFft(ooura_fft, s_fft, s_extended, 2.0f, 0);
-  s = &s_extended[PART_LEN];
-
-  // Compute the time-domain echo prediction error.
-  for (i = 0; i < PART_LEN; ++i) {
-    e[i] = y[i] - s[i];
-  }
-
-  // Compute the frequency domain echo prediction error.
-  memset(e_extended, 0, sizeof(float) * PART_LEN);
-  memcpy(e_extended + PART_LEN, e, sizeof(float) * PART_LEN);
-  Fft(ooura_fft, e_extended, e_fft);
-
-  // Scale error signal inversely with far power.
-  WebRtcAec_ScaleErrorSignal(filter_step_size, error_threshold, x_pow, e_fft);
-  WebRtcAec_FilterAdaptation(ooura_fft, num_partitions, *x_fft_buf_block_pos,
-                             x_fft_buf, e_fft, h_fft_buf);
-  memcpy(echo_subtractor_output, e, sizeof(float) * PART_LEN);
-}
-
-static void FormSuppressionGain(AecCore* aec,
-                                float cohde[PART_LEN1],
-                                float cohxd[PART_LEN1],
-                                float hNl[PART_LEN1]) {
-  float hNlDeAvg, hNlXdAvg;
-  float hNlPref[kPrefBandSize];
-  float hNlFb = 0, hNlFbLow = 0;
-  const int prefBandSize = kPrefBandSize / aec->mult;
-  const float prefBandQuant = 0.75f, prefBandQuantLow = 0.5f;
-  const int minPrefBand = 4 / aec->mult;
-  // Power estimate smoothing coefficients.
-  const float* min_overdrive = aec->extended_filter_enabled
-                                   ? kExtendedMinOverDrive
-                                   : kNormalMinOverDrive;
-
-  hNlXdAvg = 0;
-  for (int i = minPrefBand; i < prefBandSize + minPrefBand; ++i) {
-    hNlXdAvg += cohxd[i];
-  }
-  hNlXdAvg /= prefBandSize;
-  hNlXdAvg = 1 - hNlXdAvg;
-
-  hNlDeAvg = 0;
-  for (int i = minPrefBand; i < prefBandSize + minPrefBand; ++i) {
-    hNlDeAvg += cohde[i];
-  }
-  hNlDeAvg /= prefBandSize;
-
-  if (hNlXdAvg < 0.75f && hNlXdAvg < aec->hNlXdAvgMin) {
-    aec->hNlXdAvgMin = hNlXdAvg;
-  }
-
-  if (hNlDeAvg > 0.98f && hNlXdAvg > 0.9f) {
-    aec->stNearState = 1;
-  } else if (hNlDeAvg < 0.95f || hNlXdAvg < 0.8f) {
-    aec->stNearState = 0;
-  }
-
-  if (aec->hNlXdAvgMin == 1) {
-    aec->echoState = 0;
-    aec->overDrive = min_overdrive[aec->nlp_mode];
-
-    if (aec->stNearState == 1) {
-      memcpy(hNl, cohde, sizeof(hNl[0]) * PART_LEN1);
-      hNlFb = hNlDeAvg;
-      hNlFbLow = hNlDeAvg;
-    } else {
-      for (int i = 0; i < PART_LEN1; ++i) {
-        hNl[i] = 1 - cohxd[i];
-      }
-      hNlFb = hNlXdAvg;
-      hNlFbLow = hNlXdAvg;
-    }
-  } else {
-    if (aec->stNearState == 1) {
-      aec->echoState = 0;
-      memcpy(hNl, cohde, sizeof(hNl[0]) * PART_LEN1);
-      hNlFb = hNlDeAvg;
-      hNlFbLow = hNlDeAvg;
-    } else {
-      aec->echoState = 1;
-      for (int i = 0; i < PART_LEN1; ++i) {
-        hNl[i] = WEBRTC_SPL_MIN(cohde[i], 1 - cohxd[i]);
-      }
-
-      // Select an order statistic from the preferred bands.
-      // TODO(peah): Using quicksort now, but a selection algorithm may be
-      // preferred.
-      memcpy(hNlPref, &hNl[minPrefBand], sizeof(float) * prefBandSize);
-      qsort(hNlPref, prefBandSize, sizeof(float), CmpFloat);
-      hNlFb = hNlPref[static_cast<int>(floor(prefBandQuant *
-                                             (prefBandSize - 1)))];
-      hNlFbLow = hNlPref[static_cast<int>(floor(prefBandQuantLow *
-                                                (prefBandSize - 1)))];
-    }
-  }
-
-  // Track the local filter minimum to determine suppression overdrive.
-  if (hNlFbLow < 0.6f && hNlFbLow < aec->hNlFbLocalMin) {
-    aec->hNlFbLocalMin = hNlFbLow;
-    aec->hNlFbMin = hNlFbLow;
-    aec->hNlNewMin = 1;
-    aec->hNlMinCtr = 0;
-  }
-  aec->hNlFbLocalMin =
-      WEBRTC_SPL_MIN(aec->hNlFbLocalMin + 0.0008f / aec->mult, 1);
-  aec->hNlXdAvgMin = WEBRTC_SPL_MIN(aec->hNlXdAvgMin + 0.0006f / aec->mult, 1);
-
-  if (aec->hNlNewMin == 1) {
-    aec->hNlMinCtr++;
-  }
-  if (aec->hNlMinCtr == 2) {
-    aec->hNlNewMin = 0;
-    aec->hNlMinCtr = 0;
-    aec->overDrive =
-        WEBRTC_SPL_MAX(kTargetSupp[aec->nlp_mode] /
-                       static_cast<float>(log(aec->hNlFbMin + 1e-10f) + 1e-10f),
-                       min_overdrive[aec->nlp_mode]);
-  }
-
-  // Smooth the overdrive.
-  if (aec->overDrive < aec->overdrive_scaling) {
-    aec->overdrive_scaling =
-        0.99f * aec->overdrive_scaling + 0.01f * aec->overDrive;
-  } else {
-    aec->overdrive_scaling =
-        0.9f * aec->overdrive_scaling + 0.1f * aec->overDrive;
-  }
-
-  // Apply the overdrive.
-  WebRtcAec_Overdrive(aec->overdrive_scaling, hNlFb, hNl);
-}
-
-static void EchoSuppression(const OouraFft& ooura_fft,
-                            AecCore* aec,
-                            float* nearend_extended_block_lowest_band,
-                            float farend_extended_block[PART_LEN2],
-                            float* echo_subtractor_output,
-                            float output[NUM_HIGH_BANDS_MAX + 1][PART_LEN]) {
-  float efw[2][PART_LEN1];
-  float xfw[2][PART_LEN1];
-  float dfw[2][PART_LEN1];
-  float comfortNoiseHband[2][PART_LEN1];
-  float fft[PART_LEN2];
-  float nlpGainHband;
-  int i;
-  size_t j;
-
-  // Coherence and non-linear filter
-  float cohde[PART_LEN1], cohxd[PART_LEN1];
-  float hNl[PART_LEN1];
-
-  // Filter energy
-  const int delayEstInterval = 10 * aec->mult;
-
-  float* xfw_ptr = NULL;
-
-  // Update eBuf with echo subtractor output.
-  memcpy(aec->eBuf + PART_LEN, echo_subtractor_output,
-         sizeof(float) * PART_LEN);
-
-  // Analysis filter banks for the echo suppressor.
-  // Windowed near-end ffts.
-  WindowData(fft, nearend_extended_block_lowest_band);
-  ooura_fft.Fft(fft);
-  StoreAsComplex(fft, dfw);
-
-  // Windowed echo suppressor output ffts.
-  WindowData(fft, aec->eBuf);
-  ooura_fft.Fft(fft);
-  StoreAsComplex(fft, efw);
-
-  // NLP
-
-  // Convert far-end partition to the frequency domain with windowing.
-  WindowData(fft, farend_extended_block);
-  Fft(ooura_fft, fft, xfw);
-  xfw_ptr = &xfw[0][0];
-
-  // Buffer far.
-  memcpy(aec->xfwBuf, xfw_ptr, sizeof(float) * 2 * PART_LEN1);
-
-  aec->delayEstCtr++;
-  if (aec->delayEstCtr == delayEstInterval) {
-    aec->delayEstCtr = 0;
-    aec->delayIdx = WebRtcAec_PartitionDelay(aec->num_partitions, aec->wfBuf);
-  }
-
-  aec->data_dumper->DumpRaw("aec_nlp_delay", 1, &aec->delayIdx);
-
-  // Use delayed far.
-  memcpy(xfw, aec->xfwBuf + aec->delayIdx * PART_LEN1,
-         sizeof(xfw[0][0]) * 2 * PART_LEN1);
-
-  WebRtcAec_UpdateCoherenceSpectra(aec->mult, aec->extended_filter_enabled == 1,
-                                   efw, dfw, xfw, &aec->coherence_state,
-                                   &aec->divergeState,
-                                   &aec->extreme_filter_divergence);
-
-  WebRtcAec_ComputeCoherence(&aec->coherence_state, cohde, cohxd);
-
-  // Select the microphone signal as output if the filter is deemed to have
-  // diverged.
-  if (aec->divergeState) {
-    memcpy(efw, dfw, sizeof(efw[0][0]) * 2 * PART_LEN1);
-  }
-
-  FormSuppressionGain(aec, cohde, cohxd, hNl);
-
-  aec->data_dumper->DumpRaw("aec_nlp_gain", PART_LEN1, hNl);
-
-  WebRtcAec_Suppress(hNl, efw);
-
-  // Add comfort noise.
-  ComfortNoise(aec->num_bands > 1, &aec->seed, efw, comfortNoiseHband,
-               aec->noisePow, hNl);
-
-  // Inverse error fft.
-  ScaledInverseFft(ooura_fft, efw, fft, 2.0f, 1);
-
-  // Overlap and add to obtain output.
-  for (i = 0; i < PART_LEN; i++) {
-    output[0][i] = (fft[i] * WebRtcAec_sqrtHanning[i] +
-                    aec->outBuf[i] * WebRtcAec_sqrtHanning[PART_LEN - i]);
-
-    // Saturate output to keep it in the allowed range.
-    output[0][i] = WEBRTC_SPL_SAT(WEBRTC_SPL_WORD16_MAX, output[0][i],
-                                  WEBRTC_SPL_WORD16_MIN);
-  }
-  memcpy(aec->outBuf, &fft[PART_LEN], PART_LEN * sizeof(aec->outBuf[0]));
-
-  // For H band
-  if (aec->num_bands > 1) {
-    // H band gain
-    // average nlp over low band: average over second half of freq spectrum
-    // (4->8khz)
-    GetHighbandGain(hNl, &nlpGainHband);
-
-    // Inverse comfort_noise
-    ScaledInverseFft(ooura_fft, comfortNoiseHband, fft, 2.0f, 0);
-
-    // compute gain factor
-    for (j = 1; j < aec->num_bands; ++j) {
-      for (i = 0; i < PART_LEN; i++) {
-        output[j][i] = aec->previous_nearend_block[j][i] * nlpGainHband;
-      }
-    }
-
-    // Add some comfort noise where Hband is attenuated.
-    for (i = 0; i < PART_LEN; i++) {
-      output[1][i] += cnScaleHband * fft[i];
-    }
-
-    // Saturate output to keep it in the allowed range.
-    for (j = 1; j < aec->num_bands; ++j) {
-      for (i = 0; i < PART_LEN; i++) {
-        output[j][i] = WEBRTC_SPL_SAT(WEBRTC_SPL_WORD16_MAX, output[j][i],
-                                      WEBRTC_SPL_WORD16_MIN);
-      }
-    }
-  }
-
-  // Copy the current block to the old position.
-  memcpy(aec->eBuf, aec->eBuf + PART_LEN, sizeof(float) * PART_LEN);
-
-  memmove(aec->xfwBuf + PART_LEN1, aec->xfwBuf,
-          sizeof(aec->xfwBuf) - sizeof(complex_t) * PART_LEN1);
-}
-
-static void ProcessNearendBlock(
-    AecCore* aec,
-    float farend_extended_block_lowest_band[PART_LEN2],
-    float nearend_block[NUM_HIGH_BANDS_MAX + 1][PART_LEN],
-    float output_block[NUM_HIGH_BANDS_MAX + 1][PART_LEN]) {
-  size_t i;
-
-  float fft[PART_LEN2];
-  float nearend_extended_block_lowest_band[PART_LEN2];
-  float farend_fft[2][PART_LEN1];
-  float nearend_fft[2][PART_LEN1];
-  float far_spectrum = 0.0f;
-  float near_spectrum = 0.0f;
-  float abs_far_spectrum[PART_LEN1];
-  float abs_near_spectrum[PART_LEN1];
-
-  const float gPow[2] = {0.9f, 0.1f};
-
-  // Noise estimate constants.
-  const int noiseInitBlocks = 500 * aec->mult;
-  const float step = 0.1f;
-  const float ramp = 1.0002f;
-  const float gInitNoise[2] = {0.999f, 0.001f};
-
-  float echo_subtractor_output[PART_LEN];
-
-  aec->data_dumper->DumpWav("aec_far", PART_LEN,
-                            &farend_extended_block_lowest_band[PART_LEN],
-                            std::min(aec->sampFreq, 16000), 1);
-  aec->data_dumper->DumpWav("aec_near", PART_LEN, &nearend_block[0][0],
-                            std::min(aec->sampFreq, 16000), 1);
-
-  if (aec->metricsMode == 1) {
-    // Update power levels
-    UpdateLevel(
-        &aec->farlevel,
-        CalculatePower(&farend_extended_block_lowest_band[PART_LEN], PART_LEN));
-    UpdateLevel(&aec->nearlevel,
-                CalculatePower(&nearend_block[0][0], PART_LEN));
-  }
-
-  // Convert far-end signal to the frequency domain.
-  memcpy(fft, farend_extended_block_lowest_band, sizeof(float) * PART_LEN2);
-  Fft(aec->ooura_fft, fft, farend_fft);
-
-  // Form extended nearend frame.
-  memcpy(&nearend_extended_block_lowest_band[0],
-         &aec->previous_nearend_block[0][0], sizeof(float) * PART_LEN);
-  memcpy(&nearend_extended_block_lowest_band[PART_LEN], &nearend_block[0][0],
-         sizeof(float) * PART_LEN);
-
-  // Convert near-end signal to the frequency domain.
-  memcpy(fft, nearend_extended_block_lowest_band, sizeof(float) * PART_LEN2);
-  Fft(aec->ooura_fft, fft, nearend_fft);
-
-  // Power smoothing.
-  if (aec->refined_adaptive_filter_enabled) {
-    for (i = 0; i < PART_LEN1; ++i) {
-      far_spectrum = farend_fft[0][i] * farend_fft[0][i] +
-                     farend_fft[1][i] * farend_fft[1][i];
-      // Calculate the magnitude spectrum.
-      abs_far_spectrum[i] = sqrtf(far_spectrum);
-    }
-    RegressorPower(aec->num_partitions, aec->xfBufBlockPos, aec->xfBuf,
-                   aec->xPow);
-  } else {
-    for (i = 0; i < PART_LEN1; ++i) {
-      far_spectrum = farend_fft[0][i] * farend_fft[0][i] +
-                     farend_fft[1][i] * farend_fft[1][i];
-      aec->xPow[i] =
-          gPow[0] * aec->xPow[i] + gPow[1] * aec->num_partitions * far_spectrum;
-      // Calculate the magnitude spectrum.
-      abs_far_spectrum[i] = sqrtf(far_spectrum);
-    }
-  }
-
-  for (i = 0; i < PART_LEN1; ++i) {
-    near_spectrum = nearend_fft[0][i] * nearend_fft[0][i] +
-                    nearend_fft[1][i] * nearend_fft[1][i];
-    aec->dPow[i] = gPow[0] * aec->dPow[i] + gPow[1] * near_spectrum;
-    // Calculate the magnitude spectrum.
-    abs_near_spectrum[i] = sqrtf(near_spectrum);
-  }
-
-  // Estimate noise power. Wait until dPow is more stable.
-  if (aec->noiseEstCtr > 50) {
-    for (i = 0; i < PART_LEN1; i++) {
-      if (aec->dPow[i] < aec->dMinPow[i]) {
-        aec->dMinPow[i] =
-            (aec->dPow[i] + step * (aec->dMinPow[i] - aec->dPow[i])) * ramp;
-      } else {
-        aec->dMinPow[i] *= ramp;
-      }
-    }
-  }
-
-  // Smooth increasing noise power from zero at the start,
-  // to avoid a sudden burst of comfort noise.
-  if (aec->noiseEstCtr < noiseInitBlocks) {
-    aec->noiseEstCtr++;
-    for (i = 0; i < PART_LEN1; i++) {
-      if (aec->dMinPow[i] > aec->dInitMinPow[i]) {
-        aec->dInitMinPow[i] = gInitNoise[0] * aec->dInitMinPow[i] +
-                              gInitNoise[1] * aec->dMinPow[i];
-      } else {
-        aec->dInitMinPow[i] = aec->dMinPow[i];
-      }
-    }
-    aec->noisePow = aec->dInitMinPow;
-  } else {
-    aec->noisePow = aec->dMinPow;
-  }
-
-  // Block wise delay estimation used for logging
-  if (aec->delay_logging_enabled) {
-    if (WebRtc_AddFarSpectrumFloat(aec->delay_estimator_farend,
-                                   abs_far_spectrum, PART_LEN1) == 0) {
-      int delay_estimate = WebRtc_DelayEstimatorProcessFloat(
-          aec->delay_estimator, abs_near_spectrum, PART_LEN1);
-      if (delay_estimate >= 0) {
-        // Update delay estimate buffer.
-        aec->delay_histogram[delay_estimate]++;
-        aec->num_delay_values++;
-      }
-      if (aec->delay_metrics_delivered == 1 &&
-          aec->num_delay_values >= kDelayMetricsAggregationWindow) {
-        UpdateDelayMetrics(aec);
-      }
-    }
-  }
-
-  // Perform echo subtraction.
-  EchoSubtraction(
-      aec->ooura_fft, aec->num_partitions, aec->extended_filter_enabled,
-      &aec->extreme_filter_divergence, aec->filter_step_size,
-      aec->error_threshold, &farend_fft[0][0], &aec->xfBufBlockPos, aec->xfBuf,
-      &nearend_block[0][0], aec->xPow, aec->wfBuf, echo_subtractor_output);
-  aec->data_dumper->DumpRaw("aec_h_fft", PART_LEN1 * aec->num_partitions,
-                            &aec->wfBuf[0][0]);
-  aec->data_dumper->DumpRaw("aec_h_fft", PART_LEN1 * aec->num_partitions,
-                            &aec->wfBuf[1][0]);
-
-  aec->data_dumper->DumpWav("aec_out_linear", PART_LEN, echo_subtractor_output,
-                            std::min(aec->sampFreq, 16000), 1);
-
-  if (aec->metricsMode == 1) {
-    UpdateLevel(&aec->linoutlevel,
-                CalculatePower(echo_subtractor_output, PART_LEN));
-  }
-
-  // Perform echo suppression.
-  EchoSuppression(aec->ooura_fft, aec, nearend_extended_block_lowest_band,
-                  farend_extended_block_lowest_band, echo_subtractor_output,
-                  output_block);
-
-  if (aec->metricsMode == 1) {
-    UpdateLevel(&aec->nlpoutlevel,
-                CalculatePower(&output_block[0][0], PART_LEN));
-    UpdateMetrics(aec);
-  }
-
-  // Store the nearend signal until the next frame.
-  for (i = 0; i < aec->num_bands; ++i) {
-    memcpy(&aec->previous_nearend_block[i][0], &nearend_block[i][0],
-           sizeof(float) * PART_LEN);
-  }
-
-  aec->data_dumper->DumpWav("aec_out", PART_LEN, &output_block[0][0],
-                            std::min(aec->sampFreq, 16000), 1);
-}
-
-AecCore* WebRtcAec_CreateAec(int instance_count) {
-  AecCore* aec = new AecCore(instance_count);
-
-  if (!aec) {
-    return NULL;
-  }
-  aec->nearend_buffer_size = 0;
-  memset(&aec->nearend_buffer[0], 0, sizeof(aec->nearend_buffer));
-  // Start the output buffer with zeros to be able to produce
-  // a full output frame in the first frame.
-  aec->output_buffer_size = PART_LEN - (FRAME_LEN - PART_LEN);
-  memset(&aec->output_buffer[0], 0, sizeof(aec->output_buffer));
-
-  aec->delay_estimator_farend =
-      WebRtc_CreateDelayEstimatorFarend(PART_LEN1, kHistorySizeBlocks);
-  if (aec->delay_estimator_farend == NULL) {
-    WebRtcAec_FreeAec(aec);
-    return NULL;
-  }
-  // We create the delay_estimator with the same amount of maximum lookahead as
-  // the delay history size (kHistorySizeBlocks) for symmetry reasons.
-  aec->delay_estimator = WebRtc_CreateDelayEstimator(
-      aec->delay_estimator_farend, kHistorySizeBlocks);
-  if (aec->delay_estimator == NULL) {
-    WebRtcAec_FreeAec(aec);
-    return NULL;
-  }
-#ifdef WEBRTC_ANDROID
-  aec->delay_agnostic_enabled = 1;  // DA-AEC enabled by default.
-  // DA-AEC assumes the system is causal from the beginning and will self adjust
-  // the lookahead when shifting is required.
-  WebRtc_set_lookahead(aec->delay_estimator, 0);
-#else
-  aec->delay_agnostic_enabled = 0;
-  WebRtc_set_lookahead(aec->delay_estimator, kLookaheadBlocks);
-#endif
-  aec->extended_filter_enabled = 0;
-  aec->refined_adaptive_filter_enabled = false;
-
-  // Assembly optimization
-  WebRtcAec_FilterFar = FilterFar;
-  WebRtcAec_ScaleErrorSignal = ScaleErrorSignal;
-  WebRtcAec_FilterAdaptation = FilterAdaptation;
-  WebRtcAec_Overdrive = Overdrive;
-  WebRtcAec_Suppress = Suppress;
-  WebRtcAec_ComputeCoherence = ComputeCoherence;
-  WebRtcAec_UpdateCoherenceSpectra = UpdateCoherenceSpectra;
-  WebRtcAec_StoreAsComplex = StoreAsComplex;
-  WebRtcAec_PartitionDelay = PartitionDelay;
-  WebRtcAec_WindowData = WindowData;
-
-#if defined(WEBRTC_ARCH_X86_FAMILY)
-  if (WebRtc_GetCPUInfo(kSSE2)) {
-    WebRtcAec_InitAec_SSE2();
-  }
-#endif
-
-#if defined(MIPS_FPU_LE)
-  WebRtcAec_InitAec_mips();
-#endif
-
-#if defined(WEBRTC_HAS_NEON)
-  WebRtcAec_InitAec_neon();
-#endif
-
-  return aec;
-}
-
-void WebRtcAec_FreeAec(AecCore* aec) {
-  if (aec == NULL) {
-    return;
-  }
-
-  WebRtc_FreeDelayEstimator(aec->delay_estimator);
-  WebRtc_FreeDelayEstimatorFarend(aec->delay_estimator_farend);
-
-  delete aec;
-}
-
-static void SetAdaptiveFilterStepSize(AecCore* aec) {
-  // Extended filter adaptation parameter.
-  // TODO(ajm): No narrowband tuning yet.
-  const float kExtendedMu = 0.4f;
-
-  if (aec->refined_adaptive_filter_enabled) {
-    aec->filter_step_size = 0.05f;
-  } else {
-    if (aec->extended_filter_enabled) {
-      aec->filter_step_size = kExtendedMu;
-    } else {
-      if (aec->sampFreq == 8000) {
-        aec->filter_step_size = 0.6f;
-      } else {
-        aec->filter_step_size = 0.5f;
-      }
-    }
-  }
-}
-
-static void SetErrorThreshold(AecCore* aec) {
-  // Extended filter adaptation parameter.
-  // TODO(ajm): No narrowband tuning yet.
-  static const float kExtendedErrorThreshold = 1.0e-6f;
-
-  if (aec->extended_filter_enabled) {
-    aec->error_threshold = kExtendedErrorThreshold;
-  } else {
-    if (aec->sampFreq == 8000) {
-      aec->error_threshold = 2e-6f;
-    } else {
-      aec->error_threshold = 1.5e-6f;
-    }
-  }
-}
-
-int WebRtcAec_InitAec(AecCore* aec, int sampFreq) {
-  int i;
-  aec->data_dumper->InitiateNewSetOfRecordings();
-
-  aec->sampFreq = sampFreq;
-
-  SetAdaptiveFilterStepSize(aec);
-  SetErrorThreshold(aec);
-
-  if (sampFreq == 8000) {
-    aec->num_bands = 1;
-  } else {
-    aec->num_bands = (size_t)(sampFreq / 16000);
-  }
-
-  // Start the output buffer with zeros to be able to produce
-  // a full output frame in the first frame.
-  aec->output_buffer_size = PART_LEN - (FRAME_LEN - PART_LEN);
-  memset(&aec->output_buffer[0], 0, sizeof(aec->output_buffer));
-  aec->nearend_buffer_size = 0;
-  memset(&aec->nearend_buffer[0], 0, sizeof(aec->nearend_buffer));
-
-  // Initialize far-end buffer.
-  aec->farend_block_buffer_.ReInit();
-
-  aec->system_delay = 0;
-
-  if (WebRtc_InitDelayEstimatorFarend(aec->delay_estimator_farend) != 0) {
-    return -1;
-  }
-  if (WebRtc_InitDelayEstimator(aec->delay_estimator) != 0) {
-    return -1;
-  }
-  aec->delay_logging_enabled = 0;
-  aec->delay_metrics_delivered = 0;
-  memset(aec->delay_histogram, 0, sizeof(aec->delay_histogram));
-  aec->num_delay_values = 0;
-  aec->delay_median = -1;
-  aec->delay_std = -1;
-  aec->fraction_poor_delays = -1.0f;
-
-  aec->previous_delay = -2;  // (-2): Uninitialized.
-  aec->delay_correction_count = 0;
-  aec->shift_offset = kInitialShiftOffset;
-  aec->delay_quality_threshold = kDelayQualityThresholdMin;
-
-  aec->num_partitions = kNormalNumPartitions;
-
-  // Update the delay estimator with filter length.  We use half the
-  // |num_partitions| to take the echo path into account.  In practice we say
-  // that the echo has a duration of maximum half |num_partitions|, which is not
-  // true, but serves as a crude measure.
-  WebRtc_set_allowed_offset(aec->delay_estimator, aec->num_partitions / 2);
-  // TODO(bjornv): I currently hard coded the enable.  Once we've established
-  // that AECM has no performance regression, robust_validation will be enabled
-  // all the time and the APIs to turn it on/off will be removed.  Hence, remove
-  // this line then.
-  WebRtc_enable_robust_validation(aec->delay_estimator, 1);
-  aec->frame_count = 0;
-
-  // Default target suppression mode.
-  aec->nlp_mode = 1;
-
-  // Sampling frequency multiplier w.r.t. 8 kHz.
-  // In case of multiple bands we process the lower band in 16 kHz, hence the
-  // multiplier is always 2.
-  if (aec->num_bands > 1) {
-    aec->mult = 2;
-  } else {
-    aec->mult = static_cast<int16_t>(aec->sampFreq) / 8000;
-  }
-
-  aec->farBufWritePos = 0;
-  aec->farBufReadPos = 0;
-
-  aec->inSamples = 0;
-  aec->outSamples = 0;
-  aec->knownDelay = 0;
-
-  // Initialize buffers
-  memset(aec->previous_nearend_block, 0, sizeof(aec->previous_nearend_block));
-  memset(aec->eBuf, 0, sizeof(aec->eBuf));
-
-  memset(aec->xPow, 0, sizeof(aec->xPow));
-  memset(aec->dPow, 0, sizeof(aec->dPow));
-  memset(aec->dInitMinPow, 0, sizeof(aec->dInitMinPow));
-  aec->noisePow = aec->dInitMinPow;
-  aec->noiseEstCtr = 0;
-
-  // Initial comfort noise power
-  for (i = 0; i < PART_LEN1; i++) {
-    aec->dMinPow[i] = 1.0e6f;
-  }
-
-  // Holds the last block written to
-  aec->xfBufBlockPos = 0;
-  // TODO(peah): Investigate need for these initializations. Deleting them
-  // doesn't change the output at all and yields 0.4% overall speedup.
-  memset(aec->xfBuf, 0, sizeof(complex_t) * kExtendedNumPartitions * PART_LEN1);
-  memset(aec->wfBuf, 0, sizeof(complex_t) * kExtendedNumPartitions * PART_LEN1);
-  memset(aec->coherence_state.sde, 0, sizeof(complex_t) * PART_LEN1);
-  memset(aec->coherence_state.sxd, 0, sizeof(complex_t) * PART_LEN1);
-  memset(aec->xfwBuf, 0,
-         sizeof(complex_t) * kExtendedNumPartitions * PART_LEN1);
-  memset(aec->coherence_state.se, 0, sizeof(float) * PART_LEN1);
-
-  // To prevent numerical instability in the first block.
-  for (i = 0; i < PART_LEN1; i++) {
-    aec->coherence_state.sd[i] = 1;
-  }
-  for (i = 0; i < PART_LEN1; i++) {
-    aec->coherence_state.sx[i] = 1;
-  }
-
-  memset(aec->hNs, 0, sizeof(aec->hNs));
-  memset(aec->outBuf, 0, sizeof(float) * PART_LEN);
-
-  aec->hNlFbMin = 1;
-  aec->hNlFbLocalMin = 1;
-  aec->hNlXdAvgMin = 1;
-  aec->hNlNewMin = 0;
-  aec->hNlMinCtr = 0;
-  aec->overDrive = 2;
-  aec->overdrive_scaling = 2;
-  aec->delayIdx = 0;
-  aec->stNearState = 0;
-  aec->echoState = 0;
-  aec->divergeState = 0;
-
-  aec->seed = 777;
-  aec->delayEstCtr = 0;
-
-  aec->extreme_filter_divergence = 0;
-
-  // Metrics disabled by default
-  aec->metricsMode = 0;
-  InitMetrics(aec);
-
-  return 0;
-}
-
-void WebRtcAec_BufferFarendBlock(AecCore* aec, const float* farend) {
-  // Check if the buffer is full, and in that case flush the oldest data.
-  if (aec->farend_block_buffer_.AvaliableSpace() < 1) {
-    aec->farend_block_buffer_.AdjustSize(1);
-  }
-  aec->farend_block_buffer_.Insert(farend);
-}
-
-int WebRtcAec_AdjustFarendBufferSizeAndSystemDelay(AecCore* aec,
-                                                   int buffer_size_decrease) {
-  int achieved_buffer_size_decrease =
-      aec->farend_block_buffer_.AdjustSize(buffer_size_decrease);
-  aec->system_delay -= achieved_buffer_size_decrease * PART_LEN;
-  return achieved_buffer_size_decrease;
-}
-
-void FormNearendBlock(
-    size_t nearend_start_index,
-    size_t num_bands,
-    const float* const* nearend_frame,
-    size_t num_samples_from_nearend_frame,
-    const float nearend_buffer[NUM_HIGH_BANDS_MAX + 1]
-                              [PART_LEN - (FRAME_LEN - PART_LEN)],
-    float nearend_block[NUM_HIGH_BANDS_MAX + 1][PART_LEN]) {
-  RTC_DCHECK_LE(num_samples_from_nearend_frame, PART_LEN);
-  const int num_samples_from_buffer = PART_LEN - num_samples_from_nearend_frame;
-
-  if (num_samples_from_buffer > 0) {
-    for (size_t i = 0; i < num_bands; ++i) {
-      memcpy(&nearend_block[i][0], &nearend_buffer[i][0],
-             num_samples_from_buffer * sizeof(float));
-    }
-  }
-
-  for (size_t i = 0; i < num_bands; ++i) {
-    memcpy(&nearend_block[i][num_samples_from_buffer],
-           &nearend_frame[i][nearend_start_index],
-           num_samples_from_nearend_frame * sizeof(float));
-  }
-}
-
-void BufferNearendFrame(
-    size_t nearend_start_index,
-    size_t num_bands,
-    const float* const* nearend_frame,
-    size_t num_samples_to_buffer,
-    float nearend_buffer[NUM_HIGH_BANDS_MAX + 1]
-                        [PART_LEN - (FRAME_LEN - PART_LEN)]) {
-  for (size_t i = 0; i < num_bands; ++i) {
-    memcpy(
-        &nearend_buffer[i][0],
-        &nearend_frame[i]
-                      [nearend_start_index + FRAME_LEN - num_samples_to_buffer],
-        num_samples_to_buffer * sizeof(float));
-  }
-}
-
-void BufferOutputBlock(size_t num_bands,
-                       const float output_block[NUM_HIGH_BANDS_MAX + 1]
-                                               [PART_LEN],
-                       size_t* output_buffer_size,
-                       float output_buffer[NUM_HIGH_BANDS_MAX + 1]
-                                          [2 * PART_LEN]) {
-  for (size_t i = 0; i < num_bands; ++i) {
-    memcpy(&output_buffer[i][*output_buffer_size], &output_block[i][0],
-           PART_LEN * sizeof(float));
-  }
-  (*output_buffer_size) += PART_LEN;
-}
-
-void FormOutputFrame(size_t output_start_index,
-                     size_t num_bands,
-                     size_t* output_buffer_size,
-                     float output_buffer[NUM_HIGH_BANDS_MAX + 1][2 * PART_LEN],
-                     float* const* output_frame) {
-  RTC_DCHECK_LE(FRAME_LEN, *output_buffer_size);
-  for (size_t i = 0; i < num_bands; ++i) {
-    memcpy(&output_frame[i][output_start_index], &output_buffer[i][0],
-           FRAME_LEN * sizeof(float));
-  }
-  (*output_buffer_size) -= FRAME_LEN;
-  if (*output_buffer_size > 0) {
-    RTC_DCHECK_GE(2 * PART_LEN - FRAME_LEN, (*output_buffer_size));
-    for (size_t i = 0; i < num_bands; ++i) {
-      memcpy(&output_buffer[i][0], &output_buffer[i][FRAME_LEN],
-             (*output_buffer_size) * sizeof(float));
-    }
-  }
-}
-
-void WebRtcAec_ProcessFrames(AecCore* aec,
-                             const float* const* nearend,
-                             size_t num_bands,
-                             size_t num_samples,
-                             int knownDelay,
-                             float* const* out) {
-  RTC_DCHECK(num_samples == 80 || num_samples == 160);
-
-  aec->frame_count++;
-  // For each frame the process is as follows:
-  // 1) If the system_delay indicates on being too small for processing a
-  //    frame we stuff the buffer with enough data for 10 ms.
-  // 2 a) Adjust the buffer to the system delay, by moving the read pointer.
-  //   b) Apply signal based delay correction, if we have detected poor AEC
-  //    performance.
-  // 3) TODO(bjornv): Investigate if we need to add this:
-  //    If we can't move read pointer due to buffer size limitations we
-  //    flush/stuff the buffer.
-  // 4) Process as many partitions as possible.
-  // 5) Update the |system_delay| with respect to a full frame of FRAME_LEN
-  //    samples. Even though we will have data left to process (we work with
-  //    partitions) we consider updating a whole frame, since that's the
-  //    amount of data we input and output in audio_processing.
-  // 6) Update the outputs.
-
-  // The AEC has two different delay estimation algorithms built in.  The
-  // first relies on delay input values from the user and the amount of
-  // shifted buffer elements is controlled by |knownDelay|.  This delay will
-  // give a guess on how much we need to shift far-end buffers to align with
-  // the near-end signal.  The other delay estimation algorithm uses the
-  // far- and near-end signals to find the offset between them.  This one
-  // (called "signal delay") is then used to fine tune the alignment, or
-  // simply compensate for errors in the system based one.
-  // Note that the two algorithms operate independently.  Currently, we only
-  // allow one algorithm to be turned on.
-
-  RTC_DCHECK_EQ(aec->num_bands, num_bands);
-
-  for (size_t j = 0; j < num_samples; j += FRAME_LEN) {
-    // 1) At most we process |aec->mult|+1 partitions in 10 ms. Make sure we
-    // have enough far-end data for that by stuffing the buffer if the
-    // |system_delay| indicates others.
-    if (aec->system_delay < FRAME_LEN) {
-      // We don't have enough data so we rewind 10 ms.
-      WebRtcAec_AdjustFarendBufferSizeAndSystemDelay(aec, -(aec->mult + 1));
-    }
-
-    if (!aec->delay_agnostic_enabled) {
-      // 2 a) Compensate for a possible change in the system delay.
-
-      // TODO(bjornv): Investigate how we should round the delay difference;
-      // right now we know that incoming |knownDelay| is underestimated when
-      // it's less than |aec->knownDelay|. We therefore, round (-32) in that
-      // direction. In the other direction, we don't have this situation, but
-      // might flush one partition too little. This can cause non-causality,
-      // which should be investigated. Maybe, allow for a non-symmetric
-      // rounding, like -16.
-      int move_elements = (aec->knownDelay - knownDelay - 32) / PART_LEN;
-      int moved_elements = aec->farend_block_buffer_.AdjustSize(move_elements);
-      MaybeLogDelayAdjustment(moved_elements * (aec->sampFreq == 8000 ? 8 : 4),
-                              DelaySource::kSystemDelay);
-      aec->knownDelay -= moved_elements * PART_LEN;
-    } else {
-      // 2 b) Apply signal based delay correction.
-      int move_elements = SignalBasedDelayCorrection(aec);
-      int moved_elements = aec->farend_block_buffer_.AdjustSize(move_elements);
-      MaybeLogDelayAdjustment(moved_elements * (aec->sampFreq == 8000 ? 8 : 4),
-                              DelaySource::kDelayAgnostic);
-      int far_near_buffer_diff =
-          aec->farend_block_buffer_.Size() -
-          (aec->nearend_buffer_size + FRAME_LEN) / PART_LEN;
-      WebRtc_SoftResetDelayEstimator(aec->delay_estimator, moved_elements);
-      WebRtc_SoftResetDelayEstimatorFarend(aec->delay_estimator_farend,
-                                           moved_elements);
-      // If we rely on reported system delay values only, a buffer underrun here
-      // can never occur since we've taken care of that in 1) above.  Here, we
-      // apply signal based delay correction and can therefore end up with
-      // buffer underruns since the delay estimation can be wrong.  We therefore
-      // stuff the buffer with enough elements if needed.
-      if (far_near_buffer_diff < 0) {
-        WebRtcAec_AdjustFarendBufferSizeAndSystemDelay(aec,
-                                                       far_near_buffer_diff);
-      }
-    }
-
-    static_assert(
-        16 == (FRAME_LEN - PART_LEN),
-        "These constants need to be properly related for this code to work");
-    float output_block[NUM_HIGH_BANDS_MAX + 1][PART_LEN];
-    float nearend_block[NUM_HIGH_BANDS_MAX + 1][PART_LEN];
-    float farend_extended_block_lowest_band[PART_LEN2];
-
-    // Form and process a block of nearend samples, buffer the output block of
-    // samples.
-    aec->farend_block_buffer_.ExtractExtendedBlock(
-        farend_extended_block_lowest_band);
-    FormNearendBlock(j, num_bands, nearend, PART_LEN - aec->nearend_buffer_size,
-                     aec->nearend_buffer, nearend_block);
-    ProcessNearendBlock(aec, farend_extended_block_lowest_band, nearend_block,
-                        output_block);
-    BufferOutputBlock(num_bands, output_block, &aec->output_buffer_size,
-                      aec->output_buffer);
-
-    if ((FRAME_LEN - PART_LEN + aec->nearend_buffer_size) == PART_LEN) {
-      // When possible (every fourth frame) form and process a second block of
-      // nearend samples, buffer the output block of samples.
-      aec->farend_block_buffer_.ExtractExtendedBlock(
-          farend_extended_block_lowest_band);
-      FormNearendBlock(j + FRAME_LEN - PART_LEN, num_bands, nearend, PART_LEN,
-                       aec->nearend_buffer, nearend_block);
-      ProcessNearendBlock(aec, farend_extended_block_lowest_band, nearend_block,
-                          output_block);
-      BufferOutputBlock(num_bands, output_block, &aec->output_buffer_size,
-                        aec->output_buffer);
-
-      // Reset the buffer size as there are no samples left in the nearend input
-      // to buffer.
-      aec->nearend_buffer_size = 0;
-    } else {
-      // Buffer the remaining samples in the nearend input.
-      aec->nearend_buffer_size += FRAME_LEN - PART_LEN;
-      BufferNearendFrame(j, num_bands, nearend, aec->nearend_buffer_size,
-                         aec->nearend_buffer);
-    }
-
-    // 5) Update system delay with respect to the entire frame.
-    aec->system_delay -= FRAME_LEN;
-
-    // 6) Form the output frame.
-    FormOutputFrame(j, num_bands, &aec->output_buffer_size, aec->output_buffer,
-                    out);
-  }
-}
-
-int WebRtcAec_GetDelayMetricsCore(AecCore* self,
-                                  int* median,
-                                  int* std,
-                                  float* fraction_poor_delays) {
-  RTC_DCHECK(self);
-  RTC_DCHECK(median);
-  RTC_DCHECK(std);
-
-  if (self->delay_logging_enabled == 0) {
-    // Logging disabled.
-    return -1;
-  }
-
-  if (self->delay_metrics_delivered == 0) {
-    UpdateDelayMetrics(self);
-    self->delay_metrics_delivered = 1;
-  }
-  *median = self->delay_median;
-  *std = self->delay_std;
-  *fraction_poor_delays = self->fraction_poor_delays;
-
-  return 0;
-}
-
-int WebRtcAec_echo_state(AecCore* self) {
-  return self->echoState;
-}
-
-void WebRtcAec_GetEchoStats(AecCore* self,
-                            Stats* erl,
-                            Stats* erle,
-                            Stats* a_nlp,
-                            float* divergent_filter_fraction) {
-  RTC_DCHECK(erl);
-  RTC_DCHECK(erle);
-  RTC_DCHECK(a_nlp);
-  *erl = self->erl;
-  *erle = self->erle;
-  *a_nlp = self->aNlp;
-  *divergent_filter_fraction =
-      self->divergent_filter_fraction.GetLatestFraction();
-}
-
-void WebRtcAec_SetConfigCore(AecCore* self,
-                             int nlp_mode,
-                             int metrics_mode,
-                             int delay_logging) {
-  RTC_DCHECK_GE(nlp_mode, 0);
-  RTC_DCHECK_LT(nlp_mode, 3);
-  self->nlp_mode = nlp_mode;
-  self->metricsMode = metrics_mode;
-  if (self->metricsMode) {
-    InitMetrics(self);
-  }
-  // Turn on delay logging if it is either set explicitly or if delay agnostic
-  // AEC is enabled (which requires delay estimates).
-  self->delay_logging_enabled = delay_logging || self->delay_agnostic_enabled;
-  if (self->delay_logging_enabled) {
-    memset(self->delay_histogram, 0, sizeof(self->delay_histogram));
-  }
-}
-
-void WebRtcAec_enable_delay_agnostic(AecCore* self, int enable) {
-  self->delay_agnostic_enabled = enable;
-}
-
-int WebRtcAec_delay_agnostic_enabled(AecCore* self) {
-  return self->delay_agnostic_enabled;
-}
-
-void WebRtcAec_enable_refined_adaptive_filter(AecCore* self, bool enable) {
-  self->refined_adaptive_filter_enabled = enable;
-  SetAdaptiveFilterStepSize(self);
-  SetErrorThreshold(self);
-}
-
-bool WebRtcAec_refined_adaptive_filter_enabled(const AecCore* self) {
-  return self->refined_adaptive_filter_enabled;
-}
-
-void WebRtcAec_enable_extended_filter(AecCore* self, int enable) {
-  self->extended_filter_enabled = enable;
-  SetAdaptiveFilterStepSize(self);
-  SetErrorThreshold(self);
-  self->num_partitions = enable ? kExtendedNumPartitions : kNormalNumPartitions;
-  // Update the delay estimator with filter length.  See InitAEC() for details.
-  WebRtc_set_allowed_offset(self->delay_estimator, self->num_partitions / 2);
-}
-
-int WebRtcAec_extended_filter_enabled(AecCore* self) {
-  return self->extended_filter_enabled;
-}
-
-int WebRtcAec_system_delay(AecCore* self) {
-  return self->system_delay;
-}
-
-void WebRtcAec_SetSystemDelay(AecCore* self, int delay) {
-  RTC_DCHECK_GE(delay, 0);
-  self->system_delay = delay;
-}
-}  // namespace webrtc
diff --git a/modules/audio_processing/aec/aec_core.h b/modules/audio_processing/aec/aec_core.h
deleted file mode 100644
index 9a4c241..0000000
--- a/modules/audio_processing/aec/aec_core.h
+++ /dev/null
@@ -1,335 +0,0 @@
-/*
- *  Copyright (c) 2012 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.
- */
-
-/*
- * Specifies the interface for the AEC core.
- */
-
-#ifndef WEBRTC_MODULES_AUDIO_PROCESSING_AEC_AEC_CORE_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_AEC_AEC_CORE_H_
-
-#include <stddef.h>
-
-#include <memory>
-
-extern "C" {
-#include "webrtc/common_audio/ring_buffer.h"
-}
-#include "webrtc/common_audio/wav_file.h"
-#include "webrtc/modules/audio_processing/aec/aec_common.h"
-#include "webrtc/modules/audio_processing/utility/block_mean_calculator.h"
-#include "webrtc/modules/audio_processing/utility/ooura_fft.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-#define FRAME_LEN 80
-#define PART_LEN 64               // Length of partition
-#define PART_LEN1 (PART_LEN + 1)  // Unique fft coefficients
-#define PART_LEN2 (PART_LEN * 2)  // Length of partition * 2
-#define NUM_HIGH_BANDS_MAX 2      // Max number of high bands
-
-class ApmDataDumper;
-
-typedef float complex_t[2];
-// For performance reasons, some arrays of complex numbers are replaced by twice
-// as long arrays of float, all the real parts followed by all the imaginary
-// ones (complex_t[SIZE] -> float[2][SIZE]). This allows SIMD optimizations and
-// is better than two arrays (one for the real parts and one for the imaginary
-// parts) as this other way would require two pointers instead of one and cause
-// extra register spilling. This also allows the offsets to be calculated at
-// compile time.
-
-// Metrics
-enum { kOffsetLevel = -100 };
-
-typedef struct Stats {
-  float instant;
-  float average;
-  float min;
-  float max;
-  float sum;
-  float hisum;
-  float himean;
-  size_t counter;
-  size_t hicounter;
-} Stats;
-
-// Number of partitions for the extended filter mode. The first one is an enum
-// to be used in array declarations, as it represents the maximum filter length.
-enum { kExtendedNumPartitions = 32 };
-static const int kNormalNumPartitions = 12;
-
-// Delay estimator constants, used for logging and delay compensation if
-// if reported delays are disabled.
-enum { kLookaheadBlocks = 15 };
-enum {
-  // 500 ms for 16 kHz which is equivalent with the limit of reported delays.
-  kHistorySizeBlocks = 125
-};
-
-typedef struct PowerLevel {
-  PowerLevel();
-
-  BlockMeanCalculator framelevel;
-  BlockMeanCalculator averagelevel;
-  float minlevel;
-} PowerLevel;
-
-class BlockBuffer {
- public:
-  BlockBuffer();
-  ~BlockBuffer();
-  void ReInit();
-  void Insert(const float block[PART_LEN]);
-  void ExtractExtendedBlock(float extended_block[PART_LEN]);
-  int AdjustSize(int buffer_size_decrease);
-  size_t Size();
-  size_t AvaliableSpace();
-
- private:
-  RingBuffer* buffer_;
-};
-
-class DivergentFilterFraction {
- public:
-  DivergentFilterFraction();
-
-  // Reset.
-  void Reset();
-
-  void AddObservation(const PowerLevel& nearlevel,
-                      const PowerLevel& linoutlevel,
-                      const PowerLevel& nlpoutlevel);
-
-  // Return the latest fraction.
-  float GetLatestFraction() const;
-
- private:
-  // Clear all values added.
-  void Clear();
-
-  size_t count_;
-  size_t occurrence_;
-  float fraction_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(DivergentFilterFraction);
-};
-
-typedef struct CoherenceState {
-  complex_t sde[PART_LEN1];  // cross-psd of nearend and error
-  complex_t sxd[PART_LEN1];  // cross-psd of farend and nearend
-  float sx[PART_LEN1], sd[PART_LEN1], se[PART_LEN1];  // far, near, error psd
-} CoherenceState;
-
-struct AecCore {
-  explicit AecCore(int instance_index);
-  ~AecCore();
-
-  std::unique_ptr<ApmDataDumper> data_dumper;
-  const OouraFft ooura_fft;
-
-  CoherenceState coherence_state;
-
-  int farBufWritePos, farBufReadPos;
-
-  int knownDelay;
-  int inSamples, outSamples;
-  int delayEstCtr;
-
-  // Nearend buffer used for changing from FRAME_LEN to PART_LEN sample block
-  // sizes. The buffer stores all the incoming bands and for each band a maximum
-  // of PART_LEN - (FRAME_LEN - PART_LEN) values need to be buffered in order to
-  // change the block size from FRAME_LEN to PART_LEN.
-  float nearend_buffer[NUM_HIGH_BANDS_MAX + 1]
-                      [PART_LEN - (FRAME_LEN - PART_LEN)];
-  size_t nearend_buffer_size;
-  float output_buffer[NUM_HIGH_BANDS_MAX + 1][2 * PART_LEN];
-  size_t output_buffer_size;
-
-  float eBuf[PART_LEN2];  // error
-
-  float previous_nearend_block[NUM_HIGH_BANDS_MAX + 1][PART_LEN];
-
-  float xPow[PART_LEN1];
-  float dPow[PART_LEN1];
-  float dMinPow[PART_LEN1];
-  float dInitMinPow[PART_LEN1];
-  float* noisePow;
-
-  float xfBuf[2][kExtendedNumPartitions * PART_LEN1];  // farend fft buffer
-  float wfBuf[2][kExtendedNumPartitions * PART_LEN1];  // filter fft
-  // Farend windowed fft buffer.
-  complex_t xfwBuf[kExtendedNumPartitions * PART_LEN1];
-
-  float hNs[PART_LEN1];
-  float hNlFbMin, hNlFbLocalMin;
-  float hNlXdAvgMin;
-  int hNlNewMin, hNlMinCtr;
-  float overDrive;
-  float overdrive_scaling;
-  int nlp_mode;
-  float outBuf[PART_LEN];
-  int delayIdx;
-
-  short stNearState, echoState;
-  short divergeState;
-
-  int xfBufBlockPos;
-
-  BlockBuffer farend_block_buffer_;
-
-  int system_delay;  // Current system delay buffered in AEC.
-
-  int mult;  // sampling frequency multiple
-  int sampFreq = 16000;
-  size_t num_bands;
-  uint32_t seed;
-
-  float filter_step_size;  // stepsize
-  float error_threshold;   // error threshold
-
-  int noiseEstCtr;
-
-  PowerLevel farlevel;
-  PowerLevel nearlevel;
-  PowerLevel linoutlevel;
-  PowerLevel nlpoutlevel;
-
-  int metricsMode;
-  int stateCounter;
-  Stats erl;
-  Stats erle;
-  Stats aNlp;
-  Stats rerl;
-  DivergentFilterFraction divergent_filter_fraction;
-
-  // Quantities to control H band scaling for SWB input
-  int freq_avg_ic;       // initial bin for averaging nlp gain
-  int flag_Hband_cn;     // for comfort noise
-  float cn_scale_Hband;  // scale for comfort noise in H band
-
-  int delay_metrics_delivered;
-  int delay_histogram[kHistorySizeBlocks];
-  int num_delay_values;
-  int delay_median;
-  int delay_std;
-  float fraction_poor_delays;
-  int delay_logging_enabled;
-  void* delay_estimator_farend;
-  void* delay_estimator;
-  // Variables associated with delay correction through signal based delay
-  // estimation feedback.
-  int previous_delay;
-  int delay_correction_count;
-  int shift_offset;
-  float delay_quality_threshold;
-  int frame_count;
-
-  // 0 = delay agnostic mode (signal based delay correction) disabled.
-  // Otherwise enabled.
-  int delay_agnostic_enabled;
-  // 1 = extended filter mode enabled, 0 = disabled.
-  int extended_filter_enabled;
-  // 1 = refined filter adaptation aec mode enabled, 0 = disabled.
-  bool refined_adaptive_filter_enabled;
-
-  // Runtime selection of number of filter partitions.
-  int num_partitions;
-
-  // Flag that extreme filter divergence has been detected by the Echo
-  // Suppressor.
-  int extreme_filter_divergence;
-};
-
-AecCore* WebRtcAec_CreateAec(int instance_count);  // Returns NULL on error.
-void WebRtcAec_FreeAec(AecCore* aec);
-int WebRtcAec_InitAec(AecCore* aec, int sampFreq);
-void WebRtcAec_InitAec_SSE2(void);
-#if defined(MIPS_FPU_LE)
-void WebRtcAec_InitAec_mips(void);
-#endif
-#if defined(WEBRTC_HAS_NEON)
-void WebRtcAec_InitAec_neon(void);
-#endif
-
-void WebRtcAec_BufferFarendBlock(AecCore* aec, const float* farend);
-void WebRtcAec_ProcessFrames(AecCore* aec,
-                             const float* const* nearend,
-                             size_t num_bands,
-                             size_t num_samples,
-                             int knownDelay,
-                             float* const* out);
-
-// A helper function to call adjust the farend buffer size.
-// Returns the number of elements the size was decreased with, and adjusts
-// |system_delay| by the corresponding amount in ms.
-int WebRtcAec_AdjustFarendBufferSizeAndSystemDelay(AecCore* aec,
-                                                   int size_decrease);
-
-// Calculates the median, standard deviation and amount of poor values among the
-// delay estimates aggregated up to the first call to the function. After that
-// first call the metrics are aggregated and updated every second. With poor
-// values we mean values that most likely will cause the AEC to perform poorly.
-// TODO(bjornv): Consider changing tests and tools to handle constant
-// constant aggregation window throughout the session instead.
-int WebRtcAec_GetDelayMetricsCore(AecCore* self,
-                                  int* median,
-                                  int* std,
-                                  float* fraction_poor_delays);
-
-// Returns the echo state (1: echo, 0: no echo).
-int WebRtcAec_echo_state(AecCore* self);
-
-// Gets statistics of the echo metrics ERL, ERLE, A_NLP.
-void WebRtcAec_GetEchoStats(AecCore* self,
-                            Stats* erl,
-                            Stats* erle,
-                            Stats* a_nlp,
-                            float* divergent_filter_fraction);
-
-// Sets local configuration modes.
-void WebRtcAec_SetConfigCore(AecCore* self,
-                             int nlp_mode,
-                             int metrics_mode,
-                             int delay_logging);
-
-// Non-zero enables, zero disables.
-void WebRtcAec_enable_delay_agnostic(AecCore* self, int enable);
-
-// Returns non-zero if delay agnostic (i.e., signal based delay estimation) is
-// enabled and zero if disabled.
-int WebRtcAec_delay_agnostic_enabled(AecCore* self);
-
-// Turns on/off the refined adaptive filter feature.
-void WebRtcAec_enable_refined_adaptive_filter(AecCore* self, bool enable);
-
-// Returns whether the refined adaptive filter is enabled.
-bool WebRtcAec_refined_adaptive_filter(const AecCore* self);
-
-// Enables or disables extended filter mode. Non-zero enables, zero disables.
-void WebRtcAec_enable_extended_filter(AecCore* self, int enable);
-
-// Returns non-zero if extended filter mode is enabled and zero if disabled.
-int WebRtcAec_extended_filter_enabled(AecCore* self);
-
-// Returns the current |system_delay|, i.e., the buffered difference between
-// far-end and near-end.
-int WebRtcAec_system_delay(AecCore* self);
-
-// Sets the |system_delay| to |value|.  Note that if the value is changed
-// improperly, there can be a performance regression.  So it should be used with
-// care.
-void WebRtcAec_SetSystemDelay(AecCore* self, int delay);
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_AEC_AEC_CORE_H_
diff --git a/modules/audio_processing/aec/aec_core_mips.cc b/modules/audio_processing/aec/aec_core_mips.cc
deleted file mode 100644
index 93f075b..0000000
--- a/modules/audio_processing/aec/aec_core_mips.cc
+++ /dev/null
@@ -1,490 +0,0 @@
-/*
- *  Copyright (c) 2013 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.
- */
-
-/*
- * The core AEC algorithm, which is presented with time-aligned signals.
- */
-
-#include "webrtc/modules/audio_processing/aec/aec_core.h"
-
-#include <math.h>
-
-extern "C" {
-#include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
-}
-#include "webrtc/modules/audio_processing/aec/aec_core_optimized_methods.h"
-#include "webrtc/modules/audio_processing/utility/ooura_fft.h"
-
-namespace webrtc {
-
-extern const float WebRtcAec_weightCurve[65];
-extern const float WebRtcAec_overDriveCurve[65];
-
-void WebRtcAec_FilterFar_mips(
-    int num_partitions,
-    int x_fft_buf_block_pos,
-    float x_fft_buf[2][kExtendedNumPartitions * PART_LEN1],
-    float h_fft_buf[2][kExtendedNumPartitions * PART_LEN1],
-    float y_fft[2][PART_LEN1]) {
-  int i;
-  for (i = 0; i < num_partitions; i++) {
-    int xPos = (i + x_fft_buf_block_pos) * PART_LEN1;
-    int pos = i * PART_LEN1;
-    // Check for wrap
-    if (i + x_fft_buf_block_pos >= num_partitions) {
-      xPos -= num_partitions * (PART_LEN1);
-    }
-    float* yf0 = y_fft[0];
-    float* yf1 = y_fft[1];
-    float* aRe = x_fft_buf[0] + xPos;
-    float* aIm = x_fft_buf[1] + xPos;
-    float* bRe = h_fft_buf[0] + pos;
-    float* bIm = h_fft_buf[1] + pos;
-    float f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13;
-    int len = PART_LEN1 >> 1;
-
-    __asm __volatile(
-      ".set       push                                                \n\t"
-      ".set       noreorder                                           \n\t"
-      "1:                                                             \n\t"
-      "lwc1       %[f0],      0(%[aRe])                               \n\t"
-      "lwc1       %[f1],      0(%[bRe])                               \n\t"
-      "lwc1       %[f2],      0(%[bIm])                               \n\t"
-      "lwc1       %[f3],      0(%[aIm])                               \n\t"
-      "lwc1       %[f4],      4(%[aRe])                               \n\t"
-      "lwc1       %[f5],      4(%[bRe])                               \n\t"
-      "lwc1       %[f6],      4(%[bIm])                               \n\t"
-      "mul.s      %[f8],      %[f0],          %[f1]                   \n\t"
-      "mul.s      %[f0],      %[f0],          %[f2]                   \n\t"
-      "mul.s      %[f9],      %[f4],          %[f5]                   \n\t"
-      "mul.s      %[f4],      %[f4],          %[f6]                   \n\t"
-      "lwc1       %[f7],      4(%[aIm])                               \n\t"
-#if !defined(MIPS32_R2_LE)
-      "mul.s      %[f12],     %[f2],          %[f3]                   \n\t"
-      "mul.s      %[f1],      %[f3],          %[f1]                   \n\t"
-      "mul.s      %[f11],     %[f6],          %[f7]                   \n\t"
-      "addiu      %[aRe],     %[aRe],         8                       \n\t"
-      "addiu      %[aIm],     %[aIm],         8                       \n\t"
-      "addiu      %[len],     %[len],         -1                      \n\t"
-      "sub.s      %[f8],      %[f8],          %[f12]                  \n\t"
-      "mul.s      %[f12],     %[f7],          %[f5]                   \n\t"
-      "lwc1       %[f2],      0(%[yf0])                               \n\t"
-      "add.s      %[f1],      %[f0],          %[f1]                   \n\t"
-      "lwc1       %[f3],      0(%[yf1])                               \n\t"
-      "sub.s      %[f9],      %[f9],          %[f11]                  \n\t"
-      "lwc1       %[f6],      4(%[yf0])                               \n\t"
-      "add.s      %[f4],      %[f4],          %[f12]                  \n\t"
-#else  // #if !defined(MIPS32_R2_LE)
-      "addiu      %[aRe],     %[aRe],         8                       \n\t"
-      "addiu      %[aIm],     %[aIm],         8                       \n\t"
-      "addiu      %[len],     %[len],         -1                      \n\t"
-      "nmsub.s    %[f8],      %[f8],          %[f2],      %[f3]       \n\t"
-      "lwc1       %[f2],      0(%[yf0])                               \n\t"
-      "madd.s     %[f1],      %[f0],          %[f3],      %[f1]       \n\t"
-      "lwc1       %[f3],      0(%[yf1])                               \n\t"
-      "nmsub.s    %[f9],      %[f9],          %[f6],      %[f7]       \n\t"
-      "lwc1       %[f6],      4(%[yf0])                               \n\t"
-      "madd.s     %[f4],      %[f4],          %[f7],      %[f5]       \n\t"
-#endif  // #if !defined(MIPS32_R2_LE)
-      "lwc1       %[f5],      4(%[yf1])                               \n\t"
-      "add.s      %[f2],      %[f2],          %[f8]                   \n\t"
-      "addiu      %[bRe],     %[bRe],         8                       \n\t"
-      "addiu      %[bIm],     %[bIm],         8                       \n\t"
-      "add.s      %[f3],      %[f3],          %[f1]                   \n\t"
-      "add.s      %[f6],      %[f6],          %[f9]                   \n\t"
-      "add.s      %[f5],      %[f5],          %[f4]                   \n\t"
-      "swc1       %[f2],      0(%[yf0])                               \n\t"
-      "swc1       %[f3],      0(%[yf1])                               \n\t"
-      "swc1       %[f6],      4(%[yf0])                               \n\t"
-      "swc1       %[f5],      4(%[yf1])                               \n\t"
-      "addiu      %[yf0],     %[yf0],         8                       \n\t"
-      "bgtz       %[len],     1b                                      \n\t"
-      " addiu     %[yf1],     %[yf1],         8                       \n\t"
-      "lwc1       %[f0],      0(%[aRe])                               \n\t"
-      "lwc1       %[f1],      0(%[bRe])                               \n\t"
-      "lwc1       %[f2],      0(%[bIm])                               \n\t"
-      "lwc1       %[f3],      0(%[aIm])                               \n\t"
-      "mul.s      %[f8],      %[f0],          %[f1]                   \n\t"
-      "mul.s      %[f0],      %[f0],          %[f2]                   \n\t"
-#if !defined(MIPS32_R2_LE)
-      "mul.s      %[f12],     %[f2],          %[f3]                   \n\t"
-      "mul.s      %[f1],      %[f3],          %[f1]                   \n\t"
-      "sub.s      %[f8],      %[f8],          %[f12]                  \n\t"
-      "lwc1       %[f2],      0(%[yf0])                               \n\t"
-      "add.s      %[f1],      %[f0],          %[f1]                   \n\t"
-      "lwc1       %[f3],      0(%[yf1])                               \n\t"
-#else  // #if !defined(MIPS32_R2_LE)
-      "nmsub.s    %[f8],      %[f8],          %[f2],      %[f3]       \n\t"
-      "lwc1       %[f2],      0(%[yf0])                               \n\t"
-      "madd.s     %[f1],      %[f0],          %[f3],      %[f1]       \n\t"
-      "lwc1       %[f3],      0(%[yf1])                               \n\t"
-#endif  // #if !defined(MIPS32_R2_LE)
-      "add.s      %[f2],      %[f2],          %[f8]                   \n\t"
-      "add.s      %[f3],      %[f3],          %[f1]                   \n\t"
-      "swc1       %[f2],      0(%[yf0])                               \n\t"
-      "swc1       %[f3],      0(%[yf1])                               \n\t"
-      ".set       pop                                                 \n\t"
-      : [f0] "=&f" (f0), [f1] "=&f" (f1), [f2] "=&f" (f2),
-        [f3] "=&f" (f3), [f4] "=&f" (f4), [f5] "=&f" (f5),
-        [f6] "=&f" (f6), [f7] "=&f" (f7), [f8] "=&f" (f8),
-        [f9] "=&f" (f9), [f10] "=&f" (f10), [f11] "=&f" (f11),
-        [f12] "=&f" (f12), [f13] "=&f" (f13), [aRe] "+r" (aRe),
-        [aIm] "+r" (aIm), [bRe] "+r" (bRe), [bIm] "+r" (bIm),
-        [yf0] "+r" (yf0), [yf1] "+r" (yf1), [len] "+r" (len)
-      :
-      : "memory");
-  }
-}
-
-void WebRtcAec_FilterAdaptation_mips(
-    const OouraFft& ooura_fft,
-    int num_partitions,
-    int x_fft_buf_block_pos,
-    float x_fft_buf[2][kExtendedNumPartitions * PART_LEN1],
-    float e_fft[2][PART_LEN1],
-    float h_fft_buf[2][kExtendedNumPartitions * PART_LEN1]) {
-  float fft[PART_LEN2];
-  int i;
-  for (i = 0; i < num_partitions; i++) {
-    int xPos = (i + x_fft_buf_block_pos) * (PART_LEN1);
-    int pos;
-    // Check for wrap
-    if (i + x_fft_buf_block_pos >= num_partitions) {
-      xPos -= num_partitions * PART_LEN1;
-    }
-
-    pos = i * PART_LEN1;
-    float* aRe = x_fft_buf[0] + xPos;
-    float* aIm = x_fft_buf[1] + xPos;
-    float* bRe = e_fft[0];
-    float* bIm = e_fft[1];
-    float* fft_tmp;
-
-    float f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12;
-    int len = PART_LEN >> 1;
-
-    __asm __volatile(
-      ".set       push                                                \n\t"
-      ".set       noreorder                                           \n\t"
-      "addiu      %[fft_tmp], %[fft],         0                       \n\t"
-      "1:                                                             \n\t"
-      "lwc1       %[f0],      0(%[aRe])                               \n\t"
-      "lwc1       %[f1],      0(%[bRe])                               \n\t"
-      "lwc1       %[f2],      0(%[bIm])                               \n\t"
-      "lwc1       %[f4],      4(%[aRe])                               \n\t"
-      "lwc1       %[f5],      4(%[bRe])                               \n\t"
-      "lwc1       %[f6],      4(%[bIm])                               \n\t"
-      "addiu      %[aRe],     %[aRe],         8                       \n\t"
-      "addiu      %[bRe],     %[bRe],         8                       \n\t"
-      "mul.s      %[f8],      %[f0],          %[f1]                   \n\t"
-      "mul.s      %[f0],      %[f0],          %[f2]                   \n\t"
-      "lwc1       %[f3],      0(%[aIm])                               \n\t"
-      "mul.s      %[f9],      %[f4],          %[f5]                   \n\t"
-      "lwc1       %[f7],      4(%[aIm])                               \n\t"
-      "mul.s      %[f4],      %[f4],          %[f6]                   \n\t"
-#if !defined(MIPS32_R2_LE)
-      "mul.s      %[f10],     %[f3],          %[f2]                   \n\t"
-      "mul.s      %[f1],      %[f3],          %[f1]                   \n\t"
-      "mul.s      %[f11],     %[f7],          %[f6]                   \n\t"
-      "mul.s      %[f5],      %[f7],          %[f5]                   \n\t"
-      "addiu      %[aIm],     %[aIm],         8                       \n\t"
-      "addiu      %[bIm],     %[bIm],         8                       \n\t"
-      "addiu      %[len],     %[len],         -1                      \n\t"
-      "add.s      %[f8],      %[f8],          %[f10]                  \n\t"
-      "sub.s      %[f1],      %[f0],          %[f1]                   \n\t"
-      "add.s      %[f9],      %[f9],          %[f11]                  \n\t"
-      "sub.s      %[f5],      %[f4],          %[f5]                   \n\t"
-#else  // #if !defined(MIPS32_R2_LE)
-      "addiu      %[aIm],     %[aIm],         8                       \n\t"
-      "addiu      %[bIm],     %[bIm],         8                       \n\t"
-      "addiu      %[len],     %[len],         -1                      \n\t"
-      "madd.s     %[f8],      %[f8],          %[f3],      %[f2]       \n\t"
-      "nmsub.s    %[f1],      %[f0],          %[f3],      %[f1]       \n\t"
-      "madd.s     %[f9],      %[f9],          %[f7],      %[f6]       \n\t"
-      "nmsub.s    %[f5],      %[f4],          %[f7],      %[f5]       \n\t"
-#endif  // #if !defined(MIPS32_R2_LE)
-      "swc1       %[f8],      0(%[fft_tmp])                           \n\t"
-      "swc1       %[f1],      4(%[fft_tmp])                           \n\t"
-      "swc1       %[f9],      8(%[fft_tmp])                           \n\t"
-      "swc1       %[f5],      12(%[fft_tmp])                          \n\t"
-      "bgtz       %[len],     1b                                      \n\t"
-      " addiu     %[fft_tmp], %[fft_tmp],     16                      \n\t"
-      "lwc1       %[f0],      0(%[aRe])                               \n\t"
-      "lwc1       %[f1],      0(%[bRe])                               \n\t"
-      "lwc1       %[f2],      0(%[bIm])                               \n\t"
-      "lwc1       %[f3],      0(%[aIm])                               \n\t"
-      "mul.s      %[f8],      %[f0],          %[f1]                   \n\t"
-#if !defined(MIPS32_R2_LE)
-      "mul.s      %[f10],     %[f3],          %[f2]                   \n\t"
-      "add.s      %[f8],      %[f8],          %[f10]                  \n\t"
-#else  // #if !defined(MIPS32_R2_LE)
-      "madd.s     %[f8],      %[f8],          %[f3],      %[f2]       \n\t"
-#endif  // #if !defined(MIPS32_R2_LE)
-      "swc1       %[f8],      4(%[fft])                               \n\t"
-      ".set       pop                                                 \n\t"
-      : [f0] "=&f" (f0), [f1] "=&f" (f1), [f2] "=&f" (f2),
-        [f3] "=&f" (f3), [f4] "=&f" (f4), [f5] "=&f" (f5),
-        [f6] "=&f" (f6), [f7] "=&f" (f7), [f8] "=&f" (f8),
-        [f9] "=&f" (f9), [f10] "=&f" (f10), [f11] "=&f" (f11),
-        [f12] "=&f" (f12), [aRe] "+r" (aRe), [aIm] "+r" (aIm),
-        [bRe] "+r" (bRe), [bIm] "+r" (bIm), [fft_tmp] "=&r" (fft_tmp),
-        [len] "+r" (len)
-      : [fft] "r" (fft)
-      : "memory");
-
-    ooura_fft.InverseFft(fft);
-    memset(fft + PART_LEN, 0, sizeof(float) * PART_LEN);
-
-    // fft scaling
-    {
-      float scale = 2.0f / PART_LEN2;
-      __asm __volatile(
-        ".set     push                                    \n\t"
-        ".set     noreorder                               \n\t"
-        "addiu    %[fft_tmp], %[fft],        0            \n\t"
-        "addiu    %[len],     $zero,         8            \n\t"
-        "1:                                               \n\t"
-        "addiu    %[len],     %[len],        -1           \n\t"
-        "lwc1     %[f0],      0(%[fft_tmp])               \n\t"
-        "lwc1     %[f1],      4(%[fft_tmp])               \n\t"
-        "lwc1     %[f2],      8(%[fft_tmp])               \n\t"
-        "lwc1     %[f3],      12(%[fft_tmp])              \n\t"
-        "mul.s    %[f0],      %[f0],         %[scale]     \n\t"
-        "mul.s    %[f1],      %[f1],         %[scale]     \n\t"
-        "mul.s    %[f2],      %[f2],         %[scale]     \n\t"
-        "mul.s    %[f3],      %[f3],         %[scale]     \n\t"
-        "lwc1     %[f4],      16(%[fft_tmp])              \n\t"
-        "lwc1     %[f5],      20(%[fft_tmp])              \n\t"
-        "lwc1     %[f6],      24(%[fft_tmp])              \n\t"
-        "lwc1     %[f7],      28(%[fft_tmp])              \n\t"
-        "mul.s    %[f4],      %[f4],         %[scale]     \n\t"
-        "mul.s    %[f5],      %[f5],         %[scale]     \n\t"
-        "mul.s    %[f6],      %[f6],         %[scale]     \n\t"
-        "mul.s    %[f7],      %[f7],         %[scale]     \n\t"
-        "swc1     %[f0],      0(%[fft_tmp])               \n\t"
-        "swc1     %[f1],      4(%[fft_tmp])               \n\t"
-        "swc1     %[f2],      8(%[fft_tmp])               \n\t"
-        "swc1     %[f3],      12(%[fft_tmp])              \n\t"
-        "swc1     %[f4],      16(%[fft_tmp])              \n\t"
-        "swc1     %[f5],      20(%[fft_tmp])              \n\t"
-        "swc1     %[f6],      24(%[fft_tmp])              \n\t"
-        "swc1     %[f7],      28(%[fft_tmp])              \n\t"
-        "bgtz     %[len],     1b                          \n\t"
-        " addiu   %[fft_tmp], %[fft_tmp],    32           \n\t"
-        ".set     pop                                     \n\t"
-        : [f0] "=&f" (f0), [f1] "=&f" (f1), [f2] "=&f" (f2),
-          [f3] "=&f" (f3), [f4] "=&f" (f4), [f5] "=&f" (f5),
-          [f6] "=&f" (f6), [f7] "=&f" (f7), [len] "=&r" (len),
-          [fft_tmp] "=&r" (fft_tmp)
-        : [scale] "f" (scale), [fft] "r" (fft)
-        : "memory");
-    }
-    ooura_fft.Fft(fft);
-    aRe = h_fft_buf[0] + pos;
-    aIm = h_fft_buf[1] + pos;
-    __asm __volatile(
-      ".set     push                                    \n\t"
-      ".set     noreorder                               \n\t"
-      "addiu    %[fft_tmp], %[fft],        0            \n\t"
-      "addiu    %[len],     $zero,         31           \n\t"
-      "lwc1     %[f0],      0(%[aRe])                   \n\t"
-      "lwc1     %[f1],      0(%[fft_tmp])               \n\t"
-      "lwc1     %[f2],      256(%[aRe])                 \n\t"
-      "lwc1     %[f3],      4(%[fft_tmp])               \n\t"
-      "lwc1     %[f4],      4(%[aRe])                   \n\t"
-      "lwc1     %[f5],      8(%[fft_tmp])               \n\t"
-      "lwc1     %[f6],      4(%[aIm])                   \n\t"
-      "lwc1     %[f7],      12(%[fft_tmp])              \n\t"
-      "add.s    %[f0],      %[f0],         %[f1]        \n\t"
-      "add.s    %[f2],      %[f2],         %[f3]        \n\t"
-      "add.s    %[f4],      %[f4],         %[f5]        \n\t"
-      "add.s    %[f6],      %[f6],         %[f7]        \n\t"
-      "addiu    %[fft_tmp], %[fft_tmp],    16           \n\t"
-      "swc1     %[f0],      0(%[aRe])                   \n\t"
-      "swc1     %[f2],      256(%[aRe])                 \n\t"
-      "swc1     %[f4],      4(%[aRe])                   \n\t"
-      "addiu    %[aRe],     %[aRe],        8            \n\t"
-      "swc1     %[f6],      4(%[aIm])                   \n\t"
-      "addiu    %[aIm],     %[aIm],        8            \n\t"
-      "1:                                               \n\t"
-      "lwc1     %[f0],      0(%[aRe])                   \n\t"
-      "lwc1     %[f1],      0(%[fft_tmp])               \n\t"
-      "lwc1     %[f2],      0(%[aIm])                   \n\t"
-      "lwc1     %[f3],      4(%[fft_tmp])               \n\t"
-      "lwc1     %[f4],      4(%[aRe])                   \n\t"
-      "lwc1     %[f5],      8(%[fft_tmp])               \n\t"
-      "lwc1     %[f6],      4(%[aIm])                   \n\t"
-      "lwc1     %[f7],      12(%[fft_tmp])              \n\t"
-      "add.s    %[f0],      %[f0],         %[f1]        \n\t"
-      "add.s    %[f2],      %[f2],         %[f3]        \n\t"
-      "add.s    %[f4],      %[f4],         %[f5]        \n\t"
-      "add.s    %[f6],      %[f6],         %[f7]        \n\t"
-      "addiu    %[len],     %[len],        -1           \n\t"
-      "addiu    %[fft_tmp], %[fft_tmp],    16           \n\t"
-      "swc1     %[f0],      0(%[aRe])                   \n\t"
-      "swc1     %[f2],      0(%[aIm])                   \n\t"
-      "swc1     %[f4],      4(%[aRe])                   \n\t"
-      "addiu    %[aRe],     %[aRe],        8            \n\t"
-      "swc1     %[f6],      4(%[aIm])                   \n\t"
-      "bgtz     %[len],     1b                          \n\t"
-      " addiu   %[aIm],     %[aIm],        8            \n\t"
-      ".set     pop                                     \n\t"
-      : [f0] "=&f" (f0), [f1] "=&f" (f1), [f2] "=&f" (f2),
-        [f3] "=&f" (f3), [f4] "=&f" (f4), [f5] "=&f" (f5),
-        [f6] "=&f" (f6), [f7] "=&f" (f7), [len] "=&r" (len),
-        [fft_tmp] "=&r" (fft_tmp), [aRe] "+r" (aRe), [aIm] "+r" (aIm)
-      : [fft] "r" (fft)
-      : "memory");
-  }
-}
-
-void WebRtcAec_Overdrive_mips(float overdrive_scaling,
-                              float hNlFb,
-                              float hNl[PART_LEN1]) {
-  const float one = 1.0;
-  float* p_hNl;
-  const float* p_WebRtcAec_wC;
-  float temp1, temp2, temp3, temp4;
-
-  p_hNl = &hNl[0];
-  p_WebRtcAec_wC = &WebRtcAec_weightCurve[0];
-
-  for (int i = 0; i < PART_LEN1; ++i) {
-    // Weight subbands
-    __asm __volatile(
-      ".set      push                                              \n\t"
-      ".set      noreorder                                         \n\t"
-      "lwc1      %[temp1],    0(%[p_hNl])                          \n\t"
-      "lwc1      %[temp2],    0(%[p_wC])                           \n\t"
-      "c.lt.s    %[hNlFb],    %[temp1]                             \n\t"
-      "bc1f      1f                                                \n\t"
-      " mul.s    %[temp3],    %[temp2],     %[hNlFb]               \n\t"
-      "sub.s     %[temp4],    %[one],       %[temp2]               \n\t"
-#if !defined(MIPS32_R2_LE)
-      "mul.s     %[temp1],    %[temp1],     %[temp4]               \n\t"
-      "add.s     %[temp1],    %[temp3],     %[temp1]               \n\t"
-#else  // #if !defined(MIPS32_R2_LE)
-      "madd.s    %[temp1],    %[temp3],     %[temp1],   %[temp4]   \n\t"
-#endif  // #if !defined(MIPS32_R2_LE)
-      "swc1      %[temp1],    0(%[p_hNl])                          \n\t"
-     "1:                                                           \n\t"
-      "addiu     %[p_wC],     %[p_wC],      4                      \n\t"
-      ".set      pop                                               \n\t"
-      : [temp1] "=&f" (temp1), [temp2] "=&f" (temp2), [temp3] "=&f" (temp3),
-        [temp4] "=&f" (temp4), [p_wC] "+r" (p_WebRtcAec_wC)
-      : [hNlFb] "f" (hNlFb), [one] "f" (one), [p_hNl] "r" (p_hNl)
-      : "memory");
-
-    hNl[i] = powf(hNl[i], overdrive_scaling * WebRtcAec_overDriveCurve[i]);
-  }
-}
-
-void WebRtcAec_Suppress_mips(const float hNl[PART_LEN1],
-                             float efw[2][PART_LEN1]) {
-  const float* p_hNl;
-  float* p_efw0;
-  float* p_efw1;
-  float temp1, temp2, temp3, temp4;
-
-  p_hNl = &hNl[0];
-  p_efw0 = &efw[0][0];
-  p_efw1 = &efw[1][0];
-
-  for (int i = 0; i < PART_LEN1; ++i) {
-    __asm __volatile(
-      "lwc1      %[temp1],    0(%[p_hNl])              \n\t"
-      "lwc1      %[temp3],    0(%[p_efw1])             \n\t"
-      "lwc1      %[temp2],    0(%[p_efw0])             \n\t"
-      "addiu     %[p_hNl],    %[p_hNl],     4          \n\t"
-      "mul.s     %[temp3],    %[temp3],     %[temp1]   \n\t"
-      "mul.s     %[temp2],    %[temp2],     %[temp1]   \n\t"
-      "addiu     %[p_efw0],   %[p_efw0],    4          \n\t"
-      "addiu     %[p_efw1],   %[p_efw1],    4          \n\t"
-      "neg.s     %[temp4],    %[temp3]                 \n\t"
-      "swc1      %[temp2],    -4(%[p_efw0])            \n\t"
-      "swc1      %[temp4],    -4(%[p_efw1])            \n\t"
-      : [temp1] "=&f" (temp1), [temp2] "=&f" (temp2), [temp3] "=&f" (temp3),
-        [temp4] "=&f" (temp4), [p_efw0] "+r" (p_efw0), [p_efw1] "+r" (p_efw1),
-        [p_hNl] "+r" (p_hNl)
-      :
-      : "memory");
-  }
-}
-
-void WebRtcAec_ScaleErrorSignal_mips(float mu,
-                                     float error_threshold,
-                                     float x_pow[PART_LEN1],
-                                     float ef[2][PART_LEN1]) {
-  int len = (PART_LEN1);
-  float* ef0 = ef[0];
-  float* ef1 = ef[1];
-  float fac1 = 1e-10f;
-  float err_th2 = error_threshold * error_threshold;
-  float f0, f1, f2;
-#if !defined(MIPS32_R2_LE)
-  float f3;
-#endif
-
-  __asm __volatile(
-    ".set       push                                   \n\t"
-    ".set       noreorder                              \n\t"
-    "1:                                                \n\t"
-    "lwc1       %[f0],     0(%[x_pow])                 \n\t"
-    "lwc1       %[f1],     0(%[ef0])                   \n\t"
-    "lwc1       %[f2],     0(%[ef1])                   \n\t"
-    "add.s      %[f0],     %[f0],       %[fac1]        \n\t"
-    "div.s      %[f1],     %[f1],       %[f0]          \n\t"
-    "div.s      %[f2],     %[f2],       %[f0]          \n\t"
-    "mul.s      %[f0],     %[f1],       %[f1]          \n\t"
-#if defined(MIPS32_R2_LE)
-    "madd.s     %[f0],     %[f0],       %[f2],   %[f2] \n\t"
-#else
-    "mul.s      %[f3],     %[f2],       %[f2]          \n\t"
-    "add.s      %[f0],     %[f0],       %[f3]          \n\t"
-#endif
-    "c.le.s     %[f0],     %[err_th2]                  \n\t"
-    "nop                                               \n\t"
-    "bc1t       2f                                     \n\t"
-    " nop                                              \n\t"
-    "sqrt.s     %[f0],     %[f0]                       \n\t"
-    "add.s      %[f0],     %[f0],       %[fac1]        \n\t"
-    "div.s      %[f0],     %[err_th],   %[f0]          \n\t"
-    "mul.s      %[f1],     %[f1],       %[f0]          \n\t"
-    "mul.s      %[f2],     %[f2],       %[f0]          \n\t"
-    "2:                                                \n\t"
-    "mul.s      %[f1],     %[f1],       %[mu]          \n\t"
-    "mul.s      %[f2],     %[f2],       %[mu]          \n\t"
-    "swc1       %[f1],     0(%[ef0])                   \n\t"
-    "swc1       %[f2],     0(%[ef1])                   \n\t"
-    "addiu      %[len],    %[len],      -1             \n\t"
-    "addiu      %[x_pow],  %[x_pow],    4              \n\t"
-    "addiu      %[ef0],    %[ef0],      4              \n\t"
-    "bgtz       %[len],    1b                          \n\t"
-    " addiu     %[ef1],    %[ef1],      4              \n\t"
-    ".set       pop                                    \n\t"
-    : [f0] "=&f" (f0), [f1] "=&f" (f1), [f2] "=&f" (f2),
-#if !defined(MIPS32_R2_LE)
-      [f3] "=&f" (f3),
-#endif
-      [x_pow] "+r" (x_pow), [ef0] "+r" (ef0), [ef1] "+r" (ef1),
-      [len] "+r" (len)
-    : [fac1] "f" (fac1), [err_th2] "f" (err_th2), [mu] "f" (mu),
-      [err_th] "f" (error_threshold)
-    : "memory");
-}
-
-void WebRtcAec_InitAec_mips(void) {
-  WebRtcAec_FilterFar = WebRtcAec_FilterFar_mips;
-  WebRtcAec_FilterAdaptation = WebRtcAec_FilterAdaptation_mips;
-  WebRtcAec_ScaleErrorSignal = WebRtcAec_ScaleErrorSignal_mips;
-  WebRtcAec_Overdrive = WebRtcAec_Overdrive_mips;
-  WebRtcAec_Suppress = WebRtcAec_Suppress_mips;
-}
-}  // namespace webrtc
diff --git a/modules/audio_processing/aec/aec_core_neon.cc b/modules/audio_processing/aec/aec_core_neon.cc
deleted file mode 100644
index 4995ebf..0000000
--- a/modules/audio_processing/aec/aec_core_neon.cc
+++ /dev/null
@@ -1,737 +0,0 @@
-/*
- *  Copyright (c) 2014 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.
- */
-
-/*
- * The core AEC algorithm, neon version of speed-critical functions.
- *
- * Based on aec_core_sse2.c.
- */
-
-#include <arm_neon.h>
-#include <math.h>
-#include <string.h>  // memset
-
-extern "C" {
-#include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
-}
-#include "webrtc/modules/audio_processing/aec/aec_common.h"
-#include "webrtc/modules/audio_processing/aec/aec_core_optimized_methods.h"
-#include "webrtc/modules/audio_processing/utility/ooura_fft.h"
-
-namespace webrtc {
-
-enum { kShiftExponentIntoTopMantissa = 8 };
-enum { kFloatExponentShift = 23 };
-
-__inline static float MulRe(float aRe, float aIm, float bRe, float bIm) {
-  return aRe * bRe - aIm * bIm;
-}
-
-__inline static float MulIm(float aRe, float aIm, float bRe, float bIm) {
-  return aRe * bIm + aIm * bRe;
-}
-
-static void FilterFarNEON(int num_partitions,
-                          int x_fft_buf_block_pos,
-                          float x_fft_buf[2]
-                                         [kExtendedNumPartitions * PART_LEN1],
-                          float h_fft_buf[2]
-                                         [kExtendedNumPartitions * PART_LEN1],
-                          float y_fft[2][PART_LEN1]) {
-  int i;
-  for (i = 0; i < num_partitions; i++) {
-    int j;
-    int xPos = (i + x_fft_buf_block_pos) * PART_LEN1;
-    int pos = i * PART_LEN1;
-    // Check for wrap
-    if (i + x_fft_buf_block_pos >= num_partitions) {
-      xPos -= num_partitions * PART_LEN1;
-    }
-
-    // vectorized code (four at once)
-    for (j = 0; j + 3 < PART_LEN1; j += 4) {
-      const float32x4_t x_fft_buf_re = vld1q_f32(&x_fft_buf[0][xPos + j]);
-      const float32x4_t x_fft_buf_im = vld1q_f32(&x_fft_buf[1][xPos + j]);
-      const float32x4_t h_fft_buf_re = vld1q_f32(&h_fft_buf[0][pos + j]);
-      const float32x4_t h_fft_buf_im = vld1q_f32(&h_fft_buf[1][pos + j]);
-      const float32x4_t y_fft_re = vld1q_f32(&y_fft[0][j]);
-      const float32x4_t y_fft_im = vld1q_f32(&y_fft[1][j]);
-      const float32x4_t a = vmulq_f32(x_fft_buf_re, h_fft_buf_re);
-      const float32x4_t e = vmlsq_f32(a, x_fft_buf_im, h_fft_buf_im);
-      const float32x4_t c = vmulq_f32(x_fft_buf_re, h_fft_buf_im);
-      const float32x4_t f = vmlaq_f32(c, x_fft_buf_im, h_fft_buf_re);
-      const float32x4_t g = vaddq_f32(y_fft_re, e);
-      const float32x4_t h = vaddq_f32(y_fft_im, f);
-      vst1q_f32(&y_fft[0][j], g);
-      vst1q_f32(&y_fft[1][j], h);
-    }
-    // scalar code for the remaining items.
-    for (; j < PART_LEN1; j++) {
-      y_fft[0][j] += MulRe(x_fft_buf[0][xPos + j], x_fft_buf[1][xPos + j],
-                           h_fft_buf[0][pos + j], h_fft_buf[1][pos + j]);
-      y_fft[1][j] += MulIm(x_fft_buf[0][xPos + j], x_fft_buf[1][xPos + j],
-                           h_fft_buf[0][pos + j], h_fft_buf[1][pos + j]);
-    }
-  }
-}
-
-// ARM64's arm_neon.h has already defined vdivq_f32 vsqrtq_f32.
-#if !defined(WEBRTC_ARCH_ARM64)
-static float32x4_t vdivq_f32(float32x4_t a, float32x4_t b) {
-  int i;
-  float32x4_t x = vrecpeq_f32(b);
-  // from arm documentation
-  // The Newton-Raphson iteration:
-  //     x[n+1] = x[n] * (2 - d * x[n])
-  // converges to (1/d) if x0 is the result of VRECPE applied to d.
-  //
-  // Note: The precision did not improve after 2 iterations.
-  for (i = 0; i < 2; i++) {
-    x = vmulq_f32(vrecpsq_f32(b, x), x);
-  }
-  // a/b = a*(1/b)
-  return vmulq_f32(a, x);
-}
-
-static float32x4_t vsqrtq_f32(float32x4_t s) {
-  int i;
-  float32x4_t x = vrsqrteq_f32(s);
-
-  // Code to handle sqrt(0).
-  // If the input to sqrtf() is zero, a zero will be returned.
-  // If the input to vrsqrteq_f32() is zero, positive infinity is returned.
-  const uint32x4_t vec_p_inf = vdupq_n_u32(0x7F800000);
-  // check for divide by zero
-  const uint32x4_t div_by_zero = vceqq_u32(vec_p_inf, vreinterpretq_u32_f32(x));
-  // zero out the positive infinity results
-  x = vreinterpretq_f32_u32(
-      vandq_u32(vmvnq_u32(div_by_zero), vreinterpretq_u32_f32(x)));
-  // from arm documentation
-  // The Newton-Raphson iteration:
-  //     x[n+1] = x[n] * (3 - d * (x[n] * x[n])) / 2)
-  // converges to (1/√d) if x0 is the result of VRSQRTE applied to d.
-  //
-  // Note: The precision did not improve after 2 iterations.
-  for (i = 0; i < 2; i++) {
-    x = vmulq_f32(vrsqrtsq_f32(vmulq_f32(x, x), s), x);
-  }
-  // sqrt(s) = s * 1/sqrt(s)
-  return vmulq_f32(s, x);
-}
-#endif  // WEBRTC_ARCH_ARM64
-
-static void ScaleErrorSignalNEON(float mu,
-                                 float error_threshold,
-                                 float x_pow[PART_LEN1],
-                                 float ef[2][PART_LEN1]) {
-  const float32x4_t k1e_10f = vdupq_n_f32(1e-10f);
-  const float32x4_t kMu = vmovq_n_f32(mu);
-  const float32x4_t kThresh = vmovq_n_f32(error_threshold);
-  int i;
-  // vectorized code (four at once)
-  for (i = 0; i + 3 < PART_LEN1; i += 4) {
-    const float32x4_t x_pow_local = vld1q_f32(&x_pow[i]);
-    const float32x4_t ef_re_base = vld1q_f32(&ef[0][i]);
-    const float32x4_t ef_im_base = vld1q_f32(&ef[1][i]);
-    const float32x4_t xPowPlus = vaddq_f32(x_pow_local, k1e_10f);
-    float32x4_t ef_re = vdivq_f32(ef_re_base, xPowPlus);
-    float32x4_t ef_im = vdivq_f32(ef_im_base, xPowPlus);
-    const float32x4_t ef_re2 = vmulq_f32(ef_re, ef_re);
-    const float32x4_t ef_sum2 = vmlaq_f32(ef_re2, ef_im, ef_im);
-    const float32x4_t absEf = vsqrtq_f32(ef_sum2);
-    const uint32x4_t bigger = vcgtq_f32(absEf, kThresh);
-    const float32x4_t absEfPlus = vaddq_f32(absEf, k1e_10f);
-    const float32x4_t absEfInv = vdivq_f32(kThresh, absEfPlus);
-    uint32x4_t ef_re_if = vreinterpretq_u32_f32(vmulq_f32(ef_re, absEfInv));
-    uint32x4_t ef_im_if = vreinterpretq_u32_f32(vmulq_f32(ef_im, absEfInv));
-    uint32x4_t ef_re_u32 =
-        vandq_u32(vmvnq_u32(bigger), vreinterpretq_u32_f32(ef_re));
-    uint32x4_t ef_im_u32 =
-        vandq_u32(vmvnq_u32(bigger), vreinterpretq_u32_f32(ef_im));
-    ef_re_if = vandq_u32(bigger, ef_re_if);
-    ef_im_if = vandq_u32(bigger, ef_im_if);
-    ef_re_u32 = vorrq_u32(ef_re_u32, ef_re_if);
-    ef_im_u32 = vorrq_u32(ef_im_u32, ef_im_if);
-    ef_re = vmulq_f32(vreinterpretq_f32_u32(ef_re_u32), kMu);
-    ef_im = vmulq_f32(vreinterpretq_f32_u32(ef_im_u32), kMu);
-    vst1q_f32(&ef[0][i], ef_re);
-    vst1q_f32(&ef[1][i], ef_im);
-  }
-  // scalar code for the remaining items.
-  for (; i < PART_LEN1; i++) {
-    float abs_ef;
-    ef[0][i] /= (x_pow[i] + 1e-10f);
-    ef[1][i] /= (x_pow[i] + 1e-10f);
-    abs_ef = sqrtf(ef[0][i] * ef[0][i] + ef[1][i] * ef[1][i]);
-
-    if (abs_ef > error_threshold) {
-      abs_ef = error_threshold / (abs_ef + 1e-10f);
-      ef[0][i] *= abs_ef;
-      ef[1][i] *= abs_ef;
-    }
-
-    // Stepsize factor
-    ef[0][i] *= mu;
-    ef[1][i] *= mu;
-  }
-}
-
-static void FilterAdaptationNEON(
-    const OouraFft& ooura_fft,
-    int num_partitions,
-    int x_fft_buf_block_pos,
-    float x_fft_buf[2][kExtendedNumPartitions * PART_LEN1],
-    float e_fft[2][PART_LEN1],
-    float h_fft_buf[2][kExtendedNumPartitions * PART_LEN1]) {
-  float fft[PART_LEN2];
-  int i;
-  for (i = 0; i < num_partitions; i++) {
-    int xPos = (i + x_fft_buf_block_pos) * PART_LEN1;
-    int pos = i * PART_LEN1;
-    int j;
-    // Check for wrap
-    if (i + x_fft_buf_block_pos >= num_partitions) {
-      xPos -= num_partitions * PART_LEN1;
-    }
-
-    // Process the whole array...
-    for (j = 0; j < PART_LEN; j += 4) {
-      // Load x_fft_buf and e_fft.
-      const float32x4_t x_fft_buf_re = vld1q_f32(&x_fft_buf[0][xPos + j]);
-      const float32x4_t x_fft_buf_im = vld1q_f32(&x_fft_buf[1][xPos + j]);
-      const float32x4_t e_fft_re = vld1q_f32(&e_fft[0][j]);
-      const float32x4_t e_fft_im = vld1q_f32(&e_fft[1][j]);
-      // Calculate the product of conjugate(x_fft_buf) by e_fft.
-      //   re(conjugate(a) * b) = aRe * bRe + aIm * bIm
-      //   im(conjugate(a) * b)=  aRe * bIm - aIm * bRe
-      const float32x4_t a = vmulq_f32(x_fft_buf_re, e_fft_re);
-      const float32x4_t e = vmlaq_f32(a, x_fft_buf_im, e_fft_im);
-      const float32x4_t c = vmulq_f32(x_fft_buf_re, e_fft_im);
-      const float32x4_t f = vmlsq_f32(c, x_fft_buf_im, e_fft_re);
-      // Interleave real and imaginary parts.
-      const float32x4x2_t g_n_h = vzipq_f32(e, f);
-      // Store
-      vst1q_f32(&fft[2 * j + 0], g_n_h.val[0]);
-      vst1q_f32(&fft[2 * j + 4], g_n_h.val[1]);
-    }
-    // ... and fixup the first imaginary entry.
-    fft[1] =
-        MulRe(x_fft_buf[0][xPos + PART_LEN], -x_fft_buf[1][xPos + PART_LEN],
-              e_fft[0][PART_LEN], e_fft[1][PART_LEN]);
-
-    ooura_fft.InverseFft(fft);
-    memset(fft + PART_LEN, 0, sizeof(float) * PART_LEN);
-
-    // fft scaling
-    {
-      const float scale = 2.0f / PART_LEN2;
-      const float32x4_t scale_ps = vmovq_n_f32(scale);
-      for (j = 0; j < PART_LEN; j += 4) {
-        const float32x4_t fft_ps = vld1q_f32(&fft[j]);
-        const float32x4_t fft_scale = vmulq_f32(fft_ps, scale_ps);
-        vst1q_f32(&fft[j], fft_scale);
-      }
-    }
-    ooura_fft.Fft(fft);
-
-    {
-      const float wt1 = h_fft_buf[1][pos];
-      h_fft_buf[0][pos + PART_LEN] += fft[1];
-      for (j = 0; j < PART_LEN; j += 4) {
-        float32x4_t wtBuf_re = vld1q_f32(&h_fft_buf[0][pos + j]);
-        float32x4_t wtBuf_im = vld1q_f32(&h_fft_buf[1][pos + j]);
-        const float32x4_t fft0 = vld1q_f32(&fft[2 * j + 0]);
-        const float32x4_t fft4 = vld1q_f32(&fft[2 * j + 4]);
-        const float32x4x2_t fft_re_im = vuzpq_f32(fft0, fft4);
-        wtBuf_re = vaddq_f32(wtBuf_re, fft_re_im.val[0]);
-        wtBuf_im = vaddq_f32(wtBuf_im, fft_re_im.val[1]);
-
-        vst1q_f32(&h_fft_buf[0][pos + j], wtBuf_re);
-        vst1q_f32(&h_fft_buf[1][pos + j], wtBuf_im);
-      }
-      h_fft_buf[1][pos] = wt1;
-    }
-  }
-}
-
-static float32x4_t vpowq_f32(float32x4_t a, float32x4_t b) {
-  // a^b = exp2(b * log2(a))
-  //   exp2(x) and log2(x) are calculated using polynomial approximations.
-  float32x4_t log2_a, b_log2_a, a_exp_b;
-
-  // Calculate log2(x), x = a.
-  {
-    // To calculate log2(x), we decompose x like this:
-    //   x = y * 2^n
-    //     n is an integer
-    //     y is in the [1.0, 2.0) range
-    //
-    //   log2(x) = log2(y) + n
-    //     n       can be evaluated by playing with float representation.
-    //     log2(y) in a small range can be approximated, this code uses an order
-    //             five polynomial approximation. The coefficients have been
-    //             estimated with the Remez algorithm and the resulting
-    //             polynomial has a maximum relative error of 0.00086%.
-
-    // Compute n.
-    //    This is done by masking the exponent, shifting it into the top bit of
-    //    the mantissa, putting eight into the biased exponent (to shift/
-    //    compensate the fact that the exponent has been shifted in the top/
-    //    fractional part and finally getting rid of the implicit leading one
-    //    from the mantissa by substracting it out.
-    const uint32x4_t vec_float_exponent_mask = vdupq_n_u32(0x7F800000);
-    const uint32x4_t vec_eight_biased_exponent = vdupq_n_u32(0x43800000);
-    const uint32x4_t vec_implicit_leading_one = vdupq_n_u32(0x43BF8000);
-    const uint32x4_t two_n =
-        vandq_u32(vreinterpretq_u32_f32(a), vec_float_exponent_mask);
-    const uint32x4_t n_1 = vshrq_n_u32(two_n, kShiftExponentIntoTopMantissa);
-    const uint32x4_t n_0 = vorrq_u32(n_1, vec_eight_biased_exponent);
-    const float32x4_t n =
-        vsubq_f32(vreinterpretq_f32_u32(n_0),
-                  vreinterpretq_f32_u32(vec_implicit_leading_one));
-    // Compute y.
-    const uint32x4_t vec_mantissa_mask = vdupq_n_u32(0x007FFFFF);
-    const uint32x4_t vec_zero_biased_exponent_is_one = vdupq_n_u32(0x3F800000);
-    const uint32x4_t mantissa =
-        vandq_u32(vreinterpretq_u32_f32(a), vec_mantissa_mask);
-    const float32x4_t y = vreinterpretq_f32_u32(
-        vorrq_u32(mantissa, vec_zero_biased_exponent_is_one));
-    // Approximate log2(y) ~= (y - 1) * pol5(y).
-    //    pol5(y) = C5 * y^5 + C4 * y^4 + C3 * y^3 + C2 * y^2 + C1 * y + C0
-    const float32x4_t C5 = vdupq_n_f32(-3.4436006e-2f);
-    const float32x4_t C4 = vdupq_n_f32(3.1821337e-1f);
-    const float32x4_t C3 = vdupq_n_f32(-1.2315303f);
-    const float32x4_t C2 = vdupq_n_f32(2.5988452f);
-    const float32x4_t C1 = vdupq_n_f32(-3.3241990f);
-    const float32x4_t C0 = vdupq_n_f32(3.1157899f);
-    float32x4_t pol5_y = C5;
-    pol5_y = vmlaq_f32(C4, y, pol5_y);
-    pol5_y = vmlaq_f32(C3, y, pol5_y);
-    pol5_y = vmlaq_f32(C2, y, pol5_y);
-    pol5_y = vmlaq_f32(C1, y, pol5_y);
-    pol5_y = vmlaq_f32(C0, y, pol5_y);
-    const float32x4_t y_minus_one =
-        vsubq_f32(y, vreinterpretq_f32_u32(vec_zero_biased_exponent_is_one));
-    const float32x4_t log2_y = vmulq_f32(y_minus_one, pol5_y);
-
-    // Combine parts.
-    log2_a = vaddq_f32(n, log2_y);
-  }
-
-  // b * log2(a)
-  b_log2_a = vmulq_f32(b, log2_a);
-
-  // Calculate exp2(x), x = b * log2(a).
-  {
-    // To calculate 2^x, we decompose x like this:
-    //   x = n + y
-    //     n is an integer, the value of x - 0.5 rounded down, therefore
-    //     y is in the [0.5, 1.5) range
-    //
-    //   2^x = 2^n * 2^y
-    //     2^n can be evaluated by playing with float representation.
-    //     2^y in a small range can be approximated, this code uses an order two
-    //         polynomial approximation. The coefficients have been estimated
-    //         with the Remez algorithm and the resulting polynomial has a
-    //         maximum relative error of 0.17%.
-    // To avoid over/underflow, we reduce the range of input to ]-127, 129].
-    const float32x4_t max_input = vdupq_n_f32(129.f);
-    const float32x4_t min_input = vdupq_n_f32(-126.99999f);
-    const float32x4_t x_min = vminq_f32(b_log2_a, max_input);
-    const float32x4_t x_max = vmaxq_f32(x_min, min_input);
-    // Compute n.
-    const float32x4_t half = vdupq_n_f32(0.5f);
-    const float32x4_t x_minus_half = vsubq_f32(x_max, half);
-    const int32x4_t x_minus_half_floor = vcvtq_s32_f32(x_minus_half);
-
-    // Compute 2^n.
-    const int32x4_t float_exponent_bias = vdupq_n_s32(127);
-    const int32x4_t two_n_exponent =
-        vaddq_s32(x_minus_half_floor, float_exponent_bias);
-    const float32x4_t two_n =
-        vreinterpretq_f32_s32(vshlq_n_s32(two_n_exponent, kFloatExponentShift));
-    // Compute y.
-    const float32x4_t y = vsubq_f32(x_max, vcvtq_f32_s32(x_minus_half_floor));
-
-    // Approximate 2^y ~= C2 * y^2 + C1 * y + C0.
-    const float32x4_t C2 = vdupq_n_f32(3.3718944e-1f);
-    const float32x4_t C1 = vdupq_n_f32(6.5763628e-1f);
-    const float32x4_t C0 = vdupq_n_f32(1.0017247f);
-    float32x4_t exp2_y = C2;
-    exp2_y = vmlaq_f32(C1, y, exp2_y);
-    exp2_y = vmlaq_f32(C0, y, exp2_y);
-
-    // Combine parts.
-    a_exp_b = vmulq_f32(exp2_y, two_n);
-  }
-
-  return a_exp_b;
-}
-
-static void OverdriveNEON(float overdrive_scaling,
-                          float hNlFb,
-                          float hNl[PART_LEN1]) {
-  int i;
-  const float32x4_t vec_hNlFb = vmovq_n_f32(hNlFb);
-  const float32x4_t vec_one = vdupq_n_f32(1.0f);
-  const float32x4_t vec_overdrive_scaling = vmovq_n_f32(overdrive_scaling);
-
-  // vectorized code (four at once)
-  for (i = 0; i + 3 < PART_LEN1; i += 4) {
-    // Weight subbands
-    float32x4_t vec_hNl = vld1q_f32(&hNl[i]);
-    const float32x4_t vec_weightCurve = vld1q_f32(&WebRtcAec_weightCurve[i]);
-    const uint32x4_t bigger = vcgtq_f32(vec_hNl, vec_hNlFb);
-    const float32x4_t vec_weightCurve_hNlFb =
-        vmulq_f32(vec_weightCurve, vec_hNlFb);
-    const float32x4_t vec_one_weightCurve = vsubq_f32(vec_one, vec_weightCurve);
-    const float32x4_t vec_one_weightCurve_hNl =
-        vmulq_f32(vec_one_weightCurve, vec_hNl);
-    const uint32x4_t vec_if0 =
-        vandq_u32(vmvnq_u32(bigger), vreinterpretq_u32_f32(vec_hNl));
-    const float32x4_t vec_one_weightCurve_add =
-        vaddq_f32(vec_weightCurve_hNlFb, vec_one_weightCurve_hNl);
-    const uint32x4_t vec_if1 =
-        vandq_u32(bigger, vreinterpretq_u32_f32(vec_one_weightCurve_add));
-
-    vec_hNl = vreinterpretq_f32_u32(vorrq_u32(vec_if0, vec_if1));
-
-    const float32x4_t vec_overDriveCurve =
-        vld1q_f32(&WebRtcAec_overDriveCurve[i]);
-    const float32x4_t vec_overDriveSm_overDriveCurve =
-        vmulq_f32(vec_overdrive_scaling, vec_overDriveCurve);
-    vec_hNl = vpowq_f32(vec_hNl, vec_overDriveSm_overDriveCurve);
-    vst1q_f32(&hNl[i], vec_hNl);
-  }
-
-  // scalar code for the remaining items.
-  for (; i < PART_LEN1; i++) {
-    // Weight subbands
-    if (hNl[i] > hNlFb) {
-      hNl[i] = WebRtcAec_weightCurve[i] * hNlFb +
-               (1 - WebRtcAec_weightCurve[i]) * hNl[i];
-    }
-
-    hNl[i] = powf(hNl[i], overdrive_scaling * WebRtcAec_overDriveCurve[i]);
-  }
-}
-
-static void SuppressNEON(const float hNl[PART_LEN1], float efw[2][PART_LEN1]) {
-  int i;
-  const float32x4_t vec_minus_one = vdupq_n_f32(-1.0f);
-  // vectorized code (four at once)
-  for (i = 0; i + 3 < PART_LEN1; i += 4) {
-    float32x4_t vec_hNl = vld1q_f32(&hNl[i]);
-    float32x4_t vec_efw_re = vld1q_f32(&efw[0][i]);
-    float32x4_t vec_efw_im = vld1q_f32(&efw[1][i]);
-    vec_efw_re = vmulq_f32(vec_efw_re, vec_hNl);
-    vec_efw_im = vmulq_f32(vec_efw_im, vec_hNl);
-
-    // Ooura fft returns incorrect sign on imaginary component. It matters
-    // here because we are making an additive change with comfort noise.
-    vec_efw_im = vmulq_f32(vec_efw_im, vec_minus_one);
-    vst1q_f32(&efw[0][i], vec_efw_re);
-    vst1q_f32(&efw[1][i], vec_efw_im);
-  }
-
-  // scalar code for the remaining items.
-  for (; i < PART_LEN1; i++) {
-    efw[0][i] *= hNl[i];
-    efw[1][i] *= hNl[i];
-
-    // Ooura fft returns incorrect sign on imaginary component. It matters
-    // here because we are making an additive change with comfort noise.
-    efw[1][i] *= -1;
-  }
-}
-
-static int PartitionDelayNEON(
-    int num_partitions,
-    float h_fft_buf[2][kExtendedNumPartitions * PART_LEN1]) {
-  // Measures the energy in each filter partition and returns the partition with
-  // highest energy.
-  // TODO(bjornv): Spread computational cost by computing one partition per
-  // block?
-  float wfEnMax = 0;
-  int i;
-  int delay = 0;
-
-  for (i = 0; i < num_partitions; i++) {
-    int j;
-    int pos = i * PART_LEN1;
-    float wfEn = 0;
-    float32x4_t vec_wfEn = vdupq_n_f32(0.0f);
-    // vectorized code (four at once)
-    for (j = 0; j + 3 < PART_LEN1; j += 4) {
-      const float32x4_t vec_wfBuf0 = vld1q_f32(&h_fft_buf[0][pos + j]);
-      const float32x4_t vec_wfBuf1 = vld1q_f32(&h_fft_buf[1][pos + j]);
-      vec_wfEn = vmlaq_f32(vec_wfEn, vec_wfBuf0, vec_wfBuf0);
-      vec_wfEn = vmlaq_f32(vec_wfEn, vec_wfBuf1, vec_wfBuf1);
-    }
-    {
-      float32x2_t vec_total;
-      // A B C D
-      vec_total = vpadd_f32(vget_low_f32(vec_wfEn), vget_high_f32(vec_wfEn));
-      // A+B C+D
-      vec_total = vpadd_f32(vec_total, vec_total);
-      // A+B+C+D A+B+C+D
-      wfEn = vget_lane_f32(vec_total, 0);
-    }
-
-    // scalar code for the remaining items.
-    for (; j < PART_LEN1; j++) {
-      wfEn += h_fft_buf[0][pos + j] * h_fft_buf[0][pos + j] +
-              h_fft_buf[1][pos + j] * h_fft_buf[1][pos + j];
-    }
-
-    if (wfEn > wfEnMax) {
-      wfEnMax = wfEn;
-      delay = i;
-    }
-  }
-  return delay;
-}
-
-// Updates the following smoothed  Power Spectral Densities (PSD):
-//  - sd  : near-end
-//  - se  : residual echo
-//  - sx  : far-end
-//  - sde : cross-PSD of near-end and residual echo
-//  - sxd : cross-PSD of near-end and far-end
-//
-// In addition to updating the PSDs, also the filter diverge state is determined
-// upon actions are taken.
-static void UpdateCoherenceSpectraNEON(int mult,
-                                       bool extended_filter_enabled,
-                                       float efw[2][PART_LEN1],
-                                       float dfw[2][PART_LEN1],
-                                       float xfw[2][PART_LEN1],
-                                       CoherenceState* coherence_state,
-                                       short* filter_divergence_state,
-                                       int* extreme_filter_divergence) {
-  // Power estimate smoothing coefficients.
-  const float* ptrGCoh =
-      extended_filter_enabled
-          ? WebRtcAec_kExtendedSmoothingCoefficients[mult - 1]
-          : WebRtcAec_kNormalSmoothingCoefficients[mult - 1];
-  int i;
-  float sdSum = 0, seSum = 0;
-  const float32x4_t vec_15 = vdupq_n_f32(WebRtcAec_kMinFarendPSD);
-  float32x4_t vec_sdSum = vdupq_n_f32(0.0f);
-  float32x4_t vec_seSum = vdupq_n_f32(0.0f);
-
-  for (i = 0; i + 3 < PART_LEN1; i += 4) {
-    const float32x4_t vec_dfw0 = vld1q_f32(&dfw[0][i]);
-    const float32x4_t vec_dfw1 = vld1q_f32(&dfw[1][i]);
-    const float32x4_t vec_efw0 = vld1q_f32(&efw[0][i]);
-    const float32x4_t vec_efw1 = vld1q_f32(&efw[1][i]);
-    const float32x4_t vec_xfw0 = vld1q_f32(&xfw[0][i]);
-    const float32x4_t vec_xfw1 = vld1q_f32(&xfw[1][i]);
-    float32x4_t vec_sd =
-        vmulq_n_f32(vld1q_f32(&coherence_state->sd[i]), ptrGCoh[0]);
-    float32x4_t vec_se =
-        vmulq_n_f32(vld1q_f32(&coherence_state->se[i]), ptrGCoh[0]);
-    float32x4_t vec_sx =
-        vmulq_n_f32(vld1q_f32(&coherence_state->sx[i]), ptrGCoh[0]);
-    float32x4_t vec_dfw_sumsq = vmulq_f32(vec_dfw0, vec_dfw0);
-    float32x4_t vec_efw_sumsq = vmulq_f32(vec_efw0, vec_efw0);
-    float32x4_t vec_xfw_sumsq = vmulq_f32(vec_xfw0, vec_xfw0);
-
-    vec_dfw_sumsq = vmlaq_f32(vec_dfw_sumsq, vec_dfw1, vec_dfw1);
-    vec_efw_sumsq = vmlaq_f32(vec_efw_sumsq, vec_efw1, vec_efw1);
-    vec_xfw_sumsq = vmlaq_f32(vec_xfw_sumsq, vec_xfw1, vec_xfw1);
-    vec_xfw_sumsq = vmaxq_f32(vec_xfw_sumsq, vec_15);
-    vec_sd = vmlaq_n_f32(vec_sd, vec_dfw_sumsq, ptrGCoh[1]);
-    vec_se = vmlaq_n_f32(vec_se, vec_efw_sumsq, ptrGCoh[1]);
-    vec_sx = vmlaq_n_f32(vec_sx, vec_xfw_sumsq, ptrGCoh[1]);
-
-    vst1q_f32(&coherence_state->sd[i], vec_sd);
-    vst1q_f32(&coherence_state->se[i], vec_se);
-    vst1q_f32(&coherence_state->sx[i], vec_sx);
-
-    {
-      float32x4x2_t vec_sde = vld2q_f32(&coherence_state->sde[i][0]);
-      float32x4_t vec_dfwefw0011 = vmulq_f32(vec_dfw0, vec_efw0);
-      float32x4_t vec_dfwefw0110 = vmulq_f32(vec_dfw0, vec_efw1);
-      vec_sde.val[0] = vmulq_n_f32(vec_sde.val[0], ptrGCoh[0]);
-      vec_sde.val[1] = vmulq_n_f32(vec_sde.val[1], ptrGCoh[0]);
-      vec_dfwefw0011 = vmlaq_f32(vec_dfwefw0011, vec_dfw1, vec_efw1);
-      vec_dfwefw0110 = vmlsq_f32(vec_dfwefw0110, vec_dfw1, vec_efw0);
-      vec_sde.val[0] = vmlaq_n_f32(vec_sde.val[0], vec_dfwefw0011, ptrGCoh[1]);
-      vec_sde.val[1] = vmlaq_n_f32(vec_sde.val[1], vec_dfwefw0110, ptrGCoh[1]);
-      vst2q_f32(&coherence_state->sde[i][0], vec_sde);
-    }
-
-    {
-      float32x4x2_t vec_sxd = vld2q_f32(&coherence_state->sxd[i][0]);
-      float32x4_t vec_dfwxfw0011 = vmulq_f32(vec_dfw0, vec_xfw0);
-      float32x4_t vec_dfwxfw0110 = vmulq_f32(vec_dfw0, vec_xfw1);
-      vec_sxd.val[0] = vmulq_n_f32(vec_sxd.val[0], ptrGCoh[0]);
-      vec_sxd.val[1] = vmulq_n_f32(vec_sxd.val[1], ptrGCoh[0]);
-      vec_dfwxfw0011 = vmlaq_f32(vec_dfwxfw0011, vec_dfw1, vec_xfw1);
-      vec_dfwxfw0110 = vmlsq_f32(vec_dfwxfw0110, vec_dfw1, vec_xfw0);
-      vec_sxd.val[0] = vmlaq_n_f32(vec_sxd.val[0], vec_dfwxfw0011, ptrGCoh[1]);
-      vec_sxd.val[1] = vmlaq_n_f32(vec_sxd.val[1], vec_dfwxfw0110, ptrGCoh[1]);
-      vst2q_f32(&coherence_state->sxd[i][0], vec_sxd);
-    }
-
-    vec_sdSum = vaddq_f32(vec_sdSum, vec_sd);
-    vec_seSum = vaddq_f32(vec_seSum, vec_se);
-  }
-  {
-    float32x2_t vec_sdSum_total;
-    float32x2_t vec_seSum_total;
-    // A B C D
-    vec_sdSum_total =
-        vpadd_f32(vget_low_f32(vec_sdSum), vget_high_f32(vec_sdSum));
-    vec_seSum_total =
-        vpadd_f32(vget_low_f32(vec_seSum), vget_high_f32(vec_seSum));
-    // A+B C+D
-    vec_sdSum_total = vpadd_f32(vec_sdSum_total, vec_sdSum_total);
-    vec_seSum_total = vpadd_f32(vec_seSum_total, vec_seSum_total);
-    // A+B+C+D A+B+C+D
-    sdSum = vget_lane_f32(vec_sdSum_total, 0);
-    seSum = vget_lane_f32(vec_seSum_total, 0);
-  }
-
-  // scalar code for the remaining items.
-  for (; i < PART_LEN1; i++) {
-    coherence_state->sd[i] =
-        ptrGCoh[0] * coherence_state->sd[i] +
-        ptrGCoh[1] * (dfw[0][i] * dfw[0][i] + dfw[1][i] * dfw[1][i]);
-    coherence_state->se[i] =
-        ptrGCoh[0] * coherence_state->se[i] +
-        ptrGCoh[1] * (efw[0][i] * efw[0][i] + efw[1][i] * efw[1][i]);
-    // We threshold here to protect against the ill-effects of a zero farend.
-    // The threshold is not arbitrarily chosen, but balances protection and
-    // adverse interaction with the algorithm's tuning.
-    // TODO(bjornv): investigate further why this is so sensitive.
-    coherence_state->sx[i] =
-        ptrGCoh[0] * coherence_state->sx[i] +
-        ptrGCoh[1] *
-            WEBRTC_SPL_MAX(xfw[0][i] * xfw[0][i] + xfw[1][i] * xfw[1][i],
-                           WebRtcAec_kMinFarendPSD);
-
-    coherence_state->sde[i][0] =
-        ptrGCoh[0] * coherence_state->sde[i][0] +
-        ptrGCoh[1] * (dfw[0][i] * efw[0][i] + dfw[1][i] * efw[1][i]);
-    coherence_state->sde[i][1] =
-        ptrGCoh[0] * coherence_state->sde[i][1] +
-        ptrGCoh[1] * (dfw[0][i] * efw[1][i] - dfw[1][i] * efw[0][i]);
-
-    coherence_state->sxd[i][0] =
-        ptrGCoh[0] * coherence_state->sxd[i][0] +
-        ptrGCoh[1] * (dfw[0][i] * xfw[0][i] + dfw[1][i] * xfw[1][i]);
-    coherence_state->sxd[i][1] =
-        ptrGCoh[0] * coherence_state->sxd[i][1] +
-        ptrGCoh[1] * (dfw[0][i] * xfw[1][i] - dfw[1][i] * xfw[0][i]);
-
-    sdSum += coherence_state->sd[i];
-    seSum += coherence_state->se[i];
-  }
-
-  // Divergent filter safeguard update.
-  *filter_divergence_state =
-      (*filter_divergence_state ? 1.05f : 1.0f) * seSum > sdSum;
-
-  // Signal extreme filter divergence if the error is significantly larger
-  // than the nearend (13 dB).
-  *extreme_filter_divergence = (seSum > (19.95f * sdSum));
-}
-
-// Window time domain data to be used by the fft.
-static void WindowDataNEON(float* x_windowed, const float* x) {
-  int i;
-  for (i = 0; i < PART_LEN; i += 4) {
-    const float32x4_t vec_Buf1 = vld1q_f32(&x[i]);
-    const float32x4_t vec_Buf2 = vld1q_f32(&x[PART_LEN + i]);
-    const float32x4_t vec_sqrtHanning = vld1q_f32(&WebRtcAec_sqrtHanning[i]);
-    // A B C D
-    float32x4_t vec_sqrtHanning_rev =
-        vld1q_f32(&WebRtcAec_sqrtHanning[PART_LEN - i - 3]);
-    // B A D C
-    vec_sqrtHanning_rev = vrev64q_f32(vec_sqrtHanning_rev);
-    // D C B A
-    vec_sqrtHanning_rev = vcombine_f32(vget_high_f32(vec_sqrtHanning_rev),
-                                       vget_low_f32(vec_sqrtHanning_rev));
-    vst1q_f32(&x_windowed[i], vmulq_f32(vec_Buf1, vec_sqrtHanning));
-    vst1q_f32(&x_windowed[PART_LEN + i],
-              vmulq_f32(vec_Buf2, vec_sqrtHanning_rev));
-  }
-}
-
-// Puts fft output data into a complex valued array.
-static void StoreAsComplexNEON(const float* data,
-                               float data_complex[2][PART_LEN1]) {
-  int i;
-  for (i = 0; i < PART_LEN; i += 4) {
-    const float32x4x2_t vec_data = vld2q_f32(&data[2 * i]);
-    vst1q_f32(&data_complex[0][i], vec_data.val[0]);
-    vst1q_f32(&data_complex[1][i], vec_data.val[1]);
-  }
-  // fix beginning/end values
-  data_complex[1][0] = 0;
-  data_complex[1][PART_LEN] = 0;
-  data_complex[0][0] = data[0];
-  data_complex[0][PART_LEN] = data[1];
-}
-
-static void ComputeCoherenceNEON(const CoherenceState* coherence_state,
-                                 float* cohde,
-                                 float* cohxd) {
-  int i;
-
-  {
-    const float32x4_t vec_1eminus10 = vdupq_n_f32(1e-10f);
-
-    // Subband coherence
-    for (i = 0; i + 3 < PART_LEN1; i += 4) {
-      const float32x4_t vec_sd = vld1q_f32(&coherence_state->sd[i]);
-      const float32x4_t vec_se = vld1q_f32(&coherence_state->se[i]);
-      const float32x4_t vec_sx = vld1q_f32(&coherence_state->sx[i]);
-      const float32x4_t vec_sdse = vmlaq_f32(vec_1eminus10, vec_sd, vec_se);
-      const float32x4_t vec_sdsx = vmlaq_f32(vec_1eminus10, vec_sd, vec_sx);
-      float32x4x2_t vec_sde = vld2q_f32(&coherence_state->sde[i][0]);
-      float32x4x2_t vec_sxd = vld2q_f32(&coherence_state->sxd[i][0]);
-      float32x4_t vec_cohde = vmulq_f32(vec_sde.val[0], vec_sde.val[0]);
-      float32x4_t vec_cohxd = vmulq_f32(vec_sxd.val[0], vec_sxd.val[0]);
-      vec_cohde = vmlaq_f32(vec_cohde, vec_sde.val[1], vec_sde.val[1]);
-      vec_cohde = vdivq_f32(vec_cohde, vec_sdse);
-      vec_cohxd = vmlaq_f32(vec_cohxd, vec_sxd.val[1], vec_sxd.val[1]);
-      vec_cohxd = vdivq_f32(vec_cohxd, vec_sdsx);
-
-      vst1q_f32(&cohde[i], vec_cohde);
-      vst1q_f32(&cohxd[i], vec_cohxd);
-    }
-  }
-  // scalar code for the remaining items.
-  for (; i < PART_LEN1; i++) {
-    cohde[i] = (coherence_state->sde[i][0] * coherence_state->sde[i][0] +
-                coherence_state->sde[i][1] * coherence_state->sde[i][1]) /
-               (coherence_state->sd[i] * coherence_state->se[i] + 1e-10f);
-    cohxd[i] = (coherence_state->sxd[i][0] * coherence_state->sxd[i][0] +
-                coherence_state->sxd[i][1] * coherence_state->sxd[i][1]) /
-               (coherence_state->sx[i] * coherence_state->sd[i] + 1e-10f);
-  }
-}
-
-void WebRtcAec_InitAec_neon(void) {
-  WebRtcAec_FilterFar = FilterFarNEON;
-  WebRtcAec_ScaleErrorSignal = ScaleErrorSignalNEON;
-  WebRtcAec_FilterAdaptation = FilterAdaptationNEON;
-  WebRtcAec_Overdrive = OverdriveNEON;
-  WebRtcAec_Suppress = SuppressNEON;
-  WebRtcAec_ComputeCoherence = ComputeCoherenceNEON;
-  WebRtcAec_UpdateCoherenceSpectra = UpdateCoherenceSpectraNEON;
-  WebRtcAec_StoreAsComplex = StoreAsComplexNEON;
-  WebRtcAec_PartitionDelay = PartitionDelayNEON;
-  WebRtcAec_WindowData = WindowDataNEON;
-}
-}  // namespace webrtc
diff --git a/modules/audio_processing/aec/aec_core_optimized_methods.h b/modules/audio_processing/aec/aec_core_optimized_methods.h
deleted file mode 100644
index 5e873c8..0000000
--- a/modules/audio_processing/aec/aec_core_optimized_methods.h
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- *  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_PROCESSING_AEC_AEC_CORE_OPTIMIZED_METHODS_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_AEC_AEC_CORE_OPTIMIZED_METHODS_H_
-
-#include <memory>
-
-#include "webrtc/modules/audio_processing/aec/aec_core.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-typedef void (*WebRtcAecFilterFar)(
-    int num_partitions,
-    int x_fft_buf_block_pos,
-    float x_fft_buf[2][kExtendedNumPartitions * PART_LEN1],
-    float h_fft_buf[2][kExtendedNumPartitions * PART_LEN1],
-    float y_fft[2][PART_LEN1]);
-extern WebRtcAecFilterFar WebRtcAec_FilterFar;
-typedef void (*WebRtcAecScaleErrorSignal)(float mu,
-                                          float error_threshold,
-                                          float x_pow[PART_LEN1],
-                                          float ef[2][PART_LEN1]);
-extern WebRtcAecScaleErrorSignal WebRtcAec_ScaleErrorSignal;
-typedef void (*WebRtcAecFilterAdaptation)(
-    const OouraFft& ooura_fft,
-    int num_partitions,
-    int x_fft_buf_block_pos,
-    float x_fft_buf[2][kExtendedNumPartitions * PART_LEN1],
-    float e_fft[2][PART_LEN1],
-    float h_fft_buf[2][kExtendedNumPartitions * PART_LEN1]);
-extern WebRtcAecFilterAdaptation WebRtcAec_FilterAdaptation;
-
-typedef void (*WebRtcAecOverdrive)(float overdrive_scaling,
-                                   const float hNlFb,
-                                   float hNl[PART_LEN1]);
-extern WebRtcAecOverdrive WebRtcAec_Overdrive;
-
-typedef void (*WebRtcAecSuppress)(const float hNl[PART_LEN1],
-                                  float efw[2][PART_LEN1]);
-extern WebRtcAecSuppress WebRtcAec_Suppress;
-
-typedef void (*WebRtcAecComputeCoherence)(const CoherenceState* coherence_state,
-                                          float* cohde,
-                                          float* cohxd);
-extern WebRtcAecComputeCoherence WebRtcAec_ComputeCoherence;
-
-typedef void (*WebRtcAecUpdateCoherenceSpectra)(int mult,
-                                                bool extended_filter_enabled,
-                                                float efw[2][PART_LEN1],
-                                                float dfw[2][PART_LEN1],
-                                                float xfw[2][PART_LEN1],
-                                                CoherenceState* coherence_state,
-                                                short* filter_divergence_state,
-                                                int* extreme_filter_divergence);
-extern WebRtcAecUpdateCoherenceSpectra WebRtcAec_UpdateCoherenceSpectra;
-
-typedef int (*WebRtcAecPartitionDelay)(
-    int num_partitions,
-    float h_fft_buf[2][kExtendedNumPartitions * PART_LEN1]);
-extern WebRtcAecPartitionDelay WebRtcAec_PartitionDelay;
-
-typedef void (*WebRtcAecStoreAsComplex)(const float* data,
-                                        float data_complex[2][PART_LEN1]);
-extern WebRtcAecStoreAsComplex WebRtcAec_StoreAsComplex;
-
-typedef void (*WebRtcAecWindowData)(float* x_windowed, const float* x);
-extern WebRtcAecWindowData WebRtcAec_WindowData;
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_AEC_AEC_CORE_OPTIMIZED_METHODS_H_
diff --git a/modules/audio_processing/aec/aec_core_sse2.cc b/modules/audio_processing/aec/aec_core_sse2.cc
deleted file mode 100644
index ac93919..0000000
--- a/modules/audio_processing/aec/aec_core_sse2.cc
+++ /dev/null
@@ -1,751 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/*
- * The core AEC algorithm, SSE2 version of speed-critical functions.
- */
-
-#include <emmintrin.h>
-#include <math.h>
-#include <string.h>  // memset
-
-extern "C" {
-#include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
-}
-#include "webrtc/modules/audio_processing/aec/aec_common.h"
-#include "webrtc/modules/audio_processing/aec/aec_core_optimized_methods.h"
-#include "webrtc/modules/audio_processing/utility/ooura_fft.h"
-
-namespace webrtc {
-
-__inline static float MulRe(float aRe, float aIm, float bRe, float bIm) {
-  return aRe * bRe - aIm * bIm;
-}
-
-__inline static float MulIm(float aRe, float aIm, float bRe, float bIm) {
-  return aRe * bIm + aIm * bRe;
-}
-
-static void FilterFarSSE2(int num_partitions,
-                          int x_fft_buf_block_pos,
-                          float x_fft_buf[2]
-                                         [kExtendedNumPartitions * PART_LEN1],
-                          float h_fft_buf[2]
-                                         [kExtendedNumPartitions * PART_LEN1],
-                          float y_fft[2][PART_LEN1]) {
-  int i;
-  for (i = 0; i < num_partitions; i++) {
-    int j;
-    int xPos = (i + x_fft_buf_block_pos) * PART_LEN1;
-    int pos = i * PART_LEN1;
-    // Check for wrap
-    if (i + x_fft_buf_block_pos >= num_partitions) {
-      xPos -= num_partitions * (PART_LEN1);
-    }
-
-    // vectorized code (four at once)
-    for (j = 0; j + 3 < PART_LEN1; j += 4) {
-      const __m128 x_fft_buf_re = _mm_loadu_ps(&x_fft_buf[0][xPos + j]);
-      const __m128 x_fft_buf_im = _mm_loadu_ps(&x_fft_buf[1][xPos + j]);
-      const __m128 h_fft_buf_re = _mm_loadu_ps(&h_fft_buf[0][pos + j]);
-      const __m128 h_fft_buf_im = _mm_loadu_ps(&h_fft_buf[1][pos + j]);
-      const __m128 y_fft_re = _mm_loadu_ps(&y_fft[0][j]);
-      const __m128 y_fft_im = _mm_loadu_ps(&y_fft[1][j]);
-      const __m128 a = _mm_mul_ps(x_fft_buf_re, h_fft_buf_re);
-      const __m128 b = _mm_mul_ps(x_fft_buf_im, h_fft_buf_im);
-      const __m128 c = _mm_mul_ps(x_fft_buf_re, h_fft_buf_im);
-      const __m128 d = _mm_mul_ps(x_fft_buf_im, h_fft_buf_re);
-      const __m128 e = _mm_sub_ps(a, b);
-      const __m128 f = _mm_add_ps(c, d);
-      const __m128 g = _mm_add_ps(y_fft_re, e);
-      const __m128 h = _mm_add_ps(y_fft_im, f);
-      _mm_storeu_ps(&y_fft[0][j], g);
-      _mm_storeu_ps(&y_fft[1][j], h);
-    }
-    // scalar code for the remaining items.
-    for (; j < PART_LEN1; j++) {
-      y_fft[0][j] += MulRe(x_fft_buf[0][xPos + j], x_fft_buf[1][xPos + j],
-                           h_fft_buf[0][pos + j], h_fft_buf[1][pos + j]);
-      y_fft[1][j] += MulIm(x_fft_buf[0][xPos + j], x_fft_buf[1][xPos + j],
-                           h_fft_buf[0][pos + j], h_fft_buf[1][pos + j]);
-    }
-  }
-}
-
-static void ScaleErrorSignalSSE2(float mu,
-                                 float error_threshold,
-                                 float x_pow[PART_LEN1],
-                                 float ef[2][PART_LEN1]) {
-  const __m128 k1e_10f = _mm_set1_ps(1e-10f);
-  const __m128 kMu = _mm_set1_ps(mu);
-  const __m128 kThresh = _mm_set1_ps(error_threshold);
-
-  int i;
-  // vectorized code (four at once)
-  for (i = 0; i + 3 < PART_LEN1; i += 4) {
-    const __m128 x_pow_local = _mm_loadu_ps(&x_pow[i]);
-    const __m128 ef_re_base = _mm_loadu_ps(&ef[0][i]);
-    const __m128 ef_im_base = _mm_loadu_ps(&ef[1][i]);
-
-    const __m128 xPowPlus = _mm_add_ps(x_pow_local, k1e_10f);
-    __m128 ef_re = _mm_div_ps(ef_re_base, xPowPlus);
-    __m128 ef_im = _mm_div_ps(ef_im_base, xPowPlus);
-    const __m128 ef_re2 = _mm_mul_ps(ef_re, ef_re);
-    const __m128 ef_im2 = _mm_mul_ps(ef_im, ef_im);
-    const __m128 ef_sum2 = _mm_add_ps(ef_re2, ef_im2);
-    const __m128 absEf = _mm_sqrt_ps(ef_sum2);
-    const __m128 bigger = _mm_cmpgt_ps(absEf, kThresh);
-    __m128 absEfPlus = _mm_add_ps(absEf, k1e_10f);
-    const __m128 absEfInv = _mm_div_ps(kThresh, absEfPlus);
-    __m128 ef_re_if = _mm_mul_ps(ef_re, absEfInv);
-    __m128 ef_im_if = _mm_mul_ps(ef_im, absEfInv);
-    ef_re_if = _mm_and_ps(bigger, ef_re_if);
-    ef_im_if = _mm_and_ps(bigger, ef_im_if);
-    ef_re = _mm_andnot_ps(bigger, ef_re);
-    ef_im = _mm_andnot_ps(bigger, ef_im);
-    ef_re = _mm_or_ps(ef_re, ef_re_if);
-    ef_im = _mm_or_ps(ef_im, ef_im_if);
-    ef_re = _mm_mul_ps(ef_re, kMu);
-    ef_im = _mm_mul_ps(ef_im, kMu);
-
-    _mm_storeu_ps(&ef[0][i], ef_re);
-    _mm_storeu_ps(&ef[1][i], ef_im);
-  }
-  // scalar code for the remaining items.
-  {
-    for (; i < (PART_LEN1); i++) {
-      float abs_ef;
-      ef[0][i] /= (x_pow[i] + 1e-10f);
-      ef[1][i] /= (x_pow[i] + 1e-10f);
-      abs_ef = sqrtf(ef[0][i] * ef[0][i] + ef[1][i] * ef[1][i]);
-
-      if (abs_ef > error_threshold) {
-        abs_ef = error_threshold / (abs_ef + 1e-10f);
-        ef[0][i] *= abs_ef;
-        ef[1][i] *= abs_ef;
-      }
-
-      // Stepsize factor
-      ef[0][i] *= mu;
-      ef[1][i] *= mu;
-    }
-  }
-}
-
-static void FilterAdaptationSSE2(
-    const OouraFft& ooura_fft,
-    int num_partitions,
-    int x_fft_buf_block_pos,
-    float x_fft_buf[2][kExtendedNumPartitions * PART_LEN1],
-    float e_fft[2][PART_LEN1],
-    float h_fft_buf[2][kExtendedNumPartitions * PART_LEN1]) {
-  float fft[PART_LEN2];
-  int i, j;
-  for (i = 0; i < num_partitions; i++) {
-    int xPos = (i + x_fft_buf_block_pos) * (PART_LEN1);
-    int pos = i * PART_LEN1;
-    // Check for wrap
-    if (i + x_fft_buf_block_pos >= num_partitions) {
-      xPos -= num_partitions * PART_LEN1;
-    }
-
-    // Process the whole array...
-    for (j = 0; j < PART_LEN; j += 4) {
-      // Load x_fft_buf and e_fft.
-      const __m128 x_fft_buf_re = _mm_loadu_ps(&x_fft_buf[0][xPos + j]);
-      const __m128 x_fft_buf_im = _mm_loadu_ps(&x_fft_buf[1][xPos + j]);
-      const __m128 e_fft_re = _mm_loadu_ps(&e_fft[0][j]);
-      const __m128 e_fft_im = _mm_loadu_ps(&e_fft[1][j]);
-      // Calculate the product of conjugate(x_fft_buf) by e_fft.
-      //   re(conjugate(a) * b) = aRe * bRe + aIm * bIm
-      //   im(conjugate(a) * b)=  aRe * bIm - aIm * bRe
-      const __m128 a = _mm_mul_ps(x_fft_buf_re, e_fft_re);
-      const __m128 b = _mm_mul_ps(x_fft_buf_im, e_fft_im);
-      const __m128 c = _mm_mul_ps(x_fft_buf_re, e_fft_im);
-      const __m128 d = _mm_mul_ps(x_fft_buf_im, e_fft_re);
-      const __m128 e = _mm_add_ps(a, b);
-      const __m128 f = _mm_sub_ps(c, d);
-      // Interleave real and imaginary parts.
-      const __m128 g = _mm_unpacklo_ps(e, f);
-      const __m128 h = _mm_unpackhi_ps(e, f);
-      // Store
-      _mm_storeu_ps(&fft[2 * j + 0], g);
-      _mm_storeu_ps(&fft[2 * j + 4], h);
-    }
-    // ... and fixup the first imaginary entry.
-    fft[1] =
-        MulRe(x_fft_buf[0][xPos + PART_LEN], -x_fft_buf[1][xPos + PART_LEN],
-              e_fft[0][PART_LEN], e_fft[1][PART_LEN]);
-
-    ooura_fft.InverseFft(fft);
-    memset(fft + PART_LEN, 0, sizeof(float) * PART_LEN);
-
-    // fft scaling
-    {
-      float scale = 2.0f / PART_LEN2;
-      const __m128 scale_ps = _mm_load_ps1(&scale);
-      for (j = 0; j < PART_LEN; j += 4) {
-        const __m128 fft_ps = _mm_loadu_ps(&fft[j]);
-        const __m128 fft_scale = _mm_mul_ps(fft_ps, scale_ps);
-        _mm_storeu_ps(&fft[j], fft_scale);
-      }
-    }
-    ooura_fft.Fft(fft);
-
-    {
-      float wt1 = h_fft_buf[1][pos];
-      h_fft_buf[0][pos + PART_LEN] += fft[1];
-      for (j = 0; j < PART_LEN; j += 4) {
-        __m128 wtBuf_re = _mm_loadu_ps(&h_fft_buf[0][pos + j]);
-        __m128 wtBuf_im = _mm_loadu_ps(&h_fft_buf[1][pos + j]);
-        const __m128 fft0 = _mm_loadu_ps(&fft[2 * j + 0]);
-        const __m128 fft4 = _mm_loadu_ps(&fft[2 * j + 4]);
-        const __m128 fft_re =
-            _mm_shuffle_ps(fft0, fft4, _MM_SHUFFLE(2, 0, 2, 0));
-        const __m128 fft_im =
-            _mm_shuffle_ps(fft0, fft4, _MM_SHUFFLE(3, 1, 3, 1));
-        wtBuf_re = _mm_add_ps(wtBuf_re, fft_re);
-        wtBuf_im = _mm_add_ps(wtBuf_im, fft_im);
-        _mm_storeu_ps(&h_fft_buf[0][pos + j], wtBuf_re);
-        _mm_storeu_ps(&h_fft_buf[1][pos + j], wtBuf_im);
-      }
-      h_fft_buf[1][pos] = wt1;
-    }
-  }
-}
-
-static __m128 mm_pow_ps(__m128 a, __m128 b) {
-  // a^b = exp2(b * log2(a))
-  //   exp2(x) and log2(x) are calculated using polynomial approximations.
-  __m128 log2_a, b_log2_a, a_exp_b;
-
-  // Calculate log2(x), x = a.
-  {
-    // To calculate log2(x), we decompose x like this:
-    //   x = y * 2^n
-    //     n is an integer
-    //     y is in the [1.0, 2.0) range
-    //
-    //   log2(x) = log2(y) + n
-    //     n       can be evaluated by playing with float representation.
-    //     log2(y) in a small range can be approximated, this code uses an order
-    //             five polynomial approximation. The coefficients have been
-    //             estimated with the Remez algorithm and the resulting
-    //             polynomial has a maximum relative error of 0.00086%.
-
-    // Compute n.
-    //    This is done by masking the exponent, shifting it into the top bit of
-    //    the mantissa, putting eight into the biased exponent (to shift/
-    //    compensate the fact that the exponent has been shifted in the top/
-    //    fractional part and finally getting rid of the implicit leading one
-    //    from the mantissa by substracting it out.
-    static const ALIGN16_BEG int float_exponent_mask[4] ALIGN16_END = {
-        0x7F800000, 0x7F800000, 0x7F800000, 0x7F800000};
-    static const ALIGN16_BEG int eight_biased_exponent[4] ALIGN16_END = {
-        0x43800000, 0x43800000, 0x43800000, 0x43800000};
-    static const ALIGN16_BEG int implicit_leading_one[4] ALIGN16_END = {
-        0x43BF8000, 0x43BF8000, 0x43BF8000, 0x43BF8000};
-    static const int shift_exponent_into_top_mantissa = 8;
-    const __m128 two_n =
-        _mm_and_ps(a, *(reinterpret_cast<const __m128*>(float_exponent_mask)));
-    const __m128 n_1 = _mm_castsi128_ps(_mm_srli_epi32(
-        _mm_castps_si128(two_n), shift_exponent_into_top_mantissa));
-    const __m128 n_0 =
-      _mm_or_ps(n_1, *(reinterpret_cast<const __m128*>(eight_biased_exponent)));
-    const __m128 n =
-      _mm_sub_ps(n_0, *(reinterpret_cast<const __m128*>(implicit_leading_one)));
-
-    // Compute y.
-    static const ALIGN16_BEG int mantissa_mask[4] ALIGN16_END = {
-        0x007FFFFF, 0x007FFFFF, 0x007FFFFF, 0x007FFFFF};
-    static const ALIGN16_BEG int zero_biased_exponent_is_one[4] ALIGN16_END = {
-        0x3F800000, 0x3F800000, 0x3F800000, 0x3F800000};
-    const __m128 mantissa =
-        _mm_and_ps(a, *(reinterpret_cast<const __m128*>(mantissa_mask)));
-    const __m128 y =
-        _mm_or_ps(mantissa,
-               *(reinterpret_cast<const __m128*>(zero_biased_exponent_is_one)));
-
-    // Approximate log2(y) ~= (y - 1) * pol5(y).
-    //    pol5(y) = C5 * y^5 + C4 * y^4 + C3 * y^3 + C2 * y^2 + C1 * y + C0
-    static const ALIGN16_BEG float ALIGN16_END C5[4] = {
-        -3.4436006e-2f, -3.4436006e-2f, -3.4436006e-2f, -3.4436006e-2f};
-    static const ALIGN16_BEG float ALIGN16_END C4[4] = {
-        3.1821337e-1f, 3.1821337e-1f, 3.1821337e-1f, 3.1821337e-1f};
-    static const ALIGN16_BEG float ALIGN16_END C3[4] = {
-        -1.2315303f, -1.2315303f, -1.2315303f, -1.2315303f};
-    static const ALIGN16_BEG float ALIGN16_END C2[4] = {2.5988452f, 2.5988452f,
-                                                        2.5988452f, 2.5988452f};
-    static const ALIGN16_BEG float ALIGN16_END C1[4] = {
-        -3.3241990f, -3.3241990f, -3.3241990f, -3.3241990f};
-    static const ALIGN16_BEG float ALIGN16_END C0[4] = {3.1157899f, 3.1157899f,
-                                                        3.1157899f, 3.1157899f};
-    const __m128 pol5_y_0 =
-        _mm_mul_ps(y, *(reinterpret_cast<const __m128*>(C5)));
-    const __m128 pol5_y_1 =
-        _mm_add_ps(pol5_y_0, *(reinterpret_cast<const __m128*>(C4)));
-    const __m128 pol5_y_2 = _mm_mul_ps(pol5_y_1, y);
-    const __m128 pol5_y_3 =
-        _mm_add_ps(pol5_y_2, *(reinterpret_cast<const __m128*>(C3)));
-    const __m128 pol5_y_4 = _mm_mul_ps(pol5_y_3, y);
-    const __m128 pol5_y_5 =
-        _mm_add_ps(pol5_y_4, *(reinterpret_cast<const __m128*>(C2)));
-    const __m128 pol5_y_6 = _mm_mul_ps(pol5_y_5, y);
-    const __m128 pol5_y_7 =
-        _mm_add_ps(pol5_y_6, *(reinterpret_cast<const __m128*>(C1)));
-    const __m128 pol5_y_8 = _mm_mul_ps(pol5_y_7, y);
-    const __m128 pol5_y =
-        _mm_add_ps(pol5_y_8, *(reinterpret_cast<const __m128*>(C0)));
-    const __m128 y_minus_one =
-        _mm_sub_ps(y,
-               *(reinterpret_cast<const __m128*>(zero_biased_exponent_is_one)));
-    const __m128 log2_y = _mm_mul_ps(y_minus_one, pol5_y);
-
-    // Combine parts.
-    log2_a = _mm_add_ps(n, log2_y);
-  }
-
-  // b * log2(a)
-  b_log2_a = _mm_mul_ps(b, log2_a);
-
-  // Calculate exp2(x), x = b * log2(a).
-  {
-    // To calculate 2^x, we decompose x like this:
-    //   x = n + y
-    //     n is an integer, the value of x - 0.5 rounded down, therefore
-    //     y is in the [0.5, 1.5) range
-    //
-    //   2^x = 2^n * 2^y
-    //     2^n can be evaluated by playing with float representation.
-    //     2^y in a small range can be approximated, this code uses an order two
-    //         polynomial approximation. The coefficients have been estimated
-    //         with the Remez algorithm and the resulting polynomial has a
-    //         maximum relative error of 0.17%.
-
-    // To avoid over/underflow, we reduce the range of input to ]-127, 129].
-    static const ALIGN16_BEG float max_input[4] ALIGN16_END = {129.f, 129.f,
-                                                               129.f, 129.f};
-    static const ALIGN16_BEG float min_input[4] ALIGN16_END = {
-        -126.99999f, -126.99999f, -126.99999f, -126.99999f};
-    const __m128 x_min =
-        _mm_min_ps(b_log2_a, *(reinterpret_cast<const __m128*>(max_input)));
-    const __m128 x_max =
-        _mm_max_ps(x_min, *(reinterpret_cast<const __m128*>(min_input)));
-    // Compute n.
-    static const ALIGN16_BEG float half[4] ALIGN16_END = {0.5f, 0.5f, 0.5f,
-                                                          0.5f};
-    const __m128 x_minus_half =
-        _mm_sub_ps(x_max, *(reinterpret_cast<const __m128*>(half)));
-    const __m128i x_minus_half_floor = _mm_cvtps_epi32(x_minus_half);
-    // Compute 2^n.
-    static const ALIGN16_BEG int float_exponent_bias[4] ALIGN16_END = {
-        127, 127, 127, 127};
-    static const int float_exponent_shift = 23;
-    const __m128i two_n_exponent =
-        _mm_add_epi32(x_minus_half_floor,
-                      *(reinterpret_cast<const __m128i*>(float_exponent_bias)));
-    const __m128 two_n =
-        _mm_castsi128_ps(_mm_slli_epi32(two_n_exponent, float_exponent_shift));
-    // Compute y.
-    const __m128 y = _mm_sub_ps(x_max, _mm_cvtepi32_ps(x_minus_half_floor));
-    // Approximate 2^y ~= C2 * y^2 + C1 * y + C0.
-    static const ALIGN16_BEG float C2[4] ALIGN16_END = {
-        3.3718944e-1f, 3.3718944e-1f, 3.3718944e-1f, 3.3718944e-1f};
-    static const ALIGN16_BEG float C1[4] ALIGN16_END = {
-        6.5763628e-1f, 6.5763628e-1f, 6.5763628e-1f, 6.5763628e-1f};
-    static const ALIGN16_BEG float C0[4] ALIGN16_END = {1.0017247f, 1.0017247f,
-                                                        1.0017247f, 1.0017247f};
-    const __m128 exp2_y_0 =
-        _mm_mul_ps(y, *(reinterpret_cast<const __m128*>(C2)));
-    const __m128 exp2_y_1 =
-        _mm_add_ps(exp2_y_0, *(reinterpret_cast<const __m128*>(C1)));
-    const __m128 exp2_y_2 = _mm_mul_ps(exp2_y_1, y);
-    const __m128 exp2_y =
-        _mm_add_ps(exp2_y_2, *(reinterpret_cast<const __m128*>(C0)));
-
-    // Combine parts.
-    a_exp_b = _mm_mul_ps(exp2_y, two_n);
-  }
-  return a_exp_b;
-}
-
-static void OverdriveSSE2(float overdrive_scaling,
-                          float hNlFb,
-                          float hNl[PART_LEN1]) {
-  int i;
-  const __m128 vec_hNlFb = _mm_set1_ps(hNlFb);
-  const __m128 vec_one = _mm_set1_ps(1.0f);
-  const __m128 vec_overdrive_scaling = _mm_set1_ps(overdrive_scaling);
-  // vectorized code (four at once)
-  for (i = 0; i + 3 < PART_LEN1; i += 4) {
-    // Weight subbands
-    __m128 vec_hNl = _mm_loadu_ps(&hNl[i]);
-    const __m128 vec_weightCurve = _mm_loadu_ps(&WebRtcAec_weightCurve[i]);
-    const __m128 bigger = _mm_cmpgt_ps(vec_hNl, vec_hNlFb);
-    const __m128 vec_weightCurve_hNlFb = _mm_mul_ps(vec_weightCurve, vec_hNlFb);
-    const __m128 vec_one_weightCurve = _mm_sub_ps(vec_one, vec_weightCurve);
-    const __m128 vec_one_weightCurve_hNl =
-        _mm_mul_ps(vec_one_weightCurve, vec_hNl);
-    const __m128 vec_if0 = _mm_andnot_ps(bigger, vec_hNl);
-    const __m128 vec_if1 = _mm_and_ps(
-        bigger, _mm_add_ps(vec_weightCurve_hNlFb, vec_one_weightCurve_hNl));
-    vec_hNl = _mm_or_ps(vec_if0, vec_if1);
-
-    const __m128 vec_overDriveCurve =
-        _mm_loadu_ps(&WebRtcAec_overDriveCurve[i]);
-    const __m128 vec_overDriveSm_overDriveCurve =
-        _mm_mul_ps(vec_overdrive_scaling, vec_overDriveCurve);
-    vec_hNl = mm_pow_ps(vec_hNl, vec_overDriveSm_overDriveCurve);
-    _mm_storeu_ps(&hNl[i], vec_hNl);
-  }
-  // scalar code for the remaining items.
-  for (; i < PART_LEN1; i++) {
-    // Weight subbands
-    if (hNl[i] > hNlFb) {
-      hNl[i] = WebRtcAec_weightCurve[i] * hNlFb +
-               (1 - WebRtcAec_weightCurve[i]) * hNl[i];
-    }
-    hNl[i] = powf(hNl[i], overdrive_scaling * WebRtcAec_overDriveCurve[i]);
-  }
-}
-
-static void SuppressSSE2(const float hNl[PART_LEN1], float efw[2][PART_LEN1]) {
-  int i;
-  const __m128 vec_minus_one = _mm_set1_ps(-1.0f);
-  // vectorized code (four at once)
-  for (i = 0; i + 3 < PART_LEN1; i += 4) {
-    // Suppress error signal
-    __m128 vec_hNl = _mm_loadu_ps(&hNl[i]);
-    __m128 vec_efw_re = _mm_loadu_ps(&efw[0][i]);
-    __m128 vec_efw_im = _mm_loadu_ps(&efw[1][i]);
-    vec_efw_re = _mm_mul_ps(vec_efw_re, vec_hNl);
-    vec_efw_im = _mm_mul_ps(vec_efw_im, vec_hNl);
-
-    // Ooura fft returns incorrect sign on imaginary component. It matters
-    // here because we are making an additive change with comfort noise.
-    vec_efw_im = _mm_mul_ps(vec_efw_im, vec_minus_one);
-    _mm_storeu_ps(&efw[0][i], vec_efw_re);
-    _mm_storeu_ps(&efw[1][i], vec_efw_im);
-  }
-  // scalar code for the remaining items.
-  for (; i < PART_LEN1; i++) {
-    // Suppress error signal
-    efw[0][i] *= hNl[i];
-    efw[1][i] *= hNl[i];
-
-    // Ooura fft returns incorrect sign on imaginary component. It matters
-    // here because we are making an additive change with comfort noise.
-    efw[1][i] *= -1;
-  }
-}
-
-__inline static void _mm_add_ps_4x1(__m128 sum, float* dst) {
-  // A+B C+D
-  sum = _mm_add_ps(sum, _mm_shuffle_ps(sum, sum, _MM_SHUFFLE(0, 0, 3, 2)));
-  // A+B+C+D A+B+C+D
-  sum = _mm_add_ps(sum, _mm_shuffle_ps(sum, sum, _MM_SHUFFLE(1, 1, 1, 1)));
-  _mm_store_ss(dst, sum);
-}
-
-static int PartitionDelaySSE2(
-    int num_partitions,
-    float h_fft_buf[2][kExtendedNumPartitions * PART_LEN1]) {
-  // Measures the energy in each filter partition and returns the partition with
-  // highest energy.
-  // TODO(bjornv): Spread computational cost by computing one partition per
-  // block?
-  float wfEnMax = 0;
-  int i;
-  int delay = 0;
-
-  for (i = 0; i < num_partitions; i++) {
-    int j;
-    int pos = i * PART_LEN1;
-    float wfEn = 0;
-    __m128 vec_wfEn = _mm_set1_ps(0.0f);
-    // vectorized code (four at once)
-    for (j = 0; j + 3 < PART_LEN1; j += 4) {
-      const __m128 vec_wfBuf0 = _mm_loadu_ps(&h_fft_buf[0][pos + j]);
-      const __m128 vec_wfBuf1 = _mm_loadu_ps(&h_fft_buf[1][pos + j]);
-      vec_wfEn = _mm_add_ps(vec_wfEn, _mm_mul_ps(vec_wfBuf0, vec_wfBuf0));
-      vec_wfEn = _mm_add_ps(vec_wfEn, _mm_mul_ps(vec_wfBuf1, vec_wfBuf1));
-    }
-    _mm_add_ps_4x1(vec_wfEn, &wfEn);
-
-    // scalar code for the remaining items.
-    for (; j < PART_LEN1; j++) {
-      wfEn += h_fft_buf[0][pos + j] * h_fft_buf[0][pos + j] +
-              h_fft_buf[1][pos + j] * h_fft_buf[1][pos + j];
-    }
-
-    if (wfEn > wfEnMax) {
-      wfEnMax = wfEn;
-      delay = i;
-    }
-  }
-  return delay;
-}
-
-// Updates the following smoothed  Power Spectral Densities (PSD):
-//  - sd  : near-end
-//  - se  : residual echo
-//  - sx  : far-end
-//  - sde : cross-PSD of near-end and residual echo
-//  - sxd : cross-PSD of near-end and far-end
-//
-// In addition to updating the PSDs, also the filter diverge state is determined
-// upon actions are taken.
-static void UpdateCoherenceSpectraSSE2(int mult,
-                                       bool extended_filter_enabled,
-                                       float efw[2][PART_LEN1],
-                                       float dfw[2][PART_LEN1],
-                                       float xfw[2][PART_LEN1],
-                                       CoherenceState* coherence_state,
-                                       short* filter_divergence_state,
-                                       int* extreme_filter_divergence) {
-  // Power estimate smoothing coefficients.
-  const float* ptrGCoh =
-      extended_filter_enabled
-          ? WebRtcAec_kExtendedSmoothingCoefficients[mult - 1]
-          : WebRtcAec_kNormalSmoothingCoefficients[mult - 1];
-  int i;
-  float sdSum = 0, seSum = 0;
-  const __m128 vec_15 = _mm_set1_ps(WebRtcAec_kMinFarendPSD);
-  const __m128 vec_GCoh0 = _mm_set1_ps(ptrGCoh[0]);
-  const __m128 vec_GCoh1 = _mm_set1_ps(ptrGCoh[1]);
-  __m128 vec_sdSum = _mm_set1_ps(0.0f);
-  __m128 vec_seSum = _mm_set1_ps(0.0f);
-
-  for (i = 0; i + 3 < PART_LEN1; i += 4) {
-    const __m128 vec_dfw0 = _mm_loadu_ps(&dfw[0][i]);
-    const __m128 vec_dfw1 = _mm_loadu_ps(&dfw[1][i]);
-    const __m128 vec_efw0 = _mm_loadu_ps(&efw[0][i]);
-    const __m128 vec_efw1 = _mm_loadu_ps(&efw[1][i]);
-    const __m128 vec_xfw0 = _mm_loadu_ps(&xfw[0][i]);
-    const __m128 vec_xfw1 = _mm_loadu_ps(&xfw[1][i]);
-    __m128 vec_sd =
-        _mm_mul_ps(_mm_loadu_ps(&coherence_state->sd[i]), vec_GCoh0);
-    __m128 vec_se =
-        _mm_mul_ps(_mm_loadu_ps(&coherence_state->se[i]), vec_GCoh0);
-    __m128 vec_sx =
-        _mm_mul_ps(_mm_loadu_ps(&coherence_state->sx[i]), vec_GCoh0);
-    __m128 vec_dfw_sumsq = _mm_mul_ps(vec_dfw0, vec_dfw0);
-    __m128 vec_efw_sumsq = _mm_mul_ps(vec_efw0, vec_efw0);
-    __m128 vec_xfw_sumsq = _mm_mul_ps(vec_xfw0, vec_xfw0);
-    vec_dfw_sumsq = _mm_add_ps(vec_dfw_sumsq, _mm_mul_ps(vec_dfw1, vec_dfw1));
-    vec_efw_sumsq = _mm_add_ps(vec_efw_sumsq, _mm_mul_ps(vec_efw1, vec_efw1));
-    vec_xfw_sumsq = _mm_add_ps(vec_xfw_sumsq, _mm_mul_ps(vec_xfw1, vec_xfw1));
-    vec_xfw_sumsq = _mm_max_ps(vec_xfw_sumsq, vec_15);
-    vec_sd = _mm_add_ps(vec_sd, _mm_mul_ps(vec_dfw_sumsq, vec_GCoh1));
-    vec_se = _mm_add_ps(vec_se, _mm_mul_ps(vec_efw_sumsq, vec_GCoh1));
-    vec_sx = _mm_add_ps(vec_sx, _mm_mul_ps(vec_xfw_sumsq, vec_GCoh1));
-    _mm_storeu_ps(&coherence_state->sd[i], vec_sd);
-    _mm_storeu_ps(&coherence_state->se[i], vec_se);
-    _mm_storeu_ps(&coherence_state->sx[i], vec_sx);
-
-    {
-      const __m128 vec_3210 = _mm_loadu_ps(&coherence_state->sde[i][0]);
-      const __m128 vec_7654 = _mm_loadu_ps(&coherence_state->sde[i + 2][0]);
-      __m128 vec_a =
-          _mm_shuffle_ps(vec_3210, vec_7654, _MM_SHUFFLE(2, 0, 2, 0));
-      __m128 vec_b =
-          _mm_shuffle_ps(vec_3210, vec_7654, _MM_SHUFFLE(3, 1, 3, 1));
-      __m128 vec_dfwefw0011 = _mm_mul_ps(vec_dfw0, vec_efw0);
-      __m128 vec_dfwefw0110 = _mm_mul_ps(vec_dfw0, vec_efw1);
-      vec_a = _mm_mul_ps(vec_a, vec_GCoh0);
-      vec_b = _mm_mul_ps(vec_b, vec_GCoh0);
-      vec_dfwefw0011 =
-          _mm_add_ps(vec_dfwefw0011, _mm_mul_ps(vec_dfw1, vec_efw1));
-      vec_dfwefw0110 =
-          _mm_sub_ps(vec_dfwefw0110, _mm_mul_ps(vec_dfw1, vec_efw0));
-      vec_a = _mm_add_ps(vec_a, _mm_mul_ps(vec_dfwefw0011, vec_GCoh1));
-      vec_b = _mm_add_ps(vec_b, _mm_mul_ps(vec_dfwefw0110, vec_GCoh1));
-      _mm_storeu_ps(&coherence_state->sde[i][0], _mm_unpacklo_ps(vec_a, vec_b));
-      _mm_storeu_ps(&coherence_state->sde[i + 2][0],
-                    _mm_unpackhi_ps(vec_a, vec_b));
-    }
-
-    {
-      const __m128 vec_3210 = _mm_loadu_ps(&coherence_state->sxd[i][0]);
-      const __m128 vec_7654 = _mm_loadu_ps(&coherence_state->sxd[i + 2][0]);
-      __m128 vec_a =
-          _mm_shuffle_ps(vec_3210, vec_7654, _MM_SHUFFLE(2, 0, 2, 0));
-      __m128 vec_b =
-          _mm_shuffle_ps(vec_3210, vec_7654, _MM_SHUFFLE(3, 1, 3, 1));
-      __m128 vec_dfwxfw0011 = _mm_mul_ps(vec_dfw0, vec_xfw0);
-      __m128 vec_dfwxfw0110 = _mm_mul_ps(vec_dfw0, vec_xfw1);
-      vec_a = _mm_mul_ps(vec_a, vec_GCoh0);
-      vec_b = _mm_mul_ps(vec_b, vec_GCoh0);
-      vec_dfwxfw0011 =
-          _mm_add_ps(vec_dfwxfw0011, _mm_mul_ps(vec_dfw1, vec_xfw1));
-      vec_dfwxfw0110 =
-          _mm_sub_ps(vec_dfwxfw0110, _mm_mul_ps(vec_dfw1, vec_xfw0));
-      vec_a = _mm_add_ps(vec_a, _mm_mul_ps(vec_dfwxfw0011, vec_GCoh1));
-      vec_b = _mm_add_ps(vec_b, _mm_mul_ps(vec_dfwxfw0110, vec_GCoh1));
-      _mm_storeu_ps(&coherence_state->sxd[i][0], _mm_unpacklo_ps(vec_a, vec_b));
-      _mm_storeu_ps(&coherence_state->sxd[i + 2][0],
-                    _mm_unpackhi_ps(vec_a, vec_b));
-    }
-
-    vec_sdSum = _mm_add_ps(vec_sdSum, vec_sd);
-    vec_seSum = _mm_add_ps(vec_seSum, vec_se);
-  }
-
-  _mm_add_ps_4x1(vec_sdSum, &sdSum);
-  _mm_add_ps_4x1(vec_seSum, &seSum);
-
-  for (; i < PART_LEN1; i++) {
-    coherence_state->sd[i] =
-        ptrGCoh[0] * coherence_state->sd[i] +
-        ptrGCoh[1] * (dfw[0][i] * dfw[0][i] + dfw[1][i] * dfw[1][i]);
-    coherence_state->se[i] =
-        ptrGCoh[0] * coherence_state->se[i] +
-        ptrGCoh[1] * (efw[0][i] * efw[0][i] + efw[1][i] * efw[1][i]);
-    // We threshold here to protect against the ill-effects of a zero farend.
-    // The threshold is not arbitrarily chosen, but balances protection and
-    // adverse interaction with the algorithm's tuning.
-    // TODO(bjornv): investigate further why this is so sensitive.
-    coherence_state->sx[i] =
-        ptrGCoh[0] * coherence_state->sx[i] +
-        ptrGCoh[1] *
-            WEBRTC_SPL_MAX(xfw[0][i] * xfw[0][i] + xfw[1][i] * xfw[1][i],
-                           WebRtcAec_kMinFarendPSD);
-
-    coherence_state->sde[i][0] =
-        ptrGCoh[0] * coherence_state->sde[i][0] +
-        ptrGCoh[1] * (dfw[0][i] * efw[0][i] + dfw[1][i] * efw[1][i]);
-    coherence_state->sde[i][1] =
-        ptrGCoh[0] * coherence_state->sde[i][1] +
-        ptrGCoh[1] * (dfw[0][i] * efw[1][i] - dfw[1][i] * efw[0][i]);
-
-    coherence_state->sxd[i][0] =
-        ptrGCoh[0] * coherence_state->sxd[i][0] +
-        ptrGCoh[1] * (dfw[0][i] * xfw[0][i] + dfw[1][i] * xfw[1][i]);
-    coherence_state->sxd[i][1] =
-        ptrGCoh[0] * coherence_state->sxd[i][1] +
-        ptrGCoh[1] * (dfw[0][i] * xfw[1][i] - dfw[1][i] * xfw[0][i]);
-
-    sdSum += coherence_state->sd[i];
-    seSum += coherence_state->se[i];
-  }
-
-  // Divergent filter safeguard update.
-  *filter_divergence_state =
-      (*filter_divergence_state ? 1.05f : 1.0f) * seSum > sdSum;
-
-  // Signal extreme filter divergence if the error is significantly larger
-  // than the nearend (13 dB).
-  *extreme_filter_divergence = (seSum > (19.95f * sdSum));
-}
-
-// Window time domain data to be used by the fft.
-static void WindowDataSSE2(float* x_windowed, const float* x) {
-  int i;
-  for (i = 0; i < PART_LEN; i += 4) {
-    const __m128 vec_Buf1 = _mm_loadu_ps(&x[i]);
-    const __m128 vec_Buf2 = _mm_loadu_ps(&x[PART_LEN + i]);
-    const __m128 vec_sqrtHanning = _mm_load_ps(&WebRtcAec_sqrtHanning[i]);
-    // A B C D
-    __m128 vec_sqrtHanning_rev =
-        _mm_loadu_ps(&WebRtcAec_sqrtHanning[PART_LEN - i - 3]);
-    // D C B A
-    vec_sqrtHanning_rev = _mm_shuffle_ps(
-        vec_sqrtHanning_rev, vec_sqrtHanning_rev, _MM_SHUFFLE(0, 1, 2, 3));
-    _mm_storeu_ps(&x_windowed[i], _mm_mul_ps(vec_Buf1, vec_sqrtHanning));
-    _mm_storeu_ps(&x_windowed[PART_LEN + i],
-                  _mm_mul_ps(vec_Buf2, vec_sqrtHanning_rev));
-  }
-}
-
-// Puts fft output data into a complex valued array.
-static void StoreAsComplexSSE2(const float* data,
-                               float data_complex[2][PART_LEN1]) {
-  int i;
-  for (i = 0; i < PART_LEN; i += 4) {
-    const __m128 vec_fft0 = _mm_loadu_ps(&data[2 * i]);
-    const __m128 vec_fft4 = _mm_loadu_ps(&data[2 * i + 4]);
-    const __m128 vec_a =
-        _mm_shuffle_ps(vec_fft0, vec_fft4, _MM_SHUFFLE(2, 0, 2, 0));
-    const __m128 vec_b =
-        _mm_shuffle_ps(vec_fft0, vec_fft4, _MM_SHUFFLE(3, 1, 3, 1));
-    _mm_storeu_ps(&data_complex[0][i], vec_a);
-    _mm_storeu_ps(&data_complex[1][i], vec_b);
-  }
-  // fix beginning/end values
-  data_complex[1][0] = 0;
-  data_complex[1][PART_LEN] = 0;
-  data_complex[0][0] = data[0];
-  data_complex[0][PART_LEN] = data[1];
-}
-
-static void ComputeCoherenceSSE2(const CoherenceState* coherence_state,
-                                 float* cohde,
-                                 float* cohxd) {
-  int i;
-
-  {
-    const __m128 vec_1eminus10 = _mm_set1_ps(1e-10f);
-
-    // Subband coherence
-    for (i = 0; i + 3 < PART_LEN1; i += 4) {
-      const __m128 vec_sd = _mm_loadu_ps(&coherence_state->sd[i]);
-      const __m128 vec_se = _mm_loadu_ps(&coherence_state->se[i]);
-      const __m128 vec_sx = _mm_loadu_ps(&coherence_state->sx[i]);
-      const __m128 vec_sdse =
-          _mm_add_ps(vec_1eminus10, _mm_mul_ps(vec_sd, vec_se));
-      const __m128 vec_sdsx =
-          _mm_add_ps(vec_1eminus10, _mm_mul_ps(vec_sd, vec_sx));
-      const __m128 vec_sde_3210 = _mm_loadu_ps(&coherence_state->sde[i][0]);
-      const __m128 vec_sde_7654 = _mm_loadu_ps(&coherence_state->sde[i + 2][0]);
-      const __m128 vec_sxd_3210 = _mm_loadu_ps(&coherence_state->sxd[i][0]);
-      const __m128 vec_sxd_7654 = _mm_loadu_ps(&coherence_state->sxd[i + 2][0]);
-      const __m128 vec_sde_0 =
-          _mm_shuffle_ps(vec_sde_3210, vec_sde_7654, _MM_SHUFFLE(2, 0, 2, 0));
-      const __m128 vec_sde_1 =
-          _mm_shuffle_ps(vec_sde_3210, vec_sde_7654, _MM_SHUFFLE(3, 1, 3, 1));
-      const __m128 vec_sxd_0 =
-          _mm_shuffle_ps(vec_sxd_3210, vec_sxd_7654, _MM_SHUFFLE(2, 0, 2, 0));
-      const __m128 vec_sxd_1 =
-          _mm_shuffle_ps(vec_sxd_3210, vec_sxd_7654, _MM_SHUFFLE(3, 1, 3, 1));
-      __m128 vec_cohde = _mm_mul_ps(vec_sde_0, vec_sde_0);
-      __m128 vec_cohxd = _mm_mul_ps(vec_sxd_0, vec_sxd_0);
-      vec_cohde = _mm_add_ps(vec_cohde, _mm_mul_ps(vec_sde_1, vec_sde_1));
-      vec_cohde = _mm_div_ps(vec_cohde, vec_sdse);
-      vec_cohxd = _mm_add_ps(vec_cohxd, _mm_mul_ps(vec_sxd_1, vec_sxd_1));
-      vec_cohxd = _mm_div_ps(vec_cohxd, vec_sdsx);
-      _mm_storeu_ps(&cohde[i], vec_cohde);
-      _mm_storeu_ps(&cohxd[i], vec_cohxd);
-    }
-
-    // scalar code for the remaining items.
-    for (; i < PART_LEN1; i++) {
-      cohde[i] = (coherence_state->sde[i][0] * coherence_state->sde[i][0] +
-                  coherence_state->sde[i][1] * coherence_state->sde[i][1]) /
-                 (coherence_state->sd[i] * coherence_state->se[i] + 1e-10f);
-      cohxd[i] = (coherence_state->sxd[i][0] * coherence_state->sxd[i][0] +
-                  coherence_state->sxd[i][1] * coherence_state->sxd[i][1]) /
-                 (coherence_state->sx[i] * coherence_state->sd[i] + 1e-10f);
-    }
-  }
-}
-
-void WebRtcAec_InitAec_SSE2(void) {
-  WebRtcAec_FilterFar = FilterFarSSE2;
-  WebRtcAec_ScaleErrorSignal = ScaleErrorSignalSSE2;
-  WebRtcAec_FilterAdaptation = FilterAdaptationSSE2;
-  WebRtcAec_Overdrive = OverdriveSSE2;
-  WebRtcAec_Suppress = SuppressSSE2;
-  WebRtcAec_ComputeCoherence = ComputeCoherenceSSE2;
-  WebRtcAec_UpdateCoherenceSpectra = UpdateCoherenceSpectraSSE2;
-  WebRtcAec_StoreAsComplex = StoreAsComplexSSE2;
-  WebRtcAec_PartitionDelay = PartitionDelaySSE2;
-  WebRtcAec_WindowData = WindowDataSSE2;
-}
-}  // namespace webrtc
diff --git a/modules/audio_processing/aec/aec_resampler.cc b/modules/audio_processing/aec/aec_resampler.cc
deleted file mode 100644
index ff2960b..0000000
--- a/modules/audio_processing/aec/aec_resampler.cc
+++ /dev/null
@@ -1,207 +0,0 @@
-/*
- *  Copyright (c) 2012 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.
- */
-
-/* Resamples a signal to an arbitrary rate. Used by the AEC to compensate for
- * clock skew by resampling the farend signal.
- */
-
-#include "webrtc/modules/audio_processing/aec/aec_resampler.h"
-
-#include <math.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "webrtc/modules/audio_processing/aec/aec_core.h"
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-
-enum { kEstimateLengthFrames = 400 };
-
-typedef struct {
-  float buffer[kResamplerBufferSize];
-  float position;
-
-  int deviceSampleRateHz;
-  int skewData[kEstimateLengthFrames];
-  int skewDataIndex;
-  float skewEstimate;
-} AecResampler;
-
-static int EstimateSkew(const int* rawSkew,
-                        int size,
-                        int deviceSampleRateHz,
-                        float* skewEst);
-
-void* WebRtcAec_CreateResampler() {
-  return malloc(sizeof(AecResampler));
-}
-
-int WebRtcAec_InitResampler(void* resampInst, int deviceSampleRateHz) {
-  AecResampler* obj = static_cast<AecResampler*>(resampInst);
-  memset(obj->buffer, 0, sizeof(obj->buffer));
-  obj->position = 0.0;
-
-  obj->deviceSampleRateHz = deviceSampleRateHz;
-  memset(obj->skewData, 0, sizeof(obj->skewData));
-  obj->skewDataIndex = 0;
-  obj->skewEstimate = 0.0;
-
-  return 0;
-}
-
-void WebRtcAec_FreeResampler(void* resampInst) {
-  AecResampler* obj = static_cast<AecResampler*>(resampInst);
-  free(obj);
-}
-
-void WebRtcAec_ResampleLinear(void* resampInst,
-                              const float* inspeech,
-                              size_t size,
-                              float skew,
-                              float* outspeech,
-                              size_t* size_out) {
-  AecResampler* obj = static_cast<AecResampler*>(resampInst);
-
-  float* y;
-  float be, tnew;
-  size_t tn, mm;
-
-  RTC_DCHECK_LE(size, 2 * FRAME_LEN);
-  RTC_DCHECK(resampInst);
-  RTC_DCHECK(inspeech);
-  RTC_DCHECK(outspeech);
-  RTC_DCHECK(size_out);
-
-  // Add new frame data in lookahead
-  memcpy(&obj->buffer[FRAME_LEN + kResamplingDelay], inspeech,
-         size * sizeof(inspeech[0]));
-
-  // Sample rate ratio
-  be = 1 + skew;
-
-  // Loop over input frame
-  mm = 0;
-  y = &obj->buffer[FRAME_LEN];  // Point at current frame
-
-  tnew = be * mm + obj->position;
-  tn = (size_t)tnew;
-
-  while (tn < size) {
-    // Interpolation
-    outspeech[mm] = y[tn] + (tnew - tn) * (y[tn + 1] - y[tn]);
-    mm++;
-
-    tnew = be * mm + obj->position;
-    tn = static_cast<int>(tnew);
-  }
-
-  *size_out = mm;
-  obj->position += (*size_out) * be - size;
-
-  // Shift buffer
-  memmove(obj->buffer, &obj->buffer[size],
-          (kResamplerBufferSize - size) * sizeof(obj->buffer[0]));
-}
-
-int WebRtcAec_GetSkew(void* resampInst, int rawSkew, float* skewEst) {
-  AecResampler* obj = static_cast<AecResampler*>(resampInst);
-  int err = 0;
-
-  if (obj->skewDataIndex < kEstimateLengthFrames) {
-    obj->skewData[obj->skewDataIndex] = rawSkew;
-    obj->skewDataIndex++;
-  } else if (obj->skewDataIndex == kEstimateLengthFrames) {
-    err = EstimateSkew(obj->skewData, kEstimateLengthFrames,
-                       obj->deviceSampleRateHz, skewEst);
-    obj->skewEstimate = *skewEst;
-    obj->skewDataIndex++;
-  } else {
-    *skewEst = obj->skewEstimate;
-  }
-
-  return err;
-}
-
-int EstimateSkew(const int* rawSkew,
-                 int size,
-                 int deviceSampleRateHz,
-                 float* skewEst) {
-  const int absLimitOuter = static_cast<int>(0.04f * deviceSampleRateHz);
-  const int absLimitInner = static_cast<int>(0.0025f * deviceSampleRateHz);
-  int i = 0;
-  int n = 0;
-  float rawAvg = 0;
-  float err = 0;
-  float rawAbsDev = 0;
-  int upperLimit = 0;
-  int lowerLimit = 0;
-  float cumSum = 0;
-  float x = 0;
-  float x2 = 0;
-  float y = 0;
-  float xy = 0;
-  float xAvg = 0;
-  float denom = 0;
-  float skew = 0;
-
-  *skewEst = 0;  // Set in case of error below.
-  for (i = 0; i < size; i++) {
-    if ((rawSkew[i] < absLimitOuter && rawSkew[i] > -absLimitOuter)) {
-      n++;
-      rawAvg += rawSkew[i];
-    }
-  }
-
-  if (n == 0) {
-    return -1;
-  }
-  RTC_DCHECK_GT(n, 0);
-  rawAvg /= n;
-
-  for (i = 0; i < size; i++) {
-    if ((rawSkew[i] < absLimitOuter && rawSkew[i] > -absLimitOuter)) {
-      err = rawSkew[i] - rawAvg;
-      rawAbsDev += err >= 0 ? err : -err;
-    }
-  }
-  RTC_DCHECK_GT(n, 0);
-  rawAbsDev /= n;
-  upperLimit = static_cast<int>(rawAvg + 5 * rawAbsDev + 1);  // +1 for ceiling.
-  lowerLimit = static_cast<int>(rawAvg - 5 * rawAbsDev - 1);  // -1 for floor.
-
-  n = 0;
-  for (i = 0; i < size; i++) {
-    if ((rawSkew[i] < absLimitInner && rawSkew[i] > -absLimitInner) ||
-        (rawSkew[i] < upperLimit && rawSkew[i] > lowerLimit)) {
-      n++;
-      cumSum += rawSkew[i];
-      x += n;
-      x2 += n * n;
-      y += cumSum;
-      xy += n * cumSum;
-    }
-  }
-
-  if (n == 0) {
-    return -1;
-  }
-  RTC_DCHECK_GT(n, 0);
-  xAvg = x / n;
-  denom = x2 - xAvg * x;
-
-  if (denom != 0) {
-    skew = (xy - xAvg * y) / denom;
-  }
-
-  *skewEst = skew;
-  return 0;
-}
-}  // namespace webrtc
diff --git a/modules/audio_processing/aec/aec_resampler.h b/modules/audio_processing/aec/aec_resampler.h
deleted file mode 100644
index 3a7400b..0000000
--- a/modules/audio_processing/aec/aec_resampler.h
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- *  Copyright (c) 2012 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_PROCESSING_AEC_AEC_RESAMPLER_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_AEC_AEC_RESAMPLER_H_
-
-#include "webrtc/modules/audio_processing/aec/aec_core.h"
-
-namespace webrtc {
-
-enum { kResamplingDelay = 1 };
-enum { kResamplerBufferSize = FRAME_LEN * 4 };
-
-// Unless otherwise specified, functions return 0 on success and -1 on error.
-void* WebRtcAec_CreateResampler();  // Returns NULL on error.
-int WebRtcAec_InitResampler(void* resampInst, int deviceSampleRateHz);
-void WebRtcAec_FreeResampler(void* resampInst);
-
-// Estimates skew from raw measurement.
-int WebRtcAec_GetSkew(void* resampInst, int rawSkew, float* skewEst);
-
-// Resamples input using linear interpolation.
-void WebRtcAec_ResampleLinear(void* resampInst,
-                              const float* inspeech,
-                              size_t size,
-                              float skew,
-                              float* outspeech,
-                              size_t* size_out);
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_AEC_AEC_RESAMPLER_H_
diff --git a/modules/audio_processing/aec/echo_cancellation.cc b/modules/audio_processing/aec/echo_cancellation.cc
deleted file mode 100644
index 9e9e707..0000000
--- a/modules/audio_processing/aec/echo_cancellation.cc
+++ /dev/null
@@ -1,868 +0,0 @@
-/*
- *  Copyright (c) 2012 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.
- */
-
-/*
- * Contains the API functions for the AEC.
- */
-#include "webrtc/modules/audio_processing/aec/echo_cancellation.h"
-
-#include <math.h>
-#include <stdlib.h>
-#include <string.h>
-
-extern "C" {
-#include "webrtc/common_audio/ring_buffer.h"
-#include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
-}
-#include "webrtc/modules/audio_processing/aec/aec_core.h"
-#include "webrtc/modules/audio_processing/aec/aec_resampler.h"
-#include "webrtc/modules/audio_processing/logging/apm_data_dumper.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-Aec::Aec() = default;
-Aec::~Aec() = default;
-
-// Measured delays [ms]
-// Device                Chrome  GTP
-// MacBook Air           10
-// MacBook Retina        10      100
-// MacPro                30?
-//
-// Win7 Desktop          70      80?
-// Win7 T430s            110
-// Win8 T420s            70
-//
-// Daisy                 50
-// Pixel (w/ preproc?)           240
-// Pixel (w/o preproc?)  110     110
-
-// The extended filter mode gives us the flexibility to ignore the system's
-// reported delays. We do this for platforms which we believe provide results
-// which are incompatible with the AEC's expectations. Based on measurements
-// (some provided above) we set a conservative (i.e. lower than measured)
-// fixed delay.
-//
-// WEBRTC_UNTRUSTED_DELAY will only have an impact when |extended_filter_mode|
-// is enabled. See the note along with |DelayCorrection| in
-// echo_cancellation_impl.h for more details on the mode.
-//
-// Justification:
-// Chromium/Mac: Here, the true latency is so low (~10-20 ms), that it plays
-// havoc with the AEC's buffering. To avoid this, we set a fixed delay of 20 ms
-// and then compensate by rewinding by 10 ms (in wideband) through
-// kDelayDiffOffsetSamples. This trick does not seem to work for larger rewind
-// values, but fortunately this is sufficient.
-//
-// Chromium/Linux(ChromeOS): The values we get on this platform don't correspond
-// well to reality. The variance doesn't match the AEC's buffer changes, and the
-// bulk values tend to be too low. However, the range across different hardware
-// appears to be too large to choose a single value.
-//
-// GTP/Linux(ChromeOS): TBD, but for the moment we will trust the values.
-#if defined(WEBRTC_CHROMIUM_BUILD) && defined(WEBRTC_MAC)
-#define WEBRTC_UNTRUSTED_DELAY
-#endif
-
-#if defined(WEBRTC_UNTRUSTED_DELAY) && defined(WEBRTC_MAC)
-static const int kDelayDiffOffsetSamples = -160;
-#else
-// Not enabled for now.
-static const int kDelayDiffOffsetSamples = 0;
-#endif
-
-#if defined(WEBRTC_MAC)
-static const int kFixedDelayMs = 20;
-#else
-static const int kFixedDelayMs = 50;
-#endif
-#if !defined(WEBRTC_UNTRUSTED_DELAY)
-static const int kMinTrustedDelayMs = 20;
-#endif
-static const int kMaxTrustedDelayMs = 500;
-
-// Maximum length of resampled signal. Must be an integer multiple of frames
-// (ceil(1/(1 + MIN_SKEW)*2) + 1)*FRAME_LEN
-// The factor of 2 handles wb, and the + 1 is as a safety margin
-// TODO(bjornv): Replace with kResamplerBufferSize
-#define MAX_RESAMP_LEN (5 * FRAME_LEN)
-
-static const int kMaxBufSizeStart = 62;  // In partitions
-static const int sampMsNb = 8;           // samples per ms in nb
-static const int initCheck = 42;
-
-int Aec::instance_count = 0;
-
-// Estimates delay to set the position of the far-end buffer read pointer
-// (controlled by knownDelay)
-static void EstBufDelayNormal(Aec* aecInst);
-static void EstBufDelayExtended(Aec* aecInst);
-static int ProcessNormal(Aec* aecInst,
-                         const float* const* nearend,
-                         size_t num_bands,
-                         float* const* out,
-                         size_t num_samples,
-                         int16_t reported_delay_ms,
-                         int32_t skew);
-static void ProcessExtended(Aec* aecInst,
-                            const float* const* nearend,
-                            size_t num_bands,
-                            float* const* out,
-                            size_t num_samples,
-                            int16_t reported_delay_ms,
-                            int32_t skew);
-
-void* WebRtcAec_Create() {
-  Aec* aecpc = new Aec();
-
-  if (!aecpc) {
-    return NULL;
-  }
-  aecpc->data_dumper.reset(new ApmDataDumper(aecpc->instance_count));
-
-  aecpc->aec = WebRtcAec_CreateAec(aecpc->instance_count);
-  if (!aecpc->aec) {
-    WebRtcAec_Free(aecpc);
-    return NULL;
-  }
-  aecpc->resampler = WebRtcAec_CreateResampler();
-  if (!aecpc->resampler) {
-    WebRtcAec_Free(aecpc);
-    return NULL;
-  }
-  // Create far-end pre-buffer. The buffer size has to be large enough for
-  // largest possible drift compensation (kResamplerBufferSize) + "almost" an
-  // FFT buffer (PART_LEN2 - 1).
-  aecpc->far_pre_buf =
-      WebRtc_CreateBuffer(PART_LEN2 + kResamplerBufferSize, sizeof(float));
-  if (!aecpc->far_pre_buf) {
-    WebRtcAec_Free(aecpc);
-    return NULL;
-  }
-
-  aecpc->initFlag = 0;
-
-  aecpc->instance_count++;
-  return aecpc;
-}
-
-void WebRtcAec_Free(void* aecInst) {
-  Aec* aecpc = reinterpret_cast<Aec*>(aecInst);
-
-  if (aecpc == NULL) {
-    return;
-  }
-
-  WebRtc_FreeBuffer(aecpc->far_pre_buf);
-
-  WebRtcAec_FreeAec(aecpc->aec);
-  WebRtcAec_FreeResampler(aecpc->resampler);
-  delete aecpc;
-}
-
-int32_t WebRtcAec_Init(void* aecInst, int32_t sampFreq, int32_t scSampFreq) {
-  Aec* aecpc = reinterpret_cast<Aec*>(aecInst);
-  aecpc->data_dumper->InitiateNewSetOfRecordings();
-  AecConfig aecConfig;
-
-  if (sampFreq != 8000 && sampFreq != 16000 && sampFreq != 32000 &&
-      sampFreq != 48000) {
-    return AEC_BAD_PARAMETER_ERROR;
-  }
-  aecpc->sampFreq = sampFreq;
-
-  if (scSampFreq < 1 || scSampFreq > 96000) {
-    return AEC_BAD_PARAMETER_ERROR;
-  }
-  aecpc->scSampFreq = scSampFreq;
-
-  // Initialize echo canceller core
-  if (WebRtcAec_InitAec(aecpc->aec, aecpc->sampFreq) == -1) {
-    return AEC_UNSPECIFIED_ERROR;
-  }
-
-  if (WebRtcAec_InitResampler(aecpc->resampler, aecpc->scSampFreq) == -1) {
-    return AEC_UNSPECIFIED_ERROR;
-  }
-
-  WebRtc_InitBuffer(aecpc->far_pre_buf);
-  WebRtc_MoveReadPtr(aecpc->far_pre_buf, -PART_LEN);  // Start overlap.
-
-  aecpc->initFlag = initCheck;  // indicates that initialization has been done
-
-  if (aecpc->sampFreq == 32000 || aecpc->sampFreq == 48000) {
-    aecpc->splitSampFreq = 16000;
-  } else {
-    aecpc->splitSampFreq = sampFreq;
-  }
-
-  aecpc->delayCtr = 0;
-  aecpc->sampFactor = (aecpc->scSampFreq * 1.0f) / aecpc->splitSampFreq;
-  // Sampling frequency multiplier (SWB is processed as 160 frame size).
-  aecpc->rate_factor = aecpc->splitSampFreq / 8000;
-
-  aecpc->sum = 0;
-  aecpc->counter = 0;
-  aecpc->checkBuffSize = 1;
-  aecpc->firstVal = 0;
-
-  // We skip the startup_phase completely (setting to 0) if DA-AEC is enabled,
-  // but not extended_filter mode.
-  aecpc->startup_phase = WebRtcAec_extended_filter_enabled(aecpc->aec) ||
-                         !WebRtcAec_delay_agnostic_enabled(aecpc->aec);
-  aecpc->bufSizeStart = 0;
-  aecpc->checkBufSizeCtr = 0;
-  aecpc->msInSndCardBuf = 0;
-  aecpc->filtDelay = -1;  // -1 indicates an initialized state.
-  aecpc->timeForDelayChange = 0;
-  aecpc->knownDelay = 0;
-  aecpc->lastDelayDiff = 0;
-
-  aecpc->skewFrCtr = 0;
-  aecpc->resample = kAecFalse;
-  aecpc->highSkewCtr = 0;
-  aecpc->skew = 0;
-
-  aecpc->farend_started = 0;
-
-  // Default settings.
-  aecConfig.nlpMode = kAecNlpModerate;
-  aecConfig.skewMode = kAecFalse;
-  aecConfig.metricsMode = kAecFalse;
-  aecConfig.delay_logging = kAecFalse;
-
-  if (WebRtcAec_set_config(aecpc, aecConfig) == -1) {
-    return AEC_UNSPECIFIED_ERROR;
-  }
-
-  return 0;
-}
-
-// Returns any error that is caused when buffering the
-// far-end signal.
-int32_t WebRtcAec_GetBufferFarendError(void* aecInst,
-                                       const float* farend,
-                                       size_t nrOfSamples) {
-  Aec* aecpc = reinterpret_cast<Aec*>(aecInst);
-
-  if (!farend)
-    return AEC_NULL_POINTER_ERROR;
-
-  if (aecpc->initFlag != initCheck)
-    return AEC_UNINITIALIZED_ERROR;
-
-  // number of samples == 160 for SWB input
-  if (nrOfSamples != 80 && nrOfSamples != 160)
-    return AEC_BAD_PARAMETER_ERROR;
-
-  return 0;
-}
-
-// only buffer L band for farend
-int32_t WebRtcAec_BufferFarend(void* aecInst,
-                               const float* farend,
-                               size_t nrOfSamples) {
-  Aec* aecpc = reinterpret_cast<Aec*>(aecInst);
-  size_t newNrOfSamples = nrOfSamples;
-  float new_farend[MAX_RESAMP_LEN];
-  const float* farend_ptr = farend;
-
-  // Get any error caused by buffering the farend signal.
-  int32_t error_code =
-      WebRtcAec_GetBufferFarendError(aecInst, farend, nrOfSamples);
-
-  if (error_code != 0)
-    return error_code;
-
-  if (aecpc->skewMode == kAecTrue && aecpc->resample == kAecTrue) {
-    // Resample and get a new number of samples
-    WebRtcAec_ResampleLinear(aecpc->resampler, farend, nrOfSamples, aecpc->skew,
-                             new_farend, &newNrOfSamples);
-    farend_ptr = new_farend;
-  }
-
-  aecpc->farend_started = 1;
-  WebRtcAec_SetSystemDelay(aecpc->aec, WebRtcAec_system_delay(aecpc->aec) +
-                           static_cast<int>(newNrOfSamples));
-
-  // Write the time-domain data to |far_pre_buf|.
-  WebRtc_WriteBuffer(aecpc->far_pre_buf, farend_ptr, newNrOfSamples);
-
-  // TODO(minyue): reduce to |PART_LEN| samples for each buffering.
-  while (WebRtc_available_read(aecpc->far_pre_buf) >= PART_LEN2) {
-    // We have enough data to pass to the FFT, hence read PART_LEN2 samples.
-    {
-      float* ptmp = NULL;
-      float tmp[PART_LEN2];
-      WebRtc_ReadBuffer(aecpc->far_pre_buf,
-                        reinterpret_cast<void**>(&ptmp), tmp, PART_LEN2);
-      WebRtcAec_BufferFarendBlock(aecpc->aec, &ptmp[PART_LEN]);
-    }
-
-    // Rewind |far_pre_buf| PART_LEN samples for overlap before continuing.
-    WebRtc_MoveReadPtr(aecpc->far_pre_buf, -PART_LEN);
-  }
-
-  return 0;
-}
-
-int32_t WebRtcAec_Process(void* aecInst,
-                          const float* const* nearend,
-                          size_t num_bands,
-                          float* const* out,
-                          size_t nrOfSamples,
-                          int16_t msInSndCardBuf,
-                          int32_t skew) {
-  Aec* aecpc = reinterpret_cast<Aec*>(aecInst);
-  int32_t retVal = 0;
-
-  if (out == NULL) {
-    return AEC_NULL_POINTER_ERROR;
-  }
-
-  if (aecpc->initFlag != initCheck) {
-    return AEC_UNINITIALIZED_ERROR;
-  }
-
-  // number of samples == 160 for SWB input
-  if (nrOfSamples != 80 && nrOfSamples != 160) {
-    return AEC_BAD_PARAMETER_ERROR;
-  }
-
-  if (msInSndCardBuf < 0) {
-    msInSndCardBuf = 0;
-    retVal = AEC_BAD_PARAMETER_WARNING;
-  } else if (msInSndCardBuf > kMaxTrustedDelayMs) {
-    // The clamping is now done in ProcessExtended/Normal().
-    retVal = AEC_BAD_PARAMETER_WARNING;
-  }
-
-  // This returns the value of aec->extended_filter_enabled.
-  if (WebRtcAec_extended_filter_enabled(aecpc->aec)) {
-    ProcessExtended(aecpc, nearend, num_bands, out, nrOfSamples, msInSndCardBuf,
-                    skew);
-  } else {
-    retVal = ProcessNormal(aecpc, nearend, num_bands, out, nrOfSamples,
-                           msInSndCardBuf, skew);
-  }
-
-  int far_buf_size_samples = WebRtcAec_system_delay(aecpc->aec);
-  aecpc->data_dumper->DumpRaw("aec_system_delay", 1, &far_buf_size_samples);
-  aecpc->data_dumper->DumpRaw("aec_known_delay", 1, &aecpc->knownDelay);
-
-  return retVal;
-}
-
-int WebRtcAec_set_config(void* handle, AecConfig config) {
-  Aec* self = reinterpret_cast<Aec*>(handle);
-  if (self->initFlag != initCheck) {
-    return AEC_UNINITIALIZED_ERROR;
-  }
-
-  if (config.skewMode != kAecFalse && config.skewMode != kAecTrue) {
-    return AEC_BAD_PARAMETER_ERROR;
-  }
-  self->skewMode = config.skewMode;
-
-  if (config.nlpMode != kAecNlpConservative &&
-      config.nlpMode != kAecNlpModerate &&
-      config.nlpMode != kAecNlpAggressive) {
-    return AEC_BAD_PARAMETER_ERROR;
-  }
-
-  if (config.metricsMode != kAecFalse && config.metricsMode != kAecTrue) {
-    return AEC_BAD_PARAMETER_ERROR;
-  }
-
-  if (config.delay_logging != kAecFalse && config.delay_logging != kAecTrue) {
-    return AEC_BAD_PARAMETER_ERROR;
-  }
-
-  WebRtcAec_SetConfigCore(self->aec, config.nlpMode, config.metricsMode,
-                          config.delay_logging);
-  return 0;
-}
-
-int WebRtcAec_get_echo_status(void* handle, int* status) {
-  Aec* self = reinterpret_cast<Aec*>(handle);
-  if (status == NULL) {
-    return AEC_NULL_POINTER_ERROR;
-  }
-  if (self->initFlag != initCheck) {
-    return AEC_UNINITIALIZED_ERROR;
-  }
-
-  *status = WebRtcAec_echo_state(self->aec);
-
-  return 0;
-}
-
-int WebRtcAec_GetMetrics(void* handle, AecMetrics* metrics) {
-  const float kUpWeight = 0.7f;
-  float dtmp;
-  int stmp;
-  Aec* self = reinterpret_cast<Aec*>(handle);
-  Stats erl;
-  Stats erle;
-  Stats a_nlp;
-
-  if (handle == NULL) {
-    return -1;
-  }
-  if (metrics == NULL) {
-    return AEC_NULL_POINTER_ERROR;
-  }
-  if (self->initFlag != initCheck) {
-    return AEC_UNINITIALIZED_ERROR;
-  }
-
-  WebRtcAec_GetEchoStats(self->aec, &erl, &erle, &a_nlp,
-                         &metrics->divergent_filter_fraction);
-
-  // ERL
-  metrics->erl.instant = static_cast<int>(erl.instant);
-
-  if ((erl.himean > kOffsetLevel) && (erl.average > kOffsetLevel)) {
-    // Use a mix between regular average and upper part average.
-    dtmp = kUpWeight * erl.himean + (1 - kUpWeight) * erl.average;
-    metrics->erl.average = static_cast<int>(dtmp);
-  } else {
-    metrics->erl.average = kOffsetLevel;
-  }
-
-  metrics->erl.max = static_cast<int>(erl.max);
-
-  if (erl.min < (kOffsetLevel * (-1))) {
-    metrics->erl.min = static_cast<int>(erl.min);
-  } else {
-    metrics->erl.min = kOffsetLevel;
-  }
-
-  // ERLE
-  metrics->erle.instant = static_cast<int>(erle.instant);
-
-  if ((erle.himean > kOffsetLevel) && (erle.average > kOffsetLevel)) {
-    // Use a mix between regular average and upper part average.
-    dtmp = kUpWeight * erle.himean + (1 - kUpWeight) * erle.average;
-    metrics->erle.average = static_cast<int>(dtmp);
-  } else {
-    metrics->erle.average = kOffsetLevel;
-  }
-
-  metrics->erle.max = static_cast<int>(erle.max);
-
-  if (erle.min < (kOffsetLevel * (-1))) {
-    metrics->erle.min = static_cast<int>(erle.min);
-  } else {
-    metrics->erle.min = kOffsetLevel;
-  }
-
-  // RERL
-  if ((metrics->erl.average > kOffsetLevel) &&
-      (metrics->erle.average > kOffsetLevel)) {
-    stmp = metrics->erl.average + metrics->erle.average;
-  } else {
-    stmp = kOffsetLevel;
-  }
-  metrics->rerl.average = stmp;
-
-  // No other statistics needed, but returned for completeness.
-  metrics->rerl.instant = stmp;
-  metrics->rerl.max = stmp;
-  metrics->rerl.min = stmp;
-
-  // A_NLP
-  metrics->aNlp.instant = static_cast<int>(a_nlp.instant);
-
-  if ((a_nlp.himean > kOffsetLevel) && (a_nlp.average > kOffsetLevel)) {
-    // Use a mix between regular average and upper part average.
-    dtmp = kUpWeight * a_nlp.himean + (1 - kUpWeight) * a_nlp.average;
-    metrics->aNlp.average = static_cast<int>(dtmp);
-  } else {
-    metrics->aNlp.average = kOffsetLevel;
-  }
-
-  metrics->aNlp.max = static_cast<int>(a_nlp.max);
-
-  if (a_nlp.min < (kOffsetLevel * (-1))) {
-    metrics->aNlp.min = static_cast<int>(a_nlp.min);
-  } else {
-    metrics->aNlp.min = kOffsetLevel;
-  }
-
-  return 0;
-}
-
-int WebRtcAec_GetDelayMetrics(void* handle,
-                              int* median,
-                              int* std,
-                              float* fraction_poor_delays) {
-  Aec* self = reinterpret_cast<Aec*>(handle);
-  if (median == NULL) {
-    return AEC_NULL_POINTER_ERROR;
-  }
-  if (std == NULL) {
-    return AEC_NULL_POINTER_ERROR;
-  }
-  if (self->initFlag != initCheck) {
-    return AEC_UNINITIALIZED_ERROR;
-  }
-  if (WebRtcAec_GetDelayMetricsCore(self->aec, median, std,
-                                    fraction_poor_delays) == -1) {
-    // Logging disabled.
-    return AEC_UNSUPPORTED_FUNCTION_ERROR;
-  }
-
-  return 0;
-}
-
-AecCore* WebRtcAec_aec_core(void* handle) {
-  if (!handle) {
-    return NULL;
-  }
-  return reinterpret_cast<Aec*>(handle)->aec;
-}
-
-static int ProcessNormal(Aec* aecInst,
-                         const float* const* nearend,
-                         size_t num_bands,
-                         float* const* out,
-                         size_t num_samples,
-                         int16_t reported_delay_ms,
-                         int32_t skew) {
-  int retVal = 0;
-  size_t i;
-  size_t nBlocks10ms;
-  // Limit resampling to doubling/halving of signal
-  const float minSkewEst = -0.5f;
-  const float maxSkewEst = 1.0f;
-
-  reported_delay_ms =
-      reported_delay_ms > kMaxTrustedDelayMs ? kMaxTrustedDelayMs :
-      reported_delay_ms;
-  // TODO(andrew): we need to investigate if this +10 is really wanted.
-  reported_delay_ms += 10;
-  aecInst->msInSndCardBuf = reported_delay_ms;
-
-  if (aecInst->skewMode == kAecTrue) {
-    if (aecInst->skewFrCtr < 25) {
-      aecInst->skewFrCtr++;
-    } else {
-      retVal = WebRtcAec_GetSkew(aecInst->resampler, skew, &aecInst->skew);
-      if (retVal == -1) {
-        aecInst->skew = 0;
-        retVal = AEC_BAD_PARAMETER_WARNING;
-      }
-
-      aecInst->skew /= aecInst->sampFactor * num_samples;
-
-      if (aecInst->skew < 1.0e-3 && aecInst->skew > -1.0e-3) {
-        aecInst->resample = kAecFalse;
-      } else {
-        aecInst->resample = kAecTrue;
-      }
-
-      if (aecInst->skew < minSkewEst) {
-        aecInst->skew = minSkewEst;
-      } else if (aecInst->skew > maxSkewEst) {
-        aecInst->skew = maxSkewEst;
-      }
-
-      aecInst->data_dumper->DumpRaw("aec_skew", 1, &aecInst->skew);
-    }
-  }
-
-  nBlocks10ms = num_samples / (FRAME_LEN * aecInst->rate_factor);
-
-  if (aecInst->startup_phase) {
-    for (i = 0; i < num_bands; ++i) {
-      // Only needed if they don't already point to the same place.
-      if (nearend[i] != out[i]) {
-        memcpy(out[i], nearend[i], sizeof(nearend[i][0]) * num_samples);
-      }
-    }
-
-    // The AEC is in the start up mode
-    // AEC is disabled until the system delay is OK
-
-    // Mechanism to ensure that the system delay is reasonably stable.
-    if (aecInst->checkBuffSize) {
-      aecInst->checkBufSizeCtr++;
-      // Before we fill up the far-end buffer we require the system delay
-      // to be stable (+/-8 ms) compared to the first value. This
-      // comparison is made during the following 6 consecutive 10 ms
-      // blocks. If it seems to be stable then we start to fill up the
-      // far-end buffer.
-      if (aecInst->counter == 0) {
-        aecInst->firstVal = aecInst->msInSndCardBuf;
-        aecInst->sum = 0;
-      }
-
-      if (abs(aecInst->firstVal - aecInst->msInSndCardBuf) <
-          WEBRTC_SPL_MAX(0.2 * aecInst->msInSndCardBuf, sampMsNb)) {
-        aecInst->sum += aecInst->msInSndCardBuf;
-        aecInst->counter++;
-      } else {
-        aecInst->counter = 0;
-      }
-
-      if (aecInst->counter * nBlocks10ms >= 6) {
-        // The far-end buffer size is determined in partitions of
-        // PART_LEN samples. Use 75% of the average value of the system
-        // delay as buffer size to start with.
-        aecInst->bufSizeStart =
-            WEBRTC_SPL_MIN((3 * aecInst->sum * aecInst->rate_factor * 8) /
-                               (4 * aecInst->counter * PART_LEN),
-                           kMaxBufSizeStart);
-        // Buffer size has now been determined.
-        aecInst->checkBuffSize = 0;
-      }
-
-      if (aecInst->checkBufSizeCtr * nBlocks10ms > 50) {
-        // For really bad systems, don't disable the echo canceller for
-        // more than 0.5 sec.
-        aecInst->bufSizeStart = WEBRTC_SPL_MIN(
-            (aecInst->msInSndCardBuf * aecInst->rate_factor * 3) / 40,
-            kMaxBufSizeStart);
-        aecInst->checkBuffSize = 0;
-      }
-    }
-
-    // If |checkBuffSize| changed in the if-statement above.
-    if (!aecInst->checkBuffSize) {
-      // The system delay is now reasonably stable (or has been unstable
-      // for too long). When the far-end buffer is filled with
-      // approximately the same amount of data as reported by the system
-      // we end the startup phase.
-      int overhead_elements =
-          WebRtcAec_system_delay(aecInst->aec) / PART_LEN -
-          aecInst->bufSizeStart;
-      if (overhead_elements == 0) {
-        // Enable the AEC
-        aecInst->startup_phase = 0;
-      } else if (overhead_elements > 0) {
-        // TODO(bjornv): Do we need a check on how much we actually
-        // moved the read pointer? It should always be possible to move
-        // the pointer |overhead_elements| since we have only added data
-        // to the buffer and no delay compensation nor AEC processing
-        // has been done.
-        WebRtcAec_AdjustFarendBufferSizeAndSystemDelay(aecInst->aec,
-                                                       overhead_elements);
-
-        // Enable the AEC
-        aecInst->startup_phase = 0;
-      }
-    }
-  } else {
-    // AEC is enabled.
-    EstBufDelayNormal(aecInst);
-
-    // Call the AEC.
-    // TODO(bjornv): Re-structure such that we don't have to pass
-    // |aecInst->knownDelay| as input. Change name to something like
-    // |system_buffer_diff|.
-    WebRtcAec_ProcessFrames(aecInst->aec, nearend, num_bands, num_samples,
-                            aecInst->knownDelay, out);
-  }
-
-  return retVal;
-}
-
-static void ProcessExtended(Aec* self,
-                            const float* const* near,
-                            size_t num_bands,
-                            float* const* out,
-                            size_t num_samples,
-                            int16_t reported_delay_ms,
-                            int32_t skew) {
-  size_t i;
-  const int delay_diff_offset = kDelayDiffOffsetSamples;
-  RTC_DCHECK(num_samples == 80 || num_samples == 160);
-#if defined(WEBRTC_UNTRUSTED_DELAY)
-  reported_delay_ms = kFixedDelayMs;
-#else
-  // This is the usual mode where we trust the reported system delay values.
-  // Due to the longer filter, we no longer add 10 ms to the reported delay
-  // to reduce chance of non-causality. Instead we apply a minimum here to avoid
-  // issues with the read pointer jumping around needlessly.
-  reported_delay_ms = reported_delay_ms < kMinTrustedDelayMs
-                          ? kMinTrustedDelayMs
-                          : reported_delay_ms;
-  // If the reported delay appears to be bogus, we attempt to recover by using
-  // the measured fixed delay values. We use >= here because higher layers
-  // may already clamp to this maximum value, and we would otherwise not
-  // detect it here.
-  reported_delay_ms = reported_delay_ms >= kMaxTrustedDelayMs
-                          ? kFixedDelayMs
-                          : reported_delay_ms;
-#endif
-  self->msInSndCardBuf = reported_delay_ms;
-
-  if (!self->farend_started) {
-    for (i = 0; i < num_bands; ++i) {
-      // Only needed if they don't already point to the same place.
-      if (near[i] != out[i]) {
-        memcpy(out[i], near[i], sizeof(near[i][0]) * num_samples);
-      }
-    }
-    return;
-  }
-  if (self->startup_phase) {
-    // In the extended mode, there isn't a startup "phase", just a special
-    // action on the first frame. In the trusted delay case, we'll take the
-    // current reported delay, unless it's less then our conservative
-    // measurement.
-    int startup_size_ms =
-        reported_delay_ms < kFixedDelayMs ? kFixedDelayMs : reported_delay_ms;
-#if defined(WEBRTC_ANDROID)
-    int target_delay = startup_size_ms * self->rate_factor * 8;
-#else
-    // To avoid putting the AEC in a non-causal state we're being slightly
-    // conservative and scale by 2. On Android we use a fixed delay and
-    // therefore there is no need to scale the target_delay.
-    int target_delay = startup_size_ms * self->rate_factor * 8 / 2;
-#endif
-    int overhead_elements =
-        (WebRtcAec_system_delay(self->aec) - target_delay) / PART_LEN;
-    WebRtcAec_AdjustFarendBufferSizeAndSystemDelay(self->aec,
-                                                   overhead_elements);
-    self->startup_phase = 0;
-  }
-
-  EstBufDelayExtended(self);
-
-  {
-    // |delay_diff_offset| gives us the option to manually rewind the delay on
-    // very low delay platforms which can't be expressed purely through
-    // |reported_delay_ms|.
-    const int adjusted_known_delay =
-        WEBRTC_SPL_MAX(0, self->knownDelay + delay_diff_offset);
-
-    WebRtcAec_ProcessFrames(self->aec, near, num_bands, num_samples,
-                            adjusted_known_delay, out);
-  }
-}
-
-static void EstBufDelayNormal(Aec* aecInst) {
-  int nSampSndCard = aecInst->msInSndCardBuf * sampMsNb * aecInst->rate_factor;
-  int current_delay = nSampSndCard - WebRtcAec_system_delay(aecInst->aec);
-  int delay_difference = 0;
-
-  // Before we proceed with the delay estimate filtering we:
-  // 1) Compensate for the frame that will be read.
-  // 2) Compensate for drift resampling.
-  // 3) Compensate for non-causality if needed, since the estimated delay can't
-  //    be negative.
-
-  // 1) Compensating for the frame(s) that will be read/processed.
-  current_delay += FRAME_LEN * aecInst->rate_factor;
-
-  // 2) Account for resampling frame delay.
-  if (aecInst->skewMode == kAecTrue && aecInst->resample == kAecTrue) {
-    current_delay -= kResamplingDelay;
-  }
-
-  // 3) Compensate for non-causality, if needed, by flushing one block.
-  if (current_delay < PART_LEN) {
-    current_delay +=
-        WebRtcAec_AdjustFarendBufferSizeAndSystemDelay(aecInst->aec, 1) *
-        PART_LEN;
-  }
-
-  // We use -1 to signal an initialized state in the "extended" implementation;
-  // compensate for that.
-  aecInst->filtDelay = aecInst->filtDelay < 0 ? 0 : aecInst->filtDelay;
-  aecInst->filtDelay =
-      WEBRTC_SPL_MAX(0, static_cast<int16_t>(0.8 *
-                                             aecInst->filtDelay +
-                                             0.2 * current_delay));
-
-  delay_difference = aecInst->filtDelay - aecInst->knownDelay;
-  if (delay_difference > 224) {
-    if (aecInst->lastDelayDiff < 96) {
-      aecInst->timeForDelayChange = 0;
-    } else {
-      aecInst->timeForDelayChange++;
-    }
-  } else if (delay_difference < 96 && aecInst->knownDelay > 0) {
-    if (aecInst->lastDelayDiff > 224) {
-      aecInst->timeForDelayChange = 0;
-    } else {
-      aecInst->timeForDelayChange++;
-    }
-  } else {
-    aecInst->timeForDelayChange = 0;
-  }
-  aecInst->lastDelayDiff = delay_difference;
-
-  if (aecInst->timeForDelayChange > 25) {
-    aecInst->knownDelay = WEBRTC_SPL_MAX((int)aecInst->filtDelay - 160, 0);
-  }
-}
-
-static void EstBufDelayExtended(Aec* aecInst) {
-  int reported_delay = aecInst->msInSndCardBuf * sampMsNb *
-      aecInst->rate_factor;
-  int current_delay = reported_delay - WebRtcAec_system_delay(aecInst->aec);
-  int delay_difference = 0;
-
-  // Before we proceed with the delay estimate filtering we:
-  // 1) Compensate for the frame that will be read.
-  // 2) Compensate for drift resampling.
-  // 3) Compensate for non-causality if needed, since the estimated delay can't
-  //    be negative.
-
-  // 1) Compensating for the frame(s) that will be read/processed.
-  current_delay += FRAME_LEN * aecInst->rate_factor;
-
-  // 2) Account for resampling frame delay.
-  if (aecInst->skewMode == kAecTrue && aecInst->resample == kAecTrue) {
-    current_delay -= kResamplingDelay;
-  }
-
-  // 3) Compensate for non-causality, if needed, by flushing two blocks.
-  if (current_delay < PART_LEN) {
-    current_delay +=
-        WebRtcAec_AdjustFarendBufferSizeAndSystemDelay(aecInst->aec, 2) *
-        PART_LEN;
-  }
-
-  if (aecInst->filtDelay == -1) {
-    aecInst->filtDelay = WEBRTC_SPL_MAX(0, 0.5 * current_delay);
-  } else {
-    aecInst->filtDelay = WEBRTC_SPL_MAX(
-        0, static_cast<int16_t>(0.95 * aecInst->filtDelay + 0.05 *
-                                current_delay));
-  }
-
-  delay_difference = aecInst->filtDelay - aecInst->knownDelay;
-  if (delay_difference > 384) {
-    if (aecInst->lastDelayDiff < 128) {
-      aecInst->timeForDelayChange = 0;
-    } else {
-      aecInst->timeForDelayChange++;
-    }
-  } else if (delay_difference < 128 && aecInst->knownDelay > 0) {
-    if (aecInst->lastDelayDiff > 384) {
-      aecInst->timeForDelayChange = 0;
-    } else {
-      aecInst->timeForDelayChange++;
-    }
-  } else {
-    aecInst->timeForDelayChange = 0;
-  }
-  aecInst->lastDelayDiff = delay_difference;
-
-  if (aecInst->timeForDelayChange > 25) {
-    aecInst->knownDelay = WEBRTC_SPL_MAX((int)aecInst->filtDelay - 256, 0);
-  }
-}
-}  // namespace webrtc
diff --git a/modules/audio_processing/aec/echo_cancellation.h b/modules/audio_processing/aec/echo_cancellation.h
deleted file mode 100644
index 1047113..0000000
--- a/modules/audio_processing/aec/echo_cancellation.h
+++ /dev/null
@@ -1,299 +0,0 @@
-/*
- *  Copyright (c) 2012 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_PROCESSING_AEC_ECHO_CANCELLATION_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_AEC_ECHO_CANCELLATION_H_
-
-#include <memory>
-
-#include <stddef.h>
-
-extern "C" {
-#include "webrtc/common_audio/ring_buffer.h"
-}
-#include "webrtc/modules/audio_processing/aec/aec_core.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-// Errors
-#define AEC_UNSPECIFIED_ERROR 12000
-#define AEC_UNSUPPORTED_FUNCTION_ERROR 12001
-#define AEC_UNINITIALIZED_ERROR 12002
-#define AEC_NULL_POINTER_ERROR 12003
-#define AEC_BAD_PARAMETER_ERROR 12004
-
-// Warnings
-#define AEC_BAD_PARAMETER_WARNING 12050
-
-enum { kAecNlpConservative = 0, kAecNlpModerate, kAecNlpAggressive };
-
-enum { kAecFalse = 0, kAecTrue };
-
-typedef struct {
-  int16_t nlpMode;      // default kAecNlpModerate
-  int16_t skewMode;     // default kAecFalse
-  int16_t metricsMode;  // default kAecFalse
-  int delay_logging;    // default kAecFalse
-  // float realSkew;
-} AecConfig;
-
-typedef struct {
-  int instant;
-  int average;
-  int max;
-  int min;
-} AecLevel;
-
-typedef struct {
-  AecLevel rerl;
-  AecLevel erl;
-  AecLevel erle;
-  AecLevel aNlp;
-  float divergent_filter_fraction;
-} AecMetrics;
-
-struct AecCore;
-
-class ApmDataDumper;
-
-typedef struct Aec {
-  Aec();
-  ~Aec();
-
-  std::unique_ptr<ApmDataDumper> data_dumper;
-
-  int delayCtr;
-  int sampFreq;
-  int splitSampFreq;
-  int scSampFreq;
-  float sampFactor;  // scSampRate / sampFreq
-  short skewMode;
-  int bufSizeStart;
-  int knownDelay;
-  int rate_factor;
-
-  short initFlag;  // indicates if AEC has been initialized
-
-  // Variables used for averaging far end buffer size
-  short counter;
-  int sum;
-  short firstVal;
-  short checkBufSizeCtr;
-
-  // Variables used for delay shifts
-  short msInSndCardBuf;
-  short filtDelay;  // Filtered delay estimate.
-  int timeForDelayChange;
-  int startup_phase;
-  int checkBuffSize;
-  short lastDelayDiff;
-
-  // Structures
-  void* resampler;
-
-  int skewFrCtr;
-  int resample;  // if the skew is small enough we don't resample
-  int highSkewCtr;
-  float skew;
-
-  RingBuffer* far_pre_buf;  // Time domain far-end pre-buffer.
-
-  int farend_started;
-
-  // Aec instance counter.
-  static int instance_count;
-  AecCore* aec;
-} Aec;
-
-/*
- * Allocates the memory needed by the AEC. The memory needs to be initialized
- * separately using the WebRtcAec_Init() function. Returns a pointer to the
- * object or NULL on error.
- */
-void* WebRtcAec_Create();
-
-/*
- * This function releases the memory allocated by WebRtcAec_Create().
- *
- * Inputs                       Description
- * -------------------------------------------------------------------
- * void*        aecInst         Pointer to the AEC instance
- */
-void WebRtcAec_Free(void* aecInst);
-
-/*
- * Initializes an AEC instance.
- *
- * Inputs                       Description
- * -------------------------------------------------------------------
- * void*          aecInst       Pointer to the AEC instance
- * int32_t        sampFreq      Sampling frequency of data
- * int32_t        scSampFreq    Soundcard sampling frequency
- *
- * Outputs                      Description
- * -------------------------------------------------------------------
- * int32_t        return        0: OK
- *                             -1: error
- */
-int32_t WebRtcAec_Init(void* aecInst, int32_t sampFreq, int32_t scSampFreq);
-
-/*
- * Inserts an 80 or 160 sample block of data into the farend buffer.
- *
- * Inputs                       Description
- * -------------------------------------------------------------------
- * void*          aecInst       Pointer to the AEC instance
- * const float*   farend        In buffer containing one frame of
- *                              farend signal for L band
- * int16_t        nrOfSamples   Number of samples in farend buffer
- *
- * Outputs                      Description
- * -------------------------------------------------------------------
- * int32_t        return        0: OK
- *                              12000-12050: error code
- */
-int32_t WebRtcAec_BufferFarend(void* aecInst,
-                               const float* farend,
-                               size_t nrOfSamples);
-
-/*
- * Reports any errors that would arise if buffering a farend buffer
- *
- * Inputs                       Description
- * -------------------------------------------------------------------
- * void*          aecInst       Pointer to the AEC instance
- * const float*   farend        In buffer containing one frame of
- *                              farend signal for L band
- * int16_t        nrOfSamples   Number of samples in farend buffer
- *
- * Outputs                      Description
- * -------------------------------------------------------------------
- * int32_t        return        0: OK
- *                              12000-12050: error code
- */
-int32_t WebRtcAec_GetBufferFarendError(void* aecInst,
-                                       const float* farend,
-                                       size_t nrOfSamples);
-
-/*
- * Runs the echo canceller on an 80 or 160 sample blocks of data.
- *
- * Inputs                       Description
- * -------------------------------------------------------------------
- * void*         aecInst        Pointer to the AEC instance
- * float* const* nearend        In buffer containing one frame of
- *                              nearend+echo signal for each band
- * int           num_bands      Number of bands in nearend buffer
- * int16_t       nrOfSamples    Number of samples in nearend buffer
- * int16_t       msInSndCardBuf Delay estimate for sound card and
- *                              system buffers
- * int16_t       skew           Difference between number of samples played
- *                              and recorded at the soundcard (for clock skew
- *                              compensation)
- *
- * Outputs                      Description
- * -------------------------------------------------------------------
- * float* const* out            Out buffer, one frame of processed nearend
- *                              for each band
- * int32_t       return         0: OK
- *                              12000-12050: error code
- */
-int32_t WebRtcAec_Process(void* aecInst,
-                          const float* const* nearend,
-                          size_t num_bands,
-                          float* const* out,
-                          size_t nrOfSamples,
-                          int16_t msInSndCardBuf,
-                          int32_t skew);
-
-/*
- * This function enables the user to set certain parameters on-the-fly.
- *
- * Inputs                       Description
- * -------------------------------------------------------------------
- * void*          handle        Pointer to the AEC instance
- * AecConfig      config        Config instance that contains all
- *                              properties to be set
- *
- * Outputs                      Description
- * -------------------------------------------------------------------
- * int            return        0: OK
- *                              12000-12050: error code
- */
-int WebRtcAec_set_config(void* handle, AecConfig config);
-
-/*
- * Gets the current echo status of the nearend signal.
- *
- * Inputs                       Description
- * -------------------------------------------------------------------
- * void*          handle        Pointer to the AEC instance
- *
- * Outputs                      Description
- * -------------------------------------------------------------------
- * int*           status        0: Almost certainly nearend single-talk
- *                              1: Might not be neared single-talk
- * int            return        0: OK
- *                              12000-12050: error code
- */
-int WebRtcAec_get_echo_status(void* handle, int* status);
-
-/*
- * Gets the current echo metrics for the session.
- *
- * Inputs                       Description
- * -------------------------------------------------------------------
- * void*          handle        Pointer to the AEC instance
- *
- * Outputs                      Description
- * -------------------------------------------------------------------
- * AecMetrics*    metrics       Struct which will be filled out with the
- *                              current echo metrics.
- * int            return        0: OK
- *                              12000-12050: error code
- */
-int WebRtcAec_GetMetrics(void* handle, AecMetrics* metrics);
-
-/*
- * Gets the current delay metrics for the session.
- *
- * Inputs                       Description
- * -------------------------------------------------------------------
- * void*   handle               Pointer to the AEC instance
- *
- * Outputs                      Description
- * -------------------------------------------------------------------
- * int*    median               Delay median value.
- * int*    std                  Delay standard deviation.
- * float*  fraction_poor_delays Fraction of the delay estimates that may
- *                              cause the AEC to perform poorly.
- *
- * int            return        0: OK
- *                              12000-12050: error code
- */
-int WebRtcAec_GetDelayMetrics(void* handle,
-                              int* median,
-                              int* std,
-                              float* fraction_poor_delays);
-
-// Returns a pointer to the low level AEC handle.
-//
-// Input:
-//  - handle                    : Pointer to the AEC instance.
-//
-// Return value:
-//  - AecCore pointer           : NULL for error.
-//
-struct AecCore* WebRtcAec_aec_core(void* handle);
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_AEC_ECHO_CANCELLATION_H_
diff --git a/modules/audio_processing/aec/echo_cancellation_unittest.cc b/modules/audio_processing/aec/echo_cancellation_unittest.cc
deleted file mode 100644
index 647e90c..0000000
--- a/modules/audio_processing/aec/echo_cancellation_unittest.cc
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- *  Copyright (c) 2013 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.
- */
-
-// TODO(bjornv): Make this a comprehensive test.
-
-#include "webrtc/modules/audio_processing/aec/echo_cancellation.h"
-
-#include <stdlib.h>
-#include <time.h>
-
-#include "webrtc/modules/audio_processing/aec/aec_core.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-TEST(EchoCancellationTest, CreateAndFreeHasExpectedBehavior) {
-  void* handle = WebRtcAec_Create();
-  ASSERT_TRUE(handle);
-  WebRtcAec_Free(nullptr);
-  WebRtcAec_Free(handle);
-}
-
-TEST(EchoCancellationTest, ApplyAecCoreHandle) {
-  void* handle = WebRtcAec_Create();
-  ASSERT_TRUE(handle);
-  EXPECT_TRUE(WebRtcAec_aec_core(NULL) == NULL);
-  AecCore* aec_core = WebRtcAec_aec_core(handle);
-  EXPECT_TRUE(aec_core != NULL);
-  // A simple test to verify that we can set and get a value from the lower
-  // level |aec_core| handle.
-  int delay = 111;
-  WebRtcAec_SetSystemDelay(aec_core, delay);
-  EXPECT_EQ(delay, WebRtcAec_system_delay(aec_core));
-  WebRtcAec_Free(handle);
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/aec/system_delay_unittest.cc b/modules/audio_processing/aec/system_delay_unittest.cc
deleted file mode 100644
index 141d608..0000000
--- a/modules/audio_processing/aec/system_delay_unittest.cc
+++ /dev/null
@@ -1,599 +0,0 @@
-/*
- *  Copyright (c) 2012 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_processing/aec/aec_core.h"
-#include "webrtc/modules/audio_processing/aec/echo_cancellation.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/typedefs.h"
-namespace webrtc {
-namespace {
-
-class SystemDelayTest : public ::testing::Test {
- protected:
-  SystemDelayTest();
-  virtual void SetUp();
-  virtual void TearDown();
-
-  // Initialization of AEC handle with respect to |sample_rate_hz|. Since the
-  // device sample rate is unimportant we set that value to 48000 Hz.
-  void Init(int sample_rate_hz);
-
-  // Makes one render call and one capture call in that specific order.
-  void RenderAndCapture(int device_buffer_ms);
-
-  // Fills up the far-end buffer with respect to the default device buffer size.
-  size_t BufferFillUp();
-
-  // Runs and verifies the behavior in a stable startup procedure.
-  void RunStableStartup();
-
-  // Maps buffer size in ms into samples, taking the unprocessed frame into
-  // account.
-  int MapBufferSizeToSamples(int size_in_ms, bool extended_filter);
-
-  void* handle_;
-  Aec* self_;
-  size_t samples_per_frame_;
-  // Dummy input/output speech data.
-  static const int kSamplesPerChunk = 160;
-  float far_[kSamplesPerChunk];
-  float near_[kSamplesPerChunk];
-  float out_[kSamplesPerChunk];
-  const float* near_ptr_;
-  float* out_ptr_;
-};
-
-SystemDelayTest::SystemDelayTest()
-    : handle_(NULL), self_(NULL), samples_per_frame_(0) {
-  // Dummy input data are set with more or less arbitrary non-zero values.
-  for (int i = 0; i < kSamplesPerChunk; i++) {
-    far_[i] = 257.0;
-    near_[i] = 514.0;
-  }
-  memset(out_, 0, sizeof(out_));
-  near_ptr_ = near_;
-  out_ptr_ = out_;
-}
-
-void SystemDelayTest::SetUp() {
-  handle_ = WebRtcAec_Create();
-  ASSERT_TRUE(handle_);
-  self_ = reinterpret_cast<Aec*>(handle_);
-}
-
-void SystemDelayTest::TearDown() {
-  // Free AEC
-  WebRtcAec_Free(handle_);
-  handle_ = NULL;
-}
-
-// In SWB mode nothing is added to the buffer handling with respect to
-// functionality compared to WB. We therefore only verify behavior in NB and WB.
-static const int kSampleRateHz[] = {8000, 16000};
-static const size_t kNumSampleRates =
-    sizeof(kSampleRateHz) / sizeof(*kSampleRateHz);
-
-// Default audio device buffer size used.
-static const int kDeviceBufMs = 100;
-
-// Requirement for a stable device convergence time in ms. Should converge in
-// less than |kStableConvergenceMs|.
-static const int kStableConvergenceMs = 100;
-
-// Maximum convergence time in ms. This means that we should leave the startup
-// phase after |kMaxConvergenceMs| independent of device buffer stability
-// conditions.
-static const int kMaxConvergenceMs = 500;
-
-void SystemDelayTest::Init(int sample_rate_hz) {
-  // Initialize AEC
-  EXPECT_EQ(0, WebRtcAec_Init(handle_, sample_rate_hz, 48000));
-  EXPECT_EQ(0, WebRtcAec_system_delay(self_->aec));
-
-  // One frame equals 10 ms of data.
-  samples_per_frame_ = static_cast<size_t>(sample_rate_hz / 100);
-}
-
-void SystemDelayTest::RenderAndCapture(int device_buffer_ms) {
-  EXPECT_EQ(0, WebRtcAec_BufferFarend(handle_, far_, samples_per_frame_));
-  EXPECT_EQ(0,
-            WebRtcAec_Process(handle_,
-                              &near_ptr_,
-                              1,
-                              &out_ptr_,
-                              samples_per_frame_,
-                              device_buffer_ms,
-                              0));
-}
-
-size_t SystemDelayTest::BufferFillUp() {
-  // To make sure we have a full buffer when we verify stability we first fill
-  // up the far-end buffer with the same amount as we will report in through
-  // Process().
-  size_t buffer_size = 0;
-  for (int i = 0; i < kDeviceBufMs / 10; i++) {
-    EXPECT_EQ(0, WebRtcAec_BufferFarend(handle_, far_, samples_per_frame_));
-    buffer_size += samples_per_frame_;
-    EXPECT_EQ(static_cast<int>(buffer_size),
-              WebRtcAec_system_delay(self_->aec));
-  }
-  return buffer_size;
-}
-
-void SystemDelayTest::RunStableStartup() {
-  // To make sure we have a full buffer when we verify stability we first fill
-  // up the far-end buffer with the same amount as we will report in through
-  // Process().
-  size_t buffer_size = BufferFillUp();
-
-  if (WebRtcAec_delay_agnostic_enabled(self_->aec) == 1) {
-    // In extended_filter mode we set the buffer size after the first processed
-    // 10 ms chunk. Hence, we don't need to wait for the reported system delay
-    // values to become stable.
-    RenderAndCapture(kDeviceBufMs);
-    buffer_size += samples_per_frame_;
-    EXPECT_EQ(0, self_->startup_phase);
-  } else {
-    // A stable device should be accepted and put in a regular process mode
-    // within |kStableConvergenceMs|.
-    int process_time_ms = 0;
-    for (; process_time_ms < kStableConvergenceMs; process_time_ms += 10) {
-      RenderAndCapture(kDeviceBufMs);
-      buffer_size += samples_per_frame_;
-      if (self_->startup_phase == 0) {
-        // We have left the startup phase.
-        break;
-      }
-    }
-    // Verify convergence time.
-    EXPECT_GT(kStableConvergenceMs, process_time_ms);
-  }
-  // Verify that the buffer has been flushed.
-  EXPECT_GE(static_cast<int>(buffer_size),
-            WebRtcAec_system_delay(self_->aec));
-}
-
-  int SystemDelayTest::MapBufferSizeToSamples(int size_in_ms,
-                                              bool extended_filter) {
-  // If extended_filter is disabled we add an extra 10 ms for the unprocessed
-  // frame. That is simply how the algorithm is constructed.
-  return static_cast<int>(
-      (size_in_ms + (extended_filter ? 0 : 10)) * samples_per_frame_ / 10);
-}
-
-// The tests should meet basic requirements and not be adjusted to what is
-// actually implemented. If we don't get good code coverage this way we either
-// lack in tests or have unnecessary code.
-// General requirements:
-// 1) If we add far-end data the system delay should be increased with the same
-//    amount we add.
-// 2) If the far-end buffer is full we should flush the oldest data to make room
-//    for the new. In this case the system delay is unaffected.
-// 3) There should exist a startup phase in which the buffer size is to be
-//    determined. In this phase no cancellation should be performed.
-// 4) Under stable conditions (small variations in device buffer sizes) the AEC
-//    should determine an appropriate local buffer size within
-//    |kStableConvergenceMs| ms.
-// 5) Under unstable conditions the AEC should make a decision within
-//    |kMaxConvergenceMs| ms.
-// 6) If the local buffer runs out of data we should stuff the buffer with older
-//    frames.
-// 7) The system delay should within |kMaxConvergenceMs| ms heal from
-//    disturbances like drift, data glitches, toggling events and outliers.
-// 8) The system delay should never become negative.
-
-TEST_F(SystemDelayTest, CorrectIncreaseWhenBufferFarend) {
-  // When we add data to the AEC buffer the internal system delay should be
-  // incremented with the same amount as the size of data.
-  // This process should be independent of DA-AEC and extended_filter mode.
-  for (int extended_filter = 0; extended_filter <= 1; ++extended_filter) {
-    WebRtcAec_enable_extended_filter(self_->aec, extended_filter);
-    EXPECT_EQ(extended_filter, WebRtcAec_extended_filter_enabled(self_->aec));
-    for (int da_aec = 0; da_aec <= 1; ++da_aec) {
-      WebRtcAec_enable_delay_agnostic(self_->aec, da_aec);
-      EXPECT_EQ(da_aec, WebRtcAec_delay_agnostic_enabled(self_->aec));
-      for (size_t i = 0; i < kNumSampleRates; i++) {
-        Init(kSampleRateHz[i]);
-        // Loop through a couple of calls to make sure the system delay
-        // increments correctly.
-        for (int j = 1; j <= 5; j++) {
-          EXPECT_EQ(0,
-                    WebRtcAec_BufferFarend(handle_, far_, samples_per_frame_));
-          EXPECT_EQ(static_cast<int>(j * samples_per_frame_),
-                    WebRtcAec_system_delay(self_->aec));
-        }
-      }
-    }
-  }
-}
-
-// TODO(bjornv): Add a test to verify behavior if the far-end buffer is full
-// when adding new data.
-
-TEST_F(SystemDelayTest, CorrectDelayAfterStableStartup) {
-  // We run the system in a stable startup. After that we verify that the system
-  // delay meets the requirements.
-  // This process should be independent of DA-AEC and extended_filter mode.
-  for (int extended_filter = 0; extended_filter <= 1; ++extended_filter) {
-    WebRtcAec_enable_extended_filter(self_->aec, extended_filter);
-    EXPECT_EQ(extended_filter, WebRtcAec_extended_filter_enabled(self_->aec));
-    for (int da_aec = 0; da_aec <= 1; ++da_aec) {
-      WebRtcAec_enable_delay_agnostic(self_->aec, da_aec);
-      EXPECT_EQ(da_aec, WebRtcAec_delay_agnostic_enabled(self_->aec));
-      for (size_t i = 0; i < kNumSampleRates; i++) {
-        Init(kSampleRateHz[i]);
-        RunStableStartup();
-
-        // Verify system delay with respect to requirements, i.e., the
-        // |system_delay| is in the interval [75%, 100%] of what's reported on
-        // the average.
-        // In extended_filter mode we target 50% and measure after one processed
-        // 10 ms chunk.
-        int average_reported_delay =
-            static_cast<int>(kDeviceBufMs * samples_per_frame_ / 10);
-        EXPECT_GE(average_reported_delay, WebRtcAec_system_delay(self_->aec));
-        int lower_bound = WebRtcAec_extended_filter_enabled(self_->aec)
-                              ? average_reported_delay / 2 - samples_per_frame_
-                              : average_reported_delay * 3 / 4;
-        EXPECT_LE(lower_bound, WebRtcAec_system_delay(self_->aec));
-      }
-    }
-  }
-}
-
-TEST_F(SystemDelayTest, CorrectDelayAfterUnstableStartup) {
-  // This test does not apply in extended_filter mode, since we only use the
-  // the first 10 ms chunk to determine a reasonable buffer size. Neither does
-  // it apply if DA-AEC is on because that overrides the startup procedure.
-  WebRtcAec_enable_extended_filter(self_->aec, 0);
-  EXPECT_EQ(0, WebRtcAec_extended_filter_enabled(self_->aec));
-  WebRtcAec_enable_delay_agnostic(self_->aec, 0);
-  EXPECT_EQ(0, WebRtcAec_delay_agnostic_enabled(self_->aec));
-
-  // In an unstable system we would start processing after |kMaxConvergenceMs|.
-  // On the last frame the AEC buffer is adjusted to 60% of the last reported
-  // device buffer size.
-  // We construct an unstable system by altering the device buffer size between
-  // two values |kDeviceBufMs| +- 25 ms.
-  for (size_t i = 0; i < kNumSampleRates; i++) {
-    Init(kSampleRateHz[i]);
-
-    // To make sure we have a full buffer when we verify stability we first fill
-    // up the far-end buffer with the same amount as we will report in on the
-    // average through Process().
-    size_t buffer_size = BufferFillUp();
-
-    int buffer_offset_ms = 25;
-    int reported_delay_ms = 0;
-    int process_time_ms = 0;
-    for (; process_time_ms <= kMaxConvergenceMs; process_time_ms += 10) {
-      reported_delay_ms = kDeviceBufMs + buffer_offset_ms;
-      RenderAndCapture(reported_delay_ms);
-      buffer_size += samples_per_frame_;
-      buffer_offset_ms = -buffer_offset_ms;
-      if (self_->startup_phase == 0) {
-        // We have left the startup phase.
-        break;
-      }
-    }
-    // Verify convergence time.
-    EXPECT_GE(kMaxConvergenceMs, process_time_ms);
-    // Verify that the buffer has been flushed.
-    EXPECT_GE(static_cast<int>(buffer_size),
-              WebRtcAec_system_delay(self_->aec));
-
-    // Verify system delay with respect to requirements, i.e., the
-    // |system_delay| is in the interval [60%, 100%] of what's last reported.
-    EXPECT_GE(static_cast<int>(reported_delay_ms * samples_per_frame_ / 10),
-              WebRtcAec_system_delay(self_->aec));
-    EXPECT_LE(
-        static_cast<int>(reported_delay_ms * samples_per_frame_ / 10 * 3 / 5),
-        WebRtcAec_system_delay(self_->aec));
-  }
-}
-
-TEST_F(SystemDelayTest, CorrectDelayAfterStableBufferBuildUp) {
-  // This test does not apply in extended_filter mode, since we only use the
-  // the first 10 ms chunk to determine a reasonable buffer size. Neither does
-  // it apply if DA-AEC is on because that overrides the startup procedure.
-  WebRtcAec_enable_extended_filter(self_->aec, 0);
-  EXPECT_EQ(0, WebRtcAec_extended_filter_enabled(self_->aec));
-  WebRtcAec_enable_delay_agnostic(self_->aec, 0);
-  EXPECT_EQ(0, WebRtcAec_delay_agnostic_enabled(self_->aec));
-
-  // In this test we start by establishing the device buffer size during stable
-  // conditions, but with an empty internal far-end buffer. Once that is done we
-  // verify that the system delay is increased correctly until we have reach an
-  // internal buffer size of 75% of what's been reported.
-  for (size_t i = 0; i < kNumSampleRates; i++) {
-    Init(kSampleRateHz[i]);
-
-    // We assume that running |kStableConvergenceMs| calls will put the
-    // algorithm in a state where the device buffer size has been determined. We
-    // can make that assumption since we have a separate stability test.
-    int process_time_ms = 0;
-    for (; process_time_ms < kStableConvergenceMs; process_time_ms += 10) {
-      EXPECT_EQ(0,
-                WebRtcAec_Process(handle_,
-                                  &near_ptr_,
-                                  1,
-                                  &out_ptr_,
-                                  samples_per_frame_,
-                                  kDeviceBufMs,
-                                  0));
-    }
-    // Verify that a buffer size has been established.
-    EXPECT_EQ(0, self_->checkBuffSize);
-
-    // We now have established the required buffer size. Let us verify that we
-    // fill up before leaving the startup phase for normal processing.
-    size_t buffer_size = 0;
-    size_t target_buffer_size = kDeviceBufMs * samples_per_frame_ / 10 * 3 / 4;
-    process_time_ms = 0;
-    for (; process_time_ms <= kMaxConvergenceMs; process_time_ms += 10) {
-      RenderAndCapture(kDeviceBufMs);
-      buffer_size += samples_per_frame_;
-      if (self_->startup_phase == 0) {
-        // We have left the startup phase.
-        break;
-      }
-    }
-    // Verify convergence time.
-    EXPECT_GT(kMaxConvergenceMs, process_time_ms);
-    // Verify that the buffer has reached the desired size.
-    EXPECT_LE(static_cast<int>(target_buffer_size),
-              WebRtcAec_system_delay(self_->aec));
-
-    // Verify normal behavior (system delay is kept constant) after startup by
-    // running a couple of calls to BufferFarend() and Process().
-    for (int j = 0; j < 6; j++) {
-      int system_delay_before_calls = WebRtcAec_system_delay(self_->aec);
-      RenderAndCapture(kDeviceBufMs);
-      EXPECT_EQ(system_delay_before_calls, WebRtcAec_system_delay(self_->aec));
-    }
-  }
-}
-
-TEST_F(SystemDelayTest, CorrectDelayWhenBufferUnderrun) {
-  // Here we test a buffer under run scenario. If we keep on calling
-  // WebRtcAec_Process() we will finally run out of data, but should
-  // automatically stuff the buffer. We verify this behavior by checking if the
-  // system delay goes negative.
-  // This process should be independent of DA-AEC and extended_filter mode.
-  for (int extended_filter = 0; extended_filter <= 1; ++extended_filter) {
-    WebRtcAec_enable_extended_filter(self_->aec, extended_filter);
-    EXPECT_EQ(extended_filter, WebRtcAec_extended_filter_enabled(self_->aec));
-    for (int da_aec = 0; da_aec <= 1; ++da_aec) {
-      WebRtcAec_enable_delay_agnostic(self_->aec, da_aec);
-      EXPECT_EQ(da_aec, WebRtcAec_delay_agnostic_enabled(self_->aec));
-      for (size_t i = 0; i < kNumSampleRates; i++) {
-        Init(kSampleRateHz[i]);
-        RunStableStartup();
-
-        // The AEC has now left the Startup phase. We now have at most
-        // |kStableConvergenceMs| in the buffer. Keep on calling Process() until
-        // we run out of data and verify that the system delay is non-negative.
-        for (int j = 0; j <= kStableConvergenceMs; j += 10) {
-          EXPECT_EQ(0, WebRtcAec_Process(handle_, &near_ptr_, 1, &out_ptr_,
-                                         samples_per_frame_, kDeviceBufMs, 0));
-          EXPECT_LE(0, WebRtcAec_system_delay(self_->aec));
-        }
-      }
-    }
-  }
-}
-
-TEST_F(SystemDelayTest, CorrectDelayDuringDrift) {
-  // This drift test should verify that the system delay is never exceeding the
-  // device buffer. The drift is simulated by decreasing the reported device
-  // buffer size by 1 ms every 100 ms. If the device buffer size goes below 30
-  // ms we jump (add) 10 ms to give a repeated pattern.
-
-  // This process should be independent of DA-AEC and extended_filter mode.
-  for (int extended_filter = 0; extended_filter <= 1; ++extended_filter) {
-    WebRtcAec_enable_extended_filter(self_->aec, extended_filter);
-    EXPECT_EQ(extended_filter, WebRtcAec_extended_filter_enabled(self_->aec));
-    for (int da_aec = 0; da_aec <= 1; ++da_aec) {
-      WebRtcAec_enable_delay_agnostic(self_->aec, da_aec);
-      EXPECT_EQ(da_aec, WebRtcAec_delay_agnostic_enabled(self_->aec));
-      for (size_t i = 0; i < kNumSampleRates; i++) {
-        Init(kSampleRateHz[i]);
-        RunStableStartup();
-
-        // We have left the startup phase and proceed with normal processing.
-        int jump = 0;
-        for (int j = 0; j < 1000; j++) {
-          // Drift = -1 ms per 100 ms of data.
-          int device_buf_ms = kDeviceBufMs - (j / 10) + jump;
-          int device_buf = MapBufferSizeToSamples(device_buf_ms,
-                                                  extended_filter == 1);
-
-          if (device_buf_ms < 30) {
-            // Add 10 ms data, taking affect next frame.
-            jump += 10;
-          }
-          RenderAndCapture(device_buf_ms);
-
-          // Verify that the system delay does not exceed the device buffer.
-          EXPECT_GE(device_buf, WebRtcAec_system_delay(self_->aec));
-
-          // Verify that the system delay is non-negative.
-          EXPECT_LE(0, WebRtcAec_system_delay(self_->aec));
-        }
-      }
-    }
-  }
-}
-
-TEST_F(SystemDelayTest, ShouldRecoverAfterGlitch) {
-  // This glitch test should verify that the system delay recovers if there is
-  // a glitch in data. The data glitch is constructed as 200 ms of buffering
-  // after which the stable procedure continues. The glitch is never reported by
-  // the device.
-  // The system is said to be in a non-causal state if the difference between
-  // the device buffer and system delay is less than a block (64 samples).
-
-  // This process should be independent of DA-AEC and extended_filter mode.
-  for (int extended_filter = 0; extended_filter <= 1; ++extended_filter) {
-    WebRtcAec_enable_extended_filter(self_->aec, extended_filter);
-    EXPECT_EQ(extended_filter, WebRtcAec_extended_filter_enabled(self_->aec));
-    for (int da_aec = 0; da_aec <= 1; ++da_aec) {
-      WebRtcAec_enable_delay_agnostic(self_->aec, da_aec);
-      EXPECT_EQ(da_aec, WebRtcAec_delay_agnostic_enabled(self_->aec));
-      for (size_t i = 0; i < kNumSampleRates; i++) {
-        Init(kSampleRateHz[i]);
-        RunStableStartup();
-        int device_buf = MapBufferSizeToSamples(kDeviceBufMs,
-                                                extended_filter == 1);
-        // Glitch state.
-        for (int j = 0; j < 20; j++) {
-          EXPECT_EQ(0,
-                    WebRtcAec_BufferFarend(handle_, far_, samples_per_frame_));
-          // No need to verify system delay, since that is done in a separate
-          // test.
-        }
-        // Verify that we are in a non-causal state, i.e.,
-        // |system_delay| > |device_buf|.
-        EXPECT_LT(device_buf, WebRtcAec_system_delay(self_->aec));
-
-        // Recover state. Should recover at least 4 ms of data per 10 ms, hence
-        // a glitch of 200 ms will take at most 200 * 10 / 4 = 500 ms to recover
-        // from.
-        bool non_causal = true;  // We are currently in a non-causal state.
-        for (int j = 0; j < 50; j++) {
-          int system_delay_before = WebRtcAec_system_delay(self_->aec);
-          RenderAndCapture(kDeviceBufMs);
-          int system_delay_after = WebRtcAec_system_delay(self_->aec);
-          // We have recovered if
-          // |device_buf| - |system_delay_after| >= PART_LEN (1 block).
-          // During recovery, |system_delay_after| < |system_delay_before|,
-          // otherwise they are equal.
-          if (non_causal) {
-            EXPECT_LT(system_delay_after, system_delay_before);
-            if (device_buf - system_delay_after >= PART_LEN) {
-              non_causal = false;
-            }
-          } else {
-            EXPECT_EQ(system_delay_before, system_delay_after);
-          }
-          // Verify that the system delay is non-negative.
-          EXPECT_LE(0, WebRtcAec_system_delay(self_->aec));
-        }
-        // Check that we have recovered.
-        EXPECT_FALSE(non_causal);
-      }
-    }
-  }
-}
-
-TEST_F(SystemDelayTest, UnaffectedWhenSpuriousDeviceBufferValues) {
-  // This test does not apply in extended_filter mode, since we only use the
-  // the first 10 ms chunk to determine a reasonable buffer size.
-  const int extended_filter = 0;
-  WebRtcAec_enable_extended_filter(self_->aec, extended_filter);
-  EXPECT_EQ(extended_filter, WebRtcAec_extended_filter_enabled(self_->aec));
-
-  // Should be DA-AEC independent.
-  for (int da_aec = 0; da_aec <= 1; ++da_aec) {
-    WebRtcAec_enable_delay_agnostic(self_->aec, da_aec);
-    EXPECT_EQ(da_aec, WebRtcAec_delay_agnostic_enabled(self_->aec));
-    // This spurious device buffer data test aims at verifying that the system
-    // delay is unaffected by large outliers.
-    // The system is said to be in a non-causal state if the difference between
-    // the device buffer and system delay is less than a block (64 samples).
-    for (size_t i = 0; i < kNumSampleRates; i++) {
-      Init(kSampleRateHz[i]);
-      RunStableStartup();
-      int device_buf = MapBufferSizeToSamples(kDeviceBufMs,
-                                              extended_filter == 1);
-
-      // Normal state. We are currently not in a non-causal state.
-      bool non_causal = false;
-
-      // Run 1 s and replace device buffer size with 500 ms every 100 ms.
-      for (int j = 0; j < 100; j++) {
-        int system_delay_before_calls = WebRtcAec_system_delay(self_->aec);
-        int device_buf_ms = j % 10 == 0 ? 500 : kDeviceBufMs;
-        RenderAndCapture(device_buf_ms);
-
-        // Check for non-causality.
-        if (device_buf - WebRtcAec_system_delay(self_->aec) < PART_LEN) {
-          non_causal = true;
-        }
-        EXPECT_FALSE(non_causal);
-        EXPECT_EQ(system_delay_before_calls,
-                  WebRtcAec_system_delay(self_->aec));
-
-        // Verify that the system delay is non-negative.
-        EXPECT_LE(0, WebRtcAec_system_delay(self_->aec));
-      }
-    }
-  }
-}
-
-TEST_F(SystemDelayTest, CorrectImpactWhenTogglingDeviceBufferValues) {
-  // This test aims at verifying that the system delay is "unaffected" by
-  // toggling values reported by the device.
-  // The test is constructed such that every other device buffer value is zero
-  // and then 2 * |kDeviceBufMs|, hence the size is constant on the average. The
-  // zero values will force us into a non-causal state and thereby lowering the
-  // system delay until we basically run out of data. Once that happens the
-  // buffer will be stuffed.
-  // TODO(bjornv): This test will have a better impact if we verified that the
-  // delay estimate goes up when the system delay goes down to meet the average
-  // device buffer size.
-
-  // This test does not apply if DA-AEC is enabled and extended_filter mode
-  // disabled.
-  for (int extended_filter = 0; extended_filter <= 1; ++extended_filter) {
-    WebRtcAec_enable_extended_filter(self_->aec, extended_filter);
-    EXPECT_EQ(extended_filter, WebRtcAec_extended_filter_enabled(self_->aec));
-    for (int da_aec = 0; da_aec <= 1; ++da_aec) {
-      WebRtcAec_enable_delay_agnostic(self_->aec, da_aec);
-      EXPECT_EQ(da_aec, WebRtcAec_delay_agnostic_enabled(self_->aec));
-      if (extended_filter == 0 && da_aec == 1) {
-        continue;
-      }
-      for (size_t i = 0; i < kNumSampleRates; i++) {
-        Init(kSampleRateHz[i]);
-        RunStableStartup();
-        const int device_buf = MapBufferSizeToSamples(kDeviceBufMs,
-                                                      extended_filter == 1);
-
-        // Normal state. We are currently not in a non-causal state.
-        bool non_causal = false;
-
-        // Loop through 100 frames (both render and capture), which equals 1 s
-        // of data. Every odd frame we set the device buffer size to
-        // 2 * |kDeviceBufMs| and even frames we set the device buffer size to
-        // zero.
-        for (int j = 0; j < 100; j++) {
-          int system_delay_before_calls = WebRtcAec_system_delay(self_->aec);
-          int device_buf_ms = 2 * (j % 2) * kDeviceBufMs;
-          RenderAndCapture(device_buf_ms);
-
-          // Check for non-causality, compared with the average device buffer
-          // size.
-          non_causal |= (device_buf - WebRtcAec_system_delay(self_->aec) < 64);
-          EXPECT_GE(system_delay_before_calls,
-                    WebRtcAec_system_delay(self_->aec));
-
-          // Verify that the system delay is non-negative.
-          EXPECT_LE(0, WebRtcAec_system_delay(self_->aec));
-        }
-        // Verify we are not in a non-causal state.
-        EXPECT_FALSE(non_causal);
-      }
-    }
-  }
-}
-
-}  // namespace
-}  // namespace webrtc
diff --git a/modules/audio_processing/aec3/adaptive_fir_filter.cc b/modules/audio_processing/aec3/adaptive_fir_filter.cc
deleted file mode 100644
index 303ff77..0000000
--- a/modules/audio_processing/aec3/adaptive_fir_filter.cc
+++ /dev/null
@@ -1,525 +0,0 @@
-/*
- *  Copyright (c) 2017 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_processing/aec3/adaptive_fir_filter.h"
-
-#if defined(WEBRTC_HAS_NEON)
-#include <arm_neon.h>
-#endif
-#include "webrtc/typedefs.h"
-#if defined(WEBRTC_ARCH_X86_FAMILY)
-#include <emmintrin.h>
-#endif
-#include <algorithm>
-#include <functional>
-
-#include "webrtc/modules/audio_processing/aec3/fft_data.h"
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-
-namespace aec3 {
-
-// Computes and stores the frequency response of the filter.
-void UpdateFrequencyResponse(
-    rtc::ArrayView<const FftData> H,
-    std::vector<std::array<float, kFftLengthBy2Plus1>>* H2) {
-  RTC_DCHECK_EQ(H.size(), H2->size());
-  for (size_t k = 0; k < H.size(); ++k) {
-    std::transform(H[k].re.begin(), H[k].re.end(), H[k].im.begin(),
-                   (*H2)[k].begin(),
-                   [](float a, float b) { return a * a + b * b; });
-  }
-}
-
-#if defined(WEBRTC_HAS_NEON)
-// Computes and stores the frequency response of the filter.
-void UpdateFrequencyResponse_NEON(
-    rtc::ArrayView<const FftData> H,
-    std::vector<std::array<float, kFftLengthBy2Plus1>>* H2) {
-  RTC_DCHECK_EQ(H.size(), H2->size());
-  for (size_t k = 0; k < H.size(); ++k) {
-    for (size_t j = 0; j < kFftLengthBy2; j += 4) {
-      const float32x4_t re = vld1q_f32(&H[k].re[j]);
-      const float32x4_t im = vld1q_f32(&H[k].im[j]);
-      float32x4_t H2_k_j = vmulq_f32(re, re);
-      H2_k_j = vmlaq_f32(H2_k_j, im, im);
-      vst1q_f32(&(*H2)[k][j], H2_k_j);
-    }
-    (*H2)[k][kFftLengthBy2] = H[k].re[kFftLengthBy2] * H[k].re[kFftLengthBy2] +
-                              H[k].im[kFftLengthBy2] * H[k].im[kFftLengthBy2];
-  }
-}
-#endif
-
-#if defined(WEBRTC_ARCH_X86_FAMILY)
-// Computes and stores the frequency response of the filter.
-void UpdateFrequencyResponse_SSE2(
-    rtc::ArrayView<const FftData> H,
-    std::vector<std::array<float, kFftLengthBy2Plus1>>* H2) {
-  RTC_DCHECK_EQ(H.size(), H2->size());
-  for (size_t k = 0; k < H.size(); ++k) {
-    for (size_t j = 0; j < kFftLengthBy2; j += 4) {
-      const __m128 re = _mm_loadu_ps(&H[k].re[j]);
-      const __m128 re2 = _mm_mul_ps(re, re);
-      const __m128 im = _mm_loadu_ps(&H[k].im[j]);
-      const __m128 im2 = _mm_mul_ps(im, im);
-      const __m128 H2_k_j = _mm_add_ps(re2, im2);
-      _mm_storeu_ps(&(*H2)[k][j], H2_k_j);
-    }
-    (*H2)[k][kFftLengthBy2] = H[k].re[kFftLengthBy2] * H[k].re[kFftLengthBy2] +
-                              H[k].im[kFftLengthBy2] * H[k].im[kFftLengthBy2];
-  }
-}
-#endif
-
-// Computes and stores the echo return loss estimate of the filter, which is the
-// sum of the partition frequency responses.
-void UpdateErlEstimator(
-    const std::vector<std::array<float, kFftLengthBy2Plus1>>& H2,
-    std::array<float, kFftLengthBy2Plus1>* erl) {
-  erl->fill(0.f);
-  for (auto& H2_j : H2) {
-    std::transform(H2_j.begin(), H2_j.end(), erl->begin(), erl->begin(),
-                   std::plus<float>());
-  }
-}
-
-#if defined(WEBRTC_HAS_NEON)
-// Computes and stores the echo return loss estimate of the filter, which is the
-// sum of the partition frequency responses.
-void UpdateErlEstimator_NEON(
-    const std::vector<std::array<float, kFftLengthBy2Plus1>>& H2,
-    std::array<float, kFftLengthBy2Plus1>* erl) {
-  erl->fill(0.f);
-  for (auto& H2_j : H2) {
-    for (size_t k = 0; k < kFftLengthBy2; k += 4) {
-      const float32x4_t H2_j_k = vld1q_f32(&H2_j[k]);
-      float32x4_t erl_k = vld1q_f32(&(*erl)[k]);
-      erl_k = vaddq_f32(erl_k, H2_j_k);
-      vst1q_f32(&(*erl)[k], erl_k);
-    }
-    (*erl)[kFftLengthBy2] += H2_j[kFftLengthBy2];
-  }
-}
-#endif
-
-#if defined(WEBRTC_ARCH_X86_FAMILY)
-// Computes and stores the echo return loss estimate of the filter, which is the
-// sum of the partition frequency responses.
-void UpdateErlEstimator_SSE2(
-    const std::vector<std::array<float, kFftLengthBy2Plus1>>& H2,
-    std::array<float, kFftLengthBy2Plus1>* erl) {
-  erl->fill(0.f);
-  for (auto& H2_j : H2) {
-    for (size_t k = 0; k < kFftLengthBy2; k += 4) {
-      const __m128 H2_j_k = _mm_loadu_ps(&H2_j[k]);
-      __m128 erl_k = _mm_loadu_ps(&(*erl)[k]);
-      erl_k = _mm_add_ps(erl_k, H2_j_k);
-      _mm_storeu_ps(&(*erl)[k], erl_k);
-    }
-    (*erl)[kFftLengthBy2] += H2_j[kFftLengthBy2];
-  }
-}
-#endif
-
-// Adapts the filter partitions as H(t+1)=H(t)+G(t)*conj(X(t)).
-void AdaptPartitions(const RenderBuffer& render_buffer,
-                     const FftData& G,
-                     rtc::ArrayView<FftData> H) {
-  rtc::ArrayView<const FftData> render_buffer_data = render_buffer.Buffer();
-  size_t index = render_buffer.Position();
-  for (auto& H_j : H) {
-    const FftData& X = render_buffer_data[index];
-    for (size_t k = 0; k < kFftLengthBy2Plus1; ++k) {
-      H_j.re[k] += X.re[k] * G.re[k] + X.im[k] * G.im[k];
-      H_j.im[k] += X.re[k] * G.im[k] - X.im[k] * G.re[k];
-    }
-
-    index = index < (render_buffer_data.size() - 1) ? index + 1 : 0;
-  }
-}
-
-#if defined(WEBRTC_HAS_NEON)
-// Adapts the filter partitions. (NEON variant)
-void AdaptPartitions_NEON(const RenderBuffer& render_buffer,
-                          const FftData& G,
-                          rtc::ArrayView<FftData> H) {
-  rtc::ArrayView<const FftData> render_buffer_data = render_buffer.Buffer();
-  const int lim1 =
-      std::min(render_buffer_data.size() - render_buffer.Position(), H.size());
-  const int lim2 = H.size();
-  constexpr int kNumFourBinBands = kFftLengthBy2 / 4;
-  FftData* H_j = &H[0];
-  const FftData* X = &render_buffer_data[render_buffer.Position()];
-  int limit = lim1;
-  int j = 0;
-  do {
-    for (; j < limit; ++j, ++H_j, ++X) {
-      for (int k = 0, n = 0; n < kNumFourBinBands; ++n, k += 4) {
-        const float32x4_t G_re = vld1q_f32(&G.re[k]);
-        const float32x4_t G_im = vld1q_f32(&G.im[k]);
-        const float32x4_t X_re = vld1q_f32(&X->re[k]);
-        const float32x4_t X_im = vld1q_f32(&X->im[k]);
-        const float32x4_t H_re = vld1q_f32(&H_j->re[k]);
-        const float32x4_t H_im = vld1q_f32(&H_j->im[k]);
-        const float32x4_t a = vmulq_f32(X_re, G_re);
-        const float32x4_t e = vmlaq_f32(a, X_im, G_im);
-        const float32x4_t c = vmulq_f32(X_re, G_im);
-        const float32x4_t f = vmlsq_f32(c, X_im, G_re);
-        const float32x4_t g = vaddq_f32(H_re, e);
-        const float32x4_t h = vaddq_f32(H_im, f);
-
-        vst1q_f32(&H_j->re[k], g);
-        vst1q_f32(&H_j->im[k], h);
-      }
-    }
-
-    X = &render_buffer_data[0];
-    limit = lim2;
-  } while (j < lim2);
-
-  H_j = &H[0];
-  X = &render_buffer_data[render_buffer.Position()];
-  limit = lim1;
-  j = 0;
-  do {
-    for (; j < limit; ++j, ++H_j, ++X) {
-      H_j->re[kFftLengthBy2] += X->re[kFftLengthBy2] * G.re[kFftLengthBy2] +
-                                X->im[kFftLengthBy2] * G.im[kFftLengthBy2];
-      H_j->im[kFftLengthBy2] += X->re[kFftLengthBy2] * G.im[kFftLengthBy2] -
-                                X->im[kFftLengthBy2] * G.re[kFftLengthBy2];
-    }
-
-    X = &render_buffer_data[0];
-    limit = lim2;
-  } while (j < lim2);
-}
-#endif
-
-#if defined(WEBRTC_ARCH_X86_FAMILY)
-// Adapts the filter partitions. (SSE2 variant)
-void AdaptPartitions_SSE2(const RenderBuffer& render_buffer,
-                          const FftData& G,
-                          rtc::ArrayView<FftData> H) {
-  rtc::ArrayView<const FftData> render_buffer_data = render_buffer.Buffer();
-  const int lim1 =
-      std::min(render_buffer_data.size() - render_buffer.Position(), H.size());
-  const int lim2 = H.size();
-  constexpr int kNumFourBinBands = kFftLengthBy2 / 4;
-  FftData* H_j;
-  const FftData* X;
-  int limit;
-  int j;
-  for (int k = 0, n = 0; n < kNumFourBinBands; ++n, k += 4) {
-    const __m128 G_re = _mm_loadu_ps(&G.re[k]);
-    const __m128 G_im = _mm_loadu_ps(&G.im[k]);
-
-    H_j = &H[0];
-    X = &render_buffer_data[render_buffer.Position()];
-    limit = lim1;
-    j = 0;
-    do {
-      for (; j < limit; ++j, ++H_j, ++X) {
-        const __m128 X_re = _mm_loadu_ps(&X->re[k]);
-        const __m128 X_im = _mm_loadu_ps(&X->im[k]);
-        const __m128 H_re = _mm_loadu_ps(&H_j->re[k]);
-        const __m128 H_im = _mm_loadu_ps(&H_j->im[k]);
-        const __m128 a = _mm_mul_ps(X_re, G_re);
-        const __m128 b = _mm_mul_ps(X_im, G_im);
-        const __m128 c = _mm_mul_ps(X_re, G_im);
-        const __m128 d = _mm_mul_ps(X_im, G_re);
-        const __m128 e = _mm_add_ps(a, b);
-        const __m128 f = _mm_sub_ps(c, d);
-        const __m128 g = _mm_add_ps(H_re, e);
-        const __m128 h = _mm_add_ps(H_im, f);
-        _mm_storeu_ps(&H_j->re[k], g);
-        _mm_storeu_ps(&H_j->im[k], h);
-      }
-
-      X = &render_buffer_data[0];
-      limit = lim2;
-    } while (j < lim2);
-  }
-
-  H_j = &H[0];
-  X = &render_buffer_data[render_buffer.Position()];
-  limit = lim1;
-  j = 0;
-  do {
-    for (; j < limit; ++j, ++H_j, ++X) {
-      H_j->re[kFftLengthBy2] += X->re[kFftLengthBy2] * G.re[kFftLengthBy2] +
-                                X->im[kFftLengthBy2] * G.im[kFftLengthBy2];
-      H_j->im[kFftLengthBy2] += X->re[kFftLengthBy2] * G.im[kFftLengthBy2] -
-                                X->im[kFftLengthBy2] * G.re[kFftLengthBy2];
-    }
-
-    X = &render_buffer_data[0];
-    limit = lim2;
-  } while (j < lim2);
-}
-#endif
-
-// Produces the filter output.
-void ApplyFilter(const RenderBuffer& render_buffer,
-                 rtc::ArrayView<const FftData> H,
-                 FftData* S) {
-  S->re.fill(0.f);
-  S->im.fill(0.f);
-
-  rtc::ArrayView<const FftData> render_buffer_data = render_buffer.Buffer();
-  size_t index = render_buffer.Position();
-  for (auto& H_j : H) {
-    const FftData& X = render_buffer_data[index];
-    for (size_t k = 0; k < kFftLengthBy2Plus1; ++k) {
-      S->re[k] += X.re[k] * H_j.re[k] - X.im[k] * H_j.im[k];
-      S->im[k] += X.re[k] * H_j.im[k] + X.im[k] * H_j.re[k];
-    }
-    index = index < (render_buffer_data.size() - 1) ? index + 1 : 0;
-  }
-}
-
-#if defined(WEBRTC_HAS_NEON)
-// Produces the filter output (NEON variant).
-void ApplyFilter_NEON(const RenderBuffer& render_buffer,
-                      rtc::ArrayView<const FftData> H,
-                      FftData* S) {
-  RTC_DCHECK_GE(H.size(), H.size() - 1);
-  S->re.fill(0.f);
-  S->im.fill(0.f);
-
-  rtc::ArrayView<const FftData> render_buffer_data = render_buffer.Buffer();
-  const int lim1 =
-      std::min(render_buffer_data.size() - render_buffer.Position(), H.size());
-  const int lim2 = H.size();
-  constexpr int kNumFourBinBands = kFftLengthBy2 / 4;
-  const FftData* H_j = &H[0];
-  const FftData* X = &render_buffer_data[render_buffer.Position()];
-
-  int j = 0;
-  int limit = lim1;
-  do {
-    for (; j < limit; ++j, ++H_j, ++X) {
-      for (int k = 0, n = 0; n < kNumFourBinBands; ++n, k += 4) {
-        const float32x4_t X_re = vld1q_f32(&X->re[k]);
-        const float32x4_t X_im = vld1q_f32(&X->im[k]);
-        const float32x4_t H_re = vld1q_f32(&H_j->re[k]);
-        const float32x4_t H_im = vld1q_f32(&H_j->im[k]);
-        const float32x4_t S_re = vld1q_f32(&S->re[k]);
-        const float32x4_t S_im = vld1q_f32(&S->im[k]);
-        const float32x4_t a = vmulq_f32(X_re, H_re);
-        const float32x4_t e = vmlsq_f32(a, X_im, H_im);
-        const float32x4_t c = vmulq_f32(X_re, H_im);
-        const float32x4_t f = vmlaq_f32(c, X_im, H_re);
-        const float32x4_t g = vaddq_f32(S_re, e);
-        const float32x4_t h = vaddq_f32(S_im, f);
-        vst1q_f32(&S->re[k], g);
-        vst1q_f32(&S->im[k], h);
-      }
-    }
-    limit = lim2;
-    X = &render_buffer_data[0];
-  } while (j < lim2);
-
-  H_j = &H[0];
-  X = &render_buffer_data[render_buffer.Position()];
-  j = 0;
-  limit = lim1;
-  do {
-    for (; j < limit; ++j, ++H_j, ++X) {
-      S->re[kFftLengthBy2] += X->re[kFftLengthBy2] * H_j->re[kFftLengthBy2] -
-                              X->im[kFftLengthBy2] * H_j->im[kFftLengthBy2];
-      S->im[kFftLengthBy2] += X->re[kFftLengthBy2] * H_j->im[kFftLengthBy2] +
-                              X->im[kFftLengthBy2] * H_j->re[kFftLengthBy2];
-    }
-    limit = lim2;
-    X = &render_buffer_data[0];
-  } while (j < lim2);
-}
-#endif
-
-#if defined(WEBRTC_ARCH_X86_FAMILY)
-// Produces the filter output (SSE2 variant).
-void ApplyFilter_SSE2(const RenderBuffer& render_buffer,
-                      rtc::ArrayView<const FftData> H,
-                      FftData* S) {
-  RTC_DCHECK_GE(H.size(), H.size() - 1);
-  S->re.fill(0.f);
-  S->im.fill(0.f);
-
-  rtc::ArrayView<const FftData> render_buffer_data = render_buffer.Buffer();
-  const int lim1 =
-      std::min(render_buffer_data.size() - render_buffer.Position(), H.size());
-  const int lim2 = H.size();
-  constexpr int kNumFourBinBands = kFftLengthBy2 / 4;
-  const FftData* H_j = &H[0];
-  const FftData* X = &render_buffer_data[render_buffer.Position()];
-
-  int j = 0;
-  int limit = lim1;
-  do {
-    for (; j < limit; ++j, ++H_j, ++X) {
-      for (int k = 0, n = 0; n < kNumFourBinBands; ++n, k += 4) {
-        const __m128 X_re = _mm_loadu_ps(&X->re[k]);
-        const __m128 X_im = _mm_loadu_ps(&X->im[k]);
-        const __m128 H_re = _mm_loadu_ps(&H_j->re[k]);
-        const __m128 H_im = _mm_loadu_ps(&H_j->im[k]);
-        const __m128 S_re = _mm_loadu_ps(&S->re[k]);
-        const __m128 S_im = _mm_loadu_ps(&S->im[k]);
-        const __m128 a = _mm_mul_ps(X_re, H_re);
-        const __m128 b = _mm_mul_ps(X_im, H_im);
-        const __m128 c = _mm_mul_ps(X_re, H_im);
-        const __m128 d = _mm_mul_ps(X_im, H_re);
-        const __m128 e = _mm_sub_ps(a, b);
-        const __m128 f = _mm_add_ps(c, d);
-        const __m128 g = _mm_add_ps(S_re, e);
-        const __m128 h = _mm_add_ps(S_im, f);
-        _mm_storeu_ps(&S->re[k], g);
-        _mm_storeu_ps(&S->im[k], h);
-      }
-    }
-    limit = lim2;
-    X = &render_buffer_data[0];
-  } while (j < lim2);
-
-  H_j = &H[0];
-  X = &render_buffer_data[render_buffer.Position()];
-  j = 0;
-  limit = lim1;
-  do {
-    for (; j < limit; ++j, ++H_j, ++X) {
-      S->re[kFftLengthBy2] += X->re[kFftLengthBy2] * H_j->re[kFftLengthBy2] -
-                              X->im[kFftLengthBy2] * H_j->im[kFftLengthBy2];
-      S->im[kFftLengthBy2] += X->re[kFftLengthBy2] * H_j->im[kFftLengthBy2] +
-                              X->im[kFftLengthBy2] * H_j->re[kFftLengthBy2];
-    }
-    limit = lim2;
-    X = &render_buffer_data[0];
-  } while (j < lim2);
-}
-#endif
-
-}  // namespace aec3
-
-AdaptiveFirFilter::AdaptiveFirFilter(size_t size_partitions,
-                                     Aec3Optimization optimization,
-                                     ApmDataDumper* data_dumper)
-    : data_dumper_(data_dumper),
-      fft_(),
-      optimization_(optimization),
-      H_(size_partitions),
-      H2_(size_partitions, std::array<float, kFftLengthBy2Plus1>()) {
-  RTC_DCHECK(data_dumper_);
-
-  h_.fill(0.f);
-  for (auto& H_j : H_) {
-    H_j.Clear();
-  }
-  for (auto& H2_k : H2_) {
-    H2_k.fill(0.f);
-  }
-  erl_.fill(0.f);
-}
-
-AdaptiveFirFilter::~AdaptiveFirFilter() = default;
-
-void AdaptiveFirFilter::HandleEchoPathChange() {
-  h_.fill(0.f);
-  for (auto& H_j : H_) {
-    H_j.Clear();
-  }
-  for (auto& H2_k : H2_) {
-    H2_k.fill(0.f);
-  }
-  erl_.fill(0.f);
-}
-
-void AdaptiveFirFilter::Filter(const RenderBuffer& render_buffer,
-                               FftData* S) const {
-  RTC_DCHECK(S);
-  switch (optimization_) {
-#if defined(WEBRTC_ARCH_X86_FAMILY)
-    case Aec3Optimization::kSse2:
-      aec3::ApplyFilter_SSE2(render_buffer, H_, S);
-      break;
-#endif
-#if defined(WEBRTC_HAS_NEON)
-    case Aec3Optimization::kNeon:
-      aec3::ApplyFilter_NEON(render_buffer, H_, S);
-      break;
-#endif
-    default:
-      aec3::ApplyFilter(render_buffer, H_, S);
-  }
-}
-
-void AdaptiveFirFilter::Adapt(const RenderBuffer& render_buffer,
-                              const FftData& G) {
-  // Adapt the filter.
-  switch (optimization_) {
-#if defined(WEBRTC_ARCH_X86_FAMILY)
-    case Aec3Optimization::kSse2:
-      aec3::AdaptPartitions_SSE2(render_buffer, G, H_);
-      break;
-#endif
-#if defined(WEBRTC_HAS_NEON)
-    case Aec3Optimization::kNeon:
-      aec3::AdaptPartitions_NEON(render_buffer, G, H_);
-      break;
-#endif
-    default:
-      aec3::AdaptPartitions(render_buffer, G, H_);
-  }
-
-  // Constrain the filter partitions in a cyclic manner.
-  Constrain();
-
-  // Update the frequency response and echo return loss for the filter.
-  switch (optimization_) {
-#if defined(WEBRTC_ARCH_X86_FAMILY)
-    case Aec3Optimization::kSse2:
-      aec3::UpdateFrequencyResponse_SSE2(H_, &H2_);
-      aec3::UpdateErlEstimator_SSE2(H2_, &erl_);
-      break;
-#endif
-#if defined(WEBRTC_HAS_NEON)
-    case Aec3Optimization::kNeon:
-      aec3::UpdateFrequencyResponse_NEON(H_, &H2_);
-      aec3::UpdateErlEstimator_NEON(H2_, &erl_);
-      break;
-#endif
-    default:
-      aec3::UpdateFrequencyResponse(H_, &H2_);
-      aec3::UpdateErlEstimator(H2_, &erl_);
-  }
-}
-
-// Constrains the a partiton of the frequency domain filter to be limited in
-// time via setting the relevant time-domain coefficients to zero.
-void AdaptiveFirFilter::Constrain() {
-  std::array<float, kFftLength> h;
-  fft_.Ifft(H_[partition_to_constrain_], &h);
-
-  static constexpr float kScale = 1.0f / kFftLengthBy2;
-  std::for_each(h.begin(), h.begin() + kFftLengthBy2,
-                [](float& a) { a *= kScale; });
-  std::fill(h.begin() + kFftLengthBy2, h.end(), 0.f);
-
-  std::copy(h.begin(), h.begin() + kFftLengthBy2,
-            h_.begin() + partition_to_constrain_ * kFftLengthBy2);
-
-  fft_.Fft(&h, &H_[partition_to_constrain_]);
-
-  partition_to_constrain_ = partition_to_constrain_ < (H_.size() - 1)
-                                ? partition_to_constrain_ + 1
-                                : 0;
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/aec3/adaptive_fir_filter.h b/modules/audio_processing/aec3/adaptive_fir_filter.h
deleted file mode 100644
index ee2cbbd..0000000
--- a/modules/audio_processing/aec3/adaptive_fir_filter.h
+++ /dev/null
@@ -1,153 +0,0 @@
-/*
- *  Copyright (c) 2017 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_PROCESSING_AEC3_ADAPTIVE_FIR_FILTER_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_AEC3_ADAPTIVE_FIR_FILTER_H_
-
-#include <array>
-#include <memory>
-#include <vector>
-
-#include "webrtc/api/array_view.h"
-#include "webrtc/modules/audio_processing/aec3/aec3_common.h"
-#include "webrtc/modules/audio_processing/aec3/aec3_fft.h"
-#include "webrtc/modules/audio_processing/aec3/fft_data.h"
-#include "webrtc/modules/audio_processing/aec3/render_buffer.h"
-#include "webrtc/modules/audio_processing/logging/apm_data_dumper.h"
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace webrtc {
-namespace aec3 {
-// Computes and stores the frequency response of the filter.
-void UpdateFrequencyResponse(
-    rtc::ArrayView<const FftData> H,
-    std::vector<std::array<float, kFftLengthBy2Plus1>>* H2);
-#if defined(WEBRTC_HAS_NEON)
-void UpdateFrequencyResponse_NEON(
-    rtc::ArrayView<const FftData> H,
-    std::vector<std::array<float, kFftLengthBy2Plus1>>* H2);
-#endif
-#if defined(WEBRTC_ARCH_X86_FAMILY)
-void UpdateFrequencyResponse_SSE2(
-    rtc::ArrayView<const FftData> H,
-    std::vector<std::array<float, kFftLengthBy2Plus1>>* H2);
-#endif
-
-// Computes and stores the echo return loss estimate of the filter, which is the
-// sum of the partition frequency responses.
-void UpdateErlEstimator(
-    const std::vector<std::array<float, kFftLengthBy2Plus1>>& H2,
-    std::array<float, kFftLengthBy2Plus1>* erl);
-#if defined(WEBRTC_HAS_NEON)
-void UpdateErlEstimator_NEON(
-    const std::vector<std::array<float, kFftLengthBy2Plus1>>& H2,
-    std::array<float, kFftLengthBy2Plus1>* erl);
-#endif
-#if defined(WEBRTC_ARCH_X86_FAMILY)
-void UpdateErlEstimator_SSE2(
-    const std::vector<std::array<float, kFftLengthBy2Plus1>>& H2,
-    std::array<float, kFftLengthBy2Plus1>* erl);
-#endif
-
-// Adapts the filter partitions.
-void AdaptPartitions(const RenderBuffer& render_buffer,
-                     const FftData& G,
-                     rtc::ArrayView<FftData> H);
-#if defined(WEBRTC_HAS_NEON)
-void AdaptPartitions_NEON(const RenderBuffer& render_buffer,
-                          const FftData& G,
-                          rtc::ArrayView<FftData> H);
-#endif
-#if defined(WEBRTC_ARCH_X86_FAMILY)
-void AdaptPartitions_SSE2(const RenderBuffer& render_buffer,
-                          const FftData& G,
-                          rtc::ArrayView<FftData> H);
-#endif
-
-// Produces the filter output.
-void ApplyFilter(const RenderBuffer& render_buffer,
-                 rtc::ArrayView<const FftData> H,
-                 FftData* S);
-#if defined(WEBRTC_HAS_NEON)
-void ApplyFilter_NEON(const RenderBuffer& render_buffer,
-                      rtc::ArrayView<const FftData> H,
-                      FftData* S);
-#endif
-#if defined(WEBRTC_ARCH_X86_FAMILY)
-void ApplyFilter_SSE2(const RenderBuffer& render_buffer,
-                      rtc::ArrayView<const FftData> H,
-                      FftData* S);
-#endif
-
-}  // namespace aec3
-
-// Provides a frequency domain adaptive filter functionality.
-class AdaptiveFirFilter {
- public:
-  AdaptiveFirFilter(size_t size_partitions,
-                    Aec3Optimization optimization,
-                    ApmDataDumper* data_dumper);
-
-  ~AdaptiveFirFilter();
-
-  // Produces the output of the filter.
-  void Filter(const RenderBuffer& render_buffer, FftData* S) const;
-
-  // Adapts the filter.
-  void Adapt(const RenderBuffer& render_buffer, const FftData& G);
-
-  // Receives reports that known echo path changes have occured and adjusts
-  // the filter adaptation accordingly.
-  void HandleEchoPathChange();
-
-  // Returns the filter size.
-  size_t SizePartitions() const { return H_.size(); }
-
-  // Returns the filter based echo return loss.
-  const std::array<float, kFftLengthBy2Plus1>& Erl() const { return erl_; }
-
-  // Returns the frequency responses for the filter partitions.
-  const std::vector<std::array<float, kFftLengthBy2Plus1>>&
-  FilterFrequencyResponse() const {
-    return H2_;
-  }
-
-  // Returns the estimate of the impulse response.
-  const std::array<float, kAdaptiveFilterTimeDomainLength>&
-  FilterImpulseResponse() const {
-    return h_;
-  }
-
-  void DumpFilter(const char* name) {
-    for (auto& H : H_) {
-      data_dumper_->DumpRaw(name, H.re);
-      data_dumper_->DumpRaw(name, H.im);
-    }
-  }
-
- private:
-  // Constrain the filter partitions in a cyclic manner.
-  void Constrain();
-
-  ApmDataDumper* const data_dumper_;
-  const Aec3Fft fft_;
-  const Aec3Optimization optimization_;
-  std::vector<FftData> H_;
-  std::vector<std::array<float, kFftLengthBy2Plus1>> H2_;
-  std::array<float, kAdaptiveFilterTimeDomainLength> h_;
-  std::array<float, kFftLengthBy2Plus1> erl_;
-  size_t partition_to_constrain_ = 0;
-
-  RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(AdaptiveFirFilter);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_AEC3_ADAPTIVE_FIR_FILTER_H_
diff --git a/modules/audio_processing/aec3/adaptive_fir_filter_unittest.cc b/modules/audio_processing/aec3/adaptive_fir_filter_unittest.cc
deleted file mode 100644
index c861d46..0000000
--- a/modules/audio_processing/aec3/adaptive_fir_filter_unittest.cc
+++ /dev/null
@@ -1,379 +0,0 @@
-/*
- *  Copyright (c) 2017 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_processing/aec3/adaptive_fir_filter.h"
-
-#include <math.h>
-#include <algorithm>
-#include <numeric>
-#include <string>
-#include "webrtc/typedefs.h"
-#if defined(WEBRTC_ARCH_X86_FAMILY)
-#include <emmintrin.h>
-#endif
-#include "webrtc/modules/audio_processing/aec3/aec3_fft.h"
-#include "webrtc/modules/audio_processing/aec3/aec_state.h"
-#include "webrtc/modules/audio_processing/aec3/cascaded_biquad_filter.h"
-#include "webrtc/modules/audio_processing/aec3/render_signal_analyzer.h"
-#include "webrtc/modules/audio_processing/aec3/shadow_filter_update_gain.h"
-#include "webrtc/modules/audio_processing/logging/apm_data_dumper.h"
-#include "webrtc/modules/audio_processing/test/echo_canceller_test_tools.h"
-#include "webrtc/rtc_base/arraysize.h"
-#include "webrtc/rtc_base/random.h"
-#include "webrtc/rtc_base/safe_minmax.h"
-#include "webrtc/system_wrappers/include/cpu_features_wrapper.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-namespace aec3 {
-namespace {
-
-std::string ProduceDebugText(size_t delay) {
-  std::ostringstream ss;
-  ss << ", Delay: " << delay;
-  return ss.str();
-}
-
-}  // namespace
-
-#if defined(WEBRTC_HAS_NEON)
-// Verifies that the optimized methods for filter adaptation are similar to
-// their reference counterparts.
-TEST(AdaptiveFirFilter, FilterAdaptationNeonOptimizations) {
-  RenderBuffer render_buffer(Aec3Optimization::kNone, 3, 12,
-                             std::vector<size_t>(1, 12));
-  Random random_generator(42U);
-  std::vector<std::vector<float>> x(3, std::vector<float>(kBlockSize, 0.f));
-  FftData S_C;
-  FftData S_NEON;
-  FftData G;
-  Aec3Fft fft;
-  std::vector<FftData> H_C(10);
-  std::vector<FftData> H_NEON(10);
-  for (auto& H_j : H_C) {
-    H_j.Clear();
-  }
-  for (auto& H_j : H_NEON) {
-    H_j.Clear();
-  }
-
-  for (size_t k = 0; k < 30; ++k) {
-    RandomizeSampleVector(&random_generator, x[0]);
-    render_buffer.Insert(x);
-  }
-
-  for (size_t j = 0; j < G.re.size(); ++j) {
-    G.re[j] = j / 10001.f;
-  }
-  for (size_t j = 1; j < G.im.size() - 1; ++j) {
-    G.im[j] = j / 20001.f;
-  }
-  G.im[0] = 0.f;
-  G.im[G.im.size() - 1] = 0.f;
-
-  AdaptPartitions_NEON(render_buffer, G, H_NEON);
-  AdaptPartitions(render_buffer, G, H_C);
-  AdaptPartitions_NEON(render_buffer, G, H_NEON);
-  AdaptPartitions(render_buffer, G, H_C);
-
-  for (size_t l = 0; l < H_C.size(); ++l) {
-    for (size_t j = 0; j < H_C[l].im.size(); ++j) {
-      EXPECT_NEAR(H_C[l].re[j], H_NEON[l].re[j], fabs(H_C[l].re[j] * 0.00001f));
-      EXPECT_NEAR(H_C[l].im[j], H_NEON[l].im[j], fabs(H_C[l].im[j] * 0.00001f));
-    }
-  }
-
-  ApplyFilter_NEON(render_buffer, H_NEON, &S_NEON);
-  ApplyFilter(render_buffer, H_C, &S_C);
-  for (size_t j = 0; j < S_C.re.size(); ++j) {
-    EXPECT_NEAR(S_C.re[j], S_NEON.re[j], fabs(S_C.re[j] * 0.00001f));
-    EXPECT_NEAR(S_C.im[j], S_NEON.im[j], fabs(S_C.re[j] * 0.00001f));
-  }
-}
-
-// Verifies that the optimized method for frequency response computation is
-// bitexact to the reference counterpart.
-TEST(AdaptiveFirFilter, UpdateFrequencyResponseNeonOptimization) {
-  const size_t kNumPartitions = 12;
-  std::vector<FftData> H(kNumPartitions);
-  std::vector<std::array<float, kFftLengthBy2Plus1>> H2(kNumPartitions);
-  std::vector<std::array<float, kFftLengthBy2Plus1>> H2_NEON(kNumPartitions);
-
-  for (size_t j = 0; j < H.size(); ++j) {
-    for (size_t k = 0; k < H[j].re.size(); ++k) {
-      H[j].re[k] = k + j / 3.f;
-      H[j].im[k] = j + k / 7.f;
-    }
-  }
-
-  UpdateFrequencyResponse(H, &H2);
-  UpdateFrequencyResponse_NEON(H, &H2_NEON);
-
-  for (size_t j = 0; j < H2.size(); ++j) {
-    for (size_t k = 0; k < H[j].re.size(); ++k) {
-      EXPECT_FLOAT_EQ(H2[j][k], H2_NEON[j][k]);
-    }
-  }
-}
-
-// Verifies that the optimized method for echo return loss computation is
-// bitexact to the reference counterpart.
-TEST(AdaptiveFirFilter, UpdateErlNeonOptimization) {
-  const size_t kNumPartitions = 12;
-  std::vector<std::array<float, kFftLengthBy2Plus1>> H2(kNumPartitions);
-  std::array<float, kFftLengthBy2Plus1> erl;
-  std::array<float, kFftLengthBy2Plus1> erl_NEON;
-
-  for (size_t j = 0; j < H2.size(); ++j) {
-    for (size_t k = 0; k < H2[j].size(); ++k) {
-      H2[j][k] = k + j / 3.f;
-    }
-  }
-
-  UpdateErlEstimator(H2, &erl);
-  UpdateErlEstimator_NEON(H2, &erl_NEON);
-
-  for (size_t j = 0; j < erl.size(); ++j) {
-    EXPECT_FLOAT_EQ(erl[j], erl_NEON[j]);
-  }
-}
-
-#endif
-
-#if defined(WEBRTC_ARCH_X86_FAMILY)
-// Verifies that the optimized methods for filter adaptation are bitexact to
-// their reference counterparts.
-TEST(AdaptiveFirFilter, FilterAdaptationSse2Optimizations) {
-  bool use_sse2 = (WebRtc_GetCPUInfo(kSSE2) != 0);
-  if (use_sse2) {
-    RenderBuffer render_buffer(Aec3Optimization::kNone, 3, 12,
-                               std::vector<size_t>(1, 12));
-    Random random_generator(42U);
-    std::vector<std::vector<float>> x(3, std::vector<float>(kBlockSize, 0.f));
-    FftData S_C;
-    FftData S_SSE2;
-    FftData G;
-    Aec3Fft fft;
-    std::vector<FftData> H_C(10);
-    std::vector<FftData> H_SSE2(10);
-    for (auto& H_j : H_C) {
-      H_j.Clear();
-    }
-    for (auto& H_j : H_SSE2) {
-      H_j.Clear();
-    }
-
-    for (size_t k = 0; k < 500; ++k) {
-      RandomizeSampleVector(&random_generator, x[0]);
-      render_buffer.Insert(x);
-
-      ApplyFilter_SSE2(render_buffer, H_SSE2, &S_SSE2);
-      ApplyFilter(render_buffer, H_C, &S_C);
-      for (size_t j = 0; j < S_C.re.size(); ++j) {
-        EXPECT_FLOAT_EQ(S_C.re[j], S_SSE2.re[j]);
-        EXPECT_FLOAT_EQ(S_C.im[j], S_SSE2.im[j]);
-      }
-
-      std::for_each(G.re.begin(), G.re.end(),
-                    [&](float& a) { a = random_generator.Rand<float>(); });
-      std::for_each(G.im.begin(), G.im.end(),
-                    [&](float& a) { a = random_generator.Rand<float>(); });
-
-      AdaptPartitions_SSE2(render_buffer, G, H_SSE2);
-      AdaptPartitions(render_buffer, G, H_C);
-
-      for (size_t k = 0; k < H_C.size(); ++k) {
-        for (size_t j = 0; j < H_C[k].re.size(); ++j) {
-          EXPECT_FLOAT_EQ(H_C[k].re[j], H_SSE2[k].re[j]);
-          EXPECT_FLOAT_EQ(H_C[k].im[j], H_SSE2[k].im[j]);
-        }
-      }
-    }
-  }
-}
-
-// Verifies that the optimized method for frequency response computation is
-// bitexact to the reference counterpart.
-TEST(AdaptiveFirFilter, UpdateFrequencyResponseSse2Optimization) {
-  bool use_sse2 = (WebRtc_GetCPUInfo(kSSE2) != 0);
-  if (use_sse2) {
-    const size_t kNumPartitions = 12;
-    std::vector<FftData> H(kNumPartitions);
-    std::vector<std::array<float, kFftLengthBy2Plus1>> H2(kNumPartitions);
-    std::vector<std::array<float, kFftLengthBy2Plus1>> H2_SSE2(kNumPartitions);
-
-    for (size_t j = 0; j < H.size(); ++j) {
-      for (size_t k = 0; k < H[j].re.size(); ++k) {
-        H[j].re[k] = k + j / 3.f;
-        H[j].im[k] = j + k / 7.f;
-      }
-    }
-
-    UpdateFrequencyResponse(H, &H2);
-    UpdateFrequencyResponse_SSE2(H, &H2_SSE2);
-
-    for (size_t j = 0; j < H2.size(); ++j) {
-      for (size_t k = 0; k < H[j].re.size(); ++k) {
-        EXPECT_FLOAT_EQ(H2[j][k], H2_SSE2[j][k]);
-      }
-    }
-  }
-}
-
-// Verifies that the optimized method for echo return loss computation is
-// bitexact to the reference counterpart.
-TEST(AdaptiveFirFilter, UpdateErlSse2Optimization) {
-  bool use_sse2 = (WebRtc_GetCPUInfo(kSSE2) != 0);
-  if (use_sse2) {
-    const size_t kNumPartitions = 12;
-    std::vector<std::array<float, kFftLengthBy2Plus1>> H2(kNumPartitions);
-    std::array<float, kFftLengthBy2Plus1> erl;
-    std::array<float, kFftLengthBy2Plus1> erl_SSE2;
-
-    for (size_t j = 0; j < H2.size(); ++j) {
-      for (size_t k = 0; k < H2[j].size(); ++k) {
-        H2[j][k] = k + j / 3.f;
-      }
-    }
-
-    UpdateErlEstimator(H2, &erl);
-    UpdateErlEstimator_SSE2(H2, &erl_SSE2);
-
-    for (size_t j = 0; j < erl.size(); ++j) {
-      EXPECT_FLOAT_EQ(erl[j], erl_SSE2[j]);
-    }
-  }
-}
-
-#endif
-
-#if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
-// Verifies that the check for non-null data dumper works.
-TEST(AdaptiveFirFilter, NullDataDumper) {
-  EXPECT_DEATH(AdaptiveFirFilter(9, DetectOptimization(), nullptr), "");
-}
-
-// Verifies that the check for non-null filter output works.
-TEST(AdaptiveFirFilter, NullFilterOutput) {
-  ApmDataDumper data_dumper(42);
-  AdaptiveFirFilter filter(9, DetectOptimization(), &data_dumper);
-  RenderBuffer render_buffer(Aec3Optimization::kNone, 3,
-                             filter.SizePartitions(),
-                             std::vector<size_t>(1, filter.SizePartitions()));
-  EXPECT_DEATH(filter.Filter(render_buffer, nullptr), "");
-}
-
-#endif
-
-// Verifies that the filter statistics can be accessed when filter statistics
-// are turned on.
-TEST(AdaptiveFirFilter, FilterStatisticsAccess) {
-  ApmDataDumper data_dumper(42);
-  AdaptiveFirFilter filter(9, DetectOptimization(), &data_dumper);
-  filter.Erl();
-  filter.FilterFrequencyResponse();
-}
-
-// Verifies that the filter size if correctly repported.
-TEST(AdaptiveFirFilter, FilterSize) {
-  ApmDataDumper data_dumper(42);
-  for (size_t filter_size = 1; filter_size < 5; ++filter_size) {
-    AdaptiveFirFilter filter(filter_size, DetectOptimization(), &data_dumper);
-    EXPECT_EQ(filter_size, filter.SizePartitions());
-  }
-}
-
-// Verifies that the filter is being able to properly filter a signal and to
-// adapt its coefficients.
-TEST(AdaptiveFirFilter, FilterAndAdapt) {
-  constexpr size_t kNumBlocksToProcess = 500;
-  ApmDataDumper data_dumper(42);
-  AdaptiveFirFilter filter(9, DetectOptimization(), &data_dumper);
-  Aec3Fft fft;
-  RenderBuffer render_buffer(Aec3Optimization::kNone, 3,
-                             filter.SizePartitions(),
-                             std::vector<size_t>(1, filter.SizePartitions()));
-  ShadowFilterUpdateGain gain;
-  Random random_generator(42U);
-  std::vector<std::vector<float>> x(3, std::vector<float>(kBlockSize, 0.f));
-  std::vector<float> n(kBlockSize, 0.f);
-  std::vector<float> y(kBlockSize, 0.f);
-  AecState aec_state(AudioProcessing::Config::EchoCanceller3{});
-  RenderSignalAnalyzer render_signal_analyzer;
-  std::vector<float> e(kBlockSize, 0.f);
-  std::array<float, kFftLength> s_scratch;
-  std::array<float, kBlockSize> s;
-  FftData S;
-  FftData G;
-  FftData E;
-  std::array<float, kFftLengthBy2Plus1> Y2;
-  std::array<float, kFftLengthBy2Plus1> E2_main;
-  std::array<float, kFftLengthBy2Plus1> E2_shadow;
-  // [B,A] = butter(2,100/8000,'high')
-  constexpr CascadedBiQuadFilter::BiQuadCoefficients
-      kHighPassFilterCoefficients = {{0.97261f, -1.94523f, 0.97261f},
-                                     {-1.94448f, 0.94598f}};
-  Y2.fill(0.f);
-  E2_main.fill(0.f);
-  E2_shadow.fill(0.f);
-
-  constexpr float kScale = 1.0f / kFftLengthBy2;
-
-  for (size_t delay_samples : {0, 64, 150, 200, 301}) {
-    DelayBuffer<float> delay_buffer(delay_samples);
-    CascadedBiQuadFilter x_hp_filter(kHighPassFilterCoefficients, 1);
-    CascadedBiQuadFilter y_hp_filter(kHighPassFilterCoefficients, 1);
-
-    SCOPED_TRACE(ProduceDebugText(delay_samples));
-    for (size_t k = 0; k < kNumBlocksToProcess; ++k) {
-      RandomizeSampleVector(&random_generator, x[0]);
-      delay_buffer.Delay(x[0], y);
-
-      RandomizeSampleVector(&random_generator, n);
-      static constexpr float kNoiseScaling = 1.f / 100.f;
-      std::transform(
-          y.begin(), y.end(), n.begin(), y.begin(),
-          [](float a, float b) { return a + b * kNoiseScaling; });
-
-      x_hp_filter.Process(x[0]);
-      y_hp_filter.Process(y);
-
-      render_buffer.Insert(x);
-      render_signal_analyzer.Update(render_buffer, aec_state.FilterDelay());
-
-      filter.Filter(render_buffer, &S);
-      fft.Ifft(S, &s_scratch);
-      std::transform(y.begin(), y.end(), s_scratch.begin() + kFftLengthBy2,
-                     e.begin(),
-                     [&](float a, float b) { return a - b * kScale; });
-      std::for_each(e.begin(), e.end(),
-                    [](float& a) { a = rtc::SafeClamp(a, -32768.f, 32767.f); });
-      fft.ZeroPaddedFft(e, &E);
-      for (size_t k = 0; k < kBlockSize; ++k) {
-        s[k] = kScale * s_scratch[k + kFftLengthBy2];
-      }
-
-      gain.Compute(render_buffer, render_signal_analyzer, E,
-                   filter.SizePartitions(), false, &G);
-      filter.Adapt(render_buffer, G);
-      aec_state.HandleEchoPathChange(EchoPathVariability(false, false));
-      aec_state.Update(filter.FilterFrequencyResponse(),
-                       filter.FilterImpulseResponse(), rtc::Optional<size_t>(),
-                       render_buffer, E2_main, Y2, x[0], s, false);
-    }
-    // Verify that the filter is able to perform well.
-    EXPECT_LT(1000 * std::inner_product(e.begin(), e.end(), e.begin(), 0.f),
-              std::inner_product(y.begin(), y.end(), y.begin(), 0.f));
-    ASSERT_TRUE(aec_state.FilterDelay());
-    EXPECT_EQ(delay_samples / kBlockSize, *aec_state.FilterDelay());
-  }
-}
-}  // namespace aec3
-}  // namespace webrtc
diff --git a/modules/audio_processing/aec3/aec3_common.cc b/modules/audio_processing/aec3/aec3_common.cc
deleted file mode 100644
index ae06247..0000000
--- a/modules/audio_processing/aec3/aec3_common.cc
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- *  Copyright (c) 2017 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_processing/aec3/aec3_common.h"
-
-#include "webrtc/typedefs.h"
-#include "webrtc/system_wrappers/include/cpu_features_wrapper.h"
-
-namespace webrtc {
-
-Aec3Optimization DetectOptimization() {
-#if defined(WEBRTC_ARCH_X86_FAMILY)
-  if (WebRtc_GetCPUInfo(kSSE2) != 0) {
-    return Aec3Optimization::kSse2;
-  }
-#endif
-
-#if defined(WEBRTC_HAS_NEON)
-  return Aec3Optimization::kNeon;
-#endif
-
-  return Aec3Optimization::kNone;
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/aec3/aec3_common.h b/modules/audio_processing/aec3/aec3_common.h
deleted file mode 100644
index feb5bdb..0000000
--- a/modules/audio_processing/aec3/aec3_common.h
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- *  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_PROCESSING_AEC3_AEC3_COMMON_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_AEC3_AEC3_COMMON_H_
-
-#include <stddef.h>
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-#ifdef _MSC_VER /* visual c++ */
-#define ALIGN16_BEG __declspec(align(16))
-#define ALIGN16_END
-#else /* gcc or icc */
-#define ALIGN16_BEG
-#define ALIGN16_END __attribute__((aligned(16)))
-#endif
-
-enum class Aec3Optimization { kNone, kSse2, kNeon };
-
-constexpr int kNumBlocksPerSecond = 250;
-
-constexpr int kMetricsReportingIntervalBlocks = 10 * kNumBlocksPerSecond;
-constexpr int kMetricsComputationBlocks = 9;
-constexpr int kMetricsCollectionBlocks =
-    kMetricsReportingIntervalBlocks - kMetricsComputationBlocks;
-
-constexpr size_t kFftLengthBy2 = 64;
-constexpr size_t kFftLengthBy2Plus1 = kFftLengthBy2 + 1;
-constexpr size_t kFftLengthBy2Minus1 = kFftLengthBy2 - 1;
-constexpr size_t kFftLength = 2 * kFftLengthBy2;
-
-constexpr int kAdaptiveFilterLength = 12;
-constexpr int kResidualEchoPowerRenderWindowSize = 30;
-constexpr int kAdaptiveFilterTimeDomainLength =
-    kAdaptiveFilterLength * kFftLengthBy2;
-
-constexpr size_t kMaxNumBands = 3;
-constexpr size_t kSubFrameLength = 80;
-
-constexpr size_t kBlockSize = kFftLengthBy2;
-constexpr size_t kExtendedBlockSize = 2 * kFftLengthBy2;
-constexpr size_t kSubBlockSize = 16;
-
-constexpr size_t kNumMatchedFilters = 4;
-constexpr size_t kMatchedFilterWindowSizeSubBlocks = 32;
-constexpr size_t kMatchedFilterAlignmentShiftSizeSubBlocks =
-    kMatchedFilterWindowSizeSubBlocks * 3 / 4;
-constexpr size_t kDownsampledRenderBufferSize =
-    kSubBlockSize *
-    (kMatchedFilterAlignmentShiftSizeSubBlocks * kNumMatchedFilters +
-     kMatchedFilterWindowSizeSubBlocks +
-     1);
-
-constexpr size_t kRenderDelayBufferSize =
-    (3 * kDownsampledRenderBufferSize) / (4 * kSubBlockSize);
-
-constexpr size_t kMinEchoPathDelayBlocks = 5;
-constexpr size_t kMaxApiCallsJitterBlocks = 26;
-constexpr size_t kRenderTransferQueueSize = kMaxApiCallsJitterBlocks / 2;
-static_assert(2 * kRenderTransferQueueSize >= kMaxApiCallsJitterBlocks,
-              "Requirement to ensure buffer overflow detection");
-
-// TODO(peah): Integrate this with how it is done inside audio_processing_impl.
-constexpr size_t NumBandsForRate(int sample_rate_hz) {
-  return static_cast<size_t>(sample_rate_hz == 8000 ? 1
-                                                    : sample_rate_hz / 16000);
-}
-constexpr int LowestBandRate(int sample_rate_hz) {
-  return sample_rate_hz == 8000 ? sample_rate_hz : 16000;
-}
-
-constexpr bool ValidFullBandRate(int sample_rate_hz) {
-  return sample_rate_hz == 8000 || sample_rate_hz == 16000 ||
-         sample_rate_hz == 32000 || sample_rate_hz == 48000;
-}
-
-// Detects what kind of optimizations to use for the code.
-Aec3Optimization DetectOptimization();
-
-static_assert(1 == NumBandsForRate(8000), "Number of bands for 8 kHz");
-static_assert(1 == NumBandsForRate(16000), "Number of bands for 16 kHz");
-static_assert(2 == NumBandsForRate(32000), "Number of bands for 32 kHz");
-static_assert(3 == NumBandsForRate(48000), "Number of bands for 48 kHz");
-
-static_assert(8000 == LowestBandRate(8000), "Sample rate of band 0 for 8 kHz");
-static_assert(16000 == LowestBandRate(16000),
-              "Sample rate of band 0 for 16 kHz");
-static_assert(16000 == LowestBandRate(32000),
-              "Sample rate of band 0 for 32 kHz");
-static_assert(16000 == LowestBandRate(48000),
-              "Sample rate of band 0 for 48 kHz");
-
-static_assert(ValidFullBandRate(8000),
-              "Test that 8 kHz is a valid sample rate");
-static_assert(ValidFullBandRate(16000),
-              "Test that 16 kHz is a valid sample rate");
-static_assert(ValidFullBandRate(32000),
-              "Test that 32 kHz is a valid sample rate");
-static_assert(ValidFullBandRate(48000),
-              "Test that 48 kHz is a valid sample rate");
-static_assert(!ValidFullBandRate(8001),
-              "Test that 8001 Hz is not a valid sample rate");
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_AEC3_AEC3_COMMON_H_
diff --git a/modules/audio_processing/aec3/aec3_fft.cc b/modules/audio_processing/aec3/aec3_fft.cc
deleted file mode 100644
index cb06956..0000000
--- a/modules/audio_processing/aec3/aec3_fft.cc
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- *  Copyright (c) 2017 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_processing/aec3/aec3_fft.h"
-
-#include <algorithm>
-
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-
-// TODO(peah): Change x to be std::array once the rest of the code allows this.
-void Aec3Fft::ZeroPaddedFft(rtc::ArrayView<const float> x, FftData* X) const {
-  RTC_DCHECK(X);
-  RTC_DCHECK_EQ(kFftLengthBy2, x.size());
-  std::array<float, kFftLength> fft;
-  std::fill(fft.begin(), fft.begin() + kFftLengthBy2, 0.f);
-  std::copy(x.begin(), x.end(), fft.begin() + kFftLengthBy2);
-  Fft(&fft, X);
-}
-
-void Aec3Fft::PaddedFft(rtc::ArrayView<const float> x,
-                        rtc::ArrayView<float> x_old,
-                        FftData* X) const {
-  RTC_DCHECK(X);
-  RTC_DCHECK_EQ(kFftLengthBy2, x.size());
-  RTC_DCHECK_EQ(kFftLengthBy2, x_old.size());
-  std::array<float, kFftLength> fft;
-  std::copy(x_old.begin(), x_old.end(), fft.begin());
-  std::copy(x.begin(), x.end(), fft.begin() + x_old.size());
-  std::copy(x.begin(), x.end(), x_old.begin());
-  Fft(&fft, X);
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/aec3/aec3_fft.h b/modules/audio_processing/aec3/aec3_fft.h
deleted file mode 100644
index d8531d2..0000000
--- a/modules/audio_processing/aec3/aec3_fft.h
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- *  Copyright (c) 2017 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_PROCESSING_AEC3_AEC3_FFT_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_AEC3_AEC3_FFT_H_
-
-#include <array>
-
-#include "webrtc/api/array_view.h"
-#include "webrtc/modules/audio_processing/aec3/aec3_common.h"
-#include "webrtc/modules/audio_processing/aec3/fft_data.h"
-#include "webrtc/modules/audio_processing/utility/ooura_fft.h"
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace webrtc {
-
-// Wrapper class that provides 128 point real valued FFT functionality with the
-// FftData type.
-class Aec3Fft {
- public:
-  Aec3Fft() = default;
-  // Computes the FFT. Note that both the input and output are modified.
-  void Fft(std::array<float, kFftLength>* x, FftData* X) const {
-    RTC_DCHECK(x);
-    RTC_DCHECK(X);
-    ooura_fft_.Fft(x->data());
-    X->CopyFromPackedArray(*x);
-  }
-  // Computes the inverse Fft.
-  void Ifft(const FftData& X, std::array<float, kFftLength>* x) const {
-    RTC_DCHECK(x);
-    X.CopyToPackedArray(x);
-    ooura_fft_.InverseFft(x->data());
-  }
-
-  // Pads the input with kFftLengthBy2 initial zeros before computing the Fft.
-  void ZeroPaddedFft(rtc::ArrayView<const float> x, FftData* X) const;
-
-  // Concatenates the kFftLengthBy2 values long x and x_old before computing the
-  // Fft. After that, x is copied to x_old.
-  void PaddedFft(rtc::ArrayView<const float> x,
-                 rtc::ArrayView<float> x_old,
-                 FftData* X) const;
-
- private:
-  const OouraFft ooura_fft_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(Aec3Fft);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_AEC3_AEC3_FFT_H_
diff --git a/modules/audio_processing/aec3/aec3_fft_unittest.cc b/modules/audio_processing/aec3/aec3_fft_unittest.cc
deleted file mode 100644
index ae1f52e..0000000
--- a/modules/audio_processing/aec3/aec3_fft_unittest.cc
+++ /dev/null
@@ -1,211 +0,0 @@
-/*
- *  Copyright (c) 2017 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_processing/aec3/aec3_fft.h"
-
-#include <algorithm>
-
-#include "webrtc/test/gmock.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-#if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
-
-// Verifies that the check for non-null input in Fft works.
-TEST(Aec3Fft, NullFftInput) {
-  Aec3Fft fft;
-  FftData X;
-  EXPECT_DEATH(fft.Fft(nullptr, &X), "");
-}
-
-// Verifies that the check for non-null input in Fft works.
-TEST(Aec3Fft, NullFftOutput) {
-  Aec3Fft fft;
-  std::array<float, kFftLength> x;
-  EXPECT_DEATH(fft.Fft(&x, nullptr), "");
-}
-
-// Verifies that the check for non-null output in Ifft works.
-TEST(Aec3Fft, NullIfftOutput) {
-  Aec3Fft fft;
-  FftData X;
-  EXPECT_DEATH(fft.Ifft(X, nullptr), "");
-}
-
-// Verifies that the check for non-null output in ZeroPaddedFft works.
-TEST(Aec3Fft, NullZeroPaddedFftOutput) {
-  Aec3Fft fft;
-  std::array<float, kFftLengthBy2> x;
-  EXPECT_DEATH(fft.ZeroPaddedFft(x, nullptr), "");
-}
-
-// Verifies that the check for input length in ZeroPaddedFft works.
-TEST(Aec3Fft, ZeroPaddedFftWrongInputLength) {
-  Aec3Fft fft;
-  FftData X;
-  std::array<float, kFftLengthBy2 - 1> x;
-  EXPECT_DEATH(fft.ZeroPaddedFft(x, &X), "");
-}
-
-// Verifies that the check for non-null output in PaddedFft works.
-TEST(Aec3Fft, NullPaddedFftOutput) {
-  Aec3Fft fft;
-  std::array<float, kFftLengthBy2> x;
-  std::array<float, kFftLengthBy2> x_old;
-  EXPECT_DEATH(fft.PaddedFft(x, x_old, nullptr), "");
-}
-
-// Verifies that the check for input length in PaddedFft works.
-TEST(Aec3Fft, PaddedFftWrongInputLength) {
-  Aec3Fft fft;
-  FftData X;
-  std::array<float, kFftLengthBy2 - 1> x;
-  std::array<float, kFftLengthBy2> x_old;
-  EXPECT_DEATH(fft.PaddedFft(x, x_old, &X), "");
-}
-
-// Verifies that the check for length in the old value in PaddedFft works.
-TEST(Aec3Fft, PaddedFftWrongOldValuesLength) {
-  Aec3Fft fft;
-  FftData X;
-  std::array<float, kFftLengthBy2> x;
-  std::array<float, kFftLengthBy2 - 1> x_old;
-  EXPECT_DEATH(fft.PaddedFft(x, x_old, &X), "");
-}
-
-#endif
-
-// Verifies that Fft works as intended.
-TEST(Aec3Fft, Fft) {
-  Aec3Fft fft;
-  FftData X;
-  std::array<float, kFftLength> x;
-  x.fill(0.f);
-  fft.Fft(&x, &X);
-  EXPECT_THAT(X.re, ::testing::Each(0.f));
-  EXPECT_THAT(X.im, ::testing::Each(0.f));
-
-  x.fill(0.f);
-  x[0] = 1.f;
-  fft.Fft(&x, &X);
-  EXPECT_THAT(X.re, ::testing::Each(1.f));
-  EXPECT_THAT(X.im, ::testing::Each(0.f));
-
-  x.fill(1.f);
-  fft.Fft(&x, &X);
-  EXPECT_EQ(128.f, X.re[0]);
-  std::for_each(X.re.begin() + 1, X.re.end(),
-                [](float a) { EXPECT_EQ(0.f, a); });
-  EXPECT_THAT(X.im, ::testing::Each(0.f));
-}
-
-// Verifies that InverseFft works as intended.
-TEST(Aec3Fft, Ifft) {
-  Aec3Fft fft;
-  FftData X;
-  std::array<float, kFftLength> x;
-
-  X.re.fill(0.f);
-  X.im.fill(0.f);
-  fft.Ifft(X, &x);
-  EXPECT_THAT(x, ::testing::Each(0.f));
-
-  X.re.fill(1.f);
-  X.im.fill(0.f);
-  fft.Ifft(X, &x);
-  EXPECT_EQ(64.f, x[0]);
-  std::for_each(x.begin() + 1, x.end(), [](float a) { EXPECT_EQ(0.f, a); });
-
-  X.re.fill(0.f);
-  X.re[0] = 128;
-  X.im.fill(0.f);
-  fft.Ifft(X, &x);
-  EXPECT_THAT(x, ::testing::Each(64.f));
-}
-
-// Verifies that InverseFft and Fft work as intended.
-TEST(Aec3Fft, FftAndIfft) {
-  Aec3Fft fft;
-  FftData X;
-  std::array<float, kFftLength> x;
-  std::array<float, kFftLength> x_ref;
-
-  int v = 0;
-  for (int k = 0; k < 20; ++k) {
-    for (size_t j = 0; j < x.size(); ++j) {
-      x[j] = v++;
-      x_ref[j] = x[j] * 64.f;
-    }
-    fft.Fft(&x, &X);
-    fft.Ifft(X, &x);
-    for (size_t j = 0; j < x.size(); ++j) {
-      EXPECT_NEAR(x_ref[j], x[j], 0.001f);
-    }
-  }
-}
-
-// Verifies that ZeroPaddedFft work as intended.
-TEST(Aec3Fft, ZeroPaddedFft) {
-  Aec3Fft fft;
-  FftData X;
-  std::array<float, kFftLengthBy2> x_in;
-  std::array<float, kFftLength> x_ref;
-  std::array<float, kFftLength> x_out;
-
-  int v = 0;
-  x_ref.fill(0.f);
-  for (int k = 0; k < 20; ++k) {
-    for (size_t j = 0; j < x_in.size(); ++j) {
-      x_in[j] = v++;
-      x_ref[j + kFftLengthBy2] = x_in[j] * 64.f;
-    }
-    fft.ZeroPaddedFft(x_in, &X);
-    fft.Ifft(X, &x_out);
-    for (size_t j = 0; j < x_out.size(); ++j) {
-      EXPECT_NEAR(x_ref[j], x_out[j], 0.1f);
-    }
-  }
-}
-
-// Verifies that ZeroPaddedFft work as intended.
-TEST(Aec3Fft, PaddedFft) {
-  Aec3Fft fft;
-  FftData X;
-  std::array<float, kFftLengthBy2> x_in;
-  std::array<float, kFftLength> x_out;
-  std::array<float, kFftLengthBy2> x_old;
-  std::array<float, kFftLengthBy2> x_old_ref;
-  std::array<float, kFftLength> x_ref;
-
-  int v = 0;
-  x_old.fill(0.f);
-  for (int k = 0; k < 20; ++k) {
-    for (size_t j = 0; j < x_in.size(); ++j) {
-      x_in[j] = v++;
-    }
-
-    std::copy(x_old.begin(), x_old.end(), x_ref.begin());
-    std::copy(x_in.begin(), x_in.end(), x_ref.begin() + kFftLengthBy2);
-    std::copy(x_in.begin(), x_in.end(), x_old_ref.begin());
-    std::for_each(x_ref.begin(), x_ref.end(), [](float& a) { a *= 64.f; });
-
-    fft.PaddedFft(x_in, x_old, &X);
-    fft.Ifft(X, &x_out);
-
-    for (size_t j = 0; j < x_out.size(); ++j) {
-      EXPECT_NEAR(x_ref[j], x_out[j], 0.1f);
-    }
-
-    EXPECT_EQ(x_old_ref, x_old);
-  }
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/aec3/aec_state.cc b/modules/audio_processing/aec3/aec_state.cc
deleted file mode 100644
index 8323099..0000000
--- a/modules/audio_processing/aec3/aec_state.cc
+++ /dev/null
@@ -1,318 +0,0 @@
-/*
- *  Copyright (c) 2017 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_processing/aec3/aec_state.h"
-
-#include <math.h>
-#include <numeric>
-#include <vector>
-
-#include "webrtc/api/array_view.h"
-#include "webrtc/modules/audio_processing/logging/apm_data_dumper.h"
-#include "webrtc/rtc_base/atomicops.h"
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-namespace {
-
-// Computes delay of the adaptive filter.
-rtc::Optional<size_t> EstimateFilterDelay(
-    const std::vector<std::array<float, kFftLengthBy2Plus1>>&
-        adaptive_filter_frequency_response) {
-  const auto& H2 = adaptive_filter_frequency_response;
-
-  size_t reliable_delays_sum = 0;
-  size_t num_reliable_delays = 0;
-
-  constexpr size_t kUpperBin = kFftLengthBy2 - 5;
-  constexpr float kMinPeakMargin = 10.f;
-  const size_t kTailPartition = H2.size() - 1;
-  for (size_t k = 1; k < kUpperBin; ++k) {
-    // Find the maximum of H2[j].
-    int peak = 0;
-    for (size_t j = 0; j < H2.size(); ++j) {
-      if (H2[j][k] > H2[peak][k]) {
-        peak = j;
-      }
-    }
-
-    // Count the peak as a delay only if the peak is sufficiently larger than
-    // the tail.
-    if (kMinPeakMargin * H2[kTailPartition][k] < H2[peak][k]) {
-      reliable_delays_sum += peak;
-      ++num_reliable_delays;
-    }
-  }
-
-  // Return no delay if not sufficient delays have been found.
-  if (num_reliable_delays < 21) {
-    return rtc::Optional<size_t>();
-  }
-
-  const size_t delay = reliable_delays_sum / num_reliable_delays;
-  // Sanity check that the peak is not caused by a false strong DC-component in
-  // the filter.
-  for (size_t k = 1; k < kUpperBin; ++k) {
-    if (H2[delay][k] > H2[delay][0]) {
-      RTC_DCHECK_GT(H2.size(), delay);
-      return rtc::Optional<size_t>(delay);
-    }
-  }
-  return rtc::Optional<size_t>();
-}
-
-constexpr int kEchoPathChangeCounterInitial = kNumBlocksPerSecond / 5;
-constexpr int kEchoPathChangeCounterMax = 2 * kNumBlocksPerSecond;
-
-}  // namespace
-
-int AecState::instance_count_ = 0;
-
-AecState::AecState(const AudioProcessing::Config::EchoCanceller3& config)
-    : data_dumper_(
-          new ApmDataDumper(rtc::AtomicOps::Increment(&instance_count_))),
-      erle_estimator_(config.param.erle.min,
-                      config.param.erle.max_l,
-                      config.param.erle.max_h),
-      echo_path_change_counter_(kEchoPathChangeCounterInitial),
-      config_(config),
-      reverb_decay_(config_.param.ep_strength.default_len) {}
-
-AecState::~AecState() = default;
-
-void AecState::HandleEchoPathChange(
-    const EchoPathVariability& echo_path_variability) {
-  if (echo_path_variability.AudioPathChanged()) {
-    blocks_since_last_saturation_ = 0;
-    usable_linear_estimate_ = false;
-    echo_leakage_detected_ = false;
-    capture_signal_saturation_ = false;
-    echo_saturation_ = false;
-    previous_max_sample_ = 0.f;
-
-    if (echo_path_variability.delay_change) {
-      force_zero_gain_counter_ = 0;
-      blocks_with_filter_adaptation_ = 0;
-      render_received_ = false;
-      force_zero_gain_ = true;
-      echo_path_change_counter_ = kEchoPathChangeCounterMax;
-    }
-    if (echo_path_variability.gain_change) {
-      echo_path_change_counter_ = kEchoPathChangeCounterInitial;
-    }
-  }
-}
-
-void AecState::Update(const std::vector<std::array<float, kFftLengthBy2Plus1>>&
-                          adaptive_filter_frequency_response,
-                      const std::array<float, kAdaptiveFilterTimeDomainLength>&
-                          adaptive_filter_impulse_response,
-                      const rtc::Optional<size_t>& external_delay_samples,
-                      const RenderBuffer& render_buffer,
-                      const std::array<float, kFftLengthBy2Plus1>& E2_main,
-                      const std::array<float, kFftLengthBy2Plus1>& Y2,
-                      rtc::ArrayView<const float> x,
-                      const std::array<float, kBlockSize>& s,
-                      bool echo_leakage_detected) {
-  // Update the echo audibility evaluator.
-  echo_audibility_.Update(x, s);
-
-  // Store input parameters.
-  echo_leakage_detected_ = echo_leakage_detected;
-
-  // Update counters.
-  const float x_energy = std::inner_product(x.begin(), x.end(), x.begin(), 0.f);
-
-  const bool active_render_block =
-      x_energy > (config_.param.render_levels.active_render_limit *
-                  config_.param.render_levels.active_render_limit) *
-                     kFftLengthBy2;
-  if (active_render_block) {
-    render_received_ = true;
-  }
-  blocks_with_filter_adaptation_ +=
-      (active_render_block && (!SaturatedCapture()) ? 1 : 0);
-  --echo_path_change_counter_;
-
-  // Force zero echo suppression gain after an echo path change to allow at
-  // least some render data to be collected in order to avoid an initial echo
-  // burst.
-  constexpr size_t kZeroGainBlocksAfterChange = kNumBlocksPerSecond / 5;
-  force_zero_gain_ = (++force_zero_gain_counter_) < kZeroGainBlocksAfterChange;
-
-  // Estimate delays.
-  filter_delay_ = EstimateFilterDelay(adaptive_filter_frequency_response);
-  external_delay_ =
-      external_delay_samples
-          ? rtc::Optional<size_t>(*external_delay_samples / kBlockSize)
-          : rtc::Optional<size_t>();
-
-  // Update the ERL and ERLE measures.
-  if (filter_delay_ && echo_path_change_counter_ <= 0) {
-    const auto& X2 = render_buffer.Spectrum(*filter_delay_);
-    erle_estimator_.Update(X2, Y2, E2_main);
-    erl_estimator_.Update(X2, Y2);
-  }
-
-  // Detect and flag echo saturation.
-  // TODO(peah): Add the delay in this computation to ensure that the render and
-  // capture signals are properly aligned.
-  RTC_DCHECK_LT(0, x.size());
-  const float max_sample = fabs(*std::max_element(
-      x.begin(), x.end(), [](float a, float b) { return a * a < b * b; }));
-  const bool saturated_echo =
-      previous_max_sample_ * 100 > 1600 && SaturatedCapture();
-  previous_max_sample_ = max_sample;
-
-  // Counts the blocks since saturation.
-  constexpr size_t kSaturationLeakageBlocks = 20;
-  blocks_since_last_saturation_ =
-      saturated_echo ? 0 : blocks_since_last_saturation_ + 1;
-  echo_saturation_ = blocks_since_last_saturation_ < kSaturationLeakageBlocks;
-
-  // Flag whether the linear filter estimate is usable.
-  constexpr size_t kEchoPathChangeConvergenceBlocks = 2 * kNumBlocksPerSecond;
-  usable_linear_estimate_ =
-      (!echo_saturation_) &&
-      (!render_received_ ||
-       blocks_with_filter_adaptation_ > kEchoPathChangeConvergenceBlocks) &&
-      filter_delay_ && echo_path_change_counter_ <= 0 && external_delay_;
-
-  // After an amount of active render samples for which an echo should have been
-  // detected in the capture signal if the ERL was not infinite, flag that a
-  // headset is used.
-  constexpr size_t kHeadSetDetectionBlocks = 5 * kNumBlocksPerSecond;
-  headset_detected_ = !external_delay_ && !filter_delay_ &&
-                      (!render_received_ || blocks_with_filter_adaptation_ >=
-                                                kHeadSetDetectionBlocks);
-
-  // Update the room reverb estimate.
-  UpdateReverb(adaptive_filter_impulse_response);
-}
-
-void AecState::UpdateReverb(
-    const std::array<float, kAdaptiveFilterTimeDomainLength>&
-        impulse_response) {
-  if ((!(filter_delay_ && usable_linear_estimate_)) ||
-      (*filter_delay_ > kAdaptiveFilterLength - 4)) {
-    return;
-  }
-
-  // Form the data to match against by squaring the impulse response
-  // coefficients.
-  std::array<float, kAdaptiveFilterTimeDomainLength> matching_data;
-  std::transform(impulse_response.begin(), impulse_response.end(),
-                 matching_data.begin(), [](float a) { return a * a; });
-
-  // Avoid matching against noise in the model by subtracting an estimate of the
-  // model noise power.
-  constexpr size_t kTailLength = 64;
-  constexpr size_t tail_index = kAdaptiveFilterTimeDomainLength - kTailLength;
-  const float tail_power = *std::max_element(matching_data.begin() + tail_index,
-                                             matching_data.end());
-  std::for_each(matching_data.begin(), matching_data.begin() + tail_index,
-                [tail_power](float& a) { a = std::max(0.f, a - tail_power); });
-
-  // Identify the peak index of the impulse response.
-  const size_t peak_index = *std::max_element(
-      matching_data.begin(), matching_data.begin() + tail_index);
-
-  if (peak_index + 128 < tail_index) {
-    size_t start_index = peak_index + 64;
-    // Compute the matching residual error for the current candidate to match.
-    float residual_sqr_sum = 0.f;
-    float d_k = reverb_decay_to_test_;
-    for (size_t k = start_index; k < tail_index; ++k) {
-      if (matching_data[start_index + 1] == 0.f) {
-        break;
-      }
-
-      float residual = matching_data[k] - matching_data[peak_index] * d_k;
-      residual_sqr_sum += residual * residual;
-      d_k *= reverb_decay_to_test_;
-    }
-
-    // If needed, update the best candidate for the reverb decay.
-    if (reverb_decay_candidate_residual_ < 0.f ||
-        residual_sqr_sum < reverb_decay_candidate_residual_) {
-      reverb_decay_candidate_residual_ = residual_sqr_sum;
-      reverb_decay_candidate_ = reverb_decay_to_test_;
-    }
-  }
-
-  // Compute the next reverb candidate to evaluate such that all candidates will
-  // be evaluated within one second.
-  reverb_decay_to_test_ += (0.9965f - 0.9f) / (5 * kNumBlocksPerSecond);
-
-  // If all reverb candidates have been evaluated, choose the best one as the
-  // reverb decay.
-  if (reverb_decay_to_test_ >= 0.9965f) {
-    if (reverb_decay_candidate_residual_ < 0.f) {
-      // Transform the decay to be in the unit of blocks.
-      reverb_decay_ = powf(reverb_decay_candidate_, kFftLengthBy2);
-
-      // Limit the estimated reverb_decay_ to the maximum one needed in practice
-      // to minimize the impact of incorrect estimates.
-      reverb_decay_ =
-          std::min(config_.param.ep_strength.default_len, reverb_decay_);
-    }
-    reverb_decay_to_test_ = 0.9f;
-    reverb_decay_candidate_residual_ = -1.f;
-  }
-
-  // For noisy impulse responses, assume a fixed tail length.
-  if (tail_power > 0.0005f) {
-    reverb_decay_ = config_.param.ep_strength.default_len;
-  }
-  data_dumper_->DumpRaw("aec3_reverb_decay", reverb_decay_);
-  data_dumper_->DumpRaw("aec3_tail_power", tail_power);
-}
-
-void AecState::EchoAudibility::Update(rtc::ArrayView<const float> x,
-                                      const std::array<float, kBlockSize>& s) {
-  auto result_x = std::minmax_element(x.begin(), x.end());
-  auto result_s = std::minmax_element(s.begin(), s.end());
-  const float x_abs =
-      std::max(std::abs(*result_x.first), std::abs(*result_x.second));
-  const float s_abs =
-      std::max(std::abs(*result_s.first), std::abs(*result_s.second));
-
-  if (x_abs < 5.f) {
-    ++low_farend_counter_;
-  } else {
-    low_farend_counter_ = 0;
-  }
-
-  // The echo is deemed as not audible if the echo estimate is on the level of
-  // the quantization noise in the FFTs and the nearend level is sufficiently
-  // strong to mask that by ensuring that the playout and AGC gains do not boost
-  // any residual echo that is below the quantization noise level. Furthermore,
-  // cases where the render signal is very close to zero are also identified as
-  // not producing audible echo.
-  inaudible_echo_ = max_nearend_ > 500 && s_abs < 30.f;
-  inaudible_echo_ = inaudible_echo_ || low_farend_counter_ > 20;
-}
-
-void AecState::EchoAudibility::UpdateWithOutput(rtc::ArrayView<const float> e) {
-  const float e_max = *std::max_element(e.begin(), e.end());
-  const float e_min = *std::min_element(e.begin(), e.end());
-  const float e_abs = std::max(std::abs(e_max), std::abs(e_min));
-
-  if (max_nearend_ < e_abs) {
-    max_nearend_ = e_abs;
-    max_nearend_counter_ = 0;
-  } else {
-    if (++max_nearend_counter_ > 5 * kNumBlocksPerSecond) {
-      max_nearend_ *= 0.995f;
-    }
-  }
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/aec3/aec_state.h b/modules/audio_processing/aec3/aec_state.h
deleted file mode 100644
index 38ed3b0..0000000
--- a/modules/audio_processing/aec3/aec_state.h
+++ /dev/null
@@ -1,156 +0,0 @@
-/*
- *  Copyright (c) 2017 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_PROCESSING_AEC3_AEC_STATE_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_AEC3_AEC_STATE_H_
-
-#include <algorithm>
-#include <memory>
-#include <vector>
-
-#include "webrtc/api/array_view.h"
-#include "webrtc/api/optional.h"
-#include "webrtc/modules/audio_processing/aec3/aec3_common.h"
-#include "webrtc/modules/audio_processing/aec3/echo_path_variability.h"
-#include "webrtc/modules/audio_processing/aec3/erl_estimator.h"
-#include "webrtc/modules/audio_processing/aec3/erle_estimator.h"
-#include "webrtc/modules/audio_processing/aec3/render_buffer.h"
-#include "webrtc/modules/audio_processing/include/audio_processing.h"
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace webrtc {
-
-class ApmDataDumper;
-
-// Handles the state and the conditions for the echo removal functionality.
-class AecState {
- public:
-  explicit AecState(const AudioProcessing::Config::EchoCanceller3& config);
-  ~AecState();
-
-  // Returns whether the linear filter estimate is usable.
-  bool UsableLinearEstimate() const { return usable_linear_estimate_; }
-
-  // Returns whether there has been echo leakage detected.
-  bool EchoLeakageDetected() const { return echo_leakage_detected_; }
-
-  // Returns whether the render signal is currently active.
-  // TODO(peah): Deprecate this in an upcoming CL.
-  bool ActiveRender() const { return blocks_with_filter_adaptation_ > 200; }
-
-  // Returns the ERLE.
-  const std::array<float, kFftLengthBy2Plus1>& Erle() const {
-    return erle_estimator_.Erle();
-  }
-
-  // Returns the ERL.
-  const std::array<float, kFftLengthBy2Plus1>& Erl() const {
-    return erl_estimator_.Erl();
-  }
-
-  // Returns the delay estimate based on the linear filter.
-  rtc::Optional<size_t> FilterDelay() const { return filter_delay_; }
-
-  // Returns the externally provided delay.
-  rtc::Optional<size_t> ExternalDelay() const { return external_delay_; }
-
-  // Returns whether the capture signal is saturated.
-  bool SaturatedCapture() const { return capture_signal_saturation_; }
-
-  // Returns whether the echo signal is saturated.
-  bool SaturatedEcho() const { return echo_saturation_; }
-
-  // Updates the capture signal saturation.
-  void UpdateCaptureSaturation(bool capture_signal_saturation) {
-    capture_signal_saturation_ = capture_signal_saturation;
-  }
-
-  // Returns whether a probable headset setup has been detected.
-  bool HeadsetDetected() const { return headset_detected_; }
-
-  // Takes appropriate action at an echo path change.
-  void HandleEchoPathChange(const EchoPathVariability& echo_path_variability);
-
-  // Returns the decay factor for the echo reverberation.
-  float ReverbDecay() const { return reverb_decay_; }
-
-  // Returns whether the echo suppression gain should be forced to zero.
-  bool ForcedZeroGain() const { return force_zero_gain_; }
-
-  // Returns whether the echo in the capture signal is audible.
-  bool InaudibleEcho() const { return echo_audibility_.InaudibleEcho(); }
-
-  // Updates the aec state with the AEC output signal.
-  void UpdateWithOutput(rtc::ArrayView<const float> e) {
-    echo_audibility_.UpdateWithOutput(e);
-  }
-
-  // Updates the aec state.
-  void Update(const std::vector<std::array<float, kFftLengthBy2Plus1>>&
-                  adaptive_filter_frequency_response,
-              const std::array<float, kAdaptiveFilterTimeDomainLength>&
-                  adaptive_filter_impulse_response,
-              const rtc::Optional<size_t>& external_delay_samples,
-              const RenderBuffer& render_buffer,
-              const std::array<float, kFftLengthBy2Plus1>& E2_main,
-              const std::array<float, kFftLengthBy2Plus1>& Y2,
-              rtc::ArrayView<const float> x,
-              const std::array<float, kBlockSize>& s_main,
-              bool echo_leakage_detected);
-
- private:
-  class EchoAudibility {
-   public:
-    void Update(rtc::ArrayView<const float> x,
-                const std::array<float, kBlockSize>& s);
-    void UpdateWithOutput(rtc::ArrayView<const float> e);
-    bool InaudibleEcho() const { return inaudible_echo_; }
-
-   private:
-    float max_nearend_ = 0.f;
-    size_t max_nearend_counter_ = 0;
-    size_t low_farend_counter_ = 0;
-    bool inaudible_echo_ = false;
-  };
-
-  void UpdateReverb(const std::array<float, kAdaptiveFilterTimeDomainLength>&
-                        impulse_response);
-
-  static int instance_count_;
-  std::unique_ptr<ApmDataDumper> data_dumper_;
-  ErlEstimator erl_estimator_;
-  ErleEstimator erle_estimator_;
-  int echo_path_change_counter_;
-  size_t blocks_with_filter_adaptation_ = 0;
-  bool usable_linear_estimate_ = false;
-  bool echo_leakage_detected_ = false;
-  bool capture_signal_saturation_ = false;
-  bool echo_saturation_ = false;
-  bool headset_detected_ = false;
-  float previous_max_sample_ = 0.f;
-  bool force_zero_gain_ = false;
-  bool render_received_ = false;
-  size_t force_zero_gain_counter_ = 0;
-  rtc::Optional<size_t> filter_delay_;
-  rtc::Optional<size_t> external_delay_;
-  size_t blocks_since_last_saturation_ = 1000;
-  float reverb_decay_to_test_ = 0.9f;
-  float reverb_decay_candidate_ = 0.f;
-  float reverb_decay_candidate_residual_ = -1.f;
-  EchoAudibility echo_audibility_;
-  const AudioProcessing::Config::EchoCanceller3 config_;
-  float reverb_decay_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(AecState);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_AEC3_AEC_STATE_H_
diff --git a/modules/audio_processing/aec3/aec_state_unittest.cc b/modules/audio_processing/aec3/aec_state_unittest.cc
deleted file mode 100644
index 05530ca..0000000
--- a/modules/audio_processing/aec3/aec_state_unittest.cc
+++ /dev/null
@@ -1,269 +0,0 @@
-/*
- *  Copyright (c) 2017 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_processing/aec3/aec_state.h"
-
-#include "webrtc/modules/audio_processing/logging/apm_data_dumper.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-// Verify the general functionality of AecState
-TEST(AecState, NormalUsage) {
-  ApmDataDumper data_dumper(42);
-  AecState state(AudioProcessing::Config::EchoCanceller3{});
-  RenderBuffer render_buffer(Aec3Optimization::kNone, 3, 30,
-                             std::vector<size_t>(1, 30));
-  std::array<float, kFftLengthBy2Plus1> E2_main = {};
-  std::array<float, kFftLengthBy2Plus1> Y2 = {};
-  std::vector<std::vector<float>> x(3, std::vector<float>(kBlockSize, 0.f));
-  EchoPathVariability echo_path_variability(false, false);
-  std::array<float, kBlockSize> s;
-  s.fill(100.f);
-
-  std::vector<std::array<float, kFftLengthBy2Plus1>>
-      converged_filter_frequency_response(10);
-  for (auto& v : converged_filter_frequency_response) {
-    v.fill(0.01f);
-  }
-  std::vector<std::array<float, kFftLengthBy2Plus1>>
-      diverged_filter_frequency_response = converged_filter_frequency_response;
-  converged_filter_frequency_response[2].fill(100.f);
-  converged_filter_frequency_response[2][0] = 1.f;
-
-  std::array<float, kAdaptiveFilterTimeDomainLength> impulse_response;
-  impulse_response.fill(0.f);
-
-  // Verify that linear AEC usability is false when the filter is diverged and
-  // there is no external delay reported.
-  state.Update(diverged_filter_frequency_response, impulse_response,
-               rtc::Optional<size_t>(), render_buffer, E2_main, Y2, x[0], s,
-               false);
-  EXPECT_FALSE(state.UsableLinearEstimate());
-
-  // Verify that linear AEC usability is true when the filter is converged
-  std::fill(x[0].begin(), x[0].end(), 101.f);
-  for (int k = 0; k < 3000; ++k) {
-    state.Update(converged_filter_frequency_response, impulse_response,
-                 rtc::Optional<size_t>(2), render_buffer, E2_main, Y2, x[0], s,
-                 false);
-  }
-  EXPECT_TRUE(state.UsableLinearEstimate());
-
-  // Verify that linear AEC usability becomes false after an echo path change is
-  // reported
-  state.HandleEchoPathChange(EchoPathVariability(true, false));
-  state.Update(converged_filter_frequency_response, impulse_response,
-               rtc::Optional<size_t>(2), render_buffer, E2_main, Y2, x[0], s,
-               false);
-  EXPECT_FALSE(state.UsableLinearEstimate());
-
-  // Verify that the active render detection works as intended.
-  std::fill(x[0].begin(), x[0].end(), 101.f);
-  state.HandleEchoPathChange(EchoPathVariability(true, true));
-  state.Update(converged_filter_frequency_response, impulse_response,
-               rtc::Optional<size_t>(2), render_buffer, E2_main, Y2, x[0], s,
-               false);
-  EXPECT_FALSE(state.ActiveRender());
-
-  for (int k = 0; k < 1000; ++k) {
-    state.Update(converged_filter_frequency_response, impulse_response,
-                 rtc::Optional<size_t>(2), render_buffer, E2_main, Y2, x[0], s,
-                 false);
-  }
-  EXPECT_TRUE(state.ActiveRender());
-
-  // Verify that echo leakage is properly reported.
-  state.Update(converged_filter_frequency_response, impulse_response,
-               rtc::Optional<size_t>(2), render_buffer, E2_main, Y2, x[0], s,
-               false);
-  EXPECT_FALSE(state.EchoLeakageDetected());
-
-  state.Update(converged_filter_frequency_response, impulse_response,
-               rtc::Optional<size_t>(2), render_buffer, E2_main, Y2, x[0], s,
-               true);
-  EXPECT_TRUE(state.EchoLeakageDetected());
-
-  // Verify that the ERL is properly estimated
-  for (auto& x_k : x) {
-    x_k = std::vector<float>(kBlockSize, 0.f);
-  }
-
-  x[0][0] = 5000.f;
-  for (size_t k = 0; k < render_buffer.Buffer().size(); ++k) {
-    render_buffer.Insert(x);
-  }
-
-  Y2.fill(10.f * 10000.f * 10000.f);
-  for (size_t k = 0; k < 1000; ++k) {
-    state.Update(converged_filter_frequency_response, impulse_response,
-                 rtc::Optional<size_t>(2), render_buffer, E2_main, Y2, x[0], s,
-                 false);
-  }
-
-  ASSERT_TRUE(state.UsableLinearEstimate());
-  const std::array<float, kFftLengthBy2Plus1>& erl = state.Erl();
-  EXPECT_EQ(erl[0], erl[1]);
-  for (size_t k = 1; k < erl.size() - 1; ++k) {
-    EXPECT_NEAR(k % 2 == 0 ? 10.f : 1000.f, erl[k], 0.1);
-  }
-  EXPECT_EQ(erl[erl.size() - 2], erl[erl.size() - 1]);
-
-  // Verify that the ERLE is properly estimated
-  E2_main.fill(1.f * 10000.f * 10000.f);
-  Y2.fill(10.f * E2_main[0]);
-  for (size_t k = 0; k < 1000; ++k) {
-    state.Update(converged_filter_frequency_response, impulse_response,
-                 rtc::Optional<size_t>(2), render_buffer, E2_main, Y2, x[0], s,
-                 false);
-  }
-  ASSERT_TRUE(state.UsableLinearEstimate());
-  {
-    const auto& erle = state.Erle();
-    EXPECT_EQ(erle[0], erle[1]);
-    constexpr size_t kLowFrequencyLimit = 32;
-    for (size_t k = 1; k < kLowFrequencyLimit; ++k) {
-      EXPECT_NEAR(k % 2 == 0 ? 8.f : 1.f, erle[k], 0.1);
-    }
-    for (size_t k = kLowFrequencyLimit; k < erle.size() - 1; ++k) {
-      EXPECT_NEAR(k % 2 == 0 ? 1.5f : 1.f, erle[k], 0.1);
-    }
-    EXPECT_EQ(erle[erle.size() - 2], erle[erle.size() - 1]);
-  }
-
-  E2_main.fill(1.f * 10000.f * 10000.f);
-  Y2.fill(5.f * E2_main[0]);
-  for (size_t k = 0; k < 1000; ++k) {
-    state.Update(converged_filter_frequency_response, impulse_response,
-                 rtc::Optional<size_t>(2), render_buffer, E2_main, Y2, x[0], s,
-                 false);
-  }
-
-  ASSERT_TRUE(state.UsableLinearEstimate());
-  {
-    const auto& erle = state.Erle();
-    EXPECT_EQ(erle[0], erle[1]);
-    constexpr size_t kLowFrequencyLimit = 32;
-    for (size_t k = 1; k < kLowFrequencyLimit; ++k) {
-      EXPECT_NEAR(k % 2 == 0 ? 5.f : 1.f, erle[k], 0.1);
-    }
-    for (size_t k = kLowFrequencyLimit; k < erle.size() - 1; ++k) {
-      EXPECT_NEAR(k % 2 == 0 ? 1.5f : 1.f, erle[k], 0.1);
-    }
-    EXPECT_EQ(erle[erle.size() - 2], erle[erle.size() - 1]);
-  }
-}
-
-// Verifies the a non-significant delay is correctly identified.
-TEST(AecState, NonSignificantDelay) {
-  AecState state(AudioProcessing::Config::EchoCanceller3{});
-  RenderBuffer render_buffer(Aec3Optimization::kNone, 3, 30,
-                             std::vector<size_t>(1, 30));
-  std::array<float, kFftLengthBy2Plus1> E2_main;
-  std::array<float, kFftLengthBy2Plus1> Y2;
-  std::array<float, kBlockSize> x;
-  EchoPathVariability echo_path_variability(false, false);
-  std::array<float, kBlockSize> s;
-  s.fill(100.f);
-  x.fill(0.f);
-
-  std::vector<std::array<float, kFftLengthBy2Plus1>> frequency_response(30);
-  for (auto& v : frequency_response) {
-    v.fill(0.01f);
-  }
-
-  std::array<float, kAdaptiveFilterTimeDomainLength> impulse_response;
-  impulse_response.fill(0.f);
-
-  // Verify that a non-significant filter delay is identified correctly.
-  state.HandleEchoPathChange(echo_path_variability);
-  state.Update(frequency_response, impulse_response, rtc::Optional<size_t>(),
-               render_buffer, E2_main, Y2, x, s, false);
-  EXPECT_FALSE(state.FilterDelay());
-}
-
-// Verifies the delay for a converged filter is correctly identified.
-TEST(AecState, ConvergedFilterDelay) {
-  constexpr int kFilterLength = 10;
-  AecState state(AudioProcessing::Config::EchoCanceller3{});
-  RenderBuffer render_buffer(Aec3Optimization::kNone, 3, 30,
-                             std::vector<size_t>(1, 30));
-  std::array<float, kFftLengthBy2Plus1> E2_main;
-  std::array<float, kFftLengthBy2Plus1> Y2;
-  std::array<float, kBlockSize> x;
-  EchoPathVariability echo_path_variability(false, false);
-  std::array<float, kBlockSize> s;
-  s.fill(100.f);
-  x.fill(0.f);
-
-  std::vector<std::array<float, kFftLengthBy2Plus1>> frequency_response(
-      kFilterLength);
-
-  std::array<float, kAdaptiveFilterTimeDomainLength> impulse_response;
-  impulse_response.fill(0.f);
-
-  // Verify that the filter delay for a converged filter is properly identified.
-  for (int k = 0; k < kFilterLength; ++k) {
-    for (auto& v : frequency_response) {
-      v.fill(0.01f);
-    }
-    frequency_response[k].fill(100.f);
-    frequency_response[k][0] = 0.f;
-    state.HandleEchoPathChange(echo_path_variability);
-    state.Update(frequency_response, impulse_response, rtc::Optional<size_t>(),
-                 render_buffer, E2_main, Y2, x, s, false);
-    EXPECT_TRUE(k == (kFilterLength - 1) || state.FilterDelay());
-    if (k != (kFilterLength - 1)) {
-      EXPECT_EQ(k, state.FilterDelay());
-    }
-  }
-}
-
-// Verify that the externally reported delay is properly reported and converted.
-TEST(AecState, ExternalDelay) {
-  AecState state(AudioProcessing::Config::EchoCanceller3{});
-  std::array<float, kFftLengthBy2Plus1> E2_main;
-  std::array<float, kFftLengthBy2Plus1> E2_shadow;
-  std::array<float, kFftLengthBy2Plus1> Y2;
-  std::array<float, kBlockSize> x;
-  std::array<float, kBlockSize> s;
-  s.fill(100.f);
-  E2_main.fill(0.f);
-  E2_shadow.fill(0.f);
-  Y2.fill(0.f);
-  x.fill(0.f);
-  RenderBuffer render_buffer(Aec3Optimization::kNone, 3, 30,
-                             std::vector<size_t>(1, 30));
-  std::vector<std::array<float, kFftLengthBy2Plus1>> frequency_response(30);
-  for (auto& v : frequency_response) {
-    v.fill(0.01f);
-  }
-
-  std::array<float, kAdaptiveFilterTimeDomainLength> impulse_response;
-  impulse_response.fill(0.f);
-
-  for (size_t k = 0; k < frequency_response.size() - 1; ++k) {
-    state.HandleEchoPathChange(EchoPathVariability(false, false));
-    state.Update(frequency_response, impulse_response,
-                 rtc::Optional<size_t>(k * kBlockSize + 5), render_buffer,
-                 E2_main, Y2, x, s, false);
-    EXPECT_TRUE(state.ExternalDelay());
-    EXPECT_EQ(k, state.ExternalDelay());
-  }
-
-  // Verify that the externally reported delay is properly unset when it is no
-  // longer present.
-  state.HandleEchoPathChange(EchoPathVariability(false, false));
-  state.Update(frequency_response, impulse_response, rtc::Optional<size_t>(),
-               render_buffer, E2_main, Y2, x, s, false);
-  EXPECT_FALSE(state.ExternalDelay());
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/aec3/block_framer.cc b/modules/audio_processing/aec3/block_framer.cc
deleted file mode 100644
index 80ac836..0000000
--- a/modules/audio_processing/aec3/block_framer.cc
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- *  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_processing/aec3/block_framer.h"
-
-#include <algorithm>
-
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-
-BlockFramer::BlockFramer(size_t num_bands)
-    : num_bands_(num_bands),
-      buffer_(num_bands_, std::vector<float>(kBlockSize, 0.f)) {}
-
-BlockFramer::~BlockFramer() = default;
-
-// All the constants are chosen so that the buffer is either empty or has enough
-// samples for InsertBlockAndExtractSubFrame to produce a frame. In order to
-// achieve this, the InsertBlockAndExtractSubFrame and InsertBlock methods need
-// to be called in the correct order.
-void BlockFramer::InsertBlock(const std::vector<std::vector<float>>& block) {
-  RTC_DCHECK_EQ(num_bands_, block.size());
-  for (size_t i = 0; i < num_bands_; ++i) {
-    RTC_DCHECK_EQ(kBlockSize, block[i].size());
-    RTC_DCHECK_EQ(0, buffer_[i].size());
-    buffer_[i].insert(buffer_[i].begin(), block[i].begin(), block[i].end());
-  }
-}
-
-void BlockFramer::InsertBlockAndExtractSubFrame(
-    const std::vector<std::vector<float>>& block,
-    std::vector<rtc::ArrayView<float>>* sub_frame) {
-  RTC_DCHECK(sub_frame);
-  RTC_DCHECK_EQ(num_bands_, block.size());
-  RTC_DCHECK_EQ(num_bands_, sub_frame->size());
-  for (size_t i = 0; i < num_bands_; ++i) {
-    RTC_DCHECK_LE(kSubFrameLength, buffer_[i].size() + kBlockSize);
-    RTC_DCHECK_EQ(kBlockSize, block[i].size());
-    RTC_DCHECK_GE(kBlockSize, buffer_[i].size());
-    RTC_DCHECK_EQ(kSubFrameLength, (*sub_frame)[i].size());
-    const int samples_to_frame = kSubFrameLength - buffer_[i].size();
-    std::copy(buffer_[i].begin(), buffer_[i].end(), (*sub_frame)[i].begin());
-    std::copy(block[i].begin(), block[i].begin() + samples_to_frame,
-              (*sub_frame)[i].begin() + buffer_[i].size());
-    buffer_[i].clear();
-    buffer_[i].insert(buffer_[i].begin(), block[i].begin() + samples_to_frame,
-                      block[i].end());
-  }
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/aec3/block_framer.h b/modules/audio_processing/aec3/block_framer.h
deleted file mode 100644
index de7c79a..0000000
--- a/modules/audio_processing/aec3/block_framer.h
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- *  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_PROCESSING_AEC3_BLOCK_FRAMER_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_AEC3_BLOCK_FRAMER_H_
-
-#include <vector>
-
-#include "webrtc/api/array_view.h"
-#include "webrtc/modules/audio_processing/aec3/aec3_common.h"
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace webrtc {
-
-// Class for producing frames consisting of 1 or 2 subframes of 80 samples each
-// from 64 sample blocks. The class is designed to work together with the
-// FrameBlocker class which performs the reverse conversion. Used together with
-// that, this class produces output frames are the same rate as frames are
-// received by the FrameBlocker class. Note that the internal buffers will
-// overrun if any other rate of packets insertion is used.
-class BlockFramer {
- public:
-  explicit BlockFramer(size_t num_bands);
-  ~BlockFramer();
-  // Adds a 64 sample block into the data that will form the next output frame.
-  void InsertBlock(const std::vector<std::vector<float>>& block);
-  // Adds a 64 sample block and extracts an 80 sample subframe.
-  void InsertBlockAndExtractSubFrame(
-      const std::vector<std::vector<float>>& block,
-      std::vector<rtc::ArrayView<float>>* sub_frame);
-
- private:
-  const size_t num_bands_;
-  std::vector<std::vector<float>> buffer_;
-
-  RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(BlockFramer);
-};
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_AEC3_BLOCK_FRAMER_H_
diff --git a/modules/audio_processing/aec3/block_framer_unittest.cc b/modules/audio_processing/aec3/block_framer_unittest.cc
deleted file mode 100644
index b6419f7..0000000
--- a/modules/audio_processing/aec3/block_framer_unittest.cc
+++ /dev/null
@@ -1,261 +0,0 @@
-/*
- *  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_processing/aec3/block_framer.h"
-
-#include <sstream>
-#include <string>
-#include <vector>
-
-#include "webrtc/modules/audio_processing/aec3/aec3_common.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-namespace {
-
-void SetupSubFrameView(std::vector<std::vector<float>>* sub_frame,
-                       std::vector<rtc::ArrayView<float>>* sub_frame_view) {
-  for (size_t k = 0; k < sub_frame_view->size(); ++k) {
-    (*sub_frame_view)[k] =
-        rtc::ArrayView<float>((*sub_frame)[k].data(), (*sub_frame)[k].size());
-  }
-}
-
-float ComputeSampleValue(size_t chunk_counter,
-                         size_t chunk_size,
-                         size_t band,
-                         size_t sample_index,
-                         int offset) {
-  float value =
-      static_cast<int>(chunk_counter * chunk_size + sample_index) + offset;
-  return value > 0 ? 5000 * band + value : 0;
-}
-
-bool VerifySubFrame(size_t sub_frame_counter,
-                    int offset,
-                    const std::vector<rtc::ArrayView<float>>& sub_frame_view) {
-  for (size_t k = 0; k < sub_frame_view.size(); ++k) {
-    for (size_t i = 0; i < sub_frame_view[k].size(); ++i) {
-      const float reference_value =
-          ComputeSampleValue(sub_frame_counter, kSubFrameLength, k, i, offset);
-      if (reference_value != sub_frame_view[k][i]) {
-        return false;
-      }
-    }
-  }
-  return true;
-}
-
-void FillBlock(size_t block_counter, std::vector<std::vector<float>>* block) {
-  for (size_t k = 0; k < block->size(); ++k) {
-    for (size_t i = 0; i < (*block)[0].size(); ++i) {
-      (*block)[k][i] = ComputeSampleValue(block_counter, kBlockSize, k, i, 0);
-    }
-  }
-}
-
-// Verifies that the BlockFramer is able to produce the expected frame content.
-void RunFramerTest(int sample_rate_hz) {
-  constexpr size_t kNumSubFramesToProcess = 2;
-  const size_t num_bands = NumBandsForRate(sample_rate_hz);
-
-  std::vector<std::vector<float>> block(num_bands,
-                                        std::vector<float>(kBlockSize, 0.f));
-  std::vector<std::vector<float>> output_sub_frame(
-      num_bands, std::vector<float>(kSubFrameLength, 0.f));
-  std::vector<rtc::ArrayView<float>> output_sub_frame_view(num_bands);
-  SetupSubFrameView(&output_sub_frame, &output_sub_frame_view);
-  BlockFramer framer(num_bands);
-
-  size_t block_index = 0;
-  for (size_t sub_frame_index = 0; sub_frame_index < kNumSubFramesToProcess;
-       ++sub_frame_index) {
-    FillBlock(block_index++, &block);
-    framer.InsertBlockAndExtractSubFrame(block, &output_sub_frame_view);
-    EXPECT_TRUE(VerifySubFrame(sub_frame_index, -64, output_sub_frame_view));
-
-    if ((sub_frame_index + 1) % 4 == 0) {
-      FillBlock(block_index++, &block);
-      framer.InsertBlock(block);
-    }
-  }
-}
-
-#if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
-// Verifies that the BlockFramer crashes if the InsertBlockAndExtractSubFrame
-// method is called for inputs with the wrong number of bands or band lengths.
-void RunWronglySizedInsertAndExtractParametersTest(int sample_rate_hz,
-                                                   size_t num_block_bands,
-                                                   size_t block_length,
-                                                   size_t num_sub_frame_bands,
-                                                   size_t sub_frame_length) {
-  const size_t correct_num_bands = NumBandsForRate(sample_rate_hz);
-
-  std::vector<std::vector<float>> block(num_block_bands,
-                                        std::vector<float>(block_length, 0.f));
-  std::vector<std::vector<float>> output_sub_frame(
-      num_sub_frame_bands, std::vector<float>(sub_frame_length, 0.f));
-  std::vector<rtc::ArrayView<float>> output_sub_frame_view(
-      output_sub_frame.size());
-  SetupSubFrameView(&output_sub_frame, &output_sub_frame_view);
-  BlockFramer framer(correct_num_bands);
-  EXPECT_DEATH(
-      framer.InsertBlockAndExtractSubFrame(block, &output_sub_frame_view), "");
-}
-
-// Verifies that the BlockFramer crashes if the InsertBlock method is called for
-// inputs with the wrong number of bands or band lengths.
-void RunWronglySizedInsertParameterTest(int sample_rate_hz,
-                                        size_t num_block_bands,
-                                        size_t block_length) {
-  const size_t correct_num_bands = NumBandsForRate(sample_rate_hz);
-
-  std::vector<std::vector<float>> correct_block(
-      correct_num_bands, std::vector<float>(kBlockSize, 0.f));
-  std::vector<std::vector<float>> wrong_block(
-      num_block_bands, std::vector<float>(block_length, 0.f));
-  std::vector<std::vector<float>> output_sub_frame(
-      correct_num_bands, std::vector<float>(kSubFrameLength, 0.f));
-  std::vector<rtc::ArrayView<float>> output_sub_frame_view(
-      output_sub_frame.size());
-  SetupSubFrameView(&output_sub_frame, &output_sub_frame_view);
-  BlockFramer framer(correct_num_bands);
-  framer.InsertBlockAndExtractSubFrame(correct_block, &output_sub_frame_view);
-  framer.InsertBlockAndExtractSubFrame(correct_block, &output_sub_frame_view);
-  framer.InsertBlockAndExtractSubFrame(correct_block, &output_sub_frame_view);
-  framer.InsertBlockAndExtractSubFrame(correct_block, &output_sub_frame_view);
-
-  EXPECT_DEATH(framer.InsertBlock(wrong_block), "");
-}
-
-// Verifies that the BlockFramer crashes if the InsertBlock method is called
-// after a wrong number of previous InsertBlockAndExtractSubFrame method calls
-// have been made.
-void RunWronglyInsertOrderTest(int sample_rate_hz,
-                               size_t num_preceeding_api_calls) {
-  const size_t correct_num_bands = NumBandsForRate(sample_rate_hz);
-
-  std::vector<std::vector<float>> block(correct_num_bands,
-                                        std::vector<float>(kBlockSize, 0.f));
-  std::vector<std::vector<float>> output_sub_frame(
-      correct_num_bands, std::vector<float>(kSubFrameLength, 0.f));
-  std::vector<rtc::ArrayView<float>> output_sub_frame_view(
-      output_sub_frame.size());
-  SetupSubFrameView(&output_sub_frame, &output_sub_frame_view);
-  BlockFramer framer(correct_num_bands);
-  for (size_t k = 0; k < num_preceeding_api_calls; ++k) {
-    framer.InsertBlockAndExtractSubFrame(block, &output_sub_frame_view);
-  }
-
-  EXPECT_DEATH(framer.InsertBlock(block), "");
-}
-#endif
-
-std::string ProduceDebugText(int sample_rate_hz) {
-  std::ostringstream ss;
-  ss << "Sample rate: " << sample_rate_hz;
-  return ss.str();
-}
-
-}  // namespace
-
-#if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
-TEST(BlockFramer, WrongNumberOfBandsInBlockForInsertBlockAndExtractSubFrame) {
-  for (auto rate : {8000, 16000, 32000, 48000}) {
-    SCOPED_TRACE(ProduceDebugText(rate));
-    const size_t correct_num_bands = NumBandsForRate(rate);
-    const size_t wrong_num_bands = (correct_num_bands % 3) + 1;
-    RunWronglySizedInsertAndExtractParametersTest(
-        rate, wrong_num_bands, kBlockSize, correct_num_bands, kSubFrameLength);
-  }
-}
-
-TEST(BlockFramer,
-     WrongNumberOfBandsInSubFrameForInsertBlockAndExtractSubFrame) {
-  for (auto rate : {8000, 16000, 32000, 48000}) {
-    SCOPED_TRACE(ProduceDebugText(rate));
-    const size_t correct_num_bands = NumBandsForRate(rate);
-    const size_t wrong_num_bands = (correct_num_bands % 3) + 1;
-    RunWronglySizedInsertAndExtractParametersTest(
-        rate, correct_num_bands, kBlockSize, wrong_num_bands, kSubFrameLength);
-  }
-}
-
-TEST(BlockFramer, WrongNumberOfSamplesInBlockForInsertBlockAndExtractSubFrame) {
-  for (auto rate : {8000, 16000, 32000, 48000}) {
-    SCOPED_TRACE(ProduceDebugText(rate));
-    const size_t correct_num_bands = NumBandsForRate(rate);
-    RunWronglySizedInsertAndExtractParametersTest(
-        rate, correct_num_bands, kBlockSize - 1, correct_num_bands,
-        kSubFrameLength);
-  }
-}
-
-TEST(BlockFramer,
-     WrongNumberOfSamplesInSubFrameForInsertBlockAndExtractSubFrame) {
-  for (auto rate : {8000, 16000, 32000, 48000}) {
-    SCOPED_TRACE(ProduceDebugText(rate));
-    const size_t correct_num_bands = NumBandsForRate(rate);
-    RunWronglySizedInsertAndExtractParametersTest(rate, correct_num_bands,
-                                                  kBlockSize, correct_num_bands,
-                                                  kSubFrameLength - 1);
-  }
-}
-
-TEST(BlockFramer, WrongNumberOfBandsInBlockForInsertBlock) {
-  for (auto rate : {8000, 16000, 32000, 48000}) {
-    SCOPED_TRACE(ProduceDebugText(rate));
-    const size_t correct_num_bands = NumBandsForRate(rate);
-    const size_t wrong_num_bands = (correct_num_bands % 3) + 1;
-    RunWronglySizedInsertParameterTest(rate, wrong_num_bands, kBlockSize);
-  }
-}
-
-TEST(BlockFramer, WrongNumberOfSamplesInBlockForInsertBlock) {
-  for (auto rate : {8000, 16000, 32000, 48000}) {
-    SCOPED_TRACE(ProduceDebugText(rate));
-    const size_t correct_num_bands = NumBandsForRate(rate);
-    RunWronglySizedInsertParameterTest(rate, correct_num_bands, kBlockSize - 1);
-  }
-}
-
-TEST(BlockFramer, WrongNumberOfPreceedingApiCallsForInsertBlock) {
-  for (auto rate : {8000, 16000, 32000, 48000}) {
-    for (size_t num_calls = 0; num_calls < 4; ++num_calls) {
-      std::ostringstream ss;
-      ss << "Sample rate: " << rate;
-      ss << ", Num preceeding InsertBlockAndExtractSubFrame calls: "
-         << num_calls;
-
-      SCOPED_TRACE(ss.str());
-      RunWronglyInsertOrderTest(rate, num_calls);
-    }
-  }
-}
-
-// Verifiers that the verification for null sub_frame pointer works.
-TEST(BlockFramer, NullSubFrameParameter) {
-  EXPECT_DEATH(BlockFramer(1).InsertBlockAndExtractSubFrame(
-                   std::vector<std::vector<float>>(
-                       1, std::vector<float>(kBlockSize, 0.f)),
-                   nullptr),
-               "");
-}
-
-#endif
-
-TEST(BlockFramer, FrameBitexactness) {
-  for (auto rate : {8000, 16000, 32000, 48000}) {
-    SCOPED_TRACE(ProduceDebugText(rate));
-    RunFramerTest(rate);
-  }
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/aec3/block_processor.cc b/modules/audio_processing/aec3/block_processor.cc
deleted file mode 100644
index 7bb9e15..0000000
--- a/modules/audio_processing/aec3/block_processor.cc
+++ /dev/null
@@ -1,214 +0,0 @@
-/*
- *  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_processing/aec3/block_processor.h"
-
-#include "webrtc/api/optional.h"
-#include "webrtc/modules/audio_processing/aec3/aec3_common.h"
-#include "webrtc/modules/audio_processing/aec3/block_processor_metrics.h"
-#include "webrtc/modules/audio_processing/aec3/echo_path_variability.h"
-#include "webrtc/modules/audio_processing/logging/apm_data_dumper.h"
-#include "webrtc/rtc_base/atomicops.h"
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace webrtc {
-namespace {
-
-enum class BlockProcessorApiCall { kCapture, kRender };
-
-class BlockProcessorImpl final : public BlockProcessor {
- public:
-  BlockProcessorImpl(int sample_rate_hz,
-                     std::unique_ptr<RenderDelayBuffer> render_buffer,
-                     std::unique_ptr<RenderDelayController> delay_controller,
-                     std::unique_ptr<EchoRemover> echo_remover);
-
-  ~BlockProcessorImpl() override;
-
-  void ProcessCapture(bool echo_path_gain_change,
-                      bool capture_signal_saturation,
-                      std::vector<std::vector<float>>* capture_block) override;
-
-  void BufferRender(const std::vector<std::vector<float>>& block) override;
-
-  void UpdateEchoLeakageStatus(bool leakage_detected) override;
-
- private:
-  static int instance_count_;
-  bool no_capture_data_received_ = true;
-  bool no_render_data_received_ = true;
-  std::unique_ptr<ApmDataDumper> data_dumper_;
-  const size_t sample_rate_hz_;
-  std::unique_ptr<RenderDelayBuffer> render_buffer_;
-  std::unique_ptr<RenderDelayController> delay_controller_;
-  std::unique_ptr<EchoRemover> echo_remover_;
-  BlockProcessorMetrics metrics_;
-  bool render_buffer_overrun_occurred_ = false;
-  RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(BlockProcessorImpl);
-};
-
-int BlockProcessorImpl::instance_count_ = 0;
-
-BlockProcessorImpl::BlockProcessorImpl(
-    int sample_rate_hz,
-    std::unique_ptr<RenderDelayBuffer> render_buffer,
-    std::unique_ptr<RenderDelayController> delay_controller,
-    std::unique_ptr<EchoRemover> echo_remover)
-    : data_dumper_(
-          new ApmDataDumper(rtc::AtomicOps::Increment(&instance_count_))),
-      sample_rate_hz_(sample_rate_hz),
-      render_buffer_(std::move(render_buffer)),
-      delay_controller_(std::move(delay_controller)),
-      echo_remover_(std::move(echo_remover)) {
-  RTC_DCHECK(ValidFullBandRate(sample_rate_hz_));
-}
-
-BlockProcessorImpl::~BlockProcessorImpl() = default;
-
-void BlockProcessorImpl::ProcessCapture(
-    bool echo_path_gain_change,
-    bool capture_signal_saturation,
-    std::vector<std::vector<float>>* capture_block) {
-  RTC_DCHECK(capture_block);
-  RTC_DCHECK_EQ(NumBandsForRate(sample_rate_hz_), capture_block->size());
-  RTC_DCHECK_EQ(kBlockSize, (*capture_block)[0].size());
-  data_dumper_->DumpRaw("aec3_processblock_call_order",
-                        static_cast<int>(BlockProcessorApiCall::kCapture));
-  data_dumper_->DumpWav("aec3_processblock_capture_input", kBlockSize,
-                        &(*capture_block)[0][0],
-                        LowestBandRate(sample_rate_hz_), 1);
-
-  // Do not start processing until render data has been buffered as that will
-  // cause the buffers to be wrongly aligned.
-  no_capture_data_received_ = false;
-  if (no_render_data_received_) {
-    return;
-  }
-
-  data_dumper_->DumpWav("aec3_processblock_capture_input2", kBlockSize,
-                        &(*capture_block)[0][0],
-                        LowestBandRate(sample_rate_hz_), 1);
-
-  bool render_buffer_underrun = false;
-  if (render_buffer_overrun_occurred_) {
-    // Reset the render buffers and the alignment functionality when there has
-    // been a render buffer overrun as the buffer alignment may be noncausal.
-    delay_controller_->Reset();
-    render_buffer_->Reset();
-  }
-
-  // Update the render buffers with new render data, filling the buffers with
-  // empty blocks when there is no render data available.
-  render_buffer_underrun = !render_buffer_->UpdateBuffers();
-
-  // Compute and and apply the render delay required to achieve proper signal
-  // alignment.
-  const size_t old_delay = render_buffer_->Delay();
-  const size_t new_delay = delay_controller_->GetDelay(
-      render_buffer_->GetDownsampledRenderBuffer(), (*capture_block)[0]);
-
-  bool delay_change;
-  if (new_delay >= kMinEchoPathDelayBlocks) {
-    render_buffer_->SetDelay(new_delay);
-    const size_t achieved_delay = render_buffer_->Delay();
-    delay_change = old_delay != achieved_delay || old_delay != new_delay ||
-                   render_buffer_overrun_occurred_;
-
-    // Inform the delay controller of the actually set delay to allow it to
-    // properly react to a non-feasible delay.
-    delay_controller_->SetDelay(achieved_delay);
-  } else {
-    delay_controller_->Reset();
-    render_buffer_->Reset();
-    delay_change = true;
-  }
-
-  // Remove the echo from the capture signal.
-  echo_remover_->ProcessCapture(
-      delay_controller_->AlignmentHeadroomSamples(),
-      EchoPathVariability(echo_path_gain_change, delay_change),
-      capture_signal_saturation, render_buffer_->GetRenderBuffer(),
-      capture_block);
-
-  // Update the metrics.
-  metrics_.UpdateCapture(render_buffer_underrun);
-
-  render_buffer_overrun_occurred_ = false;
-}
-
-void BlockProcessorImpl::BufferRender(
-    const std::vector<std::vector<float>>& block) {
-  RTC_DCHECK_EQ(NumBandsForRate(sample_rate_hz_), block.size());
-  RTC_DCHECK_EQ(kBlockSize, block[0].size());
-  data_dumper_->DumpRaw("aec3_processblock_call_order",
-                        static_cast<int>(BlockProcessorApiCall::kRender));
-  data_dumper_->DumpWav("aec3_processblock_render_input", kBlockSize,
-                        &block[0][0], LowestBandRate(sample_rate_hz_), 1);
-
-  no_render_data_received_ = false;
-
-  // Do not start buffer render data until capture data has been received as
-  // that data may give a false alignment.
-  if (no_capture_data_received_) {
-    return;
-  }
-
-  data_dumper_->DumpWav("aec3_processblock_render_input2", kBlockSize,
-                        &block[0][0], LowestBandRate(sample_rate_hz_), 1);
-
-  // Buffer the render data.
-  render_buffer_overrun_occurred_ = !render_buffer_->Insert(block);
-
-  // Update the metrics.
-  metrics_.UpdateRender(render_buffer_overrun_occurred_);
-}
-
-void BlockProcessorImpl::UpdateEchoLeakageStatus(bool leakage_detected) {
-  echo_remover_->UpdateEchoLeakageStatus(leakage_detected);
-}
-
-}  // namespace
-
-BlockProcessor* BlockProcessor::Create(
-    const AudioProcessing::Config::EchoCanceller3& config,
-    int sample_rate_hz) {
-  std::unique_ptr<RenderDelayBuffer> render_buffer(
-      RenderDelayBuffer::Create(NumBandsForRate(sample_rate_hz)));
-  std::unique_ptr<RenderDelayController> delay_controller(
-      RenderDelayController::Create(config, sample_rate_hz));
-  std::unique_ptr<EchoRemover> echo_remover(
-      EchoRemover::Create(config, sample_rate_hz));
-  return Create(config, sample_rate_hz, std::move(render_buffer),
-                std::move(delay_controller), std::move(echo_remover));
-}
-
-BlockProcessor* BlockProcessor::Create(
-    const AudioProcessing::Config::EchoCanceller3& config,
-    int sample_rate_hz,
-    std::unique_ptr<RenderDelayBuffer> render_buffer) {
-  std::unique_ptr<RenderDelayController> delay_controller(
-      RenderDelayController::Create(config, sample_rate_hz));
-  std::unique_ptr<EchoRemover> echo_remover(
-      EchoRemover::Create(config, sample_rate_hz));
-  return Create(config, sample_rate_hz, std::move(render_buffer),
-                std::move(delay_controller), std::move(echo_remover));
-}
-
-BlockProcessor* BlockProcessor::Create(
-    const AudioProcessing::Config::EchoCanceller3& config,
-    int sample_rate_hz,
-    std::unique_ptr<RenderDelayBuffer> render_buffer,
-    std::unique_ptr<RenderDelayController> delay_controller,
-    std::unique_ptr<EchoRemover> echo_remover) {
-  return new BlockProcessorImpl(sample_rate_hz, std::move(render_buffer),
-                                std::move(delay_controller),
-                                std::move(echo_remover));
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/aec3/block_processor.h b/modules/audio_processing/aec3/block_processor.h
deleted file mode 100644
index 9235931..0000000
--- a/modules/audio_processing/aec3/block_processor.h
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- *  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_PROCESSING_AEC3_BLOCK_PROCESSOR_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_AEC3_BLOCK_PROCESSOR_H_
-
-#include <memory>
-#include <vector>
-
-#include "webrtc/modules/audio_processing/aec3/echo_remover.h"
-#include "webrtc/modules/audio_processing/aec3/render_delay_buffer.h"
-#include "webrtc/modules/audio_processing/aec3/render_delay_controller.h"
-
-namespace webrtc {
-
-// Class for performing echo cancellation on 64 sample blocks of audio data.
-class BlockProcessor {
- public:
-  static BlockProcessor* Create(
-      const AudioProcessing::Config::EchoCanceller3& config,
-      int sample_rate_hz);
-  // Only used for testing purposes.
-  static BlockProcessor* Create(
-      const AudioProcessing::Config::EchoCanceller3& config,
-      int sample_rate_hz,
-      std::unique_ptr<RenderDelayBuffer> render_buffer);
-  static BlockProcessor* Create(
-      const AudioProcessing::Config::EchoCanceller3& config,
-      int sample_rate_hz,
-      std::unique_ptr<RenderDelayBuffer> render_buffer,
-      std::unique_ptr<RenderDelayController> delay_controller,
-      std::unique_ptr<EchoRemover> echo_remover);
-
-  virtual ~BlockProcessor() = default;
-
-  // Processes a block of capture data.
-  virtual void ProcessCapture(
-      bool echo_path_gain_change,
-      bool capture_signal_saturation,
-      std::vector<std::vector<float>>* capture_block) = 0;
-
-  // Buffers a block of render data supplied by a FrameBlocker object.
-  virtual void BufferRender(
-      const std::vector<std::vector<float>>& render_block) = 0;
-
-  // Reports whether echo leakage has been detected in the echo canceller
-  // output.
-  virtual void UpdateEchoLeakageStatus(bool leakage_detected) = 0;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_AEC3_BLOCK_PROCESSOR_H_
diff --git a/modules/audio_processing/aec3/block_processor_metrics.cc b/modules/audio_processing/aec3/block_processor_metrics.cc
deleted file mode 100644
index 3eeafa2..0000000
--- a/modules/audio_processing/aec3/block_processor_metrics.cc
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- *  Copyright (c) 2017 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_processing/aec3/block_processor_metrics.h"
-
-#include "webrtc/modules/audio_processing/aec3/aec3_common.h"
-#include "webrtc/system_wrappers/include/metrics.h"
-
-namespace webrtc {
-
-namespace {
-
-enum class RenderUnderrunCategory {
-  kNone,
-  kFew,
-  kSeveral,
-  kMany,
-  kConstant,
-  kNumCategories
-};
-
-enum class RenderOverrunCategory {
-  kNone,
-  kFew,
-  kSeveral,
-  kMany,
-  kConstant,
-  kNumCategories
-};
-
-}  // namespace
-
-void BlockProcessorMetrics::UpdateCapture(bool underrun) {
-  ++capture_block_counter_;
-  if (underrun) {
-    ++render_buffer_underruns_;
-  }
-
-  if (capture_block_counter_ == kMetricsReportingIntervalBlocks) {
-    metrics_reported_ = true;
-
-    RenderUnderrunCategory underrun_category;
-    if (render_buffer_underruns_ == 0) {
-      underrun_category = RenderUnderrunCategory::kNone;
-    } else if (render_buffer_underruns_ > (capture_block_counter_ >> 1)) {
-      underrun_category = RenderUnderrunCategory::kConstant;
-    } else if (render_buffer_underruns_ > 100) {
-      underrun_category = RenderUnderrunCategory::kMany;
-    } else if (render_buffer_underruns_ > 10) {
-      underrun_category = RenderUnderrunCategory::kSeveral;
-    } else {
-      underrun_category = RenderUnderrunCategory::kFew;
-    }
-    RTC_HISTOGRAM_ENUMERATION(
-        "WebRTC.Audio.EchoCanceller.RenderUnderruns",
-        static_cast<int>(underrun_category),
-        static_cast<int>(RenderUnderrunCategory::kNumCategories));
-
-    RenderOverrunCategory overrun_category;
-    if (render_buffer_overruns_ == 0) {
-      overrun_category = RenderOverrunCategory::kNone;
-    } else if (render_buffer_overruns_ > (buffer_render_calls_ >> 1)) {
-      overrun_category = RenderOverrunCategory::kConstant;
-    } else if (render_buffer_overruns_ > 100) {
-      overrun_category = RenderOverrunCategory::kMany;
-    } else if (render_buffer_overruns_ > 10) {
-      overrun_category = RenderOverrunCategory::kSeveral;
-    } else {
-      overrun_category = RenderOverrunCategory::kFew;
-    }
-    RTC_HISTOGRAM_ENUMERATION(
-        "WebRTC.Audio.EchoCanceller.RenderOverruns",
-        static_cast<int>(overrun_category),
-        static_cast<int>(RenderOverrunCategory::kNumCategories));
-
-    ResetMetrics();
-    capture_block_counter_ = 0;
-  } else {
-    metrics_reported_ = false;
-  }
-}
-
-void BlockProcessorMetrics::UpdateRender(bool overrun) {
-  ++buffer_render_calls_;
-  if (overrun) {
-    ++render_buffer_overruns_;
-  }
-}
-
-void BlockProcessorMetrics::ResetMetrics() {
-  render_buffer_underruns_ = 0;
-  render_buffer_overruns_ = 0;
-  buffer_render_calls_ = 0;
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/aec3/block_processor_metrics.h b/modules/audio_processing/aec3/block_processor_metrics.h
deleted file mode 100644
index 1cff2a8..0000000
--- a/modules/audio_processing/aec3/block_processor_metrics.h
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- *  Copyright (c) 2017 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_PROCESSING_AEC3_BLOCK_PROCESSOR_METRICS_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_AEC3_BLOCK_PROCESSOR_METRICS_H_
-
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace webrtc {
-
-// Handles the reporting of metrics for the block_processor.
-class BlockProcessorMetrics {
- public:
-  BlockProcessorMetrics() = default;
-
-  // Updates the metric with new capture data.
-  void UpdateCapture(bool underrun);
-
-  // Updates the metric with new render data.
-  void UpdateRender(bool overrun);
-
-  // Returns true if the metrics have just been reported, otherwise false.
-  bool MetricsReported() { return metrics_reported_; }
-
- private:
-  // Resets the metrics.
-  void ResetMetrics();
-
-  int capture_block_counter_ = 0;
-  bool metrics_reported_ = false;
-  int render_buffer_underruns_ = 0;
-  int render_buffer_overruns_ = 0;
-  int buffer_render_calls_ = 0;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(BlockProcessorMetrics);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_AEC3_BLOCK_PROCESSOR_METRICS_H_
diff --git a/modules/audio_processing/aec3/block_processor_metrics_unittest.cc b/modules/audio_processing/aec3/block_processor_metrics_unittest.cc
deleted file mode 100644
index 8ab1048..0000000
--- a/modules/audio_processing/aec3/block_processor_metrics_unittest.cc
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- *  Copyright (c) 2017 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_processing/aec3/aec3_common.h"
-#include "webrtc/modules/audio_processing/aec3/block_processor_metrics.h"
-
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-// Verify the general functionality of BlockProcessorMetrics.
-TEST(BlockProcessorMetrics, NormalUsage) {
-  BlockProcessorMetrics metrics;
-
-  for (int j = 0; j < 3; ++j) {
-    for (int k = 0; k < kMetricsReportingIntervalBlocks - 1; ++k) {
-      metrics.UpdateRender(false);
-      metrics.UpdateRender(false);
-      metrics.UpdateCapture(false);
-      EXPECT_FALSE(metrics.MetricsReported());
-    }
-    metrics.UpdateCapture(false);
-    EXPECT_TRUE(metrics.MetricsReported());
-  }
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/aec3/block_processor_unittest.cc b/modules/audio_processing/aec3/block_processor_unittest.cc
deleted file mode 100644
index 9f402ed..0000000
--- a/modules/audio_processing/aec3/block_processor_unittest.cc
+++ /dev/null
@@ -1,261 +0,0 @@
-/*
- *  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_processing/aec3/block_processor.h"
-
-#include <memory>
-#include <sstream>
-#include <string>
-#include <vector>
-
-#include "webrtc/modules/audio_processing/aec3/aec3_common.h"
-#include "webrtc/modules/audio_processing/aec3/mock/mock_echo_remover.h"
-#include "webrtc/modules/audio_processing/aec3/mock/mock_render_delay_buffer.h"
-#include "webrtc/modules/audio_processing/aec3/mock/mock_render_delay_controller.h"
-#include "webrtc/modules/audio_processing/test/echo_canceller_test_tools.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/random.h"
-#include "webrtc/test/gmock.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-namespace {
-
-using testing::AtLeast;
-using testing::Return;
-using testing::StrictMock;
-using testing::_;
-
-// Verifies that the basic BlockProcessor functionality works and that the API
-// methods are callable.
-void RunBasicSetupAndApiCallTest(int sample_rate_hz) {
-  std::unique_ptr<BlockProcessor> block_processor(BlockProcessor::Create(
-      AudioProcessing::Config::EchoCanceller3(), sample_rate_hz));
-  std::vector<std::vector<float>> block(NumBandsForRate(sample_rate_hz),
-                                        std::vector<float>(kBlockSize, 0.f));
-
-  block_processor->BufferRender(block);
-  block_processor->ProcessCapture(false, false, &block);
-  block_processor->UpdateEchoLeakageStatus(false);
-}
-
-#if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
-void RunRenderBlockSizeVerificationTest(int sample_rate_hz) {
-  std::unique_ptr<BlockProcessor> block_processor(BlockProcessor::Create(
-      AudioProcessing::Config::EchoCanceller3(), sample_rate_hz));
-  std::vector<std::vector<float>> block(
-      NumBandsForRate(sample_rate_hz), std::vector<float>(kBlockSize - 1, 0.f));
-
-  EXPECT_DEATH(block_processor->BufferRender(block), "");
-}
-
-void RunCaptureBlockSizeVerificationTest(int sample_rate_hz) {
-  std::unique_ptr<BlockProcessor> block_processor(BlockProcessor::Create(
-      AudioProcessing::Config::EchoCanceller3(), sample_rate_hz));
-  std::vector<std::vector<float>> block(
-      NumBandsForRate(sample_rate_hz), std::vector<float>(kBlockSize - 1, 0.f));
-
-  EXPECT_DEATH(block_processor->ProcessCapture(false, false, &block), "");
-}
-
-void RunRenderNumBandsVerificationTest(int sample_rate_hz) {
-  const size_t wrong_num_bands = NumBandsForRate(sample_rate_hz) < 3
-                                     ? NumBandsForRate(sample_rate_hz) + 1
-                                     : 1;
-  std::unique_ptr<BlockProcessor> block_processor(BlockProcessor::Create(
-      AudioProcessing::Config::EchoCanceller3(), sample_rate_hz));
-  std::vector<std::vector<float>> block(wrong_num_bands,
-                                        std::vector<float>(kBlockSize, 0.f));
-
-  EXPECT_DEATH(block_processor->BufferRender(block), "");
-}
-
-void RunCaptureNumBandsVerificationTest(int sample_rate_hz) {
-  const size_t wrong_num_bands = NumBandsForRate(sample_rate_hz) < 3
-                                     ? NumBandsForRate(sample_rate_hz) + 1
-                                     : 1;
-  std::unique_ptr<BlockProcessor> block_processor(BlockProcessor::Create(
-      AudioProcessing::Config::EchoCanceller3(), sample_rate_hz));
-  std::vector<std::vector<float>> block(wrong_num_bands,
-                                        std::vector<float>(kBlockSize, 0.f));
-
-  EXPECT_DEATH(block_processor->ProcessCapture(false, false, &block), "");
-}
-#endif
-
-std::string ProduceDebugText(int sample_rate_hz) {
-  std::ostringstream ss;
-  ss << "Sample rate: " << sample_rate_hz;
-  return ss.str();
-}
-
-}  // namespace
-
-// Verifies that the delay controller functionality is properly integrated with
-// the render delay buffer inside block processor.
-// TODO(peah): Activate the unittest once the required code has been landed.
-TEST(BlockProcessor, DISABLED_DelayControllerIntegration) {
-  constexpr size_t kNumBlocks = 310;
-  constexpr size_t kDelayInSamples = 640;
-  constexpr size_t kDelayHeadroom = 1;
-  constexpr size_t kDelayInBlocks =
-      kDelayInSamples / kBlockSize - kDelayHeadroom;
-  Random random_generator(42U);
-  for (auto rate : {8000, 16000, 32000, 48000}) {
-    SCOPED_TRACE(ProduceDebugText(rate));
-    std::unique_ptr<testing::StrictMock<webrtc::test::MockRenderDelayBuffer>>
-        render_delay_buffer_mock(
-            new StrictMock<webrtc::test::MockRenderDelayBuffer>(rate));
-    EXPECT_CALL(*render_delay_buffer_mock, Insert(_))
-        .Times(kNumBlocks)
-        .WillRepeatedly(Return(true));
-    EXPECT_CALL(*render_delay_buffer_mock, IsBlockAvailable())
-        .Times(kNumBlocks)
-        .WillRepeatedly(Return(true));
-    EXPECT_CALL(*render_delay_buffer_mock, SetDelay(kDelayInBlocks))
-        .Times(AtLeast(1));
-    EXPECT_CALL(*render_delay_buffer_mock, MaxDelay()).WillOnce(Return(30));
-    EXPECT_CALL(*render_delay_buffer_mock, Delay())
-        .Times(kNumBlocks + 1)
-        .WillRepeatedly(Return(0));
-    std::unique_ptr<BlockProcessor> block_processor(
-        BlockProcessor::Create(AudioProcessing::Config::EchoCanceller3(), rate,
-                               std::move(render_delay_buffer_mock)));
-
-    std::vector<std::vector<float>> render_block(
-        NumBandsForRate(rate), std::vector<float>(kBlockSize, 0.f));
-    std::vector<std::vector<float>> capture_block(
-        NumBandsForRate(rate), std::vector<float>(kBlockSize, 0.f));
-    DelayBuffer<float> signal_delay_buffer(kDelayInSamples);
-    for (size_t k = 0; k < kNumBlocks; ++k) {
-      RandomizeSampleVector(&random_generator, render_block[0]);
-      signal_delay_buffer.Delay(render_block[0], capture_block[0]);
-      block_processor->BufferRender(render_block);
-      block_processor->ProcessCapture(false, false, &capture_block);
-    }
-  }
-}
-
-// Verifies that BlockProcessor submodules are called in a proper manner.
-TEST(BlockProcessor, DISABLED_SubmoduleIntegration) {
-  constexpr size_t kNumBlocks = 310;
-  Random random_generator(42U);
-  for (auto rate : {8000, 16000, 32000, 48000}) {
-    SCOPED_TRACE(ProduceDebugText(rate));
-    std::unique_ptr<testing::StrictMock<webrtc::test::MockRenderDelayBuffer>>
-        render_delay_buffer_mock(
-            new StrictMock<webrtc::test::MockRenderDelayBuffer>(rate));
-    std::unique_ptr<
-        testing::StrictMock<webrtc::test::MockRenderDelayController>>
-        render_delay_controller_mock(
-            new StrictMock<webrtc::test::MockRenderDelayController>());
-    std::unique_ptr<testing::StrictMock<webrtc::test::MockEchoRemover>>
-        echo_remover_mock(new StrictMock<webrtc::test::MockEchoRemover>());
-
-    EXPECT_CALL(*render_delay_buffer_mock, Insert(_))
-        .Times(kNumBlocks - 1)
-        .WillRepeatedly(Return(true));
-    EXPECT_CALL(*render_delay_buffer_mock, IsBlockAvailable())
-        .Times(kNumBlocks)
-        .WillRepeatedly(Return(true));
-    EXPECT_CALL(*render_delay_buffer_mock, UpdateBuffers()).Times(kNumBlocks);
-    EXPECT_CALL(*render_delay_buffer_mock, SetDelay(9)).Times(AtLeast(1));
-    EXPECT_CALL(*render_delay_buffer_mock, Delay())
-        .Times(kNumBlocks)
-        .WillRepeatedly(Return(0));
-    EXPECT_CALL(*render_delay_controller_mock, GetDelay(_, _))
-        .Times(kNumBlocks)
-        .WillRepeatedly(Return(9));
-    EXPECT_CALL(*render_delay_controller_mock, AlignmentHeadroomSamples())
-        .Times(kNumBlocks);
-    EXPECT_CALL(*echo_remover_mock, ProcessCapture(_, _, _, _, _))
-        .Times(kNumBlocks);
-    EXPECT_CALL(*echo_remover_mock, UpdateEchoLeakageStatus(_))
-        .Times(kNumBlocks);
-
-    std::unique_ptr<BlockProcessor> block_processor(BlockProcessor::Create(
-        AudioProcessing::Config::EchoCanceller3(), rate,
-        std::move(render_delay_buffer_mock),
-        std::move(render_delay_controller_mock), std::move(echo_remover_mock)));
-
-    std::vector<std::vector<float>> render_block(
-        NumBandsForRate(rate), std::vector<float>(kBlockSize, 0.f));
-    std::vector<std::vector<float>> capture_block(
-        NumBandsForRate(rate), std::vector<float>(kBlockSize, 0.f));
-    DelayBuffer<float> signal_delay_buffer(640);
-    for (size_t k = 0; k < kNumBlocks; ++k) {
-      RandomizeSampleVector(&random_generator, render_block[0]);
-      signal_delay_buffer.Delay(render_block[0], capture_block[0]);
-      block_processor->BufferRender(render_block);
-      block_processor->ProcessCapture(false, false, &capture_block);
-      block_processor->UpdateEchoLeakageStatus(false);
-    }
-  }
-}
-
-TEST(BlockProcessor, BasicSetupAndApiCalls) {
-  for (auto rate : {8000, 16000, 32000, 48000}) {
-    SCOPED_TRACE(ProduceDebugText(rate));
-    RunBasicSetupAndApiCallTest(rate);
-  }
-}
-
-#if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
-TEST(BlockProcessor, VerifyRenderBlockSizeCheck) {
-  for (auto rate : {8000, 16000, 32000, 48000}) {
-    SCOPED_TRACE(ProduceDebugText(rate));
-    RunRenderBlockSizeVerificationTest(rate);
-  }
-}
-
-TEST(BlockProcessor, VerifyCaptureBlockSizeCheck) {
-  for (auto rate : {8000, 16000, 32000, 48000}) {
-    SCOPED_TRACE(ProduceDebugText(rate));
-    RunCaptureBlockSizeVerificationTest(rate);
-  }
-}
-
-TEST(BlockProcessor, VerifyRenderNumBandsCheck) {
-  for (auto rate : {8000, 16000, 32000, 48000}) {
-    SCOPED_TRACE(ProduceDebugText(rate));
-    RunRenderNumBandsVerificationTest(rate);
-  }
-}
-
-// TODO(peah): Verify the check for correct number of bands in the capture
-// signal.
-TEST(BlockProcessor, VerifyCaptureNumBandsCheck) {
-  for (auto rate : {8000, 16000, 32000, 48000}) {
-    SCOPED_TRACE(ProduceDebugText(rate));
-    RunCaptureNumBandsVerificationTest(rate);
-  }
-}
-
-// Verifiers that the verification for null ProcessCapture input works.
-TEST(BlockProcessor, NullProcessCaptureParameter) {
-  EXPECT_DEATH(std::unique_ptr<BlockProcessor>(
-                   BlockProcessor::Create(
-                       AudioProcessing::Config::EchoCanceller3(), 8000))
-                   ->ProcessCapture(false, false, nullptr),
-               "");
-}
-
-// Verifies the check for correct sample rate.
-// TODO(peah): Re-enable the test once the issue with memory leaks during DEATH
-// tests on test bots has been fixed.
-TEST(BlockProcessor, DISABLED_WrongSampleRate) {
-  EXPECT_DEATH(std::unique_ptr<BlockProcessor>(BlockProcessor::Create(
-                   AudioProcessing::Config::EchoCanceller3(), 8001)),
-               "");
-}
-
-#endif
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/aec3/cascaded_biquad_filter.cc b/modules/audio_processing/aec3/cascaded_biquad_filter.cc
deleted file mode 100644
index 3ac86c0..0000000
--- a/modules/audio_processing/aec3/cascaded_biquad_filter.cc
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- *  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_processing/aec3/cascaded_biquad_filter.h"
-
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-
-CascadedBiQuadFilter::CascadedBiQuadFilter(
-    const CascadedBiQuadFilter::BiQuadCoefficients& coefficients,
-    size_t num_biquads)
-    : biquad_states_(num_biquads), coefficients_(coefficients) {}
-
-CascadedBiQuadFilter::~CascadedBiQuadFilter() = default;
-
-void CascadedBiQuadFilter::Process(rtc::ArrayView<const float> x,
-                                   rtc::ArrayView<float> y) {
-  ApplyBiQuad(x, y, &biquad_states_[0]);
-  for (size_t k = 1; k < biquad_states_.size(); ++k) {
-    ApplyBiQuad(y, y, &biquad_states_[k]);
-  }
-}
-
-void CascadedBiQuadFilter::Process(rtc::ArrayView<float> y) {
-  for (auto& biquad : biquad_states_) {
-    ApplyBiQuad(y, y, &biquad);
-  }
-}
-
-void CascadedBiQuadFilter::ApplyBiQuad(
-    rtc::ArrayView<const float> x,
-    rtc::ArrayView<float> y,
-    CascadedBiQuadFilter::BiQuadState* biquad_state) {
-  RTC_DCHECK_EQ(x.size(), y.size());
-  RTC_DCHECK(biquad_state);
-  const auto* c_b = coefficients_.b;
-  const auto* c_a = coefficients_.a;
-  auto* m_x = biquad_state->x;
-  auto* m_y = biquad_state->y;
-  for (size_t k = 0; k < x.size(); ++k) {
-    const float tmp = x[k];
-    y[k] = c_b[0] * tmp + c_b[1] * m_x[0] + c_b[2] * m_x[1] - c_a[0] * m_y[0] -
-           c_a[1] * m_y[1];
-    m_x[1] = m_x[0];
-    m_x[0] = tmp;
-    m_y[1] = m_y[0];
-    m_y[0] = y[k];
-  }
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/aec3/cascaded_biquad_filter.h b/modules/audio_processing/aec3/cascaded_biquad_filter.h
deleted file mode 100644
index 997e6ea..0000000
--- a/modules/audio_processing/aec3/cascaded_biquad_filter.h
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- *  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_PROCESSING_AEC3_CASCADED_BIQUAD_FILTER_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_AEC3_CASCADED_BIQUAD_FILTER_H_
-
-#include <vector>
-
-#include "webrtc/api/array_view.h"
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace webrtc {
-
-// Applies a number of identical biquads in a cascaded manner. The filter
-// implementation is direct form 1.
-class CascadedBiQuadFilter {
- public:
-  struct BiQuadState {
-    BiQuadState() : x(), y() {}
-    float x[2];
-    float y[2];
-  };
-
-  struct BiQuadCoefficients {
-    float b[3];
-    float a[2];
-  };
-
-  CascadedBiQuadFilter(
-      const CascadedBiQuadFilter::BiQuadCoefficients& coefficients,
-      size_t num_biquads);
-  ~CascadedBiQuadFilter();
-  // Applies the biquads on the values in x in order to form the output in y.
-  void Process(rtc::ArrayView<const float> x, rtc::ArrayView<float> y);
-  // Applies the biquads on the values in y in an in-place manner.
-  void Process(rtc::ArrayView<float> y);
-
- private:
-  void ApplyBiQuad(rtc::ArrayView<const float> x,
-                   rtc::ArrayView<float> y,
-                   CascadedBiQuadFilter::BiQuadState* biquad_state);
-
-  std::vector<BiQuadState> biquad_states_;
-  const BiQuadCoefficients coefficients_;
-
-  RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(CascadedBiQuadFilter);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_AEC3_CASCADED_BIQUAD_FILTER_H_
diff --git a/modules/audio_processing/aec3/cascaded_biquad_filter_unittest.cc b/modules/audio_processing/aec3/cascaded_biquad_filter_unittest.cc
deleted file mode 100644
index 7628a88..0000000
--- a/modules/audio_processing/aec3/cascaded_biquad_filter_unittest.cc
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- *  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_processing/aec3/cascaded_biquad_filter.h"
-
-#include <vector>
-
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-namespace {
-
-// Coefficients for a second order Butterworth high-pass filter with cutoff
-// frequency 100 Hz.
-const CascadedBiQuadFilter::BiQuadCoefficients kHighPassFilterCoefficients = {
-    {0.97261f, -1.94523f, 0.97261f},
-    {-1.94448f, 0.94598f}};
-
-const CascadedBiQuadFilter::BiQuadCoefficients kTransparentCoefficients = {
-    {1.f, 0.f, 0.f},
-    {0.f, 0.f}};
-
-const CascadedBiQuadFilter::BiQuadCoefficients kBlockingCoefficients = {
-    {0.f, 0.f, 0.f},
-    {0.f, 0.f}};
-
-std::vector<float> CreateInputWithIncreasingValues(size_t vector_length) {
-  std::vector<float> v(vector_length);
-  for (size_t k = 0; k < v.size(); ++k) {
-    v[k] = k;
-  }
-  return v;
-}
-
-}  // namespace
-
-// Verifies that the filter applies an effect which removes the input signal.
-// The test also verifies that the in-place Process API call works as intended.
-TEST(CascadedBiquadFilter, BlockingConfiguration) {
-  std::vector<float> values = CreateInputWithIncreasingValues(1000);
-
-  CascadedBiQuadFilter filter(kBlockingCoefficients, 1);
-  filter.Process(values);
-
-  EXPECT_EQ(std::vector<float>(1000, 0.f), values);
-}
-
-// Verifies that the filter is able to form a zero-mean output from a
-// non-zeromean input signal when coefficients for a high-pass filter are
-// applied. The test also verifies that the filter works with multiple biquads.
-TEST(CascadedBiquadFilter, HighPassConfiguration) {
-  std::vector<float> values(1000);
-  for (size_t k = 0; k < values.size(); ++k) {
-    values[k] = 1.f;
-  }
-
-  CascadedBiQuadFilter filter(kHighPassFilterCoefficients, 2);
-  filter.Process(values);
-
-  for (size_t k = values.size() / 2; k < values.size(); ++k) {
-    EXPECT_NEAR(0.f, values[k], 1e-4);
-  }
-}
-
-// Verifies that the filter is able to produce a transparent effect with no
-// impact on the data when the proper coefficients are applied. The test also
-// verifies that the non-in-place Process API call works as intended.
-TEST(CascadedBiquadFilter, TransparentConfiguration) {
-  const std::vector<float> input = CreateInputWithIncreasingValues(1000);
-  std::vector<float> output(input.size());
-
-  CascadedBiQuadFilter filter(kTransparentCoefficients, 1);
-  filter.Process(input, output);
-
-  EXPECT_EQ(input, output);
-}
-
-#if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
-// Verifies that the check of the lengths for the input and output works for the
-// non-in-place call.
-TEST(CascadedBiquadFilter, InputSizeCheckVerification) {
-  const std::vector<float> input = CreateInputWithIncreasingValues(10);
-  std::vector<float> output(input.size() - 1);
-
-  CascadedBiQuadFilter filter(kTransparentCoefficients, 1);
-  EXPECT_DEATH(filter.Process(input, output), "");
-}
-#endif
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/aec3/comfort_noise_generator.cc b/modules/audio_processing/aec3/comfort_noise_generator.cc
deleted file mode 100644
index b8d7f28..0000000
--- a/modules/audio_processing/aec3/comfort_noise_generator.cc
+++ /dev/null
@@ -1,219 +0,0 @@
-/*
- *  Copyright (c) 2017 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_processing/aec3/comfort_noise_generator.h"
-
-#include "webrtc/typedefs.h"
-#if defined(WEBRTC_ARCH_X86_FAMILY)
-#include <emmintrin.h>
-#endif
-#include <math.h>
-#include <algorithm>
-#include <array>
-#include <functional>
-#include <numeric>
-
-#include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
-
-namespace webrtc {
-
-namespace {
-
-// Creates an array of uniformly distributed variables.
-void TableRandomValue(int16_t* vector, int16_t vector_length, uint32_t* seed) {
-  for (int i = 0; i < vector_length; i++) {
-    seed[0] = (seed[0] * ((int32_t)69069) + 1) & (0x80000000 - 1);
-    vector[i] = (int16_t)(seed[0] >> 16);
-  }
-}
-
-}  // namespace
-
-namespace aec3 {
-
-#if defined(WEBRTC_ARCH_X86_FAMILY)
-
-void EstimateComfortNoise_SSE2(const std::array<float, kFftLengthBy2Plus1>& N2,
-                               uint32_t* seed,
-                               FftData* lower_band_noise,
-                               FftData* upper_band_noise) {
-  FftData* N_low = lower_band_noise;
-  FftData* N_high = upper_band_noise;
-
-  // Compute square root spectrum.
-  std::array<float, kFftLengthBy2Plus1> N;
-  for (size_t k = 0; k < kFftLengthBy2; k += 4) {
-    __m128 v = _mm_loadu_ps(&N2[k]);
-    v = _mm_sqrt_ps(v);
-    _mm_storeu_ps(&N[k], v);
-  }
-
-  N[kFftLengthBy2] = sqrtf(N2[kFftLengthBy2]);
-
-  // Compute the noise level for the upper bands.
-  constexpr float kOneByNumBands = 1.f / (kFftLengthBy2Plus1 / 2 + 1);
-  constexpr int kFftLengthBy2Plus1By2 = kFftLengthBy2Plus1 / 2;
-  const float high_band_noise_level =
-      std::accumulate(N.begin() + kFftLengthBy2Plus1By2, N.end(), 0.f) *
-      kOneByNumBands;
-
-  // Generate complex noise.
-  std::array<int16_t, kFftLengthBy2 - 1> random_values_int;
-  TableRandomValue(random_values_int.data(), random_values_int.size(), seed);
-
-  std::array<float, kFftLengthBy2 - 1> sin;
-  std::array<float, kFftLengthBy2 - 1> cos;
-  constexpr float kScale = 6.28318530717959f / 32768.0f;
-  std::transform(random_values_int.begin(), random_values_int.end(),
-                 sin.begin(), [&](int16_t a) { return -sinf(kScale * a); });
-  std::transform(random_values_int.begin(), random_values_int.end(),
-                 cos.begin(), [&](int16_t a) { return cosf(kScale * a); });
-
-  // Form low-frequency noise via spectral shaping.
-  N_low->re[0] = N_low->re[kFftLengthBy2] = N_high->re[0] =
-      N_high->re[kFftLengthBy2] = 0.f;
-  std::transform(cos.begin(), cos.end(), N.begin() + 1, N_low->re.begin() + 1,
-                 std::multiplies<float>());
-  std::transform(sin.begin(), sin.end(), N.begin() + 1, N_low->im.begin() + 1,
-                 std::multiplies<float>());
-
-  // Form the high-frequency noise via simple levelling.
-  std::transform(cos.begin(), cos.end(), N_high->re.begin() + 1,
-                 [&](float a) { return high_band_noise_level * a; });
-  std::transform(sin.begin(), sin.end(), N_high->im.begin() + 1,
-                 [&](float a) { return high_band_noise_level * a; });
-}
-
-#endif
-
-void EstimateComfortNoise(const std::array<float, kFftLengthBy2Plus1>& N2,
-                          uint32_t* seed,
-                          FftData* lower_band_noise,
-                          FftData* upper_band_noise) {
-  FftData* N_low = lower_band_noise;
-  FftData* N_high = upper_band_noise;
-
-  // Compute square root spectrum.
-  std::array<float, kFftLengthBy2Plus1> N;
-  std::transform(N2.begin(), N2.end(), N.begin(),
-                 [](float a) { return sqrtf(a); });
-
-  // Compute the noise level for the upper bands.
-  constexpr float kOneByNumBands = 1.f / (kFftLengthBy2Plus1 / 2 + 1);
-  constexpr int kFftLengthBy2Plus1By2 = kFftLengthBy2Plus1 / 2;
-  const float high_band_noise_level =
-      std::accumulate(N.begin() + kFftLengthBy2Plus1By2, N.end(), 0.f) *
-      kOneByNumBands;
-
-  // Generate complex noise.
-  std::array<int16_t, kFftLengthBy2 - 1> random_values_int;
-  TableRandomValue(random_values_int.data(), random_values_int.size(), seed);
-
-  std::array<float, kFftLengthBy2 - 1> sin;
-  std::array<float, kFftLengthBy2 - 1> cos;
-  constexpr float kScale = 6.28318530717959f / 32768.0f;
-  std::transform(random_values_int.begin(), random_values_int.end(),
-                 sin.begin(), [&](int16_t a) { return -sinf(kScale * a); });
-  std::transform(random_values_int.begin(), random_values_int.end(),
-                 cos.begin(), [&](int16_t a) { return cosf(kScale * a); });
-
-  // Form low-frequency noise via spectral shaping.
-  N_low->re[0] = N_low->re[kFftLengthBy2] = N_high->re[0] =
-      N_high->re[kFftLengthBy2] = 0.f;
-  std::transform(cos.begin(), cos.end(), N.begin() + 1, N_low->re.begin() + 1,
-                 std::multiplies<float>());
-  std::transform(sin.begin(), sin.end(), N.begin() + 1, N_low->im.begin() + 1,
-                 std::multiplies<float>());
-
-  // Form the high-frequency noise via simple levelling.
-  std::transform(cos.begin(), cos.end(), N_high->re.begin() + 1,
-                 [&](float a) { return high_band_noise_level * a; });
-  std::transform(sin.begin(), sin.end(), N_high->im.begin() + 1,
-                 [&](float a) { return high_band_noise_level * a; });
-}
-
-}  // namespace aec3
-
-ComfortNoiseGenerator::ComfortNoiseGenerator(Aec3Optimization optimization)
-    : optimization_(optimization),
-      seed_(42),
-      N2_initial_(new std::array<float, kFftLengthBy2Plus1>()) {
-  N2_initial_->fill(0.f);
-  Y2_smoothed_.fill(0.f);
-  N2_.fill(1.0e6f);
-}
-
-ComfortNoiseGenerator::~ComfortNoiseGenerator() = default;
-
-void ComfortNoiseGenerator::Compute(
-    const AecState& aec_state,
-    const std::array<float, kFftLengthBy2Plus1>& capture_spectrum,
-    FftData* lower_band_noise,
-    FftData* upper_band_noise) {
-  RTC_DCHECK(lower_band_noise);
-  RTC_DCHECK(upper_band_noise);
-  const auto& Y2 = capture_spectrum;
-
-  if (!aec_state.SaturatedCapture()) {
-    // Smooth Y2.
-    std::transform(Y2_smoothed_.begin(), Y2_smoothed_.end(), Y2.begin(),
-                   Y2_smoothed_.begin(),
-                   [](float a, float b) { return a + 0.1f * (b - a); });
-
-    if (N2_counter_ > 50) {
-      // Update N2 from Y2_smoothed.
-      std::transform(N2_.begin(), N2_.end(), Y2_smoothed_.begin(), N2_.begin(),
-                     [](float a, float b) {
-                       return b < a ? (0.9f * b + 0.1f * a) * 1.0002f
-                                    : a * 1.0002f;
-                     });
-    }
-
-    if (N2_initial_) {
-      if (++N2_counter_ == 1000) {
-        N2_initial_.reset();
-      } else {
-        // Compute the N2_initial from N2.
-        std::transform(
-            N2_.begin(), N2_.end(), N2_initial_->begin(), N2_initial_->begin(),
-            [](float a, float b) { return a > b ? b + 0.001f * (a - b) : a; });
-      }
-    }
-  }
-
-  // Limit the noise to a floor of -96 dBFS.
-  constexpr float kNoiseFloor = 440.f;
-  for (auto& n : N2_) {
-    n = std::max(n, kNoiseFloor);
-  }
-  if (N2_initial_) {
-    for (auto& n : *N2_initial_) {
-      n = std::max(n, kNoiseFloor);
-    }
-  }
-
-  // Choose N2 estimate to use.
-  const std::array<float, kFftLengthBy2Plus1>& N2 =
-      N2_initial_ ? *N2_initial_ : N2_;
-
-  switch (optimization_) {
-#if defined(WEBRTC_ARCH_X86_FAMILY)
-    case Aec3Optimization::kSse2:
-      aec3::EstimateComfortNoise_SSE2(N2, &seed_, lower_band_noise,
-                                      upper_band_noise);
-      break;
-#endif
-    default:
-      aec3::EstimateComfortNoise(N2, &seed_, lower_band_noise,
-                                 upper_band_noise);
-  }
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/aec3/comfort_noise_generator.h b/modules/audio_processing/aec3/comfort_noise_generator.h
deleted file mode 100644
index 3684f48..0000000
--- a/modules/audio_processing/aec3/comfort_noise_generator.h
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- *  Copyright (c) 2017 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_PROCESSING_AEC3_COMFORT_NOISE_GENERATOR_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_AEC3_COMFORT_NOISE_GENERATOR_H_
-
-#include <array>
-#include <memory>
-
-#include "webrtc/modules/audio_processing/aec3/aec3_common.h"
-#include "webrtc/modules/audio_processing/aec3/aec_state.h"
-#include "webrtc/modules/audio_processing/aec3/fft_data.h"
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace webrtc {
-namespace aec3 {
-#if defined(WEBRTC_ARCH_X86_FAMILY)
-
-void EstimateComfortNoise_SSE2(const std::array<float, kFftLengthBy2Plus1>& N2,
-                               uint32_t* seed,
-                               FftData* lower_band_noise,
-                               FftData* upper_band_noise);
-#endif
-void EstimateComfortNoise(const std::array<float, kFftLengthBy2Plus1>& N2,
-                          uint32_t* seed,
-                          FftData* lower_band_noise,
-                          FftData* upper_band_noise);
-
-}  // namespace aec3
-
-// Generates the comfort noise.
-class ComfortNoiseGenerator {
- public:
-  explicit ComfortNoiseGenerator(Aec3Optimization optimization);
-  ~ComfortNoiseGenerator();
-
-  // Computes the comfort noise.
-  void Compute(const AecState& aec_state,
-               const std::array<float, kFftLengthBy2Plus1>& capture_spectrum,
-               FftData* lower_band_noise,
-               FftData* upper_band_noise);
-
-  // Returns the estimate of the background noise spectrum.
-  const std::array<float, kFftLengthBy2Plus1>& NoiseSpectrum() const {
-    return N2_;
-  }
-
- private:
-  const Aec3Optimization optimization_;
-  uint32_t seed_;
-  std::unique_ptr<std::array<float, kFftLengthBy2Plus1>> N2_initial_;
-  std::array<float, kFftLengthBy2Plus1> Y2_smoothed_;
-  std::array<float, kFftLengthBy2Plus1> N2_;
-  int N2_counter_ = 0;
-
-  RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(ComfortNoiseGenerator);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_AEC3_COMFORT_NOISE_GENERATOR_H_
diff --git a/modules/audio_processing/aec3/comfort_noise_generator_unittest.cc b/modules/audio_processing/aec3/comfort_noise_generator_unittest.cc
deleted file mode 100644
index 7cb0aa1..0000000
--- a/modules/audio_processing/aec3/comfort_noise_generator_unittest.cc
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- *  Copyright (c) 2017 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_processing/aec3/comfort_noise_generator.h"
-
-#include <algorithm>
-#include <numeric>
-
-#include "webrtc/rtc_base/random.h"
-#include "webrtc/system_wrappers/include/cpu_features_wrapper.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-namespace aec3 {
-namespace {
-
-float Power(const FftData& N) {
-  std::array<float, kFftLengthBy2Plus1> N2;
-  N.Spectrum(Aec3Optimization::kNone, &N2);
-  return std::accumulate(N2.begin(), N2.end(), 0.f) / N2.size();
-}
-
-}  // namespace
-
-#if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
-
-TEST(ComfortNoiseGenerator, NullLowerBandNoise) {
-  std::array<float, kFftLengthBy2Plus1> N2;
-  FftData noise;
-  EXPECT_DEATH(ComfortNoiseGenerator(DetectOptimization())
-                   .Compute(AecState(AudioProcessing::Config::EchoCanceller3{}),
-                            N2, nullptr, &noise),
-               "");
-}
-
-TEST(ComfortNoiseGenerator, NullUpperBandNoise) {
-  std::array<float, kFftLengthBy2Plus1> N2;
-  FftData noise;
-  EXPECT_DEATH(ComfortNoiseGenerator(DetectOptimization())
-                   .Compute(AecState(AudioProcessing::Config::EchoCanceller3{}),
-                            N2, &noise, nullptr),
-               "");
-}
-
-#endif
-
-#if defined(WEBRTC_ARCH_X86_FAMILY)
-// Verifies that the optimized methods are bitexact to their reference
-// counterparts.
-TEST(ComfortNoiseGenerator, TestOptimizations) {
-  if (WebRtc_GetCPUInfo(kSSE2) != 0) {
-    Random random_generator(42U);
-    uint32_t seed = 42;
-    uint32_t seed_SSE2 = 42;
-    std::array<float, kFftLengthBy2Plus1> N2;
-    FftData lower_band_noise;
-    FftData upper_band_noise;
-    FftData lower_band_noise_SSE2;
-    FftData upper_band_noise_SSE2;
-    for (int k = 0; k < 10; ++k) {
-      for (size_t j = 0; j < N2.size(); ++j) {
-        N2[j] = random_generator.Rand<float>() * 1000.f;
-      }
-
-      EstimateComfortNoise(N2, &seed, &lower_band_noise, &upper_band_noise);
-      EstimateComfortNoise_SSE2(N2, &seed_SSE2, &lower_band_noise_SSE2,
-                                &upper_band_noise_SSE2);
-      for (size_t j = 0; j < lower_band_noise.re.size(); ++j) {
-        EXPECT_NEAR(lower_band_noise.re[j], lower_band_noise_SSE2.re[j],
-                    0.00001f);
-        EXPECT_NEAR(upper_band_noise.re[j], upper_band_noise_SSE2.re[j],
-                    0.00001f);
-      }
-      for (size_t j = 1; j < lower_band_noise.re.size() - 1; ++j) {
-        EXPECT_NEAR(lower_band_noise.im[j], lower_band_noise_SSE2.im[j],
-                    0.00001f);
-        EXPECT_NEAR(upper_band_noise.im[j], upper_band_noise_SSE2.im[j],
-                    0.00001f);
-      }
-    }
-  }
-}
-
-#endif
-
-TEST(ComfortNoiseGenerator, CorrectLevel) {
-  ComfortNoiseGenerator cng(DetectOptimization());
-  AecState aec_state(AudioProcessing::Config::EchoCanceller3{});
-
-  std::array<float, kFftLengthBy2Plus1> N2;
-  N2.fill(1000.f * 1000.f);
-
-  FftData n_lower;
-  FftData n_upper;
-  n_lower.re.fill(0.f);
-  n_lower.im.fill(0.f);
-  n_upper.re.fill(0.f);
-  n_upper.im.fill(0.f);
-
-  // Ensure instantaneous updata to nonzero noise.
-  cng.Compute(aec_state, N2, &n_lower, &n_upper);
-  EXPECT_LT(0.f, Power(n_lower));
-  EXPECT_LT(0.f, Power(n_upper));
-
-  for (int k = 0; k < 10000; ++k) {
-    cng.Compute(aec_state, N2, &n_lower, &n_upper);
-  }
-  EXPECT_NEAR(N2[0], Power(n_lower), N2[0] / 10.f);
-  EXPECT_NEAR(N2[0], Power(n_upper), N2[0] / 10.f);
-}
-
-}  // namespace aec3
-}  // namespace webrtc
diff --git a/modules/audio_processing/aec3/decimator_by_4.cc b/modules/audio_processing/aec3/decimator_by_4.cc
deleted file mode 100644
index 94d11d2..0000000
--- a/modules/audio_processing/aec3/decimator_by_4.cc
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- *  Copyright (c) 2017 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_processing/aec3/decimator_by_4.h"
-
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-namespace {
-
-// [B,A] = butter(2,1500/16000) which are the same as [B,A] =
-// butter(2,750/8000).
-const CascadedBiQuadFilter::BiQuadCoefficients kLowPassFilterCoefficients = {
-    {0.0179f, 0.0357f, 0.0179f},
-    {-1.5879f, 0.6594f}};
-
-}  // namespace
-
-DecimatorBy4::DecimatorBy4()
-    : low_pass_filter_(kLowPassFilterCoefficients, 3) {}
-
-void DecimatorBy4::Decimate(rtc::ArrayView<const float> in,
-                            rtc::ArrayView<float> out) {
-  RTC_DCHECK_EQ(kBlockSize, in.size());
-  RTC_DCHECK_EQ(kSubBlockSize, out.size());
-  std::array<float, kBlockSize> x;
-
-  // Limit the frequency content of the signal to avoid aliasing.
-  low_pass_filter_.Process(in, x);
-
-  // Downsample the signal.
-  for (size_t j = 0, k = 0; j < out.size(); ++j, k += 4) {
-    RTC_DCHECK_GT(kBlockSize, k);
-    out[j] = x[k];
-  }
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/aec3/decimator_by_4.h b/modules/audio_processing/aec3/decimator_by_4.h
deleted file mode 100644
index cafe82c..0000000
--- a/modules/audio_processing/aec3/decimator_by_4.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- *  Copyright (c) 2017 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_PROCESSING_AEC3_DECIMATOR_BY_4_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_AEC3_DECIMATOR_BY_4_H_
-
-#include <array>
-
-#include "webrtc/api/array_view.h"
-#include "webrtc/modules/audio_processing/aec3/aec3_common.h"
-#include "webrtc/modules/audio_processing/aec3/cascaded_biquad_filter.h"
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace webrtc {
-
-// Provides functionality for decimating a signal by 4.
-class DecimatorBy4 {
- public:
-  DecimatorBy4();
-
-  // Downsamples the signal.
-  void Decimate(rtc::ArrayView<const float> in, rtc::ArrayView<float> out);
-
- private:
-  CascadedBiQuadFilter low_pass_filter_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(DecimatorBy4);
-};
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_AEC3_DECIMATOR_BY_4_H_
diff --git a/modules/audio_processing/aec3/decimator_by_4_unittest.cc b/modules/audio_processing/aec3/decimator_by_4_unittest.cc
deleted file mode 100644
index 0d3d183..0000000
--- a/modules/audio_processing/aec3/decimator_by_4_unittest.cc
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- *  Copyright (c) 2017 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_processing/aec3/decimator_by_4.h"
-
-#include <math.h>
-#include <algorithm>
-#include <array>
-#include <numeric>
-#include <sstream>
-#include <string>
-#include <vector>
-
-#include "webrtc/modules/audio_processing/aec3/aec3_common.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-namespace {
-
-std::string ProduceDebugText(int sample_rate_hz) {
-  std::ostringstream ss;
-  ss << "Sample rate: " << sample_rate_hz;
-  return ss.str();
-}
-
-constexpr float kPi = 3.141592f;
-constexpr size_t kNumStartupBlocks = 50;
-constexpr size_t kNumBlocks = 1000;
-
-void ProduceDecimatedSinusoidalOutputPower(int sample_rate_hz,
-                                           float sinusoidal_frequency_hz,
-                                           float* input_power,
-                                           float* output_power) {
-  float input[kBlockSize * kNumBlocks];
-
-  // Produce a sinusoid of the specified frequency.
-  for (size_t k = 0; k < kBlockSize * kNumBlocks; ++k) {
-    input[k] =
-        32767.f * sin(2.f * kPi * sinusoidal_frequency_hz * k / sample_rate_hz);
-  }
-
-  DecimatorBy4 decimator;
-  std::array<float, kSubBlockSize * kNumBlocks> output;
-
-  for (size_t k = 0; k < kNumBlocks; ++k) {
-    std::array<float, kSubBlockSize> sub_block;
-
-    decimator.Decimate(
-        rtc::ArrayView<const float>(&input[k * kBlockSize], kBlockSize),
-        sub_block);
-
-    std::copy(sub_block.begin(), sub_block.end(),
-              output.begin() + k * kSubBlockSize);
-  }
-
-  ASSERT_GT(kNumBlocks, kNumStartupBlocks);
-  rtc::ArrayView<const float> input_to_evaluate(
-      &input[kNumStartupBlocks * kBlockSize],
-      (kNumBlocks - kNumStartupBlocks) * kBlockSize);
-  rtc::ArrayView<const float> output_to_evaluate(
-      &output[kNumStartupBlocks * kSubBlockSize],
-      (kNumBlocks - kNumStartupBlocks) * kSubBlockSize);
-  *input_power =
-      std::inner_product(input_to_evaluate.begin(), input_to_evaluate.end(),
-                         input_to_evaluate.begin(), 0.f) /
-      input_to_evaluate.size();
-  *output_power =
-      std::inner_product(output_to_evaluate.begin(), output_to_evaluate.end(),
-                         output_to_evaluate.begin(), 0.f) /
-      output_to_evaluate.size();
-}
-
-}  // namespace
-
-// Verifies that there is little aliasing from upper frequencies in the
-// downsampling.
-TEST(DecimatorBy4, NoLeakageFromUpperFrequencies) {
-  float input_power;
-  float output_power;
-  for (auto rate : {8000, 16000, 32000, 48000}) {
-    ProduceDebugText(rate);
-    ProduceDecimatedSinusoidalOutputPower(rate, 3.f / 8.f * rate, &input_power,
-                                          &output_power);
-    EXPECT_GT(0.0001f * input_power, output_power);
-  }
-}
-
-// Verifies that the impact of low-frequency content is small during the
-// downsampling.
-TEST(DecimatorBy4, NoImpactOnLowerFrequencies) {
-  float input_power;
-  float output_power;
-  for (auto rate : {8000, 16000, 32000, 48000}) {
-    ProduceDebugText(rate);
-    ProduceDecimatedSinusoidalOutputPower(rate, 200.f, &input_power,
-                                          &output_power);
-    EXPECT_LT(0.7f * input_power, output_power);
-  }
-}
-
-#if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
-// Verifies the check for the input size.
-TEST(DecimatorBy4, WrongInputSize) {
-  DecimatorBy4 decimator;
-  std::vector<float> x(std::vector<float>(kBlockSize - 1, 0.f));
-  std::array<float, kSubBlockSize> x_downsampled;
-  EXPECT_DEATH(decimator.Decimate(x, x_downsampled), "");
-}
-
-// Verifies the check for non-null output parameter.
-TEST(DecimatorBy4, NullOutput) {
-  DecimatorBy4 decimator;
-  std::vector<float> x(std::vector<float>(kBlockSize, 0.f));
-  EXPECT_DEATH(decimator.Decimate(x, nullptr), "");
-}
-
-#endif
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/aec3/downsampled_render_buffer.cc b/modules/audio_processing/aec3/downsampled_render_buffer.cc
deleted file mode 100644
index 195853a..0000000
--- a/modules/audio_processing/aec3/downsampled_render_buffer.cc
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- *  Copyright (c) 2017 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_processing/aec3/downsampled_render_buffer.h"
-
-namespace webrtc {
-
-DownsampledRenderBuffer::DownsampledRenderBuffer() = default;
-
-DownsampledRenderBuffer::~DownsampledRenderBuffer() = default;
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/aec3/downsampled_render_buffer.h b/modules/audio_processing/aec3/downsampled_render_buffer.h
deleted file mode 100644
index e639ea8..0000000
--- a/modules/audio_processing/aec3/downsampled_render_buffer.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- *  Copyright (c) 2017 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_PROCESSING_AEC3_DOWNSAMPLED_RENDER_BUFFER_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_AEC3_DOWNSAMPLED_RENDER_BUFFER_H_
-
-#include <array>
-
-#include "webrtc/modules/audio_processing/aec3/aec3_common.h"
-
-namespace webrtc {
-
-// Holds the circular buffer of the downsampled render data.
-struct DownsampledRenderBuffer {
-  DownsampledRenderBuffer();
-  ~DownsampledRenderBuffer();
-  std::array<float, kDownsampledRenderBufferSize> buffer = {};
-  int position = 0;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_AEC3_DOWNSAMPLED_RENDER_BUFFER_H_
diff --git a/modules/audio_processing/aec3/echo_canceller3.cc b/modules/audio_processing/aec3/echo_canceller3.cc
deleted file mode 100644
index 143f1b9..0000000
--- a/modules/audio_processing/aec3/echo_canceller3.cc
+++ /dev/null
@@ -1,362 +0,0 @@
-/*
- *  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_processing/aec3/echo_canceller3.h"
-
-#include <sstream>
-
-#include "webrtc/modules/audio_processing/logging/apm_data_dumper.h"
-#include "webrtc/rtc_base/atomicops.h"
-
-namespace webrtc {
-
-namespace {
-
-enum class EchoCanceller3ApiCall { kCapture, kRender };
-
-bool DetectSaturation(rtc::ArrayView<const float> y) {
-  for (auto y_k : y) {
-    if (y_k >= 32700.0f || y_k <= -32700.0f) {
-      return true;
-    }
-  }
-  return false;
-}
-
-void FillSubFrameView(AudioBuffer* frame,
-                      size_t sub_frame_index,
-                      std::vector<rtc::ArrayView<float>>* sub_frame_view) {
-  RTC_DCHECK_GE(1, sub_frame_index);
-  RTC_DCHECK_LE(0, sub_frame_index);
-  RTC_DCHECK_EQ(frame->num_bands(), sub_frame_view->size());
-  for (size_t k = 0; k < sub_frame_view->size(); ++k) {
-    (*sub_frame_view)[k] = rtc::ArrayView<float>(
-        &frame->split_bands_f(0)[k][sub_frame_index * kSubFrameLength],
-        kSubFrameLength);
-  }
-}
-
-void FillSubFrameView(std::vector<std::vector<float>>* frame,
-                      size_t sub_frame_index,
-                      std::vector<rtc::ArrayView<float>>* sub_frame_view) {
-  RTC_DCHECK_GE(1, sub_frame_index);
-  RTC_DCHECK_EQ(frame->size(), sub_frame_view->size());
-  for (size_t k = 0; k < frame->size(); ++k) {
-    (*sub_frame_view)[k] = rtc::ArrayView<float>(
-        &(*frame)[k][sub_frame_index * kSubFrameLength], kSubFrameLength);
-  }
-}
-
-void ProcessCaptureFrameContent(
-    AudioBuffer* capture,
-    bool level_change,
-    bool saturated_microphone_signal,
-    size_t sub_frame_index,
-    FrameBlocker* capture_blocker,
-    BlockFramer* output_framer,
-    BlockProcessor* block_processor,
-    std::vector<std::vector<float>>* block,
-    std::vector<rtc::ArrayView<float>>* sub_frame_view) {
-  FillSubFrameView(capture, sub_frame_index, sub_frame_view);
-  capture_blocker->InsertSubFrameAndExtractBlock(*sub_frame_view, block);
-  block_processor->ProcessCapture(level_change, saturated_microphone_signal,
-                                  block);
-  output_framer->InsertBlockAndExtractSubFrame(*block, sub_frame_view);
-}
-
-void ProcessRemainingCaptureFrameContent(
-    bool level_change,
-    bool saturated_microphone_signal,
-    FrameBlocker* capture_blocker,
-    BlockFramer* output_framer,
-    BlockProcessor* block_processor,
-    std::vector<std::vector<float>>* block) {
-  if (!capture_blocker->IsBlockAvailable()) {
-    return;
-  }
-
-  capture_blocker->ExtractBlock(block);
-  block_processor->ProcessCapture(level_change, saturated_microphone_signal,
-                                  block);
-  output_framer->InsertBlock(*block);
-}
-
-void BufferRenderFrameContent(
-    std::vector<std::vector<float>>* render_frame,
-    size_t sub_frame_index,
-    FrameBlocker* render_blocker,
-    BlockProcessor* block_processor,
-    std::vector<std::vector<float>>* block,
-    std::vector<rtc::ArrayView<float>>* sub_frame_view) {
-  FillSubFrameView(render_frame, sub_frame_index, sub_frame_view);
-  render_blocker->InsertSubFrameAndExtractBlock(*sub_frame_view, block);
-  block_processor->BufferRender(*block);
-}
-
-void BufferRemainingRenderFrameContent(FrameBlocker* render_blocker,
-                                       BlockProcessor* block_processor,
-                                       std::vector<std::vector<float>>* block) {
-  if (!render_blocker->IsBlockAvailable()) {
-    return;
-  }
-  render_blocker->ExtractBlock(block);
-  block_processor->BufferRender(*block);
-}
-
-void CopyBufferIntoFrame(AudioBuffer* buffer,
-                         size_t num_bands,
-                         size_t frame_length,
-                         std::vector<std::vector<float>>* frame) {
-  RTC_DCHECK_EQ(num_bands, frame->size());
-  RTC_DCHECK_EQ(frame_length, (*frame)[0].size());
-  for (size_t k = 0; k < num_bands; ++k) {
-    rtc::ArrayView<float> buffer_view(&buffer->split_bands_f(0)[k][0],
-                                      frame_length);
-    std::copy(buffer_view.begin(), buffer_view.end(), (*frame)[k].begin());
-  }
-}
-
-// [B,A] = butter(2,100/4000,'high')
-const CascadedBiQuadFilter::BiQuadCoefficients
-    kHighPassFilterCoefficients_8kHz = {{0.94598f, -1.89195f, 0.94598f},
-                                        {-1.88903f, 0.89487f}};
-const int kNumberOfHighPassBiQuads_8kHz = 1;
-
-// [B,A] = butter(2,100/8000,'high')
-const CascadedBiQuadFilter::BiQuadCoefficients
-    kHighPassFilterCoefficients_16kHz = {{0.97261f, -1.94523f, 0.97261f},
-                                         {-1.94448f, 0.94598f}};
-const int kNumberOfHighPassBiQuads_16kHz = 1;
-
-}  // namespace
-
-class EchoCanceller3::RenderWriter {
- public:
-  RenderWriter(ApmDataDumper* data_dumper,
-               SwapQueue<std::vector<std::vector<float>>,
-                         Aec3RenderQueueItemVerifier>* render_transfer_queue,
-               std::unique_ptr<CascadedBiQuadFilter> render_highpass_filter,
-               int sample_rate_hz,
-               int frame_length,
-               int num_bands);
-  ~RenderWriter();
-  void Insert(AudioBuffer* input);
-
- private:
-  ApmDataDumper* data_dumper_;
-  const int sample_rate_hz_;
-  const size_t frame_length_;
-  const int num_bands_;
-  std::unique_ptr<CascadedBiQuadFilter> render_highpass_filter_;
-  std::vector<std::vector<float>> render_queue_input_frame_;
-  SwapQueue<std::vector<std::vector<float>>, Aec3RenderQueueItemVerifier>*
-      render_transfer_queue_;
-  RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(RenderWriter);
-};
-
-EchoCanceller3::RenderWriter::RenderWriter(
-    ApmDataDumper* data_dumper,
-    SwapQueue<std::vector<std::vector<float>>, Aec3RenderQueueItemVerifier>*
-        render_transfer_queue,
-    std::unique_ptr<CascadedBiQuadFilter> render_highpass_filter,
-    int sample_rate_hz,
-    int frame_length,
-    int num_bands)
-    : data_dumper_(data_dumper),
-      sample_rate_hz_(sample_rate_hz),
-      frame_length_(frame_length),
-      num_bands_(num_bands),
-      render_highpass_filter_(std::move(render_highpass_filter)),
-      render_queue_input_frame_(num_bands_,
-                                std::vector<float>(frame_length_, 0.f)),
-      render_transfer_queue_(render_transfer_queue) {
-  RTC_DCHECK(data_dumper);
-}
-
-EchoCanceller3::RenderWriter::~RenderWriter() = default;
-
-void EchoCanceller3::RenderWriter::Insert(AudioBuffer* input) {
-  RTC_DCHECK_EQ(1, input->num_channels());
-  RTC_DCHECK_EQ(frame_length_, input->num_frames_per_band());
-  data_dumper_->DumpWav("aec3_render_input", frame_length_,
-                        &input->split_bands_f(0)[0][0],
-                        LowestBandRate(sample_rate_hz_), 1);
-
-  CopyBufferIntoFrame(input, num_bands_, frame_length_,
-                      &render_queue_input_frame_);
-
-  if (render_highpass_filter_) {
-    render_highpass_filter_->Process(render_queue_input_frame_[0]);
-  }
-
-  static_cast<void>(render_transfer_queue_->Insert(&render_queue_input_frame_));
-}
-
-int EchoCanceller3::instance_count_ = 0;
-
-EchoCanceller3::EchoCanceller3(
-    const AudioProcessing::Config::EchoCanceller3& config,
-    int sample_rate_hz,
-    bool use_highpass_filter)
-    : EchoCanceller3(sample_rate_hz,
-                     use_highpass_filter,
-                     std::unique_ptr<BlockProcessor>(
-                         BlockProcessor::Create(config, sample_rate_hz))) {}
-EchoCanceller3::EchoCanceller3(int sample_rate_hz,
-                               bool use_highpass_filter,
-                               std::unique_ptr<BlockProcessor> block_processor)
-    : data_dumper_(
-          new ApmDataDumper(rtc::AtomicOps::Increment(&instance_count_))),
-      sample_rate_hz_(sample_rate_hz),
-      num_bands_(NumBandsForRate(sample_rate_hz_)),
-      frame_length_(rtc::CheckedDivExact(LowestBandRate(sample_rate_hz_), 100)),
-      output_framer_(num_bands_),
-      capture_blocker_(num_bands_),
-      render_blocker_(num_bands_),
-      render_transfer_queue_(
-          kRenderTransferQueueSize,
-          std::vector<std::vector<float>>(
-              num_bands_,
-              std::vector<float>(frame_length_, 0.f)),
-          Aec3RenderQueueItemVerifier(num_bands_, frame_length_)),
-      block_processor_(std::move(block_processor)),
-      render_queue_output_frame_(num_bands_,
-                                 std::vector<float>(frame_length_, 0.f)),
-      block_(num_bands_, std::vector<float>(kBlockSize, 0.f)),
-      sub_frame_view_(num_bands_) {
-  RTC_DCHECK(ValidFullBandRate(sample_rate_hz_));
-
-  std::unique_ptr<CascadedBiQuadFilter> render_highpass_filter;
-  if (use_highpass_filter) {
-    render_highpass_filter.reset(new CascadedBiQuadFilter(
-        sample_rate_hz_ == 8000 ? kHighPassFilterCoefficients_8kHz
-                                : kHighPassFilterCoefficients_16kHz,
-        sample_rate_hz_ == 8000 ? kNumberOfHighPassBiQuads_8kHz
-                                : kNumberOfHighPassBiQuads_16kHz));
-    capture_highpass_filter_.reset(new CascadedBiQuadFilter(
-        sample_rate_hz_ == 8000 ? kHighPassFilterCoefficients_8kHz
-                                : kHighPassFilterCoefficients_16kHz,
-        sample_rate_hz_ == 8000 ? kNumberOfHighPassBiQuads_8kHz
-                                : kNumberOfHighPassBiQuads_16kHz));
-  }
-
-  render_writer_.reset(
-      new RenderWriter(data_dumper_.get(), &render_transfer_queue_,
-                       std::move(render_highpass_filter), sample_rate_hz_,
-                       frame_length_, num_bands_));
-
-  RTC_DCHECK_EQ(num_bands_, std::max(sample_rate_hz_, 16000) / 16000);
-  RTC_DCHECK_GE(kMaxNumBands, num_bands_);
-}
-
-EchoCanceller3::~EchoCanceller3() = default;
-
-void EchoCanceller3::AnalyzeRender(AudioBuffer* render) {
-  RTC_DCHECK_RUNS_SERIALIZED(&render_race_checker_);
-  RTC_DCHECK(render);
-  data_dumper_->DumpRaw("aec3_call_order",
-                        static_cast<int>(EchoCanceller3ApiCall::kRender));
-
-  return render_writer_->Insert(render);
-}
-
-void EchoCanceller3::AnalyzeCapture(AudioBuffer* capture) {
-  RTC_DCHECK_RUNS_SERIALIZED(&capture_race_checker_);
-  RTC_DCHECK(capture);
-  data_dumper_->DumpWav("aec3_capture_analyze_input", capture->num_frames(),
-                        capture->channels_f()[0], sample_rate_hz_, 1);
-
-  saturated_microphone_signal_ = false;
-  for (size_t k = 0; k < capture->num_channels(); ++k) {
-    saturated_microphone_signal_ |=
-        DetectSaturation(rtc::ArrayView<const float>(capture->channels_f()[k],
-                                                     capture->num_frames()));
-    if (saturated_microphone_signal_) {
-      break;
-    }
-  }
-}
-
-void EchoCanceller3::ProcessCapture(AudioBuffer* capture, bool level_change) {
-  RTC_DCHECK_RUNS_SERIALIZED(&capture_race_checker_);
-  RTC_DCHECK(capture);
-  RTC_DCHECK_EQ(1u, capture->num_channels());
-  RTC_DCHECK_EQ(num_bands_, capture->num_bands());
-  RTC_DCHECK_EQ(frame_length_, capture->num_frames_per_band());
-  data_dumper_->DumpRaw("aec3_call_order",
-                        static_cast<int>(EchoCanceller3ApiCall::kCapture));
-
-  rtc::ArrayView<float> capture_lower_band =
-      rtc::ArrayView<float>(&capture->split_bands_f(0)[0][0], frame_length_);
-
-  data_dumper_->DumpWav("aec3_capture_input", capture_lower_band,
-                        LowestBandRate(sample_rate_hz_), 1);
-
-  EmptyRenderQueue();
-
-  if (capture_highpass_filter_) {
-    capture_highpass_filter_->Process(capture_lower_band);
-  }
-
-  ProcessCaptureFrameContent(
-      capture, level_change, saturated_microphone_signal_, 0, &capture_blocker_,
-      &output_framer_, block_processor_.get(), &block_, &sub_frame_view_);
-
-  if (sample_rate_hz_ != 8000) {
-    ProcessCaptureFrameContent(
-        capture, level_change, saturated_microphone_signal_, 1,
-        &capture_blocker_, &output_framer_, block_processor_.get(), &block_,
-        &sub_frame_view_);
-  }
-
-  ProcessRemainingCaptureFrameContent(
-      level_change, saturated_microphone_signal_, &capture_blocker_,
-      &output_framer_, block_processor_.get(), &block_);
-
-  data_dumper_->DumpWav("aec3_capture_output", frame_length_,
-                        &capture->split_bands_f(0)[0][0],
-                        LowestBandRate(sample_rate_hz_), 1);
-}
-
-std::string EchoCanceller3::ToString(
-    const AudioProcessing::Config::EchoCanceller3& config) {
-  std::stringstream ss;
-  ss << "{"
-     << "enabled: " << (config.enabled ? "true" : "false") << "}";
-  return ss.str();
-}
-
-bool EchoCanceller3::Validate(
-    const AudioProcessing::Config::EchoCanceller3& config) {
-  return true;
-}
-
-void EchoCanceller3::EmptyRenderQueue() {
-  RTC_DCHECK_RUNS_SERIALIZED(&capture_race_checker_);
-  bool frame_to_buffer =
-      render_transfer_queue_.Remove(&render_queue_output_frame_);
-  while (frame_to_buffer) {
-    BufferRenderFrameContent(&render_queue_output_frame_, 0, &render_blocker_,
-                             block_processor_.get(), &block_, &sub_frame_view_);
-
-    if (sample_rate_hz_ != 8000) {
-      BufferRenderFrameContent(&render_queue_output_frame_, 1, &render_blocker_,
-                               block_processor_.get(), &block_,
-                               &sub_frame_view_);
-    }
-
-    BufferRemainingRenderFrameContent(&render_blocker_, block_processor_.get(),
-                                      &block_);
-
-    frame_to_buffer =
-        render_transfer_queue_.Remove(&render_queue_output_frame_);
-  }
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/aec3/echo_canceller3.h b/modules/audio_processing/aec3/echo_canceller3.h
deleted file mode 100644
index f3b69e5..0000000
--- a/modules/audio_processing/aec3/echo_canceller3.h
+++ /dev/null
@@ -1,138 +0,0 @@
-/*
- *  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_PROCESSING_AEC3_ECHO_CANCELLER3_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_AEC3_ECHO_CANCELLER3_H_
-
-#include "webrtc/modules/audio_processing/aec3/block_framer.h"
-#include "webrtc/modules/audio_processing/aec3/block_processor.h"
-#include "webrtc/modules/audio_processing/aec3/cascaded_biquad_filter.h"
-#include "webrtc/modules/audio_processing/aec3/frame_blocker.h"
-#include "webrtc/modules/audio_processing/audio_buffer.h"
-#include "webrtc/modules/audio_processing/include/audio_processing.h"
-#include "webrtc/modules/audio_processing/logging/apm_data_dumper.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/race_checker.h"
-#include "webrtc/rtc_base/swap_queue.h"
-
-namespace webrtc {
-
-// Functor for verifying the invariance of the frames being put into the render
-// queue.
-class Aec3RenderQueueItemVerifier {
- public:
-  explicit Aec3RenderQueueItemVerifier(size_t num_bands, size_t frame_length)
-      : num_bands_(num_bands), frame_length_(frame_length) {}
-
-  bool operator()(const std::vector<std::vector<float>>& v) const {
-    if (v.size() != num_bands_) {
-      return false;
-    }
-    for (const auto& v_k : v) {
-      if (v_k.size() != frame_length_) {
-        return false;
-      }
-    }
-    return true;
-  }
-
- private:
-  const size_t num_bands_;
-  const size_t frame_length_;
-};
-
-// Main class for the echo canceller3.
-// It does 4 things:
-// -Receives 10 ms frames of band-split audio.
-// -Optionally applies an anti-hum (high-pass) filter on the
-// received signals.
-// -Provides the lower level echo canceller functionality with
-// blocks of 64 samples of audio data.
-// -Partially handles the jitter in the render and capture API
-// call sequence.
-//
-// The class is supposed to be used in a non-concurrent manner apart from the
-// AnalyzeRender call which can be called concurrently with the other methods.
-class EchoCanceller3 {
- public:
-  // Normal c-tor to use.
-  EchoCanceller3(const AudioProcessing::Config::EchoCanceller3& config,
-                 int sample_rate_hz,
-                 bool use_highpass_filter);
-  // Testing c-tor that is used only for testing purposes.
-  EchoCanceller3(int sample_rate_hz,
-                 bool use_highpass_filter,
-                 std::unique_ptr<BlockProcessor> block_processor);
-  ~EchoCanceller3();
-  // Analyzes and stores an internal copy of the split-band domain render
-  // signal.
-  void AnalyzeRender(AudioBuffer* farend);
-  // Analyzes the full-band domain capture signal to detect signal saturation.
-  void AnalyzeCapture(AudioBuffer* capture);
-  // Processes the split-band domain capture signal in order to remove any echo
-  // present in the signal.
-  void ProcessCapture(AudioBuffer* capture, bool level_change);
-
-  // Signals whether an external detector has detected echo leakage from the
-  // echo canceller.
-  // Note that in the case echo leakage has been flagged, it should be unflagged
-  // once it is no longer occurring.
-  void UpdateEchoLeakageStatus(bool leakage_detected) {
-    RTC_DCHECK_RUNS_SERIALIZED(&capture_race_checker_);
-    block_processor_->UpdateEchoLeakageStatus(leakage_detected);
-  }
-
-  // Validates a config.
-  static bool Validate(const AudioProcessing::Config::EchoCanceller3& config);
-  // Dumps a config to a string.
-  static std::string ToString(
-      const AudioProcessing::Config::EchoCanceller3& config);
-
- private:
-  class RenderWriter;
-
-  // Empties the render SwapQueue.
-  void EmptyRenderQueue();
-
-  rtc::RaceChecker capture_race_checker_;
-  rtc::RaceChecker render_race_checker_;
-
-  // State that is accessed by the AnalyzeRender call.
-  std::unique_ptr<RenderWriter> render_writer_
-      RTC_GUARDED_BY(render_race_checker_);
-
-  // State that may be accessed by the capture thread.
-  static int instance_count_;
-  std::unique_ptr<ApmDataDumper> data_dumper_;
-  const int sample_rate_hz_;
-  const int num_bands_;
-  const size_t frame_length_;
-  BlockFramer output_framer_ RTC_GUARDED_BY(capture_race_checker_);
-  FrameBlocker capture_blocker_ RTC_GUARDED_BY(capture_race_checker_);
-  FrameBlocker render_blocker_ RTC_GUARDED_BY(capture_race_checker_);
-  SwapQueue<std::vector<std::vector<float>>, Aec3RenderQueueItemVerifier>
-      render_transfer_queue_;
-  std::unique_ptr<BlockProcessor> block_processor_
-      RTC_GUARDED_BY(capture_race_checker_);
-  std::vector<std::vector<float>> render_queue_output_frame_
-      RTC_GUARDED_BY(capture_race_checker_);
-  std::unique_ptr<CascadedBiQuadFilter> capture_highpass_filter_
-      RTC_GUARDED_BY(capture_race_checker_);
-  bool saturated_microphone_signal_ RTC_GUARDED_BY(capture_race_checker_) =
-      false;
-  std::vector<std::vector<float>> block_ RTC_GUARDED_BY(capture_race_checker_);
-  std::vector<rtc::ArrayView<float>> sub_frame_view_
-      RTC_GUARDED_BY(capture_race_checker_);
-
-  RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(EchoCanceller3);
-};
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_AEC3_ECHO_CANCELLER3_H_
diff --git a/modules/audio_processing/aec3/echo_canceller3_unittest.cc b/modules/audio_processing/aec3/echo_canceller3_unittest.cc
deleted file mode 100644
index ac3f709..0000000
--- a/modules/audio_processing/aec3/echo_canceller3_unittest.cc
+++ /dev/null
@@ -1,754 +0,0 @@
-/*
- *  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_processing/aec3/echo_canceller3.h"
-
-#include <deque>
-#include <memory>
-#include <sstream>
-#include <string>
-#include <utility>
-#include <vector>
-
-#include "webrtc/modules/audio_processing/aec3/aec3_common.h"
-#include "webrtc/modules/audio_processing/aec3/block_processor.h"
-#include "webrtc/modules/audio_processing/aec3/frame_blocker.h"
-#include "webrtc/modules/audio_processing/aec3/mock/mock_block_processor.h"
-#include "webrtc/modules/audio_processing/audio_buffer.h"
-#include "webrtc/test/gmock.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-namespace {
-
-using testing::StrictMock;
-using testing::_;
-
-// Populates the frame with linearly increasing sample values for each band,
-// with a band-specific offset, in order to allow simple bitexactness
-// verification for each band.
-void PopulateInputFrame(size_t frame_length,
-                        size_t num_bands,
-                        size_t frame_index,
-                        float* const* frame,
-                        int offset) {
-  for (size_t k = 0; k < num_bands; ++k) {
-    for (size_t i = 0; i < frame_length; ++i) {
-      float value = static_cast<int>(frame_index * frame_length + i) + offset;
-      frame[k][i] = (value > 0 ? 5000 * k + value : 0);
-    }
-  }
-}
-
-// Populates the frame with linearly increasing sample values.
-void PopulateInputFrame(size_t frame_length,
-                        size_t frame_index,
-                        float* frame,
-                        int offset) {
-  for (size_t i = 0; i < frame_length; ++i) {
-    float value = static_cast<int>(frame_index * frame_length + i) + offset;
-    frame[i] = std::max(value, 0.f);
-  }
-}
-
-// Verifies the that samples in the output frame are identical to the samples
-// that were produced for the input frame, with an offset in order to compensate
-// for buffering delays.
-bool VerifyOutputFrameBitexactness(size_t frame_length,
-                                   size_t num_bands,
-                                   size_t frame_index,
-                                   const float* const* frame,
-                                   int offset) {
-  float reference_frame_data[kMaxNumBands][2 * kSubFrameLength];
-  float* reference_frame[kMaxNumBands];
-  for (size_t k = 0; k < num_bands; ++k) {
-    reference_frame[k] = &reference_frame_data[k][0];
-  }
-
-  PopulateInputFrame(frame_length, num_bands, frame_index, reference_frame,
-                     offset);
-  for (size_t k = 0; k < num_bands; ++k) {
-    for (size_t i = 0; i < frame_length; ++i) {
-      if (reference_frame[k][i] != frame[k][i]) {
-        return false;
-      }
-    }
-  }
-
-  return true;
-}
-
-// Class for testing that the capture data is properly received by the block
-// processor and that the processor data is properly passed to the
-// EchoCanceller3 output.
-class CaptureTransportVerificationProcessor : public BlockProcessor {
- public:
-  explicit CaptureTransportVerificationProcessor(size_t num_bands) {}
-  ~CaptureTransportVerificationProcessor() override = default;
-
-  void ProcessCapture(bool level_change,
-                      bool saturated_microphone_signal,
-                      std::vector<std::vector<float>>* capture_block) override {
-  }
-
-  void BufferRender(const std::vector<std::vector<float>>& block) override {}
-
-  void UpdateEchoLeakageStatus(bool leakage_detected) override {}
-
- private:
-  RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(CaptureTransportVerificationProcessor);
-};
-
-// Class for testing that the render data is properly received by the block
-// processor.
-class RenderTransportVerificationProcessor : public BlockProcessor {
- public:
-  explicit RenderTransportVerificationProcessor(size_t num_bands) {}
-  ~RenderTransportVerificationProcessor() override = default;
-
-  void ProcessCapture(bool level_change,
-                      bool saturated_microphone_signal,
-                      std::vector<std::vector<float>>* capture_block) override {
-    std::vector<std::vector<float>> render_block =
-        received_render_blocks_.front();
-    received_render_blocks_.pop_front();
-    capture_block->swap(render_block);
-  }
-
-  void BufferRender(const std::vector<std::vector<float>>& block) override {
-    received_render_blocks_.push_back(block);
-  }
-
-  void UpdateEchoLeakageStatus(bool leakage_detected) override {}
-
- private:
-  std::deque<std::vector<std::vector<float>>> received_render_blocks_;
-  RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(RenderTransportVerificationProcessor);
-};
-
-class EchoCanceller3Tester {
- public:
-  explicit EchoCanceller3Tester(int sample_rate_hz)
-      : sample_rate_hz_(sample_rate_hz),
-        num_bands_(NumBandsForRate(sample_rate_hz_)),
-        frame_length_(sample_rate_hz_ == 8000 ? 80 : 160),
-        fullband_frame_length_(rtc::CheckedDivExact(sample_rate_hz_, 100)),
-        capture_buffer_(fullband_frame_length_,
-                        1,
-                        fullband_frame_length_,
-                        1,
-                        fullband_frame_length_),
-        render_buffer_(fullband_frame_length_,
-                       1,
-                       fullband_frame_length_,
-                       1,
-                       fullband_frame_length_) {}
-
-  // Verifies that the capture data is properly received by the block processor
-  // and that the processor data is properly passed to the EchoCanceller3
-  // output.
-  void RunCaptureTransportVerificationTest() {
-    EchoCanceller3 aec3(
-        sample_rate_hz_, false,
-        std::unique_ptr<BlockProcessor>(
-            new CaptureTransportVerificationProcessor(num_bands_)));
-
-    for (size_t frame_index = 0; frame_index < kNumFramesToProcess;
-         ++frame_index) {
-      aec3.AnalyzeCapture(&capture_buffer_);
-      OptionalBandSplit();
-      PopulateInputFrame(frame_length_, num_bands_, frame_index,
-                         &capture_buffer_.split_bands_f(0)[0], 0);
-      PopulateInputFrame(frame_length_, frame_index,
-                         &render_buffer_.channels_f()[0][0], 0);
-
-      aec3.AnalyzeRender(&render_buffer_);
-      aec3.ProcessCapture(&capture_buffer_, false);
-      EXPECT_TRUE(VerifyOutputFrameBitexactness(
-          frame_length_, num_bands_, frame_index,
-          &capture_buffer_.split_bands_f(0)[0], -64));
-    }
-  }
-
-  // Test method for testing that the render data is properly received by the
-  // block processor.
-  void RunRenderTransportVerificationTest() {
-    EchoCanceller3 aec3(
-        sample_rate_hz_, false,
-        std::unique_ptr<BlockProcessor>(
-            new RenderTransportVerificationProcessor(num_bands_)));
-
-    for (size_t frame_index = 0; frame_index < kNumFramesToProcess;
-         ++frame_index) {
-      aec3.AnalyzeCapture(&capture_buffer_);
-      OptionalBandSplit();
-      PopulateInputFrame(frame_length_, num_bands_, frame_index,
-                         &capture_buffer_.split_bands_f(0)[0], 100);
-      PopulateInputFrame(frame_length_, num_bands_, frame_index,
-                         &render_buffer_.split_bands_f(0)[0], 0);
-
-      aec3.AnalyzeRender(&render_buffer_);
-      aec3.ProcessCapture(&capture_buffer_, false);
-      EXPECT_TRUE(VerifyOutputFrameBitexactness(
-          frame_length_, num_bands_, frame_index,
-          &capture_buffer_.split_bands_f(0)[0], -64));
-    }
-  }
-
-  // Verifies that information about echo path changes are properly propagated
-  // to the block processor.
-  // The cases tested are:
-  // -That no set echo path change flags are received when there is no echo path
-  // change.
-  // -That set echo path change flags are received and continues to be received
-  // as long as echo path changes are flagged.
-  // -That set echo path change flags are no longer received when echo path
-  // change events stop being flagged.
-  enum class EchoPathChangeTestVariant { kNone, kOneSticky, kOneNonSticky };
-
-  void RunEchoPathChangeVerificationTest(
-      EchoPathChangeTestVariant echo_path_change_test_variant) {
-    const size_t num_full_blocks_per_frame =
-        rtc::CheckedDivExact(LowestBandRate(sample_rate_hz_), 100) / kBlockSize;
-    const size_t expected_num_block_to_process =
-        (kNumFramesToProcess *
-         rtc::CheckedDivExact(LowestBandRate(sample_rate_hz_), 100)) /
-        kBlockSize;
-    std::unique_ptr<testing::StrictMock<webrtc::test::MockBlockProcessor>>
-        block_processor_mock(
-            new StrictMock<webrtc::test::MockBlockProcessor>());
-    EXPECT_CALL(*block_processor_mock, BufferRender(_))
-        .Times(expected_num_block_to_process);
-    EXPECT_CALL(*block_processor_mock, UpdateEchoLeakageStatus(_)).Times(0);
-
-    switch (echo_path_change_test_variant) {
-      case EchoPathChangeTestVariant::kNone:
-        EXPECT_CALL(*block_processor_mock, ProcessCapture(false, _, _))
-            .Times(expected_num_block_to_process);
-        break;
-      case EchoPathChangeTestVariant::kOneSticky:
-        EXPECT_CALL(*block_processor_mock, ProcessCapture(true, _, _))
-            .Times(expected_num_block_to_process);
-        break;
-      case EchoPathChangeTestVariant::kOneNonSticky:
-        EXPECT_CALL(*block_processor_mock, ProcessCapture(true, _, _))
-            .Times(num_full_blocks_per_frame);
-        EXPECT_CALL(*block_processor_mock, ProcessCapture(false, _, _))
-            .Times(expected_num_block_to_process - num_full_blocks_per_frame);
-        break;
-    }
-
-    EchoCanceller3 aec3(sample_rate_hz_, false,
-                        std::move(block_processor_mock));
-
-    for (size_t frame_index = 0; frame_index < kNumFramesToProcess;
-         ++frame_index) {
-      bool echo_path_change = false;
-      switch (echo_path_change_test_variant) {
-        case EchoPathChangeTestVariant::kNone:
-          break;
-        case EchoPathChangeTestVariant::kOneSticky:
-          echo_path_change = true;
-          break;
-        case EchoPathChangeTestVariant::kOneNonSticky:
-          if (frame_index == 0) {
-            echo_path_change = true;
-          }
-          break;
-      }
-
-      aec3.AnalyzeCapture(&capture_buffer_);
-      OptionalBandSplit();
-
-      PopulateInputFrame(frame_length_, num_bands_, frame_index,
-                         &capture_buffer_.split_bands_f(0)[0], 0);
-      PopulateInputFrame(frame_length_, frame_index,
-                         &render_buffer_.channels_f()[0][0], 0);
-
-      aec3.AnalyzeRender(&render_buffer_);
-      aec3.ProcessCapture(&capture_buffer_, echo_path_change);
-    }
-  }
-
-  // Test for verifying that echo leakage information is being properly passed
-  // to the processor.
-  // The cases tested are:
-  // -That no method calls are received when they should not.
-  // -That false values are received each time they are flagged.
-  // -That true values are received each time they are flagged.
-  // -That a false value is received when flagged after a true value has been
-  // flagged.
-  enum class EchoLeakageTestVariant {
-    kNone,
-    kFalseSticky,
-    kTrueSticky,
-    kTrueNonSticky
-  };
-
-  void RunEchoLeakageVerificationTest(
-      EchoLeakageTestVariant leakage_report_variant) {
-    const size_t expected_num_block_to_process =
-        (kNumFramesToProcess *
-         rtc::CheckedDivExact(LowestBandRate(sample_rate_hz_), 100)) /
-        kBlockSize;
-    std::unique_ptr<testing::StrictMock<webrtc::test::MockBlockProcessor>>
-        block_processor_mock(
-            new StrictMock<webrtc::test::MockBlockProcessor>());
-    EXPECT_CALL(*block_processor_mock, BufferRender(_))
-        .Times(expected_num_block_to_process);
-    EXPECT_CALL(*block_processor_mock, ProcessCapture(_, _, _))
-        .Times(expected_num_block_to_process);
-
-    switch (leakage_report_variant) {
-      case EchoLeakageTestVariant::kNone:
-        EXPECT_CALL(*block_processor_mock, UpdateEchoLeakageStatus(_)).Times(0);
-        break;
-      case EchoLeakageTestVariant::kFalseSticky:
-        EXPECT_CALL(*block_processor_mock, UpdateEchoLeakageStatus(false))
-            .Times(1);
-        break;
-      case EchoLeakageTestVariant::kTrueSticky:
-        EXPECT_CALL(*block_processor_mock, UpdateEchoLeakageStatus(true))
-            .Times(1);
-        break;
-      case EchoLeakageTestVariant::kTrueNonSticky: {
-        testing::InSequence s;
-        EXPECT_CALL(*block_processor_mock, UpdateEchoLeakageStatus(true))
-            .Times(1);
-        EXPECT_CALL(*block_processor_mock, UpdateEchoLeakageStatus(false))
-            .Times(kNumFramesToProcess - 1);
-      } break;
-    }
-
-    EchoCanceller3 aec3(sample_rate_hz_, false,
-                        std::move(block_processor_mock));
-
-    for (size_t frame_index = 0; frame_index < kNumFramesToProcess;
-         ++frame_index) {
-      switch (leakage_report_variant) {
-        case EchoLeakageTestVariant::kNone:
-          break;
-        case EchoLeakageTestVariant::kFalseSticky:
-          if (frame_index == 0) {
-            aec3.UpdateEchoLeakageStatus(false);
-          }
-          break;
-        case EchoLeakageTestVariant::kTrueSticky:
-          if (frame_index == 0) {
-            aec3.UpdateEchoLeakageStatus(true);
-          }
-          break;
-        case EchoLeakageTestVariant::kTrueNonSticky:
-          if (frame_index == 0) {
-            aec3.UpdateEchoLeakageStatus(true);
-          } else {
-            aec3.UpdateEchoLeakageStatus(false);
-          }
-          break;
-      }
-
-      aec3.AnalyzeCapture(&capture_buffer_);
-      OptionalBandSplit();
-
-      PopulateInputFrame(frame_length_, num_bands_, frame_index,
-                         &capture_buffer_.split_bands_f(0)[0], 0);
-      PopulateInputFrame(frame_length_, frame_index,
-                         &render_buffer_.channels_f()[0][0], 0);
-
-      aec3.AnalyzeRender(&render_buffer_);
-      aec3.ProcessCapture(&capture_buffer_, false);
-    }
-  }
-
-  // This verifies that saturation information is properly passed to the
-  // BlockProcessor.
-  // The cases tested are:
-  // -That no saturation event is passed to the processor if there is no
-  // saturation.
-  // -That one frame with one negative saturated sample value is reported to be
-  // saturated and that following non-saturated frames are properly reported as
-  // not being saturated.
-  // -That one frame with one positive saturated sample value is reported to be
-  // saturated and that following non-saturated frames are properly reported as
-  // not being saturated.
-  enum class SaturationTestVariant { kNone, kOneNegative, kOnePositive };
-
-  void RunCaptureSaturationVerificationTest(
-      SaturationTestVariant saturation_variant) {
-    const size_t num_full_blocks_per_frame =
-        rtc::CheckedDivExact(LowestBandRate(sample_rate_hz_), 100) / kBlockSize;
-    const size_t expected_num_block_to_process =
-        (kNumFramesToProcess *
-         rtc::CheckedDivExact(LowestBandRate(sample_rate_hz_), 100)) /
-        kBlockSize;
-    std::unique_ptr<testing::StrictMock<webrtc::test::MockBlockProcessor>>
-        block_processor_mock(
-            new StrictMock<webrtc::test::MockBlockProcessor>());
-    EXPECT_CALL(*block_processor_mock, BufferRender(_))
-        .Times(expected_num_block_to_process);
-    EXPECT_CALL(*block_processor_mock, UpdateEchoLeakageStatus(_)).Times(0);
-
-    switch (saturation_variant) {
-      case SaturationTestVariant::kNone:
-        EXPECT_CALL(*block_processor_mock, ProcessCapture(_, false, _))
-            .Times(expected_num_block_to_process);
-        break;
-      case SaturationTestVariant::kOneNegative: {
-        testing::InSequence s;
-        EXPECT_CALL(*block_processor_mock, ProcessCapture(_, true, _))
-            .Times(num_full_blocks_per_frame);
-        EXPECT_CALL(*block_processor_mock, ProcessCapture(_, false, _))
-            .Times(expected_num_block_to_process - num_full_blocks_per_frame);
-      } break;
-      case SaturationTestVariant::kOnePositive: {
-        testing::InSequence s;
-        EXPECT_CALL(*block_processor_mock, ProcessCapture(_, true, _))
-            .Times(num_full_blocks_per_frame);
-        EXPECT_CALL(*block_processor_mock, ProcessCapture(_, false, _))
-            .Times(expected_num_block_to_process - num_full_blocks_per_frame);
-      } break;
-    }
-
-    EchoCanceller3 aec3(sample_rate_hz_, false,
-                        std::move(block_processor_mock));
-    for (size_t frame_index = 0; frame_index < kNumFramesToProcess;
-         ++frame_index) {
-      for (int k = 0; k < fullband_frame_length_; ++k) {
-        capture_buffer_.channels_f()[0][k] = 0.f;
-      }
-      switch (saturation_variant) {
-        case SaturationTestVariant::kNone:
-          break;
-        case SaturationTestVariant::kOneNegative:
-          if (frame_index == 0) {
-            capture_buffer_.channels_f()[0][10] = -32768.f;
-          }
-          break;
-        case SaturationTestVariant::kOnePositive:
-          if (frame_index == 0) {
-            capture_buffer_.channels_f()[0][10] = 32767.f;
-          }
-          break;
-      }
-
-      aec3.AnalyzeCapture(&capture_buffer_);
-      OptionalBandSplit();
-
-      PopulateInputFrame(frame_length_, num_bands_, frame_index,
-                         &capture_buffer_.split_bands_f(0)[0], 0);
-      PopulateInputFrame(frame_length_, num_bands_, frame_index,
-                         &render_buffer_.split_bands_f(0)[0], 0);
-
-      aec3.AnalyzeRender(&render_buffer_);
-      aec3.ProcessCapture(&capture_buffer_, false);
-    }
-  }
-
-  // This test verifies that the swapqueue is able to handle jitter in the
-  // capture and render API calls.
-  void RunRenderSwapQueueVerificationTest() {
-    EchoCanceller3 aec3(
-        sample_rate_hz_, false,
-        std::unique_ptr<BlockProcessor>(
-            new RenderTransportVerificationProcessor(num_bands_)));
-
-    for (size_t frame_index = 0; frame_index < kRenderTransferQueueSize;
-         ++frame_index) {
-      if (sample_rate_hz_ > 16000) {
-        render_buffer_.SplitIntoFrequencyBands();
-      }
-      PopulateInputFrame(frame_length_, num_bands_, frame_index,
-                         &render_buffer_.split_bands_f(0)[0], 0);
-
-      if (sample_rate_hz_ > 16000) {
-        render_buffer_.SplitIntoFrequencyBands();
-      }
-
-      aec3.AnalyzeRender(&render_buffer_);
-    }
-
-    for (size_t frame_index = 0; frame_index < kRenderTransferQueueSize;
-         ++frame_index) {
-      aec3.AnalyzeCapture(&capture_buffer_);
-      if (sample_rate_hz_ > 16000) {
-        capture_buffer_.SplitIntoFrequencyBands();
-      }
-
-      PopulateInputFrame(frame_length_, num_bands_, frame_index,
-                         &capture_buffer_.split_bands_f(0)[0], 0);
-
-      aec3.ProcessCapture(&capture_buffer_, false);
-      EXPECT_TRUE(VerifyOutputFrameBitexactness(
-          frame_length_, num_bands_, frame_index,
-          &capture_buffer_.split_bands_f(0)[0], -64));
-    }
-  }
-
-  // This test verifies that a buffer overrun in the render swapqueue is
-  // properly reported.
-  void RunRenderPipelineSwapQueueOverrunReturnValueTest() {
-    EchoCanceller3 aec3(AudioProcessing::Config::EchoCanceller3(),
-                        sample_rate_hz_, false);
-
-    constexpr size_t kRenderTransferQueueSize = 30;
-    for (size_t k = 0; k < 2; ++k) {
-      for (size_t frame_index = 0; frame_index < kRenderTransferQueueSize;
-           ++frame_index) {
-        if (sample_rate_hz_ > 16000) {
-          render_buffer_.SplitIntoFrequencyBands();
-        }
-        PopulateInputFrame(frame_length_, frame_index,
-                           &render_buffer_.channels_f()[0][0], 0);
-
-        if (k == 0) {
-          aec3.AnalyzeRender(&render_buffer_);
-        } else {
-          aec3.AnalyzeRender(&render_buffer_);
-        }
-      }
-    }
-  }
-
-#if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
-  // Verifies the that the check for the number of bands in the AnalyzeRender
-  // input is correct by adjusting the sample rates of EchoCanceller3 and the
-  // input AudioBuffer to have a different number of bands.
-  void RunAnalyzeRenderNumBandsCheckVerification() {
-    // Set aec3_sample_rate_hz to be different from sample_rate_hz_ in such a
-    // way that the number of bands for the rates are different.
-    const int aec3_sample_rate_hz = sample_rate_hz_ == 48000 ? 32000 : 48000;
-    EchoCanceller3 aec3(AudioProcessing::Config::EchoCanceller3(),
-                        aec3_sample_rate_hz, false);
-    PopulateInputFrame(frame_length_, 0, &render_buffer_.channels_f()[0][0], 0);
-
-    EXPECT_DEATH(aec3.AnalyzeRender(&render_buffer_), "");
-  }
-
-  // Verifies the that the check for the number of bands in the ProcessCapture
-  // input is correct by adjusting the sample rates of EchoCanceller3 and the
-  // input AudioBuffer to have a different number of bands.
-  void RunProcessCaptureNumBandsCheckVerification() {
-    // Set aec3_sample_rate_hz to be different from sample_rate_hz_ in such a
-    // way that the number of bands for the rates are different.
-    const int aec3_sample_rate_hz = sample_rate_hz_ == 48000 ? 32000 : 48000;
-    EchoCanceller3 aec3(AudioProcessing::Config::EchoCanceller3(),
-                        aec3_sample_rate_hz, false);
-    PopulateInputFrame(frame_length_, num_bands_, 0,
-                       &capture_buffer_.split_bands_f(0)[0], 100);
-    EXPECT_DEATH(aec3.ProcessCapture(&capture_buffer_, false), "");
-  }
-
-  // Verifies the that the check for the frame length in the AnalyzeRender input
-  // is correct by adjusting the sample rates of EchoCanceller3 and the input
-  // AudioBuffer to have a different frame lengths.
-  void RunAnalyzeRenderFrameLengthCheckVerification() {
-    // Set aec3_sample_rate_hz to be different from sample_rate_hz_ in such a
-    // way that the band frame lengths are different.
-    const int aec3_sample_rate_hz = sample_rate_hz_ == 8000 ? 16000 : 8000;
-    EchoCanceller3 aec3(AudioProcessing::Config::EchoCanceller3(),
-                        aec3_sample_rate_hz, false);
-
-    OptionalBandSplit();
-    PopulateInputFrame(frame_length_, 0, &render_buffer_.channels_f()[0][0], 0);
-
-    EXPECT_DEATH(aec3.AnalyzeRender(&render_buffer_), "");
-  }
-
-  // Verifies the that the check for the frame length in the AnalyzeRender input
-  // is correct by adjusting the sample rates of EchoCanceller3 and the input
-  // AudioBuffer to have a different frame lengths.
-  void RunProcessCaptureFrameLengthCheckVerification() {
-    // Set aec3_sample_rate_hz to be different from sample_rate_hz_ in such a
-    // way that the band frame lengths are different.
-    const int aec3_sample_rate_hz = sample_rate_hz_ == 8000 ? 16000 : 8000;
-    EchoCanceller3 aec3(AudioProcessing::Config::EchoCanceller3(),
-                        aec3_sample_rate_hz, false);
-
-    OptionalBandSplit();
-    PopulateInputFrame(frame_length_, num_bands_, 0,
-                       &capture_buffer_.split_bands_f(0)[0], 100);
-
-    EXPECT_DEATH(aec3.ProcessCapture(&capture_buffer_, false), "");
-  }
-
-#endif
-
- private:
-  void OptionalBandSplit() {
-    if (sample_rate_hz_ > 16000) {
-      capture_buffer_.SplitIntoFrequencyBands();
-      render_buffer_.SplitIntoFrequencyBands();
-    }
-  }
-
-  static constexpr size_t kNumFramesToProcess = 20;
-  const int sample_rate_hz_;
-  const size_t num_bands_;
-  const size_t frame_length_;
-  const int fullband_frame_length_;
-  AudioBuffer capture_buffer_;
-  AudioBuffer render_buffer_;
-
-  RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(EchoCanceller3Tester);
-};
-
-std::string ProduceDebugText(int sample_rate_hz) {
-  std::ostringstream ss;
-  ss << "Sample rate: " << sample_rate_hz;
-  return ss.str();
-}
-
-std::string ProduceDebugText(int sample_rate_hz, int variant) {
-  std::ostringstream ss;
-  ss << "Sample rate: " << sample_rate_hz << ", variant: " << variant;
-  return ss.str();
-}
-
-}  // namespace
-
-TEST(EchoCanceller3Buffering, CaptureBitexactness) {
-  for (auto rate : {8000, 16000, 32000, 48000}) {
-    SCOPED_TRACE(ProduceDebugText(rate));
-    EchoCanceller3Tester(rate).RunCaptureTransportVerificationTest();
-  }
-}
-
-TEST(EchoCanceller3Buffering, RenderBitexactness) {
-  for (auto rate : {8000, 16000, 32000, 48000}) {
-    SCOPED_TRACE(ProduceDebugText(rate));
-    EchoCanceller3Tester(rate).RunRenderTransportVerificationTest();
-  }
-}
-
-TEST(EchoCanceller3Buffering, RenderSwapQueue) {
-  for (auto rate : {8000, 16000}) {
-    SCOPED_TRACE(ProduceDebugText(rate));
-    EchoCanceller3Tester(rate).RunRenderSwapQueueVerificationTest();
-  }
-}
-
-TEST(EchoCanceller3Buffering, RenderSwapQueueOverrunReturnValue) {
-  for (auto rate : {8000, 16000, 32000, 48000}) {
-    SCOPED_TRACE(ProduceDebugText(rate));
-    EchoCanceller3Tester(rate)
-        .RunRenderPipelineSwapQueueOverrunReturnValueTest();
-  }
-}
-
-TEST(EchoCanceller3Messaging, CaptureSaturation) {
-  auto variants = {EchoCanceller3Tester::SaturationTestVariant::kNone,
-                   EchoCanceller3Tester::SaturationTestVariant::kOneNegative,
-                   EchoCanceller3Tester::SaturationTestVariant::kOnePositive};
-  for (auto rate : {8000, 16000, 32000, 48000}) {
-    for (auto variant : variants) {
-      SCOPED_TRACE(ProduceDebugText(rate, static_cast<int>(variant)));
-      EchoCanceller3Tester(rate).RunCaptureSaturationVerificationTest(variant);
-    }
-  }
-}
-
-TEST(EchoCanceller3Messaging, EchoPathChange) {
-  auto variants = {
-      EchoCanceller3Tester::EchoPathChangeTestVariant::kNone,
-      EchoCanceller3Tester::EchoPathChangeTestVariant::kOneSticky,
-      EchoCanceller3Tester::EchoPathChangeTestVariant::kOneNonSticky};
-  for (auto rate : {8000, 16000, 32000, 48000}) {
-    for (auto variant : variants) {
-      SCOPED_TRACE(ProduceDebugText(rate, static_cast<int>(variant)));
-      EchoCanceller3Tester(rate).RunEchoPathChangeVerificationTest(variant);
-    }
-  }
-}
-
-TEST(EchoCanceller3Messaging, EchoLeakage) {
-  auto variants = {
-      EchoCanceller3Tester::EchoLeakageTestVariant::kNone,
-      EchoCanceller3Tester::EchoLeakageTestVariant::kFalseSticky,
-      EchoCanceller3Tester::EchoLeakageTestVariant::kTrueSticky,
-      EchoCanceller3Tester::EchoLeakageTestVariant::kTrueNonSticky};
-  for (auto rate : {8000, 16000, 32000, 48000}) {
-    for (auto variant : variants) {
-      SCOPED_TRACE(ProduceDebugText(rate, static_cast<int>(variant)));
-      EchoCanceller3Tester(rate).RunEchoLeakageVerificationTest(variant);
-    }
-  }
-}
-
-TEST(EchoCanceller3, ConfigValidation) {
-  AudioProcessing::Config::EchoCanceller3 config;
-  EXPECT_TRUE(EchoCanceller3::Validate(config));
-}
-
-#if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
-
-TEST(EchoCanceller3InputCheck, WrongCaptureNumBandsCheckVerification) {
-  for (auto rate : {8000, 16000, 32000, 48000}) {
-    SCOPED_TRACE(ProduceDebugText(rate));
-    EchoCanceller3Tester(rate).RunProcessCaptureNumBandsCheckVerification();
-  }
-}
-
-// TODO(peah): Re-enable the test once the issue with memory leaks during DEATH
-// tests on test bots has been fixed.
-TEST(EchoCanceller3InputCheck,
-     DISABLED_WrongRenderFrameLengthCheckVerification) {
-  for (auto rate : {8000, 16000}) {
-    SCOPED_TRACE(ProduceDebugText(rate));
-    EchoCanceller3Tester(rate).RunAnalyzeRenderFrameLengthCheckVerification();
-  }
-}
-
-TEST(EchoCanceller3InputCheck, WrongCaptureFrameLengthCheckVerification) {
-  for (auto rate : {8000, 16000}) {
-    SCOPED_TRACE(ProduceDebugText(rate));
-    EchoCanceller3Tester(rate).RunProcessCaptureFrameLengthCheckVerification();
-  }
-}
-
-// Verifiers that the verification for null input to the render analysis api
-// call works.
-TEST(EchoCanceller3InputCheck, NullRenderAnalysisParameter) {
-  EXPECT_DEATH(
-      EchoCanceller3(AudioProcessing::Config::EchoCanceller3(), 8000, false)
-          .AnalyzeRender(nullptr),
-      "");
-}
-
-// Verifiers that the verification for null input to the capture analysis api
-// call works.
-TEST(EchoCanceller3InputCheck, NullCaptureAnalysisParameter) {
-  EXPECT_DEATH(
-      EchoCanceller3(AudioProcessing::Config::EchoCanceller3(), 8000, false)
-          .AnalyzeCapture(nullptr),
-      "");
-}
-
-// Verifiers that the verification for null input to the capture processing api
-// call works.
-TEST(EchoCanceller3InputCheck, NullCaptureProcessingParameter) {
-  EXPECT_DEATH(
-      EchoCanceller3(AudioProcessing::Config::EchoCanceller3(), 8000, false)
-          .ProcessCapture(nullptr, false),
-      "");
-}
-
-// Verifies the check for correct sample rate.
-// TODO(peah): Re-enable the test once the issue with memory leaks during DEATH
-// tests on test bots has been fixed.
-TEST(EchoCanceller3InputCheck, DISABLED_WrongSampleRate) {
-  ApmDataDumper data_dumper(0);
-  EXPECT_DEATH(
-      EchoCanceller3(AudioProcessing::Config::EchoCanceller3(), 8001, false),
-      "");
-}
-
-#endif
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/aec3/echo_path_delay_estimator.cc b/modules/audio_processing/aec3/echo_path_delay_estimator.cc
deleted file mode 100644
index 3c182f3..0000000
--- a/modules/audio_processing/aec3/echo_path_delay_estimator.cc
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- *  Copyright (c) 2017 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_processing/aec3/echo_path_delay_estimator.h"
-
-#include <algorithm>
-#include <array>
-
-#include "webrtc/modules/audio_processing/aec3/aec3_common.h"
-#include "webrtc/modules/audio_processing/include/audio_processing.h"
-#include "webrtc/modules/audio_processing/logging/apm_data_dumper.h"
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-
-namespace {
-
-constexpr int kDownSamplingFactor = 4;
-}  // namespace
-
-EchoPathDelayEstimator::EchoPathDelayEstimator(
-    ApmDataDumper* data_dumper,
-    const AudioProcessing::Config::EchoCanceller3& config)
-    : data_dumper_(data_dumper),
-      matched_filter_(data_dumper_,
-                      DetectOptimization(),
-                      kMatchedFilterWindowSizeSubBlocks,
-                      kNumMatchedFilters,
-                      kMatchedFilterAlignmentShiftSizeSubBlocks,
-                      config.param.render_levels.poor_excitation_render_limit),
-      matched_filter_lag_aggregator_(data_dumper_,
-                                     matched_filter_.NumLagEstimates()) {
-  RTC_DCHECK(data_dumper);
-}
-
-EchoPathDelayEstimator::~EchoPathDelayEstimator() = default;
-
-void EchoPathDelayEstimator::Reset() {
-  matched_filter_lag_aggregator_.Reset();
-  matched_filter_.Reset();
-}
-
-rtc::Optional<size_t> EchoPathDelayEstimator::EstimateDelay(
-    const DownsampledRenderBuffer& render_buffer,
-    rtc::ArrayView<const float> capture) {
-  RTC_DCHECK_EQ(kBlockSize, capture.size());
-
-  std::array<float, kSubBlockSize> downsampled_capture;
-  capture_decimator_.Decimate(capture, downsampled_capture);
-  matched_filter_.Update(render_buffer, downsampled_capture);
-
-  rtc::Optional<size_t> aggregated_matched_filter_lag =
-      matched_filter_lag_aggregator_.Aggregate(
-          matched_filter_.GetLagEstimates());
-
-  // TODO(peah): Move this logging outside of this class once EchoCanceller3
-  // development is done.
-  data_dumper_->DumpRaw("aec3_echo_path_delay_estimator_delay",
-                        aggregated_matched_filter_lag
-                            ? static_cast<int>(*aggregated_matched_filter_lag *
-                                               kDownSamplingFactor)
-                            : -1);
-
-  // Return the detected delay in samples as the aggregated matched filter lag
-  // compensated by the down sampling factor for the signal being correlated.
-  return aggregated_matched_filter_lag
-             ? rtc::Optional<size_t>(*aggregated_matched_filter_lag *
-                                     kDownSamplingFactor)
-             : rtc::Optional<size_t>();
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/aec3/echo_path_delay_estimator.h b/modules/audio_processing/aec3/echo_path_delay_estimator.h
deleted file mode 100644
index 7ff1cb3..0000000
--- a/modules/audio_processing/aec3/echo_path_delay_estimator.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- *  Copyright (c) 2017 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_PROCESSING_AEC3_ECHO_PATH_DELAY_ESTIMATOR_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_AEC3_ECHO_PATH_DELAY_ESTIMATOR_H_
-
-#include <vector>
-
-#include "webrtc/api/optional.h"
-#include "webrtc/modules/audio_processing/aec3/decimator_by_4.h"
-#include "webrtc/modules/audio_processing/aec3/downsampled_render_buffer.h"
-#include "webrtc/modules/audio_processing/aec3/matched_filter.h"
-#include "webrtc/modules/audio_processing/aec3/matched_filter_lag_aggregator.h"
-#include "webrtc/modules/audio_processing/include/audio_processing.h"
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace webrtc {
-
-class ApmDataDumper;
-
-// Estimates the delay of the echo path.
-class EchoPathDelayEstimator {
- public:
-  EchoPathDelayEstimator(ApmDataDumper* data_dumper,
-                         const AudioProcessing::Config::EchoCanceller3& config);
-  ~EchoPathDelayEstimator();
-
-  // Resets the estimation.
-  void Reset();
-
-  // Produce a delay estimate if such is avaliable.
-  rtc::Optional<size_t> EstimateDelay(
-      const DownsampledRenderBuffer& render_buffer,
-      rtc::ArrayView<const float> capture);
-
- private:
-  ApmDataDumper* const data_dumper_;
-  DecimatorBy4 capture_decimator_;
-  MatchedFilter matched_filter_;
-  MatchedFilterLagAggregator matched_filter_lag_aggregator_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(EchoPathDelayEstimator);
-};
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_AEC3_ECHO_PATH_DELAY_ESTIMATOR_H_
diff --git a/modules/audio_processing/aec3/echo_path_delay_estimator_unittest.cc b/modules/audio_processing/aec3/echo_path_delay_estimator_unittest.cc
deleted file mode 100644
index 89b49ca..0000000
--- a/modules/audio_processing/aec3/echo_path_delay_estimator_unittest.cc
+++ /dev/null
@@ -1,194 +0,0 @@
-/*
- *  Copyright (c) 2017 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_processing/aec3/echo_path_delay_estimator.h"
-
-#include <algorithm>
-#include <sstream>
-#include <string>
-
-#include "webrtc/modules/audio_processing/aec3/aec3_common.h"
-#include "webrtc/modules/audio_processing/aec3/render_delay_buffer.h"
-#include "webrtc/modules/audio_processing/logging/apm_data_dumper.h"
-#include "webrtc/modules/audio_processing/test/echo_canceller_test_tools.h"
-#include "webrtc/rtc_base/random.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-namespace {
-
-std::string ProduceDebugText(size_t delay) {
-  std::ostringstream ss;
-  ss << "Delay: " << delay;
-  return ss.str();
-}
-
-}  // namespace
-
-// Verifies that the basic API calls work.
-TEST(EchoPathDelayEstimator, BasicApiCalls) {
-  ApmDataDumper data_dumper(0);
-  std::unique_ptr<RenderDelayBuffer> render_delay_buffer(
-      RenderDelayBuffer::Create(3));
-  EchoPathDelayEstimator estimator(&data_dumper,
-                                   AudioProcessing::Config::EchoCanceller3());
-  std::vector<std::vector<float>> render(3, std::vector<float>(kBlockSize));
-  std::vector<float> capture(kBlockSize);
-  for (size_t k = 0; k < 100; ++k) {
-    render_delay_buffer->Insert(render);
-    estimator.EstimateDelay(render_delay_buffer->GetDownsampledRenderBuffer(),
-                            capture);
-  }
-}
-
-// Verifies that the delay estimator produces correct delay for artificially
-// delayed signals.
-TEST(EchoPathDelayEstimator, DelayEstimation) {
-  Random random_generator(42U);
-  std::vector<std::vector<float>> render(3, std::vector<float>(kBlockSize));
-  std::vector<float> capture(kBlockSize);
-  ApmDataDumper data_dumper(0);
-  for (size_t delay_samples : {15, 64, 150, 200, 800, 4000}) {
-    SCOPED_TRACE(ProduceDebugText(delay_samples));
-    std::unique_ptr<RenderDelayBuffer> render_delay_buffer(
-        RenderDelayBuffer::Create(3));
-    DelayBuffer<float> signal_delay_buffer(delay_samples);
-    EchoPathDelayEstimator estimator(&data_dumper,
-                                     AudioProcessing::Config::EchoCanceller3());
-
-    rtc::Optional<size_t> estimated_delay_samples;
-    for (size_t k = 0; k < (100 + delay_samples / kBlockSize); ++k) {
-      RandomizeSampleVector(&random_generator, render[0]);
-      signal_delay_buffer.Delay(render[0], capture);
-      render_delay_buffer->Insert(render);
-      render_delay_buffer->UpdateBuffers();
-      estimated_delay_samples = estimator.EstimateDelay(
-          render_delay_buffer->GetDownsampledRenderBuffer(), capture);
-    }
-    if (estimated_delay_samples) {
-      // Due to the internal down-sampling by 4 done inside the delay estimator
-      // the estimated delay cannot be expected to be closer than 4 samples to
-      // the true delay.
-      EXPECT_NEAR(delay_samples, *estimated_delay_samples, 4);
-    } else {
-      ADD_FAILURE();
-    }
-  }
-}
-
-// Verifies that the delay estimator does not produce delay estimates too
-// quickly.
-TEST(EchoPathDelayEstimator, NoInitialDelayestimates) {
-  Random random_generator(42U);
-  std::vector<std::vector<float>> render(3, std::vector<float>(kBlockSize));
-  std::vector<float> capture(kBlockSize);
-  ApmDataDumper data_dumper(0);
-  std::unique_ptr<RenderDelayBuffer> render_delay_buffer(
-      RenderDelayBuffer::Create(3));
-
-  EchoPathDelayEstimator estimator(&data_dumper,
-                                   AudioProcessing::Config::EchoCanceller3());
-  for (size_t k = 0; k < 19; ++k) {
-    RandomizeSampleVector(&random_generator, render[0]);
-    std::copy(render[0].begin(), render[0].end(), capture.begin());
-    render_delay_buffer->Insert(render);
-    render_delay_buffer->UpdateBuffers();
-    EXPECT_FALSE(estimator.EstimateDelay(
-        render_delay_buffer->GetDownsampledRenderBuffer(), capture));
-  }
-}
-
-// Verifies that the delay estimator does not produce delay estimates for render
-// signals of low level.
-TEST(EchoPathDelayEstimator, NoDelayEstimatesForLowLevelRenderSignals) {
-  Random random_generator(42U);
-  std::vector<std::vector<float>> render(3, std::vector<float>(kBlockSize));
-  std::vector<float> capture(kBlockSize);
-  ApmDataDumper data_dumper(0);
-  EchoPathDelayEstimator estimator(&data_dumper,
-                                   AudioProcessing::Config::EchoCanceller3());
-  std::unique_ptr<RenderDelayBuffer> render_delay_buffer(
-      RenderDelayBuffer::Create(3));
-  for (size_t k = 0; k < 100; ++k) {
-    RandomizeSampleVector(&random_generator, render[0]);
-    for (auto& render_k : render[0]) {
-      render_k *= 100.f / 32767.f;
-    }
-    std::copy(render[0].begin(), render[0].end(), capture.begin());
-    render_delay_buffer->Insert(render);
-    render_delay_buffer->UpdateBuffers();
-    EXPECT_FALSE(estimator.EstimateDelay(
-        render_delay_buffer->GetDownsampledRenderBuffer(), capture));
-  }
-}
-
-// Verifies that the delay estimator does not produce delay estimates for
-// uncorrelated signals.
-TEST(EchoPathDelayEstimator, NoDelayEstimatesForUncorrelatedSignals) {
-  Random random_generator(42U);
-  std::vector<std::vector<float>> render(3, std::vector<float>(kBlockSize));
-  std::vector<float> capture(kBlockSize);
-  ApmDataDumper data_dumper(0);
-  EchoPathDelayEstimator estimator(&data_dumper,
-                                   AudioProcessing::Config::EchoCanceller3());
-  std::unique_ptr<RenderDelayBuffer> render_delay_buffer(
-      RenderDelayBuffer::Create(3));
-  for (size_t k = 0; k < 100; ++k) {
-    RandomizeSampleVector(&random_generator, render[0]);
-    RandomizeSampleVector(&random_generator, capture);
-    render_delay_buffer->Insert(render);
-    render_delay_buffer->UpdateBuffers();
-    EXPECT_FALSE(estimator.EstimateDelay(
-        render_delay_buffer->GetDownsampledRenderBuffer(), capture));
-  }
-}
-
-#if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
-
-// Verifies the check for the render blocksize.
-// TODO(peah): Re-enable the test once the issue with memory leaks during DEATH
-// tests on test bots has been fixed.
-TEST(EchoPathDelayEstimator, DISABLED_WrongRenderBlockSize) {
-  ApmDataDumper data_dumper(0);
-  EchoPathDelayEstimator estimator(&data_dumper,
-                                   AudioProcessing::Config::EchoCanceller3());
-  std::unique_ptr<RenderDelayBuffer> render_delay_buffer(
-      RenderDelayBuffer::Create(3));
-  std::vector<float> capture(kBlockSize);
-  EXPECT_DEATH(estimator.EstimateDelay(
-                   render_delay_buffer->GetDownsampledRenderBuffer(), capture),
-               "");
-}
-
-// Verifies the check for the capture blocksize.
-// TODO(peah): Re-enable the test once the issue with memory leaks during DEATH
-// tests on test bots has been fixed.
-TEST(EchoPathDelayEstimator, WrongCaptureBlockSize) {
-  ApmDataDumper data_dumper(0);
-  EchoPathDelayEstimator estimator(&data_dumper,
-                                   AudioProcessing::Config::EchoCanceller3());
-  std::unique_ptr<RenderDelayBuffer> render_delay_buffer(
-      RenderDelayBuffer::Create(3));
-  std::vector<float> capture(std::vector<float>(kBlockSize - 1));
-  EXPECT_DEATH(estimator.EstimateDelay(
-                   render_delay_buffer->GetDownsampledRenderBuffer(), capture),
-               "");
-}
-
-// Verifies the check for non-null data dumper.
-TEST(EchoPathDelayEstimator, NullDataDumper) {
-  EXPECT_DEATH(EchoPathDelayEstimator(
-                   nullptr, AudioProcessing::Config::EchoCanceller3()),
-               "");
-}
-
-#endif
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/aec3/echo_path_variability.cc b/modules/audio_processing/aec3/echo_path_variability.cc
deleted file mode 100644
index 5146592..0000000
--- a/modules/audio_processing/aec3/echo_path_variability.cc
+++ /dev/null
@@ -1,18 +0,0 @@
-/*
- *  Copyright (c) 2017 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_processing/aec3/echo_path_variability.h"
-
-namespace webrtc {
-
-EchoPathVariability::EchoPathVariability(bool gain_change, bool delay_change)
-    : gain_change(gain_change), delay_change(delay_change) {}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/aec3/echo_path_variability.h b/modules/audio_processing/aec3/echo_path_variability.h
deleted file mode 100644
index 7755362..0000000
--- a/modules/audio_processing/aec3/echo_path_variability.h
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- *  Copyright (c) 2017 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_PROCESSING_AEC3_ECHO_PATH_VARIABILITY_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_AEC3_ECHO_PATH_VARIABILITY_H_
-
-namespace webrtc {
-
-struct EchoPathVariability {
-  EchoPathVariability(bool gain_change, bool delay_change);
-
-  bool AudioPathChanged() const { return gain_change || delay_change; }
-  bool gain_change;
-  bool delay_change;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_AEC3_ECHO_PATH_VARIABILITY_H_
diff --git a/modules/audio_processing/aec3/echo_path_variability_unittest.cc b/modules/audio_processing/aec3/echo_path_variability_unittest.cc
deleted file mode 100644
index e2e82d1..0000000
--- a/modules/audio_processing/aec3/echo_path_variability_unittest.cc
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- *  Copyright (c) 2017 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_processing/aec3/echo_path_variability.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-TEST(EchoPathVariability, CorrectBehavior) {
-  // Test correct passing and reporting of the gain change information.
-  EchoPathVariability v(true, true);
-  EXPECT_TRUE(v.gain_change);
-  EXPECT_TRUE(v.delay_change);
-  EXPECT_TRUE(v.AudioPathChanged());
-
-  v = EchoPathVariability(true, false);
-  EXPECT_TRUE(v.gain_change);
-  EXPECT_FALSE(v.delay_change);
-  EXPECT_TRUE(v.AudioPathChanged());
-
-  v = EchoPathVariability(false, true);
-  EXPECT_FALSE(v.gain_change);
-  EXPECT_TRUE(v.delay_change);
-  EXPECT_TRUE(v.AudioPathChanged());
-
-  v = EchoPathVariability(false, false);
-  EXPECT_FALSE(v.gain_change);
-  EXPECT_FALSE(v.delay_change);
-  EXPECT_FALSE(v.AudioPathChanged());
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/aec3/echo_remover.cc b/modules/audio_processing/aec3/echo_remover.cc
deleted file mode 100644
index bac3704..0000000
--- a/modules/audio_processing/aec3/echo_remover.cc
+++ /dev/null
@@ -1,251 +0,0 @@
-/*
- *  Copyright (c) 2017 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_processing/aec3/echo_remover.h"
-
-#include <math.h>
-#include <algorithm>
-#include <memory>
-#include <numeric>
-#include <string>
-
-#include "webrtc/api/array_view.h"
-#include "webrtc/modules/audio_processing/aec3/aec3_common.h"
-#include "webrtc/modules/audio_processing/aec3/aec_state.h"
-#include "webrtc/modules/audio_processing/aec3/comfort_noise_generator.h"
-#include "webrtc/modules/audio_processing/aec3/echo_path_variability.h"
-#include "webrtc/modules/audio_processing/aec3/echo_remover_metrics.h"
-#include "webrtc/modules/audio_processing/aec3/fft_data.h"
-#include "webrtc/modules/audio_processing/aec3/output_selector.h"
-#include "webrtc/modules/audio_processing/aec3/render_buffer.h"
-#include "webrtc/modules/audio_processing/aec3/render_delay_buffer.h"
-#include "webrtc/modules/audio_processing/aec3/residual_echo_estimator.h"
-#include "webrtc/modules/audio_processing/aec3/subtractor.h"
-#include "webrtc/modules/audio_processing/aec3/suppression_filter.h"
-#include "webrtc/modules/audio_processing/aec3/suppression_gain.h"
-#include "webrtc/modules/audio_processing/logging/apm_data_dumper.h"
-#include "webrtc/rtc_base/atomicops.h"
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace webrtc {
-
-namespace {
-
-void LinearEchoPower(const FftData& E,
-                     const FftData& Y,
-                     std::array<float, kFftLengthBy2Plus1>* S2) {
-  for (size_t k = 0; k < E.re.size(); ++k) {
-    (*S2)[k] = (Y.re[k] - E.re[k]) * (Y.re[k] - E.re[k]) +
-               (Y.im[k] - E.im[k]) * (Y.im[k] - E.im[k]);
-  }
-}
-
-// Class for removing the echo from the capture signal.
-class EchoRemoverImpl final : public EchoRemover {
- public:
-  explicit EchoRemoverImpl(
-      const AudioProcessing::Config::EchoCanceller3& config,
-      int sample_rate_hz);
-  ~EchoRemoverImpl() override;
-
-  // Removes the echo from a block of samples from the capture signal. The
-  // supplied render signal is assumed to be pre-aligned with the capture
-  // signal.
-  void ProcessCapture(const rtc::Optional<size_t>& echo_path_delay_samples,
-                      const EchoPathVariability& echo_path_variability,
-                      bool capture_signal_saturation,
-                      const RenderBuffer& render_buffer,
-                      std::vector<std::vector<float>>* capture) override;
-
-  // Updates the status on whether echo leakage is detected in the output of the
-  // echo remover.
-  void UpdateEchoLeakageStatus(bool leakage_detected) override {
-    echo_leakage_detected_ = leakage_detected;
-  }
-
- private:
-  static int instance_count_;
-  const AudioProcessing::Config::EchoCanceller3 config_;
-  const Aec3Fft fft_;
-  std::unique_ptr<ApmDataDumper> data_dumper_;
-  const Aec3Optimization optimization_;
-  const int sample_rate_hz_;
-  Subtractor subtractor_;
-  SuppressionGain suppression_gain_;
-  ComfortNoiseGenerator cng_;
-  SuppressionFilter suppression_filter_;
-  RenderSignalAnalyzer render_signal_analyzer_;
-  OutputSelector output_selector_;
-  ResidualEchoEstimator residual_echo_estimator_;
-  bool echo_leakage_detected_ = false;
-  AecState aec_state_;
-  EchoRemoverMetrics metrics_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(EchoRemoverImpl);
-};
-
-int EchoRemoverImpl::instance_count_ = 0;
-
-EchoRemoverImpl::EchoRemoverImpl(
-    const AudioProcessing::Config::EchoCanceller3& config,
-    int sample_rate_hz)
-    : config_(config),
-      fft_(),
-      data_dumper_(
-          new ApmDataDumper(rtc::AtomicOps::Increment(&instance_count_))),
-      optimization_(DetectOptimization()),
-      sample_rate_hz_(sample_rate_hz),
-      subtractor_(data_dumper_.get(), optimization_),
-      suppression_gain_(config_, optimization_),
-      cng_(optimization_),
-      suppression_filter_(sample_rate_hz_),
-      residual_echo_estimator_(config_),
-      aec_state_(config_) {
-  RTC_DCHECK(ValidFullBandRate(sample_rate_hz));
-}
-
-EchoRemoverImpl::~EchoRemoverImpl() = default;
-
-void EchoRemoverImpl::ProcessCapture(
-    const rtc::Optional<size_t>& echo_path_delay_samples,
-    const EchoPathVariability& echo_path_variability,
-    bool capture_signal_saturation,
-    const RenderBuffer& render_buffer,
-    std::vector<std::vector<float>>* capture) {
-  const std::vector<std::vector<float>>& x = render_buffer.MostRecentBlock();
-  std::vector<std::vector<float>>* y = capture;
-
-  RTC_DCHECK(y);
-  RTC_DCHECK_EQ(x.size(), NumBandsForRate(sample_rate_hz_));
-  RTC_DCHECK_EQ(y->size(), NumBandsForRate(sample_rate_hz_));
-  RTC_DCHECK_EQ(x[0].size(), kBlockSize);
-  RTC_DCHECK_EQ((*y)[0].size(), kBlockSize);
-  const std::vector<float>& x0 = x[0];
-  std::vector<float>& y0 = (*y)[0];
-
-  data_dumper_->DumpWav("aec3_echo_remover_capture_input", kBlockSize, &y0[0],
-                        LowestBandRate(sample_rate_hz_), 1);
-  data_dumper_->DumpWav("aec3_echo_remover_render_input", kBlockSize, &x0[0],
-                        LowestBandRate(sample_rate_hz_), 1);
-  data_dumper_->DumpRaw("aec3_echo_remover_capture_input", y0);
-  data_dumper_->DumpRaw("aec3_echo_remover_render_input", x0);
-
-  aec_state_.UpdateCaptureSaturation(capture_signal_saturation);
-
-  if (echo_path_variability.AudioPathChanged()) {
-    subtractor_.HandleEchoPathChange(echo_path_variability);
-    aec_state_.HandleEchoPathChange(echo_path_variability);
-  }
-
-  std::array<float, kFftLengthBy2Plus1> Y2;
-  std::array<float, kFftLengthBy2Plus1> R2;
-  std::array<float, kFftLengthBy2Plus1> S2_linear;
-  std::array<float, kFftLengthBy2Plus1> G;
-  float high_bands_gain;
-  FftData Y;
-  FftData comfort_noise;
-  FftData high_band_comfort_noise;
-  SubtractorOutput subtractor_output;
-  FftData& E_main = subtractor_output.E_main;
-  auto& E2_main = subtractor_output.E2_main;
-  auto& E2_shadow = subtractor_output.E2_shadow;
-  auto& e_main = subtractor_output.e_main;
-
-  // Analyze the render signal.
-  render_signal_analyzer_.Update(render_buffer, aec_state_.FilterDelay());
-
-  // Perform linear echo cancellation.
-  subtractor_.Process(render_buffer, y0, render_signal_analyzer_, aec_state_,
-                      &subtractor_output);
-
-  // Compute spectra.
-  fft_.ZeroPaddedFft(y0, &Y);
-  LinearEchoPower(E_main, Y, &S2_linear);
-  Y.Spectrum(optimization_, &Y2);
-
-  // Update the AEC state information.
-  aec_state_.Update(subtractor_.FilterFrequencyResponse(),
-                    subtractor_.FilterImpulseResponse(),
-                    echo_path_delay_samples, render_buffer, E2_main, Y2, x0,
-                    subtractor_output.s_main, echo_leakage_detected_);
-
-  // Choose the linear output.
-  output_selector_.FormLinearOutput(!aec_state_.HeadsetDetected(), e_main, y0);
-  data_dumper_->DumpWav("aec3_output_linear", kBlockSize, &y0[0],
-                        LowestBandRate(sample_rate_hz_), 1);
-  data_dumper_->DumpRaw("aec3_output_linear", y0);
-  const auto& E2 = output_selector_.UseSubtractorOutput() ? E2_main : Y2;
-
-  // Estimate the residual echo power.
-  residual_echo_estimator_.Estimate(output_selector_.UseSubtractorOutput(),
-                                    aec_state_, render_buffer, S2_linear, Y2,
-                                    &R2);
-
-  // Estimate the comfort noise.
-  cng_.Compute(aec_state_, Y2, &comfort_noise, &high_band_comfort_noise);
-
-  // A choose and apply echo suppression gain.
-  suppression_gain_.GetGain(E2, R2, cng_.NoiseSpectrum(),
-                            render_signal_analyzer_, aec_state_.SaturatedEcho(),
-                            x, aec_state_.ForcedZeroGain(), &high_bands_gain,
-                            &G);
-  suppression_filter_.ApplyGain(comfort_noise, high_band_comfort_noise, G,
-                                high_bands_gain, y);
-
-  // Update the metrics.
-  metrics_.Update(aec_state_, cng_.NoiseSpectrum(), G);
-
-  // Update the aec state with the aec output characteristics.
-  aec_state_.UpdateWithOutput(y0);
-
-  // Debug outputs for the purpose of development and analysis.
-  data_dumper_->DumpWav("aec3_echo_estimate", kBlockSize,
-                        &subtractor_output.s_main[0],
-                        LowestBandRate(sample_rate_hz_), 1);
-  data_dumper_->DumpRaw("aec3_output", y0);
-  data_dumper_->DumpRaw("aec3_narrow_render",
-                        render_signal_analyzer_.NarrowPeakBand() ? 1 : 0);
-  data_dumper_->DumpRaw("aec3_N2", cng_.NoiseSpectrum());
-  data_dumper_->DumpRaw("aec3_suppressor_gain", G);
-  data_dumper_->DumpWav("aec3_output",
-                        rtc::ArrayView<const float>(&y0[0], kBlockSize),
-                        LowestBandRate(sample_rate_hz_), 1);
-  data_dumper_->DumpRaw("aec3_using_subtractor_output",
-                        output_selector_.UseSubtractorOutput() ? 1 : 0);
-  data_dumper_->DumpRaw("aec3_E2", E2);
-  data_dumper_->DumpRaw("aec3_E2_main", E2_main);
-  data_dumper_->DumpRaw("aec3_E2_shadow", E2_shadow);
-  data_dumper_->DumpRaw("aec3_S2_linear", S2_linear);
-  data_dumper_->DumpRaw("aec3_Y2", Y2);
-  data_dumper_->DumpRaw("aec3_X2", render_buffer.Spectrum(0));
-  data_dumper_->DumpRaw("aec3_R2", R2);
-  data_dumper_->DumpRaw("aec3_erle", aec_state_.Erle());
-  data_dumper_->DumpRaw("aec3_erl", aec_state_.Erl());
-  data_dumper_->DumpRaw("aec3_active_render", aec_state_.ActiveRender());
-  data_dumper_->DumpRaw("aec3_usable_linear_estimate",
-                        aec_state_.UsableLinearEstimate());
-  data_dumper_->DumpRaw(
-      "aec3_filter_delay",
-      aec_state_.FilterDelay() ? *aec_state_.FilterDelay() : -1);
-  data_dumper_->DumpRaw(
-      "aec3_external_delay",
-      aec_state_.ExternalDelay() ? *aec_state_.ExternalDelay() : -1);
-  data_dumper_->DumpRaw("aec3_capture_saturation",
-                        aec_state_.SaturatedCapture() ? 1 : 0);
-}
-
-}  // namespace
-
-EchoRemover* EchoRemover::Create(
-    const AudioProcessing::Config::EchoCanceller3& config,
-    int sample_rate_hz) {
-  return new EchoRemoverImpl(config, sample_rate_hz);
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/aec3/echo_remover.h b/modules/audio_processing/aec3/echo_remover.h
deleted file mode 100644
index 8a28729..0000000
--- a/modules/audio_processing/aec3/echo_remover.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- *  Copyright (c) 2017 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_PROCESSING_AEC3_ECHO_REMOVER_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_AEC3_ECHO_REMOVER_H_
-
-#include <vector>
-
-#include "webrtc/api/optional.h"
-#include "webrtc/modules/audio_processing/aec3/echo_path_variability.h"
-#include "webrtc/modules/audio_processing/aec3/render_buffer.h"
-#include "webrtc/modules/audio_processing/include/audio_processing.h"
-
-namespace webrtc {
-
-// Class for removing the echo from the capture signal.
-class EchoRemover {
- public:
-  static EchoRemover* Create(
-      const AudioProcessing::Config::EchoCanceller3& config,
-      int sample_rate_hz);
-  virtual ~EchoRemover() = default;
-
-  // Removes the echo from a block of samples from the capture signal. The
-  // supplied render signal is assumed to be pre-aligned with the capture
-  // signal.
-  virtual void ProcessCapture(
-      const rtc::Optional<size_t>& echo_path_delay_samples,
-      const EchoPathVariability& echo_path_variability,
-      bool capture_signal_saturation,
-      const RenderBuffer& render_buffer,
-      std::vector<std::vector<float>>* capture) = 0;
-
-  // Updates the status on whether echo leakage is detected in the output of the
-  // echo remover.
-  virtual void UpdateEchoLeakageStatus(bool leakage_detected) = 0;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_AEC3_ECHO_REMOVER_H_
diff --git a/modules/audio_processing/aec3/echo_remover_metrics.cc b/modules/audio_processing/aec3/echo_remover_metrics.cc
deleted file mode 100644
index d70e4a1..0000000
--- a/modules/audio_processing/aec3/echo_remover_metrics.cc
+++ /dev/null
@@ -1,282 +0,0 @@
-/*
- *  Copyright (c) 2017 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_processing/aec3/echo_remover_metrics.h"
-
-#include <math.h>
-#include <algorithm>
-#include <numeric>
-
-#include "webrtc/rtc_base/safe_minmax.h"
-#include "webrtc/system_wrappers/include/metrics.h"
-
-namespace webrtc {
-
-namespace {
-
-constexpr float kOneByMetricsCollectionBlocks = 1.f / kMetricsCollectionBlocks;
-
-}  // namespace
-
-EchoRemoverMetrics::DbMetric::DbMetric() : DbMetric(0.f, 0.f, 0.f) {}
-EchoRemoverMetrics::DbMetric::DbMetric(float sum_value,
-                                       float floor_value,
-                                       float ceil_value)
-    : sum_value(sum_value), floor_value(floor_value), ceil_value(ceil_value) {}
-
-void EchoRemoverMetrics::DbMetric::Update(float value) {
-  sum_value += value;
-  floor_value = std::min(floor_value, value);
-  ceil_value = std::max(ceil_value, value);
-}
-
-EchoRemoverMetrics::EchoRemoverMetrics() {
-  ResetMetrics();
-}
-
-void EchoRemoverMetrics::ResetMetrics() {
-  erl_.fill(DbMetric(0.f, 10000.f, 0.000f));
-  erle_.fill(DbMetric(0.f, 0.f, 1000.f));
-  comfort_noise_.fill(DbMetric(0.f, 100000000.f, 0.f));
-  suppressor_gain_.fill(DbMetric(0.f, 1.f, 0.f));
-  active_render_count_ = 0;
-  saturated_capture_ = false;
-}
-
-void EchoRemoverMetrics::Update(
-    const AecState& aec_state,
-    const std::array<float, kFftLengthBy2Plus1>& comfort_noise_spectrum,
-    const std::array<float, kFftLengthBy2Plus1>& suppressor_gain) {
-  metrics_reported_ = false;
-  if (++block_counter_ <= kMetricsCollectionBlocks) {
-    aec3::UpdateDbMetric(aec_state.Erl(), &erl_);
-    aec3::UpdateDbMetric(aec_state.Erle(), &erle_);
-    aec3::UpdateDbMetric(comfort_noise_spectrum, &comfort_noise_);
-    aec3::UpdateDbMetric(suppressor_gain, &suppressor_gain_);
-    active_render_count_ += (aec_state.ActiveRender() ? 1 : 0);
-    saturated_capture_ = saturated_capture_ || aec_state.SaturatedCapture();
-  } else {
-    // Report the metrics over several frames in order to lower the impact of
-    // the logarithms involved on the computational complexity.
-    constexpr int kMetricsCollectionBlocksBy2 = kMetricsCollectionBlocks / 2;
-    constexpr float kComfortNoiseScaling = 1.f / (kBlockSize * kBlockSize);
-    switch (block_counter_) {
-      case kMetricsCollectionBlocks + 1:
-        RTC_HISTOGRAM_COUNTS_LINEAR(
-            "WebRTC.Audio.EchoCanceller.ErleBand0.Average",
-            aec3::TransformDbMetricForReporting(true, 0.f, 19.f, 0.f,
-                                                kOneByMetricsCollectionBlocks,
-                                                erle_[0].sum_value),
-            0, 19, 20);
-        RTC_HISTOGRAM_COUNTS_LINEAR(
-            "WebRTC.Audio.EchoCanceller.ErleBand0.Max",
-            aec3::TransformDbMetricForReporting(true, 0.f, 19.f, 0.f, 1.f,
-                                                erle_[0].ceil_value),
-            0, 19, 20);
-        RTC_HISTOGRAM_COUNTS_LINEAR(
-            "WebRTC.Audio.EchoCanceller.ErleBand0.Min",
-            aec3::TransformDbMetricForReporting(true, 0.f, 19.f, 0.f, 1.f,
-                                                erle_[0].floor_value),
-            0, 19, 20);
-        break;
-      case kMetricsCollectionBlocks + 2:
-        RTC_HISTOGRAM_COUNTS_LINEAR(
-            "WebRTC.Audio.EchoCanceller.ErleBand1.Average",
-            aec3::TransformDbMetricForReporting(true, 0.f, 19.f, 0.f,
-                                                kOneByMetricsCollectionBlocks,
-                                                erle_[1].sum_value),
-            0, 19, 20);
-        RTC_HISTOGRAM_COUNTS_LINEAR(
-            "WebRTC.Audio.EchoCanceller.ErleBand1.Max",
-            aec3::TransformDbMetricForReporting(true, 0.f, 19.f, 0.f, 1.f,
-                                                erle_[1].ceil_value),
-            0, 19, 20);
-        RTC_HISTOGRAM_COUNTS_LINEAR(
-            "WebRTC.Audio.EchoCanceller.ErleBand1.Min",
-            aec3::TransformDbMetricForReporting(true, 0.f, 19.f, 0.f, 1.f,
-                                                erle_[1].floor_value),
-            0, 19, 20);
-        break;
-      case kMetricsCollectionBlocks + 3:
-        RTC_HISTOGRAM_COUNTS_LINEAR(
-            "WebRTC.Audio.EchoCanceller.ErlBand0.Average",
-            aec3::TransformDbMetricForReporting(true, 0.f, 59.f, 30.f,
-                                                kOneByMetricsCollectionBlocks,
-                                                erl_[0].sum_value),
-            0, 59, 30);
-        RTC_HISTOGRAM_COUNTS_LINEAR(
-            "WebRTC.Audio.EchoCanceller.ErlBand0.Max",
-            aec3::TransformDbMetricForReporting(true, 0.f, 59.f, 30.f, 1.f,
-                                                erl_[0].ceil_value),
-            0, 59, 30);
-        RTC_HISTOGRAM_COUNTS_LINEAR(
-            "WebRTC.Audio.EchoCanceller.ErlBand0.Min",
-            aec3::TransformDbMetricForReporting(true, 0.f, 59.f, 30.f, 1.f,
-                                                erl_[0].floor_value),
-            0, 59, 30);
-        break;
-      case kMetricsCollectionBlocks + 4:
-        RTC_HISTOGRAM_COUNTS_LINEAR(
-            "WebRTC.Audio.EchoCanceller.ErlBand1.Average",
-            aec3::TransformDbMetricForReporting(true, 0.f, 59.f, 30.f,
-                                                kOneByMetricsCollectionBlocks,
-                                                erl_[1].sum_value),
-            0, 59, 30);
-        RTC_HISTOGRAM_COUNTS_LINEAR(
-            "WebRTC.Audio.EchoCanceller.ErlBand1.Max",
-            aec3::TransformDbMetricForReporting(true, 0.f, 59.f, 30.f, 1.f,
-                                                erl_[1].ceil_value),
-            0, 59, 30);
-        RTC_HISTOGRAM_COUNTS_LINEAR(
-            "WebRTC.Audio.EchoCanceller.ErlBand1.Min",
-            aec3::TransformDbMetricForReporting(true, 0.f, 59.f, 30.f, 1.f,
-                                                erl_[1].floor_value),
-            0, 59, 30);
-        break;
-      case kMetricsCollectionBlocks + 5:
-        RTC_HISTOGRAM_COUNTS_LINEAR(
-            "WebRTC.Audio.EchoCanceller.ComfortNoiseBand0.Average",
-            aec3::TransformDbMetricForReporting(
-                true, 0.f, 89.f, -90.3f,
-                kComfortNoiseScaling * kOneByMetricsCollectionBlocks,
-                comfort_noise_[0].sum_value),
-            0, 89, 45);
-        RTC_HISTOGRAM_COUNTS_LINEAR(
-            "WebRTC.Audio.EchoCanceller.ComfortNoiseBand0.Max",
-            aec3::TransformDbMetricForReporting(true, 0.f, 89.f, -90.3f,
-                                                kComfortNoiseScaling,
-                                                comfort_noise_[0].ceil_value),
-            0, 89, 45);
-        RTC_HISTOGRAM_COUNTS_LINEAR(
-            "WebRTC.Audio.EchoCanceller.ComfortNoiseBand0.Min",
-            aec3::TransformDbMetricForReporting(true, 0.f, 89.f, -90.3f,
-                                                kComfortNoiseScaling,
-                                                comfort_noise_[0].floor_value),
-            0, 89, 45);
-        break;
-      case kMetricsCollectionBlocks + 6:
-        RTC_HISTOGRAM_COUNTS_LINEAR(
-            "WebRTC.Audio.EchoCanceller.ComfortNoiseBand1.Average",
-            aec3::TransformDbMetricForReporting(
-                true, 0.f, 89.f, -90.3f,
-                kComfortNoiseScaling * kOneByMetricsCollectionBlocks,
-                comfort_noise_[1].sum_value),
-            0, 89, 45);
-        RTC_HISTOGRAM_COUNTS_LINEAR(
-            "WebRTC.Audio.EchoCanceller.ComfortNoiseBand1.Max",
-            aec3::TransformDbMetricForReporting(true, 0.f, 89.f, -90.3f,
-                                                kComfortNoiseScaling,
-                                                comfort_noise_[1].ceil_value),
-            0, 89, 45);
-        RTC_HISTOGRAM_COUNTS_LINEAR(
-            "WebRTC.Audio.EchoCanceller.ComfortNoiseBand1.Min",
-            aec3::TransformDbMetricForReporting(true, 0.f, 89.f, -90.3f,
-                                                kComfortNoiseScaling,
-                                                comfort_noise_[1].floor_value),
-            0, 89, 45);
-        break;
-      case kMetricsCollectionBlocks + 7:
-        RTC_HISTOGRAM_COUNTS_LINEAR(
-            "WebRTC.Audio.EchoCanceller.SuppressorGainBand0.Average",
-            aec3::TransformDbMetricForReporting(true, 0.f, 59.f, 0.f,
-                                                kOneByMetricsCollectionBlocks,
-                                                suppressor_gain_[0].sum_value),
-            0, 59, 30);
-        RTC_HISTOGRAM_COUNTS_LINEAR(
-            "WebRTC.Audio.EchoCanceller.SuppressorGainBand0.Max",
-            aec3::TransformDbMetricForReporting(true, 0.f, 59.f, 0.f, 1.f,
-                                                suppressor_gain_[0].ceil_value),
-            0, 59, 30);
-        RTC_HISTOGRAM_COUNTS_LINEAR(
-            "WebRTC.Audio.EchoCanceller.SuppressorGainBand0.Min",
-            aec3::TransformDbMetricForReporting(
-                true, 0.f, 59.f, 0.f, 1.f, suppressor_gain_[0].floor_value),
-            0, 59, 30);
-        break;
-      case kMetricsCollectionBlocks + 8:
-        RTC_HISTOGRAM_COUNTS_LINEAR(
-            "WebRTC.Audio.EchoCanceller.SuppressorGainBand1.Average",
-            aec3::TransformDbMetricForReporting(true, 0.f, 59.f, 0.f,
-                                                kOneByMetricsCollectionBlocks,
-                                                suppressor_gain_[1].sum_value),
-            0, 59, 30);
-        RTC_HISTOGRAM_COUNTS_LINEAR(
-            "WebRTC.Audio.EchoCanceller.SuppressorGainBand1.Max",
-            aec3::TransformDbMetricForReporting(true, 0.f, 59.f, 0.f, 1.f,
-                                                suppressor_gain_[1].ceil_value),
-            0, 59, 30);
-        RTC_HISTOGRAM_COUNTS_LINEAR(
-            "WebRTC.Audio.EchoCanceller.SuppressorGainBand1.Min",
-            aec3::TransformDbMetricForReporting(
-                true, 0.f, 59.f, 0.f, 1.f, suppressor_gain_[1].floor_value),
-            0, 59, 30);
-        break;
-      case kMetricsCollectionBlocks + 9:
-        RTC_HISTOGRAM_BOOLEAN(
-            "WebRTC.Audio.EchoCanceller.UsableLinearEstimate",
-            static_cast<int>(aec_state.UsableLinearEstimate() ? 1 : 0));
-        RTC_HISTOGRAM_BOOLEAN(
-            "WebRTC.Audio.EchoCanceller.ActiveRender",
-            static_cast<int>(
-                active_render_count_ > kMetricsCollectionBlocksBy2 ? 1 : 0));
-        RTC_HISTOGRAM_COUNTS_LINEAR(
-            "WebRTC.Audio.EchoCanceller.FilterDelay",
-            aec_state.FilterDelay() ? *aec_state.FilterDelay() + 1 : 0, 0, 30,
-            31);
-        RTC_HISTOGRAM_BOOLEAN("WebRTC.Audio.EchoCanceller.CaptureSaturation",
-                              static_cast<int>(saturated_capture_ ? 1 : 0));
-        metrics_reported_ = true;
-        RTC_DCHECK_EQ(kMetricsReportingIntervalBlocks, block_counter_);
-        block_counter_ = 0;
-        ResetMetrics();
-        break;
-      default:
-        RTC_NOTREACHED();
-        break;
-    }
-  }
-}
-
-namespace aec3 {
-
-void UpdateDbMetric(const std::array<float, kFftLengthBy2Plus1>& value,
-                    std::array<EchoRemoverMetrics::DbMetric, 2>* statistic) {
-  RTC_DCHECK(statistic);
-  // Truncation is intended in the band width computation.
-  constexpr int kNumBands = 2;
-  constexpr int kBandWidth = 65 / kNumBands;
-  constexpr float kOneByBandWidth = 1.f / kBandWidth;
-  RTC_DCHECK_EQ(kNumBands, statistic->size());
-  RTC_DCHECK_EQ(65, value.size());
-  for (size_t k = 0; k < statistic->size(); ++k) {
-    float average_band =
-        std::accumulate(value.begin() + kBandWidth * k,
-                        value.begin() + kBandWidth * (k + 1), 0.f) *
-        kOneByBandWidth;
-    (*statistic)[k].Update(average_band);
-  }
-}
-
-int TransformDbMetricForReporting(bool negate,
-                                  float min_value,
-                                  float max_value,
-                                  float offset,
-                                  float scaling,
-                                  float value) {
-  float new_value = 10.f * log10(value * scaling + 1e-10f) + offset;
-  if (negate) {
-    new_value = -new_value;
-  }
-  return static_cast<int>(rtc::SafeClamp(new_value, min_value, max_value));
-}
-
-}  // namespace aec3
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/aec3/echo_remover_metrics.h b/modules/audio_processing/aec3/echo_remover_metrics.h
deleted file mode 100644
index 57e123e..0000000
--- a/modules/audio_processing/aec3/echo_remover_metrics.h
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- *  Copyright (c) 2017 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_PROCESSING_AEC3_ECHO_REMOVER_METRICS_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_AEC3_ECHO_REMOVER_METRICS_H_
-
-#include "webrtc/modules/audio_processing/aec3/aec_state.h"
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace webrtc {
-
-// Handles the reporting of metrics for the echo remover.
-class EchoRemoverMetrics {
- public:
-  struct DbMetric {
-    DbMetric();
-    DbMetric(float sum_value, float floor_value, float ceil_value);
-    void Update(float value);
-    float sum_value;
-    float floor_value;
-    float ceil_value;
-  };
-
-  EchoRemoverMetrics();
-
-  // Updates the metric with new data.
-  void Update(
-      const AecState& aec_state,
-      const std::array<float, kFftLengthBy2Plus1>& comfort_noise_spectrum,
-      const std::array<float, kFftLengthBy2Plus1>& suppressor_gain);
-
-  // Returns true if the metrics have just been reported, otherwise false.
-  bool MetricsReported() { return metrics_reported_; }
-
- private:
-  // Resets the metrics.
-  void ResetMetrics();
-
-  int block_counter_ = 0;
-  std::array<DbMetric, 2> erl_;
-  std::array<DbMetric, 2> erle_;
-  std::array<DbMetric, 2> comfort_noise_;
-  std::array<DbMetric, 2> suppressor_gain_;
-  int active_render_count_ = 0;
-  bool saturated_capture_ = false;
-  bool metrics_reported_ = false;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(EchoRemoverMetrics);
-};
-
-namespace aec3 {
-
-// Updates a banded metric of type DbMetric with the values in the supplied
-// array.
-void UpdateDbMetric(const std::array<float, kFftLengthBy2Plus1>& value,
-                    std::array<EchoRemoverMetrics::DbMetric, 2>* statistic);
-
-// Transforms a DbMetric from the linear domain into the logarithmic domain.
-int TransformDbMetricForReporting(bool negate,
-                                  float min_value,
-                                  float max_value,
-                                  float offset,
-                                  float scaling,
-                                  float value);
-
-}  // namespace aec3
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_AEC3_ECHO_REMOVER_METRICS_H_
diff --git a/modules/audio_processing/aec3/echo_remover_metrics_unittest.cc b/modules/audio_processing/aec3/echo_remover_metrics_unittest.cc
deleted file mode 100644
index 094508e..0000000
--- a/modules/audio_processing/aec3/echo_remover_metrics_unittest.cc
+++ /dev/null
@@ -1,144 +0,0 @@
-/*
- *  Copyright (c) 2017 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_processing/aec3/echo_remover_metrics.h"
-
-#include <math.h>
-
-#include "webrtc/modules/audio_processing/aec3/aec_state.h"
-#include "webrtc/modules/audio_processing/aec3/aec3_fft.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-#if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
-
-// Verifies the check for non-null input.
-TEST(UpdateDbMetric, NullValue) {
-  std::array<float, kFftLengthBy2Plus1> value;
-  value.fill(0.f);
-  EXPECT_DEATH(aec3::UpdateDbMetric(value, nullptr), "");
-}
-
-#endif
-
-// Verifies the updating functionality of UpdateDbMetric.
-TEST(UpdateDbMetric, Updating) {
-  std::array<float, kFftLengthBy2Plus1> value;
-  std::array<EchoRemoverMetrics::DbMetric, 2> statistic;
-  statistic.fill(EchoRemoverMetrics::DbMetric(0.f, 100.f, -100.f));
-  constexpr float kValue0 = 10.f;
-  constexpr float kValue1 = 20.f;
-  std::fill(value.begin(), value.begin() + 32, kValue0);
-  std::fill(value.begin() + 32, value.begin() + 64, kValue1);
-
-  aec3::UpdateDbMetric(value, &statistic);
-  EXPECT_FLOAT_EQ(kValue0, statistic[0].sum_value);
-  EXPECT_FLOAT_EQ(kValue0, statistic[0].ceil_value);
-  EXPECT_FLOAT_EQ(kValue0, statistic[0].floor_value);
-  EXPECT_FLOAT_EQ(kValue1, statistic[1].sum_value);
-  EXPECT_FLOAT_EQ(kValue1, statistic[1].ceil_value);
-  EXPECT_FLOAT_EQ(kValue1, statistic[1].floor_value);
-
-  aec3::UpdateDbMetric(value, &statistic);
-  EXPECT_FLOAT_EQ(2.f * kValue0, statistic[0].sum_value);
-  EXPECT_FLOAT_EQ(kValue0, statistic[0].ceil_value);
-  EXPECT_FLOAT_EQ(kValue0, statistic[0].floor_value);
-  EXPECT_FLOAT_EQ(2.f * kValue1, statistic[1].sum_value);
-  EXPECT_FLOAT_EQ(kValue1, statistic[1].ceil_value);
-  EXPECT_FLOAT_EQ(kValue1, statistic[1].floor_value);
-}
-
-// Verifies that the TransformDbMetricForReporting method produces the desired
-// output for values for dBFS.
-TEST(TransformDbMetricForReporting, DbFsScaling) {
-  std::array<float, kBlockSize> x;
-  FftData X;
-  std::array<float, kFftLengthBy2Plus1> X2;
-  Aec3Fft fft;
-  x.fill(1000.f);
-  fft.ZeroPaddedFft(x, &X);
-  X.Spectrum(Aec3Optimization::kNone, &X2);
-
-  float offset = -10.f * log10(32768.f * 32768.f);
-  EXPECT_NEAR(offset, -90.3f, 0.1f);
-  EXPECT_EQ(
-      static_cast<int>(30.3f),
-      aec3::TransformDbMetricForReporting(
-          true, 0.f, 90.f, offset, 1.f / (kBlockSize * kBlockSize), X2[0]));
-}
-
-// Verifies that the TransformDbMetricForReporting method is able to properly
-// limit the output.
-TEST(TransformDbMetricForReporting, Limits) {
-  EXPECT_EQ(
-      0,
-      aec3::TransformDbMetricForReporting(false, 0.f, 10.f, 0.f, 1.f, 0.001f));
-  EXPECT_EQ(
-      10,
-      aec3::TransformDbMetricForReporting(false, 0.f, 10.f, 0.f, 1.f, 100.f));
-}
-
-// Verifies that the TransformDbMetricForReporting method is able to properly
-// negate output.
-TEST(TransformDbMetricForReporting, Negate) {
-  EXPECT_EQ(
-      10,
-      aec3::TransformDbMetricForReporting(true, -20.f, 20.f, 0.f, 1.f, 0.1f));
-  EXPECT_EQ(
-      -10,
-      aec3::TransformDbMetricForReporting(true, -20.f, 20.f, 0.f, 1.f, 10.f));
-}
-
-// Verify the Update functionality of DbMetric.
-TEST(DbMetric, Update) {
-  EchoRemoverMetrics::DbMetric metric(0.f, 20.f, -20.f);
-  constexpr int kNumValues = 100;
-  constexpr float kValue = 10.f;
-  for (int k = 0; k < kNumValues; ++k) {
-    metric.Update(kValue);
-  }
-  EXPECT_FLOAT_EQ(kValue * kNumValues, metric.sum_value);
-  EXPECT_FLOAT_EQ(kValue, metric.ceil_value);
-  EXPECT_FLOAT_EQ(kValue, metric.floor_value);
-}
-
-// Verify the constructor functionality of DbMetric.
-TEST(DbMetric, Constructor) {
-  EchoRemoverMetrics::DbMetric metric;
-  EXPECT_FLOAT_EQ(0.f, metric.sum_value);
-  EXPECT_FLOAT_EQ(0.f, metric.ceil_value);
-  EXPECT_FLOAT_EQ(0.f, metric.floor_value);
-
-  metric = EchoRemoverMetrics::DbMetric(1.f, 2.f, 3.f);
-  EXPECT_FLOAT_EQ(1.f, metric.sum_value);
-  EXPECT_FLOAT_EQ(2.f, metric.floor_value);
-  EXPECT_FLOAT_EQ(3.f, metric.ceil_value);
-}
-
-// Verify the general functionality of EchoRemoverMetrics.
-TEST(EchoRemoverMetrics, NormalUsage) {
-  EchoRemoverMetrics metrics;
-  AecState aec_state(AudioProcessing::Config::EchoCanceller3{});
-  std::array<float, kFftLengthBy2Plus1> comfort_noise_spectrum;
-  std::array<float, kFftLengthBy2Plus1> suppressor_gain;
-  comfort_noise_spectrum.fill(10.f);
-  suppressor_gain.fill(1.f);
-  for (int j = 0; j < 3; ++j) {
-    for (int k = 0; k < kMetricsReportingIntervalBlocks - 1; ++k) {
-      metrics.Update(aec_state, comfort_noise_spectrum, suppressor_gain);
-      EXPECT_FALSE(metrics.MetricsReported());
-    }
-    metrics.Update(aec_state, comfort_noise_spectrum, suppressor_gain);
-    EXPECT_TRUE(metrics.MetricsReported());
-  }
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/aec3/echo_remover_unittest.cc b/modules/audio_processing/aec3/echo_remover_unittest.cc
deleted file mode 100644
index f2f895d..0000000
--- a/modules/audio_processing/aec3/echo_remover_unittest.cc
+++ /dev/null
@@ -1,202 +0,0 @@
-/*
- *  Copyright (c) 2017 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_processing/aec3/echo_remover.h"
-
-#include <algorithm>
-#include <memory>
-#include <numeric>
-#include <sstream>
-#include <string>
-
-#include "webrtc/modules/audio_processing/aec3/aec3_common.h"
-#include "webrtc/modules/audio_processing/aec3/render_buffer.h"
-#include "webrtc/modules/audio_processing/aec3/render_delay_buffer.h"
-#include "webrtc/modules/audio_processing/logging/apm_data_dumper.h"
-#include "webrtc/modules/audio_processing/test/echo_canceller_test_tools.h"
-#include "webrtc/rtc_base/random.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-namespace {
-
-std::string ProduceDebugText(int sample_rate_hz) {
-  std::ostringstream ss;
-  ss << "Sample rate: " << sample_rate_hz;
-  return ss.str();
-}
-
-std::string ProduceDebugText(int sample_rate_hz, int delay) {
-  std::ostringstream ss(ProduceDebugText(sample_rate_hz));
-  ss << ", Delay: " << delay;
-  return ss.str();
-}
-
-}  // namespace
-
-// Verifies the basic API call sequence
-TEST(EchoRemover, BasicApiCalls) {
-  for (auto rate : {8000, 16000, 32000, 48000}) {
-    SCOPED_TRACE(ProduceDebugText(rate));
-    std::unique_ptr<EchoRemover> remover(
-        EchoRemover::Create(AudioProcessing::Config::EchoCanceller3(), rate));
-    std::unique_ptr<RenderDelayBuffer> render_buffer(
-        RenderDelayBuffer::Create(NumBandsForRate(rate)));
-
-    std::vector<std::vector<float>> render(NumBandsForRate(rate),
-                                           std::vector<float>(kBlockSize, 0.f));
-    std::vector<std::vector<float>> capture(
-        NumBandsForRate(rate), std::vector<float>(kBlockSize, 0.f));
-    for (size_t k = 0; k < 100; ++k) {
-      EchoPathVariability echo_path_variability(k % 3 == 0 ? true : false,
-                                                k % 5 == 0 ? true : false);
-      rtc::Optional<size_t> echo_path_delay_samples =
-          (k % 6 == 0 ? rtc::Optional<size_t>(k * 10)
-                      : rtc::Optional<size_t>());
-      render_buffer->Insert(render);
-      render_buffer->UpdateBuffers();
-      remover->ProcessCapture(echo_path_delay_samples, echo_path_variability,
-                              k % 2 == 0 ? true : false,
-                              render_buffer->GetRenderBuffer(), &capture);
-    }
-  }
-}
-
-#if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
-
-// Verifies the check for the samplerate.
-// TODO(peah): Re-enable the test once the issue with memory leaks during DEATH
-// tests on test bots has been fixed.
-TEST(EchoRemover, DISABLED_WrongSampleRate) {
-  EXPECT_DEATH(std::unique_ptr<EchoRemover>(EchoRemover::Create(
-                   AudioProcessing::Config::EchoCanceller3(), 8001)),
-               "");
-}
-
-// Verifies the check for the capture block size.
-TEST(EchoRemover, WrongCaptureBlockSize) {
-  for (auto rate : {8000, 16000, 32000, 48000}) {
-    SCOPED_TRACE(ProduceDebugText(rate));
-    std::unique_ptr<EchoRemover> remover(
-        EchoRemover::Create(AudioProcessing::Config::EchoCanceller3(), rate));
-    std::unique_ptr<RenderDelayBuffer> render_buffer(
-        RenderDelayBuffer::Create(NumBandsForRate(rate)));
-    std::vector<std::vector<float>> capture(
-        NumBandsForRate(rate), std::vector<float>(kBlockSize - 1, 0.f));
-    EchoPathVariability echo_path_variability(false, false);
-    rtc::Optional<size_t> echo_path_delay_samples;
-    EXPECT_DEATH(remover->ProcessCapture(
-                     echo_path_delay_samples, echo_path_variability, false,
-                     render_buffer->GetRenderBuffer(), &capture),
-                 "");
-  }
-}
-
-// Verifies the check for the number of capture bands.
-// TODO(peah): Re-enable the test once the issue with memory leaks during DEATH
-// tests on test bots has been fixed.c
-TEST(EchoRemover, DISABLED_WrongCaptureNumBands) {
-  for (auto rate : {16000, 32000, 48000}) {
-    SCOPED_TRACE(ProduceDebugText(rate));
-    std::unique_ptr<EchoRemover> remover(
-        EchoRemover::Create(AudioProcessing::Config::EchoCanceller3(), rate));
-    std::unique_ptr<RenderDelayBuffer> render_buffer(
-        RenderDelayBuffer::Create(NumBandsForRate(rate)));
-    std::vector<std::vector<float>> capture(
-        NumBandsForRate(rate == 48000 ? 16000 : rate + 16000),
-        std::vector<float>(kBlockSize, 0.f));
-    EchoPathVariability echo_path_variability(false, false);
-    rtc::Optional<size_t> echo_path_delay_samples;
-    EXPECT_DEATH(remover->ProcessCapture(
-                     echo_path_delay_samples, echo_path_variability, false,
-                     render_buffer->GetRenderBuffer(), &capture),
-                 "");
-  }
-}
-
-// Verifies the check for non-null capture block.
-TEST(EchoRemover, NullCapture) {
-  std::unique_ptr<EchoRemover> remover(
-      EchoRemover::Create(AudioProcessing::Config::EchoCanceller3(), 8000));
-  std::unique_ptr<RenderDelayBuffer> render_buffer(
-      RenderDelayBuffer::Create(3));
-  EchoPathVariability echo_path_variability(false, false);
-  rtc::Optional<size_t> echo_path_delay_samples;
-  EXPECT_DEATH(
-      remover->ProcessCapture(echo_path_delay_samples, echo_path_variability,
-                              false, render_buffer->GetRenderBuffer(), nullptr),
-      "");
-}
-
-#endif
-
-// Performs a sanity check that the echo_remover is able to properly
-// remove echoes.
-TEST(EchoRemover, BasicEchoRemoval) {
-  constexpr int kNumBlocksToProcess = 500;
-  Random random_generator(42U);
-  for (auto rate : {8000, 16000, 32000, 48000}) {
-    std::vector<std::vector<float>> x(NumBandsForRate(rate),
-                                      std::vector<float>(kBlockSize, 0.f));
-    std::vector<std::vector<float>> y(NumBandsForRate(rate),
-                                      std::vector<float>(kBlockSize, 0.f));
-    EchoPathVariability echo_path_variability(false, false);
-    for (size_t delay_samples : {0, 64, 150, 200, 301}) {
-      SCOPED_TRACE(ProduceDebugText(rate, delay_samples));
-      std::unique_ptr<EchoRemover> remover(
-          EchoRemover::Create(AudioProcessing::Config::EchoCanceller3(), rate));
-      std::unique_ptr<RenderDelayBuffer> render_buffer(
-          RenderDelayBuffer::Create(NumBandsForRate(rate)));
-      std::vector<std::unique_ptr<DelayBuffer<float>>> delay_buffers(x.size());
-      for (size_t j = 0; j < x.size(); ++j) {
-        delay_buffers[j].reset(new DelayBuffer<float>(delay_samples));
-      }
-
-      float input_energy = 0.f;
-      float output_energy = 0.f;
-      for (int k = 0; k < kNumBlocksToProcess; ++k) {
-        const bool silence = k < 100 || (k % 100 >= 10);
-
-        for (size_t j = 0; j < x.size(); ++j) {
-          if (silence) {
-            std::fill(x[j].begin(), x[j].end(), 0.f);
-          } else {
-            RandomizeSampleVector(&random_generator, x[j]);
-          }
-          delay_buffers[j]->Delay(x[j], y[j]);
-        }
-
-        if (k > kNumBlocksToProcess / 2) {
-          for (size_t j = 0; j < x.size(); ++j) {
-            input_energy = std::inner_product(y[j].begin(), y[j].end(),
-                                              y[j].begin(), input_energy);
-          }
-        }
-
-        render_buffer->Insert(x);
-        render_buffer->UpdateBuffers();
-
-        remover->ProcessCapture(rtc::Optional<size_t>(delay_samples),
-                                echo_path_variability, false,
-                                render_buffer->GetRenderBuffer(), &y);
-
-        if (k > kNumBlocksToProcess / 2) {
-          for (size_t j = 0; j < x.size(); ++j) {
-            output_energy = std::inner_product(y[j].begin(), y[j].end(),
-                                               y[j].begin(), output_energy);
-          }
-        }
-      }
-      EXPECT_GT(input_energy, 10.f * output_energy);
-    }
-  }
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/aec3/erl_estimator.cc b/modules/audio_processing/aec3/erl_estimator.cc
deleted file mode 100644
index 6990ea3..0000000
--- a/modules/audio_processing/aec3/erl_estimator.cc
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- *  Copyright (c) 2017 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_processing/aec3/erl_estimator.h"
-
-#include <algorithm>
-
-namespace webrtc {
-
-namespace {
-
-constexpr float kMinErl = 0.01f;
-constexpr float kMaxErl = 1000.f;
-
-}  // namespace
-
-ErlEstimator::ErlEstimator() {
-  erl_.fill(kMaxErl);
-  hold_counters_.fill(0);
-}
-
-ErlEstimator::~ErlEstimator() = default;
-
-void ErlEstimator::Update(
-    const std::array<float, kFftLengthBy2Plus1>& render_spectrum,
-    const std::array<float, kFftLengthBy2Plus1>& capture_spectrum) {
-  const auto& X2 = render_spectrum;
-  const auto& Y2 = capture_spectrum;
-
-  // Corresponds to WGN of power -46 dBFS.
-  constexpr float kX2Min = 44015068.0f;
-
-  // Update the estimates in a maximum statistics manner.
-  for (size_t k = 1; k < kFftLengthBy2; ++k) {
-    if (X2[k] > kX2Min) {
-      const float new_erl = Y2[k] / X2[k];
-      if (new_erl < erl_[k]) {
-        hold_counters_[k - 1] = 1000;
-        erl_[k] += 0.1 * (new_erl - erl_[k]);
-        erl_[k] = std::max(erl_[k], kMinErl);
-      }
-    }
-  }
-
-  std::for_each(hold_counters_.begin(), hold_counters_.end(),
-                [](int& a) { --a; });
-  std::transform(hold_counters_.begin(), hold_counters_.end(), erl_.begin() + 1,
-                 erl_.begin() + 1, [](int a, float b) {
-                   return a > 0 ? b : std::min(kMaxErl, 2.f * b);
-                 });
-
-  erl_[0] = erl_[1];
-  erl_[kFftLengthBy2] = erl_[kFftLengthBy2 - 1];
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/aec3/erl_estimator.h b/modules/audio_processing/aec3/erl_estimator.h
deleted file mode 100644
index bc81926..0000000
--- a/modules/audio_processing/aec3/erl_estimator.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- *  Copyright (c) 2017 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_PROCESSING_AEC3_ERL_ESTIMATOR_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_AEC3_ERL_ESTIMATOR_H_
-
-#include <array>
-
-#include "webrtc/modules/audio_processing/aec3/aec3_common.h"
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace webrtc {
-
-// Estimates the echo return loss based on the signal spectra.
-class ErlEstimator {
- public:
-  ErlEstimator();
-  ~ErlEstimator();
-
-  // Updates the ERL estimate.
-  void Update(const std::array<float, kFftLengthBy2Plus1>& render_spectrum,
-              const std::array<float, kFftLengthBy2Plus1>& capture_spectrum);
-
-  // Returns the most recent ERL estimate.
-  const std::array<float, kFftLengthBy2Plus1>& Erl() const { return erl_; }
-
- private:
-  std::array<float, kFftLengthBy2Plus1> erl_;
-  std::array<int, kFftLengthBy2Minus1> hold_counters_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(ErlEstimator);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_AEC3_ERL_ESTIMATOR_H_
diff --git a/modules/audio_processing/aec3/erl_estimator_unittest.cc b/modules/audio_processing/aec3/erl_estimator_unittest.cc
deleted file mode 100644
index bf80382..0000000
--- a/modules/audio_processing/aec3/erl_estimator_unittest.cc
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- *  Copyright (c) 2017 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_processing/aec3/erl_estimator.h"
-
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-namespace {
-
-void VerifyErl(const std::array<float, kFftLengthBy2Plus1>& erl,
-               float reference) {
-  std::for_each(erl.begin(), erl.end(),
-                [reference](float a) { EXPECT_NEAR(reference, a, 0.001); });
-}
-
-}  // namespace
-
-// Verifies that the correct ERL estimates are achieved.
-TEST(ErlEstimator, Estimates) {
-  std::array<float, kFftLengthBy2Plus1> X2;
-  std::array<float, kFftLengthBy2Plus1> Y2;
-
-  ErlEstimator estimator;
-
-  // Verifies that the ERL estimate is properly reduced to lower values.
-  X2.fill(500 * 1000.f * 1000.f);
-  Y2.fill(10 * X2[0]);
-  for (size_t k = 0; k < 200; ++k) {
-    estimator.Update(X2, Y2);
-  }
-  VerifyErl(estimator.Erl(), 10.f);
-
-  // Verifies that the ERL is not immediately increased when the ERL in the data
-  // increases.
-  Y2.fill(10000 * X2[0]);
-  for (size_t k = 0; k < 998; ++k) {
-    estimator.Update(X2, Y2);
-  }
-  VerifyErl(estimator.Erl(), 10.f);
-
-  // Verifies that the rate of increase is 3 dB.
-  estimator.Update(X2, Y2);
-  VerifyErl(estimator.Erl(), 20.f);
-
-  // Verifies that the maximum ERL is achieved when there are no low RLE
-  // estimates.
-  for (size_t k = 0; k < 1000; ++k) {
-    estimator.Update(X2, Y2);
-  }
-  VerifyErl(estimator.Erl(), 1000.f);
-
-  // Verifies that the ERL estimate is is not updated for low-level signals
-  X2.fill(1000.f * 1000.f);
-  Y2.fill(10 * X2[0]);
-  for (size_t k = 0; k < 200; ++k) {
-    estimator.Update(X2, Y2);
-  }
-  VerifyErl(estimator.Erl(), 1000.f);
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/aec3/erle_estimator.cc b/modules/audio_processing/aec3/erle_estimator.cc
deleted file mode 100644
index da0e421..0000000
--- a/modules/audio_processing/aec3/erle_estimator.cc
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- *  Copyright (c) 2017 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_processing/aec3/erle_estimator.h"
-
-#include <algorithm>
-
-#include "webrtc/rtc_base/safe_minmax.h"
-
-namespace webrtc {
-
-ErleEstimator::ErleEstimator(float min_erle,
-                             float max_erle_lf,
-                             float max_erle_hf)
-    : min_erle_(min_erle),
-      max_erle_lf_(max_erle_lf),
-      max_erle_hf_(max_erle_hf) {
-  erle_.fill(min_erle_);
-  hold_counters_.fill(0);
-}
-
-ErleEstimator::~ErleEstimator() = default;
-
-void ErleEstimator::Update(
-    const std::array<float, kFftLengthBy2Plus1>& render_spectrum,
-    const std::array<float, kFftLengthBy2Plus1>& capture_spectrum,
-    const std::array<float, kFftLengthBy2Plus1>& subtractor_spectrum) {
-  const auto& X2 = render_spectrum;
-  const auto& Y2 = capture_spectrum;
-  const auto& E2 = subtractor_spectrum;
-
-  // Corresponds of WGN of power -46 dBFS.
-  constexpr float kX2Min = 44015068.0f;
-
-  // Update the estimates in a clamped minimum statistics manner.
-  auto erle_update = [&](size_t start, size_t stop, float max_erle) {
-    for (size_t k = start; k < stop; ++k) {
-      if (X2[k] > kX2Min && E2[k] > 0.f) {
-        const float new_erle = Y2[k] / E2[k];
-        if (new_erle > erle_[k]) {
-          hold_counters_[k - 1] = 100;
-          erle_[k] += 0.1f * (new_erle - erle_[k]);
-          erle_[k] = rtc::SafeClamp(erle_[k], min_erle_, max_erle);
-        }
-      }
-    }
-  };
-  erle_update(1, kFftLengthBy2 / 2, max_erle_lf_);
-  erle_update(kFftLengthBy2 / 2, kFftLengthBy2, max_erle_hf_);
-
-  std::for_each(hold_counters_.begin(), hold_counters_.end(),
-                [](int& a) { --a; });
-  std::transform(hold_counters_.begin(), hold_counters_.end(),
-                 erle_.begin() + 1, erle_.begin() + 1, [&](int a, float b) {
-                   return a > 0 ? b : std::max(min_erle_, 0.97f * b);
-                 });
-
-  erle_[0] = erle_[1];
-  erle_[kFftLengthBy2] = erle_[kFftLengthBy2 - 1];
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/aec3/erle_estimator.h b/modules/audio_processing/aec3/erle_estimator.h
deleted file mode 100644
index 91a8c6c..0000000
--- a/modules/audio_processing/aec3/erle_estimator.h
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- *  Copyright (c) 2017 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_PROCESSING_AEC3_ERLE_ESTIMATOR_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_AEC3_ERLE_ESTIMATOR_H_
-
-#include <array>
-
-#include "webrtc/modules/audio_processing/aec3/aec3_common.h"
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace webrtc {
-
-// Estimates the echo return loss enhancement based on the signal spectra.
-class ErleEstimator {
- public:
-  ErleEstimator(float min_erle, float max_erle_lf, float max_erle_hf);
-  ~ErleEstimator();
-
-  // Updates the ERLE estimate.
-  void Update(const std::array<float, kFftLengthBy2Plus1>& render_spectrum,
-              const std::array<float, kFftLengthBy2Plus1>& capture_spectrum,
-              const std::array<float, kFftLengthBy2Plus1>& subtractor_spectrum);
-
-  // Returns the most recent ERLE estimate.
-  const std::array<float, kFftLengthBy2Plus1>& Erle() const { return erle_; }
-
- private:
-  std::array<float, kFftLengthBy2Plus1> erle_;
-  std::array<int, kFftLengthBy2Minus1> hold_counters_;
-  const float min_erle_;
-  const float max_erle_lf_;
-  const float max_erle_hf_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(ErleEstimator);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_AEC3_ERLE_ESTIMATOR_H_
diff --git a/modules/audio_processing/aec3/erle_estimator_unittest.cc b/modules/audio_processing/aec3/erle_estimator_unittest.cc
deleted file mode 100644
index be435c0..0000000
--- a/modules/audio_processing/aec3/erle_estimator_unittest.cc
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- *  Copyright (c) 2017 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_processing/aec3/erle_estimator.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-namespace {
-
-constexpr int kLowFrequencyLimit = kFftLengthBy2 / 2;
-
-void VerifyErle(const std::array<float, kFftLengthBy2Plus1>& erle,
-                float reference_lf,
-                float reference_hf) {
-  std::for_each(
-      erle.begin(), erle.begin() + kLowFrequencyLimit,
-      [reference_lf](float a) { EXPECT_NEAR(reference_lf, a, 0.001); });
-  std::for_each(
-      erle.begin() + kLowFrequencyLimit, erle.end(),
-      [reference_hf](float a) { EXPECT_NEAR(reference_hf, a, 0.001); });
-}
-
-}  // namespace
-
-// Verifies that the correct ERLE estimates are achieved.
-TEST(ErleEstimator, Estimates) {
-  std::array<float, kFftLengthBy2Plus1> X2;
-  std::array<float, kFftLengthBy2Plus1> E2;
-  std::array<float, kFftLengthBy2Plus1> Y2;
-
-  ErleEstimator estimator(1.f, 8.f, 1.5f);
-
-  // Verifies that the ERLE estimate is properley increased to higher values.
-  X2.fill(500 * 1000.f * 1000.f);
-  E2.fill(1000.f * 1000.f);
-  Y2.fill(10 * E2[0]);
-  for (size_t k = 0; k < 200; ++k) {
-    estimator.Update(X2, Y2, E2);
-  }
-  VerifyErle(estimator.Erle(), 8.f, 1.5f);
-
-  // Verifies that the ERLE is not immediately decreased when the ERLE in the
-  // data decreases.
-  Y2.fill(0.1f * E2[0]);
-  for (size_t k = 0; k < 98; ++k) {
-    estimator.Update(X2, Y2, E2);
-  }
-  VerifyErle(estimator.Erle(), 8.f, 1.5f);
-
-  // Verifies that the minimum ERLE is eventually achieved.
-  for (size_t k = 0; k < 1000; ++k) {
-    estimator.Update(X2, Y2, E2);
-  }
-  VerifyErle(estimator.Erle(), 1.f, 1.f);
-
-  // Verifies that the ERLE estimate is is not updated for low-level render
-  // signals.
-  X2.fill(1000.f * 1000.f);
-  Y2.fill(10 * E2[0]);
-  for (size_t k = 0; k < 200; ++k) {
-    estimator.Update(X2, Y2, E2);
-  }
-  VerifyErle(estimator.Erle(), 1.f, 1.f);
-}
-}  // namespace webrtc
diff --git a/modules/audio_processing/aec3/fft_data.h b/modules/audio_processing/aec3/fft_data.h
deleted file mode 100644
index bfd182b..0000000
--- a/modules/audio_processing/aec3/fft_data.h
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- *  Copyright (c) 2017 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_PROCESSING_AEC3_FFT_DATA_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_AEC3_FFT_DATA_H_
-
-#include "webrtc/typedefs.h"
-#if defined(WEBRTC_ARCH_X86_FAMILY)
-#include <emmintrin.h>
-#endif
-#include <algorithm>
-#include <array>
-
-#include "webrtc/api/array_view.h"
-#include "webrtc/modules/audio_processing/aec3/aec3_common.h"
-
-namespace webrtc {
-
-// Struct that holds imaginary data produced from 128 point real-valued FFTs.
-struct FftData {
-  // Copies the data in src.
-  void Assign(const FftData& src) {
-    std::copy(src.re.begin(), src.re.end(), re.begin());
-    std::copy(src.im.begin(), src.im.end(), im.begin());
-    im[0] = im[kFftLengthBy2] = 0;
-  }
-
-  // Clears all the imaginary.
-  void Clear() {
-    re.fill(0.f);
-    im.fill(0.f);
-  }
-
-  // Computes the power spectrum of the data.
-  void Spectrum(Aec3Optimization optimization,
-                std::array<float, kFftLengthBy2Plus1>* power_spectrum) const {
-    RTC_DCHECK(power_spectrum);
-    switch (optimization) {
-#if defined(WEBRTC_ARCH_X86_FAMILY)
-      case Aec3Optimization::kSse2: {
-        constexpr int kNumFourBinBands = kFftLengthBy2 / 4;
-        constexpr int kLimit = kNumFourBinBands * 4;
-        for (size_t k = 0; k < kLimit; k += 4) {
-          const __m128 r = _mm_loadu_ps(&re[k]);
-          const __m128 i = _mm_loadu_ps(&im[k]);
-          const __m128 ii = _mm_mul_ps(i, i);
-          const __m128 rr = _mm_mul_ps(r, r);
-          const __m128 rrii = _mm_add_ps(rr, ii);
-          _mm_storeu_ps(&(*power_spectrum)[k], rrii);
-        }
-        (*power_spectrum)[kFftLengthBy2] =
-            re[kFftLengthBy2] * re[kFftLengthBy2] +
-            im[kFftLengthBy2] * im[kFftLengthBy2];
-      } break;
-#endif
-      default:
-        std::transform(re.begin(), re.end(), im.begin(),
-                       power_spectrum->begin(),
-                       [](float a, float b) { return a * a + b * b; });
-    }
-  }
-
-  // Copy the data from an interleaved array.
-  void CopyFromPackedArray(const std::array<float, kFftLength>& v) {
-    re[0] = v[0];
-    re[kFftLengthBy2] = v[1];
-    im[0] = im[kFftLengthBy2] = 0;
-    for (size_t k = 1, j = 2; k < kFftLengthBy2; ++k) {
-      re[k] = v[j++];
-      im[k] = v[j++];
-    }
-  }
-
-  // Copies the data into an interleaved array.
-  void CopyToPackedArray(std::array<float, kFftLength>* v) const {
-    RTC_DCHECK(v);
-    (*v)[0] = re[0];
-    (*v)[1] = re[kFftLengthBy2];
-    for (size_t k = 1, j = 2; k < kFftLengthBy2; ++k) {
-      (*v)[j++] = re[k];
-      (*v)[j++] = im[k];
-    }
-  }
-
-  std::array<float, kFftLengthBy2Plus1> re;
-  std::array<float, kFftLengthBy2Plus1> im;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_AEC3_FFT_DATA_H_
diff --git a/modules/audio_processing/aec3/fft_data_unittest.cc b/modules/audio_processing/aec3/fft_data_unittest.cc
deleted file mode 100644
index e5881cf..0000000
--- a/modules/audio_processing/aec3/fft_data_unittest.cc
+++ /dev/null
@@ -1,163 +0,0 @@
-/*
- *  Copyright (c) 2017 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_processing/aec3/fft_data.h"
-
-#include "webrtc/system_wrappers/include/cpu_features_wrapper.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-#if defined(WEBRTC_ARCH_X86_FAMILY)
-// Verifies that the optimized methods are bitexact to their reference
-// counterparts.
-TEST(FftData, TestOptimizations) {
-  if (WebRtc_GetCPUInfo(kSSE2) != 0) {
-    FftData x;
-
-    for (size_t k = 0; k < x.re.size(); ++k) {
-      x.re[k] = k + 1;
-    }
-
-    x.im[0] = x.im[x.im.size() - 1] = 0.f;
-    for (size_t k = 1; k < x.im.size() - 1; ++k) {
-      x.im[k] = 2.f * (k + 1);
-    }
-
-    std::array<float, kFftLengthBy2Plus1> spectrum;
-    std::array<float, kFftLengthBy2Plus1> spectrum_sse2;
-    x.Spectrum(Aec3Optimization::kNone, &spectrum);
-    x.Spectrum(Aec3Optimization::kSse2, &spectrum_sse2);
-    EXPECT_EQ(spectrum, spectrum_sse2);
-  }
-}
-#endif
-
-#if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
-
-// Verifies the check for null output in CopyToPackedArray.
-TEST(FftData, NonNullCopyToPackedArrayOutput) {
-  EXPECT_DEATH(FftData().CopyToPackedArray(nullptr), "");
-}
-
-// Verifies the check for null output in Spectrum.
-TEST(FftData, NonNullSpectrumOutput) {
-  EXPECT_DEATH(FftData().Spectrum(Aec3Optimization::kNone, nullptr), "");
-}
-
-#endif
-
-// Verifies that the Assign method properly copies the data from the source and
-// ensures that the imaginary components for the DC and Nyquist bins are 0.
-TEST(FftData, Assign) {
-  FftData x;
-  FftData y;
-
-  x.re.fill(1.f);
-  x.im.fill(2.f);
-  y.Assign(x);
-  EXPECT_EQ(x.re, y.re);
-  EXPECT_EQ(0.f, y.im[0]);
-  EXPECT_EQ(0.f, y.im[x.im.size() - 1]);
-  for (size_t k = 1; k < x.im.size() - 1; ++k) {
-    EXPECT_EQ(x.im[k], y.im[k]);
-  }
-}
-
-// Verifies that the Clear method properly clears all the data.
-TEST(FftData, Clear) {
-  FftData x_ref;
-  FftData x;
-
-  x_ref.re.fill(0.f);
-  x_ref.im.fill(0.f);
-
-  x.re.fill(1.f);
-  x.im.fill(2.f);
-  x.Clear();
-
-  EXPECT_EQ(x_ref.re, x.re);
-  EXPECT_EQ(x_ref.im, x.im);
-}
-
-// Verifies that the spectrum is correctly computed.
-TEST(FftData, Spectrum) {
-  FftData x;
-
-  for (size_t k = 0; k < x.re.size(); ++k) {
-    x.re[k] = k + 1;
-  }
-
-  x.im[0] = x.im[x.im.size() - 1] = 0.f;
-  for (size_t k = 1; k < x.im.size() - 1; ++k) {
-    x.im[k] = 2.f * (k + 1);
-  }
-
-  std::array<float, kFftLengthBy2Plus1> spectrum;
-  x.Spectrum(Aec3Optimization::kNone, &spectrum);
-
-  EXPECT_EQ(x.re[0] * x.re[0], spectrum[0]);
-  EXPECT_EQ(x.re[spectrum.size() - 1] * x.re[spectrum.size() - 1],
-            spectrum[spectrum.size() - 1]);
-  for (size_t k = 1; k < spectrum.size() - 1; ++k) {
-    EXPECT_EQ(x.re[k] * x.re[k] + x.im[k] * x.im[k], spectrum[k]);
-  }
-}
-
-// Verifies that the functionality in CopyToPackedArray works as intended.
-TEST(FftData, CopyToPackedArray) {
-  FftData x;
-  std::array<float, kFftLength> x_packed;
-
-  for (size_t k = 0; k < x.re.size(); ++k) {
-    x.re[k] = k + 1;
-  }
-
-  x.im[0] = x.im[x.im.size() - 1] = 0.f;
-  for (size_t k = 1; k < x.im.size() - 1; ++k) {
-    x.im[k] = 2.f * (k + 1);
-  }
-
-  x.CopyToPackedArray(&x_packed);
-
-  EXPECT_EQ(x.re[0], x_packed[0]);
-  EXPECT_EQ(x.re[x.re.size() - 1], x_packed[1]);
-  for (size_t k = 1; k < x_packed.size() / 2; ++k) {
-    EXPECT_EQ(x.re[k], x_packed[2 * k]);
-    EXPECT_EQ(x.im[k], x_packed[2 * k + 1]);
-  }
-}
-
-// Verifies that the functionality in CopyFromPackedArray works as intended
-// (relies on that the functionality in CopyToPackedArray has been verified in
-// the test above).
-TEST(FftData, CopyFromPackedArray) {
-  FftData x_ref;
-  FftData x;
-  std::array<float, kFftLength> x_packed;
-
-  for (size_t k = 0; k < x_ref.re.size(); ++k) {
-    x_ref.re[k] = k + 1;
-  }
-
-  x_ref.im[0] = x_ref.im[x_ref.im.size() - 1] = 0.f;
-  for (size_t k = 1; k < x_ref.im.size() - 1; ++k) {
-    x_ref.im[k] = 2.f * (k + 1);
-  }
-
-  x_ref.CopyToPackedArray(&x_packed);
-  x.CopyFromPackedArray(x_packed);
-
-  EXPECT_EQ(x_ref.re, x.re);
-  EXPECT_EQ(x_ref.im, x.im);
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/aec3/frame_blocker.cc b/modules/audio_processing/aec3/frame_blocker.cc
deleted file mode 100644
index a8b04d9..0000000
--- a/modules/audio_processing/aec3/frame_blocker.cc
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- *  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_processing/aec3/frame_blocker.h"
-
-#include <algorithm>
-
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-
-FrameBlocker::FrameBlocker(size_t num_bands)
-    : num_bands_(num_bands), buffer_(num_bands_) {
-  for (auto& b : buffer_) {
-    b.reserve(kBlockSize);
-    RTC_DCHECK(b.empty());
-  }
-}
-
-FrameBlocker::~FrameBlocker() = default;
-
-void FrameBlocker::InsertSubFrameAndExtractBlock(
-    const std::vector<rtc::ArrayView<float>>& sub_frame,
-    std::vector<std::vector<float>>* block) {
-  RTC_DCHECK(block);
-  RTC_DCHECK_EQ(num_bands_, block->size());
-  RTC_DCHECK_EQ(num_bands_, sub_frame.size());
-  for (size_t i = 0; i < num_bands_; ++i) {
-    RTC_DCHECK_GE(kBlockSize - 16, buffer_[i].size());
-    RTC_DCHECK_EQ(kBlockSize, (*block)[i].size());
-    RTC_DCHECK_EQ(kSubFrameLength, sub_frame[i].size());
-    const int samples_to_block = kBlockSize - buffer_[i].size();
-    (*block)[i].clear();
-    (*block)[i].insert((*block)[i].begin(), buffer_[i].begin(),
-                       buffer_[i].end());
-    (*block)[i].insert((*block)[i].begin() + buffer_[i].size(),
-                       sub_frame[i].begin(),
-                       sub_frame[i].begin() + samples_to_block);
-    buffer_[i].clear();
-    buffer_[i].insert(buffer_[i].begin(),
-                      sub_frame[i].begin() + samples_to_block,
-                      sub_frame[i].end());
-  }
-}
-
-bool FrameBlocker::IsBlockAvailable() const {
-  return kBlockSize == buffer_[0].size();
-}
-
-void FrameBlocker::ExtractBlock(std::vector<std::vector<float>>* block) {
-  RTC_DCHECK(block);
-  RTC_DCHECK_EQ(num_bands_, block->size());
-  RTC_DCHECK(IsBlockAvailable());
-  for (size_t i = 0; i < num_bands_; ++i) {
-    RTC_DCHECK_EQ(kBlockSize, buffer_[i].size());
-    RTC_DCHECK_EQ(kBlockSize, (*block)[i].size());
-    (*block)[i].clear();
-    (*block)[i].insert((*block)[i].begin(), buffer_[i].begin(),
-                       buffer_[i].end());
-    buffer_[i].clear();
-  }
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/aec3/frame_blocker.h b/modules/audio_processing/aec3/frame_blocker.h
deleted file mode 100644
index d7cfd09..0000000
--- a/modules/audio_processing/aec3/frame_blocker.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- *  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_PROCESSING_AEC3_FRAME_BLOCKER_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_AEC3_FRAME_BLOCKER_H_
-
-#include <stddef.h>
-#include <vector>
-
-#include "webrtc/api/array_view.h"
-#include "webrtc/modules/audio_processing/aec3/aec3_common.h"
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace webrtc {
-
-// Class for producing 64 sample multiband blocks from frames consisting of 1 or
-// 2 subframes of 80 samples.
-class FrameBlocker {
- public:
-  explicit FrameBlocker(size_t num_bands);
-  ~FrameBlocker();
-  // Inserts one 80 sample multiband subframe from the multiband frame and
-  // extracts one 64 sample multiband block.
-  void InsertSubFrameAndExtractBlock(
-      const std::vector<rtc::ArrayView<float>>& sub_frame,
-      std::vector<std::vector<float>>* block);
-  // Reports whether a multiband block of 64 samples is available for
-  // extraction.
-  bool IsBlockAvailable() const;
-  // Extracts a multiband block of 64 samples.
-  void ExtractBlock(std::vector<std::vector<float>>* block);
-
- private:
-  const size_t num_bands_;
-  std::vector<std::vector<float>> buffer_;
-
-  RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(FrameBlocker);
-};
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_AEC3_FRAME_BLOCKER_H_
diff --git a/modules/audio_processing/aec3/frame_blocker_unittest.cc b/modules/audio_processing/aec3/frame_blocker_unittest.cc
deleted file mode 100644
index 217615c..0000000
--- a/modules/audio_processing/aec3/frame_blocker_unittest.cc
+++ /dev/null
@@ -1,341 +0,0 @@
-/*
- *  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_processing/aec3/frame_blocker.h"
-
-#include <sstream>
-#include <string>
-#include <vector>
-
-#include "webrtc/modules/audio_processing/aec3/aec3_common.h"
-#include "webrtc/modules/audio_processing/aec3/block_framer.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-namespace {
-
-float ComputeSampleValue(size_t chunk_counter,
-                         size_t chunk_size,
-                         size_t band,
-                         size_t sample_index,
-                         int offset) {
-  float value =
-      static_cast<int>(chunk_counter * chunk_size + sample_index) + offset;
-  return value > 0 ? 5000 * band + value : 0;
-}
-
-void FillSubFrame(size_t sub_frame_counter,
-                  int offset,
-                  std::vector<std::vector<float>>* sub_frame) {
-  for (size_t k = 0; k < sub_frame->size(); ++k) {
-    for (size_t i = 0; i < (*sub_frame)[0].size(); ++i) {
-      (*sub_frame)[k][i] =
-          ComputeSampleValue(sub_frame_counter, kSubFrameLength, k, i, offset);
-    }
-  }
-}
-
-void FillSubFrameView(size_t sub_frame_counter,
-                      int offset,
-                      std::vector<std::vector<float>>* sub_frame,
-                      std::vector<rtc::ArrayView<float>>* sub_frame_view) {
-  FillSubFrame(sub_frame_counter, offset, sub_frame);
-  for (size_t k = 0; k < sub_frame_view->size(); ++k) {
-    (*sub_frame_view)[k] =
-        rtc::ArrayView<float>(&(*sub_frame)[k][0], (*sub_frame)[k].size());
-  }
-}
-
-bool VerifySubFrame(size_t sub_frame_counter,
-                    int offset,
-                    const std::vector<rtc::ArrayView<float>>& sub_frame_view) {
-  std::vector<std::vector<float>> reference_sub_frame(
-      sub_frame_view.size(), std::vector<float>(sub_frame_view[0].size(), 0.f));
-  FillSubFrame(sub_frame_counter, offset, &reference_sub_frame);
-  for (size_t k = 0; k < sub_frame_view.size(); ++k) {
-    for (size_t i = 0; i < sub_frame_view[k].size(); ++i) {
-      if (reference_sub_frame[k][i] != sub_frame_view[k][i]) {
-        return false;
-      }
-    }
-  }
-  return true;
-}
-
-bool VerifyBlock(size_t block_counter,
-                 int offset,
-                 const std::vector<std::vector<float>>& block) {
-  for (size_t k = 0; k < block.size(); ++k) {
-    for (size_t i = 0; i < block[k].size(); ++i) {
-      const float reference_value =
-          ComputeSampleValue(block_counter, kBlockSize, k, i, offset);
-      if (reference_value != block[k][i]) {
-        return false;
-      }
-    }
-  }
-  return true;
-}
-
-// Verifies that the FrameBlocker properly forms blocks out of the frames.
-void RunBlockerTest(int sample_rate_hz) {
-  constexpr size_t kNumSubFramesToProcess = 20;
-  const size_t num_bands = NumBandsForRate(sample_rate_hz);
-
-  std::vector<std::vector<float>> block(num_bands,
-                                        std::vector<float>(kBlockSize, 0.f));
-  std::vector<std::vector<float>> input_sub_frame(
-      num_bands, std::vector<float>(kSubFrameLength, 0.f));
-  std::vector<rtc::ArrayView<float>> input_sub_frame_view(num_bands);
-  FrameBlocker blocker(num_bands);
-
-  size_t block_counter = 0;
-  for (size_t sub_frame_index = 0; sub_frame_index < kNumSubFramesToProcess;
-       ++sub_frame_index) {
-    FillSubFrameView(sub_frame_index, 0, &input_sub_frame,
-                     &input_sub_frame_view);
-
-    blocker.InsertSubFrameAndExtractBlock(input_sub_frame_view, &block);
-    VerifyBlock(block_counter++, 0, block);
-
-    if ((sub_frame_index + 1) % 4 == 0) {
-      EXPECT_TRUE(blocker.IsBlockAvailable());
-    } else {
-      EXPECT_FALSE(blocker.IsBlockAvailable());
-    }
-    if (blocker.IsBlockAvailable()) {
-      blocker.ExtractBlock(&block);
-      VerifyBlock(block_counter++, 0, block);
-    }
-  }
-}
-
-// Verifies that the FrameBlocker and BlockFramer work well together and produce
-// the expected output.
-void RunBlockerAndFramerTest(int sample_rate_hz) {
-  const size_t kNumSubFramesToProcess = 20;
-  const size_t num_bands = NumBandsForRate(sample_rate_hz);
-
-  std::vector<std::vector<float>> block(num_bands,
-                                        std::vector<float>(kBlockSize, 0.f));
-  std::vector<std::vector<float>> input_sub_frame(
-      num_bands, std::vector<float>(kSubFrameLength, 0.f));
-  std::vector<std::vector<float>> output_sub_frame(
-      num_bands, std::vector<float>(kSubFrameLength, 0.f));
-  std::vector<rtc::ArrayView<float>> output_sub_frame_view(num_bands);
-  std::vector<rtc::ArrayView<float>> input_sub_frame_view(num_bands);
-  FrameBlocker blocker(num_bands);
-  BlockFramer framer(num_bands);
-
-  for (size_t sub_frame_index = 0; sub_frame_index < kNumSubFramesToProcess;
-       ++sub_frame_index) {
-    FillSubFrameView(sub_frame_index, 0, &input_sub_frame,
-                     &input_sub_frame_view);
-    FillSubFrameView(sub_frame_index, 0, &output_sub_frame,
-                     &output_sub_frame_view);
-
-    blocker.InsertSubFrameAndExtractBlock(input_sub_frame_view, &block);
-    framer.InsertBlockAndExtractSubFrame(block, &output_sub_frame_view);
-
-    if ((sub_frame_index + 1) % 4 == 0) {
-      EXPECT_TRUE(blocker.IsBlockAvailable());
-    } else {
-      EXPECT_FALSE(blocker.IsBlockAvailable());
-    }
-    if (blocker.IsBlockAvailable()) {
-      blocker.ExtractBlock(&block);
-      framer.InsertBlock(block);
-    }
-    EXPECT_TRUE(VerifySubFrame(sub_frame_index, -64, output_sub_frame_view));
-  }
-}
-
-#if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
-// Verifies that the FrameBlocker crashes if the InsertSubFrameAndExtractBlock
-// method is called for inputs with the wrong number of bands or band lengths.
-void RunWronglySizedInsertAndExtractParametersTest(int sample_rate_hz,
-                                                   size_t num_block_bands,
-                                                   size_t block_length,
-                                                   size_t num_sub_frame_bands,
-                                                   size_t sub_frame_length) {
-  const size_t correct_num_bands = NumBandsForRate(sample_rate_hz);
-
-  std::vector<std::vector<float>> block(num_block_bands,
-                                        std::vector<float>(block_length, 0.f));
-  std::vector<std::vector<float>> input_sub_frame(
-      num_sub_frame_bands, std::vector<float>(sub_frame_length, 0.f));
-  std::vector<rtc::ArrayView<float>> input_sub_frame_view(
-      input_sub_frame.size());
-  FillSubFrameView(0, 0, &input_sub_frame, &input_sub_frame_view);
-  FrameBlocker blocker(correct_num_bands);
-  EXPECT_DEATH(
-      blocker.InsertSubFrameAndExtractBlock(input_sub_frame_view, &block), "");
-}
-
-// Verifies that the FrameBlocker crashes if the ExtractBlock method is called
-// for inputs with the wrong number of bands or band lengths.
-void RunWronglySizedExtractParameterTest(int sample_rate_hz,
-                                         size_t num_block_bands,
-                                         size_t block_length) {
-  const size_t correct_num_bands = NumBandsForRate(sample_rate_hz);
-
-  std::vector<std::vector<float>> correct_block(
-      correct_num_bands, std::vector<float>(kBlockSize, 0.f));
-  std::vector<std::vector<float>> wrong_block(
-      num_block_bands, std::vector<float>(block_length, 0.f));
-  std::vector<std::vector<float>> input_sub_frame(
-      correct_num_bands, std::vector<float>(kSubFrameLength, 0.f));
-  std::vector<rtc::ArrayView<float>> input_sub_frame_view(
-      input_sub_frame.size());
-  FillSubFrameView(0, 0, &input_sub_frame, &input_sub_frame_view);
-  FrameBlocker blocker(correct_num_bands);
-  blocker.InsertSubFrameAndExtractBlock(input_sub_frame_view, &correct_block);
-  blocker.InsertSubFrameAndExtractBlock(input_sub_frame_view, &correct_block);
-  blocker.InsertSubFrameAndExtractBlock(input_sub_frame_view, &correct_block);
-  blocker.InsertSubFrameAndExtractBlock(input_sub_frame_view, &correct_block);
-
-  EXPECT_DEATH(blocker.ExtractBlock(&wrong_block), "");
-}
-
-// Verifies that the FrameBlocker crashes if the ExtractBlock method is called
-// after a wrong number of previous InsertSubFrameAndExtractBlock method calls
-// have been made.
-void RunWrongExtractOrderTest(int sample_rate_hz,
-                              size_t num_preceeding_api_calls) {
-  const size_t correct_num_bands = NumBandsForRate(sample_rate_hz);
-
-  std::vector<std::vector<float>> block(correct_num_bands,
-                                        std::vector<float>(kBlockSize, 0.f));
-  std::vector<std::vector<float>> input_sub_frame(
-      correct_num_bands, std::vector<float>(kSubFrameLength, 0.f));
-  std::vector<rtc::ArrayView<float>> input_sub_frame_view(
-      input_sub_frame.size());
-  FillSubFrameView(0, 0, &input_sub_frame, &input_sub_frame_view);
-  FrameBlocker blocker(correct_num_bands);
-  for (size_t k = 0; k < num_preceeding_api_calls; ++k) {
-    blocker.InsertSubFrameAndExtractBlock(input_sub_frame_view, &block);
-  }
-
-  EXPECT_DEATH(blocker.ExtractBlock(&block), "");
-}
-#endif
-
-std::string ProduceDebugText(int sample_rate_hz) {
-  std::ostringstream ss;
-  ss << "Sample rate: " << sample_rate_hz;
-  return ss.str();
-}
-
-}  // namespace
-
-#if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
-TEST(FrameBlocker, WrongNumberOfBandsInBlockForInsertSubFrameAndExtractBlock) {
-  for (auto rate : {8000, 16000, 32000, 48000}) {
-    SCOPED_TRACE(ProduceDebugText(rate));
-    const size_t correct_num_bands = NumBandsForRate(rate);
-    const size_t wrong_num_bands = (correct_num_bands % 3) + 1;
-    RunWronglySizedInsertAndExtractParametersTest(
-        rate, wrong_num_bands, kBlockSize, correct_num_bands, kSubFrameLength);
-  }
-}
-
-TEST(FrameBlocker,
-     WrongNumberOfBandsInSubFrameForInsertSubFrameAndExtractBlock) {
-  for (auto rate : {8000, 16000, 32000, 48000}) {
-    SCOPED_TRACE(ProduceDebugText(rate));
-    const size_t correct_num_bands = NumBandsForRate(rate);
-    const size_t wrong_num_bands = (correct_num_bands % 3) + 1;
-    RunWronglySizedInsertAndExtractParametersTest(
-        rate, correct_num_bands, kBlockSize, wrong_num_bands, kSubFrameLength);
-  }
-}
-
-TEST(FrameBlocker,
-     WrongNumberOfSamplesInBlockForInsertSubFrameAndExtractBlock) {
-  for (auto rate : {8000, 16000, 32000, 48000}) {
-    SCOPED_TRACE(ProduceDebugText(rate));
-    const size_t correct_num_bands = NumBandsForRate(rate);
-    RunWronglySizedInsertAndExtractParametersTest(
-        rate, correct_num_bands, kBlockSize - 1, correct_num_bands,
-        kSubFrameLength);
-  }
-}
-
-TEST(FrameBlocker,
-     WrongNumberOfSamplesInSubFrameForInsertSubFrameAndExtractBlock) {
-  for (auto rate : {8000, 16000, 32000, 48000}) {
-    SCOPED_TRACE(ProduceDebugText(rate));
-    const size_t correct_num_bands = NumBandsForRate(rate);
-    RunWronglySizedInsertAndExtractParametersTest(rate, correct_num_bands,
-                                                  kBlockSize, correct_num_bands,
-                                                  kSubFrameLength - 1);
-  }
-}
-
-TEST(FrameBlocker, WrongNumberOfBandsInBlockForExtractBlock) {
-  for (auto rate : {8000, 16000, 32000, 48000}) {
-    SCOPED_TRACE(ProduceDebugText(rate));
-    const size_t correct_num_bands = NumBandsForRate(rate);
-    const size_t wrong_num_bands = (correct_num_bands % 3) + 1;
-    RunWronglySizedExtractParameterTest(rate, wrong_num_bands, kBlockSize);
-  }
-}
-
-TEST(FrameBlocker, WrongNumberOfSamplesInBlockForExtractBlock) {
-  for (auto rate : {8000, 16000, 32000, 48000}) {
-    SCOPED_TRACE(ProduceDebugText(rate));
-    const size_t correct_num_bands = NumBandsForRate(rate);
-    RunWronglySizedExtractParameterTest(rate, correct_num_bands,
-                                        kBlockSize - 1);
-  }
-}
-
-TEST(FrameBlocker, WrongNumberOfPreceedingApiCallsForExtractBlock) {
-  for (auto rate : {8000, 16000, 32000, 48000}) {
-    for (size_t num_calls = 0; num_calls < 4; ++num_calls) {
-      std::ostringstream ss;
-      ss << "Sample rate: " << rate;
-      ss << ", Num preceeding InsertSubFrameAndExtractBlock calls: "
-         << num_calls;
-
-      SCOPED_TRACE(ss.str());
-      RunWrongExtractOrderTest(rate, num_calls);
-    }
-  }
-}
-
-// Verifiers that the verification for null sub_frame pointer works.
-TEST(FrameBlocker, NullBlockParameter) {
-  std::vector<std::vector<float>> sub_frame(
-      1, std::vector<float>(kSubFrameLength, 0.f));
-  std::vector<rtc::ArrayView<float>> sub_frame_view(sub_frame.size());
-  FillSubFrameView(0, 0, &sub_frame, &sub_frame_view);
-  EXPECT_DEATH(
-      FrameBlocker(1).InsertSubFrameAndExtractBlock(sub_frame_view, nullptr),
-      "");
-}
-
-#endif
-
-TEST(FrameBlocker, BlockBitexactness) {
-  for (auto rate : {8000, 16000, 32000, 48000}) {
-    SCOPED_TRACE(ProduceDebugText(rate));
-    RunBlockerTest(rate);
-  }
-}
-
-TEST(FrameBlocker, BlockerAndFramer) {
-  for (auto rate : {8000, 16000, 32000, 48000}) {
-    SCOPED_TRACE(ProduceDebugText(rate));
-    RunBlockerAndFramerTest(rate);
-  }
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/aec3/main_filter_update_gain.cc b/modules/audio_processing/aec3/main_filter_update_gain.cc
deleted file mode 100644
index 3d5154d..0000000
--- a/modules/audio_processing/aec3/main_filter_update_gain.cc
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- *  Copyright (c) 2017 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_processing/aec3/main_filter_update_gain.h"
-
-#include <algorithm>
-#include <functional>
-
-#include "webrtc/modules/audio_processing/aec3/aec3_common.h"
-#include "webrtc/modules/audio_processing/logging/apm_data_dumper.h"
-#include "webrtc/rtc_base/atomicops.h"
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-namespace {
-
-constexpr float kHErrorInitial = 10000.f;
-constexpr int kPoorExcitationCounterInitial = 1000;
-
-}  // namespace
-
-int MainFilterUpdateGain::instance_count_ = 0;
-
-MainFilterUpdateGain::MainFilterUpdateGain()
-    : data_dumper_(
-          new ApmDataDumper(rtc::AtomicOps::Increment(&instance_count_))),
-      poor_excitation_counter_(kPoorExcitationCounterInitial) {
-  H_error_.fill(kHErrorInitial);
-}
-
-MainFilterUpdateGain::~MainFilterUpdateGain() {}
-
-void MainFilterUpdateGain::HandleEchoPathChange() {
-  H_error_.fill(kHErrorInitial);
-  poor_excitation_counter_ = kPoorExcitationCounterInitial;
-  call_counter_ = 0;
-}
-
-void MainFilterUpdateGain::Compute(
-    const RenderBuffer& render_buffer,
-    const RenderSignalAnalyzer& render_signal_analyzer,
-    const SubtractorOutput& subtractor_output,
-    const AdaptiveFirFilter& filter,
-    bool saturated_capture_signal,
-    FftData* gain_fft) {
-  RTC_DCHECK(gain_fft);
-  // Introducing shorter notation to improve readability.
-  const FftData& E_main = subtractor_output.E_main;
-  const auto& E2_main = subtractor_output.E2_main;
-  const auto& E2_shadow = subtractor_output.E2_shadow;
-  FftData* G = gain_fft;
-  const size_t size_partitions = filter.SizePartitions();
-  const auto& X2 = render_buffer.SpectralSum(size_partitions);
-  const auto& erl = filter.Erl();
-
-  ++call_counter_;
-
-  if (render_signal_analyzer.PoorSignalExcitation()) {
-    poor_excitation_counter_ = 0;
-  }
-
-  // Do not update the filter if the render is not sufficiently excited.
-  if (++poor_excitation_counter_ < size_partitions ||
-      saturated_capture_signal || call_counter_ <= size_partitions) {
-    G->re.fill(0.f);
-    G->im.fill(0.f);
-  } else {
-    // Corresponds to WGN of power -39 dBFS.
-    constexpr float kNoiseGatePower = 220075344.f;
-    std::array<float, kFftLengthBy2Plus1> mu;
-    // mu = H_error / (0.5* H_error* X2 + n * E2).
-    for (size_t k = 0; k < kFftLengthBy2Plus1; ++k) {
-      mu[k] = X2[k] > kNoiseGatePower
-                  ? H_error_[k] / (0.5f * H_error_[k] * X2[k] +
-                                   size_partitions * E2_main[k])
-                  : 0.f;
-    }
-
-    // Avoid updating the filter close to narrow bands in the render signals.
-    render_signal_analyzer.MaskRegionsAroundNarrowBands(&mu);
-
-    // H_error = H_error - 0.5 * mu * X2 * H_error.
-    for (size_t k = 0; k < H_error_.size(); ++k) {
-      H_error_[k] -= 0.5f * mu[k] * X2[k] * H_error_[k];
-    }
-
-    // G = mu * E.
-    std::transform(mu.begin(), mu.end(), E_main.re.begin(), G->re.begin(),
-                   std::multiplies<float>());
-    std::transform(mu.begin(), mu.end(), E_main.im.begin(), G->im.begin(),
-                   std::multiplies<float>());
-  }
-
-  // H_error = H_error + factor * erl.
-  std::array<float, kFftLengthBy2Plus1> H_error_increase;
-  constexpr float kErlScaleAccurate = 1.f / 100.0f;
-  constexpr float kErlScaleInaccurate = 1.f / 60.0f;
-  std::transform(E2_shadow.begin(), E2_shadow.end(), E2_main.begin(),
-                 H_error_increase.begin(), [&](float a, float b) {
-                   return a >= b ? kErlScaleAccurate : kErlScaleInaccurate;
-                 });
-  std::transform(erl.begin(), erl.end(), H_error_increase.begin(),
-                 H_error_increase.begin(), std::multiplies<float>());
-  std::transform(H_error_.begin(), H_error_.end(), H_error_increase.begin(),
-                 H_error_.begin(),
-                 [&](float a, float b) { return std::max(a + b, 0.1f); });
-
-  data_dumper_->DumpRaw("aec3_main_gain_H_error", H_error_);
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/aec3/main_filter_update_gain.h b/modules/audio_processing/aec3/main_filter_update_gain.h
deleted file mode 100644
index 5818a10..0000000
--- a/modules/audio_processing/aec3/main_filter_update_gain.h
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- *  Copyright (c) 2017 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_PROCESSING_AEC3_MAIN_FILTER_UPDATE_GAIN_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_AEC3_MAIN_FILTER_UPDATE_GAIN_H_
-
-#include <memory>
-#include <vector>
-
-#include "webrtc/modules/audio_processing/aec3/adaptive_fir_filter.h"
-#include "webrtc/modules/audio_processing/aec3/aec3_common.h"
-#include "webrtc/modules/audio_processing/aec3/render_buffer.h"
-#include "webrtc/modules/audio_processing/aec3/render_signal_analyzer.h"
-#include "webrtc/modules/audio_processing/aec3/subtractor_output.h"
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace webrtc {
-
-class ApmDataDumper;
-
-// Provides functionality for computing the adaptive gain for the main filter.
-class MainFilterUpdateGain {
- public:
-  MainFilterUpdateGain();
-  ~MainFilterUpdateGain();
-
-  // Takes action in the case of a known echo path change.
-  void HandleEchoPathChange();
-
-  // Computes the gain.
-  void Compute(const RenderBuffer& render_buffer,
-               const RenderSignalAnalyzer& render_signal_analyzer,
-               const SubtractorOutput& subtractor_output,
-               const AdaptiveFirFilter& filter,
-               bool saturated_capture_signal,
-               FftData* gain_fft);
-
- private:
-  static int instance_count_;
-  std::unique_ptr<ApmDataDumper> data_dumper_;
-  std::array<float, kFftLengthBy2Plus1> H_error_;
-  size_t poor_excitation_counter_;
-  size_t call_counter_ = 0;
-  RTC_DISALLOW_COPY_AND_ASSIGN(MainFilterUpdateGain);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_AEC3_MAIN_FILTER_UPDATE_GAIN_H_
diff --git a/modules/audio_processing/aec3/main_filter_update_gain_unittest.cc b/modules/audio_processing/aec3/main_filter_update_gain_unittest.cc
deleted file mode 100644
index cbd62b5..0000000
--- a/modules/audio_processing/aec3/main_filter_update_gain_unittest.cc
+++ /dev/null
@@ -1,292 +0,0 @@
-/*
- *  Copyright (c) 2017 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_processing/aec3/main_filter_update_gain.h"
-
-#include <algorithm>
-#include <numeric>
-#include <string>
-
-#include "webrtc/modules/audio_processing/aec3/adaptive_fir_filter.h"
-#include "webrtc/modules/audio_processing/aec3/aec_state.h"
-#include "webrtc/modules/audio_processing/aec3/render_buffer.h"
-#include "webrtc/modules/audio_processing/aec3/render_signal_analyzer.h"
-#include "webrtc/modules/audio_processing/aec3/shadow_filter_update_gain.h"
-#include "webrtc/modules/audio_processing/aec3/subtractor_output.h"
-#include "webrtc/modules/audio_processing/logging/apm_data_dumper.h"
-#include "webrtc/modules/audio_processing/test/echo_canceller_test_tools.h"
-#include "webrtc/rtc_base/random.h"
-#include "webrtc/rtc_base/safe_minmax.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-namespace {
-
-// Method for performing the simulations needed to test the main filter update
-// gain functionality.
-void RunFilterUpdateTest(int num_blocks_to_process,
-                         size_t delay_samples,
-                         const std::vector<int>& blocks_with_echo_path_changes,
-                         const std::vector<int>& blocks_with_saturation,
-                         bool use_silent_render_in_second_half,
-                         std::array<float, kBlockSize>* e_last_block,
-                         std::array<float, kBlockSize>* y_last_block,
-                         FftData* G_last_block) {
-  ApmDataDumper data_dumper(42);
-  AdaptiveFirFilter main_filter(9, DetectOptimization(), &data_dumper);
-  AdaptiveFirFilter shadow_filter(9, DetectOptimization(), &data_dumper);
-  Aec3Fft fft;
-  RenderBuffer render_buffer(
-      Aec3Optimization::kNone, 3, main_filter.SizePartitions(),
-      std::vector<size_t>(1, main_filter.SizePartitions()));
-  std::array<float, kBlockSize> x_old;
-  x_old.fill(0.f);
-  ShadowFilterUpdateGain shadow_gain;
-  MainFilterUpdateGain main_gain;
-  Random random_generator(42U);
-  std::vector<std::vector<float>> x(3, std::vector<float>(kBlockSize, 0.f));
-  std::vector<float> y(kBlockSize, 0.f);
-  AecState aec_state(AudioProcessing::Config::EchoCanceller3{});
-  RenderSignalAnalyzer render_signal_analyzer;
-  std::array<float, kFftLength> s_scratch;
-  std::array<float, kBlockSize> s;
-  FftData S;
-  FftData G;
-  SubtractorOutput output;
-  output.Reset();
-  FftData& E_main = output.E_main;
-  FftData E_shadow;
-  std::array<float, kFftLengthBy2Plus1> Y2;
-  std::array<float, kFftLengthBy2Plus1>& E2_main = output.E2_main;
-  std::array<float, kBlockSize>& e_main = output.e_main;
-  std::array<float, kBlockSize>& e_shadow = output.e_shadow;
-  Y2.fill(0.f);
-
-  constexpr float kScale = 1.0f / kFftLengthBy2;
-
-  DelayBuffer<float> delay_buffer(delay_samples);
-  for (int k = 0; k < num_blocks_to_process; ++k) {
-    // Handle echo path changes.
-    if (std::find(blocks_with_echo_path_changes.begin(),
-                  blocks_with_echo_path_changes.end(),
-                  k) != blocks_with_echo_path_changes.end()) {
-      main_filter.HandleEchoPathChange();
-    }
-
-    // Handle saturation.
-    const bool saturation =
-        std::find(blocks_with_saturation.begin(), blocks_with_saturation.end(),
-                  k) != blocks_with_saturation.end();
-
-    // Create the render signal.
-    if (use_silent_render_in_second_half && k > num_blocks_to_process / 2) {
-      std::fill(x[0].begin(), x[0].end(), 0.f);
-    } else {
-      RandomizeSampleVector(&random_generator, x[0]);
-    }
-    delay_buffer.Delay(x[0], y);
-    render_buffer.Insert(x);
-    render_signal_analyzer.Update(render_buffer, aec_state.FilterDelay());
-
-    // Apply the main filter.
-    main_filter.Filter(render_buffer, &S);
-    fft.Ifft(S, &s_scratch);
-    std::transform(y.begin(), y.end(), s_scratch.begin() + kFftLengthBy2,
-                   e_main.begin(),
-                   [&](float a, float b) { return a - b * kScale; });
-    std::for_each(e_main.begin(), e_main.end(),
-                  [](float& a) { a = rtc::SafeClamp(a, -32768.f, 32767.f); });
-    fft.ZeroPaddedFft(e_main, &E_main);
-    for (size_t k = 0; k < kBlockSize; ++k) {
-      s[k] = kScale * s_scratch[k + kFftLengthBy2];
-    }
-
-    // Apply the shadow filter.
-    shadow_filter.Filter(render_buffer, &S);
-    fft.Ifft(S, &s_scratch);
-    std::transform(y.begin(), y.end(), s_scratch.begin() + kFftLengthBy2,
-                   e_shadow.begin(),
-                   [&](float a, float b) { return a - b * kScale; });
-    std::for_each(e_shadow.begin(), e_shadow.end(),
-                  [](float& a) { a = rtc::SafeClamp(a, -32768.f, 32767.f); });
-    fft.ZeroPaddedFft(e_shadow, &E_shadow);
-
-    // Compute spectra for future use.
-    E_main.Spectrum(Aec3Optimization::kNone, &output.E2_main);
-    E_shadow.Spectrum(Aec3Optimization::kNone, &output.E2_shadow);
-
-    // Adapt the shadow filter.
-    shadow_gain.Compute(render_buffer, render_signal_analyzer, E_shadow,
-                        shadow_filter.SizePartitions(), saturation, &G);
-    shadow_filter.Adapt(render_buffer, G);
-
-    // Adapt the main filter
-    main_gain.Compute(render_buffer, render_signal_analyzer, output,
-                      main_filter, saturation, &G);
-    main_filter.Adapt(render_buffer, G);
-
-    // Update the delay.
-    aec_state.HandleEchoPathChange(EchoPathVariability(false, false));
-    aec_state.Update(main_filter.FilterFrequencyResponse(),
-                     main_filter.FilterImpulseResponse(),
-                     rtc::Optional<size_t>(), render_buffer, E2_main, Y2, x[0],
-                     s, false);
-  }
-
-  std::copy(e_main.begin(), e_main.end(), e_last_block->begin());
-  std::copy(y.begin(), y.end(), y_last_block->begin());
-  std::copy(G.re.begin(), G.re.end(), G_last_block->re.begin());
-  std::copy(G.im.begin(), G.im.end(), G_last_block->im.begin());
-}
-
-std::string ProduceDebugText(size_t delay) {
-  std::ostringstream ss;
-  ss << "Delay: " << delay;
-  return ss.str();
-}
-
-}  // namespace
-
-#if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
-
-// Verifies that the check for non-null output gain parameter works.
-TEST(MainFilterUpdateGain, NullDataOutputGain) {
-  ApmDataDumper data_dumper(42);
-  AdaptiveFirFilter filter(9, DetectOptimization(), &data_dumper);
-  RenderBuffer render_buffer(Aec3Optimization::kNone, 3,
-                             filter.SizePartitions(),
-                             std::vector<size_t>(1, filter.SizePartitions()));
-  RenderSignalAnalyzer analyzer;
-  SubtractorOutput output;
-  MainFilterUpdateGain gain;
-  EXPECT_DEATH(
-      gain.Compute(render_buffer, analyzer, output, filter, false, nullptr),
-      "");
-}
-
-#endif
-
-// Verifies that the gain formed causes the filter using it to converge.
-TEST(MainFilterUpdateGain, GainCausesFilterToConverge) {
-  std::vector<int> blocks_with_echo_path_changes;
-  std::vector<int> blocks_with_saturation;
-  for (size_t delay_samples : {0, 64, 150, 200, 301}) {
-    SCOPED_TRACE(ProduceDebugText(delay_samples));
-
-    std::array<float, kBlockSize> e;
-    std::array<float, kBlockSize> y;
-    FftData G;
-
-    RunFilterUpdateTest(500, delay_samples, blocks_with_echo_path_changes,
-                        blocks_with_saturation, false, &e, &y, &G);
-
-    // Verify that the main filter is able to perform well.
-    EXPECT_LT(1000 * std::inner_product(e.begin(), e.end(), e.begin(), 0.f),
-              std::inner_product(y.begin(), y.end(), y.begin(), 0.f));
-  }
-}
-
-// Verifies that the magnitude of the gain on average decreases for a
-// persistently exciting signal.
-TEST(MainFilterUpdateGain, DecreasingGain) {
-  std::vector<int> blocks_with_echo_path_changes;
-  std::vector<int> blocks_with_saturation;
-
-  std::array<float, kBlockSize> e;
-  std::array<float, kBlockSize> y;
-  FftData G_a;
-  FftData G_b;
-  FftData G_c;
-  std::array<float, kFftLengthBy2Plus1> G_a_power;
-  std::array<float, kFftLengthBy2Plus1> G_b_power;
-  std::array<float, kFftLengthBy2Plus1> G_c_power;
-
-  RunFilterUpdateTest(100, 65, blocks_with_echo_path_changes,
-                      blocks_with_saturation, false, &e, &y, &G_a);
-  RunFilterUpdateTest(200, 65, blocks_with_echo_path_changes,
-                      blocks_with_saturation, false, &e, &y, &G_b);
-  RunFilterUpdateTest(300, 65, blocks_with_echo_path_changes,
-                      blocks_with_saturation, false, &e, &y, &G_c);
-
-  G_a.Spectrum(Aec3Optimization::kNone, &G_a_power);
-  G_b.Spectrum(Aec3Optimization::kNone, &G_b_power);
-  G_c.Spectrum(Aec3Optimization::kNone, &G_c_power);
-
-  EXPECT_GT(std::accumulate(G_a_power.begin(), G_a_power.end(), 0.),
-            std::accumulate(G_b_power.begin(), G_b_power.end(), 0.));
-
-  EXPECT_GT(std::accumulate(G_b_power.begin(), G_b_power.end(), 0.),
-            std::accumulate(G_c_power.begin(), G_c_power.end(), 0.));
-}
-
-// Verifies that the gain is zero when there is saturation and that the internal
-// error estimates cause the gain to increase after a period of saturation.
-TEST(MainFilterUpdateGain, SaturationBehavior) {
-  std::vector<int> blocks_with_echo_path_changes;
-  std::vector<int> blocks_with_saturation;
-  for (int k = 99; k < 200; ++k) {
-    blocks_with_saturation.push_back(k);
-  }
-
-  std::array<float, kBlockSize> e;
-  std::array<float, kBlockSize> y;
-  FftData G_a;
-  FftData G_b;
-  FftData G_a_ref;
-  G_a_ref.re.fill(0.f);
-  G_a_ref.im.fill(0.f);
-
-  std::array<float, kFftLengthBy2Plus1> G_a_power;
-  std::array<float, kFftLengthBy2Plus1> G_b_power;
-
-  RunFilterUpdateTest(100, 65, blocks_with_echo_path_changes,
-                      blocks_with_saturation, false, &e, &y, &G_a);
-
-  EXPECT_EQ(G_a_ref.re, G_a.re);
-  EXPECT_EQ(G_a_ref.im, G_a.im);
-
-  RunFilterUpdateTest(99, 65, blocks_with_echo_path_changes,
-                      blocks_with_saturation, false, &e, &y, &G_a);
-  RunFilterUpdateTest(201, 65, blocks_with_echo_path_changes,
-                      blocks_with_saturation, false, &e, &y, &G_b);
-
-  G_a.Spectrum(Aec3Optimization::kNone, &G_a_power);
-  G_b.Spectrum(Aec3Optimization::kNone, &G_b_power);
-
-  EXPECT_LT(std::accumulate(G_a_power.begin(), G_a_power.end(), 0.),
-            std::accumulate(G_b_power.begin(), G_b_power.end(), 0.));
-}
-
-// Verifies that the gain increases after an echo path change.
-TEST(MainFilterUpdateGain, EchoPathChangeBehavior) {
-  std::vector<int> blocks_with_echo_path_changes;
-  std::vector<int> blocks_with_saturation;
-  blocks_with_echo_path_changes.push_back(99);
-
-  std::array<float, kBlockSize> e;
-  std::array<float, kBlockSize> y;
-  FftData G_a;
-  FftData G_b;
-  std::array<float, kFftLengthBy2Plus1> G_a_power;
-  std::array<float, kFftLengthBy2Plus1> G_b_power;
-
-  RunFilterUpdateTest(99, 65, blocks_with_echo_path_changes,
-                      blocks_with_saturation, false, &e, &y, &G_a);
-  RunFilterUpdateTest(100, 65, blocks_with_echo_path_changes,
-                      blocks_with_saturation, false, &e, &y, &G_b);
-
-  G_a.Spectrum(Aec3Optimization::kNone, &G_a_power);
-  G_b.Spectrum(Aec3Optimization::kNone, &G_b_power);
-
-  EXPECT_LT(std::accumulate(G_a_power.begin(), G_a_power.end(), 0.),
-            std::accumulate(G_b_power.begin(), G_b_power.end(), 0.));
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/aec3/matched_filter.cc b/modules/audio_processing/aec3/matched_filter.cc
deleted file mode 100644
index 5414cfc..0000000
--- a/modules/audio_processing/aec3/matched_filter.cc
+++ /dev/null
@@ -1,401 +0,0 @@
-/*
- *  Copyright (c) 2017 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_processing/aec3/matched_filter.h"
-
-#if defined(WEBRTC_HAS_NEON)
-#include <arm_neon.h>
-#endif
-#include "webrtc/typedefs.h"
-#if defined(WEBRTC_ARCH_X86_FAMILY)
-#include <emmintrin.h>
-#endif
-#include <algorithm>
-#include <numeric>
-
-#include "webrtc/modules/audio_processing/include/audio_processing.h"
-#include "webrtc/modules/audio_processing/logging/apm_data_dumper.h"
-
-namespace webrtc {
-namespace aec3 {
-
-#if defined(WEBRTC_HAS_NEON)
-
-void MatchedFilterCore_NEON(size_t x_start_index,
-                            float x2_sum_threshold,
-                            rtc::ArrayView<const float> x,
-                            rtc::ArrayView<const float> y,
-                            rtc::ArrayView<float> h,
-                            bool* filters_updated,
-                            float* error_sum) {
-  const int h_size = static_cast<int>(h.size());
-  const int x_size = static_cast<int>(x.size());
-  RTC_DCHECK_EQ(0, h_size % 4);
-
-  // Process for all samples in the sub-block.
-  for (size_t i = 0; i < kSubBlockSize; ++i) {
-    // Apply the matched filter as filter * x, and compute x * x.
-
-    RTC_DCHECK_GT(x_size, x_start_index);
-    const float* x_p = &x[x_start_index];
-    const float* h_p = &h[0];
-
-    // Initialize values for the accumulation.
-    float32x4_t s_128 = vdupq_n_f32(0);
-    float32x4_t x2_sum_128 = vdupq_n_f32(0);
-    float x2_sum = 0.f;
-    float s = 0;
-
-    // Compute loop chunk sizes until, and after, the wraparound of the circular
-    // buffer for x.
-    const int chunk1 =
-        std::min(h_size, static_cast<int>(x_size - x_start_index));
-
-    // Perform the loop in two chunks.
-    const int chunk2 = h_size - chunk1;
-    for (int limit : {chunk1, chunk2}) {
-      // Perform 128 bit vector operations.
-      const int limit_by_4 = limit >> 2;
-      for (int k = limit_by_4; k > 0; --k, h_p += 4, x_p += 4) {
-        // Load the data into 128 bit vectors.
-        const float32x4_t x_k = vld1q_f32(x_p);
-        const float32x4_t h_k = vld1q_f32(h_p);
-        // Compute and accumulate x * x and h * x.
-        x2_sum_128 = vmlaq_f32(x2_sum_128, x_k, x_k);
-        s_128 = vmlaq_f32(s_128, h_k, x_k);
-      }
-
-      // Perform non-vector operations for any remaining items.
-      for (int k = limit - limit_by_4 * 4; k > 0; --k, ++h_p, ++x_p) {
-        const float x_k = *x_p;
-        x2_sum += x_k * x_k;
-        s += *h_p * x_k;
-      }
-
-      x_p = &x[0];
-    }
-
-    // Combine the accumulated vector and scalar values.
-    float* v = reinterpret_cast<float*>(&x2_sum_128);
-    x2_sum += v[0] + v[1] + v[2] + v[3];
-    v = reinterpret_cast<float*>(&s_128);
-    s += v[0] + v[1] + v[2] + v[3];
-
-    // Compute the matched filter error.
-    const float e = std::min(32767.f, std::max(-32768.f, y[i] - s));
-    *error_sum += e * e;
-
-    // Update the matched filter estimate in an NLMS manner.
-    if (x2_sum > x2_sum_threshold) {
-      RTC_DCHECK_LT(0.f, x2_sum);
-      const float alpha = 0.7f * e / x2_sum;
-      const float32x4_t alpha_128 = vmovq_n_f32(alpha);
-
-      // filter = filter + 0.7 * (y - filter * x) / x * x.
-      float* h_p = &h[0];
-      x_p = &x[x_start_index];
-
-      // Perform the loop in two chunks.
-      for (int limit : {chunk1, chunk2}) {
-        // Perform 128 bit vector operations.
-        const int limit_by_4 = limit >> 2;
-        for (int k = limit_by_4; k > 0; --k, h_p += 4, x_p += 4) {
-          // Load the data into 128 bit vectors.
-          float32x4_t h_k = vld1q_f32(h_p);
-          const float32x4_t x_k = vld1q_f32(x_p);
-          // Compute h = h + alpha * x.
-          h_k = vmlaq_f32(h_k, alpha_128, x_k);
-
-          // Store the result.
-          vst1q_f32(h_p, h_k);
-        }
-
-        // Perform non-vector operations for any remaining items.
-        for (int k = limit - limit_by_4 * 4; k > 0; --k, ++h_p, ++x_p) {
-          *h_p += alpha * *x_p;
-        }
-
-        x_p = &x[0];
-      }
-
-      *filters_updated = true;
-    }
-
-    x_start_index = x_start_index > 0 ? x_start_index - 1 : x_size - 1;
-  }
-}
-
-#endif
-
-#if defined(WEBRTC_ARCH_X86_FAMILY)
-
-void MatchedFilterCore_SSE2(size_t x_start_index,
-                            float x2_sum_threshold,
-                            rtc::ArrayView<const float> x,
-                            rtc::ArrayView<const float> y,
-                            rtc::ArrayView<float> h,
-                            bool* filters_updated,
-                            float* error_sum) {
-  const int h_size = static_cast<int>(h.size());
-  const int x_size = static_cast<int>(x.size());
-  RTC_DCHECK_EQ(0, h_size % 4);
-
-  // Process for all samples in the sub-block.
-  for (size_t i = 0; i < kSubBlockSize; ++i) {
-    // Apply the matched filter as filter * x, and compute x * x.
-
-    RTC_DCHECK_GT(x_size, x_start_index);
-    const float* x_p = &x[x_start_index];
-    const float* h_p = &h[0];
-
-    // Initialize values for the accumulation.
-    __m128 s_128 = _mm_set1_ps(0);
-    __m128 x2_sum_128 = _mm_set1_ps(0);
-    float x2_sum = 0.f;
-    float s = 0;
-
-    // Compute loop chunk sizes until, and after, the wraparound of the circular
-    // buffer for x.
-    const int chunk1 =
-        std::min(h_size, static_cast<int>(x_size - x_start_index));
-
-    // Perform the loop in two chunks.
-    const int chunk2 = h_size - chunk1;
-    for (int limit : {chunk1, chunk2}) {
-      // Perform 128 bit vector operations.
-      const int limit_by_4 = limit >> 2;
-      for (int k = limit_by_4; k > 0; --k, h_p += 4, x_p += 4) {
-        // Load the data into 128 bit vectors.
-        const __m128 x_k = _mm_loadu_ps(x_p);
-        const __m128 h_k = _mm_loadu_ps(h_p);
-        const __m128 xx = _mm_mul_ps(x_k, x_k);
-        // Compute and accumulate x * x and h * x.
-        x2_sum_128 = _mm_add_ps(x2_sum_128, xx);
-        const __m128 hx = _mm_mul_ps(h_k, x_k);
-        s_128 = _mm_add_ps(s_128, hx);
-      }
-
-      // Perform non-vector operations for any remaining items.
-      for (int k = limit - limit_by_4 * 4; k > 0; --k, ++h_p, ++x_p) {
-        const float x_k = *x_p;
-        x2_sum += x_k * x_k;
-        s += *h_p * x_k;
-      }
-
-      x_p = &x[0];
-    }
-
-    // Combine the accumulated vector and scalar values.
-    float* v = reinterpret_cast<float*>(&x2_sum_128);
-    x2_sum += v[0] + v[1] + v[2] + v[3];
-    v = reinterpret_cast<float*>(&s_128);
-    s += v[0] + v[1] + v[2] + v[3];
-
-    // Compute the matched filter error.
-    const float e = std::min(32767.f, std::max(-32768.f, y[i] - s));
-    *error_sum += e * e;
-
-    // Update the matched filter estimate in an NLMS manner.
-    if (x2_sum > x2_sum_threshold) {
-      RTC_DCHECK_LT(0.f, x2_sum);
-      const float alpha = 0.7f * e / x2_sum;
-      const __m128 alpha_128 = _mm_set1_ps(alpha);
-
-      // filter = filter + 0.7 * (y - filter * x) / x * x.
-      float* h_p = &h[0];
-      x_p = &x[x_start_index];
-
-      // Perform the loop in two chunks.
-      for (int limit : {chunk1, chunk2}) {
-        // Perform 128 bit vector operations.
-        const int limit_by_4 = limit >> 2;
-        for (int k = limit_by_4; k > 0; --k, h_p += 4, x_p += 4) {
-          // Load the data into 128 bit vectors.
-          __m128 h_k = _mm_loadu_ps(h_p);
-          const __m128 x_k = _mm_loadu_ps(x_p);
-
-          // Compute h = h + alpha * x.
-          const __m128 alpha_x = _mm_mul_ps(alpha_128, x_k);
-          h_k = _mm_add_ps(h_k, alpha_x);
-
-          // Store the result.
-          _mm_storeu_ps(h_p, h_k);
-        }
-
-        // Perform non-vector operations for any remaining items.
-        for (int k = limit - limit_by_4 * 4; k > 0; --k, ++h_p, ++x_p) {
-          *h_p += alpha * *x_p;
-        }
-
-        x_p = &x[0];
-      }
-
-      *filters_updated = true;
-    }
-
-    x_start_index = x_start_index > 0 ? x_start_index - 1 : x_size - 1;
-  }
-}
-#endif
-
-void MatchedFilterCore(size_t x_start_index,
-                       float x2_sum_threshold,
-                       rtc::ArrayView<const float> x,
-                       rtc::ArrayView<const float> y,
-                       rtc::ArrayView<float> h,
-                       bool* filters_updated,
-                       float* error_sum) {
-  // Process for all samples in the sub-block.
-  for (size_t i = 0; i < kSubBlockSize; ++i) {
-    // Apply the matched filter as filter * x, and compute x * x.
-    float x2_sum = 0.f;
-    float s = 0;
-    size_t x_index = x_start_index;
-    for (size_t k = 0; k < h.size(); ++k) {
-      x2_sum += x[x_index] * x[x_index];
-      s += h[k] * x[x_index];
-      x_index = x_index < (x.size() - 1) ? x_index + 1 : 0;
-    }
-
-    // Compute the matched filter error.
-    const float e = std::min(32767.f, std::max(-32768.f, y[i] - s));
-    (*error_sum) += e * e;
-
-    // Update the matched filter estimate in an NLMS manner.
-    if (x2_sum > x2_sum_threshold) {
-      RTC_DCHECK_LT(0.f, x2_sum);
-      const float alpha = 0.7f * e / x2_sum;
-
-      // filter = filter + 0.7 * (y - filter * x) / x * x.
-      size_t x_index = x_start_index;
-      for (size_t k = 0; k < h.size(); ++k) {
-        h[k] += alpha * x[x_index];
-        x_index = x_index < (x.size() - 1) ? x_index + 1 : 0;
-      }
-      *filters_updated = true;
-    }
-
-    x_start_index = x_start_index > 0 ? x_start_index - 1 : x.size() - 1;
-  }
-}
-
-}  // namespace aec3
-
-MatchedFilter::MatchedFilter(ApmDataDumper* data_dumper,
-                             Aec3Optimization optimization,
-                             size_t window_size_sub_blocks,
-                             int num_matched_filters,
-                             size_t alignment_shift_sub_blocks,
-                             float excitation_limit)
-    : data_dumper_(data_dumper),
-      optimization_(optimization),
-      filter_intra_lag_shift_(alignment_shift_sub_blocks * kSubBlockSize),
-      filters_(num_matched_filters,
-               std::vector<float>(window_size_sub_blocks * kSubBlockSize, 0.f)),
-      lag_estimates_(num_matched_filters),
-      excitation_limit_(excitation_limit) {
-  RTC_DCHECK(data_dumper);
-  RTC_DCHECK_LT(0, window_size_sub_blocks);
-}
-
-MatchedFilter::~MatchedFilter() = default;
-
-void MatchedFilter::Reset() {
-  for (auto& f : filters_) {
-    std::fill(f.begin(), f.end(), 0.f);
-  }
-
-  for (auto& l : lag_estimates_) {
-    l = MatchedFilter::LagEstimate();
-  }
-}
-
-void MatchedFilter::Update(const DownsampledRenderBuffer& render_buffer,
-                           const std::array<float, kSubBlockSize>& capture) {
-  const std::array<float, kSubBlockSize>& y = capture;
-
-  const float x2_sum_threshold =
-      filters_[0].size() * excitation_limit_ * excitation_limit_;
-
-  // Apply all matched filters.
-  size_t alignment_shift = 0;
-  for (size_t n = 0; n < filters_.size(); ++n) {
-    float error_sum = 0.f;
-    bool filters_updated = false;
-
-    size_t x_start_index =
-        (render_buffer.position + alignment_shift + kSubBlockSize - 1) %
-        render_buffer.buffer.size();
-
-    switch (optimization_) {
-#if defined(WEBRTC_ARCH_X86_FAMILY)
-      case Aec3Optimization::kSse2:
-        aec3::MatchedFilterCore_SSE2(x_start_index, x2_sum_threshold,
-                                     render_buffer.buffer, y, filters_[n],
-                                     &filters_updated, &error_sum);
-        break;
-#endif
-#if defined(WEBRTC_HAS_NEON)
-      case Aec3Optimization::kNeon:
-        aec3::MatchedFilterCore_NEON(x_start_index, x2_sum_threshold,
-                                     render_buffer.buffer, y, filters_[n],
-                                     &filters_updated, &error_sum);
-        break;
-#endif
-      default:
-        aec3::MatchedFilterCore(x_start_index, x2_sum_threshold,
-                                render_buffer.buffer, y, filters_[n],
-                                &filters_updated, &error_sum);
-    }
-
-    // Compute anchor for the matched filter error.
-    const float error_sum_anchor =
-        std::inner_product(y.begin(), y.end(), y.begin(), 0.f);
-
-    // Estimate the lag in the matched filter as the distance to the portion in
-    // the filter that contributes the most to the matched filter output. This
-    // is detected as the peak of the matched filter.
-    const size_t lag_estimate = std::distance(
-        filters_[n].begin(),
-        std::max_element(
-            filters_[n].begin(), filters_[n].end(),
-            [](float a, float b) -> bool { return a * a < b * b; }));
-
-    // Update the lag estimates for the matched filter.
-    const float kMatchingFilterThreshold = 0.1f;
-    lag_estimates_[n] = LagEstimate(
-        error_sum_anchor - error_sum,
-        (lag_estimate > 2 && lag_estimate < (filters_[n].size() - 10) &&
-         error_sum < kMatchingFilterThreshold * error_sum_anchor),
-        lag_estimate + alignment_shift, filters_updated);
-
-    // TODO(peah): Remove once development of EchoCanceller3 is fully done.
-    RTC_DCHECK_EQ(4, filters_.size());
-    switch (n) {
-      case 0:
-        data_dumper_->DumpRaw("aec3_correlator_0_h", filters_[0]);
-        break;
-      case 1:
-        data_dumper_->DumpRaw("aec3_correlator_1_h", filters_[1]);
-        break;
-      case 2:
-        data_dumper_->DumpRaw("aec3_correlator_2_h", filters_[2]);
-        break;
-      case 3:
-        data_dumper_->DumpRaw("aec3_correlator_3_h", filters_[3]);
-        break;
-      default:
-        RTC_DCHECK(false);
-    }
-
-    alignment_shift += filter_intra_lag_shift_;
-  }
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/aec3/matched_filter.h b/modules/audio_processing/aec3/matched_filter.h
deleted file mode 100644
index a200af1..0000000
--- a/modules/audio_processing/aec3/matched_filter.h
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- *  Copyright (c) 2017 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_PROCESSING_AEC3_MATCHED_FILTER_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_AEC3_MATCHED_FILTER_H_
-
-#include <array>
-#include <memory>
-#include <vector>
-
-#include "webrtc/api/optional.h"
-#include "webrtc/modules/audio_processing/aec3/aec3_common.h"
-#include "webrtc/modules/audio_processing/aec3/downsampled_render_buffer.h"
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace webrtc {
-namespace aec3 {
-
-#if defined(WEBRTC_HAS_NEON)
-
-// Filter core for the matched filter that is optimized for NEON.
-void MatchedFilterCore_NEON(size_t x_start_index,
-                            float x2_sum_threshold,
-                            rtc::ArrayView<const float> x,
-                            rtc::ArrayView<const float> y,
-                            rtc::ArrayView<float> h,
-                            bool* filters_updated,
-                            float* error_sum);
-
-#endif
-
-#if defined(WEBRTC_ARCH_X86_FAMILY)
-
-// Filter core for the matched filter that is optimized for SSE2.
-void MatchedFilterCore_SSE2(size_t x_start_index,
-                            float x2_sum_threshold,
-                            rtc::ArrayView<const float> x,
-                            rtc::ArrayView<const float> y,
-                            rtc::ArrayView<float> h,
-                            bool* filters_updated,
-                            float* error_sum);
-
-#endif
-
-// Filter core for the matched filter.
-void MatchedFilterCore(size_t x_start_index,
-                       float x2_sum_threshold,
-                       rtc::ArrayView<const float> x,
-                       rtc::ArrayView<const float> y,
-                       rtc::ArrayView<float> h,
-                       bool* filters_updated,
-                       float* error_sum);
-
-}  // namespace aec3
-
-class ApmDataDumper;
-
-// Produces recursively updated cross-correlation estimates for several signal
-// shifts where the intra-shift spacing is uniform.
-class MatchedFilter {
- public:
-  // Stores properties for the lag estimate corresponding to a particular signal
-  // shift.
-  struct LagEstimate {
-    LagEstimate() = default;
-    LagEstimate(float accuracy, bool reliable, size_t lag, bool updated)
-        : accuracy(accuracy), reliable(reliable), lag(lag), updated(updated) {}
-
-    float accuracy = 0.f;
-    bool reliable = false;
-    size_t lag = 0;
-    bool updated = false;
-  };
-
-  MatchedFilter(ApmDataDumper* data_dumper,
-                Aec3Optimization optimization,
-                size_t window_size_sub_blocks,
-                int num_matched_filters,
-                size_t alignment_shift_sub_blocks,
-                float excitation_limit);
-
-  ~MatchedFilter();
-
-  // Updates the correlation with the values in the capture buffer.
-  void Update(const DownsampledRenderBuffer& render_buffer,
-              const std::array<float, kSubBlockSize>& capture);
-
-  // Resets the matched filter.
-  void Reset();
-
-  // Returns the current lag estimates.
-  rtc::ArrayView<const MatchedFilter::LagEstimate> GetLagEstimates() const {
-    return lag_estimates_;
-  }
-
-  // Returns the number of lag estimates produced using the shifted signals.
-  size_t NumLagEstimates() const { return filters_.size(); }
-
- private:
-  ApmDataDumper* const data_dumper_;
-  const Aec3Optimization optimization_;
-  const size_t filter_intra_lag_shift_;
-  std::vector<std::vector<float>> filters_;
-  std::vector<LagEstimate> lag_estimates_;
-  const float excitation_limit_;
-
-  RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(MatchedFilter);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_AEC3_MATCHED_FILTER_H_
diff --git a/modules/audio_processing/aec3/matched_filter_lag_aggregator.cc b/modules/audio_processing/aec3/matched_filter_lag_aggregator.cc
deleted file mode 100644
index 4a0a935..0000000
--- a/modules/audio_processing/aec3/matched_filter_lag_aggregator.cc
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- *  Copyright (c) 2017 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_processing/aec3/matched_filter_lag_aggregator.h"
-
-#include "webrtc/modules/audio_processing/logging/apm_data_dumper.h"
-
-namespace webrtc {
-
-MatchedFilterLagAggregator::MatchedFilterLagAggregator(
-    ApmDataDumper* data_dumper,
-    size_t num_lag_estimates)
-    : data_dumper_(data_dumper), lag_updates_in_a_row_(num_lag_estimates, 0) {
-  RTC_DCHECK(data_dumper);
-  RTC_DCHECK_LT(0, num_lag_estimates);
-}
-
-MatchedFilterLagAggregator::~MatchedFilterLagAggregator() = default;
-
-void MatchedFilterLagAggregator::Reset() {
-  candidate_ = 0;
-  candidate_counter_ = 0;
-  std::fill(lag_updates_in_a_row_.begin(), lag_updates_in_a_row_.end(), 0.f);
-}
-
-rtc::Optional<size_t> MatchedFilterLagAggregator::Aggregate(
-    rtc::ArrayView<const MatchedFilter::LagEstimate> lag_estimates) {
-  RTC_DCHECK_EQ(lag_updates_in_a_row_.size(), lag_estimates.size());
-
-  // Count the number of lag updates in a row to ensure that only stable lags
-  // are taken into account.
-  for (size_t k = 0; k < lag_estimates.size(); ++k) {
-    lag_updates_in_a_row_[k] =
-        lag_estimates[k].updated ? lag_updates_in_a_row_[k] + 1 : 0;
-  }
-
-  // If available, choose the strongest lag estimate as the best one.
-  int best_lag_estimate_index = -1;
-  for (size_t k = 0; k < lag_estimates.size(); ++k) {
-    if (lag_updates_in_a_row_[k] > 10 && lag_estimates[k].reliable &&
-        (best_lag_estimate_index == -1 ||
-         lag_estimates[k].accuracy >
-             lag_estimates[best_lag_estimate_index].accuracy)) {
-      best_lag_estimate_index = k;
-    }
-  }
-
-  // TODO(peah): Remove this logging once all development is done.
-  data_dumper_->DumpRaw("aec3_echo_path_delay_estimator_best_index",
-                        best_lag_estimate_index);
-
-  // Require the same lag to be detected 10 times in a row before considering
-  // it reliable.
-  if (best_lag_estimate_index >= 0) {
-    candidate_counter_ =
-        (candidate_ == lag_estimates[best_lag_estimate_index].lag)
-            ? candidate_counter_ + 1
-            : 0;
-    candidate_ = lag_estimates[best_lag_estimate_index].lag;
-  }
-
-  return candidate_counter_ >= 15 ? rtc::Optional<size_t>(candidate_)
-                                  : rtc::Optional<size_t>();
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/aec3/matched_filter_lag_aggregator.h b/modules/audio_processing/aec3/matched_filter_lag_aggregator.h
deleted file mode 100644
index d490f0d..0000000
--- a/modules/audio_processing/aec3/matched_filter_lag_aggregator.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- *  Copyright (c) 2017 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_PROCESSING_AEC3_MATCHED_FILTER_LAG_AGGREGATOR_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_AEC3_MATCHED_FILTER_LAG_AGGREGATOR_H_
-
-#include <vector>
-
-#include "webrtc/api/optional.h"
-#include "webrtc/modules/audio_processing/aec3/matched_filter.h"
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace webrtc {
-
-class ApmDataDumper;
-
-// Aggregates lag estimates produced by the MatchedFilter class into a single
-// reliable combined lag estimate.
-class MatchedFilterLagAggregator {
- public:
-  MatchedFilterLagAggregator(ApmDataDumper* data_dumper,
-                             size_t num_lag_estimates);
-  ~MatchedFilterLagAggregator();
-
-  // Resets the aggregator.
-  void Reset();
-
-  // Aggregates the provided lag estimates.
-  rtc::Optional<size_t> Aggregate(
-      rtc::ArrayView<const MatchedFilter::LagEstimate> lag_estimates);
-
- private:
-  ApmDataDumper* const data_dumper_;
-  std::vector<size_t> lag_updates_in_a_row_;
-  size_t candidate_ = 0;
-  size_t candidate_counter_ = 0;
-
-  RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(MatchedFilterLagAggregator);
-};
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_AEC3_MATCHED_FILTER_LAG_AGGREGATOR_H_
diff --git a/modules/audio_processing/aec3/matched_filter_lag_aggregator_unittest.cc b/modules/audio_processing/aec3/matched_filter_lag_aggregator_unittest.cc
deleted file mode 100644
index 0144bf4..0000000
--- a/modules/audio_processing/aec3/matched_filter_lag_aggregator_unittest.cc
+++ /dev/null
@@ -1,192 +0,0 @@
-/*
- *  Copyright (c) 2017 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_processing/aec3/matched_filter_lag_aggregator.h"
-
-#include <sstream>
-#include <string>
-#include <vector>
-
-#include "webrtc/api/array_view.h"
-#include "webrtc/modules/audio_processing/aec3/aec3_common.h"
-#include "webrtc/modules/audio_processing/logging/apm_data_dumper.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-namespace {
-
-void VerifyNoAggregateOutputForRepeatedLagAggregation(
-    size_t num_repetitions,
-    rtc::ArrayView<const MatchedFilter::LagEstimate> lag_estimates,
-    MatchedFilterLagAggregator* aggregator) {
-  for (size_t k = 0; k < num_repetitions; ++k) {
-    EXPECT_FALSE(aggregator->Aggregate(lag_estimates));
-  }
-}
-
-constexpr size_t kThresholdForRequiredLagUpdatesInARow = 10;
-constexpr size_t kThresholdForRequiredIdenticalLagAggregates = 15;
-
-}  // namespace
-
-// Verifies that the most accurate lag estimate is chosen.
-TEST(MatchedFilterLagAggregator, MostAccurateLagChosen) {
-  constexpr size_t kArtificialLag1 = 5;
-  constexpr size_t kArtificialLag2 = 10;
-  ApmDataDumper data_dumper(0);
-  std::vector<MatchedFilter::LagEstimate> lag_estimates(2);
-  MatchedFilterLagAggregator aggregator(&data_dumper, lag_estimates.size());
-  lag_estimates[0] =
-      MatchedFilter::LagEstimate(1.f, true, kArtificialLag1, true);
-  lag_estimates[1] =
-      MatchedFilter::LagEstimate(0.5f, true, kArtificialLag2, true);
-
-  VerifyNoAggregateOutputForRepeatedLagAggregation(
-      kThresholdForRequiredLagUpdatesInARow +
-          kThresholdForRequiredIdenticalLagAggregates,
-      lag_estimates, &aggregator);
-  rtc::Optional<size_t> aggregated_lag = aggregator.Aggregate(lag_estimates);
-  EXPECT_TRUE(aggregated_lag);
-  EXPECT_EQ(kArtificialLag1, *aggregated_lag);
-
-  lag_estimates[0] =
-      MatchedFilter::LagEstimate(0.5f, true, kArtificialLag1, true);
-  lag_estimates[1] =
-      MatchedFilter::LagEstimate(1.f, true, kArtificialLag2, true);
-
-  VerifyNoAggregateOutputForRepeatedLagAggregation(
-      kThresholdForRequiredIdenticalLagAggregates, lag_estimates, &aggregator);
-  aggregated_lag = aggregator.Aggregate(lag_estimates);
-  EXPECT_TRUE(aggregated_lag);
-  EXPECT_EQ(kArtificialLag2, *aggregated_lag);
-}
-
-// Verifies that varying lag estimates causes lag estimates to not be deemed
-// reliable.
-TEST(MatchedFilterLagAggregator,
-     LagEstimateInvarianceRequiredForAggregatedLag) {
-  constexpr size_t kArtificialLag1 = 5;
-  constexpr size_t kArtificialLag2 = 10;
-  ApmDataDumper data_dumper(0);
-  std::vector<MatchedFilter::LagEstimate> lag_estimates(1);
-  MatchedFilterLagAggregator aggregator(&data_dumper, lag_estimates.size());
-  lag_estimates[0] =
-      MatchedFilter::LagEstimate(1.f, true, kArtificialLag1, true);
-  VerifyNoAggregateOutputForRepeatedLagAggregation(
-      kThresholdForRequiredLagUpdatesInARow +
-          kThresholdForRequiredIdenticalLagAggregates,
-      lag_estimates, &aggregator);
-  rtc::Optional<size_t> aggregated_lag = aggregator.Aggregate(lag_estimates);
-  EXPECT_TRUE(aggregated_lag);
-  EXPECT_EQ(kArtificialLag1, *aggregated_lag);
-
-  lag_estimates[0] =
-      MatchedFilter::LagEstimate(1.f, true, kArtificialLag2, true);
-
-  VerifyNoAggregateOutputForRepeatedLagAggregation(
-      kThresholdForRequiredIdenticalLagAggregates, lag_estimates, &aggregator);
-  aggregated_lag = aggregator.Aggregate(lag_estimates);
-  EXPECT_TRUE(aggregated_lag);
-  EXPECT_EQ(kArtificialLag2, *aggregated_lag);
-}
-
-// Verifies that lag estimate updates are required to produce an updated lag
-// aggregate.
-TEST(MatchedFilterLagAggregator, LagEstimateUpdatesRequiredForAggregatedLag) {
-  constexpr size_t kArtificialLag1 = 5;
-  constexpr size_t kArtificialLag2 = 10;
-  ApmDataDumper data_dumper(0);
-  std::vector<MatchedFilter::LagEstimate> lag_estimates(1);
-  MatchedFilterLagAggregator aggregator(&data_dumper, lag_estimates.size());
-  lag_estimates[0] =
-      MatchedFilter::LagEstimate(1.f, true, kArtificialLag1, true);
-  VerifyNoAggregateOutputForRepeatedLagAggregation(
-      kThresholdForRequiredLagUpdatesInARow +
-          kThresholdForRequiredIdenticalLagAggregates,
-      lag_estimates, &aggregator);
-  rtc::Optional<size_t> aggregated_lag = aggregator.Aggregate(lag_estimates);
-  EXPECT_TRUE(aggregated_lag);
-  EXPECT_EQ(kArtificialLag1, *aggregated_lag);
-
-  lag_estimates[0] =
-      MatchedFilter::LagEstimate(1.f, true, kArtificialLag2, false);
-
-  for (size_t k = 0; k < kThresholdForRequiredLagUpdatesInARow +
-                             kThresholdForRequiredIdenticalLagAggregates + 1;
-       ++k) {
-    aggregated_lag = aggregator.Aggregate(lag_estimates);
-    EXPECT_TRUE(aggregated_lag);
-    EXPECT_EQ(kArtificialLag1, *aggregated_lag);
-  }
-
-  lag_estimates[0] =
-      MatchedFilter::LagEstimate(1.f, true, kArtificialLag2, true);
-  for (size_t k = 0; k < kThresholdForRequiredLagUpdatesInARow; ++k) {
-    aggregated_lag = aggregator.Aggregate(lag_estimates);
-    EXPECT_TRUE(aggregated_lag);
-    EXPECT_EQ(kArtificialLag1, *aggregated_lag);
-  }
-
-  VerifyNoAggregateOutputForRepeatedLagAggregation(
-      kThresholdForRequiredIdenticalLagAggregates, lag_estimates, &aggregator);
-
-  aggregated_lag = aggregator.Aggregate(lag_estimates);
-  EXPECT_TRUE(aggregated_lag);
-  EXPECT_EQ(kArtificialLag2, *aggregated_lag);
-}
-
-// Verifies that an aggregated lag is persistent if the lag estimates do not
-// change and that an aggregated lag is not produced without gaining lag
-// estimate confidence.
-TEST(MatchedFilterLagAggregator, PersistentAggregatedLag) {
-  constexpr size_t kArtificialLag = 5;
-  ApmDataDumper data_dumper(0);
-  std::vector<MatchedFilter::LagEstimate> lag_estimates(1);
-  MatchedFilterLagAggregator aggregator(&data_dumper, lag_estimates.size());
-  lag_estimates[0] =
-      MatchedFilter::LagEstimate(1.f, true, kArtificialLag, true);
-  VerifyNoAggregateOutputForRepeatedLagAggregation(
-      kThresholdForRequiredLagUpdatesInARow +
-          kThresholdForRequiredIdenticalLagAggregates,
-      lag_estimates, &aggregator);
-  rtc::Optional<size_t> aggregated_lag = aggregator.Aggregate(lag_estimates);
-  EXPECT_TRUE(aggregated_lag);
-  EXPECT_EQ(kArtificialLag, *aggregated_lag);
-
-  aggregated_lag = aggregator.Aggregate(lag_estimates);
-  EXPECT_TRUE(aggregated_lag);
-  EXPECT_EQ(kArtificialLag, *aggregated_lag);
-}
-
-#if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
-
-// Verifies the check for correct number of lag estimates.
-TEST(MatchedFilterLagAggregator, IncorrectNumberOfLagEstimates) {
-  ApmDataDumper data_dumper(0);
-  MatchedFilterLagAggregator aggregator(&data_dumper, 1);
-  std::vector<MatchedFilter::LagEstimate> lag_estimates(2);
-
-  EXPECT_DEATH(aggregator.Aggregate(lag_estimates), "");
-}
-
-// Verifies the check for non-zero number of lag estimates.
-TEST(MatchedFilterLagAggregator, NonZeroLagEstimates) {
-  ApmDataDumper data_dumper(0);
-  EXPECT_DEATH(MatchedFilterLagAggregator(&data_dumper, 0), "");
-}
-
-// Verifies the check for non-null data dumper.
-TEST(MatchedFilterLagAggregator, NullDataDumper) {
-  EXPECT_DEATH(MatchedFilterLagAggregator(nullptr, 1), "");
-}
-
-#endif
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/aec3/matched_filter_unittest.cc b/modules/audio_processing/aec3/matched_filter_unittest.cc
deleted file mode 100644
index 47ff353..0000000
--- a/modules/audio_processing/aec3/matched_filter_unittest.cc
+++ /dev/null
@@ -1,298 +0,0 @@
-/*
- *  Copyright (c) 2017 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_processing/aec3/matched_filter.h"
-
-#include "webrtc/typedefs.h"
-#if defined(WEBRTC_ARCH_X86_FAMILY)
-#include <emmintrin.h>
-#endif
-#include <algorithm>
-#include <sstream>
-#include <string>
-
-#include "webrtc/modules/audio_processing/aec3/aec3_common.h"
-#include "webrtc/modules/audio_processing/aec3/decimator_by_4.h"
-#include "webrtc/modules/audio_processing/aec3/render_delay_buffer.h"
-#include "webrtc/modules/audio_processing/logging/apm_data_dumper.h"
-#include "webrtc/modules/audio_processing/test/echo_canceller_test_tools.h"
-#include "webrtc/rtc_base/random.h"
-#include "webrtc/system_wrappers/include/cpu_features_wrapper.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-namespace aec3 {
-namespace {
-
-std::string ProduceDebugText(size_t delay) {
-  std::ostringstream ss;
-  ss << "Delay: " << delay;
-  return ss.str();
-}
-
-constexpr size_t kWindowSizeSubBlocks = 32;
-constexpr size_t kAlignmentShiftSubBlocks = kWindowSizeSubBlocks * 3 / 4;
-constexpr size_t kNumMatchedFilters = 4;
-
-}  // namespace
-
-#if defined(WEBRTC_HAS_NEON)
-// Verifies that the optimized methods for NEON are similar to their reference
-// counterparts.
-TEST(MatchedFilter, TestNeonOptimizations) {
-  Random random_generator(42U);
-  std::vector<float> x(2000);
-  RandomizeSampleVector(&random_generator, x);
-  std::vector<float> y(kSubBlockSize);
-  std::vector<float> h_NEON(512);
-  std::vector<float> h(512);
-  int x_index = 0;
-  for (int k = 0; k < 1000; ++k) {
-    RandomizeSampleVector(&random_generator, y);
-
-    bool filters_updated = false;
-    float error_sum = 0.f;
-    bool filters_updated_NEON = false;
-    float error_sum_NEON = 0.f;
-
-    MatchedFilterCore_NEON(x_index, h.size() * 150.f * 150.f, x, y, h_NEON,
-                           &filters_updated_NEON, &error_sum_NEON);
-
-    MatchedFilterCore(x_index, h.size() * 150.f * 150.f, x, y, h,
-                      &filters_updated, &error_sum);
-
-    EXPECT_EQ(filters_updated, filters_updated_NEON);
-    EXPECT_NEAR(error_sum, error_sum_NEON, error_sum / 100000.f);
-
-    for (size_t j = 0; j < h.size(); ++j) {
-      EXPECT_NEAR(h[j], h_NEON[j], 0.00001f);
-    }
-
-    x_index = (x_index + kSubBlockSize) % x.size();
-  }
-}
-#endif
-
-#if defined(WEBRTC_ARCH_X86_FAMILY)
-// Verifies that the optimized methods for SSE2 are bitexact to their reference
-// counterparts.
-TEST(MatchedFilter, TestSse2Optimizations) {
-  bool use_sse2 = (WebRtc_GetCPUInfo(kSSE2) != 0);
-  if (use_sse2) {
-    Random random_generator(42U);
-    std::vector<float> x(2000);
-    RandomizeSampleVector(&random_generator, x);
-    std::vector<float> y(kSubBlockSize);
-    std::vector<float> h_SSE2(512);
-    std::vector<float> h(512);
-    int x_index = 0;
-    for (int k = 0; k < 1000; ++k) {
-      RandomizeSampleVector(&random_generator, y);
-
-      bool filters_updated = false;
-      float error_sum = 0.f;
-      bool filters_updated_SSE2 = false;
-      float error_sum_SSE2 = 0.f;
-
-      MatchedFilterCore_SSE2(x_index, h.size() * 150.f * 150.f, x, y, h_SSE2,
-                             &filters_updated_SSE2, &error_sum_SSE2);
-
-      MatchedFilterCore(x_index, h.size() * 150.f * 150.f, x, y, h,
-                        &filters_updated, &error_sum);
-
-      EXPECT_EQ(filters_updated, filters_updated_SSE2);
-      EXPECT_NEAR(error_sum, error_sum_SSE2, error_sum / 100000.f);
-
-      for (size_t j = 0; j < h.size(); ++j) {
-        EXPECT_NEAR(h[j], h_SSE2[j], 0.00001f);
-      }
-
-      x_index = (x_index + kSubBlockSize) % x.size();
-    }
-  }
-}
-
-#endif
-
-// Verifies that the matched filter produces proper lag estimates for
-// artificially
-// delayed signals.
-TEST(MatchedFilter, LagEstimation) {
-  Random random_generator(42U);
-  std::vector<std::vector<float>> render(3,
-                                         std::vector<float>(kBlockSize, 0.f));
-  std::array<float, kBlockSize> capture;
-  capture.fill(0.f);
-  ApmDataDumper data_dumper(0);
-  for (size_t delay_samples : {5, 64, 150, 200, 800, 1000}) {
-    SCOPED_TRACE(ProduceDebugText(delay_samples));
-    DecimatorBy4 capture_decimator;
-    DelayBuffer<float> signal_delay_buffer(4 * delay_samples);
-    MatchedFilter filter(&data_dumper, DetectOptimization(),
-                         kWindowSizeSubBlocks, kNumMatchedFilters,
-                         kAlignmentShiftSubBlocks, 150);
-    std::unique_ptr<RenderDelayBuffer> render_delay_buffer(
-        RenderDelayBuffer::Create(3));
-
-    // Analyze the correlation between render and capture.
-    for (size_t k = 0; k < (100 + delay_samples / kSubBlockSize); ++k) {
-      RandomizeSampleVector(&random_generator, render[0]);
-      signal_delay_buffer.Delay(render[0], capture);
-      render_delay_buffer->Insert(render);
-      render_delay_buffer->UpdateBuffers();
-      std::array<float, kSubBlockSize> downsampled_capture;
-      capture_decimator.Decimate(capture, downsampled_capture);
-      filter.Update(render_delay_buffer->GetDownsampledRenderBuffer(),
-                    downsampled_capture);
-    }
-
-    // Obtain the lag estimates.
-    auto lag_estimates = filter.GetLagEstimates();
-
-    // Find which lag estimate should be the most accurate.
-    rtc::Optional<size_t> expected_most_accurate_lag_estimate;
-    size_t alignment_shift_sub_blocks = 0;
-    for (size_t k = 0; k < kNumMatchedFilters; ++k) {
-      if ((alignment_shift_sub_blocks + kWindowSizeSubBlocks / 2) *
-              kSubBlockSize >
-          delay_samples) {
-        expected_most_accurate_lag_estimate = rtc::Optional<size_t>(k);
-        break;
-      }
-      alignment_shift_sub_blocks += kAlignmentShiftSubBlocks;
-    }
-    ASSERT_TRUE(expected_most_accurate_lag_estimate);
-
-    // Verify that the expected most accurate lag estimate is the most accurate
-    // estimate.
-    for (size_t k = 0; k < kNumMatchedFilters; ++k) {
-      if (k != *expected_most_accurate_lag_estimate) {
-        EXPECT_GT(lag_estimates[*expected_most_accurate_lag_estimate].accuracy,
-                  lag_estimates[k].accuracy);
-      }
-    }
-
-    // Verify that all lag estimates are updated as expected for signals
-    // containing strong noise.
-    for (auto& le : lag_estimates) {
-      EXPECT_TRUE(le.updated);
-    }
-
-    // Verify that the expected most accurate lag estimate is reliable.
-    EXPECT_TRUE(lag_estimates[*expected_most_accurate_lag_estimate].reliable);
-
-    // Verify that the expected most accurate lag estimate is correct.
-    EXPECT_EQ(delay_samples,
-              lag_estimates[*expected_most_accurate_lag_estimate].lag);
-  }
-}
-
-// Verifies that the matched filter does not produce reliable and accurate
-// estimates for uncorrelated render and capture signals.
-TEST(MatchedFilter, LagNotReliableForUncorrelatedRenderAndCapture) {
-  Random random_generator(42U);
-  std::vector<std::vector<float>> render(3,
-                                         std::vector<float>(kBlockSize, 0.f));
-  std::array<float, kSubBlockSize> capture;
-  capture.fill(0.f);
-  ApmDataDumper data_dumper(0);
-  std::unique_ptr<RenderDelayBuffer> render_delay_buffer(
-      RenderDelayBuffer::Create(3));
-  MatchedFilter filter(&data_dumper, DetectOptimization(), kWindowSizeSubBlocks,
-                       kNumMatchedFilters, kAlignmentShiftSubBlocks, 150);
-
-  // Analyze the correlation between render and capture.
-  for (size_t k = 0; k < 100; ++k) {
-    RandomizeSampleVector(&random_generator, render[0]);
-    RandomizeSampleVector(&random_generator, capture);
-    render_delay_buffer->Insert(render);
-    filter.Update(render_delay_buffer->GetDownsampledRenderBuffer(), capture);
-  }
-
-  // Obtain the lag estimates.
-  auto lag_estimates = filter.GetLagEstimates();
-  EXPECT_EQ(kNumMatchedFilters, lag_estimates.size());
-
-  // Verify that no lag estimates are reliable.
-  for (auto& le : lag_estimates) {
-    EXPECT_FALSE(le.reliable);
-  }
-}
-
-// Verifies that the matched filter does not produce updated lag estimates for
-// render signals of low level.
-TEST(MatchedFilter, LagNotUpdatedForLowLevelRender) {
-  Random random_generator(42U);
-  std::vector<std::vector<float>> render(3,
-                                         std::vector<float>(kBlockSize, 0.f));
-  std::array<float, kBlockSize> capture;
-  capture.fill(0.f);
-  ApmDataDumper data_dumper(0);
-  MatchedFilter filter(&data_dumper, DetectOptimization(), kWindowSizeSubBlocks,
-                       kNumMatchedFilters, kAlignmentShiftSubBlocks, 150);
-  std::unique_ptr<RenderDelayBuffer> render_delay_buffer(
-      RenderDelayBuffer::Create(3));
-  DecimatorBy4 capture_decimator;
-
-  // Analyze the correlation between render and capture.
-  for (size_t k = 0; k < 100; ++k) {
-    RandomizeSampleVector(&random_generator, render[0]);
-    for (auto& render_k : render[0]) {
-      render_k *= 149.f / 32767.f;
-    }
-    std::copy(render[0].begin(), render[0].end(), capture.begin());
-    std::array<float, kSubBlockSize> downsampled_capture;
-    capture_decimator.Decimate(capture, downsampled_capture);
-    filter.Update(render_delay_buffer->GetDownsampledRenderBuffer(),
-                  downsampled_capture);
-  }
-
-  // Obtain the lag estimates.
-  auto lag_estimates = filter.GetLagEstimates();
-  EXPECT_EQ(kNumMatchedFilters, lag_estimates.size());
-
-  // Verify that no lag estimates are updated and that no lag estimates are
-  // reliable.
-  for (auto& le : lag_estimates) {
-    EXPECT_FALSE(le.updated);
-    EXPECT_FALSE(le.reliable);
-  }
-}
-
-// Verifies that the correct number of lag estimates are produced for a certain
-// number of alignment shifts.
-TEST(MatchedFilter, NumberOfLagEstimates) {
-  ApmDataDumper data_dumper(0);
-  for (size_t num_matched_filters = 0; num_matched_filters < 10;
-       ++num_matched_filters) {
-    MatchedFilter filter(&data_dumper, DetectOptimization(), 32,
-                         num_matched_filters, 1, 150);
-    EXPECT_EQ(num_matched_filters, filter.GetLagEstimates().size());
-  }
-}
-
-#if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
-
-// Verifies the check for non-zero windows size.
-TEST(MatchedFilter, ZeroWindowSize) {
-  ApmDataDumper data_dumper(0);
-  EXPECT_DEATH(MatchedFilter(&data_dumper, DetectOptimization(), 0, 1, 1, 150),
-               "");
-}
-
-// Verifies the check for non-null data dumper.
-TEST(MatchedFilter, NullDataDumper) {
-  EXPECT_DEATH(MatchedFilter(nullptr, DetectOptimization(), 1, 1, 1, 150), "");
-}
-
-#endif
-
-}  // namespace aec3
-}  // namespace webrtc
diff --git a/modules/audio_processing/aec3/mock/mock_block_processor.h b/modules/audio_processing/aec3/mock/mock_block_processor.h
deleted file mode 100644
index 63ed755..0000000
--- a/modules/audio_processing/aec3/mock/mock_block_processor.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- *  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_PROCESSING_AEC3_MOCK_MOCK_BLOCK_PROCESSOR_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_AEC3_MOCK_MOCK_BLOCK_PROCESSOR_H_
-
-#include <vector>
-
-#include "webrtc/modules/audio_processing/aec3/block_processor.h"
-#include "webrtc/test/gmock.h"
-
-namespace webrtc {
-namespace test {
-
-class MockBlockProcessor : public BlockProcessor {
- public:
-  virtual ~MockBlockProcessor() {}
-
-  MOCK_METHOD3(ProcessCapture,
-               void(bool level_change,
-                    bool saturated_microphone_signal,
-                    std::vector<std::vector<float>>* capture_block));
-  MOCK_METHOD1(BufferRender,
-               void(const std::vector<std::vector<float>>& block));
-  MOCK_METHOD1(UpdateEchoLeakageStatus, void(bool leakage_detected));
-};
-
-}  // namespace test
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_AEC3_MOCK_MOCK_BLOCK_PROCESSOR_H_
diff --git a/modules/audio_processing/aec3/mock/mock_echo_remover.h b/modules/audio_processing/aec3/mock/mock_echo_remover.h
deleted file mode 100644
index 8d2aca9..0000000
--- a/modules/audio_processing/aec3/mock/mock_echo_remover.h
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- *  Copyright (c) 2017 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_PROCESSING_AEC3_MOCK_MOCK_ECHO_REMOVER_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_AEC3_MOCK_MOCK_ECHO_REMOVER_H_
-
-#include <vector>
-
-#include "webrtc/api/optional.h"
-#include "webrtc/modules/audio_processing/aec3/echo_path_variability.h"
-#include "webrtc/modules/audio_processing/aec3/echo_remover.h"
-#include "webrtc/modules/audio_processing/aec3/render_buffer.h"
-#include "webrtc/test/gmock.h"
-
-namespace webrtc {
-namespace test {
-
-class MockEchoRemover : public EchoRemover {
- public:
-  virtual ~MockEchoRemover() = default;
-
-  MOCK_METHOD5(ProcessCapture,
-               void(const rtc::Optional<size_t>& echo_path_delay_samples,
-                    const EchoPathVariability& echo_path_variability,
-                    bool capture_signal_saturation,
-                    const RenderBuffer& render_buffer,
-                    std::vector<std::vector<float>>* capture));
-
-  MOCK_METHOD1(UpdateEchoLeakageStatus, void(bool leakage_detected));
-};
-
-}  // namespace test
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_AEC3_MOCK_MOCK_ECHO_REMOVER_H_
diff --git a/modules/audio_processing/aec3/mock/mock_render_delay_buffer.h b/modules/audio_processing/aec3/mock/mock_render_delay_buffer.h
deleted file mode 100644
index 06503e9..0000000
--- a/modules/audio_processing/aec3/mock/mock_render_delay_buffer.h
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- *  Copyright (c) 2017 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_PROCESSING_AEC3_MOCK_MOCK_RENDER_DELAY_BUFFER_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_AEC3_MOCK_MOCK_RENDER_DELAY_BUFFER_H_
-
-#include <vector>
-
-#include "webrtc/modules/audio_processing/aec3/aec3_common.h"
-#include "webrtc/modules/audio_processing/aec3/downsampled_render_buffer.h"
-#include "webrtc/modules/audio_processing/aec3/render_buffer.h"
-#include "webrtc/modules/audio_processing/aec3/render_delay_buffer.h"
-#include "webrtc/test/gmock.h"
-
-namespace webrtc {
-namespace test {
-
-class MockRenderDelayBuffer : public RenderDelayBuffer {
- public:
-  explicit MockRenderDelayBuffer(int sample_rate_hz)
-      : render_buffer_(Aec3Optimization::kNone,
-                       NumBandsForRate(sample_rate_hz),
-                       kRenderDelayBufferSize,
-                       std::vector<size_t>(1, kAdaptiveFilterLength)) {
-    ON_CALL(*this, GetRenderBuffer())
-        .WillByDefault(
-            testing::Invoke(this, &MockRenderDelayBuffer::FakeGetRenderBuffer));
-    ON_CALL(*this, GetDownsampledRenderBuffer())
-        .WillByDefault(testing::Invoke(
-            this, &MockRenderDelayBuffer::FakeGetDownsampledRenderBuffer));
-  }
-  virtual ~MockRenderDelayBuffer() = default;
-
-  MOCK_METHOD0(Reset, void());
-  MOCK_METHOD1(Insert, bool(const std::vector<std::vector<float>>& block));
-  MOCK_METHOD0(UpdateBuffers, bool());
-  MOCK_METHOD1(SetDelay, void(size_t delay));
-  MOCK_CONST_METHOD0(Delay, size_t());
-  MOCK_CONST_METHOD0(MaxDelay, size_t());
-  MOCK_CONST_METHOD0(IsBlockAvailable, bool());
-  MOCK_CONST_METHOD0(GetRenderBuffer, const RenderBuffer&());
-  MOCK_CONST_METHOD0(GetDownsampledRenderBuffer,
-                     const DownsampledRenderBuffer&());
-
- private:
-  const RenderBuffer& FakeGetRenderBuffer() const { return render_buffer_; }
-  const DownsampledRenderBuffer& FakeGetDownsampledRenderBuffer() const {
-    return downsampled_render_buffer_;
-  }
-  RenderBuffer render_buffer_;
-  DownsampledRenderBuffer downsampled_render_buffer_;
-};
-
-}  // namespace test
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_AEC3_MOCK_MOCK_RENDER_DELAY_BUFFER_H_
diff --git a/modules/audio_processing/aec3/mock/mock_render_delay_controller.h b/modules/audio_processing/aec3/mock/mock_render_delay_controller.h
deleted file mode 100644
index 64daef5..0000000
--- a/modules/audio_processing/aec3/mock/mock_render_delay_controller.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- *  Copyright (c) 2017 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_PROCESSING_AEC3_MOCK_MOCK_RENDER_DELAY_CONTROLLER_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_AEC3_MOCK_MOCK_RENDER_DELAY_CONTROLLER_H_
-
-#include "webrtc/api/array_view.h"
-#include "webrtc/api/optional.h"
-#include "webrtc/modules/audio_processing/aec3/downsampled_render_buffer.h"
-#include "webrtc/modules/audio_processing/aec3/render_delay_controller.h"
-#include "webrtc/test/gmock.h"
-
-namespace webrtc {
-namespace test {
-
-class MockRenderDelayController : public RenderDelayController {
- public:
-  virtual ~MockRenderDelayController() = default;
-
-  MOCK_METHOD0(Reset, void());
-  MOCK_METHOD1(SetDelay, void(size_t render_delay));
-  MOCK_METHOD2(GetDelay,
-               size_t(const DownsampledRenderBuffer& render_buffer,
-                      rtc::ArrayView<const float> capture));
-  MOCK_CONST_METHOD0(AlignmentHeadroomSamples, rtc::Optional<size_t>());
-};
-
-}  // namespace test
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_AEC3_MOCK_MOCK_RENDER_DELAY_CONTROLLER_H_
diff --git a/modules/audio_processing/aec3/output_selector.cc b/modules/audio_processing/aec3/output_selector.cc
deleted file mode 100644
index 21e24e5..0000000
--- a/modules/audio_processing/aec3/output_selector.cc
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- *  Copyright (c) 2017 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_processing/aec3/output_selector.h"
-
-#include <algorithm>
-#include <numeric>
-
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-namespace {
-
-// Performs the transition between the signals in a smooth manner.
-void SmoothFrameTransition(bool from_y_to_e,
-                           rtc::ArrayView<const float> e,
-                           rtc::ArrayView<float> y) {
-  RTC_DCHECK_LT(0u, e.size());
-  RTC_DCHECK_EQ(y.size(), e.size());
-
-  const float change_factor = (from_y_to_e ? 1.f : -1.f) / e.size();
-  float averaging = from_y_to_e ? 0.f : 1.f;
-  for (size_t k = 0; k < e.size(); ++k) {
-    y[k] += averaging * (e[k] - y[k]);
-    averaging += change_factor;
-  }
-  RTC_DCHECK_EQ(from_y_to_e ? 1.f : 0.f, averaging);
-}
-
-}  // namespace
-
-OutputSelector::OutputSelector() = default;
-
-OutputSelector::~OutputSelector() = default;
-
-void OutputSelector::FormLinearOutput(
-    bool use_subtractor_output,
-    rtc::ArrayView<const float> subtractor_output,
-    rtc::ArrayView<float> capture) {
-  RTC_DCHECK_EQ(subtractor_output.size(), capture.size());
-  rtc::ArrayView<const float>& e_main = subtractor_output;
-  rtc::ArrayView<float> y = capture;
-
-  if (use_subtractor_output != use_subtractor_output_) {
-    use_subtractor_output_ = use_subtractor_output;
-    SmoothFrameTransition(use_subtractor_output_, e_main, y);
-  } else if (use_subtractor_output_) {
-    std::copy(e_main.begin(), e_main.end(), y.begin());
-  }
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/aec3/output_selector.h b/modules/audio_processing/aec3/output_selector.h
deleted file mode 100644
index 920280a..0000000
--- a/modules/audio_processing/aec3/output_selector.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- *  Copyright (c) 2017 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_PROCESSING_AEC3_OUTPUT_SELECTOR_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_AEC3_OUTPUT_SELECTOR_H_
-
-#include "webrtc/api/array_view.h"
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace webrtc {
-
-// Performs the selection between which of the linear aec output and the
-// microphone signal should be used as the echo suppressor output.
-class OutputSelector {
- public:
-  OutputSelector();
-  ~OutputSelector();
-
-  // Forms the most appropriate output signal.
-  void FormLinearOutput(bool use_subtractor_output,
-                        rtc::ArrayView<const float> subtractor_output,
-                        rtc::ArrayView<float> capture);
-
-  // Returns true if the linear aec output is the one used.
-  bool UseSubtractorOutput() const { return use_subtractor_output_; }
-
- private:
-  bool use_subtractor_output_ = false;
-  RTC_DISALLOW_COPY_AND_ASSIGN(OutputSelector);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_AEC3_OUTPUT_SELECTOR_H_
diff --git a/modules/audio_processing/aec3/output_selector_unittest.cc b/modules/audio_processing/aec3/output_selector_unittest.cc
deleted file mode 100644
index 717f631..0000000
--- a/modules/audio_processing/aec3/output_selector_unittest.cc
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- *  Copyright (c) 2017 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_processing/aec3/output_selector.h"
-
-#include <algorithm>
-#include <array>
-
-#include "webrtc/modules/audio_processing/aec3/aec3_common.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-// Verifies that the switching between the signals in the output works as
-// intended.
-TEST(OutputSelector, ProperSwitching) {
-  OutputSelector selector;
-
-  std::array<float, kBlockSize> y;
-  std::array<float, kBlockSize> e;
-  std::array<float, kBlockSize> e_ref;
-  std::array<float, kBlockSize> y_ref;
-  auto init_blocks = [](std::array<float, kBlockSize>* e,
-                        std::array<float, kBlockSize>* y) {
-    e->fill(10.f);
-    y->fill(20.f);
-  };
-
-  init_blocks(&e_ref, &y_ref);
-
-  init_blocks(&e, &y);
-  selector.FormLinearOutput(false, e, y);
-  EXPECT_EQ(y_ref, y);
-
-  init_blocks(&e, &y);
-  selector.FormLinearOutput(true, e, y);
-  EXPECT_NE(e_ref, y);
-  EXPECT_NE(y_ref, y);
-
-  init_blocks(&e, &y);
-  selector.FormLinearOutput(true, e, y);
-  EXPECT_EQ(e_ref, y);
-
-  init_blocks(&e, &y);
-  selector.FormLinearOutput(true, e, y);
-  EXPECT_EQ(e_ref, y);
-
-  init_blocks(&e, &y);
-  selector.FormLinearOutput(false, e, y);
-  EXPECT_NE(e_ref, y);
-  EXPECT_NE(y_ref, y);
-
-  init_blocks(&e, &y);
-  selector.FormLinearOutput(false, e, y);
-  EXPECT_EQ(y_ref, y);
-
-  init_blocks(&e, &y);
-  selector.FormLinearOutput(false, e, y);
-  EXPECT_EQ(y_ref, y);
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/aec3/render_buffer.cc b/modules/audio_processing/aec3/render_buffer.cc
deleted file mode 100644
index 2bedfcb..0000000
--- a/modules/audio_processing/aec3/render_buffer.cc
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- *  Copyright (c) 2017 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_processing/aec3/render_buffer.h"
-
-#include <algorithm>
-
-#include "webrtc/modules/audio_processing/aec3/aec3_common.h"
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-
-RenderBuffer::RenderBuffer(Aec3Optimization optimization,
-                           size_t num_bands,
-                           size_t num_partitions,
-                           const std::vector<size_t> num_ffts_for_spectral_sums)
-    : optimization_(optimization),
-      fft_buffer_(num_partitions),
-      spectrum_buffer_(num_partitions, std::array<float, kFftLengthBy2Plus1>()),
-      spectral_sums_(num_ffts_for_spectral_sums.size(),
-                     std::array<float, kFftLengthBy2Plus1>()),
-      last_block_(num_bands, std::vector<float>(kBlockSize, 0.f)),
-      fft_() {
-  // Current implementation only allows a maximum of one spectral sum lengths.
-  RTC_DCHECK_EQ(1, num_ffts_for_spectral_sums.size());
-  spectral_sums_length_ = num_ffts_for_spectral_sums[0];
-  RTC_DCHECK_GE(fft_buffer_.size(), spectral_sums_length_);
-
-  Clear();
-}
-
-RenderBuffer::~RenderBuffer() = default;
-
-void RenderBuffer::Clear() {
-  position_ = 0;
-  for (auto& sum : spectral_sums_) {
-    sum.fill(0.f);
-  }
-
-  for (auto& spectrum : spectrum_buffer_) {
-    spectrum.fill(0.f);
-  }
-
-  for (auto& fft : fft_buffer_) {
-    fft.Clear();
-  }
-
-  for (auto& b : last_block_) {
-    std::fill(b.begin(), b.end(), 0.f);
-  }
-}
-
-void RenderBuffer::Insert(const std::vector<std::vector<float>>& block) {
-  // Compute the FFT of the data in the lowest band.
-  FftData X;
-  fft_.PaddedFft(block[0], last_block_[0], &X);
-
-  // Copy the last render frame.
-  RTC_DCHECK_EQ(last_block_.size(), block.size());
-  for (size_t k = 0; k < block.size(); ++k) {
-    RTC_DCHECK_EQ(last_block_[k].size(), block[k].size());
-    std::copy(block[k].begin(), block[k].end(), last_block_[k].begin());
-  }
-
-  // Insert X into the buffer.
-  position_ = position_ > 0 ? position_ - 1 : fft_buffer_.size() - 1;
-  fft_buffer_[position_].Assign(X);
-
-  // Compute and insert the spectrum for the FFT into the spectrum buffer.
-  X.Spectrum(optimization_, &spectrum_buffer_[position_]);
-
-  // Pre-compute and cache the spectral sums.
-  std::copy(spectrum_buffer_[position_].begin(),
-            spectrum_buffer_[position_].end(), spectral_sums_[0].begin());
-  size_t position = (position_ + 1) % fft_buffer_.size();
-  for (size_t j = 1; j < spectral_sums_length_; ++j) {
-    const std::array<float, kFftLengthBy2Plus1>& spectrum =
-        spectrum_buffer_[position];
-
-    for (size_t k = 0; k < spectral_sums_[0].size(); ++k) {
-      spectral_sums_[0][k] += spectrum[k];
-    }
-
-    position = position < (fft_buffer_.size() - 1) ? position + 1 : 0;
-  }
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/aec3/render_buffer.h b/modules/audio_processing/aec3/render_buffer.h
deleted file mode 100644
index bc88767..0000000
--- a/modules/audio_processing/aec3/render_buffer.h
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- *  Copyright (c) 2017 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_PROCESSING_AEC3_RENDER_BUFFER_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_AEC3_RENDER_BUFFER_H_
-
-#include <memory>
-#include <vector>
-
-#include "webrtc/api/array_view.h"
-#include "webrtc/modules/audio_processing/aec3/aec3_fft.h"
-#include "webrtc/modules/audio_processing/aec3/fft_data.h"
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace webrtc {
-
-// Provides a buffer of the render data for the echo remover.
-class RenderBuffer {
- public:
-  // The constructor takes, besides from the other parameters, a vector
-  // containing the number of FFTs that will be included in the spectral sums in
-  // the call to SpectralSum.
-  RenderBuffer(Aec3Optimization optimization,
-               size_t num_bands,
-               size_t size,
-               const std::vector<size_t> num_ffts_for_spectral_sums);
-  ~RenderBuffer();
-
-  // Clears the buffer.
-  void Clear();
-
-  // Insert a block into the buffer.
-  void Insert(const std::vector<std::vector<float>>& block);
-
-  // Gets the last inserted block.
-  const std::vector<std::vector<float>>& MostRecentBlock() const {
-    return last_block_;
-  }
-
-  // Get the spectrum from one of the FFTs in the buffer
-  const std::array<float, kFftLengthBy2Plus1>& Spectrum(
-      size_t buffer_offset_ffts) const {
-    return spectrum_buffer_[(position_ + buffer_offset_ffts) %
-                            fft_buffer_.size()];
-  }
-
-  // Returns the sum of the spectrums for a certain number of FFTs.
-  const std::array<float, kFftLengthBy2Plus1>& SpectralSum(
-      size_t num_ffts) const {
-    RTC_DCHECK_EQ(spectral_sums_length_, num_ffts);
-    return spectral_sums_[0];
-  }
-
-  // Returns the circular buffer.
-  rtc::ArrayView<const FftData> Buffer() const { return fft_buffer_; }
-
-  // Returns the current position in the circular buffer
-  size_t Position() const { return position_; }
-
- private:
-  const Aec3Optimization optimization_;
-  std::vector<FftData> fft_buffer_;
-  std::vector<std::array<float, kFftLengthBy2Plus1>> spectrum_buffer_;
-  size_t spectral_sums_length_;
-  std::vector<std::array<float, kFftLengthBy2Plus1>> spectral_sums_;
-  size_t position_ = 0;
-  std::vector<std::vector<float>> last_block_;
-  const Aec3Fft fft_;
-  RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(RenderBuffer);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_AEC3_RENDER_BUFFER_H_
diff --git a/modules/audio_processing/aec3/render_buffer_unittest.cc b/modules/audio_processing/aec3/render_buffer_unittest.cc
deleted file mode 100644
index 2751003..0000000
--- a/modules/audio_processing/aec3/render_buffer_unittest.cc
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- *  Copyright (c) 2017 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_processing/aec3/render_buffer.h"
-
-#include <algorithm>
-#include <functional>
-#include <vector>
-
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-#if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
-
-// Verifies the check for the provided numbers of Ffts to include in the
-// spectral sum.
-TEST(RenderBuffer, TooLargeNumberOfSpectralSums) {
-  EXPECT_DEATH(
-      RenderBuffer(Aec3Optimization::kNone, 3, 1, std::vector<size_t>(2, 1)),
-      "");
-}
-
-TEST(RenderBuffer, TooSmallNumberOfSpectralSums) {
-  EXPECT_DEATH(
-      RenderBuffer(Aec3Optimization::kNone, 3, 1, std::vector<size_t>()), "");
-}
-
-// Verifies the feasibility check for the provided number of Ffts to include in
-// the spectral.
-TEST(RenderBuffer, FeasibleNumberOfFftsInSum) {
-  EXPECT_DEATH(
-      RenderBuffer(Aec3Optimization::kNone, 3, 1, std::vector<size_t>(1, 2)),
-      "");
-}
-
-#endif
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/aec3/render_delay_buffer.cc b/modules/audio_processing/aec3/render_delay_buffer.cc
deleted file mode 100644
index 73dadad..0000000
--- a/modules/audio_processing/aec3/render_delay_buffer.cc
+++ /dev/null
@@ -1,217 +0,0 @@
-/*
- *  Copyright (c) 2017 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_processing/aec3/render_delay_buffer.h"
-
-#include <string.h>
-#include <algorithm>
-
-#include "webrtc/modules/audio_processing/aec3/aec3_common.h"
-#include "webrtc/modules/audio_processing/aec3/block_processor.h"
-#include "webrtc/modules/audio_processing/aec3/decimator_by_4.h"
-#include "webrtc/modules/audio_processing/aec3/fft_data.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/logging.h"
-
-namespace webrtc {
-namespace {
-
-class ApiCallJitterBuffer {
- public:
-  explicit ApiCallJitterBuffer(size_t num_bands) {
-    buffer_.fill(std::vector<std::vector<float>>(
-        num_bands, std::vector<float>(kBlockSize, 0.f)));
-  }
-
-  ~ApiCallJitterBuffer() = default;
-
-  void Reset() {
-    size_ = 0;
-    last_insert_index_ = 0;
-  }
-
-  void Insert(const std::vector<std::vector<float>>& block) {
-    RTC_DCHECK_LT(size_, buffer_.size());
-    last_insert_index_ = (last_insert_index_ + 1) % buffer_.size();
-    RTC_DCHECK_EQ(buffer_[last_insert_index_].size(), block.size());
-    RTC_DCHECK_EQ(buffer_[last_insert_index_][0].size(), block[0].size());
-    for (size_t k = 0; k < block.size(); ++k) {
-      std::copy(block[k].begin(), block[k].end(),
-                buffer_[last_insert_index_][k].begin());
-    }
-    ++size_;
-  }
-
-  void Remove(std::vector<std::vector<float>>* block) {
-    RTC_DCHECK_LT(0, size_);
-    --size_;
-    const size_t extract_index =
-        (last_insert_index_ - size_ + buffer_.size()) % buffer_.size();
-    for (size_t k = 0; k < block->size(); ++k) {
-      std::copy(buffer_[extract_index][k].begin(),
-                buffer_[extract_index][k].end(), (*block)[k].begin());
-    }
-  }
-
-  size_t Size() const { return size_; }
-  bool Full() const { return size_ >= (buffer_.size()); }
-  bool Empty() const { return size_ == 0; }
-
- private:
-  std::array<std::vector<std::vector<float>>, kMaxApiCallsJitterBlocks> buffer_;
-  size_t size_ = 0;
-  int last_insert_index_ = 0;
-};
-
-class RenderDelayBufferImpl final : public RenderDelayBuffer {
- public:
-  explicit RenderDelayBufferImpl(size_t num_bands);
-  ~RenderDelayBufferImpl() override;
-
-  void Reset() override;
-  bool Insert(const std::vector<std::vector<float>>& block) override;
-  bool UpdateBuffers() override;
-  void SetDelay(size_t delay) override;
-  size_t Delay() const override { return delay_; }
-
-  const RenderBuffer& GetRenderBuffer() const override { return fft_buffer_; }
-
-  const DownsampledRenderBuffer& GetDownsampledRenderBuffer() const override {
-    return downsampled_render_buffer_;
-  }
-
- private:
-  const Aec3Optimization optimization_;
-  std::array<std::vector<std::vector<float>>, kRenderDelayBufferSize> buffer_;
-  size_t delay_ = 0;
-  size_t last_insert_index_ = 0;
-  RenderBuffer fft_buffer_;
-  DownsampledRenderBuffer downsampled_render_buffer_;
-  DecimatorBy4 render_decimator_;
-  ApiCallJitterBuffer api_call_jitter_buffer_;
-  const std::vector<std::vector<float>> zero_block_;
-  RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(RenderDelayBufferImpl);
-};
-
-RenderDelayBufferImpl::RenderDelayBufferImpl(size_t num_bands)
-    : optimization_(DetectOptimization()),
-      fft_buffer_(
-          optimization_,
-          num_bands,
-          std::max(kResidualEchoPowerRenderWindowSize, kAdaptiveFilterLength),
-          std::vector<size_t>(1, kAdaptiveFilterLength)),
-      api_call_jitter_buffer_(num_bands),
-      zero_block_(num_bands, std::vector<float>(kBlockSize, 0.f)) {
-  buffer_.fill(std::vector<std::vector<float>>(
-      num_bands, std::vector<float>(kBlockSize, 0.f)));
-
-  RTC_DCHECK_LT(buffer_.size(), downsampled_render_buffer_.buffer.size());
-}
-
-RenderDelayBufferImpl::~RenderDelayBufferImpl() = default;
-
-void RenderDelayBufferImpl::Reset() {
-  // Empty all data in the buffers.
-  delay_ = 0;
-  last_insert_index_ = 0;
-  downsampled_render_buffer_.position = 0;
-  downsampled_render_buffer_.buffer.fill(0.f);
-  fft_buffer_.Clear();
-  api_call_jitter_buffer_.Reset();
-  for (auto& c : buffer_) {
-    for (auto& b : c) {
-      std::fill(b.begin(), b.end(), 0.f);
-    }
-  }
-}
-
-bool RenderDelayBufferImpl::Insert(
-    const std::vector<std::vector<float>>& block) {
-  RTC_DCHECK_EQ(block.size(), buffer_[0].size());
-  RTC_DCHECK_EQ(block[0].size(), buffer_[0][0].size());
-
-  if (api_call_jitter_buffer_.Full()) {
-    // Report buffer overrun and let the caller handle the overrun.
-    return false;
-  }
-  api_call_jitter_buffer_.Insert(block);
-
-  return true;
-}
-
-bool RenderDelayBufferImpl::UpdateBuffers() {
-  bool underrun = true;
-  // Update the buffers with a new block if such is available, otherwise insert
-  // a block of silence.
-  if (api_call_jitter_buffer_.Size() > 0) {
-    last_insert_index_ = (last_insert_index_ + 1) % buffer_.size();
-    api_call_jitter_buffer_.Remove(&buffer_[last_insert_index_]);
-    underrun = false;
-  }
-
-  downsampled_render_buffer_.position =
-      (downsampled_render_buffer_.position - kSubBlockSize +
-       downsampled_render_buffer_.buffer.size()) %
-      downsampled_render_buffer_.buffer.size();
-
-  std::array<float, kSubBlockSize> render_downsampled;
-  if (underrun) {
-    render_decimator_.Decimate(zero_block_[0], render_downsampled);
-  } else {
-    render_decimator_.Decimate(buffer_[last_insert_index_][0],
-                               render_downsampled);
-  }
-  std::copy(render_downsampled.rbegin(), render_downsampled.rend(),
-            downsampled_render_buffer_.buffer.begin() +
-                downsampled_render_buffer_.position);
-
-  if (underrun) {
-    fft_buffer_.Insert(zero_block_);
-  } else {
-    fft_buffer_.Insert(buffer_[(last_insert_index_ - delay_ + buffer_.size()) %
-                               buffer_.size()]);
-  }
-  return !underrun;
-}
-
-void RenderDelayBufferImpl::SetDelay(size_t delay) {
-  if (delay_ == delay) {
-    return;
-  }
-
-  // If there is a new delay set, clear the fft buffer.
-  fft_buffer_.Clear();
-
-  if ((buffer_.size() - 1) < delay) {
-    // If the desired delay is larger than the delay buffer, shorten the delay
-    // buffer size to achieve the desired alignment with the available buffer
-    // size.
-    downsampled_render_buffer_.position =
-        (downsampled_render_buffer_.position +
-         kSubBlockSize * (delay - (buffer_.size() - 1))) %
-        downsampled_render_buffer_.buffer.size();
-
-    last_insert_index_ =
-        (last_insert_index_ - (delay - (buffer_.size() - 1)) + buffer_.size()) %
-        buffer_.size();
-    delay_ = buffer_.size() - 1;
-  } else {
-    delay_ = delay;
-  }
-}
-
-}  // namespace
-
-RenderDelayBuffer* RenderDelayBuffer::Create(size_t num_bands) {
-  return new RenderDelayBufferImpl(num_bands);
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/aec3/render_delay_buffer.h b/modules/audio_processing/aec3/render_delay_buffer.h
deleted file mode 100644
index 865a00d..0000000
--- a/modules/audio_processing/aec3/render_delay_buffer.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- *  Copyright (c) 2017 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_PROCESSING_AEC3_RENDER_DELAY_BUFFER_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_AEC3_RENDER_DELAY_BUFFER_H_
-
-#include <stddef.h>
-#include <array>
-#include <vector>
-
-#include "webrtc/api/array_view.h"
-#include "webrtc/modules/audio_processing/aec3/aec3_common.h"
-#include "webrtc/modules/audio_processing/aec3/downsampled_render_buffer.h"
-#include "webrtc/modules/audio_processing/aec3/fft_data.h"
-#include "webrtc/modules/audio_processing/aec3/render_buffer.h"
-
-namespace webrtc {
-
-// Class for buffering the incoming render blocks such that these may be
-// extracted with a specified delay.
-class RenderDelayBuffer {
- public:
-  static RenderDelayBuffer* Create(size_t num_bands);
-  virtual ~RenderDelayBuffer() = default;
-
-  // Resets the buffer data.
-  virtual void Reset() = 0;
-
-  // Inserts a block into the buffer and returns true if the insert is
-  // successful.
-  virtual bool Insert(const std::vector<std::vector<float>>& block) = 0;
-
-  // Updates the buffers one step based on the specified buffer delay. Returns
-  // true if there was no overrun, otherwise returns false.
-  virtual bool UpdateBuffers() = 0;
-
-  // Sets the buffer delay.
-  virtual void SetDelay(size_t delay) = 0;
-
-  // Gets the buffer delay.
-  virtual size_t Delay() const = 0;
-
-  // Returns the render buffer for the echo remover.
-  virtual const RenderBuffer& GetRenderBuffer() const = 0;
-
-  // Returns the downsampled render buffer.
-  virtual const DownsampledRenderBuffer& GetDownsampledRenderBuffer() const = 0;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_AEC3_RENDER_DELAY_BUFFER_H_
diff --git a/modules/audio_processing/aec3/render_delay_buffer_unittest.cc b/modules/audio_processing/aec3/render_delay_buffer_unittest.cc
deleted file mode 100644
index 120ddb2..0000000
--- a/modules/audio_processing/aec3/render_delay_buffer_unittest.cc
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- *  Copyright (c) 2017 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_processing/aec3/render_delay_buffer.h"
-
-#include <memory>
-#include <sstream>
-#include <string>
-#include <vector>
-
-#include "webrtc/api/array_view.h"
-#include "webrtc/modules/audio_processing/aec3/aec3_common.h"
-#include "webrtc/modules/audio_processing/logging/apm_data_dumper.h"
-#include "webrtc/rtc_base/random.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-namespace {
-
-std::string ProduceDebugText(int sample_rate_hz) {
-  std::ostringstream ss;
-  ss << "Sample rate: " << sample_rate_hz;
-  return ss.str();
-}
-
-}  // namespace
-
-// Verifies that the buffer overflow is correctly reported.
-TEST(RenderDelayBuffer, BufferOverflow) {
-  for (auto rate : {8000, 16000, 32000, 48000}) {
-    SCOPED_TRACE(ProduceDebugText(rate));
-    std::unique_ptr<RenderDelayBuffer> delay_buffer(
-        RenderDelayBuffer::Create(NumBandsForRate(rate)));
-    std::vector<std::vector<float>> block_to_insert(
-        NumBandsForRate(rate), std::vector<float>(kBlockSize, 0.f));
-    for (size_t k = 0; k < kMaxApiCallsJitterBlocks; ++k) {
-      EXPECT_TRUE(delay_buffer->Insert(block_to_insert));
-    }
-    EXPECT_FALSE(delay_buffer->Insert(block_to_insert));
-  }
-}
-
-// Verifies that the check for available block works.
-TEST(RenderDelayBuffer, AvailableBlock) {
-  constexpr size_t kNumBands = 1;
-  std::unique_ptr<RenderDelayBuffer> delay_buffer(
-      RenderDelayBuffer::Create(kNumBands));
-  std::vector<std::vector<float>> input_block(
-      kNumBands, std::vector<float>(kBlockSize, 1.f));
-  EXPECT_TRUE(delay_buffer->Insert(input_block));
-  delay_buffer->UpdateBuffers();
-}
-
-// Verifies the SetDelay method.
-TEST(RenderDelayBuffer, SetDelay) {
-  std::unique_ptr<RenderDelayBuffer> delay_buffer(RenderDelayBuffer::Create(1));
-  EXPECT_EQ(0u, delay_buffer->Delay());
-  for (size_t delay = 0; delay < 20; ++delay) {
-    delay_buffer->SetDelay(delay);
-    EXPECT_EQ(delay, delay_buffer->Delay());
-  }
-}
-
-#if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
-
-// Verifies the check for feasible delay.
-// TODO(peah): Re-enable the test once the issue with memory leaks during DEATH
-// tests on test bots has been fixed.
-TEST(RenderDelayBuffer, DISABLED_WrongDelay) {
-  std::unique_ptr<RenderDelayBuffer> delay_buffer(RenderDelayBuffer::Create(3));
-  EXPECT_DEATH(delay_buffer->SetDelay(21), "");
-}
-
-// Verifies the check for the number of bands in the inserted blocks.
-TEST(RenderDelayBuffer, WrongNumberOfBands) {
-  for (auto rate : {16000, 32000, 48000}) {
-    SCOPED_TRACE(ProduceDebugText(rate));
-    std::unique_ptr<RenderDelayBuffer> delay_buffer(
-        RenderDelayBuffer::Create(NumBandsForRate(rate)));
-    std::vector<std::vector<float>> block_to_insert(
-        NumBandsForRate(rate < 48000 ? rate + 16000 : 16000),
-        std::vector<float>(kBlockSize, 0.f));
-    EXPECT_DEATH(delay_buffer->Insert(block_to_insert), "");
-  }
-}
-
-// Verifies the check of the length of the inserted blocks.
-TEST(RenderDelayBuffer, WrongBlockLength) {
-  for (auto rate : {8000, 16000, 32000, 48000}) {
-    SCOPED_TRACE(ProduceDebugText(rate));
-    std::unique_ptr<RenderDelayBuffer> delay_buffer(
-        RenderDelayBuffer::Create(3));
-    std::vector<std::vector<float>> block_to_insert(
-        NumBandsForRate(rate), std::vector<float>(kBlockSize - 1, 0.f));
-    EXPECT_DEATH(delay_buffer->Insert(block_to_insert), "");
-  }
-}
-
-#endif
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/aec3/render_delay_controller.cc b/modules/audio_processing/aec3/render_delay_controller.cc
deleted file mode 100644
index 565bf43..0000000
--- a/modules/audio_processing/aec3/render_delay_controller.cc
+++ /dev/null
@@ -1,146 +0,0 @@
-/*
- *  Copyright (c) 2017 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_processing/aec3/render_delay_controller.h"
-
-#include <algorithm>
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "webrtc/modules/audio_processing/aec3/aec3_common.h"
-#include "webrtc/modules/audio_processing/aec3/echo_path_delay_estimator.h"
-#include "webrtc/modules/audio_processing/aec3/render_delay_controller_metrics.h"
-#include "webrtc/modules/audio_processing/include/audio_processing.h"
-#include "webrtc/rtc_base/atomicops.h"
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace webrtc {
-
-namespace {
-
-class RenderDelayControllerImpl final : public RenderDelayController {
- public:
-  RenderDelayControllerImpl(
-      const AudioProcessing::Config::EchoCanceller3& config,
-      int sample_rate_hz);
-  ~RenderDelayControllerImpl() override;
-  void Reset() override;
-  void SetDelay(size_t render_delay) override;
-  size_t GetDelay(const DownsampledRenderBuffer& render_buffer,
-                  rtc::ArrayView<const float> capture) override;
-  rtc::Optional<size_t> AlignmentHeadroomSamples() const override {
-    return headroom_samples_;
-  }
-
- private:
-  static int instance_count_;
-  std::unique_ptr<ApmDataDumper> data_dumper_;
-  size_t delay_ = kMinEchoPathDelayBlocks;
-  EchoPathDelayEstimator delay_estimator_;
-  size_t blocks_since_last_delay_estimate_ = 300000;
-  int echo_path_delay_samples_ = kMinEchoPathDelayBlocks * kBlockSize;
-  size_t align_call_counter_ = 0;
-  rtc::Optional<size_t> headroom_samples_;
-  RenderDelayControllerMetrics metrics_;
-  RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(RenderDelayControllerImpl);
-};
-
-size_t ComputeNewBufferDelay(size_t current_delay,
-                             size_t echo_path_delay_samples) {
-  // The below division is not exact and the truncation is intended.
-  const int echo_path_delay_blocks = echo_path_delay_samples / kBlockSize;
-  constexpr int kDelayHeadroomBlocks = 1;
-
-  // Compute the buffer delay increase required to achieve the desired latency.
-  size_t new_delay = std::max(echo_path_delay_blocks - kDelayHeadroomBlocks, 0);
-
-  // Add hysteresis.
-  if (new_delay == current_delay + 1) {
-    new_delay = current_delay;
-  }
-
-  return new_delay;
-}
-
-int RenderDelayControllerImpl::instance_count_ = 0;
-
-RenderDelayControllerImpl::RenderDelayControllerImpl(
-    const AudioProcessing::Config::EchoCanceller3& config,
-    int sample_rate_hz)
-    : data_dumper_(
-          new ApmDataDumper(rtc::AtomicOps::Increment(&instance_count_))),
-      delay_estimator_(data_dumper_.get(), config) {
-  RTC_DCHECK(ValidFullBandRate(sample_rate_hz));
-}
-
-RenderDelayControllerImpl::~RenderDelayControllerImpl() = default;
-
-void RenderDelayControllerImpl::Reset() {
-  delay_ = kMinEchoPathDelayBlocks;
-  blocks_since_last_delay_estimate_ = 300000;
-  echo_path_delay_samples_ = delay_ * kBlockSize;
-  align_call_counter_ = 0;
-  headroom_samples_ = rtc::Optional<size_t>();
-
-  delay_estimator_.Reset();
-}
-
-void RenderDelayControllerImpl::SetDelay(size_t render_delay) {
-  if (delay_ != render_delay) {
-    // If a the delay set does not match the actual delay, reset the delay
-    // controller.
-    Reset();
-    delay_ = render_delay;
-  }
-}
-
-size_t RenderDelayControllerImpl::GetDelay(
-    const DownsampledRenderBuffer& render_buffer,
-    rtc::ArrayView<const float> capture) {
-  RTC_DCHECK_EQ(kBlockSize, capture.size());
-
-  ++align_call_counter_;
-  rtc::Optional<size_t> echo_path_delay_samples =
-      delay_estimator_.EstimateDelay(render_buffer, capture);
-  if (echo_path_delay_samples) {
-    blocks_since_last_delay_estimate_ = 0;
-    echo_path_delay_samples_ = *echo_path_delay_samples;
-
-    // Compute and set new render delay buffer delay.
-    const size_t new_delay =
-        ComputeNewBufferDelay(delay_, echo_path_delay_samples_);
-    if (align_call_counter_ > kNumBlocksPerSecond) {
-      delay_ = new_delay;
-
-      // Update render delay buffer headroom.
-      const int headroom = echo_path_delay_samples_ - delay_ * kBlockSize;
-      RTC_DCHECK_LE(0, headroom);
-      headroom_samples_ = rtc::Optional<size_t>(headroom);
-    }
-  }
-
-  metrics_.Update(echo_path_delay_samples, delay_);
-
-  data_dumper_->DumpRaw("aec3_render_delay_controller_delay", 1,
-                        &echo_path_delay_samples_);
-  data_dumper_->DumpRaw("aec3_render_delay_controller_buffer_delay", delay_);
-
-  return delay_;
-}
-
-}  // namespace
-
-RenderDelayController* RenderDelayController::Create(
-    const AudioProcessing::Config::EchoCanceller3& config,
-    int sample_rate_hz) {
-  return new RenderDelayControllerImpl(config, sample_rate_hz);
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/aec3/render_delay_controller.h b/modules/audio_processing/aec3/render_delay_controller.h
deleted file mode 100644
index e840178..0000000
--- a/modules/audio_processing/aec3/render_delay_controller.h
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- *  Copyright (c) 2017 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_PROCESSING_AEC3_RENDER_DELAY_CONTROLLER_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_AEC3_RENDER_DELAY_CONTROLLER_H_
-
-#include "webrtc/api/array_view.h"
-#include "webrtc/api/optional.h"
-#include "webrtc/modules/audio_processing/aec3/downsampled_render_buffer.h"
-#include "webrtc/modules/audio_processing/aec3/render_delay_buffer.h"
-#include "webrtc/modules/audio_processing/include/audio_processing.h"
-#include "webrtc/modules/audio_processing/logging/apm_data_dumper.h"
-
-namespace webrtc {
-
-// Class for aligning the render and capture signal using a RenderDelayBuffer.
-class RenderDelayController {
- public:
-  static RenderDelayController* Create(
-      const AudioProcessing::Config::EchoCanceller3& config,
-      int sample_rate_hz);
-  virtual ~RenderDelayController() = default;
-
-  // Resets the delay controller.
-  virtual void Reset() = 0;
-
-  // Receives the externally used delay.
-  virtual void SetDelay(size_t render_delay) = 0;
-
-  // Aligns the render buffer content with the capture signal.
-  virtual size_t GetDelay(const DownsampledRenderBuffer& render_buffer,
-                          rtc::ArrayView<const float> capture) = 0;
-
-  // Returns an approximate value for the headroom in the buffer alignment.
-  virtual rtc::Optional<size_t> AlignmentHeadroomSamples() const = 0;
-};
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_AEC3_RENDER_DELAY_CONTROLLER_H_
diff --git a/modules/audio_processing/aec3/render_delay_controller_metrics.cc b/modules/audio_processing/aec3/render_delay_controller_metrics.cc
deleted file mode 100644
index d0330cb..0000000
--- a/modules/audio_processing/aec3/render_delay_controller_metrics.cc
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- *  Copyright (c) 2017 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_processing/aec3/render_delay_controller_metrics.h"
-
-#include <algorithm>
-
-#include "webrtc/modules/audio_processing/aec3/aec3_common.h"
-#include "webrtc/system_wrappers/include/metrics.h"
-
-namespace webrtc {
-
-namespace {
-
-enum class DelayReliabilityCategory {
-  kNone,
-  kPoor,
-  kMedium,
-  kGood,
-  kExcellent,
-  kNumCategories
-};
-enum class DelayChangesCategory {
-  kNone,
-  kFew,
-  kSeveral,
-  kMany,
-  kConstant,
-  kNumCategories
-};
-
-}  // namespace
-
-void RenderDelayControllerMetrics::Update(rtc::Optional<size_t> delay_samples,
-                                          size_t buffer_delay_blocks) {
-  ++call_counter_;
-
-  if (!initial_update) {
-    if (delay_samples) {
-      ++reliable_delay_estimate_counter_;
-      size_t delay_blocks = (*delay_samples) / kBlockSize;
-
-      if (delay_blocks != delay_blocks_) {
-        ++delay_change_counter_;
-        delay_blocks_ = delay_blocks;
-      }
-    }
-  } else if (++initial_call_counter_ == 5 * kNumBlocksPerSecond) {
-    initial_update = false;
-  }
-
-  if (call_counter_ == kMetricsReportingIntervalBlocks) {
-    int value_to_report = static_cast<int>(delay_blocks_);
-    value_to_report = std::min(124, value_to_report);
-    RTC_HISTOGRAM_COUNTS_LINEAR("WebRTC.Audio.EchoCanceller.EchoPathDelay",
-                                value_to_report, 0, 124, 125);
-
-    value_to_report = static_cast<int>(buffer_delay_blocks);
-    value_to_report = std::min(124, value_to_report);
-    RTC_HISTOGRAM_COUNTS_LINEAR("WebRTC.Audio.EchoCanceller.BufferDelay",
-                                value_to_report, 0, 124, 125);
-
-    DelayReliabilityCategory delay_reliability;
-    if (reliable_delay_estimate_counter_ == 0) {
-      delay_reliability = DelayReliabilityCategory::kNone;
-    } else if (reliable_delay_estimate_counter_ > (call_counter_ >> 1)) {
-      delay_reliability = DelayReliabilityCategory::kExcellent;
-    } else if (reliable_delay_estimate_counter_ > 100) {
-      delay_reliability = DelayReliabilityCategory::kGood;
-    } else if (reliable_delay_estimate_counter_ > 10) {
-      delay_reliability = DelayReliabilityCategory::kMedium;
-    } else {
-      delay_reliability = DelayReliabilityCategory::kPoor;
-    }
-    RTC_HISTOGRAM_ENUMERATION(
-        "WebRTC.Audio.EchoCanceller.ReliableDelayEstimates",
-        static_cast<int>(delay_reliability),
-        static_cast<int>(DelayReliabilityCategory::kNumCategories));
-
-    DelayChangesCategory delay_changes;
-    if (delay_change_counter_ == 0) {
-      delay_changes = DelayChangesCategory::kNone;
-    } else if (delay_change_counter_ > 10) {
-      delay_changes = DelayChangesCategory::kConstant;
-    } else if (delay_change_counter_ > 5) {
-      delay_changes = DelayChangesCategory::kMany;
-    } else if (delay_change_counter_ > 2) {
-      delay_changes = DelayChangesCategory::kSeveral;
-    } else {
-      delay_changes = DelayChangesCategory::kFew;
-    }
-    RTC_HISTOGRAM_ENUMERATION(
-        "WebRTC.Audio.EchoCanceller.DelayChanges",
-        static_cast<int>(delay_changes),
-        static_cast<int>(DelayChangesCategory::kNumCategories));
-
-    metrics_reported_ = true;
-    call_counter_ = 0;
-    ResetMetrics();
-  } else {
-    metrics_reported_ = false;
-  }
-}
-
-void RenderDelayControllerMetrics::ResetMetrics() {
-  delay_change_counter_ = 0;
-  reliable_delay_estimate_counter_ = 0;
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/aec3/render_delay_controller_metrics.h b/modules/audio_processing/aec3/render_delay_controller_metrics.h
deleted file mode 100644
index 625f30f..0000000
--- a/modules/audio_processing/aec3/render_delay_controller_metrics.h
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- *  Copyright (c) 2017 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_PROCESSING_AEC3_RENDER_DELAY_CONTROLLER_METRICS_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_AEC3_RENDER_DELAY_CONTROLLER_METRICS_H_
-
-#include "webrtc/api/optional.h"
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace webrtc {
-
-// Handles the reporting of metrics for the render delay controller.
-class RenderDelayControllerMetrics {
- public:
-  RenderDelayControllerMetrics() = default;
-
-  // Updates the metric with new data.
-  void Update(rtc::Optional<size_t> delay_samples, size_t buffer_delay_blocks);
-
-  // Returns true if the metrics have just been reported, otherwise false.
-  bool MetricsReported() { return metrics_reported_; }
-
- private:
-  // Resets the metrics.
-  void ResetMetrics();
-
-  size_t delay_blocks_ = 0;
-  int reliable_delay_estimate_counter_ = 0;
-  int delay_change_counter_ = 0;
-  int call_counter_ = 0;
-  int initial_call_counter_ = 0;
-  bool metrics_reported_ = false;
-  bool initial_update = true;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(RenderDelayControllerMetrics);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_AEC3_RENDER_DELAY_CONTROLLER_METRICS_H_
diff --git a/modules/audio_processing/aec3/render_delay_controller_metrics_unittest.cc b/modules/audio_processing/aec3/render_delay_controller_metrics_unittest.cc
deleted file mode 100644
index bb39e77..0000000
--- a/modules/audio_processing/aec3/render_delay_controller_metrics_unittest.cc
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- *  Copyright (c) 2017 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_processing/aec3/render_delay_controller_metrics.h"
-#include "webrtc/api/optional.h"
-#include "webrtc/modules/audio_processing/aec3/aec3_common.h"
-
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-// Verify the general functionality of RenderDelayControllerMetrics.
-TEST(RenderDelayControllerMetrics, NormalUsage) {
-  RenderDelayControllerMetrics metrics;
-
-  for (int j = 0; j < 3; ++j) {
-    for (int k = 0; k < kMetricsReportingIntervalBlocks - 1; ++k) {
-      metrics.Update(rtc::Optional<size_t>(), 0);
-      EXPECT_FALSE(metrics.MetricsReported());
-    }
-    metrics.Update(rtc::Optional<size_t>(), 0);
-    EXPECT_TRUE(metrics.MetricsReported());
-  }
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/aec3/render_delay_controller_unittest.cc b/modules/audio_processing/aec3/render_delay_controller_unittest.cc
deleted file mode 100644
index 45d00f9..0000000
--- a/modules/audio_processing/aec3/render_delay_controller_unittest.cc
+++ /dev/null
@@ -1,235 +0,0 @@
-/*
- *  Copyright (c) 2017 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_processing/aec3/render_delay_controller.h"
-
-#include <algorithm>
-#include <memory>
-#include <sstream>
-#include <string>
-#include <vector>
-
-#include "webrtc/modules/audio_processing/aec3/aec3_common.h"
-#include "webrtc/modules/audio_processing/aec3/block_processor.h"
-#include "webrtc/modules/audio_processing/aec3/decimator_by_4.h"
-#include "webrtc/modules/audio_processing/aec3/render_delay_buffer.h"
-#include "webrtc/modules/audio_processing/logging/apm_data_dumper.h"
-#include "webrtc/modules/audio_processing/test/echo_canceller_test_tools.h"
-#include "webrtc/rtc_base/random.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-namespace {
-
-std::string ProduceDebugText(int sample_rate_hz) {
-  std::ostringstream ss;
-  ss << "Sample rate: " << sample_rate_hz;
-  return ss.str();
-}
-
-std::string ProduceDebugText(int sample_rate_hz, size_t delay) {
-  std::ostringstream ss;
-  ss << ProduceDebugText(sample_rate_hz) << ", Delay: " << delay;
-  return ss.str();
-}
-
-}  // namespace
-
-// Verifies the output of GetDelay when there are no AnalyzeRender calls.
-TEST(RenderDelayController, NoRenderSignal) {
-  std::vector<float> block(kBlockSize, 0.f);
-  for (auto rate : {8000, 16000, 32000, 48000}) {
-    SCOPED_TRACE(ProduceDebugText(rate));
-    std::unique_ptr<RenderDelayBuffer> delay_buffer(
-        RenderDelayBuffer::Create(NumBandsForRate(rate)));
-    std::unique_ptr<RenderDelayController> delay_controller(
-        RenderDelayController::Create(AudioProcessing::Config::EchoCanceller3(),
-                                      rate));
-    for (size_t k = 0; k < 100; ++k) {
-      EXPECT_EQ(kMinEchoPathDelayBlocks,
-                delay_controller->GetDelay(
-                    delay_buffer->GetDownsampledRenderBuffer(), block));
-    }
-  }
-}
-
-// Verifies the basic API call sequence.
-TEST(RenderDelayController, BasicApiCalls) {
-  std::vector<float> capture_block(kBlockSize, 0.f);
-  size_t delay_blocks = 0;
-  for (auto rate : {8000, 16000, 32000, 48000}) {
-    std::vector<std::vector<float>> render_block(
-        NumBandsForRate(rate), std::vector<float>(kBlockSize, 0.f));
-    std::unique_ptr<RenderDelayBuffer> render_delay_buffer(
-        RenderDelayBuffer::Create(NumBandsForRate(rate)));
-    std::unique_ptr<RenderDelayController> delay_controller(
-        RenderDelayController::Create(AudioProcessing::Config::EchoCanceller3(),
-                                      rate));
-    for (size_t k = 0; k < 10; ++k) {
-      render_delay_buffer->Insert(render_block);
-      render_delay_buffer->UpdateBuffers();
-      delay_blocks = delay_controller->GetDelay(
-          render_delay_buffer->GetDownsampledRenderBuffer(), capture_block);
-    }
-    EXPECT_FALSE(delay_controller->AlignmentHeadroomSamples());
-    EXPECT_EQ(kMinEchoPathDelayBlocks, delay_blocks);
-  }
-}
-
-// Verifies that the RenderDelayController is able to align the signals for
-// simple timeshifts between the signals.
-TEST(RenderDelayController, Alignment) {
-  Random random_generator(42U);
-  std::vector<float> capture_block(kBlockSize, 0.f);
-  size_t delay_blocks = 0;
-  for (auto rate : {8000, 16000, 32000, 48000}) {
-    std::vector<std::vector<float>> render_block(
-        NumBandsForRate(rate), std::vector<float>(kBlockSize, 0.f));
-
-    for (size_t delay_samples : {15, 50, 150, 200, 800, 4000}) {
-      SCOPED_TRACE(ProduceDebugText(rate, delay_samples));
-      std::unique_ptr<RenderDelayBuffer> render_delay_buffer(
-          RenderDelayBuffer::Create(NumBandsForRate(rate)));
-      std::unique_ptr<RenderDelayController> delay_controller(
-          RenderDelayController::Create(
-              AudioProcessing::Config::EchoCanceller3(), rate));
-      DelayBuffer<float> signal_delay_buffer(delay_samples);
-      for (size_t k = 0; k < (400 + delay_samples / kBlockSize); ++k) {
-        RandomizeSampleVector(&random_generator, render_block[0]);
-        signal_delay_buffer.Delay(render_block[0], capture_block);
-        render_delay_buffer->Insert(render_block);
-        render_delay_buffer->UpdateBuffers();
-        delay_blocks = delay_controller->GetDelay(
-            render_delay_buffer->GetDownsampledRenderBuffer(), capture_block);
-      }
-
-      constexpr int kDelayHeadroomBlocks = 1;
-      size_t expected_delay_blocks =
-          std::max(0, static_cast<int>(delay_samples / kBlockSize) -
-                          kDelayHeadroomBlocks);
-
-      EXPECT_EQ(expected_delay_blocks, delay_blocks);
-
-      const rtc::Optional<size_t> headroom_samples =
-          delay_controller->AlignmentHeadroomSamples();
-      ASSERT_TRUE(headroom_samples);
-      EXPECT_NEAR(delay_samples - delay_blocks * kBlockSize, *headroom_samples,
-                  4);
-    }
-  }
-}
-
-// Verifies that the RenderDelayController is able to align the signals for
-// simple timeshifts between the signals when there is jitter in the API calls.
-TEST(RenderDelayController, AlignmentWithJitter) {
-  Random random_generator(42U);
-  std::vector<float> capture_block(kBlockSize, 0.f);
-  for (auto rate : {8000, 16000, 32000, 48000}) {
-    std::vector<std::vector<float>> render_block(
-        NumBandsForRate(rate), std::vector<float>(kBlockSize, 0.f));
-    for (size_t delay_samples : {15, 50, 300, 800}) {
-      size_t delay_blocks = 0;
-      SCOPED_TRACE(ProduceDebugText(rate, delay_samples));
-      std::unique_ptr<RenderDelayBuffer> render_delay_buffer(
-          RenderDelayBuffer::Create(NumBandsForRate(rate)));
-      std::unique_ptr<RenderDelayController> delay_controller(
-          RenderDelayController::Create(
-              AudioProcessing::Config::EchoCanceller3(), rate));
-      DelayBuffer<float> signal_delay_buffer(delay_samples);
-      for (size_t j = 0;
-           j <
-           (1000 + delay_samples / kBlockSize) / kMaxApiCallsJitterBlocks + 1;
-           ++j) {
-        std::vector<std::vector<float>> capture_block_buffer;
-        for (size_t k = 0; k < (kMaxApiCallsJitterBlocks - 1); ++k) {
-          RandomizeSampleVector(&random_generator, render_block[0]);
-          signal_delay_buffer.Delay(render_block[0], capture_block);
-          capture_block_buffer.push_back(capture_block);
-          render_delay_buffer->Insert(render_block);
-        }
-        for (size_t k = 0; k < (kMaxApiCallsJitterBlocks - 1); ++k) {
-          render_delay_buffer->UpdateBuffers();
-          delay_blocks = delay_controller->GetDelay(
-              render_delay_buffer->GetDownsampledRenderBuffer(),
-              capture_block_buffer[k]);
-        }
-      }
-
-      constexpr int kDelayHeadroomBlocks = 1;
-      size_t expected_delay_blocks =
-          std::max(0, static_cast<int>(delay_samples / kBlockSize) -
-                          kDelayHeadroomBlocks);
-      if (expected_delay_blocks < 2) {
-        expected_delay_blocks = 0;
-      }
-
-      EXPECT_EQ(expected_delay_blocks, delay_blocks);
-
-      const rtc::Optional<size_t> headroom_samples =
-          delay_controller->AlignmentHeadroomSamples();
-      ASSERT_TRUE(headroom_samples);
-      EXPECT_NEAR(delay_samples - delay_blocks * kBlockSize, *headroom_samples,
-                  4);
-      }
-    }
-  }
-
-// Verifies the initial value for the AlignmentHeadroomSamples.
-TEST(RenderDelayController, InitialHeadroom) {
-  std::vector<float> render_block(kBlockSize, 0.f);
-  std::vector<float> capture_block(kBlockSize, 0.f);
-  for (auto rate : {8000, 16000, 32000, 48000}) {
-    SCOPED_TRACE(ProduceDebugText(rate));
-    std::unique_ptr<RenderDelayBuffer> render_delay_buffer(
-        RenderDelayBuffer::Create(NumBandsForRate(rate)));
-    std::unique_ptr<RenderDelayController> delay_controller(
-        RenderDelayController::Create(AudioProcessing::Config::EchoCanceller3(),
-                                      rate));
-    EXPECT_FALSE(delay_controller->AlignmentHeadroomSamples());
-  }
-}
-
-#if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
-
-// Verifies the check for the capture signal block size.
-TEST(RenderDelayController, WrongCaptureSize) {
-  std::vector<float> block(kBlockSize - 1, 0.f);
-  for (auto rate : {8000, 16000, 32000, 48000}) {
-    SCOPED_TRACE(ProduceDebugText(rate));
-    std::unique_ptr<RenderDelayBuffer> render_delay_buffer(
-        RenderDelayBuffer::Create(NumBandsForRate(rate)));
-    EXPECT_DEATH(
-        std::unique_ptr<RenderDelayController>(
-            RenderDelayController::Create(
-                AudioProcessing::Config::EchoCanceller3(), rate))
-            ->GetDelay(render_delay_buffer->GetDownsampledRenderBuffer(),
-                       block),
-        "");
-  }
-}
-
-// Verifies the check for correct sample rate.
-// TODO(peah): Re-enable the test once the issue with memory leaks during DEATH
-// tests on test bots has been fixed.
-TEST(RenderDelayController, DISABLED_WrongSampleRate) {
-  for (auto rate : {-1, 0, 8001, 16001}) {
-    SCOPED_TRACE(ProduceDebugText(rate));
-    std::unique_ptr<RenderDelayBuffer> render_delay_buffer(
-        RenderDelayBuffer::Create(NumBandsForRate(rate)));
-    EXPECT_DEATH(
-        std::unique_ptr<RenderDelayController>(RenderDelayController::Create(
-            AudioProcessing::Config::EchoCanceller3(), rate)),
-        "");
-  }
-}
-
-#endif
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/aec3/render_signal_analyzer.cc b/modules/audio_processing/aec3/render_signal_analyzer.cc
deleted file mode 100644
index ce1c2f4..0000000
--- a/modules/audio_processing/aec3/render_signal_analyzer.cc
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
- *  Copyright (c) 2017 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_processing/aec3/render_signal_analyzer.h"
-
-#include <math.h>
-#include <algorithm>
-
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-
-namespace {
-constexpr size_t kCounterThreshold = 5;
-
-// Identifies local bands with narrow characteristics.
-void IdentifySmallNarrowBandRegions(
-    const RenderBuffer& render_buffer,
-    const rtc::Optional<size_t>& delay_partitions,
-    std::array<size_t, kFftLengthBy2 - 1>* narrow_band_counters) {
-  if (!delay_partitions) {
-    narrow_band_counters->fill(0);
-    return;
-  }
-
-  const std::array<float, kFftLengthBy2Plus1>& X2 =
-      render_buffer.Spectrum(*delay_partitions);
-
-  for (size_t k = 1; k < (X2.size() - 1); ++k) {
-    (*narrow_band_counters)[k - 1] = X2[k] > 3 * std::max(X2[k - 1], X2[k + 1])
-                                         ? (*narrow_band_counters)[k - 1] + 1
-                                         : 0;
-  }
-}
-
-// Identifies whether the signal has a single strong narrow-band component.
-void IdentifyStrongNarrowBandComponent(const RenderBuffer& render_buffer,
-                                       rtc::Optional<int>* narrow_peak_band,
-                                       size_t* narrow_peak_counter) {
-  const auto X2_latest = render_buffer.Spectrum(0);
-
-  // Identify the spectral peak.
-  const int peak_bin = static_cast<int>(
-      std::max_element(X2_latest.begin(), X2_latest.end()) - X2_latest.begin());
-
-  // Compute the level around the peak.
-  float non_peak_power = 0.f;
-  for (int k = std::max(5, peak_bin - 14); k < peak_bin - 4; ++k) {
-    non_peak_power = std::max(X2_latest[k], non_peak_power);
-  }
-  for (int k = peak_bin + 5;
-       k < std::min(peak_bin + 15, static_cast<int>(kFftLengthBy2Plus1)); ++k) {
-    non_peak_power = std::max(X2_latest[k], non_peak_power);
-  }
-
-  // Assess the render signal strength
-  const std::vector<std::vector<float>>& x_latest =
-      render_buffer.MostRecentBlock();
-  auto result0 = std::minmax_element(x_latest[0].begin(), x_latest[0].end());
-  float max_abs = std::max(fabs(*result0.first), fabs(*result0.second));
-
-  if (x_latest.size() > 1) {
-    const auto result1 =
-        std::minmax_element(x_latest[1].begin(), x_latest[1].end());
-    max_abs =
-        std::max(max_abs, static_cast<float>(std::max(fabs(*result1.first),
-                                                      fabs(*result1.second))));
-  }
-
-  // Detect whether the spectal peak has as strong narrowband nature.
-  if (peak_bin > 6 && max_abs > 100 &&
-      X2_latest[peak_bin] > 100 * non_peak_power) {
-    *narrow_peak_band = rtc::Optional<int>(peak_bin);
-    *narrow_peak_counter = 0;
-  } else {
-    if (*narrow_peak_band && ++(*narrow_peak_counter) > 7) {
-      *narrow_peak_band = rtc::Optional<int>();
-    }
-  }
-}
-
-}  // namespace
-
-RenderSignalAnalyzer::RenderSignalAnalyzer() {
-  narrow_band_counters_.fill(0);
-}
-RenderSignalAnalyzer::~RenderSignalAnalyzer() = default;
-
-void RenderSignalAnalyzer::Update(
-    const RenderBuffer& render_buffer,
-    const rtc::Optional<size_t>& delay_partitions) {
-  // Identify bands of narrow nature.
-  IdentifySmallNarrowBandRegions(render_buffer, delay_partitions,
-                                 &narrow_band_counters_);
-
-  // Identify the presence of a strong narrow band.
-  IdentifyStrongNarrowBandComponent(render_buffer, &narrow_peak_band_,
-                                    &narrow_peak_counter_);
-}
-
-void RenderSignalAnalyzer::MaskRegionsAroundNarrowBands(
-    std::array<float, kFftLengthBy2Plus1>* v) const {
-  RTC_DCHECK(v);
-
-  // Set v to zero around narrow band signal regions.
-  if (narrow_band_counters_[0] > kCounterThreshold) {
-    (*v)[1] = (*v)[0] = 0.f;
-  }
-  for (size_t k = 2; k < kFftLengthBy2 - 1; ++k) {
-    if (narrow_band_counters_[k - 1] > kCounterThreshold) {
-      (*v)[k - 2] = (*v)[k - 1] = (*v)[k] = (*v)[k + 1] = (*v)[k + 2] = 0.f;
-    }
-  }
-  if (narrow_band_counters_[kFftLengthBy2 - 2] > kCounterThreshold) {
-    (*v)[kFftLengthBy2] = (*v)[kFftLengthBy2 - 1] = 0.f;
-  }
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/aec3/render_signal_analyzer.h b/modules/audio_processing/aec3/render_signal_analyzer.h
deleted file mode 100644
index 48ce81e..0000000
--- a/modules/audio_processing/aec3/render_signal_analyzer.h
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- *  Copyright (c) 2017 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_PROCESSING_AEC3_RENDER_SIGNAL_ANALYZER_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_AEC3_RENDER_SIGNAL_ANALYZER_H_
-
-#include <array>
-#include <memory>
-
-#include "webrtc/api/optional.h"
-#include "webrtc/modules/audio_processing/aec3/aec3_common.h"
-#include "webrtc/modules/audio_processing/aec3/render_buffer.h"
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace webrtc {
-
-// Provides functionality for analyzing the properties of the render signal.
-class RenderSignalAnalyzer {
- public:
-  RenderSignalAnalyzer();
-  ~RenderSignalAnalyzer();
-
-  // Updates the render signal analysis with the most recent render signal.
-  void Update(const RenderBuffer& render_buffer,
-              const rtc::Optional<size_t>& delay_partitions);
-
-  // Returns true if the render signal is poorly exciting.
-  bool PoorSignalExcitation() const {
-    RTC_DCHECK_LT(2, narrow_band_counters_.size());
-    return std::any_of(narrow_band_counters_.begin(),
-                       narrow_band_counters_.end(),
-                       [](size_t a) { return a > 10; });
-  }
-
-  // Zeros the array around regions with narrow bands signal characteristics.
-  void MaskRegionsAroundNarrowBands(
-      std::array<float, kFftLengthBy2Plus1>* v) const;
-
-  rtc::Optional<int> NarrowPeakBand() const { return narrow_peak_band_; }
-
- private:
-  std::array<size_t, kFftLengthBy2 - 1> narrow_band_counters_;
-  rtc::Optional<int> narrow_peak_band_;
-  size_t narrow_peak_counter_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(RenderSignalAnalyzer);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_AEC3_RENDER_SIGNAL_ANALYZER_H_
diff --git a/modules/audio_processing/aec3/render_signal_analyzer_unittest.cc b/modules/audio_processing/aec3/render_signal_analyzer_unittest.cc
deleted file mode 100644
index e1f1e0f..0000000
--- a/modules/audio_processing/aec3/render_signal_analyzer_unittest.cc
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- *  Copyright (c) 2017 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_processing/aec3/render_signal_analyzer.h"
-
-#include <math.h>
-#include <array>
-#include <vector>
-
-#include "webrtc/api/array_view.h"
-#include "webrtc/modules/audio_processing/aec3/aec3_common.h"
-#include "webrtc/modules/audio_processing/aec3/aec3_fft.h"
-#include "webrtc/modules/audio_processing/aec3/fft_data.h"
-#include "webrtc/modules/audio_processing/aec3/render_buffer.h"
-#include "webrtc/modules/audio_processing/test/echo_canceller_test_tools.h"
-#include "webrtc/rtc_base/random.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-namespace {
-
-constexpr float kPi = 3.141592f;
-
-void ProduceSinusoid(int sample_rate_hz,
-                     float sinusoidal_frequency_hz,
-                     size_t* sample_counter,
-                     rtc::ArrayView<float> x) {
-  // Produce a sinusoid of the specified frequency.
-  for (size_t k = *sample_counter, j = 0; k < (*sample_counter + kBlockSize);
-       ++k, ++j) {
-    x[j] =
-        32767.f * sin(2.f * kPi * sinusoidal_frequency_hz * k / sample_rate_hz);
-  }
-  *sample_counter = *sample_counter + kBlockSize;
-}
-
-}  // namespace
-
-#if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
-// Verifies that the check for non-null output parameter works.
-TEST(RenderSignalAnalyzer, NullMaskOutput) {
-  RenderSignalAnalyzer analyzer;
-  EXPECT_DEATH(analyzer.MaskRegionsAroundNarrowBands(nullptr), "");
-}
-
-#endif
-
-// Verify that no narrow bands are detected in a Gaussian noise signal.
-TEST(RenderSignalAnalyzer, NoFalseDetectionOfNarrowBands) {
-  RenderSignalAnalyzer analyzer;
-  Random random_generator(42U);
-  std::vector<std::vector<float>> x(3, std::vector<float>(kBlockSize, 0.f));
-  std::array<float, kBlockSize> x_old;
-  FftData X;
-  Aec3Fft fft;
-  RenderBuffer render_buffer(Aec3Optimization::kNone, 3, 1,
-                             std::vector<size_t>(1, 1));
-  std::array<float, kFftLengthBy2Plus1> mask;
-  x_old.fill(0.f);
-
-  for (size_t k = 0; k < 100; ++k) {
-    RandomizeSampleVector(&random_generator, x[0]);
-    fft.PaddedFft(x[0], x_old, &X);
-    render_buffer.Insert(x);
-    analyzer.Update(render_buffer, rtc::Optional<size_t>(0));
-  }
-
-  mask.fill(1.f);
-  analyzer.MaskRegionsAroundNarrowBands(&mask);
-  EXPECT_TRUE(
-      std::all_of(mask.begin(), mask.end(), [](float a) { return a == 1.f; }));
-  EXPECT_FALSE(analyzer.PoorSignalExcitation());
-}
-
-// Verify that a sinusiod signal is detected as narrow bands.
-TEST(RenderSignalAnalyzer, NarrowBandDetection) {
-  RenderSignalAnalyzer analyzer;
-  Random random_generator(42U);
-  std::vector<std::vector<float>> x(3, std::vector<float>(kBlockSize, 0.f));
-  std::array<float, kBlockSize> x_old;
-  Aec3Fft fft;
-  RenderBuffer render_buffer(Aec3Optimization::kNone, 3, 1,
-                             std::vector<size_t>(1, 1));
-  std::array<float, kFftLengthBy2Plus1> mask;
-  x_old.fill(0.f);
-  constexpr int kSinusFrequencyBin = 32;
-
-  auto generate_sinusoid_test = [&](bool known_delay) {
-    size_t sample_counter = 0;
-    for (size_t k = 0; k < 100; ++k) {
-      ProduceSinusoid(16000, 16000 / 2 * kSinusFrequencyBin / kFftLengthBy2,
-                      &sample_counter, x[0]);
-      render_buffer.Insert(x);
-      analyzer.Update(render_buffer, known_delay ? rtc::Optional<size_t>(0)
-                                                 : rtc::Optional<size_t>());
-    }
-  };
-
-  generate_sinusoid_test(true);
-  mask.fill(1.f);
-  analyzer.MaskRegionsAroundNarrowBands(&mask);
-  for (int k = 0; k < static_cast<int>(mask.size()); ++k) {
-    EXPECT_EQ(abs(k - kSinusFrequencyBin) <= 2 ? 0.f : 1.f, mask[k]);
-  }
-  EXPECT_TRUE(analyzer.PoorSignalExcitation());
-
-  // Verify that no bands are detected as narrow when the delay is unknown.
-  generate_sinusoid_test(false);
-  mask.fill(1.f);
-  analyzer.MaskRegionsAroundNarrowBands(&mask);
-  std::for_each(mask.begin(), mask.end(), [](float a) { EXPECT_EQ(1.f, a); });
-  EXPECT_FALSE(analyzer.PoorSignalExcitation());
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/aec3/residual_echo_estimator.cc b/modules/audio_processing/aec3/residual_echo_estimator.cc
deleted file mode 100644
index 0dfec66..0000000
--- a/modules/audio_processing/aec3/residual_echo_estimator.cc
+++ /dev/null
@@ -1,264 +0,0 @@
-/*
- *  Copyright (c) 2017 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_processing/aec3/residual_echo_estimator.h"
-
-#include <numeric>
-#include <vector>
-
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-namespace {
-
-// Estimates the echo generating signal power as gated maximal power over a time
-// window.
-void EchoGeneratingPower(const RenderBuffer& render_buffer,
-                         size_t min_delay,
-                         size_t max_delay,
-                         std::array<float, kFftLengthBy2Plus1>* X2) {
-  X2->fill(0.f);
-  for (size_t k = min_delay; k <= max_delay; ++k) {
-    std::transform(X2->begin(), X2->end(), render_buffer.Spectrum(k).begin(),
-                   X2->begin(),
-                   [](float a, float b) { return std::max(a, b); });
-  }
-
-  // Apply soft noise gate of -78 dBFS.
-  static constexpr float kNoiseGatePower = 27509.42f;
-  std::for_each(X2->begin(), X2->end(), [](float& a) {
-    if (kNoiseGatePower > a) {
-      a = std::max(0.f, a - 0.3f * (kNoiseGatePower - a));
-    }
-  });
-}
-
-constexpr int kNoiseFloorCounterMax = 50;
-constexpr float kNoiseFloorMin = 10.f * 10.f * 128.f * 128.f;
-
-// Updates estimate for the power of the stationary noise component in the
-// render signal.
-void RenderNoisePower(
-    const RenderBuffer& render_buffer,
-    std::array<float, kFftLengthBy2Plus1>* X2_noise_floor,
-    std::array<int, kFftLengthBy2Plus1>* X2_noise_floor_counter) {
-  RTC_DCHECK(X2_noise_floor);
-  RTC_DCHECK(X2_noise_floor_counter);
-
-  const auto render_power = render_buffer.Spectrum(0);
-  RTC_DCHECK_EQ(X2_noise_floor->size(), render_power.size());
-  RTC_DCHECK_EQ(X2_noise_floor_counter->size(), render_power.size());
-
-  // Estimate the stationary noise power in a minimum statistics manner.
-  for (size_t k = 0; k < render_power.size(); ++k) {
-    // Decrease rapidly.
-    if (render_power[k] < (*X2_noise_floor)[k]) {
-      (*X2_noise_floor)[k] = render_power[k];
-      (*X2_noise_floor_counter)[k] = 0;
-    } else {
-      // Increase in a delayed, leaky manner.
-      if ((*X2_noise_floor_counter)[k] >= kNoiseFloorCounterMax) {
-        (*X2_noise_floor)[k] =
-            std::max((*X2_noise_floor)[k] * 1.1f, kNoiseFloorMin);
-      } else {
-        ++(*X2_noise_floor_counter)[k];
-      }
-    }
-  }
-}
-
-// Assume a minimum echo path gain of -33 dB for headsets.
-constexpr float kHeadsetEchoPathGain = 0.0005f;
-
-}  // namespace
-
-ResidualEchoEstimator::ResidualEchoEstimator(
-    const AudioProcessing::Config::EchoCanceller3& config)
-    : config_(config) {
-  Reset();
-}
-
-ResidualEchoEstimator::~ResidualEchoEstimator() = default;
-
-void ResidualEchoEstimator::Estimate(
-    bool using_subtractor_output,
-    const AecState& aec_state,
-    const RenderBuffer& render_buffer,
-    const std::array<float, kFftLengthBy2Plus1>& S2_linear,
-    const std::array<float, kFftLengthBy2Plus1>& Y2,
-    std::array<float, kFftLengthBy2Plus1>* R2) {
-  RTC_DCHECK(R2);
-
-  const rtc::Optional<size_t> delay =
-      aec_state.ExternalDelay()
-          ? (aec_state.FilterDelay() ? aec_state.FilterDelay()
-                                     : aec_state.ExternalDelay())
-          : rtc::Optional<size_t>();
-
-  // Estimate the power of the stationary noise in the render signal.
-  RenderNoisePower(render_buffer, &X2_noise_floor_, &X2_noise_floor_counter_);
-
-  // Estimate the residual echo power.
-  const bool use_linear_echo_power =
-      aec_state.UsableLinearEstimate() && using_subtractor_output;
-  if (use_linear_echo_power && !aec_state.HeadsetDetected()) {
-    RTC_DCHECK(aec_state.FilterDelay());
-    const int filter_delay = *aec_state.FilterDelay();
-    LinearEstimate(S2_linear, aec_state.Erle(), filter_delay, R2);
-    AddEchoReverb(S2_linear, aec_state.SaturatedEcho(), filter_delay,
-                  aec_state.ReverbDecay(), R2);
-  } else {
-    // Estimate the echo generating signal power.
-    std::array<float, kFftLengthBy2Plus1> X2;
-    if (aec_state.ExternalDelay() && aec_state.FilterDelay()) {
-      RTC_DCHECK(delay);
-      const int delay_use = static_cast<int>(*delay);
-
-      // Computes the spectral power over the blocks surrounding the delay.
-      RTC_DCHECK_LT(delay_use, kResidualEchoPowerRenderWindowSize);
-      EchoGeneratingPower(
-          render_buffer, std::max(0, delay_use - 1),
-          std::min(kResidualEchoPowerRenderWindowSize - 1, delay_use + 1), &X2);
-    } else {
-      // Computes the spectral power over the latest blocks.
-      EchoGeneratingPower(render_buffer, 0,
-                          kResidualEchoPowerRenderWindowSize - 1, &X2);
-    }
-
-    // Subtract the stationary noise power to avoid stationary noise causing
-    // excessive echo suppression.
-    std::transform(
-        X2.begin(), X2.end(), X2_noise_floor_.begin(), X2.begin(),
-        [](float a, float b) { return std::max(0.f, a - 10.f * b); });
-
-    NonLinearEstimate(aec_state.HeadsetDetected(), X2, Y2, R2);
-    AddEchoReverb(*R2, aec_state.SaturatedEcho(),
-                  std::min(static_cast<size_t>(kAdaptiveFilterLength),
-                           delay.value_or(kAdaptiveFilterLength)),
-                  aec_state.ReverbDecay(), R2);
-  }
-
-  // If the echo is deemed inaudible, set the residual echo to zero.
-  if (aec_state.InaudibleEcho() &&
-      (aec_state.ExternalDelay() || aec_state.HeadsetDetected())) {
-    R2->fill(0.f);
-  }
-
-  // If the echo is saturated, estimate the echo power as the maximum echo power
-  // with a leakage factor.
-  if (aec_state.SaturatedEcho()) {
-    R2->fill((*std::max_element(R2->begin(), R2->end())) * 100.f);
-  }
-
-  std::copy(R2->begin(), R2->end(), R2_old_.begin());
-}
-
-void ResidualEchoEstimator::Reset() {
-  X2_noise_floor_counter_.fill(kNoiseFloorCounterMax);
-  X2_noise_floor_.fill(kNoiseFloorMin);
-  R2_reverb_.fill(0.f);
-  R2_old_.fill(0.f);
-  R2_hold_counter_.fill(0.f);
-  for (auto& S2_k : S2_old_) {
-    S2_k.fill(0.f);
-  }
-}
-
-void ResidualEchoEstimator::LinearEstimate(
-    const std::array<float, kFftLengthBy2Plus1>& S2_linear,
-    const std::array<float, kFftLengthBy2Plus1>& erle,
-    size_t delay,
-    std::array<float, kFftLengthBy2Plus1>* R2) {
-  std::fill(R2_hold_counter_.begin(), R2_hold_counter_.end(), 10.f);
-  std::transform(erle.begin(), erle.end(), S2_linear.begin(), R2->begin(),
-                 [](float a, float b) {
-                   RTC_DCHECK_LT(0.f, a);
-                   return b / a;
-                 });
-}
-
-void ResidualEchoEstimator::NonLinearEstimate(
-    bool headset_detected,
-    const std::array<float, kFftLengthBy2Plus1>& X2,
-    const std::array<float, kFftLengthBy2Plus1>& Y2,
-    std::array<float, kFftLengthBy2Plus1>* R2) {
-  // Choose gains.
-  const float echo_path_gain_lf =
-      headset_detected ? kHeadsetEchoPathGain : config_.param.ep_strength.lf;
-  const float echo_path_gain_mf =
-      headset_detected ? kHeadsetEchoPathGain : config_.param.ep_strength.mf;
-  const float echo_path_gain_hf =
-      headset_detected ? kHeadsetEchoPathGain : config_.param.ep_strength.hf;
-
-  // Compute preliminary residual echo.
-  std::transform(
-      X2.begin(), X2.begin() + 12, R2->begin(),
-      [echo_path_gain_lf](float a) { return a * echo_path_gain_lf; });
-  std::transform(
-      X2.begin() + 12, X2.begin() + 25, R2->begin() + 12,
-      [echo_path_gain_mf](float a) { return a * echo_path_gain_mf; });
-  std::transform(
-      X2.begin() + 25, X2.end(), R2->begin() + 25,
-      [echo_path_gain_hf](float a) { return a * echo_path_gain_hf; });
-
-  for (size_t k = 0; k < R2->size(); ++k) {
-    // Update hold counter.
-    R2_hold_counter_[k] = R2_old_[k] < (*R2)[k] ? 0 : R2_hold_counter_[k] + 1;
-
-    // Compute the residual echo by holding a maximum echo powers and an echo
-    // fading corresponding to a room with an RT60 value of about 50 ms.
-    (*R2)[k] = R2_hold_counter_[k] < 2
-                   ? std::max((*R2)[k], R2_old_[k])
-                   : std::min((*R2)[k] + R2_old_[k] * 0.1f, Y2[k]);
-  }
-}
-
-void ResidualEchoEstimator::AddEchoReverb(
-    const std::array<float, kFftLengthBy2Plus1>& S2,
-    bool saturated_echo,
-    size_t delay,
-    float reverb_decay_factor,
-    std::array<float, kFftLengthBy2Plus1>* R2) {
-  // Compute the decay factor for how much the echo has decayed before leaving
-  // the region covered by the linear model.
-  auto integer_power = [](float base, int exp) {
-    float result = 1.f;
-    for (int k = 0; k < exp; ++k) {
-      result *= base;
-    }
-    return result;
-  };
-  RTC_DCHECK_LE(delay, S2_old_.size());
-  const float reverb_decay_for_delay =
-      integer_power(reverb_decay_factor, S2_old_.size() - delay);
-
-  // Update the estimate of the reverberant residual echo power.
-  S2_old_index_ = S2_old_index_ > 0 ? S2_old_index_ - 1 : S2_old_.size() - 1;
-  const auto& S2_end = S2_old_[S2_old_index_];
-  std::transform(
-      S2_end.begin(), S2_end.end(), R2_reverb_.begin(), R2_reverb_.begin(),
-      [reverb_decay_for_delay, reverb_decay_factor](float a, float b) {
-        return (b + a * reverb_decay_for_delay) * reverb_decay_factor;
-      });
-
-  // Update the buffer of old echo powers.
-  if (saturated_echo) {
-    S2_old_[S2_old_index_].fill((*std::max_element(S2.begin(), S2.end())) *
-                                100.f);
-  } else {
-    std::copy(S2.begin(), S2.end(), S2_old_[S2_old_index_].begin());
-  }
-
-  // Add the power of the echo reverb to the residual echo power.
-  std::transform(R2->begin(), R2->end(), R2_reverb_.begin(), R2->begin(),
-                 std::plus<float>());
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/aec3/residual_echo_estimator.h b/modules/audio_processing/aec3/residual_echo_estimator.h
deleted file mode 100644
index 0e86ac1..0000000
--- a/modules/audio_processing/aec3/residual_echo_estimator.h
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- *  Copyright (c) 2017 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_PROCESSING_AEC3_RESIDUAL_ECHO_ESTIMATOR_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_AEC3_RESIDUAL_ECHO_ESTIMATOR_H_
-
-#include <algorithm>
-#include <array>
-#include <vector>
-
-#include "webrtc/api/array_view.h"
-#include "webrtc/modules/audio_processing/aec3/aec3_common.h"
-#include "webrtc/modules/audio_processing/aec3/aec_state.h"
-#include "webrtc/modules/audio_processing/aec3/render_buffer.h"
-#include "webrtc/modules/audio_processing/include/audio_processing.h"
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace webrtc {
-
-class ResidualEchoEstimator {
- public:
-  explicit ResidualEchoEstimator(
-      const AudioProcessing::Config::EchoCanceller3& config);
-  ~ResidualEchoEstimator();
-
-  void Estimate(bool using_subtractor_output,
-                const AecState& aec_state,
-                const RenderBuffer& render_buffer,
-                const std::array<float, kFftLengthBy2Plus1>& S2_linear,
-                const std::array<float, kFftLengthBy2Plus1>& Y2,
-                std::array<float, kFftLengthBy2Plus1>* R2);
-
- private:
-  // Resets the state.
-  void Reset();
-
-  // Estimates the residual echo power based on the echo return loss enhancement
-  // (ERLE) and the linear power estimate.
-  void LinearEstimate(const std::array<float, kFftLengthBy2Plus1>& S2_linear,
-                      const std::array<float, kFftLengthBy2Plus1>& erle,
-                      size_t delay,
-                      std::array<float, kFftLengthBy2Plus1>* R2);
-
-  // Estimates the residual echo power based on the estimate of the echo path
-  // gain.
-  void NonLinearEstimate(bool headset_detected,
-                         const std::array<float, kFftLengthBy2Plus1>& X2,
-                         const std::array<float, kFftLengthBy2Plus1>& Y2,
-                         std::array<float, kFftLengthBy2Plus1>* R2);
-
-  // Adds the estimated unmodelled echo power to the residual echo power
-  // estimate.
-  void AddEchoReverb(const std::array<float, kFftLengthBy2Plus1>& S2,
-                     bool saturated_echo,
-                     size_t delay,
-                     float reverb_decay_factor,
-                     std::array<float, kFftLengthBy2Plus1>* R2);
-
-  std::array<float, kFftLengthBy2Plus1> R2_old_;
-  std::array<int, kFftLengthBy2Plus1> R2_hold_counter_;
-  std::array<float, kFftLengthBy2Plus1> R2_reverb_;
-  int S2_old_index_ = 0;
-  std::array<std::array<float, kFftLengthBy2Plus1>, kAdaptiveFilterLength>
-      S2_old_;
-  std::array<float, kFftLengthBy2Plus1> X2_noise_floor_;
-  std::array<int, kFftLengthBy2Plus1> X2_noise_floor_counter_;
-  const AudioProcessing::Config::EchoCanceller3 config_;
-
-  RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(ResidualEchoEstimator);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_AEC3_RESIDUAL_ECHO_ESTIMATOR_H_
diff --git a/modules/audio_processing/aec3/residual_echo_estimator_unittest.cc b/modules/audio_processing/aec3/residual_echo_estimator_unittest.cc
deleted file mode 100644
index 6abb155..0000000
--- a/modules/audio_processing/aec3/residual_echo_estimator_unittest.cc
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- *  Copyright (c) 2017 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_processing/aec3/residual_echo_estimator.h"
-
-#include "webrtc/modules/audio_processing/aec3/aec3_fft.h"
-#include "webrtc/modules/audio_processing/aec3/aec_state.h"
-#include "webrtc/modules/audio_processing/include/audio_processing.h"
-#include "webrtc/modules/audio_processing/test/echo_canceller_test_tools.h"
-#include "webrtc/rtc_base/random.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-#if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
-
-// Verifies that the check for non-null output residual echo power works.
-TEST(ResidualEchoEstimator, NullResidualEchoPowerOutput) {
-  AecState aec_state(AudioProcessing::Config::EchoCanceller3{});
-  RenderBuffer render_buffer(Aec3Optimization::kNone, 3, 10,
-                             std::vector<size_t>(1, 10));
-  std::vector<std::array<float, kFftLengthBy2Plus1>> H2;
-  std::array<float, kFftLengthBy2Plus1> S2_linear;
-  std::array<float, kFftLengthBy2Plus1> Y2;
-  EXPECT_DEATH(
-      ResidualEchoEstimator(AudioProcessing::Config::EchoCanceller3{})
-          .Estimate(true, aec_state, render_buffer, S2_linear, Y2, nullptr),
-      "");
-}
-
-#endif
-
-TEST(ResidualEchoEstimator, BasicTest) {
-  ResidualEchoEstimator estimator(AudioProcessing::Config::EchoCanceller3{});
-  AudioProcessing::Config::EchoCanceller3 config;
-  config.param.ep_strength.default_len = 0.f;
-  AecState aec_state(config);
-  RenderBuffer render_buffer(Aec3Optimization::kNone, 3, 10,
-                             std::vector<size_t>(1, 10));
-  std::array<float, kFftLengthBy2Plus1> E2_main;
-  std::array<float, kFftLengthBy2Plus1> E2_shadow;
-  std::array<float, kFftLengthBy2Plus1> S2_linear;
-  std::array<float, kFftLengthBy2Plus1> S2_fallback;
-  std::array<float, kFftLengthBy2Plus1> Y2;
-  std::array<float, kFftLengthBy2Plus1> R2;
-  EchoPathVariability echo_path_variability(false, false);
-  std::vector<std::vector<float>> x(3, std::vector<float>(kBlockSize, 0.f));
-  std::vector<std::array<float, kFftLengthBy2Plus1>> H2(10);
-  Random random_generator(42U);
-  FftData X;
-  std::array<float, kBlockSize> x_old;
-  std::array<float, kBlockSize> s;
-  Aec3Fft fft;
-
-  for (auto& H2_k : H2) {
-    H2_k.fill(0.01f);
-  }
-  H2[2].fill(10.f);
-  H2[2][0] = 0.1f;
-
-  std::array<float, kAdaptiveFilterTimeDomainLength> h;
-  h.fill(0.f);
-
-  s.fill(100.f);
-
-  constexpr float kLevel = 10.f;
-  E2_shadow.fill(kLevel);
-  E2_main.fill(kLevel);
-  S2_linear.fill(kLevel);
-  S2_fallback.fill(kLevel);
-  Y2.fill(kLevel);
-
-  for (int k = 0; k < 2000; ++k) {
-    RandomizeSampleVector(&random_generator, x[0]);
-    std::for_each(x[0].begin(), x[0].end(), [](float& a) { a /= 30.f; });
-    fft.PaddedFft(x[0], x_old, &X);
-    render_buffer.Insert(x);
-
-    aec_state.HandleEchoPathChange(echo_path_variability);
-    aec_state.Update(H2, h, rtc::Optional<size_t>(2), render_buffer, E2_main,
-                     Y2, x[0], s, false);
-
-    estimator.Estimate(true, aec_state, render_buffer, S2_linear, Y2, &R2);
-  }
-  std::for_each(R2.begin(), R2.end(),
-                [&](float a) { EXPECT_NEAR(kLevel, a, 0.1f); });
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/aec3/shadow_filter_update_gain.cc b/modules/audio_processing/aec3/shadow_filter_update_gain.cc
deleted file mode 100644
index 6287110..0000000
--- a/modules/audio_processing/aec3/shadow_filter_update_gain.cc
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- *  Copyright (c) 2017 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_processing/aec3/shadow_filter_update_gain.h"
-
-#include <algorithm>
-#include <functional>
-
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-
-void ShadowFilterUpdateGain::HandleEchoPathChange() {
-  // TODO(peah): Check whether this counter should instead be initialized to a
-  // large value.
-  poor_signal_excitation_counter_ = 0;
-  call_counter_ = 0;
-}
-
-void ShadowFilterUpdateGain::Compute(
-    const RenderBuffer& render_buffer,
-    const RenderSignalAnalyzer& render_signal_analyzer,
-    const FftData& E_shadow,
-    size_t size_partitions,
-    bool saturated_capture_signal,
-    FftData* G) {
-  RTC_DCHECK(G);
-  ++call_counter_;
-
-  if (render_signal_analyzer.PoorSignalExcitation()) {
-    poor_signal_excitation_counter_ = 0;
-  }
-
-  // Do not update the filter if the render is not sufficiently excited.
-  if (++poor_signal_excitation_counter_ < size_partitions ||
-      saturated_capture_signal || call_counter_ <= size_partitions) {
-    G->re.fill(0.f);
-    G->im.fill(0.f);
-    return;
-  }
-
-  // Compute mu.
-  // Corresponds to WGN of power -39 dBFS.
-  constexpr float kNoiseGatePower = 220075344.f;
-  constexpr float kMuFixed = .5f;
-  std::array<float, kFftLengthBy2Plus1> mu;
-  const auto& X2 = render_buffer.SpectralSum(size_partitions);
-  std::transform(X2.begin(), X2.end(), mu.begin(), [&](float a) {
-    return a > kNoiseGatePower ? kMuFixed / a : 0.f;
-  });
-
-  // Avoid updating the filter close to narrow bands in the render signals.
-  render_signal_analyzer.MaskRegionsAroundNarrowBands(&mu);
-
-  // G = mu * E * X2.
-  std::transform(mu.begin(), mu.end(), E_shadow.re.begin(), G->re.begin(),
-                 std::multiplies<float>());
-  std::transform(mu.begin(), mu.end(), E_shadow.im.begin(), G->im.begin(),
-                 std::multiplies<float>());
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/aec3/shadow_filter_update_gain.h b/modules/audio_processing/aec3/shadow_filter_update_gain.h
deleted file mode 100644
index be1102d..0000000
--- a/modules/audio_processing/aec3/shadow_filter_update_gain.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- *  Copyright (c) 2017 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_PROCESSING_AEC3_SHADOW_FILTER_UPDATE_GAIN_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_AEC3_SHADOW_FILTER_UPDATE_GAIN_H_
-
-#include "webrtc/modules/audio_processing/aec3/aec3_common.h"
-#include "webrtc/modules/audio_processing/aec3/render_buffer.h"
-#include "webrtc/modules/audio_processing/aec3/render_signal_analyzer.h"
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace webrtc {
-
-// Provides functionality for computing the fixed gain for the shadow filter.
-class ShadowFilterUpdateGain {
- public:
-  // Takes action in the case of a known echo path change.
-  void HandleEchoPathChange();
-
-  // Computes the gain.
-  void Compute(const RenderBuffer& render_buffer,
-               const RenderSignalAnalyzer& render_signal_analyzer,
-               const FftData& E_shadow,
-               size_t size_partitions,
-               bool saturated_capture_signal,
-               FftData* G);
-
- private:
-  // TODO(peah): Check whether this counter should instead be initialized to a
-  // large value.
-  size_t poor_signal_excitation_counter_ = 0;
-  size_t call_counter_ = 0;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_AEC3_SHADOW_FILTER_UPDATE_GAIN_H_
diff --git a/modules/audio_processing/aec3/shadow_filter_update_gain_unittest.cc b/modules/audio_processing/aec3/shadow_filter_update_gain_unittest.cc
deleted file mode 100644
index 99e3f25..0000000
--- a/modules/audio_processing/aec3/shadow_filter_update_gain_unittest.cc
+++ /dev/null
@@ -1,187 +0,0 @@
-/*
- *  Copyright (c) 2017 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_processing/aec3/shadow_filter_update_gain.h"
-
-#include <algorithm>
-#include <numeric>
-#include <string>
-#include <vector>
-
-#include "webrtc/modules/audio_processing/aec3/adaptive_fir_filter.h"
-#include "webrtc/modules/audio_processing/aec3/aec3_common.h"
-#include "webrtc/modules/audio_processing/aec3/aec_state.h"
-#include "webrtc/modules/audio_processing/test/echo_canceller_test_tools.h"
-#include "webrtc/rtc_base/random.h"
-#include "webrtc/rtc_base/safe_minmax.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-namespace {
-
-// Method for performing the simulations needed to test the main filter update
-// gain functionality.
-void RunFilterUpdateTest(int num_blocks_to_process,
-                         size_t delay_samples,
-                         const std::vector<int>& blocks_with_saturation,
-                         std::array<float, kBlockSize>* e_last_block,
-                         std::array<float, kBlockSize>* y_last_block,
-                         FftData* G_last_block) {
-  ApmDataDumper data_dumper(42);
-  AdaptiveFirFilter main_filter(9, DetectOptimization(), &data_dumper);
-  AdaptiveFirFilter shadow_filter(9, DetectOptimization(), &data_dumper);
-  Aec3Fft fft;
-  RenderBuffer render_buffer(
-      Aec3Optimization::kNone, 3, main_filter.SizePartitions(),
-      std::vector<size_t>(1, main_filter.SizePartitions()));
-  std::array<float, kBlockSize> x_old;
-  x_old.fill(0.f);
-  ShadowFilterUpdateGain shadow_gain;
-  Random random_generator(42U);
-  std::vector<std::vector<float>> x(3, std::vector<float>(kBlockSize, 0.f));
-  std::vector<float> y(kBlockSize, 0.f);
-  AecState aec_state(AudioProcessing::Config::EchoCanceller3{});
-  RenderSignalAnalyzer render_signal_analyzer;
-  std::array<float, kFftLength> s;
-  FftData S;
-  FftData G;
-  FftData E_shadow;
-  std::array<float, kBlockSize> e_shadow;
-
-  constexpr float kScale = 1.0f / kFftLengthBy2;
-
-  DelayBuffer<float> delay_buffer(delay_samples);
-  for (int k = 0; k < num_blocks_to_process; ++k) {
-    // Handle saturation.
-    bool saturation =
-        std::find(blocks_with_saturation.begin(), blocks_with_saturation.end(),
-                  k) != blocks_with_saturation.end();
-
-    // Create the render signal.
-    RandomizeSampleVector(&random_generator, x[0]);
-    delay_buffer.Delay(x[0], y);
-    render_buffer.Insert(x);
-    render_signal_analyzer.Update(
-        render_buffer, rtc::Optional<size_t>(delay_samples / kBlockSize));
-
-    shadow_filter.Filter(render_buffer, &S);
-    fft.Ifft(S, &s);
-    std::transform(y.begin(), y.end(), s.begin() + kFftLengthBy2,
-                   e_shadow.begin(),
-                   [&](float a, float b) { return a - b * kScale; });
-    std::for_each(e_shadow.begin(), e_shadow.end(),
-                  [](float& a) { a = rtc::SafeClamp(a, -32768.f, 32767.f); });
-    fft.ZeroPaddedFft(e_shadow, &E_shadow);
-
-    shadow_gain.Compute(render_buffer, render_signal_analyzer, E_shadow,
-                        shadow_filter.SizePartitions(), saturation, &G);
-    shadow_filter.Adapt(render_buffer, G);
-  }
-
-  std::copy(e_shadow.begin(), e_shadow.end(), e_last_block->begin());
-  std::copy(y.begin(), y.end(), y_last_block->begin());
-  std::copy(G.re.begin(), G.re.end(), G_last_block->re.begin());
-  std::copy(G.im.begin(), G.im.end(), G_last_block->im.begin());
-}
-
-std::string ProduceDebugText(size_t delay) {
-  std::ostringstream ss;
-  ss << ", Delay: " << delay;
-  return ss.str();
-}
-
-}  // namespace
-
-#if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
-
-// Verifies that the check for non-null output gain parameter works.
-TEST(ShadowFilterUpdateGain, NullDataOutputGain) {
-  ApmDataDumper data_dumper(42);
-  RenderBuffer render_buffer(Aec3Optimization::kNone, 3, 1,
-                             std::vector<size_t>(1, 1));
-  RenderSignalAnalyzer analyzer;
-  FftData E;
-  ShadowFilterUpdateGain gain;
-  EXPECT_DEATH(gain.Compute(render_buffer, analyzer, E, 1, false, nullptr), "");
-}
-
-#endif
-
-// Verifies that the gain formed causes the filter using it to converge.
-TEST(ShadowFilterUpdateGain, GainCausesFilterToConverge) {
-  std::vector<int> blocks_with_echo_path_changes;
-  std::vector<int> blocks_with_saturation;
-  for (size_t delay_samples : {0, 64, 150, 200, 301}) {
-    SCOPED_TRACE(ProduceDebugText(delay_samples));
-
-    std::array<float, kBlockSize> e;
-    std::array<float, kBlockSize> y;
-    FftData G;
-
-    RunFilterUpdateTest(500, delay_samples, blocks_with_saturation, &e, &y, &G);
-
-    // Verify that the main filter is able to perform well.
-    EXPECT_LT(1000 * std::inner_product(e.begin(), e.end(), e.begin(), 0.f),
-              std::inner_product(y.begin(), y.end(), y.begin(), 0.f));
-  }
-}
-
-// Verifies that the magnitude of the gain on average decreases for a
-// persistently exciting signal.
-TEST(ShadowFilterUpdateGain, DecreasingGain) {
-  std::vector<int> blocks_with_echo_path_changes;
-  std::vector<int> blocks_with_saturation;
-
-  std::array<float, kBlockSize> e;
-  std::array<float, kBlockSize> y;
-  FftData G_a;
-  FftData G_b;
-  FftData G_c;
-  std::array<float, kFftLengthBy2Plus1> G_a_power;
-  std::array<float, kFftLengthBy2Plus1> G_b_power;
-  std::array<float, kFftLengthBy2Plus1> G_c_power;
-
-  RunFilterUpdateTest(100, 65, blocks_with_saturation, &e, &y, &G_a);
-  RunFilterUpdateTest(200, 65, blocks_with_saturation, &e, &y, &G_b);
-  RunFilterUpdateTest(300, 65, blocks_with_saturation, &e, &y, &G_c);
-
-  G_a.Spectrum(Aec3Optimization::kNone, &G_a_power);
-  G_b.Spectrum(Aec3Optimization::kNone, &G_b_power);
-  G_c.Spectrum(Aec3Optimization::kNone, &G_c_power);
-
-  EXPECT_GT(std::accumulate(G_a_power.begin(), G_a_power.end(), 0.),
-            std::accumulate(G_b_power.begin(), G_b_power.end(), 0.));
-
-  EXPECT_GT(std::accumulate(G_b_power.begin(), G_b_power.end(), 0.),
-            std::accumulate(G_c_power.begin(), G_c_power.end(), 0.));
-}
-
-// Verifies that the gain is zero when there is saturation.
-TEST(ShadowFilterUpdateGain, SaturationBehavior) {
-  std::vector<int> blocks_with_echo_path_changes;
-  std::vector<int> blocks_with_saturation;
-  for (int k = 99; k < 200; ++k) {
-    blocks_with_saturation.push_back(k);
-  }
-
-  std::array<float, kBlockSize> e;
-  std::array<float, kBlockSize> y;
-  FftData G_a;
-  FftData G_a_ref;
-  G_a_ref.re.fill(0.f);
-  G_a_ref.im.fill(0.f);
-
-  RunFilterUpdateTest(100, 65, blocks_with_saturation, &e, &y, &G_a);
-
-  EXPECT_EQ(G_a_ref.re, G_a.re);
-  EXPECT_EQ(G_a_ref.im, G_a.im);
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/aec3/subtractor.cc b/modules/audio_processing/aec3/subtractor.cc
deleted file mode 100644
index f63505f..0000000
--- a/modules/audio_processing/aec3/subtractor.cc
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- *  Copyright (c) 2017 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_processing/aec3/subtractor.h"
-
-#include <algorithm>
-
-#include "webrtc/api/array_view.h"
-#include "webrtc/modules/audio_processing/logging/apm_data_dumper.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/safe_minmax.h"
-
-namespace webrtc {
-
-namespace {
-
-void PredictionError(const Aec3Fft& fft,
-                     const FftData& S,
-                     rtc::ArrayView<const float> y,
-                     std::array<float, kBlockSize>* e,
-                     FftData* E,
-                     std::array<float, kBlockSize>* s) {
-  std::array<float, kFftLength> s_scratch;
-  fft.Ifft(S, &s_scratch);
-  constexpr float kScale = 1.0f / kFftLengthBy2;
-  std::transform(y.begin(), y.end(), s_scratch.begin() + kFftLengthBy2,
-                 e->begin(), [&](float a, float b) { return a - b * kScale; });
-  std::for_each(e->begin(), e->end(),
-                [](float& a) { a = rtc::SafeClamp(a, -32768.f, 32767.f); });
-  fft.ZeroPaddedFft(*e, E);
-
-  if (s) {
-    for (size_t k = 0; k < s->size(); ++k) {
-      (*s)[k] = kScale * s_scratch[k + kFftLengthBy2];
-    }
-  }
-}
-}  // namespace
-
-Subtractor::Subtractor(ApmDataDumper* data_dumper,
-                       Aec3Optimization optimization)
-    : fft_(),
-      data_dumper_(data_dumper),
-      optimization_(optimization),
-      main_filter_(kAdaptiveFilterLength, optimization, data_dumper_),
-      shadow_filter_(kAdaptiveFilterLength, optimization, data_dumper_) {
-  RTC_DCHECK(data_dumper_);
-}
-
-Subtractor::~Subtractor() = default;
-
-void Subtractor::HandleEchoPathChange(
-    const EchoPathVariability& echo_path_variability) {
-  if (echo_path_variability.delay_change) {
-    main_filter_.HandleEchoPathChange();
-    shadow_filter_.HandleEchoPathChange();
-    G_main_.HandleEchoPathChange();
-    G_shadow_.HandleEchoPathChange();
-  }
-}
-
-void Subtractor::Process(const RenderBuffer& render_buffer,
-                         const rtc::ArrayView<const float> capture,
-                         const RenderSignalAnalyzer& render_signal_analyzer,
-                         const AecState& aec_state,
-                         SubtractorOutput* output) {
-  RTC_DCHECK_EQ(kBlockSize, capture.size());
-  rtc::ArrayView<const float> y = capture;
-  FftData& E_main = output->E_main;
-  FftData E_shadow;
-  std::array<float, kBlockSize>& e_main = output->e_main;
-  std::array<float, kBlockSize>& e_shadow = output->e_shadow;
-
-  FftData S;
-  FftData& G = S;
-
-  // Form the output of the main filter.
-  main_filter_.Filter(render_buffer, &S);
-  PredictionError(fft_, S, y, &e_main, &E_main, &output->s_main);
-
-  // Form the output of the shadow filter.
-  shadow_filter_.Filter(render_buffer, &S);
-  PredictionError(fft_, S, y, &e_shadow, &E_shadow, nullptr);
-
-  // Compute spectra for future use.
-  E_main.Spectrum(optimization_, &output->E2_main);
-  E_shadow.Spectrum(optimization_, &output->E2_shadow);
-
-  // Update the main filter.
-  G_main_.Compute(render_buffer, render_signal_analyzer, *output, main_filter_,
-                  aec_state.SaturatedCapture(), &G);
-  main_filter_.Adapt(render_buffer, G);
-  data_dumper_->DumpRaw("aec3_subtractor_G_main", G.re);
-  data_dumper_->DumpRaw("aec3_subtractor_G_main", G.im);
-
-  // Update the shadow filter.
-  G_shadow_.Compute(render_buffer, render_signal_analyzer, E_shadow,
-                    shadow_filter_.SizePartitions(),
-                    aec_state.SaturatedCapture(), &G);
-  shadow_filter_.Adapt(render_buffer, G);
-
-  data_dumper_->DumpRaw("aec3_subtractor_G_shadow", G.re);
-  data_dumper_->DumpRaw("aec3_subtractor_G_shadow", G.im);
-
-  main_filter_.DumpFilter("aec3_subtractor_H_main");
-  shadow_filter_.DumpFilter("aec3_subtractor_H_shadow");
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/aec3/subtractor.h b/modules/audio_processing/aec3/subtractor.h
deleted file mode 100644
index 777e4ff..0000000
--- a/modules/audio_processing/aec3/subtractor.h
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- *  Copyright (c) 2017 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_PROCESSING_AEC3_SUBTRACTOR_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_AEC3_SUBTRACTOR_H_
-
-#include <array>
-#include <algorithm>
-#include <vector>
-
-#include "webrtc/modules/audio_processing/aec3/adaptive_fir_filter.h"
-#include "webrtc/modules/audio_processing/aec3/aec3_common.h"
-#include "webrtc/modules/audio_processing/aec3/aec3_fft.h"
-#include "webrtc/modules/audio_processing/aec3/aec_state.h"
-#include "webrtc/modules/audio_processing/aec3/echo_path_variability.h"
-#include "webrtc/modules/audio_processing/aec3/main_filter_update_gain.h"
-#include "webrtc/modules/audio_processing/aec3/render_buffer.h"
-#include "webrtc/modules/audio_processing/aec3/shadow_filter_update_gain.h"
-#include "webrtc/modules/audio_processing/aec3/subtractor_output.h"
-#include "webrtc/modules/audio_processing/logging/apm_data_dumper.h"
-#include "webrtc/modules/audio_processing/utility/ooura_fft.h"
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace webrtc {
-
-// Proves linear echo cancellation functionality
-class Subtractor {
- public:
-  Subtractor(ApmDataDumper* data_dumper, Aec3Optimization optimization);
-  ~Subtractor();
-
-  // Performs the echo subtraction.
-  void Process(const RenderBuffer& render_buffer,
-               const rtc::ArrayView<const float> capture,
-               const RenderSignalAnalyzer& render_signal_analyzer,
-               const AecState& aec_state,
-               SubtractorOutput* output);
-
-  void HandleEchoPathChange(const EchoPathVariability& echo_path_variability);
-
-  // Returns the block-wise frequency response for the main adaptive filter.
-  const std::vector<std::array<float, kFftLengthBy2Plus1>>&
-  FilterFrequencyResponse() const {
-    return main_filter_.FilterFrequencyResponse();
-  }
-
-  // Returns the estimate of the impulse response for the main adaptive filter.
-  const std::array<float, kAdaptiveFilterTimeDomainLength>&
-  FilterImpulseResponse() const {
-    return main_filter_.FilterImpulseResponse();
-  }
-
- private:
-  const Aec3Fft fft_;
-  ApmDataDumper* data_dumper_;
-  const Aec3Optimization optimization_;
-  AdaptiveFirFilter main_filter_;
-  AdaptiveFirFilter shadow_filter_;
-  MainFilterUpdateGain G_main_;
-  ShadowFilterUpdateGain G_shadow_;
-
-  RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(Subtractor);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_AEC3_SUBTRACTOR_H_
diff --git a/modules/audio_processing/aec3/subtractor_output.h b/modules/audio_processing/aec3/subtractor_output.h
deleted file mode 100644
index 8755047..0000000
--- a/modules/audio_processing/aec3/subtractor_output.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- *  Copyright (c) 2017 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_PROCESSING_AEC3_SUBTRACTOR_OUTPUT_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_AEC3_SUBTRACTOR_OUTPUT_H_
-
-#include <array>
-
-#include "webrtc/modules/audio_processing/aec3/aec3_common.h"
-#include "webrtc/modules/audio_processing/aec3/fft_data.h"
-
-namespace webrtc {
-
-// Stores the values being returned from the echo subtractor.
-struct SubtractorOutput {
-  std::array<float, kBlockSize> s_main;
-  std::array<float, kBlockSize> e_main;
-  std::array<float, kBlockSize> e_shadow;
-  FftData E_main;
-  std::array<float, kFftLengthBy2Plus1> E2_main;
-  std::array<float, kFftLengthBy2Plus1> E2_shadow;
-
-  void Reset() {
-    s_main.fill(0.f);
-    e_main.fill(0.f);
-    e_shadow.fill(0.f);
-    E_main.re.fill(0.f);
-    E_main.im.fill(0.f);
-    E2_main.fill(0.f);
-    E2_shadow.fill(0.f);
-  }
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_AEC3_SUBTRACTOR_OUTPUT_H_
diff --git a/modules/audio_processing/aec3/subtractor_unittest.cc b/modules/audio_processing/aec3/subtractor_unittest.cc
deleted file mode 100644
index 07b1213..0000000
--- a/modules/audio_processing/aec3/subtractor_unittest.cc
+++ /dev/null
@@ -1,176 +0,0 @@
-/*
- *  Copyright (c) 2017 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_processing/aec3/subtractor.h"
-
-#include <algorithm>
-#include <numeric>
-#include <string>
-
-#include "webrtc/modules/audio_processing/aec3/aec_state.h"
-#include "webrtc/modules/audio_processing/test/echo_canceller_test_tools.h"
-#include "webrtc/rtc_base/random.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-namespace {
-
-float RunSubtractorTest(int num_blocks_to_process,
-                        int delay_samples,
-                        bool uncorrelated_inputs,
-                        const std::vector<int>& blocks_with_echo_path_changes) {
-  ApmDataDumper data_dumper(42);
-  Subtractor subtractor(&data_dumper, DetectOptimization());
-  std::vector<std::vector<float>> x(3, std::vector<float>(kBlockSize, 0.f));
-  std::vector<float> y(kBlockSize, 0.f);
-  std::array<float, kBlockSize> x_old;
-  SubtractorOutput output;
-  RenderBuffer render_buffer(Aec3Optimization::kNone, 3, kAdaptiveFilterLength,
-                             std::vector<size_t>(1, kAdaptiveFilterLength));
-  RenderSignalAnalyzer render_signal_analyzer;
-  Random random_generator(42U);
-  Aec3Fft fft;
-  std::array<float, kFftLengthBy2Plus1> Y2;
-  std::array<float, kFftLengthBy2Plus1> E2_main;
-  std::array<float, kFftLengthBy2Plus1> E2_shadow;
-  AecState aec_state(AudioProcessing::Config::EchoCanceller3{});
-  x_old.fill(0.f);
-  Y2.fill(0.f);
-  E2_main.fill(0.f);
-  E2_shadow.fill(0.f);
-
-  DelayBuffer<float> delay_buffer(delay_samples);
-  for (int k = 0; k < num_blocks_to_process; ++k) {
-    RandomizeSampleVector(&random_generator, x[0]);
-    if (uncorrelated_inputs) {
-      RandomizeSampleVector(&random_generator, y);
-    } else {
-      delay_buffer.Delay(x[0], y);
-    }
-    render_buffer.Insert(x);
-    render_signal_analyzer.Update(render_buffer, aec_state.FilterDelay());
-
-    // Handle echo path changes.
-    if (std::find(blocks_with_echo_path_changes.begin(),
-                  blocks_with_echo_path_changes.end(),
-                  k) != blocks_with_echo_path_changes.end()) {
-      subtractor.HandleEchoPathChange(EchoPathVariability(true, true));
-    }
-    subtractor.Process(render_buffer, y, render_signal_analyzer, aec_state,
-                       &output);
-
-    aec_state.HandleEchoPathChange(EchoPathVariability(false, false));
-    aec_state.Update(subtractor.FilterFrequencyResponse(),
-                     subtractor.FilterImpulseResponse(),
-                     rtc::Optional<size_t>(delay_samples / kBlockSize),
-                     render_buffer, E2_main, Y2, x[0], output.s_main, false);
-  }
-
-  const float output_power = std::inner_product(
-      output.e_main.begin(), output.e_main.end(), output.e_main.begin(), 0.f);
-  const float y_power = std::inner_product(y.begin(), y.end(), y.begin(), 0.f);
-  if (y_power == 0.f) {
-    ADD_FAILURE();
-    return -1.0;
-  }
-  return output_power / y_power;
-}
-
-std::string ProduceDebugText(size_t delay) {
-  std::ostringstream ss;
-  ss << "Delay: " << delay;
-  return ss.str();
-}
-
-}  // namespace
-
-#if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
-
-// Verifies that the check for non data dumper works.
-TEST(Subtractor, NullDataDumper) {
-  EXPECT_DEATH(Subtractor(nullptr, DetectOptimization()), "");
-}
-
-// Verifies the check for null subtractor output.
-// TODO(peah): Re-enable the test once the issue with memory leaks during DEATH
-// tests on test bots has been fixed.
-TEST(Subtractor, DISABLED_NullOutput) {
-  ApmDataDumper data_dumper(42);
-  Subtractor subtractor(&data_dumper, DetectOptimization());
-  RenderBuffer render_buffer(Aec3Optimization::kNone, 3, kAdaptiveFilterLength,
-                             std::vector<size_t>(1, kAdaptiveFilterLength));
-  RenderSignalAnalyzer render_signal_analyzer;
-  std::vector<float> y(kBlockSize, 0.f);
-
-  EXPECT_DEATH(
-      subtractor.Process(render_buffer, y, render_signal_analyzer,
-                         AecState(AudioProcessing::Config::EchoCanceller3{}),
-                         nullptr),
-      "");
-}
-
-// Verifies the check for the capture signal size.
-TEST(Subtractor, WrongCaptureSize) {
-  ApmDataDumper data_dumper(42);
-  Subtractor subtractor(&data_dumper, DetectOptimization());
-  RenderBuffer render_buffer(Aec3Optimization::kNone, 3, kAdaptiveFilterLength,
-                             std::vector<size_t>(1, kAdaptiveFilterLength));
-  RenderSignalAnalyzer render_signal_analyzer;
-  std::vector<float> y(kBlockSize - 1, 0.f);
-  SubtractorOutput output;
-
-  EXPECT_DEATH(
-      subtractor.Process(render_buffer, y, render_signal_analyzer,
-                         AecState(AudioProcessing::Config::EchoCanceller3{}),
-                         &output),
-      "");
-}
-
-#endif
-
-// Verifies that the subtractor is able to converge on correlated data.
-TEST(Subtractor, Convergence) {
-  std::vector<int> blocks_with_echo_path_changes;
-  for (size_t delay_samples : {0, 64, 150, 200, 301}) {
-    SCOPED_TRACE(ProduceDebugText(delay_samples));
-
-    float echo_to_nearend_power = RunSubtractorTest(
-        100, delay_samples, false, blocks_with_echo_path_changes);
-    EXPECT_GT(0.1f, echo_to_nearend_power);
-  }
-}
-
-// Verifies that the subtractor does not converge on uncorrelated signals.
-TEST(Subtractor, NonConvergenceOnUncorrelatedSignals) {
-  std::vector<int> blocks_with_echo_path_changes;
-  for (size_t delay_samples : {0, 64, 150, 200, 301}) {
-    SCOPED_TRACE(ProduceDebugText(delay_samples));
-
-    float echo_to_nearend_power = RunSubtractorTest(
-        100, delay_samples, true, blocks_with_echo_path_changes);
-    EXPECT_NEAR(1.f, echo_to_nearend_power, 0.05);
-  }
-}
-
-// Verifies that the subtractor is properly reset when there is an echo path
-// change.
-TEST(Subtractor, EchoPathChangeReset) {
-  std::vector<int> blocks_with_echo_path_changes;
-  blocks_with_echo_path_changes.push_back(99);
-  for (size_t delay_samples : {0, 64, 150, 200, 301}) {
-    SCOPED_TRACE(ProduceDebugText(delay_samples));
-
-    float echo_to_nearend_power = RunSubtractorTest(
-        100, delay_samples, false, blocks_with_echo_path_changes);
-    EXPECT_NEAR(1.f, echo_to_nearend_power, 0.0000001f);
-  }
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/aec3/suppression_filter.cc b/modules/audio_processing/aec3/suppression_filter.cc
deleted file mode 100644
index 5ad4911..0000000
--- a/modules/audio_processing/aec3/suppression_filter.cc
+++ /dev/null
@@ -1,172 +0,0 @@
-/*
- *  Copyright (c) 2017 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_processing/aec3/suppression_filter.h"
-
-#include <math.h>
-#include <algorithm>
-#include <cstring>
-#include <functional>
-#include <numeric>
-
-#include "webrtc/modules/audio_processing/utility/ooura_fft.h"
-#include "webrtc/rtc_base/safe_minmax.h"
-
-namespace webrtc {
-namespace {
-
-// Hanning window from Matlab command win = sqrt(hanning(128)).
-const float kSqrtHanning[kFftLength] = {
-    0.00000000000000f, 0.02454122852291f, 0.04906767432742f, 0.07356456359967f,
-    0.09801714032956f, 0.12241067519922f, 0.14673047445536f, 0.17096188876030f,
-    0.19509032201613f, 0.21910124015687f, 0.24298017990326f, 0.26671275747490f,
-    0.29028467725446f, 0.31368174039889f, 0.33688985339222f, 0.35989503653499f,
-    0.38268343236509f, 0.40524131400499f, 0.42755509343028f, 0.44961132965461f,
-    0.47139673682600f, 0.49289819222978f, 0.51410274419322f, 0.53499761988710f,
-    0.55557023301960f, 0.57580819141785f, 0.59569930449243f, 0.61523159058063f,
-    0.63439328416365f, 0.65317284295378f, 0.67155895484702f, 0.68954054473707f,
-    0.70710678118655f, 0.72424708295147f, 0.74095112535496f, 0.75720884650648f,
-    0.77301045336274f, 0.78834642762661f, 0.80320753148064f, 0.81758481315158f,
-    0.83146961230255f, 0.84485356524971f, 0.85772861000027f, 0.87008699110871f,
-    0.88192126434835f, 0.89322430119552f, 0.90398929312344f, 0.91420975570353f,
-    0.92387953251129f, 0.93299279883474f, 0.94154406518302f, 0.94952818059304f,
-    0.95694033573221f, 0.96377606579544f, 0.97003125319454f, 0.97570213003853f,
-    0.98078528040323f, 0.98527764238894f, 0.98917650996478f, 0.99247953459871f,
-    0.99518472667220f, 0.99729045667869f, 0.99879545620517f, 0.99969881869620f,
-    1.00000000000000f, 0.99969881869620f, 0.99879545620517f, 0.99729045667869f,
-    0.99518472667220f, 0.99247953459871f, 0.98917650996478f, 0.98527764238894f,
-    0.98078528040323f, 0.97570213003853f, 0.97003125319454f, 0.96377606579544f,
-    0.95694033573221f, 0.94952818059304f, 0.94154406518302f, 0.93299279883474f,
-    0.92387953251129f, 0.91420975570353f, 0.90398929312344f, 0.89322430119552f,
-    0.88192126434835f, 0.87008699110871f, 0.85772861000027f, 0.84485356524971f,
-    0.83146961230255f, 0.81758481315158f, 0.80320753148064f, 0.78834642762661f,
-    0.77301045336274f, 0.75720884650648f, 0.74095112535496f, 0.72424708295147f,
-    0.70710678118655f, 0.68954054473707f, 0.67155895484702f, 0.65317284295378f,
-    0.63439328416365f, 0.61523159058063f, 0.59569930449243f, 0.57580819141785f,
-    0.55557023301960f, 0.53499761988710f, 0.51410274419322f, 0.49289819222978f,
-    0.47139673682600f, 0.44961132965461f, 0.42755509343028f, 0.40524131400499f,
-    0.38268343236509f, 0.35989503653499f, 0.33688985339222f, 0.31368174039889f,
-    0.29028467725446f, 0.26671275747490f, 0.24298017990326f, 0.21910124015687f,
-    0.19509032201613f, 0.17096188876030f, 0.14673047445536f, 0.12241067519922f,
-    0.09801714032956f, 0.07356456359967f, 0.04906767432742f, 0.02454122852291f};
-
-}  // namespace
-
-SuppressionFilter::SuppressionFilter(int sample_rate_hz)
-    : sample_rate_hz_(sample_rate_hz),
-      fft_(),
-      e_output_old_(NumBandsForRate(sample_rate_hz_)) {
-  RTC_DCHECK(ValidFullBandRate(sample_rate_hz_));
-  e_input_old_.fill(0.f);
-  std::for_each(e_output_old_.begin(), e_output_old_.end(),
-                [](std::array<float, kFftLengthBy2>& a) { a.fill(0.f); });
-}
-
-SuppressionFilter::~SuppressionFilter() = default;
-
-void SuppressionFilter::ApplyGain(
-    const FftData& comfort_noise,
-    const FftData& comfort_noise_high_band,
-    const std::array<float, kFftLengthBy2Plus1>& suppression_gain,
-    float high_bands_gain,
-    std::vector<std::vector<float>>* e) {
-  RTC_DCHECK(e);
-  RTC_DCHECK_EQ(e->size(), NumBandsForRate(sample_rate_hz_));
-  FftData E;
-  std::array<float, kFftLength> e_extended;
-  constexpr float kIfftNormalization = 2.f / kFftLength;
-
-  // Analysis filterbank.
-  std::transform(e_input_old_.begin(), e_input_old_.end(),
-                 std::begin(kSqrtHanning), e_extended.begin(),
-                 std::multiplies<float>());
-  std::transform((*e)[0].begin(), (*e)[0].end(),
-                 std::begin(kSqrtHanning) + kFftLengthBy2,
-                 e_extended.begin() + kFftLengthBy2, std::multiplies<float>());
-  std::copy((*e)[0].begin(), (*e)[0].end(), e_input_old_.begin());
-  fft_.Fft(&e_extended, &E);
-
-  // Apply gain.
-  std::transform(suppression_gain.begin(), suppression_gain.end(), E.re.begin(),
-                 E.re.begin(), std::multiplies<float>());
-  std::transform(suppression_gain.begin(), suppression_gain.end(), E.im.begin(),
-                 E.im.begin(), std::multiplies<float>());
-
-  // Compute and add the comfort noise.
-  std::array<float, kFftLengthBy2Plus1> scaled_comfort_noise;
-  std::transform(suppression_gain.begin(), suppression_gain.end(),
-                 comfort_noise.re.begin(), scaled_comfort_noise.begin(),
-                 [](float a, float b) { return std::max(1.f - a, 0.f) * b; });
-  std::transform(scaled_comfort_noise.begin(), scaled_comfort_noise.end(),
-                 E.re.begin(), E.re.begin(), std::plus<float>());
-  std::transform(suppression_gain.begin(), suppression_gain.end(),
-                 comfort_noise.im.begin(), scaled_comfort_noise.begin(),
-                 [](float a, float b) { return std::max(1.f - a, 0.f) * b; });
-  std::transform(scaled_comfort_noise.begin(), scaled_comfort_noise.end(),
-                 E.im.begin(), E.im.begin(), std::plus<float>());
-
-  // Synthesis filterbank.
-  fft_.Ifft(E, &e_extended);
-  std::transform(e_output_old_[0].begin(), e_output_old_[0].end(),
-                 std::begin(kSqrtHanning) + kFftLengthBy2, (*e)[0].begin(),
-                 [&](float a, float b) { return kIfftNormalization * a * b; });
-  std::transform(e_extended.begin(), e_extended.begin() + kFftLengthBy2,
-                 std::begin(kSqrtHanning), e_extended.begin(),
-                 [&](float a, float b) { return kIfftNormalization * a * b; });
-  std::transform((*e)[0].begin(), (*e)[0].end(), e_extended.begin(),
-                 (*e)[0].begin(), std::plus<float>());
-  std::for_each((*e)[0].begin(), (*e)[0].end(), [](float& x_k) {
-    x_k = rtc::SafeClamp(x_k, -32768.f, 32767.f);
-  });
-  std::copy(e_extended.begin() + kFftLengthBy2, e_extended.begin() + kFftLength,
-            std::begin(e_output_old_[0]));
-
-  if (e->size() > 1) {
-    // Form time-domain high-band noise.
-    std::array<float, kFftLength> time_domain_high_band_noise;
-    std::transform(comfort_noise_high_band.re.begin(),
-                   comfort_noise_high_band.re.end(), E.re.begin(),
-                   [&](float a) { return kIfftNormalization * a; });
-    std::transform(comfort_noise_high_band.im.begin(),
-                   comfort_noise_high_band.im.end(), E.im.begin(),
-                   [&](float a) { return kIfftNormalization * a; });
-    fft_.Ifft(E, &time_domain_high_band_noise);
-
-    // Scale and apply the noise to the signals.
-    const float high_bands_noise_scaling =
-        0.4f * std::max(1.f - high_bands_gain, 0.f);
-
-    std::transform(
-        (*e)[1].begin(), (*e)[1].end(), time_domain_high_band_noise.begin(),
-        (*e)[1].begin(), [&](float a, float b) {
-          return std::max(
-              std::min(b * high_bands_noise_scaling + high_bands_gain * a,
-                       32767.0f),
-              -32768.0f);
-        });
-
-    if (e->size() > 2) {
-      RTC_DCHECK_EQ(3, e->size());
-      std::for_each((*e)[2].begin(), (*e)[2].end(), [&](float& a) {
-        a = rtc::SafeClamp(a * high_bands_gain, -32768.f, 32767.f);
-      });
-    }
-
-    std::array<float, kFftLengthBy2> tmp;
-    for (size_t k = 1; k < e->size(); ++k) {
-      std::copy((*e)[k].begin(), (*e)[k].end(), tmp.begin());
-      std::copy(e_output_old_[k].begin(), e_output_old_[k].end(),
-                (*e)[k].begin());
-      std::copy(tmp.begin(), tmp.end(), e_output_old_[k].begin());
-    }
-  }
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/aec3/suppression_filter.h b/modules/audio_processing/aec3/suppression_filter.h
deleted file mode 100644
index 44ce6be..0000000
--- a/modules/audio_processing/aec3/suppression_filter.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- *  Copyright (c) 2017 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_PROCESSING_AEC3_SUPPRESSION_FILTER_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_AEC3_SUPPRESSION_FILTER_H_
-
-#include <array>
-#include <vector>
-
-#include "webrtc/modules/audio_processing/aec3/aec3_common.h"
-#include "webrtc/modules/audio_processing/aec3/aec3_fft.h"
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace webrtc {
-
-class SuppressionFilter {
- public:
-  explicit SuppressionFilter(int sample_rate_hz);
-  ~SuppressionFilter();
-  void ApplyGain(const FftData& comfort_noise,
-                 const FftData& comfort_noise_high_bands,
-                 const std::array<float, kFftLengthBy2Plus1>& suppression_gain,
-                 float high_bands_gain,
-                 std::vector<std::vector<float>>* e);
-
- private:
-  const int sample_rate_hz_;
-  const OouraFft ooura_fft_;
-  const Aec3Fft fft_;
-  std::array<float, kFftLengthBy2> e_input_old_;
-  std::vector<std::array<float, kFftLengthBy2>> e_output_old_;
-  RTC_DISALLOW_COPY_AND_ASSIGN(SuppressionFilter);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_AEC3_SUPPRESSION_FILTER_H_
diff --git a/modules/audio_processing/aec3/suppression_filter_unittest.cc b/modules/audio_processing/aec3/suppression_filter_unittest.cc
deleted file mode 100644
index 312391b..0000000
--- a/modules/audio_processing/aec3/suppression_filter_unittest.cc
+++ /dev/null
@@ -1,181 +0,0 @@
-/*
- *  Copyright (c) 2017 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_processing/aec3/suppression_filter.h"
-
-#include <math.h>
-#include <algorithm>
-#include <numeric>
-
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-namespace {
-
-constexpr float kPi = 3.141592f;
-
-void ProduceSinusoid(int sample_rate_hz,
-                     float sinusoidal_frequency_hz,
-                     size_t* sample_counter,
-                     rtc::ArrayView<float> x) {
-  // Produce a sinusoid of the specified frequency.
-  for (size_t k = *sample_counter, j = 0; k < (*sample_counter + kBlockSize);
-       ++k, ++j) {
-    x[j] =
-        32767.f * sin(2.f * kPi * sinusoidal_frequency_hz * k / sample_rate_hz);
-  }
-  *sample_counter = *sample_counter + kBlockSize;
-}
-
-}  // namespace
-
-#if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
-
-// Verifies the check for null suppressor output.
-TEST(SuppressionFilter, NullOutput) {
-  FftData cn;
-  FftData cn_high_bands;
-  std::array<float, kFftLengthBy2Plus1> gain;
-
-  EXPECT_DEATH(SuppressionFilter(16000).ApplyGain(cn, cn_high_bands, gain, 1.0f,
-                                                  nullptr),
-               "");
-}
-
-// Verifies the check for allowed sample rate.
-TEST(SuppressionFilter, ProperSampleRate) {
-  EXPECT_DEATH(SuppressionFilter(16001), "");
-}
-
-#endif
-
-// Verifies that no comfort noise is added when the gain is 1.
-TEST(SuppressionFilter, ComfortNoiseInUnityGain) {
-  SuppressionFilter filter(48000);
-  FftData cn;
-  FftData cn_high_bands;
-  std::array<float, kFftLengthBy2Plus1> gain;
-
-  gain.fill(1.f);
-  cn.re.fill(1.f);
-  cn.im.fill(1.f);
-  cn_high_bands.re.fill(1.f);
-  cn_high_bands.im.fill(1.f);
-
-  std::vector<std::vector<float>> e(3, std::vector<float>(kBlockSize, 0.f));
-  std::vector<std::vector<float>> e_ref = e;
-  filter.ApplyGain(cn, cn_high_bands, gain, 1.f, &e);
-
-  for (size_t k = 0; k < e.size(); ++k) {
-    EXPECT_EQ(e_ref[k], e[k]);
-  }
-}
-
-// Verifies that the suppressor is able to suppress a signal.
-TEST(SuppressionFilter, SignalSuppression) {
-  SuppressionFilter filter(48000);
-  FftData cn;
-  FftData cn_high_bands;
-  std::array<float, kFftLengthBy2Plus1> gain;
-  std::vector<std::vector<float>> e(3, std::vector<float>(kBlockSize, 0.f));
-
-  gain.fill(1.f);
-  std::for_each(gain.begin() + 10, gain.end(), [](float& a) { a = 0.f; });
-
-  cn.re.fill(0.f);
-  cn.im.fill(0.f);
-  cn_high_bands.re.fill(0.f);
-  cn_high_bands.im.fill(0.f);
-
-  size_t sample_counter = 0;
-
-  float e0_input = 0.f;
-  float e0_output = 0.f;
-  for (size_t k = 0; k < 100; ++k) {
-    ProduceSinusoid(16000, 16000 * 40 / kFftLengthBy2 / 2, &sample_counter,
-                    e[0]);
-    e0_input =
-        std::inner_product(e[0].begin(), e[0].end(), e[0].begin(), e0_input);
-    filter.ApplyGain(cn, cn_high_bands, gain, 1.f, &e);
-    e0_output =
-        std::inner_product(e[0].begin(), e[0].end(), e[0].begin(), e0_output);
-  }
-
-  EXPECT_LT(e0_output, e0_input / 1000.f);
-}
-
-// Verifies that the suppressor is able to pass through a desired signal while
-// applying suppressing for some frequencies.
-TEST(SuppressionFilter, SignalTransparency) {
-  SuppressionFilter filter(48000);
-  FftData cn;
-  FftData cn_high_bands;
-  std::array<float, kFftLengthBy2Plus1> gain;
-  std::vector<std::vector<float>> e(3, std::vector<float>(kBlockSize, 0.f));
-
-  gain.fill(1.f);
-  std::for_each(gain.begin() + 30, gain.end(), [](float& a) { a = 0.f; });
-
-  cn.re.fill(0.f);
-  cn.im.fill(0.f);
-  cn_high_bands.re.fill(0.f);
-  cn_high_bands.im.fill(0.f);
-
-  size_t sample_counter = 0;
-
-  float e0_input = 0.f;
-  float e0_output = 0.f;
-  for (size_t k = 0; k < 100; ++k) {
-    ProduceSinusoid(16000, 16000 * 10 / kFftLengthBy2 / 2, &sample_counter,
-                    e[0]);
-    e0_input =
-        std::inner_product(e[0].begin(), e[0].end(), e[0].begin(), e0_input);
-    filter.ApplyGain(cn, cn_high_bands, gain, 1.f, &e);
-    e0_output =
-        std::inner_product(e[0].begin(), e[0].end(), e[0].begin(), e0_output);
-  }
-
-  EXPECT_LT(0.9f * e0_input, e0_output);
-}
-
-// Verifies that the suppressor delay.
-TEST(SuppressionFilter, Delay) {
-  SuppressionFilter filter(48000);
-  FftData cn;
-  FftData cn_high_bands;
-  std::array<float, kFftLengthBy2Plus1> gain;
-  std::vector<std::vector<float>> e(3, std::vector<float>(kBlockSize, 0.f));
-
-  gain.fill(1.f);
-
-  cn.re.fill(0.f);
-  cn.im.fill(0.f);
-  cn_high_bands.re.fill(0.f);
-  cn_high_bands.im.fill(0.f);
-
-  for (size_t k = 0; k < 100; ++k) {
-    for (size_t j = 0; j < 3; ++j) {
-      for (size_t i = 0; i < kBlockSize; ++i) {
-        e[j][i] = k * kBlockSize + i;
-      }
-    }
-
-    filter.ApplyGain(cn, cn_high_bands, gain, 1.f, &e);
-    if (k > 2) {
-      for (size_t j = 0; j < 2; ++j) {
-        for (size_t i = 0; i < kBlockSize; ++i) {
-          EXPECT_NEAR(k * kBlockSize + i - kBlockSize, e[j][i], 0.01);
-        }
-      }
-    }
-  }
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/aec3/suppression_gain.cc b/modules/audio_processing/aec3/suppression_gain.cc
deleted file mode 100644
index 8e78967..0000000
--- a/modules/audio_processing/aec3/suppression_gain.cc
+++ /dev/null
@@ -1,349 +0,0 @@
-/*
- *  Copyright (c) 2017 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_processing/aec3/suppression_gain.h"
-
-#include "webrtc/typedefs.h"
-#if defined(WEBRTC_ARCH_X86_FAMILY)
-#include <emmintrin.h>
-#endif
-#include <math.h>
-#include <algorithm>
-#include <functional>
-#include <numeric>
-
-#include "webrtc/modules/audio_processing/aec3/vector_math.h"
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-namespace {
-
-// Reduce gain to avoid narrow band echo leakage.
-void NarrowBandAttenuation(int narrow_bin,
-                           std::array<float, kFftLengthBy2Plus1>* gain) {
-  const int upper_bin =
-      std::min(narrow_bin + 6, static_cast<int>(kFftLengthBy2Plus1 - 1));
-  for (int k = std::max(0, narrow_bin - 6); k <= upper_bin; ++k) {
-    (*gain)[k] = std::min((*gain)[k], 0.001f);
-  }
-}
-
-// Adjust the gains according to the presence of known external filters.
-void AdjustForExternalFilters(std::array<float, kFftLengthBy2Plus1>* gain) {
-  // Limit the low frequency gains to avoid the impact of the high-pass filter
-  // on the lower-frequency gain influencing the overall achieved gain.
-  (*gain)[0] = (*gain)[1] = std::min((*gain)[1], (*gain)[2]);
-
-  // Limit the high frequency gains to avoid the impact of the anti-aliasing
-  // filter on the upper-frequency gains influencing the overall achieved
-  // gain. TODO(peah): Update this when new anti-aliasing filters are
-  // implemented.
-  constexpr size_t kAntiAliasingImpactLimit = (64 * 2000) / 8000;
-  const float min_upper_gain = (*gain)[kAntiAliasingImpactLimit];
-  std::for_each(
-      gain->begin() + kAntiAliasingImpactLimit, gain->end() - 1,
-      [min_upper_gain](float& a) { a = std::min(a, min_upper_gain); });
-  (*gain)[kFftLengthBy2] = (*gain)[kFftLengthBy2Minus1];
-}
-
-// Computes the gain to apply for the bands beyond the first band.
-float UpperBandsGain(
-    const rtc::Optional<int>& narrow_peak_band,
-    bool saturated_echo,
-    const std::vector<std::vector<float>>& render,
-    const std::array<float, kFftLengthBy2Plus1>& low_band_gain) {
-  RTC_DCHECK_LT(0, render.size());
-  if (render.size() == 1) {
-    return 1.f;
-  }
-
-  if (narrow_peak_band &&
-      (*narrow_peak_band > static_cast<int>(kFftLengthBy2Plus1 - 10))) {
-    return 0.001f;
-  }
-
-  constexpr size_t kLowBandGainLimit = kFftLengthBy2 / 2;
-  const float gain_below_8_khz = *std::min_element(
-      low_band_gain.begin() + kLowBandGainLimit, low_band_gain.end());
-
-  // Always attenuate the upper bands when there is saturated echo.
-  if (saturated_echo) {
-    return std::min(0.001f, gain_below_8_khz);
-  }
-
-  // Compute the upper and lower band energies.
-  const auto sum_of_squares = [](float a, float b) { return a + b * b; };
-  const float low_band_energy =
-      std::accumulate(render[0].begin(), render[0].end(), 0.f, sum_of_squares);
-  float high_band_energy = 0.f;
-  for (size_t k = 1; k < render.size(); ++k) {
-    const float energy = std::accumulate(render[k].begin(), render[k].end(),
-                                         0.f, sum_of_squares);
-    high_band_energy = std::max(high_band_energy, energy);
-  }
-
-  // If there is more power in the lower frequencies than the upper frequencies,
-  // or if the power in upper frequencies is low, do not bound the gain in the
-  // upper bands.
-  float anti_howling_gain;
-  constexpr float kThreshold = kSubBlockSize * 10.f * 10.f;
-  if (high_band_energy < std::max(low_band_energy, kThreshold)) {
-    anti_howling_gain = 1.f;
-  } else {
-    // In all other cases, bound the gain for upper frequencies.
-    RTC_DCHECK_LE(low_band_energy, high_band_energy);
-    RTC_DCHECK_NE(0.f, high_band_energy);
-    anti_howling_gain = 0.01f * sqrtf(low_band_energy / high_band_energy);
-  }
-
-  // Choose the gain as the minimum of the lower and upper gains.
-  return std::min(gain_below_8_khz, anti_howling_gain);
-}
-
-// Limits the gain increase.
-void UpdateMaxGainIncrease(
-    const AudioProcessing::Config::EchoCanceller3& config,
-    size_t no_saturation_counter,
-    bool low_noise_render,
-    const std::array<float, kFftLengthBy2Plus1>& last_echo,
-    const std::array<float, kFftLengthBy2Plus1>& echo,
-    const std::array<float, kFftLengthBy2Plus1>& last_gain,
-    const std::array<float, kFftLengthBy2Plus1>& new_gain,
-    std::array<float, kFftLengthBy2Plus1>* gain_increase) {
-  float max_increasing;
-  float max_decreasing;
-  float rate_increasing;
-  float rate_decreasing;
-  float min_increasing;
-  float min_decreasing;
-
-  auto& param = config.param.gain_updates;
-  if (low_noise_render) {
-    max_increasing = param.low_noise.max_inc;
-    max_decreasing = param.low_noise.max_dec;
-    rate_increasing = param.low_noise.rate_inc;
-    rate_decreasing = param.low_noise.rate_dec;
-    min_increasing = param.low_noise.min_inc;
-    min_decreasing = param.low_noise.min_dec;
-  } else if (no_saturation_counter > 10) {
-    max_increasing = param.normal.max_inc;
-    max_decreasing = param.normal.max_dec;
-    rate_increasing = param.normal.rate_inc;
-    rate_decreasing = param.normal.rate_dec;
-    min_increasing = param.normal.min_inc;
-    min_decreasing = param.normal.min_dec;
-  } else {
-    max_increasing = param.saturation.max_inc;
-    max_decreasing = param.saturation.max_dec;
-    rate_increasing = param.saturation.rate_inc;
-    rate_decreasing = param.saturation.rate_dec;
-    min_increasing = param.saturation.min_inc;
-    min_decreasing = param.saturation.min_dec;
-  }
-
-  for (size_t k = 0; k < new_gain.size(); ++k) {
-    if (echo[k] > last_echo[k]) {
-      (*gain_increase)[k] =
-          new_gain[k] > last_gain[k]
-              ? std::min(max_increasing, (*gain_increase)[k] * rate_increasing)
-              : min_increasing;
-    } else {
-      (*gain_increase)[k] =
-          new_gain[k] > last_gain[k]
-              ? std::min(max_decreasing, (*gain_increase)[k] * rate_decreasing)
-              : min_decreasing;
-    }
-  }
-}
-
-// Computes the gain to reduce the echo to a non audible level.
-void GainToNoAudibleEcho(
-    const AudioProcessing::Config::EchoCanceller3& config,
-    bool low_noise_render,
-    bool saturated_echo,
-    const std::array<float, kFftLengthBy2Plus1>& nearend,
-    const std::array<float, kFftLengthBy2Plus1>& echo,
-    const std::array<float, kFftLengthBy2Plus1>& masker,
-    const std::array<float, kFftLengthBy2Plus1>& min_gain,
-    const std::array<float, kFftLengthBy2Plus1>& max_gain,
-    const std::array<float, kFftLengthBy2Plus1>& one_by_echo,
-    std::array<float, kFftLengthBy2Plus1>* gain) {
-  const float nearend_masking_margin =
-      low_noise_render ? 0.1f
-                       : (saturated_echo ? config.param.gain_mask.m2
-                                         : config.param.gain_mask.m3);
-
-  for (size_t k = 0; k < gain->size(); ++k) {
-    RTC_DCHECK_LE(0.f, nearend_masking_margin * nearend[k]);
-    if (echo[k] <= nearend_masking_margin * nearend[k]) {
-      (*gain)[k] = 1.f;
-    } else {
-      (*gain)[k] = config.param.gain_mask.m1 * masker[k] * one_by_echo[k];
-    }
-
-    (*gain)[k] = std::min(std::max((*gain)[k], min_gain[k]), max_gain[k]);
-  }
-}
-
-// Computes the signal output power that masks the echo signal.
-void MaskingPower(const AudioProcessing::Config::EchoCanceller3& config,
-                  const std::array<float, kFftLengthBy2Plus1>& nearend,
-                  const std::array<float, kFftLengthBy2Plus1>& comfort_noise,
-                  const std::array<float, kFftLengthBy2Plus1>& last_masker,
-                  const std::array<float, kFftLengthBy2Plus1>& gain,
-                  std::array<float, kFftLengthBy2Plus1>* masker) {
-  std::array<float, kFftLengthBy2Plus1> side_band_masker;
-  for (size_t k = 0; k < gain.size(); ++k) {
-    side_band_masker[k] = nearend[k] * gain[k] + comfort_noise[k];
-    (*masker)[k] =
-        comfort_noise[k] + config.param.gain_mask.m4 * last_masker[k];
-  }
-  for (size_t k = 1; k < gain.size() - 1; ++k) {
-    (*masker)[k] += 0.1f * (side_band_masker[k - 1] + side_band_masker[k + 1]);
-  }
-}
-
-}  // namespace
-
-// TODO(peah): Add further optimizations, in particular for the divisions.
-void SuppressionGain::LowerBandGain(
-    bool low_noise_render,
-    const rtc::Optional<int>& narrow_peak_band,
-    bool saturated_echo,
-    const std::array<float, kFftLengthBy2Plus1>& nearend,
-    const std::array<float, kFftLengthBy2Plus1>& echo,
-    const std::array<float, kFftLengthBy2Plus1>& comfort_noise,
-    std::array<float, kFftLengthBy2Plus1>* gain) {
-  // Count the number of blocks since saturation.
-  no_saturation_counter_ = saturated_echo ? 0 : no_saturation_counter_ + 1;
-
-  // Precompute 1/echo (note that when the echo is zero, the precomputed value
-  // is never used).
-  std::array<float, kFftLengthBy2Plus1> one_by_echo;
-  std::transform(echo.begin(), echo.end(), one_by_echo.begin(),
-                 [](float a) { return a > 0.f ? 1.f / a : 1.f; });
-
-  // Compute the minimum gain as the attenuating gain to put the signal just
-  // above the zero sample values.
-  std::array<float, kFftLengthBy2Plus1> min_gain;
-  const float min_echo_power =
-      low_noise_render ? config_.param.echo_audibility.low_render_limit
-                       : config_.param.echo_audibility.normal_render_limit;
-  if (no_saturation_counter_ > 10) {
-    for (size_t k = 0; k < nearend.size(); ++k) {
-      const float denom = std::min(nearend[k], echo[k]);
-      min_gain[k] = denom > 0.f ? min_echo_power / denom : 1.f;
-      min_gain[k] = std::min(min_gain[k], 1.f);
-    }
-  } else {
-    min_gain.fill(0.f);
-  }
-
-  // Compute the maximum gain by limiting the gain increase from the previous
-  // gain.
-  std::array<float, kFftLengthBy2Plus1> max_gain;
-  for (size_t k = 0; k < gain->size(); ++k) {
-    max_gain[k] =
-        std::min(std::max(last_gain_[k] * gain_increase_[k],
-                          config_.param.gain_updates.floor_first_increase),
-                 1.f);
-  }
-
-  // Iteratively compute the gain required to attenuate the echo to a non
-  // noticeable level.
-  gain->fill(0.f);
-  for (int k = 0; k < 2; ++k) {
-    std::array<float, kFftLengthBy2Plus1> masker;
-    MaskingPower(config_, nearend, comfort_noise, last_masker_, *gain, &masker);
-    GainToNoAudibleEcho(config_, low_noise_render, saturated_echo, nearend,
-                        echo, masker, min_gain, max_gain, one_by_echo, gain);
-    AdjustForExternalFilters(gain);
-    if (narrow_peak_band) {
-      NarrowBandAttenuation(*narrow_peak_band, gain);
-    }
-  }
-
-  // Update the allowed maximum gain increase.
-  UpdateMaxGainIncrease(config_, no_saturation_counter_, low_noise_render,
-                        last_echo_, echo, last_gain_, *gain, &gain_increase_);
-
-  // Store data required for the gain computation of the next block.
-  std::copy(echo.begin(), echo.end(), last_echo_.begin());
-  std::copy(gain->begin(), gain->end(), last_gain_.begin());
-  MaskingPower(config_, nearend, comfort_noise, last_masker_, *gain,
-               &last_masker_);
-  aec3::VectorMath(optimization_).Sqrt(*gain);
-}
-
-SuppressionGain::SuppressionGain(
-    const AudioProcessing::Config::EchoCanceller3& config,
-    Aec3Optimization optimization)
-    : optimization_(optimization), config_(config) {
-  last_gain_.fill(1.f);
-  last_masker_.fill(0.f);
-  gain_increase_.fill(1.f);
-  last_echo_.fill(0.f);
-}
-
-void SuppressionGain::GetGain(
-    const std::array<float, kFftLengthBy2Plus1>& nearend,
-    const std::array<float, kFftLengthBy2Plus1>& echo,
-    const std::array<float, kFftLengthBy2Plus1>& comfort_noise,
-    const RenderSignalAnalyzer& render_signal_analyzer,
-    bool saturated_echo,
-    const std::vector<std::vector<float>>& render,
-    bool force_zero_gain,
-    float* high_bands_gain,
-    std::array<float, kFftLengthBy2Plus1>* low_band_gain) {
-  RTC_DCHECK(high_bands_gain);
-  RTC_DCHECK(low_band_gain);
-
-  if (force_zero_gain) {
-    last_gain_.fill(0.f);
-    std::copy(comfort_noise.begin(), comfort_noise.end(), last_masker_.begin());
-    low_band_gain->fill(0.f);
-    gain_increase_.fill(1.f);
-    *high_bands_gain = 0.f;
-    return;
-  }
-
-  bool low_noise_render = low_render_detector_.Detect(render);
-
-  // Compute gain for the lower band.
-  const rtc::Optional<int> narrow_peak_band =
-      render_signal_analyzer.NarrowPeakBand();
-  LowerBandGain(low_noise_render, narrow_peak_band, saturated_echo, nearend,
-                echo, comfort_noise, low_band_gain);
-
-  // Compute the gain for the upper bands.
-  *high_bands_gain =
-      UpperBandsGain(narrow_peak_band, saturated_echo, render, *low_band_gain);
-}
-
-// Detects when the render signal can be considered to have low power and
-// consist of stationary noise.
-bool SuppressionGain::LowNoiseRenderDetector::Detect(
-    const std::vector<std::vector<float>>& render) {
-  float x2_sum = 0.f;
-  float x2_max = 0.f;
-  for (auto x_k : render[0]) {
-    const float x2 = x_k * x_k;
-    x2_sum += x2;
-    x2_max = std::max(x2_max, x2);
-  }
-
-  constexpr float kThreshold = 50.f * 50.f * 64.f;
-  const bool low_noise_render =
-      average_power_ < kThreshold && x2_max < 3 * average_power_;
-  average_power_ = average_power_ * 0.9f + x2_sum * 0.1f;
-  return low_noise_render;
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/aec3/suppression_gain.h b/modules/audio_processing/aec3/suppression_gain.h
deleted file mode 100644
index 2d618c3..0000000
--- a/modules/audio_processing/aec3/suppression_gain.h
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- *  Copyright (c) 2017 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_PROCESSING_AEC3_SUPPRESSION_GAIN_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_AEC3_SUPPRESSION_GAIN_H_
-
-#include <array>
-#include <vector>
-
-#include "webrtc/modules/audio_processing/aec3/aec3_common.h"
-#include "webrtc/modules/audio_processing/aec3/render_signal_analyzer.h"
-#include "webrtc/modules/audio_processing/include/audio_processing.h"
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace webrtc {
-
-class SuppressionGain {
- public:
-  SuppressionGain(const AudioProcessing::Config::EchoCanceller3& config,
-                  Aec3Optimization optimization);
-  void GetGain(const std::array<float, kFftLengthBy2Plus1>& nearend,
-               const std::array<float, kFftLengthBy2Plus1>& echo,
-               const std::array<float, kFftLengthBy2Plus1>& comfort_noise,
-               const RenderSignalAnalyzer& render_signal_analyzer,
-               bool saturated_echo,
-               const std::vector<std::vector<float>>& render,
-               bool force_zero_gain,
-               float* high_bands_gain,
-               std::array<float, kFftLengthBy2Plus1>* low_band_gain);
-
- private:
-  void LowerBandGain(bool stationary_with_low_power,
-                     const rtc::Optional<int>& narrow_peak_band,
-                     bool saturated_echo,
-                     const std::array<float, kFftLengthBy2Plus1>& nearend,
-                     const std::array<float, kFftLengthBy2Plus1>& echo,
-                     const std::array<float, kFftLengthBy2Plus1>& comfort_noise,
-                     std::array<float, kFftLengthBy2Plus1>* gain);
-
-  class LowNoiseRenderDetector {
-   public:
-    bool Detect(const std::vector<std::vector<float>>& render);
-
-   private:
-    float average_power_ = 32768.f * 32768.f;
-  };
-
-  const Aec3Optimization optimization_;
-  std::array<float, kFftLengthBy2Plus1> last_gain_;
-  std::array<float, kFftLengthBy2Plus1> last_masker_;
-  std::array<float, kFftLengthBy2Plus1> gain_increase_;
-  std::array<float, kFftLengthBy2Plus1> last_echo_;
-
-  LowNoiseRenderDetector low_render_detector_;
-  size_t no_saturation_counter_ = 0;
-  const AudioProcessing::Config::EchoCanceller3 config_;
-  RTC_DISALLOW_COPY_AND_ASSIGN(SuppressionGain);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_AEC3_SUPPRESSION_GAIN_H_
diff --git a/modules/audio_processing/aec3/suppression_gain_unittest.cc b/modules/audio_processing/aec3/suppression_gain_unittest.cc
deleted file mode 100644
index cde3c94..0000000
--- a/modules/audio_processing/aec3/suppression_gain_unittest.cc
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- *  Copyright (c) 2017 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_processing/aec3/suppression_gain.h"
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/system_wrappers/include/cpu_features_wrapper.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-namespace aec3 {
-
-#if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
-
-// Verifies that the check for non-null output gains works.
-TEST(SuppressionGain, NullOutputGains) {
-  std::array<float, kFftLengthBy2Plus1> E2;
-  std::array<float, kFftLengthBy2Plus1> R2;
-  std::array<float, kFftLengthBy2Plus1> N2;
-  E2.fill(0.f);
-  R2.fill(0.f);
-  N2.fill(0.f);
-  float high_bands_gain;
-  EXPECT_DEATH(SuppressionGain(AudioProcessing::Config::EchoCanceller3{},
-                               DetectOptimization())
-                   .GetGain(E2, R2, N2, RenderSignalAnalyzer(), false,
-                            std::vector<std::vector<float>>(
-                                3, std::vector<float>(kBlockSize, 0.f)),
-                            false, &high_bands_gain, nullptr),
-               "");
-}
-
-#endif
-
-// Does a sanity check that the gains are correctly computed.
-TEST(SuppressionGain, BasicGainComputation) {
-  SuppressionGain suppression_gain(AudioProcessing::Config::EchoCanceller3(),
-                                   DetectOptimization());
-  RenderSignalAnalyzer analyzer;
-  float high_bands_gain;
-  std::array<float, kFftLengthBy2Plus1> E2;
-  std::array<float, kFftLengthBy2Plus1> R2;
-  std::array<float, kFftLengthBy2Plus1> N2;
-  std::array<float, kFftLengthBy2Plus1> g;
-  std::vector<std::vector<float>> x(1, std::vector<float>(kBlockSize, 0.f));
-
-  // Ensure that a strong noise is detected to mask any echoes.
-  E2.fill(10.f);
-  R2.fill(0.1f);
-  N2.fill(100.f);
-  for (int k = 0; k < 10; ++k) {
-    suppression_gain.GetGain(E2, R2, N2, analyzer, false, x, false,
-                             &high_bands_gain, &g);
-  }
-  std::for_each(g.begin(), g.end(),
-                [](float a) { EXPECT_NEAR(1.f, a, 0.001); });
-
-  // Ensure that a strong nearend is detected to mask any echoes.
-  E2.fill(100.f);
-  R2.fill(0.1f);
-  N2.fill(0.f);
-  for (int k = 0; k < 10; ++k) {
-    suppression_gain.GetGain(E2, R2, N2, analyzer, false, x, false,
-                             &high_bands_gain, &g);
-  }
-  std::for_each(g.begin(), g.end(),
-                [](float a) { EXPECT_NEAR(1.f, a, 0.001); });
-
-  // Ensure that a strong echo is suppressed.
-  E2.fill(1000000000.f);
-  R2.fill(10000000000000.f);
-  N2.fill(0.f);
-  for (int k = 0; k < 10; ++k) {
-    suppression_gain.GetGain(E2, R2, N2, analyzer, false, x, false,
-                             &high_bands_gain, &g);
-  }
-  std::for_each(g.begin(), g.end(),
-                [](float a) { EXPECT_NEAR(0.f, a, 0.001); });
-
-  // Verify the functionality for forcing a zero gain.
-  suppression_gain.GetGain(E2, R2, N2, analyzer, false, x, true,
-                           &high_bands_gain, &g);
-  std::for_each(g.begin(), g.end(), [](float a) { EXPECT_FLOAT_EQ(0.f, a); });
-  EXPECT_FLOAT_EQ(0.f, high_bands_gain);
-}
-
-}  // namespace aec3
-}  // namespace webrtc
diff --git a/modules/audio_processing/aec3/vector_math.h b/modules/audio_processing/aec3/vector_math.h
deleted file mode 100644
index d1a7e51..0000000
--- a/modules/audio_processing/aec3/vector_math.h
+++ /dev/null
@@ -1,212 +0,0 @@
-/*
- *  Copyright (c) 2017 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_PROCESSING_AEC3_VECTOR_MATH_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_AEC3_VECTOR_MATH_H_
-
-#include "webrtc/typedefs.h"
-#if defined(WEBRTC_HAS_NEON)
-#include <arm_neon.h>
-#endif
-#if defined(WEBRTC_ARCH_X86_FAMILY)
-#include <emmintrin.h>
-#endif
-#include <math.h>
-#include <algorithm>
-#include <array>
-#include <functional>
-
-#include "webrtc/api/array_view.h"
-#include "webrtc/modules/audio_processing/aec3/aec3_common.h"
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-namespace aec3 {
-
-// Provides optimizations for mathematical operations based on vectors.
-class VectorMath {
- public:
-  explicit VectorMath(Aec3Optimization optimization)
-      : optimization_(optimization) {}
-
-  // Elementwise square root.
-  void Sqrt(rtc::ArrayView<float> x) {
-    switch (optimization_) {
-#if defined(WEBRTC_ARCH_X86_FAMILY)
-      case Aec3Optimization::kSse2: {
-        const int x_size = static_cast<int>(x.size());
-        const int vector_limit = x_size >> 2;
-
-        int j = 0;
-        for (; j < vector_limit * 4; j += 4) {
-          __m128 g = _mm_loadu_ps(&x[j]);
-          g = _mm_sqrt_ps(g);
-          _mm_storeu_ps(&x[j], g);
-        }
-
-        for (; j < x_size; ++j) {
-          x[j] = sqrtf(x[j]);
-        }
-      } break;
-#endif
-#if defined(WEBRTC_HAS_NEON)
-      case Aec3Optimization::kNeon: {
-        const int x_size = static_cast<int>(x.size());
-        const int vector_limit = x_size >> 2;
-
-        int j = 0;
-        for (; j < vector_limit * 4; j += 4) {
-          float32x4_t g = vld1q_f32(&x[j]);
-#if !defined(WEBRTC_ARCH_ARM64)
-          float32x4_t y = vrsqrteq_f32(g);
-
-          // Code to handle sqrt(0).
-          // If the input to sqrtf() is zero, a zero will be returned.
-          // If the input to vrsqrteq_f32() is zero, positive infinity is
-          // returned.
-          const uint32x4_t vec_p_inf = vdupq_n_u32(0x7F800000);
-          // check for divide by zero
-          const uint32x4_t div_by_zero =
-              vceqq_u32(vec_p_inf, vreinterpretq_u32_f32(y));
-          // zero out the positive infinity results
-          y = vreinterpretq_f32_u32(
-              vandq_u32(vmvnq_u32(div_by_zero), vreinterpretq_u32_f32(y)));
-          // from arm documentation
-          // The Newton-Raphson iteration:
-          //     y[n+1] = y[n] * (3 - d * (y[n] * y[n])) / 2)
-          // converges to (1/√d) if y0 is the result of VRSQRTE applied to d.
-          //
-          // Note: The precision did not improve after 2 iterations.
-          for (int i = 0; i < 2; i++) {
-            y = vmulq_f32(vrsqrtsq_f32(vmulq_f32(y, y), g), y);
-          }
-          // sqrt(g) = g * 1/sqrt(g)
-          g = vmulq_f32(g, y);
-#else
-          g = vsqrtq_f32(g);
-#endif
-          vst1q_f32(&x[j], g);
-        }
-
-        for (; j < x_size; ++j) {
-          x[j] = sqrtf(x[j]);
-        }
-      }
-#endif
-      break;
-      default:
-        std::for_each(x.begin(), x.end(), [](float& a) { a = sqrtf(a); });
-    }
-  }
-
-  // Elementwise vector multiplication z = x * y.
-  void Multiply(rtc::ArrayView<const float> x,
-                rtc::ArrayView<const float> y,
-                rtc::ArrayView<float> z) {
-    RTC_DCHECK_EQ(z.size(), x.size());
-    RTC_DCHECK_EQ(z.size(), y.size());
-    switch (optimization_) {
-#if defined(WEBRTC_ARCH_X86_FAMILY)
-      case Aec3Optimization::kSse2: {
-        const int x_size = static_cast<int>(x.size());
-        const int vector_limit = x_size >> 2;
-
-        int j = 0;
-        for (; j < vector_limit * 4; j += 4) {
-          const __m128 x_j = _mm_loadu_ps(&x[j]);
-          const __m128 y_j = _mm_loadu_ps(&y[j]);
-          const __m128 z_j = _mm_mul_ps(x_j, y_j);
-          _mm_storeu_ps(&z[j], z_j);
-        }
-
-        for (; j < x_size; ++j) {
-          z[j] = x[j] * y[j];
-        }
-      } break;
-#endif
-#if defined(WEBRTC_HAS_NEON)
-      case Aec3Optimization::kNeon: {
-        const int x_size = static_cast<int>(x.size());
-        const int vector_limit = x_size >> 2;
-
-        int j = 0;
-        for (; j < vector_limit * 4; j += 4) {
-          const float32x4_t x_j = vld1q_f32(&x[j]);
-          const float32x4_t y_j = vld1q_f32(&y[j]);
-          const float32x4_t z_j = vmulq_f32(x_j, y_j);
-          vst1q_f32(&z[j], z_j);
-        }
-
-        for (; j < x_size; ++j) {
-          z[j] = x[j] * y[j];
-        }
-      } break;
-#endif
-      default:
-        std::transform(x.begin(), x.end(), y.begin(), z.begin(),
-                       std::multiplies<float>());
-    }
-  }
-
-  // Elementwise vector accumulation z += x.
-  void Accumulate(rtc::ArrayView<const float> x, rtc::ArrayView<float> z) {
-    RTC_DCHECK_EQ(z.size(), x.size());
-    switch (optimization_) {
-#if defined(WEBRTC_ARCH_X86_FAMILY)
-      case Aec3Optimization::kSse2: {
-        const int x_size = static_cast<int>(x.size());
-        const int vector_limit = x_size >> 2;
-
-        int j = 0;
-        for (; j < vector_limit * 4; j += 4) {
-          const __m128 x_j = _mm_loadu_ps(&x[j]);
-          __m128 z_j = _mm_loadu_ps(&z[j]);
-          z_j = _mm_add_ps(x_j, z_j);
-          _mm_storeu_ps(&z[j], z_j);
-        }
-
-        for (; j < x_size; ++j) {
-          z[j] += x[j];
-        }
-      } break;
-#endif
-#if defined(WEBRTC_HAS_NEON)
-      case Aec3Optimization::kNeon: {
-        const int x_size = static_cast<int>(x.size());
-        const int vector_limit = x_size >> 2;
-
-        int j = 0;
-        for (; j < vector_limit * 4; j += 4) {
-          const float32x4_t x_j = vld1q_f32(&x[j]);
-          float32x4_t z_j = vld1q_f32(&z[j]);
-          z_j = vaddq_f32(z_j, x_j);
-          vst1q_f32(&z[j], z_j);
-        }
-
-        for (; j < x_size; ++j) {
-          z[j] += x[j];
-        }
-      } break;
-#endif
-      default:
-        std::transform(x.begin(), x.end(), z.begin(), z.begin(),
-                       std::plus<float>());
-    }
-  }
-
- private:
-  Aec3Optimization optimization_;
-};
-
-}  // namespace aec3
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_AEC3_VECTOR_MATH_H_
diff --git a/modules/audio_processing/aec3/vector_math_unittest.cc b/modules/audio_processing/aec3/vector_math_unittest.cc
deleted file mode 100644
index 924ce31..0000000
--- a/modules/audio_processing/aec3/vector_math_unittest.cc
+++ /dev/null
@@ -1,146 +0,0 @@
-/*
- *  Copyright (c) 2017 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_processing/aec3/vector_math.h"
-
-#include <math.h>
-
-#include "webrtc/system_wrappers/include/cpu_features_wrapper.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-#if defined(WEBRTC_HAS_NEON)
-
-TEST(VectorMath, Sqrt) {
-  std::array<float, kFftLengthBy2Plus1> x;
-  std::array<float, kFftLengthBy2Plus1> z;
-  std::array<float, kFftLengthBy2Plus1> z_neon;
-
-  for (size_t k = 0; k < x.size(); ++k) {
-    x[k] = (2.f / 3.f) * k;
-  }
-
-  std::copy(x.begin(), x.end(), z.begin());
-  aec3::VectorMath(Aec3Optimization::kNone).Sqrt(z);
-  std::copy(x.begin(), x.end(), z_neon.begin());
-  aec3::VectorMath(Aec3Optimization::kNeon).Sqrt(z_neon);
-  for (size_t k = 0; k < z.size(); ++k) {
-    EXPECT_NEAR(z[k], z_neon[k], 0.0001f);
-    EXPECT_NEAR(sqrtf(x[k]), z_neon[k], 0.0001f);
-  }
-}
-
-TEST(VectorMath, Multiply) {
-  std::array<float, kFftLengthBy2Plus1> x;
-  std::array<float, kFftLengthBy2Plus1> y;
-  std::array<float, kFftLengthBy2Plus1> z;
-  std::array<float, kFftLengthBy2Plus1> z_neon;
-
-  for (size_t k = 0; k < x.size(); ++k) {
-    x[k] = k;
-    y[k] = (2.f / 3.f) * k;
-  }
-
-  aec3::VectorMath(Aec3Optimization::kNone).Multiply(x, y, z);
-  aec3::VectorMath(Aec3Optimization::kNeon).Multiply(x, y, z_neon);
-  for (size_t k = 0; k < z.size(); ++k) {
-    EXPECT_FLOAT_EQ(z[k], z_neon[k]);
-    EXPECT_FLOAT_EQ(x[k] * y[k], z_neon[k]);
-  }
-}
-
-TEST(VectorMath, Accumulate) {
-  std::array<float, kFftLengthBy2Plus1> x;
-  std::array<float, kFftLengthBy2Plus1> z;
-  std::array<float, kFftLengthBy2Plus1> z_neon;
-
-  for (size_t k = 0; k < x.size(); ++k) {
-    x[k] = k;
-    z[k] = z_neon[k] = 2.f * k;
-  }
-
-  aec3::VectorMath(Aec3Optimization::kNone).Accumulate(x, z);
-  aec3::VectorMath(Aec3Optimization::kNeon).Accumulate(x, z_neon);
-  for (size_t k = 0; k < z.size(); ++k) {
-    EXPECT_FLOAT_EQ(z[k], z_neon[k]);
-    EXPECT_FLOAT_EQ(x[k] + 2.f * x[k], z_neon[k]);
-  }
-}
-#endif
-
-#if defined(WEBRTC_ARCH_X86_FAMILY)
-
-TEST(VectorMath, Sqrt) {
-  if (WebRtc_GetCPUInfo(kSSE2) != 0) {
-    std::array<float, kFftLengthBy2Plus1> x;
-    std::array<float, kFftLengthBy2Plus1> z;
-    std::array<float, kFftLengthBy2Plus1> z_sse2;
-
-    for (size_t k = 0; k < x.size(); ++k) {
-      x[k] = (2.f / 3.f) * k;
-    }
-
-    std::copy(x.begin(), x.end(), z.begin());
-    aec3::VectorMath(Aec3Optimization::kNone).Sqrt(z);
-    std::copy(x.begin(), x.end(), z_sse2.begin());
-    aec3::VectorMath(Aec3Optimization::kSse2).Sqrt(z_sse2);
-    EXPECT_EQ(z, z_sse2);
-    for (size_t k = 0; k < z.size(); ++k) {
-      EXPECT_FLOAT_EQ(z[k], z_sse2[k]);
-      EXPECT_FLOAT_EQ(sqrtf(x[k]), z_sse2[k]);
-    }
-  }
-}
-
-TEST(VectorMath, Multiply) {
-  if (WebRtc_GetCPUInfo(kSSE2) != 0) {
-    std::array<float, kFftLengthBy2Plus1> x;
-    std::array<float, kFftLengthBy2Plus1> y;
-    std::array<float, kFftLengthBy2Plus1> z;
-    std::array<float, kFftLengthBy2Plus1> z_sse2;
-
-    for (size_t k = 0; k < x.size(); ++k) {
-      x[k] = k;
-      y[k] = (2.f / 3.f) * k;
-    }
-
-    aec3::VectorMath(Aec3Optimization::kNone).Multiply(x, y, z);
-    aec3::VectorMath(Aec3Optimization::kSse2).Multiply(x, y, z_sse2);
-    for (size_t k = 0; k < z.size(); ++k) {
-      EXPECT_FLOAT_EQ(z[k], z_sse2[k]);
-      EXPECT_FLOAT_EQ(x[k] * y[k], z_sse2[k]);
-    }
-  }
-}
-
-TEST(VectorMath, Accumulate) {
-  if (WebRtc_GetCPUInfo(kSSE2) != 0) {
-    std::array<float, kFftLengthBy2Plus1> x;
-    std::array<float, kFftLengthBy2Plus1> z;
-    std::array<float, kFftLengthBy2Plus1> z_sse2;
-
-    for (size_t k = 0; k < x.size(); ++k) {
-      x[k] = k;
-      z[k] = z_sse2[k] = 2.f * k;
-    }
-
-    aec3::VectorMath(Aec3Optimization::kNone).Accumulate(x, z);
-    aec3::VectorMath(Aec3Optimization::kSse2).Accumulate(x, z_sse2);
-    for (size_t k = 0; k < z.size(); ++k) {
-      EXPECT_FLOAT_EQ(z[k], z_sse2[k]);
-      EXPECT_FLOAT_EQ(x[k] + 2.f * x[k], z_sse2[k]);
-    }
-  }
-}
-#endif
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/aec_dump/BUILD.gn b/modules/audio_processing/aec_dump/BUILD.gn
deleted file mode 100644
index 818a9bf..0000000
--- a/modules/audio_processing/aec_dump/BUILD.gn
+++ /dev/null
@@ -1,114 +0,0 @@
-# Copyright (c) 2017 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.
-
-import("../../../webrtc.gni")  # This contains def of 'rtc_enable_protobuf'
-
-rtc_source_set("aec_dump") {
-  sources = [
-    "aec_dump_factory.h",
-  ]
-
-  public_deps = [
-    "..:aec_dump_interface",
-  ]
-
-  deps = [
-    "../../../rtc_base:rtc_base_approved",
-  ]
-}
-
-rtc_source_set("mock_aec_dump") {
-  testonly = true
-  sources = [
-    "mock_aec_dump.cc",
-    "mock_aec_dump.h",
-  ]
-
-  deps = [
-    "..:aec_dump_interface",
-  ]
-  public_deps = [
-    "../..:module_api",
-    "../../../test:test_support",
-    "//testing/gmock",
-  ]
-}
-
-rtc_source_set("mock_aec_dump_unittests") {
-  testonly = true
-
-  sources = [
-    "aec_dump_integration_test.cc",
-  ]
-
-  deps = [
-    ":mock_aec_dump",
-    "..:audio_processing",
-    "../../../rtc_base:rtc_base_approved",
-    "//testing/gtest",
-  ]
-}
-
-if (rtc_enable_protobuf) {
-  rtc_source_set("aec_dump_impl") {
-    sources = [
-      "aec_dump_impl.cc",
-      "aec_dump_impl.h",
-      "capture_stream_info.cc",
-      "capture_stream_info.h",
-      "write_to_file_task.cc",
-      "write_to_file_task.h",
-    ]
-
-    public = []
-
-    public_deps = [
-      ":aec_dump",
-      "..:aec_dump_interface",
-    ]
-
-    deps = [
-      "../../../modules:module_api",
-      "../../../rtc_base:protobuf_utils",
-      "../../../rtc_base:rtc_base_approved",
-      "../../../rtc_base:rtc_task_queue",
-      "../../../system_wrappers",
-    ]
-
-    deps += [ "../:audioproc_debug_proto" ]
-  }
-
-  rtc_source_set("aec_dump_unittests") {
-    testonly = true
-    defines = []
-    deps = [
-      ":aec_dump_impl",
-      "..:aec_dump_interface",
-      "..:audioproc_debug_proto",
-      "../../../modules:module_api",
-      "../../../rtc_base:rtc_task_queue",
-      "../../../test:test_support",
-      "//testing/gtest",
-    ]
-    sources = [
-      "aec_dump_unittest.cc",
-    ]
-  }
-}
-
-rtc_source_set("null_aec_dump_factory") {
-  assert_no_deps = [ ":aec_dump_impl" ]
-  sources = [
-    "null_aec_dump_factory.cc",
-  ]
-
-  public_deps = [
-    ":aec_dump",
-    "..:aec_dump_interface",
-  ]
-}
diff --git a/modules/audio_processing/aec_dump/aec_dump_factory.h b/modules/audio_processing/aec_dump/aec_dump_factory.h
deleted file mode 100644
index f868572..0000000
--- a/modules/audio_processing/aec_dump/aec_dump_factory.h
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- *  Copyright (c) 2017 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_PROCESSING_AEC_DUMP_AEC_DUMP_FACTORY_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_AEC_DUMP_AEC_DUMP_FACTORY_H_
-
-#include <memory>
-#include <string>
-
-#include "webrtc/modules/audio_processing/include/aec_dump.h"
-#include "webrtc/rtc_base/platform_file.h"
-
-namespace rtc {
-class TaskQueue;
-}  // namespace rtc
-
-namespace webrtc {
-
-class AecDumpFactory {
- public:
-  // The |worker_queue| may not be null and must outlive the created
-  // AecDump instance. |max_log_size_bytes == -1| means the log size
-  // will be unlimited. |handle| may not be null. The AecDump takes
-  // responsibility for |handle| and closes it in the destructor. A
-  // non-null return value indicates that the file has been
-  // sucessfully opened.
-  static std::unique_ptr<AecDump> Create(rtc::PlatformFile file,
-                                         int64_t max_log_size_bytes,
-                                         rtc::TaskQueue* worker_queue);
-  static std::unique_ptr<AecDump> Create(std::string file_name,
-                                         int64_t max_log_size_bytes,
-                                         rtc::TaskQueue* worker_queue);
-  static std::unique_ptr<AecDump> Create(FILE* handle,
-                                         int64_t max_log_size_bytes,
-                                         rtc::TaskQueue* worker_queue);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_AEC_DUMP_AEC_DUMP_FACTORY_H_
diff --git a/modules/audio_processing/aec_dump/aec_dump_impl.cc b/modules/audio_processing/aec_dump/aec_dump_impl.cc
deleted file mode 100644
index 497a12e..0000000
--- a/modules/audio_processing/aec_dump/aec_dump_impl.cc
+++ /dev/null
@@ -1,208 +0,0 @@
-/*
- *  Copyright (c) 2017 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_processing/aec_dump/aec_dump_impl.h"
-
-#include "webrtc/modules/audio_processing/aec_dump/aec_dump_factory.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/event.h"
-#include "webrtc/rtc_base/ptr_util.h"
-
-namespace webrtc {
-
-namespace {
-void CopyFromConfigToEvent(const webrtc::InternalAPMConfig& config,
-                           webrtc::audioproc::Config* pb_cfg) {
-  pb_cfg->set_aec_enabled(config.aec_enabled);
-  pb_cfg->set_aec_delay_agnostic_enabled(config.aec_delay_agnostic_enabled);
-  pb_cfg->set_aec_drift_compensation_enabled(
-      config.aec_drift_compensation_enabled);
-  pb_cfg->set_aec_extended_filter_enabled(config.aec_extended_filter_enabled);
-  pb_cfg->set_aec_suppression_level(config.aec_suppression_level);
-
-  pb_cfg->set_aecm_enabled(config.aecm_enabled);
-  pb_cfg->set_aecm_comfort_noise_enabled(config.aecm_comfort_noise_enabled);
-  pb_cfg->set_aecm_routing_mode(config.aecm_routing_mode);
-
-  pb_cfg->set_agc_enabled(config.agc_enabled);
-  pb_cfg->set_agc_mode(config.agc_mode);
-  pb_cfg->set_agc_limiter_enabled(config.agc_limiter_enabled);
-  pb_cfg->set_noise_robust_agc_enabled(config.noise_robust_agc_enabled);
-
-  pb_cfg->set_hpf_enabled(config.hpf_enabled);
-
-  pb_cfg->set_ns_enabled(config.ns_enabled);
-  pb_cfg->set_ns_level(config.ns_level);
-
-  pb_cfg->set_transient_suppression_enabled(
-      config.transient_suppression_enabled);
-  pb_cfg->set_intelligibility_enhancer_enabled(
-      config.intelligibility_enhancer_enabled);
-
-  pb_cfg->set_experiments_description(config.experiments_description);
-}
-
-}  // namespace
-
-AecDumpImpl::AecDumpImpl(std::unique_ptr<FileWrapper> debug_file,
-                         int64_t max_log_size_bytes,
-                         rtc::TaskQueue* worker_queue)
-    : debug_file_(std::move(debug_file)),
-      num_bytes_left_for_log_(max_log_size_bytes),
-      worker_queue_(worker_queue),
-      capture_stream_info_(CreateWriteToFileTask()) {}
-
-AecDumpImpl::~AecDumpImpl() {
-  // Block until all tasks have finished running.
-  rtc::Event thread_sync_event(false /* manual_reset */, false);
-  worker_queue_->PostTask([&thread_sync_event] { thread_sync_event.Set(); });
-  // Wait until the event has been signaled with .Set(). By then all
-  // pending tasks will have finished.
-  thread_sync_event.Wait(rtc::Event::kForever);
-}
-
-void AecDumpImpl::WriteInitMessage(
-    const InternalAPMStreamsConfig& streams_config) {
-  auto task = CreateWriteToFileTask();
-  auto* event = task->GetEvent();
-  event->set_type(audioproc::Event::INIT);
-  audioproc::Init* msg = event->mutable_init();
-
-  msg->set_sample_rate(streams_config.input_sample_rate);
-  msg->set_output_sample_rate(streams_config.output_sample_rate);
-  msg->set_reverse_sample_rate(streams_config.render_input_sample_rate);
-  msg->set_reverse_output_sample_rate(streams_config.render_output_sample_rate);
-
-  msg->set_num_input_channels(
-      static_cast<int32_t>(streams_config.input_num_channels));
-  msg->set_num_output_channels(
-      static_cast<int32_t>(streams_config.output_num_channels));
-  msg->set_num_reverse_channels(
-      static_cast<int32_t>(streams_config.render_input_num_channels));
-  msg->set_num_reverse_output_channels(
-      streams_config.render_output_num_channels);
-
-  worker_queue_->PostTask(std::unique_ptr<rtc::QueuedTask>(std::move(task)));
-}
-
-void AecDumpImpl::AddCaptureStreamInput(const FloatAudioFrame& src) {
-  capture_stream_info_.AddInput(src);
-}
-
-void AecDumpImpl::AddCaptureStreamOutput(const FloatAudioFrame& src) {
-  capture_stream_info_.AddOutput(src);
-}
-
-void AecDumpImpl::AddCaptureStreamInput(const AudioFrame& frame) {
-  capture_stream_info_.AddInput(frame);
-}
-
-void AecDumpImpl::AddCaptureStreamOutput(const AudioFrame& frame) {
-  capture_stream_info_.AddOutput(frame);
-}
-
-void AecDumpImpl::AddAudioProcessingState(const AudioProcessingState& state) {
-  capture_stream_info_.AddAudioProcessingState(state);
-}
-
-void AecDumpImpl::WriteCaptureStreamMessage() {
-  auto task = capture_stream_info_.GetTask();
-  RTC_DCHECK(task);
-  std::move(task);
-  worker_queue_->PostTask(std::unique_ptr<rtc::QueuedTask>(std::move(task)));
-  capture_stream_info_.SetTask(CreateWriteToFileTask());
-}
-
-void AecDumpImpl::WriteRenderStreamMessage(const AudioFrame& frame) {
-  auto task = CreateWriteToFileTask();
-  auto* event = task->GetEvent();
-
-  event->set_type(audioproc::Event::REVERSE_STREAM);
-  audioproc::ReverseStream* msg = event->mutable_reverse_stream();
-  const size_t data_size =
-      sizeof(int16_t) * frame.samples_per_channel_ * frame.num_channels_;
-  msg->set_data(frame.data(), data_size);
-
-  worker_queue_->PostTask(std::unique_ptr<rtc::QueuedTask>(std::move(task)));
-}
-
-void AecDumpImpl::WriteRenderStreamMessage(const FloatAudioFrame& src) {
-  auto task = CreateWriteToFileTask();
-  auto* event = task->GetEvent();
-
-  event->set_type(audioproc::Event::REVERSE_STREAM);
-
-  audioproc::ReverseStream* msg = event->mutable_reverse_stream();
-
-  for (size_t i = 0; i < src.num_channels(); ++i) {
-    const auto& channel_view = src.channel(i);
-    msg->add_channel(channel_view.begin(), sizeof(float) * channel_view.size());
-  }
-
-  worker_queue_->PostTask(std::unique_ptr<rtc::QueuedTask>(std::move(task)));
-}
-
-void AecDumpImpl::WriteConfig(const InternalAPMConfig& config) {
-  RTC_DCHECK_RUNS_SERIALIZED(&race_checker_);
-  auto task = CreateWriteToFileTask();
-  auto* event = task->GetEvent();
-  event->set_type(audioproc::Event::CONFIG);
-  CopyFromConfigToEvent(config, event->mutable_config());
-  worker_queue_->PostTask(std::unique_ptr<rtc::QueuedTask>(std::move(task)));
-}
-
-std::unique_ptr<WriteToFileTask> AecDumpImpl::CreateWriteToFileTask() {
-  return rtc::MakeUnique<WriteToFileTask>(debug_file_.get(),
-                                          &num_bytes_left_for_log_);
-}
-
-std::unique_ptr<AecDump> AecDumpFactory::Create(rtc::PlatformFile file,
-                                                int64_t max_log_size_bytes,
-                                                rtc::TaskQueue* worker_queue) {
-  RTC_DCHECK(worker_queue);
-  std::unique_ptr<FileWrapper> debug_file(FileWrapper::Create());
-  FILE* handle = rtc::FdopenPlatformFileForWriting(file);
-  if (!handle) {
-    return nullptr;
-  }
-  if (!debug_file->OpenFromFileHandle(handle)) {
-    return nullptr;
-  }
-  return rtc::MakeUnique<AecDumpImpl>(std::move(debug_file), max_log_size_bytes,
-                                      worker_queue);
-}
-
-std::unique_ptr<AecDump> AecDumpFactory::Create(std::string file_name,
-                                                int64_t max_log_size_bytes,
-                                                rtc::TaskQueue* worker_queue) {
-  RTC_DCHECK(worker_queue);
-  std::unique_ptr<FileWrapper> debug_file(FileWrapper::Create());
-  if (!debug_file->OpenFile(file_name.c_str(), false)) {
-    return nullptr;
-  }
-  return rtc::MakeUnique<AecDumpImpl>(std::move(debug_file), max_log_size_bytes,
-                                      worker_queue);
-}
-
-std::unique_ptr<AecDump> AecDumpFactory::Create(FILE* handle,
-                                                int64_t max_log_size_bytes,
-                                                rtc::TaskQueue* worker_queue) {
-  RTC_DCHECK(worker_queue);
-  RTC_DCHECK(handle);
-  std::unique_ptr<FileWrapper> debug_file(FileWrapper::Create());
-  if (!debug_file->OpenFromFileHandle(handle)) {
-    return nullptr;
-  }
-  return rtc::MakeUnique<AecDumpImpl>(std::move(debug_file), max_log_size_bytes,
-                                      worker_queue);
-}
-}  // namespace webrtc
diff --git a/modules/audio_processing/aec_dump/aec_dump_impl.h b/modules/audio_processing/aec_dump/aec_dump_impl.h
deleted file mode 100644
index 2109cf5..0000000
--- a/modules/audio_processing/aec_dump/aec_dump_impl.h
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- *  Copyright (c) 2017 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_PROCESSING_AEC_DUMP_AEC_DUMP_IMPL_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_AEC_DUMP_AEC_DUMP_IMPL_H_
-
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "webrtc/modules/audio_processing/aec_dump/capture_stream_info.h"
-#include "webrtc/modules/audio_processing/aec_dump/write_to_file_task.h"
-#include "webrtc/modules/audio_processing/include/aec_dump.h"
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/rtc_base/ignore_wundef.h"
-#include "webrtc/rtc_base/platform_file.h"
-#include "webrtc/rtc_base/race_checker.h"
-#include "webrtc/rtc_base/task_queue.h"
-#include "webrtc/rtc_base/thread_annotations.h"
-#include "webrtc/system_wrappers/include/file_wrapper.h"
-
-// Files generated at build-time by the protobuf compiler.
-RTC_PUSH_IGNORING_WUNDEF()
-#ifdef WEBRTC_ANDROID_PLATFORM_BUILD
-#include "external/webrtc/webrtc/modules/audio_processing/debug.pb.h"
-#else
-#include "webrtc/modules/audio_processing/debug.pb.h"
-#endif
-RTC_POP_IGNORING_WUNDEF()
-
-namespace rtc {
-class TaskQueue;
-}  // namespace rtc
-
-namespace webrtc {
-
-// Task-queue based implementation of AecDump. It is thread safe by
-// relying on locks in TaskQueue.
-class AecDumpImpl : public AecDump {
- public:
-  // Does member variables initialization shared across all c-tors.
-  AecDumpImpl(std::unique_ptr<FileWrapper> debug_file,
-              int64_t max_log_size_bytes,
-              rtc::TaskQueue* worker_queue);
-
-  ~AecDumpImpl() override;
-
-  void WriteInitMessage(const InternalAPMStreamsConfig& api_format) override;
-
-  void AddCaptureStreamInput(const FloatAudioFrame& src) override;
-  void AddCaptureStreamOutput(const FloatAudioFrame& src) override;
-  void AddCaptureStreamInput(const AudioFrame& frame) override;
-  void AddCaptureStreamOutput(const AudioFrame& frame) override;
-  void AddAudioProcessingState(const AudioProcessingState& state) override;
-  void WriteCaptureStreamMessage() override;
-
-  void WriteRenderStreamMessage(const AudioFrame& frame) override;
-  void WriteRenderStreamMessage(const FloatAudioFrame& src) override;
-
-  void WriteConfig(const InternalAPMConfig& config) override;
-
- private:
-  std::unique_ptr<WriteToFileTask> CreateWriteToFileTask();
-
-  std::unique_ptr<FileWrapper> debug_file_;
-  int64_t num_bytes_left_for_log_ = 0;
-  rtc::RaceChecker race_checker_;
-  rtc::TaskQueue* worker_queue_;
-  CaptureStreamInfo capture_stream_info_;
-};
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_AEC_DUMP_AEC_DUMP_IMPL_H_
diff --git a/modules/audio_processing/aec_dump/aec_dump_integration_test.cc b/modules/audio_processing/aec_dump/aec_dump_integration_test.cc
deleted file mode 100644
index c77cf91..0000000
--- a/modules/audio_processing/aec_dump/aec_dump_integration_test.cc
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- *  Copyright (c) 2017 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_processing/aec_dump/mock_aec_dump.h"
-#include "webrtc/modules/audio_processing/include/audio_processing.h"
-#include "webrtc/rtc_base/ptr_util.h"
-
-using testing::_;
-using testing::AtLeast;
-using testing::Exactly;
-using testing::Matcher;
-using testing::StrictMock;
-
-namespace {
-std::unique_ptr<webrtc::AudioProcessing> CreateAudioProcessing() {
-  webrtc::Config config;
-  std::unique_ptr<webrtc::AudioProcessing> apm(
-      webrtc::AudioProcessing::Create(config));
-  RTC_DCHECK(apm);
-  return apm;
-}
-
-std::unique_ptr<webrtc::test::MockAecDump> CreateMockAecDump() {
-  auto mock_aec_dump =
-      rtc::MakeUnique<testing::StrictMock<webrtc::test::MockAecDump>>();
-  EXPECT_CALL(*mock_aec_dump.get(), WriteConfig(_)).Times(AtLeast(1));
-  EXPECT_CALL(*mock_aec_dump.get(), WriteInitMessage(_)).Times(AtLeast(1));
-  return std::unique_ptr<webrtc::test::MockAecDump>(std::move(mock_aec_dump));
-}
-
-std::unique_ptr<webrtc::AudioFrame> CreateFakeFrame() {
-  auto fake_frame = rtc::MakeUnique<webrtc::AudioFrame>();
-  fake_frame->num_channels_ = 1;
-  fake_frame->sample_rate_hz_ = 48000;
-  fake_frame->samples_per_channel_ = 480;
-  return fake_frame;
-}
-
-}  // namespace
-
-TEST(AecDumpIntegration, ConfigurationAndInitShouldBeLogged) {
-  auto apm = CreateAudioProcessing();
-
-  apm->AttachAecDump(CreateMockAecDump());
-}
-
-TEST(AecDumpIntegration,
-     RenderStreamShouldBeLoggedOnceEveryProcessReverseStream) {
-  auto apm = CreateAudioProcessing();
-  auto mock_aec_dump = CreateMockAecDump();
-  auto fake_frame = CreateFakeFrame();
-
-  EXPECT_CALL(*mock_aec_dump.get(),
-              WriteRenderStreamMessage(Matcher<const webrtc::AudioFrame&>(_)))
-      .Times(Exactly(1));
-
-  apm->AttachAecDump(std::move(mock_aec_dump));
-  apm->ProcessReverseStream(fake_frame.get());
-}
-
-TEST(AecDumpIntegration, CaptureStreamShouldBeLoggedOnceEveryProcessStream) {
-  auto apm = CreateAudioProcessing();
-  auto mock_aec_dump = CreateMockAecDump();
-  auto fake_frame = CreateFakeFrame();
-
-  EXPECT_CALL(*mock_aec_dump.get(),
-              AddCaptureStreamInput(Matcher<const webrtc::AudioFrame&>(_)))
-      .Times(AtLeast(1));
-
-  EXPECT_CALL(*mock_aec_dump.get(),
-              AddCaptureStreamOutput(Matcher<const webrtc::AudioFrame&>(_)))
-      .Times(Exactly(1));
-
-  EXPECT_CALL(*mock_aec_dump.get(), AddAudioProcessingState(_))
-      .Times(Exactly(1));
-
-  EXPECT_CALL(*mock_aec_dump.get(), WriteCaptureStreamMessage())
-      .Times(Exactly(1));
-
-  apm->AttachAecDump(std::move(mock_aec_dump));
-  apm->ProcessStream(fake_frame.get());
-}
diff --git a/modules/audio_processing/aec_dump/aec_dump_unittest.cc b/modules/audio_processing/aec_dump/aec_dump_unittest.cc
deleted file mode 100644
index d6f3617..0000000
--- a/modules/audio_processing/aec_dump/aec_dump_unittest.cc
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- *  Copyright (c) 2017 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_processing/aec_dump/aec_dump_factory.h"
-
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/rtc_base/task_queue.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/testsupport/fileutils.h"
-
-TEST(AecDumper, APICallsDoNotCrash) {
-  // Note order of initialization: Task queue has to be initialized
-  // before AecDump.
-  rtc::TaskQueue file_writer_queue("file_writer_queue");
-
-  const std::string filename =
-      webrtc::test::TempFilename(webrtc::test::OutputPath(), "aec_dump");
-
-  {
-    std::unique_ptr<webrtc::AecDump> aec_dump =
-        webrtc::AecDumpFactory::Create(filename, -1, &file_writer_queue);
-
-    const webrtc::AudioFrame frame;
-    aec_dump->WriteRenderStreamMessage(frame);
-
-    aec_dump->AddCaptureStreamInput(frame);
-    aec_dump->AddCaptureStreamOutput(frame);
-
-    aec_dump->WriteCaptureStreamMessage();
-
-    webrtc::InternalAPMConfig apm_config;
-    aec_dump->WriteConfig(apm_config);
-
-    webrtc::InternalAPMStreamsConfig streams_config;
-    aec_dump->WriteInitMessage(streams_config);
-  }
-  // Remove file after the AecDump d-tor has finished.
-  ASSERT_EQ(0, remove(filename.c_str()));
-}
-
-TEST(AecDumper, WriteToFile) {
-  rtc::TaskQueue file_writer_queue("file_writer_queue");
-
-  const std::string filename =
-      webrtc::test::TempFilename(webrtc::test::OutputPath(), "aec_dump");
-
-  {
-    std::unique_ptr<webrtc::AecDump> aec_dump =
-        webrtc::AecDumpFactory::Create(filename, -1, &file_writer_queue);
-    const webrtc::AudioFrame frame;
-    aec_dump->WriteRenderStreamMessage(frame);
-  }
-
-  // Verify the file has been written after the AecDump d-tor has
-  // finished.
-  FILE* fid = fopen(filename.c_str(), "r");
-  ASSERT_TRUE(fid != NULL);
-
-  // Clean it up.
-  ASSERT_EQ(0, fclose(fid));
-  ASSERT_EQ(0, remove(filename.c_str()));
-}
diff --git a/modules/audio_processing/aec_dump/capture_stream_info.cc b/modules/audio_processing/aec_dump/capture_stream_info.cc
deleted file mode 100644
index 5a49685..0000000
--- a/modules/audio_processing/aec_dump/capture_stream_info.cc
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- *  Copyright (c) 2017 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_processing/aec_dump/capture_stream_info.h"
-
-namespace webrtc {
-CaptureStreamInfo::CaptureStreamInfo(std::unique_ptr<WriteToFileTask> task)
-    : task_(std::move(task)) {
-  RTC_DCHECK(task_);
-  task_->GetEvent()->set_type(audioproc::Event::STREAM);
-}
-
-CaptureStreamInfo::~CaptureStreamInfo() = default;
-
-void CaptureStreamInfo::AddInput(const FloatAudioFrame& src) {
-  RTC_DCHECK(task_);
-  auto* stream = task_->GetEvent()->mutable_stream();
-
-  for (size_t i = 0; i < src.num_channels(); ++i) {
-    const auto& channel_view = src.channel(i);
-    stream->add_input_channel(channel_view.begin(),
-                              sizeof(float) * channel_view.size());
-  }
-}
-
-void CaptureStreamInfo::AddOutput(const FloatAudioFrame& src) {
-  RTC_DCHECK(task_);
-  auto* stream = task_->GetEvent()->mutable_stream();
-
-  for (size_t i = 0; i < src.num_channels(); ++i) {
-    const auto& channel_view = src.channel(i);
-    stream->add_output_channel(channel_view.begin(),
-                               sizeof(float) * channel_view.size());
-  }
-}
-
-void CaptureStreamInfo::AddInput(const AudioFrame& frame) {
-  RTC_DCHECK(task_);
-  auto* stream = task_->GetEvent()->mutable_stream();
-  const size_t data_size =
-      sizeof(int16_t) * frame.samples_per_channel_ * frame.num_channels_;
-  stream->set_input_data(frame.data(), data_size);
-}
-
-void CaptureStreamInfo::AddOutput(const AudioFrame& frame) {
-  RTC_DCHECK(task_);
-  auto* stream = task_->GetEvent()->mutable_stream();
-  const size_t data_size =
-      sizeof(int16_t) * frame.samples_per_channel_ * frame.num_channels_;
-  stream->set_output_data(frame.data(), data_size);
-}
-
-void CaptureStreamInfo::AddAudioProcessingState(
-    const AecDump::AudioProcessingState& state) {
-  RTC_DCHECK(task_);
-  auto* stream = task_->GetEvent()->mutable_stream();
-  stream->set_delay(state.delay);
-  stream->set_drift(state.drift);
-  stream->set_level(state.level);
-  stream->set_keypress(state.keypress);
-}
-}  // namespace webrtc
diff --git a/modules/audio_processing/aec_dump/capture_stream_info.h b/modules/audio_processing/aec_dump/capture_stream_info.h
deleted file mode 100644
index cd87020..0000000
--- a/modules/audio_processing/aec_dump/capture_stream_info.h
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- *  Copyright (c) 2017 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_PROCESSING_AEC_DUMP_CAPTURE_STREAM_INFO_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_AEC_DUMP_CAPTURE_STREAM_INFO_H_
-
-#include <memory>
-#include <utility>
-#include <vector>
-
-#include "webrtc/modules/audio_processing/aec_dump/write_to_file_task.h"
-#include "webrtc/modules/audio_processing/include/aec_dump.h"
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/ignore_wundef.h"
-#include "webrtc/rtc_base/logging.h"
-
-// Files generated at build-time by the protobuf compiler.
-RTC_PUSH_IGNORING_WUNDEF()
-#ifdef WEBRTC_ANDROID_PLATFORM_BUILD
-#include "external/webrtc/webrtc/modules/audio_processing/debug.pb.h"
-#else
-#include "webrtc/modules/audio_processing/debug.pb.h"
-#endif
-RTC_POP_IGNORING_WUNDEF()
-
-namespace webrtc {
-
-class CaptureStreamInfo {
- public:
-  explicit CaptureStreamInfo(std::unique_ptr<WriteToFileTask> task);
-  ~CaptureStreamInfo();
-  void AddInput(const FloatAudioFrame& src);
-  void AddOutput(const FloatAudioFrame& src);
-
-  void AddInput(const AudioFrame& frame);
-  void AddOutput(const AudioFrame& frame);
-
-  void AddAudioProcessingState(const AecDump::AudioProcessingState& state);
-
-  std::unique_ptr<WriteToFileTask> GetTask() {
-    RTC_DCHECK(task_);
-    return std::move(task_);
-  }
-
-  void SetTask(std::unique_ptr<WriteToFileTask> task) {
-    RTC_DCHECK(!task_);
-    RTC_DCHECK(task);
-    task_ = std::move(task);
-    task_->GetEvent()->set_type(audioproc::Event::STREAM);
-  }
-
- private:
-  std::unique_ptr<WriteToFileTask> task_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_AEC_DUMP_CAPTURE_STREAM_INFO_H_
diff --git a/modules/audio_processing/aec_dump/mock_aec_dump.cc b/modules/audio_processing/aec_dump/mock_aec_dump.cc
deleted file mode 100644
index 58e00c7..0000000
--- a/modules/audio_processing/aec_dump/mock_aec_dump.cc
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- *  Copyright (c) 2017 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_processing/aec_dump/mock_aec_dump.h"
-
-namespace webrtc {
-
-namespace test {
-
-MockAecDump::MockAecDump() = default;
-MockAecDump::~MockAecDump() = default;
-}
-}
diff --git a/modules/audio_processing/aec_dump/mock_aec_dump.h b/modules/audio_processing/aec_dump/mock_aec_dump.h
deleted file mode 100644
index 4661203..0000000
--- a/modules/audio_processing/aec_dump/mock_aec_dump.h
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- *  Copyright (c) 2017 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_PROCESSING_AEC_DUMP_MOCK_AEC_DUMP_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_AEC_DUMP_MOCK_AEC_DUMP_H_
-
-#include <memory>
-
-#include "webrtc/modules/audio_processing/include/aec_dump.h"
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/test/gmock.h"
-
-namespace webrtc {
-
-namespace test {
-
-class MockAecDump : public AecDump {
- public:
-  MockAecDump();
-  virtual ~MockAecDump();
-
-  MOCK_METHOD1(WriteInitMessage,
-               void(const InternalAPMStreamsConfig& streams_config));
-
-  MOCK_METHOD1(AddCaptureStreamInput, void(const FloatAudioFrame& src));
-  MOCK_METHOD1(AddCaptureStreamOutput, void(const FloatAudioFrame& src));
-  MOCK_METHOD1(AddCaptureStreamInput, void(const AudioFrame& frame));
-  MOCK_METHOD1(AddCaptureStreamOutput, void(const AudioFrame& frame));
-  MOCK_METHOD1(AddAudioProcessingState,
-               void(const AudioProcessingState& state));
-  MOCK_METHOD0(WriteCaptureStreamMessage, void());
-
-  MOCK_METHOD1(WriteRenderStreamMessage, void(const AudioFrame& frame));
-  MOCK_METHOD1(WriteRenderStreamMessage, void(const FloatAudioFrame& src));
-
-  MOCK_METHOD1(WriteConfig, void(const InternalAPMConfig& config));
-};
-
-}  // namespace test
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_AEC_DUMP_MOCK_AEC_DUMP_H_
diff --git a/modules/audio_processing/aec_dump/null_aec_dump_factory.cc b/modules/audio_processing/aec_dump/null_aec_dump_factory.cc
deleted file mode 100644
index 7da3d5a..0000000
--- a/modules/audio_processing/aec_dump/null_aec_dump_factory.cc
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- *  Copyright (c) 2017 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_processing/aec_dump/aec_dump_factory.h"
-#include "webrtc/modules/audio_processing/include/aec_dump.h"
-
-namespace webrtc {
-
-std::unique_ptr<AecDump> AecDumpFactory::Create(rtc::PlatformFile file,
-                                                int64_t max_log_size_bytes,
-                                                rtc::TaskQueue* worker_queue) {
-  return nullptr;
-}
-
-std::unique_ptr<AecDump> AecDumpFactory::Create(std::string file_name,
-                                                int64_t max_log_size_bytes,
-                                                rtc::TaskQueue* worker_queue) {
-  return nullptr;
-}
-
-std::unique_ptr<AecDump> AecDumpFactory::Create(FILE* handle,
-                                                int64_t max_log_size_bytes,
-                                                rtc::TaskQueue* worker_queue) {
-  return nullptr;
-}
-}  // namespace webrtc
diff --git a/modules/audio_processing/aec_dump/write_to_file_task.cc b/modules/audio_processing/aec_dump/write_to_file_task.cc
deleted file mode 100644
index f94f57b..0000000
--- a/modules/audio_processing/aec_dump/write_to_file_task.cc
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- *  Copyright (c) 2017 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_processing/aec_dump/write_to_file_task.h"
-
-#include "webrtc/rtc_base/protobuf_utils.h"
-
-namespace webrtc {
-
-WriteToFileTask::WriteToFileTask(webrtc::FileWrapper* debug_file,
-                                 int64_t* num_bytes_left_for_log)
-    : debug_file_(debug_file),
-      num_bytes_left_for_log_(num_bytes_left_for_log) {}
-
-WriteToFileTask::~WriteToFileTask() = default;
-
-audioproc::Event* WriteToFileTask::GetEvent() {
-  return &event_;
-}
-
-bool WriteToFileTask::IsRoomForNextEvent(size_t event_byte_size) const {
-  int64_t next_message_size = event_byte_size + sizeof(int32_t);
-  return (*num_bytes_left_for_log_ < 0) ||
-         (*num_bytes_left_for_log_ >= next_message_size);
-}
-
-void WriteToFileTask::UpdateBytesLeft(size_t event_byte_size) {
-  RTC_DCHECK(IsRoomForNextEvent(event_byte_size));
-  if (*num_bytes_left_for_log_ >= 0) {
-    *num_bytes_left_for_log_ -= (sizeof(int32_t) + event_byte_size);
-  }
-}
-
-bool WriteToFileTask::Run() {
-  if (!debug_file_->is_open()) {
-    return true;
-  }
-
-  ProtoString event_string;
-  event_.SerializeToString(&event_string);
-
-  const size_t event_byte_size = event_.ByteSize();
-
-  if (!IsRoomForNextEvent(event_byte_size)) {
-    debug_file_->CloseFile();
-    return true;
-  }
-
-  UpdateBytesLeft(event_byte_size);
-
-  // Write message preceded by its size.
-  if (!debug_file_->Write(&event_byte_size, sizeof(int32_t))) {
-    RTC_NOTREACHED();
-  }
-  if (!debug_file_->Write(event_string.data(), event_string.length())) {
-    RTC_NOTREACHED();
-  }
-  return true;  // Delete task from queue at once.
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/aec_dump/write_to_file_task.h b/modules/audio_processing/aec_dump/write_to_file_task.h
deleted file mode 100644
index 5f20ed8..0000000
--- a/modules/audio_processing/aec_dump/write_to_file_task.h
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- *  Copyright (c) 2017 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_PROCESSING_AEC_DUMP_WRITE_TO_FILE_TASK_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_AEC_DUMP_WRITE_TO_FILE_TASK_H_
-
-#include <memory>
-#include <string>
-#include <utility>
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/event.h"
-#include "webrtc/rtc_base/ignore_wundef.h"
-#include "webrtc/rtc_base/platform_file.h"
-#include "webrtc/rtc_base/task_queue.h"
-#include "webrtc/system_wrappers/include/file_wrapper.h"
-
-// Files generated at build-time by the protobuf compiler.
-RTC_PUSH_IGNORING_WUNDEF()
-#ifdef WEBRTC_ANDROID_PLATFORM_BUILD
-#include "external/webrtc/webrtc/modules/audio_processing/debug.pb.h"
-#else
-#include "webrtc/modules/audio_processing/debug.pb.h"
-#endif
-RTC_POP_IGNORING_WUNDEF()
-
-namespace webrtc {
-
-class WriteToFileTask : public rtc::QueuedTask {
- public:
-  WriteToFileTask(webrtc::FileWrapper* debug_file,
-                  int64_t* num_bytes_left_for_log);
-  ~WriteToFileTask() override;
-
-  audioproc::Event* GetEvent();
-
- private:
-  bool IsRoomForNextEvent(size_t event_byte_size) const;
-
-  void UpdateBytesLeft(size_t event_byte_size);
-
-  bool Run() override;
-
-  webrtc::FileWrapper* debug_file_;
-  audioproc::Event event_;
-  int64_t* num_bytes_left_for_log_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_AEC_DUMP_WRITE_TO_FILE_TASK_H_
diff --git a/modules/audio_processing/aecm/aecm_core.cc b/modules/audio_processing/aecm/aecm_core.cc
deleted file mode 100644
index 5809154..0000000
--- a/modules/audio_processing/aecm/aecm_core.cc
+++ /dev/null
@@ -1,1232 +0,0 @@
-/*
- *  Copyright (c) 2012 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_processing/aecm/aecm_core.h"
-
-#include <stddef.h>
-#include <stdlib.h>
-
-extern "C" {
-#include "webrtc/common_audio/ring_buffer.h"
-#include "webrtc/common_audio/signal_processing/include/real_fft.h"
-}
-#include "webrtc/modules/audio_processing/aecm/echo_control_mobile.h"
-#include "webrtc/modules/audio_processing/utility/delay_estimator_wrapper.h"
-extern "C" {
-#include "webrtc/system_wrappers/include/cpu_features_wrapper.h"
-}
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/safe_conversions.h"
-#include "webrtc/typedefs.h"
-
-#ifdef AEC_DEBUG
-FILE *dfile;
-FILE *testfile;
-#endif
-
-const int16_t WebRtcAecm_kCosTable[] = {
-    8192,  8190,  8187,  8180,  8172,  8160,  8147,  8130,  8112,
-    8091,  8067,  8041,  8012,  7982,  7948,  7912,  7874,  7834,
-    7791,  7745,  7697,  7647,  7595,  7540,  7483,  7424,  7362,
-    7299,  7233,  7164,  7094,  7021,  6947,  6870,  6791,  6710,
-    6627,  6542,  6455,  6366,  6275,  6182,  6087,  5991,  5892,
-    5792,  5690,  5586,  5481,  5374,  5265,  5155,  5043,  4930,
-    4815,  4698,  4580,  4461,  4341,  4219,  4096,  3971,  3845,
-    3719,  3591,  3462,  3331,  3200,  3068,  2935,  2801,  2667,
-    2531,  2395,  2258,  2120,  1981,  1842,  1703,  1563,  1422,
-    1281,  1140,   998,   856,   713,   571,   428,   285,   142,
-       0,  -142,  -285,  -428,  -571,  -713,  -856,  -998, -1140,
-   -1281, -1422, -1563, -1703, -1842, -1981, -2120, -2258, -2395,
-   -2531, -2667, -2801, -2935, -3068, -3200, -3331, -3462, -3591,
-   -3719, -3845, -3971, -4095, -4219, -4341, -4461, -4580, -4698,
-   -4815, -4930, -5043, -5155, -5265, -5374, -5481, -5586, -5690,
-   -5792, -5892, -5991, -6087, -6182, -6275, -6366, -6455, -6542,
-   -6627, -6710, -6791, -6870, -6947, -7021, -7094, -7164, -7233,
-   -7299, -7362, -7424, -7483, -7540, -7595, -7647, -7697, -7745,
-   -7791, -7834, -7874, -7912, -7948, -7982, -8012, -8041, -8067,
-   -8091, -8112, -8130, -8147, -8160, -8172, -8180, -8187, -8190,
-   -8191, -8190, -8187, -8180, -8172, -8160, -8147, -8130, -8112,
-   -8091, -8067, -8041, -8012, -7982, -7948, -7912, -7874, -7834,
-   -7791, -7745, -7697, -7647, -7595, -7540, -7483, -7424, -7362,
-   -7299, -7233, -7164, -7094, -7021, -6947, -6870, -6791, -6710,
-   -6627, -6542, -6455, -6366, -6275, -6182, -6087, -5991, -5892,
-   -5792, -5690, -5586, -5481, -5374, -5265, -5155, -5043, -4930,
-   -4815, -4698, -4580, -4461, -4341, -4219, -4096, -3971, -3845,
-   -3719, -3591, -3462, -3331, -3200, -3068, -2935, -2801, -2667,
-   -2531, -2395, -2258, -2120, -1981, -1842, -1703, -1563, -1422,
-   -1281, -1140,  -998,  -856,  -713,  -571,  -428,  -285,  -142,
-       0,   142,   285,   428,   571,   713,   856,   998,  1140,
-    1281,  1422,  1563,  1703,  1842,  1981,  2120,  2258,  2395,
-    2531,  2667,  2801,  2935,  3068,  3200,  3331,  3462,  3591,
-    3719,  3845,  3971,  4095,  4219,  4341,  4461,  4580,  4698,
-    4815,  4930,  5043,  5155,  5265,  5374,  5481,  5586,  5690,
-    5792,  5892,  5991,  6087,  6182,  6275,  6366,  6455,  6542,
-    6627,  6710,  6791,  6870,  6947,  7021,  7094,  7164,  7233,
-    7299,  7362,  7424,  7483,  7540,  7595,  7647,  7697,  7745,
-    7791,  7834,  7874,  7912,  7948,  7982,  8012,  8041,  8067,
-    8091,  8112,  8130,  8147,  8160,  8172,  8180,  8187,  8190
-};
-
-const int16_t WebRtcAecm_kSinTable[] = {
-       0,    142,    285,    428,    571,    713,    856,    998,
-    1140,   1281,   1422,   1563,   1703,   1842,   1981,   2120,
-    2258,   2395,   2531,   2667,   2801,   2935,   3068,   3200,
-    3331,   3462,   3591,   3719,   3845,   3971,   4095,   4219,
-    4341,   4461,   4580,   4698,   4815,   4930,   5043,   5155,
-    5265,   5374,   5481,   5586,   5690,   5792,   5892,   5991,
-    6087,   6182,   6275,   6366,   6455,   6542,   6627,   6710,
-    6791,   6870,   6947,   7021,   7094,   7164,   7233,   7299,
-    7362,   7424,   7483,   7540,   7595,   7647,   7697,   7745,
-    7791,   7834,   7874,   7912,   7948,   7982,   8012,   8041,
-    8067,   8091,   8112,   8130,   8147,   8160,   8172,   8180,
-    8187,   8190,   8191,   8190,   8187,   8180,   8172,   8160,
-    8147,   8130,   8112,   8091,   8067,   8041,   8012,   7982,
-    7948,   7912,   7874,   7834,   7791,   7745,   7697,   7647,
-    7595,   7540,   7483,   7424,   7362,   7299,   7233,   7164,
-    7094,   7021,   6947,   6870,   6791,   6710,   6627,   6542,
-    6455,   6366,   6275,   6182,   6087,   5991,   5892,   5792,
-    5690,   5586,   5481,   5374,   5265,   5155,   5043,   4930,
-    4815,   4698,   4580,   4461,   4341,   4219,   4096,   3971,
-    3845,   3719,   3591,   3462,   3331,   3200,   3068,   2935,
-    2801,   2667,   2531,   2395,   2258,   2120,   1981,   1842,
-    1703,   1563,   1422,   1281,   1140,    998,    856,    713,
-     571,    428,    285,    142,      0,   -142,   -285,   -428,
-    -571,   -713,   -856,   -998,  -1140,  -1281,  -1422,  -1563,
-   -1703,  -1842,  -1981,  -2120,  -2258,  -2395,  -2531,  -2667,
-   -2801,  -2935,  -3068,  -3200,  -3331,  -3462,  -3591,  -3719,
-   -3845,  -3971,  -4095,  -4219,  -4341,  -4461,  -4580,  -4698,
-   -4815,  -4930,  -5043,  -5155,  -5265,  -5374,  -5481,  -5586,
-   -5690,  -5792,  -5892,  -5991,  -6087,  -6182,  -6275,  -6366,
-   -6455,  -6542,  -6627,  -6710,  -6791,  -6870,  -6947,  -7021,
-   -7094,  -7164,  -7233,  -7299,  -7362,  -7424,  -7483,  -7540,
-   -7595,  -7647,  -7697,  -7745,  -7791,  -7834,  -7874,  -7912,
-   -7948,  -7982,  -8012,  -8041,  -8067,  -8091,  -8112,  -8130,
-   -8147,  -8160,  -8172,  -8180,  -8187,  -8190,  -8191,  -8190,
-   -8187,  -8180,  -8172,  -8160,  -8147,  -8130,  -8112,  -8091,
-   -8067,  -8041,  -8012,  -7982,  -7948,  -7912,  -7874,  -7834,
-   -7791,  -7745,  -7697,  -7647,  -7595,  -7540,  -7483,  -7424,
-   -7362,  -7299,  -7233,  -7164,  -7094,  -7021,  -6947,  -6870,
-   -6791,  -6710,  -6627,  -6542,  -6455,  -6366,  -6275,  -6182,
-   -6087,  -5991,  -5892,  -5792,  -5690,  -5586,  -5481,  -5374,
-   -5265,  -5155,  -5043,  -4930,  -4815,  -4698,  -4580,  -4461,
-   -4341,  -4219,  -4096,  -3971,  -3845,  -3719,  -3591,  -3462,
-   -3331,  -3200,  -3068,  -2935,  -2801,  -2667,  -2531,  -2395,
-   -2258,  -2120,  -1981,  -1842,  -1703,  -1563,  -1422,  -1281,
-   -1140,   -998,   -856,   -713,   -571,   -428,   -285,   -142
-};
-
-// Initialization table for echo channel in 8 kHz
-static const int16_t kChannelStored8kHz[PART_LEN1] = {
-    2040,   1815,   1590,   1498,   1405,   1395,   1385,   1418,
-    1451,   1506,   1562,   1644,   1726,   1804,   1882,   1918,
-    1953,   1982,   2010,   2025,   2040,   2034,   2027,   2021,
-    2014,   1997,   1980,   1925,   1869,   1800,   1732,   1683,
-    1635,   1604,   1572,   1545,   1517,   1481,   1444,   1405,
-    1367,   1331,   1294,   1270,   1245,   1239,   1233,   1247,
-    1260,   1282,   1303,   1338,   1373,   1407,   1441,   1470,
-    1499,   1524,   1549,   1565,   1582,   1601,   1621,   1649,
-    1676
-};
-
-// Initialization table for echo channel in 16 kHz
-static const int16_t kChannelStored16kHz[PART_LEN1] = {
-    2040,   1590,   1405,   1385,   1451,   1562,   1726,   1882,
-    1953,   2010,   2040,   2027,   2014,   1980,   1869,   1732,
-    1635,   1572,   1517,   1444,   1367,   1294,   1245,   1233,
-    1260,   1303,   1373,   1441,   1499,   1549,   1582,   1621,
-    1676,   1741,   1802,   1861,   1921,   1983,   2040,   2102,
-    2170,   2265,   2375,   2515,   2651,   2781,   2922,   3075,
-    3253,   3471,   3738,   3976,   4151,   4258,   4308,   4288,
-    4270,   4253,   4237,   4179,   4086,   3947,   3757,   3484,
-    3153
-};
-
-// Moves the pointer to the next entry and inserts |far_spectrum| and
-// corresponding Q-domain in its buffer.
-//
-// Inputs:
-//      - self          : Pointer to the delay estimation instance
-//      - far_spectrum  : Pointer to the far end spectrum
-//      - far_q         : Q-domain of far end spectrum
-//
-void WebRtcAecm_UpdateFarHistory(AecmCore* self,
-                                 uint16_t* far_spectrum,
-                                 int far_q) {
-  // Get new buffer position
-  self->far_history_pos++;
-  if (self->far_history_pos >= MAX_DELAY) {
-    self->far_history_pos = 0;
-  }
-  // Update Q-domain buffer
-  self->far_q_domains[self->far_history_pos] = far_q;
-  // Update far end spectrum buffer
-  memcpy(&(self->far_history[self->far_history_pos * PART_LEN1]),
-         far_spectrum,
-         sizeof(uint16_t) * PART_LEN1);
-}
-
-// Returns a pointer to the far end spectrum aligned to current near end
-// spectrum. The function WebRtc_DelayEstimatorProcessFix(...) should have been
-// called before AlignedFarend(...). Otherwise, you get the pointer to the
-// previous frame. The memory is only valid until the next call of
-// WebRtc_DelayEstimatorProcessFix(...).
-//
-// Inputs:
-//      - self              : Pointer to the AECM instance.
-//      - delay             : Current delay estimate.
-//
-// Output:
-//      - far_q             : The Q-domain of the aligned far end spectrum
-//
-// Return value:
-//      - far_spectrum      : Pointer to the aligned far end spectrum
-//                            NULL - Error
-//
-const uint16_t* WebRtcAecm_AlignedFarend(AecmCore* self,
-                                         int* far_q,
-                                         int delay) {
-  int buffer_position = 0;
-  RTC_DCHECK(self);
-  buffer_position = self->far_history_pos - delay;
-
-  // Check buffer position
-  if (buffer_position < 0) {
-    buffer_position += MAX_DELAY;
-  }
-  // Get Q-domain
-  *far_q = self->far_q_domains[buffer_position];
-  // Return far end spectrum
-  return &(self->far_history[buffer_position * PART_LEN1]);
-}
-
-// Declare function pointers.
-CalcLinearEnergies WebRtcAecm_CalcLinearEnergies;
-StoreAdaptiveChannel WebRtcAecm_StoreAdaptiveChannel;
-ResetAdaptiveChannel WebRtcAecm_ResetAdaptiveChannel;
-
-AecmCore* WebRtcAecm_CreateCore() {
-    AecmCore* aecm = static_cast<AecmCore*>(malloc(sizeof(AecmCore)));
-
-    aecm->farFrameBuf = WebRtc_CreateBuffer(FRAME_LEN + PART_LEN,
-                                            sizeof(int16_t));
-    if (!aecm->farFrameBuf)
-    {
-        WebRtcAecm_FreeCore(aecm);
-        return NULL;
-    }
-
-    aecm->nearNoisyFrameBuf = WebRtc_CreateBuffer(FRAME_LEN + PART_LEN,
-                                                  sizeof(int16_t));
-    if (!aecm->nearNoisyFrameBuf)
-    {
-        WebRtcAecm_FreeCore(aecm);
-        return NULL;
-    }
-
-    aecm->nearCleanFrameBuf = WebRtc_CreateBuffer(FRAME_LEN + PART_LEN,
-                                                  sizeof(int16_t));
-    if (!aecm->nearCleanFrameBuf)
-    {
-        WebRtcAecm_FreeCore(aecm);
-        return NULL;
-    }
-
-    aecm->outFrameBuf = WebRtc_CreateBuffer(FRAME_LEN + PART_LEN,
-                                            sizeof(int16_t));
-    if (!aecm->outFrameBuf)
-    {
-        WebRtcAecm_FreeCore(aecm);
-        return NULL;
-    }
-
-    aecm->delay_estimator_farend = WebRtc_CreateDelayEstimatorFarend(PART_LEN1,
-                                                                     MAX_DELAY);
-    if (aecm->delay_estimator_farend == NULL) {
-      WebRtcAecm_FreeCore(aecm);
-      return NULL;
-    }
-    aecm->delay_estimator =
-        WebRtc_CreateDelayEstimator(aecm->delay_estimator_farend, 0);
-    if (aecm->delay_estimator == NULL) {
-      WebRtcAecm_FreeCore(aecm);
-      return NULL;
-    }
-    // TODO(bjornv): Explicitly disable robust delay validation until no
-    // performance regression has been established.  Then remove the line.
-    WebRtc_enable_robust_validation(aecm->delay_estimator, 0);
-
-    aecm->real_fft = WebRtcSpl_CreateRealFFT(PART_LEN_SHIFT);
-    if (aecm->real_fft == NULL) {
-      WebRtcAecm_FreeCore(aecm);
-      return NULL;
-    }
-
-    // Init some aecm pointers. 16 and 32 byte alignment is only necessary
-    // for Neon code currently.
-    aecm->xBuf = (int16_t*) (((uintptr_t)aecm->xBuf_buf + 31) & ~ 31);
-    aecm->dBufClean = (int16_t*) (((uintptr_t)aecm->dBufClean_buf + 31) & ~ 31);
-    aecm->dBufNoisy = (int16_t*) (((uintptr_t)aecm->dBufNoisy_buf + 31) & ~ 31);
-    aecm->outBuf = (int16_t*) (((uintptr_t)aecm->outBuf_buf + 15) & ~ 15);
-    aecm->channelStored = (int16_t*) (((uintptr_t)
-                                             aecm->channelStored_buf + 15) & ~ 15);
-    aecm->channelAdapt16 = (int16_t*) (((uintptr_t)
-                                              aecm->channelAdapt16_buf + 15) & ~ 15);
-    aecm->channelAdapt32 = (int32_t*) (((uintptr_t)
-                                              aecm->channelAdapt32_buf + 31) & ~ 31);
-
-    return aecm;
-}
-
-void WebRtcAecm_InitEchoPathCore(AecmCore* aecm, const int16_t* echo_path) {
-    int i = 0;
-
-    // Reset the stored channel
-    memcpy(aecm->channelStored, echo_path, sizeof(int16_t) * PART_LEN1);
-    // Reset the adapted channels
-    memcpy(aecm->channelAdapt16, echo_path, sizeof(int16_t) * PART_LEN1);
-    for (i = 0; i < PART_LEN1; i++)
-    {
-        aecm->channelAdapt32[i] = (int32_t)aecm->channelAdapt16[i] << 16;
-    }
-
-    // Reset channel storing variables
-    aecm->mseAdaptOld = 1000;
-    aecm->mseStoredOld = 1000;
-    aecm->mseThreshold = WEBRTC_SPL_WORD32_MAX;
-    aecm->mseChannelCount = 0;
-}
-
-static void CalcLinearEnergiesC(AecmCore* aecm,
-                                const uint16_t* far_spectrum,
-                                int32_t* echo_est,
-                                uint32_t* far_energy,
-                                uint32_t* echo_energy_adapt,
-                                uint32_t* echo_energy_stored) {
-    int i;
-
-    // Get energy for the delayed far end signal and estimated
-    // echo using both stored and adapted channels.
-    for (i = 0; i < PART_LEN1; i++)
-    {
-        echo_est[i] = WEBRTC_SPL_MUL_16_U16(aecm->channelStored[i],
-                                           far_spectrum[i]);
-        (*far_energy) += (uint32_t)(far_spectrum[i]);
-        *echo_energy_adapt += aecm->channelAdapt16[i] * far_spectrum[i];
-        (*echo_energy_stored) += (uint32_t)echo_est[i];
-    }
-}
-
-static void StoreAdaptiveChannelC(AecmCore* aecm,
-                                  const uint16_t* far_spectrum,
-                                  int32_t* echo_est) {
-    int i;
-
-    // During startup we store the channel every block.
-    memcpy(aecm->channelStored, aecm->channelAdapt16, sizeof(int16_t) * PART_LEN1);
-    // Recalculate echo estimate
-    for (i = 0; i < PART_LEN; i += 4)
-    {
-        echo_est[i] = WEBRTC_SPL_MUL_16_U16(aecm->channelStored[i],
-                                           far_spectrum[i]);
-        echo_est[i + 1] = WEBRTC_SPL_MUL_16_U16(aecm->channelStored[i + 1],
-                                           far_spectrum[i + 1]);
-        echo_est[i + 2] = WEBRTC_SPL_MUL_16_U16(aecm->channelStored[i + 2],
-                                           far_spectrum[i + 2]);
-        echo_est[i + 3] = WEBRTC_SPL_MUL_16_U16(aecm->channelStored[i + 3],
-                                           far_spectrum[i + 3]);
-    }
-    echo_est[i] = WEBRTC_SPL_MUL_16_U16(aecm->channelStored[i],
-                                       far_spectrum[i]);
-}
-
-static void ResetAdaptiveChannelC(AecmCore* aecm) {
-    int i;
-
-    // The stored channel has a significantly lower MSE than the adaptive one for
-    // two consecutive calculations. Reset the adaptive channel.
-    memcpy(aecm->channelAdapt16, aecm->channelStored,
-           sizeof(int16_t) * PART_LEN1);
-    // Restore the W32 channel
-    for (i = 0; i < PART_LEN; i += 4)
-    {
-        aecm->channelAdapt32[i] = (int32_t)aecm->channelStored[i] << 16;
-        aecm->channelAdapt32[i + 1] = (int32_t)aecm->channelStored[i + 1] << 16;
-        aecm->channelAdapt32[i + 2] = (int32_t)aecm->channelStored[i + 2] << 16;
-        aecm->channelAdapt32[i + 3] = (int32_t)aecm->channelStored[i + 3] << 16;
-    }
-    aecm->channelAdapt32[i] = (int32_t)aecm->channelStored[i] << 16;
-}
-
-// Initialize function pointers for ARM Neon platform.
-#if defined(WEBRTC_HAS_NEON)
-static void WebRtcAecm_InitNeon(void)
-{
-  WebRtcAecm_StoreAdaptiveChannel = WebRtcAecm_StoreAdaptiveChannelNeon;
-  WebRtcAecm_ResetAdaptiveChannel = WebRtcAecm_ResetAdaptiveChannelNeon;
-  WebRtcAecm_CalcLinearEnergies = WebRtcAecm_CalcLinearEnergiesNeon;
-}
-#endif
-
-// Initialize function pointers for MIPS platform.
-#if defined(MIPS32_LE)
-static void WebRtcAecm_InitMips(void)
-{
-#if defined(MIPS_DSP_R1_LE)
-  WebRtcAecm_StoreAdaptiveChannel = WebRtcAecm_StoreAdaptiveChannel_mips;
-  WebRtcAecm_ResetAdaptiveChannel = WebRtcAecm_ResetAdaptiveChannel_mips;
-#endif
-  WebRtcAecm_CalcLinearEnergies = WebRtcAecm_CalcLinearEnergies_mips;
-}
-#endif
-
-// WebRtcAecm_InitCore(...)
-//
-// This function initializes the AECM instant created with WebRtcAecm_CreateCore(...)
-// Input:
-//      - aecm            : Pointer to the Echo Suppression instance
-//      - samplingFreq   : Sampling Frequency
-//
-// Output:
-//      - aecm            : Initialized instance
-//
-// Return value         :  0 - Ok
-//                        -1 - Error
-//
-int WebRtcAecm_InitCore(AecmCore* const aecm, int samplingFreq) {
-    int i = 0;
-    int32_t tmp32 = PART_LEN1 * PART_LEN1;
-    int16_t tmp16 = PART_LEN1;
-
-    if (samplingFreq != 8000 && samplingFreq != 16000)
-    {
-        samplingFreq = 8000;
-        return -1;
-    }
-    // sanity check of sampling frequency
-    aecm->mult = (int16_t)samplingFreq / 8000;
-
-    aecm->farBufWritePos = 0;
-    aecm->farBufReadPos = 0;
-    aecm->knownDelay = 0;
-    aecm->lastKnownDelay = 0;
-
-    WebRtc_InitBuffer(aecm->farFrameBuf);
-    WebRtc_InitBuffer(aecm->nearNoisyFrameBuf);
-    WebRtc_InitBuffer(aecm->nearCleanFrameBuf);
-    WebRtc_InitBuffer(aecm->outFrameBuf);
-
-    memset(aecm->xBuf_buf, 0, sizeof(aecm->xBuf_buf));
-    memset(aecm->dBufClean_buf, 0, sizeof(aecm->dBufClean_buf));
-    memset(aecm->dBufNoisy_buf, 0, sizeof(aecm->dBufNoisy_buf));
-    memset(aecm->outBuf_buf, 0, sizeof(aecm->outBuf_buf));
-
-    aecm->seed = 666;
-    aecm->totCount = 0;
-
-    if (WebRtc_InitDelayEstimatorFarend(aecm->delay_estimator_farend) != 0) {
-      return -1;
-    }
-    if (WebRtc_InitDelayEstimator(aecm->delay_estimator) != 0) {
-      return -1;
-    }
-    // Set far end histories to zero
-    memset(aecm->far_history, 0, sizeof(uint16_t) * PART_LEN1 * MAX_DELAY);
-    memset(aecm->far_q_domains, 0, sizeof(int) * MAX_DELAY);
-    aecm->far_history_pos = MAX_DELAY;
-
-    aecm->nlpFlag = 1;
-    aecm->fixedDelay = -1;
-
-    aecm->dfaCleanQDomain = 0;
-    aecm->dfaCleanQDomainOld = 0;
-    aecm->dfaNoisyQDomain = 0;
-    aecm->dfaNoisyQDomainOld = 0;
-
-    memset(aecm->nearLogEnergy, 0, sizeof(aecm->nearLogEnergy));
-    aecm->farLogEnergy = 0;
-    memset(aecm->echoAdaptLogEnergy, 0, sizeof(aecm->echoAdaptLogEnergy));
-    memset(aecm->echoStoredLogEnergy, 0, sizeof(aecm->echoStoredLogEnergy));
-
-    // Initialize the echo channels with a stored shape.
-    if (samplingFreq == 8000)
-    {
-        WebRtcAecm_InitEchoPathCore(aecm, kChannelStored8kHz);
-    }
-    else
-    {
-        WebRtcAecm_InitEchoPathCore(aecm, kChannelStored16kHz);
-    }
-
-    memset(aecm->echoFilt, 0, sizeof(aecm->echoFilt));
-    memset(aecm->nearFilt, 0, sizeof(aecm->nearFilt));
-    aecm->noiseEstCtr = 0;
-
-    aecm->cngMode = AecmTrue;
-
-    memset(aecm->noiseEstTooLowCtr, 0, sizeof(aecm->noiseEstTooLowCtr));
-    memset(aecm->noiseEstTooHighCtr, 0, sizeof(aecm->noiseEstTooHighCtr));
-    // Shape the initial noise level to an approximate pink noise.
-    for (i = 0; i < (PART_LEN1 >> 1) - 1; i++)
-    {
-        aecm->noiseEst[i] = (tmp32 << 8);
-        tmp16--;
-        tmp32 -= (int32_t)((tmp16 << 1) + 1);
-    }
-    for (; i < PART_LEN1; i++)
-    {
-        aecm->noiseEst[i] = (tmp32 << 8);
-    }
-
-    aecm->farEnergyMin = WEBRTC_SPL_WORD16_MAX;
-    aecm->farEnergyMax = WEBRTC_SPL_WORD16_MIN;
-    aecm->farEnergyMaxMin = 0;
-    aecm->farEnergyVAD = FAR_ENERGY_MIN; // This prevents false speech detection at the
-                                         // beginning.
-    aecm->farEnergyMSE = 0;
-    aecm->currentVADValue = 0;
-    aecm->vadUpdateCount = 0;
-    aecm->firstVAD = 1;
-
-    aecm->startupState = 0;
-    aecm->supGain = SUPGAIN_DEFAULT;
-    aecm->supGainOld = SUPGAIN_DEFAULT;
-
-    aecm->supGainErrParamA = SUPGAIN_ERROR_PARAM_A;
-    aecm->supGainErrParamD = SUPGAIN_ERROR_PARAM_D;
-    aecm->supGainErrParamDiffAB = SUPGAIN_ERROR_PARAM_A - SUPGAIN_ERROR_PARAM_B;
-    aecm->supGainErrParamDiffBD = SUPGAIN_ERROR_PARAM_B - SUPGAIN_ERROR_PARAM_D;
-
-    // Assert a preprocessor definition at compile-time. It's an assumption
-    // used in assembly code, so check the assembly files before any change.
-    static_assert(PART_LEN % 16 == 0, "PART_LEN is not a multiple of 16");
-
-    // Initialize function pointers.
-    WebRtcAecm_CalcLinearEnergies = CalcLinearEnergiesC;
-    WebRtcAecm_StoreAdaptiveChannel = StoreAdaptiveChannelC;
-    WebRtcAecm_ResetAdaptiveChannel = ResetAdaptiveChannelC;
-
-#if defined(WEBRTC_HAS_NEON)
-    WebRtcAecm_InitNeon();
-#endif
-
-#if defined(MIPS32_LE)
-    WebRtcAecm_InitMips();
-#endif
-    return 0;
-}
-
-// TODO(bjornv): This function is currently not used. Add support for these
-// parameters from a higher level
-int WebRtcAecm_Control(AecmCore* aecm, int delay, int nlpFlag) {
-    aecm->nlpFlag = nlpFlag;
-    aecm->fixedDelay = delay;
-
-    return 0;
-}
-
-void WebRtcAecm_FreeCore(AecmCore* aecm) {
-    if (aecm == NULL) {
-      return;
-    }
-
-    WebRtc_FreeBuffer(aecm->farFrameBuf);
-    WebRtc_FreeBuffer(aecm->nearNoisyFrameBuf);
-    WebRtc_FreeBuffer(aecm->nearCleanFrameBuf);
-    WebRtc_FreeBuffer(aecm->outFrameBuf);
-
-    WebRtc_FreeDelayEstimator(aecm->delay_estimator);
-    WebRtc_FreeDelayEstimatorFarend(aecm->delay_estimator_farend);
-    WebRtcSpl_FreeRealFFT(aecm->real_fft);
-
-    free(aecm);
-}
-
-int WebRtcAecm_ProcessFrame(AecmCore* aecm,
-                            const int16_t* farend,
-                            const int16_t* nearendNoisy,
-                            const int16_t* nearendClean,
-                            int16_t* out) {
-    int16_t outBlock_buf[PART_LEN + 8]; // Align buffer to 8-byte boundary.
-    int16_t* outBlock = (int16_t*) (((uintptr_t) outBlock_buf + 15) & ~ 15);
-
-    int16_t farFrame[FRAME_LEN];
-    const int16_t* out_ptr = NULL;
-    int size = 0;
-
-    // Buffer the current frame.
-    // Fetch an older one corresponding to the delay.
-    WebRtcAecm_BufferFarFrame(aecm, farend, FRAME_LEN);
-    WebRtcAecm_FetchFarFrame(aecm, farFrame, FRAME_LEN, aecm->knownDelay);
-
-    // Buffer the synchronized far and near frames,
-    // to pass the smaller blocks individually.
-    WebRtc_WriteBuffer(aecm->farFrameBuf, farFrame, FRAME_LEN);
-    WebRtc_WriteBuffer(aecm->nearNoisyFrameBuf, nearendNoisy, FRAME_LEN);
-    if (nearendClean != NULL)
-    {
-        WebRtc_WriteBuffer(aecm->nearCleanFrameBuf, nearendClean, FRAME_LEN);
-    }
-
-    // Process as many blocks as possible.
-    while (WebRtc_available_read(aecm->farFrameBuf) >= PART_LEN)
-    {
-        int16_t far_block[PART_LEN];
-        const int16_t* far_block_ptr = NULL;
-        int16_t near_noisy_block[PART_LEN];
-        const int16_t* near_noisy_block_ptr = NULL;
-
-        WebRtc_ReadBuffer(aecm->farFrameBuf, (void**) &far_block_ptr, far_block,
-                          PART_LEN);
-        WebRtc_ReadBuffer(aecm->nearNoisyFrameBuf,
-                          (void**) &near_noisy_block_ptr,
-                          near_noisy_block,
-                          PART_LEN);
-        if (nearendClean != NULL)
-        {
-            int16_t near_clean_block[PART_LEN];
-            const int16_t* near_clean_block_ptr = NULL;
-
-            WebRtc_ReadBuffer(aecm->nearCleanFrameBuf,
-                              (void**) &near_clean_block_ptr,
-                              near_clean_block,
-                              PART_LEN);
-            if (WebRtcAecm_ProcessBlock(aecm,
-                                        far_block_ptr,
-                                        near_noisy_block_ptr,
-                                        near_clean_block_ptr,
-                                        outBlock) == -1)
-            {
-                return -1;
-            }
-        } else
-        {
-            if (WebRtcAecm_ProcessBlock(aecm,
-                                        far_block_ptr,
-                                        near_noisy_block_ptr,
-                                        NULL,
-                                        outBlock) == -1)
-            {
-                return -1;
-            }
-        }
-
-        WebRtc_WriteBuffer(aecm->outFrameBuf, outBlock, PART_LEN);
-    }
-
-    // Stuff the out buffer if we have less than a frame to output.
-    // This should only happen for the first frame.
-    size = (int) WebRtc_available_read(aecm->outFrameBuf);
-    if (size < FRAME_LEN)
-    {
-        WebRtc_MoveReadPtr(aecm->outFrameBuf, size - FRAME_LEN);
-    }
-
-    // Obtain an output frame.
-    WebRtc_ReadBuffer(aecm->outFrameBuf, (void**) &out_ptr, out, FRAME_LEN);
-    if (out_ptr != out) {
-      // ReadBuffer() hasn't copied to |out| in this case.
-      memcpy(out, out_ptr, FRAME_LEN * sizeof(int16_t));
-    }
-
-    return 0;
-}
-
-// WebRtcAecm_AsymFilt(...)
-//
-// Performs asymmetric filtering.
-//
-// Inputs:
-//      - filtOld       : Previous filtered value.
-//      - inVal         : New input value.
-//      - stepSizePos   : Step size when we have a positive contribution.
-//      - stepSizeNeg   : Step size when we have a negative contribution.
-//
-// Output:
-//
-// Return: - Filtered value.
-//
-int16_t WebRtcAecm_AsymFilt(const int16_t filtOld, const int16_t inVal,
-                            const int16_t stepSizePos,
-                            const int16_t stepSizeNeg)
-{
-    int16_t retVal;
-
-    if ((filtOld == WEBRTC_SPL_WORD16_MAX) | (filtOld == WEBRTC_SPL_WORD16_MIN))
-    {
-        return inVal;
-    }
-    retVal = filtOld;
-    if (filtOld > inVal)
-    {
-        retVal -= (filtOld - inVal) >> stepSizeNeg;
-    } else
-    {
-        retVal += (inVal - filtOld) >> stepSizePos;
-    }
-
-    return retVal;
-}
-
-// ExtractFractionPart(a, zeros)
-//
-// returns the fraction part of |a|, with |zeros| number of leading zeros, as an
-// int16_t scaled to Q8. There is no sanity check of |a| in the sense that the
-// number of zeros match.
-static int16_t ExtractFractionPart(uint32_t a, int zeros) {
-  return (int16_t)(((a << zeros) & 0x7FFFFFFF) >> 23);
-}
-
-// Calculates and returns the log of |energy| in Q8. The input |energy| is
-// supposed to be in Q(|q_domain|).
-static int16_t LogOfEnergyInQ8(uint32_t energy, int q_domain) {
-  static const int16_t kLogLowValue = PART_LEN_SHIFT << 7;
-  int16_t log_energy_q8 = kLogLowValue;
-  if (energy > 0) {
-    int zeros = WebRtcSpl_NormU32(energy);
-    int16_t frac = ExtractFractionPart(energy, zeros);
-    // log2 of |energy| in Q8.
-    log_energy_q8 += ((31 - zeros) << 8) + frac - (q_domain << 8);
-  }
-  return log_energy_q8;
-}
-
-// WebRtcAecm_CalcEnergies(...)
-//
-// This function calculates the log of energies for nearend, farend and estimated
-// echoes. There is also an update of energy decision levels, i.e. internal VAD.
-//
-//
-// @param  aecm         [i/o]   Handle of the AECM instance.
-// @param  far_spectrum [in]    Pointer to farend spectrum.
-// @param  far_q        [in]    Q-domain of farend spectrum.
-// @param  nearEner     [in]    Near end energy for current block in
-//                              Q(aecm->dfaQDomain).
-// @param  echoEst      [out]   Estimated echo in Q(xfa_q+RESOLUTION_CHANNEL16).
-//
-void WebRtcAecm_CalcEnergies(AecmCore* aecm,
-                             const uint16_t* far_spectrum,
-                             const int16_t far_q,
-                             const uint32_t nearEner,
-                             int32_t* echoEst) {
-    // Local variables
-    uint32_t tmpAdapt = 0;
-    uint32_t tmpStored = 0;
-    uint32_t tmpFar = 0;
-
-    int i;
-
-    int16_t tmp16;
-    int16_t increase_max_shifts = 4;
-    int16_t decrease_max_shifts = 11;
-    int16_t increase_min_shifts = 11;
-    int16_t decrease_min_shifts = 3;
-
-    // Get log of near end energy and store in buffer
-
-    // Shift buffer
-    memmove(aecm->nearLogEnergy + 1, aecm->nearLogEnergy,
-            sizeof(int16_t) * (MAX_BUF_LEN - 1));
-
-    // Logarithm of integrated magnitude spectrum (nearEner)
-    aecm->nearLogEnergy[0] = LogOfEnergyInQ8(nearEner, aecm->dfaNoisyQDomain);
-
-    WebRtcAecm_CalcLinearEnergies(aecm, far_spectrum, echoEst, &tmpFar, &tmpAdapt, &tmpStored);
-
-    // Shift buffers
-    memmove(aecm->echoAdaptLogEnergy + 1, aecm->echoAdaptLogEnergy,
-            sizeof(int16_t) * (MAX_BUF_LEN - 1));
-    memmove(aecm->echoStoredLogEnergy + 1, aecm->echoStoredLogEnergy,
-            sizeof(int16_t) * (MAX_BUF_LEN - 1));
-
-    // Logarithm of delayed far end energy
-    aecm->farLogEnergy = LogOfEnergyInQ8(tmpFar, far_q);
-
-    // Logarithm of estimated echo energy through adapted channel
-    aecm->echoAdaptLogEnergy[0] = LogOfEnergyInQ8(tmpAdapt,
-                                                  RESOLUTION_CHANNEL16 + far_q);
-
-    // Logarithm of estimated echo energy through stored channel
-    aecm->echoStoredLogEnergy[0] =
-        LogOfEnergyInQ8(tmpStored, RESOLUTION_CHANNEL16 + far_q);
-
-    // Update farend energy levels (min, max, vad, mse)
-    if (aecm->farLogEnergy > FAR_ENERGY_MIN)
-    {
-        if (aecm->startupState == 0)
-        {
-            increase_max_shifts = 2;
-            decrease_min_shifts = 2;
-            increase_min_shifts = 8;
-        }
-
-        aecm->farEnergyMin = WebRtcAecm_AsymFilt(aecm->farEnergyMin, aecm->farLogEnergy,
-                                                 increase_min_shifts, decrease_min_shifts);
-        aecm->farEnergyMax = WebRtcAecm_AsymFilt(aecm->farEnergyMax, aecm->farLogEnergy,
-                                                 increase_max_shifts, decrease_max_shifts);
-        aecm->farEnergyMaxMin = (aecm->farEnergyMax - aecm->farEnergyMin);
-
-        // Dynamic VAD region size
-        tmp16 = 2560 - aecm->farEnergyMin;
-        if (tmp16 > 0)
-        {
-          tmp16 = (int16_t)((tmp16 * FAR_ENERGY_VAD_REGION) >> 9);
-        } else
-        {
-            tmp16 = 0;
-        }
-        tmp16 += FAR_ENERGY_VAD_REGION;
-
-        if ((aecm->startupState == 0) | (aecm->vadUpdateCount > 1024))
-        {
-            // In startup phase or VAD update halted
-            aecm->farEnergyVAD = aecm->farEnergyMin + tmp16;
-        } else
-        {
-            if (aecm->farEnergyVAD > aecm->farLogEnergy)
-            {
-                aecm->farEnergyVAD +=
-                    (aecm->farLogEnergy + tmp16 - aecm->farEnergyVAD) >> 6;
-                aecm->vadUpdateCount = 0;
-            } else
-            {
-                aecm->vadUpdateCount++;
-            }
-        }
-        // Put MSE threshold higher than VAD
-        aecm->farEnergyMSE = aecm->farEnergyVAD + (1 << 8);
-    }
-
-    // Update VAD variables
-    if (aecm->farLogEnergy > aecm->farEnergyVAD)
-    {
-        if ((aecm->startupState == 0) | (aecm->farEnergyMaxMin > FAR_ENERGY_DIFF))
-        {
-            // We are in startup or have significant dynamics in input speech level
-            aecm->currentVADValue = 1;
-        }
-    } else
-    {
-        aecm->currentVADValue = 0;
-    }
-    if ((aecm->currentVADValue) && (aecm->firstVAD))
-    {
-        aecm->firstVAD = 0;
-        if (aecm->echoAdaptLogEnergy[0] > aecm->nearLogEnergy[0])
-        {
-            // The estimated echo has higher energy than the near end signal.
-            // This means that the initialization was too aggressive. Scale
-            // down by a factor 8
-            for (i = 0; i < PART_LEN1; i++)
-            {
-                aecm->channelAdapt16[i] >>= 3;
-            }
-            // Compensate the adapted echo energy level accordingly.
-            aecm->echoAdaptLogEnergy[0] -= (3 << 8);
-            aecm->firstVAD = 1;
-        }
-    }
-}
-
-// WebRtcAecm_CalcStepSize(...)
-//
-// This function calculates the step size used in channel estimation
-//
-//
-// @param  aecm  [in]    Handle of the AECM instance.
-// @param  mu    [out]   (Return value) Stepsize in log2(), i.e. number of shifts.
-//
-//
-int16_t WebRtcAecm_CalcStepSize(AecmCore* const aecm) {
-    int32_t tmp32;
-    int16_t tmp16;
-    int16_t mu = MU_MAX;
-
-    // Here we calculate the step size mu used in the
-    // following NLMS based Channel estimation algorithm
-    if (!aecm->currentVADValue)
-    {
-        // Far end energy level too low, no channel update
-        mu = 0;
-    } else if (aecm->startupState > 0)
-    {
-        if (aecm->farEnergyMin >= aecm->farEnergyMax)
-        {
-            mu = MU_MIN;
-        } else
-        {
-            tmp16 = (aecm->farLogEnergy - aecm->farEnergyMin);
-            tmp32 = tmp16 * MU_DIFF;
-            tmp32 = WebRtcSpl_DivW32W16(tmp32, aecm->farEnergyMaxMin);
-            mu = MU_MIN - 1 - (int16_t)(tmp32);
-            // The -1 is an alternative to rounding. This way we get a larger
-            // stepsize, so we in some sense compensate for truncation in NLMS
-        }
-        if (mu < MU_MAX)
-        {
-            mu = MU_MAX; // Equivalent with maximum step size of 2^-MU_MAX
-        }
-    }
-
-    return mu;
-}
-
-// WebRtcAecm_UpdateChannel(...)
-//
-// This function performs channel estimation. NLMS and decision on channel storage.
-//
-//
-// @param  aecm         [i/o]   Handle of the AECM instance.
-// @param  far_spectrum [in]    Absolute value of the farend signal in Q(far_q)
-// @param  far_q        [in]    Q-domain of the farend signal
-// @param  dfa          [in]    Absolute value of the nearend signal (Q[aecm->dfaQDomain])
-// @param  mu           [in]    NLMS step size.
-// @param  echoEst      [i/o]   Estimated echo in Q(far_q+RESOLUTION_CHANNEL16).
-//
-void WebRtcAecm_UpdateChannel(AecmCore* aecm,
-                              const uint16_t* far_spectrum,
-                              const int16_t far_q,
-                              const uint16_t* const dfa,
-                              const int16_t mu,
-                              int32_t* echoEst) {
-    uint32_t tmpU32no1, tmpU32no2;
-    int32_t tmp32no1, tmp32no2;
-    int32_t mseStored;
-    int32_t mseAdapt;
-
-    int i;
-
-    int16_t zerosFar, zerosNum, zerosCh, zerosDfa;
-    int16_t shiftChFar, shiftNum, shift2ResChan;
-    int16_t tmp16no1;
-    int16_t xfaQ, dfaQ;
-
-    // This is the channel estimation algorithm. It is base on NLMS but has a variable step
-    // length, which was calculated above.
-    if (mu)
-    {
-        for (i = 0; i < PART_LEN1; i++)
-        {
-            // Determine norm of channel and farend to make sure we don't get overflow in
-            // multiplication
-            zerosCh = WebRtcSpl_NormU32(aecm->channelAdapt32[i]);
-            zerosFar = WebRtcSpl_NormU32((uint32_t)far_spectrum[i]);
-            if (zerosCh + zerosFar > 31)
-            {
-                // Multiplication is safe
-                tmpU32no1 = WEBRTC_SPL_UMUL_32_16(aecm->channelAdapt32[i],
-                        far_spectrum[i]);
-                shiftChFar = 0;
-            } else
-            {
-                // We need to shift down before multiplication
-                shiftChFar = 32 - zerosCh - zerosFar;
-                tmpU32no1 = rtc::dchecked_cast<uint32_t>(
-                    aecm->channelAdapt32[i] >> shiftChFar) * far_spectrum[i];
-            }
-            // Determine Q-domain of numerator
-            zerosNum = WebRtcSpl_NormU32(tmpU32no1);
-            if (dfa[i])
-            {
-                zerosDfa = WebRtcSpl_NormU32((uint32_t)dfa[i]);
-            } else
-            {
-                zerosDfa = 32;
-            }
-            tmp16no1 = zerosDfa - 2 + aecm->dfaNoisyQDomain -
-                RESOLUTION_CHANNEL32 - far_q + shiftChFar;
-            if (zerosNum > tmp16no1 + 1)
-            {
-                xfaQ = tmp16no1;
-                dfaQ = zerosDfa - 2;
-            } else
-            {
-                xfaQ = zerosNum - 2;
-                dfaQ = RESOLUTION_CHANNEL32 + far_q - aecm->dfaNoisyQDomain -
-                    shiftChFar + xfaQ;
-            }
-            // Add in the same Q-domain
-            tmpU32no1 = WEBRTC_SPL_SHIFT_W32(tmpU32no1, xfaQ);
-            tmpU32no2 = WEBRTC_SPL_SHIFT_W32((uint32_t)dfa[i], dfaQ);
-            tmp32no1 = (int32_t)tmpU32no2 - (int32_t)tmpU32no1;
-            zerosNum = WebRtcSpl_NormW32(tmp32no1);
-            if ((tmp32no1) && (far_spectrum[i] > (CHANNEL_VAD << far_q)))
-            {
-                //
-                // Update is needed
-                //
-                // This is what we would like to compute
-                //
-                // tmp32no1 = dfa[i] - (aecm->channelAdapt[i] * far_spectrum[i])
-                // tmp32norm = (i + 1)
-                // aecm->channelAdapt[i] += (2^mu) * tmp32no1
-                //                        / (tmp32norm * far_spectrum[i])
-                //
-
-                // Make sure we don't get overflow in multiplication.
-                if (zerosNum + zerosFar > 31)
-                {
-                    if (tmp32no1 > 0)
-                    {
-                        tmp32no2 = (int32_t)WEBRTC_SPL_UMUL_32_16(tmp32no1,
-                                                                        far_spectrum[i]);
-                    } else
-                    {
-                        tmp32no2 = -(int32_t)WEBRTC_SPL_UMUL_32_16(-tmp32no1,
-                                                                         far_spectrum[i]);
-                    }
-                    shiftNum = 0;
-                } else
-                {
-                    shiftNum = 32 - (zerosNum + zerosFar);
-                    if (tmp32no1 > 0)
-                    {
-                        tmp32no2 = (tmp32no1 >> shiftNum) * far_spectrum[i];
-                    } else
-                    {
-                        tmp32no2 = -((-tmp32no1 >> shiftNum) * far_spectrum[i]);
-                    }
-                }
-                // Normalize with respect to frequency bin
-                tmp32no2 = WebRtcSpl_DivW32W16(tmp32no2, i + 1);
-                // Make sure we are in the right Q-domain
-                shift2ResChan = shiftNum + shiftChFar - xfaQ - mu - ((30 - zerosFar) << 1);
-                if (WebRtcSpl_NormW32(tmp32no2) < shift2ResChan)
-                {
-                    tmp32no2 = WEBRTC_SPL_WORD32_MAX;
-                } else
-                {
-                    tmp32no2 = WEBRTC_SPL_SHIFT_W32(tmp32no2, shift2ResChan);
-                }
-                aecm->channelAdapt32[i] =
-                    WebRtcSpl_AddSatW32(aecm->channelAdapt32[i], tmp32no2);
-                if (aecm->channelAdapt32[i] < 0)
-                {
-                    // We can never have negative channel gain
-                    aecm->channelAdapt32[i] = 0;
-                }
-                aecm->channelAdapt16[i] =
-                    (int16_t)(aecm->channelAdapt32[i] >> 16);
-            }
-        }
-    }
-    // END: Adaptive channel update
-
-    // Determine if we should store or restore the channel
-    if ((aecm->startupState == 0) & (aecm->currentVADValue))
-    {
-        // During startup we store the channel every block,
-        // and we recalculate echo estimate
-        WebRtcAecm_StoreAdaptiveChannel(aecm, far_spectrum, echoEst);
-    } else
-    {
-        if (aecm->farLogEnergy < aecm->farEnergyMSE)
-        {
-            aecm->mseChannelCount = 0;
-        } else
-        {
-            aecm->mseChannelCount++;
-        }
-        // Enough data for validation. Store channel if we can.
-        if (aecm->mseChannelCount >= (MIN_MSE_COUNT + 10))
-        {
-            // We have enough data.
-            // Calculate MSE of "Adapt" and "Stored" versions.
-            // It is actually not MSE, but average absolute error.
-            mseStored = 0;
-            mseAdapt = 0;
-            for (i = 0; i < MIN_MSE_COUNT; i++)
-            {
-                tmp32no1 = ((int32_t)aecm->echoStoredLogEnergy[i]
-                        - (int32_t)aecm->nearLogEnergy[i]);
-                tmp32no2 = WEBRTC_SPL_ABS_W32(tmp32no1);
-                mseStored += tmp32no2;
-
-                tmp32no1 = ((int32_t)aecm->echoAdaptLogEnergy[i]
-                        - (int32_t)aecm->nearLogEnergy[i]);
-                tmp32no2 = WEBRTC_SPL_ABS_W32(tmp32no1);
-                mseAdapt += tmp32no2;
-            }
-            if (((mseStored << MSE_RESOLUTION) < (MIN_MSE_DIFF * mseAdapt))
-                    & ((aecm->mseStoredOld << MSE_RESOLUTION) < (MIN_MSE_DIFF
-                            * aecm->mseAdaptOld)))
-            {
-                // The stored channel has a significantly lower MSE than the adaptive one for
-                // two consecutive calculations. Reset the adaptive channel.
-                WebRtcAecm_ResetAdaptiveChannel(aecm);
-            } else if (((MIN_MSE_DIFF * mseStored) > (mseAdapt << MSE_RESOLUTION)) & (mseAdapt
-                    < aecm->mseThreshold) & (aecm->mseAdaptOld < aecm->mseThreshold))
-            {
-                // The adaptive channel has a significantly lower MSE than the stored one.
-                // The MSE for the adaptive channel has also been low for two consecutive
-                // calculations. Store the adaptive channel.
-                WebRtcAecm_StoreAdaptiveChannel(aecm, far_spectrum, echoEst);
-
-                // Update threshold
-                if (aecm->mseThreshold == WEBRTC_SPL_WORD32_MAX)
-                {
-                    aecm->mseThreshold = (mseAdapt + aecm->mseAdaptOld);
-                } else
-                {
-                  int scaled_threshold = aecm->mseThreshold * 5 / 8;
-                  aecm->mseThreshold +=
-                      ((mseAdapt - scaled_threshold) * 205) >> 8;
-                }
-
-            }
-
-            // Reset counter
-            aecm->mseChannelCount = 0;
-
-            // Store the MSE values.
-            aecm->mseStoredOld = mseStored;
-            aecm->mseAdaptOld = mseAdapt;
-        }
-    }
-    // END: Determine if we should store or reset channel estimate.
-}
-
-// CalcSuppressionGain(...)
-//
-// This function calculates the suppression gain that is used in the Wiener filter.
-//
-//
-// @param  aecm     [i/n]   Handle of the AECM instance.
-// @param  supGain  [out]   (Return value) Suppression gain with which to scale the noise
-//                          level (Q14).
-//
-//
-int16_t WebRtcAecm_CalcSuppressionGain(AecmCore* const aecm) {
-    int32_t tmp32no1;
-
-    int16_t supGain = SUPGAIN_DEFAULT;
-    int16_t tmp16no1;
-    int16_t dE = 0;
-
-    // Determine suppression gain used in the Wiener filter. The gain is based on a mix of far
-    // end energy and echo estimation error.
-    // Adjust for the far end signal level. A low signal level indicates no far end signal,
-    // hence we set the suppression gain to 0
-    if (!aecm->currentVADValue)
-    {
-        supGain = 0;
-    } else
-    {
-        // Adjust for possible double talk. If we have large variations in estimation error we
-        // likely have double talk (or poor channel).
-        tmp16no1 = (aecm->nearLogEnergy[0] - aecm->echoStoredLogEnergy[0] - ENERGY_DEV_OFFSET);
-        dE = WEBRTC_SPL_ABS_W16(tmp16no1);
-
-        if (dE < ENERGY_DEV_TOL)
-        {
-            // Likely no double talk. The better estimation, the more we can suppress signal.
-            // Update counters
-            if (dE < SUPGAIN_EPC_DT)
-            {
-                tmp32no1 = aecm->supGainErrParamDiffAB * dE;
-                tmp32no1 += (SUPGAIN_EPC_DT >> 1);
-                tmp16no1 = (int16_t)WebRtcSpl_DivW32W16(tmp32no1, SUPGAIN_EPC_DT);
-                supGain = aecm->supGainErrParamA - tmp16no1;
-            } else
-            {
-                tmp32no1 = aecm->supGainErrParamDiffBD * (ENERGY_DEV_TOL - dE);
-                tmp32no1 += ((ENERGY_DEV_TOL - SUPGAIN_EPC_DT) >> 1);
-                tmp16no1 = (int16_t)WebRtcSpl_DivW32W16(tmp32no1, (ENERGY_DEV_TOL
-                        - SUPGAIN_EPC_DT));
-                supGain = aecm->supGainErrParamD + tmp16no1;
-            }
-        } else
-        {
-            // Likely in double talk. Use default value
-            supGain = aecm->supGainErrParamD;
-        }
-    }
-
-    if (supGain > aecm->supGainOld)
-    {
-        tmp16no1 = supGain;
-    } else
-    {
-        tmp16no1 = aecm->supGainOld;
-    }
-    aecm->supGainOld = supGain;
-    if (tmp16no1 < aecm->supGain)
-    {
-        aecm->supGain += (int16_t)((tmp16no1 - aecm->supGain) >> 4);
-    } else
-    {
-        aecm->supGain += (int16_t)((tmp16no1 - aecm->supGain) >> 4);
-    }
-
-    // END: Update suppression gain
-
-    return aecm->supGain;
-}
-
-void WebRtcAecm_BufferFarFrame(AecmCore* const aecm,
-                               const int16_t* const farend,
-                               const int farLen) {
-    int writeLen = farLen, writePos = 0;
-
-    // Check if the write position must be wrapped
-    while (aecm->farBufWritePos + writeLen > FAR_BUF_LEN)
-    {
-        // Write to remaining buffer space before wrapping
-        writeLen = FAR_BUF_LEN - aecm->farBufWritePos;
-        memcpy(aecm->farBuf + aecm->farBufWritePos, farend + writePos,
-               sizeof(int16_t) * writeLen);
-        aecm->farBufWritePos = 0;
-        writePos = writeLen;
-        writeLen = farLen - writeLen;
-    }
-
-    memcpy(aecm->farBuf + aecm->farBufWritePos, farend + writePos,
-           sizeof(int16_t) * writeLen);
-    aecm->farBufWritePos += writeLen;
-}
-
-void WebRtcAecm_FetchFarFrame(AecmCore* const aecm,
-                              int16_t* const farend,
-                              const int farLen,
-                              const int knownDelay) {
-    int readLen = farLen;
-    int readPos = 0;
-    int delayChange = knownDelay - aecm->lastKnownDelay;
-
-    aecm->farBufReadPos -= delayChange;
-
-    // Check if delay forces a read position wrap
-    while (aecm->farBufReadPos < 0)
-    {
-        aecm->farBufReadPos += FAR_BUF_LEN;
-    }
-    while (aecm->farBufReadPos > FAR_BUF_LEN - 1)
-    {
-        aecm->farBufReadPos -= FAR_BUF_LEN;
-    }
-
-    aecm->lastKnownDelay = knownDelay;
-
-    // Check if read position must be wrapped
-    while (aecm->farBufReadPos + readLen > FAR_BUF_LEN)
-    {
-
-        // Read from remaining buffer space before wrapping
-        readLen = FAR_BUF_LEN - aecm->farBufReadPos;
-        memcpy(farend + readPos, aecm->farBuf + aecm->farBufReadPos,
-               sizeof(int16_t) * readLen);
-        aecm->farBufReadPos = 0;
-        readPos = readLen;
-        readLen = farLen - readLen;
-    }
-    memcpy(farend + readPos, aecm->farBuf + aecm->farBufReadPos,
-           sizeof(int16_t) * readLen);
-    aecm->farBufReadPos += readLen;
-}
diff --git a/modules/audio_processing/aecm/aecm_core.h b/modules/audio_processing/aecm/aecm_core.h
deleted file mode 100644
index 33d8088..0000000
--- a/modules/audio_processing/aecm/aecm_core.h
+++ /dev/null
@@ -1,436 +0,0 @@
-/*
- *  Copyright (c) 2012 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.
- */
-
-// Performs echo control (suppression) with fft routines in fixed-point.
-
-#ifndef WEBRTC_MODULES_AUDIO_PROCESSING_AECM_AECM_CORE_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_AECM_AECM_CORE_H_
-
-extern "C" {
-#include "webrtc/common_audio/ring_buffer.h"
-#include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
-}
-#include "webrtc/modules/audio_processing/aecm/aecm_defines.h"
-#include "webrtc/typedefs.h"
-
-#ifdef _MSC_VER  // visual c++
-#define ALIGN8_BEG __declspec(align(8))
-#define ALIGN8_END
-#else  // gcc or icc
-#define ALIGN8_BEG
-#define ALIGN8_END __attribute__((aligned(8)))
-#endif
-
-typedef struct {
-    int16_t real;
-    int16_t imag;
-} ComplexInt16;
-
-typedef struct {
-    int farBufWritePos;
-    int farBufReadPos;
-    int knownDelay;
-    int lastKnownDelay;
-    int firstVAD;  // Parameter to control poorly initialized channels
-
-    RingBuffer* farFrameBuf;
-    RingBuffer* nearNoisyFrameBuf;
-    RingBuffer* nearCleanFrameBuf;
-    RingBuffer* outFrameBuf;
-
-    int16_t farBuf[FAR_BUF_LEN];
-
-    int16_t mult;
-    uint32_t seed;
-
-    // Delay estimation variables
-    void* delay_estimator_farend;
-    void* delay_estimator;
-    uint16_t currentDelay;
-    // Far end history variables
-    // TODO(bjornv): Replace |far_history| with ring_buffer.
-    uint16_t far_history[PART_LEN1 * MAX_DELAY];
-    int far_history_pos;
-    int far_q_domains[MAX_DELAY];
-
-    int16_t nlpFlag;
-    int16_t fixedDelay;
-
-    uint32_t totCount;
-
-    int16_t dfaCleanQDomain;
-    int16_t dfaCleanQDomainOld;
-    int16_t dfaNoisyQDomain;
-    int16_t dfaNoisyQDomainOld;
-
-    int16_t nearLogEnergy[MAX_BUF_LEN];
-    int16_t farLogEnergy;
-    int16_t echoAdaptLogEnergy[MAX_BUF_LEN];
-    int16_t echoStoredLogEnergy[MAX_BUF_LEN];
-
-    // The extra 16 or 32 bytes in the following buffers are for alignment based
-    // Neon code.
-    // It's designed this way since the current GCC compiler can't align a
-    // buffer in 16 or 32 byte boundaries properly.
-    int16_t channelStored_buf[PART_LEN1 + 8];
-    int16_t channelAdapt16_buf[PART_LEN1 + 8];
-    int32_t channelAdapt32_buf[PART_LEN1 + 8];
-    int16_t xBuf_buf[PART_LEN2 + 16];  // farend
-    int16_t dBufClean_buf[PART_LEN2 + 16];  // nearend
-    int16_t dBufNoisy_buf[PART_LEN2 + 16];  // nearend
-    int16_t outBuf_buf[PART_LEN + 8];
-
-    // Pointers to the above buffers
-    int16_t *channelStored;
-    int16_t *channelAdapt16;
-    int32_t *channelAdapt32;
-    int16_t *xBuf;
-    int16_t *dBufClean;
-    int16_t *dBufNoisy;
-    int16_t *outBuf;
-
-    int32_t echoFilt[PART_LEN1];
-    int16_t nearFilt[PART_LEN1];
-    int32_t noiseEst[PART_LEN1];
-    int           noiseEstTooLowCtr[PART_LEN1];
-    int           noiseEstTooHighCtr[PART_LEN1];
-    int16_t noiseEstCtr;
-    int16_t cngMode;
-
-    int32_t mseAdaptOld;
-    int32_t mseStoredOld;
-    int32_t mseThreshold;
-
-    int16_t farEnergyMin;
-    int16_t farEnergyMax;
-    int16_t farEnergyMaxMin;
-    int16_t farEnergyVAD;
-    int16_t farEnergyMSE;
-    int currentVADValue;
-    int16_t vadUpdateCount;
-
-    int16_t startupState;
-    int16_t mseChannelCount;
-    int16_t supGain;
-    int16_t supGainOld;
-
-    int16_t supGainErrParamA;
-    int16_t supGainErrParamD;
-    int16_t supGainErrParamDiffAB;
-    int16_t supGainErrParamDiffBD;
-
-    struct RealFFT* real_fft;
-
-#ifdef AEC_DEBUG
-    FILE *farFile;
-    FILE *nearFile;
-    FILE *outFile;
-#endif
-} AecmCore;
-
-////////////////////////////////////////////////////////////////////////////////
-// WebRtcAecm_CreateCore()
-//
-// Allocates the memory needed by the AECM. The memory needs to be
-// initialized separately using the WebRtcAecm_InitCore() function.
-// Returns a pointer to the instance and a nullptr at failure.
-AecmCore* WebRtcAecm_CreateCore();
-
-////////////////////////////////////////////////////////////////////////////////
-// WebRtcAecm_InitCore(...)
-//
-// This function initializes the AECM instant created with
-// WebRtcAecm_CreateCore()
-// Input:
-//      - aecm          : Pointer to the AECM instance
-//      - samplingFreq  : Sampling Frequency
-//
-// Output:
-//      - aecm          : Initialized instance
-//
-// Return value         :  0 - Ok
-//                        -1 - Error
-//
-int WebRtcAecm_InitCore(AecmCore* const aecm, int samplingFreq);
-
-////////////////////////////////////////////////////////////////////////////////
-// WebRtcAecm_FreeCore(...)
-//
-// This function releases the memory allocated by WebRtcAecm_CreateCore()
-// Input:
-//      - aecm          : Pointer to the AECM instance
-//
-void WebRtcAecm_FreeCore(AecmCore* aecm);
-
-int WebRtcAecm_Control(AecmCore* aecm, int delay, int nlpFlag);
-
-////////////////////////////////////////////////////////////////////////////////
-// WebRtcAecm_InitEchoPathCore(...)
-//
-// This function resets the echo channel adaptation with the specified channel.
-// Input:
-//      - aecm          : Pointer to the AECM instance
-//      - echo_path     : Pointer to the data that should initialize the echo
-//                        path
-//
-// Output:
-//      - aecm          : Initialized instance
-//
-void WebRtcAecm_InitEchoPathCore(AecmCore* aecm, const int16_t* echo_path);
-
-////////////////////////////////////////////////////////////////////////////////
-// WebRtcAecm_ProcessFrame(...)
-//
-// This function processes frames and sends blocks to
-// WebRtcAecm_ProcessBlock(...)
-//
-// Inputs:
-//      - aecm          : Pointer to the AECM instance
-//      - farend        : In buffer containing one frame of echo signal
-//      - nearendNoisy  : In buffer containing one frame of nearend+echo signal
-//                        without NS
-//      - nearendClean  : In buffer containing one frame of nearend+echo signal
-//                        with NS
-//
-// Output:
-//      - out           : Out buffer, one frame of nearend signal          :
-//
-//
-int WebRtcAecm_ProcessFrame(AecmCore* aecm,
-                            const int16_t* farend,
-                            const int16_t* nearendNoisy,
-                            const int16_t* nearendClean,
-                            int16_t* out);
-
-////////////////////////////////////////////////////////////////////////////////
-// WebRtcAecm_ProcessBlock(...)
-//
-// This function is called for every block within one frame
-// This function is called by WebRtcAecm_ProcessFrame(...)
-//
-// Inputs:
-//      - aecm          : Pointer to the AECM instance
-//      - farend        : In buffer containing one block of echo signal
-//      - nearendNoisy  : In buffer containing one frame of nearend+echo signal
-//                        without NS
-//      - nearendClean  : In buffer containing one frame of nearend+echo signal
-//                        with NS
-//
-// Output:
-//      - out           : Out buffer, one block of nearend signal          :
-//
-//
-int WebRtcAecm_ProcessBlock(AecmCore* aecm,
-                            const int16_t* farend,
-                            const int16_t* nearendNoisy,
-                            const int16_t* noisyClean,
-                            int16_t* out);
-
-////////////////////////////////////////////////////////////////////////////////
-// WebRtcAecm_BufferFarFrame()
-//
-// Inserts a frame of data into farend buffer.
-//
-// Inputs:
-//      - aecm          : Pointer to the AECM instance
-//      - farend        : In buffer containing one frame of farend signal
-//      - farLen        : Length of frame
-//
-void WebRtcAecm_BufferFarFrame(AecmCore* const aecm,
-                               const int16_t* const farend,
-                               const int farLen);
-
-////////////////////////////////////////////////////////////////////////////////
-// WebRtcAecm_FetchFarFrame()
-//
-// Read the farend buffer to account for known delay
-//
-// Inputs:
-//      - aecm          : Pointer to the AECM instance
-//      - farend        : In buffer containing one frame of farend signal
-//      - farLen        : Length of frame
-//      - knownDelay    : known delay
-//
-void WebRtcAecm_FetchFarFrame(AecmCore* const aecm,
-                              int16_t* const farend,
-                              const int farLen,
-                              const int knownDelay);
-
-// All the functions below are intended to be private
-
-////////////////////////////////////////////////////////////////////////////////
-// WebRtcAecm_UpdateFarHistory()
-//
-// Moves the pointer to the next entry and inserts |far_spectrum| and
-// corresponding Q-domain in its buffer.
-//
-// Inputs:
-//      - self          : Pointer to the delay estimation instance
-//      - far_spectrum  : Pointer to the far end spectrum
-//      - far_q         : Q-domain of far end spectrum
-//
-void WebRtcAecm_UpdateFarHistory(AecmCore* self,
-                                 uint16_t* far_spectrum,
-                                 int far_q);
-
-////////////////////////////////////////////////////////////////////////////////
-// WebRtcAecm_AlignedFarend()
-//
-// Returns a pointer to the far end spectrum aligned to current near end
-// spectrum. The function WebRtc_DelayEstimatorProcessFix(...) should have been
-// called before AlignedFarend(...). Otherwise, you get the pointer to the
-// previous frame. The memory is only valid until the next call of
-// WebRtc_DelayEstimatorProcessFix(...).
-//
-// Inputs:
-//      - self              : Pointer to the AECM instance.
-//      - delay             : Current delay estimate.
-//
-// Output:
-//      - far_q             : The Q-domain of the aligned far end spectrum
-//
-// Return value:
-//      - far_spectrum      : Pointer to the aligned far end spectrum
-//                            NULL - Error
-//
-const uint16_t* WebRtcAecm_AlignedFarend(AecmCore* self, int* far_q, int delay);
-
-///////////////////////////////////////////////////////////////////////////////
-// WebRtcAecm_CalcSuppressionGain()
-//
-// This function calculates the suppression gain that is used in the
-// Wiener filter.
-//
-// Inputs:
-//      - aecm              : Pointer to the AECM instance.
-//
-// Return value:
-//      - supGain           : Suppression gain with which to scale the noise
-//                            level (Q14).
-//
-int16_t WebRtcAecm_CalcSuppressionGain(AecmCore* const aecm);
-
-///////////////////////////////////////////////////////////////////////////////
-// WebRtcAecm_CalcEnergies()
-//
-// This function calculates the log of energies for nearend, farend and
-// estimated echoes. There is also an update of energy decision levels,
-// i.e. internal VAD.
-//
-// Inputs:
-//      - aecm              : Pointer to the AECM instance.
-//      - far_spectrum      : Pointer to farend spectrum.
-//      - far_q             : Q-domain of farend spectrum.
-//      - nearEner          : Near end energy for current block in
-//                            Q(aecm->dfaQDomain).
-//
-// Output:
-//     - echoEst            : Estimated echo in Q(xfa_q+RESOLUTION_CHANNEL16).
-//
-void WebRtcAecm_CalcEnergies(AecmCore* aecm,
-                             const uint16_t* far_spectrum,
-                             const int16_t far_q,
-                             const uint32_t nearEner,
-                             int32_t* echoEst);
-
-///////////////////////////////////////////////////////////////////////////////
-// WebRtcAecm_CalcStepSize()
-//
-// This function calculates the step size used in channel estimation
-//
-// Inputs:
-//      - aecm              : Pointer to the AECM instance.
-//
-// Return value:
-//      - mu                : Stepsize in log2(), i.e. number of shifts.
-//
-int16_t WebRtcAecm_CalcStepSize(AecmCore* const aecm);
-
-///////////////////////////////////////////////////////////////////////////////
-// WebRtcAecm_UpdateChannel(...)
-//
-// This function performs channel estimation.
-// NLMS and decision on channel storage.
-//
-// Inputs:
-//      - aecm              : Pointer to the AECM instance.
-//      - far_spectrum      : Absolute value of the farend signal in Q(far_q)
-//      - far_q             : Q-domain of the farend signal
-//      - dfa               : Absolute value of the nearend signal
-//                            (Q[aecm->dfaQDomain])
-//      - mu                : NLMS step size.
-// Input/Output:
-//      - echoEst           : Estimated echo in Q(far_q+RESOLUTION_CHANNEL16).
-//
-void WebRtcAecm_UpdateChannel(AecmCore* aecm,
-                              const uint16_t* far_spectrum,
-                              const int16_t far_q,
-                              const uint16_t* const dfa,
-                              const int16_t mu,
-                              int32_t* echoEst);
-
-extern const int16_t WebRtcAecm_kCosTable[];
-extern const int16_t WebRtcAecm_kSinTable[];
-
-///////////////////////////////////////////////////////////////////////////////
-// Some function pointers, for internal functions shared by ARM NEON and
-// generic C code.
-//
-typedef void (*CalcLinearEnergies)(AecmCore* aecm,
-                                   const uint16_t* far_spectrum,
-                                   int32_t* echoEst,
-                                   uint32_t* far_energy,
-                                   uint32_t* echo_energy_adapt,
-                                   uint32_t* echo_energy_stored);
-extern CalcLinearEnergies WebRtcAecm_CalcLinearEnergies;
-
-typedef void (*StoreAdaptiveChannel)(AecmCore* aecm,
-                                     const uint16_t* far_spectrum,
-                                     int32_t* echo_est);
-extern StoreAdaptiveChannel WebRtcAecm_StoreAdaptiveChannel;
-
-typedef void (*ResetAdaptiveChannel)(AecmCore* aecm);
-extern ResetAdaptiveChannel WebRtcAecm_ResetAdaptiveChannel;
-
-// For the above function pointers, functions for generic platforms are declared
-// and defined as static in file aecm_core.c, while those for ARM Neon platforms
-// are declared below and defined in file aecm_core_neon.c.
-#if defined(WEBRTC_HAS_NEON)
-void WebRtcAecm_CalcLinearEnergiesNeon(AecmCore* aecm,
-                                       const uint16_t* far_spectrum,
-                                       int32_t* echo_est,
-                                       uint32_t* far_energy,
-                                       uint32_t* echo_energy_adapt,
-                                       uint32_t* echo_energy_stored);
-
-void WebRtcAecm_StoreAdaptiveChannelNeon(AecmCore* aecm,
-                                         const uint16_t* far_spectrum,
-                                         int32_t* echo_est);
-
-void WebRtcAecm_ResetAdaptiveChannelNeon(AecmCore* aecm);
-#endif
-
-#if defined(MIPS32_LE)
-void WebRtcAecm_CalcLinearEnergies_mips(AecmCore* aecm,
-                                        const uint16_t* far_spectrum,
-                                        int32_t* echo_est,
-                                        uint32_t* far_energy,
-                                        uint32_t* echo_energy_adapt,
-                                        uint32_t* echo_energy_stored);
-#if defined(MIPS_DSP_R1_LE)
-void WebRtcAecm_StoreAdaptiveChannel_mips(AecmCore* aecm,
-                                          const uint16_t* far_spectrum,
-                                          int32_t* echo_est);
-
-void WebRtcAecm_ResetAdaptiveChannel_mips(AecmCore* aecm);
-#endif
-#endif
-
-#endif
diff --git a/modules/audio_processing/aecm/aecm_core_c.cc b/modules/audio_processing/aecm/aecm_core_c.cc
deleted file mode 100644
index bf26277..0000000
--- a/modules/audio_processing/aecm/aecm_core_c.cc
+++ /dev/null
@@ -1,772 +0,0 @@
-/*
- *  Copyright (c) 2013 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_processing/aecm/aecm_core.h"
-
-#include <stddef.h>
-#include <stdlib.h>
-
-extern "C" {
-#include "webrtc/common_audio/ring_buffer.h"
-#include "webrtc/common_audio/signal_processing/include/real_fft.h"
-}
-#include "webrtc/modules/audio_processing/aecm/echo_control_mobile.h"
-#include "webrtc/modules/audio_processing/utility/delay_estimator_wrapper.h"
-extern "C" {
-#include "webrtc/system_wrappers/include/cpu_features_wrapper.h"
-}
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/sanitizer.h"
-#include "webrtc/typedefs.h"
-
-// Square root of Hanning window in Q14.
-static const ALIGN8_BEG int16_t WebRtcAecm_kSqrtHanning[] ALIGN8_END = {
-  0, 399, 798, 1196, 1594, 1990, 2386, 2780, 3172,
-  3562, 3951, 4337, 4720, 5101, 5478, 5853, 6224,
-  6591, 6954, 7313, 7668, 8019, 8364, 8705, 9040,
-  9370, 9695, 10013, 10326, 10633, 10933, 11227, 11514,
-  11795, 12068, 12335, 12594, 12845, 13089, 13325, 13553,
-  13773, 13985, 14189, 14384, 14571, 14749, 14918, 15079,
-  15231, 15373, 15506, 15631, 15746, 15851, 15947, 16034,
-  16111, 16179, 16237, 16286, 16325, 16354, 16373, 16384
-};
-
-#ifdef AECM_WITH_ABS_APPROX
-//Q15 alpha = 0.99439986968132  const Factor for magnitude approximation
-static const uint16_t kAlpha1 = 32584;
-//Q15 beta = 0.12967166976970   const Factor for magnitude approximation
-static const uint16_t kBeta1 = 4249;
-//Q15 alpha = 0.94234827210087  const Factor for magnitude approximation
-static const uint16_t kAlpha2 = 30879;
-//Q15 beta = 0.33787806009150   const Factor for magnitude approximation
-static const uint16_t kBeta2 = 11072;
-//Q15 alpha = 0.82247698684306  const Factor for magnitude approximation
-static const uint16_t kAlpha3 = 26951;
-//Q15 beta = 0.57762063060713   const Factor for magnitude approximation
-static const uint16_t kBeta3 = 18927;
-#endif
-
-static const int16_t kNoiseEstQDomain = 15;
-static const int16_t kNoiseEstIncCount = 5;
-
-static void ComfortNoise(AecmCore* aecm,
-                         const uint16_t* dfa,
-                         ComplexInt16* out,
-                         const int16_t* lambda);
-
-static void WindowAndFFT(AecmCore* aecm,
-                         int16_t* fft,
-                         const int16_t* time_signal,
-                         ComplexInt16* freq_signal,
-                         int time_signal_scaling) {
-  int i = 0;
-
-  // FFT of signal
-  for (i = 0; i < PART_LEN; i++) {
-    // Window time domain signal and insert into real part of
-    // transformation array |fft|
-    int16_t scaled_time_signal = time_signal[i] << time_signal_scaling;
-    fft[i] = (int16_t)((scaled_time_signal * WebRtcAecm_kSqrtHanning[i]) >> 14);
-    scaled_time_signal = time_signal[i + PART_LEN] << time_signal_scaling;
-    fft[PART_LEN + i] = (int16_t)((
-        scaled_time_signal * WebRtcAecm_kSqrtHanning[PART_LEN - i]) >> 14);
-  }
-
-  // Do forward FFT, then take only the first PART_LEN complex samples,
-  // and change signs of the imaginary parts.
-  WebRtcSpl_RealForwardFFT(aecm->real_fft, fft, (int16_t*)freq_signal);
-  for (i = 0; i < PART_LEN; i++) {
-    freq_signal[i].imag = -freq_signal[i].imag;
-  }
-}
-
-static void InverseFFTAndWindow(AecmCore* aecm,
-                                int16_t* fft,
-                                ComplexInt16* efw,
-                                int16_t* output,
-                                const int16_t* nearendClean) {
-  int i, j, outCFFT;
-  int32_t tmp32no1;
-  // Reuse |efw| for the inverse FFT output after transferring
-  // the contents to |fft|.
-  int16_t* ifft_out = (int16_t*)efw;
-
-  // Synthesis
-  for (i = 1, j = 2; i < PART_LEN; i += 1, j += 2) {
-    fft[j] = efw[i].real;
-    fft[j + 1] = -efw[i].imag;
-  }
-  fft[0] = efw[0].real;
-  fft[1] = -efw[0].imag;
-
-  fft[PART_LEN2] = efw[PART_LEN].real;
-  fft[PART_LEN2 + 1] = -efw[PART_LEN].imag;
-
-  // Inverse FFT. Keep outCFFT to scale the samples in the next block.
-  outCFFT = WebRtcSpl_RealInverseFFT(aecm->real_fft, fft, ifft_out);
-  for (i = 0; i < PART_LEN; i++) {
-    ifft_out[i] = (int16_t)WEBRTC_SPL_MUL_16_16_RSFT_WITH_ROUND(
-                    ifft_out[i], WebRtcAecm_kSqrtHanning[i], 14);
-    tmp32no1 = WEBRTC_SPL_SHIFT_W32((int32_t)ifft_out[i],
-                                     outCFFT - aecm->dfaCleanQDomain);
-    output[i] = (int16_t)WEBRTC_SPL_SAT(WEBRTC_SPL_WORD16_MAX,
-                                        tmp32no1 + aecm->outBuf[i],
-                                        WEBRTC_SPL_WORD16_MIN);
-
-    tmp32no1 = (ifft_out[PART_LEN + i] *
-        WebRtcAecm_kSqrtHanning[PART_LEN - i]) >> 14;
-    tmp32no1 = WEBRTC_SPL_SHIFT_W32(tmp32no1,
-                                    outCFFT - aecm->dfaCleanQDomain);
-    aecm->outBuf[i] = (int16_t)WEBRTC_SPL_SAT(WEBRTC_SPL_WORD16_MAX,
-                                                tmp32no1,
-                                                WEBRTC_SPL_WORD16_MIN);
-  }
-
-  // Copy the current block to the old position
-  // (aecm->outBuf is shifted elsewhere)
-  memcpy(aecm->xBuf, aecm->xBuf + PART_LEN, sizeof(int16_t) * PART_LEN);
-  memcpy(aecm->dBufNoisy,
-         aecm->dBufNoisy + PART_LEN,
-         sizeof(int16_t) * PART_LEN);
-  if (nearendClean != NULL)
-  {
-    memcpy(aecm->dBufClean,
-           aecm->dBufClean + PART_LEN,
-           sizeof(int16_t) * PART_LEN);
-  }
-}
-
-// Transforms a time domain signal into the frequency domain, outputting the
-// complex valued signal, absolute value and sum of absolute values.
-//
-// time_signal          [in]    Pointer to time domain signal
-// freq_signal_real     [out]   Pointer to real part of frequency domain array
-// freq_signal_imag     [out]   Pointer to imaginary part of frequency domain
-//                              array
-// freq_signal_abs      [out]   Pointer to absolute value of frequency domain
-//                              array
-// freq_signal_sum_abs  [out]   Pointer to the sum of all absolute values in
-//                              the frequency domain array
-// return value                 The Q-domain of current frequency values
-//
-static int TimeToFrequencyDomain(AecmCore* aecm,
-                                 const int16_t* time_signal,
-                                 ComplexInt16* freq_signal,
-                                 uint16_t* freq_signal_abs,
-                                 uint32_t* freq_signal_sum_abs) {
-  int i = 0;
-  int time_signal_scaling = 0;
-
-  int32_t tmp32no1 = 0;
-  int32_t tmp32no2 = 0;
-
-  // In fft_buf, +16 for 32-byte alignment.
-  int16_t fft_buf[PART_LEN4 + 16];
-  int16_t *fft = (int16_t *) (((uintptr_t) fft_buf + 31) & ~31);
-
-  int16_t tmp16no1;
-#ifndef WEBRTC_ARCH_ARM_V7
-  int16_t tmp16no2;
-#endif
-#ifdef AECM_WITH_ABS_APPROX
-  int16_t max_value = 0;
-  int16_t min_value = 0;
-  uint16_t alpha = 0;
-  uint16_t beta = 0;
-#endif
-
-#ifdef AECM_DYNAMIC_Q
-  tmp16no1 = WebRtcSpl_MaxAbsValueW16(time_signal, PART_LEN2);
-  time_signal_scaling = WebRtcSpl_NormW16(tmp16no1);
-#endif
-
-  WindowAndFFT(aecm, fft, time_signal, freq_signal, time_signal_scaling);
-
-  // Extract imaginary and real part, calculate the magnitude for
-  // all frequency bins
-  freq_signal[0].imag = 0;
-  freq_signal[PART_LEN].imag = 0;
-  freq_signal_abs[0] = (uint16_t)WEBRTC_SPL_ABS_W16(freq_signal[0].real);
-  freq_signal_abs[PART_LEN] = (uint16_t)WEBRTC_SPL_ABS_W16(
-                                freq_signal[PART_LEN].real);
-  (*freq_signal_sum_abs) = (uint32_t)(freq_signal_abs[0]) +
-                           (uint32_t)(freq_signal_abs[PART_LEN]);
-
-  for (i = 1; i < PART_LEN; i++)
-  {
-    if (freq_signal[i].real == 0)
-    {
-      freq_signal_abs[i] = (uint16_t)WEBRTC_SPL_ABS_W16(freq_signal[i].imag);
-    }
-    else if (freq_signal[i].imag == 0)
-    {
-      freq_signal_abs[i] = (uint16_t)WEBRTC_SPL_ABS_W16(freq_signal[i].real);
-    }
-    else
-    {
-      // Approximation for magnitude of complex fft output
-      // magn = sqrt(real^2 + imag^2)
-      // magn ~= alpha * max(|imag|,|real|) + beta * min(|imag|,|real|)
-      //
-      // The parameters alpha and beta are stored in Q15
-
-#ifdef AECM_WITH_ABS_APPROX
-      tmp16no1 = WEBRTC_SPL_ABS_W16(freq_signal[i].real);
-      tmp16no2 = WEBRTC_SPL_ABS_W16(freq_signal[i].imag);
-
-      if(tmp16no1 > tmp16no2)
-      {
-        max_value = tmp16no1;
-        min_value = tmp16no2;
-      } else
-      {
-        max_value = tmp16no2;
-        min_value = tmp16no1;
-      }
-
-      // Magnitude in Q(-6)
-      if ((max_value >> 2) > min_value)
-      {
-        alpha = kAlpha1;
-        beta = kBeta1;
-      } else if ((max_value >> 1) > min_value)
-      {
-        alpha = kAlpha2;
-        beta = kBeta2;
-      } else
-      {
-        alpha = kAlpha3;
-        beta = kBeta3;
-      }
-      tmp16no1 = (int16_t)((max_value * alpha) >> 15);
-      tmp16no2 = (int16_t)((min_value * beta) >> 15);
-      freq_signal_abs[i] = (uint16_t)tmp16no1 + (uint16_t)tmp16no2;
-#else
-#ifdef WEBRTC_ARCH_ARM_V7
-      __asm __volatile(
-        "smulbb %[tmp32no1], %[real], %[real]\n\t"
-        "smlabb %[tmp32no2], %[imag], %[imag], %[tmp32no1]\n\t"
-        :[tmp32no1]"+&r"(tmp32no1),
-         [tmp32no2]"=r"(tmp32no2)
-        :[real]"r"(freq_signal[i].real),
-         [imag]"r"(freq_signal[i].imag)
-      );
-#else
-      tmp16no1 = WEBRTC_SPL_ABS_W16(freq_signal[i].real);
-      tmp16no2 = WEBRTC_SPL_ABS_W16(freq_signal[i].imag);
-      tmp32no1 = tmp16no1 * tmp16no1;
-      tmp32no2 = tmp16no2 * tmp16no2;
-      tmp32no2 = WebRtcSpl_AddSatW32(tmp32no1, tmp32no2);
-#endif // WEBRTC_ARCH_ARM_V7
-      tmp32no1 = WebRtcSpl_SqrtFloor(tmp32no2);
-
-      freq_signal_abs[i] = (uint16_t)tmp32no1;
-#endif // AECM_WITH_ABS_APPROX
-    }
-    (*freq_signal_sum_abs) += (uint32_t)freq_signal_abs[i];
-  }
-
-  return time_signal_scaling;
-}
-
-int RTC_NO_SANITIZE("signed-integer-overflow")  // bugs.webrtc.org/8200
-WebRtcAecm_ProcessBlock(AecmCore* aecm,
-                        const int16_t* farend,
-                        const int16_t* nearendNoisy,
-                        const int16_t* nearendClean,
-                        int16_t* output) {
-  int i;
-
-  uint32_t xfaSum;
-  uint32_t dfaNoisySum;
-  uint32_t dfaCleanSum;
-  uint32_t echoEst32Gained;
-  uint32_t tmpU32;
-
-  int32_t tmp32no1;
-
-  uint16_t xfa[PART_LEN1];
-  uint16_t dfaNoisy[PART_LEN1];
-  uint16_t dfaClean[PART_LEN1];
-  uint16_t* ptrDfaClean = dfaClean;
-  const uint16_t* far_spectrum_ptr = NULL;
-
-  // 32 byte aligned buffers (with +8 or +16).
-  // TODO(kma): define fft with ComplexInt16.
-  int16_t fft_buf[PART_LEN4 + 2 + 16]; // +2 to make a loop safe.
-  int32_t echoEst32_buf[PART_LEN1 + 8];
-  int32_t dfw_buf[PART_LEN2 + 8];
-  int32_t efw_buf[PART_LEN2 + 8];
-
-  int16_t* fft = (int16_t*) (((uintptr_t) fft_buf + 31) & ~ 31);
-  int32_t* echoEst32 = (int32_t*) (((uintptr_t) echoEst32_buf + 31) & ~ 31);
-  ComplexInt16* dfw = (ComplexInt16*)(((uintptr_t)dfw_buf + 31) & ~31);
-  ComplexInt16* efw = (ComplexInt16*)(((uintptr_t)efw_buf + 31) & ~31);
-
-  int16_t hnl[PART_LEN1];
-  int16_t numPosCoef = 0;
-  int16_t nlpGain = ONE_Q14;
-  int delay;
-  int16_t tmp16no1;
-  int16_t tmp16no2;
-  int16_t mu;
-  int16_t supGain;
-  int16_t zeros32, zeros16;
-  int16_t zerosDBufNoisy, zerosDBufClean, zerosXBuf;
-  int far_q;
-  int16_t resolutionDiff, qDomainDiff, dfa_clean_q_domain_diff;
-
-  const int kMinPrefBand = 4;
-  const int kMaxPrefBand = 24;
-  int32_t avgHnl32 = 0;
-
-  // Determine startup state. There are three states:
-  // (0) the first CONV_LEN blocks
-  // (1) another CONV_LEN blocks
-  // (2) the rest
-
-  if (aecm->startupState < 2)
-  {
-    aecm->startupState = (aecm->totCount >= CONV_LEN) +
-                         (aecm->totCount >= CONV_LEN2);
-  }
-  // END: Determine startup state
-
-  // Buffer near and far end signals
-  memcpy(aecm->xBuf + PART_LEN, farend, sizeof(int16_t) * PART_LEN);
-  memcpy(aecm->dBufNoisy + PART_LEN, nearendNoisy, sizeof(int16_t) * PART_LEN);
-  if (nearendClean != NULL)
-  {
-    memcpy(aecm->dBufClean + PART_LEN,
-           nearendClean,
-           sizeof(int16_t) * PART_LEN);
-  }
-
-  // Transform far end signal from time domain to frequency domain.
-  far_q = TimeToFrequencyDomain(aecm,
-                                aecm->xBuf,
-                                dfw,
-                                xfa,
-                                &xfaSum);
-
-  // Transform noisy near end signal from time domain to frequency domain.
-  zerosDBufNoisy = TimeToFrequencyDomain(aecm,
-                                         aecm->dBufNoisy,
-                                         dfw,
-                                         dfaNoisy,
-                                         &dfaNoisySum);
-  aecm->dfaNoisyQDomainOld = aecm->dfaNoisyQDomain;
-  aecm->dfaNoisyQDomain = (int16_t)zerosDBufNoisy;
-
-
-  if (nearendClean == NULL)
-  {
-    ptrDfaClean = dfaNoisy;
-    aecm->dfaCleanQDomainOld = aecm->dfaNoisyQDomainOld;
-    aecm->dfaCleanQDomain = aecm->dfaNoisyQDomain;
-    dfaCleanSum = dfaNoisySum;
-  } else
-  {
-    // Transform clean near end signal from time domain to frequency domain.
-    zerosDBufClean = TimeToFrequencyDomain(aecm,
-                                           aecm->dBufClean,
-                                           dfw,
-                                           dfaClean,
-                                           &dfaCleanSum);
-    aecm->dfaCleanQDomainOld = aecm->dfaCleanQDomain;
-    aecm->dfaCleanQDomain = (int16_t)zerosDBufClean;
-  }
-
-  // Get the delay
-  // Save far-end history and estimate delay
-  WebRtcAecm_UpdateFarHistory(aecm, xfa, far_q);
-  if (WebRtc_AddFarSpectrumFix(aecm->delay_estimator_farend,
-                               xfa,
-                               PART_LEN1,
-                               far_q) == -1) {
-    return -1;
-  }
-  delay = WebRtc_DelayEstimatorProcessFix(aecm->delay_estimator,
-                                          dfaNoisy,
-                                          PART_LEN1,
-                                          zerosDBufNoisy);
-  if (delay == -1)
-  {
-    return -1;
-  }
-  else if (delay == -2)
-  {
-    // If the delay is unknown, we assume zero.
-    // NOTE: this will have to be adjusted if we ever add lookahead.
-    delay = 0;
-  }
-
-  if (aecm->fixedDelay >= 0)
-  {
-    // Use fixed delay
-    delay = aecm->fixedDelay;
-  }
-
-  // Get aligned far end spectrum
-  far_spectrum_ptr = WebRtcAecm_AlignedFarend(aecm, &far_q, delay);
-  zerosXBuf = (int16_t) far_q;
-  if (far_spectrum_ptr == NULL)
-  {
-    return -1;
-  }
-
-  // Calculate log(energy) and update energy threshold levels
-  WebRtcAecm_CalcEnergies(aecm,
-                          far_spectrum_ptr,
-                          zerosXBuf,
-                          dfaNoisySum,
-                          echoEst32);
-
-  // Calculate stepsize
-  mu = WebRtcAecm_CalcStepSize(aecm);
-
-  // Update counters
-  aecm->totCount++;
-
-  // This is the channel estimation algorithm.
-  // It is base on NLMS but has a variable step length,
-  // which was calculated above.
-  WebRtcAecm_UpdateChannel(aecm,
-                           far_spectrum_ptr,
-                           zerosXBuf,
-                           dfaNoisy,
-                           mu,
-                           echoEst32);
-  supGain = WebRtcAecm_CalcSuppressionGain(aecm);
-
-
-  // Calculate Wiener filter hnl[]
-  for (i = 0; i < PART_LEN1; i++)
-  {
-    // Far end signal through channel estimate in Q8
-    // How much can we shift right to preserve resolution
-    tmp32no1 = echoEst32[i] - aecm->echoFilt[i];
-    aecm->echoFilt[i] += (tmp32no1 * 50) >> 8;
-    // UBSan: 72293096 * 50 cannot be represented in type 'int'
-
-    zeros32 = WebRtcSpl_NormW32(aecm->echoFilt[i]) + 1;
-    zeros16 = WebRtcSpl_NormW16(supGain) + 1;
-    if (zeros32 + zeros16 > 16)
-    {
-      // Multiplication is safe
-      // Result in
-      // Q(RESOLUTION_CHANNEL+RESOLUTION_SUPGAIN+
-      //   aecm->xfaQDomainBuf[diff])
-      echoEst32Gained = WEBRTC_SPL_UMUL_32_16((uint32_t)aecm->echoFilt[i],
-                                              (uint16_t)supGain);
-      resolutionDiff = 14 - RESOLUTION_CHANNEL16 - RESOLUTION_SUPGAIN;
-      resolutionDiff += (aecm->dfaCleanQDomain - zerosXBuf);
-    } else
-    {
-      tmp16no1 = 17 - zeros32 - zeros16;
-      resolutionDiff = 14 + tmp16no1 - RESOLUTION_CHANNEL16 -
-                       RESOLUTION_SUPGAIN;
-      resolutionDiff += (aecm->dfaCleanQDomain - zerosXBuf);
-      if (zeros32 > tmp16no1)
-      {
-        echoEst32Gained = WEBRTC_SPL_UMUL_32_16((uint32_t)aecm->echoFilt[i],
-                                                supGain >> tmp16no1);
-      } else
-      {
-        // Result in Q-(RESOLUTION_CHANNEL+RESOLUTION_SUPGAIN-16)
-        echoEst32Gained = (aecm->echoFilt[i] >> tmp16no1) * supGain;
-      }
-    }
-
-    zeros16 = WebRtcSpl_NormW16(aecm->nearFilt[i]);
-    RTC_DCHECK_GE(zeros16, 0);  // |zeros16| is a norm, hence non-negative.
-    dfa_clean_q_domain_diff = aecm->dfaCleanQDomain - aecm->dfaCleanQDomainOld;
-    if (zeros16 < dfa_clean_q_domain_diff && aecm->nearFilt[i]) {
-      tmp16no1 = aecm->nearFilt[i] << zeros16;
-      qDomainDiff = zeros16 - dfa_clean_q_domain_diff;
-      tmp16no2 = ptrDfaClean[i] >> -qDomainDiff;
-    } else {
-      tmp16no1 = dfa_clean_q_domain_diff < 0
-          ? aecm->nearFilt[i] >> -dfa_clean_q_domain_diff
-          : aecm->nearFilt[i] << dfa_clean_q_domain_diff;
-      qDomainDiff = 0;
-      tmp16no2 = ptrDfaClean[i];
-    }
-    tmp32no1 = (int32_t)(tmp16no2 - tmp16no1);
-    tmp16no2 = (int16_t)(tmp32no1 >> 4);
-    tmp16no2 += tmp16no1;
-    zeros16 = WebRtcSpl_NormW16(tmp16no2);
-    if ((tmp16no2) & (-qDomainDiff > zeros16)) {
-      aecm->nearFilt[i] = WEBRTC_SPL_WORD16_MAX;
-    } else {
-      aecm->nearFilt[i] = qDomainDiff < 0 ? tmp16no2 << -qDomainDiff
-                                          : tmp16no2 >> qDomainDiff;
-    }
-
-    // Wiener filter coefficients, resulting hnl in Q14
-    if (echoEst32Gained == 0)
-    {
-      hnl[i] = ONE_Q14;
-    } else if (aecm->nearFilt[i] == 0)
-    {
-      hnl[i] = 0;
-    } else
-    {
-      // Multiply the suppression gain
-      // Rounding
-      echoEst32Gained += (uint32_t)(aecm->nearFilt[i] >> 1);
-      tmpU32 = WebRtcSpl_DivU32U16(echoEst32Gained,
-                                   (uint16_t)aecm->nearFilt[i]);
-
-      // Current resolution is
-      // Q-(RESOLUTION_CHANNEL+RESOLUTION_SUPGAIN- max(0,17-zeros16- zeros32))
-      // Make sure we are in Q14
-      tmp32no1 = (int32_t)WEBRTC_SPL_SHIFT_W32(tmpU32, resolutionDiff);
-      if (tmp32no1 > ONE_Q14)
-      {
-        hnl[i] = 0;
-      } else if (tmp32no1 < 0)
-      {
-        hnl[i] = ONE_Q14;
-      } else
-      {
-        // 1-echoEst/dfa
-        hnl[i] = ONE_Q14 - (int16_t)tmp32no1;
-        if (hnl[i] < 0)
-        {
-          hnl[i] = 0;
-        }
-      }
-    }
-    if (hnl[i])
-    {
-      numPosCoef++;
-    }
-  }
-  // Only in wideband. Prevent the gain in upper band from being larger than
-  // in lower band.
-  if (aecm->mult == 2)
-  {
-    // TODO(bjornv): Investigate if the scaling of hnl[i] below can cause
-    //               speech distortion in double-talk.
-    for (i = 0; i < PART_LEN1; i++)
-    {
-      hnl[i] = (int16_t)((hnl[i] * hnl[i]) >> 14);
-    }
-
-    for (i = kMinPrefBand; i <= kMaxPrefBand; i++)
-    {
-      avgHnl32 += (int32_t)hnl[i];
-    }
-    RTC_DCHECK_GT(kMaxPrefBand - kMinPrefBand + 1, 0);
-    avgHnl32 /= (kMaxPrefBand - kMinPrefBand + 1);
-
-    for (i = kMaxPrefBand; i < PART_LEN1; i++)
-    {
-      if (hnl[i] > (int16_t)avgHnl32)
-      {
-        hnl[i] = (int16_t)avgHnl32;
-      }
-    }
-  }
-
-  // Calculate NLP gain, result is in Q14
-  if (aecm->nlpFlag)
-  {
-    for (i = 0; i < PART_LEN1; i++)
-    {
-      // Truncate values close to zero and one.
-      if (hnl[i] > NLP_COMP_HIGH)
-      {
-        hnl[i] = ONE_Q14;
-      } else if (hnl[i] < NLP_COMP_LOW)
-      {
-        hnl[i] = 0;
-      }
-
-      // Remove outliers
-      if (numPosCoef < 3)
-      {
-        nlpGain = 0;
-      } else
-      {
-        nlpGain = ONE_Q14;
-      }
-
-      // NLP
-      if ((hnl[i] == ONE_Q14) && (nlpGain == ONE_Q14))
-      {
-        hnl[i] = ONE_Q14;
-      } else
-      {
-        hnl[i] = (int16_t)((hnl[i] * nlpGain) >> 14);
-      }
-
-      // multiply with Wiener coefficients
-      efw[i].real = (int16_t)(WEBRTC_SPL_MUL_16_16_RSFT_WITH_ROUND(dfw[i].real,
-                                                                   hnl[i], 14));
-      efw[i].imag = (int16_t)(WEBRTC_SPL_MUL_16_16_RSFT_WITH_ROUND(dfw[i].imag,
-                                                                   hnl[i], 14));
-    }
-  }
-  else
-  {
-    // multiply with Wiener coefficients
-    for (i = 0; i < PART_LEN1; i++)
-    {
-      efw[i].real = (int16_t)(WEBRTC_SPL_MUL_16_16_RSFT_WITH_ROUND(dfw[i].real,
-                                                                   hnl[i], 14));
-      efw[i].imag = (int16_t)(WEBRTC_SPL_MUL_16_16_RSFT_WITH_ROUND(dfw[i].imag,
-                                                                   hnl[i], 14));
-    }
-  }
-
-  if (aecm->cngMode == AecmTrue)
-  {
-    ComfortNoise(aecm, ptrDfaClean, efw, hnl);
-  }
-
-  InverseFFTAndWindow(aecm, fft, efw, output, nearendClean);
-
-  return 0;
-}
-
-static void ComfortNoise(AecmCore* aecm,
-                         const uint16_t* dfa,
-                         ComplexInt16* out,
-                         const int16_t* lambda) {
-  int16_t i;
-  int16_t tmp16;
-  int32_t tmp32;
-
-  int16_t randW16[PART_LEN];
-  int16_t uReal[PART_LEN1];
-  int16_t uImag[PART_LEN1];
-  int32_t outLShift32;
-  int16_t noiseRShift16[PART_LEN1];
-
-  int16_t shiftFromNearToNoise = kNoiseEstQDomain - aecm->dfaCleanQDomain;
-  int16_t minTrackShift;
-
-  RTC_DCHECK_GE(shiftFromNearToNoise, 0);
-  RTC_DCHECK_LT(shiftFromNearToNoise, 16);
-
-  if (aecm->noiseEstCtr < 100)
-  {
-    // Track the minimum more quickly initially.
-    aecm->noiseEstCtr++;
-    minTrackShift = 6;
-  } else
-  {
-    minTrackShift = 9;
-  }
-
-  // Estimate noise power.
-  for (i = 0; i < PART_LEN1; i++)
-  {
-    // Shift to the noise domain.
-    tmp32 = (int32_t)dfa[i];
-    outLShift32 = tmp32 << shiftFromNearToNoise;
-
-    if (outLShift32 < aecm->noiseEst[i])
-    {
-      // Reset "too low" counter
-      aecm->noiseEstTooLowCtr[i] = 0;
-      // Track the minimum.
-      if (aecm->noiseEst[i] < (1 << minTrackShift))
-      {
-        // For small values, decrease noiseEst[i] every
-        // |kNoiseEstIncCount| block. The regular approach below can not
-        // go further down due to truncation.
-        aecm->noiseEstTooHighCtr[i]++;
-        if (aecm->noiseEstTooHighCtr[i] >= kNoiseEstIncCount)
-        {
-          aecm->noiseEst[i]--;
-          aecm->noiseEstTooHighCtr[i] = 0; // Reset the counter
-        }
-      }
-      else
-      {
-        aecm->noiseEst[i] -= ((aecm->noiseEst[i] - outLShift32)
-                              >> minTrackShift);
-      }
-    } else
-    {
-      // Reset "too high" counter
-      aecm->noiseEstTooHighCtr[i] = 0;
-      // Ramp slowly upwards until we hit the minimum again.
-      if ((aecm->noiseEst[i] >> 19) > 0)
-      {
-        // Avoid overflow.
-        // Multiplication with 2049 will cause wrap around. Scale
-        // down first and then multiply
-        aecm->noiseEst[i] >>= 11;
-        aecm->noiseEst[i] *= 2049;
-      }
-      else if ((aecm->noiseEst[i] >> 11) > 0)
-      {
-        // Large enough for relative increase
-        aecm->noiseEst[i] *= 2049;
-        aecm->noiseEst[i] >>= 11;
-      }
-      else
-      {
-        // Make incremental increases based on size every
-        // |kNoiseEstIncCount| block
-        aecm->noiseEstTooLowCtr[i]++;
-        if (aecm->noiseEstTooLowCtr[i] >= kNoiseEstIncCount)
-        {
-          aecm->noiseEst[i] += (aecm->noiseEst[i] >> 9) + 1;
-          aecm->noiseEstTooLowCtr[i] = 0; // Reset counter
-        }
-      }
-    }
-  }
-
-  for (i = 0; i < PART_LEN1; i++)
-  {
-    tmp32 = aecm->noiseEst[i] >> shiftFromNearToNoise;
-    if (tmp32 > 32767)
-    {
-      tmp32 = 32767;
-      aecm->noiseEst[i] = tmp32 << shiftFromNearToNoise;
-    }
-    noiseRShift16[i] = (int16_t)tmp32;
-
-    tmp16 = ONE_Q14 - lambda[i];
-    noiseRShift16[i] = (int16_t)((tmp16 * noiseRShift16[i]) >> 14);
-  }
-
-  // Generate a uniform random array on [0 2^15-1].
-  WebRtcSpl_RandUArray(randW16, PART_LEN, &aecm->seed);
-
-  // Generate noise according to estimated energy.
-  uReal[0] = 0; // Reject LF noise.
-  uImag[0] = 0;
-  for (i = 1; i < PART_LEN1; i++)
-  {
-    // Get a random index for the cos and sin tables over [0 359].
-    tmp16 = (int16_t)((359 * randW16[i - 1]) >> 15);
-
-    // Tables are in Q13.
-    uReal[i] = (int16_t)((noiseRShift16[i] * WebRtcAecm_kCosTable[tmp16]) >>
-        13);
-    uImag[i] = (int16_t)((-noiseRShift16[i] * WebRtcAecm_kSinTable[tmp16]) >>
-        13);
-  }
-  uImag[PART_LEN] = 0;
-
-  for (i = 0; i < PART_LEN1; i++)
-  {
-    out[i].real = WebRtcSpl_AddSatW16(out[i].real, uReal[i]);
-    out[i].imag = WebRtcSpl_AddSatW16(out[i].imag, uImag[i]);
-  }
-}
diff --git a/modules/audio_processing/aecm/aecm_core_mips.cc b/modules/audio_processing/aecm/aecm_core_mips.cc
deleted file mode 100644
index fcd659f..0000000
--- a/modules/audio_processing/aecm/aecm_core_mips.cc
+++ /dev/null
@@ -1,1564 +0,0 @@
-/*
- *  Copyright (c) 2013 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_processing/aecm/aecm_core.h"
-
-#include "webrtc/modules/audio_processing/aecm/echo_control_mobile.h"
-#include "webrtc/modules/audio_processing/utility/delay_estimator_wrapper.h"
-#include "webrtc/rtc_base/checks.h"
-
-static const ALIGN8_BEG int16_t WebRtcAecm_kSqrtHanning[] ALIGN8_END = {
-  0, 399, 798, 1196, 1594, 1990, 2386, 2780, 3172,
-  3562, 3951, 4337, 4720, 5101, 5478, 5853, 6224,
-  6591, 6954, 7313, 7668, 8019, 8364, 8705, 9040,
-  9370, 9695, 10013, 10326, 10633, 10933, 11227, 11514,
-  11795, 12068, 12335, 12594, 12845, 13089, 13325, 13553,
-  13773, 13985, 14189, 14384, 14571, 14749, 14918, 15079,
-  15231, 15373, 15506, 15631, 15746, 15851, 15947, 16034,
-  16111, 16179, 16237, 16286, 16325, 16354, 16373, 16384
-};
-
-static const int16_t kNoiseEstQDomain = 15;
-static const int16_t kNoiseEstIncCount = 5;
-
-static int16_t coefTable[] = {
-   0,   4, 256, 260, 128, 132, 384, 388,
-  64,  68, 320, 324, 192, 196, 448, 452,
-  32,  36, 288, 292, 160, 164, 416, 420,
-  96, 100, 352, 356, 224, 228, 480, 484,
-  16,  20, 272, 276, 144, 148, 400, 404,
-  80,  84, 336, 340, 208, 212, 464, 468,
-  48,  52, 304, 308, 176, 180, 432, 436,
- 112, 116, 368, 372, 240, 244, 496, 500,
-   8,  12, 264, 268, 136, 140, 392, 396,
-  72,  76, 328, 332, 200, 204, 456, 460,
-  40,  44, 296, 300, 168, 172, 424, 428,
- 104, 108, 360, 364, 232, 236, 488, 492,
-  24,  28, 280, 284, 152, 156, 408, 412,
-  88,  92, 344, 348, 216, 220, 472, 476,
-  56,  60, 312, 316, 184, 188, 440, 444,
- 120, 124, 376, 380, 248, 252, 504, 508
-};
-
-static int16_t coefTable_ifft[] = {
-    0, 512, 256, 508, 128, 252, 384, 380,
-   64, 124, 320, 444, 192, 188, 448, 316,
-   32,  60, 288, 476, 160, 220, 416, 348,
-   96,  92, 352, 412, 224, 156, 480, 284,
-   16,  28, 272, 492, 144, 236, 400, 364,
-   80, 108, 336, 428, 208, 172, 464, 300,
-   48,  44, 304, 460, 176, 204, 432, 332,
-  112,  76, 368, 396, 240, 140, 496, 268,
-    8,  12, 264, 500, 136, 244, 392, 372,
-   72, 116, 328, 436, 200, 180, 456, 308,
-   40,  52, 296, 468, 168, 212, 424, 340,
-  104,  84, 360, 404, 232, 148, 488, 276,
-   24,  20, 280, 484, 152, 228, 408, 356,
-   88, 100, 344, 420, 216, 164, 472, 292,
-   56,  36, 312, 452, 184, 196, 440, 324,
-  120,  68, 376, 388, 248, 132, 504, 260
-};
-
-static void ComfortNoise(AecmCore* aecm,
-                         const uint16_t* dfa,
-                         ComplexInt16* out,
-                         const int16_t* lambda);
-
-static void WindowAndFFT(AecmCore* aecm,
-                         int16_t* fft,
-                         const int16_t* time_signal,
-                         ComplexInt16* freq_signal,
-                         int time_signal_scaling) {
-  int i, j;
-  int32_t tmp1, tmp2, tmp3, tmp4;
-  int16_t* pfrfi;
-  ComplexInt16* pfreq_signal;
-  int16_t  f_coef, s_coef;
-  int32_t load_ptr, store_ptr1, store_ptr2, shift, shift1;
-  int32_t hann, hann1, coefs;
-
-  memset(fft, 0, sizeof(int16_t) * PART_LEN4);
-
-  // FFT of signal
-  __asm __volatile (
-    ".set        push                                                    \n\t"
-    ".set        noreorder                                               \n\t"
-    "addiu       %[shift],          %[time_signal_scaling], -14          \n\t"
-    "addiu       %[i],              $zero,                  64           \n\t"
-    "addiu       %[load_ptr],       %[time_signal],         0            \n\t"
-    "addiu       %[hann],           %[hanning],             0            \n\t"
-    "addiu       %[hann1],          %[hanning],             128          \n\t"
-    "addiu       %[coefs],          %[coefTable],           0            \n\t"
-    "bltz        %[shift],          2f                                   \n\t"
-    " negu       %[shift1],         %[shift]                             \n\t"
-   "1:                                                                   \n\t"
-    "lh          %[tmp1],           0(%[load_ptr])                       \n\t"
-    "lh          %[tmp2],           0(%[hann])                           \n\t"
-    "lh          %[tmp3],           128(%[load_ptr])                     \n\t"
-    "lh          %[tmp4],           0(%[hann1])                          \n\t"
-    "addiu       %[i],              %[i],                   -1           \n\t"
-    "mul         %[tmp1],           %[tmp1],                %[tmp2]      \n\t"
-    "mul         %[tmp3],           %[tmp3],                %[tmp4]      \n\t"
-    "lh          %[f_coef],         0(%[coefs])                          \n\t"
-    "lh          %[s_coef],         2(%[coefs])                          \n\t"
-    "addiu       %[load_ptr],       %[load_ptr],            2            \n\t"
-    "addiu       %[hann],           %[hann],                2            \n\t"
-    "addiu       %[hann1],          %[hann1],               -2           \n\t"
-    "addu        %[store_ptr1],     %[fft],                 %[f_coef]    \n\t"
-    "addu        %[store_ptr2],     %[fft],                 %[s_coef]    \n\t"
-    "sllv        %[tmp1],           %[tmp1],                %[shift]     \n\t"
-    "sllv        %[tmp3],           %[tmp3],                %[shift]     \n\t"
-    "sh          %[tmp1],           0(%[store_ptr1])                     \n\t"
-    "sh          %[tmp3],           0(%[store_ptr2])                     \n\t"
-    "bgtz        %[i],              1b                                   \n\t"
-    " addiu      %[coefs],          %[coefs],               4            \n\t"
-    "b           3f                                                      \n\t"
-    " nop                                                                \n\t"
-   "2:                                                                   \n\t"
-    "lh          %[tmp1],           0(%[load_ptr])                       \n\t"
-    "lh          %[tmp2],           0(%[hann])                           \n\t"
-    "lh          %[tmp3],           128(%[load_ptr])                     \n\t"
-    "lh          %[tmp4],           0(%[hann1])                          \n\t"
-    "addiu       %[i],              %[i],                   -1           \n\t"
-    "mul         %[tmp1],           %[tmp1],                %[tmp2]      \n\t"
-    "mul         %[tmp3],           %[tmp3],                %[tmp4]      \n\t"
-    "lh          %[f_coef],         0(%[coefs])                          \n\t"
-    "lh          %[s_coef],         2(%[coefs])                          \n\t"
-    "addiu       %[load_ptr],       %[load_ptr],            2            \n\t"
-    "addiu       %[hann],           %[hann],                2            \n\t"
-    "addiu       %[hann1],          %[hann1],               -2           \n\t"
-    "addu        %[store_ptr1],     %[fft],                 %[f_coef]    \n\t"
-    "addu        %[store_ptr2],     %[fft],                 %[s_coef]    \n\t"
-    "srav        %[tmp1],           %[tmp1],                %[shift1]    \n\t"
-    "srav        %[tmp3],           %[tmp3],                %[shift1]    \n\t"
-    "sh          %[tmp1],           0(%[store_ptr1])                     \n\t"
-    "sh          %[tmp3],           0(%[store_ptr2])                     \n\t"
-    "bgtz        %[i],              2b                                   \n\t"
-    " addiu      %[coefs],          %[coefs],               4            \n\t"
-   "3:                                                                   \n\t"
-    ".set        pop                                                     \n\t"
-    : [load_ptr] "=&r" (load_ptr), [shift] "=&r" (shift), [hann] "=&r" (hann),
-      [hann1] "=&r" (hann1), [shift1] "=&r" (shift1), [coefs] "=&r" (coefs),
-      [tmp1] "=&r" (tmp1), [tmp2] "=&r" (tmp2), [tmp3] "=&r" (tmp3),
-      [tmp4] "=&r" (tmp4), [i] "=&r" (i), [f_coef] "=&r" (f_coef),
-      [s_coef] "=&r" (s_coef), [store_ptr1] "=&r" (store_ptr1),
-      [store_ptr2] "=&r" (store_ptr2)
-    : [time_signal] "r" (time_signal), [coefTable] "r" (coefTable),
-      [time_signal_scaling] "r" (time_signal_scaling),
-      [hanning] "r" (WebRtcAecm_kSqrtHanning), [fft] "r" (fft)
-    : "memory", "hi", "lo"
-  );
-
-  WebRtcSpl_ComplexFFT(fft, PART_LEN_SHIFT, 1);
-  pfrfi = fft;
-  pfreq_signal = freq_signal;
-
-  __asm __volatile (
-    ".set        push                                                     \n\t"
-    ".set        noreorder                                                \n\t"
-    "addiu       %[j],              $zero,                 128            \n\t"
-   "1:                                                                    \n\t"
-    "lh          %[tmp1],           0(%[pfrfi])                           \n\t"
-    "lh          %[tmp2],           2(%[pfrfi])                           \n\t"
-    "lh          %[tmp3],           4(%[pfrfi])                           \n\t"
-    "lh          %[tmp4],           6(%[pfrfi])                           \n\t"
-    "subu        %[tmp2],           $zero,                 %[tmp2]        \n\t"
-    "sh          %[tmp1],           0(%[pfreq_signal])                    \n\t"
-    "sh          %[tmp2],           2(%[pfreq_signal])                    \n\t"
-    "subu        %[tmp4],           $zero,                 %[tmp4]        \n\t"
-    "sh          %[tmp3],           4(%[pfreq_signal])                    \n\t"
-    "sh          %[tmp4],           6(%[pfreq_signal])                    \n\t"
-    "lh          %[tmp1],           8(%[pfrfi])                           \n\t"
-    "lh          %[tmp2],           10(%[pfrfi])                          \n\t"
-    "lh          %[tmp3],           12(%[pfrfi])                          \n\t"
-    "lh          %[tmp4],           14(%[pfrfi])                          \n\t"
-    "addiu       %[j],              %[j],                  -8             \n\t"
-    "subu        %[tmp2],           $zero,                 %[tmp2]        \n\t"
-    "sh          %[tmp1],           8(%[pfreq_signal])                    \n\t"
-    "sh          %[tmp2],           10(%[pfreq_signal])                   \n\t"
-    "subu        %[tmp4],           $zero,                 %[tmp4]        \n\t"
-    "sh          %[tmp3],           12(%[pfreq_signal])                   \n\t"
-    "sh          %[tmp4],           14(%[pfreq_signal])                   \n\t"
-    "addiu       %[pfreq_signal],   %[pfreq_signal],       16             \n\t"
-    "bgtz        %[j],              1b                                    \n\t"
-    " addiu      %[pfrfi],          %[pfrfi],              16             \n\t"
-    ".set        pop                                                      \n\t"
-    : [tmp1] "=&r" (tmp1), [tmp2] "=&r" (tmp2), [tmp3] "=&r" (tmp3),
-      [j] "=&r" (j), [pfrfi] "+r" (pfrfi), [pfreq_signal] "+r" (pfreq_signal),
-      [tmp4] "=&r" (tmp4)
-    :
-    : "memory"
-  );
-}
-
-static void InverseFFTAndWindow(AecmCore* aecm,
-                                int16_t* fft,
-                                ComplexInt16* efw,
-                                int16_t* output,
-                                const int16_t* nearendClean) {
-  int i, outCFFT;
-  int32_t tmp1, tmp2, tmp3, tmp4, tmp_re, tmp_im;
-  int16_t* pcoefTable_ifft = coefTable_ifft;
-  int16_t* pfft = fft;
-  int16_t* ppfft = fft;
-  ComplexInt16* pefw = efw;
-  int32_t out_aecm;
-  int16_t* paecm_buf = aecm->outBuf;
-  const int16_t* p_kSqrtHanning = WebRtcAecm_kSqrtHanning;
-  const int16_t* pp_kSqrtHanning = &WebRtcAecm_kSqrtHanning[PART_LEN];
-  int16_t* output1 = output;
-
-  __asm __volatile (
-    ".set      push                                                        \n\t"
-    ".set      noreorder                                                   \n\t"
-    "addiu     %[i],                $zero,                   64            \n\t"
-   "1:                                                                     \n\t"
-    "lh        %[tmp1],             0(%[pcoefTable_ifft])                  \n\t"
-    "lh        %[tmp2],             2(%[pcoefTable_ifft])                  \n\t"
-    "lh        %[tmp_re],           0(%[pefw])                             \n\t"
-    "lh        %[tmp_im],           2(%[pefw])                             \n\t"
-    "addu      %[pfft],             %[fft],                  %[tmp2]       \n\t"
-    "sh        %[tmp_re],           0(%[pfft])                             \n\t"
-    "sh        %[tmp_im],           2(%[pfft])                             \n\t"
-    "addu      %[pfft],             %[fft],                  %[tmp1]       \n\t"
-    "sh        %[tmp_re],           0(%[pfft])                             \n\t"
-    "subu      %[tmp_im],           $zero,                   %[tmp_im]     \n\t"
-    "sh        %[tmp_im],           2(%[pfft])                             \n\t"
-    "lh        %[tmp1],             4(%[pcoefTable_ifft])                  \n\t"
-    "lh        %[tmp2],             6(%[pcoefTable_ifft])                  \n\t"
-    "lh        %[tmp_re],           4(%[pefw])                             \n\t"
-    "lh        %[tmp_im],           6(%[pefw])                             \n\t"
-    "addu      %[pfft],             %[fft],                  %[tmp2]       \n\t"
-    "sh        %[tmp_re],           0(%[pfft])                             \n\t"
-    "sh        %[tmp_im],           2(%[pfft])                             \n\t"
-    "addu      %[pfft],             %[fft],                  %[tmp1]       \n\t"
-    "sh        %[tmp_re],           0(%[pfft])                             \n\t"
-    "subu      %[tmp_im],           $zero,                   %[tmp_im]     \n\t"
-    "sh        %[tmp_im],           2(%[pfft])                             \n\t"
-    "lh        %[tmp1],             8(%[pcoefTable_ifft])                  \n\t"
-    "lh        %[tmp2],             10(%[pcoefTable_ifft])                 \n\t"
-    "lh        %[tmp_re],           8(%[pefw])                             \n\t"
-    "lh        %[tmp_im],           10(%[pefw])                            \n\t"
-    "addu      %[pfft],             %[fft],                  %[tmp2]       \n\t"
-    "sh        %[tmp_re],           0(%[pfft])                             \n\t"
-    "sh        %[tmp_im],           2(%[pfft])                             \n\t"
-    "addu      %[pfft],             %[fft],                  %[tmp1]       \n\t"
-    "sh        %[tmp_re],           0(%[pfft])                             \n\t"
-    "subu      %[tmp_im],           $zero,                   %[tmp_im]     \n\t"
-    "sh        %[tmp_im],           2(%[pfft])                             \n\t"
-    "lh        %[tmp1],             12(%[pcoefTable_ifft])                 \n\t"
-    "lh        %[tmp2],             14(%[pcoefTable_ifft])                 \n\t"
-    "lh        %[tmp_re],           12(%[pefw])                            \n\t"
-    "lh        %[tmp_im],           14(%[pefw])                            \n\t"
-    "addu      %[pfft],             %[fft],                  %[tmp2]       \n\t"
-    "sh        %[tmp_re],           0(%[pfft])                             \n\t"
-    "sh        %[tmp_im],           2(%[pfft])                             \n\t"
-    "addu      %[pfft],             %[fft],                  %[tmp1]       \n\t"
-    "sh        %[tmp_re],           0(%[pfft])                             \n\t"
-    "subu      %[tmp_im],           $zero,                   %[tmp_im]     \n\t"
-    "sh        %[tmp_im],           2(%[pfft])                             \n\t"
-    "addiu     %[pcoefTable_ifft],  %[pcoefTable_ifft],      16            \n\t"
-    "addiu     %[i],                %[i],                    -4            \n\t"
-    "bgtz      %[i],                1b                                     \n\t"
-    " addiu    %[pefw],             %[pefw],                 16            \n\t"
-    ".set      pop                                                         \n\t"
-    : [tmp1] "=&r" (tmp1), [tmp2] "=&r" (tmp2), [pfft] "+r" (pfft),
-      [i] "=&r" (i), [tmp_re] "=&r" (tmp_re), [tmp_im] "=&r" (tmp_im),
-      [pefw] "+r" (pefw), [pcoefTable_ifft] "+r" (pcoefTable_ifft),
-      [fft] "+r" (fft)
-    :
-    : "memory"
-  );
-
-  fft[2] = efw[PART_LEN].real;
-  fft[3] = -efw[PART_LEN].imag;
-
-  outCFFT = WebRtcSpl_ComplexIFFT(fft, PART_LEN_SHIFT, 1);
-  pfft = fft;
-
-  __asm __volatile (
-    ".set       push                                               \n\t"
-    ".set       noreorder                                          \n\t"
-    "addiu      %[i],            $zero,               128          \n\t"
-   "1:                                                             \n\t"
-    "lh         %[tmp1],         0(%[ppfft])                       \n\t"
-    "lh         %[tmp2],         4(%[ppfft])                       \n\t"
-    "lh         %[tmp3],         8(%[ppfft])                       \n\t"
-    "lh         %[tmp4],         12(%[ppfft])                      \n\t"
-    "addiu      %[i],            %[i],                -4           \n\t"
-    "sh         %[tmp1],         0(%[pfft])                        \n\t"
-    "sh         %[tmp2],         2(%[pfft])                        \n\t"
-    "sh         %[tmp3],         4(%[pfft])                        \n\t"
-    "sh         %[tmp4],         6(%[pfft])                        \n\t"
-    "addiu      %[ppfft],        %[ppfft],            16           \n\t"
-    "bgtz       %[i],            1b                                \n\t"
-    " addiu     %[pfft],         %[pfft],             8            \n\t"
-    ".set       pop                                                \n\t"
-    : [tmp1] "=&r" (tmp1), [tmp2] "=&r" (tmp2), [pfft] "+r" (pfft),
-      [i] "=&r" (i), [tmp3] "=&r" (tmp3), [tmp4] "=&r" (tmp4),
-      [ppfft] "+r" (ppfft)
-    :
-    : "memory"
-  );
-
-  pfft = fft;
-  out_aecm = (int32_t)(outCFFT - aecm->dfaCleanQDomain);
-
-  __asm __volatile (
-    ".set       push                                                       \n\t"
-    ".set       noreorder                                                  \n\t"
-    "addiu      %[i],                $zero,                  64            \n\t"
-   "11:                                                                    \n\t"
-    "lh         %[tmp1],             0(%[pfft])                            \n\t"
-    "lh         %[tmp2],             0(%[p_kSqrtHanning])                  \n\t"
-    "addiu      %[i],                %[i],                   -2            \n\t"
-    "mul        %[tmp1],             %[tmp1],                %[tmp2]       \n\t"
-    "lh         %[tmp3],             2(%[pfft])                            \n\t"
-    "lh         %[tmp4],             2(%[p_kSqrtHanning])                  \n\t"
-    "mul        %[tmp3],             %[tmp3],                %[tmp4]       \n\t"
-    "addiu      %[tmp1],             %[tmp1],                8192          \n\t"
-    "sra        %[tmp1],             %[tmp1],                14            \n\t"
-    "addiu      %[tmp3],             %[tmp3],                8192          \n\t"
-    "sra        %[tmp3],             %[tmp3],                14            \n\t"
-    "bgez       %[out_aecm],         1f                                    \n\t"
-    " negu      %[tmp2],             %[out_aecm]                           \n\t"
-    "srav       %[tmp1],             %[tmp1],                %[tmp2]       \n\t"
-    "b          2f                                                         \n\t"
-    " srav      %[tmp3],             %[tmp3],                %[tmp2]       \n\t"
-   "1:                                                                     \n\t"
-    "sllv       %[tmp1],             %[tmp1],                %[out_aecm]   \n\t"
-    "sllv       %[tmp3],             %[tmp3],                %[out_aecm]   \n\t"
-   "2:                                                                     \n\t"
-    "lh         %[tmp4],             0(%[paecm_buf])                       \n\t"
-    "lh         %[tmp2],             2(%[paecm_buf])                       \n\t"
-    "addu       %[tmp3],             %[tmp3],                %[tmp2]       \n\t"
-    "addu       %[tmp1],             %[tmp1],                %[tmp4]       \n\t"
-#if defined(MIPS_DSP_R1_LE)
-    "shll_s.w   %[tmp1],             %[tmp1],                16            \n\t"
-    "sra        %[tmp1],             %[tmp1],                16            \n\t"
-    "shll_s.w   %[tmp3],             %[tmp3],                16            \n\t"
-    "sra        %[tmp3],             %[tmp3],                16            \n\t"
-#else  // #if defined(MIPS_DSP_R1_LE)
-    "sra        %[tmp4],             %[tmp1],                31            \n\t"
-    "sra        %[tmp2],             %[tmp1],                15            \n\t"
-    "beq        %[tmp4],             %[tmp2],                3f            \n\t"
-    " ori       %[tmp2],             $zero,                  0x7fff        \n\t"
-    "xor        %[tmp1],             %[tmp2],                %[tmp4]       \n\t"
-   "3:                                                                     \n\t"
-    "sra        %[tmp2],             %[tmp3],                31            \n\t"
-    "sra        %[tmp4],             %[tmp3],                15            \n\t"
-    "beq        %[tmp2],             %[tmp4],                4f            \n\t"
-    " ori       %[tmp4],             $zero,                  0x7fff        \n\t"
-    "xor        %[tmp3],             %[tmp4],                %[tmp2]       \n\t"
-   "4:                                                                     \n\t"
-#endif  // #if defined(MIPS_DSP_R1_LE)
-    "sh         %[tmp1],             0(%[pfft])                            \n\t"
-    "sh         %[tmp1],             0(%[output1])                         \n\t"
-    "sh         %[tmp3],             2(%[pfft])                            \n\t"
-    "sh         %[tmp3],             2(%[output1])                         \n\t"
-    "lh         %[tmp1],             128(%[pfft])                          \n\t"
-    "lh         %[tmp2],             0(%[pp_kSqrtHanning])                 \n\t"
-    "mul        %[tmp1],             %[tmp1],                %[tmp2]       \n\t"
-    "lh         %[tmp3],             130(%[pfft])                          \n\t"
-    "lh         %[tmp4],             -2(%[pp_kSqrtHanning])                \n\t"
-    "mul        %[tmp3],             %[tmp3],                %[tmp4]       \n\t"
-    "sra        %[tmp1],             %[tmp1],                14            \n\t"
-    "sra        %[tmp3],             %[tmp3],                14            \n\t"
-    "bgez       %[out_aecm],         5f                                    \n\t"
-    " negu      %[tmp2],             %[out_aecm]                           \n\t"
-    "srav       %[tmp3],             %[tmp3],                %[tmp2]       \n\t"
-    "b          6f                                                         \n\t"
-    " srav      %[tmp1],             %[tmp1],                %[tmp2]       \n\t"
-   "5:                                                                     \n\t"
-    "sllv       %[tmp1],             %[tmp1],                %[out_aecm]   \n\t"
-    "sllv       %[tmp3],             %[tmp3],                %[out_aecm]   \n\t"
-   "6:                                                                     \n\t"
-#if defined(MIPS_DSP_R1_LE)
-    "shll_s.w   %[tmp1],             %[tmp1],                16            \n\t"
-    "sra        %[tmp1],             %[tmp1],                16            \n\t"
-    "shll_s.w   %[tmp3],             %[tmp3],                16            \n\t"
-    "sra        %[tmp3],             %[tmp3],                16            \n\t"
-#else  // #if defined(MIPS_DSP_R1_LE)
-    "sra        %[tmp4],             %[tmp1],                31            \n\t"
-    "sra        %[tmp2],             %[tmp1],                15            \n\t"
-    "beq        %[tmp4],             %[tmp2],                7f            \n\t"
-    " ori       %[tmp2],             $zero,                  0x7fff        \n\t"
-    "xor        %[tmp1],             %[tmp2],                %[tmp4]       \n\t"
-   "7:                                                                     \n\t"
-    "sra        %[tmp2],             %[tmp3],                31            \n\t"
-    "sra        %[tmp4],             %[tmp3],                15            \n\t"
-    "beq        %[tmp2],             %[tmp4],                8f            \n\t"
-    " ori       %[tmp4],             $zero,                  0x7fff        \n\t"
-    "xor        %[tmp3],             %[tmp4],                %[tmp2]       \n\t"
-   "8:                                                                     \n\t"
-#endif  // #if defined(MIPS_DSP_R1_LE)
-    "sh         %[tmp1],             0(%[paecm_buf])                       \n\t"
-    "sh         %[tmp3],             2(%[paecm_buf])                       \n\t"
-    "addiu      %[output1],          %[output1],             4             \n\t"
-    "addiu      %[paecm_buf],        %[paecm_buf],           4             \n\t"
-    "addiu      %[pfft],             %[pfft],                4             \n\t"
-    "addiu      %[p_kSqrtHanning],   %[p_kSqrtHanning],      4             \n\t"
-    "bgtz       %[i],                11b                                   \n\t"
-    " addiu     %[pp_kSqrtHanning],  %[pp_kSqrtHanning],     -4            \n\t"
-    ".set       pop                                                        \n\t"
-    : [tmp1] "=&r" (tmp1), [tmp2] "=&r" (tmp2), [pfft] "+r" (pfft),
-      [output1] "+r" (output1), [tmp3] "=&r" (tmp3), [tmp4] "=&r" (tmp4),
-      [paecm_buf] "+r" (paecm_buf), [i] "=&r" (i),
-      [pp_kSqrtHanning] "+r" (pp_kSqrtHanning),
-      [p_kSqrtHanning] "+r" (p_kSqrtHanning)
-    : [out_aecm] "r" (out_aecm),
-      [WebRtcAecm_kSqrtHanning] "r" (WebRtcAecm_kSqrtHanning)
-    : "hi", "lo","memory"
-  );
-
-  // Copy the current block to the old position
-  // (aecm->outBuf is shifted elsewhere)
-  memcpy(aecm->xBuf, aecm->xBuf + PART_LEN, sizeof(int16_t) * PART_LEN);
-  memcpy(aecm->dBufNoisy,
-         aecm->dBufNoisy + PART_LEN,
-         sizeof(int16_t) * PART_LEN);
-  if (nearendClean != NULL) {
-    memcpy(aecm->dBufClean,
-           aecm->dBufClean + PART_LEN,
-           sizeof(int16_t) * PART_LEN);
-  }
-}
-
-void WebRtcAecm_CalcLinearEnergies_mips(AecmCore* aecm,
-                                        const uint16_t* far_spectrum,
-                                        int32_t* echo_est,
-                                        uint32_t* far_energy,
-                                        uint32_t* echo_energy_adapt,
-                                        uint32_t* echo_energy_stored) {
-  int i;
-  uint32_t par1 = (*far_energy);
-  uint32_t par2 = (*echo_energy_adapt);
-  uint32_t par3 = (*echo_energy_stored);
-  int16_t* ch_stored_p = &(aecm->channelStored[0]);
-  int16_t* ch_adapt_p = &(aecm->channelAdapt16[0]);
-  uint16_t* spectrum_p = (uint16_t*)(&(far_spectrum[0]));
-  int32_t* echo_p = &(echo_est[0]);
-  int32_t temp0, stored0, echo0, adept0, spectrum0;
-  int32_t stored1, adept1, spectrum1, echo1, temp1;
-
-  // Get energy for the delayed far end signal and estimated
-  // echo using both stored and adapted channels.
-  for (i = 0; i < PART_LEN; i+= 4) {
-    __asm __volatile (
-      ".set           push                                            \n\t"
-      ".set           noreorder                                       \n\t"
-      "lh             %[stored0],     0(%[ch_stored_p])               \n\t"
-      "lhu            %[adept0],      0(%[ch_adapt_p])                \n\t"
-      "lhu            %[spectrum0],   0(%[spectrum_p])                \n\t"
-      "lh             %[stored1],     2(%[ch_stored_p])               \n\t"
-      "lhu            %[adept1],      2(%[ch_adapt_p])                \n\t"
-      "lhu            %[spectrum1],   2(%[spectrum_p])                \n\t"
-      "mul            %[echo0],       %[stored0],     %[spectrum0]    \n\t"
-      "mul            %[temp0],       %[adept0],      %[spectrum0]    \n\t"
-      "mul            %[echo1],       %[stored1],     %[spectrum1]    \n\t"
-      "mul            %[temp1],       %[adept1],      %[spectrum1]    \n\t"
-      "addu           %[par1],        %[par1],        %[spectrum0]    \n\t"
-      "addu           %[par1],        %[par1],        %[spectrum1]    \n\t"
-      "addiu          %[echo_p],      %[echo_p],      16              \n\t"
-      "addu           %[par3],        %[par3],        %[echo0]        \n\t"
-      "addu           %[par2],        %[par2],        %[temp0]        \n\t"
-      "addu           %[par3],        %[par3],        %[echo1]        \n\t"
-      "addu           %[par2],        %[par2],        %[temp1]        \n\t"
-      "usw            %[echo0],       -16(%[echo_p])                  \n\t"
-      "usw            %[echo1],       -12(%[echo_p])                  \n\t"
-      "lh             %[stored0],     4(%[ch_stored_p])               \n\t"
-      "lhu            %[adept0],      4(%[ch_adapt_p])                \n\t"
-      "lhu            %[spectrum0],   4(%[spectrum_p])                \n\t"
-      "lh             %[stored1],     6(%[ch_stored_p])               \n\t"
-      "lhu            %[adept1],      6(%[ch_adapt_p])                \n\t"
-      "lhu            %[spectrum1],   6(%[spectrum_p])                \n\t"
-      "mul            %[echo0],       %[stored0],     %[spectrum0]    \n\t"
-      "mul            %[temp0],       %[adept0],      %[spectrum0]    \n\t"
-      "mul            %[echo1],       %[stored1],     %[spectrum1]    \n\t"
-      "mul            %[temp1],       %[adept1],      %[spectrum1]    \n\t"
-      "addu           %[par1],        %[par1],        %[spectrum0]    \n\t"
-      "addu           %[par1],        %[par1],        %[spectrum1]    \n\t"
-      "addiu          %[ch_stored_p], %[ch_stored_p], 8               \n\t"
-      "addiu          %[ch_adapt_p],  %[ch_adapt_p],  8               \n\t"
-      "addiu          %[spectrum_p],  %[spectrum_p],  8               \n\t"
-      "addu           %[par3],        %[par3],        %[echo0]        \n\t"
-      "addu           %[par2],        %[par2],        %[temp0]        \n\t"
-      "addu           %[par3],        %[par3],        %[echo1]        \n\t"
-      "addu           %[par2],        %[par2],        %[temp1]        \n\t"
-      "usw            %[echo0],       -8(%[echo_p])                   \n\t"
-      "usw            %[echo1],       -4(%[echo_p])                   \n\t"
-      ".set           pop                                             \n\t"
-      : [temp0] "=&r" (temp0), [stored0] "=&r" (stored0),
-        [adept0] "=&r" (adept0), [spectrum0] "=&r" (spectrum0),
-        [echo0] "=&r" (echo0), [echo_p] "+r" (echo_p), [par3] "+r" (par3),
-        [par1] "+r" (par1), [par2] "+r" (par2), [stored1] "=&r" (stored1),
-        [adept1] "=&r" (adept1), [echo1] "=&r" (echo1),
-        [spectrum1] "=&r" (spectrum1), [temp1] "=&r" (temp1),
-        [ch_stored_p] "+r" (ch_stored_p), [ch_adapt_p] "+r" (ch_adapt_p),
-        [spectrum_p] "+r" (spectrum_p)
-      :
-      : "hi", "lo", "memory"
-    );
-  }
-
-  echo_est[PART_LEN] = WEBRTC_SPL_MUL_16_U16(aecm->channelStored[PART_LEN],
-                                             far_spectrum[PART_LEN]);
-  par1 += (uint32_t)(far_spectrum[PART_LEN]);
-  par2 += aecm->channelAdapt16[PART_LEN] * far_spectrum[PART_LEN];
-  par3 += (uint32_t)echo_est[PART_LEN];
-
-  (*far_energy) = par1;
-  (*echo_energy_adapt) = par2;
-  (*echo_energy_stored) = par3;
-}
-
-#if defined(MIPS_DSP_R1_LE)
-void WebRtcAecm_StoreAdaptiveChannel_mips(AecmCore* aecm,
-                                          const uint16_t* far_spectrum,
-                                          int32_t* echo_est) {
-  int i;
-  int16_t* temp1;
-  uint16_t* temp8;
-  int32_t temp0, temp2, temp3, temp4, temp5, temp6;
-  int32_t* temp7 = &(echo_est[0]);
-  temp1 = &(aecm->channelStored[0]);
-  temp8 = (uint16_t*)(&far_spectrum[0]);
-
-  // During startup we store the channel every block.
-  memcpy(aecm->channelStored, aecm->channelAdapt16,
-         sizeof(int16_t) * PART_LEN1);
-  // Recalculate echo estimate
-  for (i = 0; i < PART_LEN; i += 4) {
-    __asm __volatile (
-      "ulw            %[temp0],   0(%[temp8])               \n\t"
-      "ulw            %[temp2],   0(%[temp1])               \n\t"
-      "ulw            %[temp4],   4(%[temp8])               \n\t"
-      "ulw            %[temp5],   4(%[temp1])               \n\t"
-      "muleq_s.w.phl  %[temp3],   %[temp2],     %[temp0]    \n\t"
-      "muleq_s.w.phr  %[temp0],   %[temp2],     %[temp0]    \n\t"
-      "muleq_s.w.phl  %[temp6],   %[temp5],     %[temp4]    \n\t"
-      "muleq_s.w.phr  %[temp4],   %[temp5],     %[temp4]    \n\t"
-      "addiu          %[temp7],   %[temp7],     16          \n\t"
-      "addiu          %[temp1],   %[temp1],     8           \n\t"
-      "addiu          %[temp8],   %[temp8],     8           \n\t"
-      "sra            %[temp3],   %[temp3],     1           \n\t"
-      "sra            %[temp0],   %[temp0],     1           \n\t"
-      "sra            %[temp6],   %[temp6],     1           \n\t"
-      "sra            %[temp4],   %[temp4],     1           \n\t"
-      "usw            %[temp3],   -12(%[temp7])             \n\t"
-      "usw            %[temp0],   -16(%[temp7])             \n\t"
-      "usw            %[temp6],   -4(%[temp7])              \n\t"
-      "usw            %[temp4],   -8(%[temp7])              \n\t"
-      : [temp0] "=&r" (temp0), [temp2] "=&r" (temp2), [temp3] "=&r" (temp3),
-        [temp4] "=&r" (temp4), [temp5] "=&r" (temp5), [temp6] "=&r" (temp6),
-        [temp1] "+r" (temp1), [temp8] "+r" (temp8), [temp7] "+r" (temp7)
-      :
-      : "hi", "lo", "memory"
-    );
-  }
-  echo_est[i] = WEBRTC_SPL_MUL_16_U16(aecm->channelStored[i],
-                                      far_spectrum[i]);
-}
-
-void WebRtcAecm_ResetAdaptiveChannel_mips(AecmCore* aecm) {
-  int i;
-  int32_t* temp3;
-  int16_t* temp0;
-  int32_t temp1, temp2, temp4, temp5;
-
-  temp0 = &(aecm->channelStored[0]);
-  temp3 = &(aecm->channelAdapt32[0]);
-
-  // The stored channel has a significantly lower MSE than the adaptive one for
-  // two consecutive calculations. Reset the adaptive channel.
-  memcpy(aecm->channelAdapt16,
-         aecm->channelStored,
-         sizeof(int16_t) * PART_LEN1);
-
-  // Restore the W32 channel
-  for (i = 0; i < PART_LEN; i += 4) {
-    __asm __volatile (
-      "ulw            %[temp1], 0(%[temp0])           \n\t"
-      "ulw            %[temp4], 4(%[temp0])           \n\t"
-      "preceq.w.phl   %[temp2], %[temp1]              \n\t"
-      "preceq.w.phr   %[temp1], %[temp1]              \n\t"
-      "preceq.w.phl   %[temp5], %[temp4]              \n\t"
-      "preceq.w.phr   %[temp4], %[temp4]              \n\t"
-      "addiu          %[temp0], %[temp0], 8           \n\t"
-      "usw            %[temp2], 4(%[temp3])           \n\t"
-      "usw            %[temp1], 0(%[temp3])           \n\t"
-      "usw            %[temp5], 12(%[temp3])          \n\t"
-      "usw            %[temp4], 8(%[temp3])           \n\t"
-      "addiu          %[temp3], %[temp3], 16          \n\t"
-      : [temp1] "=&r" (temp1), [temp2] "=&r" (temp2),
-        [temp4] "=&r" (temp4), [temp5] "=&r" (temp5),
-        [temp3] "+r" (temp3), [temp0] "+r" (temp0)
-      :
-      : "memory"
-    );
-  }
-
-  aecm->channelAdapt32[i] = (int32_t)aecm->channelStored[i] << 16;
-}
-#endif  // #if defined(MIPS_DSP_R1_LE)
-
-// Transforms a time domain signal into the frequency domain, outputting the
-// complex valued signal, absolute value and sum of absolute values.
-//
-// time_signal          [in]    Pointer to time domain signal
-// freq_signal_real     [out]   Pointer to real part of frequency domain array
-// freq_signal_imag     [out]   Pointer to imaginary part of frequency domain
-//                              array
-// freq_signal_abs      [out]   Pointer to absolute value of frequency domain
-//                              array
-// freq_signal_sum_abs  [out]   Pointer to the sum of all absolute values in
-//                              the frequency domain array
-// return value                 The Q-domain of current frequency values
-//
-static int TimeToFrequencyDomain(AecmCore* aecm,
-                                 const int16_t* time_signal,
-                                 ComplexInt16* freq_signal,
-                                 uint16_t* freq_signal_abs,
-                                 uint32_t* freq_signal_sum_abs) {
-  int i = 0;
-  int time_signal_scaling = 0;
-
-  // In fft_buf, +16 for 32-byte alignment.
-  int16_t fft_buf[PART_LEN4 + 16];
-  int16_t *fft = (int16_t *) (((uintptr_t) fft_buf + 31) & ~31);
-
-  int16_t tmp16no1;
-#if !defined(MIPS_DSP_R2_LE)
-  int32_t tmp32no1;
-  int32_t tmp32no2;
-  int16_t tmp16no2;
-#else
-  int32_t tmp32no10, tmp32no11, tmp32no12, tmp32no13;
-  int32_t tmp32no20, tmp32no21, tmp32no22, tmp32no23;
-  int16_t* freqp;
-  uint16_t* freqabsp;
-  uint32_t freqt0, freqt1, freqt2, freqt3;
-  uint32_t freqs;
-#endif
-
-#ifdef AECM_DYNAMIC_Q
-  tmp16no1 = WebRtcSpl_MaxAbsValueW16(time_signal, PART_LEN2);
-  time_signal_scaling = WebRtcSpl_NormW16(tmp16no1);
-#endif
-
-  WindowAndFFT(aecm, fft, time_signal, freq_signal, time_signal_scaling);
-
-  // Extract imaginary and real part,
-  // calculate the magnitude for all frequency bins
-  freq_signal[0].imag = 0;
-  freq_signal[PART_LEN].imag = 0;
-  freq_signal[PART_LEN].real = fft[PART_LEN2];
-  freq_signal_abs[0] = (uint16_t)WEBRTC_SPL_ABS_W16(freq_signal[0].real);
-  freq_signal_abs[PART_LEN] = (uint16_t)WEBRTC_SPL_ABS_W16(
-    freq_signal[PART_LEN].real);
-  (*freq_signal_sum_abs) = (uint32_t)(freq_signal_abs[0]) +
-    (uint32_t)(freq_signal_abs[PART_LEN]);
-
-#if !defined(MIPS_DSP_R2_LE)
-  for (i = 1; i < PART_LEN; i++) {
-    if (freq_signal[i].real == 0)
-    {
-      freq_signal_abs[i] = (uint16_t)WEBRTC_SPL_ABS_W16(
-        freq_signal[i].imag);
-    }
-    else if (freq_signal[i].imag == 0)
-    {
-      freq_signal_abs[i] = (uint16_t)WEBRTC_SPL_ABS_W16(
-        freq_signal[i].real);
-    }
-    else
-    {
-      // Approximation for magnitude of complex fft output
-      // magn = sqrt(real^2 + imag^2)
-      // magn ~= alpha * max(|imag|,|real|) + beta * min(|imag|,|real|)
-      //
-      // The parameters alpha and beta are stored in Q15
-      tmp16no1 = WEBRTC_SPL_ABS_W16(freq_signal[i].real);
-      tmp16no2 = WEBRTC_SPL_ABS_W16(freq_signal[i].imag);
-      tmp32no1 = tmp16no1 * tmp16no1;
-      tmp32no2 = tmp16no2 * tmp16no2;
-      tmp32no2 = WebRtcSpl_AddSatW32(tmp32no1, tmp32no2);
-      tmp32no1 = WebRtcSpl_SqrtFloor(tmp32no2);
-
-      freq_signal_abs[i] = (uint16_t)tmp32no1;
-    }
-    (*freq_signal_sum_abs) += (uint32_t)freq_signal_abs[i];
-  }
-#else // #if !defined(MIPS_DSP_R2_LE)
-  freqs = (uint32_t)(freq_signal_abs[0]) +
-          (uint32_t)(freq_signal_abs[PART_LEN]);
-  freqp = &(freq_signal[1].real);
-
-  __asm __volatile (
-    "lw             %[freqt0],      0(%[freqp])             \n\t"
-    "lw             %[freqt1],      4(%[freqp])             \n\t"
-    "lw             %[freqt2],      8(%[freqp])             \n\t"
-    "mult           $ac0,           $zero,      $zero       \n\t"
-    "mult           $ac1,           $zero,      $zero       \n\t"
-    "mult           $ac2,           $zero,      $zero       \n\t"
-    "dpaq_s.w.ph    $ac0,           %[freqt0],  %[freqt0]   \n\t"
-    "dpaq_s.w.ph    $ac1,           %[freqt1],  %[freqt1]   \n\t"
-    "dpaq_s.w.ph    $ac2,           %[freqt2],  %[freqt2]   \n\t"
-    "addiu          %[freqp],       %[freqp],   12          \n\t"
-    "extr.w         %[tmp32no20],   $ac0,       1           \n\t"
-    "extr.w         %[tmp32no21],   $ac1,       1           \n\t"
-    "extr.w         %[tmp32no22],   $ac2,       1           \n\t"
-    : [freqt0] "=&r" (freqt0), [freqt1] "=&r" (freqt1),
-      [freqt2] "=&r" (freqt2), [freqp] "+r" (freqp),
-      [tmp32no20] "=r" (tmp32no20), [tmp32no21] "=r" (tmp32no21),
-      [tmp32no22] "=r" (tmp32no22)
-    :
-    : "memory", "hi", "lo", "$ac1hi", "$ac1lo", "$ac2hi", "$ac2lo"
-  );
-
-  tmp32no10 = WebRtcSpl_SqrtFloor(tmp32no20);
-  tmp32no11 = WebRtcSpl_SqrtFloor(tmp32no21);
-  tmp32no12 = WebRtcSpl_SqrtFloor(tmp32no22);
-  freq_signal_abs[1] = (uint16_t)tmp32no10;
-  freq_signal_abs[2] = (uint16_t)tmp32no11;
-  freq_signal_abs[3] = (uint16_t)tmp32no12;
-  freqs += (uint32_t)tmp32no10;
-  freqs += (uint32_t)tmp32no11;
-  freqs += (uint32_t)tmp32no12;
-  freqabsp = &(freq_signal_abs[4]);
-  for (i = 4; i < PART_LEN; i+=4)
-  {
-    __asm __volatile (
-      "ulw            %[freqt0],      0(%[freqp])                 \n\t"
-      "ulw            %[freqt1],      4(%[freqp])                 \n\t"
-      "ulw            %[freqt2],      8(%[freqp])                 \n\t"
-      "ulw            %[freqt3],      12(%[freqp])                \n\t"
-      "mult           $ac0,           $zero,          $zero       \n\t"
-      "mult           $ac1,           $zero,          $zero       \n\t"
-      "mult           $ac2,           $zero,          $zero       \n\t"
-      "mult           $ac3,           $zero,          $zero       \n\t"
-      "dpaq_s.w.ph    $ac0,           %[freqt0],      %[freqt0]   \n\t"
-      "dpaq_s.w.ph    $ac1,           %[freqt1],      %[freqt1]   \n\t"
-      "dpaq_s.w.ph    $ac2,           %[freqt2],      %[freqt2]   \n\t"
-      "dpaq_s.w.ph    $ac3,           %[freqt3],      %[freqt3]   \n\t"
-      "addiu          %[freqp],       %[freqp],       16          \n\t"
-      "addiu          %[freqabsp],    %[freqabsp],    8           \n\t"
-      "extr.w         %[tmp32no20],   $ac0,           1           \n\t"
-      "extr.w         %[tmp32no21],   $ac1,           1           \n\t"
-      "extr.w         %[tmp32no22],   $ac2,           1           \n\t"
-      "extr.w         %[tmp32no23],   $ac3,           1           \n\t"
-      : [freqt0] "=&r" (freqt0), [freqt1] "=&r" (freqt1),
-        [freqt2] "=&r" (freqt2), [freqt3] "=&r" (freqt3),
-        [tmp32no20] "=r" (tmp32no20), [tmp32no21] "=r" (tmp32no21),
-        [tmp32no22] "=r" (tmp32no22), [tmp32no23] "=r" (tmp32no23),
-        [freqabsp] "+r" (freqabsp), [freqp] "+r" (freqp)
-      :
-      : "memory", "hi", "lo", "$ac1hi", "$ac1lo",
-        "$ac2hi", "$ac2lo", "$ac3hi", "$ac3lo"
-    );
-
-    tmp32no10 = WebRtcSpl_SqrtFloor(tmp32no20);
-    tmp32no11 = WebRtcSpl_SqrtFloor(tmp32no21);
-    tmp32no12 = WebRtcSpl_SqrtFloor(tmp32no22);
-    tmp32no13 = WebRtcSpl_SqrtFloor(tmp32no23);
-
-    __asm __volatile (
-      "sh             %[tmp32no10],   -8(%[freqabsp])                 \n\t"
-      "sh             %[tmp32no11],   -6(%[freqabsp])                 \n\t"
-      "sh             %[tmp32no12],   -4(%[freqabsp])                 \n\t"
-      "sh             %[tmp32no13],   -2(%[freqabsp])                 \n\t"
-      "addu           %[freqs],       %[freqs],       %[tmp32no10]    \n\t"
-      "addu           %[freqs],       %[freqs],       %[tmp32no11]    \n\t"
-      "addu           %[freqs],       %[freqs],       %[tmp32no12]    \n\t"
-      "addu           %[freqs],       %[freqs],       %[tmp32no13]    \n\t"
-      : [freqs] "+r" (freqs)
-      : [tmp32no10] "r" (tmp32no10), [tmp32no11] "r" (tmp32no11),
-        [tmp32no12] "r" (tmp32no12), [tmp32no13] "r" (tmp32no13),
-        [freqabsp] "r" (freqabsp)
-      : "memory"
-    );
-  }
-
-  (*freq_signal_sum_abs) = freqs;
-#endif
-
-  return time_signal_scaling;
-}
-
-int WebRtcAecm_ProcessBlock(AecmCore* aecm,
-                            const int16_t* farend,
-                            const int16_t* nearendNoisy,
-                            const int16_t* nearendClean,
-                            int16_t* output) {
-  int i;
-  uint32_t xfaSum;
-  uint32_t dfaNoisySum;
-  uint32_t dfaCleanSum;
-  uint32_t echoEst32Gained;
-  uint32_t tmpU32;
-  int32_t tmp32no1;
-
-  uint16_t xfa[PART_LEN1];
-  uint16_t dfaNoisy[PART_LEN1];
-  uint16_t dfaClean[PART_LEN1];
-  uint16_t* ptrDfaClean = dfaClean;
-  const uint16_t* far_spectrum_ptr = NULL;
-
-  // 32 byte aligned buffers (with +8 or +16).
-  int16_t fft_buf[PART_LEN4 + 2 + 16]; // +2 to make a loop safe.
-  int32_t echoEst32_buf[PART_LEN1 + 8];
-  int32_t dfw_buf[PART_LEN2 + 8];
-  int32_t efw_buf[PART_LEN2 + 8];
-
-  int16_t* fft = (int16_t*)(((uint32_t)fft_buf + 31) & ~ 31);
-  int32_t* echoEst32 = (int32_t*)(((uint32_t)echoEst32_buf + 31) & ~ 31);
-  ComplexInt16* dfw = (ComplexInt16*)(((uint32_t)dfw_buf + 31) & ~31);
-  ComplexInt16* efw = (ComplexInt16*)(((uint32_t)efw_buf + 31) & ~31);
-
-  int16_t hnl[PART_LEN1];
-  int16_t numPosCoef = 0;
-  int delay;
-  int16_t tmp16no1;
-  int16_t tmp16no2;
-  int16_t mu;
-  int16_t supGain;
-  int16_t zeros32, zeros16;
-  int16_t zerosDBufNoisy, zerosDBufClean, zerosXBuf;
-  int far_q;
-  int16_t resolutionDiff, qDomainDiff, dfa_clean_q_domain_diff;
-
-  const int kMinPrefBand = 4;
-  const int kMaxPrefBand = 24;
-  int32_t avgHnl32 = 0;
-
-  int32_t temp1, temp2, temp3, temp4, temp5, temp6, temp7, temp8;
-  int16_t* ptr;
-  int16_t* ptr1;
-  int16_t* er_ptr;
-  int16_t* dr_ptr;
-
-  ptr = &hnl[0];
-  ptr1 = &hnl[0];
-  er_ptr = &efw[0].real;
-  dr_ptr = &dfw[0].real;
-
-  // Determine startup state. There are three states:
-  // (0) the first CONV_LEN blocks
-  // (1) another CONV_LEN blocks
-  // (2) the rest
-
-  if (aecm->startupState < 2) {
-    aecm->startupState = (aecm->totCount >= CONV_LEN) +
-                         (aecm->totCount >= CONV_LEN2);
-  }
-  // END: Determine startup state
-
-  // Buffer near and far end signals
-  memcpy(aecm->xBuf + PART_LEN, farend, sizeof(int16_t) * PART_LEN);
-  memcpy(aecm->dBufNoisy + PART_LEN,
-         nearendNoisy,
-         sizeof(int16_t) * PART_LEN);
-  if (nearendClean != NULL) {
-    memcpy(aecm->dBufClean + PART_LEN,
-           nearendClean,
-           sizeof(int16_t) * PART_LEN);
-  }
-
-  // Transform far end signal from time domain to frequency domain.
-  far_q = TimeToFrequencyDomain(aecm,
-                                aecm->xBuf,
-                                dfw,
-                                xfa,
-                                &xfaSum);
-
-  // Transform noisy near end signal from time domain to frequency domain.
-  zerosDBufNoisy = TimeToFrequencyDomain(aecm,
-                                         aecm->dBufNoisy,
-                                         dfw,
-                                         dfaNoisy,
-                                         &dfaNoisySum);
-  aecm->dfaNoisyQDomainOld = aecm->dfaNoisyQDomain;
-  aecm->dfaNoisyQDomain = (int16_t)zerosDBufNoisy;
-
-  if (nearendClean == NULL) {
-    ptrDfaClean = dfaNoisy;
-    aecm->dfaCleanQDomainOld = aecm->dfaNoisyQDomainOld;
-    aecm->dfaCleanQDomain = aecm->dfaNoisyQDomain;
-    dfaCleanSum = dfaNoisySum;
-  } else {
-    // Transform clean near end signal from time domain to frequency domain.
-    zerosDBufClean = TimeToFrequencyDomain(aecm,
-                                           aecm->dBufClean,
-                                           dfw,
-                                           dfaClean,
-                                           &dfaCleanSum);
-    aecm->dfaCleanQDomainOld = aecm->dfaCleanQDomain;
-    aecm->dfaCleanQDomain = (int16_t)zerosDBufClean;
-  }
-
-  // Get the delay
-  // Save far-end history and estimate delay
-  WebRtcAecm_UpdateFarHistory(aecm, xfa, far_q);
-
-  if (WebRtc_AddFarSpectrumFix(aecm->delay_estimator_farend, xfa, PART_LEN1,
-                               far_q) == -1) {
-    return -1;
-  }
-  delay = WebRtc_DelayEstimatorProcessFix(aecm->delay_estimator,
-                                          dfaNoisy,
-                                          PART_LEN1,
-                                          zerosDBufNoisy);
-  if (delay == -1) {
-    return -1;
-  }
-  else if (delay == -2) {
-    // If the delay is unknown, we assume zero.
-    // NOTE: this will have to be adjusted if we ever add lookahead.
-    delay = 0;
-  }
-
-  if (aecm->fixedDelay >= 0) {
-    // Use fixed delay
-    delay = aecm->fixedDelay;
-  }
-
-  // Get aligned far end spectrum
-  far_spectrum_ptr = WebRtcAecm_AlignedFarend(aecm, &far_q, delay);
-  zerosXBuf = (int16_t) far_q;
-
-  if (far_spectrum_ptr == NULL) {
-    return -1;
-  }
-
-  // Calculate log(energy) and update energy threshold levels
-  WebRtcAecm_CalcEnergies(aecm,
-                          far_spectrum_ptr,
-                          zerosXBuf,
-                          dfaNoisySum,
-                          echoEst32);
-  // Calculate stepsize
-  mu = WebRtcAecm_CalcStepSize(aecm);
-
-  // Update counters
-  aecm->totCount++;
-
-  // This is the channel estimation algorithm.
-  // It is base on NLMS but has a variable step length,
-  // which was calculated above.
-  WebRtcAecm_UpdateChannel(aecm,
-                           far_spectrum_ptr,
-                           zerosXBuf,
-                           dfaNoisy,
-                           mu,
-                           echoEst32);
-
-  supGain = WebRtcAecm_CalcSuppressionGain(aecm);
-
-  // Calculate Wiener filter hnl[]
-  for (i = 0; i < PART_LEN1; i++) {
-    // Far end signal through channel estimate in Q8
-    // How much can we shift right to preserve resolution
-    tmp32no1 = echoEst32[i] - aecm->echoFilt[i];
-    aecm->echoFilt[i] += (tmp32no1 * 50) >> 8;
-
-    zeros32 = WebRtcSpl_NormW32(aecm->echoFilt[i]) + 1;
-    zeros16 = WebRtcSpl_NormW16(supGain) + 1;
-    if (zeros32 + zeros16 > 16) {
-      // Multiplication is safe
-      // Result in
-      // Q(RESOLUTION_CHANNEL+RESOLUTION_SUPGAIN+aecm->xfaQDomainBuf[diff])
-      echoEst32Gained = WEBRTC_SPL_UMUL_32_16((uint32_t)aecm->echoFilt[i],
-                                              (uint16_t)supGain);
-      resolutionDiff = 14 - RESOLUTION_CHANNEL16 - RESOLUTION_SUPGAIN;
-      resolutionDiff += (aecm->dfaCleanQDomain - zerosXBuf);
-    } else {
-      tmp16no1 = 17 - zeros32 - zeros16;
-      resolutionDiff = 14 + tmp16no1 - RESOLUTION_CHANNEL16 -
-                       RESOLUTION_SUPGAIN;
-      resolutionDiff += (aecm->dfaCleanQDomain - zerosXBuf);
-      if (zeros32 > tmp16no1) {
-        echoEst32Gained = WEBRTC_SPL_UMUL_32_16(
-                            (uint32_t)aecm->echoFilt[i],
-                            supGain >> tmp16no1);
-      } else {
-        // Result in Q-(RESOLUTION_CHANNEL+RESOLUTION_SUPGAIN-16)
-        echoEst32Gained = (aecm->echoFilt[i] >> tmp16no1) * supGain;
-      }
-    }
-
-    zeros16 = WebRtcSpl_NormW16(aecm->nearFilt[i]);
-    RTC_DCHECK_GE(zeros16, 0);  // |zeros16| is a norm, hence non-negative.
-    dfa_clean_q_domain_diff = aecm->dfaCleanQDomain - aecm->dfaCleanQDomainOld;
-    if (zeros16 < dfa_clean_q_domain_diff && aecm->nearFilt[i]) {
-      tmp16no1 = aecm->nearFilt[i] << zeros16;
-      qDomainDiff = zeros16 - dfa_clean_q_domain_diff;
-      tmp16no2 = ptrDfaClean[i] >> -qDomainDiff;
-    } else {
-      tmp16no1 = dfa_clean_q_domain_diff < 0
-          ? aecm->nearFilt[i] >> -dfa_clean_q_domain_diff
-          : aecm->nearFilt[i] << dfa_clean_q_domain_diff;
-      qDomainDiff = 0;
-      tmp16no2 = ptrDfaClean[i];
-    }
-
-    tmp32no1 = (int32_t)(tmp16no2 - tmp16no1);
-    tmp16no2 = (int16_t)(tmp32no1 >> 4);
-    tmp16no2 += tmp16no1;
-    zeros16 = WebRtcSpl_NormW16(tmp16no2);
-    if ((tmp16no2) & (-qDomainDiff > zeros16)) {
-      aecm->nearFilt[i] = WEBRTC_SPL_WORD16_MAX;
-    } else {
-      aecm->nearFilt[i] = qDomainDiff < 0 ? tmp16no2 << -qDomainDiff
-                                          : tmp16no2 >> qDomainDiff;
-    }
-
-    // Wiener filter coefficients, resulting hnl in Q14
-    if (echoEst32Gained == 0) {
-      hnl[i] = ONE_Q14;
-      numPosCoef++;
-    } else if (aecm->nearFilt[i] == 0) {
-      hnl[i] = 0;
-    } else {
-      // Multiply the suppression gain
-      // Rounding
-      echoEst32Gained += (uint32_t)(aecm->nearFilt[i] >> 1);
-      tmpU32 = WebRtcSpl_DivU32U16(echoEst32Gained,
-                                   (uint16_t)aecm->nearFilt[i]);
-
-      // Current resolution is
-      // Q-(RESOLUTION_CHANNEL + RESOLUTION_SUPGAIN
-      //    - max(0, 17 - zeros16 - zeros32))
-      // Make sure we are in Q14
-      tmp32no1 = (int32_t)WEBRTC_SPL_SHIFT_W32(tmpU32, resolutionDiff);
-      if (tmp32no1 > ONE_Q14) {
-        hnl[i] = 0;
-      } else if (tmp32no1 < 0) {
-        hnl[i] = ONE_Q14;
-        numPosCoef++;
-      } else {
-        // 1-echoEst/dfa
-        hnl[i] = ONE_Q14 - (int16_t)tmp32no1;
-        if (hnl[i] <= 0) {
-          hnl[i] = 0;
-        } else {
-          numPosCoef++;
-        }
-      }
-    }
-  }
-
-  // Only in wideband. Prevent the gain in upper band from being larger than
-  // in lower band.
-  if (aecm->mult == 2) {
-    // TODO(bjornv): Investigate if the scaling of hnl[i] below can cause
-    //               speech distortion in double-talk.
-    for (i = 0; i < (PART_LEN1 >> 3); i++) {
-      __asm __volatile (
-        "lh         %[temp1],       0(%[ptr1])                  \n\t"
-        "lh         %[temp2],       2(%[ptr1])                  \n\t"
-        "lh         %[temp3],       4(%[ptr1])                  \n\t"
-        "lh         %[temp4],       6(%[ptr1])                  \n\t"
-        "lh         %[temp5],       8(%[ptr1])                  \n\t"
-        "lh         %[temp6],       10(%[ptr1])                 \n\t"
-        "lh         %[temp7],       12(%[ptr1])                 \n\t"
-        "lh         %[temp8],       14(%[ptr1])                 \n\t"
-        "mul        %[temp1],       %[temp1],       %[temp1]    \n\t"
-        "mul        %[temp2],       %[temp2],       %[temp2]    \n\t"
-        "mul        %[temp3],       %[temp3],       %[temp3]    \n\t"
-        "mul        %[temp4],       %[temp4],       %[temp4]    \n\t"
-        "mul        %[temp5],       %[temp5],       %[temp5]    \n\t"
-        "mul        %[temp6],       %[temp6],       %[temp6]    \n\t"
-        "mul        %[temp7],       %[temp7],       %[temp7]    \n\t"
-        "mul        %[temp8],       %[temp8],       %[temp8]    \n\t"
-        "sra        %[temp1],       %[temp1],       14          \n\t"
-        "sra        %[temp2],       %[temp2],       14          \n\t"
-        "sra        %[temp3],       %[temp3],       14          \n\t"
-        "sra        %[temp4],       %[temp4],       14          \n\t"
-        "sra        %[temp5],       %[temp5],       14          \n\t"
-        "sra        %[temp6],       %[temp6],       14          \n\t"
-        "sra        %[temp7],       %[temp7],       14          \n\t"
-        "sra        %[temp8],       %[temp8],       14          \n\t"
-        "sh         %[temp1],       0(%[ptr1])                  \n\t"
-        "sh         %[temp2],       2(%[ptr1])                  \n\t"
-        "sh         %[temp3],       4(%[ptr1])                  \n\t"
-        "sh         %[temp4],       6(%[ptr1])                  \n\t"
-        "sh         %[temp5],       8(%[ptr1])                  \n\t"
-        "sh         %[temp6],       10(%[ptr1])                 \n\t"
-        "sh         %[temp7],       12(%[ptr1])                 \n\t"
-        "sh         %[temp8],       14(%[ptr1])                 \n\t"
-        "addiu      %[ptr1],        %[ptr1],        16          \n\t"
-        : [temp1] "=&r" (temp1), [temp2] "=&r" (temp2), [temp3] "=&r" (temp3),
-          [temp4] "=&r" (temp4), [temp5] "=&r" (temp5), [temp6] "=&r" (temp6),
-          [temp7] "=&r" (temp7), [temp8] "=&r" (temp8), [ptr1] "+r" (ptr1)
-        :
-        : "memory", "hi", "lo"
-      );
-    }
-    for(i = 0; i < (PART_LEN1 & 7); i++) {
-      __asm __volatile (
-        "lh         %[temp1],       0(%[ptr1])                  \n\t"
-        "mul        %[temp1],       %[temp1],       %[temp1]    \n\t"
-        "sra        %[temp1],       %[temp1],       14          \n\t"
-        "sh         %[temp1],       0(%[ptr1])                  \n\t"
-        "addiu      %[ptr1],        %[ptr1],        2           \n\t"
-        : [temp1] "=&r" (temp1), [ptr1] "+r" (ptr1)
-        :
-        : "memory", "hi", "lo"
-      );
-    }
-
-    for (i = kMinPrefBand; i <= kMaxPrefBand; i++) {
-      avgHnl32 += (int32_t)hnl[i];
-    }
-
-    RTC_DCHECK_GT(kMaxPrefBand - kMinPrefBand + 1, 0);
-    avgHnl32 /= (kMaxPrefBand - kMinPrefBand + 1);
-
-    for (i = kMaxPrefBand; i < PART_LEN1; i++) {
-      if (hnl[i] > (int16_t)avgHnl32) {
-        hnl[i] = (int16_t)avgHnl32;
-      }
-    }
-  }
-
-  // Calculate NLP gain, result is in Q14
-  if (aecm->nlpFlag) {
-    if (numPosCoef < 3) {
-      for (i = 0; i < PART_LEN1; i++) {
-        efw[i].real = 0;
-        efw[i].imag = 0;
-        hnl[i] = 0;
-      }
-    } else {
-      for (i = 0; i < PART_LEN1; i++) {
-#if defined(MIPS_DSP_R1_LE)
-        __asm __volatile (
-          ".set       push                                        \n\t"
-          ".set       noreorder                                   \n\t"
-          "lh         %[temp1],       0(%[ptr])                   \n\t"
-          "lh         %[temp2],       0(%[dr_ptr])                \n\t"
-          "slti       %[temp4],       %[temp1],       0x4001      \n\t"
-          "beqz       %[temp4],       3f                          \n\t"
-          " lh        %[temp3],       2(%[dr_ptr])                \n\t"
-          "slti       %[temp5],       %[temp1],       3277        \n\t"
-          "bnez       %[temp5],       2f                          \n\t"
-          " addiu     %[dr_ptr],      %[dr_ptr],      4           \n\t"
-          "mul        %[temp2],       %[temp2],       %[temp1]    \n\t"
-          "mul        %[temp3],       %[temp3],       %[temp1]    \n\t"
-          "shra_r.w   %[temp2],       %[temp2],       14          \n\t"
-          "shra_r.w   %[temp3],       %[temp3],       14          \n\t"
-          "b          4f                                          \n\t"
-          " nop                                                   \n\t"
-         "2:                                                      \n\t"
-          "addu       %[temp1],       $zero,          $zero       \n\t"
-          "addu       %[temp2],       $zero,          $zero       \n\t"
-          "addu       %[temp3],       $zero,          $zero       \n\t"
-          "b          1f                                          \n\t"
-          " nop                                                   \n\t"
-         "3:                                                      \n\t"
-          "addiu      %[temp1],       $0,             0x4000      \n\t"
-         "1:                                                      \n\t"
-          "sh         %[temp1],       0(%[ptr])                   \n\t"
-         "4:                                                      \n\t"
-          "sh         %[temp2],       0(%[er_ptr])                \n\t"
-          "sh         %[temp3],       2(%[er_ptr])                \n\t"
-          "addiu      %[ptr],         %[ptr],         2           \n\t"
-          "addiu      %[er_ptr],      %[er_ptr],      4           \n\t"
-          ".set       pop                                         \n\t"
-          : [temp1] "=&r" (temp1), [temp2] "=&r" (temp2), [temp3] "=&r" (temp3),
-            [temp4] "=&r" (temp4), [temp5] "=&r" (temp5), [ptr] "+r" (ptr),
-            [er_ptr] "+r" (er_ptr), [dr_ptr] "+r" (dr_ptr)
-          :
-          : "memory", "hi", "lo"
-        );
-#else
-        __asm __volatile (
-          ".set       push                                        \n\t"
-          ".set       noreorder                                   \n\t"
-          "lh         %[temp1],       0(%[ptr])                   \n\t"
-          "lh         %[temp2],       0(%[dr_ptr])                \n\t"
-          "slti       %[temp4],       %[temp1],       0x4001      \n\t"
-          "beqz       %[temp4],       3f                          \n\t"
-          " lh        %[temp3],       2(%[dr_ptr])                \n\t"
-          "slti       %[temp5],       %[temp1],       3277        \n\t"
-          "bnez       %[temp5],       2f                          \n\t"
-          " addiu     %[dr_ptr],      %[dr_ptr],      4           \n\t"
-          "mul        %[temp2],       %[temp2],       %[temp1]    \n\t"
-          "mul        %[temp3],       %[temp3],       %[temp1]    \n\t"
-          "addiu      %[temp2],       %[temp2],       0x2000      \n\t"
-          "addiu      %[temp3],       %[temp3],       0x2000      \n\t"
-          "sra        %[temp2],       %[temp2],       14          \n\t"
-          "sra        %[temp3],       %[temp3],       14          \n\t"
-          "b          4f                                          \n\t"
-          " nop                                                   \n\t"
-         "2:                                                      \n\t"
-          "addu       %[temp1],       $zero,          $zero       \n\t"
-          "addu       %[temp2],       $zero,          $zero       \n\t"
-          "addu       %[temp3],       $zero,          $zero       \n\t"
-          "b          1f                                          \n\t"
-          " nop                                                   \n\t"
-         "3:                                                      \n\t"
-          "addiu      %[temp1],       $0,             0x4000      \n\t"
-         "1:                                                      \n\t"
-          "sh         %[temp1],       0(%[ptr])                   \n\t"
-         "4:                                                      \n\t"
-          "sh         %[temp2],       0(%[er_ptr])                \n\t"
-          "sh         %[temp3],       2(%[er_ptr])                \n\t"
-          "addiu      %[ptr],         %[ptr],         2           \n\t"
-          "addiu      %[er_ptr],      %[er_ptr],      4           \n\t"
-          ".set       pop                                         \n\t"
-          : [temp1] "=&r" (temp1), [temp2] "=&r" (temp2), [temp3] "=&r" (temp3),
-            [temp4] "=&r" (temp4), [temp5] "=&r" (temp5), [ptr] "+r" (ptr),
-            [er_ptr] "+r" (er_ptr), [dr_ptr] "+r" (dr_ptr)
-          :
-          : "memory", "hi", "lo"
-        );
-#endif
-      }
-    }
-  }
-  else {
-    // multiply with Wiener coefficients
-    for (i = 0; i < PART_LEN1; i++) {
-      efw[i].real = (int16_t)
-                      (WEBRTC_SPL_MUL_16_16_RSFT_WITH_ROUND(dfw[i].real,
-                                                            hnl[i],
-                                                            14));
-      efw[i].imag = (int16_t)
-                      (WEBRTC_SPL_MUL_16_16_RSFT_WITH_ROUND(dfw[i].imag,
-                                                            hnl[i],
-                                                            14));
-    }
-  }
-
-  if (aecm->cngMode == AecmTrue) {
-    ComfortNoise(aecm, ptrDfaClean, efw, hnl);
-  }
-
-  InverseFFTAndWindow(aecm, fft, efw, output, nearendClean);
-
-  return 0;
-}
-
-// Generate comfort noise and add to output signal.
-static void ComfortNoise(AecmCore* aecm,
-                         const uint16_t* dfa,
-                         ComplexInt16* out,
-                         const int16_t* lambda) {
-  int16_t i;
-  int16_t tmp16, tmp161, tmp162, tmp163, nrsh1, nrsh2;
-  int32_t tmp32, tmp321, tnoise, tnoise1;
-  int32_t tmp322, tmp323, *tmp1;
-  int16_t* dfap;
-  int16_t* lambdap;
-  const int32_t c2049 = 2049;
-  const int32_t c359 = 359;
-  const int32_t c114 = ONE_Q14;
-
-  int16_t randW16[PART_LEN];
-  int16_t uReal[PART_LEN1];
-  int16_t uImag[PART_LEN1];
-  int32_t outLShift32;
-
-  int16_t shiftFromNearToNoise = kNoiseEstQDomain - aecm->dfaCleanQDomain;
-  int16_t minTrackShift = 9;
-
-  RTC_DCHECK_GE(shiftFromNearToNoise, 0);
-  RTC_DCHECK_LT(shiftFromNearToNoise, 16);
-
-  if (aecm->noiseEstCtr < 100) {
-    // Track the minimum more quickly initially.
-    aecm->noiseEstCtr++;
-    minTrackShift = 6;
-  }
-
-  // Generate a uniform random array on [0 2^15-1].
-  WebRtcSpl_RandUArray(randW16, PART_LEN, &aecm->seed);
-  int16_t* randW16p = (int16_t*)randW16;
-#if defined (MIPS_DSP_R1_LE)
-  int16_t* kCosTablep = (int16_t*)WebRtcAecm_kCosTable;
-  int16_t* kSinTablep = (int16_t*)WebRtcAecm_kSinTable;
-#endif   // #if defined(MIPS_DSP_R1_LE)
-  tmp1 = (int32_t*)aecm->noiseEst + 1;
-  dfap = (int16_t*)dfa + 1;
-  lambdap = (int16_t*)lambda + 1;
-  // Estimate noise power.
-  for (i = 1; i < PART_LEN1; i+=2) {
-  // Shift to the noise domain.
-    __asm __volatile (
-      "lh     %[tmp32],       0(%[dfap])                              \n\t"
-      "lw     %[tnoise],      0(%[tmp1])                              \n\t"
-      "sllv   %[outLShift32], %[tmp32],   %[shiftFromNearToNoise]     \n\t"
-      : [tmp32] "=&r" (tmp32), [outLShift32] "=r" (outLShift32),
-        [tnoise] "=&r" (tnoise)
-      : [tmp1] "r" (tmp1), [dfap] "r" (dfap),
-        [shiftFromNearToNoise] "r" (shiftFromNearToNoise)
-      : "memory"
-    );
-
-    if (outLShift32 < tnoise) {
-      // Reset "too low" counter
-      aecm->noiseEstTooLowCtr[i] = 0;
-      // Track the minimum.
-      if (tnoise < (1 << minTrackShift)) {
-        // For small values, decrease noiseEst[i] every
-        // |kNoiseEstIncCount| block. The regular approach below can not
-        // go further down due to truncation.
-        aecm->noiseEstTooHighCtr[i]++;
-        if (aecm->noiseEstTooHighCtr[i] >= kNoiseEstIncCount) {
-          tnoise--;
-          aecm->noiseEstTooHighCtr[i] = 0;  // Reset the counter
-        }
-      } else {
-        __asm __volatile (
-          "subu   %[tmp32],       %[tnoise],      %[outLShift32]      \n\t"
-          "srav   %[tmp32],       %[tmp32],       %[minTrackShift]    \n\t"
-          "subu   %[tnoise],      %[tnoise],      %[tmp32]            \n\t"
-          : [tmp32] "=&r" (tmp32), [tnoise] "+r" (tnoise)
-          : [outLShift32] "r" (outLShift32), [minTrackShift] "r" (minTrackShift)
-        );
-      }
-    } else {
-      // Reset "too high" counter
-      aecm->noiseEstTooHighCtr[i] = 0;
-      // Ramp slowly upwards until we hit the minimum again.
-      if ((tnoise >> 19) <= 0) {
-        if ((tnoise >> 11) > 0) {
-          // Large enough for relative increase
-          __asm __volatile (
-            "mul    %[tnoise],  %[tnoise],  %[c2049]    \n\t"
-            "sra    %[tnoise],  %[tnoise],  11          \n\t"
-            : [tnoise] "+r" (tnoise)
-            : [c2049] "r" (c2049)
-            : "hi", "lo"
-          );
-        } else {
-          // Make incremental increases based on size every
-          // |kNoiseEstIncCount| block
-          aecm->noiseEstTooLowCtr[i]++;
-          if (aecm->noiseEstTooLowCtr[i] >= kNoiseEstIncCount) {
-            __asm __volatile (
-              "sra    %[tmp32],   %[tnoise],  9           \n\t"
-              "addi   %[tnoise],  %[tnoise],  1           \n\t"
-              "addu   %[tnoise],  %[tnoise],  %[tmp32]    \n\t"
-              : [tnoise] "+r" (tnoise), [tmp32] "=&r" (tmp32)
-              :
-            );
-            aecm->noiseEstTooLowCtr[i] = 0; // Reset counter
-          }
-        }
-      } else {
-        // Avoid overflow.
-        // Multiplication with 2049 will cause wrap around. Scale
-        // down first and then multiply
-        __asm __volatile (
-          "sra    %[tnoise],  %[tnoise],  11          \n\t"
-          "mul    %[tnoise],  %[tnoise],  %[c2049]    \n\t"
-          : [tnoise] "+r" (tnoise)
-          : [c2049] "r" (c2049)
-          : "hi", "lo"
-        );
-      }
-    }
-
-    // Shift to the noise domain.
-    __asm __volatile (
-      "lh     %[tmp32],       2(%[dfap])                              \n\t"
-      "lw     %[tnoise1],     4(%[tmp1])                              \n\t"
-      "addiu  %[dfap],        %[dfap],    4                           \n\t"
-      "sllv   %[outLShift32], %[tmp32],   %[shiftFromNearToNoise]     \n\t"
-      : [tmp32] "=&r" (tmp32), [dfap] "+r" (dfap),
-        [outLShift32] "=r" (outLShift32), [tnoise1] "=&r" (tnoise1)
-      : [tmp1] "r" (tmp1), [shiftFromNearToNoise] "r" (shiftFromNearToNoise)
-      : "memory"
-    );
-
-    if (outLShift32 < tnoise1) {
-      // Reset "too low" counter
-      aecm->noiseEstTooLowCtr[i + 1] = 0;
-      // Track the minimum.
-      if (tnoise1 < (1 << minTrackShift)) {
-        // For small values, decrease noiseEst[i] every
-        // |kNoiseEstIncCount| block. The regular approach below can not
-        // go further down due to truncation.
-        aecm->noiseEstTooHighCtr[i + 1]++;
-        if (aecm->noiseEstTooHighCtr[i + 1] >= kNoiseEstIncCount) {
-          tnoise1--;
-          aecm->noiseEstTooHighCtr[i + 1] = 0; // Reset the counter
-        }
-      } else {
-        __asm __volatile (
-          "subu   %[tmp32],       %[tnoise1],     %[outLShift32]      \n\t"
-          "srav   %[tmp32],       %[tmp32],       %[minTrackShift]    \n\t"
-          "subu   %[tnoise1],     %[tnoise1],     %[tmp32]            \n\t"
-          : [tmp32] "=&r" (tmp32), [tnoise1] "+r" (tnoise1)
-          : [outLShift32] "r" (outLShift32), [minTrackShift] "r" (minTrackShift)
-        );
-      }
-    } else {
-      // Reset "too high" counter
-      aecm->noiseEstTooHighCtr[i + 1] = 0;
-      // Ramp slowly upwards until we hit the minimum again.
-      if ((tnoise1 >> 19) <= 0) {
-        if ((tnoise1 >> 11) > 0) {
-          // Large enough for relative increase
-          __asm __volatile (
-            "mul    %[tnoise1], %[tnoise1], %[c2049]   \n\t"
-            "sra    %[tnoise1], %[tnoise1], 11         \n\t"
-            : [tnoise1] "+r" (tnoise1)
-            : [c2049] "r" (c2049)
-            : "hi", "lo"
-          );
-        } else {
-          // Make incremental increases based on size every
-          // |kNoiseEstIncCount| block
-          aecm->noiseEstTooLowCtr[i + 1]++;
-          if (aecm->noiseEstTooLowCtr[i + 1] >= kNoiseEstIncCount) {
-            __asm __volatile (
-              "sra    %[tmp32],   %[tnoise1], 9           \n\t"
-              "addi   %[tnoise1], %[tnoise1], 1           \n\t"
-              "addu   %[tnoise1], %[tnoise1], %[tmp32]    \n\t"
-              : [tnoise1] "+r" (tnoise1), [tmp32] "=&r" (tmp32)
-              :
-            );
-            aecm->noiseEstTooLowCtr[i + 1] = 0; // Reset counter
-          }
-        }
-      } else {
-        // Avoid overflow.
-        // Multiplication with 2049 will cause wrap around. Scale
-        // down first and then multiply
-        __asm __volatile (
-          "sra    %[tnoise1], %[tnoise1], 11          \n\t"
-          "mul    %[tnoise1], %[tnoise1], %[c2049]    \n\t"
-          : [tnoise1] "+r" (tnoise1)
-          : [c2049] "r" (c2049)
-          : "hi", "lo"
-        );
-      }
-    }
-
-    __asm __volatile (
-      "lh     %[tmp16],   0(%[lambdap])                           \n\t"
-      "lh     %[tmp161],  2(%[lambdap])                           \n\t"
-      "sw     %[tnoise],  0(%[tmp1])                              \n\t"
-      "sw     %[tnoise1], 4(%[tmp1])                              \n\t"
-      "subu   %[tmp16],   %[c114],        %[tmp16]                \n\t"
-      "subu   %[tmp161],  %[c114],        %[tmp161]               \n\t"
-      "srav   %[tmp32],   %[tnoise],      %[shiftFromNearToNoise] \n\t"
-      "srav   %[tmp321],  %[tnoise1],     %[shiftFromNearToNoise] \n\t"
-      "addiu  %[lambdap], %[lambdap],     4                       \n\t"
-      "addiu  %[tmp1],    %[tmp1],        8                       \n\t"
-      : [tmp16] "=&r" (tmp16), [tmp161] "=&r" (tmp161), [tmp1] "+r" (tmp1),
-        [tmp32] "=&r" (tmp32), [tmp321] "=&r" (tmp321), [lambdap] "+r" (lambdap)
-      : [tnoise] "r" (tnoise), [tnoise1] "r" (tnoise1), [c114] "r" (c114),
-        [shiftFromNearToNoise] "r" (shiftFromNearToNoise)
-      : "memory"
-    );
-
-    if (tmp32 > 32767) {
-      tmp32 = 32767;
-      aecm->noiseEst[i] = tmp32 << shiftFromNearToNoise;
-    }
-    if (tmp321 > 32767) {
-      tmp321 = 32767;
-      aecm->noiseEst[i+1] = tmp321 << shiftFromNearToNoise;
-    }
-
-    __asm __volatile (
-      "mul    %[tmp32],   %[tmp32],       %[tmp16]                \n\t"
-      "mul    %[tmp321],  %[tmp321],      %[tmp161]               \n\t"
-      "sra    %[nrsh1],   %[tmp32],       14                      \n\t"
-      "sra    %[nrsh2],   %[tmp321],      14                      \n\t"
-      : [nrsh1] "=&r" (nrsh1), [nrsh2] "=r" (nrsh2)
-      : [tmp16] "r" (tmp16), [tmp161] "r" (tmp161), [tmp32] "r" (tmp32),
-        [tmp321] "r" (tmp321)
-      : "memory", "hi", "lo"
-    );
-
-    __asm __volatile (
-      "lh     %[tmp32],       0(%[randW16p])              \n\t"
-      "lh     %[tmp321],      2(%[randW16p])              \n\t"
-      "addiu  %[randW16p],    %[randW16p],    4           \n\t"
-      "mul    %[tmp32],       %[tmp32],       %[c359]     \n\t"
-      "mul    %[tmp321],      %[tmp321],      %[c359]     \n\t"
-      "sra    %[tmp16],       %[tmp32],       15          \n\t"
-      "sra    %[tmp161],      %[tmp321],      15          \n\t"
-      : [randW16p] "+r" (randW16p), [tmp32] "=&r" (tmp32),
-        [tmp16] "=r" (tmp16), [tmp161] "=r" (tmp161), [tmp321] "=&r" (tmp321)
-      : [c359] "r" (c359)
-      : "memory", "hi", "lo"
-    );
-
-#if !defined(MIPS_DSP_R1_LE)
-    tmp32 = WebRtcAecm_kCosTable[tmp16];
-    tmp321 = WebRtcAecm_kSinTable[tmp16];
-    tmp322 = WebRtcAecm_kCosTable[tmp161];
-    tmp323 = WebRtcAecm_kSinTable[tmp161];
-#else
-    __asm __volatile (
-      "sll    %[tmp16],       %[tmp16],                   1           \n\t"
-      "sll    %[tmp161],      %[tmp161],                  1           \n\t"
-      "lhx    %[tmp32],       %[tmp16](%[kCosTablep])                 \n\t"
-      "lhx    %[tmp321],      %[tmp16](%[kSinTablep])                 \n\t"
-      "lhx    %[tmp322],      %[tmp161](%[kCosTablep])                \n\t"
-      "lhx    %[tmp323],      %[tmp161](%[kSinTablep])                \n\t"
-      : [tmp32] "=&r" (tmp32), [tmp321] "=&r" (tmp321),
-        [tmp322] "=&r" (tmp322), [tmp323] "=&r" (tmp323)
-      : [kCosTablep] "r" (kCosTablep), [tmp16] "r" (tmp16),
-        [tmp161] "r" (tmp161), [kSinTablep] "r" (kSinTablep)
-      : "memory"
-    );
-#endif
-    __asm __volatile (
-      "mul    %[tmp32],       %[tmp32],                   %[nrsh1]    \n\t"
-      "negu   %[tmp162],      %[nrsh1]                                \n\t"
-      "mul    %[tmp322],      %[tmp322],                  %[nrsh2]    \n\t"
-      "negu   %[tmp163],      %[nrsh2]                                \n\t"
-      "sra    %[tmp32],       %[tmp32],                   13          \n\t"
-      "mul    %[tmp321],      %[tmp321],                  %[tmp162]   \n\t"
-      "sra    %[tmp322],      %[tmp322],                  13          \n\t"
-      "mul    %[tmp323],      %[tmp323],                  %[tmp163]   \n\t"
-      "sra    %[tmp321],      %[tmp321],                  13          \n\t"
-      "sra    %[tmp323],      %[tmp323],                  13          \n\t"
-      : [tmp32] "+r" (tmp32), [tmp321] "+r" (tmp321), [tmp162] "=&r" (tmp162),
-        [tmp322] "+r" (tmp322), [tmp323] "+r" (tmp323), [tmp163] "=&r" (tmp163)
-      : [nrsh1] "r" (nrsh1), [nrsh2] "r" (nrsh2)
-      : "hi", "lo"
-    );
-    // Tables are in Q13.
-    uReal[i] = (int16_t)tmp32;
-    uImag[i] = (int16_t)tmp321;
-    uReal[i + 1] = (int16_t)tmp322;
-    uImag[i + 1] = (int16_t)tmp323;
-  }
-
-  int32_t tt, sgn;
-  tt = out[0].real;
-  sgn = ((int)tt) >> 31;
-  out[0].real = sgn == (int16_t)(tt >> 15) ? (int16_t)tt : (16384 ^ sgn);
-  tt = out[0].imag;
-  sgn = ((int)tt) >> 31;
-  out[0].imag = sgn == (int16_t)(tt >> 15) ? (int16_t)tt : (16384 ^ sgn);
-  for (i = 1; i < PART_LEN; i++) {
-    tt = out[i].real + uReal[i];
-    sgn = ((int)tt) >> 31;
-    out[i].real = sgn == (int16_t)(tt >> 15) ? (int16_t)tt : (16384 ^ sgn);
-    tt = out[i].imag + uImag[i];
-    sgn = ((int)tt) >> 31;
-    out[i].imag = sgn == (int16_t)(tt >> 15) ? (int16_t)tt : (16384 ^ sgn);
-  }
-  tt = out[PART_LEN].real + uReal[PART_LEN];
-  sgn = ((int)tt) >> 31;
-  out[PART_LEN].real = sgn == (int16_t)(tt >> 15) ? (int16_t)tt : (16384 ^ sgn);
-  tt = out[PART_LEN].imag;
-  sgn = ((int)tt) >> 31;
-  out[PART_LEN].imag = sgn == (int16_t)(tt >> 15) ? (int16_t)tt : (16384 ^ sgn);
-}
diff --git a/modules/audio_processing/aecm/aecm_core_neon.cc b/modules/audio_processing/aecm/aecm_core_neon.cc
deleted file mode 100644
index ccf1985..0000000
--- a/modules/audio_processing/aecm/aecm_core_neon.cc
+++ /dev/null
@@ -1,199 +0,0 @@
-/*
- *  Copyright (c) 2012 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_processing/aecm/aecm_core.h"
-
-#include <arm_neon.h>
-
-#include "webrtc/common_audio/signal_processing/include/real_fft.h"
-#include "webrtc/rtc_base/checks.h"
-
-// TODO(kma): Re-write the corresponding assembly file, the offset
-// generating script and makefile, to replace these C functions.
-
-static inline void AddLanes(uint32_t* ptr, uint32x4_t v) {
-#if defined(WEBRTC_ARCH_ARM64)
-  *(ptr) = vaddvq_u32(v);
-#else
-  uint32x2_t tmp_v;
-  tmp_v = vadd_u32(vget_low_u32(v), vget_high_u32(v));
-  tmp_v = vpadd_u32(tmp_v, tmp_v);
-  *(ptr) = vget_lane_u32(tmp_v, 0);
-#endif
-}
-
-void WebRtcAecm_CalcLinearEnergiesNeon(AecmCore* aecm,
-                                       const uint16_t* far_spectrum,
-                                       int32_t* echo_est,
-                                       uint32_t* far_energy,
-                                       uint32_t* echo_energy_adapt,
-                                       uint32_t* echo_energy_stored) {
-  int16_t* start_stored_p = aecm->channelStored;
-  int16_t* start_adapt_p = aecm->channelAdapt16;
-  int32_t* echo_est_p = echo_est;
-  const int16_t* end_stored_p = aecm->channelStored + PART_LEN;
-  const uint16_t* far_spectrum_p = far_spectrum;
-  int16x8_t store_v, adapt_v;
-  uint16x8_t spectrum_v;
-  uint32x4_t echo_est_v_low, echo_est_v_high;
-  uint32x4_t far_energy_v, echo_stored_v, echo_adapt_v;
-
-  far_energy_v = vdupq_n_u32(0);
-  echo_adapt_v = vdupq_n_u32(0);
-  echo_stored_v = vdupq_n_u32(0);
-
-  // Get energy for the delayed far end signal and estimated
-  // echo using both stored and adapted channels.
-  // The C code:
-  //  for (i = 0; i < PART_LEN1; i++) {
-  //      echo_est[i] = WEBRTC_SPL_MUL_16_U16(aecm->channelStored[i],
-  //                                         far_spectrum[i]);
-  //      (*far_energy) += (uint32_t)(far_spectrum[i]);
-  //      *echo_energy_adapt += aecm->channelAdapt16[i] * far_spectrum[i];
-  //      (*echo_energy_stored) += (uint32_t)echo_est[i];
-  //  }
-  while (start_stored_p < end_stored_p) {
-    spectrum_v = vld1q_u16(far_spectrum_p);
-    adapt_v = vld1q_s16(start_adapt_p);
-    store_v = vld1q_s16(start_stored_p);
-
-    far_energy_v = vaddw_u16(far_energy_v, vget_low_u16(spectrum_v));
-    far_energy_v = vaddw_u16(far_energy_v, vget_high_u16(spectrum_v));
-
-    echo_est_v_low = vmull_u16(vreinterpret_u16_s16(vget_low_s16(store_v)),
-                               vget_low_u16(spectrum_v));
-    echo_est_v_high = vmull_u16(vreinterpret_u16_s16(vget_high_s16(store_v)),
-                                vget_high_u16(spectrum_v));
-    vst1q_s32(echo_est_p, vreinterpretq_s32_u32(echo_est_v_low));
-    vst1q_s32(echo_est_p + 4, vreinterpretq_s32_u32(echo_est_v_high));
-
-    echo_stored_v = vaddq_u32(echo_est_v_low, echo_stored_v);
-    echo_stored_v = vaddq_u32(echo_est_v_high, echo_stored_v);
-
-    echo_adapt_v = vmlal_u16(echo_adapt_v,
-                             vreinterpret_u16_s16(vget_low_s16(adapt_v)),
-                             vget_low_u16(spectrum_v));
-    echo_adapt_v = vmlal_u16(echo_adapt_v,
-                             vreinterpret_u16_s16(vget_high_s16(adapt_v)),
-                             vget_high_u16(spectrum_v));
-
-    start_stored_p += 8;
-    start_adapt_p += 8;
-    far_spectrum_p += 8;
-    echo_est_p += 8;
-  }
-
-  AddLanes(far_energy, far_energy_v);
-  AddLanes(echo_energy_stored, echo_stored_v);
-  AddLanes(echo_energy_adapt, echo_adapt_v);
-
-  echo_est[PART_LEN] = WEBRTC_SPL_MUL_16_U16(aecm->channelStored[PART_LEN],
-                                             far_spectrum[PART_LEN]);
-  *echo_energy_stored += (uint32_t)echo_est[PART_LEN];
-  *far_energy += (uint32_t)far_spectrum[PART_LEN];
-  *echo_energy_adapt += aecm->channelAdapt16[PART_LEN] * far_spectrum[PART_LEN];
-}
-
-void WebRtcAecm_StoreAdaptiveChannelNeon(AecmCore* aecm,
-                                         const uint16_t* far_spectrum,
-                                         int32_t* echo_est) {
-  RTC_DCHECK_EQ(0, (uintptr_t)echo_est % 32);
-  RTC_DCHECK_EQ(0, (uintptr_t)aecm->channelStored % 16);
-  RTC_DCHECK_EQ(0, (uintptr_t)aecm->channelAdapt16 % 16);
-
-  // This is C code of following optimized code.
-  // During startup we store the channel every block.
-  //  memcpy(aecm->channelStored,
-  //         aecm->channelAdapt16,
-  //         sizeof(int16_t) * PART_LEN1);
-  // Recalculate echo estimate
-  //  for (i = 0; i < PART_LEN; i += 4) {
-  //    echo_est[i] = WEBRTC_SPL_MUL_16_U16(aecm->channelStored[i],
-  //                                        far_spectrum[i]);
-  //    echo_est[i + 1] = WEBRTC_SPL_MUL_16_U16(aecm->channelStored[i + 1],
-  //                                            far_spectrum[i + 1]);
-  //    echo_est[i + 2] = WEBRTC_SPL_MUL_16_U16(aecm->channelStored[i + 2],
-  //                                            far_spectrum[i + 2]);
-  //    echo_est[i + 3] = WEBRTC_SPL_MUL_16_U16(aecm->channelStored[i + 3],
-  //                                            far_spectrum[i + 3]);
-  //  }
-  //  echo_est[i] = WEBRTC_SPL_MUL_16_U16(aecm->channelStored[i],
-  //                                     far_spectrum[i]);
-  const uint16_t* far_spectrum_p = far_spectrum;
-  int16_t* start_adapt_p = aecm->channelAdapt16;
-  int16_t* start_stored_p = aecm->channelStored;
-  const int16_t* end_stored_p = aecm->channelStored + PART_LEN;
-  int32_t* echo_est_p = echo_est;
-
-  uint16x8_t far_spectrum_v;
-  int16x8_t adapt_v;
-  uint32x4_t echo_est_v_low, echo_est_v_high;
-
-  while (start_stored_p < end_stored_p) {
-    far_spectrum_v = vld1q_u16(far_spectrum_p);
-    adapt_v = vld1q_s16(start_adapt_p);
-
-    vst1q_s16(start_stored_p, adapt_v);
-
-    echo_est_v_low = vmull_u16(vget_low_u16(far_spectrum_v),
-                               vget_low_u16(vreinterpretq_u16_s16(adapt_v)));
-    echo_est_v_high = vmull_u16(vget_high_u16(far_spectrum_v),
-                                vget_high_u16(vreinterpretq_u16_s16(adapt_v)));
-
-    vst1q_s32(echo_est_p, vreinterpretq_s32_u32(echo_est_v_low));
-    vst1q_s32(echo_est_p + 4, vreinterpretq_s32_u32(echo_est_v_high));
-
-    far_spectrum_p += 8;
-    start_adapt_p += 8;
-    start_stored_p += 8;
-    echo_est_p += 8;
-  }
-  aecm->channelStored[PART_LEN] = aecm->channelAdapt16[PART_LEN];
-  echo_est[PART_LEN] = WEBRTC_SPL_MUL_16_U16(aecm->channelStored[PART_LEN],
-                                             far_spectrum[PART_LEN]);
-}
-
-void WebRtcAecm_ResetAdaptiveChannelNeon(AecmCore* aecm) {
-  RTC_DCHECK_EQ(0, (uintptr_t)aecm->channelStored % 16);
-  RTC_DCHECK_EQ(0, (uintptr_t)aecm->channelAdapt16 % 16);
-  RTC_DCHECK_EQ(0, (uintptr_t)aecm->channelAdapt32 % 32);
-
-  // The C code of following optimized code.
-  // for (i = 0; i < PART_LEN1; i++) {
-  //   aecm->channelAdapt16[i] = aecm->channelStored[i];
-  //   aecm->channelAdapt32[i] = WEBRTC_SPL_LSHIFT_W32(
-  //              (int32_t)aecm->channelStored[i], 16);
-  // }
-
-  int16_t* start_stored_p = aecm->channelStored;
-  int16_t* start_adapt16_p = aecm->channelAdapt16;
-  int32_t* start_adapt32_p = aecm->channelAdapt32;
-  const int16_t* end_stored_p = start_stored_p + PART_LEN;
-
-  int16x8_t stored_v;
-  int32x4_t adapt32_v_low, adapt32_v_high;
-
-  while (start_stored_p < end_stored_p) {
-    stored_v = vld1q_s16(start_stored_p);
-    vst1q_s16(start_adapt16_p, stored_v);
-
-    adapt32_v_low = vshll_n_s16(vget_low_s16(stored_v), 16);
-    adapt32_v_high = vshll_n_s16(vget_high_s16(stored_v), 16);
-
-    vst1q_s32(start_adapt32_p, adapt32_v_low);
-    vst1q_s32(start_adapt32_p + 4, adapt32_v_high);
-
-    start_stored_p += 8;
-    start_adapt16_p += 8;
-    start_adapt32_p += 8;
-  }
-  aecm->channelAdapt16[PART_LEN] = aecm->channelStored[PART_LEN];
-  aecm->channelAdapt32[PART_LEN] = (int32_t)aecm->channelStored[PART_LEN] << 16;
-}
diff --git a/modules/audio_processing/aecm/aecm_defines.h b/modules/audio_processing/aecm/aecm_defines.h
deleted file mode 100644
index 6d63990..0000000
--- a/modules/audio_processing/aecm/aecm_defines.h
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- *  Copyright (c) 2012 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_PROCESSING_AECM_AECM_DEFINES_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_AECM_AECM_DEFINES_H_
-
-#define AECM_DYNAMIC_Q                 /* Turn on/off dynamic Q-domain. */
-
-/* Algorithm parameters */
-#define FRAME_LEN       80             /* Total frame length, 10 ms. */
-
-#define PART_LEN        64             /* Length of partition. */
-#define PART_LEN_SHIFT  7              /* Length of (PART_LEN * 2) in base 2. */
-
-#define PART_LEN1       (PART_LEN + 1)  /* Unique fft coefficients. */
-#define PART_LEN2       (PART_LEN << 1) /* Length of partition * 2. */
-#define PART_LEN4       (PART_LEN << 2) /* Length of partition * 4. */
-#define FAR_BUF_LEN     PART_LEN4       /* Length of buffers. */
-#define MAX_DELAY       100
-
-/* Counter parameters */
-#define CONV_LEN        512          /* Convergence length used at startup. */
-#define CONV_LEN2       (CONV_LEN << 1) /* Used at startup. */
-
-/* Energy parameters */
-#define MAX_BUF_LEN     64           /* History length of energy signals. */
-#define FAR_ENERGY_MIN  1025         /* Lowest Far energy level: At least 2 */
-                                     /* in energy. */
-#define FAR_ENERGY_DIFF 929          /* Allowed difference between max */
-                                     /* and min. */
-#define ENERGY_DEV_OFFSET       0    /* The energy error offset in Q8. */
-#define ENERGY_DEV_TOL  400          /* The energy estimation tolerance (Q8). */
-#define FAR_ENERGY_VAD_REGION   230  /* Far VAD tolerance region. */
-
-/* Stepsize parameters */
-#define MU_MIN          10          /* Min stepsize 2^-MU_MIN (far end energy */
-                                    /* dependent). */
-#define MU_MAX          1           /* Max stepsize 2^-MU_MAX (far end energy */
-                                    /* dependent). */
-#define MU_DIFF         9           /* MU_MIN - MU_MAX */
-
-/* Channel parameters */
-#define MIN_MSE_COUNT   20 /* Min number of consecutive blocks with enough */
-                           /* far end energy to compare channel estimates. */
-#define MIN_MSE_DIFF    29 /* The ratio between adapted and stored channel to */
-                           /* accept a new storage (0.8 in Q-MSE_RESOLUTION). */
-#define MSE_RESOLUTION  5           /* MSE parameter resolution. */
-#define RESOLUTION_CHANNEL16    12  /* W16 Channel in Q-RESOLUTION_CHANNEL16. */
-#define RESOLUTION_CHANNEL32    28  /* W32 Channel in Q-RESOLUTION_CHANNEL. */
-#define CHANNEL_VAD     16          /* Minimum energy in frequency band */
-                                    /* to update channel. */
-
-/* Suppression gain parameters: SUPGAIN parameters in Q-(RESOLUTION_SUPGAIN). */
-#define RESOLUTION_SUPGAIN      8     /* Channel in Q-(RESOLUTION_SUPGAIN). */
-#define SUPGAIN_DEFAULT (1 << RESOLUTION_SUPGAIN)  /* Default. */
-#define SUPGAIN_ERROR_PARAM_A   3072  /* Estimation error parameter */
-                                      /* (Maximum gain) (8 in Q8). */
-#define SUPGAIN_ERROR_PARAM_B   1536  /* Estimation error parameter */
-                                      /* (Gain before going down). */
-#define SUPGAIN_ERROR_PARAM_D   SUPGAIN_DEFAULT /* Estimation error parameter */
-                                /* (Should be the same as Default) (1 in Q8). */
-#define SUPGAIN_EPC_DT  200     /* SUPGAIN_ERROR_PARAM_C * ENERGY_DEV_TOL */
-
-/* Defines for "check delay estimation" */
-#define CORR_WIDTH      31      /* Number of samples to correlate over. */
-#define CORR_MAX        16      /* Maximum correlation offset. */
-#define CORR_MAX_BUF    63
-#define CORR_DEV        4
-#define CORR_MAX_LEVEL  20
-#define CORR_MAX_LOW    4
-#define CORR_BUF_LEN    (CORR_MAX << 1) + 1
-/* Note that CORR_WIDTH + 2*CORR_MAX <= MAX_BUF_LEN. */
-
-#define ONE_Q14         (1 << 14)
-
-/* NLP defines */
-#define NLP_COMP_LOW    3277    /* 0.2 in Q14 */
-#define NLP_COMP_HIGH   ONE_Q14 /* 1 in Q14 */
-
-#endif
diff --git a/modules/audio_processing/aecm/echo_control_mobile.cc b/modules/audio_processing/aecm/echo_control_mobile.cc
deleted file mode 100644
index 027ed14..0000000
--- a/modules/audio_processing/aecm/echo_control_mobile.cc
+++ /dev/null
@@ -1,648 +0,0 @@
-/*
- *  Copyright (c) 2012 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_processing/aecm/echo_control_mobile.h"
-
-#ifdef AEC_DEBUG
-#include <stdio.h>
-#endif
-#include <stdlib.h>
-
-extern "C" {
-#include "webrtc/common_audio/ring_buffer.h"
-#include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
-}
-#include "webrtc/modules/audio_processing/aecm/aecm_core.h"
-
-#define BUF_SIZE_FRAMES 50 // buffer size (frames)
-// Maximum length of resampled signal. Must be an integer multiple of frames
-// (ceil(1/(1 + MIN_SKEW)*2) + 1)*FRAME_LEN
-// The factor of 2 handles wb, and the + 1 is as a safety margin
-#define MAX_RESAMP_LEN (5 * FRAME_LEN)
-
-static const size_t kBufSizeSamp = BUF_SIZE_FRAMES * FRAME_LEN; // buffer size (samples)
-static const int kSampMsNb = 8; // samples per ms in nb
-// Target suppression levels for nlp modes
-// log{0.001, 0.00001, 0.00000001}
-static const int kInitCheck = 42;
-
-typedef struct
-{
-    int sampFreq;
-    int scSampFreq;
-    short bufSizeStart;
-    int knownDelay;
-
-    // Stores the last frame added to the farend buffer
-    short farendOld[2][FRAME_LEN];
-    short initFlag; // indicates if AEC has been initialized
-
-    // Variables used for averaging far end buffer size
-    short counter;
-    short sum;
-    short firstVal;
-    short checkBufSizeCtr;
-
-    // Variables used for delay shifts
-    short msInSndCardBuf;
-    short filtDelay;
-    int timeForDelayChange;
-    int ECstartup;
-    int checkBuffSize;
-    int delayChange;
-    short lastDelayDiff;
-
-    int16_t echoMode;
-
-#ifdef AEC_DEBUG
-    FILE *bufFile;
-    FILE *delayFile;
-    FILE *preCompFile;
-    FILE *postCompFile;
-#endif // AEC_DEBUG
-    // Structures
-    RingBuffer *farendBuf;
-
-    AecmCore* aecmCore;
-} AecMobile;
-
-// Estimates delay to set the position of the farend buffer read pointer
-// (controlled by knownDelay)
-static int WebRtcAecm_EstBufDelay(AecMobile* aecm, short msInSndCardBuf);
-
-// Stuffs the farend buffer if the estimated delay is too large
-static int WebRtcAecm_DelayComp(AecMobile* aecm);
-
-void* WebRtcAecm_Create() {
-    AecMobile* aecm = static_cast<AecMobile*>(malloc(sizeof(AecMobile)));
-
-    WebRtcSpl_Init();
-
-    aecm->aecmCore = WebRtcAecm_CreateCore();
-    if (!aecm->aecmCore) {
-        WebRtcAecm_Free(aecm);
-        return NULL;
-    }
-
-    aecm->farendBuf = WebRtc_CreateBuffer(kBufSizeSamp,
-                                          sizeof(int16_t));
-    if (!aecm->farendBuf)
-    {
-        WebRtcAecm_Free(aecm);
-        return NULL;
-    }
-
-    aecm->initFlag = 0;
-
-#ifdef AEC_DEBUG
-    aecm->aecmCore->farFile = fopen("aecFar.pcm","wb");
-    aecm->aecmCore->nearFile = fopen("aecNear.pcm","wb");
-    aecm->aecmCore->outFile = fopen("aecOut.pcm","wb");
-    //aecm->aecmCore->outLpFile = fopen("aecOutLp.pcm","wb");
-
-    aecm->bufFile = fopen("aecBuf.dat", "wb");
-    aecm->delayFile = fopen("aecDelay.dat", "wb");
-    aecm->preCompFile = fopen("preComp.pcm", "wb");
-    aecm->postCompFile = fopen("postComp.pcm", "wb");
-#endif // AEC_DEBUG
-    return aecm;
-}
-
-void WebRtcAecm_Free(void* aecmInst) {
-  AecMobile* aecm = static_cast<AecMobile*>(aecmInst);
-
-    if (aecm == NULL) {
-      return;
-    }
-
-#ifdef AEC_DEBUG
-    fclose(aecm->aecmCore->farFile);
-    fclose(aecm->aecmCore->nearFile);
-    fclose(aecm->aecmCore->outFile);
-    //fclose(aecm->aecmCore->outLpFile);
-
-    fclose(aecm->bufFile);
-    fclose(aecm->delayFile);
-    fclose(aecm->preCompFile);
-    fclose(aecm->postCompFile);
-#endif // AEC_DEBUG
-    WebRtcAecm_FreeCore(aecm->aecmCore);
-    WebRtc_FreeBuffer(aecm->farendBuf);
-    free(aecm);
-}
-
-int32_t WebRtcAecm_Init(void *aecmInst, int32_t sampFreq)
-{
-    AecMobile* aecm = static_cast<AecMobile*>(aecmInst);
-    AecmConfig aecConfig;
-
-    if (aecm == NULL)
-    {
-        return -1;
-    }
-
-    if (sampFreq != 8000 && sampFreq != 16000)
-    {
-        return AECM_BAD_PARAMETER_ERROR;
-    }
-    aecm->sampFreq = sampFreq;
-
-    // Initialize AECM core
-    if (WebRtcAecm_InitCore(aecm->aecmCore, aecm->sampFreq) == -1)
-    {
-        return AECM_UNSPECIFIED_ERROR;
-    }
-
-    // Initialize farend buffer
-    WebRtc_InitBuffer(aecm->farendBuf);
-
-    aecm->initFlag = kInitCheck; // indicates that initialization has been done
-
-    aecm->delayChange = 1;
-
-    aecm->sum = 0;
-    aecm->counter = 0;
-    aecm->checkBuffSize = 1;
-    aecm->firstVal = 0;
-
-    aecm->ECstartup = 1;
-    aecm->bufSizeStart = 0;
-    aecm->checkBufSizeCtr = 0;
-    aecm->filtDelay = 0;
-    aecm->timeForDelayChange = 0;
-    aecm->knownDelay = 0;
-    aecm->lastDelayDiff = 0;
-
-    memset(&aecm->farendOld[0][0], 0, 160);
-
-    // Default settings.
-    aecConfig.cngMode = AecmTrue;
-    aecConfig.echoMode = 3;
-
-    if (WebRtcAecm_set_config(aecm, aecConfig) == -1)
-    {
-        return AECM_UNSPECIFIED_ERROR;
-    }
-
-    return 0;
-}
-
-// Returns any error that is caused when buffering the
-// farend signal.
-int32_t WebRtcAecm_GetBufferFarendError(void *aecmInst, const int16_t *farend,
-                                size_t nrOfSamples) {
-  AecMobile* aecm = static_cast<AecMobile*>(aecmInst);
-
-  if (aecm == NULL)
-    return -1;
-
-  if (farend == NULL)
-    return AECM_NULL_POINTER_ERROR;
-
-  if (aecm->initFlag != kInitCheck)
-    return AECM_UNINITIALIZED_ERROR;
-
-  if (nrOfSamples != 80 && nrOfSamples != 160)
-    return AECM_BAD_PARAMETER_ERROR;
-
-  return 0;
-}
-
-
-int32_t WebRtcAecm_BufferFarend(void *aecmInst, const int16_t *farend,
-                                size_t nrOfSamples) {
-  AecMobile* aecm = static_cast<AecMobile*>(aecmInst);
-
-  const int32_t err =
-      WebRtcAecm_GetBufferFarendError(aecmInst, farend, nrOfSamples);
-
-  if (err != 0)
-    return err;
-
-  // TODO(unknown): Is this really a good idea?
-  if (!aecm->ECstartup)
-  {
-    WebRtcAecm_DelayComp(aecm);
-  }
-
-  WebRtc_WriteBuffer(aecm->farendBuf, farend, nrOfSamples);
-
-  return 0;
-}
-
-int32_t WebRtcAecm_Process(void *aecmInst, const int16_t *nearendNoisy,
-                           const int16_t *nearendClean, int16_t *out,
-                           size_t nrOfSamples, int16_t msInSndCardBuf)
-{
-    AecMobile* aecm = static_cast<AecMobile*>(aecmInst);
-    int32_t retVal = 0;
-    size_t i;
-    short nmbrOfFilledBuffers;
-    size_t nBlocks10ms;
-    size_t nFrames;
-#ifdef AEC_DEBUG
-    short msInAECBuf;
-#endif
-
-    if (aecm == NULL)
-    {
-        return -1;
-    }
-
-    if (nearendNoisy == NULL)
-    {
-        return AECM_NULL_POINTER_ERROR;
-    }
-
-    if (out == NULL)
-    {
-        return AECM_NULL_POINTER_ERROR;
-    }
-
-    if (aecm->initFlag != kInitCheck)
-    {
-        return AECM_UNINITIALIZED_ERROR;
-    }
-
-    if (nrOfSamples != 80 && nrOfSamples != 160)
-    {
-        return AECM_BAD_PARAMETER_ERROR;
-    }
-
-    if (msInSndCardBuf < 0)
-    {
-        msInSndCardBuf = 0;
-        retVal = AECM_BAD_PARAMETER_WARNING;
-    } else if (msInSndCardBuf > 500)
-    {
-        msInSndCardBuf = 500;
-        retVal = AECM_BAD_PARAMETER_WARNING;
-    }
-    msInSndCardBuf += 10;
-    aecm->msInSndCardBuf = msInSndCardBuf;
-
-    nFrames = nrOfSamples / FRAME_LEN;
-    nBlocks10ms = nFrames / aecm->aecmCore->mult;
-
-    if (aecm->ECstartup)
-    {
-        if (nearendClean == NULL)
-        {
-            if (out != nearendNoisy)
-            {
-                memcpy(out, nearendNoisy, sizeof(short) * nrOfSamples);
-            }
-        } else if (out != nearendClean)
-        {
-            memcpy(out, nearendClean, sizeof(short) * nrOfSamples);
-        }
-
-        nmbrOfFilledBuffers =
-            (short) WebRtc_available_read(aecm->farendBuf) / FRAME_LEN;
-        // The AECM is in the start up mode
-        // AECM is disabled until the soundcard buffer and farend buffers are OK
-
-        // Mechanism to ensure that the soundcard buffer is reasonably stable.
-        if (aecm->checkBuffSize)
-        {
-            aecm->checkBufSizeCtr++;
-            // Before we fill up the far end buffer we require the amount of data on the
-            // sound card to be stable (+/-8 ms) compared to the first value. This
-            // comparison is made during the following 4 consecutive frames. If it seems
-            // to be stable then we start to fill up the far end buffer.
-
-            if (aecm->counter == 0)
-            {
-                aecm->firstVal = aecm->msInSndCardBuf;
-                aecm->sum = 0;
-            }
-
-            if (abs(aecm->firstVal - aecm->msInSndCardBuf)
-                    < WEBRTC_SPL_MAX(0.2 * aecm->msInSndCardBuf, kSampMsNb))
-            {
-                aecm->sum += aecm->msInSndCardBuf;
-                aecm->counter++;
-            } else
-            {
-                aecm->counter = 0;
-            }
-
-            if (aecm->counter * nBlocks10ms >= 6)
-            {
-                // The farend buffer size is determined in blocks of 80 samples
-                // Use 75% of the average value of the soundcard buffer
-                aecm->bufSizeStart
-                        = WEBRTC_SPL_MIN((3 * aecm->sum
-                                        * aecm->aecmCore->mult) / (aecm->counter * 40), BUF_SIZE_FRAMES);
-                // buffersize has now been determined
-                aecm->checkBuffSize = 0;
-            }
-
-            if (aecm->checkBufSizeCtr * nBlocks10ms > 50)
-            {
-                // for really bad sound cards, don't disable echocanceller for more than 0.5 sec
-                aecm->bufSizeStart = WEBRTC_SPL_MIN((3 * aecm->msInSndCardBuf
-                                * aecm->aecmCore->mult) / 40, BUF_SIZE_FRAMES);
-                aecm->checkBuffSize = 0;
-            }
-        }
-
-        // if checkBuffSize changed in the if-statement above
-        if (!aecm->checkBuffSize)
-        {
-            // soundcard buffer is now reasonably stable
-            // When the far end buffer is filled with approximately the same amount of
-            // data as the amount on the sound card we end the start up phase and start
-            // to cancel echoes.
-
-            if (nmbrOfFilledBuffers == aecm->bufSizeStart)
-            {
-                aecm->ECstartup = 0; // Enable the AECM
-            } else if (nmbrOfFilledBuffers > aecm->bufSizeStart)
-            {
-                WebRtc_MoveReadPtr(aecm->farendBuf,
-                                   (int) WebRtc_available_read(aecm->farendBuf)
-                                   - (int) aecm->bufSizeStart * FRAME_LEN);
-                aecm->ECstartup = 0;
-            }
-        }
-
-    } else
-    {
-        // AECM is enabled
-
-        // Note only 1 block supported for nb and 2 blocks for wb
-        for (i = 0; i < nFrames; i++)
-        {
-            int16_t farend[FRAME_LEN];
-            const int16_t* farend_ptr = NULL;
-
-            nmbrOfFilledBuffers =
-                (short) WebRtc_available_read(aecm->farendBuf) / FRAME_LEN;
-
-            // Check that there is data in the far end buffer
-            if (nmbrOfFilledBuffers > 0)
-            {
-                // Get the next 80 samples from the farend buffer
-                WebRtc_ReadBuffer(aecm->farendBuf, (void**) &farend_ptr, farend,
-                                  FRAME_LEN);
-
-                // Always store the last frame for use when we run out of data
-                memcpy(&(aecm->farendOld[i][0]), farend_ptr,
-                       FRAME_LEN * sizeof(short));
-            } else
-            {
-                // We have no data so we use the last played frame
-                memcpy(farend, &(aecm->farendOld[i][0]), FRAME_LEN * sizeof(short));
-                farend_ptr = farend;
-            }
-
-            // Call buffer delay estimator when all data is extracted,
-            // i,e. i = 0 for NB and i = 1 for WB
-            if ((i == 0 && aecm->sampFreq == 8000) || (i == 1 && aecm->sampFreq == 16000))
-            {
-                WebRtcAecm_EstBufDelay(aecm, aecm->msInSndCardBuf);
-            }
-
-            // Call the AECM
-            /*WebRtcAecm_ProcessFrame(aecm->aecmCore, farend, &nearend[FRAME_LEN * i],
-             &out[FRAME_LEN * i], aecm->knownDelay);*/
-            if (WebRtcAecm_ProcessFrame(aecm->aecmCore,
-                                        farend_ptr,
-                                        &nearendNoisy[FRAME_LEN * i],
-                                        (nearendClean
-                                         ? &nearendClean[FRAME_LEN * i]
-                                         : NULL),
-                                        &out[FRAME_LEN * i]) == -1)
-                return -1;
-        }
-    }
-
-#ifdef AEC_DEBUG
-    msInAECBuf = (short) WebRtc_available_read(aecm->farendBuf) /
-        (kSampMsNb * aecm->aecmCore->mult);
-    fwrite(&msInAECBuf, 2, 1, aecm->bufFile);
-    fwrite(&(aecm->knownDelay), sizeof(aecm->knownDelay), 1, aecm->delayFile);
-#endif
-
-    return retVal;
-}
-
-int32_t WebRtcAecm_set_config(void *aecmInst, AecmConfig config)
-{
-    AecMobile* aecm = static_cast<AecMobile*>(aecmInst);
-
-    if (aecm == NULL)
-    {
-        return -1;
-    }
-
-    if (aecm->initFlag != kInitCheck)
-    {
-        return AECM_UNINITIALIZED_ERROR;
-    }
-
-    if (config.cngMode != AecmFalse && config.cngMode != AecmTrue)
-    {
-        return AECM_BAD_PARAMETER_ERROR;
-    }
-    aecm->aecmCore->cngMode = config.cngMode;
-
-    if (config.echoMode < 0 || config.echoMode > 4)
-    {
-        return AECM_BAD_PARAMETER_ERROR;
-    }
-    aecm->echoMode = config.echoMode;
-
-    if (aecm->echoMode == 0)
-    {
-        aecm->aecmCore->supGain = SUPGAIN_DEFAULT >> 3;
-        aecm->aecmCore->supGainOld = SUPGAIN_DEFAULT >> 3;
-        aecm->aecmCore->supGainErrParamA = SUPGAIN_ERROR_PARAM_A >> 3;
-        aecm->aecmCore->supGainErrParamD = SUPGAIN_ERROR_PARAM_D >> 3;
-        aecm->aecmCore->supGainErrParamDiffAB = (SUPGAIN_ERROR_PARAM_A >> 3)
-                - (SUPGAIN_ERROR_PARAM_B >> 3);
-        aecm->aecmCore->supGainErrParamDiffBD = (SUPGAIN_ERROR_PARAM_B >> 3)
-                - (SUPGAIN_ERROR_PARAM_D >> 3);
-    } else if (aecm->echoMode == 1)
-    {
-        aecm->aecmCore->supGain = SUPGAIN_DEFAULT >> 2;
-        aecm->aecmCore->supGainOld = SUPGAIN_DEFAULT >> 2;
-        aecm->aecmCore->supGainErrParamA = SUPGAIN_ERROR_PARAM_A >> 2;
-        aecm->aecmCore->supGainErrParamD = SUPGAIN_ERROR_PARAM_D >> 2;
-        aecm->aecmCore->supGainErrParamDiffAB = (SUPGAIN_ERROR_PARAM_A >> 2)
-                - (SUPGAIN_ERROR_PARAM_B >> 2);
-        aecm->aecmCore->supGainErrParamDiffBD = (SUPGAIN_ERROR_PARAM_B >> 2)
-                - (SUPGAIN_ERROR_PARAM_D >> 2);
-    } else if (aecm->echoMode == 2)
-    {
-        aecm->aecmCore->supGain = SUPGAIN_DEFAULT >> 1;
-        aecm->aecmCore->supGainOld = SUPGAIN_DEFAULT >> 1;
-        aecm->aecmCore->supGainErrParamA = SUPGAIN_ERROR_PARAM_A >> 1;
-        aecm->aecmCore->supGainErrParamD = SUPGAIN_ERROR_PARAM_D >> 1;
-        aecm->aecmCore->supGainErrParamDiffAB = (SUPGAIN_ERROR_PARAM_A >> 1)
-                - (SUPGAIN_ERROR_PARAM_B >> 1);
-        aecm->aecmCore->supGainErrParamDiffBD = (SUPGAIN_ERROR_PARAM_B >> 1)
-                - (SUPGAIN_ERROR_PARAM_D >> 1);
-    } else if (aecm->echoMode == 3)
-    {
-        aecm->aecmCore->supGain = SUPGAIN_DEFAULT;
-        aecm->aecmCore->supGainOld = SUPGAIN_DEFAULT;
-        aecm->aecmCore->supGainErrParamA = SUPGAIN_ERROR_PARAM_A;
-        aecm->aecmCore->supGainErrParamD = SUPGAIN_ERROR_PARAM_D;
-        aecm->aecmCore->supGainErrParamDiffAB = SUPGAIN_ERROR_PARAM_A - SUPGAIN_ERROR_PARAM_B;
-        aecm->aecmCore->supGainErrParamDiffBD = SUPGAIN_ERROR_PARAM_B - SUPGAIN_ERROR_PARAM_D;
-    } else if (aecm->echoMode == 4)
-    {
-        aecm->aecmCore->supGain = SUPGAIN_DEFAULT << 1;
-        aecm->aecmCore->supGainOld = SUPGAIN_DEFAULT << 1;
-        aecm->aecmCore->supGainErrParamA = SUPGAIN_ERROR_PARAM_A << 1;
-        aecm->aecmCore->supGainErrParamD = SUPGAIN_ERROR_PARAM_D << 1;
-        aecm->aecmCore->supGainErrParamDiffAB = (SUPGAIN_ERROR_PARAM_A << 1)
-                - (SUPGAIN_ERROR_PARAM_B << 1);
-        aecm->aecmCore->supGainErrParamDiffBD = (SUPGAIN_ERROR_PARAM_B << 1)
-                - (SUPGAIN_ERROR_PARAM_D << 1);
-    }
-
-    return 0;
-}
-
-int32_t WebRtcAecm_InitEchoPath(void* aecmInst,
-                                const void* echo_path,
-                                size_t size_bytes)
-{
-    AecMobile* aecm = static_cast<AecMobile*>(aecmInst);
-    const int16_t* echo_path_ptr = static_cast<const int16_t*>(echo_path);
-
-    if (aecmInst == NULL) {
-      return -1;
-    }
-    if (echo_path == NULL) {
-      return AECM_NULL_POINTER_ERROR;
-    }
-    if (size_bytes != WebRtcAecm_echo_path_size_bytes())
-    {
-        // Input channel size does not match the size of AECM
-        return AECM_BAD_PARAMETER_ERROR;
-    }
-    if (aecm->initFlag != kInitCheck)
-    {
-        return AECM_UNINITIALIZED_ERROR;
-    }
-
-    WebRtcAecm_InitEchoPathCore(aecm->aecmCore, echo_path_ptr);
-
-    return 0;
-}
-
-int32_t WebRtcAecm_GetEchoPath(void* aecmInst,
-                               void* echo_path,
-                               size_t size_bytes)
-{
-    AecMobile* aecm = static_cast<AecMobile*>(aecmInst);
-    int16_t* echo_path_ptr = static_cast<int16_t*>(echo_path);
-
-    if (aecmInst == NULL) {
-      return -1;
-    }
-    if (echo_path == NULL) {
-      return AECM_NULL_POINTER_ERROR;
-    }
-    if (size_bytes != WebRtcAecm_echo_path_size_bytes())
-    {
-        // Input channel size does not match the size of AECM
-        return AECM_BAD_PARAMETER_ERROR;
-    }
-    if (aecm->initFlag != kInitCheck)
-    {
-        return AECM_UNINITIALIZED_ERROR;
-    }
-
-    memcpy(echo_path_ptr, aecm->aecmCore->channelStored, size_bytes);
-    return 0;
-}
-
-size_t WebRtcAecm_echo_path_size_bytes()
-{
-    return (PART_LEN1 * sizeof(int16_t));
-}
-
-
-static int WebRtcAecm_EstBufDelay(AecMobile* aecm, short msInSndCardBuf) {
-    short delayNew, nSampSndCard;
-    short nSampFar = (short) WebRtc_available_read(aecm->farendBuf);
-    short diff;
-
-    nSampSndCard = msInSndCardBuf * kSampMsNb * aecm->aecmCore->mult;
-
-    delayNew = nSampSndCard - nSampFar;
-
-    if (delayNew < FRAME_LEN)
-    {
-        WebRtc_MoveReadPtr(aecm->farendBuf, FRAME_LEN);
-        delayNew += FRAME_LEN;
-    }
-
-    aecm->filtDelay = WEBRTC_SPL_MAX(0, (8 * aecm->filtDelay + 2 * delayNew) / 10);
-
-    diff = aecm->filtDelay - aecm->knownDelay;
-    if (diff > 224)
-    {
-        if (aecm->lastDelayDiff < 96)
-        {
-            aecm->timeForDelayChange = 0;
-        } else
-        {
-            aecm->timeForDelayChange++;
-        }
-    } else if (diff < 96 && aecm->knownDelay > 0)
-    {
-        if (aecm->lastDelayDiff > 224)
-        {
-            aecm->timeForDelayChange = 0;
-        } else
-        {
-            aecm->timeForDelayChange++;
-        }
-    } else
-    {
-        aecm->timeForDelayChange = 0;
-    }
-    aecm->lastDelayDiff = diff;
-
-    if (aecm->timeForDelayChange > 25)
-    {
-        aecm->knownDelay = WEBRTC_SPL_MAX((int)aecm->filtDelay - 160, 0);
-    }
-    return 0;
-}
-
-static int WebRtcAecm_DelayComp(AecMobile* aecm) {
-    int nSampFar = (int) WebRtc_available_read(aecm->farendBuf);
-    int nSampSndCard, delayNew, nSampAdd;
-    const int maxStuffSamp = 10 * FRAME_LEN;
-
-    nSampSndCard = aecm->msInSndCardBuf * kSampMsNb * aecm->aecmCore->mult;
-    delayNew = nSampSndCard - nSampFar;
-
-    if (delayNew > FAR_BUF_LEN - FRAME_LEN * aecm->aecmCore->mult)
-    {
-        // The difference of the buffer sizes is larger than the maximum
-        // allowed known delay. Compensate by stuffing the buffer.
-        nSampAdd = (int)(WEBRTC_SPL_MAX(((nSampSndCard >> 1) - nSampFar),
-                FRAME_LEN));
-        nSampAdd = WEBRTC_SPL_MIN(nSampAdd, maxStuffSamp);
-
-        WebRtc_MoveReadPtr(aecm->farendBuf, -nSampAdd);
-        aecm->delayChange = 1; // the delay needs to be updated
-    }
-
-    return 0;
-}
diff --git a/modules/audio_processing/aecm/echo_control_mobile.h b/modules/audio_processing/aecm/echo_control_mobile.h
deleted file mode 100644
index b45ff59..0000000
--- a/modules/audio_processing/aecm/echo_control_mobile.h
+++ /dev/null
@@ -1,209 +0,0 @@
-/*
- *  Copyright (c) 2012 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_PROCESSING_AECM_ECHO_CONTROL_MOBILE_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_AECM_ECHO_CONTROL_MOBILE_H_
-
-#include <stdlib.h>
-
-#include "webrtc/typedefs.h"
-
-enum {
-    AecmFalse = 0,
-    AecmTrue
-};
-
-// Errors
-#define AECM_UNSPECIFIED_ERROR           12000
-#define AECM_UNSUPPORTED_FUNCTION_ERROR  12001
-#define AECM_UNINITIALIZED_ERROR         12002
-#define AECM_NULL_POINTER_ERROR          12003
-#define AECM_BAD_PARAMETER_ERROR         12004
-
-// Warnings
-#define AECM_BAD_PARAMETER_WARNING       12100
-
-typedef struct {
-    int16_t cngMode;            // AECM_FALSE, AECM_TRUE (default)
-    int16_t echoMode;           // 0, 1, 2, 3 (default), 4
-} AecmConfig;
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/*
- * Allocates the memory needed by the AECM. The memory needs to be
- * initialized separately using the WebRtcAecm_Init() function.
- * Returns a pointer to the instance and a nullptr at failure.
- */
-void* WebRtcAecm_Create();
-
-/*
- * This function releases the memory allocated by WebRtcAecm_Create()
- *
- * Inputs                       Description
- * -------------------------------------------------------------------
- * void*    aecmInst            Pointer to the AECM instance
- */
-void WebRtcAecm_Free(void* aecmInst);
-
-/*
- * Initializes an AECM instance.
- *
- * Inputs                       Description
- * -------------------------------------------------------------------
- * void*          aecmInst      Pointer to the AECM instance
- * int32_t        sampFreq      Sampling frequency of data
- *
- * Outputs                      Description
- * -------------------------------------------------------------------
- * int32_t        return        0: OK
- *                              1200-12004,12100: error/warning
- */
-int32_t WebRtcAecm_Init(void* aecmInst, int32_t sampFreq);
-
-/*
- * Inserts an 80 or 160 sample block of data into the farend buffer.
- *
- * Inputs                       Description
- * -------------------------------------------------------------------
- * void*          aecmInst      Pointer to the AECM instance
- * int16_t*       farend        In buffer containing one frame of
- *                              farend signal
- * int16_t        nrOfSamples   Number of samples in farend buffer
- *
- * Outputs                      Description
- * -------------------------------------------------------------------
- * int32_t        return        0: OK
- *                              1200-12004,12100: error/warning
- */
-int32_t WebRtcAecm_BufferFarend(void* aecmInst,
-                                const int16_t* farend,
-                                size_t nrOfSamples);
-
-/*
- * Reports any errors that would arise when buffering a farend buffer.
- *
- * Inputs                       Description
- * -------------------------------------------------------------------
- * void*          aecmInst      Pointer to the AECM instance
- * int16_t*       farend        In buffer containing one frame of
- *                              farend signal
- * int16_t        nrOfSamples   Number of samples in farend buffer
- *
- * Outputs                      Description
- * -------------------------------------------------------------------
- * int32_t        return        0: OK
- *                              1200-12004,12100: error/warning
- */
-int32_t WebRtcAecm_GetBufferFarendError(void* aecmInst,
-                                        const int16_t* farend,
-                                        size_t nrOfSamples);
-
-/*
- * Runs the AECM on an 80 or 160 sample blocks of data.
- *
- * Inputs                        Description
- * -------------------------------------------------------------------
- * void*          aecmInst       Pointer to the AECM instance
- * int16_t*       nearendNoisy   In buffer containing one frame of
- *                               reference nearend+echo signal. If
- *                               noise reduction is active, provide
- *                               the noisy signal here.
- * int16_t*       nearendClean   In buffer containing one frame of
- *                               nearend+echo signal. If noise
- *                               reduction is active, provide the
- *                               clean signal here. Otherwise pass a
- *                               NULL pointer.
- * int16_t        nrOfSamples    Number of samples in nearend buffer
- * int16_t        msInSndCardBuf Delay estimate for sound card and
- *                               system buffers
- *
- * Outputs                       Description
- * -------------------------------------------------------------------
- * int16_t*       out            Out buffer, one frame of processed nearend
- * int32_t        return         0: OK
- *                               1200-12004,12100: error/warning
- */
-int32_t WebRtcAecm_Process(void* aecmInst,
-                           const int16_t* nearendNoisy,
-                           const int16_t* nearendClean,
-                           int16_t* out,
-                           size_t nrOfSamples,
-                           int16_t msInSndCardBuf);
-
-/*
- * This function enables the user to set certain parameters on-the-fly
- *
- * Inputs                       Description
- * -------------------------------------------------------------------
- * void*          aecmInst      Pointer to the AECM instance
- * AecmConfig     config        Config instance that contains all
- *                              properties to be set
- *
- * Outputs                      Description
- * -------------------------------------------------------------------
- * int32_t        return        0: OK
- *                              1200-12004,12100: error/warning
- */
-int32_t WebRtcAecm_set_config(void* aecmInst, AecmConfig config);
-
-/*
- * This function enables the user to set the echo path on-the-fly.
- *
- * Inputs                       Description
- * -------------------------------------------------------------------
- * void*        aecmInst        Pointer to the AECM instance
- * void*        echo_path       Pointer to the echo path to be set
- * size_t       size_bytes      Size in bytes of the echo path
- *
- * Outputs                      Description
- * -------------------------------------------------------------------
- * int32_t      return          0: OK
- *                              1200-12004,12100: error/warning
- */
-int32_t WebRtcAecm_InitEchoPath(void* aecmInst,
-                                const void* echo_path,
-                                size_t size_bytes);
-
-/*
- * This function enables the user to get the currently used echo path
- * on-the-fly
- *
- * Inputs                       Description
- * -------------------------------------------------------------------
- * void*        aecmInst        Pointer to the AECM instance
- * void*        echo_path       Pointer to echo path
- * size_t       size_bytes      Size in bytes of the echo path
- *
- * Outputs                      Description
- * -------------------------------------------------------------------
- * int32_t      return          0: OK
- *                              1200-12004,12100: error/warning
- */
-int32_t WebRtcAecm_GetEchoPath(void* aecmInst,
-                               void* echo_path,
-                               size_t size_bytes);
-
-/*
- * This function enables the user to get the echo path size in bytes
- *
- * Outputs                      Description
- * -------------------------------------------------------------------
- * size_t       return          Size in bytes
- */
-size_t WebRtcAecm_echo_path_size_bytes();
-
-
-#ifdef __cplusplus
-}
-#endif
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_AECM_ECHO_CONTROL_MOBILE_H_
diff --git a/modules/audio_processing/agc/agc.cc b/modules/audio_processing/agc/agc.cc
deleted file mode 100644
index 1370d38..0000000
--- a/modules/audio_processing/agc/agc.cc
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- *  Copyright (c) 2012 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_processing/agc/agc.h"
-
-#include <cmath>
-#include <cstdlib>
-
-#include <algorithm>
-#include <vector>
-
-#include "webrtc/modules/audio_processing/agc/loudness_histogram.h"
-#include "webrtc/modules/audio_processing/agc/utility.h"
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-namespace {
-
-const int kDefaultLevelDbfs = -18;
-const int kNumAnalysisFrames = 100;
-const double kActivityThreshold = 0.3;
-
-}  // namespace
-
-Agc::Agc()
-    : target_level_loudness_(Dbfs2Loudness(kDefaultLevelDbfs)),
-      target_level_dbfs_(kDefaultLevelDbfs),
-      histogram_(LoudnessHistogram::Create(kNumAnalysisFrames)),
-      inactive_histogram_(LoudnessHistogram::Create()) {}
-
-Agc::~Agc() {}
-
-float Agc::AnalyzePreproc(const int16_t* audio, size_t length) {
-  RTC_DCHECK_GT(length, 0);
-  size_t num_clipped = 0;
-  for (size_t i = 0; i < length; ++i) {
-    if (audio[i] == 32767 || audio[i] == -32768)
-      ++num_clipped;
-  }
-  return 1.0f * num_clipped / length;
-}
-
-int Agc::Process(const int16_t* audio, size_t length, int sample_rate_hz) {
-  vad_.ProcessChunk(audio, length, sample_rate_hz);
-  const std::vector<double>& rms = vad_.chunkwise_rms();
-  const std::vector<double>& probabilities =
-      vad_.chunkwise_voice_probabilities();
-  RTC_DCHECK_EQ(rms.size(), probabilities.size());
-  for (size_t i = 0; i < rms.size(); ++i) {
-    histogram_->Update(rms[i], probabilities[i]);
-  }
-  return 0;
-}
-
-bool Agc::GetRmsErrorDb(int* error) {
-  if (!error) {
-    RTC_NOTREACHED();
-    return false;
-  }
-
-  if (histogram_->num_updates() < kNumAnalysisFrames) {
-    // We haven't yet received enough frames.
-    return false;
-  }
-
-  if (histogram_->AudioContent() < kNumAnalysisFrames * kActivityThreshold) {
-    // We are likely in an inactive segment.
-    return false;
-  }
-
-  double loudness = Linear2Loudness(histogram_->CurrentRms());
-  *error = std::floor(Loudness2Db(target_level_loudness_ - loudness) + 0.5);
-  histogram_->Reset();
-  return true;
-}
-
-void Agc::Reset() {
-  histogram_->Reset();
-}
-
-int Agc::set_target_level_dbfs(int level) {
-  // TODO(turajs): just some arbitrary sanity check. We can come up with better
-  // limits. The upper limit should be chosen such that the risk of clipping is
-  // low. The lower limit should not result in a too quiet signal.
-  if (level >= 0 || level <= -100)
-    return -1;
-  target_level_dbfs_ = level;
-  target_level_loudness_ = Dbfs2Loudness(level);
-  return 0;
-}
-
-int Agc::target_level_dbfs() const {
-  return target_level_dbfs_;
-}
-
-float Agc::voice_probability() const {
-  return vad_.last_voice_probability();
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/agc/agc.h b/modules/audio_processing/agc/agc.h
deleted file mode 100644
index e681e37..0000000
--- a/modules/audio_processing/agc/agc.h
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- *  Copyright (c) 2012 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_PROCESSING_AGC_AGC_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_AGC_AGC_H_
-
-#include <memory>
-
-#include "webrtc/modules/audio_processing/vad/voice_activity_detector.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-class AudioFrame;
-class LoudnessHistogram;
-
-class Agc {
- public:
-  Agc();
-  virtual ~Agc();
-
-  // Returns the proportion of samples in the buffer which are at full-scale
-  // (and presumably clipped).
-  virtual float AnalyzePreproc(const int16_t* audio, size_t length);
-  // |audio| must be mono; in a multi-channel stream, provide the first (usually
-  // left) channel.
-  virtual int Process(const int16_t* audio, size_t length, int sample_rate_hz);
-
-  // Retrieves the difference between the target RMS level and the current
-  // signal RMS level in dB. Returns true if an update is available and false
-  // otherwise, in which case |error| should be ignored and no action taken.
-  virtual bool GetRmsErrorDb(int* error);
-  virtual void Reset();
-
-  virtual int set_target_level_dbfs(int level);
-  virtual int target_level_dbfs() const;
-  virtual float voice_probability() const;
-
- private:
-  double target_level_loudness_;
-  int target_level_dbfs_;
-  std::unique_ptr<LoudnessHistogram> histogram_;
-  std::unique_ptr<LoudnessHistogram> inactive_histogram_;
-  VoiceActivityDetector vad_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_AGC_AGC_H_
diff --git a/modules/audio_processing/agc/agc_manager_direct.cc b/modules/audio_processing/agc/agc_manager_direct.cc
deleted file mode 100644
index 0bf5ec8..0000000
--- a/modules/audio_processing/agc/agc_manager_direct.cc
+++ /dev/null
@@ -1,457 +0,0 @@
-/*
- *  Copyright (c) 2013 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_processing/agc/agc_manager_direct.h"
-
-#include <cmath>
-
-#ifdef WEBRTC_AGC_DEBUG_DUMP
-#include <cstdio>
-#endif
-
-#include "webrtc/modules/audio_processing/agc/gain_map_internal.h"
-#include "webrtc/modules/audio_processing/gain_control_impl.h"
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/safe_minmax.h"
-#include "webrtc/system_wrappers/include/metrics.h"
-
-namespace webrtc {
-
-namespace {
-
-// Amount the microphone level is lowered with every clipping event.
-const int kClippedLevelStep = 15;
-// Proportion of clipped samples required to declare a clipping event.
-const float kClippedRatioThreshold = 0.1f;
-// Time in frames to wait after a clipping event before checking again.
-const int kClippedWaitFrames = 300;
-
-// Amount of error we tolerate in the microphone level (presumably due to OS
-// quantization) before we assume the user has manually adjusted the microphone.
-const int kLevelQuantizationSlack = 25;
-
-const int kDefaultCompressionGain = 7;
-const int kMaxCompressionGain = 12;
-const int kMinCompressionGain = 2;
-// Controls the rate of compression changes towards the target.
-const float kCompressionGainStep = 0.05f;
-
-const int kMaxMicLevel = 255;
-static_assert(kGainMapSize > kMaxMicLevel, "gain map too small");
-const int kMinMicLevel = 12;
-
-// Prevent very large microphone level changes.
-const int kMaxResidualGainChange = 15;
-
-// Maximum additional gain allowed to compensate for microphone level
-// restrictions from clipping events.
-const int kSurplusCompressionGain = 6;
-
-int ClampLevel(int mic_level) {
-  return rtc::SafeClamp(mic_level, kMinMicLevel, kMaxMicLevel);
-}
-
-int LevelFromGainError(int gain_error, int level) {
-  RTC_DCHECK_GE(level, 0);
-  RTC_DCHECK_LE(level, kMaxMicLevel);
-  if (gain_error == 0) {
-    return level;
-  }
-  // TODO(ajm): Could be made more efficient with a binary search.
-  int new_level = level;
-  if (gain_error > 0) {
-    while (kGainMap[new_level] - kGainMap[level] < gain_error &&
-          new_level < kMaxMicLevel) {
-      ++new_level;
-    }
-  } else {
-    while (kGainMap[new_level] - kGainMap[level] > gain_error &&
-          new_level > kMinMicLevel) {
-      --new_level;
-    }
-  }
-  return new_level;
-}
-
-}  // namespace
-
-// Facility for dumping debug audio files. All methods are no-ops in the
-// default case where WEBRTC_AGC_DEBUG_DUMP is undefined.
-class DebugFile {
-#ifdef WEBRTC_AGC_DEBUG_DUMP
- public:
-  explicit DebugFile(const char* filename)
-      : file_(fopen(filename, "wb")) {
-    RTC_DCHECK(file_);
-  }
-  ~DebugFile() {
-    fclose(file_);
-  }
-  void Write(const int16_t* data, size_t length_samples) {
-    fwrite(data, 1, length_samples * sizeof(int16_t), file_);
-  }
- private:
-  FILE* file_;
-#else
- public:
-  explicit DebugFile(const char* filename) {
-  }
-  ~DebugFile() {
-  }
-  void Write(const int16_t* data, size_t length_samples) {
-  }
-#endif  // WEBRTC_AGC_DEBUG_DUMP
-};
-
-AgcManagerDirect::AgcManagerDirect(GainControl* gctrl,
-                                   VolumeCallbacks* volume_callbacks,
-                                   int startup_min_level,
-                                   int clipped_level_min)
-    : agc_(new Agc()),
-      gctrl_(gctrl),
-      volume_callbacks_(volume_callbacks),
-      frames_since_clipped_(kClippedWaitFrames),
-      level_(0),
-      max_level_(kMaxMicLevel),
-      max_compression_gain_(kMaxCompressionGain),
-      target_compression_(kDefaultCompressionGain),
-      compression_(target_compression_),
-      compression_accumulator_(compression_),
-      capture_muted_(false),
-      check_volume_on_next_process_(true),  // Check at startup.
-      startup_(true),
-      startup_min_level_(ClampLevel(startup_min_level)),
-      clipped_level_min_(clipped_level_min),
-      file_preproc_(new DebugFile("agc_preproc.pcm")),
-      file_postproc_(new DebugFile("agc_postproc.pcm")) {}
-
-AgcManagerDirect::AgcManagerDirect(Agc* agc,
-                                   GainControl* gctrl,
-                                   VolumeCallbacks* volume_callbacks,
-                                   int startup_min_level,
-                                   int clipped_level_min)
-    : agc_(agc),
-      gctrl_(gctrl),
-      volume_callbacks_(volume_callbacks),
-      frames_since_clipped_(kClippedWaitFrames),
-      level_(0),
-      max_level_(kMaxMicLevel),
-      max_compression_gain_(kMaxCompressionGain),
-      target_compression_(kDefaultCompressionGain),
-      compression_(target_compression_),
-      compression_accumulator_(compression_),
-      capture_muted_(false),
-      check_volume_on_next_process_(true),  // Check at startup.
-      startup_(true),
-      startup_min_level_(ClampLevel(startup_min_level)),
-      clipped_level_min_(clipped_level_min),
-      file_preproc_(new DebugFile("agc_preproc.pcm")),
-      file_postproc_(new DebugFile("agc_postproc.pcm")) {}
-
-AgcManagerDirect::~AgcManagerDirect() {}
-
-int AgcManagerDirect::Initialize() {
-  max_level_ = kMaxMicLevel;
-  max_compression_gain_ = kMaxCompressionGain;
-  target_compression_ = kDefaultCompressionGain;
-  compression_ = target_compression_;
-  compression_accumulator_ = compression_;
-  capture_muted_ = false;
-  check_volume_on_next_process_ = true;
-  // TODO(bjornv): Investigate if we need to reset |startup_| as well. For
-  // example, what happens when we change devices.
-
-  if (gctrl_->set_mode(GainControl::kFixedDigital) != 0) {
-    LOG(LS_ERROR) << "set_mode(GainControl::kFixedDigital) failed.";
-    return -1;
-  }
-  if (gctrl_->set_target_level_dbfs(2) != 0) {
-    LOG(LS_ERROR) << "set_target_level_dbfs(2) failed.";
-    return -1;
-  }
-  if (gctrl_->set_compression_gain_db(kDefaultCompressionGain) != 0) {
-    LOG(LS_ERROR) << "set_compression_gain_db(kDefaultCompressionGain) failed.";
-    return -1;
-  }
-  if (gctrl_->enable_limiter(true) != 0) {
-    LOG(LS_ERROR) << "enable_limiter(true) failed.";
-    return -1;
-  }
-  return 0;
-}
-
-void AgcManagerDirect::AnalyzePreProcess(int16_t* audio,
-                                         int num_channels,
-                                         size_t samples_per_channel) {
-  size_t length = num_channels * samples_per_channel;
-  if (capture_muted_) {
-    return;
-  }
-
-  file_preproc_->Write(audio, length);
-
-  if (frames_since_clipped_ < kClippedWaitFrames) {
-    ++frames_since_clipped_;
-    return;
-  }
-
-  // Check for clipped samples, as the AGC has difficulty detecting pitch
-  // under clipping distortion. We do this in the preprocessing phase in order
-  // to catch clipped echo as well.
-  //
-  // If we find a sufficiently clipped frame, drop the current microphone level
-  // and enforce a new maximum level, dropped the same amount from the current
-  // maximum. This harsh treatment is an effort to avoid repeated clipped echo
-  // events. As compensation for this restriction, the maximum compression
-  // gain is increased, through SetMaxLevel().
-  float clipped_ratio = agc_->AnalyzePreproc(audio, length);
-  if (clipped_ratio > kClippedRatioThreshold) {
-    LOG(LS_INFO) << "[agc] Clipping detected. clipped_ratio="
-                 << clipped_ratio;
-    // Always decrease the maximum level, even if the current level is below
-    // threshold.
-    SetMaxLevel(std::max(clipped_level_min_, max_level_ - kClippedLevelStep));
-    RTC_HISTOGRAM_BOOLEAN("WebRTC.Audio.AgcClippingAdjustmentAllowed",
-                          level_ - kClippedLevelStep >= clipped_level_min_);
-    if (level_ > clipped_level_min_) {
-      // Don't try to adjust the level if we're already below the limit. As
-      // a consequence, if the user has brought the level above the limit, we
-      // will still not react until the postproc updates the level.
-      SetLevel(std::max(clipped_level_min_, level_ - kClippedLevelStep));
-      // Reset the AGC since the level has changed.
-      agc_->Reset();
-    }
-    frames_since_clipped_ = 0;
-  }
-}
-
-void AgcManagerDirect::Process(const int16_t* audio,
-                               size_t length,
-                               int sample_rate_hz) {
-  if (capture_muted_) {
-    return;
-  }
-
-  if (check_volume_on_next_process_) {
-    check_volume_on_next_process_ = false;
-    // We have to wait until the first process call to check the volume,
-    // because Chromium doesn't guarantee it to be valid any earlier.
-    CheckVolumeAndReset();
-  }
-
-  if (agc_->Process(audio, length, sample_rate_hz) != 0) {
-    LOG(LS_ERROR) << "Agc::Process failed";
-    RTC_NOTREACHED();
-  }
-
-  UpdateGain();
-  UpdateCompressor();
-
-  file_postproc_->Write(audio, length);
-}
-
-void AgcManagerDirect::SetLevel(int new_level) {
-  int voe_level = volume_callbacks_->GetMicVolume();
-  if (voe_level < 0) {
-    return;
-  }
-  if (voe_level == 0) {
-    LOG(LS_INFO) << "[agc] VolumeCallbacks returned level=0, taking no action.";
-    return;
-  }
-  if (voe_level > kMaxMicLevel) {
-    LOG(LS_ERROR) << "VolumeCallbacks returned an invalid level=" << voe_level;
-    return;
-  }
-
-  if (voe_level > level_ + kLevelQuantizationSlack ||
-      voe_level < level_ - kLevelQuantizationSlack) {
-    LOG(LS_INFO) << "[agc] Mic volume was manually adjusted. Updating "
-                 << "stored level from " << level_ << " to " << voe_level;
-    level_ = voe_level;
-    // Always allow the user to increase the volume.
-    if (level_ > max_level_) {
-      SetMaxLevel(level_);
-    }
-    // Take no action in this case, since we can't be sure when the volume
-    // was manually adjusted. The compressor will still provide some of the
-    // desired gain change.
-    agc_->Reset();
-    return;
-  }
-
-  new_level = std::min(new_level, max_level_);
-  if (new_level == level_) {
-    return;
-  }
-
-  volume_callbacks_->SetMicVolume(new_level);
-  LOG(LS_INFO) << "[agc] voe_level=" << voe_level << ", "
-               << "level_=" << level_ << ", "
-               << "new_level=" << new_level;
-  level_ = new_level;
-}
-
-void AgcManagerDirect::SetMaxLevel(int level) {
-  RTC_DCHECK_GE(level, clipped_level_min_);
-  max_level_ = level;
-  // Scale the |kSurplusCompressionGain| linearly across the restricted
-  // level range.
-  max_compression_gain_ =
-      kMaxCompressionGain + std::floor((1.f * kMaxMicLevel - max_level_) /
-                                           (kMaxMicLevel - clipped_level_min_) *
-                                           kSurplusCompressionGain +
-                                       0.5f);
-  LOG(LS_INFO) << "[agc] max_level_=" << max_level_
-               << ", max_compression_gain_="  << max_compression_gain_;
-}
-
-void AgcManagerDirect::SetCaptureMuted(bool muted) {
-  if (capture_muted_ == muted) {
-    return;
-  }
-  capture_muted_ = muted;
-
-  if (!muted) {
-    // When we unmute, we should reset things to be safe.
-    check_volume_on_next_process_ = true;
-  }
-}
-
-float AgcManagerDirect::voice_probability() {
-  return agc_->voice_probability();
-}
-
-int AgcManagerDirect::CheckVolumeAndReset() {
-  int level = volume_callbacks_->GetMicVolume();
-  if (level < 0) {
-    return -1;
-  }
-  // Reasons for taking action at startup:
-  // 1) A person starting a call is expected to be heard.
-  // 2) Independent of interpretation of |level| == 0 we should raise it so the
-  // AGC can do its job properly.
-  if (level == 0 && !startup_) {
-    LOG(LS_INFO) << "[agc] VolumeCallbacks returned level=0, taking no action.";
-    return 0;
-  }
-  if (level > kMaxMicLevel) {
-    LOG(LS_ERROR) << "VolumeCallbacks returned an invalid level=" << level;
-    return -1;
-  }
-  LOG(LS_INFO) << "[agc] Initial GetMicVolume()=" << level;
-
-  int minLevel = startup_ ? startup_min_level_ : kMinMicLevel;
-  if (level < minLevel) {
-    level = minLevel;
-    LOG(LS_INFO) << "[agc] Initial volume too low, raising to " << level;
-    volume_callbacks_->SetMicVolume(level);
-  }
-  agc_->Reset();
-  level_ = level;
-  startup_ = false;
-  return 0;
-}
-
-// Requests the RMS error from AGC and distributes the required gain change
-// between the digital compression stage and volume slider. We use the
-// compressor first, providing a slack region around the current slider
-// position to reduce movement.
-//
-// If the slider needs to be moved, we check first if the user has adjusted
-// it, in which case we take no action and cache the updated level.
-void AgcManagerDirect::UpdateGain() {
-  int rms_error = 0;
-  if (!agc_->GetRmsErrorDb(&rms_error)) {
-    // No error update ready.
-    return;
-  }
-  // The compressor will always add at least kMinCompressionGain. In effect,
-  // this adjusts our target gain upward by the same amount and rms_error
-  // needs to reflect that.
-  rms_error += kMinCompressionGain;
-
-  // Handle as much error as possible with the compressor first.
-  int raw_compression =
-      rtc::SafeClamp(rms_error, kMinCompressionGain, max_compression_gain_);
-
-  // Deemphasize the compression gain error. Move halfway between the current
-  // target and the newly received target. This serves to soften perceptible
-  // intra-talkspurt adjustments, at the cost of some adaptation speed.
-  if ((raw_compression == max_compression_gain_ &&
-      target_compression_ == max_compression_gain_ - 1) ||
-      (raw_compression == kMinCompressionGain &&
-      target_compression_ == kMinCompressionGain + 1)) {
-    // Special case to allow the target to reach the endpoints of the
-    // compression range. The deemphasis would otherwise halt it at 1 dB shy.
-    target_compression_ = raw_compression;
-  } else {
-    target_compression_ = (raw_compression - target_compression_) / 2
-        + target_compression_;
-  }
-
-  // Residual error will be handled by adjusting the volume slider. Use the
-  // raw rather than deemphasized compression here as we would otherwise
-  // shrink the amount of slack the compressor provides.
-  const int residual_gain =
-      rtc::SafeClamp(rms_error - raw_compression, -kMaxResidualGainChange,
-                     kMaxResidualGainChange);
-  LOG(LS_INFO) << "[agc] rms_error=" << rms_error << ", "
-               << "target_compression=" << target_compression_ << ", "
-               << "residual_gain=" << residual_gain;
-  if (residual_gain == 0)
-    return;
-
-  int old_level = level_;
-  SetLevel(LevelFromGainError(residual_gain, level_));
-  if (old_level != level_) {
-    // level_ was updated by SetLevel; log the new value.
-    RTC_HISTOGRAM_COUNTS_LINEAR("WebRTC.Audio.AgcSetLevel", level_, 1,
-                                kMaxMicLevel, 50);
-  }
-}
-
-void AgcManagerDirect::UpdateCompressor() {
-  if (compression_ == target_compression_) {
-    return;
-  }
-
-  // Adapt the compression gain slowly towards the target, in order to avoid
-  // highly perceptible changes.
-  if (target_compression_ > compression_) {
-    compression_accumulator_ += kCompressionGainStep;
-  } else {
-    compression_accumulator_ -= kCompressionGainStep;
-  }
-
-  // The compressor accepts integer gains in dB. Adjust the gain when
-  // we've come within half a stepsize of the nearest integer.  (We don't
-  // check for equality due to potential floating point imprecision).
-  int new_compression = compression_;
-  int nearest_neighbor = std::floor(compression_accumulator_ + 0.5);
-  if (std::fabs(compression_accumulator_ - nearest_neighbor) <
-      kCompressionGainStep / 2) {
-    new_compression = nearest_neighbor;
-  }
-
-  // Set the new compression gain.
-  if (new_compression != compression_) {
-    compression_ = new_compression;
-    compression_accumulator_ = new_compression;
-    if (gctrl_->set_compression_gain_db(compression_) != 0) {
-      LOG(LS_ERROR) << "set_compression_gain_db(" << compression_
-                    << ") failed.";
-    }
-  }
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/agc/agc_manager_direct.h b/modules/audio_processing/agc/agc_manager_direct.h
deleted file mode 100644
index 7a2e3ef..0000000
--- a/modules/audio_processing/agc/agc_manager_direct.h
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- *  Copyright (c) 2013 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_PROCESSING_AGC_AGC_MANAGER_DIRECT_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_AGC_AGC_MANAGER_DIRECT_H_
-
-#include <memory>
-
-#include "webrtc/modules/audio_processing/agc/agc.h"
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace webrtc {
-
-class AudioFrame;
-class DebugFile;
-class GainControl;
-
-// Callbacks that need to be injected into AgcManagerDirect to read and control
-// the volume values. This is done to remove the VoiceEngine dependency in
-// AgcManagerDirect.
-// TODO(aluebs): Remove VolumeCallbacks.
-class VolumeCallbacks {
- public:
-  virtual ~VolumeCallbacks() {}
-  virtual void SetMicVolume(int volume) = 0;
-  virtual int GetMicVolume() = 0;
-};
-
-// Direct interface to use AGC to set volume and compression values.
-// AudioProcessing uses this interface directly to integrate the callback-less
-// AGC.
-//
-// This class is not thread-safe.
-class AgcManagerDirect final {
- public:
-  // AgcManagerDirect will configure GainControl internally. The user is
-  // responsible for processing the audio using it after the call to Process.
-  // The operating range of startup_min_level is [12, 255] and any input value
-  // outside that range will be clamped.
-  AgcManagerDirect(GainControl* gctrl,
-                   VolumeCallbacks* volume_callbacks,
-                   int startup_min_level,
-                   int clipped_level_min);
-  // Dependency injection for testing. Don't delete |agc| as the memory is owned
-  // by the manager.
-  AgcManagerDirect(Agc* agc,
-                   GainControl* gctrl,
-                   VolumeCallbacks* volume_callbacks,
-                   int startup_min_level,
-                   int clipped_level_min);
-  ~AgcManagerDirect();
-
-  int Initialize();
-  void AnalyzePreProcess(int16_t* audio,
-                         int num_channels,
-                         size_t samples_per_channel);
-  void Process(const int16_t* audio, size_t length, int sample_rate_hz);
-
-  // Call when the capture stream has been muted/unmuted. This causes the
-  // manager to disregard all incoming audio; chances are good it's background
-  // noise to which we'd like to avoid adapting.
-  void SetCaptureMuted(bool muted);
-  bool capture_muted() { return capture_muted_; }
-
-  float voice_probability();
-
- private:
-  // Sets a new microphone level, after first checking that it hasn't been
-  // updated by the user, in which case no action is taken.
-  void SetLevel(int new_level);
-
-  // Set the maximum level the AGC is allowed to apply. Also updates the
-  // maximum compression gain to compensate. The level must be at least
-  // |kClippedLevelMin|.
-  void SetMaxLevel(int level);
-
-  int CheckVolumeAndReset();
-  void UpdateGain();
-  void UpdateCompressor();
-
-  std::unique_ptr<Agc> agc_;
-  GainControl* gctrl_;
-  VolumeCallbacks* volume_callbacks_;
-
-  int frames_since_clipped_;
-  int level_;
-  int max_level_;
-  int max_compression_gain_;
-  int target_compression_;
-  int compression_;
-  float compression_accumulator_;
-  bool capture_muted_;
-  bool check_volume_on_next_process_;
-  bool startup_;
-  int startup_min_level_;
-  const int clipped_level_min_;
-
-  std::unique_ptr<DebugFile> file_preproc_;
-  std::unique_ptr<DebugFile> file_postproc_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(AgcManagerDirect);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_AGC_AGC_MANAGER_DIRECT_H_
diff --git a/modules/audio_processing/agc/agc_manager_direct_unittest.cc b/modules/audio_processing/agc/agc_manager_direct_unittest.cc
deleted file mode 100644
index 141e99c..0000000
--- a/modules/audio_processing/agc/agc_manager_direct_unittest.cc
+++ /dev/null
@@ -1,685 +0,0 @@
-/*
- *  Copyright (c) 2013 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_processing/agc/agc_manager_direct.h"
-
-#include "webrtc/common_types.h"
-#include "webrtc/modules/audio_processing/agc/mock_agc.h"
-#include "webrtc/modules/audio_processing/include/mock_audio_processing.h"
-#include "webrtc/system_wrappers/include/trace.h"
-#include "webrtc/test/gmock.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/testsupport/trace_to_stderr.h"
-
-using ::testing::_;
-using ::testing::DoAll;
-using ::testing::Return;
-using ::testing::SetArgPointee;
-
-namespace webrtc {
-namespace {
-
-const int kSampleRateHz = 32000;
-const int kNumChannels = 1;
-const int kSamplesPerChannel = kSampleRateHz / 100;
-const int kInitialVolume = 128;
-constexpr int kClippedMin = 165;  // Arbitrary, but different from the default.
-const float kAboveClippedThreshold = 0.2f;
-
-class TestVolumeCallbacks : public VolumeCallbacks {
- public:
-  TestVolumeCallbacks() : volume_(0) {}
-  void SetMicVolume(int volume) override { volume_ = volume; }
-  int GetMicVolume() override { return volume_; }
-
- private:
-  int volume_;
-};
-
-}  // namespace
-
-class AgcManagerDirectTest : public ::testing::Test {
- protected:
-  AgcManagerDirectTest()
-      : agc_(new MockAgc),
-        manager_(agc_, &gctrl_, &volume_, kInitialVolume, kClippedMin) {
-    ExpectInitialize();
-    manager_.Initialize();
-  }
-
-  void FirstProcess() {
-    EXPECT_CALL(*agc_, Reset());
-    EXPECT_CALL(*agc_, GetRmsErrorDb(_)).WillOnce(Return(false));
-    CallProcess(1);
-  }
-
-  void SetVolumeAndProcess(int volume) {
-    volume_.SetMicVolume(volume);
-    FirstProcess();
-  }
-
-  void ExpectCheckVolumeAndReset(int volume) {
-    volume_.SetMicVolume(volume);
-    EXPECT_CALL(*agc_, Reset());
-  }
-
-  void ExpectInitialize() {
-    EXPECT_CALL(gctrl_, set_mode(GainControl::kFixedDigital));
-    EXPECT_CALL(gctrl_, set_target_level_dbfs(2));
-    EXPECT_CALL(gctrl_, set_compression_gain_db(7));
-    EXPECT_CALL(gctrl_, enable_limiter(true));
-  }
-
-  void CallProcess(int num_calls) {
-    for (int i = 0; i < num_calls; ++i) {
-      EXPECT_CALL(*agc_, Process(_, _, _)).WillOnce(Return(0));
-      manager_.Process(nullptr, kSamplesPerChannel, kSampleRateHz);
-    }
-  }
-
-  void CallPreProc(int num_calls) {
-    for (int i = 0; i < num_calls; ++i) {
-      manager_.AnalyzePreProcess(nullptr, kNumChannels, kSamplesPerChannel);
-    }
-  }
-
-  MockAgc* agc_;
-  test::MockGainControl gctrl_;
-  TestVolumeCallbacks volume_;
-  AgcManagerDirect manager_;
-  test::TraceToStderr trace_to_stderr;
-};
-
-TEST_F(AgcManagerDirectTest, StartupMinVolumeConfigurationIsRespected) {
-  FirstProcess();
-  EXPECT_EQ(kInitialVolume, volume_.GetMicVolume());
-}
-
-TEST_F(AgcManagerDirectTest, MicVolumeResponseToRmsError) {
-  FirstProcess();
-
-  // Compressor default; no residual error.
-  EXPECT_CALL(*agc_, GetRmsErrorDb(_))
-      .WillOnce(DoAll(SetArgPointee<0>(5), Return(true)));
-  CallProcess(1);
-
-  // Inside the compressor's window; no change of volume.
-  EXPECT_CALL(*agc_, GetRmsErrorDb(_))
-      .WillOnce(DoAll(SetArgPointee<0>(10), Return(true)));
-  CallProcess(1);
-
-  // Above the compressor's window; volume should be increased.
-  EXPECT_CALL(*agc_, GetRmsErrorDb(_))
-      .WillOnce(DoAll(SetArgPointee<0>(11), Return(true)));
-  CallProcess(1);
-  EXPECT_EQ(130, volume_.GetMicVolume());
-
-  EXPECT_CALL(*agc_, GetRmsErrorDb(_))
-      .WillOnce(DoAll(SetArgPointee<0>(20), Return(true)));
-  CallProcess(1);
-  EXPECT_EQ(168, volume_.GetMicVolume());
-
-  // Inside the compressor's window; no change of volume.
-  EXPECT_CALL(*agc_, GetRmsErrorDb(_))
-      .WillOnce(DoAll(SetArgPointee<0>(5), Return(true)));
-  CallProcess(1);
-  EXPECT_CALL(*agc_, GetRmsErrorDb(_))
-      .WillOnce(DoAll(SetArgPointee<0>(0), Return(true)));
-  CallProcess(1);
-
-  // Below the compressor's window; volume should be decreased.
-  EXPECT_CALL(*agc_, GetRmsErrorDb(_))
-      .WillOnce(DoAll(SetArgPointee<0>(-1), Return(true)));
-  CallProcess(1);
-  EXPECT_EQ(167, volume_.GetMicVolume());
-
-  EXPECT_CALL(*agc_, GetRmsErrorDb(_))
-      .WillOnce(DoAll(SetArgPointee<0>(-1), Return(true)));
-  CallProcess(1);
-  EXPECT_EQ(163, volume_.GetMicVolume());
-
-  EXPECT_CALL(*agc_, GetRmsErrorDb(_))
-      .WillOnce(DoAll(SetArgPointee<0>(-9), Return(true)));
-  CallProcess(1);
-  EXPECT_EQ(129, volume_.GetMicVolume());
-}
-
-TEST_F(AgcManagerDirectTest, MicVolumeIsLimited) {
-  FirstProcess();
-
-  // Maximum upwards change is limited.
-  EXPECT_CALL(*agc_, GetRmsErrorDb(_))
-      .WillOnce(DoAll(SetArgPointee<0>(30), Return(true)));
-  CallProcess(1);
-  EXPECT_EQ(183, volume_.GetMicVolume());
-
-  EXPECT_CALL(*agc_, GetRmsErrorDb(_))
-      .WillOnce(DoAll(SetArgPointee<0>(30), Return(true)));
-  CallProcess(1);
-  EXPECT_EQ(243, volume_.GetMicVolume());
-
-  // Won't go higher than the maximum.
-  EXPECT_CALL(*agc_, GetRmsErrorDb(_))
-      .WillOnce(DoAll(SetArgPointee<0>(30), Return(true)));
-  CallProcess(1);
-  EXPECT_EQ(255, volume_.GetMicVolume());
-
-  EXPECT_CALL(*agc_, GetRmsErrorDb(_))
-      .WillOnce(DoAll(SetArgPointee<0>(-1), Return(true)));
-  CallProcess(1);
-  EXPECT_EQ(254, volume_.GetMicVolume());
-
-  // Maximum downwards change is limited.
-  EXPECT_CALL(*agc_, GetRmsErrorDb(_))
-      .WillOnce(DoAll(SetArgPointee<0>(-40), Return(true)));
-  CallProcess(1);
-  EXPECT_EQ(194, volume_.GetMicVolume());
-
-  EXPECT_CALL(*agc_, GetRmsErrorDb(_))
-      .WillOnce(DoAll(SetArgPointee<0>(-40), Return(true)));
-  CallProcess(1);
-  EXPECT_EQ(137, volume_.GetMicVolume());
-
-  EXPECT_CALL(*agc_, GetRmsErrorDb(_))
-      .WillOnce(DoAll(SetArgPointee<0>(-40), Return(true)));
-  CallProcess(1);
-  EXPECT_EQ(88, volume_.GetMicVolume());
-
-  EXPECT_CALL(*agc_, GetRmsErrorDb(_))
-      .WillOnce(DoAll(SetArgPointee<0>(-40), Return(true)));
-  CallProcess(1);
-  EXPECT_EQ(54, volume_.GetMicVolume());
-
-  EXPECT_CALL(*agc_, GetRmsErrorDb(_))
-      .WillOnce(DoAll(SetArgPointee<0>(-40), Return(true)));
-  CallProcess(1);
-  EXPECT_EQ(33, volume_.GetMicVolume());
-
-  EXPECT_CALL(*agc_, GetRmsErrorDb(_))
-      .WillOnce(DoAll(SetArgPointee<0>(-40), Return(true)));
-  CallProcess(1);
-  EXPECT_EQ(18, volume_.GetMicVolume());
-
-  // Won't go lower than the minimum.
-  EXPECT_CALL(*agc_, GetRmsErrorDb(_))
-      .WillOnce(DoAll(SetArgPointee<0>(-40), Return(true)));
-  CallProcess(1);
-  EXPECT_EQ(12, volume_.GetMicVolume());
-}
-
-TEST_F(AgcManagerDirectTest, CompressorStepsTowardsTarget) {
-  FirstProcess();
-
-  // Compressor default; no call to set_compression_gain_db.
-  EXPECT_CALL(*agc_, GetRmsErrorDb(_))
-      .WillOnce(DoAll(SetArgPointee<0>(5), Return(true)))
-      .WillRepeatedly(Return(false));
-  EXPECT_CALL(gctrl_, set_compression_gain_db(_)).Times(0);
-  CallProcess(20);
-
-  // Moves slowly upwards.
-  EXPECT_CALL(*agc_, GetRmsErrorDb(_))
-      .WillOnce(DoAll(SetArgPointee<0>(9), Return(true)))
-      .WillRepeatedly(Return(false));
-  EXPECT_CALL(gctrl_, set_compression_gain_db(_)).Times(0);
-  CallProcess(19);
-  EXPECT_CALL(gctrl_, set_compression_gain_db(8)).WillOnce(Return(0));
-  CallProcess(1);
-
-  EXPECT_CALL(gctrl_, set_compression_gain_db(_)).Times(0);
-  CallProcess(19);
-  EXPECT_CALL(gctrl_, set_compression_gain_db(9)).WillOnce(Return(0));
-  CallProcess(1);
-
-  EXPECT_CALL(gctrl_, set_compression_gain_db(_)).Times(0);
-  CallProcess(20);
-
-  // Moves slowly downward, then reverses before reaching the original target.
-  EXPECT_CALL(*agc_, GetRmsErrorDb(_))
-      .WillOnce(DoAll(SetArgPointee<0>(5), Return(true)))
-      .WillRepeatedly(Return(false));
-  EXPECT_CALL(gctrl_, set_compression_gain_db(_)).Times(0);
-  CallProcess(19);
-  EXPECT_CALL(gctrl_, set_compression_gain_db(8)).WillOnce(Return(0));
-  CallProcess(1);
-
-  EXPECT_CALL(*agc_, GetRmsErrorDb(_))
-      .WillOnce(DoAll(SetArgPointee<0>(9), Return(true)))
-      .WillRepeatedly(Return(false));
-  EXPECT_CALL(gctrl_, set_compression_gain_db(_)).Times(0);
-  CallProcess(19);
-  EXPECT_CALL(gctrl_, set_compression_gain_db(9)).WillOnce(Return(0));
-  CallProcess(1);
-
-  EXPECT_CALL(gctrl_, set_compression_gain_db(_)).Times(0);
-  CallProcess(20);
-}
-
-TEST_F(AgcManagerDirectTest, CompressorErrorIsDeemphasized) {
-  FirstProcess();
-
-  EXPECT_CALL(*agc_, GetRmsErrorDb(_))
-      .WillOnce(DoAll(SetArgPointee<0>(10), Return(true)))
-      .WillRepeatedly(Return(false));
-  CallProcess(19);
-  EXPECT_CALL(gctrl_, set_compression_gain_db(8)).WillOnce(Return(0));
-  CallProcess(20);
-  EXPECT_CALL(gctrl_, set_compression_gain_db(9)).WillOnce(Return(0));
-  CallProcess(1);
-  EXPECT_CALL(gctrl_, set_compression_gain_db(_)).Times(0);
-  CallProcess(20);
-
-  EXPECT_CALL(*agc_, GetRmsErrorDb(_))
-      .WillOnce(DoAll(SetArgPointee<0>(0), Return(true)))
-      .WillRepeatedly(Return(false));
-  CallProcess(19);
-  EXPECT_CALL(gctrl_, set_compression_gain_db(8)).WillOnce(Return(0));
-  CallProcess(20);
-  EXPECT_CALL(gctrl_, set_compression_gain_db(7)).WillOnce(Return(0));
-  CallProcess(20);
-  EXPECT_CALL(gctrl_, set_compression_gain_db(6)).WillOnce(Return(0));
-  CallProcess(1);
-  EXPECT_CALL(gctrl_, set_compression_gain_db(_)).Times(0);
-  CallProcess(20);
-}
-
-TEST_F(AgcManagerDirectTest, CompressorReachesMaximum) {
-  FirstProcess();
-
-  EXPECT_CALL(*agc_, GetRmsErrorDb(_))
-      .WillOnce(DoAll(SetArgPointee<0>(10), Return(true)))
-      .WillOnce(DoAll(SetArgPointee<0>(10), Return(true)))
-      .WillOnce(DoAll(SetArgPointee<0>(10), Return(true)))
-      .WillOnce(DoAll(SetArgPointee<0>(10), Return(true)))
-      .WillRepeatedly(Return(false));
-  CallProcess(19);
-  EXPECT_CALL(gctrl_, set_compression_gain_db(8)).WillOnce(Return(0));
-  CallProcess(20);
-  EXPECT_CALL(gctrl_, set_compression_gain_db(9)).WillOnce(Return(0));
-  CallProcess(20);
-  EXPECT_CALL(gctrl_, set_compression_gain_db(10)).WillOnce(Return(0));
-  CallProcess(20);
-  EXPECT_CALL(gctrl_, set_compression_gain_db(11)).WillOnce(Return(0));
-  CallProcess(20);
-  EXPECT_CALL(gctrl_, set_compression_gain_db(12)).WillOnce(Return(0));
-  CallProcess(1);
-}
-
-TEST_F(AgcManagerDirectTest, CompressorReachesMinimum) {
-  FirstProcess();
-
-  EXPECT_CALL(*agc_, GetRmsErrorDb(_))
-      .WillOnce(DoAll(SetArgPointee<0>(0), Return(true)))
-      .WillOnce(DoAll(SetArgPointee<0>(0), Return(true)))
-      .WillOnce(DoAll(SetArgPointee<0>(0), Return(true)))
-      .WillOnce(DoAll(SetArgPointee<0>(0), Return(true)))
-      .WillRepeatedly(Return(false));
-  CallProcess(19);
-  EXPECT_CALL(gctrl_, set_compression_gain_db(6)).WillOnce(Return(0));
-  CallProcess(20);
-  EXPECT_CALL(gctrl_, set_compression_gain_db(5)).WillOnce(Return(0));
-  CallProcess(20);
-  EXPECT_CALL(gctrl_, set_compression_gain_db(4)).WillOnce(Return(0));
-  CallProcess(20);
-  EXPECT_CALL(gctrl_, set_compression_gain_db(3)).WillOnce(Return(0));
-  CallProcess(20);
-  EXPECT_CALL(gctrl_, set_compression_gain_db(2)).WillOnce(Return(0));
-  CallProcess(1);
-}
-
-TEST_F(AgcManagerDirectTest, NoActionWhileMuted) {
-  manager_.SetCaptureMuted(true);
-  manager_.Process(nullptr, kSamplesPerChannel, kSampleRateHz);
-}
-
-TEST_F(AgcManagerDirectTest, UnmutingChecksVolumeWithoutRaising) {
-  FirstProcess();
-
-  manager_.SetCaptureMuted(true);
-  manager_.SetCaptureMuted(false);
-  ExpectCheckVolumeAndReset(127);
-  // SetMicVolume should not be called.
-  EXPECT_CALL(*agc_, GetRmsErrorDb(_)).WillOnce(Return(false));
-  CallProcess(1);
-  EXPECT_EQ(127, volume_.GetMicVolume());
-}
-
-TEST_F(AgcManagerDirectTest, UnmutingRaisesTooLowVolume) {
-  FirstProcess();
-
-  manager_.SetCaptureMuted(true);
-  manager_.SetCaptureMuted(false);
-  ExpectCheckVolumeAndReset(11);
-  EXPECT_CALL(*agc_, GetRmsErrorDb(_)).WillOnce(Return(false));
-  CallProcess(1);
-  EXPECT_EQ(12, volume_.GetMicVolume());
-}
-
-TEST_F(AgcManagerDirectTest, ManualLevelChangeResultsInNoSetMicCall) {
-  FirstProcess();
-
-  // Change outside of compressor's range, which would normally trigger a call
-  // to SetMicVolume.
-  EXPECT_CALL(*agc_, GetRmsErrorDb(_))
-      .WillOnce(DoAll(SetArgPointee<0>(11), Return(true)));
-  // GetMicVolume returns a value outside of the quantization slack, indicating
-  // a manual volume change.
-  volume_.SetMicVolume(154);
-  // SetMicVolume should not be called.
-  EXPECT_CALL(*agc_, Reset()).Times(1);
-  CallProcess(1);
-  EXPECT_EQ(154, volume_.GetMicVolume());
-
-  // Do the same thing, except downwards now.
-  EXPECT_CALL(*agc_, GetRmsErrorDb(_))
-      .WillOnce(DoAll(SetArgPointee<0>(-1), Return(true)));
-  volume_.SetMicVolume(100);
-  EXPECT_CALL(*agc_, Reset()).Times(1);
-  CallProcess(1);
-  EXPECT_EQ(100, volume_.GetMicVolume());
-
-  // And finally verify the AGC continues working without a manual change.
-  EXPECT_CALL(*agc_, GetRmsErrorDb(_))
-      .WillOnce(DoAll(SetArgPointee<0>(-1), Return(true)));
-  CallProcess(1);
-  EXPECT_EQ(99, volume_.GetMicVolume());
-}
-
-TEST_F(AgcManagerDirectTest, RecoveryAfterManualLevelChangeFromMax) {
-  FirstProcess();
-
-  // Force the mic up to max volume. Takes a few steps due to the residual
-  // gain limitation.
-  EXPECT_CALL(*agc_, GetRmsErrorDb(_))
-      .WillRepeatedly(DoAll(SetArgPointee<0>(30), Return(true)));
-  CallProcess(1);
-  EXPECT_EQ(183, volume_.GetMicVolume());
-  CallProcess(1);
-  EXPECT_EQ(243, volume_.GetMicVolume());
-  CallProcess(1);
-  EXPECT_EQ(255, volume_.GetMicVolume());
-
-  // Manual change does not result in SetMicVolume call.
-  EXPECT_CALL(*agc_, GetRmsErrorDb(_))
-      .WillOnce(DoAll(SetArgPointee<0>(-1), Return(true)));
-  volume_.SetMicVolume(50);
-  EXPECT_CALL(*agc_, Reset()).Times(1);
-  CallProcess(1);
-  EXPECT_EQ(50, volume_.GetMicVolume());
-
-  // Continues working as usual afterwards.
-  EXPECT_CALL(*agc_, GetRmsErrorDb(_))
-      .WillOnce(DoAll(SetArgPointee<0>(20), Return(true)));
-  CallProcess(1);
-  EXPECT_EQ(69, volume_.GetMicVolume());
-}
-
-TEST_F(AgcManagerDirectTest, RecoveryAfterManualLevelChangeBelowMin) {
-  FirstProcess();
-
-  // Manual change below min.
-  EXPECT_CALL(*agc_, GetRmsErrorDb(_))
-      .WillOnce(DoAll(SetArgPointee<0>(-1), Return(true)));
-  // Don't set to zero, which will cause AGC to take no action.
-  volume_.SetMicVolume(1);
-  EXPECT_CALL(*agc_, Reset()).Times(1);
-  CallProcess(1);
-  EXPECT_EQ(1, volume_.GetMicVolume());
-
-  // Continues working as usual afterwards.
-  EXPECT_CALL(*agc_, GetRmsErrorDb(_))
-      .WillOnce(DoAll(SetArgPointee<0>(11), Return(true)));
-  CallProcess(1);
-  EXPECT_EQ(2, volume_.GetMicVolume());
-
-  EXPECT_CALL(*agc_, GetRmsErrorDb(_))
-      .WillOnce(DoAll(SetArgPointee<0>(30), Return(true)));
-  CallProcess(1);
-  EXPECT_EQ(11, volume_.GetMicVolume());
-
-  EXPECT_CALL(*agc_, GetRmsErrorDb(_))
-      .WillOnce(DoAll(SetArgPointee<0>(20), Return(true)));
-  CallProcess(1);
-  EXPECT_EQ(18, volume_.GetMicVolume());
-}
-
-TEST_F(AgcManagerDirectTest, NoClippingHasNoImpact) {
-  FirstProcess();
-
-  EXPECT_CALL(*agc_, AnalyzePreproc(_, _)).WillRepeatedly(Return(0));
-  CallPreProc(100);
-  EXPECT_EQ(128, volume_.GetMicVolume());
-}
-
-TEST_F(AgcManagerDirectTest, ClippingUnderThresholdHasNoImpact) {
-  FirstProcess();
-
-  EXPECT_CALL(*agc_, AnalyzePreproc(_, _)).WillOnce(Return(0.099));
-  CallPreProc(1);
-  EXPECT_EQ(128, volume_.GetMicVolume());
-}
-
-TEST_F(AgcManagerDirectTest, ClippingLowersVolume) {
-  SetVolumeAndProcess(255);
-
-  EXPECT_CALL(*agc_, AnalyzePreproc(_, _)).WillOnce(Return(0.101));
-  EXPECT_CALL(*agc_, Reset()).Times(1);
-  CallPreProc(1);
-  EXPECT_EQ(240, volume_.GetMicVolume());
-}
-
-TEST_F(AgcManagerDirectTest, WaitingPeriodBetweenClippingChecks) {
-  SetVolumeAndProcess(255);
-
-  EXPECT_CALL(*agc_, AnalyzePreproc(_, _))
-      .WillOnce(Return(kAboveClippedThreshold));
-  EXPECT_CALL(*agc_, Reset()).Times(1);
-  CallPreProc(1);
-  EXPECT_EQ(240, volume_.GetMicVolume());
-
-  EXPECT_CALL(*agc_, AnalyzePreproc(_, _))
-      .WillRepeatedly(Return(kAboveClippedThreshold));
-  EXPECT_CALL(*agc_, Reset()).Times(0);
-  CallPreProc(300);
-  EXPECT_EQ(240, volume_.GetMicVolume());
-
-  EXPECT_CALL(*agc_, AnalyzePreproc(_, _))
-      .WillOnce(Return(kAboveClippedThreshold));
-  EXPECT_CALL(*agc_, Reset()).Times(1);
-  CallPreProc(1);
-  EXPECT_EQ(225, volume_.GetMicVolume());
-}
-
-TEST_F(AgcManagerDirectTest, ClippingLoweringIsLimited) {
-  SetVolumeAndProcess(180);
-
-  EXPECT_CALL(*agc_, AnalyzePreproc(_, _))
-      .WillOnce(Return(kAboveClippedThreshold));
-  EXPECT_CALL(*agc_, Reset()).Times(1);
-  CallPreProc(1);
-  EXPECT_EQ(kClippedMin, volume_.GetMicVolume());
-
-  EXPECT_CALL(*agc_, AnalyzePreproc(_, _))
-      .WillRepeatedly(Return(kAboveClippedThreshold));
-  EXPECT_CALL(*agc_, Reset()).Times(0);
-  CallPreProc(1000);
-  EXPECT_EQ(kClippedMin, volume_.GetMicVolume());
-}
-
-TEST_F(AgcManagerDirectTest, ClippingMaxIsRespectedWhenEqualToLevel) {
-  SetVolumeAndProcess(255);
-
-  EXPECT_CALL(*agc_, AnalyzePreproc(_, _))
-      .WillOnce(Return(kAboveClippedThreshold));
-  EXPECT_CALL(*agc_, Reset()).Times(1);
-  CallPreProc(1);
-  EXPECT_EQ(240, volume_.GetMicVolume());
-
-  EXPECT_CALL(*agc_, GetRmsErrorDb(_))
-      .WillRepeatedly(DoAll(SetArgPointee<0>(30), Return(true)));
-  CallProcess(10);
-  EXPECT_EQ(240, volume_.GetMicVolume());
-}
-
-TEST_F(AgcManagerDirectTest, ClippingMaxIsRespectedWhenHigherThanLevel) {
-  SetVolumeAndProcess(200);
-
-  EXPECT_CALL(*agc_, AnalyzePreproc(_, _))
-      .WillOnce(Return(kAboveClippedThreshold));
-  EXPECT_CALL(*agc_, Reset()).Times(1);
-  CallPreProc(1);
-  EXPECT_EQ(185, volume_.GetMicVolume());
-
-  EXPECT_CALL(*agc_, GetRmsErrorDb(_))
-      .WillRepeatedly(DoAll(SetArgPointee<0>(40), Return(true)));
-  CallProcess(1);
-  EXPECT_EQ(240, volume_.GetMicVolume());
-  CallProcess(10);
-  EXPECT_EQ(240, volume_.GetMicVolume());
-}
-
-TEST_F(AgcManagerDirectTest, MaxCompressionIsIncreasedAfterClipping) {
-  SetVolumeAndProcess(210);
-
-  EXPECT_CALL(*agc_, AnalyzePreproc(_, _))
-      .WillOnce(Return(kAboveClippedThreshold));
-  EXPECT_CALL(*agc_, Reset()).Times(1);
-  CallPreProc(1);
-  EXPECT_EQ(195, volume_.GetMicVolume());
-
-  EXPECT_CALL(*agc_, GetRmsErrorDb(_))
-      .WillOnce(DoAll(SetArgPointee<0>(11), Return(true)))
-      .WillOnce(DoAll(SetArgPointee<0>(11), Return(true)))
-      .WillOnce(DoAll(SetArgPointee<0>(11), Return(true)))
-      .WillOnce(DoAll(SetArgPointee<0>(11), Return(true)))
-      .WillOnce(DoAll(SetArgPointee<0>(11), Return(true)))
-      .WillRepeatedly(Return(false));
-  CallProcess(19);
-  EXPECT_CALL(gctrl_, set_compression_gain_db(8)).WillOnce(Return(0));
-  CallProcess(20);
-  EXPECT_CALL(gctrl_, set_compression_gain_db(9)).WillOnce(Return(0));
-  CallProcess(20);
-  EXPECT_CALL(gctrl_, set_compression_gain_db(10)).WillOnce(Return(0));
-  CallProcess(20);
-  EXPECT_CALL(gctrl_, set_compression_gain_db(11)).WillOnce(Return(0));
-  CallProcess(20);
-  EXPECT_CALL(gctrl_, set_compression_gain_db(12)).WillOnce(Return(0));
-  CallProcess(20);
-  EXPECT_CALL(gctrl_, set_compression_gain_db(13)).WillOnce(Return(0));
-  CallProcess(1);
-
-  // Continue clipping until we hit the maximum surplus compression.
-  CallPreProc(300);
-  EXPECT_CALL(*agc_, AnalyzePreproc(_, _))
-      .WillOnce(Return(kAboveClippedThreshold));
-  EXPECT_CALL(*agc_, Reset()).Times(1);
-  CallPreProc(1);
-  EXPECT_EQ(180, volume_.GetMicVolume());
-
-  CallPreProc(300);
-  EXPECT_CALL(*agc_, AnalyzePreproc(_, _))
-      .WillOnce(Return(kAboveClippedThreshold));
-  EXPECT_CALL(*agc_, Reset()).Times(1);
-  CallPreProc(1);
-  EXPECT_EQ(kClippedMin, volume_.GetMicVolume());
-
-  // Current level is now at the minimum, but the maximum allowed level still
-  // has more to decrease.
-  CallPreProc(300);
-  EXPECT_CALL(*agc_, AnalyzePreproc(_, _))
-      .WillOnce(Return(kAboveClippedThreshold));
-  CallPreProc(1);
-
-  CallPreProc(300);
-  EXPECT_CALL(*agc_, AnalyzePreproc(_, _))
-      .WillOnce(Return(kAboveClippedThreshold));
-  CallPreProc(1);
-
-  CallPreProc(300);
-  EXPECT_CALL(*agc_, AnalyzePreproc(_, _))
-      .WillOnce(Return(kAboveClippedThreshold));
-  CallPreProc(1);
-
-  EXPECT_CALL(*agc_, GetRmsErrorDb(_))
-      .WillOnce(DoAll(SetArgPointee<0>(16), Return(true)))
-      .WillOnce(DoAll(SetArgPointee<0>(16), Return(true)))
-      .WillOnce(DoAll(SetArgPointee<0>(16), Return(true)))
-      .WillOnce(DoAll(SetArgPointee<0>(16), Return(true)))
-      .WillRepeatedly(Return(false));
-  CallProcess(19);
-  EXPECT_CALL(gctrl_, set_compression_gain_db(14)).WillOnce(Return(0));
-  CallProcess(20);
-  EXPECT_CALL(gctrl_, set_compression_gain_db(15)).WillOnce(Return(0));
-  CallProcess(20);
-  EXPECT_CALL(gctrl_, set_compression_gain_db(16)).WillOnce(Return(0));
-  CallProcess(20);
-  EXPECT_CALL(gctrl_, set_compression_gain_db(17)).WillOnce(Return(0));
-  CallProcess(20);
-  EXPECT_CALL(gctrl_, set_compression_gain_db(18)).WillOnce(Return(0));
-  CallProcess(1);
-}
-
-TEST_F(AgcManagerDirectTest, UserCanRaiseVolumeAfterClipping) {
-  SetVolumeAndProcess(225);
-
-  EXPECT_CALL(*agc_, AnalyzePreproc(_, _))
-      .WillOnce(Return(kAboveClippedThreshold));
-  EXPECT_CALL(*agc_, Reset()).Times(1);
-  CallPreProc(1);
-  EXPECT_EQ(210, volume_.GetMicVolume());
-
-  // High enough error to trigger a volume check.
-  EXPECT_CALL(*agc_, GetRmsErrorDb(_))
-      .WillOnce(DoAll(SetArgPointee<0>(14), Return(true)));
-  // User changed the volume.
-  volume_.SetMicVolume(250);
-  EXPECT_CALL(*agc_, Reset()).Times(1);
-  CallProcess(1);
-  EXPECT_EQ(250, volume_.GetMicVolume());
-
-  // Move down...
-  EXPECT_CALL(*agc_, GetRmsErrorDb(_))
-      .WillOnce(DoAll(SetArgPointee<0>(-10), Return(true)));
-  CallProcess(1);
-  EXPECT_EQ(210, volume_.GetMicVolume());
-  // And back up to the new max established by the user.
-  EXPECT_CALL(*agc_, GetRmsErrorDb(_))
-      .WillOnce(DoAll(SetArgPointee<0>(40), Return(true)));
-  CallProcess(1);
-  EXPECT_EQ(250, volume_.GetMicVolume());
-  // Will not move above new maximum.
-  EXPECT_CALL(*agc_, GetRmsErrorDb(_))
-      .WillOnce(DoAll(SetArgPointee<0>(30), Return(true)));
-  CallProcess(1);
-  EXPECT_EQ(250, volume_.GetMicVolume());
-}
-
-TEST_F(AgcManagerDirectTest, ClippingDoesNotPullLowVolumeBackUp) {
-  SetVolumeAndProcess(80);
-
-  EXPECT_CALL(*agc_, AnalyzePreproc(_, _))
-      .WillOnce(Return(kAboveClippedThreshold));
-  EXPECT_CALL(*agc_, Reset()).Times(0);
-  int initial_volume = volume_.GetMicVolume();
-  CallPreProc(1);
-  EXPECT_EQ(initial_volume, volume_.GetMicVolume());
-}
-
-TEST_F(AgcManagerDirectTest, TakesNoActionOnZeroMicVolume) {
-  FirstProcess();
-
-  EXPECT_CALL(*agc_, GetRmsErrorDb(_))
-      .WillRepeatedly(DoAll(SetArgPointee<0>(30), Return(true)));
-  volume_.SetMicVolume(0);
-  CallProcess(10);
-  EXPECT_EQ(0, volume_.GetMicVolume());
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/agc/gain_map_internal.h b/modules/audio_processing/agc/gain_map_internal.h
deleted file mode 100644
index 53c71c1..0000000
--- a/modules/audio_processing/agc/gain_map_internal.h
+++ /dev/null
@@ -1,275 +0,0 @@
-/*
- *  Copyright (c) 2013 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_PROCESSING_AGC_GAIN_MAP_INTERNAL_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_AGC_GAIN_MAP_INTERNAL_H_
-
-static const int kGainMapSize = 256;
-// Uses parameters: si = 2, sf = 0.25, D = 8/256
-static const int kGainMap[kGainMapSize] = {
-  -56,
-  -54,
-  -52,
-  -50,
-  -48,
-  -47,
-  -45,
-  -43,
-  -42,
-  -40,
-  -38,
-  -37,
-  -35,
-  -34,
-  -33,
-  -31,
-  -30,
-  -29,
-  -27,
-  -26,
-  -25,
-  -24,
-  -23,
-  -22,
-  -20,
-  -19,
-  -18,
-  -17,
-  -16,
-  -15,
-  -14,
-  -14,
-  -13,
-  -12,
-  -11,
-  -10,
-  -9,
-  -8,
-  -8,
-  -7,
-  -6,
-  -5,
-  -5,
-  -4,
-  -3,
-  -2,
-  -2,
-  -1,
-  0,
-  0,
-  1,
-  1,
-  2,
-  3,
-  3,
-  4,
-  4,
-  5,
-  5,
-  6,
-  6,
-  7,
-  7,
-  8,
-  8,
-  9,
-  9,
-  10,
-  10,
-  11,
-  11,
-  12,
-  12,
-  13,
-  13,
-  13,
-  14,
-  14,
-  15,
-  15,
-  15,
-  16,
-  16,
-  17,
-  17,
-  17,
-  18,
-  18,
-  18,
-  19,
-  19,
-  19,
-  20,
-  20,
-  21,
-  21,
-  21,
-  22,
-  22,
-  22,
-  23,
-  23,
-  23,
-  24,
-  24,
-  24,
-  24,
-  25,
-  25,
-  25,
-  26,
-  26,
-  26,
-  27,
-  27,
-  27,
-  28,
-  28,
-  28,
-  28,
-  29,
-  29,
-  29,
-  30,
-  30,
-  30,
-  30,
-  31,
-  31,
-  31,
-  32,
-  32,
-  32,
-  32,
-  33,
-  33,
-  33,
-  33,
-  34,
-  34,
-  34,
-  35,
-  35,
-  35,
-  35,
-  36,
-  36,
-  36,
-  36,
-  37,
-  37,
-  37,
-  38,
-  38,
-  38,
-  38,
-  39,
-  39,
-  39,
-  39,
-  40,
-  40,
-  40,
-  40,
-  41,
-  41,
-  41,
-  41,
-  42,
-  42,
-  42,
-  42,
-  43,
-  43,
-  43,
-  44,
-  44,
-  44,
-  44,
-  45,
-  45,
-  45,
-  45,
-  46,
-  46,
-  46,
-  46,
-  47,
-  47,
-  47,
-  47,
-  48,
-  48,
-  48,
-  48,
-  49,
-  49,
-  49,
-  49,
-  50,
-  50,
-  50,
-  50,
-  51,
-  51,
-  51,
-  51,
-  52,
-  52,
-  52,
-  52,
-  53,
-  53,
-  53,
-  53,
-  54,
-  54,
-  54,
-  54,
-  55,
-  55,
-  55,
-  55,
-  56,
-  56,
-  56,
-  56,
-  57,
-  57,
-  57,
-  57,
-  58,
-  58,
-  58,
-  58,
-  59,
-  59,
-  59,
-  59,
-  60,
-  60,
-  60,
-  60,
-  61,
-  61,
-  61,
-  61,
-  62,
-  62,
-  62,
-  62,
-  63,
-  63,
-  63,
-  63,
-  64
-};
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_AGC_GAIN_MAP_INTERNAL_H_
diff --git a/modules/audio_processing/agc/legacy/analog_agc.c b/modules/audio_processing/agc/legacy/analog_agc.c
deleted file mode 100644
index 92b3e00..0000000
--- a/modules/audio_processing/agc/legacy/analog_agc.c
+++ /dev/null
@@ -1,1390 +0,0 @@
-/*
- *  Copyright (c) 2012 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.
- */
-
-/* analog_agc.c
- *
- * Using a feedback system, determines an appropriate analog volume level
- * given an input signal and current volume level. Targets a conservative
- * signal level and is intended for use with a digital AGC to apply
- * additional gain.
- *
- */
-
-#include "webrtc/modules/audio_processing/agc/legacy/analog_agc.h"
-
-#include <stdlib.h>
-#ifdef WEBRTC_AGC_DEBUG_DUMP
-#include <stdio.h>
-#endif
-
-#include "webrtc/rtc_base/checks.h"
-
-/* The slope of in Q13*/
-static const int16_t kSlope1[8] = {21793, 12517, 7189, 4129,
-                                   2372,  1362,  472,  78};
-
-/* The offset in Q14 */
-static const int16_t kOffset1[8] = {25395, 23911, 22206, 20737,
-                                    19612, 18805, 17951, 17367};
-
-/* The slope of in Q13*/
-static const int16_t kSlope2[8] = {2063, 1731, 1452, 1218, 1021, 857, 597, 337};
-
-/* The offset in Q14 */
-static const int16_t kOffset2[8] = {18432, 18379, 18290, 18177,
-                                    18052, 17920, 17670, 17286};
-
-static const int16_t kMuteGuardTimeMs = 8000;
-static const int16_t kInitCheck = 42;
-static const size_t kNumSubframes = 10;
-
-/* Default settings if config is not used */
-#define AGC_DEFAULT_TARGET_LEVEL 3
-#define AGC_DEFAULT_COMP_GAIN 9
-/* This is the target level for the analog part in ENV scale. To convert to RMS
- * scale you
- * have to add OFFSET_ENV_TO_RMS.
- */
-#define ANALOG_TARGET_LEVEL 11
-#define ANALOG_TARGET_LEVEL_2 5  // ANALOG_TARGET_LEVEL / 2
-/* Offset between RMS scale (analog part) and ENV scale (digital part). This
- * value actually
- * varies with the FIXED_ANALOG_TARGET_LEVEL, hence we should in the future
- * replace it with
- * a table.
- */
-#define OFFSET_ENV_TO_RMS 9
-/* The reference input level at which the digital part gives an output of
- * targetLevelDbfs
- * (desired level) if we have no compression gain. This level should be set high
- * enough not
- * to compress the peaks due to the dynamics.
- */
-#define DIGITAL_REF_AT_0_COMP_GAIN 4
-/* Speed of reference level decrease.
- */
-#define DIFF_REF_TO_ANALOG 5
-
-#ifdef MIC_LEVEL_FEEDBACK
-#define NUM_BLOCKS_IN_SAT_BEFORE_CHANGE_TARGET 7
-#endif
-/* Size of analog gain table */
-#define GAIN_TBL_LEN 32
-/* Matlab code:
- * fprintf(1, '\t%i, %i, %i, %i,\n', round(10.^(linspace(0,10,32)/20) * 2^12));
- */
-/* Q12 */
-static const uint16_t kGainTableAnalog[GAIN_TBL_LEN] = {
-    4096, 4251, 4412, 4579,  4752,  4932,  5118,  5312,  5513,  5722, 5938,
-    6163, 6396, 6638, 6889,  7150,  7420,  7701,  7992,  8295,  8609, 8934,
-    9273, 9623, 9987, 10365, 10758, 11165, 11587, 12025, 12480, 12953};
-
-/* Gain/Suppression tables for virtual Mic (in Q10) */
-static const uint16_t kGainTableVirtualMic[128] = {
-    1052,  1081,  1110,  1141,  1172,  1204,  1237,  1271,  1305,  1341,  1378,
-    1416,  1454,  1494,  1535,  1577,  1620,  1664,  1710,  1757,  1805,  1854,
-    1905,  1957,  2010,  2065,  2122,  2180,  2239,  2301,  2364,  2428,  2495,
-    2563,  2633,  2705,  2779,  2855,  2933,  3013,  3096,  3180,  3267,  3357,
-    3449,  3543,  3640,  3739,  3842,  3947,  4055,  4166,  4280,  4397,  4517,
-    4640,  4767,  4898,  5032,  5169,  5311,  5456,  5605,  5758,  5916,  6078,
-    6244,  6415,  6590,  6770,  6956,  7146,  7341,  7542,  7748,  7960,  8178,
-    8402,  8631,  8867,  9110,  9359,  9615,  9878,  10148, 10426, 10711, 11004,
-    11305, 11614, 11932, 12258, 12593, 12938, 13292, 13655, 14029, 14412, 14807,
-    15212, 15628, 16055, 16494, 16945, 17409, 17885, 18374, 18877, 19393, 19923,
-    20468, 21028, 21603, 22194, 22801, 23425, 24065, 24724, 25400, 26095, 26808,
-    27541, 28295, 29069, 29864, 30681, 31520, 32382};
-static const uint16_t kSuppressionTableVirtualMic[128] = {
-    1024, 1006, 988, 970, 952, 935, 918, 902, 886, 870, 854, 839, 824, 809, 794,
-    780,  766,  752, 739, 726, 713, 700, 687, 675, 663, 651, 639, 628, 616, 605,
-    594,  584,  573, 563, 553, 543, 533, 524, 514, 505, 496, 487, 478, 470, 461,
-    453,  445,  437, 429, 421, 414, 406, 399, 392, 385, 378, 371, 364, 358, 351,
-    345,  339,  333, 327, 321, 315, 309, 304, 298, 293, 288, 283, 278, 273, 268,
-    263,  258,  254, 249, 244, 240, 236, 232, 227, 223, 219, 215, 211, 208, 204,
-    200,  197,  193, 190, 186, 183, 180, 176, 173, 170, 167, 164, 161, 158, 155,
-    153,  150,  147, 145, 142, 139, 137, 134, 132, 130, 127, 125, 123, 121, 118,
-    116,  114,  112, 110, 108, 106, 104, 102};
-
-/* Table for target energy levels. Values in Q(-7)
- * Matlab code
- * targetLevelTable = fprintf('%d,\t%d,\t%d,\t%d,\n',
- * round((32767*10.^(-(0:63)'/20)).^2*16/2^7) */
-
-static const int32_t kTargetLevelTable[64] = {
-    134209536, 106606424, 84680493, 67264106, 53429779, 42440782, 33711911,
-    26778323,  21270778,  16895980, 13420954, 10660642, 8468049,  6726411,
-    5342978,   4244078,   3371191,  2677832,  2127078,  1689598,  1342095,
-    1066064,   846805,    672641,   534298,   424408,   337119,   267783,
-    212708,    168960,    134210,   106606,   84680,    67264,    53430,
-    42441,     33712,     26778,    21271,    16896,    13421,    10661,
-    8468,      6726,      5343,     4244,     3371,     2678,     2127,
-    1690,      1342,      1066,     847,      673,      534,      424,
-    337,       268,       213,      169,      134,      107,      85,
-    67};
-
-int WebRtcAgc_AddMic(void* state,
-                     int16_t* const* in_mic,
-                     size_t num_bands,
-                     size_t samples) {
-  int32_t nrg, max_nrg, sample, tmp32;
-  int32_t* ptr;
-  uint16_t targetGainIdx, gain;
-  size_t i;
-  int16_t n, L, tmp16, tmp_speech[16];
-  LegacyAgc* stt;
-  stt = (LegacyAgc*)state;
-
-  if (stt->fs == 8000) {
-    L = 8;
-    if (samples != 80) {
-      return -1;
-    }
-  } else {
-    L = 16;
-    if (samples != 160) {
-      return -1;
-    }
-  }
-
-  /* apply slowly varying digital gain */
-  if (stt->micVol > stt->maxAnalog) {
-    /* |maxLevel| is strictly >= |micVol|, so this condition should be
-     * satisfied here, ensuring there is no divide-by-zero. */
-    RTC_DCHECK_GT(stt->maxLevel, stt->maxAnalog);
-
-    /* Q1 */
-    tmp16 = (int16_t)(stt->micVol - stt->maxAnalog);
-    tmp32 = (GAIN_TBL_LEN - 1) * tmp16;
-    tmp16 = (int16_t)(stt->maxLevel - stt->maxAnalog);
-    targetGainIdx = tmp32 / tmp16;
-    RTC_DCHECK_LT(targetGainIdx, GAIN_TBL_LEN);
-
-    /* Increment through the table towards the target gain.
-     * If micVol drops below maxAnalog, we allow the gain
-     * to be dropped immediately. */
-    if (stt->gainTableIdx < targetGainIdx) {
-      stt->gainTableIdx++;
-    } else if (stt->gainTableIdx > targetGainIdx) {
-      stt->gainTableIdx--;
-    }
-
-    /* Q12 */
-    gain = kGainTableAnalog[stt->gainTableIdx];
-
-    for (i = 0; i < samples; i++) {
-      size_t j;
-      for (j = 0; j < num_bands; ++j) {
-        sample = (in_mic[j][i] * gain) >> 12;
-        if (sample > 32767) {
-          in_mic[j][i] = 32767;
-        } else if (sample < -32768) {
-          in_mic[j][i] = -32768;
-        } else {
-          in_mic[j][i] = (int16_t)sample;
-        }
-      }
-    }
-  } else {
-    stt->gainTableIdx = 0;
-  }
-
-  /* compute envelope */
-  if (stt->inQueue > 0) {
-    ptr = stt->env[1];
-  } else {
-    ptr = stt->env[0];
-  }
-
-  for (i = 0; i < kNumSubframes; i++) {
-    /* iterate over samples */
-    max_nrg = 0;
-    for (n = 0; n < L; n++) {
-      nrg = in_mic[0][i * L + n] * in_mic[0][i * L + n];
-      if (nrg > max_nrg) {
-        max_nrg = nrg;
-      }
-    }
-    ptr[i] = max_nrg;
-  }
-
-  /* compute energy */
-  if (stt->inQueue > 0) {
-    ptr = stt->Rxx16w32_array[1];
-  } else {
-    ptr = stt->Rxx16w32_array[0];
-  }
-
-  for (i = 0; i < kNumSubframes / 2; i++) {
-    if (stt->fs == 16000) {
-      WebRtcSpl_DownsampleBy2(&in_mic[0][i * 32], 32, tmp_speech,
-                              stt->filterState);
-    } else {
-      memcpy(tmp_speech, &in_mic[0][i * 16], 16 * sizeof(short));
-    }
-    /* Compute energy in blocks of 16 samples */
-    ptr[i] = WebRtcSpl_DotProductWithScale(tmp_speech, tmp_speech, 16, 4);
-  }
-
-  /* update queue information */
-  if (stt->inQueue == 0) {
-    stt->inQueue = 1;
-  } else {
-    stt->inQueue = 2;
-  }
-
-  /* call VAD (use low band only) */
-  WebRtcAgc_ProcessVad(&stt->vadMic, in_mic[0], samples);
-
-  return 0;
-}
-
-int WebRtcAgc_AddFarend(void* state, const int16_t* in_far, size_t samples) {
-  LegacyAgc* stt = (LegacyAgc*)state;
-
-  int err = WebRtcAgc_GetAddFarendError(state, samples);
-
-  if (err != 0)
-    return err;
-
-  return WebRtcAgc_AddFarendToDigital(&stt->digitalAgc, in_far, samples);
-}
-
-int WebRtcAgc_GetAddFarendError(void* state, size_t samples) {
-  LegacyAgc* stt;
-  stt = (LegacyAgc*)state;
-
-  if (stt == NULL)
-    return -1;
-
-  if (stt->fs == 8000) {
-    if (samples != 80)
-      return -1;
-  } else if (stt->fs == 16000 || stt->fs == 32000 || stt->fs == 48000) {
-    if (samples != 160)
-      return -1;
-  } else {
-    return -1;
-  }
-
-  return 0;
-}
-
-int WebRtcAgc_VirtualMic(void* agcInst,
-                         int16_t* const* in_near,
-                         size_t num_bands,
-                         size_t samples,
-                         int32_t micLevelIn,
-                         int32_t* micLevelOut) {
-  int32_t tmpFlt, micLevelTmp, gainIdx;
-  uint16_t gain;
-  size_t ii, j;
-  LegacyAgc* stt;
-
-  uint32_t nrg;
-  size_t sampleCntr;
-  uint32_t frameNrg = 0;
-  uint32_t frameNrgLimit = 5500;
-  int16_t numZeroCrossing = 0;
-  const int16_t kZeroCrossingLowLim = 15;
-  const int16_t kZeroCrossingHighLim = 20;
-
-  stt = (LegacyAgc*)agcInst;
-
-  /*
-   *  Before applying gain decide if this is a low-level signal.
-   *  The idea is that digital AGC will not adapt to low-level
-   *  signals.
-   */
-  if (stt->fs != 8000) {
-    frameNrgLimit = frameNrgLimit << 1;
-  }
-
-  frameNrg = (uint32_t)(in_near[0][0] * in_near[0][0]);
-  for (sampleCntr = 1; sampleCntr < samples; sampleCntr++) {
-    // increment frame energy if it is less than the limit
-    // the correct value of the energy is not important
-    if (frameNrg < frameNrgLimit) {
-      nrg = (uint32_t)(in_near[0][sampleCntr] * in_near[0][sampleCntr]);
-      frameNrg += nrg;
-    }
-
-    // Count the zero crossings
-    numZeroCrossing +=
-        ((in_near[0][sampleCntr] ^ in_near[0][sampleCntr - 1]) < 0);
-  }
-
-  if ((frameNrg < 500) || (numZeroCrossing <= 5)) {
-    stt->lowLevelSignal = 1;
-  } else if (numZeroCrossing <= kZeroCrossingLowLim) {
-    stt->lowLevelSignal = 0;
-  } else if (frameNrg <= frameNrgLimit) {
-    stt->lowLevelSignal = 1;
-  } else if (numZeroCrossing >= kZeroCrossingHighLim) {
-    stt->lowLevelSignal = 1;
-  } else {
-    stt->lowLevelSignal = 0;
-  }
-
-  micLevelTmp = micLevelIn << stt->scale;
-  /* Set desired level */
-  gainIdx = stt->micVol;
-  if (stt->micVol > stt->maxAnalog) {
-    gainIdx = stt->maxAnalog;
-  }
-  if (micLevelTmp != stt->micRef) {
-    /* Something has happened with the physical level, restart. */
-    stt->micRef = micLevelTmp;
-    stt->micVol = 127;
-    *micLevelOut = 127;
-    stt->micGainIdx = 127;
-    gainIdx = 127;
-  }
-  /* Pre-process the signal to emulate the microphone level. */
-  /* Take one step at a time in the gain table. */
-  if (gainIdx > 127) {
-    gain = kGainTableVirtualMic[gainIdx - 128];
-  } else {
-    gain = kSuppressionTableVirtualMic[127 - gainIdx];
-  }
-  for (ii = 0; ii < samples; ii++) {
-    tmpFlt = (in_near[0][ii] * gain) >> 10;
-    if (tmpFlt > 32767) {
-      tmpFlt = 32767;
-      gainIdx--;
-      if (gainIdx >= 127) {
-        gain = kGainTableVirtualMic[gainIdx - 127];
-      } else {
-        gain = kSuppressionTableVirtualMic[127 - gainIdx];
-      }
-    }
-    if (tmpFlt < -32768) {
-      tmpFlt = -32768;
-      gainIdx--;
-      if (gainIdx >= 127) {
-        gain = kGainTableVirtualMic[gainIdx - 127];
-      } else {
-        gain = kSuppressionTableVirtualMic[127 - gainIdx];
-      }
-    }
-    in_near[0][ii] = (int16_t)tmpFlt;
-    for (j = 1; j < num_bands; ++j) {
-      tmpFlt = (in_near[j][ii] * gain) >> 10;
-      if (tmpFlt > 32767) {
-        tmpFlt = 32767;
-      }
-      if (tmpFlt < -32768) {
-        tmpFlt = -32768;
-      }
-      in_near[j][ii] = (int16_t)tmpFlt;
-    }
-  }
-  /* Set the level we (finally) used */
-  stt->micGainIdx = gainIdx;
-  //    *micLevelOut = stt->micGainIdx;
-  *micLevelOut = stt->micGainIdx >> stt->scale;
-  /* Add to Mic as if it was the output from a true microphone */
-  if (WebRtcAgc_AddMic(agcInst, in_near, num_bands, samples) != 0) {
-    return -1;
-  }
-  return 0;
-}
-
-void WebRtcAgc_UpdateAgcThresholds(LegacyAgc* stt) {
-  int16_t tmp16;
-#ifdef MIC_LEVEL_FEEDBACK
-  int zeros;
-
-  if (stt->micLvlSat) {
-    /* Lower the analog target level since we have reached its maximum */
-    zeros = WebRtcSpl_NormW32(stt->Rxx160_LPw32);
-    stt->targetIdxOffset = (3 * zeros - stt->targetIdx - 2) / 4;
-  }
-#endif
-
-  /* Set analog target level in envelope dBOv scale */
-  tmp16 = (DIFF_REF_TO_ANALOG * stt->compressionGaindB) + ANALOG_TARGET_LEVEL_2;
-  tmp16 = WebRtcSpl_DivW32W16ResW16((int32_t)tmp16, ANALOG_TARGET_LEVEL);
-  stt->analogTarget = DIGITAL_REF_AT_0_COMP_GAIN + tmp16;
-  if (stt->analogTarget < DIGITAL_REF_AT_0_COMP_GAIN) {
-    stt->analogTarget = DIGITAL_REF_AT_0_COMP_GAIN;
-  }
-  if (stt->agcMode == kAgcModeFixedDigital) {
-    /* Adjust for different parameter interpretation in FixedDigital mode */
-    stt->analogTarget = stt->compressionGaindB;
-  }
-#ifdef MIC_LEVEL_FEEDBACK
-  stt->analogTarget += stt->targetIdxOffset;
-#endif
-  /* Since the offset between RMS and ENV is not constant, we should make this
-   * into a
-   * table, but for now, we'll stick with a constant, tuned for the chosen
-   * analog
-   * target level.
-   */
-  stt->targetIdx = ANALOG_TARGET_LEVEL + OFFSET_ENV_TO_RMS;
-#ifdef MIC_LEVEL_FEEDBACK
-  stt->targetIdx += stt->targetIdxOffset;
-#endif
-  /* Analog adaptation limits */
-  /* analogTargetLevel = round((32767*10^(-targetIdx/20))^2*16/2^7) */
-  stt->analogTargetLevel =
-      RXX_BUFFER_LEN * kTargetLevelTable[stt->targetIdx]; /* ex. -20 dBov */
-  stt->startUpperLimit =
-      RXX_BUFFER_LEN * kTargetLevelTable[stt->targetIdx - 1]; /* -19 dBov */
-  stt->startLowerLimit =
-      RXX_BUFFER_LEN * kTargetLevelTable[stt->targetIdx + 1]; /* -21 dBov */
-  stt->upperPrimaryLimit =
-      RXX_BUFFER_LEN * kTargetLevelTable[stt->targetIdx - 2]; /* -18 dBov */
-  stt->lowerPrimaryLimit =
-      RXX_BUFFER_LEN * kTargetLevelTable[stt->targetIdx + 2]; /* -22 dBov */
-  stt->upperSecondaryLimit =
-      RXX_BUFFER_LEN * kTargetLevelTable[stt->targetIdx - 5]; /* -15 dBov */
-  stt->lowerSecondaryLimit =
-      RXX_BUFFER_LEN * kTargetLevelTable[stt->targetIdx + 5]; /* -25 dBov */
-  stt->upperLimit = stt->startUpperLimit;
-  stt->lowerLimit = stt->startLowerLimit;
-}
-
-void WebRtcAgc_SaturationCtrl(LegacyAgc* stt,
-                              uint8_t* saturated,
-                              int32_t* env) {
-  int16_t i, tmpW16;
-
-  /* Check if the signal is saturated */
-  for (i = 0; i < 10; i++) {
-    tmpW16 = (int16_t)(env[i] >> 20);
-    if (tmpW16 > 875) {
-      stt->envSum += tmpW16;
-    }
-  }
-
-  if (stt->envSum > 25000) {
-    *saturated = 1;
-    stt->envSum = 0;
-  }
-
-  /* stt->envSum *= 0.99; */
-  stt->envSum = (int16_t)((stt->envSum * 32440) >> 15);
-}
-
-void WebRtcAgc_ZeroCtrl(LegacyAgc* stt, int32_t* inMicLevel, int32_t* env) {
-  int16_t i;
-  int64_t tmp = 0;
-  int32_t midVal;
-
-  /* Is the input signal zero? */
-  for (i = 0; i < 10; i++) {
-    tmp += env[i];
-  }
-
-  /* Each block is allowed to have a few non-zero
-   * samples.
-   */
-  if (tmp < 500) {
-    stt->msZero += 10;
-  } else {
-    stt->msZero = 0;
-  }
-
-  if (stt->muteGuardMs > 0) {
-    stt->muteGuardMs -= 10;
-  }
-
-  if (stt->msZero > 500) {
-    stt->msZero = 0;
-
-    /* Increase microphone level only if it's less than 50% */
-    midVal = (stt->maxAnalog + stt->minLevel + 1) / 2;
-    if (*inMicLevel < midVal) {
-      /* *inMicLevel *= 1.1; */
-      *inMicLevel = (1126 * *inMicLevel) >> 10;
-      /* Reduces risk of a muted mic repeatedly triggering excessive levels due
-       * to zero signal detection. */
-      *inMicLevel = WEBRTC_SPL_MIN(*inMicLevel, stt->zeroCtrlMax);
-      stt->micVol = *inMicLevel;
-    }
-
-#ifdef WEBRTC_AGC_DEBUG_DUMP
-    fprintf(stt->fpt,
-            "\t\tAGC->zeroCntrl, frame %d: 500 ms under threshold,"
-            " micVol: %d\n",
-            stt->fcount, stt->micVol);
-#endif
-
-    stt->activeSpeech = 0;
-    stt->Rxx16_LPw32Max = 0;
-
-    /* The AGC has a tendency (due to problems with the VAD parameters), to
-     * vastly increase the volume after a muting event. This timer prevents
-     * upwards adaptation for a short period. */
-    stt->muteGuardMs = kMuteGuardTimeMs;
-  }
-}
-
-void WebRtcAgc_SpeakerInactiveCtrl(LegacyAgc* stt) {
-  /* Check if the near end speaker is inactive.
-   * If that is the case the VAD threshold is
-   * increased since the VAD speech model gets
-   * more sensitive to any sound after a long
-   * silence.
-   */
-
-  int32_t tmp32;
-  int16_t vadThresh;
-
-  if (stt->vadMic.stdLongTerm < 2500) {
-    stt->vadThreshold = 1500;
-  } else {
-    vadThresh = kNormalVadThreshold;
-    if (stt->vadMic.stdLongTerm < 4500) {
-      /* Scale between min and max threshold */
-      vadThresh += (4500 - stt->vadMic.stdLongTerm) / 2;
-    }
-
-    /* stt->vadThreshold = (31 * stt->vadThreshold + vadThresh) / 32; */
-    tmp32 = vadThresh + 31 * stt->vadThreshold;
-    stt->vadThreshold = (int16_t)(tmp32 >> 5);
-  }
-}
-
-void WebRtcAgc_ExpCurve(int16_t volume, int16_t* index) {
-  // volume in Q14
-  // index in [0-7]
-  /* 8 different curves */
-  if (volume > 5243) {
-    if (volume > 7864) {
-      if (volume > 12124) {
-        *index = 7;
-      } else {
-        *index = 6;
-      }
-    } else {
-      if (volume > 6554) {
-        *index = 5;
-      } else {
-        *index = 4;
-      }
-    }
-  } else {
-    if (volume > 2621) {
-      if (volume > 3932) {
-        *index = 3;
-      } else {
-        *index = 2;
-      }
-    } else {
-      if (volume > 1311) {
-        *index = 1;
-      } else {
-        *index = 0;
-      }
-    }
-  }
-}
-
-int32_t WebRtcAgc_ProcessAnalog(void* state,
-                                int32_t inMicLevel,
-                                int32_t* outMicLevel,
-                                int16_t vadLogRatio,
-                                int16_t echo,
-                                uint8_t* saturationWarning) {
-  uint32_t tmpU32;
-  int32_t Rxx16w32, tmp32;
-  int32_t inMicLevelTmp, lastMicVol;
-  int16_t i;
-  uint8_t saturated = 0;
-  LegacyAgc* stt;
-
-  stt = (LegacyAgc*)state;
-  inMicLevelTmp = inMicLevel << stt->scale;
-
-  if (inMicLevelTmp > stt->maxAnalog) {
-#ifdef WEBRTC_AGC_DEBUG_DUMP
-    fprintf(stt->fpt, "\tAGC->ProcessAnalog, frame %d: micLvl > maxAnalog\n",
-            stt->fcount);
-#endif
-    return -1;
-  } else if (inMicLevelTmp < stt->minLevel) {
-#ifdef WEBRTC_AGC_DEBUG_DUMP
-    fprintf(stt->fpt, "\tAGC->ProcessAnalog, frame %d: micLvl < minLevel\n",
-            stt->fcount);
-#endif
-    return -1;
-  }
-
-  if (stt->firstCall == 0) {
-    int32_t tmpVol;
-    stt->firstCall = 1;
-    tmp32 = ((stt->maxLevel - stt->minLevel) * 51) >> 9;
-    tmpVol = (stt->minLevel + tmp32);
-
-    /* If the mic level is very low at start, increase it! */
-    if ((inMicLevelTmp < tmpVol) && (stt->agcMode == kAgcModeAdaptiveAnalog)) {
-      inMicLevelTmp = tmpVol;
-    }
-    stt->micVol = inMicLevelTmp;
-  }
-
-  /* Set the mic level to the previous output value if there is digital input
-   * gain */
-  if ((inMicLevelTmp == stt->maxAnalog) && (stt->micVol > stt->maxAnalog)) {
-    inMicLevelTmp = stt->micVol;
-  }
-
-  /* If the mic level was manually changed to a very low value raise it! */
-  if ((inMicLevelTmp != stt->micVol) && (inMicLevelTmp < stt->minOutput)) {
-    tmp32 = ((stt->maxLevel - stt->minLevel) * 51) >> 9;
-    inMicLevelTmp = (stt->minLevel + tmp32);
-    stt->micVol = inMicLevelTmp;
-#ifdef MIC_LEVEL_FEEDBACK
-// stt->numBlocksMicLvlSat = 0;
-#endif
-#ifdef WEBRTC_AGC_DEBUG_DUMP
-    fprintf(stt->fpt,
-            "\tAGC->ProcessAnalog, frame %d: micLvl < minLevel by manual"
-            " decrease, raise vol\n",
-            stt->fcount);
-#endif
-  }
-
-  if (inMicLevelTmp != stt->micVol) {
-    if (inMicLevel == stt->lastInMicLevel) {
-      // We requested a volume adjustment, but it didn't occur. This is
-      // probably due to a coarse quantization of the volume slider.
-      // Restore the requested value to prevent getting stuck.
-      inMicLevelTmp = stt->micVol;
-    } else {
-      // As long as the value changed, update to match.
-      stt->micVol = inMicLevelTmp;
-    }
-  }
-
-  if (inMicLevelTmp > stt->maxLevel) {
-    // Always allow the user to raise the volume above the maxLevel.
-    stt->maxLevel = inMicLevelTmp;
-  }
-
-  // Store last value here, after we've taken care of manual updates etc.
-  stt->lastInMicLevel = inMicLevel;
-  lastMicVol = stt->micVol;
-
-  /* Checks if the signal is saturated. Also a check if individual samples
-   * are larger than 12000 is done. If they are the counter for increasing
-   * the volume level is set to -100ms
-   */
-  WebRtcAgc_SaturationCtrl(stt, &saturated, stt->env[0]);
-
-  /* The AGC is always allowed to lower the level if the signal is saturated */
-  if (saturated == 1) {
-    /* Lower the recording level
-     * Rxx160_LP is adjusted down because it is so slow it could
-     * cause the AGC to make wrong decisions. */
-    /* stt->Rxx160_LPw32 *= 0.875; */
-    stt->Rxx160_LPw32 = (stt->Rxx160_LPw32 / 8) * 7;
-
-    stt->zeroCtrlMax = stt->micVol;
-
-    /* stt->micVol *= 0.903; */
-    tmp32 = inMicLevelTmp - stt->minLevel;
-    tmpU32 = WEBRTC_SPL_UMUL(29591, (uint32_t)(tmp32));
-    stt->micVol = (tmpU32 >> 15) + stt->minLevel;
-    if (stt->micVol > lastMicVol - 2) {
-      stt->micVol = lastMicVol - 2;
-    }
-    inMicLevelTmp = stt->micVol;
-
-#ifdef WEBRTC_AGC_DEBUG_DUMP
-    fprintf(stt->fpt,
-            "\tAGC->ProcessAnalog, frame %d: saturated, micVol = %d\n",
-            stt->fcount, stt->micVol);
-#endif
-
-    if (stt->micVol < stt->minOutput) {
-      *saturationWarning = 1;
-    }
-
-    /* Reset counter for decrease of volume level to avoid
-     * decreasing too much. The saturation control can still
-     * lower the level if needed. */
-    stt->msTooHigh = -100;
-
-    /* Enable the control mechanism to ensure that our measure,
-     * Rxx160_LP, is in the correct range. This must be done since
-     * the measure is very slow. */
-    stt->activeSpeech = 0;
-    stt->Rxx16_LPw32Max = 0;
-
-    /* Reset to initial values */
-    stt->msecSpeechInnerChange = kMsecSpeechInner;
-    stt->msecSpeechOuterChange = kMsecSpeechOuter;
-    stt->changeToSlowMode = 0;
-
-    stt->muteGuardMs = 0;
-
-    stt->upperLimit = stt->startUpperLimit;
-    stt->lowerLimit = stt->startLowerLimit;
-#ifdef MIC_LEVEL_FEEDBACK
-// stt->numBlocksMicLvlSat = 0;
-#endif
-  }
-
-  /* Check if the input speech is zero. If so the mic volume
-   * is increased. On some computers the input is zero up as high
-   * level as 17% */
-  WebRtcAgc_ZeroCtrl(stt, &inMicLevelTmp, stt->env[0]);
-
-  /* Check if the near end speaker is inactive.
-   * If that is the case the VAD threshold is
-   * increased since the VAD speech model gets
-   * more sensitive to any sound after a long
-   * silence.
-   */
-  WebRtcAgc_SpeakerInactiveCtrl(stt);
-
-  for (i = 0; i < 5; i++) {
-    /* Computed on blocks of 16 samples */
-
-    Rxx16w32 = stt->Rxx16w32_array[0][i];
-
-    /* Rxx160w32 in Q(-7) */
-    tmp32 = (Rxx16w32 - stt->Rxx16_vectorw32[stt->Rxx16pos]) >> 3;
-    stt->Rxx160w32 = stt->Rxx160w32 + tmp32;
-    stt->Rxx16_vectorw32[stt->Rxx16pos] = Rxx16w32;
-
-    /* Circular buffer */
-    stt->Rxx16pos++;
-    if (stt->Rxx16pos == RXX_BUFFER_LEN) {
-      stt->Rxx16pos = 0;
-    }
-
-    /* Rxx16_LPw32 in Q(-4) */
-    tmp32 = (Rxx16w32 - stt->Rxx16_LPw32) >> kAlphaShortTerm;
-    stt->Rxx16_LPw32 = (stt->Rxx16_LPw32) + tmp32;
-
-    if (vadLogRatio > stt->vadThreshold) {
-      /* Speech detected! */
-
-      /* Check if Rxx160_LP is in the correct range. If
-       * it is too high/low then we set it to the maximum of
-       * Rxx16_LPw32 during the first 200ms of speech.
-       */
-      if (stt->activeSpeech < 250) {
-        stt->activeSpeech += 2;
-
-        if (stt->Rxx16_LPw32 > stt->Rxx16_LPw32Max) {
-          stt->Rxx16_LPw32Max = stt->Rxx16_LPw32;
-        }
-      } else if (stt->activeSpeech == 250) {
-        stt->activeSpeech += 2;
-        tmp32 = stt->Rxx16_LPw32Max >> 3;
-        stt->Rxx160_LPw32 = tmp32 * RXX_BUFFER_LEN;
-      }
-
-      tmp32 = (stt->Rxx160w32 - stt->Rxx160_LPw32) >> kAlphaLongTerm;
-      stt->Rxx160_LPw32 = stt->Rxx160_LPw32 + tmp32;
-
-      if (stt->Rxx160_LPw32 > stt->upperSecondaryLimit) {
-        stt->msTooHigh += 2;
-        stt->msTooLow = 0;
-        stt->changeToSlowMode = 0;
-
-        if (stt->msTooHigh > stt->msecSpeechOuterChange) {
-          stt->msTooHigh = 0;
-
-          /* Lower the recording level */
-          /* Multiply by 0.828125 which corresponds to decreasing ~0.8dB */
-          tmp32 = stt->Rxx160_LPw32 >> 6;
-          stt->Rxx160_LPw32 = tmp32 * 53;
-
-          /* Reduce the max gain to avoid excessive oscillation
-           * (but never drop below the maximum analog level).
-           */
-          stt->maxLevel = (15 * stt->maxLevel + stt->micVol) / 16;
-          stt->maxLevel = WEBRTC_SPL_MAX(stt->maxLevel, stt->maxAnalog);
-
-          stt->zeroCtrlMax = stt->micVol;
-
-          /* 0.95 in Q15 */
-          tmp32 = inMicLevelTmp - stt->minLevel;
-          tmpU32 = WEBRTC_SPL_UMUL(31130, (uint32_t)(tmp32));
-          stt->micVol = (tmpU32 >> 15) + stt->minLevel;
-          if (stt->micVol > lastMicVol - 1) {
-            stt->micVol = lastMicVol - 1;
-          }
-          inMicLevelTmp = stt->micVol;
-
-          /* Enable the control mechanism to ensure that our measure,
-           * Rxx160_LP, is in the correct range.
-           */
-          stt->activeSpeech = 0;
-          stt->Rxx16_LPw32Max = 0;
-#ifdef MIC_LEVEL_FEEDBACK
-// stt->numBlocksMicLvlSat = 0;
-#endif
-#ifdef WEBRTC_AGC_DEBUG_DUMP
-          fprintf(stt->fpt,
-                  "\tAGC->ProcessAnalog, frame %d: measure >"
-                  " 2ndUpperLim, micVol = %d, maxLevel = %d\n",
-                  stt->fcount, stt->micVol, stt->maxLevel);
-#endif
-        }
-      } else if (stt->Rxx160_LPw32 > stt->upperLimit) {
-        stt->msTooHigh += 2;
-        stt->msTooLow = 0;
-        stt->changeToSlowMode = 0;
-
-        if (stt->msTooHigh > stt->msecSpeechInnerChange) {
-          /* Lower the recording level */
-          stt->msTooHigh = 0;
-          /* Multiply by 0.828125 which corresponds to decreasing ~0.8dB */
-          stt->Rxx160_LPw32 = (stt->Rxx160_LPw32 / 64) * 53;
-
-          /* Reduce the max gain to avoid excessive oscillation
-           * (but never drop below the maximum analog level).
-           */
-          stt->maxLevel = (15 * stt->maxLevel + stt->micVol) / 16;
-          stt->maxLevel = WEBRTC_SPL_MAX(stt->maxLevel, stt->maxAnalog);
-
-          stt->zeroCtrlMax = stt->micVol;
-
-          /* 0.965 in Q15 */
-          tmp32 = inMicLevelTmp - stt->minLevel;
-          tmpU32 =
-              WEBRTC_SPL_UMUL(31621, (uint32_t)(inMicLevelTmp - stt->minLevel));
-          stt->micVol = (tmpU32 >> 15) + stt->minLevel;
-          if (stt->micVol > lastMicVol - 1) {
-            stt->micVol = lastMicVol - 1;
-          }
-          inMicLevelTmp = stt->micVol;
-
-#ifdef MIC_LEVEL_FEEDBACK
-// stt->numBlocksMicLvlSat = 0;
-#endif
-#ifdef WEBRTC_AGC_DEBUG_DUMP
-          fprintf(stt->fpt,
-                  "\tAGC->ProcessAnalog, frame %d: measure >"
-                  " UpperLim, micVol = %d, maxLevel = %d\n",
-                  stt->fcount, stt->micVol, stt->maxLevel);
-#endif
-        }
-      } else if (stt->Rxx160_LPw32 < stt->lowerSecondaryLimit) {
-        stt->msTooHigh = 0;
-        stt->changeToSlowMode = 0;
-        stt->msTooLow += 2;
-
-        if (stt->msTooLow > stt->msecSpeechOuterChange) {
-          /* Raise the recording level */
-          int16_t index, weightFIX;
-          int16_t volNormFIX = 16384;  // =1 in Q14.
-
-          stt->msTooLow = 0;
-
-          /* Normalize the volume level */
-          tmp32 = (inMicLevelTmp - stt->minLevel) << 14;
-          if (stt->maxInit != stt->minLevel) {
-            volNormFIX = tmp32 / (stt->maxInit - stt->minLevel);
-          }
-
-          /* Find correct curve */
-          WebRtcAgc_ExpCurve(volNormFIX, &index);
-
-          /* Compute weighting factor for the volume increase, 32^(-2*X)/2+1.05
-           */
-          weightFIX =
-              kOffset1[index] - (int16_t)((kSlope1[index] * volNormFIX) >> 13);
-
-          /* stt->Rxx160_LPw32 *= 1.047 [~0.2 dB]; */
-          stt->Rxx160_LPw32 = (stt->Rxx160_LPw32 / 64) * 67;
-
-          tmp32 = inMicLevelTmp - stt->minLevel;
-          tmpU32 =
-              ((uint32_t)weightFIX * (uint32_t)(inMicLevelTmp - stt->minLevel));
-          stt->micVol = (tmpU32 >> 14) + stt->minLevel;
-          if (stt->micVol < lastMicVol + 2) {
-            stt->micVol = lastMicVol + 2;
-          }
-
-          inMicLevelTmp = stt->micVol;
-
-#ifdef MIC_LEVEL_FEEDBACK
-          /* Count ms in level saturation */
-          // if (stt->micVol > stt->maxAnalog) {
-          if (stt->micVol > 150) {
-            /* mic level is saturated */
-            stt->numBlocksMicLvlSat++;
-            fprintf(stderr, "Sat mic Level: %d\n", stt->numBlocksMicLvlSat);
-          }
-#endif
-#ifdef WEBRTC_AGC_DEBUG_DUMP
-          fprintf(stt->fpt,
-                  "\tAGC->ProcessAnalog, frame %d: measure <"
-                  " 2ndLowerLim, micVol = %d\n",
-                  stt->fcount, stt->micVol);
-#endif
-        }
-      } else if (stt->Rxx160_LPw32 < stt->lowerLimit) {
-        stt->msTooHigh = 0;
-        stt->changeToSlowMode = 0;
-        stt->msTooLow += 2;
-
-        if (stt->msTooLow > stt->msecSpeechInnerChange) {
-          /* Raise the recording level */
-          int16_t index, weightFIX;
-          int16_t volNormFIX = 16384;  // =1 in Q14.
-
-          stt->msTooLow = 0;
-
-          /* Normalize the volume level */
-          tmp32 = (inMicLevelTmp - stt->minLevel) << 14;
-          if (stt->maxInit != stt->minLevel) {
-            volNormFIX = tmp32 / (stt->maxInit - stt->minLevel);
-          }
-
-          /* Find correct curve */
-          WebRtcAgc_ExpCurve(volNormFIX, &index);
-
-          /* Compute weighting factor for the volume increase, (3.^(-2.*X))/8+1
-           */
-          weightFIX =
-              kOffset2[index] - (int16_t)((kSlope2[index] * volNormFIX) >> 13);
-
-          /* stt->Rxx160_LPw32 *= 1.047 [~0.2 dB]; */
-          stt->Rxx160_LPw32 = (stt->Rxx160_LPw32 / 64) * 67;
-
-          tmp32 = inMicLevelTmp - stt->minLevel;
-          tmpU32 =
-              ((uint32_t)weightFIX * (uint32_t)(inMicLevelTmp - stt->minLevel));
-          stt->micVol = (tmpU32 >> 14) + stt->minLevel;
-          if (stt->micVol < lastMicVol + 1) {
-            stt->micVol = lastMicVol + 1;
-          }
-
-          inMicLevelTmp = stt->micVol;
-
-#ifdef MIC_LEVEL_FEEDBACK
-          /* Count ms in level saturation */
-          // if (stt->micVol > stt->maxAnalog) {
-          if (stt->micVol > 150) {
-            /* mic level is saturated */
-            stt->numBlocksMicLvlSat++;
-            fprintf(stderr, "Sat mic Level: %d\n", stt->numBlocksMicLvlSat);
-          }
-#endif
-#ifdef WEBRTC_AGC_DEBUG_DUMP
-          fprintf(stt->fpt,
-                  "\tAGC->ProcessAnalog, frame %d: measure < LowerLim, micVol "
-                  "= %d\n",
-                  stt->fcount, stt->micVol);
-#endif
-        }
-      } else {
-        /* The signal is inside the desired range which is:
-         * lowerLimit < Rxx160_LP/640 < upperLimit
-         */
-        if (stt->changeToSlowMode > 4000) {
-          stt->msecSpeechInnerChange = 1000;
-          stt->msecSpeechOuterChange = 500;
-          stt->upperLimit = stt->upperPrimaryLimit;
-          stt->lowerLimit = stt->lowerPrimaryLimit;
-        } else {
-          stt->changeToSlowMode += 2;  // in milliseconds
-        }
-        stt->msTooLow = 0;
-        stt->msTooHigh = 0;
-
-        stt->micVol = inMicLevelTmp;
-      }
-#ifdef MIC_LEVEL_FEEDBACK
-      if (stt->numBlocksMicLvlSat > NUM_BLOCKS_IN_SAT_BEFORE_CHANGE_TARGET) {
-        stt->micLvlSat = 1;
-        fprintf(stderr, "target before = %d (%d)\n", stt->analogTargetLevel,
-                stt->targetIdx);
-        WebRtcAgc_UpdateAgcThresholds(stt);
-        WebRtcAgc_CalculateGainTable(
-            &(stt->digitalAgc.gainTable[0]), stt->compressionGaindB,
-            stt->targetLevelDbfs, stt->limiterEnable, stt->analogTarget);
-        stt->numBlocksMicLvlSat = 0;
-        stt->micLvlSat = 0;
-        fprintf(stderr, "target offset = %d\n", stt->targetIdxOffset);
-        fprintf(stderr, "target after  = %d (%d)\n", stt->analogTargetLevel,
-                stt->targetIdx);
-      }
-#endif
-    }
-  }
-
-  /* Ensure gain is not increased in presence of echo or after a mute event
-   * (but allow the zeroCtrl() increase on the frame of a mute detection).
-   */
-  if (echo == 1 ||
-      (stt->muteGuardMs > 0 && stt->muteGuardMs < kMuteGuardTimeMs)) {
-    if (stt->micVol > lastMicVol) {
-      stt->micVol = lastMicVol;
-    }
-  }
-
-  /* limit the gain */
-  if (stt->micVol > stt->maxLevel) {
-    stt->micVol = stt->maxLevel;
-  } else if (stt->micVol < stt->minOutput) {
-    stt->micVol = stt->minOutput;
-  }
-
-  *outMicLevel = WEBRTC_SPL_MIN(stt->micVol, stt->maxAnalog) >> stt->scale;
-
-  return 0;
-}
-
-int WebRtcAgc_Process(void* agcInst,
-                      const int16_t* const* in_near,
-                      size_t num_bands,
-                      size_t samples,
-                      int16_t* const* out,
-                      int32_t inMicLevel,
-                      int32_t* outMicLevel,
-                      int16_t echo,
-                      uint8_t* saturationWarning) {
-  LegacyAgc* stt;
-
-  stt = (LegacyAgc*)agcInst;
-
-  //
-  if (stt == NULL) {
-    return -1;
-  }
-  //
-
-  if (stt->fs == 8000) {
-    if (samples != 80) {
-      return -1;
-    }
-  } else if (stt->fs == 16000 || stt->fs == 32000 || stt->fs == 48000) {
-    if (samples != 160) {
-      return -1;
-    }
-  } else {
-    return -1;
-  }
-
-  *saturationWarning = 0;
-  // TODO(minyue): PUT IN RANGE CHECKING FOR INPUT LEVELS
-  *outMicLevel = inMicLevel;
-
-#ifdef WEBRTC_AGC_DEBUG_DUMP
-  stt->fcount++;
-#endif
-
-  if (WebRtcAgc_ProcessDigital(&stt->digitalAgc, in_near, num_bands, out,
-                               stt->fs, stt->lowLevelSignal) == -1) {
-#ifdef WEBRTC_AGC_DEBUG_DUMP
-    fprintf(stt->fpt, "AGC->Process, frame %d: Error from DigAGC\n\n",
-            stt->fcount);
-#endif
-    return -1;
-  }
-  if (stt->agcMode < kAgcModeFixedDigital &&
-      (stt->lowLevelSignal == 0 || stt->agcMode != kAgcModeAdaptiveDigital)) {
-    if (WebRtcAgc_ProcessAnalog(agcInst, inMicLevel, outMicLevel,
-                                stt->vadMic.logRatio, echo,
-                                saturationWarning) == -1) {
-      return -1;
-    }
-  }
-#ifdef WEBRTC_AGC_DEBUG_DUMP
-  fprintf(stt->agcLog, "%5d\t%d\t%d\t%d\t%d\n", stt->fcount, inMicLevel,
-          *outMicLevel, stt->maxLevel, stt->micVol);
-#endif
-
-  /* update queue */
-  if (stt->inQueue > 1) {
-    memcpy(stt->env[0], stt->env[1], 10 * sizeof(int32_t));
-    memcpy(stt->Rxx16w32_array[0], stt->Rxx16w32_array[1], 5 * sizeof(int32_t));
-  }
-
-  if (stt->inQueue > 0) {
-    stt->inQueue--;
-  }
-
-  return 0;
-}
-
-int WebRtcAgc_set_config(void* agcInst, WebRtcAgcConfig agcConfig) {
-  LegacyAgc* stt;
-  stt = (LegacyAgc*)agcInst;
-
-  if (stt == NULL) {
-    return -1;
-  }
-
-  if (stt->initFlag != kInitCheck) {
-    stt->lastError = AGC_UNINITIALIZED_ERROR;
-    return -1;
-  }
-
-  if (agcConfig.limiterEnable != kAgcFalse &&
-      agcConfig.limiterEnable != kAgcTrue) {
-    stt->lastError = AGC_BAD_PARAMETER_ERROR;
-    return -1;
-  }
-  stt->limiterEnable = agcConfig.limiterEnable;
-  stt->compressionGaindB = agcConfig.compressionGaindB;
-  if ((agcConfig.targetLevelDbfs < 0) || (agcConfig.targetLevelDbfs > 31)) {
-    stt->lastError = AGC_BAD_PARAMETER_ERROR;
-    return -1;
-  }
-  stt->targetLevelDbfs = agcConfig.targetLevelDbfs;
-
-  if (stt->agcMode == kAgcModeFixedDigital) {
-    /* Adjust for different parameter interpretation in FixedDigital mode */
-    stt->compressionGaindB += agcConfig.targetLevelDbfs;
-  }
-
-  /* Update threshold levels for analog adaptation */
-  WebRtcAgc_UpdateAgcThresholds(stt);
-
-  /* Recalculate gain table */
-  if (WebRtcAgc_CalculateGainTable(
-          &(stt->digitalAgc.gainTable[0]), stt->compressionGaindB,
-          stt->targetLevelDbfs, stt->limiterEnable, stt->analogTarget) == -1) {
-#ifdef WEBRTC_AGC_DEBUG_DUMP
-    fprintf(stt->fpt, "AGC->set_config, frame %d: Error from calcGainTable\n\n",
-            stt->fcount);
-#endif
-    return -1;
-  }
-  /* Store the config in a WebRtcAgcConfig */
-  stt->usedConfig.compressionGaindB = agcConfig.compressionGaindB;
-  stt->usedConfig.limiterEnable = agcConfig.limiterEnable;
-  stt->usedConfig.targetLevelDbfs = agcConfig.targetLevelDbfs;
-
-  return 0;
-}
-
-int WebRtcAgc_get_config(void* agcInst, WebRtcAgcConfig* config) {
-  LegacyAgc* stt;
-  stt = (LegacyAgc*)agcInst;
-
-  if (stt == NULL) {
-    return -1;
-  }
-
-  if (config == NULL) {
-    stt->lastError = AGC_NULL_POINTER_ERROR;
-    return -1;
-  }
-
-  if (stt->initFlag != kInitCheck) {
-    stt->lastError = AGC_UNINITIALIZED_ERROR;
-    return -1;
-  }
-
-  config->limiterEnable = stt->usedConfig.limiterEnable;
-  config->targetLevelDbfs = stt->usedConfig.targetLevelDbfs;
-  config->compressionGaindB = stt->usedConfig.compressionGaindB;
-
-  return 0;
-}
-
-void* WebRtcAgc_Create() {
-  LegacyAgc* stt = malloc(sizeof(LegacyAgc));
-
-#ifdef WEBRTC_AGC_DEBUG_DUMP
-  stt->fpt = fopen("./agc_test_log.txt", "wt");
-  stt->agcLog = fopen("./agc_debug_log.txt", "wt");
-  stt->digitalAgc.logFile = fopen("./agc_log.txt", "wt");
-#endif
-
-  stt->initFlag = 0;
-  stt->lastError = 0;
-
-  return stt;
-}
-
-void WebRtcAgc_Free(void* state) {
-  LegacyAgc* stt;
-
-  stt = (LegacyAgc*)state;
-#ifdef WEBRTC_AGC_DEBUG_DUMP
-  fclose(stt->fpt);
-  fclose(stt->agcLog);
-  fclose(stt->digitalAgc.logFile);
-#endif
-  free(stt);
-}
-
-/* minLevel     - Minimum volume level
- * maxLevel     - Maximum volume level
- */
-int WebRtcAgc_Init(void* agcInst,
-                   int32_t minLevel,
-                   int32_t maxLevel,
-                   int16_t agcMode,
-                   uint32_t fs) {
-  int32_t max_add, tmp32;
-  int16_t i;
-  int tmpNorm;
-  LegacyAgc* stt;
-
-  /* typecast state pointer */
-  stt = (LegacyAgc*)agcInst;
-
-  if (WebRtcAgc_InitDigital(&stt->digitalAgc, agcMode) != 0) {
-    stt->lastError = AGC_UNINITIALIZED_ERROR;
-    return -1;
-  }
-
-  /* Analog AGC variables */
-  stt->envSum = 0;
-
-/* mode     = 0 - Only saturation protection
- *            1 - Analog Automatic Gain Control [-targetLevelDbfs (default -3
- * dBOv)]
- *            2 - Digital Automatic Gain Control [-targetLevelDbfs (default -3
- * dBOv)]
- *            3 - Fixed Digital Gain [compressionGaindB (default 8 dB)]
- */
-#ifdef WEBRTC_AGC_DEBUG_DUMP
-  stt->fcount = 0;
-  fprintf(stt->fpt, "AGC->Init\n");
-#endif
-  if (agcMode < kAgcModeUnchanged || agcMode > kAgcModeFixedDigital) {
-#ifdef WEBRTC_AGC_DEBUG_DUMP
-    fprintf(stt->fpt, "AGC->Init: error, incorrect mode\n\n");
-#endif
-    return -1;
-  }
-  stt->agcMode = agcMode;
-  stt->fs = fs;
-
-  /* initialize input VAD */
-  WebRtcAgc_InitVad(&stt->vadMic);
-
-  /* If the volume range is smaller than 0-256 then
-   * the levels are shifted up to Q8-domain */
-  tmpNorm = WebRtcSpl_NormU32((uint32_t)maxLevel);
-  stt->scale = tmpNorm - 23;
-  if (stt->scale < 0) {
-    stt->scale = 0;
-  }
-  // TODO(bjornv): Investigate if we really need to scale up a small range now
-  // when we have
-  // a guard against zero-increments. For now, we do not support scale up (scale
-  // = 0).
-  stt->scale = 0;
-  maxLevel <<= stt->scale;
-  minLevel <<= stt->scale;
-
-  /* Make minLevel and maxLevel static in AdaptiveDigital */
-  if (stt->agcMode == kAgcModeAdaptiveDigital) {
-    minLevel = 0;
-    maxLevel = 255;
-    stt->scale = 0;
-  }
-  /* The maximum supplemental volume range is based on a vague idea
-   * of how much lower the gain will be than the real analog gain. */
-  max_add = (maxLevel - minLevel) / 4;
-
-  /* Minimum/maximum volume level that can be set */
-  stt->minLevel = minLevel;
-  stt->maxAnalog = maxLevel;
-  stt->maxLevel = maxLevel + max_add;
-  stt->maxInit = stt->maxLevel;
-
-  stt->zeroCtrlMax = stt->maxAnalog;
-  stt->lastInMicLevel = 0;
-
-  /* Initialize micVol parameter */
-  stt->micVol = stt->maxAnalog;
-  if (stt->agcMode == kAgcModeAdaptiveDigital) {
-    stt->micVol = 127; /* Mid-point of mic level */
-  }
-  stt->micRef = stt->micVol;
-  stt->micGainIdx = 127;
-#ifdef MIC_LEVEL_FEEDBACK
-  stt->numBlocksMicLvlSat = 0;
-  stt->micLvlSat = 0;
-#endif
-#ifdef WEBRTC_AGC_DEBUG_DUMP
-  fprintf(stt->fpt, "AGC->Init: minLevel = %d, maxAnalog = %d, maxLevel = %d\n",
-          stt->minLevel, stt->maxAnalog, stt->maxLevel);
-#endif
-
-  /* Minimum output volume is 4% higher than the available lowest volume level
-   */
-  tmp32 = ((stt->maxLevel - stt->minLevel) * 10) >> 8;
-  stt->minOutput = (stt->minLevel + tmp32);
-
-  stt->msTooLow = 0;
-  stt->msTooHigh = 0;
-  stt->changeToSlowMode = 0;
-  stt->firstCall = 0;
-  stt->msZero = 0;
-  stt->muteGuardMs = 0;
-  stt->gainTableIdx = 0;
-
-  stt->msecSpeechInnerChange = kMsecSpeechInner;
-  stt->msecSpeechOuterChange = kMsecSpeechOuter;
-
-  stt->activeSpeech = 0;
-  stt->Rxx16_LPw32Max = 0;
-
-  stt->vadThreshold = kNormalVadThreshold;
-  stt->inActive = 0;
-
-  for (i = 0; i < RXX_BUFFER_LEN; i++) {
-    stt->Rxx16_vectorw32[i] = (int32_t)1000; /* -54dBm0 */
-  }
-  stt->Rxx160w32 =
-      125 * RXX_BUFFER_LEN; /* (stt->Rxx16_vectorw32[0]>>3) = 125 */
-
-  stt->Rxx16pos = 0;
-  stt->Rxx16_LPw32 = (int32_t)16284; /* Q(-4) */
-
-  for (i = 0; i < 5; i++) {
-    stt->Rxx16w32_array[0][i] = 0;
-  }
-  for (i = 0; i < 10; i++) {
-    stt->env[0][i] = 0;
-    stt->env[1][i] = 0;
-  }
-  stt->inQueue = 0;
-
-#ifdef MIC_LEVEL_FEEDBACK
-  stt->targetIdxOffset = 0;
-#endif
-
-  WebRtcSpl_MemSetW32(stt->filterState, 0, 8);
-
-  stt->initFlag = kInitCheck;
-  // Default config settings.
-  stt->defaultConfig.limiterEnable = kAgcTrue;
-  stt->defaultConfig.targetLevelDbfs = AGC_DEFAULT_TARGET_LEVEL;
-  stt->defaultConfig.compressionGaindB = AGC_DEFAULT_COMP_GAIN;
-
-  if (WebRtcAgc_set_config(stt, stt->defaultConfig) == -1) {
-    stt->lastError = AGC_UNSPECIFIED_ERROR;
-    return -1;
-  }
-  stt->Rxx160_LPw32 = stt->analogTargetLevel;  // Initialize rms value
-
-  stt->lowLevelSignal = 0;
-
-  /* Only positive values are allowed that are not too large */
-  if ((minLevel >= maxLevel) || (maxLevel & 0xFC000000)) {
-#ifdef WEBRTC_AGC_DEBUG_DUMP
-    fprintf(stt->fpt, "minLevel, maxLevel value(s) are invalid\n\n");
-#endif
-    return -1;
-  } else {
-#ifdef WEBRTC_AGC_DEBUG_DUMP
-    fprintf(stt->fpt, "\n");
-#endif
-    return 0;
-  }
-}
diff --git a/modules/audio_processing/agc/legacy/analog_agc.h b/modules/audio_processing/agc/legacy/analog_agc.h
deleted file mode 100644
index 235fd14..0000000
--- a/modules/audio_processing/agc/legacy/analog_agc.h
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- *  Copyright (c) 2011 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_PROCESSING_AGC_LEGACY_ANALOG_AGC_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_AGC_LEGACY_ANALOG_AGC_H_
-
-//#define MIC_LEVEL_FEEDBACK
-#ifdef WEBRTC_AGC_DEBUG_DUMP
-#include <stdio.h>
-#endif
-
-#include "webrtc/modules/audio_processing/agc/legacy/digital_agc.h"
-#include "webrtc/modules/audio_processing/agc/legacy/gain_control.h"
-#include "webrtc/typedefs.h"
-
-/* Analog Automatic Gain Control variables:
- * Constant declarations (inner limits inside which no changes are done)
- * In the beginning the range is narrower to widen as soon as the measure
- * 'Rxx160_LP' is inside it. Currently the starting limits are -22.2+/-1dBm0
- * and the final limits -22.2+/-2.5dBm0. These levels makes the speech signal
- * go towards -25.4dBm0 (-31.4dBov). Tuned with wbfile-31.4dBov.pcm
- * The limits are created by running the AGC with a file having the desired
- * signal level and thereafter plotting Rxx160_LP in the dBm0-domain defined
- * by out=10*log10(in/260537279.7); Set the target level to the average level
- * of our measure Rxx160_LP. Remember that the levels are in blocks of 16 in
- * Q(-7). (Example matlab code: round(db2pow(-21.2)*16/2^7) )
- */
-#define RXX_BUFFER_LEN 10
-
-static const int16_t kMsecSpeechInner = 520;
-static const int16_t kMsecSpeechOuter = 340;
-
-static const int16_t kNormalVadThreshold = 400;
-
-static const int16_t kAlphaShortTerm = 6;  // 1 >> 6 = 0.0156
-static const int16_t kAlphaLongTerm = 10;  // 1 >> 10 = 0.000977
-
-typedef struct {
-  // Configurable parameters/variables
-  uint32_t fs;                // Sampling frequency
-  int16_t compressionGaindB;  // Fixed gain level in dB
-  int16_t targetLevelDbfs;    // Target level in -dBfs of envelope (default -3)
-  int16_t agcMode;            // Hard coded mode (adaptAna/adaptDig/fixedDig)
-  uint8_t limiterEnable;      // Enabling limiter (on/off (default off))
-  WebRtcAgcConfig defaultConfig;
-  WebRtcAgcConfig usedConfig;
-
-  // General variables
-  int16_t initFlag;
-  int16_t lastError;
-
-  // Target level parameters
-  // Based on the above: analogTargetLevel = round((32767*10^(-22/20))^2*16/2^7)
-  int32_t analogTargetLevel;    // = RXX_BUFFER_LEN * 846805;       -22 dBfs
-  int32_t startUpperLimit;      // = RXX_BUFFER_LEN * 1066064;      -21 dBfs
-  int32_t startLowerLimit;      // = RXX_BUFFER_LEN * 672641;       -23 dBfs
-  int32_t upperPrimaryLimit;    // = RXX_BUFFER_LEN * 1342095;      -20 dBfs
-  int32_t lowerPrimaryLimit;    // = RXX_BUFFER_LEN * 534298;       -24 dBfs
-  int32_t upperSecondaryLimit;  // = RXX_BUFFER_LEN * 2677832;      -17 dBfs
-  int32_t lowerSecondaryLimit;  // = RXX_BUFFER_LEN * 267783;       -27 dBfs
-  uint16_t targetIdx;           // Table index for corresponding target level
-#ifdef MIC_LEVEL_FEEDBACK
-  uint16_t targetIdxOffset;  // Table index offset for level compensation
-#endif
-  int16_t analogTarget;  // Digital reference level in ENV scale
-
-  // Analog AGC specific variables
-  int32_t filterState[8];  // For downsampling wb to nb
-  int32_t upperLimit;      // Upper limit for mic energy
-  int32_t lowerLimit;      // Lower limit for mic energy
-  int32_t Rxx160w32;       // Average energy for one frame
-  int32_t Rxx16_LPw32;     // Low pass filtered subframe energies
-  int32_t Rxx160_LPw32;    // Low pass filtered frame energies
-  int32_t Rxx16_LPw32Max;  // Keeps track of largest energy subframe
-  int32_t Rxx16_vectorw32[RXX_BUFFER_LEN];  // Array with subframe energies
-  int32_t Rxx16w32_array[2][5];  // Energy values of microphone signal
-  int32_t env[2][10];            // Envelope values of subframes
-
-  int16_t Rxx16pos;          // Current position in the Rxx16_vectorw32
-  int16_t envSum;            // Filtered scaled envelope in subframes
-  int16_t vadThreshold;      // Threshold for VAD decision
-  int16_t inActive;          // Inactive time in milliseconds
-  int16_t msTooLow;          // Milliseconds of speech at a too low level
-  int16_t msTooHigh;         // Milliseconds of speech at a too high level
-  int16_t changeToSlowMode;  // Change to slow mode after some time at target
-  int16_t firstCall;         // First call to the process-function
-  int16_t msZero;            // Milliseconds of zero input
-  int16_t msecSpeechOuterChange;  // Min ms of speech between volume changes
-  int16_t msecSpeechInnerChange;  // Min ms of speech between volume changes
-  int16_t activeSpeech;           // Milliseconds of active speech
-  int16_t muteGuardMs;            // Counter to prevent mute action
-  int16_t inQueue;                // 10 ms batch indicator
-
-  // Microphone level variables
-  int32_t micRef;         // Remember ref. mic level for virtual mic
-  uint16_t gainTableIdx;  // Current position in virtual gain table
-  int32_t micGainIdx;     // Gain index of mic level to increase slowly
-  int32_t micVol;         // Remember volume between frames
-  int32_t maxLevel;       // Max possible vol level, incl dig gain
-  int32_t maxAnalog;      // Maximum possible analog volume level
-  int32_t maxInit;        // Initial value of "max"
-  int32_t minLevel;       // Minimum possible volume level
-  int32_t minOutput;      // Minimum output volume level
-  int32_t zeroCtrlMax;    // Remember max gain => don't amp low input
-  int32_t lastInMicLevel;
-
-  int16_t scale;  // Scale factor for internal volume levels
-#ifdef MIC_LEVEL_FEEDBACK
-  int16_t numBlocksMicLvlSat;
-  uint8_t micLvlSat;
-#endif
-  // Structs for VAD and digital_agc
-  AgcVad vadMic;
-  DigitalAgc digitalAgc;
-
-#ifdef WEBRTC_AGC_DEBUG_DUMP
-  FILE* fpt;
-  FILE* agcLog;
-  int32_t fcount;
-#endif
-
-  int16_t lowLevelSignal;
-} LegacyAgc;
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_AGC_LEGACY_ANALOG_AGC_H_
diff --git a/modules/audio_processing/agc/legacy/digital_agc.c b/modules/audio_processing/agc/legacy/digital_agc.c
deleted file mode 100644
index 7f59785..0000000
--- a/modules/audio_processing/agc/legacy/digital_agc.c
+++ /dev/null
@@ -1,697 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/* digital_agc.c
- *
- */
-
-#include "webrtc/modules/audio_processing/agc/legacy/digital_agc.h"
-
-#include <string.h>
-#ifdef WEBRTC_AGC_DEBUG_DUMP
-#include <stdio.h>
-#endif
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/modules/audio_processing/agc/legacy/gain_control.h"
-
-// To generate the gaintable, copy&paste the following lines to a Matlab window:
-// MaxGain = 6; MinGain = 0; CompRatio = 3; Knee = 1;
-// zeros = 0:31; lvl = 2.^(1-zeros);
-// A = -10*log10(lvl) * (CompRatio - 1) / CompRatio;
-// B = MaxGain - MinGain;
-// gains = round(2^16*10.^(0.05 * (MinGain + B * (
-// log(exp(-Knee*A)+exp(-Knee*B)) - log(1+exp(-Knee*B)) ) /
-// log(1/(1+exp(Knee*B))))));
-// fprintf(1, '\t%i, %i, %i, %i,\n', gains);
-// % Matlab code for plotting the gain and input/output level characteristic
-// (copy/paste the following 3 lines):
-// in = 10*log10(lvl); out = 20*log10(gains/65536);
-// subplot(121); plot(in, out); axis([-30, 0, -5, 20]); grid on; xlabel('Input
-// (dB)'); ylabel('Gain (dB)');
-// subplot(122); plot(in, in+out); axis([-30, 0, -30, 5]); grid on;
-// xlabel('Input (dB)'); ylabel('Output (dB)');
-// zoom on;
-
-// Generator table for y=log2(1+e^x) in Q8.
-enum { kGenFuncTableSize = 128 };
-static const uint16_t kGenFuncTable[kGenFuncTableSize] = {
-    256,   485,   786,   1126,  1484,  1849,  2217,  2586,  2955,  3324,  3693,
-    4063,  4432,  4801,  5171,  5540,  5909,  6279,  6648,  7017,  7387,  7756,
-    8125,  8495,  8864,  9233,  9603,  9972,  10341, 10711, 11080, 11449, 11819,
-    12188, 12557, 12927, 13296, 13665, 14035, 14404, 14773, 15143, 15512, 15881,
-    16251, 16620, 16989, 17359, 17728, 18097, 18466, 18836, 19205, 19574, 19944,
-    20313, 20682, 21052, 21421, 21790, 22160, 22529, 22898, 23268, 23637, 24006,
-    24376, 24745, 25114, 25484, 25853, 26222, 26592, 26961, 27330, 27700, 28069,
-    28438, 28808, 29177, 29546, 29916, 30285, 30654, 31024, 31393, 31762, 32132,
-    32501, 32870, 33240, 33609, 33978, 34348, 34717, 35086, 35456, 35825, 36194,
-    36564, 36933, 37302, 37672, 38041, 38410, 38780, 39149, 39518, 39888, 40257,
-    40626, 40996, 41365, 41734, 42104, 42473, 42842, 43212, 43581, 43950, 44320,
-    44689, 45058, 45428, 45797, 46166, 46536, 46905};
-
-static const int16_t kAvgDecayTime = 250;  // frames; < 3000
-
-int32_t WebRtcAgc_CalculateGainTable(int32_t* gainTable,       // Q16
-                                     int16_t digCompGaindB,    // Q0
-                                     int16_t targetLevelDbfs,  // Q0
-                                     uint8_t limiterEnable,
-                                     int16_t analogTarget)  // Q0
-{
-  // This function generates the compressor gain table used in the fixed digital
-  // part.
-  uint32_t tmpU32no1, tmpU32no2, absInLevel, logApprox;
-  int32_t inLevel, limiterLvl;
-  int32_t tmp32, tmp32no1, tmp32no2, numFIX, den, y32;
-  const uint16_t kLog10 = 54426;    // log2(10)     in Q14
-  const uint16_t kLog10_2 = 49321;  // 10*log10(2)  in Q14
-  const uint16_t kLogE_1 = 23637;   // log2(e)      in Q14
-  uint16_t constMaxGain;
-  uint16_t tmpU16, intPart, fracPart;
-  const int16_t kCompRatio = 3;
-  const int16_t kSoftLimiterLeft = 1;
-  int16_t limiterOffset = 0;  // Limiter offset
-  int16_t limiterIdx, limiterLvlX;
-  int16_t constLinApprox, zeroGainLvl, maxGain, diffGain;
-  int16_t i, tmp16, tmp16no1;
-  int zeros, zerosScale;
-
-  // Constants
-  //    kLogE_1 = 23637; // log2(e)      in Q14
-  //    kLog10 = 54426; // log2(10)     in Q14
-  //    kLog10_2 = 49321; // 10*log10(2)  in Q14
-
-  // Calculate maximum digital gain and zero gain level
-  tmp32no1 = (digCompGaindB - analogTarget) * (kCompRatio - 1);
-  tmp16no1 = analogTarget - targetLevelDbfs;
-  tmp16no1 +=
-      WebRtcSpl_DivW32W16ResW16(tmp32no1 + (kCompRatio >> 1), kCompRatio);
-  maxGain = WEBRTC_SPL_MAX(tmp16no1, (analogTarget - targetLevelDbfs));
-  tmp32no1 = maxGain * kCompRatio;
-  zeroGainLvl = digCompGaindB;
-  zeroGainLvl -= WebRtcSpl_DivW32W16ResW16(tmp32no1 + ((kCompRatio - 1) >> 1),
-                                           kCompRatio - 1);
-  if ((digCompGaindB <= analogTarget) && (limiterEnable)) {
-    zeroGainLvl += (analogTarget - digCompGaindB + kSoftLimiterLeft);
-    limiterOffset = 0;
-  }
-
-  // Calculate the difference between maximum gain and gain at 0dB0v:
-  //  diffGain = maxGain + (compRatio-1)*zeroGainLvl/compRatio
-  //           = (compRatio-1)*digCompGaindB/compRatio
-  tmp32no1 = digCompGaindB * (kCompRatio - 1);
-  diffGain =
-      WebRtcSpl_DivW32W16ResW16(tmp32no1 + (kCompRatio >> 1), kCompRatio);
-  if (diffGain < 0 || diffGain >= kGenFuncTableSize) {
-    RTC_DCHECK(0);
-    return -1;
-  }
-
-  // Calculate the limiter level and index:
-  //  limiterLvlX = analogTarget - limiterOffset
-  //  limiterLvl  = targetLevelDbfs + limiterOffset/compRatio
-  limiterLvlX = analogTarget - limiterOffset;
-  limiterIdx = 2 + WebRtcSpl_DivW32W16ResW16((int32_t)limiterLvlX * (1 << 13),
-                                             kLog10_2 / 2);
-  tmp16no1 =
-      WebRtcSpl_DivW32W16ResW16(limiterOffset + (kCompRatio >> 1), kCompRatio);
-  limiterLvl = targetLevelDbfs + tmp16no1;
-
-  // Calculate (through table lookup):
-  //  constMaxGain = log2(1+2^(log2(e)*diffGain)); (in Q8)
-  constMaxGain = kGenFuncTable[diffGain];  // in Q8
-
-  // Calculate a parameter used to approximate the fractional part of 2^x with a
-  // piecewise linear function in Q14:
-  //  constLinApprox = round(3/2*(4*(3-2*sqrt(2))/(log(2)^2)-0.5)*2^14);
-  constLinApprox = 22817;  // in Q14
-
-  // Calculate a denominator used in the exponential part to convert from dB to
-  // linear scale:
-  //  den = 20*constMaxGain (in Q8)
-  den = WEBRTC_SPL_MUL_16_U16(20, constMaxGain);  // in Q8
-
-  for (i = 0; i < 32; i++) {
-    // Calculate scaled input level (compressor):
-    //  inLevel =
-    //  fix((-constLog10_2*(compRatio-1)*(1-i)+fix(compRatio/2))/compRatio)
-    tmp16 = (int16_t)((kCompRatio - 1) * (i - 1));       // Q0
-    tmp32 = WEBRTC_SPL_MUL_16_U16(tmp16, kLog10_2) + 1;  // Q14
-    inLevel = WebRtcSpl_DivW32W16(tmp32, kCompRatio);    // Q14
-
-    // Calculate diffGain-inLevel, to map using the genFuncTable
-    inLevel = (int32_t)diffGain * (1 << 14) - inLevel;  // Q14
-
-    // Make calculations on abs(inLevel) and compensate for the sign afterwards.
-    absInLevel = (uint32_t)WEBRTC_SPL_ABS_W32(inLevel);  // Q14
-
-    // LUT with interpolation
-    intPart = (uint16_t)(absInLevel >> 14);
-    fracPart =
-        (uint16_t)(absInLevel & 0x00003FFF);  // extract the fractional part
-    tmpU16 = kGenFuncTable[intPart + 1] - kGenFuncTable[intPart];  // Q8
-    tmpU32no1 = tmpU16 * fracPart;                                 // Q22
-    tmpU32no1 += (uint32_t)kGenFuncTable[intPart] << 14;           // Q22
-    logApprox = tmpU32no1 >> 8;                                    // Q14
-    // Compensate for negative exponent using the relation:
-    //  log2(1 + 2^-x) = log2(1 + 2^x) - x
-    if (inLevel < 0) {
-      zeros = WebRtcSpl_NormU32(absInLevel);
-      zerosScale = 0;
-      if (zeros < 15) {
-        // Not enough space for multiplication
-        tmpU32no2 = absInLevel >> (15 - zeros);                 // Q(zeros-1)
-        tmpU32no2 = WEBRTC_SPL_UMUL_32_16(tmpU32no2, kLogE_1);  // Q(zeros+13)
-        if (zeros < 9) {
-          zerosScale = 9 - zeros;
-          tmpU32no1 >>= zerosScale;  // Q(zeros+13)
-        } else {
-          tmpU32no2 >>= zeros - 9;  // Q22
-        }
-      } else {
-        tmpU32no2 = WEBRTC_SPL_UMUL_32_16(absInLevel, kLogE_1);  // Q28
-        tmpU32no2 >>= 6;                                         // Q22
-      }
-      logApprox = 0;
-      if (tmpU32no2 < tmpU32no1) {
-        logApprox = (tmpU32no1 - tmpU32no2) >> (8 - zerosScale);  // Q14
-      }
-    }
-    numFIX = (maxGain * constMaxGain) * (1 << 6);  // Q14
-    numFIX -= (int32_t)logApprox * diffGain;       // Q14
-
-    // Calculate ratio
-    // Shift |numFIX| as much as possible.
-    // Ensure we avoid wrap-around in |den| as well.
-    if (numFIX > (den >> 8) || -numFIX > (den >> 8))  // |den| is Q8.
-    {
-      zeros = WebRtcSpl_NormW32(numFIX);
-    } else {
-      zeros = WebRtcSpl_NormW32(den) + 8;
-    }
-    numFIX *= 1 << zeros;  // Q(14+zeros)
-
-    // Shift den so we end up in Qy1
-    tmp32no1 = WEBRTC_SPL_SHIFT_W32(den, zeros - 9);  // Q(zeros - 1)
-    y32 = numFIX / tmp32no1;  // in Q15
-    // This is to do rounding in Q14.
-    y32 = y32 >= 0 ? (y32 + 1) >> 1 : -((-y32 + 1) >> 1);
-
-    if (limiterEnable && (i < limiterIdx)) {
-      tmp32 = WEBRTC_SPL_MUL_16_U16(i - 1, kLog10_2);  // Q14
-      tmp32 -= limiterLvl * (1 << 14);                 // Q14
-      y32 = WebRtcSpl_DivW32W16(tmp32 + 10, 20);
-    }
-    if (y32 > 39000) {
-      tmp32 = (y32 >> 1) * kLog10 + 4096;  // in Q27
-      tmp32 >>= 13;                        // In Q14.
-    } else {
-      tmp32 = y32 * kLog10 + 8192;  // in Q28
-      tmp32 >>= 14;                 // In Q14.
-    }
-    tmp32 += 16 << 14;  // in Q14 (Make sure final output is in Q16)
-
-    // Calculate power
-    if (tmp32 > 0) {
-      intPart = (int16_t)(tmp32 >> 14);
-      fracPart = (uint16_t)(tmp32 & 0x00003FFF);  // in Q14
-      if ((fracPart >> 13) != 0) {
-        tmp16 = (2 << 14) - constLinApprox;
-        tmp32no2 = (1 << 14) - fracPart;
-        tmp32no2 *= tmp16;
-        tmp32no2 >>= 13;
-        tmp32no2 = (1 << 14) - tmp32no2;
-      } else {
-        tmp16 = constLinApprox - (1 << 14);
-        tmp32no2 = (fracPart * tmp16) >> 13;
-      }
-      fracPart = (uint16_t)tmp32no2;
-      gainTable[i] =
-          (1 << intPart) + WEBRTC_SPL_SHIFT_W32(fracPart, intPart - 14);
-    } else {
-      gainTable[i] = 0;
-    }
-  }
-
-  return 0;
-}
-
-int32_t WebRtcAgc_InitDigital(DigitalAgc* stt, int16_t agcMode) {
-  if (agcMode == kAgcModeFixedDigital) {
-    // start at minimum to find correct gain faster
-    stt->capacitorSlow = 0;
-  } else {
-    // start out with 0 dB gain
-    stt->capacitorSlow = 134217728;  // (int32_t)(0.125f * 32768.0f * 32768.0f);
-  }
-  stt->capacitorFast = 0;
-  stt->gain = 65536;
-  stt->gatePrevious = 0;
-  stt->agcMode = agcMode;
-#ifdef WEBRTC_AGC_DEBUG_DUMP
-  stt->frameCounter = 0;
-#endif
-
-  // initialize VADs
-  WebRtcAgc_InitVad(&stt->vadNearend);
-  WebRtcAgc_InitVad(&stt->vadFarend);
-
-  return 0;
-}
-
-int32_t WebRtcAgc_AddFarendToDigital(DigitalAgc* stt,
-                                     const int16_t* in_far,
-                                     size_t nrSamples) {
-  RTC_DCHECK(stt);
-  // VAD for far end
-  WebRtcAgc_ProcessVad(&stt->vadFarend, in_far, nrSamples);
-
-  return 0;
-}
-
-int32_t WebRtcAgc_ProcessDigital(DigitalAgc* stt,
-                                 const int16_t* const* in_near,
-                                 size_t num_bands,
-                                 int16_t* const* out,
-                                 uint32_t FS,
-                                 int16_t lowlevelSignal) {
-  // array for gains (one value per ms, incl start & end)
-  int32_t gains[11];
-
-  int32_t out_tmp, tmp32;
-  int32_t env[10];
-  int32_t max_nrg;
-  int32_t cur_level;
-  int32_t gain32, delta;
-  int16_t logratio;
-  int16_t lower_thr, upper_thr;
-  int16_t zeros = 0, zeros_fast, frac = 0;
-  int16_t decay;
-  int16_t gate, gain_adj;
-  int16_t k;
-  size_t n, i, L;
-  int16_t L2;  // samples/subframe
-
-  // determine number of samples per ms
-  if (FS == 8000) {
-    L = 8;
-    L2 = 3;
-  } else if (FS == 16000 || FS == 32000 || FS == 48000) {
-    L = 16;
-    L2 = 4;
-  } else {
-    return -1;
-  }
-
-  for (i = 0; i < num_bands; ++i) {
-    if (in_near[i] != out[i]) {
-      // Only needed if they don't already point to the same place.
-      memcpy(out[i], in_near[i], 10 * L * sizeof(in_near[i][0]));
-    }
-  }
-  // VAD for near end
-  logratio = WebRtcAgc_ProcessVad(&stt->vadNearend, out[0], L * 10);
-
-  // Account for far end VAD
-  if (stt->vadFarend.counter > 10) {
-    tmp32 = 3 * logratio;
-    logratio = (int16_t)((tmp32 - stt->vadFarend.logRatio) >> 2);
-  }
-
-  // Determine decay factor depending on VAD
-  //  upper_thr = 1.0f;
-  //  lower_thr = 0.25f;
-  upper_thr = 1024;  // Q10
-  lower_thr = 0;     // Q10
-  if (logratio > upper_thr) {
-    // decay = -2^17 / DecayTime;  ->  -65
-    decay = -65;
-  } else if (logratio < lower_thr) {
-    decay = 0;
-  } else {
-    // decay = (int16_t)(((lower_thr - logratio)
-    //       * (2^27/(DecayTime*(upper_thr-lower_thr)))) >> 10);
-    // SUBSTITUTED: 2^27/(DecayTime*(upper_thr-lower_thr))  ->  65
-    tmp32 = (lower_thr - logratio) * 65;
-    decay = (int16_t)(tmp32 >> 10);
-  }
-
-  // adjust decay factor for long silence (detected as low standard deviation)
-  // This is only done in the adaptive modes
-  if (stt->agcMode != kAgcModeFixedDigital) {
-    if (stt->vadNearend.stdLongTerm < 4000) {
-      decay = 0;
-    } else if (stt->vadNearend.stdLongTerm < 8096) {
-      // decay = (int16_t)(((stt->vadNearend.stdLongTerm - 4000) * decay) >>
-      // 12);
-      tmp32 = (stt->vadNearend.stdLongTerm - 4000) * decay;
-      decay = (int16_t)(tmp32 >> 12);
-    }
-
-    if (lowlevelSignal != 0) {
-      decay = 0;
-    }
-  }
-#ifdef WEBRTC_AGC_DEBUG_DUMP
-  stt->frameCounter++;
-  fprintf(stt->logFile, "%5.2f\t%d\t%d\t%d\t", (float)(stt->frameCounter) / 100,
-          logratio, decay, stt->vadNearend.stdLongTerm);
-#endif
-  // Find max amplitude per sub frame
-  // iterate over sub frames
-  for (k = 0; k < 10; k++) {
-    // iterate over samples
-    max_nrg = 0;
-    for (n = 0; n < L; n++) {
-      int32_t nrg = out[0][k * L + n] * out[0][k * L + n];
-      if (nrg > max_nrg) {
-        max_nrg = nrg;
-      }
-    }
-    env[k] = max_nrg;
-  }
-
-  // Calculate gain per sub frame
-  gains[0] = stt->gain;
-  for (k = 0; k < 10; k++) {
-    // Fast envelope follower
-    //  decay time = -131000 / -1000 = 131 (ms)
-    stt->capacitorFast =
-        AGC_SCALEDIFF32(-1000, stt->capacitorFast, stt->capacitorFast);
-    if (env[k] > stt->capacitorFast) {
-      stt->capacitorFast = env[k];
-    }
-    // Slow envelope follower
-    if (env[k] > stt->capacitorSlow) {
-      // increase capacitorSlow
-      stt->capacitorSlow = AGC_SCALEDIFF32(500, (env[k] - stt->capacitorSlow),
-                                           stt->capacitorSlow);
-    } else {
-      // decrease capacitorSlow
-      stt->capacitorSlow =
-          AGC_SCALEDIFF32(decay, stt->capacitorSlow, stt->capacitorSlow);
-    }
-
-    // use maximum of both capacitors as current level
-    if (stt->capacitorFast > stt->capacitorSlow) {
-      cur_level = stt->capacitorFast;
-    } else {
-      cur_level = stt->capacitorSlow;
-    }
-    // Translate signal level into gain, using a piecewise linear approximation
-    // find number of leading zeros
-    zeros = WebRtcSpl_NormU32((uint32_t)cur_level);
-    if (cur_level == 0) {
-      zeros = 31;
-    }
-    tmp32 = (cur_level << zeros) & 0x7FFFFFFF;
-    frac = (int16_t)(tmp32 >> 19);  // Q12.
-    tmp32 = (stt->gainTable[zeros - 1] - stt->gainTable[zeros]) * frac;
-    gains[k + 1] = stt->gainTable[zeros] + (tmp32 >> 12);
-#ifdef WEBRTC_AGC_DEBUG_DUMP
-    if (k == 0) {
-      fprintf(stt->logFile, "%d\t%d\t%d\t%d\t%d\n", env[0], cur_level,
-              stt->capacitorFast, stt->capacitorSlow, zeros);
-    }
-#endif
-  }
-
-  // Gate processing (lower gain during absence of speech)
-  zeros = (zeros << 9) - (frac >> 3);
-  // find number of leading zeros
-  zeros_fast = WebRtcSpl_NormU32((uint32_t)stt->capacitorFast);
-  if (stt->capacitorFast == 0) {
-    zeros_fast = 31;
-  }
-  tmp32 = (stt->capacitorFast << zeros_fast) & 0x7FFFFFFF;
-  zeros_fast <<= 9;
-  zeros_fast -= (int16_t)(tmp32 >> 22);
-
-  gate = 1000 + zeros_fast - zeros - stt->vadNearend.stdShortTerm;
-
-  if (gate < 0) {
-    stt->gatePrevious = 0;
-  } else {
-    tmp32 = stt->gatePrevious * 7;
-    gate = (int16_t)((gate + tmp32) >> 3);
-    stt->gatePrevious = gate;
-  }
-  // gate < 0     -> no gate
-  // gate > 2500  -> max gate
-  if (gate > 0) {
-    if (gate < 2500) {
-      gain_adj = (2500 - gate) >> 5;
-    } else {
-      gain_adj = 0;
-    }
-    for (k = 0; k < 10; k++) {
-      if ((gains[k + 1] - stt->gainTable[0]) > 8388608) {
-        // To prevent wraparound
-        tmp32 = (gains[k + 1] - stt->gainTable[0]) >> 8;
-        tmp32 *= 178 + gain_adj;
-      } else {
-        tmp32 = (gains[k + 1] - stt->gainTable[0]) * (178 + gain_adj);
-        tmp32 >>= 8;
-      }
-      gains[k + 1] = stt->gainTable[0] + tmp32;
-    }
-  }
-
-  // Limit gain to avoid overload distortion
-  for (k = 0; k < 10; k++) {
-    // To prevent wrap around
-    zeros = 10;
-    if (gains[k + 1] > 47453132) {
-      zeros = 16 - WebRtcSpl_NormW32(gains[k + 1]);
-    }
-    gain32 = (gains[k + 1] >> zeros) + 1;
-    gain32 *= gain32;
-    // check for overflow
-    while (AGC_MUL32((env[k] >> 12) + 1, gain32) >
-           WEBRTC_SPL_SHIFT_W32((int32_t)32767, 2 * (1 - zeros + 10))) {
-      // multiply by 253/256 ==> -0.1 dB
-      if (gains[k + 1] > 8388607) {
-        // Prevent wrap around
-        gains[k + 1] = (gains[k + 1] / 256) * 253;
-      } else {
-        gains[k + 1] = (gains[k + 1] * 253) / 256;
-      }
-      gain32 = (gains[k + 1] >> zeros) + 1;
-      gain32 *= gain32;
-    }
-  }
-  // gain reductions should be done 1 ms earlier than gain increases
-  for (k = 1; k < 10; k++) {
-    if (gains[k] > gains[k + 1]) {
-      gains[k] = gains[k + 1];
-    }
-  }
-  // save start gain for next frame
-  stt->gain = gains[10];
-
-  // Apply gain
-  // handle first sub frame separately
-  delta = (gains[1] - gains[0]) * (1 << (4 - L2));
-  gain32 = gains[0] * (1 << 4);
-  // iterate over samples
-  for (n = 0; n < L; n++) {
-    for (i = 0; i < num_bands; ++i) {
-      tmp32 = out[i][n] * ((gain32 + 127) >> 7);
-      out_tmp = tmp32 >> 16;
-      if (out_tmp > 4095) {
-        out[i][n] = (int16_t)32767;
-      } else if (out_tmp < -4096) {
-        out[i][n] = (int16_t)-32768;
-      } else {
-        tmp32 = out[i][n] * (gain32 >> 4);
-        out[i][n] = (int16_t)(tmp32 >> 16);
-      }
-    }
-    //
-
-    gain32 += delta;
-  }
-  // iterate over subframes
-  for (k = 1; k < 10; k++) {
-    delta = (gains[k + 1] - gains[k]) * (1 << (4 - L2));
-    gain32 = gains[k] * (1 << 4);
-    // iterate over samples
-    for (n = 0; n < L; n++) {
-      for (i = 0; i < num_bands; ++i) {
-        int64_t tmp64 = ((int64_t)(out[i][k * L + n])) * (gain32 >> 4);
-        tmp64 = tmp64 >> 16;
-        if (tmp64 > 32767) {
-          out[i][k * L + n] = 32767;
-        }
-        else if (tmp64 < -32768) {
-          out[i][k * L + n] = -32768;
-        }
-        else {
-          out[i][k * L + n] = (int16_t)(tmp64);
-        }
-      }
-      gain32 += delta;
-    }
-  }
-
-  return 0;
-}
-
-void WebRtcAgc_InitVad(AgcVad* state) {
-  int16_t k;
-
-  state->HPstate = 0;   // state of high pass filter
-  state->logRatio = 0;  // log( P(active) / P(inactive) )
-  // average input level (Q10)
-  state->meanLongTerm = 15 << 10;
-
-  // variance of input level (Q8)
-  state->varianceLongTerm = 500 << 8;
-
-  state->stdLongTerm = 0;  // standard deviation of input level in dB
-  // short-term average input level (Q10)
-  state->meanShortTerm = 15 << 10;
-
-  // short-term variance of input level (Q8)
-  state->varianceShortTerm = 500 << 8;
-
-  state->stdShortTerm =
-      0;               // short-term standard deviation of input level in dB
-  state->counter = 3;  // counts updates
-  for (k = 0; k < 8; k++) {
-    // downsampling filter
-    state->downState[k] = 0;
-  }
-}
-
-int16_t WebRtcAgc_ProcessVad(AgcVad* state,      // (i) VAD state
-                             const int16_t* in,  // (i) Speech signal
-                             size_t nrSamples)   // (i) number of samples
-{
-  int32_t out, nrg, tmp32, tmp32b;
-  uint16_t tmpU16;
-  int16_t k, subfr, tmp16;
-  int16_t buf1[8];
-  int16_t buf2[4];
-  int16_t HPstate;
-  int16_t zeros, dB;
-
-  // process in 10 sub frames of 1 ms (to save on memory)
-  nrg = 0;
-  HPstate = state->HPstate;
-  for (subfr = 0; subfr < 10; subfr++) {
-    // downsample to 4 kHz
-    if (nrSamples == 160) {
-      for (k = 0; k < 8; k++) {
-        tmp32 = (int32_t)in[2 * k] + (int32_t)in[2 * k + 1];
-        tmp32 >>= 1;
-        buf1[k] = (int16_t)tmp32;
-      }
-      in += 16;
-
-      WebRtcSpl_DownsampleBy2(buf1, 8, buf2, state->downState);
-    } else {
-      WebRtcSpl_DownsampleBy2(in, 8, buf2, state->downState);
-      in += 8;
-    }
-
-    // high pass filter and compute energy
-    for (k = 0; k < 4; k++) {
-      out = buf2[k] + HPstate;
-      tmp32 = 600 * out;
-      HPstate = (int16_t)((tmp32 >> 10) - buf2[k]);
-      nrg += (out * out) >> 6;
-    }
-  }
-  state->HPstate = HPstate;
-
-  // find number of leading zeros
-  if (!(0xFFFF0000 & nrg)) {
-    zeros = 16;
-  } else {
-    zeros = 0;
-  }
-  if (!(0xFF000000 & (nrg << zeros))) {
-    zeros += 8;
-  }
-  if (!(0xF0000000 & (nrg << zeros))) {
-    zeros += 4;
-  }
-  if (!(0xC0000000 & (nrg << zeros))) {
-    zeros += 2;
-  }
-  if (!(0x80000000 & (nrg << zeros))) {
-    zeros += 1;
-  }
-
-  // energy level (range {-32..30}) (Q10)
-  dB = (15 - zeros) << 11;
-
-  // Update statistics
-
-  if (state->counter < kAvgDecayTime) {
-    // decay time = AvgDecTime * 10 ms
-    state->counter++;
-  }
-
-  // update short-term estimate of mean energy level (Q10)
-  tmp32 = state->meanShortTerm * 15 + dB;
-  state->meanShortTerm = (int16_t)(tmp32 >> 4);
-
-  // update short-term estimate of variance in energy level (Q8)
-  tmp32 = (dB * dB) >> 12;
-  tmp32 += state->varianceShortTerm * 15;
-  state->varianceShortTerm = tmp32 / 16;
-
-  // update short-term estimate of standard deviation in energy level (Q10)
-  tmp32 = state->meanShortTerm * state->meanShortTerm;
-  tmp32 = (state->varianceShortTerm << 12) - tmp32;
-  state->stdShortTerm = (int16_t)WebRtcSpl_Sqrt(tmp32);
-
-  // update long-term estimate of mean energy level (Q10)
-  tmp32 = state->meanLongTerm * state->counter + dB;
-  state->meanLongTerm =
-      WebRtcSpl_DivW32W16ResW16(tmp32, WebRtcSpl_AddSatW16(state->counter, 1));
-
-  // update long-term estimate of variance in energy level (Q8)
-  tmp32 = (dB * dB) >> 12;
-  tmp32 += state->varianceLongTerm * state->counter;
-  state->varianceLongTerm =
-      WebRtcSpl_DivW32W16(tmp32, WebRtcSpl_AddSatW16(state->counter, 1));
-
-  // update long-term estimate of standard deviation in energy level (Q10)
-  tmp32 = state->meanLongTerm * state->meanLongTerm;
-  tmp32 = (state->varianceLongTerm << 12) - tmp32;
-  state->stdLongTerm = (int16_t)WebRtcSpl_Sqrt(tmp32);
-
-  // update voice activity measure (Q10)
-  tmp16 = 3 << 12;
-  // TODO(bjornv): (dB - state->meanLongTerm) can overflow, e.g., in
-  // ApmTest.Process unit test. Previously the macro WEBRTC_SPL_MUL_16_16()
-  // was used, which did an intermediate cast to (int16_t), hence losing
-  // significant bits. This cause logRatio to max out positive, rather than
-  // negative. This is a bug, but has very little significance.
-  tmp32 = tmp16 * (int16_t)(dB - state->meanLongTerm);
-  tmp32 = WebRtcSpl_DivW32W16(tmp32, state->stdLongTerm);
-  tmpU16 = (13 << 12);
-  tmp32b = WEBRTC_SPL_MUL_16_U16(state->logRatio, tmpU16);
-  tmp32 += tmp32b >> 10;
-
-  state->logRatio = (int16_t)(tmp32 >> 6);
-
-  // limit
-  if (state->logRatio > 2048) {
-    state->logRatio = 2048;
-  }
-  if (state->logRatio < -2048) {
-    state->logRatio = -2048;
-  }
-
-  return state->logRatio;  // Q10
-}
diff --git a/modules/audio_processing/agc/legacy/digital_agc.h b/modules/audio_processing/agc/legacy/digital_agc.h
deleted file mode 100644
index 4664b59..0000000
--- a/modules/audio_processing/agc/legacy/digital_agc.h
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- *  Copyright (c) 2011 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_PROCESSING_AGC_LEGACY_DIGITAL_AGC_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_AGC_LEGACY_DIGITAL_AGC_H_
-
-#ifdef WEBRTC_AGC_DEBUG_DUMP
-#include <stdio.h>
-#endif
-#include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
-#include "webrtc/typedefs.h"
-
-// the 32 most significant bits of A(19) * B(26) >> 13
-#define AGC_MUL32(A, B) (((B) >> 13) * (A) + (((0x00001FFF & (B)) * (A)) >> 13))
-// C + the 32 most significant bits of A * B
-#define AGC_SCALEDIFF32(A, B, C) \
-  ((C) + ((B) >> 16) * (A) + (((0x0000FFFF & (B)) * (A)) >> 16))
-
-typedef struct {
-  int32_t downState[8];
-  int16_t HPstate;
-  int16_t counter;
-  int16_t logRatio;           // log( P(active) / P(inactive) ) (Q10)
-  int16_t meanLongTerm;       // Q10
-  int32_t varianceLongTerm;   // Q8
-  int16_t stdLongTerm;        // Q10
-  int16_t meanShortTerm;      // Q10
-  int32_t varianceShortTerm;  // Q8
-  int16_t stdShortTerm;       // Q10
-} AgcVad;                     // total = 54 bytes
-
-typedef struct {
-  int32_t capacitorSlow;
-  int32_t capacitorFast;
-  int32_t gain;
-  int32_t gainTable[32];
-  int16_t gatePrevious;
-  int16_t agcMode;
-  AgcVad vadNearend;
-  AgcVad vadFarend;
-#ifdef WEBRTC_AGC_DEBUG_DUMP
-  FILE* logFile;
-  int frameCounter;
-#endif
-} DigitalAgc;
-
-int32_t WebRtcAgc_InitDigital(DigitalAgc* digitalAgcInst, int16_t agcMode);
-
-int32_t WebRtcAgc_ProcessDigital(DigitalAgc* digitalAgcInst,
-                                 const int16_t* const* inNear,
-                                 size_t num_bands,
-                                 int16_t* const* out,
-                                 uint32_t FS,
-                                 int16_t lowLevelSignal);
-
-int32_t WebRtcAgc_AddFarendToDigital(DigitalAgc* digitalAgcInst,
-                                     const int16_t* inFar,
-                                     size_t nrSamples);
-
-void WebRtcAgc_InitVad(AgcVad* vadInst);
-
-int16_t WebRtcAgc_ProcessVad(AgcVad* vadInst,    // (i) VAD state
-                             const int16_t* in,  // (i) Speech signal
-                             size_t nrSamples);  // (i) number of samples
-
-int32_t WebRtcAgc_CalculateGainTable(int32_t* gainTable,         // Q16
-                                     int16_t compressionGaindB,  // Q0 (in dB)
-                                     int16_t targetLevelDbfs,    // Q0 (in dB)
-                                     uint8_t limiterEnable,
-                                     int16_t analogTarget);
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_AGC_LEGACY_DIGITAL_AGC_H_
diff --git a/modules/audio_processing/agc/legacy/gain_control.h b/modules/audio_processing/agc/legacy/gain_control.h
deleted file mode 100644
index c315750..0000000
--- a/modules/audio_processing/agc/legacy/gain_control.h
+++ /dev/null
@@ -1,247 +0,0 @@
-/*
- *  Copyright (c) 2012 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_PROCESSING_AGC_LEGACY_GAIN_CONTROL_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_AGC_LEGACY_GAIN_CONTROL_H_
-
-#include "webrtc/typedefs.h"
-
-// Errors
-#define AGC_UNSPECIFIED_ERROR 18000
-#define AGC_UNSUPPORTED_FUNCTION_ERROR 18001
-#define AGC_UNINITIALIZED_ERROR 18002
-#define AGC_NULL_POINTER_ERROR 18003
-#define AGC_BAD_PARAMETER_ERROR 18004
-
-// Warnings
-#define AGC_BAD_PARAMETER_WARNING 18050
-
-enum {
-  kAgcModeUnchanged,
-  kAgcModeAdaptiveAnalog,
-  kAgcModeAdaptiveDigital,
-  kAgcModeFixedDigital
-};
-
-enum { kAgcFalse = 0, kAgcTrue };
-
-typedef struct {
-  int16_t targetLevelDbfs;    // default 3 (-3 dBOv)
-  int16_t compressionGaindB;  // default 9 dB
-  uint8_t limiterEnable;      // default kAgcTrue (on)
-} WebRtcAgcConfig;
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-/*
- * This function analyses the number of samples passed to
- * farend and produces any error code that could arise.
- *
- * Input:
- *      - agcInst           : AGC instance.
- *      - samples           : Number of samples in input vector.
- *
- * Return value:
- *                          :  0 - Normal operation.
- *                          : -1 - Error.
- */
-int WebRtcAgc_GetAddFarendError(void* state, size_t samples);
-
-/*
- * This function processes a 10 ms frame of far-end speech to determine
- * if there is active speech. The length of the input speech vector must be
- * given in samples (80 when FS=8000, and 160 when FS=16000, FS=32000 or
- * FS=48000).
- *
- * Input:
- *      - agcInst           : AGC instance.
- *      - inFar             : Far-end input speech vector
- *      - samples           : Number of samples in input vector
- *
- * Return value:
- *                          :  0 - Normal operation.
- *                          : -1 - Error
- */
-int WebRtcAgc_AddFarend(void* agcInst, const int16_t* inFar, size_t samples);
-
-/*
- * This function processes a 10 ms frame of microphone speech to determine
- * if there is active speech. The length of the input speech vector must be
- * given in samples (80 when FS=8000, and 160 when FS=16000, FS=32000 or
- * FS=48000). For very low input levels, the input signal is increased in level
- * by multiplying and overwriting the samples in inMic[].
- *
- * This function should be called before any further processing of the
- * near-end microphone signal.
- *
- * Input:
- *      - agcInst           : AGC instance.
- *      - inMic             : Microphone input speech vector for each band
- *      - num_bands         : Number of bands in input vector
- *      - samples           : Number of samples in input vector
- *
- * Return value:
- *                          :  0 - Normal operation.
- *                          : -1 - Error
- */
-int WebRtcAgc_AddMic(void* agcInst,
-                     int16_t* const* inMic,
-                     size_t num_bands,
-                     size_t samples);
-
-/*
- * This function replaces the analog microphone with a virtual one.
- * It is a digital gain applied to the input signal and is used in the
- * agcAdaptiveDigital mode where no microphone level is adjustable. The length
- * of the input speech vector must be given in samples (80 when FS=8000, and 160
- * when FS=16000, FS=32000 or FS=48000).
- *
- * Input:
- *      - agcInst           : AGC instance.
- *      - inMic             : Microphone input speech vector for each band
- *      - num_bands         : Number of bands in input vector
- *      - samples           : Number of samples in input vector
- *      - micLevelIn        : Input level of microphone (static)
- *
- * Output:
- *      - inMic             : Microphone output after processing (L band)
- *      - inMic_H           : Microphone output after processing (H band)
- *      - micLevelOut       : Adjusted microphone level after processing
- *
- * Return value:
- *                          :  0 - Normal operation.
- *                          : -1 - Error
- */
-int WebRtcAgc_VirtualMic(void* agcInst,
-                         int16_t* const* inMic,
-                         size_t num_bands,
-                         size_t samples,
-                         int32_t micLevelIn,
-                         int32_t* micLevelOut);
-
-/*
- * This function processes a 10 ms frame and adjusts (normalizes) the gain both
- * analog and digitally. The gain adjustments are done only during active
- * periods of speech. The length of the speech vectors must be given in samples
- * (80 when FS=8000, and 160 when FS=16000, FS=32000 or FS=48000). The echo
- * parameter can be used to ensure the AGC will not adjust upward in the
- * presence of echo.
- *
- * This function should be called after processing the near-end microphone
- * signal, in any case after any echo cancellation.
- *
- * Input:
- *      - agcInst           : AGC instance
- *      - inNear            : Near-end input speech vector for each band
- *      - num_bands         : Number of bands in input/output vector
- *      - samples           : Number of samples in input/output vector
- *      - inMicLevel        : Current microphone volume level
- *      - echo              : Set to 0 if the signal passed to add_mic is
- *                            almost certainly free of echo; otherwise set
- *                            to 1. If you have no information regarding echo
- *                            set to 0.
- *
- * Output:
- *      - outMicLevel       : Adjusted microphone volume level
- *      - out               : Gain-adjusted near-end speech vector
- *                          : May be the same vector as the input.
- *      - saturationWarning : A returned value of 1 indicates a saturation event
- *                            has occurred and the volume cannot be further
- *                            reduced. Otherwise will be set to 0.
- *
- * Return value:
- *                          :  0 - Normal operation.
- *                          : -1 - Error
- */
-int WebRtcAgc_Process(void* agcInst,
-                      const int16_t* const* inNear,
-                      size_t num_bands,
-                      size_t samples,
-                      int16_t* const* out,
-                      int32_t inMicLevel,
-                      int32_t* outMicLevel,
-                      int16_t echo,
-                      uint8_t* saturationWarning);
-
-/*
- * This function sets the config parameters (targetLevelDbfs,
- * compressionGaindB and limiterEnable).
- *
- * Input:
- *      - agcInst           : AGC instance
- *      - config            : config struct
- *
- * Output:
- *
- * Return value:
- *                          :  0 - Normal operation.
- *                          : -1 - Error
- */
-int WebRtcAgc_set_config(void* agcInst, WebRtcAgcConfig config);
-
-/*
- * This function returns the config parameters (targetLevelDbfs,
- * compressionGaindB and limiterEnable).
- *
- * Input:
- *      - agcInst           : AGC instance
- *
- * Output:
- *      - config            : config struct
- *
- * Return value:
- *                          :  0 - Normal operation.
- *                          : -1 - Error
- */
-int WebRtcAgc_get_config(void* agcInst, WebRtcAgcConfig* config);
-
-/*
- * This function creates and returns an AGC instance, which will contain the
- * state information for one (duplex) channel.
- */
-void* WebRtcAgc_Create();
-
-/*
- * This function frees the AGC instance created at the beginning.
- *
- * Input:
- *      - agcInst           : AGC instance.
- */
-void WebRtcAgc_Free(void* agcInst);
-
-/*
- * This function initializes an AGC instance.
- *
- * Input:
- *      - agcInst           : AGC instance.
- *      - minLevel          : Minimum possible mic level
- *      - maxLevel          : Maximum possible mic level
- *      - agcMode           : 0 - Unchanged
- *                          : 1 - Adaptive Analog Automatic Gain Control -3dBOv
- *                          : 2 - Adaptive Digital Automatic Gain Control -3dBOv
- *                          : 3 - Fixed Digital Gain 0dB
- *      - fs                : Sampling frequency
- *
- * Return value             :  0 - Ok
- *                            -1 - Error
- */
-int WebRtcAgc_Init(void* agcInst,
-                   int32_t minLevel,
-                   int32_t maxLevel,
-                   int16_t agcMode,
-                   uint32_t fs);
-
-#if defined(__cplusplus)
-}
-#endif
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_AGC_LEGACY_GAIN_CONTROL_H_
diff --git a/modules/audio_processing/agc/loudness_histogram.cc b/modules/audio_processing/agc/loudness_histogram.cc
deleted file mode 100644
index cc21f2a..0000000
--- a/modules/audio_processing/agc/loudness_histogram.cc
+++ /dev/null
@@ -1,229 +0,0 @@
-/*
- *  Copyright (c) 2012 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_processing/agc/loudness_histogram.h"
-
-#include <cmath>
-#include <cstring>
-
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-
-static const double kHistBinCenters[] = {
-    7.59621091765857e-02, 9.02036021061016e-02, 1.07115112009343e-01,
-    1.27197217770508e-01, 1.51044347572047e-01, 1.79362373905283e-01,
-    2.12989507320644e-01, 2.52921107370304e-01, 3.00339145144454e-01,
-    3.56647189489147e-01, 4.23511952494003e-01, 5.02912623991786e-01,
-    5.97199455365749e-01, 7.09163326739184e-01, 8.42118356728544e-01,
-    1.00000000000000e+00, 1.18748153630660e+00, 1.41011239906908e+00,
-    1.67448243801153e+00, 1.98841697800836e+00, 2.36120844786349e+00,
-    2.80389143520905e+00, 3.32956930911896e+00, 3.95380207843188e+00,
-    4.69506696634852e+00, 5.57530533426190e+00, 6.62057214370769e+00,
-    7.86180718043869e+00, 9.33575086877358e+00, 1.10860317842269e+01,
-    1.31644580546776e+01, 1.56325508754123e+01, 1.85633655299256e+01,
-    2.20436538184971e+01, 2.61764319021997e+01, 3.10840295702492e+01,
-    3.69117111886792e+01, 4.38319755100383e+01, 5.20496616180135e+01,
-    6.18080121423973e+01, 7.33958732149108e+01, 8.71562442838066e+01,
-    1.03496430860848e+02, 1.22900100720889e+02, 1.45941600416277e+02,
-    1.73302955873365e+02, 2.05794060286978e+02, 2.44376646872353e+02,
-    2.90192756065437e+02, 3.44598539797631e+02, 4.09204403447902e+02,
-    4.85922673669740e+02, 5.77024203055553e+02, 6.85205587130498e+02,
-    8.13668983291589e+02, 9.66216894324125e+02, 1.14736472207740e+03,
-    1.36247442287647e+03, 1.61791322085579e+03, 1.92124207711260e+03,
-    2.28143949334655e+03, 2.70916727454970e+03, 3.21708611729384e+03,
-    3.82023036499473e+03, 4.53645302286906e+03, 5.38695420497926e+03,
-    6.39690865534207e+03, 7.59621091765857e+03, 9.02036021061016e+03,
-    1.07115112009343e+04, 1.27197217770508e+04, 1.51044347572047e+04,
-    1.79362373905283e+04, 2.12989507320644e+04, 2.52921107370304e+04,
-    3.00339145144454e+04, 3.56647189489147e+04};
-
-static const double kProbQDomain = 1024.0;
-// Loudness of -15 dB (smallest expected loudness) in log domain,
-// loudness_db = 13.5 * log10(rms);
-static const double kLogDomainMinBinCenter = -2.57752062648587;
-// Loudness step of 1 dB in log domain
-static const double kLogDomainStepSizeInverse = 5.81954605750359;
-
-static const int kTransientWidthThreshold = 7;
-static const double kLowProbabilityThreshold = 0.2;
-
-static const int kLowProbThresholdQ10 =
-    static_cast<int>(kLowProbabilityThreshold * kProbQDomain);
-
-LoudnessHistogram::LoudnessHistogram()
-    : num_updates_(0),
-      audio_content_q10_(0),
-      bin_count_q10_(),
-      activity_probability_(),
-      hist_bin_index_(),
-      buffer_index_(0),
-      buffer_is_full_(false),
-      len_circular_buffer_(0),
-      len_high_activity_(0) {
-  static_assert(
-      kHistSize == sizeof(kHistBinCenters) / sizeof(kHistBinCenters[0]),
-      "histogram bin centers incorrect size");
-}
-
-LoudnessHistogram::LoudnessHistogram(int window_size)
-    : num_updates_(0),
-      audio_content_q10_(0),
-      bin_count_q10_(),
-      activity_probability_(new int[window_size]),
-      hist_bin_index_(new int[window_size]),
-      buffer_index_(0),
-      buffer_is_full_(false),
-      len_circular_buffer_(window_size),
-      len_high_activity_(0) {}
-
-LoudnessHistogram::~LoudnessHistogram() {}
-
-void LoudnessHistogram::Update(double rms, double activity_probaility) {
-  // If circular histogram is activated then remove the oldest entry.
-  if (len_circular_buffer_ > 0)
-    RemoveOldestEntryAndUpdate();
-
-  // Find the corresponding bin.
-  int hist_index = GetBinIndex(rms);
-  // To Q10 domain.
-  int prob_q10 =
-      static_cast<int16_t>(floor(activity_probaility * kProbQDomain));
-  InsertNewestEntryAndUpdate(prob_q10, hist_index);
-}
-
-// Doing nothing if buffer is not full, yet.
-void LoudnessHistogram::RemoveOldestEntryAndUpdate() {
-  RTC_DCHECK_GT(len_circular_buffer_, 0);
-  // Do nothing if circular buffer is not full.
-  if (!buffer_is_full_)
-    return;
-
-  int oldest_prob = activity_probability_[buffer_index_];
-  int oldest_hist_index = hist_bin_index_[buffer_index_];
-  UpdateHist(-oldest_prob, oldest_hist_index);
-}
-
-void LoudnessHistogram::RemoveTransient() {
-  // Don't expect to be here if high-activity region is longer than
-  // |kTransientWidthThreshold| or there has not been any transient.
-  RTC_DCHECK_LE(len_high_activity_, kTransientWidthThreshold);
-  int index =
-      (buffer_index_ > 0) ? (buffer_index_ - 1) : len_circular_buffer_ - 1;
-  while (len_high_activity_ > 0) {
-    UpdateHist(-activity_probability_[index], hist_bin_index_[index]);
-    activity_probability_[index] = 0;
-    index = (index > 0) ? (index - 1) : (len_circular_buffer_ - 1);
-    len_high_activity_--;
-  }
-}
-
-void LoudnessHistogram::InsertNewestEntryAndUpdate(int activity_prob_q10,
-                                                   int hist_index) {
-  // Update the circular buffer if it is enabled.
-  if (len_circular_buffer_ > 0) {
-    // Removing transient.
-    if (activity_prob_q10 <= kLowProbThresholdQ10) {
-      // Lower than threshold probability, set it to zero.
-      activity_prob_q10 = 0;
-      // Check if this has been a transient.
-      if (len_high_activity_ <= kTransientWidthThreshold)
-        RemoveTransient();  // Remove this transient.
-      len_high_activity_ = 0;
-    } else if (len_high_activity_ <= kTransientWidthThreshold) {
-      len_high_activity_++;
-    }
-    // Updating the circular buffer.
-    activity_probability_[buffer_index_] = activity_prob_q10;
-    hist_bin_index_[buffer_index_] = hist_index;
-    // Increment the buffer index and check for wrap-around.
-    buffer_index_++;
-    if (buffer_index_ >= len_circular_buffer_) {
-      buffer_index_ = 0;
-      buffer_is_full_ = true;
-    }
-  }
-
-  num_updates_++;
-  if (num_updates_ < 0)
-    num_updates_--;
-
-  UpdateHist(activity_prob_q10, hist_index);
-}
-
-void LoudnessHistogram::UpdateHist(int activity_prob_q10, int hist_index) {
-  bin_count_q10_[hist_index] += activity_prob_q10;
-  audio_content_q10_ += activity_prob_q10;
-}
-
-double LoudnessHistogram::AudioContent() const {
-  return audio_content_q10_ / kProbQDomain;
-}
-
-LoudnessHistogram* LoudnessHistogram::Create() {
-  return new LoudnessHistogram;
-}
-
-LoudnessHistogram* LoudnessHistogram::Create(int window_size) {
-  if (window_size < 0)
-    return NULL;
-  return new LoudnessHistogram(window_size);
-}
-
-void LoudnessHistogram::Reset() {
-  // Reset the histogram, audio-content and number of updates.
-  memset(bin_count_q10_, 0, sizeof(bin_count_q10_));
-  audio_content_q10_ = 0;
-  num_updates_ = 0;
-  // Empty the circular buffer.
-  buffer_index_ = 0;
-  buffer_is_full_ = false;
-  len_high_activity_ = 0;
-}
-
-int LoudnessHistogram::GetBinIndex(double rms) {
-  // First exclude overload cases.
-  if (rms <= kHistBinCenters[0]) {
-    return 0;
-  } else if (rms >= kHistBinCenters[kHistSize - 1]) {
-    return kHistSize - 1;
-  } else {
-    // The quantizer is uniform in log domain. Alternatively we could do binary
-    // search in linear domain.
-    double rms_log = log(rms);
-
-    int index = static_cast<int>(
-        floor((rms_log - kLogDomainMinBinCenter) * kLogDomainStepSizeInverse));
-    // The final decision is in linear domain.
-    double b = 0.5 * (kHistBinCenters[index] + kHistBinCenters[index + 1]);
-    if (rms > b) {
-      return index + 1;
-    }
-    return index;
-  }
-}
-
-double LoudnessHistogram::CurrentRms() const {
-  double p;
-  double mean_val = 0;
-  if (audio_content_q10_ > 0) {
-    double p_total_inverse = 1. / static_cast<double>(audio_content_q10_);
-    for (int n = 0; n < kHistSize; n++) {
-      p = static_cast<double>(bin_count_q10_[n]) * p_total_inverse;
-      mean_val += p * kHistBinCenters[n];
-    }
-  } else {
-    mean_val = kHistBinCenters[0];
-  }
-  return mean_val;
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/agc/loudness_histogram.h b/modules/audio_processing/agc/loudness_histogram.h
deleted file mode 100644
index b079299..0000000
--- a/modules/audio_processing/agc/loudness_histogram.h
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- *  Copyright (c) 2012 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_PROCESSING_AGC_LOUDNESS_HISTOGRAM_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_AGC_LOUDNESS_HISTOGRAM_H_
-
-#include <string.h>
-
-#include <memory>
-
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-// This class implements the histogram of loudness with circular buffers so that
-// the histogram tracks the last T seconds of the loudness.
-class LoudnessHistogram {
- public:
-  // Create a non-sliding LoudnessHistogram.
-  static LoudnessHistogram* Create();
-
-  // Create a sliding LoudnessHistogram, i.e. the histogram represents the last
-  // |window_size| samples.
-  static LoudnessHistogram* Create(int window_size);
-  ~LoudnessHistogram();
-
-  // Insert RMS and the corresponding activity probability.
-  void Update(double rms, double activity_probability);
-
-  // Reset the histogram, forget the past.
-  void Reset();
-
-  // Current loudness, which is actually the mean of histogram in loudness
-  // domain.
-  double CurrentRms() const;
-
-  // Sum of the histogram content.
-  double AudioContent() const;
-
-  // Number of times the histogram has been updated.
-  int num_updates() const { return num_updates_; }
-
- private:
-  LoudnessHistogram();
-  explicit LoudnessHistogram(int window);
-
-  // Find the histogram bin associated with the given |rms|.
-  int GetBinIndex(double rms);
-
-  void RemoveOldestEntryAndUpdate();
-  void InsertNewestEntryAndUpdate(int activity_prob_q10, int hist_index);
-  void UpdateHist(int activity_prob_q10, int hist_index);
-  void RemoveTransient();
-
-  // Number of histogram bins.
-  static const int kHistSize = 77;
-
-  // Number of times the histogram is updated
-  int num_updates_;
-  // Audio content, this should be equal to the sum of the components of
-  // |bin_count_q10_|.
-  int64_t audio_content_q10_;
-
-  // LoudnessHistogram of input RMS in Q10 with |kHistSize_| bins. In each
-  // 'Update(),' we increment the associated histogram-bin with the given
-  // probability. The increment is implemented in Q10 to avoid rounding errors.
-  int64_t bin_count_q10_[kHistSize];
-
-  // Circular buffer for probabilities
-  std::unique_ptr<int[]> activity_probability_;
-  // Circular buffer for histogram-indices of probabilities.
-  std::unique_ptr<int[]> hist_bin_index_;
-  // Current index of circular buffer, where the newest data will be written to,
-  // therefore, pointing to the oldest data if buffer is full.
-  int buffer_index_;
-  // Indicating if buffer is full and we had a wrap around.
-  int buffer_is_full_;
-  // Size of circular buffer.
-  int len_circular_buffer_;
-  int len_high_activity_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_AGC_LOUDNESS_HISTOGRAM_H_
diff --git a/modules/audio_processing/agc/loudness_histogram_unittest.cc b/modules/audio_processing/agc/loudness_histogram_unittest.cc
deleted file mode 100644
index 089c05a..0000000
--- a/modules/audio_processing/agc/loudness_histogram_unittest.cc
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- *  Copyright (c) 2012 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.
- */
-
-// Use CreateHistUnittestFile.m to generate the input file.
-
-#include "webrtc/modules/audio_processing/agc/loudness_histogram.h"
-
-#include <stdio.h>
-#include <algorithm>
-#include <cmath>
-#include <memory>
-
-#include "webrtc/modules/audio_processing/agc/utility.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/testsupport/fileutils.h"
-
-namespace webrtc {
-
-struct InputOutput {
-  double rms;
-  double activity_probability;
-  double audio_content;
-  double loudness;
-};
-
-const double kRelativeErrTol = 1e-10;
-
-class LoudnessHistogramTest : public ::testing::Test {
- protected:
-  void RunTest(bool enable_circular_buff, const char* filename);
-
- private:
-  void TestClean();
-  std::unique_ptr<LoudnessHistogram> hist_;
-};
-
-void LoudnessHistogramTest::TestClean() {
-  EXPECT_EQ(hist_->CurrentRms(), 7.59621091765857e-02);
-  EXPECT_EQ(hist_->AudioContent(), 0);
-  EXPECT_EQ(hist_->num_updates(), 0);
-}
-
-void LoudnessHistogramTest::RunTest(bool enable_circular_buff,
-                                    const char* filename) {
-  FILE* in_file = fopen(filename, "rb");
-  ASSERT_TRUE(in_file != NULL);
-  if (enable_circular_buff) {
-    int buffer_size;
-    EXPECT_EQ(fread(&buffer_size, sizeof(buffer_size), 1, in_file), 1u);
-    hist_.reset(LoudnessHistogram::Create(buffer_size));
-  } else {
-    hist_.reset(LoudnessHistogram::Create());
-  }
-  TestClean();
-
-  InputOutput io;
-  int num_updates = 0;
-  int num_reset = 0;
-  while (fread(&io, sizeof(InputOutput), 1, in_file) == 1) {
-    if (io.rms < 0) {
-      // We have to reset.
-      hist_->Reset();
-      TestClean();
-      num_updates = 0;
-      num_reset++;
-      // Read the next chunk of input.
-      if (fread(&io, sizeof(InputOutput), 1, in_file) != 1)
-        break;
-    }
-    hist_->Update(io.rms, io.activity_probability);
-    num_updates++;
-    EXPECT_EQ(hist_->num_updates(), num_updates);
-    double audio_content = hist_->AudioContent();
-
-    double abs_err =
-        std::min(audio_content, io.audio_content) * kRelativeErrTol;
-
-    ASSERT_NEAR(audio_content, io.audio_content, abs_err);
-    double current_loudness = Linear2Loudness(hist_->CurrentRms());
-    abs_err =
-        std::min(fabs(current_loudness), fabs(io.loudness)) * kRelativeErrTol;
-    ASSERT_NEAR(current_loudness, io.loudness, abs_err);
-  }
-  fclose(in_file);
-}
-
-TEST_F(LoudnessHistogramTest, ActiveCircularBuffer) {
-  RunTest(true, test::ResourcePath(
-                    "audio_processing/agc/agc_with_circular_buffer", "dat")
-                    .c_str());
-}
-
-TEST_F(LoudnessHistogramTest, InactiveCircularBuffer) {
-  RunTest(false, test::ResourcePath(
-                     "audio_processing/agc/agc_no_circular_buffer", "dat")
-                     .c_str());
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/agc/mock_agc.h b/modules/audio_processing/agc/mock_agc.h
deleted file mode 100644
index 3b9c22f..0000000
--- a/modules/audio_processing/agc/mock_agc.h
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- *  Copyright (c) 2012 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_PROCESSING_AGC_MOCK_AGC_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_AGC_MOCK_AGC_H_
-
-#include "webrtc/modules/audio_processing/agc/agc.h"
-
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/test/gmock.h"
-
-namespace webrtc {
-
-class MockAgc : public Agc {
- public:
-  MOCK_METHOD2(AnalyzePreproc, float(const int16_t* audio, size_t length));
-  MOCK_METHOD3(Process, int(const int16_t* audio, size_t length,
-                            int sample_rate_hz));
-  MOCK_METHOD1(GetRmsErrorDb, bool(int* error));
-  MOCK_METHOD0(Reset, void());
-  MOCK_METHOD1(set_target_level_dbfs, int(int level));
-  MOCK_CONST_METHOD0(target_level_dbfs, int());
-  MOCK_METHOD1(EnableStandaloneVad, void(bool enable));
-  MOCK_CONST_METHOD0(standalone_vad_enabled, bool());
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_AGC_MOCK_AGC_H_
diff --git a/modules/audio_processing/agc/utility.cc b/modules/audio_processing/agc/utility.cc
deleted file mode 100644
index 48458ad..0000000
--- a/modules/audio_processing/agc/utility.cc
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- *  Copyright (c) 2012 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_processing/agc/utility.h"
-
-#include <math.h>
-
-static const double kLog10 = 2.30258509299;
-static const double kLinear2DbScale = 20.0 / kLog10;
-static const double kLinear2LoudnessScale = 13.4 / kLog10;
-
-double Loudness2Db(double loudness) {
-  return loudness * kLinear2DbScale / kLinear2LoudnessScale;
-}
-
-double Linear2Loudness(double rms) {
-  if (rms == 0)
-    return -15;
-  return kLinear2LoudnessScale * log(rms);
-}
-
-double Db2Loudness(double db) {
-  return db * kLinear2LoudnessScale / kLinear2DbScale;
-}
-
-double Dbfs2Loudness(double dbfs) {
-  return Db2Loudness(90 + dbfs);
-}
diff --git a/modules/audio_processing/agc/utility.h b/modules/audio_processing/agc/utility.h
deleted file mode 100644
index df85c2e..0000000
--- a/modules/audio_processing/agc/utility.h
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- *  Copyright (c) 2012 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_PROCESSING_AGC_UTILITY_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_AGC_UTILITY_H_
-
-// TODO(turajs): Add description of function.
-double Loudness2Db(double loudness);
-
-double Linear2Loudness(double rms);
-
-double Db2Loudness(double db);
-
-double Dbfs2Loudness(double dbfs);
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_AGC_UTILITY_H_
diff --git a/modules/audio_processing/agc2/digital_gain_applier.cc b/modules/audio_processing/agc2/digital_gain_applier.cc
deleted file mode 100644
index d8b8c98..0000000
--- a/modules/audio_processing/agc2/digital_gain_applier.cc
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- *  Copyright (c) 2017 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_processing/agc2/digital_gain_applier.h"
-
-#include <algorithm>
-
-namespace webrtc {
-namespace {
-
-constexpr float kMaxSampleValue = 32767.0f;
-constexpr float kMinSampleValue = -32767.0f;
-
-}  // namespace
-
-DigitalGainApplier::DigitalGainApplier() = default;
-
-void DigitalGainApplier::Process(float gain, rtc::ArrayView<float> samples) {
-  if (gain == 1.f) { return; }
-  for (auto& v : samples) { v *= gain; }
-  LimitToAllowedRange(samples);
-}
-
-void DigitalGainApplier::LimitToAllowedRange(rtc::ArrayView<float> x) {
-  for (auto& v : x) {
-    v = std::max(kMinSampleValue, v);
-    v = std::min(kMaxSampleValue, v);
-  }
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/agc2/digital_gain_applier.h b/modules/audio_processing/agc2/digital_gain_applier.h
deleted file mode 100644
index d74ba33..0000000
--- a/modules/audio_processing/agc2/digital_gain_applier.h
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- *  Copyright (c) 2017 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_PROCESSING_AGC2_DIGITAL_GAIN_APPLIER_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_AGC2_DIGITAL_GAIN_APPLIER_H_
-
-#include "webrtc/api/array_view.h"
-#include "webrtc/modules/audio_processing/audio_buffer.h"
-
-namespace webrtc {
-
-class DigitalGainApplier {
- public:
-  DigitalGainApplier();
-
-  // Applies the specified gain to an array of samples.
-  void Process(float gain, rtc::ArrayView<float> samples);
-
- private:
-  void LimitToAllowedRange(rtc::ArrayView<float> x);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_AGC2_DIGITAL_GAIN_APPLIER_H_
diff --git a/modules/audio_processing/agc2/gain_controller2.cc b/modules/audio_processing/agc2/gain_controller2.cc
deleted file mode 100644
index 20680f6..0000000
--- a/modules/audio_processing/agc2/gain_controller2.cc
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- *  Copyright (c) 2017 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_processing/agc2/gain_controller2.h"
-
-#include "webrtc/modules/audio_processing/audio_buffer.h"
-#include "webrtc/modules/audio_processing/logging/apm_data_dumper.h"
-#include "webrtc/rtc_base/atomicops.h"
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-
-namespace {
-
-constexpr float kGain = 0.5f;
-
-}  // namespace
-
-int GainController2::instance_count_ = 0;
-
-GainController2::GainController2(int sample_rate_hz)
-    : sample_rate_hz_(sample_rate_hz),
-      data_dumper_(new ApmDataDumper(
-        rtc::AtomicOps::Increment(&instance_count_))),
-      digital_gain_applier_(),
-      gain_(kGain) {
-  RTC_DCHECK(sample_rate_hz_ == AudioProcessing::kSampleRate8kHz ||
-             sample_rate_hz_ == AudioProcessing::kSampleRate16kHz ||
-             sample_rate_hz_ == AudioProcessing::kSampleRate32kHz ||
-             sample_rate_hz_ == AudioProcessing::kSampleRate48kHz);
-  data_dumper_->InitiateNewSetOfRecordings();
-  data_dumper_->DumpRaw("gain_", 1, &gain_);
-}
-
-GainController2::~GainController2() = default;
-
-void GainController2::Process(AudioBuffer* audio) {
-  for (size_t k = 0; k < audio->num_channels(); ++k) {
-    auto channel_view = rtc::ArrayView<float>(
-        audio->channels_f()[k], audio->num_frames());
-    digital_gain_applier_.Process(gain_, channel_view);
-  }
-}
-
-bool GainController2::Validate(
-    const AudioProcessing::Config::GainController2& config) {
-  return true;
-}
-
-std::string GainController2::ToString(
-    const AudioProcessing::Config::GainController2& config) {
-  std::stringstream ss;
-  ss << "{"
-     << "enabled: " << (config.enabled ? "true" : "false") << "}";
-  return ss.str();
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/agc2/gain_controller2.h b/modules/audio_processing/agc2/gain_controller2.h
deleted file mode 100644
index 1a8bb7f..0000000
--- a/modules/audio_processing/agc2/gain_controller2.h
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- *  Copyright (c) 2017 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_PROCESSING_AGC2_GAIN_CONTROLLER2_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_AGC2_GAIN_CONTROLLER2_H_
-
-#include <memory>
-#include <string>
-
-#include "webrtc/modules/audio_processing/agc2/digital_gain_applier.h"
-#include "webrtc/modules/audio_processing/include/audio_processing.h"
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace webrtc {
-
-class ApmDataDumper;
-class AudioBuffer;
-
-// Gain Controller 2 aims to automatically adjust levels by acting on the
-// microphone gain and/or applying digital gain.
-//
-// It temporarily implements a hard-coded gain mode only.
-class GainController2 {
- public:
-  explicit GainController2(int sample_rate_hz);
-  ~GainController2();
-
-  int sample_rate_hz() { return sample_rate_hz_; }
-
-  void Process(AudioBuffer* audio);
-
-  static bool Validate(const AudioProcessing::Config::GainController2& config);
-  static std::string ToString(
-      const AudioProcessing::Config::GainController2& config);
-
- private:
-  int sample_rate_hz_;
-  std::unique_ptr<ApmDataDumper> data_dumper_;
-  DigitalGainApplier digital_gain_applier_;
-  static int instance_count_;
-  // TODO(alessiob): Remove once a meaningful gain controller mode is
-  // implemented.
-  const float gain_;
-  RTC_DISALLOW_COPY_AND_ASSIGN(GainController2);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_AGC2_GAIN_CONTROLLER2_H_
diff --git a/modules/audio_processing/agc2/gain_controller2_unittest.cc b/modules/audio_processing/agc2/gain_controller2_unittest.cc
deleted file mode 100644
index 7668d23..0000000
--- a/modules/audio_processing/agc2/gain_controller2_unittest.cc
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- *  Copyright (c) 2017 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 <memory>
-#include <string>
-
-#include "webrtc/api/array_view.h"
-#include "webrtc/modules/audio_processing/agc2/digital_gain_applier.h"
-#include "webrtc/modules/audio_processing/agc2/gain_controller2.h"
-#include "webrtc/modules/audio_processing/audio_buffer.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-namespace test {
-
-namespace {
-
-constexpr size_t kNumFrames = 480u;
-constexpr size_t kStereo = 2u;
-
-void SetAudioBufferSamples(float value, AudioBuffer* ab) {
-  for (size_t k = 0; k < ab->num_channels(); ++k) {
-    auto channel = rtc::ArrayView<float>(ab->channels_f()[k], ab->num_frames());
-    for (auto& sample : channel) { sample = value; }
-  }
-}
-
-template<typename Functor>
-bool CheckAudioBufferSamples(Functor validator, AudioBuffer* ab) {
-  for (size_t k = 0; k < ab->num_channels(); ++k) {
-    auto channel = rtc::ArrayView<float>(ab->channels_f()[k], ab->num_frames());
-    for (auto& sample : channel) { if (!validator(sample)) { return false; } }
-  }
-  return true;
-}
-
-bool TestDigitalGainApplier(float sample_value, float gain, float expected) {
-  AudioBuffer ab(kNumFrames, kStereo, kNumFrames, kStereo, kNumFrames);
-  SetAudioBufferSamples(sample_value, &ab);
-
-  DigitalGainApplier gain_applier;
-  for (size_t k = 0; k < ab.num_channels(); ++k) {
-    auto channel_view = rtc::ArrayView<float>(
-        ab.channels_f()[k], ab.num_frames());
-    gain_applier.Process(gain, channel_view);
-  }
-
-  auto check_expectation = [expected](float sample) {
-      return sample == expected; };
-  return CheckAudioBufferSamples(check_expectation, &ab);
-}
-
-}  // namespace
-
-TEST(GainController2, Instance) {
-  std::unique_ptr<GainController2> gain_controller2;
-  gain_controller2.reset(new GainController2(
-      AudioProcessing::kSampleRate48kHz));
-}
-
-TEST(GainController2, ToString) {
-  AudioProcessing::Config config;
-
-  config.gain_controller2.enabled = false;
-  EXPECT_EQ("{enabled: false}",
-            GainController2::ToString(config.gain_controller2));
-
-  config.gain_controller2.enabled = true;
-  EXPECT_EQ("{enabled: true}",
-            GainController2::ToString(config.gain_controller2));
-}
-
-TEST(GainController2, DigitalGainApplierProcess) {
-  EXPECT_TRUE(TestDigitalGainApplier(1000.0f, 0.5, 500.0f));
-}
-
-TEST(GainController2, DigitalGainApplierCheckClipping) {
-  EXPECT_TRUE(TestDigitalGainApplier(30000.0f, 1.5, 32767.0f));
-  EXPECT_TRUE(TestDigitalGainApplier(-30000.0f, 1.5, -32767.0f));
-}
-
-TEST(GainController2, Usage) {
-  std::unique_ptr<GainController2> gain_controller2;
-  gain_controller2.reset(new GainController2(
-      AudioProcessing::kSampleRate48kHz));
-  AudioBuffer ab(kNumFrames, kStereo, kNumFrames, kStereo, kNumFrames);
-  SetAudioBufferSamples(1000.0f, &ab);
-  gain_controller2->Process(&ab);
-}
-
-}  // namespace test
-}  // namespace webrtc
diff --git a/modules/audio_processing/audio_buffer.cc b/modules/audio_processing/audio_buffer.cc
deleted file mode 100644
index 6c8ddd6..0000000
--- a/modules/audio_processing/audio_buffer.cc
+++ /dev/null
@@ -1,475 +0,0 @@
-/*
- *  Copyright (c) 2012 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_processing/audio_buffer.h"
-
-#include "webrtc/common_audio/channel_buffer.h"
-#include "webrtc/common_audio/include/audio_util.h"
-#include "webrtc/common_audio/resampler/push_sinc_resampler.h"
-#include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
-#include "webrtc/modules/audio_processing/common.h"
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-namespace {
-
-const size_t kSamplesPer16kHzChannel = 160;
-const size_t kSamplesPer32kHzChannel = 320;
-const size_t kSamplesPer48kHzChannel = 480;
-
-int KeyboardChannelIndex(const StreamConfig& stream_config) {
-  if (!stream_config.has_keyboard()) {
-    RTC_NOTREACHED();
-    return 0;
-  }
-
-  return stream_config.num_channels();
-}
-
-size_t NumBandsFromSamplesPerChannel(size_t num_frames) {
-  size_t num_bands = 1;
-  if (num_frames == kSamplesPer32kHzChannel ||
-      num_frames == kSamplesPer48kHzChannel) {
-    num_bands = rtc::CheckedDivExact(num_frames, kSamplesPer16kHzChannel);
-  }
-  return num_bands;
-}
-
-}  // namespace
-
-AudioBuffer::AudioBuffer(size_t input_num_frames,
-                         size_t num_input_channels,
-                         size_t process_num_frames,
-                         size_t num_process_channels,
-                         size_t output_num_frames)
-  : input_num_frames_(input_num_frames),
-    num_input_channels_(num_input_channels),
-    proc_num_frames_(process_num_frames),
-    num_proc_channels_(num_process_channels),
-    output_num_frames_(output_num_frames),
-    num_channels_(num_process_channels),
-    num_bands_(NumBandsFromSamplesPerChannel(proc_num_frames_)),
-    num_split_frames_(rtc::CheckedDivExact(proc_num_frames_, num_bands_)),
-    mixed_low_pass_valid_(false),
-    reference_copied_(false),
-    activity_(AudioFrame::kVadUnknown),
-    keyboard_data_(NULL),
-    data_(new IFChannelBuffer(proc_num_frames_, num_proc_channels_)),
-    output_buffer_(new IFChannelBuffer(output_num_frames_, num_channels_)) {
-  RTC_DCHECK_GT(input_num_frames_, 0);
-  RTC_DCHECK_GT(proc_num_frames_, 0);
-  RTC_DCHECK_GT(output_num_frames_, 0);
-  RTC_DCHECK_GT(num_input_channels_, 0);
-  RTC_DCHECK_GT(num_proc_channels_, 0);
-  RTC_DCHECK_LE(num_proc_channels_, num_input_channels_);
-
-  if (input_num_frames_ != proc_num_frames_ ||
-      output_num_frames_ != proc_num_frames_) {
-    // Create an intermediate buffer for resampling.
-    process_buffer_.reset(new ChannelBuffer<float>(proc_num_frames_,
-                                                   num_proc_channels_));
-
-    if (input_num_frames_ != proc_num_frames_) {
-      for (size_t i = 0; i < num_proc_channels_; ++i) {
-        input_resamplers_.push_back(std::unique_ptr<PushSincResampler>(
-            new PushSincResampler(input_num_frames_, proc_num_frames_)));
-      }
-    }
-
-    if (output_num_frames_ != proc_num_frames_) {
-      for (size_t i = 0; i < num_proc_channels_; ++i) {
-        output_resamplers_.push_back(std::unique_ptr<PushSincResampler>(
-            new PushSincResampler(proc_num_frames_, output_num_frames_)));
-      }
-    }
-  }
-
-  if (num_bands_ > 1) {
-    split_data_.reset(new IFChannelBuffer(proc_num_frames_,
-                                          num_proc_channels_,
-                                          num_bands_));
-    splitting_filter_.reset(new SplittingFilter(num_proc_channels_,
-                                                num_bands_,
-                                                proc_num_frames_));
-  }
-}
-
-AudioBuffer::~AudioBuffer() {}
-
-void AudioBuffer::CopyFrom(const float* const* data,
-                           const StreamConfig& stream_config) {
-  RTC_DCHECK_EQ(stream_config.num_frames(), input_num_frames_);
-  RTC_DCHECK_EQ(stream_config.num_channels(), num_input_channels_);
-  InitForNewData();
-  // Initialized lazily because there's a different condition in
-  // DeinterleaveFrom.
-  const bool need_to_downmix =
-      num_input_channels_ > 1 && num_proc_channels_ == 1;
-  if (need_to_downmix && !input_buffer_) {
-    input_buffer_.reset(
-        new IFChannelBuffer(input_num_frames_, num_proc_channels_));
-  }
-
-  if (stream_config.has_keyboard()) {
-    keyboard_data_ = data[KeyboardChannelIndex(stream_config)];
-  }
-
-  // Downmix.
-  const float* const* data_ptr = data;
-  if (need_to_downmix) {
-    DownmixToMono<float, float>(data, input_num_frames_, num_input_channels_,
-                                input_buffer_->fbuf()->channels()[0]);
-    data_ptr = input_buffer_->fbuf_const()->channels();
-  }
-
-  // Resample.
-  if (input_num_frames_ != proc_num_frames_) {
-    for (size_t i = 0; i < num_proc_channels_; ++i) {
-      input_resamplers_[i]->Resample(data_ptr[i],
-                                     input_num_frames_,
-                                     process_buffer_->channels()[i],
-                                     proc_num_frames_);
-    }
-    data_ptr = process_buffer_->channels();
-  }
-
-  // Convert to the S16 range.
-  for (size_t i = 0; i < num_proc_channels_; ++i) {
-    FloatToFloatS16(data_ptr[i],
-                    proc_num_frames_,
-                    data_->fbuf()->channels()[i]);
-  }
-}
-
-void AudioBuffer::CopyTo(const StreamConfig& stream_config,
-                         float* const* data) {
-  RTC_DCHECK_EQ(stream_config.num_frames(), output_num_frames_);
-  RTC_DCHECK(stream_config.num_channels() == num_channels_ ||
-             num_channels_ == 1);
-
-  // Convert to the float range.
-  float* const* data_ptr = data;
-  if (output_num_frames_ != proc_num_frames_) {
-    // Convert to an intermediate buffer for subsequent resampling.
-    data_ptr = process_buffer_->channels();
-  }
-  for (size_t i = 0; i < num_channels_; ++i) {
-    FloatS16ToFloat(data_->fbuf()->channels()[i],
-                    proc_num_frames_,
-                    data_ptr[i]);
-  }
-
-  // Resample.
-  if (output_num_frames_ != proc_num_frames_) {
-    for (size_t i = 0; i < num_channels_; ++i) {
-      output_resamplers_[i]->Resample(data_ptr[i],
-                                      proc_num_frames_,
-                                      data[i],
-                                      output_num_frames_);
-    }
-  }
-
-  // Upmix.
-  for (size_t i = num_channels_; i < stream_config.num_channels(); ++i) {
-    memcpy(data[i], data[0], output_num_frames_ * sizeof(**data));
-  }
-}
-
-void AudioBuffer::InitForNewData() {
-  keyboard_data_ = NULL;
-  mixed_low_pass_valid_ = false;
-  reference_copied_ = false;
-  activity_ = AudioFrame::kVadUnknown;
-  num_channels_ = num_proc_channels_;
-  data_->set_num_channels(num_proc_channels_);
-  if (split_data_.get()) {
-    split_data_->set_num_channels(num_proc_channels_);
-  }
-}
-
-const int16_t* const* AudioBuffer::channels_const() const {
-  return data_->ibuf_const()->channels();
-}
-
-int16_t* const* AudioBuffer::channels() {
-  mixed_low_pass_valid_ = false;
-  return data_->ibuf()->channels();
-}
-
-const int16_t* const* AudioBuffer::split_bands_const(size_t channel) const {
-  return split_data_.get() ?
-         split_data_->ibuf_const()->bands(channel) :
-         data_->ibuf_const()->bands(channel);
-}
-
-int16_t* const* AudioBuffer::split_bands(size_t channel) {
-  mixed_low_pass_valid_ = false;
-  return split_data_.get() ?
-         split_data_->ibuf()->bands(channel) :
-         data_->ibuf()->bands(channel);
-}
-
-const int16_t* const* AudioBuffer::split_channels_const(Band band) const {
-  if (split_data_.get()) {
-    return split_data_->ibuf_const()->channels(band);
-  } else {
-    return band == kBand0To8kHz ? data_->ibuf_const()->channels() : nullptr;
-  }
-}
-
-int16_t* const* AudioBuffer::split_channels(Band band) {
-  mixed_low_pass_valid_ = false;
-  if (split_data_.get()) {
-    return split_data_->ibuf()->channels(band);
-  } else {
-    return band == kBand0To8kHz ? data_->ibuf()->channels() : nullptr;
-  }
-}
-
-ChannelBuffer<int16_t>* AudioBuffer::data() {
-  mixed_low_pass_valid_ = false;
-  return data_->ibuf();
-}
-
-const ChannelBuffer<int16_t>* AudioBuffer::data() const {
-  return data_->ibuf_const();
-}
-
-ChannelBuffer<int16_t>* AudioBuffer::split_data() {
-  mixed_low_pass_valid_ = false;
-  return split_data_.get() ? split_data_->ibuf() : data_->ibuf();
-}
-
-const ChannelBuffer<int16_t>* AudioBuffer::split_data() const {
-  return split_data_.get() ? split_data_->ibuf_const() : data_->ibuf_const();
-}
-
-const float* const* AudioBuffer::channels_const_f() const {
-  return data_->fbuf_const()->channels();
-}
-
-float* const* AudioBuffer::channels_f() {
-  mixed_low_pass_valid_ = false;
-  return data_->fbuf()->channels();
-}
-
-const float* const* AudioBuffer::split_bands_const_f(size_t channel) const {
-  return split_data_.get() ?
-         split_data_->fbuf_const()->bands(channel) :
-         data_->fbuf_const()->bands(channel);
-}
-
-float* const* AudioBuffer::split_bands_f(size_t channel) {
-  mixed_low_pass_valid_ = false;
-  return split_data_.get() ?
-         split_data_->fbuf()->bands(channel) :
-         data_->fbuf()->bands(channel);
-}
-
-const float* const* AudioBuffer::split_channels_const_f(Band band) const {
-  if (split_data_.get()) {
-    return split_data_->fbuf_const()->channels(band);
-  } else {
-    return band == kBand0To8kHz ? data_->fbuf_const()->channels() : nullptr;
-  }
-}
-
-float* const* AudioBuffer::split_channels_f(Band band) {
-  mixed_low_pass_valid_ = false;
-  if (split_data_.get()) {
-    return split_data_->fbuf()->channels(band);
-  } else {
-    return band == kBand0To8kHz ? data_->fbuf()->channels() : nullptr;
-  }
-}
-
-ChannelBuffer<float>* AudioBuffer::data_f() {
-  mixed_low_pass_valid_ = false;
-  return data_->fbuf();
-}
-
-const ChannelBuffer<float>* AudioBuffer::data_f() const {
-  return data_->fbuf_const();
-}
-
-ChannelBuffer<float>* AudioBuffer::split_data_f() {
-  mixed_low_pass_valid_ = false;
-  return split_data_.get() ? split_data_->fbuf() : data_->fbuf();
-}
-
-const ChannelBuffer<float>* AudioBuffer::split_data_f() const {
-  return split_data_.get() ? split_data_->fbuf_const() : data_->fbuf_const();
-}
-
-const int16_t* AudioBuffer::mixed_low_pass_data() {
-  if (num_proc_channels_ == 1) {
-    return split_bands_const(0)[kBand0To8kHz];
-  }
-
-  if (!mixed_low_pass_valid_) {
-    if (!mixed_low_pass_channels_.get()) {
-      mixed_low_pass_channels_.reset(
-          new ChannelBuffer<int16_t>(num_split_frames_, 1));
-    }
-
-    DownmixToMono<int16_t, int32_t>(split_channels_const(kBand0To8kHz),
-                                    num_split_frames_, num_channels_,
-                                    mixed_low_pass_channels_->channels()[0]);
-    mixed_low_pass_valid_ = true;
-  }
-  return mixed_low_pass_channels_->channels()[0];
-}
-
-const int16_t* AudioBuffer::low_pass_reference(int channel) const {
-  if (!reference_copied_) {
-    return NULL;
-  }
-
-  return low_pass_reference_channels_->channels()[channel];
-}
-
-const float* AudioBuffer::keyboard_data() const {
-  return keyboard_data_;
-}
-
-void AudioBuffer::set_activity(AudioFrame::VADActivity activity) {
-  activity_ = activity;
-}
-
-AudioFrame::VADActivity AudioBuffer::activity() const {
-  return activity_;
-}
-
-size_t AudioBuffer::num_channels() const {
-  return num_channels_;
-}
-
-void AudioBuffer::set_num_channels(size_t num_channels) {
-  num_channels_ = num_channels;
-  data_->set_num_channels(num_channels);
-  if (split_data_.get()) {
-    split_data_->set_num_channels(num_channels);
-  }
-}
-
-size_t AudioBuffer::num_frames() const {
-  return proc_num_frames_;
-}
-
-size_t AudioBuffer::num_frames_per_band() const {
-  return num_split_frames_;
-}
-
-size_t AudioBuffer::num_keyboard_frames() const {
-  // We don't resample the keyboard channel.
-  return input_num_frames_;
-}
-
-size_t AudioBuffer::num_bands() const {
-  return num_bands_;
-}
-
-// The resampler is only for supporting 48kHz to 16kHz in the reverse stream.
-void AudioBuffer::DeinterleaveFrom(AudioFrame* frame) {
-  RTC_DCHECK_EQ(frame->num_channels_, num_input_channels_);
-  RTC_DCHECK_EQ(frame->samples_per_channel_, input_num_frames_);
-  InitForNewData();
-  // Initialized lazily because there's a different condition in CopyFrom.
-  if ((input_num_frames_ != proc_num_frames_) && !input_buffer_) {
-    input_buffer_.reset(
-        new IFChannelBuffer(input_num_frames_, num_proc_channels_));
-  }
-  activity_ = frame->vad_activity_;
-
-  int16_t* const* deinterleaved;
-  if (input_num_frames_ == proc_num_frames_) {
-    deinterleaved = data_->ibuf()->channels();
-  } else {
-    deinterleaved = input_buffer_->ibuf()->channels();
-  }
-  // TODO(yujo): handle muted frames more efficiently.
-  if (num_proc_channels_ == 1) {
-    // Downmix and deinterleave simultaneously.
-    DownmixInterleavedToMono(frame->data(), input_num_frames_,
-                             num_input_channels_, deinterleaved[0]);
-  } else {
-    RTC_DCHECK_EQ(num_proc_channels_, num_input_channels_);
-    Deinterleave(frame->data(),
-                 input_num_frames_,
-                 num_proc_channels_,
-                 deinterleaved);
-  }
-
-  // Resample.
-  if (input_num_frames_ != proc_num_frames_) {
-    for (size_t i = 0; i < num_proc_channels_; ++i) {
-      input_resamplers_[i]->Resample(input_buffer_->fbuf_const()->channels()[i],
-                                     input_num_frames_,
-                                     data_->fbuf()->channels()[i],
-                                     proc_num_frames_);
-    }
-  }
-}
-
-void AudioBuffer::InterleaveTo(AudioFrame* frame, bool data_changed) const {
-  frame->vad_activity_ = activity_;
-  if (!data_changed) {
-    return;
-  }
-
-  RTC_DCHECK(frame->num_channels_ == num_channels_ || num_channels_ == 1);
-  RTC_DCHECK_EQ(frame->samples_per_channel_, output_num_frames_);
-
-  // Resample if necessary.
-  IFChannelBuffer* data_ptr = data_.get();
-  if (proc_num_frames_ != output_num_frames_) {
-    for (size_t i = 0; i < num_channels_; ++i) {
-      output_resamplers_[i]->Resample(
-          data_->fbuf()->channels()[i], proc_num_frames_,
-          output_buffer_->fbuf()->channels()[i], output_num_frames_);
-    }
-    data_ptr = output_buffer_.get();
-  }
-
-  // TODO(yujo): handle muted frames more efficiently.
-  if (frame->num_channels_ == num_channels_) {
-    Interleave(data_ptr->ibuf()->channels(), output_num_frames_, num_channels_,
-               frame->mutable_data());
-  } else {
-    UpmixMonoToInterleaved(data_ptr->ibuf()->channels()[0], output_num_frames_,
-                           frame->num_channels_, frame->mutable_data());
-  }
-}
-
-void AudioBuffer::CopyLowPassToReference() {
-  reference_copied_ = true;
-  if (!low_pass_reference_channels_.get() ||
-      low_pass_reference_channels_->num_channels() != num_channels_) {
-    low_pass_reference_channels_.reset(
-        new ChannelBuffer<int16_t>(num_split_frames_,
-                                   num_proc_channels_));
-  }
-  for (size_t i = 0; i < num_proc_channels_; i++) {
-    memcpy(low_pass_reference_channels_->channels()[i],
-           split_bands_const(i)[kBand0To8kHz],
-           low_pass_reference_channels_->num_frames_per_band() *
-               sizeof(split_bands_const(i)[kBand0To8kHz][0]));
-  }
-}
-
-void AudioBuffer::SplitIntoFrequencyBands() {
-  splitting_filter_->Analysis(data_.get(), split_data_.get());
-}
-
-void AudioBuffer::MergeFrequencyBands() {
-  splitting_filter_->Synthesis(split_data_.get(), data_.get());
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/audio_buffer.h b/modules/audio_processing/audio_buffer.h
deleted file mode 100644
index da75dbf..0000000
--- a/modules/audio_processing/audio_buffer.h
+++ /dev/null
@@ -1,166 +0,0 @@
-/*
- *  Copyright (c) 2011 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_PROCESSING_AUDIO_BUFFER_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_AUDIO_BUFFER_H_
-
-#include <memory>
-#include <vector>
-
-#include "webrtc/common_audio/channel_buffer.h"
-#include "webrtc/modules/audio_processing/include/audio_processing.h"
-#include "webrtc/modules/audio_processing/splitting_filter.h"
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-class PushSincResampler;
-class IFChannelBuffer;
-
-enum Band {
-  kBand0To8kHz = 0,
-  kBand8To16kHz = 1,
-  kBand16To24kHz = 2
-};
-
-class AudioBuffer {
- public:
-  // TODO(ajm): Switch to take ChannelLayouts.
-  AudioBuffer(size_t input_num_frames,
-              size_t num_input_channels,
-              size_t process_num_frames,
-              size_t num_process_channels,
-              size_t output_num_frames);
-  virtual ~AudioBuffer();
-
-  size_t num_channels() const;
-  void set_num_channels(size_t num_channels);
-  size_t num_frames() const;
-  size_t num_frames_per_band() const;
-  size_t num_keyboard_frames() const;
-  size_t num_bands() const;
-
-  // Returns a pointer array to the full-band channels.
-  // Usage:
-  // channels()[channel][sample].
-  // Where:
-  // 0 <= channel < |num_proc_channels_|
-  // 0 <= sample < |proc_num_frames_|
-  int16_t* const* channels();
-  const int16_t* const* channels_const() const;
-  float* const* channels_f();
-  const float* const* channels_const_f() const;
-
-  // Returns a pointer array to the bands for a specific channel.
-  // Usage:
-  // split_bands(channel)[band][sample].
-  // Where:
-  // 0 <= channel < |num_proc_channels_|
-  // 0 <= band < |num_bands_|
-  // 0 <= sample < |num_split_frames_|
-  int16_t* const* split_bands(size_t channel);
-  const int16_t* const* split_bands_const(size_t channel) const;
-  float* const* split_bands_f(size_t channel);
-  const float* const* split_bands_const_f(size_t channel) const;
-
-  // Returns a pointer array to the channels for a specific band.
-  // Usage:
-  // split_channels(band)[channel][sample].
-  // Where:
-  // 0 <= band < |num_bands_|
-  // 0 <= channel < |num_proc_channels_|
-  // 0 <= sample < |num_split_frames_|
-  int16_t* const* split_channels(Band band);
-  const int16_t* const* split_channels_const(Band band) const;
-  float* const* split_channels_f(Band band);
-  const float* const* split_channels_const_f(Band band) const;
-
-  // Returns a pointer to the ChannelBuffer that encapsulates the full-band
-  // data.
-  ChannelBuffer<int16_t>* data();
-  const ChannelBuffer<int16_t>* data() const;
-  ChannelBuffer<float>* data_f();
-  const ChannelBuffer<float>* data_f() const;
-
-  // Returns a pointer to the ChannelBuffer that encapsulates the split data.
-  ChannelBuffer<int16_t>* split_data();
-  const ChannelBuffer<int16_t>* split_data() const;
-  ChannelBuffer<float>* split_data_f();
-  const ChannelBuffer<float>* split_data_f() const;
-
-  // Returns a pointer to the low-pass data downmixed to mono. If this data
-  // isn't already available it re-calculates it.
-  const int16_t* mixed_low_pass_data();
-  const int16_t* low_pass_reference(int channel) const;
-
-  const float* keyboard_data() const;
-
-  void set_activity(AudioFrame::VADActivity activity);
-  AudioFrame::VADActivity activity() const;
-
-  // Use for int16 interleaved data.
-  void DeinterleaveFrom(AudioFrame* audioFrame);
-  // If |data_changed| is false, only the non-audio data members will be copied
-  // to |frame|.
-  void InterleaveTo(AudioFrame* frame, bool data_changed) const;
-
-  // Use for float deinterleaved data.
-  void CopyFrom(const float* const* data, const StreamConfig& stream_config);
-  void CopyTo(const StreamConfig& stream_config, float* const* data);
-  void CopyLowPassToReference();
-
-  // Splits the signal into different bands.
-  void SplitIntoFrequencyBands();
-  // Recombine the different bands into one signal.
-  void MergeFrequencyBands();
-
- private:
-  FRIEND_TEST_ALL_PREFIXES(AudioBufferTest,
-                           SetNumChannelsSetsChannelBuffersNumChannels);
-  // Called from DeinterleaveFrom() and CopyFrom().
-  void InitForNewData();
-
-  // The audio is passed into DeinterleaveFrom() or CopyFrom() with input
-  // format (samples per channel and number of channels).
-  const size_t input_num_frames_;
-  const size_t num_input_channels_;
-  // The audio is stored by DeinterleaveFrom() or CopyFrom() with processing
-  // format.
-  const size_t proc_num_frames_;
-  const size_t num_proc_channels_;
-  // The audio is returned by InterleaveTo() and CopyTo() with output samples
-  // per channels and the current number of channels. This last one can be
-  // changed at any time using set_num_channels().
-  const size_t output_num_frames_;
-  size_t num_channels_;
-
-  size_t num_bands_;
-  size_t num_split_frames_;
-  bool mixed_low_pass_valid_;
-  bool reference_copied_;
-  AudioFrame::VADActivity activity_;
-
-  const float* keyboard_data_;
-  std::unique_ptr<IFChannelBuffer> data_;
-  std::unique_ptr<IFChannelBuffer> split_data_;
-  std::unique_ptr<SplittingFilter> splitting_filter_;
-  std::unique_ptr<ChannelBuffer<int16_t> > mixed_low_pass_channels_;
-  std::unique_ptr<ChannelBuffer<int16_t> > low_pass_reference_channels_;
-  std::unique_ptr<IFChannelBuffer> input_buffer_;
-  std::unique_ptr<IFChannelBuffer> output_buffer_;
-  std::unique_ptr<ChannelBuffer<float> > process_buffer_;
-  std::vector<std::unique_ptr<PushSincResampler>> input_resamplers_;
-  std::vector<std::unique_ptr<PushSincResampler>> output_resamplers_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_AUDIO_BUFFER_H_
diff --git a/modules/audio_processing/audio_buffer_unittest.cc b/modules/audio_processing/audio_buffer_unittest.cc
deleted file mode 100644
index c89770c..0000000
--- a/modules/audio_processing/audio_buffer_unittest.cc
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- *  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_processing/audio_buffer.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-namespace {
-
-const size_t kNumFrames = 480u;
-const size_t kStereo = 2u;
-const size_t kMono = 1u;
-
-void ExpectNumChannels(const AudioBuffer& ab, size_t num_channels) {
-  EXPECT_EQ(ab.data()->num_channels(), num_channels);
-  EXPECT_EQ(ab.data_f()->num_channels(), num_channels);
-  EXPECT_EQ(ab.split_data()->num_channels(), num_channels);
-  EXPECT_EQ(ab.split_data_f()->num_channels(), num_channels);
-  EXPECT_EQ(ab.num_channels(), num_channels);
-}
-
-}  // namespace
-
-TEST(AudioBufferTest, SetNumChannelsSetsChannelBuffersNumChannels) {
-  AudioBuffer ab(kNumFrames, kStereo, kNumFrames, kStereo, kNumFrames);
-  ExpectNumChannels(ab, kStereo);
-  ab.set_num_channels(kMono);
-  ExpectNumChannels(ab, kMono);
-  ab.InitForNewData();
-  ExpectNumChannels(ab, kStereo);
-}
-
-#if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
-TEST(AudioBufferTest, SetNumChannelsDeathTest) {
-  AudioBuffer ab(kNumFrames, kMono, kNumFrames, kMono, kNumFrames);
-  EXPECT_DEATH(ab.set_num_channels(kStereo), "num_channels");
-}
-#endif
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/audio_processing_impl.cc b/modules/audio_processing/audio_processing_impl.cc
deleted file mode 100644
index 9b80318..0000000
--- a/modules/audio_processing/audio_processing_impl.cc
+++ /dev/null
@@ -1,1912 +0,0 @@
-/*
- *  Copyright (c) 2012 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_processing/audio_processing_impl.h"
-
-#include <math.h>
-#include <algorithm>
-#include <string>
-
-#include "webrtc/common_audio/audio_converter.h"
-#include "webrtc/common_audio/channel_buffer.h"
-#include "webrtc/common_audio/include/audio_util.h"
-#include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
-#include "webrtc/modules/audio_processing/aec/aec_core.h"
-#include "webrtc/modules/audio_processing/aec3/echo_canceller3.h"
-#include "webrtc/modules/audio_processing/agc/agc_manager_direct.h"
-#include "webrtc/modules/audio_processing/agc2/gain_controller2.h"
-#include "webrtc/modules/audio_processing/audio_buffer.h"
-#include "webrtc/modules/audio_processing/beamformer/nonlinear_beamformer.h"
-#include "webrtc/modules/audio_processing/common.h"
-#include "webrtc/modules/audio_processing/echo_cancellation_impl.h"
-#include "webrtc/modules/audio_processing/echo_control_mobile_impl.h"
-#include "webrtc/modules/audio_processing/gain_control_for_experimental_agc.h"
-#include "webrtc/modules/audio_processing/gain_control_impl.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/platform_file.h"
-#include "webrtc/rtc_base/trace_event.h"
-#if WEBRTC_INTELLIGIBILITY_ENHANCER
-#include "webrtc/modules/audio_processing/intelligibility/intelligibility_enhancer.h"
-#endif
-#include "webrtc/modules/audio_processing/level_controller/level_controller.h"
-#include "webrtc/modules/audio_processing/level_estimator_impl.h"
-#include "webrtc/modules/audio_processing/low_cut_filter.h"
-#include "webrtc/modules/audio_processing/noise_suppression_impl.h"
-#include "webrtc/modules/audio_processing/residual_echo_detector.h"
-#include "webrtc/modules/audio_processing/transient/transient_suppressor.h"
-#include "webrtc/modules/audio_processing/voice_detection_impl.h"
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/system_wrappers/include/file_wrapper.h"
-#include "webrtc/system_wrappers/include/metrics.h"
-
-// Check to verify that the define for the intelligibility enhancer is properly
-// set.
-#if !defined(WEBRTC_INTELLIGIBILITY_ENHANCER) || \
-    (WEBRTC_INTELLIGIBILITY_ENHANCER != 0 &&     \
-     WEBRTC_INTELLIGIBILITY_ENHANCER != 1)
-#error "Set WEBRTC_INTELLIGIBILITY_ENHANCER to either 0 or 1"
-#endif
-
-#define RETURN_ON_ERR(expr) \
-  do {                      \
-    int err = (expr);       \
-    if (err != kNoError) {  \
-      return err;           \
-    }                       \
-  } while (0)
-
-namespace webrtc {
-
-constexpr int AudioProcessing::kNativeSampleRatesHz[];
-
-namespace {
-
-static bool LayoutHasKeyboard(AudioProcessing::ChannelLayout layout) {
-  switch (layout) {
-    case AudioProcessing::kMono:
-    case AudioProcessing::kStereo:
-      return false;
-    case AudioProcessing::kMonoAndKeyboard:
-    case AudioProcessing::kStereoAndKeyboard:
-      return true;
-  }
-
-  RTC_NOTREACHED();
-  return false;
-}
-
-bool SampleRateSupportsMultiBand(int sample_rate_hz) {
-  return sample_rate_hz == AudioProcessing::kSampleRate32kHz ||
-         sample_rate_hz == AudioProcessing::kSampleRate48kHz;
-}
-
-int FindNativeProcessRateToUse(int minimum_rate, bool band_splitting_required) {
-#ifdef WEBRTC_ARCH_ARM_FAMILY
-  constexpr int kMaxSplittingNativeProcessRate =
-      AudioProcessing::kSampleRate32kHz;
-#else
-  constexpr int kMaxSplittingNativeProcessRate =
-      AudioProcessing::kSampleRate48kHz;
-#endif
-  static_assert(
-      kMaxSplittingNativeProcessRate <= AudioProcessing::kMaxNativeSampleRateHz,
-      "");
-  const int uppermost_native_rate = band_splitting_required
-                                        ? kMaxSplittingNativeProcessRate
-                                        : AudioProcessing::kSampleRate48kHz;
-
-  for (auto rate : AudioProcessing::kNativeSampleRatesHz) {
-    if (rate >= uppermost_native_rate) {
-      return uppermost_native_rate;
-    }
-    if (rate >= minimum_rate) {
-      return rate;
-    }
-  }
-  RTC_NOTREACHED();
-  return uppermost_native_rate;
-}
-
-// Maximum lengths that frame of samples being passed from the render side to
-// the capture side can have (does not apply to AEC3).
-static const size_t kMaxAllowedValuesOfSamplesPerBand = 160;
-static const size_t kMaxAllowedValuesOfSamplesPerFrame = 480;
-
-// Maximum number of frames to buffer in the render queue.
-// TODO(peah): Decrease this once we properly handle hugely unbalanced
-// reverse and forward call numbers.
-static const size_t kMaxNumFramesToBuffer = 100;
-
-class HighPassFilterImpl : public HighPassFilter {
- public:
-  explicit HighPassFilterImpl(AudioProcessingImpl* apm) : apm_(apm) {}
-  ~HighPassFilterImpl() override = default;
-
-  // HighPassFilter implementation.
-  int Enable(bool enable) override {
-    apm_->MutateConfig([enable](AudioProcessing::Config* config) {
-      config->high_pass_filter.enabled = enable;
-    });
-
-    return AudioProcessing::kNoError;
-  }
-
-  bool is_enabled() const override {
-    return apm_->GetConfig().high_pass_filter.enabled;
-  }
-
- private:
-  AudioProcessingImpl* apm_;
-  RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(HighPassFilterImpl);
-};
-
-webrtc::InternalAPMStreamsConfig ToStreamsConfig(
-    const ProcessingConfig& api_format) {
-  webrtc::InternalAPMStreamsConfig result;
-  result.input_sample_rate = api_format.input_stream().sample_rate_hz();
-  result.input_num_channels = api_format.input_stream().num_channels();
-  result.output_num_channels = api_format.output_stream().num_channels();
-  result.render_input_num_channels =
-      api_format.reverse_input_stream().num_channels();
-  result.render_input_sample_rate =
-      api_format.reverse_input_stream().sample_rate_hz();
-  result.output_sample_rate = api_format.output_stream().sample_rate_hz();
-  result.render_output_sample_rate =
-      api_format.reverse_output_stream().sample_rate_hz();
-  result.render_output_num_channels =
-      api_format.reverse_output_stream().num_channels();
-  return result;
-}
-}  // namespace
-
-// Throughout webrtc, it's assumed that success is represented by zero.
-static_assert(AudioProcessing::kNoError == 0, "kNoError must be zero");
-
-AudioProcessingImpl::ApmSubmoduleStates::ApmSubmoduleStates() {}
-
-bool AudioProcessingImpl::ApmSubmoduleStates::Update(
-    bool low_cut_filter_enabled,
-    bool echo_canceller_enabled,
-    bool mobile_echo_controller_enabled,
-    bool residual_echo_detector_enabled,
-    bool noise_suppressor_enabled,
-    bool intelligibility_enhancer_enabled,
-    bool beamformer_enabled,
-    bool adaptive_gain_controller_enabled,
-    bool gain_controller2_enabled,
-    bool level_controller_enabled,
-    bool echo_canceller3_enabled,
-    bool voice_activity_detector_enabled,
-    bool level_estimator_enabled,
-    bool transient_suppressor_enabled) {
-  bool changed = false;
-  changed |= (low_cut_filter_enabled != low_cut_filter_enabled_);
-  changed |= (echo_canceller_enabled != echo_canceller_enabled_);
-  changed |=
-      (mobile_echo_controller_enabled != mobile_echo_controller_enabled_);
-  changed |=
-      (residual_echo_detector_enabled != residual_echo_detector_enabled_);
-  changed |= (noise_suppressor_enabled != noise_suppressor_enabled_);
-  changed |=
-      (intelligibility_enhancer_enabled != intelligibility_enhancer_enabled_);
-  changed |= (beamformer_enabled != beamformer_enabled_);
-  changed |=
-      (adaptive_gain_controller_enabled != adaptive_gain_controller_enabled_);
-  changed |=
-      (gain_controller2_enabled != gain_controller2_enabled_);
-  changed |= (level_controller_enabled != level_controller_enabled_);
-  changed |= (echo_canceller3_enabled != echo_canceller3_enabled_);
-  changed |= (level_estimator_enabled != level_estimator_enabled_);
-  changed |=
-      (voice_activity_detector_enabled != voice_activity_detector_enabled_);
-  changed |= (transient_suppressor_enabled != transient_suppressor_enabled_);
-  if (changed) {
-    low_cut_filter_enabled_ = low_cut_filter_enabled;
-    echo_canceller_enabled_ = echo_canceller_enabled;
-    mobile_echo_controller_enabled_ = mobile_echo_controller_enabled;
-    residual_echo_detector_enabled_ = residual_echo_detector_enabled;
-    noise_suppressor_enabled_ = noise_suppressor_enabled;
-    intelligibility_enhancer_enabled_ = intelligibility_enhancer_enabled;
-    beamformer_enabled_ = beamformer_enabled;
-    adaptive_gain_controller_enabled_ = adaptive_gain_controller_enabled;
-    gain_controller2_enabled_ = gain_controller2_enabled;
-    level_controller_enabled_ = level_controller_enabled;
-    echo_canceller3_enabled_ = echo_canceller3_enabled;
-    level_estimator_enabled_ = level_estimator_enabled;
-    voice_activity_detector_enabled_ = voice_activity_detector_enabled;
-    transient_suppressor_enabled_ = transient_suppressor_enabled;
-  }
-
-  changed |= first_update_;
-  first_update_ = false;
-  return changed;
-}
-
-bool AudioProcessingImpl::ApmSubmoduleStates::CaptureMultiBandSubModulesActive()
-    const {
-#if WEBRTC_INTELLIGIBILITY_ENHANCER
-  return CaptureMultiBandProcessingActive() ||
-         intelligibility_enhancer_enabled_ || voice_activity_detector_enabled_;
-#else
-  return CaptureMultiBandProcessingActive() || voice_activity_detector_enabled_;
-#endif
-}
-
-bool AudioProcessingImpl::ApmSubmoduleStates::CaptureMultiBandProcessingActive()
-    const {
-  return low_cut_filter_enabled_ || echo_canceller_enabled_ ||
-         mobile_echo_controller_enabled_ || noise_suppressor_enabled_ ||
-         beamformer_enabled_ || adaptive_gain_controller_enabled_ ||
-         echo_canceller3_enabled_;
-}
-
-bool AudioProcessingImpl::ApmSubmoduleStates::CaptureFullBandProcessingActive()
-    const {
-  return level_controller_enabled_;
-}
-
-bool AudioProcessingImpl::ApmSubmoduleStates::RenderMultiBandSubModulesActive()
-    const {
-  return RenderMultiBandProcessingActive() || echo_canceller_enabled_ ||
-         mobile_echo_controller_enabled_ || adaptive_gain_controller_enabled_ ||
-         echo_canceller3_enabled_;
-}
-
-bool AudioProcessingImpl::ApmSubmoduleStates::RenderMultiBandProcessingActive()
-    const {
-#if WEBRTC_INTELLIGIBILITY_ENHANCER
-  return intelligibility_enhancer_enabled_;
-#else
-  return false;
-#endif
-}
-
-struct AudioProcessingImpl::ApmPublicSubmodules {
-  ApmPublicSubmodules() {}
-  // Accessed externally of APM without any lock acquired.
-  std::unique_ptr<EchoCancellationImpl> echo_cancellation;
-  std::unique_ptr<EchoControlMobileImpl> echo_control_mobile;
-  std::unique_ptr<GainControlImpl> gain_control;
-  std::unique_ptr<LevelEstimatorImpl> level_estimator;
-  std::unique_ptr<NoiseSuppressionImpl> noise_suppression;
-  std::unique_ptr<VoiceDetectionImpl> voice_detection;
-  std::unique_ptr<GainControlForExperimentalAgc>
-      gain_control_for_experimental_agc;
-
-  // Accessed internally from both render and capture.
-  std::unique_ptr<TransientSuppressor> transient_suppressor;
-#if WEBRTC_INTELLIGIBILITY_ENHANCER
-  std::unique_ptr<IntelligibilityEnhancer> intelligibility_enhancer;
-#endif
-};
-
-struct AudioProcessingImpl::ApmPrivateSubmodules {
-  explicit ApmPrivateSubmodules(NonlinearBeamformer* beamformer)
-      : beamformer(beamformer) {}
-  // Accessed internally from capture or during initialization
-  std::unique_ptr<NonlinearBeamformer> beamformer;
-  std::unique_ptr<AgcManagerDirect> agc_manager;
-  std::unique_ptr<GainController2> gain_controller2;
-  std::unique_ptr<LowCutFilter> low_cut_filter;
-  std::unique_ptr<LevelController> level_controller;
-  std::unique_ptr<ResidualEchoDetector> residual_echo_detector;
-  std::unique_ptr<EchoCanceller3> echo_canceller3;
-};
-
-AudioProcessing* AudioProcessing::Create() {
-  webrtc::Config config;
-  return Create(config, nullptr);
-}
-
-AudioProcessing* AudioProcessing::Create(const webrtc::Config& config) {
-  return Create(config, nullptr);
-}
-
-AudioProcessing* AudioProcessing::Create(const webrtc::Config& config,
-                                         NonlinearBeamformer* beamformer) {
-  AudioProcessingImpl* apm =
-      new rtc::RefCountedObject<AudioProcessingImpl>(config, beamformer);
-  if (apm->Initialize() != kNoError) {
-    delete apm;
-    apm = nullptr;
-  }
-
-  return apm;
-}
-
-AudioProcessingImpl::AudioProcessingImpl(const webrtc::Config& config)
-    : AudioProcessingImpl(config, nullptr) {}
-
-AudioProcessingImpl::AudioProcessingImpl(const webrtc::Config& config,
-                                         NonlinearBeamformer* beamformer)
-    : high_pass_filter_impl_(new HighPassFilterImpl(this)),
-      public_submodules_(new ApmPublicSubmodules()),
-      private_submodules_(new ApmPrivateSubmodules(beamformer)),
-      constants_(config.Get<ExperimentalAgc>().startup_min_volume,
-                 config.Get<ExperimentalAgc>().clipped_level_min,
-#if defined(WEBRTC_ANDROID) || defined(WEBRTC_IOS)
-                 false),
-#else
-                 config.Get<ExperimentalAgc>().enabled),
-#endif
-#if defined(WEBRTC_ANDROID) || defined(WEBRTC_IOS)
-      capture_(false,
-#else
-      capture_(config.Get<ExperimentalNs>().enabled,
-#endif
-               config.Get<Beamforming>().array_geometry,
-               config.Get<Beamforming>().target_direction),
-      capture_nonlocked_(config.Get<Beamforming>().enabled,
-                         config.Get<Intelligibility>().enabled) {
-  {
-    rtc::CritScope cs_render(&crit_render_);
-    rtc::CritScope cs_capture(&crit_capture_);
-
-    public_submodules_->echo_cancellation.reset(
-        new EchoCancellationImpl(&crit_render_, &crit_capture_));
-    public_submodules_->echo_control_mobile.reset(
-        new EchoControlMobileImpl(&crit_render_, &crit_capture_));
-    public_submodules_->gain_control.reset(
-        new GainControlImpl(&crit_capture_, &crit_capture_));
-    public_submodules_->level_estimator.reset(
-        new LevelEstimatorImpl(&crit_capture_));
-    public_submodules_->noise_suppression.reset(
-        new NoiseSuppressionImpl(&crit_capture_));
-    public_submodules_->voice_detection.reset(
-        new VoiceDetectionImpl(&crit_capture_));
-    public_submodules_->gain_control_for_experimental_agc.reset(
-        new GainControlForExperimentalAgc(
-            public_submodules_->gain_control.get(), &crit_capture_));
-    private_submodules_->residual_echo_detector.reset(
-        new ResidualEchoDetector());
-
-    // TODO(peah): Move this creation to happen only when the level controller
-    // is enabled.
-    private_submodules_->level_controller.reset(new LevelController());
-  }
-
-  SetExtraOptions(config);
-}
-
-AudioProcessingImpl::~AudioProcessingImpl() {
-  // Depends on gain_control_ and
-  // public_submodules_->gain_control_for_experimental_agc.
-  private_submodules_->agc_manager.reset();
-  // Depends on gain_control_.
-  public_submodules_->gain_control_for_experimental_agc.reset();
-}
-
-int AudioProcessingImpl::Initialize() {
-  // Run in a single-threaded manner during initialization.
-  rtc::CritScope cs_render(&crit_render_);
-  rtc::CritScope cs_capture(&crit_capture_);
-  return InitializeLocked();
-}
-
-int AudioProcessingImpl::Initialize(int capture_input_sample_rate_hz,
-                                    int capture_output_sample_rate_hz,
-                                    int render_input_sample_rate_hz,
-                                    ChannelLayout capture_input_layout,
-                                    ChannelLayout capture_output_layout,
-                                    ChannelLayout render_input_layout) {
-  const ProcessingConfig processing_config = {
-      {{capture_input_sample_rate_hz, ChannelsFromLayout(capture_input_layout),
-        LayoutHasKeyboard(capture_input_layout)},
-       {capture_output_sample_rate_hz,
-        ChannelsFromLayout(capture_output_layout),
-        LayoutHasKeyboard(capture_output_layout)},
-       {render_input_sample_rate_hz, ChannelsFromLayout(render_input_layout),
-        LayoutHasKeyboard(render_input_layout)},
-       {render_input_sample_rate_hz, ChannelsFromLayout(render_input_layout),
-        LayoutHasKeyboard(render_input_layout)}}};
-
-  return Initialize(processing_config);
-}
-
-int AudioProcessingImpl::Initialize(const ProcessingConfig& processing_config) {
-  // Run in a single-threaded manner during initialization.
-  rtc::CritScope cs_render(&crit_render_);
-  rtc::CritScope cs_capture(&crit_capture_);
-  return InitializeLocked(processing_config);
-}
-
-int AudioProcessingImpl::MaybeInitializeRender(
-    const ProcessingConfig& processing_config) {
-  return MaybeInitialize(processing_config, false);
-}
-
-int AudioProcessingImpl::MaybeInitializeCapture(
-    const ProcessingConfig& processing_config,
-    bool force_initialization) {
-  return MaybeInitialize(processing_config, force_initialization);
-}
-
-// Calls InitializeLocked() if any of the audio parameters have changed from
-// their current values (needs to be called while holding the crit_render_lock).
-int AudioProcessingImpl::MaybeInitialize(
-    const ProcessingConfig& processing_config,
-    bool force_initialization) {
-  // Called from both threads. Thread check is therefore not possible.
-  if (processing_config == formats_.api_format && !force_initialization) {
-    return kNoError;
-  }
-
-  rtc::CritScope cs_capture(&crit_capture_);
-  return InitializeLocked(processing_config);
-}
-
-int AudioProcessingImpl::InitializeLocked() {
-  UpdateActiveSubmoduleStates();
-
-  const int capture_audiobuffer_num_channels =
-      capture_nonlocked_.beamformer_enabled
-          ? formats_.api_format.input_stream().num_channels()
-          : formats_.api_format.output_stream().num_channels();
-
-  const int render_audiobuffer_num_output_frames =
-      formats_.api_format.reverse_output_stream().num_frames() == 0
-          ? formats_.render_processing_format.num_frames()
-          : formats_.api_format.reverse_output_stream().num_frames();
-  if (formats_.api_format.reverse_input_stream().num_channels() > 0) {
-    render_.render_audio.reset(new AudioBuffer(
-        formats_.api_format.reverse_input_stream().num_frames(),
-        formats_.api_format.reverse_input_stream().num_channels(),
-        formats_.render_processing_format.num_frames(),
-        formats_.render_processing_format.num_channels(),
-        render_audiobuffer_num_output_frames));
-    if (formats_.api_format.reverse_input_stream() !=
-        formats_.api_format.reverse_output_stream()) {
-      render_.render_converter = AudioConverter::Create(
-          formats_.api_format.reverse_input_stream().num_channels(),
-          formats_.api_format.reverse_input_stream().num_frames(),
-          formats_.api_format.reverse_output_stream().num_channels(),
-          formats_.api_format.reverse_output_stream().num_frames());
-    } else {
-      render_.render_converter.reset(nullptr);
-    }
-  } else {
-    render_.render_audio.reset(nullptr);
-    render_.render_converter.reset(nullptr);
-  }
-
-  capture_.capture_audio.reset(
-      new AudioBuffer(formats_.api_format.input_stream().num_frames(),
-                      formats_.api_format.input_stream().num_channels(),
-                      capture_nonlocked_.capture_processing_format.num_frames(),
-                      capture_audiobuffer_num_channels,
-                      formats_.api_format.output_stream().num_frames()));
-
-  public_submodules_->echo_cancellation->Initialize(
-      proc_sample_rate_hz(), num_reverse_channels(), num_output_channels(),
-      num_proc_channels());
-  AllocateRenderQueue();
-
-  int success = public_submodules_->echo_cancellation->enable_metrics(true);
-  RTC_DCHECK_EQ(0, success);
-  success = public_submodules_->echo_cancellation->enable_delay_logging(true);
-  RTC_DCHECK_EQ(0, success);
-  public_submodules_->echo_control_mobile->Initialize(
-      proc_split_sample_rate_hz(), num_reverse_channels(),
-      num_output_channels());
-
-  public_submodules_->gain_control->Initialize(num_proc_channels(),
-                                               proc_sample_rate_hz());
-  if (constants_.use_experimental_agc) {
-    if (!private_submodules_->agc_manager.get()) {
-      private_submodules_->agc_manager.reset(new AgcManagerDirect(
-          public_submodules_->gain_control.get(),
-          public_submodules_->gain_control_for_experimental_agc.get(),
-          constants_.agc_startup_min_volume, constants_.agc_clipped_level_min));
-    }
-    private_submodules_->agc_manager->Initialize();
-    private_submodules_->agc_manager->SetCaptureMuted(
-        capture_.output_will_be_muted);
-    public_submodules_->gain_control_for_experimental_agc->Initialize();
-  }
-  InitializeTransient();
-  InitializeBeamformer();
-#if WEBRTC_INTELLIGIBILITY_ENHANCER
-  InitializeIntelligibility();
-#endif
-  InitializeLowCutFilter();
-  public_submodules_->noise_suppression->Initialize(num_proc_channels(),
-                                                    proc_sample_rate_hz());
-  public_submodules_->voice_detection->Initialize(proc_split_sample_rate_hz());
-  public_submodules_->level_estimator->Initialize();
-  InitializeLevelController();
-  InitializeResidualEchoDetector();
-  InitializeEchoCanceller3();
-  InitializeGainController2();
-
-  if (aec_dump_) {
-    aec_dump_->WriteInitMessage(ToStreamsConfig(formats_.api_format));
-  }
-  return kNoError;
-}
-
-int AudioProcessingImpl::InitializeLocked(const ProcessingConfig& config) {
-  UpdateActiveSubmoduleStates();
-
-  for (const auto& stream : config.streams) {
-    if (stream.num_channels() > 0 && stream.sample_rate_hz() <= 0) {
-      return kBadSampleRateError;
-    }
-  }
-
-  const size_t num_in_channels = config.input_stream().num_channels();
-  const size_t num_out_channels = config.output_stream().num_channels();
-
-  // Need at least one input channel.
-  // Need either one output channel or as many outputs as there are inputs.
-  if (num_in_channels == 0 ||
-      !(num_out_channels == 1 || num_out_channels == num_in_channels)) {
-    return kBadNumberChannelsError;
-  }
-
-  if (capture_nonlocked_.beamformer_enabled &&
-      num_in_channels != capture_.array_geometry.size()) {
-    return kBadNumberChannelsError;
-  }
-
-  formats_.api_format = config;
-
-  int capture_processing_rate = FindNativeProcessRateToUse(
-      std::min(formats_.api_format.input_stream().sample_rate_hz(),
-               formats_.api_format.output_stream().sample_rate_hz()),
-      submodule_states_.CaptureMultiBandSubModulesActive() ||
-          submodule_states_.RenderMultiBandSubModulesActive());
-
-  capture_nonlocked_.capture_processing_format =
-      StreamConfig(capture_processing_rate);
-
-  int render_processing_rate;
-  if (!config_.echo_canceller3.enabled) {
-    render_processing_rate = FindNativeProcessRateToUse(
-        std::min(formats_.api_format.reverse_input_stream().sample_rate_hz(),
-                 formats_.api_format.reverse_output_stream().sample_rate_hz()),
-        submodule_states_.CaptureMultiBandSubModulesActive() ||
-            submodule_states_.RenderMultiBandSubModulesActive());
-  } else {
-    render_processing_rate = capture_processing_rate;
-  }
-
-  // TODO(aluebs): Remove this restriction once we figure out why the 3-band
-  // splitting filter degrades the AEC performance.
-  if (render_processing_rate > kSampleRate32kHz &&
-      !config_.echo_canceller3.enabled) {
-    render_processing_rate = submodule_states_.RenderMultiBandProcessingActive()
-                                 ? kSampleRate32kHz
-                                 : kSampleRate16kHz;
-  }
-
-  // If the forward sample rate is 8 kHz, the render stream is also processed
-  // at this rate.
-  if (capture_nonlocked_.capture_processing_format.sample_rate_hz() ==
-      kSampleRate8kHz) {
-    render_processing_rate = kSampleRate8kHz;
-  } else {
-    render_processing_rate =
-        std::max(render_processing_rate, static_cast<int>(kSampleRate16kHz));
-  }
-
-  // Always downmix the render stream to mono for analysis. This has been
-  // demonstrated to work well for AEC in most practical scenarios.
-  if (submodule_states_.RenderMultiBandSubModulesActive()) {
-    formats_.render_processing_format = StreamConfig(render_processing_rate, 1);
-  } else {
-    formats_.render_processing_format = StreamConfig(
-        formats_.api_format.reverse_input_stream().sample_rate_hz(),
-        formats_.api_format.reverse_input_stream().num_channels());
-  }
-
-  if (capture_nonlocked_.capture_processing_format.sample_rate_hz() ==
-          kSampleRate32kHz ||
-      capture_nonlocked_.capture_processing_format.sample_rate_hz() ==
-          kSampleRate48kHz) {
-    capture_nonlocked_.split_rate = kSampleRate16kHz;
-  } else {
-    capture_nonlocked_.split_rate =
-        capture_nonlocked_.capture_processing_format.sample_rate_hz();
-  }
-
-  return InitializeLocked();
-}
-
-void AudioProcessingImpl::ApplyConfig(const AudioProcessing::Config& config) {
-  config_ = config;
-
-  bool config_ok = LevelController::Validate(config_.level_controller);
-  if (!config_ok) {
-    LOG(LS_ERROR) << "AudioProcessing module config error" << std::endl
-                  << "level_controller: "
-                  << LevelController::ToString(config_.level_controller)
-                  << std::endl
-                  << "Reverting to default parameter set";
-    config_.level_controller = AudioProcessing::Config::LevelController();
-  }
-
-  // Run in a single-threaded manner when applying the settings.
-  rtc::CritScope cs_render(&crit_render_);
-  rtc::CritScope cs_capture(&crit_capture_);
-
-  // TODO(peah): Replace the use of capture_nonlocked_.level_controller_enabled
-  // with the value in config_ everywhere in the code.
-  if (capture_nonlocked_.level_controller_enabled !=
-      config_.level_controller.enabled) {
-    capture_nonlocked_.level_controller_enabled =
-        config_.level_controller.enabled;
-    // TODO(peah): Remove the conditional initialization to always initialize
-    // the level controller regardless of whether it is enabled or not.
-    InitializeLevelController();
-  }
-  LOG(LS_INFO) << "Level controller activated: "
-               << capture_nonlocked_.level_controller_enabled;
-
-  private_submodules_->level_controller->ApplyConfig(config_.level_controller);
-
-  InitializeLowCutFilter();
-
-  LOG(LS_INFO) << "Highpass filter activated: "
-               << config_.high_pass_filter.enabled;
-
-  config_ok = EchoCanceller3::Validate(config_.echo_canceller3);
-  if (!config_ok) {
-    LOG(LS_ERROR) << "AudioProcessing module config error" << std::endl
-                  << "echo canceller 3: "
-                  << EchoCanceller3::ToString(config_.echo_canceller3)
-                  << std::endl
-                  << "Reverting to default parameter set";
-    config_.echo_canceller3 = AudioProcessing::Config::EchoCanceller3();
-  }
-
-  if (config.echo_canceller3.enabled !=
-      capture_nonlocked_.echo_canceller3_enabled) {
-    capture_nonlocked_.echo_canceller3_enabled =
-        config_.echo_canceller3.enabled;
-    InitializeEchoCanceller3();
-    LOG(LS_INFO) << "Echo canceller 3 activated: "
-                 << capture_nonlocked_.echo_canceller3_enabled;
-  }
-
-  config_ok = GainController2::Validate(config_.gain_controller2);
-  if (!config_ok) {
-    LOG(LS_ERROR) << "AudioProcessing module config error" << std::endl
-                  << "gain_controller2: "
-                  << GainController2::ToString(config_.gain_controller2)
-                  << std::endl
-                  << "Reverting to default parameter set";
-    config_.gain_controller2 = AudioProcessing::Config::GainController2();
-  }
-
-  if (config.gain_controller2.enabled !=
-      capture_nonlocked_.gain_controller2_enabled) {
-    capture_nonlocked_.gain_controller2_enabled =
-        config_.gain_controller2.enabled;
-    InitializeGainController2();
-    LOG(LS_INFO) << "Gain controller 2 activated: "
-                 << capture_nonlocked_.gain_controller2_enabled;
-  }
-}
-
-void AudioProcessingImpl::SetExtraOptions(const webrtc::Config& config) {
-  // Run in a single-threaded manner when setting the extra options.
-  rtc::CritScope cs_render(&crit_render_);
-  rtc::CritScope cs_capture(&crit_capture_);
-
-  public_submodules_->echo_cancellation->SetExtraOptions(config);
-
-  if (capture_.transient_suppressor_enabled !=
-      config.Get<ExperimentalNs>().enabled) {
-    capture_.transient_suppressor_enabled =
-        config.Get<ExperimentalNs>().enabled;
-    InitializeTransient();
-  }
-
-#if WEBRTC_INTELLIGIBILITY_ENHANCER
-  if (capture_nonlocked_.intelligibility_enabled !=
-     config.Get<Intelligibility>().enabled) {
-    capture_nonlocked_.intelligibility_enabled =
-        config.Get<Intelligibility>().enabled;
-    InitializeIntelligibility();
-  }
-#endif
-
-#ifdef WEBRTC_ANDROID_PLATFORM_BUILD
-  if (capture_nonlocked_.beamformer_enabled !=
-          config.Get<Beamforming>().enabled) {
-    capture_nonlocked_.beamformer_enabled = config.Get<Beamforming>().enabled;
-    if (config.Get<Beamforming>().array_geometry.size() > 1) {
-      capture_.array_geometry = config.Get<Beamforming>().array_geometry;
-    }
-    capture_.target_direction = config.Get<Beamforming>().target_direction;
-    InitializeBeamformer();
-  }
-#endif  // WEBRTC_ANDROID_PLATFORM_BUILD
-}
-
-int AudioProcessingImpl::proc_sample_rate_hz() const {
-  // Used as callback from submodules, hence locking is not allowed.
-  return capture_nonlocked_.capture_processing_format.sample_rate_hz();
-}
-
-int AudioProcessingImpl::proc_split_sample_rate_hz() const {
-  // Used as callback from submodules, hence locking is not allowed.
-  return capture_nonlocked_.split_rate;
-}
-
-size_t AudioProcessingImpl::num_reverse_channels() const {
-  // Used as callback from submodules, hence locking is not allowed.
-  return formats_.render_processing_format.num_channels();
-}
-
-size_t AudioProcessingImpl::num_input_channels() const {
-  // Used as callback from submodules, hence locking is not allowed.
-  return formats_.api_format.input_stream().num_channels();
-}
-
-size_t AudioProcessingImpl::num_proc_channels() const {
-  // Used as callback from submodules, hence locking is not allowed.
-  return (capture_nonlocked_.beamformer_enabled ||
-          capture_nonlocked_.echo_canceller3_enabled)
-             ? 1
-             : num_output_channels();
-}
-
-size_t AudioProcessingImpl::num_output_channels() const {
-  // Used as callback from submodules, hence locking is not allowed.
-  return formats_.api_format.output_stream().num_channels();
-}
-
-void AudioProcessingImpl::set_output_will_be_muted(bool muted) {
-  rtc::CritScope cs(&crit_capture_);
-  capture_.output_will_be_muted = muted;
-  if (private_submodules_->agc_manager.get()) {
-    private_submodules_->agc_manager->SetCaptureMuted(
-        capture_.output_will_be_muted);
-  }
-}
-
-
-int AudioProcessingImpl::ProcessStream(const float* const* src,
-                                       size_t samples_per_channel,
-                                       int input_sample_rate_hz,
-                                       ChannelLayout input_layout,
-                                       int output_sample_rate_hz,
-                                       ChannelLayout output_layout,
-                                       float* const* dest) {
-  TRACE_EVENT0("webrtc", "AudioProcessing::ProcessStream_ChannelLayout");
-  StreamConfig input_stream;
-  StreamConfig output_stream;
-  {
-    // Access the formats_.api_format.input_stream beneath the capture lock.
-    // The lock must be released as it is later required in the call
-    // to ProcessStream(,,,);
-    rtc::CritScope cs(&crit_capture_);
-    input_stream = formats_.api_format.input_stream();
-    output_stream = formats_.api_format.output_stream();
-  }
-
-  input_stream.set_sample_rate_hz(input_sample_rate_hz);
-  input_stream.set_num_channels(ChannelsFromLayout(input_layout));
-  input_stream.set_has_keyboard(LayoutHasKeyboard(input_layout));
-  output_stream.set_sample_rate_hz(output_sample_rate_hz);
-  output_stream.set_num_channels(ChannelsFromLayout(output_layout));
-  output_stream.set_has_keyboard(LayoutHasKeyboard(output_layout));
-
-  if (samples_per_channel != input_stream.num_frames()) {
-    return kBadDataLengthError;
-  }
-  return ProcessStream(src, input_stream, output_stream, dest);
-}
-
-int AudioProcessingImpl::ProcessStream(const float* const* src,
-                                       const StreamConfig& input_config,
-                                       const StreamConfig& output_config,
-                                       float* const* dest) {
-  TRACE_EVENT0("webrtc", "AudioProcessing::ProcessStream_StreamConfig");
-  ProcessingConfig processing_config;
-  bool reinitialization_required = false;
-  {
-    // Acquire the capture lock in order to safely call the function
-    // that retrieves the render side data. This function accesses apm
-    // getters that need the capture lock held when being called.
-    rtc::CritScope cs_capture(&crit_capture_);
-    EmptyQueuedRenderAudio();
-
-    if (!src || !dest) {
-      return kNullPointerError;
-    }
-
-    processing_config = formats_.api_format;
-    reinitialization_required = UpdateActiveSubmoduleStates();
-  }
-
-  processing_config.input_stream() = input_config;
-  processing_config.output_stream() = output_config;
-
-  {
-    // Do conditional reinitialization.
-    rtc::CritScope cs_render(&crit_render_);
-    RETURN_ON_ERR(
-        MaybeInitializeCapture(processing_config, reinitialization_required));
-  }
-  rtc::CritScope cs_capture(&crit_capture_);
-  RTC_DCHECK_EQ(processing_config.input_stream().num_frames(),
-                formats_.api_format.input_stream().num_frames());
-
-  if (aec_dump_) {
-    RecordUnprocessedCaptureStream(src);
-  }
-
-  capture_.capture_audio->CopyFrom(src, formats_.api_format.input_stream());
-  RETURN_ON_ERR(ProcessCaptureStreamLocked());
-  capture_.capture_audio->CopyTo(formats_.api_format.output_stream(), dest);
-
-  if (aec_dump_) {
-    RecordProcessedCaptureStream(dest);
-  }
-  return kNoError;
-}
-
-void AudioProcessingImpl::QueueBandedRenderAudio(AudioBuffer* audio) {
-  EchoCancellationImpl::PackRenderAudioBuffer(audio, num_output_channels(),
-                                              num_reverse_channels(),
-                                              &aec_render_queue_buffer_);
-
-  RTC_DCHECK_GE(160, audio->num_frames_per_band());
-
-  // Insert the samples into the queue.
-  if (!aec_render_signal_queue_->Insert(&aec_render_queue_buffer_)) {
-    // The data queue is full and needs to be emptied.
-    EmptyQueuedRenderAudio();
-
-    // Retry the insert (should always work).
-    bool result = aec_render_signal_queue_->Insert(&aec_render_queue_buffer_);
-    RTC_DCHECK(result);
-  }
-
-  EchoControlMobileImpl::PackRenderAudioBuffer(audio, num_output_channels(),
-                                               num_reverse_channels(),
-                                               &aecm_render_queue_buffer_);
-
-  // Insert the samples into the queue.
-  if (!aecm_render_signal_queue_->Insert(&aecm_render_queue_buffer_)) {
-    // The data queue is full and needs to be emptied.
-    EmptyQueuedRenderAudio();
-
-    // Retry the insert (should always work).
-    bool result = aecm_render_signal_queue_->Insert(&aecm_render_queue_buffer_);
-    RTC_DCHECK(result);
-  }
-
-  if (!constants_.use_experimental_agc) {
-    GainControlImpl::PackRenderAudioBuffer(audio, &agc_render_queue_buffer_);
-    // Insert the samples into the queue.
-    if (!agc_render_signal_queue_->Insert(&agc_render_queue_buffer_)) {
-      // The data queue is full and needs to be emptied.
-      EmptyQueuedRenderAudio();
-
-      // Retry the insert (should always work).
-      bool result = agc_render_signal_queue_->Insert(&agc_render_queue_buffer_);
-      RTC_DCHECK(result);
-    }
-  }
-}
-
-void AudioProcessingImpl::QueueNonbandedRenderAudio(AudioBuffer* audio) {
-  ResidualEchoDetector::PackRenderAudioBuffer(audio, &red_render_queue_buffer_);
-
-  // Insert the samples into the queue.
-  if (!red_render_signal_queue_->Insert(&red_render_queue_buffer_)) {
-    // The data queue is full and needs to be emptied.
-    EmptyQueuedRenderAudio();
-
-    // Retry the insert (should always work).
-    bool result = red_render_signal_queue_->Insert(&red_render_queue_buffer_);
-    RTC_DCHECK(result);
-  }
-}
-
-void AudioProcessingImpl::AllocateRenderQueue() {
-  const size_t new_aec_render_queue_element_max_size =
-      std::max(static_cast<size_t>(1),
-               kMaxAllowedValuesOfSamplesPerBand *
-                   EchoCancellationImpl::NumCancellersRequired(
-                       num_output_channels(), num_reverse_channels()));
-
-  const size_t new_aecm_render_queue_element_max_size =
-      std::max(static_cast<size_t>(1),
-               kMaxAllowedValuesOfSamplesPerBand *
-                   EchoControlMobileImpl::NumCancellersRequired(
-                       num_output_channels(), num_reverse_channels()));
-
-  const size_t new_agc_render_queue_element_max_size =
-      std::max(static_cast<size_t>(1), kMaxAllowedValuesOfSamplesPerBand);
-
-  const size_t new_red_render_queue_element_max_size =
-      std::max(static_cast<size_t>(1), kMaxAllowedValuesOfSamplesPerFrame);
-
-  // Reallocate the queues if the queue item sizes are too small to fit the
-  // data to put in the queues.
-  if (aec_render_queue_element_max_size_ <
-      new_aec_render_queue_element_max_size) {
-    aec_render_queue_element_max_size_ = new_aec_render_queue_element_max_size;
-
-    std::vector<float> template_queue_element(
-        aec_render_queue_element_max_size_);
-
-    aec_render_signal_queue_.reset(
-        new SwapQueue<std::vector<float>, RenderQueueItemVerifier<float>>(
-            kMaxNumFramesToBuffer, template_queue_element,
-            RenderQueueItemVerifier<float>(
-                aec_render_queue_element_max_size_)));
-
-    aec_render_queue_buffer_.resize(aec_render_queue_element_max_size_);
-    aec_capture_queue_buffer_.resize(aec_render_queue_element_max_size_);
-  } else {
-    aec_render_signal_queue_->Clear();
-  }
-
-  if (aecm_render_queue_element_max_size_ <
-      new_aecm_render_queue_element_max_size) {
-    aecm_render_queue_element_max_size_ =
-        new_aecm_render_queue_element_max_size;
-
-    std::vector<int16_t> template_queue_element(
-        aecm_render_queue_element_max_size_);
-
-    aecm_render_signal_queue_.reset(
-        new SwapQueue<std::vector<int16_t>, RenderQueueItemVerifier<int16_t>>(
-            kMaxNumFramesToBuffer, template_queue_element,
-            RenderQueueItemVerifier<int16_t>(
-                aecm_render_queue_element_max_size_)));
-
-    aecm_render_queue_buffer_.resize(aecm_render_queue_element_max_size_);
-    aecm_capture_queue_buffer_.resize(aecm_render_queue_element_max_size_);
-  } else {
-    aecm_render_signal_queue_->Clear();
-  }
-
-  if (agc_render_queue_element_max_size_ <
-      new_agc_render_queue_element_max_size) {
-    agc_render_queue_element_max_size_ = new_agc_render_queue_element_max_size;
-
-    std::vector<int16_t> template_queue_element(
-        agc_render_queue_element_max_size_);
-
-    agc_render_signal_queue_.reset(
-        new SwapQueue<std::vector<int16_t>, RenderQueueItemVerifier<int16_t>>(
-            kMaxNumFramesToBuffer, template_queue_element,
-            RenderQueueItemVerifier<int16_t>(
-                agc_render_queue_element_max_size_)));
-
-    agc_render_queue_buffer_.resize(agc_render_queue_element_max_size_);
-    agc_capture_queue_buffer_.resize(agc_render_queue_element_max_size_);
-  } else {
-    agc_render_signal_queue_->Clear();
-  }
-
-  if (red_render_queue_element_max_size_ <
-      new_red_render_queue_element_max_size) {
-    red_render_queue_element_max_size_ = new_red_render_queue_element_max_size;
-
-    std::vector<float> template_queue_element(
-        red_render_queue_element_max_size_);
-
-    red_render_signal_queue_.reset(
-        new SwapQueue<std::vector<float>, RenderQueueItemVerifier<float>>(
-            kMaxNumFramesToBuffer, template_queue_element,
-            RenderQueueItemVerifier<float>(
-                red_render_queue_element_max_size_)));
-
-    red_render_queue_buffer_.resize(red_render_queue_element_max_size_);
-    red_capture_queue_buffer_.resize(red_render_queue_element_max_size_);
-  } else {
-    red_render_signal_queue_->Clear();
-  }
-}
-
-void AudioProcessingImpl::EmptyQueuedRenderAudio() {
-  rtc::CritScope cs_capture(&crit_capture_);
-  while (aec_render_signal_queue_->Remove(&aec_capture_queue_buffer_)) {
-    public_submodules_->echo_cancellation->ProcessRenderAudio(
-        aec_capture_queue_buffer_);
-  }
-
-  while (aecm_render_signal_queue_->Remove(&aecm_capture_queue_buffer_)) {
-    public_submodules_->echo_control_mobile->ProcessRenderAudio(
-        aecm_capture_queue_buffer_);
-  }
-
-  while (agc_render_signal_queue_->Remove(&agc_capture_queue_buffer_)) {
-    public_submodules_->gain_control->ProcessRenderAudio(
-        agc_capture_queue_buffer_);
-  }
-
-  while (red_render_signal_queue_->Remove(&red_capture_queue_buffer_)) {
-    private_submodules_->residual_echo_detector->AnalyzeRenderAudio(
-        red_capture_queue_buffer_);
-  }
-}
-
-int AudioProcessingImpl::ProcessStream(AudioFrame* frame) {
-  TRACE_EVENT0("webrtc", "AudioProcessing::ProcessStream_AudioFrame");
-  {
-    // Acquire the capture lock in order to safely call the function
-    // that retrieves the render side data. This function accesses apm
-    // getters that need the capture lock held when being called.
-    // The lock needs to be released as
-    // public_submodules_->echo_control_mobile->is_enabled() aquires this lock
-    // as well.
-    rtc::CritScope cs_capture(&crit_capture_);
-    EmptyQueuedRenderAudio();
-  }
-
-  if (!frame) {
-    return kNullPointerError;
-  }
-  // Must be a native rate.
-  if (frame->sample_rate_hz_ != kSampleRate8kHz &&
-      frame->sample_rate_hz_ != kSampleRate16kHz &&
-      frame->sample_rate_hz_ != kSampleRate32kHz &&
-      frame->sample_rate_hz_ != kSampleRate48kHz) {
-    return kBadSampleRateError;
-  }
-
-  ProcessingConfig processing_config;
-  bool reinitialization_required = false;
-  {
-    // Aquire lock for the access of api_format.
-    // The lock is released immediately due to the conditional
-    // reinitialization.
-    rtc::CritScope cs_capture(&crit_capture_);
-    // TODO(ajm): The input and output rates and channels are currently
-    // constrained to be identical in the int16 interface.
-    processing_config = formats_.api_format;
-
-    reinitialization_required = UpdateActiveSubmoduleStates();
-  }
-  processing_config.input_stream().set_sample_rate_hz(frame->sample_rate_hz_);
-  processing_config.input_stream().set_num_channels(frame->num_channels_);
-  processing_config.output_stream().set_sample_rate_hz(frame->sample_rate_hz_);
-  processing_config.output_stream().set_num_channels(frame->num_channels_);
-
-  {
-    // Do conditional reinitialization.
-    rtc::CritScope cs_render(&crit_render_);
-    RETURN_ON_ERR(
-        MaybeInitializeCapture(processing_config, reinitialization_required));
-  }
-  rtc::CritScope cs_capture(&crit_capture_);
-  if (frame->samples_per_channel_ !=
-      formats_.api_format.input_stream().num_frames()) {
-    return kBadDataLengthError;
-  }
-
-  if (aec_dump_) {
-    RecordUnprocessedCaptureStream(*frame);
-  }
-
-  capture_.capture_audio->DeinterleaveFrom(frame);
-  RETURN_ON_ERR(ProcessCaptureStreamLocked());
-  capture_.capture_audio->InterleaveTo(
-      frame, submodule_states_.CaptureMultiBandProcessingActive() ||
-                 submodule_states_.CaptureFullBandProcessingActive());
-
-  if (aec_dump_) {
-    RecordProcessedCaptureStream(*frame);
-  }
-
-  return kNoError;
-}
-
-int AudioProcessingImpl::ProcessCaptureStreamLocked() {
-  // Ensure that not both the AEC and AECM are active at the same time.
-  // TODO(peah): Simplify once the public API Enable functions for these
-  // are moved to APM.
-  RTC_DCHECK(!(public_submodules_->echo_cancellation->is_enabled() &&
-               public_submodules_->echo_control_mobile->is_enabled()));
-
-  MaybeUpdateHistograms();
-
-  AudioBuffer* capture_buffer = capture_.capture_audio.get();  // For brevity.
-
-  capture_input_rms_.Analyze(rtc::ArrayView<const int16_t>(
-      capture_buffer->channels_const()[0],
-      capture_nonlocked_.capture_processing_format.num_frames()));
-  const bool log_rms = ++capture_rms_interval_counter_ >= 1000;
-  if (log_rms) {
-    capture_rms_interval_counter_ = 0;
-    RmsLevel::Levels levels = capture_input_rms_.AverageAndPeak();
-    RTC_HISTOGRAM_COUNTS_LINEAR("WebRTC.Audio.ApmCaptureInputLevelAverageRms",
-                                levels.average, 1, RmsLevel::kMinLevelDb, 64);
-    RTC_HISTOGRAM_COUNTS_LINEAR("WebRTC.Audio.ApmCaptureInputLevelPeakRms",
-                                levels.peak, 1, RmsLevel::kMinLevelDb, 64);
-  }
-
-  if (private_submodules_->echo_canceller3) {
-    // TODO(peah): Reactivate analogue AGC gain detection once the analogue AGC
-    // issues have been addressed.
-    capture_.echo_path_gain_change = false;
-    private_submodules_->echo_canceller3->AnalyzeCapture(capture_buffer);
-  }
-
-  if (constants_.use_experimental_agc &&
-      public_submodules_->gain_control->is_enabled()) {
-    private_submodules_->agc_manager->AnalyzePreProcess(
-        capture_buffer->channels()[0], capture_buffer->num_channels(),
-        capture_nonlocked_.capture_processing_format.num_frames());
-  }
-
-  if (submodule_states_.CaptureMultiBandSubModulesActive() &&
-      SampleRateSupportsMultiBand(
-          capture_nonlocked_.capture_processing_format.sample_rate_hz())) {
-    capture_buffer->SplitIntoFrequencyBands();
-  }
-
-  if (private_submodules_->echo_canceller3) {
-    // Force down-mixing of the number of channels after the detection of
-    // capture signal saturation.
-    // TODO(peah): Look into ensuring that this kind of tampering with the
-    // AudioBuffer functionality should not be needed.
-    capture_buffer->set_num_channels(1);
-  }
-
-  if (capture_nonlocked_.beamformer_enabled) {
-    private_submodules_->beamformer->AnalyzeChunk(
-        *capture_buffer->split_data_f());
-    // Discards all channels by the leftmost one.
-    capture_buffer->set_num_channels(1);
-  }
-
-  // TODO(peah): Move the AEC3 low-cut filter to this place.
-  if (private_submodules_->low_cut_filter &&
-      !private_submodules_->echo_canceller3) {
-    private_submodules_->low_cut_filter->Process(capture_buffer);
-  }
-  RETURN_ON_ERR(
-      public_submodules_->gain_control->AnalyzeCaptureAudio(capture_buffer));
-  public_submodules_->noise_suppression->AnalyzeCaptureAudio(capture_buffer);
-
-  // Ensure that the stream delay was set before the call to the
-  // AEC ProcessCaptureAudio function.
-  if (public_submodules_->echo_cancellation->is_enabled() &&
-      !was_stream_delay_set()) {
-    return AudioProcessing::kStreamParameterNotSetError;
-  }
-
-  if (private_submodules_->echo_canceller3) {
-    private_submodules_->echo_canceller3->ProcessCapture(
-        capture_buffer, capture_.echo_path_gain_change);
-  } else {
-    RETURN_ON_ERR(public_submodules_->echo_cancellation->ProcessCaptureAudio(
-        capture_buffer, stream_delay_ms()));
-  }
-
-  if (public_submodules_->echo_control_mobile->is_enabled() &&
-      public_submodules_->noise_suppression->is_enabled()) {
-    capture_buffer->CopyLowPassToReference();
-  }
-  public_submodules_->noise_suppression->ProcessCaptureAudio(capture_buffer);
-#if WEBRTC_INTELLIGIBILITY_ENHANCER
-  if (capture_nonlocked_.intelligibility_enabled) {
-    RTC_DCHECK(public_submodules_->noise_suppression->is_enabled());
-    int gain_db = public_submodules_->gain_control->is_enabled() ?
-                  public_submodules_->gain_control->compression_gain_db() :
-                  0;
-    float gain = std::pow(10.f, gain_db / 20.f);
-    gain *= capture_nonlocked_.level_controller_enabled ?
-            private_submodules_->level_controller->GetLastGain() :
-            1.f;
-    public_submodules_->intelligibility_enhancer->SetCaptureNoiseEstimate(
-        public_submodules_->noise_suppression->NoiseEstimate(), gain);
-  }
-#endif
-
-  // Ensure that the stream delay was set before the call to the
-  // AECM ProcessCaptureAudio function.
-  if (public_submodules_->echo_control_mobile->is_enabled() &&
-      !was_stream_delay_set()) {
-    return AudioProcessing::kStreamParameterNotSetError;
-  }
-
-  if (!(private_submodules_->echo_canceller3 ||
-        public_submodules_->echo_cancellation->is_enabled())) {
-    RETURN_ON_ERR(public_submodules_->echo_control_mobile->ProcessCaptureAudio(
-        capture_buffer, stream_delay_ms()));
-  }
-
-  if (capture_nonlocked_.beamformer_enabled) {
-    private_submodules_->beamformer->PostFilter(capture_buffer->split_data_f());
-  }
-
-  public_submodules_->voice_detection->ProcessCaptureAudio(capture_buffer);
-
-  if (constants_.use_experimental_agc &&
-      public_submodules_->gain_control->is_enabled() &&
-      (!capture_nonlocked_.beamformer_enabled ||
-       private_submodules_->beamformer->is_target_present())) {
-    private_submodules_->agc_manager->Process(
-        capture_buffer->split_bands_const(0)[kBand0To8kHz],
-        capture_buffer->num_frames_per_band(), capture_nonlocked_.split_rate);
-  }
-  RETURN_ON_ERR(public_submodules_->gain_control->ProcessCaptureAudio(
-      capture_buffer, echo_cancellation()->stream_has_echo()));
-
-  if (submodule_states_.CaptureMultiBandProcessingActive() &&
-      SampleRateSupportsMultiBand(
-          capture_nonlocked_.capture_processing_format.sample_rate_hz())) {
-    capture_buffer->MergeFrequencyBands();
-  }
-
-  if (config_.residual_echo_detector.enabled) {
-    private_submodules_->residual_echo_detector->AnalyzeCaptureAudio(
-        rtc::ArrayView<const float>(capture_buffer->channels_f()[0],
-                                    capture_buffer->num_frames()));
-  }
-
-  // TODO(aluebs): Investigate if the transient suppression placement should be
-  // before or after the AGC.
-  if (capture_.transient_suppressor_enabled) {
-    float voice_probability =
-        private_submodules_->agc_manager.get()
-            ? private_submodules_->agc_manager->voice_probability()
-            : 1.f;
-
-    public_submodules_->transient_suppressor->Suppress(
-        capture_buffer->channels_f()[0], capture_buffer->num_frames(),
-        capture_buffer->num_channels(),
-        capture_buffer->split_bands_const_f(0)[kBand0To8kHz],
-        capture_buffer->num_frames_per_band(), capture_buffer->keyboard_data(),
-        capture_buffer->num_keyboard_frames(), voice_probability,
-        capture_.key_pressed);
-  }
-
-  if (capture_nonlocked_.gain_controller2_enabled) {
-    private_submodules_->gain_controller2->Process(capture_buffer);
-  }
-
-  if (capture_nonlocked_.level_controller_enabled) {
-    private_submodules_->level_controller->Process(capture_buffer);
-  }
-
-  // The level estimator operates on the recombined data.
-  public_submodules_->level_estimator->ProcessStream(capture_buffer);
-
-  capture_output_rms_.Analyze(rtc::ArrayView<const int16_t>(
-      capture_buffer->channels_const()[0],
-      capture_nonlocked_.capture_processing_format.num_frames()));
-  if (log_rms) {
-    RmsLevel::Levels levels = capture_output_rms_.AverageAndPeak();
-    RTC_HISTOGRAM_COUNTS_LINEAR("WebRTC.Audio.ApmCaptureOutputLevelAverageRms",
-                                levels.average, 1, RmsLevel::kMinLevelDb, 64);
-    RTC_HISTOGRAM_COUNTS_LINEAR("WebRTC.Audio.ApmCaptureOutputLevelPeakRms",
-                                levels.peak, 1, RmsLevel::kMinLevelDb, 64);
-  }
-
-  capture_.was_stream_delay_set = false;
-  return kNoError;
-}
-
-int AudioProcessingImpl::AnalyzeReverseStream(const float* const* data,
-                                              size_t samples_per_channel,
-                                              int sample_rate_hz,
-                                              ChannelLayout layout) {
-  TRACE_EVENT0("webrtc", "AudioProcessing::AnalyzeReverseStream_ChannelLayout");
-  rtc::CritScope cs(&crit_render_);
-  const StreamConfig reverse_config = {
-      sample_rate_hz, ChannelsFromLayout(layout), LayoutHasKeyboard(layout),
-  };
-  if (samples_per_channel != reverse_config.num_frames()) {
-    return kBadDataLengthError;
-  }
-  return AnalyzeReverseStreamLocked(data, reverse_config, reverse_config);
-}
-
-int AudioProcessingImpl::ProcessReverseStream(const float* const* src,
-                                              const StreamConfig& input_config,
-                                              const StreamConfig& output_config,
-                                              float* const* dest) {
-  TRACE_EVENT0("webrtc", "AudioProcessing::ProcessReverseStream_StreamConfig");
-  rtc::CritScope cs(&crit_render_);
-  RETURN_ON_ERR(AnalyzeReverseStreamLocked(src, input_config, output_config));
-  if (submodule_states_.RenderMultiBandProcessingActive()) {
-    render_.render_audio->CopyTo(formats_.api_format.reverse_output_stream(),
-                                 dest);
-  } else if (formats_.api_format.reverse_input_stream() !=
-             formats_.api_format.reverse_output_stream()) {
-    render_.render_converter->Convert(src, input_config.num_samples(), dest,
-                                      output_config.num_samples());
-  } else {
-    CopyAudioIfNeeded(src, input_config.num_frames(),
-                      input_config.num_channels(), dest);
-  }
-
-  return kNoError;
-}
-
-int AudioProcessingImpl::AnalyzeReverseStreamLocked(
-    const float* const* src,
-    const StreamConfig& input_config,
-    const StreamConfig& output_config) {
-  if (src == nullptr) {
-    return kNullPointerError;
-  }
-
-  if (input_config.num_channels() == 0) {
-    return kBadNumberChannelsError;
-  }
-
-  ProcessingConfig processing_config = formats_.api_format;
-  processing_config.reverse_input_stream() = input_config;
-  processing_config.reverse_output_stream() = output_config;
-
-  RETURN_ON_ERR(MaybeInitializeRender(processing_config));
-  assert(input_config.num_frames() ==
-         formats_.api_format.reverse_input_stream().num_frames());
-
-  if (aec_dump_) {
-    const size_t channel_size =
-        formats_.api_format.reverse_input_stream().num_frames();
-    const size_t num_channels =
-        formats_.api_format.reverse_input_stream().num_channels();
-    aec_dump_->WriteRenderStreamMessage(
-        FloatAudioFrame(src, num_channels, channel_size));
-  }
-  render_.render_audio->CopyFrom(src,
-                                 formats_.api_format.reverse_input_stream());
-  return ProcessRenderStreamLocked();
-}
-
-int AudioProcessingImpl::ProcessReverseStream(AudioFrame* frame) {
-  TRACE_EVENT0("webrtc", "AudioProcessing::ProcessReverseStream_AudioFrame");
-  rtc::CritScope cs(&crit_render_);
-  if (frame == nullptr) {
-    return kNullPointerError;
-  }
-  // Must be a native rate.
-  if (frame->sample_rate_hz_ != kSampleRate8kHz &&
-      frame->sample_rate_hz_ != kSampleRate16kHz &&
-      frame->sample_rate_hz_ != kSampleRate32kHz &&
-      frame->sample_rate_hz_ != kSampleRate48kHz) {
-    return kBadSampleRateError;
-  }
-
-  if (frame->num_channels_ <= 0) {
-    return kBadNumberChannelsError;
-  }
-
-  ProcessingConfig processing_config = formats_.api_format;
-  processing_config.reverse_input_stream().set_sample_rate_hz(
-      frame->sample_rate_hz_);
-  processing_config.reverse_input_stream().set_num_channels(
-      frame->num_channels_);
-  processing_config.reverse_output_stream().set_sample_rate_hz(
-      frame->sample_rate_hz_);
-  processing_config.reverse_output_stream().set_num_channels(
-      frame->num_channels_);
-
-  RETURN_ON_ERR(MaybeInitializeRender(processing_config));
-  if (frame->samples_per_channel_ !=
-      formats_.api_format.reverse_input_stream().num_frames()) {
-    return kBadDataLengthError;
-  }
-
-  if (aec_dump_) {
-    aec_dump_->WriteRenderStreamMessage(*frame);
-  }
-
-  render_.render_audio->DeinterleaveFrom(frame);
-  RETURN_ON_ERR(ProcessRenderStreamLocked());
-  render_.render_audio->InterleaveTo(
-      frame, submodule_states_.RenderMultiBandProcessingActive());
-  return kNoError;
-}
-
-int AudioProcessingImpl::ProcessRenderStreamLocked() {
-  AudioBuffer* render_buffer = render_.render_audio.get();  // For brevity.
-
-  QueueNonbandedRenderAudio(render_buffer);
-
-  if (submodule_states_.RenderMultiBandSubModulesActive() &&
-      SampleRateSupportsMultiBand(
-          formats_.render_processing_format.sample_rate_hz())) {
-    render_buffer->SplitIntoFrequencyBands();
-  }
-
-#if WEBRTC_INTELLIGIBILITY_ENHANCER
-  if (capture_nonlocked_.intelligibility_enabled) {
-    public_submodules_->intelligibility_enhancer->ProcessRenderAudio(
-        render_buffer);
-  }
-#endif
-
-  if (submodule_states_.RenderMultiBandSubModulesActive()) {
-    QueueBandedRenderAudio(render_buffer);
-  }
-
-  // TODO(peah): Perform the queueing ínside QueueRenderAudiuo().
-  if (private_submodules_->echo_canceller3) {
-    private_submodules_->echo_canceller3->AnalyzeRender(render_buffer);
-  }
-
-  if (submodule_states_.RenderMultiBandProcessingActive() &&
-      SampleRateSupportsMultiBand(
-          formats_.render_processing_format.sample_rate_hz())) {
-    render_buffer->MergeFrequencyBands();
-  }
-
-  return kNoError;
-}
-
-int AudioProcessingImpl::set_stream_delay_ms(int delay) {
-  rtc::CritScope cs(&crit_capture_);
-  Error retval = kNoError;
-  capture_.was_stream_delay_set = true;
-  delay += capture_.delay_offset_ms;
-
-  if (delay < 0) {
-    delay = 0;
-    retval = kBadStreamParameterWarning;
-  }
-
-  // TODO(ajm): the max is rather arbitrarily chosen; investigate.
-  if (delay > 500) {
-    delay = 500;
-    retval = kBadStreamParameterWarning;
-  }
-
-  capture_nonlocked_.stream_delay_ms = delay;
-  return retval;
-}
-
-int AudioProcessingImpl::stream_delay_ms() const {
-  // Used as callback from submodules, hence locking is not allowed.
-  return capture_nonlocked_.stream_delay_ms;
-}
-
-bool AudioProcessingImpl::was_stream_delay_set() const {
-  // Used as callback from submodules, hence locking is not allowed.
-  return capture_.was_stream_delay_set;
-}
-
-void AudioProcessingImpl::set_stream_key_pressed(bool key_pressed) {
-  rtc::CritScope cs(&crit_capture_);
-  capture_.key_pressed = key_pressed;
-}
-
-void AudioProcessingImpl::set_delay_offset_ms(int offset) {
-  rtc::CritScope cs(&crit_capture_);
-  capture_.delay_offset_ms = offset;
-}
-
-int AudioProcessingImpl::delay_offset_ms() const {
-  rtc::CritScope cs(&crit_capture_);
-  return capture_.delay_offset_ms;
-}
-
-void AudioProcessingImpl::AttachAecDump(std::unique_ptr<AecDump> aec_dump) {
-  RTC_DCHECK(aec_dump);
-  rtc::CritScope cs_render(&crit_render_);
-  rtc::CritScope cs_capture(&crit_capture_);
-
-  // The previously attached AecDump will be destroyed with the
-  // 'aec_dump' parameter, which is after locks are released.
-  aec_dump_.swap(aec_dump);
-  WriteAecDumpConfigMessage(true);
-  aec_dump_->WriteInitMessage(ToStreamsConfig(formats_.api_format));
-}
-
-void AudioProcessingImpl::DetachAecDump() {
-  // The d-tor of a task-queue based AecDump blocks until all pending
-  // tasks are done. This construction avoids blocking while holding
-  // the render and capture locks.
-  std::unique_ptr<AecDump> aec_dump = nullptr;
-  {
-    rtc::CritScope cs_render(&crit_render_);
-    rtc::CritScope cs_capture(&crit_capture_);
-    aec_dump = std::move(aec_dump_);
-  }
-}
-
-AudioProcessing::AudioProcessingStatistics::AudioProcessingStatistics() {
-  residual_echo_return_loss.Set(-100.0f, -100.0f, -100.0f, -100.0f);
-  echo_return_loss.Set(-100.0f, -100.0f, -100.0f, -100.0f);
-  echo_return_loss_enhancement.Set(-100.0f, -100.0f, -100.0f, -100.0f);
-  a_nlp.Set(-100.0f, -100.0f, -100.0f, -100.0f);
-}
-
-AudioProcessing::AudioProcessingStatistics::AudioProcessingStatistics(
-    const AudioProcessingStatistics& other) = default;
-
-AudioProcessing::AudioProcessingStatistics::~AudioProcessingStatistics() =
-    default;
-
-// TODO(ivoc): Remove this when GetStatistics() becomes pure virtual.
-AudioProcessing::AudioProcessingStatistics AudioProcessing::GetStatistics()
-    const {
-  return AudioProcessingStatistics();
-}
-
-AudioProcessing::AudioProcessingStatistics AudioProcessingImpl::GetStatistics()
-    const {
-  AudioProcessingStatistics stats;
-  EchoCancellation::Metrics metrics;
-  int success = public_submodules_->echo_cancellation->GetMetrics(&metrics);
-  if (success == Error::kNoError) {
-    stats.a_nlp.Set(metrics.a_nlp);
-    stats.divergent_filter_fraction = metrics.divergent_filter_fraction;
-    stats.echo_return_loss.Set(metrics.echo_return_loss);
-    stats.echo_return_loss_enhancement.Set(
-        metrics.echo_return_loss_enhancement);
-    stats.residual_echo_return_loss.Set(metrics.residual_echo_return_loss);
-  }
-  {
-    rtc::CritScope cs_capture(&crit_capture_);
-    stats.residual_echo_likelihood =
-        private_submodules_->residual_echo_detector->echo_likelihood();
-    stats.residual_echo_likelihood_recent_max =
-        private_submodules_->residual_echo_detector
-            ->echo_likelihood_recent_max();
-  }
-  public_submodules_->echo_cancellation->GetDelayMetrics(
-      &stats.delay_median, &stats.delay_standard_deviation,
-      &stats.fraction_poor_delays);
-  return stats;
-}
-
-EchoCancellation* AudioProcessingImpl::echo_cancellation() const {
-  return public_submodules_->echo_cancellation.get();
-}
-
-EchoControlMobile* AudioProcessingImpl::echo_control_mobile() const {
-  return public_submodules_->echo_control_mobile.get();
-}
-
-GainControl* AudioProcessingImpl::gain_control() const {
-  if (constants_.use_experimental_agc) {
-    return public_submodules_->gain_control_for_experimental_agc.get();
-  }
-  return public_submodules_->gain_control.get();
-}
-
-HighPassFilter* AudioProcessingImpl::high_pass_filter() const {
-  return high_pass_filter_impl_.get();
-}
-
-LevelEstimator* AudioProcessingImpl::level_estimator() const {
-  return public_submodules_->level_estimator.get();
-}
-
-NoiseSuppression* AudioProcessingImpl::noise_suppression() const {
-  return public_submodules_->noise_suppression.get();
-}
-
-VoiceDetection* AudioProcessingImpl::voice_detection() const {
-  return public_submodules_->voice_detection.get();
-}
-
-void AudioProcessingImpl::MutateConfig(
-    rtc::FunctionView<void(AudioProcessing::Config*)> mutator) {
-  rtc::CritScope cs_render(&crit_render_);
-  rtc::CritScope cs_capture(&crit_capture_);
-  mutator(&config_);
-  ApplyConfig(config_);
-}
-
-AudioProcessing::Config AudioProcessingImpl::GetConfig() const {
-  rtc::CritScope cs_render(&crit_render_);
-  rtc::CritScope cs_capture(&crit_capture_);
-  return config_;
-}
-
-bool AudioProcessingImpl::UpdateActiveSubmoduleStates() {
-  return submodule_states_.Update(
-      config_.high_pass_filter.enabled,
-      public_submodules_->echo_cancellation->is_enabled(),
-      public_submodules_->echo_control_mobile->is_enabled(),
-      config_.residual_echo_detector.enabled,
-      public_submodules_->noise_suppression->is_enabled(),
-      capture_nonlocked_.intelligibility_enabled,
-      capture_nonlocked_.beamformer_enabled,
-      public_submodules_->gain_control->is_enabled(),
-      capture_nonlocked_.gain_controller2_enabled,
-      capture_nonlocked_.level_controller_enabled,
-      capture_nonlocked_.echo_canceller3_enabled,
-      public_submodules_->voice_detection->is_enabled(),
-      public_submodules_->level_estimator->is_enabled(),
-      capture_.transient_suppressor_enabled);
-}
-
-
-void AudioProcessingImpl::InitializeTransient() {
-  if (capture_.transient_suppressor_enabled) {
-    if (!public_submodules_->transient_suppressor.get()) {
-      public_submodules_->transient_suppressor.reset(new TransientSuppressor());
-    }
-    public_submodules_->transient_suppressor->Initialize(
-        capture_nonlocked_.capture_processing_format.sample_rate_hz(),
-        capture_nonlocked_.split_rate, num_proc_channels());
-  }
-}
-
-void AudioProcessingImpl::InitializeBeamformer() {
-  if (capture_nonlocked_.beamformer_enabled) {
-    if (!private_submodules_->beamformer) {
-      private_submodules_->beamformer.reset(new NonlinearBeamformer(
-          capture_.array_geometry, 1u, capture_.target_direction));
-    }
-    private_submodules_->beamformer->Initialize(kChunkSizeMs,
-                                                capture_nonlocked_.split_rate);
-  }
-}
-
-void AudioProcessingImpl::InitializeIntelligibility() {
-#if WEBRTC_INTELLIGIBILITY_ENHANCER
-  if (capture_nonlocked_.intelligibility_enabled) {
-    public_submodules_->intelligibility_enhancer.reset(
-        new IntelligibilityEnhancer(capture_nonlocked_.split_rate,
-                                    render_.render_audio->num_channels(),
-                                    render_.render_audio->num_bands(),
-                                    NoiseSuppressionImpl::num_noise_bins()));
-  }
-#endif
-}
-
-void AudioProcessingImpl::InitializeLowCutFilter() {
-  if (config_.high_pass_filter.enabled) {
-    private_submodules_->low_cut_filter.reset(
-        new LowCutFilter(num_proc_channels(), proc_sample_rate_hz()));
-  } else {
-    private_submodules_->low_cut_filter.reset();
-  }
-}
-
-void AudioProcessingImpl::InitializeEchoCanceller3() {
-  if (capture_nonlocked_.echo_canceller3_enabled) {
-    private_submodules_->echo_canceller3.reset(new EchoCanceller3(
-        config_.echo_canceller3, proc_sample_rate_hz(), true));
-  } else {
-    private_submodules_->echo_canceller3.reset();
-  }
-}
-
-void AudioProcessingImpl::InitializeGainController2() {
-  if (capture_nonlocked_.gain_controller2_enabled) {
-    private_submodules_->gain_controller2.reset(
-        new GainController2(proc_sample_rate_hz()));
-  } else {
-    private_submodules_->gain_controller2.reset();
-  }
-}
-
-void AudioProcessingImpl::InitializeLevelController() {
-  private_submodules_->level_controller->Initialize(proc_sample_rate_hz());
-}
-
-void AudioProcessingImpl::InitializeResidualEchoDetector() {
-  private_submodules_->residual_echo_detector->Initialize();
-}
-
-void AudioProcessingImpl::MaybeUpdateHistograms() {
-  static const int kMinDiffDelayMs = 60;
-
-  if (echo_cancellation()->is_enabled()) {
-    // Activate delay_jumps_ counters if we know echo_cancellation is runnning.
-    // If a stream has echo we know that the echo_cancellation is in process.
-    if (capture_.stream_delay_jumps == -1 &&
-        echo_cancellation()->stream_has_echo()) {
-      capture_.stream_delay_jumps = 0;
-    }
-    if (capture_.aec_system_delay_jumps == -1 &&
-        echo_cancellation()->stream_has_echo()) {
-      capture_.aec_system_delay_jumps = 0;
-    }
-
-    // Detect a jump in platform reported system delay and log the difference.
-    const int diff_stream_delay_ms =
-        capture_nonlocked_.stream_delay_ms - capture_.last_stream_delay_ms;
-    if (diff_stream_delay_ms > kMinDiffDelayMs &&
-        capture_.last_stream_delay_ms != 0) {
-      RTC_HISTOGRAM_COUNTS("WebRTC.Audio.PlatformReportedStreamDelayJump",
-                           diff_stream_delay_ms, kMinDiffDelayMs, 1000, 100);
-      if (capture_.stream_delay_jumps == -1) {
-        capture_.stream_delay_jumps = 0;  // Activate counter if needed.
-      }
-      capture_.stream_delay_jumps++;
-    }
-    capture_.last_stream_delay_ms = capture_nonlocked_.stream_delay_ms;
-
-    // Detect a jump in AEC system delay and log the difference.
-    const int samples_per_ms =
-        rtc::CheckedDivExact(capture_nonlocked_.split_rate, 1000);
-    RTC_DCHECK_LT(0, samples_per_ms);
-    const int aec_system_delay_ms =
-        public_submodules_->echo_cancellation->GetSystemDelayInSamples() /
-        samples_per_ms;
-    const int diff_aec_system_delay_ms =
-        aec_system_delay_ms - capture_.last_aec_system_delay_ms;
-    if (diff_aec_system_delay_ms > kMinDiffDelayMs &&
-        capture_.last_aec_system_delay_ms != 0) {
-      RTC_HISTOGRAM_COUNTS("WebRTC.Audio.AecSystemDelayJump",
-                           diff_aec_system_delay_ms, kMinDiffDelayMs, 1000,
-                           100);
-      if (capture_.aec_system_delay_jumps == -1) {
-        capture_.aec_system_delay_jumps = 0;  // Activate counter if needed.
-      }
-      capture_.aec_system_delay_jumps++;
-    }
-    capture_.last_aec_system_delay_ms = aec_system_delay_ms;
-  }
-}
-
-void AudioProcessingImpl::UpdateHistogramsOnCallEnd() {
-  // Run in a single-threaded manner.
-  rtc::CritScope cs_render(&crit_render_);
-  rtc::CritScope cs_capture(&crit_capture_);
-
-  if (capture_.stream_delay_jumps > -1) {
-    RTC_HISTOGRAM_ENUMERATION(
-        "WebRTC.Audio.NumOfPlatformReportedStreamDelayJumps",
-        capture_.stream_delay_jumps, 51);
-  }
-  capture_.stream_delay_jumps = -1;
-  capture_.last_stream_delay_ms = 0;
-
-  if (capture_.aec_system_delay_jumps > -1) {
-    RTC_HISTOGRAM_ENUMERATION("WebRTC.Audio.NumOfAecSystemDelayJumps",
-                              capture_.aec_system_delay_jumps, 51);
-  }
-  capture_.aec_system_delay_jumps = -1;
-  capture_.last_aec_system_delay_ms = 0;
-}
-
-void AudioProcessingImpl::WriteAecDumpConfigMessage(bool forced) {
-  if (!aec_dump_) {
-    return;
-  }
-  std::string experiments_description =
-      public_submodules_->echo_cancellation->GetExperimentsDescription();
-  // TODO(peah): Add semicolon-separated concatenations of experiment
-  // descriptions for other submodules.
-  if (capture_nonlocked_.level_controller_enabled) {
-    experiments_description += "LevelController;";
-  }
-  if (constants_.agc_clipped_level_min != kClippedLevelMin) {
-    experiments_description += "AgcClippingLevelExperiment;";
-  }
-  if (capture_nonlocked_.echo_canceller3_enabled) {
-    experiments_description += "EchoCanceller3;";
-  }
-
-  InternalAPMConfig apm_config;
-
-  apm_config.aec_enabled = public_submodules_->echo_cancellation->is_enabled();
-  apm_config.aec_delay_agnostic_enabled =
-      public_submodules_->echo_cancellation->is_delay_agnostic_enabled();
-  apm_config.aec_drift_compensation_enabled =
-      public_submodules_->echo_cancellation->is_drift_compensation_enabled();
-  apm_config.aec_extended_filter_enabled =
-      public_submodules_->echo_cancellation->is_extended_filter_enabled();
-  apm_config.aec_suppression_level = static_cast<int>(
-      public_submodules_->echo_cancellation->suppression_level());
-
-  apm_config.aecm_enabled =
-      public_submodules_->echo_control_mobile->is_enabled();
-  apm_config.aecm_comfort_noise_enabled =
-      public_submodules_->echo_control_mobile->is_comfort_noise_enabled();
-  apm_config.aecm_routing_mode =
-      static_cast<int>(public_submodules_->echo_control_mobile->routing_mode());
-
-  apm_config.agc_enabled = public_submodules_->gain_control->is_enabled();
-  apm_config.agc_mode =
-      static_cast<int>(public_submodules_->gain_control->mode());
-  apm_config.agc_limiter_enabled =
-      public_submodules_->gain_control->is_limiter_enabled();
-  apm_config.noise_robust_agc_enabled = constants_.use_experimental_agc;
-
-  apm_config.hpf_enabled = config_.high_pass_filter.enabled;
-
-  apm_config.ns_enabled = public_submodules_->noise_suppression->is_enabled();
-  apm_config.ns_level =
-      static_cast<int>(public_submodules_->noise_suppression->level());
-
-  apm_config.transient_suppression_enabled =
-      capture_.transient_suppressor_enabled;
-  apm_config.intelligibility_enhancer_enabled =
-      capture_nonlocked_.intelligibility_enabled;
-  apm_config.experiments_description = experiments_description;
-
-  if (!forced && apm_config == apm_config_for_aec_dump_) {
-    return;
-  }
-  aec_dump_->WriteConfig(apm_config);
-  apm_config_for_aec_dump_ = apm_config;
-}
-
-void AudioProcessingImpl::RecordUnprocessedCaptureStream(
-    const float* const* src) {
-  RTC_DCHECK(aec_dump_);
-  WriteAecDumpConfigMessage(false);
-
-  const size_t channel_size = formats_.api_format.input_stream().num_frames();
-  const size_t num_channels = formats_.api_format.input_stream().num_channels();
-  aec_dump_->AddCaptureStreamInput(
-      FloatAudioFrame(src, num_channels, channel_size));
-  RecordAudioProcessingState();
-}
-
-void AudioProcessingImpl::RecordUnprocessedCaptureStream(
-    const AudioFrame& capture_frame) {
-  RTC_DCHECK(aec_dump_);
-  WriteAecDumpConfigMessage(false);
-
-  aec_dump_->AddCaptureStreamInput(capture_frame);
-  RecordAudioProcessingState();
-}
-
-void AudioProcessingImpl::RecordProcessedCaptureStream(
-    const float* const* processed_capture_stream) {
-  RTC_DCHECK(aec_dump_);
-
-  const size_t channel_size = formats_.api_format.output_stream().num_frames();
-  const size_t num_channels =
-      formats_.api_format.output_stream().num_channels();
-  aec_dump_->AddCaptureStreamOutput(
-      FloatAudioFrame(processed_capture_stream, num_channels, channel_size));
-  aec_dump_->WriteCaptureStreamMessage();
-}
-
-void AudioProcessingImpl::RecordProcessedCaptureStream(
-    const AudioFrame& processed_capture_frame) {
-  RTC_DCHECK(aec_dump_);
-
-  aec_dump_->AddCaptureStreamOutput(processed_capture_frame);
-  aec_dump_->WriteCaptureStreamMessage();
-}
-
-void AudioProcessingImpl::RecordAudioProcessingState() {
-  RTC_DCHECK(aec_dump_);
-  AecDump::AudioProcessingState audio_proc_state;
-  audio_proc_state.delay = capture_nonlocked_.stream_delay_ms;
-  audio_proc_state.drift =
-      public_submodules_->echo_cancellation->stream_drift_samples();
-  audio_proc_state.level = gain_control()->stream_analog_level();
-  audio_proc_state.keypress = capture_.key_pressed;
-  aec_dump_->AddAudioProcessingState(audio_proc_state);
-}
-
-AudioProcessingImpl::ApmCaptureState::ApmCaptureState(
-    bool transient_suppressor_enabled,
-    const std::vector<Point>& array_geometry,
-    SphericalPointf target_direction)
-    : aec_system_delay_jumps(-1),
-      delay_offset_ms(0),
-      was_stream_delay_set(false),
-      last_stream_delay_ms(0),
-      last_aec_system_delay_ms(0),
-      stream_delay_jumps(-1),
-      output_will_be_muted(false),
-      key_pressed(false),
-      transient_suppressor_enabled(transient_suppressor_enabled),
-      array_geometry(array_geometry),
-      target_direction(target_direction),
-      capture_processing_format(kSampleRate16kHz),
-      split_rate(kSampleRate16kHz),
-      echo_path_gain_change(false) {}
-
-AudioProcessingImpl::ApmCaptureState::~ApmCaptureState() = default;
-
-AudioProcessingImpl::ApmRenderState::ApmRenderState() = default;
-
-AudioProcessingImpl::ApmRenderState::~ApmRenderState() = default;
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/audio_processing_impl.h b/modules/audio_processing/audio_processing_impl.h
deleted file mode 100644
index 56c1afc..0000000
--- a/modules/audio_processing/audio_processing_impl.h
+++ /dev/null
@@ -1,418 +0,0 @@
-/*
- *  Copyright (c) 2012 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_PROCESSING_AUDIO_PROCESSING_IMPL_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_AUDIO_PROCESSING_IMPL_H_
-
-#include <list>
-#include <memory>
-#include <vector>
-
-#include "webrtc/modules/audio_processing/audio_buffer.h"
-#include "webrtc/modules/audio_processing/include/aec_dump.h"
-#include "webrtc/modules/audio_processing/include/audio_processing.h"
-#include "webrtc/modules/audio_processing/render_queue_item_verifier.h"
-#include "webrtc/modules/audio_processing/rms_level.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/function_view.h"
-#include "webrtc/rtc_base/gtest_prod_util.h"
-#include "webrtc/rtc_base/ignore_wundef.h"
-#include "webrtc/rtc_base/protobuf_utils.h"
-#include "webrtc/rtc_base/swap_queue.h"
-#include "webrtc/rtc_base/thread_annotations.h"
-#include "webrtc/system_wrappers/include/file_wrapper.h"
-
-namespace webrtc {
-
-class AudioConverter;
-class NonlinearBeamformer;
-
-class AudioProcessingImpl : public AudioProcessing {
- public:
-  // Methods forcing APM to run in a single-threaded manner.
-  // Acquires both the render and capture locks.
-  explicit AudioProcessingImpl(const webrtc::Config& config);
-  // AudioProcessingImpl takes ownership of beamformer.
-  AudioProcessingImpl(const webrtc::Config& config,
-                      NonlinearBeamformer* beamformer);
-  ~AudioProcessingImpl() override;
-  int Initialize() override;
-  int Initialize(int capture_input_sample_rate_hz,
-                 int capture_output_sample_rate_hz,
-                 int render_sample_rate_hz,
-                 ChannelLayout capture_input_layout,
-                 ChannelLayout capture_output_layout,
-                 ChannelLayout render_input_layout) override;
-  int Initialize(const ProcessingConfig& processing_config) override;
-  void ApplyConfig(const AudioProcessing::Config& config) override;
-  void SetExtraOptions(const webrtc::Config& config) override;
-  void UpdateHistogramsOnCallEnd() override;
-  void AttachAecDump(std::unique_ptr<AecDump> aec_dump) override;
-  void DetachAecDump() override;
-
-  // Capture-side exclusive methods possibly running APM in a
-  // multi-threaded manner. Acquire the capture lock.
-  int ProcessStream(AudioFrame* frame) override;
-  int ProcessStream(const float* const* src,
-                    size_t samples_per_channel,
-                    int input_sample_rate_hz,
-                    ChannelLayout input_layout,
-                    int output_sample_rate_hz,
-                    ChannelLayout output_layout,
-                    float* const* dest) override;
-  int ProcessStream(const float* const* src,
-                    const StreamConfig& input_config,
-                    const StreamConfig& output_config,
-                    float* const* dest) override;
-  void set_output_will_be_muted(bool muted) override;
-  int set_stream_delay_ms(int delay) override;
-  void set_delay_offset_ms(int offset) override;
-  int delay_offset_ms() const override;
-  void set_stream_key_pressed(bool key_pressed) override;
-
-  // Render-side exclusive methods possibly running APM in a
-  // multi-threaded manner. Acquire the render lock.
-  int ProcessReverseStream(AudioFrame* frame) override;
-  int AnalyzeReverseStream(const float* const* data,
-                           size_t samples_per_channel,
-                           int sample_rate_hz,
-                           ChannelLayout layout) override;
-  int ProcessReverseStream(const float* const* src,
-                           const StreamConfig& input_config,
-                           const StreamConfig& output_config,
-                           float* const* dest) override;
-
-  // Methods only accessed from APM submodules or
-  // from AudioProcessing tests in a single-threaded manner.
-  // Hence there is no need for locks in these.
-  int proc_sample_rate_hz() const override;
-  int proc_split_sample_rate_hz() const override;
-  size_t num_input_channels() const override;
-  size_t num_proc_channels() const override;
-  size_t num_output_channels() const override;
-  size_t num_reverse_channels() const override;
-  int stream_delay_ms() const override;
-  bool was_stream_delay_set() const override
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_capture_);
-
-  AudioProcessingStatistics GetStatistics() const override;
-
-  // Methods returning pointers to APM submodules.
-  // No locks are aquired in those, as those locks
-  // would offer no protection (the submodules are
-  // created only once in a single-treaded manner
-  // during APM creation).
-  EchoCancellation* echo_cancellation() const override;
-  EchoControlMobile* echo_control_mobile() const override;
-  GainControl* gain_control() const override;
-  // TODO(peah): Deprecate this API call.
-  HighPassFilter* high_pass_filter() const override;
-  LevelEstimator* level_estimator() const override;
-  NoiseSuppression* noise_suppression() const override;
-  VoiceDetection* voice_detection() const override;
-
-  // TODO(peah): Remove MutateConfig once the new API allows that.
-  void MutateConfig(rtc::FunctionView<void(AudioProcessing::Config*)> mutator);
-  AudioProcessing::Config GetConfig() const override;
-
- protected:
-  // Overridden in a mock.
-  virtual int InitializeLocked()
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_render_, crit_capture_);
-
- private:
-  // TODO(peah): These friend classes should be removed as soon as the new
-  // parameter setting scheme allows.
-  FRIEND_TEST_ALL_PREFIXES(ApmConfiguration, DefaultBehavior);
-  FRIEND_TEST_ALL_PREFIXES(ApmConfiguration, ValidConfigBehavior);
-  FRIEND_TEST_ALL_PREFIXES(ApmConfiguration, InValidConfigBehavior);
-  struct ApmPublicSubmodules;
-  struct ApmPrivateSubmodules;
-
-  // Submodule interface implementations.
-  std::unique_ptr<HighPassFilter> high_pass_filter_impl_;
-
-  class ApmSubmoduleStates {
-   public:
-    ApmSubmoduleStates();
-    // Updates the submodule state and returns true if it has changed.
-    bool Update(bool low_cut_filter_enabled,
-                bool echo_canceller_enabled,
-                bool mobile_echo_controller_enabled,
-                bool residual_echo_detector_enabled,
-                bool noise_suppressor_enabled,
-                bool intelligibility_enhancer_enabled,
-                bool beamformer_enabled,
-                bool adaptive_gain_controller_enabled,
-                bool gain_controller2_enabled,
-                bool level_controller_enabled,
-                bool echo_canceller3_enabled,
-                bool voice_activity_detector_enabled,
-                bool level_estimator_enabled,
-                bool transient_suppressor_enabled);
-    bool CaptureMultiBandSubModulesActive() const;
-    bool CaptureMultiBandProcessingActive() const;
-    bool CaptureFullBandProcessingActive() const;
-    bool RenderMultiBandSubModulesActive() const;
-    bool RenderMultiBandProcessingActive() const;
-
-   private:
-    bool low_cut_filter_enabled_ = false;
-    bool echo_canceller_enabled_ = false;
-    bool mobile_echo_controller_enabled_ = false;
-    bool residual_echo_detector_enabled_ = false;
-    bool noise_suppressor_enabled_ = false;
-    bool intelligibility_enhancer_enabled_ = false;
-    bool beamformer_enabled_ = false;
-    bool adaptive_gain_controller_enabled_ = false;
-    bool gain_controller2_enabled_ = false;
-    bool level_controller_enabled_ = false;
-    bool echo_canceller3_enabled_ = false;
-    bool level_estimator_enabled_ = false;
-    bool voice_activity_detector_enabled_ = false;
-    bool transient_suppressor_enabled_ = false;
-    bool first_update_ = true;
-  };
-
-  // Method for modifying the formats struct that are called from both
-  // the render and capture threads. The check for whether modifications
-  // are needed is done while holding the render lock only, thereby avoiding
-  // that the capture thread blocks the render thread.
-  // The struct is modified in a single-threaded manner by holding both the
-  // render and capture locks.
-  int MaybeInitialize(const ProcessingConfig& config, bool force_initialization)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_render_);
-
-  int MaybeInitializeRender(const ProcessingConfig& processing_config)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_render_);
-
-  int MaybeInitializeCapture(const ProcessingConfig& processing_config,
-                             bool force_initialization)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_render_);
-
-  // Method for updating the state keeping track of the active submodules.
-  // Returns a bool indicating whether the state has changed.
-  bool UpdateActiveSubmoduleStates()
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_capture_);
-
-  // Methods requiring APM running in a single-threaded manner.
-  // Are called with both the render and capture locks already
-  // acquired.
-  void InitializeTransient()
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_render_, crit_capture_);
-  void InitializeBeamformer()
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_render_, crit_capture_);
-  void InitializeIntelligibility()
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_render_, crit_capture_);
-  int InitializeLocked(const ProcessingConfig& config)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_render_, crit_capture_);
-  void InitializeLevelController() RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_capture_);
-  void InitializeResidualEchoDetector()
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_render_, crit_capture_);
-  void InitializeLowCutFilter() RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_capture_);
-  void InitializeEchoCanceller3() RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_capture_);
-  void InitializeGainController2();
-
-  void EmptyQueuedRenderAudio();
-  void AllocateRenderQueue()
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_render_, crit_capture_);
-  void QueueBandedRenderAudio(AudioBuffer* audio)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_render_);
-  void QueueNonbandedRenderAudio(AudioBuffer* audio)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_render_);
-
-  // Capture-side exclusive methods possibly running APM in a multi-threaded
-  // manner that are called with the render lock already acquired.
-  int ProcessCaptureStreamLocked() RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_capture_);
-  void MaybeUpdateHistograms() RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_capture_);
-
-  // Render-side exclusive methods possibly running APM in a multi-threaded
-  // manner that are called with the render lock already acquired.
-  // TODO(ekm): Remove once all clients updated to new interface.
-  int AnalyzeReverseStreamLocked(const float* const* src,
-                                 const StreamConfig& input_config,
-                                 const StreamConfig& output_config)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_render_);
-  int ProcessRenderStreamLocked() RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_render_);
-
-  // Collects configuration settings from public and private
-  // submodules to be saved as an audioproc::Config message on the
-  // AecDump if it is attached.  If not |forced|, only writes the current
-  // config if it is different from the last saved one; if |forced|,
-  // writes the config regardless of the last saved.
-  void WriteAecDumpConfigMessage(bool forced)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_capture_);
-
-  // Notifies attached AecDump of current configuration and capture data.
-  void RecordUnprocessedCaptureStream(const float* const* capture_stream)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_capture_);
-
-  void RecordUnprocessedCaptureStream(const AudioFrame& capture_frame)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_capture_);
-
-  // Notifies attached AecDump of current configuration and
-  // processed capture data and issues a capture stream recording
-  // request.
-  void RecordProcessedCaptureStream(
-      const float* const* processed_capture_stream)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_capture_);
-
-  void RecordProcessedCaptureStream(const AudioFrame& processed_capture_frame)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_capture_);
-
-  // Notifies attached AecDump about current state (delay, drift, etc).
-  void RecordAudioProcessingState() RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_capture_);
-
-  // AecDump instance used for optionally logging APM config, input
-  // and output to file in the AEC-dump format defined in debug.proto.
-  std::unique_ptr<AecDump> aec_dump_;
-
-  // Hold the last config written with AecDump for avoiding writing
-  // the same config twice.
-  InternalAPMConfig apm_config_for_aec_dump_ RTC_GUARDED_BY(crit_capture_);
-
-  // Critical sections.
-  rtc::CriticalSection crit_render_ RTC_ACQUIRED_BEFORE(crit_capture_);
-  rtc::CriticalSection crit_capture_;
-
-  // Struct containing the Config specifying the behavior of APM.
-  AudioProcessing::Config config_;
-
-  // Class containing information about what submodules are active.
-  ApmSubmoduleStates submodule_states_;
-
-  // Structs containing the pointers to the submodules.
-  std::unique_ptr<ApmPublicSubmodules> public_submodules_;
-  std::unique_ptr<ApmPrivateSubmodules> private_submodules_;
-
-  // State that is written to while holding both the render and capture locks
-  // but can be read without any lock being held.
-  // As this is only accessed internally of APM, and all internal methods in APM
-  // either are holding the render or capture locks, this construct is safe as
-  // it is not possible to read the variables while writing them.
-  struct ApmFormatState {
-    ApmFormatState()
-        :  // Format of processing streams at input/output call sites.
-          api_format({{{kSampleRate16kHz, 1, false},
-                       {kSampleRate16kHz, 1, false},
-                       {kSampleRate16kHz, 1, false},
-                       {kSampleRate16kHz, 1, false}}}),
-          render_processing_format(kSampleRate16kHz, 1) {}
-    ProcessingConfig api_format;
-    StreamConfig render_processing_format;
-  } formats_;
-
-  // APM constants.
-  const struct ApmConstants {
-    ApmConstants(int agc_startup_min_volume,
-                 int agc_clipped_level_min,
-                 bool use_experimental_agc)
-        :  // Format of processing streams at input/output call sites.
-          agc_startup_min_volume(agc_startup_min_volume),
-          agc_clipped_level_min(agc_clipped_level_min),
-          use_experimental_agc(use_experimental_agc) {}
-    int agc_startup_min_volume;
-    int agc_clipped_level_min;
-    bool use_experimental_agc;
-  } constants_;
-
-  struct ApmCaptureState {
-    ApmCaptureState(bool transient_suppressor_enabled,
-                    const std::vector<Point>& array_geometry,
-                    SphericalPointf target_direction);
-    ~ApmCaptureState();
-    int aec_system_delay_jumps;
-    int delay_offset_ms;
-    bool was_stream_delay_set;
-    int last_stream_delay_ms;
-    int last_aec_system_delay_ms;
-    int stream_delay_jumps;
-    bool output_will_be_muted;
-    bool key_pressed;
-    bool transient_suppressor_enabled;
-    std::vector<Point> array_geometry;
-    SphericalPointf target_direction;
-    std::unique_ptr<AudioBuffer> capture_audio;
-    // Only the rate and samples fields of capture_processing_format_ are used
-    // because the capture processing number of channels is mutable and is
-    // tracked by the capture_audio_.
-    StreamConfig capture_processing_format;
-    int split_rate;
-    bool echo_path_gain_change;
-  } capture_ RTC_GUARDED_BY(crit_capture_);
-
-  struct ApmCaptureNonLockedState {
-    ApmCaptureNonLockedState(bool beamformer_enabled,
-                             bool intelligibility_enabled)
-        : capture_processing_format(kSampleRate16kHz),
-          split_rate(kSampleRate16kHz),
-          stream_delay_ms(0),
-          beamformer_enabled(beamformer_enabled),
-          intelligibility_enabled(intelligibility_enabled) {}
-    // Only the rate and samples fields of capture_processing_format_ are used
-    // because the forward processing number of channels is mutable and is
-    // tracked by the capture_audio_.
-    StreamConfig capture_processing_format;
-    int split_rate;
-    int stream_delay_ms;
-    bool beamformer_enabled;
-    bool intelligibility_enabled;
-    bool level_controller_enabled = false;
-    bool echo_canceller3_enabled = false;
-    bool gain_controller2_enabled = false;
-  } capture_nonlocked_;
-
-  struct ApmRenderState {
-    ApmRenderState();
-    ~ApmRenderState();
-    std::unique_ptr<AudioConverter> render_converter;
-    std::unique_ptr<AudioBuffer> render_audio;
-  } render_ RTC_GUARDED_BY(crit_render_);
-
-  size_t aec_render_queue_element_max_size_ RTC_GUARDED_BY(crit_render_)
-      RTC_GUARDED_BY(crit_capture_) = 0;
-  std::vector<float> aec_render_queue_buffer_ RTC_GUARDED_BY(crit_render_);
-  std::vector<float> aec_capture_queue_buffer_ RTC_GUARDED_BY(crit_capture_);
-
-  size_t aecm_render_queue_element_max_size_ RTC_GUARDED_BY(crit_render_)
-      RTC_GUARDED_BY(crit_capture_) = 0;
-  std::vector<int16_t> aecm_render_queue_buffer_ RTC_GUARDED_BY(crit_render_);
-  std::vector<int16_t> aecm_capture_queue_buffer_ RTC_GUARDED_BY(crit_capture_);
-
-  size_t agc_render_queue_element_max_size_ RTC_GUARDED_BY(crit_render_)
-      RTC_GUARDED_BY(crit_capture_) = 0;
-  std::vector<int16_t> agc_render_queue_buffer_ RTC_GUARDED_BY(crit_render_);
-  std::vector<int16_t> agc_capture_queue_buffer_ RTC_GUARDED_BY(crit_capture_);
-
-  size_t red_render_queue_element_max_size_ RTC_GUARDED_BY(crit_render_)
-      RTC_GUARDED_BY(crit_capture_) = 0;
-  std::vector<float> red_render_queue_buffer_ RTC_GUARDED_BY(crit_render_);
-  std::vector<float> red_capture_queue_buffer_ RTC_GUARDED_BY(crit_capture_);
-
-  RmsLevel capture_input_rms_ RTC_GUARDED_BY(crit_capture_);
-  RmsLevel capture_output_rms_ RTC_GUARDED_BY(crit_capture_);
-  int capture_rms_interval_counter_ RTC_GUARDED_BY(crit_capture_) = 0;
-
-  // Lock protection not needed.
-  std::unique_ptr<SwapQueue<std::vector<float>, RenderQueueItemVerifier<float>>>
-      aec_render_signal_queue_;
-  std::unique_ptr<
-      SwapQueue<std::vector<int16_t>, RenderQueueItemVerifier<int16_t>>>
-      aecm_render_signal_queue_;
-  std::unique_ptr<
-      SwapQueue<std::vector<int16_t>, RenderQueueItemVerifier<int16_t>>>
-      agc_render_signal_queue_;
-  std::unique_ptr<SwapQueue<std::vector<float>, RenderQueueItemVerifier<float>>>
-      red_render_signal_queue_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_AUDIO_PROCESSING_IMPL_H_
diff --git a/modules/audio_processing/audio_processing_impl_locking_unittest.cc b/modules/audio_processing/audio_processing_impl_locking_unittest.cc
deleted file mode 100644
index 76c74fc..0000000
--- a/modules/audio_processing/audio_processing_impl_locking_unittest.cc
+++ /dev/null
@@ -1,1135 +0,0 @@
-/*
- *  Copyright (c) 2015 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_processing/audio_processing_impl.h"
-
-#include <algorithm>
-#include <memory>
-#include <vector>
-
-#include "webrtc/api/array_view.h"
-#include "webrtc/modules/audio_processing/test/test_utils.h"
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/event.h"
-#include "webrtc/rtc_base/platform_thread.h"
-#include "webrtc/rtc_base/random.h"
-#include "webrtc/system_wrappers/include/sleep.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-namespace {
-
-class AudioProcessingImplLockTest;
-
-// Type of the render thread APM API call to use in the test.
-enum class RenderApiImpl {
-  ProcessReverseStreamImpl1,
-  ProcessReverseStreamImpl2,
-  AnalyzeReverseStreamImpl
-};
-
-// Type of the capture thread APM API call to use in the test.
-enum class CaptureApiImpl {
-  ProcessStreamImpl1,
-  ProcessStreamImpl2,
-  ProcessStreamImpl3
-};
-
-// The runtime parameter setting scheme to use in the test.
-enum class RuntimeParameterSettingScheme {
-  SparseStreamMetadataChangeScheme,
-  ExtremeStreamMetadataChangeScheme,
-  FixedMonoStreamMetadataScheme,
-  FixedStereoStreamMetadataScheme
-};
-
-// Variant of echo canceller settings to use in the test.
-enum class AecType {
-  BasicWebRtcAecSettings,
-  AecTurnedOff,
-  BasicWebRtcAecSettingsWithExtentedFilter,
-  BasicWebRtcAecSettingsWithDelayAgnosticAec,
-  BasicWebRtcAecSettingsWithAecMobile
-};
-
-// Thread-safe random number generator wrapper.
-class RandomGenerator {
- public:
-  RandomGenerator() : rand_gen_(42U) {}
-
-  int RandInt(int min, int max) {
-    rtc::CritScope cs(&crit_);
-    return rand_gen_.Rand(min, max);
-  }
-
-  int RandInt(int max) {
-    rtc::CritScope cs(&crit_);
-    return rand_gen_.Rand(max);
-  }
-
-  float RandFloat() {
-    rtc::CritScope cs(&crit_);
-    return rand_gen_.Rand<float>();
-  }
-
- private:
-  rtc::CriticalSection crit_;
-  Random rand_gen_ RTC_GUARDED_BY(crit_);
-};
-
-// Variables related to the audio data and formats.
-struct AudioFrameData {
-  explicit AudioFrameData(int max_frame_size) {
-    // Set up the two-dimensional arrays needed for the APM API calls.
-    input_framechannels.resize(2 * max_frame_size);
-    input_frame.resize(2);
-    input_frame[0] = &input_framechannels[0];
-    input_frame[1] = &input_framechannels[max_frame_size];
-
-    output_frame_channels.resize(2 * max_frame_size);
-    output_frame.resize(2);
-    output_frame[0] = &output_frame_channels[0];
-    output_frame[1] = &output_frame_channels[max_frame_size];
-  }
-
-  AudioFrame frame;
-  std::vector<float*> output_frame;
-  std::vector<float> output_frame_channels;
-  AudioProcessing::ChannelLayout output_channel_layout =
-      AudioProcessing::ChannelLayout::kMono;
-  int input_sample_rate_hz = 16000;
-  int input_number_of_channels = -1;
-  std::vector<float*> input_frame;
-  std::vector<float> input_framechannels;
-  AudioProcessing::ChannelLayout input_channel_layout =
-      AudioProcessing::ChannelLayout::kMono;
-  int output_sample_rate_hz = 16000;
-  int output_number_of_channels = -1;
-  StreamConfig input_stream_config;
-  StreamConfig output_stream_config;
-  int input_samples_per_channel = -1;
-  int output_samples_per_channel = -1;
-};
-
-// The configuration for the test.
-struct TestConfig {
-  // Test case generator for the test configurations to use in the brief tests.
-  static std::vector<TestConfig> GenerateBriefTestConfigs() {
-    std::vector<TestConfig> test_configs;
-    AecType aec_types[] = {AecType::BasicWebRtcAecSettingsWithDelayAgnosticAec,
-                           AecType::BasicWebRtcAecSettingsWithAecMobile};
-    for (auto aec_type : aec_types) {
-      TestConfig test_config;
-      test_config.aec_type = aec_type;
-
-      test_config.min_number_of_calls = 300;
-
-      // Perform tests only with the extreme runtime parameter setting scheme.
-      test_config.runtime_parameter_setting_scheme =
-          RuntimeParameterSettingScheme::ExtremeStreamMetadataChangeScheme;
-
-      // Only test 16 kHz for this test suite.
-      test_config.initial_sample_rate_hz = 16000;
-
-      // Create test config for the second processing API function set.
-      test_config.render_api_function =
-          RenderApiImpl::ProcessReverseStreamImpl2;
-      test_config.capture_api_function = CaptureApiImpl::ProcessStreamImpl2;
-
-      // Create test config for the first processing API function set.
-      test_configs.push_back(test_config);
-      test_config.render_api_function =
-          RenderApiImpl::AnalyzeReverseStreamImpl;
-      test_config.capture_api_function = CaptureApiImpl::ProcessStreamImpl3;
-      test_configs.push_back(test_config);
-    }
-
-    // Return the created test configurations.
-    return test_configs;
-  }
-
-  // Test case generator for the test configurations to use in the extensive
-  // tests.
-  static std::vector<TestConfig> GenerateExtensiveTestConfigs() {
-    // Lambda functions for the test config generation.
-    auto add_processing_apis = [](TestConfig test_config) {
-      struct AllowedApiCallCombinations {
-        RenderApiImpl render_api;
-        CaptureApiImpl capture_api;
-      };
-
-      const AllowedApiCallCombinations api_calls[] = {
-          {RenderApiImpl::ProcessReverseStreamImpl1,
-           CaptureApiImpl::ProcessStreamImpl1},
-          {RenderApiImpl::ProcessReverseStreamImpl2,
-           CaptureApiImpl::ProcessStreamImpl2},
-          {RenderApiImpl::ProcessReverseStreamImpl2,
-           CaptureApiImpl::ProcessStreamImpl3},
-          {RenderApiImpl::AnalyzeReverseStreamImpl,
-           CaptureApiImpl::ProcessStreamImpl2},
-          {RenderApiImpl::AnalyzeReverseStreamImpl,
-           CaptureApiImpl::ProcessStreamImpl3}};
-      std::vector<TestConfig> out;
-      for (auto api_call : api_calls) {
-        test_config.render_api_function = api_call.render_api;
-        test_config.capture_api_function = api_call.capture_api;
-        out.push_back(test_config);
-      }
-      return out;
-    };
-
-    auto add_aec_settings = [](const std::vector<TestConfig>& in) {
-      std::vector<TestConfig> out;
-      AecType aec_types[] = {
-          AecType::BasicWebRtcAecSettings, AecType::AecTurnedOff,
-          AecType::BasicWebRtcAecSettingsWithExtentedFilter,
-          AecType::BasicWebRtcAecSettingsWithDelayAgnosticAec,
-          AecType::BasicWebRtcAecSettingsWithAecMobile};
-      for (auto test_config : in) {
-        // Due to a VisualStudio 2015 compiler issue, the internal loop
-        // variable here cannot override a previously defined name.
-        // In other words "type" cannot be named "aec_type" here.
-        // https://connect.microsoft.com/VisualStudio/feedback/details/2291755
-        for (auto type : aec_types) {
-          test_config.aec_type = type;
-          out.push_back(test_config);
-        }
-      }
-      return out;
-    };
-
-    auto add_settings_scheme = [](const std::vector<TestConfig>& in) {
-      std::vector<TestConfig> out;
-      RuntimeParameterSettingScheme schemes[] = {
-          RuntimeParameterSettingScheme::SparseStreamMetadataChangeScheme,
-          RuntimeParameterSettingScheme::ExtremeStreamMetadataChangeScheme,
-          RuntimeParameterSettingScheme::FixedMonoStreamMetadataScheme,
-          RuntimeParameterSettingScheme::FixedStereoStreamMetadataScheme};
-
-      for (auto test_config : in) {
-        for (auto scheme : schemes) {
-          test_config.runtime_parameter_setting_scheme = scheme;
-          out.push_back(test_config);
-        }
-      }
-      return out;
-    };
-
-    auto add_sample_rates = [](const std::vector<TestConfig>& in) {
-      const int sample_rates[] = {8000, 16000, 32000, 48000};
-
-      std::vector<TestConfig> out;
-      for (auto test_config : in) {
-        auto available_rates =
-            (test_config.aec_type ==
-                     AecType::BasicWebRtcAecSettingsWithAecMobile
-                 ? rtc::ArrayView<const int>(sample_rates, 2)
-                 : rtc::ArrayView<const int>(sample_rates));
-
-        for (auto rate : available_rates) {
-          test_config.initial_sample_rate_hz = rate;
-          out.push_back(test_config);
-        }
-      }
-      return out;
-    };
-
-    // Generate test configurations of the relevant combinations of the
-    // parameters to
-    // test.
-    TestConfig test_config;
-    test_config.min_number_of_calls = 10000;
-    return add_sample_rates(add_settings_scheme(
-        add_aec_settings(add_processing_apis(test_config))));
-  }
-
-  RenderApiImpl render_api_function = RenderApiImpl::ProcessReverseStreamImpl2;
-  CaptureApiImpl capture_api_function = CaptureApiImpl::ProcessStreamImpl2;
-  RuntimeParameterSettingScheme runtime_parameter_setting_scheme =
-      RuntimeParameterSettingScheme::ExtremeStreamMetadataChangeScheme;
-  int initial_sample_rate_hz = 16000;
-  AecType aec_type = AecType::BasicWebRtcAecSettingsWithDelayAgnosticAec;
-  int min_number_of_calls = 300;
-};
-
-// Handler for the frame counters.
-class FrameCounters {
- public:
-  void IncreaseRenderCounter() {
-    rtc::CritScope cs(&crit_);
-    render_count++;
-  }
-
-  void IncreaseCaptureCounter() {
-    rtc::CritScope cs(&crit_);
-    capture_count++;
-  }
-
-  int GetCaptureCounter() const {
-    rtc::CritScope cs(&crit_);
-    return capture_count;
-  }
-
-  int GetRenderCounter() const {
-    rtc::CritScope cs(&crit_);
-    return render_count;
-  }
-
-  int CaptureMinusRenderCounters() const {
-    rtc::CritScope cs(&crit_);
-    return capture_count - render_count;
-  }
-
-  int RenderMinusCaptureCounters() const {
-    return -CaptureMinusRenderCounters();
-  }
-
-  bool BothCountersExceedeThreshold(int threshold) {
-    rtc::CritScope cs(&crit_);
-    return (render_count > threshold && capture_count > threshold);
-  }
-
- private:
-  rtc::CriticalSection crit_;
-  int render_count RTC_GUARDED_BY(crit_) = 0;
-  int capture_count RTC_GUARDED_BY(crit_) = 0;
-};
-
-// Class for handling the capture side processing.
-class CaptureProcessor {
- public:
-  CaptureProcessor(int max_frame_size,
-                   RandomGenerator* rand_gen,
-                   rtc::Event* render_call_event,
-                   rtc::Event* capture_call_event,
-                   FrameCounters* shared_counters_state,
-                   AudioProcessingImplLockTest* test_framework,
-                   TestConfig* test_config,
-                   AudioProcessing* apm);
-  bool Process();
-
- private:
-  static const int kMaxCallDifference = 10;
-  static const float kCaptureInputFloatLevel;
-  static const int kCaptureInputFixLevel = 1024;
-
-  void PrepareFrame();
-  void CallApmCaptureSide();
-  void ApplyRuntimeSettingScheme();
-
-  RandomGenerator* const rand_gen_ = nullptr;
-  rtc::Event* const render_call_event_ = nullptr;
-  rtc::Event* const capture_call_event_ = nullptr;
-  FrameCounters* const frame_counters_ = nullptr;
-  AudioProcessingImplLockTest* const test_ = nullptr;
-  const TestConfig* const test_config_ = nullptr;
-  AudioProcessing* const apm_ = nullptr;
-  AudioFrameData frame_data_;
-};
-
-// Class for handling the stats processing.
-class StatsProcessor {
- public:
-  StatsProcessor(RandomGenerator* rand_gen,
-                 TestConfig* test_config,
-                 AudioProcessing* apm);
-  bool Process();
-
- private:
-  RandomGenerator* rand_gen_ = nullptr;
-  TestConfig* test_config_ = nullptr;
-  AudioProcessing* apm_ = nullptr;
-};
-
-// Class for handling the render side processing.
-class RenderProcessor {
- public:
-  RenderProcessor(int max_frame_size,
-                  RandomGenerator* rand_gen,
-                  rtc::Event* render_call_event,
-                  rtc::Event* capture_call_event,
-                  FrameCounters* shared_counters_state,
-                  AudioProcessingImplLockTest* test_framework,
-                  TestConfig* test_config,
-                  AudioProcessing* apm);
-  bool Process();
-
- private:
-  static const int kMaxCallDifference = 10;
-  static const int kRenderInputFixLevel = 16384;
-  static const float kRenderInputFloatLevel;
-
-  void PrepareFrame();
-  void CallApmRenderSide();
-  void ApplyRuntimeSettingScheme();
-
-  RandomGenerator* const rand_gen_ = nullptr;
-  rtc::Event* const render_call_event_ = nullptr;
-  rtc::Event* const capture_call_event_ = nullptr;
-  FrameCounters* const frame_counters_ = nullptr;
-  AudioProcessingImplLockTest* const test_ = nullptr;
-  const TestConfig* const test_config_ = nullptr;
-  AudioProcessing* const apm_ = nullptr;
-  AudioFrameData frame_data_;
-  bool first_render_call_ = true;
-};
-
-class AudioProcessingImplLockTest
-    : public ::testing::TestWithParam<TestConfig> {
- public:
-  AudioProcessingImplLockTest();
-  bool RunTest();
-  bool MaybeEndTest();
-
- private:
-  static const int kTestTimeOutLimit = 10 * 60 * 1000;
-  static const int kMaxFrameSize = 480;
-
-  // ::testing::TestWithParam<> implementation
-  void SetUp() override;
-  void TearDown() override;
-
-  // Thread callback for the render thread
-  static bool RenderProcessorThreadFunc(void* context) {
-    return reinterpret_cast<AudioProcessingImplLockTest*>(context)
-        ->render_thread_state_.Process();
-  }
-
-  // Thread callback for the capture thread
-  static bool CaptureProcessorThreadFunc(void* context) {
-    return reinterpret_cast<AudioProcessingImplLockTest*>(context)
-        ->capture_thread_state_.Process();
-  }
-
-  // Thread callback for the stats thread
-  static bool StatsProcessorThreadFunc(void* context) {
-    return reinterpret_cast<AudioProcessingImplLockTest*>(context)
-        ->stats_thread_state_.Process();
-  }
-
-  // Tests whether all the required render and capture side calls have been
-  // done.
-  bool TestDone() {
-    return frame_counters_.BothCountersExceedeThreshold(
-        test_config_.min_number_of_calls);
-  }
-
-  // Start the threads used in the test.
-  void StartThreads() {
-    render_thread_.Start();
-    render_thread_.SetPriority(rtc::kRealtimePriority);
-    capture_thread_.Start();
-    capture_thread_.SetPriority(rtc::kRealtimePriority);
-    stats_thread_.Start();
-    stats_thread_.SetPriority(rtc::kNormalPriority);
-  }
-
-  // Event handlers for the test.
-  rtc::Event test_complete_;
-  rtc::Event render_call_event_;
-  rtc::Event capture_call_event_;
-
-  // Thread related variables.
-  rtc::PlatformThread render_thread_;
-  rtc::PlatformThread capture_thread_;
-  rtc::PlatformThread stats_thread_;
-  mutable RandomGenerator rand_gen_;
-
-  std::unique_ptr<AudioProcessing> apm_;
-  TestConfig test_config_;
-  FrameCounters frame_counters_;
-  RenderProcessor render_thread_state_;
-  CaptureProcessor capture_thread_state_;
-  StatsProcessor stats_thread_state_;
-};
-
-// Sleeps a random time between 0 and max_sleep milliseconds.
-void SleepRandomMs(int max_sleep, RandomGenerator* rand_gen) {
-  int sleeptime = rand_gen->RandInt(0, max_sleep);
-  SleepMs(sleeptime);
-}
-
-// Populates a float audio frame with random data.
-void PopulateAudioFrame(float** frame,
-                        float amplitude,
-                        size_t num_channels,
-                        size_t samples_per_channel,
-                        RandomGenerator* rand_gen) {
-  for (size_t ch = 0; ch < num_channels; ch++) {
-    for (size_t k = 0; k < samples_per_channel; k++) {
-      // Store random 16 bit quantized float number between +-amplitude.
-      frame[ch][k] = amplitude * (2 * rand_gen->RandFloat() - 1);
-    }
-  }
-}
-
-// Populates an audioframe frame of AudioFrame type with random data.
-void PopulateAudioFrame(AudioFrame* frame,
-                        int16_t amplitude,
-                        RandomGenerator* rand_gen) {
-  ASSERT_GT(amplitude, 0);
-  ASSERT_LE(amplitude, 32767);
-  int16_t* frame_data = frame->mutable_data();
-  for (size_t ch = 0; ch < frame->num_channels_; ch++) {
-    for (size_t k = 0; k < frame->samples_per_channel_; k++) {
-      // Store random 16 bit number between -(amplitude+1) and
-      // amplitude.
-      frame_data[k * ch] =
-          rand_gen->RandInt(2 * amplitude + 1) - amplitude - 1;
-    }
-  }
-}
-
-AudioProcessingImplLockTest::AudioProcessingImplLockTest()
-    : test_complete_(false, false),
-      render_call_event_(false, false),
-      capture_call_event_(false, false),
-      render_thread_(RenderProcessorThreadFunc, this, "render"),
-      capture_thread_(CaptureProcessorThreadFunc, this, "capture"),
-      stats_thread_(StatsProcessorThreadFunc, this, "stats"),
-      apm_(AudioProcessingImpl::Create()),
-      render_thread_state_(kMaxFrameSize,
-                           &rand_gen_,
-                           &render_call_event_,
-                           &capture_call_event_,
-                           &frame_counters_,
-                           this,
-                           &test_config_,
-                           apm_.get()),
-      capture_thread_state_(kMaxFrameSize,
-                            &rand_gen_,
-                            &render_call_event_,
-                            &capture_call_event_,
-                            &frame_counters_,
-                            this,
-                            &test_config_,
-                            apm_.get()),
-      stats_thread_state_(&rand_gen_, &test_config_, apm_.get()) {}
-
-// Run the test with a timeout.
-bool AudioProcessingImplLockTest::RunTest() {
-  StartThreads();
-  return test_complete_.Wait(kTestTimeOutLimit);
-}
-
-bool AudioProcessingImplLockTest::MaybeEndTest() {
-  if (HasFatalFailure() || TestDone()) {
-    test_complete_.Set();
-    return true;
-  }
-  return false;
-}
-
-// Setup of test and APM.
-void AudioProcessingImplLockTest::SetUp() {
-  test_config_ = static_cast<TestConfig>(GetParam());
-
-  ASSERT_EQ(apm_->kNoError, apm_->level_estimator()->Enable(true));
-  ASSERT_EQ(apm_->kNoError, apm_->gain_control()->Enable(true));
-
-  ASSERT_EQ(apm_->kNoError,
-            apm_->gain_control()->set_mode(GainControl::kAdaptiveDigital));
-  ASSERT_EQ(apm_->kNoError, apm_->gain_control()->Enable(true));
-
-  ASSERT_EQ(apm_->kNoError, apm_->noise_suppression()->Enable(true));
-  ASSERT_EQ(apm_->kNoError, apm_->voice_detection()->Enable(true));
-
-  Config config;
-  if (test_config_.aec_type == AecType::AecTurnedOff) {
-    ASSERT_EQ(apm_->kNoError, apm_->echo_control_mobile()->Enable(false));
-    ASSERT_EQ(apm_->kNoError, apm_->echo_cancellation()->Enable(false));
-  } else if (test_config_.aec_type ==
-             AecType::BasicWebRtcAecSettingsWithAecMobile) {
-    ASSERT_EQ(apm_->kNoError, apm_->echo_control_mobile()->Enable(true));
-    ASSERT_EQ(apm_->kNoError, apm_->echo_cancellation()->Enable(false));
-  } else {
-    ASSERT_EQ(apm_->kNoError, apm_->echo_control_mobile()->Enable(false));
-    ASSERT_EQ(apm_->kNoError, apm_->echo_cancellation()->Enable(true));
-    ASSERT_EQ(apm_->kNoError, apm_->echo_cancellation()->enable_metrics(true));
-    ASSERT_EQ(apm_->kNoError,
-              apm_->echo_cancellation()->enable_delay_logging(true));
-
-    config.Set<ExtendedFilter>(
-        new ExtendedFilter(test_config_.aec_type ==
-                           AecType::BasicWebRtcAecSettingsWithExtentedFilter));
-
-    config.Set<DelayAgnostic>(
-        new DelayAgnostic(test_config_.aec_type ==
-                          AecType::BasicWebRtcAecSettingsWithDelayAgnosticAec));
-
-    apm_->SetExtraOptions(config);
-  }
-}
-
-void AudioProcessingImplLockTest::TearDown() {
-  render_call_event_.Set();
-  capture_call_event_.Set();
-  render_thread_.Stop();
-  capture_thread_.Stop();
-  stats_thread_.Stop();
-}
-
-StatsProcessor::StatsProcessor(RandomGenerator* rand_gen,
-                               TestConfig* test_config,
-                               AudioProcessing* apm)
-    : rand_gen_(rand_gen), test_config_(test_config), apm_(apm) {}
-
-// Implements the callback functionality for the statistics
-// collection thread.
-bool StatsProcessor::Process() {
-  SleepRandomMs(100, rand_gen_);
-
-  EXPECT_EQ(apm_->echo_cancellation()->is_enabled(),
-            ((test_config_->aec_type != AecType::AecTurnedOff) &&
-             (test_config_->aec_type !=
-              AecType::BasicWebRtcAecSettingsWithAecMobile)));
-  apm_->echo_cancellation()->stream_drift_samples();
-  EXPECT_EQ(apm_->echo_control_mobile()->is_enabled(),
-            (test_config_->aec_type != AecType::AecTurnedOff) &&
-                (test_config_->aec_type ==
-                 AecType::BasicWebRtcAecSettingsWithAecMobile));
-  EXPECT_TRUE(apm_->gain_control()->is_enabled());
-  EXPECT_TRUE(apm_->noise_suppression()->is_enabled());
-
-  // The below return values are not testable.
-  apm_->noise_suppression()->speech_probability();
-  apm_->voice_detection()->is_enabled();
-
-  return true;
-}
-
-const float CaptureProcessor::kCaptureInputFloatLevel = 0.03125f;
-
-CaptureProcessor::CaptureProcessor(int max_frame_size,
-                                   RandomGenerator* rand_gen,
-                                   rtc::Event* render_call_event,
-                                   rtc::Event* capture_call_event,
-                                   FrameCounters* shared_counters_state,
-                                   AudioProcessingImplLockTest* test_framework,
-                                   TestConfig* test_config,
-                                   AudioProcessing* apm)
-    : rand_gen_(rand_gen),
-      render_call_event_(render_call_event),
-      capture_call_event_(capture_call_event),
-      frame_counters_(shared_counters_state),
-      test_(test_framework),
-      test_config_(test_config),
-      apm_(apm),
-      frame_data_(max_frame_size) {}
-
-// Implements the callback functionality for the capture thread.
-bool CaptureProcessor::Process() {
-  // Sleep a random time to simulate thread jitter.
-  SleepRandomMs(3, rand_gen_);
-
-  // Check whether the test is done.
-  if (test_->MaybeEndTest()) {
-    return false;
-  }
-
-  // Ensure that the number of render and capture calls do not
-  // differ too much.
-  if (frame_counters_->CaptureMinusRenderCounters() > kMaxCallDifference) {
-    render_call_event_->Wait(rtc::Event::kForever);
-  }
-
-  // Apply any specified capture side APM non-processing runtime calls.
-  ApplyRuntimeSettingScheme();
-
-  // Apply the capture side processing call.
-  CallApmCaptureSide();
-
-  // Increase the number of capture-side calls.
-  frame_counters_->IncreaseCaptureCounter();
-
-  // Flag to the render thread that another capture API call has occurred
-  // by triggering this threads call event.
-  capture_call_event_->Set();
-
-  return true;
-}
-
-// Prepares a frame with relevant audio data and metadata.
-void CaptureProcessor::PrepareFrame() {
-  // Restrict to a common fixed sample rate if the AudioFrame
-  // interface is used.
-  if (test_config_->capture_api_function ==
-      CaptureApiImpl::ProcessStreamImpl1) {
-    frame_data_.input_sample_rate_hz = test_config_->initial_sample_rate_hz;
-    frame_data_.output_sample_rate_hz = test_config_->initial_sample_rate_hz;
-  }
-
-  // Prepare the audioframe data and metadata.
-  frame_data_.input_samples_per_channel =
-      frame_data_.input_sample_rate_hz * AudioProcessing::kChunkSizeMs / 1000;
-  frame_data_.frame.sample_rate_hz_ = frame_data_.input_sample_rate_hz;
-  frame_data_.frame.num_channels_ = frame_data_.input_number_of_channels;
-  frame_data_.frame.samples_per_channel_ =
-      frame_data_.input_samples_per_channel;
-  PopulateAudioFrame(&frame_data_.frame, kCaptureInputFixLevel, rand_gen_);
-
-  // Prepare the float audio input data and metadata.
-  frame_data_.input_stream_config.set_sample_rate_hz(
-      frame_data_.input_sample_rate_hz);
-  frame_data_.input_stream_config.set_num_channels(
-      frame_data_.input_number_of_channels);
-  frame_data_.input_stream_config.set_has_keyboard(false);
-  PopulateAudioFrame(&frame_data_.input_frame[0], kCaptureInputFloatLevel,
-                     frame_data_.input_number_of_channels,
-                     frame_data_.input_samples_per_channel, rand_gen_);
-  frame_data_.input_channel_layout =
-      (frame_data_.input_number_of_channels == 1
-           ? AudioProcessing::ChannelLayout::kMono
-           : AudioProcessing::ChannelLayout::kStereo);
-
-  // Prepare the float audio output data and metadata.
-  frame_data_.output_samples_per_channel =
-      frame_data_.output_sample_rate_hz * AudioProcessing::kChunkSizeMs / 1000;
-  frame_data_.output_stream_config.set_sample_rate_hz(
-      frame_data_.output_sample_rate_hz);
-  frame_data_.output_stream_config.set_num_channels(
-      frame_data_.output_number_of_channels);
-  frame_data_.output_stream_config.set_has_keyboard(false);
-  frame_data_.output_channel_layout =
-      (frame_data_.output_number_of_channels == 1
-           ? AudioProcessing::ChannelLayout::kMono
-           : AudioProcessing::ChannelLayout::kStereo);
-}
-
-// Applies the capture side processing API call.
-void CaptureProcessor::CallApmCaptureSide() {
-  // Prepare a proper capture side processing API call input.
-  PrepareFrame();
-
-  // Set the stream delay.
-  apm_->set_stream_delay_ms(30);
-
-  // Set the analog level.
-  apm_->gain_control()->set_stream_analog_level(80);
-
-  // Call the specified capture side API processing method.
-  int result = AudioProcessing::kNoError;
-  switch (test_config_->capture_api_function) {
-    case CaptureApiImpl::ProcessStreamImpl1:
-      result = apm_->ProcessStream(&frame_data_.frame);
-      break;
-    case CaptureApiImpl::ProcessStreamImpl2:
-      result = apm_->ProcessStream(
-          &frame_data_.input_frame[0], frame_data_.input_samples_per_channel,
-          frame_data_.input_sample_rate_hz, frame_data_.input_channel_layout,
-          frame_data_.output_sample_rate_hz, frame_data_.output_channel_layout,
-          &frame_data_.output_frame[0]);
-      break;
-    case CaptureApiImpl::ProcessStreamImpl3:
-      result = apm_->ProcessStream(
-          &frame_data_.input_frame[0], frame_data_.input_stream_config,
-          frame_data_.output_stream_config, &frame_data_.output_frame[0]);
-      break;
-    default:
-      FAIL();
-  }
-
-  // Retrieve the new analog level.
-  apm_->gain_control()->stream_analog_level();
-
-  // Check the return code for error.
-  ASSERT_EQ(AudioProcessing::kNoError, result);
-}
-
-// Applies any runtime capture APM API calls and audio stream characteristics
-// specified by the scheme for the test.
-void CaptureProcessor::ApplyRuntimeSettingScheme() {
-  const int capture_count_local = frame_counters_->GetCaptureCounter();
-
-  // Update the number of channels and sample rates for the input and output.
-  // Note that the counts frequencies for when to set parameters
-  // are set using prime numbers in order to ensure that the
-  // permutation scheme in the parameter setting changes.
-  switch (test_config_->runtime_parameter_setting_scheme) {
-    case RuntimeParameterSettingScheme::SparseStreamMetadataChangeScheme:
-      if (capture_count_local == 0)
-        frame_data_.input_sample_rate_hz = 16000;
-      else if (capture_count_local % 11 == 0)
-        frame_data_.input_sample_rate_hz = 32000;
-      else if (capture_count_local % 73 == 0)
-        frame_data_.input_sample_rate_hz = 48000;
-      else if (capture_count_local % 89 == 0)
-        frame_data_.input_sample_rate_hz = 16000;
-      else if (capture_count_local % 97 == 0)
-        frame_data_.input_sample_rate_hz = 8000;
-
-      if (capture_count_local == 0)
-        frame_data_.input_number_of_channels = 1;
-      else if (capture_count_local % 4 == 0)
-        frame_data_.input_number_of_channels =
-            (frame_data_.input_number_of_channels == 1 ? 2 : 1);
-
-      if (capture_count_local == 0)
-        frame_data_.output_sample_rate_hz = 16000;
-      else if (capture_count_local % 5 == 0)
-        frame_data_.output_sample_rate_hz = 32000;
-      else if (capture_count_local % 47 == 0)
-        frame_data_.output_sample_rate_hz = 48000;
-      else if (capture_count_local % 53 == 0)
-        frame_data_.output_sample_rate_hz = 16000;
-      else if (capture_count_local % 71 == 0)
-        frame_data_.output_sample_rate_hz = 8000;
-
-      if (capture_count_local == 0)
-        frame_data_.output_number_of_channels = 1;
-      else if (capture_count_local % 8 == 0)
-        frame_data_.output_number_of_channels =
-            (frame_data_.output_number_of_channels == 1 ? 2 : 1);
-      break;
-    case RuntimeParameterSettingScheme::ExtremeStreamMetadataChangeScheme:
-      if (capture_count_local % 2 == 0) {
-        frame_data_.input_number_of_channels = 1;
-        frame_data_.input_sample_rate_hz = 16000;
-        frame_data_.output_number_of_channels = 1;
-        frame_data_.output_sample_rate_hz = 16000;
-      } else {
-        frame_data_.input_number_of_channels =
-            (frame_data_.input_number_of_channels == 1 ? 2 : 1);
-        if (frame_data_.input_sample_rate_hz == 8000)
-          frame_data_.input_sample_rate_hz = 16000;
-        else if (frame_data_.input_sample_rate_hz == 16000)
-          frame_data_.input_sample_rate_hz = 32000;
-        else if (frame_data_.input_sample_rate_hz == 32000)
-          frame_data_.input_sample_rate_hz = 48000;
-        else if (frame_data_.input_sample_rate_hz == 48000)
-          frame_data_.input_sample_rate_hz = 8000;
-
-        frame_data_.output_number_of_channels =
-            (frame_data_.output_number_of_channels == 1 ? 2 : 1);
-        if (frame_data_.output_sample_rate_hz == 8000)
-          frame_data_.output_sample_rate_hz = 16000;
-        else if (frame_data_.output_sample_rate_hz == 16000)
-          frame_data_.output_sample_rate_hz = 32000;
-        else if (frame_data_.output_sample_rate_hz == 32000)
-          frame_data_.output_sample_rate_hz = 48000;
-        else if (frame_data_.output_sample_rate_hz == 48000)
-          frame_data_.output_sample_rate_hz = 8000;
-      }
-      break;
-    case RuntimeParameterSettingScheme::FixedMonoStreamMetadataScheme:
-      if (capture_count_local == 0) {
-        frame_data_.input_sample_rate_hz = 16000;
-        frame_data_.input_number_of_channels = 1;
-        frame_data_.output_sample_rate_hz = 16000;
-        frame_data_.output_number_of_channels = 1;
-      }
-      break;
-    case RuntimeParameterSettingScheme::FixedStereoStreamMetadataScheme:
-      if (capture_count_local == 0) {
-        frame_data_.input_sample_rate_hz = 16000;
-        frame_data_.input_number_of_channels = 2;
-        frame_data_.output_sample_rate_hz = 16000;
-        frame_data_.output_number_of_channels = 2;
-      }
-      break;
-    default:
-      FAIL();
-  }
-
-  // Call any specified runtime APM setter and
-  // getter calls.
-  switch (test_config_->runtime_parameter_setting_scheme) {
-    case RuntimeParameterSettingScheme::SparseStreamMetadataChangeScheme:
-    case RuntimeParameterSettingScheme::FixedMonoStreamMetadataScheme:
-      break;
-    case RuntimeParameterSettingScheme::ExtremeStreamMetadataChangeScheme:
-    case RuntimeParameterSettingScheme::FixedStereoStreamMetadataScheme:
-      if (capture_count_local % 2 == 0) {
-        ASSERT_EQ(AudioProcessing::Error::kNoError,
-                  apm_->set_stream_delay_ms(30));
-        apm_->set_stream_key_pressed(true);
-        apm_->set_delay_offset_ms(15);
-        EXPECT_EQ(apm_->delay_offset_ms(), 15);
-      } else {
-        ASSERT_EQ(AudioProcessing::Error::kNoError,
-                  apm_->set_stream_delay_ms(50));
-        apm_->set_stream_key_pressed(false);
-        apm_->set_delay_offset_ms(20);
-        EXPECT_EQ(apm_->delay_offset_ms(), 20);
-        apm_->delay_offset_ms();
-      }
-      break;
-    default:
-      FAIL();
-  }
-
-  // Restric the number of output channels not to exceed
-  // the number of input channels.
-  frame_data_.output_number_of_channels =
-      std::min(frame_data_.output_number_of_channels,
-               frame_data_.input_number_of_channels);
-}
-
-const float RenderProcessor::kRenderInputFloatLevel = 0.5f;
-
-RenderProcessor::RenderProcessor(int max_frame_size,
-                                 RandomGenerator* rand_gen,
-                                 rtc::Event* render_call_event,
-                                 rtc::Event* capture_call_event,
-                                 FrameCounters* shared_counters_state,
-                                 AudioProcessingImplLockTest* test_framework,
-                                 TestConfig* test_config,
-                                 AudioProcessing* apm)
-    : rand_gen_(rand_gen),
-      render_call_event_(render_call_event),
-      capture_call_event_(capture_call_event),
-      frame_counters_(shared_counters_state),
-      test_(test_framework),
-      test_config_(test_config),
-      apm_(apm),
-      frame_data_(max_frame_size) {}
-
-// Implements the callback functionality for the render thread.
-bool RenderProcessor::Process() {
-  // Conditional wait to ensure that a capture call has been done
-  // before the first render call is performed (implicitly
-  // required by the APM API).
-  if (first_render_call_) {
-    capture_call_event_->Wait(rtc::Event::kForever);
-    first_render_call_ = false;
-  }
-
-  // Sleep a random time to simulate thread jitter.
-  SleepRandomMs(3, rand_gen_);
-
-  // Check whether the test is done.
-  if (test_->MaybeEndTest()) {
-    return false;
-  }
-
-  // Ensure that the number of render and capture calls do not
-  // differ too much.
-  if (frame_counters_->RenderMinusCaptureCounters() > kMaxCallDifference) {
-    capture_call_event_->Wait(rtc::Event::kForever);
-  }
-
-  // Apply any specified render side APM non-processing runtime calls.
-  ApplyRuntimeSettingScheme();
-
-  // Apply the render side processing call.
-  CallApmRenderSide();
-
-  // Increase the number of render-side calls.
-  frame_counters_->IncreaseRenderCounter();
-
-  // Flag to the capture thread that another render API call has occurred
-  // by triggering this threads call event.
-  render_call_event_->Set();
-  return true;
-}
-
-// Prepares the render side frame and the accompanying metadata
-// with the appropriate information.
-void RenderProcessor::PrepareFrame() {
-  // Restrict to a common fixed sample rate if the AudioFrame interface is
-  // used.
-  if ((test_config_->render_api_function ==
-       RenderApiImpl::ProcessReverseStreamImpl1) ||
-      (test_config_->aec_type !=
-       AecType::BasicWebRtcAecSettingsWithAecMobile)) {
-    frame_data_.input_sample_rate_hz = test_config_->initial_sample_rate_hz;
-    frame_data_.output_sample_rate_hz = test_config_->initial_sample_rate_hz;
-  }
-
-  // Prepare the audioframe data and metadata
-  frame_data_.input_samples_per_channel =
-      frame_data_.input_sample_rate_hz * AudioProcessing::kChunkSizeMs / 1000;
-  frame_data_.frame.sample_rate_hz_ = frame_data_.input_sample_rate_hz;
-  frame_data_.frame.num_channels_ = frame_data_.input_number_of_channels;
-  frame_data_.frame.samples_per_channel_ =
-      frame_data_.input_samples_per_channel;
-  PopulateAudioFrame(&frame_data_.frame, kRenderInputFixLevel, rand_gen_);
-
-  // Prepare the float audio input data and metadata.
-  frame_data_.input_stream_config.set_sample_rate_hz(
-      frame_data_.input_sample_rate_hz);
-  frame_data_.input_stream_config.set_num_channels(
-      frame_data_.input_number_of_channels);
-  frame_data_.input_stream_config.set_has_keyboard(false);
-  PopulateAudioFrame(&frame_data_.input_frame[0], kRenderInputFloatLevel,
-                     frame_data_.input_number_of_channels,
-                     frame_data_.input_samples_per_channel, rand_gen_);
-  frame_data_.input_channel_layout =
-      (frame_data_.input_number_of_channels == 1
-           ? AudioProcessing::ChannelLayout::kMono
-           : AudioProcessing::ChannelLayout::kStereo);
-
-  // Prepare the float audio output data and metadata.
-  frame_data_.output_samples_per_channel =
-      frame_data_.output_sample_rate_hz * AudioProcessing::kChunkSizeMs / 1000;
-  frame_data_.output_stream_config.set_sample_rate_hz(
-      frame_data_.output_sample_rate_hz);
-  frame_data_.output_stream_config.set_num_channels(
-      frame_data_.output_number_of_channels);
-  frame_data_.output_stream_config.set_has_keyboard(false);
-  frame_data_.output_channel_layout =
-      (frame_data_.output_number_of_channels == 1
-           ? AudioProcessing::ChannelLayout::kMono
-           : AudioProcessing::ChannelLayout::kStereo);
-}
-
-// Makes the render side processing API call.
-void RenderProcessor::CallApmRenderSide() {
-  // Prepare a proper render side processing API call input.
-  PrepareFrame();
-
-  // Call the specified render side API processing method.
-  int result = AudioProcessing::kNoError;
-  switch (test_config_->render_api_function) {
-    case RenderApiImpl::ProcessReverseStreamImpl1:
-      result = apm_->ProcessReverseStream(&frame_data_.frame);
-      break;
-    case RenderApiImpl::ProcessReverseStreamImpl2:
-      result = apm_->ProcessReverseStream(
-          &frame_data_.input_frame[0], frame_data_.input_stream_config,
-          frame_data_.output_stream_config, &frame_data_.output_frame[0]);
-      break;
-    case RenderApiImpl::AnalyzeReverseStreamImpl:
-      result = apm_->AnalyzeReverseStream(
-          &frame_data_.input_frame[0], frame_data_.input_samples_per_channel,
-          frame_data_.input_sample_rate_hz, frame_data_.input_channel_layout);
-      break;
-    default:
-      FAIL();
-  }
-
-  // Check the return code for error.
-  ASSERT_EQ(AudioProcessing::kNoError, result);
-}
-
-// Applies any render capture side APM API calls and audio stream
-// characteristics
-// specified by the scheme for the test.
-void RenderProcessor::ApplyRuntimeSettingScheme() {
-  const int render_count_local = frame_counters_->GetRenderCounter();
-
-  // Update the number of channels and sample rates for the input and output.
-  // Note that the counts frequencies for when to set parameters
-  // are set using prime numbers in order to ensure that the
-  // permutation scheme in the parameter setting changes.
-  switch (test_config_->runtime_parameter_setting_scheme) {
-    case RuntimeParameterSettingScheme::SparseStreamMetadataChangeScheme:
-      if (render_count_local == 0)
-        frame_data_.input_sample_rate_hz = 16000;
-      else if (render_count_local % 47 == 0)
-        frame_data_.input_sample_rate_hz = 32000;
-      else if (render_count_local % 71 == 0)
-        frame_data_.input_sample_rate_hz = 48000;
-      else if (render_count_local % 79 == 0)
-        frame_data_.input_sample_rate_hz = 16000;
-      else if (render_count_local % 83 == 0)
-        frame_data_.input_sample_rate_hz = 8000;
-
-      if (render_count_local == 0)
-        frame_data_.input_number_of_channels = 1;
-      else if (render_count_local % 4 == 0)
-        frame_data_.input_number_of_channels =
-            (frame_data_.input_number_of_channels == 1 ? 2 : 1);
-
-      if (render_count_local == 0)
-        frame_data_.output_sample_rate_hz = 16000;
-      else if (render_count_local % 17 == 0)
-        frame_data_.output_sample_rate_hz = 32000;
-      else if (render_count_local % 19 == 0)
-        frame_data_.output_sample_rate_hz = 48000;
-      else if (render_count_local % 29 == 0)
-        frame_data_.output_sample_rate_hz = 16000;
-      else if (render_count_local % 61 == 0)
-        frame_data_.output_sample_rate_hz = 8000;
-
-      if (render_count_local == 0)
-        frame_data_.output_number_of_channels = 1;
-      else if (render_count_local % 8 == 0)
-        frame_data_.output_number_of_channels =
-            (frame_data_.output_number_of_channels == 1 ? 2 : 1);
-      break;
-    case RuntimeParameterSettingScheme::ExtremeStreamMetadataChangeScheme:
-      if (render_count_local == 0) {
-        frame_data_.input_number_of_channels = 1;
-        frame_data_.input_sample_rate_hz = 16000;
-        frame_data_.output_number_of_channels = 1;
-        frame_data_.output_sample_rate_hz = 16000;
-      } else {
-        frame_data_.input_number_of_channels =
-            (frame_data_.input_number_of_channels == 1 ? 2 : 1);
-        if (frame_data_.input_sample_rate_hz == 8000)
-          frame_data_.input_sample_rate_hz = 16000;
-        else if (frame_data_.input_sample_rate_hz == 16000)
-          frame_data_.input_sample_rate_hz = 32000;
-        else if (frame_data_.input_sample_rate_hz == 32000)
-          frame_data_.input_sample_rate_hz = 48000;
-        else if (frame_data_.input_sample_rate_hz == 48000)
-          frame_data_.input_sample_rate_hz = 8000;
-
-        frame_data_.output_number_of_channels =
-            (frame_data_.output_number_of_channels == 1 ? 2 : 1);
-        if (frame_data_.output_sample_rate_hz == 8000)
-          frame_data_.output_sample_rate_hz = 16000;
-        else if (frame_data_.output_sample_rate_hz == 16000)
-          frame_data_.output_sample_rate_hz = 32000;
-        else if (frame_data_.output_sample_rate_hz == 32000)
-          frame_data_.output_sample_rate_hz = 48000;
-        else if (frame_data_.output_sample_rate_hz == 48000)
-          frame_data_.output_sample_rate_hz = 8000;
-      }
-      break;
-    case RuntimeParameterSettingScheme::FixedMonoStreamMetadataScheme:
-      if (render_count_local == 0) {
-        frame_data_.input_sample_rate_hz = 16000;
-        frame_data_.input_number_of_channels = 1;
-        frame_data_.output_sample_rate_hz = 16000;
-        frame_data_.output_number_of_channels = 1;
-      }
-      break;
-    case RuntimeParameterSettingScheme::FixedStereoStreamMetadataScheme:
-      if (render_count_local == 0) {
-        frame_data_.input_sample_rate_hz = 16000;
-        frame_data_.input_number_of_channels = 2;
-        frame_data_.output_sample_rate_hz = 16000;
-        frame_data_.output_number_of_channels = 2;
-      }
-      break;
-    default:
-      FAIL();
-  }
-
-  // Restric the number of output channels not to exceed
-  // the number of input channels.
-  frame_data_.output_number_of_channels =
-      std::min(frame_data_.output_number_of_channels,
-               frame_data_.input_number_of_channels);
-}
-
-}  // anonymous namespace
-
-TEST_P(AudioProcessingImplLockTest, LockTest) {
-  // Run test and verify that it did not time out.
-  ASSERT_TRUE(RunTest());
-}
-
-// Instantiate tests from the extreme test configuration set.
-INSTANTIATE_TEST_CASE_P(
-    DISABLED_AudioProcessingImplLockExtensive,
-    AudioProcessingImplLockTest,
-    ::testing::ValuesIn(TestConfig::GenerateExtensiveTestConfigs()));
-
-INSTANTIATE_TEST_CASE_P(
-    AudioProcessingImplLockBrief,
-    AudioProcessingImplLockTest,
-    ::testing::ValuesIn(TestConfig::GenerateBriefTestConfigs()));
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/audio_processing_impl_unittest.cc b/modules/audio_processing/audio_processing_impl_unittest.cc
deleted file mode 100644
index bb895b5..0000000
--- a/modules/audio_processing/audio_processing_impl_unittest.cc
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- *  Copyright (c) 2014 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_processing/audio_processing_impl.h"
-
-#include "webrtc/modules/audio_processing/test/test_utils.h"
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/test/gmock.h"
-#include "webrtc/test/gtest.h"
-
-using ::testing::Invoke;
-
-namespace webrtc {
-namespace {
-
-class MockInitialize : public AudioProcessingImpl {
- public:
-  explicit MockInitialize(const webrtc::Config& config)
-      : AudioProcessingImpl(config) {}
-
-  MOCK_METHOD0(InitializeLocked, int());
-  int RealInitializeLocked() RTC_NO_THREAD_SAFETY_ANALYSIS {
-    return AudioProcessingImpl::InitializeLocked();
-  }
-
-  MOCK_CONST_METHOD0(AddRef, int());
-  MOCK_CONST_METHOD0(Release, int());
-};
-
-}  // namespace
-
-TEST(AudioProcessingImplTest, AudioParameterChangeTriggersInit) {
-  webrtc::Config config;
-  MockInitialize mock(config);
-  ON_CALL(mock, InitializeLocked())
-      .WillByDefault(Invoke(&mock, &MockInitialize::RealInitializeLocked));
-
-  EXPECT_CALL(mock, InitializeLocked()).Times(1);
-  mock.Initialize();
-
-  AudioFrame frame;
-  // Call with the default parameters; there should be an init.
-  frame.num_channels_ = 1;
-  SetFrameSampleRate(&frame, 16000);
-  EXPECT_CALL(mock, InitializeLocked()).Times(0);
-  EXPECT_NOERR(mock.ProcessStream(&frame));
-  EXPECT_NOERR(mock.ProcessReverseStream(&frame));
-
-  // New sample rate. (Only impacts ProcessStream).
-  SetFrameSampleRate(&frame, 32000);
-  EXPECT_CALL(mock, InitializeLocked())
-      .Times(1);
-  EXPECT_NOERR(mock.ProcessStream(&frame));
-
-  // New number of channels.
-  // TODO(peah): Investigate why this causes 2 inits.
-  frame.num_channels_ = 2;
-  EXPECT_CALL(mock, InitializeLocked())
-      .Times(2);
-  EXPECT_NOERR(mock.ProcessStream(&frame));
-  // ProcessStream sets num_channels_ == num_output_channels.
-  frame.num_channels_ = 2;
-  EXPECT_NOERR(mock.ProcessReverseStream(&frame));
-
-  // A new sample rate passed to ProcessReverseStream should cause an init.
-  SetFrameSampleRate(&frame, 16000);
-  EXPECT_CALL(mock, InitializeLocked()).Times(1);
-  EXPECT_NOERR(mock.ProcessReverseStream(&frame));
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/audio_processing_performance_unittest.cc b/modules/audio_processing/audio_processing_performance_unittest.cc
deleted file mode 100644
index 2f641de..0000000
--- a/modules/audio_processing/audio_processing_performance_unittest.cc
+++ /dev/null
@@ -1,726 +0,0 @@
-/*
- *  Copyright (c) 2015 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_processing/audio_processing_impl.h"
-
-#include <math.h>
-
-#include <algorithm>
-#include <memory>
-#include <vector>
-
-#include "webrtc/api/array_view.h"
-#include "webrtc/modules/audio_processing/test/test_utils.h"
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/rtc_base/atomicops.h"
-#include "webrtc/rtc_base/platform_thread.h"
-#include "webrtc/rtc_base/random.h"
-#include "webrtc/rtc_base/safe_conversions.h"
-#include "webrtc/system_wrappers/include/clock.h"
-#include "webrtc/system_wrappers/include/event_wrapper.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/testsupport/perf_test.h"
-
-// Check to verify that the define for the intelligibility enhancer is properly
-// set.
-#if !defined(WEBRTC_INTELLIGIBILITY_ENHANCER) || \
-    (WEBRTC_INTELLIGIBILITY_ENHANCER != 0 &&     \
-     WEBRTC_INTELLIGIBILITY_ENHANCER != 1)
-#error "Set WEBRTC_INTELLIGIBILITY_ENHANCER to either 0 or 1"
-#endif
-
-namespace webrtc {
-
-namespace {
-
-static const bool kPrintAllDurations = false;
-
-class CallSimulator;
-
-// Type of the render thread APM API call to use in the test.
-enum class ProcessorType { kRender, kCapture };
-
-// Variant of APM processing settings to use in the test.
-enum class SettingsType {
-  kDefaultApmDesktop,
-  kDefaultApmMobile,
-  kDefaultApmDesktopAndBeamformer,
-  kDefaultApmDesktopAndIntelligibilityEnhancer,
-  kAllSubmodulesTurnedOff,
-  kDefaultApmDesktopWithoutDelayAgnostic,
-  kDefaultApmDesktopWithoutExtendedFilter
-};
-
-// Variables related to the audio data and formats.
-struct AudioFrameData {
-  explicit AudioFrameData(size_t max_frame_size) {
-    // Set up the two-dimensional arrays needed for the APM API calls.
-    input_framechannels.resize(2 * max_frame_size);
-    input_frame.resize(2);
-    input_frame[0] = &input_framechannels[0];
-    input_frame[1] = &input_framechannels[max_frame_size];
-
-    output_frame_channels.resize(2 * max_frame_size);
-    output_frame.resize(2);
-    output_frame[0] = &output_frame_channels[0];
-    output_frame[1] = &output_frame_channels[max_frame_size];
-  }
-
-  std::vector<float> output_frame_channels;
-  std::vector<float*> output_frame;
-  std::vector<float> input_framechannels;
-  std::vector<float*> input_frame;
-  StreamConfig input_stream_config;
-  StreamConfig output_stream_config;
-};
-
-// The configuration for the test.
-struct SimulationConfig {
-  SimulationConfig(int sample_rate_hz, SettingsType simulation_settings)
-      : sample_rate_hz(sample_rate_hz),
-        simulation_settings(simulation_settings) {}
-
-  static std::vector<SimulationConfig> GenerateSimulationConfigs() {
-    std::vector<SimulationConfig> simulation_configs;
-#ifndef WEBRTC_ANDROID
-    const SettingsType desktop_settings[] = {
-        SettingsType::kDefaultApmDesktop, SettingsType::kAllSubmodulesTurnedOff,
-        SettingsType::kDefaultApmDesktopWithoutDelayAgnostic,
-        SettingsType::kDefaultApmDesktopWithoutExtendedFilter};
-
-    const int desktop_sample_rates[] = {8000, 16000, 32000, 48000};
-
-    for (auto sample_rate : desktop_sample_rates) {
-      for (auto settings : desktop_settings) {
-        simulation_configs.push_back(SimulationConfig(sample_rate, settings));
-      }
-    }
-
-#if WEBRTC_INTELLIGIBILITY_ENHANCER == 1
-    const SettingsType intelligibility_enhancer_settings[] = {
-        SettingsType::kDefaultApmDesktopAndIntelligibilityEnhancer};
-
-    const int intelligibility_enhancer_sample_rates[] = {8000, 16000, 32000,
-                                                         48000};
-
-    for (auto sample_rate : intelligibility_enhancer_sample_rates) {
-      for (auto settings : intelligibility_enhancer_settings) {
-        simulation_configs.push_back(SimulationConfig(sample_rate, settings));
-      }
-    }
-#endif
-
-    const SettingsType beamformer_settings[] = {
-        SettingsType::kDefaultApmDesktopAndBeamformer};
-
-    const int beamformer_sample_rates[] = {8000, 16000, 32000, 48000};
-
-    for (auto sample_rate : beamformer_sample_rates) {
-      for (auto settings : beamformer_settings) {
-        simulation_configs.push_back(SimulationConfig(sample_rate, settings));
-      }
-    }
-#endif
-
-    const SettingsType mobile_settings[] = {SettingsType::kDefaultApmMobile};
-
-    const int mobile_sample_rates[] = {8000, 16000};
-
-    for (auto sample_rate : mobile_sample_rates) {
-      for (auto settings : mobile_settings) {
-        simulation_configs.push_back(SimulationConfig(sample_rate, settings));
-      }
-    }
-
-    return simulation_configs;
-  }
-
-  std::string SettingsDescription() const {
-    std::string description;
-    switch (simulation_settings) {
-      case SettingsType::kDefaultApmMobile:
-        description = "DefaultApmMobile";
-        break;
-      case SettingsType::kDefaultApmDesktop:
-        description = "DefaultApmDesktop";
-        break;
-      case SettingsType::kDefaultApmDesktopAndBeamformer:
-        description = "DefaultApmDesktopAndBeamformer";
-        break;
-      case SettingsType::kDefaultApmDesktopAndIntelligibilityEnhancer:
-        description = "DefaultApmDesktopAndIntelligibilityEnhancer";
-        break;
-      case SettingsType::kAllSubmodulesTurnedOff:
-        description = "AllSubmodulesOff";
-        break;
-      case SettingsType::kDefaultApmDesktopWithoutDelayAgnostic:
-        description = "DefaultApmDesktopWithoutDelayAgnostic";
-        break;
-      case SettingsType::kDefaultApmDesktopWithoutExtendedFilter:
-        description = "DefaultApmDesktopWithoutExtendedFilter";
-        break;
-    }
-    return description;
-  }
-
-  int sample_rate_hz = 16000;
-  SettingsType simulation_settings = SettingsType::kDefaultApmDesktop;
-};
-
-// Handler for the frame counters.
-class FrameCounters {
- public:
-  void IncreaseRenderCounter() {
-    rtc::AtomicOps::Increment(&render_count_);
-  }
-
-  void IncreaseCaptureCounter() {
-    rtc::AtomicOps::Increment(&capture_count_);
-  }
-
-  int CaptureMinusRenderCounters() const {
-    // The return value will be approximate, but that's good enough since
-    // by the time we return the value, it's not guaranteed to be correct
-    // anyway.
-    return rtc::AtomicOps::AcquireLoad(&capture_count_) -
-           rtc::AtomicOps::AcquireLoad(&render_count_);
-  }
-
-  int RenderMinusCaptureCounters() const {
-    return -CaptureMinusRenderCounters();
-  }
-
-  bool BothCountersExceedeThreshold(int threshold) const {
-    // TODO(tommi): We could use an event to signal this so that we don't need
-    // to be polling from the main thread and possibly steal cycles.
-    const int capture_count = rtc::AtomicOps::AcquireLoad(&capture_count_);
-    const int render_count = rtc::AtomicOps::AcquireLoad(&render_count_);
-    return (render_count > threshold && capture_count > threshold);
-  }
-
- private:
-  int render_count_ = 0;
-  int capture_count_ = 0;
-};
-
-// Class that represents a flag that can only be raised.
-class LockedFlag {
- public:
-  bool get_flag() const {
-    return rtc::AtomicOps::AcquireLoad(&flag_);
-  }
-
-  void set_flag() {
-    if (!get_flag())  // read-only operation to avoid affecting the cache-line.
-      rtc::AtomicOps::CompareAndSwap(&flag_, 0, 1);
-  }
-
- private:
-  int flag_ = 0;
-};
-
-// Parent class for the thread processors.
-class TimedThreadApiProcessor {
- public:
-  TimedThreadApiProcessor(ProcessorType processor_type,
-                          Random* rand_gen,
-                          FrameCounters* shared_counters_state,
-                          LockedFlag* capture_call_checker,
-                          CallSimulator* test_framework,
-                          const SimulationConfig* simulation_config,
-                          AudioProcessing* apm,
-                          int num_durations_to_store,
-                          float input_level,
-                          int num_channels)
-      : rand_gen_(rand_gen),
-        frame_counters_(shared_counters_state),
-        capture_call_checker_(capture_call_checker),
-        test_(test_framework),
-        simulation_config_(simulation_config),
-        apm_(apm),
-        frame_data_(kMaxFrameSize),
-        clock_(webrtc::Clock::GetRealTimeClock()),
-        num_durations_to_store_(num_durations_to_store),
-        input_level_(input_level),
-        processor_type_(processor_type),
-        num_channels_(num_channels) {
-    api_call_durations_.reserve(num_durations_to_store_);
-  }
-
-  // Implements the callback functionality for the threads.
-  bool Process();
-
-  // Method for printing out the simulation statistics.
-  void print_processor_statistics(const std::string& processor_name) const {
-    const std::string modifier = "_api_call_duration";
-
-    // Lambda function for creating a test printout string.
-    auto create_mean_and_std_string = [](int64_t average,
-                                         int64_t standard_dev) {
-      std::string s = std::to_string(average);
-      s += ", ";
-      s += std::to_string(standard_dev);
-      return s;
-    };
-
-    const std::string sample_rate_name =
-        "_" + std::to_string(simulation_config_->sample_rate_hz) + "Hz";
-
-    webrtc::test::PrintResultMeanAndError(
-        "apm_timing", sample_rate_name, processor_name,
-        create_mean_and_std_string(GetDurationAverage(),
-                                   GetDurationStandardDeviation()),
-        "us", false);
-
-    if (kPrintAllDurations) {
-      std::string value_string = "";
-      for (int64_t duration : api_call_durations_) {
-        value_string += std::to_string(duration) + ",";
-      }
-      webrtc::test::PrintResultList("apm_call_durations", sample_rate_name,
-                                    processor_name, value_string, "us", false);
-    }
-  }
-
-  void AddDuration(int64_t duration) {
-    if (api_call_durations_.size() < num_durations_to_store_) {
-      api_call_durations_.push_back(duration);
-    }
-  }
-
- private:
-  static const int kMaxCallDifference = 10;
-  static const int kMaxFrameSize = 480;
-  static const int kNumInitializationFrames = 5;
-
-  int64_t GetDurationStandardDeviation() const {
-    double variance = 0;
-    const int64_t average_duration = GetDurationAverage();
-    for (size_t k = kNumInitializationFrames; k < api_call_durations_.size();
-         k++) {
-      int64_t tmp = api_call_durations_[k] - average_duration;
-      variance += static_cast<double>(tmp * tmp);
-    }
-    const int denominator = rtc::checked_cast<int>(api_call_durations_.size()) -
-                            kNumInitializationFrames;
-    return (denominator > 0
-                ? rtc::checked_cast<int64_t>(sqrt(variance / denominator))
-                : -1);
-  }
-
-  int64_t GetDurationAverage() const {
-    int64_t average_duration = 0;
-    for (size_t k = kNumInitializationFrames; k < api_call_durations_.size();
-         k++) {
-      average_duration += api_call_durations_[k];
-    }
-    const int denominator = rtc::checked_cast<int>(api_call_durations_.size()) -
-                            kNumInitializationFrames;
-    return (denominator > 0 ? average_duration / denominator : -1);
-  }
-
-  int ProcessCapture() {
-    // Set the stream delay.
-    apm_->set_stream_delay_ms(30);
-
-    // Call and time the specified capture side API processing method.
-    const int64_t start_time = clock_->TimeInMicroseconds();
-    const int result = apm_->ProcessStream(
-        &frame_data_.input_frame[0], frame_data_.input_stream_config,
-        frame_data_.output_stream_config, &frame_data_.output_frame[0]);
-    const int64_t end_time = clock_->TimeInMicroseconds();
-
-    frame_counters_->IncreaseCaptureCounter();
-
-    AddDuration(end_time - start_time);
-
-    if (first_process_call_) {
-      // Flag that the capture side has been called at least once
-      // (needed to ensure that a capture call has been done
-      // before the first render call is performed (implicitly
-      // required by the APM API).
-      capture_call_checker_->set_flag();
-      first_process_call_ = false;
-    }
-    return result;
-  }
-
-  bool ReadyToProcessCapture() {
-    return (frame_counters_->CaptureMinusRenderCounters() <=
-            kMaxCallDifference);
-  }
-
-  int ProcessRender() {
-    // Call and time the specified render side API processing method.
-    const int64_t start_time = clock_->TimeInMicroseconds();
-    const int result = apm_->ProcessReverseStream(
-        &frame_data_.input_frame[0], frame_data_.input_stream_config,
-        frame_data_.output_stream_config, &frame_data_.output_frame[0]);
-    const int64_t end_time = clock_->TimeInMicroseconds();
-    frame_counters_->IncreaseRenderCounter();
-
-    AddDuration(end_time - start_time);
-
-    return result;
-  }
-
-  bool ReadyToProcessRender() {
-    // Do not process until at least one capture call has been done.
-    // (implicitly required by the APM API).
-    if (first_process_call_ && !capture_call_checker_->get_flag()) {
-      return false;
-    }
-
-    // Ensure that the number of render and capture calls do not differ too
-    // much.
-    if (frame_counters_->RenderMinusCaptureCounters() > kMaxCallDifference) {
-      return false;
-    }
-
-    first_process_call_ = false;
-    return true;
-  }
-
-  void PrepareFrame() {
-    // Lambda function for populating a float multichannel audio frame
-    // with random data.
-    auto populate_audio_frame = [](float amplitude, size_t num_channels,
-                                   size_t samples_per_channel, Random* rand_gen,
-                                   float** frame) {
-      for (size_t ch = 0; ch < num_channels; ch++) {
-        for (size_t k = 0; k < samples_per_channel; k++) {
-          // Store random float number with a value between +-amplitude.
-          frame[ch][k] = amplitude * (2 * rand_gen->Rand<float>() - 1);
-        }
-      }
-    };
-
-    // Prepare the audio input data and metadata.
-    frame_data_.input_stream_config.set_sample_rate_hz(
-        simulation_config_->sample_rate_hz);
-    frame_data_.input_stream_config.set_num_channels(num_channels_);
-    frame_data_.input_stream_config.set_has_keyboard(false);
-    populate_audio_frame(input_level_, num_channels_,
-                         (simulation_config_->sample_rate_hz *
-                          AudioProcessing::kChunkSizeMs / 1000),
-                         rand_gen_, &frame_data_.input_frame[0]);
-
-    // Prepare the float audio output data and metadata.
-    frame_data_.output_stream_config.set_sample_rate_hz(
-        simulation_config_->sample_rate_hz);
-    frame_data_.output_stream_config.set_num_channels(1);
-    frame_data_.output_stream_config.set_has_keyboard(false);
-  }
-
-  bool ReadyToProcess() {
-    switch (processor_type_) {
-      case ProcessorType::kRender:
-        return ReadyToProcessRender();
-
-      case ProcessorType::kCapture:
-        return ReadyToProcessCapture();
-    }
-
-    // Should not be reached, but the return statement is needed for the code to
-    // build successfully on Android.
-    RTC_NOTREACHED();
-    return false;
-  }
-
-  Random* rand_gen_ = nullptr;
-  FrameCounters* frame_counters_ = nullptr;
-  LockedFlag* capture_call_checker_ = nullptr;
-  CallSimulator* test_ = nullptr;
-  const SimulationConfig* const simulation_config_ = nullptr;
-  AudioProcessing* apm_ = nullptr;
-  AudioFrameData frame_data_;
-  webrtc::Clock* clock_;
-  const size_t num_durations_to_store_;
-  std::vector<int64_t> api_call_durations_;
-  const float input_level_;
-  bool first_process_call_ = true;
-  const ProcessorType processor_type_;
-  const int num_channels_ = 1;
-};
-
-// Class for managing the test simulation.
-class CallSimulator : public ::testing::TestWithParam<SimulationConfig> {
- public:
-  CallSimulator()
-      : test_complete_(EventWrapper::Create()),
-        render_thread_(
-            new rtc::PlatformThread(RenderProcessorThreadFunc, this, "render")),
-        capture_thread_(new rtc::PlatformThread(CaptureProcessorThreadFunc,
-                                                this,
-                                                "capture")),
-        rand_gen_(42U),
-        simulation_config_(static_cast<SimulationConfig>(GetParam())) {}
-
-  // Run the call simulation with a timeout.
-  EventTypeWrapper Run() {
-    StartThreads();
-
-    EventTypeWrapper result = test_complete_->Wait(kTestTimeout);
-
-    StopThreads();
-
-    render_thread_state_->print_processor_statistics(
-        simulation_config_.SettingsDescription() + "_render");
-    capture_thread_state_->print_processor_statistics(
-        simulation_config_.SettingsDescription() + "_capture");
-
-    return result;
-  }
-
-  // Tests whether all the required render and capture side calls have been
-  // done.
-  bool MaybeEndTest() {
-    if (frame_counters_.BothCountersExceedeThreshold(kMinNumFramesToProcess)) {
-      test_complete_->Set();
-      return true;
-    }
-    return false;
-  }
-
- private:
-  static const float kCaptureInputFloatLevel;
-  static const float kRenderInputFloatLevel;
-  static const int kMinNumFramesToProcess = 150;
-  static const int32_t kTestTimeout = 3 * 10 * kMinNumFramesToProcess;
-
-  // ::testing::TestWithParam<> implementation.
-  void TearDown() override { StopThreads(); }
-
-  // Stop all running threads.
-  void StopThreads() {
-    render_thread_->Stop();
-    capture_thread_->Stop();
-  }
-
-  // Simulator and APM setup.
-  void SetUp() override {
-    // Lambda function for setting the default APM runtime settings for desktop.
-    auto set_default_desktop_apm_runtime_settings = [](AudioProcessing* apm) {
-      ASSERT_EQ(apm->kNoError, apm->level_estimator()->Enable(true));
-      ASSERT_EQ(apm->kNoError, apm->gain_control()->Enable(true));
-      ASSERT_EQ(apm->kNoError,
-                apm->gain_control()->set_mode(GainControl::kAdaptiveDigital));
-      ASSERT_EQ(apm->kNoError, apm->gain_control()->Enable(true));
-      ASSERT_EQ(apm->kNoError, apm->noise_suppression()->Enable(true));
-      ASSERT_EQ(apm->kNoError, apm->voice_detection()->Enable(true));
-      ASSERT_EQ(apm->kNoError, apm->echo_control_mobile()->Enable(false));
-      ASSERT_EQ(apm->kNoError, apm->echo_cancellation()->Enable(true));
-      ASSERT_EQ(apm->kNoError, apm->echo_cancellation()->enable_metrics(true));
-      ASSERT_EQ(apm->kNoError,
-                apm->echo_cancellation()->enable_delay_logging(true));
-    };
-
-    // Lambda function for setting the default APM runtime settings for mobile.
-    auto set_default_mobile_apm_runtime_settings = [](AudioProcessing* apm) {
-      ASSERT_EQ(apm->kNoError, apm->level_estimator()->Enable(true));
-      ASSERT_EQ(apm->kNoError, apm->gain_control()->Enable(true));
-      ASSERT_EQ(apm->kNoError,
-                apm->gain_control()->set_mode(GainControl::kAdaptiveDigital));
-      ASSERT_EQ(apm->kNoError, apm->gain_control()->Enable(true));
-      ASSERT_EQ(apm->kNoError, apm->noise_suppression()->Enable(true));
-      ASSERT_EQ(apm->kNoError, apm->voice_detection()->Enable(true));
-      ASSERT_EQ(apm->kNoError, apm->echo_control_mobile()->Enable(true));
-      ASSERT_EQ(apm->kNoError, apm->echo_cancellation()->Enable(false));
-    };
-
-    // Lambda function for turning off all of the APM runtime settings
-    // submodules.
-    auto turn_off_default_apm_runtime_settings = [](AudioProcessing* apm) {
-      ASSERT_EQ(apm->kNoError, apm->level_estimator()->Enable(false));
-      ASSERT_EQ(apm->kNoError, apm->gain_control()->Enable(false));
-      ASSERT_EQ(apm->kNoError,
-                apm->gain_control()->set_mode(GainControl::kAdaptiveDigital));
-      ASSERT_EQ(apm->kNoError, apm->gain_control()->Enable(false));
-      ASSERT_EQ(apm->kNoError, apm->noise_suppression()->Enable(false));
-      ASSERT_EQ(apm->kNoError, apm->voice_detection()->Enable(false));
-      ASSERT_EQ(apm->kNoError, apm->echo_control_mobile()->Enable(false));
-      ASSERT_EQ(apm->kNoError, apm->echo_cancellation()->Enable(false));
-      ASSERT_EQ(apm->kNoError, apm->echo_cancellation()->enable_metrics(false));
-      ASSERT_EQ(apm->kNoError,
-                apm->echo_cancellation()->enable_delay_logging(false));
-    };
-
-    // Lambda function for adding default desktop APM settings to a config.
-    auto add_default_desktop_config = [](Config* config) {
-      config->Set<ExtendedFilter>(new ExtendedFilter(true));
-      config->Set<DelayAgnostic>(new DelayAgnostic(true));
-    };
-
-    // Lambda function for adding beamformer settings to a config.
-    auto add_beamformer_config = [](Config* config) {
-      const size_t num_mics = 2;
-      const std::vector<Point> array_geometry =
-          ParseArrayGeometry("0 0 0 0.05 0 0", num_mics);
-      RTC_CHECK_EQ(array_geometry.size(), num_mics);
-
-      config->Set<Beamforming>(
-          new Beamforming(true, array_geometry,
-                          SphericalPointf(DegreesToRadians(90), 0.f, 1.f)));
-    };
-
-    int num_capture_channels = 1;
-    switch (simulation_config_.simulation_settings) {
-      case SettingsType::kDefaultApmMobile: {
-        apm_.reset(AudioProcessingImpl::Create());
-        ASSERT_TRUE(!!apm_);
-        set_default_mobile_apm_runtime_settings(apm_.get());
-        break;
-      }
-      case SettingsType::kDefaultApmDesktop: {
-        Config config;
-        add_default_desktop_config(&config);
-        apm_.reset(AudioProcessingImpl::Create(config));
-        ASSERT_TRUE(!!apm_);
-        set_default_desktop_apm_runtime_settings(apm_.get());
-        apm_->SetExtraOptions(config);
-        break;
-      }
-      case SettingsType::kDefaultApmDesktopAndBeamformer: {
-        Config config;
-        add_beamformer_config(&config);
-        add_default_desktop_config(&config);
-        apm_.reset(AudioProcessingImpl::Create(config));
-        ASSERT_TRUE(!!apm_);
-        set_default_desktop_apm_runtime_settings(apm_.get());
-        apm_->SetExtraOptions(config);
-        num_capture_channels = 2;
-        break;
-      }
-      case SettingsType::kDefaultApmDesktopAndIntelligibilityEnhancer: {
-        Config config;
-        config.Set<Intelligibility>(new Intelligibility(true));
-        add_default_desktop_config(&config);
-        apm_.reset(AudioProcessingImpl::Create(config));
-        ASSERT_TRUE(!!apm_);
-        set_default_desktop_apm_runtime_settings(apm_.get());
-        apm_->SetExtraOptions(config);
-        break;
-      }
-      case SettingsType::kAllSubmodulesTurnedOff: {
-        apm_.reset(AudioProcessingImpl::Create());
-        ASSERT_TRUE(!!apm_);
-        turn_off_default_apm_runtime_settings(apm_.get());
-        break;
-      }
-      case SettingsType::kDefaultApmDesktopWithoutDelayAgnostic: {
-        Config config;
-        config.Set<ExtendedFilter>(new ExtendedFilter(true));
-        config.Set<DelayAgnostic>(new DelayAgnostic(false));
-        apm_.reset(AudioProcessingImpl::Create(config));
-        ASSERT_TRUE(!!apm_);
-        set_default_desktop_apm_runtime_settings(apm_.get());
-        apm_->SetExtraOptions(config);
-        break;
-      }
-      case SettingsType::kDefaultApmDesktopWithoutExtendedFilter: {
-        Config config;
-        config.Set<ExtendedFilter>(new ExtendedFilter(false));
-        config.Set<DelayAgnostic>(new DelayAgnostic(true));
-        apm_.reset(AudioProcessingImpl::Create(config));
-        ASSERT_TRUE(!!apm_);
-        set_default_desktop_apm_runtime_settings(apm_.get());
-        apm_->SetExtraOptions(config);
-        break;
-      }
-    }
-
-    render_thread_state_.reset(new TimedThreadApiProcessor(
-        ProcessorType::kRender, &rand_gen_, &frame_counters_,
-        &capture_call_checker_, this, &simulation_config_, apm_.get(),
-        kMinNumFramesToProcess, kRenderInputFloatLevel, 1));
-    capture_thread_state_.reset(new TimedThreadApiProcessor(
-        ProcessorType::kCapture, &rand_gen_, &frame_counters_,
-        &capture_call_checker_, this, &simulation_config_, apm_.get(),
-        kMinNumFramesToProcess, kCaptureInputFloatLevel, num_capture_channels));
-  }
-
-  // Thread callback for the render thread.
-  static bool RenderProcessorThreadFunc(void* context) {
-    return reinterpret_cast<CallSimulator*>(context)
-        ->render_thread_state_->Process();
-  }
-
-  // Thread callback for the capture thread.
-  static bool CaptureProcessorThreadFunc(void* context) {
-    return reinterpret_cast<CallSimulator*>(context)
-        ->capture_thread_state_->Process();
-  }
-
-  // Start the threads used in the test.
-  void StartThreads() {
-    ASSERT_NO_FATAL_FAILURE(render_thread_->Start());
-    render_thread_->SetPriority(rtc::kRealtimePriority);
-    ASSERT_NO_FATAL_FAILURE(capture_thread_->Start());
-    capture_thread_->SetPriority(rtc::kRealtimePriority);
-  }
-
-  // Event handler for the test.
-  const std::unique_ptr<EventWrapper> test_complete_;
-
-  // Thread related variables.
-  std::unique_ptr<rtc::PlatformThread> render_thread_;
-  std::unique_ptr<rtc::PlatformThread> capture_thread_;
-  Random rand_gen_;
-
-  std::unique_ptr<AudioProcessing> apm_;
-  const SimulationConfig simulation_config_;
-  FrameCounters frame_counters_;
-  LockedFlag capture_call_checker_;
-  std::unique_ptr<TimedThreadApiProcessor> render_thread_state_;
-  std::unique_ptr<TimedThreadApiProcessor> capture_thread_state_;
-};
-
-// Implements the callback functionality for the threads.
-bool TimedThreadApiProcessor::Process() {
-  PrepareFrame();
-
-  // Wait in a spinlock manner until it is ok to start processing.
-  // Note that SleepMs is not applicable since it only allows sleeping
-  // on a millisecond basis which is too long.
-  // TODO(tommi): This loop may affect the performance of the test that it's
-  // meant to measure.  See if we could use events instead to signal readiness.
-  while (!ReadyToProcess()) {
-  }
-
-  int result = AudioProcessing::kNoError;
-  switch (processor_type_) {
-    case ProcessorType::kRender:
-      result = ProcessRender();
-      break;
-    case ProcessorType::kCapture:
-      result = ProcessCapture();
-      break;
-  }
-
-  EXPECT_EQ(result, AudioProcessing::kNoError);
-
-  return !test_->MaybeEndTest();
-}
-
-const float CallSimulator::kRenderInputFloatLevel = 0.5f;
-const float CallSimulator::kCaptureInputFloatLevel = 0.03125f;
-}  // anonymous namespace
-
-// TODO(peah): Reactivate once issue 7712 has been resolved.
-TEST_P(CallSimulator, DISABLED_ApiCallDurationTest) {
-  // Run test and verify that it did not time out.
-  EXPECT_EQ(kEventSignaled, Run());
-}
-
-INSTANTIATE_TEST_CASE_P(
-    AudioProcessingPerformanceTest,
-    CallSimulator,
-    ::testing::ValuesIn(SimulationConfig::GenerateSimulationConfigs()));
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/audio_processing_unittest.cc b/modules/audio_processing/audio_processing_unittest.cc
deleted file mode 100644
index de070f3..0000000
--- a/modules/audio_processing/audio_processing_unittest.cc
+++ /dev/null
@@ -1,2894 +0,0 @@
-/*
- *  Copyright (c) 2012 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 <math.h>
-#include <stdio.h>
-
-#include <algorithm>
-#include <limits>
-#include <memory>
-#include <queue>
-
-#include "webrtc/common_audio/include/audio_util.h"
-#include "webrtc/common_audio/resampler/include/push_resampler.h"
-#include "webrtc/common_audio/resampler/push_sinc_resampler.h"
-#include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
-#include "webrtc/modules/audio_processing/aec_dump/aec_dump_factory.h"
-#include "webrtc/modules/audio_processing/audio_processing_impl.h"
-#include "webrtc/modules/audio_processing/beamformer/mock_nonlinear_beamformer.h"
-#include "webrtc/modules/audio_processing/common.h"
-#include "webrtc/modules/audio_processing/include/audio_processing.h"
-#include "webrtc/modules/audio_processing/level_controller/level_controller_constants.h"
-#include "webrtc/modules/audio_processing/test/protobuf_utils.h"
-#include "webrtc/modules/audio_processing/test/test_utils.h"
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/rtc_base/arraysize.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/gtest_prod_util.h"
-#include "webrtc/rtc_base/ignore_wundef.h"
-#include "webrtc/rtc_base/protobuf_utils.h"
-#include "webrtc/rtc_base/safe_minmax.h"
-#include "webrtc/rtc_base/task_queue.h"
-#include "webrtc/rtc_base/thread.h"
-#include "webrtc/system_wrappers/include/event_wrapper.h"
-#include "webrtc/system_wrappers/include/trace.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/testsupport/fileutils.h"
-
-RTC_PUSH_IGNORING_WUNDEF()
-#ifdef WEBRTC_ANDROID_PLATFORM_BUILD
-#include "external/webrtc/webrtc/modules/audio_processing/test/unittest.pb.h"
-#else
-#include "webrtc/modules/audio_processing/test/unittest.pb.h"
-#endif
-RTC_POP_IGNORING_WUNDEF()
-
-namespace webrtc {
-namespace {
-
-// TODO(ekmeyerson): Switch to using StreamConfig and ProcessingConfig where
-// applicable.
-
-// TODO(bjornv): This is not feasible until the functionality has been
-// re-implemented; see comment at the bottom of this file. For now, the user has
-// to hard code the |write_ref_data| value.
-// When false, this will compare the output data with the results stored to
-// file. This is the typical case. When the file should be updated, it can
-// be set to true with the command-line switch --write_ref_data.
-bool write_ref_data = false;
-const int32_t kChannels[] = {1, 2};
-const int kSampleRates[] = {8000, 16000, 32000, 48000};
-
-#if defined(WEBRTC_AUDIOPROC_FIXED_PROFILE)
-// Android doesn't support 48kHz.
-const int kProcessSampleRates[] = {8000, 16000, 32000};
-#elif defined(WEBRTC_AUDIOPROC_FLOAT_PROFILE)
-const int kProcessSampleRates[] = {8000, 16000, 32000, 48000};
-#endif
-
-enum StreamDirection { kForward = 0, kReverse };
-
-void ConvertToFloat(const int16_t* int_data, ChannelBuffer<float>* cb) {
-  ChannelBuffer<int16_t> cb_int(cb->num_frames(),
-                                cb->num_channels());
-  Deinterleave(int_data,
-               cb->num_frames(),
-               cb->num_channels(),
-               cb_int.channels());
-  for (size_t i = 0; i < cb->num_channels(); ++i) {
-    S16ToFloat(cb_int.channels()[i],
-               cb->num_frames(),
-               cb->channels()[i]);
-  }
-}
-
-void ConvertToFloat(const AudioFrame& frame, ChannelBuffer<float>* cb) {
-  ConvertToFloat(frame.data(), cb);
-}
-
-// Number of channels including the keyboard channel.
-size_t TotalChannelsFromLayout(AudioProcessing::ChannelLayout layout) {
-  switch (layout) {
-    case AudioProcessing::kMono:
-      return 1;
-    case AudioProcessing::kMonoAndKeyboard:
-    case AudioProcessing::kStereo:
-      return 2;
-    case AudioProcessing::kStereoAndKeyboard:
-      return 3;
-  }
-  RTC_NOTREACHED();
-  return 0;
-}
-
-int TruncateToMultipleOf10(int value) {
-  return (value / 10) * 10;
-}
-
-void MixStereoToMono(const float* stereo, float* mono,
-                     size_t samples_per_channel) {
-  for (size_t i = 0; i < samples_per_channel; ++i)
-    mono[i] = (stereo[i * 2] + stereo[i * 2 + 1]) / 2;
-}
-
-void MixStereoToMono(const int16_t* stereo, int16_t* mono,
-                     size_t samples_per_channel) {
-  for (size_t i = 0; i < samples_per_channel; ++i)
-    mono[i] = (stereo[i * 2] + stereo[i * 2 + 1]) >> 1;
-}
-
-void CopyLeftToRightChannel(int16_t* stereo, size_t samples_per_channel) {
-  for (size_t i = 0; i < samples_per_channel; i++) {
-    stereo[i * 2 + 1] = stereo[i * 2];
-  }
-}
-
-void VerifyChannelsAreEqual(const int16_t* stereo, size_t samples_per_channel) {
-  for (size_t i = 0; i < samples_per_channel; i++) {
-    EXPECT_EQ(stereo[i * 2 + 1], stereo[i * 2]);
-  }
-}
-
-void SetFrameTo(AudioFrame* frame, int16_t value) {
-  int16_t* frame_data = frame->mutable_data();
-  for (size_t i = 0; i < frame->samples_per_channel_ * frame->num_channels_;
-       ++i) {
-    frame_data[i] = value;
-  }
-}
-
-void SetFrameTo(AudioFrame* frame, int16_t left, int16_t right) {
-  ASSERT_EQ(2u, frame->num_channels_);
-  int16_t* frame_data = frame->mutable_data();
-  for (size_t i = 0; i < frame->samples_per_channel_ * 2; i += 2) {
-    frame_data[i] = left;
-    frame_data[i + 1] = right;
-  }
-}
-
-void ScaleFrame(AudioFrame* frame, float scale) {
-  int16_t* frame_data = frame->mutable_data();
-  for (size_t i = 0; i < frame->samples_per_channel_ * frame->num_channels_;
-       ++i) {
-    frame_data[i] = FloatS16ToS16(frame_data[i] * scale);
-  }
-}
-
-bool FrameDataAreEqual(const AudioFrame& frame1, const AudioFrame& frame2) {
-  if (frame1.samples_per_channel_ != frame2.samples_per_channel_) {
-    return false;
-  }
-  if (frame1.num_channels_ != frame2.num_channels_) {
-    return false;
-  }
-  if (memcmp(frame1.data(), frame2.data(),
-             frame1.samples_per_channel_ * frame1.num_channels_ *
-                 sizeof(int16_t))) {
-    return false;
-  }
-  return true;
-}
-
-void EnableAllAPComponents(AudioProcessing* ap) {
-#if defined(WEBRTC_AUDIOPROC_FIXED_PROFILE)
-  EXPECT_NOERR(ap->echo_control_mobile()->Enable(true));
-
-  EXPECT_NOERR(ap->gain_control()->set_mode(GainControl::kAdaptiveDigital));
-  EXPECT_NOERR(ap->gain_control()->Enable(true));
-#elif defined(WEBRTC_AUDIOPROC_FLOAT_PROFILE)
-  EXPECT_NOERR(ap->echo_cancellation()->enable_drift_compensation(true));
-  EXPECT_NOERR(ap->echo_cancellation()->enable_metrics(true));
-  EXPECT_NOERR(ap->echo_cancellation()->enable_delay_logging(true));
-  EXPECT_NOERR(ap->echo_cancellation()->Enable(true));
-
-  EXPECT_NOERR(ap->gain_control()->set_mode(GainControl::kAdaptiveAnalog));
-  EXPECT_NOERR(ap->gain_control()->set_analog_level_limits(0, 255));
-  EXPECT_NOERR(ap->gain_control()->Enable(true));
-#endif
-
-  AudioProcessing::Config apm_config;
-  apm_config.high_pass_filter.enabled = true;
-  ap->ApplyConfig(apm_config);
-
-  EXPECT_NOERR(ap->level_estimator()->Enable(true));
-  EXPECT_NOERR(ap->noise_suppression()->Enable(true));
-
-  EXPECT_NOERR(ap->voice_detection()->Enable(true));
-}
-
-// These functions are only used by ApmTest.Process.
-template <class T>
-T AbsValue(T a) {
-  return a > 0 ? a: -a;
-}
-
-int16_t MaxAudioFrame(const AudioFrame& frame) {
-  const size_t length = frame.samples_per_channel_ * frame.num_channels_;
-  const int16_t* frame_data = frame.data();
-  int16_t max_data = AbsValue(frame_data[0]);
-  for (size_t i = 1; i < length; i++) {
-    max_data = std::max(max_data, AbsValue(frame_data[i]));
-  }
-
-  return max_data;
-}
-
-#if defined(WEBRTC_AUDIOPROC_FLOAT_PROFILE)
-void TestStats(const AudioProcessing::Statistic& test,
-               const audioproc::Test::Statistic& reference) {
-  EXPECT_EQ(reference.instant(), test.instant);
-  EXPECT_EQ(reference.average(), test.average);
-  EXPECT_EQ(reference.maximum(), test.maximum);
-  EXPECT_EQ(reference.minimum(), test.minimum);
-}
-
-void WriteStatsMessage(const AudioProcessing::Statistic& output,
-                       audioproc::Test::Statistic* msg) {
-  msg->set_instant(output.instant);
-  msg->set_average(output.average);
-  msg->set_maximum(output.maximum);
-  msg->set_minimum(output.minimum);
-}
-#endif
-
-void OpenFileAndWriteMessage(const std::string& filename,
-                             const MessageLite& msg) {
-  FILE* file = fopen(filename.c_str(), "wb");
-  ASSERT_TRUE(file != NULL);
-
-  int32_t size = msg.ByteSize();
-  ASSERT_GT(size, 0);
-  std::unique_ptr<uint8_t[]> array(new uint8_t[size]);
-  ASSERT_TRUE(msg.SerializeToArray(array.get(), size));
-
-  ASSERT_EQ(1u, fwrite(&size, sizeof(size), 1, file));
-  ASSERT_EQ(static_cast<size_t>(size),
-      fwrite(array.get(), sizeof(array[0]), size, file));
-  fclose(file);
-}
-
-std::string ResourceFilePath(const std::string& name, int sample_rate_hz) {
-  std::ostringstream ss;
-  // Resource files are all stereo.
-  ss << name << sample_rate_hz / 1000 << "_stereo";
-  return test::ResourcePath(ss.str(), "pcm");
-}
-
-// Temporary filenames unique to this process. Used to be able to run these
-// tests in parallel as each process needs to be running in isolation they can't
-// have competing filenames.
-std::map<std::string, std::string> temp_filenames;
-
-std::string OutputFilePath(const std::string& name,
-                           int input_rate,
-                           int output_rate,
-                           int reverse_input_rate,
-                           int reverse_output_rate,
-                           size_t num_input_channels,
-                           size_t num_output_channels,
-                           size_t num_reverse_input_channels,
-                           size_t num_reverse_output_channels,
-                           StreamDirection file_direction) {
-  std::ostringstream ss;
-  ss << name << "_i" << num_input_channels << "_" << input_rate / 1000 << "_ir"
-     << num_reverse_input_channels << "_" << reverse_input_rate / 1000 << "_";
-  if (num_output_channels == 1) {
-    ss << "mono";
-  } else if (num_output_channels == 2) {
-    ss << "stereo";
-  } else {
-    RTC_NOTREACHED();
-  }
-  ss << output_rate / 1000;
-  if (num_reverse_output_channels == 1) {
-    ss << "_rmono";
-  } else if (num_reverse_output_channels == 2) {
-    ss << "_rstereo";
-  } else {
-    RTC_NOTREACHED();
-  }
-  ss << reverse_output_rate / 1000;
-  ss << "_d" << file_direction << "_pcm";
-
-  std::string filename = ss.str();
-  if (temp_filenames[filename].empty())
-    temp_filenames[filename] = test::TempFilename(test::OutputPath(), filename);
-  return temp_filenames[filename];
-}
-
-void ClearTempFiles() {
-  for (auto& kv : temp_filenames)
-    remove(kv.second.c_str());
-}
-
-void OpenFileAndReadMessage(const std::string& filename, MessageLite* msg) {
-  FILE* file = fopen(filename.c_str(), "rb");
-  ASSERT_TRUE(file != NULL);
-  ReadMessageFromFile(file, msg);
-  fclose(file);
-}
-
-// Reads a 10 ms chunk of int16 interleaved audio from the given (assumed
-// stereo) file, converts to deinterleaved float (optionally downmixing) and
-// returns the result in |cb|. Returns false if the file ended (or on error) and
-// true otherwise.
-//
-// |int_data| and |float_data| are just temporary space that must be
-// sufficiently large to hold the 10 ms chunk.
-bool ReadChunk(FILE* file, int16_t* int_data, float* float_data,
-               ChannelBuffer<float>* cb) {
-  // The files always contain stereo audio.
-  size_t frame_size = cb->num_frames() * 2;
-  size_t read_count = fread(int_data, sizeof(int16_t), frame_size, file);
-  if (read_count != frame_size) {
-    // Check that the file really ended.
-    RTC_DCHECK(feof(file));
-    return false;  // This is expected.
-  }
-
-  S16ToFloat(int_data, frame_size, float_data);
-  if (cb->num_channels() == 1) {
-    MixStereoToMono(float_data, cb->channels()[0], cb->num_frames());
-  } else {
-    Deinterleave(float_data, cb->num_frames(), 2,
-                 cb->channels());
-  }
-
-  return true;
-}
-
-class ApmTest : public ::testing::Test {
- protected:
-  ApmTest();
-  virtual void SetUp();
-  virtual void TearDown();
-
-  static void SetUpTestCase() {
-    Trace::CreateTrace();
-  }
-
-  static void TearDownTestCase() {
-    Trace::ReturnTrace();
-    ClearTempFiles();
-  }
-
-  // Used to select between int and float interface tests.
-  enum Format {
-    kIntFormat,
-    kFloatFormat
-  };
-
-  void Init(int sample_rate_hz,
-            int output_sample_rate_hz,
-            int reverse_sample_rate_hz,
-            size_t num_input_channels,
-            size_t num_output_channels,
-            size_t num_reverse_channels,
-            bool open_output_file);
-  void Init(AudioProcessing* ap);
-  void EnableAllComponents();
-  bool ReadFrame(FILE* file, AudioFrame* frame);
-  bool ReadFrame(FILE* file, AudioFrame* frame, ChannelBuffer<float>* cb);
-  void ReadFrameWithRewind(FILE* file, AudioFrame* frame);
-  void ReadFrameWithRewind(FILE* file, AudioFrame* frame,
-                           ChannelBuffer<float>* cb);
-  void ProcessWithDefaultStreamParameters(AudioFrame* frame);
-  void ProcessDelayVerificationTest(int delay_ms, int system_delay_ms,
-                                    int delay_min, int delay_max);
-  void TestChangingChannelsInt16Interface(
-      size_t num_channels,
-      AudioProcessing::Error expected_return);
-  void TestChangingForwardChannels(size_t num_in_channels,
-                                   size_t num_out_channels,
-                                   AudioProcessing::Error expected_return);
-  void TestChangingReverseChannels(size_t num_rev_channels,
-                                   AudioProcessing::Error expected_return);
-  void RunQuantizedVolumeDoesNotGetStuckTest(int sample_rate);
-  void RunManualVolumeChangeIsPossibleTest(int sample_rate);
-  void StreamParametersTest(Format format);
-  int ProcessStreamChooser(Format format);
-  int AnalyzeReverseStreamChooser(Format format);
-  void ProcessDebugDump(const std::string& in_filename,
-                        const std::string& out_filename,
-                        Format format,
-                        int max_size_bytes);
-  void VerifyDebugDumpTest(Format format);
-
-  const std::string output_path_;
-  const std::string ref_filename_;
-  std::unique_ptr<AudioProcessing> apm_;
-  AudioFrame* frame_;
-  AudioFrame* revframe_;
-  std::unique_ptr<ChannelBuffer<float> > float_cb_;
-  std::unique_ptr<ChannelBuffer<float> > revfloat_cb_;
-  int output_sample_rate_hz_;
-  size_t num_output_channels_;
-  FILE* far_file_;
-  FILE* near_file_;
-  FILE* out_file_;
-};
-
-ApmTest::ApmTest()
-    : output_path_(test::OutputPath()),
-#if defined(WEBRTC_AUDIOPROC_FIXED_PROFILE)
-      ref_filename_(test::ResourcePath("audio_processing/output_data_fixed",
-                                       "pb")),
-#elif defined(WEBRTC_AUDIOPROC_FLOAT_PROFILE)
-#if defined(WEBRTC_MAC)
-      // A different file for Mac is needed because on this platform the AEC
-      // constant |kFixedDelayMs| value is 20 and not 50 as it is on the rest.
-      ref_filename_(test::ResourcePath("audio_processing/output_data_mac",
-                                       "pb")),
-#else
-      ref_filename_(test::ResourcePath("audio_processing/output_data_float",
-                                       "pb")),
-#endif
-#endif
-      frame_(NULL),
-      revframe_(NULL),
-      output_sample_rate_hz_(0),
-      num_output_channels_(0),
-      far_file_(NULL),
-      near_file_(NULL),
-      out_file_(NULL) {
-  Config config;
-  config.Set<ExperimentalAgc>(new ExperimentalAgc(false));
-  apm_.reset(AudioProcessing::Create(config));
-}
-
-void ApmTest::SetUp() {
-  ASSERT_TRUE(apm_.get() != NULL);
-
-  frame_ = new AudioFrame();
-  revframe_ = new AudioFrame();
-
-  Init(32000, 32000, 32000, 2, 2, 2, false);
-}
-
-void ApmTest::TearDown() {
-  if (frame_) {
-    delete frame_;
-  }
-  frame_ = NULL;
-
-  if (revframe_) {
-    delete revframe_;
-  }
-  revframe_ = NULL;
-
-  if (far_file_) {
-    ASSERT_EQ(0, fclose(far_file_));
-  }
-  far_file_ = NULL;
-
-  if (near_file_) {
-    ASSERT_EQ(0, fclose(near_file_));
-  }
-  near_file_ = NULL;
-
-  if (out_file_) {
-    ASSERT_EQ(0, fclose(out_file_));
-  }
-  out_file_ = NULL;
-}
-
-void ApmTest::Init(AudioProcessing* ap) {
-  ASSERT_EQ(kNoErr,
-            ap->Initialize(
-                {{{frame_->sample_rate_hz_, frame_->num_channels_},
-                  {output_sample_rate_hz_, num_output_channels_},
-                  {revframe_->sample_rate_hz_, revframe_->num_channels_},
-                  {revframe_->sample_rate_hz_, revframe_->num_channels_}}}));
-}
-
-void ApmTest::Init(int sample_rate_hz,
-                   int output_sample_rate_hz,
-                   int reverse_sample_rate_hz,
-                   size_t num_input_channels,
-                   size_t num_output_channels,
-                   size_t num_reverse_channels,
-                   bool open_output_file) {
-  SetContainerFormat(sample_rate_hz, num_input_channels, frame_, &float_cb_);
-  output_sample_rate_hz_ = output_sample_rate_hz;
-  num_output_channels_ = num_output_channels;
-
-  SetContainerFormat(reverse_sample_rate_hz, num_reverse_channels, revframe_,
-                     &revfloat_cb_);
-  Init(apm_.get());
-
-  if (far_file_) {
-    ASSERT_EQ(0, fclose(far_file_));
-  }
-  std::string filename = ResourceFilePath("far", sample_rate_hz);
-  far_file_ = fopen(filename.c_str(), "rb");
-  ASSERT_TRUE(far_file_ != NULL) << "Could not open file " <<
-      filename << "\n";
-
-  if (near_file_) {
-    ASSERT_EQ(0, fclose(near_file_));
-  }
-  filename = ResourceFilePath("near", sample_rate_hz);
-  near_file_ = fopen(filename.c_str(), "rb");
-  ASSERT_TRUE(near_file_ != NULL) << "Could not open file " <<
-        filename << "\n";
-
-  if (open_output_file) {
-    if (out_file_) {
-      ASSERT_EQ(0, fclose(out_file_));
-    }
-    filename = OutputFilePath(
-        "out", sample_rate_hz, output_sample_rate_hz, reverse_sample_rate_hz,
-        reverse_sample_rate_hz, num_input_channels, num_output_channels,
-        num_reverse_channels, num_reverse_channels, kForward);
-    out_file_ = fopen(filename.c_str(), "wb");
-    ASSERT_TRUE(out_file_ != NULL) << "Could not open file " <<
-          filename << "\n";
-  }
-}
-
-void ApmTest::EnableAllComponents() {
-  EnableAllAPComponents(apm_.get());
-}
-
-bool ApmTest::ReadFrame(FILE* file, AudioFrame* frame,
-                        ChannelBuffer<float>* cb) {
-  // The files always contain stereo audio.
-  size_t frame_size = frame->samples_per_channel_ * 2;
-  size_t read_count = fread(frame->mutable_data(),
-                            sizeof(int16_t),
-                            frame_size,
-                            file);
-  if (read_count != frame_size) {
-    // Check that the file really ended.
-    EXPECT_NE(0, feof(file));
-    return false;  // This is expected.
-  }
-
-  if (frame->num_channels_ == 1) {
-    MixStereoToMono(frame->data(), frame->mutable_data(),
-                    frame->samples_per_channel_);
-  }
-
-  if (cb) {
-    ConvertToFloat(*frame, cb);
-  }
-  return true;
-}
-
-bool ApmTest::ReadFrame(FILE* file, AudioFrame* frame) {
-  return ReadFrame(file, frame, NULL);
-}
-
-// If the end of the file has been reached, rewind it and attempt to read the
-// frame again.
-void ApmTest::ReadFrameWithRewind(FILE* file, AudioFrame* frame,
-                                  ChannelBuffer<float>* cb) {
-  if (!ReadFrame(near_file_, frame_, cb)) {
-    rewind(near_file_);
-    ASSERT_TRUE(ReadFrame(near_file_, frame_, cb));
-  }
-}
-
-void ApmTest::ReadFrameWithRewind(FILE* file, AudioFrame* frame) {
-  ReadFrameWithRewind(file, frame, NULL);
-}
-
-void ApmTest::ProcessWithDefaultStreamParameters(AudioFrame* frame) {
-  EXPECT_EQ(apm_->kNoError, apm_->set_stream_delay_ms(0));
-  apm_->echo_cancellation()->set_stream_drift_samples(0);
-  EXPECT_EQ(apm_->kNoError,
-      apm_->gain_control()->set_stream_analog_level(127));
-  EXPECT_EQ(apm_->kNoError, apm_->ProcessStream(frame));
-}
-
-int ApmTest::ProcessStreamChooser(Format format) {
-  if (format == kIntFormat) {
-    return apm_->ProcessStream(frame_);
-  }
-  return apm_->ProcessStream(float_cb_->channels(),
-                             frame_->samples_per_channel_,
-                             frame_->sample_rate_hz_,
-                             LayoutFromChannels(frame_->num_channels_),
-                             output_sample_rate_hz_,
-                             LayoutFromChannels(num_output_channels_),
-                             float_cb_->channels());
-}
-
-int ApmTest::AnalyzeReverseStreamChooser(Format format) {
-  if (format == kIntFormat) {
-    return apm_->ProcessReverseStream(revframe_);
-  }
-  return apm_->AnalyzeReverseStream(
-      revfloat_cb_->channels(),
-      revframe_->samples_per_channel_,
-      revframe_->sample_rate_hz_,
-      LayoutFromChannels(revframe_->num_channels_));
-}
-
-void ApmTest::ProcessDelayVerificationTest(int delay_ms, int system_delay_ms,
-                                           int delay_min, int delay_max) {
-  // The |revframe_| and |frame_| should include the proper frame information,
-  // hence can be used for extracting information.
-  AudioFrame tmp_frame;
-  std::queue<AudioFrame*> frame_queue;
-  bool causal = true;
-
-  tmp_frame.CopyFrom(*revframe_);
-  SetFrameTo(&tmp_frame, 0);
-
-  EXPECT_EQ(apm_->kNoError, apm_->Initialize());
-  // Initialize the |frame_queue| with empty frames.
-  int frame_delay = delay_ms / 10;
-  while (frame_delay < 0) {
-    AudioFrame* frame = new AudioFrame();
-    frame->CopyFrom(tmp_frame);
-    frame_queue.push(frame);
-    frame_delay++;
-    causal = false;
-  }
-  while (frame_delay > 0) {
-    AudioFrame* frame = new AudioFrame();
-    frame->CopyFrom(tmp_frame);
-    frame_queue.push(frame);
-    frame_delay--;
-  }
-  // Run for 4.5 seconds, skipping statistics from the first 2.5 seconds.  We
-  // need enough frames with audio to have reliable estimates, but as few as
-  // possible to keep processing time down.  4.5 seconds seemed to be a good
-  // compromise for this recording.
-  for (int frame_count = 0; frame_count < 450; ++frame_count) {
-    AudioFrame* frame = new AudioFrame();
-    frame->CopyFrom(tmp_frame);
-    // Use the near end recording, since that has more speech in it.
-    ASSERT_TRUE(ReadFrame(near_file_, frame));
-    frame_queue.push(frame);
-    AudioFrame* reverse_frame = frame;
-    AudioFrame* process_frame = frame_queue.front();
-    if (!causal) {
-      reverse_frame = frame_queue.front();
-      // When we call ProcessStream() the frame is modified, so we can't use the
-      // pointer directly when things are non-causal. Use an intermediate frame
-      // and copy the data.
-      process_frame = &tmp_frame;
-      process_frame->CopyFrom(*frame);
-    }
-    EXPECT_EQ(apm_->kNoError, apm_->ProcessReverseStream(reverse_frame));
-    EXPECT_EQ(apm_->kNoError, apm_->set_stream_delay_ms(system_delay_ms));
-    EXPECT_EQ(apm_->kNoError, apm_->ProcessStream(process_frame));
-    frame = frame_queue.front();
-    frame_queue.pop();
-    delete frame;
-
-    if (frame_count == 250) {
-      int median;
-      int std;
-      float poor_fraction;
-      // Discard the first delay metrics to avoid convergence effects.
-      EXPECT_EQ(apm_->kNoError,
-                apm_->echo_cancellation()->GetDelayMetrics(&median, &std,
-                                                           &poor_fraction));
-    }
-  }
-
-  rewind(near_file_);
-  while (!frame_queue.empty()) {
-    AudioFrame* frame = frame_queue.front();
-    frame_queue.pop();
-    delete frame;
-  }
-  // Calculate expected delay estimate and acceptable regions. Further,
-  // limit them w.r.t. AEC delay estimation support.
-  const size_t samples_per_ms =
-      rtc::SafeMin<size_t>(16u, frame_->samples_per_channel_ / 10);
-  const int expected_median =
-      rtc::SafeClamp<int>(delay_ms - system_delay_ms, delay_min, delay_max);
-  const int expected_median_high = rtc::SafeClamp<int>(
-      expected_median + rtc::dchecked_cast<int>(96 / samples_per_ms), delay_min,
-      delay_max);
-  const int expected_median_low = rtc::SafeClamp<int>(
-      expected_median - rtc::dchecked_cast<int>(96 / samples_per_ms), delay_min,
-      delay_max);
-  // Verify delay metrics.
-  int median;
-  int std;
-  float poor_fraction;
-  EXPECT_EQ(apm_->kNoError,
-            apm_->echo_cancellation()->GetDelayMetrics(&median, &std,
-                                                       &poor_fraction));
-  EXPECT_GE(expected_median_high, median);
-  EXPECT_LE(expected_median_low, median);
-}
-
-void ApmTest::StreamParametersTest(Format format) {
-  // No errors when the components are disabled.
-  EXPECT_EQ(apm_->kNoError, ProcessStreamChooser(format));
-
-  // -- Missing AGC level --
-  EXPECT_EQ(apm_->kNoError, apm_->gain_control()->Enable(true));
-  EXPECT_EQ(apm_->kStreamParameterNotSetError,
-            ProcessStreamChooser(format));
-
-  // Resets after successful ProcessStream().
-  EXPECT_EQ(apm_->kNoError,
-            apm_->gain_control()->set_stream_analog_level(127));
-  EXPECT_EQ(apm_->kNoError, ProcessStreamChooser(format));
-  EXPECT_EQ(apm_->kStreamParameterNotSetError,
-            ProcessStreamChooser(format));
-
-  // Other stream parameters set correctly.
-  EXPECT_EQ(apm_->kNoError, apm_->echo_cancellation()->Enable(true));
-  EXPECT_EQ(apm_->kNoError,
-            apm_->echo_cancellation()->enable_drift_compensation(true));
-  EXPECT_EQ(apm_->kNoError, apm_->set_stream_delay_ms(100));
-  apm_->echo_cancellation()->set_stream_drift_samples(0);
-  EXPECT_EQ(apm_->kStreamParameterNotSetError,
-            ProcessStreamChooser(format));
-  EXPECT_EQ(apm_->kNoError, apm_->gain_control()->Enable(false));
-  EXPECT_EQ(apm_->kNoError,
-            apm_->echo_cancellation()->enable_drift_compensation(false));
-
-  // -- Missing delay --
-  EXPECT_EQ(apm_->kNoError, apm_->echo_cancellation()->Enable(true));
-  EXPECT_EQ(apm_->kNoError, ProcessStreamChooser(format));
-  EXPECT_EQ(apm_->kStreamParameterNotSetError,
-            ProcessStreamChooser(format));
-
-  // Resets after successful ProcessStream().
-  EXPECT_EQ(apm_->kNoError, apm_->set_stream_delay_ms(100));
-  EXPECT_EQ(apm_->kNoError, ProcessStreamChooser(format));
-  EXPECT_EQ(apm_->kStreamParameterNotSetError,
-            ProcessStreamChooser(format));
-
-  // Other stream parameters set correctly.
-  EXPECT_EQ(apm_->kNoError, apm_->gain_control()->Enable(true));
-  EXPECT_EQ(apm_->kNoError,
-            apm_->echo_cancellation()->enable_drift_compensation(true));
-  apm_->echo_cancellation()->set_stream_drift_samples(0);
-  EXPECT_EQ(apm_->kNoError,
-            apm_->gain_control()->set_stream_analog_level(127));
-  EXPECT_EQ(apm_->kStreamParameterNotSetError,
-            ProcessStreamChooser(format));
-  EXPECT_EQ(apm_->kNoError, apm_->gain_control()->Enable(false));
-
-  // -- Missing drift --
-  EXPECT_EQ(apm_->kStreamParameterNotSetError,
-            ProcessStreamChooser(format));
-
-  // Resets after successful ProcessStream().
-  EXPECT_EQ(apm_->kNoError, apm_->set_stream_delay_ms(100));
-  apm_->echo_cancellation()->set_stream_drift_samples(0);
-  EXPECT_EQ(apm_->kNoError, ProcessStreamChooser(format));
-  EXPECT_EQ(apm_->kStreamParameterNotSetError,
-            ProcessStreamChooser(format));
-
-  // Other stream parameters set correctly.
-  EXPECT_EQ(apm_->kNoError, apm_->gain_control()->Enable(true));
-  EXPECT_EQ(apm_->kNoError, apm_->set_stream_delay_ms(100));
-  EXPECT_EQ(apm_->kNoError,
-            apm_->gain_control()->set_stream_analog_level(127));
-  EXPECT_EQ(apm_->kStreamParameterNotSetError,
-            ProcessStreamChooser(format));
-
-  // -- No stream parameters --
-  EXPECT_EQ(apm_->kNoError,
-            AnalyzeReverseStreamChooser(format));
-  EXPECT_EQ(apm_->kStreamParameterNotSetError,
-            ProcessStreamChooser(format));
-
-  // -- All there --
-  EXPECT_EQ(apm_->kNoError, apm_->set_stream_delay_ms(100));
-  apm_->echo_cancellation()->set_stream_drift_samples(0);
-  EXPECT_EQ(apm_->kNoError,
-            apm_->gain_control()->set_stream_analog_level(127));
-  EXPECT_EQ(apm_->kNoError, ProcessStreamChooser(format));
-}
-
-TEST_F(ApmTest, StreamParametersInt) {
-  StreamParametersTest(kIntFormat);
-}
-
-TEST_F(ApmTest, StreamParametersFloat) {
-  StreamParametersTest(kFloatFormat);
-}
-
-TEST_F(ApmTest, DefaultDelayOffsetIsZero) {
-  EXPECT_EQ(0, apm_->delay_offset_ms());
-  EXPECT_EQ(apm_->kNoError, apm_->set_stream_delay_ms(50));
-  EXPECT_EQ(50, apm_->stream_delay_ms());
-}
-
-TEST_F(ApmTest, DelayOffsetWithLimitsIsSetProperly) {
-  // High limit of 500 ms.
-  apm_->set_delay_offset_ms(100);
-  EXPECT_EQ(100, apm_->delay_offset_ms());
-  EXPECT_EQ(apm_->kBadStreamParameterWarning, apm_->set_stream_delay_ms(450));
-  EXPECT_EQ(500, apm_->stream_delay_ms());
-  EXPECT_EQ(apm_->kNoError, apm_->set_stream_delay_ms(100));
-  EXPECT_EQ(200, apm_->stream_delay_ms());
-
-  // Low limit of 0 ms.
-  apm_->set_delay_offset_ms(-50);
-  EXPECT_EQ(-50, apm_->delay_offset_ms());
-  EXPECT_EQ(apm_->kBadStreamParameterWarning, apm_->set_stream_delay_ms(20));
-  EXPECT_EQ(0, apm_->stream_delay_ms());
-  EXPECT_EQ(apm_->kNoError, apm_->set_stream_delay_ms(100));
-  EXPECT_EQ(50, apm_->stream_delay_ms());
-}
-
-void ApmTest::TestChangingChannelsInt16Interface(
-    size_t num_channels,
-    AudioProcessing::Error expected_return) {
-  frame_->num_channels_ = num_channels;
-  EXPECT_EQ(expected_return, apm_->ProcessStream(frame_));
-  EXPECT_EQ(expected_return, apm_->ProcessReverseStream(frame_));
-}
-
-void ApmTest::TestChangingForwardChannels(
-    size_t num_in_channels,
-    size_t num_out_channels,
-    AudioProcessing::Error expected_return) {
-  const StreamConfig input_stream = {frame_->sample_rate_hz_, num_in_channels};
-  const StreamConfig output_stream = {output_sample_rate_hz_, num_out_channels};
-
-  EXPECT_EQ(expected_return,
-            apm_->ProcessStream(float_cb_->channels(), input_stream,
-                                output_stream, float_cb_->channels()));
-}
-
-void ApmTest::TestChangingReverseChannels(
-    size_t num_rev_channels,
-    AudioProcessing::Error expected_return) {
-  const ProcessingConfig processing_config = {
-      {{frame_->sample_rate_hz_, apm_->num_input_channels()},
-       {output_sample_rate_hz_, apm_->num_output_channels()},
-       {frame_->sample_rate_hz_, num_rev_channels},
-       {frame_->sample_rate_hz_, num_rev_channels}}};
-
-  EXPECT_EQ(
-      expected_return,
-      apm_->ProcessReverseStream(
-          float_cb_->channels(), processing_config.reverse_input_stream(),
-          processing_config.reverse_output_stream(), float_cb_->channels()));
-}
-
-TEST_F(ApmTest, ChannelsInt16Interface) {
-  // Testing number of invalid and valid channels.
-  Init(16000, 16000, 16000, 4, 4, 4, false);
-
-  TestChangingChannelsInt16Interface(0, apm_->kBadNumberChannelsError);
-
-  for (size_t i = 1; i < 4; i++) {
-    TestChangingChannelsInt16Interface(i, kNoErr);
-    EXPECT_EQ(i, apm_->num_input_channels());
-  }
-}
-
-TEST_F(ApmTest, Channels) {
-  // Testing number of invalid and valid channels.
-  Init(16000, 16000, 16000, 4, 4, 4, false);
-
-  TestChangingForwardChannels(0, 1, apm_->kBadNumberChannelsError);
-  TestChangingReverseChannels(0, apm_->kBadNumberChannelsError);
-
-  for (size_t i = 1; i < 4; ++i) {
-    for (size_t j = 0; j < 1; ++j) {
-      // Output channels much be one or match input channels.
-      if (j == 1 || i == j) {
-        TestChangingForwardChannels(i, j, kNoErr);
-        TestChangingReverseChannels(i, kNoErr);
-
-        EXPECT_EQ(i, apm_->num_input_channels());
-        EXPECT_EQ(j, apm_->num_output_channels());
-        // The number of reverse channels used for processing to is always 1.
-        EXPECT_EQ(1u, apm_->num_reverse_channels());
-      } else {
-        TestChangingForwardChannels(i, j,
-                                    AudioProcessing::kBadNumberChannelsError);
-      }
-    }
-  }
-}
-
-TEST_F(ApmTest, SampleRatesInt) {
-  // Testing invalid sample rates
-  SetContainerFormat(10000, 2, frame_, &float_cb_);
-  EXPECT_EQ(apm_->kBadSampleRateError, ProcessStreamChooser(kIntFormat));
-  // Testing valid sample rates
-  int fs[] = {8000, 16000, 32000, 48000};
-  for (size_t i = 0; i < arraysize(fs); i++) {
-    SetContainerFormat(fs[i], 2, frame_, &float_cb_);
-    EXPECT_NOERR(ProcessStreamChooser(kIntFormat));
-  }
-}
-
-TEST_F(ApmTest, EchoCancellation) {
-  EXPECT_EQ(apm_->kNoError,
-            apm_->echo_cancellation()->enable_drift_compensation(true));
-  EXPECT_TRUE(apm_->echo_cancellation()->is_drift_compensation_enabled());
-  EXPECT_EQ(apm_->kNoError,
-            apm_->echo_cancellation()->enable_drift_compensation(false));
-  EXPECT_FALSE(apm_->echo_cancellation()->is_drift_compensation_enabled());
-
-  EchoCancellation::SuppressionLevel level[] = {
-    EchoCancellation::kLowSuppression,
-    EchoCancellation::kModerateSuppression,
-    EchoCancellation::kHighSuppression,
-  };
-  for (size_t i = 0; i < arraysize(level); i++) {
-    EXPECT_EQ(apm_->kNoError,
-        apm_->echo_cancellation()->set_suppression_level(level[i]));
-    EXPECT_EQ(level[i],
-        apm_->echo_cancellation()->suppression_level());
-  }
-
-  EchoCancellation::Metrics metrics;
-  EXPECT_EQ(apm_->kNotEnabledError,
-            apm_->echo_cancellation()->GetMetrics(&metrics));
-
-  EXPECT_EQ(apm_->kNoError, apm_->echo_cancellation()->Enable(true));
-  EXPECT_TRUE(apm_->echo_cancellation()->is_enabled());
-
-  EXPECT_EQ(apm_->kNoError,
-            apm_->echo_cancellation()->enable_metrics(true));
-  EXPECT_TRUE(apm_->echo_cancellation()->are_metrics_enabled());
-  EXPECT_EQ(apm_->kNoError,
-            apm_->echo_cancellation()->enable_metrics(false));
-  EXPECT_FALSE(apm_->echo_cancellation()->are_metrics_enabled());
-
-  EXPECT_EQ(apm_->kNoError,
-            apm_->echo_cancellation()->enable_delay_logging(true));
-  EXPECT_TRUE(apm_->echo_cancellation()->is_delay_logging_enabled());
-  EXPECT_EQ(apm_->kNoError,
-            apm_->echo_cancellation()->enable_delay_logging(false));
-  EXPECT_FALSE(apm_->echo_cancellation()->is_delay_logging_enabled());
-
-  EXPECT_EQ(apm_->kNoError, apm_->echo_cancellation()->Enable(false));
-  EXPECT_FALSE(apm_->echo_cancellation()->is_enabled());
-
-  int median = 0;
-  int std = 0;
-  float poor_fraction = 0;
-  EXPECT_EQ(apm_->kNotEnabledError, apm_->echo_cancellation()->GetDelayMetrics(
-                                        &median, &std, &poor_fraction));
-
-  EXPECT_EQ(apm_->kNoError, apm_->echo_cancellation()->Enable(true));
-  EXPECT_TRUE(apm_->echo_cancellation()->is_enabled());
-  EXPECT_EQ(apm_->kNoError, apm_->echo_cancellation()->Enable(false));
-  EXPECT_FALSE(apm_->echo_cancellation()->is_enabled());
-
-  EXPECT_EQ(apm_->kNoError, apm_->echo_cancellation()->Enable(true));
-  EXPECT_TRUE(apm_->echo_cancellation()->is_enabled());
-  EXPECT_TRUE(apm_->echo_cancellation()->aec_core() != NULL);
-  EXPECT_EQ(apm_->kNoError, apm_->echo_cancellation()->Enable(false));
-  EXPECT_FALSE(apm_->echo_cancellation()->is_enabled());
-  EXPECT_FALSE(apm_->echo_cancellation()->aec_core() != NULL);
-}
-
-TEST_F(ApmTest, DISABLED_EchoCancellationReportsCorrectDelays) {
-  // TODO(bjornv): Fix this test to work with DA-AEC.
-  // Enable AEC only.
-  EXPECT_EQ(apm_->kNoError,
-            apm_->echo_cancellation()->enable_drift_compensation(false));
-  EXPECT_EQ(apm_->kNoError,
-            apm_->echo_cancellation()->enable_metrics(false));
-  EXPECT_EQ(apm_->kNoError,
-            apm_->echo_cancellation()->enable_delay_logging(true));
-  EXPECT_EQ(apm_->kNoError, apm_->echo_cancellation()->Enable(true));
-  Config config;
-  config.Set<DelayAgnostic>(new DelayAgnostic(false));
-  apm_->SetExtraOptions(config);
-
-  // Internally in the AEC the amount of lookahead the delay estimation can
-  // handle is 15 blocks and the maximum delay is set to 60 blocks.
-  const int kLookaheadBlocks = 15;
-  const int kMaxDelayBlocks = 60;
-  // The AEC has a startup time before it actually starts to process. This
-  // procedure can flush the internal far-end buffer, which of course affects
-  // the delay estimation. Therefore, we set a system_delay high enough to
-  // avoid that. The smallest system_delay you can report without flushing the
-  // buffer is 66 ms in 8 kHz.
-  //
-  // It is known that for 16 kHz (and 32 kHz) sampling frequency there is an
-  // additional stuffing of 8 ms on the fly, but it seems to have no impact on
-  // delay estimation. This should be noted though. In case of test failure,
-  // this could be the cause.
-  const int kSystemDelayMs = 66;
-  // Test a couple of corner cases and verify that the estimated delay is
-  // within a valid region (set to +-1.5 blocks). Note that these cases are
-  // sampling frequency dependent.
-  for (size_t i = 0; i < arraysize(kProcessSampleRates); i++) {
-    Init(kProcessSampleRates[i],
-         kProcessSampleRates[i],
-         kProcessSampleRates[i],
-         2,
-         2,
-         2,
-         false);
-    // Sampling frequency dependent variables.
-    const int num_ms_per_block =
-        std::max(4, static_cast<int>(640 / frame_->samples_per_channel_));
-    const int delay_min_ms = -kLookaheadBlocks * num_ms_per_block;
-    const int delay_max_ms = (kMaxDelayBlocks - 1) * num_ms_per_block;
-
-    // 1) Verify correct delay estimate at lookahead boundary.
-    int delay_ms = TruncateToMultipleOf10(kSystemDelayMs + delay_min_ms);
-    ProcessDelayVerificationTest(delay_ms, kSystemDelayMs, delay_min_ms,
-                                 delay_max_ms);
-    // 2) A delay less than maximum lookahead should give an delay estimate at
-    //    the boundary (= -kLookaheadBlocks * num_ms_per_block).
-    delay_ms -= 20;
-    ProcessDelayVerificationTest(delay_ms, kSystemDelayMs, delay_min_ms,
-                                 delay_max_ms);
-    // 3) Three values around zero delay. Note that we need to compensate for
-    //    the fake system_delay.
-    delay_ms = TruncateToMultipleOf10(kSystemDelayMs - 10);
-    ProcessDelayVerificationTest(delay_ms, kSystemDelayMs, delay_min_ms,
-                                 delay_max_ms);
-    delay_ms = TruncateToMultipleOf10(kSystemDelayMs);
-    ProcessDelayVerificationTest(delay_ms, kSystemDelayMs, delay_min_ms,
-                                 delay_max_ms);
-    delay_ms = TruncateToMultipleOf10(kSystemDelayMs + 10);
-    ProcessDelayVerificationTest(delay_ms, kSystemDelayMs, delay_min_ms,
-                                 delay_max_ms);
-    // 4) Verify correct delay estimate at maximum delay boundary.
-    delay_ms = TruncateToMultipleOf10(kSystemDelayMs + delay_max_ms);
-    ProcessDelayVerificationTest(delay_ms, kSystemDelayMs, delay_min_ms,
-                                 delay_max_ms);
-    // 5) A delay above the maximum delay should give an estimate at the
-    //    boundary (= (kMaxDelayBlocks - 1) * num_ms_per_block).
-    delay_ms += 20;
-    ProcessDelayVerificationTest(delay_ms, kSystemDelayMs, delay_min_ms,
-                                 delay_max_ms);
-  }
-}
-
-TEST_F(ApmTest, EchoControlMobile) {
-  // Turn AECM on (and AEC off)
-  Init(16000, 16000, 16000, 2, 2, 2, false);
-  EXPECT_EQ(apm_->kNoError, apm_->echo_control_mobile()->Enable(true));
-  EXPECT_TRUE(apm_->echo_control_mobile()->is_enabled());
-
-  // Toggle routing modes
-  EchoControlMobile::RoutingMode mode[] = {
-      EchoControlMobile::kQuietEarpieceOrHeadset,
-      EchoControlMobile::kEarpiece,
-      EchoControlMobile::kLoudEarpiece,
-      EchoControlMobile::kSpeakerphone,
-      EchoControlMobile::kLoudSpeakerphone,
-  };
-  for (size_t i = 0; i < arraysize(mode); i++) {
-    EXPECT_EQ(apm_->kNoError,
-        apm_->echo_control_mobile()->set_routing_mode(mode[i]));
-    EXPECT_EQ(mode[i],
-        apm_->echo_control_mobile()->routing_mode());
-  }
-  // Turn comfort noise off/on
-  EXPECT_EQ(apm_->kNoError,
-      apm_->echo_control_mobile()->enable_comfort_noise(false));
-  EXPECT_FALSE(apm_->echo_control_mobile()->is_comfort_noise_enabled());
-  EXPECT_EQ(apm_->kNoError,
-      apm_->echo_control_mobile()->enable_comfort_noise(true));
-  EXPECT_TRUE(apm_->echo_control_mobile()->is_comfort_noise_enabled());
-  // Set and get echo path
-  const size_t echo_path_size =
-      apm_->echo_control_mobile()->echo_path_size_bytes();
-  std::unique_ptr<char[]> echo_path_in(new char[echo_path_size]);
-  std::unique_ptr<char[]> echo_path_out(new char[echo_path_size]);
-  EXPECT_EQ(apm_->kNullPointerError,
-            apm_->echo_control_mobile()->SetEchoPath(NULL, echo_path_size));
-  EXPECT_EQ(apm_->kNullPointerError,
-            apm_->echo_control_mobile()->GetEchoPath(NULL, echo_path_size));
-  EXPECT_EQ(apm_->kBadParameterError,
-            apm_->echo_control_mobile()->GetEchoPath(echo_path_out.get(), 1));
-  EXPECT_EQ(apm_->kNoError,
-            apm_->echo_control_mobile()->GetEchoPath(echo_path_out.get(),
-                                                     echo_path_size));
-  for (size_t i = 0; i < echo_path_size; i++) {
-    echo_path_in[i] = echo_path_out[i] + 1;
-  }
-  EXPECT_EQ(apm_->kBadParameterError,
-            apm_->echo_control_mobile()->SetEchoPath(echo_path_in.get(), 1));
-  EXPECT_EQ(apm_->kNoError,
-            apm_->echo_control_mobile()->SetEchoPath(echo_path_in.get(),
-                                                     echo_path_size));
-  EXPECT_EQ(apm_->kNoError,
-            apm_->echo_control_mobile()->GetEchoPath(echo_path_out.get(),
-                                                     echo_path_size));
-  for (size_t i = 0; i < echo_path_size; i++) {
-    EXPECT_EQ(echo_path_in[i], echo_path_out[i]);
-  }
-
-  // Process a few frames with NS in the default disabled state. This exercises
-  // a different codepath than with it enabled.
-  EXPECT_EQ(apm_->kNoError, apm_->set_stream_delay_ms(0));
-  EXPECT_EQ(apm_->kNoError, apm_->ProcessStream(frame_));
-  EXPECT_EQ(apm_->kNoError, apm_->set_stream_delay_ms(0));
-  EXPECT_EQ(apm_->kNoError, apm_->ProcessStream(frame_));
-
-  // Turn AECM off
-  EXPECT_EQ(apm_->kNoError, apm_->echo_control_mobile()->Enable(false));
-  EXPECT_FALSE(apm_->echo_control_mobile()->is_enabled());
-}
-
-TEST_F(ApmTest, GainControl) {
-  // Testing gain modes
-  EXPECT_EQ(apm_->kNoError,
-      apm_->gain_control()->set_mode(
-      apm_->gain_control()->mode()));
-
-  GainControl::Mode mode[] = {
-    GainControl::kAdaptiveAnalog,
-    GainControl::kAdaptiveDigital,
-    GainControl::kFixedDigital
-  };
-  for (size_t i = 0; i < arraysize(mode); i++) {
-    EXPECT_EQ(apm_->kNoError,
-        apm_->gain_control()->set_mode(mode[i]));
-    EXPECT_EQ(mode[i], apm_->gain_control()->mode());
-  }
-  // Testing invalid target levels
-  EXPECT_EQ(apm_->kBadParameterError,
-      apm_->gain_control()->set_target_level_dbfs(-3));
-  EXPECT_EQ(apm_->kBadParameterError,
-      apm_->gain_control()->set_target_level_dbfs(-40));
-  // Testing valid target levels
-  EXPECT_EQ(apm_->kNoError,
-      apm_->gain_control()->set_target_level_dbfs(
-      apm_->gain_control()->target_level_dbfs()));
-
-  int level_dbfs[] = {0, 6, 31};
-  for (size_t i = 0; i < arraysize(level_dbfs); i++) {
-    EXPECT_EQ(apm_->kNoError,
-        apm_->gain_control()->set_target_level_dbfs(level_dbfs[i]));
-    EXPECT_EQ(level_dbfs[i], apm_->gain_control()->target_level_dbfs());
-  }
-
-  // Testing invalid compression gains
-  EXPECT_EQ(apm_->kBadParameterError,
-      apm_->gain_control()->set_compression_gain_db(-1));
-  EXPECT_EQ(apm_->kBadParameterError,
-      apm_->gain_control()->set_compression_gain_db(100));
-
-  // Testing valid compression gains
-  EXPECT_EQ(apm_->kNoError,
-      apm_->gain_control()->set_compression_gain_db(
-      apm_->gain_control()->compression_gain_db()));
-
-  int gain_db[] = {0, 10, 90};
-  for (size_t i = 0; i < arraysize(gain_db); i++) {
-    EXPECT_EQ(apm_->kNoError,
-        apm_->gain_control()->set_compression_gain_db(gain_db[i]));
-    EXPECT_EQ(gain_db[i], apm_->gain_control()->compression_gain_db());
-  }
-
-  // Testing limiter off/on
-  EXPECT_EQ(apm_->kNoError, apm_->gain_control()->enable_limiter(false));
-  EXPECT_FALSE(apm_->gain_control()->is_limiter_enabled());
-  EXPECT_EQ(apm_->kNoError, apm_->gain_control()->enable_limiter(true));
-  EXPECT_TRUE(apm_->gain_control()->is_limiter_enabled());
-
-  // Testing invalid level limits
-  EXPECT_EQ(apm_->kBadParameterError,
-      apm_->gain_control()->set_analog_level_limits(-1, 512));
-  EXPECT_EQ(apm_->kBadParameterError,
-      apm_->gain_control()->set_analog_level_limits(100000, 512));
-  EXPECT_EQ(apm_->kBadParameterError,
-      apm_->gain_control()->set_analog_level_limits(512, -1));
-  EXPECT_EQ(apm_->kBadParameterError,
-      apm_->gain_control()->set_analog_level_limits(512, 100000));
-  EXPECT_EQ(apm_->kBadParameterError,
-      apm_->gain_control()->set_analog_level_limits(512, 255));
-
-  // Testing valid level limits
-  EXPECT_EQ(apm_->kNoError,
-      apm_->gain_control()->set_analog_level_limits(
-      apm_->gain_control()->analog_level_minimum(),
-      apm_->gain_control()->analog_level_maximum()));
-
-  int min_level[] = {0, 255, 1024};
-  for (size_t i = 0; i < arraysize(min_level); i++) {
-    EXPECT_EQ(apm_->kNoError,
-        apm_->gain_control()->set_analog_level_limits(min_level[i], 1024));
-    EXPECT_EQ(min_level[i], apm_->gain_control()->analog_level_minimum());
-  }
-
-  int max_level[] = {0, 1024, 65535};
-  for (size_t i = 0; i < arraysize(min_level); i++) {
-    EXPECT_EQ(apm_->kNoError,
-        apm_->gain_control()->set_analog_level_limits(0, max_level[i]));
-    EXPECT_EQ(max_level[i], apm_->gain_control()->analog_level_maximum());
-  }
-
-  // TODO(ajm): stream_is_saturated() and stream_analog_level()
-
-  // Turn AGC off
-  EXPECT_EQ(apm_->kNoError, apm_->gain_control()->Enable(false));
-  EXPECT_FALSE(apm_->gain_control()->is_enabled());
-}
-
-void ApmTest::RunQuantizedVolumeDoesNotGetStuckTest(int sample_rate) {
-  Init(sample_rate, sample_rate, sample_rate, 2, 2, 2, false);
-  EXPECT_EQ(apm_->kNoError,
-            apm_->gain_control()->set_mode(GainControl::kAdaptiveAnalog));
-  EXPECT_EQ(apm_->kNoError, apm_->gain_control()->Enable(true));
-
-  int out_analog_level = 0;
-  for (int i = 0; i < 2000; ++i) {
-    ReadFrameWithRewind(near_file_, frame_);
-    // Ensure the audio is at a low level, so the AGC will try to increase it.
-    ScaleFrame(frame_, 0.25);
-
-    // Always pass in the same volume.
-    EXPECT_EQ(apm_->kNoError,
-        apm_->gain_control()->set_stream_analog_level(100));
-    EXPECT_EQ(apm_->kNoError, apm_->ProcessStream(frame_));
-    out_analog_level = apm_->gain_control()->stream_analog_level();
-  }
-
-  // Ensure the AGC is still able to reach the maximum.
-  EXPECT_EQ(255, out_analog_level);
-}
-
-// Verifies that despite volume slider quantization, the AGC can continue to
-// increase its volume.
-TEST_F(ApmTest, QuantizedVolumeDoesNotGetStuck) {
-  for (size_t i = 0; i < arraysize(kSampleRates); ++i) {
-    RunQuantizedVolumeDoesNotGetStuckTest(kSampleRates[i]);
-  }
-}
-
-void ApmTest::RunManualVolumeChangeIsPossibleTest(int sample_rate) {
-  Init(sample_rate, sample_rate, sample_rate, 2, 2, 2, false);
-  EXPECT_EQ(apm_->kNoError,
-            apm_->gain_control()->set_mode(GainControl::kAdaptiveAnalog));
-  EXPECT_EQ(apm_->kNoError, apm_->gain_control()->Enable(true));
-
-  int out_analog_level = 100;
-  for (int i = 0; i < 1000; ++i) {
-    ReadFrameWithRewind(near_file_, frame_);
-    // Ensure the audio is at a low level, so the AGC will try to increase it.
-    ScaleFrame(frame_, 0.25);
-
-    EXPECT_EQ(apm_->kNoError,
-        apm_->gain_control()->set_stream_analog_level(out_analog_level));
-    EXPECT_EQ(apm_->kNoError, apm_->ProcessStream(frame_));
-    out_analog_level = apm_->gain_control()->stream_analog_level();
-  }
-
-  // Ensure the volume was raised.
-  EXPECT_GT(out_analog_level, 100);
-  int highest_level_reached = out_analog_level;
-  // Simulate a user manual volume change.
-  out_analog_level = 100;
-
-  for (int i = 0; i < 300; ++i) {
-    ReadFrameWithRewind(near_file_, frame_);
-    ScaleFrame(frame_, 0.25);
-
-    EXPECT_EQ(apm_->kNoError,
-        apm_->gain_control()->set_stream_analog_level(out_analog_level));
-    EXPECT_EQ(apm_->kNoError, apm_->ProcessStream(frame_));
-    out_analog_level = apm_->gain_control()->stream_analog_level();
-    // Check that AGC respected the manually adjusted volume.
-    EXPECT_LT(out_analog_level, highest_level_reached);
-  }
-  // Check that the volume was still raised.
-  EXPECT_GT(out_analog_level, 100);
-}
-
-TEST_F(ApmTest, ManualVolumeChangeIsPossible) {
-  for (size_t i = 0; i < arraysize(kSampleRates); ++i) {
-    RunManualVolumeChangeIsPossibleTest(kSampleRates[i]);
-  }
-}
-
-#if !defined(WEBRTC_ANDROID) && !defined(WEBRTC_IOS)
-TEST_F(ApmTest, AgcOnlyAdaptsWhenTargetSignalIsPresent) {
-  const int kSampleRateHz = 16000;
-  const size_t kSamplesPerChannel =
-      static_cast<size_t>(AudioProcessing::kChunkSizeMs * kSampleRateHz / 1000);
-  const size_t kNumInputChannels = 2;
-  const size_t kNumOutputChannels = 1;
-  const size_t kNumChunks = 700;
-  const float kScaleFactor = 0.25f;
-  Config config;
-  std::vector<webrtc::Point> geometry;
-  geometry.push_back(webrtc::Point(0.f, 0.f, 0.f));
-  geometry.push_back(webrtc::Point(0.05f, 0.f, 0.f));
-  config.Set<Beamforming>(new Beamforming(true, geometry));
-  testing::NiceMock<MockNonlinearBeamformer>* beamformer =
-      new testing::NiceMock<MockNonlinearBeamformer>(geometry, 1u);
-  std::unique_ptr<AudioProcessing> apm(
-      AudioProcessing::Create(config, beamformer));
-  EXPECT_EQ(kNoErr, apm->gain_control()->Enable(true));
-  ChannelBuffer<float> src_buf(kSamplesPerChannel, kNumInputChannels);
-  ChannelBuffer<float> dest_buf(kSamplesPerChannel, kNumOutputChannels);
-  const size_t max_length = kSamplesPerChannel * std::max(kNumInputChannels,
-                                                          kNumOutputChannels);
-  std::unique_ptr<int16_t[]> int_data(new int16_t[max_length]);
-  std::unique_ptr<float[]> float_data(new float[max_length]);
-  std::string filename = ResourceFilePath("far", kSampleRateHz);
-  FILE* far_file = fopen(filename.c_str(), "rb");
-  ASSERT_TRUE(far_file != NULL) << "Could not open file " << filename << "\n";
-  const int kDefaultVolume = apm->gain_control()->stream_analog_level();
-  const int kDefaultCompressionGain =
-      apm->gain_control()->compression_gain_db();
-  bool is_target = false;
-  EXPECT_CALL(*beamformer, is_target_present())
-      .WillRepeatedly(testing::ReturnPointee(&is_target));
-  for (size_t i = 0; i < kNumChunks; ++i) {
-    ASSERT_TRUE(ReadChunk(far_file,
-                          int_data.get(),
-                          float_data.get(),
-                          &src_buf));
-    for (size_t j = 0; j < kNumInputChannels; ++j) {
-      for (size_t k = 0; k < kSamplesPerChannel; ++k) {
-        src_buf.channels()[j][k] *= kScaleFactor;
-      }
-    }
-    EXPECT_EQ(kNoErr,
-              apm->ProcessStream(src_buf.channels(),
-                                 src_buf.num_frames(),
-                                 kSampleRateHz,
-                                 LayoutFromChannels(src_buf.num_channels()),
-                                 kSampleRateHz,
-                                 LayoutFromChannels(dest_buf.num_channels()),
-                                 dest_buf.channels()));
-  }
-  EXPECT_EQ(kDefaultVolume,
-            apm->gain_control()->stream_analog_level());
-  EXPECT_EQ(kDefaultCompressionGain,
-            apm->gain_control()->compression_gain_db());
-  rewind(far_file);
-  is_target = true;
-  for (size_t i = 0; i < kNumChunks; ++i) {
-    ASSERT_TRUE(ReadChunk(far_file,
-                          int_data.get(),
-                          float_data.get(),
-                          &src_buf));
-    for (size_t j = 0; j < kNumInputChannels; ++j) {
-      for (size_t k = 0; k < kSamplesPerChannel; ++k) {
-        src_buf.channels()[j][k] *= kScaleFactor;
-      }
-    }
-    EXPECT_EQ(kNoErr,
-              apm->ProcessStream(src_buf.channels(),
-                                 src_buf.num_frames(),
-                                 kSampleRateHz,
-                                 LayoutFromChannels(src_buf.num_channels()),
-                                 kSampleRateHz,
-                                 LayoutFromChannels(dest_buf.num_channels()),
-                                 dest_buf.channels()));
-  }
-  EXPECT_LT(kDefaultVolume,
-            apm->gain_control()->stream_analog_level());
-  EXPECT_LT(kDefaultCompressionGain,
-            apm->gain_control()->compression_gain_db());
-  ASSERT_EQ(0, fclose(far_file));
-}
-#endif
-
-TEST_F(ApmTest, NoiseSuppression) {
-  // Test valid suppression levels.
-  NoiseSuppression::Level level[] = {
-    NoiseSuppression::kLow,
-    NoiseSuppression::kModerate,
-    NoiseSuppression::kHigh,
-    NoiseSuppression::kVeryHigh
-  };
-  for (size_t i = 0; i < arraysize(level); i++) {
-    EXPECT_EQ(apm_->kNoError,
-        apm_->noise_suppression()->set_level(level[i]));
-    EXPECT_EQ(level[i], apm_->noise_suppression()->level());
-  }
-
-  // Turn NS on/off
-  EXPECT_EQ(apm_->kNoError, apm_->noise_suppression()->Enable(true));
-  EXPECT_TRUE(apm_->noise_suppression()->is_enabled());
-  EXPECT_EQ(apm_->kNoError, apm_->noise_suppression()->Enable(false));
-  EXPECT_FALSE(apm_->noise_suppression()->is_enabled());
-}
-
-TEST_F(ApmTest, HighPassFilter) {
-  // Turn HP filter on/off
-  AudioProcessing::Config apm_config;
-  apm_config.high_pass_filter.enabled = true;
-  apm_->ApplyConfig(apm_config);
-  apm_config.high_pass_filter.enabled = false;
-  apm_->ApplyConfig(apm_config);
-}
-
-TEST_F(ApmTest, LevelEstimator) {
-  // Turn level estimator on/off
-  EXPECT_EQ(apm_->kNoError, apm_->level_estimator()->Enable(false));
-  EXPECT_FALSE(apm_->level_estimator()->is_enabled());
-
-  EXPECT_EQ(apm_->kNotEnabledError, apm_->level_estimator()->RMS());
-
-  EXPECT_EQ(apm_->kNoError, apm_->level_estimator()->Enable(true));
-  EXPECT_TRUE(apm_->level_estimator()->is_enabled());
-
-  // Run this test in wideband; in super-wb, the splitting filter distorts the
-  // audio enough to cause deviation from the expectation for small values.
-  frame_->samples_per_channel_ = 160;
-  frame_->num_channels_ = 2;
-  frame_->sample_rate_hz_ = 16000;
-
-  // Min value if no frames have been processed.
-  EXPECT_EQ(127, apm_->level_estimator()->RMS());
-
-  // Min value on zero frames.
-  SetFrameTo(frame_, 0);
-  EXPECT_EQ(apm_->kNoError, apm_->ProcessStream(frame_));
-  EXPECT_EQ(apm_->kNoError, apm_->ProcessStream(frame_));
-  EXPECT_EQ(127, apm_->level_estimator()->RMS());
-
-  // Try a few RMS values.
-  // (These also test that the value resets after retrieving it.)
-  SetFrameTo(frame_, 32767);
-  EXPECT_EQ(apm_->kNoError, apm_->ProcessStream(frame_));
-  EXPECT_EQ(apm_->kNoError, apm_->ProcessStream(frame_));
-  EXPECT_EQ(0, apm_->level_estimator()->RMS());
-
-  SetFrameTo(frame_, 30000);
-  EXPECT_EQ(apm_->kNoError, apm_->ProcessStream(frame_));
-  EXPECT_EQ(apm_->kNoError, apm_->ProcessStream(frame_));
-  EXPECT_EQ(1, apm_->level_estimator()->RMS());
-
-  SetFrameTo(frame_, 10000);
-  EXPECT_EQ(apm_->kNoError, apm_->ProcessStream(frame_));
-  EXPECT_EQ(apm_->kNoError, apm_->ProcessStream(frame_));
-  EXPECT_EQ(10, apm_->level_estimator()->RMS());
-
-  SetFrameTo(frame_, 10);
-  EXPECT_EQ(apm_->kNoError, apm_->ProcessStream(frame_));
-  EXPECT_EQ(apm_->kNoError, apm_->ProcessStream(frame_));
-  EXPECT_EQ(70, apm_->level_estimator()->RMS());
-
-  // Verify reset after enable/disable.
-  SetFrameTo(frame_, 32767);
-  EXPECT_EQ(apm_->kNoError, apm_->ProcessStream(frame_));
-  EXPECT_EQ(apm_->kNoError, apm_->level_estimator()->Enable(false));
-  EXPECT_EQ(apm_->kNoError, apm_->level_estimator()->Enable(true));
-  SetFrameTo(frame_, 1);
-  EXPECT_EQ(apm_->kNoError, apm_->ProcessStream(frame_));
-  EXPECT_EQ(90, apm_->level_estimator()->RMS());
-
-  // Verify reset after initialize.
-  SetFrameTo(frame_, 32767);
-  EXPECT_EQ(apm_->kNoError, apm_->ProcessStream(frame_));
-  EXPECT_EQ(apm_->kNoError, apm_->Initialize());
-  SetFrameTo(frame_, 1);
-  EXPECT_EQ(apm_->kNoError, apm_->ProcessStream(frame_));
-  EXPECT_EQ(90, apm_->level_estimator()->RMS());
-}
-
-TEST_F(ApmTest, VoiceDetection) {
-  // Test external VAD
-  EXPECT_EQ(apm_->kNoError,
-            apm_->voice_detection()->set_stream_has_voice(true));
-  EXPECT_TRUE(apm_->voice_detection()->stream_has_voice());
-  EXPECT_EQ(apm_->kNoError,
-            apm_->voice_detection()->set_stream_has_voice(false));
-  EXPECT_FALSE(apm_->voice_detection()->stream_has_voice());
-
-  // Test valid likelihoods
-  VoiceDetection::Likelihood likelihood[] = {
-      VoiceDetection::kVeryLowLikelihood,
-      VoiceDetection::kLowLikelihood,
-      VoiceDetection::kModerateLikelihood,
-      VoiceDetection::kHighLikelihood
-  };
-  for (size_t i = 0; i < arraysize(likelihood); i++) {
-    EXPECT_EQ(apm_->kNoError,
-              apm_->voice_detection()->set_likelihood(likelihood[i]));
-    EXPECT_EQ(likelihood[i], apm_->voice_detection()->likelihood());
-  }
-
-  /* TODO(bjornv): Enable once VAD supports other frame lengths than 10 ms
-  // Test invalid frame sizes
-  EXPECT_EQ(apm_->kBadParameterError,
-      apm_->voice_detection()->set_frame_size_ms(12));
-
-  // Test valid frame sizes
-  for (int i = 10; i <= 30; i += 10) {
-    EXPECT_EQ(apm_->kNoError,
-        apm_->voice_detection()->set_frame_size_ms(i));
-    EXPECT_EQ(i, apm_->voice_detection()->frame_size_ms());
-  }
-  */
-
-  // Turn VAD on/off
-  EXPECT_EQ(apm_->kNoError, apm_->voice_detection()->Enable(true));
-  EXPECT_TRUE(apm_->voice_detection()->is_enabled());
-  EXPECT_EQ(apm_->kNoError, apm_->voice_detection()->Enable(false));
-  EXPECT_FALSE(apm_->voice_detection()->is_enabled());
-
-  // Test that AudioFrame activity is maintained when VAD is disabled.
-  EXPECT_EQ(apm_->kNoError, apm_->voice_detection()->Enable(false));
-  AudioFrame::VADActivity activity[] = {
-      AudioFrame::kVadActive,
-      AudioFrame::kVadPassive,
-      AudioFrame::kVadUnknown
-  };
-  for (size_t i = 0; i < arraysize(activity); i++) {
-    frame_->vad_activity_ = activity[i];
-    EXPECT_EQ(apm_->kNoError, apm_->ProcessStream(frame_));
-    EXPECT_EQ(activity[i], frame_->vad_activity_);
-  }
-
-  // Test that AudioFrame activity is set when VAD is enabled.
-  EXPECT_EQ(apm_->kNoError, apm_->voice_detection()->Enable(true));
-  frame_->vad_activity_ = AudioFrame::kVadUnknown;
-  EXPECT_EQ(apm_->kNoError, apm_->ProcessStream(frame_));
-  EXPECT_NE(AudioFrame::kVadUnknown, frame_->vad_activity_);
-
-  // TODO(bjornv): Add tests for streamed voice; stream_has_voice()
-}
-
-TEST_F(ApmTest, AllProcessingDisabledByDefault) {
-  EXPECT_FALSE(apm_->echo_cancellation()->is_enabled());
-  EXPECT_FALSE(apm_->echo_control_mobile()->is_enabled());
-  EXPECT_FALSE(apm_->gain_control()->is_enabled());
-  EXPECT_FALSE(apm_->high_pass_filter()->is_enabled());
-  EXPECT_FALSE(apm_->level_estimator()->is_enabled());
-  EXPECT_FALSE(apm_->noise_suppression()->is_enabled());
-  EXPECT_FALSE(apm_->voice_detection()->is_enabled());
-}
-
-TEST_F(ApmTest, NoProcessingWhenAllComponentsDisabled) {
-  for (size_t i = 0; i < arraysize(kSampleRates); i++) {
-    Init(kSampleRates[i], kSampleRates[i], kSampleRates[i], 2, 2, 2, false);
-    SetFrameTo(frame_, 1000, 2000);
-    AudioFrame frame_copy;
-    frame_copy.CopyFrom(*frame_);
-    for (int j = 0; j < 1000; j++) {
-      EXPECT_EQ(apm_->kNoError, apm_->ProcessStream(frame_));
-      EXPECT_TRUE(FrameDataAreEqual(*frame_, frame_copy));
-      EXPECT_EQ(apm_->kNoError, apm_->ProcessReverseStream(frame_));
-      EXPECT_TRUE(FrameDataAreEqual(*frame_, frame_copy));
-    }
-  }
-}
-
-TEST_F(ApmTest, NoProcessingWhenAllComponentsDisabledFloat) {
-  // Test that ProcessStream copies input to output even with no processing.
-  const size_t kSamples = 80;
-  const int sample_rate = 8000;
-  const float src[kSamples] = {
-    -1.0f, 0.0f, 1.0f
-  };
-  float dest[kSamples] = {};
-
-  auto src_channels = &src[0];
-  auto dest_channels = &dest[0];
-
-  apm_.reset(AudioProcessing::Create());
-  EXPECT_NOERR(apm_->ProcessStream(
-      &src_channels, kSamples, sample_rate, LayoutFromChannels(1),
-      sample_rate, LayoutFromChannels(1), &dest_channels));
-
-  for (size_t i = 0; i < kSamples; ++i) {
-    EXPECT_EQ(src[i], dest[i]);
-  }
-
-  // Same for ProcessReverseStream.
-  float rev_dest[kSamples] = {};
-  auto rev_dest_channels = &rev_dest[0];
-
-  StreamConfig input_stream = {sample_rate, 1};
-  StreamConfig output_stream = {sample_rate, 1};
-  EXPECT_NOERR(apm_->ProcessReverseStream(&src_channels, input_stream,
-                                          output_stream, &rev_dest_channels));
-
-  for (size_t i = 0; i < kSamples; ++i) {
-    EXPECT_EQ(src[i], rev_dest[i]);
-  }
-}
-
-TEST_F(ApmTest, IdenticalInputChannelsResultInIdenticalOutputChannels) {
-  EnableAllComponents();
-
-  for (size_t i = 0; i < arraysize(kProcessSampleRates); i++) {
-    Init(kProcessSampleRates[i],
-         kProcessSampleRates[i],
-         kProcessSampleRates[i],
-         2,
-         2,
-         2,
-         false);
-    int analog_level = 127;
-    ASSERT_EQ(0, feof(far_file_));
-    ASSERT_EQ(0, feof(near_file_));
-    while (ReadFrame(far_file_, revframe_) && ReadFrame(near_file_, frame_)) {
-      CopyLeftToRightChannel(revframe_->mutable_data(),
-                             revframe_->samples_per_channel_);
-
-      ASSERT_EQ(kNoErr, apm_->ProcessReverseStream(revframe_));
-
-      CopyLeftToRightChannel(frame_->mutable_data(),
-                             frame_->samples_per_channel_);
-      frame_->vad_activity_ = AudioFrame::kVadUnknown;
-
-      ASSERT_EQ(kNoErr, apm_->set_stream_delay_ms(0));
-      apm_->echo_cancellation()->set_stream_drift_samples(0);
-      ASSERT_EQ(kNoErr,
-          apm_->gain_control()->set_stream_analog_level(analog_level));
-      ASSERT_EQ(kNoErr, apm_->ProcessStream(frame_));
-      analog_level = apm_->gain_control()->stream_analog_level();
-
-      VerifyChannelsAreEqual(frame_->data(), frame_->samples_per_channel_);
-    }
-    rewind(far_file_);
-    rewind(near_file_);
-  }
-}
-
-TEST_F(ApmTest, SplittingFilter) {
-  // Verify the filter is not active through undistorted audio when:
-  // 1. No components are enabled...
-  SetFrameTo(frame_, 1000);
-  AudioFrame frame_copy;
-  frame_copy.CopyFrom(*frame_);
-  EXPECT_EQ(apm_->kNoError, apm_->ProcessStream(frame_));
-  EXPECT_EQ(apm_->kNoError, apm_->ProcessStream(frame_));
-  EXPECT_TRUE(FrameDataAreEqual(*frame_, frame_copy));
-
-  // 2. Only the level estimator is enabled...
-  SetFrameTo(frame_, 1000);
-  frame_copy.CopyFrom(*frame_);
-  EXPECT_EQ(apm_->kNoError, apm_->level_estimator()->Enable(true));
-  EXPECT_EQ(apm_->kNoError, apm_->ProcessStream(frame_));
-  EXPECT_EQ(apm_->kNoError, apm_->ProcessStream(frame_));
-  EXPECT_TRUE(FrameDataAreEqual(*frame_, frame_copy));
-  EXPECT_EQ(apm_->kNoError, apm_->level_estimator()->Enable(false));
-
-  // 3. Only VAD is enabled...
-  SetFrameTo(frame_, 1000);
-  frame_copy.CopyFrom(*frame_);
-  EXPECT_EQ(apm_->kNoError, apm_->voice_detection()->Enable(true));
-  EXPECT_EQ(apm_->kNoError, apm_->ProcessStream(frame_));
-  EXPECT_EQ(apm_->kNoError, apm_->ProcessStream(frame_));
-  EXPECT_TRUE(FrameDataAreEqual(*frame_, frame_copy));
-  EXPECT_EQ(apm_->kNoError, apm_->voice_detection()->Enable(false));
-
-  // 4. Both VAD and the level estimator are enabled...
-  SetFrameTo(frame_, 1000);
-  frame_copy.CopyFrom(*frame_);
-  EXPECT_EQ(apm_->kNoError, apm_->level_estimator()->Enable(true));
-  EXPECT_EQ(apm_->kNoError, apm_->voice_detection()->Enable(true));
-  EXPECT_EQ(apm_->kNoError, apm_->ProcessStream(frame_));
-  EXPECT_EQ(apm_->kNoError, apm_->ProcessStream(frame_));
-  EXPECT_TRUE(FrameDataAreEqual(*frame_, frame_copy));
-  EXPECT_EQ(apm_->kNoError, apm_->level_estimator()->Enable(false));
-  EXPECT_EQ(apm_->kNoError, apm_->voice_detection()->Enable(false));
-
-  // 5. Not using super-wb.
-  frame_->samples_per_channel_ = 160;
-  frame_->num_channels_ = 2;
-  frame_->sample_rate_hz_ = 16000;
-  // Enable AEC, which would require the filter in super-wb. We rely on the
-  // first few frames of data being unaffected by the AEC.
-  // TODO(andrew): This test, and the one below, rely rather tenuously on the
-  // behavior of the AEC. Think of something more robust.
-  EXPECT_EQ(apm_->kNoError, apm_->echo_cancellation()->Enable(true));
-  // Make sure we have extended filter enabled. This makes sure nothing is
-  // touched until we have a farend frame.
-  Config config;
-  config.Set<ExtendedFilter>(new ExtendedFilter(true));
-  apm_->SetExtraOptions(config);
-  SetFrameTo(frame_, 1000);
-  frame_copy.CopyFrom(*frame_);
-  EXPECT_EQ(apm_->kNoError, apm_->set_stream_delay_ms(0));
-  apm_->echo_cancellation()->set_stream_drift_samples(0);
-  EXPECT_EQ(apm_->kNoError, apm_->ProcessStream(frame_));
-  EXPECT_EQ(apm_->kNoError, apm_->set_stream_delay_ms(0));
-  apm_->echo_cancellation()->set_stream_drift_samples(0);
-  EXPECT_EQ(apm_->kNoError, apm_->ProcessStream(frame_));
-  EXPECT_TRUE(FrameDataAreEqual(*frame_, frame_copy));
-
-  // Check the test is valid. We should have distortion from the filter
-  // when AEC is enabled (which won't affect the audio).
-  frame_->samples_per_channel_ = 320;
-  frame_->num_channels_ = 2;
-  frame_->sample_rate_hz_ = 32000;
-  SetFrameTo(frame_, 1000);
-  frame_copy.CopyFrom(*frame_);
-  EXPECT_EQ(apm_->kNoError, apm_->set_stream_delay_ms(0));
-  apm_->echo_cancellation()->set_stream_drift_samples(0);
-  EXPECT_EQ(apm_->kNoError, apm_->ProcessStream(frame_));
-  EXPECT_FALSE(FrameDataAreEqual(*frame_, frame_copy));
-}
-
-#ifdef WEBRTC_AUDIOPROC_DEBUG_DUMP
-void ApmTest::ProcessDebugDump(const std::string& in_filename,
-                               const std::string& out_filename,
-                               Format format,
-                               int max_size_bytes) {
-  rtc::TaskQueue worker_queue("ApmTest_worker_queue");
-  FILE* in_file = fopen(in_filename.c_str(), "rb");
-  ASSERT_TRUE(in_file != NULL);
-  audioproc::Event event_msg;
-  bool first_init = true;
-
-  while (ReadMessageFromFile(in_file, &event_msg)) {
-    if (event_msg.type() == audioproc::Event::INIT) {
-      const audioproc::Init msg = event_msg.init();
-      int reverse_sample_rate = msg.sample_rate();
-      if (msg.has_reverse_sample_rate()) {
-        reverse_sample_rate = msg.reverse_sample_rate();
-      }
-      int output_sample_rate = msg.sample_rate();
-      if (msg.has_output_sample_rate()) {
-        output_sample_rate = msg.output_sample_rate();
-      }
-
-      Init(msg.sample_rate(),
-           output_sample_rate,
-           reverse_sample_rate,
-           msg.num_input_channels(),
-           msg.num_output_channels(),
-           msg.num_reverse_channels(),
-           false);
-      if (first_init) {
-        // AttachAecDump() writes an additional init message. Don't start
-        // recording until after the first init to avoid the extra message.
-        auto aec_dump =
-            AecDumpFactory::Create(out_filename, max_size_bytes, &worker_queue);
-        EXPECT_TRUE(aec_dump);
-        apm_->AttachAecDump(std::move(aec_dump));
-        first_init = false;
-      }
-
-    } else if (event_msg.type() == audioproc::Event::REVERSE_STREAM) {
-      const audioproc::ReverseStream msg = event_msg.reverse_stream();
-
-      if (msg.channel_size() > 0) {
-        ASSERT_EQ(revframe_->num_channels_,
-                  static_cast<size_t>(msg.channel_size()));
-        for (int i = 0; i < msg.channel_size(); ++i) {
-           memcpy(revfloat_cb_->channels()[i],
-                  msg.channel(i).data(),
-                  msg.channel(i).size());
-        }
-      } else {
-        memcpy(revframe_->mutable_data(), msg.data().data(), msg.data().size());
-        if (format == kFloatFormat) {
-          // We're using an int16 input file; convert to float.
-          ConvertToFloat(*revframe_, revfloat_cb_.get());
-        }
-      }
-      AnalyzeReverseStreamChooser(format);
-
-    } else if (event_msg.type() == audioproc::Event::STREAM) {
-      const audioproc::Stream msg = event_msg.stream();
-      // ProcessStream could have changed this for the output frame.
-      frame_->num_channels_ = apm_->num_input_channels();
-
-      EXPECT_NOERR(apm_->gain_control()->set_stream_analog_level(msg.level()));
-      EXPECT_NOERR(apm_->set_stream_delay_ms(msg.delay()));
-      apm_->echo_cancellation()->set_stream_drift_samples(msg.drift());
-      if (msg.has_keypress()) {
-        apm_->set_stream_key_pressed(msg.keypress());
-      } else {
-        apm_->set_stream_key_pressed(true);
-      }
-
-      if (msg.input_channel_size() > 0) {
-        ASSERT_EQ(frame_->num_channels_,
-                  static_cast<size_t>(msg.input_channel_size()));
-        for (int i = 0; i < msg.input_channel_size(); ++i) {
-           memcpy(float_cb_->channels()[i],
-                  msg.input_channel(i).data(),
-                  msg.input_channel(i).size());
-        }
-      } else {
-        memcpy(frame_->mutable_data(), msg.input_data().data(),
-               msg.input_data().size());
-        if (format == kFloatFormat) {
-          // We're using an int16 input file; convert to float.
-          ConvertToFloat(*frame_, float_cb_.get());
-        }
-      }
-      ProcessStreamChooser(format);
-    }
-  }
-  apm_->DetachAecDump();
-  fclose(in_file);
-}
-
-void ApmTest::VerifyDebugDumpTest(Format format) {
-  const std::string in_filename = test::ResourcePath("ref03", "aecdump");
-  std::string format_string;
-  switch (format) {
-    case kIntFormat:
-      format_string = "_int";
-      break;
-    case kFloatFormat:
-      format_string = "_float";
-      break;
-  }
-  const std::string ref_filename = test::TempFilename(
-      test::OutputPath(), std::string("ref") + format_string + "_aecdump");
-  const std::string out_filename = test::TempFilename(
-      test::OutputPath(), std::string("out") + format_string + "_aecdump");
-  const std::string limited_filename = test::TempFilename(
-      test::OutputPath(), std::string("limited") + format_string + "_aecdump");
-  const size_t logging_limit_bytes = 100000;
-  // We expect at least this many bytes in the created logfile.
-  const size_t logging_expected_bytes = 95000;
-  EnableAllComponents();
-  ProcessDebugDump(in_filename, ref_filename, format, -1);
-  ProcessDebugDump(ref_filename, out_filename, format, -1);
-  ProcessDebugDump(ref_filename, limited_filename, format, logging_limit_bytes);
-
-  FILE* ref_file = fopen(ref_filename.c_str(), "rb");
-  FILE* out_file = fopen(out_filename.c_str(), "rb");
-  FILE* limited_file = fopen(limited_filename.c_str(), "rb");
-  ASSERT_TRUE(ref_file != NULL);
-  ASSERT_TRUE(out_file != NULL);
-  ASSERT_TRUE(limited_file != NULL);
-  std::unique_ptr<uint8_t[]> ref_bytes;
-  std::unique_ptr<uint8_t[]> out_bytes;
-  std::unique_ptr<uint8_t[]> limited_bytes;
-
-  size_t ref_size = ReadMessageBytesFromFile(ref_file, &ref_bytes);
-  size_t out_size = ReadMessageBytesFromFile(out_file, &out_bytes);
-  size_t limited_size = ReadMessageBytesFromFile(limited_file, &limited_bytes);
-  size_t bytes_read = 0;
-  size_t bytes_read_limited = 0;
-  while (ref_size > 0 && out_size > 0) {
-    bytes_read += ref_size;
-    bytes_read_limited += limited_size;
-    EXPECT_EQ(ref_size, out_size);
-    EXPECT_GE(ref_size, limited_size);
-    EXPECT_EQ(0, memcmp(ref_bytes.get(), out_bytes.get(), ref_size));
-    EXPECT_EQ(0, memcmp(ref_bytes.get(), limited_bytes.get(), limited_size));
-    ref_size = ReadMessageBytesFromFile(ref_file, &ref_bytes);
-    out_size = ReadMessageBytesFromFile(out_file, &out_bytes);
-    limited_size = ReadMessageBytesFromFile(limited_file, &limited_bytes);
-  }
-  EXPECT_GT(bytes_read, 0u);
-  EXPECT_GT(bytes_read_limited, logging_expected_bytes);
-  EXPECT_LE(bytes_read_limited, logging_limit_bytes);
-  EXPECT_NE(0, feof(ref_file));
-  EXPECT_NE(0, feof(out_file));
-  EXPECT_NE(0, feof(limited_file));
-  ASSERT_EQ(0, fclose(ref_file));
-  ASSERT_EQ(0, fclose(out_file));
-  ASSERT_EQ(0, fclose(limited_file));
-  remove(ref_filename.c_str());
-  remove(out_filename.c_str());
-  remove(limited_filename.c_str());
-}
-
-TEST_F(ApmTest, VerifyDebugDumpInt) {
-  VerifyDebugDumpTest(kIntFormat);
-}
-
-TEST_F(ApmTest, VerifyDebugDumpFloat) {
-  VerifyDebugDumpTest(kFloatFormat);
-}
-#endif
-
-// TODO(andrew): expand test to verify output.
-TEST_F(ApmTest, DebugDump) {
-  rtc::TaskQueue worker_queue("ApmTest_worker_queue");
-  const std::string filename =
-      test::TempFilename(test::OutputPath(), "debug_aec");
-  {
-    auto aec_dump = AecDumpFactory::Create("", -1, &worker_queue);
-    EXPECT_FALSE(aec_dump);
-  }
-
-#ifdef WEBRTC_AUDIOPROC_DEBUG_DUMP
-  // Stopping without having started should be OK.
-  apm_->DetachAecDump();
-
-  auto aec_dump = AecDumpFactory::Create(filename, -1, &worker_queue);
-  EXPECT_TRUE(aec_dump);
-  apm_->AttachAecDump(std::move(aec_dump));
-  EXPECT_EQ(apm_->kNoError, apm_->ProcessStream(frame_));
-  EXPECT_EQ(apm_->kNoError, apm_->ProcessReverseStream(revframe_));
-  apm_->DetachAecDump();
-
-  // Verify the file has been written.
-  FILE* fid = fopen(filename.c_str(), "r");
-  ASSERT_TRUE(fid != NULL);
-
-  // Clean it up.
-  ASSERT_EQ(0, fclose(fid));
-  ASSERT_EQ(0, remove(filename.c_str()));
-#else
-  // Verify the file has NOT been written.
-  ASSERT_TRUE(fopen(filename.c_str(), "r") == NULL);
-#endif  // WEBRTC_AUDIOPROC_DEBUG_DUMP
-}
-
-// TODO(andrew): expand test to verify output.
-TEST_F(ApmTest, DebugDumpFromFileHandle) {
-  rtc::TaskQueue worker_queue("ApmTest_worker_queue");
-
-  const std::string filename =
-      test::TempFilename(test::OutputPath(), "debug_aec");
-  FILE* fid = fopen(filename.c_str(), "w");
-  ASSERT_TRUE(fid);
-
-#ifdef WEBRTC_AUDIOPROC_DEBUG_DUMP
-  // Stopping without having started should be OK.
-  apm_->DetachAecDump();
-
-  auto aec_dump = AecDumpFactory::Create(fid, -1, &worker_queue);
-  EXPECT_TRUE(aec_dump);
-  apm_->AttachAecDump(std::move(aec_dump));
-  EXPECT_EQ(apm_->kNoError, apm_->ProcessReverseStream(revframe_));
-  EXPECT_EQ(apm_->kNoError, apm_->ProcessStream(frame_));
-  apm_->DetachAecDump();
-
-  // Verify the file has been written.
-  fid = fopen(filename.c_str(), "r");
-  ASSERT_TRUE(fid != NULL);
-
-  // Clean it up.
-  ASSERT_EQ(0, fclose(fid));
-  ASSERT_EQ(0, remove(filename.c_str()));
-#else
-  ASSERT_EQ(0, fclose(fid));
-#endif  // WEBRTC_AUDIOPROC_DEBUG_DUMP
-}
-
-TEST_F(ApmTest, FloatAndIntInterfacesGiveSimilarResults) {
-  audioproc::OutputData ref_data;
-  OpenFileAndReadMessage(ref_filename_, &ref_data);
-
-  Config config;
-  config.Set<ExperimentalAgc>(new ExperimentalAgc(false));
-  std::unique_ptr<AudioProcessing> fapm(AudioProcessing::Create(config));
-  EnableAllComponents();
-  EnableAllAPComponents(fapm.get());
-  for (int i = 0; i < ref_data.test_size(); i++) {
-    printf("Running test %d of %d...\n", i + 1, ref_data.test_size());
-
-    audioproc::Test* test = ref_data.mutable_test(i);
-    // TODO(ajm): Restore downmixing test cases.
-    if (test->num_input_channels() != test->num_output_channels())
-      continue;
-
-    const size_t num_render_channels =
-        static_cast<size_t>(test->num_reverse_channels());
-    const size_t num_input_channels =
-        static_cast<size_t>(test->num_input_channels());
-    const size_t num_output_channels =
-        static_cast<size_t>(test->num_output_channels());
-    const size_t samples_per_channel = static_cast<size_t>(
-        test->sample_rate() * AudioProcessing::kChunkSizeMs / 1000);
-
-    Init(test->sample_rate(), test->sample_rate(), test->sample_rate(),
-         num_input_channels, num_output_channels, num_render_channels, true);
-    Init(fapm.get());
-
-    ChannelBuffer<int16_t> output_cb(samples_per_channel, num_input_channels);
-    ChannelBuffer<int16_t> output_int16(samples_per_channel,
-                                        num_input_channels);
-
-    int analog_level = 127;
-    size_t num_bad_chunks = 0;
-    while (ReadFrame(far_file_, revframe_, revfloat_cb_.get()) &&
-           ReadFrame(near_file_, frame_, float_cb_.get())) {
-      frame_->vad_activity_ = AudioFrame::kVadUnknown;
-
-      EXPECT_NOERR(apm_->ProcessReverseStream(revframe_));
-      EXPECT_NOERR(fapm->AnalyzeReverseStream(
-          revfloat_cb_->channels(),
-          samples_per_channel,
-          test->sample_rate(),
-          LayoutFromChannels(num_render_channels)));
-
-      EXPECT_NOERR(apm_->set_stream_delay_ms(0));
-      EXPECT_NOERR(fapm->set_stream_delay_ms(0));
-      apm_->echo_cancellation()->set_stream_drift_samples(0);
-      fapm->echo_cancellation()->set_stream_drift_samples(0);
-      EXPECT_NOERR(apm_->gain_control()->set_stream_analog_level(analog_level));
-      EXPECT_NOERR(fapm->gain_control()->set_stream_analog_level(analog_level));
-
-      EXPECT_NOERR(apm_->ProcessStream(frame_));
-      Deinterleave(frame_->data(), samples_per_channel, num_output_channels,
-                   output_int16.channels());
-
-      EXPECT_NOERR(fapm->ProcessStream(
-          float_cb_->channels(),
-          samples_per_channel,
-          test->sample_rate(),
-          LayoutFromChannels(num_input_channels),
-          test->sample_rate(),
-          LayoutFromChannels(num_output_channels),
-          float_cb_->channels()));
-      for (size_t j = 0; j < num_output_channels; ++j) {
-        FloatToS16(float_cb_->channels()[j],
-                   samples_per_channel,
-                   output_cb.channels()[j]);
-        float variance = 0;
-        float snr = ComputeSNR(output_int16.channels()[j],
-                               output_cb.channels()[j],
-                               samples_per_channel, &variance);
-
-        const float kVarianceThreshold = 20;
-        const float kSNRThreshold = 20;
-
-        // Skip frames with low energy.
-        if (sqrt(variance) > kVarianceThreshold && snr < kSNRThreshold) {
-          ++num_bad_chunks;
-        }
-      }
-
-      analog_level = fapm->gain_control()->stream_analog_level();
-      EXPECT_EQ(apm_->gain_control()->stream_analog_level(),
-                fapm->gain_control()->stream_analog_level());
-      EXPECT_EQ(apm_->echo_cancellation()->stream_has_echo(),
-                fapm->echo_cancellation()->stream_has_echo());
-      EXPECT_NEAR(apm_->noise_suppression()->speech_probability(),
-                  fapm->noise_suppression()->speech_probability(),
-                  0.01);
-
-      // Reset in case of downmixing.
-      frame_->num_channels_ = static_cast<size_t>(test->num_input_channels());
-    }
-
-#if defined(WEBRTC_AUDIOPROC_FLOAT_PROFILE)
-    const size_t kMaxNumBadChunks = 0;
-#elif defined(WEBRTC_AUDIOPROC_FIXED_PROFILE)
-    // There are a few chunks in the fixed-point profile that give low SNR.
-    // Listening confirmed the difference is acceptable.
-    const size_t kMaxNumBadChunks = 60;
-#endif
-    EXPECT_LE(num_bad_chunks, kMaxNumBadChunks);
-
-    rewind(far_file_);
-    rewind(near_file_);
-  }
-}
-
-// TODO(andrew): Add a test to process a few frames with different combinations
-// of enabled components.
-
-TEST_F(ApmTest, Process) {
-  GOOGLE_PROTOBUF_VERIFY_VERSION;
-  audioproc::OutputData ref_data;
-
-  if (!write_ref_data) {
-    OpenFileAndReadMessage(ref_filename_, &ref_data);
-  } else {
-    // Write the desired tests to the protobuf reference file.
-    for (size_t i = 0; i < arraysize(kChannels); i++) {
-      for (size_t j = 0; j < arraysize(kChannels); j++) {
-        for (size_t l = 0; l < arraysize(kProcessSampleRates); l++) {
-          audioproc::Test* test = ref_data.add_test();
-          test->set_num_reverse_channels(kChannels[i]);
-          test->set_num_input_channels(kChannels[j]);
-          test->set_num_output_channels(kChannels[j]);
-          test->set_sample_rate(kProcessSampleRates[l]);
-          test->set_use_aec_extended_filter(false);
-        }
-      }
-    }
-#if defined(WEBRTC_AUDIOPROC_FLOAT_PROFILE)
-    // To test the extended filter mode.
-    audioproc::Test* test = ref_data.add_test();
-    test->set_num_reverse_channels(2);
-    test->set_num_input_channels(2);
-    test->set_num_output_channels(2);
-    test->set_sample_rate(AudioProcessing::kSampleRate32kHz);
-    test->set_use_aec_extended_filter(true);
-#endif
-  }
-
-  for (int i = 0; i < ref_data.test_size(); i++) {
-    printf("Running test %d of %d...\n", i + 1, ref_data.test_size());
-
-    audioproc::Test* test = ref_data.mutable_test(i);
-    // TODO(ajm): We no longer allow different input and output channels. Skip
-    // these tests for now, but they should be removed from the set.
-    if (test->num_input_channels() != test->num_output_channels())
-      continue;
-
-    Config config;
-    config.Set<ExperimentalAgc>(new ExperimentalAgc(false));
-    config.Set<ExtendedFilter>(
-        new ExtendedFilter(test->use_aec_extended_filter()));
-    apm_.reset(AudioProcessing::Create(config));
-
-    EnableAllComponents();
-
-    Init(test->sample_rate(),
-         test->sample_rate(),
-         test->sample_rate(),
-         static_cast<size_t>(test->num_input_channels()),
-         static_cast<size_t>(test->num_output_channels()),
-         static_cast<size_t>(test->num_reverse_channels()),
-         true);
-
-    int frame_count = 0;
-    int has_echo_count = 0;
-    int has_voice_count = 0;
-    int is_saturated_count = 0;
-    int analog_level = 127;
-    int analog_level_average = 0;
-    int max_output_average = 0;
-    float ns_speech_prob_average = 0.0f;
-#if defined(WEBRTC_AUDIOPROC_FLOAT_PROFILE)
-  int stats_index = 0;
-#endif
-
-    while (ReadFrame(far_file_, revframe_) && ReadFrame(near_file_, frame_)) {
-      EXPECT_EQ(apm_->kNoError, apm_->ProcessReverseStream(revframe_));
-
-      frame_->vad_activity_ = AudioFrame::kVadUnknown;
-
-      EXPECT_EQ(apm_->kNoError, apm_->set_stream_delay_ms(0));
-      apm_->echo_cancellation()->set_stream_drift_samples(0);
-      EXPECT_EQ(apm_->kNoError,
-          apm_->gain_control()->set_stream_analog_level(analog_level));
-
-      EXPECT_EQ(apm_->kNoError, apm_->ProcessStream(frame_));
-
-      // Ensure the frame was downmixed properly.
-      EXPECT_EQ(static_cast<size_t>(test->num_output_channels()),
-                frame_->num_channels_);
-
-      max_output_average += MaxAudioFrame(*frame_);
-
-      if (apm_->echo_cancellation()->stream_has_echo()) {
-        has_echo_count++;
-      }
-
-      analog_level = apm_->gain_control()->stream_analog_level();
-      analog_level_average += analog_level;
-      if (apm_->gain_control()->stream_is_saturated()) {
-        is_saturated_count++;
-      }
-      if (apm_->voice_detection()->stream_has_voice()) {
-        has_voice_count++;
-        EXPECT_EQ(AudioFrame::kVadActive, frame_->vad_activity_);
-      } else {
-        EXPECT_EQ(AudioFrame::kVadPassive, frame_->vad_activity_);
-      }
-
-      ns_speech_prob_average += apm_->noise_suppression()->speech_probability();
-
-      size_t frame_size = frame_->samples_per_channel_ * frame_->num_channels_;
-      size_t write_count = fwrite(frame_->data(),
-                                  sizeof(int16_t),
-                                  frame_size,
-                                  out_file_);
-      ASSERT_EQ(frame_size, write_count);
-
-      // Reset in case of downmixing.
-      frame_->num_channels_ = static_cast<size_t>(test->num_input_channels());
-      frame_count++;
-
-#if defined(WEBRTC_AUDIOPROC_FLOAT_PROFILE)
-      const int kStatsAggregationFrameNum = 100;  // 1 second.
-      if (frame_count % kStatsAggregationFrameNum == 0) {
-        // Get echo metrics.
-        EchoCancellation::Metrics echo_metrics;
-        EXPECT_EQ(apm_->kNoError,
-                  apm_->echo_cancellation()->GetMetrics(&echo_metrics));
-
-        // Get delay metrics.
-        int median = 0;
-        int std = 0;
-        float fraction_poor_delays = 0;
-        EXPECT_EQ(apm_->kNoError,
-                  apm_->echo_cancellation()->GetDelayMetrics(
-                      &median, &std, &fraction_poor_delays));
-
-        // Get RMS.
-        int rms_level = apm_->level_estimator()->RMS();
-        EXPECT_LE(0, rms_level);
-        EXPECT_GE(127, rms_level);
-
-        if (!write_ref_data) {
-          const audioproc::Test::EchoMetrics& reference =
-              test->echo_metrics(stats_index);
-          TestStats(echo_metrics.residual_echo_return_loss,
-                    reference.residual_echo_return_loss());
-          TestStats(echo_metrics.echo_return_loss,
-                    reference.echo_return_loss());
-          TestStats(echo_metrics.echo_return_loss_enhancement,
-                    reference.echo_return_loss_enhancement());
-          TestStats(echo_metrics.a_nlp,
-                    reference.a_nlp());
-          EXPECT_EQ(echo_metrics.divergent_filter_fraction,
-                    reference.divergent_filter_fraction());
-
-          const audioproc::Test::DelayMetrics& reference_delay =
-              test->delay_metrics(stats_index);
-          EXPECT_EQ(reference_delay.median(), median);
-          EXPECT_EQ(reference_delay.std(), std);
-          EXPECT_EQ(reference_delay.fraction_poor_delays(),
-                    fraction_poor_delays);
-
-          EXPECT_EQ(test->rms_level(stats_index), rms_level);
-
-          ++stats_index;
-        } else {
-          audioproc::Test::EchoMetrics* message =
-              test->add_echo_metrics();
-          WriteStatsMessage(echo_metrics.residual_echo_return_loss,
-                            message->mutable_residual_echo_return_loss());
-          WriteStatsMessage(echo_metrics.echo_return_loss,
-                            message->mutable_echo_return_loss());
-          WriteStatsMessage(echo_metrics.echo_return_loss_enhancement,
-                            message->mutable_echo_return_loss_enhancement());
-          WriteStatsMessage(echo_metrics.a_nlp,
-                            message->mutable_a_nlp());
-          message->set_divergent_filter_fraction(
-              echo_metrics.divergent_filter_fraction);
-
-          audioproc::Test::DelayMetrics* message_delay =
-              test->add_delay_metrics();
-          message_delay->set_median(median);
-          message_delay->set_std(std);
-          message_delay->set_fraction_poor_delays(fraction_poor_delays);
-
-          test->add_rms_level(rms_level);
-        }
-      }
-#endif  // defined(WEBRTC_AUDIOPROC_FLOAT_PROFILE).
-    }
-    max_output_average /= frame_count;
-    analog_level_average /= frame_count;
-    ns_speech_prob_average /= frame_count;
-
-    if (!write_ref_data) {
-      const int kIntNear = 1;
-      // When running the test on a N7 we get a {2, 6} difference of
-      // |has_voice_count| and |max_output_average| is up to 18 higher.
-      // All numbers being consistently higher on N7 compare to ref_data.
-      // TODO(bjornv): If we start getting more of these offsets on Android we
-      // should consider a different approach. Either using one slack for all,
-      // or generate a separate android reference.
-#if defined(WEBRTC_ANDROID)
-      const int kHasVoiceCountOffset = 3;
-      const int kHasVoiceCountNear = 4;
-      const int kMaxOutputAverageOffset = 9;
-      const int kMaxOutputAverageNear = 9;
-#else
-      const int kHasVoiceCountOffset = 0;
-      const int kHasVoiceCountNear = kIntNear;
-      const int kMaxOutputAverageOffset = 0;
-      const int kMaxOutputAverageNear = kIntNear;
-#endif
-      EXPECT_NEAR(test->has_echo_count(), has_echo_count, kIntNear);
-      EXPECT_NEAR(test->has_voice_count(),
-                  has_voice_count - kHasVoiceCountOffset,
-                  kHasVoiceCountNear);
-      EXPECT_NEAR(test->is_saturated_count(), is_saturated_count, kIntNear);
-
-      EXPECT_NEAR(test->analog_level_average(), analog_level_average, kIntNear);
-      EXPECT_NEAR(test->max_output_average(),
-                  max_output_average - kMaxOutputAverageOffset,
-                  kMaxOutputAverageNear);
-#if defined(WEBRTC_AUDIOPROC_FLOAT_PROFILE)
-      const double kFloatNear = 0.0005;
-      EXPECT_NEAR(test->ns_speech_probability_average(),
-                  ns_speech_prob_average,
-                  kFloatNear);
-#endif
-    } else {
-      test->set_has_echo_count(has_echo_count);
-      test->set_has_voice_count(has_voice_count);
-      test->set_is_saturated_count(is_saturated_count);
-
-      test->set_analog_level_average(analog_level_average);
-      test->set_max_output_average(max_output_average);
-
-#if defined(WEBRTC_AUDIOPROC_FLOAT_PROFILE)
-      EXPECT_LE(0.0f, ns_speech_prob_average);
-      EXPECT_GE(1.0f, ns_speech_prob_average);
-      test->set_ns_speech_probability_average(ns_speech_prob_average);
-#endif
-    }
-
-    rewind(far_file_);
-    rewind(near_file_);
-  }
-
-  if (write_ref_data) {
-    OpenFileAndWriteMessage(ref_filename_, ref_data);
-  }
-}
-
-TEST_F(ApmTest, NoErrorsWithKeyboardChannel) {
-  struct ChannelFormat {
-    AudioProcessing::ChannelLayout in_layout;
-    AudioProcessing::ChannelLayout out_layout;
-  };
-  ChannelFormat cf[] = {
-    {AudioProcessing::kMonoAndKeyboard, AudioProcessing::kMono},
-    {AudioProcessing::kStereoAndKeyboard, AudioProcessing::kMono},
-    {AudioProcessing::kStereoAndKeyboard, AudioProcessing::kStereo},
-  };
-
-  std::unique_ptr<AudioProcessing> ap(AudioProcessing::Create());
-  // Enable one component just to ensure some processing takes place.
-  ap->noise_suppression()->Enable(true);
-  for (size_t i = 0; i < arraysize(cf); ++i) {
-    const int in_rate = 44100;
-    const int out_rate = 48000;
-    ChannelBuffer<float> in_cb(SamplesFromRate(in_rate),
-                               TotalChannelsFromLayout(cf[i].in_layout));
-    ChannelBuffer<float> out_cb(SamplesFromRate(out_rate),
-                                ChannelsFromLayout(cf[i].out_layout));
-
-    // Run over a few chunks.
-    for (int j = 0; j < 10; ++j) {
-      EXPECT_NOERR(ap->ProcessStream(
-          in_cb.channels(),
-          in_cb.num_frames(),
-          in_rate,
-          cf[i].in_layout,
-          out_rate,
-          cf[i].out_layout,
-          out_cb.channels()));
-    }
-  }
-}
-
-// Compares the reference and test arrays over a region around the expected
-// delay. Finds the highest SNR in that region and adds the variance and squared
-// error results to the supplied accumulators.
-void UpdateBestSNR(const float* ref,
-                   const float* test,
-                   size_t length,
-                   int expected_delay,
-                   double* variance_acc,
-                   double* sq_error_acc) {
-  double best_snr = std::numeric_limits<double>::min();
-  double best_variance = 0;
-  double best_sq_error = 0;
-  // Search over a region of eight samples around the expected delay.
-  for (int delay = std::max(expected_delay - 4, 0); delay <= expected_delay + 4;
-       ++delay) {
-    double sq_error = 0;
-    double variance = 0;
-    for (size_t i = 0; i < length - delay; ++i) {
-      double error = test[i + delay] - ref[i];
-      sq_error += error * error;
-      variance += ref[i] * ref[i];
-    }
-
-    if (sq_error == 0) {
-      *variance_acc += variance;
-      return;
-    }
-    double snr = variance / sq_error;
-    if (snr > best_snr) {
-      best_snr = snr;
-      best_variance = variance;
-      best_sq_error = sq_error;
-    }
-  }
-
-  *variance_acc += best_variance;
-  *sq_error_acc += best_sq_error;
-}
-
-// Used to test a multitude of sample rate and channel combinations. It works
-// by first producing a set of reference files (in SetUpTestCase) that are
-// assumed to be correct, as the used parameters are verified by other tests
-// in this collection. Primarily the reference files are all produced at
-// "native" rates which do not involve any resampling.
-
-// Each test pass produces an output file with a particular format. The output
-// is matched against the reference file closest to its internal processing
-// format. If necessary the output is resampled back to its process format.
-// Due to the resampling distortion, we don't expect identical results, but
-// enforce SNR thresholds which vary depending on the format. 0 is a special
-// case SNR which corresponds to inf, or zero error.
-typedef std::tr1::tuple<int, int, int, int, double, double>
-    AudioProcessingTestData;
-class AudioProcessingTest
-    : public testing::TestWithParam<AudioProcessingTestData> {
- public:
-  AudioProcessingTest()
-      : input_rate_(std::tr1::get<0>(GetParam())),
-        output_rate_(std::tr1::get<1>(GetParam())),
-        reverse_input_rate_(std::tr1::get<2>(GetParam())),
-        reverse_output_rate_(std::tr1::get<3>(GetParam())),
-        expected_snr_(std::tr1::get<4>(GetParam())),
-        expected_reverse_snr_(std::tr1::get<5>(GetParam())) {}
-
-  virtual ~AudioProcessingTest() {}
-
-  static void SetUpTestCase() {
-    // Create all needed output reference files.
-    const int kNativeRates[] = {8000, 16000, 32000, 48000};
-    const size_t kNumChannels[] = {1, 2};
-    for (size_t i = 0; i < arraysize(kNativeRates); ++i) {
-      for (size_t j = 0; j < arraysize(kNumChannels); ++j) {
-        for (size_t k = 0; k < arraysize(kNumChannels); ++k) {
-          // The reference files always have matching input and output channels.
-          ProcessFormat(kNativeRates[i], kNativeRates[i], kNativeRates[i],
-                        kNativeRates[i], kNumChannels[j], kNumChannels[j],
-                        kNumChannels[k], kNumChannels[k], "ref");
-        }
-      }
-    }
-  }
-
-  static void TearDownTestCase() {
-    ClearTempFiles();
-  }
-
-  // Runs a process pass on files with the given parameters and dumps the output
-  // to a file specified with |output_file_prefix|. Both forward and reverse
-  // output streams are dumped.
-  static void ProcessFormat(int input_rate,
-                            int output_rate,
-                            int reverse_input_rate,
-                            int reverse_output_rate,
-                            size_t num_input_channels,
-                            size_t num_output_channels,
-                            size_t num_reverse_input_channels,
-                            size_t num_reverse_output_channels,
-                            const std::string& output_file_prefix) {
-    Config config;
-    config.Set<ExperimentalAgc>(new ExperimentalAgc(false));
-    std::unique_ptr<AudioProcessing> ap(AudioProcessing::Create(config));
-    EnableAllAPComponents(ap.get());
-
-    ProcessingConfig processing_config = {
-        {{input_rate, num_input_channels},
-         {output_rate, num_output_channels},
-         {reverse_input_rate, num_reverse_input_channels},
-         {reverse_output_rate, num_reverse_output_channels}}};
-    ap->Initialize(processing_config);
-
-    FILE* far_file =
-        fopen(ResourceFilePath("far", reverse_input_rate).c_str(), "rb");
-    FILE* near_file = fopen(ResourceFilePath("near", input_rate).c_str(), "rb");
-    FILE* out_file =
-        fopen(OutputFilePath(output_file_prefix, input_rate, output_rate,
-                             reverse_input_rate, reverse_output_rate,
-                             num_input_channels, num_output_channels,
-                             num_reverse_input_channels,
-                             num_reverse_output_channels, kForward).c_str(),
-              "wb");
-    FILE* rev_out_file =
-        fopen(OutputFilePath(output_file_prefix, input_rate, output_rate,
-                             reverse_input_rate, reverse_output_rate,
-                             num_input_channels, num_output_channels,
-                             num_reverse_input_channels,
-                             num_reverse_output_channels, kReverse).c_str(),
-              "wb");
-    ASSERT_TRUE(far_file != NULL);
-    ASSERT_TRUE(near_file != NULL);
-    ASSERT_TRUE(out_file != NULL);
-    ASSERT_TRUE(rev_out_file != NULL);
-
-    ChannelBuffer<float> fwd_cb(SamplesFromRate(input_rate),
-                                num_input_channels);
-    ChannelBuffer<float> rev_cb(SamplesFromRate(reverse_input_rate),
-                                num_reverse_input_channels);
-    ChannelBuffer<float> out_cb(SamplesFromRate(output_rate),
-                                num_output_channels);
-    ChannelBuffer<float> rev_out_cb(SamplesFromRate(reverse_output_rate),
-                                    num_reverse_output_channels);
-
-    // Temporary buffers.
-    const int max_length =
-        2 * std::max(std::max(out_cb.num_frames(), rev_out_cb.num_frames()),
-                     std::max(fwd_cb.num_frames(), rev_cb.num_frames()));
-    std::unique_ptr<float[]> float_data(new float[max_length]);
-    std::unique_ptr<int16_t[]> int_data(new int16_t[max_length]);
-
-    int analog_level = 127;
-    while (ReadChunk(far_file, int_data.get(), float_data.get(), &rev_cb) &&
-           ReadChunk(near_file, int_data.get(), float_data.get(), &fwd_cb)) {
-      EXPECT_NOERR(ap->ProcessReverseStream(
-          rev_cb.channels(), processing_config.reverse_input_stream(),
-          processing_config.reverse_output_stream(), rev_out_cb.channels()));
-
-      EXPECT_NOERR(ap->set_stream_delay_ms(0));
-      ap->echo_cancellation()->set_stream_drift_samples(0);
-      EXPECT_NOERR(ap->gain_control()->set_stream_analog_level(analog_level));
-
-      EXPECT_NOERR(ap->ProcessStream(
-          fwd_cb.channels(),
-          fwd_cb.num_frames(),
-          input_rate,
-          LayoutFromChannels(num_input_channels),
-          output_rate,
-          LayoutFromChannels(num_output_channels),
-          out_cb.channels()));
-
-      // Dump forward output to file.
-      Interleave(out_cb.channels(), out_cb.num_frames(), out_cb.num_channels(),
-                 float_data.get());
-      size_t out_length = out_cb.num_channels() * out_cb.num_frames();
-
-      ASSERT_EQ(out_length,
-                fwrite(float_data.get(), sizeof(float_data[0]),
-                       out_length, out_file));
-
-      // Dump reverse output to file.
-      Interleave(rev_out_cb.channels(), rev_out_cb.num_frames(),
-                 rev_out_cb.num_channels(), float_data.get());
-      size_t rev_out_length =
-          rev_out_cb.num_channels() * rev_out_cb.num_frames();
-
-      ASSERT_EQ(rev_out_length,
-                fwrite(float_data.get(), sizeof(float_data[0]), rev_out_length,
-                       rev_out_file));
-
-      analog_level = ap->gain_control()->stream_analog_level();
-    }
-    fclose(far_file);
-    fclose(near_file);
-    fclose(out_file);
-    fclose(rev_out_file);
-  }
-
- protected:
-  int input_rate_;
-  int output_rate_;
-  int reverse_input_rate_;
-  int reverse_output_rate_;
-  double expected_snr_;
-  double expected_reverse_snr_;
-};
-
-TEST_P(AudioProcessingTest, Formats) {
-  struct ChannelFormat {
-    int num_input;
-    int num_output;
-    int num_reverse_input;
-    int num_reverse_output;
-  };
-  ChannelFormat cf[] = {
-      {1, 1, 1, 1},
-      {1, 1, 2, 1},
-      {2, 1, 1, 1},
-      {2, 1, 2, 1},
-      {2, 2, 1, 1},
-      {2, 2, 2, 2},
-  };
-
-  for (size_t i = 0; i < arraysize(cf); ++i) {
-    ProcessFormat(input_rate_, output_rate_, reverse_input_rate_,
-                  reverse_output_rate_, cf[i].num_input, cf[i].num_output,
-                  cf[i].num_reverse_input, cf[i].num_reverse_output, "out");
-
-    // Verify output for both directions.
-    std::vector<StreamDirection> stream_directions;
-    stream_directions.push_back(kForward);
-    stream_directions.push_back(kReverse);
-    for (StreamDirection file_direction : stream_directions) {
-      const int in_rate = file_direction ? reverse_input_rate_ : input_rate_;
-      const int out_rate = file_direction ? reverse_output_rate_ : output_rate_;
-      const int out_num =
-          file_direction ? cf[i].num_reverse_output : cf[i].num_output;
-      const double expected_snr =
-          file_direction ? expected_reverse_snr_ : expected_snr_;
-
-      const int min_ref_rate = std::min(in_rate, out_rate);
-      int ref_rate;
-
-      if (min_ref_rate > 32000) {
-        ref_rate = 48000;
-      } else if (min_ref_rate > 16000) {
-        ref_rate = 32000;
-      } else if (min_ref_rate > 8000) {
-        ref_rate = 16000;
-      } else {
-        ref_rate = 8000;
-      }
-#ifdef WEBRTC_ARCH_ARM_FAMILY
-      if (file_direction == kForward) {
-        ref_rate = std::min(ref_rate, 32000);
-      }
-#endif
-      FILE* out_file = fopen(
-          OutputFilePath("out", input_rate_, output_rate_, reverse_input_rate_,
-                         reverse_output_rate_, cf[i].num_input,
-                         cf[i].num_output, cf[i].num_reverse_input,
-                         cf[i].num_reverse_output, file_direction).c_str(),
-          "rb");
-      // The reference files always have matching input and output channels.
-      FILE* ref_file = fopen(
-          OutputFilePath("ref", ref_rate, ref_rate, ref_rate, ref_rate,
-                         cf[i].num_output, cf[i].num_output,
-                         cf[i].num_reverse_output, cf[i].num_reverse_output,
-                         file_direction).c_str(),
-          "rb");
-      ASSERT_TRUE(out_file != NULL);
-      ASSERT_TRUE(ref_file != NULL);
-
-      const size_t ref_length = SamplesFromRate(ref_rate) * out_num;
-      const size_t out_length = SamplesFromRate(out_rate) * out_num;
-      // Data from the reference file.
-      std::unique_ptr<float[]> ref_data(new float[ref_length]);
-      // Data from the output file.
-      std::unique_ptr<float[]> out_data(new float[out_length]);
-      // Data from the resampled output, in case the reference and output rates
-      // don't match.
-      std::unique_ptr<float[]> cmp_data(new float[ref_length]);
-
-      PushResampler<float> resampler;
-      resampler.InitializeIfNeeded(out_rate, ref_rate, out_num);
-
-      // Compute the resampling delay of the output relative to the reference,
-      // to find the region over which we should search for the best SNR.
-      float expected_delay_sec = 0;
-      if (in_rate != ref_rate) {
-        // Input resampling delay.
-        expected_delay_sec +=
-            PushSincResampler::AlgorithmicDelaySeconds(in_rate);
-      }
-      if (out_rate != ref_rate) {
-        // Output resampling delay.
-        expected_delay_sec +=
-            PushSincResampler::AlgorithmicDelaySeconds(ref_rate);
-        // Delay of converting the output back to its processing rate for
-        // testing.
-        expected_delay_sec +=
-            PushSincResampler::AlgorithmicDelaySeconds(out_rate);
-      }
-      int expected_delay =
-          floor(expected_delay_sec * ref_rate + 0.5f) * out_num;
-
-      double variance = 0;
-      double sq_error = 0;
-      while (fread(out_data.get(), sizeof(out_data[0]), out_length, out_file) &&
-             fread(ref_data.get(), sizeof(ref_data[0]), ref_length, ref_file)) {
-        float* out_ptr = out_data.get();
-        if (out_rate != ref_rate) {
-          // Resample the output back to its internal processing rate if
-          // necssary.
-          ASSERT_EQ(ref_length,
-                    static_cast<size_t>(resampler.Resample(
-                        out_ptr, out_length, cmp_data.get(), ref_length)));
-          out_ptr = cmp_data.get();
-        }
-
-        // Update the |sq_error| and |variance| accumulators with the highest
-        // SNR of reference vs output.
-        UpdateBestSNR(ref_data.get(), out_ptr, ref_length, expected_delay,
-                      &variance, &sq_error);
-      }
-
-      std::cout << "(" << input_rate_ << ", " << output_rate_ << ", "
-                << reverse_input_rate_ << ", " << reverse_output_rate_ << ", "
-                << cf[i].num_input << ", " << cf[i].num_output << ", "
-                << cf[i].num_reverse_input << ", " << cf[i].num_reverse_output
-                << ", " << file_direction << "): ";
-      if (sq_error > 0) {
-        double snr = 10 * log10(variance / sq_error);
-        EXPECT_GE(snr, expected_snr);
-        EXPECT_NE(0, expected_snr);
-        std::cout << "SNR=" << snr << " dB" << std::endl;
-      } else {
-        std::cout << "SNR=inf dB" << std::endl;
-      }
-
-      fclose(out_file);
-      fclose(ref_file);
-    }
-  }
-}
-
-#if defined(WEBRTC_AUDIOPROC_FLOAT_PROFILE)
-INSTANTIATE_TEST_CASE_P(
-    CommonFormats,
-    AudioProcessingTest,
-    testing::Values(std::tr1::make_tuple(48000, 48000, 48000, 48000, 0, 0),
-                    std::tr1::make_tuple(48000, 48000, 32000, 48000, 40, 30),
-                    std::tr1::make_tuple(48000, 48000, 16000, 48000, 40, 20),
-                    std::tr1::make_tuple(48000, 44100, 48000, 44100, 20, 20),
-                    std::tr1::make_tuple(48000, 44100, 32000, 44100, 20, 15),
-                    std::tr1::make_tuple(48000, 44100, 16000, 44100, 20, 15),
-                    std::tr1::make_tuple(48000, 32000, 48000, 32000, 30, 35),
-                    std::tr1::make_tuple(48000, 32000, 32000, 32000, 30, 0),
-                    std::tr1::make_tuple(48000, 32000, 16000, 32000, 30, 20),
-                    std::tr1::make_tuple(48000, 16000, 48000, 16000, 25, 20),
-                    std::tr1::make_tuple(48000, 16000, 32000, 16000, 25, 20),
-                    std::tr1::make_tuple(48000, 16000, 16000, 16000, 25, 0),
-
-                    std::tr1::make_tuple(44100, 48000, 48000, 48000, 30, 0),
-                    std::tr1::make_tuple(44100, 48000, 32000, 48000, 30, 30),
-                    std::tr1::make_tuple(44100, 48000, 16000, 48000, 30, 20),
-                    std::tr1::make_tuple(44100, 44100, 48000, 44100, 20, 20),
-                    std::tr1::make_tuple(44100, 44100, 32000, 44100, 20, 15),
-                    std::tr1::make_tuple(44100, 44100, 16000, 44100, 20, 15),
-                    std::tr1::make_tuple(44100, 32000, 48000, 32000, 30, 35),
-                    std::tr1::make_tuple(44100, 32000, 32000, 32000, 30, 0),
-                    std::tr1::make_tuple(44100, 32000, 16000, 32000, 30, 20),
-                    std::tr1::make_tuple(44100, 16000, 48000, 16000, 25, 20),
-                    std::tr1::make_tuple(44100, 16000, 32000, 16000, 25, 20),
-                    std::tr1::make_tuple(44100, 16000, 16000, 16000, 25, 0),
-
-                    std::tr1::make_tuple(32000, 48000, 48000, 48000, 30, 0),
-                    std::tr1::make_tuple(32000, 48000, 32000, 48000, 35, 30),
-                    std::tr1::make_tuple(32000, 48000, 16000, 48000, 30, 20),
-                    std::tr1::make_tuple(32000, 44100, 48000, 44100, 20, 20),
-                    std::tr1::make_tuple(32000, 44100, 32000, 44100, 20, 15),
-                    std::tr1::make_tuple(32000, 44100, 16000, 44100, 20, 15),
-                    std::tr1::make_tuple(32000, 32000, 48000, 32000, 40, 35),
-                    std::tr1::make_tuple(32000, 32000, 32000, 32000, 0, 0),
-                    std::tr1::make_tuple(32000, 32000, 16000, 32000, 40, 20),
-                    std::tr1::make_tuple(32000, 16000, 48000, 16000, 25, 20),
-                    std::tr1::make_tuple(32000, 16000, 32000, 16000, 25, 20),
-                    std::tr1::make_tuple(32000, 16000, 16000, 16000, 25, 0),
-
-                    std::tr1::make_tuple(16000, 48000, 48000, 48000, 25, 0),
-                    std::tr1::make_tuple(16000, 48000, 32000, 48000, 25, 30),
-                    std::tr1::make_tuple(16000, 48000, 16000, 48000, 25, 20),
-                    std::tr1::make_tuple(16000, 44100, 48000, 44100, 15, 20),
-                    std::tr1::make_tuple(16000, 44100, 32000, 44100, 15, 15),
-                    std::tr1::make_tuple(16000, 44100, 16000, 44100, 15, 15),
-                    std::tr1::make_tuple(16000, 32000, 48000, 32000, 25, 35),
-                    std::tr1::make_tuple(16000, 32000, 32000, 32000, 25, 0),
-                    std::tr1::make_tuple(16000, 32000, 16000, 32000, 25, 20),
-                    std::tr1::make_tuple(16000, 16000, 48000, 16000, 40, 20),
-                    std::tr1::make_tuple(16000, 16000, 32000, 16000, 40, 20),
-                    std::tr1::make_tuple(16000, 16000, 16000, 16000, 0, 0)));
-
-#elif defined(WEBRTC_AUDIOPROC_FIXED_PROFILE)
-INSTANTIATE_TEST_CASE_P(
-    CommonFormats,
-    AudioProcessingTest,
-    testing::Values(std::tr1::make_tuple(48000, 48000, 48000, 48000, 20, 0),
-                    std::tr1::make_tuple(48000, 48000, 32000, 48000, 20, 30),
-                    std::tr1::make_tuple(48000, 48000, 16000, 48000, 20, 20),
-                    std::tr1::make_tuple(48000, 44100, 48000, 44100, 15, 20),
-                    std::tr1::make_tuple(48000, 44100, 32000, 44100, 15, 15),
-                    std::tr1::make_tuple(48000, 44100, 16000, 44100, 15, 15),
-                    std::tr1::make_tuple(48000, 32000, 48000, 32000, 20, 35),
-                    std::tr1::make_tuple(48000, 32000, 32000, 32000, 20, 0),
-                    std::tr1::make_tuple(48000, 32000, 16000, 32000, 20, 20),
-                    std::tr1::make_tuple(48000, 16000, 48000, 16000, 20, 20),
-                    std::tr1::make_tuple(48000, 16000, 32000, 16000, 20, 20),
-                    std::tr1::make_tuple(48000, 16000, 16000, 16000, 20, 0),
-
-                    std::tr1::make_tuple(44100, 48000, 48000, 48000, 15, 0),
-                    std::tr1::make_tuple(44100, 48000, 32000, 48000, 15, 30),
-                    std::tr1::make_tuple(44100, 48000, 16000, 48000, 15, 20),
-                    std::tr1::make_tuple(44100, 44100, 48000, 44100, 15, 20),
-                    std::tr1::make_tuple(44100, 44100, 32000, 44100, 15, 15),
-                    std::tr1::make_tuple(44100, 44100, 16000, 44100, 15, 15),
-                    std::tr1::make_tuple(44100, 32000, 48000, 32000, 20, 35),
-                    std::tr1::make_tuple(44100, 32000, 32000, 32000, 20, 0),
-                    std::tr1::make_tuple(44100, 32000, 16000, 32000, 20, 20),
-                    std::tr1::make_tuple(44100, 16000, 48000, 16000, 20, 20),
-                    std::tr1::make_tuple(44100, 16000, 32000, 16000, 20, 20),
-                    std::tr1::make_tuple(44100, 16000, 16000, 16000, 20, 0),
-
-                    std::tr1::make_tuple(32000, 48000, 48000, 48000, 35, 0),
-                    std::tr1::make_tuple(32000, 48000, 32000, 48000, 65, 30),
-                    std::tr1::make_tuple(32000, 48000, 16000, 48000, 40, 20),
-                    std::tr1::make_tuple(32000, 44100, 48000, 44100, 20, 20),
-                    std::tr1::make_tuple(32000, 44100, 32000, 44100, 20, 15),
-                    std::tr1::make_tuple(32000, 44100, 16000, 44100, 20, 15),
-                    std::tr1::make_tuple(32000, 32000, 48000, 32000, 35, 35),
-                    std::tr1::make_tuple(32000, 32000, 32000, 32000, 0, 0),
-                    std::tr1::make_tuple(32000, 32000, 16000, 32000, 40, 20),
-                    std::tr1::make_tuple(32000, 16000, 48000, 16000, 20, 20),
-                    std::tr1::make_tuple(32000, 16000, 32000, 16000, 20, 20),
-                    std::tr1::make_tuple(32000, 16000, 16000, 16000, 20, 0),
-
-                    std::tr1::make_tuple(16000, 48000, 48000, 48000, 25, 0),
-                    std::tr1::make_tuple(16000, 48000, 32000, 48000, 25, 30),
-                    std::tr1::make_tuple(16000, 48000, 16000, 48000, 25, 20),
-                    std::tr1::make_tuple(16000, 44100, 48000, 44100, 15, 20),
-                    std::tr1::make_tuple(16000, 44100, 32000, 44100, 15, 15),
-                    std::tr1::make_tuple(16000, 44100, 16000, 44100, 15, 15),
-                    std::tr1::make_tuple(16000, 32000, 48000, 32000, 25, 35),
-                    std::tr1::make_tuple(16000, 32000, 32000, 32000, 25, 0),
-                    std::tr1::make_tuple(16000, 32000, 16000, 32000, 25, 20),
-                    std::tr1::make_tuple(16000, 16000, 48000, 16000, 35, 20),
-                    std::tr1::make_tuple(16000, 16000, 32000, 16000, 35, 20),
-                    std::tr1::make_tuple(16000, 16000, 16000, 16000, 0, 0)));
-#endif
-
-}  // namespace
-
-TEST(ApmConfiguration, DefaultBehavior) {
-  // Verify that the level controller is default off, it can be activated using
-  // the config, and that the default initial level is maintained after the
-  // config has been applied.
-  std::unique_ptr<AudioProcessingImpl> apm(
-      new rtc::RefCountedObject<AudioProcessingImpl>(webrtc::Config()));
-  AudioProcessing::Config config;
-  EXPECT_FALSE(apm->config_.level_controller.enabled);
-  // TODO(peah): Add test for the existence of the level controller object once
-  // that is created only when that is specified in the config.
-  // TODO(peah): Remove the testing for
-  // apm->capture_nonlocked_.level_controller_enabled once the value in config_
-  // is instead used to activate the level controller.
-  EXPECT_FALSE(apm->capture_nonlocked_.level_controller_enabled);
-  EXPECT_NEAR(kTargetLcPeakLeveldBFS,
-              apm->config_.level_controller.initial_peak_level_dbfs,
-              std::numeric_limits<float>::epsilon());
-  config.level_controller.enabled = true;
-  apm->ApplyConfig(config);
-  EXPECT_TRUE(apm->config_.level_controller.enabled);
-  // TODO(peah): Add test for the existence of the level controller object once
-  // that is created only when the that is specified in the config.
-  // TODO(peah): Remove the testing for
-  // apm->capture_nonlocked_.level_controller_enabled once the value in config_
-  // is instead used to activate the level controller.
-  EXPECT_TRUE(apm->capture_nonlocked_.level_controller_enabled);
-  EXPECT_NEAR(kTargetLcPeakLeveldBFS,
-              apm->config_.level_controller.initial_peak_level_dbfs,
-              std::numeric_limits<float>::epsilon());
-}
-
-TEST(ApmConfiguration, ValidConfigBehavior) {
-  // Verify that the initial level can be specified and is retained after the
-  // config has been applied.
-  std::unique_ptr<AudioProcessingImpl> apm(
-      new rtc::RefCountedObject<AudioProcessingImpl>(webrtc::Config()));
-  AudioProcessing::Config config;
-  config.level_controller.initial_peak_level_dbfs = -50.f;
-  apm->ApplyConfig(config);
-  EXPECT_FALSE(apm->config_.level_controller.enabled);
-  // TODO(peah): Add test for the existence of the level controller object once
-  // that is created only when the that is specified in the config.
-  // TODO(peah): Remove the testing for
-  // apm->capture_nonlocked_.level_controller_enabled once the value in config_
-  // is instead used to activate the level controller.
-  EXPECT_FALSE(apm->capture_nonlocked_.level_controller_enabled);
-  EXPECT_NEAR(-50.f, apm->config_.level_controller.initial_peak_level_dbfs,
-              std::numeric_limits<float>::epsilon());
-}
-
-TEST(ApmConfiguration, InValidConfigBehavior) {
-  // Verify that the config is properly reset when nonproper values are applied
-  // for the initial level.
-
-  // Verify that the config is properly reset when the specified initial peak
-  // level is too low.
-  std::unique_ptr<AudioProcessingImpl> apm(
-      new rtc::RefCountedObject<AudioProcessingImpl>(webrtc::Config()));
-  AudioProcessing::Config config;
-  config.level_controller.enabled = true;
-  config.level_controller.initial_peak_level_dbfs = -101.f;
-  apm->ApplyConfig(config);
-  EXPECT_FALSE(apm->config_.level_controller.enabled);
-  // TODO(peah): Add test for the existence of the level controller object once
-  // that is created only when the that is specified in the config.
-  // TODO(peah): Remove the testing for
-  // apm->capture_nonlocked_.level_controller_enabled once the value in config_
-  // is instead used to activate the level controller.
-  EXPECT_FALSE(apm->capture_nonlocked_.level_controller_enabled);
-  EXPECT_NEAR(kTargetLcPeakLeveldBFS,
-              apm->config_.level_controller.initial_peak_level_dbfs,
-              std::numeric_limits<float>::epsilon());
-
-  // Verify that the config is properly reset when the specified initial peak
-  // level is too high.
-  apm.reset(new rtc::RefCountedObject<AudioProcessingImpl>(webrtc::Config()));
-  config = AudioProcessing::Config();
-  config.level_controller.enabled = true;
-  config.level_controller.initial_peak_level_dbfs = 1.f;
-  apm->ApplyConfig(config);
-  EXPECT_FALSE(apm->config_.level_controller.enabled);
-  // TODO(peah): Add test for the existence of the level controller object once
-  // that is created only when that is specified in the config.
-  // TODO(peah): Remove the testing for
-  // apm->capture_nonlocked_.level_controller_enabled once the value in config_
-  // is instead used to activate the level controller.
-  EXPECT_FALSE(apm->capture_nonlocked_.level_controller_enabled);
-  EXPECT_NEAR(kTargetLcPeakLeveldBFS,
-              apm->config_.level_controller.initial_peak_level_dbfs,
-              std::numeric_limits<float>::epsilon());
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/beamformer/array_util.cc b/modules/audio_processing/beamformer/array_util.cc
deleted file mode 100644
index e42a98e..0000000
--- a/modules/audio_processing/beamformer/array_util.cc
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- *  Copyright (c) 2015 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_processing/beamformer/array_util.h"
-
-#include <algorithm>
-#include <limits>
-
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-namespace {
-
-const float kMaxDotProduct = 1e-6f;
-
-}  // namespace
-
-float GetMinimumSpacing(const std::vector<Point>& array_geometry) {
-  RTC_CHECK_GT(array_geometry.size(), 1);
-  float mic_spacing = std::numeric_limits<float>::max();
-  for (size_t i = 0; i < (array_geometry.size() - 1); ++i) {
-    for (size_t j = i + 1; j < array_geometry.size(); ++j) {
-      mic_spacing =
-          std::min(mic_spacing, Distance(array_geometry[i], array_geometry[j]));
-    }
-  }
-  return mic_spacing;
-}
-
-Point PairDirection(const Point& a, const Point& b) {
-  return {b.x() - a.x(), b.y() - a.y(), b.z() - a.z()};
-}
-
-float DotProduct(const Point& a, const Point& b) {
-  return a.x() * b.x() + a.y() * b.y() + a.z() * b.z();
-}
-
-Point CrossProduct(const Point& a, const Point& b) {
-  return {a.y() * b.z() - a.z() * b.y(), a.z() * b.x() - a.x() * b.z(),
-          a.x() * b.y() - a.y() * b.x()};
-}
-
-bool AreParallel(const Point& a, const Point& b) {
-  Point cross_product = CrossProduct(a, b);
-  return DotProduct(cross_product, cross_product) < kMaxDotProduct;
-}
-
-bool ArePerpendicular(const Point& a, const Point& b) {
-  return std::abs(DotProduct(a, b)) < kMaxDotProduct;
-}
-
-rtc::Optional<Point> GetDirectionIfLinear(
-    const std::vector<Point>& array_geometry) {
-  RTC_DCHECK_GT(array_geometry.size(), 1);
-  const Point first_pair_direction =
-      PairDirection(array_geometry[0], array_geometry[1]);
-  for (size_t i = 2u; i < array_geometry.size(); ++i) {
-    const Point pair_direction =
-        PairDirection(array_geometry[i - 1], array_geometry[i]);
-    if (!AreParallel(first_pair_direction, pair_direction)) {
-      return rtc::Optional<Point>();
-    }
-  }
-  return rtc::Optional<Point>(first_pair_direction);
-}
-
-rtc::Optional<Point> GetNormalIfPlanar(
-    const std::vector<Point>& array_geometry) {
-  RTC_DCHECK_GT(array_geometry.size(), 1);
-  const Point first_pair_direction =
-      PairDirection(array_geometry[0], array_geometry[1]);
-  Point pair_direction(0.f, 0.f, 0.f);
-  size_t i = 2u;
-  bool is_linear = true;
-  for (; i < array_geometry.size() && is_linear; ++i) {
-    pair_direction = PairDirection(array_geometry[i - 1], array_geometry[i]);
-    if (!AreParallel(first_pair_direction, pair_direction)) {
-      is_linear = false;
-    }
-  }
-  if (is_linear) {
-    return rtc::Optional<Point>();
-  }
-  const Point normal_direction =
-      CrossProduct(first_pair_direction, pair_direction);
-  for (; i < array_geometry.size(); ++i) {
-    pair_direction = PairDirection(array_geometry[i - 1], array_geometry[i]);
-    if (!ArePerpendicular(normal_direction, pair_direction)) {
-      return rtc::Optional<Point>();
-    }
-  }
-  return rtc::Optional<Point>(normal_direction);
-}
-
-rtc::Optional<Point> GetArrayNormalIfExists(
-    const std::vector<Point>& array_geometry) {
-  const rtc::Optional<Point> direction = GetDirectionIfLinear(array_geometry);
-  if (direction) {
-    return rtc::Optional<Point>(Point(direction->y(), -direction->x(), 0.f));
-  }
-  const rtc::Optional<Point> normal = GetNormalIfPlanar(array_geometry);
-  if (normal && normal->z() < kMaxDotProduct) {
-    return normal;
-  }
-  return rtc::Optional<Point>();
-}
-
-Point AzimuthToPoint(float azimuth) {
-  return Point(std::cos(azimuth), std::sin(azimuth), 0.f);
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/beamformer/array_util.h b/modules/audio_processing/beamformer/array_util.h
deleted file mode 100644
index aa18e71..0000000
--- a/modules/audio_processing/beamformer/array_util.h
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- *  Copyright (c) 2015 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_PROCESSING_BEAMFORMER_ARRAY_UTIL_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_BEAMFORMER_ARRAY_UTIL_H_
-
-#include <cmath>
-#include <vector>
-
-#include "webrtc/api/optional.h"
-
-namespace webrtc {
-
-// Coordinates in meters. The convention used is:
-// x: the horizontal dimension, with positive to the right from the camera's
-//    perspective.
-// y: the depth dimension, with positive forward from the camera's
-//    perspective.
-// z: the vertical dimension, with positive upwards.
-template<typename T>
-struct CartesianPoint {
-  CartesianPoint() {
-    c[0] = 0;
-    c[1] = 0;
-    c[2] = 0;
-  }
-  CartesianPoint(T x, T y, T z) {
-    c[0] = x;
-    c[1] = y;
-    c[2] = z;
-  }
-  T x() const { return c[0]; }
-  T y() const { return c[1]; }
-  T z() const { return c[2]; }
-  T c[3];
-};
-
-using Point = CartesianPoint<float>;
-
-// Calculates the direction from a to b.
-Point PairDirection(const Point& a, const Point& b);
-
-float DotProduct(const Point& a, const Point& b);
-Point CrossProduct(const Point& a, const Point& b);
-
-bool AreParallel(const Point& a, const Point& b);
-bool ArePerpendicular(const Point& a, const Point& b);
-
-// Returns the minimum distance between any two Points in the given
-// |array_geometry|.
-float GetMinimumSpacing(const std::vector<Point>& array_geometry);
-
-// If the given array geometry is linear it returns the direction without
-// normalizing.
-rtc::Optional<Point> GetDirectionIfLinear(
-    const std::vector<Point>& array_geometry);
-
-// If the given array geometry is planar it returns the normal without
-// normalizing.
-rtc::Optional<Point> GetNormalIfPlanar(
-    const std::vector<Point>& array_geometry);
-
-// Returns the normal of an array if it has one and it is in the xy-plane.
-rtc::Optional<Point> GetArrayNormalIfExists(
-    const std::vector<Point>& array_geometry);
-
-// The resulting Point will be in the xy-plane.
-Point AzimuthToPoint(float azimuth);
-
-template<typename T>
-float Distance(CartesianPoint<T> a, CartesianPoint<T> b) {
-  return std::sqrt((a.x() - b.x()) * (a.x() - b.x()) +
-                   (a.y() - b.y()) * (a.y() - b.y()) +
-                   (a.z() - b.z()) * (a.z() - b.z()));
-}
-
-// The convention used:
-// azimuth: zero is to the right from the camera's perspective, with positive
-//          angles in radians counter-clockwise.
-// elevation: zero is horizontal, with positive angles in radians upwards.
-// radius: distance from the camera in meters.
-template <typename T>
-struct SphericalPoint {
-  SphericalPoint(T azimuth, T elevation, T radius) {
-    s[0] = azimuth;
-    s[1] = elevation;
-    s[2] = radius;
-  }
-  T azimuth() const { return s[0]; }
-  T elevation() const { return s[1]; }
-  T distance() const { return s[2]; }
-  T s[3];
-};
-
-using SphericalPointf = SphericalPoint<float>;
-
-// Helper functions to transform degrees to radians and the inverse.
-template <typename T>
-T DegreesToRadians(T angle_degrees) {
-  return M_PI * angle_degrees / 180;
-}
-
-template <typename T>
-T RadiansToDegrees(T angle_radians) {
-  return 180 * angle_radians / M_PI;
-}
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_BEAMFORMER_ARRAY_UTIL_H_
diff --git a/modules/audio_processing/beamformer/array_util_unittest.cc b/modules/audio_processing/beamformer/array_util_unittest.cc
deleted file mode 100644
index 0ec9e7b..0000000
--- a/modules/audio_processing/beamformer/array_util_unittest.cc
+++ /dev/null
@@ -1,185 +0,0 @@
-/*
- *  Copyright (c) 2015 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.
- */
-
-// MSVC++ requires this to be set before any other includes to get M_PI.
-#define _USE_MATH_DEFINES
-
-#include "webrtc/modules/audio_processing/beamformer/array_util.h"
-
-#include <math.h>
-#include <vector>
-
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-bool operator==(const Point& lhs, const Point& rhs) {
-  return lhs.x() == rhs.x() && lhs.y() == rhs.y() && lhs.z() == rhs.z();
-}
-
-TEST(ArrayUtilTest, PairDirection) {
-  EXPECT_EQ(Point(1.f, 2.f, 3.f),
-            PairDirection(Point(0.f, 0.f, 0.f), Point(1.f, 2.f, 3.f)));
-  EXPECT_EQ(Point(-1.f, -2.f, -3.f),
-            PairDirection(Point(1.f, 2.f, 3.f), Point(0.f, 0.f, 0.f)));
-  EXPECT_EQ(Point(0.f, 0.f, 0.f),
-            PairDirection(Point(1.f, 0.f, 0.f), Point(1.f, 0.f, 0.f)));
-  EXPECT_EQ(Point(-1.f, 2.f, 0.f),
-            PairDirection(Point(1.f, 0.f, 0.f), Point(0.f, 2.f, 0.f)));
-  EXPECT_EQ(Point(-4.f, 4.f, -4.f),
-            PairDirection(Point(1.f, -2.f, 3.f), Point(-3.f, 2.f, -1.f)));
-}
-
-TEST(ArrayUtilTest, DotProduct) {
-  EXPECT_FLOAT_EQ(0.f, DotProduct(Point(0.f, 0.f, 0.f), Point(1.f, 2.f, 3.f)));
-  EXPECT_FLOAT_EQ(0.f, DotProduct(Point(1.f, 0.f, 2.f), Point(0.f, 3.f, 0.f)));
-  EXPECT_FLOAT_EQ(0.f, DotProduct(Point(1.f, 1.f, 0.f), Point(1.f, -1.f, 0.f)));
-  EXPECT_FLOAT_EQ(2.f, DotProduct(Point(1.f, 0.f, 0.f), Point(2.f, 0.f, 0.f)));
-  EXPECT_FLOAT_EQ(-6.f,
-                  DotProduct(Point(-2.f, 0.f, 0.f), Point(3.f, 0.f, 0.f)));
-  EXPECT_FLOAT_EQ(-10.f,
-                  DotProduct(Point(1.f, -2.f, 3.f), Point(-3.f, 2.f, -1.f)));
-}
-
-TEST(ArrayUtilTest, CrossProduct) {
-  EXPECT_EQ(Point(0.f, 0.f, 0.f),
-            CrossProduct(Point(0.f, 0.f, 0.f), Point(1.f, 2.f, 3.f)));
-  EXPECT_EQ(Point(0.f, 0.f, 1.f),
-            CrossProduct(Point(1.f, 0.f, 0.f), Point(0.f, 1.f, 0.f)));
-  EXPECT_EQ(Point(1.f, 0.f, 0.f),
-            CrossProduct(Point(0.f, 1.f, 0.f), Point(0.f, 0.f, 1.f)));
-  EXPECT_EQ(Point(0.f, -1.f, 0.f),
-            CrossProduct(Point(1.f, 0.f, 0.f), Point(0.f, 0.f, 1.f)));
-  EXPECT_EQ(Point(-4.f, -8.f, -4.f),
-            CrossProduct(Point(1.f, -2.f, 3.f), Point(-3.f, 2.f, -1.f)));
-}
-
-TEST(ArrayUtilTest, AreParallel) {
-  EXPECT_TRUE(AreParallel(Point(0.f, 0.f, 0.f), Point(1.f, 2.f, 3.f)));
-  EXPECT_FALSE(AreParallel(Point(1.f, 0.f, 2.f), Point(0.f, 3.f, 0.f)));
-  EXPECT_FALSE(AreParallel(Point(1.f, 2.f, 0.f), Point(1.f, -0.5f, 0.f)));
-  EXPECT_FALSE(AreParallel(Point(1.f, -2.f, 3.f), Point(-3.f, 2.f, -1.f)));
-  EXPECT_TRUE(AreParallel(Point(1.f, 0.f, 0.f), Point(2.f, 0.f, 0.f)));
-  EXPECT_TRUE(AreParallel(Point(1.f, 2.f, 3.f), Point(-2.f, -4.f, -6.f)));
-}
-
-TEST(ArrayUtilTest, ArePerpendicular) {
-  EXPECT_TRUE(ArePerpendicular(Point(0.f, 0.f, 0.f), Point(1.f, 2.f, 3.f)));
-  EXPECT_TRUE(ArePerpendicular(Point(1.f, 0.f, 2.f), Point(0.f, 3.f, 0.f)));
-  EXPECT_TRUE(ArePerpendicular(Point(1.f, 2.f, 0.f), Point(1.f, -0.5f, 0.f)));
-  EXPECT_FALSE(ArePerpendicular(Point(1.f, -2.f, 3.f), Point(-3.f, 2.f, -1.f)));
-  EXPECT_FALSE(ArePerpendicular(Point(1.f, 0.f, 0.f), Point(2.f, 0.f, 0.f)));
-  EXPECT_FALSE(ArePerpendicular(Point(1.f, 2.f, 3.f), Point(-2.f, -4.f, -6.f)));
-}
-
-TEST(ArrayUtilTest, GetMinimumSpacing) {
-  std::vector<Point> geometry;
-  geometry.push_back(Point(0.f, 0.f, 0.f));
-  geometry.push_back(Point(0.1f, 0.f, 0.f));
-  EXPECT_FLOAT_EQ(0.1f, GetMinimumSpacing(geometry));
-  geometry.push_back(Point(0.f, 0.05f, 0.f));
-  EXPECT_FLOAT_EQ(0.05f, GetMinimumSpacing(geometry));
-  geometry.push_back(Point(0.f, 0.f, 0.02f));
-  EXPECT_FLOAT_EQ(0.02f, GetMinimumSpacing(geometry));
-  geometry.push_back(Point(-0.003f, -0.004f, 0.02f));
-  EXPECT_FLOAT_EQ(0.005f, GetMinimumSpacing(geometry));
-}
-
-TEST(ArrayUtilTest, GetDirectionIfLinear) {
-  std::vector<Point> geometry;
-  geometry.push_back(Point(0.f, 0.f, 0.f));
-  geometry.push_back(Point(0.1f, 0.f, 0.f));
-  EXPECT_TRUE(
-      AreParallel(Point(1.f, 0.f, 0.f), *GetDirectionIfLinear(geometry)));
-  geometry.push_back(Point(0.15f, 0.f, 0.f));
-  EXPECT_TRUE(
-      AreParallel(Point(1.f, 0.f, 0.f), *GetDirectionIfLinear(geometry)));
-  geometry.push_back(Point(-0.2f, 0.f, 0.f));
-  EXPECT_TRUE(
-      AreParallel(Point(1.f, 0.f, 0.f), *GetDirectionIfLinear(geometry)));
-  geometry.push_back(Point(0.05f, 0.f, 0.f));
-  EXPECT_TRUE(
-      AreParallel(Point(1.f, 0.f, 0.f), *GetDirectionIfLinear(geometry)));
-  geometry.push_back(Point(0.1f, 0.1f, 0.f));
-  EXPECT_FALSE(GetDirectionIfLinear(geometry));
-  geometry.push_back(Point(0.f, 0.f, -0.2f));
-  EXPECT_FALSE(GetDirectionIfLinear(geometry));
-}
-
-TEST(ArrayUtilTest, GetNormalIfPlanar) {
-  std::vector<Point> geometry;
-  geometry.push_back(Point(0.f, 0.f, 0.f));
-  geometry.push_back(Point(0.1f, 0.f, 0.f));
-  EXPECT_FALSE(GetNormalIfPlanar(geometry));
-  geometry.push_back(Point(0.15f, 0.f, 0.f));
-  EXPECT_FALSE(GetNormalIfPlanar(geometry));
-  geometry.push_back(Point(0.1f, 0.2f, 0.f));
-  EXPECT_TRUE(AreParallel(Point(0.f, 0.f, 1.f), *GetNormalIfPlanar(geometry)));
-  geometry.push_back(Point(0.f, -0.15f, 0.f));
-  EXPECT_TRUE(AreParallel(Point(0.f, 0.f, 1.f), *GetNormalIfPlanar(geometry)));
-  geometry.push_back(Point(0.f, 0.1f, 0.2f));
-  EXPECT_FALSE(GetNormalIfPlanar(geometry));
-  geometry.push_back(Point(0.f, 0.f, -0.15f));
-  EXPECT_FALSE(GetNormalIfPlanar(geometry));
-  geometry.push_back(Point(0.1f, 0.2f, 0.f));
-  EXPECT_FALSE(GetNormalIfPlanar(geometry));
-}
-
-TEST(ArrayUtilTest, GetArrayNormalIfExists) {
-  std::vector<Point> geometry;
-  geometry.push_back(Point(0.f, 0.f, 0.f));
-  geometry.push_back(Point(0.1f, 0.f, 0.f));
-  EXPECT_TRUE(
-      AreParallel(Point(0.f, 1.f, 0.f), *GetArrayNormalIfExists(geometry)));
-  geometry.push_back(Point(0.15f, 0.f, 0.f));
-  EXPECT_TRUE(
-      AreParallel(Point(0.f, 1.f, 0.f), *GetArrayNormalIfExists(geometry)));
-  geometry.push_back(Point(0.1f, 0.f, 0.2f));
-  EXPECT_TRUE(
-      AreParallel(Point(0.f, 1.f, 0.f), *GetArrayNormalIfExists(geometry)));
-  geometry.push_back(Point(0.f, 0.f, -0.1f));
-  EXPECT_TRUE(
-      AreParallel(Point(0.f, 1.f, 0.f), *GetArrayNormalIfExists(geometry)));
-  geometry.push_back(Point(0.1f, 0.2f, 0.3f));
-  EXPECT_FALSE(GetArrayNormalIfExists(geometry));
-  geometry.push_back(Point(0.f, -0.1f, 0.f));
-  EXPECT_FALSE(GetArrayNormalIfExists(geometry));
-  geometry.push_back(Point(1.f, 0.f, -0.2f));
-  EXPECT_FALSE(GetArrayNormalIfExists(geometry));
-}
-
-TEST(ArrayUtilTest, DegreesToRadians) {
-  EXPECT_FLOAT_EQ(0.f, DegreesToRadians(0.f));
-  EXPECT_FLOAT_EQ(static_cast<float>(M_PI) / 6.f, DegreesToRadians(30.f));
-  EXPECT_FLOAT_EQ(-static_cast<float>(M_PI) / 4.f, DegreesToRadians(-45.f));
-  EXPECT_FLOAT_EQ(static_cast<float>(M_PI) / 3.f, DegreesToRadians(60.f));
-  EXPECT_FLOAT_EQ(-static_cast<float>(M_PI) / 2.f, DegreesToRadians(-90.f));
-  EXPECT_FLOAT_EQ(2.f * static_cast<float>(M_PI) / 3.f,
-                  DegreesToRadians(120.f));
-  EXPECT_FLOAT_EQ(-3.f * static_cast<float>(M_PI) / 4.f,
-                  DegreesToRadians(-135.f));
-  EXPECT_FLOAT_EQ(5.f * static_cast<float>(M_PI) / 6.f,
-                  DegreesToRadians(150.f));
-  EXPECT_FLOAT_EQ(-static_cast<float>(M_PI), DegreesToRadians(-180.f));
-}
-
-TEST(ArrayUtilTest, RadiansToDegrees) {
-  EXPECT_FLOAT_EQ(0.f, RadiansToDegrees(0.f));
-  EXPECT_FLOAT_EQ(30.f, RadiansToDegrees(M_PI / 6.f));
-  EXPECT_FLOAT_EQ(-45.f, RadiansToDegrees(-M_PI / 4.f));
-  EXPECT_FLOAT_EQ(60.f, RadiansToDegrees(M_PI / 3.f));
-  EXPECT_FLOAT_EQ(-90.f, RadiansToDegrees(-M_PI / 2.f));
-  EXPECT_FLOAT_EQ(120.f, RadiansToDegrees(2.f * M_PI / 3.f));
-  EXPECT_FLOAT_EQ(-135.f, RadiansToDegrees(-3.f * M_PI / 4.f));
-  EXPECT_FLOAT_EQ(150.f, RadiansToDegrees(5.f * M_PI / 6.f));
-  EXPECT_FLOAT_EQ(-180.f, RadiansToDegrees(-M_PI));
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/beamformer/complex_matrix.h b/modules/audio_processing/beamformer/complex_matrix.h
deleted file mode 100644
index 1080f18..0000000
--- a/modules/audio_processing/beamformer/complex_matrix.h
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- *  Copyright (c) 2014 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_PROCESSING_BEAMFORMER_COMPLEX_MATRIX_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_BEAMFORMER_COMPLEX_MATRIX_H_
-
-#include <complex>
-
-#include "webrtc/modules/audio_processing/beamformer/matrix.h"
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-
-using std::complex;
-
-// An extension of Matrix for operations that only work on a complex type.
-template <typename T>
-class ComplexMatrix : public Matrix<complex<T> > {
- public:
-  ComplexMatrix() : Matrix<complex<T> >() {}
-
-  ComplexMatrix(size_t num_rows, size_t num_columns)
-      : Matrix<complex<T> >(num_rows, num_columns) {}
-
-  ComplexMatrix(const complex<T>* data, size_t num_rows, size_t num_columns)
-      : Matrix<complex<T> >(data, num_rows, num_columns) {}
-
-  // Complex Matrix operations.
-  ComplexMatrix& PointwiseConjugate() {
-    complex<T>* const data = this->data();
-    size_t size = this->num_rows() * this->num_columns();
-    for (size_t i = 0; i < size; ++i) {
-      data[i] = conj(data[i]);
-    }
-
-    return *this;
-  }
-
-  ComplexMatrix& PointwiseConjugate(const ComplexMatrix& operand) {
-    this->CopyFrom(operand);
-    return PointwiseConjugate();
-  }
-
-  ComplexMatrix& ConjugateTranspose() {
-    this->CopyDataToScratch();
-    size_t num_rows = this->num_rows();
-    this->SetNumRows(this->num_columns());
-    this->SetNumColumns(num_rows);
-    this->Resize();
-    return ConjugateTranspose(this->scratch_elements());
-  }
-
-  ComplexMatrix& ConjugateTranspose(const ComplexMatrix& operand) {
-    RTC_CHECK_EQ(operand.num_rows(), this->num_columns());
-    RTC_CHECK_EQ(operand.num_columns(), this->num_rows());
-    return ConjugateTranspose(operand.elements());
-  }
-
-  ComplexMatrix& ZeroImag() {
-    complex<T>* const data = this->data();
-    size_t size = this->num_rows() * this->num_columns();
-    for (size_t i = 0; i < size; ++i) {
-      data[i] = complex<T>(data[i].real(), 0);
-    }
-
-    return *this;
-  }
-
-  ComplexMatrix& ZeroImag(const ComplexMatrix& operand) {
-    this->CopyFrom(operand);
-    return ZeroImag();
-  }
-
- private:
-  ComplexMatrix& ConjugateTranspose(const complex<T>* const* src) {
-    complex<T>* const* elements = this->elements();
-    for (size_t i = 0; i < this->num_rows(); ++i) {
-      for (size_t j = 0; j < this->num_columns(); ++j) {
-        elements[i][j] = conj(src[j][i]);
-      }
-    }
-
-    return *this;
-  }
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_BEAMFORMER_COMPLEX_MATRIX_H_
diff --git a/modules/audio_processing/beamformer/complex_matrix_unittest.cc b/modules/audio_processing/beamformer/complex_matrix_unittest.cc
deleted file mode 100644
index 100d2e6..0000000
--- a/modules/audio_processing/beamformer/complex_matrix_unittest.cc
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- *  Copyright (c) 2014 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_processing/beamformer/complex_matrix.h"
-#include "webrtc/modules/audio_processing/beamformer/matrix_test_helpers.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-TEST(ComplexMatrixTest, TestPointwiseConjugate) {
-  const int kNumRows = 2;
-  const int kNumCols = 4;
-
-  const complex<float> kValuesInitial[kNumRows][kNumCols] = {
-      {complex<float>(1.1f, 1.1f), complex<float>(2.2f, -2.2f),
-       complex<float>(3.3f, 3.3f), complex<float>(4.4f, -4.4f)},
-      {complex<float>(5.5f, 5.5f), complex<float>(6.6f, -6.6f),
-       complex<float>(7.7f, 7.7f), complex<float>(8.8f, -8.8f)}};
-
-  const complex<float> kValuesExpected[kNumRows][kNumCols] = {
-      {complex<float>(1.1f, -1.1f), complex<float>(2.2f, 2.2f),
-       complex<float>(3.3f, -3.3f), complex<float>(4.4f, 4.4f)},
-      {complex<float>(5.5f, -5.5f), complex<float>(6.6f, 6.6f),
-       complex<float>(7.7f, -7.7f), complex<float>(8.8f, 8.8f)}};
-
-  ComplexMatrix<float> initial_mat(*kValuesInitial, kNumRows, kNumCols);
-  ComplexMatrix<float> expected_result(*kValuesExpected, kNumRows, kNumCols);
-  ComplexMatrix<float> actual_result(kNumRows, kNumCols);
-
-  actual_result.PointwiseConjugate(initial_mat);
-  MatrixTestHelpers::ValidateMatrixEqualityComplexFloat(expected_result,
-                                                        actual_result);
-
-  initial_mat.PointwiseConjugate();
-  MatrixTestHelpers::ValidateMatrixEqualityComplexFloat(initial_mat,
-                                                        actual_result);
-}
-
-TEST(ComplexMatrixTest, TestConjugateTranspose) {
-  const int kNumInitialRows = 2;
-  const int kNumInitialCols = 4;
-  const int kNumResultRows = 4;
-  const int kNumResultCols = 2;
-
-  const complex<float> kValuesInitial[kNumInitialRows][kNumInitialCols] = {
-      {complex<float>(1.1f, 1.1f), complex<float>(2.2f, 2.2f),
-       complex<float>(3.3f, 3.3f), complex<float>(4.4f, 4.4f)},
-      {complex<float>(5.5f, 5.5f), complex<float>(6.6f, 6.6f),
-       complex<float>(7.7f, 7.7f), complex<float>(8.8f, 8.8f)}};
-
-  const complex<float> kValuesExpected[kNumResultRows][kNumResultCols] = {
-      {complex<float>(1.1f, -1.1f), complex<float>(5.5f, -5.5f)},
-      {complex<float>(2.2f, -2.2f), complex<float>(6.6f, -6.6f)},
-      {complex<float>(3.3f, -3.3f), complex<float>(7.7f, -7.7f)},
-      {complex<float>(4.4f, -4.4f), complex<float>(8.8f, -8.8f)}};
-
-  ComplexMatrix<float> initial_mat(
-      *kValuesInitial, kNumInitialRows, kNumInitialCols);
-  ComplexMatrix<float> expected_result(
-      *kValuesExpected, kNumResultRows, kNumResultCols);
-  ComplexMatrix<float> actual_result(kNumResultRows, kNumResultCols);
-
-  actual_result.ConjugateTranspose(initial_mat);
-  MatrixTestHelpers::ValidateMatrixEqualityComplexFloat(expected_result,
-                                                        actual_result);
-
-  initial_mat.ConjugateTranspose();
-  MatrixTestHelpers::ValidateMatrixEqualityComplexFloat(initial_mat,
-                                                        actual_result);
-}
-
-TEST(ComplexMatrixTest, TestZeroImag) {
-  const int kNumRows = 2;
-  const int kNumCols = 2;
-  const complex<float> kValuesInitial[kNumRows][kNumCols] = {
-      {complex<float>(1.1f, 1.1f), complex<float>(2.2f, 2.2f)},
-      {complex<float>(3.3f, 3.3f), complex<float>(4.4f, 4.4f)}};
-  const complex<float> kValuesExpected[kNumRows][kNumCols] = {
-      {complex<float>(1.1f, 0.f), complex<float>(2.2f, 0.f)},
-      {complex<float>(3.3f, 0.f), complex<float>(4.4f, 0.f)}};
-
-  ComplexMatrix<float> initial_mat(*kValuesInitial, kNumRows, kNumCols);
-  ComplexMatrix<float> expected_result(*kValuesExpected, kNumRows, kNumCols);
-  ComplexMatrix<float> actual_result;
-
-  actual_result.ZeroImag(initial_mat);
-  MatrixTestHelpers::ValidateMatrixEqualityComplexFloat(expected_result,
-                                                        actual_result);
-
-  initial_mat.ZeroImag();
-  MatrixTestHelpers::ValidateMatrixEqualityComplexFloat(initial_mat,
-                                                        actual_result);
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/beamformer/covariance_matrix_generator.cc b/modules/audio_processing/beamformer/covariance_matrix_generator.cc
deleted file mode 100644
index ae69073..0000000
--- a/modules/audio_processing/beamformer/covariance_matrix_generator.cc
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- *  Copyright (c) 2014 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.
- */
-
-#define _USE_MATH_DEFINES
-
-#include "webrtc/modules/audio_processing/beamformer/covariance_matrix_generator.h"
-
-#include <cmath>
-
-namespace webrtc {
-namespace {
-
-float BesselJ0(float x) {
-#ifdef WEBRTC_WIN
-  return _j0(x);
-#else
-  return j0(x);
-#endif
-}
-
-// Calculates the Euclidean norm for a row vector.
-float Norm(const ComplexMatrix<float>& x) {
-  RTC_CHECK_EQ(1, x.num_rows());
-  const size_t length = x.num_columns();
-  const complex<float>* elems = x.elements()[0];
-  float result = 0.f;
-  for (size_t i = 0u; i < length; ++i) {
-    result += std::norm(elems[i]);
-  }
-  return std::sqrt(result);
-}
-
-}  // namespace
-
-void CovarianceMatrixGenerator::UniformCovarianceMatrix(
-    float wave_number,
-    const std::vector<Point>& geometry,
-    ComplexMatrix<float>* mat) {
-  RTC_CHECK_EQ(geometry.size(), mat->num_rows());
-  RTC_CHECK_EQ(geometry.size(), mat->num_columns());
-
-  complex<float>* const* mat_els = mat->elements();
-  for (size_t i = 0; i < geometry.size(); ++i) {
-    for (size_t j = 0; j < geometry.size(); ++j) {
-      if (wave_number > 0.f) {
-        mat_els[i][j] =
-            BesselJ0(wave_number * Distance(geometry[i], geometry[j]));
-      } else {
-        mat_els[i][j] = i == j ? 1.f : 0.f;
-      }
-    }
-  }
-}
-
-void CovarianceMatrixGenerator::AngledCovarianceMatrix(
-    float sound_speed,
-    float angle,
-    size_t frequency_bin,
-    size_t fft_size,
-    size_t num_freq_bins,
-    int sample_rate,
-    const std::vector<Point>& geometry,
-    ComplexMatrix<float>* mat) {
-  RTC_CHECK_EQ(geometry.size(), mat->num_rows());
-  RTC_CHECK_EQ(geometry.size(), mat->num_columns());
-
-  ComplexMatrix<float> interf_cov_vector(1, geometry.size());
-  ComplexMatrix<float> interf_cov_vector_transposed(geometry.size(), 1);
-  PhaseAlignmentMasks(frequency_bin,
-                      fft_size,
-                      sample_rate,
-                      sound_speed,
-                      geometry,
-                      angle,
-                      &interf_cov_vector);
-  interf_cov_vector.Scale(1.f / Norm(interf_cov_vector));
-  interf_cov_vector_transposed.Transpose(interf_cov_vector);
-  interf_cov_vector.PointwiseConjugate();
-  mat->Multiply(interf_cov_vector_transposed, interf_cov_vector);
-}
-
-void CovarianceMatrixGenerator::PhaseAlignmentMasks(
-    size_t frequency_bin,
-    size_t fft_size,
-    int sample_rate,
-    float sound_speed,
-    const std::vector<Point>& geometry,
-    float angle,
-    ComplexMatrix<float>* mat) {
-  RTC_CHECK_EQ(1, mat->num_rows());
-  RTC_CHECK_EQ(geometry.size(), mat->num_columns());
-
-  float freq_in_hertz =
-      (static_cast<float>(frequency_bin) / fft_size) * sample_rate;
-
-  complex<float>* const* mat_els = mat->elements();
-  for (size_t c_ix = 0; c_ix < geometry.size(); ++c_ix) {
-    float distance = std::cos(angle) * geometry[c_ix].x() +
-                     std::sin(angle) * geometry[c_ix].y();
-    float phase_shift = -2.f * M_PI * distance * freq_in_hertz / sound_speed;
-
-    // Euler's formula for mat[0][c_ix] = e^(j * phase_shift).
-    mat_els[0][c_ix] = complex<float>(cos(phase_shift), sin(phase_shift));
-  }
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/beamformer/covariance_matrix_generator.h b/modules/audio_processing/beamformer/covariance_matrix_generator.h
deleted file mode 100644
index 5375518..0000000
--- a/modules/audio_processing/beamformer/covariance_matrix_generator.h
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- *  Copyright (c) 2014 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_PROCESSING_BEAMFORMER_COVARIANCE_MATRIX_GENERATOR_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_BEAMFORMER_COVARIANCE_MATRIX_GENERATOR_H_
-
-#include "webrtc/modules/audio_processing/beamformer/complex_matrix.h"
-#include "webrtc/modules/audio_processing/beamformer/array_util.h"
-
-namespace webrtc {
-
-// Helper class for Beamformer in charge of generating covariance matrices. For
-// each function, the passed-in ComplexMatrix is expected to be of size
-// |num_input_channels| x |num_input_channels|.
-class CovarianceMatrixGenerator {
- public:
-  // A uniform covariance matrix with a gap at the target location. WARNING:
-  // The target angle is assumed to be 0.
-  static void UniformCovarianceMatrix(float wave_number,
-                                      const std::vector<Point>& geometry,
-                                      ComplexMatrix<float>* mat);
-
-  // The covariance matrix of a source at the given angle.
-  static void AngledCovarianceMatrix(float sound_speed,
-                                     float angle,
-                                     size_t frequency_bin,
-                                     size_t fft_size,
-                                     size_t num_freq_bins,
-                                     int sample_rate,
-                                     const std::vector<Point>& geometry,
-                                     ComplexMatrix<float>* mat);
-
-  // Calculates phase shifts that, when applied to a multichannel signal and
-  // added together, cause constructive interferernce for sources located at
-  // the given angle.
-  static void PhaseAlignmentMasks(size_t frequency_bin,
-                                  size_t fft_size,
-                                  int sample_rate,
-                                  float sound_speed,
-                                  const std::vector<Point>& geometry,
-                                  float angle,
-                                  ComplexMatrix<float>* mat);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_BEAMFORMER_BF_HELPERS_H_
diff --git a/modules/audio_processing/beamformer/covariance_matrix_generator_unittest.cc b/modules/audio_processing/beamformer/covariance_matrix_generator_unittest.cc
deleted file mode 100644
index 1dd65c1..0000000
--- a/modules/audio_processing/beamformer/covariance_matrix_generator_unittest.cc
+++ /dev/null
@@ -1,230 +0,0 @@
-/*
- *  Copyright (c) 2014 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.
- */
-
-#define _USE_MATH_DEFINES
-
-#include "webrtc/modules/audio_processing/beamformer/covariance_matrix_generator.h"
-
-#include <cmath>
-
-#include "webrtc/modules/audio_processing/beamformer/matrix_test_helpers.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-using std::complex;
-
-TEST(CovarianceMatrixGeneratorTest, TestUniformCovarianceMatrix2Mics) {
-  const float kWaveNumber = 0.5775f;
-  const int kNumberMics = 2;
-  const float kMicSpacing = 0.05f;
-  const float kTolerance = 0.0001f;
-  std::vector<Point> geometry;
-  float first_mic = (kNumberMics - 1) * kMicSpacing / 2.f;
-  for (int i = 0; i < kNumberMics; ++i) {
-    geometry.push_back(Point(i * kMicSpacing - first_mic, 0.f, 0.f));
-  }
-  ComplexMatrix<float> actual_covariance_matrix(kNumberMics, kNumberMics);
-  CovarianceMatrixGenerator::UniformCovarianceMatrix(kWaveNumber,
-                                                     geometry,
-                                                     &actual_covariance_matrix);
-
-  complex<float>* const* actual_els = actual_covariance_matrix.elements();
-
-  EXPECT_NEAR(actual_els[0][0].real(), 1.f, kTolerance);
-  EXPECT_NEAR(actual_els[0][1].real(), 0.9998f, kTolerance);
-  EXPECT_NEAR(actual_els[1][0].real(), 0.9998f, kTolerance);
-  EXPECT_NEAR(actual_els[1][1].real(), 1.f, kTolerance);
-
-  EXPECT_NEAR(actual_els[0][0].imag(), 0.f, kTolerance);
-  EXPECT_NEAR(actual_els[0][1].imag(), 0.f, kTolerance);
-  EXPECT_NEAR(actual_els[1][0].imag(), 0.f, kTolerance);
-  EXPECT_NEAR(actual_els[1][1].imag(), 0.f, kTolerance);
-}
-
-TEST(CovarianceMatrixGeneratorTest, TestUniformCovarianceMatrix3Mics) {
-  const float kWaveNumber = 10.3861f;
-  const int kNumberMics = 3;
-  const float kMicSpacing = 0.04f;
-  const float kTolerance = 0.0001f;
-  std::vector<Point> geometry;
-  float first_mic = (kNumberMics - 1) * kMicSpacing / 2.f;
-  for (int i = 0; i < kNumberMics; ++i) {
-    geometry.push_back(Point(i * kMicSpacing - first_mic, 0.f, 0.f));
-  }
-  ComplexMatrix<float> actual_covariance_matrix(kNumberMics, kNumberMics);
-  CovarianceMatrixGenerator::UniformCovarianceMatrix(kWaveNumber,
-                                                     geometry,
-                                                     &actual_covariance_matrix);
-
-  complex<float>* const* actual_els = actual_covariance_matrix.elements();
-
-  EXPECT_NEAR(actual_els[0][0].real(), 1.f, kTolerance);
-  EXPECT_NEAR(actual_els[0][1].real(), 0.9573f, kTolerance);
-  EXPECT_NEAR(actual_els[0][2].real(), 0.8347f, kTolerance);
-  EXPECT_NEAR(actual_els[1][0].real(), 0.9573f, kTolerance);
-  EXPECT_NEAR(actual_els[1][1].real(), 1.f, kTolerance);
-  EXPECT_NEAR(actual_els[1][2].real(), 0.9573f, kTolerance);
-  EXPECT_NEAR(actual_els[2][0].real(), 0.8347f, kTolerance);
-  EXPECT_NEAR(actual_els[2][1].real(), 0.9573f, kTolerance);
-  EXPECT_NEAR(actual_els[2][2].real(), 1.f, kTolerance);
-
-  EXPECT_NEAR(actual_els[0][0].imag(), 0.f, kTolerance);
-  EXPECT_NEAR(actual_els[0][1].imag(), 0.f, kTolerance);
-  EXPECT_NEAR(actual_els[0][2].imag(), 0.f, kTolerance);
-  EXPECT_NEAR(actual_els[1][0].imag(), 0.f, kTolerance);
-  EXPECT_NEAR(actual_els[1][1].imag(), 0.f, kTolerance);
-  EXPECT_NEAR(actual_els[1][2].imag(), 0.f, kTolerance);
-  EXPECT_NEAR(actual_els[2][0].imag(), 0.f, kTolerance);
-  EXPECT_NEAR(actual_els[2][1].imag(), 0.f, kTolerance);
-  EXPECT_NEAR(actual_els[2][2].imag(), 0.f, kTolerance);
-}
-
-TEST(CovarianceMatrixGeneratorTest, TestUniformCovarianceMatrix3DArray) {
-  const float kWaveNumber = 1.2345f;
-  const int kNumberMics = 4;
-  const float kTolerance = 0.0001f;
-  std::vector<Point> geometry;
-  geometry.push_back(Point(-0.025f, -0.05f, -0.075f));
-  geometry.push_back(Point(0.075f, -0.05f, -0.075f));
-  geometry.push_back(Point(-0.025f, 0.15f, -0.075f));
-  geometry.push_back(Point(-0.025f, -0.05f, 0.225f));
-  ComplexMatrix<float> actual_covariance_matrix(kNumberMics, kNumberMics);
-  CovarianceMatrixGenerator::UniformCovarianceMatrix(kWaveNumber,
-                                                     geometry,
-                                                     &actual_covariance_matrix);
-
-  complex<float>* const* actual_els = actual_covariance_matrix.elements();
-
-  EXPECT_NEAR(actual_els[0][0].real(), 1.f, kTolerance);
-  EXPECT_NEAR(actual_els[0][1].real(), 0.9962f, kTolerance);
-  EXPECT_NEAR(actual_els[0][2].real(), 0.9848f, kTolerance);
-  EXPECT_NEAR(actual_els[0][3].real(), 0.9660f, kTolerance);
-  EXPECT_NEAR(actual_els[1][0].real(), 0.9962f, kTolerance);
-  EXPECT_NEAR(actual_els[1][1].real(), 1.f, kTolerance);
-  EXPECT_NEAR(actual_els[1][2].real(), 0.9810f, kTolerance);
-  EXPECT_NEAR(actual_els[1][3].real(), 0.9623f, kTolerance);
-  EXPECT_NEAR(actual_els[2][0].real(), 0.9848f, kTolerance);
-  EXPECT_NEAR(actual_els[2][1].real(), 0.9810f, kTolerance);
-  EXPECT_NEAR(actual_els[2][2].real(), 1.f, kTolerance);
-  EXPECT_NEAR(actual_els[2][3].real(), 0.9511f, kTolerance);
-  EXPECT_NEAR(actual_els[3][0].real(), 0.9660f, kTolerance);
-  EXPECT_NEAR(actual_els[3][1].real(), 0.9623f, kTolerance);
-  EXPECT_NEAR(actual_els[3][2].real(), 0.9511f, kTolerance);
-  EXPECT_NEAR(actual_els[3][3].real(), 1.f, kTolerance);
-
-  EXPECT_NEAR(actual_els[0][0].imag(), 0.f, kTolerance);
-  EXPECT_NEAR(actual_els[0][1].imag(), 0.f, kTolerance);
-  EXPECT_NEAR(actual_els[0][2].imag(), 0.f, kTolerance);
-  EXPECT_NEAR(actual_els[0][3].imag(), 0.f, kTolerance);
-  EXPECT_NEAR(actual_els[1][0].imag(), 0.f, kTolerance);
-  EXPECT_NEAR(actual_els[1][1].imag(), 0.f, kTolerance);
-  EXPECT_NEAR(actual_els[1][2].imag(), 0.f, kTolerance);
-  EXPECT_NEAR(actual_els[1][3].imag(), 0.f, kTolerance);
-  EXPECT_NEAR(actual_els[2][0].imag(), 0.f, kTolerance);
-  EXPECT_NEAR(actual_els[2][1].imag(), 0.f, kTolerance);
-  EXPECT_NEAR(actual_els[2][2].imag(), 0.f, kTolerance);
-  EXPECT_NEAR(actual_els[2][3].imag(), 0.f, kTolerance);
-  EXPECT_NEAR(actual_els[3][0].imag(), 0.f, kTolerance);
-  EXPECT_NEAR(actual_els[3][1].imag(), 0.f, kTolerance);
-  EXPECT_NEAR(actual_els[3][2].imag(), 0.f, kTolerance);
-  EXPECT_NEAR(actual_els[3][3].imag(), 0.f, kTolerance);
-}
-
-TEST(CovarianceMatrixGeneratorTest, TestAngledCovarianceMatrix2Mics) {
-  const float kSpeedOfSound = 340;
-  const float kAngle = static_cast<float>(M_PI) / 4.f;
-  const float kFrequencyBin = 6;
-  const float kFftSize = 512;
-  const int kNumberFrequencyBins = 257;
-  const int kSampleRate = 16000;
-  const int kNumberMics = 2;
-  const float kMicSpacing = 0.04f;
-  const float kTolerance = 0.0001f;
-  std::vector<Point> geometry;
-  float first_mic = (kNumberMics - 1) * kMicSpacing / 2.f;
-  for (int i = 0; i < kNumberMics; ++i) {
-    geometry.push_back(Point(i * kMicSpacing - first_mic, 0.f, 0.f));
-  }
-  ComplexMatrix<float> actual_covariance_matrix(kNumberMics, kNumberMics);
-  CovarianceMatrixGenerator::AngledCovarianceMatrix(kSpeedOfSound,
-                                                    kAngle,
-                                                    kFrequencyBin,
-                                                    kFftSize,
-                                                    kNumberFrequencyBins,
-                                                    kSampleRate,
-                                                    geometry,
-                                                    &actual_covariance_matrix);
-
-  complex<float>* const* actual_els = actual_covariance_matrix.elements();
-
-  EXPECT_NEAR(actual_els[0][0].real(), 0.5f, kTolerance);
-  EXPECT_NEAR(actual_els[0][1].real(), 0.4976f, kTolerance);
-  EXPECT_NEAR(actual_els[1][0].real(), 0.4976f, kTolerance);
-  EXPECT_NEAR(actual_els[1][1].real(), 0.5f, kTolerance);
-
-  EXPECT_NEAR(actual_els[0][0].imag(), 0.f, kTolerance);
-  EXPECT_NEAR(actual_els[0][1].imag(), 0.0489f, kTolerance);
-  EXPECT_NEAR(actual_els[1][0].imag(), -0.0489f, kTolerance);
-  EXPECT_NEAR(actual_els[1][1].imag(), 0.f, kTolerance);
-}
-
-TEST(CovarianceMatrixGeneratorTest, TestAngledCovarianceMatrix3Mics) {
-  const float kSpeedOfSound = 340;
-  const float kAngle = static_cast<float>(M_PI) / 4.f;
-  const float kFrequencyBin = 9;
-  const float kFftSize = 512;
-  const int kNumberFrequencyBins = 257;
-  const int kSampleRate = 42000;
-  const int kNumberMics = 3;
-  const float kMicSpacing = 0.05f;
-  const float kTolerance = 0.0001f;
-  std::vector<Point> geometry;
-  float first_mic = (kNumberMics - 1) * kMicSpacing / 2.f;
-  for (int i = 0; i < kNumberMics; ++i) {
-    geometry.push_back(Point(i * kMicSpacing - first_mic, 0.f, 0.f));
-  }
-  ComplexMatrix<float> actual_covariance_matrix(kNumberMics, kNumberMics);
-  CovarianceMatrixGenerator::AngledCovarianceMatrix(kSpeedOfSound,
-                                                    kAngle,
-                                                    kFrequencyBin,
-                                                    kFftSize,
-                                                    kNumberFrequencyBins,
-                                                    kSampleRate,
-                                                    geometry,
-                                                    &actual_covariance_matrix);
-
-  complex<float>* const* actual_els = actual_covariance_matrix.elements();
-
-  EXPECT_NEAR(actual_els[0][0].real(), 0.3333f, kTolerance);
-  EXPECT_NEAR(actual_els[0][1].real(), 0.2953f, kTolerance);
-  EXPECT_NEAR(actual_els[0][2].real(), 0.1899f, kTolerance);
-  EXPECT_NEAR(actual_els[1][0].real(), 0.2953f, kTolerance);
-  EXPECT_NEAR(actual_els[1][1].real(), 0.3333f, kTolerance);
-  EXPECT_NEAR(actual_els[1][2].real(), 0.2953f, kTolerance);
-  EXPECT_NEAR(actual_els[2][0].real(), 0.1899f, kTolerance);
-  EXPECT_NEAR(actual_els[2][1].real(), 0.2953f, kTolerance);
-  EXPECT_NEAR(actual_els[2][2].real(), 0.3333f, kTolerance);
-
-  EXPECT_NEAR(actual_els[0][0].imag(), 0.f, kTolerance);
-  EXPECT_NEAR(actual_els[0][1].imag(), 0.1546f, kTolerance);
-  EXPECT_NEAR(actual_els[0][2].imag(), 0.274f, kTolerance);
-  EXPECT_NEAR(actual_els[1][0].imag(), -0.1546f, kTolerance);
-  EXPECT_NEAR(actual_els[1][1].imag(), 0.f, kTolerance);
-  EXPECT_NEAR(actual_els[1][2].imag(), 0.1546f, kTolerance);
-  EXPECT_NEAR(actual_els[2][0].imag(), -0.274f, kTolerance);
-  EXPECT_NEAR(actual_els[2][1].imag(), -0.1546f, kTolerance);
-  EXPECT_NEAR(actual_els[2][2].imag(), 0.f, kTolerance);
-}
-
-// PhaseAlignmentMasks is tested by AngledCovarianceMatrix and by
-// InitBeamformerWeights in BeamformerUnittest.
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/beamformer/matrix.h b/modules/audio_processing/beamformer/matrix.h
deleted file mode 100644
index d0e41ca..0000000
--- a/modules/audio_processing/beamformer/matrix.h
+++ /dev/null
@@ -1,369 +0,0 @@
-/*
- *  Copyright (c) 2014 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_PROCESSING_BEAMFORMER_MATRIX_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_BEAMFORMER_MATRIX_H_
-
-#include <algorithm>
-#include <cstring>
-#include <string>
-#include <vector>
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace {
-
-// Wrappers to get around the compiler warning resulting from the fact that
-// there's no std::sqrt overload for ints. We cast all non-complex types to
-// a double for the sqrt method.
-template <typename T>
-T sqrt_wrapper(T x) {
-  return sqrt(static_cast<double>(x));
-}
-
-template <typename S>
-std::complex<S> sqrt_wrapper(std::complex<S> x) {
-  return sqrt(x);
-}
-} // namespace
-
-namespace webrtc {
-
-// Matrix is a class for doing standard matrix operations on 2 dimensional
-// matrices of any size. Results of matrix operations are stored in the
-// calling object. Function overloads exist for both in-place (the calling
-// object is used as both an operand and the result) and out-of-place (all
-// operands are passed in as parameters) operations. If operand dimensions
-// mismatch, the program crashes. Out-of-place operations change the size of
-// the calling object, if necessary, before operating.
-//
-// 'In-place' operations that inherently change the size of the matrix (eg.
-// Transpose, Multiply on different-sized matrices) must make temporary copies
-// (|scratch_elements_| and |scratch_data_|) of existing data to complete the
-// operations.
-//
-// The data is stored contiguously. Data can be accessed internally as a flat
-// array, |data_|, or as an array of row pointers, |elements_|, but is
-// available to users only as an array of row pointers through |elements()|.
-// Memory for storage is allocated when a matrix is resized only if the new
-// size overflows capacity. Memory needed temporarily for any operations is
-// similarly resized only if the new size overflows capacity.
-//
-// If you pass in storage through the ctor, that storage is copied into the
-// matrix. TODO(claguna): albeit tricky, allow for data to be referenced
-// instead of copied, and owned by the user.
-template <typename T>
-class Matrix {
- public:
-  Matrix() : num_rows_(0), num_columns_(0) {}
-
-  // Allocates space for the elements and initializes all values to zero.
-  Matrix(size_t num_rows, size_t num_columns)
-      : num_rows_(num_rows), num_columns_(num_columns) {
-    Resize();
-    scratch_data_.resize(num_rows_ * num_columns_);
-    scratch_elements_.resize(num_rows_);
-  }
-
-  // Copies |data| into the new Matrix.
-  Matrix(const T* data, size_t num_rows, size_t num_columns)
-      : num_rows_(0), num_columns_(0) {
-    CopyFrom(data, num_rows, num_columns);
-    scratch_data_.resize(num_rows_ * num_columns_);
-    scratch_elements_.resize(num_rows_);
-  }
-
-  virtual ~Matrix() {}
-
-  // Deep copy an existing matrix.
-  void CopyFrom(const Matrix& other) {
-    CopyFrom(&other.data_[0], other.num_rows_, other.num_columns_);
-  }
-
-  // Copy |data| into the Matrix. The current data is lost.
-  void CopyFrom(const T* const data, size_t num_rows, size_t num_columns) {
-    Resize(num_rows, num_columns);
-    memcpy(&data_[0], data, num_rows_ * num_columns_ * sizeof(data_[0]));
-  }
-
-  Matrix& CopyFromColumn(const T* const* src,
-                         size_t column_index,
-                         size_t num_rows) {
-    Resize(1, num_rows);
-    for (size_t i = 0; i < num_columns_; ++i) {
-      data_[i] = src[i][column_index];
-    }
-
-    return *this;
-  }
-
-  void Resize(size_t num_rows, size_t num_columns) {
-    if (num_rows != num_rows_ || num_columns != num_columns_) {
-      num_rows_ = num_rows;
-      num_columns_ = num_columns;
-      Resize();
-    }
-  }
-
-  // Accessors and mutators.
-  size_t num_rows() const { return num_rows_; }
-  size_t num_columns() const { return num_columns_; }
-  T* const* elements() { return &elements_[0]; }
-  const T* const* elements() const { return &elements_[0]; }
-
-  T Trace() {
-    RTC_CHECK_EQ(num_rows_, num_columns_);
-
-    T trace = 0;
-    for (size_t i = 0; i < num_rows_; ++i) {
-      trace += elements_[i][i];
-    }
-    return trace;
-  }
-
-  // Matrix Operations. Returns *this to support method chaining.
-  Matrix& Transpose() {
-    CopyDataToScratch();
-    Resize(num_columns_, num_rows_);
-    return Transpose(scratch_elements());
-  }
-
-  Matrix& Transpose(const Matrix& operand) {
-    RTC_CHECK_EQ(operand.num_rows_, num_columns_);
-    RTC_CHECK_EQ(operand.num_columns_, num_rows_);
-
-    return Transpose(operand.elements());
-  }
-
-  template <typename S>
-  Matrix& Scale(const S& scalar) {
-    for (size_t i = 0; i < data_.size(); ++i) {
-      data_[i] *= scalar;
-    }
-
-    return *this;
-  }
-
-  template <typename S>
-  Matrix& Scale(const Matrix& operand, const S& scalar) {
-    CopyFrom(operand);
-    return Scale(scalar);
-  }
-
-  Matrix& Add(const Matrix& operand) {
-    RTC_CHECK_EQ(num_rows_, operand.num_rows_);
-    RTC_CHECK_EQ(num_columns_, operand.num_columns_);
-
-    for (size_t i = 0; i < data_.size(); ++i) {
-      data_[i] += operand.data_[i];
-    }
-
-    return *this;
-  }
-
-  Matrix& Add(const Matrix& lhs, const Matrix& rhs) {
-    CopyFrom(lhs);
-    return Add(rhs);
-  }
-
-  Matrix& Subtract(const Matrix& operand) {
-    RTC_CHECK_EQ(num_rows_, operand.num_rows_);
-    RTC_CHECK_EQ(num_columns_, operand.num_columns_);
-
-    for (size_t i = 0; i < data_.size(); ++i) {
-      data_[i] -= operand.data_[i];
-    }
-
-    return *this;
-  }
-
-  Matrix& Subtract(const Matrix& lhs, const Matrix& rhs) {
-    CopyFrom(lhs);
-    return Subtract(rhs);
-  }
-
-  Matrix& PointwiseMultiply(const Matrix& operand) {
-    RTC_CHECK_EQ(num_rows_, operand.num_rows_);
-    RTC_CHECK_EQ(num_columns_, operand.num_columns_);
-
-    for (size_t i = 0; i < data_.size(); ++i) {
-      data_[i] *= operand.data_[i];
-    }
-
-    return *this;
-  }
-
-  Matrix& PointwiseMultiply(const Matrix& lhs, const Matrix& rhs) {
-    CopyFrom(lhs);
-    return PointwiseMultiply(rhs);
-  }
-
-  Matrix& PointwiseDivide(const Matrix& operand) {
-    RTC_CHECK_EQ(num_rows_, operand.num_rows_);
-    RTC_CHECK_EQ(num_columns_, operand.num_columns_);
-
-    for (size_t i = 0; i < data_.size(); ++i) {
-      data_[i] /= operand.data_[i];
-    }
-
-    return *this;
-  }
-
-  Matrix& PointwiseDivide(const Matrix& lhs, const Matrix& rhs) {
-    CopyFrom(lhs);
-    return PointwiseDivide(rhs);
-  }
-
-  Matrix& PointwiseSquareRoot() {
-    for (size_t i = 0; i < data_.size(); ++i) {
-      data_[i] = sqrt_wrapper(data_[i]);
-    }
-
-    return *this;
-  }
-
-  Matrix& PointwiseSquareRoot(const Matrix& operand) {
-    CopyFrom(operand);
-    return PointwiseSquareRoot();
-  }
-
-  Matrix& PointwiseAbsoluteValue() {
-    for (size_t i = 0; i < data_.size(); ++i) {
-      data_[i] = abs(data_[i]);
-    }
-
-    return *this;
-  }
-
-  Matrix& PointwiseAbsoluteValue(const Matrix& operand) {
-    CopyFrom(operand);
-    return PointwiseAbsoluteValue();
-  }
-
-  Matrix& PointwiseSquare() {
-    for (size_t i = 0; i < data_.size(); ++i) {
-      data_[i] *= data_[i];
-    }
-
-    return *this;
-  }
-
-  Matrix& PointwiseSquare(const Matrix& operand) {
-    CopyFrom(operand);
-    return PointwiseSquare();
-  }
-
-  Matrix& Multiply(const Matrix& lhs, const Matrix& rhs) {
-    RTC_CHECK_EQ(lhs.num_columns_, rhs.num_rows_);
-    RTC_CHECK_EQ(num_rows_, lhs.num_rows_);
-    RTC_CHECK_EQ(num_columns_, rhs.num_columns_);
-
-    return Multiply(lhs.elements(), rhs.num_rows_, rhs.elements());
-  }
-
-  Matrix& Multiply(const Matrix& rhs) {
-    RTC_CHECK_EQ(num_columns_, rhs.num_rows_);
-
-    CopyDataToScratch();
-    Resize(num_rows_, rhs.num_columns_);
-    return Multiply(scratch_elements(), rhs.num_rows_, rhs.elements());
-  }
-
-  std::string ToString() const {
-    std::ostringstream ss;
-    ss << std::endl << "Matrix" << std::endl;
-
-    for (size_t i = 0; i < num_rows_; ++i) {
-      for (size_t j = 0; j < num_columns_; ++j) {
-        ss << elements_[i][j] << " ";
-      }
-      ss << std::endl;
-    }
-    ss << std::endl;
-
-    return ss.str();
-  }
-
- protected:
-  void SetNumRows(const size_t num_rows) { num_rows_ = num_rows; }
-  void SetNumColumns(const size_t num_columns) { num_columns_ = num_columns; }
-  T* data() { return &data_[0]; }
-  const T* data() const { return &data_[0]; }
-  const T* const* scratch_elements() const { return &scratch_elements_[0]; }
-
-  // Resize the matrix. If an increase in capacity is required, the current
-  // data is lost.
-  void Resize() {
-    size_t size = num_rows_ * num_columns_;
-    data_.resize(size);
-    elements_.resize(num_rows_);
-
-    for (size_t i = 0; i < num_rows_; ++i) {
-      elements_[i] = &data_[i * num_columns_];
-    }
-  }
-
-  // Copies data_ into scratch_data_ and updates scratch_elements_ accordingly.
-  void CopyDataToScratch() {
-    scratch_data_ = data_;
-    scratch_elements_.resize(num_rows_);
-
-    for (size_t i = 0; i < num_rows_; ++i) {
-      scratch_elements_[i] = &scratch_data_[i * num_columns_];
-    }
-  }
-
- private:
-  size_t num_rows_;
-  size_t num_columns_;
-  std::vector<T> data_;
-  std::vector<T*> elements_;
-
-  // Stores temporary copies of |data_| and |elements_| for in-place operations
-  // where referring to original data is necessary.
-  std::vector<T> scratch_data_;
-  std::vector<T*> scratch_elements_;
-
-  // Helpers for Transpose and Multiply operations that unify in-place and
-  // out-of-place solutions.
-  Matrix& Transpose(const T* const* src) {
-    for (size_t i = 0; i < num_rows_; ++i) {
-      for (size_t j = 0; j < num_columns_; ++j) {
-        elements_[i][j] = src[j][i];
-      }
-    }
-
-    return *this;
-  }
-
-  Matrix& Multiply(const T* const* lhs,
-                   size_t num_rows_rhs,
-                   const T* const* rhs) {
-    for (size_t row = 0; row < num_rows_; ++row) {
-      for (size_t col = 0; col < num_columns_; ++col) {
-        T cur_element = 0;
-        for (size_t i = 0; i < num_rows_rhs; ++i) {
-          cur_element += lhs[row][i] * rhs[i][col];
-        }
-
-        elements_[row][col] = cur_element;
-      }
-    }
-
-    return *this;
-  }
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(Matrix);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_BEAMFORMER_MATRIX_H_
diff --git a/modules/audio_processing/beamformer/matrix_test_helpers.h b/modules/audio_processing/beamformer/matrix_test_helpers.h
deleted file mode 100644
index 57bd82e..0000000
--- a/modules/audio_processing/beamformer/matrix_test_helpers.h
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- *  Copyright (c) 2014 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_PROCESSING_BEAMFORMER_MATRIX_TEST_HELPERS_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_BEAMFORMER_MATRIX_TEST_HELPERS_H_
-
-#include "webrtc/modules/audio_processing/beamformer/complex_matrix.h"
-#include "webrtc/modules/audio_processing/beamformer/matrix.h"
-#include "webrtc/test/gtest.h"
-
-namespace {
-const float kTolerance = 0.001f;
-}
-
-namespace webrtc {
-
-using std::complex;
-
-// Functions used in both matrix_unittest and complex_matrix_unittest.
-class MatrixTestHelpers {
- public:
-  template <typename T>
-  static void ValidateMatrixEquality(const Matrix<T>& expected,
-                                     const Matrix<T>& actual) {
-    EXPECT_EQ(expected.num_rows(), actual.num_rows());
-    EXPECT_EQ(expected.num_columns(), actual.num_columns());
-
-    const T* const* expected_elements = expected.elements();
-    const T* const* actual_elements = actual.elements();
-    for (size_t i = 0; i < expected.num_rows(); ++i) {
-      for (size_t j = 0; j < expected.num_columns(); ++j) {
-        EXPECT_EQ(expected_elements[i][j], actual_elements[i][j]);
-      }
-    }
-  }
-
-  static void ValidateMatrixEqualityFloat(const Matrix<float>& expected,
-                                          const Matrix<float>& actual) {
-    EXPECT_EQ(expected.num_rows(), actual.num_rows());
-    EXPECT_EQ(expected.num_columns(), actual.num_columns());
-
-    const float* const* expected_elements = expected.elements();
-    const float* const* actual_elements = actual.elements();
-    for (size_t i = 0; i < expected.num_rows(); ++i) {
-      for (size_t j = 0; j < expected.num_columns(); ++j) {
-        EXPECT_NEAR(expected_elements[i][j], actual_elements[i][j], kTolerance);
-      }
-    }
-  }
-
-  static void ValidateMatrixEqualityComplexFloat(
-      const Matrix<complex<float> >& expected,
-      const Matrix<complex<float> >& actual) {
-    EXPECT_EQ(expected.num_rows(), actual.num_rows());
-    EXPECT_EQ(expected.num_columns(), actual.num_columns());
-
-    const complex<float>* const* expected_elements = expected.elements();
-    const complex<float>* const* actual_elements = actual.elements();
-    for (size_t i = 0; i < expected.num_rows(); ++i) {
-      for (size_t j = 0; j < expected.num_columns(); ++j) {
-        EXPECT_NEAR(expected_elements[i][j].real(),
-                    actual_elements[i][j].real(),
-                    kTolerance);
-        EXPECT_NEAR(expected_elements[i][j].imag(),
-                    actual_elements[i][j].imag(),
-                    kTolerance);
-      }
-    }
-  }
-
-  static void ValidateMatrixNearEqualityComplexFloat(
-      const Matrix<complex<float> >& expected,
-      const Matrix<complex<float> >& actual,
-      float tolerance) {
-    EXPECT_EQ(expected.num_rows(), actual.num_rows());
-    EXPECT_EQ(expected.num_columns(), actual.num_columns());
-
-    const complex<float>* const* expected_elements = expected.elements();
-    const complex<float>* const* actual_elements = actual.elements();
-    for (size_t i = 0; i < expected.num_rows(); ++i) {
-      for (size_t j = 0; j < expected.num_columns(); ++j) {
-        EXPECT_NEAR(expected_elements[i][j].real(),
-                    actual_elements[i][j].real(),
-                    tolerance);
-        EXPECT_NEAR(expected_elements[i][j].imag(),
-                    actual_elements[i][j].imag(),
-                    tolerance);
-      }
-    }
-  }
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_BEAMFORMER_MATRIX_TEST_HELPERS_H_
diff --git a/modules/audio_processing/beamformer/matrix_unittest.cc b/modules/audio_processing/beamformer/matrix_unittest.cc
deleted file mode 100644
index 939404c..0000000
--- a/modules/audio_processing/beamformer/matrix_unittest.cc
+++ /dev/null
@@ -1,326 +0,0 @@
-/*
- *  Copyright (c) 2014 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 <complex>
-
-#include "webrtc/modules/audio_processing/beamformer/matrix.h"
-#include "webrtc/modules/audio_processing/beamformer/matrix_test_helpers.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-using std::complex;
-
-TEST(MatrixTest, TestMultiplySameSize) {
-  const int kNumRows = 2;
-  const int kNumCols = 2;
-  const float kValuesLeft[kNumRows][kNumCols] = {{1.1f, 2.2f}, {3.3f, 4.4f}};
-  const float kValuesRight[kNumRows][kNumCols] = {{5.4f, 127.f},
-                                                  {4600.f, -555.f}};
-  const float kValuesExpected[kNumRows][kNumCols] = {{10125.94f, -1081.3f},
-                                                     {20257.82f, -2022.9f}};
-
-  Matrix<float> lh_mat(*kValuesLeft, kNumRows, kNumCols);
-  Matrix<float> rh_mat(*kValuesRight, kNumRows, kNumCols);
-  Matrix<float> expected_result(*kValuesExpected, kNumRows, kNumCols);
-  Matrix<float> actual_result(kNumRows, kNumCols);
-
-  actual_result.Multiply(lh_mat, rh_mat);
-  MatrixTestHelpers::ValidateMatrixEquality(expected_result, actual_result);
-
-  lh_mat.Multiply(rh_mat);
-  MatrixTestHelpers::ValidateMatrixEquality(lh_mat, actual_result);
-}
-
-TEST(MatrixTest, TestMultiplyDifferentSize) {
-  const int kNumRowsLeft = 2;
-  const int kNumColsLeft = 3;
-  const int kNumRowsRight = 3;
-  const int kNumColsRight = 2;
-  const int kValuesLeft[kNumRowsLeft][kNumColsLeft] = {{35, 466, -15},
-                                                       {-3, 3422, 9}};
-  const int kValuesRight[kNumRowsRight][kNumColsRight] = {
-      {765, -42}, {0, 194}, {625, 66321}};
-  const int kValuesExpected[kNumRowsLeft][kNumColsRight] = {{17400, -905881},
-                                                            {3330, 1260883}};
-
-  Matrix<int> lh_mat(*kValuesLeft, kNumRowsLeft, kNumColsLeft);
-  Matrix<int> rh_mat(*kValuesRight, kNumRowsRight, kNumColsRight);
-  Matrix<int> expected_result(*kValuesExpected, kNumRowsLeft, kNumColsRight);
-  Matrix<int> actual_result(kNumRowsLeft, kNumColsRight);
-
-  actual_result.Multiply(lh_mat, rh_mat);
-  MatrixTestHelpers::ValidateMatrixEquality(expected_result, actual_result);
-
-  lh_mat.Multiply(rh_mat);
-  MatrixTestHelpers::ValidateMatrixEquality(lh_mat, actual_result);
-}
-
-TEST(MatrixTest, TestTranspose) {
-  const int kNumInitialRows = 2;
-  const int kNumInitialCols = 4;
-  const int kNumResultRows = 4;
-  const int kNumResultCols = 2;
-  const float kValuesInitial[kNumInitialRows][kNumInitialCols] = {
-      {1.1f, 2.2f, 3.3f, 4.4f}, {5.5f, 6.6f, 7.7f, 8.8f}};
-  const float kValuesExpected[kNumResultRows][kNumResultCols] = {
-      {1.1f, 5.5f}, {2.2f, 6.6f}, {3.3f, 7.7f}, {4.4f, 8.8f}};
-
-  Matrix<float> initial_mat(*kValuesInitial, kNumInitialRows, kNumInitialCols);
-  Matrix<float> expected_result(
-      *kValuesExpected, kNumResultRows, kNumResultCols);
-  Matrix<float> actual_result(kNumResultRows, kNumResultCols);
-
-  actual_result.Transpose(initial_mat);
-  MatrixTestHelpers::ValidateMatrixEqualityFloat(expected_result,
-                                                 actual_result);
-  initial_mat.Transpose();
-  MatrixTestHelpers::ValidateMatrixEqualityFloat(initial_mat, actual_result);
-}
-
-TEST(MatrixTest, TestScale) {
-  const int kNumRows = 3;
-  const int kNumCols = 3;
-  const int kScaleFactor = -9;
-  const int kValuesInitial[kNumRows][kNumCols] = {
-      {1, 20, 5000}, {-3, -29, 66}, {7654, 0, -23455}};
-  const int kValuesExpected[kNumRows][kNumCols] = {
-      {-9, -180, -45000}, {27, 261, -594}, {-68886, 0, 211095}};
-
-  Matrix<int> initial_mat(*kValuesInitial, kNumRows, kNumCols);
-  Matrix<int> expected_result(*kValuesExpected, kNumRows, kNumCols);
-  Matrix<int> actual_result;
-
-  actual_result.Scale(initial_mat, kScaleFactor);
-  MatrixTestHelpers::ValidateMatrixEquality(expected_result, actual_result);
-
-  initial_mat.Scale(kScaleFactor);
-  MatrixTestHelpers::ValidateMatrixEquality(initial_mat, actual_result);
-}
-
-TEST(MatrixTest, TestPointwiseAdd) {
-  const int kNumRows = 2;
-  const int kNumCols = 3;
-  const float kValuesLeft[kNumRows][kNumCols] = {{1.1f, 210.45f, -549.2f},
-                                                 {11.876f, 586.7f, -64.35f}};
-  const float kValuesRight[kNumRows][kNumCols] = {{-50.4f, 1.f, 0.5f},
-                                                  {460.f, -554.2f, 4566.f}};
-  const float kValuesExpected[kNumRows][kNumCols] = {
-      {-49.3f, 211.45f, -548.7f}, {471.876f, 32.5f, 4501.65f}};
-
-  Matrix<float> lh_mat(*kValuesLeft, kNumRows, kNumCols);
-  Matrix<float> rh_mat(*kValuesRight, kNumRows, kNumCols);
-  Matrix<float> expected_result(*kValuesExpected, kNumRows, kNumCols);
-  Matrix<float> actual_result;
-
-  actual_result.Add(lh_mat, rh_mat);
-  MatrixTestHelpers::ValidateMatrixEqualityFloat(expected_result,
-                                                 actual_result);
-  lh_mat.Add(rh_mat);
-  MatrixTestHelpers::ValidateMatrixEqualityFloat(lh_mat, actual_result);
-}
-
-TEST(MatrixTest, TestPointwiseSubtract) {
-  const int kNumRows = 3;
-  const int kNumCols = 2;
-  const float kValuesLeft[kNumRows][kNumCols] = {
-      {1.1f, 210.45f}, {-549.2f, 11.876f}, {586.7f, -64.35f}};
-  const float kValuesRight[kNumRows][kNumCols] = {
-      {-50.4f, 1.f}, {0.5f, 460.f}, {-554.2f, 4566.f}};
-  const float kValuesExpected[kNumRows][kNumCols] = {
-      {51.5f, 209.45f}, {-549.7f, -448.124f}, {1140.9f, -4630.35f}};
-
-  Matrix<float> lh_mat(*kValuesLeft, kNumRows, kNumCols);
-  Matrix<float> rh_mat(*kValuesRight, kNumRows, kNumCols);
-  Matrix<float> expected_result(*kValuesExpected, kNumRows, kNumCols);
-  Matrix<float> actual_result;
-
-  actual_result.Subtract(lh_mat, rh_mat);
-  MatrixTestHelpers::ValidateMatrixEqualityFloat(expected_result,
-                                                 actual_result);
-
-  lh_mat.Subtract(rh_mat);
-  MatrixTestHelpers::ValidateMatrixEqualityFloat(lh_mat, actual_result);
-}
-
-TEST(MatrixTest, TestPointwiseMultiply) {
-  const int kNumRows = 1;
-  const int kNumCols = 5;
-  const float kValuesLeft[kNumRows][kNumCols] = {
-      {1.1f, 6.4f, 0.f, -1.f, -88.3f}};
-  const float kValuesRight[kNumRows][kNumCols] = {
-      {53.2f, -210.45f, -549.2f, 99.99f, -45.2f}};
-  const float kValuesExpected[kNumRows][kNumCols] = {
-      {58.52f, -1346.88f, 0.f, -99.99f, 3991.16f}};
-
-  Matrix<float> lh_mat(*kValuesLeft, kNumRows, kNumCols);
-  Matrix<float> rh_mat(*kValuesRight, kNumRows, kNumCols);
-  Matrix<float> expected_result(*kValuesExpected, kNumRows, kNumCols);
-  Matrix<float> actual_result;
-
-  actual_result.PointwiseMultiply(lh_mat, rh_mat);
-  MatrixTestHelpers::ValidateMatrixEqualityFloat(expected_result,
-                                                 actual_result);
-
-  lh_mat.PointwiseMultiply(rh_mat);
-  MatrixTestHelpers::ValidateMatrixEqualityFloat(lh_mat, actual_result);
-}
-
-TEST(MatrixTest, TestPointwiseDivide) {
-  const int kNumRows = 5;
-  const int kNumCols = 1;
-  const float kValuesLeft[kNumRows][kNumCols] = {
-      {1.1f}, {6.4f}, {0.f}, {-1.f}, {-88.3f}};
-  const float kValuesRight[kNumRows][kNumCols] = {
-      {53.2f}, {-210.45f}, {-549.2f}, {99.99f}, {-45.2f}};
-  const float kValuesExpected[kNumRows][kNumCols] = {
-      {0.020676691f}, {-0.03041102399f}, {0.f}, {-0.010001f}, {1.9535398f}};
-
-  Matrix<float> lh_mat(*kValuesLeft, kNumRows, kNumCols);
-  Matrix<float> rh_mat(*kValuesRight, kNumRows, kNumCols);
-  Matrix<float> expected_result(*kValuesExpected, kNumRows, kNumCols);
-  Matrix<float> actual_result;
-
-  actual_result.PointwiseDivide(lh_mat, rh_mat);
-  MatrixTestHelpers::ValidateMatrixEqualityFloat(expected_result,
-                                                 actual_result);
-
-  lh_mat.PointwiseDivide(rh_mat);
-  MatrixTestHelpers::ValidateMatrixEqualityFloat(lh_mat, actual_result);
-}
-
-TEST(MatrixTest, TestPointwiseSquareRoot) {
-  const int kNumRows = 2;
-  const int kNumCols = 2;
-  const int kValues[kNumRows][kNumCols] = {{4, 9}, {16, 0}};
-  const int kValuesExpected[kNumRows][kNumCols] = {{2, 3}, {4, 0}};
-
-  Matrix<int> operand_mat(*kValues, kNumRows, kNumCols);
-  Matrix<int> expected_result(*kValuesExpected, kNumRows, kNumCols);
-  Matrix<int> actual_result;
-
-  actual_result.PointwiseSquareRoot(operand_mat);
-  MatrixTestHelpers::ValidateMatrixEquality(expected_result, actual_result);
-
-  operand_mat.PointwiseSquareRoot();
-  MatrixTestHelpers::ValidateMatrixEquality(operand_mat, actual_result);
-}
-
-TEST(MatrixTest, TestPointwiseSquareRootComplex) {
-  const int kNumRows = 1;
-  const int kNumCols = 3;
-  const complex<float> kValues[kNumRows][kNumCols] = {
-      {complex<float>(-4.f, 0), complex<float>(0, 9), complex<float>(3, -4)}};
-  const complex<float> kValuesExpected[kNumRows][kNumCols] = {
-      {complex<float>(0.f, 2.f), complex<float>(2.1213202f, 2.1213202f),
-       complex<float>(2.f, -1.f)}};
-
-  Matrix<complex<float> > operand_mat(*kValues, kNumRows, kNumCols);
-  Matrix<complex<float> > expected_result(*kValuesExpected, kNumRows, kNumCols);
-  Matrix<complex<float> > actual_result;
-
-  actual_result.PointwiseSquareRoot(operand_mat);
-  MatrixTestHelpers::ValidateMatrixEqualityComplexFloat(expected_result,
-                                                        actual_result);
-
-  operand_mat.PointwiseSquareRoot();
-  MatrixTestHelpers::ValidateMatrixEqualityComplexFloat(operand_mat,
-                                                        actual_result);
-}
-
-TEST(MatrixTest, TestPointwiseAbsoluteValue) {
-  const int kNumRows = 1;
-  const int kNumCols = 3;
-  const complex<float> kValues[kNumRows][kNumCols] = {
-      {complex<float>(-4.f, 0), complex<float>(0, 9), complex<float>(3, -4)}};
-  const complex<float> kValuesExpected[kNumRows][kNumCols] = {
-      {complex<float>(4.f, 0), complex<float>(9.f, 0), complex<float>(5.f, 0)}};
-
-  Matrix<complex<float> > operand_mat(*kValues, kNumRows, kNumCols);
-  Matrix<complex<float> > expected_result(*kValuesExpected, kNumRows, kNumCols);
-  Matrix<complex<float> > actual_result;
-
-  actual_result.PointwiseAbsoluteValue(operand_mat);
-  MatrixTestHelpers::ValidateMatrixEqualityComplexFloat(expected_result,
-                                                        actual_result);
-
-  operand_mat.PointwiseAbsoluteValue();
-  MatrixTestHelpers::ValidateMatrixEqualityComplexFloat(operand_mat,
-                                                        actual_result);
-}
-
-TEST(MatrixTest, TestPointwiseSquare) {
-  const int kNumRows = 1;
-  const int kNumCols = 3;
-  const float kValues[kNumRows][kNumCols] = {{2.4f, -4.f, 3.3f}};
-  const float kValuesExpected[kNumRows][kNumCols] = {{5.76f, 16.f, 10.89f}};
-
-  Matrix<float> operand_mat(*kValues, kNumRows, kNumCols);
-  Matrix<float> expected_result(*kValuesExpected, kNumRows, kNumCols);
-  Matrix<float> actual_result;
-
-  actual_result.PointwiseSquare(operand_mat);
-  MatrixTestHelpers::ValidateMatrixEqualityFloat(expected_result,
-                                                 actual_result);
-
-  operand_mat.PointwiseSquare();
-  MatrixTestHelpers::ValidateMatrixEqualityFloat(operand_mat, actual_result);
-}
-
-TEST(MatrixTest, TestComplexOperations) {
-  const int kNumRows = 2;
-  const int kNumCols = 2;
-
-  const complex<float> kValuesLeft[kNumRows][kNumCols] = {
-      {complex<float>(1.f, 1.f), complex<float>(2.f, 2.f)},
-      {complex<float>(3.f, 3.f), complex<float>(4.f, 4.f)}};
-
-  const complex<float> kValuesRight[kNumRows][kNumCols] = {
-      {complex<float>(5.f, 5.f), complex<float>(6.f, 6.f)},
-      {complex<float>(7.f, 7.f), complex<float>(8.f, 8.f)}};
-
-  const complex<float> kValuesExpectedAdd[kNumRows][kNumCols] = {
-      {complex<float>(6.f, 6.f), complex<float>(8.f, 8.f)},
-      {complex<float>(10.f, 10.f), complex<float>(12.f, 12.f)}};
-
-  const complex<float> kValuesExpectedMultiply[kNumRows][kNumCols] = {
-      {complex<float>(0.f, 38.f), complex<float>(0.f, 44.f)},
-      {complex<float>(0.f, 86.f), complex<float>(0.f, 100.f)}};
-
-  const complex<float> kValuesExpectedPointwiseDivide[kNumRows][kNumCols] = {
-      {complex<float>(0.2f, 0.f), complex<float>(0.33333333f, 0.f)},
-      {complex<float>(0.42857143f, 0.f), complex<float>(0.5f, 0.f)}};
-
-  Matrix<complex<float> > lh_mat(*kValuesLeft, kNumRows, kNumCols);
-  Matrix<complex<float> > rh_mat(*kValuesRight, kNumRows, kNumCols);
-  Matrix<complex<float> > expected_result_add(
-      *kValuesExpectedAdd, kNumRows, kNumCols);
-  Matrix<complex<float> > expected_result_multiply(
-      *kValuesExpectedMultiply, kNumRows, kNumCols);
-  Matrix<complex<float> > expected_result_pointwise_divide(
-      *kValuesExpectedPointwiseDivide, kNumRows, kNumCols);
-  Matrix<complex<float> > actual_result_add;
-  Matrix<complex<float> > actual_result_multiply(kNumRows, kNumCols);
-  Matrix<complex<float> > actual_result_pointwise_divide;
-
-  actual_result_add.Add(lh_mat, rh_mat);
-  MatrixTestHelpers::ValidateMatrixEqualityComplexFloat(expected_result_add,
-                                                        actual_result_add);
-
-  actual_result_multiply.Multiply(lh_mat, rh_mat);
-  MatrixTestHelpers::ValidateMatrixEqualityComplexFloat(
-      expected_result_multiply, actual_result_multiply);
-
-  actual_result_pointwise_divide.PointwiseDivide(lh_mat, rh_mat);
-  MatrixTestHelpers::ValidateMatrixEqualityComplexFloat(
-      expected_result_pointwise_divide, actual_result_pointwise_divide);
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/beamformer/mock_nonlinear_beamformer.h b/modules/audio_processing/beamformer/mock_nonlinear_beamformer.h
deleted file mode 100644
index 7493dcb..0000000
--- a/modules/audio_processing/beamformer/mock_nonlinear_beamformer.h
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- *  Copyright (c) 2015 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_PROCESSING_BEAMFORMER_MOCK_BEAMFORMER_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_BEAMFORMER_MOCK_BEAMFORMER_H_
-
-#include <vector>
-
-#include "webrtc/modules/audio_processing/beamformer/nonlinear_beamformer.h"
-#include "webrtc/test/gmock.h"
-
-namespace webrtc {
-
-class MockNonlinearBeamformer : public NonlinearBeamformer {
- public:
-  MockNonlinearBeamformer(const std::vector<Point>& array_geometry,
-                          size_t num_postfilter_channels)
-      : NonlinearBeamformer(array_geometry, num_postfilter_channels) {}
-
-  MockNonlinearBeamformer(const std::vector<Point>& array_geometry)
-      : NonlinearBeamformer(array_geometry, 1u) {}
-
-  MOCK_METHOD2(Initialize, void(int chunk_size_ms, int sample_rate_hz));
-  MOCK_METHOD1(AnalyzeChunk, void(const ChannelBuffer<float>& data));
-  MOCK_METHOD1(PostFilter, void(ChannelBuffer<float>* data));
-  MOCK_METHOD1(IsInBeam, bool(const SphericalPointf& spherical_point));
-  MOCK_METHOD0(is_target_present, bool());
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_BEAMFORMER_MOCK_BEAMFORMER_H_
diff --git a/modules/audio_processing/beamformer/nonlinear_beamformer.cc b/modules/audio_processing/beamformer/nonlinear_beamformer.cc
deleted file mode 100644
index b7d23f5..0000000
--- a/modules/audio_processing/beamformer/nonlinear_beamformer.cc
+++ /dev/null
@@ -1,599 +0,0 @@
-/*
- *  Copyright (c) 2014 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.
- */
-
-#define _USE_MATH_DEFINES
-
-#include "webrtc/modules/audio_processing/beamformer/nonlinear_beamformer.h"
-
-#include <algorithm>
-#include <cmath>
-#include <numeric>
-#include <vector>
-
-#include "webrtc/common_audio/window_generator.h"
-#include "webrtc/modules/audio_processing/beamformer/covariance_matrix_generator.h"
-#include "webrtc/rtc_base/arraysize.h"
-
-namespace webrtc {
-namespace {
-
-// Alpha for the Kaiser Bessel Derived window.
-const float kKbdAlpha = 1.5f;
-
-const float kSpeedOfSoundMeterSeconds = 343;
-
-// The minimum separation in radians between the target direction and an
-// interferer scenario.
-const float kMinAwayRadians = 0.2f;
-
-// The separation between the target direction and the closest interferer
-// scenario is proportional to this constant.
-const float kAwaySlope = 0.008f;
-
-// When calculating the interference covariance matrix, this is the weight for
-// the weighted average between the uniform covariance matrix and the angled
-// covariance matrix.
-// Rpsi = Rpsi_angled * kBalance + Rpsi_uniform * (1 - kBalance)
-const float kBalance = 0.95f;
-
-// Alpha coefficients for mask smoothing.
-const float kMaskTimeSmoothAlpha = 0.2f;
-const float kMaskFrequencySmoothAlpha = 0.6f;
-
-// The average mask is computed from masks in this mid-frequency range. If these
-// ranges are changed |kMaskQuantile| might need to be adjusted.
-const int kLowMeanStartHz = 200;
-const int kLowMeanEndHz = 400;
-
-// Range limiter for subtractive terms in the nominator and denominator of the
-// postfilter expression. It handles the scenario mismatch between the true and
-// model sources (target and interference).
-const float kCutOffConstant = 0.9999f;
-
-// Quantile of mask values which is used to estimate target presence.
-const float kMaskQuantile = 0.7f;
-// Mask threshold over which the data is considered signal and not interference.
-// It has to be updated every time the postfilter calculation is changed
-// significantly.
-// TODO(aluebs): Write a tool to tune the target threshold automatically based
-// on files annotated with target and interference ground truth.
-const float kMaskTargetThreshold = 0.01f;
-// Time in seconds after which the data is considered interference if the mask
-// does not pass |kMaskTargetThreshold|.
-const float kHoldTargetSeconds = 0.25f;
-
-// To compensate for the attenuation this algorithm introduces to the target
-// signal. It was estimated empirically from a low-noise low-reverberation
-// recording from broadside.
-const float kCompensationGain = 2.f;
-
-// Does conjugate(|norm_mat|) * |mat| * transpose(|norm_mat|). No extra space is
-// used; to accomplish this, we compute both multiplications in the same loop.
-// The returned norm is clamped to be non-negative.
-float Norm(const ComplexMatrix<float>& mat,
-           const ComplexMatrix<float>& norm_mat) {
-  RTC_CHECK_EQ(1, norm_mat.num_rows());
-  RTC_CHECK_EQ(norm_mat.num_columns(), mat.num_rows());
-  RTC_CHECK_EQ(norm_mat.num_columns(), mat.num_columns());
-
-  complex<float> first_product = complex<float>(0.f, 0.f);
-  complex<float> second_product = complex<float>(0.f, 0.f);
-
-  const complex<float>* const* mat_els = mat.elements();
-  const complex<float>* const* norm_mat_els = norm_mat.elements();
-
-  for (size_t i = 0; i < norm_mat.num_columns(); ++i) {
-    for (size_t j = 0; j < norm_mat.num_columns(); ++j) {
-      first_product += conj(norm_mat_els[0][j]) * mat_els[j][i];
-    }
-    second_product += first_product * norm_mat_els[0][i];
-    first_product = 0.f;
-  }
-  return std::max(second_product.real(), 0.f);
-}
-
-// Does conjugate(|lhs|) * |rhs| for row vectors |lhs| and |rhs|.
-complex<float> ConjugateDotProduct(const ComplexMatrix<float>& lhs,
-                                   const ComplexMatrix<float>& rhs) {
-  RTC_CHECK_EQ(1, lhs.num_rows());
-  RTC_CHECK_EQ(1, rhs.num_rows());
-  RTC_CHECK_EQ(lhs.num_columns(), rhs.num_columns());
-
-  const complex<float>* const* lhs_elements = lhs.elements();
-  const complex<float>* const* rhs_elements = rhs.elements();
-
-  complex<float> result = complex<float>(0.f, 0.f);
-  for (size_t i = 0; i < lhs.num_columns(); ++i) {
-    result += conj(lhs_elements[0][i]) * rhs_elements[0][i];
-  }
-
-  return result;
-}
-
-// Works for positive numbers only.
-size_t Round(float x) {
-  return static_cast<size_t>(std::floor(x + 0.5f));
-}
-
-// Calculates the sum of squares of a complex matrix.
-float SumSquares(const ComplexMatrix<float>& mat) {
-  float sum_squares = 0.f;
-  const complex<float>* const* mat_els = mat.elements();
-  for (size_t i = 0; i < mat.num_rows(); ++i) {
-    for (size_t j = 0; j < mat.num_columns(); ++j) {
-      float abs_value = std::abs(mat_els[i][j]);
-      sum_squares += abs_value * abs_value;
-    }
-  }
-  return sum_squares;
-}
-
-// Does |out| = |in|.' * conj(|in|) for row vector |in|.
-void TransposedConjugatedProduct(const ComplexMatrix<float>& in,
-                                 ComplexMatrix<float>* out) {
-  RTC_CHECK_EQ(1, in.num_rows());
-  RTC_CHECK_EQ(out->num_rows(), in.num_columns());
-  RTC_CHECK_EQ(out->num_columns(), in.num_columns());
-  const complex<float>* in_elements = in.elements()[0];
-  complex<float>* const* out_elements = out->elements();
-  for (size_t i = 0; i < out->num_rows(); ++i) {
-    for (size_t j = 0; j < out->num_columns(); ++j) {
-      out_elements[i][j] = in_elements[i] * conj(in_elements[j]);
-    }
-  }
-}
-
-std::vector<Point> GetCenteredArray(std::vector<Point> array_geometry) {
-  for (size_t dim = 0; dim < 3; ++dim) {
-    float center = 0.f;
-    for (size_t i = 0; i < array_geometry.size(); ++i) {
-      center += array_geometry[i].c[dim];
-    }
-    center /= array_geometry.size();
-    for (size_t i = 0; i < array_geometry.size(); ++i) {
-      array_geometry[i].c[dim] -= center;
-    }
-  }
-  return array_geometry;
-}
-
-}  // namespace
-
-const float NonlinearBeamformer::kHalfBeamWidthRadians = DegreesToRadians(20.f);
-
-// static
-const size_t NonlinearBeamformer::kNumFreqBins;
-
-PostFilterTransform::PostFilterTransform(size_t num_channels,
-                                         size_t chunk_length,
-                                         float* window,
-                                         size_t fft_size)
-    : transform_(num_channels,
-                 num_channels,
-                 chunk_length,
-                 window,
-                 fft_size,
-                 fft_size / 2,
-                 this),
-      num_freq_bins_(fft_size / 2 + 1) {}
-
-void PostFilterTransform::ProcessChunk(float* const* data, float* final_mask) {
-  final_mask_ = final_mask;
-  transform_.ProcessChunk(data, data);
-}
-
-void PostFilterTransform::ProcessAudioBlock(const complex<float>* const* input,
-                                            size_t num_input_channels,
-                                            size_t num_freq_bins,
-                                            size_t num_output_channels,
-                                            complex<float>* const* output) {
-  RTC_DCHECK_EQ(num_freq_bins_, num_freq_bins);
-  RTC_DCHECK_EQ(num_input_channels, num_output_channels);
-
-  for (size_t ch = 0; ch < num_input_channels; ++ch) {
-    for (size_t f_ix = 0; f_ix < num_freq_bins_; ++f_ix) {
-      output[ch][f_ix] =
-          kCompensationGain * final_mask_[f_ix] * input[ch][f_ix];
-    }
-  }
-}
-
-NonlinearBeamformer::NonlinearBeamformer(
-    const std::vector<Point>& array_geometry,
-    size_t num_postfilter_channels,
-    SphericalPointf target_direction)
-    : num_input_channels_(array_geometry.size()),
-      num_postfilter_channels_(num_postfilter_channels),
-      array_geometry_(GetCenteredArray(array_geometry)),
-      array_normal_(GetArrayNormalIfExists(array_geometry)),
-      min_mic_spacing_(GetMinimumSpacing(array_geometry)),
-      target_angle_radians_(target_direction.azimuth()),
-      away_radians_(std::min(
-          static_cast<float>(M_PI),
-          std::max(kMinAwayRadians,
-                   kAwaySlope * static_cast<float>(M_PI) / min_mic_spacing_))) {
-  WindowGenerator::KaiserBesselDerived(kKbdAlpha, kFftSize, window_);
-}
-
-NonlinearBeamformer::~NonlinearBeamformer() = default;
-
-void NonlinearBeamformer::Initialize(int chunk_size_ms, int sample_rate_hz) {
-  chunk_length_ =
-      static_cast<size_t>(sample_rate_hz / (1000.f / chunk_size_ms));
-  sample_rate_hz_ = sample_rate_hz;
-
-  high_pass_postfilter_mask_ = 1.f;
-  is_target_present_ = false;
-  hold_target_blocks_ = kHoldTargetSeconds * 2 * sample_rate_hz / kFftSize;
-  interference_blocks_count_ = hold_target_blocks_;
-
-  process_transform_.reset(new LappedTransform(num_input_channels_,
-                                               0u,
-                                               chunk_length_,
-                                               window_,
-                                               kFftSize,
-                                               kFftSize / 2,
-                                               this));
-  postfilter_transform_.reset(new PostFilterTransform(
-      num_postfilter_channels_, chunk_length_, window_, kFftSize));
-  const float wave_number_step =
-      (2.f * M_PI * sample_rate_hz_) / (kFftSize * kSpeedOfSoundMeterSeconds);
-  for (size_t i = 0; i < kNumFreqBins; ++i) {
-    time_smooth_mask_[i] = 1.f;
-    final_mask_[i] = 1.f;
-    wave_numbers_[i] = i * wave_number_step;
-  }
-
-  InitLowFrequencyCorrectionRanges();
-  InitDiffuseCovMats();
-  AimAt(SphericalPointf(target_angle_radians_, 0.f, 1.f));
-}
-
-// These bin indexes determine the regions over which a mean is taken. This is
-// applied as a constant value over the adjacent end "frequency correction"
-// regions.
-//
-//             low_mean_start_bin_     high_mean_start_bin_
-//                   v                         v              constant
-// |----------------|--------|----------------|-------|----------------|
-//   constant               ^                        ^
-//             low_mean_end_bin_       high_mean_end_bin_
-//
-void NonlinearBeamformer::InitLowFrequencyCorrectionRanges() {
-  low_mean_start_bin_ = Round(static_cast<float>(kLowMeanStartHz) *
-                                  kFftSize / sample_rate_hz_);
-  low_mean_end_bin_ = Round(static_cast<float>(kLowMeanEndHz) *
-                                  kFftSize / sample_rate_hz_);
-
-  RTC_DCHECK_GT(low_mean_start_bin_, 0U);
-  RTC_DCHECK_LT(low_mean_start_bin_, low_mean_end_bin_);
-}
-
-void NonlinearBeamformer::InitHighFrequencyCorrectionRanges() {
-  const float kAliasingFreqHz =
-      kSpeedOfSoundMeterSeconds /
-      (min_mic_spacing_ * (1.f + std::abs(std::cos(target_angle_radians_))));
-  const float kHighMeanStartHz = std::min(0.5f *  kAliasingFreqHz,
-                                          sample_rate_hz_ / 2.f);
-  const float kHighMeanEndHz = std::min(0.75f *  kAliasingFreqHz,
-                                        sample_rate_hz_ / 2.f);
-  high_mean_start_bin_ = Round(kHighMeanStartHz * kFftSize / sample_rate_hz_);
-  high_mean_end_bin_ = Round(kHighMeanEndHz * kFftSize / sample_rate_hz_);
-
-  RTC_DCHECK_LT(low_mean_end_bin_, high_mean_end_bin_);
-  RTC_DCHECK_LT(high_mean_start_bin_, high_mean_end_bin_);
-  RTC_DCHECK_LT(high_mean_end_bin_, kNumFreqBins - 1);
-}
-
-void NonlinearBeamformer::InitInterfAngles() {
-  interf_angles_radians_.clear();
-  const Point target_direction = AzimuthToPoint(target_angle_radians_);
-  const Point clockwise_interf_direction =
-      AzimuthToPoint(target_angle_radians_ - away_radians_);
-  if (!array_normal_ ||
-      DotProduct(*array_normal_, target_direction) *
-              DotProduct(*array_normal_, clockwise_interf_direction) >=
-          0.f) {
-    // The target and clockwise interferer are in the same half-plane defined
-    // by the array.
-    interf_angles_radians_.push_back(target_angle_radians_ - away_radians_);
-  } else {
-    // Otherwise, the interferer will begin reflecting back at the target.
-    // Instead rotate it away 180 degrees.
-    interf_angles_radians_.push_back(target_angle_radians_ - away_radians_ +
-                                     M_PI);
-  }
-  const Point counterclock_interf_direction =
-      AzimuthToPoint(target_angle_radians_ + away_radians_);
-  if (!array_normal_ ||
-      DotProduct(*array_normal_, target_direction) *
-              DotProduct(*array_normal_, counterclock_interf_direction) >=
-          0.f) {
-    // The target and counter-clockwise interferer are in the same half-plane
-    // defined by the array.
-    interf_angles_radians_.push_back(target_angle_radians_ + away_radians_);
-  } else {
-    // Otherwise, the interferer will begin reflecting back at the target.
-    // Instead rotate it away 180 degrees.
-    interf_angles_radians_.push_back(target_angle_radians_ + away_radians_ -
-                                     M_PI);
-  }
-}
-
-void NonlinearBeamformer::InitDelaySumMasks() {
-  for (size_t f_ix = 0; f_ix < kNumFreqBins; ++f_ix) {
-    delay_sum_masks_[f_ix].Resize(1, num_input_channels_);
-    CovarianceMatrixGenerator::PhaseAlignmentMasks(
-        f_ix, kFftSize, sample_rate_hz_, kSpeedOfSoundMeterSeconds,
-        array_geometry_, target_angle_radians_, &delay_sum_masks_[f_ix]);
-
-    complex_f norm_factor = sqrt(
-        ConjugateDotProduct(delay_sum_masks_[f_ix], delay_sum_masks_[f_ix]));
-    delay_sum_masks_[f_ix].Scale(1.f / norm_factor);
-  }
-}
-
-void NonlinearBeamformer::InitTargetCovMats() {
-  for (size_t i = 0; i < kNumFreqBins; ++i) {
-    target_cov_mats_[i].Resize(num_input_channels_, num_input_channels_);
-    TransposedConjugatedProduct(delay_sum_masks_[i], &target_cov_mats_[i]);
-  }
-}
-
-void NonlinearBeamformer::InitDiffuseCovMats() {
-  for (size_t i = 0; i < kNumFreqBins; ++i) {
-    uniform_cov_mat_[i].Resize(num_input_channels_, num_input_channels_);
-    CovarianceMatrixGenerator::UniformCovarianceMatrix(
-        wave_numbers_[i], array_geometry_, &uniform_cov_mat_[i]);
-    complex_f normalization_factor = uniform_cov_mat_[i].elements()[0][0];
-    uniform_cov_mat_[i].Scale(1.f / normalization_factor);
-    uniform_cov_mat_[i].Scale(1 - kBalance);
-  }
-}
-
-void NonlinearBeamformer::InitInterfCovMats() {
-  for (size_t i = 0; i < kNumFreqBins; ++i) {
-    interf_cov_mats_[i].clear();
-    for (size_t j = 0; j < interf_angles_radians_.size(); ++j) {
-      interf_cov_mats_[i].push_back(std::unique_ptr<ComplexMatrixF>(
-          new ComplexMatrixF(num_input_channels_, num_input_channels_)));
-      ComplexMatrixF angled_cov_mat(num_input_channels_, num_input_channels_);
-      CovarianceMatrixGenerator::AngledCovarianceMatrix(
-          kSpeedOfSoundMeterSeconds,
-          interf_angles_radians_[j],
-          i,
-          kFftSize,
-          kNumFreqBins,
-          sample_rate_hz_,
-          array_geometry_,
-          &angled_cov_mat);
-      // Normalize matrices before averaging them.
-      complex_f normalization_factor = angled_cov_mat.elements()[0][0];
-      angled_cov_mat.Scale(1.f / normalization_factor);
-      // Weighted average of matrices.
-      angled_cov_mat.Scale(kBalance);
-      interf_cov_mats_[i][j]->Add(uniform_cov_mat_[i], angled_cov_mat);
-    }
-  }
-}
-
-void NonlinearBeamformer::NormalizeCovMats() {
-  for (size_t i = 0; i < kNumFreqBins; ++i) {
-    rxiws_[i] = Norm(target_cov_mats_[i], delay_sum_masks_[i]);
-    rpsiws_[i].clear();
-    for (size_t j = 0; j < interf_angles_radians_.size(); ++j) {
-      rpsiws_[i].push_back(Norm(*interf_cov_mats_[i][j], delay_sum_masks_[i]));
-    }
-  }
-}
-
-void NonlinearBeamformer::AnalyzeChunk(const ChannelBuffer<float>& data) {
-  RTC_DCHECK_EQ(data.num_channels(), num_input_channels_);
-  RTC_DCHECK_EQ(data.num_frames_per_band(), chunk_length_);
-
-  old_high_pass_mask_ = high_pass_postfilter_mask_;
-  process_transform_->ProcessChunk(data.channels(0), nullptr);
-}
-
-void NonlinearBeamformer::PostFilter(ChannelBuffer<float>* data) {
-  RTC_DCHECK_EQ(data->num_frames_per_band(), chunk_length_);
-  // TODO(aluebs): Change to RTC_CHECK_EQ once the ChannelBuffer is updated.
-  RTC_DCHECK_GE(data->num_channels(), num_postfilter_channels_);
-
-  postfilter_transform_->ProcessChunk(data->channels(0), final_mask_);
-
-  // Ramp up/down for smoothing is needed in order to avoid discontinuities in
-  // the transitions between 10 ms frames.
-  const float ramp_increment =
-      (high_pass_postfilter_mask_ - old_high_pass_mask_) /
-      data->num_frames_per_band();
-  for (size_t i = 1; i < data->num_bands(); ++i) {
-    float smoothed_mask = old_high_pass_mask_;
-    for (size_t j = 0; j < data->num_frames_per_band(); ++j) {
-      smoothed_mask += ramp_increment;
-      for (size_t k = 0; k < num_postfilter_channels_; ++k) {
-        data->channels(i)[k][j] *= smoothed_mask;
-      }
-    }
-  }
-}
-
-void NonlinearBeamformer::AimAt(const SphericalPointf& target_direction) {
-  target_angle_radians_ = target_direction.azimuth();
-  InitHighFrequencyCorrectionRanges();
-  InitInterfAngles();
-  InitDelaySumMasks();
-  InitTargetCovMats();
-  InitInterfCovMats();
-  NormalizeCovMats();
-}
-
-bool NonlinearBeamformer::IsInBeam(const SphericalPointf& spherical_point) {
-  // If more than half-beamwidth degrees away from the beam's center,
-  // you are out of the beam.
-  return fabs(spherical_point.azimuth() - target_angle_radians_) <
-         kHalfBeamWidthRadians;
-}
-
-bool NonlinearBeamformer::is_target_present() { return is_target_present_; }
-
-void NonlinearBeamformer::ProcessAudioBlock(const complex_f* const* input,
-                                            size_t num_input_channels,
-                                            size_t num_freq_bins,
-                                            size_t num_output_channels,
-                                            complex_f* const* output) {
-  RTC_CHECK_EQ(kNumFreqBins, num_freq_bins);
-  RTC_CHECK_EQ(num_input_channels_, num_input_channels);
-  RTC_CHECK_EQ(0, num_output_channels);
-
-  // Calculating the post-filter masks. Note that we need two for each
-  // frequency bin to account for the positive and negative interferer
-  // angle.
-  for (size_t i = low_mean_start_bin_; i <= high_mean_end_bin_; ++i) {
-    eig_m_.CopyFromColumn(input, i, num_input_channels_);
-    float eig_m_norm_factor = std::sqrt(SumSquares(eig_m_));
-    if (eig_m_norm_factor != 0.f) {
-      eig_m_.Scale(1.f / eig_m_norm_factor);
-    }
-
-    float rxim = Norm(target_cov_mats_[i], eig_m_);
-    float ratio_rxiw_rxim = 0.f;
-    if (rxim > 0.f) {
-      ratio_rxiw_rxim = rxiws_[i] / rxim;
-    }
-
-    complex_f rmw = abs(ConjugateDotProduct(delay_sum_masks_[i], eig_m_));
-    rmw *= rmw;
-    float rmw_r = rmw.real();
-
-    new_mask_[i] = CalculatePostfilterMask(*interf_cov_mats_[i][0],
-                                           rpsiws_[i][0],
-                                           ratio_rxiw_rxim,
-                                           rmw_r);
-    for (size_t j = 1; j < interf_angles_radians_.size(); ++j) {
-      float tmp_mask = CalculatePostfilterMask(*interf_cov_mats_[i][j],
-                                               rpsiws_[i][j],
-                                               ratio_rxiw_rxim,
-                                               rmw_r);
-      if (tmp_mask < new_mask_[i]) {
-        new_mask_[i] = tmp_mask;
-      }
-    }
-  }
-
-  ApplyMaskTimeSmoothing();
-  EstimateTargetPresence();
-  ApplyLowFrequencyCorrection();
-  ApplyHighFrequencyCorrection();
-  ApplyMaskFrequencySmoothing();
-}
-
-float NonlinearBeamformer::CalculatePostfilterMask(
-    const ComplexMatrixF& interf_cov_mat,
-    float rpsiw,
-    float ratio_rxiw_rxim,
-    float rmw_r) {
-  float rpsim = Norm(interf_cov_mat, eig_m_);
-
-  float ratio = 0.f;
-  if (rpsim > 0.f) {
-    ratio = rpsiw / rpsim;
-  }
-
-  float numerator = 1.f - kCutOffConstant;
-  if (rmw_r > 0.f) {
-    numerator = 1.f - std::min(kCutOffConstant, ratio / rmw_r);
-  }
-
-  float denominator = 1.f - kCutOffConstant;
-  if (ratio_rxiw_rxim > 0.f) {
-    denominator = 1.f - std::min(kCutOffConstant, ratio / ratio_rxiw_rxim);
-  }
-
-  return numerator / denominator;
-}
-
-// Smooth new_mask_ into time_smooth_mask_.
-void NonlinearBeamformer::ApplyMaskTimeSmoothing() {
-  for (size_t i = low_mean_start_bin_; i <= high_mean_end_bin_; ++i) {
-    time_smooth_mask_[i] = kMaskTimeSmoothAlpha * new_mask_[i] +
-                           (1 - kMaskTimeSmoothAlpha) * time_smooth_mask_[i];
-  }
-}
-
-// Copy time_smooth_mask_ to final_mask_ and smooth over frequency.
-void NonlinearBeamformer::ApplyMaskFrequencySmoothing() {
-  // Smooth over frequency in both directions. The "frequency correction"
-  // regions have constant value, but we enter them to smooth over the jump
-  // that exists at the boundary. However, this does mean when smoothing "away"
-  // from the region that we only need to use the last element.
-  //
-  // Upward smoothing:
-  //   low_mean_start_bin_
-  //         v
-  // |------|------------|------|
-  //       ^------------------>^
-  //
-  // Downward smoothing:
-  //         high_mean_end_bin_
-  //                    v
-  // |------|------------|------|
-  //  ^<------------------^
-  std::copy(time_smooth_mask_, time_smooth_mask_ + kNumFreqBins, final_mask_);
-  for (size_t i = low_mean_start_bin_; i < kNumFreqBins; ++i) {
-    final_mask_[i] = kMaskFrequencySmoothAlpha * final_mask_[i] +
-                     (1 - kMaskFrequencySmoothAlpha) * final_mask_[i - 1];
-  }
-  for (size_t i = high_mean_end_bin_ + 1; i > 0; --i) {
-    final_mask_[i - 1] = kMaskFrequencySmoothAlpha * final_mask_[i - 1] +
-                         (1 - kMaskFrequencySmoothAlpha) * final_mask_[i];
-  }
-}
-
-// Apply low frequency correction to time_smooth_mask_.
-void NonlinearBeamformer::ApplyLowFrequencyCorrection() {
-  const float low_frequency_mask =
-      MaskRangeMean(low_mean_start_bin_, low_mean_end_bin_ + 1);
-  std::fill(time_smooth_mask_, time_smooth_mask_ + low_mean_start_bin_,
-            low_frequency_mask);
-}
-
-// Apply high frequency correction to time_smooth_mask_. Update
-// high_pass_postfilter_mask_ to use for the high frequency time-domain bands.
-void NonlinearBeamformer::ApplyHighFrequencyCorrection() {
-  high_pass_postfilter_mask_ =
-      MaskRangeMean(high_mean_start_bin_, high_mean_end_bin_ + 1);
-  std::fill(time_smooth_mask_ + high_mean_end_bin_ + 1,
-            time_smooth_mask_ + kNumFreqBins, high_pass_postfilter_mask_);
-}
-
-// Compute mean over the given range of time_smooth_mask_, [first, last).
-float NonlinearBeamformer::MaskRangeMean(size_t first, size_t last) {
-  RTC_DCHECK_GT(last, first);
-  const float sum = std::accumulate(time_smooth_mask_ + first,
-                                    time_smooth_mask_ + last, 0.f);
-  return sum / (last - first);
-}
-
-void NonlinearBeamformer::EstimateTargetPresence() {
-  const size_t quantile = static_cast<size_t>(
-      (high_mean_end_bin_ - low_mean_start_bin_) * kMaskQuantile +
-      low_mean_start_bin_);
-  std::nth_element(new_mask_ + low_mean_start_bin_, new_mask_ + quantile,
-                   new_mask_ + high_mean_end_bin_ + 1);
-  if (new_mask_[quantile] > kMaskTargetThreshold) {
-    is_target_present_ = true;
-    interference_blocks_count_ = 0;
-  } else {
-    is_target_present_ = interference_blocks_count_++ < hold_target_blocks_;
-  }
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/beamformer/nonlinear_beamformer.h b/modules/audio_processing/beamformer/nonlinear_beamformer.h
deleted file mode 100644
index 9b45c8b..0000000
--- a/modules/audio_processing/beamformer/nonlinear_beamformer.h
+++ /dev/null
@@ -1,228 +0,0 @@
-/*
- *  Copyright (c) 2014 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_PROCESSING_BEAMFORMER_NONLINEAR_BEAMFORMER_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_BEAMFORMER_NONLINEAR_BEAMFORMER_H_
-
-// MSVC++ requires this to be set before any other includes to get M_PI.
-#define _USE_MATH_DEFINES
-
-#include <math.h>
-
-#include <memory>
-#include <vector>
-
-#include "webrtc/common_audio/lapped_transform.h"
-#include "webrtc/common_audio/channel_buffer.h"
-#include "webrtc/modules/audio_processing/beamformer/array_util.h"
-#include "webrtc/modules/audio_processing/beamformer/complex_matrix.h"
-
-namespace webrtc {
-
-class PostFilterTransform : public LappedTransform::Callback {
- public:
-  PostFilterTransform(size_t num_channels,
-                      size_t chunk_length,
-                      float* window,
-                      size_t fft_size);
-
-  void ProcessChunk(float* const* data, float* final_mask);
-
- protected:
-  void ProcessAudioBlock(const complex<float>* const* input,
-                         size_t num_input_channels,
-                         size_t num_freq_bins,
-                         size_t num_output_channels,
-                         complex<float>* const* output) override;
-
- private:
-  LappedTransform transform_;
-  const size_t num_freq_bins_;
-  float* final_mask_;
-};
-
-// Enhances sound sources coming directly in front of a uniform linear array
-// and suppresses sound sources coming from all other directions. Operates on
-// multichannel signals and produces single-channel output.
-//
-// The implemented nonlinear postfilter algorithm taken from "A Robust Nonlinear
-// Beamforming Postprocessor" by Bastiaan Kleijn.
-class NonlinearBeamformer : public LappedTransform::Callback {
- public:
-  static const float kHalfBeamWidthRadians;
-
-  explicit NonlinearBeamformer(
-      const std::vector<Point>& array_geometry,
-      size_t num_postfilter_channels = 1u,
-      SphericalPointf target_direction =
-          SphericalPointf(static_cast<float>(M_PI) / 2.f, 0.f, 1.f));
-  ~NonlinearBeamformer() override;
-
-  // Sample rate corresponds to the lower band.
-  // Needs to be called before the NonlinearBeamformer can be used.
-  virtual void Initialize(int chunk_size_ms, int sample_rate_hz);
-
-  // Analyzes one time-domain chunk of audio. The audio is expected to be split
-  // into frequency bands inside the ChannelBuffer. The number of frames and
-  // channels must correspond to the constructor parameters.
-  virtual void AnalyzeChunk(const ChannelBuffer<float>& data);
-
-  // Applies the postfilter mask to one chunk of audio. The audio is expected to
-  // be split into frequency bands inside the ChannelBuffer. The number of
-  // frames and channels must correspond to the constructor parameters.
-  virtual void PostFilter(ChannelBuffer<float>* data);
-
-  virtual void AimAt(const SphericalPointf& target_direction);
-
-  virtual bool IsInBeam(const SphericalPointf& spherical_point);
-
-  // After processing each block |is_target_present_| is set to true if the
-  // target signal es present and to false otherwise. This methods can be called
-  // to know if the data is target signal or interference and process it
-  // accordingly.
-  virtual bool is_target_present();
-
- protected:
-  // Process one frequency-domain block of audio. This is where the fun
-  // happens. Implements LappedTransform::Callback.
-  void ProcessAudioBlock(const complex<float>* const* input,
-                         size_t num_input_channels,
-                         size_t num_freq_bins,
-                         size_t num_output_channels,
-                         complex<float>* const* output) override;
-
- private:
-  FRIEND_TEST_ALL_PREFIXES(NonlinearBeamformerTest,
-                           InterfAnglesTakeAmbiguityIntoAccount);
-
-  typedef Matrix<float> MatrixF;
-  typedef ComplexMatrix<float> ComplexMatrixF;
-  typedef complex<float> complex_f;
-
-  void InitLowFrequencyCorrectionRanges();
-  void InitHighFrequencyCorrectionRanges();
-  void InitInterfAngles();
-  void InitDelaySumMasks();
-  void InitTargetCovMats();
-  void InitDiffuseCovMats();
-  void InitInterfCovMats();
-  void NormalizeCovMats();
-
-  // Calculates postfilter masks that minimize the mean squared error of our
-  // estimation of the desired signal.
-  float CalculatePostfilterMask(const ComplexMatrixF& interf_cov_mat,
-                                float rpsiw,
-                                float ratio_rxiw_rxim,
-                                float rmxi_r);
-
-  // Prevents the postfilter masks from degenerating too quickly (a cause of
-  // musical noise).
-  void ApplyMaskTimeSmoothing();
-  void ApplyMaskFrequencySmoothing();
-
-  // The postfilter masks are unreliable at low frequencies. Calculates a better
-  // mask by averaging mid-low frequency values.
-  void ApplyLowFrequencyCorrection();
-
-  // Postfilter masks are also unreliable at high frequencies. Average mid-high
-  // frequency masks to calculate a single mask per block which can be applied
-  // in the time-domain. Further, we average these block-masks over a chunk,
-  // resulting in one postfilter mask per audio chunk. This allows us to skip
-  // both transforming and blocking the high-frequency signal.
-  void ApplyHighFrequencyCorrection();
-
-  // Compute the means needed for the above frequency correction.
-  float MaskRangeMean(size_t start_bin, size_t end_bin);
-
-  // Applies post-filter mask to |input| and store in |output|.
-  void ApplyPostFilter(const complex_f* input, complex_f* output);
-
-  void EstimateTargetPresence();
-
-  static const size_t kFftSize = 256;
-  static const size_t kNumFreqBins = kFftSize / 2 + 1;
-
-  // Deals with the fft transform and blocking.
-  size_t chunk_length_;
-  std::unique_ptr<LappedTransform> process_transform_;
-  std::unique_ptr<PostFilterTransform> postfilter_transform_;
-  float window_[kFftSize];
-
-  // Parameters exposed to the user.
-  const size_t num_input_channels_;
-  const size_t num_postfilter_channels_;
-  int sample_rate_hz_;
-
-  const std::vector<Point> array_geometry_;
-  // The normal direction of the array if it has one and it is in the xy-plane.
-  const rtc::Optional<Point> array_normal_;
-
-  // Minimum spacing between microphone pairs.
-  const float min_mic_spacing_;
-
-  // Calculated based on user-input and constants in the .cc file.
-  size_t low_mean_start_bin_;
-  size_t low_mean_end_bin_;
-  size_t high_mean_start_bin_;
-  size_t high_mean_end_bin_;
-
-  // Quickly varying mask updated every block.
-  float new_mask_[kNumFreqBins];
-  // Time smoothed mask.
-  float time_smooth_mask_[kNumFreqBins];
-  // Time and frequency smoothed mask.
-  float final_mask_[kNumFreqBins];
-
-  float target_angle_radians_;
-  // Angles of the interferer scenarios.
-  std::vector<float> interf_angles_radians_;
-  // The angle between the target and the interferer scenarios.
-  const float away_radians_;
-
-  // Array of length |kNumFreqBins|, Matrix of size |1| x |num_channels_|.
-  ComplexMatrixF delay_sum_masks_[kNumFreqBins];
-
-  // Arrays of length |kNumFreqBins|, Matrix of size |num_input_channels_| x
-  // |num_input_channels_|.
-  ComplexMatrixF target_cov_mats_[kNumFreqBins];
-  ComplexMatrixF uniform_cov_mat_[kNumFreqBins];
-  // Array of length |kNumFreqBins|, Matrix of size |num_input_channels_| x
-  // |num_input_channels_|. The vector has a size equal to the number of
-  // interferer scenarios.
-  std::vector<std::unique_ptr<ComplexMatrixF>> interf_cov_mats_[kNumFreqBins];
-
-  // Of length |kNumFreqBins|.
-  float wave_numbers_[kNumFreqBins];
-
-  // Preallocated for ProcessAudioBlock()
-  // Of length |kNumFreqBins|.
-  float rxiws_[kNumFreqBins];
-  // The vector has a size equal to the number of interferer scenarios.
-  std::vector<float> rpsiws_[kNumFreqBins];
-
-  // The microphone normalization factor.
-  ComplexMatrixF eig_m_;
-
-  // For processing the high-frequency input signal.
-  float high_pass_postfilter_mask_;
-  float old_high_pass_mask_;
-
-  // True when the target signal is present.
-  bool is_target_present_;
-  // Number of blocks after which the data is considered interference if the
-  // mask does not pass |kMaskSignalThreshold|.
-  size_t hold_target_blocks_;
-  // Number of blocks since the last mask that passed |kMaskSignalThreshold|.
-  size_t interference_blocks_count_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_BEAMFORMER_NONLINEAR_BEAMFORMER_H_
diff --git a/modules/audio_processing/beamformer/nonlinear_beamformer_test.cc b/modules/audio_processing/beamformer/nonlinear_beamformer_test.cc
deleted file mode 100644
index 11b172a..0000000
--- a/modules/audio_processing/beamformer/nonlinear_beamformer_test.cc
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- *  Copyright (c) 2014 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 <vector>
-
-#include "webrtc/common_audio/channel_buffer.h"
-#include "webrtc/common_audio/wav_file.h"
-#include "webrtc/modules/audio_processing/beamformer/nonlinear_beamformer.h"
-#include "webrtc/modules/audio_processing/test/test_utils.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/flags.h"
-#include "webrtc/rtc_base/format_macros.h"
-
-DEFINE_string(i, "", "The name of the input file to read from.");
-DEFINE_string(o, "out.wav", "Name of the output file to write to.");
-DEFINE_string(mic_positions, "",
-    "Space delimited cartesian coordinates of microphones in meters. "
-    "The coordinates of each point are contiguous. "
-    "For a two element array: \"x1 y1 z1 x2 y2 z2\"");
-DEFINE_bool(help, false, "Prints this message.");
-
-namespace webrtc {
-namespace {
-
-const int kChunksPerSecond = 100;
-const int kChunkSizeMs = 1000 / kChunksPerSecond;
-
-const char kUsage[] =
-    "Command-line tool to run beamforming on WAV files. The signal is passed\n"
-    "in as a single band, unlike the audio processing interface which splits\n"
-    "signals into multiple bands.\n";
-
-}  // namespace
-
-int main(int argc, char* argv[]) {
-  if (rtc::FlagList::SetFlagsFromCommandLine(&argc, argv, true) ||
-      FLAG_help || argc != 1) {
-    printf("%s", kUsage);
-    if (FLAG_help) {
-      rtc::FlagList::Print(nullptr, false);
-      return 0;
-    }
-    return 1;
-  }
-
-  WavReader in_file(FLAG_i);
-  WavWriter out_file(FLAG_o, in_file.sample_rate(), in_file.num_channels());
-
-  const size_t num_mics = in_file.num_channels();
-  const std::vector<Point> array_geometry =
-      ParseArrayGeometry(FLAG_mic_positions, num_mics);
-  RTC_CHECK_EQ(array_geometry.size(), num_mics);
-
-  NonlinearBeamformer bf(array_geometry, array_geometry.size());
-  bf.Initialize(kChunkSizeMs, in_file.sample_rate());
-
-  printf("Input file: %s\nChannels: %" PRIuS ", Sample rate: %d Hz\n\n",
-         FLAG_i, in_file.num_channels(), in_file.sample_rate());
-  printf("Output file: %s\nChannels: %" PRIuS ", Sample rate: %d Hz\n\n",
-         FLAG_o, out_file.num_channels(), out_file.sample_rate());
-
-  ChannelBuffer<float> buf(
-      rtc::CheckedDivExact(in_file.sample_rate(), kChunksPerSecond),
-      in_file.num_channels());
-
-  std::vector<float> interleaved(buf.size());
-  while (in_file.ReadSamples(interleaved.size(),
-                             &interleaved[0]) == interleaved.size()) {
-    FloatS16ToFloat(&interleaved[0], interleaved.size(), &interleaved[0]);
-    Deinterleave(&interleaved[0], buf.num_frames(),
-                 buf.num_channels(), buf.channels());
-
-    bf.AnalyzeChunk(buf);
-    bf.PostFilter(&buf);
-
-    Interleave(buf.channels(), buf.num_frames(),
-               buf.num_channels(), &interleaved[0]);
-    FloatToFloatS16(&interleaved[0], interleaved.size(), &interleaved[0]);
-    out_file.WriteSamples(&interleaved[0], interleaved.size());
-  }
-
-  return 0;
-}
-
-}  // namespace webrtc
-
-int main(int argc, char* argv[]) {
-  return webrtc::main(argc, argv);
-}
diff --git a/modules/audio_processing/beamformer/nonlinear_beamformer_unittest.cc b/modules/audio_processing/beamformer/nonlinear_beamformer_unittest.cc
deleted file mode 100644
index bb1f0ef..0000000
--- a/modules/audio_processing/beamformer/nonlinear_beamformer_unittest.cc
+++ /dev/null
@@ -1,375 +0,0 @@
-/*
- *  Copyright (c) 2015 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.
- */
-
-// MSVC++ requires this to be set before any other includes to get M_PI.
-#define _USE_MATH_DEFINES
-
-#include "webrtc/modules/audio_processing/beamformer/nonlinear_beamformer.h"
-
-#include <math.h>
-
-#include "webrtc/api/array_view.h"
-#include "webrtc/modules/audio_processing/audio_buffer.h"
-#include "webrtc/modules/audio_processing/test/audio_buffer_tools.h"
-#include "webrtc/modules/audio_processing/test/bitexactness_tools.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-namespace {
-
-const int kChunkSizeMs = 10;
-const int kSampleRateHz = 16000;
-
-SphericalPointf AzimuthToSphericalPoint(float azimuth_radians) {
-  return SphericalPointf(azimuth_radians, 0.f, 1.f);
-}
-
-void Verify(NonlinearBeamformer* bf, float target_azimuth_radians) {
-  EXPECT_TRUE(bf->IsInBeam(AzimuthToSphericalPoint(target_azimuth_radians)));
-  EXPECT_TRUE(bf->IsInBeam(AzimuthToSphericalPoint(
-      target_azimuth_radians - NonlinearBeamformer::kHalfBeamWidthRadians +
-      0.001f)));
-  EXPECT_TRUE(bf->IsInBeam(AzimuthToSphericalPoint(
-      target_azimuth_radians + NonlinearBeamformer::kHalfBeamWidthRadians -
-      0.001f)));
-  EXPECT_FALSE(bf->IsInBeam(AzimuthToSphericalPoint(
-      target_azimuth_radians - NonlinearBeamformer::kHalfBeamWidthRadians -
-      0.001f)));
-  EXPECT_FALSE(bf->IsInBeam(AzimuthToSphericalPoint(
-      target_azimuth_radians + NonlinearBeamformer::kHalfBeamWidthRadians +
-      0.001f)));
-}
-
-void AimAndVerify(NonlinearBeamformer* bf, float target_azimuth_radians) {
-  bf->AimAt(AzimuthToSphericalPoint(target_azimuth_radians));
-  Verify(bf, target_azimuth_radians);
-}
-
-// Bitexactness test code.
-const size_t kNumFramesToProcess = 1000;
-
-void ProcessOneFrame(int sample_rate_hz,
-                     AudioBuffer* capture_audio_buffer,
-                     NonlinearBeamformer* beamformer) {
-  if (sample_rate_hz > AudioProcessing::kSampleRate16kHz) {
-    capture_audio_buffer->SplitIntoFrequencyBands();
-  }
-
-  beamformer->AnalyzeChunk(*capture_audio_buffer->split_data_f());
-  capture_audio_buffer->set_num_channels(1);
-  beamformer->PostFilter(capture_audio_buffer->split_data_f());
-
-  if (sample_rate_hz > AudioProcessing::kSampleRate16kHz) {
-    capture_audio_buffer->MergeFrequencyBands();
-  }
-}
-
-int BeamformerSampleRate(int sample_rate_hz) {
-  return (sample_rate_hz > AudioProcessing::kSampleRate16kHz
-              ? AudioProcessing::kSampleRate16kHz
-              : sample_rate_hz);
-}
-
-void RunBitExactnessTest(int sample_rate_hz,
-                         const std::vector<Point>& array_geometry,
-                         const SphericalPointf& target_direction,
-                         rtc::ArrayView<const float> output_reference) {
-  NonlinearBeamformer beamformer(array_geometry, 1u, target_direction);
-  beamformer.Initialize(AudioProcessing::kChunkSizeMs,
-                        BeamformerSampleRate(sample_rate_hz));
-
-  const StreamConfig capture_config(sample_rate_hz, array_geometry.size(),
-                                    false);
-  AudioBuffer capture_buffer(
-      capture_config.num_frames(), capture_config.num_channels(),
-      capture_config.num_frames(), capture_config.num_channels(),
-      capture_config.num_frames());
-  test::InputAudioFile capture_file(
-      test::GetApmCaptureTestVectorFileName(sample_rate_hz));
-  std::vector<float> capture_input(capture_config.num_frames() *
-                                   capture_config.num_channels());
-  for (size_t frame_no = 0u; frame_no < kNumFramesToProcess; ++frame_no) {
-    ReadFloatSamplesFromStereoFile(capture_config.num_frames(),
-                                   capture_config.num_channels(), &capture_file,
-                                   capture_input);
-
-    test::CopyVectorToAudioBuffer(capture_config, capture_input,
-                                  &capture_buffer);
-
-    ProcessOneFrame(sample_rate_hz, &capture_buffer, &beamformer);
-  }
-
-  // Extract and verify the test results.
-  std::vector<float> capture_output;
-  test::ExtractVectorFromAudioBuffer(capture_config, &capture_buffer,
-                                     &capture_output);
-
-  const float kElementErrorBound = 1.f / static_cast<float>(1 << 15);
-
-  // Compare the output with the reference. Only the first values of the output
-  // from last frame processed are compared in order not having to specify all
-  // preceeding frames as testvectors. As the algorithm being tested has a
-  // memory, testing only the last frame implicitly also tests the preceeding
-  // frames.
-  EXPECT_TRUE(test::VerifyDeinterleavedArray(
-      capture_config.num_frames(), capture_config.num_channels(),
-      output_reference, capture_output, kElementErrorBound));
-}
-
-// TODO(peah): Add bitexactness tests for scenarios with more than 2 input
-// channels.
-std::vector<Point> CreateArrayGeometry(int variant) {
-  std::vector<Point> array_geometry;
-  switch (variant) {
-    case 1:
-      array_geometry.push_back(Point(-0.025f, 0.f, 0.f));
-      array_geometry.push_back(Point(0.025f, 0.f, 0.f));
-      break;
-    case 2:
-      array_geometry.push_back(Point(-0.035f, 0.f, 0.f));
-      array_geometry.push_back(Point(0.035f, 0.f, 0.f));
-      break;
-    case 3:
-      array_geometry.push_back(Point(-0.5f, 0.f, 0.f));
-      array_geometry.push_back(Point(0.5f, 0.f, 0.f));
-      break;
-    default:
-      RTC_CHECK(false);
-  }
-  return array_geometry;
-}
-
-const SphericalPointf TargetDirection1(0.4f * static_cast<float>(M_PI) / 2.f,
-                                       0.f,
-                                       1.f);
-const SphericalPointf TargetDirection2(static_cast<float>(M_PI) / 2.f,
-                                       1.f,
-                                       2.f);
-
-}  // namespace
-
-TEST(NonlinearBeamformerTest, AimingModifiesBeam) {
-  std::vector<Point> array_geometry;
-  array_geometry.push_back(Point(-0.025f, 0.f, 0.f));
-  array_geometry.push_back(Point(0.025f, 0.f, 0.f));
-  NonlinearBeamformer bf(array_geometry, 1u);
-  bf.Initialize(kChunkSizeMs, kSampleRateHz);
-  // The default constructor parameter sets the target angle to PI / 2.
-  Verify(&bf, static_cast<float>(M_PI) / 2.f);
-  AimAndVerify(&bf, static_cast<float>(M_PI) / 3.f);
-  AimAndVerify(&bf, 3.f * static_cast<float>(M_PI) / 4.f);
-  AimAndVerify(&bf, static_cast<float>(M_PI) / 6.f);
-  AimAndVerify(&bf, static_cast<float>(M_PI));
-}
-
-TEST(NonlinearBeamformerTest, InterfAnglesTakeAmbiguityIntoAccount) {
-  {
-    // For linear arrays there is ambiguity.
-    std::vector<Point> array_geometry;
-    array_geometry.push_back(Point(-0.1f, 0.f, 0.f));
-    array_geometry.push_back(Point(0.f, 0.f, 0.f));
-    array_geometry.push_back(Point(0.2f, 0.f, 0.f));
-    NonlinearBeamformer bf(array_geometry, 1u);
-    bf.Initialize(kChunkSizeMs, kSampleRateHz);
-    EXPECT_EQ(2u, bf.interf_angles_radians_.size());
-    EXPECT_FLOAT_EQ(M_PI / 2.f - bf.away_radians_,
-                    bf.interf_angles_radians_[0]);
-    EXPECT_FLOAT_EQ(M_PI / 2.f + bf.away_radians_,
-                    bf.interf_angles_radians_[1]);
-    bf.AimAt(AzimuthToSphericalPoint(bf.away_radians_ / 2.f));
-    EXPECT_EQ(2u, bf.interf_angles_radians_.size());
-    EXPECT_FLOAT_EQ(M_PI - bf.away_radians_ / 2.f,
-                    bf.interf_angles_radians_[0]);
-    EXPECT_FLOAT_EQ(3.f * bf.away_radians_ / 2.f, bf.interf_angles_radians_[1]);
-  }
-  {
-    // For planar arrays with normal in the xy-plane there is ambiguity.
-    std::vector<Point> array_geometry;
-    array_geometry.push_back(Point(-0.1f, 0.f, 0.f));
-    array_geometry.push_back(Point(0.f, 0.f, 0.f));
-    array_geometry.push_back(Point(0.2f, 0.f, 0.f));
-    array_geometry.push_back(Point(0.1f, 0.f, 0.2f));
-    array_geometry.push_back(Point(0.f, 0.f, -0.1f));
-    NonlinearBeamformer bf(array_geometry, 1u);
-    bf.Initialize(kChunkSizeMs, kSampleRateHz);
-    EXPECT_EQ(2u, bf.interf_angles_radians_.size());
-    EXPECT_FLOAT_EQ(M_PI / 2.f - bf.away_radians_,
-                    bf.interf_angles_radians_[0]);
-    EXPECT_FLOAT_EQ(M_PI / 2.f + bf.away_radians_,
-                    bf.interf_angles_radians_[1]);
-    bf.AimAt(AzimuthToSphericalPoint(bf.away_radians_ / 2.f));
-    EXPECT_EQ(2u, bf.interf_angles_radians_.size());
-    EXPECT_FLOAT_EQ(M_PI - bf.away_radians_ / 2.f,
-                    bf.interf_angles_radians_[0]);
-    EXPECT_FLOAT_EQ(3.f * bf.away_radians_ / 2.f, bf.interf_angles_radians_[1]);
-  }
-  {
-    // For planar arrays with normal not in the xy-plane there is no ambiguity.
-    std::vector<Point> array_geometry;
-    array_geometry.push_back(Point(0.f, 0.f, 0.f));
-    array_geometry.push_back(Point(0.2f, 0.f, 0.f));
-    array_geometry.push_back(Point(0.f, 0.1f, -0.2f));
-    NonlinearBeamformer bf(array_geometry, 1u);
-    bf.Initialize(kChunkSizeMs, kSampleRateHz);
-    EXPECT_EQ(2u, bf.interf_angles_radians_.size());
-    EXPECT_FLOAT_EQ(M_PI / 2.f - bf.away_radians_,
-                    bf.interf_angles_radians_[0]);
-    EXPECT_FLOAT_EQ(M_PI / 2.f + bf.away_radians_,
-                    bf.interf_angles_radians_[1]);
-    bf.AimAt(AzimuthToSphericalPoint(bf.away_radians_ / 2.f));
-    EXPECT_EQ(2u, bf.interf_angles_radians_.size());
-    EXPECT_FLOAT_EQ(-bf.away_radians_ / 2.f, bf.interf_angles_radians_[0]);
-    EXPECT_FLOAT_EQ(3.f * bf.away_radians_ / 2.f, bf.interf_angles_radians_[1]);
-  }
-  {
-    // For arrays which are not linear or planar there is no ambiguity.
-    std::vector<Point> array_geometry;
-    array_geometry.push_back(Point(0.f, 0.f, 0.f));
-    array_geometry.push_back(Point(0.1f, 0.f, 0.f));
-    array_geometry.push_back(Point(0.f, 0.2f, 0.f));
-    array_geometry.push_back(Point(0.f, 0.f, 0.3f));
-    NonlinearBeamformer bf(array_geometry, 1u);
-    bf.Initialize(kChunkSizeMs, kSampleRateHz);
-    EXPECT_EQ(2u, bf.interf_angles_radians_.size());
-    EXPECT_FLOAT_EQ(M_PI / 2.f - bf.away_radians_,
-                    bf.interf_angles_radians_[0]);
-    EXPECT_FLOAT_EQ(M_PI / 2.f + bf.away_radians_,
-                    bf.interf_angles_radians_[1]);
-    bf.AimAt(AzimuthToSphericalPoint(bf.away_radians_ / 2.f));
-    EXPECT_EQ(2u, bf.interf_angles_radians_.size());
-    EXPECT_FLOAT_EQ(-bf.away_radians_ / 2.f, bf.interf_angles_radians_[0]);
-    EXPECT_FLOAT_EQ(3.f * bf.away_radians_ / 2.f, bf.interf_angles_radians_[1]);
-  }
-}
-
-// TODO(peah): Investigate why the nonlinear_beamformer.cc causes a DCHECK in
-// this setup.
-TEST(BeamformerBitExactnessTest,
-     DISABLED_Stereo8kHz_ArrayGeometry1_TargetDirection1) {
-  const float kOutputReference[] = {0.001318f, -0.001091f, 0.000990f,
-                                    0.001318f, -0.001091f, 0.000990f};
-
-  RunBitExactnessTest(AudioProcessing::kSampleRate8kHz, CreateArrayGeometry(1),
-                      TargetDirection1, kOutputReference);
-}
-
-TEST(BeamformerBitExactnessTest,
-     Stereo16kHz_ArrayGeometry1_TargetDirection1) {
-  const float kOutputReference[] = {-0.000077f, -0.000147f, -0.000138f,
-                                    -0.000077f, -0.000147f, -0.000138f};
-
-  RunBitExactnessTest(AudioProcessing::kSampleRate16kHz, CreateArrayGeometry(1),
-                      TargetDirection1, kOutputReference);
-}
-
-TEST(BeamformerBitExactnessTest,
-     Stereo32kHz_ArrayGeometry1_TargetDirection1) {
-  const float kOutputReference[] = {-0.000061f, -0.000061f, -0.000061f,
-                                    -0.000061f, -0.000061f, -0.000061f};
-
-  RunBitExactnessTest(AudioProcessing::kSampleRate32kHz, CreateArrayGeometry(1),
-                      TargetDirection1, kOutputReference);
-}
-
-TEST(BeamformerBitExactnessTest,
-     Stereo48kHz_ArrayGeometry1_TargetDirection1) {
-  const float kOutputReference[] = {0.000450f, 0.000436f, 0.000433f,
-                                    0.000450f, 0.000436f, 0.000433f};
-
-  RunBitExactnessTest(AudioProcessing::kSampleRate48kHz, CreateArrayGeometry(1),
-                      TargetDirection1, kOutputReference);
-}
-
-// TODO(peah): Investigate why the nonlinear_beamformer.cc causes a DCHECK in
-// this setup.
-TEST(BeamformerBitExactnessTest,
-     DISABLED_Stereo8kHz_ArrayGeometry1_TargetDirection2) {
-  const float kOutputReference[] = {0.001144f,  -0.001026f, 0.001074f,
-                                    -0.016205f, -0.007324f, -0.015656f};
-
-  RunBitExactnessTest(AudioProcessing::kSampleRate8kHz, CreateArrayGeometry(1),
-                      TargetDirection2, kOutputReference);
-}
-
-TEST(BeamformerBitExactnessTest,
-     Stereo16kHz_ArrayGeometry1_TargetDirection2) {
-  const float kOutputReference[] = {0.000221f, -0.000249f, 0.000140f,
-                                    0.000221f, -0.000249f, 0.000140f};
-
-  RunBitExactnessTest(AudioProcessing::kSampleRate16kHz, CreateArrayGeometry(1),
-                      TargetDirection2, kOutputReference);
-}
-
-TEST(BeamformerBitExactnessTest,
-     Stereo32kHz_ArrayGeometry1_TargetDirection2) {
-  const float kOutputReference[] = {0.000763f, -0.000336f, 0.000549f,
-                                    0.000763f, -0.000336f, 0.000549f};
-
-  RunBitExactnessTest(AudioProcessing::kSampleRate32kHz, CreateArrayGeometry(1),
-                      TargetDirection2, kOutputReference);
-}
-
-TEST(BeamformerBitExactnessTest,
-     Stereo48kHz_ArrayGeometry1_TargetDirection2) {
-  const float kOutputReference[] = {-0.000004f, -0.000494f, 0.000255f,
-                                    -0.000004f, -0.000494f, 0.000255f};
-
-  RunBitExactnessTest(AudioProcessing::kSampleRate48kHz, CreateArrayGeometry(1),
-                      TargetDirection2, kOutputReference);
-}
-
-TEST(BeamformerBitExactnessTest,
-     Stereo8kHz_ArrayGeometry2_TargetDirection2) {
-  const float kOutputReference[] = {-0.000914f, 0.002170f, -0.002382f,
-                                    -0.000914f, 0.002170f, -0.002382f};
-
-  RunBitExactnessTest(AudioProcessing::kSampleRate8kHz, CreateArrayGeometry(2),
-                      TargetDirection2, kOutputReference);
-}
-
-TEST(BeamformerBitExactnessTest,
-     Stereo16kHz_ArrayGeometry2_TargetDirection2) {
-  const float kOutputReference[] = {0.000179f, -0.000179f, 0.000081f,
-                                    0.000179f, -0.000179f, 0.000081f};
-
-  RunBitExactnessTest(AudioProcessing::kSampleRate16kHz, CreateArrayGeometry(2),
-                      TargetDirection2, kOutputReference);
-}
-
-TEST(BeamformerBitExactnessTest,
-     Stereo32kHz_ArrayGeometry2_TargetDirection2) {
-  const float kOutputReference[] = {0.000549f, -0.000214f, 0.000366f,
-                                    0.000549f, -0.000214f, 0.000366f};
-
-  RunBitExactnessTest(AudioProcessing::kSampleRate32kHz, CreateArrayGeometry(2),
-                      TargetDirection2, kOutputReference);
-}
-
-TEST(BeamformerBitExactnessTest,
-     Stereo48kHz_ArrayGeometry2_TargetDirection2) {
-  const float kOutputReference[] = {0.000019f, -0.000310f, 0.000182f,
-                                    0.000019f, -0.000310f, 0.000182f};
-
-  RunBitExactnessTest(AudioProcessing::kSampleRate48kHz, CreateArrayGeometry(2),
-                      TargetDirection2, kOutputReference);
-}
-
-// TODO(peah): Investigate why the nonlinear_beamformer.cc causes a DCHECK in
-// this setup.
-TEST(BeamformerBitExactnessTest,
-     DISABLED_Stereo16kHz_ArrayGeometry3_TargetDirection1) {
-  const float kOutputReference[] = {-0.000161f, 0.000171f, -0.000096f,
-                                    0.001007f,  0.000427f, 0.000977f};
-
-  RunBitExactnessTest(AudioProcessing::kSampleRate16kHz, CreateArrayGeometry(3),
-                      TargetDirection1, kOutputReference);
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/common.h b/modules/audio_processing/common.h
deleted file mode 100644
index 30cee94..0000000
--- a/modules/audio_processing/common.h
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- *  Copyright (c) 2014 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_PROCESSING_COMMON_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_COMMON_H_
-
-#include "webrtc/modules/audio_processing/include/audio_processing.h"
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-
-static inline size_t ChannelsFromLayout(AudioProcessing::ChannelLayout layout) {
-  switch (layout) {
-    case AudioProcessing::kMono:
-    case AudioProcessing::kMonoAndKeyboard:
-      return 1;
-    case AudioProcessing::kStereo:
-    case AudioProcessing::kStereoAndKeyboard:
-      return 2;
-  }
-  RTC_NOTREACHED();
-  return 0;
-}
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_COMMON_H_
diff --git a/modules/audio_processing/config_unittest.cc b/modules/audio_processing/config_unittest.cc
deleted file mode 100644
index 33f4ed1..0000000
--- a/modules/audio_processing/config_unittest.cc
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- *  Copyright (c) 2013 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_processing/include/config.h"
-
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-namespace {
-
-struct MyExperiment {
-  static const ConfigOptionID identifier = ConfigOptionID::kMyExperimentForTest;
-  static const int kDefaultFactor;
-  static const int kDefaultOffset;
-
-  MyExperiment()
-    : factor(kDefaultFactor), offset(kDefaultOffset) {}
-
-  MyExperiment(int factor, int offset)
-    : factor(factor), offset(offset) {}
-
-  int factor;
-  int offset;
-};
-
-const int MyExperiment::kDefaultFactor = 1;
-const int MyExperiment::kDefaultOffset = 2;
-
-TEST(Config, ReturnsDefaultInstanceIfNotConfigured) {
-  Config config;
-  const MyExperiment& my_exp = config.Get<MyExperiment>();
-  EXPECT_EQ(MyExperiment::kDefaultFactor, my_exp.factor);
-  EXPECT_EQ(MyExperiment::kDefaultOffset, my_exp.offset);
-}
-
-TEST(Config, ReturnOptionWhenSet) {
-  Config config;
-  config.Set<MyExperiment>(new MyExperiment(5, 1));
-  const MyExperiment& my_exp = config.Get<MyExperiment>();
-  EXPECT_EQ(5, my_exp.factor);
-  EXPECT_EQ(1, my_exp.offset);
-}
-
-TEST(Config, SetNullSetsTheOptionBackToDefault) {
-  Config config;
-  config.Set<MyExperiment>(new MyExperiment(5, 1));
-  config.Set<MyExperiment>(NULL);
-  const MyExperiment& my_exp = config.Get<MyExperiment>();
-  EXPECT_EQ(MyExperiment::kDefaultFactor, my_exp.factor);
-  EXPECT_EQ(MyExperiment::kDefaultOffset, my_exp.offset);
-}
-
-struct Algo1_CostFunction {
-  static const ConfigOptionID identifier =
-      ConfigOptionID::kAlgo1CostFunctionForTest;
-  Algo1_CostFunction() {}
-
-  virtual int cost(int x) const {
-    return x;
-  }
-
-  virtual ~Algo1_CostFunction() {}
-};
-
-struct SqrCost : Algo1_CostFunction {
-  virtual int cost(int x) const {
-    return x*x;
-  }
-};
-
-TEST(Config, SupportsPolymorphism) {
-  Config config;
-  config.Set<Algo1_CostFunction>(new SqrCost());
-  EXPECT_EQ(25, config.Get<Algo1_CostFunction>().cost(5));
-}
-}  // namespace
-}  // namespace webrtc
diff --git a/modules/audio_processing/debug.proto b/modules/audio_processing/debug.proto
deleted file mode 100644
index 4417773..0000000
--- a/modules/audio_processing/debug.proto
+++ /dev/null
@@ -1,94 +0,0 @@
-syntax = "proto2";
-option optimize_for = LITE_RUNTIME;
-package webrtc.audioproc;
-
-// Contains the format of input/output/reverse audio. An Init message is added
-// when any of the fields are changed.
-message Init {
-  optional int32 sample_rate = 1;
-  optional int32 device_sample_rate = 2 [deprecated=true];
-  optional int32 num_input_channels = 3;
-  optional int32 num_output_channels = 4;
-  optional int32 num_reverse_channels = 5;
-  optional int32 reverse_sample_rate = 6;
-  optional int32 output_sample_rate = 7;
-  optional int32 reverse_output_sample_rate = 8;
-  optional int32 num_reverse_output_channels = 9;
-}
-
-// May contain interleaved or deinterleaved data, but don't store both formats.
-message ReverseStream {
-  // int16 interleaved data.
-  optional bytes data = 1;
-
-  // float deinterleaved data, where each repeated element points to a single
-  // channel buffer of data.
-  repeated bytes channel = 2;
-}
-
-// May contain interleaved or deinterleaved data, but don't store both formats.
-message Stream {
-  // int16 interleaved data.
-  optional bytes input_data = 1;
-  optional bytes output_data = 2;
-
-  optional int32 delay = 3;
-  optional sint32 drift = 4;
-  optional int32 level = 5;
-  optional bool keypress = 6;
-
-  // float deinterleaved data, where each repeated element points to a single
-  // channel buffer of data.
-  repeated bytes input_channel = 7;
-  repeated bytes output_channel = 8;
-}
-
-// Contains the configurations of various APM component. A Config message is
-// added when any of the fields are changed.
-message Config {
-  // Next field number 19.
-  // Acoustic echo canceler.
-  optional bool aec_enabled = 1;
-  optional bool aec_delay_agnostic_enabled = 2;
-  optional bool aec_drift_compensation_enabled = 3;
-  optional bool aec_extended_filter_enabled = 4;
-  optional int32 aec_suppression_level = 5;
-  // Mobile AEC.
-  optional bool aecm_enabled = 6;
-  optional bool aecm_comfort_noise_enabled = 7;
-  optional int32 aecm_routing_mode = 8;
-  // Automatic gain controller.
-  optional bool agc_enabled = 9;
-  optional int32 agc_mode = 10;
-  optional bool agc_limiter_enabled = 11;
-  optional bool noise_robust_agc_enabled = 12;
-  // High pass filter.
-  optional bool hpf_enabled = 13;
-  // Noise suppression.
-  optional bool ns_enabled = 14;
-  optional int32 ns_level = 15;
-  // Transient suppression.
-  optional bool transient_suppression_enabled = 16;
-  // Semicolon-separated string containing experimental feature
-  // descriptions.
-  optional string experiments_description = 17;
-  // Intelligibility Enhancer
-  optional bool intelligibility_enhancer_enabled = 18;
-}
-
-message Event {
-  enum Type {
-    INIT = 0;
-    REVERSE_STREAM = 1;
-    STREAM = 2;
-    CONFIG = 3;
-    UNKNOWN_EVENT = 4;
-  }
-
-  required Type type = 1;
-
-  optional Init init = 2;
-  optional ReverseStream reverse_stream = 3;
-  optional Stream stream = 4;
-  optional Config config = 5;
-}
diff --git a/modules/audio_processing/echo_cancellation_bit_exact_unittest.cc b/modules/audio_processing/echo_cancellation_bit_exact_unittest.cc
deleted file mode 100644
index c4cd768..0000000
--- a/modules/audio_processing/echo_cancellation_bit_exact_unittest.cc
+++ /dev/null
@@ -1,357 +0,0 @@
-/*
- *  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 <vector>
-
-#include "webrtc/api/array_view.h"
-#include "webrtc/modules/audio_processing/audio_buffer.h"
-#include "webrtc/modules/audio_processing/echo_cancellation_impl.h"
-#include "webrtc/modules/audio_processing/test/audio_buffer_tools.h"
-#include "webrtc/modules/audio_processing/test/bitexactness_tools.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-namespace {
-
-const int kNumFramesToProcess = 100;
-
-void SetupComponent(int sample_rate_hz,
-                    EchoCancellation::SuppressionLevel suppression_level,
-                    bool drift_compensation_enabled,
-                    EchoCancellationImpl* echo_canceller) {
-  echo_canceller->Initialize(sample_rate_hz, 1, 1, 1);
-  EchoCancellation* ec = static_cast<EchoCancellation*>(echo_canceller);
-  ec->Enable(true);
-  ec->set_suppression_level(suppression_level);
-  ec->enable_drift_compensation(drift_compensation_enabled);
-
-  Config config;
-  config.Set<DelayAgnostic>(new DelayAgnostic(true));
-  config.Set<ExtendedFilter>(new ExtendedFilter(true));
-  echo_canceller->SetExtraOptions(config);
-}
-
-void ProcessOneFrame(int sample_rate_hz,
-                     int stream_delay_ms,
-                     bool drift_compensation_enabled,
-                     int stream_drift_samples,
-                     AudioBuffer* render_audio_buffer,
-                     AudioBuffer* capture_audio_buffer,
-                     EchoCancellationImpl* echo_canceller) {
-  if (sample_rate_hz > AudioProcessing::kSampleRate16kHz) {
-    render_audio_buffer->SplitIntoFrequencyBands();
-    capture_audio_buffer->SplitIntoFrequencyBands();
-  }
-
-  std::vector<float> render_audio;
-  EchoCancellationImpl::PackRenderAudioBuffer(
-      render_audio_buffer, 1, render_audio_buffer->num_channels(),
-      &render_audio);
-  echo_canceller->ProcessRenderAudio(render_audio);
-
-  if (drift_compensation_enabled) {
-    static_cast<EchoCancellation*>(echo_canceller)
-        ->set_stream_drift_samples(stream_drift_samples);
-  }
-
-  echo_canceller->ProcessCaptureAudio(capture_audio_buffer, stream_delay_ms);
-
-  if (sample_rate_hz > AudioProcessing::kSampleRate16kHz) {
-    capture_audio_buffer->MergeFrequencyBands();
-  }
-}
-
-void RunBitexactnessTest(int sample_rate_hz,
-                         size_t num_channels,
-                         int stream_delay_ms,
-                         bool drift_compensation_enabled,
-                         int stream_drift_samples,
-                         EchoCancellation::SuppressionLevel suppression_level,
-                         bool stream_has_echo_reference,
-                         const rtc::ArrayView<const float>& output_reference) {
-  rtc::CriticalSection crit_render;
-  rtc::CriticalSection crit_capture;
-  EchoCancellationImpl echo_canceller(&crit_render, &crit_capture);
-  SetupComponent(sample_rate_hz, suppression_level, drift_compensation_enabled,
-                 &echo_canceller);
-
-  const int samples_per_channel = rtc::CheckedDivExact(sample_rate_hz, 100);
-  const StreamConfig render_config(sample_rate_hz, num_channels, false);
-  AudioBuffer render_buffer(
-      render_config.num_frames(), render_config.num_channels(),
-      render_config.num_frames(), 1, render_config.num_frames());
-  test::InputAudioFile render_file(
-      test::GetApmRenderTestVectorFileName(sample_rate_hz));
-  std::vector<float> render_input(samples_per_channel * num_channels);
-
-  const StreamConfig capture_config(sample_rate_hz, num_channels, false);
-  AudioBuffer capture_buffer(
-      capture_config.num_frames(), capture_config.num_channels(),
-      capture_config.num_frames(), 1, capture_config.num_frames());
-  test::InputAudioFile capture_file(
-      test::GetApmCaptureTestVectorFileName(sample_rate_hz));
-  std::vector<float> capture_input(samples_per_channel * num_channels);
-
-  for (int frame_no = 0; frame_no < kNumFramesToProcess; ++frame_no) {
-    ReadFloatSamplesFromStereoFile(samples_per_channel, num_channels,
-                                   &render_file, render_input);
-    ReadFloatSamplesFromStereoFile(samples_per_channel, num_channels,
-                                   &capture_file, capture_input);
-
-    test::CopyVectorToAudioBuffer(render_config, render_input, &render_buffer);
-    test::CopyVectorToAudioBuffer(capture_config, capture_input,
-                                  &capture_buffer);
-
-    ProcessOneFrame(sample_rate_hz, stream_delay_ms, drift_compensation_enabled,
-                    stream_drift_samples, &render_buffer, &capture_buffer,
-                    &echo_canceller);
-  }
-
-  // Extract and verify the test results.
-  std::vector<float> capture_output;
-  test::ExtractVectorFromAudioBuffer(capture_config, &capture_buffer,
-                                     &capture_output);
-
-  EXPECT_EQ(stream_has_echo_reference,
-            static_cast<EchoCancellation*>(&echo_canceller)->stream_has_echo());
-
-  // Compare the output with the reference. Only the first values of the output
-  // from last frame processed are compared in order not having to specify all
-  // preceeding frames as testvectors. As the algorithm being tested has a
-  // memory, testing only the last frame implicitly also tests the preceeding
-  // frames.
-  const float kElementErrorBound = 1.0f / 32768.0f;
-  EXPECT_TRUE(test::VerifyDeinterleavedArray(
-      capture_config.num_frames(), capture_config.num_channels(),
-      output_reference, capture_output, kElementErrorBound));
-}
-
-const bool kStreamHasEchoReference = true;
-
-}  // namespace
-
-// TODO(peah): Activate all these tests for ARM and ARM64 once the issue on the
-// Chromium ARM and ARM64 boths have been identified. This is tracked in the
-// issue https://bugs.chromium.org/p/webrtc/issues/detail?id=5711.
-
-#if !(defined(WEBRTC_ARCH_ARM64) || defined(WEBRTC_ARCH_ARM) || \
-      defined(WEBRTC_ANDROID))
-TEST(EchoCancellationBitExactnessTest,
-     Mono8kHz_HighLevel_NoDrift_StreamDelay0) {
-#else
-TEST(EchoCancellationBitExactnessTest,
-     DISABLED_Mono8kHz_HighLevel_NoDrift_StreamDelay0) {
-#endif
-  const float kOutputReference[] = {-0.000646f, -0.001525f, 0.002688f};
-  RunBitexactnessTest(8000, 1, 0, false, 0,
-                      EchoCancellation::SuppressionLevel::kHighSuppression,
-                      kStreamHasEchoReference, kOutputReference);
-}
-
-#if !(defined(WEBRTC_ARCH_ARM64) || defined(WEBRTC_ARCH_ARM) || \
-      defined(WEBRTC_ANDROID))
-TEST(EchoCancellationBitExactnessTest,
-     Mono16kHz_HighLevel_NoDrift_StreamDelay0) {
-#else
-TEST(EchoCancellationBitExactnessTest,
-     DISABLED_Mono16kHz_HighLevel_NoDrift_StreamDelay0) {
-#endif
-  const float kOutputReference[] = {0.000055f, 0.000421f, 0.001149f};
-  RunBitexactnessTest(16000, 1, 0, false, 0,
-                      EchoCancellation::SuppressionLevel::kHighSuppression,
-                      kStreamHasEchoReference, kOutputReference);
-}
-
-#if !(defined(WEBRTC_ARCH_ARM64) || defined(WEBRTC_ARCH_ARM) || \
-      defined(WEBRTC_ANDROID))
-TEST(EchoCancellationBitExactnessTest,
-     Mono32kHz_HighLevel_NoDrift_StreamDelay0) {
-#else
-TEST(EchoCancellationBitExactnessTest,
-     DISABLED_Mono32kHz_HighLevel_NoDrift_StreamDelay0) {
-#endif
-  const float kOutputReference[] = {-0.000671f, 0.000061f, -0.000031f};
-  RunBitexactnessTest(32000, 1, 0, false, 0,
-                      EchoCancellation::SuppressionLevel::kHighSuppression,
-                      kStreamHasEchoReference, kOutputReference);
-}
-
-#if !(defined(WEBRTC_ARCH_ARM64) || defined(WEBRTC_ARCH_ARM) || \
-      defined(WEBRTC_ANDROID))
-TEST(EchoCancellationBitExactnessTest,
-     Mono48kHz_HighLevel_NoDrift_StreamDelay0) {
-#else
-TEST(EchoCancellationBitExactnessTest,
-     DISABLED_Mono48kHz_HighLevel_NoDrift_StreamDelay0) {
-#endif
-  const float kOutputReference[] = {-0.001403f, -0.001411f, -0.000755f};
-  RunBitexactnessTest(48000, 1, 0, false, 0,
-                      EchoCancellation::SuppressionLevel::kHighSuppression,
-                      kStreamHasEchoReference, kOutputReference);
-}
-
-#if !(defined(WEBRTC_ARCH_ARM64) || defined(WEBRTC_ARCH_ARM) || \
-      defined(WEBRTC_ANDROID))
-TEST(EchoCancellationBitExactnessTest,
-     Mono16kHz_LowLevel_NoDrift_StreamDelay0) {
-#else
-TEST(EchoCancellationBitExactnessTest,
-     DISABLED_Mono16kHz_LowLevel_NoDrift_StreamDelay0) {
-#endif
-#if defined(WEBRTC_MAC)
-  const float kOutputReference[] = {-0.000145f, 0.000179f, 0.000917f};
-#else
-  const float kOutputReference[] = {-0.000009f, 0.000363f, 0.001094f};
-#endif
-  RunBitexactnessTest(16000, 1, 0, false, 0,
-                      EchoCancellation::SuppressionLevel::kLowSuppression,
-                      kStreamHasEchoReference, kOutputReference);
-}
-
-#if !(defined(WEBRTC_ARCH_ARM64) || defined(WEBRTC_ARCH_ARM) || \
-      defined(WEBRTC_ANDROID))
-TEST(EchoCancellationBitExactnessTest,
-     Mono16kHz_ModerateLevel_NoDrift_StreamDelay0) {
-#else
-TEST(EchoCancellationBitExactnessTest,
-     DISABLED_Mono16kHz_ModerateLevel_NoDrift_StreamDelay0) {
-#endif
-  const float kOutputReference[] = {0.000055f, 0.000421f, 0.001149f};
-  RunBitexactnessTest(16000, 1, 0, false, 0,
-                      EchoCancellation::SuppressionLevel::kModerateSuppression,
-                      kStreamHasEchoReference, kOutputReference);
-}
-
-#if !(defined(WEBRTC_ARCH_ARM64) || defined(WEBRTC_ARCH_ARM) || \
-      defined(WEBRTC_ANDROID))
-TEST(EchoCancellationBitExactnessTest,
-     Mono16kHz_HighLevel_NoDrift_StreamDelay10) {
-#else
-TEST(EchoCancellationBitExactnessTest,
-     DISABLED_Mono16kHz_HighLevel_NoDrift_StreamDelay10) {
-#endif
-  const float kOutputReference[] = {0.000055f, 0.000421f, 0.001149f};
-  RunBitexactnessTest(16000, 1, 10, false, 0,
-                      EchoCancellation::SuppressionLevel::kHighSuppression,
-                      kStreamHasEchoReference, kOutputReference);
-}
-
-#if !(defined(WEBRTC_ARCH_ARM64) || defined(WEBRTC_ARCH_ARM) || \
-      defined(WEBRTC_ANDROID))
-TEST(EchoCancellationBitExactnessTest,
-     Mono16kHz_HighLevel_NoDrift_StreamDelay20) {
-#else
-TEST(EchoCancellationBitExactnessTest,
-     DISABLED_Mono16kHz_HighLevel_NoDrift_StreamDelay20) {
-#endif
-  const float kOutputReference[] = {0.000055f, 0.000421f, 0.001149f};
-  RunBitexactnessTest(16000, 1, 20, false, 0,
-                      EchoCancellation::SuppressionLevel::kHighSuppression,
-                      kStreamHasEchoReference, kOutputReference);
-}
-
-#if !(defined(WEBRTC_ARCH_ARM64) || defined(WEBRTC_ARCH_ARM) || \
-      defined(WEBRTC_ANDROID))
-TEST(EchoCancellationBitExactnessTest,
-     Mono16kHz_HighLevel_Drift0_StreamDelay0) {
-#else
-TEST(EchoCancellationBitExactnessTest,
-     DISABLED_Mono16kHz_HighLevel_Drift0_StreamDelay0) {
-#endif
-  const float kOutputReference[] = {0.000055f, 0.000421f, 0.001149f};
-  RunBitexactnessTest(16000, 1, 0, true, 0,
-                      EchoCancellation::SuppressionLevel::kHighSuppression,
-                      kStreamHasEchoReference, kOutputReference);
-}
-
-#if !(defined(WEBRTC_ARCH_ARM64) || defined(WEBRTC_ARCH_ARM) || \
-      defined(WEBRTC_ANDROID))
-TEST(EchoCancellationBitExactnessTest,
-     Mono16kHz_HighLevel_Drift5_StreamDelay0) {
-#else
-TEST(EchoCancellationBitExactnessTest,
-     DISABLED_Mono16kHz_HighLevel_Drift5_StreamDelay0) {
-#endif
-  const float kOutputReference[] = {0.000055f, 0.000421f, 0.001149f};
-  RunBitexactnessTest(16000, 1, 0, true, 5,
-                      EchoCancellation::SuppressionLevel::kHighSuppression,
-                      kStreamHasEchoReference, kOutputReference);
-}
-
-#if !(defined(WEBRTC_ARCH_ARM64) || defined(WEBRTC_ARCH_ARM) || \
-      defined(WEBRTC_ANDROID))
-TEST(EchoCancellationBitExactnessTest,
-     Stereo8kHz_HighLevel_NoDrift_StreamDelay0) {
-#else
-TEST(EchoCancellationBitExactnessTest,
-     DISABLED_Stereo8kHz_HighLevel_NoDrift_StreamDelay0) {
-#endif
-#if defined(WEBRTC_MAC)
-  const float kOutputReference[] = {-0.000392f, -0.001449f, 0.003004f,
-                                    -0.000392f, -0.001449f, 0.003004f};
-#else
-  const float kOutputReference[] = {-0.000464f, -0.001525f, 0.002933f,
-                                    -0.000464f, -0.001525f, 0.002933f};
-#endif
-  RunBitexactnessTest(8000, 2, 0, false, 0,
-                      EchoCancellation::SuppressionLevel::kHighSuppression,
-                      kStreamHasEchoReference, kOutputReference);
-}
-
-#if !(defined(WEBRTC_ARCH_ARM64) || defined(WEBRTC_ARCH_ARM) || \
-      defined(WEBRTC_ANDROID))
-TEST(EchoCancellationBitExactnessTest,
-     Stereo16kHz_HighLevel_NoDrift_StreamDelay0) {
-#else
-TEST(EchoCancellationBitExactnessTest,
-     DISABLED_Stereo16kHz_HighLevel_NoDrift_StreamDelay0) {
-#endif
-  const float kOutputReference[] = {0.000166f, 0.000735f, 0.000841f,
-                                    0.000166f, 0.000735f, 0.000841f};
-  RunBitexactnessTest(16000, 2, 0, false, 0,
-                      EchoCancellation::SuppressionLevel::kHighSuppression,
-                      kStreamHasEchoReference, kOutputReference);
-}
-
-#if !(defined(WEBRTC_ARCH_ARM64) || defined(WEBRTC_ARCH_ARM) || \
-      defined(WEBRTC_ANDROID))
-TEST(EchoCancellationBitExactnessTest,
-     Stereo32kHz_HighLevel_NoDrift_StreamDelay0) {
-#else
-TEST(EchoCancellationBitExactnessTest,
-     DISABLED_Stereo32kHz_HighLevel_NoDrift_StreamDelay0) {
-#endif
-#if defined(WEBRTC_MAC)
-  const float kOutputReference[] = {-0.000458f, 0.000244f, 0.000153f,
-                                    -0.000458f, 0.000244f, 0.000153f};
-#else
-  const float kOutputReference[] = {-0.000427f, 0.000183f, 0.000183f,
-                                    -0.000427f, 0.000183f, 0.000183f};
-#endif
-  RunBitexactnessTest(32000, 2, 0, false, 0,
-                      EchoCancellation::SuppressionLevel::kHighSuppression,
-                      kStreamHasEchoReference, kOutputReference);
-}
-
-#if !(defined(WEBRTC_ARCH_ARM64) || defined(WEBRTC_ARCH_ARM) || \
-      defined(WEBRTC_ANDROID))
-TEST(EchoCancellationBitExactnessTest,
-     Stereo48kHz_HighLevel_NoDrift_StreamDelay0) {
-#else
-TEST(EchoCancellationBitExactnessTest,
-     DISABLED_Stereo48kHz_HighLevel_NoDrift_StreamDelay0) {
-#endif
-  const float kOutputReference[] = {-0.001101f, -0.001101f, -0.000449f,
-                                    -0.001101f, -0.001101f, -0.000449f};
-  RunBitexactnessTest(48000, 2, 0, false, 0,
-                      EchoCancellation::SuppressionLevel::kHighSuppression,
-                      kStreamHasEchoReference, kOutputReference);
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/echo_cancellation_impl.cc b/modules/audio_processing/echo_cancellation_impl.cc
deleted file mode 100644
index b1ea486..0000000
--- a/modules/audio_processing/echo_cancellation_impl.cc
+++ /dev/null
@@ -1,502 +0,0 @@
-/*
- *  Copyright (c) 2012 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_processing/echo_cancellation_impl.h"
-
-#include <string.h>
-
-#include "webrtc/modules/audio_processing/aec/aec_core.h"
-#include "webrtc/modules/audio_processing/aec/echo_cancellation.h"
-#include "webrtc/modules/audio_processing/audio_buffer.h"
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-
-namespace {
-int16_t MapSetting(EchoCancellation::SuppressionLevel level) {
-  switch (level) {
-    case EchoCancellation::kLowSuppression:
-      return kAecNlpConservative;
-    case EchoCancellation::kModerateSuppression:
-      return kAecNlpModerate;
-    case EchoCancellation::kHighSuppression:
-      return kAecNlpAggressive;
-  }
-  RTC_NOTREACHED();
-  return -1;
-}
-
-AudioProcessing::Error MapError(int err) {
-  switch (err) {
-    case AEC_UNSUPPORTED_FUNCTION_ERROR:
-      return AudioProcessing::kUnsupportedFunctionError;
-    case AEC_BAD_PARAMETER_ERROR:
-      return AudioProcessing::kBadParameterError;
-    case AEC_BAD_PARAMETER_WARNING:
-      return AudioProcessing::kBadStreamParameterWarning;
-    default:
-      // AEC_UNSPECIFIED_ERROR
-      // AEC_UNINITIALIZED_ERROR
-      // AEC_NULL_POINTER_ERROR
-      return AudioProcessing::kUnspecifiedError;
-  }
-}
-
-}  // namespace
-
-struct EchoCancellationImpl::StreamProperties {
-  StreamProperties() = delete;
-  StreamProperties(int sample_rate_hz,
-                   size_t num_reverse_channels,
-                   size_t num_output_channels,
-                   size_t num_proc_channels)
-      : sample_rate_hz(sample_rate_hz),
-        num_reverse_channels(num_reverse_channels),
-        num_output_channels(num_output_channels),
-        num_proc_channels(num_proc_channels) {}
-
-  const int sample_rate_hz;
-  const size_t num_reverse_channels;
-  const size_t num_output_channels;
-  const size_t num_proc_channels;
-};
-
-class EchoCancellationImpl::Canceller {
- public:
-  Canceller() {
-    state_ = WebRtcAec_Create();
-    RTC_DCHECK(state_);
-  }
-
-  ~Canceller() {
-    RTC_CHECK(state_);
-    WebRtcAec_Free(state_);
-  }
-
-  void* state() { return state_; }
-
-  void Initialize(int sample_rate_hz) {
-    // TODO(ajm): Drift compensation is disabled in practice. If restored, it
-    // should be managed internally and not depend on the hardware sample rate.
-    // For now, just hardcode a 48 kHz value.
-    const int error = WebRtcAec_Init(state_, sample_rate_hz, 48000);
-    RTC_DCHECK_EQ(0, error);
-  }
-
- private:
-  void* state_;
-};
-
-EchoCancellationImpl::EchoCancellationImpl(rtc::CriticalSection* crit_render,
-                                           rtc::CriticalSection* crit_capture)
-    : crit_render_(crit_render),
-      crit_capture_(crit_capture),
-      drift_compensation_enabled_(false),
-      metrics_enabled_(false),
-      suppression_level_(kModerateSuppression),
-      stream_drift_samples_(0),
-      was_stream_drift_set_(false),
-      stream_has_echo_(false),
-      delay_logging_enabled_(false),
-      extended_filter_enabled_(false),
-      delay_agnostic_enabled_(false) {
-  RTC_DCHECK(crit_render);
-  RTC_DCHECK(crit_capture);
-}
-
-EchoCancellationImpl::~EchoCancellationImpl() = default;
-
-void EchoCancellationImpl::ProcessRenderAudio(
-    rtc::ArrayView<const float> packed_render_audio) {
-  rtc::CritScope cs_capture(crit_capture_);
-  if (!enabled_) {
-    return;
-  }
-
-  RTC_DCHECK(stream_properties_);
-  size_t handle_index = 0;
-  size_t buffer_index = 0;
-  const size_t num_frames_per_band =
-      packed_render_audio.size() / (stream_properties_->num_output_channels *
-                                    stream_properties_->num_reverse_channels);
-  for (size_t i = 0; i < stream_properties_->num_output_channels; i++) {
-    for (size_t j = 0; j < stream_properties_->num_reverse_channels; j++) {
-      WebRtcAec_BufferFarend(cancellers_[handle_index++]->state(),
-                             &packed_render_audio[buffer_index],
-                             num_frames_per_band);
-
-      buffer_index += num_frames_per_band;
-    }
-  }
-}
-
-
-int EchoCancellationImpl::ProcessCaptureAudio(AudioBuffer* audio,
-                                              int stream_delay_ms) {
-  rtc::CritScope cs_capture(crit_capture_);
-  if (!enabled_) {
-    return AudioProcessing::kNoError;
-  }
-
-  if (drift_compensation_enabled_ && !was_stream_drift_set_) {
-    return AudioProcessing::kStreamParameterNotSetError;
-  }
-
-  RTC_DCHECK(stream_properties_);
-  RTC_DCHECK_GE(160, audio->num_frames_per_band());
-  RTC_DCHECK_EQ(audio->num_channels(), stream_properties_->num_proc_channels);
-
-  int err = AudioProcessing::kNoError;
-
-  // The ordering convention must be followed to pass to the correct AEC.
-  size_t handle_index = 0;
-  stream_has_echo_ = false;
-  for (size_t i = 0; i < audio->num_channels(); i++) {
-    for (size_t j = 0; j < stream_properties_->num_reverse_channels; j++) {
-      err = WebRtcAec_Process(
-          cancellers_[handle_index]->state(), audio->split_bands_const_f(i),
-          audio->num_bands(), audio->split_bands_f(i),
-          audio->num_frames_per_band(), stream_delay_ms, stream_drift_samples_);
-
-      if (err != AudioProcessing::kNoError) {
-        err = MapError(err);
-        // TODO(ajm): Figure out how to return warnings properly.
-        if (err != AudioProcessing::kBadStreamParameterWarning) {
-          return err;
-        }
-      }
-
-      int status = 0;
-      err = WebRtcAec_get_echo_status(cancellers_[handle_index]->state(),
-                                      &status);
-      if (err != AudioProcessing::kNoError) {
-        return MapError(err);
-      }
-
-      if (status == 1) {
-        stream_has_echo_ = true;
-      }
-
-      handle_index++;
-    }
-  }
-
-  was_stream_drift_set_ = false;
-  return AudioProcessing::kNoError;
-}
-
-int EchoCancellationImpl::Enable(bool enable) {
-  // Run in a single-threaded manner.
-  rtc::CritScope cs_render(crit_render_);
-  rtc::CritScope cs_capture(crit_capture_);
-
-  if (enable && !enabled_) {
-    enabled_ = enable;  // Must be set before Initialize() is called.
-
-    // TODO(peah): Simplify once the Enable function has been removed from
-    // the public APM API.
-    RTC_DCHECK(stream_properties_);
-    Initialize(stream_properties_->sample_rate_hz,
-               stream_properties_->num_reverse_channels,
-               stream_properties_->num_output_channels,
-               stream_properties_->num_proc_channels);
-  } else {
-    enabled_ = enable;
-  }
-  return AudioProcessing::kNoError;
-}
-
-bool EchoCancellationImpl::is_enabled() const {
-  rtc::CritScope cs(crit_capture_);
-  return enabled_;
-}
-
-int EchoCancellationImpl::set_suppression_level(SuppressionLevel level) {
-  {
-    if (MapSetting(level) == -1) {
-      return AudioProcessing::kBadParameterError;
-    }
-    rtc::CritScope cs(crit_capture_);
-    suppression_level_ = level;
-  }
-  return Configure();
-}
-
-EchoCancellation::SuppressionLevel EchoCancellationImpl::suppression_level()
-    const {
-  rtc::CritScope cs(crit_capture_);
-  return suppression_level_;
-}
-
-int EchoCancellationImpl::enable_drift_compensation(bool enable) {
-  {
-    rtc::CritScope cs(crit_capture_);
-    drift_compensation_enabled_ = enable;
-  }
-  return Configure();
-}
-
-bool EchoCancellationImpl::is_drift_compensation_enabled() const {
-  rtc::CritScope cs(crit_capture_);
-  return drift_compensation_enabled_;
-}
-
-void EchoCancellationImpl::set_stream_drift_samples(int drift) {
-  rtc::CritScope cs(crit_capture_);
-  was_stream_drift_set_ = true;
-  stream_drift_samples_ = drift;
-}
-
-int EchoCancellationImpl::stream_drift_samples() const {
-  rtc::CritScope cs(crit_capture_);
-  return stream_drift_samples_;
-}
-
-int EchoCancellationImpl::enable_metrics(bool enable) {
-  {
-    rtc::CritScope cs(crit_capture_);
-    metrics_enabled_ = enable;
-  }
-  return Configure();
-}
-
-bool EchoCancellationImpl::are_metrics_enabled() const {
-  rtc::CritScope cs(crit_capture_);
-  return enabled_ && metrics_enabled_;
-}
-
-// TODO(ajm): we currently just use the metrics from the first AEC. Think more
-//            aboue the best way to extend this to multi-channel.
-int EchoCancellationImpl::GetMetrics(Metrics* metrics) {
-  rtc::CritScope cs(crit_capture_);
-  if (metrics == NULL) {
-    return AudioProcessing::kNullPointerError;
-  }
-
-  if (!enabled_ || !metrics_enabled_) {
-    return AudioProcessing::kNotEnabledError;
-  }
-
-  AecMetrics my_metrics;
-  memset(&my_metrics, 0, sizeof(my_metrics));
-  memset(metrics, 0, sizeof(Metrics));
-
-  const int err = WebRtcAec_GetMetrics(cancellers_[0]->state(), &my_metrics);
-  if (err != AudioProcessing::kNoError) {
-    return MapError(err);
-  }
-
-  metrics->residual_echo_return_loss.instant = my_metrics.rerl.instant;
-  metrics->residual_echo_return_loss.average = my_metrics.rerl.average;
-  metrics->residual_echo_return_loss.maximum = my_metrics.rerl.max;
-  metrics->residual_echo_return_loss.minimum = my_metrics.rerl.min;
-
-  metrics->echo_return_loss.instant = my_metrics.erl.instant;
-  metrics->echo_return_loss.average = my_metrics.erl.average;
-  metrics->echo_return_loss.maximum = my_metrics.erl.max;
-  metrics->echo_return_loss.minimum = my_metrics.erl.min;
-
-  metrics->echo_return_loss_enhancement.instant = my_metrics.erle.instant;
-  metrics->echo_return_loss_enhancement.average = my_metrics.erle.average;
-  metrics->echo_return_loss_enhancement.maximum = my_metrics.erle.max;
-  metrics->echo_return_loss_enhancement.minimum = my_metrics.erle.min;
-
-  metrics->a_nlp.instant = my_metrics.aNlp.instant;
-  metrics->a_nlp.average = my_metrics.aNlp.average;
-  metrics->a_nlp.maximum = my_metrics.aNlp.max;
-  metrics->a_nlp.minimum = my_metrics.aNlp.min;
-
-  metrics->divergent_filter_fraction = my_metrics.divergent_filter_fraction;
-  return AudioProcessing::kNoError;
-}
-
-bool EchoCancellationImpl::stream_has_echo() const {
-  rtc::CritScope cs(crit_capture_);
-  return stream_has_echo_;
-}
-
-int EchoCancellationImpl::enable_delay_logging(bool enable) {
-  {
-    rtc::CritScope cs(crit_capture_);
-    delay_logging_enabled_ = enable;
-  }
-  return Configure();
-}
-
-bool EchoCancellationImpl::is_delay_logging_enabled() const {
-  rtc::CritScope cs(crit_capture_);
-  return enabled_ && delay_logging_enabled_;
-}
-
-bool EchoCancellationImpl::is_delay_agnostic_enabled() const {
-  rtc::CritScope cs(crit_capture_);
-  return delay_agnostic_enabled_;
-}
-
-std::string EchoCancellationImpl::GetExperimentsDescription() {
-  rtc::CritScope cs(crit_capture_);
-  return refined_adaptive_filter_enabled_ ? "RefinedAdaptiveFilter;" : "";
-}
-
-bool EchoCancellationImpl::is_refined_adaptive_filter_enabled() const {
-  rtc::CritScope cs(crit_capture_);
-  return refined_adaptive_filter_enabled_;
-}
-
-bool EchoCancellationImpl::is_extended_filter_enabled() const {
-  rtc::CritScope cs(crit_capture_);
-  return extended_filter_enabled_;
-}
-
-// TODO(bjornv): How should we handle the multi-channel case?
-int EchoCancellationImpl::GetDelayMetrics(int* median, int* std) {
-  rtc::CritScope cs(crit_capture_);
-  float fraction_poor_delays = 0;
-  return GetDelayMetrics(median, std, &fraction_poor_delays);
-}
-
-int EchoCancellationImpl::GetDelayMetrics(int* median, int* std,
-                                          float* fraction_poor_delays) {
-  rtc::CritScope cs(crit_capture_);
-  if (median == NULL) {
-    return AudioProcessing::kNullPointerError;
-  }
-  if (std == NULL) {
-    return AudioProcessing::kNullPointerError;
-  }
-
-  if (!enabled_ || !delay_logging_enabled_) {
-    return AudioProcessing::kNotEnabledError;
-  }
-
-  const int err = WebRtcAec_GetDelayMetrics(cancellers_[0]->state(), median,
-                                            std, fraction_poor_delays);
-  if (err != AudioProcessing::kNoError) {
-    return MapError(err);
-  }
-
-  return AudioProcessing::kNoError;
-}
-
-struct AecCore* EchoCancellationImpl::aec_core() const {
-  rtc::CritScope cs(crit_capture_);
-  if (!enabled_) {
-    return NULL;
-  }
-  return WebRtcAec_aec_core(cancellers_[0]->state());
-}
-
-void EchoCancellationImpl::Initialize(int sample_rate_hz,
-                                      size_t num_reverse_channels,
-                                      size_t num_output_channels,
-                                      size_t num_proc_channels) {
-  rtc::CritScope cs_render(crit_render_);
-  rtc::CritScope cs_capture(crit_capture_);
-
-  stream_properties_.reset(
-      new StreamProperties(sample_rate_hz, num_reverse_channels,
-                           num_output_channels, num_proc_channels));
-
-  if (!enabled_) {
-    return;
-  }
-
-  const size_t num_cancellers_required =
-      NumCancellersRequired(stream_properties_->num_output_channels,
-                            stream_properties_->num_reverse_channels);
-  if (num_cancellers_required > cancellers_.size()) {
-    const size_t cancellers_old_size = cancellers_.size();
-    cancellers_.resize(num_cancellers_required);
-
-    for (size_t i = cancellers_old_size; i < cancellers_.size(); ++i) {
-      cancellers_[i].reset(new Canceller());
-    }
-  }
-
-  for (auto& canceller : cancellers_) {
-    canceller->Initialize(sample_rate_hz);
-  }
-
-  Configure();
-}
-
-int EchoCancellationImpl::GetSystemDelayInSamples() const {
-  rtc::CritScope cs(crit_capture_);
-  RTC_DCHECK(enabled_);
-  // Report the delay for the first AEC component.
-  return WebRtcAec_system_delay(
-      WebRtcAec_aec_core(cancellers_[0]->state()));
-}
-
-void EchoCancellationImpl::PackRenderAudioBuffer(
-    const AudioBuffer* audio,
-    size_t num_output_channels,
-    size_t num_channels,
-    std::vector<float>* packed_buffer) {
-  RTC_DCHECK_GE(160, audio->num_frames_per_band());
-  RTC_DCHECK_EQ(num_channels, audio->num_channels());
-
-  packed_buffer->clear();
-  // The ordering convention must be followed to pass the correct data.
-  for (size_t i = 0; i < num_output_channels; i++) {
-    for (size_t j = 0; j < audio->num_channels(); j++) {
-      // Buffer the samples in the render queue.
-      packed_buffer->insert(packed_buffer->end(),
-                            audio->split_bands_const_f(j)[kBand0To8kHz],
-                            (audio->split_bands_const_f(j)[kBand0To8kHz] +
-                             audio->num_frames_per_band()));
-    }
-  }
-}
-
-void EchoCancellationImpl::SetExtraOptions(const webrtc::Config& config) {
-  {
-    rtc::CritScope cs(crit_capture_);
-    extended_filter_enabled_ = config.Get<ExtendedFilter>().enabled;
-    delay_agnostic_enabled_ = config.Get<DelayAgnostic>().enabled;
-    refined_adaptive_filter_enabled_ =
-        config.Get<RefinedAdaptiveFilter>().enabled;
-  }
-  Configure();
-}
-
-int EchoCancellationImpl::Configure() {
-  rtc::CritScope cs_render(crit_render_);
-  rtc::CritScope cs_capture(crit_capture_);
-  AecConfig config;
-  config.metricsMode = metrics_enabled_;
-  config.nlpMode = MapSetting(suppression_level_);
-  config.skewMode = drift_compensation_enabled_;
-  config.delay_logging = delay_logging_enabled_;
-
-  int error = AudioProcessing::kNoError;
-  for (auto& canceller : cancellers_) {
-    WebRtcAec_enable_extended_filter(WebRtcAec_aec_core(canceller->state()),
-                                     extended_filter_enabled_ ? 1 : 0);
-    WebRtcAec_enable_delay_agnostic(WebRtcAec_aec_core(canceller->state()),
-                                    delay_agnostic_enabled_ ? 1 : 0);
-    WebRtcAec_enable_refined_adaptive_filter(
-        WebRtcAec_aec_core(canceller->state()),
-        refined_adaptive_filter_enabled_);
-    const int handle_error = WebRtcAec_set_config(canceller->state(), config);
-    if (handle_error != AudioProcessing::kNoError) {
-      error = AudioProcessing::kNoError;
-    }
-  }
-  return error;
-}
-
-size_t EchoCancellationImpl::NumCancellersRequired(
-    size_t num_output_channels,
-    size_t num_reverse_channels) {
-  return num_output_channels * num_reverse_channels;
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/echo_cancellation_impl.h b/modules/audio_processing/echo_cancellation_impl.h
deleted file mode 100644
index 301bd53..0000000
--- a/modules/audio_processing/echo_cancellation_impl.h
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- *  Copyright (c) 2012 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_PROCESSING_ECHO_CANCELLATION_IMPL_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_ECHO_CANCELLATION_IMPL_H_
-
-#include <memory>
-#include <vector>
-
-#include "webrtc/modules/audio_processing/include/audio_processing.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/criticalsection.h"
-
-namespace webrtc {
-
-class AudioBuffer;
-
-class EchoCancellationImpl : public EchoCancellation {
- public:
-  EchoCancellationImpl(rtc::CriticalSection* crit_render,
-                       rtc::CriticalSection* crit_capture);
-  ~EchoCancellationImpl() override;
-
-  void ProcessRenderAudio(rtc::ArrayView<const float> packed_render_audio);
-  int ProcessCaptureAudio(AudioBuffer* audio, int stream_delay_ms);
-
-  // EchoCancellation implementation.
-  bool is_enabled() const override;
-  int stream_drift_samples() const override;
-  SuppressionLevel suppression_level() const override;
-  bool is_drift_compensation_enabled() const override;
-
-  void Initialize(int sample_rate_hz,
-                  size_t num_reverse_channels_,
-                  size_t num_output_channels_,
-                  size_t num_proc_channels_);
-  void SetExtraOptions(const webrtc::Config& config);
-  bool is_delay_agnostic_enabled() const;
-  bool is_extended_filter_enabled() const;
-  std::string GetExperimentsDescription();
-  bool is_refined_adaptive_filter_enabled() const;
-
-  // Returns the system delay of the first AEC component.
-  int GetSystemDelayInSamples() const;
-
-  static void PackRenderAudioBuffer(const AudioBuffer* audio,
-                                    size_t num_output_channels,
-                                    size_t num_channels,
-                                    std::vector<float>* packed_buffer);
-  static size_t NumCancellersRequired(size_t num_output_channels,
-                                      size_t num_reverse_channels);
-
-  // Enable logging of various AEC statistics.
-  int enable_metrics(bool enable) override;
-
-  // Provides various statistics about the AEC.
-  int GetMetrics(Metrics* metrics) override;
-
-  // Enable logging of delay metrics.
-  int enable_delay_logging(bool enable) override;
-
-  // Provides delay metrics.
-  int GetDelayMetrics(int* median,
-                      int* std,
-                      float* fraction_poor_delays) override;
-
- private:
-  class Canceller;
-  struct StreamProperties;
-
-  // EchoCancellation implementation.
-  int Enable(bool enable) override;
-  int enable_drift_compensation(bool enable) override;
-  void set_stream_drift_samples(int drift) override;
-  int set_suppression_level(SuppressionLevel level) override;
-  bool are_metrics_enabled() const override;
-  bool stream_has_echo() const override;
-  bool is_delay_logging_enabled() const override;
-  int GetDelayMetrics(int* median, int* std) override;
-
-  struct AecCore* aec_core() const override;
-
-  void AllocateRenderQueue();
-  int Configure();
-
-  rtc::CriticalSection* const crit_render_ RTC_ACQUIRED_BEFORE(crit_capture_);
-  rtc::CriticalSection* const crit_capture_;
-
-  bool enabled_ = false;
-  bool drift_compensation_enabled_ RTC_GUARDED_BY(crit_capture_);
-  bool metrics_enabled_ RTC_GUARDED_BY(crit_capture_);
-  SuppressionLevel suppression_level_ RTC_GUARDED_BY(crit_capture_);
-  int stream_drift_samples_ RTC_GUARDED_BY(crit_capture_);
-  bool was_stream_drift_set_ RTC_GUARDED_BY(crit_capture_);
-  bool stream_has_echo_ RTC_GUARDED_BY(crit_capture_);
-  bool delay_logging_enabled_ RTC_GUARDED_BY(crit_capture_);
-  bool extended_filter_enabled_ RTC_GUARDED_BY(crit_capture_);
-  bool delay_agnostic_enabled_ RTC_GUARDED_BY(crit_capture_);
-  bool refined_adaptive_filter_enabled_ RTC_GUARDED_BY(crit_capture_) = false;
-
-  std::vector<std::unique_ptr<Canceller>> cancellers_;
-  std::unique_ptr<StreamProperties> stream_properties_;
-
-  RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(EchoCancellationImpl);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_ECHO_CANCELLATION_IMPL_H_
diff --git a/modules/audio_processing/echo_cancellation_impl_unittest.cc b/modules/audio_processing/echo_cancellation_impl_unittest.cc
deleted file mode 100644
index 0aa1cf3..0000000
--- a/modules/audio_processing/echo_cancellation_impl_unittest.cc
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- *  Copyright (c) 2013 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 <memory>
-
-#include "webrtc/modules/audio_processing/aec/aec_core.h"
-#include "webrtc/modules/audio_processing/include/audio_processing.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-TEST(EchoCancellationInternalTest, ExtendedFilter) {
-  std::unique_ptr<AudioProcessing> ap(AudioProcessing::Create());
-  EXPECT_TRUE(ap->echo_cancellation()->aec_core() == NULL);
-
-  EXPECT_EQ(ap->kNoError, ap->echo_cancellation()->Enable(true));
-  EXPECT_TRUE(ap->echo_cancellation()->is_enabled());
-
-  AecCore* aec_core = ap->echo_cancellation()->aec_core();
-  ASSERT_TRUE(aec_core != NULL);
-  // Disabled by default.
-  EXPECT_EQ(0, WebRtcAec_extended_filter_enabled(aec_core));
-
-  Config config;
-  config.Set<ExtendedFilter>(new ExtendedFilter(true));
-  ap->SetExtraOptions(config);
-  EXPECT_EQ(1, WebRtcAec_extended_filter_enabled(aec_core));
-
-  // Retains setting after initialization.
-  EXPECT_EQ(ap->kNoError, ap->Initialize());
-  EXPECT_EQ(1, WebRtcAec_extended_filter_enabled(aec_core));
-
-  config.Set<ExtendedFilter>(new ExtendedFilter(false));
-  ap->SetExtraOptions(config);
-  EXPECT_EQ(0, WebRtcAec_extended_filter_enabled(aec_core));
-
-  // Retains setting after initialization.
-  EXPECT_EQ(ap->kNoError, ap->Initialize());
-  EXPECT_EQ(0, WebRtcAec_extended_filter_enabled(aec_core));
-}
-
-TEST(EchoCancellationInternalTest, DelayAgnostic) {
-  std::unique_ptr<AudioProcessing> ap(AudioProcessing::Create());
-  EXPECT_TRUE(ap->echo_cancellation()->aec_core() == NULL);
-
-  EXPECT_EQ(ap->kNoError, ap->echo_cancellation()->Enable(true));
-  EXPECT_TRUE(ap->echo_cancellation()->is_enabled());
-
-  AecCore* aec_core = ap->echo_cancellation()->aec_core();
-  ASSERT_TRUE(aec_core != NULL);
-  // Enabled by default.
-  EXPECT_EQ(0, WebRtcAec_delay_agnostic_enabled(aec_core));
-
-  Config config;
-  config.Set<DelayAgnostic>(new DelayAgnostic(true));
-  ap->SetExtraOptions(config);
-  EXPECT_EQ(1, WebRtcAec_delay_agnostic_enabled(aec_core));
-
-  // Retains setting after initialization.
-  EXPECT_EQ(ap->kNoError, ap->Initialize());
-  EXPECT_EQ(1, WebRtcAec_delay_agnostic_enabled(aec_core));
-
-  config.Set<DelayAgnostic>(new DelayAgnostic(false));
-  ap->SetExtraOptions(config);
-  EXPECT_EQ(0, WebRtcAec_delay_agnostic_enabled(aec_core));
-
-  // Retains setting after initialization.
-  EXPECT_EQ(ap->kNoError, ap->Initialize());
-  EXPECT_EQ(0, WebRtcAec_delay_agnostic_enabled(aec_core));
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/echo_control_mobile_impl.cc b/modules/audio_processing/echo_control_mobile_impl.cc
deleted file mode 100644
index 4104a7f..0000000
--- a/modules/audio_processing/echo_control_mobile_impl.cc
+++ /dev/null
@@ -1,391 +0,0 @@
-/*
- *  Copyright (c) 2012 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_processing/echo_control_mobile_impl.h"
-
-#include <string.h>
-
-#include "webrtc/modules/audio_processing/aecm/echo_control_mobile.h"
-#include "webrtc/modules/audio_processing/audio_buffer.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/logging.h"
-
-namespace webrtc {
-
-namespace {
-int16_t MapSetting(EchoControlMobile::RoutingMode mode) {
-  switch (mode) {
-    case EchoControlMobile::kQuietEarpieceOrHeadset:
-      return 0;
-    case EchoControlMobile::kEarpiece:
-      return 1;
-    case EchoControlMobile::kLoudEarpiece:
-      return 2;
-    case EchoControlMobile::kSpeakerphone:
-      return 3;
-    case EchoControlMobile::kLoudSpeakerphone:
-      return 4;
-  }
-  RTC_NOTREACHED();
-  return -1;
-}
-
-AudioProcessing::Error MapError(int err) {
-  switch (err) {
-    case AECM_UNSUPPORTED_FUNCTION_ERROR:
-      return AudioProcessing::kUnsupportedFunctionError;
-    case AECM_NULL_POINTER_ERROR:
-      return AudioProcessing::kNullPointerError;
-    case AECM_BAD_PARAMETER_ERROR:
-      return AudioProcessing::kBadParameterError;
-    case AECM_BAD_PARAMETER_WARNING:
-      return AudioProcessing::kBadStreamParameterWarning;
-    default:
-      // AECM_UNSPECIFIED_ERROR
-      // AECM_UNINITIALIZED_ERROR
-      return AudioProcessing::kUnspecifiedError;
-  }
-}
-}  // namespace
-
-size_t EchoControlMobile::echo_path_size_bytes() {
-  return WebRtcAecm_echo_path_size_bytes();
-}
-
-struct EchoControlMobileImpl::StreamProperties {
-  StreamProperties() = delete;
-  StreamProperties(int sample_rate_hz,
-                   size_t num_reverse_channels,
-                   size_t num_output_channels)
-      : sample_rate_hz(sample_rate_hz),
-        num_reverse_channels(num_reverse_channels),
-        num_output_channels(num_output_channels) {}
-
-  int sample_rate_hz;
-  size_t num_reverse_channels;
-  size_t num_output_channels;
-};
-
-class EchoControlMobileImpl::Canceller {
- public:
-  Canceller() {
-    state_ = WebRtcAecm_Create();
-    RTC_CHECK(state_);
-  }
-
-  ~Canceller() {
-    RTC_DCHECK(state_);
-    WebRtcAecm_Free(state_);
-  }
-
-  void* state() {
-    RTC_DCHECK(state_);
-    return state_;
-  }
-
-  void Initialize(int sample_rate_hz,
-                  unsigned char* external_echo_path,
-                  size_t echo_path_size_bytes) {
-    RTC_DCHECK(state_);
-    int error = WebRtcAecm_Init(state_, sample_rate_hz);
-    RTC_DCHECK_EQ(AudioProcessing::kNoError, error);
-    if (external_echo_path != NULL) {
-      error = WebRtcAecm_InitEchoPath(state_, external_echo_path,
-                                      echo_path_size_bytes);
-      RTC_DCHECK_EQ(AudioProcessing::kNoError, error);
-    }
-  }
-
- private:
-  void* state_;
-  RTC_DISALLOW_COPY_AND_ASSIGN(Canceller);
-};
-
-EchoControlMobileImpl::EchoControlMobileImpl(rtc::CriticalSection* crit_render,
-                                             rtc::CriticalSection* crit_capture)
-    : crit_render_(crit_render),
-      crit_capture_(crit_capture),
-      routing_mode_(kSpeakerphone),
-      comfort_noise_enabled_(true),
-      external_echo_path_(NULL) {
-  RTC_DCHECK(crit_render);
-  RTC_DCHECK(crit_capture);
-}
-
-EchoControlMobileImpl::~EchoControlMobileImpl() {
-    if (external_echo_path_ != NULL) {
-      delete [] external_echo_path_;
-      external_echo_path_ = NULL;
-    }
-}
-
-void EchoControlMobileImpl::ProcessRenderAudio(
-    rtc::ArrayView<const int16_t> packed_render_audio) {
-  rtc::CritScope cs_capture(crit_capture_);
-  if (!enabled_) {
-    return;
-  }
-
-  RTC_DCHECK(stream_properties_);
-
-  size_t buffer_index = 0;
-  size_t num_frames_per_band =
-      packed_render_audio.size() / (stream_properties_->num_output_channels *
-                                    stream_properties_->num_reverse_channels);
-
-  for (auto& canceller : cancellers_) {
-    WebRtcAecm_BufferFarend(canceller->state(),
-                            &packed_render_audio[buffer_index],
-                            num_frames_per_band);
-
-    buffer_index += num_frames_per_band;
-  }
-}
-
-void EchoControlMobileImpl::PackRenderAudioBuffer(
-    const AudioBuffer* audio,
-    size_t num_output_channels,
-    size_t num_channels,
-    std::vector<int16_t>* packed_buffer) {
-  RTC_DCHECK_GE(160, audio->num_frames_per_band());
-  RTC_DCHECK_EQ(num_channels, audio->num_channels());
-
-  // The ordering convention must be followed to pass to the correct AECM.
-  packed_buffer->clear();
-  int render_channel = 0;
-  for (size_t i = 0; i < num_output_channels; i++) {
-    for (size_t j = 0; j < audio->num_channels(); j++) {
-      // Buffer the samples in the render queue.
-      packed_buffer->insert(
-          packed_buffer->end(),
-          audio->split_bands_const(render_channel)[kBand0To8kHz],
-          (audio->split_bands_const(render_channel)[kBand0To8kHz] +
-           audio->num_frames_per_band()));
-      render_channel = (render_channel + 1) % audio->num_channels();
-    }
-  }
-}
-
-size_t EchoControlMobileImpl::NumCancellersRequired(
-    size_t num_output_channels,
-    size_t num_reverse_channels) {
-  return num_output_channels * num_reverse_channels;
-}
-
-int EchoControlMobileImpl::ProcessCaptureAudio(AudioBuffer* audio,
-                                               int stream_delay_ms) {
-  rtc::CritScope cs_capture(crit_capture_);
-  if (!enabled_) {
-    return AudioProcessing::kNoError;
-  }
-
-  RTC_DCHECK(stream_properties_);
-  RTC_DCHECK_GE(160, audio->num_frames_per_band());
-  RTC_DCHECK_EQ(audio->num_channels(), stream_properties_->num_output_channels);
-  RTC_DCHECK_GE(cancellers_.size(), stream_properties_->num_reverse_channels *
-                                        audio->num_channels());
-
-  int err = AudioProcessing::kNoError;
-
-  // The ordering convention must be followed to pass to the correct AECM.
-  size_t handle_index = 0;
-  for (size_t capture = 0; capture < audio->num_channels(); ++capture) {
-    // TODO(ajm): improve how this works, possibly inside AECM.
-    //            This is kind of hacked up.
-    const int16_t* noisy = audio->low_pass_reference(capture);
-    const int16_t* clean = audio->split_bands_const(capture)[kBand0To8kHz];
-    if (noisy == NULL) {
-      noisy = clean;
-      clean = NULL;
-    }
-    for (size_t render = 0; render < stream_properties_->num_reverse_channels;
-         ++render) {
-      err = WebRtcAecm_Process(cancellers_[handle_index]->state(), noisy, clean,
-                               audio->split_bands(capture)[kBand0To8kHz],
-                               audio->num_frames_per_band(), stream_delay_ms);
-
-      if (err != AudioProcessing::kNoError) {
-        return MapError(err);
-      }
-
-      ++handle_index;
-    }
-    for (size_t band = 1u; band < audio->num_bands(); ++band) {
-      memset(audio->split_bands(capture)[band],
-             0,
-             audio->num_frames_per_band() *
-                 sizeof(audio->split_bands(capture)[band][0]));
-    }
-  }
-  return AudioProcessing::kNoError;
-}
-
-int EchoControlMobileImpl::Enable(bool enable) {
-  // Ensure AEC and AECM are not both enabled.
-  rtc::CritScope cs_render(crit_render_);
-  rtc::CritScope cs_capture(crit_capture_);
-  RTC_DCHECK(stream_properties_);
-
-  if (enable &&
-      stream_properties_->sample_rate_hz > AudioProcessing::kSampleRate16kHz) {
-    return AudioProcessing::kBadSampleRateError;
-  }
-
-  if (enable && !enabled_) {
-    enabled_ = enable;  // Must be set before Initialize() is called.
-
-    // TODO(peah): Simplify once the Enable function has been removed from
-    // the public APM API.
-    Initialize(stream_properties_->sample_rate_hz,
-               stream_properties_->num_reverse_channels,
-               stream_properties_->num_output_channels);
-  } else {
-    enabled_ = enable;
-  }
-  return AudioProcessing::kNoError;
-}
-
-bool EchoControlMobileImpl::is_enabled() const {
-  rtc::CritScope cs(crit_capture_);
-  return enabled_;
-}
-
-int EchoControlMobileImpl::set_routing_mode(RoutingMode mode) {
-  if (MapSetting(mode) == -1) {
-    return AudioProcessing::kBadParameterError;
-  }
-
-  {
-    rtc::CritScope cs(crit_capture_);
-    routing_mode_ = mode;
-  }
-  return Configure();
-}
-
-EchoControlMobile::RoutingMode EchoControlMobileImpl::routing_mode()
-    const {
-  rtc::CritScope cs(crit_capture_);
-  return routing_mode_;
-}
-
-int EchoControlMobileImpl::enable_comfort_noise(bool enable) {
-  {
-    rtc::CritScope cs(crit_capture_);
-    comfort_noise_enabled_ = enable;
-  }
-  return Configure();
-}
-
-bool EchoControlMobileImpl::is_comfort_noise_enabled() const {
-  rtc::CritScope cs(crit_capture_);
-  return comfort_noise_enabled_;
-}
-
-int EchoControlMobileImpl::SetEchoPath(const void* echo_path,
-                                       size_t size_bytes) {
-  {
-    rtc::CritScope cs_render(crit_render_);
-    rtc::CritScope cs_capture(crit_capture_);
-    if (echo_path == NULL) {
-      return AudioProcessing::kNullPointerError;
-    }
-    if (size_bytes != echo_path_size_bytes()) {
-      // Size mismatch
-      return AudioProcessing::kBadParameterError;
-    }
-
-    if (external_echo_path_ == NULL) {
-      external_echo_path_ = new unsigned char[size_bytes];
-    }
-    memcpy(external_echo_path_, echo_path, size_bytes);
-  }
-
-  // TODO(peah): Simplify once the Enable function has been removed from
-  // the public APM API.
-  RTC_DCHECK(stream_properties_);
-  Initialize(stream_properties_->sample_rate_hz,
-             stream_properties_->num_reverse_channels,
-             stream_properties_->num_output_channels);
-  return AudioProcessing::kNoError;
-}
-
-int EchoControlMobileImpl::GetEchoPath(void* echo_path,
-                                       size_t size_bytes) const {
-  rtc::CritScope cs(crit_capture_);
-  if (echo_path == NULL) {
-    return AudioProcessing::kNullPointerError;
-  }
-  if (size_bytes != echo_path_size_bytes()) {
-    // Size mismatch
-    return AudioProcessing::kBadParameterError;
-  }
-  if (!enabled_) {
-    return AudioProcessing::kNotEnabledError;
-  }
-
-  // Get the echo path from the first channel
-  int32_t err =
-      WebRtcAecm_GetEchoPath(cancellers_[0]->state(), echo_path, size_bytes);
-  if (err != 0) {
-    return MapError(err);
-  }
-
-  return AudioProcessing::kNoError;
-}
-
-void EchoControlMobileImpl::Initialize(int sample_rate_hz,
-                                       size_t num_reverse_channels,
-                                       size_t num_output_channels) {
-  rtc::CritScope cs_render(crit_render_);
-  rtc::CritScope cs_capture(crit_capture_);
-
-  stream_properties_.reset(new StreamProperties(
-      sample_rate_hz, num_reverse_channels, num_output_channels));
-
-  if (!enabled_) {
-    return;
-  }
-
-  if (stream_properties_->sample_rate_hz > AudioProcessing::kSampleRate16kHz) {
-    LOG(LS_ERROR) << "AECM only supports 16 kHz or lower sample rates";
-  }
-
-  cancellers_.resize(
-      NumCancellersRequired(stream_properties_->num_output_channels,
-                            stream_properties_->num_reverse_channels));
-
-  for (auto& canceller : cancellers_) {
-    if (!canceller) {
-      canceller.reset(new Canceller());
-    }
-    canceller->Initialize(sample_rate_hz, external_echo_path_,
-                          echo_path_size_bytes());
-  }
-
-  Configure();
-}
-
-int EchoControlMobileImpl::Configure() {
-  rtc::CritScope cs_render(crit_render_);
-  rtc::CritScope cs_capture(crit_capture_);
-  AecmConfig config;
-  config.cngMode = comfort_noise_enabled_;
-  config.echoMode = MapSetting(routing_mode_);
-  int error = AudioProcessing::kNoError;
-  for (auto& canceller : cancellers_) {
-    int handle_error = WebRtcAecm_set_config(canceller->state(), config);
-    if (handle_error != AudioProcessing::kNoError) {
-      error = handle_error;
-    }
-  }
-  return error;
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/echo_control_mobile_impl.h b/modules/audio_processing/echo_control_mobile_impl.h
deleted file mode 100644
index b3e1577..0000000
--- a/modules/audio_processing/echo_control_mobile_impl.h
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- *  Copyright (c) 2012 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_PROCESSING_ECHO_CONTROL_MOBILE_IMPL_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_ECHO_CONTROL_MOBILE_IMPL_H_
-
-#include <memory>
-#include <vector>
-
-#include "webrtc/modules/audio_processing/include/audio_processing.h"
-#include "webrtc/modules/audio_processing/render_queue_item_verifier.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/swap_queue.h"
-
-namespace webrtc {
-
-class AudioBuffer;
-
-class EchoControlMobileImpl : public EchoControlMobile {
- public:
-  EchoControlMobileImpl(rtc::CriticalSection* crit_render,
-                        rtc::CriticalSection* crit_capture);
-
-  ~EchoControlMobileImpl() override;
-
-  void ProcessRenderAudio(rtc::ArrayView<const int16_t> packed_render_audio);
-  int ProcessCaptureAudio(AudioBuffer* audio, int stream_delay_ms);
-
-  // EchoControlMobile implementation.
-  bool is_enabled() const override;
-  RoutingMode routing_mode() const override;
-  bool is_comfort_noise_enabled() const override;
-
-  void Initialize(int sample_rate_hz,
-                  size_t num_reverse_channels,
-                  size_t num_output_channels);
-
-  static void PackRenderAudioBuffer(const AudioBuffer* audio,
-                                    size_t num_output_channels,
-                                    size_t num_channels,
-                                    std::vector<int16_t>* packed_buffer);
-
-  static size_t NumCancellersRequired(size_t num_output_channels,
-                                      size_t num_reverse_channels);
-
- private:
-  class Canceller;
-  struct StreamProperties;
-
-  // EchoControlMobile implementation.
-  int Enable(bool enable) override;
-  int set_routing_mode(RoutingMode mode) override;
-  int enable_comfort_noise(bool enable) override;
-  int SetEchoPath(const void* echo_path, size_t size_bytes) override;
-  int GetEchoPath(void* echo_path, size_t size_bytes) const override;
-
-  int Configure();
-
-  rtc::CriticalSection* const crit_render_ RTC_ACQUIRED_BEFORE(crit_capture_);
-  rtc::CriticalSection* const crit_capture_;
-
-  bool enabled_ = false;
-
-  RoutingMode routing_mode_ RTC_GUARDED_BY(crit_capture_);
-  bool comfort_noise_enabled_ RTC_GUARDED_BY(crit_capture_);
-  unsigned char* external_echo_path_ RTC_GUARDED_BY(crit_render_)
-      RTC_GUARDED_BY(crit_capture_);
-
-  std::vector<std::unique_ptr<Canceller>> cancellers_;
-  std::unique_ptr<StreamProperties> stream_properties_;
-
-  RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(EchoControlMobileImpl);
-};
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_ECHO_CONTROL_MOBILE_IMPL_H_
diff --git a/modules/audio_processing/echo_control_mobile_unittest.cc b/modules/audio_processing/echo_control_mobile_unittest.cc
deleted file mode 100644
index 9941eca..0000000
--- a/modules/audio_processing/echo_control_mobile_unittest.cc
+++ /dev/null
@@ -1,224 +0,0 @@
-/*
- *  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 <vector>
-
-#include "webrtc/api/array_view.h"
-#include "webrtc/modules/audio_processing/audio_buffer.h"
-#include "webrtc/modules/audio_processing/echo_control_mobile_impl.h"
-#include "webrtc/modules/audio_processing/test/audio_buffer_tools.h"
-#include "webrtc/modules/audio_processing/test/bitexactness_tools.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-namespace {
-
-// TODO(peah): Increase the number of frames to proces when the issue of
-// non repeatable test results have been found.
-const int kNumFramesToProcess = 200;
-
-void SetupComponent(int sample_rate_hz,
-                    EchoControlMobile::RoutingMode routing_mode,
-                    bool comfort_noise_enabled,
-                    EchoControlMobileImpl* echo_control_mobile) {
-  echo_control_mobile->Initialize(
-      sample_rate_hz > 16000 ? 16000 : sample_rate_hz, 1, 1);
-  EchoControlMobile* ec = static_cast<EchoControlMobile*>(echo_control_mobile);
-  ec->Enable(true);
-  ec->set_routing_mode(routing_mode);
-  ec->enable_comfort_noise(comfort_noise_enabled);
-}
-
-void ProcessOneFrame(int sample_rate_hz,
-                     int stream_delay_ms,
-                     AudioBuffer* render_audio_buffer,
-                     AudioBuffer* capture_audio_buffer,
-                     EchoControlMobileImpl* echo_control_mobile) {
-  if (sample_rate_hz > AudioProcessing::kSampleRate16kHz) {
-    render_audio_buffer->SplitIntoFrequencyBands();
-    capture_audio_buffer->SplitIntoFrequencyBands();
-  }
-
-  std::vector<int16_t> render_audio;
-  EchoControlMobileImpl::PackRenderAudioBuffer(
-      render_audio_buffer, 1, render_audio_buffer->num_channels(),
-      &render_audio);
-  echo_control_mobile->ProcessRenderAudio(render_audio);
-
-  echo_control_mobile->ProcessCaptureAudio(capture_audio_buffer,
-                                           stream_delay_ms);
-
-  if (sample_rate_hz > AudioProcessing::kSampleRate16kHz) {
-    capture_audio_buffer->MergeFrequencyBands();
-  }
-}
-
-void RunBitexactnessTest(int sample_rate_hz,
-                         size_t num_channels,
-                         int stream_delay_ms,
-                         EchoControlMobile::RoutingMode routing_mode,
-                         bool comfort_noise_enabled,
-                         const rtc::ArrayView<const float>& output_reference) {
-  rtc::CriticalSection crit_render;
-  rtc::CriticalSection crit_capture;
-  EchoControlMobileImpl echo_control_mobile(&crit_render, &crit_capture);
-  SetupComponent(sample_rate_hz, routing_mode, comfort_noise_enabled,
-                 &echo_control_mobile);
-
-  const int samples_per_channel = rtc::CheckedDivExact(sample_rate_hz, 100);
-  const StreamConfig render_config(sample_rate_hz, num_channels, false);
-  AudioBuffer render_buffer(
-      render_config.num_frames(), render_config.num_channels(),
-      render_config.num_frames(), 1, render_config.num_frames());
-  test::InputAudioFile render_file(
-      test::GetApmRenderTestVectorFileName(sample_rate_hz));
-  std::vector<float> render_input(samples_per_channel * num_channels);
-
-  const StreamConfig capture_config(sample_rate_hz, num_channels, false);
-  AudioBuffer capture_buffer(
-      capture_config.num_frames(), capture_config.num_channels(),
-      capture_config.num_frames(), 1, capture_config.num_frames());
-  test::InputAudioFile capture_file(
-      test::GetApmCaptureTestVectorFileName(sample_rate_hz));
-  std::vector<float> capture_input(samples_per_channel * num_channels);
-
-  for (int frame_no = 0; frame_no < kNumFramesToProcess; ++frame_no) {
-    ReadFloatSamplesFromStereoFile(samples_per_channel, num_channels,
-                                   &render_file, render_input);
-    ReadFloatSamplesFromStereoFile(samples_per_channel, num_channels,
-                                   &capture_file, capture_input);
-
-    test::CopyVectorToAudioBuffer(render_config, render_input, &render_buffer);
-    test::CopyVectorToAudioBuffer(capture_config, capture_input,
-                                  &capture_buffer);
-
-    ProcessOneFrame(sample_rate_hz, stream_delay_ms, &render_buffer,
-                    &capture_buffer, &echo_control_mobile);
-  }
-
-  // Extract and verify the test results.
-  std::vector<float> capture_output;
-  test::ExtractVectorFromAudioBuffer(capture_config, &capture_buffer,
-                                     &capture_output);
-
-  // Compare the output with the reference. Only the first values of the output
-  // from last frame processed are compared in order not having to specify all
-  // preceeding frames as testvectors. As the algorithm being tested has a
-  // memory, testing only the last frame implicitly also tests the preceeding
-  // frames.
-  const float kElementErrorBound = 1.0f / 32768.0f;
-  EXPECT_TRUE(test::VerifyDeinterleavedArray(
-      capture_config.num_frames(), capture_config.num_channels(),
-      output_reference, capture_output, kElementErrorBound));
-}
-
-}  // namespace
-
-// TODO(peah): Renable once the integer overflow issue in aecm_core.c:932:69
-// has been solved.
-TEST(EchoControlMobileBitExactnessTest,
-     DISABLED_Mono8kHz_LoudSpeakerPhone_CngOn_StreamDelay0) {
-  const float kOutputReference[] = {0.005280f, 0.002380f, -0.000427f};
-
-  RunBitexactnessTest(8000, 1, 0,
-                      EchoControlMobile::RoutingMode::kLoudSpeakerphone, true,
-                      kOutputReference);
-}
-
-TEST(EchoControlMobileBitExactnessTest,
-     DISABLED_Mono16kHz_LoudSpeakerPhone_CngOn_StreamDelay0) {
-  const float kOutputReference[] = {0.003601f, 0.002991f, 0.001923f};
-  RunBitexactnessTest(16000, 1, 0,
-                      EchoControlMobile::RoutingMode::kLoudSpeakerphone, true,
-                      kOutputReference);
-}
-
-TEST(EchoControlMobileBitExactnessTest,
-     DISABLED_Mono32kHz_LoudSpeakerPhone_CngOn_StreamDelay0) {
-  const float kOutputReference[] = {0.002258f, 0.002899f, 0.003906f};
-
-  RunBitexactnessTest(32000, 1, 0,
-                      EchoControlMobile::RoutingMode::kLoudSpeakerphone, true,
-                      kOutputReference);
-}
-
-TEST(EchoControlMobileBitExactnessTest,
-     DISABLED_Mono48kHz_LoudSpeakerPhone_CngOn_StreamDelay0) {
-  const float kOutputReference[] = {-0.000046f, 0.000041f, 0.000249f};
-
-  RunBitexactnessTest(48000, 1, 0,
-                      EchoControlMobile::RoutingMode::kLoudSpeakerphone, true,
-                      kOutputReference);
-}
-
-TEST(EchoControlMobileBitExactnessTest,
-     DISABLED_Mono16kHz_LoudSpeakerPhone_CngOff_StreamDelay0) {
-  const float kOutputReference[] = {0.000000f, 0.000000f, 0.000000f};
-
-  RunBitexactnessTest(16000, 1, 0,
-                      EchoControlMobile::RoutingMode::kLoudSpeakerphone, false,
-                      kOutputReference);
-}
-
-// TODO(peah): Renable once the integer overflow issue in aecm_core.c:932:69
-// has been solved.
-TEST(EchoControlMobileBitExactnessTest,
-     DISABLED_Mono16kHz_LoudSpeakerPhone_CngOn_StreamDelay5) {
-  const float kOutputReference[] = {0.003693f, 0.002930f, 0.001801f};
-
-  RunBitexactnessTest(16000, 1, 5,
-                      EchoControlMobile::RoutingMode::kLoudSpeakerphone, true,
-                      kOutputReference);
-}
-
-TEST(EchoControlMobileBitExactnessTest,
-     Mono16kHz_LoudSpeakerPhone_CngOn_StreamDelay10) {
-  const float kOutputReference[] = {-0.002380f, -0.002533f, -0.002563f};
-
-  RunBitexactnessTest(16000, 1, 10,
-                      EchoControlMobile::RoutingMode::kLoudSpeakerphone, true,
-                      kOutputReference);
-}
-
-TEST(EchoControlMobileBitExactnessTest,
-     DISABLED_Mono16kHz_QuietEarpieceOrHeadset_CngOn_StreamDelay0) {
-  const float kOutputReference[] = {0.000397f, 0.000000f, -0.000305f};
-
-  RunBitexactnessTest(16000, 1, 0,
-                      EchoControlMobile::RoutingMode::kQuietEarpieceOrHeadset,
-                      true, kOutputReference);
-}
-
-TEST(EchoControlMobileBitExactnessTest,
-     DISABLED_Mono16kHz_Earpiece_CngOn_StreamDelay0) {
-  const float kOutputReference[] = {0.002167f, 0.001617f, 0.001038f};
-
-  RunBitexactnessTest(16000, 1, 0, EchoControlMobile::RoutingMode::kEarpiece,
-                      true, kOutputReference);
-}
-
-TEST(EchoControlMobileBitExactnessTest,
-     DISABLED_Mono16kHz_LoudEarpiece_CngOn_StreamDelay0) {
-  const float kOutputReference[] = {0.003540f, 0.002899f, 0.001862f};
-
-  RunBitexactnessTest(16000, 1, 0,
-                      EchoControlMobile::RoutingMode::kLoudEarpiece, true,
-                      kOutputReference);
-}
-
-TEST(EchoControlMobileBitExactnessTest,
-     DISABLED_Mono16kHz_SpeakerPhone_CngOn_StreamDelay0) {
-  const float kOutputReference[] = {0.003632f, 0.003052f, 0.001984f};
-
-  RunBitexactnessTest(16000, 1, 0,
-                      EchoControlMobile::RoutingMode::kSpeakerphone, true,
-                      kOutputReference);
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/echo_detector/circular_buffer.cc b/modules/audio_processing/echo_detector/circular_buffer.cc
deleted file mode 100644
index a24fc3e..0000000
--- a/modules/audio_processing/echo_detector/circular_buffer.cc
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- *  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_processing/echo_detector/circular_buffer.h"
-
-#include <algorithm>
-
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-
-CircularBuffer::CircularBuffer(size_t size) : buffer_(size) {}
-CircularBuffer::~CircularBuffer() = default;
-
-void CircularBuffer::Push(float value) {
-  buffer_[next_insertion_index_] = value;
-  ++next_insertion_index_;
-  next_insertion_index_ %= buffer_.size();
-  RTC_DCHECK_LT(next_insertion_index_, buffer_.size());
-  nr_elements_in_buffer_ = std::min(nr_elements_in_buffer_ + 1, buffer_.size());
-  RTC_DCHECK_LE(nr_elements_in_buffer_, buffer_.size());
-}
-
-rtc::Optional<float> CircularBuffer::Pop() {
-  if (nr_elements_in_buffer_ == 0) {
-    return rtc::Optional<float>();
-  }
-  const size_t index =
-      (buffer_.size() + next_insertion_index_ - nr_elements_in_buffer_) %
-      buffer_.size();
-  RTC_DCHECK_LT(index, buffer_.size());
-  --nr_elements_in_buffer_;
-  return rtc::Optional<float>(buffer_[index]);
-}
-
-void CircularBuffer::Clear() {
-  std::fill(buffer_.begin(), buffer_.end(), 0.f);
-  next_insertion_index_ = 0;
-  nr_elements_in_buffer_ = 0;
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/echo_detector/circular_buffer.h b/modules/audio_processing/echo_detector/circular_buffer.h
deleted file mode 100644
index cf58e33..0000000
--- a/modules/audio_processing/echo_detector/circular_buffer.h
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- *  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_PROCESSING_ECHO_DETECTOR_CIRCULAR_BUFFER_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_ECHO_DETECTOR_CIRCULAR_BUFFER_H_
-
-#include <vector>
-
-#include "webrtc/api/optional.h"
-
-namespace webrtc {
-
-// Ring buffer containing floating point values.
-struct CircularBuffer {
- public:
-  explicit CircularBuffer(size_t size);
-  ~CircularBuffer();
-
-  void Push(float value);
-  rtc::Optional<float> Pop();
-  size_t Size() const { return nr_elements_in_buffer_; }
-  // This function fills the buffer with zeros, but does not change its size.
-  void Clear();
-
- private:
-  std::vector<float> buffer_;
-  size_t next_insertion_index_ = 0;
-  // This is the number of elements that have been pushed into the circular
-  // buffer, not the allocated buffer size.
-  size_t nr_elements_in_buffer_ = 0;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_ECHO_DETECTOR_CIRCULAR_BUFFER_H_
diff --git a/modules/audio_processing/echo_detector/circular_buffer_unittest.cc b/modules/audio_processing/echo_detector/circular_buffer_unittest.cc
deleted file mode 100644
index 88f55a8..0000000
--- a/modules/audio_processing/echo_detector/circular_buffer_unittest.cc
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- *  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_processing/echo_detector/circular_buffer.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-TEST(CircularBufferTests, LessThanMaxTest) {
-  CircularBuffer test_buffer(3);
-  test_buffer.Push(1.f);
-  test_buffer.Push(2.f);
-  EXPECT_EQ(rtc::Optional<float>(1.f), test_buffer.Pop());
-  EXPECT_EQ(rtc::Optional<float>(2.f), test_buffer.Pop());
-}
-
-TEST(CircularBufferTests, FillTest) {
-  CircularBuffer test_buffer(3);
-  test_buffer.Push(1.f);
-  test_buffer.Push(2.f);
-  test_buffer.Push(3.f);
-  EXPECT_EQ(rtc::Optional<float>(1.f), test_buffer.Pop());
-  EXPECT_EQ(rtc::Optional<float>(2.f), test_buffer.Pop());
-  EXPECT_EQ(rtc::Optional<float>(3.f), test_buffer.Pop());
-}
-
-TEST(CircularBufferTests, OverflowTest) {
-  CircularBuffer test_buffer(3);
-  test_buffer.Push(1.f);
-  test_buffer.Push(2.f);
-  test_buffer.Push(3.f);
-  test_buffer.Push(4.f);
-  // Because the circular buffer has a size of 3, the first insert should have
-  // been forgotten.
-  EXPECT_EQ(rtc::Optional<float>(2.f), test_buffer.Pop());
-  EXPECT_EQ(rtc::Optional<float>(3.f), test_buffer.Pop());
-  EXPECT_EQ(rtc::Optional<float>(4.f), test_buffer.Pop());
-}
-
-TEST(CircularBufferTests, ReadFromEmpty) {
-  CircularBuffer test_buffer(3);
-  EXPECT_EQ(rtc::Optional<float>(), test_buffer.Pop());
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/echo_detector/mean_variance_estimator.cc b/modules/audio_processing/echo_detector/mean_variance_estimator.cc
deleted file mode 100644
index e6e29e5..0000000
--- a/modules/audio_processing/echo_detector/mean_variance_estimator.cc
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- *  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_processing/echo_detector/mean_variance_estimator.h"
-
-#include <math.h>
-
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-namespace {
-
-// Parameter controlling the adaptation speed.
-constexpr float kAlpha = 0.001f;
-
-}  // namespace
-
-void MeanVarianceEstimator::Update(float value) {
-  mean_ = (1.f - kAlpha) * mean_ + kAlpha * value;
-  variance_ =
-      (1.f - kAlpha) * variance_ + kAlpha * (value - mean_) * (value - mean_);
-  RTC_DCHECK(isfinite(mean_));
-  RTC_DCHECK(isfinite(variance_));
-}
-
-float MeanVarianceEstimator::std_deviation() const {
-  RTC_DCHECK_GE(variance_, 0.f);
-  return sqrtf(variance_);
-}
-
-float MeanVarianceEstimator::mean() const {
-  return mean_;
-}
-
-void MeanVarianceEstimator::Clear() {
-  mean_ = 0.f;
-  variance_ = 0.f;
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/echo_detector/mean_variance_estimator.h b/modules/audio_processing/echo_detector/mean_variance_estimator.h
deleted file mode 100644
index 3c0700f..0000000
--- a/modules/audio_processing/echo_detector/mean_variance_estimator.h
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- *  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_PROCESSING_ECHO_DETECTOR_MEAN_VARIANCE_ESTIMATOR_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_ECHO_DETECTOR_MEAN_VARIANCE_ESTIMATOR_H_
-
-namespace webrtc {
-
-// This class iteratively estimates the mean and variance of a signal.
-class MeanVarianceEstimator {
- public:
-  void Update(float value);
-  float std_deviation() const;
-  float mean() const;
-  void Clear();
-
- private:
-  // Estimate of the expected value of the input values.
-  float mean_ = 0.f;
-  // Estimate of the variance of the input values.
-  float variance_ = 0.f;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_ECHO_DETECTOR_MEAN_VARIANCE_ESTIMATOR_H_
diff --git a/modules/audio_processing/echo_detector/mean_variance_estimator_unittest.cc b/modules/audio_processing/echo_detector/mean_variance_estimator_unittest.cc
deleted file mode 100644
index ba45745..0000000
--- a/modules/audio_processing/echo_detector/mean_variance_estimator_unittest.cc
+++ /dev/null
@@ -1,64 +0,0 @@
-
-/*
- *  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_processing/echo_detector/mean_variance_estimator.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-TEST(MeanVarianceEstimatorTests, InsertTwoValues) {
-  MeanVarianceEstimator test_estimator;
-  // Insert two values.
-  test_estimator.Update(3.f);
-  test_estimator.Update(5.f);
-
-  EXPECT_GT(test_estimator.mean(), 0.f);
-  EXPECT_GT(test_estimator.std_deviation(), 0.f);
-  // Test Clear method
-  test_estimator.Clear();
-  EXPECT_EQ(test_estimator.mean(), 0.f);
-  EXPECT_EQ(test_estimator.std_deviation(), 0.f);
-}
-
-TEST(MeanVarianceEstimatorTests, InsertZeroes) {
-  MeanVarianceEstimator test_estimator;
-  // Insert the same value many times.
-  for (size_t i = 0; i < 20000; i++) {
-    test_estimator.Update(0.f);
-  }
-  EXPECT_EQ(test_estimator.mean(), 0.f);
-  EXPECT_EQ(test_estimator.std_deviation(), 0.f);
-}
-
-TEST(MeanVarianceEstimatorTests, ConstantValueTest) {
-  MeanVarianceEstimator test_estimator;
-  for (size_t i = 0; i < 20000; i++) {
-    test_estimator.Update(3.f);
-  }
-  // The mean should be close to three, and the standard deviation should be
-  // close to zero.
-  EXPECT_NEAR(3.0f, test_estimator.mean(), 0.01f);
-  EXPECT_NEAR(0.0f, test_estimator.std_deviation(), 0.01f);
-}
-
-TEST(MeanVarianceEstimatorTests, AlternatingValueTest) {
-  MeanVarianceEstimator test_estimator;
-  for (size_t i = 0; i < 20000; i++) {
-    test_estimator.Update(1.f);
-    test_estimator.Update(-1.f);
-  }
-  // The mean should be close to zero, and the standard deviation should be
-  // close to one.
-  EXPECT_NEAR(0.0f, test_estimator.mean(), 0.01f);
-  EXPECT_NEAR(1.0f, test_estimator.std_deviation(), 0.01f);
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/echo_detector/moving_max.cc b/modules/audio_processing/echo_detector/moving_max.cc
deleted file mode 100644
index 9c37ab6..0000000
--- a/modules/audio_processing/echo_detector/moving_max.cc
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- *  Copyright (c) 2017 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_processing/echo_detector/moving_max.h"
-
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-namespace {
-
-// Parameter for controlling how fast the estimated maximum decays after the
-// previous maximum is no longer valid. With a value of 0.99, the maximum will
-// decay to 1% of its former value after 460 updates.
-constexpr float kDecayFactor = 0.99f;
-
-}  // namespace
-
-MovingMax::MovingMax(size_t window_size) : window_size_(window_size) {
-  RTC_DCHECK_GT(window_size, 0);
-}
-
-MovingMax::~MovingMax() {}
-
-void MovingMax::Update(float value) {
-  if (counter_ >= window_size_ - 1) {
-    max_value_ *= kDecayFactor;
-  } else {
-    ++counter_;
-  }
-  if (value > max_value_) {
-    max_value_ = value;
-    counter_ = 0;
-  }
-}
-
-float MovingMax::max() const {
-  return max_value_;
-}
-
-void MovingMax::Clear() {
-  max_value_ = 0.f;
-  counter_ = 0;
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/echo_detector/moving_max.h b/modules/audio_processing/echo_detector/moving_max.h
deleted file mode 100644
index 556facf..0000000
--- a/modules/audio_processing/echo_detector/moving_max.h
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- *  Copyright (c) 2017 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_PROCESSING_ECHO_DETECTOR_MOVING_MAX_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_ECHO_DETECTOR_MOVING_MAX_H_
-
-#include <stddef.h>
-
-namespace webrtc {
-
-class MovingMax {
- public:
-  explicit MovingMax(size_t window_size);
-  ~MovingMax();
-
-  void Update(float value);
-  float max() const;
-  // Reset all of the state in this class.
-  void Clear();
-
- private:
-  float max_value_ = 0.f;
-  size_t counter_ = 0;
-  size_t window_size_ = 1;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_ECHO_DETECTOR_MOVING_MAX_H_
diff --git a/modules/audio_processing/echo_detector/moving_max_unittest.cc b/modules/audio_processing/echo_detector/moving_max_unittest.cc
deleted file mode 100644
index 720010d..0000000
--- a/modules/audio_processing/echo_detector/moving_max_unittest.cc
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- *  Copyright (c) 2017 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_processing/echo_detector/moving_max.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-// Test if the maximum is correctly found.
-TEST(MovingMaxTests, SimpleTest) {
-  MovingMax test_moving_max(5);
-  test_moving_max.Update(1.0f);
-  test_moving_max.Update(1.1f);
-  test_moving_max.Update(1.9f);
-  test_moving_max.Update(1.87f);
-  test_moving_max.Update(1.89f);
-  EXPECT_EQ(1.9f, test_moving_max.max());
-}
-
-// Test if values fall out of the window when expected.
-TEST(MovingMaxTests, SlidingWindowTest) {
-  MovingMax test_moving_max(5);
-  test_moving_max.Update(1.0f);
-  test_moving_max.Update(1.9f);
-  test_moving_max.Update(1.7f);
-  test_moving_max.Update(1.87f);
-  test_moving_max.Update(1.89f);
-  test_moving_max.Update(1.3f);
-  test_moving_max.Update(1.2f);
-  EXPECT_LT(test_moving_max.max(), 1.9f);
-}
-
-// Test if Clear() works as expected.
-TEST(MovingMaxTests, ClearTest) {
-  MovingMax test_moving_max(5);
-  test_moving_max.Update(1.0f);
-  test_moving_max.Update(1.1f);
-  test_moving_max.Update(1.9f);
-  test_moving_max.Update(1.87f);
-  test_moving_max.Update(1.89f);
-  EXPECT_EQ(1.9f, test_moving_max.max());
-  test_moving_max.Clear();
-  EXPECT_EQ(0.f, test_moving_max.max());
-}
-
-// Test the decay of the estimated maximum.
-TEST(MovingMaxTests, DecayTest) {
-  MovingMax test_moving_max(1);
-  test_moving_max.Update(1.0f);
-  float previous_value = 1.0f;
-  for (int i = 0; i < 500; i++) {
-    test_moving_max.Update(0.0f);
-    EXPECT_LT(test_moving_max.max(), previous_value);
-    EXPECT_GT(test_moving_max.max(), 0.0f);
-    previous_value = test_moving_max.max();
-  }
-  EXPECT_LT(test_moving_max.max(), 0.01f);
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/echo_detector/normalized_covariance_estimator.cc b/modules/audio_processing/echo_detector/normalized_covariance_estimator.cc
deleted file mode 100644
index 24e1810..0000000
--- a/modules/audio_processing/echo_detector/normalized_covariance_estimator.cc
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- *  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_processing/echo_detector/normalized_covariance_estimator.h"
-
-#include <math.h>
-
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-namespace {
-
-// Parameter controlling the adaptation speed.
-constexpr float kAlpha = 0.001f;
-
-}  // namespace
-
-void NormalizedCovarianceEstimator::Update(float x,
-                                           float x_mean,
-                                           float x_sigma,
-                                           float y,
-                                           float y_mean,
-                                           float y_sigma) {
-  covariance_ =
-      (1.f - kAlpha) * covariance_ + kAlpha * (x - x_mean) * (y - y_mean);
-  normalized_cross_correlation_ = covariance_ / (x_sigma * y_sigma + .0001f);
-  RTC_DCHECK(isfinite(covariance_));
-  RTC_DCHECK(isfinite(normalized_cross_correlation_));
-}
-
-void NormalizedCovarianceEstimator::Clear() {
-  covariance_ = 0.f;
-  normalized_cross_correlation_ = 0.f;
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/echo_detector/normalized_covariance_estimator.h b/modules/audio_processing/echo_detector/normalized_covariance_estimator.h
deleted file mode 100644
index da5ff34..0000000
--- a/modules/audio_processing/echo_detector/normalized_covariance_estimator.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- *  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_PROCESSING_ECHO_DETECTOR_NORMALIZED_COVARIANCE_ESTIMATOR_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_ECHO_DETECTOR_NORMALIZED_COVARIANCE_ESTIMATOR_H_
-
-namespace webrtc {
-
-// This class iteratively estimates the normalized covariance between two
-// signals.
-class NormalizedCovarianceEstimator {
- public:
-  void Update(float x,
-              float x_mean,
-              float x_var,
-              float y,
-              float y_mean,
-              float y_var);
-  // This function returns an estimate of the Pearson product-moment correlation
-  // coefficient of the two signals.
-  float normalized_cross_correlation() const {
-    return normalized_cross_correlation_;
-  }
-  float covariance() const { return covariance_; }
-  // This function resets the estimated values to zero.
-  void Clear();
-
- private:
-  float normalized_cross_correlation_ = 0.f;
-  // Estimate of the covariance value.
-  float covariance_ = 0.f;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_ECHO_DETECTOR_NORMALIZED_COVARIANCE_ESTIMATOR_H_
diff --git a/modules/audio_processing/echo_detector/normalized_covariance_estimator_unittest.cc b/modules/audio_processing/echo_detector/normalized_covariance_estimator_unittest.cc
deleted file mode 100644
index 04b3a92..0000000
--- a/modules/audio_processing/echo_detector/normalized_covariance_estimator_unittest.cc
+++ /dev/null
@@ -1,40 +0,0 @@
-
-/*
- *  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_processing/echo_detector/normalized_covariance_estimator.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-TEST(NormalizedCovarianceEstimatorTests, IdenticalSignalTest) {
-  NormalizedCovarianceEstimator test_estimator;
-  for (size_t i = 0; i < 10000; i++) {
-    test_estimator.Update(1.f, 0.f, 1.f, 1.f, 0.f, 1.f);
-    test_estimator.Update(-1.f, 0.f, 1.f, -1.f, 0.f, 1.f);
-  }
-  // A normalized covariance value close to 1 is expected.
-  EXPECT_NEAR(1.f, test_estimator.normalized_cross_correlation(), 0.01f);
-  test_estimator.Clear();
-  EXPECT_EQ(0.f, test_estimator.normalized_cross_correlation());
-}
-
-TEST(NormalizedCovarianceEstimatorTests, OppositeSignalTest) {
-  NormalizedCovarianceEstimator test_estimator;
-  // Insert the same value many times.
-  for (size_t i = 0; i < 10000; i++) {
-    test_estimator.Update(1.f, 0.f, 1.f, -1.f, 0.f, 1.f);
-    test_estimator.Update(-1.f, 0.f, 1.f, 1.f, 0.f, 1.f);
-  }
-  // A normalized covariance value close to -1 is expected.
-  EXPECT_NEAR(-1.f, test_estimator.normalized_cross_correlation(), 0.01f);
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/gain_control_for_experimental_agc.cc b/modules/audio_processing/gain_control_for_experimental_agc.cc
deleted file mode 100644
index 308ee12..0000000
--- a/modules/audio_processing/gain_control_for_experimental_agc.cc
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- *  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_processing/gain_control_for_experimental_agc.h"
-
-#include "webrtc/modules/audio_processing/include/audio_processing.h"
-#include "webrtc/modules/audio_processing/logging/apm_data_dumper.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/criticalsection.h"
-
-namespace webrtc {
-
-int GainControlForExperimentalAgc::instance_counter_ = 0;
-
-GainControlForExperimentalAgc::GainControlForExperimentalAgc(
-    GainControl* gain_control,
-    rtc::CriticalSection* crit_capture)
-    : data_dumper_(new ApmDataDumper(instance_counter_)),
-      real_gain_control_(gain_control),
-      volume_(0),
-      crit_capture_(crit_capture) {
-  instance_counter_++;
-}
-
-GainControlForExperimentalAgc::~GainControlForExperimentalAgc() = default;
-
-int GainControlForExperimentalAgc::Enable(bool enable) {
-  return real_gain_control_->Enable(enable);
-}
-
-bool GainControlForExperimentalAgc::is_enabled() const {
-  return real_gain_control_->is_enabled();
-}
-
-int GainControlForExperimentalAgc::set_stream_analog_level(int level) {
-  rtc::CritScope cs_capture(crit_capture_);
-  data_dumper_->DumpRaw("experimental_gain_control_set_stream_analog_level", 1,
-                        &level);
-  volume_ = level;
-  return AudioProcessing::kNoError;
-}
-
-int GainControlForExperimentalAgc::stream_analog_level() {
-  rtc::CritScope cs_capture(crit_capture_);
-  data_dumper_->DumpRaw("experimental_gain_control_stream_analog_level", 1,
-                        &volume_);
-  return volume_;
-}
-
-int GainControlForExperimentalAgc::set_mode(Mode mode) {
-  return AudioProcessing::kNoError;
-}
-
-GainControl::Mode GainControlForExperimentalAgc::mode() const {
-  return GainControl::kAdaptiveAnalog;
-}
-
-int GainControlForExperimentalAgc::set_target_level_dbfs(int level) {
-  return AudioProcessing::kNoError;
-}
-
-int GainControlForExperimentalAgc::target_level_dbfs() const {
-  return real_gain_control_->target_level_dbfs();
-}
-
-int GainControlForExperimentalAgc::set_compression_gain_db(int gain) {
-  return AudioProcessing::kNoError;
-}
-
-int GainControlForExperimentalAgc::compression_gain_db() const {
-  return real_gain_control_->compression_gain_db();
-}
-
-int GainControlForExperimentalAgc::enable_limiter(bool enable) {
-  return AudioProcessing::kNoError;
-}
-
-bool GainControlForExperimentalAgc::is_limiter_enabled() const {
-  return real_gain_control_->is_limiter_enabled();
-}
-
-int GainControlForExperimentalAgc::set_analog_level_limits(int minimum,
-                                                           int maximum) {
-  return AudioProcessing::kNoError;
-}
-
-int GainControlForExperimentalAgc::analog_level_minimum() const {
-  return real_gain_control_->analog_level_minimum();
-}
-
-int GainControlForExperimentalAgc::analog_level_maximum() const {
-  return real_gain_control_->analog_level_maximum();
-}
-
-bool GainControlForExperimentalAgc::stream_is_saturated() const {
-  return real_gain_control_->stream_is_saturated();
-}
-
-void GainControlForExperimentalAgc::SetMicVolume(int volume) {
-  rtc::CritScope cs_capture(crit_capture_);
-  volume_ = volume;
-}
-
-int GainControlForExperimentalAgc::GetMicVolume() {
-  rtc::CritScope cs_capture(crit_capture_);
-  return volume_;
-}
-
-void GainControlForExperimentalAgc::Initialize() {
-  data_dumper_->InitiateNewSetOfRecordings();
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/gain_control_for_experimental_agc.h b/modules/audio_processing/gain_control_for_experimental_agc.h
deleted file mode 100644
index 977685b..0000000
--- a/modules/audio_processing/gain_control_for_experimental_agc.h
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- *  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_PROCESSING_GAIN_CONTROL_FOR_EXPERIMENTAL_AGC_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_GAIN_CONTROL_FOR_EXPERIMENTAL_AGC_H_
-
-#include "webrtc/modules/audio_processing/agc/agc_manager_direct.h"
-#include "webrtc/modules/audio_processing/include/audio_processing.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/thread_checker.h"
-
-namespace webrtc {
-
-class ApmDataDumper;
-
-// This class has two main purposes:
-//
-// 1) It is returned instead of the real GainControl after the new AGC has been
-//    enabled in order to prevent an outside user from overriding compression
-//    settings. It doesn't do anything in its implementation, except for
-//    delegating the const methods and Enable calls to the real GainControl, so
-//    AGC can still be disabled.
-//
-// 2) It is injected into AgcManagerDirect and implements volume callbacks for
-//    getting and setting the volume level. It just caches this value to be used
-//    in VoiceEngine later.
-class GainControlForExperimentalAgc : public GainControl,
-                                      public VolumeCallbacks {
- public:
-  GainControlForExperimentalAgc(GainControl* gain_control,
-                                rtc::CriticalSection* crit_capture);
-  ~GainControlForExperimentalAgc() override;
-
-  // GainControl implementation.
-  int Enable(bool enable) override;
-  bool is_enabled() const override;
-  int set_stream_analog_level(int level) override;
-  int stream_analog_level() override;
-  int set_mode(Mode mode) override;
-  Mode mode() const override;
-  int set_target_level_dbfs(int level) override;
-  int target_level_dbfs() const override;
-  int set_compression_gain_db(int gain) override;
-  int compression_gain_db() const override;
-  int enable_limiter(bool enable) override;
-  bool is_limiter_enabled() const override;
-  int set_analog_level_limits(int minimum, int maximum) override;
-  int analog_level_minimum() const override;
-  int analog_level_maximum() const override;
-  bool stream_is_saturated() const override;
-
-  // VolumeCallbacks implementation.
-  void SetMicVolume(int volume) override;
-  int GetMicVolume() override;
-
-  void Initialize();
-
- private:
-  std::unique_ptr<ApmDataDumper> data_dumper_;
-  GainControl* real_gain_control_;
-  int volume_;
-  rtc::CriticalSection* crit_capture_;
-  static int instance_counter_;
-  RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(GainControlForExperimentalAgc);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_GAIN_CONTROL_FOR_EXPERIMENTAL_AGC_H_
diff --git a/modules/audio_processing/gain_control_impl.cc b/modules/audio_processing/gain_control_impl.cc
deleted file mode 100644
index f882d10..0000000
--- a/modules/audio_processing/gain_control_impl.cc
+++ /dev/null
@@ -1,439 +0,0 @@
-/*
- *  Copyright (c) 2012 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_processing/gain_control_impl.h"
-
-#include "webrtc/api/optional.h"
-#include "webrtc/modules/audio_processing/agc/legacy/gain_control.h"
-#include "webrtc/modules/audio_processing/audio_buffer.h"
-#include "webrtc/modules/audio_processing/logging/apm_data_dumper.h"
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace webrtc {
-
-typedef void Handle;
-
-namespace {
-int16_t MapSetting(GainControl::Mode mode) {
-  switch (mode) {
-    case GainControl::kAdaptiveAnalog:
-      return kAgcModeAdaptiveAnalog;
-    case GainControl::kAdaptiveDigital:
-      return kAgcModeAdaptiveDigital;
-    case GainControl::kFixedDigital:
-      return kAgcModeFixedDigital;
-  }
-  RTC_NOTREACHED();
-  return -1;
-}
-
-}  // namespace
-
-class GainControlImpl::GainController {
- public:
-  explicit GainController() {
-    state_ = WebRtcAgc_Create();
-    RTC_CHECK(state_);
-  }
-
-  ~GainController() {
-    RTC_DCHECK(state_);
-    WebRtcAgc_Free(state_);
-  }
-
-  Handle* state() {
-    RTC_DCHECK(state_);
-    return state_;
-  }
-
-  void Initialize(int minimum_capture_level,
-                  int maximum_capture_level,
-                  Mode mode,
-                  int sample_rate_hz,
-                  int capture_level) {
-    RTC_DCHECK(state_);
-    int error =
-        WebRtcAgc_Init(state_, minimum_capture_level, maximum_capture_level,
-                       MapSetting(mode), sample_rate_hz);
-    RTC_DCHECK_EQ(0, error);
-
-    set_capture_level(capture_level);
-  }
-
-  void set_capture_level(int capture_level) {
-    capture_level_ = rtc::Optional<int>(capture_level);
-  }
-
-  int get_capture_level() {
-    RTC_DCHECK(capture_level_);
-    return *capture_level_;
-  }
-
- private:
-  Handle* state_;
-  // TODO(peah): Remove the optional once the initialization is moved into the
-  // ctor.
-  rtc::Optional<int> capture_level_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(GainController);
-};
-
-int GainControlImpl::instance_counter_ = 0;
-
-GainControlImpl::GainControlImpl(rtc::CriticalSection* crit_render,
-                                 rtc::CriticalSection* crit_capture)
-    : crit_render_(crit_render),
-      crit_capture_(crit_capture),
-      data_dumper_(new ApmDataDumper(instance_counter_)),
-      mode_(kAdaptiveAnalog),
-      minimum_capture_level_(0),
-      maximum_capture_level_(255),
-      limiter_enabled_(true),
-      target_level_dbfs_(3),
-      compression_gain_db_(9),
-      analog_capture_level_(0),
-      was_analog_level_set_(false),
-      stream_is_saturated_(false) {
-  RTC_DCHECK(crit_render);
-  RTC_DCHECK(crit_capture);
-}
-
-GainControlImpl::~GainControlImpl() {}
-
-void GainControlImpl::ProcessRenderAudio(
-    rtc::ArrayView<const int16_t> packed_render_audio) {
-  rtc::CritScope cs_capture(crit_capture_);
-  if (!enabled_) {
-    return;
-  }
-
-  for (auto& gain_controller : gain_controllers_) {
-    WebRtcAgc_AddFarend(gain_controller->state(), packed_render_audio.data(),
-                        packed_render_audio.size());
-  }
-}
-
-void GainControlImpl::PackRenderAudioBuffer(
-    AudioBuffer* audio,
-    std::vector<int16_t>* packed_buffer) {
-  RTC_DCHECK_GE(160, audio->num_frames_per_band());
-
-  packed_buffer->clear();
-  packed_buffer->insert(
-      packed_buffer->end(), audio->mixed_low_pass_data(),
-      (audio->mixed_low_pass_data() + audio->num_frames_per_band()));
-}
-
-int GainControlImpl::AnalyzeCaptureAudio(AudioBuffer* audio) {
-  rtc::CritScope cs(crit_capture_);
-
-  if (!enabled_) {
-    return AudioProcessing::kNoError;
-  }
-
-  RTC_DCHECK(num_proc_channels_);
-  RTC_DCHECK_GE(160, audio->num_frames_per_band());
-  RTC_DCHECK_EQ(audio->num_channels(), *num_proc_channels_);
-  RTC_DCHECK_LE(*num_proc_channels_, gain_controllers_.size());
-
-  if (mode_ == kAdaptiveAnalog) {
-    int capture_channel = 0;
-    for (auto& gain_controller : gain_controllers_) {
-      gain_controller->set_capture_level(analog_capture_level_);
-      int err = WebRtcAgc_AddMic(
-          gain_controller->state(), audio->split_bands(capture_channel),
-          audio->num_bands(), audio->num_frames_per_band());
-
-      if (err != AudioProcessing::kNoError) {
-        return AudioProcessing::kUnspecifiedError;
-      }
-      ++capture_channel;
-    }
-  } else if (mode_ == kAdaptiveDigital) {
-    int capture_channel = 0;
-    for (auto& gain_controller : gain_controllers_) {
-      int32_t capture_level_out = 0;
-      int err = WebRtcAgc_VirtualMic(
-          gain_controller->state(), audio->split_bands(capture_channel),
-          audio->num_bands(), audio->num_frames_per_band(),
-          analog_capture_level_, &capture_level_out);
-
-      gain_controller->set_capture_level(capture_level_out);
-
-      if (err != AudioProcessing::kNoError) {
-        return AudioProcessing::kUnspecifiedError;
-      }
-      ++capture_channel;
-    }
-  }
-
-  return AudioProcessing::kNoError;
-}
-
-int GainControlImpl::ProcessCaptureAudio(AudioBuffer* audio,
-                                         bool stream_has_echo) {
-  rtc::CritScope cs(crit_capture_);
-
-  if (!enabled_) {
-    return AudioProcessing::kNoError;
-  }
-
-  if (mode_ == kAdaptiveAnalog && !was_analog_level_set_) {
-    return AudioProcessing::kStreamParameterNotSetError;
-  }
-
-  RTC_DCHECK(num_proc_channels_);
-  RTC_DCHECK_GE(160, audio->num_frames_per_band());
-  RTC_DCHECK_EQ(audio->num_channels(), *num_proc_channels_);
-
-  stream_is_saturated_ = false;
-  int capture_channel = 0;
-  for (auto& gain_controller : gain_controllers_) {
-    int32_t capture_level_out = 0;
-    uint8_t saturation_warning = 0;
-
-    // The call to stream_has_echo() is ok from a deadlock perspective
-    // as the capture lock is allready held.
-    int err = WebRtcAgc_Process(
-        gain_controller->state(), audio->split_bands_const(capture_channel),
-        audio->num_bands(), audio->num_frames_per_band(),
-        audio->split_bands(capture_channel),
-        gain_controller->get_capture_level(), &capture_level_out,
-        stream_has_echo, &saturation_warning);
-
-    if (err != AudioProcessing::kNoError) {
-      return AudioProcessing::kUnspecifiedError;
-    }
-
-    gain_controller->set_capture_level(capture_level_out);
-    if (saturation_warning == 1) {
-      stream_is_saturated_ = true;
-    }
-
-    ++capture_channel;
-  }
-
-  RTC_DCHECK_LT(0ul, *num_proc_channels_);
-  if (mode_ == kAdaptiveAnalog) {
-    // Take the analog level to be the average across the handles.
-    analog_capture_level_ = 0;
-    for (auto& gain_controller : gain_controllers_) {
-      analog_capture_level_ += gain_controller->get_capture_level();
-    }
-
-    analog_capture_level_ /= (*num_proc_channels_);
-  }
-
-  was_analog_level_set_ = false;
-  return AudioProcessing::kNoError;
-}
-
-int GainControlImpl::compression_gain_db() const {
-  rtc::CritScope cs(crit_capture_);
-  return compression_gain_db_;
-}
-
-// TODO(ajm): ensure this is called under kAdaptiveAnalog.
-int GainControlImpl::set_stream_analog_level(int level) {
-  rtc::CritScope cs(crit_capture_);
-  data_dumper_->DumpRaw("gain_control_set_stream_analog_level", 1, &level);
-
-  was_analog_level_set_ = true;
-  if (level < minimum_capture_level_ || level > maximum_capture_level_) {
-    return AudioProcessing::kBadParameterError;
-  }
-  analog_capture_level_ = level;
-
-  return AudioProcessing::kNoError;
-}
-
-int GainControlImpl::stream_analog_level() {
-  rtc::CritScope cs(crit_capture_);
-  data_dumper_->DumpRaw("gain_control_stream_analog_level", 1,
-                        &analog_capture_level_);
-  // TODO(ajm): enable this assertion?
-  //RTC_DCHECK_EQ(kAdaptiveAnalog, mode_);
-
-  return analog_capture_level_;
-}
-
-int GainControlImpl::Enable(bool enable) {
-  rtc::CritScope cs_render(crit_render_);
-  rtc::CritScope cs_capture(crit_capture_);
-  if (enable && !enabled_) {
-    enabled_ = enable;  // Must be set before Initialize() is called.
-
-    RTC_DCHECK(num_proc_channels_);
-    RTC_DCHECK(sample_rate_hz_);
-    Initialize(*num_proc_channels_, *sample_rate_hz_);
-  } else {
-    enabled_ = enable;
-  }
-  return AudioProcessing::kNoError;
-}
-
-bool GainControlImpl::is_enabled() const {
-  rtc::CritScope cs(crit_capture_);
-  return enabled_;
-}
-
-int GainControlImpl::set_mode(Mode mode) {
-  rtc::CritScope cs_render(crit_render_);
-  rtc::CritScope cs_capture(crit_capture_);
-  if (MapSetting(mode) == -1) {
-    return AudioProcessing::kBadParameterError;
-  }
-
-  mode_ = mode;
-  RTC_DCHECK(num_proc_channels_);
-  RTC_DCHECK(sample_rate_hz_);
-  Initialize(*num_proc_channels_, *sample_rate_hz_);
-  return AudioProcessing::kNoError;
-}
-
-GainControl::Mode GainControlImpl::mode() const {
-  rtc::CritScope cs(crit_capture_);
-  return mode_;
-}
-
-int GainControlImpl::set_analog_level_limits(int minimum,
-                                             int maximum) {
-  if (minimum < 0) {
-    return AudioProcessing::kBadParameterError;
-  }
-
-  if (maximum > 65535) {
-    return AudioProcessing::kBadParameterError;
-  }
-
-  if (maximum < minimum) {
-    return AudioProcessing::kBadParameterError;
-  }
-
-  size_t num_proc_channels_local = 0u;
-  int sample_rate_hz_local = 0;
-  {
-    rtc::CritScope cs(crit_capture_);
-
-    minimum_capture_level_ = minimum;
-    maximum_capture_level_ = maximum;
-
-    RTC_DCHECK(num_proc_channels_);
-    RTC_DCHECK(sample_rate_hz_);
-    num_proc_channels_local = *num_proc_channels_;
-    sample_rate_hz_local = *sample_rate_hz_;
-  }
-  Initialize(num_proc_channels_local, sample_rate_hz_local);
-  return AudioProcessing::kNoError;
-}
-
-int GainControlImpl::analog_level_minimum() const {
-  rtc::CritScope cs(crit_capture_);
-  return minimum_capture_level_;
-}
-
-int GainControlImpl::analog_level_maximum() const {
-  rtc::CritScope cs(crit_capture_);
-  return maximum_capture_level_;
-}
-
-bool GainControlImpl::stream_is_saturated() const {
-  rtc::CritScope cs(crit_capture_);
-  return stream_is_saturated_;
-}
-
-int GainControlImpl::set_target_level_dbfs(int level) {
-  if (level > 31 || level < 0) {
-    return AudioProcessing::kBadParameterError;
-  }
-  {
-    rtc::CritScope cs(crit_capture_);
-    target_level_dbfs_ = level;
-  }
-  return Configure();
-}
-
-int GainControlImpl::target_level_dbfs() const {
-  rtc::CritScope cs(crit_capture_);
-  return target_level_dbfs_;
-}
-
-int GainControlImpl::set_compression_gain_db(int gain) {
-  if (gain < 0 || gain > 90) {
-    return AudioProcessing::kBadParameterError;
-  }
-  {
-    rtc::CritScope cs(crit_capture_);
-    compression_gain_db_ = gain;
-  }
-  return Configure();
-}
-
-int GainControlImpl::enable_limiter(bool enable) {
-  {
-    rtc::CritScope cs(crit_capture_);
-    limiter_enabled_ = enable;
-  }
-  return Configure();
-}
-
-bool GainControlImpl::is_limiter_enabled() const {
-  rtc::CritScope cs(crit_capture_);
-  return limiter_enabled_;
-}
-
-void GainControlImpl::Initialize(size_t num_proc_channels, int sample_rate_hz) {
-  rtc::CritScope cs_render(crit_render_);
-  rtc::CritScope cs_capture(crit_capture_);
-  data_dumper_->InitiateNewSetOfRecordings();
-
-  num_proc_channels_ = rtc::Optional<size_t>(num_proc_channels);
-  sample_rate_hz_ = rtc::Optional<int>(sample_rate_hz);
-
-  if (!enabled_) {
-    return;
-  }
-
-  gain_controllers_.resize(*num_proc_channels_);
-  for (auto& gain_controller : gain_controllers_) {
-    if (!gain_controller) {
-      gain_controller.reset(new GainController());
-    }
-    gain_controller->Initialize(minimum_capture_level_, maximum_capture_level_,
-                                mode_, *sample_rate_hz_, analog_capture_level_);
-  }
-
-  Configure();
-}
-
-int GainControlImpl::Configure() {
-  rtc::CritScope cs_render(crit_render_);
-  rtc::CritScope cs_capture(crit_capture_);
-  WebRtcAgcConfig config;
-  // TODO(ajm): Flip the sign here (since AGC expects a positive value) if we
-  //            change the interface.
-  //RTC_DCHECK_LE(target_level_dbfs_, 0);
-  //config.targetLevelDbfs = static_cast<int16_t>(-target_level_dbfs_);
-  config.targetLevelDbfs = static_cast<int16_t>(target_level_dbfs_);
-  config.compressionGaindB =
-      static_cast<int16_t>(compression_gain_db_);
-  config.limiterEnable = limiter_enabled_;
-
-  int error = AudioProcessing::kNoError;
-  for (auto& gain_controller : gain_controllers_) {
-    const int handle_error =
-        WebRtcAgc_set_config(gain_controller->state(), config);
-    if (handle_error != AudioProcessing::kNoError) {
-      error = handle_error;
-    }
-  }
-  return error;
-}
-}  // namespace webrtc
diff --git a/modules/audio_processing/gain_control_impl.h b/modules/audio_processing/gain_control_impl.h
deleted file mode 100644
index 8fca699..0000000
--- a/modules/audio_processing/gain_control_impl.h
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- *  Copyright (c) 2012 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_PROCESSING_GAIN_CONTROL_IMPL_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_GAIN_CONTROL_IMPL_H_
-
-#include <memory>
-#include <vector>
-
-#include "webrtc/modules/audio_processing/include/audio_processing.h"
-#include "webrtc/modules/audio_processing/render_queue_item_verifier.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/swap_queue.h"
-#include "webrtc/rtc_base/thread_annotations.h"
-
-namespace webrtc {
-
-class ApmDataDumper;
-class AudioBuffer;
-
-class GainControlImpl : public GainControl {
- public:
-  GainControlImpl(rtc::CriticalSection* crit_render,
-                  rtc::CriticalSection* crit_capture);
-  ~GainControlImpl() override;
-
-  void ProcessRenderAudio(rtc::ArrayView<const int16_t> packed_render_audio);
-  int AnalyzeCaptureAudio(AudioBuffer* audio);
-  int ProcessCaptureAudio(AudioBuffer* audio, bool stream_has_echo);
-
-  void Initialize(size_t num_proc_channels, int sample_rate_hz);
-
-  static void PackRenderAudioBuffer(AudioBuffer* audio,
-                                    std::vector<int16_t>* packed_buffer);
-
-  // GainControl implementation.
-  bool is_enabled() const override;
-  int stream_analog_level() override;
-  bool is_limiter_enabled() const override;
-  Mode mode() const override;
-
-  int compression_gain_db() const override;
-
- private:
-  class GainController;
-
-  // GainControl implementation.
-  int Enable(bool enable) override;
-  int set_stream_analog_level(int level) override;
-  int set_mode(Mode mode) override;
-  int set_target_level_dbfs(int level) override;
-  int target_level_dbfs() const override;
-  int set_compression_gain_db(int gain) override;
-  int enable_limiter(bool enable) override;
-  int set_analog_level_limits(int minimum, int maximum) override;
-  int analog_level_minimum() const override;
-  int analog_level_maximum() const override;
-  bool stream_is_saturated() const override;
-
-  int Configure();
-
-  rtc::CriticalSection* const crit_render_ RTC_ACQUIRED_BEFORE(crit_capture_);
-  rtc::CriticalSection* const crit_capture_;
-
-  std::unique_ptr<ApmDataDumper> data_dumper_;
-
-  bool enabled_ = false;
-
-  Mode mode_ RTC_GUARDED_BY(crit_capture_);
-  int minimum_capture_level_ RTC_GUARDED_BY(crit_capture_);
-  int maximum_capture_level_ RTC_GUARDED_BY(crit_capture_);
-  bool limiter_enabled_ RTC_GUARDED_BY(crit_capture_);
-  int target_level_dbfs_ RTC_GUARDED_BY(crit_capture_);
-  int compression_gain_db_ RTC_GUARDED_BY(crit_capture_);
-  int analog_capture_level_ RTC_GUARDED_BY(crit_capture_);
-  bool was_analog_level_set_ RTC_GUARDED_BY(crit_capture_);
-  bool stream_is_saturated_ RTC_GUARDED_BY(crit_capture_);
-
-  std::vector<std::unique_ptr<GainController>> gain_controllers_;
-
-  rtc::Optional<size_t> num_proc_channels_ RTC_GUARDED_BY(crit_capture_);
-  rtc::Optional<int> sample_rate_hz_ RTC_GUARDED_BY(crit_capture_);
-
-  static int instance_counter_;
-  RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(GainControlImpl);
-};
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_GAIN_CONTROL_IMPL_H_
diff --git a/modules/audio_processing/gain_control_unittest.cc b/modules/audio_processing/gain_control_unittest.cc
deleted file mode 100644
index c0c5269..0000000
--- a/modules/audio_processing/gain_control_unittest.cc
+++ /dev/null
@@ -1,441 +0,0 @@
-/*
- *  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 <vector>
-
-#include "webrtc/api/array_view.h"
-#include "webrtc/modules/audio_processing/audio_buffer.h"
-#include "webrtc/modules/audio_processing/gain_control_impl.h"
-#include "webrtc/modules/audio_processing/test/audio_buffer_tools.h"
-#include "webrtc/modules/audio_processing/test/bitexactness_tools.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-namespace {
-
-const int kNumFramesToProcess = 100;
-
-void ProcessOneFrame(int sample_rate_hz,
-                     AudioBuffer* render_audio_buffer,
-                     AudioBuffer* capture_audio_buffer,
-                     GainControlImpl* gain_controller) {
-  if (sample_rate_hz > AudioProcessing::kSampleRate16kHz) {
-    render_audio_buffer->SplitIntoFrequencyBands();
-    capture_audio_buffer->SplitIntoFrequencyBands();
-  }
-
-  std::vector<int16_t> render_audio;
-  GainControlImpl::PackRenderAudioBuffer(render_audio_buffer, &render_audio);
-  gain_controller->ProcessRenderAudio(render_audio);
-  gain_controller->AnalyzeCaptureAudio(capture_audio_buffer);
-  gain_controller->ProcessCaptureAudio(capture_audio_buffer, false);
-
-  if (sample_rate_hz > AudioProcessing::kSampleRate16kHz) {
-    capture_audio_buffer->MergeFrequencyBands();
-  }
-}
-
-void SetupComponent(int sample_rate_hz,
-                    GainControl::Mode mode,
-                    int target_level_dbfs,
-                    int stream_analog_level,
-                    int compression_gain_db,
-                    bool enable_limiter,
-                    int analog_level_min,
-                    int analog_level_max,
-                    GainControlImpl* gain_controller) {
-  gain_controller->Initialize(1, sample_rate_hz);
-  GainControl* gc = static_cast<GainControl*>(gain_controller);
-  gc->Enable(true);
-  gc->set_mode(mode);
-  gc->set_stream_analog_level(stream_analog_level);
-  gc->set_target_level_dbfs(target_level_dbfs);
-  gc->set_compression_gain_db(compression_gain_db);
-  gc->enable_limiter(enable_limiter);
-  gc->set_analog_level_limits(analog_level_min, analog_level_max);
-}
-
-void RunBitExactnessTest(int sample_rate_hz,
-                         size_t num_channels,
-                         GainControl::Mode mode,
-                         int target_level_dbfs,
-                         int stream_analog_level,
-                         int compression_gain_db,
-                         bool enable_limiter,
-                         int analog_level_min,
-                         int analog_level_max,
-                         int achieved_stream_analog_level_reference,
-                         rtc::ArrayView<const float> output_reference) {
-  rtc::CriticalSection crit_render;
-  rtc::CriticalSection crit_capture;
-  GainControlImpl gain_controller(&crit_render, &crit_capture);
-  SetupComponent(sample_rate_hz, mode, target_level_dbfs, stream_analog_level,
-                 compression_gain_db, enable_limiter, analog_level_min,
-                 analog_level_max, &gain_controller);
-
-  const int samples_per_channel = rtc::CheckedDivExact(sample_rate_hz, 100);
-  const StreamConfig render_config(sample_rate_hz, num_channels, false);
-  AudioBuffer render_buffer(
-      render_config.num_frames(), render_config.num_channels(),
-      render_config.num_frames(), 1, render_config.num_frames());
-  test::InputAudioFile render_file(
-      test::GetApmRenderTestVectorFileName(sample_rate_hz));
-  std::vector<float> render_input(samples_per_channel * num_channels);
-
-  const StreamConfig capture_config(sample_rate_hz, num_channels, false);
-  AudioBuffer capture_buffer(
-      capture_config.num_frames(), capture_config.num_channels(),
-      capture_config.num_frames(), 1, capture_config.num_frames());
-  test::InputAudioFile capture_file(
-      test::GetApmCaptureTestVectorFileName(sample_rate_hz));
-  std::vector<float> capture_input(samples_per_channel * num_channels);
-
-  for (int frame_no = 0; frame_no < kNumFramesToProcess; ++frame_no) {
-    ReadFloatSamplesFromStereoFile(samples_per_channel, num_channels,
-                                   &render_file, render_input);
-    ReadFloatSamplesFromStereoFile(samples_per_channel, num_channels,
-                                   &capture_file, capture_input);
-
-    test::CopyVectorToAudioBuffer(render_config, render_input, &render_buffer);
-    test::CopyVectorToAudioBuffer(capture_config, capture_input,
-                                  &capture_buffer);
-
-    ProcessOneFrame(sample_rate_hz, &render_buffer, &capture_buffer,
-                    &gain_controller);
-  }
-
-  // Extract and verify the test results.
-  std::vector<float> capture_output;
-  test::ExtractVectorFromAudioBuffer(capture_config, &capture_buffer,
-                                     &capture_output);
-
-  EXPECT_EQ(achieved_stream_analog_level_reference,
-            gain_controller.stream_analog_level());
-
-  // Compare the output with the reference. Only the first values of the output
-  // from last frame processed are compared in order not having to specify all
-  // preceeding frames as testvectors. As the algorithm being tested has a
-  // memory, testing only the last frame implicitly also tests the preceeding
-  // frames.
-  const float kElementErrorBound = 1.0f / 32768.0f;
-  EXPECT_TRUE(test::VerifyDeinterleavedArray(
-      capture_config.num_frames(), capture_config.num_channels(),
-      output_reference, capture_output, kElementErrorBound));
-}
-
-}  // namespace
-
-// TODO(peah): Activate all these tests for ARM and ARM64 once the issue on the
-// Chromium ARM and ARM64 boths have been identified. This is tracked in the
-// issue https://bugs.chromium.org/p/webrtc/issues/detail?id=5711.
-
-#if !(defined(WEBRTC_ARCH_ARM64) || defined(WEBRTC_ARCH_ARM) || \
-      defined(WEBRTC_ANDROID))
-TEST(GainControlBitExactnessTest,
-     Mono8kHz_AdaptiveAnalog_Tl10_SL50_CG5_Lim_AL0_100) {
-#else
-TEST(GainControlBitExactnessTest,
-     DISABLED_Mono8kHz_AdaptiveAnalog_Tl10_SL50_CG5_Lim_AL0_100) {
-#endif
-  const int kStreamAnalogLevelReference = 50;
-  const float kOutputReference[] = {-0.006622f, -0.002747f, 0.001587f};
-  RunBitExactnessTest(8000, 1, GainControl::Mode::kAdaptiveAnalog, 10, 50, 5,
-                      true, 0, 100, kStreamAnalogLevelReference,
-                      kOutputReference);
-}
-
-#if !(defined(WEBRTC_ARCH_ARM64) || defined(WEBRTC_ARCH_ARM) || \
-      defined(WEBRTC_ANDROID))
-TEST(GainControlBitExactnessTest,
-     Mono16kHz_AdaptiveAnalog_Tl10_SL50_CG5_Lim_AL0_100) {
-#else
-TEST(GainControlBitExactnessTest,
-     DISABLED_Mono16kHz_AdaptiveAnalog_Tl10_SL50_CG5_Lim_AL0_100) {
-#endif
-  const int kStreamAnalogLevelReference = 50;
-  const float kOutputReference[] = {-0.006561f, -0.004608f, -0.002899f};
-  RunBitExactnessTest(16000, 1, GainControl::Mode::kAdaptiveAnalog, 10, 50, 5,
-                      true, 0, 100, kStreamAnalogLevelReference,
-                      kOutputReference);
-}
-
-#if !(defined(WEBRTC_ARCH_ARM64) || defined(WEBRTC_ARCH_ARM) || \
-      defined(WEBRTC_ANDROID))
-TEST(GainControlBitExactnessTest,
-     Stereo16kHz_AdaptiveAnalog_Tl10_SL50_CG5_Lim_AL0_100) {
-#else
-TEST(GainControlBitExactnessTest,
-     DISABLED_Stereo16kHz_AdaptiveAnalog_Tl10_SL50_CG5_Lim_AL0_100) {
-#endif
-  const int kStreamAnalogLevelReference = 50;
-  const float kOutputReference[] = {-0.027313f, -0.015900f, -0.028107f,
-                                    -0.027313f, -0.015900f, -0.028107f};
-  RunBitExactnessTest(16000, 2, GainControl::Mode::kAdaptiveAnalog, 10, 50, 5,
-                      true, 0, 100, kStreamAnalogLevelReference,
-                      kOutputReference);
-}
-
-#if !(defined(WEBRTC_ARCH_ARM64) || defined(WEBRTC_ARCH_ARM) || \
-      defined(WEBRTC_ANDROID))
-TEST(GainControlBitExactnessTest,
-     Mono32kHz_AdaptiveAnalog_Tl10_SL50_CG5_Lim_AL0_100) {
-#else
-TEST(GainControlBitExactnessTest,
-     DISABLED_Mono32kHz_AdaptiveAnalog_Tl10_SL50_CG5_Lim_AL0_100) {
-#endif
-  const int kStreamAnalogLevelReference = 50;
-  const float kOutputReference[] = {-0.010162f, -0.009155f, -0.008301f};
-  RunBitExactnessTest(32000, 1, GainControl::Mode::kAdaptiveAnalog, 10, 50, 5,
-                      true, 0, 100, kStreamAnalogLevelReference,
-                      kOutputReference);
-}
-
-#if !(defined(WEBRTC_ARCH_ARM64) || defined(WEBRTC_ARCH_ARM) || \
-      defined(WEBRTC_ANDROID))
-TEST(GainControlBitExactnessTest,
-     Mono48kHz_AdaptiveAnalog_Tl10_SL50_CG5_Lim_AL0_100) {
-#else
-TEST(GainControlBitExactnessTest,
-     DISABLED_Mono48kHz_AdaptiveAnalog_Tl10_SL50_CG5_Lim_AL0_100) {
-#endif
-  const int kStreamAnalogLevelReference = 50;
-  const float kOutputReference[] = {-0.010162f, -0.009155f, -0.008301f};
-  RunBitExactnessTest(32000, 1, GainControl::Mode::kAdaptiveAnalog, 10, 50, 5,
-                      true, 0, 100, kStreamAnalogLevelReference,
-                      kOutputReference);
-}
-
-#if !(defined(WEBRTC_ARCH_ARM64) || defined(WEBRTC_ARCH_ARM) || \
-      defined(WEBRTC_ANDROID))
-TEST(GainControlBitExactnessTest,
-     Mono8kHz_AdaptiveDigital_Tl10_SL50_CG5_Lim_AL0_100) {
-#else
-TEST(GainControlBitExactnessTest,
-     DISABLED_Mono8kHz_AdaptiveDigital_Tl10_SL50_CG5_Lim_AL0_100) {
-#endif
-  const int kStreamAnalogLevelReference = 50;
-  const float kOutputReference[] = {-0.004028f, -0.001678f, 0.000946f};
-  RunBitExactnessTest(8000, 1, GainControl::Mode::kAdaptiveDigital, 10, 50, 5,
-                      true, 0, 100, kStreamAnalogLevelReference,
-                      kOutputReference);
-}
-
-#if !(defined(WEBRTC_ARCH_ARM64) || defined(WEBRTC_ARCH_ARM) || \
-      defined(WEBRTC_ANDROID))
-TEST(GainControlBitExactnessTest,
-     Mono16kHz_AdaptiveDigital_Tl10_SL50_CG5_Lim_AL0_100) {
-#else
-TEST(GainControlBitExactnessTest,
-     DISABLED_Mono16kHz_AdaptiveDigital_Tl10_SL50_CG5_Lim_AL0_100) {
-#endif
-  const int kStreamAnalogLevelReference = 50;
-  const float kOutputReference[] = {-0.003967f, -0.002777f, -0.001770f};
-  RunBitExactnessTest(16000, 1, GainControl::Mode::kAdaptiveDigital, 10, 50, 5,
-                      true, 0, 100, kStreamAnalogLevelReference,
-                      kOutputReference);
-}
-
-#if !(defined(WEBRTC_ARCH_ARM64) || defined(WEBRTC_ARCH_ARM) || \
-      defined(WEBRTC_ANDROID))
-TEST(GainControlBitExactnessTest,
-     Stereo16kHz_AdaptiveDigital_Tl10_SL50_CG5_Lim_AL0_100) {
-#else
-TEST(GainControlBitExactnessTest,
-     DISABLED_Stereo16kHz_AdaptiveDigital_Tl10_SL50_CG5_Lim_AL0_100) {
-#endif
-  const int kStreamAnalogLevelReference = 50;
-  const float kOutputReference[] = {-0.015411f, -0.008972f, -0.015839f,
-                                    -0.015411f, -0.008972f, -0.015839f};
-  RunBitExactnessTest(16000, 2, GainControl::Mode::kAdaptiveDigital, 10, 50, 5,
-                      true, 0, 100, kStreamAnalogLevelReference,
-                      kOutputReference);
-}
-
-#if !(defined(WEBRTC_ARCH_ARM64) || defined(WEBRTC_ARCH_ARM) || \
-      defined(WEBRTC_ANDROID))
-TEST(GainControlBitExactnessTest,
-     Mono32kHz_AdaptiveDigital_Tl10_SL50_CG5_Lim_AL0_100) {
-#else
-TEST(GainControlBitExactnessTest,
-     DISABLED_Mono32kHz_AdaptiveDigital_Tl10_SL50_CG5_Lim_AL0_100) {
-#endif
-  const int kStreamAnalogLevelReference = 50;
-  const float kOutputReference[] = {-0.006104f, -0.005524f, -0.004974f};
-  RunBitExactnessTest(32000, 1, GainControl::Mode::kAdaptiveDigital, 10, 50, 5,
-                      true, 0, 100, kStreamAnalogLevelReference,
-                      kOutputReference);
-}
-
-#if !(defined(WEBRTC_ARCH_ARM64) || defined(WEBRTC_ARCH_ARM) || \
-      defined(WEBRTC_ANDROID))
-TEST(GainControlBitExactnessTest,
-     Mono48kHz_AdaptiveDigital_Tl10_SL50_CG5_Lim_AL0_100) {
-#else
-TEST(GainControlBitExactnessTest,
-     DISABLED_Mono48kHz_AdaptiveDigital_Tl10_SL50_CG5_Lim_AL0_100) {
-#endif
-  const int kStreamAnalogLevelReference = 50;
-  const float kOutputReference[] = {-0.006104f, -0.005524f, -0.004974f};
-  RunBitExactnessTest(32000, 1, GainControl::Mode::kAdaptiveDigital, 10, 50, 5,
-                      true, 0, 100, kStreamAnalogLevelReference,
-                      kOutputReference);
-}
-
-#if !(defined(WEBRTC_ARCH_ARM64) || defined(WEBRTC_ARCH_ARM) || \
-      defined(WEBRTC_ANDROID))
-TEST(GainControlBitExactnessTest,
-     Mono8kHz_FixedDigital_Tl10_SL50_CG5_Lim_AL0_100) {
-#else
-TEST(GainControlBitExactnessTest,
-     DISABLED_Mono8kHz_FixedDigital_Tl10_SL50_CG5_Lim_AL0_100) {
-#endif
-  const int kStreamAnalogLevelReference = 50;
-  const float kOutputReference[] = {-0.011871f, -0.004944f, 0.002838f};
-  RunBitExactnessTest(8000, 1, GainControl::Mode::kFixedDigital, 10, 50, 5,
-                      true, 0, 100, kStreamAnalogLevelReference,
-                      kOutputReference);
-}
-
-#if !(defined(WEBRTC_ARCH_ARM64) || defined(WEBRTC_ARCH_ARM) || \
-      defined(WEBRTC_ANDROID))
-TEST(GainControlBitExactnessTest,
-     Mono16kHz_FixedDigital_Tl10_SL50_CG5_Lim_AL0_100) {
-#else
-TEST(GainControlBitExactnessTest,
-     DISABLED_Mono16kHz_FixedDigital_Tl10_SL50_CG5_Lim_AL0_100) {
-#endif
-  const int kStreamAnalogLevelReference = 50;
-  const float kOutputReference[] = {-0.011749f, -0.008270f, -0.005219f};
-  RunBitExactnessTest(16000, 1, GainControl::Mode::kFixedDigital, 10, 50, 5,
-                      true, 0, 100, kStreamAnalogLevelReference,
-                      kOutputReference);
-}
-
-#if !(defined(WEBRTC_ARCH_ARM64) || defined(WEBRTC_ARCH_ARM) || \
-      defined(WEBRTC_ANDROID))
-TEST(GainControlBitExactnessTest,
-     Stereo16kHz_FixedDigital_Tl10_SL50_CG5_Lim_AL0_100) {
-#else
-TEST(GainControlBitExactnessTest,
-     DISABLED_Stereo16kHz_FixedDigital_Tl10_SL50_CG5_Lim_AL0_100) {
-#endif
-  const int kStreamAnalogLevelReference = 50;
-  const float kOutputReference[] = {-0.048950f, -0.028503f, -0.050354f,
-                                    -0.048950f, -0.028503f, -0.050354f};
-  RunBitExactnessTest(16000, 2, GainControl::Mode::kFixedDigital, 10, 50, 5,
-                      true, 0, 100, kStreamAnalogLevelReference,
-                      kOutputReference);
-}
-
-#if !(defined(WEBRTC_ARCH_ARM64) || defined(WEBRTC_ARCH_ARM) || \
-      defined(WEBRTC_ANDROID))
-TEST(GainControlBitExactnessTest,
-     Mono32kHz_FixedDigital_Tl10_SL50_CG5_Lim_AL0_100) {
-#else
-TEST(GainControlBitExactnessTest,
-     DISABLED_Mono32kHz_FixedDigital_Tl10_SL50_CG5_Lim_AL0_100) {
-#endif
-  const int kStreamAnalogLevelReference = 50;
-  const float kOutputReference[] = {-0.018188f, -0.016418f, -0.014862f};
-  RunBitExactnessTest(32000, 1, GainControl::Mode::kFixedDigital, 10, 50, 5,
-                      true, 0, 100, kStreamAnalogLevelReference,
-                      kOutputReference);
-}
-
-#if !(defined(WEBRTC_ARCH_ARM64) || defined(WEBRTC_ARCH_ARM) || \
-      defined(WEBRTC_ANDROID))
-TEST(GainControlBitExactnessTest,
-     Mono48kHz_FixedDigital_Tl10_SL50_CG5_Lim_AL0_100) {
-#else
-TEST(GainControlBitExactnessTest,
-     DISABLED_Mono48kHz_FixedDigital_Tl10_SL50_CG5_Lim_AL0_100) {
-#endif
-  const int kStreamAnalogLevelReference = 50;
-  const float kOutputReference[] = {-0.018188f, -0.016418f, -0.014862f};
-  RunBitExactnessTest(32000, 1, GainControl::Mode::kFixedDigital, 10, 50, 5,
-                      true, 0, 100, kStreamAnalogLevelReference,
-                      kOutputReference);
-}
-
-#if !(defined(WEBRTC_ARCH_ARM64) || defined(WEBRTC_ARCH_ARM) || \
-      defined(WEBRTC_ANDROID))
-TEST(GainControlBitExactnessTest,
-     Mono16kHz_AdaptiveAnalog_Tl10_SL10_CG5_Lim_AL0_100) {
-#else
-TEST(GainControlBitExactnessTest,
-     DISABLED_Mono16kHz_AdaptiveAnalog_Tl10_SL10_CG5_Lim_AL0_100) {
-#endif
-  const int kStreamAnalogLevelReference = 12;
-  const float kOutputReference[] = {-0.006561f, -0.004608f, -0.002899f};
-  RunBitExactnessTest(16000, 1, GainControl::Mode::kAdaptiveAnalog, 10, 10, 5,
-                      true, 0, 100, kStreamAnalogLevelReference,
-                      kOutputReference);
-}
-
-#if !(defined(WEBRTC_ARCH_ARM64) || defined(WEBRTC_ARCH_ARM) || \
-      defined(WEBRTC_ANDROID))
-TEST(GainControlBitExactnessTest,
-     Mono16kHz_AdaptiveAnalog_Tl10_SL100_CG5_Lim_AL70_80) {
-#else
-TEST(GainControlBitExactnessTest,
-     DISABLED_Mono16kHz_AdaptiveAnalog_Tl10_SL100_CG5_Lim_AL70_80) {
-#endif
-  const int kStreamAnalogLevelReference = 100;
-  const float kOutputReference[] = {-0.003998f, -0.002808f, -0.001770f};
-  RunBitExactnessTest(16000, 1, GainControl::Mode::kAdaptiveAnalog, 10, 100, 5,
-                      true, 70, 80, kStreamAnalogLevelReference,
-                      kOutputReference);
-}
-
-#if !(defined(WEBRTC_ARCH_ARM64) || defined(WEBRTC_ARCH_ARM) || \
-      defined(WEBRTC_ANDROID))
-TEST(GainControlBitExactnessTest,
-     Mono16kHz_AdaptiveDigital_Tl10_SL100_CG5_NoLim_AL0_100) {
-#else
-TEST(GainControlBitExactnessTest,
-     DISABLED_Mono16kHz_AdaptiveDigital_Tl10_SL100_CG5_NoLim_AL0_100) {
-#endif
-  const int kStreamAnalogLevelReference = 100;
-  const float kOutputReference[] = {-0.004028f, -0.002838f, -0.001770f};
-  RunBitExactnessTest(16000, 1, GainControl::Mode::kAdaptiveDigital, 10, 100, 5,
-                      false, 0, 100, kStreamAnalogLevelReference,
-                      kOutputReference);
-}
-
-#if !(defined(WEBRTC_ARCH_ARM64) || defined(WEBRTC_ARCH_ARM) || \
-      defined(WEBRTC_ANDROID))
-TEST(GainControlBitExactnessTest,
-     Mono16kHz_AdaptiveDigital_Tl40_SL100_CG5_Lim_AL0_100) {
-#else
-TEST(GainControlBitExactnessTest,
-     DISABLED_Mono16kHz_AdaptiveDigital_Tl40_SL100_CG5_Lim_AL0_100) {
-#endif
-  const int kStreamAnalogLevelReference = 100;
-  const float kOutputReference[] = {-0.008728f, -0.006134f, -0.003845f};
-  RunBitExactnessTest(16000, 1, GainControl::Mode::kAdaptiveDigital, 40, 100, 5,
-                      true, 0, 100, kStreamAnalogLevelReference,
-                      kOutputReference);
-}
-
-#if !(defined(WEBRTC_ARCH_ARM64) || defined(WEBRTC_ARCH_ARM) || \
-      defined(WEBRTC_ANDROID))
-TEST(GainControlBitExactnessTest,
-     Mono16kHz_AdaptiveDigital_Tl10_SL100_CG30_Lim_AL0_100) {
-#else
-TEST(GainControlBitExactnessTest,
-     DISABLED_Mono16kHz_AdaptiveDigital_Tl10_SL100_CG30_Lim_AL0_100) {
-#endif
-  const int kStreamAnalogLevelReference = 100;
-  const float kOutputReference[] = {-0.005859f, -0.004120f, -0.002594f};
-  RunBitExactnessTest(16000, 1, GainControl::Mode::kAdaptiveDigital, 10, 100,
-                      30, true, 0, 100, kStreamAnalogLevelReference,
-                      kOutputReference);
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/include/aec_dump.cc b/modules/audio_processing/include/aec_dump.cc
deleted file mode 100644
index f048bad..0000000
--- a/modules/audio_processing/include/aec_dump.cc
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- *  Copyright (c) 2017 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_processing/include/aec_dump.h"
-
-namespace webrtc {
-InternalAPMConfig::InternalAPMConfig() = default;
-InternalAPMConfig::InternalAPMConfig(const InternalAPMConfig&) = default;
-InternalAPMConfig::InternalAPMConfig(InternalAPMConfig&&) = default;
-InternalAPMConfig& InternalAPMConfig::operator=(const InternalAPMConfig&) =
-    default;
-
-bool InternalAPMConfig::operator==(const InternalAPMConfig& other) {
-  return aec_enabled == other.aec_enabled &&
-         aec_delay_agnostic_enabled == other.aec_delay_agnostic_enabled &&
-         aec_drift_compensation_enabled ==
-             other.aec_drift_compensation_enabled &&
-         aec_extended_filter_enabled == other.aec_extended_filter_enabled &&
-         aec_suppression_level == other.aec_suppression_level &&
-         aecm_enabled == other.aecm_enabled &&
-         aecm_comfort_noise_enabled == other.aecm_comfort_noise_enabled &&
-         aecm_routing_mode == other.aecm_routing_mode &&
-         agc_enabled == other.agc_enabled && agc_mode == other.agc_mode &&
-         agc_limiter_enabled == other.agc_limiter_enabled &&
-         hpf_enabled == other.hpf_enabled && ns_enabled == other.ns_enabled &&
-         ns_level == other.ns_level &&
-         transient_suppression_enabled == other.transient_suppression_enabled &&
-         intelligibility_enhancer_enabled ==
-             other.intelligibility_enhancer_enabled &&
-         noise_robust_agc_enabled == other.noise_robust_agc_enabled &&
-         experiments_description == other.experiments_description;
-}
-}  // namespace webrtc
diff --git a/modules/audio_processing/include/aec_dump.h b/modules/audio_processing/include/aec_dump.h
deleted file mode 100644
index cec1aa3..0000000
--- a/modules/audio_processing/include/aec_dump.h
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- *  Copyright (c) 2017 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_PROCESSING_INCLUDE_AEC_DUMP_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_INCLUDE_AEC_DUMP_H_
-
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "webrtc/api/array_view.h"
-
-namespace webrtc {
-
-class AudioFrame;
-
-// Struct for passing current config from APM without having to
-// include protobuf headers.
-struct InternalAPMConfig {
-  InternalAPMConfig();
-  InternalAPMConfig(const InternalAPMConfig&);
-  InternalAPMConfig(InternalAPMConfig&&);
-
-  InternalAPMConfig& operator=(const InternalAPMConfig&);
-  InternalAPMConfig& operator=(InternalAPMConfig&&) = delete;
-
-  bool operator==(const InternalAPMConfig& other);
-
-  bool aec_enabled = false;
-  bool aec_delay_agnostic_enabled = false;
-  bool aec_drift_compensation_enabled = false;
-  bool aec_extended_filter_enabled = false;
-  int aec_suppression_level = 0;
-  bool aecm_enabled = false;
-  bool aecm_comfort_noise_enabled = false;
-  int aecm_routing_mode = 0;
-  bool agc_enabled = false;
-  int agc_mode = 0;
-  bool agc_limiter_enabled = false;
-  bool hpf_enabled = false;
-  bool ns_enabled = false;
-  int ns_level = 0;
-  bool transient_suppression_enabled = false;
-  bool intelligibility_enhancer_enabled = false;
-  bool noise_robust_agc_enabled = false;
-  std::string experiments_description = "";
-};
-
-struct InternalAPMStreamsConfig {
-  int input_sample_rate = 0;
-  int output_sample_rate = 0;
-  int render_input_sample_rate = 0;
-  int render_output_sample_rate = 0;
-
-  size_t input_num_channels = 0;
-  size_t output_num_channels = 0;
-  size_t render_input_num_channels = 0;
-  size_t render_output_num_channels = 0;
-};
-
-// Class to pass audio data in float** format. This is to avoid
-// dependence on AudioBuffer, and avoid problems associated with
-// rtc::ArrayView<rtc::ArrayView>.
-class FloatAudioFrame {
- public:
-  // |num_channels| and |channel_size| describe the float**
-  // |audio_samples|. |audio_samples| is assumed to point to a
-  // two-dimensional |num_channels * channel_size| array of floats.
-  FloatAudioFrame(const float* const* audio_samples,
-                  size_t num_channels,
-                  size_t channel_size)
-      : audio_samples_(audio_samples),
-        num_channels_(num_channels),
-        channel_size_(channel_size) {}
-
-  FloatAudioFrame() = delete;
-
-  size_t num_channels() const { return num_channels_; }
-
-  rtc::ArrayView<const float> channel(size_t idx) const {
-    RTC_DCHECK_LE(0, idx);
-    RTC_DCHECK_LE(idx, num_channels_);
-    return rtc::ArrayView<const float>(audio_samples_[idx], channel_size_);
-  }
-
- private:
-  const float* const* audio_samples_;
-  size_t num_channels_;
-  size_t channel_size_;
-};
-
-// An interface for recording configuration and input/output streams
-// of the Audio Processing Module. The recordings are called
-// 'aec-dumps' and are stored in a protobuf format defined in
-// debug.proto.
-// The Write* methods are always safe to call concurrently or
-// otherwise for all implementing subclasses. The intended mode of
-// operation is to create a protobuf object from the input, and send
-// it away to be written to file asynchronously.
-class AecDump {
- public:
-  struct AudioProcessingState {
-    int delay;
-    int drift;
-    int level;
-    bool keypress;
-  };
-
-  virtual ~AecDump() = default;
-
-  // Logs Event::Type INIT message.
-  virtual void WriteInitMessage(
-      const InternalAPMStreamsConfig& streams_config) = 0;
-
-  // Logs Event::Type STREAM message. To log an input/output pair,
-  // call the AddCapture* and AddAudioProcessingState methods followed
-  // by a WriteCaptureStreamMessage call.
-  virtual void AddCaptureStreamInput(const FloatAudioFrame& src) = 0;
-  virtual void AddCaptureStreamOutput(const FloatAudioFrame& src) = 0;
-  virtual void AddCaptureStreamInput(const AudioFrame& frame) = 0;
-  virtual void AddCaptureStreamOutput(const AudioFrame& frame) = 0;
-  virtual void AddAudioProcessingState(const AudioProcessingState& state) = 0;
-  virtual void WriteCaptureStreamMessage() = 0;
-
-  // Logs Event::Type REVERSE_STREAM message.
-  virtual void WriteRenderStreamMessage(const AudioFrame& frame) = 0;
-  virtual void WriteRenderStreamMessage(const FloatAudioFrame& src) = 0;
-
-  // Logs Event::Type CONFIG message.
-  virtual void WriteConfig(const InternalAPMConfig& config) = 0;
-};
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_INCLUDE_AEC_DUMP_H_
diff --git a/modules/audio_processing/include/audio_processing.cc b/modules/audio_processing/include/audio_processing.cc
deleted file mode 100644
index 2c4b61f..0000000
--- a/modules/audio_processing/include/audio_processing.cc
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- *  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_processing/include/audio_processing.h"
-
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-
-Beamforming::Beamforming()
-    : enabled(false),
-      array_geometry(),
-      target_direction(
-          SphericalPointf(static_cast<float>(M_PI) / 2.f, 0.f, 1.f)) {}
-Beamforming::Beamforming(bool enabled, const std::vector<Point>& array_geometry)
-    : Beamforming(enabled,
-                  array_geometry,
-                  SphericalPointf(static_cast<float>(M_PI) / 2.f, 0.f, 1.f)) {}
-
-Beamforming::Beamforming(bool enabled,
-                         const std::vector<Point>& array_geometry,
-                         SphericalPointf target_direction)
-    : enabled(enabled),
-      array_geometry(array_geometry),
-      target_direction(target_direction) {}
-
-Beamforming::~Beamforming() {}
-}  // namespace webrtc
diff --git a/modules/audio_processing/include/audio_processing.h b/modules/audio_processing/include/audio_processing.h
deleted file mode 100644
index 03bd8c8..0000000
--- a/modules/audio_processing/include/audio_processing.h
+++ /dev/null
@@ -1,1141 +0,0 @@
-/*
- *  Copyright (c) 2012 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_PROCESSING_INCLUDE_AUDIO_PROCESSING_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_INCLUDE_AUDIO_PROCESSING_H_
-
-// MSVC++ requires this to be set before any other includes to get M_PI.
-#define _USE_MATH_DEFINES
-
-#include <math.h>
-#include <stddef.h>  // size_t
-#include <stdio.h>  // FILE
-#include <string.h>
-#include <vector>
-
-#include "webrtc/modules/audio_processing/beamformer/array_util.h"
-#include "webrtc/modules/audio_processing/include/config.h"
-#include "webrtc/rtc_base/arraysize.h"
-#include "webrtc/rtc_base/platform_file.h"
-#include "webrtc/rtc_base/refcount.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-struct AecCore;
-
-class AecDump;
-class AudioFrame;
-
-class NonlinearBeamformer;
-
-class StreamConfig;
-class ProcessingConfig;
-
-class EchoCancellation;
-class EchoControlMobile;
-class GainControl;
-class HighPassFilter;
-class LevelEstimator;
-class NoiseSuppression;
-class VoiceDetection;
-
-// Use to enable the extended filter mode in the AEC, along with robustness
-// measures around the reported system delays. It comes with a significant
-// increase in AEC complexity, but is much more robust to unreliable reported
-// delays.
-//
-// Detailed changes to the algorithm:
-// - The filter length is changed from 48 to 128 ms. This comes with tuning of
-//   several parameters: i) filter adaptation stepsize and error threshold;
-//   ii) non-linear processing smoothing and overdrive.
-// - Option to ignore the reported delays on platforms which we deem
-//   sufficiently unreliable. See WEBRTC_UNTRUSTED_DELAY in echo_cancellation.c.
-// - Faster startup times by removing the excessive "startup phase" processing
-//   of reported delays.
-// - Much more conservative adjustments to the far-end read pointer. We smooth
-//   the delay difference more heavily, and back off from the difference more.
-//   Adjustments force a readaptation of the filter, so they should be avoided
-//   except when really necessary.
-struct ExtendedFilter {
-  ExtendedFilter() : enabled(false) {}
-  explicit ExtendedFilter(bool enabled) : enabled(enabled) {}
-  static const ConfigOptionID identifier = ConfigOptionID::kExtendedFilter;
-  bool enabled;
-};
-
-// Enables the refined linear filter adaptation in the echo canceller.
-// This configuration only applies to EchoCancellation and not
-// EchoControlMobile. It can be set in the constructor
-// or using AudioProcessing::SetExtraOptions().
-struct RefinedAdaptiveFilter {
-  RefinedAdaptiveFilter() : enabled(false) {}
-  explicit RefinedAdaptiveFilter(bool enabled) : enabled(enabled) {}
-  static const ConfigOptionID identifier =
-      ConfigOptionID::kAecRefinedAdaptiveFilter;
-  bool enabled;
-};
-
-// Enables delay-agnostic echo cancellation. This feature relies on internally
-// estimated delays between the process and reverse streams, thus not relying
-// on reported system delays. This configuration only applies to
-// EchoCancellation and not EchoControlMobile. It can be set in the constructor
-// or using AudioProcessing::SetExtraOptions().
-struct DelayAgnostic {
-  DelayAgnostic() : enabled(false) {}
-  explicit DelayAgnostic(bool enabled) : enabled(enabled) {}
-  static const ConfigOptionID identifier = ConfigOptionID::kDelayAgnostic;
-  bool enabled;
-};
-
-// Use to enable experimental gain control (AGC). At startup the experimental
-// AGC moves the microphone volume up to |startup_min_volume| if the current
-// microphone volume is set too low. The value is clamped to its operating range
-// [12, 255]. Here, 255 maps to 100%.
-//
-// Must be provided through AudioProcessing::Create(Confg&).
-#if defined(WEBRTC_CHROMIUM_BUILD)
-static const int kAgcStartupMinVolume = 85;
-#else
-static const int kAgcStartupMinVolume = 0;
-#endif  // defined(WEBRTC_CHROMIUM_BUILD)
-static constexpr int kClippedLevelMin = 170;
-struct ExperimentalAgc {
-  ExperimentalAgc() = default;
-  explicit ExperimentalAgc(bool enabled) : enabled(enabled) {}
-  ExperimentalAgc(bool enabled, int startup_min_volume)
-      : enabled(enabled), startup_min_volume(startup_min_volume) {}
-  ExperimentalAgc(bool enabled, int startup_min_volume, int clipped_level_min)
-      : enabled(enabled),
-        startup_min_volume(startup_min_volume),
-        clipped_level_min(clipped_level_min) {}
-  static const ConfigOptionID identifier = ConfigOptionID::kExperimentalAgc;
-  bool enabled = true;
-  int startup_min_volume = kAgcStartupMinVolume;
-  // Lowest microphone level that will be applied in response to clipping.
-  int clipped_level_min = kClippedLevelMin;
-};
-
-// Use to enable experimental noise suppression. It can be set in the
-// constructor or using AudioProcessing::SetExtraOptions().
-struct ExperimentalNs {
-  ExperimentalNs() : enabled(false) {}
-  explicit ExperimentalNs(bool enabled) : enabled(enabled) {}
-  static const ConfigOptionID identifier = ConfigOptionID::kExperimentalNs;
-  bool enabled;
-};
-
-// Use to enable beamforming. Must be provided through the constructor. It will
-// have no impact if used with AudioProcessing::SetExtraOptions().
-struct Beamforming {
-  Beamforming();
-  Beamforming(bool enabled, const std::vector<Point>& array_geometry);
-  Beamforming(bool enabled,
-              const std::vector<Point>& array_geometry,
-              SphericalPointf target_direction);
-  ~Beamforming();
-
-  static const ConfigOptionID identifier = ConfigOptionID::kBeamforming;
-  const bool enabled;
-  const std::vector<Point> array_geometry;
-  const SphericalPointf target_direction;
-};
-
-// Use to enable intelligibility enhancer in audio processing.
-//
-// Note: If enabled and the reverse stream has more than one output channel,
-// the reverse stream will become an upmixed mono signal.
-struct Intelligibility {
-  Intelligibility() : enabled(false) {}
-  explicit Intelligibility(bool enabled) : enabled(enabled) {}
-  static const ConfigOptionID identifier = ConfigOptionID::kIntelligibility;
-  bool enabled;
-};
-
-// The Audio Processing Module (APM) provides a collection of voice processing
-// components designed for real-time communications software.
-//
-// APM operates on two audio streams on a frame-by-frame basis. Frames of the
-// primary stream, on which all processing is applied, are passed to
-// |ProcessStream()|. Frames of the reverse direction stream are passed to
-// |ProcessReverseStream()|. On the client-side, this will typically be the
-// near-end (capture) and far-end (render) streams, respectively. APM should be
-// placed in the signal chain as close to the audio hardware abstraction layer
-// (HAL) as possible.
-//
-// On the server-side, the reverse stream will normally not be used, with
-// processing occurring on each incoming stream.
-//
-// Component interfaces follow a similar pattern and are accessed through
-// corresponding getters in APM. All components are disabled at create-time,
-// with default settings that are recommended for most situations. New settings
-// can be applied without enabling a component. Enabling a component triggers
-// memory allocation and initialization to allow it to start processing the
-// streams.
-//
-// Thread safety is provided with the following assumptions to reduce locking
-// overhead:
-//   1. The stream getters and setters are called from the same thread as
-//      ProcessStream(). More precisely, stream functions are never called
-//      concurrently with ProcessStream().
-//   2. Parameter getters are never called concurrently with the corresponding
-//      setter.
-//
-// APM accepts only linear PCM audio data in chunks of 10 ms. The int16
-// interfaces use interleaved data, while the float interfaces use deinterleaved
-// data.
-//
-// Usage example, omitting error checking:
-// AudioProcessing* apm = AudioProcessing::Create(0);
-//
-// AudioProcessing::Config config;
-// config.level_controller.enabled = true;
-// config.high_pass_filter.enabled = true;
-// apm->ApplyConfig(config)
-//
-// apm->echo_cancellation()->enable_drift_compensation(false);
-// apm->echo_cancellation()->Enable(true);
-//
-// apm->noise_reduction()->set_level(kHighSuppression);
-// apm->noise_reduction()->Enable(true);
-//
-// apm->gain_control()->set_analog_level_limits(0, 255);
-// apm->gain_control()->set_mode(kAdaptiveAnalog);
-// apm->gain_control()->Enable(true);
-//
-// apm->voice_detection()->Enable(true);
-//
-// // Start a voice call...
-//
-// // ... Render frame arrives bound for the audio HAL ...
-// apm->ProcessReverseStream(render_frame);
-//
-// // ... Capture frame arrives from the audio HAL ...
-// // Call required set_stream_ functions.
-// apm->set_stream_delay_ms(delay_ms);
-// apm->gain_control()->set_stream_analog_level(analog_level);
-//
-// apm->ProcessStream(capture_frame);
-//
-// // Call required stream_ functions.
-// analog_level = apm->gain_control()->stream_analog_level();
-// has_voice = apm->stream_has_voice();
-//
-// // Repeate render and capture processing for the duration of the call...
-// // Start a new call...
-// apm->Initialize();
-//
-// // Close the application...
-// delete apm;
-//
-class AudioProcessing : public rtc::RefCountInterface {
- public:
-  // The struct below constitutes the new parameter scheme for the audio
-  // processing. It is being introduced gradually and until it is fully
-  // introduced, it is prone to change.
-  // TODO(peah): Remove this comment once the new config scheme is fully rolled
-  // out.
-  //
-  // The parameters and behavior of the audio processing module are controlled
-  // by changing the default values in the AudioProcessing::Config struct.
-  // The config is applied by passing the struct to the ApplyConfig method.
-  struct Config {
-    struct LevelController {
-      bool enabled = false;
-
-      // Sets the initial peak level to use inside the level controller in order
-      // to compute the signal gain. The unit for the peak level is dBFS and
-      // the allowed range is [-100, 0].
-      float initial_peak_level_dbfs = -6.0206f;
-    } level_controller;
-    struct ResidualEchoDetector {
-      bool enabled = true;
-    } residual_echo_detector;
-
-    struct HighPassFilter {
-      bool enabled = false;
-    } high_pass_filter;
-
-    // Enables the next generation AEC functionality. This feature replaces the
-    // standard methods for echo removal in the AEC.
-    // The functionality is not yet activated in the code and turning this on
-    // does not yet have the desired behavior.
-    struct EchoCanceller3 {
-      struct Param {
-        struct Erle {
-          float min = 1.f;
-          float max_l = 8.f;
-          float max_h = 1.5f;
-        } erle;
-
-        struct EpStrength {
-          float lf = 100.f;
-          float mf = 1000.f;
-          float hf = 5000.f;
-          float default_len = 0.f;
-        } ep_strength;
-
-        struct Mask {
-          float m1 = 0.01f;
-          float m2 = 0.001f;
-          float m3 = 0.01f;
-          float m4 = 0.1f;
-        } gain_mask;
-
-        struct EchoAudibility {
-          float low_render_limit = 192.f;
-          float normal_render_limit = 64.f;
-          float active_render_limit = 100.f;
-        } echo_audibility;
-
-        struct RenderLevels {
-          float active_render_limit = 100.f;
-          float poor_excitation_render_limit = 150.f;
-        } render_levels;
-
-        struct GainUpdates {
-          struct GainChanges {
-            float max_inc;
-            float max_dec;
-            float rate_inc;
-            float rate_dec;
-            float min_inc;
-            float min_dec;
-          };
-
-          GainChanges low_noise = {8.f, 8.f, 2.f, 2.f, 4.f, 4.f};
-          GainChanges normal = {4.f, 4.f, 2.f, 2.f, 1.2f, 2.f};
-          GainChanges saturation = {1.2f, 1.2f, 1.5f, 1.5f, 1.f, 1.f};
-
-          float floor_first_increase = 0.001f;
-        } gain_updates;
-      } param;
-      bool enabled = false;
-    } echo_canceller3;
-
-    // Enables the next generation AGC functionality. This feature replaces the
-    // standard methods of gain control in the previous AGC.
-    // The functionality is not yet activated in the code and turning this on
-    // does not yet have the desired behavior.
-    struct GainController2 {
-      bool enabled = false;
-    } gain_controller2;
-
-    // Explicit copy assignment implementation to avoid issues with memory
-    // sanitizer complaints in case of self-assignment.
-    // TODO(peah): Add buildflag to ensure that this is only included for memory
-    // sanitizer builds.
-    Config& operator=(const Config& config) {
-      if (this != &config) {
-        memcpy(this, &config, sizeof(*this));
-      }
-      return *this;
-    }
-  };
-
-  // TODO(mgraczyk): Remove once all methods that use ChannelLayout are gone.
-  enum ChannelLayout {
-    kMono,
-    // Left, right.
-    kStereo,
-    // Mono, keyboard, and mic.
-    kMonoAndKeyboard,
-    // Left, right, keyboard, and mic.
-    kStereoAndKeyboard
-  };
-
-  // Creates an APM instance. Use one instance for every primary audio stream
-  // requiring processing. On the client-side, this would typically be one
-  // instance for the near-end stream, and additional instances for each far-end
-  // stream which requires processing. On the server-side, this would typically
-  // be one instance for every incoming stream.
-  static AudioProcessing* Create();
-  // Allows passing in an optional configuration at create-time.
-  static AudioProcessing* Create(const webrtc::Config& config);
-  // Only for testing.
-  static AudioProcessing* Create(const webrtc::Config& config,
-                                 NonlinearBeamformer* beamformer);
-  ~AudioProcessing() override {}
-
-  // Initializes internal states, while retaining all user settings. This
-  // should be called before beginning to process a new audio stream. However,
-  // it is not necessary to call before processing the first stream after
-  // creation.
-  //
-  // It is also not necessary to call if the audio parameters (sample
-  // rate and number of channels) have changed. Passing updated parameters
-  // directly to |ProcessStream()| and |ProcessReverseStream()| is permissible.
-  // If the parameters are known at init-time though, they may be provided.
-  virtual int Initialize() = 0;
-
-  // The int16 interfaces require:
-  //   - only |NativeRate|s be used
-  //   - that the input, output and reverse rates must match
-  //   - that |processing_config.output_stream()| matches
-  //     |processing_config.input_stream()|.
-  //
-  // The float interfaces accept arbitrary rates and support differing input and
-  // output layouts, but the output must have either one channel or the same
-  // number of channels as the input.
-  virtual int Initialize(const ProcessingConfig& processing_config) = 0;
-
-  // Initialize with unpacked parameters. See Initialize() above for details.
-  //
-  // TODO(mgraczyk): Remove once clients are updated to use the new interface.
-  virtual int Initialize(int capture_input_sample_rate_hz,
-                         int capture_output_sample_rate_hz,
-                         int render_sample_rate_hz,
-                         ChannelLayout capture_input_layout,
-                         ChannelLayout capture_output_layout,
-                         ChannelLayout render_input_layout) = 0;
-
-  // TODO(peah): This method is a temporary solution used to take control
-  // over the parameters in the audio processing module and is likely to change.
-  virtual void ApplyConfig(const Config& config) = 0;
-
-  // Pass down additional options which don't have explicit setters. This
-  // ensures the options are applied immediately.
-  virtual void SetExtraOptions(const webrtc::Config& config) = 0;
-
-  // TODO(ajm): Only intended for internal use. Make private and friend the
-  // necessary classes?
-  virtual int proc_sample_rate_hz() const = 0;
-  virtual int proc_split_sample_rate_hz() const = 0;
-  virtual size_t num_input_channels() const = 0;
-  virtual size_t num_proc_channels() const = 0;
-  virtual size_t num_output_channels() const = 0;
-  virtual size_t num_reverse_channels() const = 0;
-
-  // Set to true when the output of AudioProcessing will be muted or in some
-  // other way not used. Ideally, the captured audio would still be processed,
-  // but some components may change behavior based on this information.
-  // Default false.
-  virtual void set_output_will_be_muted(bool muted) = 0;
-
-  // Processes a 10 ms |frame| of the primary audio stream. On the client-side,
-  // this is the near-end (or captured) audio.
-  //
-  // If needed for enabled functionality, any function with the set_stream_ tag
-  // must be called prior to processing the current frame. Any getter function
-  // with the stream_ tag which is needed should be called after processing.
-  //
-  // The |sample_rate_hz_|, |num_channels_|, and |samples_per_channel_|
-  // members of |frame| must be valid. If changed from the previous call to this
-  // method, it will trigger an initialization.
-  virtual int ProcessStream(AudioFrame* frame) = 0;
-
-  // Accepts deinterleaved float audio with the range [-1, 1]. Each element
-  // of |src| points to a channel buffer, arranged according to
-  // |input_layout|. At output, the channels will be arranged according to
-  // |output_layout| at |output_sample_rate_hz| in |dest|.
-  //
-  // The output layout must have one channel or as many channels as the input.
-  // |src| and |dest| may use the same memory, if desired.
-  //
-  // TODO(mgraczyk): Remove once clients are updated to use the new interface.
-  virtual int ProcessStream(const float* const* src,
-                            size_t samples_per_channel,
-                            int input_sample_rate_hz,
-                            ChannelLayout input_layout,
-                            int output_sample_rate_hz,
-                            ChannelLayout output_layout,
-                            float* const* dest) = 0;
-
-  // Accepts deinterleaved float audio with the range [-1, 1]. Each element of
-  // |src| points to a channel buffer, arranged according to |input_stream|. At
-  // output, the channels will be arranged according to |output_stream| in
-  // |dest|.
-  //
-  // The output must have one channel or as many channels as the input. |src|
-  // and |dest| may use the same memory, if desired.
-  virtual int ProcessStream(const float* const* src,
-                            const StreamConfig& input_config,
-                            const StreamConfig& output_config,
-                            float* const* dest) = 0;
-
-  // Processes a 10 ms |frame| of the reverse direction audio stream. The frame
-  // may be modified. On the client-side, this is the far-end (or to be
-  // rendered) audio.
-  //
-  // It is necessary to provide this if echo processing is enabled, as the
-  // reverse stream forms the echo reference signal. It is recommended, but not
-  // necessary, to provide if gain control is enabled. On the server-side this
-  // typically will not be used. If you're not sure what to pass in here,
-  // chances are you don't need to use it.
-  //
-  // The |sample_rate_hz_|, |num_channels_|, and |samples_per_channel_|
-  // members of |frame| must be valid.
-  virtual int ProcessReverseStream(AudioFrame* frame) = 0;
-
-  // Accepts deinterleaved float audio with the range [-1, 1]. Each element
-  // of |data| points to a channel buffer, arranged according to |layout|.
-  // TODO(mgraczyk): Remove once clients are updated to use the new interface.
-  virtual int AnalyzeReverseStream(const float* const* data,
-                                   size_t samples_per_channel,
-                                   int sample_rate_hz,
-                                   ChannelLayout layout) = 0;
-
-  // Accepts deinterleaved float audio with the range [-1, 1]. Each element of
-  // |data| points to a channel buffer, arranged according to |reverse_config|.
-  virtual int ProcessReverseStream(const float* const* src,
-                                   const StreamConfig& input_config,
-                                   const StreamConfig& output_config,
-                                   float* const* dest) = 0;
-
-  // This must be called if and only if echo processing is enabled.
-  //
-  // Sets the |delay| in ms between ProcessReverseStream() receiving a far-end
-  // frame and ProcessStream() receiving a near-end frame containing the
-  // corresponding echo. On the client-side this can be expressed as
-  //   delay = (t_render - t_analyze) + (t_process - t_capture)
-  // where,
-  //   - t_analyze is the time a frame is passed to ProcessReverseStream() and
-  //     t_render is the time the first sample of the same frame is rendered by
-  //     the audio hardware.
-  //   - t_capture is the time the first sample of a frame is captured by the
-  //     audio hardware and t_process is the time the same frame is passed to
-  //     ProcessStream().
-  virtual int set_stream_delay_ms(int delay) = 0;
-  virtual int stream_delay_ms() const = 0;
-  virtual bool was_stream_delay_set() const = 0;
-
-  // Call to signal that a key press occurred (true) or did not occur (false)
-  // with this chunk of audio.
-  virtual void set_stream_key_pressed(bool key_pressed) = 0;
-
-  // Sets a delay |offset| in ms to add to the values passed in through
-  // set_stream_delay_ms(). May be positive or negative.
-  //
-  // Note that this could cause an otherwise valid value passed to
-  // set_stream_delay_ms() to return an error.
-  virtual void set_delay_offset_ms(int offset) = 0;
-  virtual int delay_offset_ms() const = 0;
-
-  // Attaches provided webrtc::AecDump for recording debugging
-  // information. Log file and maximum file size logic is supposed to
-  // be handled by implementing instance of AecDump. Calling this
-  // method when another AecDump is attached resets the active AecDump
-  // with a new one. This causes the d-tor of the earlier AecDump to
-  // be called. The d-tor call may block until all pending logging
-  // tasks are completed.
-  virtual void AttachAecDump(std::unique_ptr<AecDump> aec_dump) = 0;
-
-  // If no AecDump is attached, this has no effect. If an AecDump is
-  // attached, it's destructor is called. The d-tor may block until
-  // all pending logging tasks are completed.
-  virtual void DetachAecDump() = 0;
-
-  // Use to send UMA histograms at end of a call. Note that all histogram
-  // specific member variables are reset.
-  virtual void UpdateHistogramsOnCallEnd() = 0;
-
-  // TODO(ivoc): Remove when the calling code no longer uses the old Statistics
-  //             API.
-  struct Statistic {
-    int instant = 0;  // Instantaneous value.
-    int average = 0;  // Long-term average.
-    int maximum = 0;  // Long-term maximum.
-    int minimum = 0;  // Long-term minimum.
-  };
-
-  struct Stat {
-    void Set(const Statistic& other) {
-      Set(other.instant, other.average, other.maximum, other.minimum);
-    }
-    void Set(float instant, float average, float maximum, float minimum) {
-      instant_ = instant;
-      average_ = average;
-      maximum_ = maximum;
-      minimum_ = minimum;
-    }
-    float instant() const { return instant_; }
-    float average() const { return average_; }
-    float maximum() const { return maximum_; }
-    float minimum() const { return minimum_; }
-
-   private:
-    float instant_ = 0.0f;  // Instantaneous value.
-    float average_ = 0.0f;  // Long-term average.
-    float maximum_ = 0.0f;  // Long-term maximum.
-    float minimum_ = 0.0f;  // Long-term minimum.
-  };
-
-  struct AudioProcessingStatistics {
-    AudioProcessingStatistics();
-    AudioProcessingStatistics(const AudioProcessingStatistics& other);
-    ~AudioProcessingStatistics();
-
-    // AEC Statistics.
-    // RERL = ERL + ERLE
-    Stat residual_echo_return_loss;
-    // ERL = 10log_10(P_far / P_echo)
-    Stat echo_return_loss;
-    // ERLE = 10log_10(P_echo / P_out)
-    Stat echo_return_loss_enhancement;
-    // (Pre non-linear processing suppression) A_NLP = 10log_10(P_echo / P_a)
-    Stat a_nlp;
-    // Fraction of time that the AEC linear filter is divergent, in a 1-second
-    // non-overlapped aggregation window.
-    float divergent_filter_fraction = -1.0f;
-
-    // The delay metrics consists of the delay median and standard deviation. It
-    // also consists of the fraction of delay estimates that can make the echo
-    // cancellation perform poorly. The values are aggregated until the first
-    // call to |GetStatistics()| and afterwards aggregated and updated every
-    // second. Note that if there are several clients pulling metrics from
-    // |GetStatistics()| during a session the first call from any of them will
-    // change to one second aggregation window for all.
-    int delay_median = -1;
-    int delay_standard_deviation = -1;
-    float fraction_poor_delays = -1.0f;
-
-    // Residual echo detector likelihood.
-    float residual_echo_likelihood = -1.0f;
-    // Maximum residual echo likelihood from the last time period.
-    float residual_echo_likelihood_recent_max = -1.0f;
-  };
-
-  // TODO(ivoc): Make this pure virtual when all subclasses have been updated.
-  virtual AudioProcessingStatistics GetStatistics() const;
-
-  // These provide access to the component interfaces and should never return
-  // NULL. The pointers will be valid for the lifetime of the APM instance.
-  // The memory for these objects is entirely managed internally.
-  virtual EchoCancellation* echo_cancellation() const = 0;
-  virtual EchoControlMobile* echo_control_mobile() const = 0;
-  virtual GainControl* gain_control() const = 0;
-  // TODO(peah): Deprecate this API call.
-  virtual HighPassFilter* high_pass_filter() const = 0;
-  virtual LevelEstimator* level_estimator() const = 0;
-  virtual NoiseSuppression* noise_suppression() const = 0;
-  virtual VoiceDetection* voice_detection() const = 0;
-
-  // Returns the last applied configuration.
-  virtual AudioProcessing::Config GetConfig() const = 0;
-
-  enum Error {
-    // Fatal errors.
-    kNoError = 0,
-    kUnspecifiedError = -1,
-    kCreationFailedError = -2,
-    kUnsupportedComponentError = -3,
-    kUnsupportedFunctionError = -4,
-    kNullPointerError = -5,
-    kBadParameterError = -6,
-    kBadSampleRateError = -7,
-    kBadDataLengthError = -8,
-    kBadNumberChannelsError = -9,
-    kFileError = -10,
-    kStreamParameterNotSetError = -11,
-    kNotEnabledError = -12,
-
-    // Warnings are non-fatal.
-    // This results when a set_stream_ parameter is out of range. Processing
-    // will continue, but the parameter may have been truncated.
-    kBadStreamParameterWarning = -13
-  };
-
-  enum NativeRate {
-    kSampleRate8kHz = 8000,
-    kSampleRate16kHz = 16000,
-    kSampleRate32kHz = 32000,
-    kSampleRate48kHz = 48000
-  };
-
-  // TODO(kwiberg): We currently need to support a compiler (Visual C++) that
-  // complains if we don't explicitly state the size of the array here. Remove
-  // the size when that's no longer the case.
-  static constexpr int kNativeSampleRatesHz[4] = {
-      kSampleRate8kHz, kSampleRate16kHz, kSampleRate32kHz, kSampleRate48kHz};
-  static constexpr size_t kNumNativeSampleRates =
-      arraysize(kNativeSampleRatesHz);
-  static constexpr int kMaxNativeSampleRateHz =
-      kNativeSampleRatesHz[kNumNativeSampleRates - 1];
-
-  static const int kChunkSizeMs = 10;
-};
-
-class StreamConfig {
- public:
-  // sample_rate_hz: The sampling rate of the stream.
-  //
-  // num_channels: The number of audio channels in the stream, excluding the
-  //               keyboard channel if it is present. When passing a
-  //               StreamConfig with an array of arrays T*[N],
-  //
-  //                N == {num_channels + 1  if  has_keyboard
-  //                     {num_channels      if  !has_keyboard
-  //
-  // has_keyboard: True if the stream has a keyboard channel. When has_keyboard
-  //               is true, the last channel in any corresponding list of
-  //               channels is the keyboard channel.
-  StreamConfig(int sample_rate_hz = 0,
-               size_t num_channels = 0,
-               bool has_keyboard = false)
-      : sample_rate_hz_(sample_rate_hz),
-        num_channels_(num_channels),
-        has_keyboard_(has_keyboard),
-        num_frames_(calculate_frames(sample_rate_hz)) {}
-
-  void set_sample_rate_hz(int value) {
-    sample_rate_hz_ = value;
-    num_frames_ = calculate_frames(value);
-  }
-  void set_num_channels(size_t value) { num_channels_ = value; }
-  void set_has_keyboard(bool value) { has_keyboard_ = value; }
-
-  int sample_rate_hz() const { return sample_rate_hz_; }
-
-  // The number of channels in the stream, not including the keyboard channel if
-  // present.
-  size_t num_channels() const { return num_channels_; }
-
-  bool has_keyboard() const { return has_keyboard_; }
-  size_t num_frames() const { return num_frames_; }
-  size_t num_samples() const { return num_channels_ * num_frames_; }
-
-  bool operator==(const StreamConfig& other) const {
-    return sample_rate_hz_ == other.sample_rate_hz_ &&
-           num_channels_ == other.num_channels_ &&
-           has_keyboard_ == other.has_keyboard_;
-  }
-
-  bool operator!=(const StreamConfig& other) const { return !(*this == other); }
-
- private:
-  static size_t calculate_frames(int sample_rate_hz) {
-    return static_cast<size_t>(
-        AudioProcessing::kChunkSizeMs * sample_rate_hz / 1000);
-  }
-
-  int sample_rate_hz_;
-  size_t num_channels_;
-  bool has_keyboard_;
-  size_t num_frames_;
-};
-
-class ProcessingConfig {
- public:
-  enum StreamName {
-    kInputStream,
-    kOutputStream,
-    kReverseInputStream,
-    kReverseOutputStream,
-    kNumStreamNames,
-  };
-
-  const StreamConfig& input_stream() const {
-    return streams[StreamName::kInputStream];
-  }
-  const StreamConfig& output_stream() const {
-    return streams[StreamName::kOutputStream];
-  }
-  const StreamConfig& reverse_input_stream() const {
-    return streams[StreamName::kReverseInputStream];
-  }
-  const StreamConfig& reverse_output_stream() const {
-    return streams[StreamName::kReverseOutputStream];
-  }
-
-  StreamConfig& input_stream() { return streams[StreamName::kInputStream]; }
-  StreamConfig& output_stream() { return streams[StreamName::kOutputStream]; }
-  StreamConfig& reverse_input_stream() {
-    return streams[StreamName::kReverseInputStream];
-  }
-  StreamConfig& reverse_output_stream() {
-    return streams[StreamName::kReverseOutputStream];
-  }
-
-  bool operator==(const ProcessingConfig& other) const {
-    for (int i = 0; i < StreamName::kNumStreamNames; ++i) {
-      if (this->streams[i] != other.streams[i]) {
-        return false;
-      }
-    }
-    return true;
-  }
-
-  bool operator!=(const ProcessingConfig& other) const {
-    return !(*this == other);
-  }
-
-  StreamConfig streams[StreamName::kNumStreamNames];
-};
-
-// The acoustic echo cancellation (AEC) component provides better performance
-// than AECM but also requires more processing power and is dependent on delay
-// stability and reporting accuracy. As such it is well-suited and recommended
-// for PC and IP phone applications.
-//
-// Not recommended to be enabled on the server-side.
-class EchoCancellation {
- public:
-  // EchoCancellation and EchoControlMobile may not be enabled simultaneously.
-  // Enabling one will disable the other.
-  virtual int Enable(bool enable) = 0;
-  virtual bool is_enabled() const = 0;
-
-  // Differences in clock speed on the primary and reverse streams can impact
-  // the AEC performance. On the client-side, this could be seen when different
-  // render and capture devices are used, particularly with webcams.
-  //
-  // This enables a compensation mechanism, and requires that
-  // set_stream_drift_samples() be called.
-  virtual int enable_drift_compensation(bool enable) = 0;
-  virtual bool is_drift_compensation_enabled() const = 0;
-
-  // Sets the difference between the number of samples rendered and captured by
-  // the audio devices since the last call to |ProcessStream()|. Must be called
-  // if drift compensation is enabled, prior to |ProcessStream()|.
-  virtual void set_stream_drift_samples(int drift) = 0;
-  virtual int stream_drift_samples() const = 0;
-
-  enum SuppressionLevel {
-    kLowSuppression,
-    kModerateSuppression,
-    kHighSuppression
-  };
-
-  // Sets the aggressiveness of the suppressor. A higher level trades off
-  // double-talk performance for increased echo suppression.
-  virtual int set_suppression_level(SuppressionLevel level) = 0;
-  virtual SuppressionLevel suppression_level() const = 0;
-
-  // Returns false if the current frame almost certainly contains no echo
-  // and true if it _might_ contain echo.
-  virtual bool stream_has_echo() const = 0;
-
-  // Enables the computation of various echo metrics. These are obtained
-  // through |GetMetrics()|.
-  virtual int enable_metrics(bool enable) = 0;
-  virtual bool are_metrics_enabled() const = 0;
-
-  // Each statistic is reported in dB.
-  // P_far:  Far-end (render) signal power.
-  // P_echo: Near-end (capture) echo signal power.
-  // P_out:  Signal power at the output of the AEC.
-  // P_a:    Internal signal power at the point before the AEC's non-linear
-  //         processor.
-  struct Metrics {
-    // RERL = ERL + ERLE
-    AudioProcessing::Statistic residual_echo_return_loss;
-
-    // ERL = 10log_10(P_far / P_echo)
-    AudioProcessing::Statistic echo_return_loss;
-
-    // ERLE = 10log_10(P_echo / P_out)
-    AudioProcessing::Statistic echo_return_loss_enhancement;
-
-    // (Pre non-linear processing suppression) A_NLP = 10log_10(P_echo / P_a)
-    AudioProcessing::Statistic a_nlp;
-
-    // Fraction of time that the AEC linear filter is divergent, in a 1-second
-    // non-overlapped aggregation window.
-    float divergent_filter_fraction;
-  };
-
-  // Deprecated. Use GetStatistics on the AudioProcessing interface instead.
-  // TODO(ajm): discuss the metrics update period.
-  virtual int GetMetrics(Metrics* metrics) = 0;
-
-  // Enables computation and logging of delay values. Statistics are obtained
-  // through |GetDelayMetrics()|.
-  virtual int enable_delay_logging(bool enable) = 0;
-  virtual bool is_delay_logging_enabled() const = 0;
-
-  // The delay metrics consists of the delay |median| and the delay standard
-  // deviation |std|. It also consists of the fraction of delay estimates
-  // |fraction_poor_delays| that can make the echo cancellation perform poorly.
-  // The values are aggregated until the first call to |GetDelayMetrics()| and
-  // afterwards aggregated and updated every second.
-  // Note that if there are several clients pulling metrics from
-  // |GetDelayMetrics()| during a session the first call from any of them will
-  // change to one second aggregation window for all.
-  // Deprecated. Use GetStatistics on the AudioProcessing interface instead.
-  virtual int GetDelayMetrics(int* median, int* std) = 0;
-  // Deprecated. Use GetStatistics on the AudioProcessing interface instead.
-  virtual int GetDelayMetrics(int* median, int* std,
-                              float* fraction_poor_delays) = 0;
-
-  // Returns a pointer to the low level AEC component.  In case of multiple
-  // channels, the pointer to the first one is returned.  A NULL pointer is
-  // returned when the AEC component is disabled or has not been initialized
-  // successfully.
-  virtual struct AecCore* aec_core() const = 0;
-
- protected:
-  virtual ~EchoCancellation() {}
-};
-
-// The acoustic echo control for mobile (AECM) component is a low complexity
-// robust option intended for use on mobile devices.
-//
-// Not recommended to be enabled on the server-side.
-class EchoControlMobile {
- public:
-  // EchoCancellation and EchoControlMobile may not be enabled simultaneously.
-  // Enabling one will disable the other.
-  virtual int Enable(bool enable) = 0;
-  virtual bool is_enabled() const = 0;
-
-  // Recommended settings for particular audio routes. In general, the louder
-  // the echo is expected to be, the higher this value should be set. The
-  // preferred setting may vary from device to device.
-  enum RoutingMode {
-    kQuietEarpieceOrHeadset,
-    kEarpiece,
-    kLoudEarpiece,
-    kSpeakerphone,
-    kLoudSpeakerphone
-  };
-
-  // Sets echo control appropriate for the audio routing |mode| on the device.
-  // It can and should be updated during a call if the audio routing changes.
-  virtual int set_routing_mode(RoutingMode mode) = 0;
-  virtual RoutingMode routing_mode() const = 0;
-
-  // Comfort noise replaces suppressed background noise to maintain a
-  // consistent signal level.
-  virtual int enable_comfort_noise(bool enable) = 0;
-  virtual bool is_comfort_noise_enabled() const = 0;
-
-  // A typical use case is to initialize the component with an echo path from a
-  // previous call. The echo path is retrieved using |GetEchoPath()|, typically
-  // at the end of a call. The data can then be stored for later use as an
-  // initializer before the next call, using |SetEchoPath()|.
-  //
-  // Controlling the echo path this way requires the data |size_bytes| to match
-  // the internal echo path size. This size can be acquired using
-  // |echo_path_size_bytes()|. |SetEchoPath()| causes an entire reset, worth
-  // noting if it is to be called during an ongoing call.
-  //
-  // It is possible that version incompatibilities may result in a stored echo
-  // path of the incorrect size. In this case, the stored path should be
-  // discarded.
-  virtual int SetEchoPath(const void* echo_path, size_t size_bytes) = 0;
-  virtual int GetEchoPath(void* echo_path, size_t size_bytes) const = 0;
-
-  // The returned path size is guaranteed not to change for the lifetime of
-  // the application.
-  static size_t echo_path_size_bytes();
-
- protected:
-  virtual ~EchoControlMobile() {}
-};
-
-// The automatic gain control (AGC) component brings the signal to an
-// appropriate range. This is done by applying a digital gain directly and, in
-// the analog mode, prescribing an analog gain to be applied at the audio HAL.
-//
-// Recommended to be enabled on the client-side.
-class GainControl {
- public:
-  virtual int Enable(bool enable) = 0;
-  virtual bool is_enabled() const = 0;
-
-  // When an analog mode is set, this must be called prior to |ProcessStream()|
-  // to pass the current analog level from the audio HAL. Must be within the
-  // range provided to |set_analog_level_limits()|.
-  virtual int set_stream_analog_level(int level) = 0;
-
-  // When an analog mode is set, this should be called after |ProcessStream()|
-  // to obtain the recommended new analog level for the audio HAL. It is the
-  // users responsibility to apply this level.
-  virtual int stream_analog_level() = 0;
-
-  enum Mode {
-    // Adaptive mode intended for use if an analog volume control is available
-    // on the capture device. It will require the user to provide coupling
-    // between the OS mixer controls and AGC through the |stream_analog_level()|
-    // functions.
-    //
-    // It consists of an analog gain prescription for the audio device and a
-    // digital compression stage.
-    kAdaptiveAnalog,
-
-    // Adaptive mode intended for situations in which an analog volume control
-    // is unavailable. It operates in a similar fashion to the adaptive analog
-    // mode, but with scaling instead applied in the digital domain. As with
-    // the analog mode, it additionally uses a digital compression stage.
-    kAdaptiveDigital,
-
-    // Fixed mode which enables only the digital compression stage also used by
-    // the two adaptive modes.
-    //
-    // It is distinguished from the adaptive modes by considering only a
-    // short time-window of the input signal. It applies a fixed gain through
-    // most of the input level range, and compresses (gradually reduces gain
-    // with increasing level) the input signal at higher levels. This mode is
-    // preferred on embedded devices where the capture signal level is
-    // predictable, so that a known gain can be applied.
-    kFixedDigital
-  };
-
-  virtual int set_mode(Mode mode) = 0;
-  virtual Mode mode() const = 0;
-
-  // Sets the target peak |level| (or envelope) of the AGC in dBFs (decibels
-  // from digital full-scale). The convention is to use positive values. For
-  // instance, passing in a value of 3 corresponds to -3 dBFs, or a target
-  // level 3 dB below full-scale. Limited to [0, 31].
-  //
-  // TODO(ajm): use a negative value here instead, if/when VoE will similarly
-  //            update its interface.
-  virtual int set_target_level_dbfs(int level) = 0;
-  virtual int target_level_dbfs() const = 0;
-
-  // Sets the maximum |gain| the digital compression stage may apply, in dB. A
-  // higher number corresponds to greater compression, while a value of 0 will
-  // leave the signal uncompressed. Limited to [0, 90].
-  virtual int set_compression_gain_db(int gain) = 0;
-  virtual int compression_gain_db() const = 0;
-
-  // When enabled, the compression stage will hard limit the signal to the
-  // target level. Otherwise, the signal will be compressed but not limited
-  // above the target level.
-  virtual int enable_limiter(bool enable) = 0;
-  virtual bool is_limiter_enabled() const = 0;
-
-  // Sets the |minimum| and |maximum| analog levels of the audio capture device.
-  // Must be set if and only if an analog mode is used. Limited to [0, 65535].
-  virtual int set_analog_level_limits(int minimum,
-                                      int maximum) = 0;
-  virtual int analog_level_minimum() const = 0;
-  virtual int analog_level_maximum() const = 0;
-
-  // Returns true if the AGC has detected a saturation event (period where the
-  // signal reaches digital full-scale) in the current frame and the analog
-  // level cannot be reduced.
-  //
-  // This could be used as an indicator to reduce or disable analog mic gain at
-  // the audio HAL.
-  virtual bool stream_is_saturated() const = 0;
-
- protected:
-  virtual ~GainControl() {}
-};
-// TODO(peah): Remove this interface.
-// A filtering component which removes DC offset and low-frequency noise.
-// Recommended to be enabled on the client-side.
-class HighPassFilter {
- public:
-  virtual int Enable(bool enable) = 0;
-  virtual bool is_enabled() const = 0;
-
-  virtual ~HighPassFilter() {}
-};
-
-// An estimation component used to retrieve level metrics.
-class LevelEstimator {
- public:
-  virtual int Enable(bool enable) = 0;
-  virtual bool is_enabled() const = 0;
-
-  // Returns the root mean square (RMS) level in dBFs (decibels from digital
-  // full-scale), or alternately dBov. It is computed over all primary stream
-  // frames since the last call to RMS(). The returned value is positive but
-  // should be interpreted as negative. It is constrained to [0, 127].
-  //
-  // The computation follows: https://tools.ietf.org/html/rfc6465
-  // with the intent that it can provide the RTP audio level indication.
-  //
-  // Frames passed to ProcessStream() with an |_energy| of zero are considered
-  // to have been muted. The RMS of the frame will be interpreted as -127.
-  virtual int RMS() = 0;
-
- protected:
-  virtual ~LevelEstimator() {}
-};
-
-// The noise suppression (NS) component attempts to remove noise while
-// retaining speech. Recommended to be enabled on the client-side.
-//
-// Recommended to be enabled on the client-side.
-class NoiseSuppression {
- public:
-  virtual int Enable(bool enable) = 0;
-  virtual bool is_enabled() const = 0;
-
-  // Determines the aggressiveness of the suppression. Increasing the level
-  // will reduce the noise level at the expense of a higher speech distortion.
-  enum Level {
-    kLow,
-    kModerate,
-    kHigh,
-    kVeryHigh
-  };
-
-  virtual int set_level(Level level) = 0;
-  virtual Level level() const = 0;
-
-  // Returns the internally computed prior speech probability of current frame
-  // averaged over output channels. This is not supported in fixed point, for
-  // which |kUnsupportedFunctionError| is returned.
-  virtual float speech_probability() const = 0;
-
-  // Returns the noise estimate per frequency bin averaged over all channels.
-  virtual std::vector<float> NoiseEstimate() = 0;
-
- protected:
-  virtual ~NoiseSuppression() {}
-};
-
-// The voice activity detection (VAD) component analyzes the stream to
-// determine if voice is present. A facility is also provided to pass in an
-// external VAD decision.
-//
-// In addition to |stream_has_voice()| the VAD decision is provided through the
-// |AudioFrame| passed to |ProcessStream()|. The |vad_activity_| member will be
-// modified to reflect the current decision.
-class VoiceDetection {
- public:
-  virtual int Enable(bool enable) = 0;
-  virtual bool is_enabled() const = 0;
-
-  // Returns true if voice is detected in the current frame. Should be called
-  // after |ProcessStream()|.
-  virtual bool stream_has_voice() const = 0;
-
-  // Some of the APM functionality requires a VAD decision. In the case that
-  // a decision is externally available for the current frame, it can be passed
-  // in here, before |ProcessStream()| is called.
-  //
-  // VoiceDetection does _not_ need to be enabled to use this. If it happens to
-  // be enabled, detection will be skipped for any frame in which an external
-  // VAD decision is provided.
-  virtual int set_stream_has_voice(bool has_voice) = 0;
-
-  // Specifies the likelihood that a frame will be declared to contain voice.
-  // A higher value makes it more likely that speech will not be clipped, at
-  // the expense of more noise being detected as voice.
-  enum Likelihood {
-    kVeryLowLikelihood,
-    kLowLikelihood,
-    kModerateLikelihood,
-    kHighLikelihood
-  };
-
-  virtual int set_likelihood(Likelihood likelihood) = 0;
-  virtual Likelihood likelihood() const = 0;
-
-  // Sets the |size| of the frames in ms on which the VAD will operate. Larger
-  // frames will improve detection accuracy, but reduce the frequency of
-  // updates.
-  //
-  // This does not impact the size of frames passed to |ProcessStream()|.
-  virtual int set_frame_size_ms(int size) = 0;
-  virtual int frame_size_ms() const = 0;
-
- protected:
-  virtual ~VoiceDetection() {}
-};
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_INCLUDE_AUDIO_PROCESSING_H_
diff --git a/modules/audio_processing/include/config.cc b/modules/audio_processing/include/config.cc
deleted file mode 100644
index bbbc452..0000000
--- a/modules/audio_processing/include/config.cc
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- *  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_processing/include/config.h"
-
-namespace webrtc {
-
-Config::Config() {}
-
-Config::~Config() {
-  for (OptionMap::iterator it = options_.begin(); it != options_.end(); ++it) {
-    delete it->second;
-  }
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/include/config.h b/modules/audio_processing/include/config.h
deleted file mode 100644
index 35836e8..0000000
--- a/modules/audio_processing/include/config.h
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- *  Copyright (c) 2013 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_PROCESSING_INCLUDE_CONFIG_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_INCLUDE_CONFIG_H_
-
-#include <map>
-
-#include "webrtc/rtc_base/basictypes.h"
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace webrtc {
-
-// Only add new values to the end of the enumeration and never remove (only
-// deprecate) to maintain binary compatibility.
-enum class ConfigOptionID {
-  kMyExperimentForTest,
-  kAlgo1CostFunctionForTest,
-  kTemporalLayersFactory,  // Deprecated
-  kNetEqCapacityConfig,    // Deprecated
-  kNetEqFastAccelerate,    // Deprecated
-  kVoicePacing,            // Deprecated
-  kExtendedFilter,
-  kDelayAgnostic,
-  kExperimentalAgc,
-  kExperimentalNs,
-  kBeamforming,
-  kIntelligibility,
-  kEchoCanceller3,  // Deprecated
-  kAecRefinedAdaptiveFilter,
-  kLevelControl
-};
-
-// Class Config is designed to ease passing a set of options across webrtc code.
-// Options are identified by typename in order to avoid incorrect casts.
-//
-// Usage:
-// * declaring an option:
-//    struct Algo1_CostFunction {
-//      virtual float cost(int x) const { return x; }
-//      virtual ~Algo1_CostFunction() {}
-//    };
-//
-// * accessing an option:
-//    config.Get<Algo1_CostFunction>().cost(value);
-//
-// * setting an option:
-//    struct SqrCost : Algo1_CostFunction {
-//      virtual float cost(int x) const { return x*x; }
-//    };
-//    config.Set<Algo1_CostFunction>(new SqrCost());
-//
-// Note: This class is thread-compatible (like STL containers).
-class Config {
- public:
-  // Returns the option if set or a default constructed one.
-  // Callers that access options too often are encouraged to cache the result.
-  // Returned references are owned by this.
-  //
-  // Requires std::is_default_constructible<T>
-  template<typename T> const T& Get() const;
-
-  // Set the option, deleting any previous instance of the same.
-  // This instance gets ownership of the newly set value.
-  template<typename T> void Set(T* value);
-
-  Config();
-  ~Config();
-
- private:
-  struct BaseOption {
-    virtual ~BaseOption() {}
-  };
-
-  template<typename T>
-  struct Option : BaseOption {
-    explicit Option(T* v): value(v) {}
-    ~Option() {
-      delete value;
-    }
-    T* value;
-  };
-
-  template<typename T>
-  static ConfigOptionID identifier() {
-    return T::identifier;
-  }
-
-  // Used to instantiate a default constructed object that doesn't needs to be
-  // owned. This allows Get<T> to be implemented without requiring explicitly
-  // locks.
-  template<typename T>
-  static const T& default_value() {
-    RTC_DEFINE_STATIC_LOCAL(const T, def, ());
-    return def;
-  }
-
-  typedef std::map<ConfigOptionID, BaseOption*> OptionMap;
-  OptionMap options_;
-
-  // RTC_DISALLOW_COPY_AND_ASSIGN
-  Config(const Config&);
-  void operator=(const Config&);
-};
-
-template<typename T>
-const T& Config::Get() const {
-  OptionMap::const_iterator it = options_.find(identifier<T>());
-  if (it != options_.end()) {
-    const T* t = static_cast<Option<T>*>(it->second)->value;
-    if (t) {
-      return *t;
-    }
-  }
-  return default_value<T>();
-}
-
-template<typename T>
-void Config::Set(T* value) {
-  BaseOption*& it = options_[identifier<T>()];
-  delete it;
-  it = new Option<T>(value);
-}
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_INCLUDE_CONFIG_H_
diff --git a/modules/audio_processing/include/mock_audio_processing.h b/modules/audio_processing/include/mock_audio_processing.h
deleted file mode 100644
index 2ed7ca2..0000000
--- a/modules/audio_processing/include/mock_audio_processing.h
+++ /dev/null
@@ -1,221 +0,0 @@
-/*
- *  Copyright (c) 2013 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_PROCESSING_INCLUDE_MOCK_AUDIO_PROCESSING_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_INCLUDE_MOCK_AUDIO_PROCESSING_H_
-
-#include <memory>
-
-#include "webrtc/modules/audio_processing/include/aec_dump.h"
-#include "webrtc/modules/audio_processing/include/audio_processing.h"
-#include "webrtc/test/gmock.h"
-
-namespace webrtc {
-
-namespace test {
-
-class MockEchoCancellation : public EchoCancellation {
- public:
-  virtual ~MockEchoCancellation() {}
-  MOCK_METHOD1(Enable, int(bool enable));
-  MOCK_CONST_METHOD0(is_enabled, bool());
-  MOCK_METHOD1(enable_drift_compensation, int(bool enable));
-  MOCK_CONST_METHOD0(is_drift_compensation_enabled, bool());
-  MOCK_METHOD1(set_stream_drift_samples, void(int drift));
-  MOCK_CONST_METHOD0(stream_drift_samples, int());
-  MOCK_METHOD1(set_suppression_level, int(SuppressionLevel level));
-  MOCK_CONST_METHOD0(suppression_level, SuppressionLevel());
-  MOCK_CONST_METHOD0(stream_has_echo, bool());
-  MOCK_METHOD1(enable_metrics, int(bool enable));
-  MOCK_CONST_METHOD0(are_metrics_enabled, bool());
-  MOCK_METHOD1(GetMetrics, int(Metrics* metrics));
-  MOCK_METHOD1(enable_delay_logging, int(bool enable));
-  MOCK_CONST_METHOD0(is_delay_logging_enabled, bool());
-  MOCK_METHOD2(GetDelayMetrics, int(int* median, int* std));
-  MOCK_METHOD3(GetDelayMetrics, int(int* median, int* std,
-                                    float* fraction_poor_delays));
-  MOCK_CONST_METHOD0(aec_core, struct AecCore*());
-};
-
-class MockEchoControlMobile : public EchoControlMobile {
- public:
-  virtual ~MockEchoControlMobile() {}
-  MOCK_METHOD1(Enable, int(bool enable));
-  MOCK_CONST_METHOD0(is_enabled, bool());
-  MOCK_METHOD1(set_routing_mode, int(RoutingMode mode));
-  MOCK_CONST_METHOD0(routing_mode, RoutingMode());
-  MOCK_METHOD1(enable_comfort_noise, int(bool enable));
-  MOCK_CONST_METHOD0(is_comfort_noise_enabled, bool());
-  MOCK_METHOD2(SetEchoPath, int(const void* echo_path, size_t size_bytes));
-  MOCK_CONST_METHOD2(GetEchoPath, int(void* echo_path, size_t size_bytes));
-};
-
-class MockGainControl : public GainControl {
- public:
-  virtual ~MockGainControl() {}
-  MOCK_METHOD1(Enable, int(bool enable));
-  MOCK_CONST_METHOD0(is_enabled, bool());
-  MOCK_METHOD1(set_stream_analog_level, int(int level));
-  MOCK_METHOD0(stream_analog_level, int());
-  MOCK_METHOD1(set_mode, int(Mode mode));
-  MOCK_CONST_METHOD0(mode, Mode());
-  MOCK_METHOD1(set_target_level_dbfs, int(int level));
-  MOCK_CONST_METHOD0(target_level_dbfs, int());
-  MOCK_METHOD1(set_compression_gain_db, int(int gain));
-  MOCK_CONST_METHOD0(compression_gain_db, int());
-  MOCK_METHOD1(enable_limiter, int(bool enable));
-  MOCK_CONST_METHOD0(is_limiter_enabled, bool());
-  MOCK_METHOD2(set_analog_level_limits, int(int minimum, int maximum));
-  MOCK_CONST_METHOD0(analog_level_minimum, int());
-  MOCK_CONST_METHOD0(analog_level_maximum, int());
-  MOCK_CONST_METHOD0(stream_is_saturated, bool());
-};
-
-class MockHighPassFilter : public HighPassFilter {
- public:
-  virtual ~MockHighPassFilter() {}
-  MOCK_METHOD1(Enable, int(bool enable));
-  MOCK_CONST_METHOD0(is_enabled, bool());
-};
-
-class MockLevelEstimator : public LevelEstimator {
- public:
-  virtual ~MockLevelEstimator() {}
-  MOCK_METHOD1(Enable, int(bool enable));
-  MOCK_CONST_METHOD0(is_enabled, bool());
-  MOCK_METHOD0(RMS, int());
-};
-
-class MockNoiseSuppression : public NoiseSuppression {
- public:
-  virtual ~MockNoiseSuppression() {}
-  MOCK_METHOD1(Enable, int(bool enable));
-  MOCK_CONST_METHOD0(is_enabled, bool());
-  MOCK_METHOD1(set_level, int(Level level));
-  MOCK_CONST_METHOD0(level, Level());
-  MOCK_CONST_METHOD0(speech_probability, float());
-  MOCK_METHOD0(NoiseEstimate, std::vector<float>());
-};
-
-class MockVoiceDetection : public VoiceDetection {
- public:
-  virtual ~MockVoiceDetection() {}
-  MOCK_METHOD1(Enable, int(bool enable));
-  MOCK_CONST_METHOD0(is_enabled, bool());
-  MOCK_CONST_METHOD0(stream_has_voice, bool());
-  MOCK_METHOD1(set_stream_has_voice, int(bool has_voice));
-  MOCK_METHOD1(set_likelihood, int(Likelihood likelihood));
-  MOCK_CONST_METHOD0(likelihood, Likelihood());
-  MOCK_METHOD1(set_frame_size_ms, int(int size));
-  MOCK_CONST_METHOD0(frame_size_ms, int());
-};
-
-class MockAudioProcessing : public AudioProcessing {
- public:
-  MockAudioProcessing()
-      : echo_cancellation_(new testing::NiceMock<MockEchoCancellation>()),
-        echo_control_mobile_(new testing::NiceMock<MockEchoControlMobile>()),
-        gain_control_(new testing::NiceMock<MockGainControl>()),
-        high_pass_filter_(new testing::NiceMock<MockHighPassFilter>()),
-        level_estimator_(new testing::NiceMock<MockLevelEstimator>()),
-        noise_suppression_(new testing::NiceMock<MockNoiseSuppression>()),
-        voice_detection_(new testing::NiceMock<MockVoiceDetection>()) {
-  }
-
-  virtual ~MockAudioProcessing() {}
-
-  MOCK_METHOD0(Initialize, int());
-  MOCK_METHOD6(Initialize, int(int capture_input_sample_rate_hz,
-                               int capture_output_sample_rate_hz,
-                               int render_sample_rate_hz,
-                               ChannelLayout capture_input_layout,
-                               ChannelLayout capture_output_layout,
-                               ChannelLayout render_input_layout));
-  MOCK_METHOD1(Initialize, int(const ProcessingConfig& processing_config));
-  MOCK_METHOD1(ApplyConfig, void(const Config& config));
-  MOCK_METHOD1(SetExtraOptions, void(const webrtc::Config& config));
-  MOCK_CONST_METHOD0(proc_sample_rate_hz, int());
-  MOCK_CONST_METHOD0(proc_split_sample_rate_hz, int());
-  MOCK_CONST_METHOD0(num_input_channels, size_t());
-  MOCK_CONST_METHOD0(num_proc_channels, size_t());
-  MOCK_CONST_METHOD0(num_output_channels, size_t());
-  MOCK_CONST_METHOD0(num_reverse_channels, size_t());
-  MOCK_METHOD1(set_output_will_be_muted, void(bool muted));
-  MOCK_METHOD1(ProcessStream, int(AudioFrame* frame));
-  MOCK_METHOD7(ProcessStream, int(const float* const* src,
-                                  size_t samples_per_channel,
-                                  int input_sample_rate_hz,
-                                  ChannelLayout input_layout,
-                                  int output_sample_rate_hz,
-                                  ChannelLayout output_layout,
-                                  float* const* dest));
-  MOCK_METHOD4(ProcessStream, int(const float* const* src,
-                                 const StreamConfig& input_config,
-                                 const StreamConfig& output_config,
-                                 float* const* dest));
-  MOCK_METHOD1(ProcessReverseStream, int(AudioFrame* frame));
-  MOCK_METHOD4(AnalyzeReverseStream, int(const float* const* data,
-                                         size_t samples_per_channel,
-                                         int sample_rate_hz,
-                                         ChannelLayout layout));
-  MOCK_METHOD4(ProcessReverseStream, int(const float* const* src,
-                                         const StreamConfig& input_config,
-                                         const StreamConfig& output_config,
-                                         float* const* dest));
-  MOCK_METHOD1(set_stream_delay_ms, int(int delay));
-  MOCK_CONST_METHOD0(stream_delay_ms, int());
-  MOCK_CONST_METHOD0(was_stream_delay_set, bool());
-  MOCK_METHOD1(set_stream_key_pressed, void(bool key_pressed));
-  MOCK_METHOD1(set_delay_offset_ms, void(int offset));
-  MOCK_CONST_METHOD0(delay_offset_ms, int());
-
-  virtual void AttachAecDump(std::unique_ptr<AecDump> aec_dump) {}
-  MOCK_METHOD0(DetachAecDump, void());
-
-  MOCK_METHOD0(UpdateHistogramsOnCallEnd, void());
-  MOCK_CONST_METHOD0(GetStatistics, AudioProcessingStatistics());
-  virtual MockEchoCancellation* echo_cancellation() const {
-    return echo_cancellation_.get();
-  }
-  virtual MockEchoControlMobile* echo_control_mobile() const {
-    return echo_control_mobile_.get();
-  }
-  virtual MockGainControl* gain_control() const {
-    return gain_control_.get();
-  }
-  virtual MockHighPassFilter* high_pass_filter() const {
-    return high_pass_filter_.get();
-  }
-  virtual MockLevelEstimator* level_estimator() const {
-    return level_estimator_.get();
-  }
-  virtual MockNoiseSuppression* noise_suppression() const {
-    return noise_suppression_.get();
-  }
-  virtual MockVoiceDetection* voice_detection() const {
-    return voice_detection_.get();
-  }
-
-  MOCK_CONST_METHOD0(GetConfig, AudioProcessing::Config());
-
- private:
-  std::unique_ptr<MockEchoCancellation> echo_cancellation_;
-  std::unique_ptr<MockEchoControlMobile> echo_control_mobile_;
-  std::unique_ptr<MockGainControl> gain_control_;
-  std::unique_ptr<MockHighPassFilter> high_pass_filter_;
-  std::unique_ptr<MockLevelEstimator> level_estimator_;
-  std::unique_ptr<MockNoiseSuppression> noise_suppression_;
-  std::unique_ptr<MockVoiceDetection> voice_detection_;
-};
-
-}  // namespace test
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_INCLUDE_MOCK_AUDIO_PROCESSING_H_
diff --git a/modules/audio_processing/intelligibility/intelligibility_enhancer.cc b/modules/audio_processing/intelligibility/intelligibility_enhancer.cc
deleted file mode 100644
index 817d9dd..0000000
--- a/modules/audio_processing/intelligibility/intelligibility_enhancer.cc
+++ /dev/null
@@ -1,391 +0,0 @@
-/*
- *  Copyright (c) 2014 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_processing/intelligibility/intelligibility_enhancer.h"
-
-#include <math.h>
-#include <stdlib.h>
-#include <algorithm>
-#include <limits>
-#include <numeric>
-
-#include "webrtc/common_audio/include/audio_util.h"
-#include "webrtc/common_audio/window_generator.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/safe_minmax.h"
-
-namespace webrtc {
-
-namespace {
-
-const size_t kErbResolution = 2;
-const int kWindowSizeMs = 16;
-const int kChunkSizeMs = 10;  // Size provided by APM.
-const float kClipFreqKhz = 0.2f;
-const float kKbdAlpha = 1.5f;
-const float kLambdaBot = -1.f;      // Extreme values in bisection
-const float kLambdaTop = -1e-5f;      // search for lamda.
-const float kVoiceProbabilityThreshold = 0.5f;
-// Number of chunks after voice activity which is still considered speech.
-const size_t kSpeechOffsetDelay = 10;
-const float kDecayRate = 0.995f;              // Power estimation decay rate.
-const float kMaxRelativeGainChange = 0.005f;
-const float kRho = 0.0004f;  // Default production and interpretation SNR.
-const float kPowerNormalizationFactor = 1.f / (1 << 30);
-const float kMaxActiveSNR = 128.f;  // 21dB
-const float kMinInactiveSNR = 32.f;  // 15dB
-const size_t kGainUpdatePeriod = 10u;
-
-// Returns dot product of vectors |a| and |b| with size |length|.
-float DotProduct(const float* a, const float* b, size_t length) {
-  float ret = 0.f;
-  for (size_t i = 0; i < length; ++i) {
-    ret += a[i] * b[i];
-  }
-  return ret;
-}
-
-// Computes the power across ERB bands from the power spectral density |pow|.
-// Stores it in |result|.
-void MapToErbBands(const float* pow,
-                   const std::vector<std::vector<float>>& filter_bank,
-                   float* result) {
-  for (size_t i = 0; i < filter_bank.size(); ++i) {
-    RTC_DCHECK_GT(filter_bank[i].size(), 0);
-    result[i] = kPowerNormalizationFactor *
-                DotProduct(filter_bank[i].data(), pow, filter_bank[i].size());
-  }
-}
-
-}  // namespace
-
-IntelligibilityEnhancer::IntelligibilityEnhancer(int sample_rate_hz,
-                                                 size_t num_render_channels,
-                                                 size_t num_bands,
-                                                 size_t num_noise_bins)
-    : freqs_(RealFourier::ComplexLength(
-          RealFourier::FftOrder(sample_rate_hz * kWindowSizeMs / 1000))),
-      num_noise_bins_(num_noise_bins),
-      chunk_length_(static_cast<size_t>(sample_rate_hz * kChunkSizeMs / 1000)),
-      bank_size_(GetBankSize(sample_rate_hz, kErbResolution)),
-      sample_rate_hz_(sample_rate_hz),
-      num_render_channels_(num_render_channels),
-      clear_power_estimator_(freqs_, kDecayRate),
-      noise_power_estimator_(num_noise_bins, kDecayRate),
-      filtered_clear_pow_(bank_size_, 0.f),
-      filtered_noise_pow_(num_noise_bins, 0.f),
-      center_freqs_(bank_size_),
-      capture_filter_bank_(CreateErbBank(num_noise_bins)),
-      render_filter_bank_(CreateErbBank(freqs_)),
-      gains_eq_(bank_size_),
-      gain_applier_(freqs_, kMaxRelativeGainChange),
-      audio_s16_(chunk_length_),
-      chunks_since_voice_(kSpeechOffsetDelay),
-      is_speech_(false),
-      snr_(kMaxActiveSNR),
-      is_active_(false),
-      num_chunks_(0u),
-      num_active_chunks_(0u),
-      noise_estimation_buffer_(num_noise_bins),
-      noise_estimation_queue_(kMaxNumNoiseEstimatesToBuffer,
-                              std::vector<float>(num_noise_bins),
-                              RenderQueueItemVerifier<float>(num_noise_bins)) {
-  RTC_DCHECK_LE(kRho, 1.f);
-
-  const size_t erb_index = static_cast<size_t>(
-      ceilf(11.17f * logf((kClipFreqKhz + 0.312f) / (kClipFreqKhz + 14.6575f)) +
-            43.f));
-  start_freq_ = std::max(static_cast<size_t>(1), erb_index * kErbResolution);
-
-  size_t window_size = static_cast<size_t>(1) << RealFourier::FftOrder(freqs_);
-  std::vector<float> kbd_window(window_size);
-  WindowGenerator::KaiserBesselDerived(kKbdAlpha, window_size,
-                                       kbd_window.data());
-  render_mangler_.reset(new LappedTransform(
-      num_render_channels_, num_render_channels_, chunk_length_,
-      kbd_window.data(), window_size, window_size / 2, this));
-
-  const size_t initial_delay = render_mangler_->initial_delay();
-  for (size_t i = 0u; i < num_bands - 1; ++i) {
-    high_bands_buffers_.push_back(std::unique_ptr<intelligibility::DelayBuffer>(
-        new intelligibility::DelayBuffer(initial_delay, num_render_channels_)));
-  }
-}
-
-IntelligibilityEnhancer::~IntelligibilityEnhancer() {
-  // Don't rely on this log, since the destructor isn't called when the
-  // app/tab is killed.
-  if (num_chunks_ > 0) {
-    LOG(LS_INFO) << "Intelligibility Enhancer was active for "
-                 << 100.f * static_cast<float>(num_active_chunks_) / num_chunks_
-                 << "% of the call.";
-  } else {
-    LOG(LS_INFO) << "Intelligibility Enhancer processed no chunk.";
-  }
-}
-
-void IntelligibilityEnhancer::SetCaptureNoiseEstimate(
-    std::vector<float> noise, float gain) {
-  RTC_DCHECK_EQ(noise.size(), num_noise_bins_);
-  for (auto& bin : noise) {
-    bin *= gain;
-  }
-  // Disregarding return value since buffer overflow is acceptable, because it
-  // is not critical to get each noise estimate.
-  if (noise_estimation_queue_.Insert(&noise)) {
-  };
-}
-
-void IntelligibilityEnhancer::ProcessRenderAudio(AudioBuffer* audio) {
-  RTC_DCHECK_EQ(num_render_channels_, audio->num_channels());
-  while (noise_estimation_queue_.Remove(&noise_estimation_buffer_)) {
-    noise_power_estimator_.Step(noise_estimation_buffer_.data());
-  }
-  float* const* low_band = audio->split_channels_f(kBand0To8kHz);
-  is_speech_ = IsSpeech(low_band[0]);
-  render_mangler_->ProcessChunk(low_band, low_band);
-  DelayHighBands(audio);
-}
-
-void IntelligibilityEnhancer::ProcessAudioBlock(
-    const std::complex<float>* const* in_block,
-    size_t in_channels,
-    size_t frames,
-    size_t /* out_channels */,
-    std::complex<float>* const* out_block) {
-  RTC_DCHECK_EQ(freqs_, frames);
-  if (is_speech_) {
-    clear_power_estimator_.Step(in_block[0]);
-  }
-  SnrBasedEffectActivation();
-  ++num_chunks_;
-  if (is_active_) {
-    ++num_active_chunks_;
-    if (num_chunks_ % kGainUpdatePeriod == 0) {
-      MapToErbBands(clear_power_estimator_.power().data(), render_filter_bank_,
-                    filtered_clear_pow_.data());
-      MapToErbBands(noise_power_estimator_.power().data(), capture_filter_bank_,
-                    filtered_noise_pow_.data());
-      SolveForGainsGivenLambda(kLambdaTop, start_freq_, gains_eq_.data());
-      const float power_target = std::accumulate(
-          filtered_clear_pow_.data(),
-          filtered_clear_pow_.data() + bank_size_,
-          0.f);
-      const float power_top =
-          DotProduct(gains_eq_.data(), filtered_clear_pow_.data(), bank_size_);
-      SolveForGainsGivenLambda(kLambdaBot, start_freq_, gains_eq_.data());
-      const float power_bot =
-          DotProduct(gains_eq_.data(), filtered_clear_pow_.data(), bank_size_);
-      if (power_target >= power_bot && power_target <= power_top) {
-        SolveForLambda(power_target);
-        UpdateErbGains();
-      }  // Else experiencing power underflow, so do nothing.
-    }
-  }
-  for (size_t i = 0; i < in_channels; ++i) {
-    gain_applier_.Apply(in_block[i], out_block[i]);
-  }
-}
-
-void IntelligibilityEnhancer::SnrBasedEffectActivation() {
-  const float* clear_psd = clear_power_estimator_.power().data();
-  const float* noise_psd = noise_power_estimator_.power().data();
-  const float clear_power =
-      std::accumulate(clear_psd, clear_psd + freqs_, 0.f);
-  const float noise_power =
-      std::accumulate(noise_psd, noise_psd + freqs_, 0.f);
-  snr_ = kDecayRate * snr_ + (1.f - kDecayRate) * clear_power /
-      (noise_power + std::numeric_limits<float>::epsilon());
-  if (is_active_) {
-    if (snr_ > kMaxActiveSNR) {
-      LOG(LS_INFO) << "Intelligibility Enhancer was deactivated at chunk "
-                   << num_chunks_;
-      is_active_ = false;
-      // Set the target gains to unity.
-      float* gains = gain_applier_.target();
-      for (size_t i = 0; i < freqs_; ++i) {
-        gains[i] = 1.f;
-      }
-    }
-  } else {
-    if (snr_ < kMinInactiveSNR) {
-      LOG(LS_INFO) << "Intelligibility Enhancer was activated at chunk "
-                   << num_chunks_;
-      is_active_ = true;
-    }
-  }
-}
-
-void IntelligibilityEnhancer::SolveForLambda(float power_target) {
-  const float kConvergeThresh = 0.001f;  // TODO(ekmeyerson): Find best values
-  const int kMaxIters = 100;             // for these, based on experiments.
-
-  const float reciprocal_power_target =
-      1.f / (power_target + std::numeric_limits<float>::epsilon());
-  float lambda_bot = kLambdaBot;
-  float lambda_top = kLambdaTop;
-  float power_ratio = 2.f;  // Ratio of achieved power to target power.
-  int iters = 0;
-  while (std::fabs(power_ratio - 1.f) > kConvergeThresh && iters <= kMaxIters) {
-    const float lambda = (lambda_bot + lambda_top) / 2.f;
-    SolveForGainsGivenLambda(lambda, start_freq_, gains_eq_.data());
-    const float power =
-        DotProduct(gains_eq_.data(), filtered_clear_pow_.data(), bank_size_);
-    if (power < power_target) {
-      lambda_bot = lambda;
-    } else {
-      lambda_top = lambda;
-    }
-    power_ratio = std::fabs(power * reciprocal_power_target);
-    ++iters;
-  }
-}
-
-void IntelligibilityEnhancer::UpdateErbGains() {
-  // (ERB gain) = filterbank' * (freq gain)
-  float* gains = gain_applier_.target();
-  for (size_t i = 0; i < freqs_; ++i) {
-    gains[i] = 0.f;
-    for (size_t j = 0; j < bank_size_; ++j) {
-      gains[i] += render_filter_bank_[j][i] * gains_eq_[j];
-    }
-  }
-}
-
-size_t IntelligibilityEnhancer::GetBankSize(int sample_rate,
-                                            size_t erb_resolution) {
-  float freq_limit = sample_rate / 2000.f;
-  size_t erb_scale = static_cast<size_t>(ceilf(
-      11.17f * logf((freq_limit + 0.312f) / (freq_limit + 14.6575f)) + 43.f));
-  return erb_scale * erb_resolution;
-}
-
-std::vector<std::vector<float>> IntelligibilityEnhancer::CreateErbBank(
-    size_t num_freqs) {
-  std::vector<std::vector<float>> filter_bank(bank_size_);
-  size_t lf = 1, rf = 4;
-
-  for (size_t i = 0; i < bank_size_; ++i) {
-    float abs_temp = fabsf((i + 1.f) / static_cast<float>(kErbResolution));
-    center_freqs_[i] = 676170.4f / (47.06538f - expf(0.08950404f * abs_temp));
-    center_freqs_[i] -= 14678.49f;
-  }
-  float last_center_freq = center_freqs_[bank_size_ - 1];
-  for (size_t i = 0; i < bank_size_; ++i) {
-    center_freqs_[i] *= 0.5f * sample_rate_hz_ / last_center_freq;
-  }
-
-  for (size_t i = 0; i < bank_size_; ++i) {
-    filter_bank[i].resize(num_freqs);
-  }
-
-  for (size_t i = 1; i <= bank_size_; ++i) {
-    size_t lll = static_cast<size_t>(
-        round(center_freqs_[rtc::SafeMax<size_t>(1, i - lf) - 1] * num_freqs /
-              (0.5f * sample_rate_hz_)));
-    size_t ll = static_cast<size_t>(
-        round(center_freqs_[rtc::SafeMax<size_t>(1, i) - 1] * num_freqs /
-              (0.5f * sample_rate_hz_)));
-    lll = rtc::SafeClamp<size_t>(lll, 1, num_freqs) - 1;
-    ll = rtc::SafeClamp<size_t>(ll, 1, num_freqs) - 1;
-
-    size_t rrr = static_cast<size_t>(
-        round(center_freqs_[rtc::SafeMin<size_t>(bank_size_, i + rf) - 1] *
-              num_freqs / (0.5f * sample_rate_hz_)));
-    size_t rr = static_cast<size_t>(
-        round(center_freqs_[rtc::SafeMin<size_t>(bank_size_, i + 1) - 1] *
-              num_freqs / (0.5f * sample_rate_hz_)));
-    rrr = rtc::SafeClamp<size_t>(rrr, 1, num_freqs) - 1;
-    rr = rtc::SafeClamp<size_t>(rr, 1, num_freqs) - 1;
-
-    float step = ll == lll ? 0.f : 1.f / (ll - lll);
-    float element = 0.f;
-    for (size_t j = lll; j <= ll; ++j) {
-      filter_bank[i - 1][j] = element;
-      element += step;
-    }
-    step = rr == rrr ? 0.f : 1.f / (rrr - rr);
-    element = 1.f;
-    for (size_t j = rr; j <= rrr; ++j) {
-      filter_bank[i - 1][j] = element;
-      element -= step;
-    }
-    for (size_t j = ll; j <= rr; ++j) {
-      filter_bank[i - 1][j] = 1.f;
-    }
-  }
-
-  for (size_t i = 0; i < num_freqs; ++i) {
-    float sum = 0.f;
-    for (size_t j = 0; j < bank_size_; ++j) {
-      sum += filter_bank[j][i];
-    }
-    for (size_t j = 0; j < bank_size_; ++j) {
-      filter_bank[j][i] /= sum;
-    }
-  }
-  return filter_bank;
-}
-
-void IntelligibilityEnhancer::SolveForGainsGivenLambda(float lambda,
-                                                       size_t start_freq,
-                                                       float* sols) {
-  const float kMinPower = 1e-5f;
-
-  const float* pow_x0 = filtered_clear_pow_.data();
-  const float* pow_n0 = filtered_noise_pow_.data();
-
-  for (size_t n = 0; n < start_freq; ++n) {
-    sols[n] = 1.f;
-  }
-
-  // Analytic solution for optimal gains. See paper for derivation.
-  for (size_t n = start_freq; n < bank_size_; ++n) {
-    if (pow_x0[n] < kMinPower || pow_n0[n] < kMinPower) {
-      sols[n] = 1.f;
-    } else {
-      const float gamma0 = 0.5f * kRho * pow_x0[n] * pow_n0[n] +
-                           lambda * pow_x0[n] * pow_n0[n] * pow_n0[n];
-      const float beta0 =
-          lambda * pow_x0[n] * (2.f - kRho) * pow_x0[n] * pow_n0[n];
-      const float alpha0 =
-          lambda * pow_x0[n] * (1.f - kRho) * pow_x0[n] * pow_x0[n];
-      RTC_DCHECK_LT(alpha0, 0.f);
-      // The quadratic equation should always have real roots, but to guard
-      // against numerical errors we limit it to a minimum of zero.
-      sols[n] = std::max(
-          0.f, (-beta0 - std::sqrt(std::max(
-                             0.f, beta0 * beta0 - 4.f * alpha0 * gamma0))) /
-                   (2.f * alpha0));
-    }
-  }
-}
-
-bool IntelligibilityEnhancer::IsSpeech(const float* audio) {
-  FloatToS16(audio, chunk_length_, audio_s16_.data());
-  vad_.ProcessChunk(audio_s16_.data(), chunk_length_, sample_rate_hz_);
-  if (vad_.last_voice_probability() > kVoiceProbabilityThreshold) {
-    chunks_since_voice_ = 0;
-  } else if (chunks_since_voice_ < kSpeechOffsetDelay) {
-    ++chunks_since_voice_;
-  }
-  return chunks_since_voice_ < kSpeechOffsetDelay;
-}
-
-void IntelligibilityEnhancer::DelayHighBands(AudioBuffer* audio) {
-  RTC_DCHECK_EQ(audio->num_bands(), high_bands_buffers_.size() + 1);
-  for (size_t i = 0u; i < high_bands_buffers_.size(); ++i) {
-    Band band = static_cast<Band>(i + 1);
-    high_bands_buffers_[i]->Delay(audio->split_channels_f(band), chunk_length_);
-  }
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/intelligibility/intelligibility_enhancer.h b/modules/audio_processing/intelligibility/intelligibility_enhancer.h
deleted file mode 100644
index 8faf919..0000000
--- a/modules/audio_processing/intelligibility/intelligibility_enhancer.h
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
- *  Copyright (c) 2014 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_PROCESSING_INTELLIGIBILITY_INTELLIGIBILITY_ENHANCER_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_INTELLIGIBILITY_INTELLIGIBILITY_ENHANCER_H_
-
-#include <complex>
-#include <memory>
-#include <vector>
-
-#include "webrtc/common_audio/channel_buffer.h"
-#include "webrtc/common_audio/lapped_transform.h"
-#include "webrtc/modules/audio_processing/audio_buffer.h"
-#include "webrtc/modules/audio_processing/intelligibility/intelligibility_utils.h"
-#include "webrtc/modules/audio_processing/render_queue_item_verifier.h"
-#include "webrtc/modules/audio_processing/vad/voice_activity_detector.h"
-#include "webrtc/rtc_base/swap_queue.h"
-
-namespace webrtc {
-
-// Speech intelligibility enhancement module. Reads render and capture
-// audio streams and modifies the render stream with a set of gains per
-// frequency bin to enhance speech against the noise background.
-// Details of the model and algorithm can be found in the original paper:
-// http://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=6882788
-class IntelligibilityEnhancer : public LappedTransform::Callback {
- public:
-  IntelligibilityEnhancer(int sample_rate_hz,
-                          size_t num_render_channels,
-                          size_t num_bands,
-                          size_t num_noise_bins);
-
-  ~IntelligibilityEnhancer() override;
-
-  // Sets the capture noise magnitude spectrum estimate.
-  void SetCaptureNoiseEstimate(std::vector<float> noise, float gain);
-
-  // Reads chunk of speech in time domain and updates with modified signal.
-  void ProcessRenderAudio(AudioBuffer* audio);
-  bool active() const;
-
- protected:
-  // All in frequency domain, receives input |in_block|, applies
-  // intelligibility enhancement, and writes result to |out_block|.
-  void ProcessAudioBlock(const std::complex<float>* const* in_block,
-                         size_t in_channels,
-                         size_t frames,
-                         size_t out_channels,
-                         std::complex<float>* const* out_block) override;
-
- private:
-  FRIEND_TEST_ALL_PREFIXES(IntelligibilityEnhancerTest, TestRenderUpdate);
-  FRIEND_TEST_ALL_PREFIXES(IntelligibilityEnhancerTest, TestErbCreation);
-  FRIEND_TEST_ALL_PREFIXES(IntelligibilityEnhancerTest, TestSolveForGains);
-  FRIEND_TEST_ALL_PREFIXES(IntelligibilityEnhancerTest,
-                           TestNoiseGainHasExpectedResult);
-  FRIEND_TEST_ALL_PREFIXES(IntelligibilityEnhancerTest,
-                           TestAllBandsHaveSameDelay);
-
-  // Updates the SNR estimation and enables or disables this component using a
-  // hysteresis.
-  void SnrBasedEffectActivation();
-
-  // Bisection search for optimal |lambda|.
-  void SolveForLambda(float power_target);
-
-  // Transforms freq gains to ERB gains.
-  void UpdateErbGains();
-
-  // Returns number of ERB filters.
-  static size_t GetBankSize(int sample_rate, size_t erb_resolution);
-
-  // Initializes ERB filterbank.
-  std::vector<std::vector<float>> CreateErbBank(size_t num_freqs);
-
-  // Analytically solves quadratic for optimal gains given |lambda|.
-  // Negative gains are set to 0. Stores the results in |sols|.
-  void SolveForGainsGivenLambda(float lambda, size_t start_freq, float* sols);
-
-  // Returns true if the audio is speech.
-  bool IsSpeech(const float* audio);
-
-  // Delays the high bands to compensate for the processing delay in the low
-  // band.
-  void DelayHighBands(AudioBuffer* audio);
-
-  static const size_t kMaxNumNoiseEstimatesToBuffer = 5;
-
-  const size_t freqs_;         // Num frequencies in frequency domain.
-  const size_t num_noise_bins_;
-  const size_t chunk_length_;  // Chunk size in samples.
-  const size_t bank_size_;     // Num ERB filters.
-  const int sample_rate_hz_;
-  const size_t num_render_channels_;
-
-  intelligibility::PowerEstimator<std::complex<float>> clear_power_estimator_;
-  intelligibility::PowerEstimator<float> noise_power_estimator_;
-  std::vector<float> filtered_clear_pow_;
-  std::vector<float> filtered_noise_pow_;
-  std::vector<float> center_freqs_;
-  std::vector<std::vector<float>> capture_filter_bank_;
-  std::vector<std::vector<float>> render_filter_bank_;
-  size_t start_freq_;
-
-  std::vector<float> gains_eq_;  // Pre-filter modified gains.
-  intelligibility::GainApplier gain_applier_;
-
-  std::unique_ptr<LappedTransform> render_mangler_;
-
-  VoiceActivityDetector vad_;
-  std::vector<int16_t> audio_s16_;
-  size_t chunks_since_voice_;
-  bool is_speech_;
-  float snr_;
-  bool is_active_;
-
-  unsigned long int num_chunks_;
-  unsigned long int num_active_chunks_;
-
-  std::vector<float> noise_estimation_buffer_;
-  SwapQueue<std::vector<float>, RenderQueueItemVerifier<float>>
-      noise_estimation_queue_;
-
-  std::vector<std::unique_ptr<intelligibility::DelayBuffer>>
-      high_bands_buffers_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_INTELLIGIBILITY_INTELLIGIBILITY_ENHANCER_H_
diff --git a/modules/audio_processing/intelligibility/intelligibility_enhancer_unittest.cc b/modules/audio_processing/intelligibility/intelligibility_enhancer_unittest.cc
deleted file mode 100644
index 756b303..0000000
--- a/modules/audio_processing/intelligibility/intelligibility_enhancer_unittest.cc
+++ /dev/null
@@ -1,536 +0,0 @@
-/*
- *  Copyright (c) 2015 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 <math.h>
-#include <stdlib.h>
-
-#include <algorithm>
-#include <memory>
-#include <vector>
-
-#include "webrtc/api/array_view.h"
-#include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
-#include "webrtc/modules/audio_processing/audio_buffer.h"
-#include "webrtc/modules/audio_processing/intelligibility/intelligibility_enhancer.h"
-#include "webrtc/modules/audio_processing/noise_suppression_impl.h"
-#include "webrtc/modules/audio_processing/test/audio_buffer_tools.h"
-#include "webrtc/modules/audio_processing/test/bitexactness_tools.h"
-#include "webrtc/rtc_base/arraysize.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-namespace {
-
-// Target output for ERB create test. Generated with matlab.
-const float kTestCenterFreqs[] = {
-    14.5213f, 29.735f,  45.6781f, 62.3884f, 79.9058f, 98.2691f, 117.521f,
-    137.708f, 158.879f, 181.084f, 204.378f, 228.816f, 254.459f, 281.371f,
-    309.618f, 339.273f, 370.411f, 403.115f, 437.469f, 473.564f, 511.497f,
-    551.371f, 593.293f, 637.386f, 683.77f,  732.581f, 783.96f,  838.06f,
-    895.046f, 955.09f,  1018.38f, 1085.13f, 1155.54f, 1229.85f, 1308.32f,
-    1391.22f, 1478.83f, 1571.5f,  1669.55f, 1773.37f, 1883.37f, 2000.f};
-const float kTestFilterBank[][33] = {
-    {0.2f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f,
-     0.f,  0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f,
-     0.f,  0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f},
-    {0.2f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f,
-     0.f,  0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f,
-     0.f,  0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f},
-    {0.2f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f,
-     0.f,  0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f,
-     0.f,  0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f},
-    {0.2f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f,
-     0.f,  0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f,
-     0.f,  0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f},
-    {0.2f, 0.25f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f,
-     0.f,  0.f,   0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f,
-     0.f,  0.f,   0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f},
-    {0.f, 0.25f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f,
-     0.f, 0.f,   0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f,
-     0.f, 0.f,   0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f},
-    {0.f, 0.25f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f,
-     0.f, 0.f,   0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f,
-     0.f, 0.f,   0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f},
-    {0.f, 0.25f, 0.25f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f,
-     0.f, 0.f,   0.f,   0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f,
-     0.f, 0.f,   0.f,   0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f},
-    {0.f, 0.f, 0.25f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f,
-     0.f, 0.f, 0.f,   0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f,
-     0.f, 0.f, 0.f,   0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f},
-    {0.f, 0.f, 0.25f, 0.142857f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f,
-     0.f, 0.f, 0.f,   0.f,       0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f,
-     0.f, 0.f, 0.f,   0.f,       0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f},
-    {0.f, 0.f, 0.25f, 0.285714f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f,
-     0.f, 0.f, 0.f,   0.f,       0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f,
-     0.f, 0.f, 0.f,   0.f,       0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f},
-    {0.f, 0.f, 0.f, 0.285714f, 0.142857f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f,
-     0.f, 0.f, 0.f, 0.f,       0.f,       0.f, 0.f, 0.f, 0.f, 0.f, 0.f,
-     0.f, 0.f, 0.f, 0.f,       0.f,       0.f, 0.f, 0.f, 0.f, 0.f, 0.f},
-    {0.f, 0.f, 0.f, 0.285714f, 0.285714f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f,
-     0.f, 0.f, 0.f, 0.f,       0.f,       0.f, 0.f, 0.f, 0.f, 0.f, 0.f,
-     0.f, 0.f, 0.f, 0.f,       0.f,       0.f, 0.f, 0.f, 0.f, 0.f, 0.f},
-    {0.f, 0.f, 0.f, 0.f, 0.285714f, 0.142857f, 0.f, 0.f, 0.f, 0.f, 0.f,
-     0.f, 0.f, 0.f, 0.f, 0.f,       0.f,       0.f, 0.f, 0.f, 0.f, 0.f,
-     0.f, 0.f, 0.f, 0.f, 0.f,       0.f,       0.f, 0.f, 0.f, 0.f, 0.f},
-    {0.f, 0.f, 0.f, 0.f, 0.285714f, 0.285714f, 0.f, 0.f, 0.f, 0.f, 0.f,
-     0.f, 0.f, 0.f, 0.f, 0.f,       0.f,       0.f, 0.f, 0.f, 0.f, 0.f,
-     0.f, 0.f, 0.f, 0.f, 0.f,       0.f,       0.f, 0.f, 0.f, 0.f, 0.f},
-    {0.f, 0.f, 0.f, 0.f, 0.f, 0.285714f, 0.142857f, 0.f, 0.f, 0.f, 0.f,
-     0.f, 0.f, 0.f, 0.f, 0.f, 0.f,       0.f,       0.f, 0.f, 0.f, 0.f,
-     0.f, 0.f, 0.f, 0.f, 0.f, 0.f,       0.f,       0.f, 0.f, 0.f, 0.f},
-    {0.f, 0.f, 0.f, 0.f, 0.f, 0.285714f, 0.285714f, 0.f, 0.f, 0.f, 0.f,
-     0.f, 0.f, 0.f, 0.f, 0.f, 0.f,       0.f,       0.f, 0.f, 0.f, 0.f,
-     0.f, 0.f, 0.f, 0.f, 0.f, 0.f,       0.f,       0.f, 0.f, 0.f, 0.f},
-    {0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.285714f, 0.142857f, 0.f, 0.f, 0.f,
-     0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f,       0.f,       0.f, 0.f, 0.f,
-     0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f,       0.f,       0.f, 0.f, 0.f},
-    {0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.285714f, 0.285714f, 0.157895f, 0.f, 0.f,
-     0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f,       0.f,       0.f,       0.f, 0.f,
-     0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f,       0.f,       0.f,       0.f, 0.f},
-    {0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.285714f, 0.210526f, 0.117647f, 0.f,
-     0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f,       0.f,       0.f,       0.f,
-     0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f,       0.f,       0.f,       0.f},
-    {0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.285714f, 0.315789f, 0.176471f, 0.f,
-     0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f,       0.f,       0.f,       0.f,
-     0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f,       0.f,       0.f,       0.f},
-    {0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.315789f, 0.352941f, 0.142857f,
-     0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f,       0.f,       0.f,
-     0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f,       0.f,       0.f},
-    {0.f,       0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.352941f, 0.285714f,
-     0.157895f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f,       0.f,
-     0.f,       0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f,       0.f},
-    {0.f,       0.f,       0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.285714f,
-     0.210526f, 0.111111f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f,
-     0.f,       0.f,       0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f},
-    {0.f, 0.f,       0.f,       0.f,       0.f,       0.f, 0.f, 0.f, 0.f,
-     0.f, 0.285714f, 0.315789f, 0.222222f, 0.111111f, 0.f, 0.f, 0.f, 0.f,
-     0.f, 0.f,       0.f,       0.f,       0.f,       0.f, 0.f, 0.f, 0.f,
-     0.f, 0.f,       0.f,       0.f,       0.f,       0.f},
-    {0.f, 0.f, 0.f,       0.f,       0.f,       0.f,       0.f, 0.f, 0.f,
-     0.f, 0.f, 0.315789f, 0.333333f, 0.222222f, 0.111111f, 0.f, 0.f, 0.f,
-     0.f, 0.f, 0.f,       0.f,       0.f,       0.f,       0.f, 0.f, 0.f,
-     0.f, 0.f, 0.f,       0.f,       0.f,       0.f},
-    {0.f, 0.f, 0.f, 0.f,       0.f,       0.f,       0.f,       0.f, 0.f,
-     0.f, 0.f, 0.f, 0.333333f, 0.333333f, 0.222222f, 0.111111f, 0.f, 0.f,
-     0.f, 0.f, 0.f, 0.f,       0.f,       0.f,       0.f,       0.f, 0.f,
-     0.f, 0.f, 0.f, 0.f,       0.f,       0.f},
-    {0.f, 0.f, 0.f, 0.f, 0.f,       0.f,       0.f,       0.f,       0.f,
-     0.f, 0.f, 0.f, 0.f, 0.333333f, 0.333333f, 0.222222f, 0.111111f, 0.f,
-     0.f, 0.f, 0.f, 0.f, 0.f,       0.f,       0.f,       0.f,       0.f,
-     0.f, 0.f, 0.f, 0.f, 0.f,       0.f},
-    {0.f, 0.f, 0.f, 0.f, 0.f, 0.f,       0.f,       0.f,       0.f,
-     0.f, 0.f, 0.f, 0.f, 0.f, 0.333333f, 0.333333f, 0.222222f, 0.111111f,
-     0.f, 0.f, 0.f, 0.f, 0.f, 0.f,       0.f,       0.f,       0.f,
-     0.f, 0.f, 0.f, 0.f, 0.f, 0.f},
-    {0.f,       0.f, 0.f, 0.f, 0.f, 0.f, 0.f,       0.f,       0.f,
-     0.f,       0.f, 0.f, 0.f, 0.f, 0.f, 0.333333f, 0.333333f, 0.222222f,
-     0.108108f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f,       0.f,       0.f,
-     0.f,       0.f, 0.f, 0.f, 0.f, 0.f},
-    {0.f,       0.f,       0.f,        0.f, 0.f, 0.f, 0.f, 0.f,       0.f,
-     0.f,       0.f,       0.f,        0.f, 0.f, 0.f, 0.f, 0.333333f, 0.333333f,
-     0.243243f, 0.153846f, 0.0833333f, 0.f, 0.f, 0.f, 0.f, 0.f,       0.f,
-     0.f,       0.f,       0.f,        0.f, 0.f, 0.f},
-    {0.f,       0.f,       0.f,       0.f,        0.f, 0.f, 0.f, 0.f, 0.f,
-     0.f,       0.f,       0.f,       0.f,        0.f, 0.f, 0.f, 0.f, 0.333333f,
-     0.324324f, 0.230769f, 0.166667f, 0.0909091f, 0.f, 0.f, 0.f, 0.f, 0.f,
-     0.f,       0.f,       0.f,       0.f,        0.f, 0.f},
-    {0.f,       0.f,       0.f,   0.f,       0.f,        0.f, 0.f, 0.f, 0.f,
-     0.f,       0.f,       0.f,   0.f,       0.f,        0.f, 0.f, 0.f, 0.f,
-     0.324324f, 0.307692f, 0.25f, 0.181818f, 0.0833333f, 0.f, 0.f, 0.f, 0.f,
-     0.f,       0.f,       0.f,   0.f,       0.f,        0.f},
-    {0.f,       0.f,   0.f,       0.f,        0.f, 0.f,       0.f,
-     0.f,       0.f,   0.f,       0.f,        0.f, 0.f,       0.f,
-     0.f,       0.f,   0.f,       0.f,        0.f, 0.307692f, 0.333333f,
-     0.363636f, 0.25f, 0.151515f, 0.0793651f, 0.f, 0.f,       0.f,
-     0.f,       0.f,   0.f,       0.f,        0.f},
-    {0.f,       0.f,       0.f,        0.f,       0.f,       0.f,
-     0.f,       0.f,       0.f,        0.f,       0.f,       0.f,
-     0.f,       0.f,       0.f,        0.f,       0.f,       0.f,
-     0.f,       0.f,       0.166667f,  0.363636f, 0.333333f, 0.242424f,
-     0.190476f, 0.133333f, 0.0689655f, 0.f,       0.f,       0.f,
-     0.f,       0.f,       0.f},
-    {0.f,        0.f, 0.f, 0.f, 0.f,       0.f,      0.f,       0.f,  0.f,
-     0.f,        0.f, 0.f, 0.f, 0.f,       0.f,      0.f,       0.f,  0.f,
-     0.f,        0.f, 0.f, 0.f, 0.333333f, 0.30303f, 0.253968f, 0.2f, 0.137931f,
-     0.0714286f, 0.f, 0.f, 0.f, 0.f,       0.f},
-    {0.f,    0.f,        0.f,      0.f,      0.f,       0.f,       0.f,
-     0.f,    0.f,        0.f,      0.f,      0.f,       0.f,       0.f,
-     0.f,    0.f,        0.f,      0.f,      0.f,       0.f,       0.f,
-     0.f,    0.f,        0.30303f, 0.31746f, 0.333333f, 0.275862f, 0.214286f,
-     0.125f, 0.0655738f, 0.f,      0.f,      0.f},
-    {0.f,   0.f,       0.f,       0.f,        0.f,       0.f,       0.f,
-     0.f,   0.f,       0.f,       0.f,        0.f,       0.f,       0.f,
-     0.f,   0.f,       0.f,       0.f,        0.f,       0.f,       0.f,
-     0.f,   0.f,       0.f,       0.15873f,   0.333333f, 0.344828f, 0.357143f,
-     0.25f, 0.196721f, 0.137931f, 0.0816327f, 0.f},
-    {0.f,     0.f,       0.f,       0.f,       0.f, 0.f,       0.f,
-     0.f,     0.f,       0.f,       0.f,       0.f, 0.f,       0.f,
-     0.f,     0.f,       0.f,       0.f,       0.f, 0.f,       0.f,
-     0.f,     0.f,       0.f,       0.f,       0.f, 0.172414f, 0.357143f,
-     0.3125f, 0.245902f, 0.172414f, 0.102041f, 0.f},
-    {0.f, 0.f,     0.f,       0.f,       0.f,       0.f, 0.f, 0.f, 0.f,
-     0.f, 0.f,     0.f,       0.f,       0.f,       0.f, 0.f, 0.f, 0.f,
-     0.f, 0.f,     0.f,       0.f,       0.f,       0.f, 0.f, 0.f, 0.f,
-     0.f, 0.3125f, 0.327869f, 0.344828f, 0.204082f, 0.f},
-    {0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f,       0.f,       0.f,       0.f,
-     0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f,       0.f,       0.f,       0.f,
-     0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.163934f, 0.344828f, 0.408163f, 0.5f},
-    {0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f,       0.f,
-     0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f,       0.f,
-     0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.204082f, 0.5f}};
-static_assert(arraysize(kTestCenterFreqs) == arraysize(kTestFilterBank),
-              "Test filterbank badly initialized.");
-
-// Target output for gain solving test. Generated with matlab.
-const size_t kTestStartFreq = 12;  // Lowest integral frequency for ERBs.
-const float kTestZeroVar = 1.f;
-const float kTestNonZeroVarLambdaTop[] = {
-    1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 0.f, 0.f,
-    0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f,
-    0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f};
-static_assert(arraysize(kTestCenterFreqs) ==
-                  arraysize(kTestNonZeroVarLambdaTop),
-              "Power test data badly initialized.");
-const float kMaxTestError = 0.005f;
-
-// Enhancer initialization parameters.
-const int kSamples = 10000;
-const int kSampleRate = 4000;
-const int kNumChannels = 1;
-const int kFragmentSize = kSampleRate / 100;
-const size_t kNumNoiseBins = 129;
-const size_t kNumBands = 1;
-
-// Number of frames to process in the bitexactness tests.
-const size_t kNumFramesToProcess = 1000;
-
-int IntelligibilityEnhancerSampleRate(int sample_rate_hz) {
-  return (sample_rate_hz > AudioProcessing::kSampleRate16kHz
-              ? AudioProcessing::kSampleRate16kHz
-              : sample_rate_hz);
-}
-
-// Process one frame of data and produce the output.
-void ProcessOneFrame(int sample_rate_hz,
-                     AudioBuffer* render_audio_buffer,
-                     AudioBuffer* capture_audio_buffer,
-                     NoiseSuppressionImpl* noise_suppressor,
-                     IntelligibilityEnhancer* intelligibility_enhancer) {
-  if (sample_rate_hz > AudioProcessing::kSampleRate16kHz) {
-    render_audio_buffer->SplitIntoFrequencyBands();
-    capture_audio_buffer->SplitIntoFrequencyBands();
-  }
-
-  intelligibility_enhancer->ProcessRenderAudio(render_audio_buffer);
-
-  noise_suppressor->AnalyzeCaptureAudio(capture_audio_buffer);
-  noise_suppressor->ProcessCaptureAudio(capture_audio_buffer);
-
-  intelligibility_enhancer->SetCaptureNoiseEstimate(
-      noise_suppressor->NoiseEstimate(), 0);
-
-  if (sample_rate_hz > AudioProcessing::kSampleRate16kHz) {
-    render_audio_buffer->MergeFrequencyBands();
-  }
-}
-
-// Processes a specified amount of frames, verifies the results and reports
-// any errors.
-void RunBitexactnessTest(int sample_rate_hz,
-                         size_t num_channels,
-                         rtc::ArrayView<const float> output_reference) {
-  const StreamConfig render_config(sample_rate_hz, num_channels, false);
-  AudioBuffer render_buffer(
-      render_config.num_frames(), render_config.num_channels(),
-      render_config.num_frames(), render_config.num_channels(),
-      render_config.num_frames());
-  test::InputAudioFile render_file(
-      test::GetApmRenderTestVectorFileName(sample_rate_hz));
-  std::vector<float> render_input(render_buffer.num_frames() *
-                                  render_buffer.num_channels());
-
-  const StreamConfig capture_config(sample_rate_hz, num_channels, false);
-  AudioBuffer capture_buffer(
-      capture_config.num_frames(), capture_config.num_channels(),
-      capture_config.num_frames(), capture_config.num_channels(),
-      capture_config.num_frames());
-  test::InputAudioFile capture_file(
-      test::GetApmCaptureTestVectorFileName(sample_rate_hz));
-  std::vector<float> capture_input(render_buffer.num_frames() *
-                                   capture_buffer.num_channels());
-
-  rtc::CriticalSection crit_capture;
-  NoiseSuppressionImpl noise_suppressor(&crit_capture);
-  noise_suppressor.Initialize(capture_config.num_channels(), sample_rate_hz);
-  noise_suppressor.Enable(true);
-
-  IntelligibilityEnhancer intelligibility_enhancer(
-      IntelligibilityEnhancerSampleRate(sample_rate_hz),
-      render_config.num_channels(), kNumBands,
-      NoiseSuppressionImpl::num_noise_bins());
-
-  for (size_t frame_no = 0u; frame_no < kNumFramesToProcess; ++frame_no) {
-    ReadFloatSamplesFromStereoFile(render_buffer.num_frames(),
-                                   render_buffer.num_channels(), &render_file,
-                                   render_input);
-    ReadFloatSamplesFromStereoFile(capture_buffer.num_frames(),
-                                   capture_buffer.num_channels(), &capture_file,
-                                   capture_input);
-
-    test::CopyVectorToAudioBuffer(render_config, render_input, &render_buffer);
-    test::CopyVectorToAudioBuffer(capture_config, capture_input,
-                                  &capture_buffer);
-
-    ProcessOneFrame(sample_rate_hz, &render_buffer, &capture_buffer,
-                    &noise_suppressor, &intelligibility_enhancer);
-  }
-
-  // Extract and verify the test results.
-  std::vector<float> render_output;
-  test::ExtractVectorFromAudioBuffer(render_config, &render_buffer,
-                                     &render_output);
-
-  const float kElementErrorBound = 1.f / static_cast<float>(1 << 15);
-
-  // Compare the output with the reference. Only the first values of the output
-  // from last frame processed are compared in order not having to specify all
-  // preceeding frames as testvectors. As the algorithm being tested has a
-  // memory, testing only the last frame implicitly also tests the preceeding
-  // frames.
-  EXPECT_TRUE(test::VerifyDeinterleavedArray(
-      render_buffer.num_frames(), render_config.num_channels(),
-      output_reference, render_output, kElementErrorBound));
-}
-
-float float_rand() {
-  return std::rand() * 2.f / RAND_MAX - 1;
-}
-
-}  // namespace
-
-class IntelligibilityEnhancerTest : public ::testing::Test {
- protected:
-  IntelligibilityEnhancerTest()
-      : clear_buffer_(kFragmentSize,
-                      kNumChannels,
-                      kFragmentSize,
-                      kNumChannels,
-                      kFragmentSize),
-        stream_config_(kSampleRate, kNumChannels),
-        clear_data_(kSamples),
-        noise_data_(kNumNoiseBins),
-        orig_data_(kSamples) {
-    std::srand(1);
-    enh_.reset(new IntelligibilityEnhancer(kSampleRate, kNumChannels, kNumBands,
-                                           kNumNoiseBins));
-  }
-
-  bool CheckUpdate() {
-    enh_.reset(new IntelligibilityEnhancer(kSampleRate, kNumChannels, kNumBands,
-                                           kNumNoiseBins));
-    float* clear_cursor = clear_data_.data();
-    for (int i = 0; i < kSamples; i += kFragmentSize) {
-      enh_->SetCaptureNoiseEstimate(noise_data_, 1);
-      clear_buffer_.CopyFrom(&clear_cursor, stream_config_);
-      enh_->ProcessRenderAudio(&clear_buffer_);
-      clear_buffer_.CopyTo(stream_config_, &clear_cursor);
-      clear_cursor += kFragmentSize;
-    }
-    for (int i = initial_delay_; i < kSamples; i++) {
-      if (std::fabs(clear_data_[i] - orig_data_[i - initial_delay_]) >
-          kMaxTestError) {
-        return true;
-      }
-    }
-    return false;
-  }
-
-  std::unique_ptr<IntelligibilityEnhancer> enh_;
-  // Render clean speech buffer.
-  AudioBuffer clear_buffer_;
-  StreamConfig stream_config_;
-  std::vector<float> clear_data_;
-  std::vector<float> noise_data_;
-  std::vector<float> orig_data_;
-  size_t initial_delay_;
-};
-
-// For each class of generated data, tests that render stream is updated when
-// it should be.
-TEST_F(IntelligibilityEnhancerTest, TestRenderUpdate) {
-  initial_delay_ = enh_->render_mangler_->initial_delay();
-  std::fill(noise_data_.begin(), noise_data_.end(), 0.f);
-  std::fill(orig_data_.begin(), orig_data_.end(), 0.f);
-  std::fill(clear_data_.begin(), clear_data_.end(), 0.f);
-  EXPECT_FALSE(CheckUpdate());
-  std::generate(clear_data_.begin(), clear_data_.end(), float_rand);
-  orig_data_ = clear_data_;
-  EXPECT_FALSE(CheckUpdate());
-  std::generate(clear_data_.begin(), clear_data_.end(), float_rand);
-  orig_data_ = clear_data_;
-  std::generate(noise_data_.begin(), noise_data_.end(), float_rand);
-  FloatToFloatS16(noise_data_.data(), noise_data_.size(), noise_data_.data());
-  EXPECT_TRUE(CheckUpdate());
-}
-
-// Tests ERB bank creation, comparing against matlab output.
-TEST_F(IntelligibilityEnhancerTest, TestErbCreation) {
-  ASSERT_EQ(arraysize(kTestCenterFreqs), enh_->bank_size_);
-  for (size_t i = 0; i < enh_->bank_size_; ++i) {
-    EXPECT_NEAR(kTestCenterFreqs[i], enh_->center_freqs_[i], kMaxTestError);
-    ASSERT_EQ(arraysize(kTestFilterBank[0]), enh_->freqs_);
-    for (size_t j = 0; j < enh_->freqs_; ++j) {
-      EXPECT_NEAR(kTestFilterBank[i][j], enh_->render_filter_bank_[i][j],
-                  kMaxTestError);
-    }
-  }
-}
-
-// Tests analytic solution for optimal gains, comparing
-// against matlab output.
-TEST_F(IntelligibilityEnhancerTest, TestSolveForGains) {
-  ASSERT_EQ(kTestStartFreq, enh_->start_freq_);
-  std::vector<float> sols(enh_->bank_size_);
-  float lambda = -0.001f;
-  for (size_t i = 0; i < enh_->bank_size_; i++) {
-    enh_->filtered_clear_pow_[i] = 0.f;
-    enh_->filtered_noise_pow_[i] = 0.f;
-  }
-  enh_->SolveForGainsGivenLambda(lambda, enh_->start_freq_, sols.data());
-  for (size_t i = 0; i < enh_->bank_size_; i++) {
-    EXPECT_NEAR(kTestZeroVar, sols[i], kMaxTestError);
-  }
-  for (size_t i = 0; i < enh_->bank_size_; i++) {
-    enh_->filtered_clear_pow_[i] = static_cast<float>(i + 1);
-    enh_->filtered_noise_pow_[i] = static_cast<float>(enh_->bank_size_ - i);
-  }
-  enh_->SolveForGainsGivenLambda(lambda, enh_->start_freq_, sols.data());
-  for (size_t i = 0; i < enh_->bank_size_; i++) {
-    EXPECT_NEAR(kTestNonZeroVarLambdaTop[i], sols[i], kMaxTestError);
-  }
-  lambda = -1.f;
-  enh_->SolveForGainsGivenLambda(lambda, enh_->start_freq_, sols.data());
-  for (size_t i = 0; i < enh_->bank_size_; i++) {
-    EXPECT_NEAR(kTestNonZeroVarLambdaTop[i], sols[i], kMaxTestError);
-  }
-}
-
-TEST_F(IntelligibilityEnhancerTest, TestNoiseGainHasExpectedResult) {
-  const float kGain = 2.f;
-  const float kTolerance = 0.007f;
-  std::vector<float> noise(kNumNoiseBins);
-  std::vector<float> noise_psd(kNumNoiseBins);
-  std::generate(noise.begin(), noise.end(), float_rand);
-  for (size_t i = 0; i < kNumNoiseBins; ++i) {
-    noise_psd[i] = kGain * kGain * noise[i] * noise[i];
-  }
-  float* clear_cursor = clear_data_.data();
-  for (size_t i = 0; i < kNumFramesToProcess; ++i) {
-    enh_->SetCaptureNoiseEstimate(noise, kGain);
-    clear_buffer_.CopyFrom(&clear_cursor, stream_config_);
-    enh_->ProcessRenderAudio(&clear_buffer_);
-  }
-  const std::vector<float>& estimated_psd =
-      enh_->noise_power_estimator_.power();
-  for (size_t i = 0; i < kNumNoiseBins; ++i) {
-    EXPECT_LT(std::abs(estimated_psd[i] - noise_psd[i]) / noise_psd[i],
-              kTolerance);
-  }
-}
-
-TEST_F(IntelligibilityEnhancerTest, TestAllBandsHaveSameDelay) {
-  const int kTestSampleRate = AudioProcessing::kSampleRate32kHz;
-  const int kTestSplitRate = AudioProcessing::kSampleRate16kHz;
-  const size_t kTestNumBands =
-      rtc::CheckedDivExact(kTestSampleRate, kTestSplitRate);
-  const size_t kTestFragmentSize = rtc::CheckedDivExact(kTestSampleRate, 100);
-  const size_t kTestSplitFragmentSize =
-      rtc::CheckedDivExact(kTestSplitRate, 100);
-  enh_.reset(new IntelligibilityEnhancer(kTestSplitRate, kNumChannels,
-                                         kTestNumBands, kNumNoiseBins));
-  size_t initial_delay = enh_->render_mangler_->initial_delay();
-  std::vector<float> rand_gen_buf(kTestFragmentSize);
-  AudioBuffer original_buffer(kTestFragmentSize, kNumChannels,
-                              kTestFragmentSize, kNumChannels,
-                              kTestFragmentSize);
-  AudioBuffer audio_buffer(kTestFragmentSize, kNumChannels, kTestFragmentSize,
-                           kNumChannels, kTestFragmentSize);
-  for (size_t i = 0u; i < kTestNumBands; ++i) {
-    std::generate(rand_gen_buf.begin(), rand_gen_buf.end(), float_rand);
-    original_buffer.split_data_f()->SetDataForTesting(rand_gen_buf.data(),
-                                                      rand_gen_buf.size());
-    audio_buffer.split_data_f()->SetDataForTesting(rand_gen_buf.data(),
-                                                   rand_gen_buf.size());
-  }
-  enh_->ProcessRenderAudio(&audio_buffer);
-  for (size_t i = 0u; i < kTestNumBands; ++i) {
-    const float* original_ptr = original_buffer.split_bands_const_f(0)[i];
-    const float* audio_ptr = audio_buffer.split_bands_const_f(0)[i];
-    for (size_t j = initial_delay; j < kTestSplitFragmentSize; ++j) {
-      EXPECT_LT(std::fabs(original_ptr[j - initial_delay] - audio_ptr[j]),
-                kMaxTestError);
-    }
-  }
-}
-
-TEST(IntelligibilityEnhancerBitExactnessTest, DISABLED_Mono8kHz) {
-  const float kOutputReference[] = {-0.001892f, -0.003296f, -0.001953f};
-
-  RunBitexactnessTest(AudioProcessing::kSampleRate8kHz, 1, kOutputReference);
-}
-
-TEST(IntelligibilityEnhancerBitExactnessTest, DISABLED_Mono16kHz) {
-  const float kOutputReference[] = {-0.000977f, -0.003296f, -0.002441f};
-
-  RunBitexactnessTest(AudioProcessing::kSampleRate16kHz, 1, kOutputReference);
-}
-
-TEST(IntelligibilityEnhancerBitExactnessTest, DISABLED_Mono32kHz) {
-  const float kOutputReference[] = {0.003021f, -0.011780f, -0.008209f};
-
-  RunBitexactnessTest(AudioProcessing::kSampleRate32kHz, 1, kOutputReference);
-}
-
-TEST(IntelligibilityEnhancerBitExactnessTest, DISABLED_Mono48kHz) {
-  const float kOutputReference[] = {-0.027696f, -0.026253f, -0.018001f};
-
-  RunBitexactnessTest(AudioProcessing::kSampleRate48kHz, 1, kOutputReference);
-}
-
-TEST(IntelligibilityEnhancerBitExactnessTest, DISABLED_Stereo8kHz) {
-  const float kOutputReference[] = {0.021454f,  0.035919f, 0.026428f,
-                                    -0.000641f, 0.000366f, 0.000641f};
-
-  RunBitexactnessTest(AudioProcessing::kSampleRate8kHz, 2, kOutputReference);
-}
-
-TEST(IntelligibilityEnhancerBitExactnessTest, DISABLED_Stereo16kHz) {
-  const float kOutputReference[] = {0.021362f,  0.035736f,  0.023895f,
-                                    -0.001404f, -0.001465f, 0.000549f};
-
-  RunBitexactnessTest(AudioProcessing::kSampleRate16kHz, 2, kOutputReference);
-}
-
-TEST(IntelligibilityEnhancerBitExactnessTest, DISABLED_Stereo32kHz) {
-  const float kOutputReference[] = {0.030641f,  0.027406f,  0.028321f,
-                                    -0.001343f, -0.004578f, 0.000977f};
-
-  RunBitexactnessTest(AudioProcessing::kSampleRate32kHz, 2, kOutputReference);
-}
-
-TEST(IntelligibilityEnhancerBitExactnessTest, DISABLED_Stereo48kHz) {
-  const float kOutputReference[] = {-0.009276f, -0.001601f, -0.008255f,
-                                    -0.012975f, -0.015940f, -0.017820f};
-
-  RunBitexactnessTest(AudioProcessing::kSampleRate48kHz, 2, kOutputReference);
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/intelligibility/intelligibility_utils.cc b/modules/audio_processing/intelligibility/intelligibility_utils.cc
deleted file mode 100644
index 3e6c93e..0000000
--- a/modules/audio_processing/intelligibility/intelligibility_utils.cc
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- *  Copyright (c) 2014 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_processing/intelligibility/intelligibility_utils.h"
-
-#include <math.h>
-#include <stdlib.h>
-#include <string.h>
-#include <algorithm>
-#include <limits>
-
-#include "webrtc/rtc_base/safe_minmax.h"
-
-namespace webrtc {
-
-namespace intelligibility {
-
-namespace {
-
-const float kMinFactor = 0.01f;
-const float kMaxFactor = 100.f;
-
-// Return |current| changed towards |target|, with the relative change being at
-// most |limit|.
-float UpdateFactor(float target, float current, float limit) {
-  const float gain = target / (current + std::numeric_limits<float>::epsilon());
-  const float clamped_gain = rtc::SafeClamp(gain, 1 - limit, 1 + limit);
-  return rtc::SafeClamp(current * clamped_gain, kMinFactor, kMaxFactor);
-}
-
-}  // namespace
-
-template<typename T>
-PowerEstimator<T>::PowerEstimator(size_t num_freqs, float decay)
-    : power_(num_freqs, 0.f), decay_(decay) {}
-
-template<typename T>
-void PowerEstimator<T>::Step(const T* data) {
-  for (size_t i = 0; i < power_.size(); ++i) {
-    power_[i] = decay_ * power_[i] +
-                (1.f - decay_) * std::abs(data[i]) * std::abs(data[i]);
-  }
-}
-
-template class PowerEstimator<float>;
-template class PowerEstimator<std::complex<float>>;
-
-GainApplier::GainApplier(size_t freqs, float relative_change_limit)
-    : num_freqs_(freqs),
-      relative_change_limit_(relative_change_limit),
-      target_(freqs, 1.f),
-      current_(freqs, 1.f) {}
-
-GainApplier::~GainApplier() {}
-
-void GainApplier::Apply(const std::complex<float>* in_block,
-                        std::complex<float>* out_block) {
-  for (size_t i = 0; i < num_freqs_; ++i) {
-    current_[i] = UpdateFactor(target_[i], current_[i], relative_change_limit_);
-    out_block[i] = sqrtf(fabsf(current_[i])) * in_block[i];
-  }
-}
-
-DelayBuffer::DelayBuffer(size_t delay, size_t num_channels)
-    : buffer_(num_channels, std::vector<float>(delay, 0.f)), read_index_(0u) {}
-
-DelayBuffer::~DelayBuffer() {}
-
-void DelayBuffer::Delay(float* const* data, size_t length) {
-  size_t sample_index = read_index_;
-  for (size_t i = 0u; i < buffer_.size(); ++i) {
-    sample_index = read_index_;
-    for (size_t j = 0u; j < length; ++j) {
-      float swap = data[i][j];
-      data[i][j] = buffer_[i][sample_index];
-      buffer_[i][sample_index] = swap;
-      if (++sample_index == buffer_.size()) {
-        sample_index = 0u;
-      }
-    }
-  }
-  read_index_ = sample_index;
-}
-
-}  // namespace intelligibility
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/intelligibility/intelligibility_utils.h b/modules/audio_processing/intelligibility/intelligibility_utils.h
deleted file mode 100644
index 2566616..0000000
--- a/modules/audio_processing/intelligibility/intelligibility_utils.h
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- *  Copyright (c) 2014 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_PROCESSING_INTELLIGIBILITY_INTELLIGIBILITY_UTILS_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_INTELLIGIBILITY_INTELLIGIBILITY_UTILS_H_
-
-#include <complex>
-#include <vector>
-
-namespace webrtc {
-
-namespace intelligibility {
-
-// Internal helper for computing the power of a stream of arrays.
-// The result is an array of power per position: the i-th power is the power of
-// the stream of data on the i-th positions in the input arrays.
-template <typename T>
-class PowerEstimator {
- public:
-  // Construct an instance for the given input array length (|freqs|), with the
-  // appropriate parameters. |decay| is the forgetting factor.
-  PowerEstimator(size_t freqs, float decay);
-
-  // Add a new data point to the series.
-  void Step(const T* data);
-
-  // The current power array.
-  const std::vector<float>& power() { return power_; };
-
- private:
-  // The current power array.
-  std::vector<float> power_;
-
-  const float decay_;
-};
-
-// Helper class for smoothing gain changes. On each application step, the
-// currently used gains are changed towards a set of settable target gains,
-// constrained by a limit on the relative changes.
-class GainApplier {
- public:
-  GainApplier(size_t freqs, float relative_change_limit);
-
-  ~GainApplier();
-
-  // Copy |in_block| to |out_block|, multiplied by the current set of gains,
-  // and step the current set of gains towards the target set.
-  void Apply(const std::complex<float>* in_block,
-             std::complex<float>* out_block);
-
-  // Return the current target gain set. Modify this array to set the targets.
-  float* target() { return target_.data(); }
-
- private:
-  const size_t num_freqs_;
-  const float relative_change_limit_;
-  std::vector<float> target_;
-  std::vector<float> current_;
-};
-
-// Helper class to delay a signal by an integer number of samples.
-class DelayBuffer {
- public:
-  DelayBuffer(size_t delay, size_t num_channels);
-
-  ~DelayBuffer();
-
-  void Delay(float* const* data, size_t length);
-
- private:
-  std::vector<std::vector<float>> buffer_;
-  size_t read_index_;
-};
-
-}  // namespace intelligibility
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_INTELLIGIBILITY_INTELLIGIBILITY_UTILS_H_
diff --git a/modules/audio_processing/intelligibility/intelligibility_utils_unittest.cc b/modules/audio_processing/intelligibility/intelligibility_utils_unittest.cc
deleted file mode 100644
index 4687c92..0000000
--- a/modules/audio_processing/intelligibility/intelligibility_utils_unittest.cc
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- *  Copyright (c) 2015 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 <cmath>
-#include <complex>
-#include <vector>
-
-#include "webrtc/modules/audio_processing/intelligibility/intelligibility_utils.h"
-#include "webrtc/rtc_base/arraysize.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-namespace intelligibility {
-
-std::vector<std::vector<std::complex<float>>> GenerateTestData(size_t freqs,
-                                                               size_t samples) {
-  std::vector<std::vector<std::complex<float>>> data(samples);
-  for (size_t i = 0; i < samples; ++i) {
-    for (size_t j = 0; j < freqs; ++j) {
-      const float val = 0.99f / ((i + 1) * (j + 1));
-      data[i].push_back(std::complex<float>(val, val));
-    }
-  }
-  return data;
-}
-
-// Tests PowerEstimator, for all power step types.
-TEST(IntelligibilityUtilsTest, TestPowerEstimator) {
-  const size_t kFreqs = 10;
-  const size_t kSamples = 100;
-  const float kDecay = 0.5f;
-  const std::vector<std::vector<std::complex<float>>> test_data(
-      GenerateTestData(kFreqs, kSamples));
-  PowerEstimator<std::complex<float>> power_estimator(kFreqs, kDecay);
-  EXPECT_EQ(0, power_estimator.power()[0]);
-
-  // Makes sure Step is doing something.
-  power_estimator.Step(test_data[0].data());
-  for (size_t i = 1; i < kSamples; ++i) {
-    power_estimator.Step(test_data[i].data());
-    for (size_t j = 0; j < kFreqs; ++j) {
-      EXPECT_GE(power_estimator.power()[j], 0.f);
-      EXPECT_LE(power_estimator.power()[j], 1.f);
-    }
-  }
-}
-
-// Tests gain applier.
-TEST(IntelligibilityUtilsTest, TestGainApplier) {
-  const size_t kFreqs = 10;
-  const size_t kSamples = 100;
-  const float kChangeLimit = 0.1f;
-  GainApplier gain_applier(kFreqs, kChangeLimit);
-  const std::vector<std::vector<std::complex<float>>> in_data(
-      GenerateTestData(kFreqs, kSamples));
-  std::vector<std::vector<std::complex<float>>> out_data(
-      GenerateTestData(kFreqs, kSamples));
-  for (size_t i = 0; i < kSamples; ++i) {
-    gain_applier.Apply(in_data[i].data(), out_data[i].data());
-    for (size_t j = 0; j < kFreqs; ++j) {
-      EXPECT_GT(out_data[i][j].real(), 0.f);
-      EXPECT_LT(out_data[i][j].real(), 1.f);
-      EXPECT_GT(out_data[i][j].imag(), 0.f);
-      EXPECT_LT(out_data[i][j].imag(), 1.f);
-    }
-  }
-}
-
-}  // namespace intelligibility
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/intelligibility/test/intelligibility_proc.cc b/modules/audio_processing/intelligibility/test/intelligibility_proc.cc
deleted file mode 100644
index 6045e9f..0000000
--- a/modules/audio_processing/intelligibility/test/intelligibility_proc.cc
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- *  Copyright (c) 2014 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/common_audio/channel_buffer.h"
-#include "webrtc/common_audio/include/audio_util.h"
-#include "webrtc/common_audio/wav_file.h"
-#include "webrtc/modules/audio_processing/audio_buffer.h"
-#include "webrtc/modules/audio_processing/intelligibility/intelligibility_enhancer.h"
-#include "webrtc/modules/audio_processing/noise_suppression_impl.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/flags.h"
-
-using std::complex;
-
-namespace webrtc {
-namespace {
-
-DEFINE_string(clear_file, "speech.wav", "Input file with clear speech.");
-DEFINE_string(noise_file, "noise.wav", "Input file with noise data.");
-DEFINE_string(out_file, "proc_enhanced.wav", "Enhanced output file.");
-DEFINE_bool(help, false, "Print this message.");
-
-int int_main(int argc, char* argv[]) {
-  if (rtc::FlagList::SetFlagsFromCommandLine(&argc, argv, true)) {
-    return 1;
-  }
-  if (FLAG_help) {
-    rtc::FlagList::Print(nullptr, false);
-    return 0;
-  }
-  if (argc != 1) {
-    printf("\n\nInput files must be little-endian 16-bit signed raw PCM.\n");
-    return 0;
-  }
-
-  WavReader in_file(FLAG_clear_file);
-  WavReader noise_file(FLAG_noise_file);
-  WavWriter out_file(FLAG_out_file, in_file.sample_rate(),
-                     in_file.num_channels());
-  rtc::CriticalSection crit;
-  NoiseSuppressionImpl ns(&crit);
-  IntelligibilityEnhancer enh(in_file.sample_rate(), in_file.num_channels(), 1u,
-                              NoiseSuppressionImpl::num_noise_bins());
-  ns.Initialize(noise_file.num_channels(), noise_file.sample_rate());
-  ns.Enable(true);
-  const size_t in_samples = noise_file.sample_rate() / 100;
-  const size_t noise_samples = noise_file.sample_rate() / 100;
-  std::vector<float> in(in_samples * in_file.num_channels());
-  std::vector<float> noise(noise_samples * noise_file.num_channels());
-  ChannelBuffer<float> in_buf(in_samples, in_file.num_channels());
-  ChannelBuffer<float> noise_buf(noise_samples, noise_file.num_channels());
-  AudioBuffer capture_audio(noise_samples, noise_file.num_channels(),
-                            noise_samples, noise_file.num_channels(),
-                            noise_samples);
-  AudioBuffer render_audio(in_samples, in_file.num_channels(), in_samples,
-                           in_file.num_channels(), in_samples);
-  StreamConfig noise_config(noise_file.sample_rate(),
-                            noise_file.num_channels());
-  StreamConfig in_config(in_file.sample_rate(), in_file.num_channels());
-  while (in_file.ReadSamples(in.size(), in.data()) == in.size() &&
-         noise_file.ReadSamples(noise.size(), noise.data()) == noise.size()) {
-    FloatS16ToFloat(noise.data(), noise.size(), noise.data());
-    FloatS16ToFloat(in.data(), in.size(), in.data());
-    Deinterleave(in.data(), in_buf.num_frames(), in_buf.num_channels(),
-                 in_buf.channels());
-    Deinterleave(noise.data(), noise_buf.num_frames(), noise_buf.num_channels(),
-                 noise_buf.channels());
-    capture_audio.CopyFrom(noise_buf.channels(), noise_config);
-    render_audio.CopyFrom(in_buf.channels(), in_config);
-    ns.AnalyzeCaptureAudio(&capture_audio);
-    ns.ProcessCaptureAudio(&capture_audio);
-    enh.SetCaptureNoiseEstimate(ns.NoiseEstimate(), 1);
-    enh.ProcessRenderAudio(&render_audio);
-    render_audio.CopyTo(in_config, in_buf.channels());
-    Interleave(in_buf.channels(), in_buf.num_frames(), in_buf.num_channels(),
-               in.data());
-    FloatToFloatS16(in.data(), in.size(), in.data());
-    out_file.WriteSamples(in.data(), in.size());
-  }
-
-  return 0;
-}
-
-}  // namespace
-}  // namespace webrtc
-
-int main(int argc, char* argv[]) {
-  return webrtc::int_main(argc, argv);
-}
diff --git a/modules/audio_processing/level_controller/biquad_filter.cc b/modules/audio_processing/level_controller/biquad_filter.cc
deleted file mode 100644
index 9c4a4d2..0000000
--- a/modules/audio_processing/level_controller/biquad_filter.cc
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- *  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_processing/level_controller/biquad_filter.h"
-
-namespace webrtc {
-
-// This method applies a biquad filter to an input signal x to produce an
-// output signal y. The biquad coefficients are specified at the construction
-// of the object.
-void BiQuadFilter::Process(rtc::ArrayView<const float> x,
-                           rtc::ArrayView<float> y) {
-  for (size_t k = 0; k < x.size(); ++k) {
-    // Use temporary variable for x[k] to allow in-place function call
-    // (that x and y refer to the same array).
-    const float tmp = x[k];
-    y[k] = coefficients_.b[0] * tmp + coefficients_.b[1] * biquad_state_.b[0] +
-           coefficients_.b[2] * biquad_state_.b[1] -
-           coefficients_.a[0] * biquad_state_.a[0] -
-           coefficients_.a[1] * biquad_state_.a[1];
-    biquad_state_.b[1] = biquad_state_.b[0];
-    biquad_state_.b[0] = tmp;
-    biquad_state_.a[1] = biquad_state_.a[0];
-    biquad_state_.a[0] = y[k];
-  }
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/level_controller/biquad_filter.h b/modules/audio_processing/level_controller/biquad_filter.h
deleted file mode 100644
index 3a052a2..0000000
--- a/modules/audio_processing/level_controller/biquad_filter.h
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- *  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_PROCESSING_LEVEL_CONTROLLER_BIQUAD_FILTER_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_LEVEL_CONTROLLER_BIQUAD_FILTER_H_
-
-#include <vector>
-
-#include "webrtc/api/array_view.h"
-#include "webrtc/rtc_base/arraysize.h"
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace webrtc {
-
-class BiQuadFilter {
- public:
-  struct BiQuadCoefficients {
-    float b[3];
-    float a[2];
-  };
-
-  BiQuadFilter() = default;
-
-  void Initialize(const BiQuadCoefficients& coefficients) {
-    coefficients_ = coefficients;
-  }
-
-  // Produces a filtered output y of the input x. Both x and y need to
-  // have the same length.
-  void Process(rtc::ArrayView<const float> x, rtc::ArrayView<float> y);
-
- private:
-  struct BiQuadState {
-    BiQuadState() {
-      std::fill(b, b + arraysize(b), 0.f);
-      std::fill(a, a + arraysize(a), 0.f);
-    }
-
-    float b[2];
-    float a[2];
-  };
-
-  BiQuadState biquad_state_;
-  BiQuadCoefficients coefficients_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(BiQuadFilter);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_LEVEL_CONTROLLER_BIQUAD_FILTER_H_
diff --git a/modules/audio_processing/level_controller/down_sampler.cc b/modules/audio_processing/level_controller/down_sampler.cc
deleted file mode 100644
index 09da95b..0000000
--- a/modules/audio_processing/level_controller/down_sampler.cc
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- *  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_processing/level_controller/down_sampler.h"
-
-#include <string.h>
-#include <algorithm>
-#include <vector>
-
-#include "webrtc/modules/audio_processing/include/audio_processing.h"
-#include "webrtc/modules/audio_processing/level_controller/biquad_filter.h"
-#include "webrtc/modules/audio_processing/logging/apm_data_dumper.h"
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-namespace {
-
-// Bandlimiter coefficients computed based on that only
-// the first 40 bins of the spectrum for the downsampled
-// signal are used.
-// [B,A] = butter(2,(41/64*4000)/8000)
-const BiQuadFilter::BiQuadCoefficients kLowPassFilterCoefficients_16kHz = {
-    {0.1455f, 0.2911f, 0.1455f},
-    {-0.6698f, 0.2520f}};
-
-// [B,A] = butter(2,(41/64*4000)/16000)
-const BiQuadFilter::BiQuadCoefficients kLowPassFilterCoefficients_32kHz = {
-    {0.0462f, 0.0924f, 0.0462f},
-    {-1.3066f, 0.4915f}};
-
-// [B,A] = butter(2,(41/64*4000)/24000)
-const BiQuadFilter::BiQuadCoefficients kLowPassFilterCoefficients_48kHz = {
-    {0.0226f, 0.0452f, 0.0226f},
-    {-1.5320f, 0.6224f}};
-
-}  // namespace
-
-DownSampler::DownSampler(ApmDataDumper* data_dumper)
-    : data_dumper_(data_dumper) {
-  Initialize(48000);
-}
-void DownSampler::Initialize(int sample_rate_hz) {
-  RTC_DCHECK(sample_rate_hz == AudioProcessing::kSampleRate8kHz ||
-             sample_rate_hz == AudioProcessing::kSampleRate16kHz ||
-             sample_rate_hz == AudioProcessing::kSampleRate32kHz ||
-             sample_rate_hz == AudioProcessing::kSampleRate48kHz);
-
-  sample_rate_hz_ = sample_rate_hz;
-  down_sampling_factor_ = rtc::CheckedDivExact(sample_rate_hz_, 8000);
-
-  /// Note that the down sampling filter is not used if the sample rate is 8
-  /// kHz.
-  if (sample_rate_hz_ == AudioProcessing::kSampleRate16kHz) {
-    low_pass_filter_.Initialize(kLowPassFilterCoefficients_16kHz);
-  } else if (sample_rate_hz_ == AudioProcessing::kSampleRate32kHz) {
-    low_pass_filter_.Initialize(kLowPassFilterCoefficients_32kHz);
-  } else if (sample_rate_hz_ == AudioProcessing::kSampleRate48kHz) {
-    low_pass_filter_.Initialize(kLowPassFilterCoefficients_48kHz);
-  }
-}
-
-void DownSampler::DownSample(rtc::ArrayView<const float> in,
-                             rtc::ArrayView<float> out) {
-  data_dumper_->DumpWav("lc_down_sampler_input", in, sample_rate_hz_, 1);
-  RTC_DCHECK_EQ(sample_rate_hz_ * AudioProcessing::kChunkSizeMs / 1000,
-                in.size());
-  RTC_DCHECK_EQ(
-      AudioProcessing::kSampleRate8kHz * AudioProcessing::kChunkSizeMs / 1000,
-      out.size());
-  const size_t kMaxNumFrames =
-      AudioProcessing::kSampleRate48kHz * AudioProcessing::kChunkSizeMs / 1000;
-  float x[kMaxNumFrames];
-
-  // Band-limit the signal to 4 kHz.
-  if (sample_rate_hz_ != AudioProcessing::kSampleRate8kHz) {
-    low_pass_filter_.Process(in, rtc::ArrayView<float>(x, in.size()));
-
-    // Downsample the signal.
-    size_t k = 0;
-    for (size_t j = 0; j < out.size(); ++j) {
-      RTC_DCHECK_GT(kMaxNumFrames, k);
-      out[j] = x[k];
-      k += down_sampling_factor_;
-    }
-  } else {
-    std::copy(in.data(), in.data() + in.size(), out.data());
-  }
-
-  data_dumper_->DumpWav("lc_down_sampler_output", out,
-                        AudioProcessing::kSampleRate8kHz, 1);
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/level_controller/down_sampler.h b/modules/audio_processing/level_controller/down_sampler.h
deleted file mode 100644
index 5469a09..0000000
--- a/modules/audio_processing/level_controller/down_sampler.h
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- *  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_PROCESSING_LEVEL_CONTROLLER_DOWN_SAMPLER_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_LEVEL_CONTROLLER_DOWN_SAMPLER_H_
-
-#include "webrtc/api/array_view.h"
-#include "webrtc/modules/audio_processing/level_controller/biquad_filter.h"
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace webrtc {
-
-class ApmDataDumper;
-
-class DownSampler {
- public:
-  explicit DownSampler(ApmDataDumper* data_dumper);
-  void Initialize(int sample_rate_hz);
-
-  void DownSample(rtc::ArrayView<const float> in, rtc::ArrayView<float> out);
-
- private:
-  ApmDataDumper* data_dumper_;
-  int sample_rate_hz_;
-  int down_sampling_factor_;
-  BiQuadFilter low_pass_filter_;
-
-  RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(DownSampler);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_LEVEL_CONTROLLER_DOWN_SAMPLER_H_
diff --git a/modules/audio_processing/level_controller/gain_applier.cc b/modules/audio_processing/level_controller/gain_applier.cc
deleted file mode 100644
index 54bcc5b..0000000
--- a/modules/audio_processing/level_controller/gain_applier.cc
+++ /dev/null
@@ -1,160 +0,0 @@
-/*
- *  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_processing/level_controller/gain_applier.h"
-
-#include <algorithm>
-
-#include "webrtc/api/array_view.h"
-#include "webrtc/rtc_base/checks.h"
-
-#include "webrtc/modules/audio_processing/audio_buffer.h"
-#include "webrtc/modules/audio_processing/logging/apm_data_dumper.h"
-
-namespace webrtc {
-namespace {
-
-const float kMaxSampleValue = 32767.f;
-const float kMinSampleValue = -32767.f;
-
-int CountSaturations(rtc::ArrayView<const float> in) {
-  return std::count_if(in.begin(), in.end(), [](const float& v) {
-    return v >= kMaxSampleValue || v <= kMinSampleValue;
-  });
-}
-
-int CountSaturations(const AudioBuffer& audio) {
-  int num_saturations = 0;
-  for (size_t k = 0; k < audio.num_channels(); ++k) {
-    num_saturations += CountSaturations(rtc::ArrayView<const float>(
-        audio.channels_const_f()[k], audio.num_frames()));
-  }
-  return num_saturations;
-}
-
-void LimitToAllowedRange(rtc::ArrayView<float> x) {
-  for (auto& v : x) {
-    v = std::max(kMinSampleValue, v);
-    v = std::min(kMaxSampleValue, v);
-  }
-}
-
-void LimitToAllowedRange(AudioBuffer* audio) {
-  for (size_t k = 0; k < audio->num_channels(); ++k) {
-    LimitToAllowedRange(
-        rtc::ArrayView<float>(audio->channels_f()[k], audio->num_frames()));
-  }
-}
-
-float ApplyIncreasingGain(float new_gain,
-                          float old_gain,
-                          float step_size,
-                          rtc::ArrayView<float> x) {
-  RTC_DCHECK_LT(0.f, step_size);
-  float gain = old_gain;
-  for (auto& v : x) {
-    gain = std::min(new_gain, gain + step_size);
-    v *= gain;
-  }
-  return gain;
-}
-
-float ApplyDecreasingGain(float new_gain,
-                          float old_gain,
-                          float step_size,
-                          rtc::ArrayView<float> x) {
-  RTC_DCHECK_GT(0.f, step_size);
-  float gain = old_gain;
-  for (auto& v : x) {
-    gain = std::max(new_gain, gain + step_size);
-    v *= gain;
-  }
-  return gain;
-}
-
-float ApplyConstantGain(float gain, rtc::ArrayView<float> x) {
-  for (auto& v : x) {
-    v *= gain;
-  }
-
-  return gain;
-}
-
-float ApplyGain(float new_gain,
-                float old_gain,
-                float increase_step_size,
-                float decrease_step_size,
-                rtc::ArrayView<float> x) {
-  RTC_DCHECK_LT(0.f, increase_step_size);
-  RTC_DCHECK_GT(0.f, decrease_step_size);
-  if (new_gain == old_gain) {
-    return ApplyConstantGain(new_gain, x);
-  } else if (new_gain > old_gain) {
-    return ApplyIncreasingGain(new_gain, old_gain, increase_step_size, x);
-  } else {
-    return ApplyDecreasingGain(new_gain, old_gain, decrease_step_size, x);
-  }
-}
-
-}  // namespace
-
-GainApplier::GainApplier(ApmDataDumper* data_dumper)
-    : data_dumper_(data_dumper) {}
-
-void GainApplier::Initialize(int sample_rate_hz) {
-  RTC_DCHECK(sample_rate_hz == AudioProcessing::kSampleRate8kHz ||
-             sample_rate_hz == AudioProcessing::kSampleRate16kHz ||
-             sample_rate_hz == AudioProcessing::kSampleRate32kHz ||
-             sample_rate_hz == AudioProcessing::kSampleRate48kHz);
-  const float kGainIncreaseStepSize48kHz = 0.0001f;
-  const float kGainDecreaseStepSize48kHz = -0.01f;
-  const float kGainSaturatedDecreaseStepSize48kHz = -0.05f;
-
-  last_frame_was_saturated_ = false;
-  old_gain_ = 1.f;
-  gain_increase_step_size_ =
-      kGainIncreaseStepSize48kHz *
-      (static_cast<float>(AudioProcessing::kSampleRate48kHz) / sample_rate_hz);
-  gain_normal_decrease_step_size_ =
-      kGainDecreaseStepSize48kHz *
-      (static_cast<float>(AudioProcessing::kSampleRate48kHz) / sample_rate_hz);
-  gain_saturated_decrease_step_size_ =
-      kGainSaturatedDecreaseStepSize48kHz *
-      (static_cast<float>(AudioProcessing::kSampleRate48kHz) / sample_rate_hz);
-}
-
-int GainApplier::Process(float new_gain, AudioBuffer* audio) {
-  RTC_CHECK_NE(0.f, gain_increase_step_size_);
-  RTC_CHECK_NE(0.f, gain_normal_decrease_step_size_);
-  RTC_CHECK_NE(0.f, gain_saturated_decrease_step_size_);
-  int num_saturations = 0;
-  if (new_gain != 1.f) {
-    float last_applied_gain = 1.f;
-    float gain_decrease_step_size = last_frame_was_saturated_
-                                        ? gain_saturated_decrease_step_size_
-                                        : gain_normal_decrease_step_size_;
-    for (size_t k = 0; k < audio->num_channels(); ++k) {
-      last_applied_gain = ApplyGain(
-          new_gain, old_gain_, gain_increase_step_size_,
-          gain_decrease_step_size,
-          rtc::ArrayView<float>(audio->channels_f()[k], audio->num_frames()));
-    }
-
-    num_saturations = CountSaturations(*audio);
-    LimitToAllowedRange(audio);
-    old_gain_ = last_applied_gain;
-  }
-
-  data_dumper_->DumpRaw("lc_last_applied_gain", 1, &old_gain_);
-
-  return num_saturations;
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/level_controller/gain_applier.h b/modules/audio_processing/level_controller/gain_applier.h
deleted file mode 100644
index 33e26c1..0000000
--- a/modules/audio_processing/level_controller/gain_applier.h
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- *  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_PROCESSING_LEVEL_CONTROLLER_GAIN_APPLIER_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_LEVEL_CONTROLLER_GAIN_APPLIER_H_
-
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace webrtc {
-
-class ApmDataDumper;
-class AudioBuffer;
-
-class GainApplier {
- public:
-  explicit GainApplier(ApmDataDumper* data_dumper);
-  void Initialize(int sample_rate_hz);
-
-  // Applies the specified gain to the audio frame and returns the resulting
-  // number of saturated sample values.
-  int Process(float new_gain, AudioBuffer* audio);
-
- private:
-  ApmDataDumper* const data_dumper_;
-  float old_gain_ = 1.f;
-  float gain_increase_step_size_ = 0.f;
-  float gain_normal_decrease_step_size_ = 0.f;
-  float gain_saturated_decrease_step_size_ = 0.f;
-  bool last_frame_was_saturated_;
-  RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(GainApplier);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_LEVEL_CONTROLLER_GAIN_APPLIER_H_
diff --git a/modules/audio_processing/level_controller/gain_selector.cc b/modules/audio_processing/level_controller/gain_selector.cc
deleted file mode 100644
index 844b8de..0000000
--- a/modules/audio_processing/level_controller/gain_selector.cc
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- *  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_processing/level_controller/gain_selector.h"
-
-#include <math.h>
-#include <algorithm>
-
-#include "webrtc/modules/audio_processing/include/audio_processing.h"
-#include "webrtc/modules/audio_processing/level_controller/level_controller_constants.h"
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-
-GainSelector::GainSelector() {
-  Initialize(AudioProcessing::kSampleRate48kHz);
-}
-
-void GainSelector::Initialize(int sample_rate_hz) {
-  gain_ = 1.f;
-  frame_length_ = rtc::CheckedDivExact(sample_rate_hz, 100);
-  highly_nonstationary_signal_hold_counter_ = 0;
-}
-
-// Chooses the gain to apply by the level controller such that
-// 1) The level of the stationary noise does not exceed
-//    a predefined threshold.
-// 2) The gain does not exceed the gain that has been found
-//    to saturate the signal.
-// 3) The peak level achieves the target peak level.
-// 4) The gain is not below 1.
-// 4) The gain is 1 if the signal has been classified as stationary
-//    for a long time.
-// 5) The gain is not above the maximum gain.
-float GainSelector::GetNewGain(float peak_level,
-                               float noise_energy,
-                               float saturating_gain,
-                               bool gain_jumpstart,
-                               SignalClassifier::SignalType signal_type) {
-  RTC_DCHECK_LT(0.f, peak_level);
-
-  if (signal_type == SignalClassifier::SignalType::kHighlyNonStationary ||
-      gain_jumpstart) {
-    highly_nonstationary_signal_hold_counter_ = 100;
-  } else {
-    highly_nonstationary_signal_hold_counter_ =
-        std::max(0, highly_nonstationary_signal_hold_counter_ - 1);
-  }
-
-  float desired_gain;
-  if (highly_nonstationary_signal_hold_counter_ > 0) {
-    // Compute a desired gain that ensures that the peak level is amplified to
-    // the target level.
-    desired_gain = kTargetLcPeakLevel / peak_level;
-
-    // Limit the desired gain so that it does not amplify the noise too much.
-    float max_noise_energy = kMaxLcNoisePower * frame_length_;
-    if (noise_energy * desired_gain * desired_gain > max_noise_energy) {
-      RTC_DCHECK_LE(0.f, noise_energy);
-      desired_gain = sqrtf(max_noise_energy / noise_energy);
-    }
-  } else {
-    // If the signal has been stationary for a long while, apply a gain of 1 to
-    // avoid amplifying pure noise.
-    desired_gain = 1.0f;
-  }
-
-  // Smootly update the gain towards the desired gain.
-  gain_ += 0.2f * (desired_gain - gain_);
-
-  // Limit the gain to not exceed the maximum and the saturating gains, and to
-  // ensure that the lowest possible gain is 1.
-  gain_ = std::min(gain_, saturating_gain);
-  gain_ = std::min(gain_, kMaxLcGain);
-  gain_ = std::max(gain_, 1.f);
-
-  return gain_;
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/level_controller/gain_selector.h b/modules/audio_processing/level_controller/gain_selector.h
deleted file mode 100644
index 690d49b..0000000
--- a/modules/audio_processing/level_controller/gain_selector.h
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- *  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_PROCESSING_LEVEL_CONTROLLER_GAIN_SELECTOR_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_LEVEL_CONTROLLER_GAIN_SELECTOR_H_
-
-#include "webrtc/rtc_base/constructormagic.h"
-
-#include "webrtc/modules/audio_processing/level_controller/signal_classifier.h"
-
-namespace webrtc {
-
-class GainSelector {
- public:
-  GainSelector();
-  void Initialize(int sample_rate_hz);
-  float GetNewGain(float peak_level,
-                   float noise_energy,
-                   float saturating_gain,
-                   bool gain_jumpstart,
-                   SignalClassifier::SignalType signal_type);
-
- private:
-  float gain_;
-  size_t frame_length_;
-  int highly_nonstationary_signal_hold_counter_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(GainSelector);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_LEVEL_CONTROLLER_GAIN_SELECTOR_H_
diff --git a/modules/audio_processing/level_controller/level_controller.cc b/modules/audio_processing/level_controller/level_controller.cc
deleted file mode 100644
index 6edae5c..0000000
--- a/modules/audio_processing/level_controller/level_controller.cc
+++ /dev/null
@@ -1,293 +0,0 @@
-/*
- *  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_processing/level_controller/level_controller.h"
-
-#include <math.h>
-#include <algorithm>
-#include <numeric>
-
-#include "webrtc/api/array_view.h"
-#include "webrtc/modules/audio_processing/audio_buffer.h"
-#include "webrtc/modules/audio_processing/level_controller/gain_applier.h"
-#include "webrtc/modules/audio_processing/level_controller/gain_selector.h"
-#include "webrtc/modules/audio_processing/level_controller/noise_level_estimator.h"
-#include "webrtc/modules/audio_processing/level_controller/peak_level_estimator.h"
-#include "webrtc/modules/audio_processing/level_controller/saturating_gain_estimator.h"
-#include "webrtc/modules/audio_processing/level_controller/signal_classifier.h"
-#include "webrtc/modules/audio_processing/logging/apm_data_dumper.h"
-#include "webrtc/rtc_base/arraysize.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/system_wrappers/include/metrics.h"
-
-namespace webrtc {
-namespace {
-
-void UpdateAndRemoveDcLevel(float forgetting_factor,
-                            float* dc_level,
-                            rtc::ArrayView<float> x) {
-  RTC_DCHECK(!x.empty());
-  float mean =
-      std::accumulate(x.begin(), x.end(), 0.0f) / static_cast<float>(x.size());
-  *dc_level += forgetting_factor * (mean - *dc_level);
-
-  for (float& v : x) {
-    v -= *dc_level;
-  }
-}
-
-float FrameEnergy(const AudioBuffer& audio) {
-  float energy = 0.f;
-  for (size_t k = 0; k < audio.num_channels(); ++k) {
-    float channel_energy =
-        std::accumulate(audio.channels_const_f()[k],
-                        audio.channels_const_f()[k] + audio.num_frames(), 0.f,
-                        [](float a, float b) -> float { return a + b * b; });
-    energy = std::max(channel_energy, energy);
-  }
-  return energy;
-}
-
-float PeakLevel(const AudioBuffer& audio) {
-  float peak_level = 0.f;
-  for (size_t k = 0; k < audio.num_channels(); ++k) {
-    auto* channel_peak_level = std::max_element(
-        audio.channels_const_f()[k],
-        audio.channels_const_f()[k] + audio.num_frames(),
-        [](float a, float b) { return std::abs(a) < std::abs(b); });
-    peak_level = std::max(*channel_peak_level, peak_level);
-  }
-  return peak_level;
-}
-
-const int kMetricsFrameInterval = 1000;
-
-}  // namespace
-
-int LevelController::instance_count_ = 0;
-
-void LevelController::Metrics::Initialize(int sample_rate_hz) {
-  RTC_DCHECK(sample_rate_hz == AudioProcessing::kSampleRate8kHz ||
-             sample_rate_hz == AudioProcessing::kSampleRate16kHz ||
-             sample_rate_hz == AudioProcessing::kSampleRate32kHz ||
-             sample_rate_hz == AudioProcessing::kSampleRate48kHz);
-
-  Reset();
-  frame_length_ = rtc::CheckedDivExact(sample_rate_hz, 100);
-}
-
-void LevelController::Metrics::Reset() {
-  metrics_frame_counter_ = 0;
-  gain_sum_ = 0.f;
-  peak_level_sum_ = 0.f;
-  noise_energy_sum_ = 0.f;
-  max_gain_ = 0.f;
-  max_peak_level_ = 0.f;
-  max_noise_energy_ = 0.f;
-}
-
-void LevelController::Metrics::Update(float long_term_peak_level,
-                                      float noise_energy,
-                                      float gain,
-                                      float frame_peak_level) {
-  const float kdBFSOffset = 90.3090f;
-  gain_sum_ += gain;
-  peak_level_sum_ += long_term_peak_level;
-  noise_energy_sum_ += noise_energy;
-  max_gain_ = std::max(max_gain_, gain);
-  max_peak_level_ = std::max(max_peak_level_, long_term_peak_level);
-  max_noise_energy_ = std::max(max_noise_energy_, noise_energy);
-
-  ++metrics_frame_counter_;
-  if (metrics_frame_counter_ == kMetricsFrameInterval) {
-    RTC_DCHECK_LT(0, frame_length_);
-    RTC_DCHECK_LT(0, kMetricsFrameInterval);
-
-    const int max_noise_power_dbfs = static_cast<int>(
-        10 * log10(max_noise_energy_ / frame_length_ + 1e-10f) - kdBFSOffset);
-    RTC_HISTOGRAM_COUNTS("WebRTC.Audio.LevelControl.MaxNoisePower",
-                         max_noise_power_dbfs, -90, 0, 50);
-
-    const int average_noise_power_dbfs = static_cast<int>(
-        10 * log10(noise_energy_sum_ / (frame_length_ * kMetricsFrameInterval) +
-                   1e-10f) -
-        kdBFSOffset);
-    RTC_HISTOGRAM_COUNTS("WebRTC.Audio.LevelControl.AverageNoisePower",
-                         average_noise_power_dbfs, -90, 0, 50);
-
-    const int max_peak_level_dbfs = static_cast<int>(
-        10 * log10(max_peak_level_ * max_peak_level_ + 1e-10f) - kdBFSOffset);
-    RTC_HISTOGRAM_COUNTS("WebRTC.Audio.LevelControl.MaxPeakLevel",
-                         max_peak_level_dbfs, -90, 0, 50);
-
-    const int average_peak_level_dbfs = static_cast<int>(
-        10 * log10(peak_level_sum_ * peak_level_sum_ /
-                       (kMetricsFrameInterval * kMetricsFrameInterval) +
-                   1e-10f) -
-        kdBFSOffset);
-    RTC_HISTOGRAM_COUNTS("WebRTC.Audio.LevelControl.AveragePeakLevel",
-                         average_peak_level_dbfs, -90, 0, 50);
-
-    RTC_DCHECK_LE(1.f, max_gain_);
-    RTC_DCHECK_LE(1.f, gain_sum_ / kMetricsFrameInterval);
-
-    const int max_gain_db = static_cast<int>(10 * log10(max_gain_ * max_gain_));
-    RTC_HISTOGRAM_COUNTS("WebRTC.Audio.LevelControl.MaxGain", max_gain_db, 0,
-                         33, 30);
-
-    const int average_gain_db = static_cast<int>(
-        10 * log10(gain_sum_ * gain_sum_ /
-                   (kMetricsFrameInterval * kMetricsFrameInterval)));
-    RTC_HISTOGRAM_COUNTS("WebRTC.Audio.LevelControl.AverageGain",
-                         average_gain_db, 0, 33, 30);
-
-    const int long_term_peak_level_dbfs = static_cast<int>(
-        10 * log10(long_term_peak_level * long_term_peak_level + 1e-10f) -
-        kdBFSOffset);
-
-    const int frame_peak_level_dbfs = static_cast<int>(
-        10 * log10(frame_peak_level * frame_peak_level + 1e-10f) - kdBFSOffset);
-
-    LOG(LS_INFO) << "Level Controller metrics: {"
-                 << "Max noise power: " << max_noise_power_dbfs << " dBFS, "
-                 << "Average noise power: " << average_noise_power_dbfs
-                 << " dBFS, "
-                 << "Max long term peak level: " << max_peak_level_dbfs
-                 << " dBFS, "
-                 << "Average long term peak level: " << average_peak_level_dbfs
-                 << " dBFS, "
-                 << "Max gain: " << max_gain_db << " dB, "
-                 << "Average gain: " << average_gain_db << " dB, "
-                 << "Long term peak level: " << long_term_peak_level_dbfs
-                 << " dBFS, "
-                 << "Last frame peak level: " << frame_peak_level_dbfs
-                 << " dBFS"
-                 << "}";
-
-    Reset();
-  }
-}
-
-LevelController::LevelController()
-    : data_dumper_(new ApmDataDumper(instance_count_)),
-      gain_applier_(data_dumper_.get()),
-      signal_classifier_(data_dumper_.get()),
-      peak_level_estimator_(kTargetLcPeakLeveldBFS) {
-  Initialize(AudioProcessing::kSampleRate48kHz);
-  ++instance_count_;
-}
-
-LevelController::~LevelController() {}
-
-void LevelController::Initialize(int sample_rate_hz) {
-  RTC_DCHECK(sample_rate_hz == AudioProcessing::kSampleRate8kHz ||
-             sample_rate_hz == AudioProcessing::kSampleRate16kHz ||
-             sample_rate_hz == AudioProcessing::kSampleRate32kHz ||
-             sample_rate_hz == AudioProcessing::kSampleRate48kHz);
-  data_dumper_->InitiateNewSetOfRecordings();
-  gain_selector_.Initialize(sample_rate_hz);
-  gain_applier_.Initialize(sample_rate_hz);
-  signal_classifier_.Initialize(sample_rate_hz);
-  noise_level_estimator_.Initialize(sample_rate_hz);
-  peak_level_estimator_.Initialize(config_.initial_peak_level_dbfs);
-  saturating_gain_estimator_.Initialize();
-  metrics_.Initialize(sample_rate_hz);
-
-  last_gain_ = 1.0f;
-  sample_rate_hz_ = rtc::Optional<int>(sample_rate_hz);
-  dc_forgetting_factor_ = 0.01f * sample_rate_hz / 48000.f;
-  std::fill(dc_level_, dc_level_ + arraysize(dc_level_), 0.f);
-}
-
-void LevelController::Process(AudioBuffer* audio) {
-  RTC_DCHECK_LT(0, audio->num_channels());
-  RTC_DCHECK_GE(2, audio->num_channels());
-  RTC_DCHECK_NE(0.f, dc_forgetting_factor_);
-  RTC_DCHECK(sample_rate_hz_);
-  data_dumper_->DumpWav("lc_input", audio->num_frames(),
-                        audio->channels_const_f()[0], *sample_rate_hz_, 1);
-
-  // Remove DC level.
-  for (size_t k = 0; k < audio->num_channels(); ++k) {
-    UpdateAndRemoveDcLevel(
-        dc_forgetting_factor_, &dc_level_[k],
-        rtc::ArrayView<float>(audio->channels_f()[k], audio->num_frames()));
-  }
-
-  SignalClassifier::SignalType signal_type;
-  signal_classifier_.Analyze(*audio, &signal_type);
-  int tmp = static_cast<int>(signal_type);
-  data_dumper_->DumpRaw("lc_signal_type", 1, &tmp);
-
-  // Estimate the noise energy.
-  float noise_energy =
-      noise_level_estimator_.Analyze(signal_type, FrameEnergy(*audio));
-
-  // Estimate the overall signal peak level.
-  const float frame_peak_level = PeakLevel(*audio);
-  const float long_term_peak_level =
-      peak_level_estimator_.Analyze(signal_type, frame_peak_level);
-
-  float saturating_gain = saturating_gain_estimator_.GetGain();
-
-  // Compute the new gain to apply.
-  last_gain_ =
-      gain_selector_.GetNewGain(long_term_peak_level, noise_energy,
-                                saturating_gain, gain_jumpstart_, signal_type);
-
-  // Unflag the jumpstart of the gain as it should only happen once.
-  gain_jumpstart_ = false;
-
-  // Apply the gain to the signal.
-  int num_saturations = gain_applier_.Process(last_gain_, audio);
-
-  // Estimate the gain that saturates the overall signal.
-  saturating_gain_estimator_.Update(last_gain_, num_saturations);
-
-  // Update the metrics.
-  metrics_.Update(long_term_peak_level, noise_energy, last_gain_,
-                  frame_peak_level);
-
-  data_dumper_->DumpRaw("lc_selected_gain", 1, &last_gain_);
-  data_dumper_->DumpRaw("lc_noise_energy", 1, &noise_energy);
-  data_dumper_->DumpRaw("lc_peak_level", 1, &long_term_peak_level);
-  data_dumper_->DumpRaw("lc_saturating_gain", 1, &saturating_gain);
-
-  data_dumper_->DumpWav("lc_output", audio->num_frames(),
-                        audio->channels_f()[0], *sample_rate_hz_, 1);
-}
-
-void LevelController::ApplyConfig(
-    const AudioProcessing::Config::LevelController& config) {
-  RTC_DCHECK(Validate(config));
-  config_ = config;
-  peak_level_estimator_.Initialize(config_.initial_peak_level_dbfs);
-  gain_jumpstart_ = true;
-}
-
-std::string LevelController::ToString(
-    const AudioProcessing::Config::LevelController& config) {
-  std::stringstream ss;
-  ss << "{"
-     << "enabled: " << (config.enabled ? "true" : "false") << ", "
-     << "initial_peak_level_dbfs: " << config.initial_peak_level_dbfs << "}";
-  return ss.str();
-}
-
-bool LevelController::Validate(
-    const AudioProcessing::Config::LevelController& config) {
-  return (config.initial_peak_level_dbfs <
-              std::numeric_limits<float>::epsilon() &&
-          config.initial_peak_level_dbfs >
-              -(100.f + std::numeric_limits<float>::epsilon()));
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/level_controller/level_controller.h b/modules/audio_processing/level_controller/level_controller.h
deleted file mode 100644
index 9aa5085..0000000
--- a/modules/audio_processing/level_controller/level_controller.h
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- *  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_PROCESSING_LEVEL_CONTROLLER_LEVEL_CONTROLLER_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_LEVEL_CONTROLLER_LEVEL_CONTROLLER_H_
-
-#include <memory>
-#include <vector>
-
-#include "webrtc/api/optional.h"
-#include "webrtc/modules/audio_processing/include/audio_processing.h"
-#include "webrtc/modules/audio_processing/level_controller/gain_applier.h"
-#include "webrtc/modules/audio_processing/level_controller/gain_selector.h"
-#include "webrtc/modules/audio_processing/level_controller/noise_level_estimator.h"
-#include "webrtc/modules/audio_processing/level_controller/peak_level_estimator.h"
-#include "webrtc/modules/audio_processing/level_controller/saturating_gain_estimator.h"
-#include "webrtc/modules/audio_processing/level_controller/signal_classifier.h"
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace webrtc {
-
-class ApmDataDumper;
-class AudioBuffer;
-
-class LevelController {
- public:
-  LevelController();
-  ~LevelController();
-
-  void Initialize(int sample_rate_hz);
-  void Process(AudioBuffer* audio);
-  float GetLastGain() { return last_gain_; }
-
-  // TODO(peah): This method is a temporary solution as the the aim is to
-  // instead apply the config inside the constructor. Therefore this is likely
-  // to change.
-  void ApplyConfig(const AudioProcessing::Config::LevelController& config);
-  // Validates a config.
-  static bool Validate(const AudioProcessing::Config::LevelController& config);
-  // Dumps a config to a string.
-  static std::string ToString(
-      const AudioProcessing::Config::LevelController& config);
-
- private:
-  class Metrics {
-   public:
-    Metrics() { Initialize(AudioProcessing::kSampleRate48kHz); }
-    void Initialize(int sample_rate_hz);
-    void Update(float long_term_peak_level,
-                float noise_level,
-                float gain,
-                float frame_peak_level);
-
-   private:
-    void Reset();
-
-    size_t metrics_frame_counter_;
-    float gain_sum_;
-    float peak_level_sum_;
-    float noise_energy_sum_;
-    float max_gain_;
-    float max_peak_level_;
-    float max_noise_energy_;
-    float frame_length_;
-  };
-
-  std::unique_ptr<ApmDataDumper> data_dumper_;
-  GainSelector gain_selector_;
-  GainApplier gain_applier_;
-  SignalClassifier signal_classifier_;
-  NoiseLevelEstimator noise_level_estimator_;
-  PeakLevelEstimator peak_level_estimator_;
-  SaturatingGainEstimator saturating_gain_estimator_;
-  Metrics metrics_;
-  rtc::Optional<int> sample_rate_hz_;
-  static int instance_count_;
-  float dc_level_[2];
-  float dc_forgetting_factor_;
-  float last_gain_;
-  bool gain_jumpstart_ = false;
-  AudioProcessing::Config::LevelController config_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(LevelController);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_LEVEL_CONTROLLER_LEVEL_CONTROLLER_H_
diff --git a/modules/audio_processing/level_controller/level_controller_complexity_unittest.cc b/modules/audio_processing/level_controller/level_controller_complexity_unittest.cc
deleted file mode 100644
index 62859ee..0000000
--- a/modules/audio_processing/level_controller/level_controller_complexity_unittest.cc
+++ /dev/null
@@ -1,246 +0,0 @@
-/*
- *  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 <numeric>
-#include <vector>
-
-#include "webrtc/api/array_view.h"
-#include "webrtc/modules/audio_processing/audio_buffer.h"
-#include "webrtc/modules/audio_processing/include/audio_processing.h"
-#include "webrtc/modules/audio_processing/level_controller/level_controller.h"
-#include "webrtc/modules/audio_processing/test/audio_buffer_tools.h"
-#include "webrtc/modules/audio_processing/test/bitexactness_tools.h"
-#include "webrtc/modules/audio_processing/test/performance_timer.h"
-#include "webrtc/modules/audio_processing/test/simulator_buffers.h"
-#include "webrtc/rtc_base/random.h"
-#include "webrtc/system_wrappers/include/clock.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/testsupport/perf_test.h"
-
-namespace webrtc {
-namespace {
-
-const size_t kNumFramesToProcess = 300;
-const size_t kNumFramesToProcessAtWarmup = 300;
-const size_t kToTalNumFrames =
-    kNumFramesToProcess + kNumFramesToProcessAtWarmup;
-
-std::string FormPerformanceMeasureString(const test::PerformanceTimer& timer) {
-  std::string s = std::to_string(timer.GetDurationAverage());
-  s += ", ";
-  s += std::to_string(timer.GetDurationStandardDeviation());
-  return s;
-}
-
-void RunStandaloneSubmodule(int sample_rate_hz, size_t num_channels) {
-  test::SimulatorBuffers buffers(sample_rate_hz, sample_rate_hz, sample_rate_hz,
-                                 sample_rate_hz, num_channels, num_channels,
-                                 num_channels, num_channels);
-  test::PerformanceTimer timer(kNumFramesToProcess);
-
-  LevelController level_controller;
-  level_controller.Initialize(sample_rate_hz);
-
-  for (size_t frame_no = 0; frame_no < kToTalNumFrames; ++frame_no) {
-    buffers.UpdateInputBuffers();
-
-    if (frame_no >= kNumFramesToProcessAtWarmup) {
-      timer.StartTimer();
-    }
-    level_controller.Process(buffers.capture_input_buffer.get());
-    if (frame_no >= kNumFramesToProcessAtWarmup) {
-      timer.StopTimer();
-    }
-  }
-  webrtc::test::PrintResultMeanAndError(
-      "level_controller_call_durations",
-      "_" + std::to_string(sample_rate_hz) + "Hz_" +
-          std::to_string(num_channels) + "_channels",
-      "StandaloneLevelControl", FormPerformanceMeasureString(timer), "us",
-      false);
-}
-
-void RunTogetherWithApm(const std::string& test_description,
-                        int render_input_sample_rate_hz,
-                        int render_output_sample_rate_hz,
-                        int capture_input_sample_rate_hz,
-                        int capture_output_sample_rate_hz,
-                        size_t num_channels,
-                        bool use_mobile_aec,
-                        bool include_default_apm_processing) {
-  test::SimulatorBuffers buffers(
-      render_input_sample_rate_hz, capture_input_sample_rate_hz,
-      render_output_sample_rate_hz, capture_output_sample_rate_hz, num_channels,
-      num_channels, num_channels, num_channels);
-  test::PerformanceTimer render_timer(kNumFramesToProcess);
-  test::PerformanceTimer capture_timer(kNumFramesToProcess);
-  test::PerformanceTimer total_timer(kNumFramesToProcess);
-
-  webrtc::Config config;
-  AudioProcessing::Config apm_config;
-  if (include_default_apm_processing) {
-    config.Set<DelayAgnostic>(new DelayAgnostic(true));
-    config.Set<ExtendedFilter>(new ExtendedFilter(true));
-  }
-  apm_config.level_controller.enabled = true;
-  apm_config.residual_echo_detector.enabled = include_default_apm_processing;
-
-  std::unique_ptr<AudioProcessing> apm;
-  apm.reset(AudioProcessing::Create(config));
-  ASSERT_TRUE(apm.get());
-  apm->ApplyConfig(apm_config);
-
-  ASSERT_EQ(AudioProcessing::kNoError,
-            apm->gain_control()->Enable(include_default_apm_processing));
-  if (use_mobile_aec) {
-    ASSERT_EQ(AudioProcessing::kNoError,
-              apm->echo_cancellation()->Enable(false));
-    ASSERT_EQ(AudioProcessing::kNoError, apm->echo_control_mobile()->Enable(
-                                             include_default_apm_processing));
-  } else {
-    ASSERT_EQ(AudioProcessing::kNoError,
-              apm->echo_cancellation()->Enable(include_default_apm_processing));
-    ASSERT_EQ(AudioProcessing::kNoError,
-              apm->echo_control_mobile()->Enable(false));
-  }
-  apm_config.high_pass_filter.enabled = include_default_apm_processing;
-  ASSERT_EQ(AudioProcessing::kNoError,
-            apm->noise_suppression()->Enable(include_default_apm_processing));
-  ASSERT_EQ(AudioProcessing::kNoError,
-            apm->voice_detection()->Enable(include_default_apm_processing));
-  ASSERT_EQ(AudioProcessing::kNoError,
-            apm->level_estimator()->Enable(include_default_apm_processing));
-
-  StreamConfig render_input_config(render_input_sample_rate_hz, num_channels,
-                                   false);
-  StreamConfig render_output_config(render_output_sample_rate_hz, num_channels,
-                                    false);
-  StreamConfig capture_input_config(capture_input_sample_rate_hz, num_channels,
-                                    false);
-  StreamConfig capture_output_config(capture_output_sample_rate_hz,
-                                     num_channels, false);
-
-  for (size_t frame_no = 0; frame_no < kToTalNumFrames; ++frame_no) {
-    buffers.UpdateInputBuffers();
-
-    if (frame_no >= kNumFramesToProcessAtWarmup) {
-      total_timer.StartTimer();
-      render_timer.StartTimer();
-    }
-    ASSERT_EQ(AudioProcessing::kNoError,
-              apm->ProcessReverseStream(
-                  &buffers.render_input[0], render_input_config,
-                  render_output_config, &buffers.render_output[0]));
-
-    if (frame_no >= kNumFramesToProcessAtWarmup) {
-      render_timer.StopTimer();
-
-      capture_timer.StartTimer();
-    }
-
-    ASSERT_EQ(AudioProcessing::kNoError, apm->set_stream_delay_ms(0));
-    ASSERT_EQ(
-        AudioProcessing::kNoError,
-        apm->ProcessStream(&buffers.capture_input[0], capture_input_config,
-                           capture_output_config, &buffers.capture_output[0]));
-
-    if (frame_no >= kNumFramesToProcessAtWarmup) {
-      capture_timer.StopTimer();
-      total_timer.StopTimer();
-    }
-  }
-
-  webrtc::test::PrintResultMeanAndError(
-      "level_controller_call_durations",
-      "_" + std::to_string(render_input_sample_rate_hz) + "_" +
-          std::to_string(render_output_sample_rate_hz) + "_" +
-          std::to_string(capture_input_sample_rate_hz) + "_" +
-          std::to_string(capture_output_sample_rate_hz) + "Hz_" +
-          std::to_string(num_channels) + "_channels" + "_render",
-      test_description, FormPerformanceMeasureString(render_timer), "us",
-      false);
-  webrtc::test::PrintResultMeanAndError(
-      "level_controller_call_durations",
-      "_" + std::to_string(render_input_sample_rate_hz) + "_" +
-          std::to_string(render_output_sample_rate_hz) + "_" +
-          std::to_string(capture_input_sample_rate_hz) + "_" +
-          std::to_string(capture_output_sample_rate_hz) + "Hz_" +
-          std::to_string(num_channels) + "_channels" + "_capture",
-      test_description, FormPerformanceMeasureString(capture_timer), "us",
-      false);
-  webrtc::test::PrintResultMeanAndError(
-      "level_controller_call_durations",
-      "_" + std::to_string(render_input_sample_rate_hz) + "_" +
-          std::to_string(render_output_sample_rate_hz) + "_" +
-          std::to_string(capture_input_sample_rate_hz) + "_" +
-          std::to_string(capture_output_sample_rate_hz) + "Hz_" +
-          std::to_string(num_channels) + "_channels" + "_total",
-      test_description, FormPerformanceMeasureString(total_timer), "us", false);
-}
-
-}  // namespace
-
-// TODO(peah): Reactivate once issue 7712 has been resolved.
-TEST(LevelControllerPerformanceTest, DISABLED_StandaloneProcessing) {
-  int sample_rates_to_test[] = {
-      AudioProcessing::kSampleRate8kHz, AudioProcessing::kSampleRate16kHz,
-      AudioProcessing::kSampleRate32kHz, AudioProcessing::kSampleRate48kHz};
-  for (auto sample_rate : sample_rates_to_test) {
-    for (size_t num_channels = 1; num_channels <= 2; ++num_channels) {
-      RunStandaloneSubmodule(sample_rate, num_channels);
-    }
-  }
-}
-
-void TestSomeSampleRatesWithApm(const std::string& test_name,
-                                bool use_mobile_agc,
-                                bool include_default_apm_processing) {
-  // Test some stereo combinations first.
-  size_t num_channels = 2;
-  RunTogetherWithApm(test_name, 48000, 48000, AudioProcessing::kSampleRate16kHz,
-                     AudioProcessing::kSampleRate32kHz, num_channels,
-                     use_mobile_agc, include_default_apm_processing);
-  RunTogetherWithApm(test_name, 48000, 48000, AudioProcessing::kSampleRate48kHz,
-                     AudioProcessing::kSampleRate8kHz, num_channels,
-                     use_mobile_agc, include_default_apm_processing);
-  RunTogetherWithApm(test_name, 48000, 48000, 44100, 44100, num_channels,
-                     use_mobile_agc, include_default_apm_processing);
-
-  // Then test mono combinations.
-  num_channels = 1;
-  RunTogetherWithApm(test_name, 48000, 48000, AudioProcessing::kSampleRate48kHz,
-                     AudioProcessing::kSampleRate48kHz, num_channels,
-                     use_mobile_agc, include_default_apm_processing);
-}
-
-// TODO(peah): Reactivate once issue 7712 has been resolved.
-#if !defined(WEBRTC_ANDROID)
-TEST(LevelControllerPerformanceTest, DISABLED_ProcessingViaApm) {
-#else
-TEST(LevelControllerPerformanceTest, DISABLED_ProcessingViaApm) {
-#endif
-  // Run without default APM processing and desktop AGC.
-  TestSomeSampleRatesWithApm("SimpleLevelControlViaApm", false, false);
-}
-
-// TODO(peah): Reactivate once issue 7712 has been resolved.
-#if !defined(WEBRTC_ANDROID)
-TEST(LevelControllerPerformanceTest, DISABLED_InteractionWithDefaultApm) {
-#else
-TEST(LevelControllerPerformanceTest, DISABLED_InteractionWithDefaultApm) {
-#endif
-  bool include_default_apm_processing = true;
-  TestSomeSampleRatesWithApm("LevelControlAndDefaultDesktopApm", false,
-                             include_default_apm_processing);
-  TestSomeSampleRatesWithApm("LevelControlAndDefaultMobileApm", true,
-                             include_default_apm_processing);
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/level_controller/level_controller_constants.h b/modules/audio_processing/level_controller/level_controller_constants.h
deleted file mode 100644
index 7b962d3..0000000
--- a/modules/audio_processing/level_controller/level_controller_constants.h
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- *  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_PROCESSING_LEVEL_CONTROLLER_LEVEL_CONTROLLER_CONSTANTS_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_LEVEL_CONTROLLER_LEVEL_CONTROLLER_CONSTANTS_H_
-
-namespace webrtc {
-
-const float kMaxLcGain = 10;
-const float kMaxLcNoisePower = 100.f * 100.f;
-const float kTargetLcPeakLevel = 16384.f;
-const float kTargetLcPeakLeveldBFS = -6.0206f;
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_LEVEL_CONTROLLER_LEVEL_CONTROLLER_CONSTANTS_H_
diff --git a/modules/audio_processing/level_controller/level_controller_unittest.cc b/modules/audio_processing/level_controller/level_controller_unittest.cc
deleted file mode 100644
index d37b580..0000000
--- a/modules/audio_processing/level_controller/level_controller_unittest.cc
+++ /dev/null
@@ -1,156 +0,0 @@
-/*
- *  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 <vector>
-
-#include "webrtc/api/array_view.h"
-#include "webrtc/api/optional.h"
-#include "webrtc/modules/audio_processing/audio_buffer.h"
-#include "webrtc/modules/audio_processing/include/audio_processing.h"
-#include "webrtc/modules/audio_processing/level_controller/level_controller.h"
-#include "webrtc/modules/audio_processing/test/audio_buffer_tools.h"
-#include "webrtc/modules/audio_processing/test/bitexactness_tools.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-namespace {
-
-const int kNumFramesToProcess = 1000;
-
-// Processes a specified amount of frames, verifies the results and reports
-// any errors.
-void RunBitexactnessTest(int sample_rate_hz,
-                         size_t num_channels,
-                         rtc::Optional<float> initial_peak_level_dbfs,
-                         rtc::ArrayView<const float> output_reference) {
-  LevelController level_controller;
-  level_controller.Initialize(sample_rate_hz);
-  if (initial_peak_level_dbfs) {
-    AudioProcessing::Config::LevelController config;
-    config.initial_peak_level_dbfs = *initial_peak_level_dbfs;
-    level_controller.ApplyConfig(config);
-  }
-
-  int samples_per_channel = rtc::CheckedDivExact(sample_rate_hz, 100);
-  const StreamConfig capture_config(sample_rate_hz, num_channels, false);
-  AudioBuffer capture_buffer(
-      capture_config.num_frames(), capture_config.num_channels(),
-      capture_config.num_frames(), capture_config.num_channels(),
-      capture_config.num_frames());
-  test::InputAudioFile capture_file(
-      test::GetApmCaptureTestVectorFileName(sample_rate_hz));
-  std::vector<float> capture_input(samples_per_channel * num_channels);
-  for (size_t frame_no = 0; frame_no < kNumFramesToProcess; ++frame_no) {
-    ReadFloatSamplesFromStereoFile(samples_per_channel, num_channels,
-                                   &capture_file, capture_input);
-
-    test::CopyVectorToAudioBuffer(capture_config, capture_input,
-                                  &capture_buffer);
-
-    level_controller.Process(&capture_buffer);
-  }
-
-  // Extract test results.
-  std::vector<float> capture_output;
-  test::ExtractVectorFromAudioBuffer(capture_config, &capture_buffer,
-                                     &capture_output);
-
-  // Compare the output with the reference. Only the first values of the output
-  // from last frame processed are compared in order not having to specify all
-  // preceding frames as testvectors. As the algorithm being tested has a
-  // memory, testing only the last frame implicitly also tests the preceeding
-  // frames.
-  const float kVectorElementErrorBound = 1.0f / 32768.0f;
-  EXPECT_TRUE(test::VerifyDeinterleavedArray(
-      capture_config.num_frames(), capture_config.num_channels(),
-      output_reference, capture_output, kVectorElementErrorBound));
-}
-
-}  // namespace
-
-TEST(LevelControllerConfig, ToString) {
-  AudioProcessing::Config config;
-  config.level_controller.enabled = true;
-  config.level_controller.initial_peak_level_dbfs = -6.0206f;
-  EXPECT_EQ("{enabled: true, initial_peak_level_dbfs: -6.0206}",
-            LevelController::ToString(config.level_controller));
-
-  config.level_controller.enabled = false;
-  config.level_controller.initial_peak_level_dbfs = -50.f;
-  EXPECT_EQ("{enabled: false, initial_peak_level_dbfs: -50}",
-            LevelController::ToString(config.level_controller));
-}
-
-TEST(LevelControlBitExactnessTest, DISABLED_Mono8kHz) {
-  const float kOutputReference[] = {-0.013939f, -0.012154f, -0.009054f};
-  RunBitexactnessTest(AudioProcessing::kSampleRate8kHz, 1,
-                      rtc::Optional<float>(), kOutputReference);
-}
-
-TEST(LevelControlBitExactnessTest, DISABLED_Mono16kHz) {
-  const float kOutputReference[] = {-0.013706f, -0.013215f, -0.013018f};
-  RunBitexactnessTest(AudioProcessing::kSampleRate16kHz, 1,
-                      rtc::Optional<float>(), kOutputReference);
-}
-
-TEST(LevelControlBitExactnessTest, DISABLED_Mono32kHz) {
-  const float kOutputReference[] = {-0.014495f, -0.016425f, -0.016085f};
-  RunBitexactnessTest(AudioProcessing::kSampleRate32kHz, 1,
-                      rtc::Optional<float>(), kOutputReference);
-}
-
-// TODO(peah): Investigate why this particular testcase differ between Android
-// and the rest of the platforms.
-TEST(LevelControlBitExactnessTest, DISABLED_Mono48kHz) {
-#if !(defined(WEBRTC_ARCH_ARM64) || defined(WEBRTC_ARCH_ARM) || \
-      defined(WEBRTC_ANDROID))
-  const float kOutputReference[] = {-0.014277f, -0.015180f, -0.017437f};
-#else
-  const float kOutputReference[] = {-0.015949f, -0.016957f, -0.019478f};
-#endif
-  RunBitexactnessTest(AudioProcessing::kSampleRate48kHz, 1,
-                      rtc::Optional<float>(), kOutputReference);
-}
-
-TEST(LevelControlBitExactnessTest, DISABLED_Stereo8kHz) {
-  const float kOutputReference[] = {-0.014063f, -0.008450f, -0.012159f,
-                                    -0.051967f, -0.023202f, -0.047858f};
-  RunBitexactnessTest(AudioProcessing::kSampleRate8kHz, 2,
-                      rtc::Optional<float>(), kOutputReference);
-}
-
-TEST(LevelControlBitExactnessTest, DISABLED_Stereo16kHz) {
-  const float kOutputReference[] = {-0.012714f, -0.005896f, -0.012220f,
-                                    -0.053306f, -0.024549f, -0.051527f};
-  RunBitexactnessTest(AudioProcessing::kSampleRate16kHz, 2,
-                      rtc::Optional<float>(), kOutputReference);
-}
-
-TEST(LevelControlBitExactnessTest, DISABLED_Stereo32kHz) {
-  const float kOutputReference[] = {-0.011737f, -0.007018f, -0.013446f,
-                                    -0.053505f, -0.026292f, -0.056221f};
-  RunBitexactnessTest(AudioProcessing::kSampleRate32kHz, 2,
-                      rtc::Optional<float>(), kOutputReference);
-}
-
-TEST(LevelControlBitExactnessTest, DISABLED_Stereo48kHz) {
-  const float kOutputReference[] = {-0.010643f, -0.006334f, -0.011377f,
-                                    -0.049088f, -0.023600f, -0.050465f};
-  RunBitexactnessTest(AudioProcessing::kSampleRate48kHz, 2,
-                      rtc::Optional<float>(), kOutputReference);
-}
-
-TEST(LevelControlBitExactnessTest, DISABLED_MonoInitial48kHz) {
-  const float kOutputReference[] = {-0.013753f, -0.014623f, -0.016797f};
-  RunBitexactnessTest(AudioProcessing::kSampleRate48kHz, 1,
-                      rtc::Optional<float>(-50), kOutputReference);
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/level_controller/noise_level_estimator.cc b/modules/audio_processing/level_controller/noise_level_estimator.cc
deleted file mode 100644
index 08015f9..0000000
--- a/modules/audio_processing/level_controller/noise_level_estimator.cc
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- *  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_processing/level_controller/noise_level_estimator.h"
-
-#include <algorithm>
-
-#include "webrtc/modules/audio_processing/audio_buffer.h"
-#include "webrtc/modules/audio_processing/logging/apm_data_dumper.h"
-
-namespace webrtc {
-
-NoiseLevelEstimator::NoiseLevelEstimator() {
-  Initialize(AudioProcessing::kSampleRate48kHz);
-}
-
-NoiseLevelEstimator::~NoiseLevelEstimator() {}
-
-void NoiseLevelEstimator::Initialize(int sample_rate_hz) {
-  noise_energy_ = 1.f;
-  first_update_ = true;
-  min_noise_energy_ = sample_rate_hz * 2.f * 2.f / 100.f;
-  noise_energy_hold_counter_ = 0;
-}
-
-float NoiseLevelEstimator::Analyze(SignalClassifier::SignalType signal_type,
-                                   float frame_energy) {
-  if (frame_energy <= 0.f) {
-    return noise_energy_;
-  }
-
-  if (first_update_) {
-    // Initialize the noise energy to the frame energy.
-    first_update_ = false;
-    return noise_energy_ = std::max(frame_energy, min_noise_energy_);
-  }
-
-  // Update the noise estimate in a minimum statistics-type manner.
-  if (signal_type == SignalClassifier::SignalType::kStationary) {
-    if (frame_energy > noise_energy_) {
-      // Leak the estimate upwards towards the frame energy if no recent
-      // downward update.
-      noise_energy_hold_counter_ = std::max(noise_energy_hold_counter_ - 1, 0);
-
-      if (noise_energy_hold_counter_ == 0) {
-        noise_energy_ = std::min(noise_energy_ * 1.01f, frame_energy);
-      }
-    } else {
-      // Update smoothly downwards with a limited maximum update magnitude.
-      noise_energy_ =
-          std::max(noise_energy_ * 0.9f,
-                   noise_energy_ + 0.05f * (frame_energy - noise_energy_));
-      noise_energy_hold_counter_ = 1000;
-    }
-  } else {
-    // For a non-stationary signal, leak the estimate downwards in order to
-    // avoid estimate locking due to incorrect signal classification.
-    noise_energy_ = noise_energy_ * 0.99f;
-  }
-
-  // Ensure a minimum of the estimate.
-  return noise_energy_ = std::max(noise_energy_, min_noise_energy_);
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/level_controller/noise_level_estimator.h b/modules/audio_processing/level_controller/noise_level_estimator.h
deleted file mode 100644
index 017ecc2..0000000
--- a/modules/audio_processing/level_controller/noise_level_estimator.h
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- *  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_PROCESSING_LEVEL_CONTROLLER_NOISE_LEVEL_ESTIMATOR_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_LEVEL_CONTROLLER_NOISE_LEVEL_ESTIMATOR_H_
-
-#include "webrtc/modules/audio_processing/level_controller/signal_classifier.h"
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace webrtc {
-
-class NoiseLevelEstimator {
- public:
-  NoiseLevelEstimator();
-  ~NoiseLevelEstimator();
-  void Initialize(int sample_rate_hz);
-  float Analyze(SignalClassifier::SignalType signal_type, float frame_energy);
-
- private:
-  float min_noise_energy_ = 0.f;
-  bool first_update_;
-  float noise_energy_;
-  int noise_energy_hold_counter_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(NoiseLevelEstimator);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_LEVEL_CONTROLLER_NOISE_LEVEL_ESTIMATOR_H_
diff --git a/modules/audio_processing/level_controller/noise_spectrum_estimator.cc b/modules/audio_processing/level_controller/noise_spectrum_estimator.cc
deleted file mode 100644
index f7b1e19..0000000
--- a/modules/audio_processing/level_controller/noise_spectrum_estimator.cc
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- *  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_processing/level_controller/noise_spectrum_estimator.h"
-
-#include <string.h>
-#include <algorithm>
-
-#include "webrtc/api/array_view.h"
-#include "webrtc/modules/audio_processing/logging/apm_data_dumper.h"
-#include "webrtc/rtc_base/arraysize.h"
-
-namespace webrtc {
-namespace {
-constexpr float kMinNoisePower = 100.f;
-}  // namespace
-
-NoiseSpectrumEstimator::NoiseSpectrumEstimator(ApmDataDumper* data_dumper)
-    : data_dumper_(data_dumper) {
-  Initialize();
-}
-
-void NoiseSpectrumEstimator::Initialize() {
-  std::fill(noise_spectrum_, noise_spectrum_ + arraysize(noise_spectrum_),
-            kMinNoisePower);
-}
-
-void NoiseSpectrumEstimator::Update(rtc::ArrayView<const float> spectrum,
-                                    bool first_update) {
-  RTC_DCHECK_EQ(65, spectrum.size());
-
-  if (first_update) {
-    // Initialize the noise spectral estimate with the signal spectrum.
-    std::copy(spectrum.data(), spectrum.data() + spectrum.size(),
-              noise_spectrum_);
-  } else {
-    // Smoothly update the noise spectral estimate towards the signal spectrum
-    // such that the magnitude of the updates are limited.
-    for (size_t k = 0; k < spectrum.size(); ++k) {
-      if (noise_spectrum_[k] < spectrum[k]) {
-        noise_spectrum_[k] = std::min(
-            1.01f * noise_spectrum_[k],
-            noise_spectrum_[k] + 0.05f * (spectrum[k] - noise_spectrum_[k]));
-      } else {
-        noise_spectrum_[k] = std::max(
-            0.99f * noise_spectrum_[k],
-            noise_spectrum_[k] + 0.05f * (spectrum[k] - noise_spectrum_[k]));
-      }
-    }
-  }
-
-  // Ensure that the noise spectal estimate does not become too low.
-  for (auto& v : noise_spectrum_) {
-    v = std::max(v, kMinNoisePower);
-  }
-
-  data_dumper_->DumpRaw("lc_noise_spectrum", 65, noise_spectrum_);
-  data_dumper_->DumpRaw("lc_signal_spectrum", spectrum);
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/level_controller/noise_spectrum_estimator.h b/modules/audio_processing/level_controller/noise_spectrum_estimator.h
deleted file mode 100644
index 196f056..0000000
--- a/modules/audio_processing/level_controller/noise_spectrum_estimator.h
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- *  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_PROCESSING_LEVEL_CONTROLLER_NOISE_SPECTRUM_ESTIMATOR_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_LEVEL_CONTROLLER_NOISE_SPECTRUM_ESTIMATOR_H_
-
-#include "webrtc/api/array_view.h"
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace webrtc {
-
-class ApmDataDumper;
-
-class NoiseSpectrumEstimator {
- public:
-  explicit NoiseSpectrumEstimator(ApmDataDumper* data_dumper);
-  void Initialize();
-  void Update(rtc::ArrayView<const float> spectrum, bool first_update);
-
-  rtc::ArrayView<const float> GetNoiseSpectrum() const {
-    return rtc::ArrayView<const float>(noise_spectrum_);
-  }
-
- private:
-  ApmDataDumper* data_dumper_;
-  float noise_spectrum_[65];
-
-  RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(NoiseSpectrumEstimator);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_LEVEL_CONTROLLER_NOISE_SPECTRUM_ESTIMATOR_H_
diff --git a/modules/audio_processing/level_controller/peak_level_estimator.cc b/modules/audio_processing/level_controller/peak_level_estimator.cc
deleted file mode 100644
index 37046fd..0000000
--- a/modules/audio_processing/level_controller/peak_level_estimator.cc
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- *  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_processing/level_controller/peak_level_estimator.h"
-
-#include <algorithm>
-
-#include "webrtc/modules/audio_processing/audio_buffer.h"
-#include "webrtc/modules/audio_processing/logging/apm_data_dumper.h"
-
-namespace webrtc {
-namespace {
-
-constexpr float kMinLevel = 30.f;
-
-}  // namespace
-
-PeakLevelEstimator::PeakLevelEstimator(float initial_peak_level_dbfs) {
-  Initialize(initial_peak_level_dbfs);
-}
-
-PeakLevelEstimator::~PeakLevelEstimator() {}
-
-void PeakLevelEstimator::Initialize(float initial_peak_level_dbfs) {
-  RTC_DCHECK_LE(-100.f, initial_peak_level_dbfs);
-  RTC_DCHECK_GE(0.f, initial_peak_level_dbfs);
-
-  peak_level_ = std::pow(10.f, initial_peak_level_dbfs / 20.f) * 32768.f;
-  peak_level_ = std::max(peak_level_, kMinLevel);
-
-  hold_counter_ = 0;
-  initialization_phase_ = true;
-}
-
-float PeakLevelEstimator::Analyze(SignalClassifier::SignalType signal_type,
-                                  float frame_peak_level) {
-  if (frame_peak_level == 0) {
-    RTC_DCHECK_LE(kMinLevel, peak_level_);
-    return peak_level_;
-  }
-
-  if (peak_level_ < frame_peak_level) {
-    // Smoothly update the estimate upwards when the frame peak level is
-    // higher than the estimate.
-    peak_level_ += 0.1f * (frame_peak_level - peak_level_);
-    hold_counter_ = 100;
-    initialization_phase_ = false;
-  } else {
-    hold_counter_ = std::max(0, hold_counter_ - 1);
-
-    // When the signal is highly non-stationary, update the estimate slowly
-    // downwards if the estimate is lower than the frame peak level.
-    if ((signal_type == SignalClassifier::SignalType::kHighlyNonStationary &&
-         hold_counter_ == 0) ||
-        initialization_phase_) {
-      peak_level_ =
-          std::max(peak_level_ + 0.01f * (frame_peak_level - peak_level_),
-                   peak_level_ * 0.995f);
-    }
-  }
-
-  peak_level_ = std::max(peak_level_, kMinLevel);
-
-  return peak_level_;
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/level_controller/peak_level_estimator.h b/modules/audio_processing/level_controller/peak_level_estimator.h
deleted file mode 100644
index 23c1006..0000000
--- a/modules/audio_processing/level_controller/peak_level_estimator.h
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- *  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_PROCESSING_LEVEL_CONTROLLER_PEAK_LEVEL_ESTIMATOR_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_LEVEL_CONTROLLER_PEAK_LEVEL_ESTIMATOR_H_
-
-#include "webrtc/modules/audio_processing/level_controller/level_controller_constants.h"
-#include "webrtc/modules/audio_processing/level_controller/signal_classifier.h"
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace webrtc {
-
-class PeakLevelEstimator {
- public:
-  explicit PeakLevelEstimator(float initial_peak_level_dbfs);
-  ~PeakLevelEstimator();
-  void Initialize(float initial_peak_level_dbfs);
-  float Analyze(SignalClassifier::SignalType signal_type,
-                float frame_peak_level);
- private:
-  float peak_level_;
-  int hold_counter_;
-  bool initialization_phase_;
-
-  RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(PeakLevelEstimator);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_LEVEL_CONTROLLER_PEAK_LEVEL_ESTIMATOR_H_
diff --git a/modules/audio_processing/level_controller/saturating_gain_estimator.cc b/modules/audio_processing/level_controller/saturating_gain_estimator.cc
deleted file mode 100644
index b9db974..0000000
--- a/modules/audio_processing/level_controller/saturating_gain_estimator.cc
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- *  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_processing/level_controller/saturating_gain_estimator.h"
-
-#include <math.h>
-#include <algorithm>
-
-#include "webrtc/modules/audio_processing/level_controller/level_controller_constants.h"
-#include "webrtc/modules/audio_processing/logging/apm_data_dumper.h"
-
-namespace webrtc {
-
-SaturatingGainEstimator::SaturatingGainEstimator() {
-  Initialize();
-}
-
-SaturatingGainEstimator::~SaturatingGainEstimator() {}
-
-void SaturatingGainEstimator::Initialize() {
-  saturating_gain_ = kMaxLcGain;
-  saturating_gain_hold_counter_ = 0;
-}
-
-void SaturatingGainEstimator::Update(float gain, int num_saturations) {
-  bool too_many_saturations = (num_saturations > 2);
-
-  if (too_many_saturations) {
-    saturating_gain_ = 0.95f * gain;
-    saturating_gain_hold_counter_ = 1000;
-  } else {
-    saturating_gain_hold_counter_ =
-        std::max(0, saturating_gain_hold_counter_ - 1);
-    if (saturating_gain_hold_counter_ == 0) {
-      saturating_gain_ *= 1.001f;
-      saturating_gain_ = std::min(kMaxLcGain, saturating_gain_);
-    }
-  }
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/level_controller/saturating_gain_estimator.h b/modules/audio_processing/level_controller/saturating_gain_estimator.h
deleted file mode 100644
index 35275f3..0000000
--- a/modules/audio_processing/level_controller/saturating_gain_estimator.h
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- *  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_PROCESSING_LEVEL_CONTROLLER_SATURATING_GAIN_ESTIMATOR_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_LEVEL_CONTROLLER_SATURATING_GAIN_ESTIMATOR_H_
-
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace webrtc {
-
-class ApmDataDumper;
-
-class SaturatingGainEstimator {
- public:
-  SaturatingGainEstimator();
-  ~SaturatingGainEstimator();
-  void Initialize();
-  void Update(float gain, int num_saturations);
-  float GetGain() const { return saturating_gain_; }
-
- private:
-  float saturating_gain_;
-  int saturating_gain_hold_counter_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(SaturatingGainEstimator);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_LEVEL_CONTROLLER_SATURATING_GAIN_ESTIMATOR_H_
diff --git a/modules/audio_processing/level_controller/signal_classifier.cc b/modules/audio_processing/level_controller/signal_classifier.cc
deleted file mode 100644
index f557730..0000000
--- a/modules/audio_processing/level_controller/signal_classifier.cc
+++ /dev/null
@@ -1,171 +0,0 @@
-/*
- *  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_processing/level_controller/signal_classifier.h"
-
-#include <algorithm>
-#include <numeric>
-#include <vector>
-
-#include "webrtc/api/array_view.h"
-#include "webrtc/modules/audio_processing/audio_buffer.h"
-#include "webrtc/modules/audio_processing/level_controller/down_sampler.h"
-#include "webrtc/modules/audio_processing/level_controller/noise_spectrum_estimator.h"
-#include "webrtc/modules/audio_processing/logging/apm_data_dumper.h"
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace webrtc {
-namespace {
-
-void RemoveDcLevel(rtc::ArrayView<float> x) {
-  RTC_DCHECK_LT(0, x.size());
-  float mean = std::accumulate(x.data(), x.data() + x.size(), 0.f);
-  mean /= x.size();
-
-  for (float& v : x) {
-    v -= mean;
-  }
-}
-
-void PowerSpectrum(const OouraFft* ooura_fft,
-                   rtc::ArrayView<const float> x,
-                   rtc::ArrayView<float> spectrum) {
-  RTC_DCHECK_EQ(65, spectrum.size());
-  RTC_DCHECK_EQ(128, x.size());
-  float X[128];
-  std::copy(x.data(), x.data() + x.size(), X);
-  ooura_fft->Fft(X);
-
-  float* X_p = X;
-  RTC_DCHECK_EQ(X_p, &X[0]);
-  spectrum[0] = (*X_p) * (*X_p);
-  ++X_p;
-  RTC_DCHECK_EQ(X_p, &X[1]);
-  spectrum[64] = (*X_p) * (*X_p);
-  for (int k = 1; k < 64; ++k) {
-    ++X_p;
-    RTC_DCHECK_EQ(X_p, &X[2 * k]);
-    spectrum[k] = (*X_p) * (*X_p);
-    ++X_p;
-    RTC_DCHECK_EQ(X_p, &X[2 * k + 1]);
-    spectrum[k] += (*X_p) * (*X_p);
-  }
-}
-
-webrtc::SignalClassifier::SignalType ClassifySignal(
-    rtc::ArrayView<const float> signal_spectrum,
-    rtc::ArrayView<const float> noise_spectrum,
-    ApmDataDumper* data_dumper) {
-  int num_stationary_bands = 0;
-  int num_highly_nonstationary_bands = 0;
-
-  // Detect stationary and highly nonstationary bands.
-  for (size_t k = 1; k < 40; k++) {
-    if (signal_spectrum[k] < 3 * noise_spectrum[k] &&
-        signal_spectrum[k] * 3 > noise_spectrum[k]) {
-      ++num_stationary_bands;
-    } else if (signal_spectrum[k] > 9 * noise_spectrum[k]) {
-      ++num_highly_nonstationary_bands;
-    }
-  }
-
-  data_dumper->DumpRaw("lc_num_stationary_bands", 1, &num_stationary_bands);
-  data_dumper->DumpRaw("lc_num_highly_nonstationary_bands", 1,
-                       &num_highly_nonstationary_bands);
-
-  // Use the detected number of bands to classify the overall signal
-  // stationarity.
-  if (num_stationary_bands > 15) {
-    return SignalClassifier::SignalType::kStationary;
-  } else if (num_highly_nonstationary_bands > 15) {
-    return SignalClassifier::SignalType::kHighlyNonStationary;
-  } else {
-    return SignalClassifier::SignalType::kNonStationary;
-  }
-}
-
-}  // namespace
-
-SignalClassifier::FrameExtender::FrameExtender(size_t frame_size,
-                                               size_t extended_frame_size)
-    : x_old_(extended_frame_size - frame_size, 0.f) {}
-
-SignalClassifier::FrameExtender::~FrameExtender() = default;
-
-void SignalClassifier::FrameExtender::ExtendFrame(
-    rtc::ArrayView<const float> x,
-    rtc::ArrayView<float> x_extended) {
-  RTC_DCHECK_EQ(x_old_.size() + x.size(), x_extended.size());
-  std::copy(x_old_.data(), x_old_.data() + x_old_.size(), x_extended.data());
-  std::copy(x.data(), x.data() + x.size(), x_extended.data() + x_old_.size());
-  std::copy(x_extended.data() + x_extended.size() - x_old_.size(),
-            x_extended.data() + x_extended.size(), x_old_.data());
-}
-
-SignalClassifier::SignalClassifier(ApmDataDumper* data_dumper)
-    : data_dumper_(data_dumper),
-      down_sampler_(data_dumper_),
-      noise_spectrum_estimator_(data_dumper_) {
-  Initialize(AudioProcessing::kSampleRate48kHz);
-}
-SignalClassifier::~SignalClassifier() {}
-
-void SignalClassifier::Initialize(int sample_rate_hz) {
-  down_sampler_.Initialize(sample_rate_hz);
-  noise_spectrum_estimator_.Initialize();
-  frame_extender_.reset(new FrameExtender(80, 128));
-  sample_rate_hz_ = sample_rate_hz;
-  initialization_frames_left_ = 2;
-  consistent_classification_counter_ = 3;
-  last_signal_type_ = SignalClassifier::SignalType::kNonStationary;
-}
-
-void SignalClassifier::Analyze(const AudioBuffer& audio,
-                               SignalType* signal_type) {
-  RTC_DCHECK_EQ(audio.num_frames(), sample_rate_hz_ / 100);
-
-  // Compute the signal power spectrum.
-  float downsampled_frame[80];
-  down_sampler_.DownSample(rtc::ArrayView<const float>(
-                               audio.channels_const_f()[0], audio.num_frames()),
-                           downsampled_frame);
-  float extended_frame[128];
-  frame_extender_->ExtendFrame(downsampled_frame, extended_frame);
-  RemoveDcLevel(extended_frame);
-  float signal_spectrum[65];
-  PowerSpectrum(&ooura_fft_, extended_frame, signal_spectrum);
-
-  // Classify the signal based on the estimate of the noise spectrum and the
-  // signal spectrum estimate.
-  *signal_type = ClassifySignal(signal_spectrum,
-                                noise_spectrum_estimator_.GetNoiseSpectrum(),
-                                data_dumper_);
-
-  // Update the noise spectrum based on the signal spectrum.
-  noise_spectrum_estimator_.Update(signal_spectrum,
-                                   initialization_frames_left_ > 0);
-
-  // Update the number of frames until a reliable signal spectrum is achieved.
-  initialization_frames_left_ = std::max(0, initialization_frames_left_ - 1);
-
-  if (last_signal_type_ == *signal_type) {
-    consistent_classification_counter_ =
-        std::max(0, consistent_classification_counter_ - 1);
-  } else {
-    last_signal_type_ = *signal_type;
-    consistent_classification_counter_ = 3;
-  }
-
-  if (consistent_classification_counter_ > 0) {
-    *signal_type = SignalClassifier::SignalType::kNonStationary;
-  }
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/level_controller/signal_classifier.h b/modules/audio_processing/level_controller/signal_classifier.h
deleted file mode 100644
index 1ec1951..0000000
--- a/modules/audio_processing/level_controller/signal_classifier.h
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- *  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_PROCESSING_LEVEL_CONTROLLER_SIGNAL_CLASSIFIER_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_LEVEL_CONTROLLER_SIGNAL_CLASSIFIER_H_
-
-#include <memory>
-#include <vector>
-
-#include "webrtc/api/array_view.h"
-#include "webrtc/modules/audio_processing/level_controller/down_sampler.h"
-#include "webrtc/modules/audio_processing/level_controller/noise_spectrum_estimator.h"
-#include "webrtc/modules/audio_processing/utility/ooura_fft.h"
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace webrtc {
-
-class ApmDataDumper;
-class AudioBuffer;
-
-class SignalClassifier {
- public:
-  enum class SignalType { kHighlyNonStationary, kNonStationary, kStationary };
-
-  explicit SignalClassifier(ApmDataDumper* data_dumper);
-  ~SignalClassifier();
-
-  void Initialize(int sample_rate_hz);
-  void Analyze(const AudioBuffer& audio, SignalType* signal_type);
-
- private:
-  class FrameExtender {
-   public:
-    FrameExtender(size_t frame_size, size_t extended_frame_size);
-    ~FrameExtender();
-
-    void ExtendFrame(rtc::ArrayView<const float> x,
-                     rtc::ArrayView<float> x_extended);
-
-   private:
-    std::vector<float> x_old_;
-
-    RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(FrameExtender);
-  };
-
-  ApmDataDumper* const data_dumper_;
-  DownSampler down_sampler_;
-  std::unique_ptr<FrameExtender> frame_extender_;
-  NoiseSpectrumEstimator noise_spectrum_estimator_;
-  int sample_rate_hz_;
-  int initialization_frames_left_;
-  int consistent_classification_counter_;
-  SignalType last_signal_type_;
-  const OouraFft ooura_fft_;
-  RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(SignalClassifier);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_LEVEL_CONTROLLER_SIGNAL_CLASSIFIER_H_
diff --git a/modules/audio_processing/level_estimator_impl.cc b/modules/audio_processing/level_estimator_impl.cc
deleted file mode 100644
index 27a6137..0000000
--- a/modules/audio_processing/level_estimator_impl.cc
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- *  Copyright (c) 2012 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_processing/level_estimator_impl.h"
-
-#include "webrtc/api/array_view.h"
-#include "webrtc/modules/audio_processing/audio_buffer.h"
-#include "webrtc/modules/audio_processing/rms_level.h"
-
-namespace webrtc {
-
-LevelEstimatorImpl::LevelEstimatorImpl(rtc::CriticalSection* crit)
-    : crit_(crit), rms_(new RmsLevel()) {
-  RTC_DCHECK(crit);
-}
-
-LevelEstimatorImpl::~LevelEstimatorImpl() {}
-
-void LevelEstimatorImpl::Initialize() {
-  rtc::CritScope cs(crit_);
-  rms_->Reset();
-}
-
-void LevelEstimatorImpl::ProcessStream(AudioBuffer* audio) {
-  RTC_DCHECK(audio);
-  rtc::CritScope cs(crit_);
-  if (!enabled_) {
-    return;
-  }
-
-  for (size_t i = 0; i < audio->num_channels(); i++) {
-    rms_->Analyze(rtc::ArrayView<const int16_t>(audio->channels_const()[i],
-                                                audio->num_frames()));
-  }
-}
-
-int LevelEstimatorImpl::Enable(bool enable) {
-  rtc::CritScope cs(crit_);
-  if (enable && !enabled_) {
-    rms_->Reset();
-  }
-  enabled_ = enable;
-  return AudioProcessing::kNoError;
-}
-
-bool LevelEstimatorImpl::is_enabled() const {
-  rtc::CritScope cs(crit_);
-  return enabled_;
-}
-
-int LevelEstimatorImpl::RMS() {
-  rtc::CritScope cs(crit_);
-  if (!enabled_) {
-    return AudioProcessing::kNotEnabledError;
-  }
-
-  return rms_->Average();
-}
-}  // namespace webrtc
diff --git a/modules/audio_processing/level_estimator_impl.h b/modules/audio_processing/level_estimator_impl.h
deleted file mode 100644
index 68b1932..0000000
--- a/modules/audio_processing/level_estimator_impl.h
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- *  Copyright (c) 2012 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_PROCESSING_LEVEL_ESTIMATOR_IMPL_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_LEVEL_ESTIMATOR_IMPL_H_
-
-#include <memory>
-
-#include "webrtc/modules/audio_processing/include/audio_processing.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/criticalsection.h"
-
-namespace webrtc {
-
-class AudioBuffer;
-class RmsLevel;
-
-class LevelEstimatorImpl : public LevelEstimator {
- public:
-  explicit LevelEstimatorImpl(rtc::CriticalSection* crit);
-  ~LevelEstimatorImpl() override;
-
-  // TODO(peah): Fold into ctor, once public API is removed.
-  void Initialize();
-  void ProcessStream(AudioBuffer* audio);
-
-  // LevelEstimator implementation.
-  int Enable(bool enable) override;
-  bool is_enabled() const override;
-  int RMS() override;
-
- private:
-  rtc::CriticalSection* const crit_ = nullptr;
-  bool enabled_ RTC_GUARDED_BY(crit_) = false;
-  std::unique_ptr<RmsLevel> rms_ RTC_GUARDED_BY(crit_);
-  RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(LevelEstimatorImpl);
-};
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_LEVEL_ESTIMATOR_IMPL_H_
diff --git a/modules/audio_processing/level_estimator_unittest.cc b/modules/audio_processing/level_estimator_unittest.cc
deleted file mode 100644
index a1ba5a2..0000000
--- a/modules/audio_processing/level_estimator_unittest.cc
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- *  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 <vector>
-
-#include "webrtc/api/array_view.h"
-#include "webrtc/modules/audio_processing/audio_buffer.h"
-#include "webrtc/modules/audio_processing/level_estimator_impl.h"
-#include "webrtc/modules/audio_processing/test/audio_buffer_tools.h"
-#include "webrtc/modules/audio_processing/test/bitexactness_tools.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-namespace {
-
-const int kNumFramesToProcess = 1000;
-
-// Processes a specified amount of frames, verifies the results and reports
-// any errors.
-void RunBitexactnessTest(int sample_rate_hz,
-                         size_t num_channels,
-                         int rms_reference) {
-  rtc::CriticalSection crit_capture;
-  LevelEstimatorImpl level_estimator(&crit_capture);
-  level_estimator.Initialize();
-  level_estimator.Enable(true);
-
-  int samples_per_channel = rtc::CheckedDivExact(sample_rate_hz, 100);
-  StreamConfig capture_config(sample_rate_hz, num_channels, false);
-  AudioBuffer capture_buffer(
-      capture_config.num_frames(), capture_config.num_channels(),
-      capture_config.num_frames(), capture_config.num_channels(),
-      capture_config.num_frames());
-
-  test::InputAudioFile capture_file(
-      test::GetApmCaptureTestVectorFileName(sample_rate_hz));
-  std::vector<float> capture_input(samples_per_channel * num_channels);
-  for (size_t frame_no = 0; frame_no < kNumFramesToProcess; ++frame_no) {
-    ReadFloatSamplesFromStereoFile(samples_per_channel, num_channels,
-                                   &capture_file, capture_input);
-
-    test::CopyVectorToAudioBuffer(capture_config, capture_input,
-                                  &capture_buffer);
-
-    level_estimator.ProcessStream(&capture_buffer);
-  }
-
-  // Extract test results.
-  int rms = level_estimator.RMS();
-
-  // Compare the output to the reference.
-  EXPECT_EQ(rms_reference, rms);
-}
-
-}  // namespace
-
-TEST(LevelEstimatorBitExactnessTest, Mono8kHz) {
-  const int kRmsReference = 31;
-
-  RunBitexactnessTest(8000, 1, kRmsReference);
-}
-
-TEST(LevelEstimatorBitExactnessTest, Mono16kHz) {
-  const int kRmsReference = 31;
-
-  RunBitexactnessTest(16000, 1, kRmsReference);
-}
-
-TEST(LevelEstimatorBitExactnessTest, Mono32kHz) {
-  const int kRmsReference = 31;
-
-  RunBitexactnessTest(32000, 1, kRmsReference);
-}
-
-TEST(LevelEstimatorBitExactnessTest, Mono48kHz) {
-  const int kRmsReference = 31;
-
-  RunBitexactnessTest(48000, 1, kRmsReference);
-}
-
-TEST(LevelEstimatorBitExactnessTest, Stereo16kHz) {
-  const int kRmsReference = 30;
-
-  RunBitexactnessTest(16000, 2, kRmsReference);
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/logging/apm_data_dumper.cc b/modules/audio_processing/logging/apm_data_dumper.cc
deleted file mode 100644
index 719dd05..0000000
--- a/modules/audio_processing/logging/apm_data_dumper.cc
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- *  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_processing/logging/apm_data_dumper.h"
-
-#include <sstream>
-
-#include "webrtc/rtc_base/stringutils.h"
-
-// Check to verify that the define is properly set.
-#if !defined(WEBRTC_APM_DEBUG_DUMP) || \
-    (WEBRTC_APM_DEBUG_DUMP != 0 && WEBRTC_APM_DEBUG_DUMP != 1)
-#error "Set WEBRTC_APM_DEBUG_DUMP to either 0 or 1"
-#endif
-
-namespace webrtc {
-
-namespace {
-
-#if WEBRTC_APM_DEBUG_DUMP == 1
-std::string FormFileName(const char* name,
-                         int instance_index,
-                         int reinit_index,
-                         const std::string& suffix) {
-  std::stringstream ss;
-  ss << name << "_" << instance_index << "-" << reinit_index << suffix;
-  return ss.str();
-}
-#endif
-
-}  // namespace
-
-#if WEBRTC_APM_DEBUG_DUMP == 1
-ApmDataDumper::ApmDataDumper(int instance_index)
-    : instance_index_(instance_index) {}
-#else
-ApmDataDumper::ApmDataDumper(int instance_index) {}
-#endif
-
-ApmDataDumper::~ApmDataDumper() {}
-
-#if WEBRTC_APM_DEBUG_DUMP == 1
-FILE* ApmDataDumper::GetRawFile(const char* name) {
-  std::string filename =
-      FormFileName(name, instance_index_, recording_set_index_, ".dat");
-  auto& f = raw_files_[filename];
-  if (!f) {
-    f.reset(fopen(filename.c_str(), "wb"));
-  }
-  return f.get();
-}
-
-WavWriter* ApmDataDumper::GetWavFile(const char* name,
-                                     int sample_rate_hz,
-                                     int num_channels) {
-  std::string filename =
-      FormFileName(name, instance_index_, recording_set_index_, ".wav");
-  auto& f = wav_files_[filename];
-  if (!f) {
-    f.reset(new WavWriter(filename.c_str(), sample_rate_hz, num_channels));
-  }
-  return f.get();
-}
-
-#endif
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/logging/apm_data_dumper.h b/modules/audio_processing/logging/apm_data_dumper.h
deleted file mode 100644
index 34213a7..0000000
--- a/modules/audio_processing/logging/apm_data_dumper.h
+++ /dev/null
@@ -1,212 +0,0 @@
-/*
- *  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_PROCESSING_LOGGING_APM_DATA_DUMPER_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_LOGGING_APM_DATA_DUMPER_H_
-
-#include <stdio.h>
-
-#include <memory>
-#include <string>
-#include <unordered_map>
-
-#include "webrtc/api/array_view.h"
-#include "webrtc/common_audio/wav_file.h"
-#include "webrtc/rtc_base/constructormagic.h"
-
-// Check to verify that the define is properly set.
-#if !defined(WEBRTC_APM_DEBUG_DUMP) || \
-    (WEBRTC_APM_DEBUG_DUMP != 0 && WEBRTC_APM_DEBUG_DUMP != 1)
-#error "Set WEBRTC_APM_DEBUG_DUMP to either 0 or 1"
-#endif
-
-namespace webrtc {
-
-#if WEBRTC_APM_DEBUG_DUMP == 1
-// Functor used to use as a custom deleter in the map of file pointers to raw
-// files.
-struct RawFileCloseFunctor {
-  void operator()(FILE* f) const { fclose(f); }
-};
-#endif
-
-// Class that handles dumping of variables into files.
-class ApmDataDumper {
- public:
-  // Constructor that takes an instance index that may
-  // be used to distinguish data dumped from different
-  // instances of the code.
-  explicit ApmDataDumper(int instance_index);
-
-  ~ApmDataDumper();
-
-  // Reinitializes the data dumping such that new versions
-  // of all files being dumped to are created.
-  void InitiateNewSetOfRecordings() {
-#if WEBRTC_APM_DEBUG_DUMP == 1
-    ++recording_set_index_;
-#endif
-  }
-
-  // Methods for performing dumping of data of various types into
-  // various formats.
-  void DumpRaw(const char* name, double v) {
-#if WEBRTC_APM_DEBUG_DUMP == 1
-    FILE* file = GetRawFile(name);
-    fwrite(&v, sizeof(v), 1, file);
-#endif
-  }
-
-  void DumpRaw(const char* name, size_t v_length, const double* v) {
-#if WEBRTC_APM_DEBUG_DUMP == 1
-    FILE* file = GetRawFile(name);
-    fwrite(v, sizeof(v[0]), v_length, file);
-#endif
-  }
-
-  void DumpRaw(const char* name, rtc::ArrayView<const double> v) {
-#if WEBRTC_APM_DEBUG_DUMP == 1
-    DumpRaw(name, v.size(), v.data());
-#endif
-  }
-
-  void DumpRaw(const char* name, float v) {
-#if WEBRTC_APM_DEBUG_DUMP == 1
-    FILE* file = GetRawFile(name);
-    fwrite(&v, sizeof(v), 1, file);
-#endif
-  }
-
-  void DumpRaw(const char* name, size_t v_length, const float* v) {
-#if WEBRTC_APM_DEBUG_DUMP == 1
-    FILE* file = GetRawFile(name);
-    fwrite(v, sizeof(v[0]), v_length, file);
-#endif
-  }
-
-  void DumpRaw(const char* name, rtc::ArrayView<const float> v) {
-#if WEBRTC_APM_DEBUG_DUMP == 1
-    DumpRaw(name, v.size(), v.data());
-#endif
-  }
-
-  void DumpRaw(const char* name, bool v) {
-#if WEBRTC_APM_DEBUG_DUMP == 1
-    DumpRaw(name, static_cast<int16_t>(v));
-#endif
-  }
-
-  void DumpRaw(const char* name, size_t v_length, const bool* v) {
-#if WEBRTC_APM_DEBUG_DUMP == 1
-    FILE* file = GetRawFile(name);
-    for (size_t k = 0; k < v_length; ++k) {
-      int16_t value = static_cast<int16_t>(v[k]);
-      fwrite(&value, sizeof(value), 1, file);
-    }
-#endif
-  }
-
-  void DumpRaw(const char* name, rtc::ArrayView<const bool> v) {
-#if WEBRTC_APM_DEBUG_DUMP == 1
-    DumpRaw(name, v.size(), v.data());
-#endif
-  }
-
-  void DumpRaw(const char* name, int16_t v) {
-#if WEBRTC_APM_DEBUG_DUMP == 1
-    FILE* file = GetRawFile(name);
-    fwrite(&v, sizeof(v), 1, file);
-#endif
-  }
-
-  void DumpRaw(const char* name, size_t v_length, const int16_t* v) {
-#if WEBRTC_APM_DEBUG_DUMP == 1
-    FILE* file = GetRawFile(name);
-    fwrite(v, sizeof(v[0]), v_length, file);
-#endif
-  }
-
-  void DumpRaw(const char* name, rtc::ArrayView<const int16_t> v) {
-#if WEBRTC_APM_DEBUG_DUMP == 1
-    DumpRaw(name, v.size(), v.data());
-#endif
-  }
-
-  void DumpRaw(const char* name, int32_t v) {
-#if WEBRTC_APM_DEBUG_DUMP == 1
-    FILE* file = GetRawFile(name);
-    fwrite(&v, sizeof(v), 1, file);
-#endif
-  }
-
-  void DumpRaw(const char* name, size_t v_length, const int32_t* v) {
-#if WEBRTC_APM_DEBUG_DUMP == 1
-    FILE* file = GetRawFile(name);
-    fwrite(v, sizeof(v[0]), v_length, file);
-#endif
-  }
-
-  void DumpRaw(const char* name, size_t v) {
-#if WEBRTC_APM_DEBUG_DUMP == 1
-    FILE* file = GetRawFile(name);
-    fwrite(&v, sizeof(v), 1, file);
-#endif
-  }
-
-  void DumpRaw(const char* name, size_t v_length, const size_t* v) {
-#if WEBRTC_APM_DEBUG_DUMP == 1
-    FILE* file = GetRawFile(name);
-    fwrite(v, sizeof(v[0]), v_length, file);
-#endif
-  }
-
-  void DumpRaw(const char* name, rtc::ArrayView<const int32_t> v) {
-#if WEBRTC_APM_DEBUG_DUMP == 1
-    DumpRaw(name, v.size(), v.data());
-#endif
-  }
-
-  void DumpWav(const char* name,
-               size_t v_length,
-               const float* v,
-               int sample_rate_hz,
-               int num_channels) {
-#if WEBRTC_APM_DEBUG_DUMP == 1
-    WavWriter* file = GetWavFile(name, sample_rate_hz, num_channels);
-    file->WriteSamples(v, v_length);
-#endif
-  }
-
-  void DumpWav(const char* name,
-               rtc::ArrayView<const float> v,
-               int sample_rate_hz,
-               int num_channels) {
-#if WEBRTC_APM_DEBUG_DUMP == 1
-    DumpWav(name, v.size(), v.data(), sample_rate_hz, num_channels);
-#endif
-  }
-
- private:
-#if WEBRTC_APM_DEBUG_DUMP == 1
-  const int instance_index_;
-  int recording_set_index_ = 0;
-  std::unordered_map<std::string, std::unique_ptr<FILE, RawFileCloseFunctor>>
-      raw_files_;
-  std::unordered_map<std::string, std::unique_ptr<WavWriter>> wav_files_;
-
-  FILE* GetRawFile(const char* name);
-  WavWriter* GetWavFile(const char* name, int sample_rate_hz, int num_channels);
-#endif
-  RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(ApmDataDumper);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_LOGGING_APM_DATA_DUMPER_H_
diff --git a/modules/audio_processing/low_cut_filter.cc b/modules/audio_processing/low_cut_filter.cc
deleted file mode 100644
index b111259..0000000
--- a/modules/audio_processing/low_cut_filter.cc
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- *  Copyright (c) 2012 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_processing/low_cut_filter.h"
-
-#include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
-#include "webrtc/modules/audio_processing/audio_buffer.h"
-
-namespace webrtc {
-namespace {
-const int16_t kFilterCoefficients8kHz[5] = {3798, -7596, 3798, 7807, -3733};
-const int16_t kFilterCoefficients[5] = {4012, -8024, 4012, 8002, -3913};
-}  // namespace
-
-class LowCutFilter::BiquadFilter {
- public:
-  explicit BiquadFilter(int sample_rate_hz)
-      : ba_(sample_rate_hz == AudioProcessing::kSampleRate8kHz
-                ? kFilterCoefficients8kHz
-                : kFilterCoefficients) {
-    std::memset(x_, 0, sizeof(x_));
-    std::memset(y_, 0, sizeof(y_));
-  }
-
-  void Process(int16_t* data, size_t length) {
-    const int16_t* const ba = ba_;
-    int16_t* x = x_;
-    int16_t* y = y_;
-    int32_t tmp_int32 = 0;
-
-    for (size_t i = 0; i < length; i++) {
-      //  y[i] = b[0] * x[i] +  b[1] * x[i-1] +  b[2] * x[i-2]
-      //                     + -a[1] * y[i-1] + -a[2] * y[i-2];
-
-      tmp_int32 = y[1] * ba[3];   // -a[1] * y[i-1] (low part)
-      tmp_int32 += y[3] * ba[4];  // -a[2] * y[i-2] (low part)
-      tmp_int32 = (tmp_int32 >> 15);
-      tmp_int32 += y[0] * ba[3];  // -a[1] * y[i-1] (high part)
-      tmp_int32 += y[2] * ba[4];  // -a[2] * y[i-2] (high part)
-      tmp_int32 *= 2;
-
-      tmp_int32 += data[i] * ba[0];  // b[0] * x[0]
-      tmp_int32 += x[0] * ba[1];     // b[1] * x[i-1]
-      tmp_int32 += x[1] * ba[2];     // b[2] * x[i-2]
-
-      // Update state (input part).
-      x[1] = x[0];
-      x[0] = data[i];
-
-      // Update state (filtered part).
-      y[2] = y[0];
-      y[3] = y[1];
-      y[0] = static_cast<int16_t>(tmp_int32 >> 13);
-
-      y[1] = static_cast<int16_t>((tmp_int32 & 0x00001FFF) * 4);
-
-      // Rounding in Q12, i.e. add 2^11.
-      tmp_int32 += 2048;
-
-      // Saturate (to 2^27) so that the HP filtered signal does not overflow.
-      tmp_int32 = WEBRTC_SPL_SAT(static_cast<int32_t>(134217727), tmp_int32,
-                                 static_cast<int32_t>(-134217728));
-
-      // Convert back to Q0 and use rounding.
-      data[i] = static_cast<int16_t>(tmp_int32 >> 12);
-    }
-  }
-
- private:
-  const int16_t* const ba_ = nullptr;
-  int16_t x_[2];
-  int16_t y_[4];
-};
-
-LowCutFilter::LowCutFilter(size_t channels, int sample_rate_hz) {
-  filters_.resize(channels);
-  for (size_t i = 0; i < channels; i++) {
-    filters_[i].reset(new BiquadFilter(sample_rate_hz));
-  }
-}
-
-LowCutFilter::~LowCutFilter() {}
-
-void LowCutFilter::Process(AudioBuffer* audio) {
-  RTC_DCHECK(audio);
-  RTC_DCHECK_GE(160, audio->num_frames_per_band());
-  RTC_DCHECK_EQ(filters_.size(), audio->num_channels());
-  for (size_t i = 0; i < filters_.size(); i++) {
-    filters_[i]->Process(audio->split_bands(i)[kBand0To8kHz],
-                         audio->num_frames_per_band());
-  }
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/low_cut_filter.h b/modules/audio_processing/low_cut_filter.h
deleted file mode 100644
index 047bcac..0000000
--- a/modules/audio_processing/low_cut_filter.h
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- *  Copyright (c) 2012 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_PROCESSING_LOW_CUT_FILTER_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_LOW_CUT_FILTER_H_
-
-#include <memory>
-#include <vector>
-
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace webrtc {
-
-class AudioBuffer;
-
-class LowCutFilter {
- public:
-  LowCutFilter(size_t channels, int sample_rate_hz);
-  ~LowCutFilter();
-  void Process(AudioBuffer* audio);
-
- private:
-  class BiquadFilter;
-  std::vector<std::unique_ptr<BiquadFilter>> filters_;
-  RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(LowCutFilter);
-};
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_LOW_CUT_FILTER_H_
diff --git a/modules/audio_processing/low_cut_filter_unittest.cc b/modules/audio_processing/low_cut_filter_unittest.cc
deleted file mode 100644
index d1081a4..0000000
--- a/modules/audio_processing/low_cut_filter_unittest.cc
+++ /dev/null
@@ -1,682 +0,0 @@
-/*
- *  Copyright (c) 2015 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 <vector>
-
-#include "webrtc/api/array_view.h"
-#include "webrtc/modules/audio_processing/audio_buffer.h"
-#include "webrtc/modules/audio_processing/low_cut_filter.h"
-#include "webrtc/modules/audio_processing/test/audio_buffer_tools.h"
-#include "webrtc/modules/audio_processing/test/bitexactness_tools.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-namespace {
-
-// Process one frame of data and produce the output.
-std::vector<float> ProcessOneFrame(const std::vector<float>& frame_input,
-                                   const StreamConfig& stream_config,
-                                   LowCutFilter* low_cut_filter) {
-  AudioBuffer audio_buffer(
-      stream_config.num_frames(), stream_config.num_channels(),
-      stream_config.num_frames(), stream_config.num_channels(),
-      stream_config.num_frames());
-
-  test::CopyVectorToAudioBuffer(stream_config, frame_input, &audio_buffer);
-  low_cut_filter->Process(&audio_buffer);
-  std::vector<float> frame_output;
-  test::ExtractVectorFromAudioBuffer(stream_config, &audio_buffer,
-                                     &frame_output);
-  return frame_output;
-}
-
-// Processes a specified amount of frames, verifies the results and reports
-// any errors.
-void RunBitexactnessTest(int sample_rate,
-                         int num_channels,
-                         const std::vector<float>& input,
-                         const std::vector<float>& reference) {
-  const StreamConfig stream_config(sample_rate, num_channels, false);
-  LowCutFilter low_cut_filter(num_channels, sample_rate);
-
-  std::vector<float> output;
-  const size_t num_frames_to_process =
-      input.size() /
-      (stream_config.num_frames() * stream_config.num_channels());
-  for (size_t frame_no = 0; frame_no < num_frames_to_process; ++frame_no) {
-    std::vector<float> frame_input(
-        input.begin() +
-            stream_config.num_frames() * stream_config.num_channels() *
-                frame_no,
-        input.begin() +
-            stream_config.num_frames() * stream_config.num_channels() *
-                (frame_no + 1));
-
-    output = ProcessOneFrame(frame_input, stream_config, &low_cut_filter);
-  }
-
-  // Form vector to compare the reference to. Only the last frame processed
-  // is compared in order not having to specify all preceeding frames as
-  // inputs. As the algorithm being tested has a memory, testing only
-  // the last frame implicitly also tests the preceeding frames.
-  const size_t reference_frame_length =
-      reference.size() / stream_config.num_channels();
-  std::vector<float> output_to_verify;
-  for (size_t channel_no = 0; channel_no < stream_config.num_channels();
-       ++channel_no) {
-    output_to_verify.insert(
-        output_to_verify.end(),
-        output.begin() + channel_no * stream_config.num_frames(),
-        output.begin() + channel_no * stream_config.num_frames() +
-            reference_frame_length);
-  }
-
-  const float kElementErrorBound = 1.0f / 32768.0f;
-  EXPECT_TRUE(test::VerifyDeinterleavedArray(
-      reference_frame_length, num_channels, reference, output_to_verify,
-      kElementErrorBound));
-}
-
-// Method for forming a vector out of an array.
-// TODO(peah): Remove once braced initialization is allowed.
-std::vector<float> CreateVector(const rtc::ArrayView<const float>& array_view) {
-  std::vector<float> v;
-  for (auto value : array_view) {
-    v.push_back(value);
-  }
-  return v;
-}
-}  // namespace
-
-TEST(LowCutFilterBitExactnessTest, Mono8kHzInitial) {
-  const float kReferenceInput[] = {
-      0.153442f,  -0.436920f, -0.057602f, -0.141767f, 0.108608f,  0.116834f,
-      0.114979f,  -0.103151f, -0.169925f, -0.167180f, 0.242024f,  -0.525426f,
-      -0.058781f, 0.076667f,  -0.185095f, 0.135319f,  -0.020223f, -0.266058f,
-      0.045755f,  -0.076044f, -0.116221f, -0.201698f, 0.017423f,  -0.523475f,
-      -0.112949f, -0.154125f, -0.258572f, 0.185075f,  -0.208205f, 0.153298f,
-      0.276703f,  -0.044481f, 0.078771f,  0.181337f,  -0.022962f, 0.153365f,
-      -0.358004f, 0.314864f,  -0.280593f, -0.518572f, 0.392579f,  -0.017786f,
-      0.127293f,  -0.103003f, -0.289389f, -0.871355f, 0.177583f,  -0.081290f,
-      -0.055957f, 0.115011f,  -0.402460f, -0.206836f, 0.325328f,  0.169526f,
-      -0.363311f, -0.624742f, -0.161979f, 0.060679f,  0.267214f,  0.026576f,
-      -0.318235f, 0.086812f,  -0.332419f, -0.272485f, -0.185369f, -0.348598f,
-      -0.076833f, -0.255184f, -0.081007f, -0.131121f, -0.116196f, -0.142780f,
-      0.349705f,  0.173054f,  0.016750f,  -0.415957f, -0.461001f, -0.557111f,
-      0.738711f,  0.275720f};
-
-  const float kReference[] = {0.142277f,  -0.418518f, -0.028229f, -0.102112f,
-                              0.141270f,  0.137791f,  0.124577f,  -0.088715f,
-                              -0.142273f, -0.125885f, 0.266640f,  -0.468079f};
-
-  RunBitexactnessTest(
-      8000, 1, CreateVector(rtc::ArrayView<const float>(kReferenceInput)),
-      CreateVector(rtc::ArrayView<const float>(kReference)));
-}
-
-TEST(LowCutFilterBitExactnessTest, Mono8kHzConverged) {
-  const float kReferenceInput[] = {
-      0.153442f,  -0.436920f, -0.057602f, -0.141767f, 0.108608f,  0.116834f,
-      0.114979f,  -0.103151f, -0.169925f, -0.167180f, 0.242024f,  -0.525426f,
-      -0.058781f, 0.076667f,  -0.185095f, 0.135319f,  -0.020223f, -0.266058f,
-      0.045755f,  -0.076044f, -0.116221f, -0.201698f, 0.017423f,  -0.523475f,
-      -0.112949f, -0.154125f, -0.258572f, 0.185075f,  -0.208205f, 0.153298f,
-      0.276703f,  -0.044481f, 0.078771f,  0.181337f,  -0.022962f, 0.153365f,
-      -0.358004f, 0.314864f,  -0.280593f, -0.518572f, 0.392579f,  -0.017786f,
-      0.127293f,  -0.103003f, -0.289389f, -0.871355f, 0.177583f,  -0.081290f,
-      -0.055957f, 0.115011f,  -0.402460f, -0.206836f, 0.325328f,  0.169526f,
-      -0.363311f, -0.624742f, -0.161979f, 0.060679f,  0.267214f,  0.026576f,
-      -0.318235f, 0.086812f,  -0.332419f, -0.272485f, -0.185369f, -0.348598f,
-      -0.076833f, -0.255184f, -0.081007f, -0.131121f, -0.116196f, -0.142780f,
-      0.349705f,  0.173054f,  0.016750f,  -0.415957f, -0.461001f, -0.557111f,
-      0.738711f,  0.275720f,  0.072868f,  -0.276249f, -0.325055f, 0.155285f,
-      0.443784f,  -0.480153f, -0.127428f, -0.023901f, -0.564837f, 0.238538f,
-      -0.117578f, 0.542205f,  -0.110840f, 0.116025f,  -0.323939f, -0.177182f,
-      -0.331395f, 0.111316f,  0.369140f,  -0.168329f, 0.123736f,  -0.143013f,
-      0.028953f,  0.339200f,  0.034107f,  -0.294000f, -0.243034f, -0.048168f,
-      -0.054348f, -0.245504f, 0.051228f,  0.359128f,  -0.071220f, -0.058006f,
-      -0.624248f, -0.219615f, -0.395067f, -0.109518f, 0.149032f,  0.431928f,
-      0.509968f,  -0.033143f, -0.090793f, 0.231809f,  0.138986f,  0.216989f,
-      0.220683f,  -0.419745f, 0.153222f,  -0.025956f, -0.215572f, -0.196671f,
-      0.363361f,  -0.229604f, -0.350704f, 0.060875f,  0.570160f,  0.007246f,
-      0.087419f,  -0.266043f, 0.474729f,  0.035441f,  0.150312f,  -0.269962f,
-      0.242166f,  0.110343f,  -0.327788f, 0.011268f,  -0.127769f, 0.030978f,
-      -0.071045f, -0.053847f, -0.292886f, -0.091670f, 0.217351f,  0.494707f,
-      -0.329069f, 0.674122f,  0.432724f,  0.047781f,  -0.085408f, -0.198105f,
-      0.236135f,  -0.196957f, -0.130968f, 0.250552f,  0.123613f,  0.254275f,
-      0.143118f,  -0.113676f, -0.145703f, 0.225812f,  -0.190318f, 0.336481f,
-      0.224206f,  0.081584f,  0.000915f,  0.103672f,  1.000000f,  -0.031882f,
-      -0.441377f, 0.543033f,  0.172924f,  -0.183717f, 0.742153f,  0.156224f,
-      0.083422f,  -0.220560f, -0.301964f, -0.501439f, -0.119920f, -0.298610f,
-      0.183673f,  -0.090064f, 0.501603f,  0.428330f,  0.046506f,  -0.080178f,
-      0.326700f,  -0.325096f, 0.191029f,  -0.189729f, -0.113513f, -0.190492f,
-      0.163221f,  -0.220631f, -0.301576f, 0.156799f,  -0.120065f, 0.102529f,
-      -0.099779f, 0.076429f,  -0.727157f, 0.132097f,  0.525583f,  0.294694f,
-      0.258287f,  -0.067977f, 0.051323f,  0.069258f,  0.027332f,  -0.235482f,
-      -0.099882f, -0.049558f, -0.136291f, 0.237288f,  0.719757f,  -0.375235f,
-      0.036391f,  -0.408991f, 0.369330f,  0.399785f,  -0.471419f, 0.551138f,
-      -0.307569f, 0.064315f,  0.311605f,  0.041736f,  0.650943f,  0.780496f};
-
-  const float kReference[] = {-0.173553f, -0.265778f, 0.158757f,  -0.259399f,
-                              -0.176361f, 0.192877f,  0.056825f,  0.171453f,
-                              0.050752f,  -0.194580f, -0.208679f, 0.153722f};
-
-  RunBitexactnessTest(
-      8000, 1, CreateVector(rtc::ArrayView<const float>(kReferenceInput)),
-      CreateVector(rtc::ArrayView<const float>(kReference)));
-}
-
-TEST(LowCutFilterBitExactnessTest, Stereo8kHzInitial) {
-  const float kReferenceInput[] = {
-      0.790847f,  0.165037f,  0.165494f,  0.709852f,  -0.930269f, 0.770840f,
-      -0.184538f, -0.927236f, 0.492296f,  -0.690342f, -0.712183f, 0.211918f,
-      -0.491038f, -0.351692f, -0.196418f, -0.187253f, -0.227618f, 0.219604f,
-      -0.666219f, -0.623816f, -0.810742f, -0.353627f, 0.539194f,  -0.531764f,
-      0.480731f,  0.385637f,  0.648156f,  0.655955f,  -0.413264f, -0.381262f,
-      0.046060f,  -0.349402f, 0.663685f,  0.620590f,  0.113997f,  -0.474072f,
-      0.361132f,  -0.532694f, -0.087149f, -0.230866f, 0.077203f,  0.983407f,
-      0.510441f,  0.960910f,  -0.530435f, 0.057118f,  -0.897128f, 0.513751f,
-      0.203960f,  0.714337f,  0.976554f,  0.858969f,  -0.180970f, -0.999317f,
-      0.081757f,  -0.584539f, -0.561433f, -0.348387f, -0.808101f, 0.495067f,
-      0.497018f,  0.086599f,  -0.323735f, 0.664667f,  0.105144f,  0.915086f,
-      0.785667f,  -0.286993f, 0.092804f,  -0.306636f, 0.245606f,  0.593249f,
-      0.491750f,  -0.748928f, 0.644788f,  -0.949699f, -0.171142f, 0.462815f,
-      0.562748f,  -0.265428f, 0.489736f,  0.784534f,  -0.514793f, -0.740806f,
-      -0.549864f, -0.299972f, -0.425831f, 0.854976f,  -0.897372f, 0.185334f,
-      -0.674202f, 0.676812f,  -0.664878f, 0.004401f,  0.998659f,  -0.289186f,
-      -0.905845f, -0.572679f, -0.204322f, -0.332664f, -0.540795f, 0.872240f,
-      0.366378f,  0.924228f,  -0.124054f, 0.880673f,  -0.988331f, 0.220614f,
-      0.602152f,  -0.534037f, 0.864937f,  0.526526f,  0.652899f,  0.146927f,
-      0.585163f,  -0.341918f, -0.553076f, -0.375227f, 0.169047f,  0.659828f,
-      -0.419075f, -0.194891f, 0.724115f,  0.229479f,  0.982376f,  -0.592602f,
-      0.654418f,  0.351723f,  -0.502101f, -0.048429f, -0.201850f, 0.198876f,
-      0.601046f,  -0.789862f, 0.642884f,  0.682173f,  -0.290988f, -0.139861f,
-      0.144478f,  0.401649f,  0.484940f,  0.515768f,  -0.221742f, -0.141395f,
-      0.912689f,  0.145943f,  0.699444f,  -0.447309f, 0.244647f,  0.176723f,
-      0.926937f,  -0.828195f, 0.000998f,  0.043179f,  -0.819668f, 0.809333f,
-      0.768778f,  -0.122021f, 0.563445f,  -0.703070f};
-
-  const float kReference[] = {
-      0.733329f,  0.084109f,  0.072695f,  0.566210f,  -1.000000f, 0.652120f,
-      -0.297424f, -0.964020f, 0.438551f,  -0.698364f, -0.654449f, 0.266243f,
-      0.454115f,  0.684774f,  -0.586823f, -0.747345f, -0.503021f, -0.222961f,
-      -0.314972f, 0.907224f,  -0.796265f, 0.284280f,  -0.533417f, 0.773980f};
-
-  RunBitexactnessTest(
-      8000, 2, CreateVector(rtc::ArrayView<const float>(kReferenceInput)),
-      CreateVector(rtc::ArrayView<const float>(kReference)));
-}
-
-TEST(LowCutFilterBitExactnessTest, Stereo8kHzConverged) {
-  const float kReferenceInput[] = {
-      -0.502095f, -0.227154f, -0.137133f, 0.661773f,  0.649294f,  -0.094003f,
-      -0.238880f, 0.851737f,  0.481687f,  0.475266f,  0.893832f,  0.020199f,
-      0.583758f,  -0.095653f, 0.698397f,  -0.219138f, 0.476753f,  0.952877f,
-      0.046598f,  -0.140169f, -0.585684f, -0.353197f, -0.778260f, -0.249580f,
-      -0.340192f, -0.315790f, 0.634238f,  0.063371f,  0.042244f,  0.548619f,
-      -0.759474f, 0.250900f,  -0.306703f, -0.330761f, 0.149233f,  0.727875f,
-      -0.602874f, 0.344902f,  0.803663f,  -0.601686f, -0.403432f, -0.006959f,
-      0.779808f,  0.002829f,  -0.446010f, 0.067916f,  0.148499f,  -0.174391f,
-      -0.970473f, 0.405530f,  0.013494f,  -0.237468f, -0.870137f, -0.282840f,
-      -0.531498f, -0.592992f, 0.627559f,  -0.213131f, -0.892850f, -0.249897f,
-      0.549988f,  -0.669405f, 0.824438f,  -0.361588f, -0.340441f, -0.591529f,
-      0.534429f,  -0.860054f, 0.900068f,  -0.683580f, -0.427108f, 0.374258f,
-      -0.717700f, 0.024173f,  0.442654f,  0.857690f,  0.464208f,  0.499696f,
-      -0.185361f, -0.521017f, 0.041701f,  -0.561845f, 0.684776f,  0.325866f,
-      0.632471f,  0.587755f,  -0.061790f, -0.380950f, 0.375158f,  0.973704f,
-      0.539868f,  0.659162f,  0.412170f,  0.190673f,  0.505748f,  -0.006556f,
-      0.730265f,  -0.863945f, 0.937092f,  -0.802487f, 0.093954f,  -0.194060f,
-      -0.785920f, 0.448332f,  0.227365f,  0.565936f,  0.133241f,  0.622638f,
-      0.153552f,  0.888058f,  0.742904f,  0.015204f,  0.577646f,  -0.053939f,
-      0.657603f,  -0.355037f, 0.952293f,  -0.443578f, -0.854338f, 0.502447f,
-      0.662377f,  0.844676f,  -0.345951f, 0.608139f,  0.076501f,  -0.073410f,
-      0.641501f,  0.903813f,  -0.847454f, 0.417342f,  -0.530147f, -0.202209f,
-      -0.463751f, 0.665027f,  0.990748f,  0.299502f,  0.407906f,  0.864606f,
-      0.375305f,  0.136708f,  -0.238305f, 0.269159f,  -0.273543f, -0.184761f,
-      -0.262601f, -0.063202f, 0.006828f,  0.821072f,  -0.587138f, -0.322793f,
-      0.148251f,  -0.026135f, -0.475562f, 0.159187f,  0.756655f,  -0.878100f,
-      -0.118247f, -0.831484f, 0.126475f,  0.078621f,  0.536116f,  -0.533819f,
-      0.174723f,  -0.082052f, 0.721963f,  0.321672f,  -0.292242f, -0.305627f,
-      -0.492564f, 0.905056f,  -0.403598f, -0.683188f, -0.277406f, 0.483258f,
-      0.411800f,  0.401784f,  -0.987548f, -0.251309f, 0.802991f,  -0.363310f,
-      0.194166f,  -0.404410f, -0.749971f, -0.223289f, 0.635375f,  0.962351f,
-      0.723980f,  -0.832358f, -0.324576f, -0.527742f, -0.364389f, 0.968897f,
-      0.096502f,  0.498503f,  0.683703f,  -0.666221f, 0.806195f,  -0.789752f,
-      0.490186f,  0.458744f,  0.434939f,  -0.733136f, -0.108422f, 0.017574f,
-      0.060981f,  0.719434f,  0.355450f,  0.611677f,  0.062486f,  0.911792f,
-      -0.866646f, 0.083036f,  -0.436679f, -0.038199f, 0.369728f,  -0.583483f,
-      0.216322f,  -0.347648f, 0.761694f,  -0.733211f, -0.795184f, 0.918234f,
-      -0.694196f, -0.694924f, -0.688895f, -0.820861f, -0.091151f, 0.337791f,
-      0.662603f,  0.580470f,  0.425422f,  -0.054805f, 0.417176f,  0.916119f,
-      0.011551f,  -0.389894f, 0.579622f,  -0.527226f, -0.531394f, -0.070601f,
-      0.238774f,  0.230659f,  -0.754752f, -0.752413f, -0.431082f, 0.471466f,
-      -0.177384f, 0.657964f,  0.870228f,  -0.201867f, -0.895577f, 0.142372f,
-      0.495340f,  -0.359513f, -0.014131f, -0.556694f, 0.878547f,  -0.035389f,
-      0.079992f,  -0.557886f, -0.808110f, -0.879669f, 0.639018f,  0.542957f,
-      -0.608609f, 0.790236f,  0.368600f,  0.313693f,  0.980762f,  -0.932616f,
-      -0.151493f, -0.020033f, 0.167009f,  -0.833461f, 0.320309f,  -0.895390f,
-      0.113661f,  0.424050f,  -0.024179f, 0.235201f,  -0.572445f, 0.291317f,
-      -0.238715f, -0.792574f, -0.244977f, -0.474278f, -0.517429f, 0.245848f,
-      0.045856f,  -0.173525f, -0.564416f, 0.717107f,  0.722017f,  -0.432122f,
-      0.230786f,  0.558979f,  0.909695f,  0.839206f,  -0.230369f, -0.674714f,
-      0.593503f,  -0.772366f, -0.682351f, -0.288344f, 0.695517f,  0.165562f,
-      0.172355f,  0.851676f,  0.150157f,  -0.980045f, 0.618755f,  0.217617f,
-      -0.040173f, -0.463120f, -0.483807f, -0.037981f, -0.545317f, -0.902795f,
-      -0.661516f, -0.483107f, -0.604180f, 0.211386f,  0.647407f,  0.621230f,
-      0.604474f,  0.416227f,  0.718756f,  0.562169f,  -0.592406f, 0.986686f,
-      -0.812751f, 0.301237f,  -0.569647f, -0.512254f, -0.320624f, -0.604275f,
-      0.013667f,  0.901516f,  -0.210786f, 0.168930f,  0.213074f,  0.429286f,
-      -0.196927f, 0.717382f,  0.840970f,  0.501678f,  -0.428817f, 0.593632f,
-      -0.714468f, 0.009100f,  0.221376f,  0.407593f,  -0.233320f, 0.457367f,
-      0.774569f,  -0.888303f, -0.723567f, 0.726130f,  -0.156507f, -0.177372f,
-      0.918283f,  0.500491f,  0.961994f,  -0.532968f, -0.807546f, -0.230836f,
-      0.000545f,  0.140512f,  0.953263f,  -0.014290f, -0.198234f, 0.989981f,
-      -0.478004f, 0.330649f,  0.928513f,  0.342302f,  -0.401650f, 0.062253f,
-      -0.997074f, 0.767578f,  -0.191232f, -0.397589f, 0.901163f,  -0.078704f,
-      -0.424705f, -0.830747f, 0.164363f,  -0.693863f, -0.853811f, 0.161130f,
-      -0.425970f, -0.276160f, 0.449649f,  0.716623f,  -0.304169f, 0.923491f,
-      0.907138f,  -0.587925f, 0.536490f,  0.231064f,  0.837845f,  0.205075f,
-      0.404276f,  0.487350f,  -0.229795f, -0.496992f, -0.926481f, -0.055754f,
-      0.290145f,  -0.442060f, 0.035722f,  -0.508667f, -0.404984f, 0.300948f,
-      0.782787f,  0.722213f,  -0.580170f, -0.201812f, 0.775766f,  -0.486944f,
-      0.933603f,  0.238315f,  -0.669308f, 0.652398f,  0.311386f,  0.092905f,
-      -0.497341f, -0.919687f, -0.533249f, -0.277774f, 0.266910f,  0.972196f,
-      -0.585687f, 0.514168f,  0.772656f,  -0.055540f, -0.682173f, 0.621842f,
-      -0.046984f, -0.767425f, 0.751441f,  0.270373f,  -0.805437f, 0.816879f,
-      -0.929968f, -0.920501f, 0.977136f,  0.372363f,  -0.246622f, 0.008649f,
-      0.526991f,  -0.902250f, 0.451855f,  0.402656f,  -0.082218f, 0.164590f,
-      -0.321820f, -0.658749f, -0.201613f, 0.839554f,  -0.547909f, -0.277987f,
-      -0.350876f, -0.832836f, 0.025331f,  0.665730f,  0.809227f,  0.447192f,
-      -0.234008f, -0.403966f, 0.383423f,  0.760914f,  0.849097f,  -0.837494f,
-      -0.034654f, -0.743470f, -0.494178f, 0.767923f,  -0.607446f, -0.757293f};
-
-  const float kReference[] = {
-      -0.544495f, 0.264199f, 0.647938f,  0.565569f,  0.496231f,  0.271340f,
-      0.519944f,  0.318094f, -0.792999f, 0.733421f,  -1.000000f, 0.103977f,
-      0.981719f,  0.314859f, 0.476882f,  0.514267f,  -0.196381f, -0.425781f,
-      -0.783081f, 0.101108f, 0.419782f,  -0.291718f, 0.183355f,  -0.332489f};
-
-  RunBitexactnessTest(
-      8000, 2, CreateVector(rtc::ArrayView<const float>(kReferenceInput)),
-      CreateVector(rtc::ArrayView<const float>(kReference)));
-}
-
-TEST(LowCutFilterBitExactnessTest, Mono16kHzInitial) {
-  const float kReferenceInput[] = {
-      0.150254f,  0.512488f,  -0.631245f, 0.240938f,  0.089080f,  -0.365440f,
-      -0.121169f, 0.095748f,  1.000000f,  0.773932f,  -0.377232f, 0.848124f,
-      0.202718f,  -0.017621f, 0.199738f,  -0.057279f, -0.034693f, 0.416303f,
-      0.393761f,  0.396041f,  0.187653f,  -0.337438f, 0.200436f,  0.455577f,
-      0.136624f,  0.289150f,  0.203131f,  -0.084798f, 0.082124f,  -0.220010f,
-      0.248266f,  -0.320554f, -0.298701f, -0.226218f, -0.822794f, 0.401962f,
-      0.090876f,  -0.210968f, 0.382936f,  -0.478291f, -0.028572f, -0.067474f,
-      0.089204f,  0.087430f,  -0.241695f, -0.008398f, -0.046076f, 0.175416f,
-      0.305518f,  0.309992f,  -0.241352f, 0.021618f,  -0.339291f, -0.311173f,
-      -0.001914f, 0.428301f,  -0.215087f, 0.103784f,  -0.063041f, 0.312250f,
-      -0.304344f, 0.009098f,  0.154406f,  0.307571f,  0.431537f,  0.024014f,
-      -0.416832f, -0.207440f, -0.296664f, 0.656846f,  -0.172033f, 0.209054f,
-      -0.053772f, 0.248326f,  -0.213741f, -0.391871f, -0.397490f, 0.136428f,
-      -0.049568f, -0.054788f, 0.396633f,  0.081485f,  0.055279f,  0.443690f,
-      -0.224812f, 0.194675f,  0.233369f,  -0.068107f, 0.060270f,  -0.325801f,
-      -0.320801f, 0.029308f,  0.201837f,  0.722528f,  -0.186366f, 0.052351f,
-      -0.023053f, -0.540192f, -0.122671f, -0.501532f, 0.234847f,  -0.248165f,
-      0.027971f,  -0.152171f, 0.084820f,  -0.167764f, 0.136923f,  0.206619f,
-      0.478395f,  -0.054249f, -0.597574f, -0.234627f, 0.378548f,  -0.299619f,
-      0.268543f,  0.034666f,  0.401492f,  -0.547983f, -0.055248f, -0.337538f,
-      0.812657f,  0.230611f,  0.385360f,  -0.295713f, -0.130957f, -0.076143f,
-      0.306960f,  -0.077653f, 0.196049f,  -0.573390f, -0.098885f, -0.230155f,
-      -0.440716f, 0.141956f,  0.078802f,  0.009356f,  -0.372703f, 0.315083f,
-      0.097859f,  -0.083575f, 0.006397f,  -0.073216f, -0.489105f, -0.079827f,
-      -0.232329f, -0.273644f, -0.323162f, -0.149105f, -0.559646f, 0.269458f,
-      0.145333f,  -0.005597f, -0.009717f, -0.223051f, 0.284676f,  -0.037228f,
-      -0.199679f, 0.377651f,  -0.062813f, -0.164607f};
-
-  const float kReference[] = {0.147160f, 0.495163f,  -0.648346f, 0.234931f,
-                              0.075289f, -0.373779f, -0.117676f, 0.100345f,
-                              0.981719f, 0.714896f,  -0.447357f, 0.770867f};
-
-  RunBitexactnessTest(
-      16000, 1, CreateVector(rtc::ArrayView<const float>(kReferenceInput)),
-      CreateVector(rtc::ArrayView<const float>(kReference)));
-}
-
-TEST(LowCutFilterBitExactnessTest, Mono16kHzConverged) {
-  const float kReferenceInput[] = {
-      0.150254f,  0.512488f,  -0.631245f, 0.240938f,  0.089080f,  -0.365440f,
-      -0.121169f, 0.095748f,  1.000000f,  0.773932f,  -0.377232f, 0.848124f,
-      0.202718f,  -0.017621f, 0.199738f,  -0.057279f, -0.034693f, 0.416303f,
-      0.393761f,  0.396041f,  0.187653f,  -0.337438f, 0.200436f,  0.455577f,
-      0.136624f,  0.289150f,  0.203131f,  -0.084798f, 0.082124f,  -0.220010f,
-      0.248266f,  -0.320554f, -0.298701f, -0.226218f, -0.822794f, 0.401962f,
-      0.090876f,  -0.210968f, 0.382936f,  -0.478291f, -0.028572f, -0.067474f,
-      0.089204f,  0.087430f,  -0.241695f, -0.008398f, -0.046076f, 0.175416f,
-      0.305518f,  0.309992f,  -0.241352f, 0.021618f,  -0.339291f, -0.311173f,
-      -0.001914f, 0.428301f,  -0.215087f, 0.103784f,  -0.063041f, 0.312250f,
-      -0.304344f, 0.009098f,  0.154406f,  0.307571f,  0.431537f,  0.024014f,
-      -0.416832f, -0.207440f, -0.296664f, 0.656846f,  -0.172033f, 0.209054f,
-      -0.053772f, 0.248326f,  -0.213741f, -0.391871f, -0.397490f, 0.136428f,
-      -0.049568f, -0.054788f, 0.396633f,  0.081485f,  0.055279f,  0.443690f,
-      -0.224812f, 0.194675f,  0.233369f,  -0.068107f, 0.060270f,  -0.325801f,
-      -0.320801f, 0.029308f,  0.201837f,  0.722528f,  -0.186366f, 0.052351f,
-      -0.023053f, -0.540192f, -0.122671f, -0.501532f, 0.234847f,  -0.248165f,
-      0.027971f,  -0.152171f, 0.084820f,  -0.167764f, 0.136923f,  0.206619f,
-      0.478395f,  -0.054249f, -0.597574f, -0.234627f, 0.378548f,  -0.299619f,
-      0.268543f,  0.034666f,  0.401492f,  -0.547983f, -0.055248f, -0.337538f,
-      0.812657f,  0.230611f,  0.385360f,  -0.295713f, -0.130957f, -0.076143f,
-      0.306960f,  -0.077653f, 0.196049f,  -0.573390f, -0.098885f, -0.230155f,
-      -0.440716f, 0.141956f,  0.078802f,  0.009356f,  -0.372703f, 0.315083f,
-      0.097859f,  -0.083575f, 0.006397f,  -0.073216f, -0.489105f, -0.079827f,
-      -0.232329f, -0.273644f, -0.323162f, -0.149105f, -0.559646f, 0.269458f,
-      0.145333f,  -0.005597f, -0.009717f, -0.223051f, 0.284676f,  -0.037228f,
-      -0.199679f, 0.377651f,  -0.062813f, -0.164607f, -0.082091f, -0.236957f,
-      -0.313025f, 0.705903f,  0.462637f,  0.085942f,  -0.351308f, -0.241859f,
-      -0.049333f, 0.221165f,  -0.372235f, -0.651092f, -0.404957f, 0.093201f,
-      0.109366f,  0.126224f,  -0.036409f, 0.051333f,  -0.133063f, 0.240896f,
-      -0.380532f, 0.127160f,  -0.237176f, -0.093586f, 0.154478f,  0.290379f,
-      -0.312329f, 0.352297f,  0.184480f,  -0.018965f, -0.054555f, -0.060811f,
-      -0.084705f, 0.006440f,  0.014333f,  0.230847f,  0.426721f,  0.130481f,
-      -0.058605f, 0.174712f,  0.051204f,  -0.287773f, 0.265265f,  0.085810f,
-      0.037775f,  0.143988f,  0.073051f,  -0.263103f, -0.045366f, -0.040816f,
-      -0.148673f, 0.470072f,  -0.244727f, -0.135204f, -0.198973f, -0.328139f,
-      -0.053722f, -0.076590f, 0.427586f,  -0.069591f, -0.297399f, 0.448094f,
-      0.345037f,  -0.064170f, -0.420903f, -0.124253f, -0.043578f, 0.077149f,
-      -0.072983f, 0.123916f,  0.109517f,  -0.349508f, -0.264912f, -0.207106f,
-      -0.141912f, -0.089586f, 0.003485f,  -0.846518f, -0.127715f, 0.347208f,
-      -0.298095f, 0.260935f,  0.097899f,  -0.008106f, 0.050987f,  -0.437362f,
-      -0.023625f, 0.448230f,  0.027484f,  0.011562f,  -0.205167f, -0.008611f,
-      0.064930f,  0.119156f,  -0.104183f, -0.066078f, 0.565530f,  -0.631108f,
-      0.623029f,  0.094334f,  0.279472f,  -0.465059f, -0.164888f, -0.077706f,
-      0.118130f,  -0.466746f, 0.131800f,  -0.338936f, 0.018497f,  0.182304f,
-      0.091398f,  0.302547f,  0.281153f,  -0.181899f, 0.071836f,  -0.263911f,
-      -0.369380f, 0.258447f,  0.000014f,  -0.015347f, 0.254619f,  0.166159f,
-      0.097865f,  0.349389f,  0.259834f,  0.067003f,  -0.192925f, -0.182080f,
-      0.333139f,  -0.450434f, -0.006836f, -0.544615f, 0.285183f,  0.240811f,
-      0.000325f,  -0.019796f, -0.694804f, 0.162411f,  -0.612686f, -0.648134f,
-      0.022338f,  -0.265058f, 0.114993f,  0.189185f,  0.239697f,  -0.193148f,
-      0.125581f,  0.028122f,  0.230849f,  0.149832f,  0.250919f,  -0.036871f,
-      -0.041136f, 0.281627f,  -0.593466f, -0.141009f, -0.355074f, -0.106915f,
-      0.181276f,  0.230753f,  -0.283631f, -0.131643f, 0.038292f,  -0.081563f,
-      0.084345f,  0.111763f,  -0.259882f, -0.049416f, -0.595824f, 0.320077f,
-      -0.175802f, -0.336422f, -0.070966f, -0.399242f, -0.005829f, -0.156680f,
-      0.608591f,  0.318150f,  -0.697767f, 0.123331f,  -0.390716f, -0.071276f,
-      0.045943f,  0.208958f,  -0.076304f, 0.440505f,  -0.134400f, 0.091525f,
-      0.185763f,  0.023806f,  0.246186f,  0.090323f,  -0.219133f, -0.504520f,
-      0.519393f,  -0.168939f, 0.028884f,  0.157380f,  0.031745f,  -0.252830f,
-      -0.130705f, -0.034901f, 0.413302f,  -0.240559f, 0.219279f,  0.086246f,
-      -0.065353f, -0.295376f, -0.079405f, -0.024226f, -0.410629f, 0.053706f,
-      -0.229794f, -0.026336f, 0.093956f,  -0.252810f, -0.080555f, 0.097827f,
-      -0.513040f, 0.289508f,  0.677527f,  0.268109f,  -0.088244f, 0.119781f,
-      -0.289511f, 0.524778f,  0.262884f,  0.220028f,  -0.244767f, 0.089411f,
-      -0.156018f, -0.087030f, -0.159292f, -0.286646f, -0.253953f, -0.058657f,
-      -0.474756f, 0.169797f,  -0.032919f, 0.195384f,  0.075355f,  0.138131f,
-      -0.414465f, -0.285118f, -0.124915f, 0.030645f,  0.315431f,  -0.081032f,
-      0.352546f,  0.132860f,  0.328112f,  0.035476f,  -0.183550f, -0.413984f,
-      0.043452f,  0.228748f,  -0.081765f, -0.151125f, -0.086251f, -0.306448f,
-      -0.137774f, -0.050508f, 0.012811f,  -0.017824f, 0.170841f,  0.030549f,
-      0.506935f,  0.087197f,  0.504274f,  -0.202080f, 0.147146f,  -0.072728f,
-      0.167713f,  0.165977f,  -0.610894f, -0.370849f, -0.402698f, 0.112297f,
-      0.410855f,  -0.091330f, 0.227008f,  0.152454f,  -0.293884f, 0.111074f,
-      -0.210121f, 0.423728f,  -0.009101f, 0.457188f,  -0.118785f, 0.164720f,
-      -0.017547f, -0.565046f, -0.274461f, 0.171169f,  -0.015338f, -0.312635f,
-      -0.175044f, 0.069729f,  -0.277504f, 0.272454f,  -0.179049f, 0.505495f,
-      -0.301774f, 0.055664f,  -0.425058f, -0.202222f, -0.165787f, 0.112155f,
-      0.263284f,  0.083972f,  -0.104256f, 0.227892f,  0.223253f,  0.033592f,
-      0.159638f,  0.115358f,  -0.275811f, 0.212265f,  -0.183658f, -0.168768f};
-
-  const float kReference[] = {-0.248962f, -0.088257f, 0.083041f,  -0.037323f,
-                              0.127659f,  0.149388f,  -0.220978f, -0.004242f,
-                              -0.538544f, 0.384289f,  -0.117615f, -0.268524f};
-
-  RunBitexactnessTest(
-      16000, 1, CreateVector(rtc::ArrayView<const float>(kReferenceInput)),
-      CreateVector(rtc::ArrayView<const float>(kReference)));
-}
-
-TEST(LowCutFilterBitExactnessTest, Stereo16kHzInitial) {
-  const float kReferenceInput[] = {
-      0.087390f,  -0.370759f, -0.235918f, 0.583079f,  0.678359f,  0.360473f,
-      -0.166156f, 0.285780f,  -0.571837f, 0.234542f,  0.350382f,  0.202047f,
-      -0.307381f, -0.271197f, -0.657038f, 0.590723f,  -0.014666f, -0.290754f,
-      0.550122f,  -0.526390f, 0.689667f,  0.633054f,  0.692457f,  -0.259626f,
-      -0.233541f, 0.722669f,  -0.072182f, 0.141096f,  0.390614f,  0.921835f,
-      0.092626f,  0.273153f,  0.141785f,  0.854224f,  0.727531f,  -0.660321f,
-      -0.642602f, -0.512991f, 0.503559f,  -0.601731f, 0.965881f,  0.419277f,
-      -0.649128f, 0.716595f,  0.818823f,  0.923326f,  0.141199f,  0.125758f,
-      -0.646678f, 0.027358f,  0.096944f,  -0.669445f, -0.012214f, 0.070235f,
-      -0.602386f, 0.246338f,  -0.947369f, -0.362418f, 0.065999f,  -0.346453f,
-      0.204381f,  -0.276135f, -0.730159f, 0.827627f,  0.281118f,  0.317548f,
-      0.350661f,  0.489115f,  0.684355f,  0.033314f,  -0.696263f, -0.238671f,
-      0.642039f,  -0.657271f, -0.340049f, 0.932944f,  0.612585f,  -0.555624f,
-      0.999546f,  -0.872523f, -0.149034f, -0.191324f, -0.199414f, -0.776155f,
-      -0.151378f, 0.227092f,  0.976123f,  -0.560198f, -0.291838f, -0.467516f,
-      -0.417004f, -0.623221f, -0.954281f, -0.101192f, -0.512720f, 0.737453f,
-      0.057222f,  0.828270f,  0.947860f,  0.170852f,  -0.762049f, 0.853065f,
-      0.187122f,  0.767231f,  -0.151048f, 0.214515f,  -0.858473f, 0.849545f,
-      0.284159f,  -0.791001f, 0.400450f,  -0.208391f, -0.830190f, -0.571042f,
-      -0.502402f, -0.546694f, 0.406009f,  0.508305f,  0.094573f,  0.106967f,
-      0.261146f,  0.970914f,  0.268556f,  0.200911f,  0.818374f,  0.141673f,
-      -0.329160f, 0.914278f,  -0.120154f, 0.203085f,  0.440525f,  0.357557f,
-      -0.574482f, -0.836753f, -0.451041f, 0.735037f,  0.118714f,  -0.070744f,
-      -0.139398f, 0.547972f,  0.307841f,  0.315459f,  -0.677958f, -0.135246f,
-      0.010172f,  -0.249335f, -0.039256f, -0.315157f, 0.554293f,  -0.232112f,
-      0.423113f,  -0.038133f, 0.458360f,  0.875118f,  0.034509f,  0.806137f,
-      -0.563615f, 0.746439f,  -0.834614f, -0.069193f, -0.956140f, 0.616561f,
-      -0.641581f, -0.669216f, -0.636793f, 0.382873f,  -0.572473f, -0.403790f,
-      0.536670f,  0.002300f,  0.818930f,  -0.884294f, -0.126496f, 0.144509f,
-      0.130134f,  0.647633f,  -0.747802f, -0.399766f, -0.995756f, 0.902215f,
-      0.532599f,  0.502608f,  -0.722270f, -0.301361f, -0.697319f, -0.006559f,
-      0.617305f,  0.265738f,  0.376803f,  0.279140f,  0.458643f,  0.719691f,
-      0.253911f,  -0.638817f, 0.146613f,  -0.672868f, 0.812103f,  -0.845314f,
-      -0.322931f, 0.161235f,  -0.049530f, 0.610641f,  0.061556f,  -0.545379f,
-      0.418970f,  -0.702735f, 0.316232f,  0.267965f,  -0.541387f, -0.635544f,
-      -0.667295f, -0.700786f, -0.594505f, 0.909918f,  -0.968183f, 0.915029f,
-      -0.948615f, 0.942221f,  -0.404809f, 0.050146f,  0.724678f,  0.792810f,
-      -0.621979f, 0.321439f,  0.882462f,  0.951414f,  -0.784129f, -0.642202f,
-      0.493103f,  -0.901063f, -0.857430f, -0.021749f, 0.699788f,  0.994083f,
-      -0.991215f, 0.085215f,  0.722696f,  0.818278f,  0.690701f,  0.757746f,
-      0.492364f,  -0.765021f, 0.018045f,  -0.662336f, 0.662223f,  0.856022f,
-      -0.661031f, 0.767475f,  -0.224274f, -0.234861f, -0.457094f, 0.735766f,
-      0.483005f,  -0.104255f, 0.419278f,  0.888663f,  -0.651764f, -0.510807f,
-      0.281858f,  0.617225f,  0.706742f,  -0.203765f, -0.769012f, -0.839438f,
-      -0.279065f, 0.657811f,  -0.570781f, 0.582081f,  0.309377f,  -0.947707f,
-      0.571553f,  0.845126f,  -0.015374f, 0.668023f,  -0.737293f, 0.519567f,
-      0.851472f,  0.665415f,  -0.481198f, -0.573956f, 0.044630f,  -0.205286f,
-      -0.041780f, 0.987807f,  0.208957f,  0.889817f,  -0.019116f, -0.124107f,
-      0.545311f,  0.488133f,  -0.114192f, -0.894000f, -0.824356f, 0.595972f,
-      0.311165f,  -0.935329f, 0.114134f,  0.439603f,  -0.779184f, -0.566705f,
-      0.622040f,  -0.722676f, 0.763798f,  0.847112f,  -0.974489f, -0.245681f,
-      -0.664377f, 0.080446f,  -0.796675f, -0.921465f, 0.866458f,  0.943184f,
-      -0.278144f, 0.288411f,  -0.864105f, -0.584176f, -0.920792f, -0.061281f,
-      -0.699807f, 0.982614f};
-
-  const float kReference[] = {
-      0.085604f,  -0.367126f, -0.218170f, 0.594653f,  0.661245f,  0.319041f,
-      -0.212891f, 0.237800f,  -0.614716f, 0.201758f,  0.305032f,  0.144414f,
-      -0.936523f, 0.647359f,  -0.613403f, -0.611542f, -0.549835f, 0.477004f,
-      -0.477386f, -0.287262f, 0.650746f,  0.101169f,  0.899258f,  -0.808014f};
-
-  RunBitexactnessTest(
-      16000, 2, CreateVector(rtc::ArrayView<const float>(kReferenceInput)),
-      CreateVector(rtc::ArrayView<const float>(kReference)));
-}
-
-TEST(LowCutFilterBitExactnessTest, Stereo16kHzConverged) {
-  const float kReferenceInput[] = {
-      -0.145875f, 0.910744f,  0.448494f,  0.161783f,  0.080516f,  0.410882f,
-      -0.989942f, 0.565032f,  0.853719f,  -0.983409f, 0.649257f,  0.534672f,
-      0.994274f,  -0.544694f, 0.839084f,  0.283999f,  -0.789360f, -0.463678f,
-      0.527688f,  0.611020f,  -0.791494f, -0.060482f, -0.561876f, 0.845416f,
-      -0.359355f, 0.715088f,  -0.480307f, 0.756126f,  -0.623465f, 0.518388f,
-      -0.936621f, 0.284678f,  0.133742f,  -0.247181f, -0.574903f, 0.584314f,
-      -0.709113f, -0.021715f, -0.974309f, -0.626776f, -0.029539f, 0.676452f,
-      -0.717886f, 0.464434f,  0.382134f,  -0.931015f, -0.022285f, 0.942781f,
-      -0.775097f, 0.486428f,  0.277083f,  0.188366f,  -0.002755f, 0.135705f,
-      -0.146991f, -0.847521f, -0.418827f, 0.122670f,  0.266667f,  0.861552f,
-      0.955538f,  -0.812807f, 0.323470f,  0.205546f,  -0.052364f, -0.287487f,
-      -0.048843f, 0.342044f,  0.919290f,  -0.821831f, 0.595485f,  0.181551f,
-      0.824394f,  -0.797741f, -0.413411f, -0.896824f, 0.008256f,  0.536752f,
-      -0.434029f, -0.549280f, -0.337421f, -0.093497f, 0.474769f,  0.019771f,
-      -0.234972f, 0.810966f,  0.930515f,  0.256535f,  -0.735938f, 0.236604f,
-      -0.233960f, 0.982387f,  -0.426345f, 0.412383f,  0.070412f,  -0.613578f,
-      0.378870f,  -0.899090f, -0.631132f, -0.908683f, 0.770083f,  0.679589f,
-      -0.763690f, -0.179170f, -0.759543f, 0.144185f,  0.898780f,  -0.487230f,
-      0.979731f,  -0.300384f, -0.582955f, 0.331654f,  0.946689f,  0.245400f,
-      -0.872924f, -0.252981f, -0.667497f, -0.537444f, -0.895583f, 0.803513f,
-      0.586583f,  -0.253971f, 0.664109f,  0.507669f,  0.243726f,  -0.211814f,
-      -0.281444f, -0.822295f, -0.316646f, 0.097341f,  -0.078905f, 0.290905f,
-      0.027042f,  0.628853f,  -0.805634f, -0.072573f, 0.179635f,  -0.625656f,
-      0.222660f,  -0.896116f, 0.151454f,  0.684689f,  -0.000548f, -0.121950f,
-      -0.701886f, -0.943441f, 0.513340f,  0.592212f,  -0.412889f, -0.769587f,
-      -0.249817f, 0.657787f,  0.683553f,  0.330477f,  0.920280f,  0.886236f,
-      -0.774601f, 0.296575f,  -0.038392f, -0.866959f, 0.795542f,  -0.005540f,
-      0.542607f,  -0.879276f, -0.475085f, 0.302139f,  -0.732792f, 0.277091f,
-      -0.230114f, 0.531396f,  0.305831f,  -0.237022f, -0.399963f, -0.319721f,
-      0.837853f,  -0.087466f, -0.115006f, -0.091628f, 0.890564f,  -0.561762f,
-      0.764806f,  -0.960249f, -0.316470f, 0.532055f,  -0.314393f, 0.237613f,
-      -0.093958f, -0.979675f, 0.198162f,  0.203137f,  0.298835f,  -0.314559f,
-      -0.013401f, 0.403548f,  0.775605f,  -0.889884f, -0.803276f, 0.299566f,
-      0.528142f,  0.975918f,  -0.749350f, -0.271046f, 0.352460f,  -0.248484f,
-      0.726917f,  -0.416046f, -0.733050f, 0.345301f,  -0.594830f, 0.737030f,
-      0.502315f,  -0.161241f, -0.999538f, -0.701073f, -0.452331f, 0.744850f,
-      0.202502f,  -0.357623f, -0.431414f, -0.129368f, 0.807518f,  0.850211f,
-      0.010585f,  0.255164f,  0.438528f,  -0.952174f, 0.149865f,  -0.906931f,
-      -0.154937f, -0.064531f, -0.954744f, -0.869852f, 0.847913f,  0.068286f,
-      -0.266407f, -0.272108f, -0.697253f, -0.700783f, -0.298396f, -0.328068f,
-      0.568056f,  -0.026522f, -0.070404f, -0.737495f, 0.772783f,  0.349115f,
-      0.670319f,  0.312976f,  0.967834f,  0.959580f,  -0.499694f, 0.249141f,
-      0.456485f,  -0.003659f, 0.699657f,  -0.618164f, -0.751712f, -0.994419f,
-      -0.694094f, 0.068322f,  0.021267f,  -0.229568f, -0.378807f, -0.992889f,
-      0.630485f,  0.276837f,  -0.103321f, -0.511828f, 0.606770f,  0.647942f,
-      0.704381f,  -0.065496f, 0.941398f,  0.682488f,  -0.842904f, -0.524802f,
-      0.635142f,  -0.188343f, -0.067376f, 0.903072f,  0.930011f,  0.530570f,
-      0.149067f,  0.831850f,  -0.009135f, -0.667975f, -0.348005f, -0.407128f,
-      0.116597f,  -0.865046f, -0.862044f, -0.666431f, 0.894877f,  0.622177f,
-      0.420911f,  0.940491f,  0.996854f,  0.974910f,  -0.699827f, 0.916958f,
-      0.060918f,  -0.851827f, -0.376358f, 0.790342f,  0.669537f,  -0.995302f,
-      0.280420f,  0.606365f,  -0.509738f, -0.871756f, -0.473703f, -0.794559f,
-      -0.032562f, -0.162231f, -0.237422f, 0.773530f,  -0.158885f, -0.432304f,
-      -0.903638f, -0.561668f, -0.521648f, -0.941483f, 0.404622f,  -0.984729f,
-      0.221841f,  -0.183821f, -0.502107f, 0.304919f,  -0.359446f, -0.792656f,
-      0.071130f,  -0.670260f, 0.766877f,  0.332914f,  0.695485f,  0.525322f,
-      0.614028f,  0.265905f,  0.420855f,  0.377327f,  -0.358104f, 0.063297f,
-      0.746388f,  -0.890921f, 0.000802f,  -0.134474f, 0.808565f,  0.260367f,
-      0.966072f,  0.170401f,  0.681273f,  -0.062372f, 0.090445f,  -0.641792f,
-      0.268923f,  0.925918f,  0.068028f,  -0.040771f, 0.587332f,  -0.814573f,
-      0.761599f,  -0.992253f, 0.023058f,  0.356927f,  0.131495f,  -0.043083f,
-      -0.358974f, 0.203160f,  0.826305f,  0.365036f,  0.893467f,  -0.801822f,
-      0.022058f,  -0.779743f, 0.090524f,  0.377572f,  -0.705166f, 0.555122f,
-      -0.201898f, 0.796600f,  -0.385912f, -0.877898f, -0.561058f, -0.834334f,
-      0.900791f,  -0.967259f, -0.770663f, -0.975180f, -0.567545f, -0.977145f,
-      0.284899f,  0.033982f,  -0.508916f, -0.612505f, -0.818259f, -0.263117f,
-      -0.984414f, 0.205403f,  -0.042291f, -0.383765f, 0.488889f,  0.678699f,
-      -0.475136f, 0.028476f,  -0.106452f, -0.317578f, 0.678284f,  0.964985f,
-      0.252929f,  -0.637450f, -0.753966f, 0.159937f,  -0.342928f, -0.463627f,
-      0.100478f,  -0.638966f, 0.356984f,  -0.888623f, -0.931886f, -0.426963f,
-      -0.845220f, 0.801145f,  0.693212f,  -0.208603f, -0.661569f, -0.139095f,
-      -0.167564f, 0.457527f,  -0.187053f, 0.903615f,  0.823970f,  0.902829f,
-      -0.307998f, -0.419512f, 0.773402f,  -0.579938f, -0.738247f, 0.041032f,
-      0.810925f,  -0.194940f, -0.568477f, -0.842521f, 0.866120f,  0.205743f,
-      -0.245016f, 0.329863f,  0.584381f,  -0.333016f, 0.385318f,  -0.592369f,
-      0.917427f,  0.423665f,  -0.666187f, -0.114446f, 0.265987f,  0.859934f,
-      0.058662f,  0.252949f,  0.361638f,  0.846395f,  -0.694332f, -0.188558f,
-      -0.375048f, 0.387798f,  0.781376f,  -0.018658f, 0.611647f,  -0.347122f,
-      0.099758f,  -0.222431f, 0.793658f,  0.352240f,  0.656794f,  -0.779822f,
-      -0.441545f, 0.535272f,  -0.567887f, -0.931876f, -0.126896f, 0.873727f,
-      -0.475822f, 0.139491f,  -0.280894f, -0.946323f, 0.000838f,  0.654030f,
-      -0.482035f, -0.908230f, -0.507057f, 0.321464f,  -0.341181f, 0.318992f,
-      -0.973992f, 0.436136f,  -0.217762f, -0.932989f, -0.187969f, 0.432615f,
-      0.842673f,  0.968031f,  0.966842f,  0.792612f,  0.731406f,  0.601922f,
-      0.109958f,  -0.162256f, -0.745755f, 0.309241f,  0.727930f,  -0.450803f,
-      0.680328f,  -0.858490f, -0.242416f, -0.463661f, -0.694158f, 0.261999f,
-      -0.367250f, 0.918224f,  -0.002652f, 0.477217f,  -0.974489f, 0.210706f,
-      0.152903f,  0.614758f,  0.309936f,  0.756457f,  0.804746f,  -0.695534f,
-      -0.614840f, 0.581951f,  -0.878590f, -0.220346f, -0.400068f, 0.468360f,
-      -0.791581f, 0.585151f,  0.565458f,  0.064795f,  -0.493295f, -0.858091f,
-      0.251607f,  -0.950637f, -0.875915f, -0.740776f, -0.098772f, 0.344672f,
-      0.712222f,  -0.003109f, -0.902431f, -0.372335f, 0.283262f,  0.572773f,
-      -0.421699f, -0.004264f, 0.636869f,  0.190257f,  0.072849f,  -0.338254f,
-      -0.176620f, 0.588012f,  -0.313584f, -0.074787f, -0.264353f, 0.359141f,
-      0.135558f,  0.303554f,  -0.017773f, -0.203084f, -0.045032f, -0.866825f,
-      -0.177943f, 0.938184f,  0.561442f,  0.458036f,  0.531301f,  0.513162f,
-      0.686541f,  0.540314f,  0.957322f,  -0.777281f, -0.207846f, -0.015879f,
-      -0.483811f, -0.926068f, 0.948763f,  0.452852f,  -0.704070f, -0.704211f,
-      0.409648f,  -0.238013f, -0.847177f, -0.178319f, -0.714019f, 0.597840f,
-      0.860496f,  -0.990561f, 0.300081f,  0.357065f,  -0.492754f, 0.686362f,
-      -0.412082f, -0.946279f, -0.813386f, 0.595770f,  0.422805f,  0.566814f,
-      0.247845f,  0.650831f,  -0.929955f, -0.189050f, -0.500662f, -0.038206f,
-      0.761678f,  -0.438630f, 0.198285f,  -0.947548f, -0.689603f, 0.667822f,
-      -0.610213f, 0.659576f,  -0.323850f, 0.342233f,  -0.895267f, 0.468618f,
-      -0.001036f, 0.886600f,  -0.420455f, -0.246879f, -0.772489f, 0.929701f,
-      -0.134977f, -0.830874f, 0.433353f,  0.013575f,  -0.343825f, 0.507048f,
-      0.672012f,  -0.492567f, 0.068850f,  -0.129670f, -0.684592f, 0.200962f,
-      0.874902f,  -0.784483f, 0.799963f,  0.100930f,  -0.145287f, -0.695238f,
-      -0.504908f, -0.105262f, 0.065567f,  -0.290698f, 0.546230f,  0.763362f,
-      0.468184f,  -0.187136f, 0.208357f,  0.282210f,  -0.745066f, -0.007616f,
-      -0.379061f, 0.157149f,  0.887218f,  -0.146121f, -0.933743f, 0.858868f,
-      0.849965f,  -0.283386f, -0.480022f, 0.573719f,  0.023164f,  0.125054f,
-      0.369588f,  -0.815207f, 0.745158f,  0.885876f,  -0.806812f, 0.691765f,
-      0.818791f,  -0.977318f, 0.047365f,  0.300691f,  -0.229709f, 0.298604f,
-      0.525707f,  0.151372f,  0.263838f,  -0.443592f, 0.679673f,  -0.146330f,
-      0.263245f,  0.666934f,  -0.459629f, -0.198399f, 0.108509f,  -0.112269f,
-      -0.819232f, 0.488763f,  -0.934769f, -0.140515f, -0.925475f, 0.951596f,
-      0.044680f,  0.819260f,  -0.233504f, 0.768904f,  -0.489965f, 0.818100f,
-      0.789121f,  -0.202966f, 0.250040f,  0.135195f,  0.789024f,  -0.571668f,
-      -0.992282f, 0.761163f,  -0.529757f, -0.510271f, 0.281834f,  -0.390951f,
-      0.651242f,  0.767377f,  0.890746f,  -0.218409f, 0.602640f,  -0.685773f,
-      0.250331f,  0.397971f,  -0.828262f, 0.062359f,  0.777133f,  -0.472668f,
-      -0.530429f, 0.679314f,  -0.008920f, -0.695267f, -0.538464f, 0.315908f,
-      0.125897f,  -0.416343f, 0.244610f,  0.431811f,  -0.438538f, -0.175454f,
-      -0.275589f, 0.562784f,  -0.729026f, 0.804139f,  -0.420728f, -0.000884f,
-      0.567181f,  0.354124f,  -0.700377f, 0.393239f,  -0.741974f, 0.891893f,
-      0.772824f,  0.030009f,  0.358817f,  0.953587f,  -0.749079f, 0.504486f,
-      0.654104f,  0.562861f,  -0.618235f, -0.142717f, -0.971087f, -0.349429f,
-      -0.730596f, -0.098965f, 0.144550f,  0.584047f,  -0.160527f, 0.065073f,
-      0.851409f,  0.798164f,  0.089667f,  0.802248f,  -0.896347f, 0.617205f,
-      -0.330191f, -0.542634f, 0.644804f,  -0.303531f, -0.669059f, -0.943733f,
-      0.910740f,  0.360581f,  0.721124f,  0.878187f,  0.360388f,  0.834847f,
-      -0.486617f, 0.771236f,  0.840086f,  -0.399873f, -0.853218f, 0.534797f,
-      -0.830096f, 0.457528f,  -0.104221f, 0.302497f,  -0.660996f, 0.062898f,
-      0.267602f,  -0.971808f, -0.059257f, 0.772652f,  -0.771943f, -0.114918f,
-      0.319096f,  -0.410454f, 0.900737f,  0.388572f,  -0.586387f, 0.109525f,
-      0.758557f,  0.115715f,  0.504668f,  0.789802f,  0.683688f,  -0.738287f,
-      -0.621692f, -0.692720f, -0.942196f, -0.981830f, 0.192903f,  0.218099f,
-      0.837847f,  0.467149f,  -0.397706f, -0.008851f, -0.483674f, 0.465709f,
-      -0.766478f, 0.492083f,  0.619578f,  0.490467f,  -0.325713f, 0.168650f,
-      -0.062096f, -0.825470f, 0.657435f,  0.371889f,  -0.465350f, 0.938967f,
-      -0.632452f, -0.400118f, -0.177630f, -0.527022f, -0.609889f, 0.410759f,
-      -0.638903f, 0.044666f,  -0.407656f, -0.074436f, 0.850465f,  -0.568222f,
-      -0.997982f, 0.813212f,  0.360084f,  0.029904f,  0.044138f,  -0.794163f,
-      0.993761f,  -0.282062f, 0.250485f,  -0.213267f, -0.984675f, 0.090570f,
-      0.018221f,  -0.506442f, -0.909209f, 0.683459f,  -0.903500f, -0.367359f,
-      0.566839f,  0.944800f,  0.172928f,  0.556088f,  0.455395f,  0.301974f,
-      0.329230f,  0.877560f,  0.070163f,  -0.203120f, 0.340915f,  -0.118931f,
-      -0.734252f, -0.121593f, 0.095285f,  -0.209727f, -0.203456f, 0.502697f,
-      0.044701f,  -0.019134f, -0.822642f, -0.498297f, -0.104882f, 0.275922f,
-      0.418891f,  0.985240f,  0.864390f,  -0.815541f, 0.907080f,  -0.674409f,
-      0.940910f,  0.194013f,  -0.519546f, -0.859410f, -0.399918f, 0.627090f,
-      -0.846580f, -0.291054f, -0.735978f, -0.683641f, -0.875706f, 0.403687f,
-      -0.827037f, 0.233574f,  -0.652457f, 0.302802f,  -0.002607f, -0.430979f,
-      0.661119f,  0.636720f,  0.876339f,  -0.999348f, 0.280778f,  -0.985289f,
-      -0.787158f, -0.786411f, -0.265782f, -0.520785f, -0.307720f, -0.500760f,
-      -0.225871f, -0.157923f, 0.280155f,  0.575106f,  -0.460011f, 0.687965f,
-      0.480937f,  0.652204f,  -0.635616f, -0.869128f, 0.220701f,  0.403106f,
-      -0.776765f, -0.808353f, 0.195668f,  0.624465f,  0.629156f,  -0.821126f,
-      0.462557f,  0.807713f,  -0.095536f, -0.858625f, -0.517444f, 0.463730f};
-
-  const float kReference[] = {
-      -0.816528f, 0.085421f,  0.739647f,  -0.922089f, 0.669301f,  -0.048187f,
-      -0.290039f, -0.818085f, -0.596008f, -0.177826f, -0.002197f, -0.350647f,
-      -0.064301f, 0.337291f,  -0.621765f, 0.115909f,  0.311899f,  -0.915924f,
-      0.020478f,  0.836055f,  -0.714020f, -0.037140f, 0.391125f,  -0.340118f};
-
-  RunBitexactnessTest(
-      16000, 2, CreateVector(rtc::ArrayView<const float>(kReferenceInput)),
-      CreateVector(rtc::ArrayView<const float>(kReference)));
-}
-}  // namespace webrtc
diff --git a/modules/audio_processing/noise_suppression_impl.cc b/modules/audio_processing/noise_suppression_impl.cc
deleted file mode 100644
index 37af103..0000000
--- a/modules/audio_processing/noise_suppression_impl.cc
+++ /dev/null
@@ -1,213 +0,0 @@
-/*
- *  Copyright (c) 2012 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_processing/noise_suppression_impl.h"
-
-#include "webrtc/modules/audio_processing/audio_buffer.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#if defined(WEBRTC_NS_FLOAT)
-#include "webrtc/modules/audio_processing/ns/noise_suppression.h"
-#define NS_CREATE WebRtcNs_Create
-#define NS_FREE WebRtcNs_Free
-#define NS_INIT WebRtcNs_Init
-#define NS_SET_POLICY WebRtcNs_set_policy
-typedef NsHandle NsState;
-#elif defined(WEBRTC_NS_FIXED)
-#include "webrtc/modules/audio_processing/ns/noise_suppression_x.h"
-#define NS_CREATE WebRtcNsx_Create
-#define NS_FREE WebRtcNsx_Free
-#define NS_INIT WebRtcNsx_Init
-#define NS_SET_POLICY WebRtcNsx_set_policy
-typedef NsxHandle NsState;
-#endif
-
-namespace webrtc {
-class NoiseSuppressionImpl::Suppressor {
- public:
-  explicit Suppressor(int sample_rate_hz) {
-    state_ = NS_CREATE();
-    RTC_CHECK(state_);
-    int error = NS_INIT(state_, sample_rate_hz);
-    RTC_DCHECK_EQ(0, error);
-  }
-  ~Suppressor() {
-    NS_FREE(state_);
-  }
-  NsState* state() { return state_; }
- private:
-  NsState* state_ = nullptr;
-  RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(Suppressor);
-};
-
-NoiseSuppressionImpl::NoiseSuppressionImpl(rtc::CriticalSection* crit)
-    : crit_(crit) {
-  RTC_DCHECK(crit);
-}
-
-NoiseSuppressionImpl::~NoiseSuppressionImpl() {}
-
-void NoiseSuppressionImpl::Initialize(size_t channels, int sample_rate_hz) {
-  rtc::CritScope cs(crit_);
-  channels_ = channels;
-  sample_rate_hz_ = sample_rate_hz;
-  std::vector<std::unique_ptr<Suppressor>> new_suppressors;
-  if (enabled_) {
-    new_suppressors.resize(channels);
-    for (size_t i = 0; i < channels; i++) {
-      new_suppressors[i].reset(new Suppressor(sample_rate_hz));
-    }
-  }
-  suppressors_.swap(new_suppressors);
-  set_level(level_);
-}
-
-void NoiseSuppressionImpl::AnalyzeCaptureAudio(AudioBuffer* audio) {
-  RTC_DCHECK(audio);
-#if defined(WEBRTC_NS_FLOAT)
-  rtc::CritScope cs(crit_);
-  if (!enabled_) {
-    return;
-  }
-
-  RTC_DCHECK_GE(160, audio->num_frames_per_band());
-  RTC_DCHECK_EQ(suppressors_.size(), audio->num_channels());
-  for (size_t i = 0; i < suppressors_.size(); i++) {
-    WebRtcNs_Analyze(suppressors_[i]->state(),
-                     audio->split_bands_const_f(i)[kBand0To8kHz]);
-  }
-#endif
-}
-
-void NoiseSuppressionImpl::ProcessCaptureAudio(AudioBuffer* audio) {
-  RTC_DCHECK(audio);
-  rtc::CritScope cs(crit_);
-  if (!enabled_) {
-    return;
-  }
-
-  RTC_DCHECK_GE(160, audio->num_frames_per_band());
-  RTC_DCHECK_EQ(suppressors_.size(), audio->num_channels());
-  for (size_t i = 0; i < suppressors_.size(); i++) {
-#if defined(WEBRTC_NS_FLOAT)
-    WebRtcNs_Process(suppressors_[i]->state(),
-                     audio->split_bands_const_f(i),
-                     audio->num_bands(),
-                     audio->split_bands_f(i));
-#elif defined(WEBRTC_NS_FIXED)
-    WebRtcNsx_Process(suppressors_[i]->state(),
-                      audio->split_bands_const(i),
-                      audio->num_bands(),
-                      audio->split_bands(i));
-#endif
-  }
-}
-
-int NoiseSuppressionImpl::Enable(bool enable) {
-  rtc::CritScope cs(crit_);
-  if (enabled_ != enable) {
-    enabled_ = enable;
-    Initialize(channels_, sample_rate_hz_);
-  }
-  return AudioProcessing::kNoError;
-}
-
-bool NoiseSuppressionImpl::is_enabled() const {
-  rtc::CritScope cs(crit_);
-  return enabled_;
-}
-
-int NoiseSuppressionImpl::set_level(Level level) {
-  int policy = 1;
-  switch (level) {
-    case NoiseSuppression::kLow:
-      policy = 0;
-      break;
-    case NoiseSuppression::kModerate:
-      policy = 1;
-      break;
-    case NoiseSuppression::kHigh:
-      policy = 2;
-      break;
-    case NoiseSuppression::kVeryHigh:
-      policy = 3;
-      break;
-    default:
-      RTC_NOTREACHED();
-  }
-  rtc::CritScope cs(crit_);
-  level_ = level;
-  for (auto& suppressor : suppressors_) {
-    int error = NS_SET_POLICY(suppressor->state(), policy);
-    RTC_DCHECK_EQ(0, error);
-  }
-  return AudioProcessing::kNoError;
-}
-
-NoiseSuppression::Level NoiseSuppressionImpl::level() const {
-  rtc::CritScope cs(crit_);
-  return level_;
-}
-
-float NoiseSuppressionImpl::speech_probability() const {
-  rtc::CritScope cs(crit_);
-#if defined(WEBRTC_NS_FLOAT)
-  float probability_average = 0.0f;
-  for (auto& suppressor : suppressors_) {
-    probability_average +=
-        WebRtcNs_prior_speech_probability(suppressor->state());
-  }
-  if (!suppressors_.empty()) {
-    probability_average /= suppressors_.size();
-  }
-  return probability_average;
-#elif defined(WEBRTC_NS_FIXED)
-  // TODO(peah): Returning error code as a float! Remove this.
-  // Currently not available for the fixed point implementation.
-  return AudioProcessing::kUnsupportedFunctionError;
-#endif
-}
-
-std::vector<float> NoiseSuppressionImpl::NoiseEstimate() {
-  rtc::CritScope cs(crit_);
-  std::vector<float> noise_estimate;
-#if defined(WEBRTC_NS_FLOAT)
-  const float kNumChannelsFraction = 1.f / suppressors_.size();
-  noise_estimate.assign(WebRtcNs_num_freq(), 0.f);
-  for (auto& suppressor : suppressors_) {
-    const float* noise = WebRtcNs_noise_estimate(suppressor->state());
-    for (size_t i = 0; i < noise_estimate.size(); ++i) {
-      noise_estimate[i] += kNumChannelsFraction * noise[i];
-    }
-  }
-#elif defined(WEBRTC_NS_FIXED)
-  noise_estimate.assign(WebRtcNsx_num_freq(), 0.f);
-  for (auto& suppressor : suppressors_) {
-    int q_noise;
-    const uint32_t* noise = WebRtcNsx_noise_estimate(suppressor->state(),
-                                                     &q_noise);
-    const float kNormalizationFactor =
-        1.f / ((1 << q_noise) * suppressors_.size());
-    for (size_t i = 0; i < noise_estimate.size(); ++i) {
-      noise_estimate[i] += kNormalizationFactor * noise[i];
-    }
-  }
-#endif
-  return noise_estimate;
-}
-
-size_t NoiseSuppressionImpl::num_noise_bins() {
-#if defined(WEBRTC_NS_FLOAT)
-  return WebRtcNs_num_freq();
-#elif defined(WEBRTC_NS_FIXED)
-  return WebRtcNsx_num_freq();
-#endif
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/noise_suppression_impl.h b/modules/audio_processing/noise_suppression_impl.h
deleted file mode 100644
index 1c8cbb0..0000000
--- a/modules/audio_processing/noise_suppression_impl.h
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- *  Copyright (c) 2012 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_PROCESSING_NOISE_SUPPRESSION_IMPL_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_NOISE_SUPPRESSION_IMPL_H_
-
-#include <memory>
-#include <vector>
-
-#include "webrtc/modules/audio_processing/include/audio_processing.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/criticalsection.h"
-
-namespace webrtc {
-
-class AudioBuffer;
-
-class NoiseSuppressionImpl : public NoiseSuppression {
- public:
-  explicit NoiseSuppressionImpl(rtc::CriticalSection* crit);
-  ~NoiseSuppressionImpl() override;
-
-  // TODO(peah): Fold into ctor, once public API is removed.
-  void Initialize(size_t channels, int sample_rate_hz);
-  void AnalyzeCaptureAudio(AudioBuffer* audio);
-  void ProcessCaptureAudio(AudioBuffer* audio);
-
-  // NoiseSuppression implementation.
-  int Enable(bool enable) override;
-  bool is_enabled() const override;
-  int set_level(Level level) override;
-  Level level() const override;
-  float speech_probability() const override;
-  std::vector<float> NoiseEstimate() override;
-  static size_t num_noise_bins();
-
- private:
-  class Suppressor;
-  rtc::CriticalSection* const crit_;
-  bool enabled_ RTC_GUARDED_BY(crit_) = false;
-  Level level_ RTC_GUARDED_BY(crit_) = kModerate;
-  size_t channels_ RTC_GUARDED_BY(crit_) = 0;
-  int sample_rate_hz_ RTC_GUARDED_BY(crit_) = 0;
-  std::vector<std::unique_ptr<Suppressor>> suppressors_ RTC_GUARDED_BY(crit_);
-  RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(NoiseSuppressionImpl);
-};
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_NOISE_SUPPRESSION_IMPL_H_
diff --git a/modules/audio_processing/noise_suppression_unittest.cc b/modules/audio_processing/noise_suppression_unittest.cc
deleted file mode 100644
index 3595413..0000000
--- a/modules/audio_processing/noise_suppression_unittest.cc
+++ /dev/null
@@ -1,284 +0,0 @@
-/*
- *  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 <vector>
-
-#include "webrtc/api/array_view.h"
-#include "webrtc/modules/audio_processing/audio_buffer.h"
-#include "webrtc/modules/audio_processing/noise_suppression_impl.h"
-#include "webrtc/modules/audio_processing/test/audio_buffer_tools.h"
-#include "webrtc/modules/audio_processing/test/bitexactness_tools.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-namespace {
-
-const int kNumFramesToProcess = 1000;
-
-// Process one frame of data and produce the output.
-void ProcessOneFrame(int sample_rate_hz,
-                     AudioBuffer* capture_buffer,
-                     NoiseSuppressionImpl* noise_suppressor) {
-  if (sample_rate_hz > AudioProcessing::kSampleRate16kHz) {
-    capture_buffer->SplitIntoFrequencyBands();
-  }
-
-  noise_suppressor->AnalyzeCaptureAudio(capture_buffer);
-  noise_suppressor->ProcessCaptureAudio(capture_buffer);
-
-  if (sample_rate_hz > AudioProcessing::kSampleRate16kHz) {
-    capture_buffer->MergeFrequencyBands();
-  }
-}
-
-// Processes a specified amount of frames, verifies the results and reports
-// any errors.
-void RunBitexactnessTest(int sample_rate_hz,
-                         size_t num_channels,
-                         NoiseSuppressionImpl::Level level,
-                         float speech_probability_reference,
-                         rtc::ArrayView<const float> noise_estimate_reference,
-                         rtc::ArrayView<const float> output_reference) {
-  rtc::CriticalSection crit_capture;
-  NoiseSuppressionImpl noise_suppressor(&crit_capture);
-  noise_suppressor.Initialize(num_channels, sample_rate_hz);
-  noise_suppressor.Enable(true);
-  noise_suppressor.set_level(level);
-
-  int samples_per_channel = rtc::CheckedDivExact(sample_rate_hz, 100);
-  const StreamConfig capture_config(sample_rate_hz, num_channels, false);
-  AudioBuffer capture_buffer(
-      capture_config.num_frames(), capture_config.num_channels(),
-      capture_config.num_frames(), capture_config.num_channels(),
-      capture_config.num_frames());
-  test::InputAudioFile capture_file(
-      test::GetApmCaptureTestVectorFileName(sample_rate_hz));
-  std::vector<float> capture_input(samples_per_channel * num_channels);
-  for (size_t frame_no = 0; frame_no < kNumFramesToProcess; ++frame_no) {
-    ReadFloatSamplesFromStereoFile(samples_per_channel, num_channels,
-                                   &capture_file, capture_input);
-
-    test::CopyVectorToAudioBuffer(capture_config, capture_input,
-                                  &capture_buffer);
-
-    ProcessOneFrame(sample_rate_hz, &capture_buffer, &noise_suppressor);
-  }
-
-  // Extract test results.
-  std::vector<float> capture_output;
-  test::ExtractVectorFromAudioBuffer(capture_config, &capture_buffer,
-                                     &capture_output);
-  float speech_probability = noise_suppressor.speech_probability();
-  std::vector<float> noise_estimate = noise_suppressor.NoiseEstimate();
-
-  const float kVectorElementErrorBound = 1.0f / 32768.0f;
-  EXPECT_FLOAT_EQ(speech_probability_reference, speech_probability);
-  EXPECT_TRUE(test::VerifyArray(noise_estimate_reference, noise_estimate,
-                                kVectorElementErrorBound));
-
-  // Compare the output with the reference. Only the first values of the output
-  // from last frame processed are compared in order not having to specify all
-  // preceeding frames as testvectors. As the algorithm being tested has a
-  // memory, testing only the last frame implicitly also tests the preceeding
-  // frames.
-  EXPECT_TRUE(test::VerifyDeinterleavedArray(
-      capture_config.num_frames(), capture_config.num_channels(),
-      output_reference, capture_output, kVectorElementErrorBound));
-}
-
-}  // namespace
-
-TEST(NoiseSuppresionBitExactnessTest, Mono8kHzLow) {
-#if defined(WEBRTC_ARCH_ARM64)
-  const float kSpeechProbabilityReference = -4.0f;
-  const float kNoiseEstimateReference[] =
-      {1432.341431f, 3321.919922f, 7677.521973f};
-  const float kOutputReference[] = {0.003510f, 0.004517f, 0.004669f};
-#elif defined(WEBRTC_ARCH_ARM)
-  const float kSpeechProbabilityReference = -4.0f;
-  const float kNoiseEstimateReference[] =
-      {1432.341431f, 3321.919922f, 7677.521973f};
-  const float kOutputReference[] = {0.003510f, 0.004517f, 0.004669f};
-#else
-  const float kSpeechProbabilityReference = 0.73421317f;
-  const float kNoiseEstimateReference[] =
-      {1175.266113f, 3289.305908f, 7532.991211f};
-  const float kOutputReference[] = {0.003263f, 0.004402f, 0.004537f};
-#endif
-
-  RunBitexactnessTest(8000, 1, NoiseSuppression::Level::kLow,
-                      kSpeechProbabilityReference, kNoiseEstimateReference,
-                      kOutputReference);
-}
-
-TEST(NoiseSuppresionBitExactnessTest, Mono16kHzLow) {
-#if defined(WEBRTC_ARCH_ARM64)
-  const float kSpeechProbabilityReference = -4.0f;
-  const float kNoiseEstimateReference[] =
-      {2534.461914f, 6277.638672f, 14367.499023f};
-  const float kOutputReference[] = {0.003449f, 0.004334f, 0.004303f};
-#elif defined(WEBRTC_ARCH_ARM)
-  const float kSpeechProbabilityReference = -4.0f;
-  const float kNoiseEstimateReference[] =
-      {2534.461914f, 6277.638672f, 14367.499023f};
-  const float kOutputReference[] = {0.003449f, 0.004334f, 0.004303f};
-#else
-  const float kSpeechProbabilityReference = 0.71672988f;
-  const float kNoiseEstimateReference[] =
-      {2151.313965f, 6509.765137f, 15658.848633f};
-  const float kOutputReference[] = {0.003574f, 0.004494f, 0.004499f};
-#endif
-
-  RunBitexactnessTest(16000, 1, NoiseSuppression::Level::kLow,
-                      kSpeechProbabilityReference, kNoiseEstimateReference,
-                      kOutputReference);
-}
-
-TEST(NoiseSuppresionBitExactnessTest, Mono32kHzLow) {
-#if defined(WEBRTC_ARCH_ARM64)
-  const float kSpeechProbabilityReference = -4.0f;
-  const float kNoiseEstimateReference[] =
-      {2540.059082f, 6317.822754f, 14440.845703f};
-  const float kOutputReference[] = {0.001679f, 0.002411f, 0.002594f};
-#elif defined(WEBRTC_ARCH_ARM)
-  const float kSpeechProbabilityReference = -4.0f;
-  const float kNoiseEstimateReference[] =
-      {2540.059082f, 6317.822754f, 14440.845703f};
-  const float kOutputReference[] = {0.001679f, 0.002411f, 0.002594f};
-#else
-  const float kSpeechProbabilityReference = 0.67999554f;
-  const float kNoiseEstimateReference[] =
-      {2149.780518f, 7076.936035f, 14939.945312f};
-  const float kOutputReference[] = {0.001221f, 0.001984f, 0.002228f};
-#endif
-
-  RunBitexactnessTest(32000, 1, NoiseSuppression::Level::kLow,
-                      kSpeechProbabilityReference, kNoiseEstimateReference,
-                      kOutputReference);
-}
-
-TEST(NoiseSuppresionBitExactnessTest, Mono48kHzLow) {
-#if defined(WEBRTC_ARCH_ARM64)
-  const float kSpeechProbabilityReference = -4.0f;
-  const float kNoiseEstimateReference[] =
-      {2564.605713f, 6213.656250f, 13372.284180f};
-  const float kOutputReference[] = {-0.013185f, -0.012769f, -0.012023f};
-#elif defined(WEBRTC_ARCH_ARM)
-  const float kSpeechProbabilityReference = -4.0f;
-  const float kNoiseEstimateReference[] =
-      {2564.605713f, 6213.656250f, 13372.284180f};
-  const float kOutputReference[] = {-0.013185f, -0.012769f, -0.012023f};
-#else
-  const float kSpeechProbabilityReference = 0.70645678f;
-  const float kNoiseEstimateReference[] =
-      {2168.783203f, 6902.895508f, 13190.677734f};
-  const float kOutputReference[] = {-0.013062f, -0.012657f, -0.011934f};
-#endif
-
-  RunBitexactnessTest(48000, 1, NoiseSuppression::Level::kLow,
-                      kSpeechProbabilityReference, kNoiseEstimateReference,
-                      kOutputReference);
-}
-
-TEST(NoiseSuppresionBitExactnessTest, Stereo16kHzLow) {
-#if defined(WEBRTC_ARCH_ARM64)
-  const float kSpeechProbabilityReference = -4.0f;
-  const float kNoiseEstimateReference[] =
-      {9992.127930f, 12689.569336f, 11589.296875f};
-  const float kOutputReference[] = {-0.011108f, -0.007904f, -0.012390f,
-                                    -0.002441f, 0.000855f,  -0.003204f};
-#elif defined(WEBRTC_ARCH_ARM)
-  const float kSpeechProbabilityReference = -4.0f;
-  const float kNoiseEstimateReference[] =
-      {10321.353516f, 12133.852539f, 10923.060547f};
-  const float kOutputReference[] = {-0.011108f, -0.007904f, -0.012390f,
-                                    -0.002472f, 0.000916f,  -0.003235f};
-#else
-  const float kSpeechProbabilityReference = 0.67230678f;
-  const float kNoiseEstimateReference[] =
-      {9771.250000f, 11329.377930f, 10503.052734f};
-  const float kOutputReference[] = {-0.011459f, -0.008110f, -0.012728f,
-                                    -0.002399f, 0.001018f,  -0.003189f};
-#endif
-
-  RunBitexactnessTest(16000, 2, NoiseSuppression::Level::kLow,
-                      kSpeechProbabilityReference, kNoiseEstimateReference,
-                      kOutputReference);
-}
-
-TEST(NoiseSuppresionBitExactnessTest, Mono16kHzModerate) {
-#if defined(WEBRTC_ARCH_ARM64)
-  const float kSpeechProbabilityReference = -4.0f;
-  const float kNoiseEstimateReference[] =
-      {2057.085938f, 7601.055176f, 19666.187500f};
-  const float kOutputReference[] = {0.004669f, 0.005524f, 0.005432f};
-#elif defined(WEBRTC_ARCH_ARM)
-  const float kSpeechProbabilityReference = -4.0f;
-  const float kNoiseEstimateReference[] =
-      {2244.497803f, 6864.164062f, 16726.523438f};
-  const float kOutputReference[] = {0.004669f, 0.005615f, 0.005585f};
-#else
-  const float kSpeechProbabilityReference = 0.70897013f;
-  const float kNoiseEstimateReference[] =
-      {2171.490723f, 6553.567871f, 15626.562500f};
-  const float kOutputReference[] = {0.004513f, 0.005590f, 0.005614f};
-#endif
-
-  RunBitexactnessTest(16000, 1, NoiseSuppression::Level::kModerate,
-                      kSpeechProbabilityReference, kNoiseEstimateReference,
-                      kOutputReference);
-}
-
-TEST(NoiseSuppresionBitExactnessTest, Mono16kHzHigh) {
-#if defined(WEBRTC_ARCH_ARM64)
-  const float kSpeechProbabilityReference = -4.0f;
-  const float kNoiseEstimateReference[] =
-      {2095.148193f, 7698.553711f, 19689.533203f};
-  const float kOutputReference[] = {0.004639f, 0.005402f, 0.005310f};
-#elif defined(WEBRTC_ARCH_ARM)
-  const float kSpeechProbabilityReference = -4.0f;
-  const float kNoiseEstimateReference[] =
-      {2282.515625f, 6984.408203f, 16920.960938f};
-  const float kOutputReference[] = {0.004547f, 0.005432f, 0.005402f};
-#else
-  const float kSpeechProbabilityReference = 0.70106733f;
-  const float kNoiseEstimateReference[] =
-      {2224.968506f, 6712.025879f, 15785.087891f};
-  const float kOutputReference[] = {0.004394f, 0.005406f, 0.005416f};
-#endif
-
-  RunBitexactnessTest(16000, 1, NoiseSuppression::Level::kHigh,
-                      kSpeechProbabilityReference, kNoiseEstimateReference,
-                      kOutputReference);
-}
-
-TEST(NoiseSuppresionBitExactnessTest, Mono16kHzVeryHigh) {
-#if defined(WEBRTC_ARCH_ARM64)
-  const float kSpeechProbabilityReference = -4.0f;
-  const float kNoiseEstimateReference[] =
-      {2677.733398f, 6186.987305f, 14365.744141f};
-  const float kOutputReference[] = {0.004273f, 0.005127f, 0.005188f};
-#elif defined(WEBRTC_ARCH_ARM)
-  const float kSpeechProbabilityReference = -4.0f;
-  const float kNoiseEstimateReference[] =
-      {2677.733398f, 6186.987305f, 14365.744141f};
-  const float kOutputReference[] = {0.004273f, 0.005127f, 0.005188f};
-#else
-  const float kSpeechProbabilityReference = 0.70281971f;
-  const float kNoiseEstimateReference[] =
-      {2254.347900f, 6723.699707f, 15771.625977f};
-  const float kOutputReference[] = {0.004321f, 0.005247f, 0.005263f};
-#endif
-
-  RunBitexactnessTest(16000, 1, NoiseSuppression::Level::kVeryHigh,
-                      kSpeechProbabilityReference, kNoiseEstimateReference,
-                      kOutputReference);
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/ns/defines.h b/modules/audio_processing/ns/defines.h
deleted file mode 100644
index 8271332..0000000
--- a/modules/audio_processing/ns/defines.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- *  Copyright (c) 2011 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_PROCESSING_NS_MAIN_SOURCE_DEFINES_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_NS_MAIN_SOURCE_DEFINES_H_
-
-#define BLOCKL_MAX          160 // max processing block length: 160
-#define ANAL_BLOCKL_MAX     256 // max analysis block length: 256
-#define HALF_ANAL_BLOCKL    129 // half max analysis block length + 1
-#define NUM_HIGH_BANDS_MAX  2   // max number of high bands: 2
-
-#define QUANTILE            (float)0.25
-
-#define SIMULT              3
-#define END_STARTUP_LONG    200
-#define END_STARTUP_SHORT   50
-#define FACTOR              (float)40.0
-#define WIDTH               (float)0.01
-
-// Length of fft work arrays.
-#define IP_LENGTH (ANAL_BLOCKL_MAX >> 1) // must be at least ceil(2 + sqrt(ANAL_BLOCKL_MAX/2))
-#define W_LENGTH (ANAL_BLOCKL_MAX >> 1)
-
-//PARAMETERS FOR NEW METHOD
-#define DD_PR_SNR           (float)0.98 // DD update of prior SNR
-#define LRT_TAVG            (float)0.50 // tavg parameter for LRT (previously 0.90)
-#define SPECT_FL_TAVG       (float)0.30 // tavg parameter for spectral flatness measure
-#define SPECT_DIFF_TAVG     (float)0.30 // tavg parameter for spectral difference measure
-#define PRIOR_UPDATE        (float)0.10 // update parameter of prior model
-#define NOISE_UPDATE        (float)0.90 // update parameter for noise
-#define SPEECH_UPDATE       (float)0.99 // update parameter when likely speech
-#define WIDTH_PR_MAP        (float)4.0  // width parameter in sigmoid map for prior model
-#define LRT_FEATURE_THR     (float)0.5  // default threshold for LRT feature
-#define SF_FEATURE_THR      (float)0.5  // default threshold for Spectral Flatness feature
-#define SD_FEATURE_THR      (float)0.5  // default threshold for Spectral Difference feature
-#define PROB_RANGE          (float)0.20 // probability threshold for noise state in
-                                        // speech/noise likelihood
-#define HIST_PAR_EST         1000       // histogram size for estimation of parameters
-#define GAMMA_PAUSE         (float)0.05 // update for conservative noise estimate
-//
-#define B_LIM               (float)0.5  // threshold in final energy gain factor calculation
-#endif // WEBRTC_MODULES_AUDIO_PROCESSING_NS_MAIN_SOURCE_DEFINES_H_
diff --git a/modules/audio_processing/ns/noise_suppression.c b/modules/audio_processing/ns/noise_suppression.c
deleted file mode 100644
index 8b6f45f..0000000
--- a/modules/audio_processing/ns/noise_suppression.c
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- *  Copyright (c) 2012 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_processing/ns/noise_suppression.h"
-
-#include <stdlib.h>
-#include <string.h>
-
-#include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
-#include "webrtc/modules/audio_processing/ns/defines.h"
-#include "webrtc/modules/audio_processing/ns/ns_core.h"
-
-NsHandle* WebRtcNs_Create() {
-  NoiseSuppressionC* self = malloc(sizeof(NoiseSuppressionC));
-  self->initFlag = 0;
-  return (NsHandle*)self;
-}
-
-void WebRtcNs_Free(NsHandle* NS_inst) {
-  free(NS_inst);
-}
-
-int WebRtcNs_Init(NsHandle* NS_inst, uint32_t fs) {
-  return WebRtcNs_InitCore((NoiseSuppressionC*)NS_inst, fs);
-}
-
-int WebRtcNs_set_policy(NsHandle* NS_inst, int mode) {
-  return WebRtcNs_set_policy_core((NoiseSuppressionC*)NS_inst, mode);
-}
-
-void WebRtcNs_Analyze(NsHandle* NS_inst, const float* spframe) {
-  WebRtcNs_AnalyzeCore((NoiseSuppressionC*)NS_inst, spframe);
-}
-
-void WebRtcNs_Process(NsHandle* NS_inst,
-                      const float* const* spframe,
-                      size_t num_bands,
-                      float* const* outframe) {
-  WebRtcNs_ProcessCore((NoiseSuppressionC*)NS_inst, spframe, num_bands,
-                       outframe);
-}
-
-float WebRtcNs_prior_speech_probability(NsHandle* handle) {
-  NoiseSuppressionC* self = (NoiseSuppressionC*)handle;
-  if (handle == NULL) {
-    return -1;
-  }
-  if (self->initFlag == 0) {
-    return -1;
-  }
-  return self->priorSpeechProb;
-}
-
-const float* WebRtcNs_noise_estimate(const NsHandle* handle) {
-  const NoiseSuppressionC* self = (const NoiseSuppressionC*)handle;
-  if (handle == NULL || self->initFlag == 0) {
-    return NULL;
-  }
-  return self->noise;
-}
-
-size_t WebRtcNs_num_freq() {
-  return HALF_ANAL_BLOCKL;
-}
diff --git a/modules/audio_processing/ns/noise_suppression.h b/modules/audio_processing/ns/noise_suppression.h
deleted file mode 100644
index 41cad4e..0000000
--- a/modules/audio_processing/ns/noise_suppression.h
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
- *  Copyright (c) 2012 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_PROCESSING_NS_NOISE_SUPPRESSION_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_NS_NOISE_SUPPRESSION_H_
-
-#include <stddef.h>
-
-#include "webrtc/typedefs.h"
-
-typedef struct NsHandleT NsHandle;
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/*
- * This function creates an instance of the floating point Noise Suppression.
- */
-NsHandle* WebRtcNs_Create();
-
-/*
- * This function frees the dynamic memory of a specified noise suppression
- * instance.
- *
- * Input:
- *      - NS_inst       : Pointer to NS instance that should be freed
- */
-void WebRtcNs_Free(NsHandle* NS_inst);
-
-/*
- * This function initializes a NS instance and has to be called before any other
- * processing is made.
- *
- * Input:
- *      - NS_inst       : Instance that should be initialized
- *      - fs            : sampling frequency
- *
- * Output:
- *      - NS_inst       : Initialized instance
- *
- * Return value         :  0 - Ok
- *                        -1 - Error
- */
-int WebRtcNs_Init(NsHandle* NS_inst, uint32_t fs);
-
-/*
- * This changes the aggressiveness of the noise suppression method.
- *
- * Input:
- *      - NS_inst       : Noise suppression instance.
- *      - mode          : 0: Mild, 1: Medium , 2: Aggressive
- *
- * Output:
- *      - NS_inst       : Updated instance.
- *
- * Return value         :  0 - Ok
- *                        -1 - Error
- */
-int WebRtcNs_set_policy(NsHandle* NS_inst, int mode);
-
-/*
- * This functions estimates the background noise for the inserted speech frame.
- * The input and output signals should always be 10ms (80 or 160 samples).
- *
- * Input
- *      - NS_inst       : Noise suppression instance.
- *      - spframe       : Pointer to speech frame buffer for L band
- *
- * Output:
- *      - NS_inst       : Updated NS instance
- */
-void WebRtcNs_Analyze(NsHandle* NS_inst, const float* spframe);
-
-/*
- * This functions does Noise Suppression for the inserted speech frame. The
- * input and output signals should always be 10ms (80 or 160 samples).
- *
- * Input
- *      - NS_inst       : Noise suppression instance.
- *      - spframe       : Pointer to speech frame buffer for each band
- *      - num_bands     : Number of bands
- *
- * Output:
- *      - NS_inst       : Updated NS instance
- *      - outframe      : Pointer to output frame for each band
- */
-void WebRtcNs_Process(NsHandle* NS_inst,
-                     const float* const* spframe,
-                     size_t num_bands,
-                     float* const* outframe);
-
-/* Returns the internally used prior speech probability of the current frame.
- * There is a frequency bin based one as well, with which this should not be
- * confused.
- *
- * Input
- *      - handle        : Noise suppression instance.
- *
- * Return value         : Prior speech probability in interval [0.0, 1.0].
- *                        -1 - NULL pointer or uninitialized instance.
- */
-float WebRtcNs_prior_speech_probability(NsHandle* handle);
-
-/* Returns a pointer to the noise estimate per frequency bin. The number of
- * frequency bins can be provided using WebRtcNs_num_freq().
- *
- * Input
- *      - handle        : Noise suppression instance.
- *
- * Return value         : Pointer to the noise estimate per frequency bin.
- *                        Returns NULL if the input is a NULL pointer or an
- *                        uninitialized instance.
- */
-const float* WebRtcNs_noise_estimate(const NsHandle* handle);
-
-/* Returns the number of frequency bins, which is the length of the noise
- * estimate for example.
- *
- * Return value         : Number of frequency bins.
- */
-size_t WebRtcNs_num_freq();
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_NS_NOISE_SUPPRESSION_H_
diff --git a/modules/audio_processing/ns/noise_suppression_x.c b/modules/audio_processing/ns/noise_suppression_x.c
deleted file mode 100644
index 28a07e8..0000000
--- a/modules/audio_processing/ns/noise_suppression_x.c
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- *  Copyright (c) 2012 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_processing/ns/noise_suppression_x.h"
-
-#include <stdlib.h>
-
-#include "webrtc/common_audio/signal_processing/include/real_fft.h"
-#include "webrtc/modules/audio_processing/ns/nsx_core.h"
-#include "webrtc/modules/audio_processing/ns/nsx_defines.h"
-
-NsxHandle* WebRtcNsx_Create() {
-  NoiseSuppressionFixedC* self = malloc(sizeof(NoiseSuppressionFixedC));
-  WebRtcSpl_Init();
-  self->real_fft = NULL;
-  self->initFlag = 0;
-  return (NsxHandle*)self;
-}
-
-void WebRtcNsx_Free(NsxHandle* nsxInst) {
-  WebRtcSpl_FreeRealFFT(((NoiseSuppressionFixedC*)nsxInst)->real_fft);
-  free(nsxInst);
-}
-
-int WebRtcNsx_Init(NsxHandle* nsxInst, uint32_t fs) {
-  return WebRtcNsx_InitCore((NoiseSuppressionFixedC*)nsxInst, fs);
-}
-
-int WebRtcNsx_set_policy(NsxHandle* nsxInst, int mode) {
-  return WebRtcNsx_set_policy_core((NoiseSuppressionFixedC*)nsxInst, mode);
-}
-
-void WebRtcNsx_Process(NsxHandle* nsxInst,
-                      const short* const* speechFrame,
-                      int num_bands,
-                      short* const* outFrame) {
-  WebRtcNsx_ProcessCore((NoiseSuppressionFixedC*)nsxInst, speechFrame,
-                        num_bands, outFrame);
-}
-
-const uint32_t* WebRtcNsx_noise_estimate(const NsxHandle* nsxInst,
-                                         int* q_noise) {
-  *q_noise = 11;
-  const NoiseSuppressionFixedC* self = (const NoiseSuppressionFixedC*)nsxInst;
-  if (nsxInst == NULL || self->initFlag == 0) {
-    return NULL;
-  }
-  *q_noise += self->prevQNoise;
-  return self->prevNoiseU32;
-}
-
-size_t WebRtcNsx_num_freq() {
-  return HALF_ANAL_BLOCKL;
-}
diff --git a/modules/audio_processing/ns/noise_suppression_x.h b/modules/audio_processing/ns/noise_suppression_x.h
deleted file mode 100644
index 79a5fc6..0000000
--- a/modules/audio_processing/ns/noise_suppression_x.h
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- *  Copyright (c) 2012 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_PROCESSING_NS_NOISE_SUPPRESSION_X_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_NS_NOISE_SUPPRESSION_X_H_
-
-#include <stddef.h>
-
-#include "webrtc/typedefs.h"
-
-typedef struct NsxHandleT NsxHandle;
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/*
- * This function creates an instance of the fixed point Noise Suppression.
- */
-NsxHandle* WebRtcNsx_Create();
-
-/*
- * This function frees the dynamic memory of a specified Noise Suppression
- * instance.
- *
- * Input:
- *      - nsxInst       : Pointer to NS instance that should be freed
- */
-void WebRtcNsx_Free(NsxHandle* nsxInst);
-
-/*
- * This function initializes a NS instance
- *
- * Input:
- *      - nsxInst       : Instance that should be initialized
- *      - fs            : sampling frequency
- *
- * Output:
- *      - nsxInst       : Initialized instance
- *
- * Return value         :  0 - Ok
- *                        -1 - Error
- */
-int WebRtcNsx_Init(NsxHandle* nsxInst, uint32_t fs);
-
-/*
- * This changes the aggressiveness of the noise suppression method.
- *
- * Input:
- *      - nsxInst       : Instance that should be initialized
- *      - mode          : 0: Mild, 1: Medium , 2: Aggressive
- *
- * Output:
- *      - nsxInst       : Initialized instance
- *
- * Return value         :  0 - Ok
- *                        -1 - Error
- */
-int WebRtcNsx_set_policy(NsxHandle* nsxInst, int mode);
-
-/*
- * This functions does noise suppression for the inserted speech frame. The
- * input and output signals should always be 10ms (80 or 160 samples).
- *
- * Input
- *      - nsxInst       : NSx instance. Needs to be initiated before call.
- *      - speechFrame   : Pointer to speech frame buffer for each band
- *      - num_bands     : Number of bands
- *
- * Output:
- *      - nsxInst       : Updated NSx instance
- *      - outFrame      : Pointer to output frame for each band
- */
-void WebRtcNsx_Process(NsxHandle* nsxInst,
-                       const short* const* speechFrame,
-                       int num_bands,
-                       short* const* outFrame);
-
-/* Returns a pointer to the noise estimate per frequency bin. The number of
- * frequency bins can be provided using WebRtcNsx_num_freq().
- *
- * Input
- *      - nsxInst       : NSx instance. Needs to be initiated before call.
- *      - q_noise       : Q value of the noise estimate, which is the number of
- *                        bits that it needs to be right-shifted to be
- *                        normalized.
- *
- * Return value         : Pointer to the noise estimate per frequency bin.
- *                        Returns NULL if the input is a NULL pointer or an
- *                        uninitialized instance.
- */
-const uint32_t* WebRtcNsx_noise_estimate(const NsxHandle* nsxInst,
-                                         int* q_noise);
-
-/* Returns the number of frequency bins, which is the length of the noise
- * estimate for example.
- *
- * Return value         : Number of frequency bins.
- */
-size_t WebRtcNsx_num_freq();
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_NS_NOISE_SUPPRESSION_X_H_
diff --git a/modules/audio_processing/ns/ns_core.c b/modules/audio_processing/ns/ns_core.c
deleted file mode 100644
index a187c43..0000000
--- a/modules/audio_processing/ns/ns_core.c
+++ /dev/null
@@ -1,1416 +0,0 @@
-/*
- *  Copyright (c) 2012 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 <math.h>
-#include <string.h>
-#include <stdlib.h>
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/common_audio/fft4g.h"
-#include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
-#include "webrtc/modules/audio_processing/ns/noise_suppression.h"
-#include "webrtc/modules/audio_processing/ns/ns_core.h"
-#include "webrtc/modules/audio_processing/ns/windows_private.h"
-
-// Set Feature Extraction Parameters.
-static void set_feature_extraction_parameters(NoiseSuppressionC* self) {
-  // Bin size of histogram.
-  self->featureExtractionParams.binSizeLrt = 0.1f;
-  self->featureExtractionParams.binSizeSpecFlat = 0.05f;
-  self->featureExtractionParams.binSizeSpecDiff = 0.1f;
-
-  // Range of histogram over which LRT threshold is computed.
-  self->featureExtractionParams.rangeAvgHistLrt = 1.f;
-
-  // Scale parameters: multiply dominant peaks of the histograms by scale factor
-  // to obtain thresholds for prior model.
-  // For LRT and spectral difference.
-  self->featureExtractionParams.factor1ModelPars = 1.2f;
-  // For spectral_flatness: used when noise is flatter than speech.
-  self->featureExtractionParams.factor2ModelPars = 0.9f;
-
-  // Peak limit for spectral flatness (varies between 0 and 1).
-  self->featureExtractionParams.thresPosSpecFlat = 0.6f;
-
-  // Limit on spacing of two highest peaks in histogram: spacing determined by
-  // bin size.
-  self->featureExtractionParams.limitPeakSpacingSpecFlat =
-      2 * self->featureExtractionParams.binSizeSpecFlat;
-  self->featureExtractionParams.limitPeakSpacingSpecDiff =
-      2 * self->featureExtractionParams.binSizeSpecDiff;
-
-  // Limit on relevance of second peak.
-  self->featureExtractionParams.limitPeakWeightsSpecFlat = 0.5f;
-  self->featureExtractionParams.limitPeakWeightsSpecDiff = 0.5f;
-
-  // Fluctuation limit of LRT feature.
-  self->featureExtractionParams.thresFluctLrt = 0.05f;
-
-  // Limit on the max and min values for the feature thresholds.
-  self->featureExtractionParams.maxLrt = 1.f;
-  self->featureExtractionParams.minLrt = 0.2f;
-
-  self->featureExtractionParams.maxSpecFlat = 0.95f;
-  self->featureExtractionParams.minSpecFlat = 0.1f;
-
-  self->featureExtractionParams.maxSpecDiff = 1.f;
-  self->featureExtractionParams.minSpecDiff = 0.16f;
-
-  // Criteria of weight of histogram peak to accept/reject feature.
-  self->featureExtractionParams.thresWeightSpecFlat =
-      (int)(0.3 * (self->modelUpdatePars[1]));  // For spectral flatness.
-  self->featureExtractionParams.thresWeightSpecDiff =
-      (int)(0.3 * (self->modelUpdatePars[1]));  // For spectral difference.
-}
-
-// Initialize state.
-int WebRtcNs_InitCore(NoiseSuppressionC* self, uint32_t fs) {
-  int i;
-  // Check for valid pointer.
-  if (self == NULL) {
-    return -1;
-  }
-
-  // Initialization of struct.
-  if (fs == 8000 || fs == 16000 || fs == 32000 || fs == 48000) {
-    self->fs = fs;
-  } else {
-    return -1;
-  }
-  self->windShift = 0;
-  // We only support 10ms frames.
-  if (fs == 8000) {
-    self->blockLen = 80;
-    self->anaLen = 128;
-    self->window = kBlocks80w128;
-  } else {
-    self->blockLen = 160;
-    self->anaLen = 256;
-    self->window = kBlocks160w256;
-  }
-  self->magnLen = self->anaLen / 2 + 1;  // Number of frequency bins.
-
-  // Initialize FFT work arrays.
-  self->ip[0] = 0;  // Setting this triggers initialization.
-  memset(self->dataBuf, 0, sizeof(float) * ANAL_BLOCKL_MAX);
-  WebRtc_rdft(self->anaLen, 1, self->dataBuf, self->ip, self->wfft);
-
-  memset(self->analyzeBuf, 0, sizeof(float) * ANAL_BLOCKL_MAX);
-  memset(self->dataBuf, 0, sizeof(float) * ANAL_BLOCKL_MAX);
-  memset(self->syntBuf, 0, sizeof(float) * ANAL_BLOCKL_MAX);
-
-  // For HB processing.
-  memset(self->dataBufHB,
-         0,
-         sizeof(float) * NUM_HIGH_BANDS_MAX * ANAL_BLOCKL_MAX);
-
-  // For quantile noise estimation.
-  memset(self->quantile, 0, sizeof(float) * HALF_ANAL_BLOCKL);
-  for (i = 0; i < SIMULT * HALF_ANAL_BLOCKL; i++) {
-    self->lquantile[i] = 8.f;
-    self->density[i] = 0.3f;
-  }
-
-  for (i = 0; i < SIMULT; i++) {
-    self->counter[i] =
-        (int)floor((float)(END_STARTUP_LONG * (i + 1)) / (float)SIMULT);
-  }
-
-  self->updates = 0;
-
-  // Wiener filter initialization.
-  for (i = 0; i < HALF_ANAL_BLOCKL; i++) {
-    self->smooth[i] = 1.f;
-  }
-
-  // Set the aggressiveness: default.
-  self->aggrMode = 0;
-
-  // Initialize variables for new method.
-  self->priorSpeechProb = 0.5f;  // Prior prob for speech/noise.
-  // Previous analyze mag spectrum.
-  memset(self->magnPrevAnalyze, 0, sizeof(float) * HALF_ANAL_BLOCKL);
-  // Previous process mag spectrum.
-  memset(self->magnPrevProcess, 0, sizeof(float) * HALF_ANAL_BLOCKL);
-  // Current noise-spectrum.
-  memset(self->noise, 0, sizeof(float) * HALF_ANAL_BLOCKL);
-  // Previous noise-spectrum.
-  memset(self->noisePrev, 0, sizeof(float) * HALF_ANAL_BLOCKL);
-  // Conservative noise spectrum estimate.
-  memset(self->magnAvgPause, 0, sizeof(float) * HALF_ANAL_BLOCKL);
-  // For estimation of HB in second pass.
-  memset(self->speechProb, 0, sizeof(float) * HALF_ANAL_BLOCKL);
-  // Initial average magnitude spectrum.
-  memset(self->initMagnEst, 0, sizeof(float) * HALF_ANAL_BLOCKL);
-  for (i = 0; i < HALF_ANAL_BLOCKL; i++) {
-    // Smooth LR (same as threshold).
-    self->logLrtTimeAvg[i] = LRT_FEATURE_THR;
-  }
-
-  // Feature quantities.
-  // Spectral flatness (start on threshold).
-  self->featureData[0] = SF_FEATURE_THR;
-  self->featureData[1] = 0.f;  // Spectral entropy: not used in this version.
-  self->featureData[2] = 0.f;  // Spectral variance: not used in this version.
-  // Average LRT factor (start on threshold).
-  self->featureData[3] = LRT_FEATURE_THR;
-  // Spectral template diff (start on threshold).
-  self->featureData[4] = SF_FEATURE_THR;
-  self->featureData[5] = 0.f;  // Normalization for spectral difference.
-  // Window time-average of input magnitude spectrum.
-  self->featureData[6] = 0.f;
-
-  // Histogram quantities: used to estimate/update thresholds for features.
-  memset(self->histLrt, 0, sizeof(int) * HIST_PAR_EST);
-  memset(self->histSpecFlat, 0, sizeof(int) * HIST_PAR_EST);
-  memset(self->histSpecDiff, 0, sizeof(int) * HIST_PAR_EST);
-
-
-  self->blockInd = -1;  // Frame counter.
-  // Default threshold for LRT feature.
-  self->priorModelPars[0] = LRT_FEATURE_THR;
-  // Threshold for spectral flatness: determined on-line.
-  self->priorModelPars[1] = 0.5f;
-  // sgn_map par for spectral measure: 1 for flatness measure.
-  self->priorModelPars[2] = 1.f;
-  // Threshold for template-difference feature: determined on-line.
-  self->priorModelPars[3] = 0.5f;
-  // Default weighting parameter for LRT feature.
-  self->priorModelPars[4] = 1.f;
-  // Default weighting parameter for spectral flatness feature.
-  self->priorModelPars[5] = 0.f;
-  // Default weighting parameter for spectral difference feature.
-  self->priorModelPars[6] = 0.f;
-
-  // Update flag for parameters:
-  // 0 no update, 1 = update once, 2 = update every window.
-  self->modelUpdatePars[0] = 2;
-  self->modelUpdatePars[1] = 500;  // Window for update.
-  // Counter for update of conservative noise spectrum.
-  self->modelUpdatePars[2] = 0;
-  // Counter if the feature thresholds are updated during the sequence.
-  self->modelUpdatePars[3] = self->modelUpdatePars[1];
-
-  self->signalEnergy = 0.0;
-  self->sumMagn = 0.0;
-  self->whiteNoiseLevel = 0.0;
-  self->pinkNoiseNumerator = 0.0;
-  self->pinkNoiseExp = 0.0;
-
-  set_feature_extraction_parameters(self);
-
-  // Default mode.
-  WebRtcNs_set_policy_core(self, 0);
-
-  self->initFlag = 1;
-  return 0;
-}
-
-// Estimate noise.
-static void NoiseEstimation(NoiseSuppressionC* self,
-                            float* magn,
-                            float* noise) {
-  size_t i, s, offset;
-  float lmagn[HALF_ANAL_BLOCKL], delta;
-
-  if (self->updates < END_STARTUP_LONG) {
-    self->updates++;
-  }
-
-  for (i = 0; i < self->magnLen; i++) {
-    lmagn[i] = (float)log(magn[i]);
-  }
-
-  // Loop over simultaneous estimates.
-  for (s = 0; s < SIMULT; s++) {
-    offset = s * self->magnLen;
-
-    // newquantest(...)
-    for (i = 0; i < self->magnLen; i++) {
-      // Compute delta.
-      if (self->density[offset + i] > 1.0) {
-        delta = FACTOR * 1.f / self->density[offset + i];
-      } else {
-        delta = FACTOR;
-      }
-
-      // Update log quantile estimate.
-      if (lmagn[i] > self->lquantile[offset + i]) {
-        self->lquantile[offset + i] +=
-            QUANTILE * delta / (float)(self->counter[s] + 1);
-      } else {
-        self->lquantile[offset + i] -=
-            (1.f - QUANTILE) * delta / (float)(self->counter[s] + 1);
-      }
-
-      // Update density estimate.
-      if (fabs(lmagn[i] - self->lquantile[offset + i]) < WIDTH) {
-        self->density[offset + i] =
-            ((float)self->counter[s] * self->density[offset + i] +
-             1.f / (2.f * WIDTH)) /
-            (float)(self->counter[s] + 1);
-      }
-    }  // End loop over magnitude spectrum.
-
-    if (self->counter[s] >= END_STARTUP_LONG) {
-      self->counter[s] = 0;
-      if (self->updates >= END_STARTUP_LONG) {
-        for (i = 0; i < self->magnLen; i++) {
-          self->quantile[i] = (float)exp(self->lquantile[offset + i]);
-        }
-      }
-    }
-
-    self->counter[s]++;
-  }  // End loop over simultaneous estimates.
-
-  // Sequentially update the noise during startup.
-  if (self->updates < END_STARTUP_LONG) {
-    // Use the last "s" to get noise during startup that differ from zero.
-    for (i = 0; i < self->magnLen; i++) {
-      self->quantile[i] = (float)exp(self->lquantile[offset + i]);
-    }
-  }
-
-  for (i = 0; i < self->magnLen; i++) {
-    noise[i] = self->quantile[i];
-  }
-}
-
-// Extract thresholds for feature parameters.
-// Histograms are computed over some window size (given by
-// self->modelUpdatePars[1]).
-// Thresholds and weights are extracted every window.
-// |flag| = 0 updates histogram only, |flag| = 1 computes the threshold/weights.
-// Threshold and weights are returned in: self->priorModelPars.
-static void FeatureParameterExtraction(NoiseSuppressionC* self, int flag) {
-  int i, useFeatureSpecFlat, useFeatureSpecDiff, numHistLrt;
-  int maxPeak1, maxPeak2;
-  int weightPeak1SpecFlat, weightPeak2SpecFlat, weightPeak1SpecDiff,
-      weightPeak2SpecDiff;
-
-  float binMid, featureSum;
-  float posPeak1SpecFlat, posPeak2SpecFlat, posPeak1SpecDiff, posPeak2SpecDiff;
-  float fluctLrt, avgHistLrt, avgSquareHistLrt, avgHistLrtCompl;
-
-  // 3 features: LRT, flatness, difference.
-  // lrt_feature = self->featureData[3];
-  // flat_feature = self->featureData[0];
-  // diff_feature = self->featureData[4];
-
-  // Update histograms.
-  if (flag == 0) {
-    // LRT
-    if ((self->featureData[3] <
-         HIST_PAR_EST * self->featureExtractionParams.binSizeLrt) &&
-        (self->featureData[3] >= 0.0)) {
-      i = (int)(self->featureData[3] /
-                self->featureExtractionParams.binSizeLrt);
-      self->histLrt[i]++;
-    }
-    // Spectral flatness.
-    if ((self->featureData[0] <
-         HIST_PAR_EST * self->featureExtractionParams.binSizeSpecFlat) &&
-        (self->featureData[0] >= 0.0)) {
-      i = (int)(self->featureData[0] /
-                self->featureExtractionParams.binSizeSpecFlat);
-      self->histSpecFlat[i]++;
-    }
-    // Spectral difference.
-    if ((self->featureData[4] <
-         HIST_PAR_EST * self->featureExtractionParams.binSizeSpecDiff) &&
-        (self->featureData[4] >= 0.0)) {
-      i = (int)(self->featureData[4] /
-                self->featureExtractionParams.binSizeSpecDiff);
-      self->histSpecDiff[i]++;
-    }
-  }
-
-  // Extract parameters for speech/noise probability.
-  if (flag == 1) {
-    // LRT feature: compute the average over
-    // self->featureExtractionParams.rangeAvgHistLrt.
-    avgHistLrt = 0.0;
-    avgHistLrtCompl = 0.0;
-    avgSquareHistLrt = 0.0;
-    numHistLrt = 0;
-    for (i = 0; i < HIST_PAR_EST; i++) {
-      binMid = ((float)i + 0.5f) * self->featureExtractionParams.binSizeLrt;
-      if (binMid <= self->featureExtractionParams.rangeAvgHistLrt) {
-        avgHistLrt += self->histLrt[i] * binMid;
-        numHistLrt += self->histLrt[i];
-      }
-      avgSquareHistLrt += self->histLrt[i] * binMid * binMid;
-      avgHistLrtCompl += self->histLrt[i] * binMid;
-    }
-    if (numHistLrt > 0) {
-      avgHistLrt = avgHistLrt / ((float)numHistLrt);
-    }
-    avgHistLrtCompl = avgHistLrtCompl / ((float)self->modelUpdatePars[1]);
-    avgSquareHistLrt = avgSquareHistLrt / ((float)self->modelUpdatePars[1]);
-    fluctLrt = avgSquareHistLrt - avgHistLrt * avgHistLrtCompl;
-    // Get threshold for LRT feature.
-    if (fluctLrt < self->featureExtractionParams.thresFluctLrt) {
-      // Very low fluctuation, so likely noise.
-      self->priorModelPars[0] = self->featureExtractionParams.maxLrt;
-    } else {
-      self->priorModelPars[0] =
-          self->featureExtractionParams.factor1ModelPars * avgHistLrt;
-      // Check if value is within min/max range.
-      if (self->priorModelPars[0] < self->featureExtractionParams.minLrt) {
-        self->priorModelPars[0] = self->featureExtractionParams.minLrt;
-      }
-      if (self->priorModelPars[0] > self->featureExtractionParams.maxLrt) {
-        self->priorModelPars[0] = self->featureExtractionParams.maxLrt;
-      }
-    }
-    // Done with LRT feature.
-
-    // For spectral flatness and spectral difference: compute the main peaks of
-    // histogram.
-    maxPeak1 = 0;
-    maxPeak2 = 0;
-    posPeak1SpecFlat = 0.0;
-    posPeak2SpecFlat = 0.0;
-    weightPeak1SpecFlat = 0;
-    weightPeak2SpecFlat = 0;
-
-    // Peaks for flatness.
-    for (i = 0; i < HIST_PAR_EST; i++) {
-      binMid =
-          (i + 0.5f) * self->featureExtractionParams.binSizeSpecFlat;
-      if (self->histSpecFlat[i] > maxPeak1) {
-        // Found new "first" peak.
-        maxPeak2 = maxPeak1;
-        weightPeak2SpecFlat = weightPeak1SpecFlat;
-        posPeak2SpecFlat = posPeak1SpecFlat;
-
-        maxPeak1 = self->histSpecFlat[i];
-        weightPeak1SpecFlat = self->histSpecFlat[i];
-        posPeak1SpecFlat = binMid;
-      } else if (self->histSpecFlat[i] > maxPeak2) {
-        // Found new "second" peak.
-        maxPeak2 = self->histSpecFlat[i];
-        weightPeak2SpecFlat = self->histSpecFlat[i];
-        posPeak2SpecFlat = binMid;
-      }
-    }
-
-    // Compute two peaks for spectral difference.
-    maxPeak1 = 0;
-    maxPeak2 = 0;
-    posPeak1SpecDiff = 0.0;
-    posPeak2SpecDiff = 0.0;
-    weightPeak1SpecDiff = 0;
-    weightPeak2SpecDiff = 0;
-    // Peaks for spectral difference.
-    for (i = 0; i < HIST_PAR_EST; i++) {
-      binMid =
-          ((float)i + 0.5f) * self->featureExtractionParams.binSizeSpecDiff;
-      if (self->histSpecDiff[i] > maxPeak1) {
-        // Found new "first" peak.
-        maxPeak2 = maxPeak1;
-        weightPeak2SpecDiff = weightPeak1SpecDiff;
-        posPeak2SpecDiff = posPeak1SpecDiff;
-
-        maxPeak1 = self->histSpecDiff[i];
-        weightPeak1SpecDiff = self->histSpecDiff[i];
-        posPeak1SpecDiff = binMid;
-      } else if (self->histSpecDiff[i] > maxPeak2) {
-        // Found new "second" peak.
-        maxPeak2 = self->histSpecDiff[i];
-        weightPeak2SpecDiff = self->histSpecDiff[i];
-        posPeak2SpecDiff = binMid;
-      }
-    }
-
-    // For spectrum flatness feature.
-    useFeatureSpecFlat = 1;
-    // Merge the two peaks if they are close.
-    if ((fabs(posPeak2SpecFlat - posPeak1SpecFlat) <
-         self->featureExtractionParams.limitPeakSpacingSpecFlat) &&
-        (weightPeak2SpecFlat >
-         self->featureExtractionParams.limitPeakWeightsSpecFlat *
-             weightPeak1SpecFlat)) {
-      weightPeak1SpecFlat += weightPeak2SpecFlat;
-      posPeak1SpecFlat = 0.5f * (posPeak1SpecFlat + posPeak2SpecFlat);
-    }
-    // Reject if weight of peaks is not large enough, or peak value too small.
-    if (weightPeak1SpecFlat <
-            self->featureExtractionParams.thresWeightSpecFlat ||
-        posPeak1SpecFlat < self->featureExtractionParams.thresPosSpecFlat) {
-      useFeatureSpecFlat = 0;
-    }
-    // If selected, get the threshold.
-    if (useFeatureSpecFlat == 1) {
-      // Compute the threshold.
-      self->priorModelPars[1] =
-          self->featureExtractionParams.factor2ModelPars * posPeak1SpecFlat;
-      // Check if value is within min/max range.
-      if (self->priorModelPars[1] < self->featureExtractionParams.minSpecFlat) {
-        self->priorModelPars[1] = self->featureExtractionParams.minSpecFlat;
-      }
-      if (self->priorModelPars[1] > self->featureExtractionParams.maxSpecFlat) {
-        self->priorModelPars[1] = self->featureExtractionParams.maxSpecFlat;
-      }
-    }
-    // Done with flatness feature.
-
-    // For template feature.
-    useFeatureSpecDiff = 1;
-    // Merge the two peaks if they are close.
-    if ((fabs(posPeak2SpecDiff - posPeak1SpecDiff) <
-         self->featureExtractionParams.limitPeakSpacingSpecDiff) &&
-        (weightPeak2SpecDiff >
-         self->featureExtractionParams.limitPeakWeightsSpecDiff *
-             weightPeak1SpecDiff)) {
-      weightPeak1SpecDiff += weightPeak2SpecDiff;
-      posPeak1SpecDiff = 0.5f * (posPeak1SpecDiff + posPeak2SpecDiff);
-    }
-    // Get the threshold value.
-    self->priorModelPars[3] =
-        self->featureExtractionParams.factor1ModelPars * posPeak1SpecDiff;
-    // Reject if weight of peaks is not large enough.
-    if (weightPeak1SpecDiff <
-        self->featureExtractionParams.thresWeightSpecDiff) {
-      useFeatureSpecDiff = 0;
-    }
-    // Check if value is within min/max range.
-    if (self->priorModelPars[3] < self->featureExtractionParams.minSpecDiff) {
-      self->priorModelPars[3] = self->featureExtractionParams.minSpecDiff;
-    }
-    if (self->priorModelPars[3] > self->featureExtractionParams.maxSpecDiff) {
-      self->priorModelPars[3] = self->featureExtractionParams.maxSpecDiff;
-    }
-    // Done with spectral difference feature.
-
-    // Don't use template feature if fluctuation of LRT feature is very low:
-    // most likely just noise state.
-    if (fluctLrt < self->featureExtractionParams.thresFluctLrt) {
-      useFeatureSpecDiff = 0;
-    }
-
-    // Select the weights between the features.
-    // self->priorModelPars[4] is weight for LRT: always selected.
-    // self->priorModelPars[5] is weight for spectral flatness.
-    // self->priorModelPars[6] is weight for spectral difference.
-    featureSum = (float)(1 + useFeatureSpecFlat + useFeatureSpecDiff);
-    self->priorModelPars[4] = 1.f / featureSum;
-    self->priorModelPars[5] = ((float)useFeatureSpecFlat) / featureSum;
-    self->priorModelPars[6] = ((float)useFeatureSpecDiff) / featureSum;
-
-    // Set hists to zero for next update.
-    if (self->modelUpdatePars[0] >= 1) {
-      for (i = 0; i < HIST_PAR_EST; i++) {
-        self->histLrt[i] = 0;
-        self->histSpecFlat[i] = 0;
-        self->histSpecDiff[i] = 0;
-      }
-    }
-  }  // End of flag == 1.
-}
-
-// Compute spectral flatness on input spectrum.
-// |magnIn| is the magnitude spectrum.
-// Spectral flatness is returned in self->featureData[0].
-static void ComputeSpectralFlatness(NoiseSuppressionC* self,
-                                    const float* magnIn) {
-  size_t i;
-  size_t shiftLP = 1;  // Option to remove first bin(s) from spectral measures.
-  float avgSpectralFlatnessNum, avgSpectralFlatnessDen, spectralTmp;
-
-  // Compute spectral measures.
-  // For flatness.
-  avgSpectralFlatnessNum = 0.0;
-  avgSpectralFlatnessDen = self->sumMagn;
-  for (i = 0; i < shiftLP; i++) {
-    avgSpectralFlatnessDen -= magnIn[i];
-  }
-  // Compute log of ratio of the geometric to arithmetic mean: check for log(0)
-  // case.
-  for (i = shiftLP; i < self->magnLen; i++) {
-    if (magnIn[i] > 0.0) {
-      avgSpectralFlatnessNum += (float)log(magnIn[i]);
-    } else {
-      self->featureData[0] -= SPECT_FL_TAVG * self->featureData[0];
-      return;
-    }
-  }
-  // Normalize.
-  avgSpectralFlatnessDen = avgSpectralFlatnessDen / self->magnLen;
-  avgSpectralFlatnessNum = avgSpectralFlatnessNum / self->magnLen;
-
-  // Ratio and inverse log: check for case of log(0).
-  spectralTmp = (float)exp(avgSpectralFlatnessNum) / avgSpectralFlatnessDen;
-
-  // Time-avg update of spectral flatness feature.
-  self->featureData[0] += SPECT_FL_TAVG * (spectralTmp - self->featureData[0]);
-  // Done with flatness feature.
-}
-
-// Compute prior and post SNR based on quantile noise estimation.
-// Compute DD estimate of prior SNR.
-// Inputs:
-//   * |magn| is the signal magnitude spectrum estimate.
-//   * |noise| is the magnitude noise spectrum estimate.
-// Outputs:
-//   * |snrLocPrior| is the computed prior SNR.
-//   * |snrLocPost| is the computed post SNR.
-static void ComputeSnr(const NoiseSuppressionC* self,
-                       const float* magn,
-                       const float* noise,
-                       float* snrLocPrior,
-                       float* snrLocPost) {
-  size_t i;
-
-  for (i = 0; i < self->magnLen; i++) {
-    // Previous post SNR.
-    // Previous estimate: based on previous frame with gain filter.
-    float previousEstimateStsa = self->magnPrevAnalyze[i] /
-        (self->noisePrev[i] + 0.0001f) * self->smooth[i];
-    // Post SNR.
-    snrLocPost[i] = 0.f;
-    if (magn[i] > noise[i]) {
-      snrLocPost[i] = magn[i] / (noise[i] + 0.0001f) - 1.f;
-    }
-    // DD estimate is sum of two terms: current estimate and previous estimate.
-    // Directed decision update of snrPrior.
-    snrLocPrior[i] =
-        DD_PR_SNR * previousEstimateStsa + (1.f - DD_PR_SNR) * snrLocPost[i];
-  }  // End of loop over frequencies.
-}
-
-// Compute the difference measure between input spectrum and a template/learned
-// noise spectrum.
-// |magnIn| is the input spectrum.
-// The reference/template spectrum is self->magnAvgPause[i].
-// Returns (normalized) spectral difference in self->featureData[4].
-static void ComputeSpectralDifference(NoiseSuppressionC* self,
-                                      const float* magnIn) {
-  // avgDiffNormMagn = var(magnIn) - cov(magnIn, magnAvgPause)^2 /
-  // var(magnAvgPause)
-  size_t i;
-  float avgPause, avgMagn, covMagnPause, varPause, varMagn, avgDiffNormMagn;
-
-  avgPause = 0.0;
-  avgMagn = self->sumMagn;
-  // Compute average quantities.
-  for (i = 0; i < self->magnLen; i++) {
-    // Conservative smooth noise spectrum from pause frames.
-    avgPause += self->magnAvgPause[i];
-  }
-  avgPause /= self->magnLen;
-  avgMagn /= self->magnLen;
-
-  covMagnPause = 0.0;
-  varPause = 0.0;
-  varMagn = 0.0;
-  // Compute variance and covariance quantities.
-  for (i = 0; i < self->magnLen; i++) {
-    covMagnPause += (magnIn[i] - avgMagn) * (self->magnAvgPause[i] - avgPause);
-    varPause +=
-        (self->magnAvgPause[i] - avgPause) * (self->magnAvgPause[i] - avgPause);
-    varMagn += (magnIn[i] - avgMagn) * (magnIn[i] - avgMagn);
-  }
-  covMagnPause /= self->magnLen;
-  varPause /= self->magnLen;
-  varMagn /= self->magnLen;
-  // Update of average magnitude spectrum.
-  self->featureData[6] += self->signalEnergy;
-
-  avgDiffNormMagn =
-      varMagn - (covMagnPause * covMagnPause) / (varPause + 0.0001f);
-  // Normalize and compute time-avg update of difference feature.
-  avgDiffNormMagn = (float)(avgDiffNormMagn / (self->featureData[5] + 0.0001f));
-  self->featureData[4] +=
-      SPECT_DIFF_TAVG * (avgDiffNormMagn - self->featureData[4]);
-}
-
-// Compute speech/noise probability.
-// Speech/noise probability is returned in |probSpeechFinal|.
-// |magn| is the input magnitude spectrum.
-// |noise| is the noise spectrum.
-// |snrLocPrior| is the prior SNR for each frequency.
-// |snrLocPost| is the post SNR for each frequency.
-static void SpeechNoiseProb(NoiseSuppressionC* self,
-                            float* probSpeechFinal,
-                            const float* snrLocPrior,
-                            const float* snrLocPost) {
-  size_t i;
-  int sgnMap;
-  float invLrt, gainPrior, indPrior;
-  float logLrtTimeAvgKsum, besselTmp;
-  float indicator0, indicator1, indicator2;
-  float tmpFloat1, tmpFloat2;
-  float weightIndPrior0, weightIndPrior1, weightIndPrior2;
-  float threshPrior0, threshPrior1, threshPrior2;
-  float widthPrior, widthPrior0, widthPrior1, widthPrior2;
-
-  widthPrior0 = WIDTH_PR_MAP;
-  // Width for pause region: lower range, so increase width in tanh map.
-  widthPrior1 = 2.f * WIDTH_PR_MAP;
-  widthPrior2 = 2.f * WIDTH_PR_MAP;  // For spectral-difference measure.
-
-  // Threshold parameters for features.
-  threshPrior0 = self->priorModelPars[0];
-  threshPrior1 = self->priorModelPars[1];
-  threshPrior2 = self->priorModelPars[3];
-
-  // Sign for flatness feature.
-  sgnMap = (int)(self->priorModelPars[2]);
-
-  // Weight parameters for features.
-  weightIndPrior0 = self->priorModelPars[4];
-  weightIndPrior1 = self->priorModelPars[5];
-  weightIndPrior2 = self->priorModelPars[6];
-
-  // Compute feature based on average LR factor.
-  // This is the average over all frequencies of the smooth log LRT.
-  logLrtTimeAvgKsum = 0.0;
-  for (i = 0; i < self->magnLen; i++) {
-    tmpFloat1 = 1.f + 2.f * snrLocPrior[i];
-    tmpFloat2 = 2.f * snrLocPrior[i] / (tmpFloat1 + 0.0001f);
-    besselTmp = (snrLocPost[i] + 1.f) * tmpFloat2;
-    self->logLrtTimeAvg[i] +=
-        LRT_TAVG * (besselTmp - (float)log(tmpFloat1) - self->logLrtTimeAvg[i]);
-    logLrtTimeAvgKsum += self->logLrtTimeAvg[i];
-  }
-  logLrtTimeAvgKsum = (float)logLrtTimeAvgKsum / (self->magnLen);
-  self->featureData[3] = logLrtTimeAvgKsum;
-  // Done with computation of LR factor.
-
-  // Compute the indicator functions.
-  // Average LRT feature.
-  widthPrior = widthPrior0;
-  // Use larger width in tanh map for pause regions.
-  if (logLrtTimeAvgKsum < threshPrior0) {
-    widthPrior = widthPrior1;
-  }
-  // Compute indicator function: sigmoid map.
-  indicator0 =
-      0.5f *
-      ((float)tanh(widthPrior * (logLrtTimeAvgKsum - threshPrior0)) + 1.f);
-
-  // Spectral flatness feature.
-  tmpFloat1 = self->featureData[0];
-  widthPrior = widthPrior0;
-  // Use larger width in tanh map for pause regions.
-  if (sgnMap == 1 && (tmpFloat1 > threshPrior1)) {
-    widthPrior = widthPrior1;
-  }
-  if (sgnMap == -1 && (tmpFloat1 < threshPrior1)) {
-    widthPrior = widthPrior1;
-  }
-  // Compute indicator function: sigmoid map.
-  indicator1 =
-      0.5f *
-      ((float)tanh((float)sgnMap * widthPrior * (threshPrior1 - tmpFloat1)) +
-       1.f);
-
-  // For template spectrum-difference.
-  tmpFloat1 = self->featureData[4];
-  widthPrior = widthPrior0;
-  // Use larger width in tanh map for pause regions.
-  if (tmpFloat1 < threshPrior2) {
-    widthPrior = widthPrior2;
-  }
-  // Compute indicator function: sigmoid map.
-  indicator2 =
-      0.5f * ((float)tanh(widthPrior * (tmpFloat1 - threshPrior2)) + 1.f);
-
-  // Combine the indicator function with the feature weights.
-  indPrior = weightIndPrior0 * indicator0 + weightIndPrior1 * indicator1 +
-             weightIndPrior2 * indicator2;
-  // Done with computing indicator function.
-
-  // Compute the prior probability.
-  self->priorSpeechProb += PRIOR_UPDATE * (indPrior - self->priorSpeechProb);
-  // Make sure probabilities are within range: keep floor to 0.01.
-  if (self->priorSpeechProb > 1.f) {
-    self->priorSpeechProb = 1.f;
-  }
-  if (self->priorSpeechProb < 0.01f) {
-    self->priorSpeechProb = 0.01f;
-  }
-
-  // Final speech probability: combine prior model with LR factor:.
-  gainPrior = (1.f - self->priorSpeechProb) / (self->priorSpeechProb + 0.0001f);
-  for (i = 0; i < self->magnLen; i++) {
-    invLrt = (float)exp(-self->logLrtTimeAvg[i]);
-    invLrt = (float)gainPrior * invLrt;
-    probSpeechFinal[i] = 1.f / (1.f + invLrt);
-  }
-}
-
-// Update the noise features.
-// Inputs:
-//   * |magn| is the signal magnitude spectrum estimate.
-//   * |updateParsFlag| is an update flag for parameters.
-static void FeatureUpdate(NoiseSuppressionC* self,
-                          const float* magn,
-                          int updateParsFlag) {
-  // Compute spectral flatness on input spectrum.
-  ComputeSpectralFlatness(self, magn);
-  // Compute difference of input spectrum with learned/estimated noise spectrum.
-  ComputeSpectralDifference(self, magn);
-  // Compute histograms for parameter decisions (thresholds and weights for
-  // features).
-  // Parameters are extracted once every window time.
-  // (=self->modelUpdatePars[1])
-  if (updateParsFlag >= 1) {
-    // Counter update.
-    self->modelUpdatePars[3]--;
-    // Update histogram.
-    if (self->modelUpdatePars[3] > 0) {
-      FeatureParameterExtraction(self, 0);
-    }
-    // Compute model parameters.
-    if (self->modelUpdatePars[3] == 0) {
-      FeatureParameterExtraction(self, 1);
-      self->modelUpdatePars[3] = self->modelUpdatePars[1];
-      // If wish to update only once, set flag to zero.
-      if (updateParsFlag == 1) {
-        self->modelUpdatePars[0] = 0;
-      } else {
-        // Update every window:
-        // Get normalization for spectral difference for next window estimate.
-        self->featureData[6] =
-            self->featureData[6] / ((float)self->modelUpdatePars[1]);
-        self->featureData[5] =
-            0.5f * (self->featureData[6] + self->featureData[5]);
-        self->featureData[6] = 0.f;
-      }
-    }
-  }
-}
-
-// Update the noise estimate.
-// Inputs:
-//   * |magn| is the signal magnitude spectrum estimate.
-//   * |snrLocPrior| is the prior SNR.
-//   * |snrLocPost| is the post SNR.
-// Output:
-//   * |noise| is the updated noise magnitude spectrum estimate.
-static void UpdateNoiseEstimate(NoiseSuppressionC* self,
-                                const float* magn,
-                                const float* snrLocPrior,
-                                const float* snrLocPost,
-                                float* noise) {
-  size_t i;
-  float probSpeech, probNonSpeech;
-  // Time-avg parameter for noise update.
-  float gammaNoiseTmp = NOISE_UPDATE;
-  float gammaNoiseOld;
-  float noiseUpdateTmp;
-
-  for (i = 0; i < self->magnLen; i++) {
-    probSpeech = self->speechProb[i];
-    probNonSpeech = 1.f - probSpeech;
-    // Temporary noise update:
-    // Use it for speech frames if update value is less than previous.
-    noiseUpdateTmp = gammaNoiseTmp * self->noisePrev[i] +
-                     (1.f - gammaNoiseTmp) * (probNonSpeech * magn[i] +
-                                              probSpeech * self->noisePrev[i]);
-    // Time-constant based on speech/noise state.
-    gammaNoiseOld = gammaNoiseTmp;
-    gammaNoiseTmp = NOISE_UPDATE;
-    // Increase gamma (i.e., less noise update) for frame likely to be speech.
-    if (probSpeech > PROB_RANGE) {
-      gammaNoiseTmp = SPEECH_UPDATE;
-    }
-    // Conservative noise update.
-    if (probSpeech < PROB_RANGE) {
-      self->magnAvgPause[i] += GAMMA_PAUSE * (magn[i] - self->magnAvgPause[i]);
-    }
-    // Noise update.
-    if (gammaNoiseTmp == gammaNoiseOld) {
-      noise[i] = noiseUpdateTmp;
-    } else {
-      noise[i] = gammaNoiseTmp * self->noisePrev[i] +
-                 (1.f - gammaNoiseTmp) * (probNonSpeech * magn[i] +
-                                          probSpeech * self->noisePrev[i]);
-      // Allow for noise update downwards:
-      // If noise update decreases the noise, it is safe, so allow it to
-      // happen.
-      if (noiseUpdateTmp < noise[i]) {
-        noise[i] = noiseUpdateTmp;
-      }
-    }
-  }  // End of freq loop.
-}
-
-// Updates |buffer| with a new |frame|.
-// Inputs:
-//   * |frame| is a new speech frame or NULL for setting to zero.
-//   * |frame_length| is the length of the new frame.
-//   * |buffer_length| is the length of the buffer.
-// Output:
-//   * |buffer| is the updated buffer.
-static void UpdateBuffer(const float* frame,
-                         size_t frame_length,
-                         size_t buffer_length,
-                         float* buffer) {
-  RTC_DCHECK_LT(buffer_length, 2 * frame_length);
-
-  memcpy(buffer,
-         buffer + frame_length,
-         sizeof(*buffer) * (buffer_length - frame_length));
-  if (frame) {
-    memcpy(buffer + buffer_length - frame_length,
-           frame,
-           sizeof(*buffer) * frame_length);
-  } else {
-    memset(buffer + buffer_length - frame_length,
-           0,
-           sizeof(*buffer) * frame_length);
-  }
-}
-
-// Transforms the signal from time to frequency domain.
-// Inputs:
-//   * |time_data| is the signal in the time domain.
-//   * |time_data_length| is the length of the analysis buffer.
-//   * |magnitude_length| is the length of the spectrum magnitude, which equals
-//     the length of both |real| and |imag| (time_data_length / 2 + 1).
-// Outputs:
-//   * |time_data| is the signal in the frequency domain.
-//   * |real| is the real part of the frequency domain.
-//   * |imag| is the imaginary part of the frequency domain.
-//   * |magn| is the calculated signal magnitude in the frequency domain.
-static void FFT(NoiseSuppressionC* self,
-                float* time_data,
-                size_t time_data_length,
-                size_t magnitude_length,
-                float* real,
-                float* imag,
-                float* magn) {
-  size_t i;
-
-  RTC_DCHECK_EQ(magnitude_length, time_data_length / 2 + 1);
-
-  WebRtc_rdft(time_data_length, 1, time_data, self->ip, self->wfft);
-
-  imag[0] = 0;
-  real[0] = time_data[0];
-  magn[0] = fabsf(real[0]) + 1.f;
-  imag[magnitude_length - 1] = 0;
-  real[magnitude_length - 1] = time_data[1];
-  magn[magnitude_length - 1] = fabsf(real[magnitude_length - 1]) + 1.f;
-  for (i = 1; i < magnitude_length - 1; ++i) {
-    real[i] = time_data[2 * i];
-    imag[i] = time_data[2 * i + 1];
-    // Magnitude spectrum.
-    magn[i] = sqrtf(real[i] * real[i] + imag[i] * imag[i]) + 1.f;
-  }
-}
-
-// Transforms the signal from frequency to time domain.
-// Inputs:
-//   * |real| is the real part of the frequency domain.
-//   * |imag| is the imaginary part of the frequency domain.
-//   * |magnitude_length| is the length of the spectrum magnitude, which equals
-//     the length of both |real| and |imag|.
-//   * |time_data_length| is the length of the analysis buffer
-//     (2 * (magnitude_length - 1)).
-// Output:
-//   * |time_data| is the signal in the time domain.
-static void IFFT(NoiseSuppressionC* self,
-                 const float* real,
-                 const float* imag,
-                 size_t magnitude_length,
-                 size_t time_data_length,
-                 float* time_data) {
-  size_t i;
-
-  RTC_DCHECK_EQ(time_data_length, 2 * (magnitude_length - 1));
-
-  time_data[0] = real[0];
-  time_data[1] = real[magnitude_length - 1];
-  for (i = 1; i < magnitude_length - 1; ++i) {
-    time_data[2 * i] = real[i];
-    time_data[2 * i + 1] = imag[i];
-  }
-  WebRtc_rdft(time_data_length, -1, time_data, self->ip, self->wfft);
-
-  for (i = 0; i < time_data_length; ++i) {
-    time_data[i] *= 2.f / time_data_length;  // FFT scaling.
-  }
-}
-
-// Calculates the energy of a buffer.
-// Inputs:
-//   * |buffer| is the buffer over which the energy is calculated.
-//   * |length| is the length of the buffer.
-// Returns the calculated energy.
-static float Energy(const float* buffer, size_t length) {
-  size_t i;
-  float energy = 0.f;
-
-  for (i = 0; i < length; ++i) {
-    energy += buffer[i] * buffer[i];
-  }
-
-  return energy;
-}
-
-// Windows a buffer.
-// Inputs:
-//   * |window| is the window by which to multiply.
-//   * |data| is the data without windowing.
-//   * |length| is the length of the window and data.
-// Output:
-//   * |data_windowed| is the windowed data.
-static void Windowing(const float* window,
-                      const float* data,
-                      size_t length,
-                      float* data_windowed) {
-  size_t i;
-
-  for (i = 0; i < length; ++i) {
-    data_windowed[i] = window[i] * data[i];
-  }
-}
-
-// Estimate prior SNR decision-directed and compute DD based Wiener Filter.
-// Input:
-//   * |magn| is the signal magnitude spectrum estimate.
-// Output:
-//   * |theFilter| is the frequency response of the computed Wiener filter.
-static void ComputeDdBasedWienerFilter(const NoiseSuppressionC* self,
-                                       const float* magn,
-                                       float* theFilter) {
-  size_t i;
-  float snrPrior, previousEstimateStsa, currentEstimateStsa;
-
-  for (i = 0; i < self->magnLen; i++) {
-    // Previous estimate: based on previous frame with gain filter.
-    previousEstimateStsa = self->magnPrevProcess[i] /
-                           (self->noisePrev[i] + 0.0001f) * self->smooth[i];
-    // Post and prior SNR.
-    currentEstimateStsa = 0.f;
-    if (magn[i] > self->noise[i]) {
-      currentEstimateStsa = magn[i] / (self->noise[i] + 0.0001f) - 1.f;
-    }
-    // DD estimate is sum of two terms: current estimate and previous estimate.
-    // Directed decision update of |snrPrior|.
-    snrPrior = DD_PR_SNR * previousEstimateStsa +
-               (1.f - DD_PR_SNR) * currentEstimateStsa;
-    // Gain filter.
-    theFilter[i] = snrPrior / (self->overdrive + snrPrior);
-  }  // End of loop over frequencies.
-}
-
-// Changes the aggressiveness of the noise suppression method.
-// |mode| = 0 is mild (6dB), |mode| = 1 is medium (10dB) and |mode| = 2 is
-// aggressive (15dB).
-// Returns 0 on success and -1 otherwise.
-int WebRtcNs_set_policy_core(NoiseSuppressionC* self, int mode) {
-  // Allow for modes: 0, 1, 2, 3.
-  if (mode < 0 || mode > 3) {
-    return (-1);
-  }
-
-  self->aggrMode = mode;
-  if (mode == 0) {
-    self->overdrive = 1.f;
-    self->denoiseBound = 0.5f;
-    self->gainmap = 0;
-  } else if (mode == 1) {
-    // self->overdrive = 1.25f;
-    self->overdrive = 1.f;
-    self->denoiseBound = 0.25f;
-    self->gainmap = 1;
-  } else if (mode == 2) {
-    // self->overdrive = 1.25f;
-    self->overdrive = 1.1f;
-    self->denoiseBound = 0.125f;
-    self->gainmap = 1;
-  } else if (mode == 3) {
-    // self->overdrive = 1.3f;
-    self->overdrive = 1.25f;
-    self->denoiseBound = 0.09f;
-    self->gainmap = 1;
-  }
-  return 0;
-}
-
-void WebRtcNs_AnalyzeCore(NoiseSuppressionC* self, const float* speechFrame) {
-  size_t i;
-  const size_t kStartBand = 5;  // Skip first frequency bins during estimation.
-  int updateParsFlag;
-  float energy;
-  float signalEnergy = 0.f;
-  float sumMagn = 0.f;
-  float tmpFloat1, tmpFloat2, tmpFloat3;
-  float winData[ANAL_BLOCKL_MAX];
-  float magn[HALF_ANAL_BLOCKL], noise[HALF_ANAL_BLOCKL];
-  float snrLocPost[HALF_ANAL_BLOCKL], snrLocPrior[HALF_ANAL_BLOCKL];
-  float real[ANAL_BLOCKL_MAX], imag[HALF_ANAL_BLOCKL];
-  // Variables during startup.
-  float sum_log_i = 0.0;
-  float sum_log_i_square = 0.0;
-  float sum_log_magn = 0.0;
-  float sum_log_i_log_magn = 0.0;
-  float parametric_exp = 0.0;
-  float parametric_num = 0.0;
-
-  // Check that initiation has been done.
-  RTC_DCHECK_EQ(1, self->initFlag);
-  updateParsFlag = self->modelUpdatePars[0];
-
-  // Update analysis buffer for L band.
-  UpdateBuffer(speechFrame, self->blockLen, self->anaLen, self->analyzeBuf);
-
-  Windowing(self->window, self->analyzeBuf, self->anaLen, winData);
-  energy = Energy(winData, self->anaLen);
-  if (energy == 0.0) {
-    // We want to avoid updating statistics in this case:
-    // Updating feature statistics when we have zeros only will cause
-    // thresholds to move towards zero signal situations. This in turn has the
-    // effect that once the signal is "turned on" (non-zero values) everything
-    // will be treated as speech and there is no noise suppression effect.
-    // Depending on the duration of the inactive signal it takes a
-    // considerable amount of time for the system to learn what is noise and
-    // what is speech.
-    return;
-  }
-
-  self->blockInd++;  // Update the block index only when we process a block.
-
-  FFT(self, winData, self->anaLen, self->magnLen, real, imag, magn);
-
-  for (i = 0; i < self->magnLen; i++) {
-    signalEnergy += real[i] * real[i] + imag[i] * imag[i];
-    sumMagn += magn[i];
-    if (self->blockInd < END_STARTUP_SHORT) {
-      if (i >= kStartBand) {
-        tmpFloat2 = logf((float)i);
-        sum_log_i += tmpFloat2;
-        sum_log_i_square += tmpFloat2 * tmpFloat2;
-        tmpFloat1 = logf(magn[i]);
-        sum_log_magn += tmpFloat1;
-        sum_log_i_log_magn += tmpFloat2 * tmpFloat1;
-      }
-    }
-  }
-  signalEnergy /= self->magnLen;
-  self->signalEnergy = signalEnergy;
-  self->sumMagn = sumMagn;
-
-  // Quantile noise estimate.
-  NoiseEstimation(self, magn, noise);
-  // Compute simplified noise model during startup.
-  if (self->blockInd < END_STARTUP_SHORT) {
-    // Estimate White noise.
-    self->whiteNoiseLevel += sumMagn / self->magnLen * self->overdrive;
-    // Estimate Pink noise parameters.
-    tmpFloat1 = sum_log_i_square * (self->magnLen - kStartBand);
-    tmpFloat1 -= (sum_log_i * sum_log_i);
-    tmpFloat2 =
-        (sum_log_i_square * sum_log_magn - sum_log_i * sum_log_i_log_magn);
-    tmpFloat3 = tmpFloat2 / tmpFloat1;
-    // Constrain the estimated spectrum to be positive.
-    if (tmpFloat3 < 0.f) {
-      tmpFloat3 = 0.f;
-    }
-    self->pinkNoiseNumerator += tmpFloat3;
-    tmpFloat2 = (sum_log_i * sum_log_magn);
-    tmpFloat2 -= (self->magnLen - kStartBand) * sum_log_i_log_magn;
-    tmpFloat3 = tmpFloat2 / tmpFloat1;
-    // Constrain the pink noise power to be in the interval [0, 1].
-    if (tmpFloat3 < 0.f) {
-      tmpFloat3 = 0.f;
-    }
-    if (tmpFloat3 > 1.f) {
-      tmpFloat3 = 1.f;
-    }
-    self->pinkNoiseExp += tmpFloat3;
-
-    // Calculate frequency independent parts of parametric noise estimate.
-    if (self->pinkNoiseExp > 0.f) {
-      // Use pink noise estimate.
-      parametric_num =
-          expf(self->pinkNoiseNumerator / (float)(self->blockInd + 1));
-      parametric_num *= (float)(self->blockInd + 1);
-      parametric_exp = self->pinkNoiseExp / (float)(self->blockInd + 1);
-    }
-    for (i = 0; i < self->magnLen; i++) {
-      // Estimate the background noise using the white and pink noise
-      // parameters.
-      if (self->pinkNoiseExp == 0.f) {
-        // Use white noise estimate.
-        self->parametricNoise[i] = self->whiteNoiseLevel;
-      } else {
-        // Use pink noise estimate.
-        float use_band = (float)(i < kStartBand ? kStartBand : i);
-        self->parametricNoise[i] =
-            parametric_num / powf(use_band, parametric_exp);
-      }
-      // Weight quantile noise with modeled noise.
-      noise[i] *= (self->blockInd);
-      tmpFloat2 =
-          self->parametricNoise[i] * (END_STARTUP_SHORT - self->blockInd);
-      noise[i] += (tmpFloat2 / (float)(self->blockInd + 1));
-      noise[i] /= END_STARTUP_SHORT;
-    }
-  }
-  // Compute average signal during END_STARTUP_LONG time:
-  // used to normalize spectral difference measure.
-  if (self->blockInd < END_STARTUP_LONG) {
-    self->featureData[5] *= self->blockInd;
-    self->featureData[5] += signalEnergy;
-    self->featureData[5] /= (self->blockInd + 1);
-  }
-
-  // Post and prior SNR needed for SpeechNoiseProb.
-  ComputeSnr(self, magn, noise, snrLocPrior, snrLocPost);
-
-  FeatureUpdate(self, magn, updateParsFlag);
-  SpeechNoiseProb(self, self->speechProb, snrLocPrior, snrLocPost);
-  UpdateNoiseEstimate(self, magn, snrLocPrior, snrLocPost, noise);
-
-  // Keep track of noise spectrum for next frame.
-  memcpy(self->noise, noise, sizeof(*noise) * self->magnLen);
-  memcpy(self->magnPrevAnalyze, magn, sizeof(*magn) * self->magnLen);
-}
-
-void WebRtcNs_ProcessCore(NoiseSuppressionC* self,
-                          const float* const* speechFrame,
-                          size_t num_bands,
-                          float* const* outFrame) {
-  // Main routine for noise reduction.
-  int flagHB = 0;
-  size_t i, j;
-
-  float energy1, energy2, gain, factor, factor1, factor2;
-  float fout[BLOCKL_MAX];
-  float winData[ANAL_BLOCKL_MAX];
-  float magn[HALF_ANAL_BLOCKL];
-  float theFilter[HALF_ANAL_BLOCKL], theFilterTmp[HALF_ANAL_BLOCKL];
-  float real[ANAL_BLOCKL_MAX], imag[HALF_ANAL_BLOCKL];
-
-  // SWB variables.
-  int deltaBweHB = 1;
-  int deltaGainHB = 1;
-  float decayBweHB = 1.0;
-  float gainMapParHB = 1.0;
-  float gainTimeDomainHB = 1.0;
-  float avgProbSpeechHB, avgProbSpeechHBTmp, avgFilterGainHB, gainModHB;
-  float sumMagnAnalyze, sumMagnProcess;
-
-  // Check that initiation has been done.
-  RTC_DCHECK_EQ(1, self->initFlag);
-  RTC_DCHECK_LE(num_bands - 1, NUM_HIGH_BANDS_MAX);
-
-  const float* const* speechFrameHB = NULL;
-  float* const* outFrameHB = NULL;
-  size_t num_high_bands = 0;
-  if (num_bands > 1) {
-    speechFrameHB = &speechFrame[1];
-    outFrameHB = &outFrame[1];
-    num_high_bands = num_bands - 1;
-    flagHB = 1;
-    // Range for averaging low band quantities for H band gain.
-    deltaBweHB = (int)self->magnLen / 4;
-    deltaGainHB = deltaBweHB;
-  }
-
-  // Update analysis buffer for L band.
-  UpdateBuffer(speechFrame[0], self->blockLen, self->anaLen, self->dataBuf);
-
-  if (flagHB == 1) {
-    // Update analysis buffer for H bands.
-    for (i = 0; i < num_high_bands; ++i) {
-      UpdateBuffer(speechFrameHB[i],
-                   self->blockLen,
-                   self->anaLen,
-                   self->dataBufHB[i]);
-    }
-  }
-
-  Windowing(self->window, self->dataBuf, self->anaLen, winData);
-  energy1 = Energy(winData, self->anaLen);
-  if (energy1 == 0.0) {
-    // Synthesize the special case of zero input.
-    // Read out fully processed segment.
-    for (i = self->windShift; i < self->blockLen + self->windShift; i++) {
-      fout[i - self->windShift] = self->syntBuf[i];
-    }
-    // Update synthesis buffer.
-    UpdateBuffer(NULL, self->blockLen, self->anaLen, self->syntBuf);
-
-    for (i = 0; i < self->blockLen; ++i)
-      outFrame[0][i] =
-          WEBRTC_SPL_SAT(WEBRTC_SPL_WORD16_MAX, fout[i], WEBRTC_SPL_WORD16_MIN);
-
-    // For time-domain gain of HB.
-    if (flagHB == 1) {
-      for (i = 0; i < num_high_bands; ++i) {
-        for (j = 0; j < self->blockLen; ++j) {
-          outFrameHB[i][j] = WEBRTC_SPL_SAT(WEBRTC_SPL_WORD16_MAX,
-                                            self->dataBufHB[i][j],
-                                            WEBRTC_SPL_WORD16_MIN);
-        }
-      }
-    }
-
-    return;
-  }
-
-  FFT(self, winData, self->anaLen, self->magnLen, real, imag, magn);
-
-  if (self->blockInd < END_STARTUP_SHORT) {
-    for (i = 0; i < self->magnLen; i++) {
-      self->initMagnEst[i] += magn[i];
-    }
-  }
-
-  ComputeDdBasedWienerFilter(self, magn, theFilter);
-
-  for (i = 0; i < self->magnLen; i++) {
-    // Flooring bottom.
-    if (theFilter[i] < self->denoiseBound) {
-      theFilter[i] = self->denoiseBound;
-    }
-    // Flooring top.
-    if (theFilter[i] > 1.f) {
-      theFilter[i] = 1.f;
-    }
-    if (self->blockInd < END_STARTUP_SHORT) {
-      theFilterTmp[i] =
-          (self->initMagnEst[i] - self->overdrive * self->parametricNoise[i]);
-      theFilterTmp[i] /= (self->initMagnEst[i] + 0.0001f);
-      // Flooring bottom.
-      if (theFilterTmp[i] < self->denoiseBound) {
-        theFilterTmp[i] = self->denoiseBound;
-      }
-      // Flooring top.
-      if (theFilterTmp[i] > 1.f) {
-        theFilterTmp[i] = 1.f;
-      }
-      // Weight the two suppression filters.
-      theFilter[i] *= (self->blockInd);
-      theFilterTmp[i] *= (END_STARTUP_SHORT - self->blockInd);
-      theFilter[i] += theFilterTmp[i];
-      theFilter[i] /= (END_STARTUP_SHORT);
-    }
-
-    self->smooth[i] = theFilter[i];
-    real[i] *= self->smooth[i];
-    imag[i] *= self->smooth[i];
-  }
-  // Keep track of |magn| spectrum for next frame.
-  memcpy(self->magnPrevProcess, magn, sizeof(*magn) * self->magnLen);
-  memcpy(self->noisePrev, self->noise, sizeof(self->noise[0]) * self->magnLen);
-  // Back to time domain.
-  IFFT(self, real, imag, self->magnLen, self->anaLen, winData);
-
-  // Scale factor: only do it after END_STARTUP_LONG time.
-  factor = 1.f;
-  if (self->gainmap == 1 && self->blockInd > END_STARTUP_LONG) {
-    factor1 = 1.f;
-    factor2 = 1.f;
-
-    energy2 = Energy(winData, self->anaLen);
-    gain = (float)sqrt(energy2 / (energy1 + 1.f));
-
-    // Scaling for new version.
-    if (gain > B_LIM) {
-      factor1 = 1.f + 1.3f * (gain - B_LIM);
-      if (gain * factor1 > 1.f) {
-        factor1 = 1.f / gain;
-      }
-    }
-    if (gain < B_LIM) {
-      // Don't reduce scale too much for pause regions:
-      // attenuation here should be controlled by flooring.
-      if (gain <= self->denoiseBound) {
-        gain = self->denoiseBound;
-      }
-      factor2 = 1.f - 0.3f * (B_LIM - gain);
-    }
-    // Combine both scales with speech/noise prob:
-    // note prior (priorSpeechProb) is not frequency dependent.
-    factor = self->priorSpeechProb * factor1 +
-             (1.f - self->priorSpeechProb) * factor2;
-  }  // Out of self->gainmap == 1.
-
-  Windowing(self->window, winData, self->anaLen, winData);
-
-  // Synthesis.
-  for (i = 0; i < self->anaLen; i++) {
-    self->syntBuf[i] += factor * winData[i];
-  }
-  // Read out fully processed segment.
-  for (i = self->windShift; i < self->blockLen + self->windShift; i++) {
-    fout[i - self->windShift] = self->syntBuf[i];
-  }
-  // Update synthesis buffer.
-  UpdateBuffer(NULL, self->blockLen, self->anaLen, self->syntBuf);
-
-  for (i = 0; i < self->blockLen; ++i)
-    outFrame[0][i] =
-        WEBRTC_SPL_SAT(WEBRTC_SPL_WORD16_MAX, fout[i], WEBRTC_SPL_WORD16_MIN);
-
-  // For time-domain gain of HB.
-  if (flagHB == 1) {
-    // Average speech prob from low band.
-    // Average over second half (i.e., 4->8kHz) of frequencies spectrum.
-    avgProbSpeechHB = 0.0;
-    for (i = self->magnLen - deltaBweHB - 1; i < self->magnLen - 1; i++) {
-      avgProbSpeechHB += self->speechProb[i];
-    }
-    avgProbSpeechHB = avgProbSpeechHB / ((float)deltaBweHB);
-    // If the speech was suppressed by a component between Analyze and
-    // Process, for example the AEC, then it should not be considered speech
-    // for high band suppression purposes.
-    sumMagnAnalyze = 0;
-    sumMagnProcess = 0;
-    for (i = 0; i < self->magnLen; ++i) {
-      sumMagnAnalyze += self->magnPrevAnalyze[i];
-      sumMagnProcess += self->magnPrevProcess[i];
-    }
-    avgProbSpeechHB *= sumMagnProcess / sumMagnAnalyze;
-    // Average filter gain from low band.
-    // Average over second half (i.e., 4->8kHz) of frequencies spectrum.
-    avgFilterGainHB = 0.0;
-    for (i = self->magnLen - deltaGainHB - 1; i < self->magnLen - 1; i++) {
-      avgFilterGainHB += self->smooth[i];
-    }
-    avgFilterGainHB = avgFilterGainHB / ((float)(deltaGainHB));
-    avgProbSpeechHBTmp = 2.f * avgProbSpeechHB - 1.f;
-    // Gain based on speech probability.
-    gainModHB = 0.5f * (1.f + (float)tanh(gainMapParHB * avgProbSpeechHBTmp));
-    // Combine gain with low band gain.
-    gainTimeDomainHB = 0.5f * gainModHB + 0.5f * avgFilterGainHB;
-    if (avgProbSpeechHB >= 0.5f) {
-      gainTimeDomainHB = 0.25f * gainModHB + 0.75f * avgFilterGainHB;
-    }
-    gainTimeDomainHB = gainTimeDomainHB * decayBweHB;
-    // Make sure gain is within flooring range.
-    // Flooring bottom.
-    if (gainTimeDomainHB < self->denoiseBound) {
-      gainTimeDomainHB = self->denoiseBound;
-    }
-    // Flooring top.
-    if (gainTimeDomainHB > 1.f) {
-      gainTimeDomainHB = 1.f;
-    }
-    // Apply gain.
-    for (i = 0; i < num_high_bands; ++i) {
-      for (j = 0; j < self->blockLen; j++) {
-        outFrameHB[i][j] =
-            WEBRTC_SPL_SAT(WEBRTC_SPL_WORD16_MAX,
-                           gainTimeDomainHB * self->dataBufHB[i][j],
-                           WEBRTC_SPL_WORD16_MIN);
-      }
-    }
-  }  // End of H band gain computation.
-}
diff --git a/modules/audio_processing/ns/ns_core.h b/modules/audio_processing/ns/ns_core.h
deleted file mode 100644
index aba1c46..0000000
--- a/modules/audio_processing/ns/ns_core.h
+++ /dev/null
@@ -1,190 +0,0 @@
-/*
- *  Copyright (c) 2011 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_PROCESSING_NS_NS_CORE_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_NS_NS_CORE_H_
-
-#include "webrtc/modules/audio_processing/ns/defines.h"
-
-typedef struct NSParaExtract_ {
-  // Bin size of histogram.
-  float binSizeLrt;
-  float binSizeSpecFlat;
-  float binSizeSpecDiff;
-  // Range of histogram over which LRT threshold is computed.
-  float rangeAvgHistLrt;
-  // Scale parameters: multiply dominant peaks of the histograms by scale factor
-  // to obtain thresholds for prior model.
-  float factor1ModelPars;  // For LRT and spectral difference.
-  float factor2ModelPars;  // For spectral_flatness: used when noise is flatter
-                           // than speech.
-  // Peak limit for spectral flatness (varies between 0 and 1).
-  float thresPosSpecFlat;
-  // Limit on spacing of two highest peaks in histogram: spacing determined by
-  // bin size.
-  float limitPeakSpacingSpecFlat;
-  float limitPeakSpacingSpecDiff;
-  // Limit on relevance of second peak.
-  float limitPeakWeightsSpecFlat;
-  float limitPeakWeightsSpecDiff;
-  // Limit on fluctuation of LRT feature.
-  float thresFluctLrt;
-  // Limit on the max and min values for the feature thresholds.
-  float maxLrt;
-  float minLrt;
-  float maxSpecFlat;
-  float minSpecFlat;
-  float maxSpecDiff;
-  float minSpecDiff;
-  // Criteria of weight of histogram peak to accept/reject feature.
-  int thresWeightSpecFlat;
-  int thresWeightSpecDiff;
-
-} NSParaExtract;
-
-typedef struct NoiseSuppressionC_ {
-  uint32_t fs;
-  size_t blockLen;
-  size_t windShift;
-  size_t anaLen;
-  size_t magnLen;
-  int aggrMode;
-  const float* window;
-  float analyzeBuf[ANAL_BLOCKL_MAX];
-  float dataBuf[ANAL_BLOCKL_MAX];
-  float syntBuf[ANAL_BLOCKL_MAX];
-
-  int initFlag;
-  // Parameters for quantile noise estimation.
-  float density[SIMULT * HALF_ANAL_BLOCKL];
-  float lquantile[SIMULT * HALF_ANAL_BLOCKL];
-  float quantile[HALF_ANAL_BLOCKL];
-  int counter[SIMULT];
-  int updates;
-  // Parameters for Wiener filter.
-  float smooth[HALF_ANAL_BLOCKL];
-  float overdrive;
-  float denoiseBound;
-  int gainmap;
-  // FFT work arrays.
-  size_t ip[IP_LENGTH];
-  float wfft[W_LENGTH];
-
-  // Parameters for new method: some not needed, will reduce/cleanup later.
-  int32_t blockInd;  // Frame index counter.
-  int modelUpdatePars[4];  // Parameters for updating or estimating.
-  // Thresholds/weights for prior model.
-  float priorModelPars[7];  // Parameters for prior model.
-  float noise[HALF_ANAL_BLOCKL];  // Noise spectrum from current frame.
-  float noisePrev[HALF_ANAL_BLOCKL];  // Noise spectrum from previous frame.
-  // Magnitude spectrum of previous analyze frame.
-  float magnPrevAnalyze[HALF_ANAL_BLOCKL];
-  // Magnitude spectrum of previous process frame.
-  float magnPrevProcess[HALF_ANAL_BLOCKL];
-  float logLrtTimeAvg[HALF_ANAL_BLOCKL];  // Log LRT factor with time-smoothing.
-  float priorSpeechProb;  // Prior speech/noise probability.
-  float featureData[7];
-  // Conservative noise spectrum estimate.
-  float magnAvgPause[HALF_ANAL_BLOCKL];
-  float signalEnergy;  // Energy of |magn|.
-  float sumMagn;
-  float whiteNoiseLevel;  // Initial noise estimate.
-  float initMagnEst[HALF_ANAL_BLOCKL];  // Initial magnitude spectrum estimate.
-  float pinkNoiseNumerator;  // Pink noise parameter: numerator.
-  float pinkNoiseExp;  // Pink noise parameter: power of frequencies.
-  float parametricNoise[HALF_ANAL_BLOCKL];
-  // Parameters for feature extraction.
-  NSParaExtract featureExtractionParams;
-  // Histograms for parameter estimation.
-  int histLrt[HIST_PAR_EST];
-  int histSpecFlat[HIST_PAR_EST];
-  int histSpecDiff[HIST_PAR_EST];
-  // Quantities for high band estimate.
-  float speechProb[HALF_ANAL_BLOCKL];  // Final speech/noise prob: prior + LRT.
-  // Buffering data for HB.
-  float dataBufHB[NUM_HIGH_BANDS_MAX][ANAL_BLOCKL_MAX];
-
-} NoiseSuppressionC;
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/****************************************************************************
- * WebRtcNs_InitCore(...)
- *
- * This function initializes a noise suppression instance
- *
- * Input:
- *      - self          : Instance that should be initialized
- *      - fs            : Sampling frequency
- *
- * Output:
- *      - self          : Initialized instance
- *
- * Return value         :  0 - Ok
- *                        -1 - Error
- */
-int WebRtcNs_InitCore(NoiseSuppressionC* self, uint32_t fs);
-
-/****************************************************************************
- * WebRtcNs_set_policy_core(...)
- *
- * This changes the aggressiveness of the noise suppression method.
- *
- * Input:
- *      - self          : Instance that should be initialized
- *      - mode          : 0: Mild (6dB), 1: Medium (10dB), 2: Aggressive (15dB)
- *
- * Output:
- *      - self          : Initialized instance
- *
- * Return value         :  0 - Ok
- *                        -1 - Error
- */
-int WebRtcNs_set_policy_core(NoiseSuppressionC* self, int mode);
-
-/****************************************************************************
- * WebRtcNs_AnalyzeCore
- *
- * Estimate the background noise.
- *
- * Input:
- *      - self          : Instance that should be initialized
- *      - speechFrame   : Input speech frame for lower band
- *
- * Output:
- *      - self          : Updated instance
- */
-void WebRtcNs_AnalyzeCore(NoiseSuppressionC* self, const float* speechFrame);
-
-/****************************************************************************
- * WebRtcNs_ProcessCore
- *
- * Do noise suppression.
- *
- * Input:
- *      - self          : Instance that should be initialized
- *      - inFrame       : Input speech frame for each band
- *      - num_bands     : Number of bands
- *
- * Output:
- *      - self          : Updated instance
- *      - outFrame      : Output speech frame for each band
- */
-void WebRtcNs_ProcessCore(NoiseSuppressionC* self,
-                          const float* const* inFrame,
-                          size_t num_bands,
-                          float* const* outFrame);
-
-#ifdef __cplusplus
-}
-#endif
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_NS_NS_CORE_H_
diff --git a/modules/audio_processing/ns/nsx_core.c b/modules/audio_processing/ns/nsx_core.c
deleted file mode 100644
index 3d403bb..0000000
--- a/modules/audio_processing/ns/nsx_core.c
+++ /dev/null
@@ -1,2107 +0,0 @@
-/*
- *  Copyright (c) 2012 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_processing/ns/noise_suppression_x.h"
-
-#include <math.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/common_audio/signal_processing/include/real_fft.h"
-#include "webrtc/modules/audio_processing/ns/nsx_core.h"
-#include "webrtc/system_wrappers/include/cpu_features_wrapper.h"
-
-#if defined(WEBRTC_HAS_NEON)
-/* Tables are defined in ARM assembly files. */
-extern const int16_t WebRtcNsx_kLogTable[9];
-extern const int16_t WebRtcNsx_kCounterDiv[201];
-extern const int16_t WebRtcNsx_kLogTableFrac[256];
-#else
-static const int16_t WebRtcNsx_kLogTable[9] = {
-  0, 177, 355, 532, 710, 887, 1065, 1242, 1420
-};
-
-static const int16_t WebRtcNsx_kCounterDiv[201] = {
-  32767, 16384, 10923, 8192, 6554, 5461, 4681, 4096, 3641, 3277, 2979, 2731,
-  2521, 2341, 2185, 2048, 1928, 1820, 1725, 1638, 1560, 1489, 1425, 1365, 1311,
-  1260, 1214, 1170, 1130, 1092, 1057, 1024, 993, 964, 936, 910, 886, 862, 840,
-  819, 799, 780, 762, 745, 728, 712, 697, 683, 669, 655, 643, 630, 618, 607,
-  596, 585, 575, 565, 555, 546, 537, 529, 520, 512, 504, 496, 489, 482, 475,
-  468, 462, 455, 449, 443, 437, 431, 426, 420, 415, 410, 405, 400, 395, 390,
-  386, 381, 377, 372, 368, 364, 360, 356, 352, 349, 345, 341, 338, 334, 331,
-  328, 324, 321, 318, 315, 312, 309, 306, 303, 301, 298, 295, 293, 290, 287,
-  285, 282, 280, 278, 275, 273, 271, 269, 266, 264, 262, 260, 258, 256, 254,
-  252, 250, 248, 246, 245, 243, 241, 239, 237, 236, 234, 232, 231, 229, 228,
-  226, 224, 223, 221, 220, 218, 217, 216, 214, 213, 211, 210, 209, 207, 206,
-  205, 204, 202, 201, 200, 199, 197, 196, 195, 194, 193, 192, 191, 189, 188,
-  187, 186, 185, 184, 183, 182, 181, 180, 179, 178, 177, 176, 175, 174, 173,
-  172, 172, 171, 170, 169, 168, 167, 166, 165, 165, 164, 163
-};
-
-static const int16_t WebRtcNsx_kLogTableFrac[256] = {
-  0,   1,   3,   4,   6,   7,   9,  10,  11,  13,  14,  16,  17,  18,  20,  21,
-  22,  24,  25,  26,  28,  29,  30,  32,  33,  34,  36,  37,  38,  40,  41,  42,
-  44,  45,  46,  47,  49,  50,  51,  52,  54,  55,  56,  57,  59,  60,  61,  62,
-  63,  65,  66,  67,  68,  69,  71,  72,  73,  74,  75,  77,  78,  79,  80,  81,
-  82,  84,  85,  86,  87,  88,  89,  90,  92,  93,  94,  95,  96,  97,  98,  99,
-  100, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 116,
-  117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131,
-  132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146,
-  147, 148, 149, 150, 151, 152, 153, 154, 155, 155, 156, 157, 158, 159, 160,
-  161, 162, 163, 164, 165, 166, 167, 168, 169, 169, 170, 171, 172, 173, 174,
-  175, 176, 177, 178, 178, 179, 180, 181, 182, 183, 184, 185, 185, 186, 187,
-  188, 189, 190, 191, 192, 192, 193, 194, 195, 196, 197, 198, 198, 199, 200,
-  201, 202, 203, 203, 204, 205, 206, 207, 208, 208, 209, 210, 211, 212, 212,
-  213, 214, 215, 216, 216, 217, 218, 219, 220, 220, 221, 222, 223, 224, 224,
-  225, 226, 227, 228, 228, 229, 230, 231, 231, 232, 233, 234, 234, 235, 236,
-  237, 238, 238, 239, 240, 241, 241, 242, 243, 244, 244, 245, 246, 247, 247,
-  248, 249, 249, 250, 251, 252, 252, 253, 254, 255, 255
-};
-#endif  // WEBRTC_HAS_NEON
-
-// Skip first frequency bins during estimation. (0 <= value < 64)
-static const size_t kStartBand = 5;
-
-// hybrib Hanning & flat window
-static const int16_t kBlocks80w128x[128] = {
-  0,    536,   1072,   1606,   2139,   2669,   3196,   3720,   4240,   4756,   5266,
-  5771,   6270,   6762,   7246,   7723,   8192,   8652,   9102,   9543,   9974,  10394,
-  10803,  11200,  11585,  11958,  12318,  12665,  12998,  13318,  13623,  13913,  14189,
-  14449,  14694,  14924,  15137,  15334,  15515,  15679,  15826,  15956,  16069,  16165,
-  16244,  16305,  16349,  16375,  16384,  16384,  16384,  16384,  16384,  16384,  16384,
-  16384,  16384,  16384,  16384,  16384,  16384,  16384,  16384,  16384,  16384,  16384,
-  16384,  16384,  16384,  16384,  16384,  16384,  16384,  16384,  16384,  16384,  16384,
-  16384,  16384,  16384,  16384,  16375,  16349,  16305,  16244,  16165,  16069,  15956,
-  15826,  15679,  15515,  15334,  15137,  14924,  14694,  14449,  14189,  13913,  13623,
-  13318,  12998,  12665,  12318,  11958,  11585,  11200,  10803,  10394,   9974,   9543,
-  9102,   8652,   8192,   7723,   7246,   6762,   6270,   5771,   5266,   4756,   4240,
-  3720,   3196,   2669,   2139,   1606,   1072,    536
-};
-
-// hybrib Hanning & flat window
-static const int16_t kBlocks160w256x[256] = {
-  0,   268,   536,   804,  1072,  1339,  1606,  1872,
-  2139,  2404,  2669,  2933,  3196,  3459,  3720,  3981,
-  4240,  4499,  4756,  5012,  5266,  5520,  5771,  6021,
-  6270,  6517,  6762,  7005,  7246,  7486,  7723,  7959,
-  8192,  8423,  8652,  8878,  9102,  9324,  9543,  9760,
-  9974, 10185, 10394, 10600, 10803, 11003, 11200, 11394,
-  11585, 11773, 11958, 12140, 12318, 12493, 12665, 12833,
-  12998, 13160, 13318, 13472, 13623, 13770, 13913, 14053,
-  14189, 14321, 14449, 14574, 14694, 14811, 14924, 15032,
-  15137, 15237, 15334, 15426, 15515, 15599, 15679, 15754,
-  15826, 15893, 15956, 16015, 16069, 16119, 16165, 16207,
-  16244, 16277, 16305, 16329, 16349, 16364, 16375, 16382,
-  16384, 16384, 16384, 16384, 16384, 16384, 16384, 16384,
-  16384, 16384, 16384, 16384, 16384, 16384, 16384, 16384,
-  16384, 16384, 16384, 16384, 16384, 16384, 16384, 16384,
-  16384, 16384, 16384, 16384, 16384, 16384, 16384, 16384,
-  16384, 16384, 16384, 16384, 16384, 16384, 16384, 16384,
-  16384, 16384, 16384, 16384, 16384, 16384, 16384, 16384,
-  16384, 16384, 16384, 16384, 16384, 16384, 16384, 16384,
-  16384, 16384, 16384, 16384, 16384, 16384, 16384, 16384,
-  16384, 16382, 16375, 16364, 16349, 16329, 16305, 16277,
-  16244, 16207, 16165, 16119, 16069, 16015, 15956, 15893,
-  15826, 15754, 15679, 15599, 15515, 15426, 15334, 15237,
-  15137, 15032, 14924, 14811, 14694, 14574, 14449, 14321,
-  14189, 14053, 13913, 13770, 13623, 13472, 13318, 13160,
-  12998, 12833, 12665, 12493, 12318, 12140, 11958, 11773,
-  11585, 11394, 11200, 11003, 10803, 10600, 10394, 10185,
-  9974,  9760,  9543,  9324,  9102,  8878,  8652,  8423,
-  8192,  7959,  7723,  7486,  7246,  7005,  6762,  6517,
-  6270,  6021,  5771,  5520,  5266,  5012,  4756,  4499,
-  4240,  3981,  3720,  3459,  3196,  2933,  2669,  2404,
-  2139,  1872,  1606,  1339,  1072,   804,   536,   268
-};
-
-// Gain factor1 table: Input value in Q8 and output value in Q13
-// original floating point code
-//  if (gain > blim) {
-//    factor1 = 1.0 + 1.3 * (gain - blim);
-//    if (gain * factor1 > 1.0) {
-//      factor1 = 1.0 / gain;
-//    }
-//  } else {
-//    factor1 = 1.0;
-//  }
-static const int16_t kFactor1Table[257] = {
-  8192, 8192, 8192, 8192, 8192, 8192, 8192,
-  8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192,
-  8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192,
-  8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192,
-  8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192,
-  8192, 8192, 8233, 8274, 8315, 8355, 8396, 8436, 8475, 8515, 8554, 8592, 8631, 8669,
-  8707, 8745, 8783, 8820, 8857, 8894, 8931, 8967, 9003, 9039, 9075, 9111, 9146, 9181,
-  9216, 9251, 9286, 9320, 9354, 9388, 9422, 9456, 9489, 9523, 9556, 9589, 9622, 9655,
-  9687, 9719, 9752, 9784, 9816, 9848, 9879, 9911, 9942, 9973, 10004, 10035, 10066,
-  10097, 10128, 10158, 10188, 10218, 10249, 10279, 10308, 10338, 10368, 10397, 10426,
-  10456, 10485, 10514, 10543, 10572, 10600, 10629, 10657, 10686, 10714, 10742, 10770,
-  10798, 10826, 10854, 10882, 10847, 10810, 10774, 10737, 10701, 10666, 10631, 10596,
-  10562, 10527, 10494, 10460, 10427, 10394, 10362, 10329, 10297, 10266, 10235, 10203,
-  10173, 10142, 10112, 10082, 10052, 10023, 9994, 9965, 9936, 9908, 9879, 9851, 9824,
-  9796, 9769, 9742, 9715, 9689, 9662, 9636, 9610, 9584, 9559, 9534, 9508, 9484, 9459,
-  9434, 9410, 9386, 9362, 9338, 9314, 9291, 9268, 9245, 9222, 9199, 9176, 9154, 9132,
-  9110, 9088, 9066, 9044, 9023, 9002, 8980, 8959, 8939, 8918, 8897, 8877, 8857, 8836,
-  8816, 8796, 8777, 8757, 8738, 8718, 8699, 8680, 8661, 8642, 8623, 8605, 8586, 8568,
-  8550, 8532, 8514, 8496, 8478, 8460, 8443, 8425, 8408, 8391, 8373, 8356, 8339, 8323,
-  8306, 8289, 8273, 8256, 8240, 8224, 8208, 8192
-};
-
-// For Factor2 tables
-// original floating point code
-// if (gain > blim) {
-//   factor2 = 1.0;
-// } else {
-//   factor2 = 1.0 - 0.3 * (blim - gain);
-//   if (gain <= inst->denoiseBound) {
-//     factor2 = 1.0 - 0.3 * (blim - inst->denoiseBound);
-//   }
-// }
-//
-// Gain factor table: Input value in Q8 and output value in Q13
-static const int16_t kFactor2Aggressiveness1[257] = {
-  7577, 7577, 7577, 7577, 7577, 7577,
-  7577, 7577, 7577, 7577, 7577, 7577, 7577, 7577, 7577, 7577, 7577, 7596, 7614, 7632,
-  7650, 7667, 7683, 7699, 7715, 7731, 7746, 7761, 7775, 7790, 7804, 7818, 7832, 7845,
-  7858, 7871, 7884, 7897, 7910, 7922, 7934, 7946, 7958, 7970, 7982, 7993, 8004, 8016,
-  8027, 8038, 8049, 8060, 8070, 8081, 8091, 8102, 8112, 8122, 8132, 8143, 8152, 8162,
-  8172, 8182, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192,
-  8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192,
-  8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192,
-  8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192,
-  8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192,
-  8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192,
-  8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192,
-  8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192,
-  8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192,
-  8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192,
-  8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192,
-  8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192,
-  8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192,
-  8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192
-};
-
-// Gain factor table: Input value in Q8 and output value in Q13
-static const int16_t kFactor2Aggressiveness2[257] = {
-  7270, 7270, 7270, 7270, 7270, 7306,
-  7339, 7369, 7397, 7424, 7448, 7472, 7495, 7517, 7537, 7558, 7577, 7596, 7614, 7632,
-  7650, 7667, 7683, 7699, 7715, 7731, 7746, 7761, 7775, 7790, 7804, 7818, 7832, 7845,
-  7858, 7871, 7884, 7897, 7910, 7922, 7934, 7946, 7958, 7970, 7982, 7993, 8004, 8016,
-  8027, 8038, 8049, 8060, 8070, 8081, 8091, 8102, 8112, 8122, 8132, 8143, 8152, 8162,
-  8172, 8182, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192,
-  8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192,
-  8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192,
-  8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192,
-  8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192,
-  8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192,
-  8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192,
-  8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192,
-  8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192,
-  8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192,
-  8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192,
-  8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192,
-  8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192,
-  8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192
-};
-
-// Gain factor table: Input value in Q8 and output value in Q13
-static const int16_t kFactor2Aggressiveness3[257] = {
-  7184, 7184, 7184, 7229, 7270, 7306,
-  7339, 7369, 7397, 7424, 7448, 7472, 7495, 7517, 7537, 7558, 7577, 7596, 7614, 7632,
-  7650, 7667, 7683, 7699, 7715, 7731, 7746, 7761, 7775, 7790, 7804, 7818, 7832, 7845,
-  7858, 7871, 7884, 7897, 7910, 7922, 7934, 7946, 7958, 7970, 7982, 7993, 8004, 8016,
-  8027, 8038, 8049, 8060, 8070, 8081, 8091, 8102, 8112, 8122, 8132, 8143, 8152, 8162,
-  8172, 8182, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192,
-  8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192,
-  8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192,
-  8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192,
-  8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192,
-  8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192,
-  8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192,
-  8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192,
-  8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192,
-  8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192,
-  8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192,
-  8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192,
-  8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192,
-  8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192, 8192
-};
-
-// sum of log2(i) from table index to inst->anaLen2 in Q5
-// Note that the first table value is invalid, since log2(0) = -infinity
-static const int16_t kSumLogIndex[66] = {
-  0,  22917,  22917,  22885,  22834,  22770,  22696,  22613,
-  22524,  22428,  22326,  22220,  22109,  21994,  21876,  21754,
-  21629,  21501,  21370,  21237,  21101,  20963,  20822,  20679,
-  20535,  20388,  20239,  20089,  19937,  19783,  19628,  19470,
-  19312,  19152,  18991,  18828,  18664,  18498,  18331,  18164,
-  17994,  17824,  17653,  17480,  17306,  17132,  16956,  16779,
-  16602,  16423,  16243,  16063,  15881,  15699,  15515,  15331,
-  15146,  14960,  14774,  14586,  14398,  14209,  14019,  13829,
-  13637,  13445
-};
-
-// sum of log2(i)^2 from table index to inst->anaLen2 in Q2
-// Note that the first table value is invalid, since log2(0) = -infinity
-static const int16_t kSumSquareLogIndex[66] = {
-  0,  16959,  16959,  16955,  16945,  16929,  16908,  16881,
-  16850,  16814,  16773,  16729,  16681,  16630,  16575,  16517,
-  16456,  16392,  16325,  16256,  16184,  16109,  16032,  15952,
-  15870,  15786,  15700,  15612,  15521,  15429,  15334,  15238,
-  15140,  15040,  14938,  14834,  14729,  14622,  14514,  14404,
-  14292,  14179,  14064,  13947,  13830,  13710,  13590,  13468,
-  13344,  13220,  13094,  12966,  12837,  12707,  12576,  12444,
-  12310,  12175,  12039,  11902,  11763,  11624,  11483,  11341,
-  11198,  11054
-};
-
-// log2(table index) in Q12
-// Note that the first table value is invalid, since log2(0) = -infinity
-static const int16_t kLogIndex[129] = {
-  0,      0,   4096,   6492,   8192,   9511,  10588,  11499,
-  12288,  12984,  13607,  14170,  14684,  15157,  15595,  16003,
-  16384,  16742,  17080,  17400,  17703,  17991,  18266,  18529,
-  18780,  19021,  19253,  19476,  19691,  19898,  20099,  20292,
-  20480,  20662,  20838,  21010,  21176,  21338,  21496,  21649,
-  21799,  21945,  22087,  22226,  22362,  22495,  22625,  22752,
-  22876,  22998,  23117,  23234,  23349,  23462,  23572,  23680,
-  23787,  23892,  23994,  24095,  24195,  24292,  24388,  24483,
-  24576,  24668,  24758,  24847,  24934,  25021,  25106,  25189,
-  25272,  25354,  25434,  25513,  25592,  25669,  25745,  25820,
-  25895,  25968,  26041,  26112,  26183,  26253,  26322,  26390,
-  26458,  26525,  26591,  26656,  26721,  26784,  26848,  26910,
-  26972,  27033,  27094,  27154,  27213,  27272,  27330,  27388,
-  27445,  27502,  27558,  27613,  27668,  27722,  27776,  27830,
-  27883,  27935,  27988,  28039,  28090,  28141,  28191,  28241,
-  28291,  28340,  28388,  28437,  28484,  28532,  28579,  28626,
-  28672
-};
-
-// determinant of estimation matrix in Q0 corresponding to the log2 tables above
-// Note that the first table value is invalid, since log2(0) = -infinity
-static const int16_t kDeterminantEstMatrix[66] = {
-  0,  29814,  25574,  22640,  20351,  18469,  16873,  15491,
-  14277,  13199,  12233,  11362,  10571,   9851,   9192,   8587,
-  8030,   7515,   7038,   6596,   6186,   5804,   5448,   5115,
-  4805,   4514,   4242,   3988,   3749,   3524,   3314,   3116,
-  2930,   2755,   2590,   2435,   2289,   2152,   2022,   1900,
-  1785,   1677,   1575,   1478,   1388,   1302,   1221,   1145,
-  1073,   1005,    942,    881,    825,    771,    721,    674,
-  629,    587,    547,    510,    475,    442,    411,    382,
-  355,    330
-};
-
-// Update the noise estimation information.
-static void UpdateNoiseEstimate(NoiseSuppressionFixedC* inst, int offset) {
-  int32_t tmp32no1 = 0;
-  int32_t tmp32no2 = 0;
-  int16_t tmp16 = 0;
-  const int16_t kExp2Const = 11819; // Q13
-
-  size_t i = 0;
-
-  tmp16 = WebRtcSpl_MaxValueW16(inst->noiseEstLogQuantile + offset,
-                                   inst->magnLen);
-  // Guarantee a Q-domain as high as possible and still fit in int16
-  inst->qNoise = 14 - (int) WEBRTC_SPL_MUL_16_16_RSFT_WITH_ROUND(
-                   kExp2Const, tmp16, 21);
-  for (i = 0; i < inst->magnLen; i++) {
-    // inst->quantile[i]=exp(inst->lquantile[offset+i]);
-    // in Q21
-    tmp32no2 = kExp2Const * inst->noiseEstLogQuantile[offset + i];
-    tmp32no1 = (0x00200000 | (tmp32no2 & 0x001FFFFF)); // 2^21 + frac
-    tmp16 = (int16_t)(tmp32no2 >> 21);
-    tmp16 -= 21;// shift 21 to get result in Q0
-    tmp16 += (int16_t) inst->qNoise; //shift to get result in Q(qNoise)
-    if (tmp16 < 0) {
-      tmp32no1 >>= -tmp16;
-    } else {
-      tmp32no1 <<= tmp16;
-    }
-    inst->noiseEstQuantile[i] = WebRtcSpl_SatW32ToW16(tmp32no1);
-  }
-}
-
-// Noise Estimation
-static void NoiseEstimationC(NoiseSuppressionFixedC* inst,
-                             uint16_t* magn,
-                             uint32_t* noise,
-                             int16_t* q_noise) {
-  int16_t lmagn[HALF_ANAL_BLOCKL], counter, countDiv;
-  int16_t countProd, delta, zeros, frac;
-  int16_t log2, tabind, logval, tmp16, tmp16no1, tmp16no2;
-  const int16_t log2_const = 22713; // Q15
-  const int16_t width_factor = 21845;
-
-  size_t i, s, offset;
-
-  tabind = inst->stages - inst->normData;
-  RTC_DCHECK_LT(tabind, 9);
-  RTC_DCHECK_GT(tabind, -9);
-  if (tabind < 0) {
-    logval = -WebRtcNsx_kLogTable[-tabind];
-  } else {
-    logval = WebRtcNsx_kLogTable[tabind];
-  }
-
-  // lmagn(i)=log(magn(i))=log(2)*log2(magn(i))
-  // magn is in Q(-stages), and the real lmagn values are:
-  // real_lmagn(i)=log(magn(i)*2^stages)=log(magn(i))+log(2^stages)
-  // lmagn in Q8
-  for (i = 0; i < inst->magnLen; i++) {
-    if (magn[i]) {
-      zeros = WebRtcSpl_NormU32((uint32_t)magn[i]);
-      frac = (int16_t)((((uint32_t)magn[i] << zeros)
-                              & 0x7FFFFFFF) >> 23);
-      // log2(magn(i))
-      RTC_DCHECK_LT(frac, 256);
-      log2 = (int16_t)(((31 - zeros) << 8)
-                             + WebRtcNsx_kLogTableFrac[frac]);
-      // log2(magn(i))*log(2)
-      lmagn[i] = (int16_t)((log2 * log2_const) >> 15);
-      // + log(2^stages)
-      lmagn[i] += logval;
-    } else {
-      lmagn[i] = logval;//0;
-    }
-  }
-
-  // loop over simultaneous estimates
-  for (s = 0; s < SIMULT; s++) {
-    offset = s * inst->magnLen;
-
-    // Get counter values from state
-    counter = inst->noiseEstCounter[s];
-    RTC_DCHECK_LT(counter, 201);
-    countDiv = WebRtcNsx_kCounterDiv[counter];
-    countProd = (int16_t)(counter * countDiv);
-
-    // quant_est(...)
-    for (i = 0; i < inst->magnLen; i++) {
-      // compute delta
-      if (inst->noiseEstDensity[offset + i] > 512) {
-        // Get the value for delta by shifting intead of dividing.
-        int factor = WebRtcSpl_NormW16(inst->noiseEstDensity[offset + i]);
-        delta = (int16_t)(FACTOR_Q16 >> (14 - factor));
-      } else {
-        delta = FACTOR_Q7;
-        if (inst->blockIndex < END_STARTUP_LONG) {
-          // Smaller step size during startup. This prevents from using
-          // unrealistic values causing overflow.
-          delta = FACTOR_Q7_STARTUP;
-        }
-      }
-
-      // update log quantile estimate
-      tmp16 = (int16_t)((delta * countDiv) >> 14);
-      if (lmagn[i] > inst->noiseEstLogQuantile[offset + i]) {
-        // +=QUANTILE*delta/(inst->counter[s]+1) QUANTILE=0.25, =1 in Q2
-        // CounterDiv=1/(inst->counter[s]+1) in Q15
-        tmp16 += 2;
-        inst->noiseEstLogQuantile[offset + i] += tmp16 / 4;
-      } else {
-        tmp16 += 1;
-        // *(1-QUANTILE), in Q2 QUANTILE=0.25, 1-0.25=0.75=3 in Q2
-        // TODO(bjornv): investigate why we need to truncate twice.
-        tmp16no2 = (int16_t)((tmp16 / 2) * 3 / 2);
-        inst->noiseEstLogQuantile[offset + i] -= tmp16no2;
-        if (inst->noiseEstLogQuantile[offset + i] < logval) {
-          // This is the smallest fixed point representation we can
-          // have, hence we limit the output.
-          inst->noiseEstLogQuantile[offset + i] = logval;
-        }
-      }
-
-      // update density estimate
-      if (WEBRTC_SPL_ABS_W16(lmagn[i] - inst->noiseEstLogQuantile[offset + i])
-          < WIDTH_Q8) {
-        tmp16no1 = (int16_t)WEBRTC_SPL_MUL_16_16_RSFT_WITH_ROUND(
-                     inst->noiseEstDensity[offset + i], countProd, 15);
-        tmp16no2 = (int16_t)WEBRTC_SPL_MUL_16_16_RSFT_WITH_ROUND(
-                     width_factor, countDiv, 15);
-        inst->noiseEstDensity[offset + i] = tmp16no1 + tmp16no2;
-      }
-    }  // end loop over magnitude spectrum
-
-    if (counter >= END_STARTUP_LONG) {
-      inst->noiseEstCounter[s] = 0;
-      if (inst->blockIndex >= END_STARTUP_LONG) {
-        UpdateNoiseEstimate(inst, offset);
-      }
-    }
-    inst->noiseEstCounter[s]++;
-
-  }  // end loop over simultaneous estimates
-
-  // Sequentially update the noise during startup
-  if (inst->blockIndex < END_STARTUP_LONG) {
-    UpdateNoiseEstimate(inst, offset);
-  }
-
-  for (i = 0; i < inst->magnLen; i++) {
-    noise[i] = (uint32_t)(inst->noiseEstQuantile[i]); // Q(qNoise)
-  }
-  (*q_noise) = (int16_t)inst->qNoise;
-}
-
-// Filter the data in the frequency domain, and create spectrum.
-static void PrepareSpectrumC(NoiseSuppressionFixedC* inst, int16_t* freq_buf) {
-  size_t i = 0, j = 0;
-
-  for (i = 0; i < inst->magnLen; i++) {
-    inst->real[i] = (int16_t)((inst->real[i] *
-        (int16_t)(inst->noiseSupFilter[i])) >> 14);  // Q(normData-stages)
-    inst->imag[i] = (int16_t)((inst->imag[i] *
-        (int16_t)(inst->noiseSupFilter[i])) >> 14);  // Q(normData-stages)
-  }
-
-  freq_buf[0] = inst->real[0];
-  freq_buf[1] = -inst->imag[0];
-  for (i = 1, j = 2; i < inst->anaLen2; i += 1, j += 2) {
-    freq_buf[j] = inst->real[i];
-    freq_buf[j + 1] = -inst->imag[i];
-  }
-  freq_buf[inst->anaLen] = inst->real[inst->anaLen2];
-  freq_buf[inst->anaLen + 1] = -inst->imag[inst->anaLen2];
-}
-
-// Denormalize the real-valued signal |in|, the output from inverse FFT.
-static void DenormalizeC(NoiseSuppressionFixedC* inst,
-                         int16_t* in,
-                         int factor) {
-  size_t i = 0;
-  int32_t tmp32 = 0;
-  for (i = 0; i < inst->anaLen; i += 1) {
-    tmp32 = WEBRTC_SPL_SHIFT_W32((int32_t)in[i],
-                                 factor - inst->normData);
-    inst->real[i] = WebRtcSpl_SatW32ToW16(tmp32); // Q0
-  }
-}
-
-// For the noise supression process, synthesis, read out fully processed
-// segment, and update synthesis buffer.
-static void SynthesisUpdateC(NoiseSuppressionFixedC* inst,
-                             int16_t* out_frame,
-                             int16_t gain_factor) {
-  size_t i = 0;
-  int16_t tmp16a = 0;
-  int16_t tmp16b = 0;
-  int32_t tmp32 = 0;
-
-  // synthesis
-  for (i = 0; i < inst->anaLen; i++) {
-    tmp16a = (int16_t)WEBRTC_SPL_MUL_16_16_RSFT_WITH_ROUND(
-                 inst->window[i], inst->real[i], 14); // Q0, window in Q14
-    tmp32 = WEBRTC_SPL_MUL_16_16_RSFT_WITH_ROUND(tmp16a, gain_factor, 13); // Q0
-    // Down shift with rounding
-    tmp16b = WebRtcSpl_SatW32ToW16(tmp32); // Q0
-    inst->synthesisBuffer[i] = WebRtcSpl_AddSatW16(inst->synthesisBuffer[i],
-                                                   tmp16b); // Q0
-  }
-
-  // read out fully processed segment
-  for (i = 0; i < inst->blockLen10ms; i++) {
-    out_frame[i] = inst->synthesisBuffer[i]; // Q0
-  }
-
-  // update synthesis buffer
-  memcpy(inst->synthesisBuffer, inst->synthesisBuffer + inst->blockLen10ms,
-      (inst->anaLen - inst->blockLen10ms) * sizeof(*inst->synthesisBuffer));
-  WebRtcSpl_ZerosArrayW16(inst->synthesisBuffer
-      + inst->anaLen - inst->blockLen10ms, inst->blockLen10ms);
-}
-
-// Update analysis buffer for lower band, and window data before FFT.
-static void AnalysisUpdateC(NoiseSuppressionFixedC* inst,
-                            int16_t* out,
-                            int16_t* new_speech) {
-  size_t i = 0;
-
-  // For lower band update analysis buffer.
-  memcpy(inst->analysisBuffer, inst->analysisBuffer + inst->blockLen10ms,
-      (inst->anaLen - inst->blockLen10ms) * sizeof(*inst->analysisBuffer));
-  memcpy(inst->analysisBuffer + inst->anaLen - inst->blockLen10ms, new_speech,
-      inst->blockLen10ms * sizeof(*inst->analysisBuffer));
-
-  // Window data before FFT.
-  for (i = 0; i < inst->anaLen; i++) {
-    out[i] = (int16_t)WEBRTC_SPL_MUL_16_16_RSFT_WITH_ROUND(
-               inst->window[i], inst->analysisBuffer[i], 14); // Q0
-  }
-}
-
-// Normalize the real-valued signal |in|, the input to forward FFT.
-static void NormalizeRealBufferC(NoiseSuppressionFixedC* inst,
-                                 const int16_t* in,
-                                 int16_t* out) {
-  size_t i = 0;
-  RTC_DCHECK_GE(inst->normData, 0);
-  for (i = 0; i < inst->anaLen; ++i) {
-    out[i] = in[i] << inst->normData;  // Q(normData)
-  }
-}
-
-// Declare function pointers.
-NoiseEstimation WebRtcNsx_NoiseEstimation;
-PrepareSpectrum WebRtcNsx_PrepareSpectrum;
-SynthesisUpdate WebRtcNsx_SynthesisUpdate;
-AnalysisUpdate WebRtcNsx_AnalysisUpdate;
-Denormalize WebRtcNsx_Denormalize;
-NormalizeRealBuffer WebRtcNsx_NormalizeRealBuffer;
-
-#if defined(WEBRTC_HAS_NEON)
-// Initialize function pointers for ARM Neon platform.
-static void WebRtcNsx_InitNeon(void) {
-  WebRtcNsx_NoiseEstimation = WebRtcNsx_NoiseEstimationNeon;
-  WebRtcNsx_PrepareSpectrum = WebRtcNsx_PrepareSpectrumNeon;
-  WebRtcNsx_SynthesisUpdate = WebRtcNsx_SynthesisUpdateNeon;
-  WebRtcNsx_AnalysisUpdate = WebRtcNsx_AnalysisUpdateNeon;
-}
-#endif
-
-#if defined(MIPS32_LE)
-// Initialize function pointers for MIPS platform.
-static void WebRtcNsx_InitMips(void) {
-  WebRtcNsx_PrepareSpectrum = WebRtcNsx_PrepareSpectrum_mips;
-  WebRtcNsx_SynthesisUpdate = WebRtcNsx_SynthesisUpdate_mips;
-  WebRtcNsx_AnalysisUpdate = WebRtcNsx_AnalysisUpdate_mips;
-  WebRtcNsx_NormalizeRealBuffer = WebRtcNsx_NormalizeRealBuffer_mips;
-#if defined(MIPS_DSP_R1_LE)
-  WebRtcNsx_Denormalize = WebRtcNsx_Denormalize_mips;
-#endif
-}
-#endif
-
-void WebRtcNsx_CalcParametricNoiseEstimate(NoiseSuppressionFixedC* inst,
-                                           int16_t pink_noise_exp_avg,
-                                           int32_t pink_noise_num_avg,
-                                           int freq_index,
-                                           uint32_t* noise_estimate,
-                                           uint32_t* noise_estimate_avg) {
-  int32_t tmp32no1 = 0;
-  int32_t tmp32no2 = 0;
-
-  int16_t int_part = 0;
-  int16_t frac_part = 0;
-
-  // Use pink noise estimate
-  // noise_estimate = 2^(pinkNoiseNumerator + pinkNoiseExp * log2(j))
-  RTC_DCHECK_GE(freq_index, 0);
-  RTC_DCHECK_LT(freq_index, 129);
-  tmp32no2 = (pink_noise_exp_avg * kLogIndex[freq_index]) >> 15;  // Q11
-  tmp32no1 = pink_noise_num_avg - tmp32no2; // Q11
-
-  // Calculate output: 2^tmp32no1
-  // Output in Q(minNorm-stages)
-  tmp32no1 += (inst->minNorm - inst->stages) << 11;
-  if (tmp32no1 > 0) {
-    int_part = (int16_t)(tmp32no1 >> 11);
-    frac_part = (int16_t)(tmp32no1 & 0x000007ff); // Q11
-    // Piecewise linear approximation of 'b' in
-    // 2^(int_part+frac_part) = 2^int_part * (1 + b)
-    // 'b' is given in Q11 and below stored in frac_part.
-    if (frac_part >> 10) {
-      // Upper fractional part
-      tmp32no2 = (2048 - frac_part) * 1244;  // Q21
-      tmp32no2 = 2048 - (tmp32no2 >> 10);
-    } else {
-      // Lower fractional part
-      tmp32no2 = (frac_part * 804) >> 10;
-    }
-    // Shift fractional part to Q(minNorm-stages)
-    tmp32no2 = WEBRTC_SPL_SHIFT_W32(tmp32no2, int_part - 11);
-    *noise_estimate_avg = (1 << int_part) + (uint32_t)tmp32no2;
-    // Scale up to initMagnEst, which is not block averaged
-    *noise_estimate = (*noise_estimate_avg) * (uint32_t)(inst->blockIndex + 1);
-  }
-}
-
-// Initialize state
-int32_t WebRtcNsx_InitCore(NoiseSuppressionFixedC* inst, uint32_t fs) {
-  int i;
-
-  //check for valid pointer
-  if (inst == NULL) {
-    return -1;
-  }
-  //
-
-  // Initialization of struct
-  if (fs == 8000 || fs == 16000 || fs == 32000 || fs == 48000) {
-    inst->fs = fs;
-  } else {
-    return -1;
-  }
-
-  if (fs == 8000) {
-    inst->blockLen10ms = 80;
-    inst->anaLen = 128;
-    inst->stages = 7;
-    inst->window = kBlocks80w128x;
-    inst->thresholdLogLrt = 131072; //default threshold for LRT feature
-    inst->maxLrt = 0x0040000;
-    inst->minLrt = 52429;
-  } else {
-    inst->blockLen10ms = 160;
-    inst->anaLen = 256;
-    inst->stages = 8;
-    inst->window = kBlocks160w256x;
-    inst->thresholdLogLrt = 212644; //default threshold for LRT feature
-    inst->maxLrt = 0x0080000;
-    inst->minLrt = 104858;
-  }
-  inst->anaLen2 = inst->anaLen / 2;
-  inst->magnLen = inst->anaLen2 + 1;
-
-  if (inst->real_fft != NULL) {
-    WebRtcSpl_FreeRealFFT(inst->real_fft);
-  }
-  inst->real_fft = WebRtcSpl_CreateRealFFT(inst->stages);
-  if (inst->real_fft == NULL) {
-    return -1;
-  }
-
-  WebRtcSpl_ZerosArrayW16(inst->analysisBuffer, ANAL_BLOCKL_MAX);
-  WebRtcSpl_ZerosArrayW16(inst->synthesisBuffer, ANAL_BLOCKL_MAX);
-
-  // for HB processing
-  WebRtcSpl_ZerosArrayW16(inst->dataBufHBFX[0],
-                          NUM_HIGH_BANDS_MAX * ANAL_BLOCKL_MAX);
-  // for quantile noise estimation
-  WebRtcSpl_ZerosArrayW16(inst->noiseEstQuantile, HALF_ANAL_BLOCKL);
-  for (i = 0; i < SIMULT * HALF_ANAL_BLOCKL; i++) {
-    inst->noiseEstLogQuantile[i] = 2048; // Q8
-    inst->noiseEstDensity[i] = 153; // Q9
-  }
-  for (i = 0; i < SIMULT; i++) {
-    inst->noiseEstCounter[i] = (int16_t)(END_STARTUP_LONG * (i + 1)) / SIMULT;
-  }
-
-  // Initialize suppression filter with ones
-  WebRtcSpl_MemSetW16((int16_t*)inst->noiseSupFilter, 16384, HALF_ANAL_BLOCKL);
-
-  // Set the aggressiveness: default
-  inst->aggrMode = 0;
-
-  //initialize variables for new method
-  inst->priorNonSpeechProb = 8192; // Q14(0.5) prior probability for speech/noise
-  for (i = 0; i < HALF_ANAL_BLOCKL; i++) {
-    inst->prevMagnU16[i] = 0;
-    inst->prevNoiseU32[i] = 0; //previous noise-spectrum
-    inst->logLrtTimeAvgW32[i] = 0; //smooth LR ratio
-    inst->avgMagnPause[i] = 0; //conservative noise spectrum estimate
-    inst->initMagnEst[i] = 0; //initial average magnitude spectrum
-  }
-
-  //feature quantities
-  inst->thresholdSpecDiff = 50; //threshold for difference feature: determined on-line
-  inst->thresholdSpecFlat = 20480; //threshold for flatness: determined on-line
-  inst->featureLogLrt = inst->thresholdLogLrt; //average LRT factor (= threshold)
-  inst->featureSpecFlat = inst->thresholdSpecFlat; //spectral flatness (= threshold)
-  inst->featureSpecDiff = inst->thresholdSpecDiff; //spectral difference (= threshold)
-  inst->weightLogLrt = 6; //default weighting par for LRT feature
-  inst->weightSpecFlat = 0; //default weighting par for spectral flatness feature
-  inst->weightSpecDiff = 0; //default weighting par for spectral difference feature
-
-  inst->curAvgMagnEnergy = 0; //window time-average of input magnitude spectrum
-  inst->timeAvgMagnEnergy = 0; //normalization for spectral difference
-  inst->timeAvgMagnEnergyTmp = 0; //normalization for spectral difference
-
-  //histogram quantities: used to estimate/update thresholds for features
-  WebRtcSpl_ZerosArrayW16(inst->histLrt, HIST_PAR_EST);
-  WebRtcSpl_ZerosArrayW16(inst->histSpecDiff, HIST_PAR_EST);
-  WebRtcSpl_ZerosArrayW16(inst->histSpecFlat, HIST_PAR_EST);
-
-  inst->blockIndex = -1; //frame counter
-
-  //inst->modelUpdate    = 500;   //window for update
-  inst->modelUpdate = (1 << STAT_UPDATES); //window for update
-  inst->cntThresUpdate = 0; //counter feature thresholds updates
-
-  inst->sumMagn = 0;
-  inst->magnEnergy = 0;
-  inst->prevQMagn = 0;
-  inst->qNoise = 0;
-  inst->prevQNoise = 0;
-
-  inst->energyIn = 0;
-  inst->scaleEnergyIn = 0;
-
-  inst->whiteNoiseLevel = 0;
-  inst->pinkNoiseNumerator = 0;
-  inst->pinkNoiseExp = 0;
-  inst->minNorm = 15; // Start with full scale
-  inst->zeroInputSignal = 0;
-
-  //default mode
-  WebRtcNsx_set_policy_core(inst, 0);
-
-#ifdef NS_FILEDEBUG
-  inst->infile = fopen("indebug.pcm", "wb");
-  inst->outfile = fopen("outdebug.pcm", "wb");
-  inst->file1 = fopen("file1.pcm", "wb");
-  inst->file2 = fopen("file2.pcm", "wb");
-  inst->file3 = fopen("file3.pcm", "wb");
-  inst->file4 = fopen("file4.pcm", "wb");
-  inst->file5 = fopen("file5.pcm", "wb");
-#endif
-
-  // Initialize function pointers.
-  WebRtcNsx_NoiseEstimation = NoiseEstimationC;
-  WebRtcNsx_PrepareSpectrum = PrepareSpectrumC;
-  WebRtcNsx_SynthesisUpdate = SynthesisUpdateC;
-  WebRtcNsx_AnalysisUpdate = AnalysisUpdateC;
-  WebRtcNsx_Denormalize = DenormalizeC;
-  WebRtcNsx_NormalizeRealBuffer = NormalizeRealBufferC;
-
-#if defined(WEBRTC_HAS_NEON)
-  WebRtcNsx_InitNeon();
-#endif
-
-#if defined(MIPS32_LE)
-  WebRtcNsx_InitMips();
-#endif
-
-  inst->initFlag = 1;
-
-  return 0;
-}
-
-int WebRtcNsx_set_policy_core(NoiseSuppressionFixedC* inst, int mode) {
-  // allow for modes:0,1,2,3
-  if (mode < 0 || mode > 3) {
-    return -1;
-  }
-
-  inst->aggrMode = mode;
-  if (mode == 0) {
-    inst->overdrive = 256; // Q8(1.0)
-    inst->denoiseBound = 8192; // Q14(0.5)
-    inst->gainMap = 0; // No gain compensation
-  } else if (mode == 1) {
-    inst->overdrive = 256; // Q8(1.0)
-    inst->denoiseBound = 4096; // Q14(0.25)
-    inst->factor2Table = kFactor2Aggressiveness1;
-    inst->gainMap = 1;
-  } else if (mode == 2) {
-    inst->overdrive = 282; // ~= Q8(1.1)
-    inst->denoiseBound = 2048; // Q14(0.125)
-    inst->factor2Table = kFactor2Aggressiveness2;
-    inst->gainMap = 1;
-  } else if (mode == 3) {
-    inst->overdrive = 320; // Q8(1.25)
-    inst->denoiseBound = 1475; // ~= Q14(0.09)
-    inst->factor2Table = kFactor2Aggressiveness3;
-    inst->gainMap = 1;
-  }
-  return 0;
-}
-
-// Extract thresholds for feature parameters
-// histograms are computed over some window_size (given by window_pars)
-// thresholds and weights are extracted every window
-// flag 0 means update histogram only, flag 1 means compute the thresholds/weights
-// threshold and weights are returned in: inst->priorModelPars
-void WebRtcNsx_FeatureParameterExtraction(NoiseSuppressionFixedC* inst,
-                                          int flag) {
-  uint32_t tmpU32;
-  uint32_t histIndex;
-  uint32_t posPeak1SpecFlatFX, posPeak2SpecFlatFX;
-  uint32_t posPeak1SpecDiffFX, posPeak2SpecDiffFX;
-
-  int32_t tmp32;
-  int32_t fluctLrtFX, thresFluctLrtFX;
-  int32_t avgHistLrtFX, avgSquareHistLrtFX, avgHistLrtComplFX;
-
-  int16_t j;
-  int16_t numHistLrt;
-
-  int i;
-  int useFeatureSpecFlat, useFeatureSpecDiff, featureSum;
-  int maxPeak1, maxPeak2;
-  int weightPeak1SpecFlat, weightPeak2SpecFlat;
-  int weightPeak1SpecDiff, weightPeak2SpecDiff;
-
-  //update histograms
-  if (!flag) {
-    // LRT
-    // Type casting to UWord32 is safe since negative values will not be wrapped to larger
-    // values than HIST_PAR_EST
-    histIndex = (uint32_t)(inst->featureLogLrt);
-    if (histIndex < HIST_PAR_EST) {
-      inst->histLrt[histIndex]++;
-    }
-    // Spectral flatness
-    // (inst->featureSpecFlat*20)>>10 = (inst->featureSpecFlat*5)>>8
-    histIndex = (inst->featureSpecFlat * 5) >> 8;
-    if (histIndex < HIST_PAR_EST) {
-      inst->histSpecFlat[histIndex]++;
-    }
-    // Spectral difference
-    histIndex = HIST_PAR_EST;
-    if (inst->timeAvgMagnEnergy > 0) {
-      // Guard against division by zero
-      // If timeAvgMagnEnergy == 0 we have no normalizing statistics and
-      // therefore can't update the histogram
-      histIndex = ((inst->featureSpecDiff * 5) >> inst->stages) /
-          inst->timeAvgMagnEnergy;
-    }
-    if (histIndex < HIST_PAR_EST) {
-      inst->histSpecDiff[histIndex]++;
-    }
-  }
-
-  // extract parameters for speech/noise probability
-  if (flag) {
-    useFeatureSpecDiff = 1;
-    //for LRT feature:
-    // compute the average over inst->featureExtractionParams.rangeAvgHistLrt
-    avgHistLrtFX = 0;
-    avgSquareHistLrtFX = 0;
-    numHistLrt = 0;
-    for (i = 0; i < BIN_SIZE_LRT; i++) {
-      j = (2 * i + 1);
-      tmp32 = inst->histLrt[i] * j;
-      avgHistLrtFX += tmp32;
-      numHistLrt += inst->histLrt[i];
-      avgSquareHistLrtFX += tmp32 * j;
-    }
-    avgHistLrtComplFX = avgHistLrtFX;
-    for (; i < HIST_PAR_EST; i++) {
-      j = (2 * i + 1);
-      tmp32 = inst->histLrt[i] * j;
-      avgHistLrtComplFX += tmp32;
-      avgSquareHistLrtFX += tmp32 * j;
-    }
-    fluctLrtFX = avgSquareHistLrtFX * numHistLrt -
-        avgHistLrtFX * avgHistLrtComplFX;
-    thresFluctLrtFX = THRES_FLUCT_LRT * numHistLrt;
-    // get threshold for LRT feature:
-    tmpU32 = (FACTOR_1_LRT_DIFF * (uint32_t)avgHistLrtFX);
-    if ((fluctLrtFX < thresFluctLrtFX) || (numHistLrt == 0) ||
-        (tmpU32 > (uint32_t)(100 * numHistLrt))) {
-      //very low fluctuation, so likely noise
-      inst->thresholdLogLrt = inst->maxLrt;
-    } else {
-      tmp32 = (int32_t)((tmpU32 << (9 + inst->stages)) / numHistLrt /
-                              25);
-      // check if value is within min/max range
-      inst->thresholdLogLrt = WEBRTC_SPL_SAT(inst->maxLrt,
-                                             tmp32,
-                                             inst->minLrt);
-    }
-    if (fluctLrtFX < thresFluctLrtFX) {
-      // Do not use difference feature if fluctuation of LRT feature is very low:
-      // most likely just noise state
-      useFeatureSpecDiff = 0;
-    }
-
-    // for spectral flatness and spectral difference: compute the main peaks of histogram
-    maxPeak1 = 0;
-    maxPeak2 = 0;
-    posPeak1SpecFlatFX = 0;
-    posPeak2SpecFlatFX = 0;
-    weightPeak1SpecFlat = 0;
-    weightPeak2SpecFlat = 0;
-
-    // peaks for flatness
-    for (i = 0; i < HIST_PAR_EST; i++) {
-      if (inst->histSpecFlat[i] > maxPeak1) {
-        // Found new "first" peak
-        maxPeak2 = maxPeak1;
-        weightPeak2SpecFlat = weightPeak1SpecFlat;
-        posPeak2SpecFlatFX = posPeak1SpecFlatFX;
-
-        maxPeak1 = inst->histSpecFlat[i];
-        weightPeak1SpecFlat = inst->histSpecFlat[i];
-        posPeak1SpecFlatFX = (uint32_t)(2 * i + 1);
-      } else if (inst->histSpecFlat[i] > maxPeak2) {
-        // Found new "second" peak
-        maxPeak2 = inst->histSpecFlat[i];
-        weightPeak2SpecFlat = inst->histSpecFlat[i];
-        posPeak2SpecFlatFX = (uint32_t)(2 * i + 1);
-      }
-    }
-
-    // for spectral flatness feature
-    useFeatureSpecFlat = 1;
-    // merge the two peaks if they are close
-    if ((posPeak1SpecFlatFX - posPeak2SpecFlatFX < LIM_PEAK_SPACE_FLAT_DIFF)
-        && (weightPeak2SpecFlat * LIM_PEAK_WEIGHT_FLAT_DIFF > weightPeak1SpecFlat)) {
-      weightPeak1SpecFlat += weightPeak2SpecFlat;
-      posPeak1SpecFlatFX = (posPeak1SpecFlatFX + posPeak2SpecFlatFX) >> 1;
-    }
-    //reject if weight of peaks is not large enough, or peak value too small
-    if (weightPeak1SpecFlat < THRES_WEIGHT_FLAT_DIFF || posPeak1SpecFlatFX
-        < THRES_PEAK_FLAT) {
-      useFeatureSpecFlat = 0;
-    } else { // if selected, get the threshold
-      // compute the threshold and check if value is within min/max range
-      inst->thresholdSpecFlat = WEBRTC_SPL_SAT(MAX_FLAT_Q10, FACTOR_2_FLAT_Q10
-                                               * posPeak1SpecFlatFX, MIN_FLAT_Q10); //Q10
-    }
-    // done with flatness feature
-
-    if (useFeatureSpecDiff) {
-      //compute two peaks for spectral difference
-      maxPeak1 = 0;
-      maxPeak2 = 0;
-      posPeak1SpecDiffFX = 0;
-      posPeak2SpecDiffFX = 0;
-      weightPeak1SpecDiff = 0;
-      weightPeak2SpecDiff = 0;
-      // peaks for spectral difference
-      for (i = 0; i < HIST_PAR_EST; i++) {
-        if (inst->histSpecDiff[i] > maxPeak1) {
-          // Found new "first" peak
-          maxPeak2 = maxPeak1;
-          weightPeak2SpecDiff = weightPeak1SpecDiff;
-          posPeak2SpecDiffFX = posPeak1SpecDiffFX;
-
-          maxPeak1 = inst->histSpecDiff[i];
-          weightPeak1SpecDiff = inst->histSpecDiff[i];
-          posPeak1SpecDiffFX = (uint32_t)(2 * i + 1);
-        } else if (inst->histSpecDiff[i] > maxPeak2) {
-          // Found new "second" peak
-          maxPeak2 = inst->histSpecDiff[i];
-          weightPeak2SpecDiff = inst->histSpecDiff[i];
-          posPeak2SpecDiffFX = (uint32_t)(2 * i + 1);
-        }
-      }
-
-      // merge the two peaks if they are close
-      if ((posPeak1SpecDiffFX - posPeak2SpecDiffFX < LIM_PEAK_SPACE_FLAT_DIFF)
-          && (weightPeak2SpecDiff * LIM_PEAK_WEIGHT_FLAT_DIFF > weightPeak1SpecDiff)) {
-        weightPeak1SpecDiff += weightPeak2SpecDiff;
-        posPeak1SpecDiffFX = (posPeak1SpecDiffFX + posPeak2SpecDiffFX) >> 1;
-      }
-      // get the threshold value and check if value is within min/max range
-      inst->thresholdSpecDiff = WEBRTC_SPL_SAT(MAX_DIFF, FACTOR_1_LRT_DIFF
-                                               * posPeak1SpecDiffFX, MIN_DIFF); //5x bigger
-      //reject if weight of peaks is not large enough
-      if (weightPeak1SpecDiff < THRES_WEIGHT_FLAT_DIFF) {
-        useFeatureSpecDiff = 0;
-      }
-      // done with spectral difference feature
-    }
-
-    // select the weights between the features
-    // inst->priorModelPars[4] is weight for LRT: always selected
-    featureSum = 6 / (1 + useFeatureSpecFlat + useFeatureSpecDiff);
-    inst->weightLogLrt = featureSum;
-    inst->weightSpecFlat = useFeatureSpecFlat * featureSum;
-    inst->weightSpecDiff = useFeatureSpecDiff * featureSum;
-
-    // set histograms to zero for next update
-    WebRtcSpl_ZerosArrayW16(inst->histLrt, HIST_PAR_EST);
-    WebRtcSpl_ZerosArrayW16(inst->histSpecDiff, HIST_PAR_EST);
-    WebRtcSpl_ZerosArrayW16(inst->histSpecFlat, HIST_PAR_EST);
-  }  // end of flag == 1
-}
-
-
-// Compute spectral flatness on input spectrum
-// magn is the magnitude spectrum
-// spectral flatness is returned in inst->featureSpecFlat
-void WebRtcNsx_ComputeSpectralFlatness(NoiseSuppressionFixedC* inst,
-                                       uint16_t* magn) {
-  uint32_t tmpU32;
-  uint32_t avgSpectralFlatnessNum, avgSpectralFlatnessDen;
-
-  int32_t tmp32;
-  int32_t currentSpectralFlatness, logCurSpectralFlatness;
-
-  int16_t zeros, frac, intPart;
-
-  size_t i;
-
-  // for flatness
-  avgSpectralFlatnessNum = 0;
-  avgSpectralFlatnessDen = inst->sumMagn - (uint32_t)magn[0]; // Q(normData-stages)
-
-  // compute log of ratio of the geometric to arithmetic mean: check for log(0) case
-  // flatness = exp( sum(log(magn[i]))/N - log(sum(magn[i])/N) )
-  //          = exp( sum(log(magn[i]))/N ) * N / sum(magn[i])
-  //          = 2^( sum(log2(magn[i]))/N - (log2(sum(magn[i])) - log2(N)) ) [This is used]
-  for (i = 1; i < inst->magnLen; i++) {
-    // First bin is excluded from spectrum measures. Number of bins is now a power of 2
-    if (magn[i]) {
-      zeros = WebRtcSpl_NormU32((uint32_t)magn[i]);
-      frac = (int16_t)(((uint32_t)((uint32_t)(magn[i]) << zeros)
-                              & 0x7FFFFFFF) >> 23);
-      // log2(magn(i))
-      RTC_DCHECK_LT(frac, 256);
-      tmpU32 = (uint32_t)(((31 - zeros) << 8)
-                                + WebRtcNsx_kLogTableFrac[frac]); // Q8
-      avgSpectralFlatnessNum += tmpU32; // Q8
-    } else {
-      //if at least one frequency component is zero, treat separately
-      tmpU32 = WEBRTC_SPL_UMUL_32_16(inst->featureSpecFlat, SPECT_FLAT_TAVG_Q14); // Q24
-      inst->featureSpecFlat -= tmpU32 >> 14;  // Q10
-      return;
-    }
-  }
-  //ratio and inverse log: check for case of log(0)
-  zeros = WebRtcSpl_NormU32(avgSpectralFlatnessDen);
-  frac = (int16_t)(((avgSpectralFlatnessDen << zeros) & 0x7FFFFFFF) >> 23);
-  // log2(avgSpectralFlatnessDen)
-  RTC_DCHECK_LT(frac, 256);
-  tmp32 = (int32_t)(((31 - zeros) << 8) + WebRtcNsx_kLogTableFrac[frac]); // Q8
-  logCurSpectralFlatness = (int32_t)avgSpectralFlatnessNum;
-  logCurSpectralFlatness += ((int32_t)(inst->stages - 1) << (inst->stages + 7)); // Q(8+stages-1)
-  logCurSpectralFlatness -= (tmp32 << (inst->stages - 1));
-  logCurSpectralFlatness <<= (10 - inst->stages);  // Q17
-  tmp32 = (int32_t)(0x00020000 | (WEBRTC_SPL_ABS_W32(logCurSpectralFlatness)
-                                        & 0x0001FFFF)); //Q17
-  intPart = 7 - (logCurSpectralFlatness >> 17);  // Add 7 for output in Q10.
-  if (intPart > 0) {
-    currentSpectralFlatness = tmp32 >> intPart;
-  } else {
-    currentSpectralFlatness = tmp32 << -intPart;
-  }
-
-  //time average update of spectral flatness feature
-  tmp32 = currentSpectralFlatness - (int32_t)inst->featureSpecFlat; // Q10
-  tmp32 *= SPECT_FLAT_TAVG_Q14;  // Q24
-  inst->featureSpecFlat += tmp32 >> 14;  // Q10
-  // done with flatness feature
-}
-
-
-// Compute the difference measure between input spectrum and a template/learned noise spectrum
-// magn_tmp is the input spectrum
-// the reference/template spectrum is  inst->magn_avg_pause[i]
-// returns (normalized) spectral difference in inst->featureSpecDiff
-void WebRtcNsx_ComputeSpectralDifference(NoiseSuppressionFixedC* inst,
-                                         uint16_t* magnIn) {
-  // This is to be calculated:
-  // avgDiffNormMagn = var(magnIn) - cov(magnIn, magnAvgPause)^2 / var(magnAvgPause)
-
-  uint32_t tmpU32no1, tmpU32no2;
-  uint32_t varMagnUFX, varPauseUFX, avgDiffNormMagnUFX;
-
-  int32_t tmp32no1, tmp32no2;
-  int32_t avgPauseFX, avgMagnFX, covMagnPauseFX;
-  int32_t maxPause, minPause;
-
-  int16_t tmp16no1;
-
-  size_t i;
-  int norm32, nShifts;
-
-  avgPauseFX = 0;
-  maxPause = 0;
-  minPause = inst->avgMagnPause[0]; // Q(prevQMagn)
-  // compute average quantities
-  for (i = 0; i < inst->magnLen; i++) {
-    // Compute mean of magn_pause
-    avgPauseFX += inst->avgMagnPause[i]; // in Q(prevQMagn)
-    maxPause = WEBRTC_SPL_MAX(maxPause, inst->avgMagnPause[i]);
-    minPause = WEBRTC_SPL_MIN(minPause, inst->avgMagnPause[i]);
-  }
-  // normalize by replacing div of "inst->magnLen" with "inst->stages-1" shifts
-  avgPauseFX >>= inst->stages - 1;
-  avgMagnFX = inst->sumMagn >> (inst->stages - 1);
-  // Largest possible deviation in magnPause for (co)var calculations
-  tmp32no1 = WEBRTC_SPL_MAX(maxPause - avgPauseFX, avgPauseFX - minPause);
-  // Get number of shifts to make sure we don't get wrap around in varPause
-  nShifts = WEBRTC_SPL_MAX(0, 10 + inst->stages - WebRtcSpl_NormW32(tmp32no1));
-
-  varMagnUFX = 0;
-  varPauseUFX = 0;
-  covMagnPauseFX = 0;
-  for (i = 0; i < inst->magnLen; i++) {
-    // Compute var and cov of magn and magn_pause
-    tmp16no1 = (int16_t)((int32_t)magnIn[i] - avgMagnFX);
-    tmp32no2 = inst->avgMagnPause[i] - avgPauseFX;
-    varMagnUFX += (uint32_t)(tmp16no1 * tmp16no1);  // Q(2*qMagn)
-    tmp32no1 = tmp32no2 * tmp16no1;  // Q(prevQMagn+qMagn)
-    covMagnPauseFX += tmp32no1; // Q(prevQMagn+qMagn)
-    tmp32no1 = tmp32no2 >> nShifts;  // Q(prevQMagn-minPause).
-    varPauseUFX += tmp32no1 * tmp32no1;  // Q(2*(prevQMagn-minPause))
-  }
-  //update of average magnitude spectrum: Q(-2*stages) and averaging replaced by shifts
-  inst->curAvgMagnEnergy +=
-      inst->magnEnergy >> (2 * inst->normData + inst->stages - 1);
-
-  avgDiffNormMagnUFX = varMagnUFX; // Q(2*qMagn)
-  if ((varPauseUFX) && (covMagnPauseFX)) {
-    tmpU32no1 = (uint32_t)WEBRTC_SPL_ABS_W32(covMagnPauseFX); // Q(prevQMagn+qMagn)
-    norm32 = WebRtcSpl_NormU32(tmpU32no1) - 16;
-    if (norm32 > 0) {
-      tmpU32no1 <<= norm32;  // Q(prevQMagn+qMagn+norm32)
-    } else {
-      tmpU32no1 >>= -norm32;  // Q(prevQMagn+qMagn+norm32)
-    }
-    tmpU32no2 = WEBRTC_SPL_UMUL(tmpU32no1, tmpU32no1); // Q(2*(prevQMagn+qMagn-norm32))
-
-    nShifts += norm32;
-    nShifts <<= 1;
-    if (nShifts < 0) {
-      varPauseUFX >>= (-nShifts); // Q(2*(qMagn+norm32+minPause))
-      nShifts = 0;
-    }
-    if (varPauseUFX > 0) {
-      // Q(2*(qMagn+norm32-16+minPause))
-      tmpU32no1 = tmpU32no2 / varPauseUFX;
-      tmpU32no1 >>= nShifts;
-
-      // Q(2*qMagn)
-      avgDiffNormMagnUFX -= WEBRTC_SPL_MIN(avgDiffNormMagnUFX, tmpU32no1);
-    } else {
-      avgDiffNormMagnUFX = 0;
-    }
-  }
-  //normalize and compute time average update of difference feature
-  tmpU32no1 = avgDiffNormMagnUFX >> (2 * inst->normData);
-  if (inst->featureSpecDiff > tmpU32no1) {
-    tmpU32no2 = WEBRTC_SPL_UMUL_32_16(inst->featureSpecDiff - tmpU32no1,
-                                      SPECT_DIFF_TAVG_Q8); // Q(8-2*stages)
-    inst->featureSpecDiff -= tmpU32no2 >> 8;  // Q(-2*stages)
-  } else {
-    tmpU32no2 = WEBRTC_SPL_UMUL_32_16(tmpU32no1 - inst->featureSpecDiff,
-                                      SPECT_DIFF_TAVG_Q8); // Q(8-2*stages)
-    inst->featureSpecDiff += tmpU32no2 >> 8;  // Q(-2*stages)
-  }
-}
-
-// Transform input (speechFrame) to frequency domain magnitude (magnU16)
-void WebRtcNsx_DataAnalysis(NoiseSuppressionFixedC* inst,
-                            short* speechFrame,
-                            uint16_t* magnU16) {
-  uint32_t tmpU32no1;
-
-  int32_t   tmp_1_w32 = 0;
-  int32_t   tmp_2_w32 = 0;
-  int32_t   sum_log_magn = 0;
-  int32_t   sum_log_i_log_magn = 0;
-
-  uint16_t  sum_log_magn_u16 = 0;
-  uint16_t  tmp_u16 = 0;
-
-  int16_t   sum_log_i = 0;
-  int16_t   sum_log_i_square = 0;
-  int16_t   frac = 0;
-  int16_t   log2 = 0;
-  int16_t   matrix_determinant = 0;
-  int16_t   maxWinData;
-
-  size_t i, j;
-  int zeros;
-  int net_norm = 0;
-  int right_shifts_in_magnU16 = 0;
-  int right_shifts_in_initMagnEst = 0;
-
-  int16_t winData_buff[ANAL_BLOCKL_MAX * 2 + 16];
-  int16_t realImag_buff[ANAL_BLOCKL_MAX * 2 + 16];
-
-  // Align the structures to 32-byte boundary for the FFT function.
-  int16_t* winData = (int16_t*) (((uintptr_t)winData_buff + 31) & ~31);
-  int16_t* realImag = (int16_t*) (((uintptr_t) realImag_buff + 31) & ~31);
-
-  // Update analysis buffer for lower band, and window data before FFT.
-  WebRtcNsx_AnalysisUpdate(inst, winData, speechFrame);
-
-  // Get input energy
-  inst->energyIn =
-      WebRtcSpl_Energy(winData, inst->anaLen, &inst->scaleEnergyIn);
-
-  // Reset zero input flag
-  inst->zeroInputSignal = 0;
-  // Acquire norm for winData
-  maxWinData = WebRtcSpl_MaxAbsValueW16(winData, inst->anaLen);
-  inst->normData = WebRtcSpl_NormW16(maxWinData);
-  if (maxWinData == 0) {
-    // Treat zero input separately.
-    inst->zeroInputSignal = 1;
-    return;
-  }
-
-  // Determine the net normalization in the frequency domain
-  net_norm = inst->stages - inst->normData;
-  // Track lowest normalization factor and use it to prevent wrap around in shifting
-  right_shifts_in_magnU16 = inst->normData - inst->minNorm;
-  right_shifts_in_initMagnEst = WEBRTC_SPL_MAX(-right_shifts_in_magnU16, 0);
-  inst->minNorm -= right_shifts_in_initMagnEst;
-  right_shifts_in_magnU16 = WEBRTC_SPL_MAX(right_shifts_in_magnU16, 0);
-
-  // create realImag as winData interleaved with zeros (= imag. part), normalize it
-  WebRtcNsx_NormalizeRealBuffer(inst, winData, realImag);
-
-  // FFT output will be in winData[].
-  WebRtcSpl_RealForwardFFT(inst->real_fft, realImag, winData);
-
-  inst->imag[0] = 0; // Q(normData-stages)
-  inst->imag[inst->anaLen2] = 0;
-  inst->real[0] = winData[0]; // Q(normData-stages)
-  inst->real[inst->anaLen2] = winData[inst->anaLen];
-  // Q(2*(normData-stages))
-  inst->magnEnergy = (uint32_t)(inst->real[0] * inst->real[0]);
-  inst->magnEnergy += (uint32_t)(inst->real[inst->anaLen2] *
-                                 inst->real[inst->anaLen2]);
-  magnU16[0] = (uint16_t)WEBRTC_SPL_ABS_W16(inst->real[0]); // Q(normData-stages)
-  magnU16[inst->anaLen2] = (uint16_t)WEBRTC_SPL_ABS_W16(inst->real[inst->anaLen2]);
-  inst->sumMagn = (uint32_t)magnU16[0]; // Q(normData-stages)
-  inst->sumMagn += (uint32_t)magnU16[inst->anaLen2];
-
-  if (inst->blockIndex >= END_STARTUP_SHORT) {
-    for (i = 1, j = 2; i < inst->anaLen2; i += 1, j += 2) {
-      inst->real[i] = winData[j];
-      inst->imag[i] = -winData[j + 1];
-      // magnitude spectrum
-      // energy in Q(2*(normData-stages))
-      tmpU32no1 = (uint32_t)(winData[j] * winData[j]);
-      tmpU32no1 += (uint32_t)(winData[j + 1] * winData[j + 1]);
-      inst->magnEnergy += tmpU32no1; // Q(2*(normData-stages))
-
-      magnU16[i] = (uint16_t)WebRtcSpl_SqrtFloor(tmpU32no1); // Q(normData-stages)
-      inst->sumMagn += (uint32_t)magnU16[i]; // Q(normData-stages)
-    }
-  } else {
-    //
-    // Gather information during startup for noise parameter estimation
-    //
-
-    // Switch initMagnEst to Q(minNorm-stages)
-    inst->initMagnEst[0] >>= right_shifts_in_initMagnEst;
-    inst->initMagnEst[inst->anaLen2] >>= right_shifts_in_initMagnEst;
-
-    // Update initMagnEst with magnU16 in Q(minNorm-stages).
-    inst->initMagnEst[0] += magnU16[0] >> right_shifts_in_magnU16;
-    inst->initMagnEst[inst->anaLen2] +=
-        magnU16[inst->anaLen2] >> right_shifts_in_magnU16;
-
-    log2 = 0;
-    if (magnU16[inst->anaLen2]) {
-      // Calculate log2(magnU16[inst->anaLen2])
-      zeros = WebRtcSpl_NormU32((uint32_t)magnU16[inst->anaLen2]);
-      frac = (int16_t)((((uint32_t)magnU16[inst->anaLen2] << zeros) &
-                              0x7FFFFFFF) >> 23); // Q8
-      // log2(magnU16(i)) in Q8
-      RTC_DCHECK_LT(frac, 256);
-      log2 = (int16_t)(((31 - zeros) << 8) + WebRtcNsx_kLogTableFrac[frac]);
-    }
-
-    sum_log_magn = (int32_t)log2; // Q8
-    // sum_log_i_log_magn in Q17
-    sum_log_i_log_magn = (kLogIndex[inst->anaLen2] * log2) >> 3;
-
-    for (i = 1, j = 2; i < inst->anaLen2; i += 1, j += 2) {
-      inst->real[i] = winData[j];
-      inst->imag[i] = -winData[j + 1];
-      // magnitude spectrum
-      // energy in Q(2*(normData-stages))
-      tmpU32no1 = (uint32_t)(winData[j] * winData[j]);
-      tmpU32no1 += (uint32_t)(winData[j + 1] * winData[j + 1]);
-      inst->magnEnergy += tmpU32no1; // Q(2*(normData-stages))
-
-      magnU16[i] = (uint16_t)WebRtcSpl_SqrtFloor(tmpU32no1); // Q(normData-stages)
-      inst->sumMagn += (uint32_t)magnU16[i]; // Q(normData-stages)
-
-      // Switch initMagnEst to Q(minNorm-stages)
-      inst->initMagnEst[i] >>= right_shifts_in_initMagnEst;
-
-      // Update initMagnEst with magnU16 in Q(minNorm-stages).
-      inst->initMagnEst[i] += magnU16[i] >> right_shifts_in_magnU16;
-
-      if (i >= kStartBand) {
-        // For pink noise estimation. Collect data neglecting lower frequency band
-        log2 = 0;
-        if (magnU16[i]) {
-          zeros = WebRtcSpl_NormU32((uint32_t)magnU16[i]);
-          frac = (int16_t)((((uint32_t)magnU16[i] << zeros) &
-                                  0x7FFFFFFF) >> 23);
-          // log2(magnU16(i)) in Q8
-          RTC_DCHECK_LT(frac, 256);
-          log2 = (int16_t)(((31 - zeros) << 8)
-                                 + WebRtcNsx_kLogTableFrac[frac]);
-        }
-        sum_log_magn += (int32_t)log2; // Q8
-        // sum_log_i_log_magn in Q17
-        sum_log_i_log_magn += (kLogIndex[i] * log2) >> 3;
-      }
-    }
-
-    //
-    //compute simplified noise model during startup
-    //
-
-    // Estimate White noise
-
-    // Switch whiteNoiseLevel to Q(minNorm-stages)
-    inst->whiteNoiseLevel >>= right_shifts_in_initMagnEst;
-
-    // Update the average magnitude spectrum, used as noise estimate.
-    tmpU32no1 = WEBRTC_SPL_UMUL_32_16(inst->sumMagn, inst->overdrive);
-    tmpU32no1 >>= inst->stages + 8;
-
-    // Replacing division above with 'stages' shifts
-    // Shift to same Q-domain as whiteNoiseLevel
-    tmpU32no1 >>= right_shifts_in_magnU16;
-    // This operation is safe from wrap around as long as END_STARTUP_SHORT < 128
-    RTC_DCHECK_LT(END_STARTUP_SHORT, 128);
-    inst->whiteNoiseLevel += tmpU32no1; // Q(minNorm-stages)
-
-    // Estimate Pink noise parameters
-    // Denominator used in both parameter estimates.
-    // The value is only dependent on the size of the frequency band (kStartBand)
-    // and to reduce computational complexity stored in a table (kDeterminantEstMatrix[])
-    RTC_DCHECK_LT(kStartBand, 66);
-    matrix_determinant = kDeterminantEstMatrix[kStartBand]; // Q0
-    sum_log_i = kSumLogIndex[kStartBand]; // Q5
-    sum_log_i_square = kSumSquareLogIndex[kStartBand]; // Q2
-    if (inst->fs == 8000) {
-      // Adjust values to shorter blocks in narrow band.
-      tmp_1_w32 = (int32_t)matrix_determinant;
-      tmp_1_w32 += (kSumLogIndex[65] * sum_log_i) >> 9;
-      tmp_1_w32 -= (kSumLogIndex[65] * kSumLogIndex[65]) >> 10;
-      tmp_1_w32 -= (int32_t)sum_log_i_square << 4;
-      tmp_1_w32 -= ((inst->magnLen - kStartBand) * kSumSquareLogIndex[65]) >> 2;
-      matrix_determinant = (int16_t)tmp_1_w32;
-      sum_log_i -= kSumLogIndex[65]; // Q5
-      sum_log_i_square -= kSumSquareLogIndex[65]; // Q2
-    }
-
-    // Necessary number of shifts to fit sum_log_magn in a word16
-    zeros = 16 - WebRtcSpl_NormW32(sum_log_magn);
-    if (zeros < 0) {
-      zeros = 0;
-    }
-    tmp_1_w32 = sum_log_magn << 1;  // Q9
-    sum_log_magn_u16 = (uint16_t)(tmp_1_w32 >> zeros);  // Q(9-zeros).
-
-    // Calculate and update pinkNoiseNumerator. Result in Q11.
-    tmp_2_w32 = WEBRTC_SPL_MUL_16_U16(sum_log_i_square, sum_log_magn_u16); // Q(11-zeros)
-    tmpU32no1 = sum_log_i_log_magn >> 12;  // Q5
-
-    // Shift the largest value of sum_log_i and tmp32no3 before multiplication
-    tmp_u16 = ((uint16_t)sum_log_i << 1);  // Q6
-    if ((uint32_t)sum_log_i > tmpU32no1) {
-      tmp_u16 >>= zeros;
-    } else {
-      tmpU32no1 >>= zeros;
-    }
-    tmp_2_w32 -= (int32_t)WEBRTC_SPL_UMUL_32_16(tmpU32no1, tmp_u16); // Q(11-zeros)
-    matrix_determinant >>= zeros;  // Q(-zeros)
-    tmp_2_w32 = WebRtcSpl_DivW32W16(tmp_2_w32, matrix_determinant); // Q11
-    tmp_2_w32 += (int32_t)net_norm << 11;  // Q11
-    if (tmp_2_w32 < 0) {
-      tmp_2_w32 = 0;
-    }
-    inst->pinkNoiseNumerator += tmp_2_w32; // Q11
-
-    // Calculate and update pinkNoiseExp. Result in Q14.
-    tmp_2_w32 = WEBRTC_SPL_MUL_16_U16(sum_log_i, sum_log_magn_u16); // Q(14-zeros)
-    tmp_1_w32 = sum_log_i_log_magn >> (3 + zeros);
-    tmp_1_w32 *= inst->magnLen - kStartBand;
-    tmp_2_w32 -= tmp_1_w32; // Q(14-zeros)
-    if (tmp_2_w32 > 0) {
-      // If the exponential parameter is negative force it to zero, which means a
-      // flat spectrum.
-      tmp_1_w32 = WebRtcSpl_DivW32W16(tmp_2_w32, matrix_determinant); // Q14
-      inst->pinkNoiseExp += WEBRTC_SPL_SAT(16384, tmp_1_w32, 0); // Q14
-    }
-  }
-}
-
-void WebRtcNsx_DataSynthesis(NoiseSuppressionFixedC* inst, short* outFrame) {
-  int32_t energyOut;
-
-  int16_t realImag_buff[ANAL_BLOCKL_MAX * 2 + 16];
-  int16_t rfft_out_buff[ANAL_BLOCKL_MAX * 2 + 16];
-
-  // Align the structures to 32-byte boundary for the FFT function.
-  int16_t* realImag = (int16_t*) (((uintptr_t)realImag_buff + 31) & ~31);
-  int16_t* rfft_out = (int16_t*) (((uintptr_t) rfft_out_buff + 31) & ~31);
-
-  int16_t tmp16no1, tmp16no2;
-  int16_t energyRatio;
-  int16_t gainFactor, gainFactor1, gainFactor2;
-
-  size_t i;
-  int outCIFFT;
-  int scaleEnergyOut = 0;
-
-  if (inst->zeroInputSignal) {
-    // synthesize the special case of zero input
-    // read out fully processed segment
-    for (i = 0; i < inst->blockLen10ms; i++) {
-      outFrame[i] = inst->synthesisBuffer[i]; // Q0
-    }
-    // update synthesis buffer
-    memcpy(inst->synthesisBuffer, inst->synthesisBuffer + inst->blockLen10ms,
-        (inst->anaLen - inst->blockLen10ms) * sizeof(*inst->synthesisBuffer));
-    WebRtcSpl_ZerosArrayW16(inst->synthesisBuffer + inst->anaLen - inst->blockLen10ms,
-                            inst->blockLen10ms);
-    return;
-  }
-
-  // Filter the data in the frequency domain, and create spectrum.
-  WebRtcNsx_PrepareSpectrum(inst, realImag);
-
-  // Inverse FFT output will be in rfft_out[].
-  outCIFFT = WebRtcSpl_RealInverseFFT(inst->real_fft, realImag, rfft_out);
-
-  WebRtcNsx_Denormalize(inst, rfft_out, outCIFFT);
-
-  //scale factor: only do it after END_STARTUP_LONG time
-  gainFactor = 8192; // 8192 = Q13(1.0)
-  if (inst->gainMap == 1 &&
-      inst->blockIndex > END_STARTUP_LONG &&
-      inst->energyIn > 0) {
-    // Q(-scaleEnergyOut)
-    energyOut = WebRtcSpl_Energy(inst->real, inst->anaLen, &scaleEnergyOut);
-    if (scaleEnergyOut == 0 && !(energyOut & 0x7f800000)) {
-      energyOut = WEBRTC_SPL_SHIFT_W32(energyOut, 8 + scaleEnergyOut
-                                       - inst->scaleEnergyIn);
-    } else {
-      // |energyIn| is currently in Q(|scaleEnergyIn|), but to later on end up
-      // with an |energyRatio| in Q8 we need to change the Q-domain to
-      // Q(-8-scaleEnergyOut).
-      inst->energyIn >>= 8 + scaleEnergyOut - inst->scaleEnergyIn;
-    }
-
-    RTC_DCHECK_GT(inst->energyIn, 0);
-    energyRatio = (energyOut + inst->energyIn / 2) / inst->energyIn;  // Q8
-    // Limit the ratio to [0, 1] in Q8, i.e., [0, 256]
-    energyRatio = WEBRTC_SPL_SAT(256, energyRatio, 0);
-
-    // all done in lookup tables now
-    RTC_DCHECK_LT(energyRatio, 257);
-    gainFactor1 = kFactor1Table[energyRatio]; // Q8
-    gainFactor2 = inst->factor2Table[energyRatio]; // Q8
-
-    //combine both scales with speech/noise prob: note prior (priorSpeechProb) is not frequency dependent
-
-    // factor = inst->priorSpeechProb*factor1 + (1.0-inst->priorSpeechProb)*factor2; // original code
-    tmp16no1 = (int16_t)(((16384 - inst->priorNonSpeechProb) * gainFactor1) >>
-        14);  // in Q13, where 16384 = Q14(1.0)
-    tmp16no2 = (int16_t)((inst->priorNonSpeechProb * gainFactor2) >> 14);
-    gainFactor = tmp16no1 + tmp16no2; // Q13
-  }  // out of flag_gain_map==1
-
-  // Synthesis, read out fully processed segment, and update synthesis buffer.
-  WebRtcNsx_SynthesisUpdate(inst, outFrame, gainFactor);
-}
-
-void WebRtcNsx_ProcessCore(NoiseSuppressionFixedC* inst,
-                           const short* const* speechFrame,
-                           int num_bands,
-                           short* const* outFrame) {
-  // main routine for noise suppression
-
-  uint32_t tmpU32no1, tmpU32no2, tmpU32no3;
-  uint32_t satMax, maxNoiseU32;
-  uint32_t tmpMagnU32, tmpNoiseU32;
-  uint32_t nearMagnEst;
-  uint32_t noiseUpdateU32;
-  uint32_t noiseU32[HALF_ANAL_BLOCKL];
-  uint32_t postLocSnr[HALF_ANAL_BLOCKL];
-  uint32_t priorLocSnr[HALF_ANAL_BLOCKL];
-  uint32_t prevNearSnr[HALF_ANAL_BLOCKL];
-  uint32_t curNearSnr;
-  uint32_t priorSnr;
-  uint32_t noise_estimate = 0;
-  uint32_t noise_estimate_avg = 0;
-  uint32_t numerator = 0;
-
-  int32_t tmp32no1, tmp32no2;
-  int32_t pink_noise_num_avg = 0;
-
-  uint16_t tmpU16no1;
-  uint16_t magnU16[HALF_ANAL_BLOCKL];
-  uint16_t prevNoiseU16[HALF_ANAL_BLOCKL];
-  uint16_t nonSpeechProbFinal[HALF_ANAL_BLOCKL];
-  uint16_t gammaNoise, prevGammaNoise;
-  uint16_t noiseSupFilterTmp[HALF_ANAL_BLOCKL];
-
-  int16_t qMagn, qNoise;
-  int16_t avgProbSpeechHB, gainModHB, avgFilterGainHB, gainTimeDomainHB;
-  int16_t pink_noise_exp_avg = 0;
-
-  size_t i, j;
-  int nShifts, postShifts;
-  int norm32no1, norm32no2;
-  int flag, sign;
-  int q_domain_to_use = 0;
-
-  // Code for ARMv7-Neon platform assumes the following:
-  RTC_DCHECK_GT(inst->anaLen, 0);
-  RTC_DCHECK_GT(inst->anaLen2, 0);
-  RTC_DCHECK_EQ(0, inst->anaLen % 16);
-  RTC_DCHECK_EQ(0, inst->anaLen2 % 8);
-  RTC_DCHECK_GT(inst->blockLen10ms, 0);
-  RTC_DCHECK_EQ(0, inst->blockLen10ms % 16);
-  RTC_DCHECK_EQ(inst->magnLen, inst->anaLen2 + 1);
-
-#ifdef NS_FILEDEBUG
-  if (fwrite(spframe, sizeof(short),
-             inst->blockLen10ms, inst->infile) != inst->blockLen10ms) {
-    RTC_NOTREACHED();
-  }
-#endif
-
-  // Check that initialization has been done
-  RTC_DCHECK_EQ(1, inst->initFlag);
-  RTC_DCHECK_LE(num_bands - 1, NUM_HIGH_BANDS_MAX);
-
-  const short* const* speechFrameHB = NULL;
-  short* const* outFrameHB = NULL;
-  size_t num_high_bands = 0;
-  if (num_bands > 1) {
-    speechFrameHB = &speechFrame[1];
-    outFrameHB = &outFrame[1];
-    num_high_bands = (size_t)(num_bands - 1);
-  }
-
-  // Store speechFrame and transform to frequency domain
-  WebRtcNsx_DataAnalysis(inst, (short*)speechFrame[0], magnU16);
-
-  if (inst->zeroInputSignal) {
-    WebRtcNsx_DataSynthesis(inst, outFrame[0]);
-
-    if (num_bands > 1) {
-      // update analysis buffer for H band
-      // append new data to buffer FX
-      for (i = 0; i < num_high_bands; ++i) {
-        int block_shift = inst->anaLen - inst->blockLen10ms;
-        memcpy(inst->dataBufHBFX[i], inst->dataBufHBFX[i] + inst->blockLen10ms,
-            block_shift * sizeof(*inst->dataBufHBFX[i]));
-        memcpy(inst->dataBufHBFX[i] + block_shift, speechFrameHB[i],
-            inst->blockLen10ms * sizeof(*inst->dataBufHBFX[i]));
-        for (j = 0; j < inst->blockLen10ms; j++) {
-          outFrameHB[i][j] = inst->dataBufHBFX[i][j]; // Q0
-        }
-      }
-    }  // end of H band gain computation
-    return;
-  }
-
-  // Update block index when we have something to process
-  inst->blockIndex++;
-  //
-
-  // Norm of magn
-  qMagn = inst->normData - inst->stages;
-
-  // Compute spectral flatness on input spectrum
-  WebRtcNsx_ComputeSpectralFlatness(inst, magnU16);
-
-  // quantile noise estimate
-  WebRtcNsx_NoiseEstimation(inst, magnU16, noiseU32, &qNoise);
-
-  //noise estimate from previous frame
-  for (i = 0; i < inst->magnLen; i++) {
-    prevNoiseU16[i] = (uint16_t)(inst->prevNoiseU32[i] >> 11);  // Q(prevQNoise)
-  }
-
-  if (inst->blockIndex < END_STARTUP_SHORT) {
-    // Noise Q-domain to be used later; see description at end of section.
-    q_domain_to_use = WEBRTC_SPL_MIN((int)qNoise, inst->minNorm - inst->stages);
-
-    // Calculate frequency independent parts in parametric noise estimate and calculate
-    // the estimate for the lower frequency band (same values for all frequency bins)
-    if (inst->pinkNoiseExp) {
-      pink_noise_exp_avg = (int16_t)WebRtcSpl_DivW32W16(inst->pinkNoiseExp,
-                                                              (int16_t)(inst->blockIndex + 1)); // Q14
-      pink_noise_num_avg = WebRtcSpl_DivW32W16(inst->pinkNoiseNumerator,
-                                               (int16_t)(inst->blockIndex + 1)); // Q11
-      WebRtcNsx_CalcParametricNoiseEstimate(inst,
-                                            pink_noise_exp_avg,
-                                            pink_noise_num_avg,
-                                            kStartBand,
-                                            &noise_estimate,
-                                            &noise_estimate_avg);
-    } else {
-      // Use white noise estimate if we have poor pink noise parameter estimates
-      noise_estimate = inst->whiteNoiseLevel; // Q(minNorm-stages)
-      noise_estimate_avg = noise_estimate / (inst->blockIndex + 1); // Q(minNorm-stages)
-    }
-    for (i = 0; i < inst->magnLen; i++) {
-      // Estimate the background noise using the pink noise parameters if permitted
-      if ((inst->pinkNoiseExp) && (i >= kStartBand)) {
-        // Reset noise_estimate
-        noise_estimate = 0;
-        noise_estimate_avg = 0;
-        // Calculate the parametric noise estimate for current frequency bin
-        WebRtcNsx_CalcParametricNoiseEstimate(inst,
-                                              pink_noise_exp_avg,
-                                              pink_noise_num_avg,
-                                              i,
-                                              &noise_estimate,
-                                              &noise_estimate_avg);
-      }
-      // Calculate parametric Wiener filter
-      noiseSupFilterTmp[i] = inst->denoiseBound;
-      if (inst->initMagnEst[i]) {
-        // numerator = (initMagnEst - noise_estimate * overdrive)
-        // Result in Q(8+minNorm-stages)
-        tmpU32no1 = WEBRTC_SPL_UMUL_32_16(noise_estimate, inst->overdrive);
-        numerator = inst->initMagnEst[i] << 8;
-        if (numerator > tmpU32no1) {
-          // Suppression filter coefficient larger than zero, so calculate.
-          numerator -= tmpU32no1;
-
-          // Determine number of left shifts in numerator for best accuracy after
-          // division
-          nShifts = WebRtcSpl_NormU32(numerator);
-          nShifts = WEBRTC_SPL_SAT(6, nShifts, 0);
-
-          // Shift numerator to Q(nShifts+8+minNorm-stages)
-          numerator <<= nShifts;
-
-          // Shift denominator to Q(nShifts-6+minNorm-stages)
-          tmpU32no1 = inst->initMagnEst[i] >> (6 - nShifts);
-          if (tmpU32no1 == 0) {
-            // This is only possible if numerator = 0, in which case
-            // we don't need any division.
-            tmpU32no1 = 1;
-          }
-          tmpU32no2 = numerator / tmpU32no1;  // Q14
-          noiseSupFilterTmp[i] = (uint16_t)WEBRTC_SPL_SAT(16384, tmpU32no2,
-              (uint32_t)(inst->denoiseBound)); // Q14
-        }
-      }
-      // Weight quantile noise 'noiseU32' with modeled noise 'noise_estimate_avg'
-      // 'noiseU32 is in Q(qNoise) and 'noise_estimate' in Q(minNorm-stages)
-      // To guarantee that we do not get wrap around when shifting to the same domain
-      // we use the lowest one. Furthermore, we need to save 6 bits for the weighting.
-      // 'noise_estimate_avg' can handle this operation by construction, but 'noiseU32'
-      // may not.
-
-      // Shift 'noiseU32' to 'q_domain_to_use'
-      tmpU32no1 = noiseU32[i] >> (qNoise - q_domain_to_use);
-      // Shift 'noise_estimate_avg' to 'q_domain_to_use'
-      tmpU32no2 = noise_estimate_avg >>
-          (inst->minNorm - inst->stages - q_domain_to_use);
-      // Make a simple check to see if we have enough room for weighting 'tmpU32no1'
-      // without wrap around
-      nShifts = 0;
-      if (tmpU32no1 & 0xfc000000) {
-        tmpU32no1 >>= 6;
-        tmpU32no2 >>= 6;
-        nShifts = 6;
-      }
-      tmpU32no1 *= inst->blockIndex;
-      tmpU32no2 *= (END_STARTUP_SHORT - inst->blockIndex);
-      // Add them together and divide by startup length
-      noiseU32[i] = WebRtcSpl_DivU32U16(tmpU32no1 + tmpU32no2, END_STARTUP_SHORT);
-      // Shift back if necessary
-      noiseU32[i] <<= nShifts;
-    }
-    // Update new Q-domain for 'noiseU32'
-    qNoise = q_domain_to_use;
-  }
-  // compute average signal during END_STARTUP_LONG time:
-  // used to normalize spectral difference measure
-  if (inst->blockIndex < END_STARTUP_LONG) {
-    // substituting division with shift ending up in Q(-2*stages)
-    inst->timeAvgMagnEnergyTmp +=
-        inst->magnEnergy >> (2 * inst->normData + inst->stages - 1);
-    inst->timeAvgMagnEnergy = WebRtcSpl_DivU32U16(inst->timeAvgMagnEnergyTmp,
-                                                  inst->blockIndex + 1);
-  }
-
-  //start processing at frames == converged+1
-  // STEP 1: compute prior and post SNR based on quantile noise estimates
-
-  // compute direct decision (DD) estimate of prior SNR: needed for new method
-  satMax = (uint32_t)1048575;// Largest possible value without getting overflow despite shifting 12 steps
-  postShifts = 6 + qMagn - qNoise;
-  nShifts = 5 - inst->prevQMagn + inst->prevQNoise;
-  for (i = 0; i < inst->magnLen; i++) {
-    // FLOAT:
-    // post SNR
-    // postLocSnr[i] = 0.0;
-    // if (magn[i] > noise[i])
-    // {
-    //   postLocSnr[i] = magn[i] / (noise[i] + 0.0001);
-    // }
-    // // previous post SNR
-    // // previous estimate: based on previous frame with gain filter (smooth is previous filter)
-    //
-    // prevNearSnr[i] = inst->prevMagnU16[i] / (inst->noisePrev[i] + 0.0001) * (inst->smooth[i]);
-    //
-    // // DD estimate is sum of two terms: current estimate and previous estimate
-    // // directed decision update of priorSnr (or we actually store [2*priorSnr+1])
-    //
-    // priorLocSnr[i] = DD_PR_SNR * prevNearSnr[i] + (1.0 - DD_PR_SNR) * (postLocSnr[i] - 1.0);
-
-    // calculate post SNR: output in Q11
-    postLocSnr[i] = 2048; // 1.0 in Q11
-    tmpU32no1 = (uint32_t)magnU16[i] << 6;  // Q(6+qMagn)
-    if (postShifts < 0) {
-      tmpU32no2 = noiseU32[i] >> -postShifts;  // Q(6+qMagn)
-    } else {
-      tmpU32no2 = noiseU32[i] << postShifts;  // Q(6+qMagn)
-    }
-    if (tmpU32no1 > tmpU32no2) {
-      // Current magnitude larger than noise
-      tmpU32no1 <<= 11;  // Q(17+qMagn)
-      if (tmpU32no2 > 0) {
-        tmpU32no1 /= tmpU32no2;  // Q11
-        postLocSnr[i] = WEBRTC_SPL_MIN(satMax, tmpU32no1); // Q11
-      } else {
-        postLocSnr[i] = satMax;
-      }
-    }
-
-    // calculate prevNearSnr[i] and save for later instead of recalculating it later
-    // |nearMagnEst| in Q(prevQMagn + 14)
-    nearMagnEst = inst->prevMagnU16[i] * inst->noiseSupFilter[i];
-    tmpU32no1 = nearMagnEst << 3;  // Q(prevQMagn+17)
-    tmpU32no2 = inst->prevNoiseU32[i] >> nShifts;  // Q(prevQMagn+6)
-
-    if (tmpU32no2 > 0) {
-      tmpU32no1 /= tmpU32no2;  // Q11
-      tmpU32no1 = WEBRTC_SPL_MIN(satMax, tmpU32no1); // Q11
-    } else {
-      tmpU32no1 = satMax; // Q11
-    }
-    prevNearSnr[i] = tmpU32no1; // Q11
-
-    //directed decision update of priorSnr
-    tmpU32no1 = WEBRTC_SPL_UMUL_32_16(prevNearSnr[i], DD_PR_SNR_Q11); // Q22
-    tmpU32no2 = WEBRTC_SPL_UMUL_32_16(postLocSnr[i] - 2048, ONE_MINUS_DD_PR_SNR_Q11); // Q22
-    priorSnr = tmpU32no1 + tmpU32no2 + 512; // Q22 (added 512 for rounding)
-    // priorLocSnr = 1 + 2*priorSnr
-    priorLocSnr[i] = 2048 + (priorSnr >> 10);  // Q11
-  }  // end of loop over frequencies
-  // done with step 1: DD computation of prior and post SNR
-
-  // STEP 2: compute speech/noise likelihood
-
-  //compute difference of input spectrum with learned/estimated noise spectrum
-  WebRtcNsx_ComputeSpectralDifference(inst, magnU16);
-  //compute histograms for determination of parameters (thresholds and weights for features)
-  //parameters are extracted once every window time (=inst->modelUpdate)
-  //counter update
-  inst->cntThresUpdate++;
-  flag = (int)(inst->cntThresUpdate == inst->modelUpdate);
-  //update histogram
-  WebRtcNsx_FeatureParameterExtraction(inst, flag);
-  //compute model parameters
-  if (flag) {
-    inst->cntThresUpdate = 0; // Reset counter
-    //update every window:
-    // get normalization for spectral difference for next window estimate
-
-    // Shift to Q(-2*stages)
-    inst->curAvgMagnEnergy >>= STAT_UPDATES;
-
-    tmpU32no1 = (inst->curAvgMagnEnergy + inst->timeAvgMagnEnergy + 1) >> 1; //Q(-2*stages)
-    // Update featureSpecDiff
-    if ((tmpU32no1 != inst->timeAvgMagnEnergy) && (inst->featureSpecDiff) &&
-        (inst->timeAvgMagnEnergy > 0)) {
-      norm32no1 = 0;
-      tmpU32no3 = tmpU32no1;
-      while (0xFFFF0000 & tmpU32no3) {
-        tmpU32no3 >>= 1;
-        norm32no1++;
-      }
-      tmpU32no2 = inst->featureSpecDiff;
-      while (0xFFFF0000 & tmpU32no2) {
-        tmpU32no2 >>= 1;
-        norm32no1++;
-      }
-      tmpU32no3 = WEBRTC_SPL_UMUL(tmpU32no3, tmpU32no2);
-      tmpU32no3 /= inst->timeAvgMagnEnergy;
-      if (WebRtcSpl_NormU32(tmpU32no3) < norm32no1) {
-        inst->featureSpecDiff = 0x007FFFFF;
-      } else {
-        inst->featureSpecDiff = WEBRTC_SPL_MIN(0x007FFFFF,
-                                               tmpU32no3 << norm32no1);
-      }
-    }
-
-    inst->timeAvgMagnEnergy = tmpU32no1; // Q(-2*stages)
-    inst->curAvgMagnEnergy = 0;
-  }
-
-  //compute speech/noise probability
-  WebRtcNsx_SpeechNoiseProb(inst, nonSpeechProbFinal, priorLocSnr, postLocSnr);
-
-  //time-avg parameter for noise update
-  gammaNoise = NOISE_UPDATE_Q8; // Q8
-
-  maxNoiseU32 = 0;
-  postShifts = inst->prevQNoise - qMagn;
-  nShifts = inst->prevQMagn - qMagn;
-  for (i = 0; i < inst->magnLen; i++) {
-    // temporary noise update: use it for speech frames if update value is less than previous
-    // the formula has been rewritten into:
-    // noiseUpdate = noisePrev[i] + (1 - gammaNoise) * nonSpeechProb * (magn[i] - noisePrev[i])
-
-    if (postShifts < 0) {
-      tmpU32no2 = magnU16[i] >> -postShifts;  // Q(prevQNoise)
-    } else {
-      tmpU32no2 = (uint32_t)magnU16[i] << postShifts;  // Q(prevQNoise)
-    }
-    if (prevNoiseU16[i] > tmpU32no2) {
-      sign = -1;
-      tmpU32no1 = prevNoiseU16[i] - tmpU32no2;
-    } else {
-      sign = 1;
-      tmpU32no1 = tmpU32no2 - prevNoiseU16[i];
-    }
-    noiseUpdateU32 = inst->prevNoiseU32[i]; // Q(prevQNoise+11)
-    tmpU32no3 = 0;
-    if ((tmpU32no1) && (nonSpeechProbFinal[i])) {
-      // This value will be used later, if gammaNoise changes
-      tmpU32no3 = WEBRTC_SPL_UMUL_32_16(tmpU32no1, nonSpeechProbFinal[i]); // Q(prevQNoise+8)
-      if (0x7c000000 & tmpU32no3) {
-        // Shifting required before multiplication
-        tmpU32no2 = (tmpU32no3 >> 5) * gammaNoise;  // Q(prevQNoise+11)
-      } else {
-        // We can do shifting after multiplication
-        tmpU32no2 = (tmpU32no3 * gammaNoise) >> 5;  // Q(prevQNoise+11)
-      }
-      if (sign > 0) {
-        noiseUpdateU32 += tmpU32no2; // Q(prevQNoise+11)
-      } else {
-        // This operation is safe. We can never get wrap around, since worst
-        // case scenario means magnU16 = 0
-        noiseUpdateU32 -= tmpU32no2; // Q(prevQNoise+11)
-      }
-    }
-
-    //increase gamma (i.e., less noise update) for frame likely to be speech
-    prevGammaNoise = gammaNoise;
-    gammaNoise = NOISE_UPDATE_Q8;
-    //time-constant based on speech/noise state
-    //increase gamma (i.e., less noise update) for frames likely to be speech
-    if (nonSpeechProbFinal[i] < ONE_MINUS_PROB_RANGE_Q8) {
-      gammaNoise = GAMMA_NOISE_TRANS_AND_SPEECH_Q8;
-    }
-
-    if (prevGammaNoise != gammaNoise) {
-      // new noise update
-      // this line is the same as above, only that the result is stored in a different variable and the gammaNoise
-      // has changed
-      //
-      // noiseUpdate = noisePrev[i] + (1 - gammaNoise) * nonSpeechProb * (magn[i] - noisePrev[i])
-
-      if (0x7c000000 & tmpU32no3) {
-        // Shifting required before multiplication
-        tmpU32no2 = (tmpU32no3 >> 5) * gammaNoise;  // Q(prevQNoise+11)
-      } else {
-        // We can do shifting after multiplication
-        tmpU32no2 = (tmpU32no3 * gammaNoise) >> 5;  // Q(prevQNoise+11)
-      }
-      if (sign > 0) {
-        tmpU32no1 = inst->prevNoiseU32[i] + tmpU32no2; // Q(prevQNoise+11)
-      } else {
-        tmpU32no1 = inst->prevNoiseU32[i] - tmpU32no2; // Q(prevQNoise+11)
-      }
-      if (noiseUpdateU32 > tmpU32no1) {
-        noiseUpdateU32 = tmpU32no1; // Q(prevQNoise+11)
-      }
-    }
-    noiseU32[i] = noiseUpdateU32; // Q(prevQNoise+11)
-    if (noiseUpdateU32 > maxNoiseU32) {
-      maxNoiseU32 = noiseUpdateU32;
-    }
-
-    // conservative noise update
-    // // original FLOAT code
-    // if (prob_speech < PROB_RANGE) {
-    // inst->avgMagnPause[i] = inst->avgMagnPause[i] + (1.0 - gamma_pause)*(magn[i] - inst->avgMagnPause[i]);
-    // }
-
-    tmp32no2 = WEBRTC_SPL_SHIFT_W32(inst->avgMagnPause[i], -nShifts);
-    if (nonSpeechProbFinal[i] > ONE_MINUS_PROB_RANGE_Q8) {
-      if (nShifts < 0) {
-        tmp32no1 = (int32_t)magnU16[i] - tmp32no2; // Q(qMagn)
-        tmp32no1 *= ONE_MINUS_GAMMA_PAUSE_Q8;  // Q(8+prevQMagn+nShifts)
-        tmp32no1 = (tmp32no1 + 128) >> 8;  // Q(qMagn).
-      } else {
-        // In Q(qMagn+nShifts)
-        tmp32no1 = ((int32_t)magnU16[i] << nShifts) - inst->avgMagnPause[i];
-        tmp32no1 *= ONE_MINUS_GAMMA_PAUSE_Q8;  // Q(8+prevQMagn+nShifts)
-        tmp32no1 = (tmp32no1 + (128 << nShifts)) >> (8 + nShifts);  // Q(qMagn).
-      }
-      tmp32no2 += tmp32no1; // Q(qMagn)
-    }
-    inst->avgMagnPause[i] = tmp32no2;
-  }  // end of frequency loop
-
-  norm32no1 = WebRtcSpl_NormU32(maxNoiseU32);
-  qNoise = inst->prevQNoise + norm32no1 - 5;
-  // done with step 2: noise update
-
-  // STEP 3: compute dd update of prior snr and post snr based on new noise estimate
-  nShifts = inst->prevQNoise + 11 - qMagn;
-  for (i = 0; i < inst->magnLen; i++) {
-    // FLOAT code
-    // // post and prior SNR
-    // curNearSnr = 0.0;
-    // if (magn[i] > noise[i])
-    // {
-    // curNearSnr = magn[i] / (noise[i] + 0.0001) - 1.0;
-    // }
-    // // DD estimate is sum of two terms: current estimate and previous estimate
-    // // directed decision update of snrPrior
-    // snrPrior = DD_PR_SNR * prevNearSnr[i] + (1.0 - DD_PR_SNR) * curNearSnr;
-    // // gain filter
-    // tmpFloat1 = inst->overdrive + snrPrior;
-    // tmpFloat2 = snrPrior / tmpFloat1;
-    // theFilter[i] = tmpFloat2;
-
-    // calculate curNearSnr again, this is necessary because a new noise estimate has been made since then. for the original
-    curNearSnr = 0; // Q11
-    if (nShifts < 0) {
-      // This case is equivalent with magn < noise which implies curNearSnr = 0;
-      tmpMagnU32 = (uint32_t)magnU16[i]; // Q(qMagn)
-      tmpNoiseU32 = noiseU32[i] << -nShifts;  // Q(qMagn)
-    } else if (nShifts > 17) {
-      tmpMagnU32 = (uint32_t)magnU16[i] << 17;  // Q(qMagn+17)
-      tmpNoiseU32 = noiseU32[i] >> (nShifts - 17);  // Q(qMagn+17)
-    } else {
-      tmpMagnU32 = (uint32_t)magnU16[i] << nShifts;  // Q(qNoise_prev+11)
-      tmpNoiseU32 = noiseU32[i]; // Q(qNoise_prev+11)
-    }
-    if (tmpMagnU32 > tmpNoiseU32) {
-      tmpU32no1 = tmpMagnU32 - tmpNoiseU32; // Q(qCur)
-      norm32no2 = WEBRTC_SPL_MIN(11, WebRtcSpl_NormU32(tmpU32no1));
-      tmpU32no1 <<= norm32no2;  // Q(qCur+norm32no2)
-      tmpU32no2 = tmpNoiseU32 >> (11 - norm32no2);  // Q(qCur+norm32no2-11)
-      if (tmpU32no2 > 0) {
-        tmpU32no1 /= tmpU32no2;  // Q11
-      }
-      curNearSnr = WEBRTC_SPL_MIN(satMax, tmpU32no1); // Q11
-    }
-
-    //directed decision update of priorSnr
-    // FLOAT
-    // priorSnr = DD_PR_SNR * prevNearSnr + (1.0-DD_PR_SNR) * curNearSnr;
-
-    tmpU32no1 = WEBRTC_SPL_UMUL_32_16(prevNearSnr[i], DD_PR_SNR_Q11); // Q22
-    tmpU32no2 = WEBRTC_SPL_UMUL_32_16(curNearSnr, ONE_MINUS_DD_PR_SNR_Q11); // Q22
-    priorSnr = tmpU32no1 + tmpU32no2; // Q22
-
-    //gain filter
-    tmpU32no1 = inst->overdrive + ((priorSnr + 8192) >> 14);  // Q8
-    RTC_DCHECK_GT(inst->overdrive, 0);
-    tmpU16no1 = (priorSnr + tmpU32no1 / 2) / tmpU32no1;  // Q14
-    inst->noiseSupFilter[i] = WEBRTC_SPL_SAT(16384, tmpU16no1, inst->denoiseBound); // 16384 = Q14(1.0) // Q14
-
-    // Weight in the parametric Wiener filter during startup
-    if (inst->blockIndex < END_STARTUP_SHORT) {
-      // Weight the two suppression filters
-      tmpU32no1 = inst->noiseSupFilter[i] * inst->blockIndex;
-      tmpU32no2 = noiseSupFilterTmp[i] *
-          (END_STARTUP_SHORT - inst->blockIndex);
-      tmpU32no1 += tmpU32no2;
-      inst->noiseSupFilter[i] = (uint16_t)WebRtcSpl_DivU32U16(tmpU32no1,
-                                                                    END_STARTUP_SHORT);
-    }
-  }  // end of loop over frequencies
-  //done with step3
-
-  // save noise and magnitude spectrum for next frame
-  inst->prevQNoise = qNoise;
-  inst->prevQMagn = qMagn;
-  if (norm32no1 > 5) {
-    for (i = 0; i < inst->magnLen; i++) {
-      inst->prevNoiseU32[i] = noiseU32[i] << (norm32no1 - 5);  // Q(qNoise+11)
-      inst->prevMagnU16[i] = magnU16[i]; // Q(qMagn)
-    }
-  } else {
-    for (i = 0; i < inst->magnLen; i++) {
-      inst->prevNoiseU32[i] = noiseU32[i] >> (5 - norm32no1);  // Q(qNoise+11)
-      inst->prevMagnU16[i] = magnU16[i]; // Q(qMagn)
-    }
-  }
-
-  WebRtcNsx_DataSynthesis(inst, outFrame[0]);
-#ifdef NS_FILEDEBUG
-  if (fwrite(outframe, sizeof(short),
-             inst->blockLen10ms, inst->outfile) != inst->blockLen10ms) {
-    RTC_NOTREACHED();
-  }
-#endif
-
-  //for H band:
-  // only update data buffer, then apply time-domain gain is applied derived from L band
-  if (num_bands > 1) {
-    // update analysis buffer for H band
-    // append new data to buffer FX
-    for (i = 0; i < num_high_bands; ++i) {
-      memcpy(inst->dataBufHBFX[i], inst->dataBufHBFX[i] + inst->blockLen10ms,
-          (inst->anaLen - inst->blockLen10ms) * sizeof(*inst->dataBufHBFX[i]));
-      memcpy(inst->dataBufHBFX[i] + inst->anaLen - inst->blockLen10ms,
-          speechFrameHB[i], inst->blockLen10ms * sizeof(*inst->dataBufHBFX[i]));
-    }
-    // range for averaging low band quantities for H band gain
-
-    gainTimeDomainHB = 16384; // 16384 = Q14(1.0)
-    //average speech prob from low band
-    //average filter gain from low band
-    //avg over second half (i.e., 4->8kHz) of freq. spectrum
-    tmpU32no1 = 0; // Q12
-    tmpU16no1 = 0; // Q8
-    for (i = inst->anaLen2 - (inst->anaLen2 >> 2); i < inst->anaLen2; i++) {
-      tmpU16no1 += nonSpeechProbFinal[i]; // Q8
-      tmpU32no1 += (uint32_t)(inst->noiseSupFilter[i]); // Q14
-    }
-    RTC_DCHECK_GE(inst->stages, 7);
-    avgProbSpeechHB = (4096 - (tmpU16no1 >> (inst->stages - 7)));  // Q12
-    avgFilterGainHB = (int16_t)(tmpU32no1 >> (inst->stages - 3));  // Q14
-
-    // // original FLOAT code
-    // // gain based on speech probability:
-    // avg_prob_speech_tt=(float)2.0*avg_prob_speech-(float)1.0;
-    // gain_mod=(float)0.5*((float)1.0+(float)tanh(avg_prob_speech_tt)); // between 0 and 1
-
-    // gain based on speech probability:
-    // original expression: "0.5 * (1 + tanh(2x-1))"
-    // avgProbSpeechHB has been anyway saturated to a value between 0 and 1 so the other cases don't have to be dealt with
-    // avgProbSpeechHB and gainModHB are in Q12, 3607 = Q12(0.880615234375) which is a zero point of
-    // |0.5 * (1 + tanh(2x-1)) - x| - |0.5 * (1 + tanh(2x-1)) - 0.880615234375| meaning that from that point the error of approximating
-    // the expression with f(x) = x would be greater than the error of approximating the expression with f(x) = 0.880615234375
-    // error: "|0.5 * (1 + tanh(2x-1)) - x| from x=0 to 0.880615234375" -> http://www.wolframalpha.com/input/?i=|0.5+*+(1+%2B+tanh(2x-1))+-+x|+from+x%3D0+to+0.880615234375
-    // and:  "|0.5 * (1 + tanh(2x-1)) - 0.880615234375| from x=0.880615234375 to 1" -> http://www.wolframalpha.com/input/?i=+|0.5+*+(1+%2B+tanh(2x-1))+-+0.880615234375|+from+x%3D0.880615234375+to+1
-    gainModHB = WEBRTC_SPL_MIN(avgProbSpeechHB, 3607);
-
-    // // original FLOAT code
-    // //combine gain with low band gain
-    // if (avg_prob_speech < (float)0.5) {
-    // gain_time_domain_HB=(float)0.5*gain_mod+(float)0.5*avg_filter_gain;
-    // }
-    // else {
-    // gain_time_domain_HB=(float)0.25*gain_mod+(float)0.75*avg_filter_gain;
-    // }
-
-
-    //combine gain with low band gain
-    if (avgProbSpeechHB < 2048) {
-      // 2048 = Q12(0.5)
-      // the next two lines in float are  "gain_time_domain = 0.5 * gain_mod + 0.5 * avg_filter_gain"; Q2(0.5) = 2 equals one left shift
-      gainTimeDomainHB = (gainModHB << 1) + (avgFilterGainHB >> 1); // Q14
-    } else {
-      // "gain_time_domain = 0.25 * gain_mod + 0.75 * agv_filter_gain;"
-      gainTimeDomainHB = (int16_t)((3 * avgFilterGainHB) >> 2);  // 3 = Q2(0.75)
-      gainTimeDomainHB += gainModHB; // Q14
-    }
-    //make sure gain is within flooring range
-    gainTimeDomainHB
-      = WEBRTC_SPL_SAT(16384, gainTimeDomainHB, (int16_t)(inst->denoiseBound)); // 16384 = Q14(1.0)
-
-
-    //apply gain
-    for (i = 0; i < num_high_bands; ++i) {
-      for (j = 0; j < inst->blockLen10ms; j++) {
-        outFrameHB[i][j] = (int16_t)((gainTimeDomainHB *
-            inst->dataBufHBFX[i][j]) >> 14);  // Q0
-      }
-    }
-  }  // end of H band gain computation
-}
diff --git a/modules/audio_processing/ns/nsx_core.h b/modules/audio_processing/ns/nsx_core.h
deleted file mode 100644
index d1754f3..0000000
--- a/modules/audio_processing/ns/nsx_core.h
+++ /dev/null
@@ -1,263 +0,0 @@
-/*
- *  Copyright (c) 2012 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_PROCESSING_NS_MAIN_SOURCE_NSX_CORE_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_NS_MAIN_SOURCE_NSX_CORE_H_
-
-#ifdef NS_FILEDEBUG
-#include <stdio.h>
-#endif
-
-#include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
-#include "webrtc/modules/audio_processing/ns/nsx_defines.h"
-#include "webrtc/typedefs.h"
-
-typedef struct NoiseSuppressionFixedC_ {
-  uint32_t                fs;
-
-  const int16_t*          window;
-  int16_t                 analysisBuffer[ANAL_BLOCKL_MAX];
-  int16_t                 synthesisBuffer[ANAL_BLOCKL_MAX];
-  uint16_t                noiseSupFilter[HALF_ANAL_BLOCKL];
-  uint16_t                overdrive; /* Q8 */
-  uint16_t                denoiseBound; /* Q14 */
-  const int16_t*          factor2Table;
-  int16_t                 noiseEstLogQuantile[SIMULT* HALF_ANAL_BLOCKL];
-  int16_t                 noiseEstDensity[SIMULT* HALF_ANAL_BLOCKL];
-  int16_t                 noiseEstCounter[SIMULT];
-  int16_t                 noiseEstQuantile[HALF_ANAL_BLOCKL];
-
-  size_t                  anaLen;
-  size_t                  anaLen2;
-  size_t                  magnLen;
-  int                     aggrMode;
-  int                     stages;
-  int                     initFlag;
-  int                     gainMap;
-
-  int32_t                 maxLrt;
-  int32_t                 minLrt;
-  // Log LRT factor with time-smoothing in Q8.
-  int32_t                 logLrtTimeAvgW32[HALF_ANAL_BLOCKL];
-  int32_t                 featureLogLrt;
-  int32_t                 thresholdLogLrt;
-  int16_t                 weightLogLrt;
-
-  uint32_t                featureSpecDiff;
-  uint32_t                thresholdSpecDiff;
-  int16_t                 weightSpecDiff;
-
-  uint32_t                featureSpecFlat;
-  uint32_t                thresholdSpecFlat;
-  int16_t                 weightSpecFlat;
-
-  // Conservative estimate of noise spectrum.
-  int32_t                 avgMagnPause[HALF_ANAL_BLOCKL];
-  uint32_t                magnEnergy;
-  uint32_t                sumMagn;
-  uint32_t                curAvgMagnEnergy;
-  uint32_t                timeAvgMagnEnergy;
-  uint32_t                timeAvgMagnEnergyTmp;
-
-  uint32_t                whiteNoiseLevel;  // Initial noise estimate.
-  // Initial magnitude spectrum estimate.
-  uint32_t                initMagnEst[HALF_ANAL_BLOCKL];
-  // Pink noise parameters:
-  int32_t                 pinkNoiseNumerator;  // Numerator.
-  int32_t                 pinkNoiseExp;  // Power of freq.
-  int                     minNorm;  // Smallest normalization factor.
-  int                     zeroInputSignal;  // Zero input signal flag.
-
-  // Noise spectrum from previous frame.
-  uint32_t                prevNoiseU32[HALF_ANAL_BLOCKL];
-  // Magnitude spectrum from previous frame.
-  uint16_t                prevMagnU16[HALF_ANAL_BLOCKL];
-  // Prior speech/noise probability in Q14.
-  int16_t                 priorNonSpeechProb;
-
-  int                     blockIndex;  // Frame index counter.
-  // Parameter for updating or estimating thresholds/weights for prior model.
-  int                     modelUpdate;
-  int                     cntThresUpdate;
-
-  // Histograms for parameter estimation.
-  int16_t                 histLrt[HIST_PAR_EST];
-  int16_t                 histSpecFlat[HIST_PAR_EST];
-  int16_t                 histSpecDiff[HIST_PAR_EST];
-
-  // Quantities for high band estimate.
-  int16_t                 dataBufHBFX[NUM_HIGH_BANDS_MAX][ANAL_BLOCKL_MAX];
-
-  int                     qNoise;
-  int                     prevQNoise;
-  int                     prevQMagn;
-  size_t                  blockLen10ms;
-
-  int16_t                 real[ANAL_BLOCKL_MAX];
-  int16_t                 imag[ANAL_BLOCKL_MAX];
-  int32_t                 energyIn;
-  int                     scaleEnergyIn;
-  int                     normData;
-
-  struct RealFFT* real_fft;
-} NoiseSuppressionFixedC;
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
-/****************************************************************************
- * WebRtcNsx_InitCore(...)
- *
- * This function initializes a noise suppression instance
- *
- * Input:
- *      - inst          : Instance that should be initialized
- *      - fs            : Sampling frequency
- *
- * Output:
- *      - inst          : Initialized instance
- *
- * Return value         :  0 - Ok
- *                        -1 - Error
- */
-int32_t WebRtcNsx_InitCore(NoiseSuppressionFixedC* inst, uint32_t fs);
-
-/****************************************************************************
- * WebRtcNsx_set_policy_core(...)
- *
- * This changes the aggressiveness of the noise suppression method.
- *
- * Input:
- *      - inst       : Instance that should be initialized
- *      - mode       : 0: Mild (6 dB), 1: Medium (10 dB), 2: Aggressive (15 dB)
- *
- * Output:
- *      - inst       : Initialized instance
- *
- * Return value      :  0 - Ok
- *                     -1 - Error
- */
-int WebRtcNsx_set_policy_core(NoiseSuppressionFixedC* inst, int mode);
-
-/****************************************************************************
- * WebRtcNsx_ProcessCore
- *
- * Do noise suppression.
- *
- * Input:
- *      - inst          : Instance that should be initialized
- *      - inFrame       : Input speech frame for each band
- *      - num_bands     : Number of bands
- *
- * Output:
- *      - inst          : Updated instance
- *      - outFrame      : Output speech frame for each band
- */
-void WebRtcNsx_ProcessCore(NoiseSuppressionFixedC* inst,
-                           const short* const* inFrame,
-                           int num_bands,
-                           short* const* outFrame);
-
-/****************************************************************************
- * Some function pointers, for internal functions shared by ARM NEON and
- * generic C code.
- */
-// Noise Estimation.
-typedef void (*NoiseEstimation)(NoiseSuppressionFixedC* inst,
-                                uint16_t* magn,
-                                uint32_t* noise,
-                                int16_t* q_noise);
-extern NoiseEstimation WebRtcNsx_NoiseEstimation;
-
-// Filter the data in the frequency domain, and create spectrum.
-typedef void (*PrepareSpectrum)(NoiseSuppressionFixedC* inst,
-                                int16_t* freq_buff);
-extern PrepareSpectrum WebRtcNsx_PrepareSpectrum;
-
-// For the noise supression process, synthesis, read out fully processed
-// segment, and update synthesis buffer.
-typedef void (*SynthesisUpdate)(NoiseSuppressionFixedC* inst,
-                                int16_t* out_frame,
-                                int16_t gain_factor);
-extern SynthesisUpdate WebRtcNsx_SynthesisUpdate;
-
-// Update analysis buffer for lower band, and window data before FFT.
-typedef void (*AnalysisUpdate)(NoiseSuppressionFixedC* inst,
-                               int16_t* out,
-                               int16_t* new_speech);
-extern AnalysisUpdate WebRtcNsx_AnalysisUpdate;
-
-// Denormalize the real-valued signal |in|, the output from inverse FFT.
-typedef void (*Denormalize)(NoiseSuppressionFixedC* inst,
-                            int16_t* in,
-                            int factor);
-extern Denormalize WebRtcNsx_Denormalize;
-
-// Normalize the real-valued signal |in|, the input to forward FFT.
-typedef void (*NormalizeRealBuffer)(NoiseSuppressionFixedC* inst,
-                                    const int16_t* in,
-                                    int16_t* out);
-extern NormalizeRealBuffer WebRtcNsx_NormalizeRealBuffer;
-
-// Compute speech/noise probability.
-// Intended to be private.
-void WebRtcNsx_SpeechNoiseProb(NoiseSuppressionFixedC* inst,
-                               uint16_t* nonSpeechProbFinal,
-                               uint32_t* priorLocSnr,
-                               uint32_t* postLocSnr);
-
-#if defined(WEBRTC_HAS_NEON)
-// For the above function pointers, functions for generic platforms are declared
-// and defined as static in file nsx_core.c, while those for ARM Neon platforms
-// are declared below and defined in file nsx_core_neon.c.
-void WebRtcNsx_NoiseEstimationNeon(NoiseSuppressionFixedC* inst,
-                                   uint16_t* magn,
-                                   uint32_t* noise,
-                                   int16_t* q_noise);
-void WebRtcNsx_SynthesisUpdateNeon(NoiseSuppressionFixedC* inst,
-                                   int16_t* out_frame,
-                                   int16_t gain_factor);
-void WebRtcNsx_AnalysisUpdateNeon(NoiseSuppressionFixedC* inst,
-                                  int16_t* out,
-                                  int16_t* new_speech);
-void WebRtcNsx_PrepareSpectrumNeon(NoiseSuppressionFixedC* inst,
-                                   int16_t* freq_buff);
-#endif
-
-#if defined(MIPS32_LE)
-// For the above function pointers, functions for generic platforms are declared
-// and defined as static in file nsx_core.c, while those for MIPS platforms
-// are declared below and defined in file nsx_core_mips.c.
-void WebRtcNsx_SynthesisUpdate_mips(NoiseSuppressionFixedC* inst,
-                                    int16_t* out_frame,
-                                    int16_t gain_factor);
-void WebRtcNsx_AnalysisUpdate_mips(NoiseSuppressionFixedC* inst,
-                                   int16_t* out,
-                                   int16_t* new_speech);
-void WebRtcNsx_PrepareSpectrum_mips(NoiseSuppressionFixedC* inst,
-                                    int16_t* freq_buff);
-void WebRtcNsx_NormalizeRealBuffer_mips(NoiseSuppressionFixedC* inst,
-                                        const int16_t* in,
-                                        int16_t* out);
-#if defined(MIPS_DSP_R1_LE)
-void WebRtcNsx_Denormalize_mips(NoiseSuppressionFixedC* inst,
-                                int16_t* in,
-                                int factor);
-#endif
-
-#endif
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_NS_MAIN_SOURCE_NSX_CORE_H_
diff --git a/modules/audio_processing/ns/nsx_core_c.c b/modules/audio_processing/ns/nsx_core_c.c
deleted file mode 100644
index 5142be8..0000000
--- a/modules/audio_processing/ns/nsx_core_c.c
+++ /dev/null
@@ -1,260 +0,0 @@
-/*
- *  Copyright (c) 2013 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/rtc_base/checks.h"
-#include "webrtc/modules/audio_processing/ns/noise_suppression_x.h"
-#include "webrtc/modules/audio_processing/ns/nsx_core.h"
-#include "webrtc/modules/audio_processing/ns/nsx_defines.h"
-
-static const int16_t kIndicatorTable[17] = {
-  0, 2017, 3809, 5227, 6258, 6963, 7424, 7718,
-  7901, 8014, 8084, 8126, 8152, 8168, 8177, 8183, 8187
-};
-
-// Compute speech/noise probability
-// speech/noise probability is returned in: probSpeechFinal
-//snrLocPrior is the prior SNR for each frequency (in Q11)
-//snrLocPost is the post SNR for each frequency (in Q11)
-void WebRtcNsx_SpeechNoiseProb(NoiseSuppressionFixedC* inst,
-                               uint16_t* nonSpeechProbFinal,
-                               uint32_t* priorLocSnr,
-                               uint32_t* postLocSnr) {
-  uint32_t zeros, num, den, tmpU32no1, tmpU32no2, tmpU32no3;
-  int32_t invLrtFX, indPriorFX, tmp32, tmp32no1, tmp32no2, besselTmpFX32;
-  int32_t frac32, logTmp;
-  int32_t logLrtTimeAvgKsumFX;
-  int16_t indPriorFX16;
-  int16_t tmp16, tmp16no1, tmp16no2, tmpIndFX, tableIndex, frac, intPart;
-  size_t i;
-  int normTmp, normTmp2, nShifts;
-
-  // compute feature based on average LR factor
-  // this is the average over all frequencies of the smooth log LRT
-  logLrtTimeAvgKsumFX = 0;
-  for (i = 0; i < inst->magnLen; i++) {
-    besselTmpFX32 = (int32_t)postLocSnr[i]; // Q11
-    normTmp = WebRtcSpl_NormU32(postLocSnr[i]);
-    num = postLocSnr[i] << normTmp;  // Q(11+normTmp)
-    if (normTmp > 10) {
-      den = priorLocSnr[i] << (normTmp - 11);  // Q(normTmp)
-    } else {
-      den = priorLocSnr[i] >> (11 - normTmp);  // Q(normTmp)
-    }
-    if (den > 0) {
-      besselTmpFX32 -= num / den;  // Q11
-    } else {
-      besselTmpFX32 = 0;
-    }
-
-    // inst->logLrtTimeAvg[i] += LRT_TAVG * (besselTmp - log(snrLocPrior)
-    //                                       - inst->logLrtTimeAvg[i]);
-    // Here, LRT_TAVG = 0.5
-    zeros = WebRtcSpl_NormU32(priorLocSnr[i]);
-    frac32 = (int32_t)(((priorLocSnr[i] << zeros) & 0x7FFFFFFF) >> 19);
-    tmp32 = (frac32 * frac32 * -43) >> 19;
-    tmp32 += ((int16_t)frac32 * 5412) >> 12;
-    frac32 = tmp32 + 37;
-    // tmp32 = log2(priorLocSnr[i])
-    tmp32 = (int32_t)(((31 - zeros) << 12) + frac32) - (11 << 12); // Q12
-    logTmp = (tmp32 * 178) >> 8;  // log2(priorLocSnr[i])*log(2)
-    // tmp32no1 = LRT_TAVG * (log(snrLocPrior) + inst->logLrtTimeAvg[i]) in Q12.
-    tmp32no1 = (logTmp + inst->logLrtTimeAvgW32[i]) / 2;
-    inst->logLrtTimeAvgW32[i] += (besselTmpFX32 - tmp32no1); // Q12
-
-    logLrtTimeAvgKsumFX += inst->logLrtTimeAvgW32[i]; // Q12
-  }
-  inst->featureLogLrt = (logLrtTimeAvgKsumFX * BIN_SIZE_LRT) >>
-      (inst->stages + 11);
-
-  // done with computation of LR factor
-
-  //
-  //compute the indicator functions
-  //
-
-  // average LRT feature
-  // FLOAT code
-  // indicator0 = 0.5 * (tanh(widthPrior *
-  //                      (logLrtTimeAvgKsum - threshPrior0)) + 1.0);
-  tmpIndFX = 16384; // Q14(1.0)
-  tmp32no1 = logLrtTimeAvgKsumFX - inst->thresholdLogLrt; // Q12
-  nShifts = 7 - inst->stages; // WIDTH_PR_MAP_SHIFT - inst->stages + 5;
-  //use larger width in tanh map for pause regions
-  if (tmp32no1 < 0) {
-    tmpIndFX = 0;
-    tmp32no1 = -tmp32no1;
-    //widthPrior = widthPrior * 2.0;
-    nShifts++;
-  }
-  tmp32no1 = WEBRTC_SPL_SHIFT_W32(tmp32no1, nShifts); // Q14
-  // compute indicator function: sigmoid map
-  if (tmp32no1 < (16 << 14) && tmp32no1 >= 0) {
-    tableIndex = (int16_t)(tmp32no1 >> 14);
-    tmp16no2 = kIndicatorTable[tableIndex];
-    tmp16no1 = kIndicatorTable[tableIndex + 1] - kIndicatorTable[tableIndex];
-    frac = (int16_t)(tmp32no1 & 0x00003fff); // Q14
-    tmp16no2 += (int16_t)((tmp16no1 * frac) >> 14);
-    if (tmpIndFX == 0) {
-      tmpIndFX = 8192 - tmp16no2; // Q14
-    } else {
-      tmpIndFX = 8192 + tmp16no2; // Q14
-    }
-  }
-  indPriorFX = inst->weightLogLrt * tmpIndFX;  // 6*Q14
-
-  //spectral flatness feature
-  if (inst->weightSpecFlat) {
-    tmpU32no1 = WEBRTC_SPL_UMUL(inst->featureSpecFlat, 400); // Q10
-    tmpIndFX = 16384; // Q14(1.0)
-    //use larger width in tanh map for pause regions
-    tmpU32no2 = inst->thresholdSpecFlat - tmpU32no1; //Q10
-    nShifts = 4;
-    if (inst->thresholdSpecFlat < tmpU32no1) {
-      tmpIndFX = 0;
-      tmpU32no2 = tmpU32no1 - inst->thresholdSpecFlat;
-      //widthPrior = widthPrior * 2.0;
-      nShifts++;
-    }
-    tmpU32no1 = WebRtcSpl_DivU32U16(tmpU32no2 << nShifts, 25);  // Q14
-    // compute indicator function: sigmoid map
-    // FLOAT code
-    // indicator1 = 0.5 * (tanh(sgnMap * widthPrior *
-    //                          (threshPrior1 - tmpFloat1)) + 1.0);
-    if (tmpU32no1 < (16 << 14)) {
-      tableIndex = (int16_t)(tmpU32no1 >> 14);
-      tmp16no2 = kIndicatorTable[tableIndex];
-      tmp16no1 = kIndicatorTable[tableIndex + 1] - kIndicatorTable[tableIndex];
-      frac = (int16_t)(tmpU32no1 & 0x00003fff); // Q14
-      tmp16no2 += (int16_t)((tmp16no1 * frac) >> 14);
-      if (tmpIndFX) {
-        tmpIndFX = 8192 + tmp16no2; // Q14
-      } else {
-        tmpIndFX = 8192 - tmp16no2; // Q14
-      }
-    }
-    indPriorFX += inst->weightSpecFlat * tmpIndFX;  // 6*Q14
-  }
-
-  //for template spectral-difference
-  if (inst->weightSpecDiff) {
-    tmpU32no1 = 0;
-    if (inst->featureSpecDiff) {
-      normTmp = WEBRTC_SPL_MIN(20 - inst->stages,
-                               WebRtcSpl_NormU32(inst->featureSpecDiff));
-      RTC_DCHECK_GE(normTmp, 0);
-      tmpU32no1 = inst->featureSpecDiff << normTmp;  // Q(normTmp-2*stages)
-      tmpU32no2 = inst->timeAvgMagnEnergy >> (20 - inst->stages - normTmp);
-      if (tmpU32no2 > 0) {
-        // Q(20 - inst->stages)
-        tmpU32no1 /= tmpU32no2;
-      } else {
-        tmpU32no1 = (uint32_t)(0x7fffffff);
-      }
-    }
-    tmpU32no3 = (inst->thresholdSpecDiff << 17) / 25;
-    tmpU32no2 = tmpU32no1 - tmpU32no3;
-    nShifts = 1;
-    tmpIndFX = 16384; // Q14(1.0)
-    //use larger width in tanh map for pause regions
-    if (tmpU32no2 & 0x80000000) {
-      tmpIndFX = 0;
-      tmpU32no2 = tmpU32no3 - tmpU32no1;
-      //widthPrior = widthPrior * 2.0;
-      nShifts--;
-    }
-    tmpU32no1 = tmpU32no2 >> nShifts;
-    // compute indicator function: sigmoid map
-    /* FLOAT code
-     indicator2 = 0.5 * (tanh(widthPrior * (tmpFloat1 - threshPrior2)) + 1.0);
-     */
-    if (tmpU32no1 < (16 << 14)) {
-      tableIndex = (int16_t)(tmpU32no1 >> 14);
-      tmp16no2 = kIndicatorTable[tableIndex];
-      tmp16no1 = kIndicatorTable[tableIndex + 1] - kIndicatorTable[tableIndex];
-      frac = (int16_t)(tmpU32no1 & 0x00003fff); // Q14
-      tmp16no2 += (int16_t)WEBRTC_SPL_MUL_16_16_RSFT_WITH_ROUND(
-                    tmp16no1, frac, 14);
-      if (tmpIndFX) {
-        tmpIndFX = 8192 + tmp16no2;
-      } else {
-        tmpIndFX = 8192 - tmp16no2;
-      }
-    }
-    indPriorFX += inst->weightSpecDiff * tmpIndFX;  // 6*Q14
-  }
-
-  //combine the indicator function with the feature weights
-  // FLOAT code
-  // indPrior = 1 - (weightIndPrior0 * indicator0 + weightIndPrior1 *
-  //                 indicator1 + weightIndPrior2 * indicator2);
-  indPriorFX16 = WebRtcSpl_DivW32W16ResW16(98307 - indPriorFX, 6); // Q14
-  // done with computing indicator function
-
-  //compute the prior probability
-  // FLOAT code
-  // inst->priorNonSpeechProb += PRIOR_UPDATE *
-  //                             (indPriorNonSpeech - inst->priorNonSpeechProb);
-  tmp16 = indPriorFX16 - inst->priorNonSpeechProb; // Q14
-  inst->priorNonSpeechProb += (int16_t)((PRIOR_UPDATE_Q14 * tmp16) >> 14);
-
-  //final speech probability: combine prior model with LR factor:
-
-  memset(nonSpeechProbFinal, 0, sizeof(uint16_t) * inst->magnLen);
-
-  if (inst->priorNonSpeechProb > 0) {
-    for (i = 0; i < inst->magnLen; i++) {
-      // FLOAT code
-      // invLrt = exp(inst->logLrtTimeAvg[i]);
-      // invLrt = inst->priorSpeechProb * invLrt;
-      // nonSpeechProbFinal[i] = (1.0 - inst->priorSpeechProb) /
-      //                         (1.0 - inst->priorSpeechProb + invLrt);
-      // invLrt = (1.0 - inst->priorNonSpeechProb) * invLrt;
-      // nonSpeechProbFinal[i] = inst->priorNonSpeechProb /
-      //                         (inst->priorNonSpeechProb + invLrt);
-      if (inst->logLrtTimeAvgW32[i] < 65300) {
-        tmp32no1 = (inst->logLrtTimeAvgW32[i] * 23637) >> 14;  // Q12
-        intPart = (int16_t)(tmp32no1 >> 12);
-        if (intPart < -8) {
-          intPart = -8;
-        }
-        frac = (int16_t)(tmp32no1 & 0x00000fff); // Q12
-
-        // Quadratic approximation of 2^frac
-        tmp32no2 = (frac * frac * 44) >> 19;  // Q12.
-        tmp32no2 += (frac * 84) >> 7;  // Q12
-        invLrtFX = (1 << (8 + intPart)) +
-            WEBRTC_SPL_SHIFT_W32(tmp32no2, intPart - 4); // Q8
-
-        normTmp = WebRtcSpl_NormW32(invLrtFX);
-        normTmp2 = WebRtcSpl_NormW16((16384 - inst->priorNonSpeechProb));
-        if (normTmp + normTmp2 >= 7) {
-          if (normTmp + normTmp2 < 15) {
-            invLrtFX >>= 15 - normTmp2 - normTmp;
-            // Q(normTmp+normTmp2-7)
-            tmp32no1 = invLrtFX * (16384 - inst->priorNonSpeechProb);
-            // Q(normTmp+normTmp2+7)
-            invLrtFX = WEBRTC_SPL_SHIFT_W32(tmp32no1, 7 - normTmp - normTmp2);
-                                                                  // Q14
-          } else {
-            tmp32no1 = invLrtFX * (16384 - inst->priorNonSpeechProb);
-                                                                  // Q22
-            invLrtFX = tmp32no1 >> 8;  // Q14.
-          }
-
-          tmp32no1 = (int32_t)inst->priorNonSpeechProb << 8;  // Q22
-
-          nonSpeechProbFinal[i] = tmp32no1 /
-              (inst->priorNonSpeechProb + invLrtFX);  // Q8
-        }
-      }
-    }
-  }
-}
-
diff --git a/modules/audio_processing/ns/nsx_core_mips.c b/modules/audio_processing/ns/nsx_core_mips.c
deleted file mode 100644
index 308effc..0000000
--- a/modules/audio_processing/ns/nsx_core_mips.c
+++ /dev/null
@@ -1,1002 +0,0 @@
-/*
- *  Copyright (c) 2013 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 <string.h>
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/modules/audio_processing/ns/noise_suppression_x.h"
-#include "webrtc/modules/audio_processing/ns/nsx_core.h"
-
-static const int16_t kIndicatorTable[17] = {
-  0, 2017, 3809, 5227, 6258, 6963, 7424, 7718,
-  7901, 8014, 8084, 8126, 8152, 8168, 8177, 8183, 8187
-};
-
-// Compute speech/noise probability
-// speech/noise probability is returned in: probSpeechFinal
-//snrLocPrior is the prior SNR for each frequency (in Q11)
-//snrLocPost is the post SNR for each frequency (in Q11)
-void WebRtcNsx_SpeechNoiseProb(NoiseSuppressionFixedC* inst,
-                               uint16_t* nonSpeechProbFinal,
-                               uint32_t* priorLocSnr,
-                               uint32_t* postLocSnr) {
-  uint32_t tmpU32no1, tmpU32no2, tmpU32no3;
-  int32_t indPriorFX, tmp32no1;
-  int32_t logLrtTimeAvgKsumFX;
-  int16_t indPriorFX16;
-  int16_t tmp16, tmp16no1, tmp16no2, tmpIndFX, tableIndex, frac;
-  size_t i;
-  int normTmp, nShifts;
-
-  int32_t r0, r1, r2, r3, r4, r5, r6, r7, r8, r9;
-  int32_t const_max = 0x7fffffff;
-  int32_t const_neg43 = -43;
-  int32_t const_5412 = 5412;
-  int32_t const_11rsh12 = (11 << 12);
-  int32_t const_178 = 178;
-
-
-  // compute feature based on average LR factor
-  // this is the average over all frequencies of the smooth log LRT
-  logLrtTimeAvgKsumFX = 0;
-  for (i = 0; i < inst->magnLen; i++) {
-    r0 = postLocSnr[i]; // Q11
-    r1 = priorLocSnr[i];
-    r2 = inst->logLrtTimeAvgW32[i];
-
-    __asm __volatile(
-      ".set       push                                    \n\t"
-      ".set       noreorder                               \n\t"
-      "clz        %[r3],    %[r0]                         \n\t"
-      "clz        %[r5],    %[r1]                         \n\t"
-      "slti       %[r4],    %[r3],    32                  \n\t"
-      "slti       %[r6],    %[r5],    32                  \n\t"
-      "movz       %[r3],    $0,       %[r4]               \n\t"
-      "movz       %[r5],    $0,       %[r6]               \n\t"
-      "slti       %[r4],    %[r3],    11                  \n\t"
-      "addiu      %[r6],    %[r3],    -11                 \n\t"
-      "neg        %[r7],    %[r6]                         \n\t"
-      "sllv       %[r6],    %[r1],    %[r6]               \n\t"
-      "srav       %[r7],    %[r1],    %[r7]               \n\t"
-      "movn       %[r6],    %[r7],    %[r4]               \n\t"
-      "sllv       %[r1],    %[r1],    %[r5]               \n\t"
-      "and        %[r1],    %[r1],    %[const_max]        \n\t"
-      "sra        %[r1],    %[r1],    19                  \n\t"
-      "mul        %[r7],    %[r1],    %[r1]               \n\t"
-      "sllv       %[r3],    %[r0],    %[r3]               \n\t"
-      "divu       %[r8],    %[r3],    %[r6]               \n\t"
-      "slti       %[r6],    %[r6],    1                   \n\t"
-      "mul        %[r7],    %[r7],    %[const_neg43]      \n\t"
-      "sra        %[r7],    %[r7],    19                  \n\t"
-      "movz       %[r3],    %[r8],    %[r6]               \n\t"
-      "subu       %[r0],    %[r0],    %[r3]               \n\t"
-      "movn       %[r0],    $0,       %[r6]               \n\t"
-      "mul        %[r1],    %[r1],    %[const_5412]       \n\t"
-      "sra        %[r1],    %[r1],    12                  \n\t"
-      "addu       %[r7],    %[r7],    %[r1]               \n\t"
-      "addiu      %[r1],    %[r7],    37                  \n\t"
-      "addiu      %[r5],    %[r5],    -31                 \n\t"
-      "neg        %[r5],    %[r5]                         \n\t"
-      "sll        %[r5],    %[r5],    12                  \n\t"
-      "addu       %[r5],    %[r5],    %[r1]               \n\t"
-      "subu       %[r7],    %[r5],    %[const_11rsh12]    \n\t"
-      "mul        %[r7],    %[r7],    %[const_178]        \n\t"
-      "sra        %[r7],    %[r7],    8                   \n\t"
-      "addu       %[r7],    %[r7],    %[r2]               \n\t"
-      "sra        %[r7],    %[r7],    1                   \n\t"
-      "subu       %[r2],    %[r2],    %[r7]               \n\t"
-      "addu       %[r2],    %[r2],    %[r0]               \n\t"
-      ".set       pop                                     \n\t"
-      : [r0] "+r" (r0), [r1] "+r" (r1), [r2] "+r" (r2),
-        [r3] "=&r" (r3), [r4] "=&r" (r4), [r5] "=&r" (r5),
-        [r6] "=&r" (r6), [r7] "=&r" (r7), [r8] "=&r" (r8)
-      : [const_max] "r" (const_max), [const_neg43] "r" (const_neg43),
-        [const_5412] "r" (const_5412), [const_11rsh12] "r" (const_11rsh12),
-        [const_178] "r" (const_178)
-      : "hi", "lo"
-    );
-    inst->logLrtTimeAvgW32[i] = r2;
-    logLrtTimeAvgKsumFX += r2;
-  }
-
-  inst->featureLogLrt = (logLrtTimeAvgKsumFX * BIN_SIZE_LRT) >>
-      (inst->stages + 11);
-
-  // done with computation of LR factor
-
-  //
-  // compute the indicator functions
-  //
-
-  // average LRT feature
-  // FLOAT code
-  // indicator0 = 0.5 * (tanh(widthPrior *
-  //                      (logLrtTimeAvgKsum - threshPrior0)) + 1.0);
-  tmpIndFX = 16384; // Q14(1.0)
-  tmp32no1 = logLrtTimeAvgKsumFX - inst->thresholdLogLrt; // Q12
-  nShifts = 7 - inst->stages; // WIDTH_PR_MAP_SHIFT - inst->stages + 5;
-  //use larger width in tanh map for pause regions
-  if (tmp32no1 < 0) {
-    tmpIndFX = 0;
-    tmp32no1 = -tmp32no1;
-    //widthPrior = widthPrior * 2.0;
-    nShifts++;
-  }
-  tmp32no1 = WEBRTC_SPL_SHIFT_W32(tmp32no1, nShifts); // Q14
-  // compute indicator function: sigmoid map
-  if (tmp32no1 < (16 << 14) && tmp32no1 >= 0) {
-    tableIndex = (int16_t)(tmp32no1 >> 14);
-    tmp16no2 = kIndicatorTable[tableIndex];
-    tmp16no1 = kIndicatorTable[tableIndex + 1] - kIndicatorTable[tableIndex];
-    frac = (int16_t)(tmp32no1 & 0x00003fff); // Q14
-    tmp16no2 += (int16_t)((tmp16no1 * frac) >> 14);
-    if (tmpIndFX == 0) {
-      tmpIndFX = 8192 - tmp16no2; // Q14
-    } else {
-      tmpIndFX = 8192 + tmp16no2; // Q14
-    }
-  }
-  indPriorFX = inst->weightLogLrt * tmpIndFX;  // 6*Q14
-
-  //spectral flatness feature
-  if (inst->weightSpecFlat) {
-    tmpU32no1 = WEBRTC_SPL_UMUL(inst->featureSpecFlat, 400); // Q10
-    tmpIndFX = 16384; // Q14(1.0)
-    //use larger width in tanh map for pause regions
-    tmpU32no2 = inst->thresholdSpecFlat - tmpU32no1; //Q10
-    nShifts = 4;
-    if (inst->thresholdSpecFlat < tmpU32no1) {
-      tmpIndFX = 0;
-      tmpU32no2 = tmpU32no1 - inst->thresholdSpecFlat;
-      //widthPrior = widthPrior * 2.0;
-      nShifts++;
-    }
-    tmpU32no1 = WebRtcSpl_DivU32U16(tmpU32no2 << nShifts, 25);  //Q14
-    // compute indicator function: sigmoid map
-    // FLOAT code
-    // indicator1 = 0.5 * (tanh(sgnMap * widthPrior *
-    //                          (threshPrior1 - tmpFloat1)) + 1.0);
-    if (tmpU32no1 < (16 << 14)) {
-      tableIndex = (int16_t)(tmpU32no1 >> 14);
-      tmp16no2 = kIndicatorTable[tableIndex];
-      tmp16no1 = kIndicatorTable[tableIndex + 1] - kIndicatorTable[tableIndex];
-      frac = (int16_t)(tmpU32no1 & 0x00003fff); // Q14
-      tmp16no2 += (int16_t)((tmp16no1 * frac) >> 14);
-      if (tmpIndFX) {
-        tmpIndFX = 8192 + tmp16no2; // Q14
-      } else {
-        tmpIndFX = 8192 - tmp16no2; // Q14
-      }
-    }
-    indPriorFX += inst->weightSpecFlat * tmpIndFX;  // 6*Q14
-  }
-
-  //for template spectral-difference
-  if (inst->weightSpecDiff) {
-    tmpU32no1 = 0;
-    if (inst->featureSpecDiff) {
-      normTmp = WEBRTC_SPL_MIN(20 - inst->stages,
-                               WebRtcSpl_NormU32(inst->featureSpecDiff));
-      RTC_DCHECK_GE(normTmp, 0);
-      tmpU32no1 = inst->featureSpecDiff << normTmp;  // Q(normTmp-2*stages)
-      tmpU32no2 = inst->timeAvgMagnEnergy >> (20 - inst->stages - normTmp);
-      if (tmpU32no2 > 0) {
-        // Q(20 - inst->stages)
-        tmpU32no1 /= tmpU32no2;
-      } else {
-        tmpU32no1 = (uint32_t)(0x7fffffff);
-      }
-    }
-    tmpU32no3 = (inst->thresholdSpecDiff << 17) / 25;
-    tmpU32no2 = tmpU32no1 - tmpU32no3;
-    nShifts = 1;
-    tmpIndFX = 16384; // Q14(1.0)
-    //use larger width in tanh map for pause regions
-    if (tmpU32no2 & 0x80000000) {
-      tmpIndFX = 0;
-      tmpU32no2 = tmpU32no3 - tmpU32no1;
-      //widthPrior = widthPrior * 2.0;
-      nShifts--;
-    }
-    tmpU32no1 = tmpU32no2 >> nShifts;
-    // compute indicator function: sigmoid map
-    /* FLOAT code
-     indicator2 = 0.5 * (tanh(widthPrior * (tmpFloat1 - threshPrior2)) + 1.0);
-     */
-    if (tmpU32no1 < (16 << 14)) {
-      tableIndex = (int16_t)(tmpU32no1 >> 14);
-      tmp16no2 = kIndicatorTable[tableIndex];
-      tmp16no1 = kIndicatorTable[tableIndex + 1] - kIndicatorTable[tableIndex];
-      frac = (int16_t)(tmpU32no1 & 0x00003fff); // Q14
-      tmp16no2 += (int16_t)WEBRTC_SPL_MUL_16_16_RSFT_WITH_ROUND(
-                    tmp16no1, frac, 14);
-      if (tmpIndFX) {
-        tmpIndFX = 8192 + tmp16no2;
-      } else {
-        tmpIndFX = 8192 - tmp16no2;
-      }
-    }
-    indPriorFX += inst->weightSpecDiff * tmpIndFX;  // 6*Q14
-  }
-
-  //combine the indicator function with the feature weights
-  // FLOAT code
-  // indPrior = 1 - (weightIndPrior0 * indicator0 + weightIndPrior1 *
-  //                 indicator1 + weightIndPrior2 * indicator2);
-  indPriorFX16 = WebRtcSpl_DivW32W16ResW16(98307 - indPriorFX, 6); // Q14
-  // done with computing indicator function
-
-  //compute the prior probability
-  // FLOAT code
-  // inst->priorNonSpeechProb += PRIOR_UPDATE *
-  //                             (indPriorNonSpeech - inst->priorNonSpeechProb);
-  tmp16 = indPriorFX16 - inst->priorNonSpeechProb; // Q14
-  inst->priorNonSpeechProb += (int16_t)((PRIOR_UPDATE_Q14 * tmp16) >> 14);
-
-  //final speech probability: combine prior model with LR factor:
-
-  memset(nonSpeechProbFinal, 0, sizeof(uint16_t) * inst->magnLen);
-
-  if (inst->priorNonSpeechProb > 0) {
-    r0 = inst->priorNonSpeechProb;
-    r1 = 16384 - r0;
-    int32_t const_23637 = 23637;
-    int32_t const_44 = 44;
-    int32_t const_84 = 84;
-    int32_t const_1 = 1;
-    int32_t const_neg8 = -8;
-    for (i = 0; i < inst->magnLen; i++) {
-      r2 = inst->logLrtTimeAvgW32[i];
-      if (r2 < 65300) {
-        __asm __volatile(
-          ".set         push                                      \n\t"
-          ".set         noreorder                                 \n\t"
-          "mul          %[r2],    %[r2],          %[const_23637]  \n\t"
-          "sll          %[r6],    %[r1],          16              \n\t"
-          "clz          %[r7],    %[r6]                           \n\t"
-          "clo          %[r8],    %[r6]                           \n\t"
-          "slt          %[r9],    %[r6],          $0              \n\t"
-          "movn         %[r7],    %[r8],          %[r9]           \n\t"
-          "sra          %[r2],    %[r2],          14              \n\t"
-          "andi         %[r3],    %[r2],          0xfff           \n\t"
-          "mul          %[r4],    %[r3],          %[r3]           \n\t"
-          "mul          %[r3],    %[r3],          %[const_84]     \n\t"
-          "sra          %[r2],    %[r2],          12              \n\t"
-          "slt          %[r5],    %[r2],          %[const_neg8]   \n\t"
-          "movn         %[r2],    %[const_neg8],  %[r5]           \n\t"
-          "mul          %[r4],    %[r4],          %[const_44]     \n\t"
-          "sra          %[r3],    %[r3],          7               \n\t"
-          "addiu        %[r7],    %[r7],          -1              \n\t"
-          "slti         %[r9],    %[r7],          31              \n\t"
-          "movz         %[r7],    $0,             %[r9]           \n\t"
-          "sra          %[r4],    %[r4],          19              \n\t"
-          "addu         %[r4],    %[r4],          %[r3]           \n\t"
-          "addiu        %[r3],    %[r2],          8               \n\t"
-          "addiu        %[r2],    %[r2],          -4              \n\t"
-          "neg          %[r5],    %[r2]                           \n\t"
-          "sllv         %[r6],    %[r4],          %[r2]           \n\t"
-          "srav         %[r5],    %[r4],          %[r5]           \n\t"
-          "slt          %[r2],    %[r2],          $0              \n\t"
-          "movn         %[r6],    %[r5],          %[r2]           \n\t"
-          "sllv         %[r3],    %[const_1],     %[r3]           \n\t"
-          "addu         %[r2],    %[r3],          %[r6]           \n\t"
-          "clz          %[r4],    %[r2]                           \n\t"
-          "clo          %[r5],    %[r2]                           \n\t"
-          "slt          %[r8],    %[r2],          $0              \n\t"
-          "movn         %[r4],    %[r5],          %[r8]           \n\t"
-          "addiu        %[r4],    %[r4],          -1              \n\t"
-          "slt          %[r5],    $0,             %[r2]           \n\t"
-          "or           %[r5],    %[r5],          %[r7]           \n\t"
-          "movz         %[r4],    $0,             %[r5]           \n\t"
-          "addiu        %[r6],    %[r7],          -7              \n\t"
-          "addu         %[r6],    %[r6],          %[r4]           \n\t"
-          "bltz         %[r6],    1f                              \n\t"
-          " nop                                                   \n\t"
-          "addiu        %[r4],    %[r6],          -8              \n\t"
-          "neg          %[r3],    %[r4]                           \n\t"
-          "srav         %[r5],    %[r2],          %[r3]           \n\t"
-          "mul          %[r5],    %[r5],          %[r1]           \n\t"
-          "mul          %[r2],    %[r2],          %[r1]           \n\t"
-          "slt          %[r4],    %[r4],          $0              \n\t"
-          "srav         %[r5],    %[r5],          %[r6]           \n\t"
-          "sra          %[r2],    %[r2],          8               \n\t"
-          "movn         %[r2],    %[r5],          %[r4]           \n\t"
-          "sll          %[r3],    %[r0],          8               \n\t"
-          "addu         %[r2],    %[r0],          %[r2]           \n\t"
-          "divu         %[r3],    %[r3],          %[r2]           \n\t"
-         "1:                                                      \n\t"
-          ".set         pop                                       \n\t"
-          : [r2] "+r" (r2), [r3] "=&r" (r3), [r4] "=&r" (r4),
-            [r5] "=&r" (r5), [r6] "=&r" (r6), [r7] "=&r" (r7),
-            [r8] "=&r" (r8), [r9] "=&r" (r9)
-          : [r0] "r" (r0), [r1] "r" (r1), [const_23637] "r" (const_23637),
-            [const_neg8] "r" (const_neg8), [const_84] "r" (const_84),
-            [const_1] "r" (const_1), [const_44] "r" (const_44)
-          : "hi", "lo"
-        );
-        nonSpeechProbFinal[i] = r3;
-      }
-    }
-  }
-}
-
-// Update analysis buffer for lower band, and window data before FFT.
-void WebRtcNsx_AnalysisUpdate_mips(NoiseSuppressionFixedC* inst,
-                                   int16_t* out,
-                                   int16_t* new_speech) {
-  int iters, after;
-  int anaLen = (int)inst->anaLen;
-  int *window = (int*)inst->window;
-  int *anaBuf = (int*)inst->analysisBuffer;
-  int *outBuf = (int*)out;
-  int r0, r1, r2, r3, r4, r5, r6, r7;
-#if defined(MIPS_DSP_R1_LE)
-  int r8;
-#endif
-
-  // For lower band update analysis buffer.
-  memcpy(inst->analysisBuffer, inst->analysisBuffer + inst->blockLen10ms,
-      (inst->anaLen - inst->blockLen10ms) * sizeof(*inst->analysisBuffer));
-  memcpy(inst->analysisBuffer + inst->anaLen - inst->blockLen10ms, new_speech,
-      inst->blockLen10ms * sizeof(*inst->analysisBuffer));
-
-  // Window data before FFT.
-#if defined(MIPS_DSP_R1_LE)
-  __asm __volatile(
-    ".set              push                                \n\t"
-    ".set              noreorder                           \n\t"
-    "sra               %[iters],   %[anaLen],    3         \n\t"
-   "1:                                                     \n\t"
-    "blez              %[iters],   2f                      \n\t"
-    " nop                                                  \n\t"
-    "lw                %[r0],      0(%[window])            \n\t"
-    "lw                %[r1],      0(%[anaBuf])            \n\t"
-    "lw                %[r2],      4(%[window])            \n\t"
-    "lw                %[r3],      4(%[anaBuf])            \n\t"
-    "lw                %[r4],      8(%[window])            \n\t"
-    "lw                %[r5],      8(%[anaBuf])            \n\t"
-    "lw                %[r6],      12(%[window])           \n\t"
-    "lw                %[r7],      12(%[anaBuf])           \n\t"
-    "muleq_s.w.phl     %[r8],      %[r0],        %[r1]     \n\t"
-    "muleq_s.w.phr     %[r0],      %[r0],        %[r1]     \n\t"
-    "muleq_s.w.phl     %[r1],      %[r2],        %[r3]     \n\t"
-    "muleq_s.w.phr     %[r2],      %[r2],        %[r3]     \n\t"
-    "muleq_s.w.phl     %[r3],      %[r4],        %[r5]     \n\t"
-    "muleq_s.w.phr     %[r4],      %[r4],        %[r5]     \n\t"
-    "muleq_s.w.phl     %[r5],      %[r6],        %[r7]     \n\t"
-    "muleq_s.w.phr     %[r6],      %[r6],        %[r7]     \n\t"
-#if defined(MIPS_DSP_R2_LE)
-    "precr_sra_r.ph.w  %[r8],      %[r0],        15        \n\t"
-    "precr_sra_r.ph.w  %[r1],      %[r2],        15        \n\t"
-    "precr_sra_r.ph.w  %[r3],      %[r4],        15        \n\t"
-    "precr_sra_r.ph.w  %[r5],      %[r6],        15        \n\t"
-    "sw                %[r8],      0(%[outBuf])            \n\t"
-    "sw                %[r1],      4(%[outBuf])            \n\t"
-    "sw                %[r3],      8(%[outBuf])            \n\t"
-    "sw                %[r5],      12(%[outBuf])           \n\t"
-#else
-    "shra_r.w          %[r8],      %[r8],        15        \n\t"
-    "shra_r.w          %[r0],      %[r0],        15        \n\t"
-    "shra_r.w          %[r1],      %[r1],        15        \n\t"
-    "shra_r.w          %[r2],      %[r2],        15        \n\t"
-    "shra_r.w          %[r3],      %[r3],        15        \n\t"
-    "shra_r.w          %[r4],      %[r4],        15        \n\t"
-    "shra_r.w          %[r5],      %[r5],        15        \n\t"
-    "shra_r.w          %[r6],      %[r6],        15        \n\t"
-    "sll               %[r0],      %[r0],        16        \n\t"
-    "sll               %[r2],      %[r2],        16        \n\t"
-    "sll               %[r4],      %[r4],        16        \n\t"
-    "sll               %[r6],      %[r6],        16        \n\t"
-    "packrl.ph         %[r0],      %[r8],        %[r0]     \n\t"
-    "packrl.ph         %[r2],      %[r1],        %[r2]     \n\t"
-    "packrl.ph         %[r4],      %[r3],        %[r4]     \n\t"
-    "packrl.ph         %[r6],      %[r5],        %[r6]     \n\t"
-    "sw                %[r0],      0(%[outBuf])            \n\t"
-    "sw                %[r2],      4(%[outBuf])            \n\t"
-    "sw                %[r4],      8(%[outBuf])            \n\t"
-    "sw                %[r6],      12(%[outBuf])           \n\t"
-#endif
-    "addiu             %[window],  %[window],    16        \n\t"
-    "addiu             %[anaBuf],  %[anaBuf],    16        \n\t"
-    "addiu             %[outBuf],  %[outBuf],    16        \n\t"
-    "b                 1b                                  \n\t"
-    " addiu            %[iters],   %[iters],     -1        \n\t"
-   "2:                                                     \n\t"
-    "andi              %[after],   %[anaLen],    7         \n\t"
-   "3:                                                     \n\t"
-    "blez              %[after],   4f                      \n\t"
-    " nop                                                  \n\t"
-    "lh                %[r0],      0(%[window])            \n\t"
-    "lh                %[r1],      0(%[anaBuf])            \n\t"
-    "mul               %[r0],      %[r0],        %[r1]     \n\t"
-    "addiu             %[window],  %[window],    2         \n\t"
-    "addiu             %[anaBuf],  %[anaBuf],    2         \n\t"
-    "addiu             %[outBuf],  %[outBuf],    2         \n\t"
-    "shra_r.w          %[r0],      %[r0],        14        \n\t"
-    "sh                %[r0],      -2(%[outBuf])           \n\t"
-    "b                 3b                                  \n\t"
-    " addiu            %[after],   %[after],     -1        \n\t"
-   "4:                                                     \n\t"
-    ".set              pop                                 \n\t"
-    : [r0] "=&r" (r0), [r1] "=&r" (r1), [r2] "=&r" (r2),
-      [r3] "=&r" (r3), [r4] "=&r" (r4), [r5] "=&r" (r5),
-      [r6] "=&r" (r6), [r7] "=&r" (r7), [r8] "=&r" (r8),
-      [iters] "=&r" (iters), [after] "=&r" (after),
-      [window] "+r" (window),[anaBuf] "+r" (anaBuf),
-      [outBuf] "+r" (outBuf)
-    : [anaLen] "r" (anaLen)
-    : "memory", "hi", "lo"
-  );
-#else
-  __asm  __volatile(
-    ".set           push                                    \n\t"
-    ".set           noreorder                               \n\t"
-    "sra            %[iters],   %[anaLen],      2           \n\t"
-   "1:                                                      \n\t"
-    "blez           %[iters],   2f                          \n\t"
-    " nop                                                   \n\t"
-    "lh             %[r0],      0(%[window])                \n\t"
-    "lh             %[r1],      0(%[anaBuf])                \n\t"
-    "lh             %[r2],      2(%[window])                \n\t"
-    "lh             %[r3],      2(%[anaBuf])                \n\t"
-    "lh             %[r4],      4(%[window])                \n\t"
-    "lh             %[r5],      4(%[anaBuf])                \n\t"
-    "lh             %[r6],      6(%[window])                \n\t"
-    "lh             %[r7],      6(%[anaBuf])                \n\t"
-    "mul            %[r0],      %[r0],          %[r1]       \n\t"
-    "mul            %[r2],      %[r2],          %[r3]       \n\t"
-    "mul            %[r4],      %[r4],          %[r5]       \n\t"
-    "mul            %[r6],      %[r6],          %[r7]       \n\t"
-    "addiu          %[window],  %[window],      8           \n\t"
-    "addiu          %[anaBuf],  %[anaBuf],      8           \n\t"
-    "addiu          %[r0],      %[r0],          0x2000      \n\t"
-    "addiu          %[r2],      %[r2],          0x2000      \n\t"
-    "addiu          %[r4],      %[r4],          0x2000      \n\t"
-    "addiu          %[r6],      %[r6],          0x2000      \n\t"
-    "sra            %[r0],      %[r0],          14          \n\t"
-    "sra            %[r2],      %[r2],          14          \n\t"
-    "sra            %[r4],      %[r4],          14          \n\t"
-    "sra            %[r6],      %[r6],          14          \n\t"
-    "sh             %[r0],      0(%[outBuf])                \n\t"
-    "sh             %[r2],      2(%[outBuf])                \n\t"
-    "sh             %[r4],      4(%[outBuf])                \n\t"
-    "sh             %[r6],      6(%[outBuf])                \n\t"
-    "addiu          %[outBuf],  %[outBuf],      8           \n\t"
-    "b              1b                                      \n\t"
-    " addiu         %[iters],   %[iters],       -1          \n\t"
-   "2:                                                      \n\t"
-    "andi           %[after],   %[anaLen],      3           \n\t"
-   "3:                                                      \n\t"
-    "blez           %[after],   4f                          \n\t"
-    " nop                                                   \n\t"
-    "lh             %[r0],      0(%[window])                \n\t"
-    "lh             %[r1],      0(%[anaBuf])                \n\t"
-    "mul            %[r0],      %[r0],          %[r1]       \n\t"
-    "addiu          %[window],  %[window],      2           \n\t"
-    "addiu          %[anaBuf],  %[anaBuf],      2           \n\t"
-    "addiu          %[outBuf],  %[outBuf],      2           \n\t"
-    "addiu          %[r0],      %[r0],          0x2000      \n\t"
-    "sra            %[r0],      %[r0],          14          \n\t"
-    "sh             %[r0],      -2(%[outBuf])               \n\t"
-    "b              3b                                      \n\t"
-    " addiu         %[after],   %[after],       -1          \n\t"
-   "4:                                                      \n\t"
-    ".set           pop                                     \n\t"
-    : [r0] "=&r" (r0), [r1] "=&r" (r1), [r2] "=&r" (r2),
-      [r3] "=&r" (r3), [r4] "=&r" (r4), [r5] "=&r" (r5),
-      [r6] "=&r" (r6), [r7] "=&r" (r7), [iters] "=&r" (iters),
-      [after] "=&r" (after), [window] "+r" (window),
-      [anaBuf] "+r" (anaBuf), [outBuf] "+r" (outBuf)
-    : [anaLen] "r" (anaLen)
-    : "memory", "hi", "lo"
-  );
-#endif
-}
-
-// For the noise supression process, synthesis, read out fully processed
-// segment, and update synthesis buffer.
-void WebRtcNsx_SynthesisUpdate_mips(NoiseSuppressionFixedC* inst,
-                                    int16_t* out_frame,
-                                    int16_t gain_factor) {
-  int iters = (int)inst->blockLen10ms >> 2;
-  int after = inst->blockLen10ms & 3;
-  int r0, r1, r2, r3, r4, r5, r6, r7;
-  int16_t *window = (int16_t*)inst->window;
-  int16_t *real = inst->real;
-  int16_t *synthBuf = inst->synthesisBuffer;
-  int16_t *out = out_frame;
-  int sat_pos = 0x7fff;
-  int sat_neg = 0xffff8000;
-  int block10 = (int)inst->blockLen10ms;
-  int anaLen = (int)inst->anaLen;
-
-  __asm __volatile(
-    ".set       push                                        \n\t"
-    ".set       noreorder                                   \n\t"
-   "1:                                                      \n\t"
-    "blez       %[iters],   2f                              \n\t"
-    " nop                                                   \n\t"
-    "lh         %[r0],      0(%[window])                    \n\t"
-    "lh         %[r1],      0(%[real])                      \n\t"
-    "lh         %[r2],      2(%[window])                    \n\t"
-    "lh         %[r3],      2(%[real])                      \n\t"
-    "lh         %[r4],      4(%[window])                    \n\t"
-    "lh         %[r5],      4(%[real])                      \n\t"
-    "lh         %[r6],      6(%[window])                    \n\t"
-    "lh         %[r7],      6(%[real])                      \n\t"
-    "mul        %[r0],      %[r0],          %[r1]           \n\t"
-    "mul        %[r2],      %[r2],          %[r3]           \n\t"
-    "mul        %[r4],      %[r4],          %[r5]           \n\t"
-    "mul        %[r6],      %[r6],          %[r7]           \n\t"
-    "addiu      %[r0],      %[r0],          0x2000          \n\t"
-    "addiu      %[r2],      %[r2],          0x2000          \n\t"
-    "addiu      %[r4],      %[r4],          0x2000          \n\t"
-    "addiu      %[r6],      %[r6],          0x2000          \n\t"
-    "sra        %[r0],      %[r0],          14              \n\t"
-    "sra        %[r2],      %[r2],          14              \n\t"
-    "sra        %[r4],      %[r4],          14              \n\t"
-    "sra        %[r6],      %[r6],          14              \n\t"
-    "mul        %[r0],      %[r0],          %[gain_factor]  \n\t"
-    "mul        %[r2],      %[r2],          %[gain_factor]  \n\t"
-    "mul        %[r4],      %[r4],          %[gain_factor]  \n\t"
-    "mul        %[r6],      %[r6],          %[gain_factor]  \n\t"
-    "addiu      %[r0],      %[r0],          0x1000          \n\t"
-    "addiu      %[r2],      %[r2],          0x1000          \n\t"
-    "addiu      %[r4],      %[r4],          0x1000          \n\t"
-    "addiu      %[r6],      %[r6],          0x1000          \n\t"
-    "sra        %[r0],      %[r0],          13              \n\t"
-    "sra        %[r2],      %[r2],          13              \n\t"
-    "sra        %[r4],      %[r4],          13              \n\t"
-    "sra        %[r6],      %[r6],          13              \n\t"
-    "slt        %[r1],      %[r0],          %[sat_pos]      \n\t"
-    "slt        %[r3],      %[r2],          %[sat_pos]      \n\t"
-    "slt        %[r5],      %[r4],          %[sat_pos]      \n\t"
-    "slt        %[r7],      %[r6],          %[sat_pos]      \n\t"
-    "movz       %[r0],      %[sat_pos],     %[r1]           \n\t"
-    "movz       %[r2],      %[sat_pos],     %[r3]           \n\t"
-    "movz       %[r4],      %[sat_pos],     %[r5]           \n\t"
-    "movz       %[r6],      %[sat_pos],     %[r7]           \n\t"
-    "lh         %[r1],      0(%[synthBuf])                  \n\t"
-    "lh         %[r3],      2(%[synthBuf])                  \n\t"
-    "lh         %[r5],      4(%[synthBuf])                  \n\t"
-    "lh         %[r7],      6(%[synthBuf])                  \n\t"
-    "addu       %[r0],      %[r0],          %[r1]           \n\t"
-    "addu       %[r2],      %[r2],          %[r3]           \n\t"
-    "addu       %[r4],      %[r4],          %[r5]           \n\t"
-    "addu       %[r6],      %[r6],          %[r7]           \n\t"
-    "slt        %[r1],      %[r0],          %[sat_pos]      \n\t"
-    "slt        %[r3],      %[r2],          %[sat_pos]      \n\t"
-    "slt        %[r5],      %[r4],          %[sat_pos]      \n\t"
-    "slt        %[r7],      %[r6],          %[sat_pos]      \n\t"
-    "movz       %[r0],      %[sat_pos],     %[r1]           \n\t"
-    "movz       %[r2],      %[sat_pos],     %[r3]           \n\t"
-    "movz       %[r4],      %[sat_pos],     %[r5]           \n\t"
-    "movz       %[r6],      %[sat_pos],     %[r7]           \n\t"
-    "slt        %[r1],      %[r0],          %[sat_neg]      \n\t"
-    "slt        %[r3],      %[r2],          %[sat_neg]      \n\t"
-    "slt        %[r5],      %[r4],          %[sat_neg]      \n\t"
-    "slt        %[r7],      %[r6],          %[sat_neg]      \n\t"
-    "movn       %[r0],      %[sat_neg],     %[r1]           \n\t"
-    "movn       %[r2],      %[sat_neg],     %[r3]           \n\t"
-    "movn       %[r4],      %[sat_neg],     %[r5]           \n\t"
-    "movn       %[r6],      %[sat_neg],     %[r7]           \n\t"
-    "sh         %[r0],      0(%[synthBuf])                  \n\t"
-    "sh         %[r2],      2(%[synthBuf])                  \n\t"
-    "sh         %[r4],      4(%[synthBuf])                  \n\t"
-    "sh         %[r6],      6(%[synthBuf])                  \n\t"
-    "sh         %[r0],      0(%[out])                       \n\t"
-    "sh         %[r2],      2(%[out])                       \n\t"
-    "sh         %[r4],      4(%[out])                       \n\t"
-    "sh         %[r6],      6(%[out])                       \n\t"
-    "addiu      %[window],  %[window],      8               \n\t"
-    "addiu      %[real],    %[real],        8               \n\t"
-    "addiu      %[synthBuf],%[synthBuf],    8               \n\t"
-    "addiu      %[out],     %[out],         8               \n\t"
-    "b          1b                                          \n\t"
-    " addiu     %[iters],   %[iters],       -1              \n\t"
-   "2:                                                      \n\t"
-    "blez       %[after],   3f                              \n\t"
-    " subu      %[block10], %[anaLen],      %[block10]      \n\t"
-    "lh         %[r0],      0(%[window])                    \n\t"
-    "lh         %[r1],      0(%[real])                      \n\t"
-    "mul        %[r0],      %[r0],          %[r1]           \n\t"
-    "addiu      %[window],  %[window],      2               \n\t"
-    "addiu      %[real],    %[real],        2               \n\t"
-    "addiu      %[r0],      %[r0],          0x2000          \n\t"
-    "sra        %[r0],      %[r0],          14              \n\t"
-    "mul        %[r0],      %[r0],          %[gain_factor]  \n\t"
-    "addiu      %[r0],      %[r0],          0x1000          \n\t"
-    "sra        %[r0],      %[r0],          13              \n\t"
-    "slt        %[r1],      %[r0],          %[sat_pos]      \n\t"
-    "movz       %[r0],      %[sat_pos],     %[r1]           \n\t"
-    "lh         %[r1],      0(%[synthBuf])                  \n\t"
-    "addu       %[r0],      %[r0],          %[r1]           \n\t"
-    "slt        %[r1],      %[r0],          %[sat_pos]      \n\t"
-    "movz       %[r0],      %[sat_pos],     %[r1]           \n\t"
-    "slt        %[r1],      %[r0],          %[sat_neg]      \n\t"
-    "movn       %[r0],      %[sat_neg],     %[r1]           \n\t"
-    "sh         %[r0],      0(%[synthBuf])                  \n\t"
-    "sh         %[r0],      0(%[out])                       \n\t"
-    "addiu      %[synthBuf],%[synthBuf],    2               \n\t"
-    "addiu      %[out],     %[out],         2               \n\t"
-    "b          2b                                          \n\t"
-    " addiu     %[after],   %[after],       -1              \n\t"
-   "3:                                                      \n\t"
-    "sra        %[iters],   %[block10],     2               \n\t"
-   "4:                                                      \n\t"
-    "blez       %[iters],   5f                              \n\t"
-    " andi      %[after],   %[block10],     3               \n\t"
-    "lh         %[r0],      0(%[window])                    \n\t"
-    "lh         %[r1],      0(%[real])                      \n\t"
-    "lh         %[r2],      2(%[window])                    \n\t"
-    "lh         %[r3],      2(%[real])                      \n\t"
-    "lh         %[r4],      4(%[window])                    \n\t"
-    "lh         %[r5],      4(%[real])                      \n\t"
-    "lh         %[r6],      6(%[window])                    \n\t"
-    "lh         %[r7],      6(%[real])                      \n\t"
-    "mul        %[r0],      %[r0],          %[r1]           \n\t"
-    "mul        %[r2],      %[r2],          %[r3]           \n\t"
-    "mul        %[r4],      %[r4],          %[r5]           \n\t"
-    "mul        %[r6],      %[r6],          %[r7]           \n\t"
-    "addiu      %[r0],      %[r0],          0x2000          \n\t"
-    "addiu      %[r2],      %[r2],          0x2000          \n\t"
-    "addiu      %[r4],      %[r4],          0x2000          \n\t"
-    "addiu      %[r6],      %[r6],          0x2000          \n\t"
-    "sra        %[r0],      %[r0],          14              \n\t"
-    "sra        %[r2],      %[r2],          14              \n\t"
-    "sra        %[r4],      %[r4],          14              \n\t"
-    "sra        %[r6],      %[r6],          14              \n\t"
-    "mul        %[r0],      %[r0],          %[gain_factor]  \n\t"
-    "mul        %[r2],      %[r2],          %[gain_factor]  \n\t"
-    "mul        %[r4],      %[r4],          %[gain_factor]  \n\t"
-    "mul        %[r6],      %[r6],          %[gain_factor]  \n\t"
-    "addiu      %[r0],      %[r0],          0x1000          \n\t"
-    "addiu      %[r2],      %[r2],          0x1000          \n\t"
-    "addiu      %[r4],      %[r4],          0x1000          \n\t"
-    "addiu      %[r6],      %[r6],          0x1000          \n\t"
-    "sra        %[r0],      %[r0],          13              \n\t"
-    "sra        %[r2],      %[r2],          13              \n\t"
-    "sra        %[r4],      %[r4],          13              \n\t"
-    "sra        %[r6],      %[r6],          13              \n\t"
-    "slt        %[r1],      %[r0],          %[sat_pos]      \n\t"
-    "slt        %[r3],      %[r2],          %[sat_pos]      \n\t"
-    "slt        %[r5],      %[r4],          %[sat_pos]      \n\t"
-    "slt        %[r7],      %[r6],          %[sat_pos]      \n\t"
-    "movz       %[r0],      %[sat_pos],     %[r1]           \n\t"
-    "movz       %[r2],      %[sat_pos],     %[r3]           \n\t"
-    "movz       %[r4],      %[sat_pos],     %[r5]           \n\t"
-    "movz       %[r6],      %[sat_pos],     %[r7]           \n\t"
-    "lh         %[r1],      0(%[synthBuf])                  \n\t"
-    "lh         %[r3],      2(%[synthBuf])                  \n\t"
-    "lh         %[r5],      4(%[synthBuf])                  \n\t"
-    "lh         %[r7],      6(%[synthBuf])                  \n\t"
-    "addu       %[r0],      %[r0],          %[r1]           \n\t"
-    "addu       %[r2],      %[r2],          %[r3]           \n\t"
-    "addu       %[r4],      %[r4],          %[r5]           \n\t"
-    "addu       %[r6],      %[r6],          %[r7]           \n\t"
-    "slt        %[r1],      %[r0],          %[sat_pos]      \n\t"
-    "slt        %[r3],      %[r2],          %[sat_pos]      \n\t"
-    "slt        %[r5],      %[r4],          %[sat_pos]      \n\t"
-    "slt        %[r7],      %[r6],          %[sat_pos]      \n\t"
-    "movz       %[r0],      %[sat_pos],     %[r1]           \n\t"
-    "movz       %[r2],      %[sat_pos],     %[r3]           \n\t"
-    "movz       %[r4],      %[sat_pos],     %[r5]           \n\t"
-    "movz       %[r6],      %[sat_pos],     %[r7]           \n\t"
-    "slt        %[r1],      %[r0],          %[sat_neg]      \n\t"
-    "slt        %[r3],      %[r2],          %[sat_neg]      \n\t"
-    "slt        %[r5],      %[r4],          %[sat_neg]      \n\t"
-    "slt        %[r7],      %[r6],          %[sat_neg]      \n\t"
-    "movn       %[r0],      %[sat_neg],     %[r1]           \n\t"
-    "movn       %[r2],      %[sat_neg],     %[r3]           \n\t"
-    "movn       %[r4],      %[sat_neg],     %[r5]           \n\t"
-    "movn       %[r6],      %[sat_neg],     %[r7]           \n\t"
-    "sh         %[r0],      0(%[synthBuf])                  \n\t"
-    "sh         %[r2],      2(%[synthBuf])                  \n\t"
-    "sh         %[r4],      4(%[synthBuf])                  \n\t"
-    "sh         %[r6],      6(%[synthBuf])                  \n\t"
-    "addiu      %[window],  %[window],      8               \n\t"
-    "addiu      %[real],    %[real],        8               \n\t"
-    "addiu      %[synthBuf],%[synthBuf],    8               \n\t"
-    "b          4b                                          \n\t"
-    " addiu     %[iters],   %[iters],       -1              \n\t"
-   "5:                                                      \n\t"
-    "blez       %[after],   6f                              \n\t"
-    " nop                                                   \n\t"
-    "lh         %[r0],      0(%[window])                    \n\t"
-    "lh         %[r1],      0(%[real])                      \n\t"
-    "mul        %[r0],      %[r0],          %[r1]           \n\t"
-    "addiu      %[window],  %[window],      2               \n\t"
-    "addiu      %[real],    %[real],        2               \n\t"
-    "addiu      %[r0],      %[r0],          0x2000          \n\t"
-    "sra        %[r0],      %[r0],          14              \n\t"
-    "mul        %[r0],      %[r0],          %[gain_factor]  \n\t"
-    "addiu      %[r0],      %[r0],          0x1000          \n\t"
-    "sra        %[r0],      %[r0],          13              \n\t"
-    "slt        %[r1],      %[r0],          %[sat_pos]      \n\t"
-    "movz       %[r0],      %[sat_pos],     %[r1]           \n\t"
-    "lh         %[r1],      0(%[synthBuf])                  \n\t"
-    "addu       %[r0],      %[r0],          %[r1]           \n\t"
-    "slt        %[r1],      %[r0],          %[sat_pos]      \n\t"
-    "movz       %[r0],      %[sat_pos],     %[r1]           \n\t"
-    "slt        %[r1],      %[r0],          %[sat_neg]      \n\t"
-    "movn       %[r0],      %[sat_neg],     %[r1]           \n\t"
-    "sh         %[r0],      0(%[synthBuf])                  \n\t"
-    "addiu      %[synthBuf],%[synthBuf],    2               \n\t"
-    "b          2b                                          \n\t"
-    " addiu     %[after],   %[after],       -1              \n\t"
-   "6:                                                      \n\t"
-    ".set       pop                                         \n\t"
-    : [r0] "=&r" (r0), [r1] "=&r" (r1), [r2] "=&r" (r2),
-      [r3] "=&r" (r3), [r4] "=&r" (r4), [r5] "=&r" (r5),
-      [r6] "=&r" (r6), [r7] "=&r" (r7), [iters] "+r" (iters),
-      [after] "+r" (after), [block10] "+r" (block10),
-      [window] "+r" (window), [real] "+r" (real),
-      [synthBuf] "+r" (synthBuf), [out] "+r" (out)
-    : [gain_factor] "r" (gain_factor), [sat_pos] "r" (sat_pos),
-      [sat_neg] "r" (sat_neg), [anaLen] "r" (anaLen)
-    : "memory", "hi", "lo"
-  );
-
-  // update synthesis buffer
-  memcpy(inst->synthesisBuffer, inst->synthesisBuffer + inst->blockLen10ms,
-      (inst->anaLen - inst->blockLen10ms) * sizeof(*inst->synthesisBuffer));
-  WebRtcSpl_ZerosArrayW16(inst->synthesisBuffer
-      + inst->anaLen - inst->blockLen10ms, inst->blockLen10ms);
-}
-
-// Filter the data in the frequency domain, and create spectrum.
-void WebRtcNsx_PrepareSpectrum_mips(NoiseSuppressionFixedC* inst,
-                                    int16_t* freq_buf) {
-  uint16_t *noiseSupFilter = inst->noiseSupFilter;
-  int16_t *real = inst->real;
-  int16_t *imag = inst->imag;
-  int32_t loop_count = 2;
-  int16_t tmp_1, tmp_2, tmp_3, tmp_4, tmp_5, tmp_6;
-  int16_t tmp16 = (int16_t)(inst->anaLen << 1) - 4;
-  int16_t* freq_buf_f = freq_buf;
-  int16_t* freq_buf_s = &freq_buf[tmp16];
-
-  __asm __volatile (
-    ".set       push                                                 \n\t"
-    ".set       noreorder                                            \n\t"
-    //first sample
-    "lh         %[tmp_1],           0(%[noiseSupFilter])             \n\t"
-    "lh         %[tmp_2],           0(%[real])                       \n\t"
-    "lh         %[tmp_3],           0(%[imag])                       \n\t"
-    "mul        %[tmp_2],           %[tmp_2],             %[tmp_1]   \n\t"
-    "mul        %[tmp_3],           %[tmp_3],             %[tmp_1]   \n\t"
-    "sra        %[tmp_2],           %[tmp_2],             14         \n\t"
-    "sra        %[tmp_3],           %[tmp_3],             14         \n\t"
-    "sh         %[tmp_2],           0(%[real])                       \n\t"
-    "sh         %[tmp_3],           0(%[imag])                       \n\t"
-    "negu       %[tmp_3],           %[tmp_3]                         \n\t"
-    "sh         %[tmp_2],           0(%[freq_buf_f])                 \n\t"
-    "sh         %[tmp_3],           2(%[freq_buf_f])                 \n\t"
-    "addiu      %[real],            %[real],              2          \n\t"
-    "addiu      %[imag],            %[imag],              2          \n\t"
-    "addiu      %[noiseSupFilter],  %[noiseSupFilter],    2          \n\t"
-    "addiu      %[freq_buf_f],      %[freq_buf_f],        4          \n\t"
-   "1:                                                               \n\t"
-    "lh         %[tmp_1],           0(%[noiseSupFilter])             \n\t"
-    "lh         %[tmp_2],           0(%[real])                       \n\t"
-    "lh         %[tmp_3],           0(%[imag])                       \n\t"
-    "lh         %[tmp_4],           2(%[noiseSupFilter])             \n\t"
-    "lh         %[tmp_5],           2(%[real])                       \n\t"
-    "lh         %[tmp_6],           2(%[imag])                       \n\t"
-    "mul        %[tmp_2],           %[tmp_2],             %[tmp_1]   \n\t"
-    "mul        %[tmp_3],           %[tmp_3],             %[tmp_1]   \n\t"
-    "mul        %[tmp_5],           %[tmp_5],             %[tmp_4]   \n\t"
-    "mul        %[tmp_6],           %[tmp_6],             %[tmp_4]   \n\t"
-    "addiu      %[loop_count],      %[loop_count],        2          \n\t"
-    "sra        %[tmp_2],           %[tmp_2],             14         \n\t"
-    "sra        %[tmp_3],           %[tmp_3],             14         \n\t"
-    "sra        %[tmp_5],           %[tmp_5],             14         \n\t"
-    "sra        %[tmp_6],           %[tmp_6],             14         \n\t"
-    "addiu      %[noiseSupFilter],  %[noiseSupFilter],    4          \n\t"
-    "sh         %[tmp_2],           0(%[real])                       \n\t"
-    "sh         %[tmp_2],           4(%[freq_buf_s])                 \n\t"
-    "sh         %[tmp_3],           0(%[imag])                       \n\t"
-    "sh         %[tmp_3],           6(%[freq_buf_s])                 \n\t"
-    "negu       %[tmp_3],           %[tmp_3]                         \n\t"
-    "sh         %[tmp_5],           2(%[real])                       \n\t"
-    "sh         %[tmp_5],           0(%[freq_buf_s])                 \n\t"
-    "sh         %[tmp_6],           2(%[imag])                       \n\t"
-    "sh         %[tmp_6],           2(%[freq_buf_s])                 \n\t"
-    "negu       %[tmp_6],           %[tmp_6]                         \n\t"
-    "addiu      %[freq_buf_s],      %[freq_buf_s],        -8         \n\t"
-    "addiu      %[real],            %[real],              4          \n\t"
-    "addiu      %[imag],            %[imag],              4          \n\t"
-    "sh         %[tmp_2],           0(%[freq_buf_f])                 \n\t"
-    "sh         %[tmp_3],           2(%[freq_buf_f])                 \n\t"
-    "sh         %[tmp_5],           4(%[freq_buf_f])                 \n\t"
-    "sh         %[tmp_6],           6(%[freq_buf_f])                 \n\t"
-    "blt        %[loop_count],      %[loop_size],         1b         \n\t"
-    " addiu     %[freq_buf_f],      %[freq_buf_f],        8          \n\t"
-    //last two samples:
-    "lh         %[tmp_1],           0(%[noiseSupFilter])             \n\t"
-    "lh         %[tmp_2],           0(%[real])                       \n\t"
-    "lh         %[tmp_3],           0(%[imag])                       \n\t"
-    "lh         %[tmp_4],           2(%[noiseSupFilter])             \n\t"
-    "lh         %[tmp_5],           2(%[real])                       \n\t"
-    "lh         %[tmp_6],           2(%[imag])                       \n\t"
-    "mul        %[tmp_2],           %[tmp_2],             %[tmp_1]   \n\t"
-    "mul        %[tmp_3],           %[tmp_3],             %[tmp_1]   \n\t"
-    "mul        %[tmp_5],           %[tmp_5],             %[tmp_4]   \n\t"
-    "mul        %[tmp_6],           %[tmp_6],             %[tmp_4]   \n\t"
-    "sra        %[tmp_2],           %[tmp_2],             14         \n\t"
-    "sra        %[tmp_3],           %[tmp_3],             14         \n\t"
-    "sra        %[tmp_5],           %[tmp_5],             14         \n\t"
-    "sra        %[tmp_6],           %[tmp_6],             14         \n\t"
-    "sh         %[tmp_2],           0(%[real])                       \n\t"
-    "sh         %[tmp_2],           4(%[freq_buf_s])                 \n\t"
-    "sh         %[tmp_3],           0(%[imag])                       \n\t"
-    "sh         %[tmp_3],           6(%[freq_buf_s])                 \n\t"
-    "negu       %[tmp_3],           %[tmp_3]                         \n\t"
-    "sh         %[tmp_2],           0(%[freq_buf_f])                 \n\t"
-    "sh         %[tmp_3],           2(%[freq_buf_f])                 \n\t"
-    "sh         %[tmp_5],           4(%[freq_buf_f])                 \n\t"
-    "sh         %[tmp_6],           6(%[freq_buf_f])                 \n\t"
-    "sh         %[tmp_5],           2(%[real])                       \n\t"
-    "sh         %[tmp_6],           2(%[imag])                       \n\t"
-    ".set       pop                                                  \n\t"
-    : [real] "+r" (real), [imag] "+r" (imag),
-      [freq_buf_f] "+r" (freq_buf_f), [freq_buf_s] "+r" (freq_buf_s),
-      [loop_count] "+r" (loop_count), [noiseSupFilter] "+r" (noiseSupFilter),
-      [tmp_1] "=&r" (tmp_1), [tmp_2] "=&r" (tmp_2), [tmp_3] "=&r" (tmp_3),
-      [tmp_4] "=&r" (tmp_4), [tmp_5] "=&r" (tmp_5), [tmp_6] "=&r" (tmp_6)
-    : [loop_size] "r" (inst->anaLen2)
-    : "memory", "hi", "lo"
-  );
-}
-
-#if defined(MIPS_DSP_R1_LE)
-// Denormalize the real-valued signal |in|, the output from inverse FFT.
-void WebRtcNsx_Denormalize_mips(NoiseSuppressionFixedC* inst,
-                                int16_t* in,
-                                int factor) {
-  int32_t r0, r1, r2, r3, t0;
-  int len = (int)inst->anaLen;
-  int16_t *out = &inst->real[0];
-  int shift = factor - inst->normData;
-
-  __asm __volatile (
-    ".set          push                                \n\t"
-    ".set          noreorder                           \n\t"
-    "beqz          %[len],     8f                      \n\t"
-    " nop                                              \n\t"
-    "bltz          %[shift],   4f                      \n\t"
-    " sra          %[t0],      %[len],      2          \n\t"
-    "beqz          %[t0],      2f                      \n\t"
-    " andi         %[len],     %[len],      3          \n\t"
-   "1:                                                 \n\t"
-    "lh            %[r0],      0(%[in])                \n\t"
-    "lh            %[r1],      2(%[in])                \n\t"
-    "lh            %[r2],      4(%[in])                \n\t"
-    "lh            %[r3],      6(%[in])                \n\t"
-    "shllv_s.ph    %[r0],      %[r0],       %[shift]   \n\t"
-    "shllv_s.ph    %[r1],      %[r1],       %[shift]   \n\t"
-    "shllv_s.ph    %[r2],      %[r2],       %[shift]   \n\t"
-    "shllv_s.ph    %[r3],      %[r3],       %[shift]   \n\t"
-    "addiu         %[in],      %[in],       8          \n\t"
-    "addiu         %[t0],      %[t0],       -1         \n\t"
-    "sh            %[r0],      0(%[out])               \n\t"
-    "sh            %[r1],      2(%[out])               \n\t"
-    "sh            %[r2],      4(%[out])               \n\t"
-    "sh            %[r3],      6(%[out])               \n\t"
-    "bgtz          %[t0],      1b                      \n\t"
-    " addiu        %[out],     %[out],      8          \n\t"
-   "2:                                                 \n\t"
-    "beqz          %[len],     8f                      \n\t"
-    " nop                                              \n\t"
-   "3:                                                 \n\t"
-    "lh            %[r0],      0(%[in])                \n\t"
-    "addiu         %[in],      %[in],       2          \n\t"
-    "addiu         %[len],     %[len],      -1         \n\t"
-    "shllv_s.ph    %[r0],      %[r0],       %[shift]   \n\t"
-    "addiu         %[out],     %[out],      2          \n\t"
-    "bgtz          %[len],     3b                      \n\t"
-    " sh           %[r0],      -2(%[out])              \n\t"
-    "b             8f                                  \n\t"
-   "4:                                                 \n\t"
-    "negu          %[shift],   %[shift]                \n\t"
-    "beqz          %[t0],      6f                      \n\t"
-    " andi         %[len],     %[len],      3          \n\t"
-   "5:                                                 \n\t"
-    "lh            %[r0],      0(%[in])                \n\t"
-    "lh            %[r1],      2(%[in])                \n\t"
-    "lh            %[r2],      4(%[in])                \n\t"
-    "lh            %[r3],      6(%[in])                \n\t"
-    "srav          %[r0],      %[r0],       %[shift]   \n\t"
-    "srav          %[r1],      %[r1],       %[shift]   \n\t"
-    "srav          %[r2],      %[r2],       %[shift]   \n\t"
-    "srav          %[r3],      %[r3],       %[shift]   \n\t"
-    "addiu         %[in],      %[in],       8          \n\t"
-    "addiu         %[t0],      %[t0],       -1         \n\t"
-    "sh            %[r0],      0(%[out])               \n\t"
-    "sh            %[r1],      2(%[out])               \n\t"
-    "sh            %[r2],      4(%[out])               \n\t"
-    "sh            %[r3],      6(%[out])               \n\t"
-    "bgtz          %[t0],      5b                      \n\t"
-    " addiu        %[out],     %[out],      8          \n\t"
-   "6:                                                 \n\t"
-    "beqz          %[len],     8f                      \n\t"
-    " nop                                              \n\t"
-   "7:                                                 \n\t"
-    "lh            %[r0],      0(%[in])                \n\t"
-    "addiu         %[in],      %[in],       2          \n\t"
-    "addiu         %[len],     %[len],      -1         \n\t"
-    "srav          %[r0],      %[r0],       %[shift]   \n\t"
-    "addiu         %[out],     %[out],      2          \n\t"
-    "bgtz          %[len],     7b                      \n\t"
-    " sh           %[r0],      -2(%[out])              \n\t"
-   "8:                                                 \n\t"
-    ".set          pop                                 \n\t"
-    : [t0] "=&r" (t0), [r0] "=&r" (r0), [r1] "=&r" (r1),
-      [r2] "=&r" (r2), [r3] "=&r" (r3)
-    : [len] "r" (len), [shift] "r" (shift), [in] "r" (in),
-      [out] "r" (out)
-    : "memory"
-  );
-}
-#endif
-
-// Normalize the real-valued signal |in|, the input to forward FFT.
-void WebRtcNsx_NormalizeRealBuffer_mips(NoiseSuppressionFixedC* inst,
-                                        const int16_t* in,
-                                        int16_t* out) {
-  int32_t r0, r1, r2, r3, t0;
-  int len = (int)inst->anaLen;
-  int shift = inst->normData;
-
-  __asm __volatile (
-    ".set          push                                \n\t"
-    ".set          noreorder                           \n\t"
-    "beqz          %[len],     4f                      \n\t"
-    " sra          %[t0],      %[len],      2          \n\t"
-    "beqz          %[t0],      2f                      \n\t"
-    " andi         %[len],     %[len],      3          \n\t"
-   "1:                                                 \n\t"
-    "lh            %[r0],      0(%[in])                \n\t"
-    "lh            %[r1],      2(%[in])                \n\t"
-    "lh            %[r2],      4(%[in])                \n\t"
-    "lh            %[r3],      6(%[in])                \n\t"
-    "sllv          %[r0],      %[r0],       %[shift]   \n\t"
-    "sllv          %[r1],      %[r1],       %[shift]   \n\t"
-    "sllv          %[r2],      %[r2],       %[shift]   \n\t"
-    "sllv          %[r3],      %[r3],       %[shift]   \n\t"
-    "addiu         %[in],      %[in],       8          \n\t"
-    "addiu         %[t0],      %[t0],       -1         \n\t"
-    "sh            %[r0],      0(%[out])               \n\t"
-    "sh            %[r1],      2(%[out])               \n\t"
-    "sh            %[r2],      4(%[out])               \n\t"
-    "sh            %[r3],      6(%[out])               \n\t"
-    "bgtz          %[t0],      1b                      \n\t"
-    " addiu        %[out],     %[out],      8          \n\t"
-   "2:                                                 \n\t"
-    "beqz          %[len],     4f                      \n\t"
-    " nop                                              \n\t"
-   "3:                                                 \n\t"
-    "lh            %[r0],      0(%[in])                \n\t"
-    "addiu         %[in],      %[in],       2          \n\t"
-    "addiu         %[len],     %[len],      -1         \n\t"
-    "sllv          %[r0],      %[r0],       %[shift]   \n\t"
-    "addiu         %[out],     %[out],      2          \n\t"
-    "bgtz          %[len],     3b                      \n\t"
-    " sh           %[r0],      -2(%[out])              \n\t"
-   "4:                                                 \n\t"
-    ".set          pop                                 \n\t"
-    : [t0] "=&r" (t0), [r0] "=&r" (r0), [r1] "=&r" (r1),
-      [r2] "=&r" (r2), [r3] "=&r" (r3)
-    : [len] "r" (len), [shift] "r" (shift), [in] "r" (in),
-      [out] "r" (out)
-    : "memory"
-  );
-}
-
diff --git a/modules/audio_processing/ns/nsx_core_neon.c b/modules/audio_processing/ns/nsx_core_neon.c
deleted file mode 100644
index 10c6b25..0000000
--- a/modules/audio_processing/ns/nsx_core_neon.c
+++ /dev/null
@@ -1,606 +0,0 @@
-/*
- *  Copyright (c) 2012 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_processing/ns/nsx_core.h"
-
-#include <arm_neon.h>
-
-#include "webrtc/rtc_base/checks.h"
-
-// Constants to compensate for shifting signal log(2^shifts).
-const int16_t WebRtcNsx_kLogTable[9] = {
-  0, 177, 355, 532, 710, 887, 1065, 1242, 1420
-};
-
-const int16_t WebRtcNsx_kCounterDiv[201] = {
-  32767, 16384, 10923, 8192, 6554, 5461, 4681, 4096, 3641, 3277, 2979, 2731,
-  2521, 2341, 2185, 2048, 1928, 1820, 1725, 1638, 1560, 1489, 1425, 1365, 1311,
-  1260, 1214, 1170, 1130, 1092, 1057, 1024, 993, 964, 936, 910, 886, 862, 840,
-  819, 799, 780, 762, 745, 728, 712, 697, 683, 669, 655, 643, 630, 618, 607,
-  596, 585, 575, 565, 555, 546, 537, 529, 520, 512, 504, 496, 489, 482, 475,
-  468, 462, 455, 449, 443, 437, 431, 426, 420, 415, 410, 405, 400, 395, 390,
-  386, 381, 377, 372, 368, 364, 360, 356, 352, 349, 345, 341, 338, 334, 331,
-  328, 324, 321, 318, 315, 312, 309, 306, 303, 301, 298, 295, 293, 290, 287,
-  285, 282, 280, 278, 275, 273, 271, 269, 266, 264, 262, 260, 258, 256, 254,
-  252, 250, 248, 246, 245, 243, 241, 239, 237, 236, 234, 232, 231, 229, 228,
-  226, 224, 223, 221, 220, 218, 217, 216, 214, 213, 211, 210, 209, 207, 206,
-  205, 204, 202, 201, 200, 199, 197, 196, 195, 194, 193, 192, 191, 189, 188,
-  187, 186, 185, 184, 183, 182, 181, 180, 179, 178, 177, 176, 175, 174, 173,
-  172, 172, 171, 170, 169, 168, 167, 166, 165, 165, 164, 163
-};
-
-const int16_t WebRtcNsx_kLogTableFrac[256] = {
-  0, 1, 3, 4, 6, 7, 9, 10, 11, 13, 14, 16, 17, 18, 20, 21,
-  22, 24, 25, 26, 28, 29, 30, 32, 33, 34, 36, 37, 38, 40, 41, 42,
-  44, 45, 46, 47, 49, 50, 51, 52, 54, 55, 56, 57, 59, 60, 61, 62,
-  63, 65, 66, 67, 68, 69, 71, 72, 73, 74, 75, 77, 78, 79, 80, 81,
-  82, 84, 85, 86, 87, 88, 89, 90, 92, 93, 94, 95, 96, 97, 98, 99,
-  100, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 116,
-  117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131,
-  132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146,
-  147, 148, 149, 150, 151, 152, 153, 154, 155, 155, 156, 157, 158, 159, 160,
-  161, 162, 163, 164, 165, 166, 167, 168, 169, 169, 170, 171, 172, 173, 174,
-  175, 176, 177, 178, 178, 179, 180, 181, 182, 183, 184, 185, 185, 186, 187,
-  188, 189, 190, 191, 192, 192, 193, 194, 195, 196, 197, 198, 198, 199, 200,
-  201, 202, 203, 203, 204, 205, 206, 207, 208, 208, 209, 210, 211, 212, 212,
-  213, 214, 215, 216, 216, 217, 218, 219, 220, 220, 221, 222, 223, 224, 224,
-  225, 226, 227, 228, 228, 229, 230, 231, 231, 232, 233, 234, 234, 235, 236,
-  237, 238, 238, 239, 240, 241, 241, 242, 243, 244, 244, 245, 246, 247, 247,
-  248, 249, 249, 250, 251, 252, 252, 253, 254, 255, 255
-};
-
-// Update the noise estimation information.
-static void UpdateNoiseEstimateNeon(NoiseSuppressionFixedC* inst, int offset) {
-  const int16_t kExp2Const = 11819; // Q13
-  int16_t* ptr_noiseEstLogQuantile = NULL;
-  int16_t* ptr_noiseEstQuantile = NULL;
-  int16x4_t kExp2Const16x4 = vdup_n_s16(kExp2Const);
-  int32x4_t twentyOne32x4 = vdupq_n_s32(21);
-  int32x4_t constA32x4 = vdupq_n_s32(0x1fffff);
-  int32x4_t constB32x4 = vdupq_n_s32(0x200000);
-
-  int16_t tmp16 = WebRtcSpl_MaxValueW16(inst->noiseEstLogQuantile + offset,
-                                        inst->magnLen);
-
-  // Guarantee a Q-domain as high as possible and still fit in int16
-  inst->qNoise = 14 - (int) WEBRTC_SPL_MUL_16_16_RSFT_WITH_ROUND(kExp2Const,
-                                                                 tmp16,
-                                                                 21);
-
-  int32x4_t qNoise32x4 = vdupq_n_s32(inst->qNoise);
-
-  for (ptr_noiseEstLogQuantile = &inst->noiseEstLogQuantile[offset],
-       ptr_noiseEstQuantile = &inst->noiseEstQuantile[0];
-       ptr_noiseEstQuantile < &inst->noiseEstQuantile[inst->magnLen - 3];
-       ptr_noiseEstQuantile += 4, ptr_noiseEstLogQuantile += 4) {
-
-    // tmp32no2 = kExp2Const * inst->noiseEstLogQuantile[offset + i];
-    int16x4_t v16x4 = vld1_s16(ptr_noiseEstLogQuantile);
-    int32x4_t v32x4B = vmull_s16(v16x4, kExp2Const16x4);
-
-    // tmp32no1 = (0x00200000 | (tmp32no2 & 0x001FFFFF)); // 2^21 + frac
-    int32x4_t v32x4A = vandq_s32(v32x4B, constA32x4);
-    v32x4A = vorrq_s32(v32x4A, constB32x4);
-
-    // tmp16 = (int16_t)(tmp32no2 >> 21);
-    v32x4B = vshrq_n_s32(v32x4B, 21);
-
-    // tmp16 -= 21;// shift 21 to get result in Q0
-    v32x4B = vsubq_s32(v32x4B, twentyOne32x4);
-
-    // tmp16 += (int16_t) inst->qNoise;
-    // shift to get result in Q(qNoise)
-    v32x4B = vaddq_s32(v32x4B, qNoise32x4);
-
-    // if (tmp16 < 0) {
-    //   tmp32no1 >>= -tmp16;
-    // } else {
-    //   tmp32no1 <<= tmp16;
-    // }
-    v32x4B = vshlq_s32(v32x4A, v32x4B);
-
-    // tmp16 = WebRtcSpl_SatW32ToW16(tmp32no1);
-    v16x4 = vqmovn_s32(v32x4B);
-
-    //inst->noiseEstQuantile[i] = tmp16;
-    vst1_s16(ptr_noiseEstQuantile, v16x4);
-  }
-
-  // Last iteration:
-
-  // inst->quantile[i]=exp(inst->lquantile[offset+i]);
-  // in Q21
-  int32_t tmp32no2 = kExp2Const * *ptr_noiseEstLogQuantile;
-  int32_t tmp32no1 = (0x00200000 | (tmp32no2 & 0x001FFFFF)); // 2^21 + frac
-
-  tmp16 = (int16_t)(tmp32no2 >> 21);
-  tmp16 -= 21;// shift 21 to get result in Q0
-  tmp16 += (int16_t) inst->qNoise; //shift to get result in Q(qNoise)
-  if (tmp16 < 0) {
-    tmp32no1 >>= -tmp16;
-  } else {
-    tmp32no1 <<= tmp16;
-  }
-  *ptr_noiseEstQuantile = WebRtcSpl_SatW32ToW16(tmp32no1);
-}
-
-// Noise Estimation
-void WebRtcNsx_NoiseEstimationNeon(NoiseSuppressionFixedC* inst,
-                                   uint16_t* magn,
-                                   uint32_t* noise,
-                                   int16_t* q_noise) {
-  int16_t lmagn[HALF_ANAL_BLOCKL], counter, countDiv;
-  int16_t countProd, delta, zeros, frac;
-  int16_t log2, tabind, logval, tmp16, tmp16no1, tmp16no2;
-  const int16_t log2_const = 22713;
-  const int16_t width_factor = 21845;
-
-  size_t i, s, offset;
-
-  tabind = inst->stages - inst->normData;
-  RTC_DCHECK_LT(tabind, 9);
-  RTC_DCHECK_GT(tabind, -9);
-  if (tabind < 0) {
-    logval = -WebRtcNsx_kLogTable[-tabind];
-  } else {
-    logval = WebRtcNsx_kLogTable[tabind];
-  }
-
-  int16x8_t logval_16x8 = vdupq_n_s16(logval);
-
-  // lmagn(i)=log(magn(i))=log(2)*log2(magn(i))
-  // magn is in Q(-stages), and the real lmagn values are:
-  // real_lmagn(i)=log(magn(i)*2^stages)=log(magn(i))+log(2^stages)
-  // lmagn in Q8
-  for (i = 0; i < inst->magnLen; i++) {
-    if (magn[i]) {
-      zeros = WebRtcSpl_NormU32((uint32_t)magn[i]);
-      frac = (int16_t)((((uint32_t)magn[i] << zeros)
-                        & 0x7FFFFFFF) >> 23);
-      RTC_DCHECK_LT(frac, 256);
-      // log2(magn(i))
-      log2 = (int16_t)(((31 - zeros) << 8)
-                       + WebRtcNsx_kLogTableFrac[frac]);
-      // log2(magn(i))*log(2)
-      lmagn[i] = (int16_t)((log2 * log2_const) >> 15);
-      // + log(2^stages)
-      lmagn[i] += logval;
-    } else {
-      lmagn[i] = logval;
-    }
-  }
-
-  int16x4_t Q3_16x4  = vdup_n_s16(3);
-  int16x8_t WIDTHQ8_16x8 = vdupq_n_s16(WIDTH_Q8);
-  int16x8_t WIDTHFACTOR_16x8 = vdupq_n_s16(width_factor);
-
-  int16_t factor = FACTOR_Q7;
-  if (inst->blockIndex < END_STARTUP_LONG)
-    factor = FACTOR_Q7_STARTUP;
-
-  // Loop over simultaneous estimates
-  for (s = 0; s < SIMULT; s++) {
-    offset = s * inst->magnLen;
-
-    // Get counter values from state
-    counter = inst->noiseEstCounter[s];
-    RTC_DCHECK_LT(counter, 201);
-    countDiv = WebRtcNsx_kCounterDiv[counter];
-    countProd = (int16_t)(counter * countDiv);
-
-    // quant_est(...)
-    int16_t deltaBuff[8];
-    int16x4_t tmp16x4_0;
-    int16x4_t tmp16x4_1;
-    int16x4_t countDiv_16x4 = vdup_n_s16(countDiv);
-    int16x8_t countProd_16x8 = vdupq_n_s16(countProd);
-    int16x8_t tmp16x8_0 = vdupq_n_s16(countDiv);
-    int16x8_t prod16x8 = vqrdmulhq_s16(WIDTHFACTOR_16x8, tmp16x8_0);
-    int16x8_t tmp16x8_1;
-    int16x8_t tmp16x8_2;
-    int16x8_t tmp16x8_3;
-    uint16x8_t tmp16x8_4;
-    int32x4_t tmp32x4;
-
-    for (i = 0; i + 7 < inst->magnLen; i += 8) {
-      // Compute delta.
-      // Smaller step size during startup. This prevents from using
-      // unrealistic values causing overflow.
-      tmp16x8_0 = vdupq_n_s16(factor);
-      vst1q_s16(deltaBuff, tmp16x8_0);
-
-      int j;
-      for (j = 0; j < 8; j++) {
-        if (inst->noiseEstDensity[offset + i + j] > 512) {
-          // Get values for deltaBuff by shifting intead of dividing.
-          int factor = WebRtcSpl_NormW16(inst->noiseEstDensity[offset + i + j]);
-          deltaBuff[j] = (int16_t)(FACTOR_Q16 >> (14 - factor));
-        }
-      }
-
-      // Update log quantile estimate
-
-      // tmp16 = (int16_t)((delta * countDiv) >> 14);
-      tmp32x4 = vmull_s16(vld1_s16(&deltaBuff[0]), countDiv_16x4);
-      tmp16x4_1 = vshrn_n_s32(tmp32x4, 14);
-      tmp32x4 = vmull_s16(vld1_s16(&deltaBuff[4]), countDiv_16x4);
-      tmp16x4_0 = vshrn_n_s32(tmp32x4, 14);
-      tmp16x8_0 = vcombine_s16(tmp16x4_1, tmp16x4_0); // Keep for several lines.
-
-      // prepare for the "if" branch
-      // tmp16 += 2;
-      // tmp16_1 = (Word16)(tmp16>>2);
-      tmp16x8_1 = vrshrq_n_s16(tmp16x8_0, 2);
-
-      // inst->noiseEstLogQuantile[offset+i] + tmp16_1;
-      tmp16x8_2 = vld1q_s16(&inst->noiseEstLogQuantile[offset + i]); // Keep
-      tmp16x8_1 = vaddq_s16(tmp16x8_2, tmp16x8_1); // Keep for several lines
-
-      // Prepare for the "else" branch
-      // tmp16 += 1;
-      // tmp16_1 = (Word16)(tmp16>>1);
-      tmp16x8_0 = vrshrq_n_s16(tmp16x8_0, 1);
-
-      // tmp16_2 = (int16_t)((tmp16_1 * 3) >> 1);
-      tmp32x4 = vmull_s16(vget_low_s16(tmp16x8_0), Q3_16x4);
-      tmp16x4_1 = vshrn_n_s32(tmp32x4, 1);
-
-      // tmp16_2 = (int16_t)((tmp16_1 * 3) >> 1);
-      tmp32x4 = vmull_s16(vget_high_s16(tmp16x8_0), Q3_16x4);
-      tmp16x4_0 = vshrn_n_s32(tmp32x4, 1);
-
-      // inst->noiseEstLogQuantile[offset + i] - tmp16_2;
-      tmp16x8_0 = vcombine_s16(tmp16x4_1, tmp16x4_0); // keep
-      tmp16x8_0 = vsubq_s16(tmp16x8_2, tmp16x8_0);
-
-      // logval is the smallest fixed point representation we can have. Values
-      // below that will correspond to values in the interval [0, 1], which
-      // can't possibly occur.
-      tmp16x8_0 = vmaxq_s16(tmp16x8_0, logval_16x8);
-
-      // Do the if-else branches:
-      tmp16x8_3 = vld1q_s16(&lmagn[i]); // keep for several lines
-      tmp16x8_4 = vcgtq_s16(tmp16x8_3, tmp16x8_2);
-      tmp16x8_2 = vbslq_s16(tmp16x8_4, tmp16x8_1, tmp16x8_0);
-      vst1q_s16(&inst->noiseEstLogQuantile[offset + i], tmp16x8_2);
-
-      // Update density estimate
-      // tmp16_1 + tmp16_2
-      tmp16x8_1 = vld1q_s16(&inst->noiseEstDensity[offset + i]);
-      tmp16x8_0 = vqrdmulhq_s16(tmp16x8_1, countProd_16x8);
-      tmp16x8_0 = vaddq_s16(tmp16x8_0, prod16x8);
-
-      // lmagn[i] - inst->noiseEstLogQuantile[offset + i]
-      tmp16x8_3 = vsubq_s16(tmp16x8_3, tmp16x8_2);
-      tmp16x8_3 = vabsq_s16(tmp16x8_3);
-      tmp16x8_4 = vcgtq_s16(WIDTHQ8_16x8, tmp16x8_3);
-      tmp16x8_1 = vbslq_s16(tmp16x8_4, tmp16x8_0, tmp16x8_1);
-      vst1q_s16(&inst->noiseEstDensity[offset + i], tmp16x8_1);
-    }  // End loop over magnitude spectrum
-
-    // Last iteration over magnitude spectrum:
-    // compute delta
-    if (inst->noiseEstDensity[offset + i] > 512) {
-      // Get values for deltaBuff by shifting intead of dividing.
-      int factor = WebRtcSpl_NormW16(inst->noiseEstDensity[offset + i]);
-      delta = (int16_t)(FACTOR_Q16 >> (14 - factor));
-    } else {
-      delta = FACTOR_Q7;
-      if (inst->blockIndex < END_STARTUP_LONG) {
-        // Smaller step size during startup. This prevents from using
-        // unrealistic values causing overflow.
-        delta = FACTOR_Q7_STARTUP;
-      }
-    }
-    // update log quantile estimate
-    tmp16 = (int16_t)((delta * countDiv) >> 14);
-    if (lmagn[i] > inst->noiseEstLogQuantile[offset + i]) {
-      // +=QUANTILE*delta/(inst->counter[s]+1) QUANTILE=0.25, =1 in Q2
-      // CounterDiv=1/(inst->counter[s]+1) in Q15
-      tmp16 += 2;
-      inst->noiseEstLogQuantile[offset + i] += tmp16 / 4;
-    } else {
-      tmp16 += 1;
-      // *(1-QUANTILE), in Q2 QUANTILE=0.25, 1-0.25=0.75=3 in Q2
-      // TODO(bjornv): investigate why we need to truncate twice.
-      tmp16no2 = (int16_t)((tmp16 / 2) * 3 / 2);
-      inst->noiseEstLogQuantile[offset + i] -= tmp16no2;
-      if (inst->noiseEstLogQuantile[offset + i] < logval) {
-        // logval is the smallest fixed point representation we can have.
-        // Values below that will correspond to values in the interval
-        // [0, 1], which can't possibly occur.
-        inst->noiseEstLogQuantile[offset + i] = logval;
-      }
-    }
-
-    // update density estimate
-    if (WEBRTC_SPL_ABS_W16(lmagn[i] - inst->noiseEstLogQuantile[offset + i])
-        < WIDTH_Q8) {
-      tmp16no1 = (int16_t)WEBRTC_SPL_MUL_16_16_RSFT_WITH_ROUND(
-                   inst->noiseEstDensity[offset + i], countProd, 15);
-      tmp16no2 = (int16_t)WEBRTC_SPL_MUL_16_16_RSFT_WITH_ROUND(
-                   width_factor, countDiv, 15);
-      inst->noiseEstDensity[offset + i] = tmp16no1 + tmp16no2;
-    }
-
-
-    if (counter >= END_STARTUP_LONG) {
-      inst->noiseEstCounter[s] = 0;
-      if (inst->blockIndex >= END_STARTUP_LONG) {
-        UpdateNoiseEstimateNeon(inst, offset);
-      }
-    }
-    inst->noiseEstCounter[s]++;
-
-  }  // end loop over simultaneous estimates
-
-  // Sequentially update the noise during startup
-  if (inst->blockIndex < END_STARTUP_LONG) {
-    UpdateNoiseEstimateNeon(inst, offset);
-  }
-
-  for (i = 0; i < inst->magnLen; i++) {
-    noise[i] = (uint32_t)(inst->noiseEstQuantile[i]); // Q(qNoise)
-  }
-  (*q_noise) = (int16_t)inst->qNoise;
-}
-
-// Filter the data in the frequency domain, and create spectrum.
-void WebRtcNsx_PrepareSpectrumNeon(NoiseSuppressionFixedC* inst,
-                                   int16_t* freq_buf) {
-  RTC_DCHECK_EQ(1, inst->magnLen % 8);
-  RTC_DCHECK_EQ(0, inst->anaLen2 % 16);
-
-  // (1) Filtering.
-
-  // Fixed point C code for the next block is as follows:
-  // for (i = 0; i < inst->magnLen; i++) {
-  //   inst->real[i] = (int16_t)((inst->real[i] *
-  //      (int16_t)(inst->noiseSupFilter[i])) >> 14);  // Q(normData-stages)
-  //   inst->imag[i] = (int16_t)((inst->imag[i] *
-  //      (int16_t)(inst->noiseSupFilter[i])) >> 14);  // Q(normData-stages)
-  // }
-
-  int16_t* preal = &inst->real[0];
-  int16_t* pimag = &inst->imag[0];
-  int16_t* pns_filter = (int16_t*)&inst->noiseSupFilter[0];
-  int16_t* pimag_end = pimag + inst->magnLen - 4;
-
-  while (pimag < pimag_end) {
-    int16x8_t real = vld1q_s16(preal);
-    int16x8_t imag = vld1q_s16(pimag);
-    int16x8_t ns_filter = vld1q_s16(pns_filter);
-
-    int32x4_t tmp_r_0 = vmull_s16(vget_low_s16(real), vget_low_s16(ns_filter));
-    int32x4_t tmp_i_0 = vmull_s16(vget_low_s16(imag), vget_low_s16(ns_filter));
-    int32x4_t tmp_r_1 = vmull_s16(vget_high_s16(real),
-                                  vget_high_s16(ns_filter));
-    int32x4_t tmp_i_1 = vmull_s16(vget_high_s16(imag),
-                                  vget_high_s16(ns_filter));
-
-    int16x4_t result_r_0 = vshrn_n_s32(tmp_r_0, 14);
-    int16x4_t result_i_0 = vshrn_n_s32(tmp_i_0, 14);
-    int16x4_t result_r_1 = vshrn_n_s32(tmp_r_1, 14);
-    int16x4_t result_i_1 = vshrn_n_s32(tmp_i_1, 14);
-
-    vst1q_s16(preal, vcombine_s16(result_r_0, result_r_1));
-    vst1q_s16(pimag, vcombine_s16(result_i_0, result_i_1));
-    preal += 8;
-    pimag += 8;
-    pns_filter += 8;
-  }
-
-  // Filter the last element
-  *preal = (int16_t)((*preal * *pns_filter) >> 14);
-  *pimag = (int16_t)((*pimag * *pns_filter) >> 14);
-
-  // (2) Create spectrum.
-
-  // Fixed point C code for the rest of the function is as follows:
-  // freq_buf[0] = inst->real[0];
-  // freq_buf[1] = -inst->imag[0];
-  // for (i = 1, j = 2; i < inst->anaLen2; i += 1, j += 2) {
-  //   freq_buf[j] = inst->real[i];
-  //   freq_buf[j + 1] = -inst->imag[i];
-  // }
-  // freq_buf[inst->anaLen] = inst->real[inst->anaLen2];
-  // freq_buf[inst->anaLen + 1] = -inst->imag[inst->anaLen2];
-
-  preal = &inst->real[0];
-  pimag = &inst->imag[0];
-  pimag_end = pimag + inst->anaLen2;
-  int16_t * freq_buf_start = freq_buf;
-  while (pimag < pimag_end) {
-    // loop unroll
-    int16x8x2_t real_imag_0;
-    int16x8x2_t real_imag_1;
-    real_imag_0.val[1] = vld1q_s16(pimag);
-    real_imag_0.val[0] = vld1q_s16(preal);
-    preal += 8;
-    pimag += 8;
-    real_imag_1.val[1] = vld1q_s16(pimag);
-    real_imag_1.val[0] = vld1q_s16(preal);
-    preal += 8;
-    pimag += 8;
-
-    real_imag_0.val[1] = vnegq_s16(real_imag_0.val[1]);
-    real_imag_1.val[1] = vnegq_s16(real_imag_1.val[1]);
-    vst2q_s16(freq_buf_start, real_imag_0);
-    freq_buf_start += 16;
-    vst2q_s16(freq_buf_start, real_imag_1);
-    freq_buf_start += 16;
-  }
-  freq_buf[inst->anaLen] = inst->real[inst->anaLen2];
-  freq_buf[inst->anaLen + 1] = -inst->imag[inst->anaLen2];
-}
-
-// For the noise supress process, synthesis, read out fully processed segment,
-// and update synthesis buffer.
-void WebRtcNsx_SynthesisUpdateNeon(NoiseSuppressionFixedC* inst,
-                                   int16_t* out_frame,
-                                   int16_t gain_factor) {
-  RTC_DCHECK_EQ(0, inst->anaLen % 16);
-  RTC_DCHECK_EQ(0, inst->blockLen10ms % 16);
-
-  int16_t* preal_start = inst->real;
-  const int16_t* pwindow = inst->window;
-  int16_t* preal_end = preal_start + inst->anaLen;
-  int16_t* psynthesis_buffer = inst->synthesisBuffer;
-
-  while (preal_start < preal_end) {
-    // Loop unroll.
-    int16x8_t window_0 = vld1q_s16(pwindow);
-    int16x8_t real_0 = vld1q_s16(preal_start);
-    int16x8_t synthesis_buffer_0 = vld1q_s16(psynthesis_buffer);
-
-    int16x8_t window_1 = vld1q_s16(pwindow + 8);
-    int16x8_t real_1 = vld1q_s16(preal_start + 8);
-    int16x8_t synthesis_buffer_1 = vld1q_s16(psynthesis_buffer + 8);
-
-    int32x4_t tmp32a_0_low = vmull_s16(vget_low_s16(real_0),
-                                       vget_low_s16(window_0));
-    int32x4_t tmp32a_0_high = vmull_s16(vget_high_s16(real_0),
-                                        vget_high_s16(window_0));
-
-    int32x4_t tmp32a_1_low = vmull_s16(vget_low_s16(real_1),
-                                       vget_low_s16(window_1));
-    int32x4_t tmp32a_1_high = vmull_s16(vget_high_s16(real_1),
-                                        vget_high_s16(window_1));
-
-    int16x4_t tmp16a_0_low = vqrshrn_n_s32(tmp32a_0_low, 14);
-    int16x4_t tmp16a_0_high = vqrshrn_n_s32(tmp32a_0_high, 14);
-
-    int16x4_t tmp16a_1_low = vqrshrn_n_s32(tmp32a_1_low, 14);
-    int16x4_t tmp16a_1_high = vqrshrn_n_s32(tmp32a_1_high, 14);
-
-    int32x4_t tmp32b_0_low = vmull_n_s16(tmp16a_0_low, gain_factor);
-    int32x4_t tmp32b_0_high = vmull_n_s16(tmp16a_0_high, gain_factor);
-
-    int32x4_t tmp32b_1_low = vmull_n_s16(tmp16a_1_low, gain_factor);
-    int32x4_t tmp32b_1_high = vmull_n_s16(tmp16a_1_high, gain_factor);
-
-    int16x4_t tmp16b_0_low = vqrshrn_n_s32(tmp32b_0_low, 13);
-    int16x4_t tmp16b_0_high = vqrshrn_n_s32(tmp32b_0_high, 13);
-
-    int16x4_t tmp16b_1_low = vqrshrn_n_s32(tmp32b_1_low, 13);
-    int16x4_t tmp16b_1_high = vqrshrn_n_s32(tmp32b_1_high, 13);
-
-    synthesis_buffer_0 = vqaddq_s16(vcombine_s16(tmp16b_0_low, tmp16b_0_high),
-                                    synthesis_buffer_0);
-    synthesis_buffer_1 = vqaddq_s16(vcombine_s16(tmp16b_1_low, tmp16b_1_high),
-                                    synthesis_buffer_1);
-    vst1q_s16(psynthesis_buffer, synthesis_buffer_0);
-    vst1q_s16(psynthesis_buffer + 8, synthesis_buffer_1);
-
-    pwindow += 16;
-    preal_start += 16;
-    psynthesis_buffer += 16;
-  }
-
-  // Read out fully processed segment.
-  int16_t * p_start = inst->synthesisBuffer;
-  int16_t * p_end = inst->synthesisBuffer + inst->blockLen10ms;
-  int16_t * p_frame = out_frame;
-  while (p_start < p_end) {
-    int16x8_t frame_0 = vld1q_s16(p_start);
-    vst1q_s16(p_frame, frame_0);
-    p_start += 8;
-    p_frame += 8;
-  }
-
-  // Update synthesis buffer.
-  int16_t* p_start_src = inst->synthesisBuffer + inst->blockLen10ms;
-  int16_t* p_end_src = inst->synthesisBuffer + inst->anaLen;
-  int16_t* p_start_dst = inst->synthesisBuffer;
-  while (p_start_src < p_end_src) {
-    int16x8_t frame = vld1q_s16(p_start_src);
-    vst1q_s16(p_start_dst, frame);
-    p_start_src += 8;
-    p_start_dst += 8;
-  }
-
-  p_start = inst->synthesisBuffer + inst->anaLen - inst->blockLen10ms;
-  p_end = p_start + inst->blockLen10ms;
-  int16x8_t zero = vdupq_n_s16(0);
-  for (;p_start < p_end; p_start += 8) {
-    vst1q_s16(p_start, zero);
-  }
-}
-
-// Update analysis buffer for lower band, and window data before FFT.
-void WebRtcNsx_AnalysisUpdateNeon(NoiseSuppressionFixedC* inst,
-                                  int16_t* out,
-                                  int16_t* new_speech) {
-  RTC_DCHECK_EQ(0, inst->blockLen10ms % 16);
-  RTC_DCHECK_EQ(0, inst->anaLen % 16);
-
-  // For lower band update analysis buffer.
-  // memcpy(inst->analysisBuffer, inst->analysisBuffer + inst->blockLen10ms,
-  //     (inst->anaLen - inst->blockLen10ms) * sizeof(*inst->analysisBuffer));
-  int16_t* p_start_src = inst->analysisBuffer + inst->blockLen10ms;
-  int16_t* p_end_src = inst->analysisBuffer + inst->anaLen;
-  int16_t* p_start_dst = inst->analysisBuffer;
-  while (p_start_src < p_end_src) {
-    int16x8_t frame = vld1q_s16(p_start_src);
-    vst1q_s16(p_start_dst, frame);
-
-    p_start_src += 8;
-    p_start_dst += 8;
-  }
-
-  // memcpy(inst->analysisBuffer + inst->anaLen - inst->blockLen10ms,
-  //     new_speech, inst->blockLen10ms * sizeof(*inst->analysisBuffer));
-  p_start_src = new_speech;
-  p_end_src = new_speech + inst->blockLen10ms;
-  p_start_dst = inst->analysisBuffer + inst->anaLen - inst->blockLen10ms;
-  while (p_start_src < p_end_src) {
-    int16x8_t frame = vld1q_s16(p_start_src);
-    vst1q_s16(p_start_dst, frame);
-
-    p_start_src += 8;
-    p_start_dst += 8;
-  }
-
-  // Window data before FFT.
-  int16_t* p_start_window = (int16_t*) inst->window;
-  int16_t* p_start_buffer = inst->analysisBuffer;
-  int16_t* p_end_buffer = inst->analysisBuffer + inst->anaLen;
-  int16_t* p_start_out = out;
-
-  // Load the first element to reduce pipeline bubble.
-  int16x8_t window = vld1q_s16(p_start_window);
-  int16x8_t buffer = vld1q_s16(p_start_buffer);
-  p_start_window += 8;
-  p_start_buffer += 8;
-
-  while (p_start_buffer < p_end_buffer) {
-    // Unroll loop.
-    int32x4_t tmp32_low = vmull_s16(vget_low_s16(window), vget_low_s16(buffer));
-    int32x4_t tmp32_high = vmull_s16(vget_high_s16(window),
-                                     vget_high_s16(buffer));
-    window = vld1q_s16(p_start_window);
-    buffer = vld1q_s16(p_start_buffer);
-
-    int16x4_t result_low = vrshrn_n_s32(tmp32_low, 14);
-    int16x4_t result_high = vrshrn_n_s32(tmp32_high, 14);
-    vst1q_s16(p_start_out, vcombine_s16(result_low, result_high));
-
-    p_start_buffer += 8;
-    p_start_window += 8;
-    p_start_out += 8;
-  }
-  int32x4_t tmp32_low = vmull_s16(vget_low_s16(window), vget_low_s16(buffer));
-  int32x4_t tmp32_high = vmull_s16(vget_high_s16(window),
-                                   vget_high_s16(buffer));
-
-  int16x4_t result_low = vrshrn_n_s32(tmp32_low, 14);
-  int16x4_t result_high = vrshrn_n_s32(tmp32_high, 14);
-  vst1q_s16(p_start_out, vcombine_s16(result_low, result_high));
-}
diff --git a/modules/audio_processing/ns/nsx_defines.h b/modules/audio_processing/ns/nsx_defines.h
deleted file mode 100644
index 862dc3c..0000000
--- a/modules/audio_processing/ns/nsx_defines.h
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- *  Copyright (c) 2012 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_PROCESSING_NS_MAIN_SOURCE_NSX_DEFINES_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_NS_MAIN_SOURCE_NSX_DEFINES_H_
-
-#define ANAL_BLOCKL_MAX         256 /* Max analysis block length */
-#define HALF_ANAL_BLOCKL        129 /* Half max analysis block length + 1 */
-#define NUM_HIGH_BANDS_MAX      2   /* Max number of high bands */
-#define SIMULT                  3
-#define END_STARTUP_LONG        200
-#define END_STARTUP_SHORT       50
-#define FACTOR_Q16              2621440 /* 40 in Q16 */
-#define FACTOR_Q7               5120 /* 40 in Q7 */
-#define FACTOR_Q7_STARTUP       1024 /* 8 in Q7 */
-#define WIDTH_Q8                3 /* 0.01 in Q8 (or 25 ) */
-
-/* PARAMETERS FOR NEW METHOD */
-#define DD_PR_SNR_Q11           2007 /* ~= Q11(0.98) DD update of prior SNR */
-#define ONE_MINUS_DD_PR_SNR_Q11 41 /* DD update of prior SNR */
-#define SPECT_FLAT_TAVG_Q14     4915 /* (0.30) tavg parameter for spectral flatness measure */
-#define SPECT_DIFF_TAVG_Q8      77 /* (0.30) tavg parameter for spectral flatness measure */
-#define PRIOR_UPDATE_Q14        1638 /* Q14(0.1) Update parameter of prior model */
-#define NOISE_UPDATE_Q8         26 /* 26 ~= Q8(0.1) Update parameter for noise */
-
-/* Probability threshold for noise state in speech/noise likelihood. */
-#define ONE_MINUS_PROB_RANGE_Q8 205 /* 205 ~= Q8(0.8) */
-#define HIST_PAR_EST            1000 /* Histogram size for estimation of parameters */
-
-/* FEATURE EXTRACTION CONFIG  */
-/* Bin size of histogram */
-#define BIN_SIZE_LRT            10
-/* Scale parameters: multiply dominant peaks of the histograms by scale factor to obtain. */
-/* Thresholds for prior model */
-#define FACTOR_1_LRT_DIFF       6 /* For LRT and spectral difference (5 times bigger) */
-/* For spectral_flatness: used when noise is flatter than speech (10 times bigger). */
-#define FACTOR_2_FLAT_Q10       922
-/* Peak limit for spectral flatness (varies between 0 and 1) */
-#define THRES_PEAK_FLAT         24 /* * 2 * BIN_SIZE_FLAT_FX */
-/* Limit on spacing of two highest peaks in histogram: spacing determined by bin size. */
-#define LIM_PEAK_SPACE_FLAT_DIFF    4 /* * 2 * BIN_SIZE_DIFF_FX */
-/* Limit on relevance of second peak */
-#define LIM_PEAK_WEIGHT_FLAT_DIFF   2
-#define THRES_FLUCT_LRT         10240 /* = 20 * inst->modelUpdate; fluctuation limit of LRT feat. */
-/* Limit on the max and min values for the feature thresholds */
-#define MAX_FLAT_Q10            38912 /*  * 2 * BIN_SIZE_FLAT_FX */
-#define MIN_FLAT_Q10            4096 /*  * 2 * BIN_SIZE_FLAT_FX */
-#define MAX_DIFF                100 /* * 2 * BIN_SIZE_DIFF_FX */
-#define MIN_DIFF                16 /* * 2 * BIN_SIZE_DIFF_FX */
-/* Criteria of weight of histogram peak  to accept/reject feature */
-#define THRES_WEIGHT_FLAT_DIFF  154 /*(int)(0.3*(inst->modelUpdate)) for flatness and difference */
-
-#define STAT_UPDATES            9 /* Update every 512 = 1 << 9 block */
-#define ONE_MINUS_GAMMA_PAUSE_Q8    13 /* ~= Q8(0.05) Update for conservative noise estimate */
-#define GAMMA_NOISE_TRANS_AND_SPEECH_Q8 3 /* ~= Q8(0.01) Update for transition and noise region */
-
-#endif /* WEBRTC_MODULES_AUDIO_PROCESSING_NS_MAIN_SOURCE_NSX_DEFINES_H_ */
diff --git a/modules/audio_processing/ns/windows_private.h b/modules/audio_processing/ns/windows_private.h
deleted file mode 100644
index 44c2e84..0000000
--- a/modules/audio_processing/ns/windows_private.h
+++ /dev/null
@@ -1,574 +0,0 @@
-/*
- *  Copyright (c) 2011 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_PROCESSING_NS_MAIN_SOURCE_WINDOWS_PRIVATE_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_NS_MAIN_SOURCE_WINDOWS_PRIVATE_H_
-
-// Hanning window for 4ms 16kHz
-static const float kHanning64w128[128] = {
-  0.00000000000000f, 0.02454122852291f, 0.04906767432742f,
-  0.07356456359967f, 0.09801714032956f, 0.12241067519922f,
-  0.14673047445536f, 0.17096188876030f, 0.19509032201613f,
-  0.21910124015687f, 0.24298017990326f, 0.26671275747490f,
-  0.29028467725446f, 0.31368174039889f, 0.33688985339222f,
-  0.35989503653499f, 0.38268343236509f, 0.40524131400499f,
-  0.42755509343028f, 0.44961132965461f, 0.47139673682600f,
-  0.49289819222978f, 0.51410274419322f, 0.53499761988710f,
-  0.55557023301960f, 0.57580819141785f, 0.59569930449243f,
-  0.61523159058063f, 0.63439328416365f, 0.65317284295378f,
-  0.67155895484702f, 0.68954054473707f, 0.70710678118655f,
-  0.72424708295147f, 0.74095112535496f, 0.75720884650648f,
-  0.77301045336274f, 0.78834642762661f, 0.80320753148064f,
-  0.81758481315158f, 0.83146961230255f, 0.84485356524971f,
-  0.85772861000027f, 0.87008699110871f, 0.88192126434835f,
-  0.89322430119552f, 0.90398929312344f, 0.91420975570353f,
-  0.92387953251129f, 0.93299279883474f, 0.94154406518302f,
-  0.94952818059304f, 0.95694033573221f, 0.96377606579544f,
-  0.97003125319454f, 0.97570213003853f, 0.98078528040323f,
-  0.98527764238894f, 0.98917650996478f, 0.99247953459871f,
-  0.99518472667220f, 0.99729045667869f, 0.99879545620517f,
-  0.99969881869620f, 1.00000000000000f,
-  0.99969881869620f, 0.99879545620517f, 0.99729045667869f,
-  0.99518472667220f, 0.99247953459871f, 0.98917650996478f,
-  0.98527764238894f, 0.98078528040323f, 0.97570213003853f,
-  0.97003125319454f, 0.96377606579544f, 0.95694033573221f,
-  0.94952818059304f, 0.94154406518302f, 0.93299279883474f,
-  0.92387953251129f, 0.91420975570353f, 0.90398929312344f,
-  0.89322430119552f, 0.88192126434835f, 0.87008699110871f,
-  0.85772861000027f, 0.84485356524971f, 0.83146961230255f,
-  0.81758481315158f, 0.80320753148064f, 0.78834642762661f,
-  0.77301045336274f, 0.75720884650648f, 0.74095112535496f,
-  0.72424708295147f, 0.70710678118655f, 0.68954054473707f,
-  0.67155895484702f, 0.65317284295378f, 0.63439328416365f,
-  0.61523159058063f, 0.59569930449243f, 0.57580819141785f,
-  0.55557023301960f, 0.53499761988710f, 0.51410274419322f,
-  0.49289819222978f, 0.47139673682600f, 0.44961132965461f,
-  0.42755509343028f, 0.40524131400499f, 0.38268343236509f,
-  0.35989503653499f, 0.33688985339222f, 0.31368174039889f,
-  0.29028467725446f, 0.26671275747490f, 0.24298017990326f,
-  0.21910124015687f, 0.19509032201613f, 0.17096188876030f,
-  0.14673047445536f, 0.12241067519922f, 0.09801714032956f,
-  0.07356456359967f, 0.04906767432742f, 0.02454122852291f
-};
-
-
-
-// hybrib Hanning & flat window
-static const float kBlocks80w128[128] = {
-  (float)0.00000000, (float)0.03271908, (float)0.06540313, (float)0.09801714, (float)0.13052619,
-  (float)0.16289547, (float)0.19509032, (float)0.22707626, (float)0.25881905, (float)0.29028468,
-  (float)0.32143947, (float)0.35225005, (float)0.38268343, (float)0.41270703, (float)0.44228869,
-  (float)0.47139674, (float)0.50000000, (float)0.52806785, (float)0.55557023, (float)0.58247770,
-  (float)0.60876143, (float)0.63439328, (float)0.65934582, (float)0.68359230, (float)0.70710678,
-  (float)0.72986407, (float)0.75183981, (float)0.77301045, (float)0.79335334, (float)0.81284668,
-  (float)0.83146961, (float)0.84920218, (float)0.86602540, (float)0.88192126, (float)0.89687274,
-  (float)0.91086382, (float)0.92387953, (float)0.93590593, (float)0.94693013, (float)0.95694034,
-  (float)0.96592583, (float)0.97387698, (float)0.98078528, (float)0.98664333, (float)0.99144486,
-  (float)0.99518473, (float)0.99785892, (float)0.99946459, (float)1.00000000, (float)1.00000000,
-  (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
-  (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
-  (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
-  (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
-  (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
-  (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
-  (float)1.00000000, (float)0.99946459, (float)0.99785892, (float)0.99518473, (float)0.99144486,
-  (float)0.98664333, (float)0.98078528, (float)0.97387698, (float)0.96592583, (float)0.95694034,
-  (float)0.94693013, (float)0.93590593, (float)0.92387953, (float)0.91086382, (float)0.89687274,
-  (float)0.88192126, (float)0.86602540, (float)0.84920218, (float)0.83146961, (float)0.81284668,
-  (float)0.79335334, (float)0.77301045, (float)0.75183981, (float)0.72986407, (float)0.70710678,
-  (float)0.68359230, (float)0.65934582, (float)0.63439328, (float)0.60876143, (float)0.58247770,
-  (float)0.55557023, (float)0.52806785, (float)0.50000000, (float)0.47139674, (float)0.44228869,
-  (float)0.41270703, (float)0.38268343, (float)0.35225005, (float)0.32143947, (float)0.29028468,
-  (float)0.25881905, (float)0.22707626, (float)0.19509032, (float)0.16289547, (float)0.13052619,
-  (float)0.09801714, (float)0.06540313, (float)0.03271908
-};
-
-// hybrib Hanning & flat window
-static const float kBlocks160w256[256] = {
-  (float)0.00000000, (float)0.01636173, (float)0.03271908, (float)0.04906767, (float)0.06540313,
-  (float)0.08172107, (float)0.09801714, (float)0.11428696, (float)0.13052619, (float)0.14673047,
-  (float)0.16289547, (float)0.17901686, (float)0.19509032, (float)0.21111155, (float)0.22707626,
-  (float)0.24298018, (float)0.25881905, (float)0.27458862, (float)0.29028468, (float)0.30590302,
-  (float)0.32143947, (float)0.33688985, (float)0.35225005, (float)0.36751594, (float)0.38268343,
-  (float)0.39774847, (float)0.41270703, (float)0.42755509, (float)0.44228869, (float)0.45690388,
-  (float)0.47139674, (float)0.48576339, (float)0.50000000, (float)0.51410274, (float)0.52806785,
-  (float)0.54189158, (float)0.55557023, (float)0.56910015, (float)0.58247770, (float)0.59569930,
-  (float)0.60876143, (float)0.62166057, (float)0.63439328, (float)0.64695615, (float)0.65934582,
-  (float)0.67155895, (float)0.68359230, (float)0.69544264, (float)0.70710678, (float)0.71858162,
-  (float)0.72986407, (float)0.74095113, (float)0.75183981, (float)0.76252720, (float)0.77301045,
-  (float)0.78328675, (float)0.79335334, (float)0.80320753, (float)0.81284668, (float)0.82226822,
-  (float)0.83146961, (float)0.84044840, (float)0.84920218, (float)0.85772861, (float)0.86602540,
-  (float)0.87409034, (float)0.88192126, (float)0.88951608, (float)0.89687274, (float)0.90398929,
-  (float)0.91086382, (float)0.91749450, (float)0.92387953, (float)0.93001722, (float)0.93590593,
-  (float)0.94154407, (float)0.94693013, (float)0.95206268, (float)0.95694034, (float)0.96156180,
-  (float)0.96592583, (float)0.97003125, (float)0.97387698, (float)0.97746197, (float)0.98078528,
-  (float)0.98384601, (float)0.98664333, (float)0.98917651, (float)0.99144486, (float)0.99344778,
-  (float)0.99518473, (float)0.99665524, (float)0.99785892, (float)0.99879546, (float)0.99946459,
-  (float)0.99986614, (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
-  (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
-  (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
-  (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
-  (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
-  (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
-  (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
-  (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
-  (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
-  (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
-  (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
-  (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
-  (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
-  (float)1.00000000, (float)0.99986614, (float)0.99946459, (float)0.99879546, (float)0.99785892,
-  (float)0.99665524, (float)0.99518473, (float)0.99344778, (float)0.99144486, (float)0.98917651,
-  (float)0.98664333, (float)0.98384601, (float)0.98078528, (float)0.97746197, (float)0.97387698,
-  (float)0.97003125, (float)0.96592583, (float)0.96156180, (float)0.95694034, (float)0.95206268,
-  (float)0.94693013, (float)0.94154407, (float)0.93590593, (float)0.93001722, (float)0.92387953,
-  (float)0.91749450, (float)0.91086382, (float)0.90398929, (float)0.89687274, (float)0.88951608,
-  (float)0.88192126, (float)0.87409034, (float)0.86602540, (float)0.85772861, (float)0.84920218,
-  (float)0.84044840, (float)0.83146961, (float)0.82226822, (float)0.81284668, (float)0.80320753,
-  (float)0.79335334, (float)0.78328675, (float)0.77301045, (float)0.76252720, (float)0.75183981,
-  (float)0.74095113, (float)0.72986407, (float)0.71858162, (float)0.70710678, (float)0.69544264,
-  (float)0.68359230, (float)0.67155895, (float)0.65934582, (float)0.64695615, (float)0.63439328,
-  (float)0.62166057, (float)0.60876143, (float)0.59569930, (float)0.58247770, (float)0.56910015,
-  (float)0.55557023, (float)0.54189158, (float)0.52806785, (float)0.51410274, (float)0.50000000,
-  (float)0.48576339, (float)0.47139674, (float)0.45690388, (float)0.44228869, (float)0.42755509,
-  (float)0.41270703, (float)0.39774847, (float)0.38268343, (float)0.36751594, (float)0.35225005,
-  (float)0.33688985, (float)0.32143947, (float)0.30590302, (float)0.29028468, (float)0.27458862,
-  (float)0.25881905, (float)0.24298018, (float)0.22707626, (float)0.21111155, (float)0.19509032,
-  (float)0.17901686, (float)0.16289547, (float)0.14673047, (float)0.13052619, (float)0.11428696,
-  (float)0.09801714, (float)0.08172107, (float)0.06540313, (float)0.04906767, (float)0.03271908,
-  (float)0.01636173
-};
-
-// hybrib Hanning & flat window: for 20ms
-static const float kBlocks320w512[512] = {
-  (float)0.00000000, (float)0.00818114, (float)0.01636173, (float)0.02454123, (float)0.03271908,
-  (float)0.04089475, (float)0.04906767, (float)0.05723732, (float)0.06540313, (float)0.07356456,
-  (float)0.08172107, (float)0.08987211, (float)0.09801714, (float)0.10615561, (float)0.11428696,
-  (float)0.12241068, (float)0.13052619, (float)0.13863297, (float)0.14673047, (float)0.15481816,
-  (float)0.16289547, (float)0.17096189, (float)0.17901686, (float)0.18705985, (float)0.19509032,
-  (float)0.20310773, (float)0.21111155, (float)0.21910124, (float)0.22707626, (float)0.23503609,
-  (float)0.24298018, (float)0.25090801, (float)0.25881905, (float)0.26671276, (float)0.27458862,
-  (float)0.28244610, (float)0.29028468, (float)0.29810383, (float)0.30590302, (float)0.31368174,
-  (float)0.32143947, (float)0.32917568, (float)0.33688985, (float)0.34458148, (float)0.35225005,
-  (float)0.35989504, (float)0.36751594, (float)0.37511224, (float)0.38268343, (float)0.39022901,
-  (float)0.39774847, (float)0.40524131, (float)0.41270703, (float)0.42014512, (float)0.42755509,
-  (float)0.43493645, (float)0.44228869, (float)0.44961133, (float)0.45690388, (float)0.46416584,
-  (float)0.47139674, (float)0.47859608, (float)0.48576339, (float)0.49289819, (float)0.50000000,
-  (float)0.50706834, (float)0.51410274, (float)0.52110274, (float)0.52806785, (float)0.53499762,
-  (float)0.54189158, (float)0.54874927, (float)0.55557023, (float)0.56235401, (float)0.56910015,
-  (float)0.57580819, (float)0.58247770, (float)0.58910822, (float)0.59569930, (float)0.60225052,
-  (float)0.60876143, (float)0.61523159, (float)0.62166057, (float)0.62804795, (float)0.63439328,
-  (float)0.64069616, (float)0.64695615, (float)0.65317284, (float)0.65934582, (float)0.66547466,
-  (float)0.67155895, (float)0.67759830, (float)0.68359230, (float)0.68954054, (float)0.69544264,
-  (float)0.70129818, (float)0.70710678, (float)0.71286806, (float)0.71858162, (float)0.72424708,
-  (float)0.72986407, (float)0.73543221, (float)0.74095113, (float)0.74642045, (float)0.75183981,
-  (float)0.75720885, (float)0.76252720, (float)0.76779452, (float)0.77301045, (float)0.77817464,
-  (float)0.78328675, (float)0.78834643, (float)0.79335334, (float)0.79830715, (float)0.80320753,
-  (float)0.80805415, (float)0.81284668, (float)0.81758481, (float)0.82226822, (float)0.82689659,
-  (float)0.83146961, (float)0.83598698, (float)0.84044840, (float)0.84485357, (float)0.84920218,
-  (float)0.85349396, (float)0.85772861, (float)0.86190585, (float)0.86602540, (float)0.87008699,
-  (float)0.87409034, (float)0.87803519, (float)0.88192126, (float)0.88574831, (float)0.88951608,
-  (float)0.89322430, (float)0.89687274, (float)0.90046115, (float)0.90398929, (float)0.90745693,
-  (float)0.91086382, (float)0.91420976, (float)0.91749450, (float)0.92071783, (float)0.92387953,
-  (float)0.92697940, (float)0.93001722, (float)0.93299280, (float)0.93590593, (float)0.93875641,
-  (float)0.94154407, (float)0.94426870, (float)0.94693013, (float)0.94952818, (float)0.95206268,
-  (float)0.95453345, (float)0.95694034, (float)0.95928317, (float)0.96156180, (float)0.96377607,
-  (float)0.96592583, (float)0.96801094, (float)0.97003125, (float)0.97198664, (float)0.97387698,
-  (float)0.97570213, (float)0.97746197, (float)0.97915640, (float)0.98078528, (float)0.98234852,
-  (float)0.98384601, (float)0.98527764, (float)0.98664333, (float)0.98794298, (float)0.98917651,
-  (float)0.99034383, (float)0.99144486, (float)0.99247953, (float)0.99344778, (float)0.99434953,
-  (float)0.99518473, (float)0.99595331, (float)0.99665524, (float)0.99729046, (float)0.99785892,
-  (float)0.99836060, (float)0.99879546, (float)0.99916346, (float)0.99946459, (float)0.99969882,
-  (float)0.99986614, (float)0.99996653, (float)1.00000000, (float)1.00000000, (float)1.00000000,
-  (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
-  (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
-  (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
-  (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
-  (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
-  (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
-  (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
-  (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
-  (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
-  (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
-  (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
-  (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
-  (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
-  (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
-  (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
-  (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
-  (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
-  (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
-  (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
-  (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
-  (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
-  (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
-  (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
-  (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
-  (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000, (float)1.00000000,
-  (float)1.00000000, (float)0.99996653, (float)0.99986614, (float)0.99969882, (float)0.99946459,
-  (float)0.99916346, (float)0.99879546, (float)0.99836060, (float)0.99785892, (float)0.99729046,
-  (float)0.99665524, (float)0.99595331, (float)0.99518473, (float)0.99434953, (float)0.99344778,
-  (float)0.99247953, (float)0.99144486, (float)0.99034383, (float)0.98917651, (float)0.98794298,
-  (float)0.98664333, (float)0.98527764, (float)0.98384601, (float)0.98234852, (float)0.98078528,
-  (float)0.97915640, (float)0.97746197, (float)0.97570213, (float)0.97387698, (float)0.97198664,
-  (float)0.97003125, (float)0.96801094, (float)0.96592583, (float)0.96377607, (float)0.96156180,
-  (float)0.95928317, (float)0.95694034, (float)0.95453345, (float)0.95206268, (float)0.94952818,
-  (float)0.94693013, (float)0.94426870, (float)0.94154407, (float)0.93875641, (float)0.93590593,
-  (float)0.93299280, (float)0.93001722, (float)0.92697940, (float)0.92387953, (float)0.92071783,
-  (float)0.91749450, (float)0.91420976, (float)0.91086382, (float)0.90745693, (float)0.90398929,
-  (float)0.90046115, (float)0.89687274, (float)0.89322430, (float)0.88951608, (float)0.88574831,
-  (float)0.88192126, (float)0.87803519, (float)0.87409034, (float)0.87008699, (float)0.86602540,
-  (float)0.86190585, (float)0.85772861, (float)0.85349396, (float)0.84920218, (float)0.84485357,
-  (float)0.84044840, (float)0.83598698, (float)0.83146961, (float)0.82689659, (float)0.82226822,
-  (float)0.81758481, (float)0.81284668, (float)0.80805415, (float)0.80320753, (float)0.79830715,
-  (float)0.79335334, (float)0.78834643, (float)0.78328675, (float)0.77817464, (float)0.77301045,
-  (float)0.76779452, (float)0.76252720, (float)0.75720885, (float)0.75183981, (float)0.74642045,
-  (float)0.74095113, (float)0.73543221, (float)0.72986407, (float)0.72424708, (float)0.71858162,
-  (float)0.71286806, (float)0.70710678, (float)0.70129818, (float)0.69544264, (float)0.68954054,
-  (float)0.68359230, (float)0.67759830, (float)0.67155895, (float)0.66547466, (float)0.65934582,
-  (float)0.65317284, (float)0.64695615, (float)0.64069616, (float)0.63439328, (float)0.62804795,
-  (float)0.62166057, (float)0.61523159, (float)0.60876143, (float)0.60225052, (float)0.59569930,
-  (float)0.58910822, (float)0.58247770, (float)0.57580819, (float)0.56910015, (float)0.56235401,
-  (float)0.55557023, (float)0.54874927, (float)0.54189158, (float)0.53499762, (float)0.52806785,
-  (float)0.52110274, (float)0.51410274, (float)0.50706834, (float)0.50000000, (float)0.49289819,
-  (float)0.48576339, (float)0.47859608, (float)0.47139674, (float)0.46416584, (float)0.45690388,
-  (float)0.44961133, (float)0.44228869, (float)0.43493645, (float)0.42755509, (float)0.42014512,
-  (float)0.41270703, (float)0.40524131, (float)0.39774847, (float)0.39022901, (float)0.38268343,
-  (float)0.37511224, (float)0.36751594, (float)0.35989504, (float)0.35225005, (float)0.34458148,
-  (float)0.33688985, (float)0.32917568, (float)0.32143947, (float)0.31368174, (float)0.30590302,
-  (float)0.29810383, (float)0.29028468, (float)0.28244610, (float)0.27458862, (float)0.26671276,
-  (float)0.25881905, (float)0.25090801, (float)0.24298018, (float)0.23503609, (float)0.22707626,
-  (float)0.21910124, (float)0.21111155, (float)0.20310773, (float)0.19509032, (float)0.18705985,
-  (float)0.17901686, (float)0.17096189, (float)0.16289547, (float)0.15481816, (float)0.14673047,
-  (float)0.13863297, (float)0.13052619, (float)0.12241068, (float)0.11428696, (float)0.10615561,
-  (float)0.09801714, (float)0.08987211, (float)0.08172107, (float)0.07356456, (float)0.06540313,
-  (float)0.05723732, (float)0.04906767, (float)0.04089475, (float)0.03271908, (float)0.02454123,
-  (float)0.01636173, (float)0.00818114
-};
-
-
-// Hanning window: for 15ms at 16kHz with symmetric zeros
-static const float kBlocks240w512[512] = {
-  (float)0.00000000, (float)0.00000000, (float)0.00000000, (float)0.00000000, (float)0.00000000,
-  (float)0.00000000, (float)0.00000000, (float)0.00000000, (float)0.00000000, (float)0.00000000,
-  (float)0.00000000, (float)0.00000000, (float)0.00000000, (float)0.00000000, (float)0.00000000,
-  (float)0.00000000, (float)0.00000000, (float)0.00654494, (float)0.01308960, (float)0.01963369,
-  (float)0.02617695, (float)0.03271908, (float)0.03925982, (float)0.04579887, (float)0.05233596,
-  (float)0.05887080, (float)0.06540313, (float)0.07193266, (float)0.07845910, (float)0.08498218,
-  (float)0.09150162, (float)0.09801714, (float)0.10452846, (float)0.11103531, (float)0.11753740,
-  (float)0.12403446, (float)0.13052620, (float)0.13701233, (float)0.14349262, (float)0.14996676,
-  (float)0.15643448, (float)0.16289547, (float)0.16934951, (float)0.17579629, (float)0.18223552,
-  (float)0.18866697, (float)0.19509032, (float)0.20150533, (float)0.20791170, (float)0.21430916,
-  (float)0.22069745, (float)0.22707628, (float)0.23344538, (float)0.23980446, (float)0.24615330,
-  (float)0.25249159, (float)0.25881904, (float)0.26513544, (float)0.27144045, (float)0.27773386,
-  (float)0.28401536, (float)0.29028466, (float)0.29654160, (float)0.30278578, (float)0.30901700,
-  (float)0.31523499, (float)0.32143945, (float)0.32763019, (float)0.33380687, (float)0.33996925,
-  (float)0.34611708, (float)0.35225007, (float)0.35836795, (float)0.36447051, (float)0.37055743,
-  (float)0.37662852, (float)0.38268346, (float)0.38872197, (float)0.39474389, (float)0.40074885,
-  (float)0.40673664, (float)0.41270703, (float)0.41865975, (float)0.42459452, (float)0.43051112,
-  (float)0.43640924, (float)0.44228873, (float)0.44814920, (float)0.45399052, (float)0.45981237,
-  (float)0.46561453, (float)0.47139674, (float)0.47715878, (float)0.48290035, (float)0.48862126,
-  (float)0.49432120, (float)0.50000000, (float)0.50565743, (float)0.51129311, (float)0.51690692,
-  (float)0.52249855, (float)0.52806789, (float)0.53361452, (float)0.53913832, (float)0.54463905,
-  (float)0.55011642, (float)0.55557024, (float)0.56100029, (float)0.56640625, (float)0.57178795,
-  (float)0.57714522, (float)0.58247769, (float)0.58778524, (float)0.59306765, (float)0.59832460,
-  (float)0.60355598, (float)0.60876143, (float)0.61394083, (float)0.61909395, (float)0.62422055,
-  (float)0.62932038, (float)0.63439333, (float)0.63943899, (float)0.64445734, (float)0.64944810,
-  (float)0.65441096, (float)0.65934587, (float)0.66425246, (float)0.66913062, (float)0.67398012,
-  (float)0.67880076, (float)0.68359232, (float)0.68835455, (float)0.69308740, (float)0.69779050,
-  (float)0.70246369, (float)0.70710677, (float)0.71171963, (float)0.71630198, (float)0.72085363,
-  (float)0.72537440, (float)0.72986406, (float)0.73432255, (float)0.73874950, (float)0.74314487,
-  (float)0.74750835, (float)0.75183982, (float)0.75613910, (float)0.76040596, (float)0.76464027,
-  (float)0.76884186, (float)0.77301043, (float)0.77714598, (float)0.78124821, (float)0.78531694,
-  (float)0.78935206, (float)0.79335338, (float)0.79732066, (float)0.80125386, (float)0.80515265,
-  (float)0.80901700, (float)0.81284672, (float)0.81664157, (float)0.82040149, (float)0.82412618,
-  (float)0.82781565, (float)0.83146966, (float)0.83508795, (float)0.83867061, (float)0.84221727,
-  (float)0.84572780, (float)0.84920216, (float)0.85264021, (float)0.85604161, (float)0.85940641,
-  (float)0.86273444, (float)0.86602545, (float)0.86927933, (float)0.87249607, (float)0.87567532,
-  (float)0.87881714, (float)0.88192129, (float)0.88498765, (float)0.88801610, (float)0.89100653,
-  (float)0.89395881, (float)0.89687276, (float)0.89974827, (float)0.90258533, (float)0.90538365,
-  (float)0.90814316, (float)0.91086388, (float)0.91354549, (float)0.91618794, (float)0.91879123,
-  (float)0.92135513, (float)0.92387950, (float)0.92636442, (float)0.92880958, (float)0.93121493,
-  (float)0.93358046, (float)0.93590593, (float)0.93819135, (float)0.94043654, (float)0.94264150,
-  (float)0.94480604, (float)0.94693011, (float)0.94901365, (float)0.95105654, (float)0.95305866,
-  (float)0.95501995, (float)0.95694035, (float)0.95881975, (float)0.96065807, (float)0.96245527,
-  (float)0.96421117, (float)0.96592581, (float)0.96759909, (float)0.96923089, (float)0.97082120,
-  (float)0.97236991, (float)0.97387701, (float)0.97534233, (float)0.97676587, (float)0.97814763,
-  (float)0.97948742, (float)0.98078531, (float)0.98204112, (float)0.98325491, (float)0.98442656,
-  (float)0.98555607, (float)0.98664331, (float)0.98768836, (float)0.98869103, (float)0.98965138,
-  (float)0.99056935, (float)0.99144489, (float)0.99227792, (float)0.99306846, (float)0.99381649,
-  (float)0.99452192, (float)0.99518472, (float)0.99580491, (float)0.99638247, (float)0.99691731,
-  (float)0.99740952, (float)0.99785894, (float)0.99826562, (float)0.99862951, (float)0.99895066,
-  (float)0.99922901, (float)0.99946457, (float)0.99965733, (float)0.99980724, (float)0.99991435,
-  (float)0.99997860, (float)1.00000000, (float)0.99997860, (float)0.99991435, (float)0.99980724,
-  (float)0.99965733, (float)0.99946457, (float)0.99922901, (float)0.99895066, (float)0.99862951,
-  (float)0.99826562, (float)0.99785894, (float)0.99740946, (float)0.99691731, (float)0.99638247,
-  (float)0.99580491, (float)0.99518472, (float)0.99452192, (float)0.99381644, (float)0.99306846,
-  (float)0.99227792, (float)0.99144489, (float)0.99056935, (float)0.98965138, (float)0.98869103,
-  (float)0.98768836, (float)0.98664331, (float)0.98555607, (float)0.98442656, (float)0.98325491,
-  (float)0.98204112, (float)0.98078525, (float)0.97948742, (float)0.97814757, (float)0.97676587,
-  (float)0.97534227, (float)0.97387695, (float)0.97236991, (float)0.97082120, (float)0.96923089,
-  (float)0.96759909, (float)0.96592581, (float)0.96421117, (float)0.96245521, (float)0.96065807,
-  (float)0.95881969, (float)0.95694029, (float)0.95501995, (float)0.95305860, (float)0.95105648,
-  (float)0.94901365, (float)0.94693011, (float)0.94480604, (float)0.94264150, (float)0.94043654,
-  (float)0.93819129, (float)0.93590593, (float)0.93358046, (float)0.93121493, (float)0.92880952,
-  (float)0.92636436, (float)0.92387950, (float)0.92135507, (float)0.91879123, (float)0.91618794,
-  (float)0.91354543, (float)0.91086382, (float)0.90814310, (float)0.90538365, (float)0.90258527,
-  (float)0.89974827, (float)0.89687276, (float)0.89395875, (float)0.89100647, (float)0.88801610,
-  (float)0.88498759, (float)0.88192123, (float)0.87881714, (float)0.87567532, (float)0.87249595,
-  (float)0.86927933, (float)0.86602539, (float)0.86273432, (float)0.85940641, (float)0.85604161,
-  (float)0.85264009, (float)0.84920216, (float)0.84572780, (float)0.84221715, (float)0.83867055,
-  (float)0.83508795, (float)0.83146954, (float)0.82781565, (float)0.82412612, (float)0.82040137,
-  (float)0.81664157, (float)0.81284660, (float)0.80901700, (float)0.80515265, (float)0.80125374,
-  (float)0.79732066, (float)0.79335332, (float)0.78935200, (float)0.78531694, (float)0.78124815,
-  (float)0.77714586, (float)0.77301049, (float)0.76884180, (float)0.76464021, (float)0.76040596,
-  (float)0.75613904, (float)0.75183970, (float)0.74750835, (float)0.74314481, (float)0.73874938,
-  (float)0.73432249, (float)0.72986400, (float)0.72537428, (float)0.72085363, (float)0.71630186,
-  (float)0.71171951, (float)0.70710677, (float)0.70246363, (float)0.69779032, (float)0.69308734,
-  (float)0.68835449, (float)0.68359220, (float)0.67880070, (float)0.67398006, (float)0.66913044,
-  (float)0.66425240, (float)0.65934575, (float)0.65441096, (float)0.64944804, (float)0.64445722,
-  (float)0.63943905, (float)0.63439327, (float)0.62932026, (float)0.62422055, (float)0.61909389,
-  (float)0.61394072, (float)0.60876143, (float)0.60355592, (float)0.59832448, (float)0.59306765,
-  (float)0.58778518, (float)0.58247757, (float)0.57714522, (float)0.57178789, (float)0.56640613,
-  (float)0.56100023, (float)0.55557019, (float)0.55011630, (float)0.54463905, (float)0.53913826,
-  (float)0.53361434, (float)0.52806783, (float)0.52249849, (float)0.51690674, (float)0.51129305,
-  (float)0.50565726, (float)0.50000006, (float)0.49432117, (float)0.48862115, (float)0.48290038,
-  (float)0.47715873, (float)0.47139663, (float)0.46561456, (float)0.45981231, (float)0.45399037,
-  (float)0.44814920, (float)0.44228864, (float)0.43640912, (float)0.43051112, (float)0.42459446,
-  (float)0.41865960, (float)0.41270703, (float)0.40673658, (float)0.40074870, (float)0.39474386,
-  (float)0.38872188, (float)0.38268328, (float)0.37662849, (float)0.37055734, (float)0.36447033,
-  (float)0.35836792, (float)0.35224995, (float)0.34611690, (float)0.33996922, (float)0.33380675,
-  (float)0.32763001, (float)0.32143945, (float)0.31523487, (float)0.30901679, (float)0.30278572,
-  (float)0.29654145, (float)0.29028472, (float)0.28401530, (float)0.27773371, (float)0.27144048,
-  (float)0.26513538, (float)0.25881892, (float)0.25249159, (float)0.24615324, (float)0.23980433,
-  (float)0.23344538, (float)0.22707619, (float)0.22069728, (float)0.21430916, (float)0.20791161,
-  (float)0.20150517, (float)0.19509031, (float)0.18866688, (float)0.18223536, (float)0.17579627,
-  (float)0.16934940, (float)0.16289529, (float)0.15643445, (float)0.14996666, (float)0.14349243,
-  (float)0.13701232, (float)0.13052608, (float)0.12403426, (float)0.11753736, (float)0.11103519,
-  (float)0.10452849, (float)0.09801710, (float)0.09150149, (float)0.08498220, (float)0.07845904,
-  (float)0.07193252, (float)0.06540315, (float)0.05887074, (float)0.05233581, (float)0.04579888,
-  (float)0.03925974, (float)0.03271893, (float)0.02617695, (float)0.01963361, (float)0.01308943,
-  (float)0.00654493, (float)0.00000000, (float)0.00000000, (float)0.00000000, (float)0.00000000,
-  (float)0.00000000, (float)0.00000000, (float)0.00000000, (float)0.00000000, (float)0.00000000,
-  (float)0.00000000, (float)0.00000000, (float)0.00000000, (float)0.00000000, (float)0.00000000,
-  (float)0.00000000, (float)0.00000000
-};
-
-
-// Hanning window: for 30ms with 1024 fft with symmetric zeros at 16kHz
-static const float kBlocks480w1024[1024] = {
-  (float)0.00000000, (float)0.00000000, (float)0.00000000, (float)0.00000000, (float)0.00000000,
-  (float)0.00000000, (float)0.00000000, (float)0.00000000, (float)0.00000000, (float)0.00000000,
-  (float)0.00000000, (float)0.00000000, (float)0.00000000, (float)0.00000000, (float)0.00000000,
-  (float)0.00000000, (float)0.00000000, (float)0.00000000, (float)0.00000000, (float)0.00000000,
-  (float)0.00000000, (float)0.00000000, (float)0.00000000, (float)0.00000000, (float)0.00000000,
-  (float)0.00000000, (float)0.00000000, (float)0.00000000, (float)0.00000000, (float)0.00000000,
-  (float)0.00000000, (float)0.00000000, (float)0.00000000, (float)0.00327249, (float)0.00654494,
-  (float)0.00981732, (float)0.01308960, (float)0.01636173, (float)0.01963369, (float)0.02290544,
-  (float)0.02617695, (float)0.02944817, (float)0.03271908, (float)0.03598964, (float)0.03925982,
-  (float)0.04252957, (float)0.04579887, (float)0.04906768, (float)0.05233596, (float)0.05560368,
-  (float)0.05887080, (float)0.06213730, (float)0.06540313, (float)0.06866825, (float)0.07193266,
-  (float)0.07519628, (float)0.07845910, (float)0.08172107, (float)0.08498218, (float)0.08824237,
-  (float)0.09150162, (float)0.09475989, (float)0.09801714, (float)0.10127335, (float)0.10452846,
-  (float)0.10778246, (float)0.11103531, (float)0.11428697, (float)0.11753740, (float)0.12078657,
-  (float)0.12403446, (float)0.12728101, (float)0.13052620, (float)0.13376999, (float)0.13701233,
-  (float)0.14025325, (float)0.14349262, (float)0.14673047, (float)0.14996676, (float)0.15320145,
-  (float)0.15643448, (float)0.15966582, (float)0.16289547, (float)0.16612339, (float)0.16934951,
-  (float)0.17257382, (float)0.17579629, (float)0.17901687, (float)0.18223552, (float)0.18545224,
-  (float)0.18866697, (float)0.19187967, (float)0.19509032, (float)0.19829889, (float)0.20150533,
-  (float)0.20470962, (float)0.20791170, (float)0.21111156, (float)0.21430916, (float)0.21750447,
-  (float)0.22069745, (float)0.22388805, (float)0.22707628, (float)0.23026206, (float)0.23344538,
-  (float)0.23662618, (float)0.23980446, (float)0.24298020, (float)0.24615330, (float)0.24932377,
-  (float)0.25249159, (float)0.25565669, (float)0.25881904, (float)0.26197866, (float)0.26513544,
-  (float)0.26828939, (float)0.27144045, (float)0.27458861, (float)0.27773386, (float)0.28087610,
-  (float)0.28401536, (float)0.28715158, (float)0.29028466, (float)0.29341471, (float)0.29654160,
-  (float)0.29966527, (float)0.30278578, (float)0.30590302, (float)0.30901700, (float)0.31212768,
-  (float)0.31523499, (float)0.31833893, (float)0.32143945, (float)0.32453656, (float)0.32763019,
-  (float)0.33072028, (float)0.33380687, (float)0.33688986, (float)0.33996925, (float)0.34304500,
-  (float)0.34611708, (float)0.34918544, (float)0.35225007, (float)0.35531089, (float)0.35836795,
-  (float)0.36142117, (float)0.36447051, (float)0.36751595, (float)0.37055743, (float)0.37359497,
-  (float)0.37662852, (float)0.37965801, (float)0.38268346, (float)0.38570479, (float)0.38872197,
-  (float)0.39173502, (float)0.39474389, (float)0.39774847, (float)0.40074885, (float)0.40374491,
-  (float)0.40673664, (float)0.40972406, (float)0.41270703, (float)0.41568562, (float)0.41865975,
-  (float)0.42162940, (float)0.42459452, (float)0.42755508, (float)0.43051112, (float)0.43346250,
-  (float)0.43640924, (float)0.43935132, (float)0.44228873, (float)0.44522133, (float)0.44814920,
-  (float)0.45107228, (float)0.45399052, (float)0.45690390, (float)0.45981237, (float)0.46271592,
-  (float)0.46561453, (float)0.46850815, (float)0.47139674, (float)0.47428030, (float)0.47715878,
-  (float)0.48003215, (float)0.48290035, (float)0.48576337, (float)0.48862126, (float)0.49147385,
-  (float)0.49432120, (float)0.49716330, (float)0.50000000, (float)0.50283140, (float)0.50565743,
-  (float)0.50847799, (float)0.51129311, (float)0.51410276, (float)0.51690692, (float)0.51970553,
-  (float)0.52249855, (float)0.52528602, (float)0.52806789, (float)0.53084403, (float)0.53361452,
-  (float)0.53637928, (float)0.53913832, (float)0.54189163, (float)0.54463905, (float)0.54738063,
-  (float)0.55011642, (float)0.55284631, (float)0.55557024, (float)0.55828828, (float)0.56100029,
-  (float)0.56370628, (float)0.56640625, (float)0.56910014, (float)0.57178795, (float)0.57446963,
-  (float)0.57714522, (float)0.57981455, (float)0.58247769, (float)0.58513463, (float)0.58778524,
-  (float)0.59042960, (float)0.59306765, (float)0.59569931, (float)0.59832460, (float)0.60094351,
-  (float)0.60355598, (float)0.60616195, (float)0.60876143, (float)0.61135441, (float)0.61394083,
-  (float)0.61652070, (float)0.61909395, (float)0.62166059, (float)0.62422055, (float)0.62677383,
-  (float)0.62932038, (float)0.63186020, (float)0.63439333, (float)0.63691956, (float)0.63943899,
-  (float)0.64195162, (float)0.64445734, (float)0.64695615, (float)0.64944810, (float)0.65193301,
-  (float)0.65441096, (float)0.65688187, (float)0.65934587, (float)0.66180271, (float)0.66425246,
-  (float)0.66669512, (float)0.66913062, (float)0.67155898, (float)0.67398012, (float)0.67639405,
-  (float)0.67880076, (float)0.68120021, (float)0.68359232, (float)0.68597710, (float)0.68835455,
-  (float)0.69072467, (float)0.69308740, (float)0.69544262, (float)0.69779050, (float)0.70013082,
-  (float)0.70246369, (float)0.70478904, (float)0.70710677, (float)0.70941699, (float)0.71171963,
-  (float)0.71401459, (float)0.71630198, (float)0.71858168, (float)0.72085363, (float)0.72311789,
-  (float)0.72537440, (float)0.72762316, (float)0.72986406, (float)0.73209721, (float)0.73432255,
-  (float)0.73653996, (float)0.73874950, (float)0.74095118, (float)0.74314487, (float)0.74533057,
-  (float)0.74750835, (float)0.74967808, (float)0.75183982, (float)0.75399351, (float)0.75613910,
-  (float)0.75827658, (float)0.76040596, (float)0.76252723, (float)0.76464027, (float)0.76674515,
-  (float)0.76884186, (float)0.77093029, (float)0.77301043, (float)0.77508241, (float)0.77714598,
-  (float)0.77920127, (float)0.78124821, (float)0.78328675, (float)0.78531694, (float)0.78733873,
-  (float)0.78935206, (float)0.79135692, (float)0.79335338, (float)0.79534125, (float)0.79732066,
-  (float)0.79929149, (float)0.80125386, (float)0.80320752, (float)0.80515265, (float)0.80708915,
-  (float)0.80901700, (float)0.81093621, (float)0.81284672, (float)0.81474853, (float)0.81664157,
-  (float)0.81852591, (float)0.82040149, (float)0.82226825, (float)0.82412618, (float)0.82597536,
-  (float)0.82781565, (float)0.82964706, (float)0.83146966, (float)0.83328325, (float)0.83508795,
-  (float)0.83688378, (float)0.83867061, (float)0.84044838, (float)0.84221727, (float)0.84397703,
-  (float)0.84572780, (float)0.84746957, (float)0.84920216, (float)0.85092574, (float)0.85264021,
-  (float)0.85434544, (float)0.85604161, (float)0.85772866, (float)0.85940641, (float)0.86107504,
-  (float)0.86273444, (float)0.86438453, (float)0.86602545, (float)0.86765707, (float)0.86927933,
-  (float)0.87089235, (float)0.87249607, (float)0.87409031, (float)0.87567532, (float)0.87725097,
-  (float)0.87881714, (float)0.88037390, (float)0.88192129, (float)0.88345921, (float)0.88498765,
-  (float)0.88650668, (float)0.88801610, (float)0.88951612, (float)0.89100653, (float)0.89248741,
-  (float)0.89395881, (float)0.89542055, (float)0.89687276, (float)0.89831537, (float)0.89974827,
-  (float)0.90117162, (float)0.90258533, (float)0.90398932, (float)0.90538365, (float)0.90676826,
-  (float)0.90814316, (float)0.90950841, (float)0.91086388, (float)0.91220951, (float)0.91354549,
-  (float)0.91487163, (float)0.91618794, (float)0.91749454, (float)0.91879123, (float)0.92007810,
-  (float)0.92135513, (float)0.92262226, (float)0.92387950, (float)0.92512691, (float)0.92636442,
-  (float)0.92759192, (float)0.92880958, (float)0.93001723, (float)0.93121493, (float)0.93240267,
-  (float)0.93358046, (float)0.93474817, (float)0.93590593, (float)0.93705362, (float)0.93819135,
-  (float)0.93931901, (float)0.94043654, (float)0.94154406, (float)0.94264150, (float)0.94372880,
-  (float)0.94480604, (float)0.94587320, (float)0.94693011, (float)0.94797695, (float)0.94901365,
-  (float)0.95004016, (float)0.95105654, (float)0.95206273, (float)0.95305866, (float)0.95404440,
-  (float)0.95501995, (float)0.95598525, (float)0.95694035, (float)0.95788521, (float)0.95881975,
-  (float)0.95974404, (float)0.96065807, (float)0.96156180, (float)0.96245527, (float)0.96333838,
-  (float)0.96421117, (float)0.96507370, (float)0.96592581, (float)0.96676767, (float)0.96759909,
-  (float)0.96842021, (float)0.96923089, (float)0.97003126, (float)0.97082120, (float)0.97160077,
-  (float)0.97236991, (float)0.97312868, (float)0.97387701, (float)0.97461486, (float)0.97534233,
-  (float)0.97605932, (float)0.97676587, (float)0.97746199, (float)0.97814763, (float)0.97882277,
-  (float)0.97948742, (float)0.98014158, (float)0.98078531, (float)0.98141843, (float)0.98204112,
-  (float)0.98265332, (float)0.98325491, (float)0.98384601, (float)0.98442656, (float)0.98499662,
-  (float)0.98555607, (float)0.98610497, (float)0.98664331, (float)0.98717111, (float)0.98768836,
-  (float)0.98819500, (float)0.98869103, (float)0.98917651, (float)0.98965138, (float)0.99011570,
-  (float)0.99056935, (float)0.99101239, (float)0.99144489, (float)0.99186671, (float)0.99227792,
-  (float)0.99267852, (float)0.99306846, (float)0.99344778, (float)0.99381649, (float)0.99417448,
-  (float)0.99452192, (float)0.99485862, (float)0.99518472, (float)0.99550015, (float)0.99580491,
-  (float)0.99609905, (float)0.99638247, (float)0.99665523, (float)0.99691731, (float)0.99716878,
-  (float)0.99740952, (float)0.99763954, (float)0.99785894, (float)0.99806762, (float)0.99826562,
-  (float)0.99845290, (float)0.99862951, (float)0.99879545, (float)0.99895066, (float)0.99909520,
-  (float)0.99922901, (float)0.99935216, (float)0.99946457, (float)0.99956632, (float)0.99965733,
-  (float)0.99973762, (float)0.99980724, (float)0.99986613, (float)0.99991435, (float)0.99995178,
-  (float)0.99997860, (float)0.99999464, (float)1.00000000, (float)0.99999464, (float)0.99997860,
-  (float)0.99995178, (float)0.99991435, (float)0.99986613, (float)0.99980724, (float)0.99973762,
-  (float)0.99965733, (float)0.99956632, (float)0.99946457, (float)0.99935216, (float)0.99922901,
-  (float)0.99909520, (float)0.99895066, (float)0.99879545, (float)0.99862951, (float)0.99845290,
-  (float)0.99826562, (float)0.99806762, (float)0.99785894, (float)0.99763954, (float)0.99740946,
-  (float)0.99716872, (float)0.99691731, (float)0.99665523, (float)0.99638247, (float)0.99609905,
-  (float)0.99580491, (float)0.99550015, (float)0.99518472, (float)0.99485862, (float)0.99452192,
-  (float)0.99417448, (float)0.99381644, (float)0.99344778, (float)0.99306846, (float)0.99267852,
-  (float)0.99227792, (float)0.99186671, (float)0.99144489, (float)0.99101239, (float)0.99056935,
-  (float)0.99011564, (float)0.98965138, (float)0.98917651, (float)0.98869103, (float)0.98819494,
-  (float)0.98768836, (float)0.98717111, (float)0.98664331, (float)0.98610497, (float)0.98555607,
-  (float)0.98499656, (float)0.98442656, (float)0.98384601, (float)0.98325491, (float)0.98265326,
-  (float)0.98204112, (float)0.98141843, (float)0.98078525, (float)0.98014158, (float)0.97948742,
-  (float)0.97882277, (float)0.97814757, (float)0.97746193, (float)0.97676587, (float)0.97605932,
-  (float)0.97534227, (float)0.97461486, (float)0.97387695, (float)0.97312862, (float)0.97236991,
-  (float)0.97160077, (float)0.97082120, (float)0.97003126, (float)0.96923089, (float)0.96842015,
-  (float)0.96759909, (float)0.96676761, (float)0.96592581, (float)0.96507365, (float)0.96421117,
-  (float)0.96333838, (float)0.96245521, (float)0.96156180, (float)0.96065807, (float)0.95974404,
-  (float)0.95881969, (float)0.95788515, (float)0.95694029, (float)0.95598525, (float)0.95501995,
-  (float)0.95404440, (float)0.95305860, (float)0.95206267, (float)0.95105648, (float)0.95004016,
-  (float)0.94901365, (float)0.94797695, (float)0.94693011, (float)0.94587314, (float)0.94480604,
-  (float)0.94372880, (float)0.94264150, (float)0.94154406, (float)0.94043654, (float)0.93931895,
-  (float)0.93819129, (float)0.93705362, (float)0.93590593, (float)0.93474817, (float)0.93358046,
-  (float)0.93240267, (float)0.93121493, (float)0.93001723, (float)0.92880952, (float)0.92759192,
-  (float)0.92636436, (float)0.92512691, (float)0.92387950, (float)0.92262226, (float)0.92135507,
-  (float)0.92007804, (float)0.91879123, (float)0.91749448, (float)0.91618794, (float)0.91487157,
-  (float)0.91354543, (float)0.91220951, (float)0.91086382, (float)0.90950835, (float)0.90814310,
-  (float)0.90676820, (float)0.90538365, (float)0.90398932, (float)0.90258527, (float)0.90117157,
-  (float)0.89974827, (float)0.89831525, (float)0.89687276, (float)0.89542055, (float)0.89395875,
-  (float)0.89248741, (float)0.89100647, (float)0.88951600, (float)0.88801610, (float)0.88650662,
-  (float)0.88498759, (float)0.88345915, (float)0.88192123, (float)0.88037384, (float)0.87881714,
-  (float)0.87725091, (float)0.87567532, (float)0.87409031, (float)0.87249595, (float)0.87089223,
-  (float)0.86927933, (float)0.86765701, (float)0.86602539, (float)0.86438447, (float)0.86273432,
-  (float)0.86107504, (float)0.85940641, (float)0.85772860, (float)0.85604161, (float)0.85434544,
-  (float)0.85264009, (float)0.85092574, (float)0.84920216, (float)0.84746951, (float)0.84572780,
-  (float)0.84397697, (float)0.84221715, (float)0.84044844, (float)0.83867055, (float)0.83688372,
-  (float)0.83508795, (float)0.83328319, (float)0.83146954, (float)0.82964706, (float)0.82781565,
-  (float)0.82597530, (float)0.82412612, (float)0.82226813, (float)0.82040137, (float)0.81852591,
-  (float)0.81664157, (float)0.81474847, (float)0.81284660, (float)0.81093609, (float)0.80901700,
-  (float)0.80708915, (float)0.80515265, (float)0.80320752, (float)0.80125374, (float)0.79929143,
-  (float)0.79732066, (float)0.79534125, (float)0.79335332, (float)0.79135686, (float)0.78935200,
-  (float)0.78733861, (float)0.78531694, (float)0.78328675, (float)0.78124815, (float)0.77920121,
-  (float)0.77714586, (float)0.77508223, (float)0.77301049, (float)0.77093029, (float)0.76884180,
-  (float)0.76674509, (float)0.76464021, (float)0.76252711, (float)0.76040596, (float)0.75827658,
-  (float)0.75613904, (float)0.75399339, (float)0.75183970, (float)0.74967796, (float)0.74750835,
-  (float)0.74533057, (float)0.74314481, (float)0.74095106, (float)0.73874938, (float)0.73653996,
-  (float)0.73432249, (float)0.73209721, (float)0.72986400, (float)0.72762305, (float)0.72537428,
-  (float)0.72311789, (float)0.72085363, (float)0.71858162, (float)0.71630186, (float)0.71401453,
-  (float)0.71171951, (float)0.70941705, (float)0.70710677, (float)0.70478898, (float)0.70246363,
-  (float)0.70013070, (float)0.69779032, (float)0.69544268, (float)0.69308734, (float)0.69072461,
-  (float)0.68835449, (float)0.68597704, (float)0.68359220, (float)0.68120021, (float)0.67880070,
-  (float)0.67639399, (float)0.67398006, (float)0.67155886, (float)0.66913044, (float)0.66669512,
-  (float)0.66425240, (float)0.66180259, (float)0.65934575, (float)0.65688181, (float)0.65441096,
-  (float)0.65193301, (float)0.64944804, (float)0.64695609, (float)0.64445722, (float)0.64195150,
-  (float)0.63943905, (float)0.63691956, (float)0.63439327, (float)0.63186014, (float)0.62932026,
-  (float)0.62677372, (float)0.62422055, (float)0.62166059, (float)0.61909389, (float)0.61652064,
-  (float)0.61394072, (float)0.61135429, (float)0.60876143, (float)0.60616189, (float)0.60355592,
-  (float)0.60094339, (float)0.59832448, (float)0.59569913, (float)0.59306765, (float)0.59042960,
-  (float)0.58778518, (float)0.58513451, (float)0.58247757, (float)0.57981461, (float)0.57714522,
-  (float)0.57446963, (float)0.57178789, (float)0.56910002, (float)0.56640613, (float)0.56370628,
-  (float)0.56100023, (float)0.55828822, (float)0.55557019, (float)0.55284619, (float)0.55011630,
-  (float)0.54738069, (float)0.54463905, (float)0.54189152, (float)0.53913826, (float)0.53637916,
-  (float)0.53361434, (float)0.53084403, (float)0.52806783, (float)0.52528596, (float)0.52249849,
-  (float)0.51970541, (float)0.51690674, (float)0.51410276, (float)0.51129305, (float)0.50847787,
-  (float)0.50565726, (float)0.50283122, (float)0.50000006, (float)0.49716327, (float)0.49432117,
-  (float)0.49147379, (float)0.48862115, (float)0.48576325, (float)0.48290038, (float)0.48003212,
-  (float)0.47715873, (float)0.47428021, (float)0.47139663, (float)0.46850798, (float)0.46561456,
-  (float)0.46271589, (float)0.45981231, (float)0.45690379, (float)0.45399037, (float)0.45107210,
-  (float)0.44814920, (float)0.44522130, (float)0.44228864, (float)0.43935123, (float)0.43640912,
-  (float)0.43346232, (float)0.43051112, (float)0.42755505, (float)0.42459446, (float)0.42162928,
-  (float)0.41865960, (float)0.41568545, (float)0.41270703, (float)0.40972400, (float)0.40673658,
-  (float)0.40374479, (float)0.40074870, (float)0.39774850, (float)0.39474386, (float)0.39173496,
-  (float)0.38872188, (float)0.38570464, (float)0.38268328, (float)0.37965804, (float)0.37662849,
-  (float)0.37359491, (float)0.37055734, (float)0.36751580, (float)0.36447033, (float)0.36142117,
-  (float)0.35836792, (float)0.35531086, (float)0.35224995, (float)0.34918529, (float)0.34611690,
-  (float)0.34304500, (float)0.33996922, (float)0.33688980, (float)0.33380675, (float)0.33072016,
-  (float)0.32763001, (float)0.32453656, (float)0.32143945, (float)0.31833887, (float)0.31523487,
-  (float)0.31212750, (float)0.30901679, (float)0.30590302, (float)0.30278572, (float)0.29966521,
-  (float)0.29654145, (float)0.29341453, (float)0.29028472, (float)0.28715155, (float)0.28401530,
-  (float)0.28087601, (float)0.27773371, (float)0.27458847, (float)0.27144048, (float)0.26828936,
-  (float)0.26513538, (float)0.26197854, (float)0.25881892, (float)0.25565651, (float)0.25249159,
-  (float)0.24932374, (float)0.24615324, (float)0.24298008, (float)0.23980433, (float)0.23662600,
-  (float)0.23344538, (float)0.23026201, (float)0.22707619, (float)0.22388794, (float)0.22069728,
-  (float)0.21750426, (float)0.21430916, (float)0.21111152, (float)0.20791161, (float)0.20470949,
-  (float)0.20150517, (float)0.19829892, (float)0.19509031, (float)0.19187963, (float)0.18866688,
-  (float)0.18545210, (float)0.18223536, (float)0.17901689, (float)0.17579627, (float)0.17257376,
-  (float)0.16934940, (float)0.16612324, (float)0.16289529, (float)0.15966584, (float)0.15643445,
-  (float)0.15320137, (float)0.14996666, (float)0.14673033, (float)0.14349243, (float)0.14025325,
-  (float)0.13701232, (float)0.13376991, (float)0.13052608, (float)0.12728085, (float)0.12403426,
-  (float)0.12078657, (float)0.11753736, (float)0.11428688, (float)0.11103519, (float)0.10778230,
-  (float)0.10452849, (float)0.10127334, (float)0.09801710, (float)0.09475980, (float)0.09150149,
-  (float)0.08824220, (float)0.08498220, (float)0.08172106, (float)0.07845904, (float)0.07519618,
-  (float)0.07193252, (float)0.06866808, (float)0.06540315, (float)0.06213728, (float)0.05887074,
-  (float)0.05560357, (float)0.05233581, (float)0.04906749, (float)0.04579888, (float)0.04252954,
-  (float)0.03925974, (float)0.03598953, (float)0.03271893, (float)0.02944798, (float)0.02617695,
-  (float)0.02290541, (float)0.01963361, (float)0.01636161, (float)0.01308943, (float)0.00981712,
-  (float)0.00654493, (float)0.00327244, (float)0.00000000, (float)0.00000000, (float)0.00000000,
-  (float)0.00000000, (float)0.00000000, (float)0.00000000, (float)0.00000000, (float)0.00000000,
-  (float)0.00000000, (float)0.00000000, (float)0.00000000, (float)0.00000000, (float)0.00000000,
-  (float)0.00000000, (float)0.00000000, (float)0.00000000, (float)0.00000000, (float)0.00000000,
-  (float)0.00000000, (float)0.00000000, (float)0.00000000, (float)0.00000000, (float)0.00000000,
-  (float)0.00000000, (float)0.00000000, (float)0.00000000, (float)0.00000000, (float)0.00000000,
-  (float)0.00000000, (float)0.00000000, (float)0.00000000, (float)0.00000000
-};
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_NS_MAIN_SOURCE_WINDOWS_PRIVATE_H_
diff --git a/modules/audio_processing/render_queue_item_verifier.h b/modules/audio_processing/render_queue_item_verifier.h
deleted file mode 100644
index a7fbbb4..0000000
--- a/modules/audio_processing/render_queue_item_verifier.h
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- *  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_PROCESSING_RENDER_QUEUE_ITEM_VERIFIER_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_RENDER_QUEUE_ITEM_VERIFIER_H_
-
-#include <vector>
-
-namespace webrtc {
-
-// Functor to use when supplying a verifier function for the queue item
-// verifcation.
-template <typename T>
-class RenderQueueItemVerifier {
- public:
-  explicit RenderQueueItemVerifier(size_t minimum_capacity)
-      : minimum_capacity_(minimum_capacity) {}
-
-  bool operator()(const std::vector<T>& v) const {
-    return v.capacity() >= minimum_capacity_;
-  }
-
- private:
-  size_t minimum_capacity_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_RENDER_QUEUE_ITEM_VERIFIER_H__
diff --git a/modules/audio_processing/residual_echo_detector.cc b/modules/audio_processing/residual_echo_detector.cc
deleted file mode 100644
index 290af43..0000000
--- a/modules/audio_processing/residual_echo_detector.cc
+++ /dev/null
@@ -1,204 +0,0 @@
-/*
- *  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_processing/residual_echo_detector.h"
-
-#include <algorithm>
-#include <numeric>
-
-#include "webrtc/modules/audio_processing/audio_buffer.h"
-#include "webrtc/modules/audio_processing/logging/apm_data_dumper.h"
-#include "webrtc/rtc_base/atomicops.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/system_wrappers/include/metrics.h"
-
-namespace {
-
-float Power(rtc::ArrayView<const float> input) {
-  if (input.empty()) {
-    return 0.f;
-  }
-  return std::inner_product(input.begin(), input.end(), input.begin(), 0.f) /
-         input.size();
-}
-
-constexpr size_t kLookbackFrames = 650;
-// TODO(ivoc): Verify the size of this buffer.
-constexpr size_t kRenderBufferSize = 30;
-constexpr float kAlpha = 0.001f;
-// 10 seconds of data, updated every 10 ms.
-constexpr size_t kAggregationBufferSize = 10 * 100;
-
-}  // namespace
-
-namespace webrtc {
-
-int ResidualEchoDetector::instance_count_ = 0;
-
-ResidualEchoDetector::ResidualEchoDetector()
-    : data_dumper_(
-          new ApmDataDumper(rtc::AtomicOps::Increment(&instance_count_))),
-      render_buffer_(kRenderBufferSize),
-      render_power_(kLookbackFrames),
-      render_power_mean_(kLookbackFrames),
-      render_power_std_dev_(kLookbackFrames),
-      covariances_(kLookbackFrames),
-      recent_likelihood_max_(kAggregationBufferSize) {}
-
-ResidualEchoDetector::~ResidualEchoDetector() = default;
-
-void ResidualEchoDetector::AnalyzeRenderAudio(
-    rtc::ArrayView<const float> render_audio) {
-  // Dump debug data assuming 48 kHz sample rate (if this assumption is not
-  // valid the dumped audio will need to be converted offline accordingly).
-  data_dumper_->DumpWav("ed_render", render_audio.size(), render_audio.data(),
-                        48000, 1);
-
-  if (render_buffer_.Size() == 0) {
-    frames_since_zero_buffer_size_ = 0;
-  } else if (frames_since_zero_buffer_size_ >= kRenderBufferSize) {
-    // This can happen in a few cases: at the start of a call, due to a glitch
-    // or due to clock drift. The excess capture value will be ignored.
-    // TODO(ivoc): Include how often this happens in APM stats.
-    render_buffer_.Pop();
-    frames_since_zero_buffer_size_ = 0;
-  }
-  ++frames_since_zero_buffer_size_;
-  float power = Power(render_audio);
-  render_buffer_.Push(power);
-}
-
-void ResidualEchoDetector::AnalyzeCaptureAudio(
-    rtc::ArrayView<const float> capture_audio) {
-  // Dump debug data assuming 48 kHz sample rate (if this assumption is not
-  // valid the dumped audio will need to be converted offline accordingly).
-  data_dumper_->DumpWav("ed_capture", capture_audio.size(),
-                        capture_audio.data(), 48000, 1);
-
-  if (first_process_call_) {
-    // On the first process call (so the start of a call), we must flush the
-    // render buffer, otherwise the render data will be delayed.
-    render_buffer_.Clear();
-    first_process_call_ = false;
-  }
-
-  // Get the next render value.
-  const rtc::Optional<float> buffered_render_power = render_buffer_.Pop();
-  if (!buffered_render_power) {
-    // This can happen in a few cases: at the start of a call, due to a glitch
-    // or due to clock drift. The excess capture value will be ignored.
-    // TODO(ivoc): Include how often this happens in APM stats.
-    return;
-  }
-  // Update the render statistics, and store the statistics in circular buffers.
-  render_statistics_.Update(*buffered_render_power);
-  RTC_DCHECK_LT(next_insertion_index_, kLookbackFrames);
-  render_power_[next_insertion_index_] = *buffered_render_power;
-  render_power_mean_[next_insertion_index_] = render_statistics_.mean();
-  render_power_std_dev_[next_insertion_index_] =
-      render_statistics_.std_deviation();
-
-  // Get the next capture value, update capture statistics and add the relevant
-  // values to the buffers.
-  const float capture_power = Power(capture_audio);
-  capture_statistics_.Update(capture_power);
-  const float capture_mean = capture_statistics_.mean();
-  const float capture_std_deviation = capture_statistics_.std_deviation();
-
-  // Update the covariance values and determine the new echo likelihood.
-  echo_likelihood_ = 0.f;
-  size_t read_index = next_insertion_index_;
-
-  int best_delay = -1;
-  for (size_t delay = 0; delay < covariances_.size(); ++delay) {
-    RTC_DCHECK_LT(read_index, render_power_.size());
-    covariances_[delay].Update(capture_power, capture_mean,
-                               capture_std_deviation, render_power_[read_index],
-                               render_power_mean_[read_index],
-                               render_power_std_dev_[read_index]);
-    read_index = read_index > 0 ? read_index - 1 : kLookbackFrames - 1;
-
-    if (covariances_[delay].normalized_cross_correlation() > echo_likelihood_) {
-      echo_likelihood_ = covariances_[delay].normalized_cross_correlation();
-      best_delay = static_cast<int>(delay);
-    }
-  }
-  // This is a temporary log message to help find the underlying cause for echo
-  // likelihoods > 1.0.
-  // TODO(ivoc): Remove once the issue is resolved.
-  if (echo_likelihood_ > 1.1f) {
-    // Make sure we don't spam the log.
-    if (log_counter_ < 5 && best_delay != -1) {
-      size_t read_index = kLookbackFrames + next_insertion_index_ - best_delay;
-      if (read_index >= kLookbackFrames) {
-        read_index -= kLookbackFrames;
-      }
-      RTC_DCHECK_LT(read_index, render_power_.size());
-      LOG_F(LS_ERROR) << "Echo detector internal state: {"
-                      << "Echo likelihood: " << echo_likelihood_
-                      << ", Best Delay: " << best_delay << ", Covariance: "
-                      << covariances_[best_delay].covariance()
-                      << ", Last capture power: " << capture_power
-                      << ", Capture mean: " << capture_mean
-                      << ", Capture_standard deviation: "
-                      << capture_std_deviation
-                      << ", Last render power: " << render_power_[read_index]
-                      << ", Render mean: " << render_power_mean_[read_index]
-                      << ", Render standard deviation: "
-                      << render_power_std_dev_[read_index]
-                      << ", Reliability: " << reliability_ << "}";
-      log_counter_++;
-    }
-  }
-  RTC_DCHECK_LT(echo_likelihood_, 1.1f);
-
-  reliability_ = (1.0f - kAlpha) * reliability_ + kAlpha * 1.0f;
-  echo_likelihood_ *= reliability_;
-  // This is a temporary fix to prevent echo likelihood values > 1.0.
-  // TODO(ivoc): Find the root cause of this issue and fix it.
-  echo_likelihood_ = std::min(echo_likelihood_, 1.0f);
-  int echo_percentage = static_cast<int>(echo_likelihood_ * 100);
-  RTC_HISTOGRAM_COUNTS("WebRTC.Audio.ResidualEchoDetector.EchoLikelihood",
-                       echo_percentage, 0, 100, 100 /* number of bins */);
-
-  // Update the buffer of recent likelihood values.
-  recent_likelihood_max_.Update(echo_likelihood_);
-
-  // Update the next insertion index.
-  next_insertion_index_ = next_insertion_index_ < (kLookbackFrames - 1)
-                              ? next_insertion_index_ + 1
-                              : 0;
-}
-
-void ResidualEchoDetector::Initialize() {
-  render_buffer_.Clear();
-  std::fill(render_power_.begin(), render_power_.end(), 0.f);
-  std::fill(render_power_mean_.begin(), render_power_mean_.end(), 0.f);
-  std::fill(render_power_std_dev_.begin(), render_power_std_dev_.end(), 0.f);
-  render_statistics_.Clear();
-  capture_statistics_.Clear();
-  recent_likelihood_max_.Clear();
-  for (auto& cov : covariances_) {
-    cov.Clear();
-  }
-  echo_likelihood_ = 0.f;
-  next_insertion_index_ = 0;
-  reliability_ = 0.f;
-}
-
-void ResidualEchoDetector::PackRenderAudioBuffer(
-    AudioBuffer* audio,
-    std::vector<float>* packed_buffer) {
-  packed_buffer->clear();
-  packed_buffer->insert(packed_buffer->end(), audio->channels_f()[0],
-                        audio->channels_f()[0] + audio->num_frames());
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/residual_echo_detector.h b/modules/audio_processing/residual_echo_detector.h
deleted file mode 100644
index 44bc081..0000000
--- a/modules/audio_processing/residual_echo_detector.h
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- *  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_PROCESSING_RESIDUAL_ECHO_DETECTOR_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_RESIDUAL_ECHO_DETECTOR_H_
-
-#include <vector>
-
-#include "webrtc/api/array_view.h"
-#include "webrtc/modules/audio_processing/echo_detector/circular_buffer.h"
-#include "webrtc/modules/audio_processing/echo_detector/mean_variance_estimator.h"
-#include "webrtc/modules/audio_processing/echo_detector/moving_max.h"
-#include "webrtc/modules/audio_processing/echo_detector/normalized_covariance_estimator.h"
-
-namespace webrtc {
-
-class ApmDataDumper;
-class AudioBuffer;
-class EchoDetector;
-
-class ResidualEchoDetector {
- public:
-  ResidualEchoDetector();
-  ~ResidualEchoDetector();
-
-  // This function should be called while holding the render lock.
-  void AnalyzeRenderAudio(rtc::ArrayView<const float> render_audio);
-
-  // This function should be called while holding the capture lock.
-  void AnalyzeCaptureAudio(rtc::ArrayView<const float> capture_audio);
-
-  // This function should be called while holding the capture lock.
-  void Initialize();
-
-  // This function is for testing purposes only.
-  void SetReliabilityForTest(float value) { reliability_ = value; }
-
-  static void PackRenderAudioBuffer(AudioBuffer* audio,
-                                    std::vector<float>* packed_buffer);
-
-  // This function should be called while holding the capture lock.
-  float echo_likelihood() const { return echo_likelihood_; }
-
-  float echo_likelihood_recent_max() const {
-    return recent_likelihood_max_.max();
-  }
-
- private:
-  static int instance_count_;
-  std::unique_ptr<ApmDataDumper> data_dumper_;
-  // Keep track if the |Process| function has been previously called.
-  bool first_process_call_ = true;
-  // Buffer for storing the power of incoming farend buffers. This is needed for
-  // cases where calls to BufferFarend and Process are jittery.
-  CircularBuffer render_buffer_;
-  // Count how long ago it was that the size of |render_buffer_| was zero. This
-  // value is also reset to zero when clock drift is detected and a value from
-  // the renderbuffer is discarded, even though the buffer is not actually zero
-  // at that point. This is done to avoid repeatedly removing elements in this
-  // situation.
-  size_t frames_since_zero_buffer_size_ = 0;
-
-  // Circular buffers containing delayed versions of the power, mean and
-  // standard deviation, for calculating the delayed covariance values.
-  std::vector<float> render_power_;
-  std::vector<float> render_power_mean_;
-  std::vector<float> render_power_std_dev_;
-  // Covariance estimates for different delay values.
-  std::vector<NormalizedCovarianceEstimator> covariances_;
-  // Index where next element should be inserted in all of the above circular
-  // buffers.
-  size_t next_insertion_index_ = 0;
-
-  MeanVarianceEstimator render_statistics_;
-  MeanVarianceEstimator capture_statistics_;
-  // Current echo likelihood.
-  float echo_likelihood_ = 0.f;
-  // Reliability of the current likelihood.
-  float reliability_ = 0.f;
-  MovingMax recent_likelihood_max_;
-
-  int log_counter_ = 0;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_RESIDUAL_ECHO_DETECTOR_H_
diff --git a/modules/audio_processing/residual_echo_detector_complexity_unittest.cc b/modules/audio_processing/residual_echo_detector_complexity_unittest.cc
deleted file mode 100644
index 5d854c4..0000000
--- a/modules/audio_processing/residual_echo_detector_complexity_unittest.cc
+++ /dev/null
@@ -1,190 +0,0 @@
-/*
- *  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 <numeric>
-#include <vector>
-
-#include "webrtc/api/array_view.h"
-#include "webrtc/modules/audio_processing/audio_buffer.h"
-#include "webrtc/modules/audio_processing/include/audio_processing.h"
-#include "webrtc/modules/audio_processing/residual_echo_detector.h"
-#include "webrtc/modules/audio_processing/test/audio_buffer_tools.h"
-#include "webrtc/modules/audio_processing/test/performance_timer.h"
-#include "webrtc/modules/audio_processing/test/simulator_buffers.h"
-#include "webrtc/rtc_base/random.h"
-#include "webrtc/system_wrappers/include/clock.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/testsupport/perf_test.h"
-
-namespace webrtc {
-namespace {
-
-constexpr size_t kNumFramesToProcess = 20000;
-constexpr size_t kNumFramesToProcessStandalone = 50 * kNumFramesToProcess;
-constexpr size_t kProcessingBatchSize = 200;
-constexpr size_t kProcessingBatchSizeStandalone = 50 * kProcessingBatchSize;
-constexpr size_t kNumberOfWarmupMeasurements =
-    (kNumFramesToProcess / kProcessingBatchSize) / 2;
-constexpr size_t kNumberOfWarmupMeasurementsStandalone =
-    (kNumFramesToProcessStandalone / kProcessingBatchSizeStandalone) / 2;
-constexpr int kSampleRate = AudioProcessing::kSampleRate48kHz;
-constexpr int kNumberOfChannels = 1;
-
-std::string FormPerformanceMeasureString(const test::PerformanceTimer& timer,
-                                         int number_of_warmup_samples) {
-  std::string s =
-      std::to_string(timer.GetDurationAverage(number_of_warmup_samples));
-  s += ", ";
-  s += std::to_string(
-      timer.GetDurationStandardDeviation(number_of_warmup_samples));
-  return s;
-}
-
-void RunStandaloneSubmodule() {
-  test::SimulatorBuffers buffers(
-      kSampleRate, kSampleRate, kSampleRate, kSampleRate, kNumberOfChannels,
-      kNumberOfChannels, kNumberOfChannels, kNumberOfChannels);
-  test::PerformanceTimer timer(kNumFramesToProcessStandalone /
-                               kProcessingBatchSizeStandalone);
-
-  ResidualEchoDetector echo_detector;
-  echo_detector.Initialize();
-  float sum = 0.f;
-
-  for (size_t frame_no = 0; frame_no < kNumFramesToProcessStandalone;
-       ++frame_no) {
-    // The first batch of frames are for warming up, and are not part of the
-    // benchmark. After that the processing time is measured in chunks of
-    // kProcessingBatchSize frames.
-    if (frame_no % kProcessingBatchSizeStandalone == 0) {
-      timer.StartTimer();
-    }
-
-    buffers.UpdateInputBuffers();
-    echo_detector.AnalyzeRenderAudio(rtc::ArrayView<const float>(
-        buffers.render_input_buffer->split_bands_const_f(0)[kBand0To8kHz],
-        buffers.render_input_buffer->num_frames_per_band()));
-    echo_detector.AnalyzeCaptureAudio(rtc::ArrayView<const float>(
-        buffers.capture_input_buffer->split_bands_const_f(0)[kBand0To8kHz],
-        buffers.capture_input_buffer->num_frames_per_band()));
-    sum += echo_detector.echo_likelihood();
-
-    if (frame_no % kProcessingBatchSizeStandalone ==
-        kProcessingBatchSizeStandalone - 1) {
-      timer.StopTimer();
-    }
-  }
-  EXPECT_EQ(0.0f, sum);
-  webrtc::test::PrintResultMeanAndError(
-      "echo_detector_call_durations", "", "StandaloneEchoDetector",
-      FormPerformanceMeasureString(timer,
-                                   kNumberOfWarmupMeasurementsStandalone),
-      "us", false);
-}
-
-void RunTogetherWithApm(const std::string& test_description,
-                        bool use_mobile_aec,
-                        bool include_default_apm_processing) {
-  test::SimulatorBuffers buffers(
-      kSampleRate, kSampleRate, kSampleRate, kSampleRate, kNumberOfChannels,
-      kNumberOfChannels, kNumberOfChannels, kNumberOfChannels);
-  test::PerformanceTimer timer(kNumFramesToProcess / kProcessingBatchSize);
-
-  webrtc::Config config;
-  AudioProcessing::Config apm_config;
-  if (include_default_apm_processing) {
-    config.Set<DelayAgnostic>(new DelayAgnostic(true));
-    config.Set<ExtendedFilter>(new ExtendedFilter(true));
-  }
-  apm_config.level_controller.enabled = include_default_apm_processing;
-  apm_config.residual_echo_detector.enabled = true;
-
-  std::unique_ptr<AudioProcessing> apm;
-  apm.reset(AudioProcessing::Create(config));
-  ASSERT_TRUE(apm.get());
-  apm->ApplyConfig(apm_config);
-
-  ASSERT_EQ(AudioProcessing::kNoError,
-            apm->gain_control()->Enable(include_default_apm_processing));
-  if (use_mobile_aec) {
-    ASSERT_EQ(AudioProcessing::kNoError,
-              apm->echo_cancellation()->Enable(false));
-    ASSERT_EQ(AudioProcessing::kNoError, apm->echo_control_mobile()->Enable(
-                                             include_default_apm_processing));
-  } else {
-    ASSERT_EQ(AudioProcessing::kNoError,
-              apm->echo_cancellation()->Enable(include_default_apm_processing));
-    ASSERT_EQ(AudioProcessing::kNoError,
-              apm->echo_control_mobile()->Enable(false));
-  }
-  ASSERT_EQ(AudioProcessing::kNoError,
-            apm->high_pass_filter()->Enable(include_default_apm_processing));
-  ASSERT_EQ(AudioProcessing::kNoError,
-            apm->noise_suppression()->Enable(include_default_apm_processing));
-  ASSERT_EQ(AudioProcessing::kNoError,
-            apm->voice_detection()->Enable(include_default_apm_processing));
-  ASSERT_EQ(AudioProcessing::kNoError,
-            apm->level_estimator()->Enable(include_default_apm_processing));
-
-  StreamConfig stream_config(kSampleRate, kNumberOfChannels, false);
-
-  for (size_t frame_no = 0; frame_no < kNumFramesToProcess; ++frame_no) {
-    // The first batch of frames are for warming up, and are not part of the
-    // benchmark. After that the processing time is measured in chunks of
-    // kProcessingBatchSize frames.
-    if (frame_no % kProcessingBatchSize == 0) {
-      timer.StartTimer();
-    }
-
-    buffers.UpdateInputBuffers();
-
-    ASSERT_EQ(
-        AudioProcessing::kNoError,
-        apm->ProcessReverseStream(&buffers.render_input[0], stream_config,
-                                  stream_config, &buffers.render_output[0]));
-
-    ASSERT_EQ(AudioProcessing::kNoError, apm->set_stream_delay_ms(0));
-    if (include_default_apm_processing) {
-      apm->gain_control()->set_stream_analog_level(0);
-      if (!use_mobile_aec) {
-        apm->echo_cancellation()->set_stream_drift_samples(0);
-      }
-    }
-    ASSERT_EQ(AudioProcessing::kNoError,
-              apm->ProcessStream(&buffers.capture_input[0], stream_config,
-                                 stream_config, &buffers.capture_output[0]));
-
-    if (frame_no % kProcessingBatchSize == kProcessingBatchSize - 1) {
-      timer.StopTimer();
-    }
-  }
-
-  webrtc::test::PrintResultMeanAndError(
-      "echo_detector_call_durations", "_total", test_description,
-      FormPerformanceMeasureString(timer, kNumberOfWarmupMeasurements), "us",
-      false);
-}
-
-}  // namespace
-
-TEST(EchoDetectorPerformanceTest, StandaloneProcessing) {
-  RunStandaloneSubmodule();
-}
-
-TEST(EchoDetectorPerformanceTest, ProcessingViaApm) {
-  RunTogetherWithApm("SimpleEchoDetectorViaApm", false, false);
-}
-
-TEST(EchoDetectorPerformanceTest, InteractionWithDefaultApm) {
-  RunTogetherWithApm("EchoDetectorAndDefaultDesktopApm", false, true);
-  RunTogetherWithApm("EchoDetectorAndDefaultMobileApm", true, true);
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/residual_echo_detector_unittest.cc b/modules/audio_processing/residual_echo_detector_unittest.cc
deleted file mode 100644
index 0784a4f..0000000
--- a/modules/audio_processing/residual_echo_detector_unittest.cc
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- *  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 <vector>
-
-#include "webrtc/modules/audio_processing/residual_echo_detector.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-TEST(ResidualEchoDetectorTests, Echo) {
-  ResidualEchoDetector echo_detector;
-  echo_detector.SetReliabilityForTest(1.0f);
-  std::vector<float> ones(160, 1.f);
-  std::vector<float> zeros(160, 0.f);
-
-  // In this test the capture signal has a delay of 10 frames w.r.t. the render
-  // signal, but is otherwise identical. Both signals are periodic with a 20
-  // frame interval.
-  for (int i = 0; i < 1000; i++) {
-    if (i % 20 == 0) {
-      echo_detector.AnalyzeRenderAudio(ones);
-      echo_detector.AnalyzeCaptureAudio(zeros);
-    } else if (i % 20 == 10) {
-      echo_detector.AnalyzeRenderAudio(zeros);
-      echo_detector.AnalyzeCaptureAudio(ones);
-    } else {
-      echo_detector.AnalyzeRenderAudio(zeros);
-      echo_detector.AnalyzeCaptureAudio(zeros);
-    }
-  }
-  // We expect to detect echo with near certain likelihood.
-  EXPECT_NEAR(1.f, echo_detector.echo_likelihood(), 0.01f);
-}
-
-TEST(ResidualEchoDetectorTests, NoEcho) {
-  ResidualEchoDetector echo_detector;
-  echo_detector.SetReliabilityForTest(1.0f);
-  std::vector<float> ones(160, 1.f);
-  std::vector<float> zeros(160, 0.f);
-
-  // In this test the capture signal is always zero, so no echo should be
-  // detected.
-  for (int i = 0; i < 1000; i++) {
-    if (i % 20 == 0) {
-      echo_detector.AnalyzeRenderAudio(ones);
-    } else {
-      echo_detector.AnalyzeRenderAudio(zeros);
-    }
-    echo_detector.AnalyzeCaptureAudio(zeros);
-  }
-  // We expect to not detect any echo.
-  EXPECT_NEAR(0.f, echo_detector.echo_likelihood(), 0.01f);
-}
-
-TEST(ResidualEchoDetectorTests, EchoWithRenderClockDrift) {
-  ResidualEchoDetector echo_detector;
-  echo_detector.SetReliabilityForTest(1.0f);
-  std::vector<float> ones(160, 1.f);
-  std::vector<float> zeros(160, 0.f);
-
-  // In this test the capture signal has a delay of 10 frames w.r.t. the render
-  // signal, but is otherwise identical. Both signals are periodic with a 20
-  // frame interval. There is a simulated clock drift of 1% in this test, with
-  // the render side producing data slightly faster.
-  for (int i = 0; i < 1000; i++) {
-    if (i % 20 == 0) {
-      echo_detector.AnalyzeRenderAudio(ones);
-      echo_detector.AnalyzeCaptureAudio(zeros);
-    } else if (i % 20 == 10) {
-      echo_detector.AnalyzeRenderAudio(zeros);
-      echo_detector.AnalyzeCaptureAudio(ones);
-    } else {
-      echo_detector.AnalyzeRenderAudio(zeros);
-      echo_detector.AnalyzeCaptureAudio(zeros);
-    }
-    if (i % 100 == 0) {
-      // This is causing the simulated clock drift.
-      echo_detector.AnalyzeRenderAudio(zeros);
-    }
-  }
-  // We expect to detect echo with high likelihood. Clock drift is harder to
-  // correct on the render side than on the capture side. This is due to the
-  // render buffer, clock drift can only be discovered after a certain delay.
-  // A growing buffer can be caused by jitter or clock drift and it's not
-  // possible to make this decision right away. For this reason we only expect
-  // an echo likelihood of 75% in this test.
-  EXPECT_GT(echo_detector.echo_likelihood(), 0.75f);
-}
-
-TEST(ResidualEchoDetectorTests, EchoWithCaptureClockDrift) {
-  ResidualEchoDetector echo_detector;
-  echo_detector.SetReliabilityForTest(1.0f);
-  std::vector<float> ones(160, 1.f);
-  std::vector<float> zeros(160, 0.f);
-
-  // In this test the capture signal has a delay of 10 frames w.r.t. the render
-  // signal, but is otherwise identical. Both signals are periodic with a 20
-  // frame interval. There is a simulated clock drift of 1% in this test, with
-  // the capture side producing data slightly faster.
-  for (int i = 0; i < 1000; i++) {
-    if (i % 20 == 0) {
-      echo_detector.AnalyzeRenderAudio(ones);
-      echo_detector.AnalyzeCaptureAudio(zeros);
-    } else if (i % 20 == 10) {
-      echo_detector.AnalyzeRenderAudio(zeros);
-      echo_detector.AnalyzeCaptureAudio(ones);
-    } else {
-      echo_detector.AnalyzeRenderAudio(zeros);
-      echo_detector.AnalyzeCaptureAudio(zeros);
-    }
-    if (i % 100 == 0) {
-      // This is causing the simulated clock drift.
-      echo_detector.AnalyzeCaptureAudio(zeros);
-    }
-  }
-  // We expect to detect echo with near certain likelihood.
-  EXPECT_NEAR(1.f, echo_detector.echo_likelihood(), 0.01f);
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/rms_level.cc b/modules/audio_processing/rms_level.cc
deleted file mode 100644
index 391843c..0000000
--- a/modules/audio_processing/rms_level.cc
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- *  Copyright (c) 2014 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_processing/rms_level.h"
-
-#include <math.h>
-#include <algorithm>
-#include <numeric>
-
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-namespace {
-static constexpr float kMaxSquaredLevel = 32768 * 32768;
-// kMinLevel is the level corresponding to kMinLevelDb, that is 10^(-127/10).
-static constexpr float kMinLevel = 1.995262314968883e-13f;
-
-// Calculates the normalized RMS value from a mean square value. The input
-// should be the sum of squared samples divided by the number of samples. The
-// value will be normalized to full range before computing the RMS, wich is
-// returned as a negated dBfs. That is, 0 is full amplitude while 127 is very
-// faint.
-int ComputeRms(float mean_square) {
-  if (mean_square <= kMinLevel * kMaxSquaredLevel) {
-    // Very faint; simply return the minimum value.
-    return RmsLevel::kMinLevelDb;
-  }
-  // Normalize by the max level.
-  const float mean_square_norm = mean_square / kMaxSquaredLevel;
-  RTC_DCHECK_GT(mean_square_norm, kMinLevel);
-  // 20log_10(x^0.5) = 10log_10(x)
-  const float rms = 10.f * log10(mean_square_norm);
-  RTC_DCHECK_LE(rms, 0.f);
-  RTC_DCHECK_GT(rms, -RmsLevel::kMinLevelDb);
-  // Return the negated value.
-  return static_cast<int>(-rms + 0.5f);
-}
-}  // namespace
-
-RmsLevel::RmsLevel() {
-  Reset();
-}
-
-RmsLevel::~RmsLevel() = default;
-
-void RmsLevel::Reset() {
-  sum_square_ = 0.f;
-  sample_count_ = 0;
-  max_sum_square_ = 0.f;
-  block_size_ = rtc::Optional<size_t>();
-}
-
-void RmsLevel::Analyze(rtc::ArrayView<const int16_t> data) {
-  if (data.empty()) {
-    return;
-  }
-
-  CheckBlockSize(data.size());
-
-  const float sum_square =
-      std::accumulate(data.begin(), data.end(), 0.f,
-                      [](float a, int16_t b) { return a + b * b; });
-  RTC_DCHECK_GE(sum_square, 0.f);
-  sum_square_ += sum_square;
-  sample_count_ += data.size();
-
-  max_sum_square_ = std::max(max_sum_square_, sum_square);
-}
-
-void RmsLevel::AnalyzeMuted(size_t length) {
-  CheckBlockSize(length);
-  sample_count_ += length;
-}
-
-int RmsLevel::Average() {
-  int rms = (sample_count_ == 0) ? RmsLevel::kMinLevelDb
-                                 : ComputeRms(sum_square_ / sample_count_);
-  Reset();
-  return rms;
-}
-
-RmsLevel::Levels RmsLevel::AverageAndPeak() {
-  // Note that block_size_ should by design always be non-empty when
-  // sample_count_ != 0. Also, the * operator of rtc::Optional enforces this
-  // with a DCHECK.
-  Levels levels = (sample_count_ == 0)
-                      ? Levels{RmsLevel::kMinLevelDb, RmsLevel::kMinLevelDb}
-                      : Levels{ComputeRms(sum_square_ / sample_count_),
-                               ComputeRms(max_sum_square_ / *block_size_)};
-  Reset();
-  return levels;
-}
-
-void RmsLevel::CheckBlockSize(size_t block_size) {
-  if (block_size_ != rtc::Optional<size_t>(block_size)) {
-    Reset();
-    block_size_ = rtc::Optional<size_t>(block_size);
-  }
-}
-}  // namespace webrtc
diff --git a/modules/audio_processing/rms_level.h b/modules/audio_processing/rms_level.h
deleted file mode 100644
index e0df754..0000000
--- a/modules/audio_processing/rms_level.h
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- *  Copyright (c) 2014 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_PROCESSING_RMS_LEVEL_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_RMS_LEVEL_H_
-
-#include "webrtc/api/array_view.h"
-#include "webrtc/api/optional.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-// Computes the root mean square (RMS) level in dBFs (decibels from digital
-// full-scale) of audio data. The computation follows RFC 6465:
-// https://tools.ietf.org/html/rfc6465
-// with the intent that it can provide the RTP audio level indication.
-//
-// The expected approach is to provide constant-sized chunks of audio to
-// Analyze(). When enough chunks have been accumulated to form a packet, call
-// Average() to get the audio level indicator for the RTP header.
-class RmsLevel {
- public:
-  struct Levels {
-    int average;
-    int peak;
-  };
-
-  static constexpr int kMinLevelDb = 127;
-
-  RmsLevel();
-  ~RmsLevel();
-
-  // Can be called to reset internal states, but is not required during normal
-  // operation.
-  void Reset();
-
-  // Pass each chunk of audio to Analyze() to accumulate the level.
-  void Analyze(rtc::ArrayView<const int16_t> data);
-
-  // If all samples with the given |length| have a magnitude of zero, this is
-  // a shortcut to avoid some computation.
-  void AnalyzeMuted(size_t length);
-
-  // Computes the RMS level over all data passed to Analyze() since the last
-  // call to Average(). The returned value is positive but should be interpreted
-  // as negative as per the RFC. It is constrained to [0, 127]. Resets the
-  // internal state to start a new measurement period.
-  int Average();
-
-  // Like Average() above, but also returns the RMS peak value. Resets the
-  // internal state to start a new measurement period.
-  Levels AverageAndPeak();
-
- private:
-  // Compares |block_size| with |block_size_|. If they are different, calls
-  // Reset() and stores the new size.
-  void CheckBlockSize(size_t block_size);
-
-  float sum_square_;
-  size_t sample_count_;
-  float max_sum_square_;
-  rtc::Optional<size_t> block_size_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_RMS_LEVEL_H_
-
diff --git a/modules/audio_processing/rms_level_unittest.cc b/modules/audio_processing/rms_level_unittest.cc
deleted file mode 100644
index 9d1f205..0000000
--- a/modules/audio_processing/rms_level_unittest.cc
+++ /dev/null
@@ -1,150 +0,0 @@
-/*
- *  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 <cmath>
-#include <memory>
-#include <vector>
-
-#include "webrtc/api/array_view.h"
-#include "webrtc/modules/audio_processing/rms_level.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/mathutils.h"
-#include "webrtc/rtc_base/safe_conversions.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-namespace {
-constexpr int kSampleRateHz = 48000;
-constexpr size_t kBlockSizeSamples = kSampleRateHz / 100;
-
-std::unique_ptr<RmsLevel> RunTest(rtc::ArrayView<const int16_t> input) {
-  std::unique_ptr<RmsLevel> level(new RmsLevel);
-  for (size_t n = 0; n + kBlockSizeSamples <= input.size();
-       n += kBlockSizeSamples) {
-    level->Analyze(input.subview(n, kBlockSizeSamples));
-  }
-  return level;
-}
-
-std::vector<int16_t> CreateSinusoid(int frequency_hz,
-                                    int amplitude,
-                                    size_t num_samples) {
-  std::vector<int16_t> x(num_samples);
-  for (size_t n = 0; n < num_samples; ++n) {
-    x[n] = rtc::saturated_cast<int16_t>(
-        amplitude * std::sin(2 * M_PI * n * frequency_hz / kSampleRateHz));
-  }
-  return x;
-}
-}  // namespace
-
-TEST(RmsLevelTest, Run1000HzFullScale) {
-  auto x = CreateSinusoid(1000, INT16_MAX, kSampleRateHz);
-  auto level = RunTest(x);
-  EXPECT_EQ(3, level->Average());  // -3 dBFS
-}
-
-TEST(RmsLevelTest, Run1000HzFullScaleAverageAndPeak) {
-  auto x = CreateSinusoid(1000, INT16_MAX, kSampleRateHz);
-  auto level = RunTest(x);
-  auto stats = level->AverageAndPeak();
-  EXPECT_EQ(3, stats.average);  // -3 dBFS
-  EXPECT_EQ(3, stats.peak);
-}
-
-TEST(RmsLevelTest, Run1000HzHalfScale) {
-  auto x = CreateSinusoid(1000, INT16_MAX / 2, kSampleRateHz);
-  auto level = RunTest(x);
-  EXPECT_EQ(9, level->Average());  // -9 dBFS
-}
-
-TEST(RmsLevelTest, RunZeros) {
-  std::vector<int16_t> x(kSampleRateHz, 0);  // 1 second of pure silence.
-  auto level = RunTest(x);
-  EXPECT_EQ(127, level->Average());
-}
-
-TEST(RmsLevelTest, RunZerosAverageAndPeak) {
-  std::vector<int16_t> x(kSampleRateHz, 0);  // 1 second of pure silence.
-  auto level = RunTest(x);
-  auto stats = level->AverageAndPeak();
-  EXPECT_EQ(127, stats.average);
-  EXPECT_EQ(127, stats.peak);
-}
-
-TEST(RmsLevelTest, NoSamples) {
-  RmsLevel level;
-  EXPECT_EQ(127, level.Average());  // Return minimum if no samples are given.
-}
-
-TEST(RmsLevelTest, NoSamplesAverageAndPeak) {
-  RmsLevel level;
-  auto stats = level.AverageAndPeak();
-  EXPECT_EQ(127, stats.average);
-  EXPECT_EQ(127, stats.peak);
-}
-
-TEST(RmsLevelTest, PollTwice) {
-  auto x = CreateSinusoid(1000, INT16_MAX, kSampleRateHz);
-  auto level = RunTest(x);
-  level->Average();
-  EXPECT_EQ(127, level->Average());  // Stats should be reset at this point.
-}
-
-TEST(RmsLevelTest, Reset) {
-  auto x = CreateSinusoid(1000, INT16_MAX, kSampleRateHz);
-  auto level = RunTest(x);
-  level->Reset();
-  EXPECT_EQ(127, level->Average());  // Stats should be reset at this point.
-}
-
-// Inserts 1 second of full-scale sinusoid, followed by 1 second of muted.
-TEST(RmsLevelTest, ProcessMuted) {
-  auto x = CreateSinusoid(1000, INT16_MAX, kSampleRateHz);
-  auto level = RunTest(x);
-  const size_t kBlocksPerSecond = rtc::CheckedDivExact(
-      static_cast<size_t>(kSampleRateHz), kBlockSizeSamples);
-  for (size_t i = 0; i < kBlocksPerSecond; ++i) {
-    level->AnalyzeMuted(kBlockSizeSamples);
-  }
-  EXPECT_EQ(6, level->Average());  // Average RMS halved due to the silence.
-}
-
-// Inserts 1 second of half-scale sinusoid, follwed by 10 ms of full-scale, and
-// finally 1 second of half-scale again. Expect the average to be -9 dBFS due
-// to the vast majority of the signal being half-scale, and the peak to be
-// -3 dBFS.
-TEST(RmsLevelTest, RunHalfScaleAndInsertFullScale) {
-  auto half_scale = CreateSinusoid(1000, INT16_MAX / 2, kSampleRateHz);
-  auto full_scale = CreateSinusoid(1000, INT16_MAX, kSampleRateHz / 100);
-  auto x = half_scale;
-  x.insert(x.end(), full_scale.begin(), full_scale.end());
-  x.insert(x.end(), half_scale.begin(), half_scale.end());
-  ASSERT_EQ(static_cast<size_t>(2 * kSampleRateHz + kSampleRateHz / 100),
-            x.size());
-  auto level = RunTest(x);
-  auto stats = level->AverageAndPeak();
-  EXPECT_EQ(9, stats.average);
-  EXPECT_EQ(3, stats.peak);
-}
-
-TEST(RmsLevelTest, ResetOnBlockSizeChange) {
-  auto x = CreateSinusoid(1000, INT16_MAX, kSampleRateHz);
-  auto level = RunTest(x);
-  // Create a new signal with half amplitude, but double block length.
-  auto y = CreateSinusoid(1000, INT16_MAX / 2, kBlockSizeSamples * 2);
-  level->Analyze(y);
-  auto stats = level->AverageAndPeak();
-  // Expect all stats to only be influenced by the last signal (y), since the
-  // changed block size should reset the stats.
-  EXPECT_EQ(9, stats.average);
-  EXPECT_EQ(9, stats.peak);
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/splitting_filter.cc b/modules/audio_processing/splitting_filter.cc
deleted file mode 100644
index 203201e..0000000
--- a/modules/audio_processing/splitting_filter.cc
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- *  Copyright (c) 2014 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_processing/splitting_filter.h"
-
-#include "webrtc/common_audio/channel_buffer.h"
-#include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-
-SplittingFilter::SplittingFilter(size_t num_channels,
-                                 size_t num_bands,
-                                 size_t num_frames)
-    : num_bands_(num_bands) {
-  RTC_CHECK(num_bands_ == 2 || num_bands_ == 3);
-  if (num_bands_ == 2) {
-    two_bands_states_.resize(num_channels);
-  } else if (num_bands_ == 3) {
-    for (size_t i = 0; i < num_channels; ++i) {
-      three_band_filter_banks_.push_back(std::unique_ptr<ThreeBandFilterBank>(
-          new ThreeBandFilterBank(num_frames)));
-    }
-  }
-}
-
-SplittingFilter::~SplittingFilter() = default;
-
-void SplittingFilter::Analysis(const IFChannelBuffer* data,
-                               IFChannelBuffer* bands) {
-  RTC_DCHECK_EQ(num_bands_, bands->num_bands());
-  RTC_DCHECK_EQ(data->num_channels(), bands->num_channels());
-  RTC_DCHECK_EQ(data->num_frames(),
-                bands->num_frames_per_band() * bands->num_bands());
-  if (bands->num_bands() == 2) {
-    TwoBandsAnalysis(data, bands);
-  } else if (bands->num_bands() == 3) {
-    ThreeBandsAnalysis(data, bands);
-  }
-}
-
-void SplittingFilter::Synthesis(const IFChannelBuffer* bands,
-                                IFChannelBuffer* data) {
-  RTC_DCHECK_EQ(num_bands_, bands->num_bands());
-  RTC_DCHECK_EQ(data->num_channels(), bands->num_channels());
-  RTC_DCHECK_EQ(data->num_frames(),
-                bands->num_frames_per_band() * bands->num_bands());
-  if (bands->num_bands() == 2) {
-    TwoBandsSynthesis(bands, data);
-  } else if (bands->num_bands() == 3) {
-    ThreeBandsSynthesis(bands, data);
-  }
-}
-
-void SplittingFilter::TwoBandsAnalysis(const IFChannelBuffer* data,
-                                       IFChannelBuffer* bands) {
-  RTC_DCHECK_EQ(two_bands_states_.size(), data->num_channels());
-  for (size_t i = 0; i < two_bands_states_.size(); ++i) {
-    WebRtcSpl_AnalysisQMF(data->ibuf_const()->channels()[i],
-                          data->num_frames(),
-                          bands->ibuf()->channels(0)[i],
-                          bands->ibuf()->channels(1)[i],
-                          two_bands_states_[i].analysis_state1,
-                          two_bands_states_[i].analysis_state2);
-  }
-}
-
-void SplittingFilter::TwoBandsSynthesis(const IFChannelBuffer* bands,
-                                        IFChannelBuffer* data) {
-  RTC_DCHECK_LE(data->num_channels(), two_bands_states_.size());
-  for (size_t i = 0; i < data->num_channels(); ++i) {
-    WebRtcSpl_SynthesisQMF(bands->ibuf_const()->channels(0)[i],
-                           bands->ibuf_const()->channels(1)[i],
-                           bands->num_frames_per_band(),
-                           data->ibuf()->channels()[i],
-                           two_bands_states_[i].synthesis_state1,
-                           two_bands_states_[i].synthesis_state2);
-  }
-}
-
-void SplittingFilter::ThreeBandsAnalysis(const IFChannelBuffer* data,
-                                         IFChannelBuffer* bands) {
-  RTC_DCHECK_EQ(three_band_filter_banks_.size(), data->num_channels());
-  for (size_t i = 0; i < three_band_filter_banks_.size(); ++i) {
-    three_band_filter_banks_[i]->Analysis(data->fbuf_const()->channels()[i],
-                                          data->num_frames(),
-                                          bands->fbuf()->bands(i));
-  }
-}
-
-void SplittingFilter::ThreeBandsSynthesis(const IFChannelBuffer* bands,
-                                          IFChannelBuffer* data) {
-  RTC_DCHECK_LE(data->num_channels(), three_band_filter_banks_.size());
-  for (size_t i = 0; i < data->num_channels(); ++i) {
-    three_band_filter_banks_[i]->Synthesis(bands->fbuf_const()->bands(i),
-                                           bands->num_frames_per_band(),
-                                           data->fbuf()->channels()[i]);
-  }
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/splitting_filter.h b/modules/audio_processing/splitting_filter.h
deleted file mode 100644
index 2d3750a..0000000
--- a/modules/audio_processing/splitting_filter.h
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- *  Copyright (c) 2014 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_PROCESSING_SPLITTING_FILTER_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_SPLITTING_FILTER_H_
-
-#include <cstring>
-#include <memory>
-#include <vector>
-
-#include "webrtc/modules/audio_processing/three_band_filter_bank.h"
-
-namespace webrtc {
-
-class IFChannelBuffer;
-
-struct TwoBandsStates {
-  TwoBandsStates() {
-    memset(analysis_state1, 0, sizeof(analysis_state1));
-    memset(analysis_state2, 0, sizeof(analysis_state2));
-    memset(synthesis_state1, 0, sizeof(synthesis_state1));
-    memset(synthesis_state2, 0, sizeof(synthesis_state2));
-  }
-
-  static const int kStateSize = 6;
-  int analysis_state1[kStateSize];
-  int analysis_state2[kStateSize];
-  int synthesis_state1[kStateSize];
-  int synthesis_state2[kStateSize];
-};
-
-// Splitting filter which is able to split into and merge from 2 or 3 frequency
-// bands. The number of channels needs to be provided at construction time.
-//
-// For each block, Analysis() is called to split into bands and then Synthesis()
-// to merge these bands again. The input and output signals are contained in
-// IFChannelBuffers and for the different bands an array of IFChannelBuffers is
-// used.
-class SplittingFilter {
- public:
-  SplittingFilter(size_t num_channels, size_t num_bands, size_t num_frames);
-  ~SplittingFilter();
-
-  void Analysis(const IFChannelBuffer* data, IFChannelBuffer* bands);
-  void Synthesis(const IFChannelBuffer* bands, IFChannelBuffer* data);
-
- private:
-  // Two-band analysis and synthesis work for 640 samples or less.
-  void TwoBandsAnalysis(const IFChannelBuffer* data, IFChannelBuffer* bands);
-  void TwoBandsSynthesis(const IFChannelBuffer* bands, IFChannelBuffer* data);
-  void ThreeBandsAnalysis(const IFChannelBuffer* data, IFChannelBuffer* bands);
-  void ThreeBandsSynthesis(const IFChannelBuffer* bands, IFChannelBuffer* data);
-  void InitBuffers();
-
-  const size_t num_bands_;
-  std::vector<TwoBandsStates> two_bands_states_;
-  std::vector<std::unique_ptr<ThreeBandFilterBank>> three_band_filter_banks_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_SPLITTING_FILTER_H_
diff --git a/modules/audio_processing/splitting_filter_unittest.cc b/modules/audio_processing/splitting_filter_unittest.cc
deleted file mode 100644
index ce07031..0000000
--- a/modules/audio_processing/splitting_filter_unittest.cc
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- *  Copyright (c) 2014 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.
- */
-
-// MSVC++ requires this to be set before any other includes to get M_PI.
-#define _USE_MATH_DEFINES
-
-#include <cmath>
-
-#include "webrtc/common_audio/channel_buffer.h"
-#include "webrtc/modules/audio_processing/splitting_filter.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-namespace {
-
-const size_t kSamplesPer16kHzChannel = 160;
-const size_t kSamplesPer48kHzChannel = 480;
-
-}  // namespace
-
-// Generates a signal from presence or absence of sine waves of different
-// frequencies.
-// Splits into 3 bands and checks their presence or absence.
-// Recombines the bands.
-// Calculates the delay.
-// Checks that the cross correlation of input and output is high enough at the
-// calculated delay.
-TEST(SplittingFilterTest, SplitsIntoThreeBandsAndReconstructs) {
-  static const int kChannels = 1;
-  static const int kSampleRateHz = 48000;
-  static const size_t kNumBands = 3;
-  static const int kFrequenciesHz[kNumBands] = {1000, 12000, 18000};
-  static const float kAmplitude = 8192.f;
-  static const size_t kChunks = 8;
-  SplittingFilter splitting_filter(kChannels,
-                                   kNumBands,
-                                   kSamplesPer48kHzChannel);
-  IFChannelBuffer in_data(kSamplesPer48kHzChannel, kChannels, kNumBands);
-  IFChannelBuffer bands(kSamplesPer48kHzChannel, kChannels, kNumBands);
-  IFChannelBuffer out_data(kSamplesPer48kHzChannel, kChannels, kNumBands);
-  for (size_t i = 0; i < kChunks; ++i) {
-    // Input signal generation.
-    bool is_present[kNumBands];
-    memset(in_data.fbuf()->channels()[0],
-           0,
-           kSamplesPer48kHzChannel * sizeof(in_data.fbuf()->channels()[0][0]));
-    for (size_t j = 0; j < kNumBands; ++j) {
-      is_present[j] = i & (static_cast<size_t>(1) << j);
-      float amplitude = is_present[j] ? kAmplitude : 0.f;
-      for (size_t k = 0; k < kSamplesPer48kHzChannel; ++k) {
-        in_data.fbuf()->channels()[0][k] +=
-            amplitude * sin(2.f * M_PI * kFrequenciesHz[j] *
-                (i * kSamplesPer48kHzChannel + k) / kSampleRateHz);
-      }
-    }
-    // Three band splitting filter.
-    splitting_filter.Analysis(&in_data, &bands);
-    // Energy calculation.
-    float energy[kNumBands];
-    for (size_t j = 0; j < kNumBands; ++j) {
-      energy[j] = 0.f;
-      for (size_t k = 0; k < kSamplesPer16kHzChannel; ++k) {
-        energy[j] += bands.fbuf_const()->channels(j)[0][k] *
-                     bands.fbuf_const()->channels(j)[0][k];
-      }
-      energy[j] /= kSamplesPer16kHzChannel;
-      if (is_present[j]) {
-        EXPECT_GT(energy[j], kAmplitude * kAmplitude / 4);
-      } else {
-        EXPECT_LT(energy[j], kAmplitude * kAmplitude / 4);
-      }
-    }
-    // Three band merge.
-    splitting_filter.Synthesis(&bands, &out_data);
-    // Delay and cross correlation estimation.
-    float xcorr = 0.f;
-    for (size_t delay = 0; delay < kSamplesPer48kHzChannel; ++delay) {
-      float tmpcorr = 0.f;
-      for (size_t j = delay; j < kSamplesPer48kHzChannel; ++j) {
-        tmpcorr += in_data.fbuf_const()->channels()[0][j - delay] *
-                   out_data.fbuf_const()->channels()[0][j];
-      }
-      tmpcorr /= kSamplesPer48kHzChannel;
-      if (tmpcorr > xcorr) {
-        xcorr = tmpcorr;
-      }
-    }
-    // High cross correlation check.
-    bool any_present = false;
-    for (size_t j = 0; j < kNumBands; ++j) {
-      any_present |= is_present[j];
-    }
-    if (any_present) {
-      EXPECT_GT(xcorr, kAmplitude * kAmplitude / 4);
-    }
-  }
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/test/aec_dump_based_simulator.cc b/modules/audio_processing/test/aec_dump_based_simulator.cc
deleted file mode 100644
index 40df9aa..0000000
--- a/modules/audio_processing/test/aec_dump_based_simulator.cc
+++ /dev/null
@@ -1,586 +0,0 @@
-/*
- *  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 <iostream>
-
-#include "webrtc/modules/audio_processing/test/aec_dump_based_simulator.h"
-
-#include "webrtc/modules/audio_processing/test/protobuf_utils.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/test/testsupport/trace_to_stderr.h"
-
-namespace webrtc {
-namespace test {
-namespace {
-
-// Verify output bitexactness for the fixed interface.
-// TODO(peah): Check whether it would make sense to add a threshold
-// to use for checking the bitexactness in a soft manner.
-bool VerifyFixedBitExactness(const webrtc::audioproc::Stream& msg,
-                             const AudioFrame& frame) {
-  if ((sizeof(int16_t) * frame.samples_per_channel_ * frame.num_channels_) !=
-      msg.output_data().size()) {
-    return false;
-  } else {
-    const int16_t* frame_data = frame.data();
-    for (size_t k = 0; k < frame.num_channels_ * frame.samples_per_channel_;
-         ++k) {
-      if (msg.output_data().data()[k] != frame_data[k]) {
-        return false;
-      }
-    }
-  }
-  return true;
-}
-
-// Verify output bitexactness for the float interface.
-bool VerifyFloatBitExactness(const webrtc::audioproc::Stream& msg,
-                             const StreamConfig& out_config,
-                             const ChannelBuffer<float>& out_buf) {
-  if (static_cast<size_t>(msg.output_channel_size()) !=
-          out_config.num_channels() ||
-      msg.output_channel(0).size() != out_config.num_frames()) {
-    return false;
-  } else {
-    for (int ch = 0; ch < msg.output_channel_size(); ++ch) {
-      for (size_t sample = 0; sample < out_config.num_frames(); ++sample) {
-        if (msg.output_channel(ch).data()[sample] !=
-            out_buf.channels()[ch][sample]) {
-          return false;
-        }
-      }
-    }
-  }
-  return true;
-}
-
-}  // namespace
-
-AecDumpBasedSimulator::AecDumpBasedSimulator(const SimulationSettings& settings)
-    : AudioProcessingSimulator(settings) {}
-
-AecDumpBasedSimulator::~AecDumpBasedSimulator() = default;
-
-void AecDumpBasedSimulator::PrepareProcessStreamCall(
-    const webrtc::audioproc::Stream& msg,
-    bool* set_stream_analog_level_called) {
-  if (msg.has_input_data()) {
-    // Fixed interface processing.
-    // Verify interface invariance.
-    RTC_CHECK(interface_used_ == InterfaceType::kFixedInterface ||
-              interface_used_ == InterfaceType::kNotSpecified);
-    interface_used_ = InterfaceType::kFixedInterface;
-
-    // Populate input buffer.
-    RTC_CHECK_EQ(sizeof(*fwd_frame_.data()) * fwd_frame_.samples_per_channel_ *
-                     fwd_frame_.num_channels_,
-                 msg.input_data().size());
-    memcpy(fwd_frame_.mutable_data(), msg.input_data().data(),
-           msg.input_data().size());
-  } else {
-    // Float interface processing.
-    // Verify interface invariance.
-    RTC_CHECK(interface_used_ == InterfaceType::kFloatInterface ||
-              interface_used_ == InterfaceType::kNotSpecified);
-    interface_used_ = InterfaceType::kFloatInterface;
-
-    RTC_CHECK_EQ(in_buf_->num_channels(),
-                 static_cast<size_t>(msg.input_channel_size()));
-
-    // Populate input buffer.
-    for (size_t i = 0; i < in_buf_->num_channels(); ++i) {
-      RTC_CHECK_EQ(in_buf_->num_frames() * sizeof(*in_buf_->channels()[i]),
-                   msg.input_channel(i).size());
-      std::memcpy(in_buf_->channels()[i], msg.input_channel(i).data(),
-                  msg.input_channel(i).size());
-    }
-  }
-
-  if (artificial_nearend_buffer_reader_) {
-    if (artificial_nearend_buffer_reader_->Read(
-            artificial_nearend_buf_.get())) {
-      if (msg.has_input_data()) {
-        int16_t* fwd_frame_data = fwd_frame_.mutable_data();
-        for (size_t k = 0; k < in_buf_->num_frames(); ++k) {
-          fwd_frame_data[k] = rtc::saturated_cast<int16_t>(
-              fwd_frame_data[k] +
-              static_cast<int16_t>(32767 *
-                                   artificial_nearend_buf_->channels()[0][k]));
-        }
-      } else {
-        for (int i = 0; i < msg.input_channel_size(); ++i) {
-          for (size_t k = 0; k < in_buf_->num_frames(); ++k) {
-            in_buf_->channels()[i][k] +=
-                artificial_nearend_buf_->channels()[0][k];
-            in_buf_->channels()[i][k] = std::min(
-                32767.f, std::max(-32768.f, in_buf_->channels()[i][k]));
-          }
-        }
-      }
-    } else {
-      if (!artificial_nearend_eof_reported_) {
-        std::cout << "The artificial nearend file ended before the recording.";
-        artificial_nearend_eof_reported_ = true;
-      }
-    }
-  }
-
-  if (!settings_.stream_delay) {
-    if (msg.has_delay()) {
-      RTC_CHECK_EQ(AudioProcessing::kNoError,
-                   ap_->set_stream_delay_ms(msg.delay()));
-    }
-  } else {
-    RTC_CHECK_EQ(AudioProcessing::kNoError,
-                 ap_->set_stream_delay_ms(*settings_.stream_delay));
-  }
-
-  if (!settings_.stream_drift_samples) {
-    if (msg.has_drift()) {
-      ap_->echo_cancellation()->set_stream_drift_samples(msg.drift());
-    }
-  } else {
-    ap_->echo_cancellation()->set_stream_drift_samples(
-        *settings_.stream_drift_samples);
-  }
-
-  if (!settings_.use_ts) {
-    if (msg.has_keypress()) {
-      ap_->set_stream_key_pressed(msg.keypress());
-    }
-  } else {
-    ap_->set_stream_key_pressed(*settings_.use_ts);
-  }
-
-  // TODO(peah): Add support for controlling the analog level via the
-  // command-line.
-  if (msg.has_level()) {
-    RTC_CHECK_EQ(AudioProcessing::kNoError,
-                 ap_->gain_control()->set_stream_analog_level(msg.level()));
-    *set_stream_analog_level_called = true;
-  } else {
-    *set_stream_analog_level_called = false;
-  }
-}
-
-void AecDumpBasedSimulator::VerifyProcessStreamBitExactness(
-    const webrtc::audioproc::Stream& msg) {
-  if (bitexact_output_) {
-    if (interface_used_ == InterfaceType::kFixedInterface) {
-      bitexact_output_ = VerifyFixedBitExactness(msg, fwd_frame_);
-    } else {
-      bitexact_output_ = VerifyFloatBitExactness(msg, out_config_, *out_buf_);
-    }
-  }
-}
-
-void AecDumpBasedSimulator::PrepareReverseProcessStreamCall(
-    const webrtc::audioproc::ReverseStream& msg) {
-  if (msg.has_data()) {
-    // Fixed interface processing.
-    // Verify interface invariance.
-    RTC_CHECK(interface_used_ == InterfaceType::kFixedInterface ||
-              interface_used_ == InterfaceType::kNotSpecified);
-    interface_used_ = InterfaceType::kFixedInterface;
-
-    // Populate input buffer.
-    RTC_CHECK_EQ(sizeof(int16_t) * rev_frame_.samples_per_channel_ *
-                     rev_frame_.num_channels_,
-                 msg.data().size());
-    memcpy(rev_frame_.mutable_data(), msg.data().data(), msg.data().size());
-  } else {
-    // Float interface processing.
-    // Verify interface invariance.
-    RTC_CHECK(interface_used_ == InterfaceType::kFloatInterface ||
-              interface_used_ == InterfaceType::kNotSpecified);
-    interface_used_ = InterfaceType::kFloatInterface;
-
-    RTC_CHECK_EQ(reverse_in_buf_->num_channels(),
-                 static_cast<size_t>(msg.channel_size()));
-
-    // Populate input buffer.
-    for (int i = 0; i < msg.channel_size(); ++i) {
-      RTC_CHECK_EQ(reverse_in_buf_->num_frames() *
-                       sizeof(*reverse_in_buf_->channels()[i]),
-                   msg.channel(i).size());
-      std::memcpy(reverse_in_buf_->channels()[i], msg.channel(i).data(),
-                  msg.channel(i).size());
-    }
-  }
-}
-
-void AecDumpBasedSimulator::Process() {
-  std::unique_ptr<test::TraceToStderr> trace_to_stderr;
-  if (settings_.use_verbose_logging) {
-    trace_to_stderr.reset(new test::TraceToStderr(true));
-  }
-
-  CreateAudioProcessor();
-  dump_input_file_ = OpenFile(settings_.aec_dump_input_filename->c_str(), "rb");
-
-  if (settings_.artificial_nearend_filename) {
-    std::unique_ptr<WavReader> artificial_nearend_file(
-        new WavReader(settings_.artificial_nearend_filename->c_str()));
-
-    RTC_CHECK_EQ(1, artificial_nearend_file->num_channels())
-        << "Only mono files for the artificial nearend are supported, "
-           "reverted to not using the artificial nearend file";
-
-    const int sample_rate_hz = artificial_nearend_file->sample_rate();
-    artificial_nearend_buffer_reader_.reset(
-        new ChannelBufferWavReader(std::move(artificial_nearend_file)));
-    artificial_nearend_buf_.reset(new ChannelBuffer<float>(
-        rtc::CheckedDivExact(sample_rate_hz, kChunksPerSecond), 1));
-  }
-
-  webrtc::audioproc::Event event_msg;
-  int num_forward_chunks_processed = 0;
-  const float kOneBykChunksPerSecond =
-      1.f / AudioProcessingSimulator::kChunksPerSecond;
-  while (ReadMessageFromFile(dump_input_file_, &event_msg)) {
-    switch (event_msg.type()) {
-      case webrtc::audioproc::Event::INIT:
-        RTC_CHECK(event_msg.has_init());
-        HandleMessage(event_msg.init());
-        break;
-      case webrtc::audioproc::Event::STREAM:
-        RTC_CHECK(event_msg.has_stream());
-        HandleMessage(event_msg.stream());
-        ++num_forward_chunks_processed;
-        break;
-      case webrtc::audioproc::Event::REVERSE_STREAM:
-        RTC_CHECK(event_msg.has_reverse_stream());
-        HandleMessage(event_msg.reverse_stream());
-        break;
-      case webrtc::audioproc::Event::CONFIG:
-        RTC_CHECK(event_msg.has_config());
-        HandleMessage(event_msg.config());
-        break;
-      default:
-        RTC_CHECK(false);
-    }
-    if (trace_to_stderr) {
-      trace_to_stderr->SetTimeSeconds(num_forward_chunks_processed *
-                                      kOneBykChunksPerSecond);
-    }
-  }
-
-  fclose(dump_input_file_);
-
-  DestroyAudioProcessor();
-}
-
-void AecDumpBasedSimulator::HandleMessage(
-    const webrtc::audioproc::Config& msg) {
-  if (settings_.use_verbose_logging) {
-    std::cout << "Config at frame:" << std::endl;
-    std::cout << " Forward: " << get_num_process_stream_calls() << std::endl;
-    std::cout << " Reverse: " << get_num_reverse_process_stream_calls()
-              << std::endl;
-  }
-
-  if (!settings_.discard_all_settings_in_aecdump) {
-    if (settings_.use_verbose_logging) {
-      std::cout << "Setting used in config:" << std::endl;
-    }
-    Config config;
-    AudioProcessing::Config apm_config;
-
-    if (msg.has_aec_enabled() || settings_.use_aec) {
-      bool enable = settings_.use_aec ? *settings_.use_aec : msg.aec_enabled();
-      RTC_CHECK_EQ(AudioProcessing::kNoError,
-                   ap_->echo_cancellation()->Enable(enable));
-      if (settings_.use_verbose_logging) {
-        std::cout << " aec_enabled: " << (enable ? "true" : "false")
-                  << std::endl;
-      }
-    }
-
-    if (msg.has_aec_delay_agnostic_enabled() || settings_.use_delay_agnostic) {
-      bool enable = settings_.use_delay_agnostic
-                        ? *settings_.use_delay_agnostic
-                        : msg.aec_delay_agnostic_enabled();
-      config.Set<DelayAgnostic>(new DelayAgnostic(enable));
-      if (settings_.use_verbose_logging) {
-        std::cout << " aec_delay_agnostic_enabled: "
-                  << (enable ? "true" : "false") << std::endl;
-      }
-    }
-
-    if (msg.has_aec_drift_compensation_enabled() ||
-        settings_.use_drift_compensation) {
-      bool enable = settings_.use_drift_compensation
-                        ? *settings_.use_drift_compensation
-                        : msg.aec_drift_compensation_enabled();
-      RTC_CHECK_EQ(AudioProcessing::kNoError,
-                   ap_->echo_cancellation()->enable_drift_compensation(enable));
-      if (settings_.use_verbose_logging) {
-        std::cout << " aec_drift_compensation_enabled: "
-                  << (enable ? "true" : "false") << std::endl;
-      }
-    }
-
-    if (msg.has_aec_extended_filter_enabled() ||
-        settings_.use_extended_filter) {
-      bool enable = settings_.use_extended_filter
-                        ? *settings_.use_extended_filter
-                        : msg.aec_extended_filter_enabled();
-      config.Set<ExtendedFilter>(new ExtendedFilter(enable));
-      if (settings_.use_verbose_logging) {
-        std::cout << " aec_extended_filter_enabled: "
-                  << (enable ? "true" : "false") << std::endl;
-      }
-    }
-
-    if (msg.has_aec_suppression_level() || settings_.aec_suppression_level) {
-      int level = settings_.aec_suppression_level
-                      ? *settings_.aec_suppression_level
-                      : msg.aec_suppression_level();
-      RTC_CHECK_EQ(
-          AudioProcessing::kNoError,
-          ap_->echo_cancellation()->set_suppression_level(
-              static_cast<webrtc::EchoCancellation::SuppressionLevel>(level)));
-      if (settings_.use_verbose_logging) {
-        std::cout << " aec_suppression_level: " << level << std::endl;
-      }
-    }
-
-    if (msg.has_aecm_enabled() || settings_.use_aecm) {
-      bool enable =
-          settings_.use_aecm ? *settings_.use_aecm : msg.aecm_enabled();
-      RTC_CHECK_EQ(AudioProcessing::kNoError,
-                   ap_->echo_control_mobile()->Enable(enable));
-      if (settings_.use_verbose_logging) {
-        std::cout << " aecm_enabled: " << (enable ? "true" : "false")
-                  << std::endl;
-      }
-    }
-
-    if (msg.has_aecm_comfort_noise_enabled() ||
-        settings_.use_aecm_comfort_noise) {
-      bool enable = settings_.use_aecm_comfort_noise
-                        ? *settings_.use_aecm_comfort_noise
-                        : msg.aecm_comfort_noise_enabled();
-      RTC_CHECK_EQ(AudioProcessing::kNoError,
-                   ap_->echo_control_mobile()->enable_comfort_noise(enable));
-      if (settings_.use_verbose_logging) {
-        std::cout << " aecm_comfort_noise_enabled: "
-                  << (enable ? "true" : "false") << std::endl;
-      }
-    }
-
-    if (msg.has_aecm_routing_mode() || settings_.aecm_routing_mode) {
-      int routing_mode = settings_.aecm_routing_mode
-                             ? *settings_.aecm_routing_mode
-                             : msg.aecm_routing_mode();
-      RTC_CHECK_EQ(AudioProcessing::kNoError,
-                   ap_->echo_control_mobile()->set_routing_mode(
-                       static_cast<webrtc::EchoControlMobile::RoutingMode>(
-                           routing_mode)));
-      if (settings_.use_verbose_logging) {
-        std::cout << " aecm_routing_mode: " << routing_mode << std::endl;
-      }
-    }
-
-    if (msg.has_agc_enabled() || settings_.use_agc) {
-      bool enable = settings_.use_agc ? *settings_.use_agc : msg.agc_enabled();
-      RTC_CHECK_EQ(AudioProcessing::kNoError,
-                   ap_->gain_control()->Enable(enable));
-      if (settings_.use_verbose_logging) {
-        std::cout << " agc_enabled: " << (enable ? "true" : "false")
-                  << std::endl;
-      }
-    }
-
-    if (msg.has_agc_mode() || settings_.agc_mode) {
-      int mode = settings_.agc_mode ? *settings_.agc_mode : msg.agc_mode();
-      RTC_CHECK_EQ(AudioProcessing::kNoError,
-                   ap_->gain_control()->set_mode(
-                       static_cast<webrtc::GainControl::Mode>(mode)));
-      if (settings_.use_verbose_logging) {
-        std::cout << " agc_mode: " << mode << std::endl;
-      }
-    }
-
-    if (msg.has_agc_limiter_enabled() || settings_.use_agc_limiter) {
-      bool enable = settings_.use_agc_limiter ? *settings_.use_agc_limiter
-                                              : msg.agc_limiter_enabled();
-      RTC_CHECK_EQ(AudioProcessing::kNoError,
-                   ap_->gain_control()->enable_limiter(enable));
-      if (settings_.use_verbose_logging) {
-        std::cout << " agc_limiter_enabled: " << (enable ? "true" : "false")
-                  << std::endl;
-      }
-    }
-
-    // TODO(peah): Add support for controlling the Experimental AGC from the
-    // command line.
-    if (msg.has_noise_robust_agc_enabled()) {
-      config.Set<ExperimentalAgc>(
-          new ExperimentalAgc(msg.noise_robust_agc_enabled()));
-      if (settings_.use_verbose_logging) {
-        std::cout << " noise_robust_agc_enabled: "
-                  << (msg.noise_robust_agc_enabled() ? "true" : "false")
-                  << std::endl;
-      }
-    }
-
-    if (msg.has_transient_suppression_enabled() || settings_.use_ts) {
-      bool enable = settings_.use_ts ? *settings_.use_ts
-                                     : msg.transient_suppression_enabled();
-      config.Set<ExperimentalNs>(new ExperimentalNs(enable));
-      if (settings_.use_verbose_logging) {
-        std::cout << " transient_suppression_enabled: "
-                  << (enable ? "true" : "false") << std::endl;
-      }
-    }
-
-    if (msg.has_intelligibility_enhancer_enabled() || settings_.use_ie) {
-      bool enable = settings_.use_ie ? *settings_.use_ie
-                                     : msg.intelligibility_enhancer_enabled();
-      config.Set<Intelligibility>(new Intelligibility(enable));
-      if (settings_.use_verbose_logging) {
-        std::cout << " intelligibility_enhancer_enabled: "
-                  << (enable ? "true" : "false") << std::endl;
-      }
-    }
-
-    if (msg.has_hpf_enabled() || settings_.use_hpf) {
-      bool enable = settings_.use_hpf ? *settings_.use_hpf : msg.hpf_enabled();
-      apm_config.high_pass_filter.enabled = enable;
-      if (settings_.use_verbose_logging) {
-        std::cout << " hpf_enabled: " << (enable ? "true" : "false")
-                  << std::endl;
-      }
-    }
-
-    if (msg.has_ns_enabled() || settings_.use_ns) {
-      bool enable = settings_.use_ns ? *settings_.use_ns : msg.ns_enabled();
-      RTC_CHECK_EQ(AudioProcessing::kNoError,
-                   ap_->noise_suppression()->Enable(enable));
-      if (settings_.use_verbose_logging) {
-        std::cout << " ns_enabled: " << (enable ? "true" : "false")
-                  << std::endl;
-      }
-    }
-
-    if (msg.has_ns_level() || settings_.ns_level) {
-      int level = settings_.ns_level ? *settings_.ns_level : msg.ns_level();
-      RTC_CHECK_EQ(AudioProcessing::kNoError,
-                   ap_->noise_suppression()->set_level(
-                       static_cast<NoiseSuppression::Level>(level)));
-      if (settings_.use_verbose_logging) {
-        std::cout << " ns_level: " << level << std::endl;
-      }
-    }
-
-    if (settings_.use_verbose_logging && msg.has_experiments_description() &&
-        !msg.experiments_description().empty()) {
-      std::cout << " experiments not included by default in the simulation: "
-                << msg.experiments_description() << std::endl;
-    }
-
-    if (settings_.use_refined_adaptive_filter) {
-      config.Set<RefinedAdaptiveFilter>(
-          new RefinedAdaptiveFilter(*settings_.use_refined_adaptive_filter));
-    }
-
-    if (settings_.use_aec3) {
-      apm_config.echo_canceller3.enabled = *settings_.use_aec3;
-    }
-
-    if (settings_.use_lc) {
-      apm_config.level_controller.enabled = *settings_.use_lc;
-    }
-
-    if (settings_.use_ed) {
-      apm_config.residual_echo_detector.enabled = *settings_.use_ed;
-    }
-
-    ap_->ApplyConfig(apm_config);
-    ap_->SetExtraOptions(config);
-  }
-}
-
-void AecDumpBasedSimulator::HandleMessage(const webrtc::audioproc::Init& msg) {
-  RTC_CHECK(msg.has_sample_rate());
-  RTC_CHECK(msg.has_num_input_channels());
-  RTC_CHECK(msg.has_num_reverse_channels());
-  RTC_CHECK(msg.has_reverse_sample_rate());
-
-  if (settings_.use_verbose_logging) {
-    std::cout << "Init at frame:" << std::endl;
-    std::cout << " Forward: " << get_num_process_stream_calls() << std::endl;
-    std::cout << " Reverse: " << get_num_reverse_process_stream_calls()
-              << std::endl;
-  }
-
-  int num_output_channels;
-  if (settings_.output_num_channels) {
-    num_output_channels = *settings_.output_num_channels;
-  } else {
-    num_output_channels = msg.has_num_output_channels()
-                              ? msg.num_output_channels()
-                              : msg.num_input_channels();
-  }
-
-  int output_sample_rate;
-  if (settings_.output_sample_rate_hz) {
-    output_sample_rate = *settings_.output_sample_rate_hz;
-  } else {
-    output_sample_rate = msg.has_output_sample_rate() ? msg.output_sample_rate()
-                                                      : msg.sample_rate();
-  }
-
-  int num_reverse_output_channels;
-  if (settings_.reverse_output_num_channels) {
-    num_reverse_output_channels = *settings_.reverse_output_num_channels;
-  } else {
-    num_reverse_output_channels = msg.has_num_reverse_output_channels()
-                                      ? msg.num_reverse_output_channels()
-                                      : msg.num_reverse_channels();
-  }
-
-  int reverse_output_sample_rate;
-  if (settings_.reverse_output_sample_rate_hz) {
-    reverse_output_sample_rate = *settings_.reverse_output_sample_rate_hz;
-  } else {
-    reverse_output_sample_rate = msg.has_reverse_output_sample_rate()
-                                     ? msg.reverse_output_sample_rate()
-                                     : msg.reverse_sample_rate();
-  }
-
-  SetupBuffersConfigsOutputs(
-      msg.sample_rate(), output_sample_rate, msg.reverse_sample_rate(),
-      reverse_output_sample_rate, msg.num_input_channels(), num_output_channels,
-      msg.num_reverse_channels(), num_reverse_output_channels);
-}
-
-void AecDumpBasedSimulator::HandleMessage(
-    const webrtc::audioproc::Stream& msg) {
-  bool set_stream_analog_level_called = false;
-  PrepareProcessStreamCall(msg, &set_stream_analog_level_called);
-  ProcessStream(interface_used_ == InterfaceType::kFixedInterface);
-  if (set_stream_analog_level_called) {
-    // Call stream analog level to ensure that any side-effects are triggered.
-    (void)ap_->gain_control()->stream_analog_level();
-  }
-
-  VerifyProcessStreamBitExactness(msg);
-}
-
-void AecDumpBasedSimulator::HandleMessage(
-    const webrtc::audioproc::ReverseStream& msg) {
-  PrepareReverseProcessStreamCall(msg);
-  ProcessReverseStream(interface_used_ == InterfaceType::kFixedInterface);
-}
-
-}  // namespace test
-}  // namespace webrtc
diff --git a/modules/audio_processing/test/aec_dump_based_simulator.h b/modules/audio_processing/test/aec_dump_based_simulator.h
deleted file mode 100644
index 3fb1d55..0000000
--- a/modules/audio_processing/test/aec_dump_based_simulator.h
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- *  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_PROCESSING_TEST_AEC_DUMP_BASED_SIMULATOR_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_TEST_AEC_DUMP_BASED_SIMULATOR_H_
-
-#include "webrtc/modules/audio_processing/test/audio_processing_simulator.h"
-
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/ignore_wundef.h"
-
-RTC_PUSH_IGNORING_WUNDEF()
-#ifdef WEBRTC_ANDROID_PLATFORM_BUILD
-#include "external/webrtc/webrtc/modules/audio_processing/debug.pb.h"
-#else
-#include "webrtc/modules/audio_processing/debug.pb.h"
-#endif
-RTC_POP_IGNORING_WUNDEF()
-
-namespace webrtc {
-namespace test {
-
-// Used to perform an audio processing simulation from an aec dump.
-class AecDumpBasedSimulator final : public AudioProcessingSimulator {
- public:
-  explicit AecDumpBasedSimulator(const SimulationSettings& settings);
-  ~AecDumpBasedSimulator() override;
-
-  // Processes the messages in the aecdump file.
-  void Process() override;
-
- private:
-  void HandleMessage(const webrtc::audioproc::Init& msg);
-  void HandleMessage(const webrtc::audioproc::Stream& msg);
-  void HandleMessage(const webrtc::audioproc::ReverseStream& msg);
-  void HandleMessage(const webrtc::audioproc::Config& msg);
-  void PrepareProcessStreamCall(const webrtc::audioproc::Stream& msg,
-                                bool* set_stream_analog_level_called);
-  void PrepareReverseProcessStreamCall(
-      const webrtc::audioproc::ReverseStream& msg);
-  void VerifyProcessStreamBitExactness(const webrtc::audioproc::Stream& msg);
-
-  enum InterfaceType {
-    kFixedInterface,
-    kFloatInterface,
-    kNotSpecified,
-  };
-
-  FILE* dump_input_file_;
-  std::unique_ptr<ChannelBuffer<float>> artificial_nearend_buf_;
-  std::unique_ptr<ChannelBufferWavReader> artificial_nearend_buffer_reader_;
-  bool artificial_nearend_eof_reported_ = false;
-  InterfaceType interface_used_ = InterfaceType::kNotSpecified;
-
-  RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(AecDumpBasedSimulator);
-};
-
-}  // namespace test
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_TEST_AEC_DUMP_BASED_SIMULATOR_H_
diff --git a/modules/audio_processing/test/android/apmtest/AndroidManifest.xml b/modules/audio_processing/test/android/apmtest/AndroidManifest.xml
deleted file mode 100644
index c6063b3..0000000
--- a/modules/audio_processing/test/android/apmtest/AndroidManifest.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- BEGIN_INCLUDE(manifest) -->
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-        package="com.example.native_activity"
-        android:versionCode="1"
-        android:versionName="1.0">
-
-    <!-- This is the platform API where NativeActivity was introduced. -->
-    <uses-sdk android:minSdkVersion="8" />
-
-    <!-- This .apk has no Java code itself, so set hasCode to false. -->
-    <application android:label="@string/app_name" android:hasCode="false" android:debuggable="true">
-
-        <!-- Our activity is the built-in NativeActivity framework class.
-             This will take care of integrating with our NDK code. -->
-        <activity android:name="android.app.NativeActivity"
-                android:label="@string/app_name"
-                android:configChanges="orientation|keyboardHidden">
-            <!-- Tell NativeActivity the name of or .so -->
-            <meta-data android:name="android.app.lib_name"
-                    android:value="apmtest-activity" />
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN" />
-                <category android:name="android.intent.category.LAUNCHER" />
-            </intent-filter>
-        </activity>
-    </application>
-
-</manifest> 
-<!-- END_INCLUDE(manifest) -->
diff --git a/modules/audio_processing/test/android/apmtest/default.properties b/modules/audio_processing/test/android/apmtest/default.properties
deleted file mode 100644
index 9a2c9f6..0000000
--- a/modules/audio_processing/test/android/apmtest/default.properties
+++ /dev/null
@@ -1,11 +0,0 @@
-# This file is automatically generated by Android Tools.
-# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
-# 
-# This file must be checked in Version Control Systems.
-# 
-# To customize properties used by the Ant build system use,
-# "build.properties", and override values to adapt the script to your
-# project structure.
-
-# Project target.
-target=android-9
diff --git a/modules/audio_processing/test/android/apmtest/jni/main.c b/modules/audio_processing/test/android/apmtest/jni/main.c
deleted file mode 100644
index 2e19635..0000000
--- a/modules/audio_processing/test/android/apmtest/jni/main.c
+++ /dev/null
@@ -1,307 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-
-//BEGIN_INCLUDE(all)
-#include <jni.h>
-#include <errno.h>
-
-#include <EGL/egl.h>
-#include <GLES/gl.h>
-
-#include <android/sensor.h>
-#include <android/log.h>
-#include <android_native_app_glue.h>
-
-#define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, "native-activity", __VA_ARGS__))
-#define LOGW(...) ((void)__android_log_print(ANDROID_LOG_WARN, "native-activity", __VA_ARGS__))
-
-/**
- * Our saved state data.
- */
-struct saved_state {
-    float angle;
-    int32_t x;
-    int32_t y;
-};
-
-/**
- * Shared state for our app.
- */
-struct engine {
-    struct android_app* app;
-
-    ASensorManager* sensorManager;
-    const ASensor* accelerometerSensor;
-    ASensorEventQueue* sensorEventQueue;
-
-    int animating;
-    EGLDisplay display;
-    EGLSurface surface;
-    EGLContext context;
-    int32_t width;
-    int32_t height;
-    struct saved_state state;
-};
-
-/**
- * Initialize an EGL context for the current display.
- */
-static int engine_init_display(struct engine* engine) {
-    // initialize OpenGL ES and EGL
-
-    /*
-     * Here specify the attributes of the desired configuration.
-     * Below, we select an EGLConfig with at least 8 bits per color
-     * component compatible with on-screen windows
-     */
-    const EGLint attribs[] = {
-            EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
-            EGL_BLUE_SIZE, 8,
-            EGL_GREEN_SIZE, 8,
-            EGL_RED_SIZE, 8,
-            EGL_NONE
-    };
-    EGLint w, h, dummy, format;
-    EGLint numConfigs;
-    EGLConfig config;
-    EGLSurface surface;
-    EGLContext context;
-
-    EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
-
-    eglInitialize(display, 0, 0);
-
-    /* Here, the application chooses the configuration it desires. In this
-     * sample, we have a very simplified selection process, where we pick
-     * the first EGLConfig that matches our criteria */
-    eglChooseConfig(display, attribs, &config, 1, &numConfigs);
-
-    /* EGL_NATIVE_VISUAL_ID is an attribute of the EGLConfig that is
-     * guaranteed to be accepted by ANativeWindow_setBuffersGeometry().
-     * As soon as we picked a EGLConfig, we can safely reconfigure the
-     * ANativeWindow buffers to match, using EGL_NATIVE_VISUAL_ID. */
-    eglGetConfigAttrib(display, config, EGL_NATIVE_VISUAL_ID, &format);
-
-    ANativeWindow_setBuffersGeometry(engine->app->window, 0, 0, format);
-
-    surface = eglCreateWindowSurface(display, config, engine->app->window, NULL);
-    context = eglCreateContext(display, config, NULL, NULL);
-
-    if (eglMakeCurrent(display, surface, surface, context) == EGL_FALSE) {
-        LOGW("Unable to eglMakeCurrent");
-        return -1;
-    }
-
-    eglQuerySurface(display, surface, EGL_WIDTH, &w);
-    eglQuerySurface(display, surface, EGL_HEIGHT, &h);
-
-    engine->display = display;
-    engine->context = context;
-    engine->surface = surface;
-    engine->width = w;
-    engine->height = h;
-    engine->state.angle = 0;
-
-    // Initialize GL state.
-    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST);
-    glEnable(GL_CULL_FACE);
-    glShadeModel(GL_SMOOTH);
-    glDisable(GL_DEPTH_TEST);
-
-    return 0;
-}
-
-/**
- * Just the current frame in the display.
- */
-static void engine_draw_frame(struct engine* engine) {
-    if (engine->display == NULL) {
-        // No display.
-        return;
-    }
-
-    // Just fill the screen with a color.
-    glClearColor(((float)engine->state.x)/engine->width, engine->state.angle,
-            ((float)engine->state.y)/engine->height, 1);
-    glClear(GL_COLOR_BUFFER_BIT);
-
-    eglSwapBuffers(engine->display, engine->surface);
-}
-
-/**
- * Tear down the EGL context currently associated with the display.
- */
-static void engine_term_display(struct engine* engine) {
-    if (engine->display != EGL_NO_DISPLAY) {
-        eglMakeCurrent(engine->display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
-        if (engine->context != EGL_NO_CONTEXT) {
-            eglDestroyContext(engine->display, engine->context);
-        }
-        if (engine->surface != EGL_NO_SURFACE) {
-            eglDestroySurface(engine->display, engine->surface);
-        }
-        eglTerminate(engine->display);
-    }
-    engine->animating = 0;
-    engine->display = EGL_NO_DISPLAY;
-    engine->context = EGL_NO_CONTEXT;
-    engine->surface = EGL_NO_SURFACE;
-}
-
-/**
- * Process the next input event.
- */
-static int32_t engine_handle_input(struct android_app* app, AInputEvent* event) {
-    struct engine* engine = (struct engine*)app->userData;
-    if (AInputEvent_getType(event) == AINPUT_EVENT_TYPE_MOTION) {
-        engine->animating = 1;
-        engine->state.x = AMotionEvent_getX(event, 0);
-        engine->state.y = AMotionEvent_getY(event, 0);
-        return 1;
-    }
-    return 0;
-}
-
-/**
- * Process the next main command.
- */
-static void engine_handle_cmd(struct android_app* app, int32_t cmd) {
-    struct engine* engine = (struct engine*)app->userData;
-    switch (cmd) {
-        case APP_CMD_SAVE_STATE:
-            // The system has asked us to save our current state.  Do so.
-            engine->app->savedState = malloc(sizeof(struct saved_state));
-            *((struct saved_state*)engine->app->savedState) = engine->state;
-            engine->app->savedStateSize = sizeof(struct saved_state);
-            break;
-        case APP_CMD_INIT_WINDOW:
-            // The window is being shown, get it ready.
-            if (engine->app->window != NULL) {
-                engine_init_display(engine);
-                engine_draw_frame(engine);
-            }
-            break;
-        case APP_CMD_TERM_WINDOW:
-            // The window is being hidden or closed, clean it up.
-            engine_term_display(engine);
-            break;
-        case APP_CMD_GAINED_FOCUS:
-            // When our app gains focus, we start monitoring the accelerometer.
-            if (engine->accelerometerSensor != NULL) {
-                ASensorEventQueue_enableSensor(engine->sensorEventQueue,
-                        engine->accelerometerSensor);
-                // We'd like to get 60 events per second (in us).
-                ASensorEventQueue_setEventRate(engine->sensorEventQueue,
-                        engine->accelerometerSensor, (1000L/60)*1000);
-            }
-            break;
-        case APP_CMD_LOST_FOCUS:
-            // When our app loses focus, we stop monitoring the accelerometer.
-            // This is to avoid consuming battery while not being used.
-            if (engine->accelerometerSensor != NULL) {
-                ASensorEventQueue_disableSensor(engine->sensorEventQueue,
-                        engine->accelerometerSensor);
-            }
-            // Also stop animating.
-            engine->animating = 0;
-            engine_draw_frame(engine);
-            break;
-    }
-}
-
-/**
- * This is the main entry point of a native application that is using
- * android_native_app_glue.  It runs in its own thread, with its own
- * event loop for receiving input events and doing other things.
- */
-void android_main(struct android_app* state) {
-    struct engine engine;
-
-    // Make sure glue isn't stripped.
-    app_dummy();
-
-    memset(&engine, 0, sizeof(engine));
-    state->userData = &engine;
-    state->onAppCmd = engine_handle_cmd;
-    state->onInputEvent = engine_handle_input;
-    engine.app = state;
-
-    // Prepare to monitor accelerometer
-    engine.sensorManager = ASensorManager_getInstance();
-    engine.accelerometerSensor = ASensorManager_getDefaultSensor(engine.sensorManager,
-            ASENSOR_TYPE_ACCELEROMETER);
-    engine.sensorEventQueue = ASensorManager_createEventQueue(engine.sensorManager,
-            state->looper, LOOPER_ID_USER, NULL, NULL);
-
-    if (state->savedState != NULL) {
-        // We are starting with a previous saved state; restore from it.
-        engine.state = *(struct saved_state*)state->savedState;
-    }
-
-    // loop waiting for stuff to do.
-
-    while (1) {
-        // Read all pending events.
-        int ident;
-        int events;
-        struct android_poll_source* source;
-
-        // If not animating, we will block forever waiting for events.
-        // If animating, we loop until all events are read, then continue
-        // to draw the next frame of animation.
-        while ((ident=ALooper_pollAll(engine.animating ? 0 : -1, NULL, &events,
-                (void**)&source)) >= 0) {
-
-            // Process this event.
-            if (source != NULL) {
-                source->process(state, source);
-            }
-
-            // If a sensor has data, process it now.
-            if (ident == LOOPER_ID_USER) {
-                if (engine.accelerometerSensor != NULL) {
-                    ASensorEvent event;
-                    while (ASensorEventQueue_getEvents(engine.sensorEventQueue,
-                            &event, 1) > 0) {
-                        LOGI("accelerometer: x=%f y=%f z=%f",
-                                event.acceleration.x, event.acceleration.y,
-                                event.acceleration.z);
-                    }
-                }
-            }
-
-            // Check if we are exiting.
-            if (state->destroyRequested != 0) {
-                engine_term_display(&engine);
-                return;
-            }
-        }
-
-        if (engine.animating) {
-            // Done with events; draw next animation frame.
-            engine.state.angle += .01f;
-            if (engine.state.angle > 1) {
-                engine.state.angle = 0;
-            }
-
-            // Drawing is throttled to the screen update rate, so there
-            // is no need to do timing here.
-            engine_draw_frame(&engine);
-        }
-    }
-}
-//END_INCLUDE(all)
diff --git a/modules/audio_processing/test/android/apmtest/res/values/strings.xml b/modules/audio_processing/test/android/apmtest/res/values/strings.xml
deleted file mode 100644
index d0bd0f3..0000000
--- a/modules/audio_processing/test/android/apmtest/res/values/strings.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
-    <string name="app_name">apmtest</string>
-</resources>
diff --git a/modules/audio_processing/test/apmtest.m b/modules/audio_processing/test/apmtest.m
deleted file mode 100644
index 1c8183c..0000000
--- a/modules/audio_processing/test/apmtest.m
+++ /dev/null
@@ -1,365 +0,0 @@
-%
-%  Copyright (c) 2011 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.
-%
-
-function apmtest(task, testname, filepath, casenumber, legacy)
-%APMTEST is a tool to process APM file sets and easily display the output.
-%   APMTEST(TASK, TESTNAME, CASENUMBER) performs one of several TASKs:
-%     'test'  Processes the files to produce test output.
-%     'list'  Prints a list of cases in the test set, preceded by their
-%             CASENUMBERs.
-%     'show'  Uses spclab to show the test case specified by the
-%             CASENUMBER parameter.
-%
-%   using a set of test files determined by TESTNAME:
-%     'all'   All tests.
-%     'apm'   The standard APM test set (default).
-%     'apmm'  The mobile APM test set.
-%     'aec'   The AEC test set.
-%     'aecm'  The AECM test set.
-%     'agc'   The AGC test set.
-%     'ns'    The NS test set.
-%     'vad'   The VAD test set.
-%
-%   FILEPATH specifies the path to the test data files.
-%
-%   CASENUMBER can be used to select a single test case. Omit CASENUMBER,
-%   or set to zero, to use all test cases.
-%
-
-if nargin < 5 || isempty(legacy)
-  % Set to true to run old VQE recordings.
-  legacy = false;
-end
-
-if nargin < 4 || isempty(casenumber)
-  casenumber = 0;
-end
-
-if nargin < 3 || isempty(filepath)
-  filepath = 'data/';
-end
-
-if nargin < 2 || isempty(testname)
-  testname = 'all';
-end
-
-if nargin < 1 || isempty(task)
-  task = 'test';
-end
-
-if ~strcmp(task, 'test') && ~strcmp(task, 'list') && ~strcmp(task, 'show')
-  error(['TASK ' task ' is not recognized']);
-end
-
-if casenumber == 0 && strcmp(task, 'show')
-  error(['CASENUMBER must be specified for TASK ' task]);
-end
-
-inpath = [filepath 'input/'];
-outpath = [filepath 'output/'];
-refpath = [filepath 'reference/'];
-
-if strcmp(testname, 'all')
-  tests = {'apm','apmm','aec','aecm','agc','ns','vad'};
-else
-  tests = {testname};
-end
-
-if legacy
-  progname = './test';
-else
-  progname = './process_test';
-end
-
-global farFile;
-global nearFile;
-global eventFile;
-global delayFile;
-global driftFile;
-
-if legacy
-  farFile = 'vqeFar.pcm';
-  nearFile = 'vqeNear.pcm';
-  eventFile = 'vqeEvent.dat';
-  delayFile = 'vqeBuf.dat';
-  driftFile = 'vqeDrift.dat';
-else
-  farFile = 'apm_far.pcm';
-  nearFile = 'apm_near.pcm';
-  eventFile = 'apm_event.dat';
-  delayFile = 'apm_delay.dat';
-  driftFile = 'apm_drift.dat';
-end
-
-simulateMode = false;
-nErr = 0;
-nCases = 0;
-for i=1:length(tests)
-  simulateMode = false;
-
-  if strcmp(tests{i}, 'apm')
-    testdir = ['apm/'];
-    outfile = ['out'];
-    if legacy
-      opt = ['-ec 1 -agc 2 -nc 2 -vad 3'];
-    else
-      opt = ['--no_progress -hpf' ...
-          ' -aec --drift_compensation -agc --fixed_digital' ...
-          ' -ns --ns_moderate -vad'];
-    end
-
-  elseif strcmp(tests{i}, 'apm-swb')
-    simulateMode = true;
-    testdir = ['apm-swb/'];
-    outfile = ['out'];
-    if legacy
-      opt = ['-fs 32000 -ec 1 -agc 2 -nc 2'];
-    else
-      opt = ['--no_progress -fs 32000 -hpf' ...
-          ' -aec --drift_compensation -agc --adaptive_digital' ...
-          ' -ns --ns_moderate -vad'];
-    end
-  elseif strcmp(tests{i}, 'apmm')
-    testdir = ['apmm/'];
-    outfile = ['out'];
-    opt = ['-aec --drift_compensation -agc --fixed_digital -hpf -ns ' ...
-        '--ns_moderate'];
-
-  else
-    error(['TESTNAME ' tests{i} ' is not recognized']);
-  end
-
-  inpathtest = [inpath testdir];
-  outpathtest = [outpath testdir];
-  refpathtest = [refpath testdir];
-
-  if ~exist(inpathtest,'dir')
-    error(['Input directory ' inpathtest ' does not exist']);
-  end
-
-  if ~exist(refpathtest,'dir')
-    warning(['Reference directory ' refpathtest ' does not exist']);
-  end
-
-  [status, errMsg] = mkdir(outpathtest);
-  if (status == 0)
-    error(errMsg);
-  end
-
-  [nErr, nCases] = recurseDir(inpathtest, outpathtest, refpathtest, outfile, ...
-      progname, opt, simulateMode, nErr, nCases, task, casenumber, legacy);
-
-  if strcmp(task, 'test') || strcmp(task, 'show')
-    system(['rm ' farFile]);
-    system(['rm ' nearFile]);
-    if simulateMode == false
-      system(['rm ' eventFile]);
-      system(['rm ' delayFile]);
-      system(['rm ' driftFile]);
-    end
-  end
-end
-
-if ~strcmp(task, 'list')
-  if nErr == 0
-    fprintf(1, '\nAll files are bit-exact to reference\n', nErr);
-  else
-    fprintf(1, '\n%d files are NOT bit-exact to reference\n', nErr);
-  end
-end
-
-
-function [nErrOut, nCases] = recurseDir(inpath, outpath, refpath, ...
-    outfile, progname, opt, simulateMode, nErr, nCases, task, casenumber, ...
-    legacy)
-
-global farFile;
-global nearFile;
-global eventFile;
-global delayFile;
-global driftFile;
-
-dirs = dir(inpath);
-nDirs = 0;
-nErrOut = nErr;
-for i=3:length(dirs) % skip . and ..
-  nDirs = nDirs + dirs(i).isdir;
-end
-
-
-if nDirs == 0
-  nCases = nCases + 1;
-
-  if casenumber == nCases || casenumber == 0
-
-    if strcmp(task, 'list')
-      fprintf([num2str(nCases) '. ' outfile '\n'])
-    else
-      vadoutfile = ['vad_' outfile '.dat'];
-      outfile = [outfile '.pcm'];
-
-      % Check for VAD test
-      vadTest = 0;
-      if ~isempty(findstr(opt, '-vad'))
-        vadTest = 1;
-        if legacy
-          opt = [opt ' ' outpath vadoutfile];
-        else
-          opt = [opt ' --vad_out_file ' outpath vadoutfile];
-        end
-      end
-
-      if exist([inpath 'vqeFar.pcm'])
-        system(['ln -s -f ' inpath 'vqeFar.pcm ' farFile]);
-      elseif exist([inpath 'apm_far.pcm'])
-        system(['ln -s -f ' inpath 'apm_far.pcm ' farFile]);
-      end
-
-      if exist([inpath 'vqeNear.pcm'])
-        system(['ln -s -f ' inpath 'vqeNear.pcm ' nearFile]);
-      elseif exist([inpath 'apm_near.pcm'])
-        system(['ln -s -f ' inpath 'apm_near.pcm ' nearFile]);
-      end
-
-      if exist([inpath 'vqeEvent.dat'])
-        system(['ln -s -f ' inpath 'vqeEvent.dat ' eventFile]);
-      elseif exist([inpath 'apm_event.dat'])
-        system(['ln -s -f ' inpath 'apm_event.dat ' eventFile]);
-      end
-
-      if exist([inpath 'vqeBuf.dat'])
-        system(['ln -s -f ' inpath 'vqeBuf.dat ' delayFile]);
-      elseif exist([inpath 'apm_delay.dat'])
-        system(['ln -s -f ' inpath 'apm_delay.dat ' delayFile]);
-      end
-
-      if exist([inpath 'vqeSkew.dat'])
-        system(['ln -s -f ' inpath 'vqeSkew.dat ' driftFile]);
-      elseif exist([inpath 'vqeDrift.dat'])
-        system(['ln -s -f ' inpath 'vqeDrift.dat ' driftFile]);
-      elseif exist([inpath 'apm_drift.dat'])
-        system(['ln -s -f ' inpath 'apm_drift.dat ' driftFile]);
-      end
-
-      if simulateMode == false
-        command = [progname ' -o ' outpath outfile ' ' opt];
-      else
-        if legacy
-          inputCmd = [' -in ' nearFile];
-        else
-          inputCmd = [' -i ' nearFile];
-        end
-
-        if exist([farFile])
-          if legacy
-            inputCmd = [' -if ' farFile inputCmd];
-          else
-            inputCmd = [' -ir ' farFile inputCmd];
-          end
-        end
-        command = [progname inputCmd ' -o ' outpath outfile ' ' opt];
-      end
-      % This prevents MATLAB from using its own C libraries.
-      shellcmd = ['bash -c "unset LD_LIBRARY_PATH;'];
-      fprintf([command '\n']);
-      [status, result] = system([shellcmd command '"']);
-      fprintf(result);
-
-      fprintf(['Reference file: ' refpath outfile '\n']);
-
-      if vadTest == 1
-        equal_to_ref = are_files_equal([outpath vadoutfile], ...
-                                       [refpath vadoutfile], ...
-                                       'int8');
-        if ~equal_to_ref
-          nErr = nErr + 1;
-        end
-      end
-
-      [equal_to_ref, diffvector] = are_files_equal([outpath outfile], ...
-                                                   [refpath outfile], ...
-                                                   'int16');
-      if ~equal_to_ref
-        nErr = nErr + 1;
-      end
-
-      if strcmp(task, 'show')
-        % Assume the last init gives the sample rate of interest.
-        str_idx = strfind(result, 'Sample rate:');
-        fs = str2num(result(str_idx(end) + 13:str_idx(end) + 17));
-        fprintf('Using %d Hz\n', fs);
-
-        if exist([farFile])
-          spclab(fs, farFile, nearFile, [refpath outfile], ...
-              [outpath outfile], diffvector);
-          %spclab(fs, diffvector);
-        else
-          spclab(fs, nearFile, [refpath outfile], [outpath outfile], ...
-              diffvector);
-          %spclab(fs, diffvector);
-        end
-      end
-    end
-  end
-else
-
-  for i=3:length(dirs)
-    if dirs(i).isdir
-      [nErr, nCases] = recurseDir([inpath dirs(i).name '/'], outpath, ...
-          refpath,[outfile '_' dirs(i).name], progname, opt, ...
-          simulateMode, nErr, nCases, task, casenumber, legacy);
-    end
-  end
-end
-nErrOut = nErr;
-
-function [are_equal, diffvector] = ...
-    are_files_equal(newfile, reffile, precision, diffvector)
-
-are_equal = false;
-diffvector = 0;
-if ~exist(newfile,'file')
-  warning(['Output file ' newfile ' does not exist']);  
-  return
-end
-
-if ~exist(reffile,'file')
-  warning(['Reference file ' reffile ' does not exist']);  
-  return
-end
-
-fid = fopen(newfile,'rb');
-new = fread(fid,inf,precision);
-fclose(fid);
-
-fid = fopen(reffile,'rb');
-ref = fread(fid,inf,precision);
-fclose(fid);
-
-if length(new) ~= length(ref)
-  warning('Reference is not the same length as output');
-  minlength = min(length(new), length(ref));
-  new = new(1:minlength);
-  ref = ref(1:minlength);
-end
-diffvector = new - ref;
-
-if isequal(new, ref)
-  fprintf([newfile ' is bit-exact to reference\n']);
-  are_equal = true;
-else
-  if isempty(new)
-    warning([newfile ' is empty']);
-    return
-  end
-  snr = snrseg(new,ref,80);
-  fprintf('\n');
-  are_equal = false;
-end
diff --git a/modules/audio_processing/test/audio_buffer_tools.cc b/modules/audio_processing/test/audio_buffer_tools.cc
deleted file mode 100644
index 46ee61d..0000000
--- a/modules/audio_processing/test/audio_buffer_tools.cc
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- *  Copyright (c) 2015 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_processing/test/audio_buffer_tools.h"
-
-#include <string.h>
-
-namespace webrtc {
-namespace test {
-
-void SetupFrame(const StreamConfig& stream_config,
-                std::vector<float*>* frame,
-                std::vector<float>* frame_samples) {
-  frame_samples->resize(stream_config.num_channels() *
-                        stream_config.num_frames());
-  frame->resize(stream_config.num_channels());
-  for (size_t ch = 0; ch < stream_config.num_channels(); ++ch) {
-    (*frame)[ch] = &(*frame_samples)[ch * stream_config.num_frames()];
-  }
-}
-
-void CopyVectorToAudioBuffer(const StreamConfig& stream_config,
-                             rtc::ArrayView<const float> source,
-                             AudioBuffer* destination) {
-  std::vector<float*> input;
-  std::vector<float> input_samples;
-
-  SetupFrame(stream_config, &input, &input_samples);
-
-  RTC_CHECK_EQ(input_samples.size(), source.size());
-  memcpy(input_samples.data(), source.data(),
-         source.size() * sizeof(source[0]));
-
-  destination->CopyFrom(&input[0], stream_config);
-}
-
-void ExtractVectorFromAudioBuffer(const StreamConfig& stream_config,
-                                  AudioBuffer* source,
-                                  std::vector<float>* destination) {
-  std::vector<float*> output;
-
-  SetupFrame(stream_config, &output, destination);
-
-  source->CopyTo(stream_config, &output[0]);
-}
-
-}  // namespace test
-}  // namespace webrtc
diff --git a/modules/audio_processing/test/audio_buffer_tools.h b/modules/audio_processing/test/audio_buffer_tools.h
deleted file mode 100644
index 96ccad0..0000000
--- a/modules/audio_processing/test/audio_buffer_tools.h
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- *  Copyright (c) 2015 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_PROCESSING_TEST_AUDIO_BUFFER_TOOLS_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_TEST_AUDIO_BUFFER_TOOLS_H_
-
-#include <vector>
-#include "webrtc/api/array_view.h"
-#include "webrtc/modules/audio_processing/audio_buffer.h"
-#include "webrtc/modules/audio_processing/include/audio_processing.h"
-
-namespace webrtc {
-namespace test {
-
-// Copies a vector into an audiobuffer.
-void CopyVectorToAudioBuffer(const StreamConfig& stream_config,
-                             rtc::ArrayView<const float> source,
-                             AudioBuffer* destination);
-
-// Extracts a vector from an audiobuffer.
-void ExtractVectorFromAudioBuffer(const StreamConfig& stream_config,
-                                  AudioBuffer* source,
-                                  std::vector<float>* destination);
-
-}  // namespace test
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_TEST_AUDIO_BUFFER_TOOLS_H_
diff --git a/modules/audio_processing/test/audio_processing_simulator.cc b/modules/audio_processing/test/audio_processing_simulator.cc
deleted file mode 100644
index 3360a67..0000000
--- a/modules/audio_processing/test/audio_processing_simulator.cc
+++ /dev/null
@@ -1,399 +0,0 @@
-/*
- *  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_processing/test/audio_processing_simulator.h"
-
-#include <algorithm>
-#include <iostream>
-#include <sstream>
-#include <string>
-#include <vector>
-
-#include "webrtc/common_audio/include/audio_util.h"
-#include "webrtc/modules/audio_processing/aec_dump/aec_dump_factory.h"
-#include "webrtc/modules/audio_processing/include/audio_processing.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/stringutils.h"
-
-namespace webrtc {
-namespace test {
-namespace {
-
-void CopyFromAudioFrame(const AudioFrame& src, ChannelBuffer<float>* dest) {
-  RTC_CHECK_EQ(src.num_channels_, dest->num_channels());
-  RTC_CHECK_EQ(src.samples_per_channel_, dest->num_frames());
-  // Copy the data from the input buffer.
-  std::vector<float> tmp(src.samples_per_channel_ * src.num_channels_);
-  S16ToFloat(src.data(), tmp.size(), tmp.data());
-  Deinterleave(tmp.data(), src.samples_per_channel_, src.num_channels_,
-               dest->channels());
-}
-
-std::string GetIndexedOutputWavFilename(const std::string& wav_name,
-                                        int counter) {
-  std::stringstream ss;
-  ss << wav_name.substr(0, wav_name.size() - 4) << "_" << counter
-     << wav_name.substr(wav_name.size() - 4);
-  return ss.str();
-}
-
-void WriteEchoLikelihoodGraphFileHeader(std::ofstream* output_file) {
-  (*output_file) << "import numpy as np" << std::endl
-                 << "import matplotlib.pyplot as plt" << std::endl
-                 << "y = np.array([";
-}
-
-void WriteEchoLikelihoodGraphFileFooter(std::ofstream* output_file) {
-  (*output_file) << "])" << std::endl
-                 << "x = np.arange(len(y))*.01" << std::endl
-                 << "plt.plot(x, y)" << std::endl
-                 << "plt.ylabel('Echo likelihood')" << std::endl
-                 << "plt.xlabel('Time (s)')" << std::endl
-                 << "plt.ylim([0,1])" << std::endl
-                 << "plt.show()" << std::endl;
-}
-
-}  // namespace
-
-SimulationSettings::SimulationSettings() = default;
-SimulationSettings::SimulationSettings(const SimulationSettings&) = default;
-SimulationSettings::~SimulationSettings() = default;
-
-void CopyToAudioFrame(const ChannelBuffer<float>& src, AudioFrame* dest) {
-  RTC_CHECK_EQ(src.num_channels(), dest->num_channels_);
-  RTC_CHECK_EQ(src.num_frames(), dest->samples_per_channel_);
-  int16_t* dest_data = dest->mutable_data();
-  for (size_t ch = 0; ch < dest->num_channels_; ++ch) {
-    for (size_t sample = 0; sample < dest->samples_per_channel_; ++sample) {
-      dest_data[sample * dest->num_channels_ + ch] =
-          src.channels()[ch][sample] * 32767;
-    }
-  }
-}
-
-AudioProcessingSimulator::AudioProcessingSimulator(
-    const SimulationSettings& settings)
-    : settings_(settings), worker_queue_("file_writer_task_queue") {
-  if (settings_.ed_graph_output_filename &&
-      !settings_.ed_graph_output_filename->empty()) {
-    residual_echo_likelihood_graph_writer_.open(
-        *settings_.ed_graph_output_filename);
-    RTC_CHECK(residual_echo_likelihood_graph_writer_.is_open());
-    WriteEchoLikelihoodGraphFileHeader(&residual_echo_likelihood_graph_writer_);
-  }
-}
-
-AudioProcessingSimulator::~AudioProcessingSimulator() {
-  if (residual_echo_likelihood_graph_writer_.is_open()) {
-    WriteEchoLikelihoodGraphFileFooter(&residual_echo_likelihood_graph_writer_);
-    residual_echo_likelihood_graph_writer_.close();
-  }
-}
-
-AudioProcessingSimulator::ScopedTimer::~ScopedTimer() {
-  int64_t interval = rtc::TimeNanos() - start_time_;
-  proc_time_->sum += interval;
-  proc_time_->max = std::max(proc_time_->max, interval);
-  proc_time_->min = std::min(proc_time_->min, interval);
-}
-
-void AudioProcessingSimulator::ProcessStream(bool fixed_interface) {
-  if (fixed_interface) {
-    {
-      const auto st = ScopedTimer(mutable_proc_time());
-      RTC_CHECK_EQ(AudioProcessing::kNoError, ap_->ProcessStream(&fwd_frame_));
-    }
-    CopyFromAudioFrame(fwd_frame_, out_buf_.get());
-  } else {
-    const auto st = ScopedTimer(mutable_proc_time());
-    RTC_CHECK_EQ(AudioProcessing::kNoError,
-                 ap_->ProcessStream(in_buf_->channels(), in_config_,
-                                    out_config_, out_buf_->channels()));
-  }
-
-  if (buffer_writer_) {
-    buffer_writer_->Write(*out_buf_);
-  }
-
-  if (residual_echo_likelihood_graph_writer_.is_open()) {
-    auto stats = ap_->GetStatistics();
-    residual_echo_likelihood_graph_writer_ << stats.residual_echo_likelihood
-                                           << ", ";
-  }
-
-  ++num_process_stream_calls_;
-}
-
-void AudioProcessingSimulator::ProcessReverseStream(bool fixed_interface) {
-  if (fixed_interface) {
-    const auto st = ScopedTimer(mutable_proc_time());
-    RTC_CHECK_EQ(AudioProcessing::kNoError,
-                 ap_->ProcessReverseStream(&rev_frame_));
-    CopyFromAudioFrame(rev_frame_, reverse_out_buf_.get());
-
-  } else {
-    const auto st = ScopedTimer(mutable_proc_time());
-    RTC_CHECK_EQ(AudioProcessing::kNoError,
-                 ap_->ProcessReverseStream(
-                     reverse_in_buf_->channels(), reverse_in_config_,
-                     reverse_out_config_, reverse_out_buf_->channels()));
-  }
-
-  if (reverse_buffer_writer_) {
-    reverse_buffer_writer_->Write(*reverse_out_buf_);
-  }
-
-  ++num_reverse_process_stream_calls_;
-}
-
-void AudioProcessingSimulator::SetupBuffersConfigsOutputs(
-    int input_sample_rate_hz,
-    int output_sample_rate_hz,
-    int reverse_input_sample_rate_hz,
-    int reverse_output_sample_rate_hz,
-    int input_num_channels,
-    int output_num_channels,
-    int reverse_input_num_channels,
-    int reverse_output_num_channels) {
-  in_config_ = StreamConfig(input_sample_rate_hz, input_num_channels);
-  in_buf_.reset(new ChannelBuffer<float>(
-      rtc::CheckedDivExact(input_sample_rate_hz, kChunksPerSecond),
-      input_num_channels));
-
-  reverse_in_config_ =
-      StreamConfig(reverse_input_sample_rate_hz, reverse_input_num_channels);
-  reverse_in_buf_.reset(new ChannelBuffer<float>(
-      rtc::CheckedDivExact(reverse_input_sample_rate_hz, kChunksPerSecond),
-      reverse_input_num_channels));
-
-  out_config_ = StreamConfig(output_sample_rate_hz, output_num_channels);
-  out_buf_.reset(new ChannelBuffer<float>(
-      rtc::CheckedDivExact(output_sample_rate_hz, kChunksPerSecond),
-      output_num_channels));
-
-  reverse_out_config_ =
-      StreamConfig(reverse_output_sample_rate_hz, reverse_output_num_channels);
-  reverse_out_buf_.reset(new ChannelBuffer<float>(
-      rtc::CheckedDivExact(reverse_output_sample_rate_hz, kChunksPerSecond),
-      reverse_output_num_channels));
-
-  fwd_frame_.sample_rate_hz_ = input_sample_rate_hz;
-  fwd_frame_.samples_per_channel_ =
-      rtc::CheckedDivExact(fwd_frame_.sample_rate_hz_, kChunksPerSecond);
-  fwd_frame_.num_channels_ = input_num_channels;
-
-  rev_frame_.sample_rate_hz_ = reverse_input_sample_rate_hz;
-  rev_frame_.samples_per_channel_ =
-      rtc::CheckedDivExact(rev_frame_.sample_rate_hz_, kChunksPerSecond);
-  rev_frame_.num_channels_ = reverse_input_num_channels;
-
-  if (settings_.use_verbose_logging) {
-    std::cout << "Sample rates:" << std::endl;
-    std::cout << " Forward input: " << input_sample_rate_hz << std::endl;
-    std::cout << " Forward output: " << output_sample_rate_hz << std::endl;
-    std::cout << " Reverse input: " << reverse_input_sample_rate_hz
-              << std::endl;
-    std::cout << " Reverse output: " << reverse_output_sample_rate_hz
-              << std::endl;
-    std::cout << "Number of channels: " << std::endl;
-    std::cout << " Forward input: " << input_num_channels << std::endl;
-    std::cout << " Forward output: " << output_num_channels << std::endl;
-    std::cout << " Reverse input: " << reverse_input_num_channels << std::endl;
-    std::cout << " Reverse output: " << reverse_output_num_channels
-              << std::endl;
-  }
-
-  SetupOutput();
-}
-
-void AudioProcessingSimulator::SetupOutput() {
-  if (settings_.output_filename) {
-    std::string filename;
-    if (settings_.store_intermediate_output) {
-      filename = GetIndexedOutputWavFilename(*settings_.output_filename,
-                                             output_reset_counter_);
-    } else {
-      filename = *settings_.output_filename;
-    }
-
-    std::unique_ptr<WavWriter> out_file(
-        new WavWriter(filename, out_config_.sample_rate_hz(),
-                      static_cast<size_t>(out_config_.num_channels())));
-    buffer_writer_.reset(new ChannelBufferWavWriter(std::move(out_file)));
-  }
-
-  if (settings_.reverse_output_filename) {
-    std::string filename;
-    if (settings_.store_intermediate_output) {
-      filename = GetIndexedOutputWavFilename(*settings_.reverse_output_filename,
-                                             output_reset_counter_);
-    } else {
-      filename = *settings_.reverse_output_filename;
-    }
-
-    std::unique_ptr<WavWriter> reverse_out_file(
-        new WavWriter(filename, reverse_out_config_.sample_rate_hz(),
-                      static_cast<size_t>(reverse_out_config_.num_channels())));
-    reverse_buffer_writer_.reset(
-        new ChannelBufferWavWriter(std::move(reverse_out_file)));
-  }
-
-  ++output_reset_counter_;
-}
-
-void AudioProcessingSimulator::DestroyAudioProcessor() {
-  if (settings_.aec_dump_output_filename) {
-    ap_->DetachAecDump();
-  }
-}
-
-void AudioProcessingSimulator::CreateAudioProcessor() {
-  Config config;
-  AudioProcessing::Config apm_config;
-  if (settings_.use_bf && *settings_.use_bf) {
-    config.Set<Beamforming>(new Beamforming(
-        true, ParseArrayGeometry(*settings_.microphone_positions),
-        SphericalPointf(DegreesToRadians(settings_.target_angle_degrees), 0.f,
-                        1.f)));
-  }
-  if (settings_.use_ts) {
-    config.Set<ExperimentalNs>(new ExperimentalNs(*settings_.use_ts));
-  }
-  if (settings_.use_ie) {
-    config.Set<Intelligibility>(new Intelligibility(*settings_.use_ie));
-  }
-  if (settings_.use_aec3) {
-    apm_config.echo_canceller3.enabled = *settings_.use_aec3;
-  }
-  if (settings_.use_agc2) {
-    apm_config.gain_controller2.enabled = *settings_.use_agc2;
-  }
-  if (settings_.use_lc) {
-    apm_config.level_controller.enabled = *settings_.use_lc;
-  }
-  if (settings_.use_hpf) {
-    apm_config.high_pass_filter.enabled = *settings_.use_hpf;
-  }
-
-  if (settings_.use_refined_adaptive_filter) {
-    config.Set<RefinedAdaptiveFilter>(
-        new RefinedAdaptiveFilter(*settings_.use_refined_adaptive_filter));
-  }
-  config.Set<ExtendedFilter>(new ExtendedFilter(
-      !settings_.use_extended_filter || *settings_.use_extended_filter));
-  config.Set<DelayAgnostic>(new DelayAgnostic(!settings_.use_delay_agnostic ||
-                                              *settings_.use_delay_agnostic));
-  config.Set<ExperimentalAgc>(new ExperimentalAgc(
-      !settings_.use_experimental_agc || *settings_.use_experimental_agc));
-  if (settings_.use_ed) {
-    apm_config.residual_echo_detector.enabled = *settings_.use_ed;
-  }
-
-  ap_.reset(AudioProcessing::Create(config));
-  RTC_CHECK(ap_);
-
-  ap_->ApplyConfig(apm_config);
-
-  if (settings_.use_aec) {
-    RTC_CHECK_EQ(AudioProcessing::kNoError,
-                 ap_->echo_cancellation()->Enable(*settings_.use_aec));
-  }
-  if (settings_.use_aecm) {
-    RTC_CHECK_EQ(AudioProcessing::kNoError,
-                 ap_->echo_control_mobile()->Enable(*settings_.use_aecm));
-  }
-  if (settings_.use_agc) {
-    RTC_CHECK_EQ(AudioProcessing::kNoError,
-                 ap_->gain_control()->Enable(*settings_.use_agc));
-  }
-  if (settings_.use_ns) {
-    RTC_CHECK_EQ(AudioProcessing::kNoError,
-                 ap_->noise_suppression()->Enable(*settings_.use_ns));
-  }
-  if (settings_.use_le) {
-    RTC_CHECK_EQ(AudioProcessing::kNoError,
-                 ap_->level_estimator()->Enable(*settings_.use_le));
-  }
-  if (settings_.use_vad) {
-    RTC_CHECK_EQ(AudioProcessing::kNoError,
-                 ap_->voice_detection()->Enable(*settings_.use_vad));
-  }
-  if (settings_.use_agc_limiter) {
-    RTC_CHECK_EQ(AudioProcessing::kNoError, ap_->gain_control()->enable_limiter(
-                                                *settings_.use_agc_limiter));
-  }
-  if (settings_.agc_target_level) {
-    RTC_CHECK_EQ(AudioProcessing::kNoError,
-                 ap_->gain_control()->set_target_level_dbfs(
-                     *settings_.agc_target_level));
-  }
-  if (settings_.agc_compression_gain) {
-    RTC_CHECK_EQ(AudioProcessing::kNoError,
-                 ap_->gain_control()->set_compression_gain_db(
-                     *settings_.agc_compression_gain));
-  }
-  if (settings_.agc_mode) {
-    RTC_CHECK_EQ(
-        AudioProcessing::kNoError,
-        ap_->gain_control()->set_mode(
-            static_cast<webrtc::GainControl::Mode>(*settings_.agc_mode)));
-  }
-
-  if (settings_.use_drift_compensation) {
-    RTC_CHECK_EQ(AudioProcessing::kNoError,
-                 ap_->echo_cancellation()->enable_drift_compensation(
-                     *settings_.use_drift_compensation));
-  }
-
-  if (settings_.aec_suppression_level) {
-    RTC_CHECK_EQ(AudioProcessing::kNoError,
-                 ap_->echo_cancellation()->set_suppression_level(
-                     static_cast<webrtc::EchoCancellation::SuppressionLevel>(
-                         *settings_.aec_suppression_level)));
-  }
-
-  if (settings_.aecm_routing_mode) {
-    RTC_CHECK_EQ(AudioProcessing::kNoError,
-                 ap_->echo_control_mobile()->set_routing_mode(
-                     static_cast<webrtc::EchoControlMobile::RoutingMode>(
-                         *settings_.aecm_routing_mode)));
-  }
-
-  if (settings_.use_aecm_comfort_noise) {
-    RTC_CHECK_EQ(AudioProcessing::kNoError,
-                 ap_->echo_control_mobile()->enable_comfort_noise(
-                     *settings_.use_aecm_comfort_noise));
-  }
-
-  if (settings_.vad_likelihood) {
-    RTC_CHECK_EQ(AudioProcessing::kNoError,
-                 ap_->voice_detection()->set_likelihood(
-                     static_cast<webrtc::VoiceDetection::Likelihood>(
-                         *settings_.vad_likelihood)));
-  }
-  if (settings_.ns_level) {
-    RTC_CHECK_EQ(
-        AudioProcessing::kNoError,
-        ap_->noise_suppression()->set_level(
-            static_cast<NoiseSuppression::Level>(*settings_.ns_level)));
-  }
-
-  if (settings_.use_ts) {
-    ap_->set_stream_key_pressed(*settings_.use_ts);
-  }
-
-  if (settings_.aec_dump_output_filename) {
-    ap_->AttachAecDump(AecDumpFactory::Create(
-        *settings_.aec_dump_output_filename, -1, &worker_queue_));
-  }
-}
-
-}  // namespace test
-}  // namespace webrtc
diff --git a/modules/audio_processing/test/audio_processing_simulator.h b/modules/audio_processing/test/audio_processing_simulator.h
deleted file mode 100644
index 8a2295f..0000000
--- a/modules/audio_processing/test/audio_processing_simulator.h
+++ /dev/null
@@ -1,189 +0,0 @@
-/*
- *  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_PROCESSING_TEST_AUDIO_PROCESSING_SIMULATOR_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_TEST_AUDIO_PROCESSING_SIMULATOR_H_
-
-#include <algorithm>
-#include <fstream>
-#include <limits>
-#include <memory>
-#include <string>
-
-#include "webrtc/api/optional.h"
-#include "webrtc/common_audio/channel_buffer.h"
-#include "webrtc/modules/audio_processing/include/audio_processing.h"
-#include "webrtc/modules/audio_processing/test/test_utils.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/task_queue.h"
-#include "webrtc/rtc_base/timeutils.h"
-
-namespace webrtc {
-namespace test {
-
-// Holds all the parameters available for controlling the simulation.
-struct SimulationSettings {
-  SimulationSettings();
-  SimulationSettings(const SimulationSettings&);
-  ~SimulationSettings();
-  rtc::Optional<int> stream_delay;
-  rtc::Optional<int> stream_drift_samples;
-  rtc::Optional<int> output_sample_rate_hz;
-  rtc::Optional<int> output_num_channels;
-  rtc::Optional<int> reverse_output_sample_rate_hz;
-  rtc::Optional<int> reverse_output_num_channels;
-  rtc::Optional<std::string> microphone_positions;
-  int target_angle_degrees = 90;
-  rtc::Optional<std::string> output_filename;
-  rtc::Optional<std::string> reverse_output_filename;
-  rtc::Optional<std::string> input_filename;
-  rtc::Optional<std::string> reverse_input_filename;
-  rtc::Optional<std::string> artificial_nearend_filename;
-  rtc::Optional<bool> use_aec;
-  rtc::Optional<bool> use_aecm;
-  rtc::Optional<bool> use_ed;  // Residual Echo Detector.
-  rtc::Optional<std::string> ed_graph_output_filename;
-  rtc::Optional<bool> use_agc;
-  rtc::Optional<bool> use_agc2;
-  rtc::Optional<bool> use_hpf;
-  rtc::Optional<bool> use_ns;
-  rtc::Optional<bool> use_ts;
-  rtc::Optional<bool> use_bf;
-  rtc::Optional<bool> use_ie;
-  rtc::Optional<bool> use_vad;
-  rtc::Optional<bool> use_le;
-  rtc::Optional<bool> use_all;
-  rtc::Optional<int> aec_suppression_level;
-  rtc::Optional<bool> use_delay_agnostic;
-  rtc::Optional<bool> use_extended_filter;
-  rtc::Optional<bool> use_drift_compensation;
-  rtc::Optional<bool> use_aec3;
-  rtc::Optional<bool> use_lc;
-  rtc::Optional<bool> use_experimental_agc;
-  rtc::Optional<int> aecm_routing_mode;
-  rtc::Optional<bool> use_aecm_comfort_noise;
-  rtc::Optional<int> agc_mode;
-  rtc::Optional<int> agc_target_level;
-  rtc::Optional<bool> use_agc_limiter;
-  rtc::Optional<int> agc_compression_gain;
-  rtc::Optional<int> vad_likelihood;
-  rtc::Optional<int> ns_level;
-  rtc::Optional<bool> use_refined_adaptive_filter;
-  bool report_performance = false;
-  bool report_bitexactness = false;
-  bool use_verbose_logging = false;
-  bool discard_all_settings_in_aecdump = true;
-  rtc::Optional<std::string> aec_dump_input_filename;
-  rtc::Optional<std::string> aec_dump_output_filename;
-  bool fixed_interface = false;
-  bool store_intermediate_output = false;
-  rtc::Optional<std::string> custom_call_order_filename;
-};
-
-// Holds a few statistics about a series of TickIntervals.
-struct TickIntervalStats {
-  TickIntervalStats() : min(std::numeric_limits<int64_t>::max()) {}
-  int64_t sum;
-  int64_t max;
-  int64_t min;
-};
-
-// Copies samples present in a ChannelBuffer into an AudioFrame.
-void CopyToAudioFrame(const ChannelBuffer<float>& src, AudioFrame* dest);
-
-// Provides common functionality for performing audioprocessing simulations.
-class AudioProcessingSimulator {
- public:
-  static const int kChunksPerSecond = 1000 / AudioProcessing::kChunkSizeMs;
-
-  explicit AudioProcessingSimulator(const SimulationSettings& settings);
-  virtual ~AudioProcessingSimulator();
-
-  // Processes the data in the input.
-  virtual void Process() = 0;
-
-  // Returns the execution time of all AudioProcessing calls.
-  const TickIntervalStats& proc_time() const { return proc_time_; }
-
-  // Reports whether the processed recording was bitexact.
-  bool OutputWasBitexact() { return bitexact_output_; }
-
-  size_t get_num_process_stream_calls() { return num_process_stream_calls_; }
-  size_t get_num_reverse_process_stream_calls() {
-    return num_reverse_process_stream_calls_;
-  }
-
- protected:
-  // RAII class for execution time measurement. Updates the provided
-  // TickIntervalStats based on the time between ScopedTimer creation and
-  // leaving the enclosing scope.
-  class ScopedTimer {
-   public:
-    explicit ScopedTimer(TickIntervalStats* proc_time)
-        : proc_time_(proc_time), start_time_(rtc::TimeNanos()) {}
-
-    ~ScopedTimer();
-
-   private:
-    TickIntervalStats* const proc_time_;
-    int64_t start_time_;
-  };
-
-  TickIntervalStats* mutable_proc_time() { return &proc_time_; }
-  void ProcessStream(bool fixed_interface);
-  void ProcessReverseStream(bool fixed_interface);
-  void CreateAudioProcessor();
-  void DestroyAudioProcessor();
-  void SetupBuffersConfigsOutputs(int input_sample_rate_hz,
-                                  int output_sample_rate_hz,
-                                  int reverse_input_sample_rate_hz,
-                                  int reverse_output_sample_rate_hz,
-                                  int input_num_channels,
-                                  int output_num_channels,
-                                  int reverse_input_num_channels,
-                                  int reverse_output_num_channels);
-
-  const SimulationSettings settings_;
-  std::unique_ptr<AudioProcessing> ap_;
-
-  std::unique_ptr<ChannelBuffer<float>> in_buf_;
-  std::unique_ptr<ChannelBuffer<float>> out_buf_;
-  std::unique_ptr<ChannelBuffer<float>> reverse_in_buf_;
-  std::unique_ptr<ChannelBuffer<float>> reverse_out_buf_;
-  StreamConfig in_config_;
-  StreamConfig out_config_;
-  StreamConfig reverse_in_config_;
-  StreamConfig reverse_out_config_;
-  std::unique_ptr<ChannelBufferWavReader> buffer_reader_;
-  std::unique_ptr<ChannelBufferWavReader> reverse_buffer_reader_;
-  AudioFrame rev_frame_;
-  AudioFrame fwd_frame_;
-  bool bitexact_output_ = true;
-
- private:
-  void SetupOutput();
-
-  size_t num_process_stream_calls_ = 0;
-  size_t num_reverse_process_stream_calls_ = 0;
-  size_t output_reset_counter_ = 0;
-  std::unique_ptr<ChannelBufferWavWriter> buffer_writer_;
-  std::unique_ptr<ChannelBufferWavWriter> reverse_buffer_writer_;
-  TickIntervalStats proc_time_;
-  std::ofstream residual_echo_likelihood_graph_writer_;
-
-  rtc::TaskQueue worker_queue_;
-
-  RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(AudioProcessingSimulator);
-};
-
-}  // namespace test
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_TEST_AUDIO_PROCESSING_SIMULATOR_H_
diff --git a/modules/audio_processing/test/audioproc_float.cc b/modules/audio_processing/test/audioproc_float.cc
deleted file mode 100644
index d0c813f..0000000
--- a/modules/audio_processing/test/audioproc_float.cc
+++ /dev/null
@@ -1,479 +0,0 @@
-/*
- *  Copyright (c) 2014 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 <iostream>
-#include <memory>
-
-#include <string.h>
-
-#include "webrtc/modules/audio_processing/include/audio_processing.h"
-#include "webrtc/modules/audio_processing/test/aec_dump_based_simulator.h"
-#include "webrtc/modules/audio_processing/test/audio_processing_simulator.h"
-#include "webrtc/modules/audio_processing/test/wav_based_simulator.h"
-#include "webrtc/rtc_base/flags.h"
-
-namespace webrtc {
-namespace test {
-namespace {
-
-const int kParameterNotSpecifiedValue = -10000;
-
-const char kUsageDescription[] =
-    "Usage: audioproc_f [options] -i <input.wav>\n"
-    "                   or\n"
-    "       audioproc_f [options] -dump_input <aec_dump>\n"
-    "\n\n"
-    "Command-line tool to simulate a call using the audio "
-    "processing module, either based on wav files or "
-    "protobuf debug dump recordings.\n";
-
-DEFINE_string(dump_input, "", "Aec dump input filename");
-DEFINE_string(dump_output, "", "Aec dump output filename");
-DEFINE_string(i, "", "Forward stream input wav filename");
-DEFINE_string(o, "", "Forward stream output wav filename");
-DEFINE_string(ri, "", "Reverse stream input wav filename");
-DEFINE_string(ro, "", "Reverse stream output wav filename");
-DEFINE_string(artificial_nearend, "", "Artificial nearend wav filename");
-DEFINE_int(output_num_channels,
-           kParameterNotSpecifiedValue,
-           "Number of forward stream output channels");
-DEFINE_int(reverse_output_num_channels,
-           kParameterNotSpecifiedValue,
-           "Number of Reverse stream output channels");
-DEFINE_int(output_sample_rate_hz,
-           kParameterNotSpecifiedValue,
-           "Forward stream output sample rate in Hz");
-DEFINE_int(reverse_output_sample_rate_hz,
-           kParameterNotSpecifiedValue,
-           "Reverse stream output sample rate in Hz");
-DEFINE_string(mic_positions,
-              "",
-              "Space delimited cartesian coordinates of microphones in "
-              "meters. The coordinates of each point are contiguous. For a "
-              "two element array: \"x1 y1 z1 x2 y2 z2\"");
-DEFINE_int(target_angle_degrees,
-           90,
-           "The azimuth of the target in degrees (0-359). Only applies to "
-           "beamforming.");
-DEFINE_bool(fixed_interface,
-            false,
-            "Use the fixed interface when operating on wav files");
-DEFINE_int(aec,
-           kParameterNotSpecifiedValue,
-           "Activate (1) or deactivate(0) the echo canceller");
-DEFINE_int(aecm,
-           kParameterNotSpecifiedValue,
-           "Activate (1) or deactivate(0) the mobile echo controller");
-DEFINE_int(ed,
-           kParameterNotSpecifiedValue,
-           "Activate (1) or deactivate (0) the residual echo detector");
-DEFINE_string(ed_graph, "", "Output filename for graph of echo likelihood");
-DEFINE_int(agc,
-           kParameterNotSpecifiedValue,
-           "Activate (1) or deactivate(0) the AGC");
-DEFINE_int(agc2,
-           kParameterNotSpecifiedValue,
-           "Activate (1) or deactivate(0) the AGC2");
-DEFINE_int(hpf,
-           kParameterNotSpecifiedValue,
-           "Activate (1) or deactivate(0) the high-pass filter");
-DEFINE_int(ns,
-           kParameterNotSpecifiedValue,
-           "Activate (1) or deactivate(0) the noise suppressor");
-DEFINE_int(ts,
-           kParameterNotSpecifiedValue,
-           "Activate (1) or deactivate(0) the transient suppressor");
-DEFINE_int(bf,
-           kParameterNotSpecifiedValue,
-           "Activate (1) or deactivate(0) the beamformer");
-DEFINE_int(ie,
-           kParameterNotSpecifiedValue,
-           "Activate (1) or deactivate(0) the intelligibility enhancer");
-DEFINE_int(vad,
-           kParameterNotSpecifiedValue,
-           "Activate (1) or deactivate(0) the voice activity detector");
-DEFINE_int(le,
-           kParameterNotSpecifiedValue,
-           "Activate (1) or deactivate(0) the level estimator");
-DEFINE_bool(all_default,
-            false,
-            "Activate all of the default components (will be overridden by any "
-            "other settings)");
-DEFINE_int(aec_suppression_level,
-           kParameterNotSpecifiedValue,
-           "Set the aec suppression level (0-2)");
-DEFINE_int(delay_agnostic,
-           kParameterNotSpecifiedValue,
-           "Activate (1) or deactivate(0) the AEC delay agnostic mode");
-DEFINE_int(extended_filter,
-           kParameterNotSpecifiedValue,
-           "Activate (1) or deactivate(0) the AEC extended filter mode");
-DEFINE_int(drift_compensation,
-           kParameterNotSpecifiedValue,
-           "Activate (1) or deactivate(0) the drift compensation");
-DEFINE_int(aec3,
-           kParameterNotSpecifiedValue,
-           "Activate (1) or deactivate(0) the experimental AEC mode AEC3");
-DEFINE_int(lc,
-           kParameterNotSpecifiedValue,
-           "Activate (1) or deactivate(0) the level control");
-DEFINE_int(experimental_agc,
-           kParameterNotSpecifiedValue,
-           "Activate (1) or deactivate(0) the experimental AGC");
-DEFINE_int(
-    refined_adaptive_filter,
-    kParameterNotSpecifiedValue,
-    "Activate (1) or deactivate(0) the refined adaptive filter functionality");
-DEFINE_int(aecm_routing_mode,
-           kParameterNotSpecifiedValue,
-           "Specify the AECM routing mode (0-4)");
-DEFINE_int(aecm_comfort_noise,
-           kParameterNotSpecifiedValue,
-           "Activate (1) or deactivate(0) the AECM comfort noise");
-DEFINE_int(agc_mode,
-           kParameterNotSpecifiedValue,
-           "Specify the AGC mode (0-2)");
-DEFINE_int(agc_target_level,
-           kParameterNotSpecifiedValue,
-           "Specify the AGC target level (0-31)");
-DEFINE_int(agc_limiter,
-           kParameterNotSpecifiedValue,
-           "Activate (1) or deactivate(0) the level estimator");
-DEFINE_int(agc_compression_gain,
-           kParameterNotSpecifiedValue,
-           "Specify the AGC compression gain (0-90)");
-DEFINE_int(vad_likelihood,
-           kParameterNotSpecifiedValue,
-           "Specify the VAD likelihood (0-3)");
-DEFINE_int(ns_level,
-           kParameterNotSpecifiedValue,
-           "Specify the NS level (0-3)");
-DEFINE_int(stream_delay,
-           kParameterNotSpecifiedValue,
-           "Specify the stream delay in ms to use");
-DEFINE_int(stream_drift_samples,
-           kParameterNotSpecifiedValue,
-           "Specify the number of stream drift samples to use");
-DEFINE_bool(performance_report, false, "Report the APM performance ");
-DEFINE_bool(verbose, false, "Produce verbose output");
-DEFINE_bool(bitexactness_report,
-            false,
-            "Report bitexactness for aec dump result reproduction");
-DEFINE_bool(discard_settings_in_aecdump,
-            false,
-            "Discard any config settings specified in the aec dump");
-DEFINE_bool(store_intermediate_output,
-            false,
-            "Creates new output files after each init");
-DEFINE_string(custom_call_order_file, "", "Custom process API call order file");
-DEFINE_bool(help, false, "Print this message");
-
-void SetSettingIfSpecified(const std::string& value,
-                           rtc::Optional<std::string>* parameter) {
-  if (value.compare("") != 0) {
-    *parameter = rtc::Optional<std::string>(value);
-  }
-}
-
-void SetSettingIfSpecified(int value, rtc::Optional<int>* parameter) {
-  if (value != kParameterNotSpecifiedValue) {
-    *parameter = rtc::Optional<int>(value);
-  }
-}
-
-void SetSettingIfFlagSet(int32_t flag, rtc::Optional<bool>* parameter) {
-  if (flag == 0) {
-    *parameter = rtc::Optional<bool>(false);
-  } else if (flag == 1) {
-    *parameter = rtc::Optional<bool>(true);
-  }
-}
-
-SimulationSettings CreateSettings() {
-  SimulationSettings settings;
-  if (FLAG_all_default) {
-    settings.use_le = rtc::Optional<bool>(true);
-    settings.use_vad = rtc::Optional<bool>(true);
-    settings.use_ie = rtc::Optional<bool>(false);
-    settings.use_bf = rtc::Optional<bool>(false);
-    settings.use_ts = rtc::Optional<bool>(true);
-    settings.use_ns = rtc::Optional<bool>(true);
-    settings.use_hpf = rtc::Optional<bool>(true);
-    settings.use_agc = rtc::Optional<bool>(true);
-    settings.use_aec = rtc::Optional<bool>(true);
-    settings.use_aecm = rtc::Optional<bool>(false);
-    settings.use_ed = rtc::Optional<bool>(false);
-  }
-  SetSettingIfSpecified(FLAG_dump_input, &settings.aec_dump_input_filename);
-  SetSettingIfSpecified(FLAG_dump_output, &settings.aec_dump_output_filename);
-  SetSettingIfSpecified(FLAG_i, &settings.input_filename);
-  SetSettingIfSpecified(FLAG_o, &settings.output_filename);
-  SetSettingIfSpecified(FLAG_ri, &settings.reverse_input_filename);
-  SetSettingIfSpecified(FLAG_ro, &settings.reverse_output_filename);
-  SetSettingIfSpecified(FLAG_artificial_nearend,
-                        &settings.artificial_nearend_filename);
-  SetSettingIfSpecified(FLAG_output_num_channels,
-                        &settings.output_num_channels);
-  SetSettingIfSpecified(FLAG_reverse_output_num_channels,
-                        &settings.reverse_output_num_channels);
-  SetSettingIfSpecified(FLAG_output_sample_rate_hz,
-                        &settings.output_sample_rate_hz);
-  SetSettingIfSpecified(FLAG_reverse_output_sample_rate_hz,
-                        &settings.reverse_output_sample_rate_hz);
-  SetSettingIfSpecified(FLAG_mic_positions, &settings.microphone_positions);
-  settings.target_angle_degrees = FLAG_target_angle_degrees;
-  SetSettingIfFlagSet(FLAG_aec, &settings.use_aec);
-  SetSettingIfFlagSet(FLAG_aecm, &settings.use_aecm);
-  SetSettingIfFlagSet(FLAG_ed, &settings.use_ed);
-  SetSettingIfSpecified(FLAG_ed_graph, &settings.ed_graph_output_filename);
-  SetSettingIfFlagSet(FLAG_agc, &settings.use_agc);
-  SetSettingIfFlagSet(FLAG_agc2, &settings.use_agc2);
-  SetSettingIfFlagSet(FLAG_hpf, &settings.use_hpf);
-  SetSettingIfFlagSet(FLAG_ns, &settings.use_ns);
-  SetSettingIfFlagSet(FLAG_ts, &settings.use_ts);
-  SetSettingIfFlagSet(FLAG_bf, &settings.use_bf);
-  SetSettingIfFlagSet(FLAG_ie, &settings.use_ie);
-  SetSettingIfFlagSet(FLAG_vad, &settings.use_vad);
-  SetSettingIfFlagSet(FLAG_le, &settings.use_le);
-  SetSettingIfSpecified(FLAG_aec_suppression_level,
-                        &settings.aec_suppression_level);
-  SetSettingIfFlagSet(FLAG_delay_agnostic, &settings.use_delay_agnostic);
-  SetSettingIfFlagSet(FLAG_extended_filter, &settings.use_extended_filter);
-  SetSettingIfFlagSet(FLAG_drift_compensation,
-                      &settings.use_drift_compensation);
-  SetSettingIfFlagSet(FLAG_refined_adaptive_filter,
-                      &settings.use_refined_adaptive_filter);
-
-  SetSettingIfFlagSet(FLAG_aec3, &settings.use_aec3);
-  SetSettingIfFlagSet(FLAG_lc, &settings.use_lc);
-  SetSettingIfFlagSet(FLAG_experimental_agc, &settings.use_experimental_agc);
-  SetSettingIfSpecified(FLAG_aecm_routing_mode, &settings.aecm_routing_mode);
-  SetSettingIfFlagSet(FLAG_aecm_comfort_noise,
-                      &settings.use_aecm_comfort_noise);
-  SetSettingIfSpecified(FLAG_agc_mode, &settings.agc_mode);
-  SetSettingIfSpecified(FLAG_agc_target_level, &settings.agc_target_level);
-  SetSettingIfFlagSet(FLAG_agc_limiter, &settings.use_agc_limiter);
-  SetSettingIfSpecified(FLAG_agc_compression_gain,
-                        &settings.agc_compression_gain);
-  SetSettingIfSpecified(FLAG_vad_likelihood, &settings.vad_likelihood);
-  SetSettingIfSpecified(FLAG_ns_level, &settings.ns_level);
-  SetSettingIfSpecified(FLAG_stream_delay, &settings.stream_delay);
-  SetSettingIfSpecified(FLAG_stream_drift_samples,
-                        &settings.stream_drift_samples);
-  SetSettingIfSpecified(FLAG_custom_call_order_file,
-                        &settings.custom_call_order_filename);
-  settings.report_performance = FLAG_performance_report;
-  settings.use_verbose_logging = FLAG_verbose;
-  settings.report_bitexactness = FLAG_bitexactness_report;
-  settings.discard_all_settings_in_aecdump = FLAG_discard_settings_in_aecdump;
-  settings.fixed_interface = FLAG_fixed_interface;
-  settings.store_intermediate_output = FLAG_store_intermediate_output;
-
-  return settings;
-}
-
-void ReportConditionalErrorAndExit(bool condition, const std::string& message) {
-  if (condition) {
-    std::cerr << message << std::endl;
-    exit(1);
-  }
-}
-
-void PerformBasicParameterSanityChecks(const SimulationSettings& settings) {
-  if (settings.input_filename || settings.reverse_input_filename) {
-    ReportConditionalErrorAndExit(!!settings.aec_dump_input_filename,
-                                  "Error: The aec dump cannot be specified "
-                                  "together with input wav files!\n");
-
-    ReportConditionalErrorAndExit(!!settings.artificial_nearend_filename,
-                                  "Error: The artificial nearend cannot be "
-                                  "specified together with input wav files!\n");
-
-    ReportConditionalErrorAndExit(!settings.input_filename,
-                                  "Error: When operating at wav files, the "
-                                  "input wav filename must be "
-                                  "specified!\n");
-
-    ReportConditionalErrorAndExit(
-        settings.reverse_output_filename && !settings.reverse_input_filename,
-        "Error: When operating at wav files, the reverse input wav filename "
-        "must be specified if the reverse output wav filename is specified!\n");
-  } else {
-    ReportConditionalErrorAndExit(!settings.aec_dump_input_filename,
-                                  "Error: Either the aec dump or the wav "
-                                  "input files must be specified!\n");
-  }
-
-  ReportConditionalErrorAndExit(
-      settings.use_aec && *settings.use_aec && settings.use_aecm &&
-          *settings.use_aecm,
-      "Error: The AEC and the AECM cannot be activated at the same time!\n");
-
-  ReportConditionalErrorAndExit(
-      settings.output_sample_rate_hz && *settings.output_sample_rate_hz <= 0,
-      "Error: --output_sample_rate_hz must be positive!\n");
-
-  ReportConditionalErrorAndExit(
-      settings.reverse_output_sample_rate_hz &&
-          settings.output_sample_rate_hz &&
-          *settings.output_sample_rate_hz <= 0,
-      "Error: --reverse_output_sample_rate_hz must be positive!\n");
-
-  ReportConditionalErrorAndExit(
-      settings.output_num_channels && *settings.output_num_channels <= 0,
-      "Error: --output_num_channels must be positive!\n");
-
-  ReportConditionalErrorAndExit(
-      settings.reverse_output_num_channels &&
-          *settings.reverse_output_num_channels <= 0,
-      "Error: --reverse_output_num_channels must be positive!\n");
-
-  ReportConditionalErrorAndExit(
-      settings.use_bf && *settings.use_bf && !settings.microphone_positions,
-      "Error: --mic_positions must be specified when the beamformer is "
-      "activated.\n");
-
-  ReportConditionalErrorAndExit(
-      settings.target_angle_degrees < 0 || settings.target_angle_degrees > 359,
-      "Error: -target_angle_degrees must be specified between 0 and 359.\n");
-
-  ReportConditionalErrorAndExit(
-      settings.aec_suppression_level &&
-          ((*settings.aec_suppression_level) < 0 ||
-           (*settings.aec_suppression_level) > 2),
-      "Error: --aec_suppression_level must be specified between 0 and 2.\n");
-
-  ReportConditionalErrorAndExit(
-      settings.aecm_routing_mode && ((*settings.aecm_routing_mode) < 0 ||
-                                     (*settings.aecm_routing_mode) > 4),
-      "Error: --aecm_routing_mode must be specified between 0 and 4.\n");
-
-  ReportConditionalErrorAndExit(
-      settings.agc_target_level && ((*settings.agc_target_level) < 0 ||
-                                    (*settings.agc_target_level) > 31),
-      "Error: --agc_target_level must be specified between 0 and 31.\n");
-
-  ReportConditionalErrorAndExit(
-      settings.agc_compression_gain && ((*settings.agc_compression_gain) < 0 ||
-                                        (*settings.agc_compression_gain) > 90),
-      "Error: --agc_compression_gain must be specified between 0 and 90.\n");
-
-  ReportConditionalErrorAndExit(
-      settings.vad_likelihood &&
-          ((*settings.vad_likelihood) < 0 || (*settings.vad_likelihood) > 3),
-      "Error: --vad_likelihood must be specified between 0 and 3.\n");
-
-  ReportConditionalErrorAndExit(
-      settings.ns_level &&
-          ((*settings.ns_level) < 0 || (*settings.ns_level) > 3),
-      "Error: --ns_level must be specified between 0 and 3.\n");
-
-  ReportConditionalErrorAndExit(
-      settings.report_bitexactness && !settings.aec_dump_input_filename,
-      "Error: --bitexactness_report can only be used when operating on an "
-      "aecdump\n");
-
-  ReportConditionalErrorAndExit(
-      settings.custom_call_order_filename && settings.aec_dump_input_filename,
-      "Error: --custom_call_order_file cannot be used when operating on an "
-      "aecdump\n");
-
-  auto valid_wav_name = [](const std::string& wav_file_name) {
-    if (wav_file_name.size() < 5) {
-      return false;
-    }
-    if ((wav_file_name.compare(wav_file_name.size() - 4, 4, ".wav") == 0) ||
-        (wav_file_name.compare(wav_file_name.size() - 4, 4, ".WAV") == 0)) {
-      return true;
-    }
-    return false;
-  };
-
-  ReportConditionalErrorAndExit(
-      settings.input_filename && (!valid_wav_name(*settings.input_filename)),
-      "Error: --i must be a valid .wav file name.\n");
-
-  ReportConditionalErrorAndExit(
-      settings.output_filename && (!valid_wav_name(*settings.output_filename)),
-      "Error: --o must be a valid .wav file name.\n");
-
-  ReportConditionalErrorAndExit(
-      settings.reverse_input_filename &&
-          (!valid_wav_name(*settings.reverse_input_filename)),
-      "Error: --ri must be a valid .wav file name.\n");
-
-  ReportConditionalErrorAndExit(
-      settings.reverse_output_filename &&
-          (!valid_wav_name(*settings.reverse_output_filename)),
-      "Error: --ro must be a valid .wav file name.\n");
-
-  ReportConditionalErrorAndExit(
-      settings.artificial_nearend_filename &&
-          !valid_wav_name(*settings.artificial_nearend_filename),
-      "Error: --artifical_nearend must be a valid .wav file name.\n");
-}
-
-}  // namespace
-
-int main(int argc, char* argv[]) {
-  if (rtc::FlagList::SetFlagsFromCommandLine(&argc, argv, true) ||
-      FLAG_help || argc != 1) {
-    printf("%s", kUsageDescription);
-    if (FLAG_help) {
-      rtc::FlagList::Print(nullptr, false);
-      return 0;
-    }
-    return 1;
-  }
-
-  SimulationSettings settings = CreateSettings();
-  PerformBasicParameterSanityChecks(settings);
-  std::unique_ptr<AudioProcessingSimulator> processor;
-
-  if (settings.aec_dump_input_filename) {
-    processor.reset(new AecDumpBasedSimulator(settings));
-  } else {
-    processor.reset(new WavBasedSimulator(settings));
-  }
-
-  processor->Process();
-
-  if (settings.report_performance) {
-    const auto& proc_time = processor->proc_time();
-    int64_t exec_time_us = proc_time.sum / rtc::kNumNanosecsPerMicrosec;
-    std::cout << std::endl
-              << "Execution time: " << exec_time_us * 1e-6 << " s, File time: "
-              << processor->get_num_process_stream_calls() * 1.f /
-                     AudioProcessingSimulator::kChunksPerSecond
-              << std::endl
-              << "Time per fwd stream chunk (mean, max, min): " << std::endl
-              << exec_time_us * 1.f / processor->get_num_process_stream_calls()
-              << " us, " << 1.f * proc_time.max / rtc::kNumNanosecsPerMicrosec
-              << " us, " << 1.f * proc_time.min / rtc::kNumNanosecsPerMicrosec
-              << " us" << std::endl;
-  }
-
-  if (settings.report_bitexactness && settings.aec_dump_input_filename) {
-    if (processor->OutputWasBitexact()) {
-      std::cout << "The processing was bitexact.";
-    } else {
-      std::cout << "The processing was not bitexact.";
-    }
-  }
-
-  return 0;
-}
-
-}  // namespace test
-}  // namespace webrtc
-
-int main(int argc, char* argv[]) {
-  return webrtc::test::main(argc, argv);
-}
diff --git a/modules/audio_processing/test/bitexactness_tools.cc b/modules/audio_processing/test/bitexactness_tools.cc
deleted file mode 100644
index c5e4d38..0000000
--- a/modules/audio_processing/test/bitexactness_tools.cc
+++ /dev/null
@@ -1,146 +0,0 @@
-/*
- *  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_processing/test/bitexactness_tools.h"
-
-#include <math.h>
-#include <algorithm>
-#include <string>
-#include <vector>
-
-#include "webrtc/api/array_view.h"
-#include "webrtc/test/testsupport/fileutils.h"
-
-namespace webrtc {
-namespace test {
-
-std::string GetApmRenderTestVectorFileName(int sample_rate_hz) {
-  switch (sample_rate_hz) {
-    case 8000:
-      return ResourcePath("far8_stereo", "pcm");
-    case 16000:
-      return ResourcePath("far16_stereo", "pcm");
-    case 32000:
-      return ResourcePath("far32_stereo", "pcm");
-    case 48000:
-      return ResourcePath("far48_stereo", "pcm");
-    default:
-      RTC_NOTREACHED();
-  }
-  return "";
-}
-
-std::string GetApmCaptureTestVectorFileName(int sample_rate_hz) {
-  switch (sample_rate_hz) {
-    case 8000:
-      return ResourcePath("near8_stereo", "pcm");
-    case 16000:
-      return ResourcePath("near16_stereo", "pcm");
-    case 32000:
-      return ResourcePath("near32_stereo", "pcm");
-    case 48000:
-      return ResourcePath("near48_stereo", "pcm");
-    default:
-      RTC_NOTREACHED();
-  }
-  return "";
-}
-
-void ReadFloatSamplesFromStereoFile(size_t samples_per_channel,
-                                    size_t num_channels,
-                                    InputAudioFile* stereo_pcm_file,
-                                    rtc::ArrayView<float> data) {
-  RTC_DCHECK_EQ(data.size(), samples_per_channel * num_channels);
-  std::vector<int16_t> read_samples(samples_per_channel * 2);
-  stereo_pcm_file->Read(samples_per_channel * 2, read_samples.data());
-
-  // Convert samples to float and discard any channels not needed.
-  for (size_t sample = 0; sample < samples_per_channel; ++sample) {
-    for (size_t channel = 0; channel < num_channels; ++channel) {
-      data[sample * num_channels + channel] =
-          read_samples[sample * 2 + channel] / 32768.0f;
-    }
-  }
-}
-
-::testing::AssertionResult VerifyDeinterleavedArray(
-    size_t samples_per_channel,
-    size_t num_channels,
-    rtc::ArrayView<const float> reference,
-    rtc::ArrayView<const float> output,
-    float element_error_bound) {
-  // Form vectors to compare the reference to. Only the first values of the
-  // outputs are compared in order not having to specify all preceeding frames
-  // as testvectors.
-  const size_t reference_frame_length =
-      rtc::CheckedDivExact(reference.size(), num_channels);
-
-  std::vector<float> output_to_verify;
-  for (size_t channel_no = 0; channel_no < num_channels; ++channel_no) {
-    output_to_verify.insert(output_to_verify.end(),
-                            output.begin() + channel_no * samples_per_channel,
-                            output.begin() + channel_no * samples_per_channel +
-                                reference_frame_length);
-  }
-
-  return VerifyArray(reference, output_to_verify, element_error_bound);
-}
-
-::testing::AssertionResult VerifyArray(rtc::ArrayView<const float> reference,
-                                       rtc::ArrayView<const float> output,
-                                       float element_error_bound) {
-  // The vectors are deemed to be bitexact only if
-  // a) output have a size at least as long as the reference.
-  // b) the samples in the reference are bitexact with the corresponding samples
-  //    in the output.
-
-  bool equal = true;
-  if (output.size() < reference.size()) {
-    equal = false;
-  } else {
-    // Compare the first samples in the vectors.
-    for (size_t k = 0; k < reference.size(); ++k) {
-      if (fabs(output[k] - reference[k]) > element_error_bound) {
-        equal = false;
-        break;
-      }
-    }
-  }
-
-  if (equal) {
-    return ::testing::AssertionSuccess();
-  }
-
-  // Lambda function that produces a formatted string with the data in the
-  // vector.
-  auto print_vector_in_c_format = [](rtc::ArrayView<const float> v,
-                                     size_t num_values_to_print) {
-    std::string s = "{ ";
-    for (size_t k = 0; k < std::min(num_values_to_print, v.size()); ++k) {
-      s += std::to_string(v[k]) + "f";
-      s += (k < (num_values_to_print - 1)) ? ", " : "";
-    }
-    return s + " }";
-  };
-
-  // If the vectors are deemed not to be similar, return a report of the
-  // difference.
-  return ::testing::AssertionFailure()
-         << std::endl
-         << "    Actual values : "
-         << print_vector_in_c_format(output,
-                                     std::min(output.size(), reference.size()))
-         << std::endl
-         << "    Expected values: "
-         << print_vector_in_c_format(reference, reference.size()) << std::endl;
-}
-
-}  // namespace test
-}  // namespace webrtc
diff --git a/modules/audio_processing/test/bitexactness_tools.h b/modules/audio_processing/test/bitexactness_tools.h
deleted file mode 100644
index 3a1722a..0000000
--- a/modules/audio_processing/test/bitexactness_tools.h
+++ /dev/null
@@ -1,56 +0,0 @@
-
-/*
- *  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_PROCESSING_TEST_BITEXACTNESS_TOOLS_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_TEST_BITEXACTNESS_TOOLS_H_
-
-#include <string>
-
-#include "webrtc/api/array_view.h"
-#include "webrtc/modules/audio_coding/neteq/tools/input_audio_file.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-namespace test {
-
-// Returns test vector to use for the render signal in an
-// APM bitexactness test.
-std::string GetApmRenderTestVectorFileName(int sample_rate_hz);
-
-// Returns test vector to use for the capture signal in an
-// APM bitexactness test.
-std::string GetApmCaptureTestVectorFileName(int sample_rate_hz);
-
-// Extract float samples from a pcm file.
-void ReadFloatSamplesFromStereoFile(size_t samples_per_channel,
-                                    size_t num_channels,
-                                    InputAudioFile* stereo_pcm_file,
-                                    rtc::ArrayView<float> data);
-
-// Verifies a frame against a reference and returns the results as an
-// AssertionResult.
-::testing::AssertionResult VerifyDeinterleavedArray(
-    size_t samples_per_channel,
-    size_t num_channels,
-    rtc::ArrayView<const float> reference,
-    rtc::ArrayView<const float> output,
-    float element_error_bound);
-
-// Verifies a vector against a reference and returns the results as an
-// AssertionResult.
-::testing::AssertionResult VerifyArray(rtc::ArrayView<const float> reference,
-                                       rtc::ArrayView<const float> output,
-                                       float element_error_bound);
-
-}  // namespace test
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_TEST_BITEXACTNESS_TOOLS_H_
diff --git a/modules/audio_processing/test/conversational_speech/BUILD.gn b/modules/audio_processing/test/conversational_speech/BUILD.gn
deleted file mode 100644
index 1d492bf..0000000
--- a/modules/audio_processing/test/conversational_speech/BUILD.gn
+++ /dev/null
@@ -1,75 +0,0 @@
-# Copyright (c) 2017 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.
-
-import("../../../../../webrtc/webrtc.gni")
-
-group("conversational_speech") {
-  testonly = true
-  deps = [
-    ":conversational_speech_generator",
-  ]
-}
-
-rtc_executable("conversational_speech_generator") {
-  testonly = true
-  sources = [
-    "generator.cc",
-  ]
-  deps = [
-    ":lib",
-    "../../../../rtc_base:rtc_base_approved",
-    "../../../../test:test_support",
-  ]
-}
-
-rtc_static_library("lib") {
-  testonly = true
-  sources = [
-    "config.cc",
-    "config.h",
-    "multiend_call.cc",
-    "multiend_call.h",
-    "simulator.cc",
-    "simulator.h",
-    "timing.cc",
-    "timing.h",
-    "wavreader_abstract_factory.h",
-    "wavreader_factory.cc",
-    "wavreader_factory.h",
-    "wavreader_interface.h",
-  ]
-  deps = [
-    "../../../..:webrtc_common",
-    "../../../../api:array_view",
-    "../../../../common_audio",
-    "../../../../rtc_base:rtc_base_approved",
-  ]
-  visibility = [ ":*" ]  # Only targets in this file can depend on this.
-}
-
-rtc_source_set("unittest") {
-  testonly = true
-  sources = [
-    "generator_unittest.cc",
-    "mock_wavreader.cc",
-    "mock_wavreader.h",
-    "mock_wavreader_factory.cc",
-    "mock_wavreader_factory.h",
-  ]
-  deps = [
-    ":lib",
-    "../../../..:webrtc_common",
-    "../../../../api:array_view",
-    "../../../../api:optional",
-    "../../../../common_audio",
-    "../../../../rtc_base:rtc_base_approved",
-    "../../../../test:test_support",
-    "//testing/gmock",
-    "//testing/gtest",
-  ]
-}
diff --git a/modules/audio_processing/test/conversational_speech/OWNERS b/modules/audio_processing/test/conversational_speech/OWNERS
deleted file mode 100644
index 0981733..0000000
--- a/modules/audio_processing/test/conversational_speech/OWNERS
+++ /dev/null
@@ -1,6 +0,0 @@
-alessiob@webrtc.org
-henrik.lundin@webrtc.org
-peah@webrtc.org
-
-per-file *.gn=*
-per-file *.gni=*
diff --git a/modules/audio_processing/test/conversational_speech/README.md b/modules/audio_processing/test/conversational_speech/README.md
deleted file mode 100644
index bbb4112..0000000
--- a/modules/audio_processing/test/conversational_speech/README.md
+++ /dev/null
@@ -1,72 +0,0 @@
-# Conversational Speech generator tool
-
-Tool to generate multiple-end audio tracks to simulate conversational speech
-with two or more participants.
-
-The input to the tool is a directory containing a number of audio tracks and
-a text file indicating how to time the sequence of speech turns (see the Example
-section).
-
-Since the timing of the speaking turns is specified by the user, the generated
-tracks may not be suitable for testing scenarios in which there is unpredictable
-network delay (e.g., end-to-end RTC assessment).
-
-Instead, the generated pairs can be used when the delay is constant (obviously
-including the case in which there is no delay).
-For instance, echo cancellation in the APM module can be evaluated using two-end
-audio tracks as input and reverse input.
-
-By indicating negative and positive time offsets, one can reproduce cross-talk
-(aka double-talk) and silence in the conversation.
-
-### Example
-
-For each end, there is a set of audio tracks, e.g., a1, a2 and a3 (speaker A)
-and b1, b2 (speaker B).
-The text file with the timing information may look like this:
-
-```
-A a1 0
-B b1 0
-A a2 100
-B b2 -200
-A a3 0
-A a4 0
-```
-
-The first column indicates the speaker name, the second contains the audio track
-file names, and the third the offsets (in milliseconds) used to concatenate the
-chunks.
-
-Assume that all the audio tracks in the example above are 1000 ms long.
-The tool will then generate two tracks (A and B) that look like this:
-
-**Track A**
-```
-  a1 (1000 ms)
-  silence (1100 ms)
-  a2 (1000 ms)
-  silence (800 ms)
-  a3 (1000 ms)
-  a4 (1000 ms)
-```
-
-**Track B**
-```
-  silence (1000 ms)
-  b1 (1000 ms)
-  silence (900 ms)
-  b2 (1000 ms)
-  silence (2000 ms)
-```
-
-The two tracks can be also visualized as follows (one characheter represents
-100 ms, "." is silence and "*" is speech).
-
-```
-t: 0         1        2        3        4        5        6 (s)
-A: **********...........**********........********************
-B: ..........**********.........**********....................
-                                ^ 200 ms cross-talk
-        100 ms silence ^
-```
diff --git a/modules/audio_processing/test/conversational_speech/config.cc b/modules/audio_processing/test/conversational_speech/config.cc
deleted file mode 100644
index 5a0a322..0000000
--- a/modules/audio_processing/test/conversational_speech/config.cc
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- *  Copyright (c) 2017 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_processing/test/conversational_speech/config.h"
-
-namespace webrtc {
-namespace test {
-namespace conversational_speech {
-
-const std::string& Config::audiotracks_path() const {
-  return audiotracks_path_;
-}
-
-const std::string& Config::timing_filepath() const {
-  return timing_filepath_;
-}
-
-const std::string& Config::output_path() const {
-  return output_path_;
-}
-
-}  // namespace conversational_speech
-}  // namespace test
-}  // namespace webrtc
diff --git a/modules/audio_processing/test/conversational_speech/config.h b/modules/audio_processing/test/conversational_speech/config.h
deleted file mode 100644
index bad1145..0000000
--- a/modules/audio_processing/test/conversational_speech/config.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- *  Copyright (c) 2017 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_PROCESSING_TEST_CONVERSATIONAL_SPEECH_CONFIG_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_TEST_CONVERSATIONAL_SPEECH_CONFIG_H_
-
-#include <string>
-
-namespace webrtc {
-namespace test {
-namespace conversational_speech {
-
-struct Config {
-  Config(const std::string& audiotracks_path,
-         const std::string& timing_filepath,
-         const std::string& output_path)
-      : audiotracks_path_(audiotracks_path),
-        timing_filepath_(timing_filepath),
-        output_path_(output_path) {}
-
-  const std::string& audiotracks_path() const;
-  const std::string& timing_filepath() const;
-  const std::string& output_path() const;
-
-  const std::string audiotracks_path_;
-  const std::string timing_filepath_;
-  const std::string output_path_;
-};
-
-}  // namespace conversational_speech
-}  // namespace test
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_TEST_CONVERSATIONAL_SPEECH_CONFIG_H_
diff --git a/modules/audio_processing/test/conversational_speech/generator.cc b/modules/audio_processing/test/conversational_speech/generator.cc
deleted file mode 100644
index 53f7217..0000000
--- a/modules/audio_processing/test/conversational_speech/generator.cc
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- *  Copyright (c) 2017 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 <iostream>
-
-#include "webrtc/modules/audio_processing/test/conversational_speech/config.h"
-#include "webrtc/modules/audio_processing/test/conversational_speech/multiend_call.h"
-#include "webrtc/modules/audio_processing/test/conversational_speech/simulator.h"
-#include "webrtc/modules/audio_processing/test/conversational_speech/timing.h"
-#include "webrtc/modules/audio_processing/test/conversational_speech/wavreader_factory.h"
-#include "webrtc/rtc_base/flags.h"
-#include "webrtc/rtc_base/ptr_util.h"
-#include "webrtc/test/testsupport/fileutils.h"
-
-namespace webrtc {
-namespace test {
-namespace {
-
-const char kUsageDescription[] =
-    "Usage: conversational_speech_generator\n"
-    "          -i <path/to/source/audiotracks>\n"
-    "          -t <path/to/timing_file.txt>\n"
-    "          -o <output/path>\n"
-    "\n\n"
-    "Command-line tool to generate multiple-end audio tracks to simulate "
-    "conversational speech with two or more participants.\n";
-
-DEFINE_string(i, "", "Directory containing the speech turn wav files");
-DEFINE_string(t, "", "Path to the timing text file");
-DEFINE_string(o, "", "Output wav files destination path");
-DEFINE_bool(help, false, "Prints this message");
-
-}  // namespace
-
-int main(int argc, char* argv[]) {
-  if (rtc::FlagList::SetFlagsFromCommandLine(&argc, argv, true) ||
-      FLAG_help || argc != 1) {
-    printf("%s", kUsageDescription);
-    if (FLAG_help) {
-      rtc::FlagList::Print(nullptr, false);
-      return 0;
-    }
-    return 1;
-  }
-  RTC_CHECK(DirExists(FLAG_i));
-  RTC_CHECK(FileExists(FLAG_t));
-  RTC_CHECK(DirExists(FLAG_o));
-
-  conversational_speech::Config config(FLAG_i, FLAG_t, FLAG_o);
-
-  // Load timing.
-  std::vector<conversational_speech::Turn> timing =
-      conversational_speech::LoadTiming(config.timing_filepath());
-
-  // Parse timing and audio tracks.
-  auto wavreader_factory = rtc::MakeUnique<
-      conversational_speech::WavReaderFactory>();
-  conversational_speech::MultiEndCall multiend_call(
-      timing, config.audiotracks_path(), std::move(wavreader_factory));
-
-  // Generate output audio tracks.
-  auto generated_audiotrack_pairs = conversational_speech::Simulate(
-      multiend_call, config.output_path());
-
-  // Show paths to created audio tracks.
-  std::cout << "Output files:" << std::endl;
-  for (const auto& output_paths_entry : *generated_audiotrack_pairs) {
-    std::cout << "  speaker: " << output_paths_entry.first << std::endl;
-    std::cout << "    near end: " << output_paths_entry.second.near_end
-        << std::endl;
-    std::cout << "    far end: " << output_paths_entry.second.far_end
-        << std::endl;
-  }
-
-  return 0;
-}
-
-}  // namespace test
-}  // namespace webrtc
-
-int main(int argc, char* argv[]) {
-  return webrtc::test::main(argc, argv);
-}
diff --git a/modules/audio_processing/test/conversational_speech/generator_unittest.cc b/modules/audio_processing/test/conversational_speech/generator_unittest.cc
deleted file mode 100644
index e0aa43d..0000000
--- a/modules/audio_processing/test/conversational_speech/generator_unittest.cc
+++ /dev/null
@@ -1,688 +0,0 @@
-/*
- *  Copyright (c) 2017 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.
- */
-
-// This file consists of unit tests for webrtc::test::conversational_speech
-// members. Part of them focus on accepting or rejecting different
-// conversational speech setups. A setup is defined by a set of audio tracks and
-// timing information).
-// The docstring at the beginning of each TEST(ConversationalSpeechTest,
-// MultiEndCallSetup*) function looks like the drawing below and indicates which
-// setup is tested.
-//
-//    Accept:
-//    A 0****.....
-//    B .....1****
-//
-// The drawing indicates the following:
-// - the illustrated setup should be accepted,
-// - there are two speakers (namely, A and B),
-// - A is the first speaking, B is the second one,
-// - each character after the speaker's letter indicates a time unit (e.g., 100
-//   ms),
-// - "*" indicates speaking, "." listening,
-// - numbers indicate the turn index in std::vector<Turn>.
-//
-// Note that the same speaker can appear in multiple lines in order to depict
-// cases in which there are wrong offsets leading to self cross-talk (which is
-// rejected).
-
-// MSVC++ requires this to be set before any other includes to get M_PI.
-#define _USE_MATH_DEFINES
-
-#include <stdio.h>
-#include <cmath>
-#include <map>
-#include <memory>
-#include <vector>
-
-#include "webrtc/api/optional.h"
-#include "webrtc/common_audio/wav_file.h"
-#include "webrtc/modules/audio_processing/test/conversational_speech/config.h"
-#include "webrtc/modules/audio_processing/test/conversational_speech/mock_wavreader_factory.h"
-#include "webrtc/modules/audio_processing/test/conversational_speech/multiend_call.h"
-#include "webrtc/modules/audio_processing/test/conversational_speech/simulator.h"
-#include "webrtc/modules/audio_processing/test/conversational_speech/timing.h"
-#include "webrtc/modules/audio_processing/test/conversational_speech/wavreader_factory.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/pathutils.h"
-#include "webrtc/test/gmock.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/testsupport/fileutils.h"
-
-namespace webrtc {
-namespace test {
-namespace {
-
-using conversational_speech::LoadTiming;
-using conversational_speech::SaveTiming;
-using conversational_speech::MockWavReaderFactory;
-using conversational_speech::MultiEndCall;
-using conversational_speech::Turn;
-using conversational_speech::WavReaderFactory;
-
-const char* const audiotracks_path = "/path/to/audiotracks";
-const char* const timing_filepath = "/path/to/timing_file.txt";
-const char* const output_path = "/path/to/output_dir";
-
-const std::vector<Turn> expected_timing = {
-    {"A", "a1", 0},
-    {"B", "b1", 0},
-    {"A", "a2", 100},
-    {"B", "b2", -200},
-    {"A", "a3", 0},
-    {"A", "a3", 0},
-};
-const std::size_t kNumberOfTurns = expected_timing.size();
-
-// Default arguments for MockWavReaderFactory ctor.
-// Fake audio track parameters.
-constexpr int kDefaultSampleRate = 48000;
-const std::map<std::string, const MockWavReaderFactory::Params>
-    kDefaultMockWavReaderFactoryParamsMap = {
-  {"t300", {kDefaultSampleRate, 1u, 14400u}},  // Mono, 0.3 seconds.
-  {"t500", {kDefaultSampleRate, 1u, 24000u}},  // Mono, 0.5 seconds.
-  {"t1000", {kDefaultSampleRate, 1u, 48000u}},  // Mono, 1.0 seconds.
-  {"sr8000", {8000, 1u, 8000u}},  // 8kHz sample rate, mono, 1 second.
-  {"sr16000", {16000, 1u, 16000u}},  // 16kHz sample rate, mono, 1 second.
-  {"sr16000_stereo", {16000, 2u, 16000u}},  // Like sr16000, but stereo.
-};
-const MockWavReaderFactory::Params& kDefaultMockWavReaderFactoryParams =
-    kDefaultMockWavReaderFactoryParamsMap.at("t500");
-
-std::unique_ptr<MockWavReaderFactory> CreateMockWavReaderFactory() {
-  return std::unique_ptr<MockWavReaderFactory>(
-      new MockWavReaderFactory(kDefaultMockWavReaderFactoryParams,
-                               kDefaultMockWavReaderFactoryParamsMap));
-}
-
-void CreateSineWavFile(const std::string& filepath,
-                       const MockWavReaderFactory::Params& params,
-                       float frequency = 440.0f) {
-  // Create samples.
-  constexpr double two_pi = 2.0 * M_PI;
-  std::vector<int16_t> samples(params.num_samples);
-  for (std::size_t i = 0; i < params.num_samples; ++i) {
-    // TODO(alessiob): the produced tone is not pure, improve.
-    samples[i] = std::lround(32767.0f * std::sin(
-        two_pi * i * frequency / params.sample_rate));
-  }
-
-  // Write samples.
-  WavWriter wav_writer(filepath, params.sample_rate, params.num_channels);
-  wav_writer.WriteSamples(samples.data(), params.num_samples);
-}
-
-// Parameters to generate audio tracks with CreateSineWavFile.
-struct SineAudioTrackParams {
-  MockWavReaderFactory::Params params;
-  float frequency;
-};
-
-// Creates a temporary directory in which sine audio tracks are written.
-std::string CreateTemporarySineAudioTracks(
-    const std::map<std::string, SineAudioTrackParams>& sine_tracks_params) {
-  // Create temporary directory.
-  rtc::Pathname temp_directory(OutputPath());
-  temp_directory.AppendFolder("TempConversationalSpeechAudioTracks");
-  CreateDir(temp_directory.pathname());
-
-  // Create sine tracks.
-  for (const auto& it : sine_tracks_params) {
-    const rtc::Pathname temp_filepath(temp_directory.pathname(), it.first);
-    CreateSineWavFile(
-        temp_filepath.pathname(), it.second.params, it.second.frequency);
-  }
-
-  return temp_directory.pathname();
-}
-
-void CheckAudioTrackParams(const WavReaderFactory& wav_reader_factory,
-                           const std::string& filepath,
-                           const MockWavReaderFactory::Params& expeted_params) {
-  auto wav_reader = wav_reader_factory.Create(filepath);
-  EXPECT_EQ(expeted_params.sample_rate, wav_reader->SampleRate());
-  EXPECT_EQ(expeted_params.num_channels, wav_reader->NumChannels());
-  EXPECT_EQ(expeted_params.num_samples, wav_reader->NumSamples());
-}
-
-void DeleteFolderAndContents(const std::string& dir) {
-  if (!DirExists(dir)) { return; }
-  rtc::Optional<std::vector<std::string>> dir_content = ReadDirectory(dir);
-  EXPECT_TRUE(dir_content);
-  for (const auto& path : *dir_content) {
-    if (DirExists(path)) {
-      DeleteFolderAndContents(path);
-    } else if (FileExists(path)) {
-      // TODO(alessiob): Wrap with EXPECT_TRUE() once webrtc:7769 bug fixed.
-      RemoveFile(path);
-    } else {
-      FAIL();
-    }
-  }
-  // TODO(alessiob): Wrap with EXPECT_TRUE() once webrtc:7769 bug fixed.
-  RemoveDir(dir);
-}
-
-}  // namespace
-
-using testing::_;
-
-TEST(ConversationalSpeechTest, Settings) {
-  const conversational_speech::Config config(
-      audiotracks_path, timing_filepath, output_path);
-
-  // Test getters.
-  EXPECT_EQ(audiotracks_path, config.audiotracks_path());
-  EXPECT_EQ(timing_filepath, config.timing_filepath());
-  EXPECT_EQ(output_path, config.output_path());
-}
-
-TEST(ConversationalSpeechTest, TimingSaveLoad) {
-  // Save test timing.
-  const std::string temporary_filepath = TempFilename(
-      OutputPath(), "TempTimingTestFile");
-  SaveTiming(temporary_filepath, expected_timing);
-
-  // Create a std::vector<Turn> instance by loading from file.
-  std::vector<Turn> actual_timing = LoadTiming(temporary_filepath);
-  std::remove(temporary_filepath.c_str());
-
-  // Check size.
-  EXPECT_EQ(expected_timing.size(), actual_timing.size());
-
-  // Check Turn instances.
-  for (size_t index = 0; index < expected_timing.size(); ++index) {
-    EXPECT_EQ(expected_timing[index], actual_timing[index])
-        << "turn #" << index << " not matching";
-  }
-}
-
-TEST(ConversationalSpeechTest, MultiEndCallCreate) {
-  auto mock_wavreader_factory = CreateMockWavReaderFactory();
-
-  // There are 5 unique audio tracks to read.
-  EXPECT_CALL(*mock_wavreader_factory, Create(_)).Times(5);
-
-  // Inject the mock wav reader factory.
-  conversational_speech::MultiEndCall multiend_call(
-      expected_timing, audiotracks_path, std::move(mock_wavreader_factory));
-  EXPECT_TRUE(multiend_call.valid());
-
-  // Test.
-  EXPECT_EQ(2u, multiend_call.speaker_names().size());
-  EXPECT_EQ(5u, multiend_call.audiotrack_readers().size());
-  EXPECT_EQ(6u, multiend_call.speaking_turns().size());
-}
-
-TEST(ConversationalSpeechTest, MultiEndCallSetupDifferentSampleRates) {
-  const std::vector<Turn> timing = {
-      {"A", "sr8000", 0},
-      {"B", "sr16000", 0},
-  };
-  auto mock_wavreader_factory = CreateMockWavReaderFactory();
-
-  // There are two unique audio tracks to read.
-  EXPECT_CALL(*mock_wavreader_factory, Create(testing::_)).Times(2);
-
-  MultiEndCall multiend_call(
-      timing, audiotracks_path, std::move(mock_wavreader_factory));
-  EXPECT_FALSE(multiend_call.valid());
-}
-
-TEST(ConversationalSpeechTest, MultiEndCallSetupMultipleChannels) {
-  const std::vector<Turn> timing = {
-      {"A", "sr16000_stereo", 0},
-      {"B", "sr16000_stereo", 0},
-  };
-  auto mock_wavreader_factory = CreateMockWavReaderFactory();
-
-  // There is one unique audio track to read.
-  EXPECT_CALL(*mock_wavreader_factory, Create(testing::_)).Times(1);
-
-  MultiEndCall multiend_call(
-      timing, audiotracks_path, std::move(mock_wavreader_factory));
-  EXPECT_FALSE(multiend_call.valid());
-}
-
-TEST(ConversationalSpeechTest,
-       MultiEndCallSetupDifferentSampleRatesAndMultipleNumChannels) {
-  const std::vector<Turn> timing = {
-      {"A", "sr8000", 0},
-      {"B", "sr16000_stereo", 0},
-  };
-  auto mock_wavreader_factory = CreateMockWavReaderFactory();
-
-  // There are two unique audio tracks to read.
-  EXPECT_CALL(*mock_wavreader_factory, Create(testing::_)).Times(2);
-
-  MultiEndCall multiend_call(
-      timing, audiotracks_path, std::move(mock_wavreader_factory));
-  EXPECT_FALSE(multiend_call.valid());
-}
-
-TEST(ConversationalSpeechTest, MultiEndCallSetupFirstOffsetNegative) {
-  const std::vector<Turn> timing = {
-      {"A", "t500", -100},
-      {"B", "t500", 0},
-  };
-  auto mock_wavreader_factory = CreateMockWavReaderFactory();
-
-  // There is one unique audio track to read.
-  EXPECT_CALL(*mock_wavreader_factory, Create(_)).Times(1);
-
-  conversational_speech::MultiEndCall multiend_call(
-      timing, audiotracks_path, std::move(mock_wavreader_factory));
-  EXPECT_FALSE(multiend_call.valid());
-}
-
-TEST(ConversationalSpeechTest, MultiEndCallSetupSimple) {
-  // Accept:
-  // A 0****.....
-  // B .....1****
-  constexpr std::size_t expected_duration = kDefaultSampleRate;
-  const std::vector<Turn> timing = {
-      {"A", "t500", 0},
-      {"B", "t500", 0},
-  };
-  auto mock_wavreader_factory = CreateMockWavReaderFactory();
-
-  // There is one unique audio track to read.
-  EXPECT_CALL(*mock_wavreader_factory, Create(_)).Times(1);
-
-  conversational_speech::MultiEndCall multiend_call(
-      timing, audiotracks_path, std::move(mock_wavreader_factory));
-  EXPECT_TRUE(multiend_call.valid());
-
-  // Test.
-  EXPECT_EQ(2u, multiend_call.speaker_names().size());
-  EXPECT_EQ(1u, multiend_call.audiotrack_readers().size());
-  EXPECT_EQ(2u, multiend_call.speaking_turns().size());
-  EXPECT_EQ(expected_duration, multiend_call.total_duration_samples());
-}
-
-TEST(ConversationalSpeechTest, MultiEndCallSetupPause) {
-  // Accept:
-  // A 0****.......
-  // B .......1****
-  constexpr std::size_t expected_duration = kDefaultSampleRate * 1.2;
-  const std::vector<Turn> timing = {
-      {"A", "t500", 0},
-      {"B", "t500", 200},
-  };
-  auto mock_wavreader_factory = CreateMockWavReaderFactory();
-
-  // There is one unique audio track to read.
-  EXPECT_CALL(*mock_wavreader_factory, Create(_)).Times(1);
-
-  conversational_speech::MultiEndCall multiend_call(
-      timing, audiotracks_path, std::move(mock_wavreader_factory));
-  EXPECT_TRUE(multiend_call.valid());
-
-  // Test.
-  EXPECT_EQ(2u, multiend_call.speaker_names().size());
-  EXPECT_EQ(1u, multiend_call.audiotrack_readers().size());
-  EXPECT_EQ(2u, multiend_call.speaking_turns().size());
-  EXPECT_EQ(expected_duration, multiend_call.total_duration_samples());
-}
-
-TEST(ConversationalSpeechTest, MultiEndCallSetupCrossTalk) {
-  // Accept:
-  // A 0****....
-  // B ....1****
-  constexpr std::size_t expected_duration = kDefaultSampleRate * 0.9;
-  const std::vector<Turn> timing = {
-      {"A", "t500", 0},
-      {"B", "t500", -100},
-  };
-  auto mock_wavreader_factory = CreateMockWavReaderFactory();
-
-  // There is one unique audio track to read.
-  EXPECT_CALL(*mock_wavreader_factory, Create(_)).Times(1);
-
-  conversational_speech::MultiEndCall multiend_call(
-      timing, audiotracks_path, std::move(mock_wavreader_factory));
-  EXPECT_TRUE(multiend_call.valid());
-
-  // Test.
-  EXPECT_EQ(2u, multiend_call.speaker_names().size());
-  EXPECT_EQ(1u, multiend_call.audiotrack_readers().size());
-  EXPECT_EQ(2u, multiend_call.speaking_turns().size());
-  EXPECT_EQ(expected_duration, multiend_call.total_duration_samples());
-}
-
-TEST(ConversationalSpeechTest, MultiEndCallSetupInvalidOrder) {
-  // Reject:
-  // A ..0****
-  // B .1****.  The n-th turn cannot start before the (n-1)-th one.
-  const std::vector<Turn> timing = {
-      {"A", "t500", 200},
-      {"B", "t500", -600},
-  };
-  auto mock_wavreader_factory = CreateMockWavReaderFactory();
-
-  // There is one unique audio track to read.
-  EXPECT_CALL(*mock_wavreader_factory, Create(_)).Times(1);
-
-  conversational_speech::MultiEndCall multiend_call(
-      timing, audiotracks_path, std::move(mock_wavreader_factory));
-  EXPECT_FALSE(multiend_call.valid());
-}
-
-TEST(ConversationalSpeechTest, MultiEndCallSetupCrossTalkThree) {
-  // Accept:
-  // A 0****2****...
-  // B ...1*********
-  constexpr std::size_t expected_duration = kDefaultSampleRate * 1.3;
-  const std::vector<Turn> timing = {
-      {"A", "t500", 0},
-      {"B", "t1000", -200},
-      {"A", "t500", -800},
-  };
-  auto mock_wavreader_factory = CreateMockWavReaderFactory();
-
-  // There are two unique audio tracks to read.
-  EXPECT_CALL(*mock_wavreader_factory, Create(_)).Times(2);
-
-  conversational_speech::MultiEndCall multiend_call(
-      timing, audiotracks_path, std::move(mock_wavreader_factory));
-  EXPECT_TRUE(multiend_call.valid());
-
-  // Test.
-  EXPECT_EQ(2u, multiend_call.speaker_names().size());
-  EXPECT_EQ(2u, multiend_call.audiotrack_readers().size());
-  EXPECT_EQ(3u, multiend_call.speaking_turns().size());
-  EXPECT_EQ(expected_duration, multiend_call.total_duration_samples());
-}
-
-TEST(ConversationalSpeechTest, MultiEndCallSetupSelfCrossTalkNearInvalid) {
-  // Reject:
-  // A 0****......
-  // A ...1****...
-  // B ......2****
-  //      ^  Turn #1 overlaps with #0 which is from the same speaker.
-  const std::vector<Turn> timing = {
-      {"A", "t500", 0},
-      {"A", "t500", -200},
-      {"B", "t500", -200},
-  };
-  auto mock_wavreader_factory = CreateMockWavReaderFactory();
-
-  // There is one unique audio track to read.
-  EXPECT_CALL(*mock_wavreader_factory, Create(_)).Times(1);
-
-  conversational_speech::MultiEndCall multiend_call(
-      timing, audiotracks_path, std::move(mock_wavreader_factory));
-  EXPECT_FALSE(multiend_call.valid());
-}
-
-TEST(ConversationalSpeechTest, MultiEndCallSetupSelfCrossTalkFarInvalid) {
-  // Reject:
-  // A 0*********
-  // B 1**.......
-  // C ...2**....
-  // A ......3**.
-  //         ^  Turn #3 overlaps with #0 which is from the same speaker.
-  const std::vector<Turn> timing = {
-      {"A", "t1000", 0},
-      {"B", "t300", -1000},
-      {"C", "t300", 0},
-      {"A", "t300", 0},
-  };
-  auto mock_wavreader_factory = CreateMockWavReaderFactory();
-
-  // There are two unique audio tracks to read.
-  EXPECT_CALL(*mock_wavreader_factory, Create(_)).Times(2);
-
-  conversational_speech::MultiEndCall multiend_call(
-      timing, audiotracks_path, std::move(mock_wavreader_factory));
-  EXPECT_FALSE(multiend_call.valid());
-}
-
-TEST(ConversationalSpeechTest, MultiEndCallSetupCrossTalkMiddleValid) {
-  // Accept:
-  // A 0*********..
-  // B ..1****.....
-  // C .......2****
-  constexpr std::size_t expected_duration = kDefaultSampleRate * 1.2;
-  const std::vector<Turn> timing = {
-      {"A", "t1000", 0},
-      {"B", "t500", -800},
-      {"C", "t500", 0},
-  };
-  auto mock_wavreader_factory = CreateMockWavReaderFactory();
-
-  // There are two unique audio tracks to read.
-  EXPECT_CALL(*mock_wavreader_factory, Create(_)).Times(2);
-
-  conversational_speech::MultiEndCall multiend_call(
-      timing, audiotracks_path, std::move(mock_wavreader_factory));
-  EXPECT_TRUE(multiend_call.valid());
-
-  // Test.
-  EXPECT_EQ(3u, multiend_call.speaker_names().size());
-  EXPECT_EQ(2u, multiend_call.audiotrack_readers().size());
-  EXPECT_EQ(3u, multiend_call.speaking_turns().size());
-  EXPECT_EQ(expected_duration, multiend_call.total_duration_samples());
-}
-
-TEST(ConversationalSpeechTest, MultiEndCallSetupCrossTalkMiddleInvalid) {
-  // Reject:
-  // A 0*********
-  // B ..1****...
-  // C ....2****.
-  //       ^  Turn #2 overlaps both with #0 and #1 (cross-talk with 3+ speakers
-  //          not permitted).
-  const std::vector<Turn> timing = {
-      {"A", "t1000", 0},
-      {"B", "t500", -800},
-      {"C", "t500", -300},
-  };
-  auto mock_wavreader_factory = CreateMockWavReaderFactory();
-
-  // There are two unique audio tracks to read.
-  EXPECT_CALL(*mock_wavreader_factory, Create(_)).Times(2);
-
-  conversational_speech::MultiEndCall multiend_call(
-      timing, audiotracks_path, std::move(mock_wavreader_factory));
-  EXPECT_FALSE(multiend_call.valid());
-}
-
-TEST(ConversationalSpeechTest, MultiEndCallSetupCrossTalkMiddleAndPause) {
-  // Accept:
-  // A 0*********..
-  // B .2****......
-  // C .......3****
-  constexpr std::size_t expected_duration = kDefaultSampleRate * 1.2;
-  const std::vector<Turn> timing = {
-      {"A", "t1000", 0},
-      {"B", "t500", -900},
-      {"C", "t500", 100},
-  };
-  auto mock_wavreader_factory = CreateMockWavReaderFactory();
-
-  // There are two unique audio tracks to read.
-  EXPECT_CALL(*mock_wavreader_factory, Create(_)).Times(2);
-
-  conversational_speech::MultiEndCall multiend_call(
-      timing, audiotracks_path, std::move(mock_wavreader_factory));
-  EXPECT_TRUE(multiend_call.valid());
-
-  // Test.
-  EXPECT_EQ(3u, multiend_call.speaker_names().size());
-  EXPECT_EQ(2u, multiend_call.audiotrack_readers().size());
-  EXPECT_EQ(3u, multiend_call.speaking_turns().size());
-  EXPECT_EQ(expected_duration, multiend_call.total_duration_samples());
-}
-
-TEST(ConversationalSpeechTest, MultiEndCallSetupCrossTalkFullOverlapValid) {
-  // Accept:
-  // A 0****
-  // B 1****
-  const std::vector<Turn> timing = {
-      {"A", "t500", 0},
-      {"B", "t500", -500},
-  };
-  auto mock_wavreader_factory = CreateMockWavReaderFactory();
-
-  // There is one unique audio track to read.
-  EXPECT_CALL(*mock_wavreader_factory, Create(_)).Times(1);
-
-  conversational_speech::MultiEndCall multiend_call(
-      timing, audiotracks_path, std::move(mock_wavreader_factory));
-  EXPECT_TRUE(multiend_call.valid());
-
-  // Test.
-  EXPECT_EQ(2u, multiend_call.speaker_names().size());
-  EXPECT_EQ(1u, multiend_call.audiotrack_readers().size());
-  EXPECT_EQ(2u, multiend_call.speaking_turns().size());
-}
-
-TEST(ConversationalSpeechTest, MultiEndCallSetupLongSequence) {
-  // Accept:
-  // A 0****....3****.5**.
-  // B .....1****...4**...
-  // C ......2**.......6**..
-  constexpr std::size_t expected_duration = kDefaultSampleRate * 1.9;
-  const std::vector<Turn> timing = {
-      {"A", "t500", 0},
-      {"B", "t500", 0},
-      {"C", "t300", -400},
-      {"A", "t500", 0},
-      {"B", "t300", -100},
-      {"A", "t300", -100},
-      {"C", "t300", -200},
-  };
-  auto mock_wavreader_factory = std::unique_ptr<MockWavReaderFactory>(
-      new MockWavReaderFactory(kDefaultMockWavReaderFactoryParams,
-                               kDefaultMockWavReaderFactoryParamsMap));
-
-  // There are two unique audio tracks to read.
-  EXPECT_CALL(*mock_wavreader_factory, Create(_)).Times(2);
-
-  conversational_speech::MultiEndCall multiend_call(
-      timing, audiotracks_path, std::move(mock_wavreader_factory));
-  EXPECT_TRUE(multiend_call.valid());
-
-  // Test.
-  EXPECT_EQ(3u, multiend_call.speaker_names().size());
-  EXPECT_EQ(2u, multiend_call.audiotrack_readers().size());
-  EXPECT_EQ(7u, multiend_call.speaking_turns().size());
-  EXPECT_EQ(expected_duration, multiend_call.total_duration_samples());
-}
-
-TEST(ConversationalSpeechTest, MultiEndCallSetupLongSequenceInvalid) {
-  // Reject:
-  // A 0****....3****.6**
-  // B .....1****...4**..
-  // C ......2**.....5**..
-  //                 ^ Turns #4, #5 and #6 overlapping (cross-talk with 3+
-  //                   speakers not permitted).
-  const std::vector<Turn> timing = {
-      {"A", "t500", 0},
-      {"B", "t500", 0},
-      {"C", "t300", -400},
-      {"A", "t500", 0},
-      {"B", "t300", -100},
-      {"A", "t300", -200},
-      {"C", "t300", -200},
-  };
-  auto mock_wavreader_factory = std::unique_ptr<MockWavReaderFactory>(
-      new MockWavReaderFactory(kDefaultMockWavReaderFactoryParams,
-                               kDefaultMockWavReaderFactoryParamsMap));
-
-  // There are two unique audio tracks to read.
-  EXPECT_CALL(*mock_wavreader_factory, Create(_)).Times(2);
-
-  conversational_speech::MultiEndCall multiend_call(
-      timing, audiotracks_path, std::move(mock_wavreader_factory));
-  EXPECT_FALSE(multiend_call.valid());
-}
-
-TEST(ConversationalSpeechTest, MultiEndCallWavReaderAdaptorSine) {
-  // Parameters with which wav files are created.
-  constexpr int duration_seconds = 5;
-  const int sample_rates[] = {8000, 11025, 16000, 22050, 32000, 44100, 48000};
-
-  for (int sample_rate : sample_rates) {
-    const rtc::Pathname temp_filename(
-        OutputPath(), "TempSineWavFile_" + std::to_string(sample_rate)
-            + ".wav");
-
-    // Write wav file.
-    const std::size_t num_samples = duration_seconds * sample_rate;
-    MockWavReaderFactory::Params params = {sample_rate, 1u, num_samples};
-    CreateSineWavFile(temp_filename.pathname(), params);
-
-    // Load wav file and check if params match.
-    WavReaderFactory wav_reader_factory;
-    MockWavReaderFactory::Params expeted_params = {
-        sample_rate, 1u, num_samples};
-    CheckAudioTrackParams(
-        wav_reader_factory, temp_filename.pathname(), expeted_params);
-
-    // Clean up.
-    remove(temp_filename.pathname().c_str());
-  }
-}
-
-TEST(ConversationalSpeechTest, DISABLED_MultiEndCallSimulator) {
-  // Simulated call (one character corresponding to 500 ms):
-  // A 0*********...........2*********.....
-  // B ...........1*********.....3*********
-  const std::vector<Turn> expected_timing = {
-      {"A", "t5000_440.wav", 0},
-      {"B", "t5000_880.wav", 500},
-      {"A", "t5000_440.wav", 0},
-      {"B", "t5000_880.wav", -2500},
-  };
-  const std::size_t expected_duration_seconds = 18;
-
-  // Create temporary audio track files.
-  const int sample_rate = 16000;
-  const std::map<std::string, SineAudioTrackParams> sine_tracks_params = {
-      {"t5000_440.wav", {{sample_rate, 1u, sample_rate * 5}, 440.0}},
-      {"t5000_880.wav", {{sample_rate, 1u, sample_rate * 5}, 880.0}},
-  };
-  const std::string audiotracks_path = CreateTemporarySineAudioTracks(
-      sine_tracks_params);
-
-  // Set up the multi-end call.
-  auto wavreader_factory = std::unique_ptr<WavReaderFactory>(
-      new WavReaderFactory());
-  MultiEndCall multiend_call(
-      expected_timing, audiotracks_path, std::move(wavreader_factory));
-
-  // Simulate the call.
-  rtc::Pathname output_path(audiotracks_path);
-  output_path.AppendFolder("output");
-  CreateDir(output_path.pathname());
-  LOG(LS_VERBOSE) << "simulator output path: " << output_path.pathname();
-  auto generated_audiotrak_pairs = conversational_speech::Simulate(
-      multiend_call, output_path.pathname());
-  EXPECT_EQ(2u, generated_audiotrak_pairs->size());
-
-  // Check the output.
-  WavReaderFactory wav_reader_factory;
-  const MockWavReaderFactory::Params expeted_params = {
-      sample_rate, 1u, sample_rate * expected_duration_seconds};
-  for (const auto& it : *generated_audiotrak_pairs) {
-    LOG(LS_VERBOSE) << "checking far/near-end for <" << it.first << ">";
-    CheckAudioTrackParams(
-        wav_reader_factory, it.second.near_end, expeted_params);
-    CheckAudioTrackParams(
-        wav_reader_factory, it.second.far_end, expeted_params);
-  }
-
-  // Clean.
-  EXPECT_NO_FATAL_FAILURE(DeleteFolderAndContents(audiotracks_path));
-}
-
-}  // namespace test
-}  // namespace webrtc
diff --git a/modules/audio_processing/test/conversational_speech/mock_wavreader.cc b/modules/audio_processing/test/conversational_speech/mock_wavreader.cc
deleted file mode 100644
index 6b92339..0000000
--- a/modules/audio_processing/test/conversational_speech/mock_wavreader.cc
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- *  Copyright (c) 2017 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_processing/test/conversational_speech/mock_wavreader.h"
-
-namespace webrtc {
-namespace test {
-namespace conversational_speech {
-
-using testing::Return;
-
-MockWavReader::MockWavReader(
-    int sample_rate, size_t num_channels, size_t num_samples)
-      : sample_rate_(sample_rate), num_channels_(num_channels),
-          num_samples_(num_samples) {
-  ON_CALL(*this, SampleRate()).WillByDefault(Return(sample_rate_));
-  ON_CALL(*this, NumChannels()).WillByDefault(Return(num_channels_));
-  ON_CALL(*this, NumSamples()).WillByDefault(Return(num_samples_));
-}
-
-MockWavReader::~MockWavReader() = default;
-
-}  // namespace conversational_speech
-}  // namespace test
-}  // namespace webrtc
diff --git a/modules/audio_processing/test/conversational_speech/mock_wavreader.h b/modules/audio_processing/test/conversational_speech/mock_wavreader.h
deleted file mode 100644
index 8e86f4d..0000000
--- a/modules/audio_processing/test/conversational_speech/mock_wavreader.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- *  Copyright (c) 2017 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_PROCESSING_TEST_CONVERSATIONAL_SPEECH_MOCK_WAVREADER_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_TEST_CONVERSATIONAL_SPEECH_MOCK_WAVREADER_H_
-
-#include <cstddef>
-#include <string>
-
-#include "webrtc/api/array_view.h"
-#include "webrtc/modules/audio_processing/test/conversational_speech/wavreader_interface.h"
-#include "webrtc/test/gmock.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-namespace test {
-namespace conversational_speech {
-
-class MockWavReader : public WavReaderInterface {
- public:
-  MockWavReader(int sample_rate, size_t num_channels, size_t num_samples);
-  ~MockWavReader();
-
-  // TODO(alessiob): use ON_CALL to return random samples if needed.
-  MOCK_METHOD1(ReadFloatSamples, size_t(rtc::ArrayView<float>));
-  MOCK_METHOD1(ReadInt16Samples, size_t(rtc::ArrayView<int16_t>));
-
-  MOCK_CONST_METHOD0(SampleRate, int());
-  MOCK_CONST_METHOD0(NumChannels, size_t());
-  MOCK_CONST_METHOD0(NumSamples, size_t());
-
- private:
-  const int sample_rate_;
-  const size_t num_channels_;
-  const size_t num_samples_;
-};
-
-}  // namespace conversational_speech
-}  // namespace test
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_TEST_CONVERSATIONAL_SPEECH_MOCK_WAVREADER_H_
diff --git a/modules/audio_processing/test/conversational_speech/mock_wavreader_factory.cc b/modules/audio_processing/test/conversational_speech/mock_wavreader_factory.cc
deleted file mode 100644
index 0483a33..0000000
--- a/modules/audio_processing/test/conversational_speech/mock_wavreader_factory.cc
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- *  Copyright (c) 2017 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_processing/test/conversational_speech/mock_wavreader_factory.h"
-
-#include "webrtc/modules/audio_processing/test/conversational_speech/mock_wavreader.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/pathutils.h"
-#include "webrtc/test/gmock.h"
-
-namespace webrtc {
-namespace test {
-namespace conversational_speech {
-
-using testing::_;
-using testing::Invoke;
-
-MockWavReaderFactory::MockWavReaderFactory(
-    const Params& default_params,
-    const std::map<std::string, const Params>& params)
-        : default_params_(default_params),
-          audiotrack_names_params_(params) {
-  ON_CALL(*this, Create(_)).WillByDefault(Invoke(
-      this, &MockWavReaderFactory::CreateMock));
-}
-
-MockWavReaderFactory::MockWavReaderFactory(const Params& default_params)
-    : MockWavReaderFactory(default_params,
-                           std::map<std::string, const Params>{}) {}
-
-MockWavReaderFactory::~MockWavReaderFactory() = default;
-
-std::unique_ptr<WavReaderInterface> MockWavReaderFactory::CreateMock(
-    const std::string& filepath) {
-  // Search the parameters corresponding to filepath.
-  const rtc::Pathname audiotrack_file_path(filepath);
-  const auto it = audiotrack_names_params_.find(
-      audiotrack_file_path.filename());
-
-  // If not found, use default parameters.
-  if (it == audiotrack_names_params_.end()) {
-    LOG(LS_VERBOSE) << "using default parameters for " << filepath;
-    return std::unique_ptr<WavReaderInterface>(
-        new MockWavReader(default_params_.sample_rate,
-                          default_params_.num_channels,
-                          default_params_.num_samples));
-  }
-
-  // Found, use the audiotrack-specific parameters.
-  LOG(LS_VERBOSE) << "using ad-hoc parameters for " << filepath;
-  LOG(LS_VERBOSE) << "sample_rate " << it->second.sample_rate;
-  LOG(LS_VERBOSE) << "num_channels " << it->second.num_channels;
-  LOG(LS_VERBOSE) << "num_samples " << it->second.num_samples;
-  return std::unique_ptr<WavReaderInterface>(
-      new MockWavReader(it->second.sample_rate,
-                        it->second.num_channels,
-                        it->second.num_samples));
-}
-
-}  // namespace conversational_speech
-}  // namespace test
-}  // namespace webrtc
diff --git a/modules/audio_processing/test/conversational_speech/mock_wavreader_factory.h b/modules/audio_processing/test/conversational_speech/mock_wavreader_factory.h
deleted file mode 100644
index d22856e..0000000
--- a/modules/audio_processing/test/conversational_speech/mock_wavreader_factory.h
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- *  Copyright (c) 2017 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_PROCESSING_TEST_CONVERSATIONAL_SPEECH_MOCK_WAVREADER_FACTORY_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_TEST_CONVERSATIONAL_SPEECH_MOCK_WAVREADER_FACTORY_H_
-
-#include <map>
-#include <memory>
-#include <string>
-
-#include "webrtc/modules/audio_processing/test/conversational_speech/wavreader_abstract_factory.h"
-#include "webrtc/modules/audio_processing/test/conversational_speech/wavreader_interface.h"
-#include "webrtc/test/gmock.h"
-
-namespace webrtc {
-namespace test {
-namespace conversational_speech {
-
-class MockWavReaderFactory : public WavReaderAbstractFactory {
- public:
-  struct Params{
-    int sample_rate;
-    size_t num_channels;
-    size_t num_samples;
-  };
-
-  MockWavReaderFactory(const Params& default_params,
-                       const std::map<std::string, const Params>& params);
-  explicit MockWavReaderFactory(const Params& default_params);
-  ~MockWavReaderFactory();
-
-  MOCK_CONST_METHOD1(Create, std::unique_ptr<WavReaderInterface>(
-      const std::string&));
-
- private:
-  // Creates a MockWavReader instance using the parameters in
-  // audiotrack_names_params_ if the entry corresponding to filepath exists,
-  // otherwise creates a MockWavReader instance using the default parameters.
-  std::unique_ptr<WavReaderInterface> CreateMock(const std::string& filepath);
-
-  const Params& default_params_;
-  std::map<std::string, const Params> audiotrack_names_params_;
-};
-
-}  // namespace conversational_speech
-}  // namespace test
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_TEST_CONVERSATIONAL_SPEECH_MOCK_WAVREADER_FACTORY_H_
diff --git a/modules/audio_processing/test/conversational_speech/multiend_call.cc b/modules/audio_processing/test/conversational_speech/multiend_call.cc
deleted file mode 100644
index dffbfcb..0000000
--- a/modules/audio_processing/test/conversational_speech/multiend_call.cc
+++ /dev/null
@@ -1,190 +0,0 @@
-/*
- *  Copyright (c) 2017 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_processing/test/conversational_speech/multiend_call.h"
-
-#include <algorithm>
-#include <iterator>
-
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/pathutils.h"
-
-namespace webrtc {
-namespace test {
-namespace conversational_speech {
-
-MultiEndCall::MultiEndCall(
-    rtc::ArrayView<const Turn> timing, const std::string& audiotracks_path,
-    std::unique_ptr<WavReaderAbstractFactory> wavreader_abstract_factory)
-        : timing_(timing), audiotracks_path_(audiotracks_path),
-          wavreader_abstract_factory_(std::move(wavreader_abstract_factory)),
-          valid_(false) {
-  FindSpeakerNames();
-  if (CreateAudioTrackReaders())
-    valid_ = CheckTiming();
-}
-
-MultiEndCall::~MultiEndCall() = default;
-
-void MultiEndCall::FindSpeakerNames() {
-  RTC_DCHECK(speaker_names_.empty());
-  for (const Turn& turn : timing_) {
-    speaker_names_.emplace(turn.speaker_name);
-  }
-}
-
-bool MultiEndCall::CreateAudioTrackReaders() {
-  RTC_DCHECK(audiotrack_readers_.empty());
-  sample_rate_hz_ = 0;  // Sample rate will be set when reading the first track.
-  for (const Turn& turn : timing_) {
-    auto it = audiotrack_readers_.find(turn.audiotrack_file_name);
-    if (it != audiotrack_readers_.end())
-      continue;
-
-    // Instance Pathname to retrieve the full path to the audiotrack file.
-    const rtc::Pathname audiotrack_file_path(
-        audiotracks_path_, turn.audiotrack_file_name);
-
-    // Map the audiotrack file name to a new instance of WavReaderInterface.
-    std::unique_ptr<WavReaderInterface> wavreader =
-        wavreader_abstract_factory_->Create(audiotrack_file_path.pathname());
-
-    if (sample_rate_hz_ == 0) {
-      sample_rate_hz_ = wavreader->SampleRate();
-    } else if (sample_rate_hz_ != wavreader->SampleRate()) {
-      LOG(LS_ERROR) << "All the audio tracks should have the same sample rate.";
-      return false;
-    }
-
-    if (wavreader->NumChannels() != 1) {
-      LOG(LS_ERROR) << "Only mono audio tracks supported.";
-      return false;
-    }
-
-    audiotrack_readers_.emplace(
-        turn.audiotrack_file_name, std::move(wavreader));
-  }
-
-  return true;
-}
-
-bool MultiEndCall::CheckTiming() {
-  struct Interval {
-    size_t begin;
-    size_t end;
-  };
-  size_t number_of_turns = timing_.size();
-  auto millisecond_to_samples = [](int ms, int sr) -> int {
-    // Truncation may happen if the sampling rate is not an integer multiple
-    // of 1000 (e.g., 44100).
-    return ms * sr / 1000;
-  };
-  auto in_interval = [](size_t value, const Interval& interval) {
-    return interval.begin <= value && value < interval.end;
-  };
-  total_duration_samples_ = 0;
-  speaking_turns_.clear();
-
-  // Begin and end timestamps for the last two turns (unit: number of samples).
-  Interval second_last_turn = {0, 0};
-  Interval last_turn = {0, 0};
-
-  // Initialize map to store speaking turn indices of each speaker (used to
-  // detect self cross-talk).
-  std::map<std::string, std::vector<size_t>> speaking_turn_indices;
-  for (const std::string& speaker_name : speaker_names_) {
-    speaking_turn_indices.emplace(
-        std::piecewise_construct,
-        std::forward_as_tuple(speaker_name),
-        std::forward_as_tuple());
-  }
-
-  // Parse turns.
-  for (size_t turn_index = 0; turn_index < number_of_turns; ++turn_index) {
-    const Turn& turn = timing_[turn_index];
-    auto it = audiotrack_readers_.find(turn.audiotrack_file_name);
-    RTC_CHECK(it != audiotrack_readers_.end())
-        << "Audio track reader not created";
-
-    // Begin and end timestamps for the current turn.
-    int offset_samples = millisecond_to_samples(
-        turn.offset, it->second->SampleRate());
-    std::size_t begin_timestamp = last_turn.end + offset_samples;
-    std::size_t end_timestamp = begin_timestamp + it->second->NumSamples();
-    LOG(LS_INFO) << "turn #" << turn_index << " " << begin_timestamp
-        << "-" << end_timestamp << " ms";
-
-    // The order is invalid if the offset is negative and its absolute value is
-    // larger then the duration of the previous turn.
-    if (offset_samples < 0 && -offset_samples > static_cast<int>(
-        last_turn.end - last_turn.begin)) {
-      LOG(LS_ERROR) << "invalid order";
-      return false;
-    }
-
-    // Cross-talk with 3 or more speakers occurs when the beginning of the
-    // current interval falls in the last two turns.
-    if (turn_index > 1 && in_interval(begin_timestamp, last_turn)
-        && in_interval(begin_timestamp, second_last_turn)) {
-      LOG(LS_ERROR) << "cross-talk with 3+ speakers";
-      return false;
-    }
-
-    // Append turn.
-    speaking_turns_.emplace_back(
-        turn.speaker_name, turn.audiotrack_file_name,
-        begin_timestamp, end_timestamp);
-
-    // Save speaking turn index for self cross-talk detection.
-    RTC_DCHECK_EQ(speaking_turns_.size(), turn_index + 1);
-    speaking_turn_indices[turn.speaker_name].push_back(turn_index);
-
-    // Update total duration of the consversational speech.
-    if (total_duration_samples_ < end_timestamp)
-      total_duration_samples_ = end_timestamp;
-
-    // Update and continue with next turn.
-    second_last_turn = last_turn;
-    last_turn.begin = begin_timestamp;
-    last_turn.end = end_timestamp;
-  }
-
-  // Detect self cross-talk.
-  for (const std::string& speaker_name : speaker_names_) {
-    LOG(LS_INFO) << "checking self cross-talk for <"
-        << speaker_name << ">";
-
-    // Copy all turns for this speaker to new vector.
-    std::vector<SpeakingTurn> speaking_turns_for_name;
-    std::copy_if(speaking_turns_.begin(), speaking_turns_.end(),
-                 std::back_inserter(speaking_turns_for_name),
-                 [&speaker_name](const SpeakingTurn& st){
-                   return st.speaker_name == speaker_name; });
-
-    // Check for overlap between adjacent elements.
-    // This is a sufficient condition for self cross-talk since the intervals
-    // are sorted by begin timestamp.
-    auto overlap = std::adjacent_find(
-        speaking_turns_for_name.begin(), speaking_turns_for_name.end(),
-        [](const SpeakingTurn& a, const SpeakingTurn& b) {
-            return a.end > b.begin; });
-
-    if (overlap != speaking_turns_for_name.end()) {
-      LOG(LS_ERROR) << "Self cross-talk detected";
-      return false;
-    }
-  }
-
-  return true;
-}
-
-}  // namespace conversational_speech
-}  // namespace test
-}  // namespace webrtc
diff --git a/modules/audio_processing/test/conversational_speech/multiend_call.h b/modules/audio_processing/test/conversational_speech/multiend_call.h
deleted file mode 100644
index 38cc0e2..0000000
--- a/modules/audio_processing/test/conversational_speech/multiend_call.h
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- *  Copyright (c) 2017 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_PROCESSING_TEST_CONVERSATIONAL_SPEECH_MULTIEND_CALL_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_TEST_CONVERSATIONAL_SPEECH_MULTIEND_CALL_H_
-
-#include <stddef.h>
-#include <map>
-#include <memory>
-#include <set>
-#include <string>
-#include <utility>
-#include <vector>
-
-#include "webrtc/api/array_view.h"
-#include "webrtc/modules/audio_processing/test/conversational_speech/timing.h"
-#include "webrtc/modules/audio_processing/test/conversational_speech/wavreader_abstract_factory.h"
-#include "webrtc/modules/audio_processing/test/conversational_speech/wavreader_interface.h"
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace webrtc {
-namespace test {
-namespace conversational_speech {
-
-class MultiEndCall {
- public:
-  struct SpeakingTurn {
-    // Constructor required in order to use std::vector::emplace_back().
-    SpeakingTurn(std::string new_speaker_name,
-                 std::string new_audiotrack_file_name,
-                 size_t new_begin, size_t new_end)
-        : speaker_name(std::move(new_speaker_name)),
-          audiotrack_file_name(std::move(new_audiotrack_file_name)),
-          begin(new_begin), end(new_end) {}
-    std::string speaker_name;
-    std::string audiotrack_file_name;
-    size_t begin;
-    size_t end;
-  };
-
-  MultiEndCall(
-      rtc::ArrayView<const Turn> timing, const std::string& audiotracks_path,
-      std::unique_ptr<WavReaderAbstractFactory> wavreader_abstract_factory);
-  ~MultiEndCall();
-
-  const std::set<std::string>& speaker_names() const { return speaker_names_; }
-  const std::map<std::string, std::unique_ptr<WavReaderInterface>>&
-      audiotrack_readers() const { return audiotrack_readers_; }
-  bool valid() const { return valid_; }
-  int sample_rate() const { return sample_rate_hz_; }
-  size_t total_duration_samples() const { return total_duration_samples_; }
-  const std::vector<SpeakingTurn>& speaking_turns() const {
-      return speaking_turns_; }
-
- private:
-  // Finds unique speaker names.
-  void FindSpeakerNames();
-
-  // Creates one WavReader instance for each unique audiotrack. It returns false
-  // if the audio tracks do not have the same sample rate or if they are not
-  // mono.
-  bool CreateAudioTrackReaders();
-
-  // Validates the speaking turns timing information. Accepts cross-talk, but
-  // only up to 2 speakers. Rejects unordered turns and self cross-talk.
-  bool CheckTiming();
-
-  rtc::ArrayView<const Turn> timing_;
-  const std::string& audiotracks_path_;
-  std::unique_ptr<WavReaderAbstractFactory> wavreader_abstract_factory_;
-  std::set<std::string> speaker_names_;
-  std::map<std::string, std::unique_ptr<WavReaderInterface>>
-      audiotrack_readers_;
-  bool valid_;
-  int sample_rate_hz_;
-  size_t total_duration_samples_;
-  std::vector<SpeakingTurn> speaking_turns_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(MultiEndCall);
-};
-
-}  // namespace conversational_speech
-}  // namespace test
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_TEST_CONVERSATIONAL_SPEECH_MULTIEND_CALL_H_
diff --git a/modules/audio_processing/test/conversational_speech/simulator.cc b/modules/audio_processing/test/conversational_speech/simulator.cc
deleted file mode 100644
index 709dec3..0000000
--- a/modules/audio_processing/test/conversational_speech/simulator.cc
+++ /dev/null
@@ -1,221 +0,0 @@
-/*
- *  Copyright (c) 2017 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_processing/test/conversational_speech/simulator.h"
-
-#include <set>
-#include <utility>
-#include <vector>
-
-#include "webrtc/api/array_view.h"
-#include "webrtc/common_audio/wav_file.h"
-#include "webrtc/modules/audio_processing/test/conversational_speech/wavreader_interface.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/pathutils.h"
-#include "webrtc/rtc_base/ptr_util.h"
-
-namespace webrtc {
-namespace test {
-namespace {
-
-using conversational_speech::MultiEndCall;
-using conversational_speech::SpeakerOutputFilePaths;
-using conversational_speech::WavReaderInterface;
-
-// Combines output path and speaker names to define the output file paths for
-// the near-end and far=end audio tracks.
-std::unique_ptr<std::map<std::string, SpeakerOutputFilePaths>>
-    InitSpeakerOutputFilePaths(const std::set<std::string>& speaker_names,
-                               const std::string& output_path) {
-  // Create map.
-  auto speaker_output_file_paths_map = rtc::MakeUnique<
-      std::map<std::string, SpeakerOutputFilePaths>>();
-
-  // Add near-end and far-end output paths into the map.
-  for (const auto& speaker_name : speaker_names) {
-    const rtc::Pathname near_end_path(
-        output_path, "s_" + speaker_name + "-near_end.wav");
-    LOG(LS_VERBOSE) << "The near-end audio track will be created in "
-        << near_end_path.pathname() << ".";
-
-    const rtc::Pathname far_end_path(
-        output_path, "s_" + speaker_name + "-far_end.wav");
-    LOG(LS_VERBOSE) << "The far-end audio track will be created in "
-        << far_end_path.pathname() << ".";
-
-    // Add to map.
-    speaker_output_file_paths_map->emplace(
-        std::piecewise_construct,
-        std::forward_as_tuple(speaker_name),
-        std::forward_as_tuple(near_end_path.pathname(),
-                              far_end_path.pathname()));
-  }
-
-  return speaker_output_file_paths_map;
-}
-
-// Class that provides one WavWriter for the near-end and one for the far-end
-// output track of a speaker.
-class SpeakerWavWriters {
- public:
-  SpeakerWavWriters(
-      const SpeakerOutputFilePaths& output_file_paths, int sample_rate)
-          : near_end_wav_writer_(output_file_paths.near_end, sample_rate, 1u),
-            far_end_wav_writer_(output_file_paths.far_end, sample_rate, 1u) {}
-  WavWriter* near_end_wav_writer() {
-    return &near_end_wav_writer_;
-  }
-  WavWriter* far_end_wav_writer() {
-    return &far_end_wav_writer_;
-  }
- private:
-  WavWriter near_end_wav_writer_;
-  WavWriter far_end_wav_writer_;
-};
-
-// Initializes one WavWriter instance for each speaker and both the near-end and
-// far-end output tracks.
-std::unique_ptr<std::map<std::string, SpeakerWavWriters>>
-    InitSpeakersWavWriters(const std::map<std::string, SpeakerOutputFilePaths>&
-                           speaker_output_file_paths, int sample_rate) {
-  // Create map.
-  auto speaker_wav_writers_map = rtc::MakeUnique<
-      std::map<std::string, SpeakerWavWriters>>();
-
-  // Add SpeakerWavWriters instance into the map.
-  for (auto it = speaker_output_file_paths.begin();
-      it != speaker_output_file_paths.end(); ++it) {
-    speaker_wav_writers_map->emplace(
-        std::piecewise_construct,
-        std::forward_as_tuple(it->first),
-        std::forward_as_tuple(it->second, sample_rate));
-  }
-
-  return speaker_wav_writers_map;
-}
-
-// Reads all the samples for each audio track.
-std::unique_ptr<std::map<std::string, std::vector<int16_t>>> PreloadAudioTracks(
-    const std::map<std::string, std::unique_ptr<WavReaderInterface>>&
-        audiotrack_readers) {
-  // Create map.
-  auto audiotracks_map = rtc::MakeUnique<
-      std::map<std::string, std::vector<int16_t>>>();
-
-  // Add audio track vectors.
-  for (auto it = audiotrack_readers.begin(); it != audiotrack_readers.end();
-      ++it) {
-    // Add map entry.
-    audiotracks_map->emplace(
-        std::piecewise_construct,
-        std::forward_as_tuple(it->first),
-        std::forward_as_tuple(it->second->NumSamples()));
-
-    // Read samples.
-    it->second->ReadInt16Samples(audiotracks_map->at(it->first));
-  }
-
-  return audiotracks_map;
-}
-
-// Writes all the values in |source_samples| via |wav_writer|. If the number of
-// previously written samples in |wav_writer| is less than |interval_begin|, it
-// adds zeros as left padding. The padding corresponds to intervals during which
-// a speaker is not active.
-void PadLeftWriteChunk(rtc::ArrayView<const int16_t> source_samples,
-                       size_t interval_begin, WavWriter* wav_writer) {
-  // Add left padding.
-  RTC_CHECK(wav_writer);
-  RTC_CHECK_GE(interval_begin, wav_writer->num_samples());
-  size_t padding_size = interval_begin - wav_writer->num_samples();
-  if (padding_size != 0) {
-    const std::vector<int16_t> padding(padding_size, 0);
-    wav_writer->WriteSamples(padding.data(), padding_size);
-  }
-
-  // Write source samples.
-  wav_writer->WriteSamples(source_samples.data(), source_samples.size());
-}
-
-// Appends zeros via |wav_writer|. The number of zeros is always non-negative
-// and equal to the difference between the previously written samples and
-// |pad_samples|.
-void PadRightWrite(WavWriter* wav_writer, size_t pad_samples) {
-  RTC_CHECK(wav_writer);
-  RTC_CHECK_GE(pad_samples, wav_writer->num_samples());
-  size_t padding_size = pad_samples - wav_writer->num_samples();
-  if (padding_size != 0) {
-    const std::vector<int16_t> padding(padding_size, 0);
-    wav_writer->WriteSamples(padding.data(), padding_size);
-  }
-}
-
-}  // namespace
-
-namespace conversational_speech {
-
-std::unique_ptr<std::map<std::string, SpeakerOutputFilePaths>> Simulate(
-    const MultiEndCall& multiend_call, const std::string& output_path) {
-  // Set output file paths and initialize wav writers.
-  const auto& speaker_names = multiend_call.speaker_names();
-  auto speaker_output_file_paths = InitSpeakerOutputFilePaths(
-      speaker_names, output_path);
-  auto speakers_wav_writers = InitSpeakersWavWriters(
-      *speaker_output_file_paths, multiend_call.sample_rate());
-
-  // Preload all the input audio tracks.
-  const auto& audiotrack_readers = multiend_call.audiotrack_readers();
-  auto audiotracks = PreloadAudioTracks(audiotrack_readers);
-
-  // TODO(alessiob): When speaker_names.size() == 2, near-end and far-end
-  // across the 2 speakers are symmetric; hence, the code below could be
-  // replaced by only creating the near-end or the far-end. However, this would
-  // require to split the unit tests and document the behavior in README.md.
-  // In practice, it should not be an issue since the files are not expected to
-  // be signinificant.
-
-  // Write near-end and far-end output tracks.
-  for (const auto& speaking_turn : multiend_call.speaking_turns()) {
-    const std::string& active_speaker_name = speaking_turn.speaker_name;
-    auto source_audiotrack = audiotracks->at(
-        speaking_turn.audiotrack_file_name);
-
-    // Write active speaker's chunk to active speaker's near-end.
-    PadLeftWriteChunk(source_audiotrack, speaking_turn.begin,
-                      speakers_wav_writers->at(
-                          active_speaker_name).near_end_wav_writer());
-
-    // Write active speaker's chunk to other participants' far-ends.
-    for (const std::string& speaker_name : speaker_names) {
-      if (speaker_name == active_speaker_name)
-        continue;
-      PadLeftWriteChunk(source_audiotrack, speaking_turn.begin,
-                        speakers_wav_writers->at(
-                            speaker_name).far_end_wav_writer());
-    }
-  }
-
-  // Finalize all the output tracks with right padding.
-  // This is required to make all the output tracks duration equal.
-  size_t duration_samples = multiend_call.total_duration_samples();
-  for (const std::string& speaker_name : speaker_names) {
-    PadRightWrite(speakers_wav_writers->at(speaker_name).near_end_wav_writer(),
-                  duration_samples);
-    PadRightWrite(speakers_wav_writers->at(speaker_name).far_end_wav_writer(),
-                  duration_samples);
-  }
-
-  return speaker_output_file_paths;
-}
-
-}  // namespace conversational_speech
-}  // namespace test
-}  // namespace webrtc
diff --git a/modules/audio_processing/test/conversational_speech/simulator.h b/modules/audio_processing/test/conversational_speech/simulator.h
deleted file mode 100644
index 6882cca..0000000
--- a/modules/audio_processing/test/conversational_speech/simulator.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- *  Copyright (c) 2017 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_PROCESSING_TEST_CONVERSATIONAL_SPEECH_SIMULATOR_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_TEST_CONVERSATIONAL_SPEECH_SIMULATOR_H_
-
-#include <map>
-#include <memory>
-#include <string>
-#include <utility>
-
-#include "webrtc/modules/audio_processing/test/conversational_speech/multiend_call.h"
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace webrtc {
-namespace test {
-namespace conversational_speech {
-
-struct SpeakerOutputFilePaths {
-  SpeakerOutputFilePaths(const std::string& new_near_end,
-                         const std::string& new_far_end)
-      : near_end(new_near_end),
-        far_end(new_far_end) {}
-  // Paths to the near-end and far-end audio track files.
-  const std::string near_end;
-  const std::string far_end;
-};
-
-// Generates the near-end and far-end audio track pairs for each speaker.
-std::unique_ptr<std::map<std::string, SpeakerOutputFilePaths>>
-    Simulate(const MultiEndCall& multiend_call, const std::string& output_path);
-
-}  // namespace conversational_speech
-}  // namespace test
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_TEST_CONVERSATIONAL_SPEECH_SIMULATOR_H_
diff --git a/modules/audio_processing/test/conversational_speech/timing.cc b/modules/audio_processing/test/conversational_speech/timing.cc
deleted file mode 100644
index 59ca867..0000000
--- a/modules/audio_processing/test/conversational_speech/timing.cc
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- *  Copyright (c) 2017 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_processing/test/conversational_speech/timing.h"
-
-#include <fstream>
-#include <iostream>
-
-#include "webrtc/rtc_base/stringencode.h"
-
-namespace webrtc {
-namespace test {
-namespace conversational_speech {
-
-bool Turn::operator==(const Turn &b) const {
-  return b.speaker_name == speaker_name &&
-         b.audiotrack_file_name == audiotrack_file_name &&
-         b.offset == offset;
-}
-
-std::vector<Turn> LoadTiming(const std::string& timing_filepath) {
-  // Line parser.
-  auto parse_line = [](const std::string& line) {
-    std::vector<std::string> fields;
-    rtc::split(line, ' ', &fields);
-    RTC_CHECK_EQ(fields.size(), 3);
-    return Turn(fields[0], fields[1], std::atol(fields[2].c_str()));
-  };
-
-  // Init.
-  std::vector<Turn> timing;
-
-  // Parse lines.
-  std::string line;
-  std::ifstream infile(timing_filepath);
-  while (std::getline(infile, line)) {
-    if (line.empty())
-      continue;
-    timing.push_back(parse_line(line));
-  }
-  infile.close();
-
-  return timing;
-}
-
-void SaveTiming(const std::string& timing_filepath,
-                rtc::ArrayView<const Turn> timing) {
-  std::ofstream outfile(timing_filepath);
-  RTC_CHECK(outfile.is_open());
-  for (const Turn& turn : timing) {
-    outfile << turn.speaker_name << " " << turn.audiotrack_file_name
-        << " " << turn.offset << std::endl;
-  }
-  outfile.close();
-}
-
-}  // namespace conversational_speech
-}  // namespace test
-}  // namespace webrtc
diff --git a/modules/audio_processing/test/conversational_speech/timing.h b/modules/audio_processing/test/conversational_speech/timing.h
deleted file mode 100644
index 62ed1cb..0000000
--- a/modules/audio_processing/test/conversational_speech/timing.h
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- *  Copyright (c) 2017 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_PROCESSING_TEST_CONVERSATIONAL_SPEECH_TIMING_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_TEST_CONVERSATIONAL_SPEECH_TIMING_H_
-
-#include <string>
-#include <vector>
-
-#include "webrtc/api/array_view.h"
-
-namespace webrtc {
-namespace test {
-namespace conversational_speech {
-
-struct Turn{
-  Turn(std::string new_speaker_name, std::string new_audiotrack_file_name,
-       int new_offset)
-      : speaker_name(new_speaker_name),
-        audiotrack_file_name(new_audiotrack_file_name),
-        offset(new_offset) {}
-  bool operator==(const Turn &b) const;
-  std::string speaker_name;
-  std::string audiotrack_file_name;
-  int offset;
-};
-
-// Loads a list of turns from a file.
-std::vector<Turn> LoadTiming(const std::string& timing_filepath);
-
-// Writes a list of turns into a file.
-void SaveTiming(const std::string& timing_filepath,
-                rtc::ArrayView<const Turn> timing);
-
-}  // namespace conversational_speech
-}  // namespace test
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_TEST_CONVERSATIONAL_SPEECH_TIMING_H_
diff --git a/modules/audio_processing/test/conversational_speech/wavreader_abstract_factory.h b/modules/audio_processing/test/conversational_speech/wavreader_abstract_factory.h
deleted file mode 100644
index b48245b..0000000
--- a/modules/audio_processing/test/conversational_speech/wavreader_abstract_factory.h
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- *  Copyright (c) 2017 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_PROCESSING_TEST_CONVERSATIONAL_SPEECH_WAVREADER_ABSTRACT_FACTORY_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_TEST_CONVERSATIONAL_SPEECH_WAVREADER_ABSTRACT_FACTORY_H_
-
-#include <memory>
-#include <string>
-
-#include "webrtc/modules/audio_processing/test/conversational_speech/wavreader_interface.h"
-
-namespace webrtc {
-namespace test {
-namespace conversational_speech {
-
-class WavReaderAbstractFactory {
- public:
-  virtual ~WavReaderAbstractFactory() = default;
-  virtual std::unique_ptr<WavReaderInterface> Create(
-      const std::string& filepath) const = 0;
-};
-
-}  // namespace conversational_speech
-}  // namespace test
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_TEST_CONVERSATIONAL_SPEECH_WAVREADER_ABSTRACT_FACTORY_H_
diff --git a/modules/audio_processing/test/conversational_speech/wavreader_factory.cc b/modules/audio_processing/test/conversational_speech/wavreader_factory.cc
deleted file mode 100644
index c2f87a8..0000000
--- a/modules/audio_processing/test/conversational_speech/wavreader_factory.cc
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- *  Copyright (c) 2017 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_processing/test/conversational_speech/wavreader_factory.h"
-
-#include <cstddef>
-
-#include "webrtc/api/array_view.h"
-#include "webrtc/common_audio/wav_file.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-namespace test {
-namespace {
-
-using conversational_speech::WavReaderInterface;
-
-class WavReaderAdaptor final : public WavReaderInterface {
- public:
-  explicit WavReaderAdaptor(const std::string& filepath)
-      : wav_reader_(filepath) {}
-  ~WavReaderAdaptor() override = default;
-
-  size_t ReadFloatSamples(rtc::ArrayView<float> samples) override {
-    return wav_reader_.ReadSamples(samples.size(), samples.begin());
-  }
-
-  size_t ReadInt16Samples(rtc::ArrayView<int16_t> samples) override {
-    return wav_reader_.ReadSamples(samples.size(), samples.begin());
-  }
-
-  int SampleRate() const override {
-    return wav_reader_.sample_rate();
-  }
-
-  size_t NumChannels() const override {
-    return wav_reader_.num_channels();
-  }
-
-  size_t NumSamples() const override {
-    return wav_reader_.num_samples();
-  }
-
- private:
-  WavReader wav_reader_;
-};
-
-}  // namespace
-
-namespace conversational_speech {
-
-WavReaderFactory::WavReaderFactory() = default;
-
-WavReaderFactory::~WavReaderFactory() = default;
-
-std::unique_ptr<WavReaderInterface> WavReaderFactory::Create(
-    const std::string& filepath) const {
-  return std::unique_ptr<WavReaderAdaptor>(new WavReaderAdaptor(filepath));
-}
-
-}  // namespace conversational_speech
-}  // namespace test
-}  // namespace webrtc
diff --git a/modules/audio_processing/test/conversational_speech/wavreader_factory.h b/modules/audio_processing/test/conversational_speech/wavreader_factory.h
deleted file mode 100644
index 5c46af0..0000000
--- a/modules/audio_processing/test/conversational_speech/wavreader_factory.h
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- *  Copyright (c) 2017 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_PROCESSING_TEST_CONVERSATIONAL_SPEECH_WAVREADER_FACTORY_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_TEST_CONVERSATIONAL_SPEECH_WAVREADER_FACTORY_H_
-
-#include <memory>
-#include <string>
-
-#include "webrtc/modules/audio_processing/test/conversational_speech/wavreader_abstract_factory.h"
-#include "webrtc/modules/audio_processing/test/conversational_speech/wavreader_interface.h"
-
-namespace webrtc {
-namespace test {
-namespace conversational_speech {
-
-class WavReaderFactory : public WavReaderAbstractFactory {
- public:
-  WavReaderFactory();
-  ~WavReaderFactory() override;
-  std::unique_ptr<WavReaderInterface> Create(const std::string& filepath) const
-      override;
-};
-
-}  // namespace conversational_speech
-}  // namespace test
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_TEST_CONVERSATIONAL_SPEECH_WAVREADER_FACTORY_H_
diff --git a/modules/audio_processing/test/conversational_speech/wavreader_interface.h b/modules/audio_processing/test/conversational_speech/wavreader_interface.h
deleted file mode 100644
index 74dae40..0000000
--- a/modules/audio_processing/test/conversational_speech/wavreader_interface.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- *  Copyright (c) 2017 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_PROCESSING_TEST_CONVERSATIONAL_SPEECH_WAVREADER_INTERFACE_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_TEST_CONVERSATIONAL_SPEECH_WAVREADER_INTERFACE_H_
-
-#include <stddef.h>
-
-#include "webrtc/api/array_view.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-namespace test {
-namespace conversational_speech {
-
-class WavReaderInterface {
- public:
-  virtual ~WavReaderInterface() = default;
-
-  // Returns the number of samples read.
-  virtual size_t ReadFloatSamples(rtc::ArrayView<float> samples) = 0;
-  virtual size_t ReadInt16Samples(rtc::ArrayView<int16_t> samples) = 0;
-
-  // Getters.
-  virtual int SampleRate() const = 0;
-  virtual size_t NumChannels() const = 0;
-  virtual size_t NumSamples() const = 0;
-};
-
-}  // namespace conversational_speech
-}  // namespace test
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_TEST_CONVERSATIONAL_SPEECH_WAVREADER_INTERFACE_H_
diff --git a/modules/audio_processing/test/debug_dump_replayer.cc b/modules/audio_processing/test/debug_dump_replayer.cc
deleted file mode 100644
index b88692c..0000000
--- a/modules/audio_processing/test/debug_dump_replayer.cc
+++ /dev/null
@@ -1,272 +0,0 @@
-/*
- *  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_processing/test/debug_dump_replayer.h"
-
-#include "webrtc/modules/audio_processing/test/protobuf_utils.h"
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-namespace test {
-
-namespace {
-
-void MaybeResetBuffer(std::unique_ptr<ChannelBuffer<float>>* buffer,
-                      const StreamConfig& config) {
-  auto& buffer_ref = *buffer;
-  if (!buffer_ref.get() || buffer_ref->num_frames() != config.num_frames() ||
-      buffer_ref->num_channels() != config.num_channels()) {
-    buffer_ref.reset(new ChannelBuffer<float>(config.num_frames(),
-                                             config.num_channels()));
-  }
-}
-
-}  // namespace
-
-DebugDumpReplayer::DebugDumpReplayer()
-    : input_(nullptr),  // will be created upon usage.
-      reverse_(nullptr),
-      output_(nullptr),
-      apm_(nullptr),
-      debug_file_(nullptr) {}
-
-DebugDumpReplayer::~DebugDumpReplayer() {
-  if (debug_file_)
-    fclose(debug_file_);
-}
-
-bool DebugDumpReplayer::SetDumpFile(const std::string& filename) {
-  debug_file_ = fopen(filename.c_str(), "rb");
-  LoadNextMessage();
-  return debug_file_;
-}
-
-// Get next event that has not run.
-rtc::Optional<audioproc::Event> DebugDumpReplayer::GetNextEvent() const {
-  if (!has_next_event_)
-    return rtc::Optional<audioproc::Event>();
-  else
-    return rtc::Optional<audioproc::Event>(next_event_);
-}
-
-// Run the next event. Returns the event type.
-bool DebugDumpReplayer::RunNextEvent() {
-  if (!has_next_event_)
-    return false;
-  switch (next_event_.type()) {
-    case audioproc::Event::INIT:
-      OnInitEvent(next_event_.init());
-      break;
-    case audioproc::Event::STREAM:
-      OnStreamEvent(next_event_.stream());
-      break;
-    case audioproc::Event::REVERSE_STREAM:
-      OnReverseStreamEvent(next_event_.reverse_stream());
-      break;
-    case audioproc::Event::CONFIG:
-      OnConfigEvent(next_event_.config());
-      break;
-    case audioproc::Event::UNKNOWN_EVENT:
-      // We do not expect to receive UNKNOWN event.
-      return false;
-  }
-  LoadNextMessage();
-  return true;
-}
-
-const ChannelBuffer<float>* DebugDumpReplayer::GetOutput() const {
-  return output_.get();
-}
-
-StreamConfig DebugDumpReplayer::GetOutputConfig() const {
-  return output_config_;
-}
-
-// OnInitEvent reset the input/output/reserve channel format.
-void DebugDumpReplayer::OnInitEvent(const audioproc::Init& msg) {
-  RTC_CHECK(msg.has_num_input_channels());
-  RTC_CHECK(msg.has_output_sample_rate());
-  RTC_CHECK(msg.has_num_output_channels());
-  RTC_CHECK(msg.has_reverse_sample_rate());
-  RTC_CHECK(msg.has_num_reverse_channels());
-
-  input_config_ = StreamConfig(msg.sample_rate(), msg.num_input_channels());
-  output_config_ =
-      StreamConfig(msg.output_sample_rate(), msg.num_output_channels());
-  reverse_config_ =
-      StreamConfig(msg.reverse_sample_rate(), msg.num_reverse_channels());
-
-  MaybeResetBuffer(&input_, input_config_);
-  MaybeResetBuffer(&output_, output_config_);
-  MaybeResetBuffer(&reverse_, reverse_config_);
-}
-
-// OnStreamEvent replays an input signal and verifies the output.
-void DebugDumpReplayer::OnStreamEvent(const audioproc::Stream& msg) {
-  // APM should have been created.
-  RTC_CHECK(apm_.get());
-
-  RTC_CHECK_EQ(AudioProcessing::kNoError,
-               apm_->gain_control()->set_stream_analog_level(msg.level()));
-  RTC_CHECK_EQ(AudioProcessing::kNoError,
-               apm_->set_stream_delay_ms(msg.delay()));
-
-  apm_->echo_cancellation()->set_stream_drift_samples(msg.drift());
-  if (msg.has_keypress()) {
-    apm_->set_stream_key_pressed(msg.keypress());
-  } else {
-    apm_->set_stream_key_pressed(true);
-  }
-
-  RTC_CHECK_EQ(input_config_.num_channels(),
-               static_cast<size_t>(msg.input_channel_size()));
-  RTC_CHECK_EQ(input_config_.num_frames() * sizeof(float),
-               msg.input_channel(0).size());
-
-  for (int i = 0; i < msg.input_channel_size(); ++i) {
-    memcpy(input_->channels()[i], msg.input_channel(i).data(),
-           msg.input_channel(i).size());
-  }
-
-  RTC_CHECK_EQ(AudioProcessing::kNoError,
-               apm_->ProcessStream(input_->channels(), input_config_,
-                                   output_config_, output_->channels()));
-}
-
-void DebugDumpReplayer::OnReverseStreamEvent(
-    const audioproc::ReverseStream& msg) {
-  // APM should have been created.
-  RTC_CHECK(apm_.get());
-
-  RTC_CHECK_GT(msg.channel_size(), 0);
-  RTC_CHECK_EQ(reverse_config_.num_channels(),
-               static_cast<size_t>(msg.channel_size()));
-  RTC_CHECK_EQ(reverse_config_.num_frames() * sizeof(float),
-               msg.channel(0).size());
-
-  for (int i = 0; i < msg.channel_size(); ++i) {
-    memcpy(reverse_->channels()[i], msg.channel(i).data(),
-           msg.channel(i).size());
-  }
-
-  RTC_CHECK_EQ(
-      AudioProcessing::kNoError,
-      apm_->ProcessReverseStream(reverse_->channels(), reverse_config_,
-                                 reverse_config_, reverse_->channels()));
-}
-
-void DebugDumpReplayer::OnConfigEvent(const audioproc::Config& msg) {
-  MaybeRecreateApm(msg);
-  ConfigureApm(msg);
-}
-
-void DebugDumpReplayer::MaybeRecreateApm(const audioproc::Config& msg) {
-  // These configurations cannot be changed on the fly.
-  Config config;
-  RTC_CHECK(msg.has_aec_delay_agnostic_enabled());
-  config.Set<DelayAgnostic>(
-      new DelayAgnostic(msg.aec_delay_agnostic_enabled()));
-
-  RTC_CHECK(msg.has_noise_robust_agc_enabled());
-  config.Set<ExperimentalAgc>(
-      new ExperimentalAgc(msg.noise_robust_agc_enabled()));
-
-  RTC_CHECK(msg.has_transient_suppression_enabled());
-  config.Set<ExperimentalNs>(
-      new ExperimentalNs(msg.transient_suppression_enabled()));
-
-  RTC_CHECK(msg.has_aec_extended_filter_enabled());
-  config.Set<ExtendedFilter>(
-      new ExtendedFilter(msg.aec_extended_filter_enabled()));
-
-  RTC_CHECK(msg.has_intelligibility_enhancer_enabled());
-  config.Set<Intelligibility>(
-      new Intelligibility(msg.intelligibility_enhancer_enabled()));
-
-  // We only create APM once, since changes on these fields should not
-  // happen in current implementation.
-  if (!apm_.get()) {
-    apm_.reset(AudioProcessing::Create(config));
-  }
-}
-
-void DebugDumpReplayer::ConfigureApm(const audioproc::Config& msg) {
-  AudioProcessing::Config apm_config;
-
-  // AEC configs.
-  RTC_CHECK(msg.has_aec_enabled());
-  RTC_CHECK_EQ(AudioProcessing::kNoError,
-               apm_->echo_cancellation()->Enable(msg.aec_enabled()));
-
-  RTC_CHECK(msg.has_aec_drift_compensation_enabled());
-  RTC_CHECK_EQ(AudioProcessing::kNoError,
-               apm_->echo_cancellation()->enable_drift_compensation(
-                   msg.aec_drift_compensation_enabled()));
-
-  RTC_CHECK(msg.has_aec_suppression_level());
-  RTC_CHECK_EQ(AudioProcessing::kNoError,
-               apm_->echo_cancellation()->set_suppression_level(
-                   static_cast<EchoCancellation::SuppressionLevel>(
-                       msg.aec_suppression_level())));
-
-  // AECM configs.
-  RTC_CHECK(msg.has_aecm_enabled());
-  RTC_CHECK_EQ(AudioProcessing::kNoError,
-               apm_->echo_control_mobile()->Enable(msg.aecm_enabled()));
-
-  RTC_CHECK(msg.has_aecm_comfort_noise_enabled());
-  RTC_CHECK_EQ(AudioProcessing::kNoError,
-               apm_->echo_control_mobile()->enable_comfort_noise(
-                   msg.aecm_comfort_noise_enabled()));
-
-  RTC_CHECK(msg.has_aecm_routing_mode());
-  RTC_CHECK_EQ(AudioProcessing::kNoError,
-               apm_->echo_control_mobile()->set_routing_mode(
-                   static_cast<EchoControlMobile::RoutingMode>(
-                       msg.aecm_routing_mode())));
-
-  // AGC configs.
-  RTC_CHECK(msg.has_agc_enabled());
-  RTC_CHECK_EQ(AudioProcessing::kNoError,
-               apm_->gain_control()->Enable(msg.agc_enabled()));
-
-  RTC_CHECK(msg.has_agc_mode());
-  RTC_CHECK_EQ(AudioProcessing::kNoError,
-               apm_->gain_control()->set_mode(
-                   static_cast<GainControl::Mode>(msg.agc_mode())));
-
-  RTC_CHECK(msg.has_agc_limiter_enabled());
-  RTC_CHECK_EQ(AudioProcessing::kNoError,
-               apm_->gain_control()->enable_limiter(msg.agc_limiter_enabled()));
-
-  // HPF configs.
-  RTC_CHECK(msg.has_hpf_enabled());
-  apm_config.high_pass_filter.enabled = msg.hpf_enabled();
-
-  // NS configs.
-  RTC_CHECK(msg.has_ns_enabled());
-  RTC_CHECK_EQ(AudioProcessing::kNoError,
-               apm_->noise_suppression()->Enable(msg.ns_enabled()));
-
-  RTC_CHECK(msg.has_ns_level());
-  RTC_CHECK_EQ(AudioProcessing::kNoError,
-               apm_->noise_suppression()->set_level(
-                   static_cast<NoiseSuppression::Level>(msg.ns_level())));
-
-  apm_->ApplyConfig(apm_config);
-}
-
-void DebugDumpReplayer::LoadNextMessage() {
-  has_next_event_ =
-      debug_file_ && ReadMessageFromFile(debug_file_, &next_event_);
-}
-
-}  // namespace test
-}  // namespace webrtc
diff --git a/modules/audio_processing/test/debug_dump_replayer.h b/modules/audio_processing/test/debug_dump_replayer.h
deleted file mode 100644
index 9ee4a63..0000000
--- a/modules/audio_processing/test/debug_dump_replayer.h
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- *  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_PROCESSING_TEST_DEBUG_DUMP_REPLAYER_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_TEST_DEBUG_DUMP_REPLAYER_H_
-
-#include <memory>
-#include <string>
-
-#include "webrtc/common_audio/channel_buffer.h"
-#include "webrtc/modules/audio_processing/include/audio_processing.h"
-#include "webrtc/rtc_base/ignore_wundef.h"
-
-RTC_PUSH_IGNORING_WUNDEF()
-#include "webrtc/modules/audio_processing/debug.pb.h"
-RTC_POP_IGNORING_WUNDEF()
-
-namespace webrtc {
-namespace test {
-
-class DebugDumpReplayer {
- public:
-  DebugDumpReplayer();
-  ~DebugDumpReplayer();
-
-  // Set dump file
-  bool SetDumpFile(const std::string& filename);
-
-  // Return next event.
-  rtc::Optional<audioproc::Event> GetNextEvent() const;
-
-  // Run the next event. Returns true if succeeded.
-  bool RunNextEvent();
-
-  const ChannelBuffer<float>* GetOutput() const;
-  StreamConfig GetOutputConfig() const;
-
- private:
-  // Following functions are facilities for replaying debug dumps.
-  void OnInitEvent(const audioproc::Init& msg);
-  void OnStreamEvent(const audioproc::Stream& msg);
-  void OnReverseStreamEvent(const audioproc::ReverseStream& msg);
-  void OnConfigEvent(const audioproc::Config& msg);
-
-  void MaybeRecreateApm(const audioproc::Config& msg);
-  void ConfigureApm(const audioproc::Config& msg);
-
-  void LoadNextMessage();
-
-  // Buffer for APM input/output.
-  std::unique_ptr<ChannelBuffer<float>> input_;
-  std::unique_ptr<ChannelBuffer<float>> reverse_;
-  std::unique_ptr<ChannelBuffer<float>> output_;
-
-  std::unique_ptr<AudioProcessing> apm_;
-
-  FILE* debug_file_;
-
-  StreamConfig input_config_;
-  StreamConfig reverse_config_;
-  StreamConfig output_config_;
-
-  bool has_next_event_;
-  audioproc::Event next_event_;
-};
-
-}  // namespace test
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_TEST_DEBUG_DUMP_REPLAYER_H_
diff --git a/modules/audio_processing/test/debug_dump_test.cc b/modules/audio_processing/test/debug_dump_test.cc
deleted file mode 100644
index d496b75..0000000
--- a/modules/audio_processing/test/debug_dump_test.cc
+++ /dev/null
@@ -1,600 +0,0 @@
-/*
- *  Copyright (c) 2015 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 <stddef.h>  // size_t
-
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "webrtc/modules/audio_coding/neteq/tools/resample_input_audio_file.h"
-#include "webrtc/modules/audio_processing/aec_dump/aec_dump_factory.h"
-#include "webrtc/modules/audio_processing/test/debug_dump_replayer.h"
-#include "webrtc/modules/audio_processing/test/test_utils.h"
-#include "webrtc/rtc_base/task_queue.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/testsupport/fileutils.h"
-
-namespace webrtc {
-namespace test {
-
-namespace {
-
-void MaybeResetBuffer(std::unique_ptr<ChannelBuffer<float>>* buffer,
-                      const StreamConfig& config) {
-  auto& buffer_ref = *buffer;
-  if (!buffer_ref.get() || buffer_ref->num_frames() != config.num_frames() ||
-      buffer_ref->num_channels() != config.num_channels()) {
-    buffer_ref.reset(new ChannelBuffer<float>(config.num_frames(),
-                                             config.num_channels()));
-  }
-}
-
-class DebugDumpGenerator {
- public:
-  DebugDumpGenerator(const std::string& input_file_name,
-                     int input_rate_hz,
-                     int input_channels,
-                     const std::string& reverse_file_name,
-                     int reverse_rate_hz,
-                     int reverse_channels,
-                     const Config& config,
-                     const std::string& dump_file_name);
-
-  // Constructor that uses default input files.
-  explicit DebugDumpGenerator(const Config& config,
-                              const AudioProcessing::Config& apm_config);
-
-  ~DebugDumpGenerator();
-
-  // Changes the sample rate of the input audio to the APM.
-  void SetInputRate(int rate_hz);
-
-  // Sets if converts stereo input signal to mono by discarding other channels.
-  void ForceInputMono(bool mono);
-
-  // Changes the sample rate of the reverse audio to the APM.
-  void SetReverseRate(int rate_hz);
-
-  // Sets if converts stereo reverse signal to mono by discarding other
-  // channels.
-  void ForceReverseMono(bool mono);
-
-  // Sets the required sample rate of the APM output.
-  void SetOutputRate(int rate_hz);
-
-  // Sets the required channels of the APM output.
-  void SetOutputChannels(int channels);
-
-  std::string dump_file_name() const { return dump_file_name_; }
-
-  void StartRecording();
-  void Process(size_t num_blocks);
-  void StopRecording();
-  AudioProcessing* apm() const { return apm_.get(); }
-
- private:
-  static void ReadAndDeinterleave(ResampleInputAudioFile* audio, int channels,
-                                  const StreamConfig& config,
-                                  float* const* buffer);
-
-  // APM input/output settings.
-  StreamConfig input_config_;
-  StreamConfig reverse_config_;
-  StreamConfig output_config_;
-
-  // Input file format.
-  const std::string input_file_name_;
-  ResampleInputAudioFile input_audio_;
-  const int input_file_channels_;
-
-  // Reverse file format.
-  const std::string reverse_file_name_;
-  ResampleInputAudioFile reverse_audio_;
-  const int reverse_file_channels_;
-
-  // Buffer for APM input/output.
-  std::unique_ptr<ChannelBuffer<float>> input_;
-  std::unique_ptr<ChannelBuffer<float>> reverse_;
-  std::unique_ptr<ChannelBuffer<float>> output_;
-
-  rtc::TaskQueue worker_queue_;
-  std::unique_ptr<AudioProcessing> apm_;
-
-  const std::string dump_file_name_;
-};
-
-DebugDumpGenerator::DebugDumpGenerator(const std::string& input_file_name,
-                                       int input_rate_hz,
-                                       int input_channels,
-                                       const std::string& reverse_file_name,
-                                       int reverse_rate_hz,
-                                       int reverse_channels,
-                                       const Config& config,
-                                       const std::string& dump_file_name)
-    : input_config_(input_rate_hz, input_channels),
-      reverse_config_(reverse_rate_hz, reverse_channels),
-      output_config_(input_rate_hz, input_channels),
-      input_audio_(input_file_name, input_rate_hz, input_rate_hz),
-      input_file_channels_(input_channels),
-      reverse_audio_(reverse_file_name, reverse_rate_hz, reverse_rate_hz),
-      reverse_file_channels_(reverse_channels),
-      input_(new ChannelBuffer<float>(input_config_.num_frames(),
-                                      input_config_.num_channels())),
-      reverse_(new ChannelBuffer<float>(reverse_config_.num_frames(),
-                                        reverse_config_.num_channels())),
-      output_(new ChannelBuffer<float>(output_config_.num_frames(),
-                                       output_config_.num_channels())),
-      worker_queue_("debug_dump_generator_worker_queue"),
-      apm_(AudioProcessing::Create(config)),
-      dump_file_name_(dump_file_name) {}
-
-DebugDumpGenerator::DebugDumpGenerator(
-    const Config& config,
-    const AudioProcessing::Config& apm_config)
-    : DebugDumpGenerator(ResourcePath("near32_stereo", "pcm"),
-                         32000,
-                         2,
-                         ResourcePath("far32_stereo", "pcm"),
-                         32000,
-                         2,
-                         config,
-                         TempFilename(OutputPath(), "debug_aec")) {
-  apm_->ApplyConfig(apm_config);
-}
-
-DebugDumpGenerator::~DebugDumpGenerator() {
-  remove(dump_file_name_.c_str());
-}
-
-void DebugDumpGenerator::SetInputRate(int rate_hz) {
-  input_audio_.set_output_rate_hz(rate_hz);
-  input_config_.set_sample_rate_hz(rate_hz);
-  MaybeResetBuffer(&input_, input_config_);
-}
-
-void DebugDumpGenerator::ForceInputMono(bool mono) {
-  const int channels = mono ? 1 : input_file_channels_;
-  input_config_.set_num_channels(channels);
-  MaybeResetBuffer(&input_, input_config_);
-}
-
-void DebugDumpGenerator::SetReverseRate(int rate_hz) {
-  reverse_audio_.set_output_rate_hz(rate_hz);
-  reverse_config_.set_sample_rate_hz(rate_hz);
-  MaybeResetBuffer(&reverse_, reverse_config_);
-}
-
-void DebugDumpGenerator::ForceReverseMono(bool mono) {
-  const int channels = mono ? 1 : reverse_file_channels_;
-  reverse_config_.set_num_channels(channels);
-  MaybeResetBuffer(&reverse_, reverse_config_);
-}
-
-void DebugDumpGenerator::SetOutputRate(int rate_hz) {
-  output_config_.set_sample_rate_hz(rate_hz);
-  MaybeResetBuffer(&output_, output_config_);
-}
-
-void DebugDumpGenerator::SetOutputChannels(int channels) {
-  output_config_.set_num_channels(channels);
-  MaybeResetBuffer(&output_, output_config_);
-}
-
-void DebugDumpGenerator::StartRecording() {
-  apm_->AttachAecDump(
-      AecDumpFactory::Create(dump_file_name_.c_str(), -1, &worker_queue_));
-}
-
-void DebugDumpGenerator::Process(size_t num_blocks) {
-  for (size_t i = 0; i < num_blocks; ++i) {
-    ReadAndDeinterleave(&reverse_audio_, reverse_file_channels_,
-                        reverse_config_, reverse_->channels());
-    ReadAndDeinterleave(&input_audio_, input_file_channels_, input_config_,
-                        input_->channels());
-    RTC_CHECK_EQ(AudioProcessing::kNoError, apm_->set_stream_delay_ms(100));
-    apm_->set_stream_key_pressed(i % 10 == 9);
-    RTC_CHECK_EQ(AudioProcessing::kNoError,
-                 apm_->ProcessStream(input_->channels(), input_config_,
-                                     output_config_, output_->channels()));
-
-    RTC_CHECK_EQ(AudioProcessing::kNoError,
-                 apm_->ProcessReverseStream(reverse_->channels(),
-                                            reverse_config_,
-                                            reverse_config_,
-                                            reverse_->channels()));
-  }
-}
-
-void DebugDumpGenerator::StopRecording() {
-  apm_->DetachAecDump();
-}
-
-void DebugDumpGenerator::ReadAndDeinterleave(ResampleInputAudioFile* audio,
-                                             int channels,
-                                             const StreamConfig& config,
-                                             float* const* buffer) {
-  const size_t num_frames = config.num_frames();
-  const int out_channels = config.num_channels();
-
-  std::vector<int16_t> signal(channels * num_frames);
-
-  audio->Read(num_frames * channels, &signal[0]);
-
-  // We only allow reducing number of channels by discarding some channels.
-  RTC_CHECK_LE(out_channels, channels);
-  for (int channel = 0; channel < out_channels; ++channel) {
-    for (size_t i = 0; i < num_frames; ++i) {
-      buffer[channel][i] = S16ToFloat(signal[i * channels + channel]);
-    }
-  }
-}
-
-}  // namespace
-
-class DebugDumpTest : public ::testing::Test {
- public:
-  // VerifyDebugDump replays a debug dump using APM and verifies that the result
-  // is bit-exact-identical to the output channel in the dump. This is only
-  // guaranteed if the debug dump is started on the first frame.
-  void VerifyDebugDump(const std::string& in_filename);
-
- private:
-  DebugDumpReplayer debug_dump_replayer_;
-};
-
-void DebugDumpTest::VerifyDebugDump(const std::string& in_filename) {
-  ASSERT_TRUE(debug_dump_replayer_.SetDumpFile(in_filename));
-
-  while (const rtc::Optional<audioproc::Event> event =
-      debug_dump_replayer_.GetNextEvent()) {
-    debug_dump_replayer_.RunNextEvent();
-    if (event->type() == audioproc::Event::STREAM) {
-      const audioproc::Stream* msg = &event->stream();
-      const StreamConfig output_config = debug_dump_replayer_.GetOutputConfig();
-      const ChannelBuffer<float>* output = debug_dump_replayer_.GetOutput();
-      // Check that output of APM is bit-exact to the output in the dump.
-      ASSERT_EQ(output_config.num_channels(),
-                static_cast<size_t>(msg->output_channel_size()));
-      ASSERT_EQ(output_config.num_frames() * sizeof(float),
-                msg->output_channel(0).size());
-      for (int i = 0; i < msg->output_channel_size(); ++i) {
-        ASSERT_EQ(0, memcmp(output->channels()[i],
-                            msg->output_channel(i).data(),
-                            msg->output_channel(i).size()));
-      }
-    }
-  }
-}
-
-TEST_F(DebugDumpTest, SimpleCase) {
-  Config config;
-  DebugDumpGenerator generator(config, AudioProcessing::Config());
-  generator.StartRecording();
-  generator.Process(100);
-  generator.StopRecording();
-  VerifyDebugDump(generator.dump_file_name());
-}
-
-TEST_F(DebugDumpTest, ChangeInputFormat) {
-  Config config;
-  DebugDumpGenerator generator(config, AudioProcessing::Config());
-
-  generator.StartRecording();
-  generator.Process(100);
-  generator.SetInputRate(48000);
-
-  generator.ForceInputMono(true);
-  // Number of output channel should not be larger than that of input. APM will
-  // fail otherwise.
-  generator.SetOutputChannels(1);
-
-  generator.Process(100);
-  generator.StopRecording();
-  VerifyDebugDump(generator.dump_file_name());
-}
-
-TEST_F(DebugDumpTest, ChangeReverseFormat) {
-  Config config;
-  DebugDumpGenerator generator(config, AudioProcessing::Config());
-  generator.StartRecording();
-  generator.Process(100);
-  generator.SetReverseRate(48000);
-  generator.ForceReverseMono(true);
-  generator.Process(100);
-  generator.StopRecording();
-  VerifyDebugDump(generator.dump_file_name());
-}
-
-TEST_F(DebugDumpTest, ChangeOutputFormat) {
-  Config config;
-  DebugDumpGenerator generator(config, AudioProcessing::Config());
-  generator.StartRecording();
-  generator.Process(100);
-  generator.SetOutputRate(48000);
-  generator.SetOutputChannels(1);
-  generator.Process(100);
-  generator.StopRecording();
-  VerifyDebugDump(generator.dump_file_name());
-}
-
-TEST_F(DebugDumpTest, ToggleAec) {
-  Config config;
-  DebugDumpGenerator generator(config, AudioProcessing::Config());
-  generator.StartRecording();
-  generator.Process(100);
-
-  EchoCancellation* aec = generator.apm()->echo_cancellation();
-  EXPECT_EQ(AudioProcessing::kNoError, aec->Enable(!aec->is_enabled()));
-
-  generator.Process(100);
-  generator.StopRecording();
-  VerifyDebugDump(generator.dump_file_name());
-}
-
-TEST_F(DebugDumpTest, ToggleDelayAgnosticAec) {
-  Config config;
-  config.Set<DelayAgnostic>(new DelayAgnostic(true));
-  DebugDumpGenerator generator(config, AudioProcessing::Config());
-  generator.StartRecording();
-  generator.Process(100);
-
-  EchoCancellation* aec = generator.apm()->echo_cancellation();
-  EXPECT_EQ(AudioProcessing::kNoError, aec->Enable(!aec->is_enabled()));
-
-  generator.Process(100);
-  generator.StopRecording();
-  VerifyDebugDump(generator.dump_file_name());
-}
-
-TEST_F(DebugDumpTest, VerifyRefinedAdaptiveFilterExperimentalString) {
-  Config config;
-  config.Set<RefinedAdaptiveFilter>(new RefinedAdaptiveFilter(true));
-  DebugDumpGenerator generator(config, AudioProcessing::Config());
-  generator.StartRecording();
-  generator.Process(100);
-  generator.StopRecording();
-
-  DebugDumpReplayer debug_dump_replayer_;
-
-  ASSERT_TRUE(debug_dump_replayer_.SetDumpFile(generator.dump_file_name()));
-
-  while (const rtc::Optional<audioproc::Event> event =
-             debug_dump_replayer_.GetNextEvent()) {
-    debug_dump_replayer_.RunNextEvent();
-    if (event->type() == audioproc::Event::CONFIG) {
-      const audioproc::Config* msg = &event->config();
-      ASSERT_TRUE(msg->has_experiments_description());
-      EXPECT_PRED_FORMAT2(testing::IsSubstring, "RefinedAdaptiveFilter",
-                          msg->experiments_description().c_str());
-    }
-  }
-}
-
-TEST_F(DebugDumpTest, VerifyCombinedExperimentalStringInclusive) {
-  Config config;
-  AudioProcessing::Config apm_config;
-  config.Set<RefinedAdaptiveFilter>(new RefinedAdaptiveFilter(true));
-  // Arbitrarily set clipping gain to 17, which will never be the default.
-  config.Set<ExperimentalAgc>(new ExperimentalAgc(true, 0, 17));
-  apm_config.echo_canceller3.enabled = true;
-  DebugDumpGenerator generator(config, apm_config);
-  generator.StartRecording();
-  generator.Process(100);
-  generator.StopRecording();
-
-  DebugDumpReplayer debug_dump_replayer_;
-
-  ASSERT_TRUE(debug_dump_replayer_.SetDumpFile(generator.dump_file_name()));
-
-  while (const rtc::Optional<audioproc::Event> event =
-             debug_dump_replayer_.GetNextEvent()) {
-    debug_dump_replayer_.RunNextEvent();
-    if (event->type() == audioproc::Event::CONFIG) {
-      const audioproc::Config* msg = &event->config();
-      ASSERT_TRUE(msg->has_experiments_description());
-      EXPECT_PRED_FORMAT2(testing::IsSubstring, "RefinedAdaptiveFilter",
-                          msg->experiments_description().c_str());
-      EXPECT_PRED_FORMAT2(testing::IsSubstring, "EchoCanceller3",
-                          msg->experiments_description().c_str());
-      EXPECT_PRED_FORMAT2(testing::IsSubstring, "AgcClippingLevelExperiment",
-                          msg->experiments_description().c_str());
-    }
-  }
-}
-
-TEST_F(DebugDumpTest, VerifyCombinedExperimentalStringExclusive) {
-  Config config;
-  config.Set<RefinedAdaptiveFilter>(new RefinedAdaptiveFilter(true));
-  DebugDumpGenerator generator(config, AudioProcessing::Config());
-  generator.StartRecording();
-  generator.Process(100);
-  generator.StopRecording();
-
-  DebugDumpReplayer debug_dump_replayer_;
-
-  ASSERT_TRUE(debug_dump_replayer_.SetDumpFile(generator.dump_file_name()));
-
-  while (const rtc::Optional<audioproc::Event> event =
-             debug_dump_replayer_.GetNextEvent()) {
-    debug_dump_replayer_.RunNextEvent();
-    if (event->type() == audioproc::Event::CONFIG) {
-      const audioproc::Config* msg = &event->config();
-      ASSERT_TRUE(msg->has_experiments_description());
-      EXPECT_PRED_FORMAT2(testing::IsSubstring, "RefinedAdaptiveFilter",
-                          msg->experiments_description().c_str());
-      EXPECT_PRED_FORMAT2(testing::IsNotSubstring, "AEC3",
-                          msg->experiments_description().c_str());
-      EXPECT_PRED_FORMAT2(testing::IsNotSubstring, "AgcClippingLevelExperiment",
-                          msg->experiments_description().c_str());
-    }
-  }
-}
-
-TEST_F(DebugDumpTest, VerifyAec3ExperimentalString) {
-  Config config;
-  AudioProcessing::Config apm_config;
-  apm_config.echo_canceller3.enabled = true;
-  DebugDumpGenerator generator(config, apm_config);
-  generator.StartRecording();
-  generator.Process(100);
-  generator.StopRecording();
-
-  DebugDumpReplayer debug_dump_replayer_;
-
-  ASSERT_TRUE(debug_dump_replayer_.SetDumpFile(generator.dump_file_name()));
-
-  while (const rtc::Optional<audioproc::Event> event =
-             debug_dump_replayer_.GetNextEvent()) {
-    debug_dump_replayer_.RunNextEvent();
-    if (event->type() == audioproc::Event::CONFIG) {
-      const audioproc::Config* msg = &event->config();
-      ASSERT_TRUE(msg->has_experiments_description());
-      EXPECT_PRED_FORMAT2(testing::IsSubstring, "EchoCanceller3",
-                          msg->experiments_description().c_str());
-    }
-  }
-}
-
-TEST_F(DebugDumpTest, VerifyLevelControllerExperimentalString) {
-  Config config;
-  AudioProcessing::Config apm_config;
-  apm_config.level_controller.enabled = true;
-  DebugDumpGenerator generator(config, apm_config);
-  generator.StartRecording();
-  generator.Process(100);
-  generator.StopRecording();
-
-  DebugDumpReplayer debug_dump_replayer_;
-
-  ASSERT_TRUE(debug_dump_replayer_.SetDumpFile(generator.dump_file_name()));
-
-  while (const rtc::Optional<audioproc::Event> event =
-             debug_dump_replayer_.GetNextEvent()) {
-    debug_dump_replayer_.RunNextEvent();
-    if (event->type() == audioproc::Event::CONFIG) {
-      const audioproc::Config* msg = &event->config();
-      ASSERT_TRUE(msg->has_experiments_description());
-      EXPECT_PRED_FORMAT2(testing::IsSubstring, "LevelController",
-                          msg->experiments_description().c_str());
-    }
-  }
-}
-
-TEST_F(DebugDumpTest, VerifyAgcClippingLevelExperimentalString) {
-  Config config;
-  // Arbitrarily set clipping gain to 17, which will never be the default.
-  config.Set<ExperimentalAgc>(new ExperimentalAgc(true, 0, 17));
-  DebugDumpGenerator generator(config, AudioProcessing::Config());
-  generator.StartRecording();
-  generator.Process(100);
-  generator.StopRecording();
-
-  DebugDumpReplayer debug_dump_replayer_;
-
-  ASSERT_TRUE(debug_dump_replayer_.SetDumpFile(generator.dump_file_name()));
-
-  while (const rtc::Optional<audioproc::Event> event =
-             debug_dump_replayer_.GetNextEvent()) {
-    debug_dump_replayer_.RunNextEvent();
-    if (event->type() == audioproc::Event::CONFIG) {
-      const audioproc::Config* msg = &event->config();
-      ASSERT_TRUE(msg->has_experiments_description());
-      EXPECT_PRED_FORMAT2(testing::IsSubstring, "AgcClippingLevelExperiment",
-                          msg->experiments_description().c_str());
-    }
-  }
-}
-
-TEST_F(DebugDumpTest, VerifyEmptyExperimentalString) {
-  Config config;
-  DebugDumpGenerator generator(config, AudioProcessing::Config());
-  generator.StartRecording();
-  generator.Process(100);
-  generator.StopRecording();
-
-  DebugDumpReplayer debug_dump_replayer_;
-
-  ASSERT_TRUE(debug_dump_replayer_.SetDumpFile(generator.dump_file_name()));
-
-  while (const rtc::Optional<audioproc::Event> event =
-             debug_dump_replayer_.GetNextEvent()) {
-    debug_dump_replayer_.RunNextEvent();
-    if (event->type() == audioproc::Event::CONFIG) {
-      const audioproc::Config* msg = &event->config();
-      ASSERT_TRUE(msg->has_experiments_description());
-      EXPECT_EQ(0u, msg->experiments_description().size());
-    }
-  }
-}
-
-TEST_F(DebugDumpTest, ToggleAecLevel) {
-  Config config;
-  DebugDumpGenerator generator(config, AudioProcessing::Config());
-  EchoCancellation* aec = generator.apm()->echo_cancellation();
-  EXPECT_EQ(AudioProcessing::kNoError, aec->Enable(true));
-  EXPECT_EQ(AudioProcessing::kNoError,
-            aec->set_suppression_level(EchoCancellation::kLowSuppression));
-  generator.StartRecording();
-  generator.Process(100);
-
-  EXPECT_EQ(AudioProcessing::kNoError,
-            aec->set_suppression_level(EchoCancellation::kHighSuppression));
-  generator.Process(100);
-  generator.StopRecording();
-  VerifyDebugDump(generator.dump_file_name());
-}
-
-// AGC is not supported on Android or iOS.
-#if defined(WEBRTC_ANDROID) || defined(WEBRTC_IOS)
-#define MAYBE_ToggleAgc DISABLED_ToggleAgc
-#else
-#define MAYBE_ToggleAgc ToggleAgc
-#endif
-TEST_F(DebugDumpTest, MAYBE_ToggleAgc) {
-  Config config;
-  DebugDumpGenerator generator(config, AudioProcessing::Config());
-  generator.StartRecording();
-  generator.Process(100);
-
-  GainControl* agc = generator.apm()->gain_control();
-  EXPECT_EQ(AudioProcessing::kNoError, agc->Enable(!agc->is_enabled()));
-
-  generator.Process(100);
-  generator.StopRecording();
-  VerifyDebugDump(generator.dump_file_name());
-}
-
-TEST_F(DebugDumpTest, ToggleNs) {
-  Config config;
-  DebugDumpGenerator generator(config, AudioProcessing::Config());
-  generator.StartRecording();
-  generator.Process(100);
-
-  NoiseSuppression* ns = generator.apm()->noise_suppression();
-  EXPECT_EQ(AudioProcessing::kNoError, ns->Enable(!ns->is_enabled()));
-
-  generator.Process(100);
-  generator.StopRecording();
-  VerifyDebugDump(generator.dump_file_name());
-}
-
-TEST_F(DebugDumpTest, TransientSuppressionOn) {
-  Config config;
-  config.Set<ExperimentalNs>(new ExperimentalNs(true));
-  DebugDumpGenerator generator(config, AudioProcessing::Config());
-  generator.StartRecording();
-  generator.Process(100);
-  generator.StopRecording();
-  VerifyDebugDump(generator.dump_file_name());
-}
-
-}  // namespace test
-}  // namespace webrtc
diff --git a/modules/audio_processing/test/echo_canceller_test_tools.cc b/modules/audio_processing/test/echo_canceller_test_tools.cc
deleted file mode 100644
index b3cacf8..0000000
--- a/modules/audio_processing/test/echo_canceller_test_tools.cc
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- *  Copyright (c) 2017 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_processing/test/echo_canceller_test_tools.h"
-
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-
-void RandomizeSampleVector(Random* random_generator, rtc::ArrayView<float> v) {
-  for (auto& v_k : v) {
-    v_k = 2 * 32767.f * random_generator->Rand<float>() - 32767.f;
-  }
-}
-
-template <typename T>
-void DelayBuffer<T>::Delay(rtc::ArrayView<const T> x,
-                           rtc::ArrayView<T> x_delayed) {
-  RTC_DCHECK_EQ(x.size(), x_delayed.size());
-  if (buffer_.empty()) {
-    std::copy(x.begin(), x.end(), x_delayed.begin());
-  } else {
-    for (size_t k = 0; k < x.size(); ++k) {
-      x_delayed[k] = buffer_[next_insert_index_];
-      buffer_[next_insert_index_] = x[k];
-      next_insert_index_ = (next_insert_index_ + 1) % buffer_.size();
-    }
-  }
-}
-
-template class DelayBuffer<float>;
-template class DelayBuffer<int>;
-}  // namespace webrtc
diff --git a/modules/audio_processing/test/echo_canceller_test_tools.h b/modules/audio_processing/test/echo_canceller_test_tools.h
deleted file mode 100644
index 1acfeac..0000000
--- a/modules/audio_processing/test/echo_canceller_test_tools.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- *  Copyright (c) 2017 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_PROCESSING_TEST_ECHO_CANCELLER_TEST_TOOLS_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_TEST_ECHO_CANCELLER_TEST_TOOLS_H_
-
-#include <algorithm>
-#include <vector>
-
-#include "webrtc/api/array_view.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/random.h"
-
-namespace webrtc {
-
-// Randomizes the elements in a vector with values -32767.f:32767.f.
-void RandomizeSampleVector(Random* random_generator, rtc::ArrayView<float> v);
-
-// Class for delaying a signal a fixed number of samples.
-template <typename T>
-class DelayBuffer {
- public:
-  explicit DelayBuffer(size_t delay) : buffer_(delay) {}
-  ~DelayBuffer() = default;
-
-  // Produces a delayed signal copy of x.
-  void Delay(rtc::ArrayView<const T> x, rtc::ArrayView<T> x_delayed);
-
- private:
-  std::vector<T> buffer_;
-  size_t next_insert_index_ = 0;
-  RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(DelayBuffer);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_TEST_ECHO_CANCELLER_TEST_TOOLS_H_
diff --git a/modules/audio_processing/test/echo_canceller_test_tools_unittest.cc b/modules/audio_processing/test/echo_canceller_test_tools_unittest.cc
deleted file mode 100644
index 0f28327..0000000
--- a/modules/audio_processing/test/echo_canceller_test_tools_unittest.cc
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- *  Copyright (c) 2017 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_processing/test/echo_canceller_test_tools.h"
-
-#include <vector>
-
-#include "webrtc/api/array_view.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/random.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-TEST(EchoCancellerTestTools, FloatDelayBuffer) {
-  constexpr size_t kDelay = 10;
-  DelayBuffer<float> delay_buffer(kDelay);
-  std::vector<float> v(1000, 0.f);
-  for (size_t k = 0; k < v.size(); ++k) {
-    v[k] = k;
-  }
-  std::vector<float> v_delayed = v;
-  constexpr size_t kBlockSize = 50;
-  for (size_t k = 0; k < rtc::CheckedDivExact(v.size(), kBlockSize); ++k) {
-    delay_buffer.Delay(
-        rtc::ArrayView<const float>(&v[k * kBlockSize], kBlockSize),
-        rtc::ArrayView<float>(&v_delayed[k * kBlockSize], kBlockSize));
-  }
-  for (size_t k = kDelay; k < v.size(); ++k) {
-    EXPECT_EQ(v[k - kDelay], v_delayed[k]);
-  }
-}
-
-TEST(EchoCancellerTestTools, IntDelayBuffer) {
-  constexpr size_t kDelay = 10;
-  DelayBuffer<int> delay_buffer(kDelay);
-  std::vector<int> v(1000, 0);
-  for (size_t k = 0; k < v.size(); ++k) {
-    v[k] = k;
-  }
-  std::vector<int> v_delayed = v;
-  const size_t kBlockSize = 50;
-  for (size_t k = 0; k < rtc::CheckedDivExact(v.size(), kBlockSize); ++k) {
-    delay_buffer.Delay(
-        rtc::ArrayView<const int>(&v[k * kBlockSize], kBlockSize),
-        rtc::ArrayView<int>(&v_delayed[k * kBlockSize], kBlockSize));
-  }
-  for (size_t k = kDelay; k < v.size(); ++k) {
-    EXPECT_EQ(v[k - kDelay], v_delayed[k]);
-  }
-}
-
-TEST(EchoCancellerTestTools, RandomizeSampleVector) {
-  Random random_generator(42U);
-  std::vector<float> v(50, 0.f);
-  std::vector<float> v_ref = v;
-  RandomizeSampleVector(&random_generator, v);
-  EXPECT_NE(v, v_ref);
-  v_ref = v;
-  RandomizeSampleVector(&random_generator, v);
-  EXPECT_NE(v, v_ref);
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/test/performance_timer.cc b/modules/audio_processing/test/performance_timer.cc
deleted file mode 100644
index 1e9c68c..0000000
--- a/modules/audio_processing/test/performance_timer.cc
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- *  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_processing/test/performance_timer.h"
-
-#include <math.h>
-
-#include <numeric>
-
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-namespace test {
-
-PerformanceTimer::PerformanceTimer(int num_frames_to_process)
-    : clock_(webrtc::Clock::GetRealTimeClock()) {
-  timestamps_us_.reserve(num_frames_to_process);
-}
-
-PerformanceTimer::~PerformanceTimer() = default;
-
-void PerformanceTimer::StartTimer() {
-  start_timestamp_us_ = rtc::Optional<int64_t>(clock_->TimeInMicroseconds());
-}
-
-void PerformanceTimer::StopTimer() {
-  RTC_DCHECK(start_timestamp_us_);
-  timestamps_us_.push_back(clock_->TimeInMicroseconds() - *start_timestamp_us_);
-}
-
-double PerformanceTimer::GetDurationAverage() const {
-  return GetDurationAverage(0);
-}
-
-double PerformanceTimer::GetDurationStandardDeviation() const {
-  return GetDurationStandardDeviation(0);
-}
-
-double PerformanceTimer::GetDurationAverage(
-    size_t number_of_warmup_samples) const {
-  RTC_DCHECK_GT(timestamps_us_.size(), number_of_warmup_samples);
-  const size_t number_of_samples =
-      timestamps_us_.size() - number_of_warmup_samples;
-  return static_cast<double>(
-             std::accumulate(timestamps_us_.begin() + number_of_warmup_samples,
-                             timestamps_us_.end(), static_cast<int64_t>(0))) /
-         number_of_samples;
-}
-
-double PerformanceTimer::GetDurationStandardDeviation(
-    size_t number_of_warmup_samples) const {
-  RTC_DCHECK_GT(timestamps_us_.size(), number_of_warmup_samples);
-  const size_t number_of_samples =
-      timestamps_us_.size() - number_of_warmup_samples;
-  RTC_DCHECK_GT(number_of_samples, 0);
-  double average_duration = GetDurationAverage(number_of_warmup_samples);
-
-  double variance = std::accumulate(
-      timestamps_us_.begin() + number_of_warmup_samples, timestamps_us_.end(),
-      0.0, [average_duration](const double& a, const int64_t& b) {
-        return a + (b - average_duration) * (b - average_duration);
-      });
-
-  return sqrt(variance / number_of_samples);
-}
-
-}  // namespace test
-}  // namespace webrtc
diff --git a/modules/audio_processing/test/performance_timer.h b/modules/audio_processing/test/performance_timer.h
deleted file mode 100644
index 9377f4a..0000000
--- a/modules/audio_processing/test/performance_timer.h
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- *  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_PROCESSING_TEST_PERFORMANCE_TIMER_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_TEST_PERFORMANCE_TIMER_H_
-
-#include <vector>
-
-#include "webrtc/api/optional.h"
-#include "webrtc/system_wrappers/include/clock.h"
-
-namespace webrtc {
-namespace test {
-
-class PerformanceTimer {
- public:
-  explicit PerformanceTimer(int num_frames_to_process);
-  ~PerformanceTimer();
-
-  void StartTimer();
-  void StopTimer();
-
-  double GetDurationAverage() const;
-  double GetDurationStandardDeviation() const;
-
-  // These methods are the same as those above, but they ignore the first
-  // |number_of_warmup_samples| measurements.
-  double GetDurationAverage(size_t number_of_warmup_samples) const;
-  double GetDurationStandardDeviation(size_t number_of_warmup_samples) const;
-
- private:
-  webrtc::Clock* clock_;
-  rtc::Optional<int64_t> start_timestamp_us_;
-  std::vector<int64_t> timestamps_us_;
-};
-
-}  // namespace test
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_TEST_PERFORMANCE_TIMER_H_
diff --git a/modules/audio_processing/test/protobuf_utils.cc b/modules/audio_processing/test/protobuf_utils.cc
deleted file mode 100644
index cb8adf9..0000000
--- a/modules/audio_processing/test/protobuf_utils.cc
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- *  Copyright (c) 2015 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_processing/test/protobuf_utils.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-size_t ReadMessageBytesFromFile(FILE* file, std::unique_ptr<uint8_t[]>* bytes) {
-  // The "wire format" for the size is little-endian. Assume we're running on
-  // a little-endian machine.
-#ifndef WEBRTC_ARCH_LITTLE_ENDIAN
-#error "Need to convert messsage from little-endian."
-#endif
-  int32_t size = 0;
-  if (fread(&size, sizeof(size), 1, file) != 1)
-    return 0;
-  if (size <= 0)
-    return 0;
-
-  bytes->reset(new uint8_t[size]);
-  return fread(bytes->get(), sizeof((*bytes)[0]), size, file);
-}
-
-// Returns true on success, false on error or end-of-file.
-bool ReadMessageFromFile(FILE* file, MessageLite* msg) {
-  std::unique_ptr<uint8_t[]> bytes;
-  size_t size = ReadMessageBytesFromFile(file, &bytes);
-  if (!size)
-    return false;
-
-  msg->Clear();
-  return msg->ParseFromArray(bytes.get(), size);
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/test/protobuf_utils.h b/modules/audio_processing/test/protobuf_utils.h
deleted file mode 100644
index 13ae0cf..0000000
--- a/modules/audio_processing/test/protobuf_utils.h
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- *  Copyright (c) 2015 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_PROCESSING_TEST_PROTOBUF_UTILS_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_TEST_PROTOBUF_UTILS_H_
-
-#include <memory>
-
-#include "webrtc/rtc_base/ignore_wundef.h"
-#include "webrtc/rtc_base/protobuf_utils.h"
-
-RTC_PUSH_IGNORING_WUNDEF()
-#include "webrtc/modules/audio_processing/debug.pb.h"
-RTC_POP_IGNORING_WUNDEF()
-
-namespace webrtc {
-
-// Allocates new memory in the unique_ptr to fit the raw message and returns the
-// number of bytes read.
-size_t ReadMessageBytesFromFile(FILE* file, std::unique_ptr<uint8_t[]>* bytes);
-
-// Returns true on success, false on error or end-of-file.
-bool ReadMessageFromFile(FILE* file, MessageLite* msg);
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_TEST_PROTOBUF_UTILS_H_
diff --git a/modules/audio_processing/test/py_quality_assessment/BUILD.gn b/modules/audio_processing/test/py_quality_assessment/BUILD.gn
deleted file mode 100644
index cf39d72..0000000
--- a/modules/audio_processing/test/py_quality_assessment/BUILD.gn
+++ /dev/null
@@ -1,143 +0,0 @@
-# Copyright (c) 2017 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.
-
-import("../../../../webrtc.gni")
-
-group("py_quality_assessment") {
-  testonly = true
-  deps = [
-    ":scripts",
-    ":unit_tests",
-  ]
-}
-
-copy("scripts") {
-  testonly = true
-  sources = [
-    "README.md",
-    "apm_quality_assessment.py",
-    "apm_quality_assessment.sh",
-    "apm_quality_assessment_export.py",
-    "apm_quality_assessment_gencfgs.py",
-    "apm_quality_assessment_optimize.py",
-  ]
-  outputs = [
-    "$root_build_dir/py_quality_assessment/{{source_file_part}}",
-  ]
-  deps = [
-    ":apm_configs",
-    ":lib",
-    ":output",
-    "../..:audioproc_f",
-    "../../../../../resources/audio_processing/test/py_quality_assessment:probing_signals",
-  ]
-}
-
-copy("apm_configs") {
-  testonly = true
-  sources = [
-    "apm_configs/default.json",
-  ]
-  visibility = [ ":*" ]  # Only targets in this file can depend on this.
-  outputs = [
-    "$root_build_dir/py_quality_assessment/apm_configs/{{source_file_part}}",
-  ]
-}  # apm_configs
-
-copy("lib") {
-  testonly = true
-  sources = [
-    "quality_assessment/__init__.py",
-    "quality_assessment/audioproc_wrapper.py",
-    "quality_assessment/collect_data.py",
-    "quality_assessment/data_access.py",
-    "quality_assessment/echo_path_simulation.py",
-    "quality_assessment/echo_path_simulation_factory.py",
-    "quality_assessment/eval_scores.py",
-    "quality_assessment/eval_scores_factory.py",
-    "quality_assessment/evaluation.py",
-    "quality_assessment/exceptions.py",
-    "quality_assessment/export.py",
-    "quality_assessment/input_mixer.py",
-    "quality_assessment/input_signal_creator.py",
-    "quality_assessment/results.css",
-    "quality_assessment/results.js",
-    "quality_assessment/signal_processing.py",
-    "quality_assessment/simulation.py",
-    "quality_assessment/test_data_generation.py",
-    "quality_assessment/test_data_generation_factory.py",
-  ]
-  visibility = [ ":*" ]  # Only targets in this file can depend on this.
-  outputs = [
-    "$root_build_dir/py_quality_assessment/quality_assessment/{{source_file_part}}",
-  ]
-  deps = [
-    "../../../../../resources/audio_processing/test/py_quality_assessment:noise_tracks",
-  ]
-}
-
-copy("output") {
-  testonly = true
-  sources = [
-    "output/README.md",
-  ]
-  visibility = [ ":*" ]  # Only targets in this file can depend on this.
-  outputs = [
-    "$root_build_dir/py_quality_assessment/output/{{source_file_part}}",
-  ]
-}
-
-group("unit_tests") {
-  testonly = true
-  visibility = [ ":*" ]  # Only targets in this file can depend on this.
-  deps = [
-    ":fake_polqa",
-    ":lib_unit_tests",
-    ":scripts_unit_tests",
-  ]
-}
-
-rtc_executable("fake_polqa") {
-  testonly = true
-  sources = [
-    "quality_assessment/fake_polqa.cc",
-  ]
-  visibility = [ ":*" ]  # Only targets in this file can depend on this.
-  output_name = "py_quality_assessment/quality_assessment/fake_polqa"
-  deps = [
-    "../../../..:webrtc_common",
-    "../../../../rtc_base:rtc_base_approved",
-  ]
-}
-
-copy("lib_unit_tests") {
-  testonly = true
-  sources = [
-    "quality_assessment/echo_path_simulation_unittest.py",
-    "quality_assessment/eval_scores_unittest.py",
-    "quality_assessment/input_mixer_unittest.py",
-    "quality_assessment/signal_processing_unittest.py",
-    "quality_assessment/simulation_unittest.py",
-    "quality_assessment/test_data_generation_unittest.py",
-  ]
-  visibility = [ ":*" ]  # Only targets in this file can depend on this.
-  outputs = [
-    "$root_build_dir/py_quality_assessment/quality_assessment/{{source_file_part}}",
-  ]
-}
-
-copy("scripts_unit_tests") {
-  testonly = true
-  sources = [
-    "apm_quality_assessment_unittest.py",
-  ]
-  visibility = [ ":*" ]  # Only targets in this file can depend on this.
-  outputs = [
-    "$root_build_dir/py_quality_assessment/{{source_file_part}}",
-  ]
-}
diff --git a/modules/audio_processing/test/py_quality_assessment/OWNERS b/modules/audio_processing/test/py_quality_assessment/OWNERS
deleted file mode 100644
index 4dc254d..0000000
--- a/modules/audio_processing/test/py_quality_assessment/OWNERS
+++ /dev/null
@@ -1,8 +0,0 @@
-aleloi@webrtc.org
-alessiob@webrtc.org
-henrik.lundin@webrtc.org
-ivoc@webrtc.org
-peah@webrtc.org
-
-per-file *.gn=*
-per-file *.gni=*
diff --git a/modules/audio_processing/test/py_quality_assessment/README.md b/modules/audio_processing/test/py_quality_assessment/README.md
deleted file mode 100644
index e19a780..0000000
--- a/modules/audio_processing/test/py_quality_assessment/README.md
+++ /dev/null
@@ -1,109 +0,0 @@
-# APM Quality Assessment tool
-
-Python wrapper of `audioproc_f` with which quality assessment can be
-automatized. The tool allows to simulate different noise conditions, input
-signals, APM configurations and it computes different scores.
-Once the scores are computed, the results can be easily exported to an HTML page
-which allows to listen to the APM input and output signals and also the
-reference one used for evaluation.
-
-## Dependencies
-
- - OS: Linux
- - Python 2.7
- - Python libraries: numpy, scipy, pydub (0.17.0+), pandas (0.20.1+)
- - It is recommended that a dedicated Python environment is used
-   - install `virtualenv`
-   - `$ sudo apt-get install python-virtualenv`
-   - setup a new Python environment (e.g., `my_env`)
-   - `$ cd ~ && virtualenv my_env`
-   - activate the new Python environment
-   - `$ source ~/my_env/bin/activate`
-   - add dependcies via `pip`
-   - `(my_env)$ pip install numpy pydub scipy pandas`
- - PolqaOem64 (see http://www.polqa.info/)
-    - Tested with POLQA Library v1.180 / P863 v2.400
- - Aachen Impulse Response (AIR) Database
-    - Download https://www2.iks.rwth-aachen.de/air/air_database_release_1_4.zip
- - Input probing signals and noise tracks (you can make your own dataset - *1)
-
-## Build
-
- - Compile WebRTC
- - Go to `out/Default/py_quality_assessment` and check that
-   `apm_quality_assessment.py` exists
-
-## First time setup
-
- - Deploy PolqaOem64 and set the `POLQA_PATH` environment variable
-   - e.g., `$ export POLQA_PATH=/var/opt/PolqaOem64`
- - Deploy the AIR Database and set the `AECHEN_IR_DATABASE_PATH` environment
- variable
-   - e.g., `$ export AECHEN_IR_DATABASE_PATH=/var/opt/AIR_1_4`
- - Deploy probing signal tracks into
-   - `out/Default/py_quality_assessment/probing_signals` (*1)
- - Deploy noise tracks into
-   - `out/Default/py_quality_assessment/noise_tracks` (*1, *2)
-
-(*1) You can use custom files as long as they are mono tracks sampled at 48kHz
-encoded in the 16 bit signed format (it is recommended that the tracks are
-converted and exported with Audacity).
-
-(*2) Adapt `EnvironmentalNoiseTestDataGenerator._NOISE_TRACKS` accordingly in
-`out/Default/py_quality_assessment/quality_assessment/test_data_generation.py`.
-
-## Usage (scores computation)
-
- - Go to `out/Default/py_quality_assessment`
- - Check the `apm_quality_assessment.sh` as an example script to parallelize the
-   experiments
- - Adjust the script according to your preferences (e.g., output path)
- - Run `apm_quality_assessment.sh`
- - The script will end by opening the browser and showing ALL the computed
-   scores
-
-## Usage (export reports)
-
-Showing all the results at once can be confusing. You therefore may want to
-export separate reports. In this case, you can use the
-`apm_quality_assessment_export.py` script as follows:
-
- - Set `--output_dir, -o` to the same value used in `apm_quality_assessment.sh`
- - Use regular expressions to select/filter out scores by
-    - APM configurations: `--config_names, -c`
-    - capture signals: `--capture_names, -i`
-    - render signals: `--render_names, -r`
-    - echo simulator: `--echo_simulator_names, -e`
-    - test data generators: `--test_data_generators, -t`
-    - scores: `--eval_scores, -s`
- - Assign a suffix to the report name using `-f <suffix>`
-
-For instance:
-
-```
-$ ./apm_quality_assessment_export.py \
-  -o output/ \
-  -c "(^default$)|(.*AE.*)" \
-  -t \(white_noise\) \
-  -s \(polqa\) \
-  -f echo
-```
-
-## Troubleshooting
-
-The input wav file must be:
-  - sampled at a sample rate that is a multiple of 100 (required by POLQA)
-  - in the 16 bit format (required by `audioproc_f`)
-  - encoded in the Microsoft WAV signed 16 bit PCM format (Audacity default
-    when exporting)
-
-Depending on the license, the POLQA tool may take “breaks” as a way to limit the
-throughput. When this happens, the APM Quality Assessment tool is slowed down.
-For more details about this limitation, check Section 10.9.1 in the POLQA manual
-v.1.18.
-
-In case of issues with the POLQA score computation, check
-`py_quality_assessment/eval_scores.py` and adapt
-`PolqaScore._parse_output_file()`.
-The code can be also fixed directly into the build directory (namely,
-`out/Default/py_quality_assessment/eval_scores.py`).
diff --git a/modules/audio_processing/test/py_quality_assessment/apm_configs/default.json b/modules/audio_processing/test/py_quality_assessment/apm_configs/default.json
deleted file mode 100644
index 5c3277b..0000000
--- a/modules/audio_processing/test/py_quality_assessment/apm_configs/default.json
+++ /dev/null
@@ -1 +0,0 @@
-{"-all_default": null}
diff --git a/modules/audio_processing/test/py_quality_assessment/apm_quality_assessment.py b/modules/audio_processing/test/py_quality_assessment/apm_quality_assessment.py
deleted file mode 100755
index ee08ff7..0000000
--- a/modules/audio_processing/test/py_quality_assessment/apm_quality_assessment.py
+++ /dev/null
@@ -1,133 +0,0 @@
-#!/usr/bin/env python
-# Copyright (c) 2017 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.
-
-"""Perform APM module quality assessment on one or more input files using one or
-   more audioproc_f configuration files and one or more test data generators.
-
-Usage: apm_quality_assessment.py -i audio1.wav [audio2.wav ...]
-                                 -c cfg1.json [cfg2.json ...]
-                                 -n white [echo ...]
-                                 -e audio_level [polqa ...]
-                                 -o /path/to/output
-"""
-
-import argparse
-import logging
-import os
-import sys
-
-import quality_assessment.audioproc_wrapper as audioproc_wrapper
-import quality_assessment.echo_path_simulation as echo_path_simulation
-import quality_assessment.eval_scores as eval_scores
-import quality_assessment.evaluation as evaluation
-import quality_assessment.test_data_generation as test_data_generation
-import quality_assessment.simulation as simulation
-
-_ECHO_PATH_SIMULATOR_NAMES = (
-    echo_path_simulation.EchoPathSimulator.REGISTERED_CLASSES)
-_TEST_DATA_GENERATOR_CLASSES = (
-    test_data_generation.TestDataGenerator.REGISTERED_CLASSES)
-_TEST_DATA_GENERATORS_NAMES = _TEST_DATA_GENERATOR_CLASSES.keys()
-_EVAL_SCORE_WORKER_CLASSES = eval_scores.EvaluationScore.REGISTERED_CLASSES
-_EVAL_SCORE_WORKER_NAMES = _EVAL_SCORE_WORKER_CLASSES.keys()
-
-_DEFAULT_CONFIG_FILE = 'apm_configs/default.json'
-
-_POLQA_BIN_NAME = 'PolqaOem64'
-
-
-def _InstanceArgumentsParser():
-  """Arguments parser factory.
-  """
-  parser = argparse.ArgumentParser(description=(
-      'Perform APM module quality assessment on one or more input files using '
-      'one or more audioproc_f configuration files and one or more '
-      'test data generators.'))
-
-  parser.add_argument('-c', '--config_files', nargs='+', required=False,
-                      help=('path to the configuration files defining the '
-                            'arguments with which the audioproc_f tool is '
-                            'called'),
-                      default=[_DEFAULT_CONFIG_FILE])
-
-  parser.add_argument('-i', '--capture_input_files', nargs='+', required=True,
-                      help='path to the capture input wav files (one or more)')
-
-  parser.add_argument('-r', '--render_input_files', nargs='+', required=False,
-                      help=('path to the render input wav files; either '
-                            'omitted or one file for each file in '
-                            '--capture_input_files (files will be paired by '
-                            'index)'), default=None)
-
-  parser.add_argument('-p', '--echo_path_simulator', required=False,
-                      help=('custom echo path simulator name; required if '
-                            '--render_input_files is specified'),
-                      choices=_ECHO_PATH_SIMULATOR_NAMES,
-                      default=echo_path_simulation.NoEchoPathSimulator.NAME)
-
-  parser.add_argument('-t', '--test_data_generators', nargs='+', required=False,
-                      help='custom list of test data generators to use',
-                      choices=_TEST_DATA_GENERATORS_NAMES,
-                      default=_TEST_DATA_GENERATORS_NAMES)
-
-  parser.add_argument('-e', '--eval_scores', nargs='+', required=False,
-                      help='custom list of evaluation scores to use',
-                      choices=_EVAL_SCORE_WORKER_NAMES,
-                      default=_EVAL_SCORE_WORKER_NAMES)
-
-  parser.add_argument('-o', '--output_dir', required=False,
-                      help=('base path to the output directory in which the '
-                            'output wav files and the evaluation outcomes '
-                            'are saved'),
-                      default='output')
-
-  parser.add_argument('--polqa_path', required=True,
-                      help='path to the POLQA tool')
-
-  parser.add_argument('--air_db_path', required=True,
-                      help='path to the Aechen IR database')
-
-  return parser
-
-
-def main():
-  # TODO(alessiob): level = logging.INFO once debugged.
-  logging.basicConfig(level=logging.DEBUG)
-
-  parser = _InstanceArgumentsParser()
-  args = parser.parse_args()
-  if args.capture_input_files and args.render_input_files and (
-      len(args.capture_input_files) != len(args.render_input_files)):
-    parser.error('--render_input_files and --capture_input_files must be lists '
-                 'having the same length')
-    sys.exit(1)
-  if args.render_input_files and not args.echo_path_simulator:
-    parser.error('when --render_input_files is set, --echo_path_simulator is '
-                 'also required')
-    sys.exit(1)
-
-  simulator = simulation.ApmModuleSimulator(
-      aechen_ir_database_path=args.air_db_path,
-      polqa_tool_bin_path=os.path.join(args.polqa_path, _POLQA_BIN_NAME),
-      ap_wrapper=audioproc_wrapper.AudioProcWrapper(),
-      evaluator=evaluation.ApmModuleEvaluator())
-  simulator.Run(
-      config_filepaths=args.config_files,
-      capture_input_filepaths=args.capture_input_files,
-      render_input_filepaths=args.render_input_files,
-      echo_path_simulator_name=args.echo_path_simulator,
-      test_data_generator_names=args.test_data_generators,
-      eval_score_names=args.eval_scores,
-      output_dir=args.output_dir)
-
-  sys.exit(0)
-
-
-if __name__ == '__main__':
-  main()
diff --git a/modules/audio_processing/test/py_quality_assessment/apm_quality_assessment.sh b/modules/audio_processing/test/py_quality_assessment/apm_quality_assessment.sh
deleted file mode 100755
index aa563ee..0000000
--- a/modules/audio_processing/test/py_quality_assessment/apm_quality_assessment.sh
+++ /dev/null
@@ -1,91 +0,0 @@
-#!/bin/bash
-# Copyright (c) 2017 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.
-
-# Path to the POLQA tool.
-if [ -z ${POLQA_PATH} ]; then  # Check if defined.
-  # Default location.
-  export POLQA_PATH='/var/opt/PolqaOem64'
-fi
-if [ -d "${POLQA_PATH}" ]; then
-  echo "POLQA found in ${POLQA_PATH}"
-else
-  echo "POLQA not found in ${POLQA_PATH}"
-  exit 1
-fi
-
-# Path to the Aechen IR database.
-if [ -z ${AECHEN_IR_DATABASE_PATH} ]; then  # Check if defined.
-  # Default location.
-  export AECHEN_IR_DATABASE_PATH='/var/opt/AIR_1_4'
-fi
-if [ -d "${AECHEN_IR_DATABASE_PATH}" ]; then
-  echo "AIR database found in ${AECHEN_IR_DATABASE_PATH}"
-else
-  echo "AIR database not found in ${AECHEN_IR_DATABASE_PATH}"
-  exit 1
-fi
-
-# Customize probing signals, test data generators and scores if needed.
-CAPTURE_SIGNALS=(probing_signals/*.wav)
-TEST_DATA_GENERATORS=( \
-    "identity" \
-    "white_noise" \
-    # "environmental_noise" \
-    # "reverberation" \
-)
-SCORES=( \
-    # "polqa" \
-    "audio_level_peak" \
-    "audio_level_mean" \
-)
-OUTPUT_PATH=output
-
-# Generate standard APM config files.
-chmod +x apm_quality_assessment_gencfgs.py
-./apm_quality_assessment_gencfgs.py
-
-# Customize APM configurations if needed.
-APM_CONFIGS=(apm_configs/*.json)
-
-# Add output path if missing.
-if [ ! -d ${OUTPUT_PATH} ]; then
-  mkdir ${OUTPUT_PATH}
-fi
-
-# Start one process for each "probing signal"-"test data source" pair.
-chmod +x apm_quality_assessment.py
-for capture_signal_filepath in "${CAPTURE_SIGNALS[@]}" ; do
-  probing_signal_name="$(basename $capture_signal_filepath)"
-  probing_signal_name="${probing_signal_name%.*}"
-  for test_data_gen_name in "${TEST_DATA_GENERATORS[@]}" ; do
-    LOG_FILE="${OUTPUT_PATH}/apm_qa-${probing_signal_name}-"`
-             `"${test_data_gen_name}.log"
-    echo "Starting ${probing_signal_name} ${test_data_gen_name} "`
-         `"(see ${LOG_FILE})"
-    ./apm_quality_assessment.py \
-        --polqa_path ${POLQA_PATH}\
-        --air_db_path ${AECHEN_IR_DATABASE_PATH}\
-        -i ${capture_signal_filepath} \
-        -o ${OUTPUT_PATH} \
-        -t ${test_data_gen_name} \
-        -c "${APM_CONFIGS[@]}" \
-        -e "${SCORES[@]}" > $LOG_FILE 2>&1 &
-  done
-done
-
-# Join Python processes running apm_quality_assessment.py.
-wait
-
-# Export results.
-chmod +x ./apm_quality_assessment_export.py
-./apm_quality_assessment_export.py -o ${OUTPUT_PATH}
-
-# Show results in the browser.
-RESULTS_FILE="$(realpath ${OUTPUT_PATH}/results.html)"
-sensible-browser "file://${RESULTS_FILE}" > /dev/null 2>&1 &
diff --git a/modules/audio_processing/test/py_quality_assessment/apm_quality_assessment_export.py b/modules/audio_processing/test/py_quality_assessment/apm_quality_assessment_export.py
deleted file mode 100755
index 2d5b7cb..0000000
--- a/modules/audio_processing/test/py_quality_assessment/apm_quality_assessment_export.py
+++ /dev/null
@@ -1,60 +0,0 @@
-#!/usr/bin/env python
-# Copyright (c) 2017 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.
-
-"""Export the scores computed by the apm_quality_assessment.py script into an
-   HTML file.
-"""
-
-import logging
-import os
-import sys
-
-import apm_quality_assessment_collect_data as collect_data
-import quality_assessment.export as export
-
-
-
-def _BuildOutputFilename(filename_suffix):
-  """Builds the filename for the exported file.
-
-  Args:
-    filename_suffix: suffix for the output file name.
-
-  Returns:
-    A string.
-  """
-  if filename_suffix is None:
-    return 'results.html'
-  return 'results-{}.html'.format(filename_suffix)
-
-def main():
-  # Init.
-  logging.basicConfig(level=logging.DEBUG)  # TODO(alessio): INFO once debugged.
-  parser = collect_data.InstanceArgumentsParser()
-  parser.description = ('Exports pre-computed APM module quality assessment '
-                        'results into HTML tables')
-  args = parser.parse_args()
-
-  # Get the scores.
-  src_path = collect_data.ConstructSrcPath(args)
-  logging.debug(src_path)
-  scores_data_frame = collect_data.FindScores(src_path, args)
-
-  # Export.
-  output_filepath = os.path.join(args.output_dir, _BuildOutputFilename(
-      args.filename_suffix))
-  exporter = export.HtmlExport(output_filepath)
-  exporter.Export(scores_data_frame)
-
-  logging.info('output file successfully written in %s', output_filepath)
-  sys.exit(0)
-
-
-if __name__ == '__main__':
-  main()
diff --git a/modules/audio_processing/test/py_quality_assessment/apm_quality_assessment_gencfgs.py b/modules/audio_processing/test/py_quality_assessment/apm_quality_assessment_gencfgs.py
deleted file mode 100755
index 338c38c..0000000
--- a/modules/audio_processing/test/py_quality_assessment/apm_quality_assessment_gencfgs.py
+++ /dev/null
@@ -1,100 +0,0 @@
-#!/usr/bin/env python
-# Copyright (c) 2017 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.
-
-"""Generate .json files with which the APM module can be tested using the
-   apm_quality_assessment.py script.
-"""
-
-import logging
-import os
-
-import quality_assessment.data_access as data_access
-
-OUTPUT_PATH = os.path.abspath('apm_configs')
-
-
-def _GenerateDefaultOverridden(config_override):
-  """Generates one or more APM overriden configurations.
-
-  For each item in config_override, it overrides the default configuration and
-  writes a new APM configuration file.
-
-  The default settings are loaded via "-all_default".
-  Check "src/webrtc/modules/audio_processing/test/audioproc_float.cc" and search
-  for "if (FLAG_all_default) {".
-
-  For instance, in 55eb6d621489730084927868fed195d3645a9ec9 the default is this:
-  settings.use_aec = rtc::Optional<bool>(true);
-  settings.use_aecm = rtc::Optional<bool>(false);
-  settings.use_agc = rtc::Optional<bool>(true);
-  settings.use_bf = rtc::Optional<bool>(false);
-  settings.use_ed = rtc::Optional<bool>(false);
-  settings.use_hpf = rtc::Optional<bool>(true);
-  settings.use_ie = rtc::Optional<bool>(false);
-  settings.use_le = rtc::Optional<bool>(true);
-  settings.use_ns = rtc::Optional<bool>(true);
-  settings.use_ts = rtc::Optional<bool>(true);
-  settings.use_vad = rtc::Optional<bool>(true);
-
-  Args:
-    config_override: dict of APM configuration file names as keys; the values
-                     are dict instances encoding the audioproc_f flags.
-  """
-  for config_filename in config_override:
-    config = config_override[config_filename]
-    config['-all_default'] = None
-
-    config_filepath = os.path.join(OUTPUT_PATH, 'default-{}.json'.format(
-        config_filename))
-    logging.debug('config file <%s> | %s', config_filepath, config)
-
-    data_access.AudioProcConfigFile.Save(config_filepath, config)
-    logging.info('config file created: <%s>', config_filepath)
-
-
-def _GenerateAllDefaultButOne():
-  """Disables the flags enabled by default one-by-one.
-  """
-  config_sets = {
-      'no_AEC': {'-aec': 0,},
-      'no_AGC': {'-agc': 0,},
-      'no_HP_filter': {'-hpf': 0,},
-      'no_level_estimator': {'-le': 0,},
-      'no_noise_suppressor': {'-ns': 0,},
-      'no_transient_suppressor': {'-ts': 0,},
-      'no_vad': {'-vad': 0,},
-  }
-  _GenerateDefaultOverridden(config_sets)
-
-
-def _GenerateAllDefaultPlusOne():
-  """Enables the flags disabled by default one-by-one.
-  """
-  config_sets = {
-      'with_AECM': {'-aec': 0, '-aecm': 1,},  # AEC and AECM are exclusive.
-      'with_AGC_limiter': {'-agc_limiter': 1,},
-      'with_AEC_delay_agnostic': {'-delay_agnostic': 1,},
-      'with_drift_compensation': {'-drift_compensation': 1,},
-      'with_residual_echo_detector': {'-ed': 1,},
-      'with_AEC_extended_filter': {'-extended_filter': 1,},
-      'with_intelligibility_enhancer': {'-ie': 1,},
-      'with_LC': {'-lc': 1,},
-      'with_refined_adaptive_filter': {'-refined_adaptive_filter': 1,},
-  }
-  _GenerateDefaultOverridden(config_sets)
-
-
-def main():
-  logging.basicConfig(level=logging.INFO)
-  _GenerateAllDefaultPlusOne()
-  _GenerateAllDefaultButOne()
-
-
-if __name__ == '__main__':
-  main()
diff --git a/modules/audio_processing/test/py_quality_assessment/apm_quality_assessment_optimize.py b/modules/audio_processing/test/py_quality_assessment/apm_quality_assessment_optimize.py
deleted file mode 100644
index 7946fe2..0000000
--- a/modules/audio_processing/test/py_quality_assessment/apm_quality_assessment_optimize.py
+++ /dev/null
@@ -1,179 +0,0 @@
-#!/usr/bin/env python
-# Copyright (c) 2017 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.
-
-"""Finds the APM configuration that maximizes a provided metric by
-parsing the output generated apm_quality_assessment.py.
-"""
-
-from __future__ import division
-
-import collections
-import logging
-import os
-
-import quality_assessment.data_access as data_access
-import quality_assessment.collect_data as collect_data
-
-def _InstanceArgumentsParser():
-  """Arguments parser factory. Extends the arguments from 'collect_data'
-  with a few extra for selecting what parameters to optimize for.
-  """
-  parser = collect_data.InstanceArgumentsParser()
-  parser.description = (
-      'Rudimentary optimization of a function over different parameter'
-      'combinations.')
-
-  parser.add_argument('-n', '--config_dir', required=False,
-                      help=('path to the folder with the configuration files'),
-                      default='apm_configs')
-
-  parser.add_argument('-p', '--params', required=True, nargs='+',
-                      help=('parameters to parse from the config files in'
-                            'config_dir'))
-
-  parser.add_argument('-z', '--params_not_to_optimize', required=False,
-                      nargs='+', default=[],
-                      help=('parameters from `params` not to be optimized for'))
-
-  return parser
-
-
-def _ConfigurationAndScores(data_frame, params,
-                            params_not_to_optimize, config_dir):
-  """Returns a list of all configurations and scores.
-
-  Args:
-    data_frame: A pandas data frame with the scores and config name
-                returned by _FindScores.
-    params: The parameter names to parse from configs the config
-            directory
-
-    params_not_to_optimize: The parameter names which shouldn't affect
-                            the optimal parameter
-                            selection. E.g., fixed settings and not
-                            tunable parameters.
-
-    config_dir: Path to folder with config files.
-
-  Returns:
-    Dictionary of the form
-    {param_combination: [{params: {param1: value1, ...},
-                          scores: {score1: value1, ...}}]}.
-
-    The key `param_combination` runs over all parameter combinations
-    of the parameters in `params` and not in
-    `params_not_to_optimize`. A corresponding value is a list of all
-    param combinations for params in `params_not_to_optimize` and
-    their scores.
-  """
-  results = collections.defaultdict(list)
-  config_names = data_frame['apm_config'].drop_duplicates().values.tolist()
-  score_names = data_frame['eval_score_name'].drop_duplicates().values.tolist()
-
-  # Normalize the scores
-  normalization_constants = {}
-  for score_name in score_names:
-    scores = data_frame[data_frame.eval_score_name == score_name].score
-    normalization_constants[score_name] = max(scores)
-
-  params_to_optimize = [p for p in params if p not in params_not_to_optimize]
-  param_combination = collections.namedtuple("ParamCombination",
-                                            params_to_optimize)
-
-  for config_name in config_names:
-    config_json = data_access.AudioProcConfigFile.Load(
-        os.path.join(config_dir, config_name + ".json"))
-    scores = {}
-    data_cell = data_frame[data_frame.apm_config == config_name]
-    for score_name in score_names:
-      data_cell_scores = data_cell[data_cell.eval_score_name ==
-                                   score_name].score
-      scores[score_name] = sum(data_cell_scores) / len(data_cell_scores)
-      scores[score_name] /= normalization_constants[score_name]
-
-    result = {'scores': scores, 'params': {}}
-    config_optimize_params = {}
-    for param in params:
-      if param in params_to_optimize:
-        config_optimize_params[param] = config_json['-' + param]
-      else:
-        result['params'][param] = config_json['-' + param]
-
-    current_param_combination = param_combination( # pylint: disable=star-args
-        **config_optimize_params)
-    results[current_param_combination].append(result)
-  return results
-
-
-def _FindOptimalParameter(configs_and_scores, score_weighting):
-  """Finds the config producing the maximal score.
-
-  Args:
-    configs_and_scores: structure of the form returned by
-                        _ConfigurationAndScores
-
-    score_weighting: a function to weight together all score values of
-                     the form [{params: {param1: value1, ...}, scores:
-                                {score1: value1, ...}}] into a numeric
-                     value
-  Returns:
-    the config that has the largest values of |score_weighting| applied
-    to its scores.
-  """
-
-  min_score = float('+inf')
-  best_params = None
-  for config in configs_and_scores:
-    scores_and_params = configs_and_scores[config]
-    current_score = score_weighting(scores_and_params)
-    if current_score < min_score:
-      min_score = current_score
-      best_params = config
-      logging.debug("Score: %f", current_score)
-      logging.debug("Config: %s", str(config))
-  return best_params
-
-
-def _ExampleWeighting(scores_and_configs):
-  """Example argument to `_FindOptimalParameter`
-  Args:
-    scores_and_configs: a list of configs and scores, in the form
-                        described in _FindOptimalParameter
-  Returns:
-    numeric value, the sum of all scores
-  """
-  res = 0
-  for score_config in scores_and_configs:
-    res += sum(score_config['scores'].values())
-  return res
-
-
-def main():
-  # Init.
-  # TODO(alessiob): INFO once debugged.
-  logging.basicConfig(level=logging.DEBUG)
-  parser = _InstanceArgumentsParser()
-  args = parser.parse_args()
-
-  # Get the scores.
-  src_path = collect_data.ConstructSrcPath(args)
-  logging.debug('Src path <%s>', src_path)
-  scores_data_frame = collect_data.FindScores(src_path, args)
-  all_scores = _ConfigurationAndScores(scores_data_frame,
-                                       args.params,
-                                       args.params_not_to_optimize,
-                                       args.config_dir)
-
-  opt_param = _FindOptimalParameter(all_scores, _ExampleWeighting)
-
-  logging.info('Optimal parameter combination: <%s>', opt_param)
-  logging.info('It\'s score values: <%s>', all_scores[opt_param])
-
-if __name__ == "__main__":
-  main()
diff --git a/modules/audio_processing/test/py_quality_assessment/apm_quality_assessment_unittest.py b/modules/audio_processing/test/py_quality_assessment/apm_quality_assessment_unittest.py
deleted file mode 100644
index f5240f8..0000000
--- a/modules/audio_processing/test/py_quality_assessment/apm_quality_assessment_unittest.py
+++ /dev/null
@@ -1,33 +0,0 @@
-# Copyright (c) 2017 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.
-
-"""Unit tests for the apm_quality_assessment module.
-"""
-
-import os
-import sys
-import unittest
-
-SRC = os.path.abspath(os.path.join(
-    os.path.dirname((__file__)), os.pardir, os.pardir, os.pardir))
-sys.path.append(os.path.join(SRC, 'third_party', 'pymock'))
-
-import mock
-
-import apm_quality_assessment
-
-class TestSimulationScript(unittest.TestCase):
-  """Unit tests for the apm_quality_assessment module.
-  """
-
-  def testMain(self):
-    # Exit with error code if no arguments are passed.
-    with self.assertRaises(SystemExit) as cm, mock.patch.object(
-        sys, 'argv', ['apm_quality_assessment.py']):
-      apm_quality_assessment.main()
-    self.assertGreater(cm.exception.code, 0)
diff --git a/modules/audio_processing/test/py_quality_assessment/output/README.md b/modules/audio_processing/test/py_quality_assessment/output/README.md
deleted file mode 100644
index 66e2a1c..0000000
--- a/modules/audio_processing/test/py_quality_assessment/output/README.md
+++ /dev/null
@@ -1 +0,0 @@
-You can use this folder for the output generated by the apm_quality_assessment scripts.
diff --git a/modules/audio_processing/test/py_quality_assessment/quality_assessment/__init__.py b/modules/audio_processing/test/py_quality_assessment/quality_assessment/__init__.py
deleted file mode 100644
index b870dfa..0000000
--- a/modules/audio_processing/test/py_quality_assessment/quality_assessment/__init__.py
+++ /dev/null
@@ -1,7 +0,0 @@
-# Copyright (c) 2017 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.
diff --git a/modules/audio_processing/test/py_quality_assessment/quality_assessment/apm_configs/default.json b/modules/audio_processing/test/py_quality_assessment/quality_assessment/apm_configs/default.json
deleted file mode 100644
index 5c3277b..0000000
--- a/modules/audio_processing/test/py_quality_assessment/quality_assessment/apm_configs/default.json
+++ /dev/null
@@ -1 +0,0 @@
-{"-all_default": null}
diff --git a/modules/audio_processing/test/py_quality_assessment/quality_assessment/audioproc_wrapper.py b/modules/audio_processing/test/py_quality_assessment/quality_assessment/audioproc_wrapper.py
deleted file mode 100644
index d0dd51c..0000000
--- a/modules/audio_processing/test/py_quality_assessment/quality_assessment/audioproc_wrapper.py
+++ /dev/null
@@ -1,90 +0,0 @@
-# Copyright (c) 2017 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.
-
-"""Class implementing a wrapper for audioproc_f.
-"""
-
-import cProfile
-import logging
-import os
-import subprocess
-
-from . import data_access
-from . import exceptions
-
-
-class AudioProcWrapper(object):
-  """Wrapper for audioproc_f.
-  """
-
-  OUTPUT_FILENAME = 'output.wav'
-  _AUDIOPROC_F_BIN_PATH = os.path.abspath(os.path.join(
-      os.pardir, 'audioproc_f'))
-
-  def __init__(self):
-    self._config = None
-    self._output_signal_filepath = None
-
-    # Profiler instance to measure audioproc_f running time.
-    self._profiler = cProfile.Profile()
-
-  @property
-  def output_filepath(self):
-    return self._output_signal_filepath
-
-  def Run(self, config_filepath, capture_input_filepath, output_path,
-          render_input_filepath=None):
-    """Run audioproc_f.
-
-    Args:
-      config_filepath: path to the configuration file specifing the arguments
-                       for audioproc_f.
-      capture_input_filepath: path to the capture audio track input file (aka
-                              forward or near-end).
-      output_path: path of the audio track output file.
-      render_input_filepath: path to the render audio track input file (aka
-                             reverse or far-end).
-    """
-    # Init.
-    self._output_signal_filepath = os.path.join(
-        output_path, self.OUTPUT_FILENAME)
-    profiling_stats_filepath = os.path.join(output_path, 'profiling.stats')
-
-    # Skip if the output has already been generated.
-    if os.path.exists(self._output_signal_filepath) and os.path.exists(
-        profiling_stats_filepath):
-      return
-
-    # Load configuration.
-    self._config = data_access.AudioProcConfigFile.Load(config_filepath)
-
-    # Set remaining parametrs.
-    if not os.path.exists(capture_input_filepath):
-      raise exceptions.FileNotFoundError('cannot find capture input file')
-    self._config['-i'] = capture_input_filepath
-    self._config['-o'] = self._output_signal_filepath
-    if render_input_filepath is not None:
-      if not os.path.exists(render_input_filepath):
-        raise exceptions.FileNotFoundError('cannot find render input file')
-      self._config['-ri'] = render_input_filepath
-
-    # Build arguments list.
-    args = [self._AUDIOPROC_F_BIN_PATH]
-    for param_name in self._config:
-      args.append(param_name)
-      if self._config[param_name] is not None:
-        args.append(str(self._config[param_name]))
-    logging.debug(' '.join(args))
-
-    # Run.
-    self._profiler.enable()
-    subprocess.call(args)
-    self._profiler.disable()
-
-    # Save profiling stats.
-    self._profiler.dump_stats(profiling_stats_filepath)
diff --git a/modules/audio_processing/test/py_quality_assessment/quality_assessment/collect_data.py b/modules/audio_processing/test/py_quality_assessment/quality_assessment/collect_data.py
deleted file mode 100644
index bcad7a4..0000000
--- a/modules/audio_processing/test/py_quality_assessment/quality_assessment/collect_data.py
+++ /dev/null
@@ -1,244 +0,0 @@
-# Copyright (c) 2017 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.
-
-"""Imports a filtered subset of the scores and configurations computed
-by apm_quality_assessment.py into a pandas data frame.
-"""
-
-import argparse
-import glob
-import logging
-import os
-import re
-import sys
-
-try:
-  import pandas as pd
-except ImportError:
-  logging.critical('Cannot import the third-party Python package pandas')
-  sys.exit(1)
-
-from . import data_access as data_access
-from . import simulation as sim
-
-# Compiled regular expressions used to extract score descriptors.
-RE_CONFIG_NAME = re.compile(
-    sim.ApmModuleSimulator.GetPrefixApmConfig() + r'(.+)')
-RE_CAPTURE_NAME = re.compile(
-    sim.ApmModuleSimulator.GetPrefixCapture() + r'(.+)')
-RE_RENDER_NAME = re.compile(
-    sim.ApmModuleSimulator.GetPrefixRender() + r'(.+)')
-RE_ECHO_SIM_NAME = re.compile(
-    sim.ApmModuleSimulator.GetPrefixEchoSimulator() + r'(.+)')
-RE_TEST_DATA_GEN_NAME = re.compile(
-    sim.ApmModuleSimulator.GetPrefixTestDataGenerator() + r'(.+)')
-RE_TEST_DATA_GEN_PARAMS = re.compile(
-    sim.ApmModuleSimulator.GetPrefixTestDataGeneratorParameters() + r'(.+)')
-RE_SCORE_NAME = re.compile(
-    sim.ApmModuleSimulator.GetPrefixScore() + r'(.+)(\..+)')
-
-def InstanceArgumentsParser():
-  """Arguments parser factory.
-  """
-  parser = argparse.ArgumentParser(description=(
-      'Override this description in a user script by changing'
-      ' `parser.description` of the returned parser.'))
-
-  parser.add_argument('-o', '--output_dir', required=True,
-                      help=('the same base path used with the '
-                            'apm_quality_assessment tool'))
-
-  parser.add_argument('-f', '--filename_suffix',
-                      help=('suffix of the exported file'))
-
-  parser.add_argument('-c', '--config_names', type=re.compile,
-                      help=('regular expression to filter the APM configuration'
-                            ' names'))
-
-  parser.add_argument('-i', '--capture_names', type=re.compile,
-                      help=('regular expression to filter the capture signal '
-                            'names'))
-
-  parser.add_argument('-r', '--render_names', type=re.compile,
-                      help=('regular expression to filter the render signal '
-                            'names'))
-
-  parser.add_argument('-e', '--echo_simulator_names', type=re.compile,
-                      help=('regular expression to filter the echo simulator '
-                            'names'))
-
-  parser.add_argument('-t', '--test_data_generators', type=re.compile,
-                      help=('regular expression to filter the test data '
-                            'generator names'))
-
-  parser.add_argument('-s', '--eval_scores', type=re.compile,
-                      help=('regular expression to filter the evaluation score '
-                            'names'))
-
-  return parser
-
-
-def _GetScoreDescriptors(score_filepath):
-  """Extracts a score descriptor from the given score file path.
-
-  Args:
-    score_filepath: path to the score file.
-
-  Returns:
-    A tuple of strings (APM configuration name, capture audio track name,
-    render audio track name, echo simulator name, test data generator name,
-    test data generator parameters as string, evaluation score name).
-  """
-  fields = score_filepath.split(os.sep)[-7:]
-  extract_name = lambda index, reg_expr: (
-      reg_expr.match(fields[index]).groups(0)[0])
-  return (
-      extract_name(0, RE_CONFIG_NAME),
-      extract_name(1, RE_CAPTURE_NAME),
-      extract_name(2, RE_RENDER_NAME),
-      extract_name(3, RE_ECHO_SIM_NAME),
-      extract_name(4, RE_TEST_DATA_GEN_NAME),
-      extract_name(5, RE_TEST_DATA_GEN_PARAMS),
-      extract_name(6, RE_SCORE_NAME),
-  )
-
-
-def _ExcludeScore(config_name, capture_name, render_name, echo_simulator_name,
-                  test_data_gen_name, score_name, args):
-  """Decides whether excluding a score.
-
-  A set of optional regular expressions in args is used to determine if the
-  score should be excluded (depending on its |*_name| descriptors).
-
-  Args:
-    config_name: APM configuration name.
-    capture_name: capture audio track name.
-    render_name: render audio track name.
-    echo_simulator_name: echo simulator name.
-    test_data_gen_name: test data generator name.
-    score_name: evaluation score name.
-    args: parsed arguments.
-
-  Returns:
-    A boolean.
-  """
-  value_regexpr_pairs = [
-      (config_name, args.config_names),
-      (capture_name, args.capture_names),
-      (render_name, args.render_names),
-      (echo_simulator_name, args.echo_simulator_names),
-      (test_data_gen_name, args.test_data_generators),
-      (score_name, args.eval_scores),
-  ]
-
-  # Score accepted if each value matches the corresponding regular expression.
-  for value, regexpr in value_regexpr_pairs:
-    if regexpr is None:
-      continue
-    if not regexpr.match(value):
-      return True
-
-  return False
-
-
-def FindScores(src_path, args):
-  """Given a search path, find scores and return a DataFrame object.
-
-  Args:
-    src_path: Search path pattern.
-    args: parsed arguments.
-
-  Returns:
-    A DataFrame object.
-  """
-  # Get scores.
-  scores = []
-  for score_filepath in glob.iglob(src_path):
-    # Extract score descriptor fields from the path.
-    (config_name,
-     capture_name,
-     render_name,
-     echo_simulator_name,
-     test_data_gen_name,
-     test_data_gen_params,
-     score_name) = _GetScoreDescriptors(score_filepath)
-
-    # Ignore the score if required.
-    if _ExcludeScore(
-        config_name,
-        capture_name,
-        render_name,
-        echo_simulator_name,
-        test_data_gen_name,
-        score_name,
-        args):
-      logging.info(
-          'ignored score: %s %s %s %s %s %s',
-          config_name,
-          capture_name,
-          render_name,
-          echo_simulator_name,
-          test_data_gen_name,
-          score_name)
-      continue
-
-    # Read metadata and score.
-    metadata = data_access.Metadata.LoadAudioTestDataPaths(
-        os.path.split(score_filepath)[0])
-    score = data_access.ScoreFile.Load(score_filepath)
-
-    # Add a score with its descriptor fields.
-    scores.append((
-        metadata['clean_capture_input_filepath'],
-        metadata['echo_free_capture_filepath'],
-        metadata['echo_filepath'],
-        metadata['render_filepath'],
-        metadata['capture_filepath'],
-        metadata['apm_output_filepath'],
-        metadata['apm_reference_filepath'],
-        config_name,
-        capture_name,
-        render_name,
-        echo_simulator_name,
-        test_data_gen_name,
-        test_data_gen_params,
-        score_name,
-        score,
-    ))
-
-  return pd.DataFrame(
-      data=scores,
-      columns=(
-          'clean_capture_input_filepath',
-          'echo_free_capture_filepath',
-          'echo_filepath',
-          'render_filepath',
-          'capture_filepath',
-          'apm_output_filepath',
-          'apm_reference_filepath',
-          'apm_config',
-          'capture',
-          'render',
-          'echo_simulator',
-          'test_data_gen',
-          'test_data_gen_params',
-          'eval_score_name',
-          'score',
-      ))
-
-
-def ConstructSrcPath(args):
-  return os.path.join(
-      args.output_dir,
-      sim.ApmModuleSimulator.GetPrefixApmConfig() + '*',
-      sim.ApmModuleSimulator.GetPrefixCapture() + '*',
-      sim.ApmModuleSimulator.GetPrefixRender() + '*',
-      sim.ApmModuleSimulator.GetPrefixEchoSimulator() + '*',
-      sim.ApmModuleSimulator.GetPrefixTestDataGenerator() + '*',
-      sim.ApmModuleSimulator.GetPrefixTestDataGeneratorParameters() + '*',
-      sim.ApmModuleSimulator.GetPrefixScore() + '*')
diff --git a/modules/audio_processing/test/py_quality_assessment/quality_assessment/data_access.py b/modules/audio_processing/test/py_quality_assessment/quality_assessment/data_access.py
deleted file mode 100644
index 826a089..0000000
--- a/modules/audio_processing/test/py_quality_assessment/quality_assessment/data_access.py
+++ /dev/null
@@ -1,129 +0,0 @@
-# Copyright (c) 2017 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.
-
-"""Data access utility functions and classes.
-"""
-
-import json
-import os
-
-
-def MakeDirectory(path):
-  """Makes a directory recursively without rising exceptions if existing.
-
-  Args:
-    path: path to the directory to be created.
-  """
-  if os.path.exists(path):
-    return
-  os.makedirs(path)
-
-
-class Metadata(object):
-  """Data access class to save and load metadata.
-  """
-
-  def __init__(self):
-    pass
-
-  _AUDIO_TEST_DATA_FILENAME = 'audio_test_data.json'
-
-  @classmethod
-  def LoadAudioTestDataPaths(cls, metadata_path):
-    """Loads the input and the reference audio track paths.
-
-    Args:
-      metadata_path: path to the directory containing the metadata file.
-
-    Returns:
-      Tuple with the paths to the input and output audio tracks.
-    """
-    metadata_filepath = os.path.join(
-        metadata_path, cls._AUDIO_TEST_DATA_FILENAME)
-    with open(metadata_filepath) as f:
-      return json.load(f)
-
-  @classmethod
-  def SaveAudioTestDataPaths(cls, output_path, **filepaths):
-    """Saves the input and the reference audio track paths.
-
-    Args:
-      output_path: path to the directory containing the metadata file.
-
-    Keyword Args:
-      filepaths: collection of audio track file paths to save.
-    """
-    output_filepath = os.path.join(output_path, cls._AUDIO_TEST_DATA_FILENAME)
-    with open(output_filepath, 'w') as f:
-      json.dump(filepaths, f)
-
-
-class AudioProcConfigFile(object):
-  """Data access to load/save audioproc_f argument lists.
-
-  The arguments stored in the config files are used to control the APM flags.
-  """
-
-  def __init__(self):
-    pass
-
-  @classmethod
-  def Load(cls, filepath):
-    """Loads a configuration file for audioproc_f.
-
-    Args:
-      filepath: path to the configuration file.
-
-    Returns:
-      A dict containing the configuration.
-    """
-    with open(filepath) as f:
-      return json.load(f)
-
-  @classmethod
-  def Save(cls, filepath, config):
-    """Saves a configuration file for audioproc_f.
-
-    Args:
-      filepath: path to the configuration file.
-      config: a dict containing the configuration.
-    """
-    with open(filepath, 'w') as f:
-      json.dump(config, f)
-
-
-class ScoreFile(object):
-  """Data access class to save and load float scalar scores.
-  """
-
-  def __init__(self):
-    pass
-
-  @classmethod
-  def Load(cls, filepath):
-    """Loads a score from file.
-
-    Args:
-      filepath: path to the score file.
-
-    Returns:
-      A float encoding the score.
-    """
-    with open(filepath) as f:
-      return float(f.readline().strip())
-
-  @classmethod
-  def Save(cls, filepath, score):
-    """Saves a score into a file.
-
-    Args:
-      filepath: path to the score file.
-      score: float encoding the score.
-    """
-    with open(filepath, 'w') as f:
-      f.write('{0:f}\n'.format(score))
diff --git a/modules/audio_processing/test/py_quality_assessment/quality_assessment/echo_path_simulation.py b/modules/audio_processing/test/py_quality_assessment/quality_assessment/echo_path_simulation.py
deleted file mode 100644
index a162196..0000000
--- a/modules/audio_processing/test/py_quality_assessment/quality_assessment/echo_path_simulation.py
+++ /dev/null
@@ -1,136 +0,0 @@
-# Copyright (c) 2017 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.
-
-"""Echo path simulation module.
-"""
-
-import hashlib
-import os
-
-from . import signal_processing
-
-
-class EchoPathSimulator(object):
-  """Abstract class for the echo path simulators.
-
-  In general, an echo path simulator is a function of the render signal and
-  simulates the propagation of the latter into the microphone (e.g., due to
-  mechanical or electrical paths).
-  """
-
-  NAME = None
-  REGISTERED_CLASSES = {}
-
-  def __init__(self):
-    pass
-
-  def Simulate(self, output_path):
-    """Creates the echo signal and stores it in an audio file (abstract method).
-
-    Args:
-      output_path: Path in which any output can be saved.
-
-    Returns:
-      Path to the generated audio track file or None if no echo is present.
-    """
-    raise NotImplementedError()
-
-  @classmethod
-  def RegisterClass(cls, class_to_register):
-    """Registers an EchoPathSimulator implementation.
-
-    Decorator to automatically register the classes that extend
-    EchoPathSimulator.
-    Example usage:
-
-    @EchoPathSimulator.RegisterClass
-    class NoEchoPathSimulator(EchoPathSimulator):
-      pass
-    """
-    cls.REGISTERED_CLASSES[class_to_register.NAME] = class_to_register
-    return class_to_register
-
-
-@EchoPathSimulator.RegisterClass
-class NoEchoPathSimulator(EchoPathSimulator):
-  """Simulates absence of echo."""
-
-  NAME = 'noecho'
-
-  def __init__(self):
-    EchoPathSimulator.__init__(self)
-
-  def Simulate(self, output_path):
-    return None
-
-
-@EchoPathSimulator.RegisterClass
-class LinearEchoPathSimulator(EchoPathSimulator):
-  """Simulates linear echo path.
-
-  This class applies a given impulse response to the render input and then it
-  sums the signal to the capture input signal.
-  """
-
-  NAME = 'linear'
-
-  def __init__(self, render_input_filepath, impulse_response):
-    """
-    Args:
-      render_input_filepath: Render audio track file.
-      impulse_response: list or numpy vector of float values.
-    """
-    EchoPathSimulator.__init__(self)
-    self._render_input_filepath = render_input_filepath
-    self._impulse_response = impulse_response
-
-  def Simulate(self, output_path):
-    """Simulates linear echo path."""
-    # Form the file name with a hash of the impulse response.
-    impulse_response_hash = hashlib.sha256(
-        str(self._impulse_response).encode('utf-8', 'ignore')).hexdigest()
-    echo_filepath = os.path.join(output_path, 'linear_echo_{}.wav'.format(
-        impulse_response_hash))
-
-    # If the simulated echo audio track file does not exists, create it.
-    if not os.path.exists(echo_filepath):
-      render = signal_processing.SignalProcessingUtils.LoadWav(
-          self._render_input_filepath)
-      echo = signal_processing.SignalProcessingUtils.ApplyImpulseResponse(
-          render, self._impulse_response)
-      signal_processing.SignalProcessingUtils.SaveWav(echo_filepath, echo)
-
-    return echo_filepath
-
-
-@EchoPathSimulator.RegisterClass
-class RecordedEchoPathSimulator(EchoPathSimulator):
-  """Uses recorded echo.
-
-  This class uses the clean capture input file name to build the file name of
-  the corresponding recording containing echo (a predefined suffix is used).
-  Such a file is expected to be already existing.
-  """
-
-  NAME = 'recorded'
-
-  _FILE_NAME_SUFFIX = '_echo'
-
-  def __init__(self, render_input_filepath):
-    EchoPathSimulator.__init__(self)
-    self._render_input_filepath = render_input_filepath
-
-  def Simulate(self, output_path):
-    """Uses recorded echo path."""
-    path, file_name_ext = os.path.split(self._render_input_filepath)
-    file_name, file_ext = os.path.splitext(file_name_ext)
-    echo_filepath = os.path.join(path, '{}{}{}'.format(
-        file_name, self._FILE_NAME_SUFFIX, file_ext))
-    assert os.path.exists(echo_filepath), (
-           'cannot find the echo audio track file {}'.format(echo_filepath))
-    return echo_filepath
diff --git a/modules/audio_processing/test/py_quality_assessment/quality_assessment/echo_path_simulation_factory.py b/modules/audio_processing/test/py_quality_assessment/quality_assessment/echo_path_simulation_factory.py
deleted file mode 100644
index eeffd1d..0000000
--- a/modules/audio_processing/test/py_quality_assessment/quality_assessment/echo_path_simulation_factory.py
+++ /dev/null
@@ -1,48 +0,0 @@
-# Copyright (c) 2017 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.
-
-"""Echo path simulation factory module.
-"""
-
-import numpy as np
-
-from . import echo_path_simulation
-
-
-class EchoPathSimulatorFactory(object):
-
-  # TODO(alessiob): Replace 5 ms delay (at 48 kHz sample rate) with a more
-  # realistic impulse response.
-  _LINEAR_ECHO_IMPULSE_RESPONSE = np.array([0.0]*(5 * 48) + [0.15])
-
-  def __init__(self):
-    pass
-
-  @classmethod
-  def GetInstance(cls, echo_path_simulator_class, render_input_filepath):
-    """Creates an EchoPathSimulator instance given a class object.
-
-    Args:
-      echo_path_simulator_class: EchoPathSimulator class object (not an
-                                 instance).
-      render_input_filepath: Path to the render audio track file.
-
-    Returns:
-      An EchoPathSimulator instance.
-    """
-    assert render_input_filepath is not None or (
-        echo_path_simulator_class == echo_path_simulation.NoEchoPathSimulator)
-
-    if echo_path_simulator_class == echo_path_simulation.NoEchoPathSimulator:
-      return echo_path_simulation.NoEchoPathSimulator()
-    elif echo_path_simulator_class == (
-        echo_path_simulation.LinearEchoPathSimulator):
-      return echo_path_simulation.LinearEchoPathSimulator(
-          render_input_filepath, cls._LINEAR_ECHO_IMPULSE_RESPONSE)
-    else:
-      return echo_path_simulator_class(render_input_filepath)
diff --git a/modules/audio_processing/test/py_quality_assessment/quality_assessment/echo_path_simulation_unittest.py b/modules/audio_processing/test/py_quality_assessment/quality_assessment/echo_path_simulation_unittest.py
deleted file mode 100644
index d9ef2c6..0000000
--- a/modules/audio_processing/test/py_quality_assessment/quality_assessment/echo_path_simulation_unittest.py
+++ /dev/null
@@ -1,81 +0,0 @@
-# Copyright (c) 2017 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.
-
-"""Unit tests for the echo path simulation module.
-"""
-
-import shutil
-import os
-import tempfile
-import unittest
-
-import pydub
-
-from . import echo_path_simulation
-from . import echo_path_simulation_factory
-from . import signal_processing
-
-
-class TestEchoPathSimulators(unittest.TestCase):
-  """Unit tests for the eval_scores module.
-  """
-
-  def setUp(self):
-    """Creates temporary data."""
-    self._tmp_path = tempfile.mkdtemp()
-
-    # Create and save white noise.
-    silence = pydub.AudioSegment.silent(duration=1000, frame_rate=48000)
-    white_noise = signal_processing.SignalProcessingUtils.GenerateWhiteNoise(
-        silence)
-    self._audio_track_num_samples = (
-        signal_processing.SignalProcessingUtils.CountSamples(white_noise))
-    self._audio_track_filepath = os.path.join(self._tmp_path, 'white_noise.wav')
-    signal_processing.SignalProcessingUtils.SaveWav(
-        self._audio_track_filepath, white_noise)
-
-    # Make a copy the white noise audio track file; it will be used by
-    # echo_path_simulation.RecordedEchoPathSimulator.
-    shutil.copy(self._audio_track_filepath, os.path.join(
-        self._tmp_path, 'white_noise_echo.wav'))
-
-  def tearDown(self):
-    """Recursively deletes temporary folders."""
-    shutil.rmtree(self._tmp_path)
-
-  def testRegisteredClasses(self):
-    # Check that there is at least one registered echo path simulator.
-    registered_classes = (
-        echo_path_simulation.EchoPathSimulator.REGISTERED_CLASSES)
-    self.assertIsInstance(registered_classes, dict)
-    self.assertGreater(len(registered_classes), 0)
-
-    # Instance factory.
-    factory = echo_path_simulation_factory.EchoPathSimulatorFactory()
-
-    # Try each registered echo path simulator.
-    for echo_path_simulator_name in registered_classes:
-      simulator = factory.GetInstance(
-          echo_path_simulator_class=registered_classes[
-              echo_path_simulator_name],
-          render_input_filepath=self._audio_track_filepath)
-
-      echo_filepath = simulator.Simulate(self._tmp_path)
-      if echo_filepath is None:
-        self.assertEqual(echo_path_simulation.NoEchoPathSimulator.NAME,
-                         echo_path_simulator_name)
-        # No other tests in this case.
-        continue
-
-      # Check that the echo audio track file exists and its length is greater or
-      # equal to that of the render audio track.
-      self.assertTrue(os.path.exists(echo_filepath))
-      echo = signal_processing.SignalProcessingUtils.LoadWav(echo_filepath)
-      self.assertGreaterEqual(
-          signal_processing.SignalProcessingUtils.CountSamples(echo),
-          self._audio_track_num_samples)
diff --git a/modules/audio_processing/test/py_quality_assessment/quality_assessment/eval_scores.py b/modules/audio_processing/test/py_quality_assessment/quality_assessment/eval_scores.py
deleted file mode 100644
index 78d0c18..0000000
--- a/modules/audio_processing/test/py_quality_assessment/quality_assessment/eval_scores.py
+++ /dev/null
@@ -1,244 +0,0 @@
-# Copyright (c) 2017 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.
-
-"""Evaluation score abstract class and implementations.
-"""
-
-from __future__ import division
-import logging
-import os
-import re
-import subprocess
-
-from . import data_access
-from . import exceptions
-from . import signal_processing
-
-
-class EvaluationScore(object):
-
-  NAME = None
-  REGISTERED_CLASSES = {}
-
-  def __init__(self, score_filename_prefix):
-    self._score_filename_prefix = score_filename_prefix
-    self._reference_signal = None
-    self._reference_signal_filepath = None
-    self._tested_signal = None
-    self._tested_signal_filepath = None
-    self._output_filepath = None
-    self._score = None
-
-  @classmethod
-  def RegisterClass(cls, class_to_register):
-    """Registers an EvaluationScore implementation.
-
-    Decorator to automatically register the classes that extend EvaluationScore.
-    Example usage:
-
-    @EvaluationScore.RegisterClass
-    class AudioLevelScore(EvaluationScore):
-      pass
-    """
-    cls.REGISTERED_CLASSES[class_to_register.NAME] = class_to_register
-    return class_to_register
-
-  @property
-  def output_filepath(self):
-    return self._output_filepath
-
-  @property
-  def score(self):
-    return self._score
-
-  def SetReferenceSignalFilepath(self, filepath):
-    """ Sets the path to the audio track used as reference signal.
-
-    Args:
-      filepath: path to the reference audio track.
-    """
-    self._reference_signal_filepath = filepath
-
-  def SetTestedSignalFilepath(self, filepath):
-    """ Sets the path to the audio track used as test signal.
-
-    Args:
-      filepath: path to the test audio track.
-    """
-    self._tested_signal_filepath = filepath
-
-  def Run(self, output_path):
-    """Extracts the score for the set test data pair.
-
-    Args:
-      output_path: path to the directory where the output is written.
-    """
-    self._output_filepath = os.path.join(
-        output_path, self._score_filename_prefix + self.NAME + '.txt')
-    try:
-      # If the score has already been computed, load.
-      self._LoadScore()
-      logging.debug('score found and loaded')
-    except IOError:
-      # Compute the score.
-      logging.debug('score not found, compute')
-      self._Run(output_path)
-
-  def _Run(self, output_path):
-    # Abstract method.
-    raise NotImplementedError()
-
-  def _LoadReferenceSignal(self):
-    assert self._reference_signal_filepath is not None
-    self._reference_signal = signal_processing.SignalProcessingUtils.LoadWav(
-        self._reference_signal_filepath)
-
-  def _LoadTestedSignal(self):
-    assert self._tested_signal_filepath is not None
-    self._tested_signal = signal_processing.SignalProcessingUtils.LoadWav(
-        self._tested_signal_filepath)
-
-
-  def _LoadScore(self):
-    return data_access.ScoreFile.Load(self._output_filepath)
-
-  def _SaveScore(self):
-    return data_access.ScoreFile.Save(self._output_filepath, self._score)
-
-
-@EvaluationScore.RegisterClass
-class AudioLevelPeakScore(EvaluationScore):
-  """Peak audio level score.
-
-  Defined as the difference between the peak audio level of the tested and
-  the reference signals.
-
-  Unit: dB
-  Ideal: 0 dB
-  Worst case: +/-inf dB
-  """
-
-  NAME = 'audio_level_peak'
-
-  def __init__(self, score_filename_prefix):
-    EvaluationScore.__init__(self, score_filename_prefix)
-
-  def _Run(self, output_path):
-    self._LoadReferenceSignal()
-    self._LoadTestedSignal()
-    self._score = self._tested_signal.dBFS - self._reference_signal.dBFS
-    self._SaveScore()
-
-
-@EvaluationScore.RegisterClass
-class MeanAudioLevelScore(EvaluationScore):
-  """Mean audio level score.
-
-  Defined as the difference between the mean audio level of the tested and
-  the reference signals.
-
-  Unit: dB
-  Ideal: 0 dB
-  Worst case: +/-inf dB
-  """
-
-  NAME = 'audio_level_mean'
-
-  def __init__(self, score_filename_prefix):
-    EvaluationScore.__init__(self, score_filename_prefix)
-
-  def _Run(self, output_path):
-    self._LoadReferenceSignal()
-    self._LoadTestedSignal()
-
-    dbfs_diffs_sum = 0.0
-    seconds = min(len(self._tested_signal), len(self._reference_signal)) // 1000
-    for t in range(seconds):
-      t0 = t * seconds
-      t1 = t0 + seconds
-      dbfs_diffs_sum += (
-        self._tested_signal[t0:t1].dBFS - self._reference_signal[t0:t1].dBFS)
-    self._score = dbfs_diffs_sum / float(seconds)
-    self._SaveScore()
-
-
-@EvaluationScore.RegisterClass
-class PolqaScore(EvaluationScore):
-  """POLQA score.
-
-  See http://www.polqa.info/.
-
-  Unit: MOS
-  Ideal: 4.5
-  Worst case: 1.0
-  """
-
-  NAME = 'polqa'
-
-  def __init__(self, score_filename_prefix, polqa_bin_filepath):
-    EvaluationScore.__init__(self, score_filename_prefix)
-
-    # POLQA binary file path.
-    self._polqa_bin_filepath = polqa_bin_filepath
-    if not os.path.exists(self._polqa_bin_filepath):
-      logging.error('cannot find POLQA tool binary file')
-      raise exceptions.FileNotFoundError()
-
-    # Path to the POLQA directory with binary and license files.
-    self._polqa_tool_path, _ = os.path.split(self._polqa_bin_filepath)
-
-  def _Run(self, output_path):
-    polqa_out_filepath = os.path.join(output_path, 'polqa.out')
-    if os.path.exists(polqa_out_filepath):
-      os.unlink(polqa_out_filepath)
-
-    args = [
-        self._polqa_bin_filepath, '-t', '-q', '-Overwrite',
-        '-Ref', self._reference_signal_filepath,
-        '-Test', self._tested_signal_filepath,
-        '-LC', 'NB',
-        '-Out', polqa_out_filepath,
-    ]
-    logging.debug(' '.join(args))
-    subprocess.call(args, cwd=self._polqa_tool_path)
-
-    # Parse POLQA tool output and extract the score.
-    polqa_output = self._ParseOutputFile(polqa_out_filepath)
-    self._score = float(polqa_output['PolqaScore'])
-
-    self._SaveScore()
-
-  @classmethod
-  def _ParseOutputFile(cls, polqa_out_filepath):
-    """
-    Parses the POLQA tool output formatted as a table ('-t' option).
-
-    Args:
-      polqa_out_filepath: path to the POLQA tool output file.
-
-    Returns:
-      A dict.
-    """
-    data = []
-    with open(polqa_out_filepath) as f:
-      for line in f:
-        line = line.strip()
-        if len(line) == 0 or line.startswith('*'):
-          # Ignore comments.
-          continue
-        # Read fields.
-        data.append(re.split(r'\t+', line))
-
-    # Two rows expected (header and values).
-    assert len(data) == 2, 'Cannot parse POLQA output'
-    number_of_fields = len(data[0])
-    assert number_of_fields == len(data[1])
-
-    # Build and return a dictionary with field names (header) as keys and the
-    # corresponding field values as values.
-    return {data[0][index]: data[1][index] for index in range(number_of_fields)}
diff --git a/modules/audio_processing/test/py_quality_assessment/quality_assessment/eval_scores_factory.py b/modules/audio_processing/test/py_quality_assessment/quality_assessment/eval_scores_factory.py
deleted file mode 100644
index c19e1f9..0000000
--- a/modules/audio_processing/test/py_quality_assessment/quality_assessment/eval_scores_factory.py
+++ /dev/null
@@ -1,43 +0,0 @@
-# Copyright (c) 2017 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.
-
-"""EvaluationScore factory class.
-"""
-
-import logging
-
-from . import eval_scores
-
-
-class EvaluationScoreWorkerFactory(object):
-  """Factory class used to instantiate evaluation score workers.
-
-  The ctor gets the parametrs that are used to instatiate the evaluation score
-  workers.
-  """
-
-  def __init__(self, score_filename_prefix, polqa_tool_bin_path):
-    self._score_filename_prefix = score_filename_prefix
-    self._polqa_tool_bin_path = polqa_tool_bin_path
-
-  def GetInstance(self, evaluation_score_class):
-    """Creates an EvaluationScore instance given a class object.
-
-    Args:
-      evaluation_score_class: EvaluationScore class object (not an instance).
-
-    Returns:
-      An EvaluationScore instance.
-    """
-    logging.debug(
-        'factory producing a %s evaluation score', evaluation_score_class)
-    if evaluation_score_class == eval_scores.PolqaScore:
-      return eval_scores.PolqaScore(
-          self._score_filename_prefix, self._polqa_tool_bin_path)
-    else:
-      return evaluation_score_class(self._score_filename_prefix)
diff --git a/modules/audio_processing/test/py_quality_assessment/quality_assessment/eval_scores_unittest.py b/modules/audio_processing/test/py_quality_assessment/quality_assessment/eval_scores_unittest.py
deleted file mode 100644
index b3bd4f9..0000000
--- a/modules/audio_processing/test/py_quality_assessment/quality_assessment/eval_scores_unittest.py
+++ /dev/null
@@ -1,85 +0,0 @@
-# Copyright (c) 2017 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.
-
-"""Unit tests for the eval_scores module.
-"""
-
-import os
-import shutil
-import tempfile
-import unittest
-
-import pydub
-
-from . import data_access
-from . import eval_scores
-from . import eval_scores_factory
-from . import signal_processing
-
-
-class TestEvalScores(unittest.TestCase):
-  """Unit tests for the eval_scores module.
-  """
-
-  def setUp(self):
-    """Create temporary output folder and two audio track files."""
-    self._output_path = tempfile.mkdtemp()
-
-    # Create fake reference and tested (i.e., APM output) audio track files.
-    silence = pydub.AudioSegment.silent(duration=1000, frame_rate=48000)
-    fake_reference_signal = (
-        signal_processing.SignalProcessingUtils.GenerateWhiteNoise(silence))
-    fake_tested_signal = (
-        signal_processing.SignalProcessingUtils.GenerateWhiteNoise(silence))
-
-    # Save fake audio tracks.
-    self._fake_reference_signal_filepath = os.path.join(
-        self._output_path, 'fake_ref.wav')
-    signal_processing.SignalProcessingUtils.SaveWav(
-        self._fake_reference_signal_filepath, fake_reference_signal)
-    self._fake_tested_signal_filepath = os.path.join(
-        self._output_path, 'fake_test.wav')
-    signal_processing.SignalProcessingUtils.SaveWav(
-        self._fake_tested_signal_filepath, fake_tested_signal)
-
-  def tearDown(self):
-    """Recursively delete temporary folder."""
-    shutil.rmtree(self._output_path)
-
-  def testRegisteredClasses(self):
-    # Preliminary check.
-    self.assertTrue(os.path.exists(self._output_path))
-
-    # Check that there is at least one registered evaluation score worker.
-    registered_classes = eval_scores.EvaluationScore.REGISTERED_CLASSES
-    self.assertIsInstance(registered_classes, dict)
-    self.assertGreater(len(registered_classes), 0)
-
-    # Instance evaluation score workers factory with fake dependencies.
-    eval_score_workers_factory = (
-        eval_scores_factory.EvaluationScoreWorkerFactory(
-            score_filename_prefix='scores-',
-            polqa_tool_bin_path=os.path.join(
-                os.path.dirname(os.path.abspath(__file__)), 'fake_polqa')))
-
-    # Try each registered evaluation score worker.
-    for eval_score_name in registered_classes:
-      # Instance evaluation score worker.
-      eval_score_worker = eval_score_workers_factory.GetInstance(
-          registered_classes[eval_score_name])
-
-      # Set reference and test, then run.
-      eval_score_worker.SetReferenceSignalFilepath(
-          self._fake_reference_signal_filepath)
-      eval_score_worker.SetTestedSignalFilepath(
-          self._fake_tested_signal_filepath)
-      eval_score_worker.Run(self._output_path)
-
-      # Check output.
-      score = data_access.ScoreFile.Load(eval_score_worker.output_filepath)
-      self.assertTrue(isinstance(score, float))
diff --git a/modules/audio_processing/test/py_quality_assessment/quality_assessment/evaluation.py b/modules/audio_processing/test/py_quality_assessment/quality_assessment/evaluation.py
deleted file mode 100644
index e18f193..0000000
--- a/modules/audio_processing/test/py_quality_assessment/quality_assessment/evaluation.py
+++ /dev/null
@@ -1,51 +0,0 @@
-# Copyright (c) 2017 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.
-
-"""Evaluator of the APM module.
-"""
-
-import logging
-
-
-class ApmModuleEvaluator(object):
-  """APM evaluator class.
-  """
-
-  def __init__(self):
-    pass
-
-  @classmethod
-  def Run(cls, evaluation_score_workers, apm_output_filepath,
-          reference_input_filepath, output_path):
-    """Runs the evaluation.
-
-    Iterates over the given evaluation score workers.
-
-    Args:
-      evaluation_score_workers: list of EvaluationScore instances.
-      apm_output_filepath: path to the audio track file with the APM output.
-      reference_input_filepath: path to the reference audio track file.
-      output_path: output path.
-
-    Returns:
-      A dict of evaluation score name and score pairs.
-    """
-    # Init.
-    scores = {}
-
-    for evaluation_score_worker in evaluation_score_workers:
-      logging.info('   computing <%s> score', evaluation_score_worker.NAME)
-      evaluation_score_worker.SetReferenceSignalFilepath(
-          reference_input_filepath)
-      evaluation_score_worker.SetTestedSignalFilepath(
-          apm_output_filepath)
-
-      evaluation_score_worker.Run(output_path)
-      scores[evaluation_score_worker.NAME] = evaluation_score_worker.score
-
-    return scores
diff --git a/modules/audio_processing/test/py_quality_assessment/quality_assessment/exceptions.py b/modules/audio_processing/test/py_quality_assessment/quality_assessment/exceptions.py
deleted file mode 100644
index 0f7716a..0000000
--- a/modules/audio_processing/test/py_quality_assessment/quality_assessment/exceptions.py
+++ /dev/null
@@ -1,34 +0,0 @@
-# Copyright (c) 2017 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.
-
-"""Exception classes.
-"""
-
-
-class FileNotFoundError(Exception):
-  """File not found exeception.
-  """
-  pass
-
-
-class SignalProcessingException(Exception):
-  """Signal processing exeception.
-  """
-  pass
-
-
-class InputMixerException(Exception):
-  """Input mixer exeception.
-  """
-  pass
-
-
-class InputSignalCreatorException(Exception):
-  """Input signal creator exeception.
-  """
-  pass
diff --git a/modules/audio_processing/test/py_quality_assessment/quality_assessment/export.py b/modules/audio_processing/test/py_quality_assessment/quality_assessment/export.py
deleted file mode 100644
index 7bd226b..0000000
--- a/modules/audio_processing/test/py_quality_assessment/quality_assessment/export.py
+++ /dev/null
@@ -1,362 +0,0 @@
-# Copyright (c) 2017 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.
-
-import functools
-import hashlib
-import os
-import re
-
-
-class HtmlExport(object):
-  """HTML exporter class for APM quality scores."""
-
-  _NEW_LINE = '\n'
-
-  # CSS and JS file paths.
-  _PATH = os.path.dirname(os.path.realpath(__file__))
-  _CSS_FILEPATH = os.path.join(_PATH, 'results.css')
-  _JS_FILEPATH = os.path.join(_PATH, 'results.js')
-
-  def __init__(self, output_filepath):
-    self._scores_data_frame = None
-    self._output_filepath = output_filepath
-
-  def Export(self, scores_data_frame):
-    """Exports scores into an HTML file.
-
-    Args:
-      scores_data_frame: DataFrame instance.
-    """
-    self._scores_data_frame = scores_data_frame
-    html = ['<html>',
-            self._BuildHeader(),
-            '<body onload="initialize()">',
-            self._BuildBody(),
-            '</body>',
-            '</html>']
-    self._Save(self._output_filepath, self._NEW_LINE.join(html))
-
-  def _BuildHeader(self):
-    """Builds the <head> section of the HTML file.
-
-    The header contains the page title and either embedded or linked CSS and JS
-    files.
-
-    Returns:
-      A string with <head>...</head> HTML.
-    """
-    html = ['<head>', '<title>Results</title>']
-
-    # Add Material Design hosted libs.
-    html.append('<link rel="stylesheet" href="http://fonts.googleapis.com/'
-                'css?family=Roboto:300,400,500,700" type="text/css">')
-    html.append('<link rel="stylesheet" href="https://fonts.googleapis.com/'
-                'icon?family=Material+Icons">')
-    html.append('<link rel="stylesheet" href="https://code.getmdl.io/1.3.0/'
-                'material.indigo-pink.min.css">')
-    html.append('<script defer src="https://code.getmdl.io/1.3.0/'
-                'material.min.js"></script>')
-
-    # Embed custom JavaScript and CSS files.
-    def EmbedFile(filepath):
-      with open(filepath) as f:
-        for l in f:
-          html.append(l.rstrip())
-    html.append('<script>')
-    EmbedFile(self._JS_FILEPATH)
-    html.append('</script>')
-    html.append('<style>')
-    EmbedFile(self._CSS_FILEPATH)
-    html.append('</style>')
-
-    html.append('</head>')
-
-    return self._NEW_LINE.join(html)
-
-  def _BuildBody(self):
-    """Builds the content of the <body> section."""
-    score_names = self._scores_data_frame['eval_score_name'].drop_duplicates(
-    ).values.tolist()
-
-    html = [
-        ('<div class="mdl-layout mdl-js-layout mdl-layout--fixed-header '
-         'mdl-layout--fixed-tabs">'),
-        '<header class="mdl-layout__header">',
-        '<div class="mdl-layout__header-row">',
-        '<span class="mdl-layout-title">APM QA results ({})</span>'.format(
-            self._output_filepath),
-        '</div>',
-    ]
-
-    # Tab selectors.
-    html.append('<div class="mdl-layout__tab-bar mdl-js-ripple-effect">')
-    for tab_index, score_name in enumerate(score_names):
-      is_active = tab_index == 0
-      html.append('<a href="#score-tab-{}" class="mdl-layout__tab{}">'
-                  '{}</a>'.format(tab_index,
-                                  ' is-active' if is_active else '',
-                                  self._FormatName(score_name)))
-    html.append('</div>')
-
-    html.append('</header>')
-    html.append('<main class="mdl-layout__content">')
-
-    # Tabs content.
-    for tab_index, score_name in enumerate(score_names):
-      html.append('<section class="mdl-layout__tab-panel{}" '
-                  'id="score-tab-{}">'.format(
-                      ' is-active' if is_active else '', tab_index))
-      html.append('<div class="page-content">')
-      html.append(self._BuildScoreTab(score_name))
-      html.append('</div>')
-      html.append('</section>')
-
-    html.append('</main>')
-    html.append('</div>')
-
-    return self._NEW_LINE.join(html)
-
-  def _BuildScoreTab(self, score_name):
-    """Builds the content of a tab."""
-    # Find unique values.
-    scores = self._scores_data_frame[
-        self._scores_data_frame.eval_score_name == score_name]
-    apm_configs = sorted(self._FindUniqueTuples(scores, ['apm_config']))
-    test_data_gen_configs = sorted(self._FindUniqueTuples(
-        scores, ['test_data_gen', 'test_data_gen_params']))
-
-    html = [
-        '<div class="mdl-grid">',
-        '<div class="mdl-layout-spacer"></div>',
-        '<div class="mdl-cell mdl-cell--10-col">',
-        ('<table class="mdl-data-table mdl-js-data-table mdl-shadow--2dp" '
-         'style="width: 100%;">'),
-    ]
-
-    # Header.
-    html.append('<thead><tr><th>APM config / Test data generator</th>')
-    for test_data_gen_info in test_data_gen_configs:
-      html.append('<th>{} {}</th>'.format(
-          self._FormatName(test_data_gen_info[0]), test_data_gen_info[1]))
-    html.append('</tr></thead>')
-
-    # Body.
-    html.append('<tbody>')
-    for apm_config in apm_configs:
-      html.append('<tr><td>' + self._FormatName(apm_config[0]) + '</td>')
-      for test_data_gen_info in test_data_gen_configs:
-        onclick_handler = 'openScoreStatsInspector(\'{}\')'.format(
-            self._ScoreStatsInspectorDialogId(score_name, apm_config[0],
-                                              test_data_gen_info[0],
-                                              test_data_gen_info[1]))
-        html.append('<td onclick="{}">{}</td>'.format(
-            onclick_handler, self._BuildScoreTableCell(
-                score_name, test_data_gen_info[0], test_data_gen_info[1],
-                apm_config[0])))
-      html.append('</tr>')
-    html.append('</tbody>')
-
-    html.append('</table></div><div class="mdl-layout-spacer"></div></div>')
-
-    html.append(self._BuildScoreStatsInspectorDialogs(
-        score_name, apm_configs, test_data_gen_configs))
-
-    return self._NEW_LINE.join(html)
-
-  def _BuildScoreTableCell(self, score_name, test_data_gen,
-                           test_data_gen_params, apm_config):
-    """Builds the content of a table cell for a score table."""
-    scores = self._SliceDataForScoreTableCell(
-        score_name, apm_config, test_data_gen, test_data_gen_params)
-    stats = self._ComputeScoreStats(scores)
-
-    html = []
-    items_id_prefix = (
-        score_name + test_data_gen + test_data_gen_params + apm_config)
-    if stats['count'] == 1:
-      # Show the only available score.
-      item_id = hashlib.md5(items_id_prefix.encode('utf-8')).hexdigest()
-      html.append('<div id="single-value-{0}">{1:f}</div>'.format(
-          item_id, scores['score'].mean()))
-      html.append('<div class="mdl-tooltip" data-mdl-for="single-value-{}">{}'
-          '</div>'.format(item_id, 'single value'))
-    else:
-      # Show stats.
-      for stat_name in ['min', 'max', 'mean', 'std dev']:
-        item_id = hashlib.md5(
-            (items_id_prefix + stat_name).encode('utf-8')).hexdigest()
-        html.append('<div id="stats-{0}">{1:f}</div>'.format(
-            item_id, stats[stat_name]))
-        html.append('<div class="mdl-tooltip" data-mdl-for="stats-{}">{}'
-            '</div>'.format(item_id, stat_name))
-
-    return self._NEW_LINE.join(html)
-
-  def _BuildScoreStatsInspectorDialogs(
-      self, score_name, apm_configs, test_data_gen_configs):
-    """Builds a set of score stats inspector dialogs."""
-    html = []
-    for apm_config in apm_configs:
-      for test_data_gen_info in test_data_gen_configs:
-        dialog_id = self._ScoreStatsInspectorDialogId(
-            score_name, apm_config[0],
-            test_data_gen_info[0], test_data_gen_info[1])
-
-        html.append('<dialog class="mdl-dialog" id="{}" '
-                    'style="width: 40%;">'.format(dialog_id))
-
-        # Content.
-        html.append('<div class="mdl-dialog__content">')
-        html.append('<h6><strong>APM config preset</strong>: {}<br/>'
-                    '<strong>Test data generator</strong>: {} ({})</h6>'.format(
-                        self._FormatName(apm_config[0]),
-                        self._FormatName(test_data_gen_info[0]),
-                        test_data_gen_info[1]))
-        html.append(self._BuildScoreStatsInspectorDialog(
-            score_name, apm_config[0], test_data_gen_info[0],
-            test_data_gen_info[1]))
-        html.append('</div>')
-
-        # Actions.
-        html.append('<div class="mdl-dialog__actions">')
-        html.append('<button type="button" class="mdl-button" '
-                    'onclick="closeScoreStatsInspector(\'' + dialog_id + '\')">'
-                    'Close</button>')
-        html.append('</div>')
-
-        html.append('</dialog>')
-
-    return self._NEW_LINE.join(html)
-
-  def _BuildScoreStatsInspectorDialog(
-      self, score_name, apm_config, test_data_gen, test_data_gen_params):
-    """Builds one score stats inspector dialog."""
-    scores = self._SliceDataForScoreTableCell(
-        score_name, apm_config, test_data_gen, test_data_gen_params)
-
-    capture_render_pairs = sorted(self._FindUniqueTuples(
-        scores, ['capture', 'render']))
-    echo_simulators = sorted(self._FindUniqueTuples(scores, ['echo_simulator']))
-
-    html = ['<table class="mdl-data-table mdl-js-data-table mdl-shadow--2dp">']
-
-    # Header.
-    html.append('<thead><tr><th>Capture-Render / Echo simulator</th>')
-    for echo_simulator in echo_simulators:
-      html.append('<th>' + self._FormatName(echo_simulator[0]) +'</th>')
-    html.append('</tr></thead>')
-
-    # Body.
-    html.append('<tbody>')
-    for capture, render in capture_render_pairs:
-      html.append('<tr><td><div>{}</div><div>{}</div></td>'.format(
-          capture, render))
-      for echo_simulator in echo_simulators:
-        score_tuple = self._SliceDataForScoreStatsTableCell(
-            scores, capture, render, echo_simulator[0])
-        html.append('<td class="single-score-cell">{}</td>'.format(
-            self._BuildScoreStatsInspectorTableCell(score_tuple)))
-      html.append('</tr>')
-    html.append('</tbody>')
-
-    html.append('</table>')
-
-    # Placeholder for the audio inspector.
-    html.append('<div class="audio-inspector-placeholder"></div>')
-
-    return self._NEW_LINE.join(html)
-
-  def _BuildScoreStatsInspectorTableCell(self, score_tuple):
-    """Builds the content of a cell of a score stats inspector."""
-    html = ['<div>{}</div>'.format(score_tuple.score)]
-
-    # Add all the available file paths as hidden data.
-    for field_name in score_tuple.keys():
-      if field_name.endswith('_filepath'):
-        html.append('<input type="hidden" name="{}" value="{}">'.format(
-            field_name, score_tuple[field_name]))
-
-    return self._NEW_LINE.join(html)
-
-  def _SliceDataForScoreTableCell(
-      self, score_name, apm_config, test_data_gen, test_data_gen_params):
-    """Slices |self._scores_data_frame| to extract the data for a tab."""
-    masks = []
-    masks.append(self._scores_data_frame.eval_score_name == score_name)
-    masks.append(self._scores_data_frame.apm_config == apm_config)
-    masks.append(self._scores_data_frame.test_data_gen == test_data_gen)
-    masks.append(
-        self._scores_data_frame.test_data_gen_params == test_data_gen_params)
-    mask = functools.reduce((lambda i1, i2: i1 & i2), masks)
-    del masks
-    return self._scores_data_frame[mask]
-
-  @classmethod
-  def _SliceDataForScoreStatsTableCell(
-      cls, scores, capture, render, echo_simulator):
-    """Slices |scores| to extract the data for a tab."""
-    masks = []
-
-    masks.append(scores.capture == capture)
-    masks.append(scores.render == render)
-    masks.append(scores.echo_simulator == echo_simulator)
-    mask = functools.reduce((lambda i1, i2: i1 & i2), masks)
-    del masks
-
-    sliced_data = scores[mask]
-    assert len(sliced_data) == 1, 'single score is expected'
-    return sliced_data.iloc[0]
-
-  @classmethod
-  def _FindUniqueTuples(cls, data_frame, fields):
-    """Slices |data_frame| to a list of fields and finds unique tuples."""
-    return data_frame[fields].drop_duplicates().values.tolist()
-
-  @classmethod
-  def _ComputeScoreStats(cls, data_frame):
-    """Computes score stats."""
-    scores = data_frame['score']
-    return {
-        'count': scores.count(),
-        'min': scores.min(),
-        'max': scores.max(),
-        'mean': scores.mean(),
-        'std dev': scores.std(),
-    }
-
-  @classmethod
-  def _ScoreStatsInspectorDialogId(cls, score_name, apm_config, test_data_gen,
-                                   test_data_gen_params):
-    """Assigns a unique name to a dialog."""
-    return 'score-stats-dialog-' + hashlib.md5(
-        'score-stats-inspector-{}-{}-{}-{}'.format(
-            score_name, apm_config, test_data_gen,
-            test_data_gen_params).encode('utf-8')).hexdigest()
-
-  @classmethod
-  def _Save(cls, output_filepath, html):
-    """Writes the HTML file.
-
-    Args:
-      output_filepath: output file path.
-      html: string with the HTML content.
-    """
-    with open(output_filepath, 'w') as f:
-      f.write(html)
-
-  @classmethod
-  def _FormatName(cls, name):
-    """Formats a name.
-
-    Args:
-      name: a string.
-
-    Returns:
-      A copy of name in which underscores and dashes are replaced with a space.
-    """
-    return re.sub(r'[_\-]', ' ', name)
diff --git a/modules/audio_processing/test/py_quality_assessment/quality_assessment/fake_polqa.cc b/modules/audio_processing/test/py_quality_assessment/quality_assessment/fake_polqa.cc
deleted file mode 100644
index 9345a87..0000000
--- a/modules/audio_processing/test/py_quality_assessment/quality_assessment/fake_polqa.cc
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- *  Copyright (c) 2017 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 <fstream>
-#include <iostream>
-
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-namespace test {
-namespace {
-
-const char* const kErrorMessage = "-Out /path/to/output/file is mandatory";
-
-// Writes fake output intended to be parsed by
-// quality_assessment.eval_scores.PolqaScore.
-void WriteOutputFile(const std::string& output_file_path) {
-  RTC_CHECK_NE(output_file_path, "");
-  std::ofstream out(output_file_path);
-  RTC_CHECK(!out.bad());
-  out << "* Fake Polqa output" << std::endl;
-  out << "FakeField1\tPolqaScore\tFakeField2" << std::endl;
-  out << "FakeValue1\t3.25\tFakeValue2" << std::endl;
-  out.close();
-}
-
-}  // namespace
-
-int main(int argc, char* argv[]) {
-  // Find "-Out" and use its next argument as output file path.
-  RTC_CHECK_GE(argc, 3) << kErrorMessage;
-  const std::string kSoughtFlagName = "-Out";
-  for (int i = 1; i < argc - 1; ++i) {
-    if (kSoughtFlagName.compare(argv[i]) == 0) {
-      WriteOutputFile(argv[i + 1]);
-      return 0;
-    }
-  }
-  FATAL() << kErrorMessage;
-}
-
-}  // namespace test
-}  // namespace webrtc
-
-int main(int argc, char* argv[]) {
-  return webrtc::test::main(argc, argv);
-}
diff --git a/modules/audio_processing/test/py_quality_assessment/quality_assessment/input_mixer.py b/modules/audio_processing/test/py_quality_assessment/quality_assessment/input_mixer.py
deleted file mode 100644
index 8f9e542..0000000
--- a/modules/audio_processing/test/py_quality_assessment/quality_assessment/input_mixer.py
+++ /dev/null
@@ -1,93 +0,0 @@
-# Copyright (c) 2017 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.
-
-"""Input mixer module.
-"""
-
-import logging
-import os
-
-from . import exceptions
-from . import signal_processing
-
-
-class ApmInputMixer(object):
-  """Class to mix a set of audio segments down to the APM input."""
-
-  _HARD_CLIPPING_LOG_MSG = 'hard clipping detected in the  mixed signal'
-
-  def __init__(self):
-    pass
-
-  @classmethod
-  def HardClippingLogMessage(cls):
-    """Returns the log message used when hard clipping is detected in the mix.
-
-    This method is mainly intended to be used by the unit tests.
-    """
-    return cls._HARD_CLIPPING_LOG_MSG
-
-  @classmethod
-  def Mix(cls, output_path, capture_input_filepath, echo_filepath):
-    """Mixes capture and echo.
-
-    Creates the overall capture input for APM by mixing the "echo-free" capture
-    signal with the echo signal (e.g., echo simulated via the
-    echo_path_simulation module).
-
-    The echo signal cannot be shorter than the capture signal and the generated
-    mix will have the same duration of the capture signal. The latter property
-    is enforced in order to let the input of APM and the reference signal
-    created by TestDataGenerator have the same length (required for the
-    evaluation step).
-
-    Hard-clipping may occur in the mix; a warning is raised when this happens.
-
-    If |echo_filepath| is None, nothing is done and |capture_input_filepath| is
-    returned.
-
-    Args:
-      speech: AudioSegment instance.
-      echo_path: AudioSegment instance or None.
-
-    Returns:
-      Path to the mix audio track file.
-    """
-    if echo_filepath is None:
-      return capture_input_filepath
-
-    # Build the mix output file name as a function of the echo file name.
-    # This ensures that if the internal parameters of the echo path simulator
-    # change, no erroneous cache hit occurs.
-    echo_file_name, _ = os.path.splitext(os.path.split(echo_filepath)[1])
-    mix_filepath = os.path.join(output_path, 'mix_capture_{}.wav'.format(
-        echo_file_name))
-
-    # Create the mix if not done yet.
-    mix = None
-    if not os.path.exists(mix_filepath):
-      echo_free_capture = signal_processing.SignalProcessingUtils.LoadWav(
-          capture_input_filepath)
-      echo = signal_processing.SignalProcessingUtils.LoadWav(echo_filepath)
-
-      if signal_processing.SignalProcessingUtils.CountSamples(echo) < (
-          signal_processing.SignalProcessingUtils.CountSamples(
-              echo_free_capture)):
-        raise exceptions.InputMixerException(
-            'echo cannot be shorter than capture')
-
-      mix = echo_free_capture.overlay(echo)
-      signal_processing.SignalProcessingUtils.SaveWav(mix_filepath, mix)
-
-    # Check if hard clipping occurs.
-    if mix is None:
-      mix = signal_processing.SignalProcessingUtils.LoadWav(mix_filepath)
-    if signal_processing.SignalProcessingUtils.DetectHardClipping(mix):
-      logging.warning(cls._HARD_CLIPPING_LOG_MSG)
-
-    return mix_filepath
diff --git a/modules/audio_processing/test/py_quality_assessment/quality_assessment/input_mixer_unittest.py b/modules/audio_processing/test/py_quality_assessment/quality_assessment/input_mixer_unittest.py
deleted file mode 100644
index b212614..0000000
--- a/modules/audio_processing/test/py_quality_assessment/quality_assessment/input_mixer_unittest.py
+++ /dev/null
@@ -1,149 +0,0 @@
-# Copyright (c) 2017 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.
-
-"""Unit tests for the input mixer module.
-"""
-
-import logging
-import os
-import shutil
-import sys
-import tempfile
-import unittest
-
-SRC = os.path.abspath(os.path.join(
-    os.path.dirname((__file__)), os.pardir, os.pardir, os.pardir, os.pardir))
-sys.path.append(os.path.join(SRC, 'third_party', 'pymock'))
-
-import mock
-
-from . import exceptions
-from . import input_mixer
-from . import signal_processing
-
-
-class TestApmInputMixer(unittest.TestCase):
-  """Unit tests for the ApmInputMixer class.
-  """
-
-  # Audio track file names created in setUp().
-  _FILENAMES = ['capture', 'echo_1', 'echo_2', 'shorter', 'longer']
-
-  # Target peak power level (dBFS) of each audio track file created in setUp().
-  # These values are hand-crafted in order to make saturation happen when
-  # capture and echo_2 are mixed and the contrary for capture and echo_1.
-  # None means that the power is not changed.
-  _MAX_PEAK_POWER_LEVELS = [-10.0, -5.0, 0.0, None, None]
-
-  # Audio track file durations in milliseconds.
-  _DURATIONS = [1000, 1000, 1000, 800, 1200]
-
-  _SAMPLE_RATE = 48000
-
-  def setUp(self):
-    """Creates temporary data."""
-    self._tmp_path = tempfile.mkdtemp()
-
-    # Create audio track files.
-    self._audio_tracks = {}
-    for filename, peak_power, duration in zip(
-        self._FILENAMES, self._MAX_PEAK_POWER_LEVELS, self._DURATIONS):
-      audio_track_filepath = os.path.join(self._tmp_path, '{}.wav'.format(
-          filename))
-
-      # Create a pure tone with the target peak power level.
-      template = signal_processing.SignalProcessingUtils.GenerateSilence(
-          duration=duration, sample_rate=self._SAMPLE_RATE)
-      signal = signal_processing.SignalProcessingUtils.GeneratePureTone(
-          template)
-      if peak_power is not None:
-        signal = signal.apply_gain(-signal.max_dBFS + peak_power)
-
-      signal_processing.SignalProcessingUtils.SaveWav(
-        audio_track_filepath, signal)
-      self._audio_tracks[filename] = {
-          'filepath': audio_track_filepath,
-          'num_samples': signal_processing.SignalProcessingUtils.CountSamples(
-              signal)
-      }
-
-  def tearDown(self):
-    """Recursively deletes temporary folders."""
-    shutil.rmtree(self._tmp_path)
-
-  def testCheckMixSameDuration(self):
-    """Checks the duration when mixing capture and echo with same duration."""
-    mix_filepath = input_mixer.ApmInputMixer.Mix(
-        self._tmp_path,
-        self._audio_tracks['capture']['filepath'],
-        self._audio_tracks['echo_1']['filepath'])
-    self.assertTrue(os.path.exists(mix_filepath))
-
-    mix = signal_processing.SignalProcessingUtils.LoadWav(mix_filepath)
-    self.assertEqual(self._audio_tracks['capture']['num_samples'],
-                     signal_processing.SignalProcessingUtils.CountSamples(mix))
-
-  def testRejectShorterEcho(self):
-    """Rejects echo signals that are shorter than the capture signal."""
-    try:
-      _ = input_mixer.ApmInputMixer.Mix(
-          self._tmp_path,
-          self._audio_tracks['capture']['filepath'],
-          self._audio_tracks['shorter']['filepath'])
-      self.fail('no exception raised')
-    except exceptions.InputMixerException:
-      pass
-
-  def testCheckMixDurationWithLongerEcho(self):
-    """Checks the duration when mixing an echo longer than the capture."""
-    mix_filepath = input_mixer.ApmInputMixer.Mix(
-        self._tmp_path,
-        self._audio_tracks['capture']['filepath'],
-        self._audio_tracks['longer']['filepath'])
-    self.assertTrue(os.path.exists(mix_filepath))
-
-    mix = signal_processing.SignalProcessingUtils.LoadWav(mix_filepath)
-    self.assertEqual(self._audio_tracks['capture']['num_samples'],
-                     signal_processing.SignalProcessingUtils.CountSamples(mix))
-
-  def testCheckOutputFileNamesConflict(self):
-    """Checks that different echo files lead to different output file names."""
-    mix1_filepath = input_mixer.ApmInputMixer.Mix(
-        self._tmp_path,
-        self._audio_tracks['capture']['filepath'],
-        self._audio_tracks['echo_1']['filepath'])
-    self.assertTrue(os.path.exists(mix1_filepath))
-
-    mix2_filepath = input_mixer.ApmInputMixer.Mix(
-        self._tmp_path,
-        self._audio_tracks['capture']['filepath'],
-        self._audio_tracks['echo_2']['filepath'])
-    self.assertTrue(os.path.exists(mix2_filepath))
-
-    self.assertNotEqual(mix1_filepath, mix2_filepath)
-
-  def testHardClippingLogExpected(self):
-    """Checks that hard clipping warning is raised when occurring."""
-    logging.warning = mock.MagicMock(name='warning')
-    _ = input_mixer.ApmInputMixer.Mix(
-        self._tmp_path,
-        self._audio_tracks['capture']['filepath'],
-        self._audio_tracks['echo_2']['filepath'])
-    logging.warning.assert_called_once_with(
-        input_mixer.ApmInputMixer.HardClippingLogMessage())
-
-  def testHardClippingLogNotExpected(self):
-    """Checks that hard clipping warning is not raised when not occurring."""
-    logging.warning = mock.MagicMock(name='warning')
-    _ = input_mixer.ApmInputMixer.Mix(
-        self._tmp_path,
-        self._audio_tracks['capture']['filepath'],
-        self._audio_tracks['echo_1']['filepath'])
-    self.assertNotIn(
-        mock.call(input_mixer.ApmInputMixer.HardClippingLogMessage()),
-        logging.warning.call_args_list)
diff --git a/modules/audio_processing/test/py_quality_assessment/quality_assessment/input_signal_creator.py b/modules/audio_processing/test/py_quality_assessment/quality_assessment/input_signal_creator.py
deleted file mode 100644
index e2a720c..0000000
--- a/modules/audio_processing/test/py_quality_assessment/quality_assessment/input_signal_creator.py
+++ /dev/null
@@ -1,57 +0,0 @@
-# Copyright (c) 2017 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.
-
-"""Input signal creator module.
-"""
-
-from . import exceptions
-from . import signal_processing
-
-
-class InputSignalCreator(object):
-  """Input signal creator class.
-  """
-
-  @classmethod
-  def Create(cls, name, params):
-    """Creates a input signal.
-
-    Args:
-      name: Input signal creator name.
-      params: Tuple of parameters to pass to the specific signal creator.
-
-    Returns:
-      AudioSegment instance.
-    """
-    try:
-      if name == 'pure_tone':
-        return cls._CreatePureTone(float(params[0]), int(params[1]))
-    except (TypeError, AssertionError) as e:
-      raise exceptions.InputSignalCreatorException(
-          'Invalid signal creator parameters: {}'.format(e))
-
-    raise exceptions.InputSignalCreatorException(
-        'Invalid input signal creator name')
-
-  @classmethod
-  def _CreatePureTone(cls, frequency, duration):
-    """
-    Generates a pure tone at 48000 Hz.
-
-    Args:
-      frequency: Float in (0-24000] (Hz).
-      duration: Integer (milliseconds).
-
-    Returns:
-      AudioSegment instance.
-    """
-    assert 0 < frequency <= 24000
-    assert 0 < duration
-    template = signal_processing.SignalProcessingUtils.GenerateSilence(duration)
-    return signal_processing.SignalProcessingUtils.GeneratePureTone(
-        template, frequency)
diff --git a/modules/audio_processing/test/py_quality_assessment/quality_assessment/results.css b/modules/audio_processing/test/py_quality_assessment/quality_assessment/results.css
deleted file mode 100644
index 8fd0751..0000000
--- a/modules/audio_processing/test/py_quality_assessment/quality_assessment/results.css
+++ /dev/null
@@ -1,28 +0,0 @@
-/* Copyright (c) 2017 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.
- */
-
-td.selected-score {
-  background-color: #DDD;
-}
-
-.audio-inspector {
-  text-align: center;
-}
-
-.audio-inspector div{
-  margin-bottom: 0;
-  padding-bottom: 0;
-  padding-top: 0;
-}
-
-.audio-inspector div div{
-  margin-bottom: 0;
-  padding-bottom: 0;
-  padding-top: 0;
-}
diff --git a/modules/audio_processing/test/py_quality_assessment/quality_assessment/results.js b/modules/audio_processing/test/py_quality_assessment/quality_assessment/results.js
deleted file mode 100644
index c0272af..0000000
--- a/modules/audio_processing/test/py_quality_assessment/quality_assessment/results.js
+++ /dev/null
@@ -1,239 +0,0 @@
-// Copyright (c) 2017 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.
-
-var inspector = null;
-
-/**
- * Opens the score stats inspector dialog.
- * @param {String} dialogId: identifier of the dialog to show.
- */
-function openScoreStatsInspector(dialogId) {
-  var dialog = document.getElementById(dialogId);
-  dialog.showModal();
-}
-
-/**
- * Closes the score stats inspector dialog.
- * @param {String} dialogId: identifier of the dialog to close.
- */
-function closeScoreStatsInspector(dialogId) {
-  var dialog = document.getElementById(dialogId);
-  dialog.close();
-  if (inspector != null) {
-    inspector.stopAudio();
-  }
-}
-
-/**
- * Instance and initialize the audio inspector.
- */
-function initialize() {
-  inspector = new AudioInspector();
-  inspector.init();
-}
-
-/**
- * Audio inspector class.
- * @constructor
- */
-function AudioInspector() {
-  this.audioPlayer_ = new Audio();
-  this.metadata_ = {};
-  this.currentScore_ = null;
-  this.audioInspector_ = null;
-}
-
-/**
- * Initialize.
- */
-AudioInspector.prototype.init = function() {
-  window.event.stopPropagation();
-  this.createAudioInspector_();
-  this.initializeEventHandlers_();
-};
-
-/**
- * Set up the inspector for a new score.
- * @param {DOMElement} element: Element linked to the selected score.
- */
-AudioInspector.prototype.selectedScoreChange = function(element) {
-  if (this.currentScore_ == element) { return; }
-  if (this.currentScore_ != null) {
-    this.currentScore_.classList.remove('selected-score');
-  }
-  this.currentScore_ = element;
-  this.currentScore_.classList.add('selected-score');
-  this.stopAudio();
-
-  // Read metadata.
-  var matches = element.querySelectorAll('input[type=hidden]');
-  this.metadata_ = {};
-  for (var index = 0; index < matches.length; ++index) {
-    this.metadata_[matches[index].name] = matches[index].value;
-  }
-
-  // Show the audio inspector interface.
-  var container = element.parentNode.parentNode.parentNode.parentNode;
-  var audioInspectorPlaceholder = container.querySelector(
-      '.audio-inspector-placeholder');
-  this.moveInspector_(audioInspectorPlaceholder);
-};
-
-/**
- * Stop playing audio.
- */
-AudioInspector.prototype.stopAudio = function() {
-  this.audioPlayer_.pause();
-};
-
-/**
- * Move the audio inspector DOM node into the given parent.
- * @param {DOMElement} newParentNode: New parent for the inspector.
- */
-AudioInspector.prototype.moveInspector_ = function(newParentNode) {
-  newParentNode.appendChild(this.audioInspector_);
-};
-
-/**
- * Play audio file from url.
- * @param {string} metadataFieldName: Metadata field name.
- */
-AudioInspector.prototype.playAudio = function(metadataFieldName) {
-  if (this.metadata_[metadataFieldName] == undefined) { return; }
-  if (this.metadata_[metadataFieldName] == 'None') {
-    alert('The selected stream was not used during the experiment.');
-    return;
-  }
-  this.stopAudio();
-  this.audioPlayer_.src = this.metadata_[metadataFieldName];
-  this.audioPlayer_.play();
-};
-
-/**
- * Initialize event handlers.
- */
-AudioInspector.prototype.createAudioInspector_ = function() {
-  var buttonIndex = 0;
-  function getButtonHtml(icon, toolTipText, caption, metadataFieldName) {
-    var buttonId = 'audioInspectorButton' + buttonIndex++;
-    html = caption == null ? '' : caption;
-    html += '<button class="mdl-button mdl-js-button mdl-button--icon ' +
-                'mdl-js-ripple-effect" id="' + buttonId + '">' +
-              '<i class="material-icons">' + icon + '</i>' +
-              '<div class="mdl-tooltip" data-mdl-for="' + buttonId + '">' +
-                 toolTipText +
-              '</div>';
-    if (metadataFieldName != null) {
-      html += '<input type="hidden" value="' + metadataFieldName + '">'
-    }
-    html += '</button>'
-
-    return html;
-  }
-
-  this.audioInspector_ = document.createElement('div');
-  this.audioInspector_.classList.add('audio-inspector');
-  this.audioInspector_.innerHTML =
-      '<div class="mdl-grid">' +
-        '<div class="mdl-layout-spacer"></div>' +
-        '<div class="mdl-cell mdl-cell--2-col">' +
-          getButtonHtml('play_arrow', 'Simulated echo', 'E<sub>in</sub>',
-                        'echo_filepath') +
-        '</div>' +
-        '<div class="mdl-cell mdl-cell--2-col">' +
-          getButtonHtml('stop', 'Stop playing [S]', null, '__stop__') +
-        '</div>' +
-        '<div class="mdl-cell mdl-cell--2-col">' +
-          getButtonHtml('play_arrow', 'Render stream', 'R<sub>in</sub>',
-                        'render_filepath') +
-        '</div>' +
-        '<div class="mdl-layout-spacer"></div>' +
-      '</div>' +
-      '<div class="mdl-grid">' +
-        '<div class="mdl-layout-spacer"></div>' +
-        '<div class="mdl-cell mdl-cell--2-col">' +
-          getButtonHtml('play_arrow', 'Capture stream (APM input) [1]',
-                        'Y\'<sub>in</sub>', 'capture_filepath') +
-        '</div>' +
-        '<div class="mdl-cell mdl-cell--2-col"><strong>APM</strong></div>' +
-        '<div class="mdl-cell mdl-cell--2-col">' +
-          getButtonHtml('play_arrow', 'APM output [2]', 'Y<sub>out</sub>',
-                        'apm_output_filepath') +
-        '</div>' +
-        '<div class="mdl-layout-spacer"></div>' +
-      '</div>' +
-      '<div class="mdl-grid">' +
-        '<div class="mdl-layout-spacer"></div>' +
-        '<div class="mdl-cell mdl-cell--2-col">' +
-          getButtonHtml('play_arrow', 'Echo-free capture stream',
-                        'Y<sub>in</sub>', 'echo_free_capture_filepath') +
-        '</div>' +
-        '<div class="mdl-cell mdl-cell--2-col">' +
-          getButtonHtml('play_arrow', 'Clean capture stream',
-                        'Y<sub>clean</sub>', 'clean_capture_input_filepath') +
-        '</div>' +
-        '<div class="mdl-cell mdl-cell--2-col">' +
-          getButtonHtml('play_arrow', 'APM reference [3]', 'Y<sub>ref</sub>',
-                        'apm_reference_filepath') +
-        '</div>' +
-        '<div class="mdl-layout-spacer"></div>' +
-      '</div>';
-
-  // Add an invisible node as initial container for the audio inspector.
-  var parent = document.createElement('div');
-  parent.style.display = 'none';
-  this.moveInspector_(parent);
-  document.body.appendChild(parent);
-};
-
-/**
- * Initialize event handlers.
- */
-AudioInspector.prototype.initializeEventHandlers_ = function() {
-  var self = this;
-
-  // Score cells.
-  document.querySelectorAll('td.single-score-cell').forEach(function(element) {
-    element.onclick = function() {
-      self.selectedScoreChange(this);
-    }
-  });
-
-  // Audio inspector buttons.
-  this.audioInspector_.querySelectorAll('button').forEach(function(element) {
-    var target = element.querySelector('input[type=hidden]');
-    if (target == null) { return; }
-    element.onclick = function() {
-      if (target.value == '__stop__') {
-        self.stopAudio();
-      } else {
-        self.playAudio(target.value);
-      }
-    };
-  });
-
-  // Keyboard shortcuts.
-  window.onkeyup = function(e) {
-    var key = e.keyCode ? e.keyCode : e.which;
-    switch (key) {
-      case 49:  // 1.
-        self.playAudio('capture_filepath');
-        break;
-      case 50:  // 2.
-        self.playAudio('apm_output_filepath');
-        break;
-      case 51:  // 3.
-        self.playAudio('apm_reference_filepath');
-        break;
-      case 83:  // S.
-      case 115:  // s.
-        self.stopAudio();
-        break;
-    }
-  };
-};
diff --git a/modules/audio_processing/test/py_quality_assessment/quality_assessment/signal_processing.py b/modules/audio_processing/test/py_quality_assessment/quality_assessment/signal_processing.py
deleted file mode 100644
index 9a1f279..0000000
--- a/modules/audio_processing/test/py_quality_assessment/quality_assessment/signal_processing.py
+++ /dev/null
@@ -1,336 +0,0 @@
-# Copyright (c) 2017 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.
-
-"""Signal processing utility module.
-"""
-
-import array
-import logging
-import os
-import sys
-
-try:
-  import numpy as np
-except ImportError:
-  logging.critical('Cannot import the third-party Python package numpy')
-  sys.exit(1)
-
-try:
-  import pydub
-  import pydub.generators
-except ImportError:
-  logging.critical('Cannot import the third-party Python package pydub')
-  sys.exit(1)
-
-try:
-  import scipy.signal
-except ImportError:
-  logging.critical('Cannot import the third-party Python package scipy')
-  sys.exit(1)
-
-from . import exceptions
-
-
-class SignalProcessingUtils(object):
-  """Collection of signal processing utilities.
-  """
-
-  def __init__(self):
-    pass
-
-  @classmethod
-  def LoadWav(cls, filepath, channels=1):
-    """Loads wav file.
-
-    Args:
-      filepath: path to the wav audio track file to load.
-      channels: number of channels (downmixing to mono by default).
-
-    Returns:
-      AudioSegment instance.
-    """
-    if not os.path.exists(filepath):
-      logging.error('cannot find the <%s> audio track file', filepath)
-      raise exceptions.FileNotFoundError()
-    return pydub.AudioSegment.from_file(
-        filepath, format='wav', channels=channels)
-
-  @classmethod
-  def SaveWav(cls, output_filepath, signal):
-    """Saves wav file.
-
-    Args:
-      output_filepath: path to the wav audio track file to save.
-      signal: AudioSegment instance.
-    """
-    return signal.export(output_filepath, format='wav')
-
-  @classmethod
-  def CountSamples(cls, signal):
-    """Number of samples per channel.
-
-    Args:
-      signal: AudioSegment instance.
-
-    Returns:
-      An integer.
-    """
-    number_of_samples = len(signal.get_array_of_samples())
-    assert signal.channels > 0
-    assert number_of_samples % signal.channels == 0
-    return number_of_samples / signal.channels
-
-  @classmethod
-  def GenerateSilence(cls, duration=1000, sample_rate=48000):
-    """Generates silence.
-
-    This method can also be used to create a template AudioSegment instance.
-    A template can then be used with other Generate*() methods accepting an
-    AudioSegment instance as argument.
-
-    Args:
-      duration: duration in ms.
-      sample_rate: sample rate.
-
-    Returns:
-      AudioSegment instance.
-    """
-    return pydub.AudioSegment.silent(duration, sample_rate)
-
-  @classmethod
-  def GeneratePureTone(cls, template, frequency=440.0):
-    """Generates a pure tone.
-
-    The pure tone is generated with the same duration and in the same format of
-    the given template signal.
-
-    Args:
-      template: AudioSegment instance.
-      frequency: Frequency of the pure tone in Hz.
-
-    Return:
-      AudioSegment instance.
-    """
-    if frequency > template.frame_rate >> 1:
-      raise exceptions.SignalProcessingException('Invalid frequency')
-
-    generator = pydub.generators.Sine(
-        sample_rate=template.frame_rate,
-        bit_depth=template.sample_width * 8,
-        freq=frequency)
-
-    return generator.to_audio_segment(
-        duration=len(template),
-        volume=0.0)
-
-  @classmethod
-  def GenerateWhiteNoise(cls, template):
-    """Generates white noise.
-
-    The white noise is generated with the same duration and in the same format
-    of the given template signal.
-
-    Args:
-      template: AudioSegment instance.
-
-    Return:
-      AudioSegment instance.
-    """
-    generator = pydub.generators.WhiteNoise(
-        sample_rate=template.frame_rate,
-        bit_depth=template.sample_width * 8)
-    return generator.to_audio_segment(
-        duration=len(template),
-        volume=0.0)
-
-  @classmethod
-  def DetectHardClipping(cls, signal, threshold=2):
-    """Detects hard clipping.
-
-    Hard clipping is simply detected by counting samples that touch either the
-    lower or upper bound too many times in a row (according to |threshold|).
-    The presence of a single sequence of samples meeting such property is enough
-    to label the signal as hard clipped.
-
-    Args:
-      signal: AudioSegment instance.
-      threshold: minimum number of samples at full-scale in a row.
-
-    Returns:
-      True if hard clipping is detect, False otherwise.
-    """
-    if signal.channels != 1:
-      raise NotImplementedError('mutliple-channel clipping not implemented')
-    if signal.sample_width != 2:  # Note that signal.sample_width is in bytes.
-      raise exceptions.SignalProcessingException(
-          'hard-clipping detection only supported for 16 bit samples')
-
-    # Get raw samples, check type, cast.
-    samples = signal.get_array_of_samples()
-    if samples.typecode != 'h':
-      raise exceptions.SignalProcessingException(
-          'hard-clipping detection only supported for 16 bit samples')
-    samples = np.array(signal.get_array_of_samples(), np.int16)
-
-    # Detect adjacent clipped samples.
-    samples_type_info = np.iinfo(samples.dtype)
-    mask_min = samples == samples_type_info.min
-    mask_max = samples == samples_type_info.max
-
-    def HasLongSequence(vector, min_legth=threshold):
-      """Returns True if there are one or more long sequences of True flags."""
-      seq_length = 0
-      for b in vector:
-        seq_length = seq_length + 1 if b else 0
-        if seq_length >= min_legth:
-          return True
-      return False
-
-    return HasLongSequence(mask_min) or HasLongSequence(mask_max)
-
-  @classmethod
-  def ApplyImpulseResponse(cls, signal, impulse_response):
-    """Applies an impulse response to a signal.
-
-    Args:
-      signal: AudioSegment instance.
-      impulse_response: list or numpy vector of float values.
-
-    Returns:
-      AudioSegment instance.
-    """
-    # Get samples.
-    assert signal.channels == 1, (
-        'multiple-channel recordings not supported')
-    samples = signal.get_array_of_samples()
-
-    # Convolve.
-    logging.info('applying %d order impulse response to a signal lasting %d ms',
-                 len(impulse_response), len(signal))
-    convolved_samples = scipy.signal.fftconvolve(
-        in1=samples,
-        in2=impulse_response,
-        mode='full').astype(np.int16)
-    logging.info('convolution computed')
-
-    # Cast.
-    convolved_samples = array.array(signal.array_type, convolved_samples)
-
-    # Verify.
-    logging.debug('signal length: %d samples', len(samples))
-    logging.debug('convolved signal length: %d samples', len(convolved_samples))
-    assert len(convolved_samples) > len(samples)
-
-    # Generate convolved signal AudioSegment instance.
-    convolved_signal = pydub.AudioSegment(
-        data=convolved_samples,
-        metadata={
-            'sample_width': signal.sample_width,
-            'frame_rate': signal.frame_rate,
-            'frame_width': signal.frame_width,
-            'channels': signal.channels,
-        })
-    assert len(convolved_signal) > len(signal)
-
-    return convolved_signal
-
-  @classmethod
-  def Normalize(cls, signal):
-    """Normalizes a signal.
-
-    Args:
-      signal: AudioSegment instance.
-
-    Returns:
-      An AudioSegment instance.
-    """
-    return signal.apply_gain(-signal.max_dBFS)
-
-  @classmethod
-  def Copy(cls, signal):
-    """Makes a copy os a signal.
-
-    Args:
-      signal: AudioSegment instance.
-
-    Returns:
-      An AudioSegment instance.
-    """
-    return pydub.AudioSegment(
-        data=signal.get_array_of_samples(),
-        metadata={
-            'sample_width': signal.sample_width,
-            'frame_rate': signal.frame_rate,
-            'frame_width': signal.frame_width,
-            'channels': signal.channels,
-        })
-
-  @classmethod
-  def MixSignals(cls, signal, noise, target_snr=0.0, bln_pad_shortest=False):
-    """Mixes two signals with a target SNR.
-
-    Mix two signals with a desired SNR by scaling noise (noise).
-    If the target SNR is +/- infinite, a copy of signal/noise is returned.
-
-    Args:
-      signal: AudioSegment instance (signal).
-      noise: AudioSegment instance (noise).
-      target_snr: float, numpy.Inf or -numpy.Inf (dB).
-      bln_pad_shortest: if True, it pads the shortest signal with silence at the
-                        end.
-
-    Returns:
-      An AudioSegment instance.
-    """
-    # Handle infinite target SNR.
-    if target_snr == -np.Inf:
-      # Return a copy of noise.
-      logging.warning('SNR = -Inf, returning noise')
-      return cls.Copy(noise)
-    elif target_snr == np.Inf:
-      # Return a copy of signal.
-      logging.warning('SNR = +Inf, returning signal')
-      return cls.Copy(signal)
-
-    # Check signal and noise power.
-    signal_power = float(signal.dBFS)
-    noise_power = float(noise.dBFS)
-    if signal_power == -np.Inf:
-      logging.error('signal has -Inf power, cannot mix')
-      raise exceptions.SignalProcessingException(
-          'cannot mix a signal with -Inf power')
-    if noise_power == -np.Inf:
-      logging.error('noise has -Inf power, cannot mix')
-      raise exceptions.SignalProcessingException(
-          'cannot mix a signal with -Inf power')
-
-    # Pad signal (if necessary). If noise is the shortest, the AudioSegment
-    # overlay() method implictly pads noise. Hence, the only case to handle
-    # is signal shorter than noise and bln_pad_shortest True.
-    if bln_pad_shortest:
-      signal_duration = len(signal)
-      noise_duration = len(noise)
-      logging.warning('mix signals with padding')
-      logging.warning('  signal: %d ms', signal_duration)
-      logging.warning('  noise: %d ms', noise_duration)
-      padding_duration = noise_duration - signal_duration
-      if padding_duration > 0:  # That is signal_duration < noise_duration.
-        logging.debug('  padding: %d ms', padding_duration)
-        padding = pydub.AudioSegment.silent(
-            duration=padding_duration,
-            frame_rate=signal.frame_rate)
-        logging.debug('  signal (pre): %d ms', len(signal))
-        signal = signal + padding
-        logging.debug('  signal (post): %d ms', len(signal))
-
-        # Update power.
-        signal_power = float(signal.dBFS)
-
-    # Mix signals using the target SNR.
-    gain_db = signal_power - noise_power - target_snr
-    return cls.Normalize(signal.overlay(noise.apply_gain(gain_db)))
diff --git a/modules/audio_processing/test/py_quality_assessment/quality_assessment/signal_processing_unittest.py b/modules/audio_processing/test/py_quality_assessment/quality_assessment/signal_processing_unittest.py
deleted file mode 100644
index 3edd538..0000000
--- a/modules/audio_processing/test/py_quality_assessment/quality_assessment/signal_processing_unittest.py
+++ /dev/null
@@ -1,77 +0,0 @@
-# Copyright (c) 2017 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.
-
-"""Unit tests for the signal_processing module.
-"""
-
-import unittest
-
-import numpy as np
-import pydub
-
-from . import exceptions
-from . import signal_processing
-
-
-class TestSignalProcessing(unittest.TestCase):
-  """Unit tests for the signal_processing module.
-  """
-
-  def testMixSignals(self):
-    # Generate a template signal with which white noise can be generated.
-    silence = pydub.AudioSegment.silent(duration=1000, frame_rate=48000)
-
-    # Generate two distinct AudioSegment instances with 1 second of white noise.
-    signal = signal_processing.SignalProcessingUtils.GenerateWhiteNoise(
-        silence)
-    noise = signal_processing.SignalProcessingUtils.GenerateWhiteNoise(
-        silence)
-
-    # Extract samples.
-    signal_samples = signal.get_array_of_samples()
-    noise_samples = noise.get_array_of_samples()
-
-    # Test target SNR -Inf (noise expected).
-    mix_neg_inf = signal_processing.SignalProcessingUtils.MixSignals(
-        signal, noise, -np.Inf)
-    self.assertTrue(len(noise), len(mix_neg_inf))  # Check duration.
-    mix_neg_inf_samples = mix_neg_inf.get_array_of_samples()
-    self.assertTrue(  # Check samples.
-        all([x == y for x, y in zip(noise_samples, mix_neg_inf_samples)]))
-
-    # Test target SNR 0.0 (different data expected).
-    mix_0 = signal_processing.SignalProcessingUtils.MixSignals(
-        signal, noise, 0.0)
-    self.assertTrue(len(signal), len(mix_0))  # Check duration.
-    self.assertTrue(len(noise), len(mix_0))
-    mix_0_samples = mix_0.get_array_of_samples()
-    self.assertTrue(
-        any([x != y for x, y in zip(signal_samples, mix_0_samples)]))
-    self.assertTrue(
-        any([x != y for x, y in zip(noise_samples, mix_0_samples)]))
-
-    # Test target SNR +Inf (signal expected).
-    mix_pos_inf = signal_processing.SignalProcessingUtils.MixSignals(
-        signal, noise, np.Inf)
-    self.assertTrue(len(signal), len(mix_pos_inf))  # Check duration.
-    mix_pos_inf_samples = mix_pos_inf.get_array_of_samples()
-    self.assertTrue(  # Check samples.
-        all([x == y for x, y in zip(signal_samples, mix_pos_inf_samples)]))
-
-  def testMixSignalsMinInfPower(self):
-    silence = pydub.AudioSegment.silent(duration=1000, frame_rate=48000)
-    signal = signal_processing.SignalProcessingUtils.GenerateWhiteNoise(
-        silence)
-
-    with self.assertRaises(exceptions.SignalProcessingException):
-      _ = signal_processing.SignalProcessingUtils.MixSignals(
-          signal, silence, 0.0)
-
-    with self.assertRaises(exceptions.SignalProcessingException):
-      _ = signal_processing.SignalProcessingUtils.MixSignals(
-          silence, signal, 0.0)
diff --git a/modules/audio_processing/test/py_quality_assessment/quality_assessment/simulation.py b/modules/audio_processing/test/py_quality_assessment/quality_assessment/simulation.py
deleted file mode 100644
index 7023b6a..0000000
--- a/modules/audio_processing/test/py_quality_assessment/quality_assessment/simulation.py
+++ /dev/null
@@ -1,343 +0,0 @@
-# Copyright (c) 2017 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.
-
-"""APM module simulator.
-"""
-
-import logging
-import os
-
-from . import data_access
-from . import echo_path_simulation
-from . import echo_path_simulation_factory
-from . import eval_scores
-from . import eval_scores_factory
-from . import input_mixer
-from . import test_data_generation
-from . import test_data_generation_factory
-
-
-class ApmModuleSimulator(object):
-  """Audio processing module (APM) simulator class.
-  """
-
-  _TEST_DATA_GENERATOR_CLASSES = (
-      test_data_generation.TestDataGenerator.REGISTERED_CLASSES)
-  _EVAL_SCORE_WORKER_CLASSES = eval_scores.EvaluationScore.REGISTERED_CLASSES
-
-  _PREFIX_APM_CONFIG = 'apmcfg-'
-  _PREFIX_CAPTURE = 'capture-'
-  _PREFIX_RENDER = 'render-'
-  _PREFIX_ECHO_SIMULATOR = 'echosim-'
-  _PREFIX_TEST_DATA_GEN = 'datagen-'
-  _PREFIX_TEST_DATA_GEN_PARAMS = 'datagen_params-'
-  _PREFIX_SCORE = 'score-'
-
-  def __init__(self, aechen_ir_database_path, polqa_tool_bin_path,
-               ap_wrapper, evaluator):
-    # Init.
-    self._audioproc_wrapper = ap_wrapper
-    self._evaluator = evaluator
-
-    # Instance factory objects.
-    self._test_data_generator_factory = (
-        test_data_generation_factory.TestDataGeneratorFactory(
-            output_directory_prefix=self._PREFIX_TEST_DATA_GEN_PARAMS,
-            aechen_ir_database_path=aechen_ir_database_path))
-    self._evaluation_score_factory = (
-        eval_scores_factory.EvaluationScoreWorkerFactory(
-            score_filename_prefix=self._PREFIX_SCORE,
-            polqa_tool_bin_path=polqa_tool_bin_path))
-
-    # Properties for each run.
-    self._base_output_path = None
-    self._test_data_generators = None
-    self._evaluation_score_workers = None
-    self._config_filepaths = None
-    self._capture_input_filepaths = None
-    self._render_input_filepaths = None
-    self._echo_path_simulator_class = None
-
-  @classmethod
-  def GetPrefixApmConfig(cls):
-    return cls._PREFIX_APM_CONFIG
-
-  @classmethod
-  def GetPrefixCapture(cls):
-    return cls._PREFIX_CAPTURE
-
-  @classmethod
-  def GetPrefixRender(cls):
-    return cls._PREFIX_RENDER
-
-  @classmethod
-  def GetPrefixEchoSimulator(cls):
-    return cls._PREFIX_ECHO_SIMULATOR
-
-  @classmethod
-  def GetPrefixTestDataGenerator(cls):
-    return cls._PREFIX_TEST_DATA_GEN
-
-  @classmethod
-  def GetPrefixTestDataGeneratorParameters(cls):
-    return cls._PREFIX_TEST_DATA_GEN_PARAMS
-
-  @classmethod
-  def GetPrefixScore(cls):
-    return cls._PREFIX_SCORE
-
-  def Run(self, config_filepaths, capture_input_filepaths,
-          test_data_generator_names, eval_score_names, output_dir,
-          render_input_filepaths=None, echo_path_simulator_name=(
-              echo_path_simulation.NoEchoPathSimulator.NAME)):
-    """Runs the APM simulation.
-
-    Initializes paths and required instances, then runs all the simulations.
-    The render input can be optionally added. If added, the number of capture
-    input audio tracks and the number of render input audio tracks have to be
-    equal. The two lists are used to form pairs of capture and render input.
-
-    Args:
-      config_filepaths: set of APM configuration files to test.
-      capture_input_filepaths: set of capture input audio track files to test.
-      test_data_generator_names: set of test data generator names to test.
-      eval_score_names: set of evaluation score names to test.
-      output_dir: base path to the output directory for wav files and outcomes.
-      render_input_filepaths: set of render input audio track files to test.
-      echo_path_simulator_name: name of the echo path simulator to use when
-                                render input is provided.
-    """
-    assert render_input_filepaths is None or (
-        len(capture_input_filepaths) == len(render_input_filepaths)), (
-            'render input set size not matching input set size')
-    assert render_input_filepaths is None or echo_path_simulator_name in (
-        echo_path_simulation.EchoPathSimulator.REGISTERED_CLASSES), (
-            'invalid echo path simulator')
-    self._base_output_path = os.path.abspath(output_dir)
-
-    # Instance test data generators.
-    self._test_data_generators = [self._test_data_generator_factory.GetInstance(
-        test_data_generators_class=(
-            self._TEST_DATA_GENERATOR_CLASSES[name])) for name in (
-                test_data_generator_names)]
-
-    # Instance evaluation score workers.
-    self._evaluation_score_workers = [
-        self._evaluation_score_factory.GetInstance(
-            evaluation_score_class=self._EVAL_SCORE_WORKER_CLASSES[name]) for (
-                name) in eval_score_names]
-
-    # Set APM configuration file paths.
-    self._config_filepaths = self._CreatePathsCollection(config_filepaths)
-
-    # Set probing signal file paths.
-    if render_input_filepaths is None:
-      # Capture input only.
-      self._capture_input_filepaths = self._CreatePathsCollection(
-          capture_input_filepaths)
-      self._render_input_filepaths = None
-    else:
-      # Set both capture and render input signals.
-      self._SetTestInputSignalFilePaths(
-          capture_input_filepaths, render_input_filepaths)
-
-    # Set the echo path simulator class.
-    self._echo_path_simulator_class = (
-        echo_path_simulation.EchoPathSimulator.REGISTERED_CLASSES[
-            echo_path_simulator_name])
-
-    self._SimulateAll()
-
-  def _SimulateAll(self):
-    """Runs all the simulations.
-
-    Iterates over the combinations of APM configurations, probing signals, and
-    test data generators. This method is mainly responsible for the creation of
-    the cache and output directories required in order to call _Simulate().
-    """
-    without_render_input = self._render_input_filepaths is None
-
-    # Try different APM config files.
-    for config_name in self._config_filepaths:
-      config_filepath = self._config_filepaths[config_name]
-
-      # Try different capture-render pairs.
-      for capture_input_name in self._capture_input_filepaths:
-        capture_input_filepath = self._capture_input_filepaths[
-            capture_input_name]
-        render_input_filepath = None if without_render_input else (
-            self._render_input_filepaths[capture_input_name])
-        render_input_name = '(none)' if without_render_input else (
-            self._ExtractFileName(render_input_filepath))
-
-        # Instance echo path simulator (if needed).
-        echo_path_simulator = (
-            echo_path_simulation_factory.EchoPathSimulatorFactory.GetInstance(
-                self._echo_path_simulator_class, render_input_filepath))
-
-        # Try different test data generators.
-        for test_data_generators in self._test_data_generators:
-          logging.info('APM config preset: <%s>, capture: <%s>, render: <%s>,'
-                       'test data generator: <%s>,  echo simulator: <%s>',
-                       config_name, capture_input_name, render_input_name,
-                       test_data_generators.NAME, echo_path_simulator.NAME)
-
-          # Output path for the generated test data.
-          # The path is used to cache the signals shared across simulations.
-          test_data_cache_path = os.path.join(
-              self._base_output_path, '_cache',
-              self._PREFIX_CAPTURE + capture_input_name,
-              self._PREFIX_TEST_DATA_GEN + test_data_generators.NAME)
-          data_access.MakeDirectory(test_data_cache_path)
-          logging.debug('test data cache path: <%s>', test_data_cache_path)
-
-          # Output path for the echo simulator and APM input mixer output.
-          echo_test_data_cache_path = os.path.join(
-              test_data_cache_path, 'echosim-{}'.format(
-                  echo_path_simulator.NAME))
-          data_access.MakeDirectory(echo_test_data_cache_path)
-          logging.debug('echo test data cache path: <%s>',
-                        echo_test_data_cache_path)
-
-          # Full output path.
-          output_path = os.path.join(
-              self._base_output_path,
-              self._PREFIX_APM_CONFIG + config_name,
-              self._PREFIX_CAPTURE + capture_input_name,
-              self._PREFIX_RENDER + render_input_name,
-              self._PREFIX_ECHO_SIMULATOR + echo_path_simulator.NAME,
-              self._PREFIX_TEST_DATA_GEN + test_data_generators.NAME)
-          data_access.MakeDirectory(output_path)
-          logging.debug('output path: <%s>', output_path)
-
-          self._Simulate(test_data_generators, capture_input_filepath,
-                         render_input_filepath, test_data_cache_path,
-                         echo_test_data_cache_path, output_path,
-                         config_filepath, echo_path_simulator)
-
-  def _Simulate(self, test_data_generators, clean_capture_input_filepath,
-                render_input_filepath, test_data_cache_path,
-                echo_test_data_cache_path, output_path, config_filepath,
-                echo_path_simulator):
-    """Runs a single set of simulation.
-
-    Simulates a given combination of APM configuration, probing signal, and
-    test data generator. It iterates over the test data generator
-    internal configurations.
-
-    Args:
-      test_data_generators: TestDataGenerator instance.
-      clean_capture_input_filepath: capture input audio track file to be
-                                    processed by a test data generator and
-                                    not affected by echo.
-      render_input_filepath: render input audio track file to test.
-      test_data_cache_path: path for the generated test audio track files.
-      echo_test_data_cache_path: path for the echo simulator.
-      output_path: base output path for the test data generator.
-      config_filepath: APM configuration file to test.
-      echo_path_simulator: EchoPathSimulator instance.
-    """
-    # Generate pairs of noisy input and reference signal files.
-    test_data_generators.Generate(
-        input_signal_filepath=clean_capture_input_filepath,
-        test_data_cache_path=test_data_cache_path,
-        base_output_path=output_path)
-
-    # For each test data pair, simulate a call and evaluate.
-    for config_name in test_data_generators.config_names:
-      logging.info(' - test data generator config: <%s>', config_name)
-
-      # Paths to the test data generator output.
-      # Note that the reference signal does not depend on the render input
-      # which is optional.
-      noisy_capture_input_filepath = (
-          test_data_generators.noisy_signal_filepaths[config_name])
-      reference_signal_filepath = (
-          test_data_generators.reference_signal_filepaths[config_name])
-
-      # Output path for the evaluation (e.g., APM output file).
-      evaluation_output_path = test_data_generators.apm_output_paths[
-          config_name]
-
-      # Paths to the APM input signals.
-      echo_path_filepath = echo_path_simulator.Simulate(
-          echo_test_data_cache_path)
-      apm_input_filepath = input_mixer.ApmInputMixer.Mix(
-          echo_test_data_cache_path, noisy_capture_input_filepath,
-          echo_path_filepath)
-
-      # Simulate a call using APM.
-      self._audioproc_wrapper.Run(
-          config_filepath=config_filepath,
-          capture_input_filepath=apm_input_filepath,
-          render_input_filepath=render_input_filepath,
-          output_path=evaluation_output_path)
-
-      # Evaluate.
-      self._evaluator.Run(
-          evaluation_score_workers=self._evaluation_score_workers,
-          apm_output_filepath=self._audioproc_wrapper.output_filepath,
-          reference_input_filepath=reference_signal_filepath,
-          output_path=evaluation_output_path)
-
-      # Save simulation metadata.
-      data_access.Metadata.SaveAudioTestDataPaths(
-          output_path=evaluation_output_path,
-          clean_capture_input_filepath=clean_capture_input_filepath,
-          echo_free_capture_filepath=noisy_capture_input_filepath,
-          echo_filepath=echo_path_filepath,
-          render_filepath=render_input_filepath,
-          capture_filepath=apm_input_filepath,
-          apm_output_filepath=self._audioproc_wrapper.output_filepath,
-          apm_reference_filepath=reference_signal_filepath)
-
-  def _SetTestInputSignalFilePaths(self, capture_input_filepaths,
-                                   render_input_filepaths):
-    """Sets input and render input file paths collections.
-
-    Pairs the input and render input files by storing the file paths into two
-    collections. The key is the file name of the input file.
-
-    Args:
-      capture_input_filepaths: list of file paths.
-      render_input_filepaths: list of file paths.
-    """
-    self._capture_input_filepaths = {}
-    self._render_input_filepaths = {}
-    assert len(capture_input_filepaths) == len(render_input_filepaths)
-    for capture_input_filepath, render_input_filepath in zip(
-        capture_input_filepaths, render_input_filepaths):
-      name = self._ExtractFileName(capture_input_filepath)
-      self._capture_input_filepaths[name] = os.path.abspath(
-          capture_input_filepath)
-      self._render_input_filepaths[name] = os.path.abspath(
-          render_input_filepath)
-
-  @classmethod
-  def _CreatePathsCollection(cls, filepaths):
-    """Creates a collection of file paths.
-
-    Given a list of file paths, makes a collection with one item for each file
-    path. The value is absolute path, the key is the file name without
-    extenstion.
-
-    Args:
-      filepaths: list of file paths.
-
-    Returns:
-      A dict.
-    """
-    filepaths_collection = {}
-    for filepath in filepaths:
-      name = cls._ExtractFileName(filepath)
-      filepaths_collection[name] = os.path.abspath(filepath)
-    return filepaths_collection
-
-  @classmethod
-  def _ExtractFileName(cls, filepath):
-    return os.path.splitext(os.path.split(filepath)[-1])[0]
diff --git a/modules/audio_processing/test/py_quality_assessment/quality_assessment/simulation_unittest.py b/modules/audio_processing/test/py_quality_assessment/quality_assessment/simulation_unittest.py
deleted file mode 100644
index 544ad97..0000000
--- a/modules/audio_processing/test/py_quality_assessment/quality_assessment/simulation_unittest.py
+++ /dev/null
@@ -1,89 +0,0 @@
-# Copyright (c) 2017 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.
-
-"""Unit tests for the simulation module.
-"""
-
-import os
-import shutil
-import sys
-import tempfile
-import unittest
-
-SRC = os.path.abspath(os.path.join(
-    os.path.dirname((__file__)), os.pardir, os.pardir, os.pardir, os.pardir))
-sys.path.append(os.path.join(SRC, 'third_party', 'pymock'))
-
-import mock
-import pydub
-
-from . import audioproc_wrapper
-from . import evaluation
-from . import signal_processing
-from . import simulation
-
-
-class TestApmModuleSimulator(unittest.TestCase):
-  """Unit tests for the ApmModuleSimulator class.
-  """
-
-  def setUp(self):
-    """Create temporary folder and fake audio track."""
-    self._output_path = tempfile.mkdtemp()
-
-    silence = pydub.AudioSegment.silent(duration=1000, frame_rate=48000)
-    fake_signal = signal_processing.SignalProcessingUtils.GenerateWhiteNoise(
-        silence)
-    self._fake_audio_track_path = os.path.join(self._output_path, 'fake.wav')
-    signal_processing.SignalProcessingUtils.SaveWav(
-        self._fake_audio_track_path, fake_signal)
-
-  def tearDown(self):
-    """Recursively delete temporary folders."""
-    shutil.rmtree(self._output_path)
-
-  def testSimulation(self):
-    # Instance dependencies to inject and mock.
-    ap_wrapper = audioproc_wrapper.AudioProcWrapper()
-    evaluator = evaluation.ApmModuleEvaluator()
-    ap_wrapper.Run = mock.MagicMock(name='Run')
-    evaluator.Run = mock.MagicMock(name='Run')
-
-    # Instance simulator.
-    simulator = simulation.ApmModuleSimulator(
-        aechen_ir_database_path='',
-        polqa_tool_bin_path=os.path.join(
-            os.path.dirname(__file__), 'fake_polqa'),
-        ap_wrapper=ap_wrapper,
-        evaluator=evaluator)
-
-    # What to simulate.
-    config_files = ['apm_configs/default.json']
-    input_files = [self._fake_audio_track_path]
-    test_data_generators = ['identity', 'white_noise']
-    eval_scores = ['audio_level_mean', 'polqa']
-
-    # Run all simulations.
-    simulator.Run(
-        config_filepaths=config_files,
-        capture_input_filepaths=input_files,
-        test_data_generator_names=test_data_generators,
-        eval_score_names=eval_scores,
-        output_dir=self._output_path)
-
-    # Check.
-    # TODO(alessiob): Once the TestDataGenerator classes can be configured by
-    # the client code (e.g., number of SNR pairs for the white noise teste data
-    # gnerator), the exact number of calls to ap_wrapper.Run and evaluator.Run
-    # is known; use that with assertEqual.
-    min_number_of_simulations = len(config_files) * len(input_files) * len(
-        test_data_generators)
-    self.assertGreaterEqual(len(ap_wrapper.Run.call_args_list),
-                            min_number_of_simulations)
-    self.assertGreaterEqual(len(evaluator.Run.call_args_list),
-                            min_number_of_simulations)
diff --git a/modules/audio_processing/test/py_quality_assessment/quality_assessment/test_data_generation.py b/modules/audio_processing/test/py_quality_assessment/quality_assessment/test_data_generation.py
deleted file mode 100644
index 3d54da5..0000000
--- a/modules/audio_processing/test/py_quality_assessment/quality_assessment/test_data_generation.py
+++ /dev/null
@@ -1,536 +0,0 @@
-# Copyright (c) 2017 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.
-
-"""Test data generators producing signals pairs intended to be used to
-test the APM module. Each pair consists of a noisy input and a reference signal.
-The former is used as APM input and it is generated by adding noise to a
-clean audio track. The reference is the expected APM output.
-
-Throughout this file, the following naming convention is used:
-  - input signal: the clean signal (e.g., speech),
-  - noise signal: the noise to be summed up to the input signal (e.g., white
-    noise, Gaussian noise),
-  - noisy signal: input + noise.
-The noise signal may or may not be a function of the clean signal. For
-instance, white noise is independently generated, whereas reverberation is
-obtained by convolving the input signal with an impulse response.
-"""
-
-import logging
-import os
-import sys
-
-try:
-  import scipy.io
-except ImportError:
-  logging.critical('Cannot import the third-party Python package scipy')
-  sys.exit(1)
-
-from . import data_access
-from . import exceptions
-from . import input_signal_creator
-from . import signal_processing
-
-
-class TestDataGenerator(object):
-  """Abstract class responsible for the generation of noisy signals.
-
-  Given a clean signal, it generates two streams named noisy signal and
-  reference. The former is the clean signal deteriorated by the noise source,
-  the latter goes through the same deterioration process, but more "gently".
-  Noisy signal and reference are produced so that the reference is the signal
-  expected at the output of the APM module when the latter is fed with the noisy
-  signal.
-
-  An test data generator generates one or more pairs.
-  """
-
-  NAME = None
-  REGISTERED_CLASSES = {}
-
-  def __init__(self, output_directory_prefix):
-    self._output_directory_prefix = output_directory_prefix
-    # Init dictionaries with one entry for each test data generator
-    # configuration (e.g., different SNRs).
-    # Noisy audio track files (stored separately in a cache folder).
-    self._noisy_signal_filepaths = None
-    # Path to be used for the APM simulation output files.
-    self._apm_output_paths = None
-    # Reference audio track files (stored separately in a cache folder).
-    self._reference_signal_filepaths = None
-    self.Clear()
-
-  @classmethod
-  def RegisterClass(cls, class_to_register):
-    """Registers a TestDataGenerator implementation.
-
-    Decorator to automatically register the classes that extend
-    TestDataGenerator.
-    Example usage:
-
-    @TestDataGenerator.RegisterClass
-    class IdentityGenerator(TestDataGenerator):
-      pass
-    """
-    cls.REGISTERED_CLASSES[class_to_register.NAME] = class_to_register
-    return class_to_register
-
-  @property
-  def config_names(self):
-    return self._noisy_signal_filepaths.keys()
-
-  @property
-  def noisy_signal_filepaths(self):
-    return self._noisy_signal_filepaths
-
-  @property
-  def apm_output_paths(self):
-    return self._apm_output_paths
-
-  @property
-  def reference_signal_filepaths(self):
-    return self._reference_signal_filepaths
-
-  def Generate(
-      self, input_signal_filepath, test_data_cache_path, base_output_path):
-    """Generates a set of noisy input and reference audiotrack file pairs.
-
-    This method initializes an empty set of pairs and calls the _Generate()
-    method implemented in a concrete class.
-
-    Args:
-      input_signal_filepath: path to the clean input audio track file.
-      test_data_cache_path: path to the cache of the generated audio track
-                            files.
-      base_output_path: base path where output is written.
-    """
-    self.Clear()
-
-    # If the input signal file does not exist, try to create using the
-    # available input signal creators.
-    if not os.path.exists(input_signal_filepath):
-      self._CreateInputSignal(input_signal_filepath)
-
-    self._Generate(
-        input_signal_filepath, test_data_cache_path, base_output_path)
-
-  def Clear(self):
-    """Clears the generated output path dictionaries.
-    """
-    self._noisy_signal_filepaths = {}
-    self._apm_output_paths = {}
-    self._reference_signal_filepaths = {}
-
-  @classmethod
-  def _CreateInputSignal(cls, input_signal_filepath):
-    """Creates a missing input signal file.
-
-    The file name is parsed to extract input signal creator and params. If a
-    creator is matched and the parameters are valid, a new signal is generated
-    and written in |input_signal_filepath|.
-
-    Args:
-      input_signal_filepath: Path to the input signal audio file to write.
-
-    Raises:
-      InputSignalCreatorException
-    """
-    filename = os.path.splitext(os.path.split(input_signal_filepath)[-1])[0]
-    filename_parts = filename.split('-')
-
-    if len(filename_parts) < 2:
-      raise exceptions.InputSignalCreatorException(
-          'Cannot parse input signal file name')
-
-    signal = input_signal_creator.InputSignalCreator.Create(
-        filename_parts[0], filename_parts[1].split('_'))
-
-    signal_processing.SignalProcessingUtils.SaveWav(
-        input_signal_filepath, signal)
-
-  def _Generate(
-      self, input_signal_filepath, test_data_cache_path, base_output_path):
-    """Abstract method to be implemented in each concrete class.
-    """
-    raise NotImplementedError()
-
-  def _AddNoiseSnrPairs(self, base_output_path, noisy_mix_filepaths,
-                        snr_value_pairs):
-    """Adds noisy-reference signal pairs.
-
-    Args:
-      base_output_path: noisy tracks base output path.
-      noisy_mix_filepaths: nested dictionary of noisy signal paths organized
-                           by noisy track name and SNR level.
-      snr_value_pairs: list of SNR pairs.
-    """
-    for noise_track_name in noisy_mix_filepaths:
-      for snr_noisy, snr_refence in snr_value_pairs:
-        config_name = '{0}_{1:d}_{2:d}_SNR'.format(
-            noise_track_name, snr_noisy, snr_refence)
-        output_path = self._MakeDir(base_output_path, config_name)
-        self._AddNoiseReferenceFilesPair(
-            config_name=config_name,
-            noisy_signal_filepath=noisy_mix_filepaths[
-                noise_track_name][snr_noisy],
-            reference_signal_filepath=noisy_mix_filepaths[
-                noise_track_name][snr_refence],
-            output_path=output_path)
-
-  def _AddNoiseReferenceFilesPair(self, config_name, noisy_signal_filepath,
-                                  reference_signal_filepath, output_path):
-    """Adds one noisy-reference signal pair.
-
-    Args:
-      config_name: name of the APM configuration.
-      noisy_signal_filepath: path to noisy audio track file.
-      reference_signal_filepath: path to reference audio track file.
-      output_path: APM output path.
-    """
-    assert config_name not in self._noisy_signal_filepaths
-    self._noisy_signal_filepaths[config_name] = os.path.abspath(
-        noisy_signal_filepath)
-    self._apm_output_paths[config_name] = os.path.abspath(output_path)
-    self._reference_signal_filepaths[config_name] = os.path.abspath(
-        reference_signal_filepath)
-
-  def _MakeDir(self, base_output_path, test_data_generator_config_name):
-    output_path = os.path.join(
-        base_output_path,
-        self._output_directory_prefix + test_data_generator_config_name)
-    data_access.MakeDirectory(output_path)
-    return output_path
-
-
-@TestDataGenerator.RegisterClass
-class IdentityTestDataGenerator(TestDataGenerator):
-  """Generator that adds no noise.
-
-  Both the noisy and the reference signals are the input signal.
-  """
-
-  NAME = 'identity'
-
-  def __init__(self, output_directory_prefix):
-    TestDataGenerator.__init__(self, output_directory_prefix)
-
-  def _Generate(
-      self, input_signal_filepath, test_data_cache_path, base_output_path):
-    config_name = 'default'
-    output_path = self._MakeDir(base_output_path, config_name)
-    self._AddNoiseReferenceFilesPair(
-        config_name=config_name,
-        noisy_signal_filepath=input_signal_filepath,
-        reference_signal_filepath=input_signal_filepath,
-        output_path=output_path)
-
-
-@TestDataGenerator.RegisterClass
-class WhiteNoiseTestDataGenerator(TestDataGenerator):
-  """Generator that adds white noise.
-  """
-
-  NAME = 'white_noise'
-
-  # Each pair indicates the clean vs. noisy and reference vs. noisy SNRs.
-  # The reference (second value of each pair) always has a lower amount of noise
-  # - i.e., the SNR is 10 dB higher.
-  _SNR_VALUE_PAIRS = [
-      [20, 30],  # Smallest noise.
-      [10, 20],
-      [5, 15],
-      [0, 10],  # Largest noise.
-  ]
-
-  _NOISY_SIGNAL_FILENAME_TEMPLATE = 'noise_{0:d}_SNR.wav'
-
-  def __init__(self, output_directory_prefix):
-    TestDataGenerator.__init__(self, output_directory_prefix)
-
-  def _Generate(
-      self, input_signal_filepath, test_data_cache_path, base_output_path):
-    # Load the input signal.
-    input_signal = signal_processing.SignalProcessingUtils.LoadWav(
-        input_signal_filepath)
-    input_signal = signal_processing.SignalProcessingUtils.Normalize(
-      input_signal)
-
-    # Create the noise track.
-    noise_signal = signal_processing.SignalProcessingUtils.GenerateWhiteNoise(
-        input_signal)
-    noise_signal = signal_processing.SignalProcessingUtils.Normalize(
-        noise_signal)
-
-    # Create the noisy mixes (once for each unique SNR value).
-    noisy_mix_filepaths = {}
-    snr_values = set([snr for pair in self._SNR_VALUE_PAIRS for snr in pair])
-    for snr in snr_values:
-      noisy_signal_filepath = os.path.join(
-          test_data_cache_path,
-          self._NOISY_SIGNAL_FILENAME_TEMPLATE.format(snr))
-
-      # Create and save if not done.
-      if not os.path.exists(noisy_signal_filepath):
-        # Create noisy signal.
-        noisy_signal = signal_processing.SignalProcessingUtils.MixSignals(
-            input_signal, noise_signal, snr)
-
-        # Save.
-        signal_processing.SignalProcessingUtils.SaveWav(
-            noisy_signal_filepath, noisy_signal)
-
-      # Add file to the collection of mixes.
-      noisy_mix_filepaths[snr] = noisy_signal_filepath
-
-    # Add all the noisy-reference signal pairs.
-    for snr_noisy, snr_refence in self._SNR_VALUE_PAIRS:
-      config_name = '{0:d}_{1:d}_SNR'.format(snr_noisy, snr_refence)
-      output_path = self._MakeDir(base_output_path, config_name)
-      self._AddNoiseReferenceFilesPair(
-          config_name=config_name,
-          noisy_signal_filepath=noisy_mix_filepaths[snr_noisy],
-          reference_signal_filepath=noisy_mix_filepaths[snr_refence],
-          output_path=output_path)
-
-
-# TODO(alessiob): remove comment when class implemented.
-# @TestDataGenerator.RegisterClass
-class NarrowBandNoiseTestDataGenerator(TestDataGenerator):
-  """Generator that adds narrow-band noise.
-  """
-
-  NAME = 'narrow_band_noise'
-
-  def __init__(self, output_directory_prefix):
-    TestDataGenerator.__init__(self, output_directory_prefix)
-
-  def _Generate(
-      self, input_signal_filepath, test_data_cache_path, base_output_path):
-    # TODO(alessiob): implement.
-    pass
-
-
-@TestDataGenerator.RegisterClass
-class EnvironmentalNoiseTestDataGenerator(TestDataGenerator):
-  """Generator that adds environmental noise.
-
-  TODO(alessiob): Make the class more generic e.g.,
-  MixNoiseTrackTestDataGenerator.
-  """
-
-  NAME = 'environmental_noise'
-  _NOISY_SIGNAL_FILENAME_TEMPLATE = '{0}_{1:d}_SNR.wav'
-
-  # TODO(alessiob): allow the user to store the noise tracks in a custom path.
-  _NOISE_TRACKS_PATH = os.path.join(
-      os.path.dirname(__file__), os.pardir, 'noise_tracks')
-
-  # TODO(alessiob): Allow the user to have custom noise tracks.
-  # TODO(alessiob): Exploit TestDataGeneratorFactory.GetInstance().
-  _NOISE_TRACKS = [
-      'city.wav'
-  ]
-
-  # Each pair indicates the clean vs. noisy and reference vs. noisy SNRs.
-  # The reference (second value of each pair) always has a lower amount of noise
-  # - i.e., the SNR is 10 dB higher.
-  _SNR_VALUE_PAIRS = [
-      [20, 30],  # Smallest noise.
-      [10, 20],
-      [5, 15],
-      [0, 10],  # Largest noise.
-  ]
-
-  def __init__(self, output_directory_prefix):
-    TestDataGenerator.__init__(self, output_directory_prefix)
-
-  def _Generate(
-      self, input_signal_filepath, test_data_cache_path, base_output_path):
-    """Generates test data pairs using environmental noise.
-
-    For each noise track and pair of SNR values, the following two audio tracks
-    are created: the noisy signal and the reference signal. The former is
-    obtained by mixing the (clean) input signal to the corresponding noise
-    track enforcing the target SNR.
-    """
-    # Init.
-    snr_values = set([snr for pair in self._SNR_VALUE_PAIRS for snr in pair])
-
-    # Load the input signal.
-    input_signal = signal_processing.SignalProcessingUtils.LoadWav(
-        input_signal_filepath)
-    input_signal = signal_processing.SignalProcessingUtils.Normalize(
-        input_signal)
-
-    noisy_mix_filepaths = {}
-    for noise_track_filename in self._NOISE_TRACKS:
-      # Load the noise track.
-      noise_track_name, _ = os.path.splitext(noise_track_filename)
-      noise_track_filepath = os.path.join(
-          self._NOISE_TRACKS_PATH, noise_track_filename)
-      if not os.path.exists(noise_track_filepath):
-        logging.error('cannot find the <%s> noise track', noise_track_filename)
-        raise exceptions.FileNotFoundError()
-
-      noise_signal = signal_processing.SignalProcessingUtils.LoadWav(
-          noise_track_filepath)
-      noise_signal = signal_processing.SignalProcessingUtils.Normalize(
-          noise_signal)
-
-      # Create the noisy mixes (once for each unique SNR value).
-      noisy_mix_filepaths[noise_track_name] = {}
-      for snr in snr_values:
-        noisy_signal_filepath = os.path.join(
-            test_data_cache_path,
-            self._NOISY_SIGNAL_FILENAME_TEMPLATE.format(noise_track_name, snr))
-
-        # Create and save if not done.
-        if not os.path.exists(noisy_signal_filepath):
-          # Create noisy signal.
-          noisy_signal = signal_processing.SignalProcessingUtils.MixSignals(
-              input_signal, noise_signal, snr)
-
-          # Save.
-          signal_processing.SignalProcessingUtils.SaveWav(
-              noisy_signal_filepath, noisy_signal)
-
-        # Add file to the collection of mixes.
-        noisy_mix_filepaths[noise_track_name][snr] = noisy_signal_filepath
-
-    # Add all the noise-SNR pairs.
-    self._AddNoiseSnrPairs(
-        base_output_path, noisy_mix_filepaths, self._SNR_VALUE_PAIRS)
-
-
-@TestDataGenerator.RegisterClass
-class ReverberationTestDataGenerator(TestDataGenerator):
-  """Generator that adds reverberation noise.
-
-  TODO(alessiob): Make this class more generic since the impulse response can be
-  anything (not just reverberation); call it e.g.,
-  ConvolutionalNoiseTestDataGenerator.
-  """
-
-  NAME = 'reverberation'
-
-  _IMPULSE_RESPONSES = {
-      'lecture': 'air_binaural_lecture_0_0_1.mat',  # Long echo.
-      'booth': 'air_binaural_booth_0_0_1.mat',  # Short echo.
-  }
-  _MAX_IMPULSE_RESPONSE_LENGTH = None
-
-  # Each pair indicates the clean vs. noisy and reference vs. noisy SNRs.
-  # The reference (second value of each pair) always has a lower amount of noise
-  # - i.e., the SNR is 5 dB higher.
-  _SNR_VALUE_PAIRS = [
-      [3, 8],  # Smallest noise.
-      [-3, 2],  # Largest noise.
-  ]
-
-  _NOISE_TRACK_FILENAME_TEMPLATE = '{0}.wav'
-  _NOISY_SIGNAL_FILENAME_TEMPLATE = '{0}_{1:d}_SNR.wav'
-
-  def __init__(self, output_directory_prefix, aechen_ir_database_path):
-    TestDataGenerator.__init__(self, output_directory_prefix)
-    self._aechen_ir_database_path = aechen_ir_database_path
-
-  def _Generate(
-      self, input_signal_filepath, test_data_cache_path, base_output_path):
-    """Generates test data pairs using reverberation noise.
-
-    For each impulse response, one noise track is created. For each impulse
-    response and pair of SNR values, the following 2 audio tracks are
-    created: the noisy signal and the reference signal. The former is
-    obtained by mixing the (clean) input signal to the corresponding noise
-    track enforcing the target SNR.
-    """
-    # Init.
-    snr_values = set([snr for pair in self._SNR_VALUE_PAIRS for snr in pair])
-
-    # Load the input signal.
-    input_signal = signal_processing.SignalProcessingUtils.LoadWav(
-        input_signal_filepath)
-
-    noisy_mix_filepaths = {}
-    for impulse_response_name in self._IMPULSE_RESPONSES:
-      noise_track_filename = self._NOISE_TRACK_FILENAME_TEMPLATE.format(
-          impulse_response_name)
-      noise_track_filepath = os.path.join(
-          test_data_cache_path, noise_track_filename)
-      noise_signal = None
-      try:
-        # Load noise track.
-        noise_signal = signal_processing.SignalProcessingUtils.LoadWav(
-            noise_track_filepath)
-      except exceptions.FileNotFoundError:
-        # Generate noise track by applying the impulse response.
-        impulse_response_filepath = os.path.join(
-            self._aechen_ir_database_path,
-            self._IMPULSE_RESPONSES[impulse_response_name])
-        noise_signal = self._GenerateNoiseTrack(
-            noise_track_filepath, input_signal, impulse_response_filepath)
-      assert noise_signal is not None
-
-      # Create the noisy mixes (once for each unique SNR value).
-      noisy_mix_filepaths[impulse_response_name] = {}
-      for snr in snr_values:
-        noisy_signal_filepath = os.path.join(
-            test_data_cache_path,
-            self._NOISY_SIGNAL_FILENAME_TEMPLATE.format(
-                impulse_response_name, snr))
-
-        # Create and save if not done.
-        if not os.path.exists(noisy_signal_filepath):
-          # Create noisy signal.
-          noisy_signal = signal_processing.SignalProcessingUtils.MixSignals(
-              input_signal, noise_signal, snr, bln_pad_shortest=True)
-
-          # Save.
-          signal_processing.SignalProcessingUtils.SaveWav(
-              noisy_signal_filepath, noisy_signal)
-
-        # Add file to the collection of mixes.
-        noisy_mix_filepaths[impulse_response_name][snr] = noisy_signal_filepath
-
-    # Add all the noise-SNR pairs.
-    self._AddNoiseSnrPairs(base_output_path, noisy_mix_filepaths,
-                           self._SNR_VALUE_PAIRS)
-
-  def _GenerateNoiseTrack(self, noise_track_filepath, input_signal,
-                            impulse_response_filepath):
-    """Generates noise track.
-
-    Generate a signal by convolving input_signal with the impulse response in
-    impulse_response_filepath; then save to noise_track_filepath.
-
-    Args:
-      noise_track_filepath: output file path for the noise track.
-      input_signal: (clean) input signal samples.
-      impulse_response_filepath: impulse response file path.
-
-    Returns:
-      AudioSegment instance.
-    """
-    # Load impulse response.
-    data = scipy.io.loadmat(impulse_response_filepath)
-    impulse_response = data['h_air'].flatten()
-    if self._MAX_IMPULSE_RESPONSE_LENGTH is not None:
-      logging.info('truncating impulse response from %d to %d samples',
-                   len(impulse_response), self._MAX_IMPULSE_RESPONSE_LENGTH)
-      impulse_response = impulse_response[:self._MAX_IMPULSE_RESPONSE_LENGTH]
-
-    # Apply impulse response.
-    processed_signal = (
-        signal_processing.SignalProcessingUtils.ApplyImpulseResponse(
-            input_signal, impulse_response))
-
-    # Save.
-    signal_processing.SignalProcessingUtils.SaveWav(
-        noise_track_filepath, processed_signal)
-
-    return processed_signal
diff --git a/modules/audio_processing/test/py_quality_assessment/quality_assessment/test_data_generation_factory.py b/modules/audio_processing/test/py_quality_assessment/quality_assessment/test_data_generation_factory.py
deleted file mode 100644
index b42d3af..0000000
--- a/modules/audio_processing/test/py_quality_assessment/quality_assessment/test_data_generation_factory.py
+++ /dev/null
@@ -1,44 +0,0 @@
-# Copyright (c) 2017 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.
-
-"""TestDataGenerator factory class.
-"""
-
-import logging
-
-from . import test_data_generation
-
-
-class TestDataGeneratorFactory(object):
-  """Factory class used to create test data generators.
-
-  Usage: Create a factory passing parameters to the ctor with which the
-  generators will be produced.
-  """
-
-  def __init__(self, output_directory_prefix, aechen_ir_database_path):
-    self._output_directory_prefix = output_directory_prefix
-    self._aechen_ir_database_path = aechen_ir_database_path
-
-  def GetInstance(self, test_data_generators_class):
-    """Creates an TestDataGenerator instance given a class object.
-
-    Args:
-      test_data_generators_class: TestDataGenerator class object (not an
-                                  instance).
-
-    Returns:
-      TestDataGenerator instance.
-    """
-    logging.debug('factory producing %s', test_data_generators_class)
-    if test_data_generators_class == (
-        test_data_generation.ReverberationTestDataGenerator):
-      return test_data_generation.ReverberationTestDataGenerator(
-          self._output_directory_prefix, self._aechen_ir_database_path)
-    else:
-      return test_data_generators_class(self._output_directory_prefix)
diff --git a/modules/audio_processing/test/py_quality_assessment/quality_assessment/test_data_generation_unittest.py b/modules/audio_processing/test/py_quality_assessment/quality_assessment/test_data_generation_unittest.py
deleted file mode 100644
index 6239d51..0000000
--- a/modules/audio_processing/test/py_quality_assessment/quality_assessment/test_data_generation_unittest.py
+++ /dev/null
@@ -1,175 +0,0 @@
-# Copyright (c) 2017 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.
-
-"""Unit tests for the test_data_generation module.
-"""
-
-import os
-import shutil
-import tempfile
-import unittest
-
-import numpy as np
-import scipy.io
-
-from . import test_data_generation
-from . import test_data_generation_factory
-from . import signal_processing
-
-
-class TestTestDataGenerators(unittest.TestCase):
-  """Unit tests for the test_data_generation module.
-  """
-
-  def setUp(self):
-    """Create temporary folders."""
-    self._base_output_path = tempfile.mkdtemp()
-    self._test_data_cache_path = tempfile.mkdtemp()
-    self._fake_air_db_path = tempfile.mkdtemp()
-
-    # Fake AIR DB impulse responses.
-    # TODO(alessiob): ReverberationTestDataGenerator will change to allow custom
-    # impulse responses. When changed, the coupling below between
-    # impulse_response_mat_file_names and
-    # ReverberationTestDataGenerator._IMPULSE_RESPONSES can be removed.
-    impulse_response_mat_file_names = [
-        'air_binaural_lecture_0_0_1.mat',
-        'air_binaural_booth_0_0_1.mat',
-    ]
-    for impulse_response_mat_file_name in impulse_response_mat_file_names:
-      data = {'h_air': np.random.rand(1, 1000).astype('<f8')}
-      scipy.io.savemat(os.path.join(
-          self._fake_air_db_path, impulse_response_mat_file_name), data)
-
-  def tearDown(self):
-    """Recursively delete temporary folders."""
-    shutil.rmtree(self._base_output_path)
-    shutil.rmtree(self._test_data_cache_path)
-    shutil.rmtree(self._fake_air_db_path)
-
-  def testInputSignalCreation(self):
-    # Init.
-    generator = test_data_generation.IdentityTestDataGenerator('tmp')
-    input_signal_filepath = os.path.join(
-        self._test_data_cache_path, 'pure_tone-440_1000.wav')
-
-    # Check that the input signal is generated.
-    self.assertFalse(os.path.exists(input_signal_filepath))
-    generator.Generate(
-        input_signal_filepath=input_signal_filepath,
-        test_data_cache_path=self._test_data_cache_path,
-        base_output_path=self._base_output_path)
-    self.assertTrue(os.path.exists(input_signal_filepath))
-
-    # Check input signal properties.
-    input_signal = signal_processing.SignalProcessingUtils.LoadWav(
-        input_signal_filepath)
-    self.assertEqual(1000, len(input_signal))
-
-  def testTestDataGenerators(self):
-    # Preliminary check.
-    self.assertTrue(os.path.exists(self._base_output_path))
-    self.assertTrue(os.path.exists(self._test_data_cache_path))
-
-    # Check that there is at least one registered test data generator.
-    registered_classes = (
-        test_data_generation.TestDataGenerator.REGISTERED_CLASSES)
-    self.assertIsInstance(registered_classes, dict)
-    self.assertGreater(len(registered_classes), 0)
-
-    # Instance generators factory.
-    generators_factory = (
-        test_data_generation_factory.TestDataGeneratorFactory(
-            output_directory_prefix='datagen-',
-            aechen_ir_database_path=self._fake_air_db_path))
-
-    # Use a sample input file as clean input signal.
-    input_signal_filepath = os.path.join(
-        os.getcwd(), 'probing_signals', 'tone-880.wav')
-    self.assertTrue(os.path.exists(input_signal_filepath))
-
-    # Load input signal.
-    input_signal = signal_processing.SignalProcessingUtils.LoadWav(
-        input_signal_filepath)
-
-    # Try each registered test data generator.
-    for generator_name in registered_classes:
-      # Instance test data generator.
-      generator = generators_factory.GetInstance(
-          registered_classes[generator_name])
-
-      # Generate the noisy input - reference pairs.
-      generator.Generate(
-          input_signal_filepath=input_signal_filepath,
-          test_data_cache_path=self._test_data_cache_path,
-          base_output_path=self._base_output_path)
-
-      # Perform checks.
-      self._CheckGeneratedPairsListSizes(generator)
-      self._CheckGeneratedPairsSignalDurations(generator, input_signal)
-      self._CheckGeneratedPairsOutputPaths(generator)
-
-  def _CheckGeneratedPairsListSizes(self, generator):
-    config_names = generator.config_names
-    number_of_pairs = len(config_names)
-    self.assertEqual(number_of_pairs,
-                     len(generator.noisy_signal_filepaths))
-    self.assertEqual(number_of_pairs,
-                     len(generator.apm_output_paths))
-    self.assertEqual(number_of_pairs,
-                     len(generator.reference_signal_filepaths))
-
-  def _CheckGeneratedPairsSignalDurations(
-      self, generator, input_signal):
-    """Checks duration of the generated signals.
-
-    Checks that the noisy input and the reference tracks are audio files
-    with duration equal to or greater than that of the input signal.
-
-    Args:
-      generator: TestDataGenerator instance.
-      input_signal: AudioSegment instance.
-    """
-    input_signal_length = (
-        signal_processing.SignalProcessingUtils.CountSamples(input_signal))
-
-    # Iterate over the noisy signal - reference pairs.
-    for config_name in generator.config_names:
-      # Load the noisy input file.
-      noisy_signal_filepath = generator.noisy_signal_filepaths[
-          config_name]
-      noisy_signal = signal_processing.SignalProcessingUtils.LoadWav(
-          noisy_signal_filepath)
-
-      # Check noisy input signal length.
-      noisy_signal_length = (
-          signal_processing.SignalProcessingUtils.CountSamples(noisy_signal))
-      self.assertGreaterEqual(noisy_signal_length, input_signal_length)
-
-      # Load the reference file.
-      reference_signal_filepath = generator.reference_signal_filepaths[
-          config_name]
-      reference_signal = signal_processing.SignalProcessingUtils.LoadWav(
-          reference_signal_filepath)
-
-      # Check noisy input signal length.
-      reference_signal_length = (
-          signal_processing.SignalProcessingUtils.CountSamples(
-              reference_signal))
-      self.assertGreaterEqual(reference_signal_length, input_signal_length)
-
-  def _CheckGeneratedPairsOutputPaths(self, generator):
-    """Checks that the output path created by the generator exists.
-
-    Args:
-      generator: TestDataGenerator instance.
-    """
-    # Iterate over the noisy signal - reference pairs.
-    for config_name in generator.config_names:
-      output_path = generator.apm_output_paths[config_name]
-      self.assertTrue(os.path.exists(output_path))
diff --git a/modules/audio_processing/test/simulator_buffers.cc b/modules/audio_processing/test/simulator_buffers.cc
deleted file mode 100644
index cecee71..0000000
--- a/modules/audio_processing/test/simulator_buffers.cc
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- *  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_processing/test/simulator_buffers.h"
-
-#include "webrtc/modules/audio_processing/test/audio_buffer_tools.h"
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-namespace test {
-
-SimulatorBuffers::SimulatorBuffers(int render_input_sample_rate_hz,
-                                   int capture_input_sample_rate_hz,
-                                   int render_output_sample_rate_hz,
-                                   int capture_output_sample_rate_hz,
-                                   size_t num_render_input_channels,
-                                   size_t num_capture_input_channels,
-                                   size_t num_render_output_channels,
-                                   size_t num_capture_output_channels) {
-  Random rand_gen(42);
-  CreateConfigAndBuffer(render_input_sample_rate_hz, num_render_input_channels,
-                        &rand_gen, &render_input_buffer, &render_input_config,
-                        &render_input, &render_input_samples);
-
-  CreateConfigAndBuffer(render_output_sample_rate_hz,
-                        num_render_output_channels, &rand_gen,
-                        &render_output_buffer, &render_output_config,
-                        &render_output, &render_output_samples);
-
-  CreateConfigAndBuffer(capture_input_sample_rate_hz,
-                        num_capture_input_channels, &rand_gen,
-                        &capture_input_buffer, &capture_input_config,
-                        &capture_input, &capture_input_samples);
-
-  CreateConfigAndBuffer(capture_output_sample_rate_hz,
-                        num_capture_output_channels, &rand_gen,
-                        &capture_output_buffer, &capture_output_config,
-                        &capture_output, &capture_output_samples);
-
-  UpdateInputBuffers();
-}
-
-SimulatorBuffers::~SimulatorBuffers() = default;
-
-void SimulatorBuffers::CreateConfigAndBuffer(
-    int sample_rate_hz,
-    size_t num_channels,
-    Random* rand_gen,
-    std::unique_ptr<AudioBuffer>* buffer,
-    StreamConfig* config,
-    std::vector<float*>* buffer_data,
-    std::vector<float>* buffer_data_samples) {
-  int samples_per_channel = rtc::CheckedDivExact(sample_rate_hz, 100);
-  *config = StreamConfig(sample_rate_hz, num_channels, false);
-  buffer->reset(new AudioBuffer(config->num_frames(), config->num_channels(),
-                                config->num_frames(), config->num_channels(),
-                                config->num_frames()));
-
-  buffer_data_samples->resize(samples_per_channel * num_channels);
-  for (auto& v : *buffer_data_samples) {
-    v = rand_gen->Rand<float>();
-  }
-
-  buffer_data->resize(num_channels);
-  for (size_t ch = 0; ch < num_channels; ++ch) {
-    (*buffer_data)[ch] = &(*buffer_data_samples)[ch * samples_per_channel];
-  }
-}
-
-void SimulatorBuffers::UpdateInputBuffers() {
-  test::CopyVectorToAudioBuffer(capture_input_config, capture_input_samples,
-                                capture_input_buffer.get());
-  test::CopyVectorToAudioBuffer(render_input_config, render_input_samples,
-                                render_input_buffer.get());
-}
-
-}  // namespace test
-}  // namespace webrtc
diff --git a/modules/audio_processing/test/simulator_buffers.h b/modules/audio_processing/test/simulator_buffers.h
deleted file mode 100644
index 5e66897..0000000
--- a/modules/audio_processing/test/simulator_buffers.h
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- *  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_PROCESSING_TEST_SIMULATOR_BUFFERS_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_TEST_SIMULATOR_BUFFERS_H_
-
-#include <memory>
-#include <vector>
-
-#include "webrtc/modules/audio_processing/audio_buffer.h"
-#include "webrtc/modules/audio_processing/include/audio_processing.h"
-#include "webrtc/rtc_base/random.h"
-
-namespace webrtc {
-namespace test {
-
-struct SimulatorBuffers {
-  SimulatorBuffers(int render_input_sample_rate_hz,
-                   int capture_input_sample_rate_hz,
-                   int render_output_sample_rate_hz,
-                   int capture_output_sample_rate_hz,
-                   size_t num_render_input_channels,
-                   size_t num_capture_input_channels,
-                   size_t num_render_output_channels,
-                   size_t num_capture_output_channels);
-  ~SimulatorBuffers();
-
-  void CreateConfigAndBuffer(int sample_rate_hz,
-                             size_t num_channels,
-                             Random* rand_gen,
-                             std::unique_ptr<AudioBuffer>* buffer,
-                             StreamConfig* config,
-                             std::vector<float*>* buffer_data,
-                             std::vector<float>* buffer_data_samples);
-
-  void UpdateInputBuffers();
-
-  std::unique_ptr<AudioBuffer> render_input_buffer;
-  std::unique_ptr<AudioBuffer> capture_input_buffer;
-  std::unique_ptr<AudioBuffer> render_output_buffer;
-  std::unique_ptr<AudioBuffer> capture_output_buffer;
-  StreamConfig render_input_config;
-  StreamConfig capture_input_config;
-  StreamConfig render_output_config;
-  StreamConfig capture_output_config;
-  std::vector<float*> render_input;
-  std::vector<float> render_input_samples;
-  std::vector<float*> capture_input;
-  std::vector<float> capture_input_samples;
-  std::vector<float*> render_output;
-  std::vector<float> render_output_samples;
-  std::vector<float*> capture_output;
-  std::vector<float> capture_output_samples;
-};
-
-}  // namespace test
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_TEST_SIMULATOR_BUFFERS_H_
diff --git a/modules/audio_processing/test/test_utils.cc b/modules/audio_processing/test/test_utils.cc
deleted file mode 100644
index 7c354d0..0000000
--- a/modules/audio_processing/test/test_utils.cc
+++ /dev/null
@@ -1,158 +0,0 @@
-/*
- *  Copyright (c) 2015 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_processing/test/test_utils.h"
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-
-RawFile::RawFile(const std::string& filename)
-    : file_handle_(fopen(filename.c_str(), "wb")) {}
-
-RawFile::~RawFile() {
-  fclose(file_handle_);
-}
-
-void RawFile::WriteSamples(const int16_t* samples, size_t num_samples) {
-#ifndef WEBRTC_ARCH_LITTLE_ENDIAN
-#error "Need to convert samples to little-endian when writing to PCM file"
-#endif
-  fwrite(samples, sizeof(*samples), num_samples, file_handle_);
-}
-
-void RawFile::WriteSamples(const float* samples, size_t num_samples) {
-  fwrite(samples, sizeof(*samples), num_samples, file_handle_);
-}
-
-ChannelBufferWavReader::ChannelBufferWavReader(std::unique_ptr<WavReader> file)
-    : file_(std::move(file)) {}
-
-ChannelBufferWavReader::~ChannelBufferWavReader() = default;
-
-bool ChannelBufferWavReader::Read(ChannelBuffer<float>* buffer) {
-  RTC_CHECK_EQ(file_->num_channels(), buffer->num_channels());
-  interleaved_.resize(buffer->size());
-  if (file_->ReadSamples(interleaved_.size(), &interleaved_[0]) !=
-      interleaved_.size()) {
-    return false;
-  }
-
-  FloatS16ToFloat(&interleaved_[0], interleaved_.size(), &interleaved_[0]);
-  Deinterleave(&interleaved_[0], buffer->num_frames(), buffer->num_channels(),
-               buffer->channels());
-  return true;
-}
-
-ChannelBufferWavWriter::ChannelBufferWavWriter(std::unique_ptr<WavWriter> file)
-    : file_(std::move(file)) {}
-
-ChannelBufferWavWriter::~ChannelBufferWavWriter() = default;
-
-void ChannelBufferWavWriter::Write(const ChannelBuffer<float>& buffer) {
-  RTC_CHECK_EQ(file_->num_channels(), buffer.num_channels());
-  interleaved_.resize(buffer.size());
-  Interleave(buffer.channels(), buffer.num_frames(), buffer.num_channels(),
-             &interleaved_[0]);
-  FloatToFloatS16(&interleaved_[0], interleaved_.size(), &interleaved_[0]);
-  file_->WriteSamples(&interleaved_[0], interleaved_.size());
-}
-
-void WriteIntData(const int16_t* data,
-                  size_t length,
-                  WavWriter* wav_file,
-                  RawFile* raw_file) {
-  if (wav_file) {
-    wav_file->WriteSamples(data, length);
-  }
-  if (raw_file) {
-    raw_file->WriteSamples(data, length);
-  }
-}
-
-void WriteFloatData(const float* const* data,
-                    size_t samples_per_channel,
-                    size_t num_channels,
-                    WavWriter* wav_file,
-                    RawFile* raw_file) {
-  size_t length = num_channels * samples_per_channel;
-  std::unique_ptr<float[]> buffer(new float[length]);
-  Interleave(data, samples_per_channel, num_channels, buffer.get());
-  if (raw_file) {
-    raw_file->WriteSamples(buffer.get(), length);
-  }
-  // TODO(aluebs): Use ScaleToInt16Range() from audio_util
-  for (size_t i = 0; i < length; ++i) {
-    buffer[i] = buffer[i] > 0 ?
-                buffer[i] * std::numeric_limits<int16_t>::max() :
-                -buffer[i] * std::numeric_limits<int16_t>::min();
-  }
-  if (wav_file) {
-    wav_file->WriteSamples(buffer.get(), length);
-  }
-}
-
-FILE* OpenFile(const std::string& filename, const char* mode) {
-  FILE* file = fopen(filename.c_str(), mode);
-  if (!file) {
-    printf("Unable to open file %s\n", filename.c_str());
-    exit(1);
-  }
-  return file;
-}
-
-size_t SamplesFromRate(int rate) {
-  return static_cast<size_t>(AudioProcessing::kChunkSizeMs * rate / 1000);
-}
-
-void SetFrameSampleRate(AudioFrame* frame,
-                        int sample_rate_hz) {
-  frame->sample_rate_hz_ = sample_rate_hz;
-  frame->samples_per_channel_ = AudioProcessing::kChunkSizeMs *
-      sample_rate_hz / 1000;
-}
-
-AudioProcessing::ChannelLayout LayoutFromChannels(size_t num_channels) {
-  switch (num_channels) {
-    case 1:
-      return AudioProcessing::kMono;
-    case 2:
-      return AudioProcessing::kStereo;
-    default:
-      RTC_CHECK(false);
-      return AudioProcessing::kMono;
-  }
-}
-
-std::vector<Point> ParseArrayGeometry(const std::string& mic_positions) {
-  const std::vector<float> values = ParseList<float>(mic_positions);
-  const size_t num_mics =
-      rtc::CheckedDivExact(values.size(), static_cast<size_t>(3));
-  RTC_CHECK_GT(num_mics, 0) << "mic_positions is not large enough.";
-
-  std::vector<Point> result;
-  result.reserve(num_mics);
-  for (size_t i = 0; i < values.size(); i += 3) {
-    result.push_back(Point(values[i + 0], values[i + 1], values[i + 2]));
-  }
-
-  return result;
-}
-
-std::vector<Point> ParseArrayGeometry(const std::string& mic_positions,
-                                      size_t num_mics) {
-  std::vector<Point> result = ParseArrayGeometry(mic_positions);
-  RTC_CHECK_EQ(result.size(), num_mics)
-      << "Could not parse mic_positions or incorrect number of points.";
-  return result;
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/test/test_utils.h b/modules/audio_processing/test/test_utils.h
deleted file mode 100644
index e6c7259..0000000
--- a/modules/audio_processing/test/test_utils.h
+++ /dev/null
@@ -1,158 +0,0 @@
-/*
- *  Copyright (c) 2014 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_PROCESSING_TEST_TEST_UTILS_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_TEST_TEST_UTILS_H_
-
-#include <math.h>
-#include <iterator>
-#include <limits>
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "webrtc/common_audio/channel_buffer.h"
-#include "webrtc/common_audio/wav_file.h"
-#include "webrtc/modules/audio_processing/include/audio_processing.h"
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace webrtc {
-
-static const AudioProcessing::Error kNoErr = AudioProcessing::kNoError;
-#define EXPECT_NOERR(expr) EXPECT_EQ(kNoErr, (expr))
-
-class RawFile final {
- public:
-  explicit RawFile(const std::string& filename);
-  ~RawFile();
-
-  void WriteSamples(const int16_t* samples, size_t num_samples);
-  void WriteSamples(const float* samples, size_t num_samples);
-
- private:
-  FILE* file_handle_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(RawFile);
-};
-
-// Reads ChannelBuffers from a provided WavReader.
-class ChannelBufferWavReader final {
- public:
-  explicit ChannelBufferWavReader(std::unique_ptr<WavReader> file);
-  ~ChannelBufferWavReader();
-
-  // Reads data from the file according to the |buffer| format. Returns false if
-  // a full buffer can't be read from the file.
-  bool Read(ChannelBuffer<float>* buffer);
-
- private:
-  std::unique_ptr<WavReader> file_;
-  std::vector<float> interleaved_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(ChannelBufferWavReader);
-};
-
-// Writes ChannelBuffers to a provided WavWriter.
-class ChannelBufferWavWriter final {
- public:
-  explicit ChannelBufferWavWriter(std::unique_ptr<WavWriter> file);
-  ~ChannelBufferWavWriter();
-
-  void Write(const ChannelBuffer<float>& buffer);
-
- private:
-  std::unique_ptr<WavWriter> file_;
-  std::vector<float> interleaved_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(ChannelBufferWavWriter);
-};
-
-void WriteIntData(const int16_t* data,
-                  size_t length,
-                  WavWriter* wav_file,
-                  RawFile* raw_file);
-
-void WriteFloatData(const float* const* data,
-                    size_t samples_per_channel,
-                    size_t num_channels,
-                    WavWriter* wav_file,
-                    RawFile* raw_file);
-
-// Exits on failure; do not use in unit tests.
-FILE* OpenFile(const std::string& filename, const char* mode);
-
-size_t SamplesFromRate(int rate);
-
-void SetFrameSampleRate(AudioFrame* frame,
-                        int sample_rate_hz);
-
-template <typename T>
-void SetContainerFormat(int sample_rate_hz,
-                        size_t num_channels,
-                        AudioFrame* frame,
-                        std::unique_ptr<ChannelBuffer<T> >* cb) {
-  SetFrameSampleRate(frame, sample_rate_hz);
-  frame->num_channels_ = num_channels;
-  cb->reset(new ChannelBuffer<T>(frame->samples_per_channel_, num_channels));
-}
-
-AudioProcessing::ChannelLayout LayoutFromChannels(size_t num_channels);
-
-template <typename T>
-float ComputeSNR(const T* ref, const T* test, size_t length, float* variance) {
-  float mse = 0;
-  float mean = 0;
-  *variance = 0;
-  for (size_t i = 0; i < length; ++i) {
-    T error = ref[i] - test[i];
-    mse += error * error;
-    *variance += ref[i] * ref[i];
-    mean += ref[i];
-  }
-  mse /= length;
-  *variance /= length;
-  mean /= length;
-  *variance -= mean * mean;
-
-  float snr = 100;  // We assign 100 dB to the zero-error case.
-  if (mse > 0)
-    snr = 10 * log10(*variance / mse);
-  return snr;
-}
-
-// Returns a vector<T> parsed from whitespace delimited values in to_parse,
-// or an empty vector if the string could not be parsed.
-template<typename T>
-std::vector<T> ParseList(const std::string& to_parse) {
-  std::vector<T> values;
-
-  std::istringstream str(to_parse);
-  std::copy(
-      std::istream_iterator<T>(str),
-      std::istream_iterator<T>(),
-      std::back_inserter(values));
-
-  return values;
-}
-
-// Parses the array geometry from the command line.
-//
-// If a vector with size != num_mics is returned, an error has occurred and an
-// appropriate error message has been printed to stdout.
-std::vector<Point> ParseArrayGeometry(const std::string& mic_positions,
-                                      size_t num_mics);
-
-// Same as above, but without the num_mics check for when it isn't available.
-std::vector<Point> ParseArrayGeometry(const std::string& mic_positions);
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_TEST_TEST_UTILS_H_
diff --git a/modules/audio_processing/test/unittest.proto b/modules/audio_processing/test/unittest.proto
deleted file mode 100644
index 3c93bfd..0000000
--- a/modules/audio_processing/test/unittest.proto
+++ /dev/null
@@ -1,58 +0,0 @@
-syntax = "proto2";
-option optimize_for = LITE_RUNTIME;
-package webrtc.audioproc;
-
-message Test {
-  optional int32 num_reverse_channels = 1;
-  optional int32 num_input_channels = 2;
-  optional int32 num_output_channels = 3;
-  optional int32 sample_rate = 4;
-
-  message Frame {
-  }
-
-  repeated Frame frame = 5;
-
-  optional int32 analog_level_average = 6;
-  optional int32 max_output_average = 7;
-
-  optional int32 has_echo_count = 8;
-  optional int32 has_voice_count = 9;
-  optional int32 is_saturated_count = 10;
-
-  message Statistic {
-    optional int32 instant = 1;
-    optional int32 average = 2;
-    optional int32 maximum = 3;
-    optional int32 minimum = 4;
-  }
-
-  message EchoMetrics {
-    optional Statistic residual_echo_return_loss = 1;
-    optional Statistic echo_return_loss = 2;
-    optional Statistic echo_return_loss_enhancement = 3;
-    optional Statistic a_nlp = 4;
-    optional float divergent_filter_fraction = 5;
-  }
-
-  repeated EchoMetrics echo_metrics = 11;
-
-  message DelayMetrics {
-    optional int32 median = 1;
-    optional int32 std = 2;
-    optional float fraction_poor_delays = 3;
-  }
-
-  repeated DelayMetrics delay_metrics = 12;
-
-  repeated int32 rms_level = 13;
-
-  optional float ns_speech_probability_average = 14;
-
-  optional bool use_aec_extended_filter = 15;
-}
-
-message OutputData {
-  repeated Test test = 1;
-}
-
diff --git a/modules/audio_processing/test/unpack.cc b/modules/audio_processing/test/unpack.cc
deleted file mode 100644
index 13be279..0000000
--- a/modules/audio_processing/test/unpack.cc
+++ /dev/null
@@ -1,346 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-// Commandline tool to unpack audioproc debug files.
-//
-// The debug files are dumped as protobuf blobs. For analysis, it's necessary
-// to unpack the file into its component parts: audio and other data.
-
-#include <stdio.h>
-
-#include <memory>
-
-#include "webrtc/modules/audio_processing/test/protobuf_utils.h"
-#include "webrtc/modules/audio_processing/test/test_utils.h"
-#include "webrtc/rtc_base/flags.h"
-#include "webrtc/rtc_base/format_macros.h"
-#include "webrtc/rtc_base/ignore_wundef.h"
-#include "webrtc/typedefs.h"
-
-RTC_PUSH_IGNORING_WUNDEF()
-#include "webrtc/modules/audio_processing/debug.pb.h"
-RTC_POP_IGNORING_WUNDEF()
-
-// TODO(andrew): unpack more of the data.
-DEFINE_string(input_file, "input", "The name of the input stream file.");
-DEFINE_string(output_file, "ref_out",
-              "The name of the reference output stream file.");
-DEFINE_string(reverse_file, "reverse",
-              "The name of the reverse input stream file.");
-DEFINE_string(delay_file, "delay.int32", "The name of the delay file.");
-DEFINE_string(drift_file, "drift.int32", "The name of the drift file.");
-DEFINE_string(level_file, "level.int32", "The name of the level file.");
-DEFINE_string(keypress_file, "keypress.bool", "The name of the keypress file.");
-DEFINE_string(settings_file, "settings.txt", "The name of the settings file.");
-DEFINE_bool(full, false,
-            "Unpack the full set of files (normally not needed).");
-DEFINE_bool(raw, false, "Write raw data instead of a WAV file.");
-DEFINE_bool(text,
-            false,
-            "Write non-audio files as text files instead of binary files.");
-DEFINE_bool(help, false, "Print this message.");
-
-#define PRINT_CONFIG(field_name) \
-  if (msg.has_##field_name()) { \
-    fprintf(settings_file, "  " #field_name ": %d\n", msg.field_name()); \
-  }
-
-namespace webrtc {
-
-using audioproc::Event;
-using audioproc::ReverseStream;
-using audioproc::Stream;
-using audioproc::Init;
-
-void WriteData(const void* data, size_t size, FILE* file,
-               const std::string& filename) {
-  if (fwrite(data, size, 1, file) != 1) {
-    printf("Error when writing to %s\n", filename.c_str());
-    exit(1);
-  }
-}
-
-int do_main(int argc, char* argv[]) {
-  std::string program_name = argv[0];
-  std::string usage = "Commandline tool to unpack audioproc debug files.\n"
-    "Example usage:\n" + program_name + " debug_dump.pb\n";
-
-  if (rtc::FlagList::SetFlagsFromCommandLine(&argc, argv, true) ||
-      FLAG_help || argc < 2) {
-    printf("%s", usage.c_str());
-    if (FLAG_help) {
-      rtc::FlagList::Print(nullptr, false);
-      return 0;
-    }
-    return 1;
-  }
-
-  FILE* debug_file = OpenFile(argv[1], "rb");
-
-  Event event_msg;
-  int frame_count = 0;
-  size_t reverse_samples_per_channel = 0;
-  size_t input_samples_per_channel = 0;
-  size_t output_samples_per_channel = 0;
-  size_t num_reverse_channels = 0;
-  size_t num_input_channels = 0;
-  size_t num_output_channels = 0;
-  std::unique_ptr<WavWriter> reverse_wav_file;
-  std::unique_ptr<WavWriter> input_wav_file;
-  std::unique_ptr<WavWriter> output_wav_file;
-  std::unique_ptr<RawFile> reverse_raw_file;
-  std::unique_ptr<RawFile> input_raw_file;
-  std::unique_ptr<RawFile> output_raw_file;
-
-  FILE* settings_file = OpenFile(FLAG_settings_file, "wb");
-
-  while (ReadMessageFromFile(debug_file, &event_msg)) {
-    if (event_msg.type() == Event::REVERSE_STREAM) {
-      if (!event_msg.has_reverse_stream()) {
-        printf("Corrupt input file: ReverseStream missing.\n");
-        return 1;
-      }
-
-      const ReverseStream msg = event_msg.reverse_stream();
-      if (msg.has_data()) {
-        if (FLAG_raw && !reverse_raw_file) {
-          reverse_raw_file.reset(new RawFile(std::string(FLAG_reverse_file) +
-                                             ".pcm"));
-        }
-        // TODO(aluebs): Replace "num_reverse_channels *
-        // reverse_samples_per_channel" with "msg.data().size() /
-        // sizeof(int16_t)" and so on when this fix in audio_processing has made
-        // it into stable: https://webrtc-codereview.appspot.com/15299004/
-        WriteIntData(reinterpret_cast<const int16_t*>(msg.data().data()),
-                     num_reverse_channels * reverse_samples_per_channel,
-                     reverse_wav_file.get(),
-                     reverse_raw_file.get());
-      } else if (msg.channel_size() > 0) {
-        if (FLAG_raw && !reverse_raw_file) {
-          reverse_raw_file.reset(new RawFile(std::string(FLAG_reverse_file) +
-                                             ".float"));
-        }
-        std::unique_ptr<const float* []> data(
-            new const float* [num_reverse_channels]);
-        for (size_t i = 0; i < num_reverse_channels; ++i) {
-          data[i] = reinterpret_cast<const float*>(msg.channel(i).data());
-        }
-        WriteFloatData(data.get(),
-                       reverse_samples_per_channel,
-                       num_reverse_channels,
-                       reverse_wav_file.get(),
-                       reverse_raw_file.get());
-      }
-    } else if (event_msg.type() == Event::STREAM) {
-      frame_count++;
-      if (!event_msg.has_stream()) {
-        printf("Corrupt input file: Stream missing.\n");
-        return 1;
-      }
-
-      const Stream msg = event_msg.stream();
-      if (msg.has_input_data()) {
-        if (FLAG_raw && !input_raw_file) {
-          input_raw_file.reset(new RawFile(std::string(FLAG_input_file) +
-                                           ".pcm"));
-        }
-        WriteIntData(reinterpret_cast<const int16_t*>(msg.input_data().data()),
-                     num_input_channels * input_samples_per_channel,
-                     input_wav_file.get(),
-                     input_raw_file.get());
-      } else if (msg.input_channel_size() > 0) {
-        if (FLAG_raw && !input_raw_file) {
-          input_raw_file.reset(new RawFile(std::string(FLAG_input_file) +
-                                           ".float"));
-        }
-        std::unique_ptr<const float* []> data(
-            new const float* [num_input_channels]);
-        for (size_t i = 0; i < num_input_channels; ++i) {
-          data[i] = reinterpret_cast<const float*>(msg.input_channel(i).data());
-        }
-        WriteFloatData(data.get(),
-                       input_samples_per_channel,
-                       num_input_channels,
-                       input_wav_file.get(),
-                       input_raw_file.get());
-      }
-
-      if (msg.has_output_data()) {
-        if (FLAG_raw && !output_raw_file) {
-          output_raw_file.reset(new RawFile(std::string(FLAG_output_file) +
-                                            ".pcm"));
-        }
-        WriteIntData(reinterpret_cast<const int16_t*>(msg.output_data().data()),
-                     num_output_channels * output_samples_per_channel,
-                     output_wav_file.get(),
-                     output_raw_file.get());
-      } else if (msg.output_channel_size() > 0) {
-        if (FLAG_raw && !output_raw_file) {
-          output_raw_file.reset(new RawFile(std::string(FLAG_output_file) +
-                                            ".float"));
-        }
-        std::unique_ptr<const float* []> data(
-            new const float* [num_output_channels]);
-        for (size_t i = 0; i < num_output_channels; ++i) {
-          data[i] =
-              reinterpret_cast<const float*>(msg.output_channel(i).data());
-        }
-        WriteFloatData(data.get(),
-                       output_samples_per_channel,
-                       num_output_channels,
-                       output_wav_file.get(),
-                       output_raw_file.get());
-      }
-
-      if (FLAG_full) {
-        if (msg.has_delay()) {
-          static FILE* delay_file = OpenFile(FLAG_delay_file, "wb");
-          int32_t delay = msg.delay();
-          if (FLAG_text) {
-            fprintf(delay_file, "%d\n", delay);
-          } else {
-            WriteData(&delay, sizeof(delay), delay_file, FLAG_delay_file);
-          }
-        }
-
-        if (msg.has_drift()) {
-          static FILE* drift_file = OpenFile(FLAG_drift_file, "wb");
-          int32_t drift = msg.drift();
-          if (FLAG_text) {
-            fprintf(drift_file, "%d\n", drift);
-          } else {
-            WriteData(&drift, sizeof(drift), drift_file, FLAG_drift_file);
-          }
-        }
-
-        if (msg.has_level()) {
-          static FILE* level_file = OpenFile(FLAG_level_file, "wb");
-          int32_t level = msg.level();
-          if (FLAG_text) {
-            fprintf(level_file, "%d\n", level);
-          } else {
-            WriteData(&level, sizeof(level), level_file, FLAG_level_file);
-          }
-        }
-
-        if (msg.has_keypress()) {
-          static FILE* keypress_file = OpenFile(FLAG_keypress_file, "wb");
-          bool keypress = msg.keypress();
-          if (FLAG_text) {
-            fprintf(keypress_file, "%d\n", keypress);
-          } else {
-            WriteData(&keypress, sizeof(keypress), keypress_file,
-                      FLAG_keypress_file);
-          }
-        }
-      }
-    } else if (event_msg.type() == Event::CONFIG) {
-      if (!event_msg.has_config()) {
-        printf("Corrupt input file: Config missing.\n");
-        return 1;
-      }
-      const audioproc::Config msg = event_msg.config();
-
-      fprintf(settings_file, "APM re-config at frame: %d\n", frame_count);
-
-      PRINT_CONFIG(aec_enabled);
-      PRINT_CONFIG(aec_delay_agnostic_enabled);
-      PRINT_CONFIG(aec_drift_compensation_enabled);
-      PRINT_CONFIG(aec_extended_filter_enabled);
-      PRINT_CONFIG(aec_suppression_level);
-      PRINT_CONFIG(aecm_enabled);
-      PRINT_CONFIG(aecm_comfort_noise_enabled);
-      PRINT_CONFIG(aecm_routing_mode);
-      PRINT_CONFIG(agc_enabled);
-      PRINT_CONFIG(agc_mode);
-      PRINT_CONFIG(agc_limiter_enabled);
-      PRINT_CONFIG(noise_robust_agc_enabled);
-      PRINT_CONFIG(hpf_enabled);
-      PRINT_CONFIG(ns_enabled);
-      PRINT_CONFIG(ns_level);
-      PRINT_CONFIG(transient_suppression_enabled);
-      PRINT_CONFIG(intelligibility_enhancer_enabled);
-      if (msg.has_experiments_description()) {
-        fprintf(settings_file, "  experiments_description: %s\n",
-                msg.experiments_description().c_str());
-      }
-    } else if (event_msg.type() == Event::INIT) {
-      if (!event_msg.has_init()) {
-        printf("Corrupt input file: Init missing.\n");
-        return 1;
-      }
-
-      const Init msg = event_msg.init();
-      // These should print out zeros if they're missing.
-      fprintf(settings_file, "Init at frame: %d\n", frame_count);
-      int input_sample_rate = msg.sample_rate();
-      fprintf(settings_file, "  Input sample rate: %d\n", input_sample_rate);
-      int output_sample_rate = msg.output_sample_rate();
-      fprintf(settings_file, "  Output sample rate: %d\n", output_sample_rate);
-      int reverse_sample_rate = msg.reverse_sample_rate();
-      fprintf(settings_file,
-              "  Reverse sample rate: %d\n",
-              reverse_sample_rate);
-      num_input_channels = msg.num_input_channels();
-      fprintf(settings_file, "  Input channels: %" PRIuS "\n",
-              num_input_channels);
-      num_output_channels = msg.num_output_channels();
-      fprintf(settings_file, "  Output channels: %" PRIuS "\n",
-              num_output_channels);
-      num_reverse_channels = msg.num_reverse_channels();
-      fprintf(settings_file, "  Reverse channels: %" PRIuS "\n",
-              num_reverse_channels);
-
-      fprintf(settings_file, "\n");
-
-      if (reverse_sample_rate == 0) {
-        reverse_sample_rate = input_sample_rate;
-      }
-      if (output_sample_rate == 0) {
-        output_sample_rate = input_sample_rate;
-      }
-
-      reverse_samples_per_channel =
-          static_cast<size_t>(reverse_sample_rate / 100);
-      input_samples_per_channel =
-          static_cast<size_t>(input_sample_rate / 100);
-      output_samples_per_channel =
-          static_cast<size_t>(output_sample_rate / 100);
-
-      if (!FLAG_raw) {
-        // The WAV files need to be reset every time, because they cant change
-        // their sample rate or number of channels.
-        std::stringstream reverse_name;
-        reverse_name << FLAG_reverse_file << frame_count << ".wav";
-        reverse_wav_file.reset(new WavWriter(reverse_name.str(),
-                                             reverse_sample_rate,
-                                             num_reverse_channels));
-        std::stringstream input_name;
-        input_name << FLAG_input_file << frame_count << ".wav";
-        input_wav_file.reset(new WavWriter(input_name.str(),
-                                           input_sample_rate,
-                                           num_input_channels));
-        std::stringstream output_name;
-        output_name << FLAG_output_file << frame_count << ".wav";
-        output_wav_file.reset(new WavWriter(output_name.str(),
-                                            output_sample_rate,
-                                            num_output_channels));
-      }
-    }
-  }
-
-  return 0;
-}
-
-}  // namespace webrtc
-
-int main(int argc, char* argv[]) {
-  return webrtc::do_main(argc, argv);
-}
diff --git a/modules/audio_processing/test/wav_based_simulator.cc b/modules/audio_processing/test/wav_based_simulator.cc
deleted file mode 100644
index 4025396..0000000
--- a/modules/audio_processing/test/wav_based_simulator.cc
+++ /dev/null
@@ -1,206 +0,0 @@
-/*
- *  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_processing/test/wav_based_simulator.h"
-
-#include <stdio.h>
-#include <iostream>
-
-#include "webrtc/modules/audio_processing/test/test_utils.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/test/testsupport/trace_to_stderr.h"
-
-namespace webrtc {
-namespace test {
-
-std::vector<WavBasedSimulator::SimulationEventType>
-WavBasedSimulator::GetCustomEventChain(const std::string& filename) {
-  std::vector<WavBasedSimulator::SimulationEventType> call_chain;
-  FILE* stream = OpenFile(filename.c_str(), "r");
-
-  RTC_CHECK(stream) << "Could not open the custom call order file, reverting "
-                       "to using the default call order";
-
-  char c;
-  size_t num_read = fread(&c, sizeof(char), 1, stream);
-  while (num_read > 0) {
-    switch (c) {
-      case 'r':
-        call_chain.push_back(SimulationEventType::kProcessReverseStream);
-        break;
-      case 'c':
-        call_chain.push_back(SimulationEventType::kProcessStream);
-        break;
-      case '\n':
-        break;
-      default:
-        FATAL() << "Incorrect custom call order file, reverting to using the "
-                   "default call order";
-        fclose(stream);
-        return WavBasedSimulator::GetDefaultEventChain();
-    }
-
-    num_read = fread(&c, sizeof(char), 1, stream);
-  }
-
-  fclose(stream);
-  return call_chain;
-}
-
-WavBasedSimulator::WavBasedSimulator(const SimulationSettings& settings)
-      : AudioProcessingSimulator(settings) {}
-
-WavBasedSimulator::~WavBasedSimulator() = default;
-
-std::vector<WavBasedSimulator::SimulationEventType>
-WavBasedSimulator::GetDefaultEventChain() {
-  std::vector<WavBasedSimulator::SimulationEventType> call_chain(2);
-  call_chain[0] = SimulationEventType::kProcessStream;
-  call_chain[1] = SimulationEventType::kProcessReverseStream;
-  return call_chain;
-}
-
-void WavBasedSimulator::PrepareProcessStreamCall() {
-  if (settings_.fixed_interface) {
-    CopyToAudioFrame(*in_buf_, &fwd_frame_);
-  }
-  ap_->set_stream_key_pressed(settings_.use_ts && (*settings_.use_ts));
-
-  RTC_CHECK_EQ(AudioProcessing::kNoError,
-               ap_->set_stream_delay_ms(
-                   settings_.stream_delay ? *settings_.stream_delay : 0));
-
-  ap_->echo_cancellation()->set_stream_drift_samples(
-      settings_.stream_drift_samples ? *settings_.stream_drift_samples : 0);
-
-  RTC_CHECK_EQ(AudioProcessing::kNoError,
-               ap_->gain_control()->set_stream_analog_level(
-                   last_specified_microphone_level_));
-}
-
-void WavBasedSimulator::PrepareReverseProcessStreamCall() {
-  if (settings_.fixed_interface) {
-    CopyToAudioFrame(*reverse_in_buf_, &rev_frame_);
-  }
-}
-
-void WavBasedSimulator::Process() {
-  std::unique_ptr<test::TraceToStderr> trace_to_stderr;
-  if (settings_.use_verbose_logging) {
-    trace_to_stderr.reset(new test::TraceToStderr(true));
-  }
-
-  if (settings_.custom_call_order_filename) {
-    call_chain_ = WavBasedSimulator::GetCustomEventChain(
-        *settings_.custom_call_order_filename);
-  } else {
-    call_chain_ = WavBasedSimulator::GetDefaultEventChain();
-  }
-  CreateAudioProcessor();
-
-  Initialize();
-
-  bool samples_left_to_process = true;
-  int call_chain_index = 0;
-  int num_forward_chunks_processed = 0;
-  const int kOneBykChunksPerSecond =
-      1.f / AudioProcessingSimulator::kChunksPerSecond;
-  while (samples_left_to_process) {
-    switch (call_chain_[call_chain_index]) {
-      case SimulationEventType::kProcessStream:
-        samples_left_to_process = HandleProcessStreamCall();
-        ++num_forward_chunks_processed;
-        break;
-      case SimulationEventType::kProcessReverseStream:
-        if (settings_.reverse_input_filename) {
-          samples_left_to_process = HandleProcessReverseStreamCall();
-        }
-        break;
-      default:
-        RTC_CHECK(false);
-    }
-
-    call_chain_index = (call_chain_index + 1) % call_chain_.size();
-
-    if (trace_to_stderr) {
-      trace_to_stderr->SetTimeSeconds(num_forward_chunks_processed *
-                                      kOneBykChunksPerSecond);
-    }
-  }
-
-  DestroyAudioProcessor();
-}
-
-bool WavBasedSimulator::HandleProcessStreamCall() {
-  bool samples_left_to_process = buffer_reader_->Read(in_buf_.get());
-  if (samples_left_to_process) {
-    PrepareProcessStreamCall();
-    ProcessStream(settings_.fixed_interface);
-    // Call stream analog level to ensure that any side-effects are triggered.
-    (void)ap_->gain_control()->stream_analog_level();
-    last_specified_microphone_level_ =
-        ap_->gain_control()->stream_analog_level();
-  }
-  return samples_left_to_process;
-}
-
-bool WavBasedSimulator::HandleProcessReverseStreamCall() {
-  bool samples_left_to_process =
-      reverse_buffer_reader_->Read(reverse_in_buf_.get());
-  if (samples_left_to_process) {
-    PrepareReverseProcessStreamCall();
-    ProcessReverseStream(settings_.fixed_interface);
-  }
-  return samples_left_to_process;
-}
-
-void WavBasedSimulator::Initialize() {
-  std::unique_ptr<WavReader> in_file(
-      new WavReader(settings_.input_filename->c_str()));
-  int input_sample_rate_hz = in_file->sample_rate();
-  int input_num_channels = in_file->num_channels();
-  buffer_reader_.reset(new ChannelBufferWavReader(std::move(in_file)));
-
-  int output_sample_rate_hz = settings_.output_sample_rate_hz
-                                  ? *settings_.output_sample_rate_hz
-                                  : input_sample_rate_hz;
-  int output_num_channels = settings_.output_num_channels
-                                ? *settings_.output_num_channels
-                                : input_num_channels;
-
-  int reverse_sample_rate_hz = 48000;
-  int reverse_num_channels = 1;
-  int reverse_output_sample_rate_hz = 48000;
-  int reverse_output_num_channels = 1;
-  if (settings_.reverse_input_filename) {
-    std::unique_ptr<WavReader> reverse_in_file(
-        new WavReader(settings_.reverse_input_filename->c_str()));
-    reverse_sample_rate_hz = reverse_in_file->sample_rate();
-    reverse_num_channels = reverse_in_file->num_channels();
-    reverse_buffer_reader_.reset(
-        new ChannelBufferWavReader(std::move(reverse_in_file)));
-
-    reverse_output_sample_rate_hz =
-        settings_.reverse_output_sample_rate_hz
-            ? *settings_.reverse_output_sample_rate_hz
-            : reverse_sample_rate_hz;
-    reverse_output_num_channels = settings_.reverse_output_num_channels
-                                      ? *settings_.reverse_output_num_channels
-                                      : reverse_num_channels;
-  }
-
-  SetupBuffersConfigsOutputs(
-      input_sample_rate_hz, output_sample_rate_hz, reverse_sample_rate_hz,
-      reverse_output_sample_rate_hz, input_num_channels, output_num_channels,
-      reverse_num_channels, reverse_output_num_channels);
-}
-
-}  // namespace test
-}  // namespace webrtc
diff --git a/modules/audio_processing/test/wav_based_simulator.h b/modules/audio_processing/test/wav_based_simulator.h
deleted file mode 100644
index 245367e..0000000
--- a/modules/audio_processing/test/wav_based_simulator.h
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- *  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_PROCESSING_TEST_WAV_BASED_SIMULATOR_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_TEST_WAV_BASED_SIMULATOR_H_
-
-#include <vector>
-
-#include "webrtc/modules/audio_processing/test/audio_processing_simulator.h"
-
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace webrtc {
-namespace test {
-
-// Used to perform an audio processing simulation from wav files.
-class WavBasedSimulator final : public AudioProcessingSimulator {
- public:
-  explicit WavBasedSimulator(const SimulationSettings& settings);
-  ~WavBasedSimulator() override;
-
-  // Processes the WAV input.
-  void Process() override;
-
- private:
-  enum SimulationEventType {
-    kProcessStream,
-    kProcessReverseStream,
-  };
-
-  void Initialize();
-  bool HandleProcessStreamCall();
-  bool HandleProcessReverseStreamCall();
-  void PrepareProcessStreamCall();
-  void PrepareReverseProcessStreamCall();
-  static std::vector<SimulationEventType> GetDefaultEventChain();
-  static std::vector<SimulationEventType> GetCustomEventChain(
-      const std::string& filename);
-
-  std::vector<SimulationEventType> call_chain_;
-  int last_specified_microphone_level_ = 100;
-
-  RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(WavBasedSimulator);
-};
-
-}  // namespace test
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_TEST_WAV_BASED_SIMULATOR_H_
diff --git a/modules/audio_processing/three_band_filter_bank.cc b/modules/audio_processing/three_band_filter_bank.cc
deleted file mode 100644
index 4c62e7e..0000000
--- a/modules/audio_processing/three_band_filter_bank.cc
+++ /dev/null
@@ -1,216 +0,0 @@
-/*
- *  Copyright (c) 2015 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.
- */
-
-// An implementation of a 3-band FIR filter-bank with DCT modulation, similar to
-// the proposed in "Multirate Signal Processing for Communication Systems" by
-// Fredric J Harris.
-//
-// The idea is to take a heterodyne system and change the order of the
-// components to get something which is efficient to implement digitally.
-//
-// It is possible to separate the filter using the noble identity as follows:
-//
-// H(z) = H0(z^3) + z^-1 * H1(z^3) + z^-2 * H2(z^3)
-//
-// This is used in the analysis stage to first downsample serial to parallel
-// and then filter each branch with one of these polyphase decompositions of the
-// lowpass prototype. Because each filter is only a modulation of the prototype,
-// it is enough to multiply each coefficient by the respective cosine value to
-// shift it to the desired band. But because the cosine period is 12 samples,
-// it requires separating the prototype even further using the noble identity.
-// After filtering and modulating for each band, the output of all filters is
-// accumulated to get the downsampled bands.
-//
-// A similar logic can be applied to the synthesis stage.
-
-// MSVC++ requires this to be set before any other includes to get M_PI.
-#define _USE_MATH_DEFINES
-
-#include "webrtc/modules/audio_processing/three_band_filter_bank.h"
-
-#include <cmath>
-
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-namespace {
-
-const size_t kNumBands = 3;
-const size_t kSparsity = 4;
-
-// Factors to take into account when choosing |kNumCoeffs|:
-//   1. Higher |kNumCoeffs|, means faster transition, which ensures less
-//      aliasing. This is especially important when there is non-linear
-//      processing between the splitting and merging.
-//   2. The delay that this filter bank introduces is
-//      |kNumBands| * |kSparsity| * |kNumCoeffs| / 2, so it increases linearly
-//      with |kNumCoeffs|.
-//   3. The computation complexity also increases linearly with |kNumCoeffs|.
-const size_t kNumCoeffs = 4;
-
-// The Matlab code to generate these |kLowpassCoeffs| is:
-//
-// N = kNumBands * kSparsity * kNumCoeffs - 1;
-// h = fir1(N, 1 / (2 * kNumBands), kaiser(N + 1, 3.5));
-// reshape(h, kNumBands * kSparsity, kNumCoeffs);
-//
-// Because the total bandwidth of the lower and higher band is double the middle
-// one (because of the spectrum parity), the low-pass prototype is half the
-// bandwidth of 1 / (2 * |kNumBands|) and is then shifted with cosine modulation
-// to the right places.
-// A Kaiser window is used because of its flexibility and the alpha is set to
-// 3.5, since that sets a stop band attenuation of 40dB ensuring a fast
-// transition.
-const float kLowpassCoeffs[kNumBands * kSparsity][kNumCoeffs] =
-    {{-0.00047749f, -0.00496888f, +0.16547118f, +0.00425496f},
-     {-0.00173287f, -0.01585778f, +0.14989004f, +0.00994113f},
-     {-0.00304815f, -0.02536082f, +0.12154542f, +0.01157993f},
-     {-0.00383509f, -0.02982767f, +0.08543175f, +0.00983212f},
-     {-0.00346946f, -0.02587886f, +0.04760441f, +0.00607594f},
-     {-0.00154717f, -0.01136076f, +0.01387458f, +0.00186353f},
-     {+0.00186353f, +0.01387458f, -0.01136076f, -0.00154717f},
-     {+0.00607594f, +0.04760441f, -0.02587886f, -0.00346946f},
-     {+0.00983212f, +0.08543175f, -0.02982767f, -0.00383509f},
-     {+0.01157993f, +0.12154542f, -0.02536082f, -0.00304815f},
-     {+0.00994113f, +0.14989004f, -0.01585778f, -0.00173287f},
-     {+0.00425496f, +0.16547118f, -0.00496888f, -0.00047749f}};
-
-// Downsamples |in| into |out|, taking one every |kNumbands| starting from
-// |offset|. |split_length| is the |out| length. |in| has to be at least
-// |kNumBands| * |split_length| long.
-void Downsample(const float* in,
-                size_t split_length,
-                size_t offset,
-                float* out) {
-  for (size_t i = 0; i < split_length; ++i) {
-    out[i] = in[kNumBands * i + offset];
-  }
-}
-
-// Upsamples |in| into |out|, scaling by |kNumBands| and accumulating it every
-// |kNumBands| starting from |offset|. |split_length| is the |in| length. |out|
-// has to be at least |kNumBands| * |split_length| long.
-void Upsample(const float* in, size_t split_length, size_t offset, float* out) {
-  for (size_t i = 0; i < split_length; ++i) {
-    out[kNumBands * i + offset] += kNumBands * in[i];
-  }
-}
-
-}  // namespace
-
-// Because the low-pass filter prototype has half bandwidth it is possible to
-// use a DCT to shift it in both directions at the same time, to the center
-// frequencies [1 / 12, 3 / 12, 5 / 12].
-ThreeBandFilterBank::ThreeBandFilterBank(size_t length)
-    : in_buffer_(rtc::CheckedDivExact(length, kNumBands)),
-      out_buffer_(in_buffer_.size()) {
-  for (size_t i = 0; i < kSparsity; ++i) {
-    for (size_t j = 0; j < kNumBands; ++j) {
-      analysis_filters_.push_back(
-          std::unique_ptr<SparseFIRFilter>(new SparseFIRFilter(
-              kLowpassCoeffs[i * kNumBands + j], kNumCoeffs, kSparsity, i)));
-      synthesis_filters_.push_back(
-          std::unique_ptr<SparseFIRFilter>(new SparseFIRFilter(
-              kLowpassCoeffs[i * kNumBands + j], kNumCoeffs, kSparsity, i)));
-    }
-  }
-  dct_modulation_.resize(kNumBands * kSparsity);
-  for (size_t i = 0; i < dct_modulation_.size(); ++i) {
-    dct_modulation_[i].resize(kNumBands);
-    for (size_t j = 0; j < kNumBands; ++j) {
-      dct_modulation_[i][j] =
-          2.f * cos(2.f * M_PI * i * (2.f * j + 1.f) / dct_modulation_.size());
-    }
-  }
-}
-
-ThreeBandFilterBank::~ThreeBandFilterBank() = default;
-
-// The analysis can be separated in these steps:
-//   1. Serial to parallel downsampling by a factor of |kNumBands|.
-//   2. Filtering of |kSparsity| different delayed signals with polyphase
-//      decomposition of the low-pass prototype filter and upsampled by a factor
-//      of |kSparsity|.
-//   3. Modulating with cosines and accumulating to get the desired band.
-void ThreeBandFilterBank::Analysis(const float* in,
-                                   size_t length,
-                                   float* const* out) {
-  RTC_CHECK_EQ(in_buffer_.size(), rtc::CheckedDivExact(length, kNumBands));
-  for (size_t i = 0; i < kNumBands; ++i) {
-    memset(out[i], 0, in_buffer_.size() * sizeof(*out[i]));
-  }
-  for (size_t i = 0; i < kNumBands; ++i) {
-    Downsample(in, in_buffer_.size(), kNumBands - i - 1, &in_buffer_[0]);
-    for (size_t j = 0; j < kSparsity; ++j) {
-      const size_t offset = i + j * kNumBands;
-      analysis_filters_[offset]->Filter(&in_buffer_[0],
-                                        in_buffer_.size(),
-                                        &out_buffer_[0]);
-      DownModulate(&out_buffer_[0], out_buffer_.size(), offset, out);
-    }
-  }
-}
-
-// The synthesis can be separated in these steps:
-//   1. Modulating with cosines.
-//   2. Filtering each one with a polyphase decomposition of the low-pass
-//      prototype filter upsampled by a factor of |kSparsity| and accumulating
-//      |kSparsity| signals with different delays.
-//   3. Parallel to serial upsampling by a factor of |kNumBands|.
-void ThreeBandFilterBank::Synthesis(const float* const* in,
-                                    size_t split_length,
-                                    float* out) {
-  RTC_CHECK_EQ(in_buffer_.size(), split_length);
-  memset(out, 0, kNumBands * in_buffer_.size() * sizeof(*out));
-  for (size_t i = 0; i < kNumBands; ++i) {
-    for (size_t j = 0; j < kSparsity; ++j) {
-      const size_t offset = i + j * kNumBands;
-      UpModulate(in, in_buffer_.size(), offset, &in_buffer_[0]);
-      synthesis_filters_[offset]->Filter(&in_buffer_[0],
-                                         in_buffer_.size(),
-                                         &out_buffer_[0]);
-      Upsample(&out_buffer_[0], out_buffer_.size(), i, out);
-    }
-  }
-}
-
-
-// Modulates |in| by |dct_modulation_| and accumulates it in each of the
-// |kNumBands| bands of |out|. |offset| is the index in the period of the
-// cosines used for modulation. |split_length| is the length of |in| and each
-// band of |out|.
-void ThreeBandFilterBank::DownModulate(const float* in,
-                                       size_t split_length,
-                                       size_t offset,
-                                       float* const* out) {
-  for (size_t i = 0; i < kNumBands; ++i) {
-    for (size_t j = 0; j < split_length; ++j) {
-      out[i][j] += dct_modulation_[offset][i] * in[j];
-    }
-  }
-}
-
-// Modulates each of the |kNumBands| bands of |in| by |dct_modulation_| and
-// accumulates them in |out|. |out| is cleared before starting to accumulate.
-// |offset| is the index in the period of the cosines used for modulation.
-// |split_length| is the length of each band of |in| and |out|.
-void ThreeBandFilterBank::UpModulate(const float* const* in,
-                                     size_t split_length,
-                                     size_t offset,
-                                     float* out) {
-  memset(out, 0, split_length * sizeof(*out));
-  for (size_t i = 0; i < kNumBands; ++i) {
-    for (size_t j = 0; j < split_length; ++j) {
-      out[j] += dct_modulation_[offset][i] * in[i][j];
-    }
-  }
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/three_band_filter_bank.h b/modules/audio_processing/three_band_filter_bank.h
deleted file mode 100644
index 24e7831..0000000
--- a/modules/audio_processing/three_band_filter_bank.h
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- *  Copyright (c) 2015 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_PROCESSING_THREE_BAND_FILTER_BANK_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_THREE_BAND_FILTER_BANK_H_
-
-#include <cstring>
-#include <memory>
-#include <vector>
-
-#include "webrtc/common_audio/sparse_fir_filter.h"
-
-namespace webrtc {
-
-// An implementation of a 3-band FIR filter-bank with DCT modulation, similar to
-// the proposed in "Multirate Signal Processing for Communication Systems" by
-// Fredric J Harris.
-// The low-pass filter prototype has these characteristics:
-// * Pass-band ripple = 0.3dB
-// * Pass-band frequency = 0.147 (7kHz at 48kHz)
-// * Stop-band attenuation = 40dB
-// * Stop-band frequency = 0.192 (9.2kHz at 48kHz)
-// * Delay = 24 samples (500us at 48kHz)
-// * Linear phase
-// This filter bank does not satisfy perfect reconstruction. The SNR after
-// analysis and synthesis (with no processing in between) is approximately 9.5dB
-// depending on the input signal after compensating for the delay.
-class ThreeBandFilterBank final {
- public:
-  explicit ThreeBandFilterBank(size_t length);
-  ~ThreeBandFilterBank();
-
-  // Splits |in| into 3 downsampled frequency bands in |out|.
-  // |length| is the |in| length. Each of the 3 bands of |out| has to have a
-  // length of |length| / 3.
-  void Analysis(const float* in, size_t length, float* const* out);
-
-  // Merges the 3 downsampled frequency bands in |in| into |out|.
-  // |split_length| is the length of each band of |in|. |out| has to have at
-  // least a length of 3 * |split_length|.
-  void Synthesis(const float* const* in, size_t split_length, float* out);
-
- private:
-  void DownModulate(const float* in,
-                    size_t split_length,
-                    size_t offset,
-                    float* const* out);
-  void UpModulate(const float* const* in,
-                  size_t split_length,
-                  size_t offset,
-                  float* out);
-
-  std::vector<float> in_buffer_;
-  std::vector<float> out_buffer_;
-  std::vector<std::unique_ptr<SparseFIRFilter>> analysis_filters_;
-  std::vector<std::unique_ptr<SparseFIRFilter>> synthesis_filters_;
-  std::vector<std::vector<float>> dct_modulation_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_THREE_BAND_FILTER_BANK_H_
diff --git a/modules/audio_processing/transient/click_annotate.cc b/modules/audio_processing/transient/click_annotate.cc
deleted file mode 100644
index b03a714..0000000
--- a/modules/audio_processing/transient/click_annotate.cc
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- *  Copyright (c) 2013 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 <cfloat>
-#include <cstdio>
-#include <cstdlib>
-#include <memory>
-#include <vector>
-
-#include "webrtc/modules/audio_processing/transient/transient_detector.h"
-#include "webrtc/modules/audio_processing/transient/file_utils.h"
-#include "webrtc/system_wrappers/include/file_wrapper.h"
-
-using webrtc::FileWrapper;
-using webrtc::TransientDetector;
-
-// Application to generate a RTP timing file.
-// Opens the PCM file and divides the signal in frames.
-// Creates a send times array, one for each step.
-// Each block that contains a transient, has an infinite send time.
-// The resultant array is written to a DAT file
-// Returns -1 on error or |lost_packets| otherwise.
-int main(int argc, char* argv[]) {
-  if (argc != 5) {
-    printf("\n%s - Application to generate a RTP timing file.\n\n", argv[0]);
-    printf("%s PCMfile DATfile chunkSize sampleRate\n\n", argv[0]);
-    printf("Opens the PCMfile with sampleRate in Hertz.\n");
-    printf("Creates a send times array, one for each chunkSize ");
-    printf("milliseconds step.\n");
-    printf("Each block that contains a transient, has an infinite send time. ");
-    printf("The resultant array is written to a DATfile.\n\n");
-    return 0;
-  }
-
-  std::unique_ptr<FileWrapper> pcm_file(FileWrapper::Create());
-  pcm_file->OpenFile(argv[1], true);
-  if (!pcm_file->is_open()) {
-    printf("\nThe %s could not be opened.\n\n", argv[1]);
-    return -1;
-  }
-
-  std::unique_ptr<FileWrapper> dat_file(FileWrapper::Create());
-  dat_file->OpenFile(argv[2], false);
-  if (!dat_file->is_open()) {
-    printf("\nThe %s could not be opened.\n\n", argv[2]);
-    return -1;
-  }
-
-  int chunk_size_ms = atoi(argv[3]);
-  if (chunk_size_ms <= 0) {
-    printf("\nThe chunkSize must be a positive integer\n\n");
-    return -1;
-  }
-
-  int sample_rate_hz = atoi(argv[4]);
-  if (sample_rate_hz <= 0) {
-    printf("\nThe sampleRate must be a positive integer\n\n");
-    return -1;
-  }
-
-  TransientDetector detector(sample_rate_hz);
-  int lost_packets = 0;
-  size_t audio_buffer_length = chunk_size_ms * sample_rate_hz / 1000;
-  std::unique_ptr<float[]> audio_buffer(new float[audio_buffer_length]);
-  std::vector<float> send_times;
-
-  // Read first buffer from the PCM test file.
-  size_t file_samples_read = ReadInt16FromFileToFloatBuffer(
-      pcm_file.get(),
-      audio_buffer_length,
-      audio_buffer.get());
-  for (int time = 0; file_samples_read > 0; time += chunk_size_ms) {
-    // Pad the rest of the buffer with zeros.
-    for (size_t i = file_samples_read; i < audio_buffer_length; ++i) {
-      audio_buffer[i] = 0.0;
-    }
-    float value =
-        detector.Detect(audio_buffer.get(), audio_buffer_length, NULL, 0);
-    if (value < 0.5f) {
-      value = time;
-    } else {
-      value = FLT_MAX;
-      ++lost_packets;
-    }
-    send_times.push_back(value);
-
-    // Read next buffer from the PCM test file.
-    file_samples_read = ReadInt16FromFileToFloatBuffer(pcm_file.get(),
-                                                       audio_buffer_length,
-                                                       audio_buffer.get());
-  }
-
-  size_t floats_written = WriteFloatBufferToFile(dat_file.get(),
-                                                 send_times.size(),
-                                                 &send_times[0]);
-
-  if (floats_written == 0) {
-    printf("\nThe send times could not be written to DAT file\n\n");
-    return -1;
-  }
-
-  pcm_file->CloseFile();
-  dat_file->CloseFile();
-
-  return lost_packets;
-}
diff --git a/modules/audio_processing/transient/common.h b/modules/audio_processing/transient/common.h
deleted file mode 100644
index 92194e9..0000000
--- a/modules/audio_processing/transient/common.h
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- *  Copyright (c) 2014 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_PROCESSING_TRANSIENT_COMMON_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_TRANSIENT_COMMON_H_
-namespace webrtc {
-namespace ts {
-
-static const float kPi = 3.14159265358979323846f;
-static const int kChunkSizeMs = 10;
-enum {
-  kSampleRate8kHz = 8000,
-  kSampleRate16kHz = 16000,
-  kSampleRate32kHz = 32000,
-  kSampleRate48kHz = 48000
-};
-
-} // namespace ts
-} // namespace webrtc
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_TRANSIENT_COMMON_H_
diff --git a/modules/audio_processing/transient/daubechies_8_wavelet_coeffs.h b/modules/audio_processing/transient/daubechies_8_wavelet_coeffs.h
deleted file mode 100644
index b1236ac..0000000
--- a/modules/audio_processing/transient/daubechies_8_wavelet_coeffs.h
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- *  Copyright (c) 2013 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.
- */
-
-// This header file defines the coefficients of the FIR based approximation of
-// the Meyer Wavelet
-#ifndef WEBRTC_MODULES_AUDIO_PROCESSING_TRANSIENT_DAUBECHIES_8_WAVELET_COEFFS_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_TRANSIENT_DAUBECHIES_8_WAVELET_COEFFS_H_
-
-// Decomposition coefficients Daubechies 8.
-
-namespace webrtc {
-
-const int kDaubechies8CoefficientsLength = 16;
-
-const float kDaubechies8HighPassCoefficients[kDaubechies8CoefficientsLength]
-    = {
-  -5.44158422430816093862e-02f,
-  3.12871590914465924627e-01f,
-  -6.75630736298012846142e-01f,
-  5.85354683654869090148e-01f,
-  1.58291052560238926228e-02f,
-  -2.84015542962428091389e-01f,
-  -4.72484573997972536787e-04f,
-  1.28747426620186011803e-01f,
-  1.73693010020221083600e-02f,
-  -4.40882539310647192377e-02f,
-  -1.39810279170155156436e-02f,
-  8.74609404701565465445e-03f,
-  4.87035299301066034600e-03f,
-  -3.91740372995977108837e-04f,
-  -6.75449405998556772109e-04f,
-  -1.17476784002281916305e-04f
-};
-
-const float kDaubechies8LowPassCoefficients[kDaubechies8CoefficientsLength] = {
-  -1.17476784002281916305e-04f,
-  6.75449405998556772109e-04f,
-  -3.91740372995977108837e-04f,
-  -4.87035299301066034600e-03f,
-  8.74609404701565465445e-03f,
-  1.39810279170155156436e-02f,
-  -4.40882539310647192377e-02f,
-  -1.73693010020221083600e-02f,
-  1.28747426620186011803e-01f,
-  4.72484573997972536787e-04f,
-  -2.84015542962428091389e-01f,
-  -1.58291052560238926228e-02f,
-  5.85354683654869090148e-01f,
-  6.75630736298012846142e-01f,
-  3.12871590914465924627e-01f,
-  5.44158422430816093862e-02f
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_TRANSIENT_DAUBECHIES_8_WAVELET_COEFFS_H_
diff --git a/modules/audio_processing/transient/dyadic_decimator.h b/modules/audio_processing/transient/dyadic_decimator.h
deleted file mode 100644
index c1046f2..0000000
--- a/modules/audio_processing/transient/dyadic_decimator.h
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- *  Copyright (c) 2013 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_PROCESSING_TRANSIENT_DYADIC_DECIMATOR_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_TRANSIENT_DYADIC_DECIMATOR_H_
-
-#include <cstdlib>
-
-#include "webrtc/typedefs.h"
-
-// Provides a set of static methods to perform dyadic decimations.
-
-namespace webrtc {
-
-// Returns the proper length of the output buffer that you should use for the
-// given |in_length| and decimation |odd_sequence|.
-// Return -1 on error.
-inline size_t GetOutLengthToDyadicDecimate(size_t in_length,
-                                           bool odd_sequence) {
-  size_t out_length = in_length / 2;
-
-  if (in_length % 2 == 1 && !odd_sequence) {
-    ++out_length;
-  }
-
-  return out_length;
-}
-
-// Performs a dyadic decimation: removes every odd/even member of a sequence
-// halving its overall length.
-// Arguments:
-//    in: array of |in_length|.
-//    odd_sequence: If false, the odd members will be removed (1, 3, 5, ...);
-//                  if true, the even members will be removed (0, 2, 4, ...).
-//    out: array of |out_length|. |out_length| must be large enough to
-//         hold the decimated output. The necessary length can be provided by
-//         GetOutLengthToDyadicDecimate().
-//         Must be previously allocated.
-// Returns the number of output samples, -1 on error.
-template<typename T>
-static size_t DyadicDecimate(const T* in,
-                             size_t in_length,
-                             bool odd_sequence,
-                             T* out,
-                             size_t out_length) {
-  size_t half_length = GetOutLengthToDyadicDecimate(in_length, odd_sequence);
-
-  if (!in || !out || in_length <= 0 || out_length < half_length) {
-    return 0;
-  }
-
-  size_t output_samples = 0;
-  size_t index_adjustment = odd_sequence ? 1 : 0;
-  for (output_samples = 0; output_samples < half_length; ++output_samples) {
-    out[output_samples] = in[output_samples * 2 + index_adjustment];
-  }
-
-  return output_samples;
-}
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_TRANSIENT_DYADIC_DECIMATOR_H_
diff --git a/modules/audio_processing/transient/dyadic_decimator_unittest.cc b/modules/audio_processing/transient/dyadic_decimator_unittest.cc
deleted file mode 100644
index 7f5bb03..0000000
--- a/modules/audio_processing/transient/dyadic_decimator_unittest.cc
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
- *  Copyright (c) 2013 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_processing/transient/dyadic_decimator.h"
-
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-static const size_t kEvenBufferLength = 6;
-static const size_t kOddBufferLength = 5;
-static const size_t kOutBufferLength = 3;
-
-int16_t const test_buffer_even_len[] = {0, 1, 2, 3, 4, 5};
-int16_t const test_buffer_odd_len[]  = {0, 1, 2, 3, 4};
-int16_t test_buffer_out[kOutBufferLength];
-
-TEST(DyadicDecimatorTest, GetOutLengthToDyadicDecimate) {
-  EXPECT_EQ(3u, GetOutLengthToDyadicDecimate(6, false));
-  EXPECT_EQ(3u, GetOutLengthToDyadicDecimate(6, true));
-  EXPECT_EQ(3u, GetOutLengthToDyadicDecimate(5, false));
-  EXPECT_EQ(2u, GetOutLengthToDyadicDecimate(5, true));
-}
-
-
-TEST(DyadicDecimatorTest, DyadicDecimateErrorValues) {
-  size_t out_samples = 0;
-
-  out_samples = DyadicDecimate(static_cast<int16_t*>(NULL),
-                               kEvenBufferLength,
-                               false,  // Even sequence.
-                               test_buffer_out,
-                               kOutBufferLength);
-  EXPECT_EQ(0u, out_samples);
-
-  out_samples = DyadicDecimate(test_buffer_even_len,
-                               kEvenBufferLength,
-                               false,  // Even sequence.
-                               static_cast<int16_t*>(NULL),
-                               kOutBufferLength);
-  EXPECT_EQ(0u, out_samples);
-
-  // Less than required |out_length|.
-  out_samples = DyadicDecimate(test_buffer_even_len,
-                               kEvenBufferLength,
-                               false,  // Even sequence.
-                               test_buffer_out,
-                               2);
-  EXPECT_EQ(0u, out_samples);
-}
-
-TEST(DyadicDecimatorTest, DyadicDecimateEvenLengthEvenSequence) {
-  size_t expected_out_samples =
-      GetOutLengthToDyadicDecimate(kEvenBufferLength, false);
-
-  size_t out_samples = DyadicDecimate(test_buffer_even_len,
-                                      kEvenBufferLength,
-                                      false,  // Even sequence.
-                                      test_buffer_out,
-                                      kOutBufferLength);
-
-  EXPECT_EQ(expected_out_samples, out_samples);
-
-  EXPECT_EQ(0, test_buffer_out[0]);
-  EXPECT_EQ(2, test_buffer_out[1]);
-  EXPECT_EQ(4, test_buffer_out[2]);
-}
-
-TEST(DyadicDecimatorTest, DyadicDecimateEvenLengthOddSequence) {
-  size_t expected_out_samples =
-      GetOutLengthToDyadicDecimate(kEvenBufferLength, true);
-
-  size_t out_samples = DyadicDecimate(test_buffer_even_len,
-                                      kEvenBufferLength,
-                                      true,  // Odd sequence.
-                                      test_buffer_out,
-                                      kOutBufferLength);
-
-  EXPECT_EQ(expected_out_samples, out_samples);
-
-  EXPECT_EQ(1, test_buffer_out[0]);
-  EXPECT_EQ(3, test_buffer_out[1]);
-  EXPECT_EQ(5, test_buffer_out[2]);
-}
-
-TEST(DyadicDecimatorTest, DyadicDecimateOddLengthEvenSequence) {
-  size_t expected_out_samples =
-      GetOutLengthToDyadicDecimate(kOddBufferLength, false);
-
-  size_t out_samples = DyadicDecimate(test_buffer_odd_len,
-                                      kOddBufferLength,
-                                      false,  // Even sequence.
-                                      test_buffer_out,
-                                      kOutBufferLength);
-
-  EXPECT_EQ(expected_out_samples, out_samples);
-
-  EXPECT_EQ(0, test_buffer_out[0]);
-  EXPECT_EQ(2, test_buffer_out[1]);
-  EXPECT_EQ(4, test_buffer_out[2]);
-}
-
-TEST(DyadicDecimatorTest, DyadicDecimateOddLengthOddSequence) {
-  size_t expected_out_samples =
-      GetOutLengthToDyadicDecimate(kOddBufferLength, true);
-
-  size_t out_samples = DyadicDecimate(test_buffer_odd_len,
-                                      kOddBufferLength,
-                                      true,  // Odd sequence.
-                                      test_buffer_out,
-                                      kOutBufferLength);
-
-  EXPECT_EQ(expected_out_samples, out_samples);
-
-  EXPECT_EQ(1, test_buffer_out[0]);
-  EXPECT_EQ(3, test_buffer_out[1]);
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/transient/file_utils.cc b/modules/audio_processing/transient/file_utils.cc
deleted file mode 100644
index e69bf79..0000000
--- a/modules/audio_processing/transient/file_utils.cc
+++ /dev/null
@@ -1,258 +0,0 @@
-/*
- *  Copyright (c) 2013 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_processing/transient/file_utils.h"
-
-#include <memory>
-
-#include "webrtc/system_wrappers/include/file_wrapper.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-int ConvertByteArrayToFloat(const uint8_t bytes[4], float* out) {
-  if (!bytes || !out) {
-    return -1;
-  }
-
-  uint32_t binary_value = 0;
-  for (int i = 3; i >= 0; --i) {
-    binary_value <<= 8;
-    binary_value += bytes[i];
-  }
-
-  *out = bit_cast<float>(binary_value);
-
-  return 0;
-}
-
-int ConvertByteArrayToDouble(const uint8_t bytes[8], double* out) {
-  if (!bytes || !out) {
-    return -1;
-  }
-
-  uint64_t binary_value = 0;
-  for (int i = 7; i >= 0; --i) {
-    binary_value <<= 8;
-    binary_value += bytes[i];
-  }
-
-  *out = bit_cast<double>(binary_value);
-
-  return 0;
-}
-
-int ConvertFloatToByteArray(float value, uint8_t out_bytes[4]) {
-  if (!out_bytes) {
-    return -1;
-  }
-
-  uint32_t binary_value = bit_cast<uint32_t>(value);
-  for (size_t i = 0; i < 4; ++i) {
-    out_bytes[i] = binary_value;
-    binary_value >>= 8;
-  }
-
-  return 0;
-}
-
-int ConvertDoubleToByteArray(double value, uint8_t out_bytes[8]) {
-  if (!out_bytes) {
-    return -1;
-  }
-
-  uint64_t binary_value = bit_cast<uint64_t>(value);
-  for (size_t i = 0; i < 8; ++i) {
-    out_bytes[i] = binary_value;
-    binary_value >>= 8;
-  }
-
-  return 0;
-}
-
-size_t ReadInt16BufferFromFile(FileWrapper* file,
-                               size_t length,
-                               int16_t* buffer) {
-  if (!file || !file->is_open() || !buffer || length <= 0) {
-    return 0;
-  }
-
-  std::unique_ptr<uint8_t[]> byte_array(new uint8_t[2]);
-
-  size_t int16s_read = 0;
-
-  while (int16s_read < length) {
-    size_t bytes_read = file->Read(byte_array.get(), 2);
-    if (bytes_read < 2) {
-      break;
-    }
-    int16_t value = byte_array[1];
-    value <<= 8;
-    value += byte_array[0];
-    buffer[int16s_read] = value;
-    ++int16s_read;
-  }
-
-  return int16s_read;
-}
-
-size_t ReadInt16FromFileToFloatBuffer(FileWrapper* file,
-                                      size_t length,
-                                      float* buffer) {
-  if (!file || !file->is_open() || !buffer || length <= 0) {
-    return 0;
-  }
-
-  std::unique_ptr<int16_t[]> buffer16(new int16_t[length]);
-
-  size_t int16s_read = ReadInt16BufferFromFile(file, length, buffer16.get());
-
-  for (size_t i = 0; i < int16s_read; ++i) {
-    buffer[i] = buffer16[i];
-  }
-
-  return int16s_read;
-}
-
-size_t ReadInt16FromFileToDoubleBuffer(FileWrapper* file,
-                                       size_t length,
-                                       double* buffer) {
-  if (!file || !file->is_open() || !buffer || length <= 0) {
-    return 0;
-  }
-
-  std::unique_ptr<int16_t[]> buffer16(new int16_t[length]);
-
-  size_t int16s_read = ReadInt16BufferFromFile(file, length, buffer16.get());
-
-  for (size_t i = 0; i < int16s_read; ++i) {
-    buffer[i] = buffer16[i];
-  }
-
-  return int16s_read;
-}
-
-size_t ReadFloatBufferFromFile(FileWrapper* file,
-                               size_t length,
-                               float* buffer) {
-  if (!file || !file->is_open() || !buffer || length <= 0) {
-    return 0;
-  }
-
-  std::unique_ptr<uint8_t[]> byte_array(new uint8_t[4]);
-
-  size_t floats_read = 0;
-
-  while (floats_read < length) {
-    size_t bytes_read = file->Read(byte_array.get(), 4);
-    if (bytes_read < 4) {
-      break;
-    }
-    ConvertByteArrayToFloat(byte_array.get(), &buffer[floats_read]);
-    ++floats_read;
-  }
-
-  return floats_read;
-}
-
-size_t ReadDoubleBufferFromFile(FileWrapper* file,
-                                size_t length,
-                                double* buffer) {
-  if (!file || !file->is_open() || !buffer || length <= 0) {
-    return 0;
-  }
-
-  std::unique_ptr<uint8_t[]> byte_array(new uint8_t[8]);
-
-  size_t doubles_read = 0;
-
-  while (doubles_read < length) {
-    size_t bytes_read = file->Read(byte_array.get(), 8);
-    if (bytes_read < 8) {
-      break;
-    }
-    ConvertByteArrayToDouble(byte_array.get(), &buffer[doubles_read]);
-    ++doubles_read;
-  }
-
-  return doubles_read;
-}
-
-size_t WriteInt16BufferToFile(FileWrapper* file,
-                              size_t length,
-                              const int16_t* buffer) {
-  if (!file || !file->is_open() || !buffer || length <= 0) {
-    return 0;
-  }
-
-  std::unique_ptr<uint8_t[]> byte_array(new uint8_t[2]);
-
-  size_t int16s_written = 0;
-
-  for (int16s_written = 0; int16s_written < length; ++int16s_written) {
-    // Get byte representation.
-    byte_array[0] = buffer[int16s_written] & 0xFF;
-    byte_array[1] = (buffer[int16s_written] >> 8) & 0xFF;
-
-    file->Write(byte_array.get(), 2);
-  }
-
-  file->Flush();
-
-  return int16s_written;
-}
-
-size_t WriteFloatBufferToFile(FileWrapper* file,
-                              size_t length,
-                              const float* buffer) {
-  if (!file || !file->is_open() || !buffer || length <= 0) {
-    return 0;
-  }
-
-  std::unique_ptr<uint8_t[]> byte_array(new uint8_t[4]);
-
-  size_t floats_written = 0;
-
-  for (floats_written = 0; floats_written < length; ++floats_written) {
-    // Get byte representation.
-    ConvertFloatToByteArray(buffer[floats_written], byte_array.get());
-
-    file->Write(byte_array.get(), 4);
-  }
-
-  file->Flush();
-
-  return floats_written;
-}
-
-size_t WriteDoubleBufferToFile(FileWrapper* file,
-                               size_t length,
-                               const double* buffer) {
-  if (!file || !file->is_open() || !buffer || length <= 0) {
-    return 0;
-  }
-
-  std::unique_ptr<uint8_t[]> byte_array(new uint8_t[8]);
-
-  size_t doubles_written = 0;
-
-  for (doubles_written = 0; doubles_written < length; ++doubles_written) {
-    // Get byte representation.
-    ConvertDoubleToByteArray(buffer[doubles_written], byte_array.get());
-
-    file->Write(byte_array.get(), 8);
-  }
-
-  file->Flush();
-
-  return doubles_written;
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/transient/file_utils.h b/modules/audio_processing/transient/file_utils.h
deleted file mode 100644
index cc76953..0000000
--- a/modules/audio_processing/transient/file_utils.h
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- *  Copyright (c) 2013 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_PROCESSING_TRANSIENT_FILE_UTILS_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_TRANSIENT_FILE_UTILS_H_
-
-#include <string.h>
-
-#include "webrtc/system_wrappers/include/file_wrapper.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-// This is a copy of the cast included in the Chromium codebase here:
-// http://cs.chromium.org/src/third_party/cld/base/casts.h
-template <class Dest, class Source>
-inline Dest bit_cast(const Source& source) {
-  // A compile error here means your Dest and Source have different sizes.
-  static_assert(sizeof(Dest) == sizeof(Source),
-                "Dest and Source have different sizes");
-
-  Dest dest;
-  memcpy(&dest, &source, sizeof(dest));
-  return dest;
-}
-
-// Converts the byte array with binary float representation to float.
-// Bytes must be in little-endian order.
-// Returns 0 if correct, -1 on error.
-int ConvertByteArrayToFloat(const uint8_t bytes[4], float* out);
-
-// Converts the byte array with binary double representation to double.
-// Bytes must be in little-endian order.
-// Returns 0 if correct, -1 on error.
-int ConvertByteArrayToDouble(const uint8_t bytes[8], double* out);
-
-// Converts a float to a byte array with binary float representation.
-// Bytes will be in little-endian order.
-// Returns 0 if correct, -1 on error.
-int ConvertFloatToByteArray(float value, uint8_t out_bytes[4]);
-
-// Converts a double to a byte array with binary double representation.
-// Bytes will be in little-endian order.
-// Returns 0 if correct, -1 on error.
-int ConvertDoubleToByteArray(double value, uint8_t out_bytes[8]);
-
-// Reads |length| 16-bit integers from |file| to |buffer|.
-// |file| must be previously opened.
-// Returns the number of 16-bit integers read or -1 on error.
-size_t ReadInt16BufferFromFile(FileWrapper* file,
-                               size_t length,
-                               int16_t* buffer);
-
-// Reads |length| 16-bit integers from |file| and stores those values
-// (converting them) in |buffer|.
-// |file| must be previously opened.
-// Returns the number of 16-bit integers read or -1 on error.
-size_t ReadInt16FromFileToFloatBuffer(FileWrapper* file,
-                                      size_t length,
-                                      float* buffer);
-
-// Reads |length| 16-bit integers from |file| and stores those values
-// (converting them) in |buffer|.
-// |file| must be previously opened.
-// Returns the number of 16-bit integers read or -1 on error.
-size_t ReadInt16FromFileToDoubleBuffer(FileWrapper* file,
-                                       size_t length,
-                                       double* buffer);
-
-// Reads |length| floats in binary representation (4 bytes) from |file| to
-// |buffer|.
-// |file| must be previously opened.
-// Returns the number of floats read or -1 on error.
-size_t ReadFloatBufferFromFile(FileWrapper* file, size_t length, float* buffer);
-
-// Reads |length| doubles in binary representation (8 bytes) from |file| to
-// |buffer|.
-// |file| must be previously opened.
-// Returns the number of doubles read or -1 on error.
-size_t ReadDoubleBufferFromFile(FileWrapper* file,
-                                size_t length,
-                                double* buffer);
-
-// Writes |length| 16-bit integers from |buffer| in binary representation (2
-// bytes) to |file|. It flushes |file|, so after this call there are no
-// writings pending.
-// |file| must be previously opened.
-// Returns the number of doubles written or -1 on error.
-size_t WriteInt16BufferToFile(FileWrapper* file,
-                              size_t length,
-                              const int16_t* buffer);
-
-// Writes |length| floats from |buffer| in binary representation (4 bytes) to
-// |file|. It flushes |file|, so after this call there are no writtings pending.
-// |file| must be previously opened.
-// Returns the number of doubles written or -1 on error.
-size_t WriteFloatBufferToFile(FileWrapper* file,
-                              size_t length,
-                              const float* buffer);
-
-// Writes |length| doubles from |buffer| in binary representation (8 bytes) to
-// |file|. It flushes |file|, so after this call there are no writings pending.
-// |file| must be previously opened.
-// Returns the number of doubles written or -1 on error.
-size_t WriteDoubleBufferToFile(FileWrapper* file,
-                               size_t length,
-                               const double* buffer);
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_TRANSIENT_FILE_UTILS_H_
diff --git a/modules/audio_processing/transient/file_utils_unittest.cc b/modules/audio_processing/transient/file_utils_unittest.cc
deleted file mode 100644
index 2909ac3..0000000
--- a/modules/audio_processing/transient/file_utils_unittest.cc
+++ /dev/null
@@ -1,539 +0,0 @@
-/*
- *  Copyright (c) 2013 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_processing/transient/file_utils.h"
-
-#include <string.h>
-#include <string>
-#include <memory>
-#include <vector>
-
-#include "webrtc/system_wrappers/include/file_wrapper.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/testsupport/fileutils.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-static const uint8_t kPiBytesf[4] = {0xDB, 0x0F, 0x49, 0x40};
-static const uint8_t kEBytesf[4] = {0x54, 0xF8, 0x2D, 0x40};
-static const uint8_t kAvogadroBytesf[4] = {0x2F, 0x0C, 0xFF, 0x66};
-
-static const uint8_t kPiBytes[8] =
-    {0x18, 0x2D, 0x44, 0x54, 0xFB, 0x21, 0x09, 0x40};
-static const uint8_t kEBytes[8] =
-    {0x69, 0x57, 0x14, 0x8B, 0x0A, 0xBF, 0x05, 0x40};
-static const uint8_t kAvogadroBytes[8] =
-    {0xF4, 0xBC, 0xA8, 0xDF, 0x85, 0xE1, 0xDF, 0x44};
-
-static const double kPi = 3.14159265358979323846;
-static const double kE = 2.71828182845904523536;
-static const double kAvogadro = 602214100000000000000000.0;
-
-class TransientFileUtilsTest: public ::testing::Test {
- protected:
-  TransientFileUtilsTest()
-      : kTestFileName(
-            test::ResourcePath("audio_processing/transient/double-utils",
-                               "dat")),
-        kTestFileNamef(
-            test::ResourcePath("audio_processing/transient/float-utils",
-                               "dat")) {}
-
-  ~TransientFileUtilsTest() override {
-    CleanupTempFiles();
-  }
-
-  std::string CreateTempFilename(const std::string& dir,
-      const std::string& prefix) {
-    std::string filename = test::TempFilename(dir, prefix);
-    temp_filenames_.push_back(filename);
-    return filename;
-  }
-
-  void CleanupTempFiles() {
-    for (const std::string& filename : temp_filenames_) {
-      remove(filename.c_str());
-    }
-    temp_filenames_.clear();
-  }
-
-  // This file (used in some tests) contains binary data. The data correspond to
-  // the double representation of the constants: Pi, E, and the Avogadro's
-  // Number;
-  // appended in that order.
-  const std::string kTestFileName;
-
-  // This file (used in some tests) contains binary data. The data correspond to
-  // the float representation of the constants: Pi, E, and the Avogadro's
-  // Number;
-  // appended in that order.
-  const std::string kTestFileNamef;
-
-  // List of temporary filenames created by CreateTempFilename.
-  std::vector<std::string> temp_filenames_;
-};
-
-#if defined(WEBRTC_IOS)
-#define MAYBE_ConvertByteArrayToFloat DISABLED_ConvertByteArrayToFloat
-#else
-#define MAYBE_ConvertByteArrayToFloat ConvertByteArrayToFloat
-#endif
-TEST_F(TransientFileUtilsTest, MAYBE_ConvertByteArrayToFloat) {
-  float value = 0.0;
-
-  EXPECT_EQ(0, ConvertByteArrayToFloat(kPiBytesf, &value));
-  EXPECT_FLOAT_EQ(kPi, value);
-
-  EXPECT_EQ(0, ConvertByteArrayToFloat(kEBytesf, &value));
-  EXPECT_FLOAT_EQ(kE, value);
-
-  EXPECT_EQ(0, ConvertByteArrayToFloat(kAvogadroBytesf, &value));
-  EXPECT_FLOAT_EQ(kAvogadro, value);
-}
-
-#if defined(WEBRTC_IOS)
-#define MAYBE_ConvertByteArrayToDouble DISABLED_ConvertByteArrayToDouble
-#else
-#define MAYBE_ConvertByteArrayToDouble ConvertByteArrayToDouble
-#endif
-TEST_F(TransientFileUtilsTest, MAYBE_ConvertByteArrayToDouble) {
-  double value = 0.0;
-
-  EXPECT_EQ(0, ConvertByteArrayToDouble(kPiBytes, &value));
-  EXPECT_DOUBLE_EQ(kPi, value);
-
-  EXPECT_EQ(0, ConvertByteArrayToDouble(kEBytes, &value));
-  EXPECT_DOUBLE_EQ(kE, value);
-
-  EXPECT_EQ(0, ConvertByteArrayToDouble(kAvogadroBytes, &value));
-  EXPECT_DOUBLE_EQ(kAvogadro, value);
-}
-
-#if defined(WEBRTC_IOS)
-#define MAYBE_ConvertFloatToByteArray DISABLED_ConvertFloatToByteArray
-#else
-#define MAYBE_ConvertFloatToByteArray ConvertFloatToByteArray
-#endif
-TEST_F(TransientFileUtilsTest, MAYBE_ConvertFloatToByteArray) {
-  std::unique_ptr<uint8_t[]> bytes(new uint8_t[4]);
-
-  EXPECT_EQ(0, ConvertFloatToByteArray(kPi, bytes.get()));
-  EXPECT_EQ(0, memcmp(bytes.get(), kPiBytesf, 4));
-
-  EXPECT_EQ(0, ConvertFloatToByteArray(kE, bytes.get()));
-  EXPECT_EQ(0, memcmp(bytes.get(), kEBytesf, 4));
-
-  EXPECT_EQ(0, ConvertFloatToByteArray(kAvogadro, bytes.get()));
-  EXPECT_EQ(0, memcmp(bytes.get(), kAvogadroBytesf, 4));
-}
-
-#if defined(WEBRTC_IOS)
-#define MAYBE_ConvertDoubleToByteArray DISABLED_ConvertDoubleToByteArray
-#else
-#define MAYBE_ConvertDoubleToByteArray ConvertDoubleToByteArray
-#endif
-TEST_F(TransientFileUtilsTest, MAYBE_ConvertDoubleToByteArray) {
-  std::unique_ptr<uint8_t[]> bytes(new uint8_t[8]);
-
-  EXPECT_EQ(0, ConvertDoubleToByteArray(kPi, bytes.get()));
-  EXPECT_EQ(0, memcmp(bytes.get(), kPiBytes, 8));
-
-  EXPECT_EQ(0, ConvertDoubleToByteArray(kE, bytes.get()));
-  EXPECT_EQ(0, memcmp(bytes.get(), kEBytes, 8));
-
-  EXPECT_EQ(0, ConvertDoubleToByteArray(kAvogadro, bytes.get()));
-  EXPECT_EQ(0, memcmp(bytes.get(), kAvogadroBytes, 8));
-}
-
-#if defined(WEBRTC_IOS)
-#define MAYBE_ReadInt16BufferFromFile DISABLED_ReadInt16BufferFromFile
-#else
-#define MAYBE_ReadInt16BufferFromFile ReadInt16BufferFromFile
-#endif
-TEST_F(TransientFileUtilsTest, MAYBE_ReadInt16BufferFromFile) {
-  std::string test_filename = kTestFileName;
-
-  std::unique_ptr<FileWrapper> file(FileWrapper::Create());
-
-  file->OpenFile(test_filename.c_str(), true);  // Read only.
-  ASSERT_TRUE(file->is_open()) << "File could not be opened:\n"
-                               << kTestFileName.c_str();
-
-  const size_t kBufferLength = 12;
-  std::unique_ptr<int16_t[]> buffer(new int16_t[kBufferLength]);
-
-  EXPECT_EQ(kBufferLength, ReadInt16BufferFromFile(file.get(),
-                                                   kBufferLength,
-                                                   buffer.get()));
-  EXPECT_EQ(22377, buffer[4]);
-  EXPECT_EQ(16389, buffer[7]);
-  EXPECT_EQ(17631, buffer[kBufferLength - 1]);
-
-  file->Rewind();
-
-  // The next test is for checking the case where there are not as much data as
-  // needed in the file, but reads to the end, and it returns the number of
-  // int16s read.
-  const size_t kBufferLenghtLargerThanFile = kBufferLength * 2;
-  buffer.reset(new int16_t[kBufferLenghtLargerThanFile]);
-  EXPECT_EQ(kBufferLength, ReadInt16BufferFromFile(file.get(),
-                                                   kBufferLenghtLargerThanFile,
-                                                   buffer.get()));
-  EXPECT_EQ(11544, buffer[0]);
-  EXPECT_EQ(22377, buffer[4]);
-  EXPECT_EQ(16389, buffer[7]);
-  EXPECT_EQ(17631, buffer[kBufferLength - 1]);
-}
-
-#if defined(WEBRTC_IOS)
-#define MAYBE_ReadInt16FromFileToFloatBuffer \
-  DISABLED_ReadInt16FromFileToFloatBuffer
-#else
-#define MAYBE_ReadInt16FromFileToFloatBuffer ReadInt16FromFileToFloatBuffer
-#endif
-TEST_F(TransientFileUtilsTest, MAYBE_ReadInt16FromFileToFloatBuffer) {
-  std::string test_filename = kTestFileName;
-
-  std::unique_ptr<FileWrapper> file(FileWrapper::Create());
-
-  file->OpenFile(test_filename.c_str(), true);  // Read only.
-  ASSERT_TRUE(file->is_open()) << "File could not be opened:\n"
-                               << kTestFileName.c_str();
-
-  const size_t kBufferLength = 12;
-  std::unique_ptr<float[]> buffer(new float[kBufferLength]);
-
-  EXPECT_EQ(kBufferLength, ReadInt16FromFileToFloatBuffer(file.get(),
-                                                          kBufferLength,
-                                                          buffer.get()));
-
-  EXPECT_DOUBLE_EQ(11544, buffer[0]);
-  EXPECT_DOUBLE_EQ(22377, buffer[4]);
-  EXPECT_DOUBLE_EQ(16389, buffer[7]);
-  EXPECT_DOUBLE_EQ(17631, buffer[kBufferLength - 1]);
-
-  file->Rewind();
-
-  // The next test is for checking the case where there are not as much data as
-  // needed in the file, but reads to the end, and it returns the number of
-  // int16s read.
-  const size_t kBufferLenghtLargerThanFile = kBufferLength * 2;
-  buffer.reset(new float[kBufferLenghtLargerThanFile]);
-  EXPECT_EQ(kBufferLength,
-            ReadInt16FromFileToFloatBuffer(file.get(),
-                                           kBufferLenghtLargerThanFile,
-                                           buffer.get()));
-  EXPECT_DOUBLE_EQ(11544, buffer[0]);
-  EXPECT_DOUBLE_EQ(22377, buffer[4]);
-  EXPECT_DOUBLE_EQ(16389, buffer[7]);
-  EXPECT_DOUBLE_EQ(17631, buffer[kBufferLength - 1]);
-}
-
-#if defined(WEBRTC_IOS)
-#define MAYBE_ReadInt16FromFileToDoubleBuffer \
-  DISABLED_ReadInt16FromFileToDoubleBuffer
-#else
-#define MAYBE_ReadInt16FromFileToDoubleBuffer ReadInt16FromFileToDoubleBuffer
-#endif
-TEST_F(TransientFileUtilsTest, MAYBE_ReadInt16FromFileToDoubleBuffer) {
-  std::string test_filename = kTestFileName;
-
-  std::unique_ptr<FileWrapper> file(FileWrapper::Create());
-
-  file->OpenFile(test_filename.c_str(), true);  // Read only.
-  ASSERT_TRUE(file->is_open()) << "File could not be opened:\n"
-                               << kTestFileName.c_str();
-
-  const size_t kBufferLength = 12;
-  std::unique_ptr<double[]> buffer(new double[kBufferLength]);
-
-  EXPECT_EQ(kBufferLength, ReadInt16FromFileToDoubleBuffer(file.get(),
-                                                           kBufferLength,
-                                                           buffer.get()));
-  EXPECT_DOUBLE_EQ(11544, buffer[0]);
-  EXPECT_DOUBLE_EQ(22377, buffer[4]);
-  EXPECT_DOUBLE_EQ(16389, buffer[7]);
-  EXPECT_DOUBLE_EQ(17631, buffer[kBufferLength - 1]);
-
-  file->Rewind();
-
-  // The next test is for checking the case where there are not as much data as
-  // needed in the file, but reads to the end, and it returns the number of
-  // int16s read.
-  const size_t kBufferLenghtLargerThanFile = kBufferLength * 2;
-  buffer.reset(new double[kBufferLenghtLargerThanFile]);
-  EXPECT_EQ(kBufferLength,
-            ReadInt16FromFileToDoubleBuffer(file.get(),
-                                            kBufferLenghtLargerThanFile,
-                                            buffer.get()));
-  EXPECT_DOUBLE_EQ(11544, buffer[0]);
-  EXPECT_DOUBLE_EQ(22377, buffer[4]);
-  EXPECT_DOUBLE_EQ(16389, buffer[7]);
-  EXPECT_DOUBLE_EQ(17631, buffer[kBufferLength - 1]);
-}
-
-#if defined(WEBRTC_IOS)
-#define MAYBE_ReadFloatBufferFromFile DISABLED_ReadFloatBufferFromFile
-#else
-#define MAYBE_ReadFloatBufferFromFile ReadFloatBufferFromFile
-#endif
-TEST_F(TransientFileUtilsTest, MAYBE_ReadFloatBufferFromFile) {
-  std::string test_filename = kTestFileNamef;
-
-  std::unique_ptr<FileWrapper> file(FileWrapper::Create());
-
-  file->OpenFile(test_filename.c_str(), true);  // Read only.
-  ASSERT_TRUE(file->is_open()) << "File could not be opened:\n"
-                               << kTestFileNamef.c_str();
-
-  const size_t kBufferLength = 3;
-  std::unique_ptr<float[]> buffer(new float[kBufferLength]);
-
-  EXPECT_EQ(kBufferLength, ReadFloatBufferFromFile(file.get(),
-                                                   kBufferLength,
-                                                   buffer.get()));
-  EXPECT_FLOAT_EQ(kPi, buffer[0]);
-  EXPECT_FLOAT_EQ(kE, buffer[1]);
-  EXPECT_FLOAT_EQ(kAvogadro, buffer[2]);
-
-  file->Rewind();
-
-  // The next test is for checking the case where there are not as much data as
-  // needed in the file, but reads to the end, and it returns the number of
-  // doubles read.
-  const size_t kBufferLenghtLargerThanFile = kBufferLength * 2;
-  buffer.reset(new float[kBufferLenghtLargerThanFile]);
-  EXPECT_EQ(kBufferLength, ReadFloatBufferFromFile(file.get(),
-                                                   kBufferLenghtLargerThanFile,
-                                                   buffer.get()));
-  EXPECT_FLOAT_EQ(kPi, buffer[0]);
-  EXPECT_FLOAT_EQ(kE, buffer[1]);
-  EXPECT_FLOAT_EQ(kAvogadro, buffer[2]);
-}
-
-#if defined(WEBRTC_IOS)
-#define MAYBE_ReadDoubleBufferFromFile DISABLED_ReadDoubleBufferFromFile
-#else
-#define MAYBE_ReadDoubleBufferFromFile ReadDoubleBufferFromFile
-#endif
-TEST_F(TransientFileUtilsTest, MAYBE_ReadDoubleBufferFromFile) {
-  std::string test_filename = kTestFileName;
-
-  std::unique_ptr<FileWrapper> file(FileWrapper::Create());
-
-  file->OpenFile(test_filename.c_str(), true);  // Read only.
-  ASSERT_TRUE(file->is_open()) << "File could not be opened:\n"
-                               << kTestFileName.c_str();
-
-  const size_t kBufferLength = 3;
-  std::unique_ptr<double[]> buffer(new double[kBufferLength]);
-
-  EXPECT_EQ(kBufferLength, ReadDoubleBufferFromFile(file.get(),
-                                                    kBufferLength,
-                                                    buffer.get()));
-  EXPECT_DOUBLE_EQ(kPi, buffer[0]);
-  EXPECT_DOUBLE_EQ(kE, buffer[1]);
-  EXPECT_DOUBLE_EQ(kAvogadro, buffer[2]);
-
-  file->Rewind();
-
-  // The next test is for checking the case where there are not as much data as
-  // needed in the file, but reads to the end, and it returns the number of
-  // doubles read.
-  const size_t kBufferLenghtLargerThanFile = kBufferLength * 2;
-  buffer.reset(new double[kBufferLenghtLargerThanFile]);
-  EXPECT_EQ(kBufferLength, ReadDoubleBufferFromFile(file.get(),
-                                                    kBufferLenghtLargerThanFile,
-                                                    buffer.get()));
-  EXPECT_DOUBLE_EQ(kPi, buffer[0]);
-  EXPECT_DOUBLE_EQ(kE, buffer[1]);
-  EXPECT_DOUBLE_EQ(kAvogadro, buffer[2]);
-}
-
-#if defined(WEBRTC_IOS)
-#define MAYBE_WriteInt16BufferToFile DISABLED_WriteInt16BufferToFile
-#else
-#define MAYBE_WriteInt16BufferToFile WriteInt16BufferToFile
-#endif
-TEST_F(TransientFileUtilsTest, MAYBE_WriteInt16BufferToFile) {
-  std::unique_ptr<FileWrapper> file(FileWrapper::Create());
-
-  std::string kOutFileName = CreateTempFilename(test::OutputPath(),
-                                                "utils_test");
-
-  file->OpenFile(kOutFileName.c_str(), false);  // Write mode.
-  ASSERT_TRUE(file->is_open()) << "File could not be opened:\n"
-                               << kOutFileName.c_str();
-
-  const size_t kBufferLength = 3;
-  std::unique_ptr<int16_t[]> written_buffer(new int16_t[kBufferLength]);
-  std::unique_ptr<int16_t[]> read_buffer(new int16_t[kBufferLength]);
-
-  written_buffer[0] = 1;
-  written_buffer[1] = 2;
-  written_buffer[2] = 3;
-
-  EXPECT_EQ(kBufferLength, WriteInt16BufferToFile(file.get(),
-                                                  kBufferLength,
-                                                  written_buffer.get()));
-
-  file->CloseFile();
-
-  file->OpenFile(kOutFileName.c_str(), true);  // Read only.
-  ASSERT_TRUE(file->is_open()) << "File could not be opened:\n"
-                               << kOutFileName.c_str();
-
-  EXPECT_EQ(kBufferLength, ReadInt16BufferFromFile(file.get(),
-                                                   kBufferLength,
-                                                   read_buffer.get()));
-  EXPECT_EQ(0, memcmp(written_buffer.get(),
-                      read_buffer.get(),
-                      kBufferLength * sizeof(written_buffer[0])));
-}
-
-#if defined(WEBRTC_IOS)
-#define MAYBE_WriteFloatBufferToFile DISABLED_WriteFloatBufferToFile
-#else
-#define MAYBE_WriteFloatBufferToFile WriteFloatBufferToFile
-#endif
-TEST_F(TransientFileUtilsTest, MAYBE_WriteFloatBufferToFile) {
-  std::unique_ptr<FileWrapper> file(FileWrapper::Create());
-
-  std::string kOutFileName = CreateTempFilename(test::OutputPath(),
-                                                "utils_test");
-
-  file->OpenFile(kOutFileName.c_str(), false);  // Write mode.
-  ASSERT_TRUE(file->is_open()) << "File could not be opened:\n"
-                               << kOutFileName.c_str();
-
-  const size_t kBufferLength = 3;
-  std::unique_ptr<float[]> written_buffer(new float[kBufferLength]);
-  std::unique_ptr<float[]> read_buffer(new float[kBufferLength]);
-
-  written_buffer[0] = static_cast<float>(kPi);
-  written_buffer[1] = static_cast<float>(kE);
-  written_buffer[2] = static_cast<float>(kAvogadro);
-
-  EXPECT_EQ(kBufferLength, WriteFloatBufferToFile(file.get(),
-                                                  kBufferLength,
-                                                  written_buffer.get()));
-
-  file->CloseFile();
-
-  file->OpenFile(kOutFileName.c_str(), true);  // Read only.
-  ASSERT_TRUE(file->is_open()) << "File could not be opened:\n"
-                               << kOutFileName.c_str();
-
-  EXPECT_EQ(kBufferLength, ReadFloatBufferFromFile(file.get(),
-                                                   kBufferLength,
-                                                   read_buffer.get()));
-  EXPECT_EQ(0, memcmp(written_buffer.get(),
-                      read_buffer.get(),
-                      kBufferLength * sizeof(written_buffer[0])));
-}
-
-#if defined(WEBRTC_IOS)
-#define MAYBE_WriteDoubleBufferToFile DISABLED_WriteDoubleBufferToFile
-#else
-#define MAYBE_WriteDoubleBufferToFile WriteDoubleBufferToFile
-#endif
-TEST_F(TransientFileUtilsTest, MAYBE_WriteDoubleBufferToFile) {
-  std::unique_ptr<FileWrapper> file(FileWrapper::Create());
-
-  std::string kOutFileName = CreateTempFilename(test::OutputPath(),
-                                                "utils_test");
-
-  file->OpenFile(kOutFileName.c_str(), false);  // Write mode.
-  ASSERT_TRUE(file->is_open()) << "File could not be opened:\n"
-                               << kOutFileName.c_str();
-
-  const size_t kBufferLength = 3;
-  std::unique_ptr<double[]> written_buffer(new double[kBufferLength]);
-  std::unique_ptr<double[]> read_buffer(new double[kBufferLength]);
-
-  written_buffer[0] = kPi;
-  written_buffer[1] = kE;
-  written_buffer[2] = kAvogadro;
-
-  EXPECT_EQ(kBufferLength, WriteDoubleBufferToFile(file.get(),
-                                                   kBufferLength,
-                                                   written_buffer.get()));
-
-  file->CloseFile();
-
-  file->OpenFile(kOutFileName.c_str(), true);  // Read only.
-  ASSERT_TRUE(file->is_open()) << "File could not be opened:\n"
-                               << kOutFileName.c_str();
-
-  EXPECT_EQ(kBufferLength, ReadDoubleBufferFromFile(file.get(),
-                                                    kBufferLength,
-                                                    read_buffer.get()));
-  EXPECT_EQ(0, memcmp(written_buffer.get(),
-                      read_buffer.get(),
-                      kBufferLength * sizeof(written_buffer[0])));
-}
-
-#if defined(WEBRTC_IOS)
-#define MAYBE_ExpectedErrorReturnValues DISABLED_ExpectedErrorReturnValues
-#else
-#define MAYBE_ExpectedErrorReturnValues ExpectedErrorReturnValues
-#endif
-TEST_F(TransientFileUtilsTest, MAYBE_ExpectedErrorReturnValues) {
-  std::string test_filename = kTestFileName;
-
-  double value;
-  std::unique_ptr<int16_t[]> int16_buffer(new int16_t[1]);
-  std::unique_ptr<double[]> double_buffer(new double[1]);
-  std::unique_ptr<FileWrapper> file(FileWrapper::Create());
-
-  EXPECT_EQ(-1, ConvertByteArrayToDouble(NULL, &value));
-  EXPECT_EQ(-1, ConvertByteArrayToDouble(kPiBytes, NULL));
-
-  EXPECT_EQ(-1, ConvertDoubleToByteArray(kPi, NULL));
-
-  // Tests with file not opened.
-  EXPECT_EQ(0u, ReadInt16BufferFromFile(file.get(), 1, int16_buffer.get()));
-  EXPECT_EQ(0u, ReadInt16FromFileToDoubleBuffer(file.get(),
-                                                1,
-                                                double_buffer.get()));
-  EXPECT_EQ(0u, ReadDoubleBufferFromFile(file.get(), 1, double_buffer.get()));
-  EXPECT_EQ(0u, WriteInt16BufferToFile(file.get(), 1, int16_buffer.get()));
-  EXPECT_EQ(0u, WriteDoubleBufferToFile(file.get(), 1, double_buffer.get()));
-
-  file->OpenFile(test_filename.c_str(), true);  // Read only.
-  ASSERT_TRUE(file->is_open()) << "File could not be opened:\n"
-                               << kTestFileName.c_str();
-
-  EXPECT_EQ(0u, ReadInt16BufferFromFile(NULL, 1, int16_buffer.get()));
-  EXPECT_EQ(0u, ReadInt16BufferFromFile(file.get(), 1, NULL));
-  EXPECT_EQ(0u, ReadInt16BufferFromFile(file.get(), 0, int16_buffer.get()));
-
-  EXPECT_EQ(0u, ReadInt16FromFileToDoubleBuffer(NULL, 1, double_buffer.get()));
-  EXPECT_EQ(0u, ReadInt16FromFileToDoubleBuffer(file.get(), 1, NULL));
-  EXPECT_EQ(0u, ReadInt16FromFileToDoubleBuffer(file.get(),
-                                                0,
-                                                double_buffer.get()));
-
-  EXPECT_EQ(0u, ReadDoubleBufferFromFile(NULL, 1, double_buffer.get()));
-  EXPECT_EQ(0u, ReadDoubleBufferFromFile(file.get(), 1, NULL));
-  EXPECT_EQ(0u, ReadDoubleBufferFromFile(file.get(), 0, double_buffer.get()));
-
-  EXPECT_EQ(0u, WriteInt16BufferToFile(NULL, 1, int16_buffer.get()));
-  EXPECT_EQ(0u, WriteInt16BufferToFile(file.get(), 1, NULL));
-  EXPECT_EQ(0u, WriteInt16BufferToFile(file.get(), 0, int16_buffer.get()));
-
-  EXPECT_EQ(0u, WriteDoubleBufferToFile(NULL, 1, double_buffer.get()));
-  EXPECT_EQ(0u, WriteDoubleBufferToFile(file.get(), 1, NULL));
-  EXPECT_EQ(0u, WriteDoubleBufferToFile(file.get(), 0, double_buffer.get()));
-}
-
-}  // namespace webrtc
-
diff --git a/modules/audio_processing/transient/moving_moments.cc b/modules/audio_processing/transient/moving_moments.cc
deleted file mode 100644
index bca987f..0000000
--- a/modules/audio_processing/transient/moving_moments.cc
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- *  Copyright (c) 2013 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_processing/transient/moving_moments.h"
-
-#include <math.h>
-#include <string.h>
-
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-
-MovingMoments::MovingMoments(size_t length)
-    : length_(length),
-      queue_(),
-      sum_(0.0),
-      sum_of_squares_(0.0) {
-  RTC_DCHECK_GT(length, 0);
-  for (size_t i = 0; i < length; ++i) {
-    queue_.push(0.0);
-  }
-}
-
-MovingMoments::~MovingMoments() {}
-
-void MovingMoments::CalculateMoments(const float* in, size_t in_length,
-                                     float* first, float* second) {
-  RTC_DCHECK(in);
-  RTC_DCHECK_GT(in_length, 0);
-  RTC_DCHECK(first);
-  RTC_DCHECK(second);
-
-  for (size_t i = 0; i < in_length; ++i) {
-    const float old_value = queue_.front();
-    queue_.pop();
-    queue_.push(in[i]);
-
-    sum_ += in[i] - old_value;
-    sum_of_squares_ += in[i] * in[i] - old_value * old_value;
-    first[i] = sum_ / length_;
-    second[i] = sum_of_squares_ / length_;
-  }
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/transient/moving_moments.h b/modules/audio_processing/transient/moving_moments.h
deleted file mode 100644
index 9e22a92..0000000
--- a/modules/audio_processing/transient/moving_moments.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- *  Copyright (c) 2013 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_PROCESSING_TRANSIENT_MOVING_MOMENTS_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_TRANSIENT_MOVING_MOMENTS_H_
-
-#include <stddef.h>
-
-#include <queue>
-
-namespace webrtc {
-
-// Calculates the first and second moments for each value of a buffer taking
-// into account a given number of previous values.
-// It preserves its state, so it can be multiple-called.
-// TODO(chadan): Implement a function that takes a buffer of first moments and a
-// buffer of second moments; and calculates the variances. When needed.
-// TODO(chadan): Add functionality to update with a buffer but only output are
-// the last values of the moments. When needed.
-class MovingMoments {
- public:
-  // Creates a Moving Moments object, that uses the last |length| values
-  // (including the new value introduced in every new calculation).
-  explicit MovingMoments(size_t length);
-  ~MovingMoments();
-
-  // Calculates the new values using |in|. Results will be in the out buffers.
-  // |first| and |second| must be allocated with at least |in_length|.
-  void CalculateMoments(const float* in, size_t in_length,
-                        float* first, float* second);
-
- private:
-  size_t length_;
-  // A queue holding the |length_| latest input values.
-  std::queue<float> queue_;
-  // Sum of the values of the queue.
-  float sum_;
-  // Sum of the squares of the values of the queue.
-  float sum_of_squares_;
-};
-
-}  // namespace webrtc
-
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_TRANSIENT_MOVING_MOMENTS_H_
diff --git a/modules/audio_processing/transient/moving_moments_unittest.cc b/modules/audio_processing/transient/moving_moments_unittest.cc
deleted file mode 100644
index eb645ee..0000000
--- a/modules/audio_processing/transient/moving_moments_unittest.cc
+++ /dev/null
@@ -1,207 +0,0 @@
-/*
- *  Copyright (c) 2013 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_processing/transient/moving_moments.h"
-
-#include <memory>
-
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-static const float kTolerance = 0.0001f;
-
-class MovingMomentsTest : public ::testing::Test {
- protected:
-  static const size_t kMovingMomentsBufferLength = 5;
-  static const size_t kMaxOutputLength = 20;  // Valid for this tests only.
-
-  virtual void SetUp();
-  // Calls CalculateMoments and verifies that it produces the expected
-  // outputs.
-  void CalculateMomentsAndVerify(const float* input, size_t input_length,
-                                 const float* expected_mean,
-                                 const float* expected_mean_squares);
-
-  std::unique_ptr<MovingMoments> moving_moments_;
-  float output_mean_[kMaxOutputLength];
-  float output_mean_squares_[kMaxOutputLength];
-};
-
-const size_t MovingMomentsTest::kMaxOutputLength;
-
-void MovingMomentsTest::SetUp() {
-  moving_moments_.reset(new MovingMoments(kMovingMomentsBufferLength));
-}
-
-void MovingMomentsTest::CalculateMomentsAndVerify(
-    const float* input, size_t input_length,
-    const float* expected_mean,
-    const float* expected_mean_squares) {
-  ASSERT_LE(input_length, kMaxOutputLength);
-
-  moving_moments_->CalculateMoments(input,
-                                    input_length,
-                                    output_mean_,
-                                    output_mean_squares_);
-
-  for (size_t i = 1; i < input_length; ++i) {
-    EXPECT_NEAR(expected_mean[i], output_mean_[i], kTolerance);
-    EXPECT_NEAR(expected_mean_squares[i], output_mean_squares_[i], kTolerance);
-  }
-}
-
-TEST_F(MovingMomentsTest, CorrectMomentsOfAnAllZerosBuffer) {
-  const float kInput[] = {0.f, 0.f, 0.f, 0.f, 0.f};
-  const size_t kInputLength = sizeof(kInput) / sizeof(kInput[0]);
-
-  const float expected_mean[kInputLength] = {0.f, 0.f, 0.f, 0.f, 0.f};
-  const float expected_mean_squares[kInputLength] = {0.f, 0.f, 0.f, 0.f, 0.f};
-
-  CalculateMomentsAndVerify(kInput, kInputLength, expected_mean,
-                            expected_mean_squares);
-}
-
-TEST_F(MovingMomentsTest, CorrectMomentsOfAConstantBuffer) {
-  const float kInput[] = {5.f, 5.f, 5.f, 5.f, 5.f, 5.f, 5.f, 5.f, 5.f, 5.f};
-  const size_t kInputLength = sizeof(kInput) / sizeof(kInput[0]);
-
-  const float expected_mean[kInputLength] =
-      {1.f, 2.f, 3.f, 4.f, 5.f, 5.f, 5.f, 5.f, 5.f, 5.f};
-  const float expected_mean_squares[kInputLength] =
-      {5.f, 10.f, 15.f, 20.f, 25.f, 25.f, 25.f, 25.f, 25.f, 25.f};
-
-  CalculateMomentsAndVerify(kInput, kInputLength, expected_mean,
-                            expected_mean_squares);
-}
-
-TEST_F(MovingMomentsTest, CorrectMomentsOfAnIncreasingBuffer) {
-  const float kInput[] = {1.f, 2.f, 3.f, 4.f, 5.f, 6.f, 7.f, 8.f, 9.f};
-  const size_t kInputLength = sizeof(kInput) / sizeof(kInput[0]);
-
-  const float expected_mean[kInputLength] =
-      {0.2f, 0.6f, 1.2f, 2.f, 3.f, 4.f, 5.f, 6.f, 7.f};
-  const float expected_mean_squares[kInputLength] =
-      {0.2f, 1.f, 2.8f, 6.f, 11.f, 18.f, 27.f, 38.f, 51.f};
-
-  CalculateMomentsAndVerify(kInput, kInputLength, expected_mean,
-                            expected_mean_squares);
-}
-
-TEST_F(MovingMomentsTest, CorrectMomentsOfADecreasingBuffer) {
-  const float kInput[] =
-      {-1.f, -2.f, -3.f, -4.f, -5.f, -6.f, -7.f, -8.f, -9.f};
-  const size_t kInputLength = sizeof(kInput) / sizeof(kInput[0]);
-
-  const float expected_mean[kInputLength] =
-      {-0.2f, -0.6f, -1.2f, -2.f, -3.f, -4.f, -5.f, -6.f, -7.f};
-  const float expected_mean_squares[kInputLength] =
-      {0.2f, 1.f, 2.8f, 6.f, 11.f, 18.f, 27.f, 38.f, 51.f};
-
-  CalculateMomentsAndVerify(kInput, kInputLength, expected_mean,
-                            expected_mean_squares);
-}
-
-TEST_F(MovingMomentsTest, CorrectMomentsOfAZeroMeanSequence) {
-  const size_t kMovingMomentsBufferLength = 4;
-  moving_moments_.reset(new MovingMoments(kMovingMomentsBufferLength));
-  const float kInput[] =
-      {1.f, -1.f, 1.f, -1.f, 1.f, -1.f, 1.f, -1.f, 1.f, -1.f};
-  const size_t kInputLength = sizeof(kInput) / sizeof(kInput[0]);
-
-  const float expected_mean[kInputLength] =
-      {0.25f, 0.f, 0.25f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f};
-  const float expected_mean_squares[kInputLength] =
-      {0.25f, 0.5f, 0.75f, 1.f, 1.f, 1.f, 1.f, 1.f, 1.f, 1.f};
-
-  CalculateMomentsAndVerify(kInput, kInputLength, expected_mean,
-                            expected_mean_squares);
-}
-
-TEST_F(MovingMomentsTest, CorrectMomentsOfAnArbitraryBuffer) {
-  const float kInput[] =
-      {0.2f, 0.3f, 0.5f, 0.7f, 0.11f, 0.13f, 0.17f, 0.19f, 0.23f};
-  const size_t kInputLength = sizeof(kInput) / sizeof(kInput[0]);
-
-  const float expected_mean[kInputLength] =
-      {0.04f, 0.1f, 0.2f, 0.34f, 0.362f, 0.348f, 0.322f, 0.26f, 0.166f};
-  const float expected_mean_squares[kInputLength] =
-      {0.008f, 0.026f, 0.076f, 0.174f, 0.1764f, 0.1718f, 0.1596f, 0.1168f,
-      0.0294f};
-
-  CalculateMomentsAndVerify(kInput, kInputLength, expected_mean,
-                            expected_mean_squares);
-}
-
-TEST_F(MovingMomentsTest, MutipleCalculateMomentsCalls) {
-  const float kInputFirstCall[] =
-      {0.2f, 0.3f, 0.5f, 0.7f, 0.11f, 0.13f, 0.17f, 0.19f, 0.23f};
-  const size_t kInputFirstCallLength = sizeof(kInputFirstCall) /
-                                    sizeof(kInputFirstCall[0]);
-  const float kInputSecondCall[] = {0.29f, 0.31f};
-  const size_t kInputSecondCallLength = sizeof(kInputSecondCall) /
-                                     sizeof(kInputSecondCall[0]);
-  const float kInputThirdCall[] = {0.37f, 0.41f, 0.43f, 0.47f};
-  const size_t kInputThirdCallLength = sizeof(kInputThirdCall) /
-                                    sizeof(kInputThirdCall[0]);
-
-  const float expected_mean_first_call[kInputFirstCallLength] =
-      {0.04f, 0.1f, 0.2f, 0.34f, 0.362f, 0.348f, 0.322f, 0.26f, 0.166f};
-  const float expected_mean_squares_first_call[kInputFirstCallLength] =
-      {0.008f, 0.026f, 0.076f, 0.174f, 0.1764f, 0.1718f, 0.1596f, 0.1168f,
-      0.0294f};
-
-  const float expected_mean_second_call[kInputSecondCallLength] =
-      {0.202f, 0.238f};
-  const float expected_mean_squares_second_call[kInputSecondCallLength] =
-      {0.0438f, 0.0596f};
-
-  const float expected_mean_third_call[kInputThirdCallLength] =
-      {0.278f, 0.322f, 0.362f, 0.398f};
-  const float expected_mean_squares_third_call[kInputThirdCallLength] =
-      {0.0812f, 0.1076f, 0.134f, 0.1614f};
-
-  CalculateMomentsAndVerify(kInputFirstCall, kInputFirstCallLength,
-      expected_mean_first_call, expected_mean_squares_first_call);
-
-  CalculateMomentsAndVerify(kInputSecondCall, kInputSecondCallLength,
-      expected_mean_second_call, expected_mean_squares_second_call);
-
-  CalculateMomentsAndVerify(kInputThirdCall, kInputThirdCallLength,
-      expected_mean_third_call, expected_mean_squares_third_call);
-}
-
-TEST_F(MovingMomentsTest,
-       VerifySampleBasedVsBlockBasedCalculation) {
-  const float kInput[] =
-      {0.2f, 0.3f, 0.5f, 0.7f, 0.11f, 0.13f, 0.17f, 0.19f, 0.23f};
-  const size_t kInputLength = sizeof(kInput) / sizeof(kInput[0]);
-
-  float output_mean_block_based[kInputLength];
-  float output_mean_squares_block_based[kInputLength];
-
-  float output_mean_sample_based;
-  float output_mean_squares_sample_based;
-
-  moving_moments_->CalculateMoments(
-      kInput, kInputLength, output_mean_block_based,
-      output_mean_squares_block_based);
-  moving_moments_.reset(new MovingMoments(kMovingMomentsBufferLength));
-  for (size_t i = 0; i < kInputLength; ++i) {
-    moving_moments_->CalculateMoments(
-        &kInput[i], 1, &output_mean_sample_based,
-        &output_mean_squares_sample_based);
-    EXPECT_FLOAT_EQ(output_mean_block_based[i], output_mean_sample_based);
-    EXPECT_FLOAT_EQ(output_mean_squares_block_based[i],
-                     output_mean_squares_sample_based);
-  }
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/transient/test/plotDetection.m b/modules/audio_processing/transient/test/plotDetection.m
deleted file mode 100644
index 8e12ab9..0000000
--- a/modules/audio_processing/transient/test/plotDetection.m
+++ /dev/null
@@ -1,22 +0,0 @@
-%
-%  Copyright (c) 2014 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.
-%
-
-function [] = plotDetection(PCMfile, DATfile, fs, chunkSize)
-%[] = plotDetection(PCMfile, DATfile, fs, chunkSize)
-%
-%Plots the signal alongside the detection values.
-%
-%PCMfile: The file of the input signal in PCM format.
-%DATfile: The file containing the detection values in binary float format.
-%fs: The sample rate of the signal in Hertz.
-%chunkSize: The chunk size used to compute the detection values in seconds.
-[x, tx] = readPCM(PCMfile, fs);
-[d, td] = readDetection(DATfile, fs, chunkSize);
-plot(tx, x, td, d);
diff --git a/modules/audio_processing/transient/test/readDetection.m b/modules/audio_processing/transient/test/readDetection.m
deleted file mode 100644
index 832bf31..0000000
--- a/modules/audio_processing/transient/test/readDetection.m
+++ /dev/null
@@ -1,26 +0,0 @@
-%
-%  Copyright (c) 2014 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.
-%
-
-function [d, t] = readDetection(file, fs, chunkSize)
-%[d, t] = readDetection(file, fs, chunkSize)
-%
-%Reads a detection signal from a DAT file.
-%
-%d: The detection signal.
-%t: The respective time vector.
-%
-%file: The DAT file where the detection signal is stored in float format.
-%fs: The signal sample rate in Hertz.
-%chunkSize: The chunk size used for the detection in seconds.
-fid = fopen(file);
-d = fread(fid, inf, 'float');
-fclose(fid);
-t = 0:(1 / fs):(length(d) * chunkSize - 1 / fs);
-d = d(floor(t / chunkSize) + 1);
diff --git a/modules/audio_processing/transient/test/readPCM.m b/modules/audio_processing/transient/test/readPCM.m
deleted file mode 100644
index cd3cef8..0000000
--- a/modules/audio_processing/transient/test/readPCM.m
+++ /dev/null
@@ -1,26 +0,0 @@
-%
-%  Copyright (c) 2014 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.
-%
-
-function [x, t] = readPCM(file, fs)
-%[x, t] = readPCM(file, fs)
-%
-%Reads a signal from a PCM file.
-%
-%x: The read signal after normalization.
-%t: The respective time vector.
-%
-%file: The PCM file where the signal is stored in int16 format.
-%fs: The signal sample rate in Hertz.
-fid = fopen(file);
-x = fread(fid, inf, 'int16');
-fclose(fid);
-x = x - mean(x);
-x = x / max(abs(x));
-t = 0:(1 / fs):((length(x) - 1) / fs);
diff --git a/modules/audio_processing/transient/transient_detector.cc b/modules/audio_processing/transient/transient_detector.cc
deleted file mode 100644
index 65fdc73..0000000
--- a/modules/audio_processing/transient/transient_detector.cc
+++ /dev/null
@@ -1,176 +0,0 @@
-/*
- *  Copyright (c) 2013 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_processing/transient/transient_detector.h"
-
-#include <float.h>
-#include <math.h>
-#include <string.h>
-
-#include <algorithm>
-
-#include "webrtc/modules/audio_processing/transient/common.h"
-#include "webrtc/modules/audio_processing/transient/daubechies_8_wavelet_coeffs.h"
-#include "webrtc/modules/audio_processing/transient/moving_moments.h"
-#include "webrtc/modules/audio_processing/transient/wpd_tree.h"
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-
-static const int kTransientLengthMs = 30;
-static const int kChunksAtStartupLeftToDelete =
-    kTransientLengthMs / ts::kChunkSizeMs;
-static const float kDetectThreshold = 16.f;
-
-TransientDetector::TransientDetector(int sample_rate_hz)
-    : samples_per_chunk_(sample_rate_hz * ts::kChunkSizeMs / 1000),
-      last_first_moment_(),
-      last_second_moment_(),
-      chunks_at_startup_left_to_delete_(kChunksAtStartupLeftToDelete),
-      reference_energy_(1.f),
-      using_reference_(false) {
-  RTC_DCHECK(sample_rate_hz == ts::kSampleRate8kHz ||
-             sample_rate_hz == ts::kSampleRate16kHz ||
-             sample_rate_hz == ts::kSampleRate32kHz ||
-             sample_rate_hz == ts::kSampleRate48kHz);
-  int samples_per_transient = sample_rate_hz * kTransientLengthMs / 1000;
-  // Adjustment to avoid data loss while downsampling, making
-  // |samples_per_chunk_| and |samples_per_transient| always divisible by
-  // |kLeaves|.
-  samples_per_chunk_ -= samples_per_chunk_ % kLeaves;
-  samples_per_transient -= samples_per_transient % kLeaves;
-
-  tree_leaves_data_length_ = samples_per_chunk_ / kLeaves;
-  wpd_tree_.reset(new WPDTree(samples_per_chunk_,
-                              kDaubechies8HighPassCoefficients,
-                              kDaubechies8LowPassCoefficients,
-                              kDaubechies8CoefficientsLength,
-                              kLevels));
-  for (size_t i = 0; i < kLeaves; ++i) {
-    moving_moments_[i].reset(
-        new MovingMoments(samples_per_transient / kLeaves));
-  }
-
-  first_moments_.reset(new float[tree_leaves_data_length_]);
-  second_moments_.reset(new float[tree_leaves_data_length_]);
-
-  for (int i = 0; i < kChunksAtStartupLeftToDelete; ++i) {
-    previous_results_.push_back(0.f);
-  }
-}
-
-TransientDetector::~TransientDetector() {}
-
-float TransientDetector::Detect(const float* data,
-                                size_t data_length,
-                                const float* reference_data,
-                                size_t reference_length) {
-  RTC_DCHECK(data);
-  RTC_DCHECK_EQ(samples_per_chunk_, data_length);
-
-  // TODO(aluebs): Check if these errors can logically happen and if not assert
-  // on them.
-  if (wpd_tree_->Update(data, samples_per_chunk_) != 0) {
-    return -1.f;
-  }
-
-  float result = 0.f;
-
-  for (size_t i = 0; i < kLeaves; ++i) {
-    WPDNode* leaf = wpd_tree_->NodeAt(kLevels, i);
-
-    moving_moments_[i]->CalculateMoments(leaf->data(),
-                                         tree_leaves_data_length_,
-                                         first_moments_.get(),
-                                         second_moments_.get());
-
-    // Add value delayed (Use the last moments from the last call to Detect).
-    float unbiased_data = leaf->data()[0] - last_first_moment_[i];
-    result +=
-        unbiased_data * unbiased_data / (last_second_moment_[i] + FLT_MIN);
-
-    // Add new values.
-    for (size_t j = 1; j < tree_leaves_data_length_; ++j) {
-      unbiased_data = leaf->data()[j] - first_moments_[j - 1];
-      result +=
-          unbiased_data * unbiased_data / (second_moments_[j - 1] + FLT_MIN);
-    }
-
-    last_first_moment_[i] = first_moments_[tree_leaves_data_length_ - 1];
-    last_second_moment_[i] = second_moments_[tree_leaves_data_length_ - 1];
-  }
-
-  result /= tree_leaves_data_length_;
-
-  result *= ReferenceDetectionValue(reference_data, reference_length);
-
-  if (chunks_at_startup_left_to_delete_ > 0) {
-    chunks_at_startup_left_to_delete_--;
-    result = 0.f;
-  }
-
-  if (result >= kDetectThreshold) {
-    result = 1.f;
-  } else {
-    // Get proportional value.
-    // Proportion achieved with a squared raised cosine function with domain
-    // [0, kDetectThreshold) and image [0, 1), it's always increasing.
-    const float horizontal_scaling = ts::kPi / kDetectThreshold;
-    const float kHorizontalShift = ts::kPi;
-    const float kVerticalScaling = 0.5f;
-    const float kVerticalShift = 1.f;
-
-    result = (cos(result * horizontal_scaling + kHorizontalShift)
-        + kVerticalShift) * kVerticalScaling;
-    result *= result;
-  }
-
-  previous_results_.pop_front();
-  previous_results_.push_back(result);
-
-  // In the current implementation we return the max of the current result and
-  // the previous results, so the high results have a width equals to
-  // |transient_length|.
-  return *std::max_element(previous_results_.begin(), previous_results_.end());
-}
-
-// Looks for the highest slope and compares it with the previous ones.
-// An exponential transformation takes this to the [0, 1] range. This value is
-// multiplied by the detection result to avoid false positives.
-float TransientDetector::ReferenceDetectionValue(const float* data,
-                                                 size_t length) {
-  if (data == NULL) {
-    using_reference_ = false;
-    return 1.f;
-  }
-  static const float kEnergyRatioThreshold = 0.2f;
-  static const float kReferenceNonLinearity = 20.f;
-  static const float kMemory = 0.99f;
-  float reference_energy = 0.f;
-  for (size_t i = 1; i < length; ++i) {
-    reference_energy += data[i] * data[i];
-  }
-  if (reference_energy == 0.f) {
-    using_reference_ = false;
-    return 1.f;
-  }
-  RTC_DCHECK_NE(0, reference_energy_);
-  float result = 1.f / (1.f + exp(kReferenceNonLinearity *
-                                  (kEnergyRatioThreshold -
-                                   reference_energy / reference_energy_)));
-  reference_energy_ =
-      kMemory * reference_energy_ + (1.f - kMemory) * reference_energy;
-
-  using_reference_ = true;
-
-  return result;
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/transient/transient_detector.h b/modules/audio_processing/transient/transient_detector.h
deleted file mode 100644
index dbd2ba5..0000000
--- a/modules/audio_processing/transient/transient_detector.h
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- *  Copyright (c) 2013 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_PROCESSING_TRANSIENT_TRANSIENT_DETECTOR_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_TRANSIENT_TRANSIENT_DETECTOR_H_
-
-#include <deque>
-#include <memory>
-
-#include "webrtc/modules/audio_processing/transient/moving_moments.h"
-#include "webrtc/modules/audio_processing/transient/wpd_tree.h"
-
-namespace webrtc {
-
-// This is an implementation of the transient detector described in "Causal
-// Wavelet based transient detector".
-// Calculates the log-likelihood of a transient to happen on a signal at any
-// given time based on the previous samples; it uses a WPD tree to analyze the
-// signal.  It preserves its state, so it can be multiple-called.
-class TransientDetector {
- public:
-  // TODO(chadan): The only supported wavelet is Daubechies 8 using a WPD tree
-  // of 3 levels. Make an overloaded constructor to allow different wavelets and
-  // depths of the tree. When needed.
-
-  // Creates a wavelet based transient detector.
-  TransientDetector(int sample_rate_hz);
-
-  ~TransientDetector();
-
-  // Calculates the log-likelihood of the existence of a transient in |data|.
-  // |data_length| has to be equal to |samples_per_chunk_|.
-  // Returns a value between 0 and 1, as a non linear representation of this
-  // likelihood.
-  // Returns a negative value on error.
-  float Detect(const float* data,
-               size_t data_length,
-               const float* reference_data,
-               size_t reference_length);
-
-  bool using_reference() { return using_reference_; }
-
- private:
-  float ReferenceDetectionValue(const float* data, size_t length);
-
-  static const size_t kLevels = 3;
-  static const size_t kLeaves = 1 << kLevels;
-
-  size_t samples_per_chunk_;
-
-  std::unique_ptr<WPDTree> wpd_tree_;
-  size_t tree_leaves_data_length_;
-
-  // A MovingMoments object is needed for each leaf in the WPD tree.
-  std::unique_ptr<MovingMoments> moving_moments_[kLeaves];
-
-  std::unique_ptr<float[]> first_moments_;
-  std::unique_ptr<float[]> second_moments_;
-
-  // Stores the last calculated moments from the previous detection.
-  float last_first_moment_[kLeaves];
-  float last_second_moment_[kLeaves];
-
-  // We keep track of the previous results from the previous chunks, so it can
-  // be used to effectively give results according to the |transient_length|.
-  std::deque<float> previous_results_;
-
-  // Number of chunks that are going to return only zeros at the beginning of
-  // the detection. It helps to avoid infs and nans due to the lack of
-  // information.
-  int chunks_at_startup_left_to_delete_;
-
-  float reference_energy_;
-
-  bool using_reference_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_TRANSIENT_TRANSIENT_DETECTOR_H_
diff --git a/modules/audio_processing/transient/transient_detector_unittest.cc b/modules/audio_processing/transient/transient_detector_unittest.cc
deleted file mode 100644
index 7f9b74e..0000000
--- a/modules/audio_processing/transient/transient_detector_unittest.cc
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- *  Copyright (c) 2013 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_processing/transient/transient_detector.h"
-
-#include <memory>
-#include <sstream>
-#include <string>
-
-#include "webrtc/modules/audio_processing/transient/common.h"
-#include "webrtc/modules/audio_processing/transient/file_utils.h"
-#include "webrtc/system_wrappers/include/file_wrapper.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/testsupport/fileutils.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-static const int kSampleRatesHz[] = {ts::kSampleRate8kHz,
-                                     ts::kSampleRate16kHz,
-                                     ts::kSampleRate32kHz,
-                                     ts::kSampleRate48kHz};
-static const size_t kNumberOfSampleRates =
-    sizeof(kSampleRatesHz) / sizeof(*kSampleRatesHz);
-
-// This test is for the correctness of the transient detector.
-// Checks the results comparing them with the ones stored in the detect files in
-// the directory: resources/audio_processing/transient/
-// The files contain all the results in double precision (Little endian).
-// The audio files used with different sample rates are stored in the same
-// directory.
-#if defined(WEBRTC_IOS)
-TEST(TransientDetectorTest, DISABLED_CorrectnessBasedOnFiles) {
-#else
-TEST(TransientDetectorTest, CorrectnessBasedOnFiles) {
-#endif
-  for (size_t i = 0; i < kNumberOfSampleRates; ++i) {
-    int sample_rate_hz = kSampleRatesHz[i];
-
-    // Prepare detect file.
-    std::stringstream detect_file_name;
-    detect_file_name << "audio_processing/transient/detect"
-                     << (sample_rate_hz / 1000) << "kHz";
-
-    std::unique_ptr<FileWrapper> detect_file(FileWrapper::Create());
-
-    detect_file->OpenFile(
-        test::ResourcePath(detect_file_name.str(), "dat").c_str(),
-        true);  // Read only.
-
-    bool file_opened = detect_file->is_open();
-    ASSERT_TRUE(file_opened) << "File could not be opened.\n"
-          << detect_file_name.str().c_str();
-
-    // Prepare audio file.
-    std::stringstream audio_file_name;
-    audio_file_name << "audio_processing/transient/audio"
-                    << (sample_rate_hz / 1000) << "kHz";
-
-    std::unique_ptr<FileWrapper> audio_file(FileWrapper::Create());
-
-    audio_file->OpenFile(
-        test::ResourcePath(audio_file_name.str(), "pcm").c_str(),
-        true);  // Read only.
-
-    // Create detector.
-    TransientDetector detector(sample_rate_hz);
-
-    const size_t buffer_length = sample_rate_hz * ts::kChunkSizeMs / 1000;
-    std::unique_ptr<float[]> buffer(new float[buffer_length]);
-
-    const float kTolerance = 0.02f;
-
-    size_t frames_read = 0;
-
-    while (ReadInt16FromFileToFloatBuffer(audio_file.get(),
-                                          buffer_length,
-                                          buffer.get()) == buffer_length) {
-      ++frames_read;
-
-      float detector_value =
-          detector.Detect(buffer.get(), buffer_length, NULL, 0);
-      double file_value;
-      ASSERT_EQ(1u, ReadDoubleBufferFromFile(detect_file.get(), 1, &file_value))
-          << "Detect test file is malformed.\n";
-
-      // Compare results with data from the matlab test file.
-      EXPECT_NEAR(file_value, detector_value, kTolerance) << "Frame: "
-          << frames_read;
-    }
-
-    detect_file->CloseFile();
-    audio_file->CloseFile();
-  }
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/transient/transient_suppression_test.cc b/modules/audio_processing/transient/transient_suppression_test.cc
deleted file mode 100644
index ea894bc..0000000
--- a/modules/audio_processing/transient/transient_suppression_test.cc
+++ /dev/null
@@ -1,252 +0,0 @@
-/*
- *  Copyright (c) 2013 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_processing/transient/transient_suppressor.h"
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-
-#include <memory>
-#include <string>
-
-#include "webrtc/common_audio/include/audio_util.h"
-#include "webrtc/modules/audio_processing/agc/agc.h"
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/rtc_base/flags.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/testsupport/fileutils.h"
-#include "webrtc/typedefs.h"
-
-DEFINE_string(in_file_name, "", "PCM file that contains the signal.");
-DEFINE_string(detection_file_name,
-              "",
-              "PCM file that contains the detection signal.");
-DEFINE_string(reference_file_name,
-              "",
-              "PCM file that contains the reference signal.");
-
-DEFINE_int(chunk_size_ms,
-           10,
-           "Time between each chunk of samples in milliseconds.");
-
-DEFINE_int(sample_rate_hz,
-           16000,
-           "Sampling frequency of the signal in Hertz.");
-DEFINE_int(detection_rate_hz,
-           0,
-           "Sampling frequency of the detection signal in Hertz.");
-
-DEFINE_int(num_channels, 1, "Number of channels.");
-
-DEFINE_bool(help, false, "Print this message.");
-
-namespace webrtc {
-
-const char kUsage[] =
-    "\nDetects and suppresses transients from file.\n\n"
-    "This application loads the signal from the in_file_name with a specific\n"
-    "num_channels and sample_rate_hz, the detection signal from the\n"
-    "detection_file_name with a specific detection_rate_hz, and the reference\n"
-    "signal from the reference_file_name with sample_rate_hz, divides them\n"
-    "into chunk_size_ms blocks, computes its voice value and depending on the\n"
-    "voice_threshold does the respective restoration. You can always get the\n"
-    "all-voiced or all-unvoiced cases by setting the voice_threshold to 0 or\n"
-    "1 respectively.\n\n";
-
-// Read next buffers from the test files (signed 16-bit host-endian PCM
-// format). audio_buffer has int16 samples, detection_buffer has float samples
-// with range [-32768,32767], and reference_buffer has float samples with range
-// [-1,1]. Return true iff all the buffers were filled completely.
-bool ReadBuffers(FILE* in_file,
-                 size_t audio_buffer_size,
-                 int num_channels,
-                 int16_t* audio_buffer,
-                 FILE* detection_file,
-                 size_t detection_buffer_size,
-                 float* detection_buffer,
-                 FILE* reference_file,
-                 float* reference_buffer) {
-  std::unique_ptr<int16_t[]> tmpbuf;
-  int16_t* read_ptr = audio_buffer;
-  if (num_channels > 1) {
-    tmpbuf.reset(new int16_t[num_channels * audio_buffer_size]);
-    read_ptr = tmpbuf.get();
-  }
-  if (fread(read_ptr,
-            sizeof(*read_ptr),
-            num_channels * audio_buffer_size,
-            in_file) != num_channels * audio_buffer_size) {
-    return false;
-  }
-  // De-interleave.
-  if (num_channels > 1) {
-    for (int i = 0; i < num_channels; ++i) {
-      for (size_t j = 0; j < audio_buffer_size; ++j) {
-        audio_buffer[i * audio_buffer_size + j] =
-            read_ptr[i + j * num_channels];
-      }
-    }
-  }
-  if (detection_file) {
-    std::unique_ptr<int16_t[]> ibuf(new int16_t[detection_buffer_size]);
-    if (fread(ibuf.get(), sizeof(ibuf[0]), detection_buffer_size,
-              detection_file) != detection_buffer_size)
-      return false;
-    for (size_t i = 0; i < detection_buffer_size; ++i)
-      detection_buffer[i] = ibuf[i];
-  }
-  if (reference_file) {
-    std::unique_ptr<int16_t[]> ibuf(new int16_t[audio_buffer_size]);
-    if (fread(ibuf.get(), sizeof(ibuf[0]), audio_buffer_size, reference_file)
-        != audio_buffer_size)
-      return false;
-    S16ToFloat(ibuf.get(), audio_buffer_size, reference_buffer);
-  }
-  return true;
-}
-
-// Write a number of samples to an open signed 16-bit host-endian PCM file.
-static void WritePCM(FILE* f,
-                     size_t num_samples,
-                     int num_channels,
-                     const float* buffer) {
-  std::unique_ptr<int16_t[]> ibuf(new int16_t[num_channels * num_samples]);
-  // Interleave.
-  for (int i = 0; i < num_channels; ++i) {
-    for (size_t j = 0; j < num_samples; ++j) {
-      ibuf[i + j * num_channels] = FloatS16ToS16(buffer[i * num_samples + j]);
-    }
-  }
-  fwrite(ibuf.get(), sizeof(ibuf[0]), num_channels * num_samples, f);
-}
-
-// This application tests the transient suppression by providing a processed
-// PCM file, which has to be listened to in order to evaluate the
-// performance.
-// It gets an audio file, and its voice gain information, and the suppressor
-// process it giving the output file "suppressed_keystrokes.pcm".
-void void_main() {
-  // TODO(aluebs): Remove all FileWrappers.
-  // Prepare the input file.
-  FILE* in_file = fopen(FLAG_in_file_name, "rb");
-  ASSERT_TRUE(in_file != NULL);
-
-  // Prepare the detection file.
-  FILE* detection_file = NULL;
-  if (strlen(FLAG_detection_file_name) > 0) {
-    detection_file = fopen(FLAG_detection_file_name, "rb");
-  }
-
-  // Prepare the reference file.
-  FILE* reference_file = NULL;
-  if (strlen(FLAG_reference_file_name) > 0) {
-    reference_file = fopen(FLAG_reference_file_name, "rb");
-  }
-
-  // Prepare the output file.
-  std::string out_file_name = test::OutputPath() + "suppressed_keystrokes.pcm";
-  FILE* out_file = fopen(out_file_name.c_str(), "wb");
-  ASSERT_TRUE(out_file != NULL);
-
-  int detection_rate_hz = FLAG_detection_rate_hz;
-  if (detection_rate_hz == 0) {
-    detection_rate_hz = FLAG_sample_rate_hz;
-  }
-
-  Agc agc;
-
-  TransientSuppressor suppressor;
-  suppressor.Initialize(
-      FLAG_sample_rate_hz, detection_rate_hz, FLAG_num_channels);
-
-  const size_t audio_buffer_size =
-      FLAG_chunk_size_ms * FLAG_sample_rate_hz / 1000;
-  const size_t detection_buffer_size =
-      FLAG_chunk_size_ms * detection_rate_hz / 1000;
-
-  // int16 and float variants of the same data.
-  std::unique_ptr<int16_t[]> audio_buffer_i(
-      new int16_t[FLAG_num_channels * audio_buffer_size]);
-  std::unique_ptr<float[]> audio_buffer_f(
-      new float[FLAG_num_channels * audio_buffer_size]);
-
-  std::unique_ptr<float[]> detection_buffer, reference_buffer;
-
-  if (detection_file)
-    detection_buffer.reset(new float[detection_buffer_size]);
-  if (reference_file)
-    reference_buffer.reset(new float[audio_buffer_size]);
-
-  while (ReadBuffers(in_file,
-                     audio_buffer_size,
-                     FLAG_num_channels,
-                     audio_buffer_i.get(),
-                     detection_file,
-                     detection_buffer_size,
-                     detection_buffer.get(),
-                     reference_file,
-                     reference_buffer.get())) {
-    ASSERT_EQ(0,
-              agc.Process(audio_buffer_i.get(),
-                          static_cast<int>(audio_buffer_size),
-                          FLAG_sample_rate_hz))
-        << "The AGC could not process the frame";
-
-    for (size_t i = 0; i < FLAG_num_channels * audio_buffer_size; ++i) {
-      audio_buffer_f[i] = audio_buffer_i[i];
-    }
-
-    ASSERT_EQ(0,
-              suppressor.Suppress(audio_buffer_f.get(),
-                                  audio_buffer_size,
-                                  FLAG_num_channels,
-                                  detection_buffer.get(),
-                                  detection_buffer_size,
-                                  reference_buffer.get(),
-                                  audio_buffer_size,
-                                  agc.voice_probability(),
-                                  true))
-        << "The transient suppressor could not suppress the frame";
-
-    // Write result to out file.
-    WritePCM(
-        out_file, audio_buffer_size, FLAG_num_channels, audio_buffer_f.get());
-  }
-
-  fclose(in_file);
-  if (detection_file) {
-    fclose(detection_file);
-  }
-  if (reference_file) {
-    fclose(reference_file);
-  }
-  fclose(out_file);
-}
-
-}  // namespace webrtc
-
-int main(int argc, char* argv[]) {
-  if (rtc::FlagList::SetFlagsFromCommandLine(&argc, argv, true) ||
-      FLAG_help || argc != 1) {
-    printf("%s", webrtc::kUsage);
-    if (FLAG_help) {
-      rtc::FlagList::Print(nullptr, false);
-      return 0;
-    }
-    return 1;
-  }
-  RTC_CHECK_GT(FLAG_chunk_size_ms, 0);
-  RTC_CHECK_GT(FLAG_sample_rate_hz, 0);
-  RTC_CHECK_GT(FLAG_num_channels, 0);
-
-  webrtc::void_main();
-  return 0;
-}
diff --git a/modules/audio_processing/transient/transient_suppressor.cc b/modules/audio_processing/transient/transient_suppressor.cc
deleted file mode 100644
index 1b05d26..0000000
--- a/modules/audio_processing/transient/transient_suppressor.cc
+++ /dev/null
@@ -1,424 +0,0 @@
-/*
- *  Copyright (c) 2013 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_processing/transient/transient_suppressor.h"
-
-#include <math.h>
-#include <string.h>
-#include <cmath>
-#include <complex>
-#include <deque>
-#include <set>
-
-#include "webrtc/common_audio/fft4g.h"
-#include "webrtc/common_audio/include/audio_util.h"
-#include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
-#include "webrtc/modules/audio_processing/ns/windows_private.h"
-#include "webrtc/modules/audio_processing/transient/common.h"
-#include "webrtc/modules/audio_processing/transient/transient_detector.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-static const float kMeanIIRCoefficient = 0.5f;
-static const float kVoiceThreshold = 0.02f;
-
-// TODO(aluebs): Check if these values work also for 48kHz.
-static const size_t kMinVoiceBin = 3;
-static const size_t kMaxVoiceBin = 60;
-
-namespace {
-
-float ComplexMagnitude(float a, float b) {
-  return std::abs(a) + std::abs(b);
-}
-
-}  // namespace
-
-TransientSuppressor::TransientSuppressor()
-    : data_length_(0),
-      detection_length_(0),
-      analysis_length_(0),
-      buffer_delay_(0),
-      complex_analysis_length_(0),
-      num_channels_(0),
-      window_(NULL),
-      detector_smoothed_(0.f),
-      keypress_counter_(0),
-      chunks_since_keypress_(0),
-      detection_enabled_(false),
-      suppression_enabled_(false),
-      use_hard_restoration_(false),
-      chunks_since_voice_change_(0),
-      seed_(182),
-      using_reference_(false) {
-}
-
-TransientSuppressor::~TransientSuppressor() {}
-
-int TransientSuppressor::Initialize(int sample_rate_hz,
-                                    int detection_rate_hz,
-                                    int num_channels) {
-  switch (sample_rate_hz) {
-    case ts::kSampleRate8kHz:
-      analysis_length_ = 128u;
-      window_ = kBlocks80w128;
-      break;
-    case ts::kSampleRate16kHz:
-      analysis_length_ = 256u;
-      window_ = kBlocks160w256;
-      break;
-    case ts::kSampleRate32kHz:
-      analysis_length_ = 512u;
-      window_ = kBlocks320w512;
-      break;
-    case ts::kSampleRate48kHz:
-      analysis_length_ = 1024u;
-      window_ = kBlocks480w1024;
-      break;
-    default:
-      return -1;
-  }
-  if (detection_rate_hz != ts::kSampleRate8kHz &&
-      detection_rate_hz != ts::kSampleRate16kHz &&
-      detection_rate_hz != ts::kSampleRate32kHz &&
-      detection_rate_hz != ts::kSampleRate48kHz) {
-    return -1;
-  }
-  if (num_channels <= 0) {
-    return -1;
-  }
-
-  detector_.reset(new TransientDetector(detection_rate_hz));
-  data_length_ = sample_rate_hz * ts::kChunkSizeMs / 1000;
-  if (data_length_ > analysis_length_) {
-    RTC_NOTREACHED();
-    return -1;
-  }
-  buffer_delay_ = analysis_length_ - data_length_;
-
-  complex_analysis_length_ = analysis_length_ / 2 + 1;
-  RTC_DCHECK_GE(complex_analysis_length_, kMaxVoiceBin);
-  num_channels_ = num_channels;
-  in_buffer_.reset(new float[analysis_length_ * num_channels_]);
-  memset(in_buffer_.get(),
-         0,
-         analysis_length_ * num_channels_ * sizeof(in_buffer_[0]));
-  detection_length_ = detection_rate_hz * ts::kChunkSizeMs / 1000;
-  detection_buffer_.reset(new float[detection_length_]);
-  memset(detection_buffer_.get(),
-         0,
-         detection_length_ * sizeof(detection_buffer_[0]));
-  out_buffer_.reset(new float[analysis_length_ * num_channels_]);
-  memset(out_buffer_.get(),
-         0,
-         analysis_length_ * num_channels_ * sizeof(out_buffer_[0]));
-  // ip[0] must be zero to trigger initialization using rdft().
-  size_t ip_length = 2 + sqrtf(analysis_length_);
-  ip_.reset(new size_t[ip_length]());
-  memset(ip_.get(), 0, ip_length * sizeof(ip_[0]));
-  wfft_.reset(new float[complex_analysis_length_ - 1]);
-  memset(wfft_.get(), 0, (complex_analysis_length_ - 1) * sizeof(wfft_[0]));
-  spectral_mean_.reset(new float[complex_analysis_length_ * num_channels_]);
-  memset(spectral_mean_.get(),
-         0,
-         complex_analysis_length_ * num_channels_ * sizeof(spectral_mean_[0]));
-  fft_buffer_.reset(new float[analysis_length_ + 2]);
-  memset(fft_buffer_.get(), 0, (analysis_length_ + 2) * sizeof(fft_buffer_[0]));
-  magnitudes_.reset(new float[complex_analysis_length_]);
-  memset(magnitudes_.get(),
-         0,
-         complex_analysis_length_ * sizeof(magnitudes_[0]));
-  mean_factor_.reset(new float[complex_analysis_length_]);
-
-  static const float kFactorHeight = 10.f;
-  static const float kLowSlope = 1.f;
-  static const float kHighSlope = 0.3f;
-  for (size_t i = 0; i < complex_analysis_length_; ++i) {
-    mean_factor_[i] =
-        kFactorHeight /
-            (1.f + exp(kLowSlope * static_cast<int>(i - kMinVoiceBin))) +
-        kFactorHeight /
-            (1.f + exp(kHighSlope * static_cast<int>(kMaxVoiceBin - i)));
-  }
-  detector_smoothed_ = 0.f;
-  keypress_counter_ = 0;
-  chunks_since_keypress_ = 0;
-  detection_enabled_ = false;
-  suppression_enabled_ = false;
-  use_hard_restoration_ = false;
-  chunks_since_voice_change_ = 0;
-  seed_ = 182;
-  using_reference_ = false;
-  return 0;
-}
-
-int TransientSuppressor::Suppress(float* data,
-                                  size_t data_length,
-                                  int num_channels,
-                                  const float* detection_data,
-                                  size_t detection_length,
-                                  const float* reference_data,
-                                  size_t reference_length,
-                                  float voice_probability,
-                                  bool key_pressed) {
-  if (!data || data_length != data_length_ || num_channels != num_channels_ ||
-      detection_length != detection_length_ || voice_probability < 0 ||
-      voice_probability > 1) {
-    return -1;
-  }
-
-  UpdateKeypress(key_pressed);
-  UpdateBuffers(data);
-
-  int result = 0;
-  if (detection_enabled_) {
-    UpdateRestoration(voice_probability);
-
-    if (!detection_data) {
-      // Use the input data  of the first channel if special detection data is
-      // not supplied.
-      detection_data = &in_buffer_[buffer_delay_];
-    }
-
-    float detector_result = detector_->Detect(
-        detection_data, detection_length, reference_data, reference_length);
-    if (detector_result < 0) {
-      return -1;
-    }
-
-    using_reference_ = detector_->using_reference();
-
-    // |detector_smoothed_| follows the |detector_result| when this last one is
-    // increasing, but has an exponential decaying tail to be able to suppress
-    // the ringing of keyclicks.
-    float smooth_factor = using_reference_ ? 0.6 : 0.1;
-    detector_smoothed_ = detector_result >= detector_smoothed_
-                             ? detector_result
-                             : smooth_factor * detector_smoothed_ +
-                                   (1 - smooth_factor) * detector_result;
-
-    for (int i = 0; i < num_channels_; ++i) {
-      Suppress(&in_buffer_[i * analysis_length_],
-               &spectral_mean_[i * complex_analysis_length_],
-               &out_buffer_[i * analysis_length_]);
-    }
-  }
-
-  // If the suppression isn't enabled, we use the in buffer to delay the signal
-  // appropriately. This also gives time for the out buffer to be refreshed with
-  // new data between detection and suppression getting enabled.
-  for (int i = 0; i < num_channels_; ++i) {
-    memcpy(&data[i * data_length_],
-           suppression_enabled_ ? &out_buffer_[i * analysis_length_]
-                                : &in_buffer_[i * analysis_length_],
-           data_length_ * sizeof(*data));
-  }
-  return result;
-}
-
-// This should only be called when detection is enabled. UpdateBuffers() must
-// have been called. At return, |out_buffer_| will be filled with the
-// processed output.
-void TransientSuppressor::Suppress(float* in_ptr,
-                                   float* spectral_mean,
-                                   float* out_ptr) {
-  // Go to frequency domain.
-  for (size_t i = 0; i < analysis_length_; ++i) {
-    // TODO(aluebs): Rename windows
-    fft_buffer_[i] = in_ptr[i] * window_[i];
-  }
-
-  WebRtc_rdft(analysis_length_, 1, fft_buffer_.get(), ip_.get(), wfft_.get());
-
-  // Since WebRtc_rdft puts R[n/2] in fft_buffer_[1], we move it to the end
-  // for convenience.
-  fft_buffer_[analysis_length_] = fft_buffer_[1];
-  fft_buffer_[analysis_length_ + 1] = 0.f;
-  fft_buffer_[1] = 0.f;
-
-  for (size_t i = 0; i < complex_analysis_length_; ++i) {
-    magnitudes_[i] = ComplexMagnitude(fft_buffer_[i * 2],
-                                      fft_buffer_[i * 2 + 1]);
-  }
-  // Restore audio if necessary.
-  if (suppression_enabled_) {
-    if (use_hard_restoration_) {
-      HardRestoration(spectral_mean);
-    } else {
-      SoftRestoration(spectral_mean);
-    }
-  }
-
-  // Update the spectral mean.
-  for (size_t i = 0; i < complex_analysis_length_; ++i) {
-    spectral_mean[i] = (1 - kMeanIIRCoefficient) * spectral_mean[i] +
-                       kMeanIIRCoefficient * magnitudes_[i];
-  }
-
-  // Back to time domain.
-  // Put R[n/2] back in fft_buffer_[1].
-  fft_buffer_[1] = fft_buffer_[analysis_length_];
-
-  WebRtc_rdft(analysis_length_,
-              -1,
-              fft_buffer_.get(),
-              ip_.get(),
-              wfft_.get());
-  const float fft_scaling = 2.f / analysis_length_;
-
-  for (size_t i = 0; i < analysis_length_; ++i) {
-    out_ptr[i] += fft_buffer_[i] * window_[i] * fft_scaling;
-  }
-}
-
-void TransientSuppressor::UpdateKeypress(bool key_pressed) {
-  const int kKeypressPenalty = 1000 / ts::kChunkSizeMs;
-  const int kIsTypingThreshold = 1000 / ts::kChunkSizeMs;
-  const int kChunksUntilNotTyping = 4000 / ts::kChunkSizeMs;  // 4 seconds.
-
-  if (key_pressed) {
-    keypress_counter_ += kKeypressPenalty;
-    chunks_since_keypress_ = 0;
-    detection_enabled_ = true;
-  }
-  keypress_counter_ = std::max(0, keypress_counter_ - 1);
-
-  if (keypress_counter_ > kIsTypingThreshold) {
-    if (!suppression_enabled_) {
-      LOG(LS_INFO) << "[ts] Transient suppression is now enabled.";
-    }
-    suppression_enabled_ = true;
-    keypress_counter_ = 0;
-  }
-
-  if (detection_enabled_ &&
-      ++chunks_since_keypress_ > kChunksUntilNotTyping) {
-    if (suppression_enabled_) {
-      LOG(LS_INFO) << "[ts] Transient suppression is now disabled.";
-    }
-    detection_enabled_ = false;
-    suppression_enabled_ = false;
-    keypress_counter_ = 0;
-  }
-}
-
-void TransientSuppressor::UpdateRestoration(float voice_probability) {
-  const int kHardRestorationOffsetDelay = 3;
-  const int kHardRestorationOnsetDelay = 80;
-
-  bool not_voiced = voice_probability < kVoiceThreshold;
-
-  if (not_voiced == use_hard_restoration_) {
-    chunks_since_voice_change_ = 0;
-  } else {
-    ++chunks_since_voice_change_;
-
-    if ((use_hard_restoration_ &&
-         chunks_since_voice_change_ > kHardRestorationOffsetDelay) ||
-        (!use_hard_restoration_ &&
-         chunks_since_voice_change_ > kHardRestorationOnsetDelay)) {
-      use_hard_restoration_ = not_voiced;
-      chunks_since_voice_change_ = 0;
-    }
-  }
-}
-
-// Shift buffers to make way for new data. Must be called after
-// |detection_enabled_| is updated by UpdateKeypress().
-void TransientSuppressor::UpdateBuffers(float* data) {
-  // TODO(aluebs): Change to ring buffer.
-  memmove(in_buffer_.get(),
-          &in_buffer_[data_length_],
-          (buffer_delay_ + (num_channels_ - 1) * analysis_length_) *
-              sizeof(in_buffer_[0]));
-  // Copy new chunk to buffer.
-  for (int i = 0; i < num_channels_; ++i) {
-    memcpy(&in_buffer_[buffer_delay_ + i * analysis_length_],
-           &data[i * data_length_],
-           data_length_ * sizeof(*data));
-  }
-  if (detection_enabled_) {
-    // Shift previous chunk in out buffer.
-    memmove(out_buffer_.get(),
-            &out_buffer_[data_length_],
-            (buffer_delay_ + (num_channels_ - 1) * analysis_length_) *
-                sizeof(out_buffer_[0]));
-    // Initialize new chunk in out buffer.
-    for (int i = 0; i < num_channels_; ++i) {
-      memset(&out_buffer_[buffer_delay_ + i * analysis_length_],
-             0,
-             data_length_ * sizeof(out_buffer_[0]));
-    }
-  }
-}
-
-// Restores the unvoiced signal if a click is present.
-// Attenuates by a certain factor every peak in the |fft_buffer_| that exceeds
-// the spectral mean. The attenuation depends on |detector_smoothed_|.
-// If a restoration takes place, the |magnitudes_| are updated to the new value.
-void TransientSuppressor::HardRestoration(float* spectral_mean) {
-  const float detector_result =
-      1.f - pow(1.f - detector_smoothed_, using_reference_ ? 200.f : 50.f);
-  // To restore, we get the peaks in the spectrum. If higher than the previous
-  // spectral mean we adjust them.
-  for (size_t i = 0; i < complex_analysis_length_; ++i) {
-    if (magnitudes_[i] > spectral_mean[i] && magnitudes_[i] > 0) {
-      // RandU() generates values on [0, int16::max()]
-      const float phase = 2 * ts::kPi * WebRtcSpl_RandU(&seed_) /
-          std::numeric_limits<int16_t>::max();
-      const float scaled_mean = detector_result * spectral_mean[i];
-
-      fft_buffer_[i * 2] = (1 - detector_result) * fft_buffer_[i * 2] +
-                           scaled_mean * cosf(phase);
-      fft_buffer_[i * 2 + 1] = (1 - detector_result) * fft_buffer_[i * 2 + 1] +
-                               scaled_mean * sinf(phase);
-      magnitudes_[i] = magnitudes_[i] -
-                       detector_result * (magnitudes_[i] - spectral_mean[i]);
-    }
-  }
-}
-
-// Restores the voiced signal if a click is present.
-// Attenuates by a certain factor every peak in the |fft_buffer_| that exceeds
-// the spectral mean and that is lower than some function of the current block
-// frequency mean. The attenuation depends on |detector_smoothed_|.
-// If a restoration takes place, the |magnitudes_| are updated to the new value.
-void TransientSuppressor::SoftRestoration(float* spectral_mean) {
-  // Get the spectral magnitude mean of the current block.
-  float block_frequency_mean = 0;
-  for (size_t i = kMinVoiceBin; i < kMaxVoiceBin; ++i) {
-    block_frequency_mean += magnitudes_[i];
-  }
-  block_frequency_mean /= (kMaxVoiceBin - kMinVoiceBin);
-
-  // To restore, we get the peaks in the spectrum. If higher than the
-  // previous spectral mean and lower than a factor of the block mean
-  // we adjust them. The factor is a double sigmoid that has a minimum in the
-  // voice frequency range (300Hz - 3kHz).
-  for (size_t i = 0; i < complex_analysis_length_; ++i) {
-    if (magnitudes_[i] > spectral_mean[i] && magnitudes_[i] > 0 &&
-        (using_reference_ ||
-         magnitudes_[i] < block_frequency_mean * mean_factor_[i])) {
-      const float new_magnitude =
-          magnitudes_[i] -
-          detector_smoothed_ * (magnitudes_[i] - spectral_mean[i]);
-      const float magnitude_ratio = new_magnitude / magnitudes_[i];
-
-      fft_buffer_[i * 2] *= magnitude_ratio;
-      fft_buffer_[i * 2 + 1] *= magnitude_ratio;
-      magnitudes_[i] = new_magnitude;
-    }
-  }
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/transient/transient_suppressor.h b/modules/audio_processing/transient/transient_suppressor.h
deleted file mode 100644
index 74decea..0000000
--- a/modules/audio_processing/transient/transient_suppressor.h
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- *  Copyright (c) 2013 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_PROCESSING_TRANSIENT_TRANSIENT_SUPPRESSOR_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_TRANSIENT_TRANSIENT_SUPPRESSOR_H_
-
-#include <deque>
-#include <memory>
-#include <set>
-
-#include "webrtc/rtc_base/gtest_prod_util.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-class TransientDetector;
-
-// Detects transients in an audio stream and suppress them using a simple
-// restoration algorithm that attenuates unexpected spikes in the spectrum.
-class TransientSuppressor {
- public:
-  TransientSuppressor();
-  ~TransientSuppressor();
-
-  int Initialize(int sample_rate_hz, int detector_rate_hz, int num_channels);
-
-  // Processes a |data| chunk, and returns it with keystrokes suppressed from
-  // it. The float format is assumed to be int16 ranged. If there are more than
-  // one channel, the chunks are concatenated one after the other in |data|.
-  // |data_length| must be equal to |data_length_|.
-  // |num_channels| must be equal to |num_channels_|.
-  // A sub-band, ideally the higher, can be used as |detection_data|. If it is
-  // NULL, |data| is used for the detection too. The |detection_data| is always
-  // assumed mono.
-  // If a reference signal (e.g. keyboard microphone) is available, it can be
-  // passed in as |reference_data|. It is assumed mono and must have the same
-  // length as |data|. NULL is accepted if unavailable.
-  // This suppressor performs better if voice information is available.
-  // |voice_probability| is the probability of voice being present in this chunk
-  // of audio. If voice information is not available, |voice_probability| must
-  // always be set to 1.
-  // |key_pressed| determines if a key was pressed on this audio chunk.
-  // Returns 0 on success and -1 otherwise.
-  int Suppress(float* data,
-               size_t data_length,
-               int num_channels,
-               const float* detection_data,
-               size_t detection_length,
-               const float* reference_data,
-               size_t reference_length,
-               float voice_probability,
-               bool key_pressed);
-
- private:
-  FRIEND_TEST_ALL_PREFIXES(TransientSuppressorTest,
-                           TypingDetectionLogicWorksAsExpectedForMono);
-  void Suppress(float* in_ptr, float* spectral_mean, float* out_ptr);
-
-  void UpdateKeypress(bool key_pressed);
-  void UpdateRestoration(float voice_probability);
-
-  void UpdateBuffers(float* data);
-
-  void HardRestoration(float* spectral_mean);
-  void SoftRestoration(float* spectral_mean);
-
-  std::unique_ptr<TransientDetector> detector_;
-
-  size_t data_length_;
-  size_t detection_length_;
-  size_t analysis_length_;
-  size_t buffer_delay_;
-  size_t complex_analysis_length_;
-  int num_channels_;
-  // Input buffer where the original samples are stored.
-  std::unique_ptr<float[]> in_buffer_;
-  std::unique_ptr<float[]> detection_buffer_;
-  // Output buffer where the restored samples are stored.
-  std::unique_ptr<float[]> out_buffer_;
-
-  // Arrays for fft.
-  std::unique_ptr<size_t[]> ip_;
-  std::unique_ptr<float[]> wfft_;
-
-  std::unique_ptr<float[]> spectral_mean_;
-
-  // Stores the data for the fft.
-  std::unique_ptr<float[]> fft_buffer_;
-
-  std::unique_ptr<float[]> magnitudes_;
-
-  const float* window_;
-
-  std::unique_ptr<float[]> mean_factor_;
-
-  float detector_smoothed_;
-
-  int keypress_counter_;
-  int chunks_since_keypress_;
-  bool detection_enabled_;
-  bool suppression_enabled_;
-
-  bool use_hard_restoration_;
-  int chunks_since_voice_change_;
-
-  uint32_t seed_;
-
-  bool using_reference_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_TRANSIENT_TRANSIENT_SUPPRESSOR_H_
diff --git a/modules/audio_processing/transient/transient_suppressor_unittest.cc b/modules/audio_processing/transient/transient_suppressor_unittest.cc
deleted file mode 100644
index ff01055..0000000
--- a/modules/audio_processing/transient/transient_suppressor_unittest.cc
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- *  Copyright (c) 2014 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_processing/transient/transient_suppressor.h"
-
-#include "webrtc/modules/audio_processing/transient/common.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-TEST(TransientSuppressorTest, TypingDetectionLogicWorksAsExpectedForMono) {
-  static const int kNumChannels = 1;
-
-  TransientSuppressor ts;
-  ts.Initialize(ts::kSampleRate16kHz, ts::kSampleRate16kHz, kNumChannels);
-
-  // Each key-press enables detection.
-  EXPECT_FALSE(ts.detection_enabled_);
-  ts.UpdateKeypress(true);
-  EXPECT_TRUE(ts.detection_enabled_);
-
-  // It takes four seconds without any key-press to disable the detection
-  for (int time_ms = 0; time_ms < 3990; time_ms += ts::kChunkSizeMs) {
-    ts.UpdateKeypress(false);
-    EXPECT_TRUE(ts.detection_enabled_);
-  }
-  ts.UpdateKeypress(false);
-  EXPECT_FALSE(ts.detection_enabled_);
-
-  // Key-presses that are more than a second apart from each other don't enable
-  // suppression.
-  for (int i = 0; i < 100; ++i) {
-    EXPECT_FALSE(ts.suppression_enabled_);
-    ts.UpdateKeypress(true);
-    EXPECT_TRUE(ts.detection_enabled_);
-    EXPECT_FALSE(ts.suppression_enabled_);
-    for (int time_ms = 0; time_ms < 990; time_ms += ts::kChunkSizeMs) {
-      ts.UpdateKeypress(false);
-      EXPECT_TRUE(ts.detection_enabled_);
-      EXPECT_FALSE(ts.suppression_enabled_);
-    }
-    ts.UpdateKeypress(false);
-  }
-
-  // Two consecutive key-presses is enough to enable the suppression.
-  ts.UpdateKeypress(true);
-  EXPECT_FALSE(ts.suppression_enabled_);
-  ts.UpdateKeypress(true);
-  EXPECT_TRUE(ts.suppression_enabled_);
-
-  // Key-presses that are less than a second apart from each other don't disable
-  // detection nor suppression.
-  for (int i = 0; i < 100; ++i) {
-    for (int time_ms = 0; time_ms < 1000; time_ms += ts::kChunkSizeMs) {
-      ts.UpdateKeypress(false);
-      EXPECT_TRUE(ts.detection_enabled_);
-      EXPECT_TRUE(ts.suppression_enabled_);
-    }
-    ts.UpdateKeypress(true);
-    EXPECT_TRUE(ts.detection_enabled_);
-    EXPECT_TRUE(ts.suppression_enabled_);
-  }
-
-  // It takes four seconds without any key-press to disable the detection and
-  // suppression.
-  for (int time_ms = 0; time_ms < 3990; time_ms += ts::kChunkSizeMs) {
-    ts.UpdateKeypress(false);
-    EXPECT_TRUE(ts.detection_enabled_);
-    EXPECT_TRUE(ts.suppression_enabled_);
-  }
-  for (int time_ms = 0; time_ms < 1000; time_ms += ts::kChunkSizeMs) {
-    ts.UpdateKeypress(false);
-    EXPECT_FALSE(ts.detection_enabled_);
-    EXPECT_FALSE(ts.suppression_enabled_);
-  }
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/transient/wpd_node.cc b/modules/audio_processing/transient/wpd_node.cc
deleted file mode 100644
index 88ad24d..0000000
--- a/modules/audio_processing/transient/wpd_node.cc
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- *  Copyright (c) 2013 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_processing/transient/wpd_node.h"
-
-#include <math.h>
-#include <string.h>
-
-#include "webrtc/common_audio/fir_filter.h"
-#include "webrtc/modules/audio_processing/transient/dyadic_decimator.h"
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-
-WPDNode::WPDNode(size_t length,
-                 const float* coefficients,
-                 size_t coefficients_length)
-    : // The data buffer has parent data length to be able to contain and filter
-      // it.
-      data_(new float[2 * length + 1]),
-      length_(length),
-      filter_(FIRFilter::Create(coefficients,
-                                coefficients_length,
-                                2 * length + 1)) {
-  RTC_DCHECK_GT(length, 0);
-  RTC_DCHECK(coefficients);
-  RTC_DCHECK_GT(coefficients_length, 0);
-  memset(data_.get(), 0.f, (2 * length + 1) * sizeof(data_[0]));
-}
-
-WPDNode::~WPDNode() {}
-
-int WPDNode::Update(const float* parent_data, size_t parent_data_length) {
-  if (!parent_data || (parent_data_length / 2) != length_) {
-    return -1;
-  }
-
-  // Filter data.
-  filter_->Filter(parent_data, parent_data_length, data_.get());
-
-  // Decimate data.
-  const bool kOddSequence = true;
-  size_t output_samples = DyadicDecimate(
-      data_.get(), parent_data_length, kOddSequence, data_.get(), length_);
-  if (output_samples != length_) {
-    return -1;
-  }
-
-  // Get abs to all values.
-  for (size_t i = 0; i < length_; ++i) {
-    data_[i] = fabs(data_[i]);
-  }
-
-  return 0;
-}
-
-int WPDNode::set_data(const float* new_data, size_t length) {
-  if (!new_data || length != length_) {
-    return -1;
-  }
-  memcpy(data_.get(), new_data, length * sizeof(data_[0]));
-  return 0;
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/transient/wpd_node.h b/modules/audio_processing/transient/wpd_node.h
deleted file mode 100644
index 99521fd..0000000
--- a/modules/audio_processing/transient/wpd_node.h
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- *  Copyright (c) 2013 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_PROCESSING_TRANSIENT_WPD_NODE_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_TRANSIENT_WPD_NODE_H_
-
-#include <memory>
-
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-class FIRFilter;
-
-// A single node of a Wavelet Packet Decomposition (WPD) tree.
-class WPDNode {
- public:
-  // Creates a WPDNode. The data vector will contain zeros. The filter will have
-  // the coefficients provided.
-  WPDNode(size_t length, const float* coefficients, size_t coefficients_length);
-  ~WPDNode();
-
-  // Updates the node data. |parent_data| / 2 must be equals to |length_|.
-  // Returns 0 if correct, and -1 otherwise.
-  int Update(const float* parent_data, size_t parent_data_length);
-
-  const float* data() const { return data_.get(); }
-  // Returns 0 if correct, and -1 otherwise.
-  int set_data(const float* new_data, size_t length);
-  size_t length() const { return length_; }
-
- private:
-  std::unique_ptr<float[]> data_;
-  size_t length_;
-  std::unique_ptr<FIRFilter> filter_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_TRANSIENT_WPD_NODE_H_
diff --git a/modules/audio_processing/transient/wpd_node_unittest.cc b/modules/audio_processing/transient/wpd_node_unittest.cc
deleted file mode 100644
index 3a9cb75..0000000
--- a/modules/audio_processing/transient/wpd_node_unittest.cc
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- *  Copyright (c) 2013 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_processing/transient/wpd_node.h"
-
-#include <string.h>
-
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-static const size_t kDataLength = 5;
-static const float kTolerance = 0.0001f;
-
-static const size_t kParentDataLength = kDataLength * 2;
-static const float kParentData[kParentDataLength] =
-    {1.f, 2.f, 3.f, 4.f, 5.f, 6.f, 7.f, 8.f, 9.f, 10.f};
-
-static const float kCoefficients[] = {0.2f, -0.3f, 0.5f, -0.7f, 0.11f};
-static const size_t kCoefficientsLength = sizeof(kCoefficients) /
-                                       sizeof(kCoefficients[0]);
-
-TEST(WPDNodeTest, Accessors) {
-  WPDNode node(kDataLength, kCoefficients, kCoefficientsLength);
-  EXPECT_EQ(0, node.set_data(kParentData, kDataLength));
-  EXPECT_EQ(0, memcmp(node.data(),
-                      kParentData,
-                      kDataLength * sizeof(node.data()[0])));
-}
-
-TEST(WPDNodeTest, UpdateThatOnlyDecimates) {
-  const float kIndentyCoefficient = 1.f;
-  WPDNode node(kDataLength, &kIndentyCoefficient, 1);
-  EXPECT_EQ(0, node.Update(kParentData, kParentDataLength));
-  for (size_t i = 0; i < kDataLength; ++i) {
-    EXPECT_FLOAT_EQ(kParentData[i * 2 + 1], node.data()[i]);
-  }
-}
-
-TEST(WPDNodeTest, UpdateWithArbitraryDataAndArbitraryFilter) {
-  WPDNode node(kDataLength, kCoefficients, kCoefficientsLength);
-  EXPECT_EQ(0, node.Update(kParentData, kParentDataLength));
-  EXPECT_NEAR(0.1f, node.data()[0], kTolerance);
-  EXPECT_NEAR(0.2f, node.data()[1], kTolerance);
-  EXPECT_NEAR(0.18f, node.data()[2], kTolerance);
-  EXPECT_NEAR(0.56f, node.data()[3], kTolerance);
-  EXPECT_NEAR(0.94f, node.data()[4], kTolerance);
-}
-
-TEST(WPDNodeTest, ExpectedErrorReturnValue) {
-  WPDNode node(kDataLength, kCoefficients, kCoefficientsLength);
-  EXPECT_EQ(-1, node.Update(kParentData, kParentDataLength - 1));
-  EXPECT_EQ(-1, node.Update(NULL, kParentDataLength));
-  EXPECT_EQ(-1, node.set_data(kParentData, kDataLength - 1));
-  EXPECT_EQ(-1, node.set_data(NULL, kDataLength));
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/transient/wpd_tree.cc b/modules/audio_processing/transient/wpd_tree.cc
deleted file mode 100644
index 187a8cd..0000000
--- a/modules/audio_processing/transient/wpd_tree.cc
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- *  Copyright (c) 2013 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_processing/transient/wpd_tree.h"
-
-#include <math.h>
-#include <string.h>
-
-#include "webrtc/modules/audio_processing/transient/dyadic_decimator.h"
-#include "webrtc/modules/audio_processing/transient/wpd_node.h"
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-
-WPDTree::WPDTree(size_t data_length, const float* high_pass_coefficients,
-                 const float* low_pass_coefficients, size_t coefficients_length,
-                 int levels)
-    : data_length_(data_length),
-      levels_(levels),
-      num_nodes_((1 << (levels + 1)) - 1) {
-  RTC_DCHECK_GT(data_length, (static_cast<size_t>(1) << levels));
-  RTC_DCHECK(high_pass_coefficients);
-  RTC_DCHECK(low_pass_coefficients);
-  RTC_DCHECK_GT(levels, 0);
-  // Size is 1 more, so we can use the array as 1-based. nodes_[0] is never
-  // allocated.
-  nodes_.reset(new std::unique_ptr<WPDNode>[num_nodes_ + 1]);
-
-  // Create the first node
-  const float kRootCoefficient = 1.f;  // Identity Coefficient.
-  nodes_[1].reset(new WPDNode(data_length, &kRootCoefficient, 1));
-  // Variables used to create the rest of the nodes.
-  size_t index = 1;
-  size_t index_left_child = 0;
-  size_t index_right_child = 0;
-
-  int num_nodes_at_curr_level = 0;
-
-  // Branching each node in each level to create its children. The last level is
-  // not branched (all the nodes of that level are leaves).
-  for (int current_level = 0; current_level < levels; ++current_level) {
-    num_nodes_at_curr_level = 1 << current_level;
-    for (int i = 0; i < num_nodes_at_curr_level; ++i) {
-      index = (1 << current_level) + i;
-      // Obtain the index of the current node children.
-      index_left_child = index * 2;
-      index_right_child = index_left_child + 1;
-      nodes_[index_left_child].reset(new WPDNode(nodes_[index]->length() / 2,
-                                                 low_pass_coefficients,
-                                                 coefficients_length));
-      nodes_[index_right_child].reset(new WPDNode(nodes_[index]->length() / 2,
-                                                  high_pass_coefficients,
-                                                  coefficients_length));
-    }
-  }
-}
-
-WPDTree::~WPDTree() {}
-
-WPDNode* WPDTree::NodeAt(int level, int index) {
-  if (level < 0 || level > levels_ || index < 0 || index >= 1 << level) {
-    return NULL;
-  }
-
-  return nodes_[(1 << level) + index].get();
-}
-
-int WPDTree::Update(const float* data, size_t data_length) {
-  if (!data || data_length != data_length_) {
-    return -1;
-  }
-
-  // Update the root node.
-  int update_result = nodes_[1]->set_data(data, data_length);
-  if (update_result != 0) {
-    return -1;
-  }
-
-  // Variables used to update the rest of the nodes.
-  size_t index = 1;
-  size_t index_left_child = 0;
-  size_t index_right_child = 0;
-
-  int num_nodes_at_curr_level = 0;
-
-  for (int current_level = 0; current_level < levels_; ++current_level) {
-    num_nodes_at_curr_level = 1 << current_level;
-    for (int i = 0; i < num_nodes_at_curr_level; ++i) {
-      index = (1 << current_level) + i;
-      // Obtain the index of the current node children.
-      index_left_child = index * 2;
-      index_right_child = index_left_child + 1;
-
-      update_result = nodes_[index_left_child]->Update(
-          nodes_[index]->data(), nodes_[index]->length());
-      if (update_result != 0) {
-        return -1;
-      }
-
-      update_result = nodes_[index_right_child]->Update(
-          nodes_[index]->data(), nodes_[index]->length());
-      if (update_result != 0) {
-        return -1;
-      }
-    }
-  }
-
-  return 0;
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/transient/wpd_tree.h b/modules/audio_processing/transient/wpd_tree.h
deleted file mode 100644
index a64055e..0000000
--- a/modules/audio_processing/transient/wpd_tree.h
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- *  Copyright (c) 2013 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_PROCESSING_TRANSIENT_WPD_TREE_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_TRANSIENT_WPD_TREE_H_
-
-#include <memory>
-
-#include "webrtc/modules/audio_processing/transient/wpd_node.h"
-
-namespace webrtc {
-
-// Tree of a Wavelet Packet Decomposition (WPD).
-//
-// The root node contains all the data provided; for each node in the tree, the
-// left child contains the approximation coefficients extracted from the node,
-// and the right child contains the detail coefficients.
-// It preserves its state, so it can be multiple-called.
-//
-// The number of nodes in the tree will be 2 ^ levels - 1.
-//
-// Implementation details: Since the tree always will be a complete binary tree,
-// it is implemented using a single linear array instead of managing the
-// relationships in each node. For convience is better to use a array that
-// starts in 1 (instead of 0). Taking that into account, the following formulas
-// apply:
-// Root node index: 1.
-// Node(Level, Index in that level): 2 ^ Level + (Index in that level).
-// Left Child: Current node index * 2.
-// Right Child: Current node index * 2 + 1.
-// Parent: Current Node Index / 2 (Integer division).
-class WPDTree {
- public:
-  // Creates a WPD tree using the data length and coefficients provided.
-  WPDTree(size_t data_length,
-          const float* high_pass_coefficients,
-          const float* low_pass_coefficients,
-          size_t coefficients_length,
-          int levels);
-  ~WPDTree();
-
-  // Returns the number of nodes at any given level.
-  static int NumberOfNodesAtLevel(int level) {
-    return 1 << level;
-  }
-
-  // Returns a pointer to the node at the given level and index(of that level).
-  // Level goes from 0 to levels().
-  // Index goes from 0 to the number of NumberOfNodesAtLevel(level) - 1.
-  //
-  // You can use the following formulas to get any node within the tree:
-  // Notation: (Level, Index of node in that level).
-  // Root node: (0/0).
-  // Left Child: (Current node level + 1, Current node index * 2).
-  // Right Child: (Current node level + 1, Current node index * 2 + 1).
-  // Parent: (Current node level - 1, Current node index / 2) (Integer division)
-  //
-  // If level or index are out of bounds the function will return NULL.
-  WPDNode* NodeAt(int level, int index);
-
-  // Updates all the nodes of the tree with the new data. |data_length| must be
-  // teh same that was used for the creation of the tree.
-  // Returns 0 if correct, and -1 otherwise.
-  int Update(const float* data, size_t data_length);
-
-  // Returns the total number of levels below the root. Root is cosidered level
-  // 0.
-  int levels() const { return levels_; }
-
-  // Returns the total number of nodes.
-  int num_nodes() const { return num_nodes_; }
-
-  // Returns the total number of leaves.
-  int num_leaves() const { return 1 << levels_; }
-
- private:
-  size_t data_length_;
-  int levels_;
-  int num_nodes_;
-  std::unique_ptr<std::unique_ptr<WPDNode>[]> nodes_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_TRANSIENT_WPD_TREE_H_
diff --git a/modules/audio_processing/transient/wpd_tree_unittest.cc b/modules/audio_processing/transient/wpd_tree_unittest.cc
deleted file mode 100644
index 983d05d..0000000
--- a/modules/audio_processing/transient/wpd_tree_unittest.cc
+++ /dev/null
@@ -1,193 +0,0 @@
-/*
- *  Copyright (c) 2013 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_processing/transient/wpd_tree.h"
-
-#include <memory>
-#include <sstream>
-#include <string>
-
-#include "webrtc/modules/audio_processing/transient/daubechies_8_wavelet_coeffs.h"
-#include "webrtc/modules/audio_processing/transient/file_utils.h"
-#include "webrtc/system_wrappers/include/file_wrapper.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/testsupport/fileutils.h"
-
-namespace webrtc {
-
-TEST(WPDTreeTest, Construction) {
-  const size_t kTestBufferSize = 100;
-  const int kLevels = 5;
-  const int kExpectedNumberOfNodes = (1 << (kLevels + 1)) - 1;
-
-  float test_buffer[kTestBufferSize];
-  memset(test_buffer, 0.f, kTestBufferSize * sizeof(*test_buffer));
-  float test_coefficients[] = {1.f, 2.f, 3.f, 4.f, 5.f};
-  const size_t kTestCoefficientsLength = sizeof(test_coefficients) /
-      sizeof(test_coefficients[0]);
-  WPDTree tree(kTestBufferSize,
-               test_coefficients,
-               test_coefficients,
-               kTestCoefficientsLength,
-               kLevels);
-  ASSERT_EQ(kExpectedNumberOfNodes, tree.num_nodes());
-  // Checks for NodeAt(level, index).
-  int nodes_at_level = 0;
-  for (int level = 0; level <= kLevels; ++level) {
-    nodes_at_level = 1 << level;
-    for (int i = 0; i < nodes_at_level; ++i) {
-      ASSERT_TRUE(NULL != tree.NodeAt(level, i));
-    }
-    // Out of bounds.
-    EXPECT_EQ(NULL, tree.NodeAt(level, -1));
-    EXPECT_EQ(NULL, tree.NodeAt(level, -12));
-    EXPECT_EQ(NULL, tree.NodeAt(level, nodes_at_level));
-    EXPECT_EQ(NULL, tree.NodeAt(level, nodes_at_level + 5));
-  }
-  // Out of bounds.
-  EXPECT_EQ(NULL, tree.NodeAt(-1, 0));
-  EXPECT_EQ(NULL, tree.NodeAt(-12, 0));
-  EXPECT_EQ(NULL, tree.NodeAt(kLevels + 1, 0));
-  EXPECT_EQ(NULL, tree.NodeAt(kLevels + 5, 0));
-  // Checks for Update().
-  EXPECT_EQ(0, tree.Update(test_buffer, kTestBufferSize));
-  EXPECT_EQ(-1, tree.Update(NULL, kTestBufferSize));
-  EXPECT_EQ(-1, tree.Update(test_buffer, kTestBufferSize - 1));
-}
-
-// This test is for the correctness of the tree.
-// Checks the results from the Matlab equivalent, it is done comparing the
-// results that are stored in the output files from Matlab.
-// It also writes the results in its own set of files in the out directory.
-// Matlab and output files contain all the results in double precision (Little
-// endian) appended.
-#if defined(WEBRTC_IOS)
-TEST(WPDTreeTest, DISABLED_CorrectnessBasedOnMatlabFiles) {
-#else
-TEST(WPDTreeTest, CorrectnessBasedOnMatlabFiles) {
-#endif
-  // 10 ms at 16000 Hz.
-  const size_t kTestBufferSize = 160;
-  const int kLevels = 3;
-  const int kLeaves = 1 << kLevels;
-  const size_t kLeavesSamples = kTestBufferSize >> kLevels;
-  // Create tree with Discrete Meyer Wavelet Coefficients.
-  WPDTree tree(kTestBufferSize,
-               kDaubechies8HighPassCoefficients,
-               kDaubechies8LowPassCoefficients,
-               kDaubechies8CoefficientsLength,
-               kLevels);
-  // Allocate and open all matlab and out files.
-  std::unique_ptr<FileWrapper> matlab_files_data[kLeaves];
-  std::unique_ptr<FileWrapper> out_files_data[kLeaves];
-
-  for (int i = 0; i < kLeaves; ++i) {
-    // Matlab files.
-    matlab_files_data[i].reset(FileWrapper::Create());
-
-    std::ostringstream matlab_stream;
-    matlab_stream << "audio_processing/transient/wpd" << i;
-    std::string matlab_string = test::ResourcePath(matlab_stream.str(), "dat");
-    matlab_files_data[i]->OpenFile(matlab_string.c_str(), true);  // Read only.
-
-    bool file_opened = matlab_files_data[i]->is_open();
-    ASSERT_TRUE(file_opened) << "File could not be opened.\n" << matlab_string;
-
-    // Out files.
-    out_files_data[i].reset(FileWrapper::Create());
-
-    std::ostringstream out_stream;
-    out_stream << test::OutputPath() << "wpd_" << i << ".out";
-    std::string out_string = out_stream.str();
-
-    out_files_data[i]->OpenFile(out_string.c_str(), false);  // Write mode.
-
-    file_opened = out_files_data[i]->is_open();
-    ASSERT_TRUE(file_opened) << "File could not be opened.\n" << out_string;
-  }
-
-  // Prepare the test file.
-  std::string test_file_name = test::ResourcePath(
-      "audio_processing/transient/ajm-macbook-1-spke16m", "pcm");
-
-  std::unique_ptr<FileWrapper> test_file(FileWrapper::Create());
-
-  test_file->OpenFile(test_file_name.c_str(), true);  // Read only.
-
-  bool file_opened = test_file->is_open();
-  ASSERT_TRUE(file_opened) << "File could not be opened.\n" << test_file_name;
-
-  float test_buffer[kTestBufferSize];
-
-  // Only the first frames of the audio file are tested. The matlab files also
-  // only contains information about the first frames.
-  const size_t kMaxFramesToTest = 100;
-  const float kTolerance = 0.03f;
-
-  size_t frames_read = 0;
-
-  // Read first buffer from the PCM test file.
-  size_t file_samples_read = ReadInt16FromFileToFloatBuffer(test_file.get(),
-                                                            kTestBufferSize,
-                                                            test_buffer);
-  while (file_samples_read > 0 && frames_read < kMaxFramesToTest) {
-    ++frames_read;
-
-    if (file_samples_read < kTestBufferSize) {
-      // Pad the rest of the buffer with zeros.
-      for (size_t i = file_samples_read; i < kTestBufferSize; ++i) {
-        test_buffer[i] = 0.0;
-      }
-    }
-    tree.Update(test_buffer, kTestBufferSize);
-    double matlab_buffer[kTestBufferSize];
-
-    // Compare results with data from the matlab test files.
-    for (int i = 0; i < kLeaves; ++i) {
-      // Compare data values
-      size_t matlab_samples_read =
-          ReadDoubleBufferFromFile(matlab_files_data[i].get(),
-                                   kLeavesSamples,
-                                   matlab_buffer);
-
-      ASSERT_EQ(kLeavesSamples, matlab_samples_read)
-          << "Matlab test files are malformed.\n"
-          << "File: 3_" << i;
-      // Get output data from the corresponding node
-      const float* node_data = tree.NodeAt(kLevels, i)->data();
-      // Compare with matlab files.
-      for (size_t j = 0; j < kLeavesSamples; ++j) {
-        EXPECT_NEAR(matlab_buffer[j], node_data[j], kTolerance)
-            << "\nLeaf: " << i << "\nSample: " << j
-            << "\nFrame: " << frames_read - 1;
-      }
-
-      // Write results to out files.
-      WriteFloatBufferToFile(out_files_data[i].get(),
-                             kLeavesSamples,
-                             node_data);
-    }
-
-    // Read next buffer from the PCM test file.
-    file_samples_read = ReadInt16FromFileToFloatBuffer(test_file.get(),
-                                                       kTestBufferSize,
-                                                       test_buffer);
-  }
-
-  // Close all matlab and out files.
-  for (int i = 0; i < kLeaves; ++i) {
-    matlab_files_data[i]->CloseFile();
-    out_files_data[i]->CloseFile();
-  }
-
-  test_file->CloseFile();
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/typing_detection.cc b/modules/audio_processing/typing_detection.cc
deleted file mode 100644
index 5f5ce0a..0000000
--- a/modules/audio_processing/typing_detection.cc
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- *  Copyright (c) 2014 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_processing/typing_detection.h"
-
-namespace webrtc {
-
-TypingDetection::TypingDetection()
-    : time_active_(0),
-      time_since_last_typing_(0),
-      penalty_counter_(0),
-      counter_since_last_detection_update_(0),
-      detection_to_report_(false),
-      new_detection_to_report_(false),
-      time_window_(10),
-      cost_per_typing_(100),
-      reporting_threshold_(300),
-      penalty_decay_(1),
-      type_event_delay_(2),
-      report_detection_update_period_(1) {
-}
-
-TypingDetection::~TypingDetection() {}
-
-bool TypingDetection::Process(bool key_pressed, bool vad_activity) {
-  if (vad_activity)
-    time_active_++;
-  else
-    time_active_ = 0;
-
-  // Keep track if time since last typing event
-  if (key_pressed)
-    time_since_last_typing_ = 0;
-  else
-    ++time_since_last_typing_;
-
-  if (time_since_last_typing_ < type_event_delay_ &&
-      vad_activity &&
-      time_active_ < time_window_) {
-    penalty_counter_ += cost_per_typing_;
-    if (penalty_counter_ > reporting_threshold_)
-      new_detection_to_report_ = true;
-  }
-
-  if (penalty_counter_ > 0)
-    penalty_counter_ -= penalty_decay_;
-
-  if (++counter_since_last_detection_update_ ==
-      report_detection_update_period_) {
-    detection_to_report_ = new_detection_to_report_;
-    new_detection_to_report_ = false;
-    counter_since_last_detection_update_ = 0;
-  }
-
-  return detection_to_report_;
-}
-
-int TypingDetection::TimeSinceLastDetectionInSeconds() {
-  // Round to whole seconds.
-  return (time_since_last_typing_ + 50) / 100;
-}
-
-void TypingDetection::SetParameters(int time_window,
-                                    int cost_per_typing,
-                                    int reporting_threshold,
-                                    int penalty_decay,
-                                    int type_event_delay,
-                                    int report_detection_update_period) {
-  if (time_window) time_window_ = time_window;
-
-  if (cost_per_typing) cost_per_typing_ = cost_per_typing;
-
-  if (reporting_threshold) reporting_threshold_ = reporting_threshold;
-
-  if (penalty_decay) penalty_decay_ = penalty_decay;
-
-  if (type_event_delay) type_event_delay_ = type_event_delay;
-
-  if (report_detection_update_period)
-    report_detection_update_period_ = report_detection_update_period;
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/typing_detection.h b/modules/audio_processing/typing_detection.h
deleted file mode 100644
index 40608f8..0000000
--- a/modules/audio_processing/typing_detection.h
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- *  Copyright (c) 2014 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_PROCESSING_TYPING_DETECTION_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_TYPING_DETECTION_H_
-
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-class TypingDetection {
- public:
-  TypingDetection();
-  virtual ~TypingDetection();
-
-  // Run the detection algortihm. Shall be called every 10 ms. Returns true if
-  // typing is detected, or false if not, based on the update period as set with
-  // SetParameters(). See |report_detection_update_period_| description below.
-  bool Process(bool key_pressed, bool vad_activity);
-
-  // Gets the time in seconds since the last detection.
-  int TimeSinceLastDetectionInSeconds();
-
-  // Sets the algorithm parameters. A parameter value of 0 leaves it unchanged.
-  // See the correspondning member variables below for descriptions.
-  void SetParameters(int time_window,
-                     int cost_per_typing,
-                     int reporting_threshold,
-                     int penalty_decay,
-                     int type_event_delay,
-                     int report_detection_update_period);
-
- private:
-  int time_active_;
-  int time_since_last_typing_;
-  int penalty_counter_;
-
-  // Counter since last time the detection status reported by Process() was
-  // updated. See also |report_detection_update_period_|.
-  int counter_since_last_detection_update_;
-
-  // The detection status to report. Updated every
-  // |report_detection_update_period_| call to Process().
-  bool detection_to_report_;
-
-  // What |detection_to_report_| should be set to next time it is updated.
-  bool new_detection_to_report_;
-
-  // Settable threshold values.
-
-  // Number of 10 ms slots accepted to count as a hit.
-  int time_window_;
-
-  // Penalty added for a typing + activity coincide.
-  int cost_per_typing_;
-
-  // Threshold for |penalty_counter_|.
-  int reporting_threshold_;
-
-  // How much we reduce |penalty_counter_| every 10 ms.
-  int penalty_decay_;
-
-  // How old typing events we allow.
-  int type_event_delay_;
-
-  // Settable update period.
-
-  // Number of 10 ms slots between each update of the detection status returned
-  // by Process(). This inertia added to the algorithm is usually desirable and
-  // provided so that consumers of the class don't have to implement that
-  // themselves if they don't wish.
-  // If set to 1, each call to Process() will return the detection status for
-  // that 10 ms slot.
-  // If set to N (where N > 1), the detection status returned from Process()
-  // will remain the same until Process() has been called N times. Then, if none
-  // of the last N calls to Process() has detected typing for each respective
-  // 10 ms slot, Process() will return false. If at least one of the last N
-  // calls has detected typing, Process() will return true. And that returned
-  // status will then remain the same until the next N calls have been done.
-  int report_detection_update_period_;
-};
-
-}  // namespace webrtc
-
-#endif  // #ifndef WEBRTC_MODULES_AUDIO_PROCESSING_TYPING_DETECTION_H_
diff --git a/modules/audio_processing/utility/block_mean_calculator.cc b/modules/audio_processing/utility/block_mean_calculator.cc
deleted file mode 100644
index 37919f0..0000000
--- a/modules/audio_processing/utility/block_mean_calculator.cc
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- *  Copyright 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_processing/utility/block_mean_calculator.h"
-
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-
-BlockMeanCalculator::BlockMeanCalculator(size_t block_length)
-    : block_length_(block_length),
-      count_(0),
-      sum_(0.0),
-      mean_(0.0) {
-  RTC_DCHECK(block_length_ != 0);
-}
-
-void BlockMeanCalculator::Reset() {
-  Clear();
-  mean_ = 0.0;
-}
-
-void BlockMeanCalculator::AddValue(float value) {
-  sum_ += value;
-  ++count_;
-  if (count_ == block_length_) {
-    mean_ = sum_ / block_length_;
-    Clear();
-  }
-}
-
-bool BlockMeanCalculator::EndOfBlock() const {
-  return count_ == 0;
-}
-
-float BlockMeanCalculator::GetLatestMean() const {
-  return mean_;
-}
-
-// Flush all samples added.
-void BlockMeanCalculator::Clear() {
-  count_ = 0;
-  sum_ = 0.0;
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/utility/block_mean_calculator.h b/modules/audio_processing/utility/block_mean_calculator.h
deleted file mode 100644
index 3dd7d40..0000000
--- a/modules/audio_processing/utility/block_mean_calculator.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- *  Copyright 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_PROCESSING_UTILITY_BLOCK_MEAN_CALCULATOR_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_UTILITY_BLOCK_MEAN_CALCULATOR_H_
-
-#include <stddef.h>
-
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace webrtc {
-
-// BlockMeanCalculator calculates the mean of a block of values. Values are
-// added one after another, and the mean is updated at the end of every block.
-class BlockMeanCalculator {
- public:
-  explicit BlockMeanCalculator(size_t block_length);
-
-  // Reset.
-  void Reset();
-
-  // Add one value to the sequence.
-  void AddValue(float value);
-
-  // Return whether the latest added value was at the end of a block.
-  bool EndOfBlock() const;
-
-  // Return the latest mean.
-  float GetLatestMean() const;
-
- private:
-  // Clear all values added.
-  void Clear();
-
-  const size_t block_length_;
-  size_t count_;
-  float sum_;
-  float mean_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(BlockMeanCalculator);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_UTILITY_BLOCK_MEAN_CALCULATOR_H_
diff --git a/modules/audio_processing/utility/block_mean_calculator_unittest.cc b/modules/audio_processing/utility/block_mean_calculator_unittest.cc
deleted file mode 100644
index 22e8f49..0000000
--- a/modules/audio_processing/utility/block_mean_calculator_unittest.cc
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- *  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_processing/utility/block_mean_calculator.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-TEST(MeanCalculatorTest, Correctness) {
-  const size_t kBlockLength = 10;
-  BlockMeanCalculator mean_calculator(kBlockLength);
-  size_t i = 0;
-  float reference = 0.0;
-
-  for (; i < kBlockLength - 1; ++i) {
-    mean_calculator.AddValue(static_cast<float>(i));
-    EXPECT_FALSE(mean_calculator.EndOfBlock());
-  }
-  mean_calculator.AddValue(static_cast<float>(i++));
-  EXPECT_TRUE(mean_calculator.EndOfBlock());
-
-  for (; i < 3 * kBlockLength; ++i) {
-    const bool end_of_block = i % kBlockLength == 0;
-    if (end_of_block) {
-      // Sum of (i - kBlockLength) ... (i - 1)
-      reference = i - 0.5 * (1 + kBlockLength);
-    }
-    EXPECT_EQ(mean_calculator.EndOfBlock(), end_of_block);
-    EXPECT_EQ(reference, mean_calculator.GetLatestMean());
-    mean_calculator.AddValue(static_cast<float>(i));
-  }
-}
-
-TEST(MeanCalculatorTest, Reset) {
-  const size_t kBlockLength = 10;
-  BlockMeanCalculator mean_calculator(kBlockLength);
-  for (size_t i = 0; i < kBlockLength - 1; ++i) {
-    mean_calculator.AddValue(static_cast<float>(i));
-  }
-  mean_calculator.Reset();
-  size_t i = 0;
-  for (; i < kBlockLength - 1; ++i) {
-    mean_calculator.AddValue(static_cast<float>(i));
-    EXPECT_FALSE(mean_calculator.EndOfBlock());
-  }
-  mean_calculator.AddValue(static_cast<float>(i));
-  EXPECT_TRUE(mean_calculator.EndOfBlock());
-  EXPECT_EQ(mean_calculator.GetLatestMean(), 0.5 * (kBlockLength - 1));
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/utility/delay_estimator.cc b/modules/audio_processing/utility/delay_estimator.cc
deleted file mode 100644
index e01495e..0000000
--- a/modules/audio_processing/utility/delay_estimator.cc
+++ /dev/null
@@ -1,703 +0,0 @@
-/*
- *  Copyright (c) 2012 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_processing/utility/delay_estimator.h"
-
-#include <stdlib.h>
-#include <string.h>
-#include <algorithm>
-
-#include "webrtc/rtc_base/checks.h"
-
-// Number of right shifts for scaling is linearly depending on number of bits in
-// the far-end binary spectrum.
-static const int kShiftsAtZero = 13;  // Right shifts at zero binary spectrum.
-static const int kShiftsLinearSlope = 3;
-
-static const int32_t kProbabilityOffset = 1024;  // 2 in Q9.
-static const int32_t kProbabilityLowerLimit = 8704;  // 17 in Q9.
-static const int32_t kProbabilityMinSpread = 2816;  // 5.5 in Q9.
-
-// Robust validation settings
-static const float kHistogramMax = 3000.f;
-static const float kLastHistogramMax = 250.f;
-static const float kMinHistogramThreshold = 1.5f;
-static const int kMinRequiredHits = 10;
-static const int kMaxHitsWhenPossiblyNonCausal = 10;
-static const int kMaxHitsWhenPossiblyCausal = 1000;
-static const float kQ14Scaling = 1.f / (1 << 14);  // Scaling by 2^14 to get Q0.
-static const float kFractionSlope = 0.05f;
-static const float kMinFractionWhenPossiblyCausal = 0.5f;
-static const float kMinFractionWhenPossiblyNonCausal = 0.25f;
-
-// Counts and returns number of bits of a 32-bit word.
-static int BitCount(uint32_t u32) {
-  uint32_t tmp = u32 - ((u32 >> 1) & 033333333333) -
-      ((u32 >> 2) & 011111111111);
-  tmp = ((tmp + (tmp >> 3)) & 030707070707);
-  tmp = (tmp + (tmp >> 6));
-  tmp = (tmp + (tmp >> 12) + (tmp >> 24)) & 077;
-
-  return ((int) tmp);
-}
-
-// Compares the |binary_vector| with all rows of the |binary_matrix| and counts
-// per row the number of times they have the same value.
-//
-// Inputs:
-//      - binary_vector     : binary "vector" stored in a long
-//      - binary_matrix     : binary "matrix" stored as a vector of long
-//      - matrix_size       : size of binary "matrix"
-//
-// Output:
-//      - bit_counts        : "Vector" stored as a long, containing for each
-//                            row the number of times the matrix row and the
-//                            input vector have the same value
-//
-static void BitCountComparison(uint32_t binary_vector,
-                               const uint32_t* binary_matrix,
-                               int matrix_size,
-                               int32_t* bit_counts) {
-  int n = 0;
-
-  // Compare |binary_vector| with all rows of the |binary_matrix|
-  for (; n < matrix_size; n++) {
-    bit_counts[n] = (int32_t) BitCount(binary_vector ^ binary_matrix[n]);
-  }
-}
-
-// Collects necessary statistics for the HistogramBasedValidation().  This
-// function has to be called prior to calling HistogramBasedValidation().  The
-// statistics updated and used by the HistogramBasedValidation() are:
-//  1. the number of |candidate_hits|, which states for how long we have had the
-//     same |candidate_delay|
-//  2. the |histogram| of candidate delays over time.  This histogram is
-//     weighted with respect to a reliability measure and time-varying to cope
-//     with possible delay shifts.
-// For further description see commented code.
-//
-// Inputs:
-//  - candidate_delay   : The delay to validate.
-//  - valley_depth_q14  : The cost function has a valley/minimum at the
-//                        |candidate_delay| location.  |valley_depth_q14| is the
-//                        cost function difference between the minimum and
-//                        maximum locations.  The value is in the Q14 domain.
-//  - valley_level_q14  : Is the cost function value at the minimum, in Q14.
-static void UpdateRobustValidationStatistics(BinaryDelayEstimator* self,
-                                             int candidate_delay,
-                                             int32_t valley_depth_q14,
-                                             int32_t valley_level_q14) {
-  const float valley_depth = valley_depth_q14 * kQ14Scaling;
-  float decrease_in_last_set = valley_depth;
-  const int max_hits_for_slow_change = (candidate_delay < self->last_delay) ?
-      kMaxHitsWhenPossiblyNonCausal : kMaxHitsWhenPossiblyCausal;
-  int i = 0;
-
-  RTC_DCHECK_EQ(self->history_size, self->farend->history_size);
-  // Reset |candidate_hits| if we have a new candidate.
-  if (candidate_delay != self->last_candidate_delay) {
-    self->candidate_hits = 0;
-    self->last_candidate_delay = candidate_delay;
-  }
-  self->candidate_hits++;
-
-  // The |histogram| is updated differently across the bins.
-  // 1. The |candidate_delay| histogram bin is increased with the
-  //    |valley_depth|, which is a simple measure of how reliable the
-  //    |candidate_delay| is.  The histogram is not increased above
-  //    |kHistogramMax|.
-  self->histogram[candidate_delay] += valley_depth;
-  if (self->histogram[candidate_delay] > kHistogramMax) {
-    self->histogram[candidate_delay] = kHistogramMax;
-  }
-  // 2. The histogram bins in the neighborhood of |candidate_delay| are
-  //    unaffected.  The neighborhood is defined as x + {-2, -1, 0, 1}.
-  // 3. The histogram bins in the neighborhood of |last_delay| are decreased
-  //    with |decrease_in_last_set|.  This value equals the difference between
-  //    the cost function values at the locations |candidate_delay| and
-  //    |last_delay| until we reach |max_hits_for_slow_change| consecutive hits
-  //    at the |candidate_delay|.  If we exceed this amount of hits the
-  //    |candidate_delay| is a "potential" candidate and we start decreasing
-  //    these histogram bins more rapidly with |valley_depth|.
-  if (self->candidate_hits < max_hits_for_slow_change) {
-    decrease_in_last_set = (self->mean_bit_counts[self->compare_delay] -
-        valley_level_q14) * kQ14Scaling;
-  }
-  // 4. All other bins are decreased with |valley_depth|.
-  // TODO(bjornv): Investigate how to make this loop more efficient.  Split up
-  // the loop?  Remove parts that doesn't add too much.
-  for (i = 0; i < self->history_size; ++i) {
-    int is_in_last_set = (i >= self->last_delay - 2) &&
-        (i <= self->last_delay + 1) && (i != candidate_delay);
-    int is_in_candidate_set = (i >= candidate_delay - 2) &&
-        (i <= candidate_delay + 1);
-    self->histogram[i] -= decrease_in_last_set * is_in_last_set +
-        valley_depth * (!is_in_last_set && !is_in_candidate_set);
-    // 5. No histogram bin can go below 0.
-    if (self->histogram[i] < 0) {
-      self->histogram[i] = 0;
-    }
-  }
-}
-
-// Validates the |candidate_delay|, estimated in WebRtc_ProcessBinarySpectrum(),
-// based on a mix of counting concurring hits with a modified histogram
-// of recent delay estimates.  In brief a candidate is valid (returns 1) if it
-// is the most likely according to the histogram.  There are a couple of
-// exceptions that are worth mentioning:
-//  1. If the |candidate_delay| < |last_delay| it can be that we are in a
-//     non-causal state, breaking a possible echo control algorithm.  Hence, we
-//     open up for a quicker change by allowing the change even if the
-//     |candidate_delay| is not the most likely one according to the histogram.
-//  2. There's a minimum number of hits (kMinRequiredHits) and the histogram
-//     value has to reached a minimum (kMinHistogramThreshold) to be valid.
-//  3. The action is also depending on the filter length used for echo control.
-//     If the delay difference is larger than what the filter can capture, we
-//     also move quicker towards a change.
-// For further description see commented code.
-//
-// Input:
-//  - candidate_delay     : The delay to validate.
-//
-// Return value:
-//  - is_histogram_valid  : 1 - The |candidate_delay| is valid.
-//                          0 - Otherwise.
-static int HistogramBasedValidation(const BinaryDelayEstimator* self,
-                                    int candidate_delay) {
-  float fraction = 1.f;
-  float histogram_threshold = self->histogram[self->compare_delay];
-  const int delay_difference = candidate_delay - self->last_delay;
-  int is_histogram_valid = 0;
-
-  // The histogram based validation of |candidate_delay| is done by comparing
-  // the |histogram| at bin |candidate_delay| with a |histogram_threshold|.
-  // This |histogram_threshold| equals a |fraction| of the |histogram| at bin
-  // |last_delay|.  The |fraction| is a piecewise linear function of the
-  // |delay_difference| between the |candidate_delay| and the |last_delay|
-  // allowing for a quicker move if
-  //  i) a potential echo control filter can not handle these large differences.
-  // ii) keeping |last_delay| instead of updating to |candidate_delay| could
-  //     force an echo control into a non-causal state.
-  // We further require the histogram to have reached a minimum value of
-  // |kMinHistogramThreshold|.  In addition, we also require the number of
-  // |candidate_hits| to be more than |kMinRequiredHits| to remove spurious
-  // values.
-
-  // Calculate a comparison histogram value (|histogram_threshold|) that is
-  // depending on the distance between the |candidate_delay| and |last_delay|.
-  // TODO(bjornv): How much can we gain by turning the fraction calculation
-  // into tables?
-  if (delay_difference > self->allowed_offset) {
-    fraction = 1.f - kFractionSlope * (delay_difference - self->allowed_offset);
-    fraction = (fraction > kMinFractionWhenPossiblyCausal ? fraction :
-        kMinFractionWhenPossiblyCausal);
-  } else if (delay_difference < 0) {
-    fraction = kMinFractionWhenPossiblyNonCausal -
-        kFractionSlope * delay_difference;
-    fraction = (fraction > 1.f ? 1.f : fraction);
-  }
-  histogram_threshold *= fraction;
-  histogram_threshold = (histogram_threshold > kMinHistogramThreshold ?
-      histogram_threshold : kMinHistogramThreshold);
-
-  is_histogram_valid =
-      (self->histogram[candidate_delay] >= histogram_threshold) &&
-      (self->candidate_hits > kMinRequiredHits);
-
-  return is_histogram_valid;
-}
-
-// Performs a robust validation of the |candidate_delay| estimated in
-// WebRtc_ProcessBinarySpectrum().  The algorithm takes the
-// |is_instantaneous_valid| and the |is_histogram_valid| and combines them
-// into a robust validation.  The HistogramBasedValidation() has to be called
-// prior to this call.
-// For further description on how the combination is done, see commented code.
-//
-// Inputs:
-//  - candidate_delay         : The delay to validate.
-//  - is_instantaneous_valid  : The instantaneous validation performed in
-//                              WebRtc_ProcessBinarySpectrum().
-//  - is_histogram_valid      : The histogram based validation.
-//
-// Return value:
-//  - is_robust               : 1 - The candidate_delay is valid according to a
-//                                  combination of the two inputs.
-//                            : 0 - Otherwise.
-static int RobustValidation(const BinaryDelayEstimator* self,
-                            int candidate_delay,
-                            int is_instantaneous_valid,
-                            int is_histogram_valid) {
-  int is_robust = 0;
-
-  // The final robust validation is based on the two algorithms; 1) the
-  // |is_instantaneous_valid| and 2) the histogram based with result stored in
-  // |is_histogram_valid|.
-  //   i) Before we actually have a valid estimate (|last_delay| == -2), we say
-  //      a candidate is valid if either algorithm states so
-  //      (|is_instantaneous_valid| OR |is_histogram_valid|).
-  is_robust = (self->last_delay < 0) &&
-      (is_instantaneous_valid || is_histogram_valid);
-  //  ii) Otherwise, we need both algorithms to be certain
-  //      (|is_instantaneous_valid| AND |is_histogram_valid|)
-  is_robust |= is_instantaneous_valid && is_histogram_valid;
-  // iii) With one exception, i.e., the histogram based algorithm can overrule
-  //      the instantaneous one if |is_histogram_valid| = 1 and the histogram
-  //      is significantly strong.
-  is_robust |= is_histogram_valid &&
-      (self->histogram[candidate_delay] > self->last_delay_histogram);
-
-  return is_robust;
-}
-
-void WebRtc_FreeBinaryDelayEstimatorFarend(BinaryDelayEstimatorFarend* self) {
-
-  if (self == NULL) {
-    return;
-  }
-
-  free(self->binary_far_history);
-  self->binary_far_history = NULL;
-
-  free(self->far_bit_counts);
-  self->far_bit_counts = NULL;
-
-  free(self);
-}
-
-BinaryDelayEstimatorFarend* WebRtc_CreateBinaryDelayEstimatorFarend(
-    int history_size) {
-  BinaryDelayEstimatorFarend* self = NULL;
-
-  if (history_size > 1) {
-    // Sanity conditions fulfilled.
-    self = static_cast<BinaryDelayEstimatorFarend*>(
-        malloc(sizeof(BinaryDelayEstimatorFarend)));
-  }
-  if (self == NULL) {
-    return NULL;
-  }
-
-  self->history_size = 0;
-  self->binary_far_history = NULL;
-  self->far_bit_counts = NULL;
-  if (WebRtc_AllocateFarendBufferMemory(self, history_size) == 0) {
-    WebRtc_FreeBinaryDelayEstimatorFarend(self);
-    self = NULL;
-  }
-  return self;
-}
-
-int WebRtc_AllocateFarendBufferMemory(BinaryDelayEstimatorFarend* self,
-                                      int history_size) {
-  RTC_DCHECK(self);
-  // (Re-)Allocate memory for history buffers.
-  self->binary_far_history = static_cast<uint32_t*>(
-      realloc(self->binary_far_history,
-              history_size * sizeof(*self->binary_far_history)));
-  self->far_bit_counts = static_cast<int*>(
-      realloc(self->far_bit_counts,
-              history_size * sizeof(*self->far_bit_counts)));
-  if ((self->binary_far_history == NULL) || (self->far_bit_counts == NULL)) {
-    history_size = 0;
-  }
-  // Fill with zeros if we have expanded the buffers.
-  if (history_size > self->history_size) {
-    int size_diff = history_size - self->history_size;
-    memset(&self->binary_far_history[self->history_size],
-           0,
-           sizeof(*self->binary_far_history) * size_diff);
-    memset(&self->far_bit_counts[self->history_size],
-           0,
-           sizeof(*self->far_bit_counts) * size_diff);
-  }
-  self->history_size = history_size;
-
-  return self->history_size;
-}
-
-void WebRtc_InitBinaryDelayEstimatorFarend(BinaryDelayEstimatorFarend* self) {
-  RTC_DCHECK(self);
-  memset(self->binary_far_history, 0, sizeof(uint32_t) * self->history_size);
-  memset(self->far_bit_counts, 0, sizeof(int) * self->history_size);
-}
-
-void WebRtc_SoftResetBinaryDelayEstimatorFarend(
-    BinaryDelayEstimatorFarend* self, int delay_shift) {
-  int abs_shift = abs(delay_shift);
-  int shift_size = 0;
-  int dest_index = 0;
-  int src_index = 0;
-  int padding_index = 0;
-
-  RTC_DCHECK(self);
-  shift_size = self->history_size - abs_shift;
-  RTC_DCHECK_GT(shift_size, 0);
-  if (delay_shift == 0) {
-    return;
-  } else if (delay_shift > 0) {
-    dest_index = abs_shift;
-  } else if (delay_shift < 0) {
-    src_index = abs_shift;
-    padding_index = shift_size;
-  }
-
-  // Shift and zero pad buffers.
-  memmove(&self->binary_far_history[dest_index],
-          &self->binary_far_history[src_index],
-          sizeof(*self->binary_far_history) * shift_size);
-  memset(&self->binary_far_history[padding_index], 0,
-         sizeof(*self->binary_far_history) * abs_shift);
-  memmove(&self->far_bit_counts[dest_index],
-          &self->far_bit_counts[src_index],
-          sizeof(*self->far_bit_counts) * shift_size);
-  memset(&self->far_bit_counts[padding_index], 0,
-         sizeof(*self->far_bit_counts) * abs_shift);
-}
-
-void WebRtc_AddBinaryFarSpectrum(BinaryDelayEstimatorFarend* handle,
-                                 uint32_t binary_far_spectrum) {
-  RTC_DCHECK(handle);
-  // Shift binary spectrum history and insert current |binary_far_spectrum|.
-  memmove(&(handle->binary_far_history[1]), &(handle->binary_far_history[0]),
-          (handle->history_size - 1) * sizeof(uint32_t));
-  handle->binary_far_history[0] = binary_far_spectrum;
-
-  // Shift history of far-end binary spectrum bit counts and insert bit count
-  // of current |binary_far_spectrum|.
-  memmove(&(handle->far_bit_counts[1]), &(handle->far_bit_counts[0]),
-          (handle->history_size - 1) * sizeof(int));
-  handle->far_bit_counts[0] = BitCount(binary_far_spectrum);
-}
-
-void WebRtc_FreeBinaryDelayEstimator(BinaryDelayEstimator* self) {
-
-  if (self == NULL) {
-    return;
-  }
-
-  free(self->mean_bit_counts);
-  self->mean_bit_counts = NULL;
-
-  free(self->bit_counts);
-  self->bit_counts = NULL;
-
-  free(self->binary_near_history);
-  self->binary_near_history = NULL;
-
-  free(self->histogram);
-  self->histogram = NULL;
-
-  // BinaryDelayEstimator does not have ownership of |farend|, hence we do not
-  // free the memory here. That should be handled separately by the user.
-  self->farend = NULL;
-
-  free(self);
-}
-
-BinaryDelayEstimator* WebRtc_CreateBinaryDelayEstimator(
-    BinaryDelayEstimatorFarend* farend, int max_lookahead) {
-  BinaryDelayEstimator* self = NULL;
-
-  if ((farend != NULL) && (max_lookahead >= 0)) {
-    // Sanity conditions fulfilled.
-    self = static_cast<BinaryDelayEstimator*>(
-        malloc(sizeof(BinaryDelayEstimator)));
-  }
-  if (self == NULL) {
-    return NULL;
-  }
-
-  self->farend = farend;
-  self->near_history_size = max_lookahead + 1;
-  self->history_size = 0;
-  self->robust_validation_enabled = 0;  // Disabled by default.
-  self->allowed_offset = 0;
-
-  self->lookahead = max_lookahead;
-
-  // Allocate memory for spectrum and history buffers.
-  self->mean_bit_counts = NULL;
-  self->bit_counts = NULL;
-  self->histogram = NULL;
-  self->binary_near_history = static_cast<uint32_t*>(
-      malloc((max_lookahead + 1) * sizeof(*self->binary_near_history)));
-  if (self->binary_near_history == NULL ||
-      WebRtc_AllocateHistoryBufferMemory(self, farend->history_size) == 0) {
-    WebRtc_FreeBinaryDelayEstimator(self);
-    self = NULL;
-  }
-
-  return self;
-}
-
-int WebRtc_AllocateHistoryBufferMemory(BinaryDelayEstimator* self,
-                                       int history_size) {
-  BinaryDelayEstimatorFarend* far = self->farend;
-  // (Re-)Allocate memory for spectrum and history buffers.
-  if (history_size != far->history_size) {
-    // Only update far-end buffers if we need.
-    history_size = WebRtc_AllocateFarendBufferMemory(far, history_size);
-  }
-  // The extra array element in |mean_bit_counts| and |histogram| is a dummy
-  // element only used while |last_delay| == -2, i.e., before we have a valid
-  // estimate.
-  self->mean_bit_counts = static_cast<int32_t*>(
-      realloc(self->mean_bit_counts,
-              (history_size + 1) * sizeof(*self->mean_bit_counts)));
-  self->bit_counts = static_cast<int32_t*>(
-      realloc(self->bit_counts, history_size * sizeof(*self->bit_counts)));
-  self->histogram = static_cast<float*>(
-      realloc(self->histogram, (history_size + 1) * sizeof(*self->histogram)));
-
-  if ((self->mean_bit_counts == NULL) ||
-      (self->bit_counts == NULL) ||
-      (self->histogram == NULL)) {
-    history_size = 0;
-  }
-  // Fill with zeros if we have expanded the buffers.
-  if (history_size > self->history_size) {
-    int size_diff = history_size - self->history_size;
-    memset(&self->mean_bit_counts[self->history_size],
-           0,
-           sizeof(*self->mean_bit_counts) * size_diff);
-    memset(&self->bit_counts[self->history_size],
-           0,
-           sizeof(*self->bit_counts) * size_diff);
-    memset(&self->histogram[self->history_size],
-           0,
-           sizeof(*self->histogram) * size_diff);
-  }
-  self->history_size = history_size;
-
-  return self->history_size;
-}
-
-void WebRtc_InitBinaryDelayEstimator(BinaryDelayEstimator* self) {
-  int i = 0;
-  RTC_DCHECK(self);
-
-  memset(self->bit_counts, 0, sizeof(int32_t) * self->history_size);
-  memset(self->binary_near_history,
-         0,
-         sizeof(uint32_t) * self->near_history_size);
-  for (i = 0; i <= self->history_size; ++i) {
-    self->mean_bit_counts[i] = (20 << 9);  // 20 in Q9.
-    self->histogram[i] = 0.f;
-  }
-  self->minimum_probability = kMaxBitCountsQ9;  // 32 in Q9.
-  self->last_delay_probability = (int) kMaxBitCountsQ9;  // 32 in Q9.
-
-  // Default return value if we're unable to estimate. -1 is used for errors.
-  self->last_delay = -2;
-
-  self->last_candidate_delay = -2;
-  self->compare_delay = self->history_size;
-  self->candidate_hits = 0;
-  self->last_delay_histogram = 0.f;
-}
-
-int WebRtc_SoftResetBinaryDelayEstimator(BinaryDelayEstimator* self,
-                                         int delay_shift) {
-  int lookahead = 0;
-  RTC_DCHECK(self);
-  lookahead = self->lookahead;
-  self->lookahead -= delay_shift;
-  if (self->lookahead < 0) {
-    self->lookahead = 0;
-  }
-  if (self->lookahead > self->near_history_size - 1) {
-    self->lookahead = self->near_history_size - 1;
-  }
-  return lookahead - self->lookahead;
-}
-
-int WebRtc_ProcessBinarySpectrum(BinaryDelayEstimator* self,
-                                 uint32_t binary_near_spectrum) {
-  int i = 0;
-  int candidate_delay = -1;
-  int valid_candidate = 0;
-
-  int32_t value_best_candidate = kMaxBitCountsQ9;
-  int32_t value_worst_candidate = 0;
-  int32_t valley_depth = 0;
-
-  RTC_DCHECK(self);
-  if (self->farend->history_size != self->history_size) {
-    // Non matching history sizes.
-    return -1;
-  }
-  if (self->near_history_size > 1) {
-    // If we apply lookahead, shift near-end binary spectrum history. Insert
-    // current |binary_near_spectrum| and pull out the delayed one.
-    memmove(&(self->binary_near_history[1]), &(self->binary_near_history[0]),
-            (self->near_history_size - 1) * sizeof(uint32_t));
-    self->binary_near_history[0] = binary_near_spectrum;
-    binary_near_spectrum = self->binary_near_history[self->lookahead];
-  }
-
-  // Compare with delayed spectra and store the |bit_counts| for each delay.
-  BitCountComparison(binary_near_spectrum, self->farend->binary_far_history,
-                     self->history_size, self->bit_counts);
-
-  // Update |mean_bit_counts|, which is the smoothed version of |bit_counts|.
-  for (i = 0; i < self->history_size; i++) {
-    // |bit_counts| is constrained to [0, 32], meaning we can smooth with a
-    // factor up to 2^26. We use Q9.
-    int32_t bit_count = (self->bit_counts[i] << 9);  // Q9.
-
-    // Update |mean_bit_counts| only when far-end signal has something to
-    // contribute. If |far_bit_counts| is zero the far-end signal is weak and
-    // we likely have a poor echo condition, hence don't update.
-    if (self->farend->far_bit_counts[i] > 0) {
-      // Make number of right shifts piecewise linear w.r.t. |far_bit_counts|.
-      int shifts = kShiftsAtZero;
-      shifts -= (kShiftsLinearSlope * self->farend->far_bit_counts[i]) >> 4;
-      WebRtc_MeanEstimatorFix(bit_count, shifts, &(self->mean_bit_counts[i]));
-    }
-  }
-
-  // Find |candidate_delay|, |value_best_candidate| and |value_worst_candidate|
-  // of |mean_bit_counts|.
-  for (i = 0; i < self->history_size; i++) {
-    if (self->mean_bit_counts[i] < value_best_candidate) {
-      value_best_candidate = self->mean_bit_counts[i];
-      candidate_delay = i;
-    }
-    if (self->mean_bit_counts[i] > value_worst_candidate) {
-      value_worst_candidate = self->mean_bit_counts[i];
-    }
-  }
-  valley_depth = value_worst_candidate - value_best_candidate;
-
-  // The |value_best_candidate| is a good indicator on the probability of
-  // |candidate_delay| being an accurate delay (a small |value_best_candidate|
-  // means a good binary match). In the following sections we make a decision
-  // whether to update |last_delay| or not.
-  // 1) If the difference bit counts between the best and the worst delay
-  //    candidates is too small we consider the situation to be unreliable and
-  //    don't update |last_delay|.
-  // 2) If the situation is reliable we update |last_delay| if the value of the
-  //    best candidate delay has a value less than
-  //     i) an adaptive threshold |minimum_probability|, or
-  //    ii) this corresponding value |last_delay_probability|, but updated at
-  //        this time instant.
-
-  // Update |minimum_probability|.
-  if ((self->minimum_probability > kProbabilityLowerLimit) &&
-      (valley_depth > kProbabilityMinSpread)) {
-    // The "hard" threshold can't be lower than 17 (in Q9).
-    // The valley in the curve also has to be distinct, i.e., the
-    // difference between |value_worst_candidate| and |value_best_candidate| has
-    // to be large enough.
-    int32_t threshold = value_best_candidate + kProbabilityOffset;
-    if (threshold < kProbabilityLowerLimit) {
-      threshold = kProbabilityLowerLimit;
-    }
-    if (self->minimum_probability > threshold) {
-      self->minimum_probability = threshold;
-    }
-  }
-  // Update |last_delay_probability|.
-  // We use a Markov type model, i.e., a slowly increasing level over time.
-  self->last_delay_probability++;
-  // Validate |candidate_delay|.  We have a reliable instantaneous delay
-  // estimate if
-  //  1) The valley is distinct enough (|valley_depth| > |kProbabilityOffset|)
-  // and
-  //  2) The depth of the valley is deep enough
-  //      (|value_best_candidate| < |minimum_probability|)
-  //     and deeper than the best estimate so far
-  //      (|value_best_candidate| < |last_delay_probability|)
-  valid_candidate = ((valley_depth > kProbabilityOffset) &&
-      ((value_best_candidate < self->minimum_probability) ||
-          (value_best_candidate < self->last_delay_probability)));
-
-  // Check for nonstationary farend signal.
-  const bool non_stationary_farend =
-      std::any_of(self->farend->far_bit_counts,
-                  self->farend->far_bit_counts + self->history_size,
-                  [](int a) { return a > 0; });
-
-  if (non_stationary_farend) {
-    // Only update the validation statistics when the farend is nonstationary
-    // as the underlying estimates are otherwise frozen.
-    UpdateRobustValidationStatistics(self, candidate_delay, valley_depth,
-                                     value_best_candidate);
-  }
-
-  if (self->robust_validation_enabled) {
-    int is_histogram_valid = HistogramBasedValidation(self, candidate_delay);
-    valid_candidate = RobustValidation(self, candidate_delay, valid_candidate,
-                                       is_histogram_valid);
-
-  }
-
-  // Only update the delay estimate when the farend is nonstationary and when
-  // a valid delay candidate is available.
-  if (non_stationary_farend && valid_candidate) {
-    if (candidate_delay != self->last_delay) {
-      self->last_delay_histogram =
-          (self->histogram[candidate_delay] > kLastHistogramMax ?
-              kLastHistogramMax : self->histogram[candidate_delay]);
-      // Adjust the histogram if we made a change to |last_delay|, though it was
-      // not the most likely one according to the histogram.
-      if (self->histogram[candidate_delay] <
-          self->histogram[self->compare_delay]) {
-        self->histogram[self->compare_delay] = self->histogram[candidate_delay];
-      }
-    }
-    self->last_delay = candidate_delay;
-    if (value_best_candidate < self->last_delay_probability) {
-      self->last_delay_probability = value_best_candidate;
-    }
-    self->compare_delay = self->last_delay;
-  }
-
-  return self->last_delay;
-}
-
-int WebRtc_binary_last_delay(BinaryDelayEstimator* self) {
-  RTC_DCHECK(self);
-  return self->last_delay;
-}
-
-float WebRtc_binary_last_delay_quality(BinaryDelayEstimator* self) {
-  float quality = 0;
-  RTC_DCHECK(self);
-
-  if (self->robust_validation_enabled) {
-    // Simply a linear function of the histogram height at delay estimate.
-    quality = self->histogram[self->compare_delay] / kHistogramMax;
-  } else {
-    // Note that |last_delay_probability| states how deep the minimum of the
-    // cost function is, so it is rather an error probability.
-    quality = (float) (kMaxBitCountsQ9 - self->last_delay_probability) /
-        kMaxBitCountsQ9;
-    if (quality < 0) {
-      quality = 0;
-    }
-  }
-  return quality;
-}
-
-void WebRtc_MeanEstimatorFix(int32_t new_value,
-                             int factor,
-                             int32_t* mean_value) {
-  int32_t diff = new_value - *mean_value;
-
-  // mean_new = mean_value + ((new_value - mean_value) >> factor);
-  if (diff < 0) {
-    diff = -((-diff) >> factor);
-  } else {
-    diff = (diff >> factor);
-  }
-  *mean_value += diff;
-}
diff --git a/modules/audio_processing/utility/delay_estimator.h b/modules/audio_processing/utility/delay_estimator.h
deleted file mode 100644
index 65c3f03..0000000
--- a/modules/audio_processing/utility/delay_estimator.h
+++ /dev/null
@@ -1,251 +0,0 @@
-/*
- *  Copyright (c) 2012 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.
- */
-
-// Performs delay estimation on binary converted spectra.
-// The return value is  0 - OK and -1 - Error, unless otherwise stated.
-
-#ifndef WEBRTC_MODULES_AUDIO_PROCESSING_UTILITY_DELAY_ESTIMATOR_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_UTILITY_DELAY_ESTIMATOR_H_
-
-#include "webrtc/typedefs.h"
-
-static const int32_t kMaxBitCountsQ9 = (32 << 9);  // 32 matching bits in Q9.
-
-typedef struct {
-  // Pointer to bit counts.
-  int* far_bit_counts;
-  // Binary history variables.
-  uint32_t* binary_far_history;
-  int history_size;
-} BinaryDelayEstimatorFarend;
-
-typedef struct {
-  // Pointer to bit counts.
-  int32_t* mean_bit_counts;
-  // Array only used locally in ProcessBinarySpectrum() but whose size is
-  // determined at run-time.
-  int32_t* bit_counts;
-
-  // Binary history variables.
-  uint32_t* binary_near_history;
-  int near_history_size;
-  int history_size;
-
-  // Delay estimation variables.
-  int32_t minimum_probability;
-  int last_delay_probability;
-
-  // Delay memory.
-  int last_delay;
-
-  // Robust validation
-  int robust_validation_enabled;
-  int allowed_offset;
-  int last_candidate_delay;
-  int compare_delay;
-  int candidate_hits;
-  float* histogram;
-  float last_delay_histogram;
-
-  // For dynamically changing the lookahead when using SoftReset...().
-  int lookahead;
-
-  // Far-end binary spectrum history buffer etc.
-  BinaryDelayEstimatorFarend* farend;
-} BinaryDelayEstimator;
-
-// Releases the memory allocated by
-// WebRtc_CreateBinaryDelayEstimatorFarend(...).
-// Input:
-//    - self              : Pointer to the binary delay estimation far-end
-//                          instance which is the return value of
-//                          WebRtc_CreateBinaryDelayEstimatorFarend().
-//
-void WebRtc_FreeBinaryDelayEstimatorFarend(BinaryDelayEstimatorFarend* self);
-
-// Allocates the memory needed by the far-end part of the binary delay
-// estimation. The memory needs to be initialized separately through
-// WebRtc_InitBinaryDelayEstimatorFarend(...).
-//
-// Inputs:
-//      - history_size    : Size of the far-end binary spectrum history.
-//
-// Return value:
-//      - BinaryDelayEstimatorFarend*
-//                        : Created |handle|. If the memory can't be allocated
-//                          or if any of the input parameters are invalid NULL
-//                          is returned.
-//
-BinaryDelayEstimatorFarend* WebRtc_CreateBinaryDelayEstimatorFarend(
-    int history_size);
-
-// Re-allocates the buffers.
-//
-// Inputs:
-//      - self            : Pointer to the binary estimation far-end instance
-//                          which is the return value of
-//                          WebRtc_CreateBinaryDelayEstimatorFarend().
-//      - history_size    : Size of the far-end binary spectrum history.
-//
-// Return value:
-//      - history_size    : The history size allocated.
-int WebRtc_AllocateFarendBufferMemory(BinaryDelayEstimatorFarend* self,
-                                      int history_size);
-
-// Initializes the delay estimation far-end instance created with
-// WebRtc_CreateBinaryDelayEstimatorFarend(...).
-//
-// Input:
-//    - self              : Pointer to the delay estimation far-end instance.
-//
-// Output:
-//    - self              : Initialized far-end instance.
-//
-void WebRtc_InitBinaryDelayEstimatorFarend(BinaryDelayEstimatorFarend* self);
-
-// Soft resets the delay estimation far-end instance created with
-// WebRtc_CreateBinaryDelayEstimatorFarend(...).
-//
-// Input:
-//    - delay_shift   : The amount of blocks to shift history buffers.
-//
-void WebRtc_SoftResetBinaryDelayEstimatorFarend(
-    BinaryDelayEstimatorFarend* self, int delay_shift);
-
-// Adds the binary far-end spectrum to the internal far-end history buffer. This
-// spectrum is used as reference when calculating the delay using
-// WebRtc_ProcessBinarySpectrum().
-//
-// Inputs:
-//    - self                  : Pointer to the delay estimation far-end
-//                              instance.
-//    - binary_far_spectrum   : Far-end binary spectrum.
-//
-// Output:
-//    - self                  : Updated far-end instance.
-//
-void WebRtc_AddBinaryFarSpectrum(BinaryDelayEstimatorFarend* self,
-                                 uint32_t binary_far_spectrum);
-
-// Releases the memory allocated by WebRtc_CreateBinaryDelayEstimator(...).
-//
-// Note that BinaryDelayEstimator utilizes BinaryDelayEstimatorFarend, but does
-// not take ownership of it, hence the BinaryDelayEstimator has to be torn down
-// before the far-end.
-//
-// Input:
-//    - self              : Pointer to the binary delay estimation instance
-//                          which is the return value of
-//                          WebRtc_CreateBinaryDelayEstimator().
-//
-void WebRtc_FreeBinaryDelayEstimator(BinaryDelayEstimator* self);
-
-// Allocates the memory needed by the binary delay estimation. The memory needs
-// to be initialized separately through WebRtc_InitBinaryDelayEstimator(...).
-//
-// See WebRtc_CreateDelayEstimator(..) in delay_estimator_wrapper.c for detailed
-// description.
-BinaryDelayEstimator* WebRtc_CreateBinaryDelayEstimator(
-    BinaryDelayEstimatorFarend* farend, int max_lookahead);
-
-// Re-allocates |history_size| dependent buffers. The far-end buffers will be
-// updated at the same time if needed.
-//
-// Input:
-//      - self            : Pointer to the binary estimation instance which is
-//                          the return value of
-//                          WebRtc_CreateBinaryDelayEstimator().
-//      - history_size    : Size of the history buffers.
-//
-// Return value:
-//      - history_size    : The history size allocated.
-int WebRtc_AllocateHistoryBufferMemory(BinaryDelayEstimator* self,
-                                       int history_size);
-
-// Initializes the delay estimation instance created with
-// WebRtc_CreateBinaryDelayEstimator(...).
-//
-// Input:
-//    - self              : Pointer to the delay estimation instance.
-//
-// Output:
-//    - self              : Initialized instance.
-//
-void WebRtc_InitBinaryDelayEstimator(BinaryDelayEstimator* self);
-
-// Soft resets the delay estimation instance created with
-// WebRtc_CreateBinaryDelayEstimator(...).
-//
-// Input:
-//    - delay_shift   : The amount of blocks to shift history buffers.
-//
-// Return value:
-//    - actual_shifts : The actual number of shifts performed.
-//
-int WebRtc_SoftResetBinaryDelayEstimator(BinaryDelayEstimator* self,
-                                         int delay_shift);
-
-// Estimates and returns the delay between the binary far-end and binary near-
-// end spectra. It is assumed the binary far-end spectrum has been added using
-// WebRtc_AddBinaryFarSpectrum() prior to this call. The value will be offset by
-// the lookahead (i.e. the lookahead should be subtracted from the returned
-// value).
-//
-// Inputs:
-//    - self                  : Pointer to the delay estimation instance.
-//    - binary_near_spectrum  : Near-end binary spectrum of the current block.
-//
-// Output:
-//    - self                  : Updated instance.
-//
-// Return value:
-//    - delay                 :  >= 0 - Calculated delay value.
-//                              -2    - Insufficient data for estimation.
-//
-int WebRtc_ProcessBinarySpectrum(BinaryDelayEstimator* self,
-                                 uint32_t binary_near_spectrum);
-
-// Returns the last calculated delay updated by the function
-// WebRtc_ProcessBinarySpectrum(...).
-//
-// Input:
-//    - self                  : Pointer to the delay estimation instance.
-//
-// Return value:
-//    - delay                 :  >= 0 - Last calculated delay value
-//                              -2    - Insufficient data for estimation.
-//
-int WebRtc_binary_last_delay(BinaryDelayEstimator* self);
-
-// Returns the estimation quality of the last calculated delay updated by the
-// function WebRtc_ProcessBinarySpectrum(...). The estimation quality is a value
-// in the interval [0, 1].  The higher the value, the better the quality.
-//
-// Return value:
-//    - delay_quality         :  >= 0 - Estimation quality of last calculated
-//                                      delay value.
-float WebRtc_binary_last_delay_quality(BinaryDelayEstimator* self);
-
-// Updates the |mean_value| recursively with a step size of 2^-|factor|. This
-// function is used internally in the Binary Delay Estimator as well as the
-// Fixed point wrapper.
-//
-// Inputs:
-//    - new_value             : The new value the mean should be updated with.
-//    - factor                : The step size, in number of right shifts.
-//
-// Input/Output:
-//    - mean_value            : Pointer to the mean value.
-//
-void WebRtc_MeanEstimatorFix(int32_t new_value,
-                             int factor,
-                             int32_t* mean_value);
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_UTILITY_DELAY_ESTIMATOR_H_
diff --git a/modules/audio_processing/utility/delay_estimator_internal.h b/modules/audio_processing/utility/delay_estimator_internal.h
deleted file mode 100644
index fd11028..0000000
--- a/modules/audio_processing/utility/delay_estimator_internal.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- *  Copyright (c) 2012 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.
- */
-
-// Header file including the delay estimator handle used for testing.
-
-#ifndef WEBRTC_MODULES_AUDIO_PROCESSING_UTILITY_DELAY_ESTIMATOR_INTERNAL_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_UTILITY_DELAY_ESTIMATOR_INTERNAL_H_
-
-#include "webrtc/modules/audio_processing/utility/delay_estimator.h"
-#include "webrtc/typedefs.h"
-
-typedef union {
-  float float_;
-  int32_t int32_;
-} SpectrumType;
-
-typedef struct {
-  // Pointers to mean values of spectrum.
-  SpectrumType* mean_far_spectrum;
-  // |mean_far_spectrum| initialization indicator.
-  int far_spectrum_initialized;
-
-  int spectrum_size;
-
-  // Far-end part of binary spectrum based delay estimation.
-  BinaryDelayEstimatorFarend* binary_farend;
-} DelayEstimatorFarend;
-
-typedef struct {
-  // Pointers to mean values of spectrum.
-  SpectrumType* mean_near_spectrum;
-  // |mean_near_spectrum| initialization indicator.
-  int near_spectrum_initialized;
-
-  int spectrum_size;
-
-  // Binary spectrum based delay estimator
-  BinaryDelayEstimator* binary_handle;
-} DelayEstimator;
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_UTILITY_DELAY_ESTIMATOR_INTERNAL_H_
diff --git a/modules/audio_processing/utility/delay_estimator_unittest.cc b/modules/audio_processing/utility/delay_estimator_unittest.cc
deleted file mode 100644
index f054b9c..0000000
--- a/modules/audio_processing/utility/delay_estimator_unittest.cc
+++ /dev/null
@@ -1,618 +0,0 @@
-/*
- *  Copyright (c) 2012 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_processing/utility/delay_estimator.h"
-#include "webrtc/modules/audio_processing/utility/delay_estimator_internal.h"
-#include "webrtc/modules/audio_processing/utility/delay_estimator_wrapper.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/typedefs.h"
-
-namespace {
-
-enum { kSpectrumSize = 65 };
-// Delay history sizes.
-enum { kMaxDelay = 100 };
-enum { kLookahead = 10 };
-enum { kHistorySize = kMaxDelay + kLookahead };
-// Length of binary spectrum sequence.
-enum { kSequenceLength = 400 };
-
-const int kDifferentHistorySize = 3;
-const int kDifferentLookahead = 1;
-
-const int kEnable[] = { 0, 1 };
-const size_t kSizeEnable = sizeof(kEnable) / sizeof(*kEnable);
-
-class DelayEstimatorTest : public ::testing::Test {
- protected:
-  DelayEstimatorTest();
-  virtual void SetUp();
-  virtual void TearDown();
-
-  void Init();
-  void InitBinary();
-  void VerifyDelay(BinaryDelayEstimator* binary_handle, int offset, int delay);
-  void RunBinarySpectra(BinaryDelayEstimator* binary1,
-                        BinaryDelayEstimator* binary2,
-                        int near_offset, int lookahead_offset, int far_offset);
-  void RunBinarySpectraTest(int near_offset, int lookahead_offset,
-                            int ref_robust_validation, int robust_validation);
-
-  void* handle_;
-  DelayEstimator* self_;
-  void* farend_handle_;
-  DelayEstimatorFarend* farend_self_;
-  BinaryDelayEstimator* binary_;
-  BinaryDelayEstimatorFarend* binary_farend_;
-  int spectrum_size_;
-  // Dummy input spectra.
-  float far_f_[kSpectrumSize];
-  float near_f_[kSpectrumSize];
-  uint16_t far_u16_[kSpectrumSize];
-  uint16_t near_u16_[kSpectrumSize];
-  uint32_t binary_spectrum_[kSequenceLength + kHistorySize];
-};
-
-DelayEstimatorTest::DelayEstimatorTest()
-    : handle_(NULL),
-      self_(NULL),
-      farend_handle_(NULL),
-      farend_self_(NULL),
-      binary_(NULL),
-      binary_farend_(NULL),
-      spectrum_size_(kSpectrumSize) {
-  // Dummy input data are set with more or less arbitrary non-zero values.
-  memset(far_f_, 1, sizeof(far_f_));
-  memset(near_f_, 2, sizeof(near_f_));
-  memset(far_u16_, 1, sizeof(far_u16_));
-  memset(near_u16_, 2, sizeof(near_u16_));
-  // Construct a sequence of binary spectra used to verify delay estimate. The
-  // |kSequenceLength| has to be long enough for the delay estimation to leave
-  // the initialized state.
-  binary_spectrum_[0] = 1;
-  for (int i = 1; i < (kSequenceLength + kHistorySize); i++) {
-    binary_spectrum_[i] = 3 * binary_spectrum_[i - 1];
-  }
-}
-
-void DelayEstimatorTest::SetUp() {
-  farend_handle_ = WebRtc_CreateDelayEstimatorFarend(kSpectrumSize,
-                                                     kHistorySize);
-  ASSERT_TRUE(farend_handle_ != NULL);
-  farend_self_ = reinterpret_cast<DelayEstimatorFarend*>(farend_handle_);
-  handle_ = WebRtc_CreateDelayEstimator(farend_handle_, kLookahead);
-  ASSERT_TRUE(handle_ != NULL);
-  self_ = reinterpret_cast<DelayEstimator*>(handle_);
-  binary_farend_ = WebRtc_CreateBinaryDelayEstimatorFarend(kHistorySize);
-  ASSERT_TRUE(binary_farend_ != NULL);
-  binary_ = WebRtc_CreateBinaryDelayEstimator(binary_farend_, kLookahead);
-  ASSERT_TRUE(binary_ != NULL);
-}
-
-void DelayEstimatorTest::TearDown() {
-  WebRtc_FreeDelayEstimator(handle_);
-  handle_ = NULL;
-  self_ = NULL;
-  WebRtc_FreeDelayEstimatorFarend(farend_handle_);
-  farend_handle_ = NULL;
-  farend_self_ = NULL;
-  WebRtc_FreeBinaryDelayEstimator(binary_);
-  binary_ = NULL;
-  WebRtc_FreeBinaryDelayEstimatorFarend(binary_farend_);
-  binary_farend_ = NULL;
-}
-
-void DelayEstimatorTest::Init() {
-  // Initialize Delay Estimator
-  EXPECT_EQ(0, WebRtc_InitDelayEstimatorFarend(farend_handle_));
-  EXPECT_EQ(0, WebRtc_InitDelayEstimator(handle_));
-  // Verify initialization.
-  EXPECT_EQ(0, farend_self_->far_spectrum_initialized);
-  EXPECT_EQ(0, self_->near_spectrum_initialized);
-  EXPECT_EQ(-2, WebRtc_last_delay(handle_));  // Delay in initial state.
-  EXPECT_FLOAT_EQ(0, WebRtc_last_delay_quality(handle_));  // Zero quality.
-}
-
-void DelayEstimatorTest::InitBinary() {
-  // Initialize Binary Delay Estimator (far-end part).
-  WebRtc_InitBinaryDelayEstimatorFarend(binary_farend_);
-  // Initialize Binary Delay Estimator
-  WebRtc_InitBinaryDelayEstimator(binary_);
-  // Verify initialization. This does not guarantee a complete check, since
-  // |last_delay| may be equal to -2 before initialization if done on the fly.
-  EXPECT_EQ(-2, binary_->last_delay);
-}
-
-void DelayEstimatorTest::VerifyDelay(BinaryDelayEstimator* binary_handle,
-                                     int offset, int delay) {
-  // Verify that we WebRtc_binary_last_delay() returns correct delay.
-  EXPECT_EQ(delay, WebRtc_binary_last_delay(binary_handle));
-
-  if (delay != -2) {
-    // Verify correct delay estimate. In the non-causal case the true delay
-    // is equivalent with the |offset|.
-    EXPECT_EQ(offset, delay);
-  }
-}
-
-void DelayEstimatorTest::RunBinarySpectra(BinaryDelayEstimator* binary1,
-                                          BinaryDelayEstimator* binary2,
-                                          int near_offset,
-                                          int lookahead_offset,
-                                          int far_offset) {
-  int different_validations = binary1->robust_validation_enabled ^
-      binary2->robust_validation_enabled;
-  WebRtc_InitBinaryDelayEstimatorFarend(binary_farend_);
-  WebRtc_InitBinaryDelayEstimator(binary1);
-  WebRtc_InitBinaryDelayEstimator(binary2);
-  // Verify initialization. This does not guarantee a complete check, since
-  // |last_delay| may be equal to -2 before initialization if done on the fly.
-  EXPECT_EQ(-2, binary1->last_delay);
-  EXPECT_EQ(-2, binary2->last_delay);
-  for (int i = kLookahead; i < (kSequenceLength + kLookahead); i++) {
-    WebRtc_AddBinaryFarSpectrum(binary_farend_,
-                                binary_spectrum_[i + far_offset]);
-    int delay_1 = WebRtc_ProcessBinarySpectrum(binary1, binary_spectrum_[i]);
-    int delay_2 =
-        WebRtc_ProcessBinarySpectrum(binary2,
-                                     binary_spectrum_[i - near_offset]);
-
-    VerifyDelay(binary1, far_offset + kLookahead, delay_1);
-    VerifyDelay(binary2,
-                far_offset + kLookahead + lookahead_offset + near_offset,
-                delay_2);
-    // Expect the two delay estimates to be offset by |lookahead_offset| +
-    // |near_offset| when we have left the initial state.
-    if ((delay_1 != -2) && (delay_2 != -2)) {
-      EXPECT_EQ(delay_1, delay_2 - lookahead_offset - near_offset);
-    }
-    // For the case of identical signals |delay_1| and |delay_2| should match
-    // all the time, unless one of them has robust validation turned on.  In
-    // that case the robust validation leaves the initial state faster.
-    if ((near_offset == 0) && (lookahead_offset == 0)) {
-      if  (!different_validations) {
-        EXPECT_EQ(delay_1, delay_2);
-      } else {
-        if (binary1->robust_validation_enabled) {
-          EXPECT_GE(delay_1, delay_2);
-        } else {
-          EXPECT_GE(delay_2, delay_1);
-        }
-      }
-    }
-  }
-  // Verify that we have left the initialized state.
-  EXPECT_NE(-2, WebRtc_binary_last_delay(binary1));
-  EXPECT_LT(0, WebRtc_binary_last_delay_quality(binary1));
-  EXPECT_NE(-2, WebRtc_binary_last_delay(binary2));
-  EXPECT_LT(0, WebRtc_binary_last_delay_quality(binary2));
-}
-
-void DelayEstimatorTest::RunBinarySpectraTest(int near_offset,
-                                              int lookahead_offset,
-                                              int ref_robust_validation,
-                                              int robust_validation) {
-  BinaryDelayEstimator* binary2 =
-      WebRtc_CreateBinaryDelayEstimator(binary_farend_,
-                                        kLookahead + lookahead_offset);
-  // Verify the delay for both causal and non-causal systems. For causal systems
-  // the delay is equivalent with a positive |offset| of the far-end sequence.
-  // For non-causal systems the delay is equivalent with a negative |offset| of
-  // the far-end sequence.
-  binary_->robust_validation_enabled = ref_robust_validation;
-  binary2->robust_validation_enabled = robust_validation;
-  for (int offset = -kLookahead;
-      offset < kMaxDelay - lookahead_offset - near_offset;
-      offset++) {
-    RunBinarySpectra(binary_, binary2, near_offset, lookahead_offset, offset);
-  }
-  WebRtc_FreeBinaryDelayEstimator(binary2);
-  binary2 = NULL;
-  binary_->robust_validation_enabled = 0;  // Reset reference.
-}
-
-TEST_F(DelayEstimatorTest, CorrectErrorReturnsOfWrapper) {
-  // In this test we verify correct error returns on invalid API calls.
-
-  // WebRtc_CreateDelayEstimatorFarend() and WebRtc_CreateDelayEstimator()
-  // should return a NULL pointer on invalid input values.
-  // Make sure we have a non-NULL value at start, so we can detect NULL after
-  // create failure.
-  void* handle = farend_handle_;
-  handle = WebRtc_CreateDelayEstimatorFarend(33, kHistorySize);
-  EXPECT_TRUE(handle == NULL);
-  handle = WebRtc_CreateDelayEstimatorFarend(kSpectrumSize, 1);
-  EXPECT_TRUE(handle == NULL);
-
-  handle = handle_;
-  handle = WebRtc_CreateDelayEstimator(NULL, kLookahead);
-  EXPECT_TRUE(handle == NULL);
-  handle = WebRtc_CreateDelayEstimator(farend_handle_, -1);
-  EXPECT_TRUE(handle == NULL);
-
-  // WebRtc_InitDelayEstimatorFarend() and WebRtc_InitDelayEstimator() should
-  // return -1 if we have a NULL pointer as |handle|.
-  EXPECT_EQ(-1, WebRtc_InitDelayEstimatorFarend(NULL));
-  EXPECT_EQ(-1, WebRtc_InitDelayEstimator(NULL));
-
-  // WebRtc_AddFarSpectrumFloat() should return -1 if we have:
-  // 1) NULL pointer as |handle|.
-  // 2) NULL pointer as far-end spectrum.
-  // 3) Incorrect spectrum size.
-  EXPECT_EQ(-1, WebRtc_AddFarSpectrumFloat(NULL, far_f_, spectrum_size_));
-  // Use |farend_handle_| which is properly created at SetUp().
-  EXPECT_EQ(-1, WebRtc_AddFarSpectrumFloat(farend_handle_, NULL,
-                                           spectrum_size_));
-  EXPECT_EQ(-1, WebRtc_AddFarSpectrumFloat(farend_handle_, far_f_,
-                                           spectrum_size_ + 1));
-
-  // WebRtc_AddFarSpectrumFix() should return -1 if we have:
-  // 1) NULL pointer as |handle|.
-  // 2) NULL pointer as far-end spectrum.
-  // 3) Incorrect spectrum size.
-  // 4) Too high precision in far-end spectrum (Q-domain > 15).
-  EXPECT_EQ(-1, WebRtc_AddFarSpectrumFix(NULL, far_u16_, spectrum_size_, 0));
-  EXPECT_EQ(-1, WebRtc_AddFarSpectrumFix(farend_handle_, NULL, spectrum_size_,
-                                         0));
-  EXPECT_EQ(-1, WebRtc_AddFarSpectrumFix(farend_handle_, far_u16_,
-                                         spectrum_size_ + 1, 0));
-  EXPECT_EQ(-1, WebRtc_AddFarSpectrumFix(farend_handle_, far_u16_,
-                                         spectrum_size_, 16));
-
-  // WebRtc_set_history_size() should return -1 if:
-  // 1) |handle| is a NULL.
-  // 2) |history_size| <= 1.
-  EXPECT_EQ(-1, WebRtc_set_history_size(NULL, 1));
-  EXPECT_EQ(-1, WebRtc_set_history_size(handle_, 1));
-  // WebRtc_history_size() should return -1 if:
-  // 1) NULL pointer input.
-  EXPECT_EQ(-1, WebRtc_history_size(NULL));
-  // 2) there is a mismatch between history size.
-  void* tmp_handle = WebRtc_CreateDelayEstimator(farend_handle_, kHistorySize);
-  EXPECT_EQ(0, WebRtc_InitDelayEstimator(tmp_handle));
-  EXPECT_EQ(kDifferentHistorySize,
-            WebRtc_set_history_size(tmp_handle, kDifferentHistorySize));
-  EXPECT_EQ(kDifferentHistorySize, WebRtc_history_size(tmp_handle));
-  EXPECT_EQ(kHistorySize, WebRtc_set_history_size(handle_, kHistorySize));
-  EXPECT_EQ(-1, WebRtc_history_size(tmp_handle));
-
-  // WebRtc_set_lookahead() should return -1 if we try a value outside the
-  /// buffer.
-  EXPECT_EQ(-1, WebRtc_set_lookahead(handle_, kLookahead + 1));
-  EXPECT_EQ(-1, WebRtc_set_lookahead(handle_, -1));
-
-  // WebRtc_set_allowed_offset() should return -1 if we have:
-  // 1) NULL pointer as |handle|.
-  // 2) |allowed_offset| < 0.
-  EXPECT_EQ(-1, WebRtc_set_allowed_offset(NULL, 0));
-  EXPECT_EQ(-1, WebRtc_set_allowed_offset(handle_, -1));
-
-  EXPECT_EQ(-1, WebRtc_get_allowed_offset(NULL));
-
-  // WebRtc_enable_robust_validation() should return -1 if we have:
-  // 1) NULL pointer as |handle|.
-  // 2) Incorrect |enable| value (not 0 or 1).
-  EXPECT_EQ(-1, WebRtc_enable_robust_validation(NULL, kEnable[0]));
-  EXPECT_EQ(-1, WebRtc_enable_robust_validation(handle_, -1));
-  EXPECT_EQ(-1, WebRtc_enable_robust_validation(handle_, 2));
-
-  // WebRtc_is_robust_validation_enabled() should return -1 if we have NULL
-  // pointer as |handle|.
-  EXPECT_EQ(-1, WebRtc_is_robust_validation_enabled(NULL));
-
-  // WebRtc_DelayEstimatorProcessFloat() should return -1 if we have:
-  // 1) NULL pointer as |handle|.
-  // 2) NULL pointer as near-end spectrum.
-  // 3) Incorrect spectrum size.
-  // 4) Non matching history sizes if multiple delay estimators using the same
-  //    far-end reference.
-  EXPECT_EQ(-1, WebRtc_DelayEstimatorProcessFloat(NULL, near_f_,
-                                                  spectrum_size_));
-  // Use |handle_| which is properly created at SetUp().
-  EXPECT_EQ(-1, WebRtc_DelayEstimatorProcessFloat(handle_, NULL,
-                                                  spectrum_size_));
-  EXPECT_EQ(-1, WebRtc_DelayEstimatorProcessFloat(handle_, near_f_,
-                                                  spectrum_size_ + 1));
-  // |tmp_handle| is already in a non-matching state.
-  EXPECT_EQ(-1, WebRtc_DelayEstimatorProcessFloat(tmp_handle,
-                                                  near_f_,
-                                                  spectrum_size_));
-
-  // WebRtc_DelayEstimatorProcessFix() should return -1 if we have:
-  // 1) NULL pointer as |handle|.
-  // 2) NULL pointer as near-end spectrum.
-  // 3) Incorrect spectrum size.
-  // 4) Too high precision in near-end spectrum (Q-domain > 15).
-  // 5) Non matching history sizes if multiple delay estimators using the same
-  //    far-end reference.
-  EXPECT_EQ(-1, WebRtc_DelayEstimatorProcessFix(NULL, near_u16_, spectrum_size_,
-                                                0));
-  EXPECT_EQ(-1, WebRtc_DelayEstimatorProcessFix(handle_, NULL, spectrum_size_,
-                                                0));
-  EXPECT_EQ(-1, WebRtc_DelayEstimatorProcessFix(handle_, near_u16_,
-                                                spectrum_size_ + 1, 0));
-  EXPECT_EQ(-1, WebRtc_DelayEstimatorProcessFix(handle_, near_u16_,
-                                                spectrum_size_, 16));
-  // |tmp_handle| is already in a non-matching state.
-  EXPECT_EQ(-1, WebRtc_DelayEstimatorProcessFix(tmp_handle,
-                                                near_u16_,
-                                                spectrum_size_,
-                                                0));
-  WebRtc_FreeDelayEstimator(tmp_handle);
-
-  // WebRtc_last_delay() should return -1 if we have a NULL pointer as |handle|.
-  EXPECT_EQ(-1, WebRtc_last_delay(NULL));
-
-  // Free any local memory if needed.
-  WebRtc_FreeDelayEstimator(handle);
-}
-
-TEST_F(DelayEstimatorTest, VerifyAllowedOffset) {
-  // Is set to zero by default.
-  EXPECT_EQ(0, WebRtc_get_allowed_offset(handle_));
-  for (int i = 1; i >= 0; i--) {
-    EXPECT_EQ(0, WebRtc_set_allowed_offset(handle_, i));
-    EXPECT_EQ(i, WebRtc_get_allowed_offset(handle_));
-    Init();
-    // Unaffected over a reset.
-    EXPECT_EQ(i, WebRtc_get_allowed_offset(handle_));
-  }
-}
-
-TEST_F(DelayEstimatorTest, VerifyEnableRobustValidation) {
-  // Disabled by default.
-  EXPECT_EQ(0, WebRtc_is_robust_validation_enabled(handle_));
-  for (size_t i = 0; i < kSizeEnable; ++i) {
-    EXPECT_EQ(0, WebRtc_enable_robust_validation(handle_, kEnable[i]));
-    EXPECT_EQ(kEnable[i], WebRtc_is_robust_validation_enabled(handle_));
-    Init();
-    // Unaffected over a reset.
-    EXPECT_EQ(kEnable[i], WebRtc_is_robust_validation_enabled(handle_));
-  }
-}
-
-TEST_F(DelayEstimatorTest, InitializedSpectrumAfterProcess) {
-  // In this test we verify that the mean spectra are initialized after first
-  // time we call WebRtc_AddFarSpectrum() and Process() respectively. The test
-  // also verifies the state is not left for zero spectra.
-  const float kZerosFloat[kSpectrumSize] = { 0.0 };
-  const uint16_t kZerosU16[kSpectrumSize] = { 0 };
-
-  // For floating point operations, process one frame and verify initialization
-  // flag.
-  Init();
-  EXPECT_EQ(0, WebRtc_AddFarSpectrumFloat(farend_handle_, kZerosFloat,
-                                          spectrum_size_));
-  EXPECT_EQ(0, farend_self_->far_spectrum_initialized);
-  EXPECT_EQ(0, WebRtc_AddFarSpectrumFloat(farend_handle_, far_f_,
-                                           spectrum_size_));
-  EXPECT_EQ(1, farend_self_->far_spectrum_initialized);
-  EXPECT_EQ(-2, WebRtc_DelayEstimatorProcessFloat(handle_, kZerosFloat,
-                                                  spectrum_size_));
-  EXPECT_EQ(0, self_->near_spectrum_initialized);
-  EXPECT_EQ(-2, WebRtc_DelayEstimatorProcessFloat(handle_, near_f_,
-                                                  spectrum_size_));
-  EXPECT_EQ(1, self_->near_spectrum_initialized);
-
-  // For fixed point operations, process one frame and verify initialization
-  // flag.
-  Init();
-  EXPECT_EQ(0, WebRtc_AddFarSpectrumFix(farend_handle_, kZerosU16,
-                                        spectrum_size_, 0));
-  EXPECT_EQ(0, farend_self_->far_spectrum_initialized);
-  EXPECT_EQ(0, WebRtc_AddFarSpectrumFix(farend_handle_, far_u16_,
-                                         spectrum_size_, 0));
-  EXPECT_EQ(1, farend_self_->far_spectrum_initialized);
-  EXPECT_EQ(-2, WebRtc_DelayEstimatorProcessFix(handle_, kZerosU16,
-                                                spectrum_size_, 0));
-  EXPECT_EQ(0, self_->near_spectrum_initialized);
-  EXPECT_EQ(-2, WebRtc_DelayEstimatorProcessFix(handle_, near_u16_,
-                                                spectrum_size_, 0));
-  EXPECT_EQ(1, self_->near_spectrum_initialized);
-}
-
-TEST_F(DelayEstimatorTest, CorrectLastDelay) {
-  // In this test we verify that we get the correct last delay upon valid call.
-  // We simply process the same data until we leave the initialized state
-  // (|last_delay| = -2). Then we compare the Process() output with the
-  // last_delay() call.
-
-  // TODO(bjornv): Update quality values for robust validation.
-  int last_delay = 0;
-  // Floating point operations.
-  Init();
-  for (int i = 0; i < 200; i++) {
-    EXPECT_EQ(0, WebRtc_AddFarSpectrumFloat(farend_handle_, far_f_,
-                                            spectrum_size_));
-    last_delay = WebRtc_DelayEstimatorProcessFloat(handle_, near_f_,
-                                                   spectrum_size_);
-    if (last_delay != -2) {
-      EXPECT_EQ(last_delay, WebRtc_last_delay(handle_));
-      if (!WebRtc_is_robust_validation_enabled(handle_)) {
-        EXPECT_FLOAT_EQ(7203.f / kMaxBitCountsQ9,
-                        WebRtc_last_delay_quality(handle_));
-      }
-      break;
-    }
-  }
-  // Verify that we have left the initialized state.
-  EXPECT_NE(-2, WebRtc_last_delay(handle_));
-  EXPECT_LT(0, WebRtc_last_delay_quality(handle_));
-
-  // Fixed point operations.
-  Init();
-  for (int i = 0; i < 200; i++) {
-    EXPECT_EQ(0, WebRtc_AddFarSpectrumFix(farend_handle_, far_u16_,
-                                          spectrum_size_, 0));
-    last_delay = WebRtc_DelayEstimatorProcessFix(handle_, near_u16_,
-                                                 spectrum_size_, 0);
-    if (last_delay != -2) {
-      EXPECT_EQ(last_delay, WebRtc_last_delay(handle_));
-      if (!WebRtc_is_robust_validation_enabled(handle_)) {
-        EXPECT_FLOAT_EQ(7203.f / kMaxBitCountsQ9,
-                        WebRtc_last_delay_quality(handle_));
-      }
-      break;
-    }
-  }
-  // Verify that we have left the initialized state.
-  EXPECT_NE(-2, WebRtc_last_delay(handle_));
-  EXPECT_LT(0, WebRtc_last_delay_quality(handle_));
-}
-
-TEST_F(DelayEstimatorTest, CorrectErrorReturnsOfBinaryEstimatorFarend) {
-  // In this test we verify correct output on invalid API calls to the Binary
-  // Delay Estimator (far-end part).
-
-  BinaryDelayEstimatorFarend* binary = binary_farend_;
-  // WebRtc_CreateBinaryDelayEstimatorFarend() should return -1 if the input
-  // history size is less than 2. This is to make sure the buffer shifting
-  // applies properly.
-  // Make sure we have a non-NULL value at start, so we can detect NULL after
-  // create failure.
-  binary = WebRtc_CreateBinaryDelayEstimatorFarend(1);
-  EXPECT_TRUE(binary == NULL);
-}
-
-TEST_F(DelayEstimatorTest, CorrectErrorReturnsOfBinaryEstimator) {
-  // In this test we verify correct output on invalid API calls to the Binary
-  // Delay Estimator.
-
-  BinaryDelayEstimator* binary_handle = binary_;
-  // WebRtc_CreateBinaryDelayEstimator() should return -1 if we have a NULL
-  // pointer as |binary_farend| or invalid input values. Upon failure, the
-  // |binary_handle| should be NULL.
-  // Make sure we have a non-NULL value at start, so we can detect NULL after
-  // create failure.
-  binary_handle = WebRtc_CreateBinaryDelayEstimator(NULL, kLookahead);
-  EXPECT_TRUE(binary_handle == NULL);
-  binary_handle = WebRtc_CreateBinaryDelayEstimator(binary_farend_, -1);
-  EXPECT_TRUE(binary_handle == NULL);
-}
-
-TEST_F(DelayEstimatorTest, MeanEstimatorFix) {
-  // In this test we verify that we update the mean value in correct direction
-  // only. With "direction" we mean increase or decrease.
-
-  int32_t mean_value = 4000;
-  int32_t mean_value_before = mean_value;
-  int32_t new_mean_value = mean_value * 2;
-
-  // Increasing |mean_value|.
-  WebRtc_MeanEstimatorFix(new_mean_value, 10, &mean_value);
-  EXPECT_LT(mean_value_before, mean_value);
-  EXPECT_GT(new_mean_value, mean_value);
-
-  // Decreasing |mean_value|.
-  new_mean_value = mean_value / 2;
-  mean_value_before = mean_value;
-  WebRtc_MeanEstimatorFix(new_mean_value, 10, &mean_value);
-  EXPECT_GT(mean_value_before, mean_value);
-  EXPECT_LT(new_mean_value, mean_value);
-}
-
-TEST_F(DelayEstimatorTest, ExactDelayEstimateMultipleNearSameSpectrum) {
-  // In this test we verify that we get the correct delay estimates if we shift
-  // the signal accordingly. We create two Binary Delay Estimators and feed them
-  // with the same signals, so they should output the same results.
-  // We verify both causal and non-causal delays.
-  // For these noise free signals, the robust validation should not have an
-  // impact, hence we turn robust validation on/off for both reference and
-  // delayed near end.
-
-  for (size_t i = 0; i < kSizeEnable; ++i) {
-    for (size_t j = 0; j < kSizeEnable; ++j) {
-      RunBinarySpectraTest(0, 0, kEnable[i], kEnable[j]);
-    }
-  }
-}
-
-TEST_F(DelayEstimatorTest, ExactDelayEstimateMultipleNearDifferentSpectrum) {
-  // In this test we use the same setup as above, but we now feed the two Binary
-  // Delay Estimators with different signals, so they should output different
-  // results.
-  // For these noise free signals, the robust validation should not have an
-  // impact, hence we turn robust validation on/off for both reference and
-  // delayed near end.
-
-  const int kNearOffset = 1;
-  for (size_t i = 0; i < kSizeEnable; ++i) {
-    for (size_t j = 0; j < kSizeEnable; ++j) {
-      RunBinarySpectraTest(kNearOffset, 0, kEnable[i], kEnable[j]);
-    }
-  }
-}
-
-TEST_F(DelayEstimatorTest, ExactDelayEstimateMultipleNearDifferentLookahead) {
-  // In this test we use the same setup as above, feeding the two Binary
-  // Delay Estimators with the same signals. The difference is that we create
-  // them with different lookahead.
-  // For these noise free signals, the robust validation should not have an
-  // impact, hence we turn robust validation on/off for both reference and
-  // delayed near end.
-
-  const int kLookaheadOffset = 1;
-  for (size_t i = 0; i < kSizeEnable; ++i) {
-    for (size_t j = 0; j < kSizeEnable; ++j) {
-      RunBinarySpectraTest(0, kLookaheadOffset, kEnable[i], kEnable[j]);
-    }
-  }
-}
-
-TEST_F(DelayEstimatorTest, AllowedOffsetNoImpactWhenRobustValidationDisabled) {
-  // The same setup as in ExactDelayEstimateMultipleNearSameSpectrum with the
-  // difference that |allowed_offset| is set for the reference binary delay
-  // estimator.
-
-  binary_->allowed_offset = 10;
-  RunBinarySpectraTest(0, 0, 0, 0);
-  binary_->allowed_offset = 0;  // Reset reference.
-}
-
-TEST_F(DelayEstimatorTest, VerifyLookaheadAtCreate) {
-  void* farend_handle = WebRtc_CreateDelayEstimatorFarend(kSpectrumSize,
-                                                          kMaxDelay);
-  ASSERT_TRUE(farend_handle != NULL);
-  void* handle = WebRtc_CreateDelayEstimator(farend_handle, kLookahead);
-  ASSERT_TRUE(handle != NULL);
-  EXPECT_EQ(kLookahead, WebRtc_lookahead(handle));
-  WebRtc_FreeDelayEstimator(handle);
-  WebRtc_FreeDelayEstimatorFarend(farend_handle);
-}
-
-TEST_F(DelayEstimatorTest, VerifyLookaheadIsSetAndKeptAfterInit) {
-  EXPECT_EQ(kLookahead, WebRtc_lookahead(handle_));
-  EXPECT_EQ(kDifferentLookahead,
-            WebRtc_set_lookahead(handle_, kDifferentLookahead));
-  EXPECT_EQ(kDifferentLookahead, WebRtc_lookahead(handle_));
-  EXPECT_EQ(0, WebRtc_InitDelayEstimatorFarend(farend_handle_));
-  EXPECT_EQ(kDifferentLookahead, WebRtc_lookahead(handle_));
-  EXPECT_EQ(0, WebRtc_InitDelayEstimator(handle_));
-  EXPECT_EQ(kDifferentLookahead, WebRtc_lookahead(handle_));
-}
-
-TEST_F(DelayEstimatorTest, VerifyHistorySizeAtCreate) {
-  EXPECT_EQ(kHistorySize, WebRtc_history_size(handle_));
-}
-
-TEST_F(DelayEstimatorTest, VerifyHistorySizeIsSetAndKeptAfterInit) {
-  EXPECT_EQ(kHistorySize, WebRtc_history_size(handle_));
-  EXPECT_EQ(kDifferentHistorySize,
-            WebRtc_set_history_size(handle_, kDifferentHistorySize));
-  EXPECT_EQ(kDifferentHistorySize, WebRtc_history_size(handle_));
-  EXPECT_EQ(0, WebRtc_InitDelayEstimator(handle_));
-  EXPECT_EQ(kDifferentHistorySize, WebRtc_history_size(handle_));
-  EXPECT_EQ(0, WebRtc_InitDelayEstimatorFarend(farend_handle_));
-  EXPECT_EQ(kDifferentHistorySize, WebRtc_history_size(handle_));
-}
-
-// TODO(bjornv): Add tests for SoftReset...(...).
-
-}  // namespace
diff --git a/modules/audio_processing/utility/delay_estimator_wrapper.cc b/modules/audio_processing/utility/delay_estimator_wrapper.cc
deleted file mode 100644
index afd07ac..0000000
--- a/modules/audio_processing/utility/delay_estimator_wrapper.cc
+++ /dev/null
@@ -1,486 +0,0 @@
-/*
- *  Copyright (c) 2012 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_processing/utility/delay_estimator_wrapper.h"
-
-#include <stdlib.h>
-#include <string.h>
-
-#include "webrtc/modules/audio_processing/utility/delay_estimator.h"
-#include "webrtc/modules/audio_processing/utility/delay_estimator_internal.h"
-#include "webrtc/rtc_base/checks.h"
-
-// Only bit |kBandFirst| through bit |kBandLast| are processed and
-// |kBandFirst| - |kBandLast| must be < 32.
-enum { kBandFirst = 12 };
-enum { kBandLast = 43 };
-
-static __inline uint32_t SetBit(uint32_t in, int pos) {
-  uint32_t mask = (1 << pos);
-  uint32_t out = (in | mask);
-
-  return out;
-}
-
-// Calculates the mean recursively. Same version as WebRtc_MeanEstimatorFix(),
-// but for float.
-//
-// Inputs:
-//    - new_value             : New additional value.
-//    - scale                 : Scale for smoothing (should be less than 1.0).
-//
-// Input/Output:
-//    - mean_value            : Pointer to the mean value for updating.
-//
-static void MeanEstimatorFloat(float new_value,
-                               float scale,
-                               float* mean_value) {
-  RTC_DCHECK_LT(scale, 1.0f);
-  *mean_value += (new_value - *mean_value) * scale;
-}
-
-// Computes the binary spectrum by comparing the input |spectrum| with a
-// |threshold_spectrum|. Float and fixed point versions.
-//
-// Inputs:
-//      - spectrum            : Spectrum of which the binary spectrum should be
-//                              calculated.
-//      - threshold_spectrum  : Threshold spectrum with which the input
-//                              spectrum is compared.
-// Return:
-//      - out                 : Binary spectrum.
-//
-static uint32_t BinarySpectrumFix(const uint16_t* spectrum,
-                                  SpectrumType* threshold_spectrum,
-                                  int q_domain,
-                                  int* threshold_initialized) {
-  int i = kBandFirst;
-  uint32_t out = 0;
-
-  RTC_DCHECK_LT(q_domain, 16);
-
-  if (!(*threshold_initialized)) {
-    // Set the |threshold_spectrum| to half the input |spectrum| as starting
-    // value. This speeds up the convergence.
-    for (i = kBandFirst; i <= kBandLast; i++) {
-      if (spectrum[i] > 0) {
-        // Convert input spectrum from Q(|q_domain|) to Q15.
-        int32_t spectrum_q15 = ((int32_t) spectrum[i]) << (15 - q_domain);
-        threshold_spectrum[i].int32_ = (spectrum_q15 >> 1);
-        *threshold_initialized = 1;
-      }
-    }
-  }
-  for (i = kBandFirst; i <= kBandLast; i++) {
-    // Convert input spectrum from Q(|q_domain|) to Q15.
-    int32_t spectrum_q15 = ((int32_t) spectrum[i]) << (15 - q_domain);
-    // Update the |threshold_spectrum|.
-    WebRtc_MeanEstimatorFix(spectrum_q15, 6, &(threshold_spectrum[i].int32_));
-    // Convert |spectrum| at current frequency bin to a binary value.
-    if (spectrum_q15 > threshold_spectrum[i].int32_) {
-      out = SetBit(out, i - kBandFirst);
-    }
-  }
-
-  return out;
-}
-
-static uint32_t BinarySpectrumFloat(const float* spectrum,
-                                    SpectrumType* threshold_spectrum,
-                                    int* threshold_initialized) {
-  int i = kBandFirst;
-  uint32_t out = 0;
-  const float kScale = 1 / 64.0;
-
-  if (!(*threshold_initialized)) {
-    // Set the |threshold_spectrum| to half the input |spectrum| as starting
-    // value. This speeds up the convergence.
-    for (i = kBandFirst; i <= kBandLast; i++) {
-      if (spectrum[i] > 0.0f) {
-        threshold_spectrum[i].float_ = (spectrum[i] / 2);
-        *threshold_initialized = 1;
-      }
-    }
-  }
-
-  for (i = kBandFirst; i <= kBandLast; i++) {
-    // Update the |threshold_spectrum|.
-    MeanEstimatorFloat(spectrum[i], kScale, &(threshold_spectrum[i].float_));
-    // Convert |spectrum| at current frequency bin to a binary value.
-    if (spectrum[i] > threshold_spectrum[i].float_) {
-      out = SetBit(out, i - kBandFirst);
-    }
-  }
-
-  return out;
-}
-
-void WebRtc_FreeDelayEstimatorFarend(void* handle) {
-  DelayEstimatorFarend* self = (DelayEstimatorFarend*) handle;
-
-  if (handle == NULL) {
-    return;
-  }
-
-  free(self->mean_far_spectrum);
-  self->mean_far_spectrum = NULL;
-
-  WebRtc_FreeBinaryDelayEstimatorFarend(self->binary_farend);
-  self->binary_farend = NULL;
-
-  free(self);
-}
-
-void* WebRtc_CreateDelayEstimatorFarend(int spectrum_size, int history_size) {
-  DelayEstimatorFarend* self = NULL;
-
-  // Check if the sub band used in the delay estimation is small enough to fit
-  // the binary spectra in a uint32_t.
-  static_assert(kBandLast - kBandFirst < 32, "");
-
-  if (spectrum_size >= kBandLast) {
-    self = static_cast<DelayEstimatorFarend*>(
-        malloc(sizeof(DelayEstimatorFarend)));
-  }
-
-  if (self != NULL) {
-    int memory_fail = 0;
-
-    // Allocate memory for the binary far-end spectrum handling.
-    self->binary_farend = WebRtc_CreateBinaryDelayEstimatorFarend(history_size);
-    memory_fail |= (self->binary_farend == NULL);
-
-    // Allocate memory for spectrum buffers.
-    self->mean_far_spectrum =
-        static_cast<SpectrumType*>(malloc(spectrum_size * sizeof(SpectrumType)));
-    memory_fail |= (self->mean_far_spectrum == NULL);
-
-    self->spectrum_size = spectrum_size;
-
-    if (memory_fail) {
-      WebRtc_FreeDelayEstimatorFarend(self);
-      self = NULL;
-    }
-  }
-
-  return self;
-}
-
-int WebRtc_InitDelayEstimatorFarend(void* handle) {
-  DelayEstimatorFarend* self = (DelayEstimatorFarend*) handle;
-
-  if (self == NULL) {
-    return -1;
-  }
-
-  // Initialize far-end part of binary delay estimator.
-  WebRtc_InitBinaryDelayEstimatorFarend(self->binary_farend);
-
-  // Set averaged far and near end spectra to zero.
-  memset(self->mean_far_spectrum, 0,
-         sizeof(SpectrumType) * self->spectrum_size);
-  // Reset initialization indicators.
-  self->far_spectrum_initialized = 0;
-
-  return 0;
-}
-
-void WebRtc_SoftResetDelayEstimatorFarend(void* handle, int delay_shift) {
-  DelayEstimatorFarend* self = (DelayEstimatorFarend*) handle;
-  RTC_DCHECK(self);
-  WebRtc_SoftResetBinaryDelayEstimatorFarend(self->binary_farend, delay_shift);
-}
-
-int WebRtc_AddFarSpectrumFix(void* handle,
-                             const uint16_t* far_spectrum,
-                             int spectrum_size,
-                             int far_q) {
-  DelayEstimatorFarend* self = (DelayEstimatorFarend*) handle;
-  uint32_t binary_spectrum = 0;
-
-  if (self == NULL) {
-    return -1;
-  }
-  if (far_spectrum == NULL) {
-    // Empty far end spectrum.
-    return -1;
-  }
-  if (spectrum_size != self->spectrum_size) {
-    // Data sizes don't match.
-    return -1;
-  }
-  if (far_q > 15) {
-    // If |far_q| is larger than 15 we cannot guarantee no wrap around.
-    return -1;
-  }
-
-  // Get binary spectrum.
-  binary_spectrum = BinarySpectrumFix(far_spectrum, self->mean_far_spectrum,
-                                      far_q, &(self->far_spectrum_initialized));
-  WebRtc_AddBinaryFarSpectrum(self->binary_farend, binary_spectrum);
-
-  return 0;
-}
-
-int WebRtc_AddFarSpectrumFloat(void* handle,
-                               const float* far_spectrum,
-                               int spectrum_size) {
-  DelayEstimatorFarend* self = (DelayEstimatorFarend*) handle;
-  uint32_t binary_spectrum = 0;
-
-  if (self == NULL) {
-    return -1;
-  }
-  if (far_spectrum == NULL) {
-    // Empty far end spectrum.
-    return -1;
-  }
-  if (spectrum_size != self->spectrum_size) {
-    // Data sizes don't match.
-    return -1;
-  }
-
-  // Get binary spectrum.
-  binary_spectrum = BinarySpectrumFloat(far_spectrum, self->mean_far_spectrum,
-                                        &(self->far_spectrum_initialized));
-  WebRtc_AddBinaryFarSpectrum(self->binary_farend, binary_spectrum);
-
-  return 0;
-}
-
-void WebRtc_FreeDelayEstimator(void* handle) {
-  DelayEstimator* self = (DelayEstimator*) handle;
-
-  if (handle == NULL) {
-    return;
-  }
-
-  free(self->mean_near_spectrum);
-  self->mean_near_spectrum = NULL;
-
-  WebRtc_FreeBinaryDelayEstimator(self->binary_handle);
-  self->binary_handle = NULL;
-
-  free(self);
-}
-
-void* WebRtc_CreateDelayEstimator(void* farend_handle, int max_lookahead) {
-  DelayEstimator* self = NULL;
-  DelayEstimatorFarend* farend = (DelayEstimatorFarend*) farend_handle;
-
-  if (farend_handle != NULL) {
-    self = static_cast<DelayEstimator*>(malloc(sizeof(DelayEstimator)));
-  }
-
-  if (self != NULL) {
-    int memory_fail = 0;
-
-    // Allocate memory for the farend spectrum handling.
-    self->binary_handle =
-        WebRtc_CreateBinaryDelayEstimator(farend->binary_farend, max_lookahead);
-    memory_fail |= (self->binary_handle == NULL);
-
-    // Allocate memory for spectrum buffers.
-    self->mean_near_spectrum = static_cast<SpectrumType*>(
-        malloc(farend->spectrum_size * sizeof(SpectrumType)));
-    memory_fail |= (self->mean_near_spectrum == NULL);
-
-    self->spectrum_size = farend->spectrum_size;
-
-    if (memory_fail) {
-      WebRtc_FreeDelayEstimator(self);
-      self = NULL;
-    }
-  }
-
-  return self;
-}
-
-int WebRtc_InitDelayEstimator(void* handle) {
-  DelayEstimator* self = (DelayEstimator*) handle;
-
-  if (self == NULL) {
-    return -1;
-  }
-
-  // Initialize binary delay estimator.
-  WebRtc_InitBinaryDelayEstimator(self->binary_handle);
-
-  // Set averaged far and near end spectra to zero.
-  memset(self->mean_near_spectrum, 0,
-         sizeof(SpectrumType) * self->spectrum_size);
-  // Reset initialization indicators.
-  self->near_spectrum_initialized = 0;
-
-  return 0;
-}
-
-int WebRtc_SoftResetDelayEstimator(void* handle, int delay_shift) {
-  DelayEstimator* self = (DelayEstimator*) handle;
-  RTC_DCHECK(self);
-  return WebRtc_SoftResetBinaryDelayEstimator(self->binary_handle, delay_shift);
-}
-
-int WebRtc_set_history_size(void* handle, int history_size) {
-  DelayEstimator* self = static_cast<DelayEstimator*>(handle);
-
-  if ((self == NULL) || (history_size <= 1)) {
-    return -1;
-  }
-  return WebRtc_AllocateHistoryBufferMemory(self->binary_handle, history_size);
-}
-
-int WebRtc_history_size(const void* handle) {
-  const DelayEstimator* self = static_cast<const DelayEstimator*>(handle);
-
-  if (self == NULL) {
-    return -1;
-  }
-  if (self->binary_handle->farend->history_size !=
-      self->binary_handle->history_size) {
-    // Non matching history sizes.
-    return -1;
-  }
-  return self->binary_handle->history_size;
-}
-
-int WebRtc_set_lookahead(void* handle, int lookahead) {
-  DelayEstimator* self = (DelayEstimator*) handle;
-  RTC_DCHECK(self);
-  RTC_DCHECK(self->binary_handle);
-  if ((lookahead > self->binary_handle->near_history_size - 1) ||
-      (lookahead < 0)) {
-    return -1;
-  }
-  self->binary_handle->lookahead = lookahead;
-  return self->binary_handle->lookahead;
-}
-
-int WebRtc_lookahead(void* handle) {
-  DelayEstimator* self = (DelayEstimator*) handle;
-  RTC_DCHECK(self);
-  RTC_DCHECK(self->binary_handle);
-  return self->binary_handle->lookahead;
-}
-
-int WebRtc_set_allowed_offset(void* handle, int allowed_offset) {
-  DelayEstimator* self = (DelayEstimator*) handle;
-
-  if ((self == NULL) || (allowed_offset < 0)) {
-    return -1;
-  }
-  self->binary_handle->allowed_offset = allowed_offset;
-  return 0;
-}
-
-int WebRtc_get_allowed_offset(const void* handle) {
-  const DelayEstimator* self = (const DelayEstimator*) handle;
-
-  if (self == NULL) {
-    return -1;
-  }
-  return self->binary_handle->allowed_offset;
-}
-
-int WebRtc_enable_robust_validation(void* handle, int enable) {
-  DelayEstimator* self = (DelayEstimator*) handle;
-
-  if (self == NULL) {
-    return -1;
-  }
-  if ((enable < 0) || (enable > 1)) {
-    return -1;
-  }
-  RTC_DCHECK(self->binary_handle);
-  self->binary_handle->robust_validation_enabled = enable;
-  return 0;
-}
-
-int WebRtc_is_robust_validation_enabled(const void* handle) {
-  const DelayEstimator* self = (const DelayEstimator*) handle;
-
-  if (self == NULL) {
-    return -1;
-  }
-  return self->binary_handle->robust_validation_enabled;
-}
-
-int WebRtc_DelayEstimatorProcessFix(void* handle,
-                                    const uint16_t* near_spectrum,
-                                    int spectrum_size,
-                                    int near_q) {
-  DelayEstimator* self = (DelayEstimator*) handle;
-  uint32_t binary_spectrum = 0;
-
-  if (self == NULL) {
-    return -1;
-  }
-  if (near_spectrum == NULL) {
-    // Empty near end spectrum.
-    return -1;
-  }
-  if (spectrum_size != self->spectrum_size) {
-    // Data sizes don't match.
-    return -1;
-  }
-  if (near_q > 15) {
-    // If |near_q| is larger than 15 we cannot guarantee no wrap around.
-    return -1;
-  }
-
-  // Get binary spectra.
-  binary_spectrum = BinarySpectrumFix(near_spectrum,
-                                      self->mean_near_spectrum,
-                                      near_q,
-                                      &(self->near_spectrum_initialized));
-
-  return WebRtc_ProcessBinarySpectrum(self->binary_handle, binary_spectrum);
-}
-
-int WebRtc_DelayEstimatorProcessFloat(void* handle,
-                                      const float* near_spectrum,
-                                      int spectrum_size) {
-  DelayEstimator* self = (DelayEstimator*) handle;
-  uint32_t binary_spectrum = 0;
-
-  if (self == NULL) {
-    return -1;
-  }
-  if (near_spectrum == NULL) {
-    // Empty near end spectrum.
-    return -1;
-  }
-  if (spectrum_size != self->spectrum_size) {
-    // Data sizes don't match.
-    return -1;
-  }
-
-  // Get binary spectrum.
-  binary_spectrum = BinarySpectrumFloat(near_spectrum, self->mean_near_spectrum,
-                                        &(self->near_spectrum_initialized));
-
-  return WebRtc_ProcessBinarySpectrum(self->binary_handle, binary_spectrum);
-}
-
-int WebRtc_last_delay(void* handle) {
-  DelayEstimator* self = (DelayEstimator*) handle;
-
-  if (self == NULL) {
-    return -1;
-  }
-
-  return WebRtc_binary_last_delay(self->binary_handle);
-}
-
-float WebRtc_last_delay_quality(void* handle) {
-  DelayEstimator* self = (DelayEstimator*) handle;
-  RTC_DCHECK(self);
-  return WebRtc_binary_last_delay_quality(self->binary_handle);
-}
diff --git a/modules/audio_processing/utility/delay_estimator_wrapper.h b/modules/audio_processing/utility/delay_estimator_wrapper.h
deleted file mode 100644
index fdadebe..0000000
--- a/modules/audio_processing/utility/delay_estimator_wrapper.h
+++ /dev/null
@@ -1,244 +0,0 @@
-/*
- *  Copyright (c) 2012 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.
- */
-
-// Performs delay estimation on block by block basis.
-// The return value is  0 - OK and -1 - Error, unless otherwise stated.
-
-#ifndef WEBRTC_MODULES_AUDIO_PROCESSING_UTILITY_DELAY_ESTIMATOR_WRAPPER_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_UTILITY_DELAY_ESTIMATOR_WRAPPER_H_
-
-#include "webrtc/typedefs.h"
-
-// Releases the memory allocated by WebRtc_CreateDelayEstimatorFarend(...)
-void WebRtc_FreeDelayEstimatorFarend(void* handle);
-
-// Allocates the memory needed by the far-end part of the delay estimation. The
-// memory needs to be initialized separately through
-// WebRtc_InitDelayEstimatorFarend(...).
-//
-// Inputs:
-//  - spectrum_size     : Size of the spectrum used both in far-end and
-//                        near-end. Used to allocate memory for spectrum
-//                        specific buffers.
-//  - history_size      : The far-end history buffer size. A change in buffer
-//                        size can be forced with WebRtc_set_history_size().
-//                        Note that the maximum delay which can be estimated is
-//                        determined together with WebRtc_set_lookahead().
-//
-// Return value:
-//  - void*             : Created |handle|. If the memory can't be allocated or
-//                        if any of the input parameters are invalid NULL is
-//                        returned.
-void* WebRtc_CreateDelayEstimatorFarend(int spectrum_size, int history_size);
-
-// Initializes the far-end part of the delay estimation instance returned by
-// WebRtc_CreateDelayEstimatorFarend(...)
-int WebRtc_InitDelayEstimatorFarend(void* handle);
-
-// Soft resets the far-end part of the delay estimation instance returned by
-// WebRtc_CreateDelayEstimatorFarend(...).
-// Input:
-//      - delay_shift   : The amount of blocks to shift history buffers.
-void WebRtc_SoftResetDelayEstimatorFarend(void* handle, int delay_shift);
-
-// Adds the far-end spectrum to the far-end history buffer. This spectrum is
-// used as reference when calculating the delay using
-// WebRtc_ProcessSpectrum().
-//
-// Inputs:
-//    - far_spectrum    : Far-end spectrum.
-//    - spectrum_size   : The size of the data arrays (same for both far- and
-//                        near-end).
-//    - far_q           : The Q-domain of the far-end data.
-//
-// Output:
-//    - handle          : Updated far-end instance.
-//
-int WebRtc_AddFarSpectrumFix(void* handle,
-                             const uint16_t* far_spectrum,
-                             int spectrum_size,
-                             int far_q);
-
-// See WebRtc_AddFarSpectrumFix() for description.
-int WebRtc_AddFarSpectrumFloat(void* handle,
-                               const float* far_spectrum,
-                               int spectrum_size);
-
-// Releases the memory allocated by WebRtc_CreateDelayEstimator(...)
-void WebRtc_FreeDelayEstimator(void* handle);
-
-// Allocates the memory needed by the delay estimation. The memory needs to be
-// initialized separately through WebRtc_InitDelayEstimator(...).
-//
-// Inputs:
-//      - farend_handle : Pointer to the far-end part of the delay estimation
-//                        instance created prior to this call using
-//                        WebRtc_CreateDelayEstimatorFarend().
-//
-//                        Note that WebRtc_CreateDelayEstimator does not take
-//                        ownership of |farend_handle|, which has to be torn
-//                        down properly after this instance.
-//
-//      - max_lookahead : Maximum amount of non-causal lookahead allowed. The
-//                        actual amount of lookahead used can be controlled by
-//                        WebRtc_set_lookahead(...). The default |lookahead| is
-//                        set to |max_lookahead| at create time. Use
-//                        WebRtc_set_lookahead(...) before start if a different
-//                        value is desired.
-//
-//                        Using lookahead can detect cases in which a near-end
-//                        signal occurs before the corresponding far-end signal.
-//                        It will delay the estimate for the current block by an
-//                        equal amount, and the returned values will be offset
-//                        by it.
-//
-//                        A value of zero is the typical no-lookahead case.
-//                        This also represents the minimum delay which can be
-//                        estimated.
-//
-//                        Note that the effective range of delay estimates is
-//                        [-|lookahead|,... ,|history_size|-|lookahead|)
-//                        where |history_size| is set through
-//                        WebRtc_set_history_size().
-//
-// Return value:
-//      - void*         : Created |handle|. If the memory can't be allocated or
-//                        if any of the input parameters are invalid NULL is
-//                        returned.
-void* WebRtc_CreateDelayEstimator(void* farend_handle, int max_lookahead);
-
-// Initializes the delay estimation instance returned by
-// WebRtc_CreateDelayEstimator(...)
-int WebRtc_InitDelayEstimator(void* handle);
-
-// Soft resets the delay estimation instance returned by
-// WebRtc_CreateDelayEstimator(...)
-// Input:
-//      - delay_shift   : The amount of blocks to shift history buffers.
-//
-// Return value:
-//      - actual_shifts : The actual number of shifts performed.
-int WebRtc_SoftResetDelayEstimator(void* handle, int delay_shift);
-
-// Sets the effective |history_size| used. Valid values from 2. We simply need
-// at least two delays to compare to perform an estimate. If |history_size| is
-// changed, buffers are reallocated filling in with zeros if necessary.
-// Note that changing the |history_size| affects both buffers in far-end and
-// near-end. Hence it is important to change all DelayEstimators that use the
-// same reference far-end, to the same |history_size| value.
-// Inputs:
-//  - handle            : Pointer to the delay estimation instance.
-//  - history_size      : Effective history size to be used.
-// Return value:
-//  - new_history_size  : The new history size used. If the memory was not able
-//                        to be allocated 0 is returned.
-int WebRtc_set_history_size(void* handle, int history_size);
-
-// Returns the history_size currently used.
-// Input:
-//      - handle        : Pointer to the delay estimation instance.
-int WebRtc_history_size(const void* handle);
-
-// Sets the amount of |lookahead| to use. Valid values are [0, max_lookahead]
-// where |max_lookahead| was set at create time through
-// WebRtc_CreateDelayEstimator(...).
-//
-// Input:
-//      - handle        : Pointer to the delay estimation instance.
-//      - lookahead     : The amount of lookahead to be used.
-//
-// Return value:
-//      - new_lookahead : The actual amount of lookahead set, unless |handle| is
-//                        a NULL pointer or |lookahead| is invalid, for which an
-//                        error is returned.
-int WebRtc_set_lookahead(void* handle, int lookahead);
-
-// Returns the amount of lookahead we currently use.
-// Input:
-//      - handle        : Pointer to the delay estimation instance.
-int WebRtc_lookahead(void* handle);
-
-// Sets the |allowed_offset| used in the robust validation scheme.  If the
-// delay estimator is used in an echo control component, this parameter is
-// related to the filter length.  In principle |allowed_offset| should be set to
-// the echo control filter length minus the expected echo duration, i.e., the
-// delay offset the echo control can handle without quality regression.  The
-// default value, used if not set manually, is zero.  Note that |allowed_offset|
-// has to be non-negative.
-// Inputs:
-//  - handle            : Pointer to the delay estimation instance.
-//  - allowed_offset    : The amount of delay offset, measured in partitions,
-//                        the echo control filter can handle.
-int WebRtc_set_allowed_offset(void* handle, int allowed_offset);
-
-// Returns the |allowed_offset| in number of partitions.
-int WebRtc_get_allowed_offset(const void* handle);
-
-// Enables/Disables a robust validation functionality in the delay estimation.
-// This is by default set to disabled at create time.  The state is preserved
-// over a reset.
-// Inputs:
-//      - handle        : Pointer to the delay estimation instance.
-//      - enable        : Enable (1) or disable (0) this feature.
-int WebRtc_enable_robust_validation(void* handle, int enable);
-
-// Returns 1 if robust validation is enabled and 0 if disabled.
-int WebRtc_is_robust_validation_enabled(const void* handle);
-
-// Estimates and returns the delay between the far-end and near-end blocks. The
-// value will be offset by the lookahead (i.e. the lookahead should be
-// subtracted from the returned value).
-// Inputs:
-//      - handle        : Pointer to the delay estimation instance.
-//      - near_spectrum : Pointer to the near-end spectrum data of the current
-//                        block.
-//      - spectrum_size : The size of the data arrays (same for both far- and
-//                        near-end).
-//      - near_q        : The Q-domain of the near-end data.
-//
-// Output:
-//      - handle        : Updated instance.
-//
-// Return value:
-//      - delay         :  >= 0 - Calculated delay value.
-//                        -1    - Error.
-//                        -2    - Insufficient data for estimation.
-int WebRtc_DelayEstimatorProcessFix(void* handle,
-                                    const uint16_t* near_spectrum,
-                                    int spectrum_size,
-                                    int near_q);
-
-// See WebRtc_DelayEstimatorProcessFix() for description.
-int WebRtc_DelayEstimatorProcessFloat(void* handle,
-                                      const float* near_spectrum,
-                                      int spectrum_size);
-
-// Returns the last calculated delay updated by the function
-// WebRtc_DelayEstimatorProcess(...).
-//
-// Input:
-//      - handle        : Pointer to the delay estimation instance.
-//
-// Return value:
-//      - delay         : >= 0  - Last calculated delay value.
-//                        -1    - Error.
-//                        -2    - Insufficient data for estimation.
-int WebRtc_last_delay(void* handle);
-
-// Returns the estimation quality/probability of the last calculated delay
-// updated by the function WebRtc_DelayEstimatorProcess(...). The estimation
-// quality is a value in the interval [0, 1]. The higher the value, the better
-// the quality.
-//
-// Return value:
-//      - delay_quality : >= 0  - Estimation quality of last calculated delay.
-float WebRtc_last_delay_quality(void* handle);
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_UTILITY_DELAY_ESTIMATOR_WRAPPER_H_
diff --git a/modules/audio_processing/utility/ooura_fft.cc b/modules/audio_processing/utility/ooura_fft.cc
deleted file mode 100644
index 30f2034..0000000
--- a/modules/audio_processing/utility/ooura_fft.cc
+++ /dev/null
@@ -1,543 +0,0 @@
-/*
- * http://www.kurims.kyoto-u.ac.jp/~ooura/fft.html
- * Copyright Takuya OOURA, 1996-2001
- *
- * You may use, copy, modify and distribute this code for any purpose (include
- * commercial use) and without fee. Please refer to this package when you modify
- * this code.
- *
- * Changes by the WebRTC authors:
- *    - Trivial type modifications.
- *    - Minimal code subset to do rdft of length 128.
- *    - Optimizations because of known length.
- *    - Removed the global variables by moving the code in to a class in order
- *      to make it thread safe.
- *
- *  All changes are covered by the WebRTC license and IP grant:
- *  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_processing//utility/ooura_fft.h"
-
-#include <math.h>
-
-#include "webrtc/modules/audio_processing/utility/ooura_fft_tables_common.h"
-#include "webrtc/system_wrappers/include/cpu_features_wrapper.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-namespace {
-
-#if !(defined(MIPS_FPU_LE) || defined(WEBRTC_HAS_NEON))
-static void cft1st_128_C(float* a) {
-  const int n = 128;
-  int j, k1, k2;
-  float wk1r, wk1i, wk2r, wk2i, wk3r, wk3i;
-  float x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
-
-  // The processing of the first set of elements was simplified in C to avoid
-  // some operations (multiplication by zero or one, addition of two elements
-  // multiplied by the same weight, ...).
-  x0r = a[0] + a[2];
-  x0i = a[1] + a[3];
-  x1r = a[0] - a[2];
-  x1i = a[1] - a[3];
-  x2r = a[4] + a[6];
-  x2i = a[5] + a[7];
-  x3r = a[4] - a[6];
-  x3i = a[5] - a[7];
-  a[0] = x0r + x2r;
-  a[1] = x0i + x2i;
-  a[4] = x0r - x2r;
-  a[5] = x0i - x2i;
-  a[2] = x1r - x3i;
-  a[3] = x1i + x3r;
-  a[6] = x1r + x3i;
-  a[7] = x1i - x3r;
-  wk1r = rdft_w[2];
-  x0r = a[8] + a[10];
-  x0i = a[9] + a[11];
-  x1r = a[8] - a[10];
-  x1i = a[9] - a[11];
-  x2r = a[12] + a[14];
-  x2i = a[13] + a[15];
-  x3r = a[12] - a[14];
-  x3i = a[13] - a[15];
-  a[8] = x0r + x2r;
-  a[9] = x0i + x2i;
-  a[12] = x2i - x0i;
-  a[13] = x0r - x2r;
-  x0r = x1r - x3i;
-  x0i = x1i + x3r;
-  a[10] = wk1r * (x0r - x0i);
-  a[11] = wk1r * (x0r + x0i);
-  x0r = x3i + x1r;
-  x0i = x3r - x1i;
-  a[14] = wk1r * (x0i - x0r);
-  a[15] = wk1r * (x0i + x0r);
-  k1 = 0;
-  for (j = 16; j < n; j += 16) {
-    k1 += 2;
-    k2 = 2 * k1;
-    wk2r = rdft_w[k1 + 0];
-    wk2i = rdft_w[k1 + 1];
-    wk1r = rdft_w[k2 + 0];
-    wk1i = rdft_w[k2 + 1];
-    wk3r = rdft_wk3ri_first[k1 + 0];
-    wk3i = rdft_wk3ri_first[k1 + 1];
-    x0r = a[j + 0] + a[j + 2];
-    x0i = a[j + 1] + a[j + 3];
-    x1r = a[j + 0] - a[j + 2];
-    x1i = a[j + 1] - a[j + 3];
-    x2r = a[j + 4] + a[j + 6];
-    x2i = a[j + 5] + a[j + 7];
-    x3r = a[j + 4] - a[j + 6];
-    x3i = a[j + 5] - a[j + 7];
-    a[j + 0] = x0r + x2r;
-    a[j + 1] = x0i + x2i;
-    x0r -= x2r;
-    x0i -= x2i;
-    a[j + 4] = wk2r * x0r - wk2i * x0i;
-    a[j + 5] = wk2r * x0i + wk2i * x0r;
-    x0r = x1r - x3i;
-    x0i = x1i + x3r;
-    a[j + 2] = wk1r * x0r - wk1i * x0i;
-    a[j + 3] = wk1r * x0i + wk1i * x0r;
-    x0r = x1r + x3i;
-    x0i = x1i - x3r;
-    a[j + 6] = wk3r * x0r - wk3i * x0i;
-    a[j + 7] = wk3r * x0i + wk3i * x0r;
-    wk1r = rdft_w[k2 + 2];
-    wk1i = rdft_w[k2 + 3];
-    wk3r = rdft_wk3ri_second[k1 + 0];
-    wk3i = rdft_wk3ri_second[k1 + 1];
-    x0r = a[j + 8] + a[j + 10];
-    x0i = a[j + 9] + a[j + 11];
-    x1r = a[j + 8] - a[j + 10];
-    x1i = a[j + 9] - a[j + 11];
-    x2r = a[j + 12] + a[j + 14];
-    x2i = a[j + 13] + a[j + 15];
-    x3r = a[j + 12] - a[j + 14];
-    x3i = a[j + 13] - a[j + 15];
-    a[j + 8] = x0r + x2r;
-    a[j + 9] = x0i + x2i;
-    x0r -= x2r;
-    x0i -= x2i;
-    a[j + 12] = -wk2i * x0r - wk2r * x0i;
-    a[j + 13] = -wk2i * x0i + wk2r * x0r;
-    x0r = x1r - x3i;
-    x0i = x1i + x3r;
-    a[j + 10] = wk1r * x0r - wk1i * x0i;
-    a[j + 11] = wk1r * x0i + wk1i * x0r;
-    x0r = x1r + x3i;
-    x0i = x1i - x3r;
-    a[j + 14] = wk3r * x0r - wk3i * x0i;
-    a[j + 15] = wk3r * x0i + wk3i * x0r;
-  }
-}
-
-static void cftmdl_128_C(float* a) {
-  const int l = 8;
-  const int n = 128;
-  const int m = 32;
-  int j0, j1, j2, j3, k, k1, k2, m2;
-  float wk1r, wk1i, wk2r, wk2i, wk3r, wk3i;
-  float x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
-
-  for (j0 = 0; j0 < l; j0 += 2) {
-    j1 = j0 + 8;
-    j2 = j0 + 16;
-    j3 = j0 + 24;
-    x0r = a[j0 + 0] + a[j1 + 0];
-    x0i = a[j0 + 1] + a[j1 + 1];
-    x1r = a[j0 + 0] - a[j1 + 0];
-    x1i = a[j0 + 1] - a[j1 + 1];
-    x2r = a[j2 + 0] + a[j3 + 0];
-    x2i = a[j2 + 1] + a[j3 + 1];
-    x3r = a[j2 + 0] - a[j3 + 0];
-    x3i = a[j2 + 1] - a[j3 + 1];
-    a[j0 + 0] = x0r + x2r;
-    a[j0 + 1] = x0i + x2i;
-    a[j2 + 0] = x0r - x2r;
-    a[j2 + 1] = x0i - x2i;
-    a[j1 + 0] = x1r - x3i;
-    a[j1 + 1] = x1i + x3r;
-    a[j3 + 0] = x1r + x3i;
-    a[j3 + 1] = x1i - x3r;
-  }
-  wk1r = rdft_w[2];
-  for (j0 = m; j0 < l + m; j0 += 2) {
-    j1 = j0 + 8;
-    j2 = j0 + 16;
-    j3 = j0 + 24;
-    x0r = a[j0 + 0] + a[j1 + 0];
-    x0i = a[j0 + 1] + a[j1 + 1];
-    x1r = a[j0 + 0] - a[j1 + 0];
-    x1i = a[j0 + 1] - a[j1 + 1];
-    x2r = a[j2 + 0] + a[j3 + 0];
-    x2i = a[j2 + 1] + a[j3 + 1];
-    x3r = a[j2 + 0] - a[j3 + 0];
-    x3i = a[j2 + 1] - a[j3 + 1];
-    a[j0 + 0] = x0r + x2r;
-    a[j0 + 1] = x0i + x2i;
-    a[j2 + 0] = x2i - x0i;
-    a[j2 + 1] = x0r - x2r;
-    x0r = x1r - x3i;
-    x0i = x1i + x3r;
-    a[j1 + 0] = wk1r * (x0r - x0i);
-    a[j1 + 1] = wk1r * (x0r + x0i);
-    x0r = x3i + x1r;
-    x0i = x3r - x1i;
-    a[j3 + 0] = wk1r * (x0i - x0r);
-    a[j3 + 1] = wk1r * (x0i + x0r);
-  }
-  k1 = 0;
-  m2 = 2 * m;
-  for (k = m2; k < n; k += m2) {
-    k1 += 2;
-    k2 = 2 * k1;
-    wk2r = rdft_w[k1 + 0];
-    wk2i = rdft_w[k1 + 1];
-    wk1r = rdft_w[k2 + 0];
-    wk1i = rdft_w[k2 + 1];
-    wk3r = rdft_wk3ri_first[k1 + 0];
-    wk3i = rdft_wk3ri_first[k1 + 1];
-    for (j0 = k; j0 < l + k; j0 += 2) {
-      j1 = j0 + 8;
-      j2 = j0 + 16;
-      j3 = j0 + 24;
-      x0r = a[j0 + 0] + a[j1 + 0];
-      x0i = a[j0 + 1] + a[j1 + 1];
-      x1r = a[j0 + 0] - a[j1 + 0];
-      x1i = a[j0 + 1] - a[j1 + 1];
-      x2r = a[j2 + 0] + a[j3 + 0];
-      x2i = a[j2 + 1] + a[j3 + 1];
-      x3r = a[j2 + 0] - a[j3 + 0];
-      x3i = a[j2 + 1] - a[j3 + 1];
-      a[j0 + 0] = x0r + x2r;
-      a[j0 + 1] = x0i + x2i;
-      x0r -= x2r;
-      x0i -= x2i;
-      a[j2 + 0] = wk2r * x0r - wk2i * x0i;
-      a[j2 + 1] = wk2r * x0i + wk2i * x0r;
-      x0r = x1r - x3i;
-      x0i = x1i + x3r;
-      a[j1 + 0] = wk1r * x0r - wk1i * x0i;
-      a[j1 + 1] = wk1r * x0i + wk1i * x0r;
-      x0r = x1r + x3i;
-      x0i = x1i - x3r;
-      a[j3 + 0] = wk3r * x0r - wk3i * x0i;
-      a[j3 + 1] = wk3r * x0i + wk3i * x0r;
-    }
-    wk1r = rdft_w[k2 + 2];
-    wk1i = rdft_w[k2 + 3];
-    wk3r = rdft_wk3ri_second[k1 + 0];
-    wk3i = rdft_wk3ri_second[k1 + 1];
-    for (j0 = k + m; j0 < l + (k + m); j0 += 2) {
-      j1 = j0 + 8;
-      j2 = j0 + 16;
-      j3 = j0 + 24;
-      x0r = a[j0 + 0] + a[j1 + 0];
-      x0i = a[j0 + 1] + a[j1 + 1];
-      x1r = a[j0 + 0] - a[j1 + 0];
-      x1i = a[j0 + 1] - a[j1 + 1];
-      x2r = a[j2 + 0] + a[j3 + 0];
-      x2i = a[j2 + 1] + a[j3 + 1];
-      x3r = a[j2 + 0] - a[j3 + 0];
-      x3i = a[j2 + 1] - a[j3 + 1];
-      a[j0 + 0] = x0r + x2r;
-      a[j0 + 1] = x0i + x2i;
-      x0r -= x2r;
-      x0i -= x2i;
-      a[j2 + 0] = -wk2i * x0r - wk2r * x0i;
-      a[j2 + 1] = -wk2i * x0i + wk2r * x0r;
-      x0r = x1r - x3i;
-      x0i = x1i + x3r;
-      a[j1 + 0] = wk1r * x0r - wk1i * x0i;
-      a[j1 + 1] = wk1r * x0i + wk1i * x0r;
-      x0r = x1r + x3i;
-      x0i = x1i - x3r;
-      a[j3 + 0] = wk3r * x0r - wk3i * x0i;
-      a[j3 + 1] = wk3r * x0i + wk3i * x0r;
-    }
-  }
-}
-
-static void rftfsub_128_C(float* a) {
-  const float* c = rdft_w + 32;
-  int j1, j2, k1, k2;
-  float wkr, wki, xr, xi, yr, yi;
-
-  for (j1 = 1, j2 = 2; j2 < 64; j1 += 1, j2 += 2) {
-    k2 = 128 - j2;
-    k1 = 32 - j1;
-    wkr = 0.5f - c[k1];
-    wki = c[j1];
-    xr = a[j2 + 0] - a[k2 + 0];
-    xi = a[j2 + 1] + a[k2 + 1];
-    yr = wkr * xr - wki * xi;
-    yi = wkr * xi + wki * xr;
-    a[j2 + 0] -= yr;
-    a[j2 + 1] -= yi;
-    a[k2 + 0] += yr;
-    a[k2 + 1] -= yi;
-  }
-}
-
-static void rftbsub_128_C(float* a) {
-  const float* c = rdft_w + 32;
-  int j1, j2, k1, k2;
-  float wkr, wki, xr, xi, yr, yi;
-
-  a[1] = -a[1];
-  for (j1 = 1, j2 = 2; j2 < 64; j1 += 1, j2 += 2) {
-    k2 = 128 - j2;
-    k1 = 32 - j1;
-    wkr = 0.5f - c[k1];
-    wki = c[j1];
-    xr = a[j2 + 0] - a[k2 + 0];
-    xi = a[j2 + 1] + a[k2 + 1];
-    yr = wkr * xr + wki * xi;
-    yi = wkr * xi - wki * xr;
-    a[j2 + 0] = a[j2 + 0] - yr;
-    a[j2 + 1] = yi - a[j2 + 1];
-    a[k2 + 0] = yr + a[k2 + 0];
-    a[k2 + 1] = yi - a[k2 + 1];
-  }
-  a[65] = -a[65];
-}
-#endif
-
-
-}  // namespace
-
-OouraFft::OouraFft() {
-#if defined(WEBRTC_ARCH_X86_FAMILY)
-  use_sse2_ = (WebRtc_GetCPUInfo(kSSE2) != 0);
-#else
-  use_sse2_ = false;
-#endif
-}
-
-OouraFft::~OouraFft() = default;
-
-void OouraFft::Fft(float* a) const {
-  float xi;
-  bitrv2_128(a);
-  cftfsub_128(a);
-  rftfsub_128(a);
-  xi = a[0] - a[1];
-  a[0] += a[1];
-  a[1] = xi;
-}
-void OouraFft::InverseFft(float* a) const {
-  a[1] = 0.5f * (a[0] - a[1]);
-  a[0] -= a[1];
-  rftbsub_128(a);
-  bitrv2_128(a);
-  cftbsub_128(a);
-}
-
-void OouraFft::cft1st_128(float* a) const {
-#if defined(MIPS_FPU_LE)
-  cft1st_128_mips(a);
-#elif defined(WEBRTC_HAS_NEON)
-  cft1st_128_neon(a);
-#elif defined(WEBRTC_ARCH_X86_FAMILY)
-  if (use_sse2_) {
-    cft1st_128_SSE2(a);
-  } else {
-    cft1st_128_C(a);
-  }
-#else
-  cft1st_128_C(a);
-#endif
-}
-void OouraFft::cftmdl_128(float* a) const {
-#if defined(MIPS_FPU_LE)
-  cftmdl_128_mips(a);
-#elif defined(WEBRTC_HAS_NEON)
-  cftmdl_128_neon(a);
-#elif defined(WEBRTC_ARCH_X86_FAMILY)
-  if (use_sse2_) {
-    cftmdl_128_SSE2(a);
-  } else {
-    cftmdl_128_C(a);
-  }
-#else
-  cftmdl_128_C(a);
-#endif
-}
-void OouraFft::rftfsub_128(float* a) const {
-#if defined(MIPS_FPU_LE)
-  rftfsub_128_mips(a);
-#elif defined(WEBRTC_HAS_NEON)
-  rftfsub_128_neon(a);
-#elif defined(WEBRTC_ARCH_X86_FAMILY)
-  if (use_sse2_) {
-    rftfsub_128_SSE2(a);
-  } else {
-    rftfsub_128_C(a);
-  }
-#else
-  rftfsub_128_C(a);
-#endif
-}
-
-void OouraFft::rftbsub_128(float* a) const {
-#if defined(MIPS_FPU_LE)
-  rftbsub_128_mips(a);
-#elif defined(WEBRTC_HAS_NEON)
-  rftbsub_128_neon(a);
-#elif defined(WEBRTC_ARCH_X86_FAMILY)
-  if (use_sse2_) {
-    rftbsub_128_SSE2(a);
-  } else {
-    rftbsub_128_C(a);
-  }
-#else
-  rftbsub_128_C(a);
-#endif
-}
-
-void OouraFft::cftbsub_128(float* a) const {
-  int j, j1, j2, j3, l;
-  float x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
-
-  cft1st_128(a);
-  cftmdl_128(a);
-  l = 32;
-
-  for (j = 0; j < l; j += 2) {
-    j1 = j + l;
-    j2 = j1 + l;
-    j3 = j2 + l;
-    x0r = a[j] + a[j1];
-    x0i = -a[j + 1] - a[j1 + 1];
-    x1r = a[j] - a[j1];
-    x1i = -a[j + 1] + a[j1 + 1];
-    x2r = a[j2] + a[j3];
-    x2i = a[j2 + 1] + a[j3 + 1];
-    x3r = a[j2] - a[j3];
-    x3i = a[j2 + 1] - a[j3 + 1];
-    a[j] = x0r + x2r;
-    a[j + 1] = x0i - x2i;
-    a[j2] = x0r - x2r;
-    a[j2 + 1] = x0i + x2i;
-    a[j1] = x1r - x3i;
-    a[j1 + 1] = x1i - x3r;
-    a[j3] = x1r + x3i;
-    a[j3 + 1] = x1i + x3r;
-  }
-}
-
-void OouraFft::cftfsub_128(float* a) const {
-  int j, j1, j2, j3, l;
-  float x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
-
-  cft1st_128(a);
-  cftmdl_128(a);
-  l = 32;
-  for (j = 0; j < l; j += 2) {
-    j1 = j + l;
-    j2 = j1 + l;
-    j3 = j2 + l;
-    x0r = a[j] + a[j1];
-    x0i = a[j + 1] + a[j1 + 1];
-    x1r = a[j] - a[j1];
-    x1i = a[j + 1] - a[j1 + 1];
-    x2r = a[j2] + a[j3];
-    x2i = a[j2 + 1] + a[j3 + 1];
-    x3r = a[j2] - a[j3];
-    x3i = a[j2 + 1] - a[j3 + 1];
-    a[j] = x0r + x2r;
-    a[j + 1] = x0i + x2i;
-    a[j2] = x0r - x2r;
-    a[j2 + 1] = x0i - x2i;
-    a[j1] = x1r - x3i;
-    a[j1 + 1] = x1i + x3r;
-    a[j3] = x1r + x3i;
-    a[j3 + 1] = x1i - x3r;
-  }
-}
-
-void OouraFft::bitrv2_128(float* a) const {
-  /*
-      Following things have been attempted but are no faster:
-      (a) Storing the swap indexes in a LUT (index calculations are done
-          for 'free' while waiting on memory/L1).
-      (b) Consolidate the load/store of two consecutive floats by a 64 bit
-          integer (execution is memory/L1 bound).
-      (c) Do a mix of floats and 64 bit integer to maximize register
-          utilization (execution is memory/L1 bound).
-      (d) Replacing ip[i] by ((k<<31)>>25) + ((k >> 1)<<5).
-      (e) Hard-coding of the offsets to completely eliminates index
-          calculations.
-  */
-
-  unsigned int j, j1, k, k1;
-  float xr, xi, yr, yi;
-
-  const int ip[4] = {0, 64, 32, 96};
-  for (k = 0; k < 4; k++) {
-    for (j = 0; j < k; j++) {
-      j1 = 2 * j + ip[k];
-      k1 = 2 * k + ip[j];
-      xr = a[j1 + 0];
-      xi = a[j1 + 1];
-      yr = a[k1 + 0];
-      yi = a[k1 + 1];
-      a[j1 + 0] = yr;
-      a[j1 + 1] = yi;
-      a[k1 + 0] = xr;
-      a[k1 + 1] = xi;
-      j1 += 8;
-      k1 += 16;
-      xr = a[j1 + 0];
-      xi = a[j1 + 1];
-      yr = a[k1 + 0];
-      yi = a[k1 + 1];
-      a[j1 + 0] = yr;
-      a[j1 + 1] = yi;
-      a[k1 + 0] = xr;
-      a[k1 + 1] = xi;
-      j1 += 8;
-      k1 -= 8;
-      xr = a[j1 + 0];
-      xi = a[j1 + 1];
-      yr = a[k1 + 0];
-      yi = a[k1 + 1];
-      a[j1 + 0] = yr;
-      a[j1 + 1] = yi;
-      a[k1 + 0] = xr;
-      a[k1 + 1] = xi;
-      j1 += 8;
-      k1 += 16;
-      xr = a[j1 + 0];
-      xi = a[j1 + 1];
-      yr = a[k1 + 0];
-      yi = a[k1 + 1];
-      a[j1 + 0] = yr;
-      a[j1 + 1] = yi;
-      a[k1 + 0] = xr;
-      a[k1 + 1] = xi;
-    }
-    j1 = 2 * k + 8 + ip[k];
-    k1 = j1 + 8;
-    xr = a[j1 + 0];
-    xi = a[j1 + 1];
-    yr = a[k1 + 0];
-    yi = a[k1 + 1];
-    a[j1 + 0] = yr;
-    a[j1 + 1] = yi;
-    a[k1 + 0] = xr;
-    a[k1 + 1] = xi;
-  }
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/utility/ooura_fft.h b/modules/audio_processing/utility/ooura_fft.h
deleted file mode 100644
index a1b9f04..0000000
--- a/modules/audio_processing/utility/ooura_fft.h
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- *  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_PROCESSING_UTILITY_OOURA_FFT_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_UTILITY_OOURA_FFT_H_
-
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-#if defined(WEBRTC_ARCH_X86_FAMILY)
-void cft1st_128_SSE2(float* a);
-void cftmdl_128_SSE2(float* a);
-void rftfsub_128_SSE2(float* a);
-void rftbsub_128_SSE2(float* a);
-#endif
-
-#if defined(MIPS_FPU_LE)
-void cft1st_128_mips(float* a);
-void cftmdl_128_mips(float* a);
-void rftfsub_128_mips(float* a);
-void rftbsub_128_mips(float* a);
-#endif
-
-#if defined(WEBRTC_HAS_NEON)
-void cft1st_128_neon(float* a);
-void cftmdl_128_neon(float* a);
-void rftfsub_128_neon(float* a);
-void rftbsub_128_neon(float* a);
-#endif
-
-class OouraFft {
- public:
-  OouraFft();
-  ~OouraFft();
-  void Fft(float* a) const;
-  void InverseFft(float* a) const;
-
- private:
-  void cft1st_128(float* a) const;
-  void cftmdl_128(float* a) const;
-  void rftfsub_128(float* a) const;
-  void rftbsub_128(float* a) const;
-
-  void cftfsub_128(float* a) const;
-  void cftbsub_128(float* a) const;
-  void bitrv2_128(float* a) const;
-  bool use_sse2_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_UTILITY_OOURA_FFT_H_
diff --git a/modules/audio_processing/utility/ooura_fft_mips.cc b/modules/audio_processing/utility/ooura_fft_mips.cc
deleted file mode 100644
index 3e9db6e..0000000
--- a/modules/audio_processing/utility/ooura_fft_mips.cc
+++ /dev/null
@@ -1,1185 +0,0 @@
-/*
- *  Copyright (c) 2014 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_processing/utility/ooura_fft.h"
-
-#include "webrtc/modules/audio_processing/utility/ooura_fft_tables_common.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-#if defined(MIPS_FPU_LE)
-void bitrv2_128_mips(float* a) {
-  // n is 128
-  float xr, xi, yr, yi;
-
-  xr = a[8];
-  xi = a[9];
-  yr = a[16];
-  yi = a[17];
-  a[8] = yr;
-  a[9] = yi;
-  a[16] = xr;
-  a[17] = xi;
-
-  xr = a[64];
-  xi = a[65];
-  yr = a[2];
-  yi = a[3];
-  a[64] = yr;
-  a[65] = yi;
-  a[2] = xr;
-  a[3] = xi;
-
-  xr = a[72];
-  xi = a[73];
-  yr = a[18];
-  yi = a[19];
-  a[72] = yr;
-  a[73] = yi;
-  a[18] = xr;
-  a[19] = xi;
-
-  xr = a[80];
-  xi = a[81];
-  yr = a[10];
-  yi = a[11];
-  a[80] = yr;
-  a[81] = yi;
-  a[10] = xr;
-  a[11] = xi;
-
-  xr = a[88];
-  xi = a[89];
-  yr = a[26];
-  yi = a[27];
-  a[88] = yr;
-  a[89] = yi;
-  a[26] = xr;
-  a[27] = xi;
-
-  xr = a[74];
-  xi = a[75];
-  yr = a[82];
-  yi = a[83];
-  a[74] = yr;
-  a[75] = yi;
-  a[82] = xr;
-  a[83] = xi;
-
-  xr = a[32];
-  xi = a[33];
-  yr = a[4];
-  yi = a[5];
-  a[32] = yr;
-  a[33] = yi;
-  a[4] = xr;
-  a[5] = xi;
-
-  xr = a[40];
-  xi = a[41];
-  yr = a[20];
-  yi = a[21];
-  a[40] = yr;
-  a[41] = yi;
-  a[20] = xr;
-  a[21] = xi;
-
-  xr = a[48];
-  xi = a[49];
-  yr = a[12];
-  yi = a[13];
-  a[48] = yr;
-  a[49] = yi;
-  a[12] = xr;
-  a[13] = xi;
-
-  xr = a[56];
-  xi = a[57];
-  yr = a[28];
-  yi = a[29];
-  a[56] = yr;
-  a[57] = yi;
-  a[28] = xr;
-  a[29] = xi;
-
-  xr = a[34];
-  xi = a[35];
-  yr = a[68];
-  yi = a[69];
-  a[34] = yr;
-  a[35] = yi;
-  a[68] = xr;
-  a[69] = xi;
-
-  xr = a[42];
-  xi = a[43];
-  yr = a[84];
-  yi = a[85];
-  a[42] = yr;
-  a[43] = yi;
-  a[84] = xr;
-  a[85] = xi;
-
-  xr = a[50];
-  xi = a[51];
-  yr = a[76];
-  yi = a[77];
-  a[50] = yr;
-  a[51] = yi;
-  a[76] = xr;
-  a[77] = xi;
-
-  xr = a[58];
-  xi = a[59];
-  yr = a[92];
-  yi = a[93];
-  a[58] = yr;
-  a[59] = yi;
-  a[92] = xr;
-  a[93] = xi;
-
-  xr = a[44];
-  xi = a[45];
-  yr = a[52];
-  yi = a[53];
-  a[44] = yr;
-  a[45] = yi;
-  a[52] = xr;
-  a[53] = xi;
-
-  xr = a[96];
-  xi = a[97];
-  yr = a[6];
-  yi = a[7];
-  a[96] = yr;
-  a[97] = yi;
-  a[6] = xr;
-  a[7] = xi;
-
-  xr = a[104];
-  xi = a[105];
-  yr = a[22];
-  yi = a[23];
-  a[104] = yr;
-  a[105] = yi;
-  a[22] = xr;
-  a[23] = xi;
-
-  xr = a[112];
-  xi = a[113];
-  yr = a[14];
-  yi = a[15];
-  a[112] = yr;
-  a[113] = yi;
-  a[14] = xr;
-  a[15] = xi;
-
-  xr = a[120];
-  xi = a[121];
-  yr = a[30];
-  yi = a[31];
-  a[120] = yr;
-  a[121] = yi;
-  a[30] = xr;
-  a[31] = xi;
-
-  xr = a[98];
-  xi = a[99];
-  yr = a[70];
-  yi = a[71];
-  a[98] = yr;
-  a[99] = yi;
-  a[70] = xr;
-  a[71] = xi;
-
-  xr = a[106];
-  xi = a[107];
-  yr = a[86];
-  yi = a[87];
-  a[106] = yr;
-  a[107] = yi;
-  a[86] = xr;
-  a[87] = xi;
-
-  xr = a[114];
-  xi = a[115];
-  yr = a[78];
-  yi = a[79];
-  a[114] = yr;
-  a[115] = yi;
-  a[78] = xr;
-  a[79] = xi;
-
-  xr = a[122];
-  xi = a[123];
-  yr = a[94];
-  yi = a[95];
-  a[122] = yr;
-  a[123] = yi;
-  a[94] = xr;
-  a[95] = xi;
-
-  xr = a[100];
-  xi = a[101];
-  yr = a[38];
-  yi = a[39];
-  a[100] = yr;
-  a[101] = yi;
-  a[38] = xr;
-  a[39] = xi;
-
-  xr = a[108];
-  xi = a[109];
-  yr = a[54];
-  yi = a[55];
-  a[108] = yr;
-  a[109] = yi;
-  a[54] = xr;
-  a[55] = xi;
-
-  xr = a[116];
-  xi = a[117];
-  yr = a[46];
-  yi = a[47];
-  a[116] = yr;
-  a[117] = yi;
-  a[46] = xr;
-  a[47] = xi;
-
-  xr = a[124];
-  xi = a[125];
-  yr = a[62];
-  yi = a[63];
-  a[124] = yr;
-  a[125] = yi;
-  a[62] = xr;
-  a[63] = xi;
-
-  xr = a[110];
-  xi = a[111];
-  yr = a[118];
-  yi = a[119];
-  a[110] = yr;
-  a[111] = yi;
-  a[118] = xr;
-  a[119] = xi;
-}
-
-void cft1st_128_mips(float* a) {
-  float f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14;
-  int a_ptr, p1_rdft, p2_rdft, count;
-  const float* first = rdft_wk3ri_first;
-  const float* second = rdft_wk3ri_second;
-
-  __asm __volatile (
-    ".set       push                                                    \n\t"
-    ".set       noreorder                                               \n\t"
-    // first 8
-    "lwc1       %[f0],        0(%[a])                                   \n\t"
-    "lwc1       %[f1],        4(%[a])                                   \n\t"
-    "lwc1       %[f2],        8(%[a])                                   \n\t"
-    "lwc1       %[f3],        12(%[a])                                  \n\t"
-    "lwc1       %[f4],        16(%[a])                                  \n\t"
-    "lwc1       %[f5],        20(%[a])                                  \n\t"
-    "lwc1       %[f6],        24(%[a])                                  \n\t"
-    "lwc1       %[f7],        28(%[a])                                  \n\t"
-    "add.s      %[f8],        %[f0],        %[f2]                       \n\t"
-    "sub.s      %[f0],        %[f0],        %[f2]                       \n\t"
-    "add.s      %[f2],        %[f4],        %[f6]                       \n\t"
-    "sub.s      %[f4],        %[f4],        %[f6]                       \n\t"
-    "add.s      %[f6],        %[f1],        %[f3]                       \n\t"
-    "sub.s      %[f1],        %[f1],        %[f3]                       \n\t"
-    "add.s      %[f3],        %[f5],        %[f7]                       \n\t"
-    "sub.s      %[f5],        %[f5],        %[f7]                       \n\t"
-    "add.s      %[f7],        %[f8],        %[f2]                       \n\t"
-    "sub.s      %[f8],        %[f8],        %[f2]                       \n\t"
-    "sub.s      %[f2],        %[f1],        %[f4]                       \n\t"
-    "add.s      %[f1],        %[f1],        %[f4]                       \n\t"
-    "add.s      %[f4],        %[f6],        %[f3]                       \n\t"
-    "sub.s      %[f6],        %[f6],        %[f3]                       \n\t"
-    "sub.s      %[f3],        %[f0],        %[f5]                       \n\t"
-    "add.s      %[f0],        %[f0],        %[f5]                       \n\t"
-    "swc1       %[f7],        0(%[a])                                   \n\t"
-    "swc1       %[f8],        16(%[a])                                  \n\t"
-    "swc1       %[f2],        28(%[a])                                  \n\t"
-    "swc1       %[f1],        12(%[a])                                  \n\t"
-    "swc1       %[f4],        4(%[a])                                   \n\t"
-    "swc1       %[f6],        20(%[a])                                  \n\t"
-    "swc1       %[f3],        8(%[a])                                   \n\t"
-    "swc1       %[f0],        24(%[a])                                  \n\t"
-    // second 8
-    "lwc1       %[f0],        32(%[a])                                  \n\t"
-    "lwc1       %[f1],        36(%[a])                                  \n\t"
-    "lwc1       %[f2],        40(%[a])                                  \n\t"
-    "lwc1       %[f3],        44(%[a])                                  \n\t"
-    "lwc1       %[f4],        48(%[a])                                  \n\t"
-    "lwc1       %[f5],        52(%[a])                                  \n\t"
-    "lwc1       %[f6],        56(%[a])                                  \n\t"
-    "lwc1       %[f7],        60(%[a])                                  \n\t"
-    "add.s      %[f8],        %[f4],        %[f6]                       \n\t"
-    "sub.s      %[f4],        %[f4],        %[f6]                       \n\t"
-    "add.s      %[f6],        %[f1],        %[f3]                       \n\t"
-    "sub.s      %[f1],        %[f1],        %[f3]                       \n\t"
-    "add.s      %[f3],        %[f0],        %[f2]                       \n\t"
-    "sub.s      %[f0],        %[f0],        %[f2]                       \n\t"
-    "add.s      %[f2],        %[f5],        %[f7]                       \n\t"
-    "sub.s      %[f5],        %[f5],        %[f7]                       \n\t"
-    "add.s      %[f7],        %[f4],        %[f1]                       \n\t"
-    "sub.s      %[f4],        %[f4],        %[f1]                       \n\t"
-    "add.s      %[f1],        %[f3],        %[f8]                       \n\t"
-    "sub.s      %[f3],        %[f3],        %[f8]                       \n\t"
-    "sub.s      %[f8],        %[f0],        %[f5]                       \n\t"
-    "add.s      %[f0],        %[f0],        %[f5]                       \n\t"
-    "add.s      %[f5],        %[f6],        %[f2]                       \n\t"
-    "sub.s      %[f6],        %[f2],        %[f6]                       \n\t"
-    "lwc1       %[f9],        8(%[rdft_w])                              \n\t"
-    "sub.s      %[f2],        %[f8],        %[f7]                       \n\t"
-    "add.s      %[f8],        %[f8],        %[f7]                       \n\t"
-    "sub.s      %[f7],        %[f4],        %[f0]                       \n\t"
-    "add.s      %[f4],        %[f4],        %[f0]                       \n\t"
-    // prepare for loop
-    "addiu      %[a_ptr],     %[a],         64                          \n\t"
-    "addiu      %[p1_rdft],   %[rdft_w],    8                           \n\t"
-    "addiu      %[p2_rdft],   %[rdft_w],    16                          \n\t"
-    "addiu      %[count],     $zero,        7                           \n\t"
-    // finish second 8
-    "mul.s      %[f2],        %[f9],        %[f2]                       \n\t"
-    "mul.s      %[f8],        %[f9],        %[f8]                       \n\t"
-    "mul.s      %[f7],        %[f9],        %[f7]                       \n\t"
-    "mul.s      %[f4],        %[f9],        %[f4]                       \n\t"
-    "swc1       %[f1],        32(%[a])                                  \n\t"
-    "swc1       %[f3],        52(%[a])                                  \n\t"
-    "swc1       %[f5],        36(%[a])                                  \n\t"
-    "swc1       %[f6],        48(%[a])                                  \n\t"
-    "swc1       %[f2],        40(%[a])                                  \n\t"
-    "swc1       %[f8],        44(%[a])                                  \n\t"
-    "swc1       %[f7],        56(%[a])                                  \n\t"
-    "swc1       %[f4],        60(%[a])                                  \n\t"
-    // loop
-   "1:                                                                  \n\t"
-    "lwc1       %[f0],        0(%[a_ptr])                               \n\t"
-    "lwc1       %[f1],        4(%[a_ptr])                               \n\t"
-    "lwc1       %[f2],        8(%[a_ptr])                               \n\t"
-    "lwc1       %[f3],        12(%[a_ptr])                              \n\t"
-    "lwc1       %[f4],        16(%[a_ptr])                              \n\t"
-    "lwc1       %[f5],        20(%[a_ptr])                              \n\t"
-    "lwc1       %[f6],        24(%[a_ptr])                              \n\t"
-    "lwc1       %[f7],        28(%[a_ptr])                              \n\t"
-    "add.s      %[f8],        %[f0],        %[f2]                       \n\t"
-    "sub.s      %[f0],        %[f0],        %[f2]                       \n\t"
-    "add.s      %[f2],        %[f4],        %[f6]                       \n\t"
-    "sub.s      %[f4],        %[f4],        %[f6]                       \n\t"
-    "add.s      %[f6],        %[f1],        %[f3]                       \n\t"
-    "sub.s      %[f1],        %[f1],        %[f3]                       \n\t"
-    "add.s      %[f3],        %[f5],        %[f7]                       \n\t"
-    "sub.s      %[f5],        %[f5],        %[f7]                       \n\t"
-    "lwc1       %[f10],       4(%[p1_rdft])                             \n\t"
-    "lwc1       %[f11],       0(%[p2_rdft])                             \n\t"
-    "lwc1       %[f12],       4(%[p2_rdft])                             \n\t"
-    "lwc1       %[f13],       8(%[first])                               \n\t"
-    "lwc1       %[f14],       12(%[first])                              \n\t"
-    "add.s      %[f7],        %[f8],        %[f2]                       \n\t"
-    "sub.s      %[f8],        %[f8],        %[f2]                       \n\t"
-    "add.s      %[f2],        %[f6],        %[f3]                       \n\t"
-    "sub.s      %[f6],        %[f6],        %[f3]                       \n\t"
-    "add.s      %[f3],        %[f0],        %[f5]                       \n\t"
-    "sub.s      %[f0],        %[f0],        %[f5]                       \n\t"
-    "add.s      %[f5],        %[f1],        %[f4]                       \n\t"
-    "sub.s      %[f1],        %[f1],        %[f4]                       \n\t"
-    "swc1       %[f7],        0(%[a_ptr])                               \n\t"
-    "swc1       %[f2],        4(%[a_ptr])                               \n\t"
-    "mul.s      %[f4],        %[f9],        %[f8]                       \n\t"
-#if defined(MIPS32_R2_LE)
-    "mul.s      %[f8],        %[f10],       %[f8]                       \n\t"
-    "mul.s      %[f7],        %[f11],       %[f0]                       \n\t"
-    "mul.s      %[f0],        %[f12],       %[f0]                       \n\t"
-    "mul.s      %[f2],        %[f13],       %[f3]                       \n\t"
-    "mul.s      %[f3],        %[f14],       %[f3]                       \n\t"
-    "nmsub.s    %[f4],        %[f4],        %[f10],       %[f6]         \n\t"
-    "madd.s     %[f8],        %[f8],        %[f9],        %[f6]         \n\t"
-    "nmsub.s    %[f7],        %[f7],        %[f12],       %[f5]         \n\t"
-    "madd.s     %[f0],        %[f0],        %[f11],       %[f5]         \n\t"
-    "nmsub.s    %[f2],        %[f2],        %[f14],       %[f1]         \n\t"
-    "madd.s     %[f3],        %[f3],        %[f13],       %[f1]         \n\t"
-#else
-    "mul.s      %[f7],        %[f10],       %[f6]                       \n\t"
-    "mul.s      %[f6],        %[f9],        %[f6]                       \n\t"
-    "mul.s      %[f8],        %[f10],       %[f8]                       \n\t"
-    "mul.s      %[f2],        %[f11],       %[f0]                       \n\t"
-    "mul.s      %[f11],       %[f11],       %[f5]                       \n\t"
-    "mul.s      %[f5],        %[f12],       %[f5]                       \n\t"
-    "mul.s      %[f0],        %[f12],       %[f0]                       \n\t"
-    "mul.s      %[f12],       %[f13],       %[f3]                       \n\t"
-    "mul.s      %[f13],       %[f13],       %[f1]                       \n\t"
-    "mul.s      %[f1],        %[f14],       %[f1]                       \n\t"
-    "mul.s      %[f3],        %[f14],       %[f3]                       \n\t"
-    "sub.s      %[f4],        %[f4],        %[f7]                       \n\t"
-    "add.s      %[f8],        %[f6],        %[f8]                       \n\t"
-    "sub.s      %[f7],        %[f2],        %[f5]                       \n\t"
-    "add.s      %[f0],        %[f11],       %[f0]                       \n\t"
-    "sub.s      %[f2],        %[f12],       %[f1]                       \n\t"
-    "add.s      %[f3],        %[f13],       %[f3]                       \n\t"
-#endif
-    "swc1       %[f4],        16(%[a_ptr])                              \n\t"
-    "swc1       %[f8],        20(%[a_ptr])                              \n\t"
-    "swc1       %[f7],        8(%[a_ptr])                               \n\t"
-    "swc1       %[f0],        12(%[a_ptr])                              \n\t"
-    "swc1       %[f2],        24(%[a_ptr])                              \n\t"
-    "swc1       %[f3],        28(%[a_ptr])                              \n\t"
-    "lwc1       %[f0],        32(%[a_ptr])                              \n\t"
-    "lwc1       %[f1],        36(%[a_ptr])                              \n\t"
-    "lwc1       %[f2],        40(%[a_ptr])                              \n\t"
-    "lwc1       %[f3],        44(%[a_ptr])                              \n\t"
-    "lwc1       %[f4],        48(%[a_ptr])                              \n\t"
-    "lwc1       %[f5],        52(%[a_ptr])                              \n\t"
-    "lwc1       %[f6],        56(%[a_ptr])                              \n\t"
-    "lwc1       %[f7],        60(%[a_ptr])                              \n\t"
-    "add.s      %[f8],        %[f0],        %[f2]                       \n\t"
-    "sub.s      %[f0],        %[f0],        %[f2]                       \n\t"
-    "add.s      %[f2],        %[f4],        %[f6]                       \n\t"
-    "sub.s      %[f4],        %[f4],        %[f6]                       \n\t"
-    "add.s      %[f6],        %[f1],        %[f3]                       \n\t"
-    "sub.s      %[f1],        %[f1],        %[f3]                       \n\t"
-    "add.s      %[f3],        %[f5],        %[f7]                       \n\t"
-    "sub.s      %[f5],        %[f5],        %[f7]                       \n\t"
-    "lwc1       %[f11],       8(%[p2_rdft])                             \n\t"
-    "lwc1       %[f12],       12(%[p2_rdft])                            \n\t"
-    "lwc1       %[f13],       8(%[second])                              \n\t"
-    "lwc1       %[f14],       12(%[second])                             \n\t"
-    "add.s      %[f7],        %[f8],        %[f2]                       \n\t"
-    "sub.s      %[f8],        %[f2],        %[f8]                       \n\t"
-    "add.s      %[f2],        %[f6],        %[f3]                       \n\t"
-    "sub.s      %[f6],        %[f3],        %[f6]                       \n\t"
-    "add.s      %[f3],        %[f0],        %[f5]                       \n\t"
-    "sub.s      %[f0],        %[f0],        %[f5]                       \n\t"
-    "add.s      %[f5],        %[f1],        %[f4]                       \n\t"
-    "sub.s      %[f1],        %[f1],        %[f4]                       \n\t"
-    "swc1       %[f7],        32(%[a_ptr])                              \n\t"
-    "swc1       %[f2],        36(%[a_ptr])                              \n\t"
-    "mul.s      %[f4],        %[f10],       %[f8]                       \n\t"
-#if defined(MIPS32_R2_LE)
-    "mul.s      %[f10],       %[f10],       %[f6]                       \n\t"
-    "mul.s      %[f7],        %[f11],       %[f0]                       \n\t"
-    "mul.s      %[f11],       %[f11],       %[f5]                       \n\t"
-    "mul.s      %[f2],        %[f13],       %[f3]                       \n\t"
-    "mul.s      %[f13],       %[f13],       %[f1]                       \n\t"
-    "madd.s     %[f4],        %[f4],        %[f9],        %[f6]         \n\t"
-    "nmsub.s    %[f10],       %[f10],       %[f9],        %[f8]         \n\t"
-    "nmsub.s    %[f7],        %[f7],        %[f12],       %[f5]         \n\t"
-    "madd.s     %[f11],       %[f11],       %[f12],       %[f0]         \n\t"
-    "nmsub.s    %[f2],        %[f2],        %[f14],       %[f1]         \n\t"
-    "madd.s     %[f13],       %[f13],       %[f14],       %[f3]         \n\t"
-#else
-    "mul.s      %[f2],        %[f9],        %[f6]                       \n\t"
-    "mul.s      %[f10],       %[f10],       %[f6]                       \n\t"
-    "mul.s      %[f9],        %[f9],        %[f8]                       \n\t"
-    "mul.s      %[f7],        %[f11],       %[f0]                       \n\t"
-    "mul.s      %[f8],        %[f12],       %[f5]                       \n\t"
-    "mul.s      %[f11],       %[f11],       %[f5]                       \n\t"
-    "mul.s      %[f12],       %[f12],       %[f0]                       \n\t"
-    "mul.s      %[f5],        %[f13],       %[f3]                       \n\t"
-    "mul.s      %[f0],        %[f14],       %[f1]                       \n\t"
-    "mul.s      %[f13],       %[f13],       %[f1]                       \n\t"
-    "mul.s      %[f14],       %[f14],       %[f3]                       \n\t"
-    "add.s      %[f4],        %[f4],        %[f2]                       \n\t"
-    "sub.s      %[f10],       %[f10],       %[f9]                       \n\t"
-    "sub.s      %[f7],        %[f7],        %[f8]                       \n\t"
-    "add.s      %[f11],       %[f11],       %[f12]                      \n\t"
-    "sub.s      %[f2],        %[f5],        %[f0]                       \n\t"
-    "add.s      %[f13],       %[f13],       %[f14]                      \n\t"
-#endif
-    "swc1       %[f4],        48(%[a_ptr])                              \n\t"
-    "swc1       %[f10],       52(%[a_ptr])                              \n\t"
-    "swc1       %[f7],        40(%[a_ptr])                              \n\t"
-    "swc1       %[f11],       44(%[a_ptr])                              \n\t"
-    "swc1       %[f2],        56(%[a_ptr])                              \n\t"
-    "swc1       %[f13],       60(%[a_ptr])                              \n\t"
-    "addiu      %[count],     %[count],     -1                          \n\t"
-    "lwc1       %[f9],        8(%[p1_rdft])                             \n\t"
-    "addiu      %[a_ptr],     %[a_ptr],     64                          \n\t"
-    "addiu      %[p1_rdft],   %[p1_rdft],   8                           \n\t"
-    "addiu      %[p2_rdft],   %[p2_rdft],   16                          \n\t"
-    "addiu      %[first],     %[first],     8                           \n\t"
-    "bgtz       %[count],     1b                                        \n\t"
-    " addiu     %[second],    %[second],    8                           \n\t"
-    ".set       pop                                                     \n\t"
-    : [f0] "=&f" (f0), [f1] "=&f" (f1), [f2] "=&f" (f2), [f3] "=&f" (f3),
-      [f4] "=&f" (f4), [f5] "=&f" (f5), [f6] "=&f" (f6), [f7] "=&f" (f7),
-      [f8] "=&f" (f8), [f9] "=&f" (f9), [f10] "=&f" (f10), [f11] "=&f" (f11),
-      [f12] "=&f" (f12), [f13] "=&f" (f13), [f14] "=&f" (f14),
-      [a_ptr] "=&r" (a_ptr), [p1_rdft] "=&r" (p1_rdft), [first] "+r" (first),
-      [p2_rdft] "=&r" (p2_rdft), [count] "=&r" (count), [second] "+r" (second)
-    : [a] "r" (a), [rdft_w] "r" (rdft_w)
-    : "memory"
-  );
-}
-
-void cftmdl_128_mips(float* a) {
-  float f0, f1, f2, f3, f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14;
-  int tmp_a, count;
-  __asm __volatile (
-    ".set       push                                      \n\t"
-    ".set       noreorder                                 \n\t"
-    "addiu      %[tmp_a],   %[a],         0               \n\t"
-    "addiu      %[count],   $zero,        4               \n\t"
-   "1:                                                    \n\t"
-    "addiu      %[count],   %[count],     -1              \n\t"
-    "lwc1       %[f0],      0(%[tmp_a])                   \n\t"
-    "lwc1       %[f2],      32(%[tmp_a])                  \n\t"
-    "lwc1       %[f4],      64(%[tmp_a])                  \n\t"
-    "lwc1       %[f6],      96(%[tmp_a])                  \n\t"
-    "lwc1       %[f1],      4(%[tmp_a])                   \n\t"
-    "lwc1       %[f3],      36(%[tmp_a])                  \n\t"
-    "lwc1       %[f5],      68(%[tmp_a])                  \n\t"
-    "lwc1       %[f7],      100(%[tmp_a])                 \n\t"
-    "add.s      %[f8],      %[f0],        %[f2]           \n\t"
-    "sub.s      %[f0],      %[f0],        %[f2]           \n\t"
-    "add.s      %[f2],      %[f4],        %[f6]           \n\t"
-    "sub.s      %[f4],      %[f4],        %[f6]           \n\t"
-    "add.s      %[f6],      %[f1],        %[f3]           \n\t"
-    "sub.s      %[f1],      %[f1],        %[f3]           \n\t"
-    "add.s      %[f3],      %[f5],        %[f7]           \n\t"
-    "sub.s      %[f5],      %[f5],        %[f7]           \n\t"
-    "add.s      %[f7],      %[f8],        %[f2]           \n\t"
-    "sub.s      %[f8],      %[f8],        %[f2]           \n\t"
-    "add.s      %[f2],      %[f1],        %[f4]           \n\t"
-    "sub.s      %[f1],      %[f1],        %[f4]           \n\t"
-    "add.s      %[f4],      %[f6],        %[f3]           \n\t"
-    "sub.s      %[f6],      %[f6],        %[f3]           \n\t"
-    "sub.s      %[f3],      %[f0],        %[f5]           \n\t"
-    "add.s      %[f0],      %[f0],        %[f5]           \n\t"
-    "swc1       %[f7],      0(%[tmp_a])                   \n\t"
-    "swc1       %[f8],      64(%[tmp_a])                  \n\t"
-    "swc1       %[f2],      36(%[tmp_a])                  \n\t"
-    "swc1       %[f1],      100(%[tmp_a])                 \n\t"
-    "swc1       %[f4],      4(%[tmp_a])                   \n\t"
-    "swc1       %[f6],      68(%[tmp_a])                  \n\t"
-    "swc1       %[f3],      32(%[tmp_a])                  \n\t"
-    "swc1       %[f0],      96(%[tmp_a])                  \n\t"
-    "bgtz       %[count],   1b                            \n\t"
-    " addiu     %[tmp_a],   %[tmp_a],     8               \n\t"
-    ".set       pop                                       \n\t"
-    : [f0] "=&f" (f0), [f1] "=&f" (f1), [f2] "=&f" (f2), [f3] "=&f" (f3),
-      [f4] "=&f" (f4), [f5] "=&f" (f5), [f6] "=&f" (f6), [f7] "=&f" (f7),
-      [f8] "=&f" (f8), [tmp_a] "=&r" (tmp_a), [count] "=&r" (count)
-    : [a] "r" (a)
-    : "memory"
-  );
-  f9 = rdft_w[2];
-  __asm __volatile (
-    ".set       push                                      \n\t"
-    ".set       noreorder                                 \n\t"
-    "addiu      %[tmp_a],   %[a],         128             \n\t"
-    "addiu      %[count],   $zero,        4               \n\t"
-   "1:                                                    \n\t"
-    "addiu      %[count],   %[count],     -1              \n\t"
-    "lwc1       %[f0],      0(%[tmp_a])                   \n\t"
-    "lwc1       %[f2],      32(%[tmp_a])                  \n\t"
-    "lwc1       %[f5],      68(%[tmp_a])                  \n\t"
-    "lwc1       %[f7],      100(%[tmp_a])                 \n\t"
-    "lwc1       %[f1],      4(%[tmp_a])                   \n\t"
-    "lwc1       %[f3],      36(%[tmp_a])                  \n\t"
-    "lwc1       %[f4],      64(%[tmp_a])                  \n\t"
-    "lwc1       %[f6],      96(%[tmp_a])                  \n\t"
-    "sub.s      %[f8],      %[f0],        %[f2]           \n\t"
-    "add.s      %[f0],      %[f0],        %[f2]           \n\t"
-    "sub.s      %[f2],      %[f5],        %[f7]           \n\t"
-    "add.s      %[f5],      %[f5],        %[f7]           \n\t"
-    "sub.s      %[f7],      %[f1],        %[f3]           \n\t"
-    "add.s      %[f1],      %[f1],        %[f3]           \n\t"
-    "sub.s      %[f3],      %[f4],        %[f6]           \n\t"
-    "add.s      %[f4],      %[f4],        %[f6]           \n\t"
-    "sub.s      %[f6],      %[f8],        %[f2]           \n\t"
-    "add.s      %[f8],      %[f8],        %[f2]           \n\t"
-    "add.s      %[f2],      %[f5],        %[f1]           \n\t"
-    "sub.s      %[f5],      %[f5],        %[f1]           \n\t"
-    "add.s      %[f1],      %[f3],        %[f7]           \n\t"
-    "sub.s      %[f3],      %[f3],        %[f7]           \n\t"
-    "add.s      %[f7],      %[f0],        %[f4]           \n\t"
-    "sub.s      %[f0],      %[f0],        %[f4]           \n\t"
-    "sub.s      %[f4],      %[f6],        %[f1]           \n\t"
-    "add.s      %[f6],      %[f6],        %[f1]           \n\t"
-    "sub.s      %[f1],      %[f3],        %[f8]           \n\t"
-    "add.s      %[f3],      %[f3],        %[f8]           \n\t"
-    "mul.s      %[f4],      %[f4],        %[f9]           \n\t"
-    "mul.s      %[f6],      %[f6],        %[f9]           \n\t"
-    "mul.s      %[f1],      %[f1],        %[f9]           \n\t"
-    "mul.s      %[f3],      %[f3],        %[f9]           \n\t"
-    "swc1       %[f7],      0(%[tmp_a])                   \n\t"
-    "swc1       %[f2],      4(%[tmp_a])                   \n\t"
-    "swc1       %[f5],      64(%[tmp_a])                  \n\t"
-    "swc1       %[f0],      68(%[tmp_a])                  \n\t"
-    "swc1       %[f4],      32(%[tmp_a])                  \n\t"
-    "swc1       %[f6],      36(%[tmp_a])                  \n\t"
-    "swc1       %[f1],      96(%[tmp_a])                  \n\t"
-    "swc1       %[f3],      100(%[tmp_a])                 \n\t"
-    "bgtz       %[count],   1b                            \n\t"
-    " addiu     %[tmp_a],   %[tmp_a],     8               \n\t"
-    ".set       pop                                       \n\t"
-    : [f0] "=&f" (f0), [f1] "=&f" (f1), [f2] "=&f" (f2), [f3] "=&f" (f3),
-      [f4] "=&f" (f4), [f5] "=&f" (f5), [f6] "=&f" (f6), [f7] "=&f" (f7),
-      [f8] "=&f" (f8), [tmp_a] "=&r" (tmp_a), [count] "=&r" (count)
-    : [a] "r" (a), [f9] "f" (f9)
-    : "memory"
-  );
-  f10 = rdft_w[3];
-  f11 = rdft_w[4];
-  f12 = rdft_w[5];
-  f13 = rdft_wk3ri_first[2];
-  f14 = rdft_wk3ri_first[3];
-
-  __asm __volatile (
-    ".set       push                                                    \n\t"
-    ".set       noreorder                                               \n\t"
-    "addiu      %[tmp_a],     %[a],         256                         \n\t"
-    "addiu      %[count],     $zero,        4                           \n\t"
-   "1:                                                                  \n\t"
-    "addiu      %[count],     %[count],     -1                          \n\t"
-    "lwc1       %[f0],        0(%[tmp_a])                               \n\t"
-    "lwc1       %[f2],        32(%[tmp_a])                              \n\t"
-    "lwc1       %[f4],        64(%[tmp_a])                              \n\t"
-    "lwc1       %[f6],        96(%[tmp_a])                              \n\t"
-    "lwc1       %[f1],        4(%[tmp_a])                               \n\t"
-    "lwc1       %[f3],        36(%[tmp_a])                              \n\t"
-    "lwc1       %[f5],        68(%[tmp_a])                              \n\t"
-    "lwc1       %[f7],        100(%[tmp_a])                             \n\t"
-    "add.s      %[f8],        %[f0],        %[f2]                       \n\t"
-    "sub.s      %[f0],        %[f0],        %[f2]                       \n\t"
-    "add.s      %[f2],        %[f4],        %[f6]                       \n\t"
-    "sub.s      %[f4],        %[f4],        %[f6]                       \n\t"
-    "add.s      %[f6],        %[f1],        %[f3]                       \n\t"
-    "sub.s      %[f1],        %[f1],        %[f3]                       \n\t"
-    "add.s      %[f3],        %[f5],        %[f7]                       \n\t"
-    "sub.s      %[f5],        %[f5],        %[f7]                       \n\t"
-    "sub.s      %[f7],        %[f8],        %[f2]                       \n\t"
-    "add.s      %[f8],        %[f8],        %[f2]                       \n\t"
-    "add.s      %[f2],        %[f1],        %[f4]                       \n\t"
-    "sub.s      %[f1],        %[f1],        %[f4]                       \n\t"
-    "sub.s      %[f4],        %[f6],        %[f3]                       \n\t"
-    "add.s      %[f6],        %[f6],        %[f3]                       \n\t"
-    "sub.s      %[f3],        %[f0],        %[f5]                       \n\t"
-    "add.s      %[f0],        %[f0],        %[f5]                       \n\t"
-    "swc1       %[f8],        0(%[tmp_a])                               \n\t"
-    "swc1       %[f6],        4(%[tmp_a])                               \n\t"
-    "mul.s      %[f5],        %[f9],        %[f7]                       \n\t"
-#if defined(MIPS32_R2_LE)
-    "mul.s      %[f7],        %[f10],       %[f7]                       \n\t"
-    "mul.s      %[f8],        %[f11],       %[f3]                       \n\t"
-    "mul.s      %[f3],        %[f12],       %[f3]                       \n\t"
-    "mul.s      %[f6],        %[f13],       %[f0]                       \n\t"
-    "mul.s      %[f0],        %[f14],       %[f0]                       \n\t"
-    "nmsub.s    %[f5],        %[f5],        %[f10],       %[f4]         \n\t"
-    "madd.s     %[f7],        %[f7],        %[f9],        %[f4]         \n\t"
-    "nmsub.s    %[f8],        %[f8],        %[f12],       %[f2]         \n\t"
-    "madd.s     %[f3],        %[f3],        %[f11],       %[f2]         \n\t"
-    "nmsub.s    %[f6],        %[f6],        %[f14],       %[f1]         \n\t"
-    "madd.s     %[f0],        %[f0],        %[f13],       %[f1]         \n\t"
-    "swc1       %[f5],        64(%[tmp_a])                              \n\t"
-    "swc1       %[f7],        68(%[tmp_a])                              \n\t"
-#else
-    "mul.s      %[f8],        %[f10],       %[f4]                       \n\t"
-    "mul.s      %[f4],        %[f9],        %[f4]                       \n\t"
-    "mul.s      %[f7],        %[f10],       %[f7]                       \n\t"
-    "mul.s      %[f6],        %[f11],       %[f3]                       \n\t"
-    "mul.s      %[f3],        %[f12],       %[f3]                       \n\t"
-    "sub.s      %[f5],        %[f5],        %[f8]                       \n\t"
-    "mul.s      %[f8],        %[f12],       %[f2]                       \n\t"
-    "mul.s      %[f2],        %[f11],       %[f2]                       \n\t"
-    "add.s      %[f7],        %[f4],        %[f7]                       \n\t"
-    "mul.s      %[f4],        %[f13],       %[f0]                       \n\t"
-    "mul.s      %[f0],        %[f14],       %[f0]                       \n\t"
-    "sub.s      %[f8],        %[f6],        %[f8]                       \n\t"
-    "mul.s      %[f6],        %[f14],       %[f1]                       \n\t"
-    "mul.s      %[f1],        %[f13],       %[f1]                       \n\t"
-    "add.s      %[f3],        %[f2],        %[f3]                       \n\t"
-    "swc1       %[f5],        64(%[tmp_a])                              \n\t"
-    "swc1       %[f7],        68(%[tmp_a])                              \n\t"
-    "sub.s      %[f6],        %[f4],        %[f6]                       \n\t"
-    "add.s      %[f0],        %[f1],        %[f0]                       \n\t"
-#endif
-    "swc1       %[f8],        32(%[tmp_a])                              \n\t"
-    "swc1       %[f3],        36(%[tmp_a])                              \n\t"
-    "swc1       %[f6],        96(%[tmp_a])                              \n\t"
-    "swc1       %[f0],        100(%[tmp_a])                             \n\t"
-    "bgtz       %[count],     1b                                        \n\t"
-    " addiu     %[tmp_a],     %[tmp_a],     8                           \n\t"
-    ".set       pop                                                     \n\t"
-    : [f0] "=&f" (f0), [f1] "=&f" (f1), [f2] "=&f" (f2), [f3] "=&f" (f3),
-      [f4] "=&f" (f4), [f5] "=&f" (f5), [f6] "=&f" (f6), [f7] "=&f" (f7),
-      [f8] "=&f" (f8), [tmp_a] "=&r" (tmp_a), [count] "=&r" (count)
-    : [a] "r" (a),  [f9] "f" (f9), [f10] "f" (f10), [f11] "f" (f11),
-      [f12] "f" (f12), [f13] "f" (f13), [f14] "f" (f14)
-    : "memory"
-  );
-  f11 = rdft_w[6];
-  f12 = rdft_w[7];
-  f13 = rdft_wk3ri_second[2];
-  f14 = rdft_wk3ri_second[3];
-  __asm __volatile (
-    ".set       push                                                       \n\t"
-    ".set       noreorder                                                  \n\t"
-    "addiu      %[tmp_a],       %[a],           384                        \n\t"
-    "addiu      %[count],       $zero,          4                          \n\t"
-   "1:                                                                     \n\t"
-    "addiu      %[count],       %[count],       -1                         \n\t"
-    "lwc1       %[f0],          0(%[tmp_a])                                \n\t"
-    "lwc1       %[f1],          4(%[tmp_a])                                \n\t"
-    "lwc1       %[f2],          32(%[tmp_a])                               \n\t"
-    "lwc1       %[f3],          36(%[tmp_a])                               \n\t"
-    "lwc1       %[f4],          64(%[tmp_a])                               \n\t"
-    "lwc1       %[f5],          68(%[tmp_a])                               \n\t"
-    "lwc1       %[f6],          96(%[tmp_a])                               \n\t"
-    "lwc1       %[f7],          100(%[tmp_a])                              \n\t"
-    "add.s      %[f8],          %[f0],          %[f2]                      \n\t"
-    "sub.s      %[f0],          %[f0],          %[f2]                      \n\t"
-    "add.s      %[f2],          %[f4],          %[f6]                      \n\t"
-    "sub.s      %[f4],          %[f4],          %[f6]                      \n\t"
-    "add.s      %[f6],          %[f1],          %[f3]                      \n\t"
-    "sub.s      %[f1],          %[f1],          %[f3]                      \n\t"
-    "add.s      %[f3],          %[f5],          %[f7]                      \n\t"
-    "sub.s      %[f5],          %[f5],          %[f7]                      \n\t"
-    "sub.s      %[f7],          %[f2],          %[f8]                      \n\t"
-    "add.s      %[f2],          %[f2],          %[f8]                      \n\t"
-    "add.s      %[f8],          %[f1],          %[f4]                      \n\t"
-    "sub.s      %[f1],          %[f1],          %[f4]                      \n\t"
-    "sub.s      %[f4],          %[f3],          %[f6]                      \n\t"
-    "add.s      %[f3],          %[f3],          %[f6]                      \n\t"
-    "sub.s      %[f6],          %[f0],          %[f5]                      \n\t"
-    "add.s      %[f0],          %[f0],          %[f5]                      \n\t"
-    "swc1       %[f2],          0(%[tmp_a])                                \n\t"
-    "swc1       %[f3],          4(%[tmp_a])                                \n\t"
-    "mul.s      %[f5],          %[f10],         %[f7]                      \n\t"
-#if defined(MIPS32_R2_LE)
-    "mul.s      %[f7],          %[f9],          %[f7]                      \n\t"
-    "mul.s      %[f2],          %[f12],         %[f8]                      \n\t"
-    "mul.s      %[f8],          %[f11],         %[f8]                      \n\t"
-    "mul.s      %[f3],          %[f14],         %[f1]                      \n\t"
-    "mul.s      %[f1],          %[f13],         %[f1]                      \n\t"
-    "madd.s     %[f5],          %[f5],          %[f9],       %[f4]         \n\t"
-    "msub.s     %[f7],          %[f7],          %[f10],      %[f4]         \n\t"
-    "msub.s     %[f2],          %[f2],          %[f11],      %[f6]         \n\t"
-    "madd.s     %[f8],          %[f8],          %[f12],      %[f6]         \n\t"
-    "msub.s     %[f3],          %[f3],          %[f13],      %[f0]         \n\t"
-    "madd.s     %[f1],          %[f1],          %[f14],      %[f0]         \n\t"
-    "swc1       %[f5],          64(%[tmp_a])                               \n\t"
-    "swc1       %[f7],          68(%[tmp_a])                               \n\t"
-#else
-    "mul.s      %[f2],          %[f9],          %[f4]                      \n\t"
-    "mul.s      %[f4],          %[f10],         %[f4]                      \n\t"
-    "mul.s      %[f7],          %[f9],          %[f7]                      \n\t"
-    "mul.s      %[f3],          %[f11],         %[f6]                      \n\t"
-    "mul.s      %[f6],          %[f12],         %[f6]                      \n\t"
-    "add.s      %[f5],          %[f5],          %[f2]                      \n\t"
-    "sub.s      %[f7],          %[f4],          %[f7]                      \n\t"
-    "mul.s      %[f2],          %[f12],         %[f8]                      \n\t"
-    "mul.s      %[f8],          %[f11],         %[f8]                      \n\t"
-    "mul.s      %[f4],          %[f14],         %[f1]                      \n\t"
-    "mul.s      %[f1],          %[f13],         %[f1]                      \n\t"
-    "sub.s      %[f2],          %[f3],          %[f2]                      \n\t"
-    "mul.s      %[f3],          %[f13],         %[f0]                      \n\t"
-    "mul.s      %[f0],          %[f14],         %[f0]                      \n\t"
-    "add.s      %[f8],          %[f8],          %[f6]                      \n\t"
-    "swc1       %[f5],          64(%[tmp_a])                               \n\t"
-    "swc1       %[f7],          68(%[tmp_a])                               \n\t"
-    "sub.s      %[f3],          %[f3],          %[f4]                      \n\t"
-    "add.s      %[f1],          %[f1],          %[f0]                      \n\t"
-#endif
-    "swc1       %[f2],          32(%[tmp_a])                               \n\t"
-    "swc1       %[f8],          36(%[tmp_a])                               \n\t"
-    "swc1       %[f3],          96(%[tmp_a])                               \n\t"
-    "swc1       %[f1],          100(%[tmp_a])                              \n\t"
-    "bgtz       %[count],       1b                                         \n\t"
-    " addiu     %[tmp_a],       %[tmp_a],       8                          \n\t"
-    ".set       pop                                                        \n\t"
-    : [f0] "=&f" (f0), [f1] "=&f" (f1), [f2] "=&f" (f2), [f3] "=&f" (f3),
-      [f4] "=&f" (f4), [f5] "=&f" (f5), [f6] "=&f" (f6), [f7] "=&f" (f7),
-      [f8] "=&f" (f8), [tmp_a] "=&r" (tmp_a), [count] "=&r" (count)
-    : [a] "r" (a), [f9] "f" (f9), [f10] "f" (f10), [f11] "f" (f11),
-      [f12] "f" (f12), [f13] "f" (f13), [f14] "f" (f14)
-    : "memory"
-  );
-}
-
-void cftfsub_128_mips(float* a) {
-  float f0, f1, f2, f3, f4, f5, f6, f7, f8;
-  int tmp_a, count;
-
-  cft1st_128_mips(a);
-  cftmdl_128_mips(a);
-
-  __asm __volatile (
-    ".set       push                                      \n\t"
-    ".set       noreorder                                 \n\t"
-    "addiu      %[tmp_a],       %[a],         0           \n\t"
-    "addiu      %[count],       $zero,        16          \n\t"
-   "1:                                                    \n\t"
-    "addiu      %[count],       %[count],     -1          \n\t"
-    "lwc1       %[f0],          0(%[tmp_a])               \n\t"
-    "lwc1       %[f2],          128(%[tmp_a])             \n\t"
-    "lwc1       %[f4],          256(%[tmp_a])             \n\t"
-    "lwc1       %[f6],          384(%[tmp_a])             \n\t"
-    "lwc1       %[f1],          4(%[tmp_a])               \n\t"
-    "lwc1       %[f3],          132(%[tmp_a])             \n\t"
-    "lwc1       %[f5],          260(%[tmp_a])             \n\t"
-    "lwc1       %[f7],          388(%[tmp_a])             \n\t"
-    "add.s      %[f8],          %[f0],        %[f2]       \n\t"
-    "sub.s      %[f0],          %[f0],        %[f2]       \n\t"
-    "add.s      %[f2],          %[f4],        %[f6]       \n\t"
-    "sub.s      %[f4],          %[f4],        %[f6]       \n\t"
-    "add.s      %[f6],          %[f1],        %[f3]       \n\t"
-    "sub.s      %[f1],          %[f1],        %[f3]       \n\t"
-    "add.s      %[f3],          %[f5],        %[f7]       \n\t"
-    "sub.s      %[f5],          %[f5],        %[f7]       \n\t"
-    "add.s      %[f7],          %[f8],        %[f2]       \n\t"
-    "sub.s      %[f8],          %[f8],        %[f2]       \n\t"
-    "add.s      %[f2],          %[f1],        %[f4]       \n\t"
-    "sub.s      %[f1],          %[f1],        %[f4]       \n\t"
-    "add.s      %[f4],          %[f6],        %[f3]       \n\t"
-    "sub.s      %[f6],          %[f6],        %[f3]       \n\t"
-    "sub.s      %[f3],          %[f0],        %[f5]       \n\t"
-    "add.s      %[f0],          %[f0],        %[f5]       \n\t"
-    "swc1       %[f7],          0(%[tmp_a])               \n\t"
-    "swc1       %[f8],          256(%[tmp_a])             \n\t"
-    "swc1       %[f2],          132(%[tmp_a])             \n\t"
-    "swc1       %[f1],          388(%[tmp_a])             \n\t"
-    "swc1       %[f4],          4(%[tmp_a])               \n\t"
-    "swc1       %[f6],          260(%[tmp_a])             \n\t"
-    "swc1       %[f3],          128(%[tmp_a])             \n\t"
-    "swc1       %[f0],          384(%[tmp_a])             \n\t"
-    "bgtz       %[count],       1b                        \n\t"
-    " addiu     %[tmp_a],       %[tmp_a],   8             \n\t"
-    ".set       pop                                       \n\t"
-    : [f0] "=&f" (f0), [f1] "=&f" (f1), [f2] "=&f" (f2), [f3] "=&f" (f3),
-      [f4] "=&f" (f4), [f5] "=&f" (f5), [f6] "=&f" (f6), [f7] "=&f" (f7),
-      [f8] "=&f" (f8), [tmp_a] "=&r" (tmp_a),
-      [count] "=&r" (count)
-    : [a] "r" (a)
-    : "memory"
-  );
-}
-
-void cftbsub_128_mips(float* a) {
-  float f0, f1, f2, f3, f4, f5, f6, f7, f8;
-  int tmp_a, count;
-
-  cft1st_128_mips(a);
-  cftmdl_128_mips(a);
-
-  __asm __volatile (
-    ".set       push                                        \n\t"
-    ".set       noreorder                                   \n\t"
-    "addiu      %[tmp_a],   %[a],           0               \n\t"
-    "addiu      %[count],   $zero,          16              \n\t"
-   "1:                                                      \n\t"
-    "addiu      %[count],   %[count],       -1              \n\t"
-    "lwc1       %[f0],      0(%[tmp_a])                     \n\t"
-    "lwc1       %[f2],      128(%[tmp_a])                   \n\t"
-    "lwc1       %[f4],      256(%[tmp_a])                   \n\t"
-    "lwc1       %[f6],      384(%[tmp_a])                   \n\t"
-    "lwc1       %[f1],      4(%[tmp_a])                     \n\t"
-    "lwc1       %[f3],      132(%[tmp_a])                   \n\t"
-    "lwc1       %[f5],      260(%[tmp_a])                   \n\t"
-    "lwc1       %[f7],      388(%[tmp_a])                   \n\t"
-    "add.s      %[f8],      %[f0],          %[f2]           \n\t"
-    "sub.s      %[f0],      %[f0],          %[f2]           \n\t"
-    "add.s      %[f2],      %[f4],          %[f6]           \n\t"
-    "sub.s      %[f4],      %[f4],          %[f6]           \n\t"
-    "add.s      %[f6],      %[f1],          %[f3]           \n\t"
-    "sub.s      %[f1],      %[f3],          %[f1]           \n\t"
-    "add.s      %[f3],      %[f5],          %[f7]           \n\t"
-    "sub.s      %[f5],      %[f5],          %[f7]           \n\t"
-    "add.s      %[f7],      %[f8],          %[f2]           \n\t"
-    "sub.s      %[f8],      %[f8],          %[f2]           \n\t"
-    "sub.s      %[f2],      %[f1],          %[f4]           \n\t"
-    "add.s      %[f1],      %[f1],          %[f4]           \n\t"
-    "add.s      %[f4],      %[f3],          %[f6]           \n\t"
-    "sub.s      %[f6],      %[f3],          %[f6]           \n\t"
-    "sub.s      %[f3],      %[f0],          %[f5]           \n\t"
-    "add.s      %[f0],      %[f0],          %[f5]           \n\t"
-    "neg.s      %[f4],      %[f4]                           \n\t"
-    "swc1       %[f7],      0(%[tmp_a])                     \n\t"
-    "swc1       %[f8],      256(%[tmp_a])                   \n\t"
-    "swc1       %[f2],      132(%[tmp_a])                   \n\t"
-    "swc1       %[f1],      388(%[tmp_a])                   \n\t"
-    "swc1       %[f6],      260(%[tmp_a])                   \n\t"
-    "swc1       %[f3],      128(%[tmp_a])                   \n\t"
-    "swc1       %[f0],      384(%[tmp_a])                   \n\t"
-    "swc1       %[f4],       4(%[tmp_a])                     \n\t"
-    "bgtz       %[count],   1b                              \n\t"
-    " addiu     %[tmp_a],   %[tmp_a],       8               \n\t"
-    ".set       pop                                         \n\t"
-    : [f0] "=&f" (f0), [f1] "=&f" (f1), [f2] "=&f" (f2), [f3] "=&f" (f3),
-      [f4] "=&f" (f4), [f5] "=&f" (f5), [f6] "=&f" (f6), [f7] "=&f" (f7),
-      [f8] "=&f" (f8), [tmp_a] "=&r" (tmp_a), [count] "=&r" (count)
-    : [a] "r" (a)
-    : "memory"
-  );
-}
-
-void rftfsub_128_mips(float* a) {
-  const float* c = rdft_w + 32;
-  const float f0 = 0.5f;
-  float* a1 = &a[2];
-  float* a2 = &a[126];
-  const float* c1 = &c[1];
-  const float* c2 = &c[31];
-  float f1, f2, f3 ,f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15;
-  int count;
-
-  __asm __volatile (
-    ".set      push                                             \n\t"
-    ".set      noreorder                                        \n\t"
-    "lwc1      %[f6],       0(%[c2])                            \n\t"
-    "lwc1      %[f1],       0(%[a1])                            \n\t"
-    "lwc1      %[f2],       0(%[a2])                            \n\t"
-    "lwc1      %[f3],       4(%[a1])                            \n\t"
-    "lwc1      %[f4],       4(%[a2])                            \n\t"
-    "lwc1      %[f5],       0(%[c1])                            \n\t"
-    "sub.s     %[f6],       %[f0],        %[f6]                 \n\t"
-    "sub.s     %[f7],       %[f1],        %[f2]                 \n\t"
-    "add.s     %[f8],       %[f3],        %[f4]                 \n\t"
-    "addiu     %[count],    $zero,        15                    \n\t"
-    "mul.s     %[f9],       %[f6],        %[f7]                 \n\t"
-    "mul.s     %[f6],       %[f6],        %[f8]                 \n\t"
-#if !defined(MIPS32_R2_LE)
-    "mul.s     %[f8],       %[f5],        %[f8]                 \n\t"
-    "mul.s     %[f5],       %[f5],        %[f7]                 \n\t"
-    "sub.s     %[f9],       %[f9],        %[f8]                 \n\t"
-    "add.s     %[f6],       %[f6],        %[f5]                 \n\t"
-#else
-    "nmsub.s   %[f9],       %[f9],        %[f5],      %[f8]     \n\t"
-    "madd.s    %[f6],       %[f6],        %[f5],      %[f7]     \n\t"
-#endif
-    "sub.s     %[f1],       %[f1],        %[f9]                 \n\t"
-    "add.s     %[f2],       %[f2],        %[f9]                 \n\t"
-    "sub.s     %[f3],       %[f3],        %[f6]                 \n\t"
-    "sub.s     %[f4],       %[f4],        %[f6]                 \n\t"
-    "swc1      %[f1],       0(%[a1])                            \n\t"
-    "swc1      %[f2],       0(%[a2])                            \n\t"
-    "swc1      %[f3],       4(%[a1])                            \n\t"
-    "swc1      %[f4],       4(%[a2])                            \n\t"
-    "addiu     %[a1],       %[a1],        8                     \n\t"
-    "addiu     %[a2],       %[a2],        -8                    \n\t"
-    "addiu     %[c1],       %[c1],        4                     \n\t"
-    "addiu     %[c2],       %[c2],        -4                    \n\t"
-   "1:                                                          \n\t"
-    "lwc1      %[f6],       0(%[c2])                            \n\t"
-    "lwc1      %[f1],       0(%[a1])                            \n\t"
-    "lwc1      %[f2],       0(%[a2])                            \n\t"
-    "lwc1      %[f3],       4(%[a1])                            \n\t"
-    "lwc1      %[f4],       4(%[a2])                            \n\t"
-    "lwc1      %[f5],       0(%[c1])                            \n\t"
-    "sub.s     %[f6],       %[f0],        %[f6]                 \n\t"
-    "sub.s     %[f7],       %[f1],        %[f2]                 \n\t"
-    "add.s     %[f8],       %[f3],        %[f4]                 \n\t"
-    "lwc1      %[f10],      -4(%[c2])                           \n\t"
-    "lwc1      %[f11],      8(%[a1])                            \n\t"
-    "lwc1      %[f12],      -8(%[a2])                           \n\t"
-    "mul.s     %[f9],       %[f6],        %[f7]                 \n\t"
-    "mul.s     %[f6],       %[f6],        %[f8]                 \n\t"
-#if !defined(MIPS32_R2_LE)
-    "mul.s     %[f8],       %[f5],        %[f8]                 \n\t"
-    "mul.s     %[f5],       %[f5],        %[f7]                 \n\t"
-    "lwc1      %[f13],      12(%[a1])                           \n\t"
-    "lwc1      %[f14],      -4(%[a2])                           \n\t"
-    "lwc1      %[f15],      4(%[c1])                            \n\t"
-    "sub.s     %[f9],       %[f9],        %[f8]                 \n\t"
-    "add.s     %[f6],       %[f6],        %[f5]                 \n\t"
-#else
-    "lwc1      %[f13],      12(%[a1])                           \n\t"
-    "lwc1      %[f14],      -4(%[a2])                           \n\t"
-    "lwc1      %[f15],      4(%[c1])                            \n\t"
-    "nmsub.s   %[f9],       %[f9],        %[f5],      %[f8]     \n\t"
-    "madd.s    %[f6],       %[f6],        %[f5],      %[f7]     \n\t"
-#endif
-    "sub.s     %[f10],      %[f0],        %[f10]                \n\t"
-    "sub.s     %[f5],       %[f11],       %[f12]                \n\t"
-    "add.s     %[f7],       %[f13],       %[f14]                \n\t"
-    "sub.s     %[f1],       %[f1],        %[f9]                 \n\t"
-    "add.s     %[f2],       %[f2],        %[f9]                 \n\t"
-    "sub.s     %[f3],       %[f3],        %[f6]                 \n\t"
-    "mul.s     %[f8],       %[f10],       %[f5]                 \n\t"
-    "mul.s     %[f10],      %[f10],       %[f7]                 \n\t"
-#if !defined(MIPS32_R2_LE)
-    "mul.s     %[f9],       %[f15],       %[f7]                 \n\t"
-    "mul.s     %[f15],      %[f15],       %[f5]                 \n\t"
-    "sub.s     %[f4],       %[f4],        %[f6]                 \n\t"
-    "swc1      %[f1],       0(%[a1])                            \n\t"
-    "swc1      %[f2],       0(%[a2])                            \n\t"
-    "sub.s     %[f8],       %[f8],        %[f9]                 \n\t"
-    "add.s     %[f10],      %[f10],       %[f15]                \n\t"
-#else
-    "swc1      %[f1],       0(%[a1])                            \n\t"
-    "swc1      %[f2],       0(%[a2])                            \n\t"
-    "sub.s     %[f4],       %[f4],        %[f6]                 \n\t"
-    "nmsub.s   %[f8],       %[f8],        %[f15],     %[f7]     \n\t"
-    "madd.s    %[f10],      %[f10],       %[f15],     %[f5]     \n\t"
-#endif
-    "swc1      %[f3],       4(%[a1])                            \n\t"
-    "swc1      %[f4],       4(%[a2])                            \n\t"
-    "sub.s     %[f11],      %[f11],       %[f8]                 \n\t"
-    "add.s     %[f12],      %[f12],       %[f8]                 \n\t"
-    "sub.s     %[f13],      %[f13],       %[f10]                \n\t"
-    "sub.s     %[f14],      %[f14],       %[f10]                \n\t"
-    "addiu     %[c2],       %[c2],        -8                    \n\t"
-    "addiu     %[c1],       %[c1],        8                     \n\t"
-    "swc1      %[f11],      8(%[a1])                            \n\t"
-    "swc1      %[f12],      -8(%[a2])                           \n\t"
-    "swc1      %[f13],      12(%[a1])                           \n\t"
-    "swc1      %[f14],      -4(%[a2])                           \n\t"
-    "addiu     %[a1],       %[a1],        16                    \n\t"
-    "addiu     %[count],    %[count],     -1                    \n\t"
-    "bgtz      %[count],    1b                                  \n\t"
-    " addiu    %[a2],       %[a2],        -16                   \n\t"
-    ".set      pop                                              \n\t"
-    : [a1] "+r" (a1), [a2] "+r" (a2), [c1] "+r" (c1), [c2] "+r" (c2),
-      [f1] "=&f" (f1), [f2] "=&f" (f2), [f3] "=&f" (f3), [f4] "=&f" (f4),
-      [f5] "=&f" (f5), [f6] "=&f" (f6), [f7] "=&f" (f7), [f8] "=&f" (f8),
-      [f9] "=&f" (f9), [f10] "=&f" (f10), [f11] "=&f" (f11), [f12] "=&f" (f12),
-      [f13] "=&f" (f13), [f14] "=&f" (f14), [f15] "=&f" (f15),
-      [count] "=&r" (count)
-    : [f0] "f" (f0)
-    : "memory"
-  );
-}
-
-void rftbsub_128_mips(float* a) {
-  const float *c = rdft_w + 32;
-  const float f0 = 0.5f;
-  float* a1 = &a[2];
-  float* a2 = &a[126];
-  const float* c1 = &c[1];
-  const float* c2 = &c[31];
-  float f1, f2, f3 ,f4, f5, f6, f7, f8, f9, f10, f11, f12, f13, f14, f15;
-  int count;
-
-  a[1] = -a[1];
-  a[65] = -a[65];
-
-  __asm __volatile (
-    ".set      push                                             \n\t"
-    ".set      noreorder                                        \n\t"
-    "lwc1      %[f6],       0(%[c2])                            \n\t"
-    "lwc1      %[f1],       0(%[a1])                            \n\t"
-    "lwc1      %[f2],       0(%[a2])                            \n\t"
-    "lwc1      %[f3],       4(%[a1])                            \n\t"
-    "lwc1      %[f4],       4(%[a2])                            \n\t"
-    "lwc1      %[f5],       0(%[c1])                            \n\t"
-    "sub.s     %[f6],       %[f0],        %[f6]                 \n\t"
-    "sub.s     %[f7],       %[f1],        %[f2]                 \n\t"
-    "add.s     %[f8],       %[f3],        %[f4]                 \n\t"
-    "addiu     %[count],    $zero,        15                    \n\t"
-    "mul.s     %[f9],       %[f6],        %[f7]                 \n\t"
-    "mul.s     %[f6],       %[f6],        %[f8]                 \n\t"
-#if !defined(MIPS32_R2_LE)
-    "mul.s     %[f8],       %[f5],        %[f8]                 \n\t"
-    "mul.s     %[f5],       %[f5],        %[f7]                 \n\t"
-    "add.s     %[f9],       %[f9],        %[f8]                 \n\t"
-    "sub.s     %[f6],       %[f6],        %[f5]                 \n\t"
-#else
-    "madd.s    %[f9],       %[f9],        %[f5],      %[f8]     \n\t"
-    "nmsub.s   %[f6],       %[f6],        %[f5],      %[f7]     \n\t"
-#endif
-    "sub.s     %[f1],       %[f1],        %[f9]                 \n\t"
-    "add.s     %[f2],       %[f2],        %[f9]                 \n\t"
-    "sub.s     %[f3],       %[f6],        %[f3]                 \n\t"
-    "sub.s     %[f4],       %[f6],        %[f4]                 \n\t"
-    "swc1      %[f1],       0(%[a1])                            \n\t"
-    "swc1      %[f2],       0(%[a2])                            \n\t"
-    "swc1      %[f3],       4(%[a1])                            \n\t"
-    "swc1      %[f4],       4(%[a2])                            \n\t"
-    "addiu     %[a1],       %[a1],        8                     \n\t"
-    "addiu     %[a2],       %[a2],        -8                    \n\t"
-    "addiu     %[c1],       %[c1],        4                     \n\t"
-    "addiu     %[c2],       %[c2],        -4                    \n\t"
-   "1:                                                          \n\t"
-    "lwc1      %[f6],       0(%[c2])                            \n\t"
-    "lwc1      %[f1],       0(%[a1])                            \n\t"
-    "lwc1      %[f2],       0(%[a2])                            \n\t"
-    "lwc1      %[f3],       4(%[a1])                            \n\t"
-    "lwc1      %[f4],       4(%[a2])                            \n\t"
-    "lwc1      %[f5],       0(%[c1])                            \n\t"
-    "sub.s     %[f6],       %[f0],        %[f6]                 \n\t"
-    "sub.s     %[f7],       %[f1],        %[f2]                 \n\t"
-    "add.s     %[f8],       %[f3],        %[f4]                 \n\t"
-    "lwc1      %[f10],      -4(%[c2])                           \n\t"
-    "lwc1      %[f11],      8(%[a1])                            \n\t"
-    "lwc1      %[f12],      -8(%[a2])                           \n\t"
-    "mul.s     %[f9],       %[f6],        %[f7]                 \n\t"
-    "mul.s     %[f6],       %[f6],        %[f8]                 \n\t"
-#if !defined(MIPS32_R2_LE)
-    "mul.s     %[f8],       %[f5],        %[f8]                 \n\t"
-    "mul.s     %[f5],       %[f5],        %[f7]                 \n\t"
-    "lwc1      %[f13],      12(%[a1])                           \n\t"
-    "lwc1      %[f14],      -4(%[a2])                           \n\t"
-    "lwc1      %[f15],      4(%[c1])                            \n\t"
-    "add.s     %[f9],       %[f9],        %[f8]                 \n\t"
-    "sub.s     %[f6],       %[f6],        %[f5]                 \n\t"
-#else
-    "lwc1      %[f13],      12(%[a1])                           \n\t"
-    "lwc1      %[f14],      -4(%[a2])                           \n\t"
-    "lwc1      %[f15],      4(%[c1])                            \n\t"
-    "madd.s    %[f9],       %[f9],        %[f5],      %[f8]     \n\t"
-    "nmsub.s   %[f6],       %[f6],        %[f5],      %[f7]     \n\t"
-#endif
-    "sub.s     %[f10],      %[f0],        %[f10]                \n\t"
-    "sub.s     %[f5],       %[f11],       %[f12]                \n\t"
-    "add.s     %[f7],       %[f13],       %[f14]                \n\t"
-    "sub.s     %[f1],       %[f1],        %[f9]                 \n\t"
-    "add.s     %[f2],       %[f2],        %[f9]                 \n\t"
-    "sub.s     %[f3],       %[f6],        %[f3]                 \n\t"
-    "mul.s     %[f8],       %[f10],       %[f5]                 \n\t"
-    "mul.s     %[f10],      %[f10],       %[f7]                 \n\t"
-#if !defined(MIPS32_R2_LE)
-    "mul.s     %[f9],       %[f15],       %[f7]                 \n\t"
-    "mul.s     %[f15],      %[f15],       %[f5]                 \n\t"
-    "sub.s     %[f4],       %[f6],        %[f4]                 \n\t"
-    "swc1      %[f1],       0(%[a1])                            \n\t"
-    "swc1      %[f2],       0(%[a2])                            \n\t"
-    "add.s     %[f8],       %[f8],        %[f9]                 \n\t"
-    "sub.s     %[f10],      %[f10],       %[f15]                \n\t"
-#else
-    "swc1      %[f1],       0(%[a1])                            \n\t"
-    "swc1      %[f2],       0(%[a2])                            \n\t"
-    "sub.s     %[f4],       %[f6],        %[f4]                 \n\t"
-    "madd.s    %[f8],       %[f8],        %[f15],     %[f7]     \n\t"
-    "nmsub.s   %[f10],      %[f10],       %[f15],     %[f5]     \n\t"
-#endif
-    "swc1      %[f3],       4(%[a1])                            \n\t"
-    "swc1      %[f4],       4(%[a2])                            \n\t"
-    "sub.s     %[f11],      %[f11],       %[f8]                 \n\t"
-    "add.s     %[f12],      %[f12],       %[f8]                 \n\t"
-    "sub.s     %[f13],      %[f10],       %[f13]                \n\t"
-    "sub.s     %[f14],      %[f10],       %[f14]                \n\t"
-    "addiu     %[c2],       %[c2],        -8                    \n\t"
-    "addiu     %[c1],       %[c1],        8                     \n\t"
-    "swc1      %[f11],      8(%[a1])                            \n\t"
-    "swc1      %[f12],      -8(%[a2])                           \n\t"
-    "swc1      %[f13],      12(%[a1])                           \n\t"
-    "swc1      %[f14],      -4(%[a2])                           \n\t"
-    "addiu     %[a1],       %[a1],        16                    \n\t"
-    "addiu     %[count],    %[count],     -1                    \n\t"
-    "bgtz      %[count],    1b                                  \n\t"
-    " addiu    %[a2],       %[a2],        -16                   \n\t"
-    ".set      pop                                              \n\t"
-    : [a1] "+r" (a1), [a2] "+r" (a2), [c1] "+r" (c1), [c2] "+r" (c2),
-      [f1] "=&f" (f1), [f2] "=&f" (f2), [f3] "=&f" (f3), [f4] "=&f" (f4),
-      [f5] "=&f" (f5), [f6] "=&f" (f6), [f7] "=&f" (f7), [f8] "=&f" (f8),
-      [f9] "=&f" (f9), [f10] "=&f" (f10), [f11] "=&f" (f11), [f12] "=&f" (f12),
-      [f13] "=&f" (f13), [f14] "=&f" (f14), [f15] "=&f" (f15),
-      [count] "=&r" (count)
-    : [f0] "f" (f0)
-    : "memory"
-  );
-}
-#endif
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/utility/ooura_fft_neon.cc b/modules/audio_processing/utility/ooura_fft_neon.cc
deleted file mode 100644
index 4ed043d..0000000
--- a/modules/audio_processing/utility/ooura_fft_neon.cc
+++ /dev/null
@@ -1,352 +0,0 @@
-/*
- *  Copyright (c) 2014 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.
- */
-
-/*
- * The rdft AEC algorithm, neon version of speed-critical functions.
- *
- * Based on the sse2 version.
- */
-
-#include "webrtc/modules/audio_processing/utility/ooura_fft.h"
-
-#include <arm_neon.h>
-
-#include "webrtc/modules/audio_processing/utility/ooura_fft_tables_common.h"
-#include "webrtc/modules/audio_processing/utility/ooura_fft_tables_neon_sse2.h"
-
-namespace webrtc {
-
-#if defined(WEBRTC_HAS_NEON)
-void cft1st_128_neon(float* a) {
-  const float32x4_t vec_swap_sign = vld1q_f32((float32_t*)k_swap_sign);
-  int j, k2;
-
-  for (k2 = 0, j = 0; j < 128; j += 16, k2 += 4) {
-    float32x4_t a00v = vld1q_f32(&a[j + 0]);
-    float32x4_t a04v = vld1q_f32(&a[j + 4]);
-    float32x4_t a08v = vld1q_f32(&a[j + 8]);
-    float32x4_t a12v = vld1q_f32(&a[j + 12]);
-    float32x4_t a01v = vcombine_f32(vget_low_f32(a00v), vget_low_f32(a08v));
-    float32x4_t a23v = vcombine_f32(vget_high_f32(a00v), vget_high_f32(a08v));
-    float32x4_t a45v = vcombine_f32(vget_low_f32(a04v), vget_low_f32(a12v));
-    float32x4_t a67v = vcombine_f32(vget_high_f32(a04v), vget_high_f32(a12v));
-    const float32x4_t wk1rv = vld1q_f32(&rdft_wk1r[k2]);
-    const float32x4_t wk1iv = vld1q_f32(&rdft_wk1i[k2]);
-    const float32x4_t wk2rv = vld1q_f32(&rdft_wk2r[k2]);
-    const float32x4_t wk2iv = vld1q_f32(&rdft_wk2i[k2]);
-    const float32x4_t wk3rv = vld1q_f32(&rdft_wk3r[k2]);
-    const float32x4_t wk3iv = vld1q_f32(&rdft_wk3i[k2]);
-    float32x4_t x0v = vaddq_f32(a01v, a23v);
-    const float32x4_t x1v = vsubq_f32(a01v, a23v);
-    const float32x4_t x2v = vaddq_f32(a45v, a67v);
-    const float32x4_t x3v = vsubq_f32(a45v, a67v);
-    const float32x4_t x3w = vrev64q_f32(x3v);
-    float32x4_t x0w;
-    a01v = vaddq_f32(x0v, x2v);
-    x0v = vsubq_f32(x0v, x2v);
-    x0w = vrev64q_f32(x0v);
-    a45v = vmulq_f32(wk2rv, x0v);
-    a45v = vmlaq_f32(a45v, wk2iv, x0w);
-    x0v = vmlaq_f32(x1v, x3w, vec_swap_sign);
-    x0w = vrev64q_f32(x0v);
-    a23v = vmulq_f32(wk1rv, x0v);
-    a23v = vmlaq_f32(a23v, wk1iv, x0w);
-    x0v = vmlsq_f32(x1v, x3w, vec_swap_sign);
-    x0w = vrev64q_f32(x0v);
-    a67v = vmulq_f32(wk3rv, x0v);
-    a67v = vmlaq_f32(a67v, wk3iv, x0w);
-    a00v = vcombine_f32(vget_low_f32(a01v), vget_low_f32(a23v));
-    a04v = vcombine_f32(vget_low_f32(a45v), vget_low_f32(a67v));
-    a08v = vcombine_f32(vget_high_f32(a01v), vget_high_f32(a23v));
-    a12v = vcombine_f32(vget_high_f32(a45v), vget_high_f32(a67v));
-    vst1q_f32(&a[j + 0], a00v);
-    vst1q_f32(&a[j + 4], a04v);
-    vst1q_f32(&a[j + 8], a08v);
-    vst1q_f32(&a[j + 12], a12v);
-  }
-}
-
-void cftmdl_128_neon(float* a) {
-  int j;
-  const int l = 8;
-  const float32x4_t vec_swap_sign = vld1q_f32((float32_t*)k_swap_sign);
-  float32x4_t wk1rv = vld1q_f32(cftmdl_wk1r);
-
-  for (j = 0; j < l; j += 2) {
-    const float32x2_t a_00 = vld1_f32(&a[j + 0]);
-    const float32x2_t a_08 = vld1_f32(&a[j + 8]);
-    const float32x2_t a_32 = vld1_f32(&a[j + 32]);
-    const float32x2_t a_40 = vld1_f32(&a[j + 40]);
-    const float32x4_t a_00_32 = vcombine_f32(a_00, a_32);
-    const float32x4_t a_08_40 = vcombine_f32(a_08, a_40);
-    const float32x4_t x0r0_0i0_0r1_x0i1 = vaddq_f32(a_00_32, a_08_40);
-    const float32x4_t x1r0_1i0_1r1_x1i1 = vsubq_f32(a_00_32, a_08_40);
-    const float32x2_t a_16 = vld1_f32(&a[j + 16]);
-    const float32x2_t a_24 = vld1_f32(&a[j + 24]);
-    const float32x2_t a_48 = vld1_f32(&a[j + 48]);
-    const float32x2_t a_56 = vld1_f32(&a[j + 56]);
-    const float32x4_t a_16_48 = vcombine_f32(a_16, a_48);
-    const float32x4_t a_24_56 = vcombine_f32(a_24, a_56);
-    const float32x4_t x2r0_2i0_2r1_x2i1 = vaddq_f32(a_16_48, a_24_56);
-    const float32x4_t x3r0_3i0_3r1_x3i1 = vsubq_f32(a_16_48, a_24_56);
-    const float32x4_t xx0 = vaddq_f32(x0r0_0i0_0r1_x0i1, x2r0_2i0_2r1_x2i1);
-    const float32x4_t xx1 = vsubq_f32(x0r0_0i0_0r1_x0i1, x2r0_2i0_2r1_x2i1);
-    const float32x4_t x3i0_3r0_3i1_x3r1 = vrev64q_f32(x3r0_3i0_3r1_x3i1);
-    const float32x4_t x1_x3_add =
-        vmlaq_f32(x1r0_1i0_1r1_x1i1, vec_swap_sign, x3i0_3r0_3i1_x3r1);
-    const float32x4_t x1_x3_sub =
-        vmlsq_f32(x1r0_1i0_1r1_x1i1, vec_swap_sign, x3i0_3r0_3i1_x3r1);
-    const float32x2_t yy0_a = vdup_lane_f32(vget_high_f32(x1_x3_add), 0);
-    const float32x2_t yy0_s = vdup_lane_f32(vget_high_f32(x1_x3_sub), 0);
-    const float32x4_t yy0_as = vcombine_f32(yy0_a, yy0_s);
-    const float32x2_t yy1_a = vdup_lane_f32(vget_high_f32(x1_x3_add), 1);
-    const float32x2_t yy1_s = vdup_lane_f32(vget_high_f32(x1_x3_sub), 1);
-    const float32x4_t yy1_as = vcombine_f32(yy1_a, yy1_s);
-    const float32x4_t yy0 = vmlaq_f32(yy0_as, vec_swap_sign, yy1_as);
-    const float32x4_t yy4 = vmulq_f32(wk1rv, yy0);
-    const float32x4_t xx1_rev = vrev64q_f32(xx1);
-    const float32x4_t yy4_rev = vrev64q_f32(yy4);
-
-    vst1_f32(&a[j + 0], vget_low_f32(xx0));
-    vst1_f32(&a[j + 32], vget_high_f32(xx0));
-    vst1_f32(&a[j + 16], vget_low_f32(xx1));
-    vst1_f32(&a[j + 48], vget_high_f32(xx1_rev));
-
-    a[j + 48] = -a[j + 48];
-
-    vst1_f32(&a[j + 8], vget_low_f32(x1_x3_add));
-    vst1_f32(&a[j + 24], vget_low_f32(x1_x3_sub));
-    vst1_f32(&a[j + 40], vget_low_f32(yy4));
-    vst1_f32(&a[j + 56], vget_high_f32(yy4_rev));
-  }
-
-  {
-    const int k = 64;
-    const int k1 = 2;
-    const int k2 = 2 * k1;
-    const float32x4_t wk2rv = vld1q_f32(&rdft_wk2r[k2 + 0]);
-    const float32x4_t wk2iv = vld1q_f32(&rdft_wk2i[k2 + 0]);
-    const float32x4_t wk1iv = vld1q_f32(&rdft_wk1i[k2 + 0]);
-    const float32x4_t wk3rv = vld1q_f32(&rdft_wk3r[k2 + 0]);
-    const float32x4_t wk3iv = vld1q_f32(&rdft_wk3i[k2 + 0]);
-    wk1rv = vld1q_f32(&rdft_wk1r[k2 + 0]);
-    for (j = k; j < l + k; j += 2) {
-      const float32x2_t a_00 = vld1_f32(&a[j + 0]);
-      const float32x2_t a_08 = vld1_f32(&a[j + 8]);
-      const float32x2_t a_32 = vld1_f32(&a[j + 32]);
-      const float32x2_t a_40 = vld1_f32(&a[j + 40]);
-      const float32x4_t a_00_32 = vcombine_f32(a_00, a_32);
-      const float32x4_t a_08_40 = vcombine_f32(a_08, a_40);
-      const float32x4_t x0r0_0i0_0r1_x0i1 = vaddq_f32(a_00_32, a_08_40);
-      const float32x4_t x1r0_1i0_1r1_x1i1 = vsubq_f32(a_00_32, a_08_40);
-      const float32x2_t a_16 = vld1_f32(&a[j + 16]);
-      const float32x2_t a_24 = vld1_f32(&a[j + 24]);
-      const float32x2_t a_48 = vld1_f32(&a[j + 48]);
-      const float32x2_t a_56 = vld1_f32(&a[j + 56]);
-      const float32x4_t a_16_48 = vcombine_f32(a_16, a_48);
-      const float32x4_t a_24_56 = vcombine_f32(a_24, a_56);
-      const float32x4_t x2r0_2i0_2r1_x2i1 = vaddq_f32(a_16_48, a_24_56);
-      const float32x4_t x3r0_3i0_3r1_x3i1 = vsubq_f32(a_16_48, a_24_56);
-      const float32x4_t xx = vaddq_f32(x0r0_0i0_0r1_x0i1, x2r0_2i0_2r1_x2i1);
-      const float32x4_t xx1 = vsubq_f32(x0r0_0i0_0r1_x0i1, x2r0_2i0_2r1_x2i1);
-      const float32x4_t x3i0_3r0_3i1_x3r1 = vrev64q_f32(x3r0_3i0_3r1_x3i1);
-      const float32x4_t x1_x3_add =
-          vmlaq_f32(x1r0_1i0_1r1_x1i1, vec_swap_sign, x3i0_3r0_3i1_x3r1);
-      const float32x4_t x1_x3_sub =
-          vmlsq_f32(x1r0_1i0_1r1_x1i1, vec_swap_sign, x3i0_3r0_3i1_x3r1);
-      float32x4_t xx4 = vmulq_f32(wk2rv, xx1);
-      float32x4_t xx12 = vmulq_f32(wk1rv, x1_x3_add);
-      float32x4_t xx22 = vmulq_f32(wk3rv, x1_x3_sub);
-      xx4 = vmlaq_f32(xx4, wk2iv, vrev64q_f32(xx1));
-      xx12 = vmlaq_f32(xx12, wk1iv, vrev64q_f32(x1_x3_add));
-      xx22 = vmlaq_f32(xx22, wk3iv, vrev64q_f32(x1_x3_sub));
-
-      vst1_f32(&a[j + 0], vget_low_f32(xx));
-      vst1_f32(&a[j + 32], vget_high_f32(xx));
-      vst1_f32(&a[j + 16], vget_low_f32(xx4));
-      vst1_f32(&a[j + 48], vget_high_f32(xx4));
-      vst1_f32(&a[j + 8], vget_low_f32(xx12));
-      vst1_f32(&a[j + 40], vget_high_f32(xx12));
-      vst1_f32(&a[j + 24], vget_low_f32(xx22));
-      vst1_f32(&a[j + 56], vget_high_f32(xx22));
-    }
-  }
-}
-
-__inline static float32x4_t reverse_order_f32x4(float32x4_t in) {
-  // A B C D -> C D A B
-  const float32x4_t rev = vcombine_f32(vget_high_f32(in), vget_low_f32(in));
-  // C D A B -> D C B A
-  return vrev64q_f32(rev);
-}
-
-void rftfsub_128_neon(float* a) {
-  const float* c = rdft_w + 32;
-  int j1, j2;
-  const float32x4_t mm_half = vdupq_n_f32(0.5f);
-
-  // Vectorized code (four at once).
-  // Note: commented number are indexes for the first iteration of the loop.
-  for (j1 = 1, j2 = 2; j2 + 7 < 64; j1 += 4, j2 += 8) {
-    // Load 'wk'.
-    const float32x4_t c_j1 = vld1q_f32(&c[j1]);          //  1,  2,  3,  4,
-    const float32x4_t c_k1 = vld1q_f32(&c[29 - j1]);     // 28, 29, 30, 31,
-    const float32x4_t wkrt = vsubq_f32(mm_half, c_k1);   // 28, 29, 30, 31,
-    const float32x4_t wkr_ = reverse_order_f32x4(wkrt);  // 31, 30, 29, 28,
-    const float32x4_t wki_ = c_j1;                       //  1,  2,  3,  4,
-    // Load and shuffle 'a'.
-    //   2,   4,   6,   8,   3,   5,   7,   9
-    float32x4x2_t a_j2_p = vld2q_f32(&a[0 + j2]);
-    // 120, 122, 124, 126, 121, 123, 125, 127,
-    const float32x4x2_t k2_0_4 = vld2q_f32(&a[122 - j2]);
-    // 126, 124, 122, 120
-    const float32x4_t a_k2_p0 = reverse_order_f32x4(k2_0_4.val[0]);
-    // 127, 125, 123, 121
-    const float32x4_t a_k2_p1 = reverse_order_f32x4(k2_0_4.val[1]);
-    // Calculate 'x'.
-    const float32x4_t xr_ = vsubq_f32(a_j2_p.val[0], a_k2_p0);
-    // 2-126, 4-124, 6-122, 8-120,
-    const float32x4_t xi_ = vaddq_f32(a_j2_p.val[1], a_k2_p1);
-    // 3-127, 5-125, 7-123, 9-121,
-    // Calculate product into 'y'.
-    //    yr = wkr * xr - wki * xi;
-    //    yi = wkr * xi + wki * xr;
-    const float32x4_t a_ = vmulq_f32(wkr_, xr_);
-    const float32x4_t b_ = vmulq_f32(wki_, xi_);
-    const float32x4_t c_ = vmulq_f32(wkr_, xi_);
-    const float32x4_t d_ = vmulq_f32(wki_, xr_);
-    const float32x4_t yr_ = vsubq_f32(a_, b_);  // 2-126, 4-124, 6-122, 8-120,
-    const float32x4_t yi_ = vaddq_f32(c_, d_);  // 3-127, 5-125, 7-123, 9-121,
-                                                // Update 'a'.
-                                                //    a[j2 + 0] -= yr;
-                                                //    a[j2 + 1] -= yi;
-                                                //    a[k2 + 0] += yr;
-                                                //    a[k2 + 1] -= yi;
-    // 126, 124, 122, 120,
-    const float32x4_t a_k2_p0n = vaddq_f32(a_k2_p0, yr_);
-    // 127, 125, 123, 121,
-    const float32x4_t a_k2_p1n = vsubq_f32(a_k2_p1, yi_);
-    // Shuffle in right order and store.
-    const float32x4_t a_k2_p0nr = vrev64q_f32(a_k2_p0n);
-    const float32x4_t a_k2_p1nr = vrev64q_f32(a_k2_p1n);
-    // 124, 125, 126, 127, 120, 121, 122, 123
-    const float32x4x2_t a_k2_n = vzipq_f32(a_k2_p0nr, a_k2_p1nr);
-    //   2,   4,   6,   8,
-    a_j2_p.val[0] = vsubq_f32(a_j2_p.val[0], yr_);
-    //   3,   5,   7,   9,
-    a_j2_p.val[1] = vsubq_f32(a_j2_p.val[1], yi_);
-    //   2,   3,   4,   5,   6,   7,   8,   9,
-    vst2q_f32(&a[0 + j2], a_j2_p);
-
-    vst1q_f32(&a[122 - j2], a_k2_n.val[1]);
-    vst1q_f32(&a[126 - j2], a_k2_n.val[0]);
-  }
-
-  // Scalar code for the remaining items.
-  for (; j2 < 64; j1 += 1, j2 += 2) {
-    const int k2 = 128 - j2;
-    const int k1 = 32 - j1;
-    const float wkr = 0.5f - c[k1];
-    const float wki = c[j1];
-    const float xr = a[j2 + 0] - a[k2 + 0];
-    const float xi = a[j2 + 1] + a[k2 + 1];
-    const float yr = wkr * xr - wki * xi;
-    const float yi = wkr * xi + wki * xr;
-    a[j2 + 0] -= yr;
-    a[j2 + 1] -= yi;
-    a[k2 + 0] += yr;
-    a[k2 + 1] -= yi;
-  }
-}
-
-void rftbsub_128_neon(float* a) {
-  const float* c = rdft_w + 32;
-  int j1, j2;
-  const float32x4_t mm_half = vdupq_n_f32(0.5f);
-
-  a[1] = -a[1];
-  // Vectorized code (four at once).
-  //    Note: commented number are indexes for the first iteration of the loop.
-  for (j1 = 1, j2 = 2; j2 + 7 < 64; j1 += 4, j2 += 8) {
-    // Load 'wk'.
-    const float32x4_t c_j1 = vld1q_f32(&c[j1]);          //  1,  2,  3,  4,
-    const float32x4_t c_k1 = vld1q_f32(&c[29 - j1]);     // 28, 29, 30, 31,
-    const float32x4_t wkrt = vsubq_f32(mm_half, c_k1);   // 28, 29, 30, 31,
-    const float32x4_t wkr_ = reverse_order_f32x4(wkrt);  // 31, 30, 29, 28,
-    const float32x4_t wki_ = c_j1;                       //  1,  2,  3,  4,
-    // Load and shuffle 'a'.
-    //   2,   4,   6,   8,   3,   5,   7,   9
-    float32x4x2_t a_j2_p = vld2q_f32(&a[0 + j2]);
-    // 120, 122, 124, 126, 121, 123, 125, 127,
-    const float32x4x2_t k2_0_4 = vld2q_f32(&a[122 - j2]);
-    // 126, 124, 122, 120
-    const float32x4_t a_k2_p0 = reverse_order_f32x4(k2_0_4.val[0]);
-    // 127, 125, 123, 121
-    const float32x4_t a_k2_p1 = reverse_order_f32x4(k2_0_4.val[1]);
-    // Calculate 'x'.
-    const float32x4_t xr_ = vsubq_f32(a_j2_p.val[0], a_k2_p0);
-    // 2-126, 4-124, 6-122, 8-120,
-    const float32x4_t xi_ = vaddq_f32(a_j2_p.val[1], a_k2_p1);
-    // 3-127, 5-125, 7-123, 9-121,
-    // Calculate product into 'y'.
-    //    yr = wkr * xr - wki * xi;
-    //    yi = wkr * xi + wki * xr;
-    const float32x4_t a_ = vmulq_f32(wkr_, xr_);
-    const float32x4_t b_ = vmulq_f32(wki_, xi_);
-    const float32x4_t c_ = vmulq_f32(wkr_, xi_);
-    const float32x4_t d_ = vmulq_f32(wki_, xr_);
-    const float32x4_t yr_ = vaddq_f32(a_, b_);  // 2-126, 4-124, 6-122, 8-120,
-    const float32x4_t yi_ = vsubq_f32(c_, d_);  // 3-127, 5-125, 7-123, 9-121,
-                                                // Update 'a'.
-                                                //    a[j2 + 0] -= yr;
-                                                //    a[j2 + 1] -= yi;
-                                                //    a[k2 + 0] += yr;
-                                                //    a[k2 + 1] -= yi;
-    // 126, 124, 122, 120,
-    const float32x4_t a_k2_p0n = vaddq_f32(a_k2_p0, yr_);
-    // 127, 125, 123, 121,
-    const float32x4_t a_k2_p1n = vsubq_f32(yi_, a_k2_p1);
-    // Shuffle in right order and store.
-    //   2,   3,   4,   5,   6,   7,   8,   9,
-    const float32x4_t a_k2_p0nr = vrev64q_f32(a_k2_p0n);
-    const float32x4_t a_k2_p1nr = vrev64q_f32(a_k2_p1n);
-    // 124, 125, 126, 127, 120, 121, 122, 123
-    const float32x4x2_t a_k2_n = vzipq_f32(a_k2_p0nr, a_k2_p1nr);
-    //   2,   4,   6,   8,
-    a_j2_p.val[0] = vsubq_f32(a_j2_p.val[0], yr_);
-    //   3,   5,   7,   9,
-    a_j2_p.val[1] = vsubq_f32(yi_, a_j2_p.val[1]);
-    //   2,   3,   4,   5,   6,   7,   8,   9,
-    vst2q_f32(&a[0 + j2], a_j2_p);
-
-    vst1q_f32(&a[122 - j2], a_k2_n.val[1]);
-    vst1q_f32(&a[126 - j2], a_k2_n.val[0]);
-  }
-
-  // Scalar code for the remaining items.
-  for (; j2 < 64; j1 += 1, j2 += 2) {
-    const int k2 = 128 - j2;
-    const int k1 = 32 - j1;
-    const float wkr = 0.5f - c[k1];
-    const float wki = c[j1];
-    const float xr = a[j2 + 0] - a[k2 + 0];
-    const float xi = a[j2 + 1] + a[k2 + 1];
-    const float yr = wkr * xr + wki * xi;
-    const float yi = wkr * xi - wki * xr;
-    a[j2 + 0] = a[j2 + 0] - yr;
-    a[j2 + 1] = yi - a[j2 + 1];
-    a[k2 + 0] = yr + a[k2 + 0];
-    a[k2 + 1] = yi - a[k2 + 1];
-  }
-  a[65] = -a[65];
-}
-#endif
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/utility/ooura_fft_sse2.cc b/modules/audio_processing/utility/ooura_fft_sse2.cc
deleted file mode 100644
index 03f6b31..0000000
--- a/modules/audio_processing/utility/ooura_fft_sse2.cc
+++ /dev/null
@@ -1,438 +0,0 @@
-/*
- *  Copyright (c) 2011 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_processing//utility/ooura_fft.h"
-
-#include <emmintrin.h>
-
-#include "webrtc/modules/audio_processing/utility/ooura_fft_tables_common.h"
-#include "webrtc/modules/audio_processing/utility/ooura_fft_tables_neon_sse2.h"
-
-namespace webrtc {
-
-#if defined(WEBRTC_ARCH_X86_FAMILY)
-
-namespace {
-// These intrinsics were unavailable before VS 2008.
-// TODO(andrew): move to a common file.
-#if defined(_MSC_VER) && _MSC_VER < 1500
-static __inline __m128 _mm_castsi128_ps(__m128i a) {
-  return *(__m128*)&a;
-}
-static __inline __m128i _mm_castps_si128(__m128 a) {
-  return *(__m128i*)&a;
-}
-#endif
-
-}  // namespace
-
-void cft1st_128_SSE2(float* a) {
-  const __m128 mm_swap_sign = _mm_load_ps(k_swap_sign);
-  int j, k2;
-
-  for (k2 = 0, j = 0; j < 128; j += 16, k2 += 4) {
-    __m128 a00v = _mm_loadu_ps(&a[j + 0]);
-    __m128 a04v = _mm_loadu_ps(&a[j + 4]);
-    __m128 a08v = _mm_loadu_ps(&a[j + 8]);
-    __m128 a12v = _mm_loadu_ps(&a[j + 12]);
-    __m128 a01v = _mm_shuffle_ps(a00v, a08v, _MM_SHUFFLE(1, 0, 1, 0));
-    __m128 a23v = _mm_shuffle_ps(a00v, a08v, _MM_SHUFFLE(3, 2, 3, 2));
-    __m128 a45v = _mm_shuffle_ps(a04v, a12v, _MM_SHUFFLE(1, 0, 1, 0));
-    __m128 a67v = _mm_shuffle_ps(a04v, a12v, _MM_SHUFFLE(3, 2, 3, 2));
-
-    const __m128 wk1rv = _mm_load_ps(&rdft_wk1r[k2]);
-    const __m128 wk1iv = _mm_load_ps(&rdft_wk1i[k2]);
-    const __m128 wk2rv = _mm_load_ps(&rdft_wk2r[k2]);
-    const __m128 wk2iv = _mm_load_ps(&rdft_wk2i[k2]);
-    const __m128 wk3rv = _mm_load_ps(&rdft_wk3r[k2]);
-    const __m128 wk3iv = _mm_load_ps(&rdft_wk3i[k2]);
-    __m128 x0v = _mm_add_ps(a01v, a23v);
-    const __m128 x1v = _mm_sub_ps(a01v, a23v);
-    const __m128 x2v = _mm_add_ps(a45v, a67v);
-    const __m128 x3v = _mm_sub_ps(a45v, a67v);
-    __m128 x0w;
-    a01v = _mm_add_ps(x0v, x2v);
-    x0v = _mm_sub_ps(x0v, x2v);
-    x0w = _mm_shuffle_ps(x0v, x0v, _MM_SHUFFLE(2, 3, 0, 1));
-    {
-      const __m128 a45_0v = _mm_mul_ps(wk2rv, x0v);
-      const __m128 a45_1v = _mm_mul_ps(wk2iv, x0w);
-      a45v = _mm_add_ps(a45_0v, a45_1v);
-    }
-    {
-      __m128 a23_0v, a23_1v;
-      const __m128 x3w = _mm_shuffle_ps(x3v, x3v, _MM_SHUFFLE(2, 3, 0, 1));
-      const __m128 x3s = _mm_mul_ps(mm_swap_sign, x3w);
-      x0v = _mm_add_ps(x1v, x3s);
-      x0w = _mm_shuffle_ps(x0v, x0v, _MM_SHUFFLE(2, 3, 0, 1));
-      a23_0v = _mm_mul_ps(wk1rv, x0v);
-      a23_1v = _mm_mul_ps(wk1iv, x0w);
-      a23v = _mm_add_ps(a23_0v, a23_1v);
-
-      x0v = _mm_sub_ps(x1v, x3s);
-      x0w = _mm_shuffle_ps(x0v, x0v, _MM_SHUFFLE(2, 3, 0, 1));
-    }
-    {
-      const __m128 a67_0v = _mm_mul_ps(wk3rv, x0v);
-      const __m128 a67_1v = _mm_mul_ps(wk3iv, x0w);
-      a67v = _mm_add_ps(a67_0v, a67_1v);
-    }
-
-    a00v = _mm_shuffle_ps(a01v, a23v, _MM_SHUFFLE(1, 0, 1, 0));
-    a04v = _mm_shuffle_ps(a45v, a67v, _MM_SHUFFLE(1, 0, 1, 0));
-    a08v = _mm_shuffle_ps(a01v, a23v, _MM_SHUFFLE(3, 2, 3, 2));
-    a12v = _mm_shuffle_ps(a45v, a67v, _MM_SHUFFLE(3, 2, 3, 2));
-    _mm_storeu_ps(&a[j + 0], a00v);
-    _mm_storeu_ps(&a[j + 4], a04v);
-    _mm_storeu_ps(&a[j + 8], a08v);
-    _mm_storeu_ps(&a[j + 12], a12v);
-  }
-}
-
-void cftmdl_128_SSE2(float* a) {
-  const int l = 8;
-  const __m128 mm_swap_sign = _mm_load_ps(k_swap_sign);
-  int j0;
-
-  __m128 wk1rv = _mm_load_ps(cftmdl_wk1r);
-  for (j0 = 0; j0 < l; j0 += 2) {
-    const __m128i a_00 = _mm_loadl_epi64((__m128i*)&a[j0 + 0]);
-    const __m128i a_08 = _mm_loadl_epi64((__m128i*)&a[j0 + 8]);
-    const __m128i a_32 = _mm_loadl_epi64((__m128i*)&a[j0 + 32]);
-    const __m128i a_40 = _mm_loadl_epi64((__m128i*)&a[j0 + 40]);
-    const __m128 a_00_32 =
-        _mm_shuffle_ps(_mm_castsi128_ps(a_00), _mm_castsi128_ps(a_32),
-                       _MM_SHUFFLE(1, 0, 1, 0));
-    const __m128 a_08_40 =
-        _mm_shuffle_ps(_mm_castsi128_ps(a_08), _mm_castsi128_ps(a_40),
-                       _MM_SHUFFLE(1, 0, 1, 0));
-    __m128 x0r0_0i0_0r1_x0i1 = _mm_add_ps(a_00_32, a_08_40);
-    const __m128 x1r0_1i0_1r1_x1i1 = _mm_sub_ps(a_00_32, a_08_40);
-
-    const __m128i a_16 = _mm_loadl_epi64((__m128i*)&a[j0 + 16]);
-    const __m128i a_24 = _mm_loadl_epi64((__m128i*)&a[j0 + 24]);
-    const __m128i a_48 = _mm_loadl_epi64((__m128i*)&a[j0 + 48]);
-    const __m128i a_56 = _mm_loadl_epi64((__m128i*)&a[j0 + 56]);
-    const __m128 a_16_48 =
-        _mm_shuffle_ps(_mm_castsi128_ps(a_16), _mm_castsi128_ps(a_48),
-                       _MM_SHUFFLE(1, 0, 1, 0));
-    const __m128 a_24_56 =
-        _mm_shuffle_ps(_mm_castsi128_ps(a_24), _mm_castsi128_ps(a_56),
-                       _MM_SHUFFLE(1, 0, 1, 0));
-    const __m128 x2r0_2i0_2r1_x2i1 = _mm_add_ps(a_16_48, a_24_56);
-    const __m128 x3r0_3i0_3r1_x3i1 = _mm_sub_ps(a_16_48, a_24_56);
-
-    const __m128 xx0 = _mm_add_ps(x0r0_0i0_0r1_x0i1, x2r0_2i0_2r1_x2i1);
-    const __m128 xx1 = _mm_sub_ps(x0r0_0i0_0r1_x0i1, x2r0_2i0_2r1_x2i1);
-
-    const __m128 x3i0_3r0_3i1_x3r1 = _mm_castsi128_ps(_mm_shuffle_epi32(
-        _mm_castps_si128(x3r0_3i0_3r1_x3i1), _MM_SHUFFLE(2, 3, 0, 1)));
-    const __m128 x3_swapped = _mm_mul_ps(mm_swap_sign, x3i0_3r0_3i1_x3r1);
-    const __m128 x1_x3_add = _mm_add_ps(x1r0_1i0_1r1_x1i1, x3_swapped);
-    const __m128 x1_x3_sub = _mm_sub_ps(x1r0_1i0_1r1_x1i1, x3_swapped);
-
-    const __m128 yy0 =
-        _mm_shuffle_ps(x1_x3_add, x1_x3_sub, _MM_SHUFFLE(2, 2, 2, 2));
-    const __m128 yy1 =
-        _mm_shuffle_ps(x1_x3_add, x1_x3_sub, _MM_SHUFFLE(3, 3, 3, 3));
-    const __m128 yy2 = _mm_mul_ps(mm_swap_sign, yy1);
-    const __m128 yy3 = _mm_add_ps(yy0, yy2);
-    const __m128 yy4 = _mm_mul_ps(wk1rv, yy3);
-
-    _mm_storel_epi64((__m128i*)&a[j0 + 0], _mm_castps_si128(xx0));
-    _mm_storel_epi64(
-        (__m128i*)&a[j0 + 32],
-        _mm_shuffle_epi32(_mm_castps_si128(xx0), _MM_SHUFFLE(3, 2, 3, 2)));
-
-    _mm_storel_epi64((__m128i*)&a[j0 + 16], _mm_castps_si128(xx1));
-    _mm_storel_epi64(
-        (__m128i*)&a[j0 + 48],
-        _mm_shuffle_epi32(_mm_castps_si128(xx1), _MM_SHUFFLE(2, 3, 2, 3)));
-    a[j0 + 48] = -a[j0 + 48];
-
-    _mm_storel_epi64((__m128i*)&a[j0 + 8], _mm_castps_si128(x1_x3_add));
-    _mm_storel_epi64((__m128i*)&a[j0 + 24], _mm_castps_si128(x1_x3_sub));
-
-    _mm_storel_epi64((__m128i*)&a[j0 + 40], _mm_castps_si128(yy4));
-    _mm_storel_epi64(
-        (__m128i*)&a[j0 + 56],
-        _mm_shuffle_epi32(_mm_castps_si128(yy4), _MM_SHUFFLE(2, 3, 2, 3)));
-  }
-
-  {
-    int k = 64;
-    int k1 = 2;
-    int k2 = 2 * k1;
-    const __m128 wk2rv = _mm_load_ps(&rdft_wk2r[k2 + 0]);
-    const __m128 wk2iv = _mm_load_ps(&rdft_wk2i[k2 + 0]);
-    const __m128 wk1iv = _mm_load_ps(&rdft_wk1i[k2 + 0]);
-    const __m128 wk3rv = _mm_load_ps(&rdft_wk3r[k2 + 0]);
-    const __m128 wk3iv = _mm_load_ps(&rdft_wk3i[k2 + 0]);
-    wk1rv = _mm_load_ps(&rdft_wk1r[k2 + 0]);
-    for (j0 = k; j0 < l + k; j0 += 2) {
-      const __m128i a_00 = _mm_loadl_epi64((__m128i*)&a[j0 + 0]);
-      const __m128i a_08 = _mm_loadl_epi64((__m128i*)&a[j0 + 8]);
-      const __m128i a_32 = _mm_loadl_epi64((__m128i*)&a[j0 + 32]);
-      const __m128i a_40 = _mm_loadl_epi64((__m128i*)&a[j0 + 40]);
-      const __m128 a_00_32 =
-          _mm_shuffle_ps(_mm_castsi128_ps(a_00), _mm_castsi128_ps(a_32),
-                         _MM_SHUFFLE(1, 0, 1, 0));
-      const __m128 a_08_40 =
-          _mm_shuffle_ps(_mm_castsi128_ps(a_08), _mm_castsi128_ps(a_40),
-                         _MM_SHUFFLE(1, 0, 1, 0));
-      __m128 x0r0_0i0_0r1_x0i1 = _mm_add_ps(a_00_32, a_08_40);
-      const __m128 x1r0_1i0_1r1_x1i1 = _mm_sub_ps(a_00_32, a_08_40);
-
-      const __m128i a_16 = _mm_loadl_epi64((__m128i*)&a[j0 + 16]);
-      const __m128i a_24 = _mm_loadl_epi64((__m128i*)&a[j0 + 24]);
-      const __m128i a_48 = _mm_loadl_epi64((__m128i*)&a[j0 + 48]);
-      const __m128i a_56 = _mm_loadl_epi64((__m128i*)&a[j0 + 56]);
-      const __m128 a_16_48 =
-          _mm_shuffle_ps(_mm_castsi128_ps(a_16), _mm_castsi128_ps(a_48),
-                         _MM_SHUFFLE(1, 0, 1, 0));
-      const __m128 a_24_56 =
-          _mm_shuffle_ps(_mm_castsi128_ps(a_24), _mm_castsi128_ps(a_56),
-                         _MM_SHUFFLE(1, 0, 1, 0));
-      const __m128 x2r0_2i0_2r1_x2i1 = _mm_add_ps(a_16_48, a_24_56);
-      const __m128 x3r0_3i0_3r1_x3i1 = _mm_sub_ps(a_16_48, a_24_56);
-
-      const __m128 xx = _mm_add_ps(x0r0_0i0_0r1_x0i1, x2r0_2i0_2r1_x2i1);
-      const __m128 xx1 = _mm_sub_ps(x0r0_0i0_0r1_x0i1, x2r0_2i0_2r1_x2i1);
-      const __m128 xx2 = _mm_mul_ps(xx1, wk2rv);
-      const __m128 xx3 = _mm_mul_ps(
-          wk2iv, _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(xx1),
-                                                    _MM_SHUFFLE(2, 3, 0, 1))));
-      const __m128 xx4 = _mm_add_ps(xx2, xx3);
-
-      const __m128 x3i0_3r0_3i1_x3r1 = _mm_castsi128_ps(_mm_shuffle_epi32(
-          _mm_castps_si128(x3r0_3i0_3r1_x3i1), _MM_SHUFFLE(2, 3, 0, 1)));
-      const __m128 x3_swapped = _mm_mul_ps(mm_swap_sign, x3i0_3r0_3i1_x3r1);
-      const __m128 x1_x3_add = _mm_add_ps(x1r0_1i0_1r1_x1i1, x3_swapped);
-      const __m128 x1_x3_sub = _mm_sub_ps(x1r0_1i0_1r1_x1i1, x3_swapped);
-
-      const __m128 xx10 = _mm_mul_ps(x1_x3_add, wk1rv);
-      const __m128 xx11 = _mm_mul_ps(
-          wk1iv, _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(x1_x3_add),
-                                                    _MM_SHUFFLE(2, 3, 0, 1))));
-      const __m128 xx12 = _mm_add_ps(xx10, xx11);
-
-      const __m128 xx20 = _mm_mul_ps(x1_x3_sub, wk3rv);
-      const __m128 xx21 = _mm_mul_ps(
-          wk3iv, _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(x1_x3_sub),
-                                                    _MM_SHUFFLE(2, 3, 0, 1))));
-      const __m128 xx22 = _mm_add_ps(xx20, xx21);
-
-      _mm_storel_epi64((__m128i*)&a[j0 + 0], _mm_castps_si128(xx));
-      _mm_storel_epi64(
-          (__m128i*)&a[j0 + 32],
-          _mm_shuffle_epi32(_mm_castps_si128(xx), _MM_SHUFFLE(3, 2, 3, 2)));
-
-      _mm_storel_epi64((__m128i*)&a[j0 + 16], _mm_castps_si128(xx4));
-      _mm_storel_epi64(
-          (__m128i*)&a[j0 + 48],
-          _mm_shuffle_epi32(_mm_castps_si128(xx4), _MM_SHUFFLE(3, 2, 3, 2)));
-
-      _mm_storel_epi64((__m128i*)&a[j0 + 8], _mm_castps_si128(xx12));
-      _mm_storel_epi64(
-          (__m128i*)&a[j0 + 40],
-          _mm_shuffle_epi32(_mm_castps_si128(xx12), _MM_SHUFFLE(3, 2, 3, 2)));
-
-      _mm_storel_epi64((__m128i*)&a[j0 + 24], _mm_castps_si128(xx22));
-      _mm_storel_epi64(
-          (__m128i*)&a[j0 + 56],
-          _mm_shuffle_epi32(_mm_castps_si128(xx22), _MM_SHUFFLE(3, 2, 3, 2)));
-    }
-  }
-}
-
-void rftfsub_128_SSE2(float* a) {
-  const float* c = rdft_w + 32;
-  int j1, j2, k1, k2;
-  float wkr, wki, xr, xi, yr, yi;
-
-  static const ALIGN16_BEG float ALIGN16_END k_half[4] = {0.5f, 0.5f, 0.5f,
-                                                          0.5f};
-  const __m128 mm_half = _mm_load_ps(k_half);
-
-  // Vectorized code (four at once).
-  //    Note: commented number are indexes for the first iteration of the loop.
-  for (j1 = 1, j2 = 2; j2 + 7 < 64; j1 += 4, j2 += 8) {
-    // Load 'wk'.
-    const __m128 c_j1 = _mm_loadu_ps(&c[j1]);       //  1,  2,  3,  4,
-    const __m128 c_k1 = _mm_loadu_ps(&c[29 - j1]);  // 28, 29, 30, 31,
-    const __m128 wkrt = _mm_sub_ps(mm_half, c_k1);  // 28, 29, 30, 31,
-    const __m128 wkr_ =
-        _mm_shuffle_ps(wkrt, wkrt, _MM_SHUFFLE(0, 1, 2, 3));  // 31, 30, 29, 28,
-    const __m128 wki_ = c_j1;                                 //  1,  2,  3,  4,
-    // Load and shuffle 'a'.
-    const __m128 a_j2_0 = _mm_loadu_ps(&a[0 + j2]);    //   2,   3,   4,   5,
-    const __m128 a_j2_4 = _mm_loadu_ps(&a[4 + j2]);    //   6,   7,   8,   9,
-    const __m128 a_k2_0 = _mm_loadu_ps(&a[122 - j2]);  // 120, 121, 122, 123,
-    const __m128 a_k2_4 = _mm_loadu_ps(&a[126 - j2]);  // 124, 125, 126, 127,
-    const __m128 a_j2_p0 = _mm_shuffle_ps(
-        a_j2_0, a_j2_4, _MM_SHUFFLE(2, 0, 2, 0));  //   2,   4,   6,   8,
-    const __m128 a_j2_p1 = _mm_shuffle_ps(
-        a_j2_0, a_j2_4, _MM_SHUFFLE(3, 1, 3, 1));  //   3,   5,   7,   9,
-    const __m128 a_k2_p0 = _mm_shuffle_ps(
-        a_k2_4, a_k2_0, _MM_SHUFFLE(0, 2, 0, 2));  // 126, 124, 122, 120,
-    const __m128 a_k2_p1 = _mm_shuffle_ps(
-        a_k2_4, a_k2_0, _MM_SHUFFLE(1, 3, 1, 3));  // 127, 125, 123, 121,
-    // Calculate 'x'.
-    const __m128 xr_ = _mm_sub_ps(a_j2_p0, a_k2_p0);
-    // 2-126, 4-124, 6-122, 8-120,
-    const __m128 xi_ = _mm_add_ps(a_j2_p1, a_k2_p1);
-    // 3-127, 5-125, 7-123, 9-121,
-    // Calculate product into 'y'.
-    //    yr = wkr * xr - wki * xi;
-    //    yi = wkr * xi + wki * xr;
-    const __m128 a_ = _mm_mul_ps(wkr_, xr_);
-    const __m128 b_ = _mm_mul_ps(wki_, xi_);
-    const __m128 c_ = _mm_mul_ps(wkr_, xi_);
-    const __m128 d_ = _mm_mul_ps(wki_, xr_);
-    const __m128 yr_ = _mm_sub_ps(a_, b_);  // 2-126, 4-124, 6-122, 8-120,
-    const __m128 yi_ = _mm_add_ps(c_, d_);  // 3-127, 5-125, 7-123, 9-121,
-                                            // Update 'a'.
-                                            //    a[j2 + 0] -= yr;
-                                            //    a[j2 + 1] -= yi;
-                                            //    a[k2 + 0] += yr;
-    //    a[k2 + 1] -= yi;
-    const __m128 a_j2_p0n = _mm_sub_ps(a_j2_p0, yr_);  //   2,   4,   6,   8,
-    const __m128 a_j2_p1n = _mm_sub_ps(a_j2_p1, yi_);  //   3,   5,   7,   9,
-    const __m128 a_k2_p0n = _mm_add_ps(a_k2_p0, yr_);  // 126, 124, 122, 120,
-    const __m128 a_k2_p1n = _mm_sub_ps(a_k2_p1, yi_);  // 127, 125, 123, 121,
-    // Shuffle in right order and store.
-    const __m128 a_j2_0n = _mm_unpacklo_ps(a_j2_p0n, a_j2_p1n);
-    //   2,   3,   4,   5,
-    const __m128 a_j2_4n = _mm_unpackhi_ps(a_j2_p0n, a_j2_p1n);
-    //   6,   7,   8,   9,
-    const __m128 a_k2_0nt = _mm_unpackhi_ps(a_k2_p0n, a_k2_p1n);
-    // 122, 123, 120, 121,
-    const __m128 a_k2_4nt = _mm_unpacklo_ps(a_k2_p0n, a_k2_p1n);
-    // 126, 127, 124, 125,
-    const __m128 a_k2_0n = _mm_shuffle_ps(
-        a_k2_0nt, a_k2_0nt, _MM_SHUFFLE(1, 0, 3, 2));  // 120, 121, 122, 123,
-    const __m128 a_k2_4n = _mm_shuffle_ps(
-        a_k2_4nt, a_k2_4nt, _MM_SHUFFLE(1, 0, 3, 2));  // 124, 125, 126, 127,
-    _mm_storeu_ps(&a[0 + j2], a_j2_0n);
-    _mm_storeu_ps(&a[4 + j2], a_j2_4n);
-    _mm_storeu_ps(&a[122 - j2], a_k2_0n);
-    _mm_storeu_ps(&a[126 - j2], a_k2_4n);
-  }
-  // Scalar code for the remaining items.
-  for (; j2 < 64; j1 += 1, j2 += 2) {
-    k2 = 128 - j2;
-    k1 = 32 - j1;
-    wkr = 0.5f - c[k1];
-    wki = c[j1];
-    xr = a[j2 + 0] - a[k2 + 0];
-    xi = a[j2 + 1] + a[k2 + 1];
-    yr = wkr * xr - wki * xi;
-    yi = wkr * xi + wki * xr;
-    a[j2 + 0] -= yr;
-    a[j2 + 1] -= yi;
-    a[k2 + 0] += yr;
-    a[k2 + 1] -= yi;
-  }
-}
-
-void rftbsub_128_SSE2(float* a) {
-  const float* c = rdft_w + 32;
-  int j1, j2, k1, k2;
-  float wkr, wki, xr, xi, yr, yi;
-
-  static const ALIGN16_BEG float ALIGN16_END k_half[4] = {0.5f, 0.5f, 0.5f,
-                                                          0.5f};
-  const __m128 mm_half = _mm_load_ps(k_half);
-
-  a[1] = -a[1];
-  // Vectorized code (four at once).
-  //    Note: commented number are indexes for the first iteration of the loop.
-  for (j1 = 1, j2 = 2; j2 + 7 < 64; j1 += 4, j2 += 8) {
-    // Load 'wk'.
-    const __m128 c_j1 = _mm_loadu_ps(&c[j1]);       //  1,  2,  3,  4,
-    const __m128 c_k1 = _mm_loadu_ps(&c[29 - j1]);  // 28, 29, 30, 31,
-    const __m128 wkrt = _mm_sub_ps(mm_half, c_k1);  // 28, 29, 30, 31,
-    const __m128 wkr_ =
-        _mm_shuffle_ps(wkrt, wkrt, _MM_SHUFFLE(0, 1, 2, 3));  // 31, 30, 29, 28,
-    const __m128 wki_ = c_j1;                                 //  1,  2,  3,  4,
-    // Load and shuffle 'a'.
-    const __m128 a_j2_0 = _mm_loadu_ps(&a[0 + j2]);    //   2,   3,   4,   5,
-    const __m128 a_j2_4 = _mm_loadu_ps(&a[4 + j2]);    //   6,   7,   8,   9,
-    const __m128 a_k2_0 = _mm_loadu_ps(&a[122 - j2]);  // 120, 121, 122, 123,
-    const __m128 a_k2_4 = _mm_loadu_ps(&a[126 - j2]);  // 124, 125, 126, 127,
-    const __m128 a_j2_p0 = _mm_shuffle_ps(
-        a_j2_0, a_j2_4, _MM_SHUFFLE(2, 0, 2, 0));  //   2,   4,   6,   8,
-    const __m128 a_j2_p1 = _mm_shuffle_ps(
-        a_j2_0, a_j2_4, _MM_SHUFFLE(3, 1, 3, 1));  //   3,   5,   7,   9,
-    const __m128 a_k2_p0 = _mm_shuffle_ps(
-        a_k2_4, a_k2_0, _MM_SHUFFLE(0, 2, 0, 2));  // 126, 124, 122, 120,
-    const __m128 a_k2_p1 = _mm_shuffle_ps(
-        a_k2_4, a_k2_0, _MM_SHUFFLE(1, 3, 1, 3));  // 127, 125, 123, 121,
-    // Calculate 'x'.
-    const __m128 xr_ = _mm_sub_ps(a_j2_p0, a_k2_p0);
-    // 2-126, 4-124, 6-122, 8-120,
-    const __m128 xi_ = _mm_add_ps(a_j2_p1, a_k2_p1);
-    // 3-127, 5-125, 7-123, 9-121,
-    // Calculate product into 'y'.
-    //    yr = wkr * xr + wki * xi;
-    //    yi = wkr * xi - wki * xr;
-    const __m128 a_ = _mm_mul_ps(wkr_, xr_);
-    const __m128 b_ = _mm_mul_ps(wki_, xi_);
-    const __m128 c_ = _mm_mul_ps(wkr_, xi_);
-    const __m128 d_ = _mm_mul_ps(wki_, xr_);
-    const __m128 yr_ = _mm_add_ps(a_, b_);  // 2-126, 4-124, 6-122, 8-120,
-    const __m128 yi_ = _mm_sub_ps(c_, d_);  // 3-127, 5-125, 7-123, 9-121,
-                                            // Update 'a'.
-                                            //    a[j2 + 0] = a[j2 + 0] - yr;
-                                            //    a[j2 + 1] = yi - a[j2 + 1];
-                                            //    a[k2 + 0] = yr + a[k2 + 0];
-    //    a[k2 + 1] = yi - a[k2 + 1];
-    const __m128 a_j2_p0n = _mm_sub_ps(a_j2_p0, yr_);  //   2,   4,   6,   8,
-    const __m128 a_j2_p1n = _mm_sub_ps(yi_, a_j2_p1);  //   3,   5,   7,   9,
-    const __m128 a_k2_p0n = _mm_add_ps(a_k2_p0, yr_);  // 126, 124, 122, 120,
-    const __m128 a_k2_p1n = _mm_sub_ps(yi_, a_k2_p1);  // 127, 125, 123, 121,
-    // Shuffle in right order and store.
-    const __m128 a_j2_0n = _mm_unpacklo_ps(a_j2_p0n, a_j2_p1n);
-    //   2,   3,   4,   5,
-    const __m128 a_j2_4n = _mm_unpackhi_ps(a_j2_p0n, a_j2_p1n);
-    //   6,   7,   8,   9,
-    const __m128 a_k2_0nt = _mm_unpackhi_ps(a_k2_p0n, a_k2_p1n);
-    // 122, 123, 120, 121,
-    const __m128 a_k2_4nt = _mm_unpacklo_ps(a_k2_p0n, a_k2_p1n);
-    // 126, 127, 124, 125,
-    const __m128 a_k2_0n = _mm_shuffle_ps(
-        a_k2_0nt, a_k2_0nt, _MM_SHUFFLE(1, 0, 3, 2));  // 120, 121, 122, 123,
-    const __m128 a_k2_4n = _mm_shuffle_ps(
-        a_k2_4nt, a_k2_4nt, _MM_SHUFFLE(1, 0, 3, 2));  // 124, 125, 126, 127,
-    _mm_storeu_ps(&a[0 + j2], a_j2_0n);
-    _mm_storeu_ps(&a[4 + j2], a_j2_4n);
-    _mm_storeu_ps(&a[122 - j2], a_k2_0n);
-    _mm_storeu_ps(&a[126 - j2], a_k2_4n);
-  }
-  // Scalar code for the remaining items.
-  for (; j2 < 64; j1 += 1, j2 += 2) {
-    k2 = 128 - j2;
-    k1 = 32 - j1;
-    wkr = 0.5f - c[k1];
-    wki = c[j1];
-    xr = a[j2 + 0] - a[k2 + 0];
-    xi = a[j2 + 1] + a[k2 + 1];
-    yr = wkr * xr + wki * xi;
-    yi = wkr * xi - wki * xr;
-    a[j2 + 0] = a[j2 + 0] - yr;
-    a[j2 + 1] = yi - a[j2 + 1];
-    a[k2 + 0] = yr + a[k2 + 0];
-    a[k2 + 1] = yi - a[k2 + 1];
-  }
-  a[65] = -a[65];
-}
-#endif
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/utility/ooura_fft_tables_common.h b/modules/audio_processing/utility/ooura_fft_tables_common.h
deleted file mode 100644
index 548027c..0000000
--- a/modules/audio_processing/utility/ooura_fft_tables_common.h
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- *  Copyright (c) 2011 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_PROCESSING_UTILITY_OOURA_FFT_TABLES_COMMON_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_UTILITY_OOURA_FFT_TABLES_COMMON_H_
-
-#include "webrtc/modules/audio_processing/utility/ooura_fft.h"
-
-namespace webrtc {
-
-// This tables used to be computed at run-time. For example, refer to:
-// https://code.google.com/p/webrtc/source/browse/trunk/webrtc/modules/audio_processing/utility/apm_rdft.c?r=6564
-// to see the initialization code.
-// Constants shared by all paths (C, SSE2, NEON).
-const float rdft_w[64] = {
-    1.0000000000f, 0.0000000000f, 0.7071067691f, 0.7071067691f, 0.9238795638f,
-    0.3826834559f, 0.3826834559f, 0.9238795638f, 0.9807852507f, 0.1950903237f,
-    0.5555702448f, 0.8314695954f, 0.8314695954f, 0.5555702448f, 0.1950903237f,
-    0.9807852507f, 0.9951847196f, 0.0980171412f, 0.6343933344f, 0.7730104327f,
-    0.8819212914f, 0.4713967443f, 0.2902846634f, 0.9569403529f, 0.9569403529f,
-    0.2902846634f, 0.4713967443f, 0.8819212914f, 0.7730104327f, 0.6343933344f,
-    0.0980171412f, 0.9951847196f, 0.7071067691f, 0.4993977249f, 0.4975923598f,
-    0.4945882559f, 0.4903926253f, 0.4850156307f, 0.4784701765f, 0.4707720280f,
-    0.4619397819f, 0.4519946277f, 0.4409606457f, 0.4288643003f, 0.4157347977f,
-    0.4016037583f, 0.3865052164f, 0.3704755902f, 0.3535533845f, 0.3357794881f,
-    0.3171966672f, 0.2978496552f, 0.2777851224f, 0.2570513785f, 0.2356983721f,
-    0.2137775421f, 0.1913417280f, 0.1684449315f, 0.1451423317f, 0.1214900985f,
-    0.0975451618f, 0.0733652338f, 0.0490085706f, 0.0245338380f,
-};
-
-// Constants used by the C and MIPS paths.
-const float rdft_wk3ri_first[16] = {
-    1.000000000f, 0.000000000f, 0.382683456f,  0.923879564f,
-    0.831469536f, 0.555570245f, -0.195090353f, 0.980785251f,
-    0.956940353f, 0.290284693f, 0.098017156f,  0.995184720f,
-    0.634393334f, 0.773010492f, -0.471396863f, 0.881921172f,
-};
-const float rdft_wk3ri_second[16] = {
-    -0.707106769f, 0.707106769f,  -0.923879564f, -0.382683456f,
-    -0.980785251f, 0.195090353f,  -0.555570245f, -0.831469536f,
-    -0.881921172f, 0.471396863f,  -0.773010492f, -0.634393334f,
-    -0.995184720f, -0.098017156f, -0.290284693f, -0.956940353f,
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_UTILITY_OOURA_FFT_TABLES_COMMON_H_
diff --git a/modules/audio_processing/utility/ooura_fft_tables_neon_sse2.h b/modules/audio_processing/utility/ooura_fft_tables_neon_sse2.h
deleted file mode 100644
index 1ed646d..0000000
--- a/modules/audio_processing/utility/ooura_fft_tables_neon_sse2.h
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- *  Copyright (c) 2011 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_PROCESSING_UTILITY_OOURA_FFT_TABLES_NEON_SSE2_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_UTILITY_OOURA_FFT_TABLES_NEON_SSE2_H_
-
-#include "webrtc/modules/audio_processing/utility/ooura_fft.h"
-
-#ifdef _MSC_VER /* visual c++ */
-#define ALIGN16_BEG __declspec(align(16))
-#define ALIGN16_END
-#else /* gcc or icc */
-#define ALIGN16_BEG
-#define ALIGN16_END __attribute__((aligned(16)))
-#endif
-
-namespace webrtc {
-
-// These tables used to be computed at run-time. For example, refer to:
-// https://code.google.com/p/webrtc/source/browse/trunk/webrtc/modules/audio_processing/utility/apm_rdft.c?r=6564
-// to see the initialization code.
-#if defined(WEBRTC_ARCH_X86_FAMILY) || defined(WEBRTC_HAS_NEON)
-// Constants used by SSE2 and NEON but initialized in the C path.
-const ALIGN16_BEG float ALIGN16_END k_swap_sign[4] = {-1.f, 1.f, -1.f, 1.f};
-
-ALIGN16_BEG const float ALIGN16_END rdft_wk1r[32] = {
-    1.000000000f, 1.000000000f, 0.707106769f, 0.707106769f, 0.923879564f,
-    0.923879564f, 0.382683456f, 0.382683456f, 0.980785251f, 0.980785251f,
-    0.555570245f, 0.555570245f, 0.831469595f, 0.831469595f, 0.195090324f,
-    0.195090324f, 0.995184720f, 0.995184720f, 0.634393334f, 0.634393334f,
-    0.881921291f, 0.881921291f, 0.290284663f, 0.290284663f, 0.956940353f,
-    0.956940353f, 0.471396744f, 0.471396744f, 0.773010433f, 0.773010433f,
-    0.098017141f, 0.098017141f,
-};
-ALIGN16_BEG const float ALIGN16_END rdft_wk2r[32] = {
-    1.000000000f,  1.000000000f,  -0.000000000f, -0.000000000f, 0.707106769f,
-    0.707106769f,  -0.707106769f, -0.707106769f, 0.923879564f,  0.923879564f,
-    -0.382683456f, -0.382683456f, 0.382683456f,  0.382683456f,  -0.923879564f,
-    -0.923879564f, 0.980785251f,  0.980785251f,  -0.195090324f, -0.195090324f,
-    0.555570245f,  0.555570245f,  -0.831469595f, -0.831469595f, 0.831469595f,
-    0.831469595f,  -0.555570245f, -0.555570245f, 0.195090324f,  0.195090324f,
-    -0.980785251f, -0.980785251f,
-};
-ALIGN16_BEG const float ALIGN16_END rdft_wk3r[32] = {
-    1.000000000f,  1.000000000f,  -0.707106769f, -0.707106769f, 0.382683456f,
-    0.382683456f,  -0.923879564f, -0.923879564f, 0.831469536f,  0.831469536f,
-    -0.980785251f, -0.980785251f, -0.195090353f, -0.195090353f, -0.555570245f,
-    -0.555570245f, 0.956940353f,  0.956940353f,  -0.881921172f, -0.881921172f,
-    0.098017156f,  0.098017156f,  -0.773010492f, -0.773010492f, 0.634393334f,
-    0.634393334f,  -0.995184720f, -0.995184720f, -0.471396863f, -0.471396863f,
-    -0.290284693f, -0.290284693f,
-};
-ALIGN16_BEG const float ALIGN16_END rdft_wk1i[32] = {
-    -0.000000000f, 0.000000000f,  -0.707106769f, 0.707106769f,  -0.382683456f,
-    0.382683456f,  -0.923879564f, 0.923879564f,  -0.195090324f, 0.195090324f,
-    -0.831469595f, 0.831469595f,  -0.555570245f, 0.555570245f,  -0.980785251f,
-    0.980785251f,  -0.098017141f, 0.098017141f,  -0.773010433f, 0.773010433f,
-    -0.471396744f, 0.471396744f,  -0.956940353f, 0.956940353f,  -0.290284663f,
-    0.290284663f,  -0.881921291f, 0.881921291f,  -0.634393334f, 0.634393334f,
-    -0.995184720f, 0.995184720f,
-};
-ALIGN16_BEG const float ALIGN16_END rdft_wk2i[32] = {
-    -0.000000000f, 0.000000000f,  -1.000000000f, 1.000000000f,  -0.707106769f,
-    0.707106769f,  -0.707106769f, 0.707106769f,  -0.382683456f, 0.382683456f,
-    -0.923879564f, 0.923879564f,  -0.923879564f, 0.923879564f,  -0.382683456f,
-    0.382683456f,  -0.195090324f, 0.195090324f,  -0.980785251f, 0.980785251f,
-    -0.831469595f, 0.831469595f,  -0.555570245f, 0.555570245f,  -0.555570245f,
-    0.555570245f,  -0.831469595f, 0.831469595f,  -0.980785251f, 0.980785251f,
-    -0.195090324f, 0.195090324f,
-};
-ALIGN16_BEG const float ALIGN16_END rdft_wk3i[32] = {
-    -0.000000000f, 0.000000000f,  -0.707106769f, 0.707106769f,  -0.923879564f,
-    0.923879564f,  0.382683456f,  -0.382683456f, -0.555570245f, 0.555570245f,
-    -0.195090353f, 0.195090353f,  -0.980785251f, 0.980785251f,  0.831469536f,
-    -0.831469536f, -0.290284693f, 0.290284693f,  -0.471396863f, 0.471396863f,
-    -0.995184720f, 0.995184720f,  0.634393334f,  -0.634393334f, -0.773010492f,
-    0.773010492f,  0.098017156f,  -0.098017156f, -0.881921172f, 0.881921172f,
-    0.956940353f,  -0.956940353f,
-};
-ALIGN16_BEG const float ALIGN16_END cftmdl_wk1r[4] = {
-    0.707106769f, 0.707106769f, 0.707106769f, -0.707106769f,
-};
-#endif
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_UTILITY_OOURA_FFT_TABLES_NEON_SSE2_H_
diff --git a/modules/audio_processing/vad/common.h b/modules/audio_processing/vad/common.h
deleted file mode 100644
index 4b7fb50..0000000
--- a/modules/audio_processing/vad/common.h
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- *  Copyright (c) 2012 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_PROCESSING_VAD_COMMON_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_VAD_COMMON_H_
-
-#include <stddef.h>
-
-static const int kSampleRateHz = 16000;
-static const size_t kLength10Ms = kSampleRateHz / 100;
-static const size_t kMaxNumFrames = 4;
-
-struct AudioFeatures {
-  double log_pitch_gain[kMaxNumFrames];
-  double pitch_lag_hz[kMaxNumFrames];
-  double spectral_peak[kMaxNumFrames];
-  double rms[kMaxNumFrames];
-  size_t num_frames;
-  bool silence;
-};
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_VAD_COMMON_H_
diff --git a/modules/audio_processing/vad/gmm.cc b/modules/audio_processing/vad/gmm.cc
deleted file mode 100644
index 9651975..0000000
--- a/modules/audio_processing/vad/gmm.cc
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- *  Copyright (c) 2012 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_processing/vad/gmm.h"
-
-#include <math.h>
-#include <stdlib.h>
-
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-static const int kMaxDimension = 10;
-
-static void RemoveMean(const double* in,
-                       const double* mean_vec,
-                       int dimension,
-                       double* out) {
-  for (int n = 0; n < dimension; ++n)
-    out[n] = in[n] - mean_vec[n];
-}
-
-static double ComputeExponent(const double* in,
-                              const double* covar_inv,
-                              int dimension) {
-  double q = 0;
-  for (int i = 0; i < dimension; ++i) {
-    double v = 0;
-    for (int j = 0; j < dimension; j++)
-      v += (*covar_inv++) * in[j];
-    q += v * in[i];
-  }
-  q *= -0.5;
-  return q;
-}
-
-double EvaluateGmm(const double* x, const GmmParameters& gmm_parameters) {
-  if (gmm_parameters.dimension > kMaxDimension) {
-    return -1;  // This is invalid pdf so the caller can check this.
-  }
-  double f = 0;
-  double v[kMaxDimension];
-  const double* mean_vec = gmm_parameters.mean;
-  const double* covar_inv = gmm_parameters.covar_inverse;
-
-  for (int n = 0; n < gmm_parameters.num_mixtures; n++) {
-    RemoveMean(x, mean_vec, gmm_parameters.dimension, v);
-    double q = ComputeExponent(v, covar_inv, gmm_parameters.dimension) +
-               gmm_parameters.weight[n];
-    f += exp(q);
-    mean_vec += gmm_parameters.dimension;
-    covar_inv += gmm_parameters.dimension * gmm_parameters.dimension;
-  }
-  return f;
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/vad/gmm.h b/modules/audio_processing/vad/gmm.h
deleted file mode 100644
index 9f3e578..0000000
--- a/modules/audio_processing/vad/gmm.h
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- *  Copyright (c) 2012 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_PROCESSING_VAD_GMM_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_VAD_GMM_H_
-
-namespace webrtc {
-
-// A structure that specifies a GMM.
-// A GMM is formulated as
-//  f(x) = w[0] * mixture[0] + w[1] * mixture[1] + ... +
-//         w[num_mixtures - 1] * mixture[num_mixtures - 1];
-// Where a 'mixture' is a Gaussian density.
-
-struct GmmParameters {
-  // weight[n] = log(w[n]) - |dimension|/2 * log(2*pi) - 1/2 * log(det(cov[n]));
-  // where cov[n] is the covariance matrix of mixture n;
-  const double* weight;
-  // pointer to the first element of a |num_mixtures|x|dimension| matrix
-  // where kth row is the mean of the kth mixture.
-  const double* mean;
-  // pointer to the first element of a |num_mixtures|x|dimension|x|dimension|
-  // 3D-matrix, where the kth 2D-matrix is the inverse of the covariance
-  // matrix of the kth mixture.
-  const double* covar_inverse;
-  // Dimensionality of the mixtures.
-  int dimension;
-  // number of the mixtures.
-  int num_mixtures;
-};
-
-// Evaluate the given GMM, according to |gmm_parameters|, at the given point
-// |x|. If the dimensionality of the given GMM is larger that the maximum
-// acceptable dimension by the following function -1 is returned.
-double EvaluateGmm(const double* x, const GmmParameters& gmm_parameters);
-
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_VAD_GMM_H_
diff --git a/modules/audio_processing/vad/gmm_unittest.cc b/modules/audio_processing/vad/gmm_unittest.cc
deleted file mode 100644
index 46785af..0000000
--- a/modules/audio_processing/vad/gmm_unittest.cc
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- *  Copyright (c) 2012 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_processing/vad/gmm.h"
-
-#include <math.h>
-
-#include "webrtc/modules/audio_processing/vad/noise_gmm_tables.h"
-#include "webrtc/modules/audio_processing/vad/voice_gmm_tables.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-TEST(GmmTest, EvaluateGmm) {
-  GmmParameters noise_gmm;
-  GmmParameters voice_gmm;
-
-  // Setup noise GMM.
-  noise_gmm.dimension = kNoiseGmmDim;
-  noise_gmm.num_mixtures = kNoiseGmmNumMixtures;
-  noise_gmm.weight = kNoiseGmmWeights;
-  noise_gmm.mean = &kNoiseGmmMean[0][0];
-  noise_gmm.covar_inverse = &kNoiseGmmCovarInverse[0][0][0];
-
-  // Setup voice GMM.
-  voice_gmm.dimension = kVoiceGmmDim;
-  voice_gmm.num_mixtures = kVoiceGmmNumMixtures;
-  voice_gmm.weight = kVoiceGmmWeights;
-  voice_gmm.mean = &kVoiceGmmMean[0][0];
-  voice_gmm.covar_inverse = &kVoiceGmmCovarInverse[0][0][0];
-
-  // Test vectors. These are the mean of the GMM means.
-  const double kXVoice[kVoiceGmmDim] = {
-      -1.35893162459863, 602.862491970368, 178.022069191324};
-  const double kXNoise[kNoiseGmmDim] = {
-      -2.33443722724409, 2827.97828765184, 141.114178166812};
-
-  // Expected pdf values. These values are computed in MATLAB using EvalGmm.m
-  const double kPdfNoise = 1.88904409403101e-07;
-  const double kPdfVoice = 1.30453996982266e-06;
-
-  // Relative error should be smaller that the following value.
-  const double kAcceptedRelativeErr = 1e-10;
-
-  // Test Voice.
-  double pdf = EvaluateGmm(kXVoice, voice_gmm);
-  EXPECT_GT(pdf, 0);
-  double relative_error = fabs(pdf - kPdfVoice) / kPdfVoice;
-  EXPECT_LE(relative_error, kAcceptedRelativeErr);
-
-  // Test Noise.
-  pdf = EvaluateGmm(kXNoise, noise_gmm);
-  EXPECT_GT(pdf, 0);
-  relative_error = fabs(pdf - kPdfNoise) / kPdfNoise;
-  EXPECT_LE(relative_error, kAcceptedRelativeErr);
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/vad/noise_gmm_tables.h b/modules/audio_processing/vad/noise_gmm_tables.h
deleted file mode 100644
index 293af57..0000000
--- a/modules/audio_processing/vad/noise_gmm_tables.h
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- *  Copyright (c) 2012 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.
- */
-
-// GMM tables for inactive segments. Generated by MakeGmmTables.m.
-
-#ifndef WEBRTC_MODULES_AUDIO_PROCESSING_VAD_NOISE_GMM_TABLES_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_VAD_NOISE_GMM_TABLES_H_
-
-static const int kNoiseGmmNumMixtures = 12;
-static const int kNoiseGmmDim = 3;
-
-static const double
-    kNoiseGmmCovarInverse[kNoiseGmmNumMixtures][kNoiseGmmDim][kNoiseGmmDim] = {
-        {{7.36219567592941e+00, 4.83060785179861e-03, 1.23335151497610e-02},
-         {4.83060785179861e-03, 1.65289507047817e-04, -2.41490588169997e-04},
-         {1.23335151497610e-02, -2.41490588169997e-04, 6.59472060689382e-03}},
-        {{8.70265239309140e+00, -5.30636201431086e-04, 5.44014966585347e-03},
-         {-5.30636201431086e-04, 3.11095453521008e-04, -1.86287206836035e-04},
-         {5.44014966585347e-03, -1.86287206836035e-04, 6.29493388790744e-04}},
-        {{4.53467851955055e+00, -3.92977536695197e-03, -2.46521420693317e-03},
-         {-3.92977536695197e-03, 4.94650752632750e-05, -1.08587438501826e-05},
-         {-2.46521420693317e-03, -1.08587438501826e-05, 9.28793975422261e-05}},
-        {{9.26817997114275e-01, -4.03976069276753e-04, -3.56441427392165e-03},
-         {-4.03976069276753e-04, 2.51976251631430e-06, 1.46914206734572e-07},
-         {-3.56441427392165e-03, 1.46914206734572e-07, 8.19914567685373e-05}},
-        {{7.61715986787441e+00, -1.54889041216888e-04, 2.41756280071656e-02},
-         {-1.54889041216888e-04, 3.50282550461672e-07, -6.27251196972490e-06},
-         {2.41756280071656e-02, -6.27251196972490e-06, 1.45061847649872e-02}},
-        {{8.31193642663158e+00, -3.84070508164323e-04, -3.09750630821876e-02},
-         {-3.84070508164323e-04, 3.80433432277336e-07, -1.14321142836636e-06},
-         {-3.09750630821876e-02, -1.14321142836636e-06, 8.35091486289997e-04}},
-        {{9.67283151270894e-01, 5.82465812445039e-05, -3.18350798617053e-03},
-         {5.82465812445039e-05, 2.23762672000318e-07, -7.74196587408623e-07},
-         {-3.18350798617053e-03, -7.74196587408623e-07, 3.85120938338325e-04}},
-        {{8.28066236985388e+00, 5.87634508319763e-05, 6.99303090891743e-03},
-         {5.87634508319763e-05, 2.93746018618058e-07, 3.40843332882272e-07},
-         {6.99303090891743e-03, 3.40843332882272e-07, 1.99379171190344e-04}},
-        {{6.07488998675646e+00, -1.11494526618473e-02, 5.10013111123381e-03},
-         {-1.11494526618473e-02, 6.99238879921751e-04, 5.36718550370870e-05},
-         {5.10013111123381e-03, 5.36718550370870e-05, 5.26909853276753e-04}},
-        {{6.90492021419175e+00, 4.20639355257863e-04, -2.38612752336481e-03},
-         {4.20639355257863e-04, 3.31246767338153e-06, -2.42052288150859e-08},
-         {-2.38612752336481e-03, -2.42052288150859e-08, 4.46608368363412e-04}},
-        {{1.31069150869715e+01, -1.73718583865670e-04, -1.97591814508578e-02},
-         {-1.73718583865670e-04, 2.80451716300124e-07, 9.96570755379865e-07},
-         {-1.97591814508578e-02, 9.96570755379865e-07, 2.41361900868847e-03}},
-        {{4.69566344239814e+00, -2.61077567563690e-04, 5.26359000761433e-03},
-         {-2.61077567563690e-04, 1.82420859823767e-06, -7.83645887541601e-07},
-         {5.26359000761433e-03, -7.83645887541601e-07, 1.33586288288802e-02}}};
-
-static const double kNoiseGmmMean[kNoiseGmmNumMixtures][kNoiseGmmDim] = {
-    {-2.01386094766163e+00, 1.69702162045397e+02, 7.41715804872181e+01},
-    {-1.94684591777290e+00, 1.42398396732668e+02, 1.64186321157831e+02},
-    {-2.29319297562437e+00, 3.86415425589868e+02, 2.13452215267125e+02},
-    {-3.25487177070268e+00, 1.08668712553616e+03, 2.33119949467419e+02},
-    {-2.13159632447467e+00, 4.83821702557717e+03, 6.86786166673740e+01},
-    {-2.26171410780526e+00, 4.79420193982422e+03, 1.53222513286450e+02},
-    {-3.32166740703185e+00, 4.35161135834358e+03, 1.33206448431316e+02},
-    {-2.19290322814343e+00, 3.98325506609408e+03, 2.13249167359934e+02},
-    {-2.02898459255404e+00, 7.37039893155007e+03, 1.12518527491926e+02},
-    {-2.26150236399500e+00, 1.54896745196145e+03, 1.49717357868579e+02},
-    {-2.00417668301790e+00, 3.82434760310304e+03, 1.07438913004312e+02},
-    {-2.30193040814533e+00, 1.43953696546439e+03, 7.04085275122649e+01}};
-
-static const double kNoiseGmmWeights[kNoiseGmmNumMixtures] = {
-    -1.09422832086193e+01,
-    -1.10847897513425e+01,
-    -1.36767587732187e+01,
-    -1.79789356118641e+01,
-    -1.42830169160894e+01,
-    -1.56500228061379e+01,
-    -1.83124990950113e+01,
-    -1.69979436177477e+01,
-    -1.12329424387828e+01,
-    -1.41311785780639e+01,
-    -1.47171861448585e+01,
-    -1.35963362781839e+01};
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_VAD_NOISE_GMM_TABLES_H_
diff --git a/modules/audio_processing/vad/pitch_based_vad.cc b/modules/audio_processing/vad/pitch_based_vad.cc
deleted file mode 100644
index 6ef1e39..0000000
--- a/modules/audio_processing/vad/pitch_based_vad.cc
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- *  Copyright (c) 2012 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_processing/vad/pitch_based_vad.h"
-
-#include <math.h>
-#include <string.h>
-
-#include "webrtc/modules/audio_processing/vad/vad_circular_buffer.h"
-#include "webrtc/modules/audio_processing/vad/common.h"
-#include "webrtc/modules/audio_processing/vad/noise_gmm_tables.h"
-#include "webrtc/modules/audio_processing/vad/voice_gmm_tables.h"
-#include "webrtc/modules/include/module_common_types.h"
-
-namespace webrtc {
-
-static_assert(kNoiseGmmDim == kVoiceGmmDim,
-              "noise and voice gmm dimension not equal");
-
-// These values should match MATLAB counterparts for unit-tests to pass.
-static const int kPosteriorHistorySize = 500;  // 5 sec of 10 ms frames.
-static const double kInitialPriorProbability = 0.3;
-static const int kTransientWidthThreshold = 7;
-static const double kLowProbabilityThreshold = 0.2;
-
-static double LimitProbability(double p) {
-  const double kLimHigh = 0.99;
-  const double kLimLow = 0.01;
-
-  if (p > kLimHigh)
-    p = kLimHigh;
-  else if (p < kLimLow)
-    p = kLimLow;
-  return p;
-}
-
-PitchBasedVad::PitchBasedVad()
-    : p_prior_(kInitialPriorProbability),
-      circular_buffer_(VadCircularBuffer::Create(kPosteriorHistorySize)) {
-  // Setup noise GMM.
-  noise_gmm_.dimension = kNoiseGmmDim;
-  noise_gmm_.num_mixtures = kNoiseGmmNumMixtures;
-  noise_gmm_.weight = kNoiseGmmWeights;
-  noise_gmm_.mean = &kNoiseGmmMean[0][0];
-  noise_gmm_.covar_inverse = &kNoiseGmmCovarInverse[0][0][0];
-
-  // Setup voice GMM.
-  voice_gmm_.dimension = kVoiceGmmDim;
-  voice_gmm_.num_mixtures = kVoiceGmmNumMixtures;
-  voice_gmm_.weight = kVoiceGmmWeights;
-  voice_gmm_.mean = &kVoiceGmmMean[0][0];
-  voice_gmm_.covar_inverse = &kVoiceGmmCovarInverse[0][0][0];
-}
-
-PitchBasedVad::~PitchBasedVad() {
-}
-
-int PitchBasedVad::VoicingProbability(const AudioFeatures& features,
-                                      double* p_combined) {
-  double p;
-  double gmm_features[3];
-  double pdf_features_given_voice;
-  double pdf_features_given_noise;
-  // These limits are the same in matlab implementation 'VoicingProbGMM().'
-  const double kLimLowLogPitchGain = -2.0;
-  const double kLimHighLogPitchGain = -0.9;
-  const double kLimLowSpectralPeak = 200;
-  const double kLimHighSpectralPeak = 2000;
-  const double kEps = 1e-12;
-  for (size_t n = 0; n < features.num_frames; n++) {
-    gmm_features[0] = features.log_pitch_gain[n];
-    gmm_features[1] = features.spectral_peak[n];
-    gmm_features[2] = features.pitch_lag_hz[n];
-
-    pdf_features_given_voice = EvaluateGmm(gmm_features, voice_gmm_);
-    pdf_features_given_noise = EvaluateGmm(gmm_features, noise_gmm_);
-
-    if (features.spectral_peak[n] < kLimLowSpectralPeak ||
-        features.spectral_peak[n] > kLimHighSpectralPeak ||
-        features.log_pitch_gain[n] < kLimLowLogPitchGain) {
-      pdf_features_given_voice = kEps * pdf_features_given_noise;
-    } else if (features.log_pitch_gain[n] > kLimHighLogPitchGain) {
-      pdf_features_given_noise = kEps * pdf_features_given_voice;
-    }
-
-    p = p_prior_ * pdf_features_given_voice /
-        (pdf_features_given_voice * p_prior_ +
-         pdf_features_given_noise * (1 - p_prior_));
-
-    p = LimitProbability(p);
-
-    // Combine pitch-based probability with standalone probability, before
-    // updating prior probabilities.
-    double prod_active = p * p_combined[n];
-    double prod_inactive = (1 - p) * (1 - p_combined[n]);
-    p_combined[n] = prod_active / (prod_active + prod_inactive);
-
-    if (UpdatePrior(p_combined[n]) < 0)
-      return -1;
-    // Limit prior probability. With a zero prior probability the posterior
-    // probability is always zero.
-    p_prior_ = LimitProbability(p_prior_);
-  }
-  return 0;
-}
-
-int PitchBasedVad::UpdatePrior(double p) {
-  circular_buffer_->Insert(p);
-  if (circular_buffer_->RemoveTransient(kTransientWidthThreshold,
-                                        kLowProbabilityThreshold) < 0)
-    return -1;
-  p_prior_ = circular_buffer_->Mean();
-  return 0;
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/vad/pitch_based_vad.h b/modules/audio_processing/vad/pitch_based_vad.h
deleted file mode 100644
index 4fb0c55..0000000
--- a/modules/audio_processing/vad/pitch_based_vad.h
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- *  Copyright (c) 2012 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_PROCESSING_VAD_PITCH_BASED_VAD_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_VAD_PITCH_BASED_VAD_H_
-
-#include <memory>
-
-#include "webrtc/modules/audio_processing/vad/common.h"
-#include "webrtc/modules/audio_processing/vad/gmm.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-class AudioFrame;
-class VadCircularBuffer;
-
-// Computes the probability of the input audio frame to be active given
-// the corresponding pitch-gain and lag of the frame.
-class PitchBasedVad {
- public:
-  PitchBasedVad();
-  ~PitchBasedVad();
-
-  // Compute pitch-based voicing probability, given the features.
-  //   features: a structure containing features required for computing voicing
-  //             probabilities.
-  //
-  //   p_combined: an array which contains the combined activity probabilities
-  //               computed prior to the call of this function. The method,
-  //               then, computes the voicing probabilities and combine them
-  //               with the given values. The result are returned in |p|.
-  int VoicingProbability(const AudioFeatures& features, double* p_combined);
-
- private:
-  int UpdatePrior(double p);
-
-  // TODO(turajs): maybe defining this at a higher level (maybe enum) so that
-  // all the code recognize it as "no-error."
-  static const int kNoError = 0;
-
-  GmmParameters noise_gmm_;
-  GmmParameters voice_gmm_;
-
-  double p_prior_;
-
-  std::unique_ptr<VadCircularBuffer> circular_buffer_;
-};
-
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_VAD_PITCH_BASED_VAD_H_
diff --git a/modules/audio_processing/vad/pitch_based_vad_unittest.cc b/modules/audio_processing/vad/pitch_based_vad_unittest.cc
deleted file mode 100644
index 5d82095..0000000
--- a/modules/audio_processing/vad/pitch_based_vad_unittest.cc
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- *  Copyright (c) 2012 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_processing/vad/pitch_based_vad.h"
-
-#include <math.h>
-#include <stdio.h>
-
-#include <string>
-
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/testsupport/fileutils.h"
-
-namespace webrtc {
-
-TEST(PitchBasedVadTest, VoicingProbabilityTest) {
-  std::string spectral_peak_file_name =
-      test::ResourcePath("audio_processing/agc/agc_spectral_peak", "dat");
-  FILE* spectral_peak_file = fopen(spectral_peak_file_name.c_str(), "rb");
-  ASSERT_TRUE(spectral_peak_file != NULL);
-
-  std::string pitch_gain_file_name =
-      test::ResourcePath("audio_processing/agc/agc_pitch_gain", "dat");
-  FILE* pitch_gain_file = fopen(pitch_gain_file_name.c_str(), "rb");
-  ASSERT_TRUE(pitch_gain_file != NULL);
-
-  std::string pitch_lag_file_name =
-      test::ResourcePath("audio_processing/agc/agc_pitch_lag", "dat");
-  FILE* pitch_lag_file = fopen(pitch_lag_file_name.c_str(), "rb");
-  ASSERT_TRUE(pitch_lag_file != NULL);
-
-  std::string voicing_prob_file_name =
-      test::ResourcePath("audio_processing/agc/agc_voicing_prob", "dat");
-  FILE* voicing_prob_file = fopen(voicing_prob_file_name.c_str(), "rb");
-  ASSERT_TRUE(voicing_prob_file != NULL);
-
-  PitchBasedVad vad_;
-
-  double reference_activity_probability;
-
-  AudioFeatures audio_features;
-  memset(&audio_features, 0, sizeof(audio_features));
-  audio_features.num_frames = 1;
-  while (fread(audio_features.spectral_peak,
-               sizeof(audio_features.spectral_peak[0]), 1,
-               spectral_peak_file) == 1u) {
-    double p;
-    ASSERT_EQ(1u, fread(audio_features.log_pitch_gain,
-                        sizeof(audio_features.log_pitch_gain[0]), 1,
-                        pitch_gain_file));
-    ASSERT_EQ(1u,
-              fread(audio_features.pitch_lag_hz,
-                    sizeof(audio_features.pitch_lag_hz[0]), 1, pitch_lag_file));
-    ASSERT_EQ(1u, fread(&reference_activity_probability,
-                        sizeof(reference_activity_probability), 1,
-                        voicing_prob_file));
-
-    p = 0.5;  // Initialize to the neutral value for combining probabilities.
-    EXPECT_EQ(0, vad_.VoicingProbability(audio_features, &p));
-    EXPECT_NEAR(p, reference_activity_probability, 0.01);
-  }
-
-  fclose(spectral_peak_file);
-  fclose(pitch_gain_file);
-  fclose(pitch_lag_file);
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/vad/pitch_internal.cc b/modules/audio_processing/vad/pitch_internal.cc
deleted file mode 100644
index 309b45a..0000000
--- a/modules/audio_processing/vad/pitch_internal.cc
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- *  Copyright (c) 2012 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_processing/vad/pitch_internal.h"
-
-#include <cmath>
-
-// A 4-to-3 linear interpolation.
-// The interpolation constants are derived as following:
-// Input pitch parameters are updated every 7.5 ms. Within a 30-ms interval
-// we are interested in pitch parameters of 0-5 ms, 10-15ms and 20-25ms. This is
-// like interpolating 4-to-6 and keep the odd samples.
-// The reason behind this is that LPC coefficients are computed for the first
-// half of each 10ms interval.
-static void PitchInterpolation(double old_val, const double* in, double* out) {
-  out[0] = 1. / 6. * old_val + 5. / 6. * in[0];
-  out[1] = 5. / 6. * in[1] + 1. / 6. * in[2];
-  out[2] = 0.5 * in[2] + 0.5 * in[3];
-}
-
-void GetSubframesPitchParameters(int sampling_rate_hz,
-                                 double* gains,
-                                 double* lags,
-                                 int num_in_frames,
-                                 int num_out_frames,
-                                 double* log_old_gain,
-                                 double* old_lag,
-                                 double* log_pitch_gain,
-                                 double* pitch_lag_hz) {
-  // Gain interpolation is in log-domain, also returned in log-domain.
-  for (int n = 0; n < num_in_frames; n++)
-    gains[n] = log(gains[n] + 1e-12);
-
-  // Interpolate lags and gains.
-  PitchInterpolation(*log_old_gain, gains, log_pitch_gain);
-  *log_old_gain = gains[num_in_frames - 1];
-  PitchInterpolation(*old_lag, lags, pitch_lag_hz);
-  *old_lag = lags[num_in_frames - 1];
-
-  // Convert pitch-lags to Hertz.
-  for (int n = 0; n < num_out_frames; n++) {
-    pitch_lag_hz[n] = (sampling_rate_hz) / (pitch_lag_hz[n]);
-  }
-}
diff --git a/modules/audio_processing/vad/pitch_internal.h b/modules/audio_processing/vad/pitch_internal.h
deleted file mode 100644
index b25b1a8..0000000
--- a/modules/audio_processing/vad/pitch_internal.h
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- *  Copyright (c) 2012 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_PROCESSING_VAD_PITCH_INTERNAL_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_VAD_PITCH_INTERNAL_H_
-
-// TODO(turajs): Write a description of this function. Also be consistent with
-// usage of |sampling_rate_hz| vs |kSamplingFreqHz|.
-void GetSubframesPitchParameters(int sampling_rate_hz,
-                                 double* gains,
-                                 double* lags,
-                                 int num_in_frames,
-                                 int num_out_frames,
-                                 double* log_old_gain,
-                                 double* old_lag,
-                                 double* log_pitch_gain,
-                                 double* pitch_lag_hz);
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_VAD_PITCH_INTERNAL_H_
diff --git a/modules/audio_processing/vad/pitch_internal_unittest.cc b/modules/audio_processing/vad/pitch_internal_unittest.cc
deleted file mode 100644
index 70124f8..0000000
--- a/modules/audio_processing/vad/pitch_internal_unittest.cc
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- *  Copyright (c) 2012 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_processing/vad/pitch_internal.h"
-
-#include <math.h>
-
-#include "webrtc/test/gtest.h"
-
-TEST(PitchInternalTest, test) {
-  const int kSamplingRateHz = 8000;
-  const int kNumInputParameters = 4;
-  const int kNumOutputParameters = 3;
-  // Inputs
-  double log_old_gain = log(0.5);
-  double gains[] = {0.6, 0.2, 0.5, 0.4};
-
-  double old_lag = 70;
-  double lags[] = {90, 111, 122, 50};
-
-  // Expected outputs
-  double expected_log_pitch_gain[] = {
-      -0.541212549898316, -1.45672279045507, -0.80471895621705};
-  double expected_log_old_gain = log(gains[kNumInputParameters - 1]);
-
-  double expected_pitch_lag_hz[] = {
-      92.3076923076923, 70.9010339734121, 93.0232558139535};
-  double expected_old_lag = lags[kNumInputParameters - 1];
-
-  double log_pitch_gain[kNumOutputParameters];
-  double pitch_lag_hz[kNumInputParameters];
-
-  GetSubframesPitchParameters(kSamplingRateHz, gains, lags, kNumInputParameters,
-                              kNumOutputParameters, &log_old_gain, &old_lag,
-                              log_pitch_gain, pitch_lag_hz);
-
-  for (int n = 0; n < 3; n++) {
-    EXPECT_NEAR(pitch_lag_hz[n], expected_pitch_lag_hz[n], 1e-6);
-    EXPECT_NEAR(log_pitch_gain[n], expected_log_pitch_gain[n], 1e-8);
-  }
-  EXPECT_NEAR(old_lag, expected_old_lag, 1e-6);
-  EXPECT_NEAR(log_old_gain, expected_log_old_gain, 1e-8);
-}
diff --git a/modules/audio_processing/vad/pole_zero_filter.cc b/modules/audio_processing/vad/pole_zero_filter.cc
deleted file mode 100644
index 9769515..0000000
--- a/modules/audio_processing/vad/pole_zero_filter.cc
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- *  Copyright (c) 2012 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_processing/vad/pole_zero_filter.h"
-
-#include <stdlib.h>
-#include <string.h>
-#include <algorithm>
-
-namespace webrtc {
-
-PoleZeroFilter* PoleZeroFilter::Create(const float* numerator_coefficients,
-                                       size_t order_numerator,
-                                       const float* denominator_coefficients,
-                                       size_t order_denominator) {
-  if (order_numerator > kMaxFilterOrder ||
-      order_denominator > kMaxFilterOrder || denominator_coefficients[0] == 0 ||
-      numerator_coefficients == NULL || denominator_coefficients == NULL)
-    return NULL;
-  return new PoleZeroFilter(numerator_coefficients, order_numerator,
-                            denominator_coefficients, order_denominator);
-}
-
-PoleZeroFilter::PoleZeroFilter(const float* numerator_coefficients,
-                               size_t order_numerator,
-                               const float* denominator_coefficients,
-                               size_t order_denominator)
-    : past_input_(),
-      past_output_(),
-      numerator_coefficients_(),
-      denominator_coefficients_(),
-      order_numerator_(order_numerator),
-      order_denominator_(order_denominator),
-      highest_order_(std::max(order_denominator, order_numerator)) {
-  memcpy(numerator_coefficients_, numerator_coefficients,
-         sizeof(numerator_coefficients_[0]) * (order_numerator_ + 1));
-  memcpy(denominator_coefficients_, denominator_coefficients,
-         sizeof(denominator_coefficients_[0]) * (order_denominator_ + 1));
-
-  if (denominator_coefficients_[0] != 1) {
-    for (size_t n = 0; n <= order_numerator_; n++)
-      numerator_coefficients_[n] /= denominator_coefficients_[0];
-    for (size_t n = 0; n <= order_denominator_; n++)
-      denominator_coefficients_[n] /= denominator_coefficients_[0];
-  }
-}
-
-template <typename T>
-static float FilterArPast(const T* past, size_t order,
-                          const float* coefficients) {
-  float sum = 0.0f;
-  size_t past_index = order - 1;
-  for (size_t k = 1; k <= order; k++, past_index--)
-    sum += coefficients[k] * past[past_index];
-  return sum;
-}
-
-int PoleZeroFilter::Filter(const int16_t* in,
-                           size_t num_input_samples,
-                           float* output) {
-  if (in == NULL || output == NULL)
-    return -1;
-  // This is the typical case, just a memcpy.
-  const size_t k = std::min(num_input_samples, highest_order_);
-  size_t n;
-  for (n = 0; n < k; n++) {
-    output[n] = in[n] * numerator_coefficients_[0];
-    output[n] += FilterArPast(&past_input_[n], order_numerator_,
-                              numerator_coefficients_);
-    output[n] -= FilterArPast(&past_output_[n], order_denominator_,
-                              denominator_coefficients_);
-
-    past_input_[n + order_numerator_] = in[n];
-    past_output_[n + order_denominator_] = output[n];
-  }
-  if (highest_order_ < num_input_samples) {
-    for (size_t m = 0; n < num_input_samples; n++, m++) {
-      output[n] = in[n] * numerator_coefficients_[0];
-      output[n] +=
-          FilterArPast(&in[m], order_numerator_, numerator_coefficients_);
-      output[n] -= FilterArPast(&output[m], order_denominator_,
-                                denominator_coefficients_);
-    }
-    // Record into the past signal.
-    memcpy(past_input_, &in[num_input_samples - order_numerator_],
-           sizeof(in[0]) * order_numerator_);
-    memcpy(past_output_, &output[num_input_samples - order_denominator_],
-           sizeof(output[0]) * order_denominator_);
-  } else {
-    // Odd case that the length of the input is shorter that filter order.
-    memmove(past_input_, &past_input_[num_input_samples],
-            order_numerator_ * sizeof(past_input_[0]));
-    memmove(past_output_, &past_output_[num_input_samples],
-            order_denominator_ * sizeof(past_output_[0]));
-  }
-  return 0;
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/vad/pole_zero_filter.h b/modules/audio_processing/vad/pole_zero_filter.h
deleted file mode 100644
index bd13050..0000000
--- a/modules/audio_processing/vad/pole_zero_filter.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- *  Copyright (c) 2012 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_PROCESSING_VAD_POLE_ZERO_FILTER_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_VAD_POLE_ZERO_FILTER_H_
-
-#include <cstddef>
-
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-class PoleZeroFilter {
- public:
-  ~PoleZeroFilter() {}
-
-  static PoleZeroFilter* Create(const float* numerator_coefficients,
-                                size_t order_numerator,
-                                const float* denominator_coefficients,
-                                size_t order_denominator);
-
-  int Filter(const int16_t* in, size_t num_input_samples, float* output);
-
- private:
-  PoleZeroFilter(const float* numerator_coefficients,
-                 size_t order_numerator,
-                 const float* denominator_coefficients,
-                 size_t order_denominator);
-
-  static const int kMaxFilterOrder = 24;
-
-  int16_t past_input_[kMaxFilterOrder * 2];
-  float past_output_[kMaxFilterOrder * 2];
-
-  float numerator_coefficients_[kMaxFilterOrder + 1];
-  float denominator_coefficients_[kMaxFilterOrder + 1];
-
-  size_t order_numerator_;
-  size_t order_denominator_;
-  size_t highest_order_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_VAD_POLE_ZERO_FILTER_H_
diff --git a/modules/audio_processing/vad/pole_zero_filter_unittest.cc b/modules/audio_processing/vad/pole_zero_filter_unittest.cc
deleted file mode 100644
index 71e7213..0000000
--- a/modules/audio_processing/vad/pole_zero_filter_unittest.cc
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- *  Copyright (c) 2012 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_processing/vad/pole_zero_filter.h"
-
-#include <math.h>
-#include <stdio.h>
-
-#include <memory>
-
-#include "webrtc/modules/audio_processing/vad/vad_audio_proc_internal.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/testsupport/fileutils.h"
-
-namespace webrtc {
-
-static const int kInputSamples = 50;
-
-static const int16_t kInput[kInputSamples] = {
-    -2136,  -7116, 10715,  2464,   3164,   8139,   11393, 24013, -32117, -5544,
-    -27740, 10181, 14190,  -24055, -15912, 17393,  6359,  -9950, -13894, 32432,
-    -23944, 3437,  -8381,  19768,  3087,   -19795, -5920, 13310, 1407,   3876,
-    4059,   3524,  -23130, 19121,  -27900, -24840, 4089,  21422, -3625,  3015,
-    -11236, 28856, 13424,  6571,   -19761, -6361,  15821, -9469, 29727,  32229};
-
-static const float kReferenceOutput[kInputSamples] = {
-    -2082.230472f,  -6878.572941f,  10697.090871f,  2358.373952f,
-    2973.936512f,   7738.580650f,   10690.803213f,  22687.091576f,
-    -32676.684717f, -5879.621684f,  -27359.297432f, 10368.735888f,
-    13994.584604f,  -23676.126249f, -15078.250390f, 17818.253338f,
-    6577.743123f,   -9498.369315f,  -13073.651079f, 32460.026588f,
-    -23391.849347f, 3953.805667f,   -7667.761363f,  19995.153447f,
-    3185.575477f,   -19207.365160f, -5143.103201f,  13756.317237f,
-    1779.654794f,   4142.269755f,   4209.475034f,   3572.991789f,
-    -22509.089546f, 19307.878964f,  -27060.439759f, -23319.042810f,
-    5547.685267f,   22312.718676f,  -2707.309027f,  3852.358490f,
-    -10135.510093f, 29241.509970f,  13394.397233f,  6340.721417f,
-    -19510.207905f, -5908.442086f,  15882.301634f,  -9211.335255f,
-    29253.056735f,  30874.443046f};
-
-class PoleZeroFilterTest : public ::testing::Test {
- protected:
-  PoleZeroFilterTest()
-      : my_filter_(PoleZeroFilter::Create(kCoeffNumerator,
-                                          kFilterOrder,
-                                          kCoeffDenominator,
-                                          kFilterOrder)) {}
-
-  ~PoleZeroFilterTest() {}
-
-  void FilterSubframes(int num_subframes);
-
- private:
-  void TestClean();
-  std::unique_ptr<PoleZeroFilter> my_filter_;
-};
-
-void PoleZeroFilterTest::FilterSubframes(int num_subframes) {
-  float output[kInputSamples];
-  const int num_subframe_samples = kInputSamples / num_subframes;
-  EXPECT_EQ(num_subframe_samples * num_subframes, kInputSamples);
-
-  for (int n = 0; n < num_subframes; n++) {
-    my_filter_->Filter(&kInput[n * num_subframe_samples], num_subframe_samples,
-                       &output[n * num_subframe_samples]);
-  }
-  for (int n = 0; n < kInputSamples; n++) {
-    EXPECT_NEAR(output[n], kReferenceOutput[n], 1);
-  }
-}
-
-TEST_F(PoleZeroFilterTest, OneSubframe) {
-  FilterSubframes(1);
-}
-
-TEST_F(PoleZeroFilterTest, TwoSubframes) {
-  FilterSubframes(2);
-}
-
-TEST_F(PoleZeroFilterTest, FiveSubframes) {
-  FilterSubframes(5);
-}
-
-TEST_F(PoleZeroFilterTest, TenSubframes) {
-  FilterSubframes(10);
-}
-
-TEST_F(PoleZeroFilterTest, TwentyFiveSubframes) {
-  FilterSubframes(25);
-}
-
-TEST_F(PoleZeroFilterTest, FiftySubframes) {
-  FilterSubframes(50);
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/vad/standalone_vad.cc b/modules/audio_processing/vad/standalone_vad.cc
deleted file mode 100644
index 7848134..0000000
--- a/modules/audio_processing/vad/standalone_vad.cc
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- *  Copyright (c) 2012 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_processing/vad/standalone_vad.h"
-
-#include "webrtc/audio/utility/audio_frame_operations.h"
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-static const int kDefaultStandaloneVadMode = 3;
-
-StandaloneVad::StandaloneVad(VadInst* vad)
-    : vad_(vad), buffer_(), index_(0), mode_(kDefaultStandaloneVadMode) {
-}
-
-StandaloneVad::~StandaloneVad() {
-  WebRtcVad_Free(vad_);
-}
-
-StandaloneVad* StandaloneVad::Create() {
-  VadInst* vad = WebRtcVad_Create();
-  if (!vad)
-    return nullptr;
-
-  int err = WebRtcVad_Init(vad);
-  err |= WebRtcVad_set_mode(vad, kDefaultStandaloneVadMode);
-  if (err != 0) {
-    WebRtcVad_Free(vad);
-    return nullptr;
-  }
-  return new StandaloneVad(vad);
-}
-
-int StandaloneVad::AddAudio(const int16_t* data, size_t length) {
-  if (length != kLength10Ms)
-    return -1;
-
-  if (index_ + length > kLength10Ms * kMaxNum10msFrames)
-    // Reset the buffer if it's full.
-    // TODO(ajm): Instead, consider just processing every 10 ms frame. Then we
-    // can forgo the buffering.
-    index_ = 0;
-
-  memcpy(&buffer_[index_], data, sizeof(int16_t) * length);
-  index_ += length;
-  return 0;
-}
-
-int StandaloneVad::GetActivity(double* p, size_t length_p) {
-  if (index_ == 0)
-    return -1;
-
-  const size_t num_frames = index_ / kLength10Ms;
-  if (num_frames > length_p)
-    return -1;
-  RTC_DCHECK_EQ(0, WebRtcVad_ValidRateAndFrameLength(kSampleRateHz, index_));
-
-  int activity = WebRtcVad_Process(vad_, kSampleRateHz, buffer_, index_);
-  if (activity < 0)
-    return -1;
-  else if (activity == 0)
-    p[0] = 0.01;  // Arbitrary but small and non-zero.
-  else
-    p[0] = 0.5;  // 0.5 is neutral values when combinned by other probabilities.
-  for (size_t n = 1; n < num_frames; n++)
-    p[n] = p[0];
-  // Reset the buffer to start from the beginning.
-  index_ = 0;
-  return activity;
-}
-
-int StandaloneVad::set_mode(int mode) {
-  if (mode < 0 || mode > 3)
-    return -1;
-  if (WebRtcVad_set_mode(vad_, mode) != 0)
-    return -1;
-
-  mode_ = mode;
-  return 0;
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/vad/standalone_vad.h b/modules/audio_processing/vad/standalone_vad.h
deleted file mode 100644
index 3cf1a42..0000000
--- a/modules/audio_processing/vad/standalone_vad.h
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- *  Copyright (c) 2012 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_PROCESSING_AGC_STANDALONE_VAD_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_AGC_STANDALONE_VAD_H_
-
-#include "webrtc/modules/audio_processing/vad/common.h"
-#include "webrtc/common_audio/vad/include/webrtc_vad.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-class AudioFrame;
-
-class StandaloneVad {
- public:
-  static StandaloneVad* Create();
-  ~StandaloneVad();
-
-  // Outputs
-  //   p: a buffer where probabilities are written to.
-  //   length_p: number of elements of |p|.
-  //
-  // return value:
-  //    -1: if no audio is stored or VAD returns error.
-  //     0: in success.
-  // In case of error the content of |activity| is unchanged.
-  //
-  // Note that due to a high false-positive (VAD decision is active while the
-  // processed audio is just background noise) rate, stand-alone VAD is used as
-  // a one-sided indicator. The activity probability is 0.5 if the frame is
-  // classified as active, and the probability is 0.01 if the audio is
-  // classified as passive. In this way, when probabilities are combined, the
-  // effect of the stand-alone VAD is neutral if the input is classified as
-  // active.
-  int GetActivity(double* p, size_t length_p);
-
-  // Expecting 10 ms of 16 kHz audio to be pushed in.
-  int AddAudio(const int16_t* data, size_t length);
-
-  // Set aggressiveness of VAD, 0 is the least aggressive and 3 is the most
-  // aggressive mode. Returns -1 if the input is less than 0 or larger than 3,
-  // otherwise 0 is returned.
-  int set_mode(int mode);
-  // Get the agressiveness of the current VAD.
-  int mode() const { return mode_; }
-
- private:
-  explicit StandaloneVad(VadInst* vad);
-
-  static const size_t kMaxNum10msFrames = 3;
-
-  // TODO(turajs): Is there a way to use scoped-pointer here?
-  VadInst* vad_;
-  int16_t buffer_[kMaxNum10msFrames * kLength10Ms];
-  size_t index_;
-  int mode_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_AGC_STANDALONE_VAD_H_
diff --git a/modules/audio_processing/vad/standalone_vad_unittest.cc b/modules/audio_processing/vad/standalone_vad_unittest.cc
deleted file mode 100644
index 5ed39b8..0000000
--- a/modules/audio_processing/vad/standalone_vad_unittest.cc
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- *  Copyright (c) 2012 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_processing/vad/standalone_vad.h"
-
-#include <string.h>
-
-#include <memory>
-
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/testsupport/fileutils.h"
-
-namespace webrtc {
-
-TEST(StandaloneVadTest, Api) {
-  std::unique_ptr<StandaloneVad> vad(StandaloneVad::Create());
-  int16_t data[kLength10Ms] = {0};
-
-  // Valid frame length (for 32 kHz rate), but not what the VAD is expecting.
-  EXPECT_EQ(-1, vad->AddAudio(data, 320));
-
-  const size_t kMaxNumFrames = 3;
-  double p[kMaxNumFrames];
-  for (size_t n = 0; n < kMaxNumFrames; n++)
-    EXPECT_EQ(0, vad->AddAudio(data, kLength10Ms));
-
-  // Pretend |p| is shorter that it should be.
-  EXPECT_EQ(-1, vad->GetActivity(p, kMaxNumFrames - 1));
-
-  EXPECT_EQ(0, vad->GetActivity(p, kMaxNumFrames));
-
-  // Ask for activity when buffer is empty.
-  EXPECT_EQ(-1, vad->GetActivity(p, kMaxNumFrames));
-
-  // Should reset and result in one buffer.
-  for (size_t n = 0; n < kMaxNumFrames + 1; n++)
-    EXPECT_EQ(0, vad->AddAudio(data, kLength10Ms));
-  EXPECT_EQ(0, vad->GetActivity(p, 1));
-
-  // Wrong modes
-  EXPECT_EQ(-1, vad->set_mode(-1));
-  EXPECT_EQ(-1, vad->set_mode(4));
-
-  // Valid mode.
-  const int kMode = 2;
-  EXPECT_EQ(0, vad->set_mode(kMode));
-  EXPECT_EQ(kMode, vad->mode());
-}
-
-#if defined(WEBRTC_IOS)
-TEST(StandaloneVadTest, DISABLED_ActivityDetection) {
-#else
-TEST(StandaloneVadTest, ActivityDetection) {
-#endif
-  std::unique_ptr<StandaloneVad> vad(StandaloneVad::Create());
-  const size_t kDataLength = kLength10Ms;
-  int16_t data[kDataLength] = {0};
-
-  FILE* pcm_file =
-      fopen(test::ResourcePath("audio_processing/agc/agc_audio", "pcm").c_str(),
-            "rb");
-  ASSERT_TRUE(pcm_file != NULL);
-
-  FILE* reference_file = fopen(
-      test::ResourcePath("audio_processing/agc/agc_vad", "dat").c_str(), "rb");
-  ASSERT_TRUE(reference_file != NULL);
-
-  // Reference activities are prepared with 0 aggressiveness.
-  ASSERT_EQ(0, vad->set_mode(0));
-
-  // Stand-alone VAD can operate on 1, 2 or 3 frames of length 10 ms. The
-  // reference file is created for 30 ms frame.
-  const int kNumVadFramesToProcess = 3;
-  int num_frames = 0;
-  while (fread(data, sizeof(int16_t), kDataLength, pcm_file) == kDataLength) {
-    vad->AddAudio(data, kDataLength);
-    num_frames++;
-    if (num_frames == kNumVadFramesToProcess) {
-      num_frames = 0;
-      int referece_activity;
-      double p[kNumVadFramesToProcess];
-      EXPECT_EQ(1u, fread(&referece_activity, sizeof(referece_activity), 1,
-                          reference_file));
-      int activity = vad->GetActivity(p, kNumVadFramesToProcess);
-      EXPECT_EQ(referece_activity, activity);
-      if (activity != 0) {
-        // When active, probabilities are set to 0.5.
-        for (int n = 0; n < kNumVadFramesToProcess; n++)
-          EXPECT_EQ(0.5, p[n]);
-      } else {
-        // When inactive, probabilities are set to 0.01.
-        for (int n = 0; n < kNumVadFramesToProcess; n++)
-          EXPECT_EQ(0.01, p[n]);
-      }
-    }
-  }
-  fclose(reference_file);
-  fclose(pcm_file);
-}
-}  // namespace webrtc
diff --git a/modules/audio_processing/vad/vad_audio_proc.cc b/modules/audio_processing/vad/vad_audio_proc.cc
deleted file mode 100644
index d5f6b3b..0000000
--- a/modules/audio_processing/vad/vad_audio_proc.cc
+++ /dev/null
@@ -1,276 +0,0 @@
-/*
- *  Copyright (c) 2012 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_processing/vad/vad_audio_proc.h"
-
-#include <math.h>
-#include <stdio.h>
-
-#include "webrtc/common_audio/fft4g.h"
-#include "webrtc/modules/audio_processing/vad/pitch_internal.h"
-#include "webrtc/modules/audio_processing/vad/pole_zero_filter.h"
-#include "webrtc/modules/audio_processing/vad/vad_audio_proc_internal.h"
-#include "webrtc/rtc_base/checks.h"
-extern "C" {
-#include "webrtc/modules/audio_coding/codecs/isac/main/source/codec.h"
-#include "webrtc/modules/audio_coding/codecs/isac/main/source/lpc_analysis.h"
-#include "webrtc/modules/audio_coding/codecs/isac/main/source/pitch_estimator.h"
-#include "webrtc/modules/audio_coding/codecs/isac/main/source/structs.h"
-}
-#include "webrtc/modules/include/module_common_types.h"
-
-namespace webrtc {
-
-// The following structures are declared anonymous in iSAC's structs.h. To
-// forward declare them, we use this derived class trick.
-struct VadAudioProc::PitchAnalysisStruct : public ::PitchAnalysisStruct {};
-struct VadAudioProc::PreFiltBankstr : public ::PreFiltBankstr {};
-
-static constexpr float kFrequencyResolution =
-    kSampleRateHz / static_cast<float>(VadAudioProc::kDftSize);
-static constexpr int kSilenceRms = 5;
-
-// TODO(turajs): Make a Create or Init for VadAudioProc.
-VadAudioProc::VadAudioProc()
-    : audio_buffer_(),
-      num_buffer_samples_(kNumPastSignalSamples),
-      log_old_gain_(-2),
-      old_lag_(50),  // Arbitrary but valid as pitch-lag (in samples).
-      pitch_analysis_handle_(new PitchAnalysisStruct),
-      pre_filter_handle_(new PreFiltBankstr),
-      high_pass_filter_(PoleZeroFilter::Create(kCoeffNumerator,
-                                               kFilterOrder,
-                                               kCoeffDenominator,
-                                               kFilterOrder)) {
-  static_assert(kNumPastSignalSamples + kNumSubframeSamples ==
-                    sizeof(kLpcAnalWin) / sizeof(kLpcAnalWin[0]),
-                "lpc analysis window incorrect size");
-  static_assert(kLpcOrder + 1 == sizeof(kCorrWeight) / sizeof(kCorrWeight[0]),
-                "correlation weight incorrect size");
-
-  // TODO(turajs): Are we doing too much in the constructor?
-  float data[kDftSize];
-  // Make FFT to initialize.
-  ip_[0] = 0;
-  WebRtc_rdft(kDftSize, 1, data, ip_, w_fft_);
-  // TODO(turajs): Need to initialize high-pass filter.
-
-  // Initialize iSAC components.
-  WebRtcIsac_InitPreFilterbank(pre_filter_handle_.get());
-  WebRtcIsac_InitPitchAnalysis(pitch_analysis_handle_.get());
-}
-
-VadAudioProc::~VadAudioProc() {
-}
-
-void VadAudioProc::ResetBuffer() {
-  memcpy(audio_buffer_, &audio_buffer_[kNumSamplesToProcess],
-         sizeof(audio_buffer_[0]) * kNumPastSignalSamples);
-  num_buffer_samples_ = kNumPastSignalSamples;
-}
-
-int VadAudioProc::ExtractFeatures(const int16_t* frame,
-                                  size_t length,
-                                  AudioFeatures* features) {
-  features->num_frames = 0;
-  if (length != kNumSubframeSamples) {
-    return -1;
-  }
-
-  // High-pass filter to remove the DC component and very low frequency content.
-  // We have experienced that this high-pass filtering improves voice/non-voiced
-  // classification.
-  if (high_pass_filter_->Filter(frame, kNumSubframeSamples,
-                                &audio_buffer_[num_buffer_samples_]) != 0) {
-    return -1;
-  }
-
-  num_buffer_samples_ += kNumSubframeSamples;
-  if (num_buffer_samples_ < kBufferLength) {
-    return 0;
-  }
-  RTC_DCHECK_EQ(num_buffer_samples_, kBufferLength);
-  features->num_frames = kNum10msSubframes;
-  features->silence = false;
-
-  Rms(features->rms, kMaxNumFrames);
-  for (size_t i = 0; i < kNum10msSubframes; ++i) {
-    if (features->rms[i] < kSilenceRms) {
-      // PitchAnalysis can cause NaNs in the pitch gain if it's fed silence.
-      // Bail out here instead.
-      features->silence = true;
-      ResetBuffer();
-      return 0;
-    }
-  }
-
-  PitchAnalysis(features->log_pitch_gain, features->pitch_lag_hz,
-                kMaxNumFrames);
-  FindFirstSpectralPeaks(features->spectral_peak, kMaxNumFrames);
-  ResetBuffer();
-  return 0;
-}
-
-// Computes |kLpcOrder + 1| correlation coefficients.
-void VadAudioProc::SubframeCorrelation(double* corr,
-                                       size_t length_corr,
-                                       size_t subframe_index) {
-  RTC_DCHECK_GE(length_corr, kLpcOrder + 1);
-  double windowed_audio[kNumSubframeSamples + kNumPastSignalSamples];
-  size_t buffer_index = subframe_index * kNumSubframeSamples;
-
-  for (size_t n = 0; n < kNumSubframeSamples + kNumPastSignalSamples; n++)
-    windowed_audio[n] = audio_buffer_[buffer_index++] * kLpcAnalWin[n];
-
-  WebRtcIsac_AutoCorr(corr, windowed_audio,
-                      kNumSubframeSamples + kNumPastSignalSamples, kLpcOrder);
-}
-
-// Compute |kNum10msSubframes| sets of LPC coefficients, one per 10 ms input.
-// The analysis window is 15 ms long and it is centered on the first half of
-// each 10ms sub-frame. This is equivalent to computing LPC coefficients for the
-// first half of each 10 ms subframe.
-void VadAudioProc::GetLpcPolynomials(double* lpc, size_t length_lpc) {
-  RTC_DCHECK_GE(length_lpc, kNum10msSubframes * (kLpcOrder + 1));
-  double corr[kLpcOrder + 1];
-  double reflec_coeff[kLpcOrder];
-  for (size_t i = 0, offset_lpc = 0; i < kNum10msSubframes;
-       i++, offset_lpc += kLpcOrder + 1) {
-    SubframeCorrelation(corr, kLpcOrder + 1, i);
-    corr[0] *= 1.0001;
-    // This makes Lev-Durb a bit more stable.
-    for (size_t k = 0; k < kLpcOrder + 1; k++) {
-      corr[k] *= kCorrWeight[k];
-    }
-    WebRtcIsac_LevDurb(&lpc[offset_lpc], reflec_coeff, corr, kLpcOrder);
-  }
-}
-
-// Fit a second order curve to these 3 points and find the location of the
-// extremum. The points are inverted before curve fitting.
-static float QuadraticInterpolation(float prev_val,
-                                    float curr_val,
-                                    float next_val) {
-  // Doing the interpolation in |1 / A(z)|^2.
-  float fractional_index = 0;
-  next_val = 1.0f / next_val;
-  prev_val = 1.0f / prev_val;
-  curr_val = 1.0f / curr_val;
-
-  fractional_index =
-      -(next_val - prev_val) * 0.5f / (next_val + prev_val - 2.f * curr_val);
-  RTC_DCHECK_LT(fabs(fractional_index), 1);
-  return fractional_index;
-}
-
-// 1 / A(z), where A(z) is defined by |lpc| is a model of the spectral envelope
-// of the input signal. The local maximum of the spectral envelope corresponds
-// with the local minimum of A(z). It saves complexity, as we save one
-// inversion. Furthermore, we find the first local maximum of magnitude squared,
-// to save on one square root.
-void VadAudioProc::FindFirstSpectralPeaks(double* f_peak,
-                                          size_t length_f_peak) {
-  RTC_DCHECK_GE(length_f_peak, kNum10msSubframes);
-  double lpc[kNum10msSubframes * (kLpcOrder + 1)];
-  // For all sub-frames.
-  GetLpcPolynomials(lpc, kNum10msSubframes * (kLpcOrder + 1));
-
-  const size_t kNumDftCoefficients = kDftSize / 2 + 1;
-  float data[kDftSize];
-
-  for (size_t i = 0; i < kNum10msSubframes; i++) {
-    // Convert to float with zero pad.
-    memset(data, 0, sizeof(data));
-    for (size_t n = 0; n < kLpcOrder + 1; n++) {
-      data[n] = static_cast<float>(lpc[i * (kLpcOrder + 1) + n]);
-    }
-    // Transform to frequency domain.
-    WebRtc_rdft(kDftSize, 1, data, ip_, w_fft_);
-
-    size_t index_peak = 0;
-    float prev_magn_sqr = data[0] * data[0];
-    float curr_magn_sqr = data[2] * data[2] + data[3] * data[3];
-    float next_magn_sqr;
-    bool found_peak = false;
-    for (size_t n = 2; n < kNumDftCoefficients - 1; n++) {
-      next_magn_sqr =
-          data[2 * n] * data[2 * n] + data[2 * n + 1] * data[2 * n + 1];
-      if (curr_magn_sqr < prev_magn_sqr && curr_magn_sqr < next_magn_sqr) {
-        found_peak = true;
-        index_peak = n - 1;
-        break;
-      }
-      prev_magn_sqr = curr_magn_sqr;
-      curr_magn_sqr = next_magn_sqr;
-    }
-    float fractional_index = 0;
-    if (!found_peak) {
-      // Checking if |kNumDftCoefficients - 1| is the local minimum.
-      next_magn_sqr = data[1] * data[1];
-      if (curr_magn_sqr < prev_magn_sqr && curr_magn_sqr < next_magn_sqr) {
-        index_peak = kNumDftCoefficients - 1;
-      }
-    } else {
-      // A peak is found, do a simple quadratic interpolation to get a more
-      // accurate estimate of the peak location.
-      fractional_index =
-          QuadraticInterpolation(prev_magn_sqr, curr_magn_sqr, next_magn_sqr);
-    }
-    f_peak[i] = (index_peak + fractional_index) * kFrequencyResolution;
-  }
-}
-
-// Using iSAC functions to estimate pitch gains & lags.
-void VadAudioProc::PitchAnalysis(double* log_pitch_gains,
-                                 double* pitch_lags_hz,
-                                 size_t length) {
-  // TODO(turajs): This can be "imported" from iSAC & and the next two
-  // constants.
-  RTC_DCHECK_GE(length, kNum10msSubframes);
-  const int kNumPitchSubframes = 4;
-  double gains[kNumPitchSubframes];
-  double lags[kNumPitchSubframes];
-
-  const int kNumSubbandFrameSamples = 240;
-  const int kNumLookaheadSamples = 24;
-
-  float lower[kNumSubbandFrameSamples];
-  float upper[kNumSubbandFrameSamples];
-  double lower_lookahead[kNumSubbandFrameSamples];
-  double upper_lookahead[kNumSubbandFrameSamples];
-  double lower_lookahead_pre_filter[kNumSubbandFrameSamples +
-                                    kNumLookaheadSamples];
-
-  // Split signal to lower and upper bands
-  WebRtcIsac_SplitAndFilterFloat(&audio_buffer_[kNumPastSignalSamples], lower,
-                                 upper, lower_lookahead, upper_lookahead,
-                                 pre_filter_handle_.get());
-  WebRtcIsac_PitchAnalysis(lower_lookahead, lower_lookahead_pre_filter,
-                           pitch_analysis_handle_.get(), lags, gains);
-
-  // Lags are computed on lower-band signal with sampling rate half of the
-  // input signal.
-  GetSubframesPitchParameters(
-      kSampleRateHz / 2, gains, lags, kNumPitchSubframes, kNum10msSubframes,
-      &log_old_gain_, &old_lag_, log_pitch_gains, pitch_lags_hz);
-}
-
-void VadAudioProc::Rms(double* rms, size_t length_rms) {
-  RTC_DCHECK_GE(length_rms, kNum10msSubframes);
-  size_t offset = kNumPastSignalSamples;
-  for (size_t i = 0; i < kNum10msSubframes; i++) {
-    rms[i] = 0;
-    for (size_t n = 0; n < kNumSubframeSamples; n++, offset++)
-      rms[i] += audio_buffer_[offset] * audio_buffer_[offset];
-    rms[i] = sqrt(rms[i] / kNumSubframeSamples);
-  }
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/vad/vad_audio_proc.h b/modules/audio_processing/vad/vad_audio_proc.h
deleted file mode 100644
index 1f27b29..0000000
--- a/modules/audio_processing/vad/vad_audio_proc.h
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- *  Copyright (c) 2012 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_PROCESSING_VAD_VAD_AUDIO_PROC_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_VAD_VAD_AUDIO_PROC_H_
-
-#include <memory>
-
-#include "webrtc/modules/audio_processing/vad/common.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-class AudioFrame;
-class PoleZeroFilter;
-
-class VadAudioProc {
- public:
-  // Forward declare iSAC structs.
-  struct PitchAnalysisStruct;
-  struct PreFiltBankstr;
-
-  VadAudioProc();
-  ~VadAudioProc();
-
-  int ExtractFeatures(const int16_t* audio_frame,
-                      size_t length,
-                      AudioFeatures* audio_features);
-
-  static const size_t kDftSize = 512;
-
- private:
-  void PitchAnalysis(double* pitch_gains, double* pitch_lags_hz, size_t length);
-  void SubframeCorrelation(double* corr,
-                           size_t length_corr,
-                           size_t subframe_index);
-  void GetLpcPolynomials(double* lpc, size_t length_lpc);
-  void FindFirstSpectralPeaks(double* f_peak, size_t length_f_peak);
-  void Rms(double* rms, size_t length_rms);
-  void ResetBuffer();
-
-  // To compute spectral peak we perform LPC analysis to get spectral envelope.
-  // For every 30 ms we compute 3 spectral peak there for 3 LPC analysis.
-  // LPC is computed over 15 ms of windowed audio. For every 10 ms sub-frame
-  // we need 5 ms of past signal to create the input of LPC analysis.
-  enum : size_t {
-    kNumPastSignalSamples = static_cast<size_t>(kSampleRateHz / 200)
-  };
-
-  // TODO(turajs): maybe defining this at a higher level (maybe enum) so that
-  // all the code recognize it as "no-error."
-  enum : int { kNoError = 0 };
-
-  enum : size_t { kNum10msSubframes = 3 };
-  enum : size_t {
-    kNumSubframeSamples = static_cast<size_t>(kSampleRateHz / 100)
-  };
-  enum : size_t {
-    // Samples in 30 ms @ given sampling rate.
-    kNumSamplesToProcess = kNum10msSubframes * kNumSubframeSamples
-  };
-  enum : size_t {
-    kBufferLength = kNumPastSignalSamples + kNumSamplesToProcess
-  };
-  enum : size_t { kIpLength = kDftSize >> 1 };
-  enum : size_t { kWLength = kDftSize >> 1 };
-  enum : size_t { kLpcOrder = 16 };
-
-  size_t ip_[kIpLength];
-  float w_fft_[kWLength];
-
-  // A buffer of 5 ms (past audio) + 30 ms (one iSAC frame ).
-  float audio_buffer_[kBufferLength];
-  size_t num_buffer_samples_;
-
-  double log_old_gain_;
-  double old_lag_;
-
-  std::unique_ptr<PitchAnalysisStruct> pitch_analysis_handle_;
-  std::unique_ptr<PreFiltBankstr> pre_filter_handle_;
-  std::unique_ptr<PoleZeroFilter> high_pass_filter_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_VAD_VAD_AUDIO_PROC_H_
diff --git a/modules/audio_processing/vad/vad_audio_proc_internal.h b/modules/audio_processing/vad/vad_audio_proc_internal.h
deleted file mode 100644
index 45586b9..0000000
--- a/modules/audio_processing/vad/vad_audio_proc_internal.h
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- *  Copyright (c) 2012 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_PROCESSING_VAD_VAD_AUDIO_PROC_INTERNAL_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_VAD_VAD_AUDIO_PROC_INTERNAL_H_
-
-namespace webrtc {
-
-// These values should match MATLAB counterparts for unit-tests to pass.
-static const double kCorrWeight[] = {1.000000,
-                                     0.985000,
-                                     0.970225,
-                                     0.955672,
-                                     0.941337,
-                                     0.927217,
-                                     0.913308,
-                                     0.899609,
-                                     0.886115,
-                                     0.872823,
-                                     0.859730,
-                                     0.846834,
-                                     0.834132,
-                                     0.821620,
-                                     0.809296,
-                                     0.797156,
-                                     0.785199};
-
-static const double kLpcAnalWin[] = {
-    0.00000000, 0.01314436, 0.02628645, 0.03942400, 0.05255473, 0.06567639,
-    0.07878670, 0.09188339, 0.10496421, 0.11802689, 0.13106918, 0.14408883,
-    0.15708358, 0.17005118, 0.18298941, 0.19589602, 0.20876878, 0.22160547,
-    0.23440387, 0.24716177, 0.25987696, 0.27254725, 0.28517045, 0.29774438,
-    0.31026687, 0.32273574, 0.33514885, 0.34750406, 0.35979922, 0.37203222,
-    0.38420093, 0.39630327, 0.40833713, 0.42030043, 0.43219112, 0.44400713,
-    0.45574642, 0.46740697, 0.47898676, 0.49048379, 0.50189608, 0.51322164,
-    0.52445853, 0.53560481, 0.54665854, 0.55761782, 0.56848075, 0.57924546,
-    0.58991008, 0.60047278, 0.61093173, 0.62128512, 0.63153117, 0.64166810,
-    0.65169416, 0.66160761, 0.67140676, 0.68108990, 0.69065536, 0.70010148,
-    0.70942664, 0.71862923, 0.72770765, 0.73666033, 0.74548573, 0.75418233,
-    0.76274862, 0.77118312, 0.77948437, 0.78765094, 0.79568142, 0.80357442,
-    0.81132858, 0.81894256, 0.82641504, 0.83374472, 0.84093036, 0.84797069,
-    0.85486451, 0.86161063, 0.86820787, 0.87465511, 0.88095122, 0.88709512,
-    0.89308574, 0.89892206, 0.90460306, 0.91012776, 0.91549520, 0.92070447,
-    0.92575465, 0.93064488, 0.93537432, 0.93994213, 0.94434755, 0.94858979,
-    0.95266814, 0.95658189, 0.96033035, 0.96391289, 0.96732888, 0.97057773,
-    0.97365889, 0.97657181, 0.97931600, 0.98189099, 0.98429632, 0.98653158,
-    0.98859639, 0.99049038, 0.99221324, 0.99376466, 0.99514438, 0.99635215,
-    0.99738778, 0.99825107, 0.99894188, 0.99946010, 0.99980562, 0.99997840,
-    0.99997840, 0.99980562, 0.99946010, 0.99894188, 0.99825107, 0.99738778,
-    0.99635215, 0.99514438, 0.99376466, 0.99221324, 0.99049038, 0.98859639,
-    0.98653158, 0.98429632, 0.98189099, 0.97931600, 0.97657181, 0.97365889,
-    0.97057773, 0.96732888, 0.96391289, 0.96033035, 0.95658189, 0.95266814,
-    0.94858979, 0.94434755, 0.93994213, 0.93537432, 0.93064488, 0.92575465,
-    0.92070447, 0.91549520, 0.91012776, 0.90460306, 0.89892206, 0.89308574,
-    0.88709512, 0.88095122, 0.87465511, 0.86820787, 0.86161063, 0.85486451,
-    0.84797069, 0.84093036, 0.83374472, 0.82641504, 0.81894256, 0.81132858,
-    0.80357442, 0.79568142, 0.78765094, 0.77948437, 0.77118312, 0.76274862,
-    0.75418233, 0.74548573, 0.73666033, 0.72770765, 0.71862923, 0.70942664,
-    0.70010148, 0.69065536, 0.68108990, 0.67140676, 0.66160761, 0.65169416,
-    0.64166810, 0.63153117, 0.62128512, 0.61093173, 0.60047278, 0.58991008,
-    0.57924546, 0.56848075, 0.55761782, 0.54665854, 0.53560481, 0.52445853,
-    0.51322164, 0.50189608, 0.49048379, 0.47898676, 0.46740697, 0.45574642,
-    0.44400713, 0.43219112, 0.42030043, 0.40833713, 0.39630327, 0.38420093,
-    0.37203222, 0.35979922, 0.34750406, 0.33514885, 0.32273574, 0.31026687,
-    0.29774438, 0.28517045, 0.27254725, 0.25987696, 0.24716177, 0.23440387,
-    0.22160547, 0.20876878, 0.19589602, 0.18298941, 0.17005118, 0.15708358,
-    0.14408883, 0.13106918, 0.11802689, 0.10496421, 0.09188339, 0.07878670,
-    0.06567639, 0.05255473, 0.03942400, 0.02628645, 0.01314436, 0.00000000};
-
-static const size_t kFilterOrder = 2;
-static const float kCoeffNumerator[kFilterOrder + 1] = {0.974827f,
-                                                        -1.949650f,
-                                                        0.974827f};
-static const float kCoeffDenominator[kFilterOrder + 1] = {1.0f,
-                                                          -1.971999f,
-                                                          0.972457f};
-
-static_assert(kFilterOrder + 1 ==
-                  sizeof(kCoeffNumerator) / sizeof(kCoeffNumerator[0]),
-              "numerator coefficients incorrect size");
-static_assert(kFilterOrder + 1 ==
-                  sizeof(kCoeffDenominator) / sizeof(kCoeffDenominator[0]),
-              "denominator coefficients incorrect size");
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_VAD_VAD_AUDIO_PROCESSING_H_
diff --git a/modules/audio_processing/vad/vad_audio_proc_unittest.cc b/modules/audio_processing/vad/vad_audio_proc_unittest.cc
deleted file mode 100644
index 65b516a..0000000
--- a/modules/audio_processing/vad/vad_audio_proc_unittest.cc
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- *  Copyright (c) 2012 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.
- */
-
-// We don't test the value of pitch gain and lags as they are created by iSAC
-// routines. However, interpolation of pitch-gain and lags is in a separate
-// class and has its own unit-test.
-
-#include "webrtc/modules/audio_processing/vad/vad_audio_proc.h"
-
-#include <math.h>
-#include <stdio.h>
-
-#include <string>
-
-#include "webrtc/modules/audio_processing/vad/common.h"
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/testsupport/fileutils.h"
-
-namespace webrtc {
-
-TEST(AudioProcessingTest, DISABLED_ComputingFirstSpectralPeak) {
-  VadAudioProc audioproc;
-
-  std::string peak_file_name =
-      test::ResourcePath("audio_processing/agc/agc_spectral_peak", "dat");
-  FILE* peak_file = fopen(peak_file_name.c_str(), "rb");
-  ASSERT_TRUE(peak_file != NULL);
-
-  std::string pcm_file_name =
-      test::ResourcePath("audio_processing/agc/agc_audio", "pcm");
-  FILE* pcm_file = fopen(pcm_file_name.c_str(), "rb");
-  ASSERT_TRUE(pcm_file != NULL);
-
-  // Read 10 ms audio in each iteration.
-  const size_t kDataLength = kLength10Ms;
-  int16_t data[kDataLength] = {0};
-  AudioFeatures features;
-  double sp[kMaxNumFrames];
-  while (fread(data, sizeof(int16_t), kDataLength, pcm_file) == kDataLength) {
-    audioproc.ExtractFeatures(data, kDataLength, &features);
-    if (features.num_frames > 0) {
-      ASSERT_LT(features.num_frames, kMaxNumFrames);
-      // Read reference values.
-      const size_t num_frames = features.num_frames;
-      ASSERT_EQ(num_frames, fread(sp, sizeof(sp[0]), num_frames, peak_file));
-      for (size_t n = 0; n < features.num_frames; n++)
-        EXPECT_NEAR(features.spectral_peak[n], sp[n], 3);
-    }
-  }
-
-  fclose(peak_file);
-  fclose(pcm_file);
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/vad/vad_circular_buffer.cc b/modules/audio_processing/vad/vad_circular_buffer.cc
deleted file mode 100644
index 22d5dea..0000000
--- a/modules/audio_processing/vad/vad_circular_buffer.cc
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
- *  Copyright (c) 2012 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_processing/vad/vad_circular_buffer.h"
-
-#include <stdlib.h>
-
-namespace webrtc {
-
-VadCircularBuffer::VadCircularBuffer(int buffer_size)
-    : buffer_(new double[buffer_size]),
-      is_full_(false),
-      index_(0),
-      buffer_size_(buffer_size),
-      sum_(0) {
-}
-
-VadCircularBuffer::~VadCircularBuffer() {
-}
-
-void VadCircularBuffer::Reset() {
-  is_full_ = false;
-  index_ = 0;
-  sum_ = 0;
-}
-
-VadCircularBuffer* VadCircularBuffer::Create(int buffer_size) {
-  if (buffer_size <= 0)
-    return NULL;
-  return new VadCircularBuffer(buffer_size);
-}
-
-double VadCircularBuffer::Oldest() const {
-  if (!is_full_)
-    return buffer_[0];
-  else
-    return buffer_[index_];
-}
-
-double VadCircularBuffer::Mean() {
-  double m;
-  if (is_full_) {
-    m = sum_ / buffer_size_;
-  } else {
-    if (index_ > 0)
-      m = sum_ / index_;
-    else
-      m = 0;
-  }
-  return m;
-}
-
-void VadCircularBuffer::Insert(double value) {
-  if (is_full_) {
-    sum_ -= buffer_[index_];
-  }
-  sum_ += value;
-  buffer_[index_] = value;
-  index_++;
-  if (index_ >= buffer_size_) {
-    is_full_ = true;
-    index_ = 0;
-  }
-}
-int VadCircularBuffer::BufferLevel() {
-  if (is_full_)
-    return buffer_size_;
-  return index_;
-}
-
-int VadCircularBuffer::Get(int index, double* value) const {
-  int err = ConvertToLinearIndex(&index);
-  if (err < 0)
-    return -1;
-  *value = buffer_[index];
-  return 0;
-}
-
-int VadCircularBuffer::Set(int index, double value) {
-  int err = ConvertToLinearIndex(&index);
-  if (err < 0)
-    return -1;
-
-  sum_ -= buffer_[index];
-  buffer_[index] = value;
-  sum_ += value;
-  return 0;
-}
-
-int VadCircularBuffer::ConvertToLinearIndex(int* index) const {
-  if (*index < 0 || *index >= buffer_size_)
-    return -1;
-
-  if (!is_full_ && *index >= index_)
-    return -1;
-
-  *index = index_ - 1 - *index;
-  if (*index < 0)
-    *index += buffer_size_;
-  return 0;
-}
-
-int VadCircularBuffer::RemoveTransient(int width_threshold,
-                                       double val_threshold) {
-  if (!is_full_ && index_ < width_threshold + 2)
-    return 0;
-
-  int index_1 = 0;
-  int index_2 = width_threshold + 1;
-  double v = 0;
-  if (Get(index_1, &v) < 0)
-    return -1;
-  if (v < val_threshold) {
-    Set(index_1, 0);
-    int index;
-    for (index = index_2; index > index_1; index--) {
-      if (Get(index, &v) < 0)
-        return -1;
-      if (v < val_threshold)
-        break;
-    }
-    for (; index > index_1; index--) {
-      if (Set(index, 0.0) < 0)
-        return -1;
-    }
-  }
-  return 0;
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/vad/vad_circular_buffer.h b/modules/audio_processing/vad/vad_circular_buffer.h
deleted file mode 100644
index cfa6977..0000000
--- a/modules/audio_processing/vad/vad_circular_buffer.h
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- *  Copyright (c) 2012 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_PROCESSING_VAD_VAD_CIRCULAR_BUFFER_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_VAD_VAD_CIRCULAR_BUFFER_H_
-
-#include <memory>
-
-namespace webrtc {
-
-// A circular buffer tailored to the need of this project. It stores last
-// K samples of the input, and keeps track of the mean of the last samples.
-//
-// It is used in class "PitchBasedActivity" to keep track of posterior
-// probabilities in the past few seconds. The posterior probabilities are used
-// to recursively update prior probabilities.
-class VadCircularBuffer {
- public:
-  static VadCircularBuffer* Create(int buffer_size);
-  ~VadCircularBuffer();
-
-  // If buffer is wrapped around.
-  bool is_full() const { return is_full_; }
-  // Get the oldest entry in the buffer.
-  double Oldest() const;
-  // Insert new value into the buffer.
-  void Insert(double value);
-  // Reset buffer, forget the past, start fresh.
-  void Reset();
-
-  // The mean value of the elements in the buffer. The return value is zero if
-  // buffer is empty, i.e. no value is inserted.
-  double Mean();
-  // Remove transients. If the values exceed |val_threshold| for a period
-  // shorter then or equal to |width_threshold|, then that period is considered
-  // transient and set to zero.
-  int RemoveTransient(int width_threshold, double val_threshold);
-
- private:
-  explicit VadCircularBuffer(int buffer_size);
-  // Get previous values. |index = 0| corresponds to the most recent
-  // insertion. |index = 1| is the one before the most recent insertion, and
-  // so on.
-  int Get(int index, double* value) const;
-  // Set a given position to |value|. |index| is interpreted as above.
-  int Set(int index, double value);
-  // Return the number of valid elements in the buffer.
-  int BufferLevel();
-
-  // Convert an index with the interpretation as get() method to the
-  // corresponding linear index.
-  int ConvertToLinearIndex(int* index) const;
-
-  std::unique_ptr<double[]> buffer_;
-  bool is_full_;
-  int index_;
-  int buffer_size_;
-  double sum_;
-};
-
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_VAD_VAD_CIRCULAR_BUFFER_H_
diff --git a/modules/audio_processing/vad/vad_circular_buffer_unittest.cc b/modules/audio_processing/vad/vad_circular_buffer_unittest.cc
deleted file mode 100644
index 5291ff8..0000000
--- a/modules/audio_processing/vad/vad_circular_buffer_unittest.cc
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- *  Copyright (c) 2012 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_processing/vad/vad_circular_buffer.h"
-
-#include <stdio.h>
-
-#include <memory>
-
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-static const int kWidthThreshold = 7;
-static const double kValThreshold = 1.0;
-static const int kLongBuffSize = 100;
-static const int kShortBuffSize = 10;
-
-static void InsertSequentially(int k, VadCircularBuffer* circular_buffer) {
-  double mean_val;
-  for (int n = 1; n <= k; n++) {
-    EXPECT_TRUE(!circular_buffer->is_full());
-    circular_buffer->Insert(n);
-    mean_val = circular_buffer->Mean();
-    EXPECT_EQ((n + 1.0) / 2., mean_val);
-  }
-}
-
-static void Insert(double value,
-                   int num_insertion,
-                   VadCircularBuffer* circular_buffer) {
-  for (int n = 0; n < num_insertion; n++)
-    circular_buffer->Insert(value);
-}
-
-static void InsertZeros(int num_zeros, VadCircularBuffer* circular_buffer) {
-  Insert(0.0, num_zeros, circular_buffer);
-}
-
-TEST(VadCircularBufferTest, GeneralTest) {
-  std::unique_ptr<VadCircularBuffer> circular_buffer(
-      VadCircularBuffer::Create(kShortBuffSize));
-  double mean_val;
-
-  // Mean should return zero if nothing is inserted.
-  mean_val = circular_buffer->Mean();
-  EXPECT_DOUBLE_EQ(0.0, mean_val);
-  InsertSequentially(kShortBuffSize, circular_buffer.get());
-
-  // Should be full.
-  EXPECT_TRUE(circular_buffer->is_full());
-  // Correct update after being full.
-  for (int n = 1; n < kShortBuffSize; n++) {
-    circular_buffer->Insert(n);
-    mean_val = circular_buffer->Mean();
-    EXPECT_DOUBLE_EQ((kShortBuffSize + 1.) / 2., mean_val);
-    EXPECT_TRUE(circular_buffer->is_full());
-  }
-
-  // Check reset. This should be like starting fresh.
-  circular_buffer->Reset();
-  mean_val = circular_buffer->Mean();
-  EXPECT_DOUBLE_EQ(0, mean_val);
-  InsertSequentially(kShortBuffSize, circular_buffer.get());
-  EXPECT_TRUE(circular_buffer->is_full());
-}
-
-TEST(VadCircularBufferTest, TransientsRemoval) {
-  std::unique_ptr<VadCircularBuffer> circular_buffer(
-      VadCircularBuffer::Create(kLongBuffSize));
-  // Let the first transient be in wrap-around.
-  InsertZeros(kLongBuffSize - kWidthThreshold / 2, circular_buffer.get());
-
-  double push_val = kValThreshold;
-  double mean_val;
-  for (int k = kWidthThreshold; k >= 1; k--) {
-    Insert(push_val, k, circular_buffer.get());
-    circular_buffer->Insert(0);
-    mean_val = circular_buffer->Mean();
-    EXPECT_DOUBLE_EQ(k * push_val / kLongBuffSize, mean_val);
-    circular_buffer->RemoveTransient(kWidthThreshold, kValThreshold);
-    mean_val = circular_buffer->Mean();
-    EXPECT_DOUBLE_EQ(0, mean_val);
-  }
-}
-
-TEST(VadCircularBufferTest, TransientDetection) {
-  std::unique_ptr<VadCircularBuffer> circular_buffer(
-      VadCircularBuffer::Create(kLongBuffSize));
-  // Let the first transient be in wrap-around.
-  int num_insertion = kLongBuffSize - kWidthThreshold / 2;
-  InsertZeros(num_insertion, circular_buffer.get());
-
-  double push_val = 2;
-  // This is longer than a transient and shouldn't be removed.
-  int num_non_zero_elements = kWidthThreshold + 1;
-  Insert(push_val, num_non_zero_elements, circular_buffer.get());
-
-  double mean_val = circular_buffer->Mean();
-  EXPECT_DOUBLE_EQ(num_non_zero_elements * push_val / kLongBuffSize, mean_val);
-  circular_buffer->Insert(0);
-  EXPECT_EQ(0,
-            circular_buffer->RemoveTransient(kWidthThreshold, kValThreshold));
-  mean_val = circular_buffer->Mean();
-  EXPECT_DOUBLE_EQ(num_non_zero_elements * push_val / kLongBuffSize, mean_val);
-
-  // A transient right after a non-transient, should be removed and mean is
-  // not changed.
-  num_insertion = 3;
-  Insert(push_val, num_insertion, circular_buffer.get());
-  circular_buffer->Insert(0);
-  EXPECT_EQ(0,
-            circular_buffer->RemoveTransient(kWidthThreshold, kValThreshold));
-  mean_val = circular_buffer->Mean();
-  EXPECT_DOUBLE_EQ(num_non_zero_elements * push_val / kLongBuffSize, mean_val);
-
-  // Last input is larger than threshold, although the sequence is short but
-  // it shouldn't be considered transient.
-  Insert(push_val, num_insertion, circular_buffer.get());
-  num_non_zero_elements += num_insertion;
-  EXPECT_EQ(0,
-            circular_buffer->RemoveTransient(kWidthThreshold, kValThreshold));
-  mean_val = circular_buffer->Mean();
-  EXPECT_DOUBLE_EQ(num_non_zero_elements * push_val / kLongBuffSize, mean_val);
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/vad/voice_activity_detector.cc b/modules/audio_processing/vad/voice_activity_detector.cc
deleted file mode 100644
index 8942a03..0000000
--- a/modules/audio_processing/vad/voice_activity_detector.cc
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- *  Copyright (c) 2015 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_processing/vad/voice_activity_detector.h"
-
-#include <algorithm>
-
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-namespace {
-
-const size_t kMaxLength = 320;
-const size_t kNumChannels = 1;
-
-const double kDefaultVoiceValue = 1.0;
-const double kNeutralProbability = 0.5;
-const double kLowProbability = 0.01;
-
-}  // namespace
-
-VoiceActivityDetector::VoiceActivityDetector()
-    : last_voice_probability_(kDefaultVoiceValue),
-      standalone_vad_(StandaloneVad::Create()) {
-}
-
-VoiceActivityDetector::~VoiceActivityDetector() = default;
-
-// Because ISAC has a different chunk length, it updates
-// |chunkwise_voice_probabilities_| and |chunkwise_rms_| when there is new data.
-// Otherwise it clears them.
-void VoiceActivityDetector::ProcessChunk(const int16_t* audio,
-                                         size_t length,
-                                         int sample_rate_hz) {
-  RTC_DCHECK_EQ(length, sample_rate_hz / 100);
-  RTC_DCHECK_LE(length, kMaxLength);
-  // Resample to the required rate.
-  const int16_t* resampled_ptr = audio;
-  if (sample_rate_hz != kSampleRateHz) {
-    RTC_CHECK_EQ(
-        resampler_.ResetIfNeeded(sample_rate_hz, kSampleRateHz, kNumChannels),
-        0);
-    resampler_.Push(audio, length, resampled_, kLength10Ms, length);
-    resampled_ptr = resampled_;
-  }
-  RTC_DCHECK_EQ(length, kLength10Ms);
-
-  // Each chunk needs to be passed into |standalone_vad_|, because internally it
-  // buffers the audio and processes it all at once when GetActivity() is
-  // called.
-  RTC_CHECK_EQ(standalone_vad_->AddAudio(resampled_ptr, length), 0);
-
-  audio_processing_.ExtractFeatures(resampled_ptr, length, &features_);
-
-  chunkwise_voice_probabilities_.resize(features_.num_frames);
-  chunkwise_rms_.resize(features_.num_frames);
-  std::copy(features_.rms, features_.rms + chunkwise_rms_.size(),
-            chunkwise_rms_.begin());
-  if (features_.num_frames > 0) {
-    if (features_.silence) {
-      // The other features are invalid, so set the voice probabilities to an
-      // arbitrary low value.
-      std::fill(chunkwise_voice_probabilities_.begin(),
-                chunkwise_voice_probabilities_.end(), kLowProbability);
-    } else {
-      std::fill(chunkwise_voice_probabilities_.begin(),
-                chunkwise_voice_probabilities_.end(), kNeutralProbability);
-      RTC_CHECK_GE(
-          standalone_vad_->GetActivity(&chunkwise_voice_probabilities_[0],
-                                       chunkwise_voice_probabilities_.size()),
-          0);
-      RTC_CHECK_GE(pitch_based_vad_.VoicingProbability(
-                       features_, &chunkwise_voice_probabilities_[0]),
-                   0);
-    }
-    last_voice_probability_ = chunkwise_voice_probabilities_.back();
-  }
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/vad/voice_activity_detector.h b/modules/audio_processing/vad/voice_activity_detector.h
deleted file mode 100644
index 5fb5e59..0000000
--- a/modules/audio_processing/vad/voice_activity_detector.h
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- *  Copyright (c) 2015 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_PROCESSING_VAD_VOICE_ACTIVITY_DETECTOR_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_VAD_VOICE_ACTIVITY_DETECTOR_H_
-
-#include <memory>
-#include <vector>
-
-#include "webrtc/common_audio/resampler/include/resampler.h"
-#include "webrtc/modules/audio_processing/vad/vad_audio_proc.h"
-#include "webrtc/modules/audio_processing/vad/common.h"
-#include "webrtc/modules/audio_processing/vad/pitch_based_vad.h"
-#include "webrtc/modules/audio_processing/vad/standalone_vad.h"
-
-namespace webrtc {
-
-// A Voice Activity Detector (VAD) that combines the voice probability from the
-// StandaloneVad and PitchBasedVad to get a more robust estimation.
-class VoiceActivityDetector {
- public:
-  VoiceActivityDetector();
-  ~VoiceActivityDetector();
-
-  // Processes each audio chunk and estimates the voice probability. The maximum
-  // supported sample rate is 32kHz.
-  // TODO(aluebs): Change |length| to size_t.
-  void ProcessChunk(const int16_t* audio, size_t length, int sample_rate_hz);
-
-  // Returns a vector of voice probabilities for each chunk. It can be empty for
-  // some chunks, but it catches up afterwards returning multiple values at
-  // once.
-  const std::vector<double>& chunkwise_voice_probabilities() const {
-    return chunkwise_voice_probabilities_;
-  }
-
-  // Returns a vector of RMS values for each chunk. It has the same length as
-  // chunkwise_voice_probabilities().
-  const std::vector<double>& chunkwise_rms() const { return chunkwise_rms_; }
-
-  // Returns the last voice probability, regardless of the internal
-  // implementation, although it has a few chunks of delay.
-  float last_voice_probability() const { return last_voice_probability_; }
-
- private:
-  // TODO(aluebs): Change these to float.
-  std::vector<double> chunkwise_voice_probabilities_;
-  std::vector<double> chunkwise_rms_;
-
-  float last_voice_probability_;
-
-  Resampler resampler_;
-  VadAudioProc audio_processing_;
-
-  std::unique_ptr<StandaloneVad> standalone_vad_;
-  PitchBasedVad pitch_based_vad_;
-
-  int16_t resampled_[kLength10Ms];
-  AudioFeatures features_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_VAD_VOICE_ACTIVITY_DETECTOR_H_
diff --git a/modules/audio_processing/vad/voice_activity_detector_unittest.cc b/modules/audio_processing/vad/voice_activity_detector_unittest.cc
deleted file mode 100644
index d43b135..0000000
--- a/modules/audio_processing/vad/voice_activity_detector_unittest.cc
+++ /dev/null
@@ -1,168 +0,0 @@
-/*
- *  Copyright (c) 2015 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_processing/vad/voice_activity_detector.h"
-
-#include <algorithm>
-#include <vector>
-
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/testsupport/fileutils.h"
-
-namespace webrtc {
-namespace {
-
-const int kStartTimeSec = 16;
-const float kMeanSpeechProbability = 0.3f;
-const float kMaxNoiseProbability = 0.1f;
-const size_t kNumChunks = 300u;
-const size_t kNumChunksPerIsacBlock = 3;
-
-void GenerateNoise(std::vector<int16_t>* data) {
-  for (size_t i = 0; i < data->size(); ++i) {
-    // std::rand returns between 0 and RAND_MAX, but this will work because it
-    // wraps into some random place.
-    (*data)[i] = std::rand();
-  }
-}
-
-}  // namespace
-
-TEST(VoiceActivityDetectorTest, ConstructorSetsDefaultValues) {
-  const float kDefaultVoiceValue = 1.f;
-
-  VoiceActivityDetector vad;
-
-  std::vector<double> p = vad.chunkwise_voice_probabilities();
-  std::vector<double> rms = vad.chunkwise_rms();
-
-  EXPECT_EQ(p.size(), 0u);
-  EXPECT_EQ(rms.size(), 0u);
-
-  EXPECT_FLOAT_EQ(vad.last_voice_probability(), kDefaultVoiceValue);
-}
-
-TEST(VoiceActivityDetectorTest, Speech16kHzHasHighVoiceProbabilities) {
-  const int kSampleRateHz = 16000;
-  const int kLength10Ms = kSampleRateHz / 100;
-
-  VoiceActivityDetector vad;
-
-  std::vector<int16_t> data(kLength10Ms);
-  float mean_probability = 0.f;
-
-  FILE* pcm_file =
-      fopen(test::ResourcePath("audio_processing/transient/audio16kHz", "pcm")
-                .c_str(),
-            "rb");
-  ASSERT_TRUE(pcm_file != nullptr);
-  // The silences in the file are skipped to get a more robust voice probability
-  // for speech.
-  ASSERT_EQ(fseek(pcm_file, kStartTimeSec * kSampleRateHz * sizeof(data[0]),
-                  SEEK_SET),
-            0);
-
-  size_t num_chunks = 0;
-  while (fread(&data[0], sizeof(data[0]), data.size(), pcm_file) ==
-         data.size()) {
-    vad.ProcessChunk(&data[0], data.size(), kSampleRateHz);
-
-    mean_probability += vad.last_voice_probability();
-
-    ++num_chunks;
-  }
-
-  mean_probability /= num_chunks;
-
-  EXPECT_GT(mean_probability, kMeanSpeechProbability);
-}
-
-TEST(VoiceActivityDetectorTest, Speech32kHzHasHighVoiceProbabilities) {
-  const int kSampleRateHz = 32000;
-  const int kLength10Ms = kSampleRateHz / 100;
-
-  VoiceActivityDetector vad;
-
-  std::vector<int16_t> data(kLength10Ms);
-  float mean_probability = 0.f;
-
-  FILE* pcm_file =
-      fopen(test::ResourcePath("audio_processing/transient/audio32kHz", "pcm")
-                .c_str(),
-            "rb");
-  ASSERT_TRUE(pcm_file != nullptr);
-  // The silences in the file are skipped to get a more robust voice probability
-  // for speech.
-  ASSERT_EQ(fseek(pcm_file, kStartTimeSec * kSampleRateHz * sizeof(data[0]),
-                  SEEK_SET),
-            0);
-
-  size_t num_chunks = 0;
-  while (fread(&data[0], sizeof(data[0]), data.size(), pcm_file) ==
-         data.size()) {
-    vad.ProcessChunk(&data[0], data.size(), kSampleRateHz);
-
-    mean_probability += vad.last_voice_probability();
-
-    ++num_chunks;
-  }
-
-  mean_probability /= num_chunks;
-
-  EXPECT_GT(mean_probability, kMeanSpeechProbability);
-}
-
-TEST(VoiceActivityDetectorTest, Noise16kHzHasLowVoiceProbabilities) {
-  VoiceActivityDetector vad;
-
-  std::vector<int16_t> data(kLength10Ms);
-  float max_probability = 0.f;
-
-  std::srand(42);
-
-  for (size_t i = 0; i < kNumChunks; ++i) {
-    GenerateNoise(&data);
-
-    vad.ProcessChunk(&data[0], data.size(), kSampleRateHz);
-
-    // Before the |vad has enough data to process an ISAC block it will return
-    // the default value, 1.f, which would ruin the |max_probability| value.
-    if (i > kNumChunksPerIsacBlock) {
-      max_probability = std::max(max_probability, vad.last_voice_probability());
-    }
-  }
-
-  EXPECT_LT(max_probability, kMaxNoiseProbability);
-}
-
-TEST(VoiceActivityDetectorTest, Noise32kHzHasLowVoiceProbabilities) {
-  VoiceActivityDetector vad;
-
-  std::vector<int16_t> data(2 * kLength10Ms);
-  float max_probability = 0.f;
-
-  std::srand(42);
-
-  for (size_t i = 0; i < kNumChunks; ++i) {
-    GenerateNoise(&data);
-
-    vad.ProcessChunk(&data[0], data.size(), 2 * kSampleRateHz);
-
-    // Before the |vad has enough data to process an ISAC block it will return
-    // the default value, 1.f, which would ruin the |max_probability| value.
-    if (i > kNumChunksPerIsacBlock) {
-      max_probability = std::max(max_probability, vad.last_voice_probability());
-    }
-  }
-
-  EXPECT_LT(max_probability, kMaxNoiseProbability);
-}
-
-}  // namespace webrtc
diff --git a/modules/audio_processing/vad/voice_gmm_tables.h b/modules/audio_processing/vad/voice_gmm_tables.h
deleted file mode 100644
index 2f247c3..0000000
--- a/modules/audio_processing/vad/voice_gmm_tables.h
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- *  Copyright (c) 2012 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.
- */
-
-// GMM tables for active segments. Generated by MakeGmmTables.m.
-
-#ifndef WEBRTC_MODULES_AUDIO_PROCESSING_VAD_VOICE_GMM_TABLES_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_VAD_VOICE_GMM_TABLES_H_
-
-static const int kVoiceGmmNumMixtures = 12;
-static const int kVoiceGmmDim = 3;
-
-static const double
-    kVoiceGmmCovarInverse[kVoiceGmmNumMixtures][kVoiceGmmDim][kVoiceGmmDim] = {
-        {{1.83673825579513e+00, -8.09791637570095e-04, 4.60106414365986e-03},
-         {-8.09791637570095e-04, 8.89351738394608e-04, -9.80188953277734e-04},
-         {4.60106414365986e-03, -9.80188953277734e-04, 1.38706060206582e-03}},
-        {{6.76228912850703e+01, -1.98893120119660e-02, -3.53548357253551e-03},
-         {-1.98893120119660e-02, 3.96216858500530e-05, -4.08492938394097e-05},
-         {-3.53548357253551e-03, -4.08492938394097e-05, 9.31864352856416e-04}},
-        {{9.98612435944558e+00, -5.27880954316893e-03, -6.30342541619017e-03},
-         {-5.27880954316893e-03, 4.54359480225226e-05, 6.30804591626044e-05},
-         {-6.30342541619017e-03, 6.30804591626044e-05, 5.36466441382942e-04}},
-        {{3.39917474216349e+01, -1.56213579433191e-03, -4.01459014990225e-02},
-         {-1.56213579433191e-03, 6.40415424897724e-05, 6.20076342427833e-05},
-         {-4.01459014990225e-02, 6.20076342427833e-05, 3.51199070103063e-03}},
-        {{1.34545062271428e+01, -7.94513610147144e-03, -5.34401019341728e-02},
-         {-7.94513610147144e-03, 1.16511820098649e-04, 4.66063702069293e-05},
-         {-5.34401019341728e-02, 4.66063702069293e-05, 2.72354323774163e-03}},
-        {{1.08557844314806e+02, -1.54885805673668e-02, -1.88029692674851e-02},
-         {-1.54885805673668e-02, 1.16404042786406e-04, 6.45579292702802e-06},
-         {-1.88029692674851e-02, 6.45579292702802e-06, 4.32330478391416e-04}},
-        {{8.22940066541450e+01, -1.15903110231303e-02, -4.92166764865343e-02},
-         {-1.15903110231303e-02, 7.42510742165261e-05, 3.73007314191290e-06},
-         {-4.92166764865343e-02, 3.73007314191290e-06, 3.64005221593244e-03}},
-        {{2.31133605685660e+00, -7.83261568950254e-04, 7.45744012346313e-04},
-         {-7.83261568950254e-04, 1.29460648214142e-05, -2.22774455093730e-06},
-         {7.45744012346313e-04, -2.22774455093730e-06, 1.05117294093010e-04}},
-        {{3.78767849189611e+02, 1.57759761011568e-03, -2.08551217988774e-02},
-         {1.57759761011568e-03, 4.76066236886865e-05, -2.33977412299324e-05},
-         {-2.08551217988774e-02, -2.33977412299324e-05, 5.24261005371196e-04}},
-        {{6.98580096506135e-01, -5.13850255217378e-04, -4.01124551717056e-04},
-         {-5.13850255217378e-04, 1.40501021984840e-06, -2.09496928716569e-06},
-         {-4.01124551717056e-04, -2.09496928716569e-06, 2.82879357740037e-04}},
-        {{2.62770945162399e+00, -2.31825753241430e-03, -5.30447217466318e-03},
-         {-2.31825753241430e-03, 4.59108572227649e-05, 7.67631886355405e-05},
-         {-5.30447217466318e-03, 7.67631886355405e-05, 2.28521601674098e-03}},
-        {{1.89940391362152e+02, -4.23280856852379e-03, -2.70608873541399e-02},
-         {-4.23280856852379e-03, 6.77547582742563e-05, 2.69154203800467e-05},
-         {-2.70608873541399e-02, 2.69154203800467e-05, 3.88574543373470e-03}}};
-
-static const double kVoiceGmmMean[kVoiceGmmNumMixtures][kVoiceGmmDim] = {
-    {-2.15020241646536e+00, 4.97079062999877e+02, 4.77078119504505e+02},
-    {-8.92097680029190e-01, 5.92064964199921e+02, 1.81045145941059e+02},
-    {-1.29435784144398e+00, 4.98450293410611e+02, 1.71991263804064e+02},
-    {-1.03925228397884e+00, 4.99511274321571e+02, 1.05838336539105e+02},
-    {-1.29229047206129e+00, 4.15026762566707e+02, 1.12861119017125e+02},
-    {-7.88748114599810e-01, 4.48739336688113e+02, 1.89784216956337e+02},
-    {-8.77777402332642e-01, 4.86620285054533e+02, 1.13477708016491e+02},
-    {-2.06465957063057e+00, 6.33385049870607e+02, 2.32758546796149e+02},
-    {-6.98893789231685e-01, 5.93622051503385e+02, 1.92536982473203e+02},
-    {-2.55901217508894e+00, 1.55914919756205e+03, 1.39769980835570e+02},
-    {-1.92070024165837e+00, 4.87983940444185e+02, 1.02745468128289e+02},
-    {-7.29187507662854e-01, 5.22717685022855e+02, 1.16377942283991e+02}};
-
-static const double kVoiceGmmWeights[kVoiceGmmNumMixtures] = {
-    -1.39789694361035e+01,
-    -1.19527720202104e+01,
-    -1.32396317929055e+01,
-    -1.09436815209238e+01,
-    -1.13440027478149e+01,
-    -1.12200721834504e+01,
-    -1.02537324043693e+01,
-    -1.60789861938302e+01,
-    -1.03394494048344e+01,
-    -1.83207938586818e+01,
-    -1.31186044948288e+01,
-    -9.52479998673554e+00};
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_VAD_VOICE_GMM_TABLES_H_
diff --git a/modules/audio_processing/voice_detection_impl.cc b/modules/audio_processing/voice_detection_impl.cc
deleted file mode 100644
index 9c9e091..0000000
--- a/modules/audio_processing/voice_detection_impl.cc
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
- *  Copyright (c) 2012 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_processing/voice_detection_impl.h"
-
-#include "webrtc/common_audio/vad/include/webrtc_vad.h"
-#include "webrtc/modules/audio_processing/audio_buffer.h"
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace webrtc {
-class VoiceDetectionImpl::Vad {
- public:
-  Vad() {
-    state_ = WebRtcVad_Create();
-    RTC_CHECK(state_);
-    int error = WebRtcVad_Init(state_);
-    RTC_DCHECK_EQ(0, error);
-  }
-  ~Vad() {
-    WebRtcVad_Free(state_);
-  }
-  VadInst* state() { return state_; }
- private:
-  VadInst* state_ = nullptr;
-  RTC_DISALLOW_COPY_AND_ASSIGN(Vad);
-};
-
-VoiceDetectionImpl::VoiceDetectionImpl(rtc::CriticalSection* crit)
-    : crit_(crit) {
-  RTC_DCHECK(crit);
-}
-
-VoiceDetectionImpl::~VoiceDetectionImpl() {}
-
-void VoiceDetectionImpl::Initialize(int sample_rate_hz) {
-  rtc::CritScope cs(crit_);
-  sample_rate_hz_ = sample_rate_hz;
-  std::unique_ptr<Vad> new_vad;
-  if (enabled_) {
-    new_vad.reset(new Vad());
-  }
-  vad_.swap(new_vad);
-  using_external_vad_ = false;
-  frame_size_samples_ =
-      static_cast<size_t>(frame_size_ms_ * sample_rate_hz_) / 1000;
-  set_likelihood(likelihood_);
-}
-
-void VoiceDetectionImpl::ProcessCaptureAudio(AudioBuffer* audio) {
-  rtc::CritScope cs(crit_);
-  if (!enabled_) {
-    return;
-  }
-  if (using_external_vad_) {
-    using_external_vad_ = false;
-    return;
-  }
-
-  RTC_DCHECK_GE(160, audio->num_frames_per_band());
-  // TODO(ajm): concatenate data in frame buffer here.
-  int vad_ret = WebRtcVad_Process(vad_->state(), sample_rate_hz_,
-                                  audio->mixed_low_pass_data(),
-                                  frame_size_samples_);
-  if (vad_ret == 0) {
-    stream_has_voice_ = false;
-    audio->set_activity(AudioFrame::kVadPassive);
-  } else if (vad_ret == 1) {
-    stream_has_voice_ = true;
-    audio->set_activity(AudioFrame::kVadActive);
-  } else {
-    RTC_NOTREACHED();
-  }
-}
-
-int VoiceDetectionImpl::Enable(bool enable) {
-  rtc::CritScope cs(crit_);
-  if (enabled_ != enable) {
-    enabled_ = enable;
-    Initialize(sample_rate_hz_);
-  }
-  return AudioProcessing::kNoError;
-}
-
-bool VoiceDetectionImpl::is_enabled() const {
-  rtc::CritScope cs(crit_);
-  return enabled_;
-}
-
-int VoiceDetectionImpl::set_stream_has_voice(bool has_voice) {
-  rtc::CritScope cs(crit_);
-  using_external_vad_ = true;
-  stream_has_voice_ = has_voice;
-  return AudioProcessing::kNoError;
-}
-
-bool VoiceDetectionImpl::stream_has_voice() const {
-  rtc::CritScope cs(crit_);
-  // TODO(ajm): enable this assertion?
-  //RTC_DCHECK(using_external_vad_ || is_component_enabled());
-  return stream_has_voice_;
-}
-
-int VoiceDetectionImpl::set_likelihood(VoiceDetection::Likelihood likelihood) {
-  rtc::CritScope cs(crit_);
-  likelihood_ = likelihood;
-  if (enabled_) {
-    int mode = 2;
-    switch (likelihood) {
-      case VoiceDetection::kVeryLowLikelihood:
-        mode = 3;
-        break;
-      case VoiceDetection::kLowLikelihood:
-        mode = 2;
-        break;
-      case VoiceDetection::kModerateLikelihood:
-        mode = 1;
-        break;
-      case VoiceDetection::kHighLikelihood:
-        mode = 0;
-        break;
-      default:
-        RTC_NOTREACHED();
-        break;
-    }
-    int error = WebRtcVad_set_mode(vad_->state(), mode);
-    RTC_DCHECK_EQ(0, error);
-  }
-  return AudioProcessing::kNoError;
-}
-
-VoiceDetection::Likelihood VoiceDetectionImpl::likelihood() const {
-  rtc::CritScope cs(crit_);
-  return likelihood_;
-}
-
-int VoiceDetectionImpl::set_frame_size_ms(int size) {
-  rtc::CritScope cs(crit_);
-  RTC_DCHECK_EQ(10, size); // TODO(ajm): remove when supported.
-  frame_size_ms_ = size;
-  Initialize(sample_rate_hz_);
-  return AudioProcessing::kNoError;
-}
-
-int VoiceDetectionImpl::frame_size_ms() const {
-  rtc::CritScope cs(crit_);
-  return frame_size_ms_;
-}
-}  // namespace webrtc
diff --git a/modules/audio_processing/voice_detection_impl.h b/modules/audio_processing/voice_detection_impl.h
deleted file mode 100644
index 683c425..0000000
--- a/modules/audio_processing/voice_detection_impl.h
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- *  Copyright (c) 2012 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_PROCESSING_VOICE_DETECTION_IMPL_H_
-#define WEBRTC_MODULES_AUDIO_PROCESSING_VOICE_DETECTION_IMPL_H_
-
-#include <memory>
-
-#include "webrtc/modules/audio_processing/include/audio_processing.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/criticalsection.h"
-
-namespace webrtc {
-
-class AudioBuffer;
-
-class VoiceDetectionImpl : public VoiceDetection {
- public:
-  explicit VoiceDetectionImpl(rtc::CriticalSection* crit);
-  ~VoiceDetectionImpl() override;
-
-  // TODO(peah): Fold into ctor, once public API is removed.
-  void Initialize(int sample_rate_hz);
-  void ProcessCaptureAudio(AudioBuffer* audio);
-
-  // VoiceDetection implementation.
-  int Enable(bool enable) override;
-  bool is_enabled() const override;
-  int set_stream_has_voice(bool has_voice) override;
-  bool stream_has_voice() const override;
-  int set_likelihood(Likelihood likelihood) override;
-  Likelihood likelihood() const override;
-  int set_frame_size_ms(int size) override;
-  int frame_size_ms() const override;
-
- private:
-  class Vad;
-  rtc::CriticalSection* const crit_;
-  bool enabled_ RTC_GUARDED_BY(crit_) = false;
-  bool stream_has_voice_ RTC_GUARDED_BY(crit_) = false;
-  bool using_external_vad_ RTC_GUARDED_BY(crit_) = false;
-  Likelihood likelihood_ RTC_GUARDED_BY(crit_) = kLowLikelihood;
-  int frame_size_ms_ RTC_GUARDED_BY(crit_) = 10;
-  size_t frame_size_samples_ RTC_GUARDED_BY(crit_) = 0;
-  int sample_rate_hz_ RTC_GUARDED_BY(crit_) = 0;
-  std::unique_ptr<Vad> vad_ RTC_GUARDED_BY(crit_);
-  RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(VoiceDetectionImpl);
-};
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_VOICE_DETECTION_IMPL_H_
diff --git a/modules/audio_processing/voice_detection_unittest.cc b/modules/audio_processing/voice_detection_unittest.cc
deleted file mode 100644
index c4ccd82..0000000
--- a/modules/audio_processing/voice_detection_unittest.cc
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- *  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 <vector>
-
-#include "webrtc/api/array_view.h"
-#include "webrtc/modules/audio_processing/audio_buffer.h"
-#include "webrtc/modules/audio_processing/test/audio_buffer_tools.h"
-#include "webrtc/modules/audio_processing/test/bitexactness_tools.h"
-#include "webrtc/modules/audio_processing/voice_detection_impl.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-namespace {
-
-const int kNumFramesToProcess = 1000;
-
-// Process one frame of data and produce the output.
-void ProcessOneFrame(int sample_rate_hz,
-                     AudioBuffer* audio_buffer,
-                     VoiceDetectionImpl* voice_detection) {
-  if (sample_rate_hz > AudioProcessing::kSampleRate16kHz) {
-    audio_buffer->SplitIntoFrequencyBands();
-  }
-
-  voice_detection->ProcessCaptureAudio(audio_buffer);
-}
-
-// Processes a specified amount of frames, verifies the results and reports
-// any errors.
-void RunBitexactnessTest(int sample_rate_hz,
-                         size_t num_channels,
-                         int frame_size_ms_reference,
-                         bool stream_has_voice_reference,
-                         VoiceDetection::Likelihood likelihood_reference) {
-  rtc::CriticalSection crit_capture;
-  VoiceDetectionImpl voice_detection(&crit_capture);
-  voice_detection.Initialize(sample_rate_hz > 16000 ? 16000 : sample_rate_hz);
-  voice_detection.Enable(true);
-
-  int samples_per_channel = rtc::CheckedDivExact(sample_rate_hz, 100);
-  const StreamConfig capture_config(sample_rate_hz, num_channels, false);
-  AudioBuffer capture_buffer(
-      capture_config.num_frames(), capture_config.num_channels(),
-      capture_config.num_frames(), capture_config.num_channels(),
-      capture_config.num_frames());
-  test::InputAudioFile capture_file(
-      test::GetApmCaptureTestVectorFileName(sample_rate_hz));
-  std::vector<float> capture_input(samples_per_channel * num_channels);
-  for (int frame_no = 0; frame_no < kNumFramesToProcess; ++frame_no) {
-    ReadFloatSamplesFromStereoFile(samples_per_channel, num_channels,
-                                   &capture_file, capture_input);
-
-    test::CopyVectorToAudioBuffer(capture_config, capture_input,
-                                  &capture_buffer);
-
-    ProcessOneFrame(sample_rate_hz, &capture_buffer, &voice_detection);
-  }
-
-  int frame_size_ms = voice_detection.frame_size_ms();
-  bool stream_has_voice = voice_detection.stream_has_voice();
-  VoiceDetection::Likelihood likelihood = voice_detection.likelihood();
-
-  // Compare the outputs to the references.
-  EXPECT_EQ(frame_size_ms_reference, frame_size_ms);
-  EXPECT_EQ(stream_has_voice_reference, stream_has_voice);
-  EXPECT_EQ(likelihood_reference, likelihood);
-}
-
-const int kFrameSizeMsReference = 10;
-const bool kStreamHasVoiceReference = true;
-const VoiceDetection::Likelihood kLikelihoodReference =
-    VoiceDetection::kLowLikelihood;
-
-}  // namespace
-
-TEST(VoiceDetectionBitExactnessTest, Mono8kHz) {
-  RunBitexactnessTest(8000, 1, kFrameSizeMsReference, kStreamHasVoiceReference,
-                      kLikelihoodReference);
-}
-
-TEST(VoiceDetectionBitExactnessTest, Mono16kHz) {
-  RunBitexactnessTest(16000, 1, kFrameSizeMsReference, kStreamHasVoiceReference,
-                      kLikelihoodReference);
-}
-
-TEST(VoiceDetectionBitExactnessTest, Mono32kHz) {
-  RunBitexactnessTest(32000, 1, kFrameSizeMsReference, kStreamHasVoiceReference,
-                      kLikelihoodReference);
-}
-
-TEST(VoiceDetectionBitExactnessTest, Mono48kHz) {
-  RunBitexactnessTest(48000, 1, kFrameSizeMsReference, kStreamHasVoiceReference,
-                      kLikelihoodReference);
-}
-
-TEST(VoiceDetectionBitExactnessTest, Stereo8kHz) {
-  RunBitexactnessTest(8000, 2, kFrameSizeMsReference, kStreamHasVoiceReference,
-                      kLikelihoodReference);
-}
-
-TEST(VoiceDetectionBitExactnessTest, Stereo16kHz) {
-  RunBitexactnessTest(16000, 2, kFrameSizeMsReference, kStreamHasVoiceReference,
-                      kLikelihoodReference);
-}
-
-TEST(VoiceDetectionBitExactnessTest, Stereo32kHz) {
-  RunBitexactnessTest(32000, 2, kFrameSizeMsReference, kStreamHasVoiceReference,
-                      kLikelihoodReference);
-}
-
-TEST(VoiceDetectionBitExactnessTest, Stereo48kHz) {
-  RunBitexactnessTest(48000, 2, kFrameSizeMsReference, kStreamHasVoiceReference,
-                      kLikelihoodReference);
-}
-
-}  // namespace webrtc
diff --git a/modules/bitrate_controller/BUILD.gn b/modules/bitrate_controller/BUILD.gn
deleted file mode 100644
index 4ebf04c..0000000
--- a/modules/bitrate_controller/BUILD.gn
+++ /dev/null
@@ -1,73 +0,0 @@
-# Copyright (c) 2014 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.
-
-import("../../webrtc.gni")
-
-rtc_static_library("bitrate_controller") {
-  # TODO(mbonadei): Remove (bugs.webrtc.org/6828)
-  # Errors on cyclic dependency with:
-  # congestion_controller:congestion_controller if enabled.
-  check_includes = false
-
-  sources = [
-    "bitrate_controller_impl.cc",
-    "bitrate_controller_impl.h",
-    "include/bitrate_controller.h",
-    "send_side_bandwidth_estimation.cc",
-    "send_side_bandwidth_estimation.h",
-  ]
-
-  if (rtc_enable_bwe_test_logging) {
-    defines = [ "BWE_TEST_LOGGING_COMPILE_TIME_ENABLE=1" ]
-  } else {
-    defines = [ "BWE_TEST_LOGGING_COMPILE_TIME_ENABLE=0" ]
-  }
-
-  # TODO(jschuh): Bug 1348: fix this warning.
-  configs += [ "//build/config/compiler:no_size_t_to_int_warning" ]
-
-  if (!build_with_chromium && is_clang) {
-    # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-    suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-  }
-
-  deps = [
-    "../../rtc_base:rtc_base_approved",
-    "../../system_wrappers",
-    "../rtp_rtcp",
-  ]
-}
-
-if (rtc_include_tests) {
-  rtc_source_set("bitrate_controller_unittests") {
-    testonly = true
-
-    # Skip restricting visibility on mobile platforms since the tests on those
-    # gets additional generated targets which would require many lines here to
-    # cover (which would be confusing to read and hard to maintain).
-    if (!is_android && !is_ios) {
-      visibility = [ "..:modules_unittests" ]
-    }
-    sources = [
-      "bitrate_controller_unittest.cc",
-      "send_side_bandwidth_estimation_unittest.cc",
-    ]
-    deps = [
-      ":bitrate_controller",
-      "../../test:field_trial",
-      "../../test:test_support",
-      "../pacing:mock_paced_sender",
-      "../remote_bitrate_estimator:remote_bitrate_estimator",
-      "//testing/gmock",
-    ]
-    if (!build_with_chromium && is_clang) {
-      # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-    }
-  }
-}
diff --git a/modules/bitrate_controller/DEPS b/modules/bitrate_controller/DEPS
deleted file mode 100644
index f84eb8d..0000000
--- a/modules/bitrate_controller/DEPS
+++ /dev/null
@@ -1,5 +0,0 @@
-include_rules = [
-  "+webrtc/call",
-  "+webrtc/logging/rtc_event_log",
-  "+webrtc/system_wrappers",
-]
diff --git a/modules/bitrate_controller/OWNERS b/modules/bitrate_controller/OWNERS
deleted file mode 100644
index 81c98ea..0000000
--- a/modules/bitrate_controller/OWNERS
+++ /dev/null
@@ -1,8 +0,0 @@
-stefan@webrtc.org
-terelius@webrtc.org
-mflodman@webrtc.org
-
-# These are for the common case of adding or renaming files. If you're doing
-# structural changes, please get a review from a reviewer in this file.
-per-file *.gn=*
-per-file *.gni=*
diff --git a/modules/bitrate_controller/bitrate_controller_impl.cc b/modules/bitrate_controller/bitrate_controller_impl.cc
deleted file mode 100644
index dc8805f..0000000
--- a/modules/bitrate_controller/bitrate_controller_impl.cc
+++ /dev/null
@@ -1,289 +0,0 @@
-/*
- *  Copyright (c) 2012 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/bitrate_controller/bitrate_controller_impl.h"
-
-#include <algorithm>
-#include <utility>
-
-#include "webrtc/modules/remote_bitrate_estimator/test/bwe_test_logging.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-
-namespace webrtc {
-
-class BitrateControllerImpl::RtcpBandwidthObserverImpl
-    : public RtcpBandwidthObserver {
- public:
-  explicit RtcpBandwidthObserverImpl(BitrateControllerImpl* owner)
-      : owner_(owner) {
-  }
-  ~RtcpBandwidthObserverImpl() override = default;
-  // Received RTCP REMB or TMMBR.
-  void OnReceivedEstimatedBitrate(uint32_t bitrate) override {
-    owner_->OnReceivedEstimatedBitrate(bitrate);
-  }
-  // Received RTCP receiver block.
-  void OnReceivedRtcpReceiverReport(const ReportBlockList& report_blocks,
-                                    int64_t rtt,
-                                    int64_t now_ms) override {
-    owner_->OnReceivedRtcpReceiverReport(report_blocks, rtt, now_ms);
-  }
-
- private:
-  BitrateControllerImpl* const owner_;
-};
-
-BitrateController* BitrateController::CreateBitrateController(
-    const Clock* clock,
-    BitrateObserver* observer,
-    RtcEventLog* event_log) {
-  return new BitrateControllerImpl(clock, observer, event_log);
-}
-
-BitrateController* BitrateController::CreateBitrateController(
-    const Clock* clock,
-    RtcEventLog* event_log) {
-  return CreateBitrateController(clock, nullptr, event_log);
-}
-
-BitrateControllerImpl::BitrateControllerImpl(const Clock* clock,
-                                             BitrateObserver* observer,
-                                             RtcEventLog* event_log)
-    : clock_(clock),
-      observer_(observer),
-      last_bitrate_update_ms_(clock_->TimeInMilliseconds()),
-      event_log_(event_log),
-      bandwidth_estimation_(event_log),
-      reserved_bitrate_bps_(0),
-      last_bitrate_bps_(0),
-      last_fraction_loss_(0),
-      last_rtt_ms_(0),
-      last_reserved_bitrate_bps_(0) {
-  // This calls the observer_ if set, which means that the observer provided by
-  // the user must be ready to accept a bitrate update when it constructs the
-  // controller. We do this to avoid having to keep synchronized initial values
-  // in both the controller and the allocator.
-  MaybeTriggerOnNetworkChanged();
-}
-
-RtcpBandwidthObserver* BitrateControllerImpl::CreateRtcpBandwidthObserver() {
-  return new RtcpBandwidthObserverImpl(this);
-}
-
-void BitrateControllerImpl::SetStartBitrate(int start_bitrate_bps) {
-  {
-    rtc::CritScope cs(&critsect_);
-    bandwidth_estimation_.SetSendBitrate(start_bitrate_bps);
-  }
-  MaybeTriggerOnNetworkChanged();
-}
-
-void BitrateControllerImpl::SetMinMaxBitrate(int min_bitrate_bps,
-                                             int max_bitrate_bps) {
-  {
-    rtc::CritScope cs(&critsect_);
-    bandwidth_estimation_.SetMinMaxBitrate(min_bitrate_bps, max_bitrate_bps);
-  }
-  MaybeTriggerOnNetworkChanged();
-}
-
-void BitrateControllerImpl::SetBitrates(int start_bitrate_bps,
-                                        int min_bitrate_bps,
-                                        int max_bitrate_bps) {
-  {
-    rtc::CritScope cs(&critsect_);
-    bandwidth_estimation_.SetBitrates(start_bitrate_bps,
-                                      min_bitrate_bps,
-                                      max_bitrate_bps);
-  }
-  MaybeTriggerOnNetworkChanged();
-}
-
-void BitrateControllerImpl::ResetBitrates(int bitrate_bps,
-                                          int min_bitrate_bps,
-                                          int max_bitrate_bps) {
-  {
-    rtc::CritScope cs(&critsect_);
-    bandwidth_estimation_ = SendSideBandwidthEstimation(event_log_);
-    bandwidth_estimation_.SetBitrates(bitrate_bps, min_bitrate_bps,
-                                      max_bitrate_bps);
-  }
-  MaybeTriggerOnNetworkChanged();
-}
-
-void BitrateControllerImpl::SetReservedBitrate(uint32_t reserved_bitrate_bps) {
-  {
-    rtc::CritScope cs(&critsect_);
-    reserved_bitrate_bps_ = reserved_bitrate_bps;
-  }
-  MaybeTriggerOnNetworkChanged();
-}
-
-// This is called upon reception of REMB or TMMBR.
-void BitrateControllerImpl::OnReceivedEstimatedBitrate(uint32_t bitrate) {
-  {
-    rtc::CritScope cs(&critsect_);
-    bandwidth_estimation_.UpdateReceiverEstimate(clock_->TimeInMilliseconds(),
-                                                 bitrate);
-    BWE_TEST_LOGGING_PLOT(1, "REMB_kbps", clock_->TimeInMilliseconds(),
-                          bitrate / 1000);
-  }
-  MaybeTriggerOnNetworkChanged();
-}
-
-void BitrateControllerImpl::OnDelayBasedBweResult(
-    const DelayBasedBwe::Result& result) {
-  if (!result.updated)
-    return;
-  {
-    rtc::CritScope cs(&critsect_);
-    bandwidth_estimation_.UpdateDelayBasedEstimate(clock_->TimeInMilliseconds(),
-                                                   result.target_bitrate_bps);
-    if (result.probe) {
-      bandwidth_estimation_.SetSendBitrate(result.target_bitrate_bps);
-    }
-  }
-  MaybeTriggerOnNetworkChanged();
-}
-
-int64_t BitrateControllerImpl::TimeUntilNextProcess() {
-  const int64_t kBitrateControllerUpdateIntervalMs = 25;
-  rtc::CritScope cs(&critsect_);
-  int64_t time_since_update_ms =
-      clock_->TimeInMilliseconds() - last_bitrate_update_ms_;
-  return std::max<int64_t>(
-      kBitrateControllerUpdateIntervalMs - time_since_update_ms, 0);
-}
-
-void BitrateControllerImpl::Process() {
-  {
-    rtc::CritScope cs(&critsect_);
-    bandwidth_estimation_.UpdateEstimate(clock_->TimeInMilliseconds());
-  }
-  MaybeTriggerOnNetworkChanged();
-  last_bitrate_update_ms_ = clock_->TimeInMilliseconds();
-}
-
-void BitrateControllerImpl::OnReceivedRtcpReceiverReport(
-    const ReportBlockList& report_blocks,
-    int64_t rtt,
-    int64_t now_ms) {
-  if (report_blocks.empty())
-    return;
-
-  {
-    rtc::CritScope cs(&critsect_);
-    int fraction_lost_aggregate = 0;
-    int total_number_of_packets = 0;
-
-    // Compute the a weighted average of the fraction loss from all report
-    // blocks.
-    for (const RTCPReportBlock& report_block : report_blocks) {
-      std::map<uint32_t, uint32_t>::iterator seq_num_it =
-          ssrc_to_last_received_extended_high_seq_num_.find(
-              report_block.source_ssrc);
-
-      int number_of_packets = 0;
-      if (seq_num_it != ssrc_to_last_received_extended_high_seq_num_.end()) {
-        number_of_packets =
-            report_block.extended_highest_sequence_number - seq_num_it->second;
-      }
-
-      fraction_lost_aggregate += number_of_packets * report_block.fraction_lost;
-      total_number_of_packets += number_of_packets;
-
-      // Update last received for this SSRC.
-      ssrc_to_last_received_extended_high_seq_num_[report_block.source_ssrc] =
-          report_block.extended_highest_sequence_number;
-    }
-    if (total_number_of_packets < 0) {
-      LOG(LS_WARNING) << "Received report block where extended high sequence "
-                         "number goes backwards, ignoring.";
-      return;
-    }
-    if (total_number_of_packets == 0)
-      fraction_lost_aggregate = 0;
-    else
-      fraction_lost_aggregate =
-          (fraction_lost_aggregate + total_number_of_packets / 2) /
-          total_number_of_packets;
-    if (fraction_lost_aggregate > 255)
-      return;
-
-    RTC_DCHECK_GE(total_number_of_packets, 0);
-
-    bandwidth_estimation_.UpdateReceiverBlock(fraction_lost_aggregate, rtt,
-                                              total_number_of_packets, now_ms);
-  }
-  MaybeTriggerOnNetworkChanged();
-}
-
-void BitrateControllerImpl::MaybeTriggerOnNetworkChanged() {
-  if (!observer_)
-    return;
-
-  uint32_t bitrate_bps;
-  uint8_t fraction_loss;
-  int64_t rtt;
-
-  if (GetNetworkParameters(&bitrate_bps, &fraction_loss, &rtt))
-    observer_->OnNetworkChanged(bitrate_bps, fraction_loss, rtt);
-}
-
-bool BitrateControllerImpl::GetNetworkParameters(uint32_t* bitrate,
-                                                 uint8_t* fraction_loss,
-                                                 int64_t* rtt) {
-  rtc::CritScope cs(&critsect_);
-  int current_bitrate;
-  bandwidth_estimation_.CurrentEstimate(&current_bitrate, fraction_loss, rtt);
-  *bitrate = current_bitrate;
-  *bitrate -= std::min(*bitrate, reserved_bitrate_bps_);
-  *bitrate =
-      std::max<uint32_t>(*bitrate, bandwidth_estimation_.GetMinBitrate());
-
-  bool new_bitrate = false;
-  if (*bitrate != last_bitrate_bps_ || *fraction_loss != last_fraction_loss_ ||
-      *rtt != last_rtt_ms_ ||
-      last_reserved_bitrate_bps_ != reserved_bitrate_bps_) {
-    last_bitrate_bps_ = *bitrate;
-    last_fraction_loss_ = *fraction_loss;
-    last_rtt_ms_ = *rtt;
-    last_reserved_bitrate_bps_ = reserved_bitrate_bps_;
-    new_bitrate = true;
-  }
-
-  BWE_TEST_LOGGING_PLOT(1, "fraction_loss_%", clock_->TimeInMilliseconds(),
-                        (last_fraction_loss_ * 100) / 256);
-  BWE_TEST_LOGGING_PLOT(1, "rtt_ms", clock_->TimeInMilliseconds(),
-                        last_rtt_ms_);
-  BWE_TEST_LOGGING_PLOT(1, "Target_bitrate_kbps", clock_->TimeInMilliseconds(),
-                        last_bitrate_bps_ / 1000);
-
-  return new_bitrate;
-}
-
-bool BitrateControllerImpl::AvailableBandwidth(uint32_t* bandwidth) const {
-  rtc::CritScope cs(&critsect_);
-  int bitrate;
-  uint8_t fraction_loss;
-  int64_t rtt;
-  bandwidth_estimation_.CurrentEstimate(&bitrate, &fraction_loss, &rtt);
-  if (bitrate > 0) {
-    bitrate = bitrate - std::min<int>(bitrate, reserved_bitrate_bps_);
-    bitrate = std::max(bitrate, bandwidth_estimation_.GetMinBitrate());
-    *bandwidth = bitrate;
-    return true;
-  }
-  return false;
-}
-}  // namespace webrtc
diff --git a/modules/bitrate_controller/bitrate_controller_impl.h b/modules/bitrate_controller/bitrate_controller_impl.h
deleted file mode 100644
index 0934fa2..0000000
--- a/modules/bitrate_controller/bitrate_controller_impl.h
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- *  Copyright (c) 2012 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.
- *
- *  Usage: this class will register multiple RtcpBitrateObserver's one at each
- *  RTCP module. It will aggregate the results and run one bandwidth estimation
- *  and push the result to the encoder via VideoEncoderCallback.
- */
-
-#ifndef WEBRTC_MODULES_BITRATE_CONTROLLER_BITRATE_CONTROLLER_IMPL_H_
-#define WEBRTC_MODULES_BITRATE_CONTROLLER_BITRATE_CONTROLLER_IMPL_H_
-
-#include "webrtc/modules/bitrate_controller/include/bitrate_controller.h"
-
-#include <list>
-#include <map>
-#include <utility>
-#include <vector>
-
-#include "webrtc/modules/bitrate_controller/send_side_bandwidth_estimation.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/criticalsection.h"
-
-namespace webrtc {
-
-class BitrateControllerImpl : public BitrateController {
- public:
-  // TODO(perkj): BitrateObserver has been deprecated and is not used in WebRTC.
-  // |observer| is left for project that is not yet updated.
-  BitrateControllerImpl(const Clock* clock,
-                        BitrateObserver* observer,
-                        RtcEventLog* event_log);
-  virtual ~BitrateControllerImpl() {}
-
-  bool AvailableBandwidth(uint32_t* bandwidth) const override;
-
-  RtcpBandwidthObserver* CreateRtcpBandwidthObserver() override;
-
-  // Deprecated
-  void SetStartBitrate(int start_bitrate_bps) override;
-  // Deprecated
-  void SetMinMaxBitrate(int min_bitrate_bps, int max_bitrate_bps) override;
-
-  void SetBitrates(int start_bitrate_bps,
-                   int min_bitrate_bps,
-                   int max_bitrate_bps) override;
-
-  void ResetBitrates(int bitrate_bps,
-                     int min_bitrate_bps,
-                     int max_bitrate_bps) override;
-
-
-  void SetReservedBitrate(uint32_t reserved_bitrate_bps) override;
-
-  // Returns true if the parameters have changed since the last call.
-  bool GetNetworkParameters(uint32_t* bitrate,
-                            uint8_t* fraction_loss,
-                            int64_t* rtt) override;
-
-  void OnDelayBasedBweResult(const DelayBasedBwe::Result& result) override;
-
-  int64_t TimeUntilNextProcess() override;
-  void Process() override;
-
- private:
-  class RtcpBandwidthObserverImpl;
-
-  // Called by BitrateObserver's direct from the RTCP module.
-  // Implements RtcpBandwidthObserver.
-  void OnReceivedEstimatedBitrate(uint32_t bitrate) override;
-
-  void OnReceivedRtcpReceiverReport(const ReportBlockList& report_blocks,
-                                    int64_t rtt,
-                                    int64_t now_ms) override;
-
-  // Deprecated
-  void MaybeTriggerOnNetworkChanged();
-
-  void OnNetworkChanged(uint32_t bitrate,
-                        uint8_t fraction_loss,  // 0 - 255.
-                        int64_t rtt) RTC_EXCLUSIVE_LOCKS_REQUIRED(critsect_);
-
-  // Used by process thread.
-  const Clock* const clock_;
-  BitrateObserver* const observer_;
-  int64_t last_bitrate_update_ms_;
-  RtcEventLog* const event_log_;
-
-  rtc::CriticalSection critsect_;
-  std::map<uint32_t, uint32_t> ssrc_to_last_received_extended_high_seq_num_
-      RTC_GUARDED_BY(critsect_);
-  SendSideBandwidthEstimation bandwidth_estimation_ RTC_GUARDED_BY(critsect_);
-  uint32_t reserved_bitrate_bps_ RTC_GUARDED_BY(critsect_);
-
-  uint32_t last_bitrate_bps_ RTC_GUARDED_BY(critsect_);
-  uint8_t last_fraction_loss_ RTC_GUARDED_BY(critsect_);
-  int64_t last_rtt_ms_ RTC_GUARDED_BY(critsect_);
-  uint32_t last_reserved_bitrate_bps_ RTC_GUARDED_BY(critsect_);
-
-  RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(BitrateControllerImpl);
-};
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_BITRATE_CONTROLLER_BITRATE_CONTROLLER_IMPL_H_
diff --git a/modules/bitrate_controller/bitrate_controller_unittest.cc b/modules/bitrate_controller/bitrate_controller_unittest.cc
deleted file mode 100644
index a012998..0000000
--- a/modules/bitrate_controller/bitrate_controller_unittest.cc
+++ /dev/null
@@ -1,509 +0,0 @@
-/*
- *  Copyright (c) 2012 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 <algorithm>
-#include <vector>
-
-#include "webrtc/logging/rtc_event_log/mock/mock_rtc_event_log.h"
-#include "webrtc/modules/bitrate_controller/include/bitrate_controller.h"
-#include "webrtc/modules/pacing/mock/mock_paced_sender.h"
-#include "webrtc/modules/remote_bitrate_estimator/include/bwe_defines.h"
-#include "webrtc/test/field_trial.h"
-#include "webrtc/test/gtest.h"
-
-using ::testing::Exactly;
-using ::testing::Return;
-
-using webrtc::BitrateController;
-using webrtc::BitrateObserver;
-using webrtc::PacedSender;
-using webrtc::RtcpBandwidthObserver;
-
-uint8_t WeightedLoss(int num_packets1, uint8_t fraction_loss1,
-                     int num_packets2, uint8_t fraction_loss2) {
-  int weighted_sum = num_packets1 * fraction_loss1 +
-      num_packets2 * fraction_loss2;
-  int total_num_packets = num_packets1 + num_packets2;
-  return (weighted_sum + total_num_packets / 2) / total_num_packets;
-}
-
-webrtc::RTCPReportBlock CreateReportBlock(
-    uint32_t remote_ssrc, uint32_t source_ssrc,
-    uint8_t fraction_lost, uint32_t extended_high_sequence_number) {
-  return webrtc::RTCPReportBlock(remote_ssrc, source_ssrc, fraction_lost, 0,
-                                 extended_high_sequence_number, 0, 0, 0);
-}
-
-class TestBitrateObserver: public BitrateObserver {
- public:
-  TestBitrateObserver()
-      : last_bitrate_(0),
-        last_fraction_loss_(0),
-        last_rtt_(0) {
-  }
-
-  virtual void OnNetworkChanged(uint32_t bitrate,
-                                uint8_t fraction_loss,
-                                int64_t rtt) {
-    last_bitrate_ = static_cast<int>(bitrate);
-    last_fraction_loss_ = fraction_loss;
-    last_rtt_ = rtt;
-  }
-  int last_bitrate_;
-  uint8_t last_fraction_loss_;
-  int64_t last_rtt_;
-};
-
-class BitrateControllerTest : public ::testing::Test {
- protected:
-  BitrateControllerTest() : clock_(0) {}
-  ~BitrateControllerTest() {}
-
-  virtual void SetUp() {
-    controller_.reset(BitrateController::CreateBitrateController(
-        &clock_, &bitrate_observer_, &event_log_));
-    controller_->SetStartBitrate(kStartBitrateBps);
-    EXPECT_EQ(kStartBitrateBps, bitrate_observer_.last_bitrate_);
-    controller_->SetMinMaxBitrate(kMinBitrateBps, kMaxBitrateBps);
-    EXPECT_EQ(kStartBitrateBps, bitrate_observer_.last_bitrate_);
-    bandwidth_observer_.reset(controller_->CreateRtcpBandwidthObserver());
-  }
-
-  virtual void TearDown() {
-  }
-
-  const int kMinBitrateBps = 100000;
-  const int kStartBitrateBps = 200000;
-  const int kMaxBitrateBps = 300000;
-
-  const int kDefaultMinBitrateBps = 10000;
-  const int kDefaultMaxBitrateBps = 1000000000;
-
-  webrtc::SimulatedClock clock_;
-  TestBitrateObserver bitrate_observer_;
-  std::unique_ptr<BitrateController> controller_;
-  std::unique_ptr<RtcpBandwidthObserver> bandwidth_observer_;
-  testing::NiceMock<webrtc::MockRtcEventLog> event_log_;
-};
-
-TEST_F(BitrateControllerTest, DefaultMinMaxBitrate) {
-  // Receive successively lower REMBs, verify the reserved bitrate is deducted.
-  controller_->SetMinMaxBitrate(0, 0);
-  EXPECT_EQ(kStartBitrateBps, bitrate_observer_.last_bitrate_);
-  bandwidth_observer_->OnReceivedEstimatedBitrate(kDefaultMinBitrateBps / 2);
-  EXPECT_EQ(webrtc::congestion_controller::GetMinBitrateBps(),
-            bitrate_observer_.last_bitrate_);
-  bandwidth_observer_->OnReceivedEstimatedBitrate(2 * kDefaultMaxBitrateBps);
-  clock_.AdvanceTimeMilliseconds(1000);
-  controller_->Process();
-  EXPECT_EQ(kDefaultMaxBitrateBps, bitrate_observer_.last_bitrate_);
-}
-
-TEST_F(BitrateControllerTest, OneBitrateObserverOneRtcpObserver) {
-  // First REMB applies immediately.
-  int64_t time_ms = 1001;
-  webrtc::ReportBlockList report_blocks;
-  report_blocks.push_back(CreateReportBlock(1, 2, 0, 1));
-  bandwidth_observer_->OnReceivedEstimatedBitrate(200000);
-  EXPECT_EQ(200000, bitrate_observer_.last_bitrate_);
-  EXPECT_EQ(0, bitrate_observer_.last_fraction_loss_);
-  EXPECT_EQ(0, bitrate_observer_.last_rtt_);
-  bandwidth_observer_->OnReceivedRtcpReceiverReport(report_blocks, 50, time_ms);
-  report_blocks.clear();
-  time_ms += 2000;
-
-  // Receive a high remb, test bitrate inc.
-  bandwidth_observer_->OnReceivedEstimatedBitrate(400000);
-
-  // Test bitrate increase 8% per second.
-  report_blocks.push_back(CreateReportBlock(1, 2, 0, 21));
-  bandwidth_observer_->OnReceivedRtcpReceiverReport(report_blocks, 50, time_ms);
-  EXPECT_EQ(217000, bitrate_observer_.last_bitrate_);
-  EXPECT_EQ(0, bitrate_observer_.last_fraction_loss_);
-  EXPECT_EQ(50, bitrate_observer_.last_rtt_);
-  time_ms += 1000;
-
-  report_blocks.clear();
-  report_blocks.push_back(CreateReportBlock(1, 2, 0, 41));
-  bandwidth_observer_->OnReceivedRtcpReceiverReport(report_blocks, 50, time_ms);
-  EXPECT_EQ(235360, bitrate_observer_.last_bitrate_);
-  EXPECT_EQ(0, bitrate_observer_.last_fraction_loss_);
-  EXPECT_EQ(50, bitrate_observer_.last_rtt_);
-  time_ms += 1000;
-
-  report_blocks.clear();
-  report_blocks.push_back(CreateReportBlock(1, 2, 0, 61));
-  bandwidth_observer_->OnReceivedRtcpReceiverReport(report_blocks, 50, time_ms);
-  EXPECT_EQ(255189, bitrate_observer_.last_bitrate_);
-  time_ms += 1000;
-
-  report_blocks.clear();
-  report_blocks.push_back(CreateReportBlock(1, 2, 0, 81));
-  bandwidth_observer_->OnReceivedRtcpReceiverReport(report_blocks, 50, time_ms);
-  EXPECT_EQ(276604, bitrate_observer_.last_bitrate_);
-  time_ms += 1000;
-
-  report_blocks.clear();
-  report_blocks.push_back(CreateReportBlock(1, 2, 0, 101));
-  bandwidth_observer_->OnReceivedRtcpReceiverReport(report_blocks, 50, time_ms);
-  EXPECT_EQ(299732, bitrate_observer_.last_bitrate_);
-  time_ms += 1000;
-
-  // Reach max cap.
-  report_blocks.clear();
-  report_blocks.push_back(CreateReportBlock(1, 2, 0, 121));
-  bandwidth_observer_->OnReceivedRtcpReceiverReport(report_blocks, 50, time_ms);
-  EXPECT_EQ(300000, bitrate_observer_.last_bitrate_);
-  time_ms += 1000;
-
-  report_blocks.clear();
-  report_blocks.push_back(CreateReportBlock(1, 2, 0, 141));
-  bandwidth_observer_->OnReceivedRtcpReceiverReport(report_blocks, 50, time_ms);
-  EXPECT_EQ(300000, bitrate_observer_.last_bitrate_);
-
-  // Test that a low delay-based estimate limits the combined estimate.
-  webrtc::DelayBasedBwe::Result result(false, 280000);
-  controller_->OnDelayBasedBweResult(result);
-  EXPECT_EQ(280000, bitrate_observer_.last_bitrate_);
-
-  // Test that a low REMB limits the combined estimate.
-  bandwidth_observer_->OnReceivedEstimatedBitrate(250000);
-  EXPECT_EQ(250000, bitrate_observer_.last_bitrate_);
-  EXPECT_EQ(0, bitrate_observer_.last_fraction_loss_);
-  EXPECT_EQ(50, bitrate_observer_.last_rtt_);
-
-  bandwidth_observer_->OnReceivedEstimatedBitrate(1000);
-  EXPECT_EQ(100000, bitrate_observer_.last_bitrate_);
-}
-
-TEST_F(BitrateControllerTest, OneBitrateObserverTwoRtcpObservers) {
-  const uint32_t kSenderSsrc1 = 1;
-  const uint32_t kSenderSsrc2 = 2;
-  const uint32_t kMediaSsrc1 = 3;
-  const uint32_t kMediaSsrc2 = 4;
-
-  int64_t time_ms = 1;
-  webrtc::ReportBlockList report_blocks;
-  report_blocks = {CreateReportBlock(kSenderSsrc1, kMediaSsrc1, 0, 1)};
-  bandwidth_observer_->OnReceivedRtcpReceiverReport(report_blocks, 50, time_ms);
-  time_ms += 500;
-
-  RtcpBandwidthObserver* second_bandwidth_observer =
-      controller_->CreateRtcpBandwidthObserver();
-  report_blocks = {CreateReportBlock(kSenderSsrc2, kMediaSsrc2, 0, 21)};
-  second_bandwidth_observer->OnReceivedRtcpReceiverReport(
-      report_blocks, 100, time_ms);
-
-  // Test start bitrate.
-  EXPECT_EQ(200000, bitrate_observer_.last_bitrate_);
-  EXPECT_EQ(0, bitrate_observer_.last_fraction_loss_);
-  EXPECT_EQ(100, bitrate_observer_.last_rtt_);
-  time_ms += 500;
-
-  // Test bitrate increase 8% per second.
-  report_blocks = {CreateReportBlock(kSenderSsrc1, kMediaSsrc1, 0, 21)};
-  bandwidth_observer_->OnReceivedRtcpReceiverReport(report_blocks, 50, time_ms);
-  time_ms += 500;
-
-  report_blocks = {CreateReportBlock(kSenderSsrc2, kMediaSsrc2, 0, 21)};
-  second_bandwidth_observer->OnReceivedRtcpReceiverReport(
-      report_blocks, 100, time_ms);
-  EXPECT_EQ(217000, bitrate_observer_.last_bitrate_);
-  EXPECT_EQ(0, bitrate_observer_.last_fraction_loss_);
-  EXPECT_EQ(100, bitrate_observer_.last_rtt_);
-  time_ms += 500;
-
-  // Extra report should not change estimate.
-  report_blocks = {CreateReportBlock(kSenderSsrc2, kMediaSsrc2, 0, 31)};
-  second_bandwidth_observer->OnReceivedRtcpReceiverReport(
-      report_blocks, 100, time_ms);
-  EXPECT_EQ(217000, bitrate_observer_.last_bitrate_);
-  time_ms += 500;
-
-  report_blocks = {CreateReportBlock(kSenderSsrc1, kMediaSsrc1, 0, 41)};
-  bandwidth_observer_->OnReceivedRtcpReceiverReport(report_blocks, 50, time_ms);
-  EXPECT_EQ(235360, bitrate_observer_.last_bitrate_);
-
-  // Second report should not change estimate.
-  report_blocks = {CreateReportBlock(kSenderSsrc2, kMediaSsrc2, 0, 41)};
-  second_bandwidth_observer->OnReceivedRtcpReceiverReport(
-      report_blocks, 100, time_ms);
-  EXPECT_EQ(235360, bitrate_observer_.last_bitrate_);
-  time_ms += 1000;
-
-  // Reports from only one bandwidth observer is ok.
-  report_blocks = {CreateReportBlock(kSenderSsrc2, kMediaSsrc2, 0, 61)};
-  second_bandwidth_observer->OnReceivedRtcpReceiverReport(
-      report_blocks, 50, time_ms);
-  EXPECT_EQ(255189, bitrate_observer_.last_bitrate_);
-  time_ms += 1000;
-
-  report_blocks = {CreateReportBlock(kSenderSsrc2, kMediaSsrc2, 0, 81)};
-  second_bandwidth_observer->OnReceivedRtcpReceiverReport(
-      report_blocks, 50, time_ms);
-  EXPECT_EQ(276604, bitrate_observer_.last_bitrate_);
-  time_ms += 1000;
-
-  report_blocks = {CreateReportBlock(kSenderSsrc2, kMediaSsrc2, 0, 121)};
-  second_bandwidth_observer->OnReceivedRtcpReceiverReport(
-      report_blocks, 50, time_ms);
-  EXPECT_EQ(299732, bitrate_observer_.last_bitrate_);
-  time_ms += 1000;
-
-  // Reach max cap.
-  report_blocks = {CreateReportBlock(kSenderSsrc2, kMediaSsrc2, 0, 141)};
-  second_bandwidth_observer->OnReceivedRtcpReceiverReport(
-      report_blocks, 50, time_ms);
-  EXPECT_EQ(300000, bitrate_observer_.last_bitrate_);
-
-  // Test that a low REMB trigger immediately.
-  // We don't care which bandwidth observer that delivers the REMB.
-  second_bandwidth_observer->OnReceivedEstimatedBitrate(250000);
-  EXPECT_EQ(250000, bitrate_observer_.last_bitrate_);
-  EXPECT_EQ(0, bitrate_observer_.last_fraction_loss_);
-  EXPECT_EQ(50, bitrate_observer_.last_rtt_);
-
-  // Min cap.
-  bandwidth_observer_->OnReceivedEstimatedBitrate(1000);
-  EXPECT_EQ(100000, bitrate_observer_.last_bitrate_);
-  delete second_bandwidth_observer;
-}
-
-TEST_F(BitrateControllerTest, OneBitrateObserverMultipleReportBlocks) {
-  uint32_t sequence_number[2] = {0, 0xFF00};
-  const int kStartBitrate = 200000;
-  const int kMinBitrate = 100000;
-  const int kMaxBitrate = 300000;
-  controller_->SetStartBitrate(kStartBitrate);
-  controller_->SetMinMaxBitrate(kMinBitrate, kMaxBitrate);
-
-  // REMBs during the first 2 seconds apply immediately.
-  int64_t time_ms = 1001;
-  webrtc::ReportBlockList report_blocks;
-  report_blocks.push_back(CreateReportBlock(1, 2, 0, sequence_number[0]));
-  bandwidth_observer_->OnReceivedEstimatedBitrate(kStartBitrate);
-  bandwidth_observer_->OnReceivedRtcpReceiverReport(report_blocks, 50, time_ms);
-  report_blocks.clear();
-  time_ms += 2000;
-
-  // Receive a high REMB, test bitrate increase.
-  bandwidth_observer_->OnReceivedEstimatedBitrate(400000);
-
-  int last_bitrate = 0;
-  // Ramp up to max bitrate.
-  for (int i = 0; i < 7; ++i) {
-    report_blocks.push_back(CreateReportBlock(1, 2, 0, sequence_number[0]));
-    report_blocks.push_back(CreateReportBlock(1, 3, 0, sequence_number[1]));
-    bandwidth_observer_->OnReceivedRtcpReceiverReport(report_blocks, 50,
-                                                      time_ms);
-    EXPECT_GT(bitrate_observer_.last_bitrate_, last_bitrate);
-    EXPECT_EQ(0, bitrate_observer_.last_fraction_loss_);
-    EXPECT_EQ(50, bitrate_observer_.last_rtt_);
-    last_bitrate = bitrate_observer_.last_bitrate_;
-    time_ms += 1000;
-    sequence_number[0] += 20;
-    sequence_number[1] += 1;
-    report_blocks.clear();
-  }
-
-  EXPECT_EQ(kMaxBitrate, bitrate_observer_.last_bitrate_);
-
-  // Packet loss on the first stream. Verify that bitrate decreases.
-  report_blocks.push_back(CreateReportBlock(1, 2, 50, sequence_number[0]));
-  report_blocks.push_back(CreateReportBlock(1, 3, 0, sequence_number[1]));
-  bandwidth_observer_->OnReceivedRtcpReceiverReport(report_blocks, 50, time_ms);
-  EXPECT_LT(bitrate_observer_.last_bitrate_, last_bitrate);
-  EXPECT_EQ(WeightedLoss(20, 50, 1, 0), bitrate_observer_.last_fraction_loss_);
-  EXPECT_EQ(50, bitrate_observer_.last_rtt_);
-  last_bitrate = bitrate_observer_.last_bitrate_;
-  sequence_number[0] += 20;
-  sequence_number[1] += 20;
-  time_ms += 1000;
-  report_blocks.clear();
-
-  // Packet loss on the second stream. Verify that bitrate decreases.
-  report_blocks.push_back(CreateReportBlock(1, 2, 0, sequence_number[0]));
-  report_blocks.push_back(CreateReportBlock(1, 3, 75, sequence_number[1]));
-  bandwidth_observer_->OnReceivedRtcpReceiverReport(report_blocks, 50, time_ms);
-  EXPECT_LT(bitrate_observer_.last_bitrate_, last_bitrate);
-  EXPECT_EQ(WeightedLoss(20, 0, 20, 75), bitrate_observer_.last_fraction_loss_);
-  EXPECT_EQ(50, bitrate_observer_.last_rtt_);
-  last_bitrate = bitrate_observer_.last_bitrate_;
-  sequence_number[0] += 20;
-  sequence_number[1] += 1;
-  time_ms += 1000;
-  report_blocks.clear();
-
-  // All packets lost on stream with few packets, no back-off.
-  report_blocks.push_back(CreateReportBlock(1, 2, 1, sequence_number[0]));
-  report_blocks.push_back(CreateReportBlock(1, 3, 255, sequence_number[1]));
-  bandwidth_observer_->OnReceivedRtcpReceiverReport(report_blocks, 50, time_ms);
-  EXPECT_EQ(bitrate_observer_.last_bitrate_, last_bitrate);
-  EXPECT_EQ(WeightedLoss(20, 1, 1, 255), bitrate_observer_.last_fraction_loss_);
-  EXPECT_EQ(50, bitrate_observer_.last_rtt_);
-  last_bitrate = bitrate_observer_.last_bitrate_;
-  sequence_number[0] += 20;
-  sequence_number[1] += 1;
-  report_blocks.clear();
-}
-
-TEST_F(BitrateControllerTest, SetReservedBitrate) {
-  // Receive successively lower REMBs, verify the reserved bitrate is deducted.
-  controller_->SetReservedBitrate(0);
-  bandwidth_observer_->OnReceivedEstimatedBitrate(400000);
-  EXPECT_EQ(200000, bitrate_observer_.last_bitrate_);
-  controller_->SetReservedBitrate(50000);
-  bandwidth_observer_->OnReceivedEstimatedBitrate(400000);
-  EXPECT_EQ(150000, bitrate_observer_.last_bitrate_);
-
-  controller_->SetReservedBitrate(0);
-  bandwidth_observer_->OnReceivedEstimatedBitrate(250000);
-  EXPECT_EQ(200000, bitrate_observer_.last_bitrate_);
-  controller_->SetReservedBitrate(50000);
-  bandwidth_observer_->OnReceivedEstimatedBitrate(250000);
-  EXPECT_EQ(150000, bitrate_observer_.last_bitrate_);
-
-  controller_->SetReservedBitrate(0);
-  bandwidth_observer_->OnReceivedEstimatedBitrate(200000);
-  EXPECT_EQ(200000, bitrate_observer_.last_bitrate_);
-  controller_->SetReservedBitrate(30000);
-  bandwidth_observer_->OnReceivedEstimatedBitrate(200000);
-  EXPECT_EQ(170000, bitrate_observer_.last_bitrate_);
-
-  controller_->SetReservedBitrate(0);
-  bandwidth_observer_->OnReceivedEstimatedBitrate(160000);
-  EXPECT_EQ(160000, bitrate_observer_.last_bitrate_);
-  controller_->SetReservedBitrate(30000);
-  bandwidth_observer_->OnReceivedEstimatedBitrate(160000);
-  EXPECT_EQ(130000, bitrate_observer_.last_bitrate_);
-
-  controller_->SetReservedBitrate(0);
-  bandwidth_observer_->OnReceivedEstimatedBitrate(120000);
-  EXPECT_EQ(120000, bitrate_observer_.last_bitrate_);
-  controller_->SetReservedBitrate(10000);
-  bandwidth_observer_->OnReceivedEstimatedBitrate(120000);
-  EXPECT_EQ(110000, bitrate_observer_.last_bitrate_);
-
-  controller_->SetReservedBitrate(0);
-  bandwidth_observer_->OnReceivedEstimatedBitrate(120000);
-  EXPECT_EQ(120000, bitrate_observer_.last_bitrate_);
-  controller_->SetReservedBitrate(50000);
-  bandwidth_observer_->OnReceivedEstimatedBitrate(120000);
-  // Limited by min bitrate.
-  EXPECT_EQ(100000, bitrate_observer_.last_bitrate_);
-
-  controller_->SetReservedBitrate(10000);
-  bandwidth_observer_->OnReceivedEstimatedBitrate(1);
-  EXPECT_EQ(100000, bitrate_observer_.last_bitrate_);
-}
-
-TEST_F(BitrateControllerTest, TimeoutsWithoutFeedback) {
-  {
-    webrtc::test::ScopedFieldTrials override_field_trials(
-        "WebRTC-FeedbackTimeout/Enabled/");
-    SetUp();
-    int expected_bitrate_bps = 300000;
-    controller_->SetBitrates(300000, kDefaultMinBitrateBps,
-                             kDefaultMaxBitrateBps);
-
-    webrtc::ReportBlockList report_blocks;
-    report_blocks.push_back(CreateReportBlock(1, 2, 0, 1));
-    bandwidth_observer_->OnReceivedRtcpReceiverReport(
-        report_blocks, 50, clock_.TimeInMilliseconds());
-    EXPECT_EQ(expected_bitrate_bps, bitrate_observer_.last_bitrate_);
-    clock_.AdvanceTimeMilliseconds(500);
-
-    report_blocks.push_back(CreateReportBlock(1, 2, 0, 21));
-    bandwidth_observer_->OnReceivedRtcpReceiverReport(
-        report_blocks, 50, clock_.TimeInMilliseconds());
-    report_blocks.clear();
-    expected_bitrate_bps = expected_bitrate_bps * 1.08 + 1000;
-    EXPECT_EQ(expected_bitrate_bps, bitrate_observer_.last_bitrate_);
-    clock_.AdvanceTimeMilliseconds(1500);
-
-    report_blocks.push_back(CreateReportBlock(1, 2, 0, 41));
-    bandwidth_observer_->OnReceivedRtcpReceiverReport(
-        report_blocks, 50, clock_.TimeInMilliseconds());
-    expected_bitrate_bps = expected_bitrate_bps * 1.08 + 1000;
-    EXPECT_EQ(expected_bitrate_bps, bitrate_observer_.last_bitrate_);
-    clock_.AdvanceTimeMilliseconds(4000);
-
-    // 4 seconds since feedback, expect increase.
-    controller_->Process();
-    expected_bitrate_bps = expected_bitrate_bps * 1.08 + 1000;
-    EXPECT_EQ(expected_bitrate_bps, bitrate_observer_.last_bitrate_);
-    clock_.AdvanceTimeMilliseconds(2000);
-
-    // 6 seconds since feedback, expect no increase.
-    controller_->Process();
-    EXPECT_EQ(expected_bitrate_bps, bitrate_observer_.last_bitrate_);
-    clock_.AdvanceTimeMilliseconds(9001);
-
-    // More than 15 seconds since feedback, expect decrease.
-    controller_->Process();
-    expected_bitrate_bps *= 0.8;
-    EXPECT_EQ(expected_bitrate_bps, bitrate_observer_.last_bitrate_);
-    clock_.AdvanceTimeMilliseconds(500);
-
-    // Only one timeout every second.
-    controller_->Process();
-    EXPECT_EQ(expected_bitrate_bps, bitrate_observer_.last_bitrate_);
-    clock_.AdvanceTimeMilliseconds(501);
-
-    // New timeout allowed.
-    controller_->Process();
-    expected_bitrate_bps *= 0.8;
-    EXPECT_EQ(expected_bitrate_bps, bitrate_observer_.last_bitrate_);
-  }
-}
-
-TEST_F(BitrateControllerTest, StopIncreaseWithoutPacketReports) {
-  int expected_bitrate_bps = 300000;
-  controller_->SetBitrates(300000, kDefaultMinBitrateBps,
-                           kDefaultMaxBitrateBps);
-
-  webrtc::ReportBlockList report_blocks;
-  report_blocks.push_back(CreateReportBlock(1, 2, 0, 1));
-  bandwidth_observer_->OnReceivedRtcpReceiverReport(
-      report_blocks, 50, clock_.TimeInMilliseconds());
-  EXPECT_EQ(expected_bitrate_bps, bitrate_observer_.last_bitrate_);
-  clock_.AdvanceTimeMilliseconds(500);
-
-  report_blocks.push_back(CreateReportBlock(1, 2, 0, 21));
-  bandwidth_observer_->OnReceivedRtcpReceiverReport(
-      report_blocks, 50, clock_.TimeInMilliseconds());
-  report_blocks.clear();
-  expected_bitrate_bps = expected_bitrate_bps * 1.08 + 1000;
-  EXPECT_EQ(expected_bitrate_bps, bitrate_observer_.last_bitrate_);
-  clock_.AdvanceTimeMilliseconds(1500);
-
-  // 1.2 seconds without packets reported as received, no increase.
-  report_blocks.push_back(CreateReportBlock(1, 2, 0, 21));
-  bandwidth_observer_->OnReceivedRtcpReceiverReport(
-      report_blocks, 50, clock_.TimeInMilliseconds());
-  EXPECT_EQ(expected_bitrate_bps, bitrate_observer_.last_bitrate_);
-  clock_.AdvanceTimeMilliseconds(1000);
-
-  // 5 packets reported as received since last, too few, no increase.
-  report_blocks.push_back(CreateReportBlock(1, 2, 0, 26));
-  bandwidth_observer_->OnReceivedRtcpReceiverReport(
-      report_blocks, 50, clock_.TimeInMilliseconds());
-  report_blocks.clear();
-  EXPECT_EQ(expected_bitrate_bps, bitrate_observer_.last_bitrate_);
-  clock_.AdvanceTimeMilliseconds(100);
-
-  // 15 packets reported as received since last, enough to increase.
-  report_blocks.push_back(CreateReportBlock(1, 2, 0, 41));
-  bandwidth_observer_->OnReceivedRtcpReceiverReport(
-      report_blocks, 50, clock_.TimeInMilliseconds());
-  expected_bitrate_bps = expected_bitrate_bps * 1.08 + 1000;
-  EXPECT_EQ(expected_bitrate_bps, bitrate_observer_.last_bitrate_);
-  clock_.AdvanceTimeMilliseconds(1000);
-}
diff --git a/modules/bitrate_controller/include/bitrate_controller.h b/modules/bitrate_controller/include/bitrate_controller.h
deleted file mode 100644
index f479e52..0000000
--- a/modules/bitrate_controller/include/bitrate_controller.h
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- *  Copyright (c) 2012 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.
- *
- *  Usage: this class will register multiple RtcpBitrateObserver's one at each
- *  RTCP module. It will aggregate the results and run one bandwidth estimation
- *  and push the result to the encoders via BitrateObserver(s).
- */
-
-#ifndef WEBRTC_MODULES_BITRATE_CONTROLLER_INCLUDE_BITRATE_CONTROLLER_H_
-#define WEBRTC_MODULES_BITRATE_CONTROLLER_INCLUDE_BITRATE_CONTROLLER_H_
-
-#include <map>
-
-#include "webrtc/modules/congestion_controller/delay_based_bwe.h"
-#include "webrtc/modules/include/module.h"
-#include "webrtc/modules/pacing/paced_sender.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
-
-namespace webrtc {
-
-class RtcEventLog;
-
-// Deprecated
-// TODO(perkj): Remove BitrateObserver when no implementations use it.
-class BitrateObserver {
-  // Observer class for bitrate changes announced due to change in bandwidth
-  // estimate or due to bitrate allocation changes. Fraction loss and rtt is
-  // also part of this callback to allow the obsevrer to optimize its settings
-  // for different types of network environments. The bitrate does not include
-  // packet headers and is measured in bits per second.
- public:
-  virtual void OnNetworkChanged(uint32_t bitrate_bps,
-                                uint8_t fraction_loss,  // 0 - 255.
-                                int64_t rtt_ms) = 0;
-  // TODO(gnish): Merge these two into one function.
-  virtual void OnNetworkChanged(uint32_t bitrate_for_encoder_bps,
-                                uint32_t bitrate_for_pacer_bps,
-                                bool in_probe_rtt,
-                                int64_t target_set_time,
-                                uint64_t congestion_window) {}
-  virtual void OnBytesAcked(size_t bytes) {}
-  virtual size_t pacer_queue_size_in_bytes() { return 0; }
-  virtual ~BitrateObserver() {}
-};
-
-class BitrateController : public Module, public RtcpBandwidthObserver {
-  // This class collects feedback from all streams sent to a peer (via
-  // RTCPBandwidthObservers). It does one  aggregated send side bandwidth
-  // estimation and divide the available bitrate between all its registered
-  // BitrateObservers.
- public:
-  static const int kDefaultStartBitratebps = 300000;
-
-  // Deprecated:
-  // TODO(perkj): BitrateObserver has been deprecated and is not used in WebRTC.
-  // Remove this method once other other projects does not use it.
-  static BitrateController* CreateBitrateController(const Clock* clock,
-                                                    BitrateObserver* observer,
-                                                    RtcEventLog* event_log);
-
-  static BitrateController* CreateBitrateController(const Clock* clock,
-                                                    RtcEventLog* event_log);
-
-  virtual ~BitrateController() {}
-
-  // Creates RtcpBandwidthObserver caller responsible to delete.
-  virtual RtcpBandwidthObserver* CreateRtcpBandwidthObserver() = 0;
-
-  // Deprecated
-  virtual void SetStartBitrate(int start_bitrate_bps) = 0;
-  // Deprecated
-  virtual void SetMinMaxBitrate(int min_bitrate_bps, int max_bitrate_bps) = 0;
-  virtual void SetBitrates(int start_bitrate_bps,
-                           int min_bitrate_bps,
-                           int max_bitrate_bps) = 0;
-
-  virtual void ResetBitrates(int bitrate_bps,
-                             int min_bitrate_bps,
-                             int max_bitrate_bps) = 0;
-
-  virtual void OnDelayBasedBweResult(const DelayBasedBwe::Result& result) = 0;
-
-  // Gets the available payload bandwidth in bits per second. Note that
-  // this bandwidth excludes packet headers.
-  virtual bool AvailableBandwidth(uint32_t* bandwidth) const = 0;
-
-  virtual void SetReservedBitrate(uint32_t reserved_bitrate_bps) = 0;
-
-  virtual bool GetNetworkParameters(uint32_t* bitrate,
-                                    uint8_t* fraction_loss,
-                                    int64_t* rtt) = 0;
-};
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_BITRATE_CONTROLLER_INCLUDE_BITRATE_CONTROLLER_H_
diff --git a/modules/bitrate_controller/include/mock/mock_bitrate_controller.h b/modules/bitrate_controller/include/mock/mock_bitrate_controller.h
deleted file mode 100644
index d4a12ec..0000000
--- a/modules/bitrate_controller/include/mock/mock_bitrate_controller.h
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- *  Copyright (c) 2015 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_BITRATE_CONTROLLER_INCLUDE_MOCK_MOCK_BITRATE_CONTROLLER_H_
-#define WEBRTC_MODULES_BITRATE_CONTROLLER_INCLUDE_MOCK_MOCK_BITRATE_CONTROLLER_H_
-
-#include "webrtc/modules/bitrate_controller/include/bitrate_controller.h"
-#include "webrtc/test/gmock.h"
-
-namespace webrtc {
-namespace test {
-
-class MockBitrateObserver : public BitrateObserver {
- public:
-  MOCK_METHOD3(OnNetworkChanged,
-               void(uint32_t bitrate_bps,
-                    uint8_t fraction_loss,
-                    int64_t rtt_ms));
-};
-
-class MockBitrateController : public BitrateController {
- public:
-  MOCK_METHOD0(CreateRtcpBandwidthObserver, RtcpBandwidthObserver*());
-  MOCK_METHOD1(SetStartBitrate, void(int start_bitrate_bps));
-  MOCK_METHOD2(SetMinMaxBitrate,
-               void(int min_bitrate_bps, int max_bitrate_bps));
-  MOCK_METHOD3(SetBitrates,
-               void(int start_bitrate_bps,
-                    int min_bitrate_bps,
-                    int max_bitrate_bps));
-  MOCK_METHOD3(ResetBitrates,
-               void(int bitrate_bps, int min_bitrate_bps, int max_bitrate_bps));
-  MOCK_METHOD1(UpdateDelayBasedEstimate, void(uint32_t bitrate_bps));
-  MOCK_METHOD1(UpdateProbeBitrate, void(uint32_t bitrate_bps));
-  MOCK_METHOD1(SetEventLog, void(RtcEventLog* event_log));
-  MOCK_CONST_METHOD1(AvailableBandwidth, bool(uint32_t* bandwidth));
-  MOCK_METHOD1(SetReservedBitrate, void(uint32_t reserved_bitrate_bps));
-  MOCK_METHOD3(GetNetworkParameters,
-               bool(uint32_t* bitrate, uint8_t* fraction_loss, int64_t* rtt));
-
-  MOCK_METHOD0(Process, void());
-  MOCK_METHOD0(TimeUntilNextProcess, int64_t());
-};
-}  // namespace test
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_BITRATE_CONTROLLER_INCLUDE_MOCK_MOCK_BITRATE_CONTROLLER_H_
diff --git a/modules/bitrate_controller/send_side_bandwidth_estimation.cc b/modules/bitrate_controller/send_side_bandwidth_estimation.cc
deleted file mode 100644
index 6def9ba..0000000
--- a/modules/bitrate_controller/send_side_bandwidth_estimation.cc
+++ /dev/null
@@ -1,422 +0,0 @@
-/*
- *  Copyright (c) 2012 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/bitrate_controller/send_side_bandwidth_estimation.h"
-
-#include <algorithm>
-#include <cmath>
-#include <limits>
-#include <string>
-
-#include "webrtc/logging/rtc_event_log/rtc_event_log.h"
-#include "webrtc/modules/remote_bitrate_estimator/include/bwe_defines.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/system_wrappers/include/field_trial.h"
-#include "webrtc/system_wrappers/include/metrics.h"
-
-namespace webrtc {
-namespace {
-const int64_t kBweIncreaseIntervalMs = 1000;
-const int64_t kBweDecreaseIntervalMs = 300;
-const int64_t kStartPhaseMs = 2000;
-const int64_t kBweConverganceTimeMs = 20000;
-const int kLimitNumPackets = 20;
-const int kDefaultMaxBitrateBps = 1000000000;
-const int64_t kLowBitrateLogPeriodMs = 10000;
-const int64_t kRtcEventLogPeriodMs = 5000;
-// Expecting that RTCP feedback is sent uniformly within [0.5, 1.5]s intervals.
-const int64_t kFeedbackIntervalMs = 5000;
-const int64_t kFeedbackTimeoutIntervals = 3;
-const int64_t kTimeoutIntervalMs = 1000;
-
-const float kDefaultLowLossThreshold = 0.02f;
-const float kDefaultHighLossThreshold = 0.1f;
-const int kDefaultBitrateThresholdKbps = 0;
-
-struct UmaRampUpMetric {
-  const char* metric_name;
-  int bitrate_kbps;
-};
-
-const UmaRampUpMetric kUmaRampupMetrics[] = {
-    {"WebRTC.BWE.RampUpTimeTo500kbpsInMs", 500},
-    {"WebRTC.BWE.RampUpTimeTo1000kbpsInMs", 1000},
-    {"WebRTC.BWE.RampUpTimeTo2000kbpsInMs", 2000}};
-const size_t kNumUmaRampupMetrics =
-    sizeof(kUmaRampupMetrics) / sizeof(kUmaRampupMetrics[0]);
-
-const char kBweLosExperiment[] = "WebRTC-BweLossExperiment";
-
-bool BweLossExperimentIsEnabled() {
-  std::string experiment_string =
-      webrtc::field_trial::FindFullName(kBweLosExperiment);
-  // The experiment is enabled iff the field trial string begins with "Enabled".
-  return experiment_string.find("Enabled") == 0;
-}
-
-bool ReadBweLossExperimentParameters(float* low_loss_threshold,
-                                     float* high_loss_threshold,
-                                     uint32_t* bitrate_threshold_kbps) {
-  RTC_DCHECK(low_loss_threshold);
-  RTC_DCHECK(high_loss_threshold);
-  RTC_DCHECK(bitrate_threshold_kbps);
-  std::string experiment_string =
-      webrtc::field_trial::FindFullName(kBweLosExperiment);
-  int parsed_values =
-      sscanf(experiment_string.c_str(), "Enabled-%f,%f,%u", low_loss_threshold,
-             high_loss_threshold, bitrate_threshold_kbps);
-  if (parsed_values == 3) {
-    RTC_CHECK_GT(*low_loss_threshold, 0.0f)
-        << "Loss threshold must be greater than 0.";
-    RTC_CHECK_LE(*low_loss_threshold, 1.0f)
-        << "Loss threshold must be less than or equal to 1.";
-    RTC_CHECK_GT(*high_loss_threshold, 0.0f)
-        << "Loss threshold must be greater than 0.";
-    RTC_CHECK_LE(*high_loss_threshold, 1.0f)
-        << "Loss threshold must be less than or equal to 1.";
-    RTC_CHECK_LE(*low_loss_threshold, *high_loss_threshold)
-        << "The low loss threshold must be less than or equal to the high loss "
-           "threshold.";
-    RTC_CHECK_GE(*bitrate_threshold_kbps, 0)
-        << "Bitrate threshold can't be negative.";
-    RTC_CHECK_LT(*bitrate_threshold_kbps,
-                 std::numeric_limits<int>::max() / 1000)
-        << "Bitrate must be smaller enough to avoid overflows.";
-    return true;
-  }
-  LOG(LS_WARNING) << "Failed to parse parameters for BweLossExperiment "
-                     "experiment from field trial string. Using default.";
-  *low_loss_threshold = kDefaultLowLossThreshold;
-  *high_loss_threshold = kDefaultHighLossThreshold;
-  *bitrate_threshold_kbps = kDefaultBitrateThresholdKbps;
-  return false;
-}
-}  // namespace
-
-SendSideBandwidthEstimation::SendSideBandwidthEstimation(RtcEventLog* event_log)
-    : lost_packets_since_last_loss_update_Q8_(0),
-      expected_packets_since_last_loss_update_(0),
-      current_bitrate_bps_(0),
-      min_bitrate_configured_(congestion_controller::GetMinBitrateBps()),
-      max_bitrate_configured_(kDefaultMaxBitrateBps),
-      last_low_bitrate_log_ms_(-1),
-      has_decreased_since_last_fraction_loss_(false),
-      last_feedback_ms_(-1),
-      last_packet_report_ms_(-1),
-      last_timeout_ms_(-1),
-      last_fraction_loss_(0),
-      last_logged_fraction_loss_(0),
-      last_round_trip_time_ms_(0),
-      bwe_incoming_(0),
-      delay_based_bitrate_bps_(0),
-      time_last_decrease_ms_(0),
-      first_report_time_ms_(-1),
-      initially_lost_packets_(0),
-      bitrate_at_2_seconds_kbps_(0),
-      uma_update_state_(kNoUpdate),
-      rampup_uma_stats_updated_(kNumUmaRampupMetrics, false),
-      event_log_(event_log),
-      last_rtc_event_log_ms_(-1),
-      in_timeout_experiment_(
-          webrtc::field_trial::IsEnabled("WebRTC-FeedbackTimeout")),
-      low_loss_threshold_(kDefaultLowLossThreshold),
-      high_loss_threshold_(kDefaultHighLossThreshold),
-      bitrate_threshold_bps_(1000 * kDefaultBitrateThresholdKbps) {
-  RTC_DCHECK(event_log);
-  if (BweLossExperimentIsEnabled()) {
-    uint32_t bitrate_threshold_kbps;
-    if (ReadBweLossExperimentParameters(&low_loss_threshold_,
-                                        &high_loss_threshold_,
-                                        &bitrate_threshold_kbps)) {
-      LOG(LS_INFO) << "Enabled BweLossExperiment with parameters "
-                   << low_loss_threshold_ << ", " << high_loss_threshold_
-                   << ", " << bitrate_threshold_kbps;
-      bitrate_threshold_bps_ = bitrate_threshold_kbps * 1000;
-    }
-  }
-}
-
-SendSideBandwidthEstimation::~SendSideBandwidthEstimation() {}
-
-void SendSideBandwidthEstimation::SetBitrates(int send_bitrate,
-                                              int min_bitrate,
-                                              int max_bitrate) {
-  SetMinMaxBitrate(min_bitrate, max_bitrate);
-  if (send_bitrate > 0)
-    SetSendBitrate(send_bitrate);
-}
-
-void SendSideBandwidthEstimation::SetSendBitrate(int bitrate) {
-  RTC_DCHECK_GT(bitrate, 0);
-  CapBitrateToThresholds(Clock::GetRealTimeClock()->TimeInMilliseconds(),
-                         bitrate);
-  // Clear last sent bitrate history so the new value can be used directly
-  // and not capped.
-  min_bitrate_history_.clear();
-}
-
-void SendSideBandwidthEstimation::SetMinMaxBitrate(int min_bitrate,
-                                                   int max_bitrate) {
-  RTC_DCHECK_GE(min_bitrate, 0);
-  min_bitrate_configured_ =
-      std::max(min_bitrate, congestion_controller::GetMinBitrateBps());
-  if (max_bitrate > 0) {
-    max_bitrate_configured_ =
-        std::max<uint32_t>(min_bitrate_configured_, max_bitrate);
-  } else {
-    max_bitrate_configured_ = kDefaultMaxBitrateBps;
-  }
-}
-
-int SendSideBandwidthEstimation::GetMinBitrate() const {
-  return min_bitrate_configured_;
-}
-
-void SendSideBandwidthEstimation::CurrentEstimate(int* bitrate,
-                                                  uint8_t* loss,
-                                                  int64_t* rtt) const {
-  *bitrate = current_bitrate_bps_;
-  *loss = last_fraction_loss_;
-  *rtt = last_round_trip_time_ms_;
-}
-
-void SendSideBandwidthEstimation::UpdateReceiverEstimate(
-    int64_t now_ms, uint32_t bandwidth) {
-  bwe_incoming_ = bandwidth;
-  CapBitrateToThresholds(now_ms, current_bitrate_bps_);
-}
-
-void SendSideBandwidthEstimation::UpdateDelayBasedEstimate(
-    int64_t now_ms,
-    uint32_t bitrate_bps) {
-  delay_based_bitrate_bps_ = bitrate_bps;
-  CapBitrateToThresholds(now_ms, current_bitrate_bps_);
-}
-
-void SendSideBandwidthEstimation::UpdateReceiverBlock(uint8_t fraction_loss,
-                                                      int64_t rtt,
-                                                      int number_of_packets,
-                                                      int64_t now_ms) {
-  last_feedback_ms_ = now_ms;
-  if (first_report_time_ms_ == -1)
-    first_report_time_ms_ = now_ms;
-
-  // Update RTT if we were able to compute an RTT based on this RTCP.
-  // FlexFEC doesn't send RTCP SR, which means we won't be able to compute RTT.
-  if (rtt > 0)
-    last_round_trip_time_ms_ = rtt;
-
-  // Check sequence number diff and weight loss report
-  if (number_of_packets > 0) {
-    // Calculate number of lost packets.
-    const int num_lost_packets_Q8 = fraction_loss * number_of_packets;
-    // Accumulate reports.
-    lost_packets_since_last_loss_update_Q8_ += num_lost_packets_Q8;
-    expected_packets_since_last_loss_update_ += number_of_packets;
-
-    // Don't generate a loss rate until it can be based on enough packets.
-    if (expected_packets_since_last_loss_update_ < kLimitNumPackets)
-      return;
-
-    has_decreased_since_last_fraction_loss_ = false;
-    last_fraction_loss_ = lost_packets_since_last_loss_update_Q8_ /
-                          expected_packets_since_last_loss_update_;
-
-    // Reset accumulators.
-    lost_packets_since_last_loss_update_Q8_ = 0;
-    expected_packets_since_last_loss_update_ = 0;
-    last_packet_report_ms_ = now_ms;
-    UpdateEstimate(now_ms);
-  }
-  UpdateUmaStats(now_ms, rtt, (fraction_loss * number_of_packets) >> 8);
-}
-
-void SendSideBandwidthEstimation::UpdateUmaStats(int64_t now_ms,
-                                                 int64_t rtt,
-                                                 int lost_packets) {
-  int bitrate_kbps = static_cast<int>((current_bitrate_bps_ + 500) / 1000);
-  for (size_t i = 0; i < kNumUmaRampupMetrics; ++i) {
-    if (!rampup_uma_stats_updated_[i] &&
-        bitrate_kbps >= kUmaRampupMetrics[i].bitrate_kbps) {
-      RTC_HISTOGRAMS_COUNTS_100000(i, kUmaRampupMetrics[i].metric_name,
-                                   now_ms - first_report_time_ms_);
-      rampup_uma_stats_updated_[i] = true;
-    }
-  }
-  if (IsInStartPhase(now_ms)) {
-    initially_lost_packets_ += lost_packets;
-  } else if (uma_update_state_ == kNoUpdate) {
-    uma_update_state_ = kFirstDone;
-    bitrate_at_2_seconds_kbps_ = bitrate_kbps;
-    RTC_HISTOGRAM_COUNTS("WebRTC.BWE.InitiallyLostPackets",
-                         initially_lost_packets_, 0, 100, 50);
-    RTC_HISTOGRAM_COUNTS("WebRTC.BWE.InitialRtt", static_cast<int>(rtt), 0,
-                         2000, 50);
-    RTC_HISTOGRAM_COUNTS("WebRTC.BWE.InitialBandwidthEstimate",
-                         bitrate_at_2_seconds_kbps_, 0, 2000, 50);
-  } else if (uma_update_state_ == kFirstDone &&
-             now_ms - first_report_time_ms_ >= kBweConverganceTimeMs) {
-    uma_update_state_ = kDone;
-    int bitrate_diff_kbps =
-        std::max(bitrate_at_2_seconds_kbps_ - bitrate_kbps, 0);
-    RTC_HISTOGRAM_COUNTS("WebRTC.BWE.InitialVsConvergedDiff", bitrate_diff_kbps,
-                         0, 2000, 50);
-  }
-}
-
-void SendSideBandwidthEstimation::UpdateEstimate(int64_t now_ms) {
-  uint32_t new_bitrate = current_bitrate_bps_;
-  // We trust the REMB and/or delay-based estimate during the first 2 seconds if
-  // we haven't had any packet loss reported, to allow startup bitrate probing.
-  if (last_fraction_loss_ == 0 && IsInStartPhase(now_ms)) {
-    new_bitrate = std::max(bwe_incoming_, new_bitrate);
-    new_bitrate = std::max(delay_based_bitrate_bps_, new_bitrate);
-
-    if (new_bitrate != current_bitrate_bps_) {
-      min_bitrate_history_.clear();
-      min_bitrate_history_.push_back(
-          std::make_pair(now_ms, current_bitrate_bps_));
-      CapBitrateToThresholds(now_ms, new_bitrate);
-      return;
-    }
-  }
-  UpdateMinHistory(now_ms);
-  if (last_packet_report_ms_ == -1) {
-    // No feedback received.
-    CapBitrateToThresholds(now_ms, current_bitrate_bps_);
-    return;
-  }
-  int64_t time_since_packet_report_ms = now_ms - last_packet_report_ms_;
-  int64_t time_since_feedback_ms = now_ms - last_feedback_ms_;
-  if (time_since_packet_report_ms < 1.2 * kFeedbackIntervalMs) {
-    // We only care about loss above a given bitrate threshold.
-    float loss = last_fraction_loss_ / 256.0f;
-    // We only make decisions based on loss when the bitrate is above a
-    // threshold. This is a crude way of handling loss which is uncorrelated
-    // to congestion.
-    if (current_bitrate_bps_ < bitrate_threshold_bps_ ||
-        loss <= low_loss_threshold_) {
-      // Loss < 2%: Increase rate by 8% of the min bitrate in the last
-      // kBweIncreaseIntervalMs.
-      // Note that by remembering the bitrate over the last second one can
-      // rampup up one second faster than if only allowed to start ramping
-      // at 8% per second rate now. E.g.:
-      //   If sending a constant 100kbps it can rampup immediatly to 108kbps
-      //   whenever a receiver report is received with lower packet loss.
-      //   If instead one would do: current_bitrate_bps_ *= 1.08^(delta time),
-      //   it would take over one second since the lower packet loss to achieve
-      //   108kbps.
-      new_bitrate = static_cast<uint32_t>(
-          min_bitrate_history_.front().second * 1.08 + 0.5);
-
-      // Add 1 kbps extra, just to make sure that we do not get stuck
-      // (gives a little extra increase at low rates, negligible at higher
-      // rates).
-      new_bitrate += 1000;
-    } else if (current_bitrate_bps_ > bitrate_threshold_bps_) {
-      if (loss <= high_loss_threshold_) {
-        // Loss between 2% - 10%: Do nothing.
-      } else {
-        // Loss > 10%: Limit the rate decreases to once a kBweDecreaseIntervalMs
-        // + rtt.
-        if (!has_decreased_since_last_fraction_loss_ &&
-            (now_ms - time_last_decrease_ms_) >=
-                (kBweDecreaseIntervalMs + last_round_trip_time_ms_)) {
-          time_last_decrease_ms_ = now_ms;
-
-          // Reduce rate:
-          //   newRate = rate * (1 - 0.5*lossRate);
-          //   where packetLoss = 256*lossRate;
-          new_bitrate = static_cast<uint32_t>(
-              (current_bitrate_bps_ *
-               static_cast<double>(512 - last_fraction_loss_)) /
-              512.0);
-          has_decreased_since_last_fraction_loss_ = true;
-        }
-      }
-    }
-  } else if (time_since_feedback_ms >
-                 kFeedbackTimeoutIntervals * kFeedbackIntervalMs &&
-             (last_timeout_ms_ == -1 ||
-              now_ms - last_timeout_ms_ > kTimeoutIntervalMs)) {
-    if (in_timeout_experiment_) {
-      LOG(LS_WARNING) << "Feedback timed out (" << time_since_feedback_ms
-                      << " ms), reducing bitrate.";
-      new_bitrate *= 0.8;
-      // Reset accumulators since we've already acted on missing feedback and
-      // shouldn't to act again on these old lost packets.
-      lost_packets_since_last_loss_update_Q8_ = 0;
-      expected_packets_since_last_loss_update_ = 0;
-      last_timeout_ms_ = now_ms;
-    }
-  }
-
-  CapBitrateToThresholds(now_ms, new_bitrate);
-}
-
-bool SendSideBandwidthEstimation::IsInStartPhase(int64_t now_ms) const {
-  return first_report_time_ms_ == -1 ||
-         now_ms - first_report_time_ms_ < kStartPhaseMs;
-}
-
-void SendSideBandwidthEstimation::UpdateMinHistory(int64_t now_ms) {
-  // Remove old data points from history.
-  // Since history precision is in ms, add one so it is able to increase
-  // bitrate if it is off by as little as 0.5ms.
-  while (!min_bitrate_history_.empty() &&
-         now_ms - min_bitrate_history_.front().first + 1 >
-             kBweIncreaseIntervalMs) {
-    min_bitrate_history_.pop_front();
-  }
-
-  // Typical minimum sliding-window algorithm: Pop values higher than current
-  // bitrate before pushing it.
-  while (!min_bitrate_history_.empty() &&
-         current_bitrate_bps_ <= min_bitrate_history_.back().second) {
-    min_bitrate_history_.pop_back();
-  }
-
-  min_bitrate_history_.push_back(std::make_pair(now_ms, current_bitrate_bps_));
-}
-
-void SendSideBandwidthEstimation::CapBitrateToThresholds(int64_t now_ms,
-                                                         uint32_t bitrate_bps) {
-  if (bwe_incoming_ > 0 && bitrate_bps > bwe_incoming_) {
-    bitrate_bps = bwe_incoming_;
-  }
-  if (delay_based_bitrate_bps_ > 0 && bitrate_bps > delay_based_bitrate_bps_) {
-    bitrate_bps = delay_based_bitrate_bps_;
-  }
-  if (bitrate_bps > max_bitrate_configured_) {
-    bitrate_bps = max_bitrate_configured_;
-  }
-  if (bitrate_bps < min_bitrate_configured_) {
-    if (last_low_bitrate_log_ms_ == -1 ||
-        now_ms - last_low_bitrate_log_ms_ > kLowBitrateLogPeriodMs) {
-      LOG(LS_WARNING) << "Estimated available bandwidth " << bitrate_bps / 1000
-                      << " kbps is below configured min bitrate "
-                      << min_bitrate_configured_ / 1000 << " kbps.";
-      last_low_bitrate_log_ms_ = now_ms;
-    }
-    bitrate_bps = min_bitrate_configured_;
-  }
-
-  if (bitrate_bps != current_bitrate_bps_ ||
-      last_fraction_loss_ != last_logged_fraction_loss_ ||
-      now_ms - last_rtc_event_log_ms_ > kRtcEventLogPeriodMs) {
-    event_log_->LogLossBasedBweUpdate(bitrate_bps, last_fraction_loss_,
-                                      expected_packets_since_last_loss_update_);
-    last_logged_fraction_loss_ = last_fraction_loss_;
-    last_rtc_event_log_ms_ = now_ms;
-  }
-  current_bitrate_bps_ = bitrate_bps;
-}
-}  // namespace webrtc
diff --git a/modules/bitrate_controller/send_side_bandwidth_estimation.h b/modules/bitrate_controller/send_side_bandwidth_estimation.h
deleted file mode 100644
index 27df7e5..0000000
--- a/modules/bitrate_controller/send_side_bandwidth_estimation.h
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- *  Copyright (c) 2012 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.
- *
- *  FEC and NACK added bitrate is handled outside class
- */
-
-#ifndef WEBRTC_MODULES_BITRATE_CONTROLLER_SEND_SIDE_BANDWIDTH_ESTIMATION_H_
-#define WEBRTC_MODULES_BITRATE_CONTROLLER_SEND_SIDE_BANDWIDTH_ESTIMATION_H_
-
-#include <deque>
-#include <utility>
-#include <vector>
-
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
-
-namespace webrtc {
-
-class RtcEventLog;
-
-class SendSideBandwidthEstimation {
- public:
-  SendSideBandwidthEstimation() = delete;
-  explicit SendSideBandwidthEstimation(RtcEventLog* event_log);
-  virtual ~SendSideBandwidthEstimation();
-
-  void CurrentEstimate(int* bitrate, uint8_t* loss, int64_t* rtt) const;
-
-  // Call periodically to update estimate.
-  void UpdateEstimate(int64_t now_ms);
-
-  // Call when we receive a RTCP message with TMMBR or REMB.
-  void UpdateReceiverEstimate(int64_t now_ms, uint32_t bandwidth);
-
-  // Call when a new delay-based estimate is available.
-  void UpdateDelayBasedEstimate(int64_t now_ms, uint32_t bitrate_bps);
-
-  // Call when we receive a RTCP message with a ReceiveBlock.
-  void UpdateReceiverBlock(uint8_t fraction_loss,
-                           int64_t rtt,
-                           int number_of_packets,
-                           int64_t now_ms);
-
-  void SetBitrates(int send_bitrate,
-                   int min_bitrate,
-                   int max_bitrate);
-  void SetSendBitrate(int bitrate);
-  void SetMinMaxBitrate(int min_bitrate, int max_bitrate);
-  int GetMinBitrate() const;
-
- private:
-  enum UmaState { kNoUpdate, kFirstDone, kDone };
-
-  bool IsInStartPhase(int64_t now_ms) const;
-
-  void UpdateUmaStats(int64_t now_ms, int64_t rtt, int lost_packets);
-
-  // Updates history of min bitrates.
-  // After this method returns min_bitrate_history_.front().second contains the
-  // min bitrate used during last kBweIncreaseIntervalMs.
-  void UpdateMinHistory(int64_t now_ms);
-
-  // Cap |bitrate_bps| to [min_bitrate_configured_, max_bitrate_configured_] and
-  // set |current_bitrate_bps_| to the capped value and updates the event log.
-  void CapBitrateToThresholds(int64_t now_ms, uint32_t bitrate_bps);
-
-  std::deque<std::pair<int64_t, uint32_t> > min_bitrate_history_;
-
-  // incoming filters
-  int lost_packets_since_last_loss_update_Q8_;
-  int expected_packets_since_last_loss_update_;
-
-  uint32_t current_bitrate_bps_;
-  uint32_t min_bitrate_configured_;
-  uint32_t max_bitrate_configured_;
-  int64_t last_low_bitrate_log_ms_;
-
-  bool has_decreased_since_last_fraction_loss_;
-  int64_t last_feedback_ms_;
-  int64_t last_packet_report_ms_;
-  int64_t last_timeout_ms_;
-  uint8_t last_fraction_loss_;
-  uint8_t last_logged_fraction_loss_;
-  int64_t last_round_trip_time_ms_;
-
-  uint32_t bwe_incoming_;
-  uint32_t delay_based_bitrate_bps_;
-  int64_t time_last_decrease_ms_;
-  int64_t first_report_time_ms_;
-  int initially_lost_packets_;
-  int bitrate_at_2_seconds_kbps_;
-  UmaState uma_update_state_;
-  std::vector<bool> rampup_uma_stats_updated_;
-  RtcEventLog* event_log_;
-  int64_t last_rtc_event_log_ms_;
-  bool in_timeout_experiment_;
-  float low_loss_threshold_;
-  float high_loss_threshold_;
-  uint32_t bitrate_threshold_bps_;
-};
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_BITRATE_CONTROLLER_SEND_SIDE_BANDWIDTH_ESTIMATION_H_
diff --git a/modules/bitrate_controller/send_side_bandwidth_estimation_unittest.cc b/modules/bitrate_controller/send_side_bandwidth_estimation_unittest.cc
deleted file mode 100644
index c4aa435..0000000
--- a/modules/bitrate_controller/send_side_bandwidth_estimation_unittest.cc
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- *  Copyright (c) 2014 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 <algorithm>
-#include <vector>
-
-#include "webrtc/logging/rtc_event_log/mock/mock_rtc_event_log.h"
-#include "webrtc/modules/bitrate_controller/send_side_bandwidth_estimation.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-void TestProbing(bool use_delay_based) {
-  MockRtcEventLog event_log;
-  SendSideBandwidthEstimation bwe(&event_log);
-  bwe.SetMinMaxBitrate(100000, 1500000);
-  bwe.SetSendBitrate(200000);
-
-  const int kRembBps = 1000000;
-  const int kSecondRembBps = kRembBps + 500000;
-  int64_t now_ms = 0;
-
-  bwe.UpdateReceiverBlock(0, 50, 1, now_ms);
-
-  // Initial REMB applies immediately.
-  if (use_delay_based) {
-    bwe.UpdateDelayBasedEstimate(now_ms, kRembBps);
-  } else {
-    bwe.UpdateReceiverEstimate(now_ms, kRembBps);
-  }
-  bwe.UpdateEstimate(now_ms);
-  int bitrate;
-  uint8_t fraction_loss;
-  int64_t rtt;
-  bwe.CurrentEstimate(&bitrate, &fraction_loss, &rtt);
-  EXPECT_EQ(kRembBps, bitrate);
-
-  // Second REMB doesn't apply immediately.
-  now_ms += 2001;
-  if (use_delay_based) {
-    bwe.UpdateDelayBasedEstimate(now_ms, kSecondRembBps);
-  } else {
-    bwe.UpdateReceiverEstimate(now_ms, kSecondRembBps);
-  }
-  bwe.UpdateEstimate(now_ms);
-  bitrate = 0;
-  bwe.CurrentEstimate(&bitrate, &fraction_loss, &rtt);
-  EXPECT_EQ(kRembBps, bitrate);
-}
-
-TEST(SendSideBweTest, InitialRembWithProbing) {
-  TestProbing(false);
-}
-
-TEST(SendSideBweTest, InitialDelayBasedBweWithProbing) {
-  TestProbing(true);
-}
-
-TEST(SendSideBweTest, DoesntReapplyBitrateDecreaseWithoutFollowingRemb) {
-  MockRtcEventLog event_log;
-  EXPECT_CALL(event_log, LogLossBasedBweUpdate(testing::Gt(0), 0, 0)).Times(1);
-  EXPECT_CALL(event_log,
-              LogLossBasedBweUpdate(testing::Gt(0), testing::Gt(0), 0))
-      .Times(2);
-  SendSideBandwidthEstimation bwe(&event_log);
-  static const int kMinBitrateBps = 100000;
-  static const int kInitialBitrateBps = 1000000;
-  bwe.SetMinMaxBitrate(kMinBitrateBps, 1500000);
-  bwe.SetSendBitrate(kInitialBitrateBps);
-
-  static const uint8_t kFractionLoss = 128;
-  static const int64_t kRttMs = 50;
-
-  int64_t now_ms = 0;
-  int bitrate_bps;
-  uint8_t fraction_loss;
-  int64_t rtt_ms;
-  bwe.CurrentEstimate(&bitrate_bps, &fraction_loss, &rtt_ms);
-  EXPECT_EQ(kInitialBitrateBps, bitrate_bps);
-  EXPECT_EQ(0, fraction_loss);
-  EXPECT_EQ(0, rtt_ms);
-
-  // Signal heavy loss to go down in bitrate.
-  bwe.UpdateReceiverBlock(kFractionLoss, kRttMs, 100, now_ms);
-  // Trigger an update 2 seconds later to not be rate limited.
-  now_ms += 1000;
-  bwe.UpdateEstimate(now_ms);
-
-  bwe.CurrentEstimate(&bitrate_bps, &fraction_loss, &rtt_ms);
-  EXPECT_LT(bitrate_bps, kInitialBitrateBps);
-  // Verify that the obtained bitrate isn't hitting the min bitrate, or this
-  // test doesn't make sense. If this ever happens, update the thresholds or
-  // loss rates so that it doesn't hit min bitrate after one bitrate update.
-  EXPECT_GT(bitrate_bps, kMinBitrateBps);
-  EXPECT_EQ(kFractionLoss, fraction_loss);
-  EXPECT_EQ(kRttMs, rtt_ms);
-
-  // Triggering an update shouldn't apply further downgrade nor upgrade since
-  // there's no intermediate receiver block received indicating whether this is
-  // currently good or not.
-  int last_bitrate_bps = bitrate_bps;
-  // Trigger an update 2 seconds later to not be rate limited (but it still
-  // shouldn't update).
-  now_ms += 1000;
-  bwe.UpdateEstimate(now_ms);
-  bwe.CurrentEstimate(&bitrate_bps, &fraction_loss, &rtt_ms);
-
-  EXPECT_EQ(last_bitrate_bps, bitrate_bps);
-  // The old loss rate should still be applied though.
-  EXPECT_EQ(kFractionLoss, fraction_loss);
-  EXPECT_EQ(kRttMs, rtt_ms);
-}
-
-}  // namespace webrtc
diff --git a/modules/congestion_controller/BUILD.gn b/modules/congestion_controller/BUILD.gn
deleted file mode 100644
index be0afd2..0000000
--- a/modules/congestion_controller/BUILD.gn
+++ /dev/null
@@ -1,124 +0,0 @@
-# Copyright (c) 2014 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.
-
-import("../../webrtc.gni")
-
-rtc_static_library("congestion_controller") {
-  sources = [
-    "acknowledged_bitrate_estimator.cc",
-    "acknowledged_bitrate_estimator.h",
-    "bitrate_estimator.cc",
-    "bitrate_estimator.h",
-    "delay_based_bwe.cc",
-    "delay_based_bwe.h",
-    "include/receive_side_congestion_controller.h",
-    "include/send_side_congestion_controller.h",
-    "median_slope_estimator.cc",
-    "median_slope_estimator.h",
-    "probe_bitrate_estimator.cc",
-    "probe_bitrate_estimator.h",
-    "probe_controller.cc",
-    "probe_controller.h",
-    "receive_side_congestion_controller.cc",
-    "send_side_congestion_controller.cc",
-    "transport_feedback_adapter.cc",
-    "transport_feedback_adapter.h",
-    "trendline_estimator.cc",
-    "trendline_estimator.h",
-  ]
-
-  if (rtc_enable_bwe_test_logging) {
-    defines = [ "BWE_TEST_LOGGING_COMPILE_TIME_ENABLE=1" ]
-  } else {
-    defines = [ "BWE_TEST_LOGGING_COMPILE_TIME_ENABLE=0" ]
-  }
-
-  # TODO(jschuh): Bug 1348: fix this warning.
-  configs += [ "//build/config/compiler:no_size_t_to_int_warning" ]
-
-  if (!build_with_chromium && is_clang) {
-    # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-    suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-  }
-
-  deps = [
-    "..:module_api",
-    "../..:webrtc_common",
-    "../../api:optional",
-    "../../logging:rtc_event_log_api",
-    "../../rtc_base:rtc_base",
-    "../../rtc_base:rtc_base_approved",
-    "../../rtc_base:rtc_numerics",
-    "../../system_wrappers",
-    "../bitrate_controller",
-    "../pacing",
-    "../remote_bitrate_estimator",
-    "../rtp_rtcp",
-    "../utility",
-  ]
-}
-
-if (rtc_include_tests) {
-  rtc_source_set("congestion_controller_unittests") {
-    testonly = true
-
-    # Skip restricting visibility on mobile platforms since the tests on those
-    # gets additional generated targets which would require many lines here to
-    # cover (which would be confusing to read and hard to maintain).
-    if (!is_android && !is_ios) {
-      visibility = [ "..:modules_unittests" ]
-    }
-    sources = [
-      "acknowledged_bitrate_estimator_unittest.cc",
-      "congestion_controller_unittests_helper.cc",
-      "congestion_controller_unittests_helper.h",
-      "delay_based_bwe_unittest.cc",
-      "delay_based_bwe_unittest_helper.cc",
-      "delay_based_bwe_unittest_helper.h",
-      "median_slope_estimator_unittest.cc",
-      "probe_bitrate_estimator_unittest.cc",
-      "probe_controller_unittest.cc",
-      "receive_side_congestion_controller_unittest.cc",
-      "send_side_congestion_controller_unittest.cc",
-      "transport_feedback_adapter_unittest.cc",
-      "trendline_estimator_unittest.cc",
-    ]
-    deps = [
-      ":congestion_controller",
-      ":mock_congestion_controller",
-      "../../rtc_base:rtc_base",
-      "../../rtc_base:rtc_base_approved",
-      "../../rtc_base:rtc_base_tests_utils",
-      "../../system_wrappers:system_wrappers",
-      "../../test:field_trial",
-      "../../test:test_support",
-      "../bitrate_controller:bitrate_controller",
-      "../pacing:mock_paced_sender",
-      "../pacing:pacing",
-      "../remote_bitrate_estimator:remote_bitrate_estimator",
-      "../rtp_rtcp:rtp_rtcp",
-      "//testing/gmock",
-    ]
-    if (!build_with_chromium && is_clang) {
-      # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-    }
-  }
-
-  rtc_source_set("mock_congestion_controller") {
-    testonly = true
-    sources = [
-      "include/mock/mock_congestion_observer.h",
-      "include/mock/mock_send_side_congestion_controller.h",
-    ]
-    deps = [
-      ":congestion_controller",
-      "../../test:test_support",
-    ]
-  }
-}
diff --git a/modules/congestion_controller/DEPS b/modules/congestion_controller/DEPS
deleted file mode 100644
index 1bff845..0000000
--- a/modules/congestion_controller/DEPS
+++ /dev/null
@@ -1,5 +0,0 @@
-include_rules = [
-  "+webrtc/logging/rtc_event_log",
-  "+webrtc/system_wrappers",
-  "+webrtc/video",
-]
diff --git a/modules/congestion_controller/OWNERS b/modules/congestion_controller/OWNERS
deleted file mode 100644
index 0a94c47..0000000
--- a/modules/congestion_controller/OWNERS
+++ /dev/null
@@ -1,9 +0,0 @@
-stefan@webrtc.org
-terelius@webrtc.org
-philipel@webrtc.org
-mflodman@webrtc.org
-
-# These are for the common case of adding or renaming files. If you're doing
-# structural changes, please get a review from a reviewer in this file.
-per-file *.gn=*
-per-file *.gni=*
diff --git a/modules/congestion_controller/acknowledged_bitrate_estimator.cc b/modules/congestion_controller/acknowledged_bitrate_estimator.cc
deleted file mode 100644
index b150734..0000000
--- a/modules/congestion_controller/acknowledged_bitrate_estimator.cc
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- *  Copyright (c) 2017 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/congestion_controller/acknowledged_bitrate_estimator.h"
-
-#include <utility>
-
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
-#include "webrtc/rtc_base/ptr_util.h"
-
-namespace webrtc {
-
-namespace {
-bool IsInSendTimeHistory(const PacketFeedback& packet) {
-  return packet.send_time_ms >= 0;
-}
-}  // namespace
-
-AcknowledgedBitrateEstimator::AcknowledgedBitrateEstimator()
-    : AcknowledgedBitrateEstimator(rtc::MakeUnique<BitrateEstimator>()) {}
-
-AcknowledgedBitrateEstimator::AcknowledgedBitrateEstimator(
-    std::unique_ptr<BitrateEstimator> bitrate_estimator)
-    : bitrate_estimator_(std::move(bitrate_estimator)) {}
-
-void AcknowledgedBitrateEstimator::IncomingPacketFeedbackVector(
-    const std::vector<PacketFeedback>& packet_feedback_vector) {
-  RTC_DCHECK(std::is_sorted(packet_feedback_vector.begin(),
-                            packet_feedback_vector.end(),
-                            PacketFeedbackComparator()));
-  for (const auto& packet : packet_feedback_vector) {
-    if (IsInSendTimeHistory(packet)) {
-      MaybeExpectFastRateChange(packet.send_time_ms);
-      bitrate_estimator_->Update(packet.arrival_time_ms, packet.payload_size);
-    }
-  }
-}
-
-rtc::Optional<uint32_t> AcknowledgedBitrateEstimator::bitrate_bps() const {
-  return bitrate_estimator_->bitrate_bps();
-}
-
-void AcknowledgedBitrateEstimator::SetAlrEndedTimeMs(
-    int64_t alr_ended_time_ms) {
-  alr_ended_time_ms_.emplace(alr_ended_time_ms);
-}
-
-void AcknowledgedBitrateEstimator::MaybeExpectFastRateChange(
-    int64_t packet_send_time_ms) {
-  if (alr_ended_time_ms_ && packet_send_time_ms > *alr_ended_time_ms_) {
-    bitrate_estimator_->ExpectFastRateChange();
-    alr_ended_time_ms_.reset();
-  }
-}
-
-}  // namespace webrtc
diff --git a/modules/congestion_controller/acknowledged_bitrate_estimator.h b/modules/congestion_controller/acknowledged_bitrate_estimator.h
deleted file mode 100644
index 491acb6..0000000
--- a/modules/congestion_controller/acknowledged_bitrate_estimator.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- *  Copyright (c) 2017 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_CONGESTION_CONTROLLER_ACKNOWLEDGED_BITRATE_ESTIMATOR_H_
-#define WEBRTC_MODULES_CONGESTION_CONTROLLER_ACKNOWLEDGED_BITRATE_ESTIMATOR_H_
-
-#include <memory>
-#include <vector>
-
-#include "webrtc/api/optional.h"
-#include "webrtc/modules/congestion_controller/bitrate_estimator.h"
-
-namespace webrtc {
-
-struct PacketFeedback;
-
-class AcknowledgedBitrateEstimator {
- public:
-  explicit AcknowledgedBitrateEstimator(
-      std::unique_ptr<BitrateEstimator> bitrate_estimator);
-
-  AcknowledgedBitrateEstimator();
-
-  void IncomingPacketFeedbackVector(
-      const std::vector<PacketFeedback>& packet_feedback_vector);
-  rtc::Optional<uint32_t> bitrate_bps() const;
-  void SetAlrEndedTimeMs(int64_t alr_ended_time_ms);
-
- private:
-  void MaybeExpectFastRateChange(int64_t packet_arrival_time_ms);
-  rtc::Optional<int64_t> alr_ended_time_ms_;
-  std::unique_ptr<BitrateEstimator> bitrate_estimator_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_CONGESTION_CONTROLLER_ACKNOWLEDGED_BITRATE_ESTIMATOR_H_
diff --git a/modules/congestion_controller/acknowledged_bitrate_estimator_unittest.cc b/modules/congestion_controller/acknowledged_bitrate_estimator_unittest.cc
deleted file mode 100644
index 70ce0c1..0000000
--- a/modules/congestion_controller/acknowledged_bitrate_estimator_unittest.cc
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- *  Copyright (c) 2017 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/congestion_controller/acknowledged_bitrate_estimator.h"
-
-#include <utility>
-
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
-#include "webrtc/rtc_base/fakeclock.h"
-#include "webrtc/rtc_base/ptr_util.h"
-#include "webrtc/test/gmock.h"
-#include "webrtc/test/gtest.h"
-
-using testing::_;
-using testing::NiceMock;
-using testing::InSequence;
-using testing::Return;
-
-namespace webrtc {
-
-namespace {
-
-constexpr int64_t kFirstArrivalTimeMs = 10;
-constexpr int64_t kFirstSendTimeMs = 10;
-constexpr uint16_t kSequenceNumber = 1;
-constexpr size_t kPayloadSize = 10;
-
-class MockBitrateEstimator : public BitrateEstimator {
- public:
-  MOCK_METHOD2(Update, void(int64_t now_ms, int bytes));
-  MOCK_CONST_METHOD0(bitrate_bps, rtc::Optional<uint32_t>());
-  MOCK_METHOD0(ExpectFastRateChange, void());
-};
-
-struct AcknowledgedBitrateEstimatorTestStates {
-  std::unique_ptr<AcknowledgedBitrateEstimator> acknowledged_bitrate_estimator;
-  MockBitrateEstimator* mock_bitrate_estimator;
-};
-
-AcknowledgedBitrateEstimatorTestStates CreateTestStates() {
-  AcknowledgedBitrateEstimatorTestStates states;
-  auto mock_bitrate_estimator = rtc::MakeUnique<MockBitrateEstimator>();
-  states.mock_bitrate_estimator = mock_bitrate_estimator.get();
-  states.acknowledged_bitrate_estimator =
-      rtc::MakeUnique<AcknowledgedBitrateEstimator>(
-          std::move(mock_bitrate_estimator));
-  return states;
-}
-
-std::vector<PacketFeedback> CreateFeedbackVector() {
-  std::vector<PacketFeedback> packet_feedback_vector;
-  const PacedPacketInfo pacing_info;
-  packet_feedback_vector.push_back(
-      PacketFeedback(kFirstArrivalTimeMs, kFirstSendTimeMs, kSequenceNumber,
-                     kPayloadSize, pacing_info));
-  packet_feedback_vector.push_back(
-      PacketFeedback(kFirstArrivalTimeMs + 10, kFirstSendTimeMs + 10,
-                     kSequenceNumber, kPayloadSize + 10, pacing_info));
-  return packet_feedback_vector;
-}
-
-}  // anonymous namespace
-
-TEST(TestAcknowledgedBitrateEstimator, DontAddPacketsWhichAreNotInSendHistory) {
-  auto states = CreateTestStates();
-  std::vector<PacketFeedback> packet_feedback_vector;
-  packet_feedback_vector.push_back(
-      PacketFeedback(kFirstArrivalTimeMs, kSequenceNumber));
-  EXPECT_CALL(*states.mock_bitrate_estimator, Update(_, _)).Times(0);
-  states.acknowledged_bitrate_estimator->IncomingPacketFeedbackVector(
-      packet_feedback_vector);
-}
-
-TEST(TestAcknowledgedBitrateEstimator, UpdateBandwith) {
-  auto states = CreateTestStates();
-  auto packet_feedback_vector = CreateFeedbackVector();
-  {
-    InSequence dummy;
-    EXPECT_CALL(
-        *states.mock_bitrate_estimator,
-        Update(packet_feedback_vector[0].arrival_time_ms,
-               static_cast<int>(packet_feedback_vector[0].payload_size)))
-        .Times(1);
-    EXPECT_CALL(
-        *states.mock_bitrate_estimator,
-        Update(packet_feedback_vector[1].arrival_time_ms,
-               static_cast<int>(packet_feedback_vector[1].payload_size)))
-        .Times(1);
-  }
-  states.acknowledged_bitrate_estimator->IncomingPacketFeedbackVector(
-      packet_feedback_vector);
-}
-
-TEST(TestAcknowledgedBitrateEstimator, ExpectFastRateChangeWhenLeftAlr) {
-  auto states = CreateTestStates();
-  auto packet_feedback_vector = CreateFeedbackVector();
-  {
-    InSequence dummy;
-    EXPECT_CALL(
-        *states.mock_bitrate_estimator,
-        Update(packet_feedback_vector[0].arrival_time_ms,
-               static_cast<int>(packet_feedback_vector[0].payload_size)))
-        .Times(1);
-    EXPECT_CALL(*states.mock_bitrate_estimator, ExpectFastRateChange())
-        .Times(1);
-    EXPECT_CALL(
-        *states.mock_bitrate_estimator,
-        Update(packet_feedback_vector[1].arrival_time_ms,
-               static_cast<int>(packet_feedback_vector[1].payload_size)))
-        .Times(1);
-  }
-  states.acknowledged_bitrate_estimator->SetAlrEndedTimeMs(kFirstArrivalTimeMs +
-                                                           1);
-  states.acknowledged_bitrate_estimator->IncomingPacketFeedbackVector(
-      packet_feedback_vector);
-}
-
-TEST(TestAcknowledgedBitrateEstimator, ReturnBitrate) {
-  auto states = CreateTestStates();
-  rtc::Optional<uint32_t> return_value(42);
-  EXPECT_CALL(*states.mock_bitrate_estimator, bitrate_bps())
-      .Times(1)
-      .WillOnce(Return(return_value));
-  EXPECT_EQ(return_value, states.acknowledged_bitrate_estimator->bitrate_bps());
-}
-
-}  // namespace webrtc*/
diff --git a/modules/congestion_controller/bitrate_estimator.cc b/modules/congestion_controller/bitrate_estimator.cc
deleted file mode 100644
index 1627bf8..0000000
--- a/modules/congestion_controller/bitrate_estimator.cc
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- *  Copyright (c) 2017 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/congestion_controller/bitrate_estimator.h"
-
-#include <cmath>
-
-#include "webrtc/modules/remote_bitrate_estimator/test/bwe_test_logging.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
-
-namespace webrtc {
-
-namespace {
-constexpr int kInitialRateWindowMs = 500;
-constexpr int kRateWindowMs = 150;
-}  // namespace
-
-BitrateEstimator::BitrateEstimator()
-    : sum_(0),
-      current_win_ms_(0),
-      prev_time_ms_(-1),
-      bitrate_estimate_(-1.0f),
-      bitrate_estimate_var_(50.0f) {}
-
-BitrateEstimator::~BitrateEstimator() = default;
-
-void BitrateEstimator::Update(int64_t now_ms, int bytes) {
-  int rate_window_ms = kRateWindowMs;
-  // We use a larger window at the beginning to get a more stable sample that
-  // we can use to initialize the estimate.
-  if (bitrate_estimate_ < 0.f)
-    rate_window_ms = kInitialRateWindowMs;
-  float bitrate_sample = UpdateWindow(now_ms, bytes, rate_window_ms);
-  if (bitrate_sample < 0.0f)
-    return;
-  if (bitrate_estimate_ < 0.0f) {
-    // This is the very first sample we get. Use it to initialize the estimate.
-    bitrate_estimate_ = bitrate_sample;
-    return;
-  }
-  // Define the sample uncertainty as a function of how far away it is from the
-  // current estimate.
-  float sample_uncertainty =
-      10.0f * std::abs(bitrate_estimate_ - bitrate_sample) / bitrate_estimate_;
-  float sample_var = sample_uncertainty * sample_uncertainty;
-  // Update a bayesian estimate of the rate, weighting it lower if the sample
-  // uncertainty is large.
-  // The bitrate estimate uncertainty is increased with each update to model
-  // that the bitrate changes over time.
-  float pred_bitrate_estimate_var = bitrate_estimate_var_ + 5.f;
-  bitrate_estimate_ = (sample_var * bitrate_estimate_ +
-                       pred_bitrate_estimate_var * bitrate_sample) /
-                      (sample_var + pred_bitrate_estimate_var);
-  bitrate_estimate_var_ = sample_var * pred_bitrate_estimate_var /
-                          (sample_var + pred_bitrate_estimate_var);
-  BWE_TEST_LOGGING_PLOT(1, "acknowledged_bitrate", now_ms,
-                        bitrate_estimate_ * 1000);
-}
-
-float BitrateEstimator::UpdateWindow(int64_t now_ms,
-                                     int bytes,
-                                     int rate_window_ms) {
-  // Reset if time moves backwards.
-  if (now_ms < prev_time_ms_) {
-    prev_time_ms_ = -1;
-    sum_ = 0;
-    current_win_ms_ = 0;
-  }
-  if (prev_time_ms_ >= 0) {
-    current_win_ms_ += now_ms - prev_time_ms_;
-    // Reset if nothing has been received for more than a full window.
-    if (now_ms - prev_time_ms_ > rate_window_ms) {
-      sum_ = 0;
-      current_win_ms_ %= rate_window_ms;
-    }
-  }
-  prev_time_ms_ = now_ms;
-  float bitrate_sample = -1.0f;
-  if (current_win_ms_ >= rate_window_ms) {
-    bitrate_sample = 8.0f * sum_ / static_cast<float>(rate_window_ms);
-    current_win_ms_ -= rate_window_ms;
-    sum_ = 0;
-  }
-  sum_ += bytes;
-  return bitrate_sample;
-}
-
-rtc::Optional<uint32_t> BitrateEstimator::bitrate_bps() const {
-  if (bitrate_estimate_ < 0.f)
-    return rtc::Optional<uint32_t>();
-  return rtc::Optional<uint32_t>(bitrate_estimate_ * 1000);
-}
-
-void BitrateEstimator::ExpectFastRateChange() {
-  // By setting the bitrate-estimate variance to a higher value we allow the
-  // bitrate to change fast for the next few samples.
-  bitrate_estimate_var_ += 200;
-}
-
-}  // namespace webrtc
diff --git a/modules/congestion_controller/bitrate_estimator.h b/modules/congestion_controller/bitrate_estimator.h
deleted file mode 100644
index ad7bef5..0000000
--- a/modules/congestion_controller/bitrate_estimator.h
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- *  Copyright (c) 2017 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_CONGESTION_CONTROLLER_BITRATE_ESTIMATOR_H_
-#define WEBRTC_MODULES_CONGESTION_CONTROLLER_BITRATE_ESTIMATOR_H_
-
-#include <vector>
-
-#include "webrtc/api/optional.h"
-
-namespace webrtc {
-
-// Computes a bayesian estimate of the throughput given acks containing
-// the arrival time and payload size. Samples which are far from the current
-// estimate or are based on few packets are given a smaller weight, as they
-// are considered to be more likely to have been caused by, e.g., delay spikes
-// unrelated to congestion.
-class BitrateEstimator {
- public:
-  BitrateEstimator();
-  virtual ~BitrateEstimator();
-  virtual void Update(int64_t now_ms, int bytes);
-
-  virtual rtc::Optional<uint32_t> bitrate_bps() const;
-
-  virtual void ExpectFastRateChange();
-
- private:
-  float UpdateWindow(int64_t now_ms, int bytes, int rate_window_ms);
-  int sum_;
-  int64_t current_win_ms_;
-  int64_t prev_time_ms_;
-  float bitrate_estimate_;
-  float bitrate_estimate_var_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_CONGESTION_CONTROLLER_BITRATE_ESTIMATOR_H_
diff --git a/modules/congestion_controller/congestion_controller_unittests_helper.cc b/modules/congestion_controller/congestion_controller_unittests_helper.cc
deleted file mode 100644
index 4fb1130..0000000
--- a/modules/congestion_controller/congestion_controller_unittests_helper.cc
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- *  Copyright (c) 2017 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/congestion_controller/congestion_controller_unittests_helper.h"
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-void ComparePacketFeedbackVectors(const std::vector<PacketFeedback>& truth,
-                                  const std::vector<PacketFeedback>& input) {
-  ASSERT_EQ(truth.size(), input.size());
-  size_t len = truth.size();
-  // truth contains the input data for the test, and input is what will be
-  // sent to the bandwidth estimator. truth.arrival_tims_ms is used to
-  // populate the transport feedback messages. As these times may be changed
-  // (because of resolution limits in the packets, and because of the time
-  // base adjustment performed by the TransportFeedbackAdapter at the first
-  // packet, the truth[x].arrival_time and input[x].arrival_time may not be
-  // equal. However, the difference must be the same for all x.
-  int64_t arrival_time_delta =
-      truth[0].arrival_time_ms - input[0].arrival_time_ms;
-  for (size_t i = 0; i < len; ++i) {
-    RTC_CHECK(truth[i].arrival_time_ms != PacketFeedback::kNotReceived);
-    if (input[i].arrival_time_ms != PacketFeedback::kNotReceived) {
-      EXPECT_EQ(truth[i].arrival_time_ms,
-                input[i].arrival_time_ms + arrival_time_delta);
-    }
-    EXPECT_EQ(truth[i].send_time_ms, input[i].send_time_ms);
-    EXPECT_EQ(truth[i].sequence_number, input[i].sequence_number);
-    EXPECT_EQ(truth[i].payload_size, input[i].payload_size);
-    EXPECT_EQ(truth[i].pacing_info, input[i].pacing_info);
-  }
-}
-}  // namespace webrtc
diff --git a/modules/congestion_controller/congestion_controller_unittests_helper.h b/modules/congestion_controller/congestion_controller_unittests_helper.h
deleted file mode 100644
index 474e9a7..0000000
--- a/modules/congestion_controller/congestion_controller_unittests_helper.h
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- *  Copyright (c) 2017 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_CONGESTION_CONTROLLER_CONGESTION_CONTROLLER_UNITTESTS_HELPER_H_
-#define WEBRTC_MODULES_CONGESTION_CONTROLLER_CONGESTION_CONTROLLER_UNITTESTS_HELPER_H_
-
-#include <vector>
-
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
-
-namespace webrtc {
-void ComparePacketFeedbackVectors(const std::vector<PacketFeedback>& truth,
-                                  const std::vector<PacketFeedback>& input);
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_CONGESTION_CONTROLLER_CONGESTION_CONTROLLER_UNITTESTS_HELPER_H_
diff --git a/modules/congestion_controller/delay_based_bwe.cc b/modules/congestion_controller/delay_based_bwe.cc
deleted file mode 100644
index dd59b8a..0000000
--- a/modules/congestion_controller/delay_based_bwe.cc
+++ /dev/null
@@ -1,315 +0,0 @@
-/*
- *  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/congestion_controller/delay_based_bwe.h"
-
-#include <algorithm>
-#include <cmath>
-#include <string>
-
-#include "webrtc/logging/rtc_event_log/rtc_event_log.h"
-#include "webrtc/modules/pacing/paced_sender.h"
-#include "webrtc/modules/remote_bitrate_estimator/include/remote_bitrate_estimator.h"
-#include "webrtc/modules/remote_bitrate_estimator/test/bwe_test_logging.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/thread_annotations.h"
-#include "webrtc/system_wrappers/include/field_trial.h"
-#include "webrtc/system_wrappers/include/metrics.h"
-#include "webrtc/typedefs.h"
-
-namespace {
-constexpr int kTimestampGroupLengthMs = 5;
-constexpr int kAbsSendTimeFraction = 18;
-constexpr int kAbsSendTimeInterArrivalUpshift = 8;
-constexpr int kInterArrivalShift =
-    kAbsSendTimeFraction + kAbsSendTimeInterArrivalUpshift;
-constexpr double kTimestampToMs =
-    1000.0 / static_cast<double>(1 << kInterArrivalShift);
-// This ssrc is used to fulfill the current API but will be removed
-// after the API has been changed.
-constexpr uint32_t kFixedSsrc = 0;
-
-// Parameters for linear least squares fit of regression line to noisy data.
-constexpr size_t kDefaultTrendlineWindowSize = 20;
-constexpr double kDefaultTrendlineSmoothingCoeff = 0.9;
-constexpr double kDefaultTrendlineThresholdGain = 4.0;
-
-constexpr int kMaxConsecutiveFailedLookups = 5;
-
-const char kBweSparseUpdateExperiment[] = "WebRTC-BweSparseUpdateExperiment";
-
-bool BweSparseUpdateExperimentIsEnabled() {
-  std::string experiment_string =
-      webrtc::field_trial::FindFullName(kBweSparseUpdateExperiment);
-  return experiment_string == "Enabled";
-}
-}  // namespace
-
-namespace webrtc {
-
-DelayBasedBwe::Result::Result()
-    : updated(false),
-      probe(false),
-      target_bitrate_bps(0),
-      recovered_from_overuse(false) {}
-
-DelayBasedBwe::Result::Result(bool probe, uint32_t target_bitrate_bps)
-    : updated(true),
-      probe(probe),
-      target_bitrate_bps(target_bitrate_bps),
-      recovered_from_overuse(false) {}
-
-DelayBasedBwe::Result::~Result() {}
-
-DelayBasedBwe::DelayBasedBwe(RtcEventLog* event_log, const Clock* clock)
-    : event_log_(event_log),
-      clock_(clock),
-      inter_arrival_(),
-      trendline_estimator_(),
-      detector_(),
-      last_seen_packet_ms_(-1),
-      uma_recorded_(false),
-      probe_bitrate_estimator_(event_log),
-      trendline_window_size_(kDefaultTrendlineWindowSize),
-      trendline_smoothing_coeff_(kDefaultTrendlineSmoothingCoeff),
-      trendline_threshold_gain_(kDefaultTrendlineThresholdGain),
-      consecutive_delayed_feedbacks_(0),
-      last_logged_bitrate_(0),
-      last_logged_state_(BandwidthUsage::kBwNormal),
-      in_sparse_update_experiment_(BweSparseUpdateExperimentIsEnabled()) {
-  LOG(LS_INFO) << "Using Trendline filter for delay change estimation.";
-}
-
-DelayBasedBwe::~DelayBasedBwe() {}
-
-DelayBasedBwe::Result DelayBasedBwe::IncomingPacketFeedbackVector(
-    const std::vector<PacketFeedback>& packet_feedback_vector,
-    rtc::Optional<uint32_t> acked_bitrate_bps) {
-  RTC_DCHECK(std::is_sorted(packet_feedback_vector.begin(),
-                            packet_feedback_vector.end(),
-                            PacketFeedbackComparator()));
-  RTC_DCHECK_RUNS_SERIALIZED(&network_race_);
-
-  // TOOD(holmer): An empty feedback vector here likely means that
-  // all acks were too late and that the send time history had
-  // timed out. We should reduce the rate when this occurs.
-  if (packet_feedback_vector.empty()) {
-    LOG(LS_WARNING) << "Very late feedback received.";
-    return DelayBasedBwe::Result();
-  }
-
-  if (!uma_recorded_) {
-    RTC_HISTOGRAM_ENUMERATION(kBweTypeHistogram,
-                              BweNames::kSendSideTransportSeqNum,
-                              BweNames::kBweNamesMax);
-    uma_recorded_ = true;
-  }
-  bool overusing = false;
-  bool delayed_feedback = true;
-  bool recovered_from_overuse = false;
-  BandwidthUsage prev_detector_state = detector_.State();
-  for (const auto& packet_feedback : packet_feedback_vector) {
-    if (packet_feedback.send_time_ms < 0)
-      continue;
-    delayed_feedback = false;
-    IncomingPacketFeedback(packet_feedback);
-    if (!in_sparse_update_experiment_)
-      overusing |= (detector_.State() == BandwidthUsage::kBwOverusing);
-    if (prev_detector_state == BandwidthUsage::kBwUnderusing &&
-        detector_.State() == BandwidthUsage::kBwNormal) {
-      recovered_from_overuse = true;
-    }
-    prev_detector_state = detector_.State();
-  }
-  if (in_sparse_update_experiment_)
-    overusing = (detector_.State() == BandwidthUsage::kBwOverusing);
-
-  if (delayed_feedback) {
-    ++consecutive_delayed_feedbacks_;
-    if (consecutive_delayed_feedbacks_ >= kMaxConsecutiveFailedLookups) {
-      consecutive_delayed_feedbacks_ = 0;
-      return OnLongFeedbackDelay(packet_feedback_vector.back().arrival_time_ms);
-    }
-  } else {
-    consecutive_delayed_feedbacks_ = 0;
-    return MaybeUpdateEstimate(overusing, acked_bitrate_bps,
-                               recovered_from_overuse);
-  }
-  return Result();
-}
-
-DelayBasedBwe::Result DelayBasedBwe::OnLongFeedbackDelay(
-    int64_t arrival_time_ms) {
-  // Estimate should always be valid since a start bitrate always is set in the
-  // Call constructor. An alternative would be to return an empty Result here,
-  // or to estimate the throughput based on the feedback we received.
-  RTC_DCHECK(rate_control_.ValidEstimate());
-  rate_control_.SetEstimate(rate_control_.LatestEstimate() / 2,
-                            arrival_time_ms);
-  Result result;
-  result.updated = true;
-  result.probe = false;
-  result.target_bitrate_bps = rate_control_.LatestEstimate();
-  LOG(LS_WARNING) << "Long feedback delay detected, reducing BWE to "
-                  << result.target_bitrate_bps;
-  return result;
-}
-
-void DelayBasedBwe::IncomingPacketFeedback(
-    const PacketFeedback& packet_feedback) {
-  int64_t now_ms = clock_->TimeInMilliseconds();
-  // Reset if the stream has timed out.
-  if (last_seen_packet_ms_ == -1 ||
-      now_ms - last_seen_packet_ms_ > kStreamTimeOutMs) {
-    inter_arrival_.reset(
-        new InterArrival((kTimestampGroupLengthMs << kInterArrivalShift) / 1000,
-                         kTimestampToMs, true));
-    trendline_estimator_.reset(new TrendlineEstimator(
-        trendline_window_size_, trendline_smoothing_coeff_,
-        trendline_threshold_gain_));
-  }
-  last_seen_packet_ms_ = now_ms;
-
-  uint32_t send_time_24bits =
-      static_cast<uint32_t>(
-          ((static_cast<uint64_t>(packet_feedback.send_time_ms)
-            << kAbsSendTimeFraction) +
-           500) /
-          1000) &
-      0x00FFFFFF;
-  // Shift up send time to use the full 32 bits that inter_arrival works with,
-  // so wrapping works properly.
-  uint32_t timestamp = send_time_24bits << kAbsSendTimeInterArrivalUpshift;
-
-  uint32_t ts_delta = 0;
-  int64_t t_delta = 0;
-  int size_delta = 0;
-  if (inter_arrival_->ComputeDeltas(timestamp, packet_feedback.arrival_time_ms,
-                                    now_ms, packet_feedback.payload_size,
-                                    &ts_delta, &t_delta, &size_delta)) {
-    double ts_delta_ms = (1000.0 * ts_delta) / (1 << kInterArrivalShift);
-    trendline_estimator_->Update(t_delta, ts_delta_ms,
-                                 packet_feedback.arrival_time_ms);
-    detector_.Detect(trendline_estimator_->trendline_slope(), ts_delta_ms,
-                     trendline_estimator_->num_of_deltas(),
-                     packet_feedback.arrival_time_ms);
-  }
-  if (packet_feedback.pacing_info.probe_cluster_id !=
-      PacedPacketInfo::kNotAProbe) {
-    probe_bitrate_estimator_.HandleProbeAndEstimateBitrate(packet_feedback);
-  }
-}
-
-DelayBasedBwe::Result DelayBasedBwe::MaybeUpdateEstimate(
-    bool overusing,
-    rtc::Optional<uint32_t> acked_bitrate_bps,
-    bool recovered_from_overuse) {
-  Result result;
-  int64_t now_ms = clock_->TimeInMilliseconds();
-
-  rtc::Optional<int> probe_bitrate_bps =
-      probe_bitrate_estimator_.FetchAndResetLastEstimatedBitrateBps();
-  // Currently overusing the bandwidth.
-  if (overusing) {
-    if (acked_bitrate_bps &&
-        rate_control_.TimeToReduceFurther(now_ms, *acked_bitrate_bps)) {
-      result.updated = UpdateEstimate(now_ms, acked_bitrate_bps, overusing,
-                                      &result.target_bitrate_bps);
-    } else if (!acked_bitrate_bps && rate_control_.ValidEstimate() &&
-               rate_control_.TimeToReduceFurther(
-                   now_ms, rate_control_.LatestEstimate() / 2 - 1)) {
-      // Overusing before we have a measured acknowledged bitrate. We check
-      // TimeToReduceFurther (with a fake acknowledged bitrate) to avoid
-      // reducing too often.
-      // TODO(tschumim): Improve this and/or the acknowledged bitrate estimator
-      // so that we (almost) always have a bitrate estimate.
-      rate_control_.SetEstimate(rate_control_.LatestEstimate() / 2, now_ms);
-      result.updated = true;
-      result.probe = false;
-      result.target_bitrate_bps = rate_control_.LatestEstimate();
-    }
-  } else {
-    if (probe_bitrate_bps) {
-      result.probe = true;
-      result.updated = true;
-      result.target_bitrate_bps = *probe_bitrate_bps;
-      rate_control_.SetEstimate(*probe_bitrate_bps, now_ms);
-    } else {
-      result.updated = UpdateEstimate(now_ms, acked_bitrate_bps, overusing,
-                                      &result.target_bitrate_bps);
-      result.recovered_from_overuse = recovered_from_overuse;
-    }
-  }
-  if (result.updated) {
-    BWE_TEST_LOGGING_PLOT(1, "target_bitrate_bps", now_ms,
-                          result.target_bitrate_bps);
-    if (event_log_ && (result.target_bitrate_bps != last_logged_bitrate_ ||
-                       detector_.State() != last_logged_state_)) {
-      event_log_->LogDelayBasedBweUpdate(result.target_bitrate_bps,
-                                         detector_.State());
-      last_logged_bitrate_ = result.target_bitrate_bps;
-      last_logged_state_ = detector_.State();
-    }
-  }
-  return result;
-}
-
-bool DelayBasedBwe::UpdateEstimate(int64_t now_ms,
-                                   rtc::Optional<uint32_t> acked_bitrate_bps,
-                                   bool overusing,
-                                   uint32_t* target_bitrate_bps) {
-  // TODO(terelius): RateControlInput::noise_var is deprecated and will be
-  // removed. In the meantime, we set it to zero.
-  const RateControlInput input(
-      overusing ? BandwidthUsage::kBwOverusing : detector_.State(),
-      acked_bitrate_bps, 0);
-  uint32_t prev_target_bitrate_bps = rate_control_.LatestEstimate();
-  *target_bitrate_bps = rate_control_.Update(&input, now_ms);
-  return rate_control_.ValidEstimate() &&
-         prev_target_bitrate_bps != *target_bitrate_bps;
-}
-
-void DelayBasedBwe::OnRttUpdate(int64_t avg_rtt_ms, int64_t max_rtt_ms) {
-  rate_control_.SetRtt(avg_rtt_ms);
-}
-
-bool DelayBasedBwe::LatestEstimate(std::vector<uint32_t>* ssrcs,
-                                   uint32_t* bitrate_bps) const {
-  // Currently accessed from both the process thread (see
-  // ModuleRtpRtcpImpl::Process()) and the configuration thread (see
-  // Call::GetStats()). Should in the future only be accessed from a single
-  // thread.
-  RTC_DCHECK(ssrcs);
-  RTC_DCHECK(bitrate_bps);
-  if (!rate_control_.ValidEstimate())
-    return false;
-
-  *ssrcs = {kFixedSsrc};
-  *bitrate_bps = rate_control_.LatestEstimate();
-  return true;
-}
-
-void DelayBasedBwe::SetStartBitrate(int start_bitrate_bps) {
-  LOG(LS_WARNING) << "BWE Setting start bitrate to: " << start_bitrate_bps;
-  rate_control_.SetStartBitrate(start_bitrate_bps);
-}
-
-void DelayBasedBwe::SetMinBitrate(int min_bitrate_bps) {
-  // Called from both the configuration thread and the network thread. Shouldn't
-  // be called from the network thread in the future.
-  rate_control_.SetMinBitrate(min_bitrate_bps);
-}
-
-int64_t DelayBasedBwe::GetExpectedBwePeriodMs() const {
-  return rate_control_.GetExpectedBandwidthPeriodMs();
-}
-}  // namespace webrtc
diff --git a/modules/congestion_controller/delay_based_bwe.h b/modules/congestion_controller/delay_based_bwe.h
deleted file mode 100644
index 52c227f..0000000
--- a/modules/congestion_controller/delay_based_bwe.h
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- *  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_CONGESTION_CONTROLLER_DELAY_BASED_BWE_H_
-#define WEBRTC_MODULES_CONGESTION_CONTROLLER_DELAY_BASED_BWE_H_
-
-#include <memory>
-#include <utility>
-#include <vector>
-
-#include "webrtc/modules/congestion_controller/median_slope_estimator.h"
-#include "webrtc/modules/congestion_controller/probe_bitrate_estimator.h"
-#include "webrtc/modules/congestion_controller/trendline_estimator.h"
-#include "webrtc/modules/remote_bitrate_estimator/aimd_rate_control.h"
-#include "webrtc/modules/remote_bitrate_estimator/include/remote_bitrate_estimator.h"
-#include "webrtc/modules/remote_bitrate_estimator/inter_arrival.h"
-#include "webrtc/modules/remote_bitrate_estimator/overuse_detector.h"
-#include "webrtc/modules/remote_bitrate_estimator/overuse_estimator.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/race_checker.h"
-
-namespace webrtc {
-
-class RtcEventLog;
-
-class DelayBasedBwe {
- public:
-  static const int64_t kStreamTimeOutMs = 2000;
-
-  struct Result {
-    Result();
-    Result(bool probe, uint32_t target_bitrate_bps);
-    ~Result();
-    bool updated;
-    bool probe;
-    uint32_t target_bitrate_bps;
-    bool recovered_from_overuse;
-  };
-
-  DelayBasedBwe(RtcEventLog* event_log, const Clock* clock);
-  virtual ~DelayBasedBwe();
-
-  Result IncomingPacketFeedbackVector(
-      const std::vector<PacketFeedback>& packet_feedback_vector,
-      rtc::Optional<uint32_t> acked_bitrate_bps);
-  void OnRttUpdate(int64_t avg_rtt_ms, int64_t max_rtt_ms);
-  bool LatestEstimate(std::vector<uint32_t>* ssrcs,
-                      uint32_t* bitrate_bps) const;
-  void SetStartBitrate(int start_bitrate_bps);
-  void SetMinBitrate(int min_bitrate_bps);
-  int64_t GetExpectedBwePeriodMs() const;
-
- private:
-  void IncomingPacketFeedback(const PacketFeedback& packet_feedback);
-  Result OnLongFeedbackDelay(int64_t arrival_time_ms);
-  Result MaybeUpdateEstimate(bool overusing,
-                             rtc::Optional<uint32_t> acked_bitrate_bps,
-                             bool request_probe);
-  // Updates the current remote rate estimate and returns true if a valid
-  // estimate exists.
-  bool UpdateEstimate(int64_t now_ms,
-                      rtc::Optional<uint32_t> acked_bitrate_bps,
-                      bool overusing,
-                      uint32_t* target_bitrate_bps);
-
-  rtc::RaceChecker network_race_;
-  RtcEventLog* const event_log_;
-  const Clock* const clock_;
-  std::unique_ptr<InterArrival> inter_arrival_;
-  std::unique_ptr<TrendlineEstimator> trendline_estimator_;
-  OveruseDetector detector_;
-  int64_t last_seen_packet_ms_;
-  bool uma_recorded_;
-  AimdRateControl rate_control_;
-  ProbeBitrateEstimator probe_bitrate_estimator_;
-  size_t trendline_window_size_;
-  double trendline_smoothing_coeff_;
-  double trendline_threshold_gain_;
-  int consecutive_delayed_feedbacks_;
-  uint32_t last_logged_bitrate_;
-  BandwidthUsage last_logged_state_;
-  bool in_sparse_update_experiment_;
-
-  RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(DelayBasedBwe);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_CONGESTION_CONTROLLER_DELAY_BASED_BWE_H_
diff --git a/modules/congestion_controller/delay_based_bwe_unittest.cc b/modules/congestion_controller/delay_based_bwe_unittest.cc
deleted file mode 100644
index a451368..0000000
--- a/modules/congestion_controller/delay_based_bwe_unittest.cc
+++ /dev/null
@@ -1,225 +0,0 @@
-/*
- *  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/congestion_controller/delay_based_bwe.h"
-#include "webrtc/modules/congestion_controller/delay_based_bwe_unittest_helper.h"
-#include "webrtc/modules/pacing/paced_sender.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/system_wrappers/include/clock.h"
-#include "webrtc/test/field_trial.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-namespace {
-constexpr int kNumProbesCluster0 = 5;
-constexpr int kNumProbesCluster1 = 8;
-const PacedPacketInfo kPacingInfo0(0, kNumProbesCluster0, 2000);
-const PacedPacketInfo kPacingInfo1(1, kNumProbesCluster1, 4000);
-constexpr float kTargetUtilizationFraction = 0.95f;
-}  // namespace
-
-TEST_F(DelayBasedBweTest, NoCrashEmptyFeedback) {
-  std::vector<PacketFeedback> packet_feedback_vector;
-  bitrate_estimator_->IncomingPacketFeedbackVector(packet_feedback_vector,
-                                                   rtc::Optional<uint32_t>());
-}
-
-TEST_F(DelayBasedBweTest, NoCrashOnlyLostFeedback) {
-  std::vector<PacketFeedback> packet_feedback_vector;
-  packet_feedback_vector.push_back(
-      PacketFeedback(-1, -1, 0, 1500, PacedPacketInfo()));
-  packet_feedback_vector.push_back(
-      PacketFeedback(-1, -1, 1, 1500, PacedPacketInfo()));
-  bitrate_estimator_->IncomingPacketFeedbackVector(packet_feedback_vector,
-                                                   rtc::Optional<uint32_t>());
-}
-
-TEST_F(DelayBasedBweTest, ProbeDetection) {
-  int64_t now_ms = clock_.TimeInMilliseconds();
-  uint16_t seq_num = 0;
-
-  // First burst sent at 8 * 1000 / 10 = 800 kbps.
-  for (int i = 0; i < kNumProbesCluster0; ++i) {
-    clock_.AdvanceTimeMilliseconds(10);
-    now_ms = clock_.TimeInMilliseconds();
-    IncomingFeedback(now_ms, now_ms, seq_num++, 1000, kPacingInfo0);
-  }
-  EXPECT_TRUE(bitrate_observer_.updated());
-
-  // Second burst sent at 8 * 1000 / 5 = 1600 kbps.
-  for (int i = 0; i < kNumProbesCluster1; ++i) {
-    clock_.AdvanceTimeMilliseconds(5);
-    now_ms = clock_.TimeInMilliseconds();
-    IncomingFeedback(now_ms, now_ms, seq_num++, 1000, kPacingInfo1);
-  }
-
-  EXPECT_TRUE(bitrate_observer_.updated());
-  EXPECT_GT(bitrate_observer_.latest_bitrate(), 1500000u);
-}
-
-TEST_F(DelayBasedBweTest, ProbeDetectionNonPacedPackets) {
-  int64_t now_ms = clock_.TimeInMilliseconds();
-  uint16_t seq_num = 0;
-  // First burst sent at 8 * 1000 / 10 = 800 kbps, but with every other packet
-  // not being paced which could mess things up.
-  for (int i = 0; i < kNumProbesCluster0; ++i) {
-    clock_.AdvanceTimeMilliseconds(5);
-    now_ms = clock_.TimeInMilliseconds();
-    IncomingFeedback(now_ms, now_ms, seq_num++, 1000, kPacingInfo0);
-    // Non-paced packet, arriving 5 ms after.
-    clock_.AdvanceTimeMilliseconds(5);
-    IncomingFeedback(now_ms, now_ms, seq_num++, 100, PacedPacketInfo());
-  }
-
-  EXPECT_TRUE(bitrate_observer_.updated());
-  EXPECT_GT(bitrate_observer_.latest_bitrate(), 800000u);
-}
-
-TEST_F(DelayBasedBweTest, ProbeDetectionFasterArrival) {
-  int64_t now_ms = clock_.TimeInMilliseconds();
-  uint16_t seq_num = 0;
-  // First burst sent at 8 * 1000 / 10 = 800 kbps.
-  // Arriving at 8 * 1000 / 5 = 1600 kbps.
-  int64_t send_time_ms = 0;
-  for (int i = 0; i < kNumProbesCluster0; ++i) {
-    clock_.AdvanceTimeMilliseconds(1);
-    send_time_ms += 10;
-    now_ms = clock_.TimeInMilliseconds();
-    IncomingFeedback(now_ms, send_time_ms, seq_num++, 1000, kPacingInfo0);
-  }
-
-  EXPECT_FALSE(bitrate_observer_.updated());
-}
-
-TEST_F(DelayBasedBweTest, ProbeDetectionSlowerArrival) {
-  int64_t now_ms = clock_.TimeInMilliseconds();
-  uint16_t seq_num = 0;
-  // First burst sent at 8 * 1000 / 5 = 1600 kbps.
-  // Arriving at 8 * 1000 / 7 = 1142 kbps.
-  // Since the receive rate is significantly below the send rate, we expect to
-  // use 95% of the estimated capacity.
-  int64_t send_time_ms = 0;
-  for (int i = 0; i < kNumProbesCluster1; ++i) {
-    clock_.AdvanceTimeMilliseconds(7);
-    send_time_ms += 5;
-    now_ms = clock_.TimeInMilliseconds();
-    IncomingFeedback(now_ms, send_time_ms, seq_num++, 1000, kPacingInfo1);
-  }
-
-  EXPECT_TRUE(bitrate_observer_.updated());
-  EXPECT_NEAR(bitrate_observer_.latest_bitrate(),
-              kTargetUtilizationFraction * 1140000u, 10000u);
-}
-
-TEST_F(DelayBasedBweTest, ProbeDetectionSlowerArrivalHighBitrate) {
-  int64_t now_ms = clock_.TimeInMilliseconds();
-  uint16_t seq_num = 0;
-  // Burst sent at 8 * 1000 / 1 = 8000 kbps.
-  // Arriving at 8 * 1000 / 2 = 4000 kbps.
-  // Since the receive rate is significantly below the send rate, we expect to
-  // use 95% of the estimated capacity.
-  int64_t send_time_ms = 0;
-  for (int i = 0; i < kNumProbesCluster1; ++i) {
-    clock_.AdvanceTimeMilliseconds(2);
-    send_time_ms += 1;
-    now_ms = clock_.TimeInMilliseconds();
-    IncomingFeedback(now_ms, send_time_ms, seq_num++, 1000, kPacingInfo1);
-  }
-
-  EXPECT_TRUE(bitrate_observer_.updated());
-  EXPECT_NEAR(bitrate_observer_.latest_bitrate(),
-              kTargetUtilizationFraction * 4000000u, 10000u);
-}
-
-TEST_F(DelayBasedBweTest, InitialBehavior) {
-  InitialBehaviorTestHelper(730000);
-}
-
-TEST_F(DelayBasedBweTest, RateIncreaseReordering) {
-  RateIncreaseReorderingTestHelper(730000);
-}
-TEST_F(DelayBasedBweTest, RateIncreaseRtpTimestamps) {
-  RateIncreaseRtpTimestampsTestHelper(627);
-}
-
-TEST_F(DelayBasedBweTest, CapacityDropOneStream) {
-  CapacityDropTestHelper(1, false, 300, 0);
-}
-
-TEST_F(DelayBasedBweTest, CapacityDropPosOffsetChange) {
-  CapacityDropTestHelper(1, false, 867, 30000);
-}
-
-TEST_F(DelayBasedBweTest, CapacityDropNegOffsetChange) {
-  CapacityDropTestHelper(1, false, 933, -30000);
-}
-
-TEST_F(DelayBasedBweTest, CapacityDropOneStreamWrap) {
-  CapacityDropTestHelper(1, true, 333, 0);
-}
-
-TEST_F(DelayBasedBweTest, TestTimestampGrouping) {
-  TestTimestampGroupingTestHelper();
-}
-
-TEST_F(DelayBasedBweTest, TestShortTimeoutAndWrap) {
-  // Simulate a client leaving and rejoining the call after 35 seconds. This
-  // will make abs send time wrap, so if streams aren't timed out properly
-  // the next 30 seconds of packets will be out of order.
-  TestWrappingHelper(35);
-}
-
-TEST_F(DelayBasedBweTest, TestLongTimeoutAndWrap) {
-  // Simulate a client leaving and rejoining the call after some multiple of
-  // 64 seconds later. This will cause a zero difference in abs send times due
-  // to the wrap, but a big difference in arrival time, if streams aren't
-  // properly timed out.
-  TestWrappingHelper(10 * 64);
-}
-
-TEST_F(DelayBasedBweTest, TestInitialOveruse) {
-  const uint32_t kStartBitrate = 300e3;
-  const uint32_t kInitialCapacityBps = 200e3;
-  const uint32_t kDummySsrc = 0;
-  // High FPS to ensure that we send a lot of packets in a short time.
-  const int kFps = 90;
-
-  stream_generator_->AddStream(new test::RtpStream(kFps, kStartBitrate));
-  stream_generator_->set_capacity_bps(kInitialCapacityBps);
-
-  // Needed to initialize the AimdRateControl.
-  bitrate_estimator_->SetStartBitrate(kStartBitrate);
-
-  // Produce 30 frames (in 1/3 second) and give them to the estimator.
-  uint32_t bitrate_bps = kStartBitrate;
-  bool seen_overuse = false;
-  for (int i = 0; i < 30; ++i) {
-    bool overuse = GenerateAndProcessFrame(kDummySsrc, bitrate_bps);
-    // The purpose of this test is to ensure that we back down even if we don't
-    // have any acknowledged bitrate estimate yet. Hence, if the test works
-    // as expected, we should not have a measured bitrate yet.
-    EXPECT_FALSE(acknowledged_bitrate_estimator_->bitrate_bps().has_value());
-    if (overuse) {
-      EXPECT_TRUE(bitrate_observer_.updated());
-      EXPECT_NEAR(bitrate_observer_.latest_bitrate(), kStartBitrate / 2, 15000);
-      bitrate_bps = bitrate_observer_.latest_bitrate();
-      seen_overuse = true;
-      break;
-    } else if (bitrate_observer_.updated()) {
-      bitrate_bps = bitrate_observer_.latest_bitrate();
-      bitrate_observer_.Reset();
-    }
-  }
-  EXPECT_TRUE(seen_overuse);
-  EXPECT_NEAR(bitrate_observer_.latest_bitrate(), kStartBitrate / 2, 15000);
-}
-
-}  // namespace webrtc
diff --git a/modules/congestion_controller/delay_based_bwe_unittest_helper.cc b/modules/congestion_controller/delay_based_bwe_unittest_helper.cc
deleted file mode 100644
index 9a86d9f..0000000
--- a/modules/congestion_controller/delay_based_bwe_unittest_helper.cc
+++ /dev/null
@@ -1,513 +0,0 @@
-/*
- *  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/congestion_controller/delay_based_bwe_unittest_helper.h"
-
-#include <algorithm>
-#include <limits>
-#include <utility>
-
-#include "webrtc/modules/congestion_controller/delay_based_bwe.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/ptr_util.h"
-
-namespace webrtc {
-
-constexpr size_t kMtu = 1200;
-constexpr uint32_t kAcceptedBitrateErrorBps = 50000;
-
-// Number of packets needed before we have a valid estimate.
-constexpr int kNumInitialPackets = 2;
-
-constexpr int kInitialProbingPackets = 5;
-
-namespace test {
-
-void TestBitrateObserver::OnReceiveBitrateChanged(
-    const std::vector<uint32_t>& ssrcs,
-    uint32_t bitrate) {
-  latest_bitrate_ = bitrate;
-  updated_ = true;
-}
-
-RtpStream::RtpStream(int fps, int bitrate_bps)
-    : fps_(fps),
-      bitrate_bps_(bitrate_bps),
-      next_rtp_time_(0),
-      sequence_number_(0) {
-  RTC_CHECK_GT(fps_, 0);
-}
-
-// Generates a new frame for this stream. If called too soon after the
-// previous frame, no frame will be generated. The frame is split into
-// packets.
-int64_t RtpStream::GenerateFrame(int64_t time_now_us,
-                                 std::vector<PacketFeedback>* packets) {
-  if (time_now_us < next_rtp_time_) {
-    return next_rtp_time_;
-  }
-  RTC_CHECK(packets != NULL);
-  size_t bits_per_frame = (bitrate_bps_ + fps_ / 2) / fps_;
-  size_t n_packets =
-      std::max<size_t>((bits_per_frame + 4 * kMtu) / (8 * kMtu), 1u);
-  size_t payload_size = (bits_per_frame + 4 * n_packets) / (8 * n_packets);
-  for (size_t i = 0; i < n_packets; ++i) {
-    PacketFeedback packet(-1, sequence_number_++);
-    packet.send_time_ms = (time_now_us + kSendSideOffsetUs) / 1000;
-    packet.payload_size = payload_size;
-    packets->push_back(packet);
-  }
-  next_rtp_time_ = time_now_us + (1000000 + fps_ / 2) / fps_;
-  return next_rtp_time_;
-}
-
-// The send-side time when the next frame can be generated.
-int64_t RtpStream::next_rtp_time() const {
-  return next_rtp_time_;
-}
-
-void RtpStream::set_bitrate_bps(int bitrate_bps) {
-  ASSERT_GE(bitrate_bps, 0);
-  bitrate_bps_ = bitrate_bps;
-}
-
-int RtpStream::bitrate_bps() const {
-  return bitrate_bps_;
-}
-
-bool RtpStream::Compare(const std::unique_ptr<RtpStream>& lhs,
-                        const std::unique_ptr<RtpStream>& rhs) {
-  return lhs->next_rtp_time_ < rhs->next_rtp_time_;
-}
-
-StreamGenerator::StreamGenerator(int capacity, int64_t time_now)
-    : capacity_(capacity), prev_arrival_time_us_(time_now) {}
-
-// Add a new stream.
-void StreamGenerator::AddStream(RtpStream* stream) {
-  streams_.push_back(std::unique_ptr<RtpStream>(stream));
-}
-
-// Set the link capacity.
-void StreamGenerator::set_capacity_bps(int capacity_bps) {
-  ASSERT_GT(capacity_bps, 0);
-  capacity_ = capacity_bps;
-}
-
-// Divides |bitrate_bps| among all streams. The allocated bitrate per stream
-// is decided by the current allocation ratios.
-void StreamGenerator::SetBitrateBps(int bitrate_bps) {
-  ASSERT_GE(streams_.size(), 0u);
-  int total_bitrate_before = 0;
-  for (const auto& stream : streams_) {
-    total_bitrate_before += stream->bitrate_bps();
-  }
-  int64_t bitrate_before = 0;
-  int total_bitrate_after = 0;
-  for (const auto& stream : streams_) {
-    bitrate_before += stream->bitrate_bps();
-    int64_t bitrate_after =
-        (bitrate_before * bitrate_bps + total_bitrate_before / 2) /
-        total_bitrate_before;
-    stream->set_bitrate_bps(bitrate_after - total_bitrate_after);
-    total_bitrate_after += stream->bitrate_bps();
-  }
-  ASSERT_EQ(bitrate_before, total_bitrate_before);
-  EXPECT_EQ(total_bitrate_after, bitrate_bps);
-}
-
-// TODO(holmer): Break out the channel simulation part from this class to make
-// it possible to simulate different types of channels.
-int64_t StreamGenerator::GenerateFrame(std::vector<PacketFeedback>* packets,
-                                       int64_t time_now_us) {
-  RTC_CHECK(packets != NULL);
-  RTC_CHECK(packets->empty());
-  RTC_CHECK_GT(capacity_, 0);
-  auto it =
-      std::min_element(streams_.begin(), streams_.end(), RtpStream::Compare);
-  (*it)->GenerateFrame(time_now_us, packets);
-  int i = 0;
-  for (PacketFeedback& packet : *packets) {
-    int capacity_bpus = capacity_ / 1000;
-    int64_t required_network_time_us =
-        (8 * 1000 * packet.payload_size + capacity_bpus / 2) / capacity_bpus;
-    prev_arrival_time_us_ =
-        std::max(time_now_us + required_network_time_us,
-                 prev_arrival_time_us_ + required_network_time_us);
-    packet.arrival_time_ms = prev_arrival_time_us_ / 1000;
-    ++i;
-  }
-  it = std::min_element(streams_.begin(), streams_.end(), RtpStream::Compare);
-  return std::max((*it)->next_rtp_time(), time_now_us);
-}
-}  // namespace test
-
-DelayBasedBweTest::DelayBasedBweTest()
-    : clock_(100000000),
-      acknowledged_bitrate_estimator_(
-          rtc::MakeUnique<AcknowledgedBitrateEstimator>()),
-      bitrate_estimator_(new DelayBasedBwe(nullptr, &clock_)),
-      stream_generator_(new test::StreamGenerator(1e6,  // Capacity.
-                                                  clock_.TimeInMicroseconds())),
-      arrival_time_offset_ms_(0),
-      first_update_(true) {}
-
-DelayBasedBweTest::~DelayBasedBweTest() {}
-
-void DelayBasedBweTest::AddDefaultStream() {
-  stream_generator_->AddStream(new test::RtpStream(30, 3e5));
-}
-
-const uint32_t DelayBasedBweTest::kDefaultSsrc = 0;
-
-void DelayBasedBweTest::IncomingFeedback(int64_t arrival_time_ms,
-                                         int64_t send_time_ms,
-                                         uint16_t sequence_number,
-                                         size_t payload_size) {
-  IncomingFeedback(arrival_time_ms, send_time_ms, sequence_number, payload_size,
-                   PacedPacketInfo());
-}
-
-void DelayBasedBweTest::IncomingFeedback(int64_t arrival_time_ms,
-                                         int64_t send_time_ms,
-                                         uint16_t sequence_number,
-                                         size_t payload_size,
-                                         const PacedPacketInfo& pacing_info) {
-  RTC_CHECK_GE(arrival_time_ms + arrival_time_offset_ms_, 0);
-  PacketFeedback packet(arrival_time_ms + arrival_time_offset_ms_, send_time_ms,
-                        sequence_number, payload_size, pacing_info);
-  std::vector<PacketFeedback> packets;
-  packets.push_back(packet);
-  acknowledged_bitrate_estimator_->IncomingPacketFeedbackVector(packets);
-  DelayBasedBwe::Result result =
-      bitrate_estimator_->IncomingPacketFeedbackVector(
-          packets, acknowledged_bitrate_estimator_->bitrate_bps());
-  const uint32_t kDummySsrc = 0;
-  if (result.updated) {
-    bitrate_observer_.OnReceiveBitrateChanged({kDummySsrc},
-                                              result.target_bitrate_bps);
-  }
-}
-
-// Generates a frame of packets belonging to a stream at a given bitrate and
-// with a given ssrc. The stream is pushed through a very simple simulated
-// network, and is then given to the receive-side bandwidth estimator.
-// Returns true if an over-use was seen, false otherwise.
-// The StreamGenerator::updated() should be used to check for any changes in
-// target bitrate after the call to this function.
-bool DelayBasedBweTest::GenerateAndProcessFrame(uint32_t ssrc,
-                                                uint32_t bitrate_bps) {
-  stream_generator_->SetBitrateBps(bitrate_bps);
-  std::vector<PacketFeedback> packets;
-  int64_t next_time_us =
-      stream_generator_->GenerateFrame(&packets, clock_.TimeInMicroseconds());
-  if (packets.empty())
-    return false;
-
-  bool overuse = false;
-  bitrate_observer_.Reset();
-  clock_.AdvanceTimeMicroseconds(1000 * packets.back().arrival_time_ms -
-                                 clock_.TimeInMicroseconds());
-  for (auto& packet : packets) {
-    RTC_CHECK_GE(packet.arrival_time_ms + arrival_time_offset_ms_, 0);
-    packet.arrival_time_ms += arrival_time_offset_ms_;
-  }
-
-  acknowledged_bitrate_estimator_->IncomingPacketFeedbackVector(packets);
-  DelayBasedBwe::Result result =
-      bitrate_estimator_->IncomingPacketFeedbackVector(
-          packets, acknowledged_bitrate_estimator_->bitrate_bps());
-  const uint32_t kDummySsrc = 0;
-  if (result.updated) {
-    bitrate_observer_.OnReceiveBitrateChanged({kDummySsrc},
-                                              result.target_bitrate_bps);
-    if (!first_update_ && result.target_bitrate_bps < bitrate_bps)
-      overuse = true;
-    first_update_ = false;
-  }
-
-  clock_.AdvanceTimeMicroseconds(next_time_us - clock_.TimeInMicroseconds());
-  return overuse;
-}
-
-// Run the bandwidth estimator with a stream of |number_of_frames| frames, or
-// until it reaches |target_bitrate|.
-// Can for instance be used to run the estimator for some time to get it
-// into a steady state.
-uint32_t DelayBasedBweTest::SteadyStateRun(uint32_t ssrc,
-                                           int max_number_of_frames,
-                                           uint32_t start_bitrate,
-                                           uint32_t min_bitrate,
-                                           uint32_t max_bitrate,
-                                           uint32_t target_bitrate) {
-  uint32_t bitrate_bps = start_bitrate;
-  bool bitrate_update_seen = false;
-  // Produce |number_of_frames| frames and give them to the estimator.
-  for (int i = 0; i < max_number_of_frames; ++i) {
-    bool overuse = GenerateAndProcessFrame(ssrc, bitrate_bps);
-    if (overuse) {
-      EXPECT_LT(bitrate_observer_.latest_bitrate(), max_bitrate);
-      EXPECT_GT(bitrate_observer_.latest_bitrate(), min_bitrate);
-      bitrate_bps = bitrate_observer_.latest_bitrate();
-      bitrate_update_seen = true;
-    } else if (bitrate_observer_.updated()) {
-      bitrate_bps = bitrate_observer_.latest_bitrate();
-      bitrate_observer_.Reset();
-    }
-    if (bitrate_update_seen && bitrate_bps > target_bitrate) {
-      break;
-    }
-  }
-  EXPECT_TRUE(bitrate_update_seen);
-  return bitrate_bps;
-}
-
-void DelayBasedBweTest::InitialBehaviorTestHelper(
-    uint32_t expected_converge_bitrate) {
-  const int kFramerate = 50;  // 50 fps to avoid rounding errors.
-  const int kFrameIntervalMs = 1000 / kFramerate;
-  const PacedPacketInfo kPacingInfo(0, 5, 5000);
-  uint32_t bitrate_bps = 0;
-  int64_t send_time_ms = 0;
-  uint16_t sequence_number = 0;
-  std::vector<uint32_t> ssrcs;
-  EXPECT_FALSE(bitrate_estimator_->LatestEstimate(&ssrcs, &bitrate_bps));
-  EXPECT_EQ(0u, ssrcs.size());
-  clock_.AdvanceTimeMilliseconds(1000);
-  EXPECT_FALSE(bitrate_estimator_->LatestEstimate(&ssrcs, &bitrate_bps));
-  EXPECT_FALSE(bitrate_observer_.updated());
-  bitrate_observer_.Reset();
-  clock_.AdvanceTimeMilliseconds(1000);
-  // Inserting packets for 5 seconds to get a valid estimate.
-  for (int i = 0; i < 5 * kFramerate + 1 + kNumInitialPackets; ++i) {
-    // NOTE!!! If the following line is moved under the if case then this test
-    //         wont work on windows realease bots.
-    PacedPacketInfo pacing_info =
-        i < kInitialProbingPackets ? kPacingInfo : PacedPacketInfo();
-
-    if (i == kNumInitialPackets) {
-      EXPECT_FALSE(bitrate_estimator_->LatestEstimate(&ssrcs, &bitrate_bps));
-      EXPECT_EQ(0u, ssrcs.size());
-      EXPECT_FALSE(bitrate_observer_.updated());
-      bitrate_observer_.Reset();
-    }
-    IncomingFeedback(clock_.TimeInMilliseconds(), send_time_ms,
-                     sequence_number++, kMtu, pacing_info);
-    clock_.AdvanceTimeMilliseconds(1000 / kFramerate);
-    send_time_ms += kFrameIntervalMs;
-  }
-  EXPECT_TRUE(bitrate_estimator_->LatestEstimate(&ssrcs, &bitrate_bps));
-  ASSERT_EQ(1u, ssrcs.size());
-  EXPECT_EQ(kDefaultSsrc, ssrcs.front());
-  EXPECT_NEAR(expected_converge_bitrate, bitrate_bps, kAcceptedBitrateErrorBps);
-  EXPECT_TRUE(bitrate_observer_.updated());
-  bitrate_observer_.Reset();
-  EXPECT_EQ(bitrate_observer_.latest_bitrate(), bitrate_bps);
-}
-
-void DelayBasedBweTest::RateIncreaseReorderingTestHelper(
-    uint32_t expected_bitrate_bps) {
-  const int kFramerate = 50;  // 50 fps to avoid rounding errors.
-  const int kFrameIntervalMs = 1000 / kFramerate;
-  const PacedPacketInfo kPacingInfo(0, 5, 5000);
-  int64_t send_time_ms = 0;
-  uint16_t sequence_number = 0;
-  // Inserting packets for five seconds to get a valid estimate.
-  for (int i = 0; i < 5 * kFramerate + 1 + kNumInitialPackets; ++i) {
-    // NOTE!!! If the following line is moved under the if case then this test
-    //         wont work on windows realease bots.
-    PacedPacketInfo pacing_info =
-        i < kInitialProbingPackets ? kPacingInfo : PacedPacketInfo();
-
-    // TODO(sprang): Remove this hack once the single stream estimator is gone,
-    // as it doesn't do anything in Process().
-    if (i == kNumInitialPackets) {
-      // Process after we have enough frames to get a valid input rate estimate.
-
-      EXPECT_FALSE(bitrate_observer_.updated());  // No valid estimate.
-    }
-    IncomingFeedback(clock_.TimeInMilliseconds(), send_time_ms,
-                     sequence_number++, kMtu, pacing_info);
-    clock_.AdvanceTimeMilliseconds(kFrameIntervalMs);
-    send_time_ms += kFrameIntervalMs;
-  }
-  EXPECT_TRUE(bitrate_observer_.updated());
-  EXPECT_NEAR(expected_bitrate_bps, bitrate_observer_.latest_bitrate(),
-              kAcceptedBitrateErrorBps);
-  for (int i = 0; i < 10; ++i) {
-    clock_.AdvanceTimeMilliseconds(2 * kFrameIntervalMs);
-    send_time_ms += 2 * kFrameIntervalMs;
-    IncomingFeedback(clock_.TimeInMilliseconds(), send_time_ms,
-                     sequence_number + 2, 1000);
-    IncomingFeedback(clock_.TimeInMilliseconds(),
-                     send_time_ms - kFrameIntervalMs, sequence_number + 1,
-                     1000);
-    sequence_number += 2;
-  }
-  EXPECT_TRUE(bitrate_observer_.updated());
-  EXPECT_NEAR(expected_bitrate_bps, bitrate_observer_.latest_bitrate(),
-              kAcceptedBitrateErrorBps);
-}
-
-// Make sure we initially increase the bitrate as expected.
-void DelayBasedBweTest::RateIncreaseRtpTimestampsTestHelper(
-    int expected_iterations) {
-  // This threshold corresponds approximately to increasing linearly with
-  // bitrate(i) = 1.04 * bitrate(i-1) + 1000
-  // until bitrate(i) > 500000, with bitrate(1) ~= 30000.
-  uint32_t bitrate_bps = 30000;
-  int iterations = 0;
-  AddDefaultStream();
-  // Feed the estimator with a stream of packets and verify that it reaches
-  // 500 kbps at the expected time.
-  while (bitrate_bps < 5e5) {
-    bool overuse = GenerateAndProcessFrame(kDefaultSsrc, bitrate_bps);
-    if (overuse) {
-      EXPECT_GT(bitrate_observer_.latest_bitrate(), bitrate_bps);
-      bitrate_bps = bitrate_observer_.latest_bitrate();
-      bitrate_observer_.Reset();
-    } else if (bitrate_observer_.updated()) {
-      bitrate_bps = bitrate_observer_.latest_bitrate();
-      bitrate_observer_.Reset();
-    }
-    ++iterations;
-  }
-  ASSERT_EQ(expected_iterations, iterations);
-}
-
-void DelayBasedBweTest::CapacityDropTestHelper(
-    int number_of_streams,
-    bool wrap_time_stamp,
-    uint32_t expected_bitrate_drop_delta,
-    int64_t receiver_clock_offset_change_ms) {
-  const int kFramerate = 30;
-  const int kStartBitrate = 900e3;
-  const int kMinExpectedBitrate = 800e3;
-  const int kMaxExpectedBitrate = 1100e3;
-  const uint32_t kInitialCapacityBps = 1000e3;
-  const uint32_t kReducedCapacityBps = 500e3;
-
-  int steady_state_time = 0;
-  if (number_of_streams <= 1) {
-    steady_state_time = 10;
-    AddDefaultStream();
-  } else {
-    steady_state_time = 10 * number_of_streams;
-    int bitrate_sum = 0;
-    int kBitrateDenom = number_of_streams * (number_of_streams - 1);
-    for (int i = 0; i < number_of_streams; i++) {
-      // First stream gets half available bitrate, while the rest share the
-      // remaining half i.e.: 1/2 = Sum[n/(N*(N-1))] for n=1..N-1 (rounded up)
-      int bitrate = kStartBitrate / 2;
-      if (i > 0) {
-        bitrate = (kStartBitrate * i + kBitrateDenom / 2) / kBitrateDenom;
-      }
-      stream_generator_->AddStream(new test::RtpStream(kFramerate, bitrate));
-      bitrate_sum += bitrate;
-    }
-    ASSERT_EQ(bitrate_sum, kStartBitrate);
-  }
-
-  // Run in steady state to make the estimator converge.
-  stream_generator_->set_capacity_bps(kInitialCapacityBps);
-  uint32_t bitrate_bps = SteadyStateRun(
-      kDefaultSsrc, steady_state_time * kFramerate, kStartBitrate,
-      kMinExpectedBitrate, kMaxExpectedBitrate, kInitialCapacityBps);
-  EXPECT_NEAR(kInitialCapacityBps, bitrate_bps, 180000u);
-  bitrate_observer_.Reset();
-
-  // Add an offset to make sure the BWE can handle it.
-  arrival_time_offset_ms_ += receiver_clock_offset_change_ms;
-
-  // Reduce the capacity and verify the decrease time.
-  stream_generator_->set_capacity_bps(kReducedCapacityBps);
-  int64_t overuse_start_time = clock_.TimeInMilliseconds();
-  int64_t bitrate_drop_time = -1;
-  for (int i = 0; i < 100 * number_of_streams; ++i) {
-    GenerateAndProcessFrame(kDefaultSsrc, bitrate_bps);
-    if (bitrate_drop_time == -1 &&
-        bitrate_observer_.latest_bitrate() <= kReducedCapacityBps) {
-      bitrate_drop_time = clock_.TimeInMilliseconds();
-    }
-    if (bitrate_observer_.updated())
-      bitrate_bps = bitrate_observer_.latest_bitrate();
-  }
-
-  EXPECT_NEAR(expected_bitrate_drop_delta,
-              bitrate_drop_time - overuse_start_time, 33);
-}
-
-void DelayBasedBweTest::TestTimestampGroupingTestHelper() {
-  const int kFramerate = 50;  // 50 fps to avoid rounding errors.
-  const int kFrameIntervalMs = 1000 / kFramerate;
-  int64_t send_time_ms = 0;
-  uint16_t sequence_number = 0;
-  // Initial set of frames to increase the bitrate. 6 seconds to have enough
-  // time for the first estimate to be generated and for Process() to be called.
-  for (int i = 0; i <= 6 * kFramerate; ++i) {
-    IncomingFeedback(clock_.TimeInMilliseconds(), send_time_ms,
-                     sequence_number++, 1000);
-
-    clock_.AdvanceTimeMilliseconds(kFrameIntervalMs);
-    send_time_ms += kFrameIntervalMs;
-  }
-  EXPECT_TRUE(bitrate_observer_.updated());
-  EXPECT_GE(bitrate_observer_.latest_bitrate(), 400000u);
-
-  // Insert batches of frames which were sent very close in time. Also simulate
-  // capacity over-use to see that we back off correctly.
-  const int kTimestampGroupLength = 15;
-  for (int i = 0; i < 100; ++i) {
-    for (int j = 0; j < kTimestampGroupLength; ++j) {
-      // Insert |kTimestampGroupLength| frames with just 1 timestamp ticks in
-      // between. Should be treated as part of the same group by the estimator.
-      IncomingFeedback(clock_.TimeInMilliseconds(), send_time_ms,
-                       sequence_number++, 100);
-      clock_.AdvanceTimeMilliseconds(kFrameIntervalMs / kTimestampGroupLength);
-      send_time_ms += 1;
-    }
-    // Increase time until next batch to simulate over-use.
-    clock_.AdvanceTimeMilliseconds(10);
-    send_time_ms += kFrameIntervalMs - kTimestampGroupLength;
-  }
-  EXPECT_TRUE(bitrate_observer_.updated());
-  // Should have reduced the estimate.
-  EXPECT_LT(bitrate_observer_.latest_bitrate(), 400000u);
-}
-
-void DelayBasedBweTest::TestWrappingHelper(int silence_time_s) {
-  const int kFramerate = 100;
-  const int kFrameIntervalMs = 1000 / kFramerate;
-  int64_t send_time_ms = 0;
-  uint16_t sequence_number = 0;
-
-  for (size_t i = 0; i < 3000; ++i) {
-    IncomingFeedback(clock_.TimeInMilliseconds(), send_time_ms,
-                     sequence_number++, 1000);
-    clock_.AdvanceTimeMilliseconds(kFrameIntervalMs);
-    send_time_ms += kFrameIntervalMs;
-  }
-  uint32_t bitrate_before = 0;
-  std::vector<uint32_t> ssrcs;
-  bitrate_estimator_->LatestEstimate(&ssrcs, &bitrate_before);
-
-  clock_.AdvanceTimeMilliseconds(silence_time_s * 1000);
-  send_time_ms += silence_time_s * 1000;
-
-  for (size_t i = 0; i < 24; ++i) {
-    IncomingFeedback(clock_.TimeInMilliseconds(), send_time_ms,
-                     sequence_number++, 1000);
-    clock_.AdvanceTimeMilliseconds(2 * kFrameIntervalMs);
-    send_time_ms += kFrameIntervalMs;
-  }
-  uint32_t bitrate_after = 0;
-  bitrate_estimator_->LatestEstimate(&ssrcs, &bitrate_after);
-  EXPECT_LT(bitrate_after, bitrate_before);
-}
-}  // namespace webrtc
diff --git a/modules/congestion_controller/delay_based_bwe_unittest_helper.h b/modules/congestion_controller/delay_based_bwe_unittest_helper.h
deleted file mode 100644
index 2210a2e..0000000
--- a/modules/congestion_controller/delay_based_bwe_unittest_helper.h
+++ /dev/null
@@ -1,178 +0,0 @@
-/*
- *  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_CONGESTION_CONTROLLER_DELAY_BASED_BWE_UNITTEST_HELPER_H_
-#define WEBRTC_MODULES_CONGESTION_CONTROLLER_DELAY_BASED_BWE_UNITTEST_HELPER_H_
-
-#include <list>
-#include <map>
-#include <memory>
-#include <utility>
-#include <vector>
-
-#include "webrtc/modules/congestion_controller/acknowledged_bitrate_estimator.h"
-#include "webrtc/modules/congestion_controller/delay_based_bwe.h"
-#include "webrtc/modules/remote_bitrate_estimator/include/remote_bitrate_estimator.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/system_wrappers/include/clock.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-namespace test {
-
-class TestBitrateObserver : public RemoteBitrateObserver {
- public:
-  TestBitrateObserver() : updated_(false), latest_bitrate_(0) {}
-  virtual ~TestBitrateObserver() {}
-
-  void OnReceiveBitrateChanged(const std::vector<uint32_t>& ssrcs,
-                               uint32_t bitrate) override;
-
-  void Reset() { updated_ = false; }
-
-  bool updated() const { return updated_; }
-
-  uint32_t latest_bitrate() const { return latest_bitrate_; }
-
- private:
-  bool updated_;
-  uint32_t latest_bitrate_;
-};
-
-class RtpStream {
- public:
-  enum { kSendSideOffsetUs = 1000000 };
-
-  RtpStream(int fps, int bitrate_bps);
-
-  // Generates a new frame for this stream. If called too soon after the
-  // previous frame, no frame will be generated. The frame is split into
-  // packets.
-  int64_t GenerateFrame(int64_t time_now_us,
-                        std::vector<PacketFeedback>* packets);
-
-  // The send-side time when the next frame can be generated.
-  int64_t next_rtp_time() const;
-
-  void set_bitrate_bps(int bitrate_bps);
-
-  int bitrate_bps() const;
-
-  static bool Compare(const std::unique_ptr<RtpStream>& lhs,
-                      const std::unique_ptr<RtpStream>& rhs);
-
- private:
-  int fps_;
-  int bitrate_bps_;
-  int64_t next_rtp_time_;
-  uint16_t sequence_number_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(RtpStream);
-};
-
-class StreamGenerator {
- public:
-  StreamGenerator(int capacity, int64_t time_now);
-
-  // Add a new stream.
-  void AddStream(RtpStream* stream);
-
-  // Set the link capacity.
-  void set_capacity_bps(int capacity_bps);
-
-  // Divides |bitrate_bps| among all streams. The allocated bitrate per stream
-  // is decided by the initial allocation ratios.
-  void SetBitrateBps(int bitrate_bps);
-
-  // Set the RTP timestamp offset for the stream identified by |ssrc|.
-  void set_rtp_timestamp_offset(uint32_t ssrc, uint32_t offset);
-
-  // TODO(holmer): Break out the channel simulation part from this class to make
-  // it possible to simulate different types of channels.
-  int64_t GenerateFrame(std::vector<PacketFeedback>* packets,
-                        int64_t time_now_us);
-
- private:
-  // Capacity of the simulated channel in bits per second.
-  int capacity_;
-  // The time when the last packet arrived.
-  int64_t prev_arrival_time_us_;
-  // All streams being transmitted on this simulated channel.
-  std::vector<std::unique_ptr<RtpStream>> streams_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(StreamGenerator);
-};
-}  // namespace test
-
-class DelayBasedBweTest : public ::testing::Test {
- public:
-  DelayBasedBweTest();
-  virtual ~DelayBasedBweTest();
-
- protected:
-  void AddDefaultStream();
-
-  // Helpers to insert a single packet into the delay-based BWE.
-  void IncomingFeedback(int64_t arrival_time_ms,
-                        int64_t send_time_ms,
-                        uint16_t sequence_number,
-                        size_t payload_size);
-  void IncomingFeedback(int64_t arrival_time_ms,
-                        int64_t send_time_ms,
-                        uint16_t sequence_number,
-                        size_t payload_size,
-                        const PacedPacketInfo& pacing_info);
-
-  // Generates a frame of packets belonging to a stream at a given bitrate and
-  // with a given ssrc. The stream is pushed through a very simple simulated
-  // network, and is then given to the receive-side bandwidth estimator.
-  // Returns true if an over-use was seen, false otherwise.
-  // The StreamGenerator::updated() should be used to check for any changes in
-  // target bitrate after the call to this function.
-  bool GenerateAndProcessFrame(uint32_t ssrc, uint32_t bitrate_bps);
-
-  // Run the bandwidth estimator with a stream of |number_of_frames| frames, or
-  // until it reaches |target_bitrate|.
-  // Can for instance be used to run the estimator for some time to get it
-  // into a steady state.
-  uint32_t SteadyStateRun(uint32_t ssrc,
-                          int number_of_frames,
-                          uint32_t start_bitrate,
-                          uint32_t min_bitrate,
-                          uint32_t max_bitrate,
-                          uint32_t target_bitrate);
-
-  void TestTimestampGroupingTestHelper();
-
-  void TestWrappingHelper(int silence_time_s);
-
-  void InitialBehaviorTestHelper(uint32_t expected_converge_bitrate);
-  void RateIncreaseReorderingTestHelper(uint32_t expected_bitrate);
-  void RateIncreaseRtpTimestampsTestHelper(int expected_iterations);
-  void CapacityDropTestHelper(int number_of_streams,
-                              bool wrap_time_stamp,
-                              uint32_t expected_bitrate_drop_delta,
-                              int64_t receiver_clock_offset_change_ms);
-
-  static const uint32_t kDefaultSsrc;
-
-  SimulatedClock clock_;  // Time at the receiver.
-  test::TestBitrateObserver bitrate_observer_;
-  std::unique_ptr<AcknowledgedBitrateEstimator> acknowledged_bitrate_estimator_;
-  std::unique_ptr<DelayBasedBwe> bitrate_estimator_;
-  std::unique_ptr<test::StreamGenerator> stream_generator_;
-  int64_t arrival_time_offset_ms_;
-  bool first_update_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(DelayBasedBweTest);
-};
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_CONGESTION_CONTROLLER_DELAY_BASED_BWE_UNITTEST_HELPER_H_
diff --git a/modules/congestion_controller/include/mock/mock_congestion_observer.h b/modules/congestion_controller/include/mock/mock_congestion_observer.h
deleted file mode 100644
index 5433f29..0000000
--- a/modules/congestion_controller/include/mock/mock_congestion_observer.h
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- *  Copyright (c) 2015 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_CONGESTION_CONTROLLER_INCLUDE_MOCK_MOCK_CONGESTION_OBSERVER_H_
-#define WEBRTC_MODULES_CONGESTION_CONTROLLER_INCLUDE_MOCK_MOCK_CONGESTION_OBSERVER_H_
-
-#include "webrtc/modules/congestion_controller/include/send_side_congestion_controller.h"
-#include "webrtc/test/gmock.h"
-
-namespace webrtc {
-namespace test {
-
-class MockCongestionObserver : public SendSideCongestionController::Observer {
- public:
-  MOCK_METHOD4(OnNetworkChanged,
-               void(uint32_t bitrate_bps,
-                    uint8_t fraction_loss,
-                    int64_t rtt_ms,
-                    int64_t probing_interval_ms));
-};
-
-}  // namespace test
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_CONGESTION_CONTROLLER_INCLUDE_MOCK_MOCK_CONGESTION_OBSERVER_H_
diff --git a/modules/congestion_controller/include/mock/mock_send_side_congestion_controller.h b/modules/congestion_controller/include/mock/mock_send_side_congestion_controller.h
deleted file mode 100644
index 899a960..0000000
--- a/modules/congestion_controller/include/mock/mock_send_side_congestion_controller.h
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- *  Copyright (c) 2017 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_CONGESTION_CONTROLLER_INCLUDE_MOCK_MOCK_SEND_SIDE_CONGESTION_CONTROLLER_H_
-#define WEBRTC_MODULES_CONGESTION_CONTROLLER_INCLUDE_MOCK_MOCK_SEND_SIDE_CONGESTION_CONTROLLER_H_
-
-#include "webrtc/modules/congestion_controller/include/send_side_congestion_controller.h"
-#include "webrtc/test/gmock.h"
-
-namespace webrtc {
-namespace test {
-
-class MockSendSideCongestionController : public SendSideCongestionController {
- public:
-  MockSendSideCongestionController(const Clock* clock,
-                                   RtcEventLog* event_log,
-                                   PacedSender* paced_sender)
-      : SendSideCongestionController(clock,
-                                     nullptr /* observer */,
-                                     event_log,
-                                     paced_sender) {}
-
-  MOCK_METHOD3(SetBweBitrates,
-               void(int min_bitrate_bps,
-                    int start_bitrate_bps,
-                    int max_bitrate_bps));
-};
-
-}  // namespace test
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_CONGESTION_CONTROLLER_INCLUDE_MOCK_MOCK_SEND_SIDE_CONGESTION_CONTROLLER_H_
diff --git a/modules/congestion_controller/include/receive_side_congestion_controller.h b/modules/congestion_controller/include/receive_side_congestion_controller.h
deleted file mode 100644
index 2960729..0000000
--- a/modules/congestion_controller/include/receive_side_congestion_controller.h
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- *  Copyright (c) 2017 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_CONGESTION_CONTROLLER_INCLUDE_RECEIVE_SIDE_CONGESTION_CONTROLLER_H_
-#define WEBRTC_MODULES_CONGESTION_CONTROLLER_INCLUDE_RECEIVE_SIDE_CONGESTION_CONTROLLER_H_
-
-#include <memory>
-#include <vector>
-
-#include "webrtc/modules/remote_bitrate_estimator/remote_estimator_proxy.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/criticalsection.h"
-
-namespace webrtc {
-class RemoteBitrateEstimator;
-class RemoteBitrateObserver;
-
-// This class represents the congestion control state for receive
-// streams. For send side bandwidth estimation, this is simply
-// relaying for each received RTP packet back to the sender. While for
-// receive side bandwidth estimation, we do the estimation locally and
-// send our results back to the sender.
-class ReceiveSideCongestionController : public CallStatsObserver,
-                                        public Module {
- public:
-  ReceiveSideCongestionController(
-      const Clock* clock,
-      PacketRouter* packet_router);
-
-  virtual ~ReceiveSideCongestionController() {}
-
-  virtual void OnReceivedPacket(int64_t arrival_time_ms,
-                                size_t payload_size,
-                                const RTPHeader& header);
-
-  // TODO(nisse): Delete these methods, design a more specific interface.
-  virtual RemoteBitrateEstimator* GetRemoteBitrateEstimator(bool send_side_bwe);
-  virtual const RemoteBitrateEstimator* GetRemoteBitrateEstimator(
-      bool send_side_bwe) const;
-
-  // Implements CallStatsObserver.
-  void OnRttUpdate(int64_t avg_rtt_ms, int64_t max_rtt_ms) override;
-
-  // This is send bitrate, used to control the rate of feedback messages.
-  void OnBitrateChanged(int bitrate_bps);
-
-  // Implements Module.
-  int64_t TimeUntilNextProcess() override;
-  void Process() override;
-
- private:
-  class WrappingBitrateEstimator : public RemoteBitrateEstimator {
-   public:
-    WrappingBitrateEstimator(RemoteBitrateObserver* observer,
-                             const Clock* clock);
-
-    virtual ~WrappingBitrateEstimator() {}
-
-    void IncomingPacket(int64_t arrival_time_ms,
-                        size_t payload_size,
-                        const RTPHeader& header) override;
-
-    void Process() override;
-
-    int64_t TimeUntilNextProcess() override;
-
-    void OnRttUpdate(int64_t avg_rtt_ms, int64_t max_rtt_ms) override;
-
-    void RemoveStream(unsigned int ssrc) override;
-
-    bool LatestEstimate(std::vector<unsigned int>* ssrcs,
-                        unsigned int* bitrate_bps) const override;
-
-    void SetMinBitrate(int min_bitrate_bps) override;
-
-   private:
-    void PickEstimatorFromHeader(const RTPHeader& header)
-        RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_sect_);
-    void PickEstimator() RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_sect_);
-    RemoteBitrateObserver* observer_;
-    const Clock* const clock_;
-    rtc::CriticalSection crit_sect_;
-    std::unique_ptr<RemoteBitrateEstimator> rbe_;
-    bool using_absolute_send_time_;
-    uint32_t packets_since_absolute_send_time_;
-    int min_bitrate_bps_;
-
-    RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(WrappingBitrateEstimator);
-  };
-
-  WrappingBitrateEstimator remote_bitrate_estimator_;
-  RemoteEstimatorProxy remote_estimator_proxy_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_CONGESTION_CONTROLLER_INCLUDE_RECEIVE_SIDE_CONGESTION_CONTROLLER_H_
diff --git a/modules/congestion_controller/include/send_side_congestion_controller.h b/modules/congestion_controller/include/send_side_congestion_controller.h
deleted file mode 100644
index b85b511..0000000
--- a/modules/congestion_controller/include/send_side_congestion_controller.h
+++ /dev/null
@@ -1,162 +0,0 @@
-/*
- *  Copyright (c) 2012 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_CONGESTION_CONTROLLER_INCLUDE_SEND_SIDE_CONGESTION_CONTROLLER_H_
-#define WEBRTC_MODULES_CONGESTION_CONTROLLER_INCLUDE_SEND_SIDE_CONGESTION_CONTROLLER_H_
-
-#include <memory>
-#include <vector>
-
-#include "webrtc/common_types.h"
-#include "webrtc/modules/congestion_controller/delay_based_bwe.h"
-#include "webrtc/modules/congestion_controller/transport_feedback_adapter.h"
-#include "webrtc/modules/include/module.h"
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/modules/pacing/paced_sender.h"
-#include "webrtc/modules/pacing/packet_router.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/networkroute.h"
-#include "webrtc/rtc_base/race_checker.h"
-
-namespace rtc {
-struct SentPacket;
-}
-
-namespace webrtc {
-
-class BitrateController;
-class Clock;
-class AcknowledgedBitrateEstimator;
-class ProbeController;
-class RateLimiter;
-class RtcEventLog;
-
-class SendSideCongestionController : public CallStatsObserver,
-                                     public Module,
-                                     public TransportFeedbackObserver {
- public:
-  // Observer class for bitrate changes announced due to change in bandwidth
-  // estimate or due to that the send pacer is full. Fraction loss and rtt is
-  // also part of this callback to allow the observer to optimize its settings
-  // for different types of network environments. The bitrate does not include
-  // packet headers and is measured in bits per second.
-  class Observer {
-   public:
-    virtual void OnNetworkChanged(uint32_t bitrate_bps,
-                                  uint8_t fraction_loss,  // 0 - 255.
-                                  int64_t rtt_ms,
-                                  int64_t probing_interval_ms) = 0;
-
-   protected:
-    virtual ~Observer() {}
-  };
-  // TODO(holmer): Delete after fixing upstream projects.
-  RTC_DEPRECATED SendSideCongestionController(const Clock* clock,
-                                              Observer* observer,
-                                              RtcEventLog* event_log,
-                                              PacketRouter* packet_router);
-  // TODO(nisse): Consider deleting the |observer| argument to constructors
-  // once CongestionController is deleted.
-  SendSideCongestionController(const Clock* clock,
-                               Observer* observer,
-                               RtcEventLog* event_log,
-                               PacedSender* pacer);
-  ~SendSideCongestionController() override;
-
-  void RegisterPacketFeedbackObserver(PacketFeedbackObserver* observer);
-  void DeRegisterPacketFeedbackObserver(PacketFeedbackObserver* observer);
-
-  // Currently, there can be at most one observer.
-  void RegisterNetworkObserver(Observer* observer);
-  void DeRegisterNetworkObserver(Observer* observer);
-
-  virtual void SetBweBitrates(int min_bitrate_bps,
-                              int start_bitrate_bps,
-                              int max_bitrate_bps);
-  // Resets the BWE state. Note the first argument is the bitrate_bps.
-  virtual void OnNetworkRouteChanged(const rtc::NetworkRoute& network_route,
-                                     int bitrate_bps,
-                                     int min_bitrate_bps,
-                                     int max_bitrate_bps);
-  virtual void SignalNetworkState(NetworkState state);
-  virtual void SetTransportOverhead(size_t transport_overhead_bytes_per_packet);
-
-  virtual BitrateController* GetBitrateController() const;
-  virtual int64_t GetPacerQueuingDelayMs() const;
-  virtual int64_t GetFirstPacketTimeMs() const;
-
-  virtual TransportFeedbackObserver* GetTransportFeedbackObserver();
-
-  RateLimiter* GetRetransmissionRateLimiter();
-  void EnablePeriodicAlrProbing(bool enable);
-
-  virtual void OnSentPacket(const rtc::SentPacket& sent_packet);
-
-  // Implements CallStatsObserver.
-  void OnRttUpdate(int64_t avg_rtt_ms, int64_t max_rtt_ms) override;
-
-  // Implements Module.
-  int64_t TimeUntilNextProcess() override;
-  void Process() override;
-
-  // Implements TransportFeedbackObserver.
-  void AddPacket(uint32_t ssrc,
-                 uint16_t sequence_number,
-                 size_t length,
-                 const PacedPacketInfo& pacing_info) override;
-  void OnTransportFeedback(const rtcp::TransportFeedback& feedback) override;
-  std::vector<PacketFeedback> GetTransportFeedbackVector() const override;
-
- private:
-  void MaybeTriggerOnNetworkChanged();
-
-  bool IsSendQueueFull() const;
-  bool IsNetworkDown() const;
-  bool HasNetworkParametersToReportChanged(uint32_t bitrate_bps,
-                                           uint8_t fraction_loss,
-                                           int64_t rtt);
-  void LimitOutstandingBytes(size_t num_outstanding_bytes);
-  const Clock* const clock_;
-  rtc::CriticalSection observer_lock_;
-  Observer* observer_ RTC_GUARDED_BY(observer_lock_);
-  RtcEventLog* const event_log_;
-  std::unique_ptr<PacedSender> owned_pacer_;
-  PacedSender* pacer_;
-  const std::unique_ptr<BitrateController> bitrate_controller_;
-  std::unique_ptr<AcknowledgedBitrateEstimator> acknowledged_bitrate_estimator_;
-  const std::unique_ptr<ProbeController> probe_controller_;
-  const std::unique_ptr<RateLimiter> retransmission_rate_limiter_;
-  TransportFeedbackAdapter transport_feedback_adapter_;
-  rtc::CriticalSection network_state_lock_;
-  uint32_t last_reported_bitrate_bps_ RTC_GUARDED_BY(network_state_lock_);
-  uint8_t last_reported_fraction_loss_ RTC_GUARDED_BY(network_state_lock_);
-  int64_t last_reported_rtt_ RTC_GUARDED_BY(network_state_lock_);
-  NetworkState network_state_ RTC_GUARDED_BY(network_state_lock_);
-  bool pause_pacer_ RTC_GUARDED_BY(network_state_lock_);
-  // Duplicate the pacer paused state to avoid grabbing a lock when
-  // pausing the pacer. This can be removed when we move this class
-  // over to the task queue.
-  bool pacer_paused_;
-  rtc::CriticalSection bwe_lock_;
-  int min_bitrate_bps_ RTC_GUARDED_BY(bwe_lock_);
-  std::unique_ptr<DelayBasedBwe> delay_based_bwe_ RTC_GUARDED_BY(bwe_lock_);
-  bool in_cwnd_experiment_;
-  int64_t accepted_queue_ms_;
-  bool was_in_alr_;
-
-  rtc::RaceChecker worker_race_;
-
-  RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(SendSideCongestionController);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_CONGESTION_CONTROLLER_INCLUDE_SEND_SIDE_CONGESTION_CONTROLLER_H_
diff --git a/modules/congestion_controller/median_slope_estimator.cc b/modules/congestion_controller/median_slope_estimator.cc
deleted file mode 100644
index ad5133b..0000000
--- a/modules/congestion_controller/median_slope_estimator.cc
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- *  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/congestion_controller/median_slope_estimator.h"
-
-#include <algorithm>
-#include <vector>
-
-#include "webrtc/modules/remote_bitrate_estimator/include/bwe_defines.h"
-#include "webrtc/modules/remote_bitrate_estimator/test/bwe_test_logging.h"
-#include "webrtc/rtc_base/logging.h"
-
-namespace webrtc {
-
-constexpr unsigned int kDeltaCounterMax = 1000;
-
-MedianSlopeEstimator::MedianSlopeEstimator(size_t window_size,
-                                           double threshold_gain)
-    : window_size_(window_size),
-      threshold_gain_(threshold_gain),
-      num_of_deltas_(0),
-      accumulated_delay_(0),
-      delay_hist_(),
-      median_filter_(0.5),
-      trendline_(0) {}
-
-MedianSlopeEstimator::~MedianSlopeEstimator() {}
-
-MedianSlopeEstimator::DelayInfo::DelayInfo(int64_t time,
-                                           double delay,
-                                           size_t slope_count)
-    : time(time), delay(delay) {
-  slopes.reserve(slope_count);
-}
-
-MedianSlopeEstimator::DelayInfo::~DelayInfo() = default;
-
-void MedianSlopeEstimator::Update(double recv_delta_ms,
-                                  double send_delta_ms,
-                                  int64_t arrival_time_ms) {
-  const double delta_ms = recv_delta_ms - send_delta_ms;
-  ++num_of_deltas_;
-  if (num_of_deltas_ > kDeltaCounterMax)
-    num_of_deltas_ = kDeltaCounterMax;
-
-  accumulated_delay_ += delta_ms;
-  BWE_TEST_LOGGING_PLOT(1, "accumulated_delay_ms", arrival_time_ms,
-                        accumulated_delay_);
-
-  // If the window is full, remove the |window_size_| - 1 slopes that belong to
-  // the oldest point.
-  if (delay_hist_.size() == window_size_) {
-    for (double slope : delay_hist_.front().slopes) {
-      const bool success = median_filter_.Erase(slope);
-      RTC_CHECK(success);
-    }
-    delay_hist_.pop_front();
-  }
-  // Add |window_size_| - 1 new slopes.
-  for (auto& old_delay : delay_hist_) {
-    if (arrival_time_ms - old_delay.time != 0) {
-      // The C99 standard explicitly states that casts and assignments must
-      // perform the associated conversions. This means that |slope| will be
-      // a 64-bit double even if the division is computed using, e.g., 80-bit
-      // extended precision. I believe this also holds in C++ even though the
-      // C++11 standard isn't as explicit. Furthermore, there are good reasons
-      // to believe that compilers couldn't perform optimizations that break
-      // this assumption even if they wanted to.
-      double slope = (accumulated_delay_ - old_delay.delay) /
-                     static_cast<double>(arrival_time_ms - old_delay.time);
-      median_filter_.Insert(slope);
-      // We want to avoid issues with different rounding mode / precision
-      // which we might get if we recomputed the slope when we remove it.
-      old_delay.slopes.push_back(slope);
-    }
-  }
-  delay_hist_.emplace_back(arrival_time_ms, accumulated_delay_,
-                           window_size_ - 1);
-  // Recompute the median slope.
-  if (delay_hist_.size() == window_size_)
-    trendline_ = median_filter_.GetPercentileValue();
-
-  BWE_TEST_LOGGING_PLOT(1, "trendline_slope", arrival_time_ms, trendline_);
-}
-
-}  // namespace webrtc
diff --git a/modules/congestion_controller/median_slope_estimator.h b/modules/congestion_controller/median_slope_estimator.h
deleted file mode 100644
index c2c1b7d..0000000
--- a/modules/congestion_controller/median_slope_estimator.h
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- *  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_CONGESTION_CONTROLLER_MEDIAN_SLOPE_ESTIMATOR_H_
-#define WEBRTC_MODULES_CONGESTION_CONTROLLER_MEDIAN_SLOPE_ESTIMATOR_H_
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include <deque>
-#include <vector>
-
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/numerics/percentile_filter.h"
-
-namespace webrtc {
-
-class MedianSlopeEstimator {
- public:
-  // |window_size| is the number of points required to compute a trend line.
-  // |threshold_gain| is used to scale the trendline slope for comparison to
-  // the old threshold. Once the old estimator has been removed (or the
-  // thresholds been merged into the estimators), we can just set the
-  // threshold instead of setting a gain.
-  MedianSlopeEstimator(size_t window_size, double threshold_gain);
-  ~MedianSlopeEstimator();
-
-  // Update the estimator with a new sample. The deltas should represent deltas
-  // between timestamp groups as defined by the InterArrival class.
-  void Update(double recv_delta_ms,
-              double send_delta_ms,
-              int64_t arrival_time_ms);
-
-  // Returns the estimated trend k multiplied by some gain.
-  // 0 < k < 1   ->  the delay increases, queues are filling up
-  //   k == 0    ->  the delay does not change
-  //   k <  0    ->  the delay decreases, queues are being emptied
-  double trendline_slope() const { return trendline_ * threshold_gain_; }
-
-  // Returns the number of deltas which the current estimator state is based on.
-  unsigned int num_of_deltas() const { return num_of_deltas_; }
-
- private:
-  struct DelayInfo {
-    DelayInfo(int64_t time, double delay, size_t slope_count);
-    ~DelayInfo();
-    int64_t time;
-    double delay;
-    std::vector<double> slopes;
-  };
-  // Parameters.
-  const size_t window_size_;
-  const double threshold_gain_;
-  // Used by the existing threshold.
-  unsigned int num_of_deltas_;
-  // Theil-Sen robust line fitting
-  double accumulated_delay_;
-  std::deque<DelayInfo> delay_hist_;
-  PercentileFilter<double> median_filter_;
-  double trendline_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(MedianSlopeEstimator);
-};
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_CONGESTION_CONTROLLER_MEDIAN_SLOPE_ESTIMATOR_H_
diff --git a/modules/congestion_controller/median_slope_estimator_unittest.cc b/modules/congestion_controller/median_slope_estimator_unittest.cc
deleted file mode 100644
index 4dabd50e..0000000
--- a/modules/congestion_controller/median_slope_estimator_unittest.cc
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- *  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/congestion_controller/median_slope_estimator.h"
-#include "webrtc/rtc_base/random.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-namespace {
-constexpr size_t kWindowSize = 20;
-constexpr double kGain = 1;
-constexpr int64_t kAvgTimeBetweenPackets = 10;
-constexpr size_t kPacketCount = 2 * kWindowSize + 1;
-
-void TestEstimator(double slope, double jitter_stddev, double tolerance) {
-  MedianSlopeEstimator estimator(kWindowSize, kGain);
-  Random random(0x1234567);
-  int64_t send_times[kPacketCount];
-  int64_t recv_times[kPacketCount];
-  int64_t send_start_time = random.Rand(1000000);
-  int64_t recv_start_time = random.Rand(1000000);
-  for (size_t i = 0; i < kPacketCount; ++i) {
-    send_times[i] = send_start_time + i * kAvgTimeBetweenPackets;
-    double latency = i * kAvgTimeBetweenPackets / (1 - slope);
-    double jitter = random.Gaussian(0, jitter_stddev);
-    recv_times[i] = recv_start_time + latency + jitter;
-  }
-  for (size_t i = 1; i < kPacketCount; ++i) {
-    double recv_delta = recv_times[i] - recv_times[i - 1];
-    double send_delta = send_times[i] - send_times[i - 1];
-    estimator.Update(recv_delta, send_delta, recv_times[i]);
-    if (i < kWindowSize)
-      EXPECT_NEAR(estimator.trendline_slope(), 0, 0.001);
-    else
-      EXPECT_NEAR(estimator.trendline_slope(), slope, tolerance);
-  }
-}
-}  // namespace
-
-TEST(MedianSlopeEstimator, PerfectLineSlopeOneHalf) {
-  TestEstimator(0.5, 0, 0.001);
-}
-
-TEST(MedianSlopeEstimator, PerfectLineSlopeMinusOne) {
-  TestEstimator(-1, 0, 0.001);
-}
-
-TEST(MedianSlopeEstimator, PerfectLineSlopeZero) {
-  TestEstimator(0, 0, 0.001);
-}
-
-TEST(MedianSlopeEstimator, JitteryLineSlopeOneHalf) {
-  TestEstimator(0.5, kAvgTimeBetweenPackets / 3.0, 0.01);
-}
-
-TEST(MedianSlopeEstimator, JitteryLineSlopeMinusOne) {
-  TestEstimator(-1, kAvgTimeBetweenPackets / 3.0, 0.05);
-}
-
-TEST(MedianSlopeEstimator, JitteryLineSlopeZero) {
-  TestEstimator(0, kAvgTimeBetweenPackets / 3.0, 0.02);
-}
-
-}  // namespace webrtc
diff --git a/modules/congestion_controller/probe_bitrate_estimator.cc b/modules/congestion_controller/probe_bitrate_estimator.cc
deleted file mode 100644
index 8fa22e7..0000000
--- a/modules/congestion_controller/probe_bitrate_estimator.cc
+++ /dev/null
@@ -1,179 +0,0 @@
-/*
- *  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/congestion_controller/probe_bitrate_estimator.h"
-
-#include <algorithm>
-
-#include "webrtc/logging/rtc_event_log/rtc_event_log.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-
-namespace {
-// The minumum number of probes we need to receive feedback about in percent
-// in order to have a valid estimate.
-constexpr int kMinReceivedProbesPercent = 80;
-
-// The minumum number of bytes we need to receive feedback about in percent
-// in order to have a valid estimate.
-constexpr int kMinReceivedBytesPercent = 80;
-
-// The maximum |receive rate| / |send rate| ratio for a valid estimate.
-constexpr float kMaxValidRatio = 2.0f;
-
-// The minimum |receive rate| / |send rate| ratio assuming that the link is
-// not saturated, i.e. we assume that we will receive at least
-// kMinRatioForUnsaturatedLink * |send rate| if |send rate| is less than the
-// link capacity.
-constexpr float kMinRatioForUnsaturatedLink = 0.9f;
-
-// The target utilization of the link. If we know true link capacity
-// we'd like to send at 95% of that rate.
-constexpr float kTargetUtilizationFraction = 0.95f;
-
-// The maximum time period over which the cluster history is retained.
-// This is also the maximum time period beyond which a probing burst is not
-// expected to last.
-constexpr int kMaxClusterHistoryMs = 1000;
-
-// The maximum time interval between first and the last probe on a cluster
-// on the sender side as well as the receive side.
-constexpr int kMaxProbeIntervalMs = 1000;
-}  // namespace
-
-namespace webrtc {
-
-ProbeBitrateEstimator::ProbeBitrateEstimator(RtcEventLog* event_log)
-    : event_log_(event_log) {}
-
-ProbeBitrateEstimator::~ProbeBitrateEstimator() = default;
-
-int ProbeBitrateEstimator::HandleProbeAndEstimateBitrate(
-    const PacketFeedback& packet_feedback) {
-  int cluster_id = packet_feedback.pacing_info.probe_cluster_id;
-  RTC_DCHECK_NE(cluster_id, PacedPacketInfo::kNotAProbe);
-
-  EraseOldClusters(packet_feedback.arrival_time_ms - kMaxClusterHistoryMs);
-
-  int payload_size_bits = packet_feedback.payload_size * 8;
-  AggregatedCluster* cluster = &clusters_[cluster_id];
-
-  if (packet_feedback.send_time_ms < cluster->first_send_ms) {
-    cluster->first_send_ms = packet_feedback.send_time_ms;
-  }
-  if (packet_feedback.send_time_ms > cluster->last_send_ms) {
-    cluster->last_send_ms = packet_feedback.send_time_ms;
-    cluster->size_last_send = payload_size_bits;
-  }
-  if (packet_feedback.arrival_time_ms < cluster->first_receive_ms) {
-    cluster->first_receive_ms = packet_feedback.arrival_time_ms;
-    cluster->size_first_receive = payload_size_bits;
-  }
-  if (packet_feedback.arrival_time_ms > cluster->last_receive_ms) {
-    cluster->last_receive_ms = packet_feedback.arrival_time_ms;
-  }
-  cluster->size_total += payload_size_bits;
-  cluster->num_probes += 1;
-
-  RTC_DCHECK_GT(packet_feedback.pacing_info.probe_cluster_min_probes, 0);
-  RTC_DCHECK_GT(packet_feedback.pacing_info.probe_cluster_min_bytes, 0);
-
-  int min_probes = packet_feedback.pacing_info.probe_cluster_min_probes *
-                   kMinReceivedProbesPercent / 100;
-  int min_bytes = packet_feedback.pacing_info.probe_cluster_min_bytes *
-                  kMinReceivedBytesPercent / 100;
-  if (cluster->num_probes < min_probes || cluster->size_total < min_bytes * 8)
-    return -1;
-
-  float send_interval_ms = cluster->last_send_ms - cluster->first_send_ms;
-  float receive_interval_ms =
-      cluster->last_receive_ms - cluster->first_receive_ms;
-
-  if (send_interval_ms <= 0 || send_interval_ms > kMaxProbeIntervalMs ||
-      receive_interval_ms <= 0 || receive_interval_ms > kMaxProbeIntervalMs) {
-    LOG(LS_INFO) << "Probing unsuccessful, invalid send/receive interval"
-                 << " [cluster id: " << cluster_id
-                 << "] [send interval: " << send_interval_ms << " ms]"
-                 << " [receive interval: " << receive_interval_ms << " ms]";
-    if (event_log_) {
-      event_log_->LogProbeResultFailure(cluster_id,
-                                        kInvalidSendReceiveInterval);
-    }
-    return -1;
-  }
-  // Since the |send_interval_ms| does not include the time it takes to actually
-  // send the last packet the size of the last sent packet should not be
-  // included when calculating the send bitrate.
-  RTC_DCHECK_GT(cluster->size_total, cluster->size_last_send);
-  float send_size = cluster->size_total - cluster->size_last_send;
-  float send_bps = send_size / send_interval_ms * 1000;
-
-  // Since the |receive_interval_ms| does not include the time it takes to
-  // actually receive the first packet the size of the first received packet
-  // should not be included when calculating the receive bitrate.
-  RTC_DCHECK_GT(cluster->size_total, cluster->size_first_receive);
-  float receive_size = cluster->size_total - cluster->size_first_receive;
-  float receive_bps = receive_size / receive_interval_ms * 1000;
-
-  float ratio = receive_bps / send_bps;
-  if (ratio > kMaxValidRatio) {
-    LOG(LS_INFO) << "Probing unsuccessful, receive/send ratio too high"
-                 << " [cluster id: " << cluster_id << "] [send: " << send_size
-                 << " bytes / " << send_interval_ms
-                 << " ms = " << send_bps / 1000 << " kb/s]"
-                 << " [receive: " << receive_size << " bytes / "
-                 << receive_interval_ms << " ms = " << receive_bps / 1000
-                 << " kb/s]"
-                 << " [ratio: " << receive_bps / 1000 << " / "
-                 << send_bps / 1000 << " = " << ratio << " > kMaxValidRatio ("
-                 << kMaxValidRatio << ")]";
-    if (event_log_)
-      event_log_->LogProbeResultFailure(cluster_id, kInvalidSendReceiveRatio);
-    return -1;
-  }
-  LOG(LS_INFO) << "Probing successful"
-               << " [cluster id: " << cluster_id << "] [send: " << send_size
-               << " bytes / " << send_interval_ms << " ms = " << send_bps / 1000
-               << " kb/s]"
-               << " [receive: " << receive_size << " bytes / "
-               << receive_interval_ms << " ms = " << receive_bps / 1000
-               << " kb/s]";
-
-  float res = std::min(send_bps, receive_bps);
-  // If we're receiving at significantly lower bitrate than we were sending at,
-  // it suggests that we've found the true capacity of the link. In this case,
-  // set the target bitrate slightly lower to not immediately overuse.
-  if (receive_bps < kMinRatioForUnsaturatedLink * send_bps) {
-    RTC_DCHECK_GT(send_bps, receive_bps);
-    res = kTargetUtilizationFraction * receive_bps;
-  }
-  if (event_log_)
-    event_log_->LogProbeResultSuccess(cluster_id, res);
-  estimated_bitrate_bps_ = rtc::Optional<int>(res);
-  return *estimated_bitrate_bps_;
-}
-
-rtc::Optional<int>
-ProbeBitrateEstimator::FetchAndResetLastEstimatedBitrateBps() {
-  rtc::Optional<int> estimated_bitrate_bps = estimated_bitrate_bps_;
-  estimated_bitrate_bps_.reset();
-  return estimated_bitrate_bps;
-}
-
-void ProbeBitrateEstimator::EraseOldClusters(int64_t timestamp_ms) {
-  for (auto it = clusters_.begin(); it != clusters_.end();) {
-    if (it->second.last_receive_ms < timestamp_ms) {
-      it = clusters_.erase(it);
-    } else {
-      ++it;
-    }
-  }
-}
-}  // namespace webrtc
diff --git a/modules/congestion_controller/probe_bitrate_estimator.h b/modules/congestion_controller/probe_bitrate_estimator.h
deleted file mode 100644
index 1666a1a..0000000
--- a/modules/congestion_controller/probe_bitrate_estimator.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- *  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_CONGESTION_CONTROLLER_PROBE_BITRATE_ESTIMATOR_H_
-#define WEBRTC_MODULES_CONGESTION_CONTROLLER_PROBE_BITRATE_ESTIMATOR_H_
-
-#include <map>
-#include <limits>
-
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
-
-namespace webrtc {
-class RtcEventLog;
-
-class ProbeBitrateEstimator {
- public:
-  explicit ProbeBitrateEstimator(RtcEventLog* event_log);
-  ~ProbeBitrateEstimator();
-
-  // Should be called for every probe packet we receive feedback about.
-  // Returns the estimated bitrate if the probe completes a valid cluster.
-  int HandleProbeAndEstimateBitrate(const PacketFeedback& packet_feedback);
-
-  rtc::Optional<int> FetchAndResetLastEstimatedBitrateBps();
-
- private:
-  struct AggregatedCluster {
-    int num_probes = 0;
-    int64_t first_send_ms = std::numeric_limits<int64_t>::max();
-    int64_t last_send_ms = 0;
-    int64_t first_receive_ms = std::numeric_limits<int64_t>::max();
-    int64_t last_receive_ms = 0;
-    int size_last_send = 0;
-    int size_first_receive = 0;
-    int size_total = 0;
-  };
-
-  // Erases old cluster data that was seen before |timestamp_ms|.
-  void EraseOldClusters(int64_t timestamp_ms);
-
-  std::map<int, AggregatedCluster> clusters_;
-  RtcEventLog* const event_log_;
-  rtc::Optional<int> estimated_bitrate_bps_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_CONGESTION_CONTROLLER_PROBE_BITRATE_ESTIMATOR_H_
diff --git a/modules/congestion_controller/probe_bitrate_estimator_unittest.cc b/modules/congestion_controller/probe_bitrate_estimator_unittest.cc
deleted file mode 100644
index 7aa3f45..0000000
--- a/modules/congestion_controller/probe_bitrate_estimator_unittest.cc
+++ /dev/null
@@ -1,221 +0,0 @@
-/*
- *  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/congestion_controller/probe_bitrate_estimator.h"
-
-#include <vector>
-#include <utility>
-
-#include "webrtc/modules/remote_bitrate_estimator/aimd_rate_control.h"
-#include "webrtc/test/gmock.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-namespace {
-constexpr int kInvalidBitrate = -1;
-constexpr int kDefaultMinProbes = 5;
-constexpr int kDefaultMinBytes = 5000;
-constexpr float kTargetUtilizationFraction = 0.95f;
-}  // anonymous namespace
-
-class TestProbeBitrateEstimator : public ::testing::Test {
- public:
-  TestProbeBitrateEstimator() : probe_bitrate_estimator_(nullptr) {}
-
-  // TODO(philipel): Use PacedPacketInfo when ProbeBitrateEstimator is rewritten
-  //                 to use that information.
-  void AddPacketFeedback(int probe_cluster_id,
-                         size_t size_bytes,
-                         int64_t send_time_ms,
-                         int64_t arrival_time_ms,
-                         int min_probes = kDefaultMinProbes,
-                         int min_bytes = kDefaultMinBytes) {
-    PacedPacketInfo pacing_info(probe_cluster_id, min_probes, min_bytes);
-    PacketFeedback packet_feedback(arrival_time_ms, send_time_ms, 0, size_bytes,
-                                   pacing_info);
-    measured_bps_ =
-        probe_bitrate_estimator_.HandleProbeAndEstimateBitrate(packet_feedback);
-  }
-
- protected:
-  int measured_bps_ = kInvalidBitrate;
-  ProbeBitrateEstimator probe_bitrate_estimator_;
-};
-
-TEST_F(TestProbeBitrateEstimator, OneCluster) {
-  AddPacketFeedback(0, 1000, 0, 10);
-  AddPacketFeedback(0, 1000, 10, 20);
-  AddPacketFeedback(0, 1000, 20, 30);
-  AddPacketFeedback(0, 1000, 30, 40);
-
-  EXPECT_NEAR(measured_bps_, 800000, 10);
-}
-
-TEST_F(TestProbeBitrateEstimator, OneClusterTooFewProbes) {
-  AddPacketFeedback(0, 2000, 0, 10);
-  AddPacketFeedback(0, 2000, 10, 20);
-  AddPacketFeedback(0, 2000, 20, 30);
-
-  EXPECT_EQ(kInvalidBitrate, measured_bps_);
-}
-
-TEST_F(TestProbeBitrateEstimator, OneClusterTooFewBytes) {
-  const int kMinBytes = 6000;
-  AddPacketFeedback(0, 800, 0, 10, kDefaultMinProbes, kMinBytes);
-  AddPacketFeedback(0, 800, 10, 20, kDefaultMinProbes, kMinBytes);
-  AddPacketFeedback(0, 800, 20, 30, kDefaultMinProbes, kMinBytes);
-  AddPacketFeedback(0, 800, 30, 40, kDefaultMinProbes, kMinBytes);
-  AddPacketFeedback(0, 800, 40, 50, kDefaultMinProbes, kMinBytes);
-
-  EXPECT_EQ(kInvalidBitrate, measured_bps_);
-}
-
-TEST_F(TestProbeBitrateEstimator, SmallCluster) {
-  const int kMinBytes = 1000;
-  AddPacketFeedback(0, 150, 0, 10, kDefaultMinProbes, kMinBytes);
-  AddPacketFeedback(0, 150, 10, 20, kDefaultMinProbes, kMinBytes);
-  AddPacketFeedback(0, 150, 20, 30, kDefaultMinProbes, kMinBytes);
-  AddPacketFeedback(0, 150, 30, 40, kDefaultMinProbes, kMinBytes);
-  AddPacketFeedback(0, 150, 40, 50, kDefaultMinProbes, kMinBytes);
-  AddPacketFeedback(0, 150, 50, 60, kDefaultMinProbes, kMinBytes);
-  EXPECT_NEAR(measured_bps_, 120000, 10);
-}
-
-TEST_F(TestProbeBitrateEstimator, LargeCluster) {
-  const int kMinProbes = 30;
-  const int kMinBytes = 312500;
-
-  int64_t send_time = 0;
-  int64_t receive_time = 5;
-  for (int i = 0; i < 25; ++i) {
-    AddPacketFeedback(0, 12500, send_time, receive_time, kMinProbes, kMinBytes);
-    ++send_time;
-    ++receive_time;
-  }
-  EXPECT_NEAR(measured_bps_, 100000000, 10);
-}
-
-TEST_F(TestProbeBitrateEstimator, FastReceive) {
-  AddPacketFeedback(0, 1000, 0, 15);
-  AddPacketFeedback(0, 1000, 10, 30);
-  AddPacketFeedback(0, 1000, 20, 35);
-  AddPacketFeedback(0, 1000, 30, 40);
-
-  EXPECT_NEAR(measured_bps_, 800000, 10);
-}
-
-TEST_F(TestProbeBitrateEstimator, TooFastReceive) {
-  AddPacketFeedback(0, 1000, 0, 19);
-  AddPacketFeedback(0, 1000, 10, 22);
-  AddPacketFeedback(0, 1000, 20, 25);
-  AddPacketFeedback(0, 1000, 40, 27);
-
-  EXPECT_EQ(measured_bps_, kInvalidBitrate);
-}
-
-TEST_F(TestProbeBitrateEstimator, SlowReceive) {
-  AddPacketFeedback(0, 1000, 0, 10);
-  AddPacketFeedback(0, 1000, 10, 40);
-  AddPacketFeedback(0, 1000, 20, 70);
-  AddPacketFeedback(0, 1000, 30, 85);
-  // Expected send rate = 800 kbps, expected receive rate = 320 kbps.
-
-  EXPECT_NEAR(measured_bps_, kTargetUtilizationFraction * 320000, 10);
-}
-
-TEST_F(TestProbeBitrateEstimator, BurstReceive) {
-  AddPacketFeedback(0, 1000, 0, 50);
-  AddPacketFeedback(0, 1000, 10, 50);
-  AddPacketFeedback(0, 1000, 20, 50);
-  AddPacketFeedback(0, 1000, 40, 50);
-
-  EXPECT_EQ(measured_bps_, kInvalidBitrate);
-}
-
-TEST_F(TestProbeBitrateEstimator, MultipleClusters) {
-  AddPacketFeedback(0, 1000, 0, 10);
-  AddPacketFeedback(0, 1000, 10, 20);
-  AddPacketFeedback(0, 1000, 20, 30);
-  AddPacketFeedback(0, 1000, 40, 60);
-  // Expected send rate = 600 kbps, expected receive rate = 480 kbps.
-  EXPECT_NEAR(measured_bps_, kTargetUtilizationFraction * 480000, 10);
-
-  AddPacketFeedback(0, 1000, 50, 60);
-  // Expected send rate = 640 kbps, expected receive rate = 640 kbps.
-  EXPECT_NEAR(measured_bps_, 640000, 10);
-
-  AddPacketFeedback(1, 1000, 60, 70);
-  AddPacketFeedback(1, 1000, 65, 77);
-  AddPacketFeedback(1, 1000, 70, 84);
-  AddPacketFeedback(1, 1000, 75, 90);
-  // Expected send rate = 1600 kbps, expected receive rate = 1200 kbps.
-
-  EXPECT_NEAR(measured_bps_, kTargetUtilizationFraction * 1200000, 10);
-}
-
-TEST_F(TestProbeBitrateEstimator, IgnoreOldClusters) {
-  AddPacketFeedback(0, 1000, 0, 10);
-  AddPacketFeedback(0, 1000, 10, 20);
-  AddPacketFeedback(0, 1000, 20, 30);
-
-  AddPacketFeedback(1, 1000, 60, 70);
-  AddPacketFeedback(1, 1000, 65, 77);
-  AddPacketFeedback(1, 1000, 70, 84);
-  AddPacketFeedback(1, 1000, 75, 90);
-  // Expected send rate = 1600 kbps, expected receive rate = 1200 kbps.
-
-  EXPECT_NEAR(measured_bps_, kTargetUtilizationFraction * 1200000, 10);
-
-  // Coming in 6s later
-  AddPacketFeedback(0, 1000, 40 + 6000, 60 + 6000);
-
-  EXPECT_EQ(measured_bps_, kInvalidBitrate);
-}
-
-TEST_F(TestProbeBitrateEstimator, IgnoreSizeLastSendPacket) {
-  AddPacketFeedback(0, 1000, 0, 10);
-  AddPacketFeedback(0, 1000, 10, 20);
-  AddPacketFeedback(0, 1000, 20, 30);
-  AddPacketFeedback(0, 1000, 30, 40);
-  AddPacketFeedback(0, 1500, 40, 50);
-  // Expected send rate = 800 kbps, expected receive rate = 900 kbps.
-
-  EXPECT_NEAR(measured_bps_, 800000, 10);
-}
-
-TEST_F(TestProbeBitrateEstimator, IgnoreSizeFirstReceivePacket) {
-  AddPacketFeedback(0, 1500, 0, 10);
-  AddPacketFeedback(0, 1000, 10, 20);
-  AddPacketFeedback(0, 1000, 20, 30);
-  AddPacketFeedback(0, 1000, 30, 40);
-  // Expected send rate = 933 kbps, expected receive rate = 800 kbps.
-
-  EXPECT_NEAR(measured_bps_, kTargetUtilizationFraction * 800000, 10);
-}
-
-TEST_F(TestProbeBitrateEstimator, NoLastEstimatedBitrateBps) {
-  EXPECT_FALSE(probe_bitrate_estimator_.FetchAndResetLastEstimatedBitrateBps());
-}
-
-TEST_F(TestProbeBitrateEstimator, FetchLastEstimatedBitrateBps) {
-  AddPacketFeedback(0, 1000, 0, 10);
-  AddPacketFeedback(0, 1000, 10, 20);
-  AddPacketFeedback(0, 1000, 20, 30);
-  AddPacketFeedback(0, 1000, 30, 40);
-
-  auto estimated_bitrate_bps =
-      probe_bitrate_estimator_.FetchAndResetLastEstimatedBitrateBps();
-  EXPECT_TRUE(estimated_bitrate_bps);
-  EXPECT_NEAR(*estimated_bitrate_bps, 800000, 10);
-  EXPECT_FALSE(probe_bitrate_estimator_.FetchAndResetLastEstimatedBitrateBps());
-}
-
-}  // namespace webrtc
diff --git a/modules/congestion_controller/probe_controller.cc b/modules/congestion_controller/probe_controller.cc
deleted file mode 100644
index 24ce7d4..0000000
--- a/modules/congestion_controller/probe_controller.cc
+++ /dev/null
@@ -1,301 +0,0 @@
-/*
- *  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/congestion_controller/probe_controller.h"
-
-#include <algorithm>
-#include <initializer_list>
-
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/safe_conversions.h"
-#include "webrtc/system_wrappers/include/field_trial.h"
-#include "webrtc/system_wrappers/include/metrics.h"
-
-namespace webrtc {
-
-namespace {
-// Maximum waiting time from the time of initiating probing to getting
-// the measured results back.
-constexpr int64_t kMaxWaitingTimeForProbingResultMs = 1000;
-
-// Value of |min_bitrate_to_probe_further_bps_| that indicates
-// further probing is disabled.
-constexpr int kExponentialProbingDisabled = 0;
-
-// Default probing bitrate limit. Applied only when the application didn't
-// specify max bitrate.
-constexpr int64_t kDefaultMaxProbingBitrateBps = 5000000;
-
-// Interval between probes when ALR periodic probing is enabled.
-constexpr int64_t kAlrPeriodicProbingIntervalMs = 5000;
-
-// Minimum probe bitrate percentage to probe further for repeated probes,
-// relative to the previous probe. For example, if 1Mbps probe results in
-// 80kbps, then we'll probe again at 1.6Mbps. In that case second probe won't be
-// sent if we get 600kbps from the first one.
-constexpr int kRepeatedProbeMinPercentage = 70;
-
-// If the bitrate drops to a factor |kBitrateDropThreshold| or lower
-// and we recover within |kBitrateDropTimeoutMs|, then we'll send
-// a probe at a fraction |kProbeFractionAfterDrop| of the original bitrate.
-constexpr double kBitrateDropThreshold = 0.66;
-constexpr int kBitrateDropTimeoutMs = 5000;
-constexpr double kProbeFractionAfterDrop = 0.85;
-
-// Timeout for probing after leaving ALR. If the bitrate drops significantly,
-// (as determined by the delay based estimator) and we leave ALR, then we will
-// send a probe if we recover within |kLeftAlrTimeoutMs| ms.
-constexpr int kAlrEndedTimeoutMs = 3000;
-
-// The expected uncertainty of probe result (as a fraction of the target probe
-// This is a limit on how often probing can be done when there is a BW
-// drop detected in ALR.
-constexpr int64_t kMinTimeBetweenAlrProbesMs = 5000;
-
-// bitrate). Used to avoid probing if the probe bitrate is close to our current
-// estimate.
-constexpr double kProbeUncertainty = 0.05;
-
-// Use probing to recover faster after large bitrate estimate drops.
-constexpr char kBweRapidRecoveryExperiment[] =
-    "WebRTC-BweRapidRecoveryExperiment";
-
-}  // namespace
-
-ProbeController::ProbeController(PacedSender* pacer, const Clock* clock)
-    : pacer_(pacer), clock_(clock), enable_periodic_alr_probing_(false) {
-  Reset();
-  in_rapid_recovery_experiment_ = webrtc::field_trial::FindFullName(
-                                      kBweRapidRecoveryExperiment) == "Enabled";
-}
-
-void ProbeController::SetBitrates(int64_t min_bitrate_bps,
-                                  int64_t start_bitrate_bps,
-                                  int64_t max_bitrate_bps) {
-  rtc::CritScope cs(&critsect_);
-
-  if (start_bitrate_bps > 0)  {
-    start_bitrate_bps_ = start_bitrate_bps;
-    estimated_bitrate_bps_ = start_bitrate_bps;
-  } else if (start_bitrate_bps_ == 0) {
-    start_bitrate_bps_ = min_bitrate_bps;
-  }
-
-  // The reason we use the variable |old_max_bitrate_pbs| is because we
-  // need to set |max_bitrate_bps_| before we call InitiateProbing.
-  int64_t old_max_bitrate_bps = max_bitrate_bps_;
-  max_bitrate_bps_ = max_bitrate_bps;
-
-  switch (state_) {
-    case State::kInit:
-      if (network_state_ == kNetworkUp)
-        InitiateExponentialProbing();
-      break;
-
-    case State::kWaitingForProbingResult:
-      break;
-
-    case State::kProbingComplete:
-      // If the new max bitrate is higher than the old max bitrate and the
-      // estimate is lower than the new max bitrate then initiate probing.
-      if (estimated_bitrate_bps_ != 0 &&
-          old_max_bitrate_bps < max_bitrate_bps_ &&
-          estimated_bitrate_bps_ < max_bitrate_bps_) {
-        // The assumption is that if we jump more than 20% in the bandwidth
-        // estimate or if the bandwidth estimate is within 90% of the new
-        // max bitrate then the probing attempt was successful.
-        mid_call_probing_succcess_threshold_ =
-            std::min(estimated_bitrate_bps_ * 1.2, max_bitrate_bps_ * 0.9);
-        mid_call_probing_waiting_for_result_ = true;
-        mid_call_probing_bitrate_bps_ = max_bitrate_bps_;
-
-        RTC_HISTOGRAM_COUNTS_10000("WebRTC.BWE.MidCallProbing.Initiated",
-                                   max_bitrate_bps_ / 1000);
-
-        InitiateProbing(clock_->TimeInMilliseconds(), {max_bitrate_bps}, false);
-      }
-      break;
-  }
-}
-
-void ProbeController::OnNetworkStateChanged(NetworkState network_state) {
-  rtc::CritScope cs(&critsect_);
-  network_state_ = network_state;
-  if (network_state_ == kNetworkUp && state_ == State::kInit)
-    InitiateExponentialProbing();
-}
-
-void ProbeController::InitiateExponentialProbing() {
-  RTC_DCHECK(network_state_ == kNetworkUp);
-  RTC_DCHECK(state_ == State::kInit);
-  RTC_DCHECK_GT(start_bitrate_bps_, 0);
-
-  // When probing at 1.8 Mbps ( 6x 300), this represents a threshold of
-  // 1.2 Mbps to continue probing.
-  InitiateProbing(clock_->TimeInMilliseconds(),
-                  {3 * start_bitrate_bps_, 6 * start_bitrate_bps_}, true);
-}
-
-void ProbeController::SetEstimatedBitrate(int64_t bitrate_bps) {
-  rtc::CritScope cs(&critsect_);
-  int64_t now_ms = clock_->TimeInMilliseconds();
-
-  if (mid_call_probing_waiting_for_result_ &&
-      bitrate_bps >= mid_call_probing_succcess_threshold_) {
-    RTC_HISTOGRAM_COUNTS_10000("WebRTC.BWE.MidCallProbing.Success",
-                               mid_call_probing_bitrate_bps_ / 1000);
-    RTC_HISTOGRAM_COUNTS_10000("WebRTC.BWE.MidCallProbing.ProbedKbps",
-                               bitrate_bps / 1000);
-    mid_call_probing_waiting_for_result_ = false;
-  }
-
-  if (state_ == State::kWaitingForProbingResult) {
-    // Continue probing if probing results indicate channel has greater
-    // capacity.
-    LOG(LS_INFO) << "Measured bitrate: " << bitrate_bps
-                 << " Minimum to probe further: "
-                 << min_bitrate_to_probe_further_bps_;
-
-    if (min_bitrate_to_probe_further_bps_ != kExponentialProbingDisabled &&
-        bitrate_bps > min_bitrate_to_probe_further_bps_) {
-      // Double the probing bitrate.
-      InitiateProbing(now_ms, {2 * bitrate_bps}, true);
-    }
-  }
-
-  if (bitrate_bps < kBitrateDropThreshold * estimated_bitrate_bps_) {
-    time_of_last_large_drop_ms_ = now_ms;
-    bitrate_before_last_large_drop_bps_ = estimated_bitrate_bps_;
-  }
-
-  estimated_bitrate_bps_ = bitrate_bps;
-}
-
-void ProbeController::EnablePeriodicAlrProbing(bool enable) {
-  rtc::CritScope cs(&critsect_);
-  enable_periodic_alr_probing_ = enable;
-}
-
-void ProbeController::SetAlrEndedTimeMs(int64_t alr_end_time_ms) {
-  rtc::CritScope cs(&critsect_);
-  alr_end_time_ms_.emplace(alr_end_time_ms);
-}
-
-void ProbeController::RequestProbe() {
-  int64_t now_ms = clock_->TimeInMilliseconds();
-  rtc::CritScope cs(&critsect_);
-  // Called once we have returned to normal state after a large drop in
-  // estimated bandwidth. The current response is to initiate a single probe
-  // session (if not already probing) at the previous bitrate.
-  //
-  // If the probe session fails, the assumption is that this drop was a
-  // real one from a competing flow or a network change.
-  bool in_alr = pacer_->GetApplicationLimitedRegionStartTime().has_value();
-  bool alr_ended_recently =
-      (alr_end_time_ms_.has_value() &&
-       now_ms - alr_end_time_ms_.value() < kAlrEndedTimeoutMs);
-  if (in_alr || alr_ended_recently || in_rapid_recovery_experiment_) {
-    if (state_ == State::kProbingComplete) {
-      uint32_t suggested_probe_bps =
-          kProbeFractionAfterDrop * bitrate_before_last_large_drop_bps_;
-      uint32_t min_expected_probe_result_bps =
-          (1 - kProbeUncertainty) * suggested_probe_bps;
-      int64_t time_since_drop_ms = now_ms - time_of_last_large_drop_ms_;
-      int64_t time_since_probe_ms = now_ms - last_bwe_drop_probing_time_ms_;
-      if (min_expected_probe_result_bps > estimated_bitrate_bps_ &&
-          time_since_drop_ms < kBitrateDropTimeoutMs &&
-          time_since_probe_ms > kMinTimeBetweenAlrProbesMs) {
-        LOG(LS_INFO) << "Detected big bandwidth drop, start probing.";
-        // Track how often we probe in response to bandwidth drop in ALR.
-        RTC_HISTOGRAM_COUNTS_10000(
-            "WebRTC.BWE.BweDropProbingIntervalInS",
-            (now_ms - last_bwe_drop_probing_time_ms_) / 1000);
-        InitiateProbing(now_ms, {suggested_probe_bps}, false);
-        last_bwe_drop_probing_time_ms_ = now_ms;
-      }
-    }
-  }
-}
-
-void ProbeController::Reset() {
-  rtc::CritScope cs(&critsect_);
-  network_state_ = kNetworkUp;
-  state_ = State::kInit;
-  min_bitrate_to_probe_further_bps_ = kExponentialProbingDisabled;
-  time_last_probing_initiated_ms_ = 0;
-  estimated_bitrate_bps_ = 0;
-  start_bitrate_bps_ = 0;
-  max_bitrate_bps_ = 0;
-  int64_t now_ms = clock_->TimeInMilliseconds();
-  last_bwe_drop_probing_time_ms_ = now_ms;
-  alr_end_time_ms_.reset();
-  mid_call_probing_waiting_for_result_ = false;
-  time_of_last_large_drop_ms_ = now_ms;
-  bitrate_before_last_large_drop_bps_ = 0;
-}
-
-void ProbeController::Process() {
-  rtc::CritScope cs(&critsect_);
-
-  int64_t now_ms = clock_->TimeInMilliseconds();
-
-  if (now_ms - time_last_probing_initiated_ms_ >
-      kMaxWaitingTimeForProbingResultMs) {
-    mid_call_probing_waiting_for_result_ = false;
-
-    if (state_ == State::kWaitingForProbingResult) {
-      LOG(LS_INFO) << "kWaitingForProbingResult: timeout";
-      state_ = State::kProbingComplete;
-      min_bitrate_to_probe_further_bps_ = kExponentialProbingDisabled;
-    }
-  }
-
-  if (state_ != State::kProbingComplete || !enable_periodic_alr_probing_)
-    return;
-
-  // Probe bandwidth periodically when in ALR state.
-  rtc::Optional<int64_t> alr_start_time =
-      pacer_->GetApplicationLimitedRegionStartTime();
-  if (alr_start_time && estimated_bitrate_bps_ > 0) {
-    int64_t next_probe_time_ms =
-        std::max(*alr_start_time, time_last_probing_initiated_ms_) +
-        kAlrPeriodicProbingIntervalMs;
-    if (now_ms >= next_probe_time_ms) {
-      InitiateProbing(now_ms, {estimated_bitrate_bps_ * 2}, true);
-    }
-  }
-}
-
-void ProbeController::InitiateProbing(
-    int64_t now_ms,
-    std::initializer_list<int64_t> bitrates_to_probe,
-    bool probe_further) {
-  for (int64_t bitrate : bitrates_to_probe) {
-    RTC_DCHECK_GT(bitrate, 0);
-    int64_t max_probe_bitrate_bps =
-        max_bitrate_bps_ > 0 ? max_bitrate_bps_ : kDefaultMaxProbingBitrateBps;
-    if (bitrate > max_probe_bitrate_bps) {
-      bitrate = max_probe_bitrate_bps;
-      probe_further = false;
-    }
-    pacer_->CreateProbeCluster(rtc::dchecked_cast<int>(bitrate));
-  }
-  time_last_probing_initiated_ms_ = now_ms;
-  if (probe_further) {
-    state_ = State::kWaitingForProbingResult;
-    min_bitrate_to_probe_further_bps_ =
-        (*(bitrates_to_probe.end() - 1)) * kRepeatedProbeMinPercentage / 100;
-  } else {
-    state_ = State::kProbingComplete;
-    min_bitrate_to_probe_further_bps_ = kExponentialProbingDisabled;
-  }
-}
-
-}  // namespace webrtc
diff --git a/modules/congestion_controller/probe_controller.h b/modules/congestion_controller/probe_controller.h
deleted file mode 100644
index 7a23360..0000000
--- a/modules/congestion_controller/probe_controller.h
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- *  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_CONGESTION_CONTROLLER_PROBE_CONTROLLER_H_
-#define WEBRTC_MODULES_CONGESTION_CONTROLLER_PROBE_CONTROLLER_H_
-
-#include <initializer_list>
-
-#include "webrtc/common_types.h"
-#include "webrtc/modules/pacing/paced_sender.h"
-#include "webrtc/rtc_base/criticalsection.h"
-
-namespace webrtc {
-
-class Clock;
-
-// This class controls initiation of probing to estimate initial channel
-// capacity. There is also support for probing during a session when max
-// bitrate is adjusted by an application.
-class ProbeController {
- public:
-  ProbeController(PacedSender* pacer, const Clock* clock);
-
-  void SetBitrates(int64_t min_bitrate_bps,
-                   int64_t start_bitrate_bps,
-                   int64_t max_bitrate_bps);
-
-  void OnNetworkStateChanged(NetworkState state);
-
-  void SetEstimatedBitrate(int64_t bitrate_bps);
-
-  void EnablePeriodicAlrProbing(bool enable);
-
-  void SetAlrEndedTimeMs(int64_t alr_end_time);
-
-  void RequestProbe();
-
-  // Resets the ProbeController to a state equivalent to as if it was just
-  // created EXCEPT for |enable_periodic_alr_probing_|.
-  void Reset();
-
-  void Process();
-
- private:
-  enum class State {
-    // Initial state where no probing has been triggered yet.
-    kInit,
-    // Waiting for probing results to continue further probing.
-    kWaitingForProbingResult,
-    // Probing is complete.
-    kProbingComplete,
-  };
-
-  void InitiateExponentialProbing() RTC_EXCLUSIVE_LOCKS_REQUIRED(critsect_);
-  void InitiateProbing(int64_t now_ms,
-                       std::initializer_list<int64_t> bitrates_to_probe,
-                       bool probe_further)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(critsect_);
-
-  rtc::CriticalSection critsect_;
-  PacedSender* const pacer_;
-  const Clock* const clock_;
-  NetworkState network_state_ RTC_GUARDED_BY(critsect_);
-  State state_ RTC_GUARDED_BY(critsect_);
-  int64_t min_bitrate_to_probe_further_bps_ RTC_GUARDED_BY(critsect_);
-  int64_t time_last_probing_initiated_ms_ RTC_GUARDED_BY(critsect_);
-  int64_t estimated_bitrate_bps_ RTC_GUARDED_BY(critsect_);
-  int64_t start_bitrate_bps_ RTC_GUARDED_BY(critsect_);
-  int64_t max_bitrate_bps_ RTC_GUARDED_BY(critsect_);
-  int64_t last_bwe_drop_probing_time_ms_ RTC_GUARDED_BY(critsect_);
-  rtc::Optional<int64_t> alr_end_time_ms_ RTC_GUARDED_BY(critsect_);
-  bool enable_periodic_alr_probing_ RTC_GUARDED_BY(critsect_);
-  int64_t time_of_last_large_drop_ms_ RTC_GUARDED_BY(critsect_);
-  int64_t bitrate_before_last_large_drop_bps_ RTC_GUARDED_BY(critsect_);
-
-  bool in_rapid_recovery_experiment_ RTC_GUARDED_BY(critsect_);
-  // For WebRTC.BWE.MidCallProbing.* metric.
-  bool mid_call_probing_waiting_for_result_ RTC_GUARDED_BY(&critsect_);
-  int64_t mid_call_probing_bitrate_bps_ RTC_GUARDED_BY(&critsect_);
-  int64_t mid_call_probing_succcess_threshold_ RTC_GUARDED_BY(&critsect_);
-
-  RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(ProbeController);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_CONGESTION_CONTROLLER_PROBE_CONTROLLER_H_
diff --git a/modules/congestion_controller/probe_controller_unittest.cc b/modules/congestion_controller/probe_controller_unittest.cc
deleted file mode 100644
index e0a040f..0000000
--- a/modules/congestion_controller/probe_controller_unittest.cc
+++ /dev/null
@@ -1,273 +0,0 @@
-/*
- *  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 <memory>
-
-#include "webrtc/modules/congestion_controller/probe_controller.h"
-#include "webrtc/modules/pacing/mock/mock_paced_sender.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/system_wrappers/include/clock.h"
-#include "webrtc/test/gmock.h"
-#include "webrtc/test/gtest.h"
-
-using testing::_;
-using testing::AtLeast;
-using testing::NiceMock;
-using testing::Return;
-
-namespace webrtc {
-namespace test {
-
-namespace {
-
-constexpr int kMinBitrateBps = 100;
-constexpr int kStartBitrateBps = 300;
-constexpr int kMaxBitrateBps = 10000;
-
-constexpr int kExponentialProbingTimeoutMs = 5000;
-
-constexpr int kAlrProbeInterval = 5000;
-constexpr int kAlrEndedTimeoutMs = 3000;
-constexpr int kBitrateDropTimeoutMs = 5000;
-
-}  // namespace
-
-class ProbeControllerTest : public ::testing::Test {
- protected:
-  ProbeControllerTest() : clock_(100000000L) {
-    probe_controller_.reset(new ProbeController(&pacer_, &clock_));
-  }
-  ~ProbeControllerTest() override {}
-
-  SimulatedClock clock_;
-  NiceMock<MockPacedSender> pacer_;
-  std::unique_ptr<ProbeController> probe_controller_;
-};
-
-TEST_F(ProbeControllerTest, InitiatesProbingAtStart) {
-  EXPECT_CALL(pacer_, CreateProbeCluster(_)).Times(AtLeast(2));
-  probe_controller_->SetBitrates(kMinBitrateBps, kStartBitrateBps,
-                                 kMaxBitrateBps);
-}
-
-TEST_F(ProbeControllerTest, ProbeOnlyWhenNetworkIsUp) {
-  probe_controller_->OnNetworkStateChanged(kNetworkDown);
-  EXPECT_CALL(pacer_, CreateProbeCluster(_)).Times(0);
-  probe_controller_->SetBitrates(kMinBitrateBps, kStartBitrateBps,
-                                 kMaxBitrateBps);
-
-  testing::Mock::VerifyAndClearExpectations(&pacer_);
-  EXPECT_CALL(pacer_, CreateProbeCluster(_)).Times(AtLeast(2));
-  probe_controller_->OnNetworkStateChanged(kNetworkUp);
-}
-
-TEST_F(ProbeControllerTest, InitiatesProbingOnMaxBitrateIncrease) {
-  EXPECT_CALL(pacer_, CreateProbeCluster(_)).Times(AtLeast(2));
-  probe_controller_->SetBitrates(kMinBitrateBps, kStartBitrateBps,
-                                 kMaxBitrateBps);
-  // Long enough to time out exponential probing.
-  clock_.AdvanceTimeMilliseconds(kExponentialProbingTimeoutMs);
-  probe_controller_->SetEstimatedBitrate(kStartBitrateBps);
-  probe_controller_->Process();
-
-  EXPECT_CALL(pacer_, CreateProbeCluster(kMaxBitrateBps + 100));
-  probe_controller_->SetBitrates(kMinBitrateBps, kStartBitrateBps,
-                                 kMaxBitrateBps + 100);
-}
-
-TEST_F(ProbeControllerTest, InitiatesProbingOnMaxBitrateIncreaseAtMaxBitrate) {
-  EXPECT_CALL(pacer_, CreateProbeCluster(_)).Times(AtLeast(2));
-  probe_controller_->SetBitrates(kMinBitrateBps, kStartBitrateBps,
-                                 kMaxBitrateBps);
-  // Long enough to time out exponential probing.
-  clock_.AdvanceTimeMilliseconds(kExponentialProbingTimeoutMs);
-  probe_controller_->SetEstimatedBitrate(kStartBitrateBps);
-  probe_controller_->Process();
-
-  probe_controller_->SetEstimatedBitrate(kMaxBitrateBps);
-  EXPECT_CALL(pacer_, CreateProbeCluster(kMaxBitrateBps + 100));
-  probe_controller_->SetBitrates(kMinBitrateBps, kStartBitrateBps,
-                                 kMaxBitrateBps + 100);
-}
-
-TEST_F(ProbeControllerTest, TestExponentialProbing) {
-  probe_controller_->SetBitrates(kMinBitrateBps, kStartBitrateBps,
-                                 kMaxBitrateBps);
-
-  // Repeated probe should only be sent when estimated bitrate climbs above
-  // 0.7 * 6 * kStartBitrateBps = 1260.
-  EXPECT_CALL(pacer_, CreateProbeCluster(_)).Times(0);
-  probe_controller_->SetEstimatedBitrate(1000);
-  testing::Mock::VerifyAndClearExpectations(&pacer_);
-
-  EXPECT_CALL(pacer_, CreateProbeCluster(2 * 1800));
-  probe_controller_->SetEstimatedBitrate(1800);
-}
-
-TEST_F(ProbeControllerTest, TestExponentialProbingTimeout) {
-  probe_controller_->SetBitrates(kMinBitrateBps, kStartBitrateBps,
-                                 kMaxBitrateBps);
-
-  // Advance far enough to cause a time out in waiting for probing result.
-  clock_.AdvanceTimeMilliseconds(kExponentialProbingTimeoutMs);
-  probe_controller_->Process();
-
-  EXPECT_CALL(pacer_, CreateProbeCluster(_)).Times(0);
-  probe_controller_->SetEstimatedBitrate(1800);
-}
-
-TEST_F(ProbeControllerTest, RequestProbeInAlr) {
-  EXPECT_CALL(pacer_, CreateProbeCluster(_)).Times(2);
-  probe_controller_->SetBitrates(kMinBitrateBps, kStartBitrateBps,
-                                 kMaxBitrateBps);
-  probe_controller_->SetEstimatedBitrate(500);
-  testing::Mock::VerifyAndClearExpectations(&pacer_);
-  EXPECT_CALL(pacer_, CreateProbeCluster(0.85 * 500)).Times(1);
-  EXPECT_CALL(pacer_, GetApplicationLimitedRegionStartTime())
-      .WillRepeatedly(
-          Return(rtc::Optional<int64_t>(clock_.TimeInMilliseconds())));
-  clock_.AdvanceTimeMilliseconds(kAlrProbeInterval + 1);
-  probe_controller_->Process();
-  probe_controller_->SetEstimatedBitrate(250);
-  probe_controller_->RequestProbe();
-}
-
-TEST_F(ProbeControllerTest, RequestProbeWhenAlrEndedRecently) {
-  EXPECT_CALL(pacer_, CreateProbeCluster(_)).Times(2);
-  probe_controller_->SetBitrates(kMinBitrateBps, kStartBitrateBps,
-                                 kMaxBitrateBps);
-  probe_controller_->SetEstimatedBitrate(500);
-  testing::Mock::VerifyAndClearExpectations(&pacer_);
-  EXPECT_CALL(pacer_, CreateProbeCluster(0.85 * 500)).Times(1);
-  EXPECT_CALL(pacer_, GetApplicationLimitedRegionStartTime())
-      .WillRepeatedly(Return(rtc::Optional<int64_t>()));
-  clock_.AdvanceTimeMilliseconds(kAlrProbeInterval + 1);
-  probe_controller_->Process();
-  probe_controller_->SetEstimatedBitrate(250);
-  probe_controller_->SetAlrEndedTimeMs(clock_.TimeInMilliseconds());
-  clock_.AdvanceTimeMilliseconds(kAlrEndedTimeoutMs - 1);
-  probe_controller_->RequestProbe();
-}
-
-TEST_F(ProbeControllerTest, RequestProbeWhenAlrNotEndedRecently) {
-  EXPECT_CALL(pacer_, CreateProbeCluster(_)).Times(2);
-  probe_controller_->SetBitrates(kMinBitrateBps, kStartBitrateBps,
-                                 kMaxBitrateBps);
-  probe_controller_->SetEstimatedBitrate(500);
-  testing::Mock::VerifyAndClearExpectations(&pacer_);
-  EXPECT_CALL(pacer_, CreateProbeCluster(_)).Times(0);
-  EXPECT_CALL(pacer_, GetApplicationLimitedRegionStartTime())
-      .WillRepeatedly(Return(rtc::Optional<int64_t>()));
-  clock_.AdvanceTimeMilliseconds(kAlrProbeInterval + 1);
-  probe_controller_->Process();
-  probe_controller_->SetEstimatedBitrate(250);
-  probe_controller_->SetAlrEndedTimeMs(clock_.TimeInMilliseconds());
-  clock_.AdvanceTimeMilliseconds(kAlrEndedTimeoutMs + 1);
-  probe_controller_->RequestProbe();
-}
-
-TEST_F(ProbeControllerTest, RequestProbeWhenBweDropNotRecent) {
-  EXPECT_CALL(pacer_, CreateProbeCluster(_)).Times(2);
-  probe_controller_->SetBitrates(kMinBitrateBps, kStartBitrateBps,
-                                 kMaxBitrateBps);
-  probe_controller_->SetEstimatedBitrate(500);
-  testing::Mock::VerifyAndClearExpectations(&pacer_);
-  EXPECT_CALL(pacer_, CreateProbeCluster(_)).Times(0);
-  EXPECT_CALL(pacer_, GetApplicationLimitedRegionStartTime())
-      .WillRepeatedly(
-          Return(rtc::Optional<int64_t>(clock_.TimeInMilliseconds())));
-  clock_.AdvanceTimeMilliseconds(kAlrProbeInterval + 1);
-  probe_controller_->Process();
-  probe_controller_->SetEstimatedBitrate(250);
-  clock_.AdvanceTimeMilliseconds(kBitrateDropTimeoutMs + 1);
-  probe_controller_->RequestProbe();
-}
-
-TEST_F(ProbeControllerTest, PeriodicProbing) {
-  EXPECT_CALL(pacer_, CreateProbeCluster(_)).Times(2);
-  probe_controller_->EnablePeriodicAlrProbing(true);
-  probe_controller_->SetBitrates(kMinBitrateBps, kStartBitrateBps,
-                                 kMaxBitrateBps);
-  probe_controller_->SetEstimatedBitrate(500);
-  testing::Mock::VerifyAndClearExpectations(&pacer_);
-
-  int64_t start_time = clock_.TimeInMilliseconds();
-
-  // Expect the controller to send a new probe after 5s has passed.
-  EXPECT_CALL(pacer_, CreateProbeCluster(1000)).Times(1);
-  EXPECT_CALL(pacer_, GetApplicationLimitedRegionStartTime())
-      .WillRepeatedly(Return(rtc::Optional<int64_t>(start_time)));
-  clock_.AdvanceTimeMilliseconds(5000);
-  probe_controller_->Process();
-  probe_controller_->SetEstimatedBitrate(500);
-  testing::Mock::VerifyAndClearExpectations(&pacer_);
-
-  // The following probe should be sent at 10s into ALR.
-  EXPECT_CALL(pacer_, CreateProbeCluster(_)).Times(0);
-  EXPECT_CALL(pacer_, GetApplicationLimitedRegionStartTime())
-      .WillRepeatedly(Return(rtc::Optional<int64_t>(start_time)));
-  clock_.AdvanceTimeMilliseconds(4000);
-  probe_controller_->Process();
-  probe_controller_->SetEstimatedBitrate(500);
-  testing::Mock::VerifyAndClearExpectations(&pacer_);
-
-  EXPECT_CALL(pacer_, CreateProbeCluster(_)).Times(1);
-  EXPECT_CALL(pacer_, GetApplicationLimitedRegionStartTime())
-      .WillRepeatedly(Return(rtc::Optional<int64_t>(start_time)));
-  clock_.AdvanceTimeMilliseconds(1000);
-  probe_controller_->Process();
-  probe_controller_->SetEstimatedBitrate(500);
-  testing::Mock::VerifyAndClearExpectations(&pacer_);
-}
-
-TEST_F(ProbeControllerTest, PeriodicProbingAfterReset) {
-  testing::StrictMock<MockPacedSender> local_pacer;
-  probe_controller_.reset(new ProbeController(&local_pacer, &clock_));
-  int64_t alr_start_time = clock_.TimeInMilliseconds();
-  EXPECT_CALL(local_pacer, GetApplicationLimitedRegionStartTime())
-      .WillRepeatedly(
-          Return(rtc::Optional<int64_t>(alr_start_time)));
-
-  EXPECT_CALL(local_pacer, CreateProbeCluster(_)).Times(2);
-  probe_controller_->EnablePeriodicAlrProbing(true);
-  probe_controller_->SetBitrates(kMinBitrateBps, kStartBitrateBps,
-                                 kMaxBitrateBps);
-  probe_controller_->Reset();
-
-  clock_.AdvanceTimeMilliseconds(10000);
-  probe_controller_->Process();
-
-  EXPECT_CALL(local_pacer, CreateProbeCluster(_)).Times(2);
-  probe_controller_->SetBitrates(kMinBitrateBps, kStartBitrateBps,
-                                 kMaxBitrateBps);
-
-  // Make sure we use |kStartBitrateBps| as the estimated bitrate
-  // until SetEstimatedBitrate is called with an updated estimate.
-  clock_.AdvanceTimeMilliseconds(10000);
-  EXPECT_CALL(local_pacer, CreateProbeCluster(kStartBitrateBps*2));
-  probe_controller_->Process();
-}
-
-TEST_F(ProbeControllerTest, TestExponentialProbingOverflow) {
-  const int64_t kMbpsMultiplier = 1000000;
-  probe_controller_->SetBitrates(kMinBitrateBps, 10 * kMbpsMultiplier,
-                                 100 * kMbpsMultiplier);
-
-  // Verify that probe bitrate is capped at the specified max bitrate
-  EXPECT_CALL(pacer_, CreateProbeCluster(100 * kMbpsMultiplier));
-  probe_controller_->SetEstimatedBitrate(60 * kMbpsMultiplier);
-  testing::Mock::VerifyAndClearExpectations(&pacer_);
-
-  // Verify that repeated probes aren't sent.
-  EXPECT_CALL(pacer_, CreateProbeCluster(_)).Times(0);
-  probe_controller_->SetEstimatedBitrate(100 * kMbpsMultiplier);
-}
-
-}  // namespace test
-}  // namespace webrtc
diff --git a/modules/congestion_controller/receive_side_congestion_controller.cc b/modules/congestion_controller/receive_side_congestion_controller.cc
deleted file mode 100644
index 3224906..0000000
--- a/modules/congestion_controller/receive_side_congestion_controller.cc
+++ /dev/null
@@ -1,174 +0,0 @@
-/*
- *  Copyright (c) 2017 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/congestion_controller/include/receive_side_congestion_controller.h"
-
-#include "webrtc/modules/pacing/packet_router.h"
-#include "webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_abs_send_time.h"
-#include "webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_single_stream.h"
-#include "webrtc/rtc_base/logging.h"
-
-namespace webrtc {
-
-namespace {
-static const uint32_t kTimeOffsetSwitchThreshold = 30;
-}  // namespace
-
-ReceiveSideCongestionController::WrappingBitrateEstimator::
-    WrappingBitrateEstimator(RemoteBitrateObserver* observer,
-                             const Clock* clock)
-    : observer_(observer),
-      clock_(clock),
-      rbe_(new RemoteBitrateEstimatorSingleStream(observer_, clock_)),
-      using_absolute_send_time_(false),
-      packets_since_absolute_send_time_(0),
-      min_bitrate_bps_(congestion_controller::GetMinBitrateBps()) {}
-
-void ReceiveSideCongestionController::WrappingBitrateEstimator::IncomingPacket(
-    int64_t arrival_time_ms,
-    size_t payload_size,
-    const RTPHeader& header) {
-  rtc::CritScope cs(&crit_sect_);
-  PickEstimatorFromHeader(header);
-  rbe_->IncomingPacket(arrival_time_ms, payload_size, header);
-}
-
-void ReceiveSideCongestionController::WrappingBitrateEstimator::Process() {
-  rtc::CritScope cs(&crit_sect_);
-  rbe_->Process();
-}
-
-int64_t ReceiveSideCongestionController::WrappingBitrateEstimator::
-    TimeUntilNextProcess() {
-  rtc::CritScope cs(&crit_sect_);
-  return rbe_->TimeUntilNextProcess();
-}
-
-void ReceiveSideCongestionController::WrappingBitrateEstimator::OnRttUpdate(
-    int64_t avg_rtt_ms,
-    int64_t max_rtt_ms) {
-  rtc::CritScope cs(&crit_sect_);
-  rbe_->OnRttUpdate(avg_rtt_ms, max_rtt_ms);
-}
-
-void ReceiveSideCongestionController::WrappingBitrateEstimator::RemoveStream(
-    unsigned int ssrc) {
-  rtc::CritScope cs(&crit_sect_);
-  rbe_->RemoveStream(ssrc);
-}
-
-bool ReceiveSideCongestionController::WrappingBitrateEstimator::LatestEstimate(
-    std::vector<unsigned int>* ssrcs,
-    unsigned int* bitrate_bps) const {
-  rtc::CritScope cs(&crit_sect_);
-  return rbe_->LatestEstimate(ssrcs, bitrate_bps);
-}
-
-void ReceiveSideCongestionController::WrappingBitrateEstimator::SetMinBitrate(
-    int min_bitrate_bps) {
-  rtc::CritScope cs(&crit_sect_);
-  rbe_->SetMinBitrate(min_bitrate_bps);
-  min_bitrate_bps_ = min_bitrate_bps;
-}
-
-void ReceiveSideCongestionController::WrappingBitrateEstimator::
-    PickEstimatorFromHeader(const RTPHeader& header) {
-  if (header.extension.hasAbsoluteSendTime) {
-    // If we see AST in header, switch RBE strategy immediately.
-    if (!using_absolute_send_time_) {
-      LOG(LS_INFO)
-          << "WrappingBitrateEstimator: Switching to absolute send time RBE.";
-      using_absolute_send_time_ = true;
-      PickEstimator();
-    }
-    packets_since_absolute_send_time_ = 0;
-  } else {
-    // When we don't see AST, wait for a few packets before going back to TOF.
-    if (using_absolute_send_time_) {
-      ++packets_since_absolute_send_time_;
-      if (packets_since_absolute_send_time_ >= kTimeOffsetSwitchThreshold) {
-        LOG(LS_INFO) << "WrappingBitrateEstimator: Switching to transmission "
-                     << "time offset RBE.";
-        using_absolute_send_time_ = false;
-        PickEstimator();
-      }
-    }
-  }
-}
-
-// Instantiate RBE for Time Offset or Absolute Send Time extensions.
-void ReceiveSideCongestionController::WrappingBitrateEstimator::
-    PickEstimator() {
-  if (using_absolute_send_time_) {
-    rbe_.reset(new RemoteBitrateEstimatorAbsSendTime(observer_, clock_));
-  } else {
-    rbe_.reset(new RemoteBitrateEstimatorSingleStream(observer_, clock_));
-  }
-  rbe_->SetMinBitrate(min_bitrate_bps_);
-}
-
-ReceiveSideCongestionController::ReceiveSideCongestionController(
-    const Clock* clock,
-    PacketRouter* packet_router)
-    : remote_bitrate_estimator_(packet_router, clock),
-      remote_estimator_proxy_(clock, packet_router) {}
-
-void ReceiveSideCongestionController::OnReceivedPacket(
-    int64_t arrival_time_ms,
-    size_t payload_size,
-    const RTPHeader& header) {
-  // Send-side BWE.
-  if (header.extension.hasTransportSequenceNumber) {
-    remote_estimator_proxy_.IncomingPacket(arrival_time_ms, payload_size,
-                                           header);
-  } else {
-    // Receive-side BWE.
-    remote_bitrate_estimator_.IncomingPacket(arrival_time_ms, payload_size,
-                                             header);
-  }
-}
-
-RemoteBitrateEstimator*
-ReceiveSideCongestionController::GetRemoteBitrateEstimator(bool send_side_bwe) {
-  if (send_side_bwe) {
-    return &remote_estimator_proxy_;
-  } else {
-    return &remote_bitrate_estimator_;
-  }
-}
-
-const RemoteBitrateEstimator*
-ReceiveSideCongestionController::GetRemoteBitrateEstimator(
-    bool send_side_bwe) const {
-  if (send_side_bwe) {
-    return &remote_estimator_proxy_;
-  } else {
-    return &remote_bitrate_estimator_;
-  }
-}
-
-void ReceiveSideCongestionController::OnRttUpdate(int64_t avg_rtt_ms,
-                                                  int64_t max_rtt_ms) {
-  remote_bitrate_estimator_.OnRttUpdate(avg_rtt_ms, max_rtt_ms);
-}
-
-void ReceiveSideCongestionController::OnBitrateChanged(int bitrate_bps) {
-  remote_estimator_proxy_.OnBitrateChanged(bitrate_bps);
-}
-
-int64_t ReceiveSideCongestionController::TimeUntilNextProcess() {
-  return remote_bitrate_estimator_.TimeUntilNextProcess();
-}
-
-void ReceiveSideCongestionController::Process() {
-  remote_bitrate_estimator_.Process();
-}
-
-}  // namespace webrtc
diff --git a/modules/congestion_controller/receive_side_congestion_controller_unittest.cc b/modules/congestion_controller/receive_side_congestion_controller_unittest.cc
deleted file mode 100644
index 8ee8a88..0000000
--- a/modules/congestion_controller/receive_side_congestion_controller_unittest.cc
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- *  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/congestion_controller/include/receive_side_congestion_controller.h"
-#include "webrtc/modules/pacing/packet_router.h"
-#include "webrtc/system_wrappers/include/clock.h"
-#include "webrtc/test/gmock.h"
-#include "webrtc/test/gtest.h"
-
-using testing::_;
-using testing::AtLeast;
-using testing::NiceMock;
-using testing::Return;
-using testing::SaveArg;
-using testing::StrictMock;
-
-namespace webrtc {
-
-namespace {
-
-// Helper to convert some time format to resolution used in absolute send time
-// header extension, rounded upwards. |t| is the time to convert, in some
-// resolution. |denom| is the value to divide |t| by to get whole seconds,
-// e.g. |denom| = 1000 if |t| is in milliseconds.
-uint32_t AbsSendTime(int64_t t, int64_t denom) {
-  return (((t << 18) + (denom >> 1)) / denom) & 0x00fffffful;
-}
-
-class MockPacketRouter : public PacketRouter {
- public:
-  MOCK_METHOD2(OnReceiveBitrateChanged,
-               void(const std::vector<uint32_t>& ssrcs, uint32_t bitrate));
-};
-
-const uint32_t kInitialBitrateBps = 60000;
-
-}  // namespace
-
-namespace test {
-
-TEST(ReceiveSideCongestionControllerTest, OnReceivedPacketWithAbsSendTime) {
-  StrictMock<MockPacketRouter> packet_router;
-  SimulatedClock clock_(123456);
-
-  ReceiveSideCongestionController controller(&clock_, &packet_router);
-
-  size_t payload_size = 1000;
-  RTPHeader header;
-  header.ssrc = 0x11eb21c;
-  header.extension.hasAbsoluteSendTime = true;
-
-  std::vector<unsigned int> ssrcs;
-  EXPECT_CALL(packet_router, OnReceiveBitrateChanged(_, _))
-      .WillRepeatedly(SaveArg<0>(&ssrcs));
-
-  for (int i = 0; i < 10; ++i) {
-    clock_.AdvanceTimeMilliseconds((1000 * payload_size) / kInitialBitrateBps);
-    int64_t now_ms = clock_.TimeInMilliseconds();
-    header.extension.absoluteSendTime = AbsSendTime(now_ms, 1000);
-    controller.OnReceivedPacket(now_ms, payload_size, header);
-  }
-
-  ASSERT_EQ(1u, ssrcs.size());
-  EXPECT_EQ(header.ssrc, ssrcs[0]);
-}
-
-}  // namespace test
-}  // namespace webrtc
diff --git a/modules/congestion_controller/send_side_congestion_controller.cc b/modules/congestion_controller/send_side_congestion_controller.cc
deleted file mode 100644
index fee4990..0000000
--- a/modules/congestion_controller/send_side_congestion_controller.cc
+++ /dev/null
@@ -1,465 +0,0 @@
-/*
- *  Copyright (c) 2012 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/congestion_controller/include/send_side_congestion_controller.h"
-
-#include <algorithm>
-#include <memory>
-#include <vector>
-
-#include "webrtc/modules/bitrate_controller/include/bitrate_controller.h"
-#include "webrtc/modules/congestion_controller/acknowledged_bitrate_estimator.h"
-#include "webrtc/modules/congestion_controller/probe_controller.h"
-#include "webrtc/modules/pacing/alr_detector.h"
-#include "webrtc/modules/remote_bitrate_estimator/include/bwe_defines.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/format_macros.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/ptr_util.h"
-#include "webrtc/rtc_base/rate_limiter.h"
-#include "webrtc/rtc_base/socket.h"
-#include "webrtc/rtc_base/timeutils.h"
-#include "webrtc/system_wrappers/include/field_trial.h"
-
-namespace webrtc {
-namespace {
-
-const char kCwndExperiment[] = "WebRTC-CwndExperiment";
-const int64_t kDefaultAcceptedQueueMs = 250;
-
-bool CwndExperimentEnabled() {
-  std::string experiment_string =
-      webrtc::field_trial::FindFullName(kCwndExperiment);
-  // The experiment is enabled iff the field trial string begins with "Enabled".
-  return experiment_string.find("Enabled") == 0;
-}
-
-bool ReadCwndExperimentParameter(int64_t* accepted_queue_ms) {
-  RTC_DCHECK(accepted_queue_ms);
-  std::string experiment_string =
-      webrtc::field_trial::FindFullName(kCwndExperiment);
-  int parsed_values =
-      sscanf(experiment_string.c_str(), "Enabled-%" PRId64, accepted_queue_ms);
-  if (parsed_values == 1) {
-    RTC_CHECK_GE(*accepted_queue_ms, 0)
-        << "Accepted must be greater than or equal to 0.";
-    return true;
-  }
-  return false;
-}
-
-static const int64_t kRetransmitWindowSizeMs = 500;
-
-// Makes sure that the bitrate and the min, max values are in valid range.
-static void ClampBitrates(int* bitrate_bps,
-                          int* min_bitrate_bps,
-                          int* max_bitrate_bps) {
-  // TODO(holmer): We should make sure the default bitrates are set to 10 kbps,
-  // and that we don't try to set the min bitrate to 0 from any applications.
-  // The congestion controller should allow a min bitrate of 0.
-  if (*min_bitrate_bps < congestion_controller::GetMinBitrateBps())
-    *min_bitrate_bps = congestion_controller::GetMinBitrateBps();
-  if (*max_bitrate_bps > 0)
-    *max_bitrate_bps = std::max(*min_bitrate_bps, *max_bitrate_bps);
-  if (*bitrate_bps > 0)
-    *bitrate_bps = std::max(*min_bitrate_bps, *bitrate_bps);
-}
-
-std::vector<webrtc::PacketFeedback> ReceivedPacketFeedbackVector(
-    const std::vector<webrtc::PacketFeedback>& input) {
-  std::vector<PacketFeedback> received_packet_feedback_vector;
-  auto is_received = [](const webrtc::PacketFeedback& packet_feedback) {
-    return packet_feedback.arrival_time_ms !=
-           webrtc::PacketFeedback::kNotReceived;
-  };
-  std::copy_if(input.begin(), input.end(),
-               std::back_inserter(received_packet_feedback_vector),
-               is_received);
-  return received_packet_feedback_vector;
-}
-
-void SortPacketFeedbackVector(
-    std::vector<webrtc::PacketFeedback>* const input) {
-  RTC_DCHECK(input);
-  std::sort(input->begin(), input->end(), PacketFeedbackComparator());
-}
-
-}  // namespace
-
-SendSideCongestionController::SendSideCongestionController(
-    const Clock* clock,
-    Observer* observer,
-    RtcEventLog* event_log,
-    PacketRouter* packet_router)
-    : clock_(clock),
-      observer_(observer),
-      event_log_(event_log),
-      owned_pacer_(
-          rtc::MakeUnique<PacedSender>(clock, packet_router, event_log)),
-      pacer_(owned_pacer_.get()),
-      bitrate_controller_(
-          BitrateController::CreateBitrateController(clock_, event_log)),
-      acknowledged_bitrate_estimator_(
-          rtc::MakeUnique<AcknowledgedBitrateEstimator>()),
-      probe_controller_(new ProbeController(pacer_, clock_)),
-      retransmission_rate_limiter_(
-          new RateLimiter(clock, kRetransmitWindowSizeMs)),
-      transport_feedback_adapter_(clock_),
-      last_reported_bitrate_bps_(0),
-      last_reported_fraction_loss_(0),
-      last_reported_rtt_(0),
-      network_state_(kNetworkUp),
-      pause_pacer_(false),
-      pacer_paused_(false),
-      min_bitrate_bps_(congestion_controller::GetMinBitrateBps()),
-      delay_based_bwe_(new DelayBasedBwe(event_log_, clock_)),
-      in_cwnd_experiment_(CwndExperimentEnabled()),
-      accepted_queue_ms_(kDefaultAcceptedQueueMs),
-      was_in_alr_(0) {
-  delay_based_bwe_->SetMinBitrate(min_bitrate_bps_);
-  if (in_cwnd_experiment_ &&
-      !ReadCwndExperimentParameter(&accepted_queue_ms_)) {
-    LOG(LS_WARNING) << "Failed to parse parameters for CwndExperiment "
-                       "from field trial string. Experiment disabled.";
-    in_cwnd_experiment_ = false;
-  }
-}
-
-SendSideCongestionController::SendSideCongestionController(
-    const Clock* clock,
-    Observer* observer,
-    RtcEventLog* event_log,
-    PacedSender* pacer)
-    : clock_(clock),
-      observer_(observer),
-      event_log_(event_log),
-      pacer_(pacer),
-      bitrate_controller_(
-          BitrateController::CreateBitrateController(clock_, event_log)),
-      acknowledged_bitrate_estimator_(
-          rtc::MakeUnique<AcknowledgedBitrateEstimator>()),
-      probe_controller_(new ProbeController(pacer_, clock_)),
-      retransmission_rate_limiter_(
-          new RateLimiter(clock, kRetransmitWindowSizeMs)),
-      transport_feedback_adapter_(clock_),
-      last_reported_bitrate_bps_(0),
-      last_reported_fraction_loss_(0),
-      last_reported_rtt_(0),
-      network_state_(kNetworkUp),
-      pause_pacer_(false),
-      pacer_paused_(false),
-      min_bitrate_bps_(congestion_controller::GetMinBitrateBps()),
-      delay_based_bwe_(new DelayBasedBwe(event_log_, clock_)),
-      in_cwnd_experiment_(CwndExperimentEnabled()),
-      accepted_queue_ms_(kDefaultAcceptedQueueMs),
-      was_in_alr_(0) {
-  delay_based_bwe_->SetMinBitrate(min_bitrate_bps_);
-  if (in_cwnd_experiment_ &&
-      !ReadCwndExperimentParameter(&accepted_queue_ms_)) {
-    LOG(LS_WARNING) << "Failed to parse parameters for CwndExperiment "
-                       "from field trial string. Experiment disabled.";
-    in_cwnd_experiment_ = false;
-  }
-}
-
-SendSideCongestionController::~SendSideCongestionController() {}
-
-void SendSideCongestionController::RegisterPacketFeedbackObserver(
-    PacketFeedbackObserver* observer) {
-  transport_feedback_adapter_.RegisterPacketFeedbackObserver(observer);
-}
-
-void SendSideCongestionController::DeRegisterPacketFeedbackObserver(
-    PacketFeedbackObserver* observer) {
-  transport_feedback_adapter_.DeRegisterPacketFeedbackObserver(observer);
-}
-
-void SendSideCongestionController::RegisterNetworkObserver(Observer* observer) {
-  rtc::CritScope cs(&observer_lock_);
-  RTC_DCHECK(observer_ == nullptr);
-  observer_ = observer;
-}
-
-void SendSideCongestionController::DeRegisterNetworkObserver(
-    Observer* observer) {
-  rtc::CritScope cs(&observer_lock_);
-  RTC_DCHECK_EQ(observer_, observer);
-  observer_ = nullptr;
-}
-
-void SendSideCongestionController::SetBweBitrates(int min_bitrate_bps,
-                                                  int start_bitrate_bps,
-                                                  int max_bitrate_bps) {
-  ClampBitrates(&start_bitrate_bps, &min_bitrate_bps, &max_bitrate_bps);
-  bitrate_controller_->SetBitrates(start_bitrate_bps, min_bitrate_bps,
-                                   max_bitrate_bps);
-
-  probe_controller_->SetBitrates(min_bitrate_bps, start_bitrate_bps,
-                                 max_bitrate_bps);
-
-  {
-    rtc::CritScope cs(&bwe_lock_);
-    if (start_bitrate_bps > 0)
-      delay_based_bwe_->SetStartBitrate(start_bitrate_bps);
-    min_bitrate_bps_ = min_bitrate_bps;
-    delay_based_bwe_->SetMinBitrate(min_bitrate_bps_);
-  }
-  MaybeTriggerOnNetworkChanged();
-}
-
-// TODO(holmer): Split this up and use SetBweBitrates in combination with
-// OnNetworkRouteChanged.
-void SendSideCongestionController::OnNetworkRouteChanged(
-    const rtc::NetworkRoute& network_route,
-    int bitrate_bps,
-    int min_bitrate_bps,
-    int max_bitrate_bps) {
-  ClampBitrates(&bitrate_bps, &min_bitrate_bps, &max_bitrate_bps);
-  // TODO(honghaiz): Recreate this object once the bitrate controller is
-  // no longer exposed outside SendSideCongestionController.
-  bitrate_controller_->ResetBitrates(bitrate_bps, min_bitrate_bps,
-                                     max_bitrate_bps);
-
-  transport_feedback_adapter_.SetNetworkIds(network_route.local_network_id,
-                                            network_route.remote_network_id);
-  {
-    rtc::CritScope cs(&bwe_lock_);
-    min_bitrate_bps_ = min_bitrate_bps;
-    delay_based_bwe_.reset(new DelayBasedBwe(event_log_, clock_));
-    acknowledged_bitrate_estimator_.reset(new AcknowledgedBitrateEstimator());
-    delay_based_bwe_->SetStartBitrate(bitrate_bps);
-    delay_based_bwe_->SetMinBitrate(min_bitrate_bps);
-  }
-
-  probe_controller_->Reset();
-  probe_controller_->SetBitrates(min_bitrate_bps, bitrate_bps, max_bitrate_bps);
-
-  MaybeTriggerOnNetworkChanged();
-}
-
-BitrateController* SendSideCongestionController::GetBitrateController() const {
-  return bitrate_controller_.get();
-}
-
-RateLimiter* SendSideCongestionController::GetRetransmissionRateLimiter() {
-  return retransmission_rate_limiter_.get();
-}
-
-void SendSideCongestionController::EnablePeriodicAlrProbing(bool enable) {
-  probe_controller_->EnablePeriodicAlrProbing(enable);
-}
-
-int64_t SendSideCongestionController::GetPacerQueuingDelayMs() const {
-  return IsNetworkDown() ? 0 : pacer_->QueueInMs();
-}
-
-int64_t SendSideCongestionController::GetFirstPacketTimeMs() const {
-  return pacer_->FirstSentPacketTimeMs();
-}
-
-TransportFeedbackObserver*
-SendSideCongestionController::GetTransportFeedbackObserver() {
-  return this;
-}
-
-void SendSideCongestionController::SignalNetworkState(NetworkState state) {
-  LOG(LS_INFO) << "SignalNetworkState "
-               << (state == kNetworkUp ? "Up" : "Down");
-  {
-    rtc::CritScope cs(&network_state_lock_);
-    pause_pacer_ = state == kNetworkDown;
-    network_state_ = state;
-  }
-  probe_controller_->OnNetworkStateChanged(state);
-  MaybeTriggerOnNetworkChanged();
-}
-
-void SendSideCongestionController::SetTransportOverhead(
-    size_t transport_overhead_bytes_per_packet) {
-  transport_feedback_adapter_.SetTransportOverhead(
-      transport_overhead_bytes_per_packet);
-}
-
-void SendSideCongestionController::OnSentPacket(
-    const rtc::SentPacket& sent_packet) {
-  // We're not interested in packets without an id, which may be stun packets,
-  // etc, sent on the same transport.
-  if (sent_packet.packet_id == -1)
-    return;
-  transport_feedback_adapter_.OnSentPacket(sent_packet.packet_id,
-                                           sent_packet.send_time_ms);
-  if (in_cwnd_experiment_)
-    LimitOutstandingBytes(transport_feedback_adapter_.GetOutstandingBytes());
-}
-
-void SendSideCongestionController::OnRttUpdate(int64_t avg_rtt_ms,
-                                               int64_t max_rtt_ms) {
-  rtc::CritScope cs(&bwe_lock_);
-  delay_based_bwe_->OnRttUpdate(avg_rtt_ms, max_rtt_ms);
-}
-
-int64_t SendSideCongestionController::TimeUntilNextProcess() {
-  return bitrate_controller_->TimeUntilNextProcess();
-}
-
-void SendSideCongestionController::Process() {
-  bool pause_pacer;
-  // TODO(holmer): Once this class is running on a task queue we should
-  // replace this with a task instead.
-  {
-    rtc::CritScope lock(&network_state_lock_);
-    pause_pacer = pause_pacer_;
-  }
-  if (pause_pacer && !pacer_paused_) {
-    pacer_->Pause();
-    pacer_paused_ = true;
-  } else if (!pause_pacer && pacer_paused_) {
-    pacer_->Resume();
-    pacer_paused_ = false;
-  }
-  bitrate_controller_->Process();
-  probe_controller_->Process();
-  MaybeTriggerOnNetworkChanged();
-}
-
-void SendSideCongestionController::AddPacket(
-    uint32_t ssrc,
-    uint16_t sequence_number,
-    size_t length,
-    const PacedPacketInfo& pacing_info) {
-  transport_feedback_adapter_.AddPacket(ssrc, sequence_number, length,
-                                        pacing_info);
-}
-
-void SendSideCongestionController::OnTransportFeedback(
-    const rtcp::TransportFeedback& feedback) {
-  RTC_DCHECK_RUNS_SERIALIZED(&worker_race_);
-  transport_feedback_adapter_.OnTransportFeedback(feedback);
-  std::vector<PacketFeedback> feedback_vector = ReceivedPacketFeedbackVector(
-      transport_feedback_adapter_.GetTransportFeedbackVector());
-  SortPacketFeedbackVector(&feedback_vector);
-
-  bool currently_in_alr =
-      pacer_->GetApplicationLimitedRegionStartTime().has_value();
-  if (was_in_alr_ && !currently_in_alr) {
-    int64_t now_ms = rtc::TimeMillis();
-    acknowledged_bitrate_estimator_->SetAlrEndedTimeMs(now_ms);
-    probe_controller_->SetAlrEndedTimeMs(now_ms);
-  }
-  was_in_alr_ = currently_in_alr;
-
-  acknowledged_bitrate_estimator_->IncomingPacketFeedbackVector(
-      feedback_vector);
-  DelayBasedBwe::Result result;
-  {
-    rtc::CritScope cs(&bwe_lock_);
-    result = delay_based_bwe_->IncomingPacketFeedbackVector(
-        feedback_vector, acknowledged_bitrate_estimator_->bitrate_bps());
-  }
-  if (result.updated) {
-    bitrate_controller_->OnDelayBasedBweResult(result);
-    // Update the estimate in the ProbeController, in case we want to probe.
-    MaybeTriggerOnNetworkChanged();
-  }
-  if (result.recovered_from_overuse)
-    probe_controller_->RequestProbe();
-  if (in_cwnd_experiment_)
-    LimitOutstandingBytes(transport_feedback_adapter_.GetOutstandingBytes());
-}
-
-void SendSideCongestionController::LimitOutstandingBytes(
-    size_t num_outstanding_bytes) {
-  RTC_DCHECK(in_cwnd_experiment_);
-  rtc::CritScope lock(&network_state_lock_);
-  rtc::Optional<int64_t> min_rtt_ms =
-      transport_feedback_adapter_.GetMinFeedbackLoopRtt();
-  // No valid RTT. Could be because send-side BWE isn't used, in which case
-  // we don't try to limit the outstanding packets.
-  if (!min_rtt_ms)
-    return;
-  const size_t kMinCwndBytes = 2 * 1500;
-  size_t max_outstanding_bytes =
-      std::max<size_t>((*min_rtt_ms + accepted_queue_ms_) *
-                           last_reported_bitrate_bps_ / 1000 / 8,
-                       kMinCwndBytes);
-  LOG(LS_INFO) << clock_->TimeInMilliseconds()
-               << " Outstanding bytes: " << num_outstanding_bytes
-               << " pacer queue: " << pacer_->QueueInMs()
-               << " max outstanding: " << max_outstanding_bytes;
-  LOG(LS_INFO) << "Feedback rtt: " << *min_rtt_ms
-               << " Bitrate: " << last_reported_bitrate_bps_;
-  pause_pacer_ = num_outstanding_bytes > max_outstanding_bytes;
-}
-
-std::vector<PacketFeedback>
-SendSideCongestionController::GetTransportFeedbackVector() const {
-  RTC_DCHECK_RUNS_SERIALIZED(&worker_race_);
-  return transport_feedback_adapter_.GetTransportFeedbackVector();
-}
-
-void SendSideCongestionController::MaybeTriggerOnNetworkChanged() {
-  uint32_t bitrate_bps;
-  uint8_t fraction_loss;
-  int64_t rtt;
-  bool estimate_changed = bitrate_controller_->GetNetworkParameters(
-      &bitrate_bps, &fraction_loss, &rtt);
-  if (estimate_changed) {
-    pacer_->SetEstimatedBitrate(bitrate_bps);
-    probe_controller_->SetEstimatedBitrate(bitrate_bps);
-    retransmission_rate_limiter_->SetMaxRate(bitrate_bps);
-  }
-
-  bitrate_bps = IsNetworkDown() || IsSendQueueFull() ? 0 : bitrate_bps;
-
-  if (HasNetworkParametersToReportChanged(bitrate_bps, fraction_loss, rtt)) {
-    int64_t probing_interval_ms;
-    {
-      rtc::CritScope cs(&bwe_lock_);
-      probing_interval_ms = delay_based_bwe_->GetExpectedBwePeriodMs();
-    }
-    {
-      rtc::CritScope cs(&observer_lock_);
-      if (observer_) {
-        observer_->OnNetworkChanged(bitrate_bps, fraction_loss, rtt,
-                                    probing_interval_ms);
-      }
-    }
-  }
-}
-
-bool SendSideCongestionController::HasNetworkParametersToReportChanged(
-    uint32_t bitrate_bps,
-    uint8_t fraction_loss,
-    int64_t rtt) {
-  rtc::CritScope cs(&network_state_lock_);
-  bool changed =
-      last_reported_bitrate_bps_ != bitrate_bps ||
-      (bitrate_bps > 0 && (last_reported_fraction_loss_ != fraction_loss ||
-                           last_reported_rtt_ != rtt));
-  if (changed && (last_reported_bitrate_bps_ == 0 || bitrate_bps == 0)) {
-    LOG(LS_INFO) << "Bitrate estimate state changed, BWE: " << bitrate_bps
-                 << " bps.";
-  }
-  last_reported_bitrate_bps_ = bitrate_bps;
-  last_reported_fraction_loss_ = fraction_loss;
-  last_reported_rtt_ = rtt;
-  return changed;
-}
-
-bool SendSideCongestionController::IsSendQueueFull() const {
-  return pacer_->ExpectedQueueTimeMs() > PacedSender::kMaxQueueLengthMs;
-}
-
-bool SendSideCongestionController::IsNetworkDown() const {
-  rtc::CritScope cs(&network_state_lock_);
-  return network_state_ == kNetworkDown;
-}
-
-}  // namespace webrtc
diff --git a/modules/congestion_controller/send_side_congestion_controller_unittest.cc b/modules/congestion_controller/send_side_congestion_controller_unittest.cc
deleted file mode 100644
index 07c0e39..0000000
--- a/modules/congestion_controller/send_side_congestion_controller_unittest.cc
+++ /dev/null
@@ -1,459 +0,0 @@
-/*
- *  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/congestion_controller/include/send_side_congestion_controller.h"
-#include "webrtc/logging/rtc_event_log/mock/mock_rtc_event_log.h"
-#include "webrtc/modules/bitrate_controller/include/bitrate_controller.h"
-#include "webrtc/modules/congestion_controller/congestion_controller_unittests_helper.h"
-#include "webrtc/modules/congestion_controller/include/mock/mock_congestion_observer.h"
-#include "webrtc/modules/pacing/mock/mock_paced_sender.h"
-#include "webrtc/modules/remote_bitrate_estimator/include/bwe_defines.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/transport_feedback.h"
-#include "webrtc/rtc_base/socket.h"
-#include "webrtc/system_wrappers/include/clock.h"
-#include "webrtc/test/gmock.h"
-#include "webrtc/test/gtest.h"
-
-using testing::_;
-using testing::AtLeast;
-using testing::NiceMock;
-using testing::Return;
-using testing::SaveArg;
-using testing::StrictMock;
-
-namespace webrtc {
-
-namespace {
-const webrtc::PacedPacketInfo kPacingInfo0(0, 5, 2000);
-const webrtc::PacedPacketInfo kPacingInfo1(1, 8, 4000);
-
-class MockPacketRouter : public PacketRouter {
- public:
-  MOCK_METHOD2(OnReceiveBitrateChanged,
-               void(const std::vector<uint32_t>& ssrcs, uint32_t bitrate));
-};
-
-const uint32_t kInitialBitrateBps = 60000;
-
-}  // namespace
-
-namespace test {
-
-class SendSideCongestionControllerTest : public ::testing::Test {
- protected:
-  SendSideCongestionControllerTest()
-      : clock_(123456), target_bitrate_observer_(this) {}
-  ~SendSideCongestionControllerTest() override {}
-
-  void SetUp() override {
-    pacer_.reset(new NiceMock<MockPacedSender>());
-    controller_.reset(new SendSideCongestionController(
-        &clock_, &observer_, &event_log_, pacer_.get()));
-    bandwidth_observer_.reset(
-        controller_->GetBitrateController()->CreateRtcpBandwidthObserver());
-
-    // Set the initial bitrate estimate and expect the |observer| and |pacer_|
-    // to be updated.
-    EXPECT_CALL(observer_, OnNetworkChanged(kInitialBitrateBps, _, _, _));
-    EXPECT_CALL(*pacer_, SetEstimatedBitrate(kInitialBitrateBps));
-    EXPECT_CALL(*pacer_, CreateProbeCluster(kInitialBitrateBps * 3));
-    EXPECT_CALL(*pacer_, CreateProbeCluster(kInitialBitrateBps * 5));
-    controller_->SetBweBitrates(0, kInitialBitrateBps, 5 * kInitialBitrateBps);
-  }
-
-  // Custom setup - use an observer that tracks the target bitrate, without
-  // prescribing on which iterations it must change (like a mock would).
-  void TargetBitrateTrackingSetup() {
-    pacer_.reset(new NiceMock<MockPacedSender>());
-    controller_.reset(new SendSideCongestionController(
-        &clock_, &target_bitrate_observer_, &event_log_, pacer_.get()));
-    controller_->SetBweBitrates(0, kInitialBitrateBps, 5 * kInitialBitrateBps);
-  }
-
-  void OnSentPacket(const PacketFeedback& packet_feedback) {
-    constexpr uint32_t ssrc = 0;
-    controller_->AddPacket(ssrc, packet_feedback.sequence_number,
-                           packet_feedback.payload_size,
-                           packet_feedback.pacing_info);
-    controller_->OnSentPacket(rtc::SentPacket(packet_feedback.sequence_number,
-                                              packet_feedback.send_time_ms));
-  }
-
-  // Allows us to track the target bitrate, without prescribing the exact
-  // iterations when this would hapen, like a mock would.
-  class TargetBitrateObserver : public SendSideCongestionController::Observer {
-   public:
-    explicit TargetBitrateObserver(SendSideCongestionControllerTest* owner)
-        : owner_(owner) {}
-    ~TargetBitrateObserver() override = default;
-    void OnNetworkChanged(uint32_t bitrate_bps,
-                          uint8_t fraction_loss,  // 0 - 255.
-                          int64_t rtt_ms,
-                          int64_t probing_interval_ms) override {
-      owner_->target_bitrate_bps_ = rtc::Optional<uint32_t>(bitrate_bps);
-    }
-
-   private:
-    SendSideCongestionControllerTest* owner_;
-  };
-
-  void PacketTransmissionAndFeedbackBlock(uint16_t* seq_num,
-                                          int64_t runtime_ms,
-                                          int64_t delay) {
-    int64_t delay_buildup = 0;
-    int64_t start_time_ms = clock_.TimeInMilliseconds();
-    while (clock_.TimeInMilliseconds() - start_time_ms < runtime_ms) {
-      constexpr size_t kPayloadSize = 1000;
-      PacketFeedback packet(clock_.TimeInMilliseconds() + delay_buildup,
-                            clock_.TimeInMilliseconds(), *seq_num, kPayloadSize,
-                            PacedPacketInfo());
-      delay_buildup += delay;  // Delay has to increase, or it's just RTT.
-      OnSentPacket(packet);
-      // Create expected feedback and send into adapter.
-      std::unique_ptr<rtcp::TransportFeedback> feedback(
-          new rtcp::TransportFeedback());
-      feedback->SetBase(packet.sequence_number, packet.arrival_time_ms * 1000);
-      EXPECT_TRUE(feedback->AddReceivedPacket(packet.sequence_number,
-                                              packet.arrival_time_ms * 1000));
-      rtc::Buffer raw_packet = feedback->Build();
-      feedback = rtcp::TransportFeedback::ParseFrom(raw_packet.data(),
-                                                    raw_packet.size());
-      EXPECT_TRUE(feedback.get() != nullptr);
-      controller_->OnTransportFeedback(*feedback.get());
-      clock_.AdvanceTimeMilliseconds(50);
-      controller_->Process();
-      ++(*seq_num);
-    }
-  }
-
-  SimulatedClock clock_;
-  StrictMock<MockCongestionObserver> observer_;
-  TargetBitrateObserver target_bitrate_observer_;
-  NiceMock<MockRtcEventLog> event_log_;
-  std::unique_ptr<RtcpBandwidthObserver> bandwidth_observer_;
-  PacketRouter packet_router_;
-  std::unique_ptr<NiceMock<MockPacedSender>> pacer_;
-  std::unique_ptr<SendSideCongestionController> controller_;
-
-  rtc::Optional<uint32_t> target_bitrate_bps_;
-};
-
-TEST_F(SendSideCongestionControllerTest, OnNetworkChanged) {
-  // Test no change.
-  clock_.AdvanceTimeMilliseconds(25);
-  controller_->Process();
-
-  EXPECT_CALL(observer_, OnNetworkChanged(kInitialBitrateBps * 2, _, _, _));
-  EXPECT_CALL(*pacer_, SetEstimatedBitrate(kInitialBitrateBps * 2));
-  bandwidth_observer_->OnReceivedEstimatedBitrate(kInitialBitrateBps * 2);
-  clock_.AdvanceTimeMilliseconds(25);
-  controller_->Process();
-
-  EXPECT_CALL(observer_, OnNetworkChanged(kInitialBitrateBps, _, _, _));
-  EXPECT_CALL(*pacer_, SetEstimatedBitrate(kInitialBitrateBps));
-  bandwidth_observer_->OnReceivedEstimatedBitrate(kInitialBitrateBps);
-  clock_.AdvanceTimeMilliseconds(25);
-  controller_->Process();
-}
-
-TEST_F(SendSideCongestionControllerTest, OnSendQueueFull) {
-  EXPECT_CALL(*pacer_, ExpectedQueueTimeMs())
-      .WillOnce(Return(PacedSender::kMaxQueueLengthMs + 1));
-
-  EXPECT_CALL(observer_, OnNetworkChanged(0, _, _, _));
-  controller_->Process();
-
-  // Let the pacer not be full next time the controller checks.
-  EXPECT_CALL(*pacer_, ExpectedQueueTimeMs())
-      .WillOnce(Return(PacedSender::kMaxQueueLengthMs - 1));
-
-  EXPECT_CALL(observer_, OnNetworkChanged(kInitialBitrateBps, _, _, _));
-  controller_->Process();
-}
-
-TEST_F(SendSideCongestionControllerTest, OnSendQueueFullAndEstimateChange) {
-  EXPECT_CALL(*pacer_, ExpectedQueueTimeMs())
-      .WillOnce(Return(PacedSender::kMaxQueueLengthMs + 1));
-  EXPECT_CALL(observer_, OnNetworkChanged(0, _, _, _));
-  controller_->Process();
-
-  // Receive new estimate but let the queue still be full.
-  bandwidth_observer_->OnReceivedEstimatedBitrate(kInitialBitrateBps * 2);
-  EXPECT_CALL(*pacer_, ExpectedQueueTimeMs())
-      .WillOnce(Return(PacedSender::kMaxQueueLengthMs + 1));
-  //  The send pacer should get the new estimate though.
-  EXPECT_CALL(*pacer_, SetEstimatedBitrate(kInitialBitrateBps * 2));
-  clock_.AdvanceTimeMilliseconds(25);
-  controller_->Process();
-
-  // Let the pacer not be full next time the controller checks.
-  // |OnNetworkChanged| should be called with the new estimate.
-  EXPECT_CALL(*pacer_, ExpectedQueueTimeMs())
-      .WillOnce(Return(PacedSender::kMaxQueueLengthMs - 1));
-  EXPECT_CALL(observer_, OnNetworkChanged(kInitialBitrateBps * 2, _, _, _));
-  clock_.AdvanceTimeMilliseconds(25);
-  controller_->Process();
-}
-
-TEST_F(SendSideCongestionControllerTest, SignalNetworkState) {
-  EXPECT_CALL(observer_, OnNetworkChanged(0, _, _, _));
-  controller_->SignalNetworkState(kNetworkDown);
-
-  EXPECT_CALL(observer_, OnNetworkChanged(kInitialBitrateBps, _, _, _));
-  controller_->SignalNetworkState(kNetworkUp);
-
-  EXPECT_CALL(observer_, OnNetworkChanged(0, _, _, _));
-  controller_->SignalNetworkState(kNetworkDown);
-}
-
-TEST_F(SendSideCongestionControllerTest, OnNetworkRouteChanged) {
-  int new_bitrate = 200000;
-  testing::Mock::VerifyAndClearExpectations(pacer_.get());
-  EXPECT_CALL(observer_, OnNetworkChanged(new_bitrate, _, _, _));
-  EXPECT_CALL(*pacer_, SetEstimatedBitrate(new_bitrate));
-  rtc::NetworkRoute route;
-  route.local_network_id = 1;
-  controller_->OnNetworkRouteChanged(route, new_bitrate, -1, -1);
-
-  // If the bitrate is reset to -1, the new starting bitrate will be
-  // the minimum default bitrate kMinBitrateBps.
-  EXPECT_CALL(
-      observer_,
-      OnNetworkChanged(congestion_controller::GetMinBitrateBps(), _, _, _));
-  EXPECT_CALL(*pacer_,
-              SetEstimatedBitrate(congestion_controller::GetMinBitrateBps()));
-  route.local_network_id = 2;
-  controller_->OnNetworkRouteChanged(route, -1, -1, -1);
-}
-
-TEST_F(SendSideCongestionControllerTest, OldFeedback) {
-  int new_bitrate = 200000;
-  testing::Mock::VerifyAndClearExpectations(pacer_.get());
-  EXPECT_CALL(observer_, OnNetworkChanged(new_bitrate, _, _, _));
-  EXPECT_CALL(*pacer_, SetEstimatedBitrate(new_bitrate));
-
-  // Send a few packets on the first network route.
-  std::vector<PacketFeedback> packets;
-  packets.push_back(PacketFeedback(0, 0, 0, 1500, kPacingInfo0));
-  packets.push_back(PacketFeedback(10, 10, 1, 1500, kPacingInfo0));
-  packets.push_back(PacketFeedback(20, 20, 2, 1500, kPacingInfo0));
-  packets.push_back(PacketFeedback(30, 30, 3, 1500, kPacingInfo1));
-  packets.push_back(PacketFeedback(40, 40, 4, 1500, kPacingInfo1));
-
-  for (const PacketFeedback& packet : packets)
-    OnSentPacket(packet);
-
-  // Change route and then insert a number of feedback packets.
-  rtc::NetworkRoute route;
-  route.local_network_id = 1;
-  controller_->OnNetworkRouteChanged(route, new_bitrate, -1, -1);
-
-  for (const PacketFeedback& packet : packets) {
-    rtcp::TransportFeedback feedback;
-    feedback.SetBase(packet.sequence_number, packet.arrival_time_ms * 1000);
-
-    EXPECT_TRUE(feedback.AddReceivedPacket(packet.sequence_number,
-                                           packet.arrival_time_ms * 1000));
-    feedback.Build();
-    controller_->OnTransportFeedback(feedback);
-  }
-
-  // If the bitrate is reset to -1, the new starting bitrate will be
-  // the minimum default bitrate kMinBitrateBps.
-  EXPECT_CALL(
-      observer_,
-      OnNetworkChanged(congestion_controller::GetMinBitrateBps(), _, _, _));
-  EXPECT_CALL(*pacer_,
-              SetEstimatedBitrate(congestion_controller::GetMinBitrateBps()));
-  route.local_network_id = 2;
-  controller_->OnNetworkRouteChanged(route, -1, -1, -1);
-}
-
-TEST_F(SendSideCongestionControllerTest,
-       SignalNetworkStateAndQueueIsFullAndEstimateChange) {
-  // Send queue is full
-  EXPECT_CALL(*pacer_, ExpectedQueueTimeMs())
-      .WillRepeatedly(Return(PacedSender::kMaxQueueLengthMs + 1));
-  EXPECT_CALL(observer_, OnNetworkChanged(0, _, _, _));
-  controller_->Process();
-
-  // Queue is full and network is down. Expect no bitrate change.
-  controller_->SignalNetworkState(kNetworkDown);
-  controller_->Process();
-
-  // Queue is full but network is up. Expect no bitrate change.
-  controller_->SignalNetworkState(kNetworkUp);
-  controller_->Process();
-
-  // Receive new estimate but let the queue still be full.
-  EXPECT_CALL(*pacer_, SetEstimatedBitrate(kInitialBitrateBps * 2));
-  bandwidth_observer_->OnReceivedEstimatedBitrate(kInitialBitrateBps * 2);
-  clock_.AdvanceTimeMilliseconds(25);
-  controller_->Process();
-
-  // Let the pacer not be full next time the controller checks.
-  EXPECT_CALL(*pacer_, ExpectedQueueTimeMs())
-      .WillOnce(Return(PacedSender::kMaxQueueLengthMs - 1));
-  EXPECT_CALL(observer_, OnNetworkChanged(kInitialBitrateBps * 2, _, _, _));
-  controller_->Process();
-}
-
-TEST_F(SendSideCongestionControllerTest, GetPacerQueuingDelayMs) {
-  EXPECT_CALL(observer_, OnNetworkChanged(_, _, _, _)).Times(AtLeast(1));
-
-  const int64_t kQueueTimeMs = 123;
-  EXPECT_CALL(*pacer_, QueueInMs()).WillRepeatedly(Return(kQueueTimeMs));
-  EXPECT_EQ(kQueueTimeMs, controller_->GetPacerQueuingDelayMs());
-
-  // Expect zero pacer delay when network is down.
-  controller_->SignalNetworkState(kNetworkDown);
-  EXPECT_EQ(0, controller_->GetPacerQueuingDelayMs());
-
-  // Network is up, pacer delay should be reported.
-  controller_->SignalNetworkState(kNetworkUp);
-  EXPECT_EQ(kQueueTimeMs, controller_->GetPacerQueuingDelayMs());
-}
-
-TEST_F(SendSideCongestionControllerTest, GetProbingInterval) {
-  clock_.AdvanceTimeMilliseconds(25);
-  controller_->Process();
-
-  EXPECT_CALL(observer_, OnNetworkChanged(_, _, _, testing::Ne(0)));
-  EXPECT_CALL(*pacer_, SetEstimatedBitrate(_));
-  bandwidth_observer_->OnReceivedEstimatedBitrate(kInitialBitrateBps * 2);
-  clock_.AdvanceTimeMilliseconds(25);
-  controller_->Process();
-}
-
-TEST_F(SendSideCongestionControllerTest, ProbeOnRouteChange) {
-  testing::Mock::VerifyAndClearExpectations(pacer_.get());
-  EXPECT_CALL(*pacer_, CreateProbeCluster(kInitialBitrateBps * 6));
-  EXPECT_CALL(*pacer_, CreateProbeCluster(kInitialBitrateBps * 12));
-  EXPECT_CALL(observer_, OnNetworkChanged(kInitialBitrateBps * 2, _, _, _));
-  rtc::NetworkRoute route;
-  route.local_network_id = 1;
-  controller_->OnNetworkRouteChanged(route, 2 * kInitialBitrateBps, 0,
-                                     20 * kInitialBitrateBps);
-}
-
-// Estimated bitrate reduced when the feedbacks arrive with such a long delay,
-// that the send-time-history no longer holds the feedbacked packets.
-TEST_F(SendSideCongestionControllerTest, LongFeedbackDelays) {
-  TargetBitrateTrackingSetup();
-
-  const int64_t kFeedbackTimeoutMs = 60001;
-  const int kMaxConsecutiveFailedLookups = 5;
-  for (int i = 0; i < kMaxConsecutiveFailedLookups; ++i) {
-    std::vector<PacketFeedback> packets;
-    packets.push_back(
-        PacketFeedback(i * 100, 2 * i * 100, 0, 1500, kPacingInfo0));
-    packets.push_back(
-        PacketFeedback(i * 100 + 10, 2 * i * 100 + 10, 1, 1500, kPacingInfo0));
-    packets.push_back(
-        PacketFeedback(i * 100 + 20, 2 * i * 100 + 20, 2, 1500, kPacingInfo0));
-    packets.push_back(
-        PacketFeedback(i * 100 + 30, 2 * i * 100 + 30, 3, 1500, kPacingInfo1));
-    packets.push_back(
-        PacketFeedback(i * 100 + 40, 2 * i * 100 + 40, 4, 1500, kPacingInfo1));
-
-    for (const PacketFeedback& packet : packets)
-      OnSentPacket(packet);
-
-    rtcp::TransportFeedback feedback;
-    feedback.SetBase(packets[0].sequence_number,
-                     packets[0].arrival_time_ms * 1000);
-
-    for (const PacketFeedback& packet : packets) {
-      EXPECT_TRUE(feedback.AddReceivedPacket(packet.sequence_number,
-                                             packet.arrival_time_ms * 1000));
-    }
-
-    feedback.Build();
-
-    clock_.AdvanceTimeMilliseconds(kFeedbackTimeoutMs);
-    PacketFeedback later_packet(kFeedbackTimeoutMs + i * 100 + 40,
-                                kFeedbackTimeoutMs + i * 200 + 40, 5, 1500,
-                                kPacingInfo1);
-    OnSentPacket(later_packet);
-
-    controller_->OnTransportFeedback(feedback);
-
-    // Check that packets have timed out.
-    for (PacketFeedback& packet : packets) {
-      packet.send_time_ms = -1;
-      packet.payload_size = 0;
-      packet.pacing_info = PacedPacketInfo();
-    }
-    ComparePacketFeedbackVectors(packets,
-                                 controller_->GetTransportFeedbackVector());
-  }
-
-  controller_->Process();
-
-  EXPECT_EQ(kInitialBitrateBps / 2, target_bitrate_bps_);
-
-  // Test with feedback that isn't late enough to time out.
-  {
-    std::vector<PacketFeedback> packets;
-    packets.push_back(PacketFeedback(100, 200, 0, 1500, kPacingInfo0));
-    packets.push_back(PacketFeedback(110, 210, 1, 1500, kPacingInfo0));
-    packets.push_back(PacketFeedback(120, 220, 2, 1500, kPacingInfo0));
-    packets.push_back(PacketFeedback(130, 230, 3, 1500, kPacingInfo1));
-    packets.push_back(PacketFeedback(140, 240, 4, 1500, kPacingInfo1));
-
-    for (const PacketFeedback& packet : packets)
-      OnSentPacket(packet);
-
-    rtcp::TransportFeedback feedback;
-    feedback.SetBase(packets[0].sequence_number,
-                     packets[0].arrival_time_ms * 1000);
-
-    for (const PacketFeedback& packet : packets) {
-      EXPECT_TRUE(feedback.AddReceivedPacket(packet.sequence_number,
-                                             packet.arrival_time_ms * 1000));
-    }
-
-    feedback.Build();
-
-    clock_.AdvanceTimeMilliseconds(kFeedbackTimeoutMs - 1);
-    PacketFeedback later_packet(kFeedbackTimeoutMs + 140,
-                                kFeedbackTimeoutMs + 240, 5, 1500,
-                                kPacingInfo1);
-    OnSentPacket(later_packet);
-
-    controller_->OnTransportFeedback(feedback);
-    ComparePacketFeedbackVectors(packets,
-                                 controller_->GetTransportFeedbackVector());
-  }
-}
-
-// Bandwidth estimation is updated when feedbacks are received.
-// Feedbacks which show an increasing delay cause the estimation to be reduced.
-TEST_F(SendSideCongestionControllerTest, UpdatesDelayBasedEstimate) {
-  TargetBitrateTrackingSetup();
-
-  const int64_t kRunTimeMs = 6000;
-  uint16_t seq_num = 0;
-
-  // The test must run and insert packets/feedback long enough that the
-  // BWE computes a valid estimate. This is first done in an environment which
-  // simulates no bandwidth limitation, and therefore not built-up delay.
-  PacketTransmissionAndFeedbackBlock(&seq_num, kRunTimeMs, 0);
-  ASSERT_TRUE(target_bitrate_bps_);
-
-  // Repeat, but this time with a building delay, and make sure that the
-  // estimation is adjusted downwards.
-  uint32_t bitrate_before_delay = *target_bitrate_bps_;
-  PacketTransmissionAndFeedbackBlock(&seq_num, kRunTimeMs, 50);
-  EXPECT_LT(*target_bitrate_bps_, bitrate_before_delay);
-}
-}  // namespace test
-}  // namespace webrtc
diff --git a/modules/congestion_controller/transport_feedback_adapter.cc b/modules/congestion_controller/transport_feedback_adapter.cc
deleted file mode 100644
index 918b9c5..0000000
--- a/modules/congestion_controller/transport_feedback_adapter.cc
+++ /dev/null
@@ -1,218 +0,0 @@
-/*
- *  Copyright (c) 2015 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/congestion_controller/transport_feedback_adapter.h"
-
-#include <algorithm>
-
-#include "webrtc/modules/congestion_controller/delay_based_bwe.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/transport_feedback.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/mod_ops.h"
-#include "webrtc/system_wrappers/include/field_trial.h"
-
-namespace webrtc {
-
-const int64_t kNoTimestamp = -1;
-const int64_t kSendTimeHistoryWindowMs = 60000;
-const int64_t kBaseTimestampScaleFactor =
-    rtcp::TransportFeedback::kDeltaScaleFactor * (1 << 8);
-const int64_t kBaseTimestampRangeSizeUs = kBaseTimestampScaleFactor * (1 << 24);
-
-TransportFeedbackAdapter::TransportFeedbackAdapter(const Clock* clock)
-    : send_side_bwe_with_overhead_(
-          webrtc::field_trial::IsEnabled("WebRTC-SendSideBwe-WithOverhead")),
-      transport_overhead_bytes_per_packet_(0),
-      send_time_history_(clock, kSendTimeHistoryWindowMs),
-      clock_(clock),
-      current_offset_ms_(kNoTimestamp),
-      last_timestamp_us_(kNoTimestamp),
-      local_net_id_(0),
-      remote_net_id_(0) {}
-
-TransportFeedbackAdapter::~TransportFeedbackAdapter() {
-  RTC_DCHECK(observers_.empty());
-}
-
-void TransportFeedbackAdapter::RegisterPacketFeedbackObserver(
-    PacketFeedbackObserver* observer) {
-  rtc::CritScope cs(&observers_lock_);
-  RTC_DCHECK(observer);
-  RTC_DCHECK(std::find(observers_.begin(), observers_.end(), observer) ==
-             observers_.end());
-  observers_.push_back(observer);
-}
-
-void TransportFeedbackAdapter::DeRegisterPacketFeedbackObserver(
-    PacketFeedbackObserver* observer) {
-  rtc::CritScope cs(&observers_lock_);
-  RTC_DCHECK(observer);
-  const auto it = std::find(observers_.begin(), observers_.end(), observer);
-  RTC_DCHECK(it != observers_.end());
-  observers_.erase(it);
-}
-
-void TransportFeedbackAdapter::AddPacket(uint32_t ssrc,
-                                         uint16_t sequence_number,
-                                         size_t length,
-                                         const PacedPacketInfo& pacing_info) {
-  {
-    rtc::CritScope cs(&lock_);
-    if (send_side_bwe_with_overhead_) {
-      length += transport_overhead_bytes_per_packet_;
-    }
-    const int64_t creation_time_ms = clock_->TimeInMilliseconds();
-    send_time_history_.AddAndRemoveOld(
-        PacketFeedback(creation_time_ms, sequence_number, length, local_net_id_,
-                       remote_net_id_, pacing_info));
-  }
-
-  {
-    rtc::CritScope cs(&observers_lock_);
-    for (auto observer : observers_) {
-      observer->OnPacketAdded(ssrc, sequence_number);
-    }
-  }
-}
-
-void TransportFeedbackAdapter::OnSentPacket(uint16_t sequence_number,
-                                            int64_t send_time_ms) {
-  rtc::CritScope cs(&lock_);
-  send_time_history_.OnSentPacket(sequence_number, send_time_ms);
-}
-
-void TransportFeedbackAdapter::SetTransportOverhead(
-    int transport_overhead_bytes_per_packet) {
-  rtc::CritScope cs(&lock_);
-  transport_overhead_bytes_per_packet_ = transport_overhead_bytes_per_packet;
-}
-
-void TransportFeedbackAdapter::SetNetworkIds(uint16_t local_id,
-                                             uint16_t remote_id) {
-  rtc::CritScope cs(&lock_);
-  local_net_id_ = local_id;
-  remote_net_id_ = remote_id;
-}
-
-std::vector<PacketFeedback> TransportFeedbackAdapter::GetPacketFeedbackVector(
-    const rtcp::TransportFeedback& feedback) {
-  int64_t timestamp_us = feedback.GetBaseTimeUs();
-  int64_t now_ms = clock_->TimeInMilliseconds();
-  // Add timestamp deltas to a local time base selected on first packet arrival.
-  // This won't be the true time base, but makes it easier to manually inspect
-  // time stamps.
-  if (last_timestamp_us_ == kNoTimestamp) {
-    current_offset_ms_ = now_ms;
-  } else {
-    int64_t delta = timestamp_us - last_timestamp_us_;
-
-    // Detect and compensate for wrap-arounds in base time.
-    if (std::abs(delta - kBaseTimestampRangeSizeUs) < std::abs(delta)) {
-      delta -= kBaseTimestampRangeSizeUs;  // Wrap backwards.
-    } else if (std::abs(delta + kBaseTimestampRangeSizeUs) < std::abs(delta)) {
-      delta += kBaseTimestampRangeSizeUs;  // Wrap forwards.
-    }
-
-    current_offset_ms_ += delta / 1000;
-  }
-  last_timestamp_us_ = timestamp_us;
-
-  std::vector<PacketFeedback> packet_feedback_vector;
-  if (feedback.GetPacketStatusCount() == 0) {
-    LOG(LS_INFO) << "Empty transport feedback packet received.";
-    return packet_feedback_vector;
-  }
-  packet_feedback_vector.reserve(feedback.GetPacketStatusCount());
-  int64_t feedback_rtt = -1;
-  {
-    rtc::CritScope cs(&lock_);
-    size_t failed_lookups = 0;
-    int64_t offset_us = 0;
-    int64_t timestamp_ms = 0;
-    uint16_t seq_num = feedback.GetBaseSequence();
-    for (const auto& packet : feedback.GetReceivedPackets()) {
-      // Insert into the vector those unreceived packets which precede this
-      // iteration's received packet.
-      for (; seq_num != packet.sequence_number(); ++seq_num) {
-        PacketFeedback packet_feedback(PacketFeedback::kNotReceived, seq_num);
-        // Note: Element not removed from history because it might be reported
-        // as received by another feedback.
-        if (!send_time_history_.GetFeedback(&packet_feedback, false))
-          ++failed_lookups;
-        if (packet_feedback.local_net_id == local_net_id_ &&
-            packet_feedback.remote_net_id == remote_net_id_) {
-          packet_feedback_vector.push_back(packet_feedback);
-        }
-      }
-
-      // Handle this iteration's received packet.
-      offset_us += packet.delta_us();
-      timestamp_ms = current_offset_ms_ + (offset_us / 1000);
-      PacketFeedback packet_feedback(timestamp_ms, packet.sequence_number());
-      if (!send_time_history_.GetFeedback(&packet_feedback, true))
-        ++failed_lookups;
-      if (packet_feedback.local_net_id == local_net_id_ &&
-          packet_feedback.remote_net_id == remote_net_id_) {
-        if (packet_feedback.send_time_ms >= 0) {
-          int64_t rtt = now_ms - packet_feedback.send_time_ms;
-          // max() is used to account for feedback being delayed by the
-          // receiver.
-          feedback_rtt = std::max(rtt, feedback_rtt);
-        }
-        packet_feedback_vector.push_back(packet_feedback);
-      }
-
-      ++seq_num;
-    }
-
-    if (failed_lookups > 0) {
-      LOG(LS_WARNING) << "Failed to lookup send time for " << failed_lookups
-                      << " packet" << (failed_lookups > 1 ? "s" : "")
-                      << ". Send time history too small?";
-    }
-    if (feedback_rtt > -1) {
-      feedback_rtts_.push_back(feedback_rtt);
-      const size_t kFeedbackRttWindow = 32;
-      if (feedback_rtts_.size() > kFeedbackRttWindow)
-        feedback_rtts_.pop_front();
-      min_feedback_rtt_.emplace(
-          *std::min_element(feedback_rtts_.begin(), feedback_rtts_.end()));
-    }
-  }
-  return packet_feedback_vector;
-}
-
-void TransportFeedbackAdapter::OnTransportFeedback(
-    const rtcp::TransportFeedback& feedback) {
-  last_packet_feedback_vector_ = GetPacketFeedbackVector(feedback);
-  {
-    rtc::CritScope cs(&observers_lock_);
-    for (auto observer : observers_) {
-      observer->OnPacketFeedbackVector(last_packet_feedback_vector_);
-    }
-  }
-}
-
-std::vector<PacketFeedback>
-TransportFeedbackAdapter::GetTransportFeedbackVector() const {
-  return last_packet_feedback_vector_;
-}
-
-rtc::Optional<int64_t> TransportFeedbackAdapter::GetMinFeedbackLoopRtt() const {
-  rtc::CritScope cs(&lock_);
-  return min_feedback_rtt_;
-}
-
-size_t TransportFeedbackAdapter::GetOutstandingBytes() const {
-  rtc::CritScope cs(&lock_);
-  return send_time_history_.GetOutstandingBytes(local_net_id_, remote_net_id_);
-}
-}  // namespace webrtc
diff --git a/modules/congestion_controller/transport_feedback_adapter.h b/modules/congestion_controller/transport_feedback_adapter.h
deleted file mode 100644
index 4d4b407..0000000
--- a/modules/congestion_controller/transport_feedback_adapter.h
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- *  Copyright (c) 2015 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_CONGESTION_CONTROLLER_TRANSPORT_FEEDBACK_ADAPTER_H_
-#define WEBRTC_MODULES_CONGESTION_CONTROLLER_TRANSPORT_FEEDBACK_ADAPTER_H_
-
-#include <deque>
-#include <vector>
-
-#include "webrtc/modules/remote_bitrate_estimator/include/send_time_history.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/thread_annotations.h"
-#include "webrtc/rtc_base/thread_checker.h"
-#include "webrtc/system_wrappers/include/clock.h"
-
-namespace webrtc {
-
-class PacketFeedbackObserver;
-
-namespace rtcp {
-class TransportFeedback;
-}  // namespace rtcp
-
-class TransportFeedbackAdapter {
- public:
-  explicit TransportFeedbackAdapter(const Clock* clock);
-  virtual ~TransportFeedbackAdapter();
-
-  void RegisterPacketFeedbackObserver(PacketFeedbackObserver* observer);
-  void DeRegisterPacketFeedbackObserver(PacketFeedbackObserver* observer);
-
-  void AddPacket(uint32_t ssrc,
-                 uint16_t sequence_number,
-                 size_t length,
-                 const PacedPacketInfo& pacing_info);
-  void OnSentPacket(uint16_t sequence_number, int64_t send_time_ms);
-
-  // TODO(holmer): This method should return DelayBasedBwe::Result so that we
-  // can get rid of the dependency on BitrateController. Requires changes
-  // to the CongestionController interface.
-  void OnTransportFeedback(const rtcp::TransportFeedback& feedback);
-  std::vector<PacketFeedback> GetTransportFeedbackVector() const;
-  rtc::Optional<int64_t> GetMinFeedbackLoopRtt() const;
-
-  void SetTransportOverhead(int transport_overhead_bytes_per_packet);
-
-  void SetNetworkIds(uint16_t local_id, uint16_t remote_id);
-
-  size_t GetOutstandingBytes() const;
-
- private:
-  std::vector<PacketFeedback> GetPacketFeedbackVector(
-      const rtcp::TransportFeedback& feedback);
-
-  const bool send_side_bwe_with_overhead_;
-  rtc::CriticalSection lock_;
-  int transport_overhead_bytes_per_packet_ RTC_GUARDED_BY(&lock_);
-  SendTimeHistory send_time_history_ RTC_GUARDED_BY(&lock_);
-  const Clock* const clock_;
-  int64_t current_offset_ms_;
-  int64_t last_timestamp_us_;
-  std::vector<PacketFeedback> last_packet_feedback_vector_;
-  uint16_t local_net_id_ RTC_GUARDED_BY(&lock_);
-  uint16_t remote_net_id_ RTC_GUARDED_BY(&lock_);
-  std::deque<int64_t> feedback_rtts_ RTC_GUARDED_BY(&lock_);
-  rtc::Optional<int64_t> min_feedback_rtt_ RTC_GUARDED_BY(&lock_);
-
-  rtc::CriticalSection observers_lock_;
-  std::vector<PacketFeedbackObserver*> observers_
-      RTC_GUARDED_BY(&observers_lock_);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_CONGESTION_CONTROLLER_TRANSPORT_FEEDBACK_ADAPTER_H_
diff --git a/modules/congestion_controller/transport_feedback_adapter_unittest.cc b/modules/congestion_controller/transport_feedback_adapter_unittest.cc
deleted file mode 100644
index 3479814..0000000
--- a/modules/congestion_controller/transport_feedback_adapter_unittest.cc
+++ /dev/null
@@ -1,391 +0,0 @@
-/*
- *  Copyright (c) 2015 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 <limits>
-#include <memory>
-#include <vector>
-
-#include "webrtc/modules/bitrate_controller/include/mock/mock_bitrate_controller.h"
-#include "webrtc/modules/congestion_controller/congestion_controller_unittests_helper.h"
-#include "webrtc/modules/congestion_controller/transport_feedback_adapter.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/transport_feedback.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/safe_conversions.h"
-#include "webrtc/system_wrappers/include/clock.h"
-#include "webrtc/test/gmock.h"
-#include "webrtc/test/gtest.h"
-
-using ::testing::_;
-using ::testing::Invoke;
-
-namespace webrtc {
-
-namespace {
-const PacedPacketInfo kPacingInfo0(0, 5, 2000);
-const PacedPacketInfo kPacingInfo1(1, 8, 4000);
-const PacedPacketInfo kPacingInfo2(2, 14, 7000);
-const PacedPacketInfo kPacingInfo3(3, 20, 10000);
-const PacedPacketInfo kPacingInfo4(4, 22, 10000);
-}
-
-namespace test {
-
-class MockPacketFeedbackObserver : public webrtc::PacketFeedbackObserver {
- public:
-  MOCK_METHOD2(OnPacketAdded, void(uint32_t ssrc, uint16_t seq_num));
-  MOCK_METHOD1(OnPacketFeedbackVector,
-               void(const std::vector<PacketFeedback>& packet_feedback_vector));
-};
-
-class TransportFeedbackAdapterTest : public ::testing::Test {
- public:
-  TransportFeedbackAdapterTest() : clock_(0) {}
-
-  virtual ~TransportFeedbackAdapterTest() {}
-
-  virtual void SetUp() {
-    adapter_.reset(new TransportFeedbackAdapter(&clock_));
-  }
-
-  virtual void TearDown() { adapter_.reset(); }
-
- protected:
-  void OnReceivedEstimatedBitrate(uint32_t bitrate) {}
-
-  void OnReceivedRtcpReceiverReport(const ReportBlockList& report_blocks,
-                                    int64_t rtt,
-                                    int64_t now_ms) {}
-
-  void OnSentPacket(const PacketFeedback& packet_feedback) {
-    adapter_->AddPacket(kSsrc, packet_feedback.sequence_number,
-                        packet_feedback.payload_size,
-                        packet_feedback.pacing_info);
-    adapter_->OnSentPacket(packet_feedback.sequence_number,
-                           packet_feedback.send_time_ms);
-  }
-
-  static constexpr uint32_t kSsrc = 8492;
-
-  SimulatedClock clock_;
-  std::unique_ptr<TransportFeedbackAdapter> adapter_;
-};
-
-TEST_F(TransportFeedbackAdapterTest, ObserverSanity) {
-  MockPacketFeedbackObserver mock;
-  adapter_->RegisterPacketFeedbackObserver(&mock);
-
-  const std::vector<PacketFeedback> packets = {
-      PacketFeedback(100, 200, 0, 1000, kPacingInfo0),
-      PacketFeedback(110, 210, 1, 2000, kPacingInfo0),
-      PacketFeedback(120, 220, 2, 3000, kPacingInfo0)
-  };
-
-  rtcp::TransportFeedback feedback;
-  feedback.SetBase(packets[0].sequence_number,
-                   packets[0].arrival_time_ms * 1000);
-
-  for (const PacketFeedback& packet : packets) {
-    EXPECT_CALL(mock, OnPacketAdded(kSsrc, packet.sequence_number)).Times(1);
-    OnSentPacket(packet);
-    EXPECT_TRUE(feedback.AddReceivedPacket(packet.sequence_number,
-                                           packet.arrival_time_ms * 1000));
-  }
-
-  EXPECT_CALL(mock, OnPacketFeedbackVector(_)).Times(1);
-  adapter_->OnTransportFeedback(feedback);
-
-  adapter_->DeRegisterPacketFeedbackObserver(&mock);
-
-  // After deregistration, the observer no longers gets indications.
-  EXPECT_CALL(mock, OnPacketAdded(_, _)).Times(0);
-  const PacketFeedback new_packet(130, 230, 3, 4000, kPacingInfo0);
-  OnSentPacket(new_packet);
-
-  rtcp::TransportFeedback second_feedback;
-  second_feedback.SetBase(new_packet.sequence_number,
-                          new_packet.arrival_time_ms * 1000);
-  EXPECT_TRUE(feedback.AddReceivedPacket(new_packet.sequence_number,
-                                         new_packet.arrival_time_ms * 1000));
-  EXPECT_CALL(mock, OnPacketFeedbackVector(_)).Times(0);
-  adapter_->OnTransportFeedback(second_feedback);
-}
-
-#if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
-TEST_F(TransportFeedbackAdapterTest, ObserverDoubleRegistrationDeathTest) {
-  MockPacketFeedbackObserver mock;
-  adapter_->RegisterPacketFeedbackObserver(&mock);
-  EXPECT_DEATH(adapter_->RegisterPacketFeedbackObserver(&mock), "");
-  adapter_->DeRegisterPacketFeedbackObserver(&mock);
-}
-
-TEST_F(TransportFeedbackAdapterTest, ObserverMissingDeRegistrationDeathTest) {
-  MockPacketFeedbackObserver mock;
-  adapter_->RegisterPacketFeedbackObserver(&mock);
-  EXPECT_DEATH(adapter_.reset(), "");
-  adapter_->DeRegisterPacketFeedbackObserver(&mock);
-}
-#endif
-
-TEST_F(TransportFeedbackAdapterTest, AdaptsFeedbackAndPopulatesSendTimes) {
-  std::vector<PacketFeedback> packets;
-  packets.push_back(PacketFeedback(100, 200, 0, 1500, kPacingInfo0));
-  packets.push_back(PacketFeedback(110, 210, 1, 1500, kPacingInfo0));
-  packets.push_back(PacketFeedback(120, 220, 2, 1500, kPacingInfo0));
-  packets.push_back(PacketFeedback(130, 230, 3, 1500, kPacingInfo1));
-  packets.push_back(PacketFeedback(140, 240, 4, 1500, kPacingInfo1));
-
-  for (const PacketFeedback& packet : packets)
-    OnSentPacket(packet);
-
-  rtcp::TransportFeedback feedback;
-  feedback.SetBase(packets[0].sequence_number,
-                   packets[0].arrival_time_ms * 1000);
-
-  for (const PacketFeedback& packet : packets) {
-    EXPECT_TRUE(feedback.AddReceivedPacket(packet.sequence_number,
-                                           packet.arrival_time_ms * 1000));
-  }
-
-  feedback.Build();
-
-  adapter_->OnTransportFeedback(feedback);
-  ComparePacketFeedbackVectors(packets, adapter_->GetTransportFeedbackVector());
-}
-
-TEST_F(TransportFeedbackAdapterTest, FeedbackVectorReportsUnreceived) {
-  std::vector<PacketFeedback> sent_packets = {
-      PacketFeedback(100, 220, 0, 1500, kPacingInfo0),
-      PacketFeedback(110, 210, 1, 1500, kPacingInfo0),
-      PacketFeedback(120, 220, 2, 1500, kPacingInfo0),
-      PacketFeedback(130, 230, 3, 1500, kPacingInfo0),
-      PacketFeedback(140, 240, 4, 1500, kPacingInfo0),
-      PacketFeedback(150, 250, 5, 1500, kPacingInfo0),
-      PacketFeedback(160, 260, 6, 1500, kPacingInfo0)
-  };
-
-  for (const PacketFeedback& packet : sent_packets)
-    OnSentPacket(packet);
-
-  // Note: Important to include the last packet, as only unreceived packets in
-  // between received packets can be inferred.
-  std::vector<PacketFeedback> received_packets = {
-    sent_packets[0], sent_packets[2], sent_packets[6]
-  };
-
-  rtcp::TransportFeedback feedback;
-  feedback.SetBase(received_packets[0].sequence_number,
-                   received_packets[0].arrival_time_ms * 1000);
-
-  for (const PacketFeedback& packet : received_packets) {
-    EXPECT_TRUE(feedback.AddReceivedPacket(packet.sequence_number,
-                                           packet.arrival_time_ms * 1000));
-  }
-
-  feedback.Build();
-
-  adapter_->OnTransportFeedback(feedback);
-  ComparePacketFeedbackVectors(sent_packets,
-                               adapter_->GetTransportFeedbackVector());
-}
-
-TEST_F(TransportFeedbackAdapterTest, HandlesDroppedPackets) {
-  std::vector<PacketFeedback> packets;
-  packets.push_back(PacketFeedback(100, 200, 0, 1500, kPacingInfo0));
-  packets.push_back(PacketFeedback(110, 210, 1, 1500, kPacingInfo1));
-  packets.push_back(PacketFeedback(120, 220, 2, 1500, kPacingInfo2));
-  packets.push_back(PacketFeedback(130, 230, 3, 1500, kPacingInfo3));
-  packets.push_back(PacketFeedback(140, 240, 4, 1500, kPacingInfo4));
-
-  const uint16_t kSendSideDropBefore = 1;
-  const uint16_t kReceiveSideDropAfter = 3;
-
-  for (const PacketFeedback& packet : packets) {
-    if (packet.sequence_number >= kSendSideDropBefore)
-      OnSentPacket(packet);
-  }
-
-  rtcp::TransportFeedback feedback;
-  feedback.SetBase(packets[0].sequence_number,
-                   packets[0].arrival_time_ms * 1000);
-
-  for (const PacketFeedback& packet : packets) {
-    if (packet.sequence_number <= kReceiveSideDropAfter) {
-      EXPECT_TRUE(feedback.AddReceivedPacket(packet.sequence_number,
-                                             packet.arrival_time_ms * 1000));
-    }
-  }
-
-  feedback.Build();
-
-  std::vector<PacketFeedback> expected_packets(
-      packets.begin(), packets.begin() + kReceiveSideDropAfter + 1);
-  // Packets that have timed out on the send-side have lost the
-  // information stored on the send-side.
-  for (size_t i = 0; i < kSendSideDropBefore; ++i) {
-    expected_packets[i].send_time_ms = -1;
-    expected_packets[i].payload_size = 0;
-    expected_packets[i].pacing_info = PacedPacketInfo();
-  }
-
-  adapter_->OnTransportFeedback(feedback);
-  ComparePacketFeedbackVectors(expected_packets,
-                               adapter_->GetTransportFeedbackVector());
-}
-
-TEST_F(TransportFeedbackAdapterTest, SendTimeWrapsBothWays) {
-  int64_t kHighArrivalTimeMs = rtcp::TransportFeedback::kDeltaScaleFactor *
-                               static_cast<int64_t>(1 << 8) *
-                               static_cast<int64_t>((1 << 23) - 1) / 1000;
-  std::vector<PacketFeedback> packets;
-  packets.push_back(
-      PacketFeedback(kHighArrivalTimeMs - 64, 200, 0, 1500, PacedPacketInfo()));
-  packets.push_back(
-      PacketFeedback(kHighArrivalTimeMs + 64, 210, 1, 1500, PacedPacketInfo()));
-  packets.push_back(
-      PacketFeedback(kHighArrivalTimeMs, 220, 2, 1500, PacedPacketInfo()));
-
-  for (const PacketFeedback& packet : packets)
-    OnSentPacket(packet);
-
-  for (size_t i = 0; i < packets.size(); ++i) {
-    std::unique_ptr<rtcp::TransportFeedback> feedback(
-        new rtcp::TransportFeedback());
-    feedback->SetBase(packets[i].sequence_number,
-                      packets[i].arrival_time_ms * 1000);
-
-    EXPECT_TRUE(feedback->AddReceivedPacket(packets[i].sequence_number,
-                                            packets[i].arrival_time_ms * 1000));
-
-    rtc::Buffer raw_packet = feedback->Build();
-    feedback = rtcp::TransportFeedback::ParseFrom(raw_packet.data(),
-                                                  raw_packet.size());
-
-    std::vector<PacketFeedback> expected_packets;
-    expected_packets.push_back(packets[i]);
-
-    adapter_->OnTransportFeedback(*feedback.get());
-    ComparePacketFeedbackVectors(expected_packets,
-                                 adapter_->GetTransportFeedbackVector());
-  }
-}
-
-TEST_F(TransportFeedbackAdapterTest, HandlesArrivalReordering) {
-  std::vector<PacketFeedback> packets;
-  packets.push_back(PacketFeedback(120, 200, 0, 1500, kPacingInfo0));
-  packets.push_back(PacketFeedback(110, 210, 1, 1500, kPacingInfo0));
-  packets.push_back(PacketFeedback(100, 220, 2, 1500, kPacingInfo0));
-
-  for (const PacketFeedback& packet : packets)
-    OnSentPacket(packet);
-
-  rtcp::TransportFeedback feedback;
-  feedback.SetBase(packets[0].sequence_number,
-                   packets[0].arrival_time_ms * 1000);
-
-  for (const PacketFeedback& packet : packets) {
-    EXPECT_TRUE(feedback.AddReceivedPacket(packet.sequence_number,
-                                           packet.arrival_time_ms * 1000));
-  }
-
-  feedback.Build();
-
-  // Adapter keeps the packets ordered by sequence number (which is itself
-  // assigned by the order of transmission). Reordering by some other criteria,
-  // eg. arrival time, is up to the observers.
-  adapter_->OnTransportFeedback(feedback);
-  ComparePacketFeedbackVectors(packets, adapter_->GetTransportFeedbackVector());
-}
-
-TEST_F(TransportFeedbackAdapterTest, TimestampDeltas) {
-  std::vector<PacketFeedback> sent_packets;
-  const int64_t kSmallDeltaUs =
-      rtcp::TransportFeedback::kDeltaScaleFactor * ((1 << 8) - 1);
-  const int64_t kLargePositiveDeltaUs =
-      rtcp::TransportFeedback::kDeltaScaleFactor *
-      std::numeric_limits<int16_t>::max();
-  const int64_t kLargeNegativeDeltaUs =
-      rtcp::TransportFeedback::kDeltaScaleFactor *
-      std::numeric_limits<int16_t>::min();
-
-  PacketFeedback packet_feedback(100, 200, 0, 1500, true, 0, 0,
-                                 PacedPacketInfo());
-  sent_packets.push_back(packet_feedback);
-
-  packet_feedback.send_time_ms += kSmallDeltaUs / 1000;
-  packet_feedback.arrival_time_ms += kSmallDeltaUs / 1000;
-  ++packet_feedback.sequence_number;
-  sent_packets.push_back(packet_feedback);
-
-  packet_feedback.send_time_ms += kLargePositiveDeltaUs / 1000;
-  packet_feedback.arrival_time_ms += kLargePositiveDeltaUs / 1000;
-  ++packet_feedback.sequence_number;
-  sent_packets.push_back(packet_feedback);
-
-  packet_feedback.send_time_ms += kLargeNegativeDeltaUs / 1000;
-  packet_feedback.arrival_time_ms += kLargeNegativeDeltaUs / 1000;
-  ++packet_feedback.sequence_number;
-  sent_packets.push_back(packet_feedback);
-
-  // Too large, delta - will need two feedback messages.
-  packet_feedback.send_time_ms += (kLargePositiveDeltaUs + 1000) / 1000;
-  packet_feedback.arrival_time_ms += (kLargePositiveDeltaUs + 1000) / 1000;
-  ++packet_feedback.sequence_number;
-
-  // Packets will be added to send history.
-  for (const PacketFeedback& packet : sent_packets)
-    OnSentPacket(packet);
-  OnSentPacket(packet_feedback);
-
-  // Create expected feedback and send into adapter.
-  std::unique_ptr<rtcp::TransportFeedback> feedback(
-      new rtcp::TransportFeedback());
-  feedback->SetBase(sent_packets[0].sequence_number,
-                    sent_packets[0].arrival_time_ms * 1000);
-
-  for (const PacketFeedback& packet : sent_packets) {
-    EXPECT_TRUE(feedback->AddReceivedPacket(packet.sequence_number,
-                                            packet.arrival_time_ms * 1000));
-  }
-  EXPECT_FALSE(feedback->AddReceivedPacket(
-      packet_feedback.sequence_number, packet_feedback.arrival_time_ms * 1000));
-
-  rtc::Buffer raw_packet = feedback->Build();
-  feedback =
-      rtcp::TransportFeedback::ParseFrom(raw_packet.data(), raw_packet.size());
-
-  std::vector<PacketFeedback> received_feedback;
-
-  EXPECT_TRUE(feedback.get() != nullptr);
-  adapter_->OnTransportFeedback(*feedback.get());
-  ComparePacketFeedbackVectors(sent_packets,
-                               adapter_->GetTransportFeedbackVector());
-
-  // Create a new feedback message and add the trailing item.
-  feedback.reset(new rtcp::TransportFeedback());
-  feedback->SetBase(packet_feedback.sequence_number,
-                    packet_feedback.arrival_time_ms * 1000);
-  EXPECT_TRUE(feedback->AddReceivedPacket(
-      packet_feedback.sequence_number, packet_feedback.arrival_time_ms * 1000));
-  raw_packet = feedback->Build();
-  feedback =
-      rtcp::TransportFeedback::ParseFrom(raw_packet.data(), raw_packet.size());
-
-  EXPECT_TRUE(feedback.get() != nullptr);
-  adapter_->OnTransportFeedback(*feedback.get());
-  {
-    std::vector<PacketFeedback> expected_packets;
-    expected_packets.push_back(packet_feedback);
-    ComparePacketFeedbackVectors(expected_packets,
-                                 adapter_->GetTransportFeedbackVector());
-  }
-}
-}  // namespace test
-}  // namespace webrtc
diff --git a/modules/congestion_controller/trendline_estimator.cc b/modules/congestion_controller/trendline_estimator.cc
deleted file mode 100644
index e51d4fb..0000000
--- a/modules/congestion_controller/trendline_estimator.cc
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- *  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/congestion_controller/trendline_estimator.h"
-
-#include <algorithm>
-
-#include "webrtc/api/optional.h"
-#include "webrtc/modules/remote_bitrate_estimator/test/bwe_test_logging.h"
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-
-namespace {
-rtc::Optional<double> LinearFitSlope(
-    const std::deque<std::pair<double, double>>& points) {
-  RTC_DCHECK(points.size() >= 2);
-  // Compute the "center of mass".
-  double sum_x = 0;
-  double sum_y = 0;
-  for (const auto& point : points) {
-    sum_x += point.first;
-    sum_y += point.second;
-  }
-  double x_avg = sum_x / points.size();
-  double y_avg = sum_y / points.size();
-  // Compute the slope k = \sum (x_i-x_avg)(y_i-y_avg) / \sum (x_i-x_avg)^2
-  double numerator = 0;
-  double denominator = 0;
-  for (const auto& point : points) {
-    numerator += (point.first - x_avg) * (point.second - y_avg);
-    denominator += (point.first - x_avg) * (point.first - x_avg);
-  }
-  if (denominator == 0)
-    return rtc::Optional<double>();
-  return rtc::Optional<double>(numerator / denominator);
-}
-}  // namespace
-
-enum { kDeltaCounterMax = 1000 };
-
-TrendlineEstimator::TrendlineEstimator(size_t window_size,
-                                       double smoothing_coef,
-                                       double threshold_gain)
-    : window_size_(window_size),
-      smoothing_coef_(smoothing_coef),
-      threshold_gain_(threshold_gain),
-      num_of_deltas_(0),
-      first_arrival_time_ms(-1),
-      accumulated_delay_(0),
-      smoothed_delay_(0),
-      delay_hist_(),
-      trendline_(0) {}
-
-TrendlineEstimator::~TrendlineEstimator() {}
-
-void TrendlineEstimator::Update(double recv_delta_ms,
-                                double send_delta_ms,
-                                int64_t arrival_time_ms) {
-  const double delta_ms = recv_delta_ms - send_delta_ms;
-  ++num_of_deltas_;
-  if (num_of_deltas_ > kDeltaCounterMax)
-    num_of_deltas_ = kDeltaCounterMax;
-  if (first_arrival_time_ms == -1)
-    first_arrival_time_ms = arrival_time_ms;
-
-  // Exponential backoff filter.
-  accumulated_delay_ += delta_ms;
-  BWE_TEST_LOGGING_PLOT(1, "accumulated_delay_ms", arrival_time_ms,
-                        accumulated_delay_);
-  smoothed_delay_ = smoothing_coef_ * smoothed_delay_ +
-                    (1 - smoothing_coef_) * accumulated_delay_;
-  BWE_TEST_LOGGING_PLOT(1, "smoothed_delay_ms", arrival_time_ms,
-                        smoothed_delay_);
-
-  // Simple linear regression.
-  delay_hist_.push_back(std::make_pair(
-      static_cast<double>(arrival_time_ms - first_arrival_time_ms),
-      smoothed_delay_));
-  if (delay_hist_.size() > window_size_)
-    delay_hist_.pop_front();
-  if (delay_hist_.size() == window_size_) {
-    // Only update trendline_ if it is possible to fit a line to the data.
-    trendline_ = LinearFitSlope(delay_hist_).value_or(trendline_);
-  }
-
-  BWE_TEST_LOGGING_PLOT(1, "trendline_slope", arrival_time_ms, trendline_);
-}
-
-}  // namespace webrtc
diff --git a/modules/congestion_controller/trendline_estimator.h b/modules/congestion_controller/trendline_estimator.h
deleted file mode 100644
index 9e46558..0000000
--- a/modules/congestion_controller/trendline_estimator.h
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- *  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_CONGESTION_CONTROLLER_TRENDLINE_ESTIMATOR_H_
-#define WEBRTC_MODULES_CONGESTION_CONTROLLER_TRENDLINE_ESTIMATOR_H_
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include <deque>
-#include <utility>
-
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace webrtc {
-
-class TrendlineEstimator {
- public:
-  // |window_size| is the number of points required to compute a trend line.
-  // |smoothing_coef| controls how much we smooth out the delay before fitting
-  // the trend line. |threshold_gain| is used to scale the trendline slope for
-  // comparison to the old threshold. Once the old estimator has been removed
-  // (or the thresholds been merged into the estimators), we can just set the
-  // threshold instead of setting a gain.
-  TrendlineEstimator(size_t window_size,
-                     double smoothing_coef,
-                     double threshold_gain);
-  ~TrendlineEstimator();
-
-  // Update the estimator with a new sample. The deltas should represent deltas
-  // between timestamp groups as defined by the InterArrival class.
-  void Update(double recv_delta_ms,
-              double send_delta_ms,
-              int64_t arrival_time_ms);
-
-  // Returns the estimated trend k multiplied by some gain.
-  // 0 < k < 1   ->  the delay increases, queues are filling up
-  //   k == 0    ->  the delay does not change
-  //   k < 0     ->  the delay decreases, queues are being emptied
-  double trendline_slope() const { return trendline_ * threshold_gain_; }
-
-  // Returns the number of deltas which the current estimator state is based on.
-  unsigned int num_of_deltas() const { return num_of_deltas_; }
-
- private:
-  // Parameters.
-  const size_t window_size_;
-  const double smoothing_coef_;
-  const double threshold_gain_;
-  // Used by the existing threshold.
-  unsigned int num_of_deltas_;
-  // Keep the arrival times small by using the change from the first packet.
-  int64_t first_arrival_time_ms;
-  // Exponential backoff filtering.
-  double accumulated_delay_;
-  double smoothed_delay_;
-  // Linear least squares regression.
-  std::deque<std::pair<double, double>> delay_hist_;
-  double trendline_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(TrendlineEstimator);
-};
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_CONGESTION_CONTROLLER_TRENDLINE_ESTIMATOR_H_
diff --git a/modules/congestion_controller/trendline_estimator_unittest.cc b/modules/congestion_controller/trendline_estimator_unittest.cc
deleted file mode 100644
index 6f541ca..0000000
--- a/modules/congestion_controller/trendline_estimator_unittest.cc
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- *  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/congestion_controller/trendline_estimator.h"
-#include "webrtc/rtc_base/random.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-namespace {
-constexpr size_t kWindowSize = 20;
-constexpr double kSmoothing = 0.0;
-constexpr double kGain = 1;
-constexpr int64_t kAvgTimeBetweenPackets = 10;
-constexpr size_t kPacketCount = 2 * kWindowSize + 1;
-
-void TestEstimator(double slope, double jitter_stddev, double tolerance) {
-  TrendlineEstimator estimator(kWindowSize, kSmoothing, kGain);
-  Random random(0x1234567);
-  int64_t send_times[kPacketCount];
-  int64_t recv_times[kPacketCount];
-  int64_t send_start_time = random.Rand(1000000);
-  int64_t recv_start_time = random.Rand(1000000);
-  for (size_t i = 0; i < kPacketCount; ++i) {
-    send_times[i] = send_start_time + i * kAvgTimeBetweenPackets;
-    double latency = i * kAvgTimeBetweenPackets / (1 - slope);
-    double jitter = random.Gaussian(0, jitter_stddev);
-    recv_times[i] = recv_start_time + latency + jitter;
-  }
-  for (size_t i = 1; i < kPacketCount; ++i) {
-    double recv_delta = recv_times[i] - recv_times[i - 1];
-    double send_delta = send_times[i] - send_times[i - 1];
-    estimator.Update(recv_delta, send_delta, recv_times[i]);
-    if (i < kWindowSize)
-      EXPECT_NEAR(estimator.trendline_slope(), 0, 0.001);
-    else
-      EXPECT_NEAR(estimator.trendline_slope(), slope, tolerance);
-  }
-}
-}  // namespace
-
-TEST(TrendlineEstimator, PerfectLineSlopeOneHalf) {
-  TestEstimator(0.5, 0, 0.001);
-}
-
-TEST(TrendlineEstimator, PerfectLineSlopeMinusOne) {
-  TestEstimator(-1, 0, 0.001);
-}
-
-TEST(TrendlineEstimator, PerfectLineSlopeZero) {
-  TestEstimator(0, 0, 0.001);
-}
-
-TEST(TrendlineEstimator, JitteryLineSlopeOneHalf) {
-  TestEstimator(0.5, kAvgTimeBetweenPackets / 3.0, 0.01);
-}
-
-TEST(TrendlineEstimator, JitteryLineSlopeMinusOne) {
-  TestEstimator(-1, kAvgTimeBetweenPackets / 3.0, 0.075);
-}
-
-TEST(TrendlineEstimator, JitteryLineSlopeZero) {
-  TestEstimator(0, kAvgTimeBetweenPackets / 3.0, 0.02);
-}
-
-}  // namespace webrtc
diff --git a/modules/desktop_capture/BUILD.gn b/modules/desktop_capture/BUILD.gn
deleted file mode 100644
index 75311bd..0000000
--- a/modules/desktop_capture/BUILD.gn
+++ /dev/null
@@ -1,360 +0,0 @@
-# Copyright (c) 2014 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.
-
-import("//build/config/ui.gni")
-import("../../webrtc.gni")
-
-use_desktop_capture_differ_sse2 = current_cpu == "x86" || current_cpu == "x64"
-
-rtc_static_library("primitives") {
-  sources = [
-    "desktop_capture_types.h",
-    "desktop_frame.cc",
-    "desktop_frame.h",
-    "desktop_geometry.cc",
-    "desktop_geometry.h",
-    "desktop_region.cc",
-    "desktop_region.h",
-    "shared_desktop_frame.cc",
-    "shared_desktop_frame.h",
-    "shared_memory.cc",
-    "shared_memory.h",
-  ]
-
-  deps = [
-    "../..:webrtc_common",
-    "../../rtc_base:rtc_base",  # TODO(kjellander): Cleanup in bugs.webrtc.org/3806.
-  ]
-}
-
-if (rtc_include_tests) {
-  rtc_source_set("desktop_capture_modules_tests") {
-    testonly = true
-
-    # Skip restricting visibility on mobile platforms since the tests on those
-    # gets additional generated targets which would require many lines here to
-    # cover (which would be confusing to read and hard to maintain).
-    if (!is_android && !is_ios) {
-      visibility = [ "..:modules_tests" ]
-    }
-    sources = []
-    deps = []
-    if (rtc_desktop_capture_supported) {
-      deps += [
-        ":desktop_capture_mock",
-        ":primitives",
-        ":screen_drawer",
-        "../../rtc_base:rtc_base",
-        "../../rtc_base:rtc_base_approved",
-        "../../system_wrappers",
-        "../../test:test_support",
-        "../../test:video_test_support",
-      ]
-      sources += [
-        "screen_capturer_integration_test.cc",
-        "screen_drawer_unittest.cc",
-        "window_finder_unittest.cc",
-      ]
-    }
-  }
-
-  rtc_source_set("desktop_capture_unittests") {
-    testonly = true
-
-    # Skip restricting visibility on mobile platforms since the tests on those
-    # gets additional generated targets which would require many lines here to
-    # cover (which would be confusing to read and hard to maintain).
-    if (!is_android && !is_ios) {
-      visibility = [ "..:modules_unittests" ]
-    }
-    sources = [
-      "blank_detector_desktop_capturer_wrapper_unittest.cc",
-      "cropped_desktop_frame_unittest.cc",
-      "desktop_and_cursor_composer_unittest.cc",
-      "desktop_capturer_differ_wrapper_unittest.cc",
-      "desktop_frame_rotation_unittest.cc",
-      "desktop_geometry_unittest.cc",
-      "desktop_region_unittest.cc",
-      "differ_block_unittest.cc",
-      "fallback_desktop_capturer_wrapper_unittest.cc",
-      "mouse_cursor_monitor_unittest.cc",
-      "rgba_color_unittest.cc",
-      "test_utils.cc",
-      "test_utils.h",
-      "test_utils_unittest.cc",
-      "win/cursor_unittest.cc",
-      "win/cursor_unittest_resources.h",
-      "win/cursor_unittest_resources.rc",
-      "win/screen_capture_utils_unittest.cc",
-      "win/screen_capturer_win_directx_unittest.cc",
-    ]
-    deps = [
-      ":desktop_capture",
-      ":desktop_capture_mock",
-      ":primitives",
-      "../..:webrtc_common",
-      "../../rtc_base:rtc_base_approved",
-      "../../system_wrappers",
-      "../../test:test_support",
-      "//testing/gmock",
-    ]
-    if (rtc_desktop_capture_supported) {
-      sources += [
-        "screen_capturer_helper_unittest.cc",
-        "screen_capturer_mac_unittest.cc",
-        "screen_capturer_unittest.cc",
-        "window_capturer_unittest.cc",
-      ]
-      deps += [ ":desktop_capture_mock" ]
-    }
-    if (!build_with_chromium && is_clang) {
-      # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-    }
-  }
-
-  source_set("screen_drawer") {
-    testonly = true
-
-    public_deps = [
-      ":desktop_capture",
-    ]
-
-    sources = [
-      "screen_drawer.cc",
-      "screen_drawer.h",
-      "screen_drawer_linux.cc",
-      "screen_drawer_lock_posix.cc",
-      "screen_drawer_lock_posix.h",
-      "screen_drawer_mac.cc",
-      "screen_drawer_win.cc",
-    ]
-
-    deps = [
-      ":primitives",
-      "../../rtc_base:rtc_base_approved",
-      "../../system_wrappers",
-    ]
-  }
-
-  source_set("desktop_capture_mock") {
-    testonly = true
-
-    public_deps = [
-      ":desktop_capture",
-      "//testing/gmock",
-    ]
-
-    sources = [
-      "desktop_frame_generator.cc",
-      "desktop_frame_generator.h",
-      "fake_desktop_capturer.cc",
-      "fake_desktop_capturer.h",
-      "mock_desktop_capturer_callback.cc",
-      "mock_desktop_capturer_callback.h",
-    ]
-
-    deps = [
-      ":primitives",
-      "../../rtc_base:rtc_base_approved",
-      "../../test:test_support",
-    ]
-  }
-}
-
-rtc_source_set("desktop_capture") {
-  public_deps = [
-    ":desktop_capture_generic",
-  ]
-  if (is_mac) {
-    public_deps += [ ":desktop_capture_objc" ]
-  }
-}
-
-if (is_mac) {
-  rtc_source_set("desktop_capture_objc") {
-    visibility = [ ":desktop_capture" ]
-    sources = [
-      "mac/desktop_configuration.mm",
-      "mouse_cursor_monitor_mac.mm",
-      "screen_capturer_mac.mm",
-      "window_capturer_mac.mm",
-    ]
-    deps = [
-      ":desktop_capture_generic",
-      ":primitives",
-      "../../rtc_base:rtc_base",
-      "../../rtc_base:rtc_base_approved",
-    ]
-    libs = [
-      "AppKit.framework",
-      "IOKit.framework",
-      "OpenGL.framework",
-    ]
-  }
-}
-
-rtc_static_library("desktop_capture_generic") {
-  visibility = [
-    ":desktop_capture",
-    ":desktop_capture_objc",
-  ]
-  sources = [
-    "blank_detector_desktop_capturer_wrapper.cc",
-    "blank_detector_desktop_capturer_wrapper.h",
-    "cropped_desktop_frame.cc",
-    "cropped_desktop_frame.h",
-    "cropping_window_capturer.cc",
-    "cropping_window_capturer.h",
-    "cropping_window_capturer_win.cc",
-    "desktop_and_cursor_composer.cc",
-    "desktop_and_cursor_composer.h",
-    "desktop_capture_options.cc",
-    "desktop_capture_options.h",
-    "desktop_capturer.cc",
-    "desktop_capturer.h",
-    "desktop_capturer_differ_wrapper.cc",
-    "desktop_capturer_differ_wrapper.h",
-    "desktop_frame_rotation.cc",
-    "desktop_frame_rotation.h",
-    "desktop_frame_win.cc",
-    "desktop_frame_win.h",
-    "differ_block.cc",
-    "differ_block.h",
-    "fallback_desktop_capturer_wrapper.cc",
-    "fallback_desktop_capturer_wrapper.h",
-    "mac/desktop_configuration.h",
-    "mac/desktop_configuration_monitor.cc",
-    "mac/desktop_configuration_monitor.h",
-    "mac/full_screen_chrome_window_detector.cc",
-    "mac/full_screen_chrome_window_detector.h",
-    "mac/scoped_pixel_buffer_object.cc",
-    "mac/scoped_pixel_buffer_object.h",
-    "mac/window_list_utils.cc",
-    "mac/window_list_utils.h",
-    "mouse_cursor.cc",
-    "mouse_cursor.h",
-    "mouse_cursor_monitor.h",
-    "mouse_cursor_monitor_win.cc",
-    "resolution_tracker.cc",
-    "resolution_tracker.h",
-    "rgba_color.cc",
-    "rgba_color.h",
-    "screen_capture_frame_queue.h",
-    "screen_capturer_helper.cc",
-    "screen_capturer_helper.h",
-    "screen_capturer_win.cc",
-    "win/cursor.cc",
-    "win/cursor.h",
-    "win/d3d_device.cc",
-    "win/d3d_device.h",
-    "win/desktop.cc",
-    "win/desktop.h",
-    "win/display_configuration_monitor.cc",
-    "win/display_configuration_monitor.h",
-    "win/dxgi_adapter_duplicator.cc",
-    "win/dxgi_adapter_duplicator.h",
-    "win/dxgi_context.cc",
-    "win/dxgi_context.h",
-    "win/dxgi_duplicator_controller.cc",
-    "win/dxgi_duplicator_controller.h",
-    "win/dxgi_frame.cc",
-    "win/dxgi_frame.h",
-    "win/dxgi_output_duplicator.cc",
-    "win/dxgi_output_duplicator.h",
-    "win/dxgi_texture.cc",
-    "win/dxgi_texture.h",
-    "win/dxgi_texture_mapping.cc",
-    "win/dxgi_texture_mapping.h",
-    "win/dxgi_texture_staging.cc",
-    "win/dxgi_texture_staging.h",
-    "win/scoped_gdi_object.h",
-    "win/scoped_thread_desktop.cc",
-    "win/scoped_thread_desktop.h",
-    "win/screen_capture_utils.cc",
-    "win/screen_capture_utils.h",
-    "win/screen_capturer_win_directx.cc",
-    "win/screen_capturer_win_directx.h",
-    "win/screen_capturer_win_gdi.cc",
-    "win/screen_capturer_win_gdi.h",
-    "win/screen_capturer_win_magnifier.cc",
-    "win/screen_capturer_win_magnifier.h",
-    "win/window_capture_utils.cc",
-    "win/window_capture_utils.h",
-    "window_capturer_win.cc",
-    "window_finder.h",
-    "window_finder_mac.h",
-    "window_finder_mac.mm",
-    "window_finder_win.cc",
-    "window_finder_win.h",
-  ]
-
-  if (use_x11) {
-    sources += [
-      "mouse_cursor_monitor_x11.cc",
-      "screen_capturer_x11.cc",
-      "window_capturer_x11.cc",
-      "window_finder_x11.cc",
-      "window_finder_x11.h",
-      "x11/shared_x_display.cc",
-      "x11/shared_x_display.h",
-      "x11/window_list_utils.cc",
-      "x11/window_list_utils.h",
-      "x11/x_atom_cache.cc",
-      "x11/x_atom_cache.h",
-      "x11/x_error_trap.cc",
-      "x11/x_error_trap.h",
-      "x11/x_server_pixel_buffer.cc",
-      "x11/x_server_pixel_buffer.h",
-    ]
-    configs += [ "//build/config/linux:x11" ]
-  }
-
-  if (!is_win && !is_mac && !use_x11) {
-    sources += [
-      "mouse_cursor_monitor_null.cc",
-      "screen_capturer_null.cc",
-      "window_capturer_null.cc",
-    ]
-  }
-
-  if (is_win) {
-    libs = [
-      "d3d11.lib",
-      "dxgi.lib",
-    ]
-  }
-
-  deps = [
-    ":primitives",
-    "../..:webrtc_common",
-    "../../rtc_base:rtc_base",  # TODO(kjellander): Cleanup in bugs.webrtc.org/3806.
-    "../../system_wrappers",
-    "//third_party/libyuv",
-  ]
-
-  if (use_desktop_capture_differ_sse2) {
-    deps += [ ":desktop_capture_differ_sse2" ]
-  }
-}
-
-if (use_desktop_capture_differ_sse2) {
-  # Have to be compiled as a separate target because it needs to be compiled
-  # with SSE2 enabled.
-  rtc_static_library("desktop_capture_differ_sse2") {
-    visibility = [ ":*" ]
-    sources = [
-      "differ_vector_sse2.cc",
-      "differ_vector_sse2.h",
-    ]
-
-    if (is_posix) {
-      cflags = [ "-msse2" ]
-    }
-  }
-}
diff --git a/modules/desktop_capture/DEPS b/modules/desktop_capture/DEPS
deleted file mode 100644
index 43c8441..0000000
--- a/modules/desktop_capture/DEPS
+++ /dev/null
@@ -1,4 +0,0 @@
-include_rules = [
-  "+webrtc/system_wrappers",
-  "+third_party/libyuv",
-]
diff --git a/modules/desktop_capture/OWNERS b/modules/desktop_capture/OWNERS
deleted file mode 100644
index e3fd87a..0000000
--- a/modules/desktop_capture/OWNERS
+++ /dev/null
@@ -1,10 +0,0 @@
-# Please send the changes to zijiehe@chromium.org first.
-jamiewalch@chromium.org
-sergeyu@chromium.org
-wez@chromium.org
-zijiehe@chromium.org
-
-# These are for the common case of adding or renaming files. If you're doing
-# structural changes, please get a review from a reviewer in this file.
-per-file *.gn=*
-per-file *.gni=*
diff --git a/modules/desktop_capture/blank_detector_desktop_capturer_wrapper.cc b/modules/desktop_capture/blank_detector_desktop_capturer_wrapper.cc
deleted file mode 100644
index 4f88d94..0000000
--- a/modules/desktop_capture/blank_detector_desktop_capturer_wrapper.cc
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- *  Copyright (c) 2017 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/desktop_capture/blank_detector_desktop_capturer_wrapper.h"
-
-#include <algorithm>
-#include <utility>
-
-#include "webrtc/modules/desktop_capture/desktop_geometry.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/system_wrappers/include/metrics.h"
-
-namespace webrtc {
-
-BlankDetectorDesktopCapturerWrapper::BlankDetectorDesktopCapturerWrapper(
-    std::unique_ptr<DesktopCapturer> capturer,
-    RgbaColor blank_pixel)
-    : capturer_(std::move(capturer)),
-      blank_pixel_(blank_pixel) {
-  RTC_DCHECK(capturer_);
-}
-
-BlankDetectorDesktopCapturerWrapper::~BlankDetectorDesktopCapturerWrapper() =
-    default;
-
-void BlankDetectorDesktopCapturerWrapper::Start(
-    DesktopCapturer::Callback* callback) {
-  capturer_->Start(this);
-  callback_ = callback;
-}
-
-void BlankDetectorDesktopCapturerWrapper::SetSharedMemoryFactory(
-    std::unique_ptr<SharedMemoryFactory> shared_memory_factory) {
-  capturer_->SetSharedMemoryFactory(std::move(shared_memory_factory));
-}
-
-void BlankDetectorDesktopCapturerWrapper::CaptureFrame() {
-  RTC_DCHECK(callback_);
-  capturer_->CaptureFrame();
-}
-
-void BlankDetectorDesktopCapturerWrapper::SetExcludedWindow(WindowId window) {
-  capturer_->SetExcludedWindow(window);
-}
-
-bool BlankDetectorDesktopCapturerWrapper::GetSourceList(SourceList* sources) {
-  return capturer_->GetSourceList(sources);
-}
-
-bool BlankDetectorDesktopCapturerWrapper::SelectSource(SourceId id) {
-  return capturer_->SelectSource(id);
-}
-
-bool BlankDetectorDesktopCapturerWrapper::FocusOnSelectedSource() {
-  return capturer_->FocusOnSelectedSource();
-}
-
-void BlankDetectorDesktopCapturerWrapper::OnCaptureResult(
-    Result result,
-    std::unique_ptr<DesktopFrame> frame) {
-  RTC_DCHECK(callback_);
-  if (result != Result::SUCCESS || non_blank_frame_received_) {
-    callback_->OnCaptureResult(result, std::move(frame));
-    return;
-  }
-
-  RTC_DCHECK(frame);
-
-  // If nothing has been changed in current frame, we do not need to check it
-  // again.
-  if (!frame->updated_region().is_empty() || is_first_frame_) {
-    last_frame_is_blank_ = IsBlankFrame(*frame);
-    is_first_frame_ = false;
-  }
-  RTC_HISTOGRAM_BOOLEAN("WebRTC.DesktopCapture.BlankFrameDetected",
-                        last_frame_is_blank_);
-  if (!last_frame_is_blank_) {
-    non_blank_frame_received_ = true;
-    callback_->OnCaptureResult(Result::SUCCESS, std::move(frame));
-    return;
-  }
-
-  callback_->OnCaptureResult(Result::ERROR_TEMPORARY,
-                             std::unique_ptr<DesktopFrame>());
-}
-
-bool BlankDetectorDesktopCapturerWrapper::IsBlankFrame(
-    const DesktopFrame& frame) const {
-  // We will check 7489 pixels for a frame with 1024 x 768 resolution.
-  for (int i = 0; i < frame.size().width() * frame.size().height(); i += 105) {
-    const int x = i % frame.size().width();
-    const int y = i / frame.size().width();
-    if (!IsBlankPixel(frame, x, y)) {
-      return false;
-    }
-  }
-
-  // We are verifying the pixel in the center as well.
-  return IsBlankPixel(frame, frame.size().width() / 2,
-                      frame.size().height() / 2);
-}
-
-bool BlankDetectorDesktopCapturerWrapper::IsBlankPixel(
-    const DesktopFrame& frame,
-    int x,
-    int y) const {
-  uint8_t* pixel_data = frame.GetFrameDataAtPos(DesktopVector(x, y));
-  return RgbaColor(pixel_data) == blank_pixel_;
-}
-
-}  // namespace webrtc
diff --git a/modules/desktop_capture/blank_detector_desktop_capturer_wrapper.h b/modules/desktop_capture/blank_detector_desktop_capturer_wrapper.h
deleted file mode 100644
index 0501cae..0000000
--- a/modules/desktop_capture/blank_detector_desktop_capturer_wrapper.h
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- *  Copyright (c) 2017 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_DESKTOP_CAPTURE_BLANK_DETECTOR_DESKTOP_CAPTURER_WRAPPER_H_
-#define WEBRTC_MODULES_DESKTOP_CAPTURE_BLANK_DETECTOR_DESKTOP_CAPTURER_WRAPPER_H_
-
-#include <memory>
-
-#include "webrtc/modules/desktop_capture/desktop_capturer.h"
-#include "webrtc/modules/desktop_capture/rgba_color.h"
-
-namespace webrtc {
-
-// A DesktopCapturer wrapper detects the return value of its owned
-// DesktopCapturer implementation. If sampled pixels returned by the
-// DesktopCapturer implementation all equal to the blank pixel, this wrapper
-// returns ERROR_TEMPORARY. If the DesktopCapturer implementation fails for too
-// many times, this wrapper returns ERROR_PERMANENT.
-class BlankDetectorDesktopCapturerWrapper final
-    : public DesktopCapturer,
-      public DesktopCapturer::Callback {
- public:
-  // Creates BlankDetectorDesktopCapturerWrapper. BlankDesktopCapturerWrapper
-  // takes ownership of |capturer|. The |blank_pixel| is the unmodified color
-  // returned by the |capturer|.
-  BlankDetectorDesktopCapturerWrapper(std::unique_ptr<DesktopCapturer> capturer,
-                                      RgbaColor blank_pixel);
-  ~BlankDetectorDesktopCapturerWrapper() override;
-
-  // DesktopCapturer interface.
-  void Start(DesktopCapturer::Callback* callback) override;
-  void SetSharedMemoryFactory(
-      std::unique_ptr<SharedMemoryFactory> shared_memory_factory) override;
-  void CaptureFrame() override;
-  void SetExcludedWindow(WindowId window) override;
-  bool GetSourceList(SourceList* sources) override;
-  bool SelectSource(SourceId id) override;
-  bool FocusOnSelectedSource() override;
-
- private:
-  // DesktopCapturer::Callback interface.
-  void OnCaptureResult(Result result,
-                       std::unique_ptr<DesktopFrame> frame) override;
-
-  bool IsBlankFrame(const DesktopFrame& frame) const;
-
-  // Detects whether pixel at (x, y) equals to |blank_pixel_|.
-  bool IsBlankPixel(const DesktopFrame& frame, int x, int y) const;
-
-  const std::unique_ptr<DesktopCapturer> capturer_;
-  const RgbaColor blank_pixel_;
-
-  // Whether a non-blank frame has been received.
-  bool non_blank_frame_received_ = false;
-
-  // Whether the last frame is blank.
-  bool last_frame_is_blank_ = false;
-
-  // Whether current frame is the first frame.
-  bool is_first_frame_ = true;
-
-  DesktopCapturer::Callback* callback_ = nullptr;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_DESKTOP_CAPTURE_BLANK_DETECTOR_DESKTOP_CAPTURER_WRAPPER_H_
diff --git a/modules/desktop_capture/blank_detector_desktop_capturer_wrapper_unittest.cc b/modules/desktop_capture/blank_detector_desktop_capturer_wrapper_unittest.cc
deleted file mode 100644
index bce82dd..0000000
--- a/modules/desktop_capture/blank_detector_desktop_capturer_wrapper_unittest.cc
+++ /dev/null
@@ -1,163 +0,0 @@
-/*
- *  Copyright (c) 2017 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/desktop_capture/blank_detector_desktop_capturer_wrapper.h"
-
-#include <memory>
-#include <utility>
-
-#include "webrtc/modules/desktop_capture/desktop_capturer.h"
-#include "webrtc/modules/desktop_capture/desktop_frame.h"
-#include "webrtc/modules/desktop_capture/desktop_frame_generator.h"
-#include "webrtc/modules/desktop_capture/fake_desktop_capturer.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-class BlankDetectorDesktopCapturerWrapperTest
-    : public testing::Test,
-      public DesktopCapturer::Callback {
- public:
-  BlankDetectorDesktopCapturerWrapperTest();
-  ~BlankDetectorDesktopCapturerWrapperTest() override;
-
- protected:
-  void PerfTest(DesktopCapturer* capturer);
-
-  const int frame_width_ = 1024;
-  const int frame_height_ = 768;
-  std::unique_ptr<BlankDetectorDesktopCapturerWrapper> wrapper_;
-  DesktopCapturer* capturer_ = nullptr;
-  BlackWhiteDesktopFramePainter painter_;
-  int num_frames_captured_ = 0;
-  DesktopCapturer::Result last_result_ = DesktopCapturer::Result::SUCCESS;
-  std::unique_ptr<DesktopFrame> last_frame_;
-
- private:
-  // DesktopCapturer::Callback interface.
-  void OnCaptureResult(DesktopCapturer::Result result,
-                       std::unique_ptr<DesktopFrame> frame) override;
-
-  PainterDesktopFrameGenerator frame_generator_;
-};
-
-BlankDetectorDesktopCapturerWrapperTest::
-BlankDetectorDesktopCapturerWrapperTest() {
-  frame_generator_.size()->set(frame_width_, frame_height_);
-  frame_generator_.set_desktop_frame_painter(&painter_);
-  std::unique_ptr<DesktopCapturer> capturer(new FakeDesktopCapturer());
-  FakeDesktopCapturer* fake_capturer =
-      static_cast<FakeDesktopCapturer*>(capturer.get());
-  fake_capturer->set_frame_generator(&frame_generator_);
-  capturer_ = fake_capturer;
-  wrapper_.reset(new BlankDetectorDesktopCapturerWrapper(
-      std::move(capturer), RgbaColor(0, 0, 0, 0)));
-  wrapper_->Start(this);
-}
-
-BlankDetectorDesktopCapturerWrapperTest::
-~BlankDetectorDesktopCapturerWrapperTest() = default;
-
-void BlankDetectorDesktopCapturerWrapperTest::OnCaptureResult(
-    DesktopCapturer::Result result,
-    std::unique_ptr<DesktopFrame> frame) {
-  last_result_ = result;
-  last_frame_ = std::move(frame);
-  num_frames_captured_++;
-}
-
-void BlankDetectorDesktopCapturerWrapperTest::PerfTest(
-    DesktopCapturer* capturer) {
-  for (int i = 0; i < 10000; i++) {
-    capturer->CaptureFrame();
-    ASSERT_EQ(num_frames_captured_, i + 1);
-  }
-}
-
-TEST_F(BlankDetectorDesktopCapturerWrapperTest, ShouldDetectBlankFrame) {
-  wrapper_->CaptureFrame();
-  ASSERT_EQ(num_frames_captured_, 1);
-  ASSERT_EQ(last_result_, DesktopCapturer::Result::ERROR_TEMPORARY);
-  ASSERT_FALSE(last_frame_);
-}
-
-TEST_F(BlankDetectorDesktopCapturerWrapperTest, ShouldPassBlankDetection) {
-  painter_.updated_region()->AddRect(DesktopRect::MakeXYWH(0, 0, 100, 100));
-  wrapper_->CaptureFrame();
-  ASSERT_EQ(num_frames_captured_, 1);
-  ASSERT_EQ(last_result_, DesktopCapturer::Result::SUCCESS);
-  ASSERT_TRUE(last_frame_);
-
-  painter_.updated_region()->AddRect(
-      DesktopRect::MakeXYWH(frame_width_ - 100, frame_height_ - 100, 100, 100));
-  wrapper_->CaptureFrame();
-  ASSERT_EQ(num_frames_captured_, 2);
-  ASSERT_EQ(last_result_, DesktopCapturer::Result::SUCCESS);
-  ASSERT_TRUE(last_frame_);
-
-  painter_.updated_region()->AddRect(
-      DesktopRect::MakeXYWH(0, frame_height_ - 100, 100, 100));
-  wrapper_->CaptureFrame();
-  ASSERT_EQ(num_frames_captured_, 3);
-  ASSERT_EQ(last_result_, DesktopCapturer::Result::SUCCESS);
-  ASSERT_TRUE(last_frame_);
-
-  painter_.updated_region()->AddRect(
-      DesktopRect::MakeXYWH(frame_width_ - 100, 0, 100, 100));
-  wrapper_->CaptureFrame();
-  ASSERT_EQ(num_frames_captured_, 4);
-  ASSERT_EQ(last_result_, DesktopCapturer::Result::SUCCESS);
-  ASSERT_TRUE(last_frame_);
-
-  painter_.updated_region()->AddRect(DesktopRect::MakeXYWH(
-      (frame_width_ >> 1) - 50, (frame_height_ >> 1) - 50, 100, 100));
-  wrapper_->CaptureFrame();
-  ASSERT_EQ(num_frames_captured_, 5);
-  ASSERT_EQ(last_result_, DesktopCapturer::Result::SUCCESS);
-  ASSERT_TRUE(last_frame_);
-}
-
-TEST_F(BlankDetectorDesktopCapturerWrapperTest,
-       ShouldNotCheckAfterANonBlankFrameReceived) {
-  wrapper_->CaptureFrame();
-  ASSERT_EQ(num_frames_captured_, 1);
-  ASSERT_EQ(last_result_, DesktopCapturer::Result::ERROR_TEMPORARY);
-  ASSERT_FALSE(last_frame_);
-
-  painter_.updated_region()->AddRect(
-      DesktopRect::MakeXYWH(frame_width_ - 100, 0, 100, 100));
-  wrapper_->CaptureFrame();
-  ASSERT_EQ(num_frames_captured_, 2);
-  ASSERT_EQ(last_result_, DesktopCapturer::Result::SUCCESS);
-  ASSERT_TRUE(last_frame_);
-
-  for (int i = 0; i < 100; i++) {
-    wrapper_->CaptureFrame();
-    ASSERT_EQ(num_frames_captured_, i + 3);
-    ASSERT_EQ(last_result_, DesktopCapturer::Result::SUCCESS);
-    ASSERT_TRUE(last_frame_);
-  }
-}
-
-// There is no perceptible impact by using BlankDetectorDesktopCapturerWrapper.
-// i.e. less than 0.2ms per frame.
-// [ OK ] DISABLED_Performance (10210 ms)
-// [ OK ] DISABLED_PerformanceComparison (8791 ms)
-TEST_F(BlankDetectorDesktopCapturerWrapperTest, DISABLED_Performance) {
-  PerfTest(wrapper_.get());
-}
-
-TEST_F(BlankDetectorDesktopCapturerWrapperTest,
-       DISABLED_PerformanceComparison) {
-  capturer_->Start(this);
-  PerfTest(capturer_);
-}
-
-}  // namespace webrtc
diff --git a/modules/desktop_capture/cropped_desktop_frame.cc b/modules/desktop_capture/cropped_desktop_frame.cc
deleted file mode 100644
index a76a3e7..0000000
--- a/modules/desktop_capture/cropped_desktop_frame.cc
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- *  Copyright (c) 2014 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 <memory>
-
-#include "webrtc/modules/desktop_capture/cropped_desktop_frame.h"
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace webrtc {
-
-// A DesktopFrame that is a sub-rect of another DesktopFrame.
-class CroppedDesktopFrame : public DesktopFrame {
- public:
-  CroppedDesktopFrame(std::unique_ptr<DesktopFrame> frame,
-                      const DesktopRect& rect);
-
- private:
-  const std::unique_ptr<DesktopFrame> frame_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(CroppedDesktopFrame);
-};
-
-std::unique_ptr<DesktopFrame> CreateCroppedDesktopFrame(
-    std::unique_ptr<DesktopFrame> frame,
-    const DesktopRect& rect) {
-  RTC_DCHECK(frame);
-
-  if (!DesktopRect::MakeSize(frame->size()).ContainsRect(rect)) {
-    return nullptr;
-  }
-
-  if (frame->size().equals(rect.size())) {
-    return frame;
-  }
-
-  return std::unique_ptr<DesktopFrame>(
-      new CroppedDesktopFrame(std::move(frame), rect));
-}
-
-CroppedDesktopFrame::CroppedDesktopFrame(std::unique_ptr<DesktopFrame> frame,
-                                         const DesktopRect& rect)
-    : DesktopFrame(rect.size(),
-                   frame->stride(),
-                   frame->GetFrameDataAtPos(rect.top_left()),
-                   frame->shared_memory()),
-      frame_(std::move(frame)) {
-  MoveFrameInfoFrom(frame_.get());
-  set_top_left(frame_->top_left().add(rect.top_left()));
-  mutable_updated_region()->IntersectWith(rect);
-  mutable_updated_region()->Translate(-rect.left(), -rect.top());
-}
-
-}  // namespace webrtc
diff --git a/modules/desktop_capture/cropped_desktop_frame.h b/modules/desktop_capture/cropped_desktop_frame.h
deleted file mode 100644
index 107fe7f..0000000
--- a/modules/desktop_capture/cropped_desktop_frame.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- *  Copyright (c) 2014 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_DESKTOP_CAPTURE_CROPPED_DESKTOP_FRAME_H_
-#define WEBRTC_MODULES_DESKTOP_CAPTURE_CROPPED_DESKTOP_FRAME_H_
-
-#include "webrtc/modules/desktop_capture/desktop_frame.h"
-
-namespace webrtc {
-
-// Creates a DesktopFrame to contain only the area of |rect| in the original
-// |frame|.
-// |frame| should not be nullptr. |rect| is in |frame| coordinate, i.e.
-// |frame|->top_left() does not impact the area of |rect|.
-// Returns nullptr frame if |rect| is not contained by the bounds of |frame|.
-std::unique_ptr<DesktopFrame> CreateCroppedDesktopFrame(
-    std::unique_ptr<DesktopFrame> frame,
-    const DesktopRect& rect);
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_DESKTOP_CAPTURE_CROPPED_DESKTOP_FRAME_H_
-
diff --git a/modules/desktop_capture/cropped_desktop_frame_unittest.cc b/modules/desktop_capture/cropped_desktop_frame_unittest.cc
deleted file mode 100644
index 36c51d7..0000000
--- a/modules/desktop_capture/cropped_desktop_frame_unittest.cc
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- *  Copyright (c) 2017 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 <memory>
-#include <utility>
-
-#include "webrtc/modules/desktop_capture/cropped_desktop_frame.h"
-#include "webrtc/modules/desktop_capture/desktop_frame.h"
-#include "webrtc/rtc_base/ptr_util.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-std::unique_ptr<DesktopFrame> CreateTestFrame() {
-  return rtc::MakeUnique<BasicDesktopFrame>(DesktopSize(10, 20));
-}
-
-TEST(CroppedDesktopFrameTest, DoNotCreateWrapperIfSizeIsNotChanged) {
-  std::unique_ptr<DesktopFrame> original = CreateTestFrame();
-  // owned by |original| and CroppedDesktopFrame.
-  DesktopFrame* raw_original = original.get();
-  std::unique_ptr<DesktopFrame> cropped = CreateCroppedDesktopFrame(
-      std::move(original), DesktopRect::MakeWH(10, 20));
-  ASSERT_EQ(cropped.get(), raw_original);
-}
-
-TEST(CroppedDesktopFrameTest, ReturnNullptrIfSizeIsNotSufficient) {
-  ASSERT_EQ(nullptr, CreateCroppedDesktopFrame(
-      CreateTestFrame(), DesktopRect::MakeWH(11, 10)));
-}
-
-TEST(CroppedDesktopFrameTest, ReturnNullIfCropRegionIsOutOfBounds) {
-  std::unique_ptr<DesktopFrame> frame = CreateTestFrame();
-  frame->set_top_left(DesktopVector(100, 200));
-  ASSERT_EQ(nullptr, CreateCroppedDesktopFrame(std::move(frame),
-      DesktopRect::MakeLTRB(101, 203, 109, 218)));
-}
-
-TEST(CroppedDesktopFrameTest, CropASubArea) {
-  std::unique_ptr<DesktopFrame> cropped = CreateCroppedDesktopFrame(
-      CreateTestFrame(), DesktopRect::MakeLTRB(1, 2, 9, 19));
-  ASSERT_EQ(cropped->size().width(), 8);
-  ASSERT_EQ(cropped->size().height(), 17);
-  ASSERT_EQ(cropped->top_left().x(), 1);
-  ASSERT_EQ(cropped->top_left().y(), 2);
-}
-
-TEST(CroppedDesktopFrameTest, SetTopLeft) {
-  std::unique_ptr<DesktopFrame> frame = CreateTestFrame();
-  frame->set_top_left(DesktopVector(100, 200));
-  frame = CreateCroppedDesktopFrame(std::move(frame),
-      DesktopRect::MakeLTRB(1, 3, 9, 18));
-  ASSERT_EQ(frame->size().width(), 8);
-  ASSERT_EQ(frame->size().height(), 15);
-  ASSERT_EQ(frame->top_left().x(), 101);
-  ASSERT_EQ(frame->top_left().y(), 203);
-}
-
-}  // namespace webrtc
diff --git a/modules/desktop_capture/cropping_window_capturer.cc b/modules/desktop_capture/cropping_window_capturer.cc
deleted file mode 100644
index 494047d..0000000
--- a/modules/desktop_capture/cropping_window_capturer.cc
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- *  Copyright (c) 2014 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/desktop_capture/cropping_window_capturer.h"
-
-#include "webrtc/modules/desktop_capture/cropped_desktop_frame.h"
-#include "webrtc/rtc_base/logging.h"
-
-namespace webrtc {
-
-CroppingWindowCapturer::CroppingWindowCapturer(
-    const DesktopCaptureOptions& options)
-    : options_(options),
-      callback_(NULL),
-      window_capturer_(DesktopCapturer::CreateRawWindowCapturer(options)),
-      selected_window_(kNullWindowId),
-      excluded_window_(kNullWindowId) {}
-
-CroppingWindowCapturer::~CroppingWindowCapturer() {}
-
-void CroppingWindowCapturer::Start(DesktopCapturer::Callback* callback) {
-  callback_ = callback;
-  window_capturer_->Start(callback);
-}
-
-void CroppingWindowCapturer::SetSharedMemoryFactory(
-    std::unique_ptr<SharedMemoryFactory> shared_memory_factory) {
-  window_capturer_->SetSharedMemoryFactory(std::move(shared_memory_factory));
-}
-
-void CroppingWindowCapturer::CaptureFrame() {
-  if (ShouldUseScreenCapturer()) {
-    if (!screen_capturer_.get()) {
-      screen_capturer_ = DesktopCapturer::CreateRawScreenCapturer(options_);
-      if (excluded_window_) {
-        screen_capturer_->SetExcludedWindow(excluded_window_);
-      }
-      screen_capturer_->Start(this);
-    }
-    screen_capturer_->CaptureFrame();
-  } else {
-    window_capturer_->CaptureFrame();
-  }
-}
-
-void CroppingWindowCapturer::SetExcludedWindow(WindowId window) {
-  excluded_window_ = window;
-  if (screen_capturer_.get()) {
-    screen_capturer_->SetExcludedWindow(window);
-  }
-}
-
-bool CroppingWindowCapturer::GetSourceList(SourceList* sources) {
-  return window_capturer_->GetSourceList(sources);
-}
-
-bool CroppingWindowCapturer::SelectSource(SourceId id) {
-  if (window_capturer_->SelectSource(id)) {
-    selected_window_ = id;
-    return true;
-  }
-  return false;
-}
-
-bool CroppingWindowCapturer::FocusOnSelectedSource() {
-  return window_capturer_->FocusOnSelectedSource();
-}
-
-void CroppingWindowCapturer::OnCaptureResult(
-    DesktopCapturer::Result result,
-    std::unique_ptr<DesktopFrame> screen_frame) {
-  if (!ShouldUseScreenCapturer()) {
-    LOG(LS_INFO) << "Window no longer on top when ScreenCapturer finishes";
-    window_capturer_->CaptureFrame();
-    return;
-  }
-
-  if (result != Result::SUCCESS) {
-    LOG(LS_WARNING) << "ScreenCapturer failed to capture a frame";
-    callback_->OnCaptureResult(result, nullptr);
-    return;
-  }
-
-  DesktopRect window_rect = GetWindowRectInVirtualScreen();
-  if (window_rect.is_empty()) {
-    LOG(LS_WARNING) << "Window rect is empty";
-    callback_->OnCaptureResult(Result::ERROR_TEMPORARY, nullptr);
-    return;
-  }
-
-  callback_->OnCaptureResult(
-      Result::SUCCESS,
-      CreateCroppedDesktopFrame(std::move(screen_frame), window_rect));
-}
-
-bool CroppingWindowCapturer::IsOccluded(const DesktopVector& pos) {
-  // Returns true if either capturer returns true.
-  if (window_capturer_->IsOccluded(pos)) {
-    return true;
-  }
-  if (screen_capturer_ != nullptr && screen_capturer_->IsOccluded(pos)) {
-    return true;
-  }
-  return false;
-}
-
-#if !defined(WEBRTC_WIN)
-// CroppingWindowCapturer is implemented only for windows. On other platforms
-// the regular window capturer is used.
-// static
-std::unique_ptr<DesktopCapturer> CroppingWindowCapturer::CreateCapturer(
-    const DesktopCaptureOptions& options) {
-  return DesktopCapturer::CreateWindowCapturer(options);
-}
-#endif
-
-}  // namespace webrtc
diff --git a/modules/desktop_capture/cropping_window_capturer.h b/modules/desktop_capture/cropping_window_capturer.h
deleted file mode 100644
index 3542fbd..0000000
--- a/modules/desktop_capture/cropping_window_capturer.h
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- *  Copyright (c) 2014 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_DESKTOP_CAPTURE_CROPPING_WINDOW_CAPTURER_H_
-#define WEBRTC_MODULES_DESKTOP_CAPTURE_CROPPING_WINDOW_CAPTURER_H_
-
-#include <memory>
-
-#include "webrtc/modules/desktop_capture/desktop_capturer.h"
-#include "webrtc/modules/desktop_capture/desktop_capture_options.h"
-
-namespace webrtc {
-
-// WindowCapturer implementation that uses a screen capturer to capture the
-// whole screen and crops the video frame to the window area when the captured
-// window is on top.
-class CroppingWindowCapturer : public DesktopCapturer,
-                               public DesktopCapturer::Callback {
- public:
-  static std::unique_ptr<DesktopCapturer> CreateCapturer(
-      const DesktopCaptureOptions& options);
-
-  ~CroppingWindowCapturer() override;
-
-  // DesktopCapturer implementation.
-  void Start(DesktopCapturer::Callback* callback) override;
-  void SetSharedMemoryFactory(
-      std::unique_ptr<SharedMemoryFactory> shared_memory_factory) override;
-  void CaptureFrame() override;
-  void SetExcludedWindow(WindowId window) override;
-  bool GetSourceList(SourceList* sources) override;
-  bool SelectSource(SourceId id) override;
-  bool FocusOnSelectedSource() override;
-  bool IsOccluded(const DesktopVector& pos) override;
-
-  // DesktopCapturer::Callback implementation, passed to |screen_capturer_| to
-  // intercept the capture result.
-  void OnCaptureResult(DesktopCapturer::Result result,
-                       std::unique_ptr<DesktopFrame> frame) override;
-
- protected:
-  explicit CroppingWindowCapturer(const DesktopCaptureOptions& options);
-
-  // The platform implementation should override these methods.
-
-  // Returns true if it is OK to capture the whole screen and crop to the
-  // selected window, i.e. the selected window is opaque, rectangular, and not
-  // occluded.
-  virtual bool ShouldUseScreenCapturer() = 0;
-
-  // Returns the window area relative to the top left of the virtual screen
-  // within the bounds of the virtual screen. This function should return the
-  // DesktopRect in full desktop coordinates, i.e. the top-left monitor starts
-  // from (0, 0).
-  virtual DesktopRect GetWindowRectInVirtualScreen() = 0;
-
-  WindowId selected_window() const { return selected_window_; }
-  WindowId excluded_window() const { return excluded_window_; }
-
- private:
-  DesktopCaptureOptions options_;
-  DesktopCapturer::Callback* callback_;
-  std::unique_ptr<DesktopCapturer> window_capturer_;
-  std::unique_ptr<DesktopCapturer> screen_capturer_;
-  SourceId selected_window_;
-  WindowId excluded_window_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_DESKTOP_CAPTURE_CROPPING_WINDOW_CAPTURER_H_
-
diff --git a/modules/desktop_capture/cropping_window_capturer_win.cc b/modules/desktop_capture/cropping_window_capturer_win.cc
deleted file mode 100644
index 5730e43..0000000
--- a/modules/desktop_capture/cropping_window_capturer_win.cc
+++ /dev/null
@@ -1,267 +0,0 @@
-/*
- *  Copyright (c) 2014 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/desktop_capture/cropping_window_capturer.h"
-
-#include "webrtc/modules/desktop_capture/win/screen_capture_utils.h"
-#include "webrtc/modules/desktop_capture/win/window_capture_utils.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/win32.h"
-
-namespace webrtc {
-
-namespace {
-
-// Used to pass input/output data during the EnumWindow call for verifying if
-// the selected window is on top.
-struct TopWindowVerifierContext {
-  TopWindowVerifierContext(HWND selected_window,
-                           HWND excluded_window,
-                           DesktopRect selected_window_rect)
-      : selected_window(selected_window),
-        excluded_window(excluded_window),
-        selected_window_rect(selected_window_rect),
-        is_top_window(false) {
-    RTC_DCHECK_NE(selected_window, excluded_window);
-  }
-
-  const HWND selected_window;
-  const HWND excluded_window;
-  const DesktopRect selected_window_rect;
-  bool is_top_window;
-};
-
-// The function is called during EnumWindow for every window enumerated and is
-// responsible for verifying if the selected window is on top.
-BOOL CALLBACK TopWindowVerifier(HWND hwnd, LPARAM param) {
-  TopWindowVerifierContext* context =
-      reinterpret_cast<TopWindowVerifierContext*>(param);
-
-  if (hwnd == context->selected_window) {
-    context->is_top_window = true;
-    return FALSE;
-  }
-
-  // Ignore the excluded window.
-  if (hwnd == context->excluded_window) {
-    return TRUE;
-  }
-
-  // Ignore hidden or minimized window.
-  if (IsIconic(hwnd) || !IsWindowVisible(hwnd)) {
-    return TRUE;
-  }
-
-  // Ignore descendant windows since we want to capture them.
-  // This check does not work for tooltips and context menus. Drop down menus
-  // and popup windows are fine.
-  //
-  // GA_ROOT returns the root window instead of the owner. I.e. for a dialog
-  // window, GA_ROOT returns the dialog window itself. GA_ROOTOWNER returns the
-  // application main window which opens the dialog window. Since we are sharing
-  // the application main window, GA_ROOT should be used here.
-  if (GetAncestor(hwnd, GA_ROOT) == context->selected_window) {
-    return TRUE;
-  }
-
-  // If |hwnd| has no title and belongs to the same process, assume it's a
-  // tooltip or context menu from the selected window and ignore it.
-  // TODO(zijiehe): This check cannot cover the case where tooltip or context
-  // menu of the child-window is covering the main window. See
-  // https://bugs.chromium.org/p/webrtc/issues/detail?id=8062 for details.
-  const size_t kTitleLength = 32;
-  WCHAR window_title[kTitleLength];
-  GetWindowText(hwnd, window_title, kTitleLength);
-  if (wcsnlen_s(window_title, kTitleLength) == 0) {
-    DWORD enumerated_window_process_id;
-    DWORD selected_window_process_id;
-    GetWindowThreadProcessId(hwnd, &enumerated_window_process_id);
-    GetWindowThreadProcessId(context->selected_window,
-                             &selected_window_process_id);
-    if (selected_window_process_id == enumerated_window_process_id) {
-      return TRUE;
-    }
-  }
-
-  // Checks whether current window |hwnd| intersects with
-  // |context|->selected_window.
-  // |content_rect| is preferred because,
-  // 1. WindowCapturerWin is using GDI capturer, which cannot capture DX output.
-  //    So ScreenCapturer should be used as much as possible to avoid
-  //    uncapturable cases. Note: lots of new applications are using DX output
-  //    (hardware acceleration) to improve the performance which cannot be
-  //    captured by WindowCapturerWin. See bug http://crbug.com/741770.
-  // 2. WindowCapturerWin is still useful because we do not want to expose the
-  //    content on other windows if the target window is covered by them.
-  // 3. Shadow and borders should not be considered as "content" on other
-  //    windows because they do not expose any useful information.
-  //
-  // So we can bear the false-negative cases (target window is covered by the
-  // borders or shadow of other windows, but we have not detected it) in favor
-  // of using ScreenCapturer, rather than let the false-positive cases (target
-  // windows is only covered by borders or shadow of other windows, but we treat
-  // it as overlapping) impact the user experience.
-  DesktopRect content_rect;
-  if (!GetWindowContentRect(hwnd, &content_rect)) {
-    // Bail out if failed to get the window area.
-    context->is_top_window = false;
-    return FALSE;
-  }
-
-  content_rect.IntersectWith(context->selected_window_rect);
-
-  // If intersection is not empty, the selected window is not on top.
-  if (!content_rect.is_empty()) {
-    context->is_top_window = false;
-    return FALSE;
-  }
-  // Otherwise, keep enumerating.
-  return TRUE;
-}
-
-class CroppingWindowCapturerWin : public CroppingWindowCapturer {
- public:
-  CroppingWindowCapturerWin(
-      const DesktopCaptureOptions& options)
-      : CroppingWindowCapturer(options) {}
-
- private:
-  bool ShouldUseScreenCapturer() override;
-  DesktopRect GetWindowRectInVirtualScreen() override;
-
-  // The region from GetWindowRgn in the desktop coordinate if the region is
-  // rectangular, or the rect from GetWindowRect if the region is not set.
-  DesktopRect window_region_rect_;
-
-  AeroChecker aero_checker_;
-};
-
-bool CroppingWindowCapturerWin::ShouldUseScreenCapturer() {
-  if (!rtc::IsWindows8OrLater() && aero_checker_.IsAeroEnabled()) {
-    return false;
-  }
-
-  const HWND selected = reinterpret_cast<HWND>(selected_window());
-  // Check if the window is hidden or minimized.
-  if (IsIconic(selected) || !IsWindowVisible(selected)) {
-    return false;
-  }
-
-  // Check if the window is a translucent layered window.
-  const LONG window_ex_style = GetWindowLong(selected, GWL_EXSTYLE);
-  if (window_ex_style & WS_EX_LAYERED) {
-    COLORREF color_ref_key = 0;
-    BYTE alpha = 0;
-    DWORD flags = 0;
-
-    // GetLayeredWindowAttributes fails if the window was setup with
-    // UpdateLayeredWindow. We have no way to know the opacity of the window in
-    // that case. This happens for Stiky Note (crbug/412726).
-    if (!GetLayeredWindowAttributes(selected, &color_ref_key, &alpha, &flags))
-      return false;
-
-    // UpdateLayeredWindow is the only way to set per-pixel alpha and will cause
-    // the previous GetLayeredWindowAttributes to fail. So we only need to check
-    // the window wide color key or alpha.
-    if ((flags & LWA_COLORKEY) || ((flags & LWA_ALPHA) && (alpha < 255))) {
-      return false;
-    }
-  }
-
-  if (!GetWindowRect(selected, &window_region_rect_)) {
-    return false;
-  }
-
-  DesktopRect content_rect;
-  if (!GetWindowContentRect(selected, &content_rect)) {
-    return false;
-  }
-
-  DesktopRect region_rect;
-  // Get the window region and check if it is rectangular.
-  const int region_type =
-      GetWindowRegionTypeWithBoundary(selected, &region_rect);
-
-  // Do not use the screen capturer if the region is empty or not rectangular.
-  if (region_type == COMPLEXREGION || region_type == NULLREGION) {
-    return false;
-  }
-
-  if (region_type == SIMPLEREGION) {
-    // The |region_rect| returned from GetRgnBox() is always in window
-    // coordinate.
-    region_rect.Translate(
-        window_region_rect_.left(), window_region_rect_.top());
-    // MSDN: The window region determines the area *within* the window where the
-    // system permits drawing.
-    // https://msdn.microsoft.com/en-us/library/windows/desktop/dd144950(v=vs.85).aspx.
-    //
-    // |region_rect| should always be inside of |window_region_rect_|. So after
-    // the intersection, |window_region_rect_| == |region_rect|. If so, what's
-    // the point of the intersecting operations? Why cannot we directly retrieve
-    // |window_region_rect_| from GetWindowRegionTypeWithBoundary() function?
-    // TODO(zijiehe): Figure out the purpose of these intersections.
-    window_region_rect_.IntersectWith(region_rect);
-    content_rect.IntersectWith(region_rect);
-  }
-
-  // Check if the client area is out of the screen area. When the window is
-  // maximized, only its client area is visible in the screen, the border will
-  // be hidden. So we are using |content_rect| here.
-  if (!GetFullscreenRect().ContainsRect(content_rect)) {
-    return false;
-  }
-
-  // Check if the window is occluded by any other window, excluding the child
-  // windows, context menus, and |excluded_window_|.
-  // |content_rect| is preferred, see the comments in TopWindowVerifier()
-  // function.
-  TopWindowVerifierContext context(
-      selected, reinterpret_cast<HWND>(excluded_window()), content_rect);
-  const LPARAM enum_param = reinterpret_cast<LPARAM>(&context);
-  EnumWindows(&TopWindowVerifier, enum_param);
-  if (!context.is_top_window) {
-    return false;
-  }
-
-  // If |selected| is not covered by other windows, check whether it is
-  // covered by its own child windows. Note: EnumChildWindows() enumerates child
-  // windows in all generations, but does not include any controls like buttons
-  // or textboxes.
-  EnumChildWindows(selected, &TopWindowVerifier, enum_param);
-  return context.is_top_window;
-}
-
-DesktopRect CroppingWindowCapturerWin::GetWindowRectInVirtualScreen() {
-  DesktopRect window_rect;
-  HWND hwnd = reinterpret_cast<HWND>(selected_window());
-  if (!GetCroppedWindowRect(hwnd, &window_rect, /* original_rect */ nullptr)) {
-    LOG(LS_WARNING) << "Failed to get window info: " << GetLastError();
-    return window_rect;
-  }
-  window_rect.IntersectWith(window_region_rect_);
-
-  // Convert |window_rect| to be relative to the top-left of the virtual screen.
-  DesktopRect screen_rect(GetFullscreenRect());
-  window_rect.IntersectWith(screen_rect);
-  window_rect.Translate(-screen_rect.left(), -screen_rect.top());
-  return window_rect;
-}
-
-}  // namespace
-
-// static
-std::unique_ptr<DesktopCapturer> CroppingWindowCapturer::CreateCapturer(
-    const DesktopCaptureOptions& options) {
-  return std::unique_ptr<DesktopCapturer>(
-      new CroppingWindowCapturerWin(options));
-}
-
-}  // namespace webrtc
diff --git a/modules/desktop_capture/desktop_and_cursor_composer.cc b/modules/desktop_capture/desktop_and_cursor_composer.cc
deleted file mode 100644
index 4948dc4..0000000
--- a/modules/desktop_capture/desktop_and_cursor_composer.cc
+++ /dev/null
@@ -1,220 +0,0 @@
-/*
- *  Copyright (c) 2013 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/desktop_capture/desktop_and_cursor_composer.h"
-
-#include <string.h>
-
-#include <utility>
-
-#include "webrtc/modules/desktop_capture/desktop_capturer.h"
-#include "webrtc/modules/desktop_capture/desktop_frame.h"
-#include "webrtc/modules/desktop_capture/mouse_cursor.h"
-#include "webrtc/modules/desktop_capture/mouse_cursor_monitor.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/ptr_util.h"
-
-namespace webrtc {
-
-namespace {
-
-// Helper function that blends one image into another. Source image must be
-// pre-multiplied with the alpha channel. Destination is assumed to be opaque.
-void AlphaBlend(uint8_t* dest, int dest_stride,
-                const uint8_t* src, int src_stride,
-                const DesktopSize& size) {
-  for (int y = 0; y < size.height(); ++y) {
-    for (int x = 0; x < size.width(); ++x) {
-      uint32_t base_alpha = 255 - src[x * DesktopFrame::kBytesPerPixel + 3];
-      if (base_alpha == 255) {
-        continue;
-      } else if (base_alpha == 0) {
-        memcpy(dest + x * DesktopFrame::kBytesPerPixel,
-               src + x * DesktopFrame::kBytesPerPixel,
-               DesktopFrame::kBytesPerPixel);
-      } else {
-        dest[x * DesktopFrame::kBytesPerPixel] =
-            dest[x * DesktopFrame::kBytesPerPixel] * base_alpha / 255 +
-            src[x * DesktopFrame::kBytesPerPixel];
-        dest[x * DesktopFrame::kBytesPerPixel + 1] =
-            dest[x * DesktopFrame::kBytesPerPixel + 1] * base_alpha / 255 +
-            src[x * DesktopFrame::kBytesPerPixel + 1];
-        dest[x * DesktopFrame::kBytesPerPixel + 2] =
-            dest[x * DesktopFrame::kBytesPerPixel + 2] * base_alpha / 255 +
-            src[x * DesktopFrame::kBytesPerPixel + 2];
-      }
-    }
-    src += src_stride;
-    dest += dest_stride;
-  }
-}
-
-// DesktopFrame wrapper that draws mouse on a frame and restores original
-// content before releasing the underlying frame.
-class DesktopFrameWithCursor : public DesktopFrame {
- public:
-  // Takes ownership of |frame|.
-  DesktopFrameWithCursor(std::unique_ptr<DesktopFrame> frame,
-                         const MouseCursor& cursor,
-                         const DesktopVector& position);
-  ~DesktopFrameWithCursor() override;
-
- private:
-  const std::unique_ptr<DesktopFrame> original_frame_;
-
-  DesktopVector restore_position_;
-  std::unique_ptr<DesktopFrame> restore_frame_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(DesktopFrameWithCursor);
-};
-
-DesktopFrameWithCursor::DesktopFrameWithCursor(
-    std::unique_ptr<DesktopFrame> frame,
-    const MouseCursor& cursor,
-    const DesktopVector& position)
-    : DesktopFrame(frame->size(),
-                   frame->stride(),
-                   frame->data(),
-                   frame->shared_memory()),
-      original_frame_(std::move(frame)) {
-  MoveFrameInfoFrom(original_frame_.get());
-
-  DesktopVector image_pos = position.subtract(cursor.hotspot());
-  DesktopRect target_rect = DesktopRect::MakeSize(cursor.image()->size());
-  target_rect.Translate(image_pos);
-  DesktopVector target_origin = target_rect.top_left();
-  target_rect.IntersectWith(DesktopRect::MakeSize(size()));
-
-  if (target_rect.is_empty())
-    return;
-
-  // Copy original screen content under cursor to |restore_frame_|.
-  restore_position_ = target_rect.top_left();
-  restore_frame_.reset(new BasicDesktopFrame(target_rect.size()));
-  restore_frame_->CopyPixelsFrom(*this, target_rect.top_left(),
-                                 DesktopRect::MakeSize(restore_frame_->size()));
-
-  // Blit the cursor.
-  uint8_t* target_rect_data = reinterpret_cast<uint8_t*>(data()) +
-                              target_rect.top() * stride() +
-                              target_rect.left() * DesktopFrame::kBytesPerPixel;
-  DesktopVector origin_shift = target_rect.top_left().subtract(target_origin);
-  AlphaBlend(target_rect_data, stride(),
-             cursor.image()->data() +
-                 origin_shift.y() * cursor.image()->stride() +
-                 origin_shift.x() * DesktopFrame::kBytesPerPixel,
-             cursor.image()->stride(),
-             target_rect.size());
-}
-
-DesktopFrameWithCursor::~DesktopFrameWithCursor() {
-  // Restore original content of the frame.
-  if (restore_frame_) {
-    DesktopRect target_rect = DesktopRect::MakeSize(restore_frame_->size());
-    target_rect.Translate(restore_position_);
-    CopyPixelsFrom(restore_frame_->data(), restore_frame_->stride(),
-                   target_rect);
-  }
-}
-
-}  // namespace
-
-DesktopAndCursorComposer::DesktopAndCursorComposer(
-    DesktopCapturer* desktop_capturer,
-    MouseCursorMonitor* mouse_monitor)
-    : DesktopAndCursorComposer(desktop_capturer, mouse_monitor, false) {}
-
-DesktopAndCursorComposer::DesktopAndCursorComposer(
-    std::unique_ptr<DesktopCapturer> desktop_capturer,
-    const DesktopCaptureOptions& options)
-    : DesktopAndCursorComposer(desktop_capturer.release(),
-                               MouseCursorMonitor::Create(options).release(),
-                               true) {}
-
-DesktopAndCursorComposer::DesktopAndCursorComposer(
-    DesktopCapturer* desktop_capturer,
-    MouseCursorMonitor* mouse_monitor,
-    bool use_desktop_relative_cursor_position)
-    : desktop_capturer_(desktop_capturer),
-      mouse_monitor_(mouse_monitor),
-      use_desktop_relative_cursor_position_(
-          use_desktop_relative_cursor_position) {
-  RTC_DCHECK(desktop_capturer_);
-}
-
-DesktopAndCursorComposer::~DesktopAndCursorComposer() = default;
-
-void DesktopAndCursorComposer::Start(DesktopCapturer::Callback* callback) {
-  callback_ = callback;
-  if (mouse_monitor_)
-    mouse_monitor_->Init(this, MouseCursorMonitor::SHAPE_AND_POSITION);
-  desktop_capturer_->Start(this);
-}
-
-void DesktopAndCursorComposer::SetSharedMemoryFactory(
-    std::unique_ptr<SharedMemoryFactory> shared_memory_factory) {
-  desktop_capturer_->SetSharedMemoryFactory(std::move(shared_memory_factory));
-}
-
-void DesktopAndCursorComposer::CaptureFrame() {
-  if (mouse_monitor_)
-    mouse_monitor_->Capture();
-  desktop_capturer_->CaptureFrame();
-}
-
-void DesktopAndCursorComposer::SetExcludedWindow(WindowId window) {
-  desktop_capturer_->SetExcludedWindow(window);
-}
-
-void DesktopAndCursorComposer::OnCaptureResult(
-    DesktopCapturer::Result result,
-    std::unique_ptr<DesktopFrame> frame) {
-  if (frame && cursor_) {
-    if (use_desktop_relative_cursor_position_) {
-      if (frame->rect().Contains(cursor_position_) &&
-          !desktop_capturer_->IsOccluded(cursor_position_)) {
-        const DesktopVector relative_position =
-            cursor_position_.subtract(frame->top_left());
-        frame = rtc::MakeUnique<DesktopFrameWithCursor>(
-            std::move(frame), *cursor_, relative_position);
-      }
-    } else {
-      if (cursor_state_ == MouseCursorMonitor::INSIDE) {
-        frame = rtc::MakeUnique<DesktopFrameWithCursor>(
-            std::move(frame), *cursor_, cursor_position_);
-      }
-    }
-  }
-
-  callback_->OnCaptureResult(result, std::move(frame));
-}
-
-void DesktopAndCursorComposer::OnMouseCursor(MouseCursor* cursor) {
-  cursor_.reset(cursor);
-}
-
-void DesktopAndCursorComposer::OnMouseCursorPosition(
-    MouseCursorMonitor::CursorState state,
-    const DesktopVector& position) {
-  if (!use_desktop_relative_cursor_position_) {
-    cursor_state_ = state;
-    cursor_position_ = position;
-  }
-}
-
-void DesktopAndCursorComposer::OnMouseCursorPosition(
-    const DesktopVector& position) {
-  if (use_desktop_relative_cursor_position_) {
-    cursor_position_ = position;
-  }
-}
-
-}  // namespace webrtc
diff --git a/modules/desktop_capture/desktop_and_cursor_composer.h b/modules/desktop_capture/desktop_and_cursor_composer.h
deleted file mode 100644
index 1d685bb..0000000
--- a/modules/desktop_capture/desktop_and_cursor_composer.h
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- *  Copyright (c) 2013 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_DESKTOP_CAPTURE_DESKTOP_AND_CURSOR_COMPOSER_H_
-#define WEBRTC_MODULES_DESKTOP_CAPTURE_DESKTOP_AND_CURSOR_COMPOSER_H_
-
-#include <memory>
-
-#include "webrtc/modules/desktop_capture/desktop_capture_options.h"
-#include "webrtc/modules/desktop_capture/desktop_capturer.h"
-#include "webrtc/modules/desktop_capture/mouse_cursor_monitor.h"
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace webrtc {
-
-template <bool use_desktop_relative_cursor_position>
-class DesktopAndCursorComposerTest;
-
-// A wrapper for DesktopCapturer that also captures mouse using specified
-// MouseCursorMonitor and renders it on the generated streams.
-class DesktopAndCursorComposer : public DesktopCapturer,
-                                 public DesktopCapturer::Callback,
-                                 public MouseCursorMonitor::Callback {
- public:
-  // Creates a new blender that captures mouse cursor using |mouse_monitor| and
-  // renders it into the frames generated by |desktop_capturer|. If
-  // |mouse_monitor| is NULL the frames are passed unmodified. Takes ownership
-  // of both arguments.
-  // Deprecated: use the constructor below.
-  DesktopAndCursorComposer(DesktopCapturer* desktop_capturer,
-                           MouseCursorMonitor* mouse_monitor);
-
-  // Creates a new blender that captures mouse cursor using
-  // MouseCursorMonitor::Create(options) and renders it into the frames
-  // generated by |desktop_capturer|.
-  DesktopAndCursorComposer(std::unique_ptr<DesktopCapturer> desktop_capturer,
-                           const DesktopCaptureOptions& options);
-
-  ~DesktopAndCursorComposer() override;
-
-  // DesktopCapturer interface.
-  void Start(DesktopCapturer::Callback* callback) override;
-  void SetSharedMemoryFactory(
-      std::unique_ptr<SharedMemoryFactory> shared_memory_factory) override;
-  void CaptureFrame() override;
-  void SetExcludedWindow(WindowId window) override;
-
- private:
-  // Allows test cases to use a fake MouseCursorMonitor implementation.
-  friend class DesktopAndCursorComposerTest<true>;
-  friend class DesktopAndCursorComposerTest<false>;
-
-  // Constructor to delegate both deprecated and new constructors and allows
-  // test cases to use a fake MouseCursorMonitor implementation.
-  DesktopAndCursorComposer(DesktopCapturer* desktop_capturer,
-                           MouseCursorMonitor* mouse_monitor,
-                           bool use_desktop_relative_cursor_position);
-
-  // DesktopCapturer::Callback interface.
-  void OnCaptureResult(DesktopCapturer::Result result,
-                       std::unique_ptr<DesktopFrame> frame) override;
-
-  // MouseCursorMonitor::Callback interface.
-  void OnMouseCursor(MouseCursor* cursor) override;
-  void OnMouseCursorPosition(MouseCursorMonitor::CursorState state,
-                             const DesktopVector& position) override;
-  void OnMouseCursorPosition(const DesktopVector& position) override;
-
-  const std::unique_ptr<DesktopCapturer> desktop_capturer_;
-  const std::unique_ptr<MouseCursorMonitor> mouse_monitor_;
-  // This is a temporary flag to decide how to use the |mouse_monitor_|.
-  // If it's true, DesktopAndCursorComposer will use the absolute position from
-  // MouseCursorMonitor but ignore the MouseCursorMonitor::CursorState.
-  // Otherwise MouseCursorMonitor::CursorState is respected. This flag is false
-  // when the deprecated constructor is used, and true when the new one is used.
-  // This flag will be removed together with the deprecated constructor.
-  const bool use_desktop_relative_cursor_position_;
-
-  DesktopCapturer::Callback* callback_;
-
-  std::unique_ptr<MouseCursor> cursor_;
-  // This field is irrelevant if |use_desktop_relative_cursor_position_| is
-  // true.
-  MouseCursorMonitor::CursorState cursor_state_;
-  DesktopVector cursor_position_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(DesktopAndCursorComposer);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_DESKTOP_CAPTURE_DESKTOP_AND_CURSOR_COMPOSER_H_
diff --git a/modules/desktop_capture/desktop_and_cursor_composer_unittest.cc b/modules/desktop_capture/desktop_and_cursor_composer_unittest.cc
deleted file mode 100644
index fe75bb5..0000000
--- a/modules/desktop_capture/desktop_and_cursor_composer_unittest.cc
+++ /dev/null
@@ -1,368 +0,0 @@
-/*
- *  Copyright (c) 2013 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 <memory>
-
-#include "webrtc/modules/desktop_capture/desktop_and_cursor_composer.h"
-#include "webrtc/modules/desktop_capture/desktop_capturer.h"
-#include "webrtc/modules/desktop_capture/desktop_capture_options.h"
-#include "webrtc/modules/desktop_capture/desktop_frame.h"
-#include "webrtc/modules/desktop_capture/mouse_cursor.h"
-#include "webrtc/modules/desktop_capture/shared_desktop_frame.h"
-#include "webrtc/rtc_base/arraysize.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-namespace {
-
-const int kScreenWidth = 100;
-const int kScreenHeight = 100;
-const int kCursorWidth = 10;
-const int kCursorHeight = 10;
-
-const int kTestCursorSize = 3;
-const uint32_t kTestCursorData[kTestCursorSize][kTestCursorSize] = {
-  { 0xffffffff, 0x99990000, 0xaa222222, },
-  { 0x88008800, 0xaa0000aa, 0xaa333333, },
-  { 0x00000000, 0xaa0000aa, 0xaa333333, },
-};
-
-uint32_t GetFakeFramePixelValue(const DesktopVector& p) {
-  uint32_t r = 100 + p.x();
-  uint32_t g = 100 + p.y();
-  uint32_t b = 100 + p.x() + p.y();
-  return b + (g << 8) + (r << 16) + 0xff000000;
-}
-
-uint32_t GetFramePixel(const DesktopFrame& frame, const DesktopVector& pos) {
-  return *reinterpret_cast<uint32_t*>(frame.GetFrameDataAtPos(pos));
-}
-
-// Blends two pixel values taking into account alpha.
-uint32_t BlendPixels(uint32_t dest, uint32_t src) {
-  uint8_t alpha = 255 - ((src & 0xff000000) >> 24);
-  uint32_t r =
-      ((dest & 0x00ff0000) >> 16) * alpha / 255 + ((src & 0x00ff0000) >> 16);
-  uint32_t g =
-      ((dest & 0x0000ff00) >> 8) * alpha / 255 + ((src & 0x0000ff00) >> 8);
-  uint32_t b = (dest & 0x000000ff) * alpha / 255 + (src & 0x000000ff);
-  return b + (g << 8) + (r << 16) + 0xff000000;
-}
-
-DesktopFrame* CreateTestFrame() {
-  DesktopFrame* frame =
-      new BasicDesktopFrame(DesktopSize(kScreenWidth, kScreenHeight));
-  uint32_t* data = reinterpret_cast<uint32_t*>(frame->data());
-  for (int y = 0; y < kScreenHeight; ++y) {
-    for (int x = 0; x < kScreenWidth; ++x) {
-      *(data++) = GetFakeFramePixelValue(DesktopVector(x, y));
-    }
-  }
-  return frame;
-}
-
-class FakeScreenCapturer : public DesktopCapturer {
- public:
-  FakeScreenCapturer() {}
-
-  void Start(Callback* callback) override { callback_ = callback; }
-
-  void CaptureFrame() override {
-    callback_->OnCaptureResult(
-        next_frame_ ? Result::SUCCESS : Result::ERROR_TEMPORARY,
-        std::move(next_frame_));
-  }
-
-  void SetNextFrame(std::unique_ptr<DesktopFrame> next_frame) {
-    next_frame_ = std::move(next_frame);
-  }
-
-  bool IsOccluded(const DesktopVector& pos) override { return is_occluded_; }
-
-  void set_is_occluded(bool value) { is_occluded_ = value; }
-
- private:
-  Callback* callback_ = nullptr;
-
-  std::unique_ptr<DesktopFrame> next_frame_;
-  bool is_occluded_ = false;
-};
-
-class FakeMouseMonitor : public MouseCursorMonitor {
- public:
-  FakeMouseMonitor() : changed_(true) {}
-
-  void SetState(CursorState state, const DesktopVector& pos) {
-    state_ = state;
-    position_ = pos;
-  }
-
-  void SetHotspot(const DesktopVector& hotspot) {
-    if (!hotspot_.equals(hotspot))
-      changed_ = true;
-    hotspot_ = hotspot;
-  }
-
-  void Init(Callback* callback, Mode mode) override { callback_ = callback; }
-
-  void Capture() override {
-    if (changed_) {
-      std::unique_ptr<DesktopFrame> image(
-          new BasicDesktopFrame(DesktopSize(kCursorWidth, kCursorHeight)));
-      uint32_t* data = reinterpret_cast<uint32_t*>(image->data());
-      memset(data, 0, image->stride() * kCursorHeight);
-
-      // Set four pixels near the hotspot and leave all other blank.
-      for (int y = 0; y < kTestCursorSize; ++y) {
-        for (int x = 0; x < kTestCursorSize; ++x) {
-          data[(hotspot_.y() + y) * kCursorWidth + (hotspot_.x() + x)] =
-              kTestCursorData[y][x];
-        }
-      }
-
-      callback_->OnMouseCursor(new MouseCursor(image.release(), hotspot_));
-    }
-
-    callback_->OnMouseCursorPosition(state_, position_);
-    callback_->OnMouseCursorPosition(position_);
-  }
-
- private:
-  Callback* callback_;
-  CursorState state_;
-  DesktopVector position_;
-  DesktopVector hotspot_;
-  bool changed_;
-};
-
-void VerifyFrame(const DesktopFrame& frame,
-                 MouseCursorMonitor::CursorState state,
-                 const DesktopVector& pos) {
-  // Verify that all other pixels are set to their original values.
-  DesktopRect image_rect =
-      DesktopRect::MakeWH(kTestCursorSize, kTestCursorSize);
-  image_rect.Translate(pos);
-
-  for (int y = 0; y < kScreenHeight; ++y) {
-    for (int x = 0; x < kScreenWidth; ++x) {
-      DesktopVector p(x, y);
-      if (state == MouseCursorMonitor::INSIDE && image_rect.Contains(p)) {
-        EXPECT_EQ(BlendPixels(GetFakeFramePixelValue(p),
-                              kTestCursorData[y - pos.y()][x - pos.x()]),
-                  GetFramePixel(frame, p));
-      } else {
-        EXPECT_EQ(GetFakeFramePixelValue(p), GetFramePixel(frame, p));
-      }
-    }
-  }
-}
-
-}  // namespace
-
-template <bool use_desktop_relative_cursor_position>
-class DesktopAndCursorComposerTest : public testing::Test,
-                                     public DesktopCapturer::Callback {
- public:
-  DesktopAndCursorComposerTest()
-      : fake_screen_(new FakeScreenCapturer()),
-        fake_cursor_(new FakeMouseMonitor()),
-        blender_(fake_screen_,
-                 fake_cursor_,
-                 use_desktop_relative_cursor_position) {
-    blender_.Start(this);
-  }
-
-  // DesktopCapturer::Callback interface
-  void OnCaptureResult(DesktopCapturer::Result result,
-                       std::unique_ptr<DesktopFrame> frame) override {
-    frame_ = std::move(frame);
-  }
-
- protected:
-  // Owned by |blender_|.
-  FakeScreenCapturer* fake_screen_;
-  FakeMouseMonitor* fake_cursor_;
-
-  DesktopAndCursorComposer blender_;
-  std::unique_ptr<DesktopFrame> frame_;
-};
-
-using DesktopAndCursorComposerWithRelativePositionTest =
-    DesktopAndCursorComposerTest<false>;
-
-// Verify DesktopAndCursorComposer can handle the case when the screen capturer
-// fails.
-TEST_F(DesktopAndCursorComposerWithRelativePositionTest, Error) {
-  fake_cursor_->SetHotspot(DesktopVector());
-  fake_cursor_->SetState(MouseCursorMonitor::INSIDE, DesktopVector());
-  fake_screen_->SetNextFrame(nullptr);
-
-  blender_.CaptureFrame();
-
-  EXPECT_FALSE(frame_);
-}
-
-TEST_F(DesktopAndCursorComposerWithRelativePositionTest, Blend) {
-  struct {
-    int x, y;
-    int hotspot_x, hotspot_y;
-    bool inside;
-  } tests[] = {
-    {0, 0, 0, 0, true},
-    {50, 50, 0, 0, true},
-    {100, 50, 0, 0, true},
-    {50, 100, 0, 0, true},
-    {100, 100, 0, 0, true},
-    {0, 0, 2, 5, true},
-    {1, 1, 2, 5, true},
-    {50, 50, 2, 5, true},
-    {100, 100, 2, 5, true},
-    {0, 0, 5, 2, true},
-    {50, 50, 5, 2, true},
-    {100, 100, 5, 2, true},
-    {0, 0, 0, 0, false},
-  };
-
-  for (size_t i = 0; i < arraysize(tests); i++) {
-    SCOPED_TRACE(i);
-
-    DesktopVector hotspot(tests[i].hotspot_x, tests[i].hotspot_y);
-    fake_cursor_->SetHotspot(hotspot);
-
-    MouseCursorMonitor::CursorState state = tests[i].inside
-                                                ? MouseCursorMonitor::INSIDE
-                                                : MouseCursorMonitor::OUTSIDE;
-    DesktopVector pos(tests[i].x, tests[i].y);
-    fake_cursor_->SetState(state, pos);
-
-    std::unique_ptr<SharedDesktopFrame> frame(
-        SharedDesktopFrame::Wrap(CreateTestFrame()));
-    fake_screen_->SetNextFrame(frame->Share());
-
-    blender_.CaptureFrame();
-
-    VerifyFrame(*frame_, state, pos);
-
-    // Verify that the cursor is erased before the frame buffer is returned to
-    // the screen capturer.
-    frame_.reset();
-    VerifyFrame(*frame, MouseCursorMonitor::OUTSIDE, DesktopVector());
-  }
-}
-
-using DesktopAndCursorComposerWithAbsolutePositionTest =
-    DesktopAndCursorComposerTest<true>;
-
-TEST_F(DesktopAndCursorComposerWithAbsolutePositionTest,
-       CursorShouldBeIgnoredIfItIsOutOfDesktopFrame) {
-  std::unique_ptr<SharedDesktopFrame> frame(
-      SharedDesktopFrame::Wrap(CreateTestFrame()));
-  frame->set_top_left(DesktopVector(100, 200));
-  // The frame covers (100, 200) - (200, 300).
-
-  struct {
-    int x;
-    int y;
-  } tests[] = {
-    { 0, 0 },
-    { 50, 50 },
-    { 50, 150 },
-    { 100, 150 },
-    { 50, 200 },
-    { 99, 200 },
-    { 100, 199 },
-    { 200, 300 },
-    { 200, 299 },
-    { 199, 300 },
-    { -1, -1 },
-    { -10000, -10000 },
-    { 10000, 10000 },
-  };
-  for (size_t i = 0; i < arraysize(tests); i++) {
-    SCOPED_TRACE(i);
-
-    fake_screen_->SetNextFrame(frame->Share());
-    // The CursorState is ignored when using absolute cursor position.
-    fake_cursor_->SetState(MouseCursorMonitor::OUTSIDE,
-                           DesktopVector(tests[i].x, tests[i].y));
-    blender_.CaptureFrame();
-    VerifyFrame(*frame_, MouseCursorMonitor::OUTSIDE, DesktopVector(0, 0));
-  }
-}
-
-TEST_F(DesktopAndCursorComposerWithAbsolutePositionTest,
-       IsOccludedShouldBeConsidered) {
-  std::unique_ptr<SharedDesktopFrame> frame(
-      SharedDesktopFrame::Wrap(CreateTestFrame()));
-  frame->set_top_left(DesktopVector(100, 200));
-  // The frame covers (100, 200) - (200, 300).
-
-  struct {
-    int x;
-    int y;
-  } tests[] = {
-    { 100, 200 },
-    { 101, 200 },
-    { 100, 201 },
-    { 101, 201 },
-    { 150, 250 },
-    { 199, 299 },
-  };
-  fake_screen_->set_is_occluded(true);
-  for (size_t i = 0; i < arraysize(tests); i++) {
-    SCOPED_TRACE(i);
-
-    fake_screen_->SetNextFrame(frame->Share());
-    // The CursorState is ignored when using absolute cursor position.
-    fake_cursor_->SetState(MouseCursorMonitor::OUTSIDE,
-                           DesktopVector(tests[i].x, tests[i].y));
-    blender_.CaptureFrame();
-    VerifyFrame(*frame_, MouseCursorMonitor::OUTSIDE, DesktopVector());
-  }
-}
-
-TEST_F(DesktopAndCursorComposerWithAbsolutePositionTest, CursorIncluded) {
-  std::unique_ptr<SharedDesktopFrame> frame(
-      SharedDesktopFrame::Wrap(CreateTestFrame()));
-  frame->set_top_left(DesktopVector(100, 200));
-  // The frame covers (100, 200) - (200, 300).
-
-  struct {
-    int x;
-    int y;
-  } tests[] = {
-    { 100, 200 },
-    { 101, 200 },
-    { 100, 201 },
-    { 101, 201 },
-    { 150, 250 },
-    { 199, 299 },
-  };
-  for (size_t i = 0; i < arraysize(tests); i++) {
-    SCOPED_TRACE(i);
-
-    const DesktopVector abs_pos(tests[i].x, tests[i].y);
-    const DesktopVector rel_pos(abs_pos.subtract(frame->top_left()));
-
-    fake_screen_->SetNextFrame(frame->Share());
-    // The CursorState is ignored when using absolute cursor position.
-    fake_cursor_->SetState(MouseCursorMonitor::OUTSIDE, abs_pos);
-    blender_.CaptureFrame();
-    VerifyFrame(*frame_, MouseCursorMonitor::INSIDE, rel_pos);
-
-    // Verify that the cursor is erased before the frame buffer is returned to
-    // the screen capturer.
-    frame_.reset();
-    VerifyFrame(*frame, MouseCursorMonitor::OUTSIDE, DesktopVector());
-  }
-}
-
-}  // namespace webrtc
diff --git a/modules/desktop_capture/desktop_capture_options.cc b/modules/desktop_capture/desktop_capture_options.cc
deleted file mode 100644
index 88986d4..0000000
--- a/modules/desktop_capture/desktop_capture_options.cc
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- *  Copyright (c) 2013 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/desktop_capture/desktop_capture_options.h"
-
-namespace webrtc {
-
-DesktopCaptureOptions::DesktopCaptureOptions() {}
-DesktopCaptureOptions::DesktopCaptureOptions(
-    const DesktopCaptureOptions& options) = default;
-DesktopCaptureOptions::DesktopCaptureOptions(DesktopCaptureOptions&& options) =
-    default;
-DesktopCaptureOptions::~DesktopCaptureOptions() {}
-
-DesktopCaptureOptions& DesktopCaptureOptions::operator=(
-    const DesktopCaptureOptions& options) = default;
-DesktopCaptureOptions& DesktopCaptureOptions::operator=(
-    DesktopCaptureOptions&& options) = default;
-
-// static
-DesktopCaptureOptions DesktopCaptureOptions::CreateDefault() {
-  DesktopCaptureOptions result;
-#if defined(USE_X11)
-  result.set_x_display(SharedXDisplay::CreateDefault());
-#endif
-#if defined(WEBRTC_MAC) && !defined(WEBRTC_IOS)
-  result.set_configuration_monitor(new DesktopConfigurationMonitor());
-  result.set_full_screen_chrome_window_detector(
-      new FullScreenChromeWindowDetector());
-#endif
-  return result;
-}
-
-}  // namespace webrtc
diff --git a/modules/desktop_capture/desktop_capture_options.h b/modules/desktop_capture/desktop_capture_options.h
deleted file mode 100644
index 8956275..0000000
--- a/modules/desktop_capture/desktop_capture_options.h
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- *  Copyright (c) 2013 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_DESKTOP_CAPTURE_DESKTOP_CAPTURE_OPTIONS_H_
-#define WEBRTC_MODULES_DESKTOP_CAPTURE_DESKTOP_CAPTURE_OPTIONS_H_
-
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/scoped_ref_ptr.h"
-
-#if defined(USE_X11)
-#include "webrtc/modules/desktop_capture/x11/shared_x_display.h"
-#endif
-
-#if defined(WEBRTC_MAC) && !defined(WEBRTC_IOS)
-#include "webrtc/modules/desktop_capture/mac/desktop_configuration_monitor.h"
-#include "webrtc/modules/desktop_capture/mac/full_screen_chrome_window_detector.h"
-#endif
-
-namespace webrtc {
-
-// An object that stores initialization parameters for screen and window
-// capturers.
-class DesktopCaptureOptions {
- public:
-  // Returns instance of DesktopCaptureOptions with default parameters. On Linux
-  // also initializes X window connection. x_display() will be set to null if
-  // X11 connection failed (e.g. DISPLAY isn't set).
-  static DesktopCaptureOptions CreateDefault();
-
-  DesktopCaptureOptions();
-  DesktopCaptureOptions(const DesktopCaptureOptions& options);
-  DesktopCaptureOptions(DesktopCaptureOptions&& options);
-  ~DesktopCaptureOptions();
-
-  DesktopCaptureOptions& operator=(const DesktopCaptureOptions& options);
-  DesktopCaptureOptions& operator=(DesktopCaptureOptions&& options);
-
-#if defined(USE_X11)
-  SharedXDisplay* x_display() const { return x_display_; }
-  void set_x_display(rtc::scoped_refptr<SharedXDisplay> x_display) {
-    x_display_ = x_display;
-  }
-#endif
-
-#if defined(WEBRTC_MAC) && !defined(WEBRTC_IOS)
-  // TODO(zijiehe): Remove both DesktopConfigurationMonitor and
-  // FullScreenChromeWindowDetector out of DesktopCaptureOptions. It's not
-  // reasonable for external consumers to set these two parameters.
-  DesktopConfigurationMonitor* configuration_monitor() const {
-    return configuration_monitor_;
-  }
-  // If nullptr is set, ScreenCapturer won't work and WindowCapturer may return
-  // inaccurate result from IsOccluded() function.
-  void set_configuration_monitor(
-      rtc::scoped_refptr<DesktopConfigurationMonitor> m) {
-    configuration_monitor_ = m;
-  }
-
-  // TODO(zijiehe): Instead of FullScreenChromeWindowDetector, provide a
-  // FullScreenWindowDetector for external consumers to detect the target
-  // fullscreen window.
-  FullScreenChromeWindowDetector* full_screen_chrome_window_detector() const {
-    return full_screen_window_detector_;
-  }
-  void set_full_screen_chrome_window_detector(
-      rtc::scoped_refptr<FullScreenChromeWindowDetector> detector) {
-    full_screen_window_detector_ = detector;
-  }
-#endif
-
-  // Flag indicating that the capturer should use screen change notifications.
-  // Enables/disables use of XDAMAGE in the X11 capturer.
-  bool use_update_notifications() const { return use_update_notifications_; }
-  void set_use_update_notifications(bool use_update_notifications) {
-    use_update_notifications_ = use_update_notifications;
-  }
-
-  // Flag indicating if desktop effects (e.g. Aero) should be disabled when the
-  // capturer is active. Currently used only on Windows.
-  bool disable_effects() const { return disable_effects_; }
-  void set_disable_effects(bool disable_effects) {
-    disable_effects_ = disable_effects;
-  }
-
-  // Flag that should be set if the consumer uses updated_region() and the
-  // capturer should try to provide correct updated_region() for the frames it
-  // generates (e.g. by comparing each frame with the previous one).
-  bool detect_updated_region() const { return detect_updated_region_; }
-  void set_detect_updated_region(bool detect_updated_region) {
-    detect_updated_region_ = detect_updated_region;
-  }
-
-#if defined(WEBRTC_WIN)
-  bool allow_use_magnification_api() const {
-    return allow_use_magnification_api_;
-  }
-  void set_allow_use_magnification_api(bool allow) {
-    allow_use_magnification_api_ = allow;
-  }
-  // Allowing directx based capturer or not, this capturer works on windows 7
-  // with platform update / windows 8 or upper.
-  bool allow_directx_capturer() const {
-    return allow_directx_capturer_;
-  }
-  void set_allow_directx_capturer(bool enabled) {
-    allow_directx_capturer_ = enabled;
-  }
-#endif
-
- private:
-#if defined(USE_X11)
-  rtc::scoped_refptr<SharedXDisplay> x_display_;
-#endif
-
-#if defined(WEBRTC_MAC) && !defined(WEBRTC_IOS)
-  rtc::scoped_refptr<DesktopConfigurationMonitor> configuration_monitor_;
-  rtc::scoped_refptr<FullScreenChromeWindowDetector>
-      full_screen_window_detector_;
-#endif
-
-#if defined(WEBRTC_WIN)
-  bool allow_use_magnification_api_ = false;
-  bool allow_directx_capturer_ = false;
-#endif
-#if defined(USE_X11)
-  bool use_update_notifications_ = false;
-#else
-  bool use_update_notifications_ = true;
-#endif
-  bool disable_effects_ = true;
-  bool detect_updated_region_ = false;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_DESKTOP_CAPTURE_DESKTOP_CAPTURE_OPTIONS_H_
diff --git a/modules/desktop_capture/desktop_capture_types.h b/modules/desktop_capture/desktop_capture_types.h
deleted file mode 100644
index 46346b0..0000000
--- a/modules/desktop_capture/desktop_capture_types.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- *  Copyright (c) 2013 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_DESKTOP_CAPTURE_DESKTOP_CAPTURE_TYPES_H_
-#define WEBRTC_MODULES_DESKTOP_CAPTURE_DESKTOP_CAPTURE_TYPES_H_
-
-#include <stdint.h>
-
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-// Type used to identify windows on the desktop. Values are platform-specific:
-//   - On Windows: HWND cast to intptr_t.
-//   - On Linux (with X11): X11 Window (unsigned long) type cast to intptr_t.
-//   - On OSX: integer window number.
-typedef intptr_t WindowId;
-
-const WindowId kNullWindowId = 0;
-
-// Type used to identify screens on the desktop. Values are platform-specific:
-//   - On Windows: integer display device index.
-//   - On OSX: CGDirectDisplayID cast to intptr_t.
-//   - On Linux (with X11): TBD.
-// On Windows, ScreenId is implementation dependent: sending a ScreenId from one
-// implementation to another usually won't work correctly.
-typedef intptr_t ScreenId;
-
-// The screen id corresponds to all screen combined together.
-const ScreenId kFullDesktopScreenId = -1;
-
-const ScreenId kInvalidScreenId = -2;
-
-// An integer to attach to each DesktopFrame to differentiate the generator of
-// the frame.
-namespace DesktopCapturerId {
-  constexpr uint32_t CreateFourCC(char a, char b, char c, char d) {
-    return ((static_cast<uint32_t>(a)) |
-            (static_cast<uint32_t>(b) << 8) |
-            (static_cast<uint32_t>(c) << 16) |
-            (static_cast<uint32_t>(d) << 24));
-  }
-
-  constexpr uint32_t kUnknown = 0;
-  constexpr uint32_t kScreenCapturerWinGdi = CreateFourCC('G', 'D', 'I', ' ');
-  constexpr uint32_t kScreenCapturerWinDirectx =
-      CreateFourCC('D', 'X', 'G', 'I');
-}  // namespace DesktopCapturerId
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_DESKTOP_CAPTURE_DESKTOP_CAPTURE_TYPES_H_
diff --git a/modules/desktop_capture/desktop_capturer.cc b/modules/desktop_capture/desktop_capturer.cc
deleted file mode 100644
index 67d3520..0000000
--- a/modules/desktop_capture/desktop_capturer.cc
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- *  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/desktop_capture/desktop_capturer.h"
-
-#include "webrtc/modules/desktop_capture/desktop_capture_options.h"
-#include "webrtc/modules/desktop_capture/desktop_capturer_differ_wrapper.h"
-
-namespace webrtc {
-
-DesktopCapturer::~DesktopCapturer() = default;
-
-void DesktopCapturer::SetSharedMemoryFactory(
-    std::unique_ptr<SharedMemoryFactory> shared_memory_factory) {}
-
-void DesktopCapturer::SetExcludedWindow(WindowId window) {}
-
-bool DesktopCapturer::GetSourceList(SourceList* sources) {
-  return true;
-}
-
-bool DesktopCapturer::SelectSource(SourceId id) {
-  return false;
-}
-
-bool DesktopCapturer::FocusOnSelectedSource() {
-  return false;
-}
-
-bool DesktopCapturer::IsOccluded(const DesktopVector& pos) {
-  return false;
-}
-
-// static
-std::unique_ptr<DesktopCapturer> DesktopCapturer::CreateWindowCapturer(
-    const DesktopCaptureOptions& options) {
-  std::unique_ptr<DesktopCapturer> capturer = CreateRawWindowCapturer(options);
-  if (capturer && options.detect_updated_region()) {
-    capturer.reset(new DesktopCapturerDifferWrapper(std::move(capturer)));
-  }
-
-  return capturer;
-}
-
-// static
-std::unique_ptr<DesktopCapturer> DesktopCapturer::CreateScreenCapturer(
-    const DesktopCaptureOptions& options) {
-  std::unique_ptr<DesktopCapturer> capturer = CreateRawScreenCapturer(options);
-  if (capturer && options.detect_updated_region()) {
-    capturer.reset(new DesktopCapturerDifferWrapper(std::move(capturer)));
-  }
-
-  return capturer;
-}
-
-}  // namespace webrtc
diff --git a/modules/desktop_capture/desktop_capturer.h b/modules/desktop_capture/desktop_capturer.h
deleted file mode 100644
index 4f44ce1..0000000
--- a/modules/desktop_capture/desktop_capturer.h
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
- *  Copyright (c) 2013 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_DESKTOP_CAPTURE_DESKTOP_CAPTURER_H_
-#define WEBRTC_MODULES_DESKTOP_CAPTURE_DESKTOP_CAPTURER_H_
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include <memory>
-#include <string>
-#include <type_traits>
-#include <vector>
-
-#include "webrtc/modules/desktop_capture/desktop_frame.h"
-#include "webrtc/modules/desktop_capture/desktop_capture_types.h"
-#include "webrtc/modules/desktop_capture/shared_memory.h"
-
-namespace webrtc {
-
-class DesktopCaptureOptions;
-class DesktopFrame;
-
-// Abstract interface for screen and window capturers.
-class DesktopCapturer {
- public:
-  enum class Result {
-    // The frame was captured successfully.
-    SUCCESS,
-
-    // There was a temporary error. The caller should continue calling
-    // CaptureFrame(), in the expectation that it will eventually recover.
-    ERROR_TEMPORARY,
-
-    // Capture has failed and will keep failing if the caller tries calling
-    // CaptureFrame() again.
-    ERROR_PERMANENT,
-
-    MAX_VALUE = ERROR_PERMANENT
-  };
-
-  // Interface that must be implemented by the DesktopCapturer consumers.
-  class Callback {
-   public:
-    // Called after a frame has been captured. |frame| is not nullptr if and
-    // only if |result| is SUCCESS.
-    virtual void OnCaptureResult(Result result,
-                                 std::unique_ptr<DesktopFrame> frame) = 0;
-
-   protected:
-    virtual ~Callback() {}
-  };
-
-  typedef intptr_t SourceId;
-
-  static_assert(std::is_same<SourceId, ScreenId>::value,
-                "SourceId should be a same type as ScreenId.");
-
-  struct Source {
-    // The unique id to represent a Source of current DesktopCapturer.
-    SourceId id;
-
-    // Title of the window or screen in UTF-8 encoding, maybe empty. This field
-    // should not be used to identify a source.
-    std::string title;
-  };
-
-  typedef std::vector<Source> SourceList;
-
-  virtual ~DesktopCapturer();
-
-  // Called at the beginning of a capturing session. |callback| must remain
-  // valid until capturer is destroyed.
-  virtual void Start(Callback* callback) = 0;
-
-  // Sets SharedMemoryFactory that will be used to create buffers for the
-  // captured frames. The factory can be invoked on a thread other than the one
-  // where CaptureFrame() is called. It will be destroyed on the same thread.
-  // Shared memory is currently supported only by some DesktopCapturer
-  // implementations.
-  virtual void SetSharedMemoryFactory(
-      std::unique_ptr<SharedMemoryFactory> shared_memory_factory);
-
-  // Captures next frame, and involve callback provided by Start() function.
-  // Pending capture requests are canceled when DesktopCapturer is deleted.
-  virtual void CaptureFrame() = 0;
-
-  // Sets the window to be excluded from the captured image in the future
-  // Capture calls. Used to exclude the screenshare notification window for
-  // screen capturing.
-  virtual void SetExcludedWindow(WindowId window);
-
-  // TODO(zijiehe): Following functions should be pure virtual. The default
-  // implementations are for backward compatibility only. Remove default
-  // implementations once all DesktopCapturer implementations in Chromium have
-  // implemented these functions.
-
-  // Gets a list of sources current capturer supports. Returns false in case of
-  // a failure.
-  // For DesktopCapturer implementations to capture screens, this function
-  // should return monitors.
-  // For DesktopCapturer implementations to capture windows, this function
-  // should only return root windows owned by applications.
-  virtual bool GetSourceList(SourceList* sources);
-
-  // Selects a source to be captured. Returns false in case of a failure (e.g.
-  // if there is no source with the specified type and id.)
-  virtual bool SelectSource(SourceId id);
-
-  // Brings the selected source to the front and sets the input focus on it.
-  // Returns false in case of a failure or no source has been selected or the
-  // implementation does not support this functionality.
-  virtual bool FocusOnSelectedSource();
-
-  // Returns true if the |pos| on the selected source is covered by other
-  // elements on the display, and is not visible to the users.
-  // |pos| is in full desktop coordinates, i.e. the top-left monitor always
-  // starts from (0, 0).
-  // The return value if |pos| is out of the scope of the source is undefined.
-  virtual bool IsOccluded(const DesktopVector& pos);
-
-  // Creates a DesktopCapturer instance which targets to capture windows.
-  static std::unique_ptr<DesktopCapturer> CreateWindowCapturer(
-      const DesktopCaptureOptions& options);
-
-  // Creates a DesktopCapturer instance which targets to capture screens.
-  static std::unique_ptr<DesktopCapturer> CreateScreenCapturer(
-      const DesktopCaptureOptions& options);
-
- protected:
-  // CroppingWindowCapturer needs to create raw capturers without wrappers, so
-  // the following two functions are protected.
-
-  // Creates a platform specific DesktopCapturer instance which targets to
-  // capture windows.
-  static std::unique_ptr<DesktopCapturer> CreateRawWindowCapturer(
-      const DesktopCaptureOptions& options);
-
-  // Creates a platform specific DesktopCapturer instance which targets to
-  // capture screens.
-  static std::unique_ptr<DesktopCapturer> CreateRawScreenCapturer(
-      const DesktopCaptureOptions& options);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_DESKTOP_CAPTURE_DESKTOP_CAPTURER_H_
-
diff --git a/modules/desktop_capture/desktop_capturer_differ_wrapper.cc b/modules/desktop_capture/desktop_capturer_differ_wrapper.cc
deleted file mode 100644
index 3bf4c53..0000000
--- a/modules/desktop_capture/desktop_capturer_differ_wrapper.cc
+++ /dev/null
@@ -1,225 +0,0 @@
-/*
- *  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/desktop_capture/desktop_capturer_differ_wrapper.h"
-
-#include <string.h>
-
-#include <algorithm>
-#include <utility>
-
-#include "webrtc/modules/desktop_capture/desktop_geometry.h"
-#include "webrtc/modules/desktop_capture/differ_block.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/timeutils.h"
-
-namespace webrtc {
-
-namespace {
-
-// Returns true if (0, 0) - (|width|, |height|) vector in |old_buffer| and
-// |new_buffer| are equal. |width| should be less than 32
-// (defined by kBlockSize), otherwise BlockDifference() should be used.
-bool PartialBlockDifference(const uint8_t* old_buffer,
-                            const uint8_t* new_buffer,
-                            int width,
-                            int height,
-                            int stride) {
-  RTC_DCHECK_LT(width, kBlockSize);
-  const int width_bytes = width * DesktopFrame::kBytesPerPixel;
-  for (int i = 0; i < height; i++) {
-    if (memcmp(old_buffer, new_buffer, width_bytes) != 0) {
-      return true;
-    }
-    old_buffer += stride;
-    new_buffer += stride;
-  }
-  return false;
-}
-
-// Compares columns in the range of [|left|, |right|), in a row in the
-// range of [|top|, |top| + |height|), starts from |old_buffer| and
-// |new_buffer|, and outputs updated regions into |output|. |stride| is the
-// DesktopFrame::stride().
-void CompareRow(const uint8_t* old_buffer,
-                const uint8_t* new_buffer,
-                const int left,
-                const int right,
-                const int top,
-                const int bottom,
-                const int stride,
-                DesktopRegion* const output) {
-  const int block_x_offset = kBlockSize * DesktopFrame::kBytesPerPixel;
-  const int width = right - left;
-  const int height = bottom - top;
-  const int block_count = (width - 1) / kBlockSize;
-  const int last_block_width = width - block_count * kBlockSize;
-  RTC_DCHECK_GT(last_block_width, 0);
-  RTC_DCHECK_LE(last_block_width, kBlockSize);
-
-  // The first block-column in a continuous dirty area in current block-row.
-  int first_dirty_x_block = -1;
-
-  // We always need to add dirty area into |output| in the last block, so handle
-  // it separatedly.
-  for (int x = 0; x < block_count; x++) {
-    if (BlockDifference(old_buffer, new_buffer, height, stride)) {
-      if (first_dirty_x_block == -1) {
-        // This is the first dirty block in a continuous dirty area.
-        first_dirty_x_block = x;
-      }
-    } else if (first_dirty_x_block != -1) {
-      // The block on the left is the last dirty block in a continuous
-      // dirty area.
-      output->AddRect(
-          DesktopRect::MakeLTRB(first_dirty_x_block * kBlockSize + left, top,
-                                x * kBlockSize + left, bottom));
-      first_dirty_x_block = -1;
-    }
-    old_buffer += block_x_offset;
-    new_buffer += block_x_offset;
-  }
-
-  bool last_block_diff;
-  if (last_block_width < kBlockSize) {
-    // The last one is a partial vector.
-    last_block_diff = PartialBlockDifference(old_buffer, new_buffer,
-                                             last_block_width, height, stride);
-  } else {
-    last_block_diff = BlockDifference(old_buffer, new_buffer, height, stride);
-  }
-  if (last_block_diff) {
-    if (first_dirty_x_block == -1) {
-      first_dirty_x_block = block_count;
-    }
-    output->AddRect(DesktopRect::MakeLTRB(
-        first_dirty_x_block * kBlockSize + left, top, right, bottom));
-  } else if (first_dirty_x_block != -1) {
-    output->AddRect(
-        DesktopRect::MakeLTRB(first_dirty_x_block * kBlockSize + left, top,
-                              block_count * kBlockSize + left, bottom));
-  }
-}
-
-// Compares |rect| area in |old_frame| and |new_frame|, and outputs dirty
-// regions into |output|.
-void CompareFrames(const DesktopFrame& old_frame,
-                   const DesktopFrame& new_frame,
-                   DesktopRect rect,
-                   DesktopRegion* const output) {
-  RTC_DCHECK(old_frame.size().equals(new_frame.size()));
-  RTC_DCHECK_EQ(old_frame.stride(), new_frame.stride());
-  rect.IntersectWith(DesktopRect::MakeSize(old_frame.size()));
-
-  const int y_block_count = (rect.height() - 1) / kBlockSize;
-  const int last_y_block_height = rect.height() - y_block_count * kBlockSize;
-  // Offset from the start of one block-row to the next.
-  const int block_y_stride = old_frame.stride() * kBlockSize;
-  const uint8_t* prev_block_row_start =
-      old_frame.GetFrameDataAtPos(rect.top_left());
-  const uint8_t* curr_block_row_start =
-      new_frame.GetFrameDataAtPos(rect.top_left());
-
-  int top = rect.top();
-  // The last row may have a different height, so we handle it separately.
-  for (int y = 0; y < y_block_count; y++) {
-    CompareRow(prev_block_row_start, curr_block_row_start, rect.left(),
-               rect.right(), top, top + kBlockSize, old_frame.stride(), output);
-    top += kBlockSize;
-    prev_block_row_start += block_y_stride;
-    curr_block_row_start += block_y_stride;
-  }
-  CompareRow(prev_block_row_start, curr_block_row_start, rect.left(),
-             rect.right(), top, top + last_y_block_height, old_frame.stride(),
-             output);
-}
-
-}  // namespace
-
-DesktopCapturerDifferWrapper::DesktopCapturerDifferWrapper(
-    std::unique_ptr<DesktopCapturer> base_capturer)
-    : base_capturer_(std::move(base_capturer)) {
-  RTC_DCHECK(base_capturer_);
-}
-
-DesktopCapturerDifferWrapper::~DesktopCapturerDifferWrapper() {}
-
-void DesktopCapturerDifferWrapper::Start(DesktopCapturer::Callback* callback) {
-  callback_ = callback;
-  base_capturer_->Start(this);
-}
-
-void DesktopCapturerDifferWrapper::SetSharedMemoryFactory(
-    std::unique_ptr<SharedMemoryFactory> shared_memory_factory) {
-  base_capturer_->SetSharedMemoryFactory(std::move(shared_memory_factory));
-}
-
-void DesktopCapturerDifferWrapper::CaptureFrame() {
-  base_capturer_->CaptureFrame();
-}
-
-void DesktopCapturerDifferWrapper::SetExcludedWindow(WindowId window) {
-  base_capturer_->SetExcludedWindow(window);
-}
-
-bool DesktopCapturerDifferWrapper::GetSourceList(SourceList* sources) {
-  return base_capturer_->GetSourceList(sources);
-}
-
-bool DesktopCapturerDifferWrapper::SelectSource(SourceId id) {
-  return base_capturer_->SelectSource(id);
-}
-
-bool DesktopCapturerDifferWrapper::FocusOnSelectedSource() {
-  return base_capturer_->FocusOnSelectedSource();
-}
-
-bool DesktopCapturerDifferWrapper::IsOccluded(const DesktopVector& pos) {
-  return base_capturer_->IsOccluded(pos);
-}
-
-void DesktopCapturerDifferWrapper::OnCaptureResult(
-    Result result,
-    std::unique_ptr<DesktopFrame> input_frame) {
-  int64_t start_time_nanos = rtc::TimeNanos();
-  if (!input_frame) {
-    callback_->OnCaptureResult(result, nullptr);
-    return;
-  }
-  RTC_DCHECK(result == Result::SUCCESS);
-
-  std::unique_ptr<SharedDesktopFrame> frame =
-      SharedDesktopFrame::Wrap(std::move(input_frame));
-  if (last_frame_ && (last_frame_->size().width() != frame->size().width() ||
-                      last_frame_->size().height() != frame->size().height() ||
-                      last_frame_->stride() != frame->stride())) {
-    last_frame_.reset();
-  }
-
-  if (last_frame_) {
-    DesktopRegion hints;
-    hints.Swap(frame->mutable_updated_region());
-    for (DesktopRegion::Iterator it(hints); !it.IsAtEnd(); it.Advance()) {
-      CompareFrames(*last_frame_, *frame, it.rect(),
-                    frame->mutable_updated_region());
-    }
-  } else {
-    frame->mutable_updated_region()->SetRect(
-        DesktopRect::MakeSize(frame->size()));
-  }
-  last_frame_ = frame->Share();
-
-  frame->set_capture_time_ms(frame->capture_time_ms() +
-                             (rtc::TimeNanos() - start_time_nanos) /
-                                 rtc::kNumNanosecsPerMillisec);
-  callback_->OnCaptureResult(result, std::move(frame));
-}
-
-}  // namespace webrtc
diff --git a/modules/desktop_capture/desktop_capturer_differ_wrapper.h b/modules/desktop_capture/desktop_capturer_differ_wrapper.h
deleted file mode 100644
index 1d037a1..0000000
--- a/modules/desktop_capture/desktop_capturer_differ_wrapper.h
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- *  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_DESKTOP_CAPTURE_DESKTOP_CAPTURER_DIFFER_WRAPPER_H_
-#define WEBRTC_MODULES_DESKTOP_CAPTURE_DESKTOP_CAPTURER_DIFFER_WRAPPER_H_
-
-#include <memory>
-
-#include "webrtc/modules/desktop_capture/desktop_capturer.h"
-#include "webrtc/modules/desktop_capture/shared_desktop_frame.h"
-
-namespace webrtc {
-
-// DesktopCapturer wrapper that calculates updated_region() by comparing frames
-// content. This class always expects the underlying DesktopCapturer
-// implementation returns a superset of updated regions in DestkopFrame. If a
-// DesktopCapturer implementation does not know the updated region, it should
-// set updated_region() to full frame.
-//
-// This class marks entire frame as updated if the frame size or frame stride
-// has been changed.
-class DesktopCapturerDifferWrapper : public DesktopCapturer,
-                                     public DesktopCapturer::Callback {
- public:
-  // Creates a DesktopCapturerDifferWrapper with a DesktopCapturer
-  // implementation, and takes its ownership.
-  explicit DesktopCapturerDifferWrapper(
-      std::unique_ptr<DesktopCapturer> base_capturer);
-
-  ~DesktopCapturerDifferWrapper() override;
-
-  // DesktopCapturer interface.
-  void Start(DesktopCapturer::Callback* callback) override;
-  void SetSharedMemoryFactory(
-      std::unique_ptr<SharedMemoryFactory> shared_memory_factory) override;
-  void CaptureFrame() override;
-  void SetExcludedWindow(WindowId window) override;
-  bool GetSourceList(SourceList* screens) override;
-  bool SelectSource(SourceId id) override;
-  bool FocusOnSelectedSource() override;
-  bool IsOccluded(const DesktopVector& pos) override;
-
- private:
-  // DesktopCapturer::Callback interface.
-  void OnCaptureResult(Result result,
-                       std::unique_ptr<DesktopFrame> frame) override;
-
-  const std::unique_ptr<DesktopCapturer> base_capturer_;
-  DesktopCapturer::Callback* callback_;
-  std::unique_ptr<SharedDesktopFrame> last_frame_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_DESKTOP_CAPTURE_DESKTOP_CAPTURER_DIFFER_WRAPPER_H_
diff --git a/modules/desktop_capture/desktop_capturer_differ_wrapper_unittest.cc b/modules/desktop_capture/desktop_capturer_differ_wrapper_unittest.cc
deleted file mode 100644
index fbd2477..0000000
--- a/modules/desktop_capture/desktop_capturer_differ_wrapper_unittest.cc
+++ /dev/null
@@ -1,291 +0,0 @@
-/*
- *  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/desktop_capture/desktop_capturer_differ_wrapper.h"
-
-#include <initializer_list>
-#include <memory>
-#include <utility>
-#include <vector>
-
-#include "webrtc/modules/desktop_capture/desktop_geometry.h"
-#include "webrtc/modules/desktop_capture/desktop_region.h"
-#include "webrtc/modules/desktop_capture/differ_block.h"
-#include "webrtc/modules/desktop_capture/fake_desktop_capturer.h"
-#include "webrtc/modules/desktop_capture/mock_desktop_capturer_callback.h"
-#include "webrtc/rtc_base/random.h"
-#include "webrtc/rtc_base/timeutils.h"
-#include "webrtc/system_wrappers/include/cpu_features_wrapper.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-namespace {
-
-// Compares and asserts |frame|.updated_region() equals to |rects|. This
-// function does not care about the order of the |rects| and it does not expect
-// DesktopRegion to return an exact area for each rectangle in |rects|.
-template <template <typename, typename...> class T = std::initializer_list,
-          typename... Rect>
-void AssertUpdatedRegionIs(const DesktopFrame& frame,
-                           const T<DesktopRect, Rect...>& rects) {
-  DesktopRegion region;
-  for (const auto& rect : rects) {
-    region.AddRect(rect);
-  }
-  ASSERT_TRUE(frame.updated_region().Equals(region));
-}
-
-// Compares and asserts |frame|.updated_region() covers all rectangles in
-// |rects|, but does not cover areas other than a kBlockSize expansion. This
-// function does not care about the order of the |rects|, and it does not expect
-// DesktopRegion to return an exact area of each rectangle in |rects|.
-template <template <typename, typename...> class T = std::initializer_list,
-          typename... Rect>
-void AssertUpdatedRegionCovers(const DesktopFrame& frame,
-                               const T<DesktopRect, Rect...>& rects) {
-  DesktopRegion region;
-  for (const auto& rect : rects) {
-    region.AddRect(rect);
-  }
-
-  // Intersect of |rects| and |frame|.updated_region() should be |rects|. i.e.
-  // |frame|.updated_region() should be a superset of |rects|.
-  DesktopRegion intersect(region);
-  intersect.IntersectWith(frame.updated_region());
-  ASSERT_TRUE(region.Equals(intersect));
-
-  // Difference between |rects| and |frame|.updated_region() should not cover
-  // areas which have larger than twice of kBlockSize width and height.
-  //
-  // Explanation of the 'twice' of kBlockSize (indeed kBlockSize * 2 - 2) is
-  // following,
-  // (Each block in the following grid is a 8 x 8 pixels area. X means the real
-  // updated area, m means the updated area marked by
-  // DesktopCapturerDifferWrapper.)
-  // +---+---+---+---+---+---+---+---+
-  // | X | m | m | m | m | m | m | m |
-  // +---+---+---+---+---+---+---+---+
-  // | m | m | m | m | m | m | m | m |
-  // +---+---+---+---+---+---+---+---+
-  // | m | m | m | m | m | m | m | m |
-  // +---+---+---+---+---+---+---+---+
-  // | m | m | m | m | m | m | m | X |
-  // +---+---+---+---+---+---+---+---+
-  // The top left [0, 0] - [8, 8] and right bottom [56, 24] - [64, 32] blocks of
-  // this area are updated. But since DesktopCapturerDifferWrapper compares
-  // 32 x 32 blocks by default, this entire area is marked as updated. So the
-  // [8, 8] - [56, 32] is expected to be covered in the difference.
-  //
-  // But if [0, 0] - [8, 8] and [64, 24] - [72, 32] blocks are updated,
-  // +---+---+---+---+---+---+---+---+---+---+---+---+
-  // | X | m | m | m |   |   |   |   | m | m | m | m |
-  // +---+---+---+---+---+---+---+---+---+---+---+---+
-  // | m | m | m | m |   |   |   |   | m | m | m | m |
-  // +---+---+---+---+---+---+---+---+---+---+---+---+
-  // | m | m | m | m |   |   |   |   | m | m | m | m |
-  // +---+---+---+---+---+---+---+---+---+---+---+---+
-  // | m | m | m | m |   |   |   |   | X | m | m | m |
-  // +---+---+---+---+---+---+---+---+---+---+---+---+
-  // the [8, 8] - [64, 32] is not expected to be covered in the difference. As
-  // DesktopCapturerDifferWrapper should only mark [0, 0] - [32, 32] and
-  // [64, 0] - [96, 32] as updated.
-  DesktopRegion differ(frame.updated_region());
-  differ.Subtract(region);
-  for (DesktopRegion::Iterator it(differ); !it.IsAtEnd(); it.Advance()) {
-    ASSERT_TRUE(it.rect().width() <= kBlockSize * 2 - 2 ||
-                it.rect().height() <= kBlockSize * 2 - 2);
-  }
-}
-
-// Executes a DesktopCapturerDifferWrapper::Capture() and compares its output
-// DesktopFrame::updated_region() with |updated_region| if |check_result| is
-// true. If |exactly_match| is true, AssertUpdatedRegionIs() will be used,
-// otherwise AssertUpdatedRegionCovers() will be used.
-template <template <typename, typename...> class T = std::initializer_list,
-          typename... Rect>
-void ExecuteDifferWrapperCase(BlackWhiteDesktopFramePainter* frame_painter,
-                              DesktopCapturerDifferWrapper* capturer,
-                              MockDesktopCapturerCallback* callback,
-                              const T<DesktopRect, Rect...>& updated_region,
-                              bool check_result,
-                              bool exactly_match) {
-  EXPECT_CALL(*callback,
-              OnCaptureResultPtr(DesktopCapturer::Result::SUCCESS, testing::_))
-      .Times(1)
-      .WillOnce(testing::Invoke([&updated_region, check_result, exactly_match](
-          DesktopCapturer::Result result,
-          std::unique_ptr<DesktopFrame>* frame) {
-        ASSERT_EQ(result, DesktopCapturer::Result::SUCCESS);
-        if (check_result) {
-          if (exactly_match) {
-            AssertUpdatedRegionIs(**frame, updated_region);
-          } else {
-            AssertUpdatedRegionCovers(**frame, updated_region);
-          }
-        }
-      }));
-  for (const auto& rect : updated_region) {
-    frame_painter->updated_region()->AddRect(rect);
-  }
-  capturer->CaptureFrame();
-}
-
-// Executes a DesktopCapturerDifferWrapper::Capture(), if updated_region() is
-// not set, this function will reset DesktopCapturerDifferWrapper internal
-// DesktopFrame into black.
-void ExecuteCapturer(DesktopCapturerDifferWrapper* capturer,
-                     MockDesktopCapturerCallback* callback) {
-  EXPECT_CALL(*callback,
-              OnCaptureResultPtr(DesktopCapturer::Result::SUCCESS, testing::_))
-      .Times(1);
-  capturer->CaptureFrame();
-}
-
-void ExecuteDifferWrapperTest(bool with_hints,
-                              bool enlarge_updated_region,
-                              bool random_updated_region,
-                              bool check_result) {
-  const bool updated_region_should_exactly_match =
-      with_hints && !enlarge_updated_region && !random_updated_region;
-  BlackWhiteDesktopFramePainter frame_painter;
-  PainterDesktopFrameGenerator frame_generator;
-  frame_generator.set_desktop_frame_painter(&frame_painter);
-  std::unique_ptr<FakeDesktopCapturer> fake(new FakeDesktopCapturer());
-  fake->set_frame_generator(&frame_generator);
-  DesktopCapturerDifferWrapper capturer(std::move(fake));
-  MockDesktopCapturerCallback callback;
-  frame_generator.set_provide_updated_region_hints(with_hints);
-  frame_generator.set_enlarge_updated_region(enlarge_updated_region);
-  frame_generator.set_add_random_updated_region(random_updated_region);
-
-  capturer.Start(&callback);
-
-  EXPECT_CALL(callback,
-              OnCaptureResultPtr(DesktopCapturer::Result::SUCCESS, testing::_))
-      .Times(1)
-      .WillOnce(testing::Invoke([](DesktopCapturer::Result result,
-                                   std::unique_ptr<DesktopFrame>* frame) {
-        ASSERT_EQ(result, DesktopCapturer::Result::SUCCESS);
-        AssertUpdatedRegionIs(**frame,
-                              {DesktopRect::MakeSize((*frame)->size())});
-      }));
-  capturer.CaptureFrame();
-
-  ExecuteDifferWrapperCase(&frame_painter, &capturer, &callback,
-                           {DesktopRect::MakeLTRB(100, 100, 200, 200),
-                            DesktopRect::MakeLTRB(300, 300, 400, 400)},
-                           check_result, updated_region_should_exactly_match);
-  ExecuteCapturer(&capturer, &callback);
-
-  ExecuteDifferWrapperCase(
-      &frame_painter, &capturer, &callback,
-      {DesktopRect::MakeLTRB(0, 0, 40, 40),
-       DesktopRect::MakeLTRB(0, frame_generator.size()->height() - 40, 40,
-                             frame_generator.size()->height()),
-       DesktopRect::MakeLTRB(frame_generator.size()->width() - 40, 0,
-                             frame_generator.size()->width(), 40),
-       DesktopRect::MakeLTRB(frame_generator.size()->width() - 40,
-                             frame_generator.size()->height() - 40,
-                             frame_generator.size()->width(),
-                             frame_generator.size()->height())},
-      check_result, updated_region_should_exactly_match);
-
-  Random random(rtc::TimeMillis());
-  // Fuzzing tests.
-  for (int i = 0; i < 1000; i++) {
-    if (enlarge_updated_region) {
-      frame_generator.set_enlarge_range(random.Rand(1, 50));
-    }
-    frame_generator.size()->set(random.Rand(500, 2000), random.Rand(500, 2000));
-    ExecuteCapturer(&capturer, &callback);
-    std::vector<DesktopRect> updated_region;
-    for (int j = random.Rand(50); j >= 0; j--) {
-      // At least a 1 x 1 updated region.
-      const int left = random.Rand(0, frame_generator.size()->width() - 2);
-      const int top = random.Rand(0, frame_generator.size()->height() - 2);
-      const int right = random.Rand(left + 1, frame_generator.size()->width());
-      const int bottom = random.Rand(top + 1, frame_generator.size()->height());
-      updated_region.push_back(DesktopRect::MakeLTRB(left, top, right, bottom));
-    }
-    ExecuteDifferWrapperCase(&frame_painter, &capturer, &callback,
-                             updated_region, check_result,
-                             updated_region_should_exactly_match);
-  }
-}
-
-}  // namespace
-
-TEST(DesktopCapturerDifferWrapperTest, CaptureWithoutHints) {
-  ExecuteDifferWrapperTest(false, false, false, true);
-}
-
-TEST(DesktopCapturerDifferWrapperTest, CaptureWithHints) {
-  ExecuteDifferWrapperTest(true, false, false, true);
-}
-
-TEST(DesktopCapturerDifferWrapperTest, CaptureWithEnlargedHints) {
-  ExecuteDifferWrapperTest(true, true, false, true);
-}
-
-TEST(DesktopCapturerDifferWrapperTest, CaptureWithRandomHints) {
-  ExecuteDifferWrapperTest(true, false, true, true);
-}
-
-TEST(DesktopCapturerDifferWrapperTest, CaptureWithEnlargedAndRandomHints) {
-  ExecuteDifferWrapperTest(true, true, true, true);
-}
-
-// When hints are provided, DesktopCapturerDifferWrapper has a slightly better
-// performance in current configuration, but not so significant. Following is
-// one run result.
-// [ RUN      ] DISABLED_CaptureWithoutHintsPerf
-// [       OK ] DISABLED_CaptureWithoutHintsPerf (7118 ms)
-// [ RUN      ] DISABLED_CaptureWithHintsPerf
-// [       OK ] DISABLED_CaptureWithHintsPerf (5580 ms)
-// [ RUN      ] DISABLED_CaptureWithEnlargedHintsPerf
-// [       OK ] DISABLED_CaptureWithEnlargedHintsPerf (5974 ms)
-// [ RUN      ] DISABLED_CaptureWithRandomHintsPerf
-// [       OK ] DISABLED_CaptureWithRandomHintsPerf (6184 ms)
-// [ RUN      ] DISABLED_CaptureWithEnlargedAndRandomHintsPerf
-// [       OK ] DISABLED_CaptureWithEnlargedAndRandomHintsPerf (6347 ms)
-TEST(DesktopCapturerDifferWrapperTest, DISABLED_CaptureWithoutHintsPerf) {
-  int64_t started = rtc::TimeMillis();
-  ExecuteDifferWrapperTest(false, false, false, false);
-  ASSERT_LE(rtc::TimeMillis() - started, 15000);
-}
-
-TEST(DesktopCapturerDifferWrapperTest, DISABLED_CaptureWithHintsPerf) {
-  int64_t started = rtc::TimeMillis();
-  ExecuteDifferWrapperTest(true, false, false, false);
-  ASSERT_LE(rtc::TimeMillis() - started, 15000);
-}
-
-TEST(DesktopCapturerDifferWrapperTest, DISABLED_CaptureWithEnlargedHintsPerf) {
-  int64_t started = rtc::TimeMillis();
-  ExecuteDifferWrapperTest(true, true, false, false);
-  ASSERT_LE(rtc::TimeMillis() - started, 15000);
-}
-
-TEST(DesktopCapturerDifferWrapperTest, DISABLED_CaptureWithRandomHintsPerf) {
-  int64_t started = rtc::TimeMillis();
-  ExecuteDifferWrapperTest(true, false, true, false);
-  ASSERT_LE(rtc::TimeMillis() - started, 15000);
-}
-
-TEST(DesktopCapturerDifferWrapperTest,
-     DISABLED_CaptureWithEnlargedAndRandomHintsPerf) {
-  int64_t started = rtc::TimeMillis();
-  ExecuteDifferWrapperTest(true, true, true, false);
-  ASSERT_LE(rtc::TimeMillis() - started, 15000);
-}
-
-}  // namespace webrtc
diff --git a/modules/desktop_capture/desktop_frame.cc b/modules/desktop_capture/desktop_frame.cc
deleted file mode 100644
index efedc03..0000000
--- a/modules/desktop_capture/desktop_frame.cc
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- *  Copyright (c) 2013 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/desktop_capture/desktop_frame.h"
-
-#include <utility>
-
-#include <string.h>
-
-#include "webrtc/modules/desktop_capture/desktop_geometry.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/ptr_util.h"
-
-namespace webrtc {
-
-DesktopFrame::DesktopFrame(DesktopSize size,
-                           int stride,
-                           uint8_t* data,
-                           SharedMemory* shared_memory)
-    : data_(data),
-      shared_memory_(shared_memory),
-      size_(size),
-      stride_(stride),
-      capture_time_ms_(0),
-      capturer_id_(DesktopCapturerId::kUnknown) {
-  RTC_DCHECK(size_.width() >= 0);
-  RTC_DCHECK(size_.height() >= 0);
-}
-
-DesktopFrame::~DesktopFrame() = default;
-
-void DesktopFrame::CopyPixelsFrom(const uint8_t* src_buffer, int src_stride,
-                                  const DesktopRect& dest_rect) {
-  RTC_CHECK(DesktopRect::MakeSize(size()).ContainsRect(dest_rect));
-
-  uint8_t* dest = GetFrameDataAtPos(dest_rect.top_left());
-  for (int y = 0; y < dest_rect.height(); ++y) {
-    memcpy(dest, src_buffer, DesktopFrame::kBytesPerPixel * dest_rect.width());
-    src_buffer += src_stride;
-    dest += stride();
-  }
-}
-
-void DesktopFrame::CopyPixelsFrom(const DesktopFrame& src_frame,
-                                  const DesktopVector& src_pos,
-                                  const DesktopRect& dest_rect) {
-  RTC_CHECK(DesktopRect::MakeSize(src_frame.size()).ContainsRect(
-      DesktopRect::MakeOriginSize(src_pos, dest_rect.size())));
-
-  CopyPixelsFrom(src_frame.GetFrameDataAtPos(src_pos),
-                 src_frame.stride(), dest_rect);
-}
-
-DesktopRect DesktopFrame::rect() const {
-  return DesktopRect::MakeOriginSize(top_left(), size());
-}
-
-uint8_t* DesktopFrame::GetFrameDataAtPos(const DesktopVector& pos) const {
-  return data() + stride() * pos.y() + DesktopFrame::kBytesPerPixel * pos.x();
-}
-
-void DesktopFrame::CopyFrameInfoFrom(const DesktopFrame& other) {
-  set_dpi(other.dpi());
-  set_capture_time_ms(other.capture_time_ms());
-  set_capturer_id(other.capturer_id());
-  *mutable_updated_region() = other.updated_region();
-  set_top_left(other.top_left());
-}
-
-void DesktopFrame::MoveFrameInfoFrom(DesktopFrame* other) {
-  set_dpi(other->dpi());
-  set_capture_time_ms(other->capture_time_ms());
-  set_capturer_id(other->capturer_id());
-  mutable_updated_region()->Swap(other->mutable_updated_region());
-  set_top_left(other->top_left());
-}
-
-BasicDesktopFrame::BasicDesktopFrame(DesktopSize size)
-    : DesktopFrame(size, kBytesPerPixel * size.width(),
-                   new uint8_t[kBytesPerPixel * size.width() * size.height()],
-                   nullptr) {}
-
-BasicDesktopFrame::~BasicDesktopFrame() {
-  delete[] data_;
-}
-
-// static
-DesktopFrame* BasicDesktopFrame::CopyOf(const DesktopFrame& frame) {
-  DesktopFrame* result = new BasicDesktopFrame(frame.size());
-  for (int y = 0; y < frame.size().height(); ++y) {
-    memcpy(result->data() + y * result->stride(),
-           frame.data() + y * frame.stride(),
-           frame.size().width() * kBytesPerPixel);
-  }
-  result->CopyFrameInfoFrom(frame);
-  return result;
-}
-
-// static
-std::unique_ptr<DesktopFrame> SharedMemoryDesktopFrame::Create(
-    DesktopSize size,
-    SharedMemoryFactory* shared_memory_factory) {
-  RTC_DCHECK(shared_memory_factory);
-
-  size_t buffer_size = size.height() * size.width() * kBytesPerPixel;
-  std::unique_ptr<SharedMemory> shared_memory =
-      shared_memory_factory->CreateSharedMemory(buffer_size);
-  if (!shared_memory)
-    return nullptr;
-
-  return rtc::MakeUnique<SharedMemoryDesktopFrame>(
-      size, size.width() * kBytesPerPixel, std::move(shared_memory));
-}
-
-SharedMemoryDesktopFrame::SharedMemoryDesktopFrame(DesktopSize size,
-                                                   int stride,
-                                                   SharedMemory* shared_memory)
-    : DesktopFrame(size,
-                   stride,
-                   reinterpret_cast<uint8_t*>(shared_memory->data()),
-                   shared_memory) {}
-
-SharedMemoryDesktopFrame::SharedMemoryDesktopFrame(
-    DesktopSize size,
-    int stride,
-    std::unique_ptr<SharedMemory> shared_memory)
-    : SharedMemoryDesktopFrame(size,
-                               stride,
-                               shared_memory.release()) {}
-
-SharedMemoryDesktopFrame::~SharedMemoryDesktopFrame() {
-  delete shared_memory_;
-}
-
-}  // namespace webrtc
diff --git a/modules/desktop_capture/desktop_frame.h b/modules/desktop_capture/desktop_frame.h
deleted file mode 100644
index 12f7a6d..0000000
--- a/modules/desktop_capture/desktop_frame.h
+++ /dev/null
@@ -1,188 +0,0 @@
-/*
- *  Copyright (c) 2013 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_DESKTOP_CAPTURE_DESKTOP_FRAME_H_
-#define WEBRTC_MODULES_DESKTOP_CAPTURE_DESKTOP_FRAME_H_
-
-#include <memory>
-
-#include "webrtc/modules/desktop_capture/desktop_capture_types.h"
-#include "webrtc/modules/desktop_capture/desktop_geometry.h"
-#include "webrtc/modules/desktop_capture/desktop_region.h"
-#include "webrtc/modules/desktop_capture/shared_memory.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-// DesktopFrame represents a video frame captured from the screen.
-class DesktopFrame {
- public:
-  // DesktopFrame objects always hold RGBA data.
-  static const int kBytesPerPixel = 4;
-
-  virtual ~DesktopFrame();
-
-  // Returns the rectangle in full desktop coordinates to indicate the area
-  // covered by the DesktopFrame.
-  DesktopRect rect() const;
-
-  // Size of the frame.
-  const DesktopSize& size() const { return size_; }
-
-  // The top-left of the frame in full desktop coordinates. E.g. the top left
-  // monitor should start from (0, 0).
-  const DesktopVector& top_left() const { return top_left_; }
-  void set_top_left(const DesktopVector& top_left) { top_left_ = top_left; }
-
-  // Distance in the buffer between two neighboring rows in bytes.
-  int stride() const { return stride_; }
-
-  // Data buffer used for the frame.
-  uint8_t* data() const { return data_; }
-
-  // SharedMemory used for the buffer or NULL if memory is allocated on the
-  // heap. The result is guaranteed to be deleted only after the frame is
-  // deleted (classes that inherit from DesktopFrame must ensure it).
-  SharedMemory* shared_memory() const { return shared_memory_; }
-
-  // Indicates region of the screen that has changed since the previous frame.
-  const DesktopRegion& updated_region() const { return updated_region_; }
-  DesktopRegion* mutable_updated_region() { return &updated_region_; }
-
-  // DPI of the screen being captured. May be set to zero, e.g. if DPI is
-  // unknown.
-  const DesktopVector& dpi() const { return dpi_; }
-  void set_dpi(const DesktopVector& dpi) { dpi_ = dpi; }
-
-  // Time taken to capture the frame in milliseconds.
-  int64_t capture_time_ms() const { return capture_time_ms_; }
-  void set_capture_time_ms(int64_t time_ms) { capture_time_ms_ = time_ms; }
-
-  // Copies pixels from a buffer or another frame. |dest_rect| rect must lay
-  // within bounds of this frame.
-  void CopyPixelsFrom(const uint8_t* src_buffer,
-                      int src_stride,
-                      const DesktopRect& dest_rect);
-  void CopyPixelsFrom(const DesktopFrame& src_frame,
-                      const DesktopVector& src_pos,
-                      const DesktopRect& dest_rect);
-
-  // A helper to return the data pointer of a frame at the specified position.
-  uint8_t* GetFrameDataAtPos(const DesktopVector& pos) const;
-
-  // The DesktopCapturer implementation which generates current DesktopFrame.
-  // Not all DesktopCapturer implementations set this field; it's set to
-  // kUnknown by default.
-  uint32_t capturer_id() const { return capturer_id_; }
-  void set_capturer_id(uint32_t capturer_id) {
-    capturer_id_ = capturer_id;
-  }
-
-  // Copies various information from |other|. Anything initialized in
-  // constructor are not copied.
-  // This function is usually used when sharing a source DesktopFrame with
-  // several clients: the original DesktopFrame should be kept unchanged. For
-  // example, BasicDesktopFrame::CopyOf() and SharedDesktopFrame::Share().
-  void CopyFrameInfoFrom(const DesktopFrame& other);
-
-  // Copies various information from |other|. Anything initialized in
-  // constructor are not copied. Not like CopyFrameInfoFrom() function, this
-  // function uses swap or move constructor to avoid data copy. It won't break
-  // the |other|, but some of its information may be missing after this
-  // operation. E.g. other->updated_region_;
-  // This function is usually used when wrapping a DesktopFrame: the wrapper
-  // instance takes the ownership of |other|, so other components cannot access
-  // |other| anymore. For example, CroppedDesktopFrame and
-  // DesktopFrameWithCursor.
-  void MoveFrameInfoFrom(DesktopFrame* other);
-
- protected:
-  DesktopFrame(DesktopSize size,
-               int stride,
-               uint8_t* data,
-               SharedMemory* shared_memory);
-
-  // Ownership of the buffers is defined by the classes that inherit from this
-  // class. They must guarantee that the buffer is not deleted before the frame
-  // is deleted.
-  uint8_t* const data_;
-  SharedMemory* const shared_memory_;
-
- private:
-  const DesktopSize size_;
-  const int stride_;
-
-  DesktopRegion updated_region_;
-  DesktopVector top_left_;
-  DesktopVector dpi_;
-  int64_t capture_time_ms_;
-  uint32_t capturer_id_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(DesktopFrame);
-};
-
-// A DesktopFrame that stores data in the heap.
-class BasicDesktopFrame : public DesktopFrame {
- public:
-  explicit BasicDesktopFrame(DesktopSize size);
-
-  ~BasicDesktopFrame() override;
-
-  // Creates a BasicDesktopFrame that contains copy of |frame|.
-  // TODO(zijiehe): Return std::unique_ptr<DesktopFrame>
-  static DesktopFrame* CopyOf(const DesktopFrame& frame);
-
- private:
-  RTC_DISALLOW_COPY_AND_ASSIGN(BasicDesktopFrame);
-};
-
-// A DesktopFrame that stores data in shared memory.
-class SharedMemoryDesktopFrame : public DesktopFrame {
- public:
-  // May return nullptr if |shared_memory_factory| failed to create a
-  // SharedMemory instance.
-  // |shared_memory_factory| should not be nullptr.
-  static std::unique_ptr<DesktopFrame> Create(
-      DesktopSize size,
-      SharedMemoryFactory* shared_memory_factory);
-
-  // Takes ownership of |shared_memory|.
-  // Deprecated, use the next constructor.
-  SharedMemoryDesktopFrame(DesktopSize size,
-                           int stride,
-                           SharedMemory* shared_memory);
-
-  // Preferred.
-  SharedMemoryDesktopFrame(DesktopSize size,
-                           int stride,
-                           std::unique_ptr<SharedMemory> shared_memory);
-
-  ~SharedMemoryDesktopFrame() override;
-
- private:
-  // Avoid unexpected order of parameter evaluation.
-  // Executing both std::unique_ptr<T>::operator->() and
-  // std::unique_ptr<T>::release() in the member initializer list is not safe.
-  // Depends on the order of parameter evaluation,
-  // std::unique_ptr<T>::operator->() may trigger assertion failure if it has
-  // been evaluated after std::unique_ptr<T>::release(). By using this
-  // constructor, std::unique_ptr<T>::operator->() won't be involved anymore.
-  SharedMemoryDesktopFrame(DesktopRect rect,
-                           int stride,
-                           SharedMemory* shared_memory);
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(SharedMemoryDesktopFrame);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_DESKTOP_CAPTURE_DESKTOP_FRAME_H_
-
diff --git a/modules/desktop_capture/desktop_frame_generator.cc b/modules/desktop_capture/desktop_frame_generator.cc
deleted file mode 100644
index 7bb5897..0000000
--- a/modules/desktop_capture/desktop_frame_generator.cc
+++ /dev/null
@@ -1,183 +0,0 @@
-/*
- *  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/desktop_capture/desktop_frame_generator.h"
-
-#include <stdint.h>
-#include <string.h>
-
-#include <memory>
-
-#include "webrtc/modules/desktop_capture/rgba_color.h"
-#include "webrtc/rtc_base/random.h"
-#include "webrtc/rtc_base/timeutils.h"
-
-namespace webrtc {
-
-namespace {
-
-// Sets |updated_region| to |frame|. If |enlarge_updated_region| is
-// true, this function will randomly enlarge each DesktopRect in
-// |updated_region|. But the enlarged DesktopRegion won't excceed the
-// frame->size(). If |add_random_updated_region| is true, several random
-// rectangles will also be included in |frame|.
-void SetUpdatedRegion(DesktopFrame* frame,
-                      const DesktopRegion& updated_region,
-                      bool enlarge_updated_region,
-                      int enlarge_range,
-                      bool add_random_updated_region) {
-  const DesktopRect screen_rect = DesktopRect::MakeSize(frame->size());
-  Random random(rtc::TimeMicros());
-  frame->mutable_updated_region()->Clear();
-  for (DesktopRegion::Iterator it(updated_region); !it.IsAtEnd();
-       it.Advance()) {
-    DesktopRect rect = it.rect();
-    if (enlarge_updated_region && enlarge_range > 0) {
-      rect.Extend(random.Rand(enlarge_range), random.Rand(enlarge_range),
-                  random.Rand(enlarge_range), random.Rand(enlarge_range));
-      rect.IntersectWith(screen_rect);
-    }
-    frame->mutable_updated_region()->AddRect(rect);
-  }
-
-  if (add_random_updated_region) {
-    for (int i = random.Rand(10); i >= 0; i--) {
-      // At least a 1 x 1 updated region.
-      const int left = random.Rand(0, frame->size().width() - 2);
-      const int top = random.Rand(0, frame->size().height() - 2);
-      const int right = random.Rand(left + 1, frame->size().width());
-      const int bottom = random.Rand(top + 1, frame->size().height());
-      frame->mutable_updated_region()->AddRect(
-          DesktopRect::MakeLTRB(left, top, right, bottom));
-    }
-  }
-}
-
-// Paints pixels in |rect| of |frame| to |color|.
-void PaintRect(DesktopFrame* frame, DesktopRect rect, RgbaColor rgba_color) {
-  static_assert(DesktopFrame::kBytesPerPixel == sizeof(uint32_t),
-                "kBytesPerPixel should be 4.");
-  RTC_DCHECK_GE(frame->size().width(), rect.right());
-  RTC_DCHECK_GE(frame->size().height(), rect.bottom());
-  uint32_t color = rgba_color.ToUInt32();
-  uint8_t* row = frame->GetFrameDataAtPos(rect.top_left());
-  for (int i = 0; i < rect.height(); i++) {
-    uint32_t* column = reinterpret_cast<uint32_t*>(row);
-    for (int j = 0; j < rect.width(); j++) {
-      column[j] = color;
-    }
-    row += frame->stride();
-  }
-}
-
-// Paints pixels in |region| of |frame| to |color|.
-void PaintRegion(DesktopFrame* frame,
-                 DesktopRegion* region,
-                 RgbaColor rgba_color) {
-  region->IntersectWith(DesktopRect::MakeSize(frame->size()));
-  for (DesktopRegion::Iterator it(*region); !it.IsAtEnd(); it.Advance()) {
-    PaintRect(frame, it.rect(), rgba_color);
-  }
-}
-
-}  // namespace
-
-DesktopFrameGenerator::DesktopFrameGenerator() {}
-DesktopFrameGenerator::~DesktopFrameGenerator() {}
-
-DesktopFramePainter::DesktopFramePainter() {}
-DesktopFramePainter::~DesktopFramePainter() {}
-
-PainterDesktopFrameGenerator::PainterDesktopFrameGenerator()
-    : size_(1024, 768),
-      return_frame_(true),
-      provide_updated_region_hints_(false),
-      enlarge_updated_region_(false),
-      enlarge_range_(20),
-      add_random_updated_region_(false),
-      painter_(nullptr) {}
-PainterDesktopFrameGenerator::~PainterDesktopFrameGenerator() {}
-
-std::unique_ptr<DesktopFrame> PainterDesktopFrameGenerator::GetNextFrame(
-    SharedMemoryFactory* factory) {
-  if (!return_frame_) {
-    return nullptr;
-  }
-
-  std::unique_ptr<DesktopFrame> frame = std::unique_ptr<DesktopFrame>(
-      factory ? SharedMemoryDesktopFrame::Create(size_, factory).release()
-              : new BasicDesktopFrame(size_));
-  if (painter_) {
-    DesktopRegion updated_region;
-    if (!painter_->Paint(frame.get(), &updated_region)) {
-      return nullptr;
-    }
-
-    if (provide_updated_region_hints_) {
-      SetUpdatedRegion(frame.get(), updated_region, enlarge_updated_region_,
-                       enlarge_range_, add_random_updated_region_);
-    } else {
-      frame->mutable_updated_region()->SetRect(
-          DesktopRect::MakeSize(frame->size()));
-    }
-  }
-
-  return frame;
-}
-
-DesktopSize* PainterDesktopFrameGenerator::size() {
-  return &size_;
-}
-
-void PainterDesktopFrameGenerator::set_return_frame(bool return_frame) {
-  return_frame_ = return_frame;
-}
-
-void PainterDesktopFrameGenerator::set_provide_updated_region_hints(
-    bool provide_updated_region_hints) {
-  provide_updated_region_hints_ = provide_updated_region_hints;
-}
-
-void PainterDesktopFrameGenerator::set_enlarge_updated_region(
-    bool enlarge_updated_region) {
-  enlarge_updated_region_ = enlarge_updated_region;
-}
-
-void PainterDesktopFrameGenerator::set_enlarge_range(int enlarge_range) {
-  enlarge_range_ = enlarge_range;
-}
-
-void PainterDesktopFrameGenerator::set_add_random_updated_region(
-    bool add_random_updated_region) {
-  add_random_updated_region_ = add_random_updated_region;
-}
-
-void PainterDesktopFrameGenerator::set_desktop_frame_painter(
-    DesktopFramePainter* painter) {
-  painter_ = painter;
-}
-
-BlackWhiteDesktopFramePainter::BlackWhiteDesktopFramePainter() {}
-BlackWhiteDesktopFramePainter::~BlackWhiteDesktopFramePainter() {}
-
-DesktopRegion* BlackWhiteDesktopFramePainter::updated_region() {
-  return &updated_region_;
-}
-
-bool BlackWhiteDesktopFramePainter::Paint(DesktopFrame* frame,
-                                          DesktopRegion* updated_region) {
-  RTC_DCHECK(updated_region->is_empty());
-  memset(frame->data(), 0, frame->stride() * frame->size().height());
-  PaintRegion(frame, &updated_region_, RgbaColor(0xFFFFFFFF));
-  updated_region_.Swap(updated_region);
-  return true;
-}
-
-}  // namespace webrtc
diff --git a/modules/desktop_capture/desktop_frame_generator.h b/modules/desktop_capture/desktop_frame_generator.h
deleted file mode 100644
index 2b767dc..0000000
--- a/modules/desktop_capture/desktop_frame_generator.h
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- *  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_DESKTOP_CAPTURE_DESKTOP_FRAME_GENERATOR_H_
-#define WEBRTC_MODULES_DESKTOP_CAPTURE_DESKTOP_FRAME_GENERATOR_H_
-
-#include <memory>
-
-#include "webrtc/modules/desktop_capture/desktop_frame.h"
-#include "webrtc/modules/desktop_capture/desktop_geometry.h"
-#include "webrtc/modules/desktop_capture/desktop_region.h"
-#include "webrtc/modules/desktop_capture/shared_memory.h"
-
-namespace webrtc {
-
-// An interface to generate a DesktopFrame.
-class DesktopFrameGenerator {
- public:
-  DesktopFrameGenerator();
-  virtual ~DesktopFrameGenerator();
-
-  virtual std::unique_ptr<DesktopFrame> GetNextFrame(
-      SharedMemoryFactory* factory) = 0;
-};
-
-// An interface to paint a DesktopFrame. This interface is used by
-// PainterDesktopFrameGenerator.
-class DesktopFramePainter {
- public:
-  DesktopFramePainter();
-  virtual ~DesktopFramePainter();
-
-  virtual bool Paint(DesktopFrame* frame, DesktopRegion* updated_region) = 0;
-};
-
-// An implementation of DesktopFrameGenerator to take care about the
-// DesktopFrame size, filling updated_region(), etc, but leaves the real
-// painting work to a DesktopFramePainter implementation.
-class PainterDesktopFrameGenerator final : public DesktopFrameGenerator {
- public:
-  PainterDesktopFrameGenerator();
-  ~PainterDesktopFrameGenerator() override;
-
-  std::unique_ptr<DesktopFrame> GetNextFrame(
-      SharedMemoryFactory* factory) override;
-
-  // Sets the size of the frame which will be returned in next GetNextFrame()
-  // call.
-  DesktopSize* size();
-
-  // Decides whether BaseDesktopFrameGenerator returns a frame in next Capture()
-  // callback. If return_frame_ is true, BaseDesktopFrameGenerator will create a
-  // frame according to both size_ and SharedMemoryFactory input, and uses
-  // Paint() function to paint it.
-  void set_return_frame(bool return_frame);
-
-  // Decides whether MockScreenCapturer returns a frame with updated regions.
-  // MockScreenCapturer will keep DesktopFrame::updated_region() empty if this
-  // field is false.
-  void set_provide_updated_region_hints(bool provide_updated_region_hints);
-
-  // Decides whether MockScreenCapturer randomly enlarges updated regions in the
-  // DesktopFrame. Set this field to true to simulate an inaccurate updated
-  // regions' return from OS APIs.
-  void set_enlarge_updated_region(bool enlarge_updated_region);
-
-  // The range to enlarge a updated region if |enlarge_updated_region_| is true.
-  // If this field is less than zero, it will be treated as zero, and
-  // |enlarge_updated_region_| will be ignored.
-  void set_enlarge_range(int enlarge_range);
-
-  // Decides whether BaseDesktopFrameGenerator randomly add some updated regions
-  // in the DesktopFrame. Set this field to true to simulate an inaccurate
-  // updated regions' return from OS APIs.
-  void set_add_random_updated_region(bool add_random_updated_region);
-
-  // Sets the painter object to do the real painting work, if no |painter_| has
-  // been set to this instance, the DesktopFrame returned by GetNextFrame()
-  // function will keep in an undefined but valid state.
-  // PainterDesktopFrameGenerator does not take ownership of the |painter|.
-  void set_desktop_frame_painter(DesktopFramePainter* painter);
-
- private:
-  DesktopSize size_;
-  bool return_frame_;
-  bool provide_updated_region_hints_;
-  bool enlarge_updated_region_;
-  int enlarge_range_;
-  bool add_random_updated_region_;
-  DesktopFramePainter* painter_;
-};
-
-// An implementation of DesktopFramePainter to paint black on
-// mutable_updated_region(), and white elsewhere.
-class BlackWhiteDesktopFramePainter final : public DesktopFramePainter {
- public:
-  BlackWhiteDesktopFramePainter();
-  ~BlackWhiteDesktopFramePainter() override;
-
-  // The black regions of the frame which will be returned in next Paint()
-  // call. BlackWhiteDesktopFramePainter will draw a white frame, with black
-  // in the updated_region_. Each Paint() call will consume updated_region_.
-  DesktopRegion* updated_region();
-
-  // DesktopFramePainter interface.
-  bool Paint(DesktopFrame* frame, DesktopRegion* updated_region) override;
-
- private:
-  DesktopRegion updated_region_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_DESKTOP_CAPTURE_DESKTOP_FRAME_GENERATOR_H_
diff --git a/modules/desktop_capture/desktop_frame_rotation.cc b/modules/desktop_capture/desktop_frame_rotation.cc
deleted file mode 100644
index 000f6ae..0000000
--- a/modules/desktop_capture/desktop_frame_rotation.cc
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- *  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/desktop_capture/desktop_frame_rotation.h"
-
-#include <string.h>
-
-#include "third_party/libyuv/include/libyuv/rotate_argb.h"
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-
-namespace {
-
-libyuv::RotationMode ToLibyuvRotationMode(Rotation rotation) {
-  switch (rotation) {
-    case Rotation::CLOCK_WISE_0:
-      return libyuv::kRotate0;
-    case Rotation::CLOCK_WISE_90:
-      return libyuv::kRotate90;
-    case Rotation::CLOCK_WISE_180:
-      return libyuv::kRotate180;
-    case Rotation::CLOCK_WISE_270:
-      return libyuv::kRotate270;
-  }
-  RTC_NOTREACHED();
-  return libyuv::kRotate0;
-}
-
-DesktopRect RotateAndOffsetRect(DesktopRect rect,
-                                DesktopSize size,
-                                Rotation rotation,
-                                DesktopVector offset) {
-  DesktopRect result = RotateRect(rect, size, rotation);
-  result.Translate(offset);
-  return result;
-}
-
-}  // namespace
-
-Rotation ReverseRotation(Rotation rotation) {
-  switch (rotation) {
-    case Rotation::CLOCK_WISE_0:
-      return rotation;
-    case Rotation::CLOCK_WISE_90:
-      return Rotation::CLOCK_WISE_270;
-    case Rotation::CLOCK_WISE_180:
-      return Rotation::CLOCK_WISE_180;
-    case Rotation::CLOCK_WISE_270:
-      return Rotation::CLOCK_WISE_90;
-  }
-  RTC_NOTREACHED();
-  return Rotation::CLOCK_WISE_0;
-}
-
-DesktopSize RotateSize(DesktopSize size, Rotation rotation) {
-  switch (rotation) {
-    case Rotation::CLOCK_WISE_0:
-    case Rotation::CLOCK_WISE_180:
-      return size;
-    case Rotation::CLOCK_WISE_90:
-    case Rotation::CLOCK_WISE_270:
-      return DesktopSize(size.height(), size.width());
-  }
-  RTC_NOTREACHED();
-  return DesktopSize();
-}
-
-DesktopRect RotateRect(DesktopRect rect, DesktopSize size, Rotation rotation) {
-  switch (rotation) {
-    case Rotation::CLOCK_WISE_0:
-      return rect;
-    case Rotation::CLOCK_WISE_90:
-      return DesktopRect::MakeXYWH(size.height() - rect.bottom(), rect.left(),
-                                   rect.height(), rect.width());
-    case Rotation::CLOCK_WISE_180:
-      return DesktopRect::MakeXYWH(size.width() - rect.right(),
-                                   size.height() - rect.bottom(), rect.width(),
-                                   rect.height());
-    case Rotation::CLOCK_WISE_270:
-      return DesktopRect::MakeXYWH(rect.top(), size.width() - rect.right(),
-                                   rect.height(), rect.width());
-  }
-  RTC_NOTREACHED();
-  return DesktopRect();
-}
-
-void RotateDesktopFrame(const DesktopFrame& source,
-                        const DesktopRect& source_rect,
-                        const Rotation& rotation,
-                        const DesktopVector& target_offset,
-                        DesktopFrame* target) {
-  RTC_DCHECK(target);
-  RTC_DCHECK(DesktopRect::MakeSize(source.size()).ContainsRect(source_rect));
-  // The rectangle in |target|.
-  const DesktopRect target_rect =
-      RotateAndOffsetRect(source_rect, source.size(), rotation, target_offset);
-  RTC_DCHECK(DesktopRect::MakeSize(target->size()).ContainsRect(target_rect));
-
-  if (target_rect.is_empty()) {
-    return;
-  }
-
-  int result = libyuv::ARGBRotate(
-       source.GetFrameDataAtPos(source_rect.top_left()), source.stride(),
-       target->GetFrameDataAtPos(target_rect.top_left()), target->stride(),
-       source_rect.width(), source_rect.height(),
-       ToLibyuvRotationMode(rotation));
-  RTC_DCHECK_EQ(result, 0);
-}
-
-}  // namespace webrtc
diff --git a/modules/desktop_capture/desktop_frame_rotation.h b/modules/desktop_capture/desktop_frame_rotation.h
deleted file mode 100644
index c0024aa..0000000
--- a/modules/desktop_capture/desktop_frame_rotation.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- *  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_DESKTOP_CAPTURE_DESKTOP_FRAME_ROTATION_H_
-#define WEBRTC_MODULES_DESKTOP_CAPTURE_DESKTOP_FRAME_ROTATION_H_
-
-#include "webrtc/modules/desktop_capture/desktop_frame.h"
-#include "webrtc/modules/desktop_capture/desktop_geometry.h"
-
-namespace webrtc {
-
-// Represents the rotation of a DesktopFrame.
-enum class Rotation {
-  CLOCK_WISE_0,
-  CLOCK_WISE_90,
-  CLOCK_WISE_180,
-  CLOCK_WISE_270,
-};
-
-// Rotates input DesktopFrame |source|, copies pixel in an unrotated rectangle
-// |source_rect| into the target rectangle of another DesktopFrame |target|.
-// Target rectangle here is the rotated |source_rect| plus |target_offset|.
-// |rotation| specifies |source| to |target| rotation. |source_rect| is in
-// |source| coordinate. |target_offset| is in |target| coordinate.
-// This function triggers check failure if |source| does not cover the
-// |source_rect|, or |target| does not cover the rotated |rect|.
-void RotateDesktopFrame(const DesktopFrame& source,
-                        const DesktopRect& source_rect,
-                        const Rotation& rotation,
-                        const DesktopVector& target_offset,
-                        DesktopFrame* target);
-
-// Returns a reverse rotation of |rotation|.
-Rotation ReverseRotation(Rotation rotation);
-
-// Returns a rotated DesktopSize of |size|.
-DesktopSize RotateSize(DesktopSize size, Rotation rotation);
-
-// Returns a rotated DesktopRect of |rect|. The |size| represents the size of
-// the DesktopFrame which |rect| belongs in.
-DesktopRect RotateRect(DesktopRect rect, DesktopSize size, Rotation rotation);
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_DESKTOP_CAPTURE_DESKTOP_FRAME_ROTATION_H_
diff --git a/modules/desktop_capture/desktop_frame_rotation_unittest.cc b/modules/desktop_capture/desktop_frame_rotation_unittest.cc
deleted file mode 100644
index 864559e..0000000
--- a/modules/desktop_capture/desktop_frame_rotation_unittest.cc
+++ /dev/null
@@ -1,447 +0,0 @@
-/*
- *  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/desktop_capture/desktop_frame_rotation.h"
-
-#include "webrtc/modules/desktop_capture/desktop_frame.h"
-#include "webrtc/modules/desktop_capture/desktop_region.h"
-#include "webrtc/modules/desktop_capture/test_utils.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-namespace {
-
-// A DesktopFrame implementation which stores data in an external int array.
-class ArrayDesktopFrame : public DesktopFrame {
- public:
-  ArrayDesktopFrame(DesktopSize size, uint32_t* data);
-  ~ArrayDesktopFrame() override;
-};
-
-ArrayDesktopFrame::ArrayDesktopFrame(DesktopSize size, uint32_t* data)
-    : DesktopFrame(size,
-                   size.width() * kBytesPerPixel,
-                   reinterpret_cast<uint8_t*>(data),
-                   nullptr) {}
-
-ArrayDesktopFrame::~ArrayDesktopFrame() = default;
-
-}  // namespace
-
-TEST(DesktopFrameRotationTest, CopyRect3x4) {
-  // A DesktopFrame of 4-pixel width by 3-pixel height.
-  static uint32_t frame_pixels[] = {
-      0, 1,  2,  3,  //
-      4, 5,  6,  7,  //
-      8, 9, 10, 11,  //
-  };
-  ArrayDesktopFrame frame(DesktopSize(4, 3), frame_pixels);
-
-  {
-    BasicDesktopFrame target(DesktopSize(4, 3));
-    RotateDesktopFrame(frame, DesktopRect::MakeSize(frame.size()),
-                       Rotation::CLOCK_WISE_0, DesktopVector(), &target);
-    ASSERT_TRUE(DesktopFrameDataEquals(frame, target));
-  }
-
-  // After Rotating clock-wise 90 degree
-  {
-    static uint32_t expected_pixels[] = {
-         8, 4, 0,  //
-         9, 5, 1,  //
-        10, 6, 2,  //
-        11, 7, 3,  //
-    };
-    ArrayDesktopFrame expected(DesktopSize(3, 4), expected_pixels);
-
-    BasicDesktopFrame target(DesktopSize(3, 4));
-    RotateDesktopFrame(frame, DesktopRect::MakeSize(frame.size()),
-                       Rotation::CLOCK_WISE_90, DesktopVector(), &target);
-    ASSERT_TRUE(DesktopFrameDataEquals(target, expected));
-  }
-
-  // After Rotating clock-wise 180 degree
-  {
-    static uint32_t expected_pixels[] = {
-        11, 10, 9, 8,  //
-         7,  6, 5, 4,  //
-         3,  2, 1, 0,  //
-    };
-    ArrayDesktopFrame expected(DesktopSize(4, 3), expected_pixels);
-
-    BasicDesktopFrame target(DesktopSize(4, 3));
-    RotateDesktopFrame(frame, DesktopRect::MakeSize(frame.size()),
-                       Rotation::CLOCK_WISE_180, DesktopVector(), &target);
-    ASSERT_TRUE(DesktopFrameDataEquals(target, expected));
-  }
-
-  // After Rotating clock-wise 270 degree
-  {
-    static uint32_t expected_pixels[] = {
-        3, 7, 11,  //
-        2, 6, 10,  //
-        1, 5,  9,  //
-        0, 4,  8,  //
-    };
-    ArrayDesktopFrame expected(DesktopSize(3, 4), expected_pixels);
-
-    BasicDesktopFrame target(DesktopSize(3, 4));
-    RotateDesktopFrame(frame, DesktopRect::MakeSize(frame.size()),
-                       Rotation::CLOCK_WISE_270, DesktopVector(), &target);
-    ASSERT_TRUE(DesktopFrameDataEquals(target, expected));
-  }
-}
-
-TEST(DesktopFrameRotationTest, CopyRect3x5) {
-  // A DesktopFrame of 5-pixel width by 3-pixel height.
-  static uint32_t frame_pixels[] = {
-       0,  1,  2,  3,  4,  //
-       5,  6,  7,  8,  9,  //
-      10, 11, 12, 13, 14,  //
-  };
-  ArrayDesktopFrame frame(DesktopSize(5, 3), frame_pixels);
-
-  {
-    BasicDesktopFrame target(DesktopSize(5, 3));
-    RotateDesktopFrame(frame, DesktopRect::MakeSize(frame.size()),
-                       Rotation::CLOCK_WISE_0, DesktopVector(), &target);
-    ASSERT_TRUE(DesktopFrameDataEquals(target, frame));
-  }
-
-  // After Rotating clock-wise 90 degree
-  {
-    static uint32_t expected_pixels[] = {
-        10, 5, 0,  //
-        11, 6, 1,  //
-        12, 7, 2,  //
-        13, 8, 3,  //
-        14, 9, 4,  //
-    };
-    ArrayDesktopFrame expected(DesktopSize(3, 5), expected_pixels);
-
-    BasicDesktopFrame target(DesktopSize(3, 5));
-    RotateDesktopFrame(frame, DesktopRect::MakeSize(frame.size()),
-                       Rotation::CLOCK_WISE_90, DesktopVector(), &target);
-    ASSERT_TRUE(DesktopFrameDataEquals(target, expected));
-  }
-
-  // After Rotating clock-wise 180 degree
-  {
-    static uint32_t expected_pixels[] {
-        14, 13, 12, 11, 10,  //
-         9,  8,  7,  6,  5,  //
-         4,  3,  2,  1,  0,  //
-    };
-    ArrayDesktopFrame expected(DesktopSize(5, 3), expected_pixels);
-
-    BasicDesktopFrame target(DesktopSize(5, 3));
-    RotateDesktopFrame(frame, DesktopRect::MakeSize(frame.size()),
-                       Rotation::CLOCK_WISE_180, DesktopVector(), &target);
-    ASSERT_TRUE(DesktopFrameDataEquals(target, expected));
-  }
-
-  // After Rotating clock-wise 270 degree
-  {
-    static uint32_t expected_pixels[] = {
-        4, 9, 14,  //
-        3, 8, 13,  //
-        2, 7, 12,  //
-        1, 6, 11,  //
-        0, 5, 10,  //
-    };
-    ArrayDesktopFrame expected(DesktopSize(3, 5), expected_pixels);
-
-    BasicDesktopFrame target(DesktopSize(3, 5));
-    RotateDesktopFrame(frame, DesktopRect::MakeSize(frame.size()),
-                       Rotation::CLOCK_WISE_270, DesktopVector(), &target);
-    ASSERT_TRUE(DesktopFrameDataEquals(target, expected));
-  }
-}
-
-TEST(DesktopFrameRotationTest, PartialCopyRect3x5) {
-  // A DesktopFrame of 5-pixel width by 3-pixel height.
-  static uint32_t frame_pixels[] = {
-       0,  1,  2,  3,  4,  //
-       5,  6,  7,  8,  9,  //
-      10, 11, 12, 13, 14,  //
-  };
-  ArrayDesktopFrame frame(DesktopSize(5, 3), frame_pixels);
-
-  {
-    static uint32_t expected_pixels[] = {
-        0, 0, 0, 0, 0,  //
-        0, 6, 7, 8, 0,  //
-        0, 0, 0, 0, 0,  //
-    };
-    ArrayDesktopFrame expected(DesktopSize(5, 3), expected_pixels);
-
-    BasicDesktopFrame target(DesktopSize(5, 3));
-    ClearDesktopFrame(&target);
-    RotateDesktopFrame(frame, DesktopRect::MakeXYWH(1, 1, 3, 1),
-                       Rotation::CLOCK_WISE_0, DesktopVector(), &target);
-    ASSERT_TRUE(DesktopFrameDataEquals(target, expected));
-  }
-
-  {
-    static uint32_t expected_pixels[] = {
-        0, 1, 2, 3, 0,  //
-        0, 6, 7, 8, 0,  //
-        0, 0, 0, 0, 0,  //
-    };
-    ArrayDesktopFrame expected(DesktopSize(5, 3), expected_pixels);
-
-    BasicDesktopFrame target(DesktopSize(5, 3));
-    ClearDesktopFrame(&target);
-    RotateDesktopFrame(frame, DesktopRect::MakeXYWH(1, 0, 3, 2),
-                       Rotation::CLOCK_WISE_0, DesktopVector(), &target);
-    ASSERT_TRUE(DesktopFrameDataEquals(target, expected));
-  }
-
-  // After Rotating clock-wise 90 degree
-  {
-    static uint32_t expected_pixels[] = {
-        0, 0, 0,  //
-        0, 6, 0,  //
-        0, 7, 0,  //
-        0, 8, 0,  //
-        0, 0, 0,  //
-    };
-    ArrayDesktopFrame expected(DesktopSize(3, 5), expected_pixels);
-
-    BasicDesktopFrame target(DesktopSize(3, 5));
-    ClearDesktopFrame(&target);
-    RotateDesktopFrame(frame, DesktopRect::MakeXYWH(1, 1, 3, 1),
-                       Rotation::CLOCK_WISE_90, DesktopVector(), &target);
-    ASSERT_TRUE(DesktopFrameDataEquals(target, expected));
-  }
-
-  {
-    static uint32_t expected_pixels[] = {
-         0, 0, 0,  //
-        11, 6, 0,  //
-        12, 7, 0,  //
-        13, 8, 0,  //
-         0, 0, 0,  //
-    };
-    ArrayDesktopFrame expected(DesktopSize(3, 5), expected_pixels);
-
-    BasicDesktopFrame target(DesktopSize(3, 5));
-    ClearDesktopFrame(&target);
-    RotateDesktopFrame(frame, DesktopRect::MakeXYWH(1, 1, 3, 2),
-                       Rotation::CLOCK_WISE_90, DesktopVector(), &target);
-    ASSERT_TRUE(DesktopFrameDataEquals(target, expected));
-  }
-
-  // After Rotating clock-wise 180 degree
-  {
-    static uint32_t expected_pixels[] = {
-        0, 0, 0, 0, 0,  //
-        0, 8, 7, 6, 0,  //
-        0, 0, 0, 0, 0,  //
-    };
-    ArrayDesktopFrame expected(DesktopSize(5, 3), expected_pixels);
-
-    BasicDesktopFrame target(DesktopSize(5, 3));
-    ClearDesktopFrame(&target);
-    RotateDesktopFrame(frame, DesktopRect::MakeXYWH(1, 1, 3, 1),
-                       Rotation::CLOCK_WISE_180, DesktopVector(), &target);
-    ASSERT_TRUE(DesktopFrameDataEquals(target, expected));
-  }
-
-  {
-    static uint32_t expected_pixels[] = {
-        0, 13, 12, 11, 0,  //
-        0,  8,  7,  6, 0,  //
-        0,  0,  0,  0, 0,  //
-    };
-    ArrayDesktopFrame expected(DesktopSize(5, 3), expected_pixels);
-
-    BasicDesktopFrame target(DesktopSize(5, 3));
-    ClearDesktopFrame(&target);
-    RotateDesktopFrame(frame, DesktopRect::MakeXYWH(1, 1, 3, 2),
-                       Rotation::CLOCK_WISE_180, DesktopVector(), &target);
-    ASSERT_TRUE(DesktopFrameDataEquals(target, expected));
-  }
-
-  // After Rotating clock-wise 270 degree
-  {
-    static uint32_t expected_pixels[] = {
-        0, 0, 0,  //
-        0, 8, 0,  //
-        0, 7, 0,  //
-        0, 6, 0,  //
-        0, 0, 0,  //
-    };
-    ArrayDesktopFrame expected(DesktopSize(3, 5), expected_pixels);
-
-    BasicDesktopFrame target(DesktopSize(3, 5));
-    ClearDesktopFrame(&target);
-    RotateDesktopFrame(frame, DesktopRect::MakeXYWH(1, 1, 3, 1),
-                       Rotation::CLOCK_WISE_270, DesktopVector(), &target);
-    ASSERT_TRUE(DesktopFrameDataEquals(target, expected));
-  }
-
-  {
-    static uint32_t expected_pixels[] = {
-        0, 0, 0,  //
-        3, 8, 0,  //
-        2, 7, 0,  //
-        1, 6, 0,  //
-        0, 0, 0,  //
-    };
-    ArrayDesktopFrame expected(DesktopSize(3, 5), expected_pixels);
-
-    BasicDesktopFrame target(DesktopSize(3, 5));
-    ClearDesktopFrame(&target);
-    RotateDesktopFrame(frame, DesktopRect::MakeXYWH(1, 0, 3, 2),
-                       Rotation::CLOCK_WISE_270, DesktopVector(), &target);
-    ASSERT_TRUE(DesktopFrameDataEquals(target, expected));
-  }
-}
-
-TEST(DesktopFrameRotationTest, WithOffset) {
-  // A DesktopFrame of 4-pixel width by 3-pixel height.
-  static uint32_t frame_pixels[] = {
-      0, 1,  2,  3,  //
-      4, 5,  6,  7,  //
-      8, 9, 10, 11,  //
-  };
-  ArrayDesktopFrame frame(DesktopSize(4, 3), frame_pixels);
-
-  {
-    static uint32_t expected_pixels[] = {
-      0, 0, 0,  0,  0, 0, 0, 0,  //
-      0, 0, 1,  2,  3, 0, 0, 0,  //
-      0, 4, 5,  6,  7, 0, 0, 0,  //
-      0, 8, 9, 10, 11, 0, 0, 0,  //
-      0, 0, 0,  0,  0, 0, 0, 0,  //
-      0, 0, 0,  0,  0, 0, 0, 0,  //
-    };
-    ArrayDesktopFrame expected(DesktopSize(8, 6), expected_pixels);
-
-    BasicDesktopFrame target(DesktopSize(8, 6));
-    ClearDesktopFrame(&target);
-    RotateDesktopFrame(frame, DesktopRect::MakeSize(frame.size()),
-                       Rotation::CLOCK_WISE_0, DesktopVector(1, 1), &target);
-    ASSERT_TRUE(DesktopFrameDataEquals(target, expected));
-    target.mutable_updated_region()->Subtract(
-        DesktopRect::MakeOriginSize(DesktopVector(1, 1), frame.size()));
-    ASSERT_TRUE(target.updated_region().is_empty());
-  }
-
-  {
-    static uint32_t expected_pixels[] = {
-      0,  0,  0, 0, 0, 0, 0, 0,  //
-      0, 11, 10, 9, 8, 0, 0, 0,  //
-      0,  7,  6, 5, 4, 0, 0, 0,  //
-      0,  3,  2, 1, 0, 0, 0, 0,  //
-      0,  0,  0, 0, 0, 0, 0, 0,  //
-      0,  0,  0, 0, 0, 0, 0, 0,  //
-    };
-    ArrayDesktopFrame expected(DesktopSize(8, 6), expected_pixels);
-
-    BasicDesktopFrame target(DesktopSize(8, 6));
-    ClearDesktopFrame(&target);
-    RotateDesktopFrame(frame, DesktopRect::MakeSize(frame.size()),
-                       Rotation::CLOCK_WISE_180, DesktopVector(1, 1), &target);
-    ASSERT_TRUE(DesktopFrameDataEquals(target, expected));
-    target.mutable_updated_region()->Subtract(
-        DesktopRect::MakeOriginSize(DesktopVector(1, 1), frame.size()));
-    ASSERT_TRUE(target.updated_region().is_empty());
-  }
-
-  {
-    static uint32_t expected_pixels[] = {
-      0,  0, 0, 0, 0, 0,  //
-      0,  8, 4, 0, 0, 0,  //
-      0,  9, 5, 1, 0, 0,  //
-      0, 10, 6, 2, 0, 0,  //
-      0, 11, 7, 3, 0, 0,  //
-      0,  0, 0, 0, 0, 0,  //
-      0,  0, 0, 0, 0, 0,  //
-      0,  0, 0, 0, 0, 0,  //
-    };
-    ArrayDesktopFrame expected(DesktopSize(6, 8), expected_pixels);
-
-    BasicDesktopFrame target(DesktopSize(6, 8));
-    ClearDesktopFrame(&target);
-    RotateDesktopFrame(frame, DesktopRect::MakeSize(frame.size()),
-                       Rotation::CLOCK_WISE_90, DesktopVector(1, 1), &target);
-    ASSERT_TRUE(DesktopFrameDataEquals(target, expected));
-    target.mutable_updated_region()->Subtract(
-        DesktopRect::MakeXYWH(1, 1, 3, 4));
-    ASSERT_TRUE(target.updated_region().is_empty());
-  }
-
-  {
-    static uint32_t expected_pixels[] = {
-      0, 0, 0,  0, 0, 0,  //
-      0, 3, 7, 11, 0, 0,  //
-      0, 2, 6, 10, 0, 0,  //
-      0, 1, 5,  9, 0, 0,  //
-      0, 0, 4,  8, 0, 0,  //
-      0, 0, 0,  0, 0, 0,  //
-      0, 0, 0,  0, 0, 0,  //
-      0, 0, 0,  0, 0, 0,  //
-    };
-    ArrayDesktopFrame expected(DesktopSize(6, 8), expected_pixels);
-
-    BasicDesktopFrame target(DesktopSize(6, 8));
-    ClearDesktopFrame(&target);
-    RotateDesktopFrame(frame, DesktopRect::MakeSize(frame.size()),
-                       Rotation::CLOCK_WISE_270, DesktopVector(1, 1), &target);
-    ASSERT_TRUE(DesktopFrameDataEquals(target, expected));
-    target.mutable_updated_region()->Subtract(
-        DesktopRect::MakeXYWH(1, 1, 3, 4));
-    ASSERT_TRUE(target.updated_region().is_empty());
-  }
-}
-
-// On a typical machine (Intel(R) Xeon(R) E5-1650 v3 @ 3.50GHz, with O2
-// optimization, the following case uses ~1.4s to finish. It means entirely
-// rotating one 2048 x 1536 frame, which is a large enough number to cover most
-// of desktop computer users, uses around 14ms.
-TEST(DesktopFrameRotationTest, DISABLED_PerformanceTest) {
-  BasicDesktopFrame frame(DesktopSize(2048, 1536));
-  BasicDesktopFrame target(DesktopSize(1536, 2048));
-  BasicDesktopFrame target2(DesktopSize(2048, 1536));
-  for (int i = 0; i < 100; i++) {
-    RotateDesktopFrame(frame, DesktopRect::MakeSize(frame.size()),
-                       Rotation::CLOCK_WISE_90, DesktopVector(), &target);
-    RotateDesktopFrame(frame, DesktopRect::MakeSize(frame.size()),
-                       Rotation::CLOCK_WISE_270, DesktopVector(), &target);
-    RotateDesktopFrame(frame, DesktopRect::MakeSize(frame.size()),
-                       Rotation::CLOCK_WISE_0, DesktopVector(), &target2);
-    RotateDesktopFrame(frame, DesktopRect::MakeSize(frame.size()),
-                       Rotation::CLOCK_WISE_180, DesktopVector(), &target2);
-  }
-}
-
-// On a typical machine (Intel(R) Xeon(R) E5-1650 v3 @ 3.50GHz, with O2
-// optimization, the following case uses ~6.7s to finish. It means entirely
-// rotating one 4096 x 3072 frame uses around 67ms.
-TEST(DesktopFrameRotationTest, DISABLED_PerformanceTestOnLargeScreen) {
-  BasicDesktopFrame frame(DesktopSize(4096, 3072));
-  BasicDesktopFrame target(DesktopSize(3072, 4096));
-  BasicDesktopFrame target2(DesktopSize(4096, 3072));
-  for (int i = 0; i < 100; i++) {
-    RotateDesktopFrame(frame, DesktopRect::MakeSize(frame.size()),
-                       Rotation::CLOCK_WISE_90, DesktopVector(), &target);
-    RotateDesktopFrame(frame, DesktopRect::MakeSize(frame.size()),
-                       Rotation::CLOCK_WISE_270, DesktopVector(), &target);
-    RotateDesktopFrame(frame, DesktopRect::MakeSize(frame.size()),
-                       Rotation::CLOCK_WISE_0, DesktopVector(), &target2);
-    RotateDesktopFrame(frame, DesktopRect::MakeSize(frame.size()),
-                       Rotation::CLOCK_WISE_180, DesktopVector(), &target2);
-  }
-}
-
-}  // namespace webrtc
diff --git a/modules/desktop_capture/desktop_frame_win.cc b/modules/desktop_capture/desktop_frame_win.cc
deleted file mode 100644
index c694f55..0000000
--- a/modules/desktop_capture/desktop_frame_win.cc
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- *  Copyright (c) 2013 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/desktop_capture/desktop_frame_win.h"
-
-#include <utility>
-
-#include "webrtc/rtc_base/logging.h"
-
-namespace webrtc {
-
-DesktopFrameWin::DesktopFrameWin(DesktopSize size,
-                                 int stride,
-                                 uint8_t* data,
-                                 std::unique_ptr<SharedMemory> shared_memory,
-                                 HBITMAP bitmap)
-    : DesktopFrame(size, stride, data, shared_memory.get()),
-      bitmap_(bitmap),
-      owned_shared_memory_(std::move(shared_memory)) {}
-
-DesktopFrameWin::~DesktopFrameWin() {
-  DeleteObject(bitmap_);
-}
-
-// static
-std::unique_ptr<DesktopFrameWin> DesktopFrameWin::Create(
-    DesktopSize size,
-    SharedMemoryFactory* shared_memory_factory,
-    HDC hdc) {
-  int bytes_per_row = size.width() * kBytesPerPixel;
-  int buffer_size = bytes_per_row * size.height();
-
-  // Describe a device independent bitmap (DIB) that is the size of the desktop.
-  BITMAPINFO bmi = {};
-  bmi.bmiHeader.biHeight = -size.height();
-  bmi.bmiHeader.biWidth = size.width();
-  bmi.bmiHeader.biPlanes = 1;
-  bmi.bmiHeader.biBitCount = DesktopFrameWin::kBytesPerPixel * 8;
-  bmi.bmiHeader.biSize = sizeof(bmi.bmiHeader);
-  bmi.bmiHeader.biSizeImage = bytes_per_row * size.height();
-
-  std::unique_ptr<SharedMemory> shared_memory;
-  HANDLE section_handle = nullptr;
-  if (shared_memory_factory) {
-    shared_memory = shared_memory_factory->CreateSharedMemory(buffer_size);
-    section_handle = shared_memory->handle();
-  }
-  void* data = nullptr;
-  HBITMAP bitmap = CreateDIBSection(hdc, &bmi, DIB_RGB_COLORS, &data,
-                                    section_handle, 0);
-  if (!bitmap) {
-    LOG(LS_WARNING) << "Failed to allocate new window frame " << GetLastError();
-    return nullptr;
-  }
-
-  return std::unique_ptr<DesktopFrameWin>(
-      new DesktopFrameWin(size, bytes_per_row, reinterpret_cast<uint8_t*>(data),
-                          std::move(shared_memory), bitmap));
-}
-
-}  // namespace webrtc
diff --git a/modules/desktop_capture/desktop_frame_win.h b/modules/desktop_capture/desktop_frame_win.h
deleted file mode 100644
index 9625611..0000000
--- a/modules/desktop_capture/desktop_frame_win.h
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- *  Copyright (c) 2013 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_DESKTOP_CAPTURE_DESKTOP_FRAME_WIN_H_
-#define WEBRTC_MODULES_DESKTOP_CAPTURE_DESKTOP_FRAME_WIN_H_
-
-#include <memory>
-
-#include <windows.h>
-
-#include "webrtc/modules/desktop_capture/desktop_frame.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-// DesktopFrame implementation used by screen and window captures on Windows.
-// Frame data is stored in a GDI bitmap.
-class DesktopFrameWin : public DesktopFrame {
- public:
-  ~DesktopFrameWin() override;
-
-  static std::unique_ptr<DesktopFrameWin>
-  Create(DesktopSize size, SharedMemoryFactory* shared_memory_factory, HDC hdc);
-
-  HBITMAP bitmap() { return bitmap_; }
-
- private:
-  DesktopFrameWin(DesktopSize size,
-                  int stride,
-                  uint8_t* data,
-                  std::unique_ptr<SharedMemory> shared_memory,
-                  HBITMAP bitmap);
-
-  HBITMAP bitmap_;
-  std::unique_ptr<SharedMemory> owned_shared_memory_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(DesktopFrameWin);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_DESKTOP_CAPTURE_DESKTOP_FRAME_WIN_H_
-
diff --git a/modules/desktop_capture/desktop_geometry.cc b/modules/desktop_capture/desktop_geometry.cc
deleted file mode 100644
index 5fadea2..0000000
--- a/modules/desktop_capture/desktop_geometry.cc
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- *  Copyright (c) 2013 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/desktop_capture/desktop_geometry.h"
-
-#include <algorithm>
-
-namespace webrtc {
-
-bool DesktopRect::Contains(const DesktopVector& point) const {
-  return point.x() >= left() && point.x() < right() &&
-         point.y() >= top() && point.y() < bottom();
-}
-
-bool DesktopRect::ContainsRect(const DesktopRect& rect) const {
-  return rect.left() >= left() && rect.right() <= right() &&
-         rect.top() >= top() && rect.bottom() <= bottom();
-}
-
-void DesktopRect::IntersectWith(const DesktopRect& rect) {
-  left_ = std::max(left(), rect.left());
-  top_ = std::max(top(), rect.top());
-  right_ = std::min(right(), rect.right());
-  bottom_ = std::min(bottom(), rect.bottom());
-  if (is_empty()) {
-    left_ = 0;
-    top_ = 0;
-    right_ = 0;
-    bottom_ = 0;
-  }
-}
-
-void DesktopRect::UnionWith(const DesktopRect& rect) {
-  if (is_empty()) {
-    *this = rect;
-    return;
-  }
-
-  if (rect.is_empty()) {
-    return;
-  }
-
-  left_ = std::min(left(), rect.left());
-  top_ = std::min(top(), rect.top());
-  right_ = std::max(right(), rect.right());
-  bottom_ = std::max(bottom(), rect.bottom());
-}
-
-void DesktopRect::Translate(int32_t dx, int32_t dy) {
-  left_ += dx;
-  top_ += dy;
-  right_ += dx;
-  bottom_ += dy;
-}
-
-void DesktopRect::Extend(int32_t left_offset,
-                         int32_t top_offset,
-                         int32_t right_offset,
-                         int32_t bottom_offset) {
-  left_ -= left_offset;
-  top_ -= top_offset;
-  right_ += right_offset;
-  bottom_ += bottom_offset;
-}
-
-void DesktopRect::Scale(double horizontal, double vertical) {
-  right_ += width() * (horizontal - 1);
-  bottom_ += height() * (vertical - 1);
-}
-
-}  // namespace webrtc
-
diff --git a/modules/desktop_capture/desktop_geometry.h b/modules/desktop_capture/desktop_geometry.h
deleted file mode 100644
index 571243b..0000000
--- a/modules/desktop_capture/desktop_geometry.h
+++ /dev/null
@@ -1,166 +0,0 @@
-/*
- *  Copyright (c) 2013 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_DESKTOP_CAPTURE_DESKTOP_GEOMETRY_H_
-#define WEBRTC_MODULES_DESKTOP_CAPTURE_DESKTOP_GEOMETRY_H_
-
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-// A vector in the 2D integer space. E.g. can be used to represent screen DPI.
-class DesktopVector {
- public:
-  DesktopVector() : x_(0), y_(0) {}
-  DesktopVector(int32_t x, int32_t y) : x_(x), y_(y) {}
-
-  int32_t x() const { return x_; }
-  int32_t y() const { return y_; }
-  bool is_zero() const { return x_ == 0 && y_ == 0; }
-
-  bool equals(const DesktopVector& other) const {
-    return x_ == other.x_ && y_ == other.y_;
-  }
-
-  void set(int32_t x, int32_t y) {
-    x_ = x;
-    y_ = y;
-  }
-
-  DesktopVector add(const DesktopVector& other) const {
-    return DesktopVector(x() + other.x(), y() + other.y());
-  }
-  DesktopVector subtract(const DesktopVector& other) const {
-    return DesktopVector(x() - other.x(), y() - other.y());
-  }
-
- private:
-  int32_t x_;
-  int32_t y_;
-};
-
-// Type used to represent screen/window size.
-class DesktopSize {
- public:
-  DesktopSize() : width_(0), height_(0) {}
-  DesktopSize(int32_t width, int32_t height)
-      : width_(width), height_(height) {
-  }
-
-  int32_t width() const { return width_; }
-  int32_t height() const { return height_; }
-
-  bool is_empty() const { return width_ <= 0 || height_ <= 0; }
-
-  bool equals(const DesktopSize& other) const {
-    return width_ == other.width_ && height_ == other.height_;
-  }
-
-  void set(int32_t width, int32_t height) {
-    width_ = width;
-    height_ = height;
-  }
-
- private:
-  int32_t width_;
-  int32_t height_;
-};
-
-// Represents a rectangle on the screen.
-class DesktopRect {
- public:
-  static DesktopRect MakeSize(const DesktopSize& size) {
-    return DesktopRect(0, 0, size.width(), size.height());
-  }
-  static DesktopRect MakeWH(int32_t width, int32_t height) {
-    return DesktopRect(0, 0, width, height);
-  }
-  static DesktopRect MakeXYWH(int32_t x, int32_t y,
-                              int32_t width, int32_t height) {
-    return DesktopRect(x, y, x + width, y + height);
-  }
-  static DesktopRect MakeLTRB(int32_t left, int32_t top,
-                              int32_t right, int32_t bottom) {
-    return DesktopRect(left, top, right, bottom);
-  }
-  static DesktopRect MakeOriginSize(const DesktopVector& origin,
-                                    const DesktopSize& size) {
-    return MakeXYWH(origin.x(), origin.y(), size.width(), size.height());
-  }
-
-  DesktopRect() : left_(0), top_(0), right_(0), bottom_(0) {}
-
-  int32_t left() const { return left_; }
-  int32_t top() const { return top_; }
-  int32_t right() const { return right_; }
-  int32_t bottom() const { return bottom_; }
-  int32_t width() const { return right_ - left_; }
-  int32_t height() const { return bottom_ - top_; }
-
-  void set_width(int32_t width) { right_ = left_ + width; }
-  void set_height(int32_t height) { bottom_ = top_ + height; }
-
-  DesktopVector top_left() const { return DesktopVector(left_, top_); }
-  DesktopSize size() const { return DesktopSize(width(), height()); }
-
-  bool is_empty() const { return left_ >= right_ || top_ >= bottom_; }
-
-  bool equals(const DesktopRect& other) const {
-    return left_ == other.left_ && top_ == other.top_ &&
-        right_ == other.right_ && bottom_ == other.bottom_;
-  }
-
-  // Returns true if |point| lies within the rectangle boundaries.
-  bool Contains(const DesktopVector& point) const;
-
-  // Returns true if |rect| lies within the boundaries of this rectangle.
-  bool ContainsRect(const DesktopRect& rect) const;
-
-  // Finds intersection with |rect|.
-  void IntersectWith(const DesktopRect& rect);
-
-  // Extends the rectangle to cover |rect|. If |this| is empty, replaces |this|
-  // with |rect|; if |rect| is empty, this function takes no effect.
-  void UnionWith(const DesktopRect& rect);
-
-  // Adds (dx, dy) to the position of the rectangle.
-  void Translate(int32_t dx, int32_t dy);
-  void Translate(DesktopVector d) { Translate(d.x(), d.y()); };
-
-  // Enlarges current DesktopRect by subtracting |left_offset| and |top_offset|
-  // from |left_| and |top_|, and adding |right_offset| and |bottom_offset| to
-  // |right_| and |bottom_|. This function does not normalize the result, so
-  // |left_| and |top_| may be less than zero or larger than |right_| and
-  // |bottom_|.
-  void Extend(int32_t left_offset,
-              int32_t top_offset,
-              int32_t right_offset,
-              int32_t bottom_offset);
-
-  // Scales current DesktopRect. This function does not impact the |top_| and
-  // |left_|.
-  void Scale(double horizontal, double vertical);
-
- private:
-  DesktopRect(int32_t left, int32_t top, int32_t right, int32_t bottom)
-      : left_(left), top_(top), right_(right), bottom_(bottom) {
-  }
-
-  int32_t left_;
-  int32_t top_;
-  int32_t right_;
-  int32_t bottom_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_DESKTOP_CAPTURE_DESKTOP_GEOMETRY_H_
-
diff --git a/modules/desktop_capture/desktop_geometry_unittest.cc b/modules/desktop_capture/desktop_geometry_unittest.cc
deleted file mode 100644
index 520b1f9..0000000
--- a/modules/desktop_capture/desktop_geometry_unittest.cc
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- *  Copyright (c) 2017 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/desktop_capture/desktop_geometry.h"
-
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-TEST(DesktopRectTest, UnionBetweenTwoNonEmptyRects) {
-  DesktopRect rect = DesktopRect::MakeLTRB(1, 1, 2, 2);
-  rect.UnionWith(DesktopRect::MakeLTRB(-2, -2, -1, -1));
-  ASSERT_TRUE(rect.equals(DesktopRect::MakeLTRB(-2, -2, 2, 2)));
-}
-
-TEST(DesktopRectTest, UnionWithEmptyRect) {
-  DesktopRect rect = DesktopRect::MakeWH(1, 1);
-  rect.UnionWith(DesktopRect());
-  ASSERT_TRUE(rect.equals(DesktopRect::MakeWH(1, 1)));
-
-  rect = DesktopRect::MakeXYWH(1, 1, 2, 2);
-  rect.UnionWith(DesktopRect());
-  ASSERT_TRUE(rect.equals(DesktopRect::MakeXYWH(1, 1, 2, 2)));
-
-  rect = DesktopRect::MakeXYWH(1, 1, 2, 2);
-  rect.UnionWith(DesktopRect::MakeXYWH(3, 3, 0, 0));
-  ASSERT_TRUE(rect.equals(DesktopRect::MakeXYWH(1, 1, 2, 2)));
-}
-
-TEST(DesktopRectTest, EmptyRectUnionWithNonEmptyOne) {
-  DesktopRect rect;
-  rect.UnionWith(DesktopRect::MakeWH(1, 1));
-  ASSERT_TRUE(rect.equals(DesktopRect::MakeWH(1, 1)));
-
-  rect = DesktopRect();
-  rect.UnionWith(DesktopRect::MakeXYWH(1, 1, 2, 2));
-  ASSERT_TRUE(rect.equals(DesktopRect::MakeXYWH(1, 1, 2, 2)));
-
-  rect = DesktopRect::MakeXYWH(3, 3, 0, 0);
-  rect.UnionWith(DesktopRect::MakeXYWH(1, 1, 2, 2));
-  ASSERT_TRUE(rect.equals(DesktopRect::MakeXYWH(1, 1, 2, 2)));
-}
-
-TEST(DesktopRectTest, EmptyRectUnionWithEmptyOne) {
-  DesktopRect rect;
-  rect.UnionWith(DesktopRect());
-  ASSERT_TRUE(rect.is_empty());
-
-  rect = DesktopRect::MakeXYWH(1, 1, 0, 0);
-  rect.UnionWith(DesktopRect());
-  ASSERT_TRUE(rect.is_empty());
-
-  rect = DesktopRect();
-  rect.UnionWith(DesktopRect::MakeXYWH(1, 1, 0, 0));
-  ASSERT_TRUE(rect.is_empty());
-
-  rect = DesktopRect::MakeXYWH(1, 1, 0, 0);
-  rect.UnionWith(DesktopRect::MakeXYWH(-1, -1, 0, 0));
-  ASSERT_TRUE(rect.is_empty());
-}
-
-TEST(DesktopRectTest, Scale) {
-  DesktopRect rect = DesktopRect::MakeXYWH(100, 100, 100, 100);
-  rect.Scale(1.1, 1.1);
-  ASSERT_EQ(rect.top(), 100);
-  ASSERT_EQ(rect.left(), 100);
-  ASSERT_EQ(rect.width(), 110);
-  ASSERT_EQ(rect.height(), 110);
-
-  rect = DesktopRect::MakeXYWH(100, 100, 100, 100);
-  rect.Scale(0.01, 0.01);
-  ASSERT_EQ(rect.top(), 100);
-  ASSERT_EQ(rect.left(), 100);
-  ASSERT_EQ(rect.width(), 1);
-  ASSERT_EQ(rect.height(), 1);
-
-  rect = DesktopRect::MakeXYWH(100, 100, 100, 100);
-  rect.Scale(1.1, 0.9);
-  ASSERT_EQ(rect.top(), 100);
-  ASSERT_EQ(rect.left(), 100);
-  ASSERT_EQ(rect.width(), 110);
-  ASSERT_EQ(rect.height(), 90);
-
-  rect = DesktopRect::MakeXYWH(0, 0, 100, 100);
-  rect.Scale(1.1, 1.1);
-  ASSERT_EQ(rect.top(), 0);
-  ASSERT_EQ(rect.left(), 0);
-  ASSERT_EQ(rect.width(), 110);
-  ASSERT_EQ(rect.height(), 110);
-
-  rect = DesktopRect::MakeXYWH(0, 100, 100, 100);
-  rect.Scale(1.1, 1.1);
-  ASSERT_EQ(rect.top(), 100);
-  ASSERT_EQ(rect.left(), 0);
-  ASSERT_EQ(rect.width(), 110);
-  ASSERT_EQ(rect.height(), 110);
-}
-
-}  // namespace webrtc
diff --git a/modules/desktop_capture/desktop_region.cc b/modules/desktop_capture/desktop_region.cc
deleted file mode 100644
index e130c10..0000000
--- a/modules/desktop_capture/desktop_region.cc
+++ /dev/null
@@ -1,572 +0,0 @@
-/*
- *  Copyright (c) 2013 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/desktop_capture/desktop_region.h"
-
-#include <assert.h>
-
-#include <algorithm>
-
-namespace webrtc {
-
-DesktopRegion::RowSpan::RowSpan(int32_t left, int32_t right)
-    : left(left), right(right) {
-}
-
-DesktopRegion::Row::Row(const Row&) = default;
-DesktopRegion::Row::Row(Row&&) = default;
-
-DesktopRegion::Row::Row(int32_t top, int32_t bottom)
-    : top(top), bottom(bottom) {
-}
-
-DesktopRegion::Row::~Row() {}
-
-DesktopRegion::DesktopRegion() {}
-
-DesktopRegion::DesktopRegion(const DesktopRect& rect) {
-  AddRect(rect);
-}
-
-DesktopRegion::DesktopRegion(const DesktopRect* rects, int count) {
-  AddRects(rects, count);
-}
-
-DesktopRegion::DesktopRegion(const DesktopRegion& other) {
-  *this = other;
-}
-
-DesktopRegion::~DesktopRegion() {
-  Clear();
-}
-
-DesktopRegion& DesktopRegion::operator=(const DesktopRegion& other) {
-  Clear();
-  rows_ = other.rows_;
-  for (Rows::iterator it = rows_.begin(); it != rows_.end(); ++it) {
-    // Copy each row.
-    Row* row = it->second;
-    it->second = new Row(*row);
-  }
-  return *this;
-}
-
-bool DesktopRegion::Equals(const DesktopRegion& region) const {
-  // Iterate over rows of the tow regions and compare each row.
-  Rows::const_iterator it1 = rows_.begin();
-  Rows::const_iterator it2 = region.rows_.begin();
-  while (it1 != rows_.end()) {
-    if (it2 == region.rows_.end() ||
-        it1->first != it2->first ||
-        it1->second->top != it2->second->top ||
-        it1->second->bottom != it2->second->bottom ||
-        it1->second->spans != it2->second->spans) {
-      return false;
-    }
-    ++it1;
-    ++it2;
-  }
-  return it2 == region.rows_.end();
-}
-
-void DesktopRegion::Clear() {
-  for (Rows::iterator row = rows_.begin(); row != rows_.end(); ++row) {
-    delete row->second;
-  }
-  rows_.clear();
-}
-
-void DesktopRegion::SetRect(const DesktopRect& rect) {
-  Clear();
-  AddRect(rect);
-}
-
-void DesktopRegion::AddRect(const DesktopRect& rect) {
-  if (rect.is_empty())
-    return;
-
-  // Top of the part of the |rect| that hasn't been inserted yet. Increased as
-  // we iterate over the rows until it reaches |rect.bottom()|.
-  int top = rect.top();
-
-  // Iterate over all rows that may intersect with |rect| and add new rows when
-  // necessary.
-  Rows::iterator row = rows_.upper_bound(top);
-  while (top < rect.bottom()) {
-    if (row == rows_.end() || top < row->second->top)  {
-      // If |top| is above the top of the current |row| then add a new row above
-      // the current one.
-      int32_t bottom = rect.bottom();
-      if (row != rows_.end() && row->second->top < bottom)
-        bottom = row->second->top;
-      row = rows_.insert(
-          row, Rows::value_type(bottom, new Row(top, bottom)));
-    } else if (top > row->second->top) {
-      // If the |top| falls in the middle of the |row| then split |row| into
-      // two, at |top|, and leave |row| referring to the lower of the two,
-      // ready to insert a new span into.
-      assert(top <= row->second->bottom);
-      Rows::iterator new_row = rows_.insert(
-          row, Rows::value_type(top, new Row(row->second->top, top)));
-      row->second->top = top;
-      new_row->second->spans = row->second->spans;
-    }
-
-    if (rect.bottom() < row->second->bottom) {
-      // If the bottom of the |rect| falls in the middle of the |row| split
-      // |row| into two, at |top|, and leave |row| referring to the upper of
-      // the two, ready to insert a new span into.
-      Rows::iterator new_row = rows_.insert(
-          row, Rows::value_type(rect.bottom(), new Row(top, rect.bottom())));
-      row->second->top = rect.bottom();
-      new_row->second->spans = row->second->spans;
-      row = new_row;
-    }
-
-    // Add a new span to the current row.
-    AddSpanToRow(row->second, rect.left(), rect.right());
-    top = row->second->bottom;
-
-    MergeWithPrecedingRow(row);
-
-    // Move to the next row.
-    ++row;
-  }
-
-  if (row != rows_.end())
-    MergeWithPrecedingRow(row);
-}
-
-void DesktopRegion::AddRects(const DesktopRect* rects, int count) {
-  for (int i = 0; i < count; ++i) {
-    AddRect(rects[i]);
-  }
-}
-
-void DesktopRegion::MergeWithPrecedingRow(Rows::iterator row) {
-  assert(row != rows_.end());
-
-  if (row != rows_.begin()) {
-    Rows::iterator previous_row = row;
-    previous_row--;
-
-    // If |row| and |previous_row| are next to each other and contain the same
-    // set of spans then they can be merged.
-    if (previous_row->second->bottom == row->second->top &&
-        previous_row->second->spans == row->second->spans) {
-      row->second->top = previous_row->second->top;
-      delete previous_row->second;
-      rows_.erase(previous_row);
-    }
-  }
-}
-
-void DesktopRegion::AddRegion(const DesktopRegion& region) {
-  // TODO(sergeyu): This function is not optimized - potentially it can iterate
-  // over rows of the two regions similar to how it works in Intersect().
-  for (Iterator it(region); !it.IsAtEnd(); it.Advance()) {
-    AddRect(it.rect());
-  }
-}
-
-void DesktopRegion::Intersect(const DesktopRegion& region1,
-                              const DesktopRegion& region2) {
-  Clear();
-
-  Rows::const_iterator it1 = region1.rows_.begin();
-  Rows::const_iterator end1 = region1.rows_.end();
-  Rows::const_iterator it2 = region2.rows_.begin();
-  Rows::const_iterator end2 = region2.rows_.end();
-  if (it1 == end1 || it2 == end2)
-    return;
-
-  while (it1 != end1 && it2 != end2) {
-    // Arrange for |it1| to always be the top-most of the rows.
-    if (it2->second->top < it1->second->top) {
-      std::swap(it1, it2);
-      std::swap(end1, end2);
-    }
-
-    // Skip |it1| if it doesn't intersect |it2| at all.
-    if (it1->second->bottom <= it2->second->top) {
-      ++it1;
-      continue;
-    }
-
-    // Top of the |it1| row is above the top of |it2|, so top of the
-    // intersection is always the top of |it2|.
-    int32_t top = it2->second->top;
-    int32_t bottom = std::min(it1->second->bottom, it2->second->bottom);
-
-    Rows::iterator new_row = rows_.insert(
-        rows_.end(), Rows::value_type(bottom, new Row(top, bottom)));
-    IntersectRows(it1->second->spans, it2->second->spans,
-                  &new_row->second->spans);
-    if (new_row->second->spans.empty()) {
-      delete new_row->second;
-      rows_.erase(new_row);
-    } else {
-      MergeWithPrecedingRow(new_row);
-    }
-
-    // If |it1| was completely consumed, move to the next one.
-    if (it1->second->bottom == bottom)
-      ++it1;
-    // If |it2| was completely consumed, move to the next one.
-    if (it2->second->bottom == bottom)
-      ++it2;
-  }
-}
-
-// static
-void DesktopRegion::IntersectRows(const RowSpanSet& set1,
-                                  const RowSpanSet& set2,
-                                  RowSpanSet* output) {
-  RowSpanSet::const_iterator it1 = set1.begin();
-  RowSpanSet::const_iterator end1 = set1.end();
-  RowSpanSet::const_iterator it2 = set2.begin();
-  RowSpanSet::const_iterator end2 = set2.end();
-  assert(it1 != end1 && it2 != end2);
-
-  do {
-    // Arrange for |it1| to always be the left-most of the spans.
-    if (it2->left < it1->left) {
-      std::swap(it1, it2);
-      std::swap(end1, end2);
-    }
-
-    // Skip |it1| if it doesn't intersect |it2| at all.
-    if (it1->right <= it2->left) {
-      ++it1;
-      continue;
-    }
-
-    int32_t left = it2->left;
-    int32_t right = std::min(it1->right, it2->right);
-    assert(left < right);
-
-    output->push_back(RowSpan(left, right));
-
-    // If |it1| was completely consumed, move to the next one.
-    if (it1->right == right)
-      ++it1;
-    // If |it2| was completely consumed, move to the next one.
-    if (it2->right == right)
-      ++it2;
-  } while (it1 != end1 && it2 != end2);
-}
-
-void DesktopRegion::IntersectWith(const DesktopRegion& region) {
-  DesktopRegion old_region;
-  Swap(&old_region);
-  Intersect(old_region, region);
-}
-
-void DesktopRegion::IntersectWith(const DesktopRect& rect) {
-  DesktopRegion region;
-  region.AddRect(rect);
-  IntersectWith(region);
-}
-
-void DesktopRegion::Subtract(const DesktopRegion& region) {
-  if (region.rows_.empty())
-    return;
-
-  // |row_b| refers to the current row being subtracted.
-  Rows::const_iterator row_b = region.rows_.begin();
-
-  // Current vertical position at which subtraction is happening.
-  int top = row_b->second->top;
-
-  // |row_a| refers to the current row we are subtracting from. Skip all rows
-  // above |top|.
-  Rows::iterator row_a = rows_.upper_bound(top);
-
-  // Step through rows of the both regions subtracting content of |row_b| from
-  // |row_a|.
-  while (row_a != rows_.end() && row_b != region.rows_.end()) {
-    // Skip |row_a| if it doesn't intersect with the |row_b|.
-    if (row_a->second->bottom <= top) {
-      // Each output row is merged with previously-processed rows before further
-      // rows are processed.
-      MergeWithPrecedingRow(row_a);
-      ++row_a;
-      continue;
-    }
-
-    if (top > row_a->second->top) {
-      // If |top| falls in the middle of |row_a| then split |row_a| into two, at
-      // |top|, and leave |row_a| referring to the lower of the two, ready to
-      // subtract spans from.
-      assert(top <= row_a->second->bottom);
-      Rows::iterator new_row = rows_.insert(
-          row_a, Rows::value_type(top, new Row(row_a->second->top, top)));
-      row_a->second->top = top;
-      new_row->second->spans = row_a->second->spans;
-    } else if (top < row_a->second->top) {
-      // If the |top| is above |row_a| then skip the range between |top| and
-      // top of |row_a| because it's empty.
-      top = row_a->second->top;
-      if (top >= row_b->second->bottom) {
-        ++row_b;
-        if (row_b != region.rows_.end())
-          top = row_b->second->top;
-        continue;
-      }
-    }
-
-    if (row_b->second->bottom < row_a->second->bottom) {
-      // If the bottom of |row_b| falls in the middle of the |row_a| split
-      // |row_a| into two, at |top|, and leave |row_a| referring to the upper of
-      // the two, ready to subtract spans from.
-      int bottom = row_b->second->bottom;
-      Rows::iterator new_row =
-          rows_.insert(row_a, Rows::value_type(bottom, new Row(top, bottom)));
-      row_a->second->top = bottom;
-      new_row->second->spans = row_a->second->spans;
-      row_a = new_row;
-    }
-
-    // At this point the vertical range covered by |row_a| lays within the
-    // range covered by |row_b|. Subtract |row_b| spans from |row_a|.
-    RowSpanSet new_spans;
-    SubtractRows(row_a->second->spans, row_b->second->spans, &new_spans);
-    new_spans.swap(row_a->second->spans);
-    top = row_a->second->bottom;
-
-    if (top >= row_b->second->bottom) {
-      ++row_b;
-      if (row_b != region.rows_.end())
-        top = row_b->second->top;
-    }
-
-    // Check if the row is empty after subtraction and delete it. Otherwise move
-    // to the next one.
-    if (row_a->second->spans.empty()) {
-      Rows::iterator row_to_delete = row_a;
-      ++row_a;
-      delete row_to_delete->second;
-      rows_.erase(row_to_delete);
-    } else {
-      MergeWithPrecedingRow(row_a);
-      ++row_a;
-    }
-  }
-
-  if (row_a != rows_.end())
-    MergeWithPrecedingRow(row_a);
-}
-
-void DesktopRegion::Subtract(const DesktopRect& rect) {
-  DesktopRegion region;
-  region.AddRect(rect);
-  Subtract(region);
-}
-
-void DesktopRegion::Translate(int32_t dx, int32_t dy) {
-  Rows new_rows;
-
-  for (Rows::iterator it = rows_.begin(); it != rows_.end(); ++it) {
-    Row* row = it->second;
-
-    row->top += dy;
-    row->bottom += dy;
-
-    if (dx != 0) {
-      // Translate each span.
-      for (RowSpanSet::iterator span = row->spans.begin();
-           span != row->spans.end(); ++span) {
-        span->left += dx;
-        span->right += dx;
-      }
-    }
-
-    if (dy != 0)
-      new_rows.insert(new_rows.end(), Rows::value_type(row->bottom, row));
-  }
-
-  if (dy != 0)
-    new_rows.swap(rows_);
-}
-
-void DesktopRegion::Swap(DesktopRegion* region) {
-  rows_.swap(region->rows_);
-}
-
-// static
-bool DesktopRegion::CompareSpanRight(const RowSpan& r, int32_t value) {
-  return r.right < value;
-}
-
-// static
-bool DesktopRegion::CompareSpanLeft(const RowSpan& r, int32_t value) {
-  return r.left < value;
-}
-
-// static
-void DesktopRegion::AddSpanToRow(Row* row, int left, int right) {
-  // First check if the new span is located to the right of all existing spans.
-  // This is an optimization to avoid binary search in the case when rectangles
-  // are inserted sequentially from left to right.
-  if (row->spans.empty() || left > row->spans.back().right) {
-    row->spans.push_back(RowSpan(left, right));
-    return;
-  }
-
-  // Find the first span that ends at or after |left|.
-  RowSpanSet::iterator start =
-      std::lower_bound(row->spans.begin(), row->spans.end(), left,
-                       CompareSpanRight);
-  assert(start < row->spans.end());
-
-  // Find the first span that starts after |right|.
-  RowSpanSet::iterator end =
-      std::lower_bound(start, row->spans.end(), right + 1, CompareSpanLeft);
-  if (end == row->spans.begin()) {
-    // There are no overlaps. Just insert the new span at the beginning.
-    row->spans.insert(row->spans.begin(), RowSpan(left, right));
-    return;
-  }
-
-  // Move end to the left, so that it points the last span that ends at or
-  // before |right|.
-  end--;
-
-  // At this point [start, end] is the range of spans that intersect with the
-  // new one.
-  if (end < start) {
-    // There are no overlaps. Just insert the new span at the correct position.
-    row->spans.insert(start, RowSpan(left, right));
-    return;
-  }
-
-  left = std::min(left, start->left);
-  right = std::max(right, end->right);
-
-  // Replace range [start, end] with the new span.
-  *start = RowSpan(left, right);
-  ++start;
-  ++end;
-  if (start < end)
-    row->spans.erase(start, end);
-}
-
-// static
-bool DesktopRegion::IsSpanInRow(const Row& row, const RowSpan& span) {
-  // Find the first span that starts at or after |span.left| and then check if
-  // it's the same span.
-  RowSpanSet::const_iterator it =
-      std::lower_bound(row.spans.begin(), row.spans.end(), span.left,
-                       CompareSpanLeft);
-  return it != row.spans.end() && *it == span;
-}
-
-// static
-void DesktopRegion::SubtractRows(const RowSpanSet& set_a,
-                                 const RowSpanSet& set_b,
-                                 RowSpanSet* output) {
-  assert(!set_a.empty() && !set_b.empty());
-
-  RowSpanSet::const_iterator it_b = set_b.begin();
-
-  // Iterate over all spans in |set_a| adding parts of it that do not intersect
-  // with |set_b| to the |output|.
-  for (RowSpanSet::const_iterator it_a = set_a.begin(); it_a != set_a.end();
-       ++it_a) {
-    // If there is no intersection then append the current span and continue.
-    if (it_b == set_b.end() || it_a->right < it_b->left) {
-      output->push_back(*it_a);
-      continue;
-    }
-
-    // Iterate over |set_b| spans that may intersect with |it_a|.
-    int pos = it_a->left;
-    while (it_b != set_b.end() && it_b->left < it_a->right) {
-      if (it_b->left > pos)
-        output->push_back(RowSpan(pos, it_b->left));
-      if (it_b->right > pos) {
-        pos = it_b->right;
-        if (pos >= it_a->right)
-          break;
-      }
-      ++it_b;
-    }
-    if (pos < it_a->right)
-      output->push_back(RowSpan(pos, it_a->right));
-  }
-}
-
-DesktopRegion::Iterator::Iterator(const DesktopRegion& region)
-    : region_(region),
-      row_(region.rows_.begin()),
-      previous_row_(region.rows_.end()) {
-  if (!IsAtEnd()) {
-    assert(row_->second->spans.size() > 0);
-    row_span_ = row_->second->spans.begin();
-    UpdateCurrentRect();
-  }
-}
-
-DesktopRegion::Iterator::~Iterator() {}
-
-bool DesktopRegion::Iterator::IsAtEnd() const {
-  return row_ == region_.rows_.end();
-}
-
-void DesktopRegion::Iterator::Advance() {
-  assert(!IsAtEnd());
-
-  while (true) {
-    ++row_span_;
-    if (row_span_ == row_->second->spans.end()) {
-      previous_row_ = row_;
-      ++row_;
-      if (row_ != region_.rows_.end()) {
-        assert(row_->second->spans.size() > 0);
-        row_span_ = row_->second->spans.begin();
-      }
-    }
-
-    if (IsAtEnd())
-      return;
-
-    // If the same span exists on the previous row then skip it, as we've
-    // already returned this span merged into the previous one, via
-    // UpdateCurrentRect().
-    if (previous_row_ != region_.rows_.end() &&
-        previous_row_->second->bottom == row_->second->top &&
-        IsSpanInRow(*previous_row_->second, *row_span_)) {
-      continue;
-    }
-
-    break;
-  }
-
-  assert(!IsAtEnd());
-  UpdateCurrentRect();
-}
-
-void DesktopRegion::Iterator::UpdateCurrentRect() {
-  // Merge the current rectangle with the matching spans from later rows.
-  int bottom;
-  Rows::const_iterator bottom_row = row_;
-  Rows::const_iterator previous;
-  do {
-    bottom = bottom_row->second->bottom;
-    previous = bottom_row;
-    ++bottom_row;
-  } while (bottom_row != region_.rows_.end() &&
-           previous->second->bottom == bottom_row->second->top &&
-           IsSpanInRow(*bottom_row->second, *row_span_));
-  rect_ = DesktopRect::MakeLTRB(row_span_->left, row_->second->top,
-                                row_span_->right, bottom);
-}
-
-}  // namespace webrtc
diff --git a/modules/desktop_capture/desktop_region.h b/modules/desktop_capture/desktop_region.h
deleted file mode 100644
index 1c05e98..0000000
--- a/modules/desktop_capture/desktop_region.h
+++ /dev/null
@@ -1,169 +0,0 @@
-/*
- *  Copyright (c) 2013 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_DESKTOP_CAPTURE_DESKTOP_REGION_H_
-#define WEBRTC_MODULES_DESKTOP_CAPTURE_DESKTOP_REGION_H_
-
-#include <map>
-#include <vector>
-
-#include "webrtc/modules/desktop_capture/desktop_geometry.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-// DesktopRegion represents a region of the screen or window.
-//
-// Internally each region is stored as a set of rows where each row contains one
-// or more rectangles aligned vertically.
-class DesktopRegion {
- private:
-  // The following private types need to be declared first because they are used
-  // in the public Iterator.
-
-  // RowSpan represents a horizontal span withing a single row.
-  struct RowSpan {
-    RowSpan(int32_t left, int32_t right);
-
-    // Used by std::vector<>.
-    bool operator==(const RowSpan& that) const {
-      return left == that.left && right == that.right;
-    }
-
-    int32_t left;
-    int32_t right;
-  };
-
-  typedef std::vector<RowSpan> RowSpanSet;
-
-  // Row represents a single row of a region. A row is set of rectangles that
-  // have the same vertical position.
-  struct Row {
-    Row(const Row&);
-    Row(Row&&);
-    Row(int32_t top, int32_t bottom);
-    ~Row();
-
-    int32_t top;
-    int32_t bottom;
-
-    RowSpanSet spans;
-  };
-
-  // Type used to store list of rows in the region. The bottom position of row
-  // is used as the key so that rows are always ordered by their position. The
-  // map stores pointers to make Translate() more efficient.
-  typedef std::map<int, Row*> Rows;
-
- public:
-  // Iterator that can be used to iterate over rectangles of a DesktopRegion.
-  // The region must not be mutated while the iterator is used.
-  class Iterator {
-   public:
-    explicit Iterator(const DesktopRegion& target);
-    ~Iterator();
-
-    bool IsAtEnd() const;
-    void Advance();
-
-    const DesktopRect& rect() const { return rect_; }
-
-   private:
-    const DesktopRegion& region_;
-
-    // Updates |rect_| based on the current |row_| and |row_span_|. If
-    // |row_span_| matches spans on consecutive rows then they are also merged
-    // into |rect_|, to generate more efficient output.
-    void UpdateCurrentRect();
-
-    Rows::const_iterator row_;
-    Rows::const_iterator previous_row_;
-    RowSpanSet::const_iterator row_span_;
-    DesktopRect rect_;
-  };
-
-  DesktopRegion();
-  explicit DesktopRegion(const DesktopRect& rect);
-  DesktopRegion(const DesktopRect* rects, int count);
-  DesktopRegion(const DesktopRegion& other);
-  ~DesktopRegion();
-
-  DesktopRegion& operator=(const DesktopRegion& other);
-
-  bool is_empty() const { return rows_.empty(); }
-
-  bool Equals(const DesktopRegion& region) const;
-
-  // Reset the region to be empty.
-  void Clear();
-
-  // Reset region to contain just |rect|.
-  void SetRect(const DesktopRect& rect);
-
-  // Adds specified rect(s) or region to the region.
-  void AddRect(const DesktopRect& rect);
-  void AddRects(const DesktopRect* rects, int count);
-  void AddRegion(const DesktopRegion& region);
-
-  // Finds intersection of two regions and stores them in the current region.
-  void Intersect(const DesktopRegion& region1, const DesktopRegion& region2);
-
-  // Same as above but intersects content of the current region with |region|.
-  void IntersectWith(const DesktopRegion& region);
-
-  // Clips the region by the |rect|.
-  void IntersectWith(const DesktopRect& rect);
-
-  // Subtracts |region| from the current content of the region.
-  void Subtract(const DesktopRegion& region);
-
-  // Subtracts |rect| from the current content of the region.
-  void Subtract(const DesktopRect& rect);
-
-  // Adds (dx, dy) to the position of the region.
-  void Translate(int32_t dx, int32_t dy);
-
-  void Swap(DesktopRegion* region);
-
- private:
-  // Comparison functions used for std::lower_bound(). Compare left or right
-  // edges withs a given |value|.
-  static bool CompareSpanLeft(const RowSpan& r, int32_t value);
-  static bool CompareSpanRight(const RowSpan& r, int32_t value);
-
-  // Adds a new span to the row, coalescing spans if necessary.
-  static void AddSpanToRow(Row* row, int32_t left, int32_t right);
-
-  // Returns true if the |span| exists in the given |row|.
-  static bool IsSpanInRow(const Row& row, const RowSpan& rect);
-
-  // Calculates the intersection of two sets of spans.
-  static void IntersectRows(const RowSpanSet& set1,
-                            const RowSpanSet& set2,
-                            RowSpanSet* output);
-
-  static void SubtractRows(const RowSpanSet& set_a,
-                           const RowSpanSet& set_b,
-                           RowSpanSet* output);
-
-  // Merges |row| with the row above it if they contain the same spans. Doesn't
-  // do anything if called with |row| set to rows_.begin() (i.e. first row of
-  // the region). If the rows were merged |row| remains a valid iterator to the
-  // merged row.
-  void MergeWithPrecedingRow(Rows::iterator row);
-
-  Rows rows_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_DESKTOP_CAPTURE_DESKTOP_REGION_H_
-
diff --git a/modules/desktop_capture/desktop_region_unittest.cc b/modules/desktop_capture/desktop_region_unittest.cc
deleted file mode 100644
index 16f8626..0000000
--- a/modules/desktop_capture/desktop_region_unittest.cc
+++ /dev/null
@@ -1,710 +0,0 @@
-/*
- *  Copyright (c) 2013 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/desktop_capture/desktop_region.h"
-
-#include <algorithm>
-
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-namespace {
-
-int RadmonInt(int max) {
-  return (rand() / 256) % max;
-}
-
-void CompareRegion(const DesktopRegion& region,
-                   const DesktopRect rects[], int rects_size) {
-  DesktopRegion::Iterator it(region);
-  for (int i = 0; i < rects_size; ++i) {
-    SCOPED_TRACE(i);
-    ASSERT_FALSE(it.IsAtEnd());
-    EXPECT_TRUE(it.rect().equals(rects[i]))
-        << it.rect().left() << "-" << it.rect().right() << "."
-        << it.rect().top() << "-" << it.rect().bottom() << " "
-        << rects[i].left() << "-" << rects[i].right() << "."
-        << rects[i].top() << "-" << rects[i].bottom();
-    it.Advance();
-  }
-  EXPECT_TRUE(it.IsAtEnd());
-}
-
-}  // namespace
-
-// Verify that regions are empty when created.
-TEST(DesktopRegionTest, Empty) {
-  DesktopRegion r;
-  CompareRegion(r, NULL, 0);
-}
-
-// Verify that empty rectangles are ignored.
-TEST(DesktopRegionTest, AddEmpty) {
-  DesktopRegion r;
-  DesktopRect rect = DesktopRect::MakeXYWH(1, 2, 0, 0);
-  r.AddRect(rect);
-  CompareRegion(r, NULL, 0);
-}
-
-// Verify that regions with a single rectangles are handled properly.
-TEST(DesktopRegionTest, SingleRect) {
-  DesktopRegion r;
-  DesktopRect rect = DesktopRect::MakeXYWH(1, 2, 3, 4);
-  r.AddRect(rect);
-  CompareRegion(r, &rect, 1);
-}
-
-// Verify that non-overlapping rectangles are not merged.
-TEST(DesktopRegionTest, NonOverlappingRects) {
-  struct Case {
-    int count;
-    DesktopRect rects[4];
-  } cases[] = {
-    { 1, { DesktopRect::MakeXYWH(10, 10, 10, 10) } },
-    { 2, { DesktopRect::MakeXYWH(10, 10, 10, 10),
-           DesktopRect::MakeXYWH(30, 10, 10, 15) } },
-    { 2, { DesktopRect::MakeXYWH(10, 10, 10, 10),
-           DesktopRect::MakeXYWH(10, 30, 10, 5) } },
-    { 3, { DesktopRect::MakeXYWH(10, 10, 10, 9),
-           DesktopRect::MakeXYWH(30, 10, 15, 10),
-           DesktopRect::MakeXYWH(10, 30, 8, 10) } },
-    { 4, { DesktopRect::MakeXYWH(0, 0, 30, 10),
-           DesktopRect::MakeXYWH(40, 0, 10, 30),
-           DesktopRect::MakeXYWH(0, 20, 10, 30),
-           DesktopRect::MakeXYWH(20, 40, 30, 10) } },
-    { 4, { DesktopRect::MakeXYWH(0, 0, 10, 100),
-           DesktopRect::MakeXYWH(20, 10, 30, 10),
-           DesktopRect::MakeXYWH(20, 30, 30, 10),
-           DesktopRect::MakeXYWH(20, 50, 30, 10) } },
-  };
-
-  for (size_t i = 0; i < (sizeof(cases) / sizeof(Case)); ++i) {
-    SCOPED_TRACE(i);
-
-    DesktopRegion r;
-
-    for (int j = 0; j < cases[i].count; ++j) {
-      r.AddRect(cases[i].rects[j]);
-    }
-    CompareRegion(r, cases[i].rects, cases[i].count);
-
-    SCOPED_TRACE("Reverse");
-
-    // Try inserting rects in reverse order.
-    r.Clear();
-    for (int j = cases[i].count - 1; j >= 0; --j) {
-      r.AddRect(cases[i].rects[j]);
-    }
-    CompareRegion(r, cases[i].rects, cases[i].count);
-  }
-}
-
-TEST(DesktopRegionTest, TwoRects) {
-  struct Case {
-    DesktopRect input_rect1;
-    DesktopRect input_rect2;
-    int expected_count;
-    DesktopRect expected_rects[3];
-  } cases[] = {
-    // Touching rectangles that merge into one.
-    { DesktopRect::MakeLTRB(100, 100, 200, 200),
-      DesktopRect::MakeLTRB(0, 100, 100, 200),
-      1, { DesktopRect::MakeLTRB(0, 100, 200, 200) } },
-    { DesktopRect::MakeLTRB(100, 100, 200, 200),
-      DesktopRect::MakeLTRB(100, 0, 200, 100),
-      1, { DesktopRect::MakeLTRB(100, 0, 200, 200) } },
-
-    // Rectangles touching on the vertical edge.
-    { DesktopRect::MakeLTRB(100, 100, 200, 200),
-      DesktopRect::MakeLTRB(0, 150, 100, 250),
-      3, { DesktopRect::MakeLTRB(100, 100, 200, 150),
-           DesktopRect::MakeLTRB(0, 150, 200, 200),
-           DesktopRect::MakeLTRB(0, 200, 100, 250) } },
-    { DesktopRect::MakeLTRB(100, 100, 200, 200),
-      DesktopRect::MakeLTRB(0, 50, 100, 150),
-      3, { DesktopRect::MakeLTRB(0, 50, 100, 100),
-           DesktopRect::MakeLTRB(0, 100, 200, 150),
-           DesktopRect::MakeLTRB(100, 150, 200, 200) } },
-    { DesktopRect::MakeLTRB(100, 100, 200, 200),
-      DesktopRect::MakeLTRB(0, 120, 100, 180),
-      3, { DesktopRect::MakeLTRB(100, 100, 200, 120),
-           DesktopRect::MakeLTRB(0, 120, 200, 180),
-           DesktopRect::MakeLTRB(100, 180, 200, 200) } },
-
-    // Rectangles touching on the horizontal edge.
-    { DesktopRect::MakeLTRB(100, 100, 200, 200),
-      DesktopRect::MakeLTRB(150, 0, 250, 100),
-      2, { DesktopRect::MakeLTRB(150, 0, 250, 100),
-           DesktopRect::MakeLTRB(100, 100, 200, 200) } },
-    { DesktopRect::MakeLTRB(100, 100, 200, 200),
-      DesktopRect::MakeLTRB(50, 0, 150, 100),
-      2, { DesktopRect::MakeLTRB(50, 0, 150, 100),
-           DesktopRect::MakeLTRB(100, 100, 200, 200) } },
-    { DesktopRect::MakeLTRB(100, 100, 200, 200),
-      DesktopRect::MakeLTRB(120, 0, 180, 100),
-      2, { DesktopRect::MakeLTRB(120, 0, 180, 100),
-           DesktopRect::MakeLTRB(100, 100, 200, 200) } },
-
-    // Overlapping rectangles.
-    { DesktopRect::MakeLTRB(100, 100, 200, 200),
-      DesktopRect::MakeLTRB(50, 50, 150, 150),
-      3, { DesktopRect::MakeLTRB(50, 50, 150, 100),
-           DesktopRect::MakeLTRB(50, 100, 200, 150),
-           DesktopRect::MakeLTRB(100, 150, 200, 200) } },
-    { DesktopRect::MakeLTRB(100, 100, 200, 200),
-      DesktopRect::MakeLTRB(150, 50, 250, 150),
-      3, { DesktopRect::MakeLTRB(150, 50, 250, 100),
-           DesktopRect::MakeLTRB(100, 100, 250, 150),
-           DesktopRect::MakeLTRB(100, 150, 200, 200) } },
-    { DesktopRect::MakeLTRB(100, 100, 200, 200),
-      DesktopRect::MakeLTRB(0, 120, 150, 180),
-      3, { DesktopRect::MakeLTRB(100, 100, 200, 120),
-           DesktopRect::MakeLTRB(0, 120, 200, 180),
-           DesktopRect::MakeLTRB(100, 180, 200, 200) } },
-    { DesktopRect::MakeLTRB(100, 100, 200, 200),
-      DesktopRect::MakeLTRB(120, 0, 180, 150),
-      2, { DesktopRect::MakeLTRB(120, 0, 180, 100),
-           DesktopRect::MakeLTRB(100, 100, 200, 200) } },
-    { DesktopRect::MakeLTRB(100, 0, 200, 300),
-      DesktopRect::MakeLTRB(0, 100, 300, 200),
-      3, { DesktopRect::MakeLTRB(100, 0, 200, 100),
-           DesktopRect::MakeLTRB(0, 100, 300, 200),
-           DesktopRect::MakeLTRB(100, 200, 200, 300)} },
-
-    // One rectangle enclosing another.
-    { DesktopRect::MakeLTRB(100, 100, 200, 200),
-      DesktopRect::MakeLTRB(150, 150, 180, 180),
-      1, { DesktopRect::MakeLTRB(100, 100, 200, 200) } },
-    { DesktopRect::MakeLTRB(100, 100, 200, 200),
-      DesktopRect::MakeLTRB(100, 100, 180, 180),
-      1, { DesktopRect::MakeLTRB(100, 100, 200, 200) } },
-    { DesktopRect::MakeLTRB(100, 100, 200, 200),
-      DesktopRect::MakeLTRB(150, 150, 200, 200),
-      1, { DesktopRect::MakeLTRB(100, 100, 200, 200) } },
-  };
-
-  for (size_t i = 0; i < (sizeof(cases) / sizeof(Case)); ++i) {
-    SCOPED_TRACE(i);
-
-    DesktopRegion r;
-
-    r.AddRect(cases[i].input_rect1);
-    r.AddRect(cases[i].input_rect2);
-    CompareRegion(r, cases[i].expected_rects, cases[i].expected_count);
-
-    SCOPED_TRACE("Reverse");
-
-    // Run the same test with rectangles inserted in reverse order.
-    r.Clear();
-    r.AddRect(cases[i].input_rect2);
-    r.AddRect(cases[i].input_rect1);
-    CompareRegion(r, cases[i].expected_rects, cases[i].expected_count);
-  }
-}
-
-// Verify that DesktopRegion::AddRectToRow() works correctly by creating a row
-// of not overlapping rectangles and insert an overlapping rectangle into the
-// row at different positions. Result is verified by building a map of the
-// region in an array and comparing it with the expected values.
-TEST(DesktopRegionTest, SameRow) {
-  const int kMapWidth = 50;
-  const int kLastRectSizes[] = {3, 27};
-
-  DesktopRegion base_region;
-  bool base_map[kMapWidth] = { false, };
-
-  base_region.AddRect(DesktopRect::MakeXYWH(5, 0, 5, 1));
-  std::fill_n(base_map + 5, 5, true);
-  base_region.AddRect(DesktopRect::MakeXYWH(15, 0, 5, 1));
-  std::fill_n(base_map + 15, 5, true);
-  base_region.AddRect(DesktopRect::MakeXYWH(25, 0, 5, 1));
-  std::fill_n(base_map + 25, 5, true);
-  base_region.AddRect(DesktopRect::MakeXYWH(35, 0, 5, 1));
-  std::fill_n(base_map + 35, 5, true);
-  base_region.AddRect(DesktopRect::MakeXYWH(45, 0, 5, 1));
-  std::fill_n(base_map + 45, 5, true);
-
-  for (size_t i = 0; i < sizeof(kLastRectSizes) / sizeof(kLastRectSizes[0]);
-       i++) {
-    int last_rect_size = kLastRectSizes[i];
-    for (int x = 0; x < kMapWidth - last_rect_size; x++) {
-      SCOPED_TRACE(x);
-
-      DesktopRegion r = base_region;
-      r.AddRect(DesktopRect::MakeXYWH(x, 0,  last_rect_size, 1));
-
-      bool expected_map[kMapWidth];
-      std::copy(base_map, base_map + kMapWidth, expected_map);
-      std::fill_n(expected_map + x, last_rect_size, true);
-
-      bool map[kMapWidth] = { false, };
-
-      int pos = -1;
-      for (DesktopRegion::Iterator it(r); !it.IsAtEnd(); it.Advance()) {
-        EXPECT_GT(it.rect().left(), pos);
-        pos = it.rect().right();
-        std::fill_n(map + it.rect().left(), it.rect().width(), true);
-      }
-
-      EXPECT_TRUE(std::equal(map, map + kMapWidth, expected_map));
-    }
-  }
-}
-
-TEST(DesktopRegionTest, ComplexRegions) {
-  struct Case {
-    int input_count;
-    DesktopRect input_rects[4];
-    int expected_count;
-    DesktopRect expected_rects[6];
-  } cases[] = {
-    { 3, { DesktopRect::MakeLTRB(100, 100, 200, 200),
-           DesktopRect::MakeLTRB(0, 100, 100, 200),
-           DesktopRect::MakeLTRB(310, 110, 320, 120), },
-      2, { DesktopRect::MakeLTRB(0, 100, 200, 200),
-           DesktopRect::MakeLTRB(310, 110, 320, 120) } },
-    { 3, { DesktopRect::MakeLTRB(100, 100, 200, 200),
-           DesktopRect::MakeLTRB(50, 50, 150, 150),
-           DesktopRect::MakeLTRB(300, 125, 350, 175) },
-      4, { DesktopRect::MakeLTRB(50, 50, 150, 100),
-           DesktopRect::MakeLTRB(50, 100, 200, 150),
-           DesktopRect::MakeLTRB(300, 125, 350, 175),
-           DesktopRect::MakeLTRB(100, 150, 200, 200) } },
-    { 4, { DesktopRect::MakeLTRB(0, 0, 30, 30),
-           DesktopRect::MakeLTRB(10, 10, 40, 40),
-           DesktopRect::MakeLTRB(20, 20, 50, 50),
-           DesktopRect::MakeLTRB(50, 0, 65, 15) },
-      6, { DesktopRect::MakeLTRB(0, 0, 30, 10),
-           DesktopRect::MakeLTRB(50, 0, 65, 15),
-           DesktopRect::MakeLTRB(0, 10, 40, 20),
-           DesktopRect::MakeLTRB(0, 20, 50, 30),
-           DesktopRect::MakeLTRB(10, 30, 50, 40),
-           DesktopRect::MakeLTRB(20, 40, 50, 50) } },
-    { 3, { DesktopRect::MakeLTRB(10, 10, 40, 20),
-           DesktopRect::MakeLTRB(10, 30, 40, 40),
-           DesktopRect::MakeLTRB(10, 20, 40, 30) },
-      1, { DesktopRect::MakeLTRB(10, 10, 40, 40) } },
-  };
-
-  for (size_t i = 0; i < (sizeof(cases) / sizeof(Case)); ++i) {
-    SCOPED_TRACE(i);
-
-    DesktopRegion r;
-    r.AddRects(cases[i].input_rects, cases[i].input_count);
-    CompareRegion(r, cases[i].expected_rects, cases[i].expected_count);
-
-    // Try inserting rectangles in reverse order.
-    r.Clear();
-    for (int j = cases[i].input_count - 1; j >= 0; --j) {
-      r.AddRect(cases[i].input_rects[j]);
-    }
-    CompareRegion(r, cases[i].expected_rects, cases[i].expected_count);
-  }
-}
-
-TEST(DesktopRegionTest, Equals) {
-  struct Region {
-    int count;
-    DesktopRect rects[4];
-    int id;
-  } regions[] = {
-    // Same region with one of the rectangles 1 pixel wider/taller.
-    { 2, { DesktopRect::MakeLTRB(0, 100, 200, 200),
-           DesktopRect::MakeLTRB(310, 110, 320, 120) }, 0 },
-    { 2, { DesktopRect::MakeLTRB(0, 100, 201, 200),
-           DesktopRect::MakeLTRB(310, 110, 320, 120) }, 1 },
-    { 2, { DesktopRect::MakeLTRB(0, 100, 200, 201),
-           DesktopRect::MakeLTRB(310, 110, 320, 120) }, 2 },
-
-    // Same region with one of the rectangles shifted horizontally and
-    // vertically.
-    { 4, { DesktopRect::MakeLTRB(0, 0, 30, 30),
-           DesktopRect::MakeLTRB(10, 10, 40, 40),
-           DesktopRect::MakeLTRB(20, 20, 50, 50),
-           DesktopRect::MakeLTRB(50, 0, 65, 15) }, 3 },
-    { 4, { DesktopRect::MakeLTRB(0, 0, 30, 30),
-           DesktopRect::MakeLTRB(10, 10, 40, 40),
-           DesktopRect::MakeLTRB(20, 20, 50, 50),
-           DesktopRect::MakeLTRB(50, 1, 65, 16) }, 4 },
-    { 4, { DesktopRect::MakeLTRB(0, 0, 30, 30),
-           DesktopRect::MakeLTRB(10, 10, 40, 40),
-           DesktopRect::MakeLTRB(20, 20, 50, 50),
-           DesktopRect::MakeLTRB(51, 0, 66, 15) }, 5 },
-
-    // Same region defined by a different set of rectangles - one of the
-    // rectangle is split horizontally into two.
-    { 3, { DesktopRect::MakeLTRB(100, 100, 200, 200),
-           DesktopRect::MakeLTRB(50, 50, 150, 150),
-           DesktopRect::MakeLTRB(300, 125, 350, 175) }, 6 },
-    { 4, { DesktopRect::MakeLTRB(100, 100, 200, 200),
-           DesktopRect::MakeLTRB(50, 50, 100, 150),
-           DesktopRect::MakeLTRB(100, 50, 150, 150),
-           DesktopRect::MakeLTRB(300, 125, 350, 175) }, 6 },
-
-    // Rectangle region defined by a set of rectangles that merge into one.
-    { 3, { DesktopRect::MakeLTRB(10, 10, 40, 20),
-           DesktopRect::MakeLTRB(10, 30, 40, 40),
-           DesktopRect::MakeLTRB(10, 20, 40, 30) }, 7 },
-    { 1, { DesktopRect::MakeLTRB(10, 10, 40, 40) }, 7 },
-  };
-  int kTotalRegions = sizeof(regions) / sizeof(Region);
-
-  for (int i = 0; i < kTotalRegions; ++i) {
-    SCOPED_TRACE(i);
-
-    DesktopRegion r1(regions[i].rects, regions[i].count);
-    for (int j = 0; j < kTotalRegions; ++j) {
-      SCOPED_TRACE(j);
-
-      DesktopRegion r2(regions[j].rects, regions[j].count);
-      EXPECT_EQ(regions[i].id == regions[j].id, r1.Equals(r2));
-    }
-  }
-}
-
-TEST(DesktopRegionTest, Translate) {
-  struct Case {
-    int input_count;
-    DesktopRect input_rects[4];
-    int dx;
-    int dy;
-    int expected_count;
-    DesktopRect expected_rects[5];
-  } cases[] = {
-    { 3, { DesktopRect::MakeLTRB(0, 0, 30, 30),
-           DesktopRect::MakeLTRB(10, 10, 40, 40),
-           DesktopRect::MakeLTRB(20, 20, 50, 50) },
-      3, 5,
-      5, { DesktopRect::MakeLTRB(3, 5, 33, 15),
-           DesktopRect::MakeLTRB(3, 15, 43, 25),
-           DesktopRect::MakeLTRB(3, 25, 53, 35),
-           DesktopRect::MakeLTRB(13, 35, 53, 45),
-           DesktopRect::MakeLTRB(23, 45, 53, 55) } },
-  };
-
-  for (size_t i = 0; i < (sizeof(cases) / sizeof(Case)); ++i) {
-    SCOPED_TRACE(i);
-
-    DesktopRegion r(cases[i].input_rects, cases[i].input_count);
-    r.Translate(cases[i].dx, cases[i].dy);
-    CompareRegion(r, cases[i].expected_rects, cases[i].expected_count);
-  }
-}
-
-TEST(DesktopRegionTest, Intersect) {
-  struct Case {
-    int input1_count;
-    DesktopRect input1_rects[4];
-    int input2_count;
-    DesktopRect input2_rects[4];
-    int expected_count;
-    DesktopRect expected_rects[5];
-  } cases[] = {
-    { 1, { DesktopRect::MakeLTRB(0, 0, 100, 100) },
-      1, { DesktopRect::MakeLTRB(50, 50, 150, 150) },
-      1, { DesktopRect::MakeLTRB(50, 50, 100, 100) } },
-
-    { 1, { DesktopRect::MakeLTRB(100, 0, 200, 300) },
-      1, { DesktopRect::MakeLTRB(0, 100, 300, 200) },
-      1, { DesktopRect::MakeLTRB(100, 100, 200, 200) } },
-
-    { 1, { DesktopRect::MakeLTRB(0, 0, 100, 100) },
-      2, { DesktopRect::MakeLTRB(50, 10, 150, 30),
-           DesktopRect::MakeLTRB(50, 30, 160, 50) },
-      1, { DesktopRect::MakeLTRB(50, 10, 100, 50) } },
-
-    { 1, { DesktopRect::MakeLTRB(0, 0, 100, 100) },
-      2, { DesktopRect::MakeLTRB(50, 10, 150, 30),
-           DesktopRect::MakeLTRB(50, 30,  90, 50) },
-      2, { DesktopRect::MakeLTRB(50, 10, 100, 30),
-           DesktopRect::MakeLTRB(50, 30, 90, 50) } },
-    { 1, { DesktopRect::MakeLTRB(0, 0, 100, 100) },
-      1, { DesktopRect::MakeLTRB(100, 50, 200, 200) },
-      0, {} },
-  };
-
-  for (size_t i = 0; i < (sizeof(cases) / sizeof(Case)); ++i) {
-    SCOPED_TRACE(i);
-
-    DesktopRegion r1(cases[i].input1_rects, cases[i].input1_count);
-    DesktopRegion r2(cases[i].input2_rects, cases[i].input2_count);
-
-    DesktopRegion r;
-    r.Intersect(r1, r2);
-
-    CompareRegion(r, cases[i].expected_rects, cases[i].expected_count);
-  }
-}
-
-TEST(DesktopRegionTest, Subtract) {
-  struct Case {
-    int input1_count;
-    DesktopRect input1_rects[4];
-    int input2_count;
-    DesktopRect input2_rects[4];
-    int expected_count;
-    DesktopRect expected_rects[5];
-  } cases[] = {
-    // Subtract one rect from another.
-    { 1, { DesktopRect::MakeLTRB(0, 0, 100, 100) },
-      1, { DesktopRect::MakeLTRB(50, 50, 150, 150) },
-      2, { DesktopRect::MakeLTRB(0, 0, 100, 50),
-           DesktopRect::MakeLTRB(0, 50, 50, 100)  } },
-
-    { 1, { DesktopRect::MakeLTRB(0, 0, 100, 100) },
-      1, { DesktopRect::MakeLTRB(-50, -50, 50, 50) },
-      2, { DesktopRect::MakeLTRB(50, 0, 100, 50),
-           DesktopRect::MakeLTRB(0, 50, 100, 100)  } },
-
-    { 1, { DesktopRect::MakeLTRB(0, 0, 100, 100) },
-      1, { DesktopRect::MakeLTRB(-50, 50, 50, 150) },
-      2, { DesktopRect::MakeLTRB(0, 0, 100, 50),
-           DesktopRect::MakeLTRB(50, 50, 100, 100)  } },
-
-    { 1, { DesktopRect::MakeLTRB(0, 0, 100, 100) },
-      1, { DesktopRect::MakeLTRB(50, 50, 150, 70) },
-      3, { DesktopRect::MakeLTRB(0, 0, 100, 50),
-           DesktopRect::MakeLTRB(0, 50, 50, 70),
-           DesktopRect::MakeLTRB(0, 70, 100, 100) } },
-
-    { 1, { DesktopRect::MakeLTRB(0, 0, 100, 100) },
-      1, { DesktopRect::MakeLTRB(50, 50, 70, 70) },
-      4, { DesktopRect::MakeLTRB(0, 0, 100, 50),
-           DesktopRect::MakeLTRB(0, 50, 50, 70),
-           DesktopRect::MakeLTRB(70, 50, 100, 70),
-           DesktopRect::MakeLTRB(0, 70, 100, 100) } },
-
-    // Empty result.
-    { 1, { DesktopRect::MakeLTRB(0, 0, 100, 100) },
-      1, { DesktopRect::MakeLTRB(0, 0, 100, 100) },
-      0, {} },
-
-    { 1, { DesktopRect::MakeLTRB(0, 0, 100, 100) },
-      1, { DesktopRect::MakeLTRB(-10, -10, 110, 110) },
-      0, {} },
-
-    { 2, { DesktopRect::MakeLTRB(0, 0, 100, 100),
-           DesktopRect::MakeLTRB(50, 50, 150, 150) },
-      2, { DesktopRect::MakeLTRB(0, 0, 100, 100),
-           DesktopRect::MakeLTRB(50, 50, 150, 150) },
-      0, {} },
-
-    // One rect out of disjoint set.
-    { 3, { DesktopRect::MakeLTRB(0, 0, 10, 10),
-           DesktopRect::MakeLTRB(20, 20, 30, 30),
-           DesktopRect::MakeLTRB(40, 0, 50, 10) },
-      1, { DesktopRect::MakeLTRB(20, 20, 30, 30) },
-      2, { DesktopRect::MakeLTRB(0, 0, 10, 10),
-           DesktopRect::MakeLTRB(40, 0, 50, 10) } },
-
-    // Row merging.
-    { 3, { DesktopRect::MakeLTRB(0, 0, 100, 50),
-           DesktopRect::MakeLTRB(0, 50, 150, 70),
-           DesktopRect::MakeLTRB(0, 70, 100, 100) },
-      1, { DesktopRect::MakeLTRB(100, 50, 150, 70) },
-      1, { DesktopRect::MakeLTRB(0, 0, 100, 100) } },
-
-    // No-op subtraction.
-    { 1, { DesktopRect::MakeLTRB(0, 0, 100, 100) },
-      1, { DesktopRect::MakeLTRB(100, 0, 200, 100) },
-      1, { DesktopRect::MakeLTRB(0, 0, 100, 100) } },
-
-    { 1, { DesktopRect::MakeLTRB(0, 0, 100, 100) },
-      1, { DesktopRect::MakeLTRB(-100, 0, 0, 100) },
-      1, { DesktopRect::MakeLTRB(0, 0, 100, 100) } },
-
-    { 1, { DesktopRect::MakeLTRB(0, 0, 100, 100) },
-      1, { DesktopRect::MakeLTRB(0, 100, 0, 200) },
-      1, { DesktopRect::MakeLTRB(0, 0, 100, 100) } },
-
-    { 1, { DesktopRect::MakeLTRB(0, 0, 100, 100) },
-      1, { DesktopRect::MakeLTRB(0, -100, 100, 0) },
-      1, { DesktopRect::MakeLTRB(0, 0, 100, 100) } },
-  };
-
-  for (size_t i = 0; i < (sizeof(cases) / sizeof(Case)); ++i) {
-    SCOPED_TRACE(i);
-
-    DesktopRegion r1(cases[i].input1_rects, cases[i].input1_count);
-    DesktopRegion r2(cases[i].input2_rects, cases[i].input2_count);
-
-    r1.Subtract(r2);
-
-    CompareRegion(r1, cases[i].expected_rects, cases[i].expected_count);
-  }
-}
-
-// Verify that DesktopRegion::SubtractRows() works correctly by creating a row
-// of not overlapping rectangles and subtracting a set of rectangle. Result
-// is verified by building a map of the region in an array and comparing it with
-// the expected values.
-TEST(DesktopRegionTest, SubtractRectOnSameRow) {
-  const int kMapWidth = 50;
-
-  struct SpanSet {
-    int count;
-    struct Range {
-     int start;
-     int end;
-    } spans[3];
-  } span_sets[] = {
-    {1, { {0, 3} } },
-    {1, { {0, 5} } },
-    {1, { {0, 7} } },
-    {1, { {0, 12} } },
-    {2, { {0, 3}, {4, 5}, {6, 16} } },
-  };
-
-  DesktopRegion base_region;
-  bool base_map[kMapWidth] = { false, };
-
-  base_region.AddRect(DesktopRect::MakeXYWH(5, 0, 5, 1));
-  std::fill_n(base_map + 5, 5, true);
-  base_region.AddRect(DesktopRect::MakeXYWH(15, 0, 5, 1));
-  std::fill_n(base_map + 15, 5, true);
-  base_region.AddRect(DesktopRect::MakeXYWH(25, 0, 5, 1));
-  std::fill_n(base_map + 25, 5, true);
-  base_region.AddRect(DesktopRect::MakeXYWH(35, 0, 5, 1));
-  std::fill_n(base_map + 35, 5, true);
-  base_region.AddRect(DesktopRect::MakeXYWH(45, 0, 5, 1));
-  std::fill_n(base_map + 45, 5, true);
-
-  for (size_t i = 0; i < sizeof(span_sets) / sizeof(span_sets[0]); i++) {
-    SCOPED_TRACE(i);
-    SpanSet& span_set = span_sets[i];
-    int span_set_end = span_set.spans[span_set.count - 1].end;
-    for (int x = 0; x < kMapWidth - span_set_end; ++x) {
-      SCOPED_TRACE(x);
-
-      DesktopRegion r = base_region;
-
-      bool expected_map[kMapWidth];
-      std::copy(base_map, base_map + kMapWidth, expected_map);
-
-      DesktopRegion region2;
-      for (int span = 0; span < span_set.count; span++) {
-        std::fill_n(x + expected_map + span_set.spans[span].start,
-                    span_set.spans[span].end - span_set.spans[span].start,
-                    false);
-        region2.AddRect(DesktopRect::MakeLTRB(x + span_set.spans[span].start, 0,
-                                              x + span_set.spans[span].end, 1));
-      }
-      r.Subtract(region2);
-
-      bool map[kMapWidth] = { false, };
-
-      int pos = -1;
-      for (DesktopRegion::Iterator it(r); !it.IsAtEnd(); it.Advance()) {
-        EXPECT_GT(it.rect().left(), pos);
-        pos = it.rect().right();
-        std::fill_n(map + it.rect().left(), it.rect().width(), true);
-      }
-
-      EXPECT_TRUE(std::equal(map, map + kMapWidth, expected_map));
-    }
-  }
-}
-
-// Verify that DesktopRegion::Subtract() works correctly by creating a column of
-// not overlapping rectangles and subtracting a set of rectangle on the same
-// column. Result is verified by building a map of the region in an array and
-// comparing it with the expected values.
-TEST(DesktopRegionTest, SubtractRectOnSameCol) {
-  const int kMapHeight = 50;
-
-  struct SpanSet {
-    int count;
-    struct Range {
-     int start;
-     int end;
-    } spans[3];
-  } span_sets[] = {
-    {1, { {0, 3} } },
-    {1, { {0, 5} } },
-    {1, { {0, 7} } },
-    {1, { {0, 12} } },
-    {2, { {0, 3}, {4, 5}, {6, 16} } },
-  };
-
-  DesktopRegion base_region;
-  bool base_map[kMapHeight] = { false, };
-
-  base_region.AddRect(DesktopRect::MakeXYWH(0, 5, 1, 5));
-  std::fill_n(base_map + 5, 5, true);
-  base_region.AddRect(DesktopRect::MakeXYWH(0, 15, 1, 5));
-  std::fill_n(base_map + 15, 5, true);
-  base_region.AddRect(DesktopRect::MakeXYWH(0, 25, 1, 5));
-  std::fill_n(base_map + 25, 5, true);
-  base_region.AddRect(DesktopRect::MakeXYWH(0, 35, 1, 5));
-  std::fill_n(base_map + 35, 5, true);
-  base_region.AddRect(DesktopRect::MakeXYWH(0, 45, 1, 5));
-  std::fill_n(base_map + 45, 5, true);
-
-  for (size_t i = 0; i < sizeof(span_sets) / sizeof(span_sets[0]); i++) {
-    SCOPED_TRACE(i);
-    SpanSet& span_set = span_sets[i];
-    int span_set_end = span_set.spans[span_set.count - 1].end;
-    for (int y = 0; y < kMapHeight - span_set_end; ++y) {
-      SCOPED_TRACE(y);
-
-      DesktopRegion r = base_region;
-
-      bool expected_map[kMapHeight];
-      std::copy(base_map, base_map + kMapHeight, expected_map);
-
-      DesktopRegion region2;
-      for (int span = 0; span < span_set.count; span++) {
-        std::fill_n(y + expected_map + span_set.spans[span].start,
-                    span_set.spans[span].end - span_set.spans[span].start,
-                    false);
-        region2.AddRect(DesktopRect::MakeLTRB(0, y + span_set.spans[span].start,
-                                              1, y + span_set.spans[span].end));
-      }
-      r.Subtract(region2);
-
-      bool map[kMapHeight] = { false, };
-
-      int pos = -1;
-      for (DesktopRegion::Iterator it(r); !it.IsAtEnd(); it.Advance()) {
-        EXPECT_GT(it.rect().top(), pos);
-        pos = it.rect().bottom();
-        std::fill_n(map + it.rect().top(), it.rect().height(), true);
-      }
-
-      for (int j = 0; j < kMapHeight; j++) {
-        EXPECT_EQ(expected_map[j], map[j]) << "j = " << j;
-      }
-    }
-  }
-}
-
-
-TEST(DesktopRegionTest, DISABLED_Performance) {
-  for (int c = 0; c < 1000; ++c) {
-    DesktopRegion r;
-    for (int i = 0; i < 10; ++i) {
-      r.AddRect(DesktopRect::MakeXYWH(
-          RadmonInt(1000), RadmonInt(1000), 200, 200));
-    }
-
-    for (int i = 0; i < 1000; ++i) {
-      r.AddRect(DesktopRect::MakeXYWH(
-          RadmonInt(1000), RadmonInt(1000),
-          5 + RadmonInt(10) * 5, 5 + RadmonInt(10) * 5));
-    }
-
-    // Iterate over the rectangles.
-    for (DesktopRegion::Iterator it(r); !it.IsAtEnd(); it.Advance()) {
-    }
-  }
-}
-
-}  // namespace webrtc
diff --git a/modules/desktop_capture/differ_block.cc b/modules/desktop_capture/differ_block.cc
deleted file mode 100644
index cf2299f..0000000
--- a/modules/desktop_capture/differ_block.cc
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- *  Copyright (c) 2013 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/desktop_capture/differ_block.h"
-
-#include <string.h>
-
-#include "webrtc/typedefs.h"
-#include "webrtc/modules/desktop_capture/differ_vector_sse2.h"
-#include "webrtc/system_wrappers/include/cpu_features_wrapper.h"
-
-namespace webrtc {
-
-namespace {
-
-bool VectorDifference_C(const uint8_t* image1, const uint8_t* image2) {
-  return memcmp(image1, image2, kBlockSize * kBytesPerPixel) != 0;
-}
-
-}  // namespace
-
-bool VectorDifference(const uint8_t* image1, const uint8_t* image2) {
-  static bool (*diff_proc)(const uint8_t*, const uint8_t*) = nullptr;
-
-  if (!diff_proc) {
-#if defined(WEBRTC_ARCH_ARM_FAMILY) || defined(WEBRTC_ARCH_MIPS_FAMILY)
-    // For ARM and MIPS processors, always use C version.
-    // TODO(hclam): Implement a NEON version.
-    diff_proc = &VectorDifference_C;
-#else
-    bool have_sse2 = WebRtc_GetCPUInfo(kSSE2) != 0;
-    // For x86 processors, check if SSE2 is supported.
-    if (have_sse2 && kBlockSize == 32) {
-      diff_proc = &VectorDifference_SSE2_W32;
-    } else if (have_sse2 && kBlockSize == 16) {
-      diff_proc = &VectorDifference_SSE2_W16;
-    } else {
-      diff_proc = &VectorDifference_C;
-    }
-#endif
-  }
-
-  return diff_proc(image1, image2);
-}
-
-bool BlockDifference(const uint8_t* image1,
-                     const uint8_t* image2,
-                     int height,
-                     int stride) {
-  for (int i = 0; i < height; i++) {
-    if (VectorDifference(image1, image2)) {
-      return true;
-    }
-    image1 += stride;
-    image2 += stride;
-  }
-  return false;
-}
-
-bool BlockDifference(const uint8_t* image1, const uint8_t* image2, int stride) {
-  return BlockDifference(image1, image2, kBlockSize, stride);
-}
-
-}  // namespace webrtc
diff --git a/modules/desktop_capture/differ_block.h b/modules/desktop_capture/differ_block.h
deleted file mode 100644
index 97fe3bc..0000000
--- a/modules/desktop_capture/differ_block.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- *  Copyright (c) 2013 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_DESKTOP_CAPTURE_DIFFER_BLOCK_H_
-#define WEBRTC_MODULES_DESKTOP_CAPTURE_DIFFER_BLOCK_H_
-
-#include <stdint.h>
-
-namespace webrtc {
-
-// Size (in pixels) of each square block used for diffing. This must be a
-// multiple of sizeof(uint64)/8.
-const int kBlockSize = 32;
-
-// Format: BGRA 32 bit.
-const int kBytesPerPixel = 4;
-
-// Low level function to compare 2 vectors of pixels of size kBlockSize. Returns
-// whether the blocks differ.
-bool VectorDifference(const uint8_t* image1, const uint8_t* image2);
-
-// Low level function to compare 2 blocks of pixels of size
-// (kBlockSize, |height|).  Returns whether the blocks differ.
-bool BlockDifference(const uint8_t* image1,
-                     const uint8_t* image2,
-                     int height,
-                     int stride);
-
-// Low level function to compare 2 blocks of pixels of size
-// (kBlockSize, kBlockSize).  Returns whether the blocks differ.
-bool BlockDifference(const uint8_t* image1,
-                     const uint8_t* image2,
-                     int stride);
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_DESKTOP_CAPTURE_DIFFER_BLOCK_H_
diff --git a/modules/desktop_capture/differ_block_unittest.cc b/modules/desktop_capture/differ_block_unittest.cc
deleted file mode 100644
index cfee667..0000000
--- a/modules/desktop_capture/differ_block_unittest.cc
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- *  Copyright (c) 2013 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/desktop_capture/differ_block.h"
-#include "webrtc/test/gmock.h"
-
-namespace webrtc {
-
-// Run 900 times to mimic 1280x720.
-// TODO(fbarchard): Remove benchmark once performance is non-issue.
-static const int kTimesToRun = 900;
-
-static void GenerateData(uint8_t* data, int size) {
-  for (int i = 0; i < size; ++i) {
-    data[i] = i;
-  }
-}
-
-// Memory buffer large enough for 2 blocks aligned to 16 bytes.
-static const int kSizeOfBlock = kBlockSize * kBlockSize * kBytesPerPixel;
-uint8_t block_buffer[kSizeOfBlock * 2 + 16];
-
-void PrepareBuffers(uint8_t* &block1, uint8_t* &block2) {
-  block1 = reinterpret_cast<uint8_t*>
-      ((reinterpret_cast<uintptr_t>(&block_buffer[0]) + 15) & ~15);
-  GenerateData(block1, kSizeOfBlock);
-  block2 = block1 + kSizeOfBlock;
-  memcpy(block2, block1, kSizeOfBlock);
-}
-
-TEST(BlockDifferenceTestSame, BlockDifference) {
-  uint8_t* block1;
-  uint8_t* block2;
-  PrepareBuffers(block1, block2);
-
-  // These blocks should match.
-  for (int i = 0; i < kTimesToRun; ++i) {
-    int result = BlockDifference(block1, block2, kBlockSize * kBytesPerPixel);
-    EXPECT_EQ(0, result);
-  }
-}
-
-TEST(BlockDifferenceTestLast, BlockDifference) {
-  uint8_t* block1;
-  uint8_t* block2;
-  PrepareBuffers(block1, block2);
-  block2[kSizeOfBlock-2] += 1;
-
-  for (int i = 0; i < kTimesToRun; ++i) {
-    int result = BlockDifference(block1, block2, kBlockSize * kBytesPerPixel);
-    EXPECT_EQ(1, result);
-  }
-}
-
-TEST(BlockDifferenceTestMid, BlockDifference) {
-  uint8_t* block1;
-  uint8_t* block2;
-  PrepareBuffers(block1, block2);
-  block2[kSizeOfBlock/2+1] += 1;
-
-  for (int i = 0; i < kTimesToRun; ++i) {
-    int result = BlockDifference(block1, block2, kBlockSize * kBytesPerPixel);
-    EXPECT_EQ(1, result);
-  }
-}
-
-TEST(BlockDifferenceTestFirst, BlockDifference) {
-  uint8_t* block1;
-  uint8_t* block2;
-  PrepareBuffers(block1, block2);
-  block2[0] += 1;
-
-  for (int i = 0; i < kTimesToRun; ++i) {
-    int result = BlockDifference(block1, block2, kBlockSize * kBytesPerPixel);
-    EXPECT_EQ(1, result);
-  }
-}
-
-}  // namespace webrtc
diff --git a/modules/desktop_capture/differ_vector_sse2.cc b/modules/desktop_capture/differ_vector_sse2.cc
deleted file mode 100644
index ce6cc29..0000000
--- a/modules/desktop_capture/differ_vector_sse2.cc
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- *  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/desktop_capture/differ_vector_sse2.h"
-
-#if defined(_MSC_VER)
-#include <intrin.h>
-#else
-#include <mmintrin.h>
-#include <emmintrin.h>
-#endif
-
-namespace webrtc {
-
-extern bool VectorDifference_SSE2_W16(const uint8_t* image1,
-                                      const uint8_t* image2) {
-  __m128i acc = _mm_setzero_si128();
-  __m128i v0;
-  __m128i v1;
-  __m128i sad;
-  const __m128i* i1 = reinterpret_cast<const __m128i*>(image1);
-  const __m128i* i2 = reinterpret_cast<const __m128i*>(image2);
-  v0 = _mm_loadu_si128(i1);
-  v1 = _mm_loadu_si128(i2);
-  sad = _mm_sad_epu8(v0, v1);
-  acc = _mm_adds_epu16(acc, sad);
-  v0 = _mm_loadu_si128(i1 + 1);
-  v1 = _mm_loadu_si128(i2 + 1);
-  sad = _mm_sad_epu8(v0, v1);
-  acc = _mm_adds_epu16(acc, sad);
-  v0 = _mm_loadu_si128(i1 + 2);
-  v1 = _mm_loadu_si128(i2 + 2);
-  sad = _mm_sad_epu8(v0, v1);
-  acc = _mm_adds_epu16(acc, sad);
-  v0 = _mm_loadu_si128(i1 + 3);
-  v1 = _mm_loadu_si128(i2 + 3);
-  sad = _mm_sad_epu8(v0, v1);
-  acc = _mm_adds_epu16(acc, sad);
-
-  // This essential means sad = acc >> 64. We only care about the lower 16
-  // bits.
-  sad = _mm_shuffle_epi32(acc, 0xEE);
-  sad = _mm_adds_epu16(sad, acc);
-  return _mm_cvtsi128_si32(sad) != 0;
-}
-
-extern bool VectorDifference_SSE2_W32(const uint8_t* image1,
-                                      const uint8_t* image2) {
-  __m128i acc = _mm_setzero_si128();
-  __m128i v0;
-  __m128i v1;
-  __m128i sad;
-  const __m128i* i1 = reinterpret_cast<const __m128i*>(image1);
-  const __m128i* i2 = reinterpret_cast<const __m128i*>(image2);
-  v0 = _mm_loadu_si128(i1);
-  v1 = _mm_loadu_si128(i2);
-  sad = _mm_sad_epu8(v0, v1);
-  acc = _mm_adds_epu16(acc, sad);
-  v0 = _mm_loadu_si128(i1 + 1);
-  v1 = _mm_loadu_si128(i2 + 1);
-  sad = _mm_sad_epu8(v0, v1);
-  acc = _mm_adds_epu16(acc, sad);
-  v0 = _mm_loadu_si128(i1 + 2);
-  v1 = _mm_loadu_si128(i2 + 2);
-  sad = _mm_sad_epu8(v0, v1);
-  acc = _mm_adds_epu16(acc, sad);
-  v0 = _mm_loadu_si128(i1 + 3);
-  v1 = _mm_loadu_si128(i2 + 3);
-  sad = _mm_sad_epu8(v0, v1);
-  acc = _mm_adds_epu16(acc, sad);
-  v0 = _mm_loadu_si128(i1 + 4);
-  v1 = _mm_loadu_si128(i2 + 4);
-  sad = _mm_sad_epu8(v0, v1);
-  acc = _mm_adds_epu16(acc, sad);
-  v0 = _mm_loadu_si128(i1 + 5);
-  v1 = _mm_loadu_si128(i2 + 5);
-  sad = _mm_sad_epu8(v0, v1);
-  acc = _mm_adds_epu16(acc, sad);
-  v0 = _mm_loadu_si128(i1 + 6);
-  v1 = _mm_loadu_si128(i2 + 6);
-  sad = _mm_sad_epu8(v0, v1);
-  acc = _mm_adds_epu16(acc, sad);
-  v0 = _mm_loadu_si128(i1 + 7);
-  v1 = _mm_loadu_si128(i2 + 7);
-  sad = _mm_sad_epu8(v0, v1);
-  acc = _mm_adds_epu16(acc, sad);
-
-  // This essential means sad = acc >> 64. We only care about the lower 16
-  // bits.
-  sad = _mm_shuffle_epi32(acc, 0xEE);
-  sad = _mm_adds_epu16(sad, acc);
-  return _mm_cvtsi128_si32(sad) != 0;
-}
-
-}  // namespace webrtc
diff --git a/modules/desktop_capture/differ_vector_sse2.h b/modules/desktop_capture/differ_vector_sse2.h
deleted file mode 100644
index 353c6b9..0000000
--- a/modules/desktop_capture/differ_vector_sse2.h
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- *  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.
- */
-
-// This header file is used only differ_block.h. It defines the SSE2 rountines
-// for finding vector difference.
-
-#ifndef WEBRTC_MODULES_DESKTOP_CAPTURE_DIFFER_VECTOR_SSE2_H_
-#define WEBRTC_MODULES_DESKTOP_CAPTURE_DIFFER_VECTOR_SSE2_H_
-
-#include <stdint.h>
-
-namespace webrtc {
-
-// Find vector difference of dimension 16.
-extern bool VectorDifference_SSE2_W16(const uint8_t* image1,
-                                      const uint8_t* image2);
-
-// Find vector difference of dimension 32.
-extern bool VectorDifference_SSE2_W32(const uint8_t* image1,
-                                      const uint8_t* image2);
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_DESKTOP_CAPTURE_DIFFER_VECTOR_SSE2_H_
diff --git a/modules/desktop_capture/fake_desktop_capturer.cc b/modules/desktop_capture/fake_desktop_capturer.cc
deleted file mode 100644
index ea62265..0000000
--- a/modules/desktop_capture/fake_desktop_capturer.cc
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- *  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/desktop_capture/fake_desktop_capturer.h"
-
-#include <utility>
-
-namespace webrtc {
-
-FakeDesktopCapturer::FakeDesktopCapturer() = default;
-FakeDesktopCapturer::~FakeDesktopCapturer() = default;
-
-void FakeDesktopCapturer::set_result(DesktopCapturer::Result result) {
-  result_ = result;
-}
-
-int FakeDesktopCapturer::num_frames_captured() const {
-  return num_frames_captured_;
-}
-
-int FakeDesktopCapturer::num_capture_attempts() const {
-  return num_capture_attempts_;
-}
-
-// Uses the |generator| provided as DesktopFrameGenerator, FakeDesktopCapturer
-// does
-// not take the ownership of |generator|.
-void FakeDesktopCapturer::set_frame_generator(
-    DesktopFrameGenerator* generator) {
-  generator_ = generator;
-}
-
-void FakeDesktopCapturer::Start(DesktopCapturer::Callback* callback) {
-  callback_ = callback;
-}
-
-void FakeDesktopCapturer::CaptureFrame() {
-  num_capture_attempts_++;
-  if (generator_) {
-    if (result_ != DesktopCapturer::Result::SUCCESS) {
-      callback_->OnCaptureResult(result_, nullptr);
-      return;
-    }
-
-    std::unique_ptr<DesktopFrame> frame(
-        generator_->GetNextFrame(shared_memory_factory_.get()));
-    if (frame) {
-      num_frames_captured_++;
-      callback_->OnCaptureResult(result_, std::move(frame));
-    } else {
-      callback_->OnCaptureResult(DesktopCapturer::Result::ERROR_TEMPORARY,
-                                 nullptr);
-    }
-    return;
-  }
-  callback_->OnCaptureResult(DesktopCapturer::Result::ERROR_PERMANENT, nullptr);
-}
-
-void FakeDesktopCapturer::SetSharedMemoryFactory(
-    std::unique_ptr<SharedMemoryFactory> shared_memory_factory) {
-  shared_memory_factory_ = std::move(shared_memory_factory);
-}
-
-bool FakeDesktopCapturer::GetSourceList(DesktopCapturer::SourceList* sources) {
-  sources->push_back({kWindowId, "A-Fake-DesktopCapturer-Window"});
-  sources->push_back({kScreenId});
-  return true;
-}
-
-bool FakeDesktopCapturer::SelectSource(DesktopCapturer::SourceId id) {
-  return id == kWindowId || id == kScreenId || id == kFullDesktopScreenId;
-}
-
-}  // namespace webrtc
diff --git a/modules/desktop_capture/fake_desktop_capturer.h b/modules/desktop_capture/fake_desktop_capturer.h
deleted file mode 100644
index 9cab2d6..0000000
--- a/modules/desktop_capture/fake_desktop_capturer.h
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- *  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_DESKTOP_CAPTURE_FAKE_DESKTOP_CAPTURER_H_
-#define WEBRTC_MODULES_DESKTOP_CAPTURE_FAKE_DESKTOP_CAPTURER_H_
-
-#include <memory>
-
-#include "webrtc/modules/desktop_capture/desktop_capturer.h"
-#include "webrtc/modules/desktop_capture/desktop_capture_types.h"
-#include "webrtc/modules/desktop_capture/desktop_frame_generator.h"
-#include "webrtc/modules/desktop_capture/shared_memory.h"
-
-namespace webrtc {
-
-// A fake implementation of DesktopCapturer or its derived interfaces to
-// generate DesktopFrame for testing purpose.
-//
-// Consumers can provide a FrameGenerator instance to generate instances of
-// DesktopFrame to return for each Capture() function call.
-// If no FrameGenerator provided, FakeDesktopCapturer will always return a
-// nullptr DesktopFrame.
-//
-// Double buffering is guaranteed by the FrameGenerator. FrameGenerator
-// implements in desktop_frame_generator.h guarantee double buffering, they
-// creates a new instance of DesktopFrame each time.
-class FakeDesktopCapturer : public DesktopCapturer {
- public:
-  FakeDesktopCapturer();
-  ~FakeDesktopCapturer() override;
-
-  // Decides the result which will be returned in next Capture() callback.
-  void set_result(DesktopCapturer::Result result);
-
-  // Uses the |generator| provided as DesktopFrameGenerator, FakeDesktopCapturer
-  // does not take the ownership of |generator|.
-  void set_frame_generator(DesktopFrameGenerator* generator);
-
-  // Count of DesktopFrame(s) have been returned by this instance. This field
-  // would never be negative.
-  int num_frames_captured() const;
-
-  // Count of CaptureFrame() calls have been made. This field would never be
-  // negative.
-  int num_capture_attempts() const;
-
-  // DesktopCapturer interface
-  void Start(DesktopCapturer::Callback* callback) override;
-  void CaptureFrame() override;
-  void SetSharedMemoryFactory(
-      std::unique_ptr<SharedMemoryFactory> shared_memory_factory) override;
-  bool GetSourceList(DesktopCapturer::SourceList* sources) override;
-  bool SelectSource(DesktopCapturer::SourceId id) override;
-
- private:
-  static constexpr DesktopCapturer::SourceId kWindowId = 1378277495;
-  static constexpr DesktopCapturer::SourceId kScreenId = 1378277496;
-
-  DesktopCapturer::Callback* callback_ = nullptr;
-  std::unique_ptr<SharedMemoryFactory> shared_memory_factory_;
-  DesktopCapturer::Result result_ = Result::SUCCESS;
-  DesktopFrameGenerator* generator_ = nullptr;
-  int num_frames_captured_ = 0;
-  int num_capture_attempts_ = 0;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_DESKTOP_CAPTURE_FAKE_DESKTOP_CAPTURER_H_
diff --git a/modules/desktop_capture/fallback_desktop_capturer_wrapper.cc b/modules/desktop_capture/fallback_desktop_capturer_wrapper.cc
deleted file mode 100644
index 6ae046e..0000000
--- a/modules/desktop_capture/fallback_desktop_capturer_wrapper.cc
+++ /dev/null
@@ -1,180 +0,0 @@
-/*
- *  Copyright (c) 2017 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/desktop_capture/fallback_desktop_capturer_wrapper.h"
-
-#include <utility>
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/system_wrappers/include/metrics.h"
-
-namespace webrtc {
-
-namespace {
-
-// Implementation to share a SharedMemoryFactory between DesktopCapturer
-// instances. This class is designed for synchronized DesktopCapturer
-// implementations only.
-class SharedMemoryFactoryProxy : public SharedMemoryFactory {
- public:
-  // Users should maintain the lifetime of |factory| to ensure it overlives
-  // current instance.
-  static std::unique_ptr<SharedMemoryFactory> Create(
-      SharedMemoryFactory* factory);
-  ~SharedMemoryFactoryProxy() override;
-
-  // Forwards CreateSharedMemory() calls to |factory_|. Users should always call
-  // this function in one thread. Users should not call this function after the
-  // SharedMemoryFactory which current instance created from has been destroyed.
-  std::unique_ptr<SharedMemory> CreateSharedMemory(size_t size) override;
-
- private:
-  explicit SharedMemoryFactoryProxy(SharedMemoryFactory* factory);
-
-  SharedMemoryFactory* factory_ = nullptr;
-  rtc::ThreadChecker thread_checker_;
-};
-
-}  // namespace
-
-SharedMemoryFactoryProxy::SharedMemoryFactoryProxy(
-    SharedMemoryFactory* factory) {
-  RTC_DCHECK(factory);
-  factory_ = factory;
-}
-
-// static
-std::unique_ptr<SharedMemoryFactory>
-SharedMemoryFactoryProxy::Create(SharedMemoryFactory* factory) {
-  return std::unique_ptr<SharedMemoryFactory>(
-      new SharedMemoryFactoryProxy(factory));
-}
-
-SharedMemoryFactoryProxy::~SharedMemoryFactoryProxy() = default;
-
-std::unique_ptr<SharedMemory>
-SharedMemoryFactoryProxy::CreateSharedMemory(size_t size) {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  return factory_->CreateSharedMemory(size);
-}
-
-FallbackDesktopCapturerWrapper::FallbackDesktopCapturerWrapper(
-    std::unique_ptr<DesktopCapturer> main_capturer,
-    std::unique_ptr<DesktopCapturer> secondary_capturer)
-    : main_capturer_(std::move(main_capturer)),
-      secondary_capturer_(std::move(secondary_capturer)) {
-  RTC_DCHECK(main_capturer_);
-  RTC_DCHECK(secondary_capturer_);
-}
-
-FallbackDesktopCapturerWrapper::~FallbackDesktopCapturerWrapper() = default;
-
-void FallbackDesktopCapturerWrapper::Start(
-    DesktopCapturer::Callback* callback) {
-  // FallbackDesktopCapturerWrapper catchs the callback of the main capturer,
-  // and checks its return value to decide whether the secondary capturer should
-  // be involved.
-  main_capturer_->Start(this);
-  // For the secondary capturer, we do not have a backup plan anymore, so
-  // FallbackDesktopCapturerWrapper won't check its return value any more. It
-  // will directly return to the input |callback|.
-  secondary_capturer_->Start(callback);
-  callback_ = callback;
-}
-
-void FallbackDesktopCapturerWrapper::SetSharedMemoryFactory(
-    std::unique_ptr<SharedMemoryFactory> shared_memory_factory) {
-  shared_memory_factory_ = std::move(shared_memory_factory);
-  if (shared_memory_factory_) {
-    main_capturer_->SetSharedMemoryFactory(
-        SharedMemoryFactoryProxy::Create(shared_memory_factory_.get()));
-    secondary_capturer_->SetSharedMemoryFactory(
-        SharedMemoryFactoryProxy::Create(shared_memory_factory_.get()));
-  } else {
-    main_capturer_->SetSharedMemoryFactory(
-        std::unique_ptr<SharedMemoryFactory>());
-    secondary_capturer_->SetSharedMemoryFactory(
-        std::unique_ptr<SharedMemoryFactory>());
-  }
-}
-
-void FallbackDesktopCapturerWrapper::CaptureFrame() {
-  RTC_DCHECK(callback_);
-  if (main_capturer_permanent_error_) {
-    secondary_capturer_->CaptureFrame();
-  } else {
-    main_capturer_->CaptureFrame();
-  }
-}
-
-void FallbackDesktopCapturerWrapper::SetExcludedWindow(WindowId window) {
-  main_capturer_->SetExcludedWindow(window);
-  secondary_capturer_->SetExcludedWindow(window);
-}
-
-bool FallbackDesktopCapturerWrapper::GetSourceList(SourceList* sources) {
-  if (main_capturer_permanent_error_) {
-    return secondary_capturer_->GetSourceList(sources);
-  }
-  return main_capturer_->GetSourceList(sources);
-}
-
-bool FallbackDesktopCapturerWrapper::SelectSource(SourceId id) {
-  if (main_capturer_permanent_error_) {
-    return secondary_capturer_->SelectSource(id);
-  }
-  const bool main_capturer_result = main_capturer_->SelectSource(id);
-  RTC_HISTOGRAM_BOOLEAN(
-      "WebRTC.DesktopCapture.PrimaryCapturerSelectSourceError",
-      main_capturer_result);
-  if (!main_capturer_result) {
-    main_capturer_permanent_error_ = true;
-  }
-
-  return secondary_capturer_->SelectSource(id);
-}
-
-bool FallbackDesktopCapturerWrapper::FocusOnSelectedSource() {
-  if (main_capturer_permanent_error_) {
-    return secondary_capturer_->FocusOnSelectedSource();
-  }
-  return main_capturer_->FocusOnSelectedSource() ||
-         secondary_capturer_->FocusOnSelectedSource();
-}
-
-bool FallbackDesktopCapturerWrapper::IsOccluded(const DesktopVector& pos) {
-  // Returns true if either capturer returns true.
-  if (main_capturer_permanent_error_) {
-    return secondary_capturer_->IsOccluded(pos);
-  }
-  return main_capturer_->IsOccluded(pos) ||
-         secondary_capturer_->IsOccluded(pos);
-}
-
-void FallbackDesktopCapturerWrapper::OnCaptureResult(
-    Result result,
-    std::unique_ptr<DesktopFrame> frame) {
-  RTC_DCHECK(callback_);
-  RTC_HISTOGRAM_BOOLEAN("WebRTC.DesktopCapture.PrimaryCapturerError",
-                        result != Result::SUCCESS);
-  RTC_HISTOGRAM_BOOLEAN("WebRTC.DesktopCapture.PrimaryCapturerPermanentError",
-                        result == Result::ERROR_PERMANENT);
-  if (result == Result::SUCCESS) {
-    callback_->OnCaptureResult(result, std::move(frame));
-    return;
-  }
-
-  if (result == Result::ERROR_PERMANENT) {
-    main_capturer_permanent_error_ = true;
-  }
-  secondary_capturer_->CaptureFrame();
-}
-
-}  // namespace webrtc
diff --git a/modules/desktop_capture/fallback_desktop_capturer_wrapper.h b/modules/desktop_capture/fallback_desktop_capturer_wrapper.h
deleted file mode 100644
index 8e79026..0000000
--- a/modules/desktop_capture/fallback_desktop_capturer_wrapper.h
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- *  Copyright (c) 2017 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_DESKTOP_CAPTURE_FALLBACK_DESKTOP_CAPTURER_WRAPPER_H_
-#define WEBRTC_MODULES_DESKTOP_CAPTURE_FALLBACK_DESKTOP_CAPTURER_WRAPPER_H_
-
-#include <memory>
-
-#include "webrtc/modules/desktop_capture/desktop_capturer.h"
-#include "webrtc/modules/desktop_capture/desktop_capture_types.h"
-#include "webrtc/modules/desktop_capture/desktop_frame.h"
-#include "webrtc/modules/desktop_capture/shared_memory.h"
-
-namespace webrtc {
-
-// A DesktopCapturer wrapper owns two DesktopCapturer implementations. If the
-// main DesktopCapturer fails, it uses the secondary one instead. Two capturers
-// are expected to return same SourceList, and the meaning of each SourceId is
-// identical, otherwise FallbackDesktopCapturerWrapper may return frames from
-// different sources. Using asynchronized DesktopCapturer implementations with
-// SharedMemoryFactory is not supported, and may result crash or assertion
-// failure.
-class FallbackDesktopCapturerWrapper final : public DesktopCapturer,
-                                             public DesktopCapturer::Callback {
- public:
-  FallbackDesktopCapturerWrapper(
-      std::unique_ptr<DesktopCapturer> main_capturer,
-      std::unique_ptr<DesktopCapturer> secondary_capturer);
-  ~FallbackDesktopCapturerWrapper() override;
-
-  // DesktopCapturer interface.
-  void Start(DesktopCapturer::Callback* callback) override;
-  void SetSharedMemoryFactory(
-      std::unique_ptr<SharedMemoryFactory> shared_memory_factory) override;
-  void CaptureFrame() override;
-  void SetExcludedWindow(WindowId window) override;
-  bool GetSourceList(SourceList* sources) override;
-  bool SelectSource(SourceId id) override;
-  bool FocusOnSelectedSource() override;
-  bool IsOccluded(const DesktopVector& pos) override;
-
- private:
-  // DesktopCapturer::Callback interface.
-  void OnCaptureResult(Result result,
-                       std::unique_ptr<DesktopFrame> frame) override;
-
-  const std::unique_ptr<DesktopCapturer> main_capturer_;
-  const std::unique_ptr<DesktopCapturer> secondary_capturer_;
-  std::unique_ptr<SharedMemoryFactory> shared_memory_factory_;
-  bool main_capturer_permanent_error_ = false;
-  DesktopCapturer::Callback* callback_ = nullptr;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_DESKTOP_CAPTURE_FALLBACK_DESKTOP_CAPTURER_WRAPPER_H_
diff --git a/modules/desktop_capture/fallback_desktop_capturer_wrapper_unittest.cc b/modules/desktop_capture/fallback_desktop_capturer_wrapper_unittest.cc
deleted file mode 100644
index 106848b..0000000
--- a/modules/desktop_capture/fallback_desktop_capturer_wrapper_unittest.cc
+++ /dev/null
@@ -1,205 +0,0 @@
-/*
- *  Copyright (c) 2017 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/desktop_capture/fallback_desktop_capturer_wrapper.h"
-
-#include <memory>
-#include <utility>
-#include <vector>
-
-#include "webrtc/modules/desktop_capture/desktop_capturer.h"
-#include "webrtc/modules/desktop_capture/desktop_frame_generator.h"
-#include "webrtc/modules/desktop_capture/fake_desktop_capturer.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-namespace {
-
-std::unique_ptr<DesktopCapturer> CreateDesktopCapturer(
-    PainterDesktopFrameGenerator* frame_generator) {
-  std::unique_ptr<FakeDesktopCapturer> capturer(new FakeDesktopCapturer());
-  capturer->set_frame_generator(frame_generator);
-  return std::move(capturer);
-}
-
-class FakeSharedMemory : public SharedMemory {
- public:
-  explicit FakeSharedMemory(size_t size);
-  ~FakeSharedMemory() override;
-
- private:
-  static int next_id_;
-};
-
-// static
-int FakeSharedMemory::next_id_ = 0;
-
-FakeSharedMemory::FakeSharedMemory(size_t size)
-    : SharedMemory(new char[size], size, 0, next_id_++) {}
-
-FakeSharedMemory::~FakeSharedMemory() {
-  delete[] static_cast<char*>(data_);
-}
-
-class FakeSharedMemoryFactory : public SharedMemoryFactory {
- public:
-  FakeSharedMemoryFactory() = default;
-  ~FakeSharedMemoryFactory() override = default;
-
-  std::unique_ptr<SharedMemory> CreateSharedMemory(size_t size) override;
-};
-
-std::unique_ptr<SharedMemory> FakeSharedMemoryFactory::CreateSharedMemory(
-    size_t size) {
-  return std::unique_ptr<SharedMemory>(new FakeSharedMemory(size));
-}
-
-}  // namespace
-
-class FallbackDesktopCapturerWrapperTest : public testing::Test,
-                                           public DesktopCapturer::Callback {
- public:
-  FallbackDesktopCapturerWrapperTest();
-  ~FallbackDesktopCapturerWrapperTest() override = default;
-
- protected:
-  std::vector<std::pair<DesktopCapturer::Result, bool>> results_;
-  FakeDesktopCapturer* main_capturer_ = nullptr;
-  FakeDesktopCapturer* secondary_capturer_ = nullptr;
-  std::unique_ptr<FallbackDesktopCapturerWrapper> wrapper_;
-
- private:
-  // DesktopCapturer::Callback interface
-  void OnCaptureResult(DesktopCapturer::Result result,
-                       std::unique_ptr<DesktopFrame> frame) override;
-  PainterDesktopFrameGenerator frame_generator_;
-};
-
-FallbackDesktopCapturerWrapperTest::FallbackDesktopCapturerWrapperTest() {
-  frame_generator_.size()->set(1024, 768);
-  std::unique_ptr<DesktopCapturer> main_capturer =
-      CreateDesktopCapturer(&frame_generator_);
-  std::unique_ptr<DesktopCapturer> secondary_capturer =
-      CreateDesktopCapturer(&frame_generator_);
-  main_capturer_ = static_cast<FakeDesktopCapturer*>(main_capturer.get());
-  secondary_capturer_ =
-      static_cast<FakeDesktopCapturer*>(secondary_capturer.get());
-  wrapper_.reset(new FallbackDesktopCapturerWrapper(
-      std::move(main_capturer), std::move(secondary_capturer)));
-  wrapper_->Start(this);
-}
-
-void FallbackDesktopCapturerWrapperTest::OnCaptureResult(
-    DesktopCapturer::Result result,
-    std::unique_ptr<DesktopFrame> frame) {
-  results_.emplace_back(result, !!frame);
-}
-
-TEST_F(FallbackDesktopCapturerWrapperTest, MainNeverFailed) {
-  wrapper_->CaptureFrame();
-  ASSERT_EQ(main_capturer_->num_capture_attempts(), 1);
-  ASSERT_EQ(main_capturer_->num_frames_captured(), 1);
-  ASSERT_EQ(secondary_capturer_->num_capture_attempts(), 0);
-  ASSERT_EQ(secondary_capturer_->num_frames_captured(), 0);
-  ASSERT_EQ(results_.size(), 1U);
-  ASSERT_EQ(results_[0],
-            std::make_pair(DesktopCapturer::Result::SUCCESS, true));
-}
-
-TEST_F(FallbackDesktopCapturerWrapperTest, MainFailedTemporarily) {
-  wrapper_->CaptureFrame();
-  main_capturer_->set_result(DesktopCapturer::Result::ERROR_TEMPORARY);
-  wrapper_->CaptureFrame();
-  main_capturer_->set_result(DesktopCapturer::Result::SUCCESS);
-  wrapper_->CaptureFrame();
-
-  ASSERT_EQ(main_capturer_->num_capture_attempts(), 3);
-  ASSERT_EQ(main_capturer_->num_frames_captured(), 2);
-  ASSERT_EQ(secondary_capturer_->num_capture_attempts(), 1);
-  ASSERT_EQ(secondary_capturer_->num_frames_captured(), 1);
-  ASSERT_EQ(results_.size(), 3U);
-  for (int i = 0; i < 3; i++) {
-    ASSERT_EQ(results_[i],
-              std::make_pair(DesktopCapturer::Result::SUCCESS, true));
-  }
-}
-
-TEST_F(FallbackDesktopCapturerWrapperTest, MainFailedPermanently) {
-  wrapper_->CaptureFrame();
-  main_capturer_->set_result(DesktopCapturer::Result::ERROR_PERMANENT);
-  wrapper_->CaptureFrame();
-  main_capturer_->set_result(DesktopCapturer::Result::SUCCESS);
-  wrapper_->CaptureFrame();
-
-  ASSERT_EQ(main_capturer_->num_capture_attempts(), 2);
-  ASSERT_EQ(main_capturer_->num_frames_captured(), 1);
-  ASSERT_EQ(secondary_capturer_->num_capture_attempts(), 2);
-  ASSERT_EQ(secondary_capturer_->num_frames_captured(), 2);
-  ASSERT_EQ(results_.size(), 3U);
-  for (int i = 0; i < 3; i++) {
-    ASSERT_EQ(results_[i],
-              std::make_pair(DesktopCapturer::Result::SUCCESS, true));
-  }
-}
-
-TEST_F(FallbackDesktopCapturerWrapperTest, BothFailed) {
-  wrapper_->CaptureFrame();
-  main_capturer_->set_result(DesktopCapturer::Result::ERROR_PERMANENT);
-  wrapper_->CaptureFrame();
-  main_capturer_->set_result(DesktopCapturer::Result::SUCCESS);
-  wrapper_->CaptureFrame();
-  secondary_capturer_->set_result(DesktopCapturer::Result::ERROR_TEMPORARY);
-  wrapper_->CaptureFrame();
-  secondary_capturer_->set_result(DesktopCapturer::Result::ERROR_PERMANENT);
-  wrapper_->CaptureFrame();
-  wrapper_->CaptureFrame();
-
-  ASSERT_EQ(main_capturer_->num_capture_attempts(), 2);
-  ASSERT_EQ(main_capturer_->num_frames_captured(), 1);
-  ASSERT_EQ(secondary_capturer_->num_capture_attempts(), 5);
-  ASSERT_EQ(secondary_capturer_->num_frames_captured(), 2);
-  ASSERT_EQ(results_.size(), 6U);
-  for (int i = 0; i < 3; i++) {
-    ASSERT_EQ(results_[i],
-              std::make_pair(DesktopCapturer::Result::SUCCESS, true));
-  }
-  ASSERT_EQ(results_[3],
-            std::make_pair(DesktopCapturer::Result::ERROR_TEMPORARY, false));
-  ASSERT_EQ(results_[4],
-            std::make_pair(DesktopCapturer::Result::ERROR_PERMANENT, false));
-  ASSERT_EQ(results_[5],
-            std::make_pair(DesktopCapturer::Result::ERROR_PERMANENT, false));
-}
-
-TEST_F(FallbackDesktopCapturerWrapperTest, WithSharedMemory) {
-  wrapper_->SetSharedMemoryFactory(std::unique_ptr<SharedMemoryFactory>(
-      new FakeSharedMemoryFactory()));
-  wrapper_->CaptureFrame();
-  main_capturer_->set_result(DesktopCapturer::Result::ERROR_TEMPORARY);
-  wrapper_->CaptureFrame();
-  main_capturer_->set_result(DesktopCapturer::Result::SUCCESS);
-  wrapper_->CaptureFrame();
-  main_capturer_->set_result(DesktopCapturer::Result::ERROR_PERMANENT);
-  wrapper_->CaptureFrame();
-  wrapper_->CaptureFrame();
-
-  ASSERT_EQ(main_capturer_->num_capture_attempts(), 4);
-  ASSERT_EQ(main_capturer_->num_frames_captured(), 2);
-  ASSERT_EQ(secondary_capturer_->num_capture_attempts(), 3);
-  ASSERT_EQ(secondary_capturer_->num_frames_captured(), 3);
-  ASSERT_EQ(results_.size(), 5U);
-  for (int i = 0; i < 5; i++) {
-    ASSERT_EQ(results_[i],
-              std::make_pair(DesktopCapturer::Result::SUCCESS, true));
-  }
-}
-
-}  // namespace webrtc
diff --git a/modules/desktop_capture/mac/desktop_configuration.h b/modules/desktop_capture/mac/desktop_configuration.h
deleted file mode 100644
index 73550ac..0000000
--- a/modules/desktop_capture/mac/desktop_configuration.h
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- *  Copyright (c) 2013 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_DESKTOP_CAPTURE_MAC_DESKTOP_CONFIGURATION_H_
-#define WEBRTC_MODULES_DESKTOP_CAPTURE_MAC_DESKTOP_CONFIGURATION_H_
-
-#include <ApplicationServices/ApplicationServices.h>
-#include <vector>
-
-#include "webrtc/typedefs.h"
-#include "webrtc/modules/desktop_capture/desktop_geometry.h"
-
-namespace webrtc {
-
-// Describes the configuration of a specific display.
-struct MacDisplayConfiguration {
-  MacDisplayConfiguration();
-  MacDisplayConfiguration(const MacDisplayConfiguration& other);
-  MacDisplayConfiguration(MacDisplayConfiguration&& other);
-  ~MacDisplayConfiguration();
-
-  MacDisplayConfiguration& operator=(const MacDisplayConfiguration& other);
-  MacDisplayConfiguration& operator=(MacDisplayConfiguration&& other);
-
-  // Cocoa identifier for this display.
-  CGDirectDisplayID id = 0;
-
-  // Bounds of this display in Density-Independent Pixels (DIPs).
-  DesktopRect bounds;
-
-  // Bounds of this display in physical pixels.
-  DesktopRect pixel_bounds;
-
-  // Scale factor from DIPs to physical pixels.
-  float dip_to_pixel_scale = 1.0f;
-};
-
-typedef std::vector<MacDisplayConfiguration> MacDisplayConfigurations;
-
-// Describes the configuration of the whole desktop.
-struct MacDesktopConfiguration {
-  // Used to request bottom-up or top-down coordinates.
-  enum Origin { BottomLeftOrigin, TopLeftOrigin };
-
-  MacDesktopConfiguration();
-  MacDesktopConfiguration(const MacDesktopConfiguration& other);
-  MacDesktopConfiguration(MacDesktopConfiguration&& other);
-  ~MacDesktopConfiguration();
-
-  MacDesktopConfiguration& operator=(const MacDesktopConfiguration& other);
-  MacDesktopConfiguration& operator=(MacDesktopConfiguration&& other);
-
-  // Returns the desktop & display configurations.
-  // If BottomLeftOrigin is used, the output is in Cocoa-style "bottom-up"
-  // (the origin is the bottom-left of the primary monitor, and coordinates
-  // increase as you move up the screen). Otherwise, the configuration will be
-  // converted to follow top-left coordinate system as Windows and X11.
-  static MacDesktopConfiguration GetCurrent(Origin origin);
-
-  // Returns true if the given desktop configuration equals this one.
-  bool Equals(const MacDesktopConfiguration& other);
-
-  // Returns the pointer to the display configuration with the specified id.
-  const MacDisplayConfiguration* FindDisplayConfigurationById(
-      CGDirectDisplayID id);
-
-  // Bounds of the desktop excluding monitors with DPI settings different from
-  // the main monitor. In Density-Independent Pixels (DIPs).
-  DesktopRect bounds;
-
-  // Same as bounds, but expressed in physical pixels.
-  DesktopRect pixel_bounds;
-
-  // Scale factor from DIPs to physical pixels.
-  float dip_to_pixel_scale = 1.0f;
-
-  // Configurations of the displays making up the desktop area.
-  MacDisplayConfigurations displays;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_DESKTOP_CAPTURE_MAC_DESKTOP_CONFIGURATION_H_
diff --git a/modules/desktop_capture/mac/desktop_configuration.mm b/modules/desktop_capture/mac/desktop_configuration.mm
deleted file mode 100644
index c82d1cb..0000000
--- a/modules/desktop_capture/mac/desktop_configuration.mm
+++ /dev/null
@@ -1,179 +0,0 @@
-/*
- *  Copyright (c) 2013 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/desktop_capture/mac/desktop_configuration.h"
-
-#include <math.h>
-#include <algorithm>
-#include <Cocoa/Cocoa.h>
-
-#if !defined(MAC_OS_X_VERSION_10_7) || \
-    MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_7
-
-@interface NSScreen (LionAPI)
-- (CGFloat)backingScaleFactor;
-- (NSRect)convertRectToBacking:(NSRect)aRect;
-@end
-
-#endif  // MAC_OS_X_VERSION_10_7
-
-namespace webrtc {
-
-namespace {
-
-DesktopRect NSRectToDesktopRect(const NSRect& ns_rect) {
-  return DesktopRect::MakeLTRB(
-      static_cast<int>(floor(ns_rect.origin.x)),
-      static_cast<int>(floor(ns_rect.origin.y)),
-      static_cast<int>(ceil(ns_rect.origin.x + ns_rect.size.width)),
-      static_cast<int>(ceil(ns_rect.origin.y + ns_rect.size.height)));
-}
-
-// Inverts the position of |rect| from bottom-up coordinates to top-down,
-// relative to |bounds|.
-void InvertRectYOrigin(const DesktopRect& bounds,
-                       DesktopRect* rect) {
-  assert(bounds.top() == 0);
-  *rect = DesktopRect::MakeXYWH(
-      rect->left(), bounds.bottom() - rect->bottom(),
-      rect->width(), rect->height());
-}
-
-MacDisplayConfiguration GetConfigurationForScreen(NSScreen* screen) {
-  MacDisplayConfiguration display_config;
-
-  // Fetch the NSScreenNumber, which is also the CGDirectDisplayID.
-  NSDictionary* device_description = [screen deviceDescription];
-  display_config.id = static_cast<CGDirectDisplayID>(
-      [[device_description objectForKey:@"NSScreenNumber"] intValue]);
-
-  // Determine the display's logical & physical dimensions.
-  NSRect ns_bounds = [screen frame];
-  display_config.bounds = NSRectToDesktopRect(ns_bounds);
-
-  // If the host is running Mac OS X 10.7+ or later, query the scaling factor
-  // between logical and physical (aka "backing") pixels, otherwise assume 1:1.
-  if ([screen respondsToSelector:@selector(backingScaleFactor)] &&
-      [screen respondsToSelector:@selector(convertRectToBacking:)]) {
-    display_config.dip_to_pixel_scale = [screen backingScaleFactor];
-    NSRect ns_pixel_bounds = [screen convertRectToBacking: ns_bounds];
-    display_config.pixel_bounds = NSRectToDesktopRect(ns_pixel_bounds);
-  } else {
-    display_config.pixel_bounds = display_config.bounds;
-  }
-
-  return display_config;
-}
-
-}  // namespace
-
-MacDisplayConfiguration::MacDisplayConfiguration() = default;
-MacDisplayConfiguration::MacDisplayConfiguration(
-    const MacDisplayConfiguration& other) = default;
-MacDisplayConfiguration::MacDisplayConfiguration(
-    MacDisplayConfiguration&& other) = default;
-MacDisplayConfiguration::~MacDisplayConfiguration() = default;
-
-MacDisplayConfiguration& MacDisplayConfiguration::operator=(
-    const MacDisplayConfiguration& other) = default;
-MacDisplayConfiguration& MacDisplayConfiguration::operator=(
-    MacDisplayConfiguration&& other) = default;
-
-MacDesktopConfiguration::MacDesktopConfiguration() = default;
-MacDesktopConfiguration::MacDesktopConfiguration(
-    const MacDesktopConfiguration& other) = default;
-MacDesktopConfiguration::MacDesktopConfiguration(
-    MacDesktopConfiguration&& other) = default;
-MacDesktopConfiguration::~MacDesktopConfiguration() = default;
-
-MacDesktopConfiguration& MacDesktopConfiguration::operator=(
-    const MacDesktopConfiguration& other) = default;
-MacDesktopConfiguration& MacDesktopConfiguration::operator=(
-    MacDesktopConfiguration&& other) = default;
-
-// static
-MacDesktopConfiguration MacDesktopConfiguration::GetCurrent(Origin origin) {
-  MacDesktopConfiguration desktop_config;
-
-  NSArray* screens = [NSScreen screens];
-  assert(screens);
-
-  // Iterator over the monitors, adding the primary monitor and monitors whose
-  // DPI match that of the primary monitor.
-  for (NSUInteger i = 0; i < [screens count]; ++i) {
-    MacDisplayConfiguration display_config =
-        GetConfigurationForScreen([screens objectAtIndex: i]);
-
-    if (i == 0)
-      desktop_config.dip_to_pixel_scale = display_config.dip_to_pixel_scale;
-
-    // Cocoa uses bottom-up coordinates, so if the caller wants top-down then
-    // we need to invert the positions of secondary monitors relative to the
-    // primary one (the primary monitor's position is (0,0) in both systems).
-    if (i > 0 && origin == TopLeftOrigin) {
-      InvertRectYOrigin(desktop_config.displays[0].bounds,
-                        &display_config.bounds);
-      // |display_bounds| is density dependent, so we need to convert the
-      // primay monitor's position into the secondary monitor's density context.
-      float scaling_factor = display_config.dip_to_pixel_scale /
-          desktop_config.displays[0].dip_to_pixel_scale;
-      DesktopRect primary_bounds = DesktopRect::MakeLTRB(
-          desktop_config.displays[0].pixel_bounds.left() * scaling_factor,
-          desktop_config.displays[0].pixel_bounds.top() * scaling_factor,
-          desktop_config.displays[0].pixel_bounds.right() * scaling_factor,
-          desktop_config.displays[0].pixel_bounds.bottom() * scaling_factor);
-      InvertRectYOrigin(primary_bounds, &display_config.pixel_bounds);
-    }
-
-    // Add the display to the configuration.
-    desktop_config.displays.push_back(display_config);
-
-    // Update the desktop bounds to account for this display, unless the current
-    // display uses different DPI settings.
-    if (display_config.dip_to_pixel_scale ==
-        desktop_config.dip_to_pixel_scale) {
-      desktop_config.bounds.UnionWith(display_config.bounds);
-      desktop_config.pixel_bounds.UnionWith(display_config.pixel_bounds);
-    }
-  }
-
-  return desktop_config;
-}
-
-// For convenience of comparing MacDisplayConfigurations in
-// MacDesktopConfiguration::Equals.
-bool operator==(const MacDisplayConfiguration& left,
-                const MacDisplayConfiguration& right) {
-  return left.id == right.id &&
-      left.bounds.equals(right.bounds) &&
-      left.pixel_bounds.equals(right.pixel_bounds) &&
-      left.dip_to_pixel_scale == right.dip_to_pixel_scale;
-}
-
-bool MacDesktopConfiguration::Equals(const MacDesktopConfiguration& other) {
-  return bounds.equals(other.bounds) &&
-      pixel_bounds.equals(other.pixel_bounds) &&
-      dip_to_pixel_scale == other.dip_to_pixel_scale &&
-      displays == other.displays;
-}
-
-// Finds the display configuration with the specified id.
-const MacDisplayConfiguration*
-MacDesktopConfiguration::FindDisplayConfigurationById(
-    CGDirectDisplayID id) {
-  for (MacDisplayConfigurations::const_iterator it = displays.begin();
-      it != displays.end(); ++it) {
-    if (it->id == id)
-      return &(*it);
-  }
-  return NULL;
-}
-
-}  // namespace webrtc
diff --git a/modules/desktop_capture/mac/desktop_configuration_monitor.cc b/modules/desktop_capture/mac/desktop_configuration_monitor.cc
deleted file mode 100644
index 21c06f7..0000000
--- a/modules/desktop_capture/mac/desktop_configuration_monitor.cc
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- *  Copyright (c) 2014 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/desktop_capture/mac/desktop_configuration_monitor.h"
-
-#include "webrtc/modules/desktop_capture/mac/desktop_configuration.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/system_wrappers/include/event_wrapper.h"
-
-namespace webrtc {
-
-// The amount of time allowed for displays to reconfigure.
-static const int64_t kDisplayConfigurationEventTimeoutMs = 10 * 1000;
-
-DesktopConfigurationMonitor::DesktopConfigurationMonitor()
-    : ref_count_(0),
-      display_configuration_capture_event_(EventWrapper::Create()) {
-  CGError err = CGDisplayRegisterReconfigurationCallback(
-      DesktopConfigurationMonitor::DisplaysReconfiguredCallback, this);
-  if (err != kCGErrorSuccess) {
-    LOG(LS_ERROR) << "CGDisplayRegisterReconfigurationCallback " << err;
-    abort();
-  }
-  display_configuration_capture_event_->Set();
-
-  desktop_configuration_ = MacDesktopConfiguration::GetCurrent(
-      MacDesktopConfiguration::TopLeftOrigin);
-}
-
-DesktopConfigurationMonitor::~DesktopConfigurationMonitor() {
-  CGError err = CGDisplayRemoveReconfigurationCallback(
-      DesktopConfigurationMonitor::DisplaysReconfiguredCallback, this);
-  if (err != kCGErrorSuccess)
-    LOG(LS_ERROR) << "CGDisplayRemoveReconfigurationCallback " << err;
-}
-
-void DesktopConfigurationMonitor::Lock() {
-  if (!display_configuration_capture_event_->Wait(
-              kDisplayConfigurationEventTimeoutMs)) {
-    LOG_F(LS_ERROR) << "Event wait timed out.";
-    abort();
-  }
-}
-
-void DesktopConfigurationMonitor::Unlock() {
-  display_configuration_capture_event_->Set();
-}
-
-// static
-void DesktopConfigurationMonitor::DisplaysReconfiguredCallback(
-    CGDirectDisplayID display,
-    CGDisplayChangeSummaryFlags flags,
-    void *user_parameter) {
-  DesktopConfigurationMonitor* monitor =
-      reinterpret_cast<DesktopConfigurationMonitor*>(user_parameter);
-  monitor->DisplaysReconfigured(display, flags);
-}
-
-void DesktopConfigurationMonitor::DisplaysReconfigured(
-    CGDirectDisplayID display,
-    CGDisplayChangeSummaryFlags flags) {
-  if (flags & kCGDisplayBeginConfigurationFlag) {
-    if (reconfiguring_displays_.empty()) {
-      // If this is the first display to start reconfiguring then wait on
-      // |display_configuration_capture_event_| to block the capture thread
-      // from accessing display memory until the reconfiguration completes.
-      if (!display_configuration_capture_event_->Wait(
-              kDisplayConfigurationEventTimeoutMs)) {
-        LOG_F(LS_ERROR) << "Event wait timed out.";
-        abort();
-      }
-    }
-    reconfiguring_displays_.insert(display);
-  } else {
-    reconfiguring_displays_.erase(display);
-    if (reconfiguring_displays_.empty()) {
-      desktop_configuration_ = MacDesktopConfiguration::GetCurrent(
-          MacDesktopConfiguration::TopLeftOrigin);
-      display_configuration_capture_event_->Set();
-    }
-  }
-}
-
-}  // namespace webrtc
diff --git a/modules/desktop_capture/mac/desktop_configuration_monitor.h b/modules/desktop_capture/mac/desktop_configuration_monitor.h
deleted file mode 100644
index 7b4ade7..0000000
--- a/modules/desktop_capture/mac/desktop_configuration_monitor.h
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- *  Copyright (c) 2014 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_DESKTOP_CAPTURE_MAC_DESKTOP_CONFIGURATION_MONITOR_H_
-#define WEBRTC_MODULES_DESKTOP_CAPTURE_MAC_DESKTOP_CONFIGURATION_MONITOR_H_
-
-#include <ApplicationServices/ApplicationServices.h>
-
-#include <memory>
-#include <set>
-
-#include "webrtc/modules/desktop_capture/mac/desktop_configuration.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/system_wrappers/include/atomic32.h"
-
-namespace webrtc {
-
-class EventWrapper;
-
-// The class provides functions to synchronize capturing and display
-// reconfiguring across threads, and the up-to-date MacDesktopConfiguration.
-class DesktopConfigurationMonitor {
- public:
-  DesktopConfigurationMonitor();
-  // Acquires a lock on the current configuration.
-  void Lock();
-  // Releases the lock previously acquired.
-  void Unlock();
-  // Returns the current desktop configuration. Should only be called when the
-  // lock has been acquired.
-  const MacDesktopConfiguration& desktop_configuration() {
-    return desktop_configuration_;
-  }
-
-  void AddRef() { ++ref_count_; }
-  void Release() {
-    if (--ref_count_ == 0)
-      delete this;
-  }
-
- private:
-  static void DisplaysReconfiguredCallback(CGDirectDisplayID display,
-                                           CGDisplayChangeSummaryFlags flags,
-                                           void *user_parameter);
-  ~DesktopConfigurationMonitor();
-
-  void DisplaysReconfigured(CGDirectDisplayID display,
-                            CGDisplayChangeSummaryFlags flags);
-
-  Atomic32 ref_count_;
-  std::set<CGDirectDisplayID> reconfiguring_displays_;
-  MacDesktopConfiguration desktop_configuration_;
-  std::unique_ptr<EventWrapper> display_configuration_capture_event_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(DesktopConfigurationMonitor);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_DESKTOP_CAPTURE_MAC_DESKTOP_CONFIGURATION_MONITOR_H_
diff --git a/modules/desktop_capture/mac/full_screen_chrome_window_detector.cc b/modules/desktop_capture/mac/full_screen_chrome_window_detector.cc
deleted file mode 100644
index 1c74ed9..0000000
--- a/modules/desktop_capture/mac/full_screen_chrome_window_detector.cc
+++ /dev/null
@@ -1,189 +0,0 @@
-/*
- *  Copyright (c) 2014 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/desktop_capture/mac/full_screen_chrome_window_detector.h"
-
-#include <assert.h>
-#include <libproc.h>
-#include <string>
-
-#include "webrtc/modules/desktop_capture/mac/window_list_utils.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/macutils.h"
-#include "webrtc/rtc_base/timeutils.h"
-
-namespace webrtc {
-
-namespace {
-
-const int64_t kUpdateIntervalMs = 500;
-
-std::string GetWindowTitle(CGWindowID id) {
-  CFArrayRef window_id_array =
-      CFArrayCreate(NULL, reinterpret_cast<const void **>(&id), 1, NULL);
-  CFArrayRef window_array =
-      CGWindowListCreateDescriptionFromArray(window_id_array);
-  std::string title;
-
-  if (window_array && CFArrayGetCount(window_array)) {
-    CFDictionaryRef window = reinterpret_cast<CFDictionaryRef>(
-        CFArrayGetValueAtIndex(window_array, 0));
-    CFStringRef title_ref =  reinterpret_cast<CFStringRef>(
-        CFDictionaryGetValue(window, kCGWindowName));
-
-    if (title_ref)
-      rtc::ToUtf8(title_ref, &title);
-  }
-  CFRelease(window_id_array);
-  CFRelease(window_array);
-
-  return title;
-}
-
-int GetWindowOwnerPid(CGWindowID id) {
-  CFArrayRef window_id_array =
-      CFArrayCreate(NULL, reinterpret_cast<const void **>(&id), 1, NULL);
-  CFArrayRef window_array =
-      CGWindowListCreateDescriptionFromArray(window_id_array);
-  int pid = 0;
-
-  if (window_array && CFArrayGetCount(window_array)) {
-    CFDictionaryRef window = reinterpret_cast<CFDictionaryRef>(
-        CFArrayGetValueAtIndex(window_array, 0));
-    CFNumberRef pid_ref =  reinterpret_cast<CFNumberRef>(
-        CFDictionaryGetValue(window, kCGWindowOwnerPID));
-
-    if (pid_ref)
-      CFNumberGetValue(pid_ref, kCFNumberIntType, &pid);
-  }
-  CFRelease(window_id_array);
-  CFRelease(window_array);
-
-  return pid;
-}
-
-// Returns the window that is full-screen and has the same title and owner pid
-// as the input window.
-CGWindowID FindFullScreenWindowWithSamePidAndTitle(CGWindowID id) {
-  int pid = GetWindowOwnerPid(id);
-  std::string title = GetWindowTitle(id);
-
-  // Only get on screen, non-desktop windows.
-  CFArrayRef window_array = CGWindowListCopyWindowInfo(
-      kCGWindowListOptionOnScreenOnly | kCGWindowListExcludeDesktopElements,
-      kCGNullWindowID);
-  if (!window_array)
-    return kCGNullWindowID;
-
-  CGWindowID full_screen_window = kCGNullWindowID;
-
-  MacDesktopConfiguration desktop_config = MacDesktopConfiguration::GetCurrent(
-      MacDesktopConfiguration::TopLeftOrigin);
-
-  // Check windows to make sure they have an id, title, and use window layer
-  // other than 0.
-  CFIndex count = CFArrayGetCount(window_array);
-  for (CFIndex i = 0; i < count; ++i) {
-    CFDictionaryRef window = reinterpret_cast<CFDictionaryRef>(
-        CFArrayGetValueAtIndex(window_array, i));
-    CFStringRef window_title_ref = reinterpret_cast<CFStringRef>(
-        CFDictionaryGetValue(window, kCGWindowName));
-    CFNumberRef window_id_ref = reinterpret_cast<CFNumberRef>(
-        CFDictionaryGetValue(window, kCGWindowNumber));
-    CFNumberRef window_pid_ref =  reinterpret_cast<CFNumberRef>(
-        CFDictionaryGetValue(window, kCGWindowOwnerPID));
-
-    if (!window_title_ref || !window_id_ref || !window_pid_ref)
-      continue;
-
-    int window_pid = 0;
-    CFNumberGetValue(window_pid_ref, kCFNumberIntType, &window_pid);
-    if (window_pid != pid)
-      continue;
-
-    std::string window_title;
-    if (!rtc::ToUtf8(window_title_ref, &window_title) ||
-        window_title != title) {
-      continue;
-    }
-
-    CGWindowID window_id;
-    CFNumberGetValue(window_id_ref, kCFNumberIntType, &window_id);
-    if (IsWindowFullScreen(desktop_config, window)) {
-      full_screen_window = window_id;
-      break;
-    }
-  }
-
-  CFRelease(window_array);
-  return full_screen_window;
-}
-
-bool IsChromeWindow(CGWindowID id) {
-  int pid = GetWindowOwnerPid(id);
-  char buffer[PROC_PIDPATHINFO_MAXSIZE];
-  int path_length = proc_pidpath(pid, buffer, sizeof(buffer));
-  if (path_length <= 0)
-    return false;
-
-  const char* last_slash = strrchr(buffer, '/');
-  std::string name(last_slash ? last_slash + 1 : buffer);
-  return name.find("Google Chrome") == 0 || name == "Chromium";
-}
-
-}  // namespace
-
-FullScreenChromeWindowDetector::FullScreenChromeWindowDetector()
-    : ref_count_(0), last_update_time_ns_(0) {}
-
-FullScreenChromeWindowDetector::~FullScreenChromeWindowDetector() {}
-
-CGWindowID FullScreenChromeWindowDetector::FindFullScreenWindow(
-    CGWindowID original_window) {
-  if (!IsChromeWindow(original_window) || IsWindowOnScreen(original_window))
-    return kCGNullWindowID;
-
-  CGWindowID full_screen_window_id =
-      FindFullScreenWindowWithSamePidAndTitle(original_window);
-
-  if (full_screen_window_id == kCGNullWindowID)
-    return kCGNullWindowID;
-
-  for (const auto& window : previous_window_list_) {
-    if (static_cast<CGWindowID>(window.id) != full_screen_window_id)
-      continue;
-
-    LOG(LS_WARNING) << "The full-screen window exists in the list.";
-    return kCGNullWindowID;
-  }
-
-  return full_screen_window_id;
-}
-
-void FullScreenChromeWindowDetector::UpdateWindowListIfNeeded(
-    CGWindowID original_window) {
-  if (IsChromeWindow(original_window) &&
-      (rtc::TimeNanos() - last_update_time_ns_) / rtc::kNumNanosecsPerMillisec
-          > kUpdateIntervalMs) {
-    previous_window_list_.clear();
-    previous_window_list_.swap(current_window_list_);
-
-    // No need to update the window list when the window is minimized.
-    if (!IsWindowOnScreen(original_window)) {
-      previous_window_list_.clear();
-      return;
-    }
-
-    GetWindowList(&current_window_list_, false);
-    last_update_time_ns_ = rtc::TimeNanos();
-  }
-}
-
-}  // namespace webrtc
diff --git a/modules/desktop_capture/mac/full_screen_chrome_window_detector.h b/modules/desktop_capture/mac/full_screen_chrome_window_detector.h
deleted file mode 100644
index 01c1a95..0000000
--- a/modules/desktop_capture/mac/full_screen_chrome_window_detector.h
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- *  Copyright (c) 2014 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_DESKTOP_CAPTURE_MAC_FULL_SCREEN_CHROME_WINDOW_DETECTOR_H_
-#define WEBRTC_MODULES_DESKTOP_CAPTURE_MAC_FULL_SCREEN_CHROME_WINDOW_DETECTOR_H_
-
-#include <ApplicationServices/ApplicationServices.h>
-
-#include "webrtc/modules/desktop_capture/desktop_capturer.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/system_wrappers/include/atomic32.h"
-
-namespace webrtc {
-
-// This is a work around for the Chrome tab full-screen behavior: Chrome
-// creates a new window in full-screen mode to show a tab full-screen and
-// minimizes the old window. To continue capturing in this case, we try to
-// find the new full-screen window using these criteria:
-// 0. The original shared window is minimized.
-// 1. The original shared window's owner application name is "Google Chrome".
-// 2. The original window and the new window have the same title and owner
-// pid.
-// 3. The new window is full-screen.
-// 4. The new window didn't exist at least 500 millisecond ago.
-
-class FullScreenChromeWindowDetector {
- public:
-  FullScreenChromeWindowDetector();
-
-  void AddRef() { ++ref_count_; }
-  void Release() {
-    if (--ref_count_ == 0)
-      delete this;
-  }
-
-  // Returns the full-screen window in place of the original window if all the
-  // criteria are met, or kCGNullWindowID if no such window found.
-  CGWindowID FindFullScreenWindow(CGWindowID original_window);
-
-  // The caller should call this function periodically, no less than twice per
-  // second.
-  void UpdateWindowListIfNeeded(CGWindowID original_window);
-
- private:
-  ~FullScreenChromeWindowDetector();
-
-  Atomic32 ref_count_;
-
-  // We cache the last two results of the window list, so
-  // |previous_window_list_| is taken at least 500ms before the next Capture()
-  // call. If we only save the last result, we may get false positive (i.e.
-  // full-screen window exists in the list) if Capture() is called too soon.
-  DesktopCapturer::SourceList current_window_list_;
-  DesktopCapturer::SourceList previous_window_list_;
-  int64_t last_update_time_ns_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(FullScreenChromeWindowDetector);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_DESKTOP_CAPTURE_MAC_FULL_SCREEN_CHROME_WINDOW_DETECTOR_H_
diff --git a/modules/desktop_capture/mac/scoped_pixel_buffer_object.cc b/modules/desktop_capture/mac/scoped_pixel_buffer_object.cc
deleted file mode 100644
index 5dcbc52..0000000
--- a/modules/desktop_capture/mac/scoped_pixel_buffer_object.cc
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- *  Copyright (c) 2013 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/desktop_capture/mac/scoped_pixel_buffer_object.h"
-
-#include <stddef.h>
-
-namespace webrtc {
-
-ScopedPixelBufferObject::ScopedPixelBufferObject()
-    : cgl_context_(NULL),
-      pixel_buffer_object_(0) {
-}
-
-ScopedPixelBufferObject::~ScopedPixelBufferObject() {
-  Release();
-}
-
-bool ScopedPixelBufferObject::Init(CGLContextObj cgl_context,
-                                      int size_in_bytes) {
-  cgl_context_ = cgl_context;
-  CGLContextObj CGL_MACRO_CONTEXT = cgl_context_;
-  glGenBuffersARB(1, &pixel_buffer_object_);
-  if (glGetError() == GL_NO_ERROR) {
-    glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, pixel_buffer_object_);
-    glBufferDataARB(GL_PIXEL_PACK_BUFFER_ARB, size_in_bytes, NULL,
-                    GL_STREAM_READ_ARB);
-    glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, 0);
-    if (glGetError() != GL_NO_ERROR) {
-      Release();
-    }
-  } else {
-    cgl_context_ = NULL;
-    pixel_buffer_object_ = 0;
-  }
-  return pixel_buffer_object_ != 0;
-}
-
-void ScopedPixelBufferObject::Release() {
-  if (pixel_buffer_object_) {
-    CGLContextObj CGL_MACRO_CONTEXT = cgl_context_;
-    glDeleteBuffersARB(1, &pixel_buffer_object_);
-    cgl_context_ = NULL;
-    pixel_buffer_object_ = 0;
-  }
-}
-
-}  // namespace webrtc
diff --git a/modules/desktop_capture/mac/scoped_pixel_buffer_object.h b/modules/desktop_capture/mac/scoped_pixel_buffer_object.h
deleted file mode 100644
index 91d1295..0000000
--- a/modules/desktop_capture/mac/scoped_pixel_buffer_object.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- *  Copyright (c) 2013 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_DESKTOP_CAPTURE_SCOPED_PIXEL_BUFFER_OBJECT_H_
-#define WEBRTC_MODULES_DESKTOP_CAPTURE_SCOPED_PIXEL_BUFFER_OBJECT_H_
-
-#include <OpenGL/CGLMacro.h>
-#include <OpenGL/OpenGL.h>
-
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-class ScopedPixelBufferObject {
- public:
-  ScopedPixelBufferObject();
-  ~ScopedPixelBufferObject();
-
-  bool Init(CGLContextObj cgl_context, int size_in_bytes);
-  void Release();
-
-  GLuint get() const { return pixel_buffer_object_; }
-
- private:
-  CGLContextObj cgl_context_;
-  GLuint pixel_buffer_object_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(ScopedPixelBufferObject);
-};
-
-}  // namespace webrtc
-
-#endif // WEBRTC_MODULES_DESKTOP_CAPTURE_SCOPED_PIXEL_BUFFER_OBJECT_H_
diff --git a/modules/desktop_capture/mac/window_list_utils.cc b/modules/desktop_capture/mac/window_list_utils.cc
deleted file mode 100644
index 0bd6d5a..0000000
--- a/modules/desktop_capture/mac/window_list_utils.cc
+++ /dev/null
@@ -1,250 +0,0 @@
-/*
- *  Copyright (c) 2014 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/desktop_capture/mac/window_list_utils.h"
-
-#include <ApplicationServices/ApplicationServices.h>
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/macutils.h"
-
-static_assert(
-    static_cast<webrtc::WindowId>(kCGNullWindowID) == webrtc::kNullWindowId,
-    "kNullWindowId needs to equal to kCGNullWindowID.");
-
-namespace webrtc {
-
-namespace {
-
-// Get CFDictionaryRef from |id| and call |on_window| against it. This function
-// returns false if native APIs fail, typically it indicates that the |id| does
-// not represent a window. |on_window| will not be called if false is returned
-// from this function.
-bool GetWindowRef(CGWindowID id,
-                  rtc::FunctionView<void(CFDictionaryRef)> on_window) {
-  RTC_DCHECK(on_window);
-
-  // TODO(zijiehe): |id| is a 32-bit integer, casting it to an array seems not
-  // safe enough. Maybe we should create a new
-  // const void* arr[] = {
-  //   reinterpret_cast<void*>(id) }
-  // };
-  CFArrayRef window_id_array =
-      CFArrayCreate(NULL, reinterpret_cast<const void**>(&id), 1, NULL);
-  CFArrayRef window_array =
-      CGWindowListCreateDescriptionFromArray(window_id_array);
-
-  bool result = false;
-  // TODO(zijiehe): CFArrayGetCount(window_array) should always return 1.
-  // Otherwise, we should treat it as failure.
-  if (window_array && CFArrayGetCount(window_array)) {
-    on_window(reinterpret_cast<CFDictionaryRef>(
-        CFArrayGetValueAtIndex(window_array, 0)));
-    result = true;
-  }
-
-  if (window_array) {
-    CFRelease(window_array);
-  }
-  CFRelease(window_id_array);
-  return result;
-}
-
-}  // namespace
-
-bool GetWindowList(rtc::FunctionView<bool(CFDictionaryRef)> on_window,
-                   bool ignore_minimized) {
-  RTC_DCHECK(on_window);
-
-  // Only get on screen, non-desktop windows.
-  // According to
-  // https://developer.apple.com/documentation/coregraphics/cgwindowlistoption/1454105-optiononscreenonly ,
-  // when kCGWindowListOptionOnScreenOnly is used, the order of windows are in
-  // decreasing z-order.
-  CFArrayRef window_array = CGWindowListCopyWindowInfo(
-      kCGWindowListOptionOnScreenOnly | kCGWindowListExcludeDesktopElements,
-      kCGNullWindowID);
-  if (!window_array)
-    return false;
-
-  MacDesktopConfiguration desktop_config;
-  if (ignore_minimized) {
-    desktop_config = MacDesktopConfiguration::GetCurrent(
-        MacDesktopConfiguration::TopLeftOrigin);
-  }
-
-  // Check windows to make sure they have an id, title, and use window layer
-  // other than 0.
-  CFIndex count = CFArrayGetCount(window_array);
-  for (CFIndex i = 0; i < count; i++) {
-    CFDictionaryRef window = reinterpret_cast<CFDictionaryRef>(
-        CFArrayGetValueAtIndex(window_array, i));
-    if (!window) {
-      continue;
-    }
-
-    CFStringRef window_title = reinterpret_cast<CFStringRef>(
-        CFDictionaryGetValue(window, kCGWindowName));
-    if (!window_title) {
-      continue;
-    }
-
-    CFNumberRef window_id = reinterpret_cast<CFNumberRef>(
-        CFDictionaryGetValue(window, kCGWindowNumber));
-    if (!window_id) {
-      continue;
-    }
-
-    CFNumberRef window_layer = reinterpret_cast<CFNumberRef>(
-        CFDictionaryGetValue(window, kCGWindowLayer));
-    if (!window_layer) {
-      continue;
-    }
-
-    // Skip windows with layer=0 (menu, dock).
-    // TODO(zijiehe): The windows with layer != 0 are skipped, is this a bug in
-    // code (not likely) or a bug in comments? What's the meaning of window
-    // layer number in the first place.
-    int layer;
-    if (!CFNumberGetValue(window_layer, kCFNumberIntType, &layer)) {
-      continue;
-    }
-    if (layer != 0) {
-      continue;
-    }
-
-    // Skip windows that are minimized and not full screen.
-    if (ignore_minimized && !IsWindowOnScreen(window) &&
-        !IsWindowFullScreen(desktop_config, window)) {
-      continue;
-    }
-
-    if (!on_window(window)) {
-      break;
-    }
-  }
-
-  CFRelease(window_array);
-  return true;
-}
-
-bool GetWindowList(DesktopCapturer::SourceList* windows,
-                   bool ignore_minimized) {
-  return GetWindowList(
-      [windows](CFDictionaryRef window) {
-        WindowId id = GetWindowId(window);
-        std::string title = GetWindowTitle(window);
-        if (id != kNullWindowId && !title.empty()) {
-          windows->push_back(DesktopCapturer::Source{ id, title });
-        }
-        return true;
-      },
-      ignore_minimized);
-}
-
-// Returns true if the window is occupying a full screen.
-bool IsWindowFullScreen(
-    const MacDesktopConfiguration& desktop_config,
-    CFDictionaryRef window) {
-  bool fullscreen = false;
-  CFDictionaryRef bounds_ref = reinterpret_cast<CFDictionaryRef>(
-      CFDictionaryGetValue(window, kCGWindowBounds));
-
-  CGRect bounds;
-  if (bounds_ref &&
-      CGRectMakeWithDictionaryRepresentation(bounds_ref, &bounds)) {
-    for (MacDisplayConfigurations::const_iterator it =
-             desktop_config.displays.begin();
-         it != desktop_config.displays.end(); it++) {
-      if (it->bounds.equals(DesktopRect::MakeXYWH(bounds.origin.x,
-                                                  bounds.origin.y,
-                                                  bounds.size.width,
-                                                  bounds.size.height))) {
-        fullscreen = true;
-        break;
-      }
-    }
-  }
-
-  return fullscreen;
-}
-
-bool IsWindowOnScreen(CFDictionaryRef window) {
-  CFBooleanRef on_screen = reinterpret_cast<CFBooleanRef>(
-      CFDictionaryGetValue(window, kCGWindowIsOnscreen));
-  return on_screen != NULL && CFBooleanGetValue(on_screen);
-}
-
-bool IsWindowOnScreen(CGWindowID id) {
-  bool on_screen;
-  if (GetWindowRef(id,
-                   [&on_screen](CFDictionaryRef window) {
-                     on_screen = IsWindowOnScreen(window);
-                   })) {
-    return on_screen;
-  }
-  return false;
-}
-
-std::string GetWindowTitle(CFDictionaryRef window) {
-  CFStringRef title = reinterpret_cast<CFStringRef>(
-      CFDictionaryGetValue(window, kCGWindowName));
-  std::string result;
-  if (title && rtc::ToUtf8(title, &result)) {
-    return result;
-  }
-  return std::string();
-}
-
-WindowId GetWindowId(CFDictionaryRef window) {
-  CFNumberRef window_id = reinterpret_cast<CFNumberRef>(
-      CFDictionaryGetValue(window, kCGWindowNumber));
-  if (!window_id) {
-    return kNullWindowId;
-  }
-
-  WindowId id;
-  if (!CFNumberGetValue(window_id, kCFNumberIntType, &id)) {
-    return kNullWindowId;
-  }
-
-  return id;
-}
-
-DesktopRect GetWindowBounds(CFDictionaryRef window) {
-  CFDictionaryRef window_bounds = reinterpret_cast<CFDictionaryRef>(
-      CFDictionaryGetValue(window, kCGWindowBounds));
-  if (!window_bounds) {
-    return DesktopRect();
-  }
-
-  CGRect gc_window_rect;
-  if (!CGRectMakeWithDictionaryRepresentation(window_bounds, &gc_window_rect)) {
-    return DesktopRect();
-  }
-
-  return DesktopRect::MakeXYWH(gc_window_rect.origin.x,
-                               gc_window_rect.origin.y,
-                               gc_window_rect.size.width,
-                               gc_window_rect.size.height);
-}
-
-DesktopRect GetWindowBounds(CGWindowID id) {
-  DesktopRect result;
-  if (GetWindowRef(id,
-                   [&result](CFDictionaryRef window) {
-                     result = GetWindowBounds(window);
-                   })) {
-    return result;
-  }
-  return DesktopRect();
-}
-
-}  // namespace webrtc
diff --git a/modules/desktop_capture/mac/window_list_utils.h b/modules/desktop_capture/mac/window_list_utils.h
deleted file mode 100644
index be7aeea..0000000
--- a/modules/desktop_capture/mac/window_list_utils.h
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- *  Copyright (c) 2014 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_DESKTOP_CAPTURE_MAC_WINDOW_LIST_UTILS_H_
-#define WEBRTC_MODULES_DESKTOP_CAPTURE_MAC_WINDOW_LIST_UTILS_H_
-
-#include <ApplicationServices/ApplicationServices.h>
-
-#include "webrtc/modules/desktop_capture/desktop_capture_types.h"
-#include "webrtc/modules/desktop_capture/desktop_capturer.h"
-#include "webrtc/modules/desktop_capture/desktop_geometry.h"
-#include "webrtc/modules/desktop_capture/mac/desktop_configuration.h"
-#include "webrtc/rtc_base/function_view.h"
-
-namespace webrtc {
-
-// Iterates all on-screen windows in decreasing z-order and sends them
-// one-by-one to |on_window| function. If |on_window| returns false, this
-// function returns immediately. GetWindowList() returns false if native APIs
-// failed. Menus, dock, minimized windows (if |ignore_minimized| is true) and
-// any windows which do not have a valid window id or title will be ignored.
-bool GetWindowList(rtc::FunctionView<bool(CFDictionaryRef)> on_window,
-                   bool ignore_minimized);
-
-// Another helper function to get the on-screen windows.
-bool GetWindowList(DesktopCapturer::SourceList* windows, bool ignore_minimized);
-
-// Returns true if the window is occupying a full screen.
-bool IsWindowFullScreen(const MacDesktopConfiguration& desktop_config,
-                        CFDictionaryRef window);
-
-// Returns true if the |window| is on screen. This function returns false if
-// native APIs fail.
-bool IsWindowOnScreen(CFDictionaryRef window);
-
-// Returns true if the window is on screen. This function returns false if
-// native APIs fail or |id| cannot be found.
-bool IsWindowOnScreen(CGWindowID id);
-
-// Returns utf-8 encoded title of |window|. If |window| is not a window or no
-// valid title can be retrieved, this function returns an empty string.
-std::string GetWindowTitle(CFDictionaryRef window);
-
-// Returns id of |window|. If |window| is not a window or the window id cannot
-// be retrieved, this function returns kNullWindowId.
-WindowId GetWindowId(CFDictionaryRef window);
-
-// Returns the bounds of |window|. If |window| is not a window or the bounds
-// cannot be retrieved, this function returns an empty DesktopRect. The returned
-// DesktopRect is in system coordinate, i.e. the primary monitor always starts
-// from (0, 0).
-DesktopRect GetWindowBounds(CFDictionaryRef window);
-
-// Returns the bounds of window with |id|. If |id| does not represent a window
-// or the bounds cannot be retrieved, this function returns an empty
-// DesktopRect. The returned DesktopRect is in system coordinates.
-DesktopRect GetWindowBounds(CGWindowID id);
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_DESKTOP_CAPTURE_MAC_WINDOW_LIST_UTILS_H_
diff --git a/modules/desktop_capture/mock_desktop_capturer_callback.cc b/modules/desktop_capture/mock_desktop_capturer_callback.cc
deleted file mode 100644
index 2a02e28..0000000
--- a/modules/desktop_capture/mock_desktop_capturer_callback.cc
+++ /dev/null
@@ -1,23 +0,0 @@
-/* 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/desktop_capture/mock_desktop_capturer_callback.h"
-
-namespace webrtc {
-
-MockDesktopCapturerCallback::MockDesktopCapturerCallback() = default;
-MockDesktopCapturerCallback::~MockDesktopCapturerCallback() = default;
-
-void MockDesktopCapturerCallback::OnCaptureResult(
-    DesktopCapturer::Result result,
-    std::unique_ptr<DesktopFrame> frame) {
-  OnCaptureResultPtr(result, &frame);
-}
-
-}  // namespace webrtc
diff --git a/modules/desktop_capture/mock_desktop_capturer_callback.h b/modules/desktop_capture/mock_desktop_capturer_callback.h
deleted file mode 100644
index 720075d..0000000
--- a/modules/desktop_capture/mock_desktop_capturer_callback.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/* 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_DESKTOP_CAPTURE_MOCK_DESKTOP_CAPTURER_CALLBACK_H_
-#define WEBRTC_MODULES_DESKTOP_CAPTURE_MOCK_DESKTOP_CAPTURER_CALLBACK_H_
-
-#include "webrtc/modules/desktop_capture/desktop_capturer.h"
-
-#include <memory>
-
-#include "webrtc/test/gmock.h"
-
-namespace webrtc {
-
-class MockDesktopCapturerCallback : public DesktopCapturer::Callback {
- public:
-  MockDesktopCapturerCallback();
-  ~MockDesktopCapturerCallback() override;
-
-  MOCK_METHOD2(OnCaptureResultPtr,
-               void(DesktopCapturer::Result result,
-                    std::unique_ptr<DesktopFrame>* frame));
-  void OnCaptureResult(DesktopCapturer::Result result,
-                       std::unique_ptr<DesktopFrame> frame) final;
-
- private:
-  RTC_DISALLOW_COPY_AND_ASSIGN(MockDesktopCapturerCallback);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_DESKTOP_CAPTURE_MOCK_DESKTOP_CAPTURER_CALLBACK_H_
diff --git a/modules/desktop_capture/mouse_cursor.cc b/modules/desktop_capture/mouse_cursor.cc
deleted file mode 100644
index 22a9c0e..0000000
--- a/modules/desktop_capture/mouse_cursor.cc
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- *  Copyright (c) 2013 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/desktop_capture/mouse_cursor.h"
-
-#include <assert.h>
-
-#include "webrtc/modules/desktop_capture/desktop_frame.h"
-
-namespace webrtc {
-
-MouseCursor::MouseCursor() {}
-
-MouseCursor::MouseCursor(DesktopFrame* image, const DesktopVector& hotspot)
-    : image_(image),
-      hotspot_(hotspot) {
-  assert(0 <= hotspot_.x() && hotspot_.x() <= image_->size().width());
-  assert(0 <= hotspot_.y() && hotspot_.y() <= image_->size().height());
-}
-
-MouseCursor::~MouseCursor() {}
-
-// static
-MouseCursor* MouseCursor::CopyOf(const MouseCursor& cursor) {
-  return cursor.image()
-             ? new MouseCursor(BasicDesktopFrame::CopyOf(*cursor.image()),
-                               cursor.hotspot())
-             : new MouseCursor();
-}
-
-}  // namespace webrtc
diff --git a/modules/desktop_capture/mouse_cursor.h b/modules/desktop_capture/mouse_cursor.h
deleted file mode 100644
index 45e1fa5..0000000
--- a/modules/desktop_capture/mouse_cursor.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- *  Copyright (c) 2013 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_DESKTOP_CAPTURE_MOUSE_CURSOR_H_
-#define WEBRTC_MODULES_DESKTOP_CAPTURE_MOUSE_CURSOR_H_
-
-#include <memory>
-
-#include "webrtc/modules/desktop_capture/desktop_geometry.h"
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace webrtc {
-
-class DesktopFrame;
-
-class MouseCursor {
- public:
-  MouseCursor();
-
-  // Takes ownership of |image|. |hotspot| must be within |image| boundaries.
-  MouseCursor(DesktopFrame* image, const DesktopVector& hotspot);
-
-  ~MouseCursor();
-
-  static MouseCursor* CopyOf(const MouseCursor& cursor);
-
-  void set_image(DesktopFrame* image) { image_.reset(image); }
-  const DesktopFrame* image() const { return image_.get(); }
-
-  void set_hotspot(const DesktopVector& hotspot ) { hotspot_ = hotspot; }
-  const DesktopVector& hotspot() const { return hotspot_; }
-
- private:
-  std::unique_ptr<DesktopFrame> image_;
-  DesktopVector hotspot_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(MouseCursor);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_DESKTOP_CAPTURE_MOUSE_CURSOR_H_
diff --git a/modules/desktop_capture/mouse_cursor_monitor.h b/modules/desktop_capture/mouse_cursor_monitor.h
deleted file mode 100644
index 84edb79..0000000
--- a/modules/desktop_capture/mouse_cursor_monitor.h
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- *  Copyright (c) 2013 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_DESKTOP_CAPTURE_MOUSE_CURSOR_MONITOR_H_
-#define WEBRTC_MODULES_DESKTOP_CAPTURE_MOUSE_CURSOR_MONITOR_H_
-
-#include <memory>
-
-#include "webrtc/modules/desktop_capture/desktop_capture_types.h"
-#include "webrtc/modules/desktop_capture/desktop_geometry.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-class DesktopCaptureOptions;
-class DesktopFrame;
-class MouseCursor;
-
-// Captures mouse shape and position.
-class MouseCursorMonitor {
- public:
-  // Deprecated: CursorState will not be provided.
-  enum CursorState {
-    // Cursor on top of the window including window decorations.
-    INSIDE,
-
-    // Cursor is outside of the window.
-    OUTSIDE,
-  };
-
-  enum Mode {
-    // Capture only shape of the mouse cursor, but not position.
-    SHAPE_ONLY,
-
-    // Capture both, mouse cursor shape and position.
-    SHAPE_AND_POSITION,
-  };
-
-  // Callback interface used to pass current mouse cursor position and shape.
-  class Callback {
-   public:
-    // Called in response to Capture() when the cursor shape has changed. Must
-    // take ownership of |cursor|.
-    virtual void OnMouseCursor(MouseCursor* cursor) = 0;
-
-    // Called in response to Capture(). |position| indicates cursor position
-    // relative to the |window| specified in the constructor.
-    // Deprecated: use the following overload instead.
-    virtual void OnMouseCursorPosition(CursorState state,
-                                       const DesktopVector& position) = 0;
-
-    // Called in response to Capture(). |position| indicates cursor absolute
-    // position on the system in fullscreen coordinate, i.e. the top-left
-    // monitor always starts from (0, 0).
-    // TODO(zijiehe): Ensure all implementations return the absolute position.
-    // TODO(zijiehe): Make this function pure virtual after Chromium changes.
-    // TODO(zijiehe): Current this overload works correctly only when capturing
-    // mouse cursor against fullscreen.
-    virtual void OnMouseCursorPosition(const DesktopVector& position) {}
-
-   protected:
-    virtual ~Callback() {}
-  };
-
-  virtual ~MouseCursorMonitor() {}
-
-  // Creates a capturer that notifies of mouse cursor events while the cursor is
-  // over the specified window.
-  //
-  // Deprecated: use Create() function.
-  static MouseCursorMonitor* CreateForWindow(
-      const DesktopCaptureOptions& options,
-      WindowId window);
-
-  // Creates a capturer that monitors the mouse cursor shape and position over
-  // the specified screen.
-  //
-  // Deprecated: use Create() function.
-  static MouseCursorMonitor* CreateForScreen(
-      const DesktopCaptureOptions& options,
-      ScreenId screen);
-
-  // Creates a capturer that monitors the mouse cursor shape and position across
-  // the entire desktop. The capturer ensures that the top-left monitor starts
-  // from (0, 0).
-  static std::unique_ptr<MouseCursorMonitor> Create(
-      const DesktopCaptureOptions& options);
-
-  // Initializes the monitor with the |callback|, which must remain valid until
-  // capturer is destroyed.
-  virtual void Init(Callback* callback, Mode mode) = 0;
-
-  // Captures current cursor shape and position (depending on the |mode| passed
-  // to Init()). Calls Callback::OnMouseCursor() if cursor shape has
-  // changed since the last call (or when Capture() is called for the first
-  // time) and then Callback::OnMouseCursorPosition() if mode is set to
-  // SHAPE_AND_POSITION.
-  virtual void Capture() = 0;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_DESKTOP_CAPTURE_MOUSE_CURSOR_MONITOR_H_
-
diff --git a/modules/desktop_capture/mouse_cursor_monitor_mac.mm b/modules/desktop_capture/mouse_cursor_monitor_mac.mm
deleted file mode 100644
index 371852b..0000000
--- a/modules/desktop_capture/mouse_cursor_monitor_mac.mm
+++ /dev/null
@@ -1,342 +0,0 @@
-/*
- *  Copyright (c) 2013 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/desktop_capture/mouse_cursor_monitor.h"
-
-#include <assert.h>
-
-#include <memory>
-
-#include <ApplicationServices/ApplicationServices.h>
-#include <Cocoa/Cocoa.h>
-#include <CoreFoundation/CoreFoundation.h>
-
-#include "webrtc/modules/desktop_capture/desktop_capture_options.h"
-#include "webrtc/modules/desktop_capture/desktop_capture_types.h"
-#include "webrtc/modules/desktop_capture/desktop_frame.h"
-#include "webrtc/modules/desktop_capture/mac/desktop_configuration.h"
-#include "webrtc/modules/desktop_capture/mac/desktop_configuration_monitor.h"
-#include "webrtc/modules/desktop_capture/mac/full_screen_chrome_window_detector.h"
-#include "webrtc/modules/desktop_capture/mouse_cursor.h"
-#include "webrtc/rtc_base/macutils.h"
-#include "webrtc/rtc_base/scoped_ref_ptr.h"
-
-namespace webrtc {
-
-namespace {
-CGImageRef CreateScaledCGImage(CGImageRef image, int width, int height) {
-  // Create context, keeping original image properties.
-  CGColorSpaceRef colorspace = CGImageGetColorSpace(image);
-  CGContextRef context = CGBitmapContextCreate(nullptr,
-                                               width,
-                                               height,
-                                               CGImageGetBitsPerComponent(image),
-                                               width * DesktopFrame::kBytesPerPixel,
-                                               colorspace,
-                                               CGImageGetBitmapInfo(image));
-
-  if (!context) return nil;
-
-  // Draw image to context, resizing it.
-  CGContextDrawImage(context, CGRectMake(0, 0, width, height), image);
-  // Extract resulting image from context.
-  CGImageRef imgRef = CGBitmapContextCreateImage(context);
-  CGContextRelease(context);
-
-  return imgRef;
-}
-}  // namespace
-
-class MouseCursorMonitorMac : public MouseCursorMonitor {
- public:
-  MouseCursorMonitorMac(const DesktopCaptureOptions& options,
-                        CGWindowID window_id,
-                        ScreenId screen_id);
-  ~MouseCursorMonitorMac() override;
-
-  void Init(Callback* callback, Mode mode) override;
-  void Capture() override;
-
- private:
-  static void DisplaysReconfiguredCallback(CGDirectDisplayID display,
-                                           CGDisplayChangeSummaryFlags flags,
-                                           void *user_parameter);
-  void DisplaysReconfigured(CGDirectDisplayID display,
-                            CGDisplayChangeSummaryFlags flags);
-
-  void CaptureImage(float scale);
-
-  rtc::scoped_refptr<DesktopConfigurationMonitor> configuration_monitor_;
-  CGWindowID window_id_;
-  ScreenId screen_id_;
-  Callback* callback_;
-  Mode mode_;
-  __strong NSImage* last_cursor_;
-  rtc::scoped_refptr<FullScreenChromeWindowDetector>
-      full_screen_chrome_window_detector_;
-};
-
-MouseCursorMonitorMac::MouseCursorMonitorMac(
-    const DesktopCaptureOptions& options,
-    CGWindowID window_id,
-    ScreenId screen_id)
-    : configuration_monitor_(options.configuration_monitor()),
-      window_id_(window_id),
-      screen_id_(screen_id),
-      callback_(NULL),
-      mode_(SHAPE_AND_POSITION),
-      full_screen_chrome_window_detector_(
-          options.full_screen_chrome_window_detector()) {
-  assert(window_id == kCGNullWindowID || screen_id == kInvalidScreenId);
-  if (screen_id != kInvalidScreenId &&
-      rtc::GetOSVersionName() < rtc::kMacOSLion) {
-    // Single screen capture is not supported on pre OS X 10.7.
-    screen_id_ = kFullDesktopScreenId;
-  }
-}
-
-MouseCursorMonitorMac::~MouseCursorMonitorMac() {}
-
-void MouseCursorMonitorMac::Init(Callback* callback, Mode mode) {
-  assert(!callback_);
-  assert(callback);
-
-  callback_ = callback;
-  mode_ = mode;
-}
-
-void MouseCursorMonitorMac::Capture() {
-  assert(callback_);
-
-  CursorState state = INSIDE;
-
-  CGEventRef event = CGEventCreate(NULL);
-  CGPoint gc_position = CGEventGetLocation(event);
-  CFRelease(event);
-
-  DesktopVector position(gc_position.x, gc_position.y);
-
-  configuration_monitor_->Lock();
-  MacDesktopConfiguration configuration =
-      configuration_monitor_->desktop_configuration();
-  configuration_monitor_->Unlock();
-  float scale = 1.0f;
-
-  // Find the dpi to physical pixel scale for the screen where the mouse cursor
-  // is.
-  for (MacDisplayConfigurations::iterator it = configuration.displays.begin();
-       it != configuration.displays.end(); ++it) {
-    if (it->bounds.Contains(position)) {
-      scale = it->dip_to_pixel_scale;
-      break;
-    }
-  }
-
-  CaptureImage(scale);
-
-  if (mode_ != SHAPE_AND_POSITION)
-    return;
-
-  // If we are capturing cursor for a specific window then we need to figure out
-  // if the current mouse position is covered by another window and also adjust
-  // |position| to make it relative to the window origin.
-  if (window_id_ != kCGNullWindowID) {
-    CGWindowID on_screen_window = window_id_;
-    if (full_screen_chrome_window_detector_) {
-      CGWindowID full_screen_window =
-          full_screen_chrome_window_detector_->FindFullScreenWindow(window_id_);
-
-      if (full_screen_window != kCGNullWindowID)
-        on_screen_window = full_screen_window;
-    }
-
-    // Get list of windows that may be covering parts of |on_screen_window|.
-    // CGWindowListCopyWindowInfo() returns windows in order from front to back,
-    // so |on_screen_window| is expected to be the last in the list.
-    CFArrayRef window_array =
-        CGWindowListCopyWindowInfo(kCGWindowListOptionOnScreenOnly |
-                                       kCGWindowListOptionOnScreenAboveWindow |
-                                       kCGWindowListOptionIncludingWindow,
-                                   on_screen_window);
-    bool found_window = false;
-    if (window_array) {
-      CFIndex count = CFArrayGetCount(window_array);
-      for (CFIndex i = 0; i < count; ++i) {
-        CFDictionaryRef window = reinterpret_cast<CFDictionaryRef>(
-            CFArrayGetValueAtIndex(window_array, i));
-
-        // Skip the Dock window. Dock window covers the whole screen, but it is
-        // transparent.
-        CFStringRef window_name = reinterpret_cast<CFStringRef>(
-            CFDictionaryGetValue(window, kCGWindowName));
-        if (window_name && CFStringCompare(window_name, CFSTR("Dock"), 0) == 0)
-          continue;
-
-        CFDictionaryRef window_bounds = reinterpret_cast<CFDictionaryRef>(
-            CFDictionaryGetValue(window, kCGWindowBounds));
-        CFNumberRef window_number = reinterpret_cast<CFNumberRef>(
-            CFDictionaryGetValue(window, kCGWindowNumber));
-
-        if (window_bounds && window_number) {
-          CGRect gc_window_rect;
-          if (!CGRectMakeWithDictionaryRepresentation(window_bounds,
-                                                      &gc_window_rect)) {
-            continue;
-          }
-          DesktopRect window_rect =
-              DesktopRect::MakeXYWH(gc_window_rect.origin.x,
-                                    gc_window_rect.origin.y,
-                                    gc_window_rect.size.width,
-                                    gc_window_rect.size.height);
-
-          CGWindowID window_id;
-          if (!CFNumberGetValue(window_number, kCFNumberIntType, &window_id))
-            continue;
-
-          if (window_id == on_screen_window) {
-            found_window = true;
-            if (!window_rect.Contains(position))
-              state = OUTSIDE;
-            position = position.subtract(window_rect.top_left());
-
-            assert(i == count - 1);
-            break;
-          } else if (window_rect.Contains(position)) {
-            state = OUTSIDE;
-            position.set(-1, -1);
-            break;
-          }
-        }
-      }
-      CFRelease(window_array);
-    }
-    if (!found_window) {
-      // If we failed to get list of windows or the window wasn't in the list
-      // pretend that the cursor is outside the window. This can happen, e.g. if
-      // the window was closed.
-      state = OUTSIDE;
-      position.set(-1, -1);
-    }
-  } else {
-    assert(screen_id_ >= kFullDesktopScreenId);
-    if (screen_id_ != kFullDesktopScreenId) {
-      // For single screen capturing, convert the position to relative to the
-      // target screen.
-      const MacDisplayConfiguration* config =
-          configuration.FindDisplayConfigurationById(
-              static_cast<CGDirectDisplayID>(screen_id_));
-      if (config) {
-        if (!config->pixel_bounds.Contains(position))
-          state = OUTSIDE;
-        position = position.subtract(config->bounds.top_left());
-      } else {
-        // The target screen is no longer valid.
-        state = OUTSIDE;
-        position.set(-1, -1);
-      }
-    }
-  }
-  // Convert Density Independent Pixel to physical pixel.
-  position = DesktopVector(round(position.x() * scale),
-                           round(position.y() * scale));
-  // TODO(zijiehe): Remove this overload.
-  callback_->OnMouseCursorPosition(state, position);
-  callback_->OnMouseCursorPosition(
-      position.subtract(configuration.bounds.top_left()));
-}
-
-void MouseCursorMonitorMac::CaptureImage(float scale) {
-  NSCursor* nscursor = [NSCursor currentSystemCursor];
-
-  NSImage* nsimage = [nscursor image];
-  if (nsimage == nil || !nsimage.isValid) {
-    return;
-  }
-  NSSize nssize = [nsimage size];  // DIP size
-
-  // No need to caputre cursor image if it's unchanged since last capture.
-  if ([[nsimage TIFFRepresentation] isEqual:[last_cursor_ TIFFRepresentation]]) return;
-  last_cursor_ = nsimage;
-
-  DesktopSize size(round(nssize.width * scale),
-                   round(nssize.height * scale));  // Pixel size
-  NSPoint nshotspot = [nscursor hotSpot];
-  DesktopVector hotspot(
-      std::max(0,
-               std::min(size.width(), static_cast<int>(nshotspot.x * scale))),
-      std::max(0,
-               std::min(size.height(), static_cast<int>(nshotspot.y * scale))));
-  CGImageRef cg_image =
-      [nsimage CGImageForProposedRect:NULL context:nil hints:nil];
-  if (!cg_image)
-    return;
-
-  // Before 10.12, OSX may report 1X cursor on Retina screen. (See
-  // crbug.com/632995.) After 10.12, OSX may report 2X cursor on non-Retina
-  // screen. (See crbug.com/671436.) So scaling the cursor if needed.
-  CGImageRef scaled_cg_image = nil;
-  if (CGImageGetWidth(cg_image) != static_cast<size_t>(size.width())) {
-    scaled_cg_image = CreateScaledCGImage(cg_image, size.width(), size.height());
-    if (scaled_cg_image != nil) {
-      cg_image = scaled_cg_image;
-    }
-  }
-  if (CGImageGetBitsPerPixel(cg_image) != DesktopFrame::kBytesPerPixel * 8 ||
-      CGImageGetWidth(cg_image) != static_cast<size_t>(size.width()) ||
-      CGImageGetBitsPerComponent(cg_image) != 8) {
-    if (scaled_cg_image != nil) CGImageRelease(scaled_cg_image);
-    return;
-  }
-
-  CGDataProviderRef provider = CGImageGetDataProvider(cg_image);
-  CFDataRef image_data_ref = CGDataProviderCopyData(provider);
-  if (image_data_ref == NULL) {
-    if (scaled_cg_image != nil) CGImageRelease(scaled_cg_image);
-    return;
-  }
-
-  const uint8_t* src_data =
-      reinterpret_cast<const uint8_t*>(CFDataGetBytePtr(image_data_ref));
-
-  // Create a MouseCursor that describes the cursor and pass it to
-  // the client.
-  std::unique_ptr<DesktopFrame> image(
-      new BasicDesktopFrame(DesktopSize(size.width(), size.height())));
-
-  int src_stride = CGImageGetBytesPerRow(cg_image);
-  image->CopyPixelsFrom(src_data, src_stride, DesktopRect::MakeSize(size));
-
-  CFRelease(image_data_ref);
-  if (scaled_cg_image != nil) CGImageRelease(scaled_cg_image);
-
-  std::unique_ptr<MouseCursor> cursor(
-      new MouseCursor(image.release(), hotspot));
-
-  callback_->OnMouseCursor(cursor.release());
-}
-
-MouseCursorMonitor* MouseCursorMonitor::CreateForWindow(
-    const DesktopCaptureOptions& options, WindowId window) {
-  return new MouseCursorMonitorMac(options, window, kInvalidScreenId);
-}
-
-MouseCursorMonitor* MouseCursorMonitor::CreateForScreen(
-    const DesktopCaptureOptions& options,
-    ScreenId screen) {
-  return new MouseCursorMonitorMac(options, kCGNullWindowID, screen);
-}
-
-std::unique_ptr<MouseCursorMonitor> MouseCursorMonitor::Create(
-    const DesktopCaptureOptions& options) {
-  return std::unique_ptr<MouseCursorMonitor>(
-      CreateForScreen(options, kFullDesktopScreenId));
-}
-
-}  // namespace webrtc
diff --git a/modules/desktop_capture/mouse_cursor_monitor_null.cc b/modules/desktop_capture/mouse_cursor_monitor_null.cc
deleted file mode 100644
index 6153fac..0000000
--- a/modules/desktop_capture/mouse_cursor_monitor_null.cc
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- *  Copyright (c) 2013 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/desktop_capture/mouse_cursor_monitor.h"
-
-#include <stddef.h>
-
-#include <memory>
-
-#include "webrtc/modules/desktop_capture/desktop_capture_types.h"
-
-namespace webrtc {
-
-MouseCursorMonitor* MouseCursorMonitor::CreateForWindow(
-    const DesktopCaptureOptions& options,
-    WindowId window) {
-  return NULL;
-}
-
-MouseCursorMonitor* MouseCursorMonitor::CreateForScreen(
-    const DesktopCaptureOptions& options,
-    ScreenId screen) {
-  return NULL;
-}
-
-std::unique_ptr<MouseCursorMonitor> MouseCursorMonitor::Create(
-    const DesktopCaptureOptions& options) {
-  return std::unique_ptr<MouseCursorMonitor>(
-      CreateForScreen(options, kFullDesktopScreenId));
-}
-
-}  // namespace webrtc
diff --git a/modules/desktop_capture/mouse_cursor_monitor_unittest.cc b/modules/desktop_capture/mouse_cursor_monitor_unittest.cc
deleted file mode 100644
index 5305fee..0000000
--- a/modules/desktop_capture/mouse_cursor_monitor_unittest.cc
+++ /dev/null
@@ -1,130 +0,0 @@
-/*
- *  Copyright (c) 2013 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 <memory>
-
-#include "webrtc/modules/desktop_capture/mouse_cursor_monitor.h"
-#include "webrtc/modules/desktop_capture/desktop_capturer.h"
-#include "webrtc/modules/desktop_capture/desktop_capture_options.h"
-#include "webrtc/modules/desktop_capture/desktop_frame.h"
-#include "webrtc/modules/desktop_capture/mouse_cursor.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-class MouseCursorMonitorTest : public testing::Test,
-                               public MouseCursorMonitor::Callback {
- public:
-  MouseCursorMonitorTest()
-      : position_received_(false) {
-  }
-
-  // MouseCursorMonitor::Callback interface
-  void OnMouseCursor(MouseCursor* cursor_image) override {
-    cursor_image_.reset(cursor_image);
-  }
-
-  void OnMouseCursorPosition(MouseCursorMonitor::CursorState state,
-                             const DesktopVector& position) override {
-    state_ = state;
-    position_ = position;
-    position_received_ = true;
-  }
-
- protected:
-  std::unique_ptr<MouseCursor> cursor_image_;
-  MouseCursorMonitor::CursorState state_;
-  DesktopVector position_;
-  bool position_received_;
-};
-
-// TODO(sergeyu): On Mac we need to initialize NSApplication before running the
-// tests. Figure out how to do that without breaking other tests in
-// modules_unittests and enable these tests on Mac.
-// https://code.google.com/p/webrtc/issues/detail?id=2532
-//
-// Disabled on Windows due to flake, see:
-// https://code.google.com/p/webrtc/issues/detail?id=3408
-// Disabled on Linux due to flake, see:
-// https://code.google.com/p/webrtc/issues/detail?id=3245
-#if !defined(WEBRTC_MAC) && !defined(WEBRTC_WIN) && !defined(WEBRTC_LINUX)
-#define MAYBE(x) x
-#else
-#define MAYBE(x) DISABLED_##x
-#endif
-
-TEST_F(MouseCursorMonitorTest, MAYBE(FromScreen)) {
-  std::unique_ptr<MouseCursorMonitor> capturer(
-      MouseCursorMonitor::CreateForScreen(
-          DesktopCaptureOptions::CreateDefault(),
-          webrtc::kFullDesktopScreenId));
-  assert(capturer.get());
-  capturer->Init(this, MouseCursorMonitor::SHAPE_AND_POSITION);
-  capturer->Capture();
-
-  EXPECT_TRUE(cursor_image_.get());
-  EXPECT_GE(cursor_image_->hotspot().x(), 0);
-  EXPECT_LE(cursor_image_->hotspot().x(),
-            cursor_image_->image()->size().width());
-  EXPECT_GE(cursor_image_->hotspot().y(), 0);
-  EXPECT_LE(cursor_image_->hotspot().y(),
-            cursor_image_->image()->size().height());
-
-  EXPECT_TRUE(position_received_);
-  EXPECT_EQ(MouseCursorMonitor::INSIDE, state_);
-}
-
-TEST_F(MouseCursorMonitorTest, MAYBE(FromWindow)) {
-  DesktopCaptureOptions options = DesktopCaptureOptions::CreateDefault();
-
-  // First get list of windows.
-  std::unique_ptr<DesktopCapturer> window_capturer(
-      DesktopCapturer::CreateWindowCapturer(options));
-
-  // If window capturing is not supported then skip this test.
-  if (!window_capturer.get())
-    return;
-
-  DesktopCapturer::SourceList sources;
-  EXPECT_TRUE(window_capturer->GetSourceList(&sources));
-
-  // Iterate over all windows and try capturing mouse cursor for each of them.
-  for (size_t i = 0; i < sources.size(); ++i) {
-    cursor_image_.reset();
-    position_received_ = false;
-
-    std::unique_ptr<MouseCursorMonitor> capturer(
-        MouseCursorMonitor::CreateForWindow(
-            DesktopCaptureOptions::CreateDefault(), sources[i].id));
-    assert(capturer.get());
-
-    capturer->Init(this, MouseCursorMonitor::SHAPE_AND_POSITION);
-    capturer->Capture();
-
-    EXPECT_TRUE(cursor_image_.get());
-    EXPECT_TRUE(position_received_);
-  }
-}
-
-// Make sure that OnMouseCursorPosition() is not called in the SHAPE_ONLY mode.
-TEST_F(MouseCursorMonitorTest, MAYBE(ShapeOnly)) {
-  std::unique_ptr<MouseCursorMonitor> capturer(
-      MouseCursorMonitor::CreateForScreen(
-          DesktopCaptureOptions::CreateDefault(),
-          webrtc::kFullDesktopScreenId));
-  assert(capturer.get());
-  capturer->Init(this, MouseCursorMonitor::SHAPE_ONLY);
-  capturer->Capture();
-
-  EXPECT_TRUE(cursor_image_.get());
-  EXPECT_FALSE(position_received_);
-}
-
-}  // namespace webrtc
diff --git a/modules/desktop_capture/mouse_cursor_monitor_win.cc b/modules/desktop_capture/mouse_cursor_monitor_win.cc
deleted file mode 100644
index 174036e..0000000
--- a/modules/desktop_capture/mouse_cursor_monitor_win.cc
+++ /dev/null
@@ -1,218 +0,0 @@
-/*
- *  Copyright (c) 2013 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/desktop_capture/mouse_cursor_monitor.h"
-
-#include <assert.h>
-#include <string.h>
-
-#include <memory>
-
-#include "webrtc/modules/desktop_capture/desktop_capture_types.h"
-#include "webrtc/modules/desktop_capture/desktop_frame.h"
-#include "webrtc/modules/desktop_capture/desktop_geometry.h"
-#include "webrtc/modules/desktop_capture/mouse_cursor.h"
-#include "webrtc/modules/desktop_capture/win/cursor.h"
-#include "webrtc/modules/desktop_capture/win/screen_capture_utils.h"
-#include "webrtc/modules/desktop_capture/win/window_capture_utils.h"
-#include "webrtc/rtc_base/logging.h"
-
-namespace webrtc {
-
-namespace {
-
-bool IsSameCursorShape(const CURSORINFO& left, const CURSORINFO& right) {
-  // If the cursors are not showing, we do not care the hCursor handle.
-  return left.flags == right.flags &&
-         (left.flags != CURSOR_SHOWING ||
-          left.hCursor == right.hCursor);
-}
-
-}  // namespace
-
-class MouseCursorMonitorWin : public MouseCursorMonitor {
- public:
-  explicit MouseCursorMonitorWin(HWND window);
-  explicit MouseCursorMonitorWin(ScreenId screen);
-  ~MouseCursorMonitorWin() override;
-
-  void Init(Callback* callback, Mode mode) override;
-  void Capture() override;
-
- private:
-  // Get the rect of the currently selected screen, relative to the primary
-  // display's top-left. If the screen is disabled or disconnected, or any error
-  // happens, an empty rect is returned.
-  DesktopRect GetScreenRect();
-
-  HWND window_;
-  ScreenId screen_;
-
-  Callback* callback_;
-  Mode mode_;
-
-  HDC desktop_dc_;
-
-  // The last CURSORINFO (converted to MouseCursor) we have sent to the client.
-  CURSORINFO last_cursor_;
-};
-
-MouseCursorMonitorWin::MouseCursorMonitorWin(HWND window)
-    : window_(window),
-      screen_(kInvalidScreenId),
-      callback_(NULL),
-      mode_(SHAPE_AND_POSITION),
-      desktop_dc_(NULL) {
-  memset(&last_cursor_, 0, sizeof(CURSORINFO));
-}
-
-MouseCursorMonitorWin::MouseCursorMonitorWin(ScreenId screen)
-    : window_(NULL),
-      screen_(screen),
-      callback_(NULL),
-      mode_(SHAPE_AND_POSITION),
-      desktop_dc_(NULL) {
-  assert(screen >= kFullDesktopScreenId);
-  memset(&last_cursor_, 0, sizeof(CURSORINFO));
-}
-
-MouseCursorMonitorWin::~MouseCursorMonitorWin() {
-  if (desktop_dc_)
-    ReleaseDC(NULL, desktop_dc_);
-}
-
-void MouseCursorMonitorWin::Init(Callback* callback, Mode mode) {
-  assert(!callback_);
-  assert(callback);
-
-  callback_ = callback;
-  mode_ = mode;
-
-  desktop_dc_ = GetDC(NULL);
-}
-
-void MouseCursorMonitorWin::Capture() {
-  assert(callback_);
-
-  CURSORINFO cursor_info;
-  cursor_info.cbSize = sizeof(CURSORINFO);
-  if (!GetCursorInfo(&cursor_info)) {
-    LOG_F(LS_ERROR) << "Unable to get cursor info. Error = " << GetLastError();
-    return;
-  }
-
-  if (!IsSameCursorShape(cursor_info, last_cursor_)) {
-    if (cursor_info.flags == CURSOR_SUPPRESSED) {
-      // The cursor is intentionally hidden now, send an empty bitmap.
-      last_cursor_ = cursor_info;
-      callback_->OnMouseCursor(new MouseCursor(
-          new BasicDesktopFrame(DesktopSize()), DesktopVector()));
-    } else {
-      // According to MSDN https://goo.gl/u6gyuC, HCURSOR instances returned by
-      // functions other than CreateCursor do not need to be actively destroyed.
-      // And CloseHandle function (https://goo.gl/ja5ycW) does not close a
-      // cursor, so assume a HCURSOR does not need to be closed.
-      if (cursor_info.flags == 0) {
-        // Host machine does not have a hardware mouse attached, we will send a
-        // default one instead.
-        // Note, Windows automatically caches cursor resource, so we do not need
-        // to cache the result of LoadCursor.
-        cursor_info.hCursor = LoadCursor(nullptr, IDC_ARROW);
-      }
-      std::unique_ptr<MouseCursor> cursor(
-          CreateMouseCursorFromHCursor(desktop_dc_, cursor_info.hCursor));
-      if (cursor) {
-        last_cursor_ = cursor_info;
-        callback_->OnMouseCursor(cursor.release());
-      }
-    }
-  }
-
-  if (mode_ != SHAPE_AND_POSITION)
-    return;
-
-  // CURSORINFO::ptScreenPos is in full desktop coordinate.
-  DesktopVector position(cursor_info.ptScreenPos.x, cursor_info.ptScreenPos.y);
-  bool inside = cursor_info.flags == CURSOR_SHOWING;
-
-  if (window_) {
-    DesktopRect original_rect;
-    DesktopRect cropped_rect;
-    if (!GetCroppedWindowRect(window_, &cropped_rect, &original_rect)) {
-      position.set(0, 0);
-      inside = false;
-    } else {
-      if (inside) {
-        HWND windowUnderCursor = WindowFromPoint(cursor_info.ptScreenPos);
-        inside = windowUnderCursor ?
-            (window_ == GetAncestor(windowUnderCursor, GA_ROOT)) : false;
-      }
-      position = position.subtract(cropped_rect.top_left());
-    }
-  } else {
-    assert(screen_ != kInvalidScreenId);
-    DesktopRect rect = GetScreenRect();
-    if (inside)
-      inside = rect.Contains(position);
-    position = position.subtract(rect.top_left());
-  }
-
-  // TODO(zijiehe): Remove this overload.
-  callback_->OnMouseCursorPosition(inside ? INSIDE : OUTSIDE, position);
-  callback_->OnMouseCursorPosition(position);
-}
-
-DesktopRect MouseCursorMonitorWin::GetScreenRect() {
-  assert(screen_ != kInvalidScreenId);
-  if (screen_ == kFullDesktopScreenId) {
-    return DesktopRect::MakeXYWH(
-        GetSystemMetrics(SM_XVIRTUALSCREEN),
-        GetSystemMetrics(SM_YVIRTUALSCREEN),
-        GetSystemMetrics(SM_CXVIRTUALSCREEN),
-        GetSystemMetrics(SM_CYVIRTUALSCREEN));
-  }
-  DISPLAY_DEVICE device;
-  device.cb = sizeof(device);
-  BOOL result = EnumDisplayDevices(NULL, screen_, &device, 0);
-  if (!result)
-    return DesktopRect();
-
-  DEVMODE device_mode;
-  device_mode.dmSize = sizeof(device_mode);
-  device_mode.dmDriverExtra = 0;
-  result = EnumDisplaySettingsEx(
-      device.DeviceName, ENUM_CURRENT_SETTINGS, &device_mode, 0);
-  if (!result)
-    return DesktopRect();
-
-  return DesktopRect::MakeXYWH(device_mode.dmPosition.x,
-                               device_mode.dmPosition.y,
-                               device_mode.dmPelsWidth,
-                               device_mode.dmPelsHeight);
-}
-
-MouseCursorMonitor* MouseCursorMonitor::CreateForWindow(
-    const DesktopCaptureOptions& options, WindowId window) {
-  return new MouseCursorMonitorWin(reinterpret_cast<HWND>(window));
-}
-
-MouseCursorMonitor* MouseCursorMonitor::CreateForScreen(
-    const DesktopCaptureOptions& options,
-    ScreenId screen) {
-  return new MouseCursorMonitorWin(screen);
-}
-
-std::unique_ptr<MouseCursorMonitor> MouseCursorMonitor::Create(
-    const DesktopCaptureOptions& options) {
-  return std::unique_ptr<MouseCursorMonitor>(
-      CreateForScreen(options, kFullDesktopScreenId));
-}
-
-}  // namespace webrtc
diff --git a/modules/desktop_capture/mouse_cursor_monitor_x11.cc b/modules/desktop_capture/mouse_cursor_monitor_x11.cc
deleted file mode 100644
index edde01c..0000000
--- a/modules/desktop_capture/mouse_cursor_monitor_x11.cc
+++ /dev/null
@@ -1,282 +0,0 @@
-/*
- *  Copyright (c) 2013 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 <memory>
-
-#include "webrtc/modules/desktop_capture/mouse_cursor_monitor.h"
-
-#include <X11/extensions/Xfixes.h>
-#include <X11/Xlib.h>
-#include <X11/Xutil.h>
-
-#include "webrtc/modules/desktop_capture/desktop_capture_options.h"
-#include "webrtc/modules/desktop_capture/desktop_capture_types.h"
-#include "webrtc/modules/desktop_capture/desktop_frame.h"
-#include "webrtc/modules/desktop_capture/mouse_cursor.h"
-#include "webrtc/modules/desktop_capture/x11/x_error_trap.h"
-#include "webrtc/rtc_base/logging.h"
-
-namespace {
-
-// WindowCapturer returns window IDs of X11 windows with WM_STATE attribute.
-// These windows may not be immediate children of the root window, because
-// window managers may re-parent them to add decorations. However,
-// XQueryPointer() expects to be passed children of the root. This function
-// searches up the list of the windows to find the root child that corresponds
-// to |window|.
-Window GetTopLevelWindow(Display* display, Window window) {
-  while (true) {
-    // If the window is in WithdrawnState then look at all of its children.
-    ::Window root, parent;
-    ::Window *children;
-    unsigned int num_children;
-    if (!XQueryTree(display, window, &root, &parent, &children,
-                    &num_children)) {
-      LOG(LS_ERROR) << "Failed to query for child windows although window"
-                    << "does not have a valid WM_STATE.";
-      return None;
-    }
-    if (children)
-      XFree(children);
-
-    if (parent == root)
-      break;
-
-    window = parent;
-  }
-
-  return window;
-}
-
-}  // namespace
-
-namespace webrtc {
-
-class MouseCursorMonitorX11 : public MouseCursorMonitor,
-                              public SharedXDisplay::XEventHandler {
- public:
-  MouseCursorMonitorX11(const DesktopCaptureOptions& options, Window window);
-  ~MouseCursorMonitorX11() override;
-
-  void Init(Callback* callback, Mode mode) override;
-  void Capture() override;
-
- private:
-  // SharedXDisplay::XEventHandler interface.
-  bool HandleXEvent(const XEvent& event) override;
-
-  Display* display() { return x_display_->display(); }
-
-  // Captures current cursor shape and stores it in |cursor_shape_|.
-  void CaptureCursor();
-
-  rtc::scoped_refptr<SharedXDisplay> x_display_;
-  Callback* callback_;
-  Mode mode_;
-  Window window_;
-
-  bool have_xfixes_;
-  int xfixes_event_base_;
-  int xfixes_error_base_;
-
-  std::unique_ptr<MouseCursor> cursor_shape_;
-};
-
-MouseCursorMonitorX11::MouseCursorMonitorX11(
-    const DesktopCaptureOptions& options,
-    Window window)
-    : x_display_(options.x_display()),
-      callback_(NULL),
-      mode_(SHAPE_AND_POSITION),
-      window_(window),
-      have_xfixes_(false),
-      xfixes_event_base_(-1),
-      xfixes_error_base_(-1) {
-  // Set a default initial cursor shape in case XFixes is not present.
-  const int kSize = 5;
-  std::unique_ptr<DesktopFrame> default_cursor(
-      new BasicDesktopFrame(DesktopSize(kSize, kSize)));
-  const uint8_t pixels[kSize * kSize] = {
-    0x00, 0x00, 0x00, 0x00, 0x00,
-    0x00, 0xff, 0xff, 0xff, 0x00,
-    0x00, 0xff, 0xff, 0xff, 0x00,
-    0x00, 0xff, 0xff, 0xff, 0x00,
-    0x00, 0x00, 0x00, 0x00, 0x00
-  };
-  uint8_t* ptr = default_cursor->data();
-  for (int y = 0; y < kSize; ++y) {
-    for (int x = 0; x < kSize; ++x) {
-      *ptr++ = pixels[kSize * y + x];
-      *ptr++ = pixels[kSize * y + x];
-      *ptr++ = pixels[kSize * y + x];
-      *ptr++ = 0xff;
-    }
-  }
-  DesktopVector hotspot(2, 2);
-  cursor_shape_.reset(new MouseCursor(default_cursor.release(), hotspot));
-}
-
-MouseCursorMonitorX11::~MouseCursorMonitorX11() {
-  if (have_xfixes_) {
-    x_display_->RemoveEventHandler(xfixes_event_base_ + XFixesCursorNotify,
-                                   this);
-  }
-}
-
-void MouseCursorMonitorX11::Init(Callback* callback, Mode mode) {
-  // Init can be called only once per instance of MouseCursorMonitor.
-  RTC_DCHECK(!callback_);
-  RTC_DCHECK(callback);
-
-  callback_ = callback;
-  mode_ = mode;
-
-  have_xfixes_ =
-      XFixesQueryExtension(display(), &xfixes_event_base_, &xfixes_error_base_);
-
-  if (have_xfixes_) {
-    // Register for changes to the cursor shape.
-    XFixesSelectCursorInput(display(), window_, XFixesDisplayCursorNotifyMask);
-    x_display_->AddEventHandler(xfixes_event_base_ + XFixesCursorNotify, this);
-
-    CaptureCursor();
-  } else {
-    LOG(LS_INFO) << "X server does not support XFixes.";
-  }
-}
-
-void MouseCursorMonitorX11::Capture() {
-  RTC_DCHECK(callback_);
-
-  // Process X11 events in case XFixes has sent cursor notification.
-  x_display_->ProcessPendingXEvents();
-
-  // cursor_shape_| is set only if we were notified of a cursor shape change.
-  if (cursor_shape_.get())
-    callback_->OnMouseCursor(cursor_shape_.release());
-
-  // Get cursor position if necessary.
-  if (mode_ == SHAPE_AND_POSITION) {
-    int root_x;
-    int root_y;
-    int win_x;
-    int win_y;
-    Window root_window;
-    Window child_window;
-    unsigned int mask;
-
-    XErrorTrap error_trap(display());
-    Bool result = XQueryPointer(display(), window_, &root_window, &child_window,
-                                &root_x, &root_y, &win_x, &win_y, &mask);
-    CursorState state;
-    if (!result || error_trap.GetLastErrorAndDisable() != 0) {
-      state = OUTSIDE;
-    } else {
-      // In screen mode (window_ == root_window) the mouse is always inside.
-      // XQueryPointer() sets |child_window| to None if the cursor is outside
-      // |window_|.
-      state =
-          (window_ == root_window || child_window != None) ? INSIDE : OUTSIDE;
-    }
-
-    // As the comments to GetTopLevelWindow() above indicate, in window capture,
-    // the cursor position capture happens in |window_|, while the frame catpure
-    // happens in |child_window|. These two windows are not alwyas same, as
-    // window manager may add some decorations to the |window_|. So translate
-    // the coordinate in |window_| to the coordinate space of |child_window|.
-    if (window_ != root_window && state == INSIDE) {
-      int translated_x, translated_y;
-      Window unused;
-      if (XTranslateCoordinates(display(), window_, child_window, win_x, win_y,
-                                &translated_x, &translated_y, &unused)) {
-        win_x = translated_x;
-        win_y = translated_y;
-      }
-    }
-
-    const DesktopVector position(win_x, win_y);
-    // TODO(zijiehe): Remove this overload.
-    callback_->OnMouseCursorPosition(state, position);
-    // X11 always starts the coordinate from (0, 0), so we do not need to
-    // translate here.
-    callback_->OnMouseCursorPosition(position);
-  }
-}
-
-bool MouseCursorMonitorX11::HandleXEvent(const XEvent& event) {
-  if (have_xfixes_ && event.type == xfixes_event_base_ + XFixesCursorNotify) {
-    const XFixesCursorNotifyEvent* cursor_event =
-        reinterpret_cast<const XFixesCursorNotifyEvent*>(&event);
-    if (cursor_event->subtype == XFixesDisplayCursorNotify) {
-      CaptureCursor();
-    }
-    // Return false, even if the event has been handled, because there might be
-    // other listeners for cursor notifications.
-  }
-  return false;
-}
-
-void MouseCursorMonitorX11::CaptureCursor() {
-  RTC_DCHECK(have_xfixes_);
-
-  XFixesCursorImage* img;
-  {
-    XErrorTrap error_trap(display());
-    img = XFixesGetCursorImage(display());
-    if (!img || error_trap.GetLastErrorAndDisable() != 0)
-       return;
-   }
-
-   std::unique_ptr<DesktopFrame> image(
-       new BasicDesktopFrame(DesktopSize(img->width, img->height)));
-
-  // Xlib stores 32-bit data in longs, even if longs are 64-bits long.
-  unsigned long* src = img->pixels;
-  uint32_t* dst = reinterpret_cast<uint32_t*>(image->data());
-  uint32_t* dst_end = dst + (img->width * img->height);
-  while (dst < dst_end) {
-    *dst++ = static_cast<uint32_t>(*src++);
-  }
-
-  DesktopVector hotspot(std::min(img->width, img->xhot),
-                        std::min(img->height, img->yhot));
-
-  XFree(img);
-
-  cursor_shape_.reset(new MouseCursor(image.release(), hotspot));
-}
-
-// static
-MouseCursorMonitor* MouseCursorMonitor::CreateForWindow(
-    const DesktopCaptureOptions& options, WindowId window) {
-  if (!options.x_display())
-    return NULL;
-  window = GetTopLevelWindow(options.x_display()->display(), window);
-  if (window == None)
-    return NULL;
-  return new MouseCursorMonitorX11(options, window);
-}
-
-MouseCursorMonitor* MouseCursorMonitor::CreateForScreen(
-    const DesktopCaptureOptions& options,
-    ScreenId screen) {
-  if (!options.x_display())
-    return NULL;
-  return new MouseCursorMonitorX11(
-      options, DefaultRootWindow(options.x_display()->display()));
-}
-
-std::unique_ptr<MouseCursorMonitor> MouseCursorMonitor::Create(
-    const DesktopCaptureOptions& options) {
-  return std::unique_ptr<MouseCursorMonitor>(
-      CreateForScreen(options, kFullDesktopScreenId));
-}
-
-}  // namespace webrtc
diff --git a/modules/desktop_capture/resolution_tracker.cc b/modules/desktop_capture/resolution_tracker.cc
deleted file mode 100644
index 326e474..0000000
--- a/modules/desktop_capture/resolution_tracker.cc
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- *  Copyright (c) 2017 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/desktop_capture/resolution_tracker.h"
-
-namespace webrtc {
-
-bool ResolutionTracker::SetResolution(DesktopSize size) {
-  if (!initialized_) {
-    initialized_ = true;
-    last_size_ = size;
-    return false;
-  }
-
-  if (last_size_.equals(size)) {
-    return false;
-  }
-
-  last_size_ = size;
-  return true;
-}
-
-void ResolutionTracker::Reset() {
-  initialized_ = false;
-}
-
-}  // namespace webrtc
diff --git a/modules/desktop_capture/resolution_tracker.h b/modules/desktop_capture/resolution_tracker.h
deleted file mode 100644
index 243333d..0000000
--- a/modules/desktop_capture/resolution_tracker.h
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- *  Copyright (c) 2017 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_DESKTOP_CAPTURE_RESOLUTION_TRACKER_H_
-#define WEBRTC_MODULES_DESKTOP_CAPTURE_RESOLUTION_TRACKER_H_
-
-#include "webrtc/modules/desktop_capture/desktop_geometry.h"
-
-namespace webrtc {
-
-class ResolutionTracker final {
- public:
-  // Sets the resolution to |size|. Returns true if a previous size was recorded
-  // and differs from |size|.
-  bool SetResolution(DesktopSize size);
-
-  // Resets to the initial state.
-  void Reset();
-
- private:
-  DesktopSize last_size_;
-  bool initialized_ = false;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_DESKTOP_CAPTURE_RESOLUTION_TRACKER_H_
diff --git a/modules/desktop_capture/rgba_color.cc b/modules/desktop_capture/rgba_color.cc
deleted file mode 100644
index 6d91de4..0000000
--- a/modules/desktop_capture/rgba_color.cc
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- *  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/desktop_capture/rgba_color.h"
-
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-namespace {
-
-bool AlphaEquals(uint8_t i, uint8_t j) {
-  // On Linux and Windows 8 or early version, '0' was returned for alpha channel
-  // from capturer APIs, on Windows 10, '255' was returned. So a workaround is
-  // to treat 0 as 255.
-  return i == j || ((i == 0 || i == 255) && (j == 0 || j == 255));
-}
-
-}  // namespace
-
-RgbaColor::RgbaColor(uint8_t blue, uint8_t green, uint8_t red, uint8_t alpha) {
-  this->blue = blue;
-  this->green = green;
-  this->red = red;
-  this->alpha = alpha;
-}
-
-RgbaColor::RgbaColor(uint8_t blue, uint8_t green, uint8_t red)
-    : RgbaColor(blue, green, red, 0xff) {}
-
-RgbaColor::RgbaColor(const uint8_t* bgra)
-    : RgbaColor(bgra[0], bgra[1], bgra[2], bgra[3]) {}
-
-RgbaColor::RgbaColor(uint32_t bgra)
-    : RgbaColor(reinterpret_cast<uint8_t*>(&bgra)) {}
-
-bool RgbaColor::operator==(const RgbaColor& right) const {
-  return blue == right.blue && green == right.green && red == right.red &&
-         AlphaEquals(alpha, right.alpha);
-}
-
-bool RgbaColor::operator!=(const RgbaColor& right) const {
-  return !(*this == right);
-}
-
-uint32_t RgbaColor::ToUInt32() const {
-#if defined(WEBRTC_ARCH_LITTLE_ENDIAN)
-  return blue | (green << 8) | (red << 16) | (alpha << 24);
-#else
-  return (blue << 24) | (green << 16) | (red << 8) | alpha;
-#endif
-}
-
-}  // namespace webrtc
diff --git a/modules/desktop_capture/rgba_color.h b/modules/desktop_capture/rgba_color.h
deleted file mode 100644
index 11e8d44..0000000
--- a/modules/desktop_capture/rgba_color.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- *  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_DESKTOP_CAPTURE_RGBA_COLOR_H_
-#define WEBRTC_MODULES_DESKTOP_CAPTURE_RGBA_COLOR_H_
-
-#include <stdint.h>
-
-#include "webrtc/modules/desktop_capture/desktop_frame.h"
-
-namespace webrtc {
-
-// A four-byte structure to store a color in BGRA format. This structure also
-// provides functions to be created from uint8_t array, say,
-// DesktopFrame::data(). It always uses BGRA order for internal storage to match
-// DesktopFrame::data().
-struct RgbaColor final {
-  // Creates a color with BGRA channels.
-  RgbaColor(uint8_t blue, uint8_t green, uint8_t red, uint8_t alpha);
-
-  // Creates a color with BGR channels, and set alpha channel to 255 (opaque).
-  RgbaColor(uint8_t blue, uint8_t green, uint8_t red);
-
-  // Creates a color from four-byte in BGRA order, i.e. DesktopFrame::data().
-  explicit RgbaColor(const uint8_t* bgra);
-
-  // Creates a color from BGRA channels in a uint format. Consumers should make
-  // sure the memory order of the uint32_t is always BGRA from left to right, no
-  // matter the system endian. This function creates an equivalent RgbaColor
-  // instance from the ToUInt32() result of another RgbaColor instance.
-  explicit RgbaColor(uint32_t bgra);
-
-  // Returns true if |this| and |right| is the same color.
-  bool operator==(const RgbaColor& right) const;
-
-  // Returns true if |this| and |right| are different colors.
-  bool operator!=(const RgbaColor& right) const;
-
-  uint32_t ToUInt32() const;
-
-  uint8_t blue;
-  uint8_t green;
-  uint8_t red;
-  uint8_t alpha;
-};
-static_assert(
-    DesktopFrame::kBytesPerPixel == sizeof(RgbaColor),
-    "A pixel in DesktopFrame should be safe to be represented by a RgbaColor");
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_DESKTOP_CAPTURE_RGBA_COLOR_H_
diff --git a/modules/desktop_capture/rgba_color_unittest.cc b/modules/desktop_capture/rgba_color_unittest.cc
deleted file mode 100644
index dc75021..0000000
--- a/modules/desktop_capture/rgba_color_unittest.cc
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- *  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/desktop_capture/rgba_color.h"
-
-#include <vector>
-
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-TEST(RgbaColorTest, ConvertFromAndToUInt32) {
-  static const std::vector<uint32_t> cases{
-      0,         1000,       2693,       3725,       4097,      12532,
-      19902,     27002,      27723,      30944,      65535,     65536,
-      231194,    255985,     322871,     883798,     9585200,   12410056,
-      12641940,  30496970,   105735668,  110117847,  482769275, 542368468,
-      798173396, 2678656711, 3231043200, UINT32_MAX,
-  };
-
-  for (uint32_t value : cases) {
-    RgbaColor left(value);
-    ASSERT_EQ(left.ToUInt32(), value);
-    RgbaColor right(left);
-    ASSERT_EQ(left.ToUInt32(), right.ToUInt32());
-  }
-}
-
-TEST(RgbaColorTest, AlphaChannelEquality) {
-  RgbaColor left(10, 10, 10, 0);
-  RgbaColor right(10, 10, 10, 255);
-  ASSERT_EQ(left, right);
-  right.alpha = 128;
-  ASSERT_NE(left, right);
-}
-
-}  // namespace webrtc
diff --git a/modules/desktop_capture/screen_capture_frame_queue.h b/modules/desktop_capture/screen_capture_frame_queue.h
deleted file mode 100644
index 50201fb..0000000
--- a/modules/desktop_capture/screen_capture_frame_queue.h
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- *  Copyright (c) 2013 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_DESKTOP_CAPTURE_SCREEN_CAPTURE_FRAME_QUEUE_H_
-#define WEBRTC_MODULES_DESKTOP_CAPTURE_SCREEN_CAPTURE_FRAME_QUEUE_H_
-
-#include <memory>
-
-#include "webrtc/rtc_base/constructormagic.h"
-// TODO(zijiehe): These headers are not used in this file, but to avoid build
-// break in remoting/host. We should add headers in each individual files.
-#include "webrtc/modules/desktop_capture/desktop_frame.h"  // Remove
-#include "webrtc/modules/desktop_capture/shared_desktop_frame.h"  // Remove
-
-
-namespace webrtc {
-
-// Represents a queue of reusable video frames. Provides access to the 'current'
-// frame - the frame that the caller is working with at the moment, and to the
-// 'previous' frame - the predecessor of the current frame swapped by
-// MoveToNextFrame() call, if any.
-//
-// The caller is expected to (re)allocate frames if current_frame() returns
-// NULL. The caller can mark all frames in the queue for reallocation (when,
-// say, frame dimensions change). The queue records which frames need updating
-// which the caller can query.
-//
-// Frame consumer is expected to never hold more than kQueueLength frames
-// created by this function and it should release the earliest one before trying
-// to capture a new frame (i.e. before MoveToNextFrame() is called).
-template <typename FrameType>
-class ScreenCaptureFrameQueue {
- public:
-  ScreenCaptureFrameQueue() : current_(0) {}
-  ~ScreenCaptureFrameQueue() = default;
-
-  // Moves to the next frame in the queue, moving the 'current' frame to become
-  // the 'previous' one.
-  void MoveToNextFrame() {
-    current_ = (current_ + 1) % kQueueLength;
-  }
-
-  // Replaces the current frame with a new one allocated by the caller. The
-  // existing frame (if any) is destroyed. Takes ownership of |frame|.
-  void ReplaceCurrentFrame(std::unique_ptr<FrameType> frame) {
-    frames_[current_] = std::move(frame);
-  }
-
-  // Marks all frames obsolete and resets the previous frame pointer. No
-  // frames are freed though as the caller can still access them.
-  void Reset() {
-    for (int i = 0; i < kQueueLength; i++) {
-      frames_[i].reset();
-    }
-    current_ = 0;
-  }
-
-  FrameType* current_frame() const {
-    return frames_[current_].get();
-  }
-
-  FrameType* previous_frame() const {
-    return frames_[(current_ + kQueueLength - 1) % kQueueLength].get();
-  }
-
- private:
-  // Index of the current frame.
-  int current_;
-
-  static const int kQueueLength = 2;
-  std::unique_ptr<FrameType> frames_[kQueueLength];
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(ScreenCaptureFrameQueue);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_DESKTOP_CAPTURE_SCREEN_CAPTURE_FRAME_QUEUE_H_
diff --git a/modules/desktop_capture/screen_capturer_helper.cc b/modules/desktop_capture/screen_capturer_helper.cc
deleted file mode 100644
index 75f1128..0000000
--- a/modules/desktop_capture/screen_capturer_helper.cc
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- *  Copyright (c) 2013 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/desktop_capture/screen_capturer_helper.h"
-
-#include <assert.h>
-#include <algorithm>
-
-namespace webrtc {
-
-ScreenCapturerHelper::ScreenCapturerHelper()
-    : invalid_region_lock_(RWLockWrapper::CreateRWLock()),
-      log_grid_size_(0) {
-}
-
-ScreenCapturerHelper::~ScreenCapturerHelper() {
-}
-
-void ScreenCapturerHelper::ClearInvalidRegion() {
-  WriteLockScoped scoped_invalid_region_lock(*invalid_region_lock_);
-  invalid_region_.Clear();
-}
-
-void ScreenCapturerHelper::InvalidateRegion(
-    const DesktopRegion& invalid_region) {
-  WriteLockScoped scoped_invalid_region_lock(*invalid_region_lock_);
-  invalid_region_.AddRegion(invalid_region);
-}
-
-void ScreenCapturerHelper::InvalidateScreen(const DesktopSize& size) {
-  WriteLockScoped scoped_invalid_region_lock(*invalid_region_lock_);
-  invalid_region_.AddRect(DesktopRect::MakeSize(size));
-}
-
-void ScreenCapturerHelper::TakeInvalidRegion(
-    DesktopRegion* invalid_region) {
-  invalid_region->Clear();
-
-  {
-    WriteLockScoped scoped_invalid_region_lock(*invalid_region_lock_);
-    invalid_region->Swap(&invalid_region_);
-  }
-
-  if (log_grid_size_ > 0) {
-    DesktopRegion expanded_region;
-    ExpandToGrid(*invalid_region, log_grid_size_, &expanded_region);
-    expanded_region.Swap(invalid_region);
-
-    invalid_region->IntersectWith(DesktopRect::MakeSize(size_most_recent_));
-  }
-}
-
-void ScreenCapturerHelper::SetLogGridSize(int log_grid_size) {
-  log_grid_size_ = log_grid_size;
-}
-
-const DesktopSize& ScreenCapturerHelper::size_most_recent() const {
-  return size_most_recent_;
-}
-
-void ScreenCapturerHelper::set_size_most_recent(
-    const DesktopSize& size) {
-  size_most_recent_ = size;
-}
-
-// Returns the largest multiple of |n| that is <= |x|.
-// |n| must be a power of 2. |nMask| is ~(|n| - 1).
-static int DownToMultiple(int x, int nMask) {
-  return (x & nMask);
-}
-
-// Returns the smallest multiple of |n| that is >= |x|.
-// |n| must be a power of 2. |nMask| is ~(|n| - 1).
-static int UpToMultiple(int x, int n, int nMask) {
-  return ((x + n - 1) & nMask);
-}
-
-void ScreenCapturerHelper::ExpandToGrid(const DesktopRegion& region,
-                                        int log_grid_size,
-                                        DesktopRegion* result) {
-  assert(log_grid_size >= 1);
-  int grid_size = 1 << log_grid_size;
-  int grid_size_mask = ~(grid_size - 1);
-
-  result->Clear();
-  for (DesktopRegion::Iterator it(region); !it.IsAtEnd(); it.Advance()) {
-    int left = DownToMultiple(it.rect().left(), grid_size_mask);
-    int right = UpToMultiple(it.rect().right(), grid_size, grid_size_mask);
-    int top = DownToMultiple(it.rect().top(), grid_size_mask);
-    int bottom = UpToMultiple(it.rect().bottom(), grid_size, grid_size_mask);
-    result->AddRect(DesktopRect::MakeLTRB(left, top, right, bottom));
-  }
-}
-
-}  // namespace webrtc
diff --git a/modules/desktop_capture/screen_capturer_helper.h b/modules/desktop_capture/screen_capturer_helper.h
deleted file mode 100644
index 5527bbb..0000000
--- a/modules/desktop_capture/screen_capturer_helper.h
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- *  Copyright (c) 2013 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_DESKTOP_CAPTURE_SCREEN_CAPTURER_HELPER_H_
-#define WEBRTC_MODULES_DESKTOP_CAPTURE_SCREEN_CAPTURER_HELPER_H_
-
-#include <memory>
-
-#include "webrtc/modules/desktop_capture/desktop_geometry.h"
-#include "webrtc/modules/desktop_capture/desktop_region.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/system_wrappers/include/rw_lock_wrapper.h"
-
-namespace webrtc {
-
-// ScreenCapturerHelper is intended to be used by an implementation of the
-// ScreenCapturer interface. It maintains a thread-safe invalid region, and
-// the size of the most recently captured screen, on behalf of the
-// ScreenCapturer that owns it.
-class ScreenCapturerHelper {
- public:
-  ScreenCapturerHelper();
-  ~ScreenCapturerHelper();
-
-  // Clear out the invalid region.
-  void ClearInvalidRegion();
-
-  // Invalidate the specified region.
-  void InvalidateRegion(const DesktopRegion& invalid_region);
-
-  // Invalidate the entire screen, of a given size.
-  void InvalidateScreen(const DesktopSize& size);
-
-  // Copies current invalid region to |invalid_region| clears invalid region
-  // storage for the next frame.
-  void TakeInvalidRegion(DesktopRegion* invalid_region);
-
-  // Access the size of the most recently captured screen.
-  const DesktopSize& size_most_recent() const;
-  void set_size_most_recent(const DesktopSize& size);
-
-  // Lossy compression can result in color values leaking between pixels in one
-  // block. If part of a block changes, then unchanged parts of that block can
-  // be changed in the compressed output. So we need to re-render an entire
-  // block whenever part of the block changes.
-  //
-  // If |log_grid_size| is >= 1, then this function makes TakeInvalidRegion()
-  // produce an invalid region expanded so that its vertices lie on a grid of
-  // size 2 ^ |log_grid_size|. The expanded region is then clipped to the size
-  // of the most recently captured screen, as previously set by
-  // set_size_most_recent().
-  // If |log_grid_size| is <= 0, then the invalid region is not expanded.
-  void SetLogGridSize(int log_grid_size);
-
-  // Expands a region so that its vertices all lie on a grid.
-  // The grid size must be >= 2, so |log_grid_size| must be >= 1.
-  static void ExpandToGrid(const DesktopRegion& region,
-                           int log_grid_size,
-                           DesktopRegion* result);
-
- private:
-  // A region that has been manually invalidated (through InvalidateRegion).
-  // These will be returned as dirty_region in the capture data during the next
-  // capture.
-  DesktopRegion invalid_region_;
-
-  // A lock protecting |invalid_region_| across threads.
-  std::unique_ptr<RWLockWrapper> invalid_region_lock_;
-
-  // The size of the most recently captured screen.
-  DesktopSize size_most_recent_;
-
-  // The log (base 2) of the size of the grid to which the invalid region is
-  // expanded.
-  // If the value is <= 0, then the invalid region is not expanded to a grid.
-  int log_grid_size_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(ScreenCapturerHelper);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_DESKTOP_CAPTURE_SCREEN_CAPTURER_HELPER_H_
diff --git a/modules/desktop_capture/screen_capturer_helper_unittest.cc b/modules/desktop_capture/screen_capturer_helper_unittest.cc
deleted file mode 100644
index 76e7eb3..0000000
--- a/modules/desktop_capture/screen_capturer_helper_unittest.cc
+++ /dev/null
@@ -1,187 +0,0 @@
-/*
- *  Copyright (c) 2013 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/desktop_capture/screen_capturer_helper.h"
-
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-class ScreenCapturerHelperTest : public testing::Test {
- protected:
-  ScreenCapturerHelper capturer_helper_;
-};
-
-TEST_F(ScreenCapturerHelperTest, ClearInvalidRegion) {
-  DesktopRegion region(DesktopRect::MakeXYWH(1, 2, 3, 4));
-  capturer_helper_.InvalidateRegion(region);
-  capturer_helper_.ClearInvalidRegion();
-  capturer_helper_.TakeInvalidRegion(&region);
-  EXPECT_TRUE(region.is_empty());
-}
-
-TEST_F(ScreenCapturerHelperTest, InvalidateRegion) {
-  DesktopRegion region;
-  capturer_helper_.TakeInvalidRegion(&region);
-  EXPECT_TRUE(region.is_empty());
-
-  region.SetRect(DesktopRect::MakeXYWH(1, 2, 3, 4));
-  capturer_helper_.InvalidateRegion(region);
-  capturer_helper_.TakeInvalidRegion(&region);
-  EXPECT_TRUE(DesktopRegion(DesktopRect::MakeXYWH(1, 2, 3, 4)).Equals(region));
-
-  capturer_helper_.InvalidateRegion(
-      DesktopRegion(DesktopRect::MakeXYWH(1, 2, 3, 4)));
-  capturer_helper_.InvalidateRegion(
-      DesktopRegion(DesktopRect::MakeXYWH(4, 2, 3, 4)));
-  capturer_helper_.TakeInvalidRegion(&region);
-  EXPECT_TRUE(DesktopRegion(DesktopRect::MakeXYWH(1, 2, 6, 4)).Equals(region));
-}
-
-TEST_F(ScreenCapturerHelperTest, InvalidateScreen) {
-  DesktopRegion region;
-  capturer_helper_.InvalidateScreen(DesktopSize(12, 34));
-  capturer_helper_.TakeInvalidRegion(&region);
-  EXPECT_TRUE(DesktopRegion(DesktopRect::MakeWH(12, 34)).Equals(region));
-}
-
-TEST_F(ScreenCapturerHelperTest, SizeMostRecent) {
-  EXPECT_TRUE(capturer_helper_.size_most_recent().is_empty());
-  capturer_helper_.set_size_most_recent(DesktopSize(12, 34));
-  EXPECT_TRUE(
-      DesktopSize(12, 34).equals(capturer_helper_.size_most_recent()));
-}
-
-TEST_F(ScreenCapturerHelperTest, SetLogGridSize) {
-  capturer_helper_.set_size_most_recent(DesktopSize(10, 10));
-
-  DesktopRegion region;
-  capturer_helper_.TakeInvalidRegion(&region);
-  EXPECT_TRUE(DesktopRegion().Equals(region));
-
-  capturer_helper_.InvalidateRegion(
-      DesktopRegion(DesktopRect::MakeXYWH(7, 7, 1, 1)));
-  capturer_helper_.TakeInvalidRegion(&region);
-  EXPECT_TRUE(DesktopRegion(DesktopRect::MakeXYWH(7, 7, 1, 1)).Equals(region));
-
-  capturer_helper_.SetLogGridSize(-1);
-  capturer_helper_.InvalidateRegion(
-      DesktopRegion(DesktopRect::MakeXYWH(7, 7, 1, 1)));
-  capturer_helper_.TakeInvalidRegion(&region);
-  EXPECT_TRUE(DesktopRegion(DesktopRect::MakeXYWH(7, 7, 1, 1)).Equals(region));
-
-  capturer_helper_.SetLogGridSize(0);
-  capturer_helper_.InvalidateRegion(
-      DesktopRegion(DesktopRect::MakeXYWH(7, 7, 1, 1)));
-  capturer_helper_.TakeInvalidRegion(&region);
-  EXPECT_TRUE(DesktopRegion(DesktopRect::MakeXYWH(7, 7, 1, 1)).Equals(region));
-
-  capturer_helper_.SetLogGridSize(1);
-  capturer_helper_.InvalidateRegion(
-      DesktopRegion(DesktopRect::MakeXYWH(7, 7, 1, 1)));
-  capturer_helper_.TakeInvalidRegion(&region);
-
-  EXPECT_TRUE(DesktopRegion(DesktopRect::MakeXYWH(6, 6, 2, 2)).Equals(region));
-
-  capturer_helper_.SetLogGridSize(2);
-  capturer_helper_.InvalidateRegion(
-      DesktopRegion(DesktopRect::MakeXYWH(7, 7, 1, 1)));
-  capturer_helper_.TakeInvalidRegion(&region);
-  EXPECT_TRUE(DesktopRegion(DesktopRect::MakeXYWH(4, 4, 4, 4)).Equals(region));
-
-  capturer_helper_.SetLogGridSize(0);
-  capturer_helper_.InvalidateRegion(
-      DesktopRegion(DesktopRect::MakeXYWH(7, 7, 1, 1)));
-  capturer_helper_.TakeInvalidRegion(&region);
-  EXPECT_TRUE(DesktopRegion(DesktopRect::MakeXYWH(7, 7, 1, 1)).Equals(region));
-}
-
-void TestExpandRegionToGrid(const DesktopRegion& region, int log_grid_size,
-                            const DesktopRegion& expanded_region_expected) {
-  DesktopRegion expanded_region1;
-  ScreenCapturerHelper::ExpandToGrid(region, log_grid_size, &expanded_region1);
-  EXPECT_TRUE(expanded_region_expected.Equals(expanded_region1));
-
-  DesktopRegion expanded_region2;
-  ScreenCapturerHelper::ExpandToGrid(expanded_region1, log_grid_size,
-                                     &expanded_region2);
-  EXPECT_TRUE(expanded_region1.Equals(expanded_region2));
-}
-
-void TestExpandRectToGrid(int l, int t, int r, int b, int log_grid_size,
-                          int lExpanded, int tExpanded,
-                          int rExpanded, int bExpanded) {
-  TestExpandRegionToGrid(DesktopRegion(DesktopRect::MakeLTRB(l, t, r, b)),
-                         log_grid_size,
-                         DesktopRegion(DesktopRect::MakeLTRB(
-                             lExpanded, tExpanded, rExpanded, bExpanded)));
-}
-
-TEST_F(ScreenCapturerHelperTest, ExpandToGrid) {
-  const int kLogGridSize = 4;
-  const int kGridSize = 1 << kLogGridSize;
-  for (int i = -2; i <= 2; i++) {
-    int x = i * kGridSize;
-    for (int j = -2; j <= 2; j++) {
-      int y = j * kGridSize;
-      TestExpandRectToGrid(x + 0, y + 0, x + 1, y + 1, kLogGridSize,
-                           x + 0, y + 0, x + kGridSize, y + kGridSize);
-      TestExpandRectToGrid(x + 0, y + kGridSize - 1, x + 1, y + kGridSize,
-                           kLogGridSize,
-                           x + 0, y + 0, x + kGridSize, y + kGridSize);
-      TestExpandRectToGrid(x + kGridSize - 1, y + kGridSize - 1,
-                           x + kGridSize, y + kGridSize, kLogGridSize,
-                           x + 0, y + 0, x + kGridSize, y + kGridSize);
-      TestExpandRectToGrid(x + kGridSize - 1, y + 0,
-                           x + kGridSize, y + 1, kLogGridSize,
-                           x + 0, y + 0, x + kGridSize, y + kGridSize);
-      TestExpandRectToGrid(x - 1, y + 0, x + 1, y + 1, kLogGridSize,
-                           x - kGridSize, y + 0, x + kGridSize, y + kGridSize);
-      TestExpandRectToGrid(x - 1, y - 1, x + 1, y + 0, kLogGridSize,
-                           x - kGridSize, y - kGridSize, x + kGridSize, y);
-      TestExpandRectToGrid(x + 0, y - 1, x + 1, y + 1, kLogGridSize,
-                           x, y - kGridSize, x + kGridSize, y + kGridSize);
-      TestExpandRectToGrid(x - 1, y - 1, x + 0, y + 1, kLogGridSize,
-                           x - kGridSize, y - kGridSize, x, y + kGridSize);
-
-      // Construct a region consisting of 3 pixels and verify that it's expanded
-      // properly to 3 squares that are kGridSize by kGridSize.
-      for (int q = 0; q < 4; ++q) {
-        DesktopRegion region;
-        DesktopRegion expanded_region_expected;
-
-        if (q != 0) {
-          region.AddRect(DesktopRect::MakeXYWH(x - 1, y - 1, 1, 1));
-          expanded_region_expected.AddRect(DesktopRect::MakeXYWH(
-              x - kGridSize, y - kGridSize, kGridSize, kGridSize));
-        }
-        if (q != 1) {
-          region.AddRect(DesktopRect::MakeXYWH(x, y - 1, 1, 1));
-          expanded_region_expected.AddRect(DesktopRect::MakeXYWH(
-              x, y - kGridSize, kGridSize, kGridSize));
-        }
-        if (q != 2) {
-          region.AddRect(DesktopRect::MakeXYWH(x - 1, y, 1, 1));
-          expanded_region_expected.AddRect(DesktopRect::MakeXYWH(
-              x - kGridSize, y, kGridSize, kGridSize));
-        }
-        if (q != 3) {
-          region.AddRect(DesktopRect::MakeXYWH(x, y, 1, 1));
-          expanded_region_expected.AddRect(DesktopRect::MakeXYWH(
-              x, y, kGridSize, kGridSize));
-        }
-
-        TestExpandRegionToGrid(region, kLogGridSize, expanded_region_expected);
-      }
-    }
-  }
-}
-
-}  // namespace webrtc
diff --git a/modules/desktop_capture/screen_capturer_integration_test.cc b/modules/desktop_capture/screen_capturer_integration_test.cc
deleted file mode 100644
index 0ec76c4..0000000
--- a/modules/desktop_capture/screen_capturer_integration_test.cc
+++ /dev/null
@@ -1,381 +0,0 @@
-/*
- *  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 <string.h>
-
-#include <algorithm>
-#include <initializer_list>
-#include <iostream>  // TODO(zijiehe): Remove once flaky has been resolved.
-#include <memory>
-#include <utility>
-
-// TODO(zijiehe): Remove once flaky has been resolved.
-#include "webrtc/modules/desktop_capture/desktop_capture_options.h"
-#include "webrtc/modules/desktop_capture/desktop_capturer.h"
-#include "webrtc/modules/desktop_capture/desktop_frame.h"
-#include "webrtc/modules/desktop_capture/desktop_region.h"
-#include "webrtc/modules/desktop_capture/mock_desktop_capturer_callback.h"
-#include "webrtc/modules/desktop_capture/rgba_color.h"
-#include "webrtc/modules/desktop_capture/screen_drawer.h"
-#include "webrtc/rtc_base/base64.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/test/gmock.h"
-#include "webrtc/test/gtest.h"
-
-#if defined(WEBRTC_WIN)
-#include "webrtc/modules/desktop_capture/win/screen_capturer_win_directx.h"
-#include "webrtc/rtc_base/win32.h"
-#endif  // defined(WEBRTC_WIN)
-
-using ::testing::_;
-
-namespace webrtc {
-
-namespace {
-
-ACTION_P2(SaveCaptureResult, result, dest) {
-  *result = arg0;
-  *dest = std::move(*arg1);
-}
-
-// Returns true if color in |rect| of |frame| is |color|.
-bool ArePixelsColoredBy(const DesktopFrame& frame,
-                        DesktopRect rect,
-                        RgbaColor color,
-                        bool may_partially_draw) {
-  if (!may_partially_draw) {
-    // updated_region() should cover the painted area.
-    DesktopRegion updated_region(frame.updated_region());
-    updated_region.IntersectWith(rect);
-    if (!updated_region.Equals(DesktopRegion(rect))) {
-      return false;
-    }
-  }
-
-  // Color in the |rect| should be |color|.
-  uint8_t* row = frame.GetFrameDataAtPos(rect.top_left());
-  for (int i = 0; i < rect.height(); i++) {
-    uint8_t* column = row;
-    for (int j = 0; j < rect.width(); j++) {
-      if (color != RgbaColor(column)) {
-        return false;
-      }
-      column += DesktopFrame::kBytesPerPixel;
-    }
-    row += frame.stride();
-  }
-  return true;
-}
-
-}  // namespace
-
-class ScreenCapturerIntegrationTest : public testing::Test {
- public:
-  void SetUp() override {
-    capturer_ = DesktopCapturer::CreateScreenCapturer(
-        DesktopCaptureOptions::CreateDefault());
-  }
-
- protected:
-  void TestCaptureUpdatedRegion(
-      std::initializer_list<DesktopCapturer*> capturers) {
-    RTC_DCHECK(capturers.size() > 0);
-    // A large enough area for the tests, which should be able to be fulfilled
-    // by most systems.
-#if defined(WEBRTC_WIN)
-    // On Windows, an interesting warning window may pop up randomly. The root
-    // cause is still under investigation, so reduce the test area to work
-    // around. Bug https://bugs.chromium.org/p/webrtc/issues/detail?id=6666.
-    const int kTestArea = 416;
-#else
-    const int kTestArea = 512;
-#endif
-    const int kRectSize = 32;
-    std::unique_ptr<ScreenDrawer> drawer = ScreenDrawer::Create();
-    if (!drawer || drawer->DrawableRegion().is_empty()) {
-      LOG(LS_WARNING) << "No ScreenDrawer implementation for current platform.";
-      return;
-    }
-    if (drawer->DrawableRegion().width() < kTestArea ||
-        drawer->DrawableRegion().height() < kTestArea) {
-      LOG(LS_WARNING) << "ScreenDrawer::DrawableRegion() is too small for the "
-                         "CaptureUpdatedRegion tests.";
-      return;
-    }
-
-    for (DesktopCapturer* capturer : capturers) {
-      capturer->Start(&callback_);
-    }
-
-    // Draw a set of |kRectSize| by |kRectSize| rectangles at (|i|, |i|), or
-    // |i| by |i| rectangles at (|kRectSize|, |kRectSize|). One of (controlled
-    // by |c|) its primary colors is |i|, and the other two are 0x7f. So we
-    // won't draw a black or white rectangle.
-    for (int c = 0; c < 3; c++) {
-      // A fixed size rectangle.
-      for (int i = 0; i < kTestArea - kRectSize; i += 16) {
-        DesktopRect rect = DesktopRect::MakeXYWH(i, i, kRectSize, kRectSize);
-        rect.Translate(drawer->DrawableRegion().top_left());
-        RgbaColor color((c == 0 ? (i & 0xff) : 0x7f),
-                        (c == 1 ? (i & 0xff) : 0x7f),
-                        (c == 2 ? (i & 0xff) : 0x7f));
-        // Fail fast.
-        ASSERT_NO_FATAL_FAILURE(
-            TestCaptureOneFrame(capturers, drawer.get(), rect, color));
-      }
-
-      // A variable-size rectangle.
-      for (int i = 0; i < kTestArea - kRectSize; i += 16) {
-        DesktopRect rect = DesktopRect::MakeXYWH(kRectSize, kRectSize, i, i);
-        rect.Translate(drawer->DrawableRegion().top_left());
-        RgbaColor color((c == 0 ? (i & 0xff) : 0x7f),
-                        (c == 1 ? (i & 0xff) : 0x7f),
-                        (c == 2 ? (i & 0xff) : 0x7f));
-        // Fail fast.
-        ASSERT_NO_FATAL_FAILURE(
-            TestCaptureOneFrame(capturers, drawer.get(), rect, color));
-      }
-    }
-  }
-
-  void TestCaptureUpdatedRegion() {
-    TestCaptureUpdatedRegion({capturer_.get()});
-  }
-
-#if defined(WEBRTC_WIN)
-  // Enable allow_directx_capturer in DesktopCaptureOptions, but let
-  // DesktopCapturer::CreateScreenCapturer() to decide whether a DirectX
-  // capturer should be used.
-  void MaybeCreateDirectxCapturer() {
-    DesktopCaptureOptions options(DesktopCaptureOptions::CreateDefault());
-    options.set_allow_directx_capturer(true);
-    capturer_ = DesktopCapturer::CreateScreenCapturer(options);
-  }
-
-  bool CreateDirectxCapturer() {
-    if (!ScreenCapturerWinDirectx::IsSupported()) {
-      LOG(LS_WARNING) << "Directx capturer is not supported";
-      return false;
-    }
-
-    MaybeCreateDirectxCapturer();
-    return true;
-  }
-
-  void CreateMagnifierCapturer() {
-    DesktopCaptureOptions options(DesktopCaptureOptions::CreateDefault());
-    options.set_allow_use_magnification_api(true);
-    capturer_ = DesktopCapturer::CreateScreenCapturer(options);
-  }
-#endif  // defined(WEBRTC_WIN)
-
-  std::unique_ptr<DesktopCapturer> capturer_;
-  MockDesktopCapturerCallback callback_;
-
- private:
-  // Repeats capturing the frame by using |capturers| one-by-one for 600 times,
-  // typically 30 seconds, until they succeeded captured a |color| rectangle at
-  // |rect|. This function uses |drawer|->WaitForPendingDraws() between two
-  // attempts to wait for the screen to update.
-  void TestCaptureOneFrame(std::vector<DesktopCapturer*> capturers,
-                           ScreenDrawer* drawer,
-                           DesktopRect rect,
-                           RgbaColor color) {
-    const int wait_capture_round = 600;
-    drawer->Clear();
-    size_t succeeded_capturers = 0;
-    for (int i = 0; i < wait_capture_round; i++) {
-      drawer->DrawRectangle(rect, color);
-      drawer->WaitForPendingDraws();
-      for (size_t j = 0; j < capturers.size(); j++) {
-        if (capturers[j] == nullptr) {
-          // DesktopCapturer should return an empty updated_region() if no
-          // update detected. So we won't test it again if it has captured the
-          // rectangle we drew.
-          continue;
-        }
-        std::unique_ptr<DesktopFrame> frame = CaptureFrame(capturers[j]);
-        if (!frame) {
-          // CaptureFrame() has triggered an assertion failure already, we only
-          // need to return here.
-          return;
-        }
-
-        if (ArePixelsColoredBy(
-            *frame, rect, color, drawer->MayDrawIncompleteShapes())) {
-          capturers[j] = nullptr;
-          succeeded_capturers++;
-        }
-        // The following else if statement is for debugging purpose only, which
-        // should be removed after flaky of ScreenCapturerIntegrationTest has
-        // been resolved.
-        else if (i == wait_capture_round - 1) {
-          std::string result;
-          rtc::Base64::EncodeFromArray(frame->data(),
-                                       frame->size().height() * frame->stride(),
-                                       &result);
-          std::cout << frame->size().width() << " x " << frame->size().height()
-                    << std::endl;
-          // Split the entire string (can be over 4M) into several lines to
-          // avoid browser from sticking.
-          static const size_t kLineLength = 32768;
-          const char* result_end = result.c_str() + result.length();
-          for (const char* it = result.c_str();
-               it < result_end;
-               it += kLineLength) {
-            const size_t max_length = result_end - it;
-            std::cout << std::string(it, std::min(kLineLength, max_length))
-                      << std::endl;
-          }
-          std::cout << "Failed to capture rectangle " << rect.left() << " x "
-                    << rect.top() << " - " << rect.right() << " x "
-                    << rect.bottom() << " with color ("
-                    << static_cast<int>(color.red) << ", "
-                    << static_cast<int>(color.green) << ", "
-                    << static_cast<int>(color.blue) << ", "
-                    << static_cast<int>(color.alpha) << ")" << std::endl;
-          ASSERT_TRUE(false) << "ScreenCapturerIntegrationTest may be flaky. "
-                                "Please kindly FYI the broken link to "
-                                "zijiehe@chromium.org for investigation. If "
-                                "the failure continually happens, but I have "
-                                "not responded as quick as expected, disable "
-                                "*all* tests in "
-                                "screen_capturer_integration_test.cc to "
-                                "unblock other developers.";
-        }
-      }
-
-      if (succeeded_capturers == capturers.size()) {
-        break;
-      }
-    }
-
-    ASSERT_EQ(succeeded_capturers, capturers.size());
-  }
-
-  // Expects |capturer| to successfully capture a frame, and returns it.
-  std::unique_ptr<DesktopFrame> CaptureFrame(DesktopCapturer* capturer) {
-    for (int i = 0; i < 10; i++) {
-      std::unique_ptr<DesktopFrame> frame;
-      DesktopCapturer::Result result;
-      EXPECT_CALL(callback_, OnCaptureResultPtr(_, _))
-          .WillOnce(SaveCaptureResult(&result, &frame));
-      capturer->CaptureFrame();
-      testing::Mock::VerifyAndClearExpectations(&callback_);
-      if (result == DesktopCapturer::Result::SUCCESS) {
-        EXPECT_TRUE(frame);
-        return frame;
-      } else {
-        EXPECT_FALSE(frame);
-      }
-    }
-
-    EXPECT_TRUE(false);
-    return nullptr;
-  }
-};
-
-#if defined(WEBRTC_WIN)
-// ScreenCapturerWinGdi randomly returns blank screen, the root cause is still
-// unknown. Bug, https://bugs.chromium.org/p/webrtc/issues/detail?id=6843.
-#define MAYBE_CaptureUpdatedRegion DISABLED_CaptureUpdatedRegion
-#else
-#define MAYBE_CaptureUpdatedRegion CaptureUpdatedRegion
-#endif
-TEST_F(ScreenCapturerIntegrationTest, MAYBE_CaptureUpdatedRegion) {
-  TestCaptureUpdatedRegion();
-}
-
-#if defined(WEBRTC_WIN)
-// ScreenCapturerWinGdi randomly returns blank screen, the root cause is still
-// unknown. Bug, https://bugs.chromium.org/p/webrtc/issues/detail?id=6843.
-#define MAYBE_TwoCapturers DISABLED_TwoCapturers
-#else
-#define MAYBE_TwoCapturers TwoCapturers
-#endif
-TEST_F(ScreenCapturerIntegrationTest, MAYBE_TwoCapturers) {
-  std::unique_ptr<DesktopCapturer> capturer2 = std::move(capturer_);
-  SetUp();
-  TestCaptureUpdatedRegion({capturer_.get(), capturer2.get()});
-}
-
-#if defined(WEBRTC_WIN)
-
-// Windows cannot capture contents on VMs hosted in GCE. See bug
-// https://bugs.chromium.org/p/webrtc/issues/detail?id=8153.
-TEST_F(ScreenCapturerIntegrationTest,
-       DISABLED_CaptureUpdatedRegionWithDirectxCapturer) {
-  if (!CreateDirectxCapturer()) {
-    return;
-  }
-
-  TestCaptureUpdatedRegion();
-}
-
-TEST_F(ScreenCapturerIntegrationTest, DISABLED_TwoDirectxCapturers) {
-  if (!CreateDirectxCapturer()) {
-    return;
-  }
-
-  std::unique_ptr<DesktopCapturer> capturer2 = std::move(capturer_);
-  RTC_CHECK(CreateDirectxCapturer());
-  TestCaptureUpdatedRegion({capturer_.get(), capturer2.get()});
-}
-
-TEST_F(ScreenCapturerIntegrationTest,
-       DISABLED_CaptureUpdatedRegionWithMagnifierCapturer) {
-  // On Windows 8 or later, magnifier APIs return a frame with a border on test
-  // environment, so disable these tests.
-  // Bug https://bugs.chromium.org/p/webrtc/issues/detail?id=6844
-  // TODO(zijiehe): Find the root cause of the border and failure, which cannot
-  // reproduce on my dev machine.
-  if (rtc::IsWindows8OrLater()) {
-    return;
-  }
-  CreateMagnifierCapturer();
-  TestCaptureUpdatedRegion();
-}
-
-TEST_F(ScreenCapturerIntegrationTest, DISABLED_TwoMagnifierCapturers) {
-  // On Windows 8 or later, magnifier APIs return a frame with a border on test
-  // environment, so disable these tests.
-  // Bug https://bugs.chromium.org/p/webrtc/issues/detail?id=6844
-  // TODO(zijiehe): Find the root cause of the border and failure, which cannot
-  // reproduce on my dev machine.
-  if (rtc::IsWindows8OrLater()) {
-    return;
-  }
-  CreateMagnifierCapturer();
-  std::unique_ptr<DesktopCapturer> capturer2 = std::move(capturer_);
-  CreateMagnifierCapturer();
-  TestCaptureUpdatedRegion({capturer_.get(), capturer2.get()});
-}
-
-TEST_F(ScreenCapturerIntegrationTest,
-       DISABLED_MaybeCaptureUpdatedRegionWithDirectxCapturer) {
-  if (!rtc::IsWindows8OrLater()) {
-    // ScreenCapturerWinGdi randomly returns blank screen, the root cause is
-    // still unknown. Bug,
-    // https://bugs.chromium.org/p/webrtc/issues/detail?id=6843.
-    // On Windows 7 or early version, MaybeCreateDirectxCapturer() always
-    // creates GDI capturer.
-    return;
-  }
-  // Even DirectX capturer is not supported in current system, we should be able
-  // to select a usable capturer.
-  MaybeCreateDirectxCapturer();
-  TestCaptureUpdatedRegion();
-}
-
-#endif  // defined(WEBRTC_WIN)
-
-}  // namespace webrtc
diff --git a/modules/desktop_capture/screen_capturer_mac.mm b/modules/desktop_capture/screen_capturer_mac.mm
deleted file mode 100644
index 9fab819..0000000
--- a/modules/desktop_capture/screen_capturer_mac.mm
+++ /dev/null
@@ -1,1062 +0,0 @@
-/*
- *  Copyright (c) 2013 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 <stddef.h>
-
-#include <memory>
-#include <set>
-#include <utility>
-
-#include <ApplicationServices/ApplicationServices.h>
-#include <Cocoa/Cocoa.h>
-#include <CoreGraphics/CoreGraphics.h>
-#include <dlfcn.h>
-#include <OpenGL/CGLMacro.h>
-#include <OpenGL/OpenGL.h>
-
-#include "webrtc/modules/desktop_capture/desktop_capture_options.h"
-#include "webrtc/modules/desktop_capture/desktop_capturer.h"
-#include "webrtc/modules/desktop_capture/desktop_frame.h"
-#include "webrtc/modules/desktop_capture/desktop_geometry.h"
-#include "webrtc/modules/desktop_capture/desktop_region.h"
-#include "webrtc/modules/desktop_capture/mac/desktop_configuration.h"
-#include "webrtc/modules/desktop_capture/mac/desktop_configuration_monitor.h"
-#include "webrtc/modules/desktop_capture/mac/scoped_pixel_buffer_object.h"
-#include "webrtc/modules/desktop_capture/screen_capture_frame_queue.h"
-#include "webrtc/modules/desktop_capture/screen_capturer_helper.h"
-#include "webrtc/modules/desktop_capture/shared_desktop_frame.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/macutils.h"
-#include "webrtc/rtc_base/timeutils.h"
-
-// Once Chrome no longer supports OSX 10.8, everything within this
-// preprocessor block can be removed. https://crbug.com/579255
-#if !defined(MAC_OS_X_VERSION_10_9) || \
-    MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_9
-CG_EXTERN const CGRect* CGDisplayStreamUpdateGetRects(
-    CGDisplayStreamUpdateRef updateRef,
-    CGDisplayStreamUpdateRectType rectType,
-    size_t* rectCount);
-CG_EXTERN CFRunLoopSourceRef
-CGDisplayStreamGetRunLoopSource(CGDisplayStreamRef displayStream);
-CG_EXTERN CGError CGDisplayStreamStop(CGDisplayStreamRef displayStream);
-CG_EXTERN CGError CGDisplayStreamStart(CGDisplayStreamRef displayStream);
-CG_EXTERN CGDisplayStreamRef
-CGDisplayStreamCreate(CGDirectDisplayID display,
-                      size_t outputWidth,
-                      size_t outputHeight,
-                      int32_t pixelFormat,
-                      CFDictionaryRef properties,
-                      CGDisplayStreamFrameAvailableHandler handler);
-#endif
-
-namespace webrtc {
-
-namespace {
-
-// CGDisplayStreamRefs need to be destroyed asynchronously after receiving a
-// kCGDisplayStreamFrameStatusStopped callback from CoreGraphics. This may
-// happen after the ScreenCapturerMac has been destroyed. DisplayStreamManager
-// is responsible for destroying all extant CGDisplayStreamRefs, and will
-// destroy itself once it's done.
-class DisplayStreamManager {
- public:
-  int GetUniqueId() { return ++unique_id_generator_; }
-  void DestroyStream(int unique_id) {
-    auto it = display_stream_wrappers_.find(unique_id);
-    RTC_CHECK(it != display_stream_wrappers_.end());
-    RTC_CHECK(!it->second.active);
-    CFRelease(it->second.stream);
-    display_stream_wrappers_.erase(it);
-
-    if (ready_for_self_destruction_ && display_stream_wrappers_.empty())
-      delete this;
-  }
-
-  void SaveStream(int unique_id,
-                  CGDisplayStreamRef stream) {
-    RTC_CHECK(unique_id <= unique_id_generator_);
-    DisplayStreamWrapper wrapper;
-    wrapper.stream = stream;
-    display_stream_wrappers_[unique_id] = wrapper;
-  }
-
-  void UnregisterActiveStreams() {
-    for (auto& pair : display_stream_wrappers_) {
-      DisplayStreamWrapper& wrapper = pair.second;
-      if (wrapper.active) {
-        wrapper.active = false;
-        CFRunLoopSourceRef source =
-            CGDisplayStreamGetRunLoopSource(wrapper.stream);
-        CFRunLoopRemoveSource(CFRunLoopGetCurrent(), source,
-                              kCFRunLoopCommonModes);
-        CGDisplayStreamStop(wrapper.stream);
-      }
-    }
-  }
-
-  void PrepareForSelfDestruction() {
-    ready_for_self_destruction_ = true;
-
-    if (display_stream_wrappers_.empty())
-      delete this;
-  }
-
-  // Once the DisplayStreamManager is ready for destruction, the
-  // ScreenCapturerMac is no longer present. Any updates should be ignored.
-  bool ShouldIgnoreUpdates() { return ready_for_self_destruction_; }
-
- private:
-  struct DisplayStreamWrapper {
-    // The registered CGDisplayStreamRef.
-    CGDisplayStreamRef stream = nullptr;
-
-    // Set to false when the stream has been stopped. An asynchronous callback
-    // from CoreGraphics will let us destroy the CGDisplayStreamRef.
-    bool active = true;
-  };
-
-  std::map<int, DisplayStreamWrapper> display_stream_wrappers_;
-  int unique_id_generator_ = 0;
-  bool ready_for_self_destruction_ = false;
-};
-
-// Definitions used to dynamic-link to deprecated OS 10.6 functions.
-const char* kApplicationServicesLibraryName =
-    "/System/Library/Frameworks/ApplicationServices.framework/"
-    "ApplicationServices";
-typedef void* (*CGDisplayBaseAddressFunc)(CGDirectDisplayID);
-typedef size_t (*CGDisplayBytesPerRowFunc)(CGDirectDisplayID);
-typedef size_t (*CGDisplayBitsPerPixelFunc)(CGDirectDisplayID);
-const char* kOpenGlLibraryName =
-    "/System/Library/Frameworks/OpenGL.framework/OpenGL";
-typedef CGLError (*CGLSetFullScreenFunc)(CGLContextObj);
-
-// Standard Mac displays have 72dpi, but we report 96dpi for
-// consistency with Windows and Linux.
-const int kStandardDPI = 96;
-
-// Scales all coordinates of a rect by a specified factor.
-DesktopRect ScaleAndRoundCGRect(const CGRect& rect, float scale) {
-  return DesktopRect::MakeLTRB(
-    static_cast<int>(floor(rect.origin.x * scale)),
-    static_cast<int>(floor(rect.origin.y * scale)),
-    static_cast<int>(ceil((rect.origin.x + rect.size.width) * scale)),
-    static_cast<int>(ceil((rect.origin.y + rect.size.height) * scale)));
-}
-
-// Copy pixels in the |rect| from |src_place| to |dest_plane|. |rect| should be
-// relative to the origin of |src_plane| and |dest_plane|.
-void CopyRect(const uint8_t* src_plane,
-              int src_plane_stride,
-              uint8_t* dest_plane,
-              int dest_plane_stride,
-              int bytes_per_pixel,
-              const DesktopRect& rect) {
-  // Get the address of the starting point.
-  const int src_y_offset = src_plane_stride * rect.top();
-  const int dest_y_offset = dest_plane_stride * rect.top();
-  const int x_offset = bytes_per_pixel * rect.left();
-  src_plane += src_y_offset + x_offset;
-  dest_plane += dest_y_offset + x_offset;
-
-  // Copy pixels in the rectangle line by line.
-  const int bytes_per_line = bytes_per_pixel * rect.width();
-  const int height = rect.height();
-  for (int i = 0 ; i < height; ++i) {
-    memcpy(dest_plane, src_plane, bytes_per_line);
-    src_plane += src_plane_stride;
-    dest_plane += dest_plane_stride;
-  }
-}
-
-// Returns an array of CGWindowID for all the on-screen windows except
-// |window_to_exclude|, or NULL if the window is not found or it fails. The
-// caller should release the returned CFArrayRef.
-CFArrayRef CreateWindowListWithExclusion(CGWindowID window_to_exclude) {
-  if (!window_to_exclude)
-    return nullptr;
-
-  CFArrayRef all_windows = CGWindowListCopyWindowInfo(
-      kCGWindowListOptionOnScreenOnly, kCGNullWindowID);
-  if (!all_windows)
-    return nullptr;
-
-  CFMutableArrayRef returned_array =
-      CFArrayCreateMutable(nullptr, CFArrayGetCount(all_windows), nullptr);
-
-  bool found = false;
-  for (CFIndex i = 0; i < CFArrayGetCount(all_windows); ++i) {
-    CFDictionaryRef window = reinterpret_cast<CFDictionaryRef>(
-        CFArrayGetValueAtIndex(all_windows, i));
-
-    CFNumberRef id_ref = reinterpret_cast<CFNumberRef>(
-        CFDictionaryGetValue(window, kCGWindowNumber));
-
-    CGWindowID id;
-    CFNumberGetValue(id_ref, kCFNumberIntType, &id);
-    if (id == window_to_exclude) {
-      found = true;
-      continue;
-    }
-    CFArrayAppendValue(returned_array, reinterpret_cast<void *>(id));
-  }
-  CFRelease(all_windows);
-
-  if (!found) {
-    CFRelease(returned_array);
-    returned_array = nullptr;
-  }
-  return returned_array;
-}
-
-// Returns the bounds of |window| in physical pixels, enlarged by a small amount
-// on four edges to take account of the border/shadow effects.
-DesktopRect GetExcludedWindowPixelBounds(CGWindowID window,
-                                         float dip_to_pixel_scale) {
-  // The amount of pixels to add to the actual window bounds to take into
-  // account of the border/shadow effects.
-  static const int kBorderEffectSize = 20;
-  CGRect rect;
-  CGWindowID ids[1];
-  ids[0] = window;
-
-  CFArrayRef window_id_array =
-      CFArrayCreate(nullptr, reinterpret_cast<const void**>(&ids), 1, nullptr);
-  CFArrayRef window_array =
-      CGWindowListCreateDescriptionFromArray(window_id_array);
-
-  if (CFArrayGetCount(window_array) > 0) {
-    CFDictionaryRef window = reinterpret_cast<CFDictionaryRef>(
-        CFArrayGetValueAtIndex(window_array, 0));
-    CFDictionaryRef bounds_ref = reinterpret_cast<CFDictionaryRef>(
-        CFDictionaryGetValue(window, kCGWindowBounds));
-    CGRectMakeWithDictionaryRepresentation(bounds_ref, &rect);
-  }
-
-  CFRelease(window_id_array);
-  CFRelease(window_array);
-
-  rect.origin.x -= kBorderEffectSize;
-  rect.origin.y -= kBorderEffectSize;
-  rect.size.width += kBorderEffectSize * 2;
-  rect.size.height += kBorderEffectSize * 2;
-  // |rect| is in DIP, so convert to physical pixels.
-  return ScaleAndRoundCGRect(rect, dip_to_pixel_scale);
-}
-
-// Create an image of the given region using the given |window_list|.
-// |pixel_bounds| should be in the primary display's coordinate in physical
-// pixels. The caller should release the returned CGImageRef and CFDataRef.
-CGImageRef CreateExcludedWindowRegionImage(const DesktopRect& pixel_bounds,
-                                           float dip_to_pixel_scale,
-                                           CFArrayRef window_list) {
-  CGRect window_bounds;
-  // The origin is in DIP while the size is in physical pixels. That's what
-  // CGWindowListCreateImageFromArray expects.
-  window_bounds.origin.x = pixel_bounds.left() / dip_to_pixel_scale;
-  window_bounds.origin.y = pixel_bounds.top() / dip_to_pixel_scale;
-  window_bounds.size.width = pixel_bounds.width();
-  window_bounds.size.height = pixel_bounds.height();
-
-  return CGWindowListCreateImageFromArray(
-      window_bounds, window_list, kCGWindowImageDefault);
-}
-
-// A class to perform video frame capturing for mac.
-class ScreenCapturerMac : public DesktopCapturer {
- public:
-  explicit ScreenCapturerMac(
-      rtc::scoped_refptr<DesktopConfigurationMonitor> desktop_config_monitor,
-      bool detect_updated_region);
-  ~ScreenCapturerMac() override;
-
-  bool Init();
-
-  // DesktopCapturer interface.
-  void Start(Callback* callback) override;
-  void CaptureFrame() override;
-  void SetExcludedWindow(WindowId window) override;
-  bool GetSourceList(SourceList* screens) override;
-  bool SelectSource(SourceId id) override;
-
- private:
-  void GlBlitFast(const DesktopFrame& frame,
-                  const DesktopRegion& region);
-  void GlBlitSlow(const DesktopFrame& frame);
-  void CgBlitPreLion(const DesktopFrame& frame,
-                     const DesktopRegion& region);
-  // Returns false if the selected screen is no longer valid.
-  bool CgBlitPostLion(const DesktopFrame& frame,
-                      const DesktopRegion& region);
-
-  // Called when the screen configuration is changed.
-  void ScreenConfigurationChanged();
-
-  bool RegisterRefreshAndMoveHandlers();
-  void UnregisterRefreshAndMoveHandlers();
-
-  void ScreenRefresh(CGRectCount count,
-                     const CGRect *rect_array,
-                     DesktopVector display_origin);
-  void ReleaseBuffers();
-
-  std::unique_ptr<DesktopFrame> CreateFrame();
-
-  const bool detect_updated_region_;
-
-  Callback* callback_ = nullptr;
-
-  CGLContextObj cgl_context_ = nullptr;
-  ScopedPixelBufferObject pixel_buffer_object_;
-
-  // Queue of the frames buffers.
-  ScreenCaptureFrameQueue<SharedDesktopFrame> queue_;
-
-  // Current display configuration.
-  MacDesktopConfiguration desktop_config_;
-
-  // Currently selected display, or 0 if the full desktop is selected. On OS X
-  // 10.6 and before, this is always 0.
-  CGDirectDisplayID current_display_ = 0;
-
-  // The physical pixel bounds of the current screen.
-  DesktopRect screen_pixel_bounds_;
-
-  // The dip to physical pixel scale of the current screen.
-  float dip_to_pixel_scale_ = 1.0f;
-
-  // A thread-safe list of invalid rectangles, and the size of the most
-  // recently captured screen.
-  ScreenCapturerHelper helper_;
-
-  // Contains an invalid region from the previous capture.
-  DesktopRegion last_invalid_region_;
-
-  // Monitoring display reconfiguration.
-  rtc::scoped_refptr<DesktopConfigurationMonitor> desktop_config_monitor_;
-
-  // Dynamically link to deprecated APIs for Mac OS X 10.6 support.
-  void* app_services_library_ = nullptr;
-  CGDisplayBaseAddressFunc cg_display_base_address_ = nullptr;
-  CGDisplayBytesPerRowFunc cg_display_bytes_per_row_ = nullptr;
-  CGDisplayBitsPerPixelFunc cg_display_bits_per_pixel_ = nullptr;
-  void* opengl_library_ = nullptr;
-  CGLSetFullScreenFunc cgl_set_full_screen_ = nullptr;
-
-  CGWindowID excluded_window_ = 0;
-
-  // A self-owned object that will destroy itself after ScreenCapturerMac and
-  // all display streams have been destroyed..
-  DisplayStreamManager* display_stream_manager_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(ScreenCapturerMac);
-};
-
-// DesktopFrame wrapper that flips wrapped frame upside down by inverting
-// stride.
-class InvertedDesktopFrame : public DesktopFrame {
- public:
-  InvertedDesktopFrame(std::unique_ptr<DesktopFrame> frame)
-      : DesktopFrame(
-            frame->size(),
-            -frame->stride(),
-            frame->data() + (frame->size().height() - 1) * frame->stride(),
-            frame->shared_memory()) {
-    original_frame_ = std::move(frame);
-    MoveFrameInfoFrom(original_frame_.get());
-  }
-  ~InvertedDesktopFrame() override {}
-
- private:
-  std::unique_ptr<DesktopFrame> original_frame_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(InvertedDesktopFrame);
-};
-
-ScreenCapturerMac::ScreenCapturerMac(
-    rtc::scoped_refptr<DesktopConfigurationMonitor> desktop_config_monitor,
-    bool detect_updated_region)
-    : detect_updated_region_(detect_updated_region),
-      desktop_config_monitor_(desktop_config_monitor) {
-  display_stream_manager_ = new DisplayStreamManager;
-}
-
-ScreenCapturerMac::~ScreenCapturerMac() {
-  ReleaseBuffers();
-  UnregisterRefreshAndMoveHandlers();
-  display_stream_manager_->PrepareForSelfDestruction();
-  dlclose(app_services_library_);
-  dlclose(opengl_library_);
-}
-
-bool ScreenCapturerMac::Init() {
-  desktop_config_monitor_->Lock();
-  desktop_config_ = desktop_config_monitor_->desktop_configuration();
-  desktop_config_monitor_->Unlock();
-  if (!RegisterRefreshAndMoveHandlers()) {
-    return false;
-  }
-  ScreenConfigurationChanged();
-  return true;
-}
-
-void ScreenCapturerMac::ReleaseBuffers() {
-  if (cgl_context_) {
-    pixel_buffer_object_.Release();
-    CGLDestroyContext(cgl_context_);
-    cgl_context_ = nullptr;
-  }
-  // The buffers might be in use by the encoder, so don't delete them here.
-  // Instead, mark them as "needs update"; next time the buffers are used by
-  // the capturer, they will be recreated if necessary.
-  queue_.Reset();
-}
-
-void ScreenCapturerMac::Start(Callback* callback) {
-  assert(!callback_);
-  assert(callback);
-
-  callback_ = callback;
-}
-
-void ScreenCapturerMac::CaptureFrame() {
-  int64_t capture_start_time_nanos = rtc::TimeNanos();
-
-  queue_.MoveToNextFrame();
-  RTC_DCHECK(!queue_.current_frame() || !queue_.current_frame()->IsShared());
-
-  desktop_config_monitor_->Lock();
-  MacDesktopConfiguration new_config =
-      desktop_config_monitor_->desktop_configuration();
-  if (!desktop_config_.Equals(new_config)) {
-    desktop_config_ = new_config;
-    // If the display configuraiton has changed then refresh capturer data
-    // structures. Occasionally, the refresh and move handlers are lost when
-    // the screen mode changes, so re-register them here.
-    UnregisterRefreshAndMoveHandlers();
-    RegisterRefreshAndMoveHandlers();
-    ScreenConfigurationChanged();
-  }
-
-  DesktopRegion region;
-  helper_.TakeInvalidRegion(&region);
-
-  // If the current buffer is from an older generation then allocate a new one.
-  // Note that we can't reallocate other buffers at this point, since the caller
-  // may still be reading from them.
-  if (!queue_.current_frame())
-    queue_.ReplaceCurrentFrame(SharedDesktopFrame::Wrap(CreateFrame()));
-
-  DesktopFrame* current_frame = queue_.current_frame();
-
-  bool flip = false;  // GL capturers need flipping.
-  if (rtc::GetOSVersionName() >= rtc::kMacOSLion) {
-    // Lion requires us to use their new APIs for doing screen capture. These
-    // APIS currently crash on 10.6.8 if there is no monitor attached.
-    if (!CgBlitPostLion(*current_frame, region)) {
-      desktop_config_monitor_->Unlock();
-      callback_->OnCaptureResult(Result::ERROR_PERMANENT, nullptr);
-      return;
-    }
-  } else if (cgl_context_) {
-    flip = true;
-    if (pixel_buffer_object_.get() != 0) {
-      GlBlitFast(*current_frame, region);
-    } else {
-      // See comment in ScopedPixelBufferObject::Init about why the slow
-      // path is always used on 10.5.
-      GlBlitSlow(*current_frame);
-    }
-  } else {
-    CgBlitPreLion(*current_frame, region);
-  }
-
-  std::unique_ptr<DesktopFrame> new_frame = queue_.current_frame()->Share();
-  if (detect_updated_region_) {
-    *new_frame->mutable_updated_region() = region;
-  } else {
-    new_frame->mutable_updated_region()->AddRect(
-        DesktopRect::MakeSize(new_frame->size()));
-  }
-
-  if (flip)
-    new_frame.reset(new InvertedDesktopFrame(std::move(new_frame)));
-
-  if (current_display_) {
-    const MacDisplayConfiguration* config =
-        desktop_config_.FindDisplayConfigurationById(current_display_);
-    if (config) {
-      new_frame->set_top_left(config->bounds.top_left().subtract(
-          desktop_config_.bounds.top_left()));
-    }
-  }
-
-  helper_.set_size_most_recent(new_frame->size());
-
-  // Signal that we are done capturing data from the display framebuffer,
-  // and accessing display structures.
-  desktop_config_monitor_->Unlock();
-
-  new_frame->set_capture_time_ms((rtc::TimeNanos() - capture_start_time_nanos) /
-                                 rtc::kNumNanosecsPerMillisec);
-  callback_->OnCaptureResult(Result::SUCCESS, std::move(new_frame));
-}
-
-void ScreenCapturerMac::SetExcludedWindow(WindowId window) {
-  excluded_window_ = window;
-}
-
-bool ScreenCapturerMac::GetSourceList(SourceList* screens) {
-  assert(screens->size() == 0);
-  if (rtc::GetOSVersionName() < rtc::kMacOSLion) {
-    // Single monitor cast is not supported on pre OS X 10.7.
-    screens->push_back({kFullDesktopScreenId});
-    return true;
-  }
-
-  for (MacDisplayConfigurations::iterator it = desktop_config_.displays.begin();
-       it != desktop_config_.displays.end(); ++it) {
-    screens->push_back({it->id});
-  }
-  return true;
-}
-
-bool ScreenCapturerMac::SelectSource(SourceId id) {
-  if (rtc::GetOSVersionName() < rtc::kMacOSLion) {
-    // Ignore the screen selection on unsupported OS.
-    assert(!current_display_);
-    return id == kFullDesktopScreenId;
-  }
-
-  if (id == kFullDesktopScreenId) {
-    current_display_ = 0;
-  } else {
-    const MacDisplayConfiguration* config =
-        desktop_config_.FindDisplayConfigurationById(
-            static_cast<CGDirectDisplayID>(id));
-    if (!config)
-      return false;
-    current_display_ = config->id;
-  }
-
-  ScreenConfigurationChanged();
-  return true;
-}
-
-void ScreenCapturerMac::GlBlitFast(const DesktopFrame& frame,
-                                   const DesktopRegion& region) {
-  // Clip to the size of our current screen.
-  DesktopRect clip_rect = DesktopRect::MakeSize(frame.size());
-  if (queue_.previous_frame()) {
-    // We are doing double buffer for the capture data so we just need to copy
-    // the invalid region from the previous capture in the current buffer.
-    // TODO(hclam): We can reduce the amount of copying here by subtracting
-    // |capturer_helper_|s region from |last_invalid_region_|.
-    // http://crbug.com/92354
-
-    // Since the image obtained from OpenGL is upside-down, need to do some
-    // magic here to copy the correct rectangle.
-    const int y_offset = (frame.size().height() - 1) * frame.stride();
-    for (DesktopRegion::Iterator i(last_invalid_region_);
-         !i.IsAtEnd(); i.Advance()) {
-      DesktopRect copy_rect = i.rect();
-      copy_rect.IntersectWith(clip_rect);
-      if (!copy_rect.is_empty()) {
-        CopyRect(queue_.previous_frame()->data() + y_offset,
-                 -frame.stride(),
-                 frame.data() + y_offset,
-                 -frame.stride(),
-                 DesktopFrame::kBytesPerPixel,
-                 copy_rect);
-      }
-    }
-  }
-  last_invalid_region_ = region;
-
-  CGLContextObj CGL_MACRO_CONTEXT = cgl_context_;
-  glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, pixel_buffer_object_.get());
-  glReadPixels(0, 0, frame.size().width(), frame.size().height(), GL_BGRA,
-               GL_UNSIGNED_BYTE, 0);
-  GLubyte* ptr = static_cast<GLubyte*>(
-      glMapBufferARB(GL_PIXEL_PACK_BUFFER_ARB, GL_READ_ONLY_ARB));
-  if (!ptr) {
-    // If the buffer can't be mapped, assume that it's no longer valid and
-    // release it.
-    pixel_buffer_object_.Release();
-  } else {
-    // Copy only from the dirty rects. Since the image obtained from OpenGL is
-    // upside-down we need to do some magic here to copy the correct rectangle.
-    const int y_offset = (frame.size().height() - 1) * frame.stride();
-    for (DesktopRegion::Iterator i(region);
-         !i.IsAtEnd(); i.Advance()) {
-      DesktopRect copy_rect = i.rect();
-      copy_rect.IntersectWith(clip_rect);
-      if (!copy_rect.is_empty()) {
-        CopyRect(ptr + y_offset,
-                 -frame.stride(),
-                 frame.data() + y_offset,
-                 -frame.stride(),
-                 DesktopFrame::kBytesPerPixel,
-                 copy_rect);
-      }
-    }
-  }
-  if (!glUnmapBufferARB(GL_PIXEL_PACK_BUFFER_ARB)) {
-    // If glUnmapBuffer returns false, then the contents of the data store are
-    // undefined. This might be because the screen mode has changed, in which
-    // case it will be recreated in ScreenConfigurationChanged, but releasing
-    // the object here is the best option. Capturing will fall back on
-    // GlBlitSlow until such time as the pixel buffer object is recreated.
-    pixel_buffer_object_.Release();
-  }
-  glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, 0);
-}
-
-void ScreenCapturerMac::GlBlitSlow(const DesktopFrame& frame) {
-  CGLContextObj CGL_MACRO_CONTEXT = cgl_context_;
-  glReadBuffer(GL_FRONT);
-  glPushClientAttrib(GL_CLIENT_PIXEL_STORE_BIT);
-  glPixelStorei(GL_PACK_ALIGNMENT, 4);  // Force 4-byte alignment.
-  glPixelStorei(GL_PACK_ROW_LENGTH, 0);
-  glPixelStorei(GL_PACK_SKIP_ROWS, 0);
-  glPixelStorei(GL_PACK_SKIP_PIXELS, 0);
-  // Read a block of pixels from the frame buffer.
-  glReadPixels(0, 0, frame.size().width(), frame.size().height(),
-               GL_BGRA, GL_UNSIGNED_BYTE, frame.data());
-  glPopClientAttrib();
-}
-
-void ScreenCapturerMac::CgBlitPreLion(const DesktopFrame& frame,
-                                      const DesktopRegion& region) {
-  // Copy the entire contents of the previous capture buffer, to capture over.
-  // TODO(wez): Get rid of this as per crbug.com/145064, or implement
-  // crbug.com/92354.
-  if (queue_.previous_frame()) {
-    memcpy(frame.data(),
-           queue_.previous_frame()->data(),
-           frame.stride() * frame.size().height());
-  }
-
-  for (size_t i = 0; i < desktop_config_.displays.size(); ++i) {
-    const MacDisplayConfiguration& display_config = desktop_config_.displays[i];
-
-    // Use deprecated APIs to determine the display buffer layout.
-    assert(cg_display_base_address_ && cg_display_bytes_per_row_ &&
-        cg_display_bits_per_pixel_);
-    uint8_t* display_base_address = reinterpret_cast<uint8_t*>(
-        (*cg_display_base_address_)(display_config.id));
-    assert(display_base_address);
-    int src_bytes_per_row = (*cg_display_bytes_per_row_)(display_config.id);
-    int src_bytes_per_pixel =
-        (*cg_display_bits_per_pixel_)(display_config.id) / 8;
-
-    // Determine the display's position relative to the desktop, in pixels.
-    DesktopRect display_bounds = display_config.pixel_bounds;
-    display_bounds.Translate(-desktop_config_.pixel_bounds.left(),
-                             -desktop_config_.pixel_bounds.top());
-
-    // Determine which parts of the blit region, if any, lay within the monitor.
-    DesktopRegion copy_region = region;
-    copy_region.IntersectWith(display_bounds);
-    if (copy_region.is_empty())
-      continue;
-
-    // Translate the region to be copied into display-relative coordinates.
-    copy_region.Translate(-display_bounds.left(), -display_bounds.top());
-
-    // Calculate where in the output buffer the display's origin is.
-    uint8_t* out_ptr = frame.data() +
-         (display_bounds.left() * src_bytes_per_pixel) +
-         (display_bounds.top() * frame.stride());
-
-    // Copy the dirty region from the display buffer into our desktop buffer.
-    for (DesktopRegion::Iterator i(copy_region); !i.IsAtEnd(); i.Advance()) {
-      CopyRect(display_base_address,
-               src_bytes_per_row,
-               out_ptr,
-               frame.stride(),
-               src_bytes_per_pixel,
-               i.rect());
-    }
-  }
-}
-
-bool ScreenCapturerMac::CgBlitPostLion(const DesktopFrame& frame,
-                                       const DesktopRegion& region) {
-  // Copy the entire contents of the previous capture buffer, to capture over.
-  // TODO(wez): Get rid of this as per crbug.com/145064, or implement
-  // crbug.com/92354.
-  if (queue_.previous_frame()) {
-    memcpy(frame.data(), queue_.previous_frame()->data(),
-           frame.stride() * frame.size().height());
-  }
-
-  MacDisplayConfigurations displays_to_capture;
-  if (current_display_) {
-    // Capturing a single screen. Note that the screen id may change when
-    // screens are added or removed.
-    const MacDisplayConfiguration* config =
-        desktop_config_.FindDisplayConfigurationById(current_display_);
-    if (config) {
-      displays_to_capture.push_back(*config);
-    } else {
-      LOG(LS_ERROR) << "The selected screen cannot be found for capturing.";
-      return false;
-    }
-  } else {
-    // Capturing the whole desktop.
-    displays_to_capture = desktop_config_.displays;
-  }
-
-  // Create the window list once for all displays.
-  CFArrayRef window_list = CreateWindowListWithExclusion(excluded_window_);
-
-  for (size_t i = 0; i < displays_to_capture.size(); ++i) {
-    const MacDisplayConfiguration& display_config = displays_to_capture[i];
-
-    // Capturing mixed-DPI on one surface is hard, so we only return displays
-    // that match the "primary" display's DPI. The primary display is always
-    // the first in the list.
-    if (i > 0 && display_config.dip_to_pixel_scale !=
-        displays_to_capture[0].dip_to_pixel_scale) {
-      continue;
-    }
-    // Determine the display's position relative to the desktop, in pixels.
-    DesktopRect display_bounds = display_config.pixel_bounds;
-    display_bounds.Translate(-screen_pixel_bounds_.left(),
-                             -screen_pixel_bounds_.top());
-
-    // Determine which parts of the blit region, if any, lay within the monitor.
-    DesktopRegion copy_region = region;
-    copy_region.IntersectWith(display_bounds);
-    if (copy_region.is_empty())
-      continue;
-
-    // Translate the region to be copied into display-relative coordinates.
-    copy_region.Translate(-display_bounds.left(), -display_bounds.top());
-
-    DesktopRect excluded_window_bounds;
-    CGImageRef excluded_image = nullptr;
-    if (excluded_window_ && window_list) {
-      // Get the region of the excluded window relative the primary display.
-      excluded_window_bounds = GetExcludedWindowPixelBounds(
-          excluded_window_, display_config.dip_to_pixel_scale);
-      excluded_window_bounds.IntersectWith(display_config.pixel_bounds);
-
-      // Create the image under the excluded window first, because it's faster
-      // than captuing the whole display.
-      if (!excluded_window_bounds.is_empty()) {
-        excluded_image = CreateExcludedWindowRegionImage(
-            excluded_window_bounds, display_config.dip_to_pixel_scale,
-            window_list);
-      }
-    }
-
-    // Create an image containing a snapshot of the display.
-    CGImageRef image = CGDisplayCreateImage(display_config.id);
-    if (!image) {
-      if (excluded_image)
-        CFRelease(excluded_image);
-      continue;
-    }
-
-    // Verify that the image has 32-bit depth.
-    int bits_per_pixel = CGImageGetBitsPerPixel(image);
-    if (bits_per_pixel / 8 != DesktopFrame::kBytesPerPixel) {
-      LOG(LS_ERROR) << "CGDisplayCreateImage() returned imaged with "
-                    << bits_per_pixel
-                    << " bits per pixel. Only 32-bit depth is supported.";
-      CFRelease(image);
-      if (excluded_image)
-        CFRelease(excluded_image);
-      return false;
-    }
-
-    // Request access to the raw pixel data via the image's DataProvider.
-    CGDataProviderRef provider = CGImageGetDataProvider(image);
-    CFDataRef data = CGDataProviderCopyData(provider);
-    assert(data);
-
-    const uint8_t* display_base_address = CFDataGetBytePtr(data);
-    int src_bytes_per_row = CGImageGetBytesPerRow(image);
-
-    // |image| size may be different from display_bounds in case the screen was
-    // resized recently.
-    copy_region.IntersectWith(
-        DesktopRect::MakeWH(CGImageGetWidth(image), CGImageGetHeight(image)));
-
-    // Copy the dirty region from the display buffer into our desktop buffer.
-    uint8_t* out_ptr = frame.GetFrameDataAtPos(display_bounds.top_left());
-    for (DesktopRegion::Iterator i(copy_region); !i.IsAtEnd(); i.Advance()) {
-      CopyRect(display_base_address, src_bytes_per_row, out_ptr, frame.stride(),
-               DesktopFrame::kBytesPerPixel, i.rect());
-    }
-
-    CFRelease(data);
-    CFRelease(image);
-
-    if (excluded_image) {
-      CGDataProviderRef provider = CGImageGetDataProvider(excluded_image);
-      CFDataRef excluded_image_data = CGDataProviderCopyData(provider);
-      assert(excluded_image_data);
-      display_base_address = CFDataGetBytePtr(excluded_image_data);
-      src_bytes_per_row = CGImageGetBytesPerRow(excluded_image);
-
-      // Translate the bounds relative to the desktop, because |frame| data
-      // starts from the desktop top-left corner.
-      DesktopRect window_bounds_relative_to_desktop(excluded_window_bounds);
-      window_bounds_relative_to_desktop.Translate(-screen_pixel_bounds_.left(),
-                                                  -screen_pixel_bounds_.top());
-
-      DesktopRect rect_to_copy =
-          DesktopRect::MakeSize(excluded_window_bounds.size());
-      rect_to_copy.IntersectWith(DesktopRect::MakeWH(
-          CGImageGetWidth(excluded_image), CGImageGetHeight(excluded_image)));
-
-      if (CGImageGetBitsPerPixel(excluded_image) / 8 ==
-          DesktopFrame::kBytesPerPixel) {
-        CopyRect(display_base_address, src_bytes_per_row,
-                 frame.GetFrameDataAtPos(
-                     window_bounds_relative_to_desktop.top_left()),
-                 frame.stride(), DesktopFrame::kBytesPerPixel, rect_to_copy);
-      }
-
-      CFRelease(excluded_image_data);
-      CFRelease(excluded_image);
-    }
-  }
-  if (window_list)
-    CFRelease(window_list);
-  return true;
-}
-
-void ScreenCapturerMac::ScreenConfigurationChanged() {
-  if (current_display_) {
-    const MacDisplayConfiguration* config =
-        desktop_config_.FindDisplayConfigurationById(current_display_);
-    screen_pixel_bounds_ = config ? config->pixel_bounds : DesktopRect();
-    dip_to_pixel_scale_ = config ? config->dip_to_pixel_scale : 1.0f;
-  } else {
-    screen_pixel_bounds_ = desktop_config_.pixel_bounds;
-    dip_to_pixel_scale_ = desktop_config_.dip_to_pixel_scale;
-  }
-
-  // Release existing buffers, which will be of the wrong size.
-  ReleaseBuffers();
-
-  // Clear the dirty region, in case the display is down-sizing.
-  helper_.ClearInvalidRegion();
-
-  // Re-mark the entire desktop as dirty.
-  helper_.InvalidateScreen(screen_pixel_bounds_.size());
-
-  // Make sure the frame buffers will be reallocated.
-  queue_.Reset();
-
-  // CgBlitPostLion uses CGDisplayCreateImage() to snapshot each display's
-  // contents. Although the API exists in OS 10.6, it crashes the caller if
-  // the machine has no monitor connected, so we fall back to depcreated APIs
-  // when running on 10.6.
-  if (rtc::GetOSVersionName() >= rtc::kMacOSLion) {
-    LOG(LS_INFO) << "Using CgBlitPostLion.";
-    // No need for any OpenGL support on Lion
-    return;
-  }
-
-  // Dynamically link to the deprecated pre-Lion capture APIs.
-  app_services_library_ = dlopen(kApplicationServicesLibraryName,
-                                 RTLD_LAZY);
-  if (!app_services_library_) {
-    LOG_F(LS_ERROR) << "Failed to open " << kApplicationServicesLibraryName;
-    abort();
-  }
-
-  opengl_library_ = dlopen(kOpenGlLibraryName, RTLD_LAZY);
-  if (!opengl_library_) {
-    LOG_F(LS_ERROR) << "Failed to open " << kOpenGlLibraryName;
-    abort();
-  }
-
-  cg_display_base_address_ = reinterpret_cast<CGDisplayBaseAddressFunc>(
-      dlsym(app_services_library_, "CGDisplayBaseAddress"));
-  cg_display_bytes_per_row_ = reinterpret_cast<CGDisplayBytesPerRowFunc>(
-      dlsym(app_services_library_, "CGDisplayBytesPerRow"));
-  cg_display_bits_per_pixel_ = reinterpret_cast<CGDisplayBitsPerPixelFunc>(
-      dlsym(app_services_library_, "CGDisplayBitsPerPixel"));
-  cgl_set_full_screen_ = reinterpret_cast<CGLSetFullScreenFunc>(
-      dlsym(opengl_library_, "CGLSetFullScreen"));
-  if (!(cg_display_base_address_ && cg_display_bytes_per_row_ &&
-        cg_display_bits_per_pixel_ && cgl_set_full_screen_)) {
-    LOG_F(LS_ERROR);
-    abort();
-  }
-
-  if (desktop_config_.displays.size() > 1) {
-    LOG(LS_INFO) << "Using CgBlitPreLion (Multi-monitor).";
-    return;
-  }
-
-  CGDirectDisplayID mainDevice = CGMainDisplayID();
-  if (!CGDisplayUsesOpenGLAcceleration(mainDevice)) {
-    LOG(LS_INFO) << "Using CgBlitPreLion (OpenGL unavailable).";
-    return;
-  }
-
-  LOG(LS_INFO) << "Using GlBlit";
-
-  CGLPixelFormatAttribute attributes[] = {
-    // This function does an early return if GetOSVersionName() >= kMacOSLion,
-    // this code only runs on 10.6 and can be deleted once 10.6 support is
-    // dropped.  So just keep using kCGLPFAFullScreen even though it was
-    // deprecated in 10.6 -- it's still functional there, and it's not used on
-    // newer OS X versions.
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wdeprecated-declarations"
-    kCGLPFAFullScreen,
-#pragma clang diagnostic pop
-    kCGLPFADisplayMask,
-    (CGLPixelFormatAttribute)CGDisplayIDToOpenGLDisplayMask(mainDevice),
-    (CGLPixelFormatAttribute)0
-  };
-  CGLPixelFormatObj pixel_format = nullptr;
-  GLint matching_pixel_format_count = 0;
-  CGLError err = CGLChoosePixelFormat(attributes,
-                                      &pixel_format,
-                                      &matching_pixel_format_count);
-  assert(err == kCGLNoError);
-  err = CGLCreateContext(pixel_format, nullptr, &cgl_context_);
-  assert(err == kCGLNoError);
-  CGLDestroyPixelFormat(pixel_format);
-  (*cgl_set_full_screen_)(cgl_context_);
-  CGLSetCurrentContext(cgl_context_);
-
-  size_t buffer_size = screen_pixel_bounds_.width() *
-                       screen_pixel_bounds_.height() *
-                       sizeof(uint32_t);
-  pixel_buffer_object_.Init(cgl_context_, buffer_size);
-}
-
-bool ScreenCapturerMac::RegisterRefreshAndMoveHandlers() {
-  desktop_config_ = desktop_config_monitor_->desktop_configuration();
-  for (const auto& config : desktop_config_.displays) {
-    size_t pixel_width = config.pixel_bounds.width();
-    size_t pixel_height = config.pixel_bounds.height();
-    if (pixel_width == 0 || pixel_height == 0)
-      continue;
-    // Using a local variable forces the block to capture the raw pointer.
-    DisplayStreamManager* manager = display_stream_manager_;
-    int unique_id = manager->GetUniqueId();
-    CGDirectDisplayID display_id = config.id;
-    DesktopVector display_origin = config.pixel_bounds.top_left();
-
-    CGDisplayStreamFrameAvailableHandler handler =
-        ^(CGDisplayStreamFrameStatus status, uint64_t display_time,
-          IOSurfaceRef frame_surface, CGDisplayStreamUpdateRef updateRef) {
-          if (status == kCGDisplayStreamFrameStatusStopped) {
-            manager->DestroyStream(unique_id);
-            return;
-          }
-
-          if (manager->ShouldIgnoreUpdates())
-            return;
-
-          // Only pay attention to frame updates.
-          if (status != kCGDisplayStreamFrameStatusFrameComplete)
-            return;
-
-          size_t count = 0;
-          const CGRect* rects = CGDisplayStreamUpdateGetRects(
-              updateRef, kCGDisplayStreamUpdateDirtyRects, &count);
-          if (count != 0) {
-            // According to CGDisplayStream.h, it's safe to call
-            // CGDisplayStreamStop() from within the callback.
-            ScreenRefresh(count, rects, display_origin);
-          }
-        };
-    CGDisplayStreamRef display_stream = CGDisplayStreamCreate(
-        display_id, pixel_width, pixel_height, 'BGRA', nullptr, handler);
-
-    if (display_stream) {
-      CGError error = CGDisplayStreamStart(display_stream);
-      if (error != kCGErrorSuccess)
-        return false;
-
-      CFRunLoopSourceRef source =
-          CGDisplayStreamGetRunLoopSource(display_stream);
-      CFRunLoopAddSource(CFRunLoopGetCurrent(), source, kCFRunLoopCommonModes);
-      display_stream_manager_->SaveStream(unique_id, display_stream);
-    }
-  }
-
-  return true;
-}
-
-void ScreenCapturerMac::UnregisterRefreshAndMoveHandlers() {
-  display_stream_manager_->UnregisterActiveStreams();
-}
-
-void ScreenCapturerMac::ScreenRefresh(CGRectCount count,
-                                      const CGRect* rect_array,
-                                      DesktopVector display_origin) {
-  if (screen_pixel_bounds_.is_empty())
-    ScreenConfigurationChanged();
-
-  // The refresh rects are in display coordinates. We want to translate to
-  // framebuffer coordinates. If a specific display is being captured, then no
-  // change is necessary. If all displays are being captured, then we want to
-  // translate by the origin of the display.
-  DesktopVector translate_vector;
-  if (!current_display_)
-    translate_vector = display_origin;
-
-  DesktopRegion region;
-  for (CGRectCount i = 0; i < count; ++i) {
-    // All rects are already in physical pixel coordinates.
-    DesktopRect rect = DesktopRect::MakeXYWH(
-        rect_array[i].origin.x, rect_array[i].origin.y,
-        rect_array[i].size.width, rect_array[i].size.height);
-
-    rect.Translate(translate_vector);
-
-    region.AddRect(rect);
-  }
-
-  helper_.InvalidateRegion(region);
-}
-
-std::unique_ptr<DesktopFrame> ScreenCapturerMac::CreateFrame() {
-  std::unique_ptr<DesktopFrame> frame(
-      new BasicDesktopFrame(screen_pixel_bounds_.size()));
-  frame->set_dpi(DesktopVector(kStandardDPI * dip_to_pixel_scale_,
-                               kStandardDPI * dip_to_pixel_scale_));
-  return frame;
-}
-
-}  // namespace
-
-// static
-std::unique_ptr<DesktopCapturer> DesktopCapturer::CreateRawScreenCapturer(
-    const DesktopCaptureOptions& options) {
-  if (!options.configuration_monitor())
-    return nullptr;
-
-  std::unique_ptr<ScreenCapturerMac> capturer(new ScreenCapturerMac(
-      options.configuration_monitor(), options.detect_updated_region()));
-  if (!capturer.get()->Init()) {
-    return nullptr;
-  }
-
-  return capturer;
-}
-
-}  // namespace webrtc
diff --git a/modules/desktop_capture/screen_capturer_mac_unittest.cc b/modules/desktop_capture/screen_capturer_mac_unittest.cc
deleted file mode 100644
index 7133a9e..0000000
--- a/modules/desktop_capture/screen_capturer_mac_unittest.cc
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- *  Copyright (c) 2013 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 <ApplicationServices/ApplicationServices.h>
-
-#include <memory>
-#include <ostream>
-
-#include "webrtc/modules/desktop_capture/desktop_capturer.h"
-#include "webrtc/modules/desktop_capture/desktop_capture_options.h"
-#include "webrtc/modules/desktop_capture/desktop_frame.h"
-#include "webrtc/modules/desktop_capture/desktop_geometry.h"
-#include "webrtc/modules/desktop_capture/desktop_region.h"
-#include "webrtc/modules/desktop_capture/mac/desktop_configuration.h"
-#include "webrtc/modules/desktop_capture/mock_desktop_capturer_callback.h"
-#include "webrtc/test/gtest.h"
-
-using ::testing::_;
-using ::testing::AnyNumber;
-using ::testing::Return;
-
-namespace webrtc {
-
-class ScreenCapturerMacTest : public testing::Test {
- public:
-  // Verifies that the whole screen is initially dirty.
-  void CaptureDoneCallback1(DesktopCapturer::Result result,
-                            std::unique_ptr<DesktopFrame>* frame);
-
-  // Verifies that a rectangle explicitly marked as dirty is propagated
-  // correctly.
-  void CaptureDoneCallback2(DesktopCapturer::Result result,
-                            std::unique_ptr<DesktopFrame>* frame);
-
- protected:
-  void SetUp() override {
-    capturer_ = DesktopCapturer::CreateScreenCapturer(
-        DesktopCaptureOptions::CreateDefault());
-  }
-
-  std::unique_ptr<DesktopCapturer> capturer_;
-  MockDesktopCapturerCallback callback_;
-};
-
-void ScreenCapturerMacTest::CaptureDoneCallback1(
-    DesktopCapturer::Result result,
-    std::unique_ptr<DesktopFrame>* frame) {
-  EXPECT_EQ(result, DesktopCapturer::Result::SUCCESS);
-
-  MacDesktopConfiguration config = MacDesktopConfiguration::GetCurrent(
-      MacDesktopConfiguration::BottomLeftOrigin);
-
-  // Verify that the region contains full frame.
-  DesktopRegion::Iterator it((*frame)->updated_region());
-  EXPECT_TRUE(!it.IsAtEnd() && it.rect().equals(config.pixel_bounds));
-}
-
-void ScreenCapturerMacTest::CaptureDoneCallback2(
-    DesktopCapturer::Result result,
-    std::unique_ptr<DesktopFrame>* frame) {
-  EXPECT_EQ(result, DesktopCapturer::Result::SUCCESS);
-
-  MacDesktopConfiguration config = MacDesktopConfiguration::GetCurrent(
-      MacDesktopConfiguration::BottomLeftOrigin);
-  int width = config.pixel_bounds.width();
-  int height = config.pixel_bounds.height();
-
-  EXPECT_EQ(width, (*frame)->size().width());
-  EXPECT_EQ(height, (*frame)->size().height());
-  EXPECT_TRUE((*frame)->data() != NULL);
-  // Depending on the capture method, the screen may be flipped or not, so
-  // the stride may be positive or negative.
-  EXPECT_EQ(static_cast<int>(sizeof(uint32_t) * width),
-            abs((*frame)->stride()));
-}
-
-TEST_F(ScreenCapturerMacTest, Capture) {
-  EXPECT_CALL(callback_,
-              OnCaptureResultPtr(DesktopCapturer::Result::SUCCESS, _))
-      .Times(2)
-      .WillOnce(Invoke(this, &ScreenCapturerMacTest::CaptureDoneCallback1))
-      .WillOnce(Invoke(this, &ScreenCapturerMacTest::CaptureDoneCallback2));
-
-  SCOPED_TRACE("");
-  capturer_->Start(&callback_);
-
-  // Check that we get an initial full-screen updated.
-  capturer_->CaptureFrame();
-
-  // Check that subsequent dirty rects are propagated correctly.
-  capturer_->CaptureFrame();
-}
-
-}  // namespace webrtc
diff --git a/modules/desktop_capture/screen_capturer_null.cc b/modules/desktop_capture/screen_capturer_null.cc
deleted file mode 100644
index 7b93749..0000000
--- a/modules/desktop_capture/screen_capturer_null.cc
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- *  Copyright (c) 2013 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/desktop_capture/desktop_capturer.h"
-
-namespace webrtc {
-
-// static
-std::unique_ptr<DesktopCapturer> DesktopCapturer::CreateRawScreenCapturer(
-    const DesktopCaptureOptions& options) {
-  return nullptr;
-}
-
-}  // namespace webrtc
diff --git a/modules/desktop_capture/screen_capturer_unittest.cc b/modules/desktop_capture/screen_capturer_unittest.cc
deleted file mode 100644
index 4aa3220..0000000
--- a/modules/desktop_capture/screen_capturer_unittest.cc
+++ /dev/null
@@ -1,208 +0,0 @@
-/*
- *  Copyright (c) 2013 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 <memory>
-
-#include "webrtc/modules/desktop_capture/desktop_capture_options.h"
-#include "webrtc/modules/desktop_capture/desktop_capturer.h"
-#include "webrtc/modules/desktop_capture/desktop_frame.h"
-#include "webrtc/modules/desktop_capture/desktop_region.h"
-#include "webrtc/modules/desktop_capture/mock_desktop_capturer_callback.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/test/gmock.h"
-#include "webrtc/test/gtest.h"
-
-#if defined(WEBRTC_WIN)
-#include "webrtc/modules/desktop_capture/win/screen_capturer_win_directx.h"
-#endif  // defined(WEBRTC_WIN)
-
-using ::testing::_;
-
-const int kTestSharedMemoryId = 123;
-
-namespace webrtc {
-
-class ScreenCapturerTest : public testing::Test {
- public:
-  void SetUp() override {
-    capturer_ = DesktopCapturer::CreateScreenCapturer(
-        DesktopCaptureOptions::CreateDefault());
-  }
-
- protected:
-#if defined(WEBRTC_WIN)
-  // Enable allow_directx_capturer in DesktopCaptureOptions, but let
-  // DesktopCapturer::CreateScreenCapturer to decide whether a DirectX capturer
-  // should be used.
-  void MaybeCreateDirectxCapturer() {
-    DesktopCaptureOptions options(DesktopCaptureOptions::CreateDefault());
-    options.set_allow_directx_capturer(true);
-    capturer_ = DesktopCapturer::CreateScreenCapturer(options);
-  }
-
-  bool CreateDirectxCapturer() {
-    if (!ScreenCapturerWinDirectx::IsSupported()) {
-      LOG(LS_WARNING) << "Directx capturer is not supported";
-      return false;
-    }
-
-    MaybeCreateDirectxCapturer();
-    return true;
-  }
-
-  void CreateMagnifierCapturer() {
-    DesktopCaptureOptions options(DesktopCaptureOptions::CreateDefault());
-    options.set_allow_use_magnification_api(true);
-    capturer_ = DesktopCapturer::CreateScreenCapturer(options);
-  }
-#endif  // defined(WEBRTC_WIN)
-
-  std::unique_ptr<DesktopCapturer> capturer_;
-  MockDesktopCapturerCallback callback_;
-};
-
-class FakeSharedMemory : public SharedMemory {
- public:
-  FakeSharedMemory(char* buffer, size_t size)
-    : SharedMemory(buffer, size, 0, kTestSharedMemoryId),
-      buffer_(buffer) {
-  }
-  virtual ~FakeSharedMemory() {
-    delete[] buffer_;
-  }
- private:
-  char* buffer_;
-  RTC_DISALLOW_COPY_AND_ASSIGN(FakeSharedMemory);
-};
-
-class FakeSharedMemoryFactory : public SharedMemoryFactory {
- public:
-  FakeSharedMemoryFactory() {}
-  ~FakeSharedMemoryFactory() override {}
-
-  std::unique_ptr<SharedMemory> CreateSharedMemory(size_t size) override {
-    return std::unique_ptr<SharedMemory>(
-        new FakeSharedMemory(new char[size], size));
-  }
-
- private:
-  RTC_DISALLOW_COPY_AND_ASSIGN(FakeSharedMemoryFactory);
-};
-
-ACTION_P(SaveUniquePtrArg, dest) {
-  *dest = std::move(*arg1);
-}
-
-TEST_F(ScreenCapturerTest, GetScreenListAndSelectScreen) {
-  webrtc::DesktopCapturer::SourceList screens;
-  EXPECT_TRUE(capturer_->GetSourceList(&screens));
-  for (const auto& screen : screens) {
-    EXPECT_TRUE(capturer_->SelectSource(screen.id));
-  }
-}
-
-TEST_F(ScreenCapturerTest, StartCapturer) {
-  capturer_->Start(&callback_);
-}
-
-TEST_F(ScreenCapturerTest, Capture) {
-  // Assume that Start() treats the screen as invalid initially.
-  std::unique_ptr<DesktopFrame> frame;
-  EXPECT_CALL(callback_,
-              OnCaptureResultPtr(DesktopCapturer::Result::SUCCESS, _))
-      .WillOnce(SaveUniquePtrArg(&frame));
-
-  capturer_->Start(&callback_);
-  capturer_->CaptureFrame();
-
-  ASSERT_TRUE(frame);
-  EXPECT_GT(frame->size().width(), 0);
-  EXPECT_GT(frame->size().height(), 0);
-  EXPECT_GE(frame->stride(),
-            frame->size().width() * DesktopFrame::kBytesPerPixel);
-  EXPECT_TRUE(frame->shared_memory() == NULL);
-
-  // Verify that the region contains whole screen.
-  EXPECT_FALSE(frame->updated_region().is_empty());
-  DesktopRegion::Iterator it(frame->updated_region());
-  ASSERT_TRUE(!it.IsAtEnd());
-  EXPECT_TRUE(it.rect().equals(DesktopRect::MakeSize(frame->size())));
-  it.Advance();
-  EXPECT_TRUE(it.IsAtEnd());
-}
-
-#if defined(WEBRTC_WIN)
-
-TEST_F(ScreenCapturerTest, UseSharedBuffers) {
-  std::unique_ptr<DesktopFrame> frame;
-  EXPECT_CALL(callback_,
-              OnCaptureResultPtr(DesktopCapturer::Result::SUCCESS, _))
-      .WillOnce(SaveUniquePtrArg(&frame));
-
-  capturer_->Start(&callback_);
-  capturer_->SetSharedMemoryFactory(
-      std::unique_ptr<SharedMemoryFactory>(new FakeSharedMemoryFactory()));
-  capturer_->CaptureFrame();
-
-  ASSERT_TRUE(frame);
-  ASSERT_TRUE(frame->shared_memory());
-  EXPECT_EQ(frame->shared_memory()->id(), kTestSharedMemoryId);
-}
-
-TEST_F(ScreenCapturerTest, UseMagnifier) {
-  CreateMagnifierCapturer();
-  std::unique_ptr<DesktopFrame> frame;
-  EXPECT_CALL(callback_,
-              OnCaptureResultPtr(DesktopCapturer::Result::SUCCESS, _))
-      .WillOnce(SaveUniquePtrArg(&frame));
-
-  capturer_->Start(&callback_);
-  capturer_->CaptureFrame();
-  ASSERT_TRUE(frame);
-}
-
-TEST_F(ScreenCapturerTest, UseDirectxCapturer) {
-  if (!CreateDirectxCapturer()) {
-    return;
-  }
-
-  std::unique_ptr<DesktopFrame> frame;
-  EXPECT_CALL(callback_,
-              OnCaptureResultPtr(DesktopCapturer::Result::SUCCESS, _))
-      .WillOnce(SaveUniquePtrArg(&frame));
-
-  capturer_->Start(&callback_);
-  capturer_->CaptureFrame();
-  ASSERT_TRUE(frame);
-}
-
-TEST_F(ScreenCapturerTest, UseDirectxCapturerWithSharedBuffers) {
-  if (!CreateDirectxCapturer()) {
-    return;
-  }
-
-  std::unique_ptr<DesktopFrame> frame;
-  EXPECT_CALL(callback_,
-              OnCaptureResultPtr(DesktopCapturer::Result::SUCCESS, _))
-      .WillOnce(SaveUniquePtrArg(&frame));
-
-  capturer_->Start(&callback_);
-  capturer_->SetSharedMemoryFactory(
-      std::unique_ptr<SharedMemoryFactory>(new FakeSharedMemoryFactory()));
-  capturer_->CaptureFrame();
-  ASSERT_TRUE(frame);
-  ASSERT_TRUE(frame->shared_memory());
-  EXPECT_EQ(frame->shared_memory()->id(), kTestSharedMemoryId);
-}
-
-#endif  // defined(WEBRTC_WIN)
-
-}  // namespace webrtc
diff --git a/modules/desktop_capture/screen_capturer_win.cc b/modules/desktop_capture/screen_capturer_win.cc
deleted file mode 100644
index 9e74aab..0000000
--- a/modules/desktop_capture/screen_capturer_win.cc
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- *  Copyright (c) 2013 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 <memory>
-#include <utility>
-
-#include "webrtc/modules/desktop_capture/blank_detector_desktop_capturer_wrapper.h"
-#include "webrtc/modules/desktop_capture/desktop_capturer.h"
-#include "webrtc/modules/desktop_capture/desktop_capture_options.h"
-#include "webrtc/modules/desktop_capture/fallback_desktop_capturer_wrapper.h"
-#include "webrtc/modules/desktop_capture/rgba_color.h"
-#include "webrtc/modules/desktop_capture/win/screen_capturer_win_directx.h"
-#include "webrtc/modules/desktop_capture/win/screen_capturer_win_gdi.h"
-#include "webrtc/modules/desktop_capture/win/screen_capturer_win_magnifier.h"
-
-namespace webrtc {
-
-namespace {
-
-std::unique_ptr<DesktopCapturer> CreateScreenCapturerWinDirectx() {
-  std::unique_ptr<DesktopCapturer> capturer(
-      new ScreenCapturerWinDirectx());
-  capturer.reset(new BlankDetectorDesktopCapturerWrapper(
-      std::move(capturer), RgbaColor(0, 0, 0, 0)));
-  return capturer;
-}
-
-}  // namespace
-
-// static
-std::unique_ptr<DesktopCapturer> DesktopCapturer::CreateRawScreenCapturer(
-    const DesktopCaptureOptions& options) {
-  std::unique_ptr<DesktopCapturer> capturer(new ScreenCapturerWinGdi(options));
-  if (options.allow_directx_capturer()) {
-    // |dxgi_duplicator_controller| should be alive in this scope to ensure it
-    // won't unload DxgiDuplicatorController.
-    auto dxgi_duplicator_controller = DxgiDuplicatorController::Instance();
-    if (ScreenCapturerWinDirectx::IsSupported()) {
-      capturer.reset(new FallbackDesktopCapturerWrapper(
-          CreateScreenCapturerWinDirectx(), std::move(capturer)));
-    }
-  }
-
-  if (options.allow_use_magnification_api()) {
-    // ScreenCapturerWinMagnifier cannot work on Windows XP or earlier, as well
-    // as 64-bit only Windows, and it may randomly crash on multi-screen
-    // systems. So we may need to fallback to use original capturer.
-    capturer.reset(new FallbackDesktopCapturerWrapper(
-        std::unique_ptr<DesktopCapturer>(new ScreenCapturerWinMagnifier()),
-        std::move(capturer)));
-  }
-
-  return capturer;
-}
-
-}  // namespace webrtc
diff --git a/modules/desktop_capture/screen_capturer_x11.cc b/modules/desktop_capture/screen_capturer_x11.cc
deleted file mode 100644
index ecc2c96..0000000
--- a/modules/desktop_capture/screen_capturer_x11.cc
+++ /dev/null
@@ -1,419 +0,0 @@
-/*
- *  Copyright (c) 2013 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 <string.h>
-
-#include <memory>
-#include <set>
-#include <utility>
-
-#include <X11/extensions/Xdamage.h>
-#include <X11/extensions/Xfixes.h>
-#include <X11/Xlib.h>
-#include <X11/Xutil.h>
-
-#include "webrtc/modules/desktop_capture/desktop_capture_options.h"
-#include "webrtc/modules/desktop_capture/desktop_capturer.h"
-#include "webrtc/modules/desktop_capture/desktop_frame.h"
-#include "webrtc/modules/desktop_capture/screen_capture_frame_queue.h"
-#include "webrtc/modules/desktop_capture/screen_capturer_helper.h"
-#include "webrtc/modules/desktop_capture/shared_desktop_frame.h"
-#include "webrtc/modules/desktop_capture/x11/x_server_pixel_buffer.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/timeutils.h"
-
-namespace webrtc {
-namespace {
-
-// A class to perform video frame capturing for Linux.
-//
-// If XDamage is used, this class sets DesktopFrame::updated_region() according
-// to the areas reported by XDamage. Otherwise this class does not detect
-// DesktopFrame::updated_region(), the field is always set to the entire frame
-// rectangle. ScreenCapturerDifferWrapper should be used if that functionality
-// is necessary.
-class ScreenCapturerLinux : public DesktopCapturer,
-                            public SharedXDisplay::XEventHandler {
- public:
-  ScreenCapturerLinux();
-  ~ScreenCapturerLinux() override;
-
-  // TODO(ajwong): Do we really want this to be synchronous?
-  bool Init(const DesktopCaptureOptions& options);
-
-  // DesktopCapturer interface.
-  void Start(Callback* delegate) override;
-  void CaptureFrame() override;
-  bool GetSourceList(SourceList* sources) override;
-  bool SelectSource(SourceId id) override;
-
- private:
-  Display* display() { return options_.x_display()->display(); }
-
-  // SharedXDisplay::XEventHandler interface.
-  bool HandleXEvent(const XEvent& event) override;
-
-  void InitXDamage();
-
-  // Capture screen pixels to the current buffer in the queue. In the DAMAGE
-  // case, the ScreenCapturerHelper already holds the list of invalid rectangles
-  // from HandleXEvent(). In the non-DAMAGE case, this captures the
-  // whole screen, then calculates some invalid rectangles that include any
-  // differences between this and the previous capture.
-  std::unique_ptr<DesktopFrame> CaptureScreen();
-
-  // Called when the screen configuration is changed.
-  void ScreenConfigurationChanged();
-
-  // Synchronize the current buffer with |last_buffer_|, by copying pixels from
-  // the area of |last_invalid_rects|.
-  // Note this only works on the assumption that kNumBuffers == 2, as
-  // |last_invalid_rects| holds the differences from the previous buffer and
-  // the one prior to that (which will then be the current buffer).
-  void SynchronizeFrame();
-
-  void DeinitXlib();
-
-  DesktopCaptureOptions options_;
-
-  Callback* callback_ = nullptr;
-
-  // X11 graphics context.
-  GC gc_ = nullptr;
-  Window root_window_ = BadValue;
-
-  // XFixes.
-  bool has_xfixes_ = false;
-  int xfixes_event_base_ = -1;
-  int xfixes_error_base_ = -1;
-
-  // XDamage information.
-  bool use_damage_ = false;
-  Damage damage_handle_ = 0;
-  int damage_event_base_ = -1;
-  int damage_error_base_ = -1;
-  XserverRegion damage_region_ = 0;
-
-  // Access to the X Server's pixel buffer.
-  XServerPixelBuffer x_server_pixel_buffer_;
-
-  // A thread-safe list of invalid rectangles, and the size of the most
-  // recently captured screen.
-  ScreenCapturerHelper helper_;
-
-  // Queue of the frames buffers.
-  ScreenCaptureFrameQueue<SharedDesktopFrame> queue_;
-
-  // Invalid region from the previous capture. This is used to synchronize the
-  // current with the last buffer used.
-  DesktopRegion last_invalid_region_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(ScreenCapturerLinux);
-};
-
-ScreenCapturerLinux::ScreenCapturerLinux() {
-  helper_.SetLogGridSize(4);
-}
-
-ScreenCapturerLinux::~ScreenCapturerLinux() {
-  options_.x_display()->RemoveEventHandler(ConfigureNotify, this);
-  if (use_damage_) {
-    options_.x_display()->RemoveEventHandler(
-        damage_event_base_ + XDamageNotify, this);
-  }
-  DeinitXlib();
-}
-
-bool ScreenCapturerLinux::Init(const DesktopCaptureOptions& options) {
-  options_ = options;
-
-  root_window_ = RootWindow(display(), DefaultScreen(display()));
-  if (root_window_ == BadValue) {
-    LOG(LS_ERROR) << "Unable to get the root window";
-    DeinitXlib();
-    return false;
-  }
-
-  gc_ = XCreateGC(display(), root_window_, 0, NULL);
-  if (gc_ == NULL) {
-    LOG(LS_ERROR) << "Unable to get graphics context";
-    DeinitXlib();
-    return false;
-  }
-
-  options_.x_display()->AddEventHandler(ConfigureNotify, this);
-
-  // Check for XFixes extension. This is required for cursor shape
-  // notifications, and for our use of XDamage.
-  if (XFixesQueryExtension(display(), &xfixes_event_base_,
-                           &xfixes_error_base_)) {
-    has_xfixes_ = true;
-  } else {
-    LOG(LS_INFO) << "X server does not support XFixes.";
-  }
-
-  // Register for changes to the dimensions of the root window.
-  XSelectInput(display(), root_window_, StructureNotifyMask);
-
-  if (!x_server_pixel_buffer_.Init(display(), DefaultRootWindow(display()))) {
-    LOG(LS_ERROR) << "Failed to initialize pixel buffer.";
-    return false;
-  }
-
-  if (options_.use_update_notifications()) {
-    InitXDamage();
-  }
-
-  return true;
-}
-
-void ScreenCapturerLinux::InitXDamage() {
-  // Our use of XDamage requires XFixes.
-  if (!has_xfixes_) {
-    return;
-  }
-
-  // Check for XDamage extension.
-  if (!XDamageQueryExtension(display(), &damage_event_base_,
-                             &damage_error_base_)) {
-    LOG(LS_INFO) << "X server does not support XDamage.";
-    return;
-  }
-
-  // TODO(lambroslambrou): Disable DAMAGE in situations where it is known
-  // to fail, such as when Desktop Effects are enabled, with graphics
-  // drivers (nVidia, ATI) that fail to report DAMAGE notifications
-  // properly.
-
-  // Request notifications every time the screen becomes damaged.
-  damage_handle_ = XDamageCreate(display(), root_window_,
-                                 XDamageReportNonEmpty);
-  if (!damage_handle_) {
-    LOG(LS_ERROR) << "Unable to initialize XDamage.";
-    return;
-  }
-
-  // Create an XFixes server-side region to collate damage into.
-  damage_region_ = XFixesCreateRegion(display(), 0, 0);
-  if (!damage_region_) {
-    XDamageDestroy(display(), damage_handle_);
-    LOG(LS_ERROR) << "Unable to create XFixes region.";
-    return;
-  }
-
-  options_.x_display()->AddEventHandler(
-      damage_event_base_ + XDamageNotify, this);
-
-  use_damage_ = true;
-  LOG(LS_INFO) << "Using XDamage extension.";
-}
-
-void ScreenCapturerLinux::Start(Callback* callback) {
-  RTC_DCHECK(!callback_);
-  RTC_DCHECK(callback);
-
-  callback_ = callback;
-}
-
-void ScreenCapturerLinux::CaptureFrame() {
-  int64_t capture_start_time_nanos = rtc::TimeNanos();
-
-  queue_.MoveToNextFrame();
-  RTC_DCHECK(!queue_.current_frame() || !queue_.current_frame()->IsShared());
-
-  // Process XEvents for XDamage and cursor shape tracking.
-  options_.x_display()->ProcessPendingXEvents();
-
-  // ProcessPendingXEvents() may call ScreenConfigurationChanged() which
-  // reinitializes |x_server_pixel_buffer_|. Check if the pixel buffer is still
-  // in a good shape.
-  if (!x_server_pixel_buffer_.is_initialized()) {
-     // We failed to initialize pixel buffer.
-     callback_->OnCaptureResult(Result::ERROR_PERMANENT, nullptr);
-     return;
-  }
-
-  // If the current frame is from an older generation then allocate a new one.
-  // Note that we can't reallocate other buffers at this point, since the caller
-  // may still be reading from them.
-  if (!queue_.current_frame()) {
-    queue_.ReplaceCurrentFrame(
-        SharedDesktopFrame::Wrap(std::unique_ptr<DesktopFrame>(
-            new BasicDesktopFrame(x_server_pixel_buffer_.window_size()))));
-  }
-
-  std::unique_ptr<DesktopFrame> result = CaptureScreen();
-  if (!result) {
-    callback_->OnCaptureResult(Result::ERROR_TEMPORARY, nullptr);
-    return;
-  }
-
-  last_invalid_region_ = result->updated_region();
-  result->set_capture_time_ms((rtc::TimeNanos() - capture_start_time_nanos) /
-                              rtc::kNumNanosecsPerMillisec);
-  callback_->OnCaptureResult(Result::SUCCESS, std::move(result));
-}
-
-bool ScreenCapturerLinux::GetSourceList(SourceList* sources) {
-  RTC_DCHECK(sources->size() == 0);
-  // TODO(jiayl): implement screen enumeration.
-  sources->push_back({0});
-  return true;
-}
-
-bool ScreenCapturerLinux::SelectSource(SourceId id) {
-  // TODO(jiayl): implement screen selection.
-  return true;
-}
-
-bool ScreenCapturerLinux::HandleXEvent(const XEvent& event) {
-  if (use_damage_ && (event.type == damage_event_base_ + XDamageNotify)) {
-    const XDamageNotifyEvent* damage_event =
-        reinterpret_cast<const XDamageNotifyEvent*>(&event);
-    if (damage_event->damage != damage_handle_)
-      return false;
-    RTC_DCHECK(damage_event->level == XDamageReportNonEmpty);
-    return true;
-  } else if (event.type == ConfigureNotify) {
-    ScreenConfigurationChanged();
-    return true;
-  }
-  return false;
-}
-
-std::unique_ptr<DesktopFrame> ScreenCapturerLinux::CaptureScreen() {
-  std::unique_ptr<SharedDesktopFrame> frame = queue_.current_frame()->Share();
-  RTC_DCHECK(x_server_pixel_buffer_.window_size().equals(frame->size()));
-
-  // Pass the screen size to the helper, so it can clip the invalid region if it
-  // expands that region to a grid.
-  helper_.set_size_most_recent(frame->size());
-
-  // In the DAMAGE case, ensure the frame is up-to-date with the previous frame
-  // if any.  If there isn't a previous frame, that means a screen-resolution
-  // change occurred, and |invalid_rects| will be updated to include the whole
-  // screen.
-  if (use_damage_ && queue_.previous_frame())
-    SynchronizeFrame();
-
-  DesktopRegion* updated_region = frame->mutable_updated_region();
-
-  x_server_pixel_buffer_.Synchronize();
-  if (use_damage_ && queue_.previous_frame()) {
-    // Atomically fetch and clear the damage region.
-    XDamageSubtract(display(), damage_handle_, None, damage_region_);
-    int rects_num = 0;
-    XRectangle bounds;
-    XRectangle* rects = XFixesFetchRegionAndBounds(display(), damage_region_,
-                                                   &rects_num, &bounds);
-    for (int i = 0; i < rects_num; ++i) {
-      updated_region->AddRect(DesktopRect::MakeXYWH(
-          rects[i].x, rects[i].y, rects[i].width, rects[i].height));
-    }
-    XFree(rects);
-    helper_.InvalidateRegion(*updated_region);
-
-    // Capture the damaged portions of the desktop.
-    helper_.TakeInvalidRegion(updated_region);
-
-    // Clip the damaged portions to the current screen size, just in case some
-    // spurious XDamage notifications were received for a previous (larger)
-    // screen size.
-    updated_region->IntersectWith(
-        DesktopRect::MakeSize(x_server_pixel_buffer_.window_size()));
-
-    for (DesktopRegion::Iterator it(*updated_region);
-         !it.IsAtEnd(); it.Advance()) {
-      if (!x_server_pixel_buffer_.CaptureRect(it.rect(), frame.get()))
-        return nullptr;
-    }
-  } else {
-    // Doing full-screen polling, or this is the first capture after a
-    // screen-resolution change.  In either case, need a full-screen capture.
-    DesktopRect screen_rect = DesktopRect::MakeSize(frame->size());
-    if (!x_server_pixel_buffer_.CaptureRect(screen_rect, frame.get()))
-      return nullptr;
-    updated_region->SetRect(screen_rect);
-  }
-
-  return std::move(frame);
-}
-
-void ScreenCapturerLinux::ScreenConfigurationChanged() {
-  // Make sure the frame buffers will be reallocated.
-  queue_.Reset();
-
-  helper_.ClearInvalidRegion();
-  if (!x_server_pixel_buffer_.Init(display(), DefaultRootWindow(display()))) {
-    LOG(LS_ERROR) << "Failed to initialize pixel buffer after screen "
-        "configuration change.";
-  }
-}
-
-void ScreenCapturerLinux::SynchronizeFrame() {
-  // Synchronize the current buffer with the previous one since we do not
-  // capture the entire desktop. Note that encoder may be reading from the
-  // previous buffer at this time so thread access complaints are false
-  // positives.
-
-  // TODO(hclam): We can reduce the amount of copying here by subtracting
-  // |capturer_helper_|s region from |last_invalid_region_|.
-  // http://crbug.com/92354
-  RTC_DCHECK(queue_.previous_frame());
-
-  DesktopFrame* current = queue_.current_frame();
-  DesktopFrame* last = queue_.previous_frame();
-  RTC_DCHECK(current != last);
-  for (DesktopRegion::Iterator it(last_invalid_region_);
-       !it.IsAtEnd(); it.Advance()) {
-    current->CopyPixelsFrom(*last, it.rect().top_left(), it.rect());
-  }
-}
-
-void ScreenCapturerLinux::DeinitXlib() {
-  if (gc_) {
-    XFreeGC(display(), gc_);
-    gc_ = nullptr;
-  }
-
-  x_server_pixel_buffer_.Release();
-
-  if (display()) {
-    if (damage_handle_) {
-      XDamageDestroy(display(), damage_handle_);
-      damage_handle_ = 0;
-    }
-
-    if (damage_region_) {
-      XFixesDestroyRegion(display(), damage_region_);
-      damage_region_ = 0;
-    }
-  }
-}
-
-}  // namespace
-
-// static
-std::unique_ptr<DesktopCapturer> DesktopCapturer::CreateRawScreenCapturer(
-    const DesktopCaptureOptions& options) {
-  if (!options.x_display())
-    return nullptr;
-
-  std::unique_ptr<ScreenCapturerLinux> capturer(new ScreenCapturerLinux());
-  if (!capturer.get()->Init(options)) {
-    return nullptr;
-  }
-
-  return std::move(capturer);
-}
-
-}  // namespace webrtc
diff --git a/modules/desktop_capture/screen_drawer.cc b/modules/desktop_capture/screen_drawer.cc
deleted file mode 100644
index f1209ed..0000000
--- a/modules/desktop_capture/screen_drawer.cc
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- *  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/desktop_capture/screen_drawer.h"
-
-namespace webrtc {
-
-namespace {
-std::unique_ptr<ScreenDrawerLock> g_screen_drawer_lock;
-}  // namespace
-
-ScreenDrawerLock::ScreenDrawerLock() = default;
-ScreenDrawerLock::~ScreenDrawerLock() = default;
-
-ScreenDrawer::ScreenDrawer() {
-  g_screen_drawer_lock = ScreenDrawerLock::Create();
-}
-
-ScreenDrawer::~ScreenDrawer() {
-  g_screen_drawer_lock.reset();
-}
-
-}  // namespace webrtc
diff --git a/modules/desktop_capture/screen_drawer.h b/modules/desktop_capture/screen_drawer.h
deleted file mode 100644
index ee0ebf0..0000000
--- a/modules/desktop_capture/screen_drawer.h
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- *  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_DESKTOP_CAPTURE_SCREEN_DRAWER_H_
-#define WEBRTC_MODULES_DESKTOP_CAPTURE_SCREEN_DRAWER_H_
-
-#include <stdint.h>
-
-#include <memory>
-
-#include "webrtc/modules/desktop_capture/rgba_color.h"
-#include "webrtc/modules/desktop_capture/desktop_capture_types.h"
-#include "webrtc/modules/desktop_capture/desktop_geometry.h"
-
-namespace webrtc {
-
-// A cross-process lock to ensure only one ScreenDrawer can be used at a certain
-// time.
-class ScreenDrawerLock {
- public:
-  virtual ~ScreenDrawerLock();
-
-  static std::unique_ptr<ScreenDrawerLock> Create();
-
- protected:
-  ScreenDrawerLock();
-};
-
-// A set of basic platform dependent functions to draw various shapes on the
-// screen.
-class ScreenDrawer {
- public:
-  // Creates a ScreenDrawer for the current platform, returns nullptr if no
-  // ScreenDrawer implementation available.
-  // If the implementation cannot guarantee two ScreenDrawer instances won't
-  // impact each other, this function may block current thread until another
-  // ScreenDrawer has been destroyed.
-  static std::unique_ptr<ScreenDrawer> Create();
-
-  ScreenDrawer();
-  virtual ~ScreenDrawer();
-
-  // Returns the region inside which DrawRectangle() function are expected to
-  // work, in capturer coordinates (assuming ScreenCapturer::SelectScreen has
-  // not been called). This region may exclude regions of the screen reserved by
-  // the OS for things like menu bars or app launchers. The DesktopRect is in
-  // system coordinate, i.e. the primary monitor always starts from (0, 0).
-  virtual DesktopRect DrawableRegion() = 0;
-
-  // Draws a rectangle to cover |rect| with |color|. Note, rect.bottom() and
-  // rect.right() two lines are not included. The part of |rect| which is out of
-  // DrawableRegion() will be ignored.
-  virtual void DrawRectangle(DesktopRect rect, RgbaColor color) = 0;
-
-  // Clears all content on the screen by filling the area with black.
-  virtual void Clear() = 0;
-
-  // Blocks current thread until OS finishes previous DrawRectangle() actions.
-  // ScreenCapturer should be able to capture the changes after this function
-  // finish.
-  virtual void WaitForPendingDraws() = 0;
-
-  // Returns true if incomplete shapes previous actions required may be drawn on
-  // the screen after a WaitForPendingDraws() call. i.e. Though the complete
-  // shapes will eventually be drawn on the screen, due to some OS limitations,
-  // these shapes may be partially appeared sometimes.
-  virtual bool MayDrawIncompleteShapes() = 0;
-
-  // Returns the id of the drawer window. This function returns kNullWindowId if
-  // the implementation does not draw on a window of the system.
-  virtual WindowId window_id() const = 0;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_DESKTOP_CAPTURE_SCREEN_DRAWER_H_
diff --git a/modules/desktop_capture/screen_drawer_linux.cc b/modules/desktop_capture/screen_drawer_linux.cc
deleted file mode 100644
index 1a99e69..0000000
--- a/modules/desktop_capture/screen_drawer_linux.cc
+++ /dev/null
@@ -1,181 +0,0 @@
-/*
- *  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 <string.h>
-#include <X11/Xlib.h>
-
-#include <memory>
-
-#include "webrtc/modules/desktop_capture/screen_drawer.h"
-#include "webrtc/modules/desktop_capture/screen_drawer_lock_posix.h"
-#include "webrtc/modules/desktop_capture/x11/shared_x_display.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/ptr_util.h"
-#include "webrtc/system_wrappers/include/sleep.h"
-
-namespace webrtc {
-
-namespace {
-
-// A ScreenDrawer implementation for X11.
-class ScreenDrawerLinux : public ScreenDrawer {
- public:
-  ScreenDrawerLinux();
-  ~ScreenDrawerLinux() override;
-
-  // ScreenDrawer interface.
-  DesktopRect DrawableRegion() override;
-  void DrawRectangle(DesktopRect rect, RgbaColor color) override;
-  void Clear() override;
-  void WaitForPendingDraws() override;
-  bool MayDrawIncompleteShapes() override;
-  WindowId window_id() const override;
-
- private:
-  // Bring the window to the front, this can help to avoid the impact from other
-  // windows or shadow effect.
-  void BringToFront();
-
-  rtc::scoped_refptr<SharedXDisplay> display_;
-  int screen_num_;
-  DesktopRect rect_;
-  Window window_;
-  GC context_;
-  Colormap colormap_;
-};
-
-ScreenDrawerLinux::ScreenDrawerLinux() {
-  display_ = SharedXDisplay::CreateDefault();
-  RTC_CHECK(display_.get());
-  screen_num_ = DefaultScreen(display_->display());
-  XWindowAttributes root_attributes;
-  if (!XGetWindowAttributes(display_->display(),
-                            RootWindow(display_->display(), screen_num_),
-                            &root_attributes)) {
-    RTC_NOTREACHED() << "Failed to get root window size.";
-  }
-  window_ = XCreateSimpleWindow(
-      display_->display(), RootWindow(display_->display(), screen_num_), 0, 0,
-      root_attributes.width, root_attributes.height, 0,
-      BlackPixel(display_->display(), screen_num_),
-      BlackPixel(display_->display(), screen_num_));
-  XSelectInput(display_->display(), window_, StructureNotifyMask);
-  XMapWindow(display_->display(), window_);
-  while (true) {
-    XEvent event;
-    XNextEvent(display_->display(), &event);
-    if (event.type == MapNotify) {
-      break;
-    }
-  }
-  XFlush(display_->display());
-  Window child;
-  int x, y;
-  if (!XTranslateCoordinates(display_->display(), window_,
-                             RootWindow(display_->display(), screen_num_), 0, 0,
-                             &x, &y, &child)) {
-    RTC_NOTREACHED() << "Failed to get window position.";
-  }
-  // Some window manager does not allow a window to cover two or more monitors.
-  // So if the window is on the first monitor of a two-monitor system, the
-  // second half won't be able to show up without changing configurations of WM,
-  // and its DrawableRegion() is not accurate.
-  rect_ = DesktopRect::MakeLTRB(x, y, root_attributes.width,
-                                root_attributes.height);
-  context_ = DefaultGC(display_->display(), screen_num_);
-  colormap_ = DefaultColormap(display_->display(), screen_num_);
-  BringToFront();
-  // Wait for window animations.
-  SleepMs(200);
-}
-
-ScreenDrawerLinux::~ScreenDrawerLinux() {
-  XUnmapWindow(display_->display(), window_);
-  XDestroyWindow(display_->display(), window_);
-}
-
-DesktopRect ScreenDrawerLinux::DrawableRegion() {
-  return rect_;
-}
-
-void ScreenDrawerLinux::DrawRectangle(DesktopRect rect, RgbaColor color) {
-  rect.Translate(-rect_.left(), -rect_.top());
-  XColor xcolor;
-  // X11 does not support Alpha.
-  // X11 uses 16 bits for each primary color, so we need to slightly normalize
-  // a 8 bits channel to 16 bits channel, by setting the low 8 bits as its high
-  // 8 bits to avoid a mismatch of color returned by capturer.
-  xcolor.red = (color.red << 8) + color.red;
-  xcolor.green = (color.green << 8) + color.green;
-  xcolor.blue = (color.blue << 8) + color.blue;
-  xcolor.flags = DoRed | DoGreen | DoBlue;
-  XAllocColor(display_->display(), colormap_, &xcolor);
-  XSetForeground(display_->display(), context_, xcolor.pixel);
-  XFillRectangle(display_->display(), window_, context_, rect.left(),
-                 rect.top(), rect.width(), rect.height());
-  XFlush(display_->display());
-}
-
-void ScreenDrawerLinux::Clear() {
-  DrawRectangle(rect_, RgbaColor(0, 0, 0));
-}
-
-// TODO(zijiehe): Find the right signal from X11 to indicate the finish of all
-// pending paintings.
-void ScreenDrawerLinux::WaitForPendingDraws() {
-  SleepMs(50);
-}
-
-bool ScreenDrawerLinux::MayDrawIncompleteShapes() {
-  return true;
-}
-
-WindowId ScreenDrawerLinux::window_id() const {
-  return window_;
-}
-
-void ScreenDrawerLinux::BringToFront() {
-  Atom state_above = XInternAtom(display_->display(), "_NET_WM_STATE_ABOVE", 1);
-  Atom window_state = XInternAtom(display_->display(), "_NET_WM_STATE", 1);
-  if (state_above == None || window_state == None) {
-    // Fallback to use XRaiseWindow, it's not reliable if two windows are both
-    // raise itself to the top.
-    XRaiseWindow(display_->display(), window_);
-    return;
-  }
-
-  XEvent event;
-  memset(&event, 0, sizeof(event));
-  event.type = ClientMessage;
-  event.xclient.window = window_;
-  event.xclient.message_type = window_state;
-  event.xclient.format = 32;
-  event.xclient.data.l[0] = 1;  // _NET_WM_STATE_ADD
-  event.xclient.data.l[1] = state_above;
-  XSendEvent(display_->display(), RootWindow(display_->display(), screen_num_),
-             False, SubstructureRedirectMask | SubstructureNotifyMask, &event);
-}
-
-}  // namespace
-
-// static
-std::unique_ptr<ScreenDrawerLock> ScreenDrawerLock::Create() {
-  return rtc::MakeUnique<ScreenDrawerLockPosix>();
-}
-
-// static
-std::unique_ptr<ScreenDrawer> ScreenDrawer::Create() {
-  if (SharedXDisplay::CreateDefault().get()) {
-    return rtc::MakeUnique<ScreenDrawerLinux>();
-  }
-  return nullptr;
-}
-
-}  // namespace webrtc
diff --git a/modules/desktop_capture/screen_drawer_lock_posix.cc b/modules/desktop_capture/screen_drawer_lock_posix.cc
deleted file mode 100644
index 5b6bc9c..0000000
--- a/modules/desktop_capture/screen_drawer_lock_posix.cc
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- *  Copyright (c) 2017 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/desktop_capture/screen_drawer_lock_posix.h"
-
-#include <fcntl.h>
-#include <sys/stat.h>
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-
-namespace webrtc {
-
-namespace {
-
-// A uuid as the name of semaphore.
-static constexpr char kSemaphoreName[] = "GSDL54fe5552804711e6a7253f429a";
-
-}  // namespace
-
-ScreenDrawerLockPosix::ScreenDrawerLockPosix()
-    : ScreenDrawerLockPosix(kSemaphoreName) {}
-
-ScreenDrawerLockPosix::ScreenDrawerLockPosix(const char* name) {
-  semaphore_ = sem_open(name, O_CREAT, S_IRWXU | S_IRWXG | S_IRWXO, 1);
-  if (semaphore_ == SEM_FAILED) {
-    LOG_ERRNO(LS_ERROR) << "Failed to create named semaphore with " << name;
-    RTC_NOTREACHED();
-  }
-
-  sem_wait(semaphore_);
-}
-
-ScreenDrawerLockPosix::~ScreenDrawerLockPosix() {
-  if (semaphore_ == SEM_FAILED) {
-    return;
-  }
-
-  sem_post(semaphore_);
-  sem_close(semaphore_);
-  // sem_unlink a named semaphore won't wait until other clients to release the
-  // sem_t. So if a new process starts, it will sem_open a different kernel
-  // object with the same name and eventually breaks the cross-process lock.
-}
-
-// static
-void ScreenDrawerLockPosix::Unlink(const char* name) {
-  sem_unlink(name);
-}
-
-}  // namespace webrtc
diff --git a/modules/desktop_capture/screen_drawer_lock_posix.h b/modules/desktop_capture/screen_drawer_lock_posix.h
deleted file mode 100644
index a768066..0000000
--- a/modules/desktop_capture/screen_drawer_lock_posix.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- *  Copyright (c) 2017 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_DESKTOP_CAPTURE_SCREEN_DRAWER_LOCK_POSIX_H_
-#define WEBRTC_MODULES_DESKTOP_CAPTURE_SCREEN_DRAWER_LOCK_POSIX_H_
-
-#include <semaphore.h>
-
-#include "webrtc/modules/desktop_capture/screen_drawer.h"
-
-namespace webrtc {
-
-class ScreenDrawerLockPosix final : public ScreenDrawerLock {
- public:
-  ScreenDrawerLockPosix();
-  // Provides a name other than the default one for test only.
-  explicit ScreenDrawerLockPosix(const char* name);
-  ~ScreenDrawerLockPosix() override;
-
-  // Unlinks the named semaphore actively. This will remove the sem_t object in
-  // the system and allow others to create a different sem_t object with the
-  // same/ name.
-  static void Unlink(const char* name);
-
- private:
-  sem_t* semaphore_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_DESKTOP_CAPTURE_SCREEN_DRAWER_LOCK_POSIX_H_
diff --git a/modules/desktop_capture/screen_drawer_mac.cc b/modules/desktop_capture/screen_drawer_mac.cc
deleted file mode 100644
index 90f7271..0000000
--- a/modules/desktop_capture/screen_drawer_mac.cc
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- *  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.
- */
-
-// TODO(zijiehe): Implement ScreenDrawerMac
-
-#include "webrtc/modules/desktop_capture/screen_drawer.h"
-#include "webrtc/modules/desktop_capture/screen_drawer_lock_posix.h"
-#include "webrtc/rtc_base/ptr_util.h"
-
-namespace webrtc {
-
-// static
-std::unique_ptr<ScreenDrawerLock> ScreenDrawerLock::Create() {
-  return rtc::MakeUnique<ScreenDrawerLockPosix>();
-}
-
-// static
-std::unique_ptr<ScreenDrawer> ScreenDrawer::Create() {
-  return nullptr;
-}
-
-}  // namespace webrtc
diff --git a/modules/desktop_capture/screen_drawer_unittest.cc b/modules/desktop_capture/screen_drawer_unittest.cc
deleted file mode 100644
index 94404ee..0000000
--- a/modules/desktop_capture/screen_drawer_unittest.cc
+++ /dev/null
@@ -1,159 +0,0 @@
-/*
- *  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/desktop_capture/screen_drawer.h"
-
-#include <atomic>
-#include <stdint.h>
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/function_view.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/random.h"
-#include "webrtc/rtc_base/platform_thread.h"
-#include "webrtc/rtc_base/ptr_util.h"
-#include "webrtc/rtc_base/timeutils.h"
-#include "webrtc/system_wrappers/include/sleep.h"
-#include "webrtc/test/gtest.h"
-
-#if defined(WEBRTC_POSIX)
-#include "webrtc/modules/desktop_capture/screen_drawer_lock_posix.h"
-#endif
-
-namespace webrtc {
-
-namespace {
-
-void TestScreenDrawerLock(
-    rtc::FunctionView<std::unique_ptr<ScreenDrawerLock>()> ctor) {
-  constexpr int kLockDurationMs = 100;
-
-  RTC_DCHECK(ctor);
-
-  std::atomic<bool> created(false);
-  std::atomic<bool> ready(false);
-
-  class Task {
-   public:
-    Task(std::atomic<bool>* created,
-         const std::atomic<bool>& ready,
-         rtc::FunctionView<std::unique_ptr<ScreenDrawerLock>()> ctor)
-        : created_(created),
-          ready_(ready),
-          ctor_(ctor) {}
-
-    ~Task() = default;
-
-    static void RunTask(void* me) {
-      Task* task = static_cast<Task*>(me);
-      std::unique_ptr<ScreenDrawerLock> lock = task->ctor_();
-      ASSERT_TRUE(!!lock);
-      task->created_->store(true);
-      // Wait for the main thread to get the signal of created_.
-      while (!task->ready_.load()) {
-        SleepMs(1);
-      }
-      // At this point, main thread should begin to create a second lock. Though
-      // it's still possible the second lock won't be created before the
-      // following sleep has been finished, the possibility will be
-      // significantly reduced.
-      const int64_t current_ms = rtc::TimeMillis();
-      // SleepMs() may return early. See
-      // https://cs.chromium.org/chromium/src/third_party/webrtc/system_wrappers/include/sleep.h?rcl=4a604c80cecce18aff6fc5e16296d04675312d83&l=20
-      // But we need to ensure at least 100 ms has been passed before unlocking
-      // |lock|.
-      while (rtc::TimeMillis() - current_ms < kLockDurationMs) {
-        SleepMs(kLockDurationMs - (rtc::TimeMillis() - current_ms));
-      }
-    }
-
-   private:
-    std::atomic<bool>* const created_;
-    const std::atomic<bool>& ready_;
-    const rtc::FunctionView<std::unique_ptr<ScreenDrawerLock>()> ctor_;
-  } task(&created, ready, ctor);
-
-  rtc::PlatformThread lock_thread(&Task::RunTask, &task, "lock_thread");
-  lock_thread.Start();
-
-  // Wait for the first lock in Task::RunTask() to be created.
-  // TODO(zijiehe): Find a better solution to wait for the creation of the first
-  // lock. See https://chromium-review.googlesource.com/c/607688/13/webrtc/modules/desktop_capture/screen_drawer_unittest.cc
-  while (!created.load()) {
-    SleepMs(1);
-  }
-
-  const int64_t start_ms = rtc::TimeMillis();
-  ready.store(true);
-  // This is unlikely to fail, but just in case current thread is too laggy and
-  // cause the SleepMs() in RunTask() to finish before we creating another lock.
-  ASSERT_GT(kLockDurationMs, rtc::TimeMillis() - start_ms);
-  ctor();
-  ASSERT_LE(kLockDurationMs, rtc::TimeMillis() - start_ms);
-  lock_thread.Stop();
-}
-
-}  // namespace
-
-// These are a set of manual test cases, as we do not have an automatical way to
-// detect whether a ScreenDrawer on a certain platform works well without
-// ScreenCapturer(s). So you may execute these test cases with
-// --gtest_also_run_disabled_tests --gtest_filter=ScreenDrawerTest.*.
-TEST(ScreenDrawerTest, DISABLED_DrawRectangles) {
-  std::unique_ptr<ScreenDrawer> drawer = ScreenDrawer::Create();
-  if (!drawer) {
-    LOG(LS_WARNING) << "No ScreenDrawer implementation for current platform.";
-    return;
-  }
-
-  if (drawer->DrawableRegion().is_empty()) {
-    LOG(LS_WARNING) << "ScreenDrawer of current platform does not provide a "
-                       "non-empty DrawableRegion().";
-    return;
-  }
-
-  DesktopRect rect = drawer->DrawableRegion();
-  Random random(rtc::TimeMicros());
-  for (int i = 0; i < 100; i++) {
-    // Make sure we at least draw one pixel.
-    int left = random.Rand(rect.left(), rect.right() - 2);
-    int top = random.Rand(rect.top(), rect.bottom() - 2);
-    drawer->DrawRectangle(
-        DesktopRect::MakeLTRB(left, top, random.Rand(left + 1, rect.right()),
-                              random.Rand(top + 1, rect.bottom())),
-        RgbaColor(random.Rand<uint8_t>(), random.Rand<uint8_t>(),
-                  random.Rand<uint8_t>(), random.Rand<uint8_t>()));
-
-    if (i == 50) {
-      SleepMs(10000);
-    }
-  }
-
-  SleepMs(10000);
-}
-
-TEST(ScreenDrawerTest, TwoScreenDrawerLocks) {
-#if defined(WEBRTC_POSIX)
-  // ScreenDrawerLockPosix won't be able to unlink the named semaphore. So use a
-  // different semaphore name here to avoid deadlock.
-  const char* semaphore_name = "GSDL8784541a812011e788ff67427b";
-  ScreenDrawerLockPosix::Unlink(semaphore_name);
-
-  TestScreenDrawerLock([semaphore_name]() {
-    return rtc::MakeUnique<ScreenDrawerLockPosix>(semaphore_name);
-  });
-#elif defined(WEBRTC_WIN)
-  TestScreenDrawerLock([]() {
-    return ScreenDrawerLock::Create();
-  });
-#endif
-}
-
-}  // namespace webrtc
diff --git a/modules/desktop_capture/screen_drawer_win.cc b/modules/desktop_capture/screen_drawer_win.cc
deleted file mode 100644
index caa0ce2..0000000
--- a/modules/desktop_capture/screen_drawer_win.cc
+++ /dev/null
@@ -1,209 +0,0 @@
-/*
- *  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 <windows.h>
-
-#include <memory>
-
-#include "webrtc/modules/desktop_capture/screen_drawer.h"
-#include "webrtc/system_wrappers/include/sleep.h"
-
-namespace webrtc {
-
-namespace {
-
-static constexpr TCHAR kMutexName[] =
-    TEXT("Local\\ScreenDrawerWin-da834f82-8044-11e6-ac81-73dcdd1c1869");
-
-class ScreenDrawerLockWin : public ScreenDrawerLock {
- public:
-  ScreenDrawerLockWin();
-  ~ScreenDrawerLockWin() override;
-
- private:
-  HANDLE mutex_;
-};
-
-ScreenDrawerLockWin::ScreenDrawerLockWin() {
-  while (true) {
-    mutex_ = CreateMutex(NULL, FALSE, kMutexName);
-    if (GetLastError() != ERROR_ALREADY_EXISTS && mutex_ != NULL) {
-      break;
-    } else {
-      if (mutex_) {
-        CloseHandle(mutex_);
-      }
-      SleepMs(1000);
-    }
-  }
-}
-
-ScreenDrawerLockWin::~ScreenDrawerLockWin() {
-  CloseHandle(mutex_);
-}
-
-DesktopRect GetScreenRect() {
-  HDC hdc = GetDC(NULL);
-  DesktopRect rect = DesktopRect::MakeWH(GetDeviceCaps(hdc, HORZRES),
-                                         GetDeviceCaps(hdc, VERTRES));
-  ReleaseDC(NULL, hdc);
-  return rect;
-}
-
-HWND CreateDrawerWindow(DesktopRect rect) {
-  HWND hwnd = CreateWindowA(
-      "STATIC", "DrawerWindow", WS_POPUPWINDOW | WS_VISIBLE, rect.left(),
-      rect.top(), rect.width(), rect.height(), NULL, NULL, NULL, NULL);
-  SetForegroundWindow(hwnd);
-  return hwnd;
-}
-
-COLORREF ColorToRef(RgbaColor color) {
-  // Windows device context does not support alpha.
-  return RGB(color.red, color.green, color.blue);
-}
-
-// A ScreenDrawer implementation for Windows.
-class ScreenDrawerWin : public ScreenDrawer {
- public:
-  ScreenDrawerWin();
-  ~ScreenDrawerWin() override;
-
-  // ScreenDrawer interface.
-  DesktopRect DrawableRegion() override;
-  void DrawRectangle(DesktopRect rect, RgbaColor color) override;
-  void Clear() override;
-  void WaitForPendingDraws() override;
-  bool MayDrawIncompleteShapes() override;
-  WindowId window_id() const override;
-
- private:
-  // Bring the window to the front, this can help to avoid the impact from other
-  // windows or shadow effects.
-  void BringToFront();
-
-  // Draw a line with |color|.
-  void DrawLine(DesktopVector start, DesktopVector end, RgbaColor color);
-
-  // Draw a dot with |color|.
-  void DrawDot(DesktopVector vect, RgbaColor color);
-
-  const DesktopRect rect_;
-  HWND window_;
-  HDC hdc_;
-};
-
-ScreenDrawerWin::ScreenDrawerWin()
-    : ScreenDrawer(),
-      rect_(GetScreenRect()),
-      window_(CreateDrawerWindow(rect_)),
-      hdc_(GetWindowDC(window_)) {
-  // We do not need to handle any messages for the |window_|, so disable Windows
-  // from processing windows ghosting feature.
-  DisableProcessWindowsGhosting();
-
-  // Always use stock pen (DC_PEN) and brush (DC_BRUSH).
-  SelectObject(hdc_, GetStockObject(DC_PEN));
-  SelectObject(hdc_, GetStockObject(DC_BRUSH));
-  BringToFront();
-}
-
-ScreenDrawerWin::~ScreenDrawerWin() {
-  ReleaseDC(NULL, hdc_);
-  DestroyWindow(window_);
-  // Unfortunately there is no EnableProcessWindowsGhosting() API.
-}
-
-DesktopRect ScreenDrawerWin::DrawableRegion() {
-  return rect_;
-}
-
-void ScreenDrawerWin::DrawRectangle(DesktopRect rect, RgbaColor color) {
-  if (rect.width() == 1 && rect.height() == 1) {
-    // Rectangle function cannot draw a 1 pixel rectangle.
-    DrawDot(rect.top_left(), color);
-    return;
-  }
-
-  if (rect.width() == 1 || rect.height() == 1) {
-    // Rectangle function cannot draw a 1 pixel rectangle.
-    DrawLine(rect.top_left(), DesktopVector(rect.right(), rect.bottom()),
-             color);
-    return;
-  }
-
-  SetDCBrushColor(hdc_, ColorToRef(color));
-  SetDCPenColor(hdc_, ColorToRef(color));
-  Rectangle(hdc_, rect.left(), rect.top(), rect.right(), rect.bottom());
-}
-
-void ScreenDrawerWin::Clear() {
-  DrawRectangle(rect_, RgbaColor(0, 0, 0));
-}
-
-// TODO(zijiehe): Find the right signal to indicate the finish of all pending
-// paintings.
-void ScreenDrawerWin::WaitForPendingDraws() {
-  BringToFront();
-  SleepMs(50);
-}
-
-bool ScreenDrawerWin::MayDrawIncompleteShapes() {
-  return true;
-}
-
-WindowId ScreenDrawerWin::window_id() const {
-  return reinterpret_cast<WindowId>(window_);
-}
-
-void ScreenDrawerWin::DrawLine(DesktopVector start,
-                               DesktopVector end,
-                               RgbaColor color) {
-  POINT points[2];
-  points[0].x = start.x();
-  points[0].y = start.y();
-  points[1].x = end.x();
-  points[1].y = end.y();
-  SetDCPenColor(hdc_, ColorToRef(color));
-  Polyline(hdc_, points, 2);
-}
-
-void ScreenDrawerWin::DrawDot(DesktopVector vect, RgbaColor color) {
-  SetPixel(hdc_, vect.x(), vect.y(), ColorToRef(color));
-}
-
-void ScreenDrawerWin::BringToFront() {
-  if (SetWindowPos(window_, HWND_TOPMOST, 0, 0, 0, 0,
-                   SWP_NOMOVE | SWP_NOSIZE) != FALSE) {
-    return;
-  }
-
-  long ex_style = GetWindowLong(window_, GWL_EXSTYLE);
-  ex_style |= WS_EX_TOPMOST;
-  if (SetWindowLong(window_, GWL_EXSTYLE, ex_style) != 0) {
-    return;
-  }
-
-  BringWindowToTop(window_);
-}
-
-}  // namespace
-
-// static
-std::unique_ptr<ScreenDrawerLock> ScreenDrawerLock::Create() {
-  return std::unique_ptr<ScreenDrawerLock>(new ScreenDrawerLockWin());
-}
-
-// static
-std::unique_ptr<ScreenDrawer> ScreenDrawer::Create() {
-  return std::unique_ptr<ScreenDrawer>(new ScreenDrawerWin());
-}
-
-}  // namespace webrtc
diff --git a/modules/desktop_capture/shared_desktop_frame.cc b/modules/desktop_capture/shared_desktop_frame.cc
deleted file mode 100644
index ef3abe3..0000000
--- a/modules/desktop_capture/shared_desktop_frame.cc
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- *  Copyright (c) 2013 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/desktop_capture/shared_desktop_frame.h"
-
-#include <memory>
-#include <utility>
-
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/ptr_util.h"
-
-namespace webrtc {
-
-SharedDesktopFrame::~SharedDesktopFrame() {}
-
-// static
-std::unique_ptr<SharedDesktopFrame> SharedDesktopFrame::Wrap(
-    std::unique_ptr<DesktopFrame> desktop_frame) {
-  return std::unique_ptr<SharedDesktopFrame>(
-      new SharedDesktopFrame(new Core(std::move(desktop_frame))));
-}
-
-SharedDesktopFrame* SharedDesktopFrame::Wrap(DesktopFrame* desktop_frame) {
-  return Wrap(std::unique_ptr<DesktopFrame>(desktop_frame)).release();
-}
-
-DesktopFrame* SharedDesktopFrame::GetUnderlyingFrame() {
-  return core_->get();
-}
-
-bool SharedDesktopFrame::ShareFrameWith(const SharedDesktopFrame& other) const {
-  return core_->get() == other.core_->get();
-}
-
-std::unique_ptr<SharedDesktopFrame> SharedDesktopFrame::Share() {
-  std::unique_ptr<SharedDesktopFrame> result(new SharedDesktopFrame(core_));
-  result->CopyFrameInfoFrom(*this);
-  return result;
-}
-
-bool SharedDesktopFrame::IsShared() {
-  return !core_->HasOneRef();
-}
-
-SharedDesktopFrame::SharedDesktopFrame(rtc::scoped_refptr<Core> core)
-    : DesktopFrame((*core)->size(),
-                   (*core)->stride(),
-                   (*core)->data(),
-                   (*core)->shared_memory()),
-      core_(core) {
-  CopyFrameInfoFrom(*(core_->get()));
-}
-
-}  // namespace webrtc
diff --git a/modules/desktop_capture/shared_desktop_frame.h b/modules/desktop_capture/shared_desktop_frame.h
deleted file mode 100644
index 6b2fea0..0000000
--- a/modules/desktop_capture/shared_desktop_frame.h
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- *  Copyright (c) 2013 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_DESKTOP_CAPTURE_SHARED_DESKTOP_FRAME_H_
-#define WEBRTC_MODULES_DESKTOP_CAPTURE_SHARED_DESKTOP_FRAME_H_
-
-#include "webrtc/modules/desktop_capture/desktop_frame.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/refcount.h"
-#include "webrtc/rtc_base/scoped_ref_ptr.h"
-
-namespace webrtc {
-
-// SharedDesktopFrame is a DesktopFrame that may have multiple instances all
-// sharing the same buffer.
-class SharedDesktopFrame : public DesktopFrame {
- public:
-  ~SharedDesktopFrame() override;
-
-  static std::unique_ptr<SharedDesktopFrame> Wrap(
-      std::unique_ptr<DesktopFrame> desktop_frame);
-
-  // Deprecated.
-  // TODO(sergeyu): remove this method.
-  static SharedDesktopFrame* Wrap(DesktopFrame* desktop_frame);
-
-  // Deprecated. Clients do not need to know the underlying DesktopFrame
-  // instance.
-  // TODO(zijiehe): Remove this method.
-  // Returns the underlying instance of DesktopFrame.
-  DesktopFrame* GetUnderlyingFrame();
-
-  // Returns whether |this| and |other| share the underlying DesktopFrame.
-  bool ShareFrameWith(const SharedDesktopFrame& other) const;
-
-  // Creates a clone of this object.
-  std::unique_ptr<SharedDesktopFrame> Share();
-
-  // Checks if the frame is currently shared. If it returns false it's
-  // guaranteed that there are no clones of the object.
-  bool IsShared();
-
- private:
-  typedef rtc::RefCountedObject<std::unique_ptr<DesktopFrame>> Core;
-
-  SharedDesktopFrame(rtc::scoped_refptr<Core> core);
-
-  const rtc::scoped_refptr<Core> core_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(SharedDesktopFrame);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_DESKTOP_CAPTURE_SHARED_DESKTOP_FRAME_H_
diff --git a/modules/desktop_capture/shared_memory.cc b/modules/desktop_capture/shared_memory.cc
deleted file mode 100644
index 872116e..0000000
--- a/modules/desktop_capture/shared_memory.cc
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- *  Copyright (c) 2013 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/desktop_capture/shared_memory.h"
-
-namespace webrtc {
-
-#if defined(WEBRTC_WIN)
-const SharedMemory::Handle SharedMemory::kInvalidHandle = NULL;
-#else
-const SharedMemory::Handle SharedMemory::kInvalidHandle = -1;
-#endif
-
-SharedMemory::SharedMemory(void* data, size_t size, Handle handle, int id)
-  : data_(data),
-    size_(size),
-    handle_(handle),
-    id_(id) {
-}
-
-}  // namespace webrtc
diff --git a/modules/desktop_capture/shared_memory.h b/modules/desktop_capture/shared_memory.h
deleted file mode 100644
index 8d283fb..0000000
--- a/modules/desktop_capture/shared_memory.h
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- *  Copyright (c) 2013 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_DESKTOP_CAPTURE_SHARED_MEMORY_H_
-#define WEBRTC_MODULES_DESKTOP_CAPTURE_SHARED_MEMORY_H_
-
-#include <stddef.h>
-
-#if defined(WEBRTC_WIN)
-#include <windows.h>
-#endif
-
-#include <memory>
-
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/thread_checker.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-// SharedMemory is a base class for shared memory. It stores all required
-// parameters of the buffer, but doesn't have any logic to allocate or destroy
-// the actual buffer. DesktopCapturer consumers that need to use shared memory
-// for video frames must extend this class with creation and destruction logic
-// specific for the target platform and then call
-// DesktopCapturer::SetSharedMemoryFactory().
-class SharedMemory {
- public:
-#if defined(WEBRTC_WIN)
-  typedef HANDLE Handle;
-  static const Handle kInvalidHandle;
-#else
-  typedef int Handle;
-  static const Handle kInvalidHandle;
-#endif
-
-  void* data() const { return data_; }
-  size_t size() const { return size_; }
-
-  // Platform-specific handle of the buffer.
-  Handle handle() const { return handle_; }
-
-  // Integer identifier that can be used used by consumers of DesktopCapturer
-  // interface to identify shared memory buffers it created.
-  int id() const { return id_; }
-
-  virtual ~SharedMemory() {}
-
- protected:
-  SharedMemory(void* data, size_t size, Handle handle, int id);
-
-  void* const data_;
-  const size_t size_;
-  const Handle handle_;
-  const int id_;
-
- private:
-  RTC_DISALLOW_COPY_AND_ASSIGN(SharedMemory);
-};
-
-// Interface used to create SharedMemory instances.
-class SharedMemoryFactory {
- public:
-  SharedMemoryFactory() {}
-  virtual ~SharedMemoryFactory() {}
-
-  virtual std::unique_ptr<SharedMemory> CreateSharedMemory(size_t size) = 0;
-
- private:
-  RTC_DISALLOW_COPY_AND_ASSIGN(SharedMemoryFactory);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_DESKTOP_CAPTURE_SHARED_MEMORY_H_
-
diff --git a/modules/desktop_capture/test_utils.cc b/modules/desktop_capture/test_utils.cc
deleted file mode 100644
index e2b428e..0000000
--- a/modules/desktop_capture/test_utils.cc
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- *  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/desktop_capture/test_utils.h"
-
-#include <string.h>
-
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-
-void ClearDesktopFrame(DesktopFrame* frame) {
-  RTC_DCHECK(frame);
-  uint8_t* data = frame->data();
-  for (int i = 0; i < frame->size().height(); i++) {
-    memset(data, 0, frame->size().width() * DesktopFrame::kBytesPerPixel);
-    data += frame->stride();
-  }
-}
-
-bool DesktopFrameDataEquals(const DesktopFrame& left,
-                            const DesktopFrame& right) {
-  if (!left.size().equals(right.size())) {
-    return false;
-  }
-
-  const uint8_t* left_array = left.data();
-  const uint8_t* right_array = right.data();
-  for (int i = 0; i < left.size().height(); i++) {
-    if (memcmp(left_array,
-               right_array,
-               DesktopFrame::kBytesPerPixel * left.size().width()) != 0) {
-      return false;
-    }
-    left_array += left.stride();
-    right_array += right.stride();
-  }
-
-  return true;
-}
-
-}  // namespace webrtc
diff --git a/modules/desktop_capture/test_utils.h b/modules/desktop_capture/test_utils.h
deleted file mode 100644
index ca27298..0000000
--- a/modules/desktop_capture/test_utils.h
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- *  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_DESKTOP_CAPTURE_TEST_UTILS_H_
-#define WEBRTC_MODULES_DESKTOP_CAPTURE_TEST_UTILS_H_
-
-#include "webrtc/modules/desktop_capture/desktop_frame.h"
-
-namespace webrtc {
-
-// Clears a DesktopFrame |frame| by setting its data() into 0.
-void ClearDesktopFrame(DesktopFrame* frame);
-
-// Compares size() and data() of two DesktopFrames |left| and |right|.
-bool DesktopFrameDataEquals(const DesktopFrame& left,
-                            const DesktopFrame& right);
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_DESKTOP_CAPTURE_TEST_UTILS_H_
diff --git a/modules/desktop_capture/test_utils_unittest.cc b/modules/desktop_capture/test_utils_unittest.cc
deleted file mode 100644
index fd8fa94..0000000
--- a/modules/desktop_capture/test_utils_unittest.cc
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- *  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/desktop_capture/test_utils.h"
-
-#include "webrtc/modules/desktop_capture/rgba_color.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-namespace {
-
-void PaintDesktopFrame(DesktopFrame* frame,
-                       DesktopVector pos,
-                       RgbaColor color) {
-  RTC_DCHECK(frame);
-  RTC_DCHECK(DesktopRect::MakeSize(frame->size()).Contains(pos));
-  *reinterpret_cast<uint32_t*>(frame->GetFrameDataAtPos(pos)) =
-      color.ToUInt32();
-}
-
-// A DesktopFrame implementation to store data in heap, but the stide is
-// doubled.
-class DoubleSizeDesktopFrame : public DesktopFrame {
- public:
-  explicit DoubleSizeDesktopFrame(DesktopSize size);
-  ~DoubleSizeDesktopFrame() override;
-};
-
-DoubleSizeDesktopFrame::DoubleSizeDesktopFrame(DesktopSize size)
-    : DesktopFrame(
-          size,
-          kBytesPerPixel * size.width() * 2,
-          new uint8_t[kBytesPerPixel * size.width() * size.height() * 2],
-          nullptr) {}
-
-DoubleSizeDesktopFrame::~DoubleSizeDesktopFrame() {
-  delete[] data_;
-}
-
-}  // namespace
-
-TEST(TestUtilsTest, BasicDataEqualsCases) {
-  BasicDesktopFrame frame(DesktopSize(4, 4));
-  for (int i = 0; i < 4; i++) {
-    for (int j = 0; j < 4; j++) {
-      PaintDesktopFrame(&frame, DesktopVector(i, j), RgbaColor(4U * j + i));
-    }
-  }
-
-  ASSERT_TRUE(DesktopFrameDataEquals(frame, frame));
-  BasicDesktopFrame other(DesktopSize(4, 4));
-  for (int i = 0; i < 4; i++) {
-    for (int j = 0; j < 4; j++) {
-      PaintDesktopFrame(&other, DesktopVector(i, j), RgbaColor(4U * j + i));
-    }
-  }
-  ASSERT_TRUE(DesktopFrameDataEquals(frame, other));
-  PaintDesktopFrame(&other, DesktopVector(2, 2), RgbaColor(0U));
-  ASSERT_FALSE(DesktopFrameDataEquals(frame, other));
-}
-
-TEST(TestUtilsTest, DifferentSizeShouldNotEqual) {
-  BasicDesktopFrame frame(DesktopSize(4, 4));
-  for (int i = 0; i < 4; i++) {
-    for (int j = 0; j < 4; j++) {
-      PaintDesktopFrame(&frame, DesktopVector(i, j), RgbaColor(4U * j + i));
-    }
-  }
-
-  BasicDesktopFrame other(DesktopSize(2, 8));
-  for (int i = 0; i < 2; i++) {
-    for (int j = 0; j < 8; j++) {
-      PaintDesktopFrame(&other, DesktopVector(i, j), RgbaColor(2U * j + i));
-    }
-  }
-
-  ASSERT_FALSE(DesktopFrameDataEquals(frame, other));
-}
-
-TEST(TestUtilsTest, DifferentStrideShouldBeComparable) {
-  BasicDesktopFrame frame(DesktopSize(4, 4));
-  for (int i = 0; i < 4; i++) {
-    for (int j = 0; j < 4; j++) {
-      PaintDesktopFrame(&frame, DesktopVector(i, j), RgbaColor(4U * j + i));
-    }
-  }
-
-  ASSERT_TRUE(DesktopFrameDataEquals(frame, frame));
-  DoubleSizeDesktopFrame other(DesktopSize(4, 4));
-  for (int i = 0; i < 4; i++) {
-    for (int j = 0; j < 4; j++) {
-      PaintDesktopFrame(&other, DesktopVector(i, j), RgbaColor(4U * j + i));
-    }
-  }
-  ASSERT_TRUE(DesktopFrameDataEquals(frame, other));
-}
-
-}  // namespace webrtc
diff --git a/modules/desktop_capture/win/cursor.cc b/modules/desktop_capture/win/cursor.cc
deleted file mode 100644
index 8e3d34b..0000000
--- a/modules/desktop_capture/win/cursor.cc
+++ /dev/null
@@ -1,248 +0,0 @@
-/*
- *  Copyright (c) 2013 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/desktop_capture/win/cursor.h"
-
-#include <algorithm>
-#include <memory>
-
-#include "webrtc/modules/desktop_capture/desktop_frame.h"
-#include "webrtc/modules/desktop_capture/desktop_geometry.h"
-#include "webrtc/modules/desktop_capture/mouse_cursor.h"
-#include "webrtc/modules/desktop_capture/win/scoped_gdi_object.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-namespace {
-
-#if defined(WEBRTC_ARCH_LITTLE_ENDIAN)
-
-#define RGBA(r, g, b, a) \
-    ((((a) << 24) & 0xff000000) | \
-    (((b) << 16) & 0xff0000) | \
-    (((g) << 8) & 0xff00) | \
-    ((r) & 0xff))
-
-#else  // !defined(WEBRTC_ARCH_LITTLE_ENDIAN)
-
-#define RGBA(r, g, b, a) \
-    ((((r) << 24) & 0xff000000) | \
-    (((g) << 16) & 0xff0000) | \
-    (((b) << 8) & 0xff00) | \
-    ((a) & 0xff))
-
-#endif  // !defined(WEBRTC_ARCH_LITTLE_ENDIAN)
-
-const int kBytesPerPixel = DesktopFrame::kBytesPerPixel;
-
-// Pixel colors used when generating cursor outlines.
-const uint32_t kPixelRgbaBlack = RGBA(0, 0, 0, 0xff);
-const uint32_t kPixelRgbaWhite = RGBA(0xff, 0xff, 0xff, 0xff);
-const uint32_t kPixelRgbaTransparent = RGBA(0, 0, 0, 0);
-
-const uint32_t kPixelRgbWhite = RGB(0xff, 0xff, 0xff);
-
-// Expands the cursor shape to add a white outline for visibility against
-// dark backgrounds.
-void AddCursorOutline(int width, int height, uint32_t* data) {
-  for (int y = 0; y < height; y++) {
-    for (int x = 0; x < width; x++) {
-      // If this is a transparent pixel (bgr == 0 and alpha = 0), check the
-      // neighbor pixels to see if this should be changed to an outline pixel.
-      if (*data == kPixelRgbaTransparent) {
-        // Change to white pixel if any neighbors (top, bottom, left, right)
-        // are black.
-        if ((y > 0 && data[-width] == kPixelRgbaBlack) ||
-            (y < height - 1 && data[width] == kPixelRgbaBlack) ||
-            (x > 0 && data[-1] == kPixelRgbaBlack) ||
-            (x < width - 1 && data[1] == kPixelRgbaBlack)) {
-          *data = kPixelRgbaWhite;
-        }
-      }
-      data++;
-    }
-  }
-}
-
-// Premultiplies RGB components of the pixel data in the given image by
-// the corresponding alpha components.
-void AlphaMul(uint32_t* data, int width, int height) {
-  static_assert(sizeof(uint32_t) == kBytesPerPixel,
-                "size of uint32 should be the number of bytes per pixel");
-
-  for (uint32_t* data_end = data + width * height; data != data_end; ++data) {
-    RGBQUAD* from = reinterpret_cast<RGBQUAD*>(data);
-    RGBQUAD* to = reinterpret_cast<RGBQUAD*>(data);
-    to->rgbBlue =
-        (static_cast<uint16_t>(from->rgbBlue) * from->rgbReserved) / 0xff;
-    to->rgbGreen =
-        (static_cast<uint16_t>(from->rgbGreen) * from->rgbReserved) / 0xff;
-    to->rgbRed =
-        (static_cast<uint16_t>(from->rgbRed) * from->rgbReserved) / 0xff;
-  }
-}
-
-// Scans a 32bpp bitmap looking for any pixels with non-zero alpha component.
-// Returns true if non-zero alpha is found. |stride| is expressed in pixels.
-bool HasAlphaChannel(const uint32_t* data, int stride, int width, int height) {
-  const RGBQUAD* plane = reinterpret_cast<const RGBQUAD*>(data);
-  for (int y = 0; y < height; ++y) {
-    for (int x = 0; x < width; ++x) {
-      if (plane->rgbReserved != 0)
-        return true;
-      plane += 1;
-    }
-    plane += stride - width;
-  }
-
-  return false;
-}
-
-}  // namespace
-
-MouseCursor* CreateMouseCursorFromHCursor(HDC dc, HCURSOR cursor) {
-  ICONINFO iinfo;
-  if (!GetIconInfo(cursor, &iinfo)) {
-    LOG_F(LS_ERROR) << "Unable to get cursor icon info. Error = "
-                    << GetLastError();
-    return NULL;
-  }
-
-  int hotspot_x = iinfo.xHotspot;
-  int hotspot_y = iinfo.yHotspot;
-
-  // Make sure the bitmaps will be freed.
-  win::ScopedBitmap scoped_mask(iinfo.hbmMask);
-  win::ScopedBitmap scoped_color(iinfo.hbmColor);
-  bool is_color = iinfo.hbmColor != NULL;
-
-  // Get |scoped_mask| dimensions.
-  BITMAP bitmap_info;
-  if (!GetObject(scoped_mask, sizeof(bitmap_info), &bitmap_info)) {
-    LOG_F(LS_ERROR) << "Unable to get bitmap info. Error = "
-                    << GetLastError();
-    return NULL;
-  }
-
-  int width = bitmap_info.bmWidth;
-  int height = bitmap_info.bmHeight;
-  std::unique_ptr<uint32_t[]> mask_data(new uint32_t[width * height]);
-
-  // Get pixel data from |scoped_mask| converting it to 32bpp along the way.
-  // GetDIBits() sets the alpha component of every pixel to 0.
-  BITMAPV5HEADER bmi = {0};
-  bmi.bV5Size = sizeof(bmi);
-  bmi.bV5Width = width;
-  bmi.bV5Height = -height;  // request a top-down bitmap.
-  bmi.bV5Planes = 1;
-  bmi.bV5BitCount = kBytesPerPixel * 8;
-  bmi.bV5Compression = BI_RGB;
-  bmi.bV5AlphaMask = 0xff000000;
-  bmi.bV5CSType = LCS_WINDOWS_COLOR_SPACE;
-  bmi.bV5Intent = LCS_GM_BUSINESS;
-  if (!GetDIBits(dc,
-                 scoped_mask,
-                 0,
-                 height,
-                 mask_data.get(),
-                 reinterpret_cast<BITMAPINFO*>(&bmi),
-                 DIB_RGB_COLORS)) {
-    LOG_F(LS_ERROR) << "Unable to get bitmap bits. Error = "
-                    << GetLastError();
-    return NULL;
-  }
-
-  uint32_t* mask_plane = mask_data.get();
-  std::unique_ptr<DesktopFrame> image(
-      new BasicDesktopFrame(DesktopSize(width, height)));
-  bool has_alpha = false;
-
-  if (is_color) {
-    image.reset(new BasicDesktopFrame(DesktopSize(width, height)));
-    // Get the pixels from the color bitmap.
-    if (!GetDIBits(dc,
-                   scoped_color,
-                   0,
-                   height,
-                   image->data(),
-                   reinterpret_cast<BITMAPINFO*>(&bmi),
-                   DIB_RGB_COLORS)) {
-      LOG_F(LS_ERROR) << "Unable to get bitmap bits. Error = "
-                      << GetLastError();
-      return NULL;
-    }
-
-    // GetDIBits() does not provide any indication whether the bitmap has alpha
-    // channel, so we use HasAlphaChannel() below to find it out.
-    has_alpha = HasAlphaChannel(reinterpret_cast<uint32_t*>(image->data()),
-                                width, width, height);
-  } else {
-    // For non-color cursors, the mask contains both an AND and an XOR mask and
-    // the height includes both. Thus, the width is correct, but we need to
-    // divide by 2 to get the correct mask height.
-    height /= 2;
-
-    image.reset(new BasicDesktopFrame(DesktopSize(width, height)));
-
-    // The XOR mask becomes the color bitmap.
-    memcpy(
-        image->data(), mask_plane + (width * height), image->stride() * height);
-  }
-
-  // Reconstruct transparency from the mask if the color image does not has
-  // alpha channel.
-  if (!has_alpha) {
-    bool add_outline = false;
-    uint32_t* dst = reinterpret_cast<uint32_t*>(image->data());
-    uint32_t* mask = mask_plane;
-    for (int y = 0; y < height; y++) {
-      for (int x = 0; x < width; x++) {
-        // The two bitmaps combine as follows:
-        //  mask  color   Windows Result   Our result    RGB   Alpha
-        //   0     00      Black            Black         00    ff
-        //   0     ff      White            White         ff    ff
-        //   1     00      Screen           Transparent   00    00
-        //   1     ff      Reverse-screen   Black         00    ff
-        //
-        // Since we don't support XOR cursors, we replace the "Reverse Screen"
-        // with black. In this case, we also add an outline around the cursor
-        // so that it is visible against a dark background.
-        if (*mask == kPixelRgbWhite) {
-          if (*dst != 0) {
-            add_outline = true;
-            *dst = kPixelRgbaBlack;
-          } else {
-            *dst = kPixelRgbaTransparent;
-          }
-        } else {
-          *dst = kPixelRgbaBlack ^ *dst;
-        }
-
-        ++dst;
-        ++mask;
-      }
-    }
-    if (add_outline) {
-      AddCursorOutline(
-          width, height, reinterpret_cast<uint32_t*>(image->data()));
-    }
-  }
-
-  // Pre-multiply the resulting pixels since MouseCursor uses premultiplied
-  // images.
-  AlphaMul(reinterpret_cast<uint32_t*>(image->data()), width, height);
-
-  return new MouseCursor(
-      image.release(), DesktopVector(hotspot_x, hotspot_y));
-}
-
-}  // namespace webrtc
diff --git a/modules/desktop_capture/win/cursor.h b/modules/desktop_capture/win/cursor.h
deleted file mode 100644
index d521cc0..0000000
--- a/modules/desktop_capture/win/cursor.h
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- *  Copyright (c) 2013 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_DESKTOP_CAPTURE_WIN_CURSOR_H_
-#define WEBRTC_MODULES_DESKTOP_CAPTURE_WIN_CURSOR_H_
-
-#include <windows.h>
-
-namespace webrtc {
-
-class MouseCursor;
-
-// Converts an HCURSOR into a |MouseCursor| instance.
-MouseCursor* CreateMouseCursorFromHCursor(HDC dc, HCURSOR cursor);
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_DESKTOP_CAPTURE_WIN_CURSOR_H_
diff --git a/modules/desktop_capture/win/cursor_test_data/1_24bpp.cur b/modules/desktop_capture/win/cursor_test_data/1_24bpp.cur
deleted file mode 100644
index 27702b8..0000000
--- a/modules/desktop_capture/win/cursor_test_data/1_24bpp.cur
+++ /dev/null
Binary files differ
diff --git a/modules/desktop_capture/win/cursor_test_data/1_32bpp.cur b/modules/desktop_capture/win/cursor_test_data/1_32bpp.cur
deleted file mode 100644
index 7e0d859..0000000
--- a/modules/desktop_capture/win/cursor_test_data/1_32bpp.cur
+++ /dev/null
Binary files differ
diff --git a/modules/desktop_capture/win/cursor_test_data/1_8bpp.cur b/modules/desktop_capture/win/cursor_test_data/1_8bpp.cur
deleted file mode 100644
index fefb09e..0000000
--- a/modules/desktop_capture/win/cursor_test_data/1_8bpp.cur
+++ /dev/null
Binary files differ
diff --git a/modules/desktop_capture/win/cursor_test_data/2_1bpp.cur b/modules/desktop_capture/win/cursor_test_data/2_1bpp.cur
deleted file mode 100644
index 4f8a094..0000000
--- a/modules/desktop_capture/win/cursor_test_data/2_1bpp.cur
+++ /dev/null
Binary files differ
diff --git a/modules/desktop_capture/win/cursor_test_data/2_32bpp.cur b/modules/desktop_capture/win/cursor_test_data/2_32bpp.cur
deleted file mode 100644
index ac9cdbf..0000000
--- a/modules/desktop_capture/win/cursor_test_data/2_32bpp.cur
+++ /dev/null
Binary files differ
diff --git a/modules/desktop_capture/win/cursor_test_data/3_32bpp.cur b/modules/desktop_capture/win/cursor_test_data/3_32bpp.cur
deleted file mode 100644
index efdbee5..0000000
--- a/modules/desktop_capture/win/cursor_test_data/3_32bpp.cur
+++ /dev/null
Binary files differ
diff --git a/modules/desktop_capture/win/cursor_test_data/3_4bpp.cur b/modules/desktop_capture/win/cursor_test_data/3_4bpp.cur
deleted file mode 100644
index 9678d55..0000000
--- a/modules/desktop_capture/win/cursor_test_data/3_4bpp.cur
+++ /dev/null
Binary files differ
diff --git a/modules/desktop_capture/win/cursor_unittest.cc b/modules/desktop_capture/win/cursor_unittest.cc
deleted file mode 100644
index e37fd98..0000000
--- a/modules/desktop_capture/win/cursor_unittest.cc
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- *  Copyright (c) 2013 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 <memory>
-
-#include "webrtc/modules/desktop_capture/desktop_frame.h"
-#include "webrtc/modules/desktop_capture/desktop_geometry.h"
-#include "webrtc/modules/desktop_capture/mouse_cursor.h"
-#include "webrtc/modules/desktop_capture/win/cursor.h"
-#include "webrtc/modules/desktop_capture/win/cursor_unittest_resources.h"
-#include "webrtc/modules/desktop_capture/win/scoped_gdi_object.h"
-#include "webrtc/test/gmock.h"
-
-namespace webrtc {
-
-namespace {
-
-// Loads |left| from resources, converts it to a |MouseCursor| instance and
-// compares pixels with |right|. Returns true of MouseCursor bits match |right|.
-// |right| must be a 32bpp cursor with alpha channel.
-bool ConvertToMouseShapeAndCompare(unsigned left, unsigned right) {
-  HMODULE instance = GetModuleHandle(NULL);
-
-  // Load |left| from the EXE module's resources.
-  win::ScopedCursor cursor(reinterpret_cast<HCURSOR>(
-      LoadImage(instance, MAKEINTRESOURCE(left), IMAGE_CURSOR, 0, 0, 0)));
-  EXPECT_TRUE(cursor != NULL);
-
-  // Convert |cursor| to |mouse_shape|.
-  HDC dc = GetDC(NULL);
-  std::unique_ptr<MouseCursor> mouse_shape(
-      CreateMouseCursorFromHCursor(dc, cursor));
-  ReleaseDC(NULL, dc);
-
-  EXPECT_TRUE(mouse_shape.get());
-
-  // Load |right|.
-  cursor.Set(reinterpret_cast<HCURSOR>(
-      LoadImage(instance, MAKEINTRESOURCE(right), IMAGE_CURSOR, 0, 0, 0)));
-
-  ICONINFO iinfo;
-  EXPECT_TRUE(GetIconInfo(cursor, &iinfo));
-  EXPECT_TRUE(iinfo.hbmColor);
-
-  // Make sure the bitmaps will be freed.
-  win::ScopedBitmap scoped_mask(iinfo.hbmMask);
-  win::ScopedBitmap scoped_color(iinfo.hbmColor);
-
-  // Get |scoped_color| dimensions.
-  BITMAP bitmap_info;
-  EXPECT_TRUE(GetObject(scoped_color, sizeof(bitmap_info), &bitmap_info));
-
-  int width = bitmap_info.bmWidth;
-  int height = bitmap_info.bmHeight;
-  EXPECT_TRUE(DesktopSize(width, height).equals(mouse_shape->image()->size()));
-
-  // Get the pixels from |scoped_color|.
-  int size = width * height;
-  std::unique_ptr<uint32_t[]> data(new uint32_t[size]);
-  EXPECT_TRUE(GetBitmapBits(scoped_color, size * sizeof(uint32_t), data.get()));
-
-  // Compare the 32bpp image in |mouse_shape| with the one loaded from |right|.
-  return memcmp(data.get(), mouse_shape->image()->data(),
-                size * sizeof(uint32_t)) == 0;
-}
-
-}  // namespace
-
-TEST(MouseCursorTest, MatchCursors) {
-  EXPECT_TRUE(ConvertToMouseShapeAndCompare(IDD_CURSOR1_24BPP,
-                                            IDD_CURSOR1_32BPP));
-
-  EXPECT_TRUE(ConvertToMouseShapeAndCompare(IDD_CURSOR1_8BPP,
-                                            IDD_CURSOR1_32BPP));
-
-  EXPECT_TRUE(ConvertToMouseShapeAndCompare(IDD_CURSOR2_1BPP,
-                                            IDD_CURSOR2_32BPP));
-
-  EXPECT_TRUE(ConvertToMouseShapeAndCompare(IDD_CURSOR3_4BPP,
-                                            IDD_CURSOR3_32BPP));
-}
-
-}  // namespace webrtc
diff --git a/modules/desktop_capture/win/cursor_unittest_resources.h b/modules/desktop_capture/win/cursor_unittest_resources.h
deleted file mode 100644
index 89545c1..0000000
--- a/modules/desktop_capture/win/cursor_unittest_resources.h
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- *  Copyright (c) 2013 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_DESKTOP_CAPTURE_WIN_CURSOR_UNITTEST_RESOURCES_H_
-#define WEBRTC_MODULES_DESKTOP_CAPTURE_WIN_CURSOR_UNITTEST_RESOURCES_H_
-
-#define IDD_CURSOR1_24BPP                101
-#define IDD_CURSOR1_32BPP                102
-#define IDD_CURSOR1_8BPP                 103
-
-#define IDD_CURSOR2_1BPP                 104
-#define IDD_CURSOR2_32BPP                105
-
-#define IDD_CURSOR3_4BPP                 106
-#define IDD_CURSOR3_32BPP                107
-
-#endif  // WEBRTC_MODULES_DESKTOP_CAPTURE_WIN_CURSOR_UNITTEST_RESOURCES_H_
diff --git a/modules/desktop_capture/win/cursor_unittest_resources.rc b/modules/desktop_capture/win/cursor_unittest_resources.rc
deleted file mode 100644
index 4f41489..0000000
--- a/modules/desktop_capture/win/cursor_unittest_resources.rc
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- *  Copyright (c) 2013 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/desktop_capture/win/cursor_unittest_resources.h"
-
-// These cursors are matched with their less than  32bpp counterparts below.
-IDD_CURSOR1_32BPP CURSOR "cursor_test_data/1_32bpp.cur"
-IDD_CURSOR2_32BPP CURSOR "cursor_test_data/2_32bpp.cur"
-IDD_CURSOR3_32BPP CURSOR "cursor_test_data/3_32bpp.cur"
-
-// Matches IDD_CURSOR1_32BPP.
-IDD_CURSOR1_24BPP CURSOR "cursor_test_data/1_24bpp.cur"
-
-// Matches IDD_CURSOR1_32BPP.
-IDD_CURSOR1_8BPP CURSOR "cursor_test_data/1_8bpp.cur"
-
-// Matches IDD_CURSOR2_32BPP.
-IDD_CURSOR2_1BPP CURSOR "cursor_test_data/2_1bpp.cur"
-
-// Matches IDD_CURSOR3_32BPP.
-IDD_CURSOR3_4BPP CURSOR "cursor_test_data/3_4bpp.cur"
diff --git a/modules/desktop_capture/win/d3d_device.cc b/modules/desktop_capture/win/d3d_device.cc
deleted file mode 100644
index 190993c..0000000
--- a/modules/desktop_capture/win/d3d_device.cc
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- *  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/desktop_capture/win/d3d_device.h"
-
-#include <utility>
-
-#include "webrtc/rtc_base/logging.h"
-
-namespace webrtc {
-
-using Microsoft::WRL::ComPtr;
-
-D3dDevice::D3dDevice() = default;
-D3dDevice::D3dDevice(const D3dDevice& other) = default;
-D3dDevice::D3dDevice(D3dDevice&& other) = default;
-D3dDevice::~D3dDevice() = default;
-
-bool D3dDevice::Initialize(const ComPtr<IDXGIAdapter>& adapter) {
-  dxgi_adapter_ = adapter;
-  if (!dxgi_adapter_) {
-    LOG(LS_WARNING) << "An empty IDXGIAdapter instance has been received.";
-    return false;
-  }
-
-  D3D_FEATURE_LEVEL feature_level;
-  // Default feature levels contain D3D 9.1 through D3D 11.0.
-  _com_error error = D3D11CreateDevice(
-      adapter.Get(), D3D_DRIVER_TYPE_UNKNOWN, nullptr,
-      D3D11_CREATE_DEVICE_BGRA_SUPPORT | D3D11_CREATE_DEVICE_SINGLETHREADED,
-      nullptr, 0, D3D11_SDK_VERSION, d3d_device_.GetAddressOf(), &feature_level,
-      context_.GetAddressOf());
-  if (error.Error() != S_OK || !d3d_device_ || !context_) {
-    LOG(LS_WARNING) << "D3D11CreateDeivce returns error "
-                    << error.ErrorMessage() << " with code " << error.Error();
-    return false;
-  }
-
-  if (feature_level < D3D_FEATURE_LEVEL_11_0) {
-    LOG(LS_WARNING) << "D3D11CreateDevice returns an instance without DirectX "
-                       "11 support, level " << feature_level
-                    << ". Following initialization may fail.";
-    // D3D_FEATURE_LEVEL_11_0 is not officially documented on MSDN to be a
-    // requirement of Dxgi duplicator APIs.
-  }
-
-  error = d3d_device_.As(&dxgi_device_);
-  if (error.Error() != S_OK || !dxgi_device_) {
-    LOG(LS_WARNING) << "ID3D11Device is not an implementation of IDXGIDevice, "
-                       "this usually means the system does not support DirectX "
-                       "11. Error "
-                    << error.ErrorMessage() << " with code " << error.Error();
-    return false;
-  }
-
-  return true;
-}
-
-// static
-std::vector<D3dDevice> D3dDevice::EnumDevices() {
-  ComPtr<IDXGIFactory1> factory;
-  _com_error error = CreateDXGIFactory1(__uuidof(IDXGIFactory1),
-      reinterpret_cast<void**>(factory.GetAddressOf()));
-  if (error.Error() != S_OK || !factory) {
-    LOG(LS_WARNING) << "Cannot create IDXGIFactory1.";
-    return std::vector<D3dDevice>();
-  }
-
-  std::vector<D3dDevice> result;
-  for (int i = 0;; i++) {
-    ComPtr<IDXGIAdapter> adapter;
-    error = factory->EnumAdapters(i, adapter.GetAddressOf());
-    if (error.Error() == S_OK) {
-      D3dDevice device;
-      if (device.Initialize(adapter)) {
-        result.push_back(std::move(device));
-      }
-    } else if (error.Error() == DXGI_ERROR_NOT_FOUND) {
-      break;
-    } else {
-      LOG(LS_WARNING) << "IDXGIFactory1::EnumAdapters returns an unexpected "
-                         "error "
-                      << error.ErrorMessage() << " with code " << error.Error();
-    }
-  }
-  return result;
-}
-
-}  // namespace webrtc
diff --git a/modules/desktop_capture/win/d3d_device.h b/modules/desktop_capture/win/d3d_device.h
deleted file mode 100644
index 41efa84..0000000
--- a/modules/desktop_capture/win/d3d_device.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- *  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_DESKTOP_CAPTURE_WIN_D3D_DEVICE_H_
-#define WEBRTC_MODULES_DESKTOP_CAPTURE_WIN_D3D_DEVICE_H_
-
-#include <comdef.h>
-#include <wrl/client.h>
-#include <D3D11.h>
-#include <DXGI.h>
-
-#include <vector>
-
-namespace webrtc {
-
-// A wrapper of ID3D11Device and its corresponding context and IDXGIAdapter.
-// This class represents one video card in the system.
-class D3dDevice {
- public:
-  D3dDevice(const D3dDevice& other);
-  D3dDevice(D3dDevice&& other);
-  ~D3dDevice();
-
-  ID3D11Device* d3d_device() const { return d3d_device_.Get(); }
-
-  ID3D11DeviceContext* context() const { return context_.Get(); }
-
-  IDXGIDevice* dxgi_device() const { return dxgi_device_.Get(); }
-
-  IDXGIAdapter* dxgi_adapter() const { return dxgi_adapter_.Get(); }
-
-  // Returns all D3dDevice instances on the system. Returns an empty vector if
-  // anything wrong.
-  static std::vector<D3dDevice> EnumDevices();
-
- private:
-  // Instances of D3dDevice should only be created by EnumDevices() static
-  // function.
-  D3dDevice();
-
-  // Initializes the D3dDevice from an IDXGIAdapter.
-  bool Initialize(const Microsoft::WRL::ComPtr<IDXGIAdapter>& adapter);
-
-  Microsoft::WRL::ComPtr<ID3D11Device> d3d_device_;
-  Microsoft::WRL::ComPtr<ID3D11DeviceContext> context_;
-  Microsoft::WRL::ComPtr<IDXGIDevice> dxgi_device_;
-  Microsoft::WRL::ComPtr<IDXGIAdapter> dxgi_adapter_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_DESKTOP_CAPTURE_WIN_D3D_DEVICE_H_
diff --git a/modules/desktop_capture/win/desktop.cc b/modules/desktop_capture/win/desktop.cc
deleted file mode 100644
index 4a7c263..0000000
--- a/modules/desktop_capture/win/desktop.cc
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- *  Copyright (c) 2013 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/desktop_capture/win/desktop.h"
-
-#include <vector>
-
-#include "webrtc/rtc_base/logging.h"
-
-namespace webrtc {
-
-Desktop::Desktop(HDESK desktop, bool own) : desktop_(desktop), own_(own) {
-}
-
-Desktop::~Desktop() {
-  if (own_ && desktop_ != NULL) {
-    if (!::CloseDesktop(desktop_)) {
-      LOG(LS_ERROR) << "Failed to close the owned desktop handle: "
-                    << GetLastError();
-    }
-  }
-}
-
-bool Desktop::GetName(std::wstring* desktop_name_out) const {
-  if (desktop_ == NULL)
-    return false;
-
-  DWORD length = 0;
-  int rv = GetUserObjectInformationW(desktop_, UOI_NAME, NULL, 0, &length);
-  if (rv || GetLastError() != ERROR_INSUFFICIENT_BUFFER)
-    abort();
-
-  length /= sizeof(WCHAR);
-  std::vector<WCHAR> buffer(length);
-  if (!GetUserObjectInformationW(desktop_, UOI_NAME, &buffer[0],
-                                 length * sizeof(WCHAR), &length)) {
-    LOG(LS_ERROR) << "Failed to query the desktop name: " << GetLastError();
-    return false;
-  }
-
-  desktop_name_out->assign(&buffer[0], length / sizeof(WCHAR));
-  return true;
-}
-
-bool Desktop::IsSame(const Desktop& other) const {
-  std::wstring name;
-  if (!GetName(&name))
-    return false;
-
-  std::wstring other_name;
-  if (!other.GetName(&other_name))
-    return false;
-
-  return name == other_name;
-}
-
-bool Desktop::SetThreadDesktop() const {
-  if (!::SetThreadDesktop(desktop_)) {
-    LOG(LS_ERROR) << "Failed to assign the desktop to the current thread: "
-                  << GetLastError();
-    return false;
-  }
-
-  return true;
-}
-
-Desktop* Desktop::GetDesktop(const WCHAR* desktop_name) {
-  ACCESS_MASK desired_access =
-      DESKTOP_CREATEMENU | DESKTOP_CREATEWINDOW | DESKTOP_ENUMERATE |
-      DESKTOP_HOOKCONTROL | DESKTOP_WRITEOBJECTS | DESKTOP_READOBJECTS |
-      DESKTOP_SWITCHDESKTOP | GENERIC_WRITE;
-  HDESK desktop = OpenDesktop(desktop_name, 0, FALSE, desired_access);
-  if (desktop == NULL) {
-    LOG(LS_ERROR) << "Failed to open the desktop '" << desktop_name << "': "
-                  << GetLastError();
-    return NULL;
-  }
-
-  return new Desktop(desktop, true);
-}
-
-Desktop* Desktop::GetInputDesktop() {
-  HDESK desktop = OpenInputDesktop(
-      0, FALSE, GENERIC_READ | GENERIC_WRITE | GENERIC_EXECUTE);
-  if (desktop == NULL)
-    return NULL;
-
-  return new Desktop(desktop, true);
-}
-
-Desktop* Desktop::GetThreadDesktop() {
-  HDESK desktop = ::GetThreadDesktop(GetCurrentThreadId());
-  if (desktop == NULL) {
-    LOG(LS_ERROR) << "Failed to retrieve the handle of the desktop assigned to "
-                     "the current thread: "
-                  << GetLastError();
-    return NULL;
-  }
-
-  return new Desktop(desktop, false);
-}
-
-}  // namespace webrtc
diff --git a/modules/desktop_capture/win/desktop.h b/modules/desktop_capture/win/desktop.h
deleted file mode 100644
index 6737316..0000000
--- a/modules/desktop_capture/win/desktop.h
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- *  Copyright (c) 2013 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_DESKTOP_CAPTURE_WIN_DESKTOP_H_
-#define WEBRTC_MODULES_DESKTOP_CAPTURE_WIN_DESKTOP_H_
-
-#include <windows.h>
-#include <string>
-
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace webrtc {
-
-class Desktop {
- public:
-  ~Desktop();
-
-  // Returns the name of the desktop represented by the object. Return false if
-  // quering the name failed for any reason.
-  bool GetName(std::wstring* desktop_name_out) const;
-
-  // Returns true if |other| has the same name as this desktop. Returns false
-  // in any other case including failing Win32 APIs and uninitialized desktop
-  // handles.
-  bool IsSame(const Desktop& other) const;
-
-  // Assigns the desktop to the current thread. Returns false is the operation
-  // failed for any reason.
-  bool SetThreadDesktop() const;
-
-  // Returns the desktop by its name or NULL if an error occurs.
-  static Desktop* GetDesktop(const wchar_t* desktop_name);
-
-  // Returns the desktop currently receiving user input or NULL if an error
-  // occurs.
-  static Desktop* GetInputDesktop();
-
-  // Returns the desktop currently assigned to the calling thread or NULL if
-  // an error occurs.
-  static Desktop* GetThreadDesktop();
-
- private:
-  Desktop(HDESK desktop, bool own);
-
-  // The desktop handle.
-  HDESK desktop_;
-
-  // True if |desktop_| must be closed on teardown.
-  bool own_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(Desktop);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_DESKTOP_CAPTURE_WIN_DESKTOP_H_
diff --git a/modules/desktop_capture/win/display_configuration_monitor.cc b/modules/desktop_capture/win/display_configuration_monitor.cc
deleted file mode 100644
index 5685d95..0000000
--- a/modules/desktop_capture/win/display_configuration_monitor.cc
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- *  Copyright (c) 2017 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/desktop_capture/win/display_configuration_monitor.h"
-
-#include "webrtc/modules/desktop_capture/win/screen_capture_utils.h"
-
-namespace webrtc {
-
-bool DisplayConfigurationMonitor::IsChanged() {
-  DesktopRect rect = GetFullscreenRect();
-  if (!initialized_) {
-    initialized_ = true;
-    rect_ = rect;
-    return false;
-  }
-
-  if (rect.equals(rect_)) {
-    return false;
-  }
-
-  rect_ = rect;
-  return true;
-}
-
-void DisplayConfigurationMonitor::Reset() {
-  initialized_ = false;
-}
-
-}  // namespace webrtc
diff --git a/modules/desktop_capture/win/display_configuration_monitor.h b/modules/desktop_capture/win/display_configuration_monitor.h
deleted file mode 100644
index 0937c33..0000000
--- a/modules/desktop_capture/win/display_configuration_monitor.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- *  Copyright (c) 2017 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_DESKTOP_CAPTURE_WIN_DISPLAY_CONFIGURATION_MONITOR_H_
-#define WEBRTC_MODULES_DESKTOP_CAPTURE_WIN_DISPLAY_CONFIGURATION_MONITOR_H_
-
-#include "webrtc/modules/desktop_capture/desktop_geometry.h"
-
-namespace webrtc {
-
-// A passive monitor to detect the change of display configuration on a Windows
-// system.
-// TODO(zijiehe): Also check for pixel format changes.
-class DisplayConfigurationMonitor {
- public:
-  // Checks whether the change of display configuration has happened after last
-  // IsChanged() call. This function won't return true for the first time after
-  // constructor or Reset() call.
-  bool IsChanged();
-
-  // Resets to the initial state.
-  void Reset();
-
- private:
-  DesktopRect rect_;
-  bool initialized_ = false;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_DESKTOP_CAPTURE_WIN_DISPLAY_CONFIGURATION_MONITOR_H_
diff --git a/modules/desktop_capture/win/dxgi_adapter_duplicator.cc b/modules/desktop_capture/win/dxgi_adapter_duplicator.cc
deleted file mode 100644
index 4174dc9..0000000
--- a/modules/desktop_capture/win/dxgi_adapter_duplicator.cc
+++ /dev/null
@@ -1,178 +0,0 @@
-/*
- *  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/desktop_capture/win/dxgi_adapter_duplicator.h"
-
-#include <comdef.h>
-#include <DXGI.h>
-
-#include <algorithm>
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-
-namespace webrtc {
-
-using Microsoft::WRL::ComPtr;
-
-namespace {
-
-bool IsValidRect(const RECT& rect) {
-  return rect.right > rect.left && rect.bottom > rect.top;
-}
-
-}  // namespace
-
-DxgiAdapterDuplicator::DxgiAdapterDuplicator(const D3dDevice& device)
-    : device_(device) {}
-DxgiAdapterDuplicator::DxgiAdapterDuplicator(DxgiAdapterDuplicator&&) = default;
-DxgiAdapterDuplicator::~DxgiAdapterDuplicator() = default;
-
-bool DxgiAdapterDuplicator::Initialize() {
-  if (DoInitialize()) {
-    return true;
-  }
-  duplicators_.clear();
-  return false;
-}
-
-bool DxgiAdapterDuplicator::DoInitialize() {
-  for (int i = 0;; i++) {
-    ComPtr<IDXGIOutput> output;
-    _com_error error =
-        device_.dxgi_adapter()->EnumOutputs(i, output.GetAddressOf());
-    if (error.Error() == DXGI_ERROR_NOT_FOUND) {
-      break;
-    }
-
-    if (error.Error() == DXGI_ERROR_NOT_CURRENTLY_AVAILABLE) {
-      LOG(LS_WARNING) << "IDXGIAdapter::EnumOutputs returns "
-                         "NOT_CURRENTLY_AVAILABLE. This may happen when "
-                         "running in session 0.";
-      break;
-    }
-
-    if (error.Error() != S_OK || !output) {
-      LOG(LS_WARNING) << "IDXGIAdapter::EnumOutputs returns an unexpected "
-                         "result "
-                      << error.ErrorMessage() << " with error code"
-                      << error.Error();
-      continue;
-    }
-
-    DXGI_OUTPUT_DESC desc;
-    error = output->GetDesc(&desc);
-    if (error.Error() == S_OK) {
-      if (desc.AttachedToDesktop && IsValidRect(desc.DesktopCoordinates)) {
-        ComPtr<IDXGIOutput1> output1;
-        error = output.As(&output1);
-        if (error.Error() != S_OK || !output1) {
-          LOG(LS_WARNING) << "Failed to convert IDXGIOutput to IDXGIOutput1, "
-                             "this usually means the system does not support "
-                             "DirectX 11";
-          continue;
-        }
-        DxgiOutputDuplicator duplicator(device_, output1, desc);
-        if (!duplicator.Initialize()) {
-          LOG(LS_WARNING) << "Failed to initialize DxgiOutputDuplicator on "
-                             "output "
-                          << i;
-          continue;
-        }
-
-        duplicators_.push_back(std::move(duplicator));
-        desktop_rect_.UnionWith(duplicators_.back().desktop_rect());
-      }
-    } else {
-      LOG(LS_WARNING) << "Failed to get output description of device " << i
-                      << ", ignore.";
-    }
-  }
-
-  if (duplicators_.empty()) {
-    LOG(LS_WARNING) << "Cannot initialize any DxgiOutputDuplicator instance.";
-  }
-
-  return !duplicators_.empty();
-}
-
-void DxgiAdapterDuplicator::Setup(Context* context) {
-  RTC_DCHECK(context->contexts.empty());
-  context->contexts.resize(duplicators_.size());
-  for (size_t i = 0; i < duplicators_.size(); i++) {
-    duplicators_[i].Setup(&context->contexts[i]);
-  }
-}
-
-void DxgiAdapterDuplicator::Unregister(const Context* const context) {
-  RTC_DCHECK_EQ(context->contexts.size(), duplicators_.size());
-  for (size_t i = 0; i < duplicators_.size(); i++) {
-    duplicators_[i].Unregister(&context->contexts[i]);
-  }
-}
-
-bool DxgiAdapterDuplicator::Duplicate(Context* context,
-                                      SharedDesktopFrame* target) {
-  RTC_DCHECK_EQ(context->contexts.size(), duplicators_.size());
-  for (size_t i = 0; i < duplicators_.size(); i++) {
-    if (!duplicators_[i].Duplicate(&context->contexts[i],
-                                   duplicators_[i].desktop_rect().top_left(),
-                                   target)) {
-      return false;
-    }
-  }
-  return true;
-}
-
-bool DxgiAdapterDuplicator::DuplicateMonitor(Context* context,
-                                             int monitor_id,
-                                             SharedDesktopFrame* target) {
-  RTC_DCHECK_GE(monitor_id, 0);
-  RTC_DCHECK_LT(monitor_id, duplicators_.size());
-  RTC_DCHECK_EQ(context->contexts.size(), duplicators_.size());
-  return duplicators_[monitor_id].Duplicate(&context->contexts[monitor_id],
-                                            DesktopVector(), target);
-}
-
-DesktopRect DxgiAdapterDuplicator::ScreenRect(int id) const {
-  RTC_DCHECK_GE(id, 0);
-  RTC_DCHECK_LT(id, duplicators_.size());
-  return duplicators_[id].desktop_rect();
-}
-
-const std::string& DxgiAdapterDuplicator::GetDeviceName(int id) const {
-  RTC_DCHECK_GE(id, 0);
-  RTC_DCHECK_LT(id, duplicators_.size());
-  return duplicators_[id].device_name();
-}
-
-int DxgiAdapterDuplicator::screen_count() const {
-  return static_cast<int>(duplicators_.size());
-}
-
-int64_t DxgiAdapterDuplicator::GetNumFramesCaptured() const {
-  int64_t min = INT64_MAX;
-  for (const auto& duplicator : duplicators_) {
-    min = std::min(min, duplicator.num_frames_captured());
-  }
-
-  return min;
-}
-
-void DxgiAdapterDuplicator::TranslateRect(const DesktopVector& position) {
-  desktop_rect_.Translate(position);
-  RTC_DCHECK_GE(desktop_rect_.left(), 0);
-  RTC_DCHECK_GE(desktop_rect_.top(), 0);
-  for (auto& duplicator : duplicators_) {
-    duplicator.TranslateRect(position);
-  }
-}
-
-}  // namespace webrtc
diff --git a/modules/desktop_capture/win/dxgi_adapter_duplicator.h b/modules/desktop_capture/win/dxgi_adapter_duplicator.h
deleted file mode 100644
index 0fa51ac..0000000
--- a/modules/desktop_capture/win/dxgi_adapter_duplicator.h
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- *  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_DESKTOP_CAPTURE_WIN_DXGI_ADAPTER_DUPLICATOR_H_
-#define WEBRTC_MODULES_DESKTOP_CAPTURE_WIN_DXGI_ADAPTER_DUPLICATOR_H_
-
-#include <wrl/client.h>
-
-#include <vector>
-
-#include "webrtc/modules/desktop_capture/desktop_geometry.h"
-#include "webrtc/modules/desktop_capture/shared_desktop_frame.h"
-#include "webrtc/modules/desktop_capture/win/d3d_device.h"
-#include "webrtc/modules/desktop_capture/win/dxgi_context.h"
-#include "webrtc/modules/desktop_capture/win/dxgi_output_duplicator.h"
-
-namespace webrtc {
-
-// A container of DxgiOutputDuplicators to duplicate monitors attached to a
-// single video card.
-class DxgiAdapterDuplicator {
- public:
-  using Context = DxgiAdapterContext;
-
-  // Creates an instance of DxgiAdapterDuplicator from a D3dDevice. Only
-  // DxgiDuplicatorController can create an instance.
-  explicit DxgiAdapterDuplicator(const D3dDevice& device);
-
-  // Move constructor, to make it possible to store instances of
-  // DxgiAdapterDuplicator in std::vector<>.
-  DxgiAdapterDuplicator(DxgiAdapterDuplicator&& other);
-
-  ~DxgiAdapterDuplicator();
-
-  // Initializes the DxgiAdapterDuplicator from a D3dDevice.
-  bool Initialize();
-
-  // Sequentially calls Duplicate function of all the DxgiOutputDuplicator
-  // instances owned by this instance, and writes into |target|.
-  bool Duplicate(Context* context, SharedDesktopFrame* target);
-
-  // Captures one monitor and writes into |target|. |monitor_id| should be
-  // between [0, screen_count()).
-  bool DuplicateMonitor(Context* context,
-                        int monitor_id,
-                        SharedDesktopFrame* target);
-
-  // Returns desktop rect covered by this DxgiAdapterDuplicator.
-  DesktopRect desktop_rect() const { return desktop_rect_; }
-
-  // Returns the size of one screen owned by this DxgiAdapterDuplicator. |id|
-  // should be between [0, screen_count()).
-  DesktopRect ScreenRect(int id) const;
-
-  // Returns the device name of one screen owned by this DxgiAdapterDuplicator
-  // in utf8 encoding. |id| should be between [0, screen_count()).
-  const std::string& GetDeviceName(int id) const;
-
-  // Returns the count of screens owned by this DxgiAdapterDuplicator. These
-  // screens can be retrieved by an interger in the range of
-  // [0, screen_count()).
-  int screen_count() const;
-
-  void Setup(Context* context);
-
-  void Unregister(const Context* const context);
-
-  // The minimum num_frames_captured() returned by |duplicators_|.
-  int64_t GetNumFramesCaptured() const;
-
-  // Moves |desktop_rect_| and all underlying |duplicators_|. See
-  // DxgiDuplicatorController::TranslateRect().
-  void TranslateRect(const DesktopVector& position);
-
- private:
-  bool DoInitialize();
-
-  const D3dDevice device_;
-  std::vector<DxgiOutputDuplicator> duplicators_;
-  DesktopRect desktop_rect_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_DESKTOP_CAPTURE_WIN_DXGI_ADAPTER_DUPLICATOR_H_
diff --git a/modules/desktop_capture/win/dxgi_context.cc b/modules/desktop_capture/win/dxgi_context.cc
deleted file mode 100644
index 18ca990..0000000
--- a/modules/desktop_capture/win/dxgi_context.cc
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- *  Copyright (c) 2017 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/desktop_capture/win/dxgi_context.h"
-#include "webrtc/modules/desktop_capture/win/dxgi_duplicator_controller.h"
-
-namespace webrtc {
-
-DxgiAdapterContext::DxgiAdapterContext() = default;
-DxgiAdapterContext::DxgiAdapterContext(
-    const DxgiAdapterContext& context) = default;
-DxgiAdapterContext::~DxgiAdapterContext() = default;
-
-DxgiFrameContext::DxgiFrameContext() = default;
-
-DxgiFrameContext::~DxgiFrameContext() {
-  Reset();
-}
-
-void DxgiFrameContext::Reset() {
-  DxgiDuplicatorController::Instance()->Unregister(this);
-  controller_id = 0;
-}
-
-}  // namespace webrtc
diff --git a/modules/desktop_capture/win/dxgi_context.h b/modules/desktop_capture/win/dxgi_context.h
deleted file mode 100644
index 323ea7c..0000000
--- a/modules/desktop_capture/win/dxgi_context.h
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- *  Copyright (c) 2017 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_DESKTOP_CAPTURE_WIN_DXGI_CONTEXT_H_
-#define WEBRTC_MODULES_DESKTOP_CAPTURE_WIN_DXGI_CONTEXT_H_
-
-#include <vector>
-#include "webrtc/modules/desktop_capture/desktop_region.h"
-
-namespace webrtc {
-
-// A DxgiOutputContext stores the status of a single DxgiFrame of
-// DxgiOutputDuplicator.
-struct DxgiOutputContext final {
-  // The updated region DxgiOutputDuplicator::DetectUpdatedRegion() output
-  // during last Duplicate() function call. It's always relative to the (0, 0).
-  DesktopRegion updated_region;
-};
-
-// A DxgiAdapterContext stores the status of a single DxgiFrame of
-// DxgiAdapterDuplicator.
-struct DxgiAdapterContext final {
-  DxgiAdapterContext();
-  DxgiAdapterContext(const DxgiAdapterContext& other);
-  ~DxgiAdapterContext();
-
-  // Child DxgiOutputContext belongs to this AdapterContext.
-  std::vector<DxgiOutputContext> contexts;
-};
-
-// A DxgiFrameContext stores the status of a single DxgiFrame of
-// DxgiDuplicatorController.
-struct DxgiFrameContext final {
- public:
-  DxgiFrameContext();
-  // Unregister this Context instance from DxgiDuplicatorController during
-  // destructing.
-  ~DxgiFrameContext();
-
-  // Reset current Context, so it will be reinitialized next time.
-  void Reset();
-
-  // A Context will have an exactly same |controller_id| as
-  // DxgiDuplicatorController, to ensure it has been correctly setted up after
-  // each DxgiDuplicatorController::Initialize().
-  int controller_id = 0;
-
-  // Child DxgiAdapterContext belongs to this DxgiFrameContext.
-  std::vector<DxgiAdapterContext> contexts;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_DESKTOP_CAPTURE_WIN_DXGI_CONTEXT_H_
diff --git a/modules/desktop_capture/win/dxgi_duplicator_controller.cc b/modules/desktop_capture/win/dxgi_duplicator_controller.cc
deleted file mode 100644
index 38bf437..0000000
--- a/modules/desktop_capture/win/dxgi_duplicator_controller.cc
+++ /dev/null
@@ -1,457 +0,0 @@
-/*
- *  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/desktop_capture/win/dxgi_duplicator_controller.h"
-
-#include <windows.h>
-
-#include <algorithm>
-#include <string>
-
-#include "webrtc/modules/desktop_capture/desktop_capture_types.h"
-#include "webrtc/modules/desktop_capture/win/dxgi_frame.h"
-#include "webrtc/modules/desktop_capture/win/screen_capture_utils.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/timeutils.h"
-#include "webrtc/system_wrappers/include/sleep.h"
-
-namespace webrtc {
-
-// static
-rtc::scoped_refptr<DxgiDuplicatorController>
-DxgiDuplicatorController::Instance() {
-  // The static instance won't be deleted to ensure it can be used by other
-  // threads even during program exiting.
-  static DxgiDuplicatorController* instance = new DxgiDuplicatorController();
-  return rtc::scoped_refptr<DxgiDuplicatorController>(instance);
-}
-
-// static
-bool DxgiDuplicatorController::IsCurrentSessionSupported() {
-  DWORD session_id = 0;
-  if (!::ProcessIdToSessionId(::GetCurrentProcessId(), &session_id)) {
-    LOG(LS_WARNING) << "Failed to retrieve current session Id, current binary "
-                       "may not have required priviledge.";
-    return false;
-  }
-  return session_id != 0;
-}
-
-DxgiDuplicatorController::DxgiDuplicatorController()
-    : refcount_(0) {}
-
-void DxgiDuplicatorController::AddRef() {
-  int refcount = (++refcount_);
-  RTC_DCHECK(refcount > 0);
-}
-
-void DxgiDuplicatorController::Release() {
-  int refcount = (--refcount_);
-  RTC_DCHECK(refcount >= 0);
-  if (refcount == 0) {
-    LOG(LS_WARNING) << "Count of references reaches zero, "
-                       "DxgiDuplicatorController will be unloaded.";
-    Unload();
-  }
-}
-
-bool DxgiDuplicatorController::IsSupported() {
-  rtc::CritScope lock(&lock_);
-  return Initialize();
-}
-
-bool DxgiDuplicatorController::RetrieveD3dInfo(D3dInfo* info) {
-  bool result = false;
-  {
-    rtc::CritScope lock(&lock_);
-    result = Initialize();
-    *info = d3d_info_;
-  }
-  if (!result) {
-    LOG(LS_WARNING) << "Failed to initialize DXGI components, the D3dInfo "
-                       "retrieved may not accurate or out of date.";
-  }
-  return result;
-}
-
-DxgiDuplicatorController::Result
-DxgiDuplicatorController::Duplicate(DxgiFrame* frame) {
-  return DoDuplicate(frame, -1);
-}
-
-DxgiDuplicatorController::Result
-DxgiDuplicatorController::DuplicateMonitor(DxgiFrame* frame, int monitor_id) {
-  RTC_DCHECK_GE(monitor_id, 0);
-  return DoDuplicate(frame, monitor_id);
-}
-
-DesktopVector DxgiDuplicatorController::dpi() {
-  rtc::CritScope lock(&lock_);
-  if (Initialize()) {
-    return dpi_;
-  }
-  return DesktopVector();
-}
-
-int DxgiDuplicatorController::ScreenCount() {
-  rtc::CritScope lock(&lock_);
-  if (Initialize()) {
-    return ScreenCountUnlocked();
-  }
-  return 0;
-}
-
-bool DxgiDuplicatorController::GetDeviceNames(
-    std::vector<std::string>* output) {
-  rtc::CritScope lock(&lock_);
-  if (Initialize()) {
-    GetDeviceNamesUnlocked(output);
-    return true;
-  }
-  return false;
-}
-
-DxgiDuplicatorController::Result
-DxgiDuplicatorController::DoDuplicate(DxgiFrame* frame, int monitor_id) {
-  RTC_DCHECK(frame);
-  rtc::CritScope lock(&lock_);
-
-  // The dxgi components and APIs do not update the screen resolution without
-  // a reinitialization. So we use the GetDC() function to retrieve the screen
-  // resolution to decide whether dxgi components need to be reinitialized.
-  // If the screen resolution changed, it's very likely the next Duplicate()
-  // function call will fail because of a missing monitor or the frame size is
-  // not enough to store the output. So we reinitialize dxgi components in-place
-  // to avoid a capture failure.
-  // But there is no guarantee GetDC() function returns the same resolution as
-  // dxgi APIs, we still rely on dxgi components to return the output frame
-  // size.
-  // TODO(zijiehe): Confirm whether IDXGIOutput::GetDesc() and
-  // IDXGIOutputDuplication::GetDesc() can detect the resolution change without
-  // reinitialization.
-  if (display_configuration_monitor_.IsChanged()) {
-    Deinitialize();
-  }
-
-  if (!Initialize()) {
-    if (succeeded_duplications_ == 0 && !IsCurrentSessionSupported()) {
-      LOG(LS_WARNING) << "Current binary is running in session 0. DXGI "
-                         "components cannot be initialized.";
-      return Result::UNSUPPORTED_SESSION;
-    }
-
-    // Cannot initialize COM components now, display mode may be changing.
-    return Result::INITIALIZATION_FAILED;
-  }
-
-  if (!frame->Prepare(SelectedDesktopSize(monitor_id), monitor_id)) {
-    return Result::FRAME_PREPARE_FAILED;
-  }
-
-  frame->frame()->mutable_updated_region()->Clear();
-
-  if (DoDuplicateUnlocked(frame->context(), monitor_id, frame->frame())) {
-    succeeded_duplications_++;
-    return Result::SUCCEEDED;
-  }
-  if (monitor_id >= ScreenCountUnlocked()) {
-    // It's a user error to provide a |monitor_id| larger than screen count. We
-    // do not need to deinitialize.
-    return Result::INVALID_MONITOR_ID;
-  }
-
-  // If the |monitor_id| is valid, but DoDuplicateUnlocked() failed, something
-  // must be wrong from capturer APIs. We should Deinitialize().
-  Deinitialize();
-  return Result::DUPLICATION_FAILED;
-}
-
-void DxgiDuplicatorController::Unload() {
-  rtc::CritScope lock(&lock_);
-  Deinitialize();
-}
-
-void DxgiDuplicatorController::Unregister(const Context* const context) {
-  rtc::CritScope lock(&lock_);
-  if (ContextExpired(context)) {
-    // The Context has not been setup after a recent initialization, so it
-    // should not been registered in duplicators.
-    return;
-  }
-  for (size_t i = 0; i < duplicators_.size(); i++) {
-    duplicators_[i].Unregister(&context->contexts[i]);
-  }
-}
-
-bool DxgiDuplicatorController::Initialize() {
-  if (!duplicators_.empty()) {
-    return true;
-  }
-
-  if (DoInitialize()) {
-    return true;
-  }
-  Deinitialize();
-  return false;
-}
-
-bool DxgiDuplicatorController::DoInitialize() {
-  RTC_DCHECK(desktop_rect_.is_empty());
-  RTC_DCHECK(duplicators_.empty());
-
-  d3d_info_.min_feature_level = static_cast<D3D_FEATURE_LEVEL>(0);
-  d3d_info_.max_feature_level = static_cast<D3D_FEATURE_LEVEL>(0);
-
-  std::vector<D3dDevice> devices = D3dDevice::EnumDevices();
-  if (devices.empty()) {
-    LOG(LS_WARNING) << "No D3dDevice found.";
-    return false;
-  }
-
-  for (size_t i = 0; i < devices.size(); i++) {
-    D3D_FEATURE_LEVEL feature_level =
-        devices[i].d3d_device()->GetFeatureLevel();
-    if (d3d_info_.max_feature_level == 0 ||
-        feature_level > d3d_info_.max_feature_level) {
-      d3d_info_.max_feature_level = feature_level;
-    }
-    if (d3d_info_.min_feature_level == 0 ||
-        feature_level < d3d_info_.min_feature_level) {
-      d3d_info_.min_feature_level = feature_level;
-    }
-
-    DxgiAdapterDuplicator duplicator(devices[i]);
-    // There may be several video cards on the system, some of them may not
-    // support IDXGOutputDuplication. But they should not impact others from
-    // taking effect, so we should continually try other adapters. This usually
-    // happens when a non-official virtual adapter is installed on the system.
-    if (!duplicator.Initialize()) {
-      LOG(LS_WARNING) << "Failed to initialize DxgiAdapterDuplicator on "
-                         "adapter "
-                      << i;
-      continue;
-    }
-    RTC_DCHECK(!duplicator.desktop_rect().is_empty());
-    duplicators_.push_back(std::move(duplicator));
-
-    desktop_rect_.UnionWith(duplicators_.back().desktop_rect());
-  }
-  TranslateRect();
-
-  HDC hdc = GetDC(nullptr);
-  // Use old DPI value if failed.
-  if (hdc) {
-    dpi_.set(GetDeviceCaps(hdc, LOGPIXELSX), GetDeviceCaps(hdc, LOGPIXELSY));
-    ReleaseDC(nullptr, hdc);
-  }
-
-  identity_++;
-
-  if (duplicators_.empty()) {
-    LOG(LS_WARNING) << "Cannot initialize any DxgiAdapterDuplicator instance.";
-  }
-
-  return !duplicators_.empty();
-}
-
-void DxgiDuplicatorController::Deinitialize() {
-  desktop_rect_ = DesktopRect();
-  duplicators_.clear();
-  display_configuration_monitor_.Reset();
-}
-
-bool DxgiDuplicatorController::ContextExpired(
-    const Context* const context) const {
-  RTC_DCHECK(context);
-  return context->controller_id != identity_ ||
-         context->contexts.size() != duplicators_.size();
-}
-
-void DxgiDuplicatorController::Setup(Context* context) {
-  if (ContextExpired(context)) {
-    RTC_DCHECK(context);
-    context->contexts.clear();
-    context->contexts.resize(duplicators_.size());
-    for (size_t i = 0; i < duplicators_.size(); i++) {
-      duplicators_[i].Setup(&context->contexts[i]);
-    }
-    context->controller_id = identity_;
-  }
-}
-
-bool DxgiDuplicatorController::DoDuplicateUnlocked(Context* context,
-                                                   int monitor_id,
-                                                   SharedDesktopFrame* target) {
-  Setup(context);
-
-  if (!EnsureFrameCaptured(context, target)) {
-    return false;
-  }
-
-  bool result = false;
-  if (monitor_id < 0) {
-    // Capture entire screen.
-    result = DoDuplicateAll(context, target);
-  } else {
-    result = DoDuplicateOne(context, monitor_id, target);
-  }
-
-  if (result) {
-    target->set_dpi(dpi());
-    return true;
-  }
-
-  return false;
-}
-
-bool DxgiDuplicatorController::DoDuplicateAll(Context* context,
-                                              SharedDesktopFrame* target) {
-  for (size_t i = 0; i < duplicators_.size(); i++) {
-    if (!duplicators_[i].Duplicate(&context->contexts[i], target)) {
-      return false;
-    }
-  }
-  return true;
-}
-
-bool DxgiDuplicatorController::DoDuplicateOne(Context* context,
-                                              int monitor_id,
-                                              SharedDesktopFrame* target) {
-  RTC_DCHECK(monitor_id >= 0);
-  for (size_t i = 0; i < duplicators_.size() && i < context->contexts.size();
-       i++) {
-    if (monitor_id >= duplicators_[i].screen_count()) {
-      monitor_id -= duplicators_[i].screen_count();
-    } else {
-      if (duplicators_[i].DuplicateMonitor(&context->contexts[i], monitor_id,
-                                           target)) {
-        target->set_top_left(duplicators_[i].ScreenRect(monitor_id).top_left());
-        return true;
-      }
-      return false;
-    }
-  }
-  return false;
-}
-
-int64_t DxgiDuplicatorController::GetNumFramesCaptured() const {
-  int64_t min = INT64_MAX;
-  for (const auto& duplicator : duplicators_) {
-    min = std::min(min, duplicator.GetNumFramesCaptured());
-  }
-
-  return min;
-}
-
-DesktopSize DxgiDuplicatorController::desktop_size() const {
-  return desktop_rect_.size();
-}
-
-DesktopRect DxgiDuplicatorController::ScreenRect(int id) const {
-  RTC_DCHECK(id >= 0);
-  for (size_t i = 0; i < duplicators_.size(); i++) {
-    if (id >= duplicators_[i].screen_count()) {
-      id -= duplicators_[i].screen_count();
-    } else {
-      return duplicators_[i].ScreenRect(id);
-    }
-  }
-  return DesktopRect();
-}
-
-int DxgiDuplicatorController::ScreenCountUnlocked() const {
-  int result = 0;
-  for (auto& duplicator : duplicators_) {
-    result += duplicator.screen_count();
-  }
-  return result;
-}
-
-void DxgiDuplicatorController::GetDeviceNamesUnlocked(
-    std::vector<std::string>* output) const {
-  RTC_DCHECK(output);
-  for (auto& duplicator : duplicators_) {
-    for (int i = 0; i < duplicator.screen_count(); i++) {
-      output->push_back(duplicator.GetDeviceName(i));
-    }
-  }
-}
-
-DesktopSize DxgiDuplicatorController::SelectedDesktopSize(
-    int monitor_id) const {
-  if (monitor_id < 0) {
-    return desktop_size();
-  }
-
-  return ScreenRect(monitor_id).size();
-}
-
-bool DxgiDuplicatorController::EnsureFrameCaptured(Context* context,
-                                                   SharedDesktopFrame* target) {
-  // On a modern system, the FPS / monitor refresh rate is usually larger than
-  // or equal to 60. So 17 milliseconds is enough to capture at least one frame.
-  const int64_t ms_per_frame = 17;
-  // Skips the first frame to ensure a full frame refresh has happened before
-  // this function returns.
-  const int64_t frames_to_skip = 1;
-  // The total time out milliseconds for this function. If we cannot get enough
-  // frames during this time interval, this function returns false, and cause
-  // the DXGI components to be reinitialized. This usually should not happen
-  // unless the system is switching display mode when this function is being
-  // called. 500 milliseconds should be enough for ~30 frames.
-  const int64_t timeout_ms = 500;
-  if (GetNumFramesCaptured() >= frames_to_skip) {
-    return true;
-  }
-
-  std::unique_ptr<SharedDesktopFrame> fallback_frame;
-  SharedDesktopFrame* shared_frame = nullptr;
-  if (target->size().width() >= desktop_size().width() &&
-      target->size().height() >= desktop_size().height()) {
-    // |target| is large enough to cover entire screen, we do not need to use
-    // |fallback_frame|.
-    shared_frame = target;
-  } else {
-    fallback_frame = SharedDesktopFrame::Wrap(std::unique_ptr<DesktopFrame>(
-        new BasicDesktopFrame(desktop_size())));
-    shared_frame = fallback_frame.get();
-  }
-
-  const int64_t start_ms = rtc::TimeMillis();
-  int64_t last_frame_start_ms = 0;
-  while (GetNumFramesCaptured() < frames_to_skip) {
-    if (GetNumFramesCaptured() > 0) {
-      // Sleep |ms_per_frame| before capturing next frame to ensure the screen
-      // has been updated by the video adapter.
-      webrtc::SleepMs(
-          ms_per_frame - (rtc::TimeMillis() - last_frame_start_ms));
-    }
-    last_frame_start_ms = rtc::TimeMillis();
-    if (!DoDuplicateAll(context, shared_frame)) {
-      return false;
-    }
-    if (rtc::TimeMillis() - start_ms > timeout_ms) {
-      return false;
-    }
-  }
-  return true;
-}
-
-void DxgiDuplicatorController::TranslateRect() {
-  const DesktopVector position =
-      DesktopVector().subtract(desktop_rect_.top_left());
-  desktop_rect_.Translate(position);
-  for (auto& duplicator : duplicators_) {
-    duplicator.TranslateRect(position);
-  }
-}
-
-}  // namespace webrtc
diff --git a/modules/desktop_capture/win/dxgi_duplicator_controller.h b/modules/desktop_capture/win/dxgi_duplicator_controller.h
deleted file mode 100644
index ddf02a8..0000000
--- a/modules/desktop_capture/win/dxgi_duplicator_controller.h
+++ /dev/null
@@ -1,234 +0,0 @@
-/*
- *  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_DESKTOP_CAPTURE_WIN_DXGI_DUPLICATOR_CONTROLLER_H_
-#define WEBRTC_MODULES_DESKTOP_CAPTURE_WIN_DXGI_DUPLICATOR_CONTROLLER_H_
-
-#include <D3DCommon.h>
-
-#include <atomic>
-#include <string>
-#include <vector>
-
-#include "webrtc/modules/desktop_capture/desktop_geometry.h"
-#include "webrtc/modules/desktop_capture/shared_desktop_frame.h"
-#include "webrtc/modules/desktop_capture/win/d3d_device.h"
-#include "webrtc/modules/desktop_capture/win/display_configuration_monitor.h"
-#include "webrtc/modules/desktop_capture/win/dxgi_adapter_duplicator.h"
-#include "webrtc/modules/desktop_capture/win/dxgi_context.h"
-#include "webrtc/modules/desktop_capture/win/dxgi_frame.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/scoped_ref_ptr.h"
-
-namespace webrtc {
-
-// A controller for all the objects we need to call Windows DirectX capture APIs
-// It's a singleton because only one IDXGIOutputDuplication instance per monitor
-// is allowed per application.
-//
-// Consumers should create a DxgiDuplicatorController::Context and keep it
-// throughout their lifetime, and pass it when calling Duplicate(). Consumers
-// can also call IsSupported() to determine whether the system supports DXGI
-// duplicator or not. If a previous IsSupported() function call returns true,
-// but a later Duplicate() returns false, this usually means the display mode is
-// changing. Consumers should retry after a while. (Typically 50 milliseconds,
-// but according to hardware performance, this time may vary.)
-class DxgiDuplicatorController {
- public:
-  using Context = DxgiFrameContext;
-
-  // A collection of D3d information we are interested on, which may impact
-  // capturer performance or reliability.
-  struct D3dInfo {
-    // Each video adapter has its own D3D_FEATURE_LEVEL, so this structure
-    // contains the minimum and maximium D3D_FEATURE_LEVELs current system
-    // supports.
-    // Both fields can be 0, which is the default value to indicate no valid
-    // D3D_FEATURE_LEVEL has been retrieved from underlying OS APIs.
-    D3D_FEATURE_LEVEL min_feature_level;
-    D3D_FEATURE_LEVEL max_feature_level;
-
-    // TODO(zijiehe): Add more fields, such as manufacturer name, mode, driver
-    // version.
-  };
-
-  enum class Result {
-    SUCCEEDED,
-    UNSUPPORTED_SESSION,
-    FRAME_PREPARE_FAILED,
-    INITIALIZATION_FAILED,
-    DUPLICATION_FAILED,
-    INVALID_MONITOR_ID,
-  };
-
-  // Returns the singleton instance of DxgiDuplicatorController.
-  static rtc::scoped_refptr<DxgiDuplicatorController> Instance();
-
-  // See ScreenCapturerWinDirectx::IsCurrentSessionSupported().
-  static bool IsCurrentSessionSupported();
-
-  // All the following public functions implicitly call Initialize() function.
-
-  // Detects whether the system supports DXGI based capturer.
-  bool IsSupported();
-
-  // Returns a copy of D3dInfo composed by last Initialize() function call. This
-  // function always copies the latest information into |info|. But once the
-  // function returns false, the information in |info| may not accurate.
-  bool RetrieveD3dInfo(D3dInfo* info);
-
-  // Captures current screen and writes into |frame|.
-  // TODO(zijiehe): Windows cannot guarantee the frames returned by each
-  // IDXGIOutputDuplication are synchronized. But we are using a totally
-  // different threading model than the way Windows suggested, it's hard to
-  // synchronize them manually. We should find a way to do it.
-  Result Duplicate(DxgiFrame* frame);
-
-  // Captures one monitor and writes into target. |monitor_id| should >= 0. If
-  // |monitor_id| is greater than the total screen count of all the Duplicators,
-  // this function returns false.
-  Result DuplicateMonitor(DxgiFrame* frame, int monitor_id);
-
-  // Returns dpi of current system. Returns an empty DesktopVector if system
-  // does not support DXGI based capturer.
-  DesktopVector dpi();
-
-  // Returns the count of screens on the system. These screens can be retrieved
-  // by an integer in the range of [0, ScreenCount()). If system does not
-  // support DXGI based capturer, this function returns 0.
-  int ScreenCount();
-
-  // Returns the device names of all screens on the system in utf8 encoding.
-  // These screens can be retrieved by an integer in the range of
-  // [0, output->size()). If system does not support DXGI based capturer, this
-  // function returns false.
-  bool GetDeviceNames(std::vector<std::string>* output);
-
- private:
-  // DxgiFrameContext calls private Unregister(Context*) function in Reset().
-  friend void DxgiFrameContext::Reset();
-
-  // scoped_refptr<DxgiDuplicatorController> accesses private AddRef() and
-  // Release() functions.
-  friend class rtc::scoped_refptr<DxgiDuplicatorController>;
-
-  // A private constructor to ensure consumers to use
-  // DxgiDuplicatorController::Instance().
-  DxgiDuplicatorController();
-
-  // Not implemented: The singleton DxgiDuplicatorController instance should not
-  // be deleted.
-  ~DxgiDuplicatorController();
-
-  // RefCountedInterface implementations.
-  void AddRef();
-  void Release();
-
-  // Does the real duplication work. Setting |monitor_id| < 0 to capture entire
-  // screen. This function calls Initialize(). And if the duplication failed,
-  // this function calls Deinitialize() to ensure the Dxgi components can be
-  // reinitialized next time.
-  Result DoDuplicate(DxgiFrame* frame, int monitor_id);
-
-  // Unload all the DXGI components and releases the resources. This function
-  // wraps Deinitialize() with |lock_|.
-  void Unload();
-
-  // Unregisters Context from this instance and all DxgiAdapterDuplicator(s)
-  // it owns.
-  void Unregister(const Context* const context);
-
-  // All functions below should be called in |lock_| locked scope and should be
-  // after a successful Initialize().
-
-  // If current instance has not been initialized, executes DoInitialize()
-  // function, and returns initialize result. Otherwise directly returns true.
-  // This function may calls Deinitialize() if initialization failed.
-  bool Initialize();
-
-  // Does the real initialization work, this function should only be called in
-  // Initialize().
-  bool DoInitialize();
-
-  // Clears all COM components referred by this instance. So next Duplicate()
-  // call will eventually initialize this instance again.
-  void Deinitialize();
-
-  // A helper function to check whether a Context has been expired.
-  bool ContextExpired(const Context* const context) const;
-
-  // Updates Context if needed.
-  void Setup(Context* context);
-
-  bool DoDuplicateUnlocked(Context* context,
-                           int monitor_id,
-                           SharedDesktopFrame* target);
-
-  // Captures all monitors.
-  bool DoDuplicateAll(Context* context, SharedDesktopFrame* target);
-
-  // Captures one monitor.
-  bool DoDuplicateOne(Context* context,
-                      int monitor_id,
-                      SharedDesktopFrame* target);
-
-  // The minimum GetNumFramesCaptured() returned by |duplicators_|.
-  int64_t GetNumFramesCaptured() const;
-
-  // Returns a DesktopSize to cover entire |desktop_rect_|.
-  DesktopSize desktop_size() const;
-
-  // Returns the size of one screen. |id| should be >= 0. If system does not
-  // support DXGI based capturer, or |id| is greater than the total screen count
-  // of all the Duplicators, this function returns an empty DesktopRect.
-  DesktopRect ScreenRect(int id) const;
-
-  int ScreenCountUnlocked() const;
-
-  void GetDeviceNamesUnlocked(std::vector<std::string>* output) const;
-
-  // Returns the desktop size of the selected screen |monitor_id|. Setting
-  // |monitor_id| < 0 to return the entire screen size.
-  DesktopSize SelectedDesktopSize(int monitor_id) const;
-
-  // Retries DoDuplicateAll() for several times until GetNumFramesCaptured() is
-  // large enough. Returns false if DoDuplicateAll() returns false, or
-  // GetNumFramesCaptured() has never reached the requirement.
-  // According to http://crbug.com/682112, dxgi capturer returns a black frame
-  // during first several capture attempts.
-  bool EnsureFrameCaptured(Context* context, SharedDesktopFrame* target);
-
-  // Moves |desktop_rect_| and all underlying |duplicators_|, putting top left
-  // corner of the desktop at (0, 0). This is necessary because DXGI_OUTPUT_DESC
-  // may return negative coordinates. Called from DoInitialize() after all
-  // DxgiAdapterDuplicator and DxgiOutputDuplicator instances are initialized.
-  void TranslateRect();
-
-  // The count of references which are now "living".
-  std::atomic_int refcount_;
-
-  // This lock must be locked whenever accessing any of the following objects.
-  rtc::CriticalSection lock_;
-
-  // A self-incremented integer to compare with the one in Context. It ensures
-  // a Context instance is always initialized after DxgiDuplicatorController.
-  int identity_ = 0;
-  DesktopRect desktop_rect_;
-  DesktopVector dpi_;
-  std::vector<DxgiAdapterDuplicator> duplicators_;
-  D3dInfo d3d_info_;
-  DisplayConfigurationMonitor display_configuration_monitor_;
-  // A number to indicate how many succeeded duplications have been performed.
-  uint32_t succeeded_duplications_ = 0;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_DESKTOP_CAPTURE_WIN_DXGI_DUPLICATOR_CONTROLLER_H_
diff --git a/modules/desktop_capture/win/dxgi_frame.cc b/modules/desktop_capture/win/dxgi_frame.cc
deleted file mode 100644
index d0af1f9..0000000
--- a/modules/desktop_capture/win/dxgi_frame.cc
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- *  Copyright (c) 2017 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/desktop_capture/win/dxgi_frame.h"
-
-#include <string.h>
-
-#include <utility>
-
-#include "webrtc/modules/desktop_capture/desktop_frame.h"
-#include "webrtc/modules/desktop_capture/win/dxgi_duplicator_controller.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-
-namespace webrtc {
-
-DxgiFrame::DxgiFrame(SharedMemoryFactory* factory)
-    : factory_(factory) {}
-
-DxgiFrame::~DxgiFrame() = default;
-
-bool DxgiFrame::Prepare(DesktopSize size, DesktopCapturer::SourceId source_id) {
-  if (source_id != source_id_) {
-    // Once the source has been changed, the entire source should be copied.
-    source_id_ = source_id;
-    context_.Reset();
-  }
-
-  if (resolution_tracker_.SetResolution(size)) {
-    // Once the output size changed, recreate the SharedDesktopFrame.
-    frame_.reset();
-  }
-
-  if (!frame_) {
-    std::unique_ptr<DesktopFrame> frame;
-    if (factory_) {
-      frame = SharedMemoryDesktopFrame::Create(size, factory_);
-    } else {
-      frame.reset(new BasicDesktopFrame(size));
-    }
-    if (!frame) {
-      LOG(LS_WARNING) << "DxgiFrame cannot create a new DesktopFrame.";
-      return false;
-    }
-    // DirectX capturer won't paint each pixel in the frame due to its one
-    // capturer per monitor design. So once the new frame is created, we should
-    // clear it to avoid the legacy image to be remained on it. See
-    // http://crbug.com/708766.
-    RTC_DCHECK_EQ(frame->stride(),
-                  frame->size().width() * DesktopFrame::kBytesPerPixel);
-    memset(frame->data(), 0, frame->stride() * frame->size().height());
-
-    frame_ = SharedDesktopFrame::Wrap(std::move(frame));
-  }
-
-  return !!frame_;
-}
-
-SharedDesktopFrame* DxgiFrame::frame() const {
-  RTC_DCHECK(frame_);
-  return frame_.get();
-}
-
-DxgiFrame::Context* DxgiFrame::context() {
-  RTC_DCHECK(frame_);
-  return &context_;
-}
-
-}  // namespace webrtc
diff --git a/modules/desktop_capture/win/dxgi_frame.h b/modules/desktop_capture/win/dxgi_frame.h
deleted file mode 100644
index 236ae48..0000000
--- a/modules/desktop_capture/win/dxgi_frame.h
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- *  Copyright (c) 2017 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_DESKTOP_CAPTURE_WIN_DXGI_FRAME_H_
-#define WEBRTC_MODULES_DESKTOP_CAPTURE_WIN_DXGI_FRAME_H_
-
-#include <memory>
-#include <vector>
-
-#include "webrtc/modules/desktop_capture/desktop_capturer.h"
-#include "webrtc/modules/desktop_capture/desktop_capture_types.h"
-#include "webrtc/modules/desktop_capture/desktop_geometry.h"
-#include "webrtc/modules/desktop_capture/resolution_tracker.h"
-#include "webrtc/modules/desktop_capture/shared_desktop_frame.h"
-#include "webrtc/modules/desktop_capture/shared_memory.h"
-#include "webrtc/modules/desktop_capture/win/dxgi_context.h"
-
-namespace webrtc {
-
-class DxgiDuplicatorController;
-
-// A pair of a SharedDesktopFrame and a DxgiDuplicatorController::Context for
-// the client of DxgiDuplicatorController.
-class DxgiFrame final {
- public:
-  using Context = DxgiFrameContext;
-
-  // DxgiFrame does not take ownership of |factory|, consumers should ensure it
-  // outlives this instance. nullptr is acceptable.
-  explicit DxgiFrame(SharedMemoryFactory* factory);
-  ~DxgiFrame();
-
-  // Should not be called if Prepare() is not executed or returns false.
-  SharedDesktopFrame* frame() const;
-
- private:
-  // Allows DxgiDuplicatorController to access Prepare() and context() function
-  // as well as Context class.
-  friend class DxgiDuplicatorController;
-
-  // Prepares current instance with desktop size and source id.
-  bool Prepare(DesktopSize size, DesktopCapturer::SourceId source_id);
-
-  // Should not be called if Prepare() is not executed or returns false.
-  Context* context();
-
-  SharedMemoryFactory* const factory_;
-  ResolutionTracker resolution_tracker_;
-  DesktopCapturer::SourceId source_id_ = kFullDesktopScreenId;
-  std::unique_ptr<SharedDesktopFrame> frame_;
-  Context context_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_DESKTOP_CAPTURE_WIN_DXGI_FRAME_H_
diff --git a/modules/desktop_capture/win/dxgi_output_duplicator.cc b/modules/desktop_capture/win/dxgi_output_duplicator.cc
deleted file mode 100644
index acb9c9d..0000000
--- a/modules/desktop_capture/win/dxgi_output_duplicator.cc
+++ /dev/null
@@ -1,393 +0,0 @@
-/*
- *  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/desktop_capture/win/dxgi_output_duplicator.h"
-
-#include <string.h>
-
-#include <unknwn.h>
-#include <DXGI.h>
-#include <DXGIFormat.h>
-#include <Windows.h>
-
-#include <algorithm>
-
-#include "webrtc/modules/desktop_capture/win/dxgi_texture_mapping.h"
-#include "webrtc/modules/desktop_capture/win/dxgi_texture_staging.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/win32.h"
-
-namespace webrtc {
-
-using Microsoft::WRL::ComPtr;
-
-namespace {
-
-// Timeout for AcquireNextFrame() call.
-// DxgiDuplicatorController leverages external components to do the capture
-// scheduling. So here DxgiOutputDuplicator does not need to actively wait for a
-// new frame.
-const int kAcquireTimeoutMs = 0;
-
-DesktopRect RECTToDesktopRect(const RECT& rect) {
-  return DesktopRect::MakeLTRB(rect.left, rect.top, rect.right, rect.bottom);
-}
-
-Rotation DxgiRotationToRotation(DXGI_MODE_ROTATION rotation) {
-  switch (rotation) {
-    case DXGI_MODE_ROTATION_IDENTITY:
-    case DXGI_MODE_ROTATION_UNSPECIFIED:
-      return Rotation::CLOCK_WISE_0;
-    case DXGI_MODE_ROTATION_ROTATE90:
-      return Rotation::CLOCK_WISE_90;
-    case DXGI_MODE_ROTATION_ROTATE180:
-      return Rotation::CLOCK_WISE_180;
-    case DXGI_MODE_ROTATION_ROTATE270:
-      return Rotation::CLOCK_WISE_270;
-  }
-
-  RTC_NOTREACHED();
-  return Rotation::CLOCK_WISE_0;
-}
-
-}  // namespace
-
-DxgiOutputDuplicator::DxgiOutputDuplicator(const D3dDevice& device,
-                                           const ComPtr<IDXGIOutput1>& output,
-                                           const DXGI_OUTPUT_DESC& desc)
-    : device_(device),
-      output_(output),
-      device_name_(rtc::ToUtf8(desc.DeviceName)),
-      desktop_rect_(RECTToDesktopRect(desc.DesktopCoordinates)) {
-  RTC_DCHECK(output_);
-  RTC_DCHECK(!desktop_rect_.is_empty());
-  RTC_DCHECK_GT(desktop_rect_.width(), 0);
-  RTC_DCHECK_GT(desktop_rect_.height(), 0);
-}
-
-DxgiOutputDuplicator::DxgiOutputDuplicator(DxgiOutputDuplicator&& other) =
-    default;
-
-DxgiOutputDuplicator::~DxgiOutputDuplicator() {
-  if (duplication_) {
-    duplication_->ReleaseFrame();
-  }
-  texture_.reset();
-}
-
-bool DxgiOutputDuplicator::Initialize() {
-  if (DuplicateOutput()) {
-    if (desc_.DesktopImageInSystemMemory) {
-      texture_.reset(new DxgiTextureMapping(duplication_.Get()));
-    } else {
-      texture_.reset(new DxgiTextureStaging(device_));
-    }
-    return true;
-  } else {
-    duplication_.Reset();
-    return false;
-  }
-}
-
-bool DxgiOutputDuplicator::DuplicateOutput() {
-  RTC_DCHECK(!duplication_);
-  _com_error error =
-      output_->DuplicateOutput(static_cast<IUnknown*>(device_.d3d_device()),
-                               duplication_.GetAddressOf());
-  if (error.Error() != S_OK || !duplication_) {
-    LOG(LS_WARNING) << "Failed to duplicate output from IDXGIOutput1, error "
-                    << error.ErrorMessage() << ", with code " << error.Error();
-    return false;
-  }
-
-  memset(&desc_, 0, sizeof(desc_));
-  duplication_->GetDesc(&desc_);
-  if (desc_.ModeDesc.Format != DXGI_FORMAT_B8G8R8A8_UNORM) {
-    LOG(LS_ERROR) << "IDXGIDuplicateOutput does not use RGBA (8 bit) "
-                     "format, which is required by downstream components, "
-                     "format is "
-                  << desc_.ModeDesc.Format;
-    return false;
-  }
-
-  if (static_cast<int>(desc_.ModeDesc.Width) != desktop_rect_.width() ||
-      static_cast<int>(desc_.ModeDesc.Height) != desktop_rect_.height()) {
-    LOG(LS_ERROR) << "IDXGIDuplicateOutput does not return a same size as its "
-                     "IDXGIOutput1, size returned by IDXGIDuplicateOutput is "
-                  << desc_.ModeDesc.Width << " x " << desc_.ModeDesc.Height
-                  << ", size returned by IDXGIOutput1 is "
-                  << desktop_rect_.width() << " x " << desktop_rect_.height();
-    return false;
-  }
-
-  rotation_ = DxgiRotationToRotation(desc_.Rotation);
-  unrotated_size_ = RotateSize(desktop_size(), ReverseRotation(rotation_));
-
-  return true;
-}
-
-bool DxgiOutputDuplicator::ReleaseFrame() {
-  RTC_DCHECK(duplication_);
-  _com_error error = duplication_->ReleaseFrame();
-  if (error.Error() != S_OK) {
-    LOG(LS_ERROR) << "Failed to release frame from IDXGIOutputDuplication, "
-                     "error"
-                  << error.ErrorMessage() << ", code " << error.Error();
-    return false;
-  }
-  return true;
-}
-
-bool DxgiOutputDuplicator::Duplicate(Context* context,
-                                     DesktopVector offset,
-                                     SharedDesktopFrame* target) {
-  RTC_DCHECK(duplication_);
-  RTC_DCHECK(texture_);
-  RTC_DCHECK(target);
-  if (!DesktopRect::MakeSize(target->size())
-           .ContainsRect(GetTranslatedDesktopRect(offset))) {
-    // target size is not large enough to cover current output region.
-    return false;
-  }
-
-  DXGI_OUTDUPL_FRAME_INFO frame_info;
-  memset(&frame_info, 0, sizeof(frame_info));
-  ComPtr<IDXGIResource> resource;
-  _com_error error = duplication_->AcquireNextFrame(
-      kAcquireTimeoutMs, &frame_info, resource.GetAddressOf());
-  if (error.Error() != S_OK && error.Error() != DXGI_ERROR_WAIT_TIMEOUT) {
-    LOG(LS_ERROR) << "Failed to capture frame, error " << error.ErrorMessage()
-                  << ", code " << error.Error();
-    return false;
-  }
-
-  // We need to merge updated region with the one from context, but only spread
-  // updated region from current frame. So keeps a copy of updated region from
-  // context here. The |updated_region| always starts from (0, 0).
-  DesktopRegion updated_region;
-  updated_region.Swap(&context->updated_region);
-  if (error.Error() == S_OK &&
-      frame_info.AccumulatedFrames > 0 &&
-      resource) {
-    DetectUpdatedRegion(frame_info, &context->updated_region);
-    SpreadContextChange(context);
-    if (!texture_->CopyFrom(frame_info, resource.Get())) {
-      return false;
-    }
-    updated_region.AddRegion(context->updated_region);
-    // TODO(zijiehe): Figure out why clearing context->updated_region() here
-    // triggers screen flickering?
-
-    const DesktopFrame& source = texture_->AsDesktopFrame();
-    if (rotation_ != Rotation::CLOCK_WISE_0) {
-      for (DesktopRegion::Iterator it(updated_region); !it.IsAtEnd();
-           it.Advance()) {
-        // The |updated_region| returned by Windows is rotated, but the |source|
-        // frame is not. So we need to rotate it reversely.
-        const DesktopRect source_rect = RotateRect(
-            it.rect(), desktop_size(), ReverseRotation(rotation_));
-        RotateDesktopFrame(source, source_rect, rotation_, offset, target);
-      }
-    } else {
-      for (DesktopRegion::Iterator it(updated_region); !it.IsAtEnd();
-           it.Advance()) {
-        // The DesktopRect in |target|, starts from offset.
-        DesktopRect dest_rect = it.rect();
-        dest_rect.Translate(offset);
-        target->CopyPixelsFrom(source, it.rect().top_left(), dest_rect);
-      }
-    }
-    last_frame_ = target->Share();
-    last_frame_offset_ = offset;
-    updated_region.Translate(offset.x(), offset.y());
-    target->mutable_updated_region()->AddRegion(updated_region);
-    num_frames_captured_++;
-    return texture_->Release() && ReleaseFrame();
-  }
-
-  if (last_frame_) {
-    // No change since last frame or AcquireNextFrame() timed out, we will
-    // export last frame to the target.
-    for (DesktopRegion::Iterator it(updated_region); !it.IsAtEnd();
-         it.Advance()) {
-      // The DesktopRect in |source|, starts from last_frame_offset_.
-      DesktopRect source_rect = it.rect();
-      // The DesktopRect in |target|, starts from offset.
-      DesktopRect target_rect = source_rect;
-      source_rect.Translate(last_frame_offset_);
-      target_rect.Translate(offset);
-      target->CopyPixelsFrom(*last_frame_, source_rect.top_left(), target_rect);
-    }
-    updated_region.Translate(offset.x(), offset.y());
-    target->mutable_updated_region()->AddRegion(updated_region);
-  } else {
-    // If we were at the very first frame, and capturing failed, the
-    // context->updated_region should be kept unchanged for next attempt.
-    context->updated_region.Swap(&updated_region);
-  }
-  // If AcquireNextFrame() failed with timeout error, we do not need to release
-  // the frame.
-  return error.Error() == DXGI_ERROR_WAIT_TIMEOUT || ReleaseFrame();
-}
-
-DesktopRect DxgiOutputDuplicator::GetTranslatedDesktopRect(
-    DesktopVector offset) const {
-  DesktopRect result(DesktopRect::MakeSize(desktop_size()));
-  result.Translate(offset);
-  return result;
-}
-
-DesktopRect DxgiOutputDuplicator::GetUntranslatedDesktopRect() const {
-  return DesktopRect::MakeSize(desktop_size());
-}
-
-void DxgiOutputDuplicator::DetectUpdatedRegion(
-    const DXGI_OUTDUPL_FRAME_INFO& frame_info,
-    DesktopRegion* updated_region) {
-  if (DoDetectUpdatedRegion(frame_info, updated_region)) {
-    // Make sure even a region returned by Windows API is out of the scope of
-    // desktop_rect_, we still won't export it to the target DesktopFrame.
-    updated_region->IntersectWith(GetUntranslatedDesktopRect());
-  } else {
-    updated_region->SetRect(GetUntranslatedDesktopRect());
-  }
-}
-
-bool DxgiOutputDuplicator::DoDetectUpdatedRegion(
-    const DXGI_OUTDUPL_FRAME_INFO& frame_info,
-    DesktopRegion* updated_region) {
-  RTC_DCHECK(updated_region);
-  updated_region->Clear();
-  if (frame_info.TotalMetadataBufferSize == 0) {
-    // This should not happen, since frame_info.AccumulatedFrames > 0.
-    LOG(LS_ERROR) << "frame_info.AccumulatedFrames > 0, "
-                     "but TotalMetadataBufferSize == 0";
-    return false;
-  }
-
-  if (metadata_.capacity() < frame_info.TotalMetadataBufferSize) {
-    metadata_.clear();  // Avoid data copy
-    metadata_.reserve(frame_info.TotalMetadataBufferSize);
-  }
-
-  UINT buff_size = 0;
-  DXGI_OUTDUPL_MOVE_RECT* move_rects =
-      reinterpret_cast<DXGI_OUTDUPL_MOVE_RECT*>(metadata_.data());
-  size_t move_rects_count = 0;
-  _com_error error = duplication_->GetFrameMoveRects(
-      static_cast<UINT>(metadata_.capacity()), move_rects, &buff_size);
-  if (error.Error() != S_OK) {
-    LOG(LS_ERROR) << "Failed to get move rectangles, error "
-                  << error.ErrorMessage() << ", code " << error.Error();
-    return false;
-  }
-  move_rects_count = buff_size / sizeof(DXGI_OUTDUPL_MOVE_RECT);
-
-  RECT* dirty_rects = reinterpret_cast<RECT*>(metadata_.data() + buff_size);
-  size_t dirty_rects_count = 0;
-  error = duplication_->GetFrameDirtyRects(
-      static_cast<UINT>(metadata_.capacity()) - buff_size, dirty_rects,
-      &buff_size);
-  if (error.Error() != S_OK) {
-    LOG(LS_ERROR) << "Failed to get dirty rectangles, error "
-                  << error.ErrorMessage() << ", code " << error.Error();
-    return false;
-  }
-  dirty_rects_count = buff_size / sizeof(RECT);
-
-  while (move_rects_count > 0) {
-    // DirectX capturer API may randomly return unmoved move_rects, which should
-    // be skipped to avoid unnecessary wasting of differing and encoding
-    // resources.
-    // By using testing application it2me_standalone_host_main, this check
-    // reduces average capture time by 0.375% (4.07 -> 4.055), and average
-    // encode time by 0.313% (8.042 -> 8.016) without other impacts.
-    if (move_rects->SourcePoint.x != move_rects->DestinationRect.left ||
-        move_rects->SourcePoint.y != move_rects->DestinationRect.top) {
-      updated_region->AddRect(
-          RotateRect(DesktopRect::MakeXYWH(move_rects->SourcePoint.x,
-                                           move_rects->SourcePoint.y,
-                                           move_rects->DestinationRect.right -
-                                               move_rects->DestinationRect.left,
-                                           move_rects->DestinationRect.bottom -
-                                               move_rects->DestinationRect.top),
-                     unrotated_size_, rotation_));
-      updated_region->AddRect(
-          RotateRect(DesktopRect::MakeLTRB(move_rects->DestinationRect.left,
-                                           move_rects->DestinationRect.top,
-                                           move_rects->DestinationRect.right,
-                                           move_rects->DestinationRect.bottom),
-                     unrotated_size_, rotation_));
-    } else {
-      LOG(LS_INFO) << "Unmoved move_rect detected, ["
-                   << move_rects->DestinationRect.left << ", "
-                   << move_rects->DestinationRect.top << "] - ["
-                   << move_rects->DestinationRect.right << ", "
-                   << move_rects->DestinationRect.bottom << "].";
-    }
-    move_rects++;
-    move_rects_count--;
-  }
-
-  while (dirty_rects_count > 0) {
-    updated_region->AddRect(RotateRect(
-        DesktopRect::MakeLTRB(dirty_rects->left, dirty_rects->top,
-                              dirty_rects->right, dirty_rects->bottom),
-        unrotated_size_, rotation_));
-    dirty_rects++;
-    dirty_rects_count--;
-  }
-
-  return true;
-}
-
-void DxgiOutputDuplicator::Setup(Context* context) {
-  RTC_DCHECK(context->updated_region.is_empty());
-  // Always copy entire monitor during the first Duplicate() function call.
-  context->updated_region.AddRect(GetUntranslatedDesktopRect());
-  RTC_DCHECK(std::find(contexts_.begin(), contexts_.end(), context) ==
-             contexts_.end());
-  contexts_.push_back(context);
-}
-
-void DxgiOutputDuplicator::Unregister(const Context* const context) {
-  auto it = std::find(contexts_.begin(), contexts_.end(), context);
-  RTC_DCHECK(it != contexts_.end());
-  contexts_.erase(it);
-}
-
-void DxgiOutputDuplicator::SpreadContextChange(const Context* const source) {
-  for (Context* dest : contexts_) {
-    RTC_DCHECK(dest);
-    if (dest != source) {
-      dest->updated_region.AddRegion(source->updated_region);
-    }
-  }
-}
-
-DesktopSize DxgiOutputDuplicator::desktop_size() const {
-  return desktop_rect_.size();
-}
-
-int64_t DxgiOutputDuplicator::num_frames_captured() const {
-#if !defined(NDEBUG)
-  RTC_DCHECK_EQ(!!last_frame_, num_frames_captured_ > 0);
-#endif
-  return num_frames_captured_;
-}
-
-void DxgiOutputDuplicator::TranslateRect(const DesktopVector& position) {
-  desktop_rect_.Translate(position);
-  RTC_DCHECK_GE(desktop_rect_.left(), 0);
-  RTC_DCHECK_GE(desktop_rect_.top(), 0);
-}
-
-}  // namespace webrtc
diff --git a/modules/desktop_capture/win/dxgi_output_duplicator.h b/modules/desktop_capture/win/dxgi_output_duplicator.h
deleted file mode 100644
index 47e078f..0000000
--- a/modules/desktop_capture/win/dxgi_output_duplicator.h
+++ /dev/null
@@ -1,145 +0,0 @@
-/*
- *  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_DESKTOP_CAPTURE_WIN_DXGI_OUTPUT_DUPLICATOR_H_
-#define WEBRTC_MODULES_DESKTOP_CAPTURE_WIN_DXGI_OUTPUT_DUPLICATOR_H_
-
-#include <comdef.h>
-#include <wrl/client.h>
-#include <DXGI.h>
-#include <DXGI1_2.h>
-
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "webrtc/modules/desktop_capture/desktop_frame_rotation.h"
-#include "webrtc/modules/desktop_capture/desktop_geometry.h"
-#include "webrtc/modules/desktop_capture/desktop_region.h"
-#include "webrtc/modules/desktop_capture/shared_desktop_frame.h"
-#include "webrtc/modules/desktop_capture/win/d3d_device.h"
-#include "webrtc/modules/desktop_capture/win/dxgi_context.h"
-#include "webrtc/modules/desktop_capture/win/dxgi_texture.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/thread_annotations.h"
-
-namespace webrtc {
-
-// Duplicates the content on one IDXGIOutput, i.e. one monitor attached to one
-// video card. None of functions in this class is thread-safe.
-class DxgiOutputDuplicator {
- public:
-  using Context = DxgiOutputContext;
-
-  // Creates an instance of DxgiOutputDuplicator from a D3dDevice and one of its
-  // IDXGIOutput1. Caller must maintain the lifetime of device, to make sure it
-  // outlives this instance. Only DxgiAdapterDuplicator can create an instance.
-  DxgiOutputDuplicator(const D3dDevice& device,
-                       const Microsoft::WRL::ComPtr<IDXGIOutput1>& output,
-                       const DXGI_OUTPUT_DESC& desc);
-
-  // To allow this class to work with vector.
-  DxgiOutputDuplicator(DxgiOutputDuplicator&& other);
-
-  // Destructs this instance. We need to make sure texture_ has been released
-  // before duplication_.
-  ~DxgiOutputDuplicator();
-
-  // Initializes duplication_ object.
-  bool Initialize();
-
-  // Copies the content of current IDXGIOutput to the |target|. To improve the
-  // performance, this function copies only regions merged from
-  // |context|->updated_region and DetectUpdatedRegion(). The |offset| decides
-  // the offset in the |target| where the content should be copied to. i.e. this
-  // function copies the content to the rectangle of (offset.x(), offset.y()) to
-  // (offset.x() + desktop_rect_.width(), offset.y() + desktop_rect_.height()).
-  // Returns false in case of a failure.
-  bool Duplicate(Context* context,
-                 DesktopVector offset,
-                 SharedDesktopFrame* target);
-
-  // Returns the desktop rect covered by this DxgiOutputDuplicator.
-  DesktopRect desktop_rect() const { return desktop_rect_; }
-
-  // Returns the device name from DXGI_OUTPUT_DESC in utf8 encoding.
-  const std::string& device_name() const { return device_name_; }
-
-  void Setup(Context* context);
-
-  void Unregister(const Context* const context);
-
-  // How many frames have been captured by this DxigOutputDuplicator.
-  int64_t num_frames_captured() const;
-
-  // Moves |desktop_rect_|. See DxgiDuplicatorController::TranslateRect().
-  void TranslateRect(const DesktopVector& position);
-
- private:
-  // Calls DoDetectUpdatedRegion(). If it fails, this function sets the
-  // |updated_region| as entire UntranslatedDesktopRect().
-  void DetectUpdatedRegion(const DXGI_OUTDUPL_FRAME_INFO& frame_info,
-                           DesktopRegion* updated_region);
-
-  // Returns untranslated updated region, which are directly returned by Windows
-  // APIs. Returns false in case of a failure.
-  bool DoDetectUpdatedRegion(const DXGI_OUTDUPL_FRAME_INFO& frame_info,
-                             DesktopRegion* updated_region);
-
-  bool ReleaseFrame();
-
-  // Initializes duplication_ instance. Expects duplication_ is in empty status.
-  // Returns false if system does not support IDXGIOutputDuplication.
-  bool DuplicateOutput();
-
-  // Returns a DesktopRect with the same size of desktop_size(), but translated
-  // by offset.
-  DesktopRect GetTranslatedDesktopRect(DesktopVector offset) const;
-
-  // Returns a DesktopRect with the same size of desktop_size(), but starts from
-  // (0, 0).
-  DesktopRect GetUntranslatedDesktopRect() const;
-
-  // Spreads changes from |context| to other registered Context(s) in
-  // contexts_.
-  void SpreadContextChange(const Context* const context);
-
-  // Returns the size of desktop rectangle current instance representing.
-  DesktopSize desktop_size() const;
-
-  const D3dDevice device_;
-  const Microsoft::WRL::ComPtr<IDXGIOutput1> output_;
-  const std::string device_name_;
-  DesktopRect desktop_rect_;
-  Microsoft::WRL::ComPtr<IDXGIOutputDuplication> duplication_;
-  DXGI_OUTDUPL_DESC desc_;
-  std::vector<uint8_t> metadata_;
-  std::unique_ptr<DxgiTexture> texture_;
-  Rotation rotation_;
-  DesktopSize unrotated_size_;
-
-  // After each AcquireNextFrame() function call, updated_region_(s) of all
-  // active Context(s) need to be updated. Since they have missed the
-  // change this time. And during next Duplicate() function call, their
-  // updated_region_ will be merged and copied.
-  std::vector<Context*> contexts_;
-
-  // The last full frame of this output and its offset. If on AcquireNextFrame()
-  // failed because of timeout, i.e. no update, we can copy content from
-  // |last_frame_|.
-  std::unique_ptr<SharedDesktopFrame> last_frame_;
-  DesktopVector last_frame_offset_;
-
-  int64_t num_frames_captured_ = 0;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_DESKTOP_CAPTURE_WIN_DXGI_OUTPUT_DUPLICATOR_H_
diff --git a/modules/desktop_capture/win/dxgi_texture.cc b/modules/desktop_capture/win/dxgi_texture.cc
deleted file mode 100644
index f9cfd82..0000000
--- a/modules/desktop_capture/win/dxgi_texture.cc
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- *  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/desktop_capture/win/dxgi_texture.h"
-
-#include <comdef.h>
-#include <wrl/client.h>
-#include <D3D11.h>
-
-#include "webrtc/modules/desktop_capture/desktop_region.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-
-using Microsoft::WRL::ComPtr;
-
-namespace webrtc {
-
-namespace {
-
-class DxgiDesktopFrame : public DesktopFrame {
- public:
-  explicit DxgiDesktopFrame(const DxgiTexture& texture)
-      : DesktopFrame(texture.desktop_size(),
-                     texture.pitch(),
-                     texture.bits(),
-                     nullptr) {}
-
-  ~DxgiDesktopFrame() override = default;
-};
-
-}  // namespace
-
-DxgiTexture::DxgiTexture() = default;
-DxgiTexture::~DxgiTexture() = default;
-
-bool DxgiTexture::CopyFrom(const DXGI_OUTDUPL_FRAME_INFO& frame_info,
-                           IDXGIResource* resource) {
-  RTC_DCHECK_GT(frame_info.AccumulatedFrames, 0);
-  RTC_DCHECK(resource);
-  ComPtr<ID3D11Texture2D> texture;
-  _com_error error = resource->QueryInterface(
-      __uuidof(ID3D11Texture2D),
-      reinterpret_cast<void**>(texture.GetAddressOf()));
-  if (error.Error() != S_OK || !texture) {
-    LOG(LS_ERROR) << "Failed to convert IDXGIResource to ID3D11Texture2D, "
-                     "error "
-                  << error.ErrorMessage() << ", code " << error.Error();
-    return false;
-  }
-
-  D3D11_TEXTURE2D_DESC desc = {0};
-  texture->GetDesc(&desc);
-  desktop_size_.set(desc.Width, desc.Height);
-
-  return CopyFromTexture(frame_info, texture.Get());
-}
-
-const DesktopFrame& DxgiTexture::AsDesktopFrame() {
-  if (!frame_) {
-    frame_.reset(new DxgiDesktopFrame(*this));
-  }
-  return *frame_;
-}
-
-bool DxgiTexture::Release() {
-  frame_.reset();
-  return DoRelease();
-}
-
-DXGI_MAPPED_RECT* DxgiTexture::rect() {
-  return &rect_;
-}
-
-}  // namespace webrtc
diff --git a/modules/desktop_capture/win/dxgi_texture.h b/modules/desktop_capture/win/dxgi_texture.h
deleted file mode 100644
index fb12092..0000000
--- a/modules/desktop_capture/win/dxgi_texture.h
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- *  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_DESKTOP_CAPTURE_WIN_DXGI_TEXTURE_H_
-#define WEBRTC_MODULES_DESKTOP_CAPTURE_WIN_DXGI_TEXTURE_H_
-
-#include <D3D11.h>
-#include <DXGI1_2.h>
-
-#include <memory>
-
-#include "webrtc/modules/desktop_capture/desktop_frame.h"
-#include "webrtc/modules/desktop_capture/desktop_geometry.h"
-
-namespace webrtc {
-
-class DesktopRegion;
-
-// A texture copied or mapped from a DXGI_OUTDUPL_FRAME_INFO and IDXGIResource.
-class DxgiTexture {
- public:
-  // Creates a DxgiTexture instance, which represents the |desktop_size| area of
-  // entire screen -- usually a monitor on the system.
-  DxgiTexture();
-
-  virtual ~DxgiTexture();
-
-  // Copies selected regions of a frame represented by frame_info and resource.
-  // Returns false if anything wrong.
-  bool CopyFrom(const DXGI_OUTDUPL_FRAME_INFO& frame_info,
-                IDXGIResource* resource);
-
-  const DesktopSize& desktop_size() const { return desktop_size_; }
-
-  uint8_t* bits() const { return static_cast<uint8_t*>(rect_.pBits); }
-
-  int pitch() const { return static_cast<int>(rect_.Pitch); }
-
-  // Releases the resource currently holds by this instance. Returns false if
-  // anything wrong, and this instance should be deprecated in this state. bits,
-  // pitch and AsDesktopFrame are only valid after a success CopyFrom() call,
-  // but before Release() call.
-  bool Release();
-
-  // Returns a DesktopFrame snapshot of a DxgiTexture instance. This
-  // DesktopFrame is used to copy a DxgiTexture content to another DesktopFrame
-  // only. And it should not outlive its DxgiTexture instance.
-  const DesktopFrame& AsDesktopFrame();
-
- protected:
-  DXGI_MAPPED_RECT* rect();
-
-  virtual bool CopyFromTexture(const DXGI_OUTDUPL_FRAME_INFO& frame_info,
-                               ID3D11Texture2D* texture) = 0;
-
-  virtual bool DoRelease() = 0;
-
- private:
-  DXGI_MAPPED_RECT rect_ = {0};
-  DesktopSize desktop_size_;
-  std::unique_ptr<DesktopFrame> frame_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_DESKTOP_CAPTURE_WIN_DXGI_TEXTURE_H_
diff --git a/modules/desktop_capture/win/dxgi_texture_mapping.cc b/modules/desktop_capture/win/dxgi_texture_mapping.cc
deleted file mode 100644
index 66e5e75..0000000
--- a/modules/desktop_capture/win/dxgi_texture_mapping.cc
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- *  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/desktop_capture/win/dxgi_texture_mapping.h"
-
-#include <comdef.h>
-#include <DXGI.h>
-#include <DXGI1_2.h>
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-
-namespace webrtc {
-
-DxgiTextureMapping::DxgiTextureMapping(IDXGIOutputDuplication* duplication)
-    : duplication_(duplication) {
-  RTC_DCHECK(duplication_);
-}
-
-DxgiTextureMapping::~DxgiTextureMapping() = default;
-
-bool DxgiTextureMapping::CopyFromTexture(
-    const DXGI_OUTDUPL_FRAME_INFO& frame_info,
-    ID3D11Texture2D* texture) {
-  RTC_DCHECK_GT(frame_info.AccumulatedFrames, 0);
-  RTC_DCHECK(texture);
-  *rect() = {0};
-  _com_error error = duplication_->MapDesktopSurface(rect());
-  if (error.Error() != S_OK) {
-    *rect() = {0};
-    LOG(LS_ERROR) << "Failed to map the IDXGIOutputDuplication to a bitmap, "
-                     "error "
-                  << error.ErrorMessage() << ", code " << error.Error();
-    return false;
-  }
-
-  return true;
-}
-
-bool DxgiTextureMapping::DoRelease() {
-  _com_error error = duplication_->UnMapDesktopSurface();
-  if (error.Error() != S_OK) {
-    LOG(LS_ERROR) << "Failed to unmap the IDXGIOutputDuplication, error "
-                  << error.ErrorMessage() << ", code " << error.Error();
-    return false;
-  }
-  return true;
-}
-
-}  // namespace webrtc
diff --git a/modules/desktop_capture/win/dxgi_texture_mapping.h b/modules/desktop_capture/win/dxgi_texture_mapping.h
deleted file mode 100644
index 0291a90..0000000
--- a/modules/desktop_capture/win/dxgi_texture_mapping.h
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- *  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_DESKTOP_CAPTURE_WIN_DXGI_TEXTURE_MAPPING_H_
-#define WEBRTC_MODULES_DESKTOP_CAPTURE_WIN_DXGI_TEXTURE_MAPPING_H_
-
-#include <D3D11.h>
-#include <DXGI1_2.h>
-
-#include "webrtc/modules/desktop_capture/desktop_geometry.h"
-#include "webrtc/modules/desktop_capture/desktop_region.h"
-#include "webrtc/modules/desktop_capture/win/dxgi_texture.h"
-
-namespace webrtc {
-
-// A DxgiTexture which directly maps bitmap from IDXGIResource. This class is
-// used when DXGI_OUTDUPL_DESC.DesktopImageInSystemMemory is true. (This usually
-// means the video card shares main memory with CPU, instead of having its own
-// individual memory.)
-class DxgiTextureMapping : public DxgiTexture {
- public:
-  // Creates a DxgiTextureMapping instance. Caller must maintain the lifetime
-  // of input |duplication| to make sure it outlives this instance.
-  explicit DxgiTextureMapping(IDXGIOutputDuplication* duplication);
-
-  ~DxgiTextureMapping() override;
-
- protected:
-  bool CopyFromTexture(const DXGI_OUTDUPL_FRAME_INFO& frame_info,
-                       ID3D11Texture2D* texture) override;
-
-  bool DoRelease() override;
-
- private:
-  IDXGIOutputDuplication* const duplication_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_DESKTOP_CAPTURE_WIN_DXGI_TEXTURE_MAPPING_H_
diff --git a/modules/desktop_capture/win/dxgi_texture_staging.cc b/modules/desktop_capture/win/dxgi_texture_staging.cc
deleted file mode 100644
index 3b165bd..0000000
--- a/modules/desktop_capture/win/dxgi_texture_staging.cc
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- *  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/desktop_capture/win/dxgi_texture_staging.h"
-
-#include <comdef.h>
-#include <unknwn.h>
-#include <DXGI.h>
-#include <DXGI1_2.h>
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/system_wrappers/include/metrics.h"
-
-using Microsoft::WRL::ComPtr;
-
-namespace webrtc {
-
-DxgiTextureStaging::DxgiTextureStaging(const D3dDevice& device)
-    : device_(device) {}
-
-DxgiTextureStaging::~DxgiTextureStaging() = default;
-
-bool DxgiTextureStaging::InitializeStage(ID3D11Texture2D* texture) {
-  RTC_DCHECK(texture);
-  D3D11_TEXTURE2D_DESC desc = {0};
-  texture->GetDesc(&desc);
-
-  desc.ArraySize = 1;
-  desc.BindFlags = 0;
-  desc.CPUAccessFlags = D3D11_CPU_ACCESS_READ;
-  desc.MipLevels = 1;
-  desc.MiscFlags = 0;
-  desc.SampleDesc.Count = 1;
-  desc.SampleDesc.Quality = 0;
-  desc.Usage = D3D11_USAGE_STAGING;
-  if (stage_) {
-    AssertStageAndSurfaceAreSameObject();
-    D3D11_TEXTURE2D_DESC current_desc;
-    stage_->GetDesc(&current_desc);
-    const bool recreate_needed = (
-        memcmp(&desc, &current_desc, sizeof(D3D11_TEXTURE2D_DESC)) != 0);
-    RTC_HISTOGRAM_BOOLEAN("WebRTC.DesktopCapture.StagingTextureRecreate",
-                          recreate_needed);
-    if (!recreate_needed) {
-      return true;
-    }
-
-    // The descriptions are not consistent, we need to create a new
-    // ID3D11Texture2D instance.
-    stage_.Reset();
-    surface_.Reset();
-  } else {
-    RTC_DCHECK(!surface_);
-  }
-
-  _com_error error = device_.d3d_device()->CreateTexture2D(
-      &desc, nullptr, stage_.GetAddressOf());
-  if (error.Error() != S_OK || !stage_) {
-    LOG(LS_ERROR) << "Failed to create a new ID3D11Texture2D as stage, error "
-                  << error.ErrorMessage() << ", code " << error.Error();
-    return false;
-  }
-
-  error = stage_.As(&surface_);
-  if (error.Error() != S_OK || !surface_) {
-    LOG(LS_ERROR) << "Failed to convert ID3D11Texture2D to IDXGISurface, error "
-                  << error.ErrorMessage() << ", code " << error.Error();
-    return false;
-  }
-
-  return true;
-}
-
-void DxgiTextureStaging::AssertStageAndSurfaceAreSameObject() {
-  ComPtr<IUnknown> left;
-  ComPtr<IUnknown> right;
-  bool left_result = SUCCEEDED(stage_.As(&left));
-  bool right_result = SUCCEEDED(surface_.As(&right));
-  RTC_DCHECK(left_result);
-  RTC_DCHECK(right_result);
-  RTC_DCHECK(left.Get() == right.Get());
-}
-
-bool DxgiTextureStaging::CopyFromTexture(
-    const DXGI_OUTDUPL_FRAME_INFO& frame_info,
-    ID3D11Texture2D* texture) {
-  RTC_DCHECK_GT(frame_info.AccumulatedFrames, 0);
-  RTC_DCHECK(texture);
-
-  // AcquireNextFrame returns a CPU inaccessible IDXGIResource, so we need to
-  // copy it to a CPU accessible staging ID3D11Texture2D.
-  if (!InitializeStage(texture)) {
-    return false;
-  }
-
-  device_.context()->CopyResource(static_cast<ID3D11Resource*>(stage_.Get()),
-                                  static_cast<ID3D11Resource*>(texture));
-
-  *rect() = {0};
-  _com_error error = surface_->Map(rect(), DXGI_MAP_READ);
-  if (error.Error() != S_OK) {
-    *rect() = {0};
-    LOG(LS_ERROR) << "Failed to map the IDXGISurface to a bitmap, error "
-                  << error.ErrorMessage() << ", code " << error.Error();
-    return false;
-  }
-
-  return true;
-}
-
-bool DxgiTextureStaging::DoRelease() {
-  _com_error error = surface_->Unmap();
-  if (error.Error() != S_OK) {
-    stage_.Reset();
-    surface_.Reset();
-  }
-  // If using staging mode, we only need to recreate ID3D11Texture2D instance.
-  // This will happen during next CopyFrom call. So this function always returns
-  // true.
-  return true;
-}
-
-}  // namespace webrtc
diff --git a/modules/desktop_capture/win/dxgi_texture_staging.h b/modules/desktop_capture/win/dxgi_texture_staging.h
deleted file mode 100644
index a7e9b86..0000000
--- a/modules/desktop_capture/win/dxgi_texture_staging.h
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- *  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_DESKTOP_CAPTURE_WIN_DXGI_TEXTURE_STAGING_H_
-#define WEBRTC_MODULES_DESKTOP_CAPTURE_WIN_DXGI_TEXTURE_STAGING_H_
-
-#include <wrl/client.h>
-#include <D3D11.h>
-#include <DXGI1_2.h>
-
-#include "webrtc/modules/desktop_capture/desktop_geometry.h"
-#include "webrtc/modules/desktop_capture/desktop_region.h"
-#include "webrtc/modules/desktop_capture/win/d3d_device.h"
-#include "webrtc/modules/desktop_capture/win/dxgi_texture.h"
-
-namespace webrtc {
-
-// A pair of an ID3D11Texture2D and an IDXGISurface. We need an ID3D11Texture2D
-// instance to copy GPU texture to RAM, but an IDXGISurface instance to map the
-// texture into a bitmap buffer. These two instances are pointing to a same
-// object.
-//
-// An ID3D11Texture2D is created by an ID3D11Device, so a DxgiTexture cannot be
-// shared between two DxgiAdapterDuplicators.
-class DxgiTextureStaging : public DxgiTexture {
- public:
-  // Creates a DxgiTextureStaging instance. Caller must maintain the lifetime
-  // of input device to make sure it outlives this instance.
-  explicit DxgiTextureStaging(const D3dDevice& device);
-
-  ~DxgiTextureStaging() override;
-
- protected:
-  // Copies selected regions of a frame represented by frame_info and texture.
-  // Returns false if anything wrong.
-  bool CopyFromTexture(const DXGI_OUTDUPL_FRAME_INFO& frame_info,
-                       ID3D11Texture2D* texture) override;
-
-  bool DoRelease() override;
-
- private:
-  // Initializes stage_ from a CPU inaccessible IDXGIResource. Returns false if
-  // it failed to execute Windows APIs, or the size of the texture is not
-  // consistent with desktop_rect.
-  bool InitializeStage(ID3D11Texture2D* texture);
-
-  // Makes sure stage_ and surface_ are always pointing to a same object.
-  // We need an ID3D11Texture2D instance for
-  // ID3D11DeviceContext::CopySubresourceRegion, but an IDXGISurface for
-  // IDXGISurface::Map.
-  void AssertStageAndSurfaceAreSameObject();
-
-  const DesktopRect desktop_rect_;
-  const D3dDevice device_;
-  Microsoft::WRL::ComPtr<ID3D11Texture2D> stage_;
-  Microsoft::WRL::ComPtr<IDXGISurface> surface_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_DESKTOP_CAPTURE_WIN_DXGI_TEXTURE_STAGING_H_
diff --git a/modules/desktop_capture/win/scoped_gdi_object.h b/modules/desktop_capture/win/scoped_gdi_object.h
deleted file mode 100644
index f0d5477..0000000
--- a/modules/desktop_capture/win/scoped_gdi_object.h
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- *  Copyright (c) 2013 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_DESKTOP_CAPTURE_WIN_SCOPED_GDI_HANDLE_H_
-#define WEBRTC_MODULES_DESKTOP_CAPTURE_WIN_SCOPED_GDI_HANDLE_H_
-
-#include <windows.h>
-
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-namespace win {
-
-// Scoper for GDI objects.
-template<class T, class Traits>
-class ScopedGDIObject {
- public:
-  ScopedGDIObject() : handle_(NULL) {}
-  explicit ScopedGDIObject(T object) : handle_(object) {}
-
-  ~ScopedGDIObject() {
-    Traits::Close(handle_);
-  }
-
-  T Get() {
-    return handle_;
-  }
-
-  void Set(T object) {
-    if (handle_ && object != handle_)
-      Traits::Close(handle_);
-    handle_ = object;
-  }
-
-  ScopedGDIObject& operator=(T object) {
-    Set(object);
-    return *this;
-  }
-
-  T release() {
-    T object = handle_;
-    handle_ = NULL;
-    return object;
-  }
-
-  operator T() { return handle_; }
-
- private:
-  T handle_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(ScopedGDIObject);
-};
-
-// The traits class that uses DeleteObject() to close a handle.
-template <typename T>
-class DeleteObjectTraits {
- public:
-  // Closes the handle.
-  static void Close(T handle) {
-    if (handle)
-      DeleteObject(handle);
-  }
-
- private:
-  RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(DeleteObjectTraits);
-};
-
-// The traits class that uses DestroyCursor() to close a handle.
-class DestroyCursorTraits {
- public:
-  // Closes the handle.
-  static void Close(HCURSOR handle) {
-    if (handle)
-      DestroyCursor(handle);
-  }
-
- private:
-  RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(DestroyCursorTraits);
-};
-
-typedef ScopedGDIObject<HBITMAP, DeleteObjectTraits<HBITMAP> > ScopedBitmap;
-typedef ScopedGDIObject<HCURSOR, DestroyCursorTraits> ScopedCursor;
-
-}  // namespace win
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_DESKTOP_CAPTURE_WIN_SCOPED_GDI_HANDLE_H_
diff --git a/modules/desktop_capture/win/scoped_thread_desktop.cc b/modules/desktop_capture/win/scoped_thread_desktop.cc
deleted file mode 100644
index aef0d04..0000000
--- a/modules/desktop_capture/win/scoped_thread_desktop.cc
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- *  Copyright (c) 2013 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/desktop_capture/win/scoped_thread_desktop.h"
-
-#include "webrtc/modules/desktop_capture/win/desktop.h"
-
-namespace webrtc {
-
-ScopedThreadDesktop::ScopedThreadDesktop()
-    : initial_(Desktop::GetThreadDesktop()) {
-}
-
-ScopedThreadDesktop::~ScopedThreadDesktop() {
-  Revert();
-}
-
-bool ScopedThreadDesktop::IsSame(const Desktop& desktop) {
-  if (assigned_.get() != NULL) {
-    return assigned_->IsSame(desktop);
-  } else {
-    return initial_->IsSame(desktop);
-  }
-}
-
-void ScopedThreadDesktop::Revert() {
-  if (assigned_.get() != NULL) {
-    initial_->SetThreadDesktop();
-    assigned_.reset();
-  }
-}
-
-bool ScopedThreadDesktop::SetThreadDesktop(Desktop* desktop) {
-  Revert();
-
-  std::unique_ptr<Desktop> scoped_desktop(desktop);
-
-  if (initial_->IsSame(*desktop))
-    return true;
-
-  if (!desktop->SetThreadDesktop())
-    return false;
-
-  assigned_.reset(scoped_desktop.release());
-  return true;
-}
-
-}  // namespace webrtc
diff --git a/modules/desktop_capture/win/scoped_thread_desktop.h b/modules/desktop_capture/win/scoped_thread_desktop.h
deleted file mode 100644
index a495beb..0000000
--- a/modules/desktop_capture/win/scoped_thread_desktop.h
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- *  Copyright (c) 2013 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_DESKTOP_CAPTURE_WIN_SCOPED_THREAD_DESKTOP_H_
-#define WEBRTC_MODULES_DESKTOP_CAPTURE_WIN_SCOPED_THREAD_DESKTOP_H_
-
-#include <memory>
-
-#include <windows.h>
-
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace webrtc {
-
-class Desktop;
-
-class ScopedThreadDesktop {
- public:
-  ScopedThreadDesktop();
-  ~ScopedThreadDesktop();
-
-  // Returns true if |desktop| has the same desktop name as the currently
-  // assigned desktop (if assigned) or as the initial desktop (if not assigned).
-  // Returns false in any other case including failing Win32 APIs and
-  // uninitialized desktop handles.
-  bool IsSame(const Desktop& desktop);
-
-  // Reverts the calling thread to use the initial desktop.
-  void Revert();
-
-  // Assigns |desktop| to be the calling thread. Returns true if the thread has
-  // been switched to |desktop| successfully. Takes ownership of |desktop|.
-  bool SetThreadDesktop(Desktop* desktop);
-
- private:
-  // The desktop handle assigned to the calling thread by Set
-  std::unique_ptr<Desktop> assigned_;
-
-  // The desktop handle assigned to the calling thread at creation.
-  std::unique_ptr<Desktop> initial_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(ScopedThreadDesktop);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_DESKTOP_CAPTURE_WIN_SCOPED_THREAD_DESKTOP_H_
diff --git a/modules/desktop_capture/win/screen_capture_utils.cc b/modules/desktop_capture/win/screen_capture_utils.cc
deleted file mode 100644
index a871845..0000000
--- a/modules/desktop_capture/win/screen_capture_utils.cc
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- *  Copyright (c) 2014 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/desktop_capture/win/screen_capture_utils.h"
-
-#include <windows.h>
-
-#include <string>
-#include <vector>
-
-#include "webrtc/modules/desktop_capture/desktop_capturer.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/win32.h"
-
-namespace webrtc {
-
-bool GetScreenList(DesktopCapturer::SourceList* screens,
-                   std::vector<std::string>* device_names /* = nullptr */) {
-  RTC_DCHECK_EQ(screens->size(), 0U);
-  if (device_names) {
-    RTC_DCHECK_EQ(device_names->size(), 0U);
-  }
-
-  BOOL enum_result = TRUE;
-  for (int device_index = 0;; ++device_index) {
-    DISPLAY_DEVICE device;
-    device.cb = sizeof(device);
-    enum_result = EnumDisplayDevices(NULL, device_index, &device, 0);
-
-    // |enum_result| is 0 if we have enumerated all devices.
-    if (!enum_result)
-      break;
-
-    // We only care about active displays.
-    if (!(device.StateFlags & DISPLAY_DEVICE_ACTIVE))
-      continue;
-
-    screens->push_back({device_index, std::string()});
-    if (device_names) {
-      device_names->push_back(rtc::ToUtf8(device.DeviceName));
-    }
-  }
-  return true;
-}
-
-bool IsScreenValid(DesktopCapturer::SourceId screen, std::wstring* device_key) {
-  if (screen == kFullDesktopScreenId) {
-    *device_key = L"";
-    return true;
-  }
-
-  DISPLAY_DEVICE device;
-  device.cb = sizeof(device);
-  BOOL enum_result = EnumDisplayDevices(NULL, screen, &device, 0);
-  if (enum_result)
-    *device_key = device.DeviceKey;
-
-  return !!enum_result;
-}
-
-DesktopRect GetFullscreenRect() {
-  return DesktopRect::MakeXYWH(GetSystemMetrics(SM_XVIRTUALSCREEN),
-                               GetSystemMetrics(SM_YVIRTUALSCREEN),
-                               GetSystemMetrics(SM_CXVIRTUALSCREEN),
-                               GetSystemMetrics(SM_CYVIRTUALSCREEN));
-}
-
-DesktopRect GetScreenRect(DesktopCapturer::SourceId screen,
-                          const std::wstring& device_key) {
-  if (screen == kFullDesktopScreenId) {
-    return GetFullscreenRect();
-  }
-
-  DISPLAY_DEVICE device;
-  device.cb = sizeof(device);
-  BOOL result = EnumDisplayDevices(NULL, screen, &device, 0);
-  if (!result)
-    return DesktopRect();
-
-  // Verifies the device index still maps to the same display device, to make
-  // sure we are capturing the same device when devices are added or removed.
-  // DeviceKey is documented as reserved, but it actually contains the registry
-  // key for the device and is unique for each monitor, while DeviceID is not.
-  if (device_key != device.DeviceKey)
-    return DesktopRect();
-
-  DEVMODE device_mode;
-  device_mode.dmSize = sizeof(device_mode);
-  device_mode.dmDriverExtra = 0;
-  result = EnumDisplaySettingsEx(
-      device.DeviceName, ENUM_CURRENT_SETTINGS, &device_mode, 0);
-  if (!result)
-    return DesktopRect();
-
-  return DesktopRect::MakeXYWH(device_mode.dmPosition.x,
-                               device_mode.dmPosition.y,
-                               device_mode.dmPelsWidth,
-                               device_mode.dmPelsHeight);
-}
-
-}  // namespace webrtc
diff --git a/modules/desktop_capture/win/screen_capture_utils.h b/modules/desktop_capture/win/screen_capture_utils.h
deleted file mode 100644
index fdbf633..0000000
--- a/modules/desktop_capture/win/screen_capture_utils.h
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- *  Copyright (c) 2014 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_DESKTOP_CAPTURE_WIN_SCREEN_CAPTURE_UTILS_H_
-#define WEBRTC_MODULES_DESKTOP_CAPTURE_WIN_SCREEN_CAPTURE_UTILS_H_
-
-#include <vector>
-#include <string>
-
-#include "webrtc/modules/desktop_capture/desktop_capturer.h"
-
-namespace webrtc {
-
-// Output the list of active screens into |screens|. Returns true if succeeded,
-// or false if it fails to enumerate the display devices. If the |device_names|
-// is provided, it will be filled with the DISPLAY_DEVICE.DeviceName in UTF-8
-// encoding. If this function returns true, consumers can always assume that
-// |screens|[i] and |device_names|[i] indicate the same monitor on the system.
-bool GetScreenList(DesktopCapturer::SourceList* screens,
-                   std::vector<std::string>* device_names = nullptr);
-
-// Returns true if |screen| is a valid screen. The screen device key is
-// returned through |device_key| if the screen is valid. The device key can be
-// used in GetScreenRect to verify the screen matches the previously obtained
-// id.
-bool IsScreenValid(DesktopCapturer::SourceId screen, std::wstring* device_key);
-
-// Get the rect of the entire system in system coordinate system. I.e. the
-// primary monitor always starts from (0, 0).
-DesktopRect GetFullscreenRect();
-
-// Get the rect of the screen identified by |screen|, relative to the primary
-// display's top-left. If the screen device key does not match |device_key|, or
-// the screen does not exist, or any error happens, an empty rect is returned.
-DesktopRect GetScreenRect(DesktopCapturer::SourceId screen,
-                          const std::wstring& device_key);
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_DESKTOP_CAPTURE_WIN_SCREEN_CAPTURE_UTILS_H_
diff --git a/modules/desktop_capture/win/screen_capture_utils_unittest.cc b/modules/desktop_capture/win/screen_capture_utils_unittest.cc
deleted file mode 100644
index 47f02e4..0000000
--- a/modules/desktop_capture/win/screen_capture_utils_unittest.cc
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- *  Copyright (c) 2017 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/desktop_capture/win/screen_capture_utils.h"
-
-#include <vector>
-#include <string>
-
-#include "webrtc/modules/desktop_capture/desktop_capturer.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-TEST(ScreenCaptureUtilsTest, GetScreenList) {
-  DesktopCapturer::SourceList screens;
-  std::vector<std::string> device_names;
-
-  ASSERT_TRUE(GetScreenList(&screens));
-  screens.clear();
-  ASSERT_TRUE(GetScreenList(&screens, &device_names));
-
-  ASSERT_EQ(screens.size(), device_names.size());
-}
-
-}  // namespace webrtc
diff --git a/modules/desktop_capture/win/screen_capturer_win_directx.cc b/modules/desktop_capture/win/screen_capturer_win_directx.cc
deleted file mode 100644
index c4d778f..0000000
--- a/modules/desktop_capture/win/screen_capturer_win_directx.cc
+++ /dev/null
@@ -1,204 +0,0 @@
-/*
- *  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/desktop_capture/win/screen_capturer_win_directx.h"
-
-#include <algorithm>
-#include <string>
-#include <utility>
-#include <vector>
-
-#include "webrtc/modules/desktop_capture/desktop_frame.h"
-#include "webrtc/modules/desktop_capture/win/screen_capture_utils.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/ptr_util.h"
-#include "webrtc/rtc_base/timeutils.h"
-
-namespace webrtc {
-
-using Microsoft::WRL::ComPtr;
-
-// static
-bool ScreenCapturerWinDirectx::IsSupported() {
-  // Forwards IsSupported() function call to DxgiDuplicatorController.
-  return DxgiDuplicatorController::Instance()->IsSupported();
-}
-
-// static
-bool ScreenCapturerWinDirectx::RetrieveD3dInfo(D3dInfo* info) {
-  // Forwards SupportedFeatureLevels() function call to
-  // DxgiDuplicatorController.
-  return DxgiDuplicatorController::Instance()->RetrieveD3dInfo(info);
-}
-
-// static
-bool ScreenCapturerWinDirectx::IsCurrentSessionSupported() {
-  return DxgiDuplicatorController::IsCurrentSessionSupported();
-}
-
-// static
-bool ScreenCapturerWinDirectx::GetScreenListFromDeviceNames(
-    const std::vector<std::string>& device_names,
-    DesktopCapturer::SourceList* screens) {
-  RTC_DCHECK(screens->empty());
-
-  DesktopCapturer::SourceList gdi_screens;
-  std::vector<std::string> gdi_names;
-  if (!GetScreenList(&gdi_screens, &gdi_names)) {
-    return false;
-  }
-
-  RTC_DCHECK_EQ(gdi_screens.size(), gdi_names.size());
-
-  ScreenId max_screen_id = -1;
-  for (const DesktopCapturer::Source& screen : gdi_screens) {
-    max_screen_id = std::max(max_screen_id, screen.id);
-  }
-
-  for (const auto& device_name : device_names) {
-    const auto it = std::find(
-        gdi_names.begin(), gdi_names.end(), device_name);
-    if (it == gdi_names.end()) {
-      // devices_names[i] has not been found in gdi_names, so use max_screen_id.
-      max_screen_id++;
-      screens->push_back({ max_screen_id });
-    } else {
-      screens->push_back({ gdi_screens[it - gdi_names.begin()] });
-    }
-  }
-
-  return true;
-}
-
-// static
-int ScreenCapturerWinDirectx::GetIndexFromScreenId(
-    ScreenId id,
-    const std::vector<std::string>& device_names) {
-  DesktopCapturer::SourceList screens;
-  if (!GetScreenListFromDeviceNames(device_names, &screens)) {
-    return -1;
-  }
-
-  RTC_DCHECK_EQ(device_names.size(), screens.size());
-
-  for (size_t i = 0; i < screens.size(); i++) {
-    if (screens[i].id == id) {
-      return static_cast<int>(i);
-    }
-  }
-
-  return -1;
-}
-
-ScreenCapturerWinDirectx::ScreenCapturerWinDirectx()
-    : controller_(DxgiDuplicatorController::Instance()) {}
-
-ScreenCapturerWinDirectx::~ScreenCapturerWinDirectx() = default;
-
-void ScreenCapturerWinDirectx::Start(Callback* callback) {
-  RTC_DCHECK(!callback_);
-  RTC_DCHECK(callback);
-
-  callback_ = callback;
-}
-
-void ScreenCapturerWinDirectx::SetSharedMemoryFactory(
-    std::unique_ptr<SharedMemoryFactory> shared_memory_factory) {
-  shared_memory_factory_ = std::move(shared_memory_factory);
-}
-
-void ScreenCapturerWinDirectx::CaptureFrame() {
-  RTC_DCHECK(callback_);
-
-  int64_t capture_start_time_nanos = rtc::TimeNanos();
-
-  frames_.MoveToNextFrame();
-  if (!frames_.current_frame()) {
-    frames_.ReplaceCurrentFrame(
-        rtc::MakeUnique<DxgiFrame>(shared_memory_factory_.get()));
-  }
-
-  DxgiDuplicatorController::Result result;
-  if (current_screen_id_ == kFullDesktopScreenId) {
-    result = controller_->Duplicate(frames_.current_frame());
-  } else {
-    result = controller_->DuplicateMonitor(
-        frames_.current_frame(), current_screen_id_);
-  }
-
-  using DuplicateResult = DxgiDuplicatorController::Result;
-  switch (result) {
-    case DuplicateResult::UNSUPPORTED_SESSION: {
-      LOG(LS_ERROR) << "Current binary is running on a session not supported "
-                       "by DirectX screen capturer.";
-      callback_->OnCaptureResult(Result::ERROR_PERMANENT, nullptr);
-      break;
-    }
-    case DuplicateResult::FRAME_PREPARE_FAILED: {
-      LOG(LS_ERROR) << "Failed to allocate a new DesktopFrame.";
-      // This usually means we do not have enough memory or SharedMemoryFactory
-      // cannot work correctly.
-      callback_->OnCaptureResult(Result::ERROR_PERMANENT, nullptr);
-      break;
-    }
-    case DuplicateResult::INVALID_MONITOR_ID: {
-      callback_->OnCaptureResult(Result::ERROR_PERMANENT, nullptr);
-      break;
-    }
-    case DuplicateResult::INITIALIZATION_FAILED:
-    case DuplicateResult::DUPLICATION_FAILED: {
-      callback_->OnCaptureResult(Result::ERROR_TEMPORARY, nullptr);
-      break;
-    }
-    case DuplicateResult::SUCCEEDED: {
-      std::unique_ptr<DesktopFrame> frame =
-          frames_.current_frame()->frame()->Share();
-      frame->set_capture_time_ms(
-          (rtc::TimeNanos() - capture_start_time_nanos) /
-          rtc::kNumNanosecsPerMillisec);
-      frame->set_capturer_id(DesktopCapturerId::kScreenCapturerWinDirectx);
-      callback_->OnCaptureResult(Result::SUCCESS, std::move(frame));
-      break;
-    }
-  }
-}
-
-bool ScreenCapturerWinDirectx::GetSourceList(SourceList* sources) {
-  std::vector<std::string> device_names;
-  if (!controller_->GetDeviceNames(&device_names)) {
-    return false;
-  }
-
-  return GetScreenListFromDeviceNames(device_names, sources);
-}
-
-bool ScreenCapturerWinDirectx::SelectSource(SourceId id) {
-  if (id == kFullDesktopScreenId) {
-    current_screen_id_ = id;
-    return true;
-  }
-
-  std::vector<std::string> device_names;
-  if (!controller_->GetDeviceNames(&device_names)) {
-    return false;
-  }
-
-  int index;
-  index = GetIndexFromScreenId(id, device_names);
-  if (index == -1) {
-    return false;
-  }
-
-  current_screen_id_ = index;
-  return true;
-}
-
-}  // namespace webrtc
diff --git a/modules/desktop_capture/win/screen_capturer_win_directx.h b/modules/desktop_capture/win/screen_capturer_win_directx.h
deleted file mode 100644
index b91882c..0000000
--- a/modules/desktop_capture/win/screen_capturer_win_directx.h
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- *  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_DESKTOP_CAPTURE_WIN_SCREEN_CAPTURER_WIN_DIRECTX_H_
-#define WEBRTC_MODULES_DESKTOP_CAPTURE_WIN_SCREEN_CAPTURER_WIN_DIRECTX_H_
-
-#include <D3DCommon.h>
-
-#include <memory>
-#include <vector>
-
-#include "webrtc/modules/desktop_capture/desktop_capture_options.h"
-#include "webrtc/modules/desktop_capture/desktop_capturer.h"
-#include "webrtc/modules/desktop_capture/desktop_region.h"
-#include "webrtc/modules/desktop_capture/screen_capture_frame_queue.h"
-#include "webrtc/modules/desktop_capture/win/dxgi_duplicator_controller.h"
-#include "webrtc/modules/desktop_capture/win/dxgi_frame.h"
-#include "webrtc/rtc_base/scoped_ref_ptr.h"
-
-namespace webrtc {
-
-// ScreenCapturerWinDirectx captures 32bit RGBA using DirectX.
-class ScreenCapturerWinDirectx : public DesktopCapturer {
- public:
-  using D3dInfo = DxgiDuplicatorController::D3dInfo;
-
-  // Whether the system supports DirectX based capturing.
-  static bool IsSupported();
-
-  // Returns a most recent D3dInfo composed by
-  // DxgiDuplicatorController::Initialize() function. This function implicitly
-  // calls DxgiDuplicatorController::Initialize() if it has not been
-  // initialized. This function returns false and output parameter is kept
-  // unchanged if DxgiDuplicatorController::Initialize() failed.
-  // The D3dInfo may change based on hardware configuration even without
-  // restarting the hardware and software. Refer to https://goo.gl/OOCppq. So
-  // consumers should not cache the result returned by this function.
-  static bool RetrieveD3dInfo(D3dInfo* info);
-
-  // Whether current process is running in a Windows session which is supported
-  // by ScreenCapturerWinDirectx.
-  // Usually using ScreenCapturerWinDirectx in unsupported sessions will fail.
-  // But this behavior may vary on different Windows version. So consumers can
-  // always try IsSupported() function.
-  static bool IsCurrentSessionSupported();
-
-  // Maps |device_names| with the result from GetScreenList() and creates a new
-  // SourceList to include only the ones in |device_names|. If this function
-  // returns true, consumers can always assume |device_names|.size() equals to
-  // |screens|->size(), meanwhile |device_names|[i] and |screens|[i] indicate
-  // the same monitor on the system.
-  // Public for test only.
-  static bool GetScreenListFromDeviceNames(
-      const std::vector<std::string>& device_names,
-      DesktopCapturer::SourceList* screens);
-
-  // Maps |id| with the result from GetScreenListFromDeviceNames() and returns
-  // the index of the entity in |device_names|. This function returns -1 if |id|
-  // cannot be found.
-  // Public for test only.
-  static int GetIndexFromScreenId(ScreenId id,
-                                  const std::vector<std::string>& device_names);
-
-  explicit ScreenCapturerWinDirectx();
-
-  ~ScreenCapturerWinDirectx() override;
-
-  // DesktopCapturer implementation.
-  void Start(Callback* callback) override;
-  void SetSharedMemoryFactory(
-      std::unique_ptr<SharedMemoryFactory> shared_memory_factory) override;
-  void CaptureFrame() override;
-  bool GetSourceList(SourceList* sources) override;
-  bool SelectSource(SourceId id) override;
-
- private:
-  const rtc::scoped_refptr<DxgiDuplicatorController> controller_;
-  ScreenCaptureFrameQueue<DxgiFrame> frames_;
-  std::unique_ptr<SharedMemoryFactory> shared_memory_factory_;
-  Callback* callback_ = nullptr;
-  SourceId current_screen_id_ = kFullDesktopScreenId;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(ScreenCapturerWinDirectx);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_DESKTOP_CAPTURE_WIN_SCREEN_CAPTURER_WIN_DIRECTX_H_
diff --git a/modules/desktop_capture/win/screen_capturer_win_directx_unittest.cc b/modules/desktop_capture/win/screen_capturer_win_directx_unittest.cc
deleted file mode 100644
index 577be0a..0000000
--- a/modules/desktop_capture/win/screen_capturer_win_directx_unittest.cc
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- *  Copyright (c) 2017 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/desktop_capture/win/screen_capturer_win_directx.h"
-
-#include <vector>
-#include <string>
-
-#include "webrtc/modules/desktop_capture/desktop_capturer.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-// This test cannot ensure GetScreenListFromDeviceNames() won't reorder the
-// devices in its output, since the device name is missing.
-TEST(ScreenCaptureUtilsTest, GetScreenListFromDeviceNamesAndGetIndex) {
-  const std::vector<std::string> device_names = {
-    "\\\\.\\DISPLAY0",
-    "\\\\.\\DISPLAY1",
-    "\\\\.\\DISPLAY2",
-  };
-  DesktopCapturer::SourceList screens;
-  ASSERT_TRUE(ScreenCapturerWinDirectx::GetScreenListFromDeviceNames(
-      device_names, &screens));
-  ASSERT_EQ(device_names.size(), screens.size());
-
-  for (size_t i = 0; i < screens.size(); i++) {
-    ASSERT_EQ(ScreenCapturerWinDirectx::GetIndexFromScreenId(
-                  screens[i].id, device_names),
-              static_cast<int>(i));
-  }
-}
-
-}  // namespace webrtc
diff --git a/modules/desktop_capture/win/screen_capturer_win_gdi.cc b/modules/desktop_capture/win/screen_capturer_win_gdi.cc
deleted file mode 100644
index 10e3ca4..0000000
--- a/modules/desktop_capture/win/screen_capturer_win_gdi.cc
+++ /dev/null
@@ -1,224 +0,0 @@
-/*
- *  Copyright (c) 2014 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/desktop_capture/win/screen_capturer_win_gdi.h"
-
-#include <utility>
-
-#include "webrtc/modules/desktop_capture/desktop_capture_options.h"
-#include "webrtc/modules/desktop_capture/desktop_frame.h"
-#include "webrtc/modules/desktop_capture/desktop_frame_win.h"
-#include "webrtc/modules/desktop_capture/desktop_region.h"
-#include "webrtc/modules/desktop_capture/mouse_cursor.h"
-#include "webrtc/modules/desktop_capture/win/cursor.h"
-#include "webrtc/modules/desktop_capture/win/desktop.h"
-#include "webrtc/modules/desktop_capture/win/screen_capture_utils.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/timeutils.h"
-
-namespace webrtc {
-
-namespace {
-
-// Constants from dwmapi.h.
-const UINT DWM_EC_DISABLECOMPOSITION = 0;
-const UINT DWM_EC_ENABLECOMPOSITION = 1;
-
-const wchar_t kDwmapiLibraryName[] = L"dwmapi.dll";
-
-}  // namespace
-
-ScreenCapturerWinGdi::ScreenCapturerWinGdi(
-    const DesktopCaptureOptions& options) {
-  if (options.disable_effects()) {
-    // Load dwmapi.dll dynamically since it is not available on XP.
-    if (!dwmapi_library_)
-      dwmapi_library_ = LoadLibrary(kDwmapiLibraryName);
-
-    if (dwmapi_library_) {
-      composition_func_ = reinterpret_cast<DwmEnableCompositionFunc>(
-          GetProcAddress(dwmapi_library_, "DwmEnableComposition"));
-    }
-  }
-}
-
-ScreenCapturerWinGdi::~ScreenCapturerWinGdi() {
-  if (desktop_dc_)
-    ReleaseDC(NULL, desktop_dc_);
-  if (memory_dc_)
-    DeleteDC(memory_dc_);
-
-  // Restore Aero.
-  if (composition_func_)
-    (*composition_func_)(DWM_EC_ENABLECOMPOSITION);
-
-  if (dwmapi_library_)
-    FreeLibrary(dwmapi_library_);
-}
-
-void ScreenCapturerWinGdi::SetSharedMemoryFactory(
-    std::unique_ptr<SharedMemoryFactory> shared_memory_factory) {
-  shared_memory_factory_ = std::move(shared_memory_factory);
-}
-
-void ScreenCapturerWinGdi::CaptureFrame() {
-  int64_t capture_start_time_nanos = rtc::TimeNanos();
-
-  queue_.MoveToNextFrame();
-  RTC_DCHECK(!queue_.current_frame() || !queue_.current_frame()->IsShared());
-
-  // Make sure the GDI capture resources are up-to-date.
-  PrepareCaptureResources();
-
-  if (!CaptureImage()) {
-    callback_->OnCaptureResult(Result::ERROR_TEMPORARY, nullptr);
-    return;
-  }
-
-  // Emit the current frame.
-  std::unique_ptr<DesktopFrame> frame = queue_.current_frame()->Share();
-  frame->set_dpi(DesktopVector(
-      GetDeviceCaps(desktop_dc_, LOGPIXELSX),
-      GetDeviceCaps(desktop_dc_, LOGPIXELSY)));
-  frame->mutable_updated_region()->SetRect(
-      DesktopRect::MakeSize(frame->size()));
-  frame->set_capture_time_ms(
-      (rtc::TimeNanos() - capture_start_time_nanos) /
-      rtc::kNumNanosecsPerMillisec);
-  frame->set_capturer_id(DesktopCapturerId::kScreenCapturerWinGdi);
-  callback_->OnCaptureResult(Result::SUCCESS, std::move(frame));
-}
-
-bool ScreenCapturerWinGdi::GetSourceList(SourceList* sources) {
-  return webrtc::GetScreenList(sources);
-}
-
-bool ScreenCapturerWinGdi::SelectSource(SourceId id) {
-  bool valid = IsScreenValid(id, &current_device_key_);
-  if (valid)
-    current_screen_id_ = id;
-  return valid;
-}
-
-void ScreenCapturerWinGdi::Start(Callback* callback) {
-  RTC_DCHECK(!callback_);
-  RTC_DCHECK(callback);
-
-  callback_ = callback;
-
-  // Vote to disable Aero composited desktop effects while capturing. Windows
-  // will restore Aero automatically if the process exits. This has no effect
-  // under Windows 8 or higher.  See crbug.com/124018.
-  if (composition_func_)
-    (*composition_func_)(DWM_EC_DISABLECOMPOSITION);
-}
-
-void ScreenCapturerWinGdi::PrepareCaptureResources() {
-  // Switch to the desktop receiving user input if different from the current
-  // one.
-  std::unique_ptr<Desktop> input_desktop(Desktop::GetInputDesktop());
-  if (input_desktop && !desktop_.IsSame(*input_desktop)) {
-    // Release GDI resources otherwise SetThreadDesktop will fail.
-    if (desktop_dc_) {
-      ReleaseDC(NULL, desktop_dc_);
-      desktop_dc_ = nullptr;
-    }
-
-    if (memory_dc_) {
-      DeleteDC(memory_dc_);
-      memory_dc_ = nullptr;
-    }
-
-    // If SetThreadDesktop() fails, the thread is still assigned a desktop.
-    // So we can continue capture screen bits, just from the wrong desktop.
-    desktop_.SetThreadDesktop(input_desktop.release());
-
-    // Re-assert our vote to disable Aero.
-    // See crbug.com/124018 and crbug.com/129906.
-    if (composition_func_) {
-      (*composition_func_)(DWM_EC_DISABLECOMPOSITION);
-    }
-  }
-
-  // If the display configurations have changed then recreate GDI resources.
-  if (display_configuration_monitor_.IsChanged()) {
-    if (desktop_dc_) {
-      ReleaseDC(NULL, desktop_dc_);
-      desktop_dc_ = nullptr;
-    }
-    if (memory_dc_) {
-      DeleteDC(memory_dc_);
-      memory_dc_ = nullptr;
-    }
-  }
-
-  if (!desktop_dc_) {
-    RTC_DCHECK(!memory_dc_);
-
-    // Create GDI device contexts to capture from the desktop into memory.
-    desktop_dc_ = GetDC(nullptr);
-    RTC_CHECK(desktop_dc_);
-    memory_dc_ = CreateCompatibleDC(desktop_dc_);
-    RTC_CHECK(memory_dc_);
-
-    // Make sure the frame buffers will be reallocated.
-    queue_.Reset();
-  }
-}
-
-bool ScreenCapturerWinGdi::CaptureImage() {
-  DesktopRect screen_rect =
-      GetScreenRect(current_screen_id_, current_device_key_);
-  if (screen_rect.is_empty())
-    return false;
-
-  DesktopSize size = screen_rect.size();
-  // If the current buffer is from an older generation then allocate a new one.
-  // Note that we can't reallocate other buffers at this point, since the caller
-  // may still be reading from them.
-  if (!queue_.current_frame() ||
-      !queue_.current_frame()->size().equals(screen_rect.size())) {
-    RTC_DCHECK(desktop_dc_);
-    RTC_DCHECK(memory_dc_);
-
-    std::unique_ptr<DesktopFrame> buffer = DesktopFrameWin::Create(
-        size, shared_memory_factory_.get(), desktop_dc_);
-    if (!buffer)
-      return false;
-    queue_.ReplaceCurrentFrame(SharedDesktopFrame::Wrap(std::move(buffer)));
-  }
-  queue_.current_frame()->set_top_left(
-      screen_rect.top_left().subtract(GetFullscreenRect().top_left()));
-
-  // Select the target bitmap into the memory dc and copy the rect from desktop
-  // to memory.
-  DesktopFrameWin* current = static_cast<DesktopFrameWin*>(
-      queue_.current_frame()->GetUnderlyingFrame());
-  HGDIOBJ previous_object = SelectObject(memory_dc_, current->bitmap());
-  if (!previous_object || previous_object == HGDI_ERROR) {
-    return false;
-  }
-
-  bool result = (BitBlt(memory_dc_, 0, 0, screen_rect.width(),
-      screen_rect.height(), desktop_dc_, screen_rect.left(), screen_rect.top(),
-      SRCCOPY | CAPTUREBLT) != FALSE);
-  if (!result) {
-    LOG_GLE(LS_WARNING) << "BitBlt failed";
-  }
-
-  // Select back the previously selected object to that the device contect
-  // could be destroyed independently of the bitmap if needed.
-  SelectObject(memory_dc_, previous_object);
-
-  return result;
-}
-
-}  // namespace webrtc
diff --git a/modules/desktop_capture/win/screen_capturer_win_gdi.h b/modules/desktop_capture/win/screen_capturer_win_gdi.h
deleted file mode 100644
index 6822895..0000000
--- a/modules/desktop_capture/win/screen_capturer_win_gdi.h
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- *  Copyright (c) 2014 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_DESKTOP_CAPTURE_WIN_SCREEN_CAPTURER_WIN_GDI_H_
-#define WEBRTC_MODULES_DESKTOP_CAPTURE_WIN_SCREEN_CAPTURER_WIN_GDI_H_
-
-#include <memory>
-
-#include <windows.h>
-
-#include "webrtc/modules/desktop_capture/desktop_capturer.h"
-#include "webrtc/modules/desktop_capture/screen_capture_frame_queue.h"
-#include "webrtc/modules/desktop_capture/shared_desktop_frame.h"
-#include "webrtc/modules/desktop_capture/win/display_configuration_monitor.h"
-#include "webrtc/modules/desktop_capture/win/scoped_thread_desktop.h"
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace webrtc {
-
-// ScreenCapturerWinGdi captures 32bit RGB using GDI.
-//
-// ScreenCapturerWinGdi is double-buffered as required by ScreenCapturer.
-// This class does not detect DesktopFrame::updated_region(), the field is
-// always set to the entire frame rectangle. ScreenCapturerDifferWrapper should
-// be used if that functionality is necessary.
-class ScreenCapturerWinGdi : public DesktopCapturer {
- public:
-  explicit ScreenCapturerWinGdi(const DesktopCaptureOptions& options);
-  ~ScreenCapturerWinGdi() override;
-
-  // Overridden from ScreenCapturer:
-  void Start(Callback* callback) override;
-  void SetSharedMemoryFactory(
-      std::unique_ptr<SharedMemoryFactory> shared_memory_factory) override;
-  void CaptureFrame() override;
-  bool GetSourceList(SourceList* sources) override;
-  bool SelectSource(SourceId id) override;
-
- private:
-  typedef HRESULT (WINAPI * DwmEnableCompositionFunc)(UINT);
-
-  // Make sure that the device contexts match the screen configuration.
-  void PrepareCaptureResources();
-
-  // Captures the current screen contents into the current buffer. Returns true
-  // if succeeded.
-  bool CaptureImage();
-
-  // Capture the current cursor shape.
-  void CaptureCursor();
-
-  Callback* callback_ = nullptr;
-  std::unique_ptr<SharedMemoryFactory> shared_memory_factory_;
-  SourceId current_screen_id_ = kFullDesktopScreenId;
-  std::wstring current_device_key_;
-
-  ScopedThreadDesktop desktop_;
-
-  // GDI resources used for screen capture.
-  HDC desktop_dc_ = NULL;
-  HDC memory_dc_ = NULL;
-
-  // Queue of the frames buffers.
-  ScreenCaptureFrameQueue<SharedDesktopFrame> queue_;
-
-  DisplayConfigurationMonitor display_configuration_monitor_;
-
-  HMODULE dwmapi_library_ = NULL;
-  DwmEnableCompositionFunc composition_func_ = nullptr;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(ScreenCapturerWinGdi);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_DESKTOP_CAPTURE_WIN_SCREEN_CAPTURER_WIN_GDI_H_
diff --git a/modules/desktop_capture/win/screen_capturer_win_magnifier.cc b/modules/desktop_capture/win/screen_capturer_win_magnifier.cc
deleted file mode 100644
index f744f42..0000000
--- a/modules/desktop_capture/win/screen_capturer_win_magnifier.cc
+++ /dev/null
@@ -1,370 +0,0 @@
-/*
- *  Copyright (c) 2014 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/desktop_capture/win/screen_capturer_win_magnifier.h"
-
-#include <utility>
-
-#include "webrtc/modules/desktop_capture/desktop_capture_options.h"
-#include "webrtc/modules/desktop_capture/desktop_frame.h"
-#include "webrtc/modules/desktop_capture/desktop_frame_win.h"
-#include "webrtc/modules/desktop_capture/desktop_region.h"
-#include "webrtc/modules/desktop_capture/mouse_cursor.h"
-#include "webrtc/modules/desktop_capture/win/cursor.h"
-#include "webrtc/modules/desktop_capture/win/desktop.h"
-#include "webrtc/modules/desktop_capture/win/screen_capture_utils.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/timeutils.h"
-
-namespace webrtc {
-
-// kMagnifierWindowClass has to be "Magnifier" according to the Magnification
-// API. The other strings can be anything.
-static LPCTSTR kMagnifierHostClass = L"ScreenCapturerWinMagnifierHost";
-static LPCTSTR kHostWindowName = L"MagnifierHost";
-static LPCTSTR kMagnifierWindowClass = L"Magnifier";
-static LPCTSTR kMagnifierWindowName = L"MagnifierWindow";
-
-Atomic32 ScreenCapturerWinMagnifier::tls_index_(TLS_OUT_OF_INDEXES);
-
-ScreenCapturerWinMagnifier::ScreenCapturerWinMagnifier() = default;
-ScreenCapturerWinMagnifier::~ScreenCapturerWinMagnifier() {
-  // DestroyWindow must be called before MagUninitialize. magnifier_window_ is
-  // destroyed automatically when host_window_ is destroyed.
-  if (host_window_)
-    DestroyWindow(host_window_);
-
-  if (magnifier_initialized_)
-    mag_uninitialize_func_();
-
-  if (mag_lib_handle_)
-    FreeLibrary(mag_lib_handle_);
-
-  if (desktop_dc_)
-    ReleaseDC(NULL, desktop_dc_);
-}
-
-void ScreenCapturerWinMagnifier::Start(Callback* callback) {
-  RTC_DCHECK(!callback_);
-  RTC_DCHECK(callback);
-  callback_ = callback;
-
-  if (!InitializeMagnifier()) {
-    LOG_F(LS_WARNING) << "Magnifier initialization failed.";
-  }
-}
-
-void ScreenCapturerWinMagnifier::SetSharedMemoryFactory(
-    std::unique_ptr<SharedMemoryFactory> shared_memory_factory) {
-  shared_memory_factory_ = std::move(shared_memory_factory);
-}
-
-void ScreenCapturerWinMagnifier::CaptureFrame() {
-  RTC_DCHECK(callback_);
-  if (!magnifier_initialized_) {
-    LOG_F(LS_WARNING) << "Magnifier initialization failed.";
-    callback_->OnCaptureResult(Result::ERROR_PERMANENT, nullptr);
-    return;
-  }
-
-  int64_t capture_start_time_nanos = rtc::TimeNanos();
-
-  // Switch to the desktop receiving user input if different from the current
-  // one.
-  std::unique_ptr<Desktop> input_desktop(Desktop::GetInputDesktop());
-  if (input_desktop.get() != NULL && !desktop_.IsSame(*input_desktop)) {
-    // Release GDI resources otherwise SetThreadDesktop will fail.
-    if (desktop_dc_) {
-      ReleaseDC(NULL, desktop_dc_);
-      desktop_dc_ = NULL;
-    }
-    // If SetThreadDesktop() fails, the thread is still assigned a desktop.
-    // So we can continue capture screen bits, just from the wrong desktop.
-    desktop_.SetThreadDesktop(input_desktop.release());
-  }
-
-  DesktopRect rect = GetScreenRect(current_screen_id_, current_device_key_);
-  queue_.MoveToNextFrame();
-  CreateCurrentFrameIfNecessary(rect.size());
-  // CaptureImage may fail in some situations, e.g. windows8 metro mode. So
-  // defer to the fallback capturer if magnifier capturer did not work.
-  if (!CaptureImage(rect)) {
-    LOG_F(LS_WARNING) << "Magnifier capturer failed to capture a frame.";
-    callback_->OnCaptureResult(Result::ERROR_PERMANENT, nullptr);
-    return;
-  }
-
-  // Emit the current frame.
-  std::unique_ptr<DesktopFrame> frame = queue_.current_frame()->Share();
-  frame->set_dpi(DesktopVector(GetDeviceCaps(desktop_dc_, LOGPIXELSX),
-                               GetDeviceCaps(desktop_dc_, LOGPIXELSY)));
-  frame->mutable_updated_region()->SetRect(
-      DesktopRect::MakeSize(frame->size()));
-  frame->set_capture_time_ms((rtc::TimeNanos() - capture_start_time_nanos) /
-                             rtc::kNumNanosecsPerMillisec);
-  callback_->OnCaptureResult(Result::SUCCESS, std::move(frame));
-}
-
-bool ScreenCapturerWinMagnifier::GetSourceList(SourceList* sources) {
-  return webrtc::GetScreenList(sources);
-}
-
-bool ScreenCapturerWinMagnifier::SelectSource(SourceId id) {
-  if (IsScreenValid(id, &current_device_key_)) {
-    current_screen_id_ = id;
-    return true;
-  }
-
-  return false;
-}
-
-void ScreenCapturerWinMagnifier::SetExcludedWindow(WindowId excluded_window) {
-  excluded_window_ = (HWND)excluded_window;
-  if (excluded_window_ && magnifier_initialized_) {
-    set_window_filter_list_func_(
-        magnifier_window_, MW_FILTERMODE_EXCLUDE, 1, &excluded_window_);
-  }
-}
-
-bool ScreenCapturerWinMagnifier::CaptureImage(const DesktopRect& rect) {
-  RTC_DCHECK(magnifier_initialized_);
-
-  // Set the magnifier control to cover the captured rect. The content of the
-  // magnifier control will be the captured image.
-  BOOL result = SetWindowPos(magnifier_window_, NULL, rect.left(), rect.top(),
-                             rect.width(), rect.height(), 0);
-  if (!result) {
-    LOG_F(LS_WARNING) << "Failed to call SetWindowPos: " << GetLastError()
-                      << ". Rect = {" << rect.left() << ", " << rect.top()
-                      << ", " << rect.right() << ", " << rect.bottom() << "}";
-    return false;
-  }
-
-  magnifier_capture_succeeded_ = false;
-
-  RECT native_rect = {rect.left(), rect.top(), rect.right(), rect.bottom()};
-
-  RTC_DCHECK(tls_index_.Value() != static_cast<int32_t>(TLS_OUT_OF_INDEXES));
-  TlsSetValue(tls_index_.Value(), this);
-  // OnCaptured will be called via OnMagImageScalingCallback and fill in the
-  // frame before set_window_source_func_ returns.
-  result = set_window_source_func_(magnifier_window_, native_rect);
-
-  if (!result) {
-    LOG_F(LS_WARNING) << "Failed to call MagSetWindowSource: " << GetLastError()
-                      << ". Rect = {" << rect.left() << ", " << rect.top()
-                      << ", " << rect.right() << ", " << rect.bottom() << "}";
-    return false;
-  }
-
-  return magnifier_capture_succeeded_;
-}
-
-BOOL ScreenCapturerWinMagnifier::OnMagImageScalingCallback(
-    HWND hwnd,
-    void* srcdata,
-    MAGIMAGEHEADER srcheader,
-    void* destdata,
-    MAGIMAGEHEADER destheader,
-    RECT unclipped,
-    RECT clipped,
-    HRGN dirty) {
-  RTC_DCHECK(tls_index_.Value() != static_cast<int32_t>(TLS_OUT_OF_INDEXES));
-  ScreenCapturerWinMagnifier* owner =
-      reinterpret_cast<ScreenCapturerWinMagnifier*>(
-          TlsGetValue(tls_index_.Value()));
-  TlsSetValue(tls_index_.Value(), nullptr);
-  owner->OnCaptured(srcdata, srcheader);
-
-  return TRUE;
-}
-
-// TODO(zijiehe): These functions are available on Windows Vista or upper, so we
-// do not need to use LoadLibrary and GetProcAddress anymore. Use regular
-// include and function calls instead of a dynamical loaded library.
-bool ScreenCapturerWinMagnifier::InitializeMagnifier() {
-  RTC_DCHECK(!magnifier_initialized_);
-
-  if (GetSystemMetrics(SM_CMONITORS) != 1) {
-    // Do not try to use the magnifier in multi-screen setup (where the API
-    // crashes sometimes).
-    LOG_F(LS_WARNING) << "Magnifier capturer cannot work on multi-screen "
-                         "system.";
-    return false;
-  }
-
-  desktop_dc_ = GetDC(nullptr);
-
-  mag_lib_handle_ = LoadLibrary(L"Magnification.dll");
-  if (!mag_lib_handle_)
-    return false;
-
-  // Initialize Magnification API function pointers.
-  mag_initialize_func_ = reinterpret_cast<MagInitializeFunc>(
-      GetProcAddress(mag_lib_handle_, "MagInitialize"));
-  mag_uninitialize_func_ = reinterpret_cast<MagUninitializeFunc>(
-      GetProcAddress(mag_lib_handle_, "MagUninitialize"));
-  set_window_source_func_ = reinterpret_cast<MagSetWindowSourceFunc>(
-      GetProcAddress(mag_lib_handle_, "MagSetWindowSource"));
-  set_window_filter_list_func_ = reinterpret_cast<MagSetWindowFilterListFunc>(
-      GetProcAddress(mag_lib_handle_, "MagSetWindowFilterList"));
-  set_image_scaling_callback_func_ =
-      reinterpret_cast<MagSetImageScalingCallbackFunc>(
-          GetProcAddress(mag_lib_handle_, "MagSetImageScalingCallback"));
-
-  if (!mag_initialize_func_ || !mag_uninitialize_func_ ||
-      !set_window_source_func_ || !set_window_filter_list_func_ ||
-      !set_image_scaling_callback_func_) {
-    LOG_F(LS_WARNING) << "Failed to initialize ScreenCapturerWinMagnifier: "
-                      << "library functions missing.";
-    return false;
-  }
-
-  BOOL result = mag_initialize_func_();
-  if (!result) {
-    LOG_F(LS_WARNING) << "Failed to initialize ScreenCapturerWinMagnifier: "
-                      << "error from MagInitialize " << GetLastError();
-    return false;
-  }
-
-  HMODULE hInstance = nullptr;
-  result = GetModuleHandleExA(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS |
-                                  GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT,
-                              reinterpret_cast<char*>(&DefWindowProc),
-                              &hInstance);
-  if (!result) {
-    mag_uninitialize_func_();
-    LOG_F(LS_WARNING) << "Failed to initialize ScreenCapturerWinMagnifier: "
-                      << "error from GetModulehandleExA " << GetLastError();
-    return false;
-  }
-
-  // Register the host window class. See the MSDN documentation of the
-  // Magnification API for more infomation.
-  WNDCLASSEX wcex = {};
-  wcex.cbSize = sizeof(WNDCLASSEX);
-  wcex.lpfnWndProc = &DefWindowProc;
-  wcex.hInstance = hInstance;
-  wcex.hCursor = LoadCursor(nullptr, IDC_ARROW);
-  wcex.lpszClassName = kMagnifierHostClass;
-
-  // Ignore the error which may happen when the class is already registered.
-  RegisterClassEx(&wcex);
-
-  // Create the host window.
-  host_window_ =
-      CreateWindowEx(WS_EX_LAYERED, kMagnifierHostClass, kHostWindowName, 0, 0,
-                     0, 0, 0, nullptr, nullptr, hInstance, nullptr);
-  if (!host_window_) {
-    mag_uninitialize_func_();
-    LOG_F(LS_WARNING) << "Failed to initialize ScreenCapturerWinMagnifier: "
-                      << "error from creating host window " << GetLastError();
-    return false;
-  }
-
-  // Create the magnifier control.
-  magnifier_window_ = CreateWindow(kMagnifierWindowClass, kMagnifierWindowName,
-                                   WS_CHILD | WS_VISIBLE, 0, 0, 0, 0,
-                                   host_window_, nullptr, hInstance, nullptr);
-  if (!magnifier_window_) {
-    mag_uninitialize_func_();
-    LOG_F(LS_WARNING) << "Failed to initialize ScreenCapturerWinMagnifier: "
-                      << "error from creating magnifier window "
-                      << GetLastError();
-    return false;
-  }
-
-  // Hide the host window.
-  ShowWindow(host_window_, SW_HIDE);
-
-  // Set the scaling callback to receive captured image.
-  result = set_image_scaling_callback_func_(
-      magnifier_window_,
-      &ScreenCapturerWinMagnifier::OnMagImageScalingCallback);
-  if (!result) {
-    mag_uninitialize_func_();
-    LOG_F(LS_WARNING) << "Failed to initialize ScreenCapturerWinMagnifier: "
-                      << "error from MagSetImageScalingCallback "
-                      << GetLastError();
-    return false;
-  }
-
-  if (excluded_window_) {
-    result = set_window_filter_list_func_(
-        magnifier_window_, MW_FILTERMODE_EXCLUDE, 1, &excluded_window_);
-    if (!result) {
-      mag_uninitialize_func_();
-      LOG_F(LS_WARNING) << "Failed to initialize ScreenCapturerWinMagnifier: "
-                        << "error from MagSetWindowFilterList "
-                        << GetLastError();
-      return false;
-    }
-  }
-
-  if (tls_index_.Value() == static_cast<int32_t>(TLS_OUT_OF_INDEXES)) {
-    // More than one threads may get here at the same time, but only one will
-    // write to tls_index_ using CompareExchange.
-    DWORD new_tls_index = TlsAlloc();
-    if (!tls_index_.CompareExchange(new_tls_index, TLS_OUT_OF_INDEXES))
-      TlsFree(new_tls_index);
-  }
-
-  magnifier_initialized_ = true;
-  return true;
-}
-
-void ScreenCapturerWinMagnifier::OnCaptured(void* data,
-                                            const MAGIMAGEHEADER& header) {
-  DesktopFrame* current_frame = queue_.current_frame();
-
-  // Verify the format.
-  // TODO(jiayl): support capturing sources with pixel formats other than RGBA.
-  int captured_bytes_per_pixel = header.cbSize / header.width / header.height;
-  if (header.format != GUID_WICPixelFormat32bppRGBA ||
-      header.width != static_cast<UINT>(current_frame->size().width()) ||
-      header.height != static_cast<UINT>(current_frame->size().height()) ||
-      header.stride != static_cast<UINT>(current_frame->stride()) ||
-      captured_bytes_per_pixel != DesktopFrame::kBytesPerPixel) {
-    LOG_F(LS_WARNING) << "Output format does not match the captured format: "
-                      << "width = " << header.width << ", "
-                      << "height = " << header.height << ", "
-                      << "stride = " << header.stride << ", "
-                      << "bpp = " << captured_bytes_per_pixel << ", "
-                      << "pixel format RGBA ? "
-                      << (header.format == GUID_WICPixelFormat32bppRGBA) << ".";
-    return;
-  }
-
-  // Copy the data into the frame.
-  current_frame->CopyPixelsFrom(
-      reinterpret_cast<uint8_t*>(data),
-      header.stride,
-      DesktopRect::MakeXYWH(0, 0, header.width, header.height));
-
-  magnifier_capture_succeeded_ = true;
-}
-
-void ScreenCapturerWinMagnifier::CreateCurrentFrameIfNecessary(
-    const DesktopSize& size) {
-  // If the current buffer is from an older generation then allocate a new one.
-  // Note that we can't reallocate other buffers at this point, since the caller
-  // may still be reading from them.
-  if (!queue_.current_frame() || !queue_.current_frame()->size().equals(size)) {
-    std::unique_ptr<DesktopFrame> frame =
-        shared_memory_factory_
-            ? SharedMemoryDesktopFrame::Create(size,
-                                               shared_memory_factory_.get())
-            : std::unique_ptr<DesktopFrame>(new BasicDesktopFrame(size));
-    queue_.ReplaceCurrentFrame(SharedDesktopFrame::Wrap(std::move(frame)));
-  }
-}
-
-}  // namespace webrtc
diff --git a/modules/desktop_capture/win/screen_capturer_win_magnifier.h b/modules/desktop_capture/win/screen_capturer_win_magnifier.h
deleted file mode 100644
index 680bac3..0000000
--- a/modules/desktop_capture/win/screen_capturer_win_magnifier.h
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- *  Copyright (c) 2014 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_DESKTOP_CAPTURE_WIN_SCREEN_CAPTURER_WIN_MAGNIFIER_H_
-#define WEBRTC_MODULES_DESKTOP_CAPTURE_WIN_SCREEN_CAPTURER_WIN_MAGNIFIER_H_
-
-#include <memory>
-
-#include <windows.h>
-#include <magnification.h>
-#include <wincodec.h>
-
-#include "webrtc/modules/desktop_capture/desktop_capturer.h"
-#include "webrtc/modules/desktop_capture/screen_capture_frame_queue.h"
-#include "webrtc/modules/desktop_capture/screen_capturer_helper.h"
-#include "webrtc/modules/desktop_capture/shared_desktop_frame.h"
-#include "webrtc/modules/desktop_capture/win/scoped_thread_desktop.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/system_wrappers/include/atomic32.h"
-
-namespace webrtc {
-
-class DesktopFrame;
-class DesktopRect;
-
-// Captures the screen using the Magnification API to support window exclusion.
-// Each capturer must run on a dedicated thread because it uses thread local
-// storage for redirecting the library callback. Also the thread must have a UI
-// message loop to handle the window messages for the magnifier window.
-//
-// This class does not detect DesktopFrame::updated_region(), the field is
-// always set to the entire frame rectangle. ScreenCapturerDifferWrapper should
-// be used if that functionality is necessary.
-class ScreenCapturerWinMagnifier : public DesktopCapturer {
- public:
-  ScreenCapturerWinMagnifier();
-  ~ScreenCapturerWinMagnifier() override;
-
-  // Overridden from ScreenCapturer:
-  void Start(Callback* callback) override;
-  void SetSharedMemoryFactory(
-      std::unique_ptr<SharedMemoryFactory> shared_memory_factory) override;
-  void CaptureFrame() override;
-  bool GetSourceList(SourceList* screens) override;
-  bool SelectSource(SourceId id) override;
-  void SetExcludedWindow(WindowId window) override;
-
- private:
-  typedef BOOL(WINAPI* MagImageScalingCallback)(HWND hwnd,
-                                                void* srcdata,
-                                                MAGIMAGEHEADER srcheader,
-                                                void* destdata,
-                                                MAGIMAGEHEADER destheader,
-                                                RECT unclipped,
-                                                RECT clipped,
-                                                HRGN dirty);
-  typedef BOOL(WINAPI* MagInitializeFunc)(void);
-  typedef BOOL(WINAPI* MagUninitializeFunc)(void);
-  typedef BOOL(WINAPI* MagSetWindowSourceFunc)(HWND hwnd, RECT rect);
-  typedef BOOL(WINAPI* MagSetWindowFilterListFunc)(HWND hwnd,
-                                                   DWORD dwFilterMode,
-                                                   int count,
-                                                   HWND* pHWND);
-  typedef BOOL(WINAPI* MagSetImageScalingCallbackFunc)(
-      HWND hwnd,
-      MagImageScalingCallback callback);
-
-  static BOOL WINAPI OnMagImageScalingCallback(HWND hwnd,
-                                               void* srcdata,
-                                               MAGIMAGEHEADER srcheader,
-                                               void* destdata,
-                                               MAGIMAGEHEADER destheader,
-                                               RECT unclipped,
-                                               RECT clipped,
-                                               HRGN dirty);
-
-  // Captures the screen within |rect| in the desktop coordinates. Returns true
-  // if succeeded.
-  // It can only capture the primary screen for now. The magnification library
-  // crashes under some screen configurations (e.g. secondary screen on top of
-  // primary screen) if it tries to capture a non-primary screen. The caller
-  // must make sure not calling it on non-primary screens.
-  bool CaptureImage(const DesktopRect& rect);
-
-  // Helper method for setting up the magnifier control. Returns true if
-  // succeeded.
-  bool InitializeMagnifier();
-
-  // Called by OnMagImageScalingCallback to output captured data.
-  void OnCaptured(void* data, const MAGIMAGEHEADER& header);
-
-  // Makes sure the current frame exists and matches |size|.
-  void CreateCurrentFrameIfNecessary(const DesktopSize& size);
-
-  static Atomic32 tls_index_;
-
-  Callback* callback_ = nullptr;
-  std::unique_ptr<SharedMemoryFactory> shared_memory_factory_;
-  ScreenId current_screen_id_ = kFullDesktopScreenId;
-  std::wstring current_device_key_;
-  HWND excluded_window_ = NULL;
-
-  // Queue of the frames buffers.
-  ScreenCaptureFrameQueue<SharedDesktopFrame> queue_;
-
-  ScopedThreadDesktop desktop_;
-
-  // Used for getting the screen dpi.
-  HDC desktop_dc_ = NULL;
-
-  HMODULE mag_lib_handle_ = NULL;
-  MagInitializeFunc mag_initialize_func_ = nullptr;
-  MagUninitializeFunc mag_uninitialize_func_ = nullptr;
-  MagSetWindowSourceFunc set_window_source_func_ = nullptr;
-  MagSetWindowFilterListFunc set_window_filter_list_func_ = nullptr;
-  MagSetImageScalingCallbackFunc set_image_scaling_callback_func_ = nullptr;
-
-  // The hidden window hosting the magnifier control.
-  HWND host_window_ = NULL;
-  // The magnifier control that captures the screen.
-  HWND magnifier_window_ = NULL;
-
-  // True if the magnifier control has been successfully initialized.
-  bool magnifier_initialized_ = false;
-
-  // True if the last OnMagImageScalingCallback was called and handled
-  // successfully. Reset at the beginning of each CaptureImage call.
-  bool magnifier_capture_succeeded_ = true;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(ScreenCapturerWinMagnifier);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_DESKTOP_CAPTURE_WIN_SCREEN_CAPTURER_WIN_MAGNIFIER_H_
diff --git a/modules/desktop_capture/win/window_capture_utils.cc b/modules/desktop_capture/win/window_capture_utils.cc
deleted file mode 100644
index 6b5e573..0000000
--- a/modules/desktop_capture/win/window_capture_utils.cc
+++ /dev/null
@@ -1,156 +0,0 @@
-/*
- *  Copyright (c) 2014 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/desktop_capture/win/window_capture_utils.h"
-
-#include "webrtc/modules/desktop_capture/win/scoped_gdi_object.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/win32.h"
-
-namespace webrtc {
-
-bool GetWindowRect(HWND window, DesktopRect* result) {
-  RECT rect;
-  if (!::GetWindowRect(window, &rect)) {
-    return false;
-  }
-  *result = DesktopRect::MakeLTRB(
-      rect.left, rect.top, rect.right, rect.bottom);
-  return true;
-}
-
-bool GetCroppedWindowRect(HWND window,
-                          DesktopRect* cropped_rect,
-                          DesktopRect* original_rect) {
-  DesktopRect window_rect;
-  if (!GetWindowRect(window, &window_rect)) {
-    return false;
-  }
-
-  if (original_rect) {
-    *original_rect = window_rect;
-  }
-  *cropped_rect = window_rect;
-
-  bool is_maximized = false;
-  if (!IsWindowMaximized(window, &is_maximized)) {
-    return false;
-  }
-
-  // After Windows8, transparent borders will be added by OS at
-  // left/bottom/right sides of a window. If the cropped window
-  // doesn't remove these borders, the background will be exposed a bit.
-  if (rtc::IsWindows8OrLater() || is_maximized) {
-    const int width = GetSystemMetrics(SM_CXSIZEFRAME);
-    const int height = GetSystemMetrics(SM_CYSIZEFRAME);
-    cropped_rect->Extend(-width, 0, -width, -height);
-  }
-
-  return true;
-}
-
-bool GetWindowContentRect(HWND window, DesktopRect* result) {
-  if (!GetWindowRect(window, result)) {
-    return false;
-  }
-
-  RECT rect;
-  if (!::GetClientRect(window, &rect)) {
-    return false;
-  }
-
-  const int width = rect.right - rect.left;
-  // The GetClientRect() is not expected to return a larger area than
-  // GetWindowRect().
-  if (width > 0 && width < result->width()) {
-    // - GetClientRect() always set the left / top of RECT to 0. So we need to
-    //   estimate the border width from GetClientRect() and GetWindowRect().
-    // - Border width of a window varies according to the window type.
-    // - GetClientRect() excludes the title bar, which should be considered as
-    //   part of the content and included in the captured frame. So we always
-    //   estimate the border width according to the window width.
-    // - We assume a window has same border width in each side.
-    // So we shrink half of the width difference from all four sides.
-    const int shrink = ((width - result->width()) / 2);
-    // When |shrink| is negative, DesktopRect::Extend() shrinks itself.
-    result->Extend(shrink, 0, shrink, 0);
-    // Usually this should not happen, just in case we have received a strange
-    // window, which has only left and right borders.
-    if (result->height() > shrink * 2) {
-      result->Extend(0, shrink, 0, shrink);
-    }
-    RTC_DCHECK(!result->is_empty());
-  }
-
-  return true;
-}
-
-int GetWindowRegionTypeWithBoundary(HWND window, DesktopRect* result) {
-  win::ScopedGDIObject<HRGN, win::DeleteObjectTraits<HRGN>>
-      scoped_hrgn(CreateRectRgn(0, 0, 0, 0));
-  const int region_type = GetWindowRgn(window, scoped_hrgn.Get());
-
-  if (region_type == SIMPLEREGION) {
-    RECT rect;
-    GetRgnBox(scoped_hrgn.Get(), &rect);
-    *result = DesktopRect::MakeLTRB(
-        rect.left, rect.top, rect.right, rect.bottom);
-  }
-  return region_type;
-}
-
-bool GetDcSize(HDC hdc, DesktopSize* size) {
-  win::ScopedGDIObject<HGDIOBJ, win::DeleteObjectTraits<HGDIOBJ>>
-      scoped_hgdi(GetCurrentObject(hdc, OBJ_BITMAP));
-  BITMAP bitmap;
-  memset(&bitmap, 0, sizeof(BITMAP));
-  if (GetObject(scoped_hgdi.Get(), sizeof(BITMAP), &bitmap) == 0) {
-    return false;
-  }
-  size->set(bitmap.bmWidth, bitmap.bmHeight);
-  return true;
-}
-
-bool IsWindowMaximized(HWND window, bool* result) {
-  WINDOWPLACEMENT placement;
-  memset(&placement, 0, sizeof(WINDOWPLACEMENT));
-  placement.length = sizeof(WINDOWPLACEMENT);
-  if (!::GetWindowPlacement(window, &placement)) {
-    return false;
-  }
-
-  *result = (placement.showCmd == SW_SHOWMAXIMIZED);
-  return true;
-}
-
-AeroChecker::AeroChecker() : dwmapi_library_(nullptr), func_(nullptr) {
-  // Try to load dwmapi.dll dynamically since it is not available on XP.
-  dwmapi_library_ = LoadLibrary(L"dwmapi.dll");
-  if (dwmapi_library_) {
-    func_ = reinterpret_cast<DwmIsCompositionEnabledFunc>(
-        GetProcAddress(dwmapi_library_, "DwmIsCompositionEnabled"));
-  }
-}
-
-AeroChecker::~AeroChecker() {
-  if (dwmapi_library_) {
-    FreeLibrary(dwmapi_library_);
-  }
-}
-
-bool AeroChecker::IsAeroEnabled() {
-  BOOL result = FALSE;
-  if (func_) {
-    func_(&result);
-  }
-  return result != FALSE;
-}
-
-}  // namespace webrtc
diff --git a/modules/desktop_capture/win/window_capture_utils.h b/modules/desktop_capture/win/window_capture_utils.h
deleted file mode 100644
index 500d58d..0000000
--- a/modules/desktop_capture/win/window_capture_utils.h
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- *  Copyright (c) 2014 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 <windows.h>
-
-#include "webrtc/modules/desktop_capture/desktop_geometry.h"
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace webrtc {
-
-// Outputs the window rect. The returned DesktopRect is in system coordinates,
-// i.e. the primary monitor on the system always starts from (0, 0). This
-// function returns false if native APIs fail.
-bool GetWindowRect(HWND window, DesktopRect* result);
-
-// Outputs the window rect, with the left/right/bottom frame border cropped if
-// the window is maximized. |cropped_rect| is the cropped rect relative to the
-// desktop. |original_rect| is the original rect returned from GetWindowRect.
-// Returns true if all API calls succeeded. The returned DesktopRect is in
-// system coordinates, i.e. the primary monitor on the system always starts from
-// (0, 0). |original_rect| can be nullptr.
-//
-// TODO(zijiehe): Move this function to CroppingWindowCapturerWin after it has
-// been removed from MouseCursorMonitorWin.
-// This function should only be used by CroppingWindowCapturerWin. Instead a
-// DesktopRect CropWindowRect(const DesktopRect& rect)
-// should be added as a utility function to help CroppingWindowCapturerWin and
-// WindowCapturerWin to crop out the borders or shadow according to their
-// scenarios. But this function is too generic and easy to be misused.
-bool GetCroppedWindowRect(HWND window,
-                          DesktopRect* cropped_rect,
-                          DesktopRect* original_rect);
-
-// Retrieves the rectangle of the content area of |window|. Usually it contains
-// title bar and window client area, but borders or shadow are excluded. The
-// returned DesktopRect is in system coordinates, i.e. the primary monitor on
-// the system always starts from (0, 0). This function returns false if native
-// APIs fail.
-bool GetWindowContentRect(HWND window, DesktopRect* result);
-
-// Returns the region type of the |window| and fill |rect| with the region of
-// |window| if region type is SIMPLEREGION.
-int GetWindowRegionTypeWithBoundary(HWND window, DesktopRect* result);
-
-// Retrieves the size of the |hdc|. This function returns false if native APIs
-// fail.
-bool GetDcSize(HDC hdc, DesktopSize* size);
-
-// Retrieves whether the |window| is maximized and stores in |result|. This
-// function returns false if native APIs fail.
-bool IsWindowMaximized(HWND window, bool* result);
-
-typedef HRESULT (WINAPI *DwmIsCompositionEnabledFunc)(BOOL* enabled);
-class AeroChecker {
- public:
-  AeroChecker();
-  ~AeroChecker();
-
-  bool IsAeroEnabled();
-
- private:
-  HMODULE dwmapi_library_;
-  DwmIsCompositionEnabledFunc func_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(AeroChecker);
-};
-
-}  // namespace webrtc
diff --git a/modules/desktop_capture/window_capturer_mac.mm b/modules/desktop_capture/window_capturer_mac.mm
deleted file mode 100644
index fa1ddcd..0000000
--- a/modules/desktop_capture/window_capturer_mac.mm
+++ /dev/null
@@ -1,232 +0,0 @@
-/*
- *  Copyright (c) 2013 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 <assert.h>
-#include <ApplicationServices/ApplicationServices.h>
-#include <Cocoa/Cocoa.h>
-#include <CoreFoundation/CoreFoundation.h>
-
-#include <utility>
-
-#include "webrtc/modules/desktop_capture/desktop_capture_options.h"
-#include "webrtc/modules/desktop_capture/desktop_capturer.h"
-#include "webrtc/modules/desktop_capture/desktop_frame.h"
-#include "webrtc/modules/desktop_capture/window_finder_mac.h"
-#include "webrtc/modules/desktop_capture/mac/desktop_configuration.h"
-#include "webrtc/modules/desktop_capture/mac/desktop_configuration_monitor.h"
-#include "webrtc/modules/desktop_capture/mac/full_screen_chrome_window_detector.h"
-#include "webrtc/modules/desktop_capture/mac/window_list_utils.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/macutils.h"
-#include "webrtc/rtc_base/scoped_ref_ptr.h"
-
-namespace webrtc {
-
-namespace {
-
-// Returns true if the window exists.
-bool IsWindowValid(CGWindowID id) {
-  CFArrayRef window_id_array =
-      CFArrayCreate(nullptr, reinterpret_cast<const void**>(&id), 1, nullptr);
-  CFArrayRef window_array =
-      CGWindowListCreateDescriptionFromArray(window_id_array);
-  bool valid = window_array && CFArrayGetCount(window_array);
-  CFRelease(window_id_array);
-  CFRelease(window_array);
-
-  return valid;
-}
-
-class WindowCapturerMac : public DesktopCapturer {
- public:
-  explicit WindowCapturerMac(rtc::scoped_refptr<FullScreenChromeWindowDetector>
-                                 full_screen_chrome_window_detector,
-                             rtc::scoped_refptr<DesktopConfigurationMonitor>
-                                 configuration_monitor);
-  ~WindowCapturerMac() override;
-
-  // DesktopCapturer interface.
-  void Start(Callback* callback) override;
-  void CaptureFrame() override;
-  bool GetSourceList(SourceList* sources) override;
-  bool SelectSource(SourceId id) override;
-  bool FocusOnSelectedSource() override;
-  bool IsOccluded(const DesktopVector& pos) override;
-
- private:
-  Callback* callback_ = nullptr;
-
-  // The window being captured.
-  CGWindowID window_id_ = 0;
-
-  const rtc::scoped_refptr<FullScreenChromeWindowDetector>
-      full_screen_chrome_window_detector_;
-
-  const rtc::scoped_refptr<DesktopConfigurationMonitor> configuration_monitor_;
-
-  WindowFinderMac window_finder_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(WindowCapturerMac);
-};
-
-WindowCapturerMac::WindowCapturerMac(
-    rtc::scoped_refptr<FullScreenChromeWindowDetector>
-        full_screen_chrome_window_detector,
-    rtc::scoped_refptr<DesktopConfigurationMonitor> configuration_monitor)
-    : full_screen_chrome_window_detector_(
-          std::move(full_screen_chrome_window_detector)),
-      configuration_monitor_(std::move(configuration_monitor)) {}
-
-WindowCapturerMac::~WindowCapturerMac() {}
-
-bool WindowCapturerMac::GetSourceList(SourceList* sources) {
-  return webrtc::GetWindowList(sources, true);
-}
-
-bool WindowCapturerMac::SelectSource(SourceId id) {
-  if (!IsWindowValid(id))
-    return false;
-  window_id_ = id;
-  return true;
-}
-
-bool WindowCapturerMac::FocusOnSelectedSource() {
-  if (!window_id_)
-    return false;
-
-  CGWindowID ids[1];
-  ids[0] = window_id_;
-  CFArrayRef window_id_array =
-      CFArrayCreate(nullptr, reinterpret_cast<const void**>(&ids), 1, nullptr);
-
-  CFArrayRef window_array =
-      CGWindowListCreateDescriptionFromArray(window_id_array);
-  if (!window_array || 0 == CFArrayGetCount(window_array)) {
-    // Could not find the window. It might have been closed.
-    LOG(LS_INFO) << "Window not found";
-    CFRelease(window_id_array);
-    return false;
-  }
-
-  CFDictionaryRef window = reinterpret_cast<CFDictionaryRef>(
-      CFArrayGetValueAtIndex(window_array, 0));
-  CFNumberRef pid_ref = reinterpret_cast<CFNumberRef>(
-      CFDictionaryGetValue(window, kCGWindowOwnerPID));
-
-  int pid;
-  CFNumberGetValue(pid_ref, kCFNumberIntType, &pid);
-
-  // TODO(jiayl): this will bring the process main window to the front. We
-  // should find a way to bring only the window to the front.
-  bool result =
-      [[NSRunningApplication runningApplicationWithProcessIdentifier: pid]
-          activateWithOptions: NSApplicationActivateIgnoringOtherApps];
-
-  CFRelease(window_id_array);
-  CFRelease(window_array);
-  return result;
-}
-
-bool WindowCapturerMac::IsOccluded(const DesktopVector& pos) {
-  DesktopVector sys_pos = pos;
-  if (configuration_monitor_) {
-    configuration_monitor_->Lock();
-    auto configuration = configuration_monitor_->desktop_configuration();
-    configuration_monitor_->Unlock();
-    sys_pos = pos.add(configuration.bounds.top_left());
-  }
-  return window_finder_.GetWindowUnderPoint(sys_pos) != window_id_;
-}
-
-void WindowCapturerMac::Start(Callback* callback) {
-  assert(!callback_);
-  assert(callback);
-
-  callback_ = callback;
-}
-
-void WindowCapturerMac::CaptureFrame() {
-  if (!IsWindowValid(window_id_)) {
-    callback_->OnCaptureResult(Result::ERROR_PERMANENT, nullptr);
-    return;
-  }
-
-  CGWindowID on_screen_window = window_id_;
-  if (full_screen_chrome_window_detector_) {
-    CGWindowID full_screen_window =
-        full_screen_chrome_window_detector_->FindFullScreenWindow(window_id_);
-
-    if (full_screen_window != kCGNullWindowID)
-      on_screen_window = full_screen_window;
-  }
-
-  CGImageRef window_image = CGWindowListCreateImage(
-      CGRectNull, kCGWindowListOptionIncludingWindow,
-      on_screen_window, kCGWindowImageBoundsIgnoreFraming);
-
-  if (!window_image) {
-    callback_->OnCaptureResult(Result::ERROR_TEMPORARY, nullptr);
-    return;
-  }
-
-  int bits_per_pixel = CGImageGetBitsPerPixel(window_image);
-  if (bits_per_pixel != 32) {
-    LOG(LS_ERROR) << "Unsupported window image depth: " << bits_per_pixel;
-    CFRelease(window_image);
-    callback_->OnCaptureResult(Result::ERROR_PERMANENT, nullptr);
-    return;
-  }
-
-  int width = CGImageGetWidth(window_image);
-  int height = CGImageGetHeight(window_image);
-  CGDataProviderRef provider = CGImageGetDataProvider(window_image);
-  CFDataRef cf_data = CGDataProviderCopyData(provider);
-  std::unique_ptr<DesktopFrame> frame(
-      new BasicDesktopFrame(DesktopSize(width, height)));
-
-  int src_stride = CGImageGetBytesPerRow(window_image);
-  const uint8_t* src_data = CFDataGetBytePtr(cf_data);
-  for (int y = 0; y < height; ++y) {
-    memcpy(frame->data() + frame->stride() * y, src_data + src_stride * y,
-           DesktopFrame::kBytesPerPixel * width);
-  }
-
-  CFRelease(cf_data);
-  CFRelease(window_image);
-
-  frame->mutable_updated_region()->SetRect(
-      DesktopRect::MakeSize(frame->size()));
-  DesktopVector top_left = GetWindowBounds(on_screen_window).top_left();
-  if (configuration_monitor_) {
-    configuration_monitor_->Lock();
-    auto configuration = configuration_monitor_->desktop_configuration();
-    configuration_monitor_->Unlock();
-    top_left = top_left.subtract(configuration.bounds.top_left());
-  }
-  frame->set_top_left(top_left);
-
-  callback_->OnCaptureResult(Result::SUCCESS, std::move(frame));
-
-  if (full_screen_chrome_window_detector_)
-    full_screen_chrome_window_detector_->UpdateWindowListIfNeeded(window_id_);
-}
-
-}  // namespace
-
-// static
-std::unique_ptr<DesktopCapturer> DesktopCapturer::CreateRawWindowCapturer(
-    const DesktopCaptureOptions& options) {
-  return std::unique_ptr<DesktopCapturer>(
-      new WindowCapturerMac(options.full_screen_chrome_window_detector(),
-                            options.configuration_monitor()));
-}
-
-}  // namespace webrtc
diff --git a/modules/desktop_capture/window_capturer_null.cc b/modules/desktop_capture/window_capturer_null.cc
deleted file mode 100644
index d4ef9b9..0000000
--- a/modules/desktop_capture/window_capturer_null.cc
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- *  Copyright (c) 2013 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 <assert.h>
-
-#include "webrtc/modules/desktop_capture/desktop_capturer.h"
-#include "webrtc/modules/desktop_capture/desktop_frame.h"
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace webrtc {
-
-namespace {
-
-class WindowCapturerNull : public DesktopCapturer {
- public:
-  WindowCapturerNull();
-  ~WindowCapturerNull() override;
-
-  // DesktopCapturer interface.
-  void Start(Callback* callback) override;
-  void CaptureFrame() override;
-  bool GetSourceList(SourceList* sources) override;
-  bool SelectSource(SourceId id) override;
-
- private:
-  Callback* callback_ = nullptr;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(WindowCapturerNull);
-};
-
-WindowCapturerNull::WindowCapturerNull() {}
-WindowCapturerNull::~WindowCapturerNull() {}
-
-bool WindowCapturerNull::GetSourceList(SourceList* sources) {
-  // Not implemented yet.
-  return false;
-}
-
-bool WindowCapturerNull::SelectSource(SourceId id) {
-  // Not implemented yet.
-  return false;
-}
-
-void WindowCapturerNull::Start(Callback* callback) {
-  assert(!callback_);
-  assert(callback);
-
-  callback_ = callback;
-}
-
-void WindowCapturerNull::CaptureFrame() {
-  // Not implemented yet.
-  callback_->OnCaptureResult(Result::ERROR_TEMPORARY, nullptr);
-}
-
-}  // namespace
-
-// static
-std::unique_ptr<DesktopCapturer> DesktopCapturer::CreateRawWindowCapturer(
-    const DesktopCaptureOptions& options) {
-  return std::unique_ptr<DesktopCapturer>(new WindowCapturerNull());
-}
-
-}  // namespace webrtc
diff --git a/modules/desktop_capture/window_capturer_unittest.cc b/modules/desktop_capture/window_capturer_unittest.cc
deleted file mode 100644
index 5af278c..0000000
--- a/modules/desktop_capture/window_capturer_unittest.cc
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- *  Copyright (c) 2013 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 <memory>
-
-#include "webrtc/modules/desktop_capture/desktop_capturer.h"
-#include "webrtc/modules/desktop_capture/desktop_capture_options.h"
-#include "webrtc/modules/desktop_capture/desktop_frame.h"
-#include "webrtc/modules/desktop_capture/desktop_region.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-class WindowCapturerTest : public testing::Test,
-                           public DesktopCapturer::Callback {
- public:
-  void SetUp() override {
-    capturer_ = DesktopCapturer::CreateWindowCapturer(
-        DesktopCaptureOptions::CreateDefault());
-  }
-
-  void TearDown() override {}
-
-  // DesktopCapturer::Callback interface
-  void OnCaptureResult(DesktopCapturer::Result result,
-                       std::unique_ptr<DesktopFrame> frame) override {
-    frame_ = std::move(frame);
-  }
-
- protected:
-  std::unique_ptr<DesktopCapturer> capturer_;
-  std::unique_ptr<DesktopFrame> frame_;
-};
-
-// Verify that we can enumerate windows.
-TEST_F(WindowCapturerTest, Enumerate) {
-  DesktopCapturer::SourceList sources;
-  EXPECT_TRUE(capturer_->GetSourceList(&sources));
-
-  // Verify that window titles are set.
-  for (auto it = sources.begin(); it != sources.end(); ++it) {
-    EXPECT_FALSE(it->title.empty());
-  }
-}
-
-// Verify we can capture a window.
-//
-// TODO(sergeyu): Currently this test just looks at the windows that already
-// exist. Ideally it should create a test window and capture from it, but there
-// is no easy cross-platform way to create new windows (potentially we could
-// have a python script showing Tk dialog, but launching code will differ
-// between platforms).
-TEST_F(WindowCapturerTest, Capture) {
-  DesktopCapturer::SourceList sources;
-  capturer_->Start(this);
-  EXPECT_TRUE(capturer_->GetSourceList(&sources));
-
-  // Verify that we can select and capture each window.
-  for (auto it = sources.begin(); it != sources.end(); ++it) {
-    frame_.reset();
-    if (capturer_->SelectSource(it->id)) {
-      capturer_->CaptureFrame();
-    }
-
-    // If we failed to capture a window make sure it no longer exists.
-    if (!frame_.get()) {
-      DesktopCapturer::SourceList new_list;
-      EXPECT_TRUE(capturer_->GetSourceList(&new_list));
-      for (auto new_list_it = new_list.begin(); new_list_it != new_list.end();
-           ++new_list_it) {
-        EXPECT_FALSE(it->id == new_list_it->id);
-      }
-      continue;
-    }
-
-    EXPECT_GT(frame_->size().width(), 0);
-    EXPECT_GT(frame_->size().height(), 0);
-  }
-}
-
-}  // namespace webrtc
diff --git a/modules/desktop_capture/window_capturer_win.cc b/modules/desktop_capture/window_capturer_win.cc
deleted file mode 100644
index 01b4e4d..0000000
--- a/modules/desktop_capture/window_capturer_win.cc
+++ /dev/null
@@ -1,338 +0,0 @@
-/*
- *  Copyright (c) 2013 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 <assert.h>
-
-#include <memory>
-
-#include "webrtc/modules/desktop_capture/desktop_capturer.h"
-#include "webrtc/modules/desktop_capture/desktop_frame_win.h"
-#include "webrtc/modules/desktop_capture/window_finder_win.h"
-#include "webrtc/modules/desktop_capture/win/screen_capture_utils.h"
-#include "webrtc/modules/desktop_capture/win/window_capture_utils.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/win32.h"
-
-namespace webrtc {
-
-namespace {
-
-BOOL CALLBACK WindowsEnumerationHandler(HWND hwnd, LPARAM param) {
-  DesktopCapturer::SourceList* list =
-      reinterpret_cast<DesktopCapturer::SourceList*>(param);
-
-  // Skip windows that are invisible, minimized, have no title, or are owned,
-  // unless they have the app window style set.
-  int len = GetWindowTextLength(hwnd);
-  HWND owner = GetWindow(hwnd, GW_OWNER);
-  LONG exstyle = GetWindowLong(hwnd, GWL_EXSTYLE);
-  if (len == 0 || IsIconic(hwnd) || !IsWindowVisible(hwnd) ||
-      (owner && !(exstyle & WS_EX_APPWINDOW))) {
-    return TRUE;
-  }
-
-  // Skip the Program Manager window and the Start button.
-  const size_t kClassLength = 256;
-  WCHAR class_name[kClassLength];
-  const int class_name_length = GetClassName(hwnd, class_name, kClassLength);
-  RTC_DCHECK(class_name_length)
-      << "Error retrieving the application's class name";
-
-  // Skip Program Manager window and the Start button. This is the same logic
-  // that's used in Win32WindowPicker in libjingle. Consider filtering other
-  // windows as well (e.g. toolbars).
-  if (wcscmp(class_name, L"Progman") == 0 || wcscmp(class_name, L"Button") == 0)
-    return TRUE;
-
-  // Windows 8 introduced a "Modern App" identified by their class name being
-  // either ApplicationFrameWindow or windows.UI.Core.coreWindow. The
-  // associated windows cannot be captured, so we skip them.
-  // http://crbug.com/526883.
-  if (rtc::IsWindows8OrLater() &&
-      (wcscmp(class_name, L"ApplicationFrameWindow") == 0 ||
-       wcscmp(class_name, L"Windows.UI.Core.CoreWindow") == 0)) {
-    return TRUE;
-  }
-
-  DesktopCapturer::Source window;
-  window.id = reinterpret_cast<WindowId>(hwnd);
-
-  const size_t kTitleLength = 500;
-  WCHAR window_title[kTitleLength];
-  // Truncate the title if it's longer than kTitleLength.
-  GetWindowText(hwnd, window_title, kTitleLength);
-  window.title = rtc::ToUtf8(window_title);
-
-  // Skip windows when we failed to convert the title or it is empty.
-  if (window.title.empty())
-    return TRUE;
-
-  list->push_back(window);
-
-  return TRUE;
-}
-
-// Retrieves the rectangle of the window rect which is drawable by either OS or
-// the owner application. The returned DesktopRect is in system coordinates.
-// This function returns false if native APIs fail.
-//
-// When |window| is maximized, its borders and shadow effect will be ignored by
-// OS and leave black. So we prefer to use GetCroppedWindowRect() when capturing
-// its content to avoid the black area in the final DesktopFrame. But when the
-// window is in normal mode, borders and shadow should be included.
-bool GetWindowDrawableRect(HWND window,
-                           DesktopRect* drawable_rect,
-                           DesktopRect* original_rect) {
-  if (!GetWindowRect(window, original_rect)) {
-    return false;
-  }
-
-  bool is_maximized = false;
-  if (!IsWindowMaximized(window, &is_maximized)) {
-    return false;
-  }
-
-  if (is_maximized) {
-    return GetCroppedWindowRect(
-        window, drawable_rect, /* original_rect */ nullptr);
-  }
-  *drawable_rect = *original_rect;
-  return true;
-}
-
-class WindowCapturerWin : public DesktopCapturer {
- public:
-  WindowCapturerWin();
-  ~WindowCapturerWin() override;
-
-  // DesktopCapturer interface.
-  void Start(Callback* callback) override;
-  void CaptureFrame() override;
-  bool GetSourceList(SourceList* sources) override;
-  bool SelectSource(SourceId id) override;
-  bool FocusOnSelectedSource() override;
-  bool IsOccluded(const DesktopVector& pos) override;
-
- private:
-  Callback* callback_ = nullptr;
-
-  // HWND and HDC for the currently selected window or nullptr if window is not
-  // selected.
-  HWND window_ = nullptr;
-
-  DesktopSize previous_size_;
-
-  AeroChecker aero_checker_;
-
-  // This map is used to avoid flickering for the case when SelectWindow() calls
-  // are interleaved with Capture() calls.
-  std::map<HWND, DesktopSize> window_size_map_;
-
-  WindowFinderWin window_finder_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(WindowCapturerWin);
-};
-
-WindowCapturerWin::WindowCapturerWin() {}
-WindowCapturerWin::~WindowCapturerWin() {}
-
-bool WindowCapturerWin::GetSourceList(SourceList* sources) {
-  SourceList result;
-  LPARAM param = reinterpret_cast<LPARAM>(&result);
-  // EnumWindows only enumerates root windows.
-  if (!EnumWindows(&WindowsEnumerationHandler, param))
-    return false;
-  sources->swap(result);
-
-  std::map<HWND, DesktopSize> new_map;
-  for (const auto& item : *sources) {
-    HWND hwnd = reinterpret_cast<HWND>(item.id);
-    new_map[hwnd] = window_size_map_[hwnd];
-  }
-  window_size_map_.swap(new_map);
-
-  return true;
-}
-
-bool WindowCapturerWin::SelectSource(SourceId id) {
-  HWND window = reinterpret_cast<HWND>(id);
-  if (!IsWindow(window) || !IsWindowVisible(window) || IsIconic(window))
-    return false;
-  window_ = window;
-  // When a window is not in the map, window_size_map_[window] will create an
-  // item with DesktopSize (0, 0).
-  previous_size_ = window_size_map_[window];
-  return true;
-}
-
-bool WindowCapturerWin::FocusOnSelectedSource() {
-  if (!window_)
-    return false;
-
-  if (!IsWindow(window_) || !IsWindowVisible(window_) || IsIconic(window_))
-    return false;
-
-  return BringWindowToTop(window_) != FALSE &&
-         SetForegroundWindow(window_) != FALSE;
-}
-
-bool WindowCapturerWin::IsOccluded(const DesktopVector& pos) {
-  DesktopVector sys_pos = pos.add(GetFullscreenRect().top_left());
-  return reinterpret_cast<HWND>(window_finder_.GetWindowUnderPoint(sys_pos))
-      != window_;
-}
-
-void WindowCapturerWin::Start(Callback* callback) {
-  assert(!callback_);
-  assert(callback);
-
-  callback_ = callback;
-}
-
-void WindowCapturerWin::CaptureFrame() {
-  if (!window_) {
-    LOG(LS_ERROR) << "Window hasn't been selected: " << GetLastError();
-    callback_->OnCaptureResult(Result::ERROR_PERMANENT, nullptr);
-    return;
-  }
-
-  // Stop capturing if the window has been closed.
-  if (!IsWindow(window_)) {
-    callback_->OnCaptureResult(Result::ERROR_PERMANENT, nullptr);
-    return;
-  }
-
-  DesktopRect cropped_rect;
-  DesktopRect original_rect;
-  if (!GetWindowDrawableRect(window_, &cropped_rect, &original_rect)) {
-    LOG(LS_WARNING) << "Failed to get drawable window area: " << GetLastError();
-    callback_->OnCaptureResult(Result::ERROR_TEMPORARY, nullptr);
-    return;
-  }
-
-  // Return a 1x1 black frame if the window is minimized or invisible, to match
-  // behavior on mace. Window can be temporarily invisible during the
-  // transition of full screen mode on/off.
-  if (original_rect.is_empty() ||
-      IsIconic(window_) ||
-      !IsWindowVisible(window_)) {
-    std::unique_ptr<DesktopFrame> frame(
-        new BasicDesktopFrame(DesktopSize(1, 1)));
-    memset(frame->data(), 0, frame->stride() * frame->size().height());
-
-    previous_size_ = frame->size();
-    window_size_map_[window_] = previous_size_;
-    callback_->OnCaptureResult(Result::SUCCESS, std::move(frame));
-    return;
-  }
-
-  HDC window_dc = GetWindowDC(window_);
-  if (!window_dc) {
-    LOG(LS_WARNING) << "Failed to get window DC: " << GetLastError();
-    callback_->OnCaptureResult(Result::ERROR_TEMPORARY, nullptr);
-    return;
-  }
-
-  DesktopSize window_dc_size;
-  if (GetDcSize(window_dc, &window_dc_size)) {
-    // The |window_dc_size| is used to detect the scaling of the original
-    // window. If the application does not support high-DPI settings, it will
-    // be scaled by Windows according to the scaling setting.
-    // https://www.google.com/search?q=windows+scaling+settings&ie=UTF-8
-    // So the size of the |window_dc|, i.e. the bitmap we can retrieve from
-    // PrintWindow() or BitBlt() function, will be smaller than
-    // |original_rect| and |cropped_rect|. Part of the captured desktop frame
-    // will be black. See
-    // bug https://bugs.chromium.org/p/webrtc/issues/detail?id=8112 for
-    // details.
-
-    // If |window_dc_size| is smaller than |window_rect|, let's resize both
-    // |original_rect| and |cropped_rect| according to the scaling factor.
-    const double vertical_scale =
-        static_cast<double>(window_dc_size.width()) / original_rect.width();
-    const double horizontal_scale =
-        static_cast<double>(window_dc_size.height()) / original_rect.height();
-    original_rect.Scale(vertical_scale, horizontal_scale);
-    cropped_rect.Scale(vertical_scale, horizontal_scale);
-  }
-
-  std::unique_ptr<DesktopFrameWin> frame(
-      DesktopFrameWin::Create(cropped_rect.size(), nullptr, window_dc));
-  if (!frame.get()) {
-    ReleaseDC(window_, window_dc);
-    callback_->OnCaptureResult(Result::ERROR_TEMPORARY, nullptr);
-    return;
-  }
-
-  HDC mem_dc = CreateCompatibleDC(window_dc);
-  HGDIOBJ previous_object = SelectObject(mem_dc, frame->bitmap());
-  BOOL result = FALSE;
-
-  // When desktop composition (Aero) is enabled each window is rendered to a
-  // private buffer allowing BitBlt() to get the window content even if the
-  // window is occluded. PrintWindow() is slower but lets rendering the window
-  // contents to an off-screen device context when Aero is not available.
-  // PrintWindow() is not supported by some applications.
-  //
-  // If Aero is enabled, we prefer BitBlt() because it's faster and avoids
-  // window flickering. Otherwise, we prefer PrintWindow() because BitBlt() may
-  // render occluding windows on top of the desired window.
-  //
-  // When composition is enabled the DC returned by GetWindowDC() doesn't always
-  // have window frame rendered correctly. Windows renders it only once and then
-  // caches the result between captures. We hack it around by calling
-  // PrintWindow() whenever window size changes, including the first time of
-  // capturing - it somehow affects what we get from BitBlt() on the subsequent
-  // captures.
-
-  if (!aero_checker_.IsAeroEnabled() || !previous_size_.equals(frame->size())) {
-    result = PrintWindow(window_, mem_dc, 0);
-  }
-
-  // Aero is enabled or PrintWindow() failed, use BitBlt.
-  if (!result) {
-    result = BitBlt(mem_dc, 0, 0, frame->size().width(), frame->size().height(),
-                    window_dc,
-                    cropped_rect.left() - original_rect.left(),
-                    cropped_rect.top() - original_rect.top(),
-                    SRCCOPY);
-  }
-
-  SelectObject(mem_dc, previous_object);
-  DeleteDC(mem_dc);
-  ReleaseDC(window_, window_dc);
-
-  previous_size_ = frame->size();
-  window_size_map_[window_] = previous_size_;
-
-  frame->mutable_updated_region()->SetRect(
-      DesktopRect::MakeSize(frame->size()));
-  frame->set_top_left(
-      cropped_rect.top_left().subtract(GetFullscreenRect().top_left()));
-
-  if (result) {
-    callback_->OnCaptureResult(Result::SUCCESS, std::move(frame));
-  } else {
-    LOG(LS_ERROR) << "Both PrintWindow() and BitBlt() failed.";
-    callback_->OnCaptureResult(Result::ERROR_TEMPORARY, nullptr);
-  }
-}
-
-}  // namespace
-
-// static
-std::unique_ptr<DesktopCapturer> DesktopCapturer::CreateRawWindowCapturer(
-    const DesktopCaptureOptions& options) {
-  return std::unique_ptr<DesktopCapturer>(new WindowCapturerWin());
-}
-
-}  // namespace webrtc
diff --git a/modules/desktop_capture/window_capturer_x11.cc b/modules/desktop_capture/window_capturer_x11.cc
deleted file mode 100644
index 987ceb7..0000000
--- a/modules/desktop_capture/window_capturer_x11.cc
+++ /dev/null
@@ -1,285 +0,0 @@
-/*
- *  Copyright (c) 2013 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 <X11/extensions/Xcomposite.h>
-#include <X11/extensions/Xrender.h>
-#include <X11/Xutil.h>
-
-#include <utility>
-
-#include "webrtc/modules/desktop_capture/desktop_capture_options.h"
-#include "webrtc/modules/desktop_capture/desktop_capturer.h"
-#include "webrtc/modules/desktop_capture/desktop_frame.h"
-#include "webrtc/modules/desktop_capture/window_finder_x11.h"
-#include "webrtc/modules/desktop_capture/x11/shared_x_display.h"
-#include "webrtc/modules/desktop_capture/x11/window_list_utils.h"
-#include "webrtc/modules/desktop_capture/x11/x_atom_cache.h"
-#include "webrtc/modules/desktop_capture/x11/x_server_pixel_buffer.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/scoped_ref_ptr.h"
-
-namespace webrtc {
-
-namespace {
-
-class WindowCapturerLinux : public DesktopCapturer,
-                            public SharedXDisplay::XEventHandler {
- public:
-  WindowCapturerLinux(const DesktopCaptureOptions& options);
-  ~WindowCapturerLinux() override;
-
-  // DesktopCapturer interface.
-  void Start(Callback* callback) override;
-  void CaptureFrame() override;
-  bool GetSourceList(SourceList* sources) override;
-  bool SelectSource(SourceId id) override;
-  bool FocusOnSelectedSource() override;
-  bool IsOccluded(const DesktopVector& pos) override;
-
-  // SharedXDisplay::XEventHandler interface.
-  bool HandleXEvent(const XEvent& event) override;
-
- private:
-  Display* display() { return x_display_->display(); }
-
-  // Returns window title for the specified X |window|.
-  bool GetWindowTitle(::Window window, std::string* title);
-
-  Callback* callback_ = nullptr;
-
-  rtc::scoped_refptr<SharedXDisplay> x_display_;
-
-  bool has_composite_extension_ = false;
-
-  ::Window selected_window_ = 0;
-  XServerPixelBuffer x_server_pixel_buffer_;
-  XAtomCache atom_cache_;
-  WindowFinderX11 window_finder_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(WindowCapturerLinux);
-};
-
-WindowCapturerLinux::WindowCapturerLinux(const DesktopCaptureOptions& options)
-    : x_display_(options.x_display()),
-      atom_cache_(display()),
-      window_finder_(&atom_cache_) {
-  int event_base, error_base, major_version, minor_version;
-  if (XCompositeQueryExtension(display(), &event_base, &error_base) &&
-      XCompositeQueryVersion(display(), &major_version, &minor_version) &&
-      // XCompositeNameWindowPixmap() requires version 0.2
-      (major_version > 0 || minor_version >= 2)) {
-    has_composite_extension_ = true;
-  } else {
-    LOG(LS_INFO) << "Xcomposite extension not available or too old.";
-  }
-
-  x_display_->AddEventHandler(ConfigureNotify, this);
-}
-
-WindowCapturerLinux::~WindowCapturerLinux() {
-  x_display_->RemoveEventHandler(ConfigureNotify, this);
-}
-
-bool WindowCapturerLinux::GetSourceList(SourceList* sources) {
-  return GetWindowList(&atom_cache_,
-                       [this, sources](::Window window) {
-                         Source w;
-                         w.id = window;
-                         if (this->GetWindowTitle(window, &w.title)) {
-                           sources->push_back(w);
-                         }
-                         return true;
-                       });
-}
-
-bool WindowCapturerLinux::SelectSource(SourceId id) {
-  if (!x_server_pixel_buffer_.Init(display(), id))
-    return false;
-
-  // Tell the X server to send us window resizing events.
-  XSelectInput(display(), id, StructureNotifyMask);
-
-  selected_window_ = id;
-
-  // In addition to needing X11 server-side support for Xcomposite, it actually
-  // needs to be turned on for the window. If the user has modern
-  // hardware/drivers but isn't using a compositing window manager, that won't
-  // be the case. Here we automatically turn it on.
-
-  // Redirect drawing to an offscreen buffer (ie, turn on compositing). X11
-  // remembers who has requested this and will turn it off for us when we exit.
-  XCompositeRedirectWindow(display(), id, CompositeRedirectAutomatic);
-
-  return true;
-}
-
-bool WindowCapturerLinux::FocusOnSelectedSource() {
-  if (!selected_window_)
-    return false;
-
-  unsigned int num_children;
-  ::Window* children;
-  ::Window parent;
-  ::Window root;
-  // Find the root window to pass event to.
-  int status = XQueryTree(
-      display(), selected_window_, &root, &parent, &children, &num_children);
-  if (status == 0) {
-    LOG(LS_ERROR) << "Failed to query for the root window.";
-    return false;
-  }
-
-  if (children)
-    XFree(children);
-
-  XRaiseWindow(display(), selected_window_);
-
-  // Some window managers (e.g., metacity in GNOME) consider it illegal to
-  // raise a window without also giving it input focus with
-  // _NET_ACTIVE_WINDOW, so XRaiseWindow() on its own isn't enough.
-  Atom atom = XInternAtom(display(), "_NET_ACTIVE_WINDOW", True);
-  if (atom != None) {
-    XEvent xev;
-    xev.xclient.type = ClientMessage;
-    xev.xclient.serial = 0;
-    xev.xclient.send_event = True;
-    xev.xclient.window = selected_window_;
-    xev.xclient.message_type = atom;
-
-    // The format member is set to 8, 16, or 32 and specifies whether the
-    // data should be viewed as a list of bytes, shorts, or longs.
-    xev.xclient.format = 32;
-
-    memset(xev.xclient.data.l, 0, sizeof(xev.xclient.data.l));
-
-    XSendEvent(display(),
-               root,
-               False,
-               SubstructureRedirectMask | SubstructureNotifyMask,
-               &xev);
-  }
-  XFlush(display());
-  return true;
-}
-
-void WindowCapturerLinux::Start(Callback* callback) {
-  RTC_DCHECK(!callback_);
-  RTC_DCHECK(callback);
-
-  callback_ = callback;
-}
-
-void WindowCapturerLinux::CaptureFrame() {
-  if (!x_server_pixel_buffer_.IsWindowValid()) {
-    LOG(LS_INFO) << "The window is no longer valid.";
-    callback_->OnCaptureResult(Result::ERROR_PERMANENT, nullptr);
-    return;
-  }
-
-  x_display_->ProcessPendingXEvents();
-
-  if (!has_composite_extension_) {
-    // Without the Xcomposite extension we capture when the whole window is
-    // visible on screen and not covered by any other window. This is not
-    // something we want so instead, just bail out.
-    LOG(LS_INFO) << "No Xcomposite extension detected.";
-    callback_->OnCaptureResult(Result::ERROR_PERMANENT, nullptr);
-    return;
-  }
-
-  if (GetWindowState(&atom_cache_, selected_window_) == IconicState) {
-    // Window is in minimized. Return a 1x1 frame as same as OSX/Win does.
-    std::unique_ptr<DesktopFrame> frame(
-        new BasicDesktopFrame(DesktopSize(1, 1)));
-    callback_->OnCaptureResult(Result::SUCCESS, std::move(frame));
-    return;
-  }
-
-  std::unique_ptr<DesktopFrame> frame(
-      new BasicDesktopFrame(x_server_pixel_buffer_.window_size()));
-
-  x_server_pixel_buffer_.Synchronize();
-  if (!x_server_pixel_buffer_.CaptureRect(DesktopRect::MakeSize(frame->size()),
-                                          frame.get())) {
-    callback_->OnCaptureResult(Result::ERROR_TEMPORARY, nullptr);
-    return;
-  }
-
-  frame->mutable_updated_region()->SetRect(
-      DesktopRect::MakeSize(frame->size()));
-  frame->set_top_left(x_server_pixel_buffer_.window_rect().top_left());
-
-  callback_->OnCaptureResult(Result::SUCCESS, std::move(frame));
-}
-
-bool WindowCapturerLinux::IsOccluded(const DesktopVector& pos) {
-  return window_finder_.GetWindowUnderPoint(pos) !=
-      static_cast<WindowId>(selected_window_);
-}
-
-bool WindowCapturerLinux::HandleXEvent(const XEvent& event) {
-  if (event.type == ConfigureNotify) {
-    XConfigureEvent xce = event.xconfigure;
-    if (xce.window == selected_window_) {
-      if (!DesktopRectFromXAttributes(xce).equals(
-            x_server_pixel_buffer_.window_rect())) {
-        if (!x_server_pixel_buffer_.Init(display(), selected_window_)) {
-          LOG(LS_ERROR) << "Failed to initialize pixel buffer after resizing.";
-        }
-      }
-    }
-  }
-
-  // Always returns false, so other observers can still receive the events.
-  return false;
-}
-
-bool WindowCapturerLinux::GetWindowTitle(::Window window, std::string* title) {
-  int status;
-  bool result = false;
-  XTextProperty window_name;
-  window_name.value = nullptr;
-  if (window) {
-    status = XGetWMName(display(), window, &window_name);
-    if (status && window_name.value && window_name.nitems) {
-      int cnt;
-      char** list = nullptr;
-      status = Xutf8TextPropertyToTextList(display(), &window_name, &list,
-                                           &cnt);
-      if (status >= Success && cnt && *list) {
-        if (cnt > 1) {
-          LOG(LS_INFO) << "Window has " << cnt
-                       << " text properties, only using the first one.";
-        }
-        *title = *list;
-        result = true;
-      }
-      if (list)
-        XFreeStringList(list);
-    }
-    if (window_name.value)
-      XFree(window_name.value);
-  }
-  return result;
-}
-
-}  // namespace
-
-// static
-std::unique_ptr<DesktopCapturer> DesktopCapturer::CreateRawWindowCapturer(
-    const DesktopCaptureOptions& options) {
-  if (!options.x_display())
-    return nullptr;
-  return std::unique_ptr<DesktopCapturer>(new WindowCapturerLinux(options));
-}
-
-}  // namespace webrtc
diff --git a/modules/desktop_capture/window_finder.h b/modules/desktop_capture/window_finder.h
deleted file mode 100644
index f1ede97..0000000
--- a/modules/desktop_capture/window_finder.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- *  Copyright (c) 2017 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_DESKTOP_CAPTURE_WINDOW_FINDER_H_
-#define WEBRTC_MODULES_DESKTOP_CAPTURE_WINDOW_FINDER_H_
-
-#include <memory>
-
-#include "webrtc/modules/desktop_capture/desktop_capture_types.h"
-#include "webrtc/modules/desktop_capture/desktop_geometry.h"
-
-namespace webrtc {
-
-#if defined(USE_X11)
-class XAtomCache;
-#endif
-
-// An interface to return the id of the visible window under a certain point.
-class WindowFinder {
- public:
-  WindowFinder() = default;
-  virtual ~WindowFinder() = default;
-
-  // Returns the id of the visible window under |point|. This function returns
-  // kNullWindowId if no window is under |point| and the platform does not have
-  // "root window" concept, i.e. the visible area under |point| is the desktop.
-  // |point| is always in system coordinate, i.e. the primary monitor always
-  // starts from (0, 0).
-  virtual WindowId GetWindowUnderPoint(DesktopVector point) = 0;
-
-  struct Options {
-#if defined(USE_X11)
-    XAtomCache* cache = nullptr;
-#endif
-  };
-
-  // Creates a platform-independent WindowFinder implementation. This function
-  // returns nullptr if |options| does not contain enough information or
-  // WindowFinder does not support current platform.
-  static std::unique_ptr<WindowFinder> Create(const Options& options);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_DESKTOP_CAPTURE_WINDOW_FINDER_H_
diff --git a/modules/desktop_capture/window_finder_mac.h b/modules/desktop_capture/window_finder_mac.h
deleted file mode 100644
index 9f872ea..0000000
--- a/modules/desktop_capture/window_finder_mac.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- *  Copyright (c) 2017 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_DESKTOP_CAPTURE_WINDOW_FINDER_MAC_H_
-#define WEBRTC_MODULES_DESKTOP_CAPTURE_WINDOW_FINDER_MAC_H_
-
-#include "webrtc/modules/desktop_capture/window_finder.h"
-
-namespace webrtc {
-
-// The implementation of WindowFinder for Mac OSX.
-class WindowFinderMac final : public WindowFinder {
- public:
-  WindowFinderMac();
-  ~WindowFinderMac() override;
-
-  // WindowFinder implementation.
-  WindowId GetWindowUnderPoint(DesktopVector point) override;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_DESKTOP_CAPTURE_WINDOW_FINDER_MAC_H_
diff --git a/modules/desktop_capture/window_finder_mac.mm b/modules/desktop_capture/window_finder_mac.mm
deleted file mode 100644
index 8bf7150..0000000
--- a/modules/desktop_capture/window_finder_mac.mm
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- *  Copyright (c) 2017 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/desktop_capture/window_finder_mac.h"
-
-#include <CoreFoundation/CoreFoundation.h>
-
-#include "webrtc/modules/desktop_capture/mac/window_list_utils.h"
-#include "webrtc/rtc_base/ptr_util.h"
-
-namespace webrtc {
-
-WindowFinderMac::WindowFinderMac() = default;
-WindowFinderMac::~WindowFinderMac() = default;
-
-WindowId WindowFinderMac::GetWindowUnderPoint(DesktopVector point) {
-  WindowId id = kNullWindowId;
-  GetWindowList([&id, point](CFDictionaryRef window) {
-                  DesktopRect bounds = GetWindowBounds(window);
-                  if (bounds.Contains(point)) {
-                    id = GetWindowId(window);
-                    return false;
-                  }
-                  return true;
-                },
-                true);
-  return id;
-}
-
-// static
-std::unique_ptr<WindowFinder> WindowFinder::Create(
-    const WindowFinder::Options& options) {
-  return rtc::MakeUnique<WindowFinderMac>();
-}
-
-}  // namespace webrtc
diff --git a/modules/desktop_capture/window_finder_unittest.cc b/modules/desktop_capture/window_finder_unittest.cc
deleted file mode 100644
index 6121ded..0000000
--- a/modules/desktop_capture/window_finder_unittest.cc
+++ /dev/null
@@ -1,161 +0,0 @@
-/*
- *  Copyright (c) 2017 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/desktop_capture/window_finder.h"
-
-#include <stdint.h>
-
-#include <memory>
-
-#include "webrtc/modules/desktop_capture/desktop_geometry.h"
-#include "webrtc/modules/desktop_capture/screen_drawer.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/test/gtest.h"
-
-#if defined(USE_X11)
-#include "webrtc/modules/desktop_capture/x11/shared_x_display.h"
-#include "webrtc/modules/desktop_capture/x11/x_atom_cache.h"
-#include "webrtc/rtc_base/ptr_util.h"
-#endif
-
-#if defined(WEBRTC_WIN)
-#include <windows.h>
-
-#include "webrtc/modules/desktop_capture/window_finder_win.h"
-#include "webrtc/modules/desktop_capture/win/window_capture_utils.h"
-#endif
-
-namespace webrtc {
-
-namespace {
-
-#if defined(WEBRTC_WIN)
-// ScreenDrawerWin does not have a message loop, so it's unresponsive to user
-// inputs. WindowFinderWin cannot detect this kind of unresponsive windows.
-// Instead, console window is used to test WindowFinderWin.
-TEST(WindowFinderTest, FindConsoleWindow) {
-  // Creates a ScreenDrawer to avoid this test from conflicting with
-  // ScreenCapturerIntegrationTest: both tests require its window to be in
-  // foreground.
-  //
-  // In ScreenCapturer related tests, this is controlled by
-  // ScreenDrawer, which has a global lock to ensure only one ScreenDrawer
-  // window is active. So even we do not use ScreenDrawer for Windows test,
-  // creating an instance can block ScreenCapturer related tests until this test
-  // finishes.
-  //
-  // Usually the test framework should take care of this "isolated test"
-  // requirement, but unfortunately WebRTC trybots do not support this.
-  std::unique_ptr<ScreenDrawer> drawer = ScreenDrawer::Create();
-  const int kMaxSize = 10000;
-  // Enlarges current console window.
-  system("mode 1000,1000");
-  const HWND console_window = GetConsoleWindow();
-  MoveWindow(console_window, 0, 0, kMaxSize, kMaxSize, true);
-
-  // Brings console window to top.
-  SetWindowPos(
-      console_window, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
-  BringWindowToTop(console_window);
-
-  WindowFinderWin finder;
-  for (int i = 0; i < kMaxSize; i++) {
-    const DesktopVector spot(i, i);
-    const HWND id = reinterpret_cast<HWND>(finder.GetWindowUnderPoint(spot));
-    if (id == console_window) {
-      return;
-    }
-  }
-
-  FAIL();
-}
-
-#else
-TEST(WindowFinderTest, FindDrawerWindow) {
-  WindowFinder::Options options;
-#if defined(USE_X11)
-  std::unique_ptr<XAtomCache> cache;
-  const auto shared_x_display = SharedXDisplay::CreateDefault();
-  if (shared_x_display) {
-    cache = rtc::MakeUnique<XAtomCache>(shared_x_display->display());
-    options.cache = cache.get();
-  }
-#endif
-  std::unique_ptr<WindowFinder> finder = WindowFinder::Create(options);
-  if (!finder) {
-    LOG(LS_WARNING) << "No WindowFinder implementation for current platform.";
-    return;
-  }
-
-  std::unique_ptr<ScreenDrawer> drawer = ScreenDrawer::Create();
-  if (!drawer) {
-    LOG(LS_WARNING) << "No ScreenDrawer implementation for current platform.";
-    return;
-  }
-
-  if (drawer->window_id() == kNullWindowId) {
-    // TODO(zijiehe): WindowFinderTest can use a dedicated window without
-    // relying on ScreenDrawer.
-    LOG(LS_WARNING) << "ScreenDrawer implementation for current platform does "
-                       "create a window.";
-    return;
-  }
-
-  // ScreenDrawer may not be able to bring the window to the top. So we test
-  // several spots, at least one of them should succeed.
-  const DesktopRect region = drawer->DrawableRegion();
-  if (region.is_empty()) {
-    LOG(LS_WARNING) << "ScreenDrawer::DrawableRegion() is too small for the "
-                       "WindowFinderTest.";
-    return;
-  }
-
-  for (int i = 0; i < region.width(); i++) {
-    const DesktopVector spot(
-        region.left() + i, region.top() + i * region.height() / region.width());
-    const WindowId id = finder->GetWindowUnderPoint(spot);
-    if (id == drawer->window_id()) {
-      return;
-    }
-  }
-
-  FAIL();
-}
-#endif
-
-TEST(WindowFinderTest, ShouldReturnNullWindowIfSpotIsOutOfScreen) {
-  WindowFinder::Options options;
-#if defined(USE_X11)
-  std::unique_ptr<XAtomCache> cache;
-  const auto shared_x_display = SharedXDisplay::CreateDefault();
-  if (shared_x_display) {
-    cache = rtc::MakeUnique<XAtomCache>(shared_x_display->display());
-    options.cache = cache.get();
-  }
-#endif
-  std::unique_ptr<WindowFinder> finder = WindowFinder::Create(options);
-  if (!finder) {
-    LOG(LS_WARNING) << "No WindowFinder implementation for current platform.";
-    return;
-  }
-
-  ASSERT_EQ(kNullWindowId, finder->GetWindowUnderPoint(
-      DesktopVector(INT16_MAX, INT16_MAX)));
-  ASSERT_EQ(kNullWindowId, finder->GetWindowUnderPoint(
-      DesktopVector(INT16_MAX, INT16_MIN)));
-  ASSERT_EQ(kNullWindowId, finder->GetWindowUnderPoint(
-      DesktopVector(INT16_MIN, INT16_MAX)));
-  ASSERT_EQ(kNullWindowId, finder->GetWindowUnderPoint(
-      DesktopVector(INT16_MIN, INT16_MIN)));
-}
-
-}  // namespace
-
-}  // namespace webrtc
diff --git a/modules/desktop_capture/window_finder_win.cc b/modules/desktop_capture/window_finder_win.cc
deleted file mode 100644
index 19dbea3..0000000
--- a/modules/desktop_capture/window_finder_win.cc
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- *  Copyright (c) 2017 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/desktop_capture/window_finder_win.h"
-
-#include <windows.h>
-
-#include "webrtc/rtc_base/ptr_util.h"
-
-namespace webrtc {
-
-WindowFinderWin::WindowFinderWin() = default;
-WindowFinderWin::~WindowFinderWin() = default;
-
-WindowId WindowFinderWin::GetWindowUnderPoint(DesktopVector point) {
-  HWND window = WindowFromPoint(POINT { point.x(), point.y() });
-  if (!window) {
-    return kNullWindowId;
-  }
-
-  // The difference between GA_ROOTOWNER and GA_ROOT can be found at
-  // https://groups.google.com/a/chromium.org/forum/#!topic/chromium-dev/Hirr_DkuZdw.
-  // In short, we should use GA_ROOT, since we only care about the root window
-  // but not the owner.
-  window = GetAncestor(window, GA_ROOT);
-  if (!window) {
-    return kNullWindowId;
-  }
-
-  return reinterpret_cast<WindowId>(window);
-}
-
-// static
-std::unique_ptr<WindowFinder> WindowFinder::Create(
-    const WindowFinder::Options& options) {
-  return rtc::MakeUnique<WindowFinderWin>();
-}
-
-}  // namespace webrtc
diff --git a/modules/desktop_capture/window_finder_win.h b/modules/desktop_capture/window_finder_win.h
deleted file mode 100644
index ceec426..0000000
--- a/modules/desktop_capture/window_finder_win.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- *  Copyright (c) 2017 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_DESKTOP_CAPTURE_WINDOW_FINDER_WIN_H_
-#define WEBRTC_MODULES_DESKTOP_CAPTURE_WINDOW_FINDER_WIN_H_
-
-#include "webrtc/modules/desktop_capture/window_finder.h"
-
-namespace webrtc {
-
-// The implementation of WindowFinder for Windows.
-class WindowFinderWin final : public WindowFinder {
- public:
-  WindowFinderWin();
-  ~WindowFinderWin() override;
-
-  // WindowFinder implementation.
-  WindowId GetWindowUnderPoint(DesktopVector point) override;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_DESKTOP_CAPTURE_WINDOW_FINDER_WIN_H_
diff --git a/modules/desktop_capture/window_finder_x11.cc b/modules/desktop_capture/window_finder_x11.cc
deleted file mode 100644
index d929460..0000000
--- a/modules/desktop_capture/window_finder_x11.cc
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- *  Copyright (c) 2017 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/desktop_capture/window_finder_x11.h"
-
-#include "webrtc/modules/desktop_capture/x11/window_list_utils.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/ptr_util.h"
-
-namespace webrtc {
-
-WindowFinderX11::WindowFinderX11(XAtomCache* cache)
-    : cache_(cache) {
-  RTC_DCHECK(cache_);
-}
-
-WindowFinderX11::~WindowFinderX11() = default;
-
-WindowId WindowFinderX11::GetWindowUnderPoint(DesktopVector point) {
-  WindowId id = kNullWindowId;
-  GetWindowList(cache_,
-                [&id, this, point](::Window window) {
-                  DesktopRect rect;
-                  if (GetWindowRect(this->cache_->display(), window, &rect) &&
-                      rect.Contains(point)) {
-                    id = window;
-                    return false;
-                  }
-                  return true;
-                });
-  return id;
-}
-
-// static
-std::unique_ptr<WindowFinder> WindowFinder::Create(
-    const WindowFinder::Options& options) {
-  if (options.cache == nullptr) {
-    return nullptr;
-  }
-
-  return rtc::MakeUnique<WindowFinderX11>(options.cache);
-}
-
-}  // namespace webrtc
diff --git a/modules/desktop_capture/window_finder_x11.h b/modules/desktop_capture/window_finder_x11.h
deleted file mode 100644
index 6dec89b..0000000
--- a/modules/desktop_capture/window_finder_x11.h
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- *  Copyright (c) 2017 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_DESKTOP_CAPTURE_WINDOW_FINDER_X11_H_
-#define WEBRTC_MODULES_DESKTOP_CAPTURE_WINDOW_FINDER_X11_H_
-
-#include "webrtc/modules/desktop_capture/window_finder.h"
-
-namespace webrtc {
-
-class XAtomCache;
-
-// The implementation of WindowFinder for X11.
-class WindowFinderX11 final : public WindowFinder {
- public:
-  explicit WindowFinderX11(XAtomCache* cache);
-  ~WindowFinderX11() override;
-
-  // WindowFinder implementation.
-  WindowId GetWindowUnderPoint(DesktopVector point) override;
-
- private:
-  XAtomCache* const cache_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_DESKTOP_CAPTURE_WINDOW_FINDER_X11_H_
diff --git a/modules/desktop_capture/x11/shared_x_display.cc b/modules/desktop_capture/x11/shared_x_display.cc
deleted file mode 100644
index 853d50f..0000000
--- a/modules/desktop_capture/x11/shared_x_display.cc
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- *  Copyright (c) 2013 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/desktop_capture/x11/shared_x_display.h"
-
-#include <X11/Xlib.h>
-
-#include <algorithm>
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-
-namespace webrtc {
-
-SharedXDisplay::SharedXDisplay(Display* display)
-  : display_(display) {
-  RTC_DCHECK(display_);
-}
-
-SharedXDisplay::~SharedXDisplay() {
-  RTC_DCHECK(event_handlers_.empty());
-  XCloseDisplay(display_);
-}
-
-// static
-rtc::scoped_refptr<SharedXDisplay> SharedXDisplay::Create(
-    const std::string& display_name) {
-  Display* display =
-      XOpenDisplay(display_name.empty() ? NULL : display_name.c_str());
-  if (!display) {
-    LOG(LS_ERROR) << "Unable to open display";
-    return NULL;
-  }
-  return new SharedXDisplay(display);
-}
-
-// static
-rtc::scoped_refptr<SharedXDisplay> SharedXDisplay::CreateDefault() {
-  return Create(std::string());
-}
-
-void SharedXDisplay::AddEventHandler(int type, XEventHandler* handler) {
-  event_handlers_[type].push_back(handler);
-}
-
-void SharedXDisplay::RemoveEventHandler(int type, XEventHandler* handler) {
-  EventHandlersMap::iterator handlers = event_handlers_.find(type);
-  if (handlers == event_handlers_.end())
-    return;
-
-  std::vector<XEventHandler*>::iterator new_end =
-      std::remove(handlers->second.begin(), handlers->second.end(), handler);
-  handlers->second.erase(new_end, handlers->second.end());
-
-  // Check if no handlers left for this event.
-  if (handlers->second.empty())
-    event_handlers_.erase(handlers);
-}
-
-void SharedXDisplay::ProcessPendingXEvents() {
-  // Hold reference to |this| to prevent it from being destroyed while
-  // processing events.
-  rtc::scoped_refptr<SharedXDisplay> self(this);
-
-  // Find the number of events that are outstanding "now."  We don't just loop
-  // on XPending because we want to guarantee this terminates.
-  int events_to_process = XPending(display());
-  XEvent e;
-
-  for (int i = 0; i < events_to_process; i++) {
-    XNextEvent(display(), &e);
-    EventHandlersMap::iterator handlers = event_handlers_.find(e.type);
-    if (handlers == event_handlers_.end())
-      continue;
-    for (std::vector<XEventHandler*>::iterator it = handlers->second.begin();
-         it != handlers->second.end(); ++it) {
-      if ((*it)->HandleXEvent(e))
-        break;
-    }
-  }
-}
-
-}  // namespace webrtc
diff --git a/modules/desktop_capture/x11/shared_x_display.h b/modules/desktop_capture/x11/shared_x_display.h
deleted file mode 100644
index 3dcd2fd..0000000
--- a/modules/desktop_capture/x11/shared_x_display.h
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- *  Copyright (c) 2013 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_DESKTOP_CAPTURE_X11_SHARED_X_DISPLAY_H_
-#define WEBRTC_MODULES_DESKTOP_CAPTURE_X11_SHARED_X_DISPLAY_H_
-
-#include <map>
-#include <vector>
-
-#include <string>
-
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/scoped_ref_ptr.h"
-#include "webrtc/system_wrappers/include/atomic32.h"
-
-// Including Xlib.h will involve evil defines (Bool, Status, True, False), which
-// easily conflict with other headers.
-typedef struct _XDisplay Display;
-typedef union _XEvent XEvent;
-
-namespace webrtc {
-
-// A ref-counted object to store XDisplay connection.
-class SharedXDisplay {
- public:
-  class XEventHandler {
-   public:
-    virtual ~XEventHandler() {}
-
-    // Processes XEvent. Returns true if the event has been handled.
-    virtual bool HandleXEvent(const XEvent& event) = 0;
-  };
-
-  // Takes ownership of |display|.
-  explicit SharedXDisplay(Display* display);
-
-  // Creates a new X11 Display for the |display_name|. NULL is returned if X11
-  // connection failed. Equivalent to CreateDefault() when |display_name| is
-  // empty.
-  static rtc::scoped_refptr<SharedXDisplay> Create(
-      const std::string& display_name);
-
-  // Creates X11 Display connection for the default display (e.g. specified in
-  // DISPLAY). NULL is returned if X11 connection failed.
-  static rtc::scoped_refptr<SharedXDisplay> CreateDefault();
-
-  void AddRef() { ++ref_count_; }
-  void Release() {
-    if (--ref_count_ == 0)
-      delete this;
-  }
-
-  Display* display() { return display_; }
-
-  // Adds a new event |handler| for XEvent's of |type|.
-  void AddEventHandler(int type, XEventHandler* handler);
-
-  // Removes event |handler| added using |AddEventHandler|. Doesn't do anything
-  // if |handler| is not registered.
-  void RemoveEventHandler(int type, XEventHandler* handler);
-
-  // Processes pending XEvents, calling corresponding event handlers.
-  void ProcessPendingXEvents();
-
- private:
-  typedef std::map<int, std::vector<XEventHandler*> > EventHandlersMap;
-
-  ~SharedXDisplay();
-
-  Atomic32 ref_count_;
-  Display* display_;
-
-  EventHandlersMap event_handlers_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(SharedXDisplay);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_DESKTOP_CAPTURE_X11_SHARED_X_DISPLAY_H_
diff --git a/modules/desktop_capture/x11/window_list_utils.cc b/modules/desktop_capture/x11/window_list_utils.cc
deleted file mode 100644
index d8c6e57..0000000
--- a/modules/desktop_capture/x11/window_list_utils.cc
+++ /dev/null
@@ -1,261 +0,0 @@
-/*
- *  Copyright (c) 2017 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/desktop_capture/x11/window_list_utils.h"
-
-#include <string.h>
-#include <X11/Xlib.h>
-#include <X11/Xatom.h>
-#include <X11/Xutil.h>
-
-#include <algorithm>
-
-#include "webrtc/modules/desktop_capture/x11/x_error_trap.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/logging.h"
-
-namespace webrtc {
-
-namespace {
-
-class DeferXFree {
- public:
-  explicit DeferXFree(void* data) : data_(data) {}
-  ~DeferXFree();
-
- private:
-  void* const data_;
-};
-
-DeferXFree::~DeferXFree() {
-  if (data_)
-    XFree(data_);
-}
-
-// Convenience wrapper for XGetWindowProperty() results.
-template <class PropertyType>
-class XWindowProperty {
- public:
-  XWindowProperty(Display* display, Window window, Atom property) {
-    const int kBitsPerByte = 8;
-    Atom actual_type;
-    int actual_format;
-    unsigned long bytes_after;  // NOLINT: type required by XGetWindowProperty
-    int status = XGetWindowProperty(display, window, property, 0L, ~0L, False,
-                                    AnyPropertyType, &actual_type,
-                                    &actual_format, &size_,
-                                    &bytes_after, &data_);
-    if (status != Success) {
-      data_ = nullptr;
-      return;
-    }
-    if (sizeof(PropertyType) * kBitsPerByte != actual_format) {
-      size_ = 0;
-      return;
-    }
-
-    is_valid_ = true;
-  }
-
-  ~XWindowProperty() {
-    if (data_)
-      XFree(data_);
-  }
-
-  // True if we got properly value successfully.
-  bool is_valid() const { return is_valid_; }
-
-  // Size and value of the property.
-  size_t size() const { return size_; }
-  const PropertyType* data() const {
-    return reinterpret_cast<PropertyType*>(data_);
-  }
-  PropertyType* data() {
-    return reinterpret_cast<PropertyType*>(data_);
-  }
-
- private:
-  bool is_valid_ = false;
-  unsigned long size_ = 0;  // NOLINT: type required by XGetWindowProperty
-  unsigned char* data_ = nullptr;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(XWindowProperty);
-};
-
-// Iterates through |window| hierarchy to find first visible window, i.e. one
-// that has WM_STATE property set to NormalState.
-// See http://tronche.com/gui/x/icccm/sec-4.html#s-4.1.3.1 .
-::Window GetApplicationWindow(XAtomCache* cache, ::Window window) {
-  int32_t state = GetWindowState(cache, window);
-  if (state == NormalState) {
-    // Window has WM_STATE==NormalState. Return it.
-    return window;
-  } else if (state == IconicState) {
-    // Window is in minimized. Skip it.
-    return 0;
-  }
-
-  RTC_DCHECK_EQ(state, WithdrawnState);
-  // If the window is in WithdrawnState then look at all of its children.
-  ::Window root, parent;
-  ::Window *children;
-  unsigned int num_children;
-  if (!XQueryTree(cache->display(), window, &root, &parent, &children,
-                  &num_children)) {
-    LOG(LS_ERROR) << "Failed to query for child windows although window"
-                  << "does not have a valid WM_STATE.";
-    return 0;
-  }
-  ::Window app_window = 0;
-  for (unsigned int i = 0; i < num_children; ++i) {
-    app_window = GetApplicationWindow(cache, children[i]);
-    if (app_window)
-      break;
-  }
-
-  if (children)
-    XFree(children);
-  return app_window;
-}
-
-// Returns true if the |window| is a desktop element.
-bool IsDesktopElement(XAtomCache* cache, ::Window window) {
-  RTC_DCHECK(cache);
-  if (window == 0)
-    return false;
-
-  // First look for _NET_WM_WINDOW_TYPE. The standard
-  // (http://standards.freedesktop.org/wm-spec/latest/ar01s05.html#id2760306)
-  // says this hint *should* be present on all windows, and we use the existence
-  // of _NET_WM_WINDOW_TYPE_NORMAL in the property to indicate a window is not
-  // a desktop element (that is, only "normal" windows should be shareable).
-  XWindowProperty<uint32_t> window_type(
-      cache->display(), window, cache->WindowType());
-  if (window_type.is_valid() && window_type.size() > 0) {
-    uint32_t* end = window_type.data() + window_type.size();
-    bool is_normal = (end != std::find(
-        window_type.data(),
-        end,
-        cache->WindowTypeNormal()));
-    return !is_normal;
-  }
-
-  // Fall back on using the hint.
-  XClassHint class_hint;
-  Status status = XGetClassHint(cache->display(), window, &class_hint);
-  if (status == 0) {
-    // No hints, assume this is a normal application window.
-    return false;
-  }
-
-  DeferXFree free_res_name(class_hint.res_name);
-  DeferXFree free_res_class(class_hint.res_class);
-  return strcmp("gnome-panel", class_hint.res_name) == 0 ||
-         strcmp("desktop_window", class_hint.res_name) == 0;
-}
-
-}  // namespace
-
-int32_t GetWindowState(XAtomCache* cache, ::Window window) {
-  // Get WM_STATE property of the window.
-  XWindowProperty<uint32_t> window_state(
-      cache->display(), window, cache->WmState());
-
-  // WM_STATE is considered to be set to WithdrawnState when it missing.
-  return window_state.is_valid() ? *window_state.data() : WithdrawnState;
-}
-
-bool GetWindowList(XAtomCache* cache,
-                   rtc::FunctionView<bool(::Window)> on_window) {
-  RTC_DCHECK(cache);
-  RTC_DCHECK(on_window);
-  ::Display* const display = cache->display();
-
-  int failed_screens = 0;
-  const int num_screens = XScreenCount(display);
-  for (int screen = 0; screen < num_screens; screen++) {
-    ::Window root_window = XRootWindow(display, screen);
-    ::Window parent;
-    ::Window* children;
-    unsigned int num_children;
-    {
-      XErrorTrap error_trap(display);
-      if (XQueryTree(display,
-                     root_window,
-                     &root_window,
-                     &parent,
-                     &children,
-                     &num_children) == 0 ||
-          error_trap.GetLastErrorAndDisable() != 0) {
-        failed_screens++;
-        LOG(LS_ERROR) << "Failed to query for child windows for screen "
-                      << screen;
-        continue;
-      }
-    }
-
-    DeferXFree free_children(children);
-
-    for (unsigned int i = 0; i < num_children; i++) {
-      // Iterates in reverse order to return windows from front to back.
-      ::Window app_window =
-          GetApplicationWindow(cache, children[num_children - 1 - i]);
-      if (app_window && !IsDesktopElement(cache, app_window)) {
-        if (!on_window(app_window)) {
-          return true;
-        }
-      }
-    }
-  }
-
-  return failed_screens < num_screens;
-}
-
-bool GetWindowRect(::Display* display,
-                   ::Window window,
-                   DesktopRect* rect,
-                   XWindowAttributes* attributes /* = nullptr */) {
-  XWindowAttributes local_attributes;
-  int offset_x;
-  int offset_y;
-  if (attributes == nullptr) {
-    attributes = &local_attributes;
-  }
-
-  {
-    XErrorTrap error_trap(display);
-    if (!XGetWindowAttributes(display, window, attributes) ||
-        error_trap.GetLastErrorAndDisable() != 0) {
-      return false;
-    }
-  }
-  {
-    XErrorTrap error_trap(display);
-    ::Window child;
-    if (!XTranslateCoordinates(display,
-                               window,
-                               attributes->root,
-                               0,
-                               0,
-                               &offset_x,
-                               &offset_y,
-                               &child) ||
-        error_trap.GetLastErrorAndDisable() != 0) {
-      return false;
-    }
-  }
-
-  *rect = DesktopRectFromXAttributes(*attributes);
-  rect->Translate(offset_x, offset_y);
-  return true;
-}
-
-}  // namespace webrtc
diff --git a/modules/desktop_capture/x11/window_list_utils.h b/modules/desktop_capture/x11/window_list_utils.h
deleted file mode 100644
index 8557e24..0000000
--- a/modules/desktop_capture/x11/window_list_utils.h
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- *  Copyright (c) 2017 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_DESKTOP_CAPTURE_X11_WINDOW_LIST_UTILS_H_
-#define WEBRTC_MODULES_DESKTOP_CAPTURE_X11_WINDOW_LIST_UTILS_H_
-
-#include <X11/Xlib.h>
-
-#include "webrtc/modules/desktop_capture/desktop_geometry.h"
-#include "webrtc/modules/desktop_capture/x11/x_atom_cache.h"
-#include "webrtc/rtc_base/function_view.h"
-
-namespace webrtc {
-
-// Synchronously iterates all on-screen windows in |cache|.display() in
-// decreasing z-order and sends them one-by-one to |on_window| function before
-// GetWindowList() returns. If |on_window| returns false, this function ignores
-// other windows and returns immediately. GetWindowList() returns false if
-// native APIs failed. If multiple screens are attached to the |display|, this
-// function returns false only when native APIs failed on all screens. Menus,
-// panels and minimized windows will be ignored.
-bool GetWindowList(XAtomCache* cache,
-                   rtc::FunctionView<bool(::Window)> on_window);
-
-// Returns WM_STATE property of the |window|. This function returns
-// WithdrawnState if the |window| is missing.
-int32_t GetWindowState(XAtomCache* cache, ::Window window);
-
-// Returns the rectangle of the |window| in the coordinates of |display|. This
-// function returns false if native APIs failed. If |attributes| is provided, it
-// will be filled with the attributes of |window|. The |rect| is in system
-// coordinate, i.e. the primary monitor always starts from (0, 0).
-bool GetWindowRect(::Display* display,
-                   ::Window window,
-                   DesktopRect* rect,
-                   XWindowAttributes* attributes = nullptr);
-
-// Creates a DesktopRect from |attributes|.
-template <typename T>
-DesktopRect DesktopRectFromXAttributes(const T& attributes) {
-  return DesktopRect::MakeXYWH(attributes.x,
-                               attributes.y,
-                               attributes.width,
-                               attributes.height);
-}
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_DESKTOP_CAPTURE_X11_WINDOW_LIST_UTILS_H_
diff --git a/modules/desktop_capture/x11/x_atom_cache.cc b/modules/desktop_capture/x11/x_atom_cache.cc
deleted file mode 100644
index 161c8e9..0000000
--- a/modules/desktop_capture/x11/x_atom_cache.cc
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- *  Copyright (c) 2017 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/desktop_capture/x11/x_atom_cache.h"
-
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-
-XAtomCache::XAtomCache(::Display* display) : display_(display) {
-  RTC_DCHECK(display_);
-}
-
-XAtomCache::~XAtomCache() = default;
-
-::Display* XAtomCache::display() const {
-  return display_;
-}
-
-Atom XAtomCache::WmState() {
-  return CreateIfNotExist(&wm_state_, "WM_STATE");
-}
-
-Atom XAtomCache::WindowType() {
-  return CreateIfNotExist(&window_type_, "_NET_WM_WINDOW_TYPE");
-}
-
-Atom XAtomCache::WindowTypeNormal() {
-  return CreateIfNotExist(&window_type_normal_, "_NET_WM_WINDOW_TYPE_NORMAL");
-}
-
-Atom XAtomCache::CreateIfNotExist(Atom* atom, const char* name) {
-  RTC_DCHECK(atom);
-  if (*atom == None) {
-    *atom = XInternAtom(display(), name, True);
-  }
-  return *atom;
-}
-
-}  // namespace webrtc
diff --git a/modules/desktop_capture/x11/x_atom_cache.h b/modules/desktop_capture/x11/x_atom_cache.h
deleted file mode 100644
index 8ccf2cb..0000000
--- a/modules/desktop_capture/x11/x_atom_cache.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- *  Copyright (c) 2017 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_DESKTOP_CAPTURE_X11_X_ATOM_CACHE_H_
-#define WEBRTC_MODULES_DESKTOP_CAPTURE_X11_X_ATOM_CACHE_H_
-
-#include <X11/Xlib.h>
-#include <X11/Xatom.h>
-
-namespace webrtc {
-
-// A cache of Atom. Each Atom object is created on demand.
-class XAtomCache final {
- public:
-  explicit XAtomCache(::Display* display);
-  ~XAtomCache();
-
-  ::Display* display() const;
-
-  Atom WmState();
-  Atom WindowType();
-  Atom WindowTypeNormal();
-
- private:
-  // If |*atom| is None, this function uses XInternAtom() to retrieve an Atom.
-  Atom CreateIfNotExist(Atom* atom, const char* name);
-
-  ::Display* const display_;
-  Atom wm_state_ = None;
-  Atom window_type_ = None;
-  Atom window_type_normal_ = None;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_DESKTOP_CAPTURE_X11_X_ATOM_CACHE_H_
diff --git a/modules/desktop_capture/x11/x_error_trap.cc b/modules/desktop_capture/x11/x_error_trap.cc
deleted file mode 100644
index 458fbe6..0000000
--- a/modules/desktop_capture/x11/x_error_trap.cc
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- *  Copyright (c) 2013 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/desktop_capture/x11/x_error_trap.h"
-
-#include <assert.h>
-
-#if defined(TOOLKIT_GTK)
-#include <gdk/gdk.h>
-#endif  // !defined(TOOLKIT_GTK)
-
-namespace webrtc {
-
-namespace {
-
-#if !defined(TOOLKIT_GTK)
-
-// TODO(sergeyu): This code is not thread safe. Fix it. Bug 2202.
-static bool g_xserver_error_trap_enabled = false;
-static int g_last_xserver_error_code = 0;
-
-int XServerErrorHandler(Display* display, XErrorEvent* error_event) {
-  assert(g_xserver_error_trap_enabled);
-  g_last_xserver_error_code = error_event->error_code;
-  return 0;
-}
-
-#endif  // !defined(TOOLKIT_GTK)
-
-}  // namespace
-
-XErrorTrap::XErrorTrap(Display* display)
-    : original_error_handler_(NULL),
-      enabled_(true) {
-#if defined(TOOLKIT_GTK)
-  gdk_error_trap_push();
-#else  // !defined(TOOLKIT_GTK)
-  assert(!g_xserver_error_trap_enabled);
-  original_error_handler_ = XSetErrorHandler(&XServerErrorHandler);
-  g_xserver_error_trap_enabled = true;
-  g_last_xserver_error_code = 0;
-#endif  // !defined(TOOLKIT_GTK)
-}
-
-int XErrorTrap::GetLastErrorAndDisable() {
-  enabled_ = false;
-#if defined(TOOLKIT_GTK)
-  return gdk_error_trap_push();
-#else  // !defined(TOOLKIT_GTK)
-  assert(g_xserver_error_trap_enabled);
-  XSetErrorHandler(original_error_handler_);
-  g_xserver_error_trap_enabled = false;
-  return g_last_xserver_error_code;
-#endif  // !defined(TOOLKIT_GTK)
-}
-
-XErrorTrap::~XErrorTrap() {
-  if (enabled_)
-    GetLastErrorAndDisable();
-}
-
-}  // namespace webrtc
diff --git a/modules/desktop_capture/x11/x_error_trap.h b/modules/desktop_capture/x11/x_error_trap.h
deleted file mode 100644
index 70414a4..0000000
--- a/modules/desktop_capture/x11/x_error_trap.h
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- *  Copyright (c) 2013 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_DESKTOP_CAPTURE_X11_X_ERROR_TRAP_H_
-#define WEBRTC_MODULES_DESKTOP_CAPTURE_X11_X_ERROR_TRAP_H_
-
-#include <X11/Xlib.h>
-
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace webrtc {
-
-// Helper class that registers X Window error handler. Caller can use
-// GetLastErrorAndDisable() to get the last error that was caught, if any.
-class XErrorTrap {
- public:
-  explicit XErrorTrap(Display* display);
-  ~XErrorTrap();
-
-  // Returns last error and removes unregisters the error handler.
-  int GetLastErrorAndDisable();
-
- private:
-  XErrorHandler original_error_handler_;
-  bool enabled_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(XErrorTrap);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_DESKTOP_CAPTURE_X11_X_ERROR_TRAP_H_
diff --git a/modules/desktop_capture/x11/x_server_pixel_buffer.cc b/modules/desktop_capture/x11/x_server_pixel_buffer.cc
deleted file mode 100644
index 5068802..0000000
--- a/modules/desktop_capture/x11/x_server_pixel_buffer.cc
+++ /dev/null
@@ -1,355 +0,0 @@
-/*
- *  Copyright (c) 2013 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/desktop_capture/x11/x_server_pixel_buffer.h"
-
-#include <string.h>
-#include <sys/shm.h>
-
-#include "webrtc/modules/desktop_capture/desktop_frame.h"
-#include "webrtc/modules/desktop_capture/x11/window_list_utils.h"
-#include "webrtc/modules/desktop_capture/x11/x_error_trap.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-
-namespace webrtc {
-
-namespace {
-
-// Returns the number of bits |mask| has to be shifted left so its last
-// (most-significant) bit set becomes the most-significant bit of the word.
-// When |mask| is 0 the function returns 31.
-uint32_t MaskToShift(uint32_t mask) {
-  int shift = 0;
-  if ((mask & 0xffff0000u) == 0) {
-    mask <<= 16;
-    shift += 16;
-  }
-  if ((mask & 0xff000000u) == 0) {
-    mask <<= 8;
-    shift += 8;
-  }
-  if ((mask & 0xf0000000u) == 0) {
-    mask <<= 4;
-    shift += 4;
-  }
-  if ((mask & 0xc0000000u) == 0) {
-    mask <<= 2;
-    shift += 2;
-  }
-  if ((mask & 0x80000000u) == 0)
-    shift += 1;
-
-  return shift;
-}
-
-// Returns true if |image| is in RGB format.
-bool IsXImageRGBFormat(XImage* image) {
-  return image->bits_per_pixel == 32 &&
-      image->red_mask == 0xff0000 &&
-      image->green_mask == 0xff00 &&
-      image->blue_mask == 0xff;
-}
-
-// We expose two forms of blitting to handle variations in the pixel format.
-// In FastBlit(), the operation is effectively a memcpy.
-void FastBlit(XImage* x_image,
-              uint8_t* src_pos,
-              const DesktopRect& rect,
-              DesktopFrame* frame) {
-  int src_stride = x_image->bytes_per_line;
-  int dst_x = rect.left(), dst_y = rect.top();
-
-  uint8_t* dst_pos = frame->data() + frame->stride() * dst_y;
-  dst_pos += dst_x * DesktopFrame::kBytesPerPixel;
-
-  int height = rect.height();
-  int row_bytes = rect.width() * DesktopFrame::kBytesPerPixel;
-  for (int y = 0; y < height; ++y) {
-    memcpy(dst_pos, src_pos, row_bytes);
-    src_pos += src_stride;
-    dst_pos += frame->stride();
-  }
-}
-
-void SlowBlit(XImage* x_image,
-              uint8_t* src_pos,
-              const DesktopRect& rect,
-              DesktopFrame* frame) {
-  int src_stride = x_image->bytes_per_line;
-  int dst_x = rect.left(), dst_y = rect.top();
-  int width = rect.width(), height = rect.height();
-
-  uint32_t red_mask = x_image->red_mask;
-  uint32_t green_mask = x_image->red_mask;
-  uint32_t blue_mask = x_image->blue_mask;
-
-  uint32_t red_shift = MaskToShift(red_mask);
-  uint32_t green_shift = MaskToShift(green_mask);
-  uint32_t blue_shift = MaskToShift(blue_mask);
-
-  int bits_per_pixel = x_image->bits_per_pixel;
-
-  uint8_t* dst_pos = frame->data() + frame->stride() * dst_y;
-  dst_pos += dst_x * DesktopFrame::kBytesPerPixel;
-  // TODO(hclam): Optimize, perhaps using MMX code or by converting to
-  // YUV directly.
-  // TODO(sergeyu): This code doesn't handle XImage byte order properly and
-  // won't work with 24bpp images. Fix it.
-  for (int y = 0; y < height; y++) {
-    uint32_t* dst_pos_32 = reinterpret_cast<uint32_t*>(dst_pos);
-    uint32_t* src_pos_32 = reinterpret_cast<uint32_t*>(src_pos);
-    uint16_t* src_pos_16 = reinterpret_cast<uint16_t*>(src_pos);
-    for (int x = 0; x < width; x++) {
-      // Dereference through an appropriately-aligned pointer.
-      uint32_t pixel;
-      if (bits_per_pixel == 32) {
-        pixel = src_pos_32[x];
-      } else if (bits_per_pixel == 16) {
-        pixel = src_pos_16[x];
-      } else {
-        pixel = src_pos[x];
-      }
-      uint32_t r = (pixel & red_mask) << red_shift;
-      uint32_t g = (pixel & green_mask) << green_shift;
-      uint32_t b = (pixel & blue_mask) << blue_shift;
-      // Write as 32-bit RGB.
-      dst_pos_32[x] =
-          ((r >> 8) & 0xff0000) | ((g >> 16) & 0xff00) | ((b >> 24) & 0xff);
-    }
-    dst_pos += frame->stride();
-    src_pos += src_stride;
-  }
-}
-
-}  // namespace
-
-XServerPixelBuffer::XServerPixelBuffer() {}
-
-XServerPixelBuffer::~XServerPixelBuffer() {
-  Release();
-}
-
-void XServerPixelBuffer::Release() {
-  if (x_image_) {
-    XDestroyImage(x_image_);
-    x_image_ = nullptr;
-  }
-  if (x_shm_image_) {
-    XDestroyImage(x_shm_image_);
-    x_shm_image_ = nullptr;
-  }
-  if (shm_pixmap_) {
-    XFreePixmap(display_, shm_pixmap_);
-    shm_pixmap_ = 0;
-  }
-  if (shm_gc_) {
-    XFreeGC(display_, shm_gc_);
-    shm_gc_ = nullptr;
-  }
-
-  ReleaseSharedMemorySegment();
-
-  window_ = 0;
-}
-
-void XServerPixelBuffer::ReleaseSharedMemorySegment() {
-  if (!shm_segment_info_)
-    return;
-  if (shm_segment_info_->shmaddr != nullptr)
-    shmdt(shm_segment_info_->shmaddr);
-  if (shm_segment_info_->shmid != -1)
-    shmctl(shm_segment_info_->shmid, IPC_RMID, 0);
-  delete shm_segment_info_;
-  shm_segment_info_ = nullptr;
-}
-
-bool XServerPixelBuffer::Init(Display* display, Window window) {
-  Release();
-  display_ = display;
-
-  XWindowAttributes attributes;
-  if (!GetWindowRect(display_, window, &window_rect_, &attributes)) {
-    return false;
-  }
-
-  window_ = window;
-  InitShm(attributes);
-
-  return true;
-}
-
-void XServerPixelBuffer::InitShm(const XWindowAttributes& attributes) {
-  Visual* default_visual = attributes.visual;
-  int default_depth = attributes.depth;
-
-  int major, minor;
-  Bool have_pixmaps;
-  if (!XShmQueryVersion(display_, &major, &minor, &have_pixmaps)) {
-    // Shared memory not supported. CaptureRect will use the XImage API instead.
-    return;
-  }
-
-  bool using_shm = false;
-  shm_segment_info_ = new XShmSegmentInfo;
-  shm_segment_info_->shmid = -1;
-  shm_segment_info_->shmaddr = nullptr;
-  shm_segment_info_->readOnly = False;
-  x_shm_image_ = XShmCreateImage(display_, default_visual, default_depth,
-                                 ZPixmap, 0, shm_segment_info_,
-                                 window_rect_.width(), window_rect_.height());
-  if (x_shm_image_) {
-    shm_segment_info_->shmid =
-        shmget(IPC_PRIVATE, x_shm_image_->bytes_per_line * x_shm_image_->height,
-               IPC_CREAT | 0600);
-    if (shm_segment_info_->shmid != -1) {
-      void* shmat_result = shmat(shm_segment_info_->shmid, 0, 0);
-      if (shmat_result != reinterpret_cast<void*>(-1)) {
-        shm_segment_info_->shmaddr = reinterpret_cast<char*>(shmat_result);
-        x_shm_image_->data = shm_segment_info_->shmaddr;
-
-        XErrorTrap error_trap(display_);
-        using_shm = XShmAttach(display_, shm_segment_info_);
-        XSync(display_, False);
-        if (error_trap.GetLastErrorAndDisable() != 0)
-          using_shm = false;
-        if (using_shm) {
-          LOG(LS_VERBOSE) << "Using X shared memory segment "
-                          << shm_segment_info_->shmid;
-        }
-      }
-    } else {
-      LOG(LS_WARNING) << "Failed to get shared memory segment. "
-                      "Performance may be degraded.";
-    }
-  }
-
-  if (!using_shm) {
-    LOG(LS_WARNING) << "Not using shared memory. Performance may be degraded.";
-    ReleaseSharedMemorySegment();
-    return;
-  }
-
-  if (have_pixmaps)
-    have_pixmaps = InitPixmaps(default_depth);
-
-  shmctl(shm_segment_info_->shmid, IPC_RMID, 0);
-  shm_segment_info_->shmid = -1;
-
-  LOG(LS_VERBOSE) << "Using X shared memory extension v"
-                  << major << "." << minor
-                  << " with" << (have_pixmaps ? "" : "out") << " pixmaps.";
-}
-
-bool XServerPixelBuffer::InitPixmaps(int depth) {
-  if (XShmPixmapFormat(display_) != ZPixmap)
-    return false;
-
-  {
-    XErrorTrap error_trap(display_);
-    shm_pixmap_ = XShmCreatePixmap(display_, window_,
-                                   shm_segment_info_->shmaddr,
-                                   shm_segment_info_,
-                                   window_rect_.width(),
-                                   window_rect_.height(), depth);
-    XSync(display_, False);
-    if (error_trap.GetLastErrorAndDisable() != 0) {
-      // |shm_pixmap_| is not not valid because the request was not processed
-      // by the X Server, so zero it.
-      shm_pixmap_ = 0;
-      return false;
-    }
-  }
-
-  {
-    XErrorTrap error_trap(display_);
-    XGCValues shm_gc_values;
-    shm_gc_values.subwindow_mode = IncludeInferiors;
-    shm_gc_values.graphics_exposures = False;
-    shm_gc_ = XCreateGC(display_, window_,
-                        GCSubwindowMode | GCGraphicsExposures,
-                        &shm_gc_values);
-    XSync(display_, False);
-    if (error_trap.GetLastErrorAndDisable() != 0) {
-      XFreePixmap(display_, shm_pixmap_);
-      shm_pixmap_ = 0;
-      shm_gc_ = 0;  // See shm_pixmap_ comment above.
-      return false;
-    }
-  }
-
-  return true;
-}
-
-bool XServerPixelBuffer::IsWindowValid() const {
-  XWindowAttributes attributes;
-  {
-    XErrorTrap error_trap(display_);
-    if (!XGetWindowAttributes(display_, window_, &attributes) ||
-        error_trap.GetLastErrorAndDisable() != 0) {
-      return false;
-    }
-  }
-  return true;
-}
-
-void XServerPixelBuffer::Synchronize() {
-  if (shm_segment_info_ && !shm_pixmap_) {
-    // XShmGetImage can fail if the display is being reconfigured.
-    XErrorTrap error_trap(display_);
-    // XShmGetImage fails if the window is partially out of screen.
-    xshm_get_image_succeeded_ =
-        XShmGetImage(display_, window_, x_shm_image_, 0, 0, AllPlanes);
-  }
-}
-
-bool XServerPixelBuffer::CaptureRect(const DesktopRect& rect,
-                                     DesktopFrame* frame) {
-  RTC_DCHECK_LE(rect.right(), window_rect_.width());
-  RTC_DCHECK_LE(rect.bottom(), window_rect_.height());
-
-  XImage* image;
-  uint8_t* data;
-
-  if (shm_segment_info_ && (shm_pixmap_ || xshm_get_image_succeeded_)) {
-    if (shm_pixmap_) {
-      XCopyArea(display_, window_, shm_pixmap_, shm_gc_,
-                rect.left(), rect.top(), rect.width(), rect.height(),
-                rect.left(), rect.top());
-      XSync(display_, False);
-    }
-
-    image = x_shm_image_;
-    data = reinterpret_cast<uint8_t*>(image->data) +
-           rect.top() * image->bytes_per_line +
-           rect.left() * image->bits_per_pixel / 8;
-
-  } else {
-    if (x_image_)
-      XDestroyImage(x_image_);
-    x_image_ = XGetImage(display_, window_, rect.left(), rect.top(),
-                         rect.width(), rect.height(), AllPlanes, ZPixmap);
-    if (!x_image_)
-      return false;
-
-    image = x_image_;
-    data = reinterpret_cast<uint8_t*>(image->data);
-  }
-
-  if (IsXImageRGBFormat(image)) {
-    FastBlit(image, data, rect, frame);
-  } else {
-    SlowBlit(image, data, rect, frame);
-  }
-
-  return true;
-}
-
-}  // namespace webrtc
diff --git a/modules/desktop_capture/x11/x_server_pixel_buffer.h b/modules/desktop_capture/x11/x_server_pixel_buffer.h
deleted file mode 100644
index 305b8e1..0000000
--- a/modules/desktop_capture/x11/x_server_pixel_buffer.h
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- *  Copyright (c) 2013 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.
- */
-
-// Don't include this file in any .h files because it pulls in some X headers.
-
-#ifndef WEBRTC_MODULES_DESKTOP_CAPTURE_X11_X_SERVER_PIXEL_BUFFER_H_
-#define WEBRTC_MODULES_DESKTOP_CAPTURE_X11_X_SERVER_PIXEL_BUFFER_H_
-
-#include "webrtc/modules/desktop_capture/desktop_geometry.h"
-#include "webrtc/rtc_base/constructormagic.h"
-
-#include <X11/Xutil.h>
-#include <X11/extensions/XShm.h>
-
-namespace webrtc {
-
-class DesktopFrame;
-
-// A class to allow the X server's pixel buffer to be accessed as efficiently
-// as possible.
-class XServerPixelBuffer {
- public:
-  XServerPixelBuffer();
-  ~XServerPixelBuffer();
-
-  void Release();
-
-  // Allocate (or reallocate) the pixel buffer for |window|. Returns false in
-  // case of an error (e.g. window doesn't exist).
-  bool Init(Display* display, Window window);
-
-  bool is_initialized() { return window_ != 0; }
-
-  // Returns the size of the window the buffer was initialized for.
-  DesktopSize window_size() { return window_rect_.size(); }
-
-  // Returns the rectangle of the window the buffer was initialized for.
-  const DesktopRect& window_rect() { return window_rect_; }
-
-  // Returns true if the window can be found.
-  bool IsWindowValid() const;
-
-  // If shared memory is being used without pixmaps, synchronize this pixel
-  // buffer with the root window contents (otherwise, this is a no-op).
-  // This is to avoid doing a full-screen capture for each individual
-  // rectangle in the capture list, when it only needs to be done once at the
-  // beginning.
-  void Synchronize();
-
-  // Capture the specified rectangle and stores it in the |frame|. In the case
-  // where the full-screen data is captured by Synchronize(), this simply
-  // returns the pointer without doing any more work. The caller must ensure
-  // that |rect| is not larger than window_size().
-  bool CaptureRect(const DesktopRect& rect, DesktopFrame* frame);
-
- private:
-  void ReleaseSharedMemorySegment();
-
-  void InitShm(const XWindowAttributes& attributes);
-  bool InitPixmaps(int depth);
-
-  Display* display_ = nullptr;
-  Window window_ = 0;
-  DesktopRect window_rect_;
-  XImage* x_image_ = nullptr;
-  XShmSegmentInfo* shm_segment_info_ = nullptr;
-  XImage* x_shm_image_ = nullptr;
-  Pixmap shm_pixmap_ = 0;
-  GC shm_gc_ = nullptr;
-  bool xshm_get_image_succeeded_ = false;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(XServerPixelBuffer);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_DESKTOP_CAPTURE_X11_X_SERVER_PIXEL_BUFFER_H_
diff --git a/modules/include/DEPS b/modules/include/DEPS
deleted file mode 100644
index d3f1725..0000000
--- a/modules/include/DEPS
+++ /dev/null
@@ -1,3 +0,0 @@
-include_rules = [
-  "+webrtc/common_video",
-]
diff --git a/modules/include/module.h b/modules/include/module.h
deleted file mode 100644
index 432ed40..0000000
--- a/modules/include/module.h
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- *  Copyright (c) 2012 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_INCLUDE_MODULE_H_
-#define WEBRTC_MODULES_INCLUDE_MODULE_H_
-
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-class ProcessThread;
-
-class Module {
- public:
-  // Returns the number of milliseconds until the module wants a worker
-  // thread to call Process.
-  // This method is called on the same worker thread as Process will
-  // be called on.
-  // TODO(tommi): Almost all implementations of this function, need to know
-  // the current tick count.  Consider passing it as an argument.  It could
-  // also improve the accuracy of when the next callback occurs since the
-  // thread that calls Process() will also have it's tick count reference
-  // which might not match with what the implementations use.
-  virtual int64_t TimeUntilNextProcess() = 0;
-
-  // Process any pending tasks such as timeouts.
-  // Called on a worker thread.
-  virtual void Process() = 0;
-
-  // This method is called when the module is attached to a *running* process
-  // thread or detached from one.  In the case of detaching, |process_thread|
-  // will be nullptr.
-  //
-  // This method will be called in the following cases:
-  //
-  // * Non-null process_thread:
-  //   * ProcessThread::RegisterModule() is called while the thread is running.
-  //   * ProcessThread::Start() is called and RegisterModule has previously
-  //     been called.  The thread will be started immediately after notifying
-  //     all modules.
-  //
-  // * Null process_thread:
-  //   * ProcessThread::DeRegisterModule() is called while the thread is
-  //     running.
-  //   * ProcessThread::Stop() was called and the thread has been stopped.
-  //
-  // NOTE: This method is not called from the worker thread itself, but from
-  //       the thread that registers/deregisters the module or calls Start/Stop.
-  virtual void ProcessThreadAttached(ProcessThread* process_thread) {}
-
- protected:
-  virtual ~Module() {}
-};
-
-// Reference counted version of the Module interface.
-class RefCountedModule : public Module {
- public:
-  // Increase the reference count by one.
-  // Returns the incremented reference count.
-  virtual int32_t AddRef() const = 0;
-
-  // Decrease the reference count by one.
-  // Returns the decreased reference count.
-  // Returns 0 if the last reference was just released.
-  // When the reference count reaches 0 the object will self-destruct.
-  virtual int32_t Release() const = 0;
-
- protected:
-  ~RefCountedModule() override = default;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_INCLUDE_MODULE_H_
diff --git a/modules/include/module_common_types.h b/modules/include/module_common_types.h
deleted file mode 100644
index a3ac2bb..0000000
--- a/modules/include/module_common_types.h
+++ /dev/null
@@ -1,647 +0,0 @@
-/*
- *  Copyright (c) 2012 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_INCLUDE_MODULE_COMMON_TYPES_H_
-#define WEBRTC_MODULES_INCLUDE_MODULE_COMMON_TYPES_H_
-
-#include <assert.h>
-#include <string.h>  // memcpy
-
-#include <algorithm>
-#include <limits>
-
-#include "webrtc/api/optional.h"
-#include "webrtc/api/video/video_rotation.h"
-#include "webrtc/common_types.h"
-#include "webrtc/modules/video_coding/codecs/h264/include/h264_globals.h"
-#include "webrtc/modules/video_coding/codecs/vp8/include/vp8_globals.h"
-#include "webrtc/modules/video_coding/codecs/vp9/include/vp9_globals.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/deprecation.h"
-#include "webrtc/rtc_base/safe_conversions.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-struct RTPAudioHeader {
-  uint8_t numEnergy;                  // number of valid entries in arrOfEnergy
-  uint8_t arrOfEnergy[kRtpCsrcSize];  // one energy byte (0-9) per channel
-  bool isCNG;                         // is this CNG
-  size_t channel;                     // number of channels 2 = stereo
-};
-
-union RTPVideoTypeHeader {
-  RTPVideoHeaderVP8 VP8;
-  RTPVideoHeaderVP9 VP9;
-  RTPVideoHeaderH264 H264;
-};
-
-enum RtpVideoCodecTypes {
-  kRtpVideoNone,
-  kRtpVideoGeneric,
-  kRtpVideoVp8,
-  kRtpVideoVp9,
-  kRtpVideoH264
-};
-// Since RTPVideoHeader is used as a member of a union, it can't have a
-// non-trivial default constructor.
-struct RTPVideoHeader {
-  uint16_t width;  // size
-  uint16_t height;
-  VideoRotation rotation;
-
-  PlayoutDelay playout_delay;
-
-  VideoContentType content_type;
-
-  VideoSendTiming video_timing;
-
-  bool is_first_packet_in_frame;
-  uint8_t simulcastIdx;  // Index if the simulcast encoder creating
-                         // this frame, 0 if not using simulcast.
-  RtpVideoCodecTypes codec;
-  RTPVideoTypeHeader codecHeader;
-};
-union RTPTypeHeader {
-  RTPAudioHeader Audio;
-  RTPVideoHeader Video;
-};
-
-struct WebRtcRTPHeader {
-  RTPHeader header;
-  FrameType frameType;
-  RTPTypeHeader type;
-  // NTP time of the capture time in local timebase in milliseconds.
-  int64_t ntp_time_ms;
-};
-
-class RTPFragmentationHeader {
- public:
-  RTPFragmentationHeader()
-      : fragmentationVectorSize(0),
-        fragmentationOffset(NULL),
-        fragmentationLength(NULL),
-        fragmentationTimeDiff(NULL),
-        fragmentationPlType(NULL) {}
-
-  RTPFragmentationHeader(RTPFragmentationHeader&& other)
-      : RTPFragmentationHeader() {
-    std::swap(*this, other);
-  }
-
-  ~RTPFragmentationHeader() {
-    delete[] fragmentationOffset;
-    delete[] fragmentationLength;
-    delete[] fragmentationTimeDiff;
-    delete[] fragmentationPlType;
-  }
-
-  void operator=(RTPFragmentationHeader&& other) { std::swap(*this, other); }
-
-  friend void swap(RTPFragmentationHeader& a, RTPFragmentationHeader& b) {
-    using std::swap;
-    swap(a.fragmentationVectorSize, b.fragmentationVectorSize);
-    swap(a.fragmentationOffset, b.fragmentationOffset);
-    swap(a.fragmentationLength, b.fragmentationLength);
-    swap(a.fragmentationTimeDiff, b.fragmentationTimeDiff);
-    swap(a.fragmentationPlType, b.fragmentationPlType);
-  }
-
-  void CopyFrom(const RTPFragmentationHeader& src) {
-    if (this == &src) {
-      return;
-    }
-
-    if (src.fragmentationVectorSize != fragmentationVectorSize) {
-      // new size of vectors
-
-      // delete old
-      delete[] fragmentationOffset;
-      fragmentationOffset = NULL;
-      delete[] fragmentationLength;
-      fragmentationLength = NULL;
-      delete[] fragmentationTimeDiff;
-      fragmentationTimeDiff = NULL;
-      delete[] fragmentationPlType;
-      fragmentationPlType = NULL;
-
-      if (src.fragmentationVectorSize > 0) {
-        // allocate new
-        if (src.fragmentationOffset) {
-          fragmentationOffset = new size_t[src.fragmentationVectorSize];
-        }
-        if (src.fragmentationLength) {
-          fragmentationLength = new size_t[src.fragmentationVectorSize];
-        }
-        if (src.fragmentationTimeDiff) {
-          fragmentationTimeDiff = new uint16_t[src.fragmentationVectorSize];
-        }
-        if (src.fragmentationPlType) {
-          fragmentationPlType = new uint8_t[src.fragmentationVectorSize];
-        }
-      }
-      // set new size
-      fragmentationVectorSize = src.fragmentationVectorSize;
-    }
-
-    if (src.fragmentationVectorSize > 0) {
-      // copy values
-      if (src.fragmentationOffset) {
-        memcpy(fragmentationOffset, src.fragmentationOffset,
-               src.fragmentationVectorSize * sizeof(size_t));
-      }
-      if (src.fragmentationLength) {
-        memcpy(fragmentationLength, src.fragmentationLength,
-               src.fragmentationVectorSize * sizeof(size_t));
-      }
-      if (src.fragmentationTimeDiff) {
-        memcpy(fragmentationTimeDiff, src.fragmentationTimeDiff,
-               src.fragmentationVectorSize * sizeof(uint16_t));
-      }
-      if (src.fragmentationPlType) {
-        memcpy(fragmentationPlType, src.fragmentationPlType,
-               src.fragmentationVectorSize * sizeof(uint8_t));
-      }
-    }
-  }
-
-  void VerifyAndAllocateFragmentationHeader(const size_t size) {
-    assert(size <= std::numeric_limits<uint16_t>::max());
-    const uint16_t size16 = static_cast<uint16_t>(size);
-    if (fragmentationVectorSize < size16) {
-      uint16_t oldVectorSize = fragmentationVectorSize;
-      {
-        // offset
-        size_t* oldOffsets = fragmentationOffset;
-        fragmentationOffset = new size_t[size16];
-        memset(fragmentationOffset + oldVectorSize, 0,
-               sizeof(size_t) * (size16 - oldVectorSize));
-        // copy old values
-        memcpy(fragmentationOffset, oldOffsets,
-               sizeof(size_t) * oldVectorSize);
-        delete[] oldOffsets;
-      }
-      // length
-      {
-        size_t* oldLengths = fragmentationLength;
-        fragmentationLength = new size_t[size16];
-        memset(fragmentationLength + oldVectorSize, 0,
-               sizeof(size_t) * (size16 - oldVectorSize));
-        memcpy(fragmentationLength, oldLengths,
-               sizeof(size_t) * oldVectorSize);
-        delete[] oldLengths;
-      }
-      // time diff
-      {
-        uint16_t* oldTimeDiffs = fragmentationTimeDiff;
-        fragmentationTimeDiff = new uint16_t[size16];
-        memset(fragmentationTimeDiff + oldVectorSize, 0,
-               sizeof(uint16_t) * (size16 - oldVectorSize));
-        memcpy(fragmentationTimeDiff, oldTimeDiffs,
-               sizeof(uint16_t) * oldVectorSize);
-        delete[] oldTimeDiffs;
-      }
-      // payload type
-      {
-        uint8_t* oldTimePlTypes = fragmentationPlType;
-        fragmentationPlType = new uint8_t[size16];
-        memset(fragmentationPlType + oldVectorSize, 0,
-               sizeof(uint8_t) * (size16 - oldVectorSize));
-        memcpy(fragmentationPlType, oldTimePlTypes,
-               sizeof(uint8_t) * oldVectorSize);
-        delete[] oldTimePlTypes;
-      }
-      fragmentationVectorSize = size16;
-    }
-  }
-
-  uint16_t fragmentationVectorSize;  // Number of fragmentations
-  size_t* fragmentationOffset;       // Offset of pointer to data for each
-                                     // fragmentation
-  size_t* fragmentationLength;       // Data size for each fragmentation
-  uint16_t* fragmentationTimeDiff;   // Timestamp difference relative "now" for
-                                     // each fragmentation
-  uint8_t* fragmentationPlType;      // Payload type of each fragmentation
-
- private:
-  RTC_DISALLOW_COPY_AND_ASSIGN(RTPFragmentationHeader);
-};
-
-struct RTCPVoIPMetric {
-  // RFC 3611 4.7
-  uint8_t lossRate;
-  uint8_t discardRate;
-  uint8_t burstDensity;
-  uint8_t gapDensity;
-  uint16_t burstDuration;
-  uint16_t gapDuration;
-  uint16_t roundTripDelay;
-  uint16_t endSystemDelay;
-  uint8_t signalLevel;
-  uint8_t noiseLevel;
-  uint8_t RERL;
-  uint8_t Gmin;
-  uint8_t Rfactor;
-  uint8_t extRfactor;
-  uint8_t MOSLQ;
-  uint8_t MOSCQ;
-  uint8_t RXconfig;
-  uint16_t JBnominal;
-  uint16_t JBmax;
-  uint16_t JBabsMax;
-};
-
-// Types for the FEC packet masks. The type |kFecMaskRandom| is based on a
-// random loss model. The type |kFecMaskBursty| is based on a bursty/consecutive
-// loss model. The packet masks are defined in
-// modules/rtp_rtcp/fec_private_tables_random(bursty).h
-enum FecMaskType {
-  kFecMaskRandom,
-  kFecMaskBursty,
-};
-
-// Struct containing forward error correction settings.
-struct FecProtectionParams {
-  int fec_rate;
-  int max_fec_frames;
-  FecMaskType fec_mask_type;
-};
-
-// Interface used by the CallStats class to distribute call statistics.
-// Callbacks will be triggered as soon as the class has been registered to a
-// CallStats object using RegisterStatsObserver.
-class CallStatsObserver {
- public:
-  virtual void OnRttUpdate(int64_t avg_rtt_ms, int64_t max_rtt_ms) = 0;
-
-  virtual ~CallStatsObserver() {}
-};
-
-/* This class holds up to 60 ms of super-wideband (32 kHz) stereo audio. It
- * allows for adding and subtracting frames while keeping track of the resulting
- * states.
- *
- * Notes
- * - The total number of samples is samples_per_channel_ * num_channels_
- * - Stereo data is interleaved starting with the left channel.
- */
-class AudioFrame {
- public:
-  // Using constexpr here causes linker errors unless the variable also has an
-  // out-of-class definition, which is impractical in this header-only class.
-  // (This makes no sense because it compiles as an enum value, which we most
-  // certainly cannot take the address of, just fine.) C++17 introduces inline
-  // variables which should allow us to switch to constexpr and keep this a
-  // header-only class.
-  enum : size_t {
-    // Stereo, 32 kHz, 60 ms (2 * 32 * 60)
-    kMaxDataSizeSamples = 3840,
-    kMaxDataSizeBytes = kMaxDataSizeSamples * sizeof(int16_t),
-  };
-
-  enum VADActivity {
-    kVadActive = 0,
-    kVadPassive = 1,
-    kVadUnknown = 2
-  };
-  enum SpeechType {
-    kNormalSpeech = 0,
-    kPLC = 1,
-    kCNG = 2,
-    kPLCCNG = 3,
-    kUndefined = 4
-  };
-
-  AudioFrame();
-
-  // Resets all members to their default state.
-  void Reset();
-  // Same as Reset(), but leaves mute state unchanged. Muting a frame requires
-  // the buffer to be zeroed on the next call to mutable_data(). Callers
-  // intending to write to the buffer immediately after Reset() can instead use
-  // ResetWithoutMuting() to skip this wasteful zeroing.
-  void ResetWithoutMuting();
-
-  void UpdateFrame(int id, uint32_t timestamp, const int16_t* data,
-                   size_t samples_per_channel, int sample_rate_hz,
-                   SpeechType speech_type, VADActivity vad_activity,
-                   size_t num_channels = 1);
-
-  void CopyFrom(const AudioFrame& src);
-
-  // data() returns a zeroed static buffer if the frame is muted.
-  // mutable_frame() always returns a non-static buffer; the first call to
-  // mutable_frame() zeros the non-static buffer and marks the frame unmuted.
-  const int16_t* data() const;
-  int16_t* mutable_data();
-
-  // Prefer to mute frames using AudioFrameOperations::Mute.
-  void Mute();
-  // Frame is muted by default.
-  bool muted() const;
-
-  // These methods are deprecated. Use the functions in
-  // webrtc/audio/utility instead. These methods will exists for a
-  // short period of time until webrtc clients have updated. See
-  // webrtc:6548 for details.
-  RTC_DEPRECATED AudioFrame& operator>>=(const int rhs);
-  RTC_DEPRECATED AudioFrame& operator+=(const AudioFrame& rhs);
-
-  int id_;
-  // RTP timestamp of the first sample in the AudioFrame.
-  uint32_t timestamp_ = 0;
-  // Time since the first frame in milliseconds.
-  // -1 represents an uninitialized value.
-  int64_t elapsed_time_ms_ = -1;
-  // NTP time of the estimated capture time in local timebase in milliseconds.
-  // -1 represents an uninitialized value.
-  int64_t ntp_time_ms_ = -1;
-  size_t samples_per_channel_ = 0;
-  int sample_rate_hz_ = 0;
-  size_t num_channels_ = 0;
-  SpeechType speech_type_ = kUndefined;
-  VADActivity vad_activity_ = kVadUnknown;
-
- private:
-  // A permamently zeroed out buffer to represent muted frames. This is a
-  // header-only class, so the only way to avoid creating a separate empty
-  // buffer per translation unit is to wrap a static in an inline function.
-  static const int16_t* empty_data() {
-    static const int16_t kEmptyData[kMaxDataSizeSamples] = {0};
-    static_assert(sizeof(kEmptyData) == kMaxDataSizeBytes, "kMaxDataSizeBytes");
-    return kEmptyData;
-  }
-
-  int16_t data_[kMaxDataSizeSamples];
-  bool muted_ = true;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(AudioFrame);
-};
-
-inline AudioFrame::AudioFrame() {
-  // Visual Studio doesn't like this in the class definition.
-  static_assert(sizeof(data_) == kMaxDataSizeBytes, "kMaxDataSizeBytes");
-}
-
-inline void AudioFrame::Reset() {
-  ResetWithoutMuting();
-  muted_ = true;
-}
-
-inline void AudioFrame::ResetWithoutMuting() {
-  id_ = -1;
-  // TODO(wu): Zero is a valid value for |timestamp_|. We should initialize
-  // to an invalid value, or add a new member to indicate invalidity.
-  timestamp_ = 0;
-  elapsed_time_ms_ = -1;
-  ntp_time_ms_ = -1;
-  samples_per_channel_ = 0;
-  sample_rate_hz_ = 0;
-  num_channels_ = 0;
-  speech_type_ = kUndefined;
-  vad_activity_ = kVadUnknown;
-}
-
-inline void AudioFrame::UpdateFrame(int id,
-                                    uint32_t timestamp,
-                                    const int16_t* data,
-                                    size_t samples_per_channel,
-                                    int sample_rate_hz,
-                                    SpeechType speech_type,
-                                    VADActivity vad_activity,
-                                    size_t num_channels) {
-  id_ = id;
-  timestamp_ = timestamp;
-  samples_per_channel_ = samples_per_channel;
-  sample_rate_hz_ = sample_rate_hz;
-  speech_type_ = speech_type;
-  vad_activity_ = vad_activity;
-  num_channels_ = num_channels;
-
-  const size_t length = samples_per_channel * num_channels;
-  assert(length <= kMaxDataSizeSamples);
-  if (data != nullptr) {
-    memcpy(data_, data, sizeof(int16_t) * length);
-    muted_ = false;
-  } else {
-    muted_ = true;
-  }
-}
-
-inline void AudioFrame::CopyFrom(const AudioFrame& src) {
-  if (this == &src) return;
-
-  id_ = src.id_;
-  timestamp_ = src.timestamp_;
-  elapsed_time_ms_ = src.elapsed_time_ms_;
-  ntp_time_ms_ = src.ntp_time_ms_;
-  muted_ = src.muted();
-  samples_per_channel_ = src.samples_per_channel_;
-  sample_rate_hz_ = src.sample_rate_hz_;
-  speech_type_ = src.speech_type_;
-  vad_activity_ = src.vad_activity_;
-  num_channels_ = src.num_channels_;
-
-  const size_t length = samples_per_channel_ * num_channels_;
-  assert(length <= kMaxDataSizeSamples);
-  if (!src.muted()) {
-    memcpy(data_, src.data(), sizeof(int16_t) * length);
-    muted_ = false;
-  }
-}
-
-inline const int16_t* AudioFrame::data() const {
-  return muted_ ? empty_data() : data_;
-}
-
-// TODO(henrik.lundin) Can we skip zeroing the buffer?
-// See https://bugs.chromium.org/p/webrtc/issues/detail?id=5647.
-inline int16_t* AudioFrame::mutable_data() {
-  if (muted_) {
-    memset(data_, 0, kMaxDataSizeBytes);
-    muted_ = false;
-  }
-  return data_;
-}
-
-inline void AudioFrame::Mute() {
-  muted_ = true;
-}
-
-inline bool AudioFrame::muted() const { return muted_; }
-
-inline AudioFrame& AudioFrame::operator>>=(const int rhs) {
-  assert((num_channels_ > 0) && (num_channels_ < 3));
-  if ((num_channels_ > 2) || (num_channels_ < 1)) return *this;
-  if (muted_) return *this;
-
-  for (size_t i = 0; i < samples_per_channel_ * num_channels_; i++) {
-    data_[i] = static_cast<int16_t>(data_[i] >> rhs);
-  }
-  return *this;
-}
-
-inline AudioFrame& AudioFrame::operator+=(const AudioFrame& rhs) {
-  // Sanity check
-  assert((num_channels_ > 0) && (num_channels_ < 3));
-  if ((num_channels_ > 2) || (num_channels_ < 1)) return *this;
-  if (num_channels_ != rhs.num_channels_) return *this;
-
-  bool noPrevData = muted_;
-  if (samples_per_channel_ != rhs.samples_per_channel_) {
-    if (samples_per_channel_ == 0) {
-      // special case we have no data to start with
-      samples_per_channel_ = rhs.samples_per_channel_;
-      noPrevData = true;
-    } else {
-      return *this;
-    }
-  }
-
-  if ((vad_activity_ == kVadActive) || rhs.vad_activity_ == kVadActive) {
-    vad_activity_ = kVadActive;
-  } else if (vad_activity_ == kVadUnknown || rhs.vad_activity_ == kVadUnknown) {
-    vad_activity_ = kVadUnknown;
-  }
-
-  if (speech_type_ != rhs.speech_type_) speech_type_ = kUndefined;
-
-  if (!rhs.muted()) {
-    muted_ = false;
-    if (noPrevData) {
-      memcpy(data_, rhs.data(),
-             sizeof(int16_t) * rhs.samples_per_channel_ * num_channels_);
-    } else {
-      // IMPROVEMENT this can be done very fast in assembly
-      for (size_t i = 0; i < samples_per_channel_ * num_channels_; i++) {
-        int32_t wrap_guard =
-            static_cast<int32_t>(data_[i]) + static_cast<int32_t>(rhs.data_[i]);
-        data_[i] = rtc::saturated_cast<int16_t>(wrap_guard);
-      }
-    }
-  }
-
-  return *this;
-}
-
-template <typename U>
-inline bool IsNewer(U value, U prev_value) {
-  static_assert(!std::numeric_limits<U>::is_signed, "U must be unsigned");
-  // kBreakpoint is the half-way mark for the type U. For instance, for a
-  // uint16_t it will be 0x8000, and for a uint32_t, it will be 0x8000000.
-  constexpr U kBreakpoint = (std::numeric_limits<U>::max() >> 1) + 1;
-  // Distinguish between elements that are exactly kBreakpoint apart.
-  // If t1>t2 and |t1-t2| = kBreakpoint: IsNewer(t1,t2)=true,
-  // IsNewer(t2,t1)=false
-  // rather than having IsNewer(t1,t2) = IsNewer(t2,t1) = false.
-  if (value - prev_value == kBreakpoint) {
-    return value > prev_value;
-  }
-  return value != prev_value &&
-         static_cast<U>(value - prev_value) < kBreakpoint;
-}
-
-inline bool IsNewerSequenceNumber(uint16_t sequence_number,
-                                  uint16_t prev_sequence_number) {
-  return IsNewer(sequence_number, prev_sequence_number);
-}
-
-inline bool IsNewerTimestamp(uint32_t timestamp, uint32_t prev_timestamp) {
-  return IsNewer(timestamp, prev_timestamp);
-}
-
-inline uint16_t LatestSequenceNumber(uint16_t sequence_number1,
-                                     uint16_t sequence_number2) {
-  return IsNewerSequenceNumber(sequence_number1, sequence_number2)
-             ? sequence_number1
-             : sequence_number2;
-}
-
-inline uint32_t LatestTimestamp(uint32_t timestamp1, uint32_t timestamp2) {
-  return IsNewerTimestamp(timestamp1, timestamp2) ? timestamp1 : timestamp2;
-}
-
-// Utility class to unwrap a number to a larger type. The numbers will never be
-// unwrapped to a negative value.
-template <typename U>
-class Unwrapper {
-  static_assert(!std::numeric_limits<U>::is_signed, "U must be unsigned");
-  static_assert(std::numeric_limits<U>::max() <=
-                    std::numeric_limits<uint32_t>::max(),
-                "U must not be wider than 32 bits");
-
- public:
-  // Get the unwrapped value, but don't update the internal state.
-  int64_t UnwrapWithoutUpdate(U value) {
-    if (!last_value_)
-      return value;
-
-    constexpr int64_t kMaxPlusOne =
-        static_cast<int64_t>(std::numeric_limits<U>::max()) + 1;
-
-    U cropped_last = static_cast<U>(*last_value_);
-    int64_t delta = value - cropped_last;
-    if (IsNewer(value, cropped_last)) {
-      if (delta < 0)
-        delta += kMaxPlusOne;  // Wrap forwards.
-    } else if (delta > 0 && (*last_value_ + delta - kMaxPlusOne) >= 0) {
-      // If value is older but delta is positive, this is a backwards
-      // wrap-around. However, don't wrap backwards past 0 (unwrapped).
-      delta -= kMaxPlusOne;
-    }
-
-    return *last_value_ + delta;
-  }
-
-  // Only update the internal state to the specified last (unwrapped) value.
-  void UpdateLast(int64_t last_value) {
-    last_value_ = rtc::Optional<int64_t>(last_value);
-  }
-
-  // Unwrap the value and update the internal state.
-  int64_t Unwrap(U value) {
-    int64_t unwrapped = UnwrapWithoutUpdate(value);
-    UpdateLast(unwrapped);
-    return unwrapped;
-  }
-
- private:
-  rtc::Optional<int64_t> last_value_;
-};
-
-using SequenceNumberUnwrapper = Unwrapper<uint16_t>;
-using TimestampUnwrapper = Unwrapper<uint32_t>;
-
-struct PacedPacketInfo {
-  PacedPacketInfo() {}
-  PacedPacketInfo(int probe_cluster_id,
-                  int probe_cluster_min_probes,
-                  int probe_cluster_min_bytes)
-      : probe_cluster_id(probe_cluster_id),
-        probe_cluster_min_probes(probe_cluster_min_probes),
-        probe_cluster_min_bytes(probe_cluster_min_bytes) {}
-
-  bool operator==(const PacedPacketInfo& rhs) const {
-    return send_bitrate_bps == rhs.send_bitrate_bps &&
-           probe_cluster_id == rhs.probe_cluster_id &&
-           probe_cluster_min_probes == rhs.probe_cluster_min_probes &&
-           probe_cluster_min_bytes == rhs.probe_cluster_min_bytes;
-  }
-
-  static constexpr int kNotAProbe = -1;
-  int send_bitrate_bps = -1;
-  int probe_cluster_id = kNotAProbe;
-  int probe_cluster_min_probes = -1;
-  int probe_cluster_min_bytes = -1;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_INCLUDE_MODULE_COMMON_TYPES_H_
diff --git a/modules/media_file/BUILD.gn b/modules/media_file/BUILD.gn
deleted file mode 100644
index 62cd1ad..0000000
--- a/modules/media_file/BUILD.gn
+++ /dev/null
@@ -1,73 +0,0 @@
-# Copyright (c) 2014 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.
-
-import("../../webrtc.gni")
-
-config("media_file_config") {
-  visibility = [ ":*" ]  # Only targets in this file can depend on this.
-}
-
-rtc_static_library("media_file") {
-  sources = [
-    "media_file.h",
-    "media_file_defines.h",
-    "media_file_impl.cc",
-    "media_file_impl.h",
-    "media_file_utility.cc",
-    "media_file_utility.h",
-  ]
-
-  public_configs = [ ":media_file_config" ]
-
-  # TODO(jschuh): Bug 1348: fix this warning.
-  configs += [ "//build/config/compiler:no_size_t_to_int_warning" ]
-
-  if (!build_with_chromium && is_clang) {
-    # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-    suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-  }
-
-  deps = [
-    "..:module_api",
-    "../..:webrtc_common",
-    "../../common_audio",
-    "../../rtc_base:rtc_base_approved",
-    "../../system_wrappers",
-  ]
-}
-
-if (rtc_include_tests) {
-  rtc_source_set("media_file_unittests") {
-    testonly = true
-
-    # Skip restricting visibility on mobile platforms since the tests on those
-    # gets additional generated targets which would require many lines here to
-    # cover (which would be confusing to read and hard to maintain).
-    if (!is_android && !is_ios) {
-      visibility = [ "..:modules_unittests" ]
-    }
-    sources = [
-      "media_file_unittest.cc",
-    ]
-    deps = [
-      ":media_file",
-      "../../system_wrappers:system_wrappers",
-      "../../test:test_support",
-    ]
-    if (is_win) {
-      cflags = [
-        # TODO(kjellander): bugs.webrtc.org/261: Fix this warning.
-        "/wd4373",  # virtual function override.
-      ]
-    }
-    if (!build_with_chromium && is_clang) {
-      # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-    }
-  }
-}
diff --git a/modules/media_file/DEPS b/modules/media_file/DEPS
deleted file mode 100644
index 45852cd..0000000
--- a/modules/media_file/DEPS
+++ /dev/null
@@ -1,4 +0,0 @@
-include_rules = [
-  "+webrtc/common_audio",
-  "+webrtc/system_wrappers",
-]
diff --git a/modules/media_file/OWNERS b/modules/media_file/OWNERS
deleted file mode 100644
index f5e93f0..0000000
--- a/modules/media_file/OWNERS
+++ /dev/null
@@ -1,8 +0,0 @@
-mflodman@webrtc.org
-perkj@webrtc.org
-niklas.enbom@webrtc.org
-
-# These are for the common case of adding or renaming files. If you're doing
-# structural changes, please get a review from a reviewer in this file.
-per-file *.gn=*
-per-file *.gni=*
diff --git a/modules/media_file/media_file.h b/modules/media_file/media_file.h
deleted file mode 100644
index f6924d6..0000000
--- a/modules/media_file/media_file.h
+++ /dev/null
@@ -1,180 +0,0 @@
-/*
- *  Copyright (c) 2012 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_MEDIA_FILE_MEDIA_FILE_H_
-#define WEBRTC_MODULES_MEDIA_FILE_MEDIA_FILE_H_
-
-#include "webrtc/common_types.h"
-#include "webrtc/modules/include/module.h"
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/modules/media_file/media_file_defines.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-class MediaFile : public Module
-{
-public:
-    // Factory method. Constructor disabled. id is the identifier for the
-    // MediaFile instance.
-    static MediaFile* CreateMediaFile(const int32_t id);
-    static void DestroyMediaFile(MediaFile* module);
-
-    // Put 10-60ms of audio data from file into the audioBuffer depending on
-    // codec frame size. dataLengthInBytes is both an input and output
-    // parameter. As input parameter it indicates the size of audioBuffer.
-    // As output parameter it indicates the number of bytes written to
-    // audioBuffer.
-    // Note: This API only play mono audio but can be used on file containing
-    // audio with more channels (in which case the audio will be converted to
-    // mono).
-    virtual int32_t PlayoutAudioData(
-        int8_t* audioBuffer,
-        size_t& dataLengthInBytes) = 0;
-
-    // Put 10-60ms, depending on codec frame size, of audio data from file into
-    // audioBufferLeft and audioBufferRight. The buffers contain the left and
-    // right channel of played out stereo audio.
-    // dataLengthInBytes is both an input and output parameter. As input
-    // parameter it indicates the size of both audioBufferLeft and
-    // audioBufferRight. As output parameter it indicates the number of bytes
-    // written to both audio buffers.
-    // Note: This API can only be successfully called for WAV files with stereo
-    // audio.
-    virtual int32_t PlayoutStereoData(
-        int8_t* audioBufferLeft,
-        int8_t* audioBufferRight,
-        size_t& dataLengthInBytes) = 0;
-
-    // Open the file specified by fileName (relative path is allowed) for
-    // reading. FileCallback::PlayNotification(..) will be called after
-    // notificationTimeMs of the file has been played if notificationTimeMs is
-    // greater than zero. If loop is true the file will be played until
-    // StopPlaying() is called. When end of file is reached the file is read
-    // from the start. format specifies the type of file fileName refers to.
-    // codecInst specifies the encoding of the audio data. Note that
-    // file formats that contain this information (like WAV files) don't need to
-    // provide a non-NULL codecInst. startPointMs and stopPointMs, unless zero,
-    // specify what part of the file should be read. From startPointMs ms to
-    // stopPointMs ms.
-    // Note: codecInst.channels should be set to 2 for stereo (and 1 for
-    // mono). Stereo audio is only supported for WAV files.
-    virtual int32_t StartPlayingAudioFile(
-        const char* fileName,
-        const uint32_t notificationTimeMs = 0,
-        const bool loop                         = false,
-        const FileFormats format                = kFileFormatPcm16kHzFile,
-        const CodecInst* codecInst              = NULL,
-        const uint32_t startPointMs       = 0,
-        const uint32_t stopPointMs        = 0) = 0;
-
-    // Prepare for playing audio from stream.
-    // FileCallback::PlayNotification(..) will be called after
-    // notificationTimeMs of the file has been played if notificationTimeMs is
-    // greater than zero. format specifies the type of file fileName refers to.
-    // codecInst specifies the encoding of the audio data. Note that
-    // file formats that contain this information (like WAV files) don't need to
-    // provide a non-NULL codecInst. startPointMs and stopPointMs, unless zero,
-    // specify what part of the file should be read. From startPointMs ms to
-    // stopPointMs ms.
-    // Note: codecInst.channels should be set to 2 for stereo (and 1 for
-    // mono). Stereo audio is only supported for WAV files.
-    virtual int32_t StartPlayingAudioStream(
-        InStream& stream,
-        const uint32_t notificationTimeMs = 0,
-        const FileFormats    format             = kFileFormatPcm16kHzFile,
-        const CodecInst*     codecInst          = NULL,
-        const uint32_t startPointMs       = 0,
-        const uint32_t stopPointMs        = 0) = 0;
-
-    // Stop playing from file or stream.
-    virtual int32_t StopPlaying() = 0;
-
-    // Return true if playing.
-    virtual bool IsPlaying() = 0;
-
-
-    // Set durationMs to the number of ms that has been played from file.
-    virtual int32_t PlayoutPositionMs(
-        uint32_t& durationMs) const = 0;
-
-    // Write one audio frame, i.e. the bufferLength first bytes of audioBuffer,
-    // to file. The audio frame size is determined by the codecInst.pacsize
-    // parameter of the last sucessfull StartRecordingAudioFile(..) call.
-    // Note: bufferLength must be exactly one frame.
-    virtual int32_t IncomingAudioData(
-        const int8_t* audioBuffer,
-        const size_t bufferLength) = 0;
-
-    // Open/creates file specified by fileName for writing (relative path is
-    // allowed). FileCallback::RecordNotification(..) will be called after
-    // notificationTimeMs of audio data has been recorded if
-    // notificationTimeMs is greater than zero.
-    // format specifies the type of file that should be created/opened.
-    // codecInst specifies the encoding of the audio data. maxSizeBytes
-    // specifies the number of bytes allowed to be written to file if it is
-    // greater than zero.
-    // Note: codecInst.channels should be set to 2 for stereo (and 1 for
-    // mono). Stereo is only supported for WAV files.
-    virtual int32_t StartRecordingAudioFile(
-        const char*  fileName,
-        const FileFormats    format,
-        const CodecInst&     codecInst,
-        const uint32_t notificationTimeMs = 0,
-        const uint32_t maxSizeBytes       = 0) = 0;
-
-    // Prepare for recording audio to stream.
-    // FileCallback::RecordNotification(..) will be called after
-    // notificationTimeMs of audio data has been recorded if
-    // notificationTimeMs is greater than zero.
-    // format specifies the type of file that stream should correspond to.
-    // codecInst specifies the encoding of the audio data.
-    // Note: codecInst.channels should be set to 2 for stereo (and 1 for
-    // mono). Stereo is only supported for WAV files.
-    virtual int32_t StartRecordingAudioStream(
-        OutStream&           stream,
-        const FileFormats    format,
-        const CodecInst&     codecInst,
-        const uint32_t notificationTimeMs = 0) = 0;
-
-    // Stop recording to file or stream.
-    virtual int32_t StopRecording() = 0;
-
-    // Return true if recording.
-    virtual bool IsRecording() = 0;
-
-    // Set durationMs to the number of ms that has been recorded to file.
-    virtual int32_t RecordDurationMs(uint32_t& durationMs) = 0;
-
-    // Return true if recording or playing is stereo.
-    virtual bool IsStereo() = 0;
-
-    // Register callback to receive media file related notifications. Disables
-    // callbacks if callback is NULL.
-    virtual int32_t SetModuleFileCallback(FileCallback* callback) = 0;
-
-    // Set durationMs to the size of the file (in ms) specified by fileName.
-    // format specifies the type of file fileName refers to. freqInHz specifies
-    // the sampling frequency of the file.
-    virtual int32_t FileDurationMs(
-        const char*  fileName,
-        uint32_t&      durationMs,
-        const FileFormats    format,
-        const uint32_t freqInHz = 16000) = 0;
-
-    // Update codecInst according to the current audio codec being used for
-    // reading or writing.
-    virtual int32_t codec_info(CodecInst& codecInst) const = 0;
-
-protected:
-    MediaFile() {}
-    virtual ~MediaFile() {}
-};
-}  // namespace webrtc
-#endif // WEBRTC_MODULES_MEDIA_FILE_MEDIA_FILE_H_
diff --git a/modules/media_file/media_file_defines.h b/modules/media_file/media_file_defines.h
deleted file mode 100644
index 3113620..0000000
--- a/modules/media_file/media_file_defines.h
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- *  Copyright (c) 2011 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_MEDIA_FILE_MEDIA_FILE_DEFINES_H_
-#define WEBRTC_MODULES_MEDIA_FILE_MEDIA_FILE_DEFINES_H_
-
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-// Callback class for the MediaFile class.
-class FileCallback
-{
-public:
-    virtual ~FileCallback(){}
-
-    // This function is called by MediaFile when a file has been playing for
-    // durationMs ms. id is the identifier for the MediaFile instance calling
-    // the callback.
-    virtual void PlayNotification(const int32_t id,
-                                  const uint32_t durationMs) = 0;
-
-    // This function is called by MediaFile when a file has been recording for
-    // durationMs ms. id is the identifier for the MediaFile instance calling
-    // the callback.
-    virtual void RecordNotification(const int32_t id,
-                                    const uint32_t durationMs) = 0;
-
-    // This function is called by MediaFile when a file has been stopped
-    // playing. id is the identifier for the MediaFile instance calling the
-    // callback.
-    virtual void PlayFileEnded(const int32_t id) = 0;
-
-    // This function is called by MediaFile when a file has been stopped
-    // recording. id is the identifier for the MediaFile instance calling the
-    // callback.
-    virtual void RecordFileEnded(const int32_t id) = 0;
-
-protected:
-    FileCallback() {}
-};
-}  // namespace webrtc
-#endif // WEBRTC_MODULES_MEDIA_FILE_MEDIA_FILE_DEFINES_H_
diff --git a/modules/media_file/media_file_impl.cc b/modules/media_file/media_file_impl.cc
deleted file mode 100644
index a43769d..0000000
--- a/modules/media_file/media_file_impl.cc
+++ /dev/null
@@ -1,1069 +0,0 @@
-/*
- *  Copyright (c) 2012 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 <assert.h>
-
-#include "webrtc/modules/media_file/media_file_impl.h"
-#include "webrtc/rtc_base/format_macros.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/system_wrappers/include/file_wrapper.h"
-
-namespace webrtc {
-MediaFile* MediaFile::CreateMediaFile(const int32_t id)
-{
-    return new MediaFileImpl(id);
-}
-
-void MediaFile::DestroyMediaFile(MediaFile* module)
-{
-    delete static_cast<MediaFileImpl*>(module);
-}
-
-MediaFileImpl::MediaFileImpl(const int32_t id)
-    : _id(id),
-      _ptrFileUtilityObj(NULL),
-      codec_info_(),
-      _ptrInStream(NULL),
-      _ptrOutStream(NULL),
-      _fileFormat((FileFormats)-1),
-      _recordDurationMs(0),
-      _playoutPositionMs(0),
-      _notificationMs(0),
-      _playingActive(false),
-      _recordingActive(false),
-      _isStereo(false),
-      _openFile(false),
-      _fileName(),
-      _ptrCallback(NULL)
-{
-    LOG(LS_INFO) << "MediaFileImpl()";
-
-    codec_info_.plname[0] = '\0';
-    _fileName[0] = '\0';
-}
-
-
-MediaFileImpl::~MediaFileImpl()
-{
-    LOG(LS_INFO) << "~MediaFileImpl()";
-    {
-        rtc::CritScope lock(&_crit);
-
-        if(_playingActive)
-        {
-            StopPlaying();
-        }
-
-        if(_recordingActive)
-        {
-            StopRecording();
-        }
-
-        delete _ptrFileUtilityObj;
-
-        if(_openFile)
-        {
-            delete _ptrInStream;
-            _ptrInStream = NULL;
-            delete _ptrOutStream;
-            _ptrOutStream = NULL;
-        }
-    }
-}
-
-int64_t MediaFileImpl::TimeUntilNextProcess()
-{
-    LOG(LS_WARNING)
-        << "TimeUntilNextProcess: This method is not used by MediaFile class.";
-    return -1;
-}
-
-void MediaFileImpl::Process()
-{
-    LOG(LS_WARNING) << "Process: This method is not used by MediaFile class.";
-}
-
-int32_t MediaFileImpl::PlayoutAudioData(int8_t* buffer,
-                                        size_t& dataLengthInBytes)
-{
-    LOG(LS_INFO) << "MediaFileImpl::PlayoutData(buffer= "
-                 << static_cast<void*>(buffer)
-                 << ", bufLen= " << dataLengthInBytes << ")";
-
-    const size_t bufferLengthInBytes = dataLengthInBytes;
-    dataLengthInBytes = 0;
-
-    if(buffer == NULL || bufferLengthInBytes == 0)
-    {
-        LOG(LS_ERROR) << "Buffer pointer or length is NULL!";
-        return -1;
-    }
-
-    int32_t bytesRead = 0;
-    {
-        rtc::CritScope lock(&_crit);
-
-        if(!_playingActive)
-        {
-            LOG(LS_WARNING) << "Not currently playing!";
-            return -1;
-        }
-
-        if(!_ptrFileUtilityObj)
-        {
-            LOG(LS_ERROR) << "Playing, but no FileUtility object!";
-            StopPlaying();
-            return -1;
-        }
-
-        switch(_fileFormat)
-        {
-            case kFileFormatPcm48kHzFile:
-            case kFileFormatPcm32kHzFile:
-            case kFileFormatPcm16kHzFile:
-            case kFileFormatPcm8kHzFile:
-                bytesRead = _ptrFileUtilityObj->ReadPCMData(
-                    *_ptrInStream,
-                    buffer,
-                    bufferLengthInBytes);
-                break;
-            case kFileFormatCompressedFile:
-                bytesRead = _ptrFileUtilityObj->ReadCompressedData(
-                    *_ptrInStream,
-                    buffer,
-                    bufferLengthInBytes);
-                break;
-            case kFileFormatWavFile:
-                bytesRead = _ptrFileUtilityObj->ReadWavDataAsMono(
-                    *_ptrInStream,
-                    buffer,
-                    bufferLengthInBytes);
-                break;
-            case kFileFormatPreencodedFile:
-                bytesRead = _ptrFileUtilityObj->ReadPreEncodedData(
-                    *_ptrInStream,
-                    buffer,
-                    bufferLengthInBytes);
-                if(bytesRead > 0)
-                {
-                    dataLengthInBytes = static_cast<size_t>(bytesRead);
-                    return 0;
-                }
-                break;
-            default:
-            {
-                LOG(LS_ERROR) << "Invalid file format: " << _fileFormat;
-                assert(false);
-                break;
-            }
-        }
-
-        if( bytesRead > 0)
-        {
-            dataLengthInBytes = static_cast<size_t>(bytesRead);
-        }
-    }
-    HandlePlayCallbacks(bytesRead);
-    return 0;
-}
-
-void MediaFileImpl::HandlePlayCallbacks(int32_t bytesRead)
-{
-    bool playEnded = false;
-    uint32_t callbackNotifyMs = 0;
-
-    if(bytesRead > 0)
-    {
-        // Check if it's time for PlayNotification(..).
-        _playoutPositionMs = _ptrFileUtilityObj->PlayoutPositionMs();
-        if(_notificationMs)
-        {
-            if(_playoutPositionMs >= _notificationMs)
-            {
-                _notificationMs = 0;
-                callbackNotifyMs = _playoutPositionMs;
-            }
-        }
-    }
-    else
-    {
-        // If no bytes were read assume end of file.
-        StopPlaying();
-        playEnded = true;
-    }
-
-    // Only _callbackCrit may and should be taken when making callbacks.
-    rtc::CritScope lock(&_callbackCrit);
-    if(_ptrCallback)
-    {
-        if(callbackNotifyMs)
-        {
-            _ptrCallback->PlayNotification(_id, callbackNotifyMs);
-        }
-        if(playEnded)
-        {
-            _ptrCallback->PlayFileEnded(_id);
-        }
-    }
-}
-
-int32_t MediaFileImpl::PlayoutStereoData(
-    int8_t* bufferLeft,
-    int8_t* bufferRight,
-    size_t& dataLengthInBytes)
-{
-    LOG(LS_INFO)
-        << "MediaFileImpl::PlayoutStereoData(Left = "
-        << static_cast<void*>(bufferLeft) << ", Right = "
-        << static_cast<void*>(bufferRight) << ", Len= " << dataLengthInBytes
-        << ")";
-
-    const size_t bufferLengthInBytes = dataLengthInBytes;
-    dataLengthInBytes = 0;
-
-    if(bufferLeft == NULL || bufferRight == NULL || bufferLengthInBytes == 0)
-    {
-        LOG(LS_ERROR) << "A buffer pointer or the length is NULL!";
-        return -1;
-    }
-
-    bool playEnded = false;
-    uint32_t callbackNotifyMs = 0;
-    {
-        rtc::CritScope lock(&_crit);
-
-        if(!_playingActive || !_isStereo)
-        {
-            LOG(LS_WARNING) << "Not currently playing stereo!";
-            return -1;
-        }
-
-        if(!_ptrFileUtilityObj)
-        {
-            LOG(LS_ERROR)
-                << "Playing stereo, but the FileUtility objects is NULL!";
-            StopPlaying();
-            return -1;
-        }
-
-        // Stereo playout only supported for WAV files.
-        int32_t bytesRead = 0;
-        switch(_fileFormat)
-        {
-            case kFileFormatWavFile:
-                    bytesRead = _ptrFileUtilityObj->ReadWavDataAsStereo(
-                        *_ptrInStream,
-                        bufferLeft,
-                        bufferRight,
-                        bufferLengthInBytes);
-                    break;
-            default:
-                LOG(LS_ERROR)
-                    << "Trying to read non-WAV as stereo audio (not supported)";
-                break;
-        }
-
-        if(bytesRead > 0)
-        {
-            dataLengthInBytes = static_cast<size_t>(bytesRead);
-
-            // Check if it's time for PlayNotification(..).
-            _playoutPositionMs = _ptrFileUtilityObj->PlayoutPositionMs();
-            if(_notificationMs)
-            {
-                if(_playoutPositionMs >= _notificationMs)
-                {
-                    _notificationMs = 0;
-                    callbackNotifyMs = _playoutPositionMs;
-                }
-            }
-        }
-        else
-        {
-            // If no bytes were read assume end of file.
-            StopPlaying();
-            playEnded = true;
-        }
-    }
-
-    rtc::CritScope lock(&_callbackCrit);
-    if(_ptrCallback)
-    {
-        if(callbackNotifyMs)
-        {
-            _ptrCallback->PlayNotification(_id, callbackNotifyMs);
-        }
-        if(playEnded)
-        {
-            _ptrCallback->PlayFileEnded(_id);
-        }
-    }
-    return 0;
-}
-
-int32_t MediaFileImpl::StartPlayingAudioFile(
-    const char* fileName,
-    const uint32_t notificationTimeMs,
-    const bool loop,
-    const FileFormats format,
-    const CodecInst* codecInst,
-    const uint32_t startPointMs,
-    const uint32_t stopPointMs)
-{
-    if(!ValidFileName(fileName))
-    {
-        return -1;
-    }
-    if(!ValidFileFormat(format,codecInst))
-    {
-        return -1;
-    }
-    if(!ValidFilePositions(startPointMs,stopPointMs))
-    {
-        return -1;
-    }
-
-    // Check that the file will play longer than notificationTimeMs ms.
-    if((startPointMs && stopPointMs && !loop) &&
-       (notificationTimeMs > (stopPointMs - startPointMs)))
-    {
-        LOG(LS_ERROR) << "specified notification time is longer than amount of"
-                      << " ms that will be played";
-        return -1;
-    }
-
-    FileWrapper* inputStream = FileWrapper::Create();
-    if(inputStream == NULL)
-    {
-       LOG(LS_INFO) << "Failed to allocate input stream for file " << fileName;
-        return -1;
-    }
-
-    if (!inputStream->OpenFile(fileName, true)) {
-      delete inputStream;
-      LOG(LS_ERROR) << "Could not open input file " << fileName;
-      return -1;
-    }
-
-    if(StartPlayingStream(*inputStream, loop, notificationTimeMs,
-                          format, codecInst, startPointMs, stopPointMs) == -1)
-    {
-        inputStream->CloseFile();
-        delete inputStream;
-        return -1;
-    }
-
-    rtc::CritScope lock(&_crit);
-    _openFile = true;
-    strncpy(_fileName, fileName, sizeof(_fileName));
-    _fileName[sizeof(_fileName) - 1] = '\0';
-    return 0;
-}
-
-int32_t MediaFileImpl::StartPlayingAudioStream(
-    InStream& stream,
-    const uint32_t notificationTimeMs,
-    const FileFormats format,
-    const CodecInst* codecInst,
-    const uint32_t startPointMs,
-    const uint32_t stopPointMs)
-{
-    return StartPlayingStream(stream, false, notificationTimeMs, format,
-                              codecInst, startPointMs, stopPointMs);
-}
-
-int32_t MediaFileImpl::StartPlayingStream(
-    InStream& stream,
-    bool loop,
-    const uint32_t notificationTimeMs,
-    const FileFormats format,
-    const CodecInst*  codecInst,
-    const uint32_t startPointMs,
-    const uint32_t stopPointMs)
-{
-    if(!ValidFileFormat(format,codecInst))
-    {
-        return -1;
-    }
-
-    if(!ValidFilePositions(startPointMs,stopPointMs))
-    {
-        return -1;
-    }
-
-    rtc::CritScope lock(&_crit);
-    if(_playingActive || _recordingActive)
-    {
-        LOG(LS_ERROR)
-            << "StartPlaying called, but already playing or recording file "
-            << ((_fileName[0] == '\0') ? "(name not set)" : _fileName);
-        return -1;
-    }
-
-    if(_ptrFileUtilityObj != NULL)
-    {
-        LOG(LS_ERROR)
-            << "StartPlaying called, but FileUtilityObj already exists!";
-        StopPlaying();
-        return -1;
-    }
-
-    _ptrFileUtilityObj = new ModuleFileUtility();
-    if(_ptrFileUtilityObj == NULL)
-    {
-        LOG(LS_INFO) << "Failed to create FileUtilityObj!";
-        return -1;
-    }
-
-    switch(format)
-    {
-        case kFileFormatWavFile:
-        {
-            if(_ptrFileUtilityObj->InitWavReading(stream, startPointMs,
-                                                  stopPointMs) == -1)
-            {
-                LOG(LS_ERROR) << "Not a valid WAV file!";
-                StopPlaying();
-                return -1;
-            }
-            _fileFormat = kFileFormatWavFile;
-            break;
-        }
-        case kFileFormatCompressedFile:
-        {
-            if(_ptrFileUtilityObj->InitCompressedReading(stream, startPointMs,
-                                                         stopPointMs) == -1)
-            {
-                LOG(LS_ERROR) << "Not a valid Compressed file!";
-                StopPlaying();
-                return -1;
-            }
-            _fileFormat = kFileFormatCompressedFile;
-            break;
-        }
-        case kFileFormatPcm8kHzFile:
-        case kFileFormatPcm16kHzFile:
-        case kFileFormatPcm32kHzFile:
-        case kFileFormatPcm48kHzFile:
-        {
-            // ValidFileFormat() called in the beginneing of this function
-            // prevents codecInst from being NULL here.
-            assert(codecInst != NULL);
-            if(!ValidFrequency(codecInst->plfreq) ||
-               _ptrFileUtilityObj->InitPCMReading(stream, startPointMs,
-                                                  stopPointMs,
-                                                  codecInst->plfreq) == -1)
-            {
-                LOG(LS_ERROR) << "Not a valid raw 8 or 16 KHz PCM file!";
-                StopPlaying();
-                return -1;
-            }
-
-            _fileFormat = format;
-            break;
-        }
-        case kFileFormatPreencodedFile:
-        {
-            // ValidFileFormat() called in the beginneing of this function
-            // prevents codecInst from being NULL here.
-            assert(codecInst != NULL);
-            if(_ptrFileUtilityObj->InitPreEncodedReading(stream, *codecInst) ==
-               -1)
-            {
-                LOG(LS_ERROR) << "Not a valid PreEncoded file!";
-                StopPlaying();
-                return -1;
-            }
-
-            _fileFormat = kFileFormatPreencodedFile;
-            break;
-        }
-        default:
-        {
-            LOG(LS_ERROR) << "Invalid file format: " << format;
-            assert(false);
-            break;
-        }
-    }
-    if(_ptrFileUtilityObj->codec_info(codec_info_) == -1)
-    {
-        LOG(LS_ERROR) << "Failed to retrieve codec info!";
-        StopPlaying();
-        return -1;
-    }
-
-    _isStereo = (codec_info_.channels == 2);
-    if(_isStereo && (_fileFormat != kFileFormatWavFile))
-    {
-        LOG(LS_WARNING) << "Stereo is only allowed for WAV files";
-        StopPlaying();
-        return -1;
-    }
-    _playingActive = true;
-    _playoutPositionMs = _ptrFileUtilityObj->PlayoutPositionMs();
-    _ptrInStream = &stream;
-    _notificationMs = notificationTimeMs;
-
-    return 0;
-}
-
-int32_t MediaFileImpl::StopPlaying()
-{
-
-    rtc::CritScope lock(&_crit);
-    _isStereo = false;
-    if(_ptrFileUtilityObj)
-    {
-        delete _ptrFileUtilityObj;
-        _ptrFileUtilityObj = NULL;
-    }
-    if(_ptrInStream)
-    {
-        // If MediaFileImpl opened the InStream it must be reclaimed here.
-        if(_openFile)
-        {
-            delete _ptrInStream;
-            _openFile = false;
-        }
-        _ptrInStream = NULL;
-    }
-
-    codec_info_.pltype = 0;
-    codec_info_.plname[0] = '\0';
-
-    if(!_playingActive)
-    {
-        LOG(LS_WARNING) << "playing is not active!";
-        return -1;
-    }
-
-    _playingActive = false;
-    return 0;
-}
-
-bool MediaFileImpl::IsPlaying()
-{
-    LOG(LS_VERBOSE) << "MediaFileImpl::IsPlaying()";
-    rtc::CritScope lock(&_crit);
-    return _playingActive;
-}
-
-int32_t MediaFileImpl::IncomingAudioData(
-    const int8_t*  buffer,
-    const size_t bufferLengthInBytes)
-{
-    LOG(LS_INFO) << "MediaFile::IncomingData(buffer= "
-                 << static_cast<const void*>(buffer) << ", bufLen= "
-                 << bufferLengthInBytes << ")";
-
-    if(buffer == NULL || bufferLengthInBytes == 0)
-    {
-        LOG(LS_ERROR) << "Buffer pointer or length is NULL!";
-        return -1;
-    }
-
-    bool recordingEnded = false;
-    uint32_t callbackNotifyMs = 0;
-    {
-        rtc::CritScope lock(&_crit);
-
-        if(!_recordingActive)
-        {
-            LOG(LS_WARNING) << "Not currently recording!";
-            return -1;
-        }
-        if(_ptrOutStream == NULL)
-        {
-            LOG(LS_ERROR) << "Recording is active, but output stream is NULL!";
-            assert(false);
-            return -1;
-        }
-
-        int32_t bytesWritten = 0;
-        uint32_t samplesWritten = codec_info_.pacsize;
-        if(_ptrFileUtilityObj)
-        {
-            switch(_fileFormat)
-            {
-                case kFileFormatPcm8kHzFile:
-                case kFileFormatPcm16kHzFile:
-                case kFileFormatPcm32kHzFile:
-                case kFileFormatPcm48kHzFile:
-                    bytesWritten = _ptrFileUtilityObj->WritePCMData(
-                        *_ptrOutStream,
-                        buffer,
-                        bufferLengthInBytes);
-
-                    // Sample size is 2 bytes.
-                    if(bytesWritten > 0)
-                    {
-                        samplesWritten = bytesWritten/sizeof(int16_t);
-                    }
-                    break;
-                case kFileFormatCompressedFile:
-                    bytesWritten = _ptrFileUtilityObj->WriteCompressedData(
-                        *_ptrOutStream, buffer, bufferLengthInBytes);
-                    break;
-                case kFileFormatWavFile:
-                    bytesWritten = _ptrFileUtilityObj->WriteWavData(
-                        *_ptrOutStream,
-                        buffer,
-                        bufferLengthInBytes);
-                    if(bytesWritten > 0 && STR_NCASE_CMP(codec_info_.plname,
-                                                         "L16", 4) == 0)
-                    {
-                        // Sample size is 2 bytes.
-                        samplesWritten = bytesWritten/sizeof(int16_t);
-                    }
-                    break;
-                case kFileFormatPreencodedFile:
-                    bytesWritten = _ptrFileUtilityObj->WritePreEncodedData(
-                        *_ptrOutStream, buffer, bufferLengthInBytes);
-                    break;
-                default:
-                    LOG(LS_ERROR) << "Invalid file format: " << _fileFormat;
-                    assert(false);
-                    break;
-            }
-        } else {
-            // TODO (hellner): quick look at the code makes me think that this
-            //                 code is never executed. Remove?
-            if(_ptrOutStream)
-            {
-                if(_ptrOutStream->Write(buffer, bufferLengthInBytes))
-                {
-                    bytesWritten = static_cast<int32_t>(bufferLengthInBytes);
-                }
-            }
-        }
-
-        _recordDurationMs += samplesWritten / (codec_info_.plfreq / 1000);
-
-        // Check if it's time for RecordNotification(..).
-        if(_notificationMs)
-        {
-            if(_recordDurationMs  >= _notificationMs)
-            {
-                _notificationMs = 0;
-                callbackNotifyMs = _recordDurationMs;
-            }
-        }
-        if(bytesWritten < (int32_t)bufferLengthInBytes)
-        {
-            LOG(LS_WARNING) << "Failed to write all requested bytes!";
-            StopRecording();
-            recordingEnded = true;
-        }
-    }
-
-    // Only _callbackCrit may and should be taken when making callbacks.
-    rtc::CritScope lock(&_callbackCrit);
-    if(_ptrCallback)
-    {
-        if(callbackNotifyMs)
-        {
-            _ptrCallback->RecordNotification(_id, callbackNotifyMs);
-        }
-        if(recordingEnded)
-        {
-            _ptrCallback->RecordFileEnded(_id);
-            return -1;
-        }
-    }
-    return 0;
-}
-
-int32_t MediaFileImpl::StartRecordingAudioFile(
-    const char* fileName,
-    const FileFormats format,
-    const CodecInst& codecInst,
-    const uint32_t notificationTimeMs,
-    const uint32_t maxSizeBytes)
-{
-    if(!ValidFileName(fileName))
-    {
-        return -1;
-    }
-    if(!ValidFileFormat(format,&codecInst))
-    {
-        return -1;
-    }
-
-    FileWrapper* outputStream = FileWrapper::Create();
-    if(outputStream == NULL)
-    {
-        LOG(LS_INFO) << "Failed to allocate memory for output stream";
-        return -1;
-    }
-
-    if (!outputStream->OpenFile(fileName, false)) {
-      delete outputStream;
-      LOG(LS_ERROR) << "Could not open output file '" << fileName
-                    << "' for writing!";
-      return -1;
-    }
-
-    if(maxSizeBytes)
-    {
-        outputStream->SetMaxFileSize(maxSizeBytes);
-    }
-
-    if(StartRecordingAudioStream(*outputStream, format, codecInst,
-                                 notificationTimeMs) == -1)
-    {
-        outputStream->CloseFile();
-        delete outputStream;
-        return -1;
-    }
-
-    rtc::CritScope lock(&_crit);
-    _openFile = true;
-    strncpy(_fileName, fileName, sizeof(_fileName));
-    _fileName[sizeof(_fileName) - 1] = '\0';
-    return 0;
-}
-
-int32_t MediaFileImpl::StartRecordingAudioStream(
-    OutStream& stream,
-    const FileFormats format,
-    const CodecInst& codecInst,
-    const uint32_t notificationTimeMs)
-{
-    // Check codec info
-    if(!ValidFileFormat(format,&codecInst))
-    {
-        return -1;
-    }
-
-    rtc::CritScope lock(&_crit);
-    if(_recordingActive || _playingActive)
-    {
-        LOG(LS_ERROR)
-            << "StartRecording called, but already recording or playing file "
-            << _fileName << "!";
-        return -1;
-    }
-
-    if(_ptrFileUtilityObj != NULL)
-    {
-        LOG(LS_ERROR)
-            << "StartRecording called, but fileUtilityObj already exists!";
-        StopRecording();
-        return -1;
-    }
-
-    _ptrFileUtilityObj = new ModuleFileUtility();
-    if(_ptrFileUtilityObj == NULL)
-    {
-        LOG(LS_INFO) << "Cannot allocate fileUtilityObj!";
-        return -1;
-    }
-
-    CodecInst tmpAudioCodec;
-    memcpy(&tmpAudioCodec, &codecInst, sizeof(CodecInst));
-    switch(format)
-    {
-        case kFileFormatWavFile:
-        {
-            if(_ptrFileUtilityObj->InitWavWriting(stream, codecInst) == -1)
-            {
-                LOG(LS_ERROR) << "Failed to initialize WAV file!";
-                delete _ptrFileUtilityObj;
-                _ptrFileUtilityObj = NULL;
-                return -1;
-            }
-            _fileFormat = kFileFormatWavFile;
-            break;
-        }
-        case kFileFormatCompressedFile:
-        {
-            // Write compression codec name at beginning of file
-            if(_ptrFileUtilityObj->InitCompressedWriting(stream, codecInst) ==
-               -1)
-            {
-                LOG(LS_ERROR) << "Failed to initialize Compressed file!";
-                delete _ptrFileUtilityObj;
-                _ptrFileUtilityObj = NULL;
-                return -1;
-            }
-            _fileFormat = kFileFormatCompressedFile;
-            break;
-        }
-        case kFileFormatPcm8kHzFile:
-        case kFileFormatPcm16kHzFile:
-        case kFileFormatPcm32kHzFile:
-        case kFileFormatPcm48kHzFile:
-        {
-            if(!ValidFrequency(codecInst.plfreq) ||
-               _ptrFileUtilityObj->InitPCMWriting(stream, codecInst.plfreq) ==
-               -1)
-            {
-                LOG(LS_ERROR) << "Failed to initialize PCM file!";
-                delete _ptrFileUtilityObj;
-                _ptrFileUtilityObj = NULL;
-                return -1;
-            }
-            _fileFormat = format;
-            break;
-        }
-        case kFileFormatPreencodedFile:
-        {
-            if(_ptrFileUtilityObj->InitPreEncodedWriting(stream, codecInst) ==
-               -1)
-            {
-                LOG(LS_ERROR) << "Failed to initialize Pre-Encoded file!";
-                delete _ptrFileUtilityObj;
-                _ptrFileUtilityObj = NULL;
-                return -1;
-            }
-
-            _fileFormat = kFileFormatPreencodedFile;
-            break;
-        }
-        default:
-        {
-            LOG(LS_ERROR) << "Invalid file format " << format << " specified!";
-            delete _ptrFileUtilityObj;
-            _ptrFileUtilityObj = NULL;
-            return -1;
-        }
-    }
-    _isStereo = (tmpAudioCodec.channels == 2);
-    if(_isStereo)
-    {
-        if(_fileFormat != kFileFormatWavFile)
-        {
-            LOG(LS_WARNING) << "Stereo is only allowed for WAV files";
-            StopRecording();
-            return -1;
-        }
-        if((STR_NCASE_CMP(tmpAudioCodec.plname, "L16", 4) != 0) &&
-           (STR_NCASE_CMP(tmpAudioCodec.plname, "PCMU", 5) != 0) &&
-           (STR_NCASE_CMP(tmpAudioCodec.plname, "PCMA", 5) != 0))
-        {
-            LOG(LS_WARNING)
-                << "Stereo is only allowed for codec PCMU, PCMA and L16 ";
-            StopRecording();
-            return -1;
-        }
-    }
-    memcpy(&codec_info_, &tmpAudioCodec, sizeof(CodecInst));
-    _recordingActive = true;
-    _ptrOutStream = &stream;
-    _notificationMs = notificationTimeMs;
-    _recordDurationMs = 0;
-    return 0;
-}
-
-int32_t MediaFileImpl::StopRecording()
-{
-
-    rtc::CritScope lock(&_crit);
-    if(!_recordingActive)
-    {
-        LOG(LS_WARNING) << "recording is not active!";
-        return -1;
-    }
-
-    _isStereo = false;
-
-    if(_ptrFileUtilityObj != NULL)
-    {
-        // Both AVI and WAV header has to be updated before closing the stream
-        // because they contain size information.
-        if((_fileFormat == kFileFormatWavFile) &&
-            (_ptrOutStream != NULL))
-        {
-            _ptrFileUtilityObj->UpdateWavHeader(*_ptrOutStream);
-        }
-        delete _ptrFileUtilityObj;
-        _ptrFileUtilityObj = NULL;
-    }
-
-    if(_ptrOutStream != NULL)
-    {
-        // If MediaFileImpl opened the OutStream it must be reclaimed here.
-        if(_openFile)
-        {
-            delete _ptrOutStream;
-            _openFile = false;
-        }
-        _ptrOutStream = NULL;
-    }
-
-    _recordingActive = false;
-    codec_info_.pltype = 0;
-    codec_info_.plname[0] = '\0';
-
-    return 0;
-}
-
-bool MediaFileImpl::IsRecording()
-{
-    LOG(LS_VERBOSE) << "MediaFileImpl::IsRecording()";
-    rtc::CritScope lock(&_crit);
-    return _recordingActive;
-}
-
-int32_t MediaFileImpl::RecordDurationMs(uint32_t& durationMs)
-{
-
-    rtc::CritScope lock(&_crit);
-    if(!_recordingActive)
-    {
-        durationMs = 0;
-        return -1;
-    }
-    durationMs = _recordDurationMs;
-    return 0;
-}
-
-bool MediaFileImpl::IsStereo()
-{
-    LOG(LS_VERBOSE) << "MediaFileImpl::IsStereo()";
-    rtc::CritScope lock(&_crit);
-    return _isStereo;
-}
-
-int32_t MediaFileImpl::SetModuleFileCallback(FileCallback* callback)
-{
-
-    rtc::CritScope lock(&_callbackCrit);
-
-    _ptrCallback = callback;
-    return 0;
-}
-
-int32_t MediaFileImpl::FileDurationMs(const char* fileName,
-                                      uint32_t& durationMs,
-                                      const FileFormats format,
-                                      const uint32_t freqInHz)
-{
-
-    if(!ValidFileName(fileName))
-    {
-        return -1;
-    }
-    if(!ValidFrequency(freqInHz))
-    {
-        return -1;
-    }
-
-    ModuleFileUtility* utilityObj = new ModuleFileUtility();
-    if(utilityObj == NULL)
-    {
-        LOG(LS_ERROR) << "failed to allocate utility object!";
-        return -1;
-    }
-
-    const int32_t duration = utilityObj->FileDurationMs(fileName, format,
-                                                        freqInHz);
-    delete utilityObj;
-    if(duration == -1)
-    {
-        durationMs = 0;
-        return -1;
-    }
-
-    durationMs = duration;
-    return 0;
-}
-
-int32_t MediaFileImpl::PlayoutPositionMs(uint32_t& positionMs) const
-{
-    rtc::CritScope lock(&_crit);
-    if(!_playingActive)
-    {
-        positionMs = 0;
-        return -1;
-    }
-    positionMs = _playoutPositionMs;
-    return 0;
-}
-
-int32_t MediaFileImpl::codec_info(CodecInst& codecInst) const
-{
-    rtc::CritScope lock(&_crit);
-    if(!_playingActive && !_recordingActive)
-    {
-        LOG(LS_ERROR) << "Neither playout nor recording has been initialized!";
-        return -1;
-    }
-    if (codec_info_.pltype == 0 && codec_info_.plname[0] == '\0')
-    {
-        LOG(LS_ERROR) << "The CodecInst for "
-                      << (_playingActive ? "Playback" : "Recording")
-                      << " is unknown!";
-        return -1;
-    }
-    memcpy(&codecInst,&codec_info_,sizeof(CodecInst));
-    return 0;
-}
-
-bool MediaFileImpl::ValidFileFormat(const FileFormats format,
-                                    const CodecInst*  codecInst)
-{
-    if(codecInst == NULL)
-    {
-        if(format == kFileFormatPreencodedFile ||
-           format == kFileFormatPcm8kHzFile    ||
-           format == kFileFormatPcm16kHzFile   ||
-           format == kFileFormatPcm32kHzFile   ||
-           format == kFileFormatPcm48kHzFile)
-        {
-            LOG(LS_ERROR) << "Codec info required for file format specified!";
-            return false;
-        }
-    }
-    return true;
-}
-
-bool MediaFileImpl::ValidFileName(const char* fileName)
-{
-    if((fileName == NULL) ||(fileName[0] == '\0'))
-    {
-        LOG(LS_ERROR) << "FileName not specified!";
-        return false;
-    }
-    return true;
-}
-
-
-bool MediaFileImpl::ValidFilePositions(const uint32_t startPointMs,
-                                       const uint32_t stopPointMs)
-{
-    if(startPointMs == 0 && stopPointMs == 0) // Default values
-    {
-        return true;
-    }
-    if(stopPointMs &&(startPointMs >= stopPointMs))
-    {
-        LOG(LS_ERROR) << "startPointMs must be less than stopPointMs!";
-        return false;
-    }
-    if(stopPointMs &&((stopPointMs - startPointMs) < 20))
-    {
-        LOG(LS_ERROR) << "minimum play duration for files is 20 ms!";
-        return false;
-    }
-    return true;
-}
-
-bool MediaFileImpl::ValidFrequency(const uint32_t frequency)
-{
-    if((frequency == 8000) || (frequency == 16000)|| (frequency == 32000) ||
-       (frequency == 48000))
-    {
-        return true;
-    }
-    LOG(LS_ERROR) << "Frequency should be 8000, 16000, 32000, or 48000 (Hz)";
-    return false;
-}
-}  // namespace webrtc
diff --git a/modules/media_file/media_file_impl.h b/modules/media_file/media_file_impl.h
deleted file mode 100644
index 664030a..0000000
--- a/modules/media_file/media_file_impl.h
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- *  Copyright (c) 2012 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_MEDIA_FILE_MEDIA_FILE_IMPL_H_
-#define WEBRTC_MODULES_MEDIA_FILE_MEDIA_FILE_IMPL_H_
-
-#include "webrtc/common_types.h"
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/modules/media_file/media_file.h"
-#include "webrtc/modules/media_file/media_file_defines.h"
-#include "webrtc/modules/media_file/media_file_utility.h"
-#include "webrtc/rtc_base/criticalsection.h"
-
-namespace webrtc {
-class MediaFileImpl : public MediaFile
-{
-
-public:
-    MediaFileImpl(const int32_t id);
-    ~MediaFileImpl();
-
-    void Process() override;
-    int64_t TimeUntilNextProcess() override;
-
-    // MediaFile functions
-    int32_t PlayoutAudioData(int8_t* audioBuffer,
-                             size_t& dataLengthInBytes) override;
-
-    int32_t PlayoutStereoData(int8_t* audioBufferLeft,
-                              int8_t* audioBufferRight,
-                              size_t& dataLengthInBytes) override;
-
-    int32_t StartPlayingAudioFile(
-        const char* fileName,
-        const uint32_t notificationTimeMs = 0,
-        const bool loop = false,
-        const FileFormats format = kFileFormatPcm16kHzFile,
-        const CodecInst* codecInst = NULL,
-        const uint32_t startPointMs = 0,
-        const uint32_t stopPointMs = 0) override;
-
-    int32_t StartPlayingAudioStream(
-        InStream& stream,
-        const uint32_t notificationTimeMs = 0,
-        const FileFormats format = kFileFormatPcm16kHzFile,
-        const CodecInst* codecInst = NULL,
-        const uint32_t startPointMs = 0,
-        const uint32_t stopPointMs = 0) override;
-
-    int32_t StopPlaying() override;
-
-    bool IsPlaying() override;
-
-    int32_t PlayoutPositionMs(uint32_t& positionMs) const override;
-
-    int32_t IncomingAudioData(const int8_t* audioBuffer,
-                              const size_t bufferLength) override;
-
-    int32_t StartRecordingAudioFile(const char* fileName,
-                                    const FileFormats format,
-                                    const CodecInst& codecInst,
-                                    const uint32_t notificationTimeMs = 0,
-                                    const uint32_t maxSizeBytes = 0) override;
-
-    int32_t StartRecordingAudioStream(
-        OutStream& stream,
-        const FileFormats format,
-        const CodecInst& codecInst,
-        const uint32_t notificationTimeMs = 0) override;
-
-    int32_t StopRecording() override;
-
-    bool IsRecording() override;
-
-    int32_t RecordDurationMs(uint32_t& durationMs) override;
-
-    bool IsStereo() override;
-
-    int32_t SetModuleFileCallback(FileCallback* callback) override;
-
-    int32_t FileDurationMs(const char* fileName,
-                           uint32_t& durationMs,
-                           const FileFormats format,
-                           const uint32_t freqInHz = 16000) override;
-
-    int32_t codec_info(CodecInst& codecInst) const override;
-
-private:
-    // Returns true if the combination of format and codecInst is valid.
-    static bool ValidFileFormat(const FileFormats format,
-                                const CodecInst*  codecInst);
-
-
-    // Returns true if the filename is valid
-    static bool ValidFileName(const char* fileName);
-
-    // Returns true if the combination of startPointMs and stopPointMs is valid.
-    static bool ValidFilePositions(const uint32_t startPointMs,
-                                   const uint32_t stopPointMs);
-
-    // Returns true if frequencyInHz is a supported frequency.
-    static bool ValidFrequency(const uint32_t frequencyInHz);
-
-    void HandlePlayCallbacks(int32_t bytesRead);
-
-    int32_t StartPlayingStream(
-        InStream& stream,
-        bool loop,
-        const uint32_t notificationTimeMs,
-        const FileFormats format,
-        const CodecInst*  codecInst,
-        const uint32_t startPointMs,
-        const uint32_t stopPointMs);
-
-    int32_t _id;
-    rtc::CriticalSection _crit;
-    rtc::CriticalSection _callbackCrit;
-
-    ModuleFileUtility* _ptrFileUtilityObj;
-    CodecInst codec_info_;
-
-    InStream*  _ptrInStream;
-    OutStream* _ptrOutStream;
-
-    FileFormats _fileFormat;
-    uint32_t _recordDurationMs;
-    uint32_t _playoutPositionMs;
-    uint32_t _notificationMs;
-
-    bool _playingActive;
-    bool _recordingActive;
-    bool _isStereo;
-    bool _openFile;
-
-    char _fileName[512];
-
-    FileCallback* _ptrCallback;
-};
-}  // namespace webrtc
-
-#endif // WEBRTC_MODULES_MEDIA_FILE_MEDIA_FILE_IMPL_H_
diff --git a/modules/media_file/media_file_unittest.cc b/modules/media_file/media_file_unittest.cc
deleted file mode 100644
index 5e70a5f..0000000
--- a/modules/media_file/media_file_unittest.cc
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- *  Copyright (c) 2012 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/media_file/media_file.h"
-#include "webrtc/system_wrappers/include/sleep.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/testsupport/fileutils.h"
-
-class MediaFileTest : public testing::Test {
- protected:
-  void SetUp() {
-    // Use number 0 as the the identifier and pass to CreateMediaFile.
-    media_file_ = webrtc::MediaFile::CreateMediaFile(0);
-    ASSERT_TRUE(media_file_ != NULL);
-  }
-  void TearDown() {
-    webrtc::MediaFile::DestroyMediaFile(media_file_);
-    media_file_ = NULL;
-  }
-  webrtc::MediaFile* media_file_;
-};
-
-#if defined(WEBRTC_ANDROID) || defined(WEBRTC_IOS)
-#define MAYBE_StartPlayingAudioFileWithoutError \
-  DISABLED_StartPlayingAudioFileWithoutError
-#else
-#define MAYBE_StartPlayingAudioFileWithoutError \
-  StartPlayingAudioFileWithoutError
-#endif
-TEST_F(MediaFileTest, MAYBE_StartPlayingAudioFileWithoutError) {
-  // TODO(leozwang): Use hard coded filename here, we want to
-  // loop through all audio files in future
-  const std::string audio_file =
-      webrtc::test::ResourcePath("voice_engine/audio_tiny48", "wav");
-  ASSERT_EQ(0, media_file_->StartPlayingAudioFile(
-      audio_file.c_str(),
-      0,
-      false,
-      webrtc::kFileFormatWavFile));
-
-  ASSERT_EQ(true, media_file_->IsPlaying());
-
-  webrtc::SleepMs(1);
-
-  ASSERT_EQ(0, media_file_->StopPlaying());
-}
-
-#if defined(WEBRTC_IOS)
-#define MAYBE_WriteWavFile DISABLED_WriteWavFile
-#else
-#define MAYBE_WriteWavFile WriteWavFile
-#endif
-TEST_F(MediaFileTest, MAYBE_WriteWavFile) {
-  // Write file.
-  static const size_t kHeaderSize = 44;
-  static const size_t kPayloadSize = 320;
-  webrtc::CodecInst codec = {
-    0, "L16", 16000, static_cast<int>(kPayloadSize), 1
-  };
-  std::string outfile = webrtc::test::OutputPath() + "wavtest.wav";
-  ASSERT_EQ(0,
-            media_file_->StartRecordingAudioFile(
-                outfile.c_str(), webrtc::kFileFormatWavFile, codec));
-  static const int8_t kFakeData[kPayloadSize] = {0};
-  ASSERT_EQ(0, media_file_->IncomingAudioData(kFakeData, kPayloadSize));
-  ASSERT_EQ(0, media_file_->StopRecording());
-
-  // Check the file we just wrote.
-  static const uint8_t kExpectedHeader[] = {
-    'R', 'I', 'F', 'F',
-    0x64, 0x1, 0, 0,  // size of whole file - 8: 320 + 44 - 8
-    'W', 'A', 'V', 'E',
-    'f', 'm', 't', ' ',
-    0x10, 0, 0, 0,  // size of fmt block - 8: 24 - 8
-    0x1, 0,  // format: PCM (1)
-    0x1, 0,  // channels: 1
-    0x80, 0x3e, 0, 0,  // sample rate: 16000
-    0, 0x7d, 0, 0,  // byte rate: 2 * 16000
-    0x2, 0,  // block align: NumChannels * BytesPerSample
-    0x10, 0,  // bits per sample: 2 * 8
-    'd', 'a', 't', 'a',
-    0x40, 0x1, 0, 0,  // size of payload: 320
-  };
-  static_assert(sizeof(kExpectedHeader) == kHeaderSize, "header size");
-
-  EXPECT_EQ(kHeaderSize + kPayloadSize, webrtc::test::GetFileSize(outfile));
-  FILE* f = fopen(outfile.c_str(), "rb");
-  ASSERT_TRUE(f);
-
-  uint8_t header[kHeaderSize];
-  ASSERT_EQ(1u, fread(header, kHeaderSize, 1, f));
-  EXPECT_EQ(0, memcmp(kExpectedHeader, header, kHeaderSize));
-
-  uint8_t payload[kPayloadSize];
-  ASSERT_EQ(1u, fread(payload, kPayloadSize, 1, f));
-  EXPECT_EQ(0, memcmp(kFakeData, payload, kPayloadSize));
-
-  EXPECT_EQ(0, fclose(f));
-}
diff --git a/modules/media_file/media_file_utility.cc b/modules/media_file/media_file_utility.cc
deleted file mode 100644
index 8b0f22d..0000000
--- a/modules/media_file/media_file_utility.cc
+++ /dev/null
@@ -1,1523 +0,0 @@
-/*
- *  Copyright (c) 2012 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/media_file/media_file_utility.h"
-
-#include <assert.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-#include <limits>
-
-#include "webrtc/common_audio/wav_header.h"
-#include "webrtc/common_types.h"
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/rtc_base/format_macros.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/system_wrappers/include/file_wrapper.h"
-#include "webrtc/typedefs.h"
-
-namespace {
-
-// First 16 bytes the WAVE header. ckID should be "RIFF", wave_ckID should be
-// "WAVE" and ckSize is the chunk size (4 + n)
-struct WAVE_RIFF_header
-{
-    int8_t  ckID[4];
-    int32_t ckSize;
-    int8_t  wave_ckID[4];
-};
-
-// First 8 byte of the format chunk. fmt_ckID should be "fmt ". fmt_ckSize is
-// the chunk size (16, 18 or 40 byte)
-struct WAVE_CHUNK_header
-{
-   int8_t   fmt_ckID[4];
-   uint32_t fmt_ckSize;
-};
-}  // unnamed namespace
-
-namespace webrtc {
-ModuleFileUtility::ModuleFileUtility()
-    : _wavFormatObj(),
-      _dataSize(0),
-      _readSizeBytes(0),
-      _stopPointInMs(0),
-      _startPointInMs(0),
-      _playoutPositionMs(0),
-      _bytesWritten(0),
-      codec_info_(),
-      _codecId(kCodecNoCodec),
-      _bytesPerSample(0),
-      _readPos(0),
-      _reading(false),
-      _writing(false),
-      _tempData() {
-    LOG(LS_INFO) << "ModuleFileUtility::ModuleFileUtility()";
-    memset(&codec_info_,0,sizeof(CodecInst));
-    codec_info_.pltype = -1;
-}
-
-ModuleFileUtility::~ModuleFileUtility()
-{
-    LOG(LS_INFO) << "ModuleFileUtility::~ModuleFileUtility()";
-}
-
-int32_t ModuleFileUtility::ReadWavHeader(InStream& wav)
-{
-    WAVE_RIFF_header RIFFheaderObj;
-    WAVE_CHUNK_header CHUNKheaderObj;
-    // TODO (hellner): tmpStr and tmpStr2 seems unnecessary here.
-    char tmpStr[6] = "FOUR";
-    unsigned char tmpStr2[4];
-    size_t i;
-    bool dataFound = false;
-    bool fmtFound = false;
-    int8_t dummyRead;
-
-
-    _dataSize = 0;
-    int len = wav.Read(&RIFFheaderObj, sizeof(WAVE_RIFF_header));
-    if (len != static_cast<int>(sizeof(WAVE_RIFF_header)))
-    {
-        LOG(LS_ERROR) << "Not a wave file (too short)";
-        return -1;
-    }
-
-    for (i = 0; i < 4; i++)
-    {
-        tmpStr[i] = RIFFheaderObj.ckID[i];
-    }
-    if(strcmp(tmpStr, "RIFF") != 0)
-    {
-        LOG(LS_ERROR) << "Not a wave file (does not have RIFF)";
-        return -1;
-    }
-    for (i = 0; i < 4; i++)
-    {
-        tmpStr[i] = RIFFheaderObj.wave_ckID[i];
-    }
-    if(strcmp(tmpStr, "WAVE") != 0)
-    {
-        LOG(LS_ERROR) << "Not a wave file (does not have WAVE)";
-        return -1;
-    }
-
-    len = wav.Read(&CHUNKheaderObj, sizeof(WAVE_CHUNK_header));
-
-    // WAVE files are stored in little endian byte order. Make sure that the
-    // data can be read on big endian as well.
-    // TODO (hellner): little endian to system byte order should be done in
-    //                 in a subroutine.
-    memcpy(tmpStr2, &CHUNKheaderObj.fmt_ckSize, 4);
-    CHUNKheaderObj.fmt_ckSize =
-        (uint32_t)tmpStr2[0] + (((uint32_t)tmpStr2[1]) << 8) +
-        (((uint32_t)tmpStr2[2]) << 16) + (((uint32_t)tmpStr2[3]) << 24);
-
-    memcpy(tmpStr, CHUNKheaderObj.fmt_ckID, 4);
-
-    while ((len == static_cast<int>(sizeof(WAVE_CHUNK_header))) &&
-           (!fmtFound || !dataFound))
-    {
-        if(strcmp(tmpStr, "fmt ") == 0)
-        {
-            len = wav.Read(&_wavFormatObj, sizeof(WAVE_FMTINFO_header));
-
-            memcpy(tmpStr2, &_wavFormatObj.formatTag, 2);
-            _wavFormatObj.formatTag =
-                (uint32_t)tmpStr2[0] + (((uint32_t)tmpStr2[1])<<8);
-            memcpy(tmpStr2, &_wavFormatObj.nChannels, 2);
-            _wavFormatObj.nChannels =
-                (int16_t) ((uint32_t)tmpStr2[0] +
-                                 (((uint32_t)tmpStr2[1])<<8));
-            memcpy(tmpStr2, &_wavFormatObj.nSamplesPerSec, 4);
-            _wavFormatObj.nSamplesPerSec =
-                (int32_t) ((uint32_t)tmpStr2[0] +
-                                 (((uint32_t)tmpStr2[1])<<8) +
-                                 (((uint32_t)tmpStr2[2])<<16) +
-                                 (((uint32_t)tmpStr2[3])<<24));
-            memcpy(tmpStr2, &_wavFormatObj.nAvgBytesPerSec, 4);
-            _wavFormatObj.nAvgBytesPerSec =
-                (int32_t) ((uint32_t)tmpStr2[0] +
-                                 (((uint32_t)tmpStr2[1])<<8) +
-                                 (((uint32_t)tmpStr2[2])<<16) +
-                                 (((uint32_t)tmpStr2[3])<<24));
-            memcpy(tmpStr2, &_wavFormatObj.nBlockAlign, 2);
-            _wavFormatObj.nBlockAlign =
-                (int16_t) ((uint32_t)tmpStr2[0] +
-                                 (((uint32_t)tmpStr2[1])<<8));
-            memcpy(tmpStr2, &_wavFormatObj.nBitsPerSample, 2);
-            _wavFormatObj.nBitsPerSample =
-                (int16_t) ((uint32_t)tmpStr2[0] +
-                                 (((uint32_t)tmpStr2[1])<<8));
-
-            if (CHUNKheaderObj.fmt_ckSize < sizeof(WAVE_FMTINFO_header))
-            {
-                LOG(LS_ERROR) << "Chunk size is too small";
-                return -1;
-            }
-            for (i = 0;
-                 i < CHUNKheaderObj.fmt_ckSize - sizeof(WAVE_FMTINFO_header);
-                 i++)
-            {
-                len = wav.Read(&dummyRead, 1);
-                if(len != 1)
-                {
-                    LOG(LS_ERROR)
-                        << "File corrupted, reached EOF (reading fmt)";
-                    return -1;
-                }
-            }
-            fmtFound = true;
-        }
-        else if(strcmp(tmpStr, "data") == 0)
-        {
-            _dataSize = CHUNKheaderObj.fmt_ckSize;
-            dataFound = true;
-            break;
-        }
-        else
-        {
-            for (i = 0; i < CHUNKheaderObj.fmt_ckSize; i++)
-            {
-                len = wav.Read(&dummyRead, 1);
-                if(len != 1)
-                {
-                    LOG(LS_ERROR)
-                        << "File corrupted, reached EOF (reading other)";
-                    return -1;
-                }
-            }
-        }
-
-        len = wav.Read(&CHUNKheaderObj, sizeof(WAVE_CHUNK_header));
-
-        memcpy(tmpStr2, &CHUNKheaderObj.fmt_ckSize, 4);
-        CHUNKheaderObj.fmt_ckSize =
-            (uint32_t)tmpStr2[0] + (((uint32_t)tmpStr2[1]) << 8) +
-            (((uint32_t)tmpStr2[2]) << 16) + (((uint32_t)tmpStr2[3]) << 24);
-
-        memcpy(tmpStr, CHUNKheaderObj.fmt_ckID, 4);
-    }
-
-    // Either a proper format chunk has been read or a data chunk was come
-    // across.
-    if( (_wavFormatObj.formatTag != kWavFormatPcm) &&
-        (_wavFormatObj.formatTag != kWavFormatALaw) &&
-        (_wavFormatObj.formatTag != kWavFormatMuLaw))
-    {
-        LOG(LS_ERROR) << "Coding formatTag value=" << _wavFormatObj.formatTag
-                      << " not supported!";
-        return -1;
-    }
-    if((_wavFormatObj.nChannels < 1) ||
-        (_wavFormatObj.nChannels > 2))
-    {
-        LOG(LS_ERROR) << "nChannels value=" << _wavFormatObj.nChannels
-                      << " not supported!";
-        return -1;
-    }
-
-    if((_wavFormatObj.nBitsPerSample != 8) &&
-        (_wavFormatObj.nBitsPerSample != 16))
-    {
-        LOG(LS_ERROR) << "nBitsPerSample value=" << _wavFormatObj.nBitsPerSample
-                      << " not supported!";
-        return -1;
-    }
-
-    // Calculate the number of bytes that 10 ms of audio data correspond to.
-    size_t samples_per_10ms =
-        ((_wavFormatObj.formatTag == kWavFormatPcm) &&
-         (_wavFormatObj.nSamplesPerSec == 44100)) ?
-        440 : static_cast<size_t>(_wavFormatObj.nSamplesPerSec / 100);
-    _readSizeBytes = samples_per_10ms * _wavFormatObj.nChannels *
-        (_wavFormatObj.nBitsPerSample / 8);
-    return 0;
-}
-
-int32_t ModuleFileUtility::InitWavCodec(uint32_t samplesPerSec,
-                                        size_t channels,
-                                        uint32_t bitsPerSample,
-                                        uint32_t formatTag)
-{
-    codec_info_.pltype   = -1;
-    codec_info_.plfreq   = samplesPerSec;
-    codec_info_.channels = channels;
-    codec_info_.rate     = bitsPerSample * samplesPerSec;
-
-    // Calculate the packet size for 10ms frames
-    switch(formatTag)
-    {
-    case kWavFormatALaw:
-        strcpy(codec_info_.plname, "PCMA");
-        _codecId = kCodecPcma;
-        codec_info_.pltype = 8;
-        codec_info_.pacsize  = codec_info_.plfreq / 100;
-        break;
-    case kWavFormatMuLaw:
-        strcpy(codec_info_.plname, "PCMU");
-        _codecId = kCodecPcmu;
-        codec_info_.pltype = 0;
-        codec_info_.pacsize  = codec_info_.plfreq / 100;
-         break;
-    case kWavFormatPcm:
-        codec_info_.pacsize  = (bitsPerSample * (codec_info_.plfreq / 100)) / 8;
-        if(samplesPerSec == 8000)
-        {
-            strcpy(codec_info_.plname, "L16");
-            _codecId = kCodecL16_8Khz;
-        }
-        else if(samplesPerSec == 16000)
-        {
-            strcpy(codec_info_.plname, "L16");
-            _codecId = kCodecL16_16kHz;
-        }
-        else if(samplesPerSec == 32000)
-        {
-            strcpy(codec_info_.plname, "L16");
-            _codecId = kCodecL16_32Khz;
-        }
-        // Set the packet size for "odd" sampling frequencies so that it
-        // properly corresponds to _readSizeBytes.
-        else if(samplesPerSec == 11025)
-        {
-            strcpy(codec_info_.plname, "L16");
-            _codecId = kCodecL16_16kHz;
-            codec_info_.pacsize = 110;
-            codec_info_.plfreq = 11000;
-        }
-        else if(samplesPerSec == 22050)
-        {
-            strcpy(codec_info_.plname, "L16");
-            _codecId = kCodecL16_16kHz;
-            codec_info_.pacsize = 220;
-            codec_info_.plfreq = 22000;
-        }
-        else if(samplesPerSec == 44100)
-        {
-            strcpy(codec_info_.plname, "L16");
-            _codecId = kCodecL16_16kHz;
-            codec_info_.pacsize = 440;
-            codec_info_.plfreq = 44000;
-        }
-        else if(samplesPerSec == 48000)
-        {
-            strcpy(codec_info_.plname, "L16");
-            _codecId = kCodecL16_16kHz;
-            codec_info_.pacsize = 480;
-            codec_info_.plfreq = 48000;
-        }
-        else
-        {
-            LOG(LS_ERROR) << "Unsupported PCM frequency!";
-            return -1;
-        }
-        break;
-        default:
-            LOG(LS_ERROR) << "unknown WAV format TAG!";
-            return -1;
-            break;
-    }
-    return 0;
-}
-
-int32_t ModuleFileUtility::InitWavReading(InStream& wav,
-                                          const uint32_t start,
-                                          const uint32_t stop)
-{
-
-    _reading = false;
-
-    if(ReadWavHeader(wav) == -1)
-    {
-        LOG(LS_ERROR) << "failed to read WAV header!";
-        return -1;
-    }
-
-    _playoutPositionMs = 0;
-    _readPos = 0;
-
-    if(start > 0)
-    {
-        uint8_t dummy[WAV_MAX_BUFFER_SIZE];
-        int readLength;
-        if(_readSizeBytes <= WAV_MAX_BUFFER_SIZE)
-        {
-            while (_playoutPositionMs < start)
-            {
-                readLength = wav.Read(dummy, _readSizeBytes);
-                if(readLength == static_cast<int>(_readSizeBytes))
-                {
-                    _readPos += _readSizeBytes;
-                    _playoutPositionMs += 10;
-                }
-                else // Must have reached EOF before start position!
-                {
-                    LOG(LS_ERROR)
-                        << "InitWavReading(), EOF before start position";
-                    return -1;
-                }
-            }
-        }
-        else
-        {
-            return -1;
-        }
-    }
-    if( InitWavCodec(_wavFormatObj.nSamplesPerSec, _wavFormatObj.nChannels,
-                     _wavFormatObj.nBitsPerSample,
-                     _wavFormatObj.formatTag) != 0)
-    {
-        return -1;
-    }
-    _bytesPerSample = static_cast<size_t>(_wavFormatObj.nBitsPerSample / 8);
-
-
-    _startPointInMs = start;
-    _stopPointInMs = stop;
-    _reading = true;
-    return 0;
-}
-
-int32_t ModuleFileUtility::ReadWavDataAsMono(
-    InStream& wav,
-    int8_t* outData,
-    const size_t bufferSize)
-{
-    LOG(LS_VERBOSE) << "ModuleFileUtility::ReadWavDataAsMono(wav= " << &wav
-                    << ", outData= " << static_cast<void*>(outData)
-                    << ", bufSize= " << bufferSize << ")";
-
-    // The number of bytes that should be read from file.
-    const size_t totalBytesNeeded = _readSizeBytes;
-    // The number of bytes that will be written to outData.
-    const size_t bytesRequested = (codec_info_.channels == 2) ?
-        totalBytesNeeded >> 1 : totalBytesNeeded;
-    if(bufferSize < bytesRequested)
-    {
-        LOG(LS_ERROR) << "ReadWavDataAsMono: output buffer is too short!";
-        return -1;
-    }
-    if(outData == NULL)
-    {
-        LOG(LS_ERROR) << "ReadWavDataAsMono: output buffer NULL!";
-        return -1;
-    }
-
-    if(!_reading)
-    {
-        LOG(LS_ERROR) << "ReadWavDataAsMono: no longer reading file.";
-        return -1;
-    }
-
-    int32_t bytesRead = ReadWavData(
-        wav,
-        (codec_info_.channels == 2) ? _tempData : (uint8_t*)outData,
-        totalBytesNeeded);
-    if(bytesRead == 0)
-    {
-        return 0;
-    }
-    if(bytesRead < 0)
-    {
-        LOG(LS_ERROR)
-            << "ReadWavDataAsMono: failed to read data from WAV file.";
-        return -1;
-    }
-    // Output data is should be mono.
-    if(codec_info_.channels == 2)
-    {
-        for (size_t i = 0; i < bytesRequested / _bytesPerSample; i++)
-        {
-            // Sample value is the average of left and right buffer rounded to
-            // closest integer value. Note samples can be either 1 or 2 byte.
-            if(_bytesPerSample == 1)
-            {
-                _tempData[i] = ((_tempData[2 * i] + _tempData[(2 * i) + 1] +
-                                 1) >> 1);
-            }
-            else
-            {
-                int16_t* sampleData = (int16_t*) _tempData;
-                sampleData[i] = ((sampleData[2 * i] + sampleData[(2 * i) + 1] +
-                                  1) >> 1);
-            }
-        }
-        memcpy(outData, _tempData, bytesRequested);
-    }
-    return static_cast<int32_t>(bytesRequested);
-}
-
-int32_t ModuleFileUtility::ReadWavDataAsStereo(
-    InStream& wav,
-    int8_t* outDataLeft,
-    int8_t* outDataRight,
-    const size_t bufferSize)
-{
-    LOG(LS_VERBOSE) << "ModuleFileUtility::ReadWavDataAsStereo(wav= " << &wav
-                    << ", outLeft= " << static_cast<void*>(outDataLeft)
-                    << ", outRight= " << static_cast<void*>(outDataRight)
-                    << ", bufSize= " << bufferSize << ")";
-
-    if((outDataLeft == NULL) ||
-       (outDataRight == NULL))
-    {
-        LOG(LS_ERROR) << "ReadWavDataAsStereo: an input buffer is NULL!";
-        return -1;
-    }
-    if(codec_info_.channels != 2)
-    {
-        LOG(LS_ERROR)
-            << "ReadWavDataAsStereo: WAV file does not contain stereo data!";
-        return -1;
-    }
-    if(! _reading)
-    {
-        LOG(LS_ERROR) << "ReadWavDataAsStereo: no longer reading file.";
-        return -1;
-    }
-
-    // The number of bytes that should be read from file.
-    const size_t totalBytesNeeded = _readSizeBytes;
-    // The number of bytes that will be written to the left and the right
-    // buffers.
-    const size_t bytesRequested = totalBytesNeeded >> 1;
-    if(bufferSize < bytesRequested)
-    {
-        LOG(LS_ERROR) << "ReadWavDataAsStereo: Output buffers are too short!";
-        assert(false);
-        return -1;
-    }
-
-    int32_t bytesRead = ReadWavData(wav, _tempData, totalBytesNeeded);
-    if(bytesRead <= 0)
-    {
-        LOG(LS_ERROR)
-            << "ReadWavDataAsStereo: failed to read data from WAV file.";
-        return -1;
-    }
-
-    // Turn interleaved audio to left and right buffer. Note samples can be
-    // either 1 or 2 bytes
-    if(_bytesPerSample == 1)
-    {
-        for (size_t i = 0; i < bytesRequested; i++)
-        {
-            outDataLeft[i]  = _tempData[2 * i];
-            outDataRight[i] = _tempData[(2 * i) + 1];
-        }
-    }
-    else if(_bytesPerSample == 2)
-    {
-        int16_t* sampleData = reinterpret_cast<int16_t*>(_tempData);
-        int16_t* outLeft = reinterpret_cast<int16_t*>(outDataLeft);
-        int16_t* outRight = reinterpret_cast<int16_t*>(
-            outDataRight);
-
-        // Bytes requested to samples requested.
-        size_t sampleCount = bytesRequested >> 1;
-        for (size_t i = 0; i < sampleCount; i++)
-        {
-            outLeft[i] = sampleData[2 * i];
-            outRight[i] = sampleData[(2 * i) + 1];
-        }
-    } else {
-        LOG(LS_ERROR) << "ReadWavStereoData: unsupported sample size "
-                      << _bytesPerSample << "!";
-        assert(false);
-        return -1;
-    }
-    return static_cast<int32_t>(bytesRequested);
-}
-
-int32_t ModuleFileUtility::ReadWavData(InStream& wav,
-                                       uint8_t* buffer,
-                                       size_t dataLengthInBytes)
-{
-    LOG(LS_VERBOSE) << "ModuleFileUtility::ReadWavData(wav= " << &wav
-                    << ", buffer= " << static_cast<void*>(buffer)
-                    << ", dataLen= " << dataLengthInBytes << ")";
-
-    if(buffer == NULL)
-    {
-        LOG(LS_ERROR) << "ReadWavDataAsMono: output buffer NULL!";
-        return -1;
-    }
-
-    // Make sure that a read won't return too few samples.
-    // TODO (hellner): why not read the remaining bytes needed from the start
-    //                 of the file?
-    if(_dataSize < (_readPos + dataLengthInBytes))
-    {
-        // Rewind() being -1 may be due to the file not supposed to be looped.
-        if(wav.Rewind() == -1)
-        {
-            _reading = false;
-            return 0;
-        }
-        if(InitWavReading(wav, _startPointInMs, _stopPointInMs) == -1)
-        {
-            _reading = false;
-            return -1;
-        }
-    }
-
-    int32_t bytesRead = wav.Read(buffer, dataLengthInBytes);
-    if(bytesRead < 0)
-    {
-        _reading = false;
-        return -1;
-    }
-
-    // This should never happen due to earlier sanity checks.
-    // TODO (hellner): change to an assert and fail here since this should
-    //                 never happen...
-    if(bytesRead < (int32_t)dataLengthInBytes)
-    {
-        if((wav.Rewind() == -1) ||
-            (InitWavReading(wav, _startPointInMs, _stopPointInMs) == -1))
-        {
-            _reading = false;
-            return -1;
-        }
-        else
-        {
-            bytesRead = wav.Read(buffer, dataLengthInBytes);
-            if(bytesRead < (int32_t)dataLengthInBytes)
-            {
-                _reading = false;
-                return -1;
-            }
-        }
-    }
-
-    _readPos += bytesRead;
-
-    // TODO (hellner): Why is dataLengthInBytes let dictate the number of bytes
-    //                 to read when exactly 10ms should be read?!
-    _playoutPositionMs += 10;
-    if((_stopPointInMs > 0) &&
-        (_playoutPositionMs >= _stopPointInMs))
-    {
-        if((wav.Rewind() == -1) ||
-            (InitWavReading(wav, _startPointInMs, _stopPointInMs) == -1))
-        {
-            _reading = false;
-        }
-    }
-    return bytesRead;
-}
-
-int32_t ModuleFileUtility::InitWavWriting(OutStream& wav,
-                                          const CodecInst& codecInst)
-{
-
-    if(set_codec_info(codecInst) != 0)
-    {
-        LOG(LS_ERROR) << "codecInst identifies unsupported codec!";
-        return -1;
-    }
-    _writing = false;
-    size_t channels = (codecInst.channels == 0) ? 1 : codecInst.channels;
-
-    if(STR_CASE_CMP(codecInst.plname, "PCMU") == 0)
-    {
-        _bytesPerSample = 1;
-        if(WriteWavHeader(wav, 8000, _bytesPerSample, channels,
-                          kWavFormatMuLaw, 0) == -1)
-        {
-            return -1;
-        }
-    }
-    else if(STR_CASE_CMP(codecInst.plname, "PCMA") == 0)
-    {
-        _bytesPerSample = 1;
-        if(WriteWavHeader(wav, 8000, _bytesPerSample, channels, kWavFormatALaw,
-                          0) == -1)
-        {
-            return -1;
-        }
-    }
-    else if(STR_CASE_CMP(codecInst.plname, "L16") == 0)
-    {
-        _bytesPerSample = 2;
-        if(WriteWavHeader(wav, codecInst.plfreq, _bytesPerSample, channels,
-                          kWavFormatPcm, 0) == -1)
-        {
-            return -1;
-        }
-    }
-    else
-    {
-        LOG(LS_ERROR) << "codecInst identifies unsupported codec for WAV file!";
-        return -1;
-    }
-    _writing = true;
-    _bytesWritten = 0;
-    return 0;
-}
-
-int32_t ModuleFileUtility::WriteWavData(OutStream& out,
-                                        const int8_t*  buffer,
-                                        const size_t dataLength)
-{
-    LOG(LS_VERBOSE) << "ModuleFileUtility::WriteWavData(out= " << &out
-                    << ", buf= " << static_cast<const void*>(buffer)
-                    << ", dataLen= " << dataLength << ")";
-
-    if(buffer == NULL)
-    {
-        LOG(LS_ERROR) << "WriteWavData: input buffer NULL!";
-        return -1;
-    }
-
-    if(!out.Write(buffer, dataLength))
-    {
-        return -1;
-    }
-    _bytesWritten += dataLength;
-    return static_cast<int32_t>(dataLength);
-}
-
-
-int32_t ModuleFileUtility::WriteWavHeader(
-    OutStream& wav,
-    uint32_t freq,
-    size_t bytesPerSample,
-    size_t channels,
-    uint32_t format,
-    size_t lengthInBytes)
-{
-    // Frame size in bytes for 10 ms of audio.
-    // TODO (hellner): 44.1 kHz has 440 samples frame size. Doesn't seem to
-    //                 be taken into consideration here!
-    const size_t frameSize = (freq / 100) * channels;
-
-    // Calculate the number of full frames that the wave file contain.
-    const size_t dataLengthInBytes = frameSize * (lengthInBytes / frameSize);
-
-    uint8_t buf[kWavHeaderSize];
-    webrtc::WriteWavHeader(buf, channels, freq, static_cast<WavFormat>(format),
-                           bytesPerSample, dataLengthInBytes / bytesPerSample);
-    wav.Write(buf, kWavHeaderSize);
-    return 0;
-}
-
-int32_t ModuleFileUtility::UpdateWavHeader(OutStream& wav)
-{
-    int32_t res = -1;
-    if(wav.Rewind() == -1)
-    {
-        return -1;
-    }
-    size_t channels = (codec_info_.channels == 0) ? 1 : codec_info_.channels;
-
-    if(STR_CASE_CMP(codec_info_.plname, "L16") == 0)
-    {
-        res = WriteWavHeader(wav, codec_info_.plfreq, 2, channels,
-                             kWavFormatPcm, _bytesWritten);
-    } else if(STR_CASE_CMP(codec_info_.plname, "PCMU") == 0) {
-            res = WriteWavHeader(wav, 8000, 1, channels, kWavFormatMuLaw,
-                                 _bytesWritten);
-    } else if(STR_CASE_CMP(codec_info_.plname, "PCMA") == 0) {
-            res = WriteWavHeader(wav, 8000, 1, channels, kWavFormatALaw,
-                                 _bytesWritten);
-    } else {
-        // Allow calling this API even if not writing to a WAVE file.
-        // TODO (hellner): why?!
-        return 0;
-    }
-    return res;
-}
-
-
-int32_t ModuleFileUtility::InitPreEncodedReading(InStream& in,
-                                                 const CodecInst& cinst)
-{
-
-    uint8_t preEncodedID;
-    in.Read(&preEncodedID, 1);
-
-    MediaFileUtility_CodecType codecType =
-        (MediaFileUtility_CodecType)preEncodedID;
-
-    if(set_codec_info(cinst) != 0)
-    {
-        LOG(LS_ERROR) << "Pre-encoded file send codec mismatch!";
-        return -1;
-    }
-    if(codecType != _codecId)
-    {
-        LOG(LS_ERROR) << "Pre-encoded file format codec mismatch!";
-        return -1;
-    }
-    memcpy(&codec_info_,&cinst,sizeof(CodecInst));
-    _reading = true;
-    return 0;
-}
-
-int32_t ModuleFileUtility::ReadPreEncodedData(
-    InStream& in,
-    int8_t* outData,
-    const size_t bufferSize)
-{
-    LOG(LS_VERBOSE) << "ModuleFileUtility::ReadPreEncodedData(in= " << &in
-                    << ", outData= " << static_cast<void*>(outData)
-                    << ", bufferSize= " << bufferSize << ")";
-
-    if(outData == NULL)
-    {
-        LOG(LS_ERROR) << "output buffer NULL";
-    }
-
-    size_t frameLen;
-    uint8_t buf[64];
-    // Each frame has a two byte header containing the frame length.
-    int32_t res = in.Read(buf, 2);
-    if(res != 2)
-    {
-        if(!in.Rewind())
-        {
-            // The first byte is the codec identifier.
-            in.Read(buf, 1);
-            res = in.Read(buf, 2);
-        }
-        else
-        {
-            return -1;
-        }
-    }
-    frameLen = buf[0] + buf[1] * 256;
-    if(bufferSize < frameLen)
-    {
-        LOG(LS_ERROR) << "buffer not large enough to read " << frameLen
-                      << " bytes of pre-encoded data!";
-        return -1;
-    }
-    return in.Read(outData, frameLen);
-}
-
-int32_t ModuleFileUtility::InitPreEncodedWriting(
-    OutStream& out,
-    const CodecInst& codecInst)
-{
-
-    if(set_codec_info(codecInst) != 0)
-    {
-        LOG(LS_ERROR) << "CodecInst not recognized!";
-        return -1;
-    }
-    _writing = true;
-    _bytesWritten = 1;
-    out.Write(&_codecId, 1);
-    return 0;
-}
-
-int32_t ModuleFileUtility::WritePreEncodedData(
-    OutStream& out,
-    const int8_t* buffer,
-    const size_t dataLength)
-{
-    LOG(LS_VERBOSE) << "ModuleFileUtility::WritePreEncodedData(out= " << &out
-                    << " , inData= " << static_cast<const void*>(buffer)
-                    << ", dataLen= " << dataLength << ")";
-
-    if(buffer == NULL)
-    {
-        LOG(LS_ERROR) << "buffer NULL";
-    }
-
-    size_t bytesWritten = 0;
-    // The first two bytes is the size of the frame.
-    int16_t lengthBuf;
-    lengthBuf = (int16_t)dataLength;
-    if(dataLength > static_cast<size_t>(std::numeric_limits<int16_t>::max()) ||
-       !out.Write(&lengthBuf, 2))
-    {
-       return -1;
-    }
-    bytesWritten = 2;
-
-    if(!out.Write(buffer, dataLength))
-    {
-        return -1;
-    }
-    bytesWritten += dataLength;
-    return static_cast<int32_t>(bytesWritten);
-}
-
-int32_t ModuleFileUtility::InitCompressedReading(
-    InStream& in,
-    const uint32_t start,
-    const uint32_t stop)
-{
-    LOG(LS_VERBOSE) << "ModuleFileUtility::InitCompressedReading(in= " << &in
-                    << ", start= " << start << ", stop= " << stop << ")";
-
-#if defined(WEBRTC_CODEC_ILBC)
-    int16_t read_len = 0;
-#endif
-    _codecId = kCodecNoCodec;
-    _playoutPositionMs = 0;
-    _reading = false;
-
-    _startPointInMs = start;
-    _stopPointInMs = stop;
-
-    // Read the codec name
-    int32_t cnt = 0;
-    char buf[64];
-    do
-    {
-        in.Read(&buf[cnt++], 1);
-    } while ((buf[cnt-1] != '\n') && (64 > cnt));
-
-    if(cnt==64)
-    {
-        return -1;
-    }
-    buf[cnt]=0;
-
-#ifdef WEBRTC_CODEC_ILBC
-    if(!strcmp("#!iLBC20\n", buf))
-    {
-        codec_info_.pltype = 102;
-        strcpy(codec_info_.plname, "ilbc");
-        codec_info_.plfreq   = 8000;
-        codec_info_.pacsize  = 160;
-        codec_info_.channels = 1;
-        codec_info_.rate     = 13300;
-        _codecId = kCodecIlbc20Ms;
-
-        if(_startPointInMs > 0)
-        {
-            while (_playoutPositionMs <= _startPointInMs)
-            {
-                read_len = in.Read(buf, 38);
-                if(read_len != 38)
-                {
-                    return -1;
-                }
-                _playoutPositionMs += 20;
-            }
-        }
-    }
-
-    if(!strcmp("#!iLBC30\n", buf))
-    {
-        codec_info_.pltype = 102;
-        strcpy(codec_info_.plname, "ilbc");
-        codec_info_.plfreq   = 8000;
-        codec_info_.pacsize  = 240;
-        codec_info_.channels = 1;
-        codec_info_.rate     = 13300;
-        _codecId = kCodecIlbc30Ms;
-
-        if(_startPointInMs > 0)
-        {
-            while (_playoutPositionMs <= _startPointInMs)
-            {
-                read_len = in.Read(buf, 50);
-                if(read_len != 50)
-                {
-                    return -1;
-                }
-                _playoutPositionMs += 20;
-            }
-        }
-    }
-#endif
-    if(_codecId == kCodecNoCodec)
-    {
-        return -1;
-    }
-    _reading = true;
-    return 0;
-}
-
-int32_t ModuleFileUtility::ReadCompressedData(InStream& in,
-                                              int8_t* outData,
-                                              size_t bufferSize)
-{
-    LOG(LS_VERBOSE) << "ModuleFileUtility::ReadCompressedData(in=" << &in
-                    << ", outData=" << static_cast<void*>(outData) << ", bytes="
-                    << bufferSize << ")";
-
-    int bytesRead = 0;
-
-    if(! _reading)
-    {
-        LOG(LS_ERROR) << "not currently reading!";
-        return -1;
-    }
-
-#ifdef WEBRTC_CODEC_ILBC
-    if((_codecId == kCodecIlbc20Ms) ||
-        (_codecId == kCodecIlbc30Ms))
-    {
-        size_t byteSize = 0;
-        if(_codecId == kCodecIlbc30Ms)
-        {
-            byteSize = 50;
-        }
-        if(_codecId == kCodecIlbc20Ms)
-        {
-            byteSize = 38;
-        }
-        if(bufferSize < byteSize)
-        {
-            LOG(LS_ERROR)
-                << "output buffer is too short to read ILBC compressed data.";
-            assert(false);
-            return -1;
-        }
-
-        bytesRead = in.Read(outData, byteSize);
-        if(bytesRead != static_cast<int>(byteSize))
-        {
-            if(!in.Rewind())
-            {
-                InitCompressedReading(in, _startPointInMs, _stopPointInMs);
-                bytesRead = in.Read(outData, byteSize);
-                if(bytesRead != static_cast<int>(byteSize))
-                {
-                    _reading = false;
-                    return -1;
-                }
-            }
-            else
-            {
-                _reading = false;
-                return -1;
-            }
-        }
-    }
-#endif
-    if(bytesRead == 0)
-    {
-        LOG(LS_ERROR)
-            << "ReadCompressedData() no bytes read, codec not supported";
-        return -1;
-    }
-
-    _playoutPositionMs += 20;
-    if((_stopPointInMs > 0) &&
-        (_playoutPositionMs >= _stopPointInMs))
-    {
-        if(!in.Rewind())
-        {
-            InitCompressedReading(in, _startPointInMs, _stopPointInMs);
-        }
-        else
-        {
-            _reading = false;
-        }
-    }
-    return bytesRead;
-}
-
-int32_t ModuleFileUtility::InitCompressedWriting(
-    OutStream& out,
-    const CodecInst& codecInst)
-{
-    LOG(LS_VERBOSE) << "ModuleFileUtility::InitCompressedWriting(out= " << &out
-                    << ", codecName= " << codecInst.plname << ")";
-
-    _writing = false;
-
-#ifdef WEBRTC_CODEC_ILBC
-    if(STR_CASE_CMP(codecInst.plname, "ilbc") == 0)
-    {
-        if(codecInst.pacsize == 160)
-        {
-            _codecId = kCodecIlbc20Ms;
-            out.Write("#!iLBC20\n",9);
-        }
-        else if(codecInst.pacsize == 240)
-        {
-            _codecId = kCodecIlbc30Ms;
-            out.Write("#!iLBC30\n",9);
-        }
-        else
-        {
-          LOG(LS_ERROR) << "codecInst defines unsupported compression codec!";
-            return -1;
-        }
-        memcpy(&codec_info_,&codecInst,sizeof(CodecInst));
-        _writing = true;
-        return 0;
-    }
-#endif
-
-    LOG(LS_ERROR) << "codecInst defines unsupported compression codec!";
-    return -1;
-}
-
-int32_t ModuleFileUtility::WriteCompressedData(
-    OutStream& out,
-    const int8_t* buffer,
-    const size_t dataLength)
-{
-    LOG(LS_VERBOSE) << "ModuleFileUtility::WriteCompressedData(out= " << &out
-                    << ", buf= " << static_cast<const void*>(buffer)
-                    << ", dataLen= " << dataLength << ")";
-
-    if(buffer == NULL)
-    {
-        LOG(LS_ERROR) << "buffer NULL";
-    }
-
-    if(!out.Write(buffer, dataLength))
-    {
-        return -1;
-    }
-    return static_cast<int32_t>(dataLength);
-}
-
-int32_t ModuleFileUtility::InitPCMReading(InStream& pcm,
-                                          const uint32_t start,
-                                          const uint32_t stop,
-                                          uint32_t freq)
-{
-    LOG(LS_VERBOSE) << "ModuleFileUtility::InitPCMReading(pcm= " << &pcm
-                    << ", start=" << start << ", stop=" << stop << ", freq="
-                    << freq << ")";
-
-    int8_t dummy[320];
-    int read_len;
-
-    _playoutPositionMs = 0;
-    _startPointInMs = start;
-    _stopPointInMs = stop;
-    _reading = false;
-
-    if(freq == 8000)
-    {
-        strcpy(codec_info_.plname, "L16");
-        codec_info_.pltype   = -1;
-        codec_info_.plfreq   = 8000;
-        codec_info_.pacsize  = 160;
-        codec_info_.channels = 1;
-        codec_info_.rate     = 128000;
-        _codecId = kCodecL16_8Khz;
-    }
-    else if(freq == 16000)
-    {
-        strcpy(codec_info_.plname, "L16");
-        codec_info_.pltype   = -1;
-        codec_info_.plfreq   = 16000;
-        codec_info_.pacsize  = 320;
-        codec_info_.channels = 1;
-        codec_info_.rate     = 256000;
-        _codecId = kCodecL16_16kHz;
-    }
-    else if(freq == 32000)
-    {
-        strcpy(codec_info_.plname, "L16");
-        codec_info_.pltype   = -1;
-        codec_info_.plfreq   = 32000;
-        codec_info_.pacsize  = 320;
-        codec_info_.channels = 1;
-        codec_info_.rate     = 512000;
-        _codecId = kCodecL16_32Khz;
-    }
-    else if(freq == 48000)
-    {
-        strcpy(codec_info_.plname, "L16");
-        codec_info_.pltype   = -1;
-        codec_info_.plfreq   = 48000;
-        codec_info_.pacsize  = 480;
-        codec_info_.channels = 1;
-        codec_info_.rate     = 768000;
-        _codecId = kCodecL16_48Khz;
-    }
-
-    // Readsize for 10ms of audio data (2 bytes per sample).
-    _readSizeBytes = 2 * codec_info_. plfreq / 100;
-    if(_startPointInMs > 0)
-    {
-        while (_playoutPositionMs < _startPointInMs)
-        {
-            read_len = pcm.Read(dummy, _readSizeBytes);
-            if(read_len != static_cast<int>(_readSizeBytes))
-            {
-                return -1;  // Must have reached EOF before start position!
-            }
-            _playoutPositionMs += 10;
-        }
-    }
-    _reading = true;
-    return 0;
-}
-
-int32_t ModuleFileUtility::ReadPCMData(InStream& pcm,
-                                       int8_t* outData,
-                                       size_t bufferSize)
-{
-    LOG(LS_VERBOSE) << "ModuleFileUtility::ReadPCMData(pcm= " << &pcm
-                    << ", outData= " << static_cast<void*>(outData)
-                    << ", bufSize= " << bufferSize << ")";
-
-    if(outData == NULL)
-    {
-        LOG(LS_ERROR) << "buffer NULL";
-    }
-
-    // Readsize for 10ms of audio data (2 bytes per sample).
-    size_t bytesRequested = static_cast<size_t>(2 * codec_info_.plfreq / 100);
-    if(bufferSize <  bytesRequested)
-    {
-        LOG(LS_ERROR)
-            << "ReadPCMData: buffer not long enough for a 10ms frame.";
-        assert(false);
-        return -1;
-    }
-
-    int bytesRead = pcm.Read(outData, bytesRequested);
-    if(bytesRead < static_cast<int>(bytesRequested))
-    {
-        if(pcm.Rewind() == -1)
-        {
-            _reading = false;
-        }
-        else
-        {
-            if(InitPCMReading(pcm, _startPointInMs, _stopPointInMs,
-                              codec_info_.plfreq) == -1)
-            {
-                _reading = false;
-            }
-            else
-            {
-                size_t rest = bytesRequested - bytesRead;
-                int len = pcm.Read(&(outData[bytesRead]), rest);
-                if(len == static_cast<int>(rest))
-                {
-                    bytesRead += len;
-                }
-                else
-                {
-                    _reading = false;
-                }
-            }
-            if(bytesRead <= 0)
-            {
-                LOG(LS_ERROR) << "ReadPCMData: Failed to rewind audio file.";
-                return -1;
-            }
-        }
-    }
-
-    if(bytesRead <= 0)
-    {
-        LOG(LS_VERBOSE) << "ReadPCMData: end of file";
-        return -1;
-    }
-    _playoutPositionMs += 10;
-    if(_stopPointInMs && _playoutPositionMs >= _stopPointInMs)
-    {
-        if(!pcm.Rewind())
-        {
-            if(InitPCMReading(pcm, _startPointInMs, _stopPointInMs,
-                              codec_info_.plfreq) == -1)
-            {
-                _reading = false;
-            }
-        }
-    }
-    return bytesRead;
-}
-
-int32_t ModuleFileUtility::InitPCMWriting(OutStream& out, uint32_t freq)
-{
-
-    if(freq == 8000)
-    {
-        strcpy(codec_info_.plname, "L16");
-        codec_info_.pltype   = -1;
-        codec_info_.plfreq   = 8000;
-        codec_info_.pacsize  = 160;
-        codec_info_.channels = 1;
-        codec_info_.rate     = 128000;
-
-        _codecId = kCodecL16_8Khz;
-    }
-    else if(freq == 16000)
-    {
-        strcpy(codec_info_.plname, "L16");
-        codec_info_.pltype   = -1;
-        codec_info_.plfreq   = 16000;
-        codec_info_.pacsize  = 320;
-        codec_info_.channels = 1;
-        codec_info_.rate     = 256000;
-
-        _codecId = kCodecL16_16kHz;
-    }
-    else if(freq == 32000)
-    {
-        strcpy(codec_info_.plname, "L16");
-        codec_info_.pltype   = -1;
-        codec_info_.plfreq   = 32000;
-        codec_info_.pacsize  = 320;
-        codec_info_.channels = 1;
-        codec_info_.rate     = 512000;
-
-        _codecId = kCodecL16_32Khz;
-    }
-    else if(freq == 48000)
-    {
-        strcpy(codec_info_.plname, "L16");
-        codec_info_.pltype   = -1;
-        codec_info_.plfreq   = 48000;
-        codec_info_.pacsize  = 480;
-        codec_info_.channels = 1;
-        codec_info_.rate     = 768000;
-
-        _codecId = kCodecL16_48Khz;
-    }
-    if((_codecId != kCodecL16_8Khz) &&
-       (_codecId != kCodecL16_16kHz) &&
-       (_codecId != kCodecL16_32Khz) &&
-       (_codecId != kCodecL16_48Khz))
-    {
-        LOG(LS_ERROR) << "CodecInst is not 8KHz, 16KHz, 32kHz or 48kHz PCM!";
-        return -1;
-    }
-    _writing = true;
-    _bytesWritten = 0;
-    return 0;
-}
-
-int32_t ModuleFileUtility::WritePCMData(OutStream& out,
-                                        const int8_t*  buffer,
-                                        const size_t dataLength)
-{
-    LOG(LS_VERBOSE) << "ModuleFileUtility::WritePCMData(out= " << &out
-                    << ", buf= " << static_cast<const void*>(buffer)
-                    << ", dataLen= " << dataLength << ")";
-
-    if(buffer == NULL)
-    {
-        LOG(LS_ERROR) << "buffer NULL";
-    }
-
-    if(!out.Write(buffer, dataLength))
-    {
-        return -1;
-    }
-
-    _bytesWritten += dataLength;
-    return static_cast<int32_t>(dataLength);
-}
-
-int32_t ModuleFileUtility::codec_info(CodecInst& codecInst)
-{
-    LOG(LS_VERBOSE) << "ModuleFileUtility::codec_info(codecInst= " << &codecInst
-                    << ")";
-
-    if(!_reading && !_writing)
-    {
-        LOG(LS_ERROR) << "CodecInst: not currently reading audio file!";
-        return -1;
-    }
-    memcpy(&codecInst,&codec_info_,sizeof(CodecInst));
-    return 0;
-}
-
-int32_t ModuleFileUtility::set_codec_info(const CodecInst& codecInst)
-{
-
-    _codecId = kCodecNoCodec;
-    if(STR_CASE_CMP(codecInst.plname, "PCMU") == 0)
-    {
-        _codecId = kCodecPcmu;
-    }
-    else if(STR_CASE_CMP(codecInst.plname, "PCMA") == 0)
-    {
-        _codecId = kCodecPcma;
-    }
-    else if(STR_CASE_CMP(codecInst.plname, "L16") == 0)
-    {
-        if(codecInst.plfreq == 8000)
-        {
-            _codecId = kCodecL16_8Khz;
-        }
-        else if(codecInst.plfreq == 16000)
-        {
-            _codecId = kCodecL16_16kHz;
-        }
-        else if(codecInst.plfreq == 32000)
-        {
-            _codecId = kCodecL16_32Khz;
-        }
-        else if(codecInst.plfreq == 48000)
-        {
-            _codecId = kCodecL16_48Khz;
-        }
-    }
-#ifdef WEBRTC_CODEC_ILBC
-    else if(STR_CASE_CMP(codecInst.plname, "ilbc") == 0)
-    {
-        if(codecInst.pacsize == 160)
-        {
-            _codecId = kCodecIlbc20Ms;
-        }
-        else if(codecInst.pacsize == 240)
-        {
-            _codecId = kCodecIlbc30Ms;
-        }
-    }
-#endif
-#if(defined(WEBRTC_CODEC_ISAC) || defined(WEBRTC_CODEC_ISACFX))
-    else if(STR_CASE_CMP(codecInst.plname, "isac") == 0)
-    {
-        if(codecInst.plfreq == 16000)
-        {
-            _codecId = kCodecIsac;
-        }
-        else if(codecInst.plfreq == 32000)
-        {
-            _codecId = kCodecIsacSwb;
-        }
-    }
-#endif
-#ifdef WEBRTC_CODEC_G722
-    else if(STR_CASE_CMP(codecInst.plname, "G722") == 0)
-    {
-        _codecId = kCodecG722;
-    }
-#endif
-    if(_codecId == kCodecNoCodec)
-    {
-        return -1;
-    }
-    memcpy(&codec_info_, &codecInst, sizeof(CodecInst));
-    return 0;
-}
-
-int32_t ModuleFileUtility::FileDurationMs(const char* fileName,
-                                          const FileFormats fileFormat,
-                                          const uint32_t freqInHz)
-{
-
-    if(fileName == NULL)
-    {
-        LOG(LS_ERROR) << "filename NULL";
-        return -1;
-    }
-
-    int32_t time_in_ms = -1;
-    struct stat file_size;
-    if(stat(fileName,&file_size) == -1)
-    {
-        LOG(LS_ERROR) << "failed to retrieve file size with stat!";
-        return -1;
-    }
-    FileWrapper* inStreamObj = FileWrapper::Create();
-    if(inStreamObj == NULL)
-    {
-        LOG(LS_INFO) << "failed to create InStream object!";
-        return -1;
-    }
-    if (!inStreamObj->OpenFile(fileName, true)) {
-      delete inStreamObj;
-      LOG(LS_ERROR) << "failed to open file " << fileName << "!";
-      return -1;
-    }
-
-    switch (fileFormat)
-    {
-        case kFileFormatWavFile:
-        {
-            if(ReadWavHeader(*inStreamObj) == -1)
-            {
-                LOG(LS_ERROR) << "failed to read WAV file header!";
-                return -1;
-            }
-            time_in_ms = ((file_size.st_size - 44) /
-                          (_wavFormatObj.nAvgBytesPerSec/1000));
-            break;
-        }
-        case kFileFormatPcm16kHzFile:
-        {
-            // 16 samples per ms. 2 bytes per sample.
-            int32_t denominator = 16*2;
-            time_in_ms = (file_size.st_size)/denominator;
-            break;
-        }
-        case kFileFormatPcm8kHzFile:
-        {
-            // 8 samples per ms. 2 bytes per sample.
-            int32_t denominator = 8*2;
-            time_in_ms = (file_size.st_size)/denominator;
-            break;
-        }
-        case kFileFormatCompressedFile:
-        {
-            int32_t cnt = 0;
-            int read_len = 0;
-            char buf[64];
-            do
-            {
-                read_len = inStreamObj->Read(&buf[cnt++], 1);
-                if(read_len != 1)
-                {
-                    return -1;
-                }
-            } while ((buf[cnt-1] != '\n') && (64 > cnt));
-
-            if(cnt == 64)
-            {
-                return -1;
-            }
-            else
-            {
-                buf[cnt] = 0;
-            }
-#ifdef WEBRTC_CODEC_ILBC
-            if(!strcmp("#!iLBC20\n", buf))
-            {
-                // 20 ms is 304 bits
-                time_in_ms = ((file_size.st_size)*160)/304;
-                break;
-            }
-            if(!strcmp("#!iLBC30\n", buf))
-            {
-                // 30 ms takes 400 bits.
-                // file size in bytes * 8 / 400 is the number of
-                // 30 ms frames in the file ->
-                // time_in_ms = file size * 8 / 400 * 30
-                time_in_ms = ((file_size.st_size)*240)/400;
-                break;
-            }
-#endif
-            break;
-        }
-        case kFileFormatPreencodedFile:
-        {
-            LOG(LS_ERROR) << "cannot determine duration of Pre-Encoded file!";
-            break;
-        }
-        default:
-            LOG(LS_ERROR) << "unsupported file format " << fileFormat << "!";
-            break;
-    }
-    inStreamObj->CloseFile();
-    delete inStreamObj;
-    return time_in_ms;
-}
-
-uint32_t ModuleFileUtility::PlayoutPositionMs()
-{
-    LOG(LS_VERBOSE) << "ModuleFileUtility::PlayoutPosition()";
-
-    return _reading ? _playoutPositionMs : 0;
-}
-}  // namespace webrtc
diff --git a/modules/media_file/media_file_utility.h b/modules/media_file/media_file_utility.h
deleted file mode 100644
index b339af7..0000000
--- a/modules/media_file/media_file_utility.h
+++ /dev/null
@@ -1,281 +0,0 @@
-/*
- *  Copyright (c) 2012 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.
- */
-
-// Note: the class cannot be used for reading and writing at the same time.
-#ifndef WEBRTC_MODULES_MEDIA_FILE_MEDIA_FILE_UTILITY_H_
-#define WEBRTC_MODULES_MEDIA_FILE_MEDIA_FILE_UTILITY_H_
-
-#include <stdio.h>
-
-#include "webrtc/common_types.h"
-#include "webrtc/modules/media_file/media_file_defines.h"
-
-namespace webrtc {
-class InStream;
-class OutStream;
-
-class ModuleFileUtility
-{
-public:
-
-    ModuleFileUtility();
-    ~ModuleFileUtility();
-
-    // Prepare for playing audio from stream.
-    // startPointMs and stopPointMs, unless zero, specify what part of the file
-    // should be read. From startPointMs ms to stopPointMs ms.
-    int32_t InitWavReading(InStream& stream,
-                           const uint32_t startPointMs = 0,
-                           const uint32_t stopPointMs = 0);
-
-    // Put 10-60ms of audio data from stream into the audioBuffer depending on
-    // codec frame size. dataLengthInBytes indicates the size of audioBuffer.
-    // The return value is the number of bytes written to audioBuffer.
-    // Note: This API only play mono audio but can be used on file containing
-    // audio with more channels (in which case the audio will be converted to
-    // mono).
-    int32_t ReadWavDataAsMono(InStream& stream, int8_t* audioBuffer,
-                              const size_t dataLengthInBytes);
-
-    // Put 10-60ms, depending on codec frame size, of audio data from file into
-    // audioBufferLeft and audioBufferRight. The buffers contain the left and
-    // right channel of played out stereo audio.
-    // dataLengthInBytes  indicates the size of both audioBufferLeft and
-    // audioBufferRight.
-    // The return value is the number of bytes read for each buffer.
-    // Note: This API can only be successfully called for WAV files with stereo
-    // audio.
-    int32_t ReadWavDataAsStereo(InStream& wav,
-                                int8_t* audioBufferLeft,
-                                int8_t* audioBufferRight,
-                                const size_t bufferLength);
-
-    // Prepare for recording audio to stream.
-    // codecInst specifies the encoding of the audio data.
-    // Note: codecInst.channels should be set to 2 for stereo (and 1 for
-    // mono). Stereo is only supported for WAV files.
-    int32_t InitWavWriting(OutStream& stream, const CodecInst& codecInst);
-
-    // Write one audio frame, i.e. the bufferLength first bytes of audioBuffer,
-    // to file. The audio frame size is determined by the codecInst.pacsize
-    // parameter of the last sucessfull StartRecordingAudioFile(..) call.
-    // The return value is the number of bytes written to audioBuffer.
-    int32_t WriteWavData(OutStream& stream,
-                         const int8_t* audioBuffer,
-                         const size_t bufferLength);
-
-    // Finalizes the WAV header so that it is correct if nothing more will be
-    // written to stream.
-    // Note: this API must be called before closing stream to ensure that the
-    //       WAVE header is updated with the file size. Don't call this API
-    //       if more samples are to be written to stream.
-    int32_t UpdateWavHeader(OutStream& stream);
-
-    // Prepare for playing audio from stream.
-    // startPointMs and stopPointMs, unless zero, specify what part of the file
-    // should be read. From startPointMs ms to stopPointMs ms.
-    // freqInHz is the PCM sampling frequency.
-    // NOTE, allowed frequencies are 8000, 16000 and 32000 (Hz)
-    int32_t InitPCMReading(InStream& stream,
-                           const uint32_t startPointMs = 0,
-                           const uint32_t stopPointMs = 0,
-                           const uint32_t freqInHz = 16000);
-
-    // Put 10-60ms of audio data from stream into the audioBuffer depending on
-    // codec frame size. dataLengthInBytes indicates the size of audioBuffer.
-    // The return value is the number of bytes written to audioBuffer.
-    int32_t ReadPCMData(InStream& stream, int8_t* audioBuffer,
-                        const size_t dataLengthInBytes);
-
-    // Prepare for recording audio to stream.
-    // freqInHz is the PCM sampling frequency.
-    // NOTE, allowed frequencies are 8000, 16000 and 32000 (Hz)
-    int32_t InitPCMWriting(OutStream& stream, const uint32_t freqInHz = 16000);
-
-    // Write one 10ms audio frame, i.e. the bufferLength first bytes of
-    // audioBuffer, to file. The audio frame size is determined by the freqInHz
-    // parameter of the last sucessfull InitPCMWriting(..) call.
-    // The return value is the number of bytes written to audioBuffer.
-    int32_t WritePCMData(OutStream& stream,
-                         const int8_t* audioBuffer,
-                         size_t bufferLength);
-
-    // Prepare for playing audio from stream.
-    // startPointMs and stopPointMs, unless zero, specify what part of the file
-    // should be read. From startPointMs ms to stopPointMs ms.
-    int32_t InitCompressedReading(InStream& stream,
-                                  const uint32_t startPointMs = 0,
-                                  const uint32_t stopPointMs = 0);
-
-    // Put 10-60ms of audio data from stream into the audioBuffer depending on
-    // codec frame size. dataLengthInBytes indicates the size of audioBuffer.
-    // The return value is the number of bytes written to audioBuffer.
-    int32_t ReadCompressedData(InStream& stream,
-                               int8_t* audioBuffer,
-                               const size_t dataLengthInBytes);
-
-    // Prepare for recording audio to stream.
-    // codecInst specifies the encoding of the audio data.
-    int32_t InitCompressedWriting(OutStream& stream,
-                                  const CodecInst& codecInst);
-
-    // Write one audio frame, i.e. the bufferLength first bytes of audioBuffer,
-    // to file. The audio frame size is determined by the codecInst.pacsize
-    // parameter of the last sucessfull InitCompressedWriting(..) call.
-    // The return value is the number of bytes written to stream.
-    // Note: bufferLength must be exactly one frame.
-    int32_t WriteCompressedData(OutStream& stream,
-                                const int8_t* audioBuffer,
-                                const size_t bufferLength);
-
-    // Prepare for playing audio from stream.
-    // codecInst specifies the encoding of the audio data.
-    int32_t InitPreEncodedReading(InStream& stream,
-                                  const CodecInst& codecInst);
-
-    // Put 10-60ms of audio data from stream into the audioBuffer depending on
-    // codec frame size. dataLengthInBytes indicates the size of audioBuffer.
-    // The return value is the number of bytes written to audioBuffer.
-    int32_t ReadPreEncodedData(InStream& stream,
-                               int8_t* audioBuffer,
-                               const size_t dataLengthInBytes);
-
-    // Prepare for recording audio to stream.
-    // codecInst specifies the encoding of the audio data.
-    int32_t InitPreEncodedWriting(OutStream& stream,
-                                  const CodecInst& codecInst);
-
-    // Write one audio frame, i.e. the bufferLength first bytes of audioBuffer,
-    // to stream. The audio frame size is determined by the codecInst.pacsize
-    // parameter of the last sucessfull InitPreEncodedWriting(..) call.
-   // The return value is the number of bytes written to stream.
-    // Note: bufferLength must be exactly one frame.
-    int32_t WritePreEncodedData(OutStream& stream,
-                                const int8_t* inData,
-                                const size_t dataLengthInBytes);
-
-    // Set durationMs to the size of the file (in ms) specified by fileName.
-    // freqInHz specifies the sampling frequency of the file.
-    int32_t FileDurationMs(const char* fileName,
-                           const FileFormats fileFormat,
-                           const uint32_t freqInHz = 16000);
-
-    // Return the number of ms that have been played so far.
-    uint32_t PlayoutPositionMs();
-
-    // Update codecInst according to the current audio codec being used for
-    // reading or writing.
-    int32_t codec_info(CodecInst& codecInst);
-
-private:
-    // Biggest WAV frame supported is 10 ms at 48kHz of 2 channel, 16 bit audio.
-    static const size_t WAV_MAX_BUFFER_SIZE = 480 * 2 * 2;
-
-
-    int32_t InitWavCodec(uint32_t samplesPerSec,
-                         size_t channels,
-                         uint32_t bitsPerSample,
-                         uint32_t formatTag);
-
-    // Parse the WAV header in stream.
-    int32_t ReadWavHeader(InStream& stream);
-
-    // Update the WAV header. freqInHz, bytesPerSample, channels, format,
-    // lengthInBytes specify characterists of the audio data.
-    // freqInHz is the sampling frequency. bytesPerSample is the sample size in
-    // bytes. channels is the number of channels, e.g. 1 is mono and 2 is
-    // stereo. format is the encode format (e.g. PCMU, PCMA, PCM etc).
-    // lengthInBytes is the number of bytes the audio samples are using up.
-    int32_t WriteWavHeader(OutStream& stream,
-                           uint32_t freqInHz,
-                           size_t bytesPerSample,
-                           size_t channels,
-                           uint32_t format,
-                           size_t lengthInBytes);
-
-    // Put dataLengthInBytes of audio data from stream into the audioBuffer.
-    // The return value is the number of bytes written to audioBuffer.
-    int32_t ReadWavData(InStream& stream, uint8_t* audioBuffer,
-                        size_t dataLengthInBytes);
-
-    // Update the current audio codec being used for reading or writing
-    // according to codecInst.
-    int32_t set_codec_info(const CodecInst& codecInst);
-
-    struct WAVE_FMTINFO_header
-    {
-        int16_t formatTag;
-        int16_t nChannels;
-        int32_t nSamplesPerSec;
-        int32_t nAvgBytesPerSec;
-        int16_t nBlockAlign;
-        int16_t nBitsPerSample;
-    };
-    // Identifiers for preencoded files.
-    enum MediaFileUtility_CodecType
-    {
-        kCodecNoCodec  = 0,
-        kCodecIsac,
-        kCodecIsacSwb,
-        kCodecIsacLc,
-        kCodecL16_8Khz,
-        kCodecL16_16kHz,
-        kCodecL16_32Khz,
-        kCodecL16_48Khz,
-        kCodecPcmu,
-        kCodecPcma,
-        kCodecIlbc20Ms,
-        kCodecIlbc30Ms,
-        kCodecG722,
-        kCodecG722_1_32Kbps,
-        kCodecG722_1_24Kbps,
-        kCodecG722_1_16Kbps,
-        kCodecG722_1c_48,
-        kCodecG722_1c_32,
-        kCodecG722_1c_24,
-        kCodecAmr,
-        kCodecAmrWb,
-        kCodecG729,
-        kCodecG729_1,
-        kCodecG726_40,
-        kCodecG726_32,
-        kCodecG726_24,
-        kCodecG726_16
-    };
-
-    // TODO (hellner): why store multiple formats. Just store either codec_info_
-    //                 or _wavFormatObj and supply conversion functions.
-    WAVE_FMTINFO_header _wavFormatObj;
-    size_t _dataSize;      // Chunk size if reading a WAV file
-    // Number of bytes to read. I.e. frame size in bytes. May be multiple
-    // chunks if reading WAV.
-    size_t _readSizeBytes;
-
-    uint32_t _stopPointInMs;
-    uint32_t _startPointInMs;
-    uint32_t _playoutPositionMs;
-    size_t _bytesWritten;
-
-    CodecInst codec_info_;
-    MediaFileUtility_CodecType _codecId;
-
-    // The amount of bytes, on average, used for one audio sample.
-    size_t _bytesPerSample;
-    size_t _readPos;
-
-    // Only reading or writing can be enabled, not both.
-    bool _reading;
-    bool _writing;
-
-    // Scratch buffer used for turning stereo audio to mono.
-    uint8_t _tempData[WAV_MAX_BUFFER_SIZE];
-};
-}  // namespace webrtc
-#endif // WEBRTC_MODULES_MEDIA_FILE_MEDIA_FILE_UTILITY_H_
diff --git a/modules/module_common_types_unittest.cc b/modules/module_common_types_unittest.cc
deleted file mode 100644
index f91668b..0000000
--- a/modules/module_common_types_unittest.cc
+++ /dev/null
@@ -1,325 +0,0 @@
-/*
- *  Copyright (c) 2013 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/include/module_common_types.h"
-
-#include <string.h>  // memcmp
-
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-namespace {
-
-bool AllSamplesAre(int16_t sample, const AudioFrame& frame) {
-  const int16_t* frame_data = frame.data();
-  for (size_t i = 0; i < AudioFrame::kMaxDataSizeSamples; i++) {
-    if (frame_data[i] != sample) {
-      return false;
-    }
-  }
-  return true;
-}
-
-constexpr int kId = 16;
-constexpr uint32_t kTimestamp = 27;
-constexpr int kSampleRateHz = 16000;
-constexpr size_t kNumChannels = 1;
-constexpr size_t kSamplesPerChannel = kSampleRateHz / 100;
-
-}  // namespace
-
-TEST(AudioFrameTest, FrameStartsMuted) {
-  AudioFrame frame;
-  EXPECT_TRUE(frame.muted());
-  EXPECT_TRUE(AllSamplesAre(0, frame));
-}
-
-TEST(AudioFrameTest, UnmutedFrameIsInitiallyZeroed) {
-  AudioFrame frame;
-  frame.mutable_data();
-  EXPECT_FALSE(frame.muted());
-  EXPECT_TRUE(AllSamplesAre(0, frame));
-}
-
-TEST(AudioFrameTest, MutedFrameBufferIsZeroed) {
-  AudioFrame frame;
-  int16_t* frame_data = frame.mutable_data();
-  for (size_t i = 0; i < AudioFrame::kMaxDataSizeSamples; i++) {
-    frame_data[i] = 17;
-  }
-  ASSERT_TRUE(AllSamplesAre(17, frame));
-  frame.Mute();
-  EXPECT_TRUE(frame.muted());
-  EXPECT_TRUE(AllSamplesAre(0, frame));
-}
-
-TEST(AudioFrameTest, UpdateFrame) {
-  AudioFrame frame;
-  int16_t samples[kNumChannels * kSamplesPerChannel] = {17};
-  frame.UpdateFrame(kId, kTimestamp, samples, kSamplesPerChannel, kSampleRateHz,
-                    AudioFrame::kPLC, AudioFrame::kVadActive, kNumChannels);
-
-  EXPECT_EQ(kId, frame.id_);
-  EXPECT_EQ(kTimestamp, frame.timestamp_);
-  EXPECT_EQ(kSamplesPerChannel, frame.samples_per_channel_);
-  EXPECT_EQ(kSampleRateHz, frame.sample_rate_hz_);
-  EXPECT_EQ(AudioFrame::kPLC, frame.speech_type_);
-  EXPECT_EQ(AudioFrame::kVadActive, frame.vad_activity_);
-  EXPECT_EQ(kNumChannels, frame.num_channels_);
-
-  EXPECT_FALSE(frame.muted());
-  EXPECT_EQ(0, memcmp(samples, frame.data(), sizeof(samples)));
-
-  frame.UpdateFrame(kId, kTimestamp, nullptr /* data*/, kSamplesPerChannel,
-                    kSampleRateHz, AudioFrame::kPLC, AudioFrame::kVadActive,
-                    kNumChannels);
-  EXPECT_TRUE(frame.muted());
-  EXPECT_TRUE(AllSamplesAre(0, frame));
-}
-
-TEST(AudioFrameTest, CopyFrom) {
-  AudioFrame frame1;
-  AudioFrame frame2;
-
-  int16_t samples[kNumChannels * kSamplesPerChannel] = {17};
-  frame2.UpdateFrame(kId, kTimestamp, samples, kSamplesPerChannel,
-                     kSampleRateHz, AudioFrame::kPLC, AudioFrame::kVadActive,
-                     kNumChannels);
-  frame1.CopyFrom(frame2);
-
-  EXPECT_EQ(frame2.id_, frame1.id_);
-  EXPECT_EQ(frame2.timestamp_, frame1.timestamp_);
-  EXPECT_EQ(frame2.samples_per_channel_, frame1.samples_per_channel_);
-  EXPECT_EQ(frame2.sample_rate_hz_, frame1.sample_rate_hz_);
-  EXPECT_EQ(frame2.speech_type_, frame1.speech_type_);
-  EXPECT_EQ(frame2.vad_activity_, frame1.vad_activity_);
-  EXPECT_EQ(frame2.num_channels_, frame1.num_channels_);
-
-  EXPECT_EQ(frame2.muted(), frame1.muted());
-  EXPECT_EQ(0, memcmp(frame2.data(), frame1.data(), sizeof(samples)));
-
-  frame2.UpdateFrame(kId, kTimestamp, nullptr /* data */, kSamplesPerChannel,
-                     kSampleRateHz, AudioFrame::kPLC, AudioFrame::kVadActive,
-                     kNumChannels);
-  frame1.CopyFrom(frame2);
-
-  EXPECT_EQ(frame2.muted(), frame1.muted());
-  EXPECT_EQ(0, memcmp(frame2.data(), frame1.data(), sizeof(samples)));
-}
-
-TEST(IsNewerSequenceNumber, Equal) {
-  EXPECT_FALSE(IsNewerSequenceNumber(0x0001, 0x0001));
-}
-
-TEST(IsNewerSequenceNumber, NoWrap) {
-  EXPECT_TRUE(IsNewerSequenceNumber(0xFFFF, 0xFFFE));
-  EXPECT_TRUE(IsNewerSequenceNumber(0x0001, 0x0000));
-  EXPECT_TRUE(IsNewerSequenceNumber(0x0100, 0x00FF));
-}
-
-TEST(IsNewerSequenceNumber, ForwardWrap) {
-  EXPECT_TRUE(IsNewerSequenceNumber(0x0000, 0xFFFF));
-  EXPECT_TRUE(IsNewerSequenceNumber(0x0000, 0xFF00));
-  EXPECT_TRUE(IsNewerSequenceNumber(0x00FF, 0xFFFF));
-  EXPECT_TRUE(IsNewerSequenceNumber(0x00FF, 0xFF00));
-}
-
-TEST(IsNewerSequenceNumber, BackwardWrap) {
-  EXPECT_FALSE(IsNewerSequenceNumber(0xFFFF, 0x0000));
-  EXPECT_FALSE(IsNewerSequenceNumber(0xFF00, 0x0000));
-  EXPECT_FALSE(IsNewerSequenceNumber(0xFFFF, 0x00FF));
-  EXPECT_FALSE(IsNewerSequenceNumber(0xFF00, 0x00FF));
-}
-
-TEST(IsNewerSequenceNumber, HalfWayApart) {
-  EXPECT_TRUE(IsNewerSequenceNumber(0x8000, 0x0000));
-  EXPECT_FALSE(IsNewerSequenceNumber(0x0000, 0x8000));
-}
-
-TEST(IsNewerTimestamp, Equal) {
-  EXPECT_FALSE(IsNewerTimestamp(0x00000001, 0x000000001));
-}
-
-TEST(IsNewerTimestamp, NoWrap) {
-  EXPECT_TRUE(IsNewerTimestamp(0xFFFFFFFF, 0xFFFFFFFE));
-  EXPECT_TRUE(IsNewerTimestamp(0x00000001, 0x00000000));
-  EXPECT_TRUE(IsNewerTimestamp(0x00010000, 0x0000FFFF));
-}
-
-TEST(IsNewerTimestamp, ForwardWrap) {
-  EXPECT_TRUE(IsNewerTimestamp(0x00000000, 0xFFFFFFFF));
-  EXPECT_TRUE(IsNewerTimestamp(0x00000000, 0xFFFF0000));
-  EXPECT_TRUE(IsNewerTimestamp(0x0000FFFF, 0xFFFFFFFF));
-  EXPECT_TRUE(IsNewerTimestamp(0x0000FFFF, 0xFFFF0000));
-}
-
-TEST(IsNewerTimestamp, BackwardWrap) {
-  EXPECT_FALSE(IsNewerTimestamp(0xFFFFFFFF, 0x00000000));
-  EXPECT_FALSE(IsNewerTimestamp(0xFFFF0000, 0x00000000));
-  EXPECT_FALSE(IsNewerTimestamp(0xFFFFFFFF, 0x0000FFFF));
-  EXPECT_FALSE(IsNewerTimestamp(0xFFFF0000, 0x0000FFFF));
-}
-
-TEST(IsNewerTimestamp, HalfWayApart) {
-  EXPECT_TRUE(IsNewerTimestamp(0x80000000, 0x00000000));
-  EXPECT_FALSE(IsNewerTimestamp(0x00000000, 0x80000000));
-}
-
-TEST(LatestSequenceNumber, NoWrap) {
-  EXPECT_EQ(0xFFFFu, LatestSequenceNumber(0xFFFF, 0xFFFE));
-  EXPECT_EQ(0x0001u, LatestSequenceNumber(0x0001, 0x0000));
-  EXPECT_EQ(0x0100u, LatestSequenceNumber(0x0100, 0x00FF));
-
-  EXPECT_EQ(0xFFFFu, LatestSequenceNumber(0xFFFE, 0xFFFF));
-  EXPECT_EQ(0x0001u, LatestSequenceNumber(0x0000, 0x0001));
-  EXPECT_EQ(0x0100u, LatestSequenceNumber(0x00FF, 0x0100));
-}
-
-TEST(LatestSequenceNumber, Wrap) {
-  EXPECT_EQ(0x0000u, LatestSequenceNumber(0x0000, 0xFFFF));
-  EXPECT_EQ(0x0000u, LatestSequenceNumber(0x0000, 0xFF00));
-  EXPECT_EQ(0x00FFu, LatestSequenceNumber(0x00FF, 0xFFFF));
-  EXPECT_EQ(0x00FFu, LatestSequenceNumber(0x00FF, 0xFF00));
-
-  EXPECT_EQ(0x0000u, LatestSequenceNumber(0xFFFF, 0x0000));
-  EXPECT_EQ(0x0000u, LatestSequenceNumber(0xFF00, 0x0000));
-  EXPECT_EQ(0x00FFu, LatestSequenceNumber(0xFFFF, 0x00FF));
-  EXPECT_EQ(0x00FFu, LatestSequenceNumber(0xFF00, 0x00FF));
-}
-
-TEST(LatestTimestamp, NoWrap) {
-  EXPECT_EQ(0xFFFFFFFFu, LatestTimestamp(0xFFFFFFFF, 0xFFFFFFFE));
-  EXPECT_EQ(0x00000001u, LatestTimestamp(0x00000001, 0x00000000));
-  EXPECT_EQ(0x00010000u, LatestTimestamp(0x00010000, 0x0000FFFF));
-}
-
-TEST(LatestTimestamp, Wrap) {
-  EXPECT_EQ(0x00000000u, LatestTimestamp(0x00000000, 0xFFFFFFFF));
-  EXPECT_EQ(0x00000000u, LatestTimestamp(0x00000000, 0xFFFF0000));
-  EXPECT_EQ(0x0000FFFFu, LatestTimestamp(0x0000FFFF, 0xFFFFFFFF));
-  EXPECT_EQ(0x0000FFFFu, LatestTimestamp(0x0000FFFF, 0xFFFF0000));
-
-  EXPECT_EQ(0x00000000u, LatestTimestamp(0xFFFFFFFF, 0x00000000));
-  EXPECT_EQ(0x00000000u, LatestTimestamp(0xFFFF0000, 0x00000000));
-  EXPECT_EQ(0x0000FFFFu, LatestTimestamp(0xFFFFFFFF, 0x0000FFFF));
-  EXPECT_EQ(0x0000FFFFu, LatestTimestamp(0xFFFF0000, 0x0000FFFF));
-}
-
-
-TEST(SequenceNumberUnwrapper, Limits) {
-  SequenceNumberUnwrapper unwrapper;
-
-  EXPECT_EQ(0, unwrapper.Unwrap(0));
-  EXPECT_EQ(0x8000, unwrapper.Unwrap(0x8000));
-  // Delta is exactly 0x8000 but current is lower than input, wrap backwards.
-  EXPECT_EQ(0, unwrapper.Unwrap(0));
-
-  EXPECT_EQ(0x8000, unwrapper.Unwrap(0x8000));
-  EXPECT_EQ(0xFFFF, unwrapper.Unwrap(0xFFFF));
-  EXPECT_EQ(0x10000, unwrapper.Unwrap(0));
-  EXPECT_EQ(0xFFFF, unwrapper.Unwrap(0xFFFF));
-  EXPECT_EQ(0x8000, unwrapper.Unwrap(0x8000));
-  EXPECT_EQ(0, unwrapper.Unwrap(0));
-
-  // Don't allow negative values.
-  EXPECT_EQ(0xFFFF, unwrapper.Unwrap(0xFFFF));
-}
-
-TEST(SequenceNumberUnwrapper, ForwardWraps) {
-  int64_t seq = 0;
-  SequenceNumberUnwrapper unwrapper;
-
-  const int kMaxIncrease = 0x8000 - 1;
-  const int kNumWraps = 4;
-  for (int i = 0; i < kNumWraps * 2; ++i) {
-    int64_t unwrapped = unwrapper.Unwrap(static_cast<uint16_t>(seq & 0xFFFF));
-    EXPECT_EQ(seq, unwrapped);
-    seq += kMaxIncrease;
-  }
-
-  unwrapper.UpdateLast(0);
-  for (int seq = 0; seq < kNumWraps * 0xFFFF; ++seq) {
-    int64_t unwrapped = unwrapper.Unwrap(static_cast<uint16_t>(seq & 0xFFFF));
-    EXPECT_EQ(seq, unwrapped);
-  }
-}
-
-TEST(SequenceNumberUnwrapper, BackwardWraps) {
-  SequenceNumberUnwrapper unwrapper;
-
-  const int kMaxDecrease = 0x8000 - 1;
-  const int kNumWraps = 4;
-  int64_t seq = kNumWraps * 2 * kMaxDecrease;
-  unwrapper.UpdateLast(seq);
-  for (int i = kNumWraps * 2; i >= 0; --i) {
-    int64_t unwrapped = unwrapper.Unwrap(static_cast<uint16_t>(seq & 0xFFFF));
-    EXPECT_EQ(seq, unwrapped);
-    seq -= kMaxDecrease;
-  }
-
-  seq = kNumWraps * 0xFFFF;
-  unwrapper.UpdateLast(seq);
-  for (; seq >= 0; --seq) {
-    int64_t unwrapped = unwrapper.Unwrap(static_cast<uint16_t>(seq & 0xFFFF));
-    EXPECT_EQ(seq, unwrapped);
-  }
-}
-
-TEST(TimestampUnwrapper, Limits) {
-  TimestampUnwrapper unwrapper;
-
-  EXPECT_EQ(0, unwrapper.Unwrap(0));
-  EXPECT_EQ(0x80000000, unwrapper.Unwrap(0x80000000));
-  // Delta is exactly 0x80000000 but current is lower than input, wrap
-  // backwards.
-  EXPECT_EQ(0, unwrapper.Unwrap(0));
-
-  EXPECT_EQ(0x80000000, unwrapper.Unwrap(0x80000000));
-  EXPECT_EQ(0xFFFFFFFF, unwrapper.Unwrap(0xFFFFFFFF));
-  EXPECT_EQ(0x100000000, unwrapper.Unwrap(0x00000000));
-  EXPECT_EQ(0xFFFFFFFF, unwrapper.Unwrap(0xFFFFFFFF));
-  EXPECT_EQ(0x80000000, unwrapper.Unwrap(0x80000000));
-  EXPECT_EQ(0, unwrapper.Unwrap(0));
-
-  // Don't allow negative values.
-  EXPECT_EQ(0xFFFFFFFF, unwrapper.Unwrap(0xFFFFFFFF));
-}
-
-TEST(TimestampUnwrapper, ForwardWraps) {
-  int64_t ts = 0;
-  TimestampUnwrapper unwrapper;
-
-  const int64_t kMaxIncrease = 0x80000000 - 1;
-  const int kNumWraps = 4;
-  for (int i = 0; i < kNumWraps * 2; ++i) {
-    int64_t unwrapped =
-        unwrapper.Unwrap(static_cast<uint32_t>(ts & 0xFFFFFFFF));
-    EXPECT_EQ(ts, unwrapped);
-    ts += kMaxIncrease;
-  }
-}
-
-TEST(TimestampUnwrapper, BackwardWraps) {
-  TimestampUnwrapper unwrapper;
-
-  const int64_t kMaxDecrease = 0x80000000 - 1;
-  const int kNumWraps = 4;
-  int64_t ts = kNumWraps * 2 * kMaxDecrease;
-  unwrapper.UpdateLast(ts);
-  for (int i = 0; i <= kNumWraps * 2; ++i) {
-    int64_t unwrapped =
-        unwrapper.Unwrap(static_cast<uint32_t>(ts & 0xFFFFFFFF));
-    EXPECT_EQ(ts, unwrapped);
-    ts -= kMaxDecrease;
-  }
-}
-
-}  // namespace webrtc
diff --git a/modules/pacing/BUILD.gn b/modules/pacing/BUILD.gn
deleted file mode 100644
index 4882d4f..0000000
--- a/modules/pacing/BUILD.gn
+++ /dev/null
@@ -1,91 +0,0 @@
-# Copyright (c) 2014 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.
-
-import("../../webrtc.gni")
-
-rtc_static_library("pacing") {
-  sources = [
-    "alr_detector.cc",
-    "alr_detector.h",
-    "bitrate_prober.cc",
-    "bitrate_prober.h",
-    "interval_budget.cc",
-    "interval_budget.h",
-    "paced_sender.cc",
-    "paced_sender.h",
-    "pacer.h",
-    "packet_router.cc",
-    "packet_router.h",
-  ]
-
-  if (!build_with_chromium && is_clang) {
-    # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-    suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-  }
-
-  deps = [
-    "..:module_api",
-    "../../:webrtc_common",
-    "../../api:optional",
-    "../../logging:rtc_event_log_api",
-    "../../rtc_base:rtc_base_approved",
-    "../../system_wrappers",
-    "../remote_bitrate_estimator",
-    "../rtp_rtcp",
-    "../utility",
-  ]
-}
-
-if (rtc_include_tests) {
-  rtc_source_set("pacing_unittests") {
-    testonly = true
-
-    # Skip restricting visibility on mobile platforms since the tests on those
-    # gets additional generated targets which would require many lines here to
-    # cover (which would be confusing to read and hard to maintain).
-    if (!is_android && !is_ios) {
-      visibility = [ "..:modules_unittests" ]
-    }
-    sources = [
-      "alr_detector_unittest.cc",
-      "bitrate_prober_unittest.cc",
-      "interval_budget_unittest.cc",
-      "paced_sender_unittest.cc",
-      "packet_router_unittest.cc",
-    ]
-    deps = [
-      ":pacing",
-      "../../rtc_base:rtc_base_approved",
-      "../../rtc_base:rtc_base_tests_utils",
-      "../../system_wrappers:system_wrappers",
-      "../../test:test_support",
-      "../rtp_rtcp",
-      "../rtp_rtcp:mock_rtp_rtcp",
-      "//testing/gmock",
-    ]
-
-    # TODO(jschuh): bugs.webrtc.org/1348: fix this warning.
-    configs += [ "//build/config/compiler:no_size_t_to_int_warning" ]
-    if (!build_with_chromium && is_clang) {
-      # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-    }
-  }
-
-  rtc_source_set("mock_paced_sender") {
-    testonly = true
-    sources = [
-      "mock/mock_paced_sender.h",
-    ]
-    deps = [
-      ":pacing",
-      "../../system_wrappers",
-      "../../test:test_support",
-    ]
-  }
-}
diff --git a/modules/pacing/DEPS b/modules/pacing/DEPS
deleted file mode 100644
index ab0885b..0000000
--- a/modules/pacing/DEPS
+++ /dev/null
@@ -1,4 +0,0 @@
-include_rules = [
-  "+webrtc/system_wrappers",
-  "+webrtc/logging/rtc_event_log"
-]
diff --git a/modules/pacing/OWNERS b/modules/pacing/OWNERS
deleted file mode 100644
index 1528d76..0000000
--- a/modules/pacing/OWNERS
+++ /dev/null
@@ -1,9 +0,0 @@
-stefan@webrtc.org
-mflodman@webrtc.org
-asapersson@webrtc.org
-philipel@webrtc.org
-
-# These are for the common case of adding or renaming files. If you're doing
-# structural changes, please get a review from a reviewer in this file.
-per-file *.gn=*
-per-file *.gni=*
diff --git a/modules/pacing/alr_detector.cc b/modules/pacing/alr_detector.cc
deleted file mode 100644
index 6873210..0000000
--- a/modules/pacing/alr_detector.cc
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- *  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/pacing/alr_detector.h"
-
-#include <string>
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/format_macros.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/timeutils.h"
-#include "webrtc/system_wrappers/include/field_trial.h"
-
-namespace webrtc {
-
-const char AlrDetector::kScreenshareProbingBweExperimentName[] =
-    "WebRTC-ProbingScreenshareBwe";
-const char AlrDetector::kStrictPacingAndProbingExperimentName[] =
-    "WebRTC-StrictPacingAndProbing";
-
-AlrDetector::AlrDetector()
-    : bandwidth_usage_percent_(kDefaultAlrBandwidthUsagePercent),
-      alr_start_budget_level_percent_(kDefaultAlrStartBudgetLevelPercent),
-      alr_stop_budget_level_percent_(kDefaultAlrStopBudgetLevelPercent),
-      alr_budget_(0, true) {
-  RTC_CHECK(
-      field_trial::FindFullName(kStrictPacingAndProbingExperimentName)
-          .empty() ||
-      field_trial::FindFullName(kScreenshareProbingBweExperimentName).empty());
-  rtc::Optional<AlrExperimentSettings> experiment_settings =
-      ParseAlrSettingsFromFieldTrial(kScreenshareProbingBweExperimentName);
-  if (!experiment_settings) {
-    experiment_settings =
-        ParseAlrSettingsFromFieldTrial(kStrictPacingAndProbingExperimentName);
-  }
-  if (experiment_settings) {
-    alr_stop_budget_level_percent_ =
-        experiment_settings->alr_stop_budget_level_percent;
-    alr_start_budget_level_percent_ =
-        experiment_settings->alr_start_budget_level_percent;
-    bandwidth_usage_percent_ = experiment_settings->alr_bandwidth_usage_percent;
-  }
-}
-
-AlrDetector::~AlrDetector() {}
-
-void AlrDetector::OnBytesSent(size_t bytes_sent, int64_t delta_time_ms) {
-  alr_budget_.UseBudget(bytes_sent);
-  alr_budget_.IncreaseBudget(delta_time_ms);
-
-  if (alr_budget_.budget_level_percent() > alr_start_budget_level_percent_ &&
-      !alr_started_time_ms_) {
-    alr_started_time_ms_.emplace(rtc::TimeMillis());
-  } else if (alr_budget_.budget_level_percent() <
-                 alr_stop_budget_level_percent_ &&
-             alr_started_time_ms_) {
-    alr_started_time_ms_.reset();
-  }
-}
-
-void AlrDetector::SetEstimatedBitrate(int bitrate_bps) {
-  RTC_DCHECK(bitrate_bps);
-  const auto target_rate_kbps = int64_t{bitrate_bps} *
-                                bandwidth_usage_percent_ / (1000 * 100);
-  alr_budget_.set_target_rate_kbps(rtc::dchecked_cast<int>(target_rate_kbps));
-}
-
-rtc::Optional<int64_t> AlrDetector::GetApplicationLimitedRegionStartTime()
-    const {
-  return alr_started_time_ms_;
-}
-
-rtc::Optional<AlrDetector::AlrExperimentSettings>
-AlrDetector::ParseAlrSettingsFromFieldTrial(const char* experiment_name) {
-  rtc::Optional<AlrExperimentSettings> ret;
-  std::string group_name = field_trial::FindFullName(experiment_name);
-
-  const std::string kIgnoredSuffix = "_Dogfood";
-  if (group_name.rfind(kIgnoredSuffix) ==
-      group_name.length() - kIgnoredSuffix.length()) {
-    group_name.resize(group_name.length() - kIgnoredSuffix.length());
-  }
-
-  if (group_name.empty())
-    return ret;
-
-  AlrExperimentSettings settings;
-  if (sscanf(group_name.c_str(), "%f,%" PRId64 ",%d,%d,%d,%d",
-             &settings.pacing_factor, &settings.max_paced_queue_time,
-             &settings.alr_bandwidth_usage_percent,
-             &settings.alr_start_budget_level_percent,
-             &settings.alr_stop_budget_level_percent,
-             &settings.group_id) == 6) {
-    ret.emplace(settings);
-    LOG(LS_INFO) << "Using ALR experiment settings: "
-                    "pacing factor: "
-                 << settings.pacing_factor << ", max pacer queue length: "
-                 << settings.max_paced_queue_time
-                 << ", ALR start bandwidth usage percent: "
-                 << settings.alr_bandwidth_usage_percent
-                 << ", ALR end budget level percent: "
-                 << settings.alr_start_budget_level_percent
-                 << ", ALR end budget level percent: "
-                 << settings.alr_stop_budget_level_percent
-                 << ", ALR experiment group ID: " << settings.group_id;
-  } else {
-    LOG(LS_INFO) << "Failed to parse ALR experiment: " << experiment_name;
-  }
-
-  return ret;
-}
-
-}  // namespace webrtc
diff --git a/modules/pacing/alr_detector.h b/modules/pacing/alr_detector.h
deleted file mode 100644
index 0d43fbb..0000000
--- a/modules/pacing/alr_detector.h
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- *  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_PACING_ALR_DETECTOR_H_
-#define WEBRTC_MODULES_PACING_ALR_DETECTOR_H_
-
-#include "webrtc/api/optional.h"
-#include "webrtc/common_types.h"
-#include "webrtc/modules/pacing/interval_budget.h"
-#include "webrtc/modules/pacing/paced_sender.h"
-#include "webrtc/rtc_base/rate_statistics.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-// Application limited region detector is a class that utilizes signals of
-// elapsed time and bytes sent to estimate whether network traffic is
-// currently limited by the application's ability to generate traffic.
-//
-// AlrDetector provides a signal that can be utilized to adjust
-// estimate bandwidth.
-// Note: This class is not thread-safe.
-class AlrDetector {
- public:
-  AlrDetector();
-  ~AlrDetector();
-
-  void OnBytesSent(size_t bytes_sent, int64_t delta_time_ms);
-
-  // Set current estimated bandwidth.
-  void SetEstimatedBitrate(int bitrate_bps);
-
-  // Returns time in milliseconds when the current application-limited region
-  // started or empty result if the sender is currently not application-limited.
-  rtc::Optional<int64_t> GetApplicationLimitedRegionStartTime() const;
-
-  struct AlrExperimentSettings {
-    float pacing_factor = PacedSender::kDefaultPaceMultiplier;
-    int64_t max_paced_queue_time = PacedSender::kMaxQueueLengthMs;
-    int alr_bandwidth_usage_percent = kDefaultAlrBandwidthUsagePercent;
-    int alr_start_budget_level_percent = kDefaultAlrStartBudgetLevelPercent;
-    int alr_stop_budget_level_percent = kDefaultAlrStopBudgetLevelPercent;
-    // Will be sent to the receive side for stats slicing.
-    // Can be 0..6, because it's sent as a 3 bits value and there's also
-    // reserved value to indicate absence of experiment.
-    int group_id = 0;
-  };
-  static rtc::Optional<AlrExperimentSettings> ParseAlrSettingsFromFieldTrial(
-      const char* experiment_name);
-
-  // Sent traffic percentage as a function of network capacity used to determine
-  // application-limited region. ALR region start when bandwidth usage drops
-  // below kAlrStartUsagePercent and ends when it raises above
-  // kAlrEndUsagePercent. NOTE: This is intentionally conservative at the moment
-  // until BW adjustments of application limited region is fine tuned.
-  static constexpr int kDefaultAlrBandwidthUsagePercent = 65;
-  static constexpr int kDefaultAlrStartBudgetLevelPercent = 80;
-  static constexpr int kDefaultAlrStopBudgetLevelPercent = 50;
-  static const char kScreenshareProbingBweExperimentName[];
-  static const char kStrictPacingAndProbingExperimentName[];
-
-  void UpdateBudgetWithElapsedTime(int64_t delta_time_ms);
-  void UpdateBudgetWithBytesSent(size_t bytes_sent);
-
- private:
-  int bandwidth_usage_percent_;
-  int alr_start_budget_level_percent_;
-  int alr_stop_budget_level_percent_;
-
-  IntervalBudget alr_budget_;
-  rtc::Optional<int64_t> alr_started_time_ms_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_PACING_ALR_DETECTOR_H_
diff --git a/modules/pacing/alr_detector_unittest.cc b/modules/pacing/alr_detector_unittest.cc
deleted file mode 100644
index 9f1998b..0000000
--- a/modules/pacing/alr_detector_unittest.cc
+++ /dev/null
@@ -1,145 +0,0 @@
-/*
- *  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/pacing/alr_detector.h"
-
-#include "webrtc/test/gtest.h"
-
-namespace {
-
-constexpr int kEstimatedBitrateBps = 300000;
-
-}  // namespace
-
-namespace webrtc {
-
-namespace {
-class SimulateOutgoingTrafficIn {
- public:
-  explicit SimulateOutgoingTrafficIn(AlrDetector* alr_detector)
-      : alr_detector_(alr_detector) {
-    RTC_CHECK(alr_detector_);
-  }
-
-  SimulateOutgoingTrafficIn& ForTimeMs(int time_ms) {
-    interval_ms_ = rtc::Optional<int>(time_ms);
-    interval_ms_.emplace(time_ms);
-    ProduceTraffic();
-    return *this;
-  }
-
-  SimulateOutgoingTrafficIn& AtPercentOfEstimatedBitrate(int usage_percentage) {
-    usage_percentage_.emplace(usage_percentage);
-    ProduceTraffic();
-    return *this;
-  }
-
- private:
-  void ProduceTraffic() {
-    if (!interval_ms_ || !usage_percentage_)
-      return;
-    const int kTimeStepMs = 10;
-    for (int t = 0; t < *interval_ms_; t += kTimeStepMs) {
-      alr_detector_->OnBytesSent(kEstimatedBitrateBps * *usage_percentage_ *
-                                     kTimeStepMs / (8 * 100 * 1000),
-                                 kTimeStepMs);
-    }
-    int remainder_ms = *interval_ms_ % kTimeStepMs;
-    if (remainder_ms > 0) {
-      alr_detector_->OnBytesSent(kEstimatedBitrateBps * *usage_percentage_ *
-                                     remainder_ms / (8 * 100 * 1000),
-                                 kTimeStepMs);
-    }
-  }
-  AlrDetector* const alr_detector_;
-  rtc::Optional<int> interval_ms_;
-  rtc::Optional<int> usage_percentage_;
-};
-}  // namespace
-
-class AlrDetectorTest : public testing::Test {
- public:
-  void SetUp() override {
-    alr_detector_.SetEstimatedBitrate(kEstimatedBitrateBps);
-  }
-
- protected:
-  AlrDetector alr_detector_;
-};
-
-TEST_F(AlrDetectorTest, AlrDetection) {
-  // Start in non-ALR state.
-  EXPECT_FALSE(alr_detector_.GetApplicationLimitedRegionStartTime());
-
-  // Stay in non-ALR state when usage is close to 100%.
-  SimulateOutgoingTrafficIn(&alr_detector_)
-      .ForTimeMs(1000)
-      .AtPercentOfEstimatedBitrate(90);
-  EXPECT_FALSE(alr_detector_.GetApplicationLimitedRegionStartTime());
-
-  // Verify that we ALR starts when bitrate drops below 20%.
-  SimulateOutgoingTrafficIn(&alr_detector_)
-      .ForTimeMs(1500)
-      .AtPercentOfEstimatedBitrate(20);
-  EXPECT_TRUE(alr_detector_.GetApplicationLimitedRegionStartTime());
-
-  // Verify that ALR ends when usage is above 65%.
-  SimulateOutgoingTrafficIn(&alr_detector_)
-      .ForTimeMs(1000)
-      .AtPercentOfEstimatedBitrate(100);
-  EXPECT_FALSE(alr_detector_.GetApplicationLimitedRegionStartTime());
-}
-
-TEST_F(AlrDetectorTest, ShortSpike) {
-  // Start in non-ALR state.
-  EXPECT_FALSE(alr_detector_.GetApplicationLimitedRegionStartTime());
-
-  // Verify that we ALR starts when bitrate drops below 20%.
-  SimulateOutgoingTrafficIn(&alr_detector_)
-      .ForTimeMs(1000)
-      .AtPercentOfEstimatedBitrate(20);
-  EXPECT_TRUE(alr_detector_.GetApplicationLimitedRegionStartTime());
-
-  // Verify that we stay in ALR region even after a short bitrate spike.
-  SimulateOutgoingTrafficIn(&alr_detector_)
-      .ForTimeMs(100)
-      .AtPercentOfEstimatedBitrate(150);
-  EXPECT_TRUE(alr_detector_.GetApplicationLimitedRegionStartTime());
-
-  // ALR ends when usage is above 65%.
-  SimulateOutgoingTrafficIn(&alr_detector_)
-      .ForTimeMs(1000)
-      .AtPercentOfEstimatedBitrate(100);
-  EXPECT_FALSE(alr_detector_.GetApplicationLimitedRegionStartTime());
-}
-
-TEST_F(AlrDetectorTest, BandwidthEstimateChanges) {
-  // Start in non-ALR state.
-  EXPECT_FALSE(alr_detector_.GetApplicationLimitedRegionStartTime());
-
-  // ALR starts when bitrate drops below 20%.
-  SimulateOutgoingTrafficIn(&alr_detector_)
-      .ForTimeMs(1000)
-      .AtPercentOfEstimatedBitrate(20);
-  EXPECT_TRUE(alr_detector_.GetApplicationLimitedRegionStartTime());
-
-  // When bandwidth estimate drops the detector should stay in ALR mode and quit
-  // it shortly afterwards as the sender continues sending the same amount of
-  // traffic. This is necessary to ensure that ProbeController can still react
-  // to the BWE drop by initiating a new probe.
-  alr_detector_.SetEstimatedBitrate(kEstimatedBitrateBps / 5);
-  EXPECT_TRUE(alr_detector_.GetApplicationLimitedRegionStartTime());
-  SimulateOutgoingTrafficIn(&alr_detector_)
-      .ForTimeMs(1000)
-      .AtPercentOfEstimatedBitrate(50);
-  EXPECT_FALSE(alr_detector_.GetApplicationLimitedRegionStartTime());
-}
-
-}  // namespace webrtc
diff --git a/modules/pacing/bitrate_prober.cc b/modules/pacing/bitrate_prober.cc
deleted file mode 100644
index 8f676af..0000000
--- a/modules/pacing/bitrate_prober.cc
+++ /dev/null
@@ -1,203 +0,0 @@
-/*
- *  Copyright (c) 2014 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/pacing/bitrate_prober.h"
-
-#include <algorithm>
-
-#include "webrtc/logging/rtc_event_log/rtc_event_log.h"
-#include "webrtc/modules/pacing/paced_sender.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-
-namespace webrtc {
-
-namespace {
-
-// A minimum interval between probes to allow scheduling to be feasible.
-constexpr int kMinProbeDeltaMs = 1;
-
-// The minimum number probing packets used.
-constexpr int kMinProbePacketsSent = 5;
-
-// The minimum probing duration in ms.
-constexpr int kMinProbeDurationMs = 15;
-
-// Maximum amount of time each probe can be delayed. Probe cluster is reset and
-// retried from the start when this limit is reached.
-constexpr int kMaxProbeDelayMs = 3;
-
-// Number of times probing is retried before the cluster is dropped.
-constexpr int kMaxRetryAttempts = 3;
-
-// The min probe packet size is scaled with the bitrate we're probing at.
-// This defines the max min probe packet size, meaning that on high bitrates
-// we have a min probe packet size of 200 bytes.
-constexpr size_t kMinProbePacketSize = 200;
-
-constexpr int64_t kProbeClusterTimeoutMs = 5000;
-
-}  // namespace
-
-BitrateProber::BitrateProber() : BitrateProber(nullptr) {}
-
-BitrateProber::BitrateProber(RtcEventLog* event_log)
-    : probing_state_(ProbingState::kDisabled),
-      next_probe_time_ms_(-1),
-      next_cluster_id_(0),
-      event_log_(event_log) {
-  SetEnabled(true);
-}
-
-void BitrateProber::SetEnabled(bool enable) {
-  if (enable) {
-    if (probing_state_ == ProbingState::kDisabled) {
-      probing_state_ = ProbingState::kInactive;
-      LOG(LS_INFO) << "Bandwidth probing enabled, set to inactive";
-    }
-  } else {
-    probing_state_ = ProbingState::kDisabled;
-    LOG(LS_INFO) << "Bandwidth probing disabled";
-  }
-}
-
-bool BitrateProber::IsProbing() const {
-  return probing_state_ == ProbingState::kActive;
-}
-
-void BitrateProber::OnIncomingPacket(size_t packet_size) {
-  // Don't initialize probing unless we have something large enough to start
-  // probing.
-  if (probing_state_ == ProbingState::kInactive && !clusters_.empty() &&
-      packet_size >=
-          std::min<size_t>(RecommendedMinProbeSize(), kMinProbePacketSize)) {
-    // Send next probe right away.
-    next_probe_time_ms_ = -1;
-    probing_state_ = ProbingState::kActive;
-  }
-}
-
-void BitrateProber::CreateProbeCluster(int bitrate_bps, int64_t now_ms) {
-  RTC_DCHECK(probing_state_ != ProbingState::kDisabled);
-  RTC_DCHECK_GT(bitrate_bps, 0);
-  while (!clusters_.empty() &&
-         now_ms - clusters_.front().time_created_ms > kProbeClusterTimeoutMs) {
-    clusters_.pop();
-  }
-
-  ProbeCluster cluster;
-  cluster.time_created_ms = now_ms;
-  cluster.pace_info.probe_cluster_min_probes = kMinProbePacketsSent;
-  cluster.pace_info.probe_cluster_min_bytes =
-      bitrate_bps * kMinProbeDurationMs / 8000;
-  cluster.pace_info.send_bitrate_bps = bitrate_bps;
-  cluster.pace_info.probe_cluster_id = next_cluster_id_++;
-  clusters_.push(cluster);
-  if (event_log_)
-    event_log_->LogProbeClusterCreated(
-        cluster.pace_info.probe_cluster_id, cluster.pace_info.send_bitrate_bps,
-        cluster.pace_info.probe_cluster_min_probes,
-        cluster.pace_info.probe_cluster_min_bytes);
-
-  LOG(LS_INFO) << "Probe cluster (bitrate:min bytes:min packets): ("
-               << cluster.pace_info.send_bitrate_bps << ":"
-               << cluster.pace_info.probe_cluster_min_bytes << ":"
-               << cluster.pace_info.probe_cluster_min_probes << ")";
-  // If we are already probing, continue to do so. Otherwise set it to
-  // kInactive and wait for OnIncomingPacket to start the probing.
-  if (probing_state_ != ProbingState::kActive)
-    probing_state_ = ProbingState::kInactive;
-}
-
-void BitrateProber::ResetState(int64_t now_ms) {
-  RTC_DCHECK(probing_state_ == ProbingState::kActive);
-
-  // Recreate all probing clusters.
-  std::queue<ProbeCluster> clusters;
-  clusters.swap(clusters_);
-  while (!clusters.empty()) {
-    if (clusters.front().retries < kMaxRetryAttempts) {
-      CreateProbeCluster(clusters.front().pace_info.send_bitrate_bps, now_ms);
-      clusters_.back().retries = clusters.front().retries + 1;
-    }
-    clusters.pop();
-  }
-
-  probing_state_ = ProbingState::kInactive;
-}
-
-int BitrateProber::TimeUntilNextProbe(int64_t now_ms) {
-  // Probing is not active or probing is already complete.
-  if (probing_state_ != ProbingState::kActive || clusters_.empty())
-    return -1;
-
-  int time_until_probe_ms = 0;
-  if (next_probe_time_ms_ >= 0) {
-    time_until_probe_ms = next_probe_time_ms_ - now_ms;
-    if (time_until_probe_ms < -kMaxProbeDelayMs) {
-      ResetState(now_ms);
-      return -1;
-    }
-  }
-
-  return std::max(time_until_probe_ms, 0);
-}
-
-PacedPacketInfo BitrateProber::CurrentCluster() const {
-  RTC_DCHECK(!clusters_.empty());
-  RTC_DCHECK(probing_state_ == ProbingState::kActive);
-  return clusters_.front().pace_info;
-}
-
-// Probe size is recommended based on the probe bitrate required. We choose
-// a minimum of twice |kMinProbeDeltaMs| interval to allow scheduling to be
-// feasible.
-size_t BitrateProber::RecommendedMinProbeSize() const {
-  RTC_DCHECK(!clusters_.empty());
-  return clusters_.front().pace_info.send_bitrate_bps * 2 * kMinProbeDeltaMs /
-         (8 * 1000);
-}
-
-void BitrateProber::ProbeSent(int64_t now_ms, size_t bytes) {
-  RTC_DCHECK(probing_state_ == ProbingState::kActive);
-  RTC_DCHECK_GT(bytes, 0);
-
-  if (!clusters_.empty()) {
-    ProbeCluster* cluster = &clusters_.front();
-    if (cluster->sent_probes == 0) {
-      RTC_DCHECK_EQ(cluster->time_started_ms, -1);
-      cluster->time_started_ms = now_ms;
-    }
-    cluster->sent_bytes += static_cast<int>(bytes);
-    cluster->sent_probes += 1;
-    next_probe_time_ms_ = GetNextProbeTime(*cluster);
-    if (cluster->sent_bytes >= cluster->pace_info.probe_cluster_min_bytes &&
-        cluster->sent_probes >= cluster->pace_info.probe_cluster_min_probes) {
-      clusters_.pop();
-    }
-    if (clusters_.empty())
-      probing_state_ = ProbingState::kSuspended;
-  }
-}
-
-int64_t BitrateProber::GetNextProbeTime(const ProbeCluster& cluster) {
-  RTC_CHECK_GT(cluster.pace_info.send_bitrate_bps, 0);
-  RTC_CHECK_GE(cluster.time_started_ms, 0);
-
-  // Compute the time delta from the cluster start to ensure probe bitrate stays
-  // close to the target bitrate. Result is in milliseconds.
-  int64_t delta_ms =
-      (8000ll * cluster.sent_bytes + cluster.pace_info.send_bitrate_bps / 2) /
-      cluster.pace_info.send_bitrate_bps;
-  return cluster.time_started_ms + delta_ms;
-}
-
-
-}  // namespace webrtc
diff --git a/modules/pacing/bitrate_prober.h b/modules/pacing/bitrate_prober.h
deleted file mode 100644
index a88898f..0000000
--- a/modules/pacing/bitrate_prober.h
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- *  Copyright (c) 2014 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_PACING_BITRATE_PROBER_H_
-#define WEBRTC_MODULES_PACING_BITRATE_PROBER_H_
-
-#include <queue>
-
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/rtc_base/basictypes.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-class RtcEventLog;
-
-// Note that this class isn't thread-safe by itself and therefore relies
-// on being protected by the caller.
-class BitrateProber {
- public:
-  BitrateProber();
-  explicit BitrateProber(RtcEventLog* event_log);
-
-  void SetEnabled(bool enable);
-
-  // Returns true if the prober is in a probing session, i.e., it currently
-  // wants packets to be sent out according to the time returned by
-  // TimeUntilNextProbe().
-  bool IsProbing() const;
-
-  // Initializes a new probing session if the prober is allowed to probe. Does
-  // not initialize the prober unless the packet size is large enough to probe
-  // with.
-  void OnIncomingPacket(size_t packet_size);
-
-  // Create a cluster used to probe for |bitrate_bps| with |num_probes| number
-  // of probes.
-  void CreateProbeCluster(int bitrate_bps, int64_t now_ms);
-
-  // Returns the number of milliseconds until the next probe should be sent to
-  // get accurate probing.
-  int TimeUntilNextProbe(int64_t now_ms);
-
-  // Information about the current probing cluster.
-  PacedPacketInfo CurrentCluster() const;
-
-  // Returns the minimum number of bytes that the prober recommends for
-  // the next probe.
-  size_t RecommendedMinProbeSize() const;
-
-  // Called to report to the prober that a probe has been sent. In case of
-  // multiple packets per probe, this call would be made at the end of sending
-  // the last packet in probe. |probe_size| is the total size of all packets
-  // in probe.
-  void ProbeSent(int64_t now_ms, size_t probe_size);
-
- private:
-  enum class ProbingState {
-    // Probing will not be triggered in this state at all times.
-    kDisabled,
-    // Probing is enabled and ready to trigger on the first packet arrival.
-    kInactive,
-    // Probe cluster is filled with the set of data rates to be probed and
-    // probes are being sent.
-    kActive,
-    // Probing is enabled, but currently suspended until an explicit trigger
-    // to start probing again.
-    kSuspended,
-  };
-
-  // A probe cluster consists of a set of probes. Each probe in turn can be
-  // divided into a number of packets to accommodate the MTU on the network.
-  struct ProbeCluster {
-    PacedPacketInfo pace_info;
-
-    int sent_probes = 0;
-    int sent_bytes = 0;
-    int64_t time_created_ms = -1;
-    int64_t time_started_ms = -1;
-    int retries = 0;
-  };
-
-  // Resets the state of the prober and clears any cluster/timing data tracked.
-  void ResetState(int64_t now_ms);
-
-  int64_t GetNextProbeTime(const ProbeCluster& cluster);
-
-  ProbingState probing_state_;
-
-  // Probe bitrate per packet. These are used to compute the delta relative to
-  // the previous probe packet based on the size and time when that packet was
-  // sent.
-  std::queue<ProbeCluster> clusters_;
-
-  // Time the next probe should be sent when in kActive state.
-  int64_t next_probe_time_ms_;
-
-  int next_cluster_id_;
-  RtcEventLog* const event_log_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_PACING_BITRATE_PROBER_H_
diff --git a/modules/pacing/bitrate_prober_unittest.cc b/modules/pacing/bitrate_prober_unittest.cc
deleted file mode 100644
index 7040bed..0000000
--- a/modules/pacing/bitrate_prober_unittest.cc
+++ /dev/null
@@ -1,183 +0,0 @@
-/*
- *  Copyright (c) 2014 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 <limits>
-
-#include "webrtc/modules/pacing/bitrate_prober.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-TEST(BitrateProberTest, VerifyStatesAndTimeBetweenProbes) {
-  BitrateProber prober;
-  EXPECT_FALSE(prober.IsProbing());
-  int64_t now_ms = 0;
-  EXPECT_EQ(-1, prober.TimeUntilNextProbe(now_ms));
-
-  const int kTestBitrate1 = 900000;
-  const int kTestBitrate2 = 1800000;
-  const int kClusterSize = 5;
-  const int kProbeSize = 1000;
-  const int kMinProbeDurationMs = 15;
-
-  prober.CreateProbeCluster(kTestBitrate1, now_ms);
-  prober.CreateProbeCluster(kTestBitrate2, now_ms);
-  EXPECT_FALSE(prober.IsProbing());
-
-  prober.OnIncomingPacket(kProbeSize);
-  EXPECT_TRUE(prober.IsProbing());
-  EXPECT_EQ(0, prober.CurrentCluster().probe_cluster_id);
-
-  // First packet should probe as soon as possible.
-  EXPECT_EQ(0, prober.TimeUntilNextProbe(now_ms));
-
-  for (int i = 0; i < kClusterSize; ++i) {
-    now_ms += prober.TimeUntilNextProbe(now_ms);
-    EXPECT_EQ(0, prober.TimeUntilNextProbe(now_ms));
-    EXPECT_EQ(0, prober.CurrentCluster().probe_cluster_id);
-    prober.ProbeSent(now_ms, kProbeSize);
-  }
-
-  EXPECT_GE(now_ms, kMinProbeDurationMs);
-  // Verify that the actual bitrate is withing 10% of the target.
-  double bitrate = kProbeSize * (kClusterSize - 1) * 8 * 1000.0 / now_ms;
-  EXPECT_GT(bitrate, kTestBitrate1 * 0.9);
-  EXPECT_LT(bitrate,  kTestBitrate1 * 1.1);
-
-  now_ms += prober.TimeUntilNextProbe(now_ms);
-  int64_t probe2_started = now_ms;
-
-  for (int i = 0; i < kClusterSize; ++i) {
-    now_ms += prober.TimeUntilNextProbe(now_ms);
-    EXPECT_EQ(0, prober.TimeUntilNextProbe(now_ms));
-    EXPECT_EQ(1, prober.CurrentCluster().probe_cluster_id);
-    prober.ProbeSent(now_ms, kProbeSize);
-  }
-
-  // Verify that the actual bitrate is withing 10% of the target.
-  int duration = now_ms - probe2_started;
-  EXPECT_GE(duration, kMinProbeDurationMs);
-  bitrate = kProbeSize * (kClusterSize - 1) * 8 * 1000.0 / duration;
-  EXPECT_GT(bitrate, kTestBitrate2 * 0.9);
-  EXPECT_LT(bitrate,  kTestBitrate2 * 1.1);
-
-  EXPECT_EQ(-1, prober.TimeUntilNextProbe(now_ms));
-  EXPECT_FALSE(prober.IsProbing());
-}
-
-TEST(BitrateProberTest, DoesntProbeWithoutRecentPackets) {
-  BitrateProber prober;
-  EXPECT_FALSE(prober.IsProbing());
-  int64_t now_ms = 0;
-  EXPECT_EQ(-1, prober.TimeUntilNextProbe(now_ms));
-
-  prober.CreateProbeCluster(900000, now_ms);
-  EXPECT_FALSE(prober.IsProbing());
-
-  prober.OnIncomingPacket(1000);
-  EXPECT_TRUE(prober.IsProbing());
-  EXPECT_EQ(0, prober.TimeUntilNextProbe(now_ms));
-  prober.ProbeSent(now_ms, 1000);
-  // Let time pass, no large enough packets put into prober.
-  now_ms += 6000;
-  EXPECT_EQ(-1, prober.TimeUntilNextProbe(now_ms));
-  // Insert a large-enough packet after downtime while probing should reset to
-  // perform a new probe since the requested one didn't finish.
-  prober.OnIncomingPacket(1000);
-  EXPECT_EQ(0, prober.TimeUntilNextProbe(now_ms));
-  prober.ProbeSent(now_ms, 1000);
-  // Next packet should be part of new probe and be sent with non-zero delay.
-  prober.OnIncomingPacket(1000);
-  EXPECT_GT(prober.TimeUntilNextProbe(now_ms), 0);
-}
-
-TEST(BitrateProberTest, DoesntInitializeProbingForSmallPackets) {
-  BitrateProber prober;
-  prober.SetEnabled(true);
-  EXPECT_FALSE(prober.IsProbing());
-
-  prober.OnIncomingPacket(100);
-  EXPECT_FALSE(prober.IsProbing());
-}
-
-TEST(BitrateProberTest, VerifyProbeSizeOnHighBitrate) {
-  BitrateProber prober;
-  constexpr unsigned kHighBitrateBps = 10000000;  // 10 Mbps
-
-  prober.CreateProbeCluster(kHighBitrateBps, 0);
-  // Probe size should ensure a minimum of 1 ms interval.
-  EXPECT_GT(prober.RecommendedMinProbeSize(), kHighBitrateBps / 8000);
-}
-
-TEST(BitrateProberTest, MinumumNumberOfProbingPackets) {
-  BitrateProber prober;
-  // Even when probing at a low bitrate we expect a minimum number
-  // of packets to be sent.
-  constexpr int kBitrateBps = 100000;  // 100 kbps
-  constexpr int kPacketSizeBytes = 1000;
-
-  prober.CreateProbeCluster(kBitrateBps, 0);
-  prober.OnIncomingPacket(kPacketSizeBytes);
-  for (int i = 0; i < 5; ++i) {
-    EXPECT_TRUE(prober.IsProbing());
-    prober.ProbeSent(0, kPacketSizeBytes);
-  }
-
-  EXPECT_FALSE(prober.IsProbing());
-}
-
-TEST(BitrateProberTest, ScaleBytesUsedForProbing) {
-  BitrateProber prober;
-  constexpr int kBitrateBps = 10000000;  // 10 Mbps
-  constexpr int kPacketSizeBytes = 1000;
-  constexpr int kExpectedBytesSent = kBitrateBps * 15 / 8000;
-
-  prober.CreateProbeCluster(kBitrateBps, 0);
-  prober.OnIncomingPacket(kPacketSizeBytes);
-  int bytes_sent = 0;
-  while (bytes_sent < kExpectedBytesSent) {
-    ASSERT_TRUE(prober.IsProbing());
-    prober.ProbeSent(0, kPacketSizeBytes);
-    bytes_sent += kPacketSizeBytes;
-  }
-
-  EXPECT_FALSE(prober.IsProbing());
-}
-
-TEST(BitrateProberTest, ProbeClusterTimeout) {
-  BitrateProber prober;
-  constexpr int kBitrateBps = 300000;  // 300 kbps
-  constexpr int kSmallPacketSize = 20;
-  // Expecting two probe clusters of 5 packets each.
-  constexpr int kExpectedBytesSent = 20 * 2 * 5;
-  constexpr int64_t kTimeoutMs = 5000;
-
-  int64_t now_ms = 0;
-  prober.CreateProbeCluster(kBitrateBps, now_ms);
-  prober.OnIncomingPacket(kSmallPacketSize);
-  EXPECT_FALSE(prober.IsProbing());
-  now_ms += kTimeoutMs;
-  prober.CreateProbeCluster(kBitrateBps / 10, now_ms);
-  prober.OnIncomingPacket(kSmallPacketSize);
-  EXPECT_FALSE(prober.IsProbing());
-  now_ms += 1;
-  prober.CreateProbeCluster(kBitrateBps / 10, now_ms);
-  prober.OnIncomingPacket(kSmallPacketSize);
-  EXPECT_TRUE(prober.IsProbing());
-  int bytes_sent = 0;
-  while (bytes_sent < kExpectedBytesSent) {
-    ASSERT_TRUE(prober.IsProbing());
-    prober.ProbeSent(0, kSmallPacketSize);
-    bytes_sent += kSmallPacketSize;
-  }
-
-  EXPECT_FALSE(prober.IsProbing());
-}
-}  // namespace webrtc
diff --git a/modules/pacing/interval_budget.cc b/modules/pacing/interval_budget.cc
deleted file mode 100644
index 7e4fe02..0000000
--- a/modules/pacing/interval_budget.cc
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- *  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/pacing/interval_budget.h"
-
-#include <algorithm>
-
-namespace webrtc {
-namespace {
-constexpr int kWindowMs = 500;
-constexpr int kDeltaTimeMs = 2000;
-}
-
-IntervalBudget::IntervalBudget(int initial_target_rate_kbps)
-    : IntervalBudget(initial_target_rate_kbps, false) {}
-
-IntervalBudget::IntervalBudget(int initial_target_rate_kbps,
-                               bool can_build_up_underuse)
-    : bytes_remaining_(0), can_build_up_underuse_(can_build_up_underuse) {
-  set_target_rate_kbps(initial_target_rate_kbps);
-}
-
-void IntervalBudget::set_target_rate_kbps(int target_rate_kbps) {
-  target_rate_kbps_ = target_rate_kbps;
-  max_bytes_in_budget_ = (kWindowMs * target_rate_kbps_) / 8;
-  bytes_remaining_ = std::min(std::max(-max_bytes_in_budget_, bytes_remaining_),
-                              max_bytes_in_budget_);
-}
-
-void IntervalBudget::IncreaseBudget(int64_t delta_time_ms) {
-  RTC_DCHECK_LT(delta_time_ms, kDeltaTimeMs);
-  int bytes = target_rate_kbps_ * delta_time_ms / 8;
-  if (bytes_remaining_ < 0 || can_build_up_underuse_) {
-    // We overused last interval, compensate this interval.
-    bytes_remaining_ = std::min(bytes_remaining_ + bytes, max_bytes_in_budget_);
-  } else {
-    // If we underused last interval we can't use it this interval.
-    bytes_remaining_ = std::min(bytes, max_bytes_in_budget_);
-  }
-}
-
-void IntervalBudget::UseBudget(size_t bytes) {
-  bytes_remaining_ = std::max(bytes_remaining_ - static_cast<int>(bytes),
-                              -max_bytes_in_budget_);
-}
-
-size_t IntervalBudget::bytes_remaining() const {
-  return static_cast<size_t>(std::max(0, bytes_remaining_));
-}
-
-int IntervalBudget::budget_level_percent() const {
-  return bytes_remaining_ * 100 / max_bytes_in_budget_;
-}
-
-int IntervalBudget::target_rate_kbps() const {
-  return target_rate_kbps_;
-}
-
-}  // namespace webrtc
diff --git a/modules/pacing/interval_budget.h b/modules/pacing/interval_budget.h
deleted file mode 100644
index fe770ab..0000000
--- a/modules/pacing/interval_budget.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- *  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_PACING_INTERVAL_BUDGET_H_
-#define WEBRTC_MODULES_PACING_INTERVAL_BUDGET_H_
-
-#include "webrtc/common_types.h"
-
-namespace webrtc {
-
-// TODO(tschumim): Reflector IntervalBudget so that we can set a under- and
-// over-use budget in ms.
-class IntervalBudget {
- public:
-  explicit IntervalBudget(int initial_target_rate_kbps);
-  IntervalBudget(int initial_target_rate_kbps, bool can_build_up_underuse);
-  void set_target_rate_kbps(int target_rate_kbps);
-
-  // TODO(tschumim): Unify IncreaseBudget and UseBudget to one function.
-  void IncreaseBudget(int64_t delta_time_ms);
-  void UseBudget(size_t bytes);
-
-  size_t bytes_remaining() const;
-  int budget_level_percent() const;
-  int target_rate_kbps() const;
-
- private:
-  int target_rate_kbps_;
-  int max_bytes_in_budget_;
-  int bytes_remaining_;
-  bool can_build_up_underuse_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_PACING_INTERVAL_BUDGET_H_
diff --git a/modules/pacing/interval_budget_unittest.cc b/modules/pacing/interval_budget_unittest.cc
deleted file mode 100644
index 30e2c79..0000000
--- a/modules/pacing/interval_budget_unittest.cc
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- *  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/pacing/interval_budget.h"
-
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-namespace {
-constexpr int kWindowMs = 500;
-constexpr int kBitrateKbps = 100;
-constexpr bool kCanBuildUpUnderuse = true;
-constexpr bool kCanNotBuildUpUnderuse = false;
-size_t TimeToBytes(int bitrate_kbps, int time_ms) {
-  return static_cast<size_t>(bitrate_kbps * time_ms / 8);
-}
-}  // namespace
-
-TEST(IntervalBudgetTest, InitailState) {
-  IntervalBudget interval_budget(kBitrateKbps);
-  EXPECT_EQ(interval_budget.budget_level_percent(), 0);
-  EXPECT_EQ(interval_budget.bytes_remaining(), 0u);
-}
-
-TEST(IntervalBudgetTest, Underuse) {
-  IntervalBudget interval_budget(kBitrateKbps);
-  int delta_time_ms = 50;
-  interval_budget.IncreaseBudget(delta_time_ms);
-  EXPECT_EQ(interval_budget.budget_level_percent(), kWindowMs / delta_time_ms);
-  EXPECT_EQ(interval_budget.bytes_remaining(),
-            TimeToBytes(kBitrateKbps, delta_time_ms));
-}
-
-TEST(IntervalBudgetTest, DontUnderuseMoreThanMaxWindow) {
-  IntervalBudget interval_budget(kBitrateKbps);
-  int delta_time_ms = 1000;
-  interval_budget.IncreaseBudget(delta_time_ms);
-  EXPECT_EQ(interval_budget.budget_level_percent(), 100);
-  EXPECT_EQ(interval_budget.bytes_remaining(),
-            TimeToBytes(kBitrateKbps, kWindowMs));
-}
-
-TEST(IntervalBudgetTest, DontUnderuseMoreThanMaxWindowWhenChangeBitrate) {
-  IntervalBudget interval_budget(kBitrateKbps);
-  int delta_time_ms = kWindowMs / 2;
-  interval_budget.IncreaseBudget(delta_time_ms);
-  interval_budget.set_target_rate_kbps(kBitrateKbps / 10);
-  EXPECT_EQ(interval_budget.budget_level_percent(), 100);
-  EXPECT_EQ(interval_budget.bytes_remaining(),
-            TimeToBytes(kBitrateKbps / 10, kWindowMs));
-}
-
-TEST(IntervalBudgetTest, BalanceChangeOnBitrateChange) {
-  IntervalBudget interval_budget(kBitrateKbps);
-  int delta_time_ms = kWindowMs;
-  interval_budget.IncreaseBudget(delta_time_ms);
-  interval_budget.set_target_rate_kbps(kBitrateKbps * 2);
-  EXPECT_EQ(interval_budget.budget_level_percent(), 50);
-  EXPECT_EQ(interval_budget.bytes_remaining(),
-            TimeToBytes(kBitrateKbps, kWindowMs));
-}
-
-TEST(IntervalBudgetTest, Overuse) {
-  IntervalBudget interval_budget(kBitrateKbps);
-  int overuse_time_ms = 50;
-  int used_bytes = TimeToBytes(kBitrateKbps, overuse_time_ms);
-  interval_budget.UseBudget(used_bytes);
-  EXPECT_EQ(interval_budget.budget_level_percent(),
-            -kWindowMs / overuse_time_ms);
-  EXPECT_EQ(interval_budget.bytes_remaining(), 0u);
-}
-
-TEST(IntervalBudgetTest, DontOveruseMoreThanMaxWindow) {
-  IntervalBudget interval_budget(kBitrateKbps);
-  int overuse_time_ms = 1000;
-  int used_bytes = TimeToBytes(kBitrateKbps, overuse_time_ms);
-  interval_budget.UseBudget(used_bytes);
-  EXPECT_EQ(interval_budget.budget_level_percent(), -100);
-  EXPECT_EQ(interval_budget.bytes_remaining(), 0u);
-}
-
-TEST(IntervalBudgetTest, CanBuildUpUnderuseWhenConfigured) {
-  IntervalBudget interval_budget(kBitrateKbps, kCanBuildUpUnderuse);
-  int delta_time_ms = 50;
-  interval_budget.IncreaseBudget(delta_time_ms);
-  EXPECT_EQ(interval_budget.budget_level_percent(), kWindowMs / delta_time_ms);
-  EXPECT_EQ(interval_budget.bytes_remaining(),
-            TimeToBytes(kBitrateKbps, delta_time_ms));
-
-  interval_budget.IncreaseBudget(delta_time_ms);
-  EXPECT_EQ(interval_budget.budget_level_percent(),
-            2 * kWindowMs / delta_time_ms);
-  EXPECT_EQ(interval_budget.bytes_remaining(),
-            TimeToBytes(kBitrateKbps, 2 * delta_time_ms));
-}
-
-TEST(IntervalBudgetTest, CanNotBuildUpUnderuseWhenConfigured) {
-  IntervalBudget interval_budget(kBitrateKbps, kCanNotBuildUpUnderuse);
-  int delta_time_ms = 50;
-  interval_budget.IncreaseBudget(delta_time_ms);
-  EXPECT_EQ(interval_budget.budget_level_percent(), kWindowMs / delta_time_ms);
-  EXPECT_EQ(interval_budget.bytes_remaining(),
-            TimeToBytes(kBitrateKbps, delta_time_ms));
-
-  interval_budget.IncreaseBudget(delta_time_ms);
-  EXPECT_EQ(interval_budget.budget_level_percent(), kWindowMs / delta_time_ms);
-  EXPECT_EQ(interval_budget.bytes_remaining(),
-            TimeToBytes(kBitrateKbps, delta_time_ms));
-}
-
-}  // namespace webrtc
diff --git a/modules/pacing/mock/mock_paced_sender.h b/modules/pacing/mock/mock_paced_sender.h
deleted file mode 100644
index d6587b4..0000000
--- a/modules/pacing/mock/mock_paced_sender.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- *  Copyright (c) 2013 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_PACING_MOCK_MOCK_PACED_SENDER_H_
-#define WEBRTC_MODULES_PACING_MOCK_MOCK_PACED_SENDER_H_
-
-#include <vector>
-
-#include "webrtc/modules/pacing/paced_sender.h"
-#include "webrtc/system_wrappers/include/clock.h"
-#include "webrtc/test/gmock.h"
-
-namespace webrtc {
-
-class MockPacedSender : public PacedSender {
- public:
-  MockPacedSender()
-      : PacedSender(Clock::GetRealTimeClock(), nullptr, nullptr) {}
-  MOCK_METHOD6(SendPacket, bool(Priority priority,
-                                uint32_t ssrc,
-                                uint16_t sequence_number,
-                                int64_t capture_time_ms,
-                                size_t bytes,
-                                bool retransmission));
-  MOCK_METHOD1(CreateProbeCluster, void(int));
-  MOCK_METHOD1(SetEstimatedBitrate, void(uint32_t));
-  MOCK_CONST_METHOD0(QueueInMs, int64_t());
-  MOCK_CONST_METHOD0(QueueInPackets, int());
-  MOCK_CONST_METHOD0(ExpectedQueueTimeMs, int64_t());
-  MOCK_CONST_METHOD0(GetApplicationLimitedRegionStartTime,
-                     rtc::Optional<int64_t>());
-  MOCK_METHOD0(Process, void());
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_PACING_MOCK_MOCK_PACED_SENDER_H_
diff --git a/modules/pacing/paced_sender.cc b/modules/pacing/paced_sender.cc
deleted file mode 100644
index d0a8864..0000000
--- a/modules/pacing/paced_sender.cc
+++ /dev/null
@@ -1,563 +0,0 @@
-/*
- *  Copyright (c) 2012 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/pacing/paced_sender.h"
-
-#include <algorithm>
-#include <map>
-#include <queue>
-#include <set>
-#include <vector>
-
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/modules/pacing/alr_detector.h"
-#include "webrtc/modules/pacing/bitrate_prober.h"
-#include "webrtc/modules/pacing/interval_budget.h"
-#include "webrtc/modules/utility/include/process_thread.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/system_wrappers/include/clock.h"
-#include "webrtc/system_wrappers/include/field_trial.h"
-
-namespace {
-// Time limit in milliseconds between packet bursts.
-const int64_t kMinPacketLimitMs = 5;
-const int64_t kPausedPacketIntervalMs = 500;
-
-// Upper cap on process interval, in case process has not been called in a long
-// time.
-const int64_t kMaxIntervalTimeMs = 30;
-
-}  // namespace
-
-// TODO(sprang): Move at least PacketQueue out to separate files, so that we can
-// more easily test them.
-
-namespace webrtc {
-namespace paced_sender {
-struct Packet {
-  Packet(RtpPacketSender::Priority priority,
-         uint32_t ssrc,
-         uint16_t seq_number,
-         int64_t capture_time_ms,
-         int64_t enqueue_time_ms,
-         size_t length_in_bytes,
-         bool retransmission,
-         uint64_t enqueue_order)
-      : priority(priority),
-        ssrc(ssrc),
-        sequence_number(seq_number),
-        capture_time_ms(capture_time_ms),
-        enqueue_time_ms(enqueue_time_ms),
-        sum_paused_ms(0),
-        bytes(length_in_bytes),
-        retransmission(retransmission),
-        enqueue_order(enqueue_order) {}
-
-  RtpPacketSender::Priority priority;
-  uint32_t ssrc;
-  uint16_t sequence_number;
-  int64_t capture_time_ms;  // Absolute time of frame capture.
-  int64_t enqueue_time_ms;  // Absolute time of pacer queue entry.
-  int64_t sum_paused_ms;    // Sum of time spent in queue while pacer is paused.
-  size_t bytes;
-  bool retransmission;
-  uint64_t enqueue_order;
-  std::list<Packet>::iterator this_it;
-};
-
-// Used by priority queue to sort packets.
-struct Comparator {
-  bool operator()(const Packet* first, const Packet* second) {
-    // Highest prio = 0.
-    if (first->priority != second->priority)
-      return first->priority > second->priority;
-
-    // Retransmissions go first.
-    if (second->retransmission != first->retransmission)
-      return second->retransmission;
-
-    // Older frames have higher prio.
-    if (first->capture_time_ms != second->capture_time_ms)
-      return first->capture_time_ms > second->capture_time_ms;
-
-    return first->enqueue_order > second->enqueue_order;
-  }
-};
-
-// Class encapsulating a priority queue with some extensions.
-class PacketQueue {
- public:
-  explicit PacketQueue(const Clock* clock)
-      : bytes_(0),
-        clock_(clock),
-        queue_time_sum_(0),
-        time_last_updated_(clock_->TimeInMilliseconds()),
-        paused_(false) {}
-  virtual ~PacketQueue() {}
-
-  void Push(const Packet& packet) {
-    if (!AddToDupeSet(packet))
-      return;
-
-    UpdateQueueTime(packet.enqueue_time_ms);
-
-    // Store packet in list, use pointers in priority queue for cheaper moves.
-    // Packets have a handle to its own iterator in the list, for easy removal
-    // when popping from queue.
-    packet_list_.push_front(packet);
-    std::list<Packet>::iterator it = packet_list_.begin();
-    it->this_it = it;          // Handle for direct removal from list.
-    prio_queue_.push(&(*it));  // Pointer into list.
-    bytes_ += packet.bytes;
-  }
-
-  const Packet& BeginPop() {
-    const Packet& packet = *prio_queue_.top();
-    prio_queue_.pop();
-    return packet;
-  }
-
-  void CancelPop(const Packet& packet) { prio_queue_.push(&(*packet.this_it)); }
-
-  void FinalizePop(const Packet& packet) {
-    RemoveFromDupeSet(packet);
-    bytes_ -= packet.bytes;
-    int64_t packet_queue_time_ms = time_last_updated_ - packet.enqueue_time_ms;
-    RTC_DCHECK_LE(packet.sum_paused_ms, packet_queue_time_ms);
-    packet_queue_time_ms -= packet.sum_paused_ms;
-    RTC_DCHECK_LE(packet_queue_time_ms, queue_time_sum_);
-    queue_time_sum_ -= packet_queue_time_ms;
-    packet_list_.erase(packet.this_it);
-    RTC_DCHECK_EQ(packet_list_.size(), prio_queue_.size());
-    if (packet_list_.empty())
-      RTC_DCHECK_EQ(0, queue_time_sum_);
-  }
-
-  bool Empty() const { return prio_queue_.empty(); }
-
-  size_t SizeInPackets() const { return prio_queue_.size(); }
-
-  uint64_t SizeInBytes() const { return bytes_; }
-
-  int64_t OldestEnqueueTimeMs() const {
-    auto it = packet_list_.rbegin();
-    if (it == packet_list_.rend())
-      return 0;
-    return it->enqueue_time_ms;
-  }
-
-  void UpdateQueueTime(int64_t timestamp_ms) {
-    RTC_DCHECK_GE(timestamp_ms, time_last_updated_);
-    if (timestamp_ms == time_last_updated_)
-      return;
-
-    int64_t delta_ms = timestamp_ms - time_last_updated_;
-
-    if (paused_) {
-      // Increase per-packet accumulators of time spent in queue while paused,
-      // so that we can disregard that when subtracting main accumulator when
-      // popping packet from the queue.
-      for (auto& it : packet_list_) {
-        it.sum_paused_ms += delta_ms;
-      }
-    } else {
-      // Use packet packet_list_.size() not prio_queue_.size() here, as there
-      // might be an outstanding element popped from prio_queue_ currently in
-      // the SendPacket() call, while packet_list_ will always be correct.
-      queue_time_sum_ += delta_ms * packet_list_.size();
-    }
-    time_last_updated_ = timestamp_ms;
-  }
-
-  void SetPauseState(bool paused, int64_t timestamp_ms) {
-    if (paused_ == paused)
-      return;
-    UpdateQueueTime(timestamp_ms);
-    paused_ = paused;
-  }
-
-  int64_t AverageQueueTimeMs() const {
-    if (prio_queue_.empty())
-      return 0;
-    return queue_time_sum_ / packet_list_.size();
-  }
-
- private:
-  // Try to add a packet to the set of ssrc/seqno identifiers currently in the
-  // queue. Return true if inserted, false if this is a duplicate.
-  bool AddToDupeSet(const Packet& packet) {
-    SsrcSeqNoMap::iterator it = dupe_map_.find(packet.ssrc);
-    if (it == dupe_map_.end()) {
-      // First for this ssrc, just insert.
-      dupe_map_[packet.ssrc].insert(packet.sequence_number);
-      return true;
-    }
-
-    // Insert returns a pair, where second is a bool set to true if new element.
-    return it->second.insert(packet.sequence_number).second;
-  }
-
-  void RemoveFromDupeSet(const Packet& packet) {
-    SsrcSeqNoMap::iterator it = dupe_map_.find(packet.ssrc);
-    RTC_DCHECK(it != dupe_map_.end());
-    it->second.erase(packet.sequence_number);
-    if (it->second.empty()) {
-      dupe_map_.erase(it);
-    }
-  }
-
-  // List of packets, in the order the were enqueued. Since dequeueing may
-  // occur out of order, use list instead of vector.
-  std::list<Packet> packet_list_;
-  // Priority queue of the packets, sorted according to Comparator.
-  // Use pointers into list, to avoid moving whole struct within heap.
-  std::priority_queue<Packet*, std::vector<Packet*>, Comparator> prio_queue_;
-  // Total number of bytes in the queue.
-  uint64_t bytes_;
-  // Map<ssrc, std::set<seq_no> >, for checking duplicates.
-  typedef std::map<uint32_t, std::set<uint16_t> > SsrcSeqNoMap;
-  SsrcSeqNoMap dupe_map_;
-  const Clock* const clock_;
-  int64_t queue_time_sum_;
-  int64_t time_last_updated_;
-  bool paused_;
-};
-
-}  // namespace paced_sender
-
-const int64_t PacedSender::kMaxQueueLengthMs = 2000;
-const float PacedSender::kDefaultPaceMultiplier = 2.5f;
-
-PacedSender::PacedSender(const Clock* clock,
-                         PacketSender* packet_sender,
-                         RtcEventLog* event_log)
-    : clock_(clock),
-      packet_sender_(packet_sender),
-      alr_detector_(new AlrDetector()),
-      paused_(false),
-      media_budget_(new IntervalBudget(0)),
-      padding_budget_(new IntervalBudget(0)),
-      prober_(new BitrateProber(event_log)),
-      probing_send_failure_(false),
-      estimated_bitrate_bps_(0),
-      min_send_bitrate_kbps_(0u),
-      max_padding_bitrate_kbps_(0u),
-      pacing_bitrate_kbps_(0),
-      time_last_update_us_(clock->TimeInMicroseconds()),
-      first_sent_packet_ms_(-1),
-      packets_(new paced_sender::PacketQueue(clock)),
-      packet_counter_(0),
-      pacing_factor_(kDefaultPaceMultiplier),
-      queue_time_limit(kMaxQueueLengthMs) {
-  UpdateBudgetWithElapsedTime(kMinPacketLimitMs);
-}
-
-PacedSender::~PacedSender() {}
-
-void PacedSender::CreateProbeCluster(int bitrate_bps) {
-  rtc::CritScope cs(&critsect_);
-  prober_->CreateProbeCluster(bitrate_bps, clock_->TimeInMilliseconds());
-}
-
-void PacedSender::Pause() {
-  {
-    rtc::CritScope cs(&critsect_);
-    if (!paused_)
-      LOG(LS_INFO) << "PacedSender paused.";
-    paused_ = true;
-    packets_->SetPauseState(true, clock_->TimeInMilliseconds());
-  }
-  // Tell the process thread to call our TimeUntilNextProcess() method to get
-  // a new (longer) estimate for when to call Process().
-  if (process_thread_)
-    process_thread_->WakeUp(this);
-}
-
-void PacedSender::Resume() {
-  {
-    rtc::CritScope cs(&critsect_);
-    if (paused_)
-      LOG(LS_INFO) << "PacedSender resumed.";
-    paused_ = false;
-    packets_->SetPauseState(false, clock_->TimeInMilliseconds());
-  }
-  // Tell the process thread to call our TimeUntilNextProcess() method to
-  // refresh the estimate for when to call Process().
-  if (process_thread_)
-    process_thread_->WakeUp(this);
-}
-
-void PacedSender::SetProbingEnabled(bool enabled) {
-  RTC_CHECK_EQ(0, packet_counter_);
-  rtc::CritScope cs(&critsect_);
-  prober_->SetEnabled(enabled);
-}
-
-void PacedSender::SetEstimatedBitrate(uint32_t bitrate_bps) {
-  if (bitrate_bps == 0)
-    LOG(LS_ERROR) << "PacedSender is not designed to handle 0 bitrate.";
-  rtc::CritScope cs(&critsect_);
-  estimated_bitrate_bps_ = bitrate_bps;
-  padding_budget_->set_target_rate_kbps(
-      std::min(estimated_bitrate_bps_ / 1000, max_padding_bitrate_kbps_));
-  pacing_bitrate_kbps_ =
-      std::max(min_send_bitrate_kbps_, estimated_bitrate_bps_ / 1000) *
-      pacing_factor_;
-  alr_detector_->SetEstimatedBitrate(bitrate_bps);
-}
-
-void PacedSender::SetSendBitrateLimits(int min_send_bitrate_bps,
-                                       int padding_bitrate) {
-  rtc::CritScope cs(&critsect_);
-  min_send_bitrate_kbps_ = min_send_bitrate_bps / 1000;
-  pacing_bitrate_kbps_ =
-      std::max(min_send_bitrate_kbps_, estimated_bitrate_bps_ / 1000) *
-      pacing_factor_;
-  max_padding_bitrate_kbps_ = padding_bitrate / 1000;
-  padding_budget_->set_target_rate_kbps(
-      std::min(estimated_bitrate_bps_ / 1000, max_padding_bitrate_kbps_));
-}
-
-void PacedSender::InsertPacket(RtpPacketSender::Priority priority,
-                               uint32_t ssrc,
-                               uint16_t sequence_number,
-                               int64_t capture_time_ms,
-                               size_t bytes,
-                               bool retransmission) {
-  rtc::CritScope cs(&critsect_);
-  RTC_DCHECK(estimated_bitrate_bps_ > 0)
-        << "SetEstimatedBitrate must be called before InsertPacket.";
-
-  int64_t now_ms = clock_->TimeInMilliseconds();
-  prober_->OnIncomingPacket(bytes);
-
-  if (capture_time_ms < 0)
-    capture_time_ms = now_ms;
-
-  packets_->Push(paced_sender::Packet(priority, ssrc, sequence_number,
-                                      capture_time_ms, now_ms, bytes,
-                                      retransmission, packet_counter_++));
-}
-
-int64_t PacedSender::ExpectedQueueTimeMs() const {
-  rtc::CritScope cs(&critsect_);
-  RTC_DCHECK_GT(pacing_bitrate_kbps_, 0);
-  return static_cast<int64_t>(packets_->SizeInBytes() * 8 /
-                              pacing_bitrate_kbps_);
-}
-
-rtc::Optional<int64_t> PacedSender::GetApplicationLimitedRegionStartTime()
-    const {
-  rtc::CritScope cs(&critsect_);
-  return alr_detector_->GetApplicationLimitedRegionStartTime();
-}
-
-size_t PacedSender::QueueSizePackets() const {
-  rtc::CritScope cs(&critsect_);
-  return packets_->SizeInPackets();
-}
-
-int64_t PacedSender::FirstSentPacketTimeMs() const {
-  rtc::CritScope cs(&critsect_);
-  return first_sent_packet_ms_;
-}
-
-int64_t PacedSender::QueueInMs() const {
-  rtc::CritScope cs(&critsect_);
-
-  int64_t oldest_packet = packets_->OldestEnqueueTimeMs();
-  if (oldest_packet == 0)
-    return 0;
-
-  return clock_->TimeInMilliseconds() - oldest_packet;
-}
-
-int64_t PacedSender::AverageQueueTimeMs() {
-  rtc::CritScope cs(&critsect_);
-  packets_->UpdateQueueTime(clock_->TimeInMilliseconds());
-  return packets_->AverageQueueTimeMs();
-}
-
-int64_t PacedSender::TimeUntilNextProcess() {
-  rtc::CritScope cs(&critsect_);
-  int64_t elapsed_time_us = clock_->TimeInMicroseconds() - time_last_update_us_;
-  int64_t elapsed_time_ms = (elapsed_time_us + 500) / 1000;
-  // When paused we wake up every 500 ms to send a padding packet to ensure
-  // we won't get stuck in the paused state due to no feedback being received.
-  if (paused_)
-    return std::max<int64_t>(kPausedPacketIntervalMs - elapsed_time_ms, 0);
-
-  if (prober_->IsProbing()) {
-    int64_t ret = prober_->TimeUntilNextProbe(clock_->TimeInMilliseconds());
-    if (ret > 0 || (ret == 0 && !probing_send_failure_))
-      return ret;
-  }
-  return std::max<int64_t>(kMinPacketLimitMs - elapsed_time_ms, 0);
-}
-
-void PacedSender::Process() {
-  int64_t now_us = clock_->TimeInMicroseconds();
-  rtc::CritScope cs(&critsect_);
-  int64_t elapsed_time_ms = std::min(
-      kMaxIntervalTimeMs, (now_us - time_last_update_us_ + 500) / 1000);
-  int target_bitrate_kbps = pacing_bitrate_kbps_;
-
-  if (paused_) {
-    PacedPacketInfo pacing_info;
-    time_last_update_us_ = now_us;
-    // We can not send padding unless a normal packet has first been sent. If we
-    // do, timestamps get messed up.
-    if (packet_counter_ == 0)
-      return;
-    size_t bytes_sent = SendPadding(1, pacing_info);
-    alr_detector_->OnBytesSent(bytes_sent, elapsed_time_ms);
-    return;
-  }
-
-  if (elapsed_time_ms > 0) {
-    size_t queue_size_bytes = packets_->SizeInBytes();
-    if (queue_size_bytes > 0) {
-      // Assuming equal size packets and input/output rate, the average packet
-      // has avg_time_left_ms left to get queue_size_bytes out of the queue, if
-      // time constraint shall be met. Determine bitrate needed for that.
-      packets_->UpdateQueueTime(clock_->TimeInMilliseconds());
-      int64_t avg_time_left_ms = std::max<int64_t>(
-          1, queue_time_limit - packets_->AverageQueueTimeMs());
-      int min_bitrate_needed_kbps =
-          static_cast<int>(queue_size_bytes * 8 / avg_time_left_ms);
-      if (min_bitrate_needed_kbps > target_bitrate_kbps)
-        target_bitrate_kbps = min_bitrate_needed_kbps;
-    }
-
-    media_budget_->set_target_rate_kbps(target_bitrate_kbps);
-    UpdateBudgetWithElapsedTime(elapsed_time_ms);
-  }
-
-  time_last_update_us_ = now_us;
-
-  bool is_probing = prober_->IsProbing();
-  PacedPacketInfo pacing_info;
-  size_t bytes_sent = 0;
-  size_t recommended_probe_size = 0;
-  if (is_probing) {
-    pacing_info = prober_->CurrentCluster();
-    recommended_probe_size = prober_->RecommendedMinProbeSize();
-  }
-  while (!packets_->Empty()) {
-    // Since we need to release the lock in order to send, we first pop the
-    // element from the priority queue but keep it in storage, so that we can
-    // reinsert it if send fails.
-    const paced_sender::Packet& packet = packets_->BeginPop();
-
-    if (SendPacket(packet, pacing_info)) {
-      // Send succeeded, remove it from the queue.
-      if (first_sent_packet_ms_ == -1)
-        first_sent_packet_ms_ = clock_->TimeInMilliseconds();
-      bytes_sent += packet.bytes;
-      packets_->FinalizePop(packet);
-      if (is_probing && bytes_sent > recommended_probe_size)
-        break;
-    } else {
-      // Send failed, put it back into the queue.
-      packets_->CancelPop(packet);
-      break;
-    }
-  }
-
-  if (packets_->Empty()) {
-    // We can not send padding unless a normal packet has first been sent. If we
-    // do, timestamps get messed up.
-    if (packet_counter_ > 0) {
-      int padding_needed =
-          static_cast<int>(is_probing ? (recommended_probe_size - bytes_sent)
-                                      : padding_budget_->bytes_remaining());
-      if (padding_needed > 0)
-        bytes_sent += SendPadding(padding_needed, pacing_info);
-    }
-  }
-  if (is_probing) {
-    probing_send_failure_ = bytes_sent == 0;
-    if (!probing_send_failure_)
-      prober_->ProbeSent(clock_->TimeInMilliseconds(), bytes_sent);
-  }
-  alr_detector_->OnBytesSent(bytes_sent, elapsed_time_ms);
-}
-
-void PacedSender::ProcessThreadAttached(ProcessThread* process_thread) {
-  LOG(LS_INFO) << "ProcessThreadAttached 0x" << std::hex << process_thread;
-  process_thread_ = process_thread;
-}
-
-bool PacedSender::SendPacket(const paced_sender::Packet& packet,
-                             const PacedPacketInfo& pacing_info) {
-  RTC_DCHECK(!paused_);
-  if (media_budget_->bytes_remaining() == 0 &&
-      pacing_info.probe_cluster_id == PacedPacketInfo::kNotAProbe) {
-    return false;
-  }
-
-  critsect_.Leave();
-  const bool success = packet_sender_->TimeToSendPacket(
-      packet.ssrc, packet.sequence_number, packet.capture_time_ms,
-      packet.retransmission, pacing_info);
-  critsect_.Enter();
-
-  if (success) {
-    // TODO(holmer): High priority packets should only be accounted for if we
-    // are allocating bandwidth for audio.
-    if (packet.priority != kHighPriority) {
-      // Update media bytes sent.
-      // TODO(eladalon): TimeToSendPacket() can also return |true| in some
-      // situations where nothing actually ended up being sent to the network,
-      // and we probably don't want to update the budget in such cases.
-      // https://bugs.chromium.org/p/webrtc/issues/detail?id=8052
-      UpdateBudgetWithBytesSent(packet.bytes);
-    }
-  }
-
-  return success;
-}
-
-size_t PacedSender::SendPadding(size_t padding_needed,
-                                const PacedPacketInfo& pacing_info) {
-  RTC_DCHECK_GT(packet_counter_, 0);
-  critsect_.Leave();
-  size_t bytes_sent =
-      packet_sender_->TimeToSendPadding(padding_needed, pacing_info);
-  critsect_.Enter();
-
-  if (bytes_sent > 0) {
-    UpdateBudgetWithBytesSent(bytes_sent);
-  }
-  return bytes_sent;
-}
-
-void PacedSender::UpdateBudgetWithElapsedTime(int64_t delta_time_ms) {
-  media_budget_->IncreaseBudget(delta_time_ms);
-  padding_budget_->IncreaseBudget(delta_time_ms);
-}
-
-void PacedSender::UpdateBudgetWithBytesSent(size_t bytes_sent) {
-  media_budget_->UseBudget(bytes_sent);
-  padding_budget_->UseBudget(bytes_sent);
-}
-
-void PacedSender::SetPacingFactor(float pacing_factor) {
-  rtc::CritScope cs(&critsect_);
-  pacing_factor_ = pacing_factor;
-}
-
-void PacedSender::SetQueueTimeLimit(int limit_ms) {
-  rtc::CritScope cs(&critsect_);
-  queue_time_limit = limit_ms;
-}
-
-}  // namespace webrtc
diff --git a/modules/pacing/paced_sender.h b/modules/pacing/paced_sender.h
deleted file mode 100644
index 196c9f4..0000000
--- a/modules/pacing/paced_sender.h
+++ /dev/null
@@ -1,202 +0,0 @@
-/*
- *  Copyright (c) 2012 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_PACING_PACED_SENDER_H_
-#define WEBRTC_MODULES_PACING_PACED_SENDER_H_
-
-#include <list>
-#include <memory>
-#include <set>
-
-#include "webrtc/api/optional.h"
-#include "webrtc/modules/pacing/pacer.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/thread_annotations.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-class AlrDetector;
-class BitrateProber;
-class Clock;
-class ProbeClusterCreatedObserver;
-class RtcEventLog;
-class IntervalBudget;
-
-namespace paced_sender {
-class IntervalBudget;
-struct Packet;
-class PacketQueue;
-}  // namespace paced_sender
-
-class PacedSender : public Pacer {
- public:
-  class PacketSender {
-   public:
-    // Note: packets sent as a result of a callback should not pass by this
-    // module again.
-    // Called when it's time to send a queued packet.
-    // Returns false if packet cannot be sent.
-    virtual bool TimeToSendPacket(uint32_t ssrc,
-                                  uint16_t sequence_number,
-                                  int64_t capture_time_ms,
-                                  bool retransmission,
-                                  const PacedPacketInfo& cluster_info) = 0;
-    // Called when it's a good time to send a padding data.
-    // Returns the number of bytes sent.
-    virtual size_t TimeToSendPadding(size_t bytes,
-                                     const PacedPacketInfo& cluster_info) = 0;
-
-   protected:
-    virtual ~PacketSender() {}
-  };
-
-  // Expected max pacer delay in ms. If ExpectedQueueTimeMs() is higher than
-  // this value, the packet producers should wait (eg drop frames rather than
-  // encoding them). Bitrate sent may temporarily exceed target set by
-  // UpdateBitrate() so that this limit will be upheld.
-  static const int64_t kMaxQueueLengthMs;
-  // Pacing-rate relative to our target send rate.
-  // Multiplicative factor that is applied to the target bitrate to calculate
-  // the number of bytes that can be transmitted per interval.
-  // Increasing this factor will result in lower delays in cases of bitrate
-  // overshoots from the encoder.
-  static const float kDefaultPaceMultiplier;
-
-  PacedSender(const Clock* clock,
-              PacketSender* packet_sender,
-              RtcEventLog* event_log);
-
-  ~PacedSender() override;
-
-  virtual void CreateProbeCluster(int bitrate_bps);
-
-  // Temporarily pause all sending.
-  void Pause();
-
-  // Resume sending packets.
-  void Resume();
-
-  // Enable bitrate probing. Enabled by default, mostly here to simplify
-  // testing. Must be called before any packets are being sent to have an
-  // effect.
-  void SetProbingEnabled(bool enabled);
-
-  // Sets the estimated capacity of the network. Must be called once before
-  // packets can be sent.
-  // |bitrate_bps| is our estimate of what we are allowed to send on average.
-  // We will pace out bursts of packets at a bitrate of
-  // |bitrate_bps| * kDefaultPaceMultiplier.
-  void SetEstimatedBitrate(uint32_t bitrate_bps) override;
-
-  // Sets the minimum send bitrate and maximum padding bitrate requested by send
-  // streams.
-  // |min_send_bitrate_bps| might be higher that the estimated available network
-  // bitrate and if so, the pacer will send with |min_send_bitrate_bps|.
-  // |max_padding_bitrate_bps| might be higher than the estimate available
-  // network bitrate and if so, the pacer will send padding packets to reach
-  // the min of the estimated available bitrate and |max_padding_bitrate_bps|.
-  void SetSendBitrateLimits(int min_send_bitrate_bps,
-                            int max_padding_bitrate_bps);
-
-  // Returns true if we send the packet now, else it will add the packet
-  // information to the queue and call TimeToSendPacket when it's time to send.
-  void InsertPacket(RtpPacketSender::Priority priority,
-                    uint32_t ssrc,
-                    uint16_t sequence_number,
-                    int64_t capture_time_ms,
-                    size_t bytes,
-                    bool retransmission) override;
-
-  // Returns the time since the oldest queued packet was enqueued.
-  virtual int64_t QueueInMs() const;
-
-  virtual size_t QueueSizePackets() const;
-
-  // Returns the time when the first packet was sent, or -1 if no packet is
-  // sent.
-  virtual int64_t FirstSentPacketTimeMs() const;
-
-  // Returns the number of milliseconds it will take to send the current
-  // packets in the queue, given the current size and bitrate, ignoring prio.
-  virtual int64_t ExpectedQueueTimeMs() const;
-
-  // Returns time in milliseconds when the current application-limited region
-  // started or empty result if the sender is currently not application-limited.
-  //
-  // Application Limited Region (ALR) refers to operating in a state where the
-  // traffic on network is limited due to application not having enough
-  // traffic to meet the current channel capacity.
-  virtual rtc::Optional<int64_t> GetApplicationLimitedRegionStartTime() const;
-
-  // Returns the average time since being enqueued, in milliseconds, for all
-  // packets currently in the pacer queue, excluding any time the pacer has been
-  // paused. Returns 0 if queue is empty.
-  virtual int64_t AverageQueueTimeMs();
-
-  // Returns the number of milliseconds until the module want a worker thread
-  // to call Process.
-  int64_t TimeUntilNextProcess() override;
-
-  // Process any pending packets in the queue(s).
-  void Process() override;
-
-  // Called when the prober is associated with a process thread.
-  void ProcessThreadAttached(ProcessThread* process_thread) override;
-  void SetPacingFactor(float pacing_factor);
-  void SetQueueTimeLimit(int limit_ms);
-
- private:
-  // Updates the number of bytes that can be sent for the next time interval.
-  void UpdateBudgetWithElapsedTime(int64_t delta_time_in_ms)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(critsect_);
-  void UpdateBudgetWithBytesSent(size_t bytes)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(critsect_);
-
-  bool SendPacket(const paced_sender::Packet& packet,
-                  const PacedPacketInfo& cluster_info)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(critsect_);
-  size_t SendPadding(size_t padding_needed, const PacedPacketInfo& cluster_info)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(critsect_);
-
-  const Clock* const clock_;
-  PacketSender* const packet_sender_;
-  std::unique_ptr<AlrDetector> alr_detector_ RTC_GUARDED_BY(critsect_);
-
-  rtc::CriticalSection critsect_;
-  bool paused_ RTC_GUARDED_BY(critsect_);
-  // This is the media budget, keeping track of how many bits of media
-  // we can pace out during the current interval.
-  std::unique_ptr<IntervalBudget> media_budget_ RTC_GUARDED_BY(critsect_);
-  // This is the padding budget, keeping track of how many bits of padding we're
-  // allowed to send out during the current interval. This budget will be
-  // utilized when there's no media to send.
-  std::unique_ptr<IntervalBudget> padding_budget_ RTC_GUARDED_BY(critsect_);
-
-  std::unique_ptr<BitrateProber> prober_ RTC_GUARDED_BY(critsect_);
-  bool probing_send_failure_;
-  // Actual configured bitrates (media_budget_ may temporarily be higher in
-  // order to meet pace time constraint).
-  uint32_t estimated_bitrate_bps_ RTC_GUARDED_BY(critsect_);
-  uint32_t min_send_bitrate_kbps_ RTC_GUARDED_BY(critsect_);
-  uint32_t max_padding_bitrate_kbps_ RTC_GUARDED_BY(critsect_);
-  uint32_t pacing_bitrate_kbps_ RTC_GUARDED_BY(critsect_);
-
-  int64_t time_last_update_us_ RTC_GUARDED_BY(critsect_);
-  int64_t first_sent_packet_ms_ RTC_GUARDED_BY(critsect_);
-
-  std::unique_ptr<paced_sender::PacketQueue> packets_ RTC_GUARDED_BY(critsect_);
-  uint64_t packet_counter_;
-  ProcessThread* process_thread_ = nullptr;
-
-  float pacing_factor_ RTC_GUARDED_BY(critsect_);
-  int64_t queue_time_limit RTC_GUARDED_BY(critsect_);
-};
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_PACING_PACED_SENDER_H_
diff --git a/modules/pacing/paced_sender_unittest.cc b/modules/pacing/paced_sender_unittest.cc
deleted file mode 100644
index 8a3cee0..0000000
--- a/modules/pacing/paced_sender_unittest.cc
+++ /dev/null
@@ -1,1170 +0,0 @@
-/*
- *  Copyright (c) 2012 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 <list>
-#include <memory>
-
-#include "webrtc/modules/pacing/paced_sender.h"
-#include "webrtc/system_wrappers/include/clock.h"
-#include "webrtc/test/gmock.h"
-#include "webrtc/test/gtest.h"
-
-using testing::_;
-using testing::Field;
-using testing::Return;
-
-namespace {
-constexpr unsigned kFirstClusterBps = 900000;
-constexpr unsigned kSecondClusterBps = 1800000;
-
-// The error stems from truncating the time interval of probe packets to integer
-// values. This results in probing slightly higher than the target bitrate.
-// For 1.8 Mbps, this comes to be about 120 kbps with 1200 probe packets.
-constexpr int kBitrateProbingError = 150000;
-}  // namespace
-
-namespace webrtc {
-namespace test {
-
-static const int kTargetBitrateBps = 800000;
-
-class MockPacedSenderCallback : public PacedSender::PacketSender {
- public:
-  MOCK_METHOD5(TimeToSendPacket,
-               bool(uint32_t ssrc,
-                    uint16_t sequence_number,
-                    int64_t capture_time_ms,
-                    bool retransmission,
-                    const PacedPacketInfo& pacing_info));
-  MOCK_METHOD2(TimeToSendPadding,
-               size_t(size_t bytes, const PacedPacketInfo& pacing_info));
-};
-
-class PacedSenderPadding : public PacedSender::PacketSender {
- public:
-  PacedSenderPadding() : padding_sent_(0) {}
-
-  bool TimeToSendPacket(uint32_t ssrc,
-                        uint16_t sequence_number,
-                        int64_t capture_time_ms,
-                        bool retransmission,
-                        const PacedPacketInfo& pacing_info) override {
-    return true;
-  }
-
-  size_t TimeToSendPadding(size_t bytes,
-                           const PacedPacketInfo& pacing_info) override {
-    const size_t kPaddingPacketSize = 224;
-    size_t num_packets = (bytes + kPaddingPacketSize - 1) / kPaddingPacketSize;
-    padding_sent_ += kPaddingPacketSize * num_packets;
-    return kPaddingPacketSize * num_packets;
-  }
-
-  size_t padding_sent() { return padding_sent_; }
-
- private:
-  size_t padding_sent_;
-};
-
-class PacedSenderProbing : public PacedSender::PacketSender {
- public:
-  PacedSenderProbing() : packets_sent_(0), padding_sent_(0) {}
-
-  bool TimeToSendPacket(uint32_t ssrc,
-                        uint16_t sequence_number,
-                        int64_t capture_time_ms,
-                        bool retransmission,
-                        const PacedPacketInfo& pacing_info) override {
-    packets_sent_++;
-    return true;
-  }
-
-  size_t TimeToSendPadding(size_t bytes,
-                           const PacedPacketInfo& pacing_info) override {
-    padding_sent_ += bytes;
-    return padding_sent_;
-  }
-
-  int packets_sent() const { return packets_sent_; }
-
-  int padding_sent() const { return padding_sent_; }
-
- private:
-  int packets_sent_;
-  int padding_sent_;
-};
-
-class PacedSenderTest : public ::testing::Test {
- protected:
-  PacedSenderTest() : clock_(123456) {
-    srand(0);
-    // Need to initialize PacedSender after we initialize clock.
-    send_bucket_.reset(new PacedSender(&clock_, &callback_, nullptr));
-    send_bucket_->CreateProbeCluster(kFirstClusterBps);
-    send_bucket_->CreateProbeCluster(kSecondClusterBps);
-    // Default to bitrate probing disabled for testing purposes. Probing tests
-    // have to enable probing, either by creating a new PacedSender instance or
-    // by calling SetProbingEnabled(true).
-    send_bucket_->SetProbingEnabled(false);
-    send_bucket_->SetEstimatedBitrate(kTargetBitrateBps);
-
-    clock_.AdvanceTimeMilliseconds(send_bucket_->TimeUntilNextProcess());
-  }
-
-  void SendAndExpectPacket(PacedSender::Priority priority,
-                           uint32_t ssrc,
-                           uint16_t sequence_number,
-                           int64_t capture_time_ms,
-                           size_t size,
-                           bool retransmission) {
-    send_bucket_->InsertPacket(priority, ssrc, sequence_number, capture_time_ms,
-                               size, retransmission);
-    EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number,
-                                            capture_time_ms, retransmission, _))
-        .Times(1)
-        .WillRepeatedly(Return(true));
-  }
-  SimulatedClock clock_;
-  MockPacedSenderCallback callback_;
-  std::unique_ptr<PacedSender> send_bucket_;
-};
-
-TEST_F(PacedSenderTest, FirstSentPacketTimeIsSet) {
-  uint16_t sequence_number = 1234;
-  const uint32_t kSsrc = 12345;
-  const size_t kSizeBytes = 250;
-  const size_t kPacketToSend = 3;
-  const int64_t kStartMs = clock_.TimeInMilliseconds();
-
-  // No packet sent.
-  EXPECT_EQ(-1, send_bucket_->FirstSentPacketTimeMs());
-
-  for (size_t i = 0; i < kPacketToSend; ++i) {
-    SendAndExpectPacket(PacedSender::kNormalPriority, kSsrc, sequence_number++,
-                        clock_.TimeInMilliseconds(), kSizeBytes, false);
-    send_bucket_->Process();
-    clock_.AdvanceTimeMilliseconds(send_bucket_->TimeUntilNextProcess());
-  }
-  EXPECT_EQ(kStartMs, send_bucket_->FirstSentPacketTimeMs());
-}
-
-TEST_F(PacedSenderTest, QueuePacket) {
-  uint32_t ssrc = 12345;
-  uint16_t sequence_number = 1234;
-  // Due to the multiplicative factor we can send 5 packets during a send
-  // interval. (network capacity * multiplier / (8 bits per byte *
-  // (packet size * #send intervals per second)
-  const size_t packets_to_send =
-      kTargetBitrateBps * PacedSender::kDefaultPaceMultiplier / (8 * 250 * 200);
-  for (size_t i = 0; i < packets_to_send; ++i) {
-    SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
-                        clock_.TimeInMilliseconds(), 250, false);
-  }
-
-  int64_t queued_packet_timestamp = clock_.TimeInMilliseconds();
-  send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
-                             sequence_number, queued_packet_timestamp, 250,
-                             false);
-  EXPECT_EQ(packets_to_send + 1, send_bucket_->QueueSizePackets());
-  send_bucket_->Process();
-  EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
-  EXPECT_CALL(callback_, TimeToSendPadding(_, _)).Times(0);
-  clock_.AdvanceTimeMilliseconds(4);
-  EXPECT_EQ(1, send_bucket_->TimeUntilNextProcess());
-  clock_.AdvanceTimeMilliseconds(1);
-  EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
-  EXPECT_EQ(1u, send_bucket_->QueueSizePackets());
-  EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number++,
-                                          queued_packet_timestamp, false, _))
-      .Times(1)
-      .WillRepeatedly(Return(true));
-  send_bucket_->Process();
-  sequence_number++;
-  EXPECT_EQ(0u, send_bucket_->QueueSizePackets());
-
-  // We can send packets_to_send -1 packets of size 250 during the current
-  // interval since one packet has already been sent.
-  for (size_t i = 0; i < packets_to_send - 1; ++i) {
-    SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
-                        clock_.TimeInMilliseconds(), 250, false);
-  }
-  send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
-                             sequence_number++, clock_.TimeInMilliseconds(),
-                             250, false);
-  EXPECT_EQ(packets_to_send, send_bucket_->QueueSizePackets());
-  send_bucket_->Process();
-  EXPECT_EQ(1u, send_bucket_->QueueSizePackets());
-}
-
-TEST_F(PacedSenderTest, PaceQueuedPackets) {
-  uint32_t ssrc = 12345;
-  uint16_t sequence_number = 1234;
-
-  // Due to the multiplicative factor we can send 5 packets during a send
-  // interval. (network capacity * multiplier / (8 bits per byte *
-  // (packet size * #send intervals per second)
-  const size_t packets_to_send_per_interval =
-      kTargetBitrateBps * PacedSender::kDefaultPaceMultiplier / (8 * 250 * 200);
-  for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
-    SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
-                        clock_.TimeInMilliseconds(), 250, false);
-  }
-
-  for (size_t j = 0; j < packets_to_send_per_interval * 10; ++j) {
-    send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
-                               sequence_number++, clock_.TimeInMilliseconds(),
-                               250, false);
-  }
-  EXPECT_EQ(packets_to_send_per_interval + packets_to_send_per_interval * 10,
-            send_bucket_->QueueSizePackets());
-  send_bucket_->Process();
-  EXPECT_EQ(packets_to_send_per_interval * 10,
-            send_bucket_->QueueSizePackets());
-  EXPECT_CALL(callback_, TimeToSendPadding(_, _)).Times(0);
-  for (int k = 0; k < 10; ++k) {
-    EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
-    clock_.AdvanceTimeMilliseconds(5);
-    EXPECT_CALL(callback_, TimeToSendPacket(ssrc, _, _, false, _))
-        .Times(packets_to_send_per_interval)
-        .WillRepeatedly(Return(true));
-    EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
-    send_bucket_->Process();
-  }
-  EXPECT_EQ(0u, send_bucket_->QueueSizePackets());
-  EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
-  clock_.AdvanceTimeMilliseconds(5);
-  EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
-  EXPECT_EQ(0u, send_bucket_->QueueSizePackets());
-  send_bucket_->Process();
-
-  for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
-    SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
-                        clock_.TimeInMilliseconds(), 250, false);
-  }
-  send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
-                             sequence_number, clock_.TimeInMilliseconds(), 250,
-                             false);
-  send_bucket_->Process();
-  EXPECT_EQ(1u, send_bucket_->QueueSizePackets());
-}
-
-TEST_F(PacedSenderTest, PaceQueuedPacketsWithDuplicates) {
-  uint32_t ssrc = 12345;
-  uint16_t sequence_number = 1234;
-  uint16_t queued_sequence_number;
-
-  // Due to the multiplicative factor we can send 5 packets during a send
-  // interval. (network capacity * multiplier / (8 bits per byte *
-  // (packet size * #send intervals per second)
-  const size_t packets_to_send_per_interval =
-      kTargetBitrateBps * PacedSender::kDefaultPaceMultiplier / (8 * 250 * 200);
-  for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
-    SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
-                        clock_.TimeInMilliseconds(), 250, false);
-  }
-  queued_sequence_number = sequence_number;
-
-  for (size_t j = 0; j < packets_to_send_per_interval * 10; ++j) {
-    // Send in duplicate packets.
-    send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
-                               sequence_number, clock_.TimeInMilliseconds(),
-                               250, false);
-    send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
-                               sequence_number++, clock_.TimeInMilliseconds(),
-                               250, false);
-  }
-  EXPECT_CALL(callback_, TimeToSendPadding(_, _)).Times(0);
-  send_bucket_->Process();
-  for (int k = 0; k < 10; ++k) {
-    EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
-    clock_.AdvanceTimeMilliseconds(5);
-
-    for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
-      EXPECT_CALL(callback_,
-                  TimeToSendPacket(ssrc, queued_sequence_number++, _, false, _))
-          .Times(1)
-          .WillRepeatedly(Return(true));
-    }
-    EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
-    send_bucket_->Process();
-  }
-  EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
-  clock_.AdvanceTimeMilliseconds(5);
-  EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
-  send_bucket_->Process();
-
-  for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
-    SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
-                        clock_.TimeInMilliseconds(), 250, false);
-  }
-  send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
-                             sequence_number++, clock_.TimeInMilliseconds(),
-                             250, false);
-  send_bucket_->Process();
-  EXPECT_EQ(1u, send_bucket_->QueueSizePackets());
-}
-
-TEST_F(PacedSenderTest, CanQueuePacketsWithSameSequenceNumberOnDifferentSsrcs) {
-  uint32_t ssrc = 12345;
-  uint16_t sequence_number = 1234;
-
-  SendAndExpectPacket(PacedSender::kNormalPriority,
-                      ssrc,
-                      sequence_number,
-                      clock_.TimeInMilliseconds(),
-                      250,
-                      false);
-
-  // Expect packet on second ssrc to be queued and sent as well.
-  SendAndExpectPacket(PacedSender::kNormalPriority,
-                      ssrc + 1,
-                      sequence_number,
-                      clock_.TimeInMilliseconds(),
-                      250,
-                      false);
-
-  clock_.AdvanceTimeMilliseconds(1000);
-  send_bucket_->Process();
-}
-
-TEST_F(PacedSenderTest, Padding) {
-  uint32_t ssrc = 12345;
-  uint16_t sequence_number = 1234;
-
-  send_bucket_->SetEstimatedBitrate(kTargetBitrateBps);
-  send_bucket_->SetSendBitrateLimits(kTargetBitrateBps, kTargetBitrateBps);
-
-  // Due to the multiplicative factor we can send 5 packets during a send
-  // interval. (network capacity * multiplier / (8 bits per byte *
-  // (packet size * #send intervals per second)
-  const size_t packets_to_send_per_interval =
-      kTargetBitrateBps * PacedSender::kDefaultPaceMultiplier / (8 * 250 * 200);
-  for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
-    SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
-                        clock_.TimeInMilliseconds(), 250, false);
-  }
-  // No padding is expected since we have sent too much already.
-  EXPECT_CALL(callback_, TimeToSendPadding(_, _)).Times(0);
-  EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
-  send_bucket_->Process();
-  EXPECT_EQ(0u, send_bucket_->QueueSizePackets());
-
-  // 5 milliseconds later should not send padding since we filled the buffers
-  // initially.
-  EXPECT_CALL(callback_, TimeToSendPadding(250, _)).Times(0);
-  EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
-  clock_.AdvanceTimeMilliseconds(5);
-  EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
-  send_bucket_->Process();
-
-  // 5 milliseconds later we have enough budget to send some padding.
-  EXPECT_CALL(callback_, TimeToSendPadding(250, _))
-      .Times(1)
-      .WillOnce(Return(250));
-  EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
-  clock_.AdvanceTimeMilliseconds(5);
-  EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
-  send_bucket_->Process();
-}
-
-TEST_F(PacedSenderTest, NoPaddingBeforeNormalPacket) {
-  send_bucket_->SetEstimatedBitrate(kTargetBitrateBps);
-  send_bucket_->SetSendBitrateLimits(kTargetBitrateBps, kTargetBitrateBps);
-
-  EXPECT_CALL(callback_, TimeToSendPadding(_, _)).Times(0);
-  send_bucket_->Process();
-  clock_.AdvanceTimeMilliseconds(send_bucket_->TimeUntilNextProcess());
-
-  send_bucket_->Process();
-  clock_.AdvanceTimeMilliseconds(send_bucket_->TimeUntilNextProcess());
-
-  uint32_t ssrc = 12345;
-  uint16_t sequence_number = 1234;
-  int64_t capture_time_ms = 56789;
-
-  SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
-                      capture_time_ms, 250, false);
-  EXPECT_CALL(callback_, TimeToSendPadding(250, _))
-      .Times(1)
-      .WillOnce(Return(250));
-  send_bucket_->Process();
-}
-
-TEST_F(PacedSenderTest, VerifyPaddingUpToBitrate) {
-  uint32_t ssrc = 12345;
-  uint16_t sequence_number = 1234;
-  int64_t capture_time_ms = 56789;
-  const int kTimeStep = 5;
-  const int64_t kBitrateWindow = 100;
-  send_bucket_->SetEstimatedBitrate(kTargetBitrateBps);
-  send_bucket_->SetSendBitrateLimits(kTargetBitrateBps, kTargetBitrateBps);
-
-  int64_t start_time = clock_.TimeInMilliseconds();
-  while (clock_.TimeInMilliseconds() - start_time < kBitrateWindow) {
-    SendAndExpectPacket(PacedSender::kNormalPriority,
-                        ssrc,
-                        sequence_number++,
-                        capture_time_ms,
-                        250,
-                        false);
-    EXPECT_CALL(callback_, TimeToSendPadding(250, _))
-        .Times(1)
-        .WillOnce(Return(250));
-    send_bucket_->Process();
-    clock_.AdvanceTimeMilliseconds(kTimeStep);
-  }
-}
-
-TEST_F(PacedSenderTest, VerifyAverageBitrateVaryingMediaPayload) {
-  uint32_t ssrc = 12345;
-  uint16_t sequence_number = 1234;
-  int64_t capture_time_ms = 56789;
-  const int kTimeStep = 5;
-  const int64_t kBitrateWindow = 10000;
-  PacedSenderPadding callback;
-  send_bucket_.reset(new PacedSender(&clock_, &callback, nullptr));
-  send_bucket_->SetProbingEnabled(false);
-  send_bucket_->SetEstimatedBitrate(kTargetBitrateBps);
-
-  send_bucket_->SetSendBitrateLimits(
-      0 /*allocated_bitrate_bps*/,
-      kTargetBitrateBps * 2 /* max_padding_bitrate_bps */);
-
-  int64_t start_time = clock_.TimeInMilliseconds();
-  size_t media_bytes = 0;
-  while (clock_.TimeInMilliseconds() - start_time < kBitrateWindow) {
-    int rand_value = rand();  // NOLINT (rand_r instead of rand)
-    size_t media_payload = rand_value % 100 + 200;  // [200, 300] bytes.
-    send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
-                               sequence_number++, capture_time_ms,
-                               media_payload, false);
-    media_bytes += media_payload;
-    clock_.AdvanceTimeMilliseconds(kTimeStep);
-    send_bucket_->Process();
-  }
-  EXPECT_NEAR(kTargetBitrateBps / 1000,
-              static_cast<int>(8 * (media_bytes + callback.padding_sent()) /
-                               kBitrateWindow),
-              1);
-}
-
-TEST_F(PacedSenderTest, Priority) {
-  uint32_t ssrc_low_priority = 12345;
-  uint32_t ssrc = 12346;
-  uint16_t sequence_number = 1234;
-  int64_t capture_time_ms = 56789;
-  int64_t capture_time_ms_low_priority = 1234567;
-
-  // Due to the multiplicative factor we can send 5 packets during a send
-  // interval. (network capacity * multiplier / (8 bits per byte *
-  // (packet size * #send intervals per second)
-  const size_t packets_to_send_per_interval =
-      kTargetBitrateBps * PacedSender::kDefaultPaceMultiplier / (8 * 250 * 200);
-  for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
-    SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
-                        clock_.TimeInMilliseconds(), 250, false);
-  }
-  send_bucket_->Process();
-  EXPECT_EQ(0u, send_bucket_->QueueSizePackets());
-
-  // Expect normal and low priority to be queued and high to pass through.
-  send_bucket_->InsertPacket(PacedSender::kLowPriority, ssrc_low_priority,
-                             sequence_number++, capture_time_ms_low_priority,
-                             250, false);
-
-  for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
-    send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
-                               sequence_number++, capture_time_ms, 250, false);
-  }
-  send_bucket_->InsertPacket(PacedSender::kHighPriority, ssrc,
-                             sequence_number++, capture_time_ms, 250, false);
-
-  // Expect all high and normal priority to be sent out first.
-  EXPECT_CALL(callback_, TimeToSendPadding(_, _)).Times(0);
-  EXPECT_CALL(callback_, TimeToSendPacket(ssrc, _, capture_time_ms, false, _))
-      .Times(packets_to_send_per_interval + 1)
-      .WillRepeatedly(Return(true));
-
-  EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
-  clock_.AdvanceTimeMilliseconds(5);
-  EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
-  send_bucket_->Process();
-  EXPECT_EQ(1u, send_bucket_->QueueSizePackets());
-
-  EXPECT_CALL(callback_,
-              TimeToSendPacket(ssrc_low_priority, _,
-                               capture_time_ms_low_priority, false, _))
-      .Times(1)
-      .WillRepeatedly(Return(true));
-
-  EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
-  clock_.AdvanceTimeMilliseconds(5);
-  EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
-  send_bucket_->Process();
-}
-
-TEST_F(PacedSenderTest, RetransmissionPriority) {
-  uint32_t ssrc = 12345;
-  uint16_t sequence_number = 1234;
-  int64_t capture_time_ms = 45678;
-  int64_t capture_time_ms_retransmission = 56789;
-
-  // Due to the multiplicative factor we can send 5 packets during a send
-  // interval. (network capacity * multiplier / (8 bits per byte *
-  // (packet size * #send intervals per second)
-  const size_t packets_to_send_per_interval =
-      kTargetBitrateBps * PacedSender::kDefaultPaceMultiplier / (8 * 250 * 200);
-  send_bucket_->Process();
-  EXPECT_EQ(0u, send_bucket_->QueueSizePackets());
-
-  // Alternate retransmissions and normal packets.
-  for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
-    send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
-                               sequence_number++,
-                               capture_time_ms_retransmission, 250, true);
-    send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
-                               sequence_number++, capture_time_ms, 250, false);
-  }
-  EXPECT_EQ(2 * packets_to_send_per_interval, send_bucket_->QueueSizePackets());
-
-  // Expect all retransmissions to be sent out first despite having a later
-  // capture time.
-  EXPECT_CALL(callback_, TimeToSendPadding(_, _)).Times(0);
-  EXPECT_CALL(callback_, TimeToSendPacket(_, _, _, false, _)).Times(0);
-  EXPECT_CALL(callback_, TimeToSendPacket(
-                             ssrc, _, capture_time_ms_retransmission, true, _))
-      .Times(packets_to_send_per_interval)
-      .WillRepeatedly(Return(true));
-
-  EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
-  clock_.AdvanceTimeMilliseconds(5);
-  EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
-  send_bucket_->Process();
-  EXPECT_EQ(packets_to_send_per_interval, send_bucket_->QueueSizePackets());
-
-  // Expect the remaining (non-retransmission) packets to be sent.
-  EXPECT_CALL(callback_, TimeToSendPadding(_, _)).Times(0);
-  EXPECT_CALL(callback_, TimeToSendPacket(_, _, _, true, _)).Times(0);
-  EXPECT_CALL(callback_, TimeToSendPacket(ssrc, _, capture_time_ms, false, _))
-      .Times(packets_to_send_per_interval)
-      .WillRepeatedly(Return(true));
-
-  EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
-  clock_.AdvanceTimeMilliseconds(5);
-  EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
-  send_bucket_->Process();
-
-  EXPECT_EQ(0u, send_bucket_->QueueSizePackets());
-}
-
-TEST_F(PacedSenderTest, HighPrioDoesntAffectBudget) {
-  uint32_t ssrc = 12346;
-  uint16_t sequence_number = 1234;
-  int64_t capture_time_ms = 56789;
-
-  // As high prio packets doesn't affect the budget, we should be able to send
-  // a high number of them at once.
-  for (int i = 0; i < 25; ++i) {
-    SendAndExpectPacket(PacedSender::kHighPriority, ssrc, sequence_number++,
-                        capture_time_ms, 250, false);
-  }
-  send_bucket_->Process();
-  // Low prio packets does affect the budget.
-  // Due to the multiplicative factor we can send 5 packets during a send
-  // interval. (network capacity * multiplier / (8 bits per byte *
-  // (packet size * #send intervals per second)
-  const size_t packets_to_send_per_interval =
-      kTargetBitrateBps * PacedSender::kDefaultPaceMultiplier / (8 * 250 * 200);
-  for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
-    SendAndExpectPacket(PacedSender::kLowPriority, ssrc, sequence_number++,
-                        clock_.TimeInMilliseconds(), 250, false);
-  }
-  send_bucket_->InsertPacket(PacedSender::kLowPriority, ssrc, sequence_number,
-                             capture_time_ms, 250, false);
-  EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
-  clock_.AdvanceTimeMilliseconds(5);
-  send_bucket_->Process();
-  EXPECT_EQ(1u, send_bucket_->QueueSizePackets());
-  EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number++,
-                                          capture_time_ms, false, _))
-      .Times(1)
-      .WillRepeatedly(Return(true));
-  EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
-  clock_.AdvanceTimeMilliseconds(5);
-  send_bucket_->Process();
-  EXPECT_EQ(0u, send_bucket_->QueueSizePackets());
-}
-
-TEST_F(PacedSenderTest, Pause) {
-  uint32_t ssrc_low_priority = 12345;
-  uint32_t ssrc = 12346;
-  uint32_t ssrc_high_priority = 12347;
-  uint16_t sequence_number = 1234;
-  int64_t capture_time_ms = clock_.TimeInMilliseconds();
-
-  EXPECT_EQ(0, send_bucket_->QueueInMs());
-
-  // Due to the multiplicative factor we can send 5 packets during a send
-  // interval. (network capacity * multiplier / (8 bits per byte *
-  // (packet size * #send intervals per second)
-  const size_t packets_to_send_per_interval =
-      kTargetBitrateBps * PacedSender::kDefaultPaceMultiplier / (8 * 250 * 200);
-  for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
-    SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
-                        clock_.TimeInMilliseconds(), 250, false);
-  }
-
-  send_bucket_->Process();
-
-  send_bucket_->Pause();
-
-  for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
-    send_bucket_->InsertPacket(PacedSender::kLowPriority, ssrc_low_priority,
-                               sequence_number++, capture_time_ms, 250, false);
-    send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
-                               sequence_number++, capture_time_ms, 250, false);
-    send_bucket_->InsertPacket(PacedSender::kHighPriority, ssrc_high_priority,
-                               sequence_number++, capture_time_ms, 250, false);
-  }
-  clock_.AdvanceTimeMilliseconds(10000);
-  int64_t second_capture_time_ms = clock_.TimeInMilliseconds();
-  for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
-    send_bucket_->InsertPacket(PacedSender::kLowPriority, ssrc_low_priority,
-                               sequence_number++, second_capture_time_ms, 250,
-                               false);
-    send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
-                               sequence_number++, second_capture_time_ms, 250,
-                               false);
-    send_bucket_->InsertPacket(PacedSender::kHighPriority, ssrc_high_priority,
-                               sequence_number++, second_capture_time_ms, 250,
-                               false);
-  }
-
-  // Expect everything to be queued.
-  EXPECT_EQ(second_capture_time_ms - capture_time_ms,
-            send_bucket_->QueueInMs());
-
-  EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
-  EXPECT_CALL(callback_, TimeToSendPadding(1, _)).Times(1);
-  send_bucket_->Process();
-
-  int64_t expected_time_until_send = 500;
-  EXPECT_CALL(callback_, TimeToSendPadding(1, _)).Times(1);
-  while (expected_time_until_send >= 0) {
-    // TimeUntilNextProcess must not return 0 when paused.  If it does,
-    // we risk running a busy loop, so ideally it should return a large value.
-    EXPECT_EQ(expected_time_until_send, send_bucket_->TimeUntilNextProcess());
-    if (expected_time_until_send == 0)
-      send_bucket_->Process();
-    clock_.AdvanceTimeMilliseconds(5);
-    expected_time_until_send -= 5;
-  }
-
-  // Expect high prio packets to come out first followed by normal
-  // prio packets and low prio packets (all in capture order).
-  {
-    ::testing::InSequence sequence;
-    EXPECT_CALL(callback_,
-                TimeToSendPacket(ssrc_high_priority, _, capture_time_ms, _, _))
-        .Times(packets_to_send_per_interval)
-        .WillRepeatedly(Return(true));
-    EXPECT_CALL(callback_, TimeToSendPacket(ssrc_high_priority, _,
-                                            second_capture_time_ms, _, _))
-        .Times(packets_to_send_per_interval)
-        .WillRepeatedly(Return(true));
-
-    for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
-      EXPECT_CALL(callback_, TimeToSendPacket(ssrc, _, capture_time_ms, _, _))
-          .Times(1)
-          .WillRepeatedly(Return(true));
-    }
-    for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
-      EXPECT_CALL(callback_,
-                  TimeToSendPacket(ssrc, _, second_capture_time_ms, _, _))
-          .Times(1)
-          .WillRepeatedly(Return(true));
-    }
-    for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
-      EXPECT_CALL(callback_,
-                  TimeToSendPacket(ssrc_low_priority, _, capture_time_ms, _, _))
-          .Times(1)
-          .WillRepeatedly(Return(true));
-    }
-    for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
-      EXPECT_CALL(callback_, TimeToSendPacket(ssrc_low_priority, _,
-                                              second_capture_time_ms, _, _))
-          .Times(1)
-          .WillRepeatedly(Return(true));
-    }
-  }
-  send_bucket_->Resume();
-
-  for (size_t i = 0; i < 4; i++) {
-    EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
-    send_bucket_->Process();
-    EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
-    clock_.AdvanceTimeMilliseconds(5);
-  }
-
-  EXPECT_EQ(0, send_bucket_->QueueInMs());
-}
-
-TEST_F(PacedSenderTest, ResendPacket) {
-  uint32_t ssrc = 12346;
-  uint16_t sequence_number = 1234;
-  int64_t capture_time_ms = clock_.TimeInMilliseconds();
-  EXPECT_EQ(0, send_bucket_->QueueInMs());
-
-  send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
-                             sequence_number, capture_time_ms, 250, false);
-  clock_.AdvanceTimeMilliseconds(1);
-  send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
-                             sequence_number + 1, capture_time_ms + 1, 250,
-                             false);
-  clock_.AdvanceTimeMilliseconds(9999);
-  EXPECT_EQ(clock_.TimeInMilliseconds() - capture_time_ms,
-            send_bucket_->QueueInMs());
-  // Fails to send first packet so only one call.
-  EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number,
-                                          capture_time_ms, false, _))
-      .Times(1)
-      .WillOnce(Return(false));
-  clock_.AdvanceTimeMilliseconds(10000);
-  send_bucket_->Process();
-
-  // Queue remains unchanged.
-  EXPECT_EQ(clock_.TimeInMilliseconds() - capture_time_ms,
-            send_bucket_->QueueInMs());
-
-  // Fails to send second packet.
-  EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number,
-                                          capture_time_ms, false, _))
-      .Times(1)
-      .WillOnce(Return(true));
-  EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number + 1,
-                                          capture_time_ms + 1, false, _))
-      .Times(1)
-      .WillOnce(Return(false));
-  clock_.AdvanceTimeMilliseconds(10000);
-  send_bucket_->Process();
-
-  // Queue is reduced by 1 packet.
-  EXPECT_EQ(clock_.TimeInMilliseconds() - capture_time_ms - 1,
-            send_bucket_->QueueInMs());
-
-  // Send second packet and queue becomes empty.
-  EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number + 1,
-                                          capture_time_ms + 1, false, _))
-      .Times(1)
-      .WillOnce(Return(true));
-  clock_.AdvanceTimeMilliseconds(10000);
-  send_bucket_->Process();
-  EXPECT_EQ(0, send_bucket_->QueueInMs());
-}
-
-TEST_F(PacedSenderTest, ExpectedQueueTimeMs) {
-  uint32_t ssrc = 12346;
-  uint16_t sequence_number = 1234;
-  const size_t kNumPackets = 60;
-  const size_t kPacketSize = 1200;
-  const int32_t kMaxBitrate = PacedSender::kDefaultPaceMultiplier * 30000;
-  EXPECT_EQ(0, send_bucket_->ExpectedQueueTimeMs());
-
-  send_bucket_->SetEstimatedBitrate(30000);
-  for (size_t i = 0; i < kNumPackets; ++i) {
-    SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
-                        clock_.TimeInMilliseconds(), kPacketSize, false);
-  }
-
-  // Queue in ms = 1000 * (bytes in queue) *8 / (bits per second)
-  int64_t queue_in_ms =
-      static_cast<int64_t>(1000 * kNumPackets * kPacketSize * 8 / kMaxBitrate);
-  EXPECT_EQ(queue_in_ms, send_bucket_->ExpectedQueueTimeMs());
-
-  int64_t time_start = clock_.TimeInMilliseconds();
-  while (send_bucket_->QueueSizePackets() > 0) {
-    int time_until_process = send_bucket_->TimeUntilNextProcess();
-    if (time_until_process <= 0) {
-      send_bucket_->Process();
-    } else {
-      clock_.AdvanceTimeMilliseconds(time_until_process);
-    }
-  }
-  int64_t duration = clock_.TimeInMilliseconds() - time_start;
-
-  EXPECT_EQ(0, send_bucket_->ExpectedQueueTimeMs());
-
-  // Allow for aliasing, duration should be within one pack of max time limit.
-  EXPECT_NEAR(duration, PacedSender::kMaxQueueLengthMs,
-              static_cast<int64_t>(1000 * kPacketSize * 8 / kMaxBitrate));
-}
-
-TEST_F(PacedSenderTest, QueueTimeGrowsOverTime) {
-  uint32_t ssrc = 12346;
-  uint16_t sequence_number = 1234;
-  EXPECT_EQ(0, send_bucket_->QueueInMs());
-
-  send_bucket_->SetEstimatedBitrate(30000);
-  SendAndExpectPacket(PacedSender::kNormalPriority,
-                      ssrc,
-                      sequence_number,
-                      clock_.TimeInMilliseconds(),
-                      1200,
-                      false);
-
-  clock_.AdvanceTimeMilliseconds(500);
-  EXPECT_EQ(500, send_bucket_->QueueInMs());
-  send_bucket_->Process();
-  EXPECT_EQ(0, send_bucket_->QueueInMs());
-}
-
-TEST_F(PacedSenderTest, ProbingWithInsertedPackets) {
-  const size_t kPacketSize = 1200;
-  const int kInitialBitrateBps = 300000;
-  uint32_t ssrc = 12346;
-  uint16_t sequence_number = 1234;
-
-  PacedSenderProbing packet_sender;
-  send_bucket_.reset(new PacedSender(&clock_, &packet_sender, nullptr));
-  send_bucket_->CreateProbeCluster(kFirstClusterBps);
-  send_bucket_->CreateProbeCluster(kSecondClusterBps);
-  send_bucket_->SetEstimatedBitrate(kInitialBitrateBps);
-
-  for (int i = 0; i < 10; ++i) {
-    send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
-                               sequence_number++, clock_.TimeInMilliseconds(),
-                               kPacketSize, false);
-  }
-
-  int64_t start = clock_.TimeInMilliseconds();
-  while (packet_sender.packets_sent() < 5) {
-    int time_until_process = send_bucket_->TimeUntilNextProcess();
-    clock_.AdvanceTimeMilliseconds(time_until_process);
-    send_bucket_->Process();
-  }
-  int packets_sent = packet_sender.packets_sent();
-  // Validate first cluster bitrate. Note that we have to account for number
-  // of intervals and hence (packets_sent - 1) on the first cluster.
-  EXPECT_NEAR((packets_sent - 1) * kPacketSize * 8000 /
-                  (clock_.TimeInMilliseconds() - start),
-              kFirstClusterBps, kBitrateProbingError);
-  EXPECT_EQ(0, packet_sender.padding_sent());
-
-  clock_.AdvanceTimeMilliseconds(send_bucket_->TimeUntilNextProcess());
-  start = clock_.TimeInMilliseconds();
-  while (packet_sender.packets_sent() < 10) {
-    int time_until_process = send_bucket_->TimeUntilNextProcess();
-    clock_.AdvanceTimeMilliseconds(time_until_process);
-    send_bucket_->Process();
-  }
-  packets_sent = packet_sender.packets_sent() - packets_sent;
-  // Validate second cluster bitrate.
-  EXPECT_NEAR((packets_sent - 1) * kPacketSize * 8000 /
-                  (clock_.TimeInMilliseconds() - start),
-              kSecondClusterBps, kBitrateProbingError);
-}
-
-TEST_F(PacedSenderTest, ProbingWithPaddingSupport) {
-  const size_t kPacketSize = 1200;
-  const int kInitialBitrateBps = 300000;
-  uint32_t ssrc = 12346;
-  uint16_t sequence_number = 1234;
-
-  PacedSenderProbing packet_sender;
-  send_bucket_.reset(new PacedSender(&clock_, &packet_sender, nullptr));
-  send_bucket_->CreateProbeCluster(kFirstClusterBps);
-  send_bucket_->SetEstimatedBitrate(kInitialBitrateBps);
-
-  for (int i = 0; i < 3; ++i) {
-    send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
-                               sequence_number++, clock_.TimeInMilliseconds(),
-                               kPacketSize, false);
-  }
-
-  int64_t start = clock_.TimeInMilliseconds();
-  int process_count = 0;
-  while (process_count < 5) {
-    int time_until_process = send_bucket_->TimeUntilNextProcess();
-    clock_.AdvanceTimeMilliseconds(time_until_process);
-    send_bucket_->Process();
-    ++process_count;
-  }
-  int packets_sent = packet_sender.packets_sent();
-  int padding_sent = packet_sender.padding_sent();
-  EXPECT_GT(packets_sent, 0);
-  EXPECT_GT(padding_sent, 0);
-  // Note that the number of intervals here for kPacketSize is
-  // packets_sent due to padding in the same cluster.
-  EXPECT_NEAR((packets_sent * kPacketSize * 8000 + padding_sent) /
-                  (clock_.TimeInMilliseconds() - start),
-              kFirstClusterBps, kBitrateProbingError);
-}
-
-TEST_F(PacedSenderTest, PriorityInversion) {
-  uint32_t ssrc = 12346;
-  uint16_t sequence_number = 1234;
-  const size_t kPacketSize = 1200;
-
-  send_bucket_->InsertPacket(
-      PacedSender::kHighPriority, ssrc, sequence_number + 3,
-      clock_.TimeInMilliseconds() + 33, kPacketSize, true);
-
-  send_bucket_->InsertPacket(
-      PacedSender::kHighPriority, ssrc, sequence_number + 2,
-      clock_.TimeInMilliseconds() + 33, kPacketSize, true);
-
-  send_bucket_->InsertPacket(PacedSender::kHighPriority, ssrc, sequence_number,
-                             clock_.TimeInMilliseconds(), kPacketSize, true);
-
-  send_bucket_->InsertPacket(PacedSender::kHighPriority, ssrc,
-                             sequence_number + 1, clock_.TimeInMilliseconds(),
-                             kPacketSize, true);
-
-  // Packets from earlier frames should be sent first.
-  {
-    ::testing::InSequence sequence;
-    EXPECT_CALL(callback_,
-                TimeToSendPacket(ssrc, sequence_number,
-                                 clock_.TimeInMilliseconds(), true, _))
-        .WillOnce(Return(true));
-    EXPECT_CALL(callback_,
-                TimeToSendPacket(ssrc, sequence_number + 1,
-                                 clock_.TimeInMilliseconds(), true, _))
-        .WillOnce(Return(true));
-    EXPECT_CALL(callback_,
-                TimeToSendPacket(ssrc, sequence_number + 3,
-                                 clock_.TimeInMilliseconds() + 33, true, _))
-        .WillOnce(Return(true));
-    EXPECT_CALL(callback_,
-                TimeToSendPacket(ssrc, sequence_number + 2,
-                                 clock_.TimeInMilliseconds() + 33, true, _))
-        .WillOnce(Return(true));
-
-    while (send_bucket_->QueueSizePackets() > 0) {
-      int time_until_process = send_bucket_->TimeUntilNextProcess();
-      if (time_until_process <= 0) {
-        send_bucket_->Process();
-      } else {
-        clock_.AdvanceTimeMilliseconds(time_until_process);
-      }
-    }
-  }
-}
-
-TEST_F(PacedSenderTest, PaddingOveruse) {
-  uint32_t ssrc = 12346;
-  uint16_t sequence_number = 1234;
-  const size_t kPacketSize = 1200;
-
-  send_bucket_->Process();
-  send_bucket_->SetEstimatedBitrate(60000);
-  send_bucket_->SetSendBitrateLimits(60000, 0);
-
-  SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
-                      clock_.TimeInMilliseconds(), kPacketSize, false);
-  send_bucket_->Process();
-
-  // Add 30kbit padding. When increasing budget, media budget will increase from
-  // negative (overuse) while padding budget will increase from 0.
-  clock_.AdvanceTimeMilliseconds(5);
-  send_bucket_->SetSendBitrateLimits(60000, 30000);
-
-  SendAndExpectPacket(PacedSender::kNormalPriority, ssrc, sequence_number++,
-                      clock_.TimeInMilliseconds(), kPacketSize, false);
-  EXPECT_LT(5u, send_bucket_->ExpectedQueueTimeMs());
-  // Don't send padding if queue is non-empty, even if padding budget > 0.
-  EXPECT_CALL(callback_, TimeToSendPadding(_, _)).Times(0);
-  send_bucket_->Process();
-}
-
-TEST_F(PacedSenderTest, AverageQueueTime) {
-  uint32_t ssrc = 12346;
-  uint16_t sequence_number = 1234;
-  const size_t kPacketSize = 1200;
-  const int kBitrateBps = 10 * kPacketSize * 8;  // 10 packets per second.
-
-  send_bucket_->SetEstimatedBitrate(kBitrateBps);
-
-  EXPECT_EQ(0, send_bucket_->AverageQueueTimeMs());
-
-  int64_t first_capture_time = clock_.TimeInMilliseconds();
-  send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
-                             sequence_number, first_capture_time, kPacketSize,
-                             false);
-  clock_.AdvanceTimeMilliseconds(10);
-  send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
-                             sequence_number + 1, clock_.TimeInMilliseconds(),
-                             kPacketSize, false);
-  clock_.AdvanceTimeMilliseconds(10);
-
-  EXPECT_EQ((20 + 10) / 2, send_bucket_->AverageQueueTimeMs());
-
-  // Only first packet (queued for 20ms) should be removed, leave the second
-  // packet (queued for 10ms) alone in the queue.
-  EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number,
-                                          first_capture_time, false, _))
-      .Times(1)
-      .WillRepeatedly(Return(true));
-  send_bucket_->Process();
-
-  EXPECT_EQ(10, send_bucket_->AverageQueueTimeMs());
-
-  clock_.AdvanceTimeMilliseconds(10);
-  EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number + 1,
-                                          first_capture_time + 10, false, _))
-      .Times(1)
-      .WillRepeatedly(Return(true));
-  for (int i = 0; i < 3; ++i) {
-    clock_.AdvanceTimeMilliseconds(30);  // Max delta.
-    send_bucket_->Process();
-  }
-
-  EXPECT_EQ(0, send_bucket_->AverageQueueTimeMs());
-}
-
-TEST_F(PacedSenderTest, ProbeClusterId) {
-  uint32_t ssrc = 12346;
-  uint16_t sequence_number = 1234;
-  const size_t kPacketSize = 1200;
-
-  send_bucket_->SetSendBitrateLimits(kTargetBitrateBps, kTargetBitrateBps);
-  send_bucket_->SetProbingEnabled(true);
-  for (int i = 0; i < 10; ++i) {
-    send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
-                               sequence_number + i, clock_.TimeInMilliseconds(),
-                               kPacketSize, false);
-  }
-
-  // First probing cluster.
-  EXPECT_CALL(callback_,
-              TimeToSendPacket(_, _, _, _,
-                               Field(&PacedPacketInfo::probe_cluster_id, 0)))
-      .Times(5)
-      .WillRepeatedly(Return(true));
-  for (int i = 0; i < 5; ++i) {
-    clock_.AdvanceTimeMilliseconds(20);
-    send_bucket_->Process();
-  }
-
-  // Second probing cluster.
-  EXPECT_CALL(callback_,
-              TimeToSendPacket(_, _, _, _,
-                               Field(&PacedPacketInfo::probe_cluster_id, 1)))
-      .Times(5)
-      .WillRepeatedly(Return(true));
-  for (int i = 0; i < 5; ++i) {
-    clock_.AdvanceTimeMilliseconds(20);
-    send_bucket_->Process();
-  }
-
-  // Needed for the Field comparer below.
-  const int kNotAProbe = PacedPacketInfo::kNotAProbe;
-  // No more probing packets.
-  EXPECT_CALL(callback_,
-              TimeToSendPadding(
-                  _, Field(&PacedPacketInfo::probe_cluster_id, kNotAProbe)))
-      .Times(1)
-      .WillRepeatedly(Return(500));
-  send_bucket_->Process();
-}
-
-TEST_F(PacedSenderTest, AvoidBusyLoopOnSendFailure) {
-  uint32_t ssrc = 12346;
-  uint16_t sequence_number = 1234;
-  const size_t kPacketSize = kFirstClusterBps / (8000 / 10);
-
-  send_bucket_->SetSendBitrateLimits(kTargetBitrateBps, kTargetBitrateBps);
-  send_bucket_->SetProbingEnabled(true);
-  send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
-                             sequence_number, clock_.TimeInMilliseconds(),
-                             kPacketSize, false);
-
-  EXPECT_CALL(callback_, TimeToSendPacket(_, _, _, _, _))
-      .WillOnce(Return(true));
-  send_bucket_->Process();
-  EXPECT_EQ(10, send_bucket_->TimeUntilNextProcess());
-  clock_.AdvanceTimeMilliseconds(9);
-
-  EXPECT_CALL(callback_, TimeToSendPadding(_, _))
-      .Times(2)
-      .WillRepeatedly(Return(0));
-  send_bucket_->Process();
-  EXPECT_EQ(1, send_bucket_->TimeUntilNextProcess());
-  clock_.AdvanceTimeMilliseconds(1);
-  send_bucket_->Process();
-  EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
-}
-
-TEST_F(PacedSenderTest, QueueTimeWithPause) {
-  const size_t kPacketSize = 1200;
-  const uint32_t kSsrc = 12346;
-  uint16_t sequence_number = 1234;
-
-  send_bucket_->InsertPacket(PacedSender::kNormalPriority, kSsrc,
-      sequence_number++, clock_.TimeInMilliseconds(),
-      kPacketSize, false);
-  send_bucket_->InsertPacket(PacedSender::kNormalPriority, kSsrc,
-      sequence_number++, clock_.TimeInMilliseconds(),
-      kPacketSize, false);
-
-  clock_.AdvanceTimeMilliseconds(100);
-  EXPECT_EQ(100, send_bucket_->AverageQueueTimeMs());
-
-  send_bucket_->Pause();
-  EXPECT_EQ(100, send_bucket_->AverageQueueTimeMs());
-
-  // In paused state, queue time should not increase.
-  clock_.AdvanceTimeMilliseconds(100);
-  EXPECT_EQ(100, send_bucket_->AverageQueueTimeMs());
-
-  send_bucket_->Resume();
-  EXPECT_EQ(100, send_bucket_->AverageQueueTimeMs());
-
-  clock_.AdvanceTimeMilliseconds(100);
-  EXPECT_EQ(200, send_bucket_->AverageQueueTimeMs());
-}
-
-TEST_F(PacedSenderTest, QueueTimePausedDuringPush) {
-  const size_t kPacketSize = 1200;
-  const uint32_t kSsrc = 12346;
-  uint16_t sequence_number = 1234;
-
-  send_bucket_->InsertPacket(PacedSender::kNormalPriority, kSsrc,
-      sequence_number++, clock_.TimeInMilliseconds(),
-      kPacketSize, false);
-  clock_.AdvanceTimeMilliseconds(100);
-  send_bucket_->Pause();
-  clock_.AdvanceTimeMilliseconds(100);
-  EXPECT_EQ(100, send_bucket_->AverageQueueTimeMs());
-
-  // Add a new packet during paused phase.
-  send_bucket_->InsertPacket(PacedSender::kNormalPriority, kSsrc,
-      sequence_number++, clock_.TimeInMilliseconds(),
-      kPacketSize, false);
-  // From a queue time perspective, packet inserted during pause will have zero
-  // queue time. Average queue time will then be (0 + 100) / 2 = 50.
-  EXPECT_EQ(50, send_bucket_->AverageQueueTimeMs());
-
-  clock_.AdvanceTimeMilliseconds(100);
-  EXPECT_EQ(50, send_bucket_->AverageQueueTimeMs());
-
-  send_bucket_->Resume();
-  EXPECT_EQ(50, send_bucket_->AverageQueueTimeMs());
-
-  clock_.AdvanceTimeMilliseconds(100);
-  EXPECT_EQ(150, send_bucket_->AverageQueueTimeMs());
-}
-
-// TODO(sprang): Extract PacketQueue from PacedSender so that we can test
-// removing elements while paused. (This is possible, but only because of semi-
-// racy condition so can't easily be tested).
-
-}  // namespace test
-}  // namespace webrtc
diff --git a/modules/pacing/pacer.h b/modules/pacing/pacer.h
deleted file mode 100644
index b5ac2ec..0000000
--- a/modules/pacing/pacer.h
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- *  Copyright (c) 2017 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_PACING_PACER_H_
-#define WEBRTC_MODULES_PACING_PACER_H_
-
-#include "webrtc/modules/include/module.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
-
-namespace webrtc {
-class Pacer : public Module, public RtpPacketSender {
- public:
-  virtual void SetEstimatedBitrate(uint32_t bitrate_bps) {}
-  virtual void SetEstimatedBitrateAndCongestionWindow(
-      uint32_t bitrate_bps,
-      bool in_probe_rtt,
-      uint64_t congestion_window) {}
-  virtual void OnBytesAcked(size_t bytes) {}
-  void InsertPacket(RtpPacketSender::Priority priority,
-                    uint32_t ssrc,
-                    uint16_t sequence_number,
-                    int64_t capture_time_ms,
-                    size_t bytes,
-                    bool retransmission) override = 0;
-  int64_t TimeUntilNextProcess() override = 0;
-  void Process() override = 0;
-  ~Pacer() override {}
-};
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_PACING_PACER_H_
diff --git a/modules/pacing/packet_router.cc b/modules/pacing/packet_router.cc
deleted file mode 100644
index b5cd444..0000000
--- a/modules/pacing/packet_router.cc
+++ /dev/null
@@ -1,303 +0,0 @@
-/*
- *  Copyright (c) 2015 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/pacing/packet_router.h"
-
-#include <algorithm>
-#include <limits>
-
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/transport_feedback.h"
-#include "webrtc/rtc_base/atomicops.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/timeutils.h"
-
-namespace webrtc {
-namespace {
-
-constexpr int kRembSendIntervalMs = 200;
-
-}  // namespace
-
-PacketRouter::PacketRouter()
-    : last_remb_time_ms_(rtc::TimeMillis()),
-      last_send_bitrate_bps_(0),
-      bitrate_bps_(0),
-      max_bitrate_bps_(std::numeric_limits<decltype(max_bitrate_bps_)>::max()),
-      active_remb_module_(nullptr),
-      transport_seq_(0) {}
-
-PacketRouter::~PacketRouter() {
-  RTC_DCHECK(rtp_send_modules_.empty());
-  RTC_DCHECK(rtp_receive_modules_.empty());
-  RTC_DCHECK(sender_remb_candidates_.empty());
-  RTC_DCHECK(receiver_remb_candidates_.empty());
-  RTC_DCHECK(active_remb_module_ == nullptr);
-}
-
-void PacketRouter::AddSendRtpModule(RtpRtcp* rtp_module, bool remb_candidate) {
-  rtc::CritScope cs(&modules_crit_);
-  RTC_DCHECK(std::find(rtp_send_modules_.begin(), rtp_send_modules_.end(),
-                       rtp_module) == rtp_send_modules_.end());
-  // Put modules which can use regular payload packets (over rtx) instead of
-  // padding first as it's less of a waste
-  if ((rtp_module->RtxSendStatus() & kRtxRedundantPayloads) > 0) {
-    rtp_send_modules_.push_front(rtp_module);
-  } else {
-    rtp_send_modules_.push_back(rtp_module);
-  }
-
-  if (remb_candidate) {
-    AddRembModuleCandidate(rtp_module, true);
-  }
-}
-
-void PacketRouter::RemoveSendRtpModule(RtpRtcp* rtp_module) {
-  rtc::CritScope cs(&modules_crit_);
-  MaybeRemoveRembModuleCandidate(rtp_module, /* sender = */ true);
-  auto it =
-      std::find(rtp_send_modules_.begin(), rtp_send_modules_.end(), rtp_module);
-  RTC_DCHECK(it != rtp_send_modules_.end());
-  rtp_send_modules_.erase(it);
-}
-
-void PacketRouter::AddReceiveRtpModule(RtpRtcp* rtp_module,
-                                       bool remb_candidate) {
-  rtc::CritScope cs(&modules_crit_);
-  RTC_DCHECK(std::find(rtp_receive_modules_.begin(), rtp_receive_modules_.end(),
-                       rtp_module) == rtp_receive_modules_.end());
-
-  rtp_receive_modules_.push_back(rtp_module);
-
-  if (remb_candidate) {
-    AddRembModuleCandidate(rtp_module, false);
-  }
-}
-
-void PacketRouter::RemoveReceiveRtpModule(RtpRtcp* rtp_module) {
-  rtc::CritScope cs(&modules_crit_);
-  MaybeRemoveRembModuleCandidate(rtp_module, /* sender = */ false);
-  const auto& it = std::find(rtp_receive_modules_.begin(),
-                             rtp_receive_modules_.end(), rtp_module);
-  RTC_DCHECK(it != rtp_receive_modules_.end());
-  rtp_receive_modules_.erase(it);
-}
-
-bool PacketRouter::TimeToSendPacket(uint32_t ssrc,
-                                    uint16_t sequence_number,
-                                    int64_t capture_timestamp,
-                                    bool retransmission,
-                                    const PacedPacketInfo& pacing_info) {
-  RTC_DCHECK_RUNS_SERIALIZED(&pacer_race_);
-  rtc::CritScope cs(&modules_crit_);
-  for (auto* rtp_module : rtp_send_modules_) {
-    if (!rtp_module->SendingMedia())
-      continue;
-    if (ssrc == rtp_module->SSRC() || ssrc == rtp_module->FlexfecSsrc()) {
-      return rtp_module->TimeToSendPacket(ssrc, sequence_number,
-                                          capture_timestamp, retransmission,
-                                          pacing_info);
-    }
-  }
-  return true;
-}
-
-size_t PacketRouter::TimeToSendPadding(size_t bytes_to_send,
-                                       const PacedPacketInfo& pacing_info) {
-  RTC_DCHECK_RUNS_SERIALIZED(&pacer_race_);
-  size_t total_bytes_sent = 0;
-  rtc::CritScope cs(&modules_crit_);
-  // Rtp modules are ordered by which stream can most benefit from padding.
-  for (RtpRtcp* module : rtp_send_modules_) {
-    if (module->SendingMedia() && module->HasBweExtensions()) {
-      size_t bytes_sent = module->TimeToSendPadding(
-          bytes_to_send - total_bytes_sent, pacing_info);
-      total_bytes_sent += bytes_sent;
-      if (total_bytes_sent >= bytes_to_send)
-        break;
-    }
-  }
-  return total_bytes_sent;
-}
-
-void PacketRouter::SetTransportWideSequenceNumber(uint16_t sequence_number) {
-  rtc::AtomicOps::ReleaseStore(&transport_seq_, sequence_number);
-}
-
-uint16_t PacketRouter::AllocateSequenceNumber() {
-  int prev_seq = rtc::AtomicOps::AcquireLoad(&transport_seq_);
-  int desired_prev_seq;
-  int new_seq;
-  do {
-    desired_prev_seq = prev_seq;
-    new_seq = (desired_prev_seq + 1) & 0xFFFF;
-    // Note: CompareAndSwap returns the actual value of transport_seq at the
-    // time the CAS operation was executed. Thus, if prev_seq is returned, the
-    // operation was successful - otherwise we need to retry. Saving the
-    // return value saves us a load on retry.
-    prev_seq = rtc::AtomicOps::CompareAndSwap(&transport_seq_, desired_prev_seq,
-                                              new_seq);
-  } while (prev_seq != desired_prev_seq);
-
-  return new_seq;
-}
-
-void PacketRouter::OnReceiveBitrateChanged(const std::vector<uint32_t>& ssrcs,
-                                           uint32_t bitrate_bps) {
-  // % threshold for if we should send a new REMB asap.
-  const uint32_t kSendThresholdPercent = 97;
-
-  int64_t now_ms = rtc::TimeMillis();
-  {
-    rtc::CritScope lock(&remb_crit_);
-
-    // If we already have an estimate, check if the new total estimate is below
-    // kSendThresholdPercent of the previous estimate.
-    if (last_send_bitrate_bps_ > 0) {
-      uint32_t new_remb_bitrate_bps =
-          last_send_bitrate_bps_ - bitrate_bps_ + bitrate_bps;
-
-      if (new_remb_bitrate_bps <
-          kSendThresholdPercent * last_send_bitrate_bps_ / 100) {
-        // The new bitrate estimate is less than kSendThresholdPercent % of the
-        // last report. Send a REMB asap.
-        last_remb_time_ms_ = now_ms - kRembSendIntervalMs;
-      }
-    }
-    bitrate_bps_ = bitrate_bps;
-
-    if (now_ms - last_remb_time_ms_ < kRembSendIntervalMs) {
-      return;
-    }
-    // NOTE: Updated if we intend to send the data; we might not have
-    // a module to actually send it.
-    last_remb_time_ms_ = now_ms;
-    last_send_bitrate_bps_ = bitrate_bps;
-    // Cap the value to send in remb with configured value.
-    bitrate_bps = std::min(bitrate_bps, max_bitrate_bps_);
-  }
-  SendRemb(bitrate_bps, ssrcs);
-}
-
-void PacketRouter::SetMaxDesiredReceiveBitrate(uint32_t bitrate_bps) {
-  {
-    rtc::CritScope lock(&remb_crit_);
-    max_bitrate_bps_ = bitrate_bps;
-    if (rtc::TimeMillis() - last_remb_time_ms_ < kRembSendIntervalMs &&
-        last_send_bitrate_bps_ > 0 &&
-        last_send_bitrate_bps_ <= max_bitrate_bps_) {
-      // Recent measured bitrate is already below the cap.
-      return;
-    }
-  }
-  SendRemb(bitrate_bps, /*ssrcs=*/{});
-}
-
-bool PacketRouter::SendRemb(uint32_t bitrate_bps,
-                            const std::vector<uint32_t>& ssrcs) {
-  rtc::CritScope lock(&modules_crit_);
-
-  if (!active_remb_module_) {
-    return false;
-  }
-
-  // The Add* and Remove* methods above ensure that this (and only this) module
-  // has REMB enabled. REMB should be disabled on all other modules, because
-  // otherwise, they will send REMB with stale info.
-  RTC_DCHECK(active_remb_module_->REMB());
-  active_remb_module_->SetREMBData(bitrate_bps, ssrcs);
-
-  return true;
-}
-
-bool PacketRouter::SendTransportFeedback(rtcp::TransportFeedback* packet) {
-  RTC_DCHECK_RUNS_SERIALIZED(&pacer_race_);
-  rtc::CritScope cs(&modules_crit_);
-  // Prefer send modules.
-  for (auto* rtp_module : rtp_send_modules_) {
-    packet->SetSenderSsrc(rtp_module->SSRC());
-    if (rtp_module->SendFeedbackPacket(*packet))
-      return true;
-  }
-  for (auto* rtp_module : rtp_receive_modules_) {
-    packet->SetSenderSsrc(rtp_module->SSRC());
-    if (rtp_module->SendFeedbackPacket(*packet))
-      return true;
-  }
-  return false;
-}
-
-void PacketRouter::AddRembModuleCandidate(RtpRtcp* candidate_module,
-                                          bool sender) {
-  RTC_DCHECK(candidate_module);
-  std::vector<RtpRtcp*>& candidates =
-      sender ? sender_remb_candidates_ : receiver_remb_candidates_;
-  RTC_DCHECK(std::find(candidates.cbegin(), candidates.cend(),
-                       candidate_module) == candidates.cend());
-  candidates.push_back(candidate_module);
-  DetermineActiveRembModule();
-}
-
-void PacketRouter::MaybeRemoveRembModuleCandidate(RtpRtcp* candidate_module,
-                                                  bool sender) {
-  RTC_DCHECK(candidate_module);
-  std::vector<RtpRtcp*>& candidates =
-      sender ? sender_remb_candidates_ : receiver_remb_candidates_;
-  auto it = std::find(candidates.begin(), candidates.end(), candidate_module);
-
-  if (it == candidates.end()) {
-    return;  // Function called due to removal of non-REMB-candidate module.
-  }
-
-  if (*it == active_remb_module_) {
-    UnsetActiveRembModule();
-  }
-  candidates.erase(it);
-  DetermineActiveRembModule();
-}
-
-void PacketRouter::UnsetActiveRembModule() {
-  RTC_CHECK(active_remb_module_);
-  RTC_DCHECK(active_remb_module_->REMB());
-  active_remb_module_->SetREMBStatus(false);
-  active_remb_module_ = nullptr;
-}
-
-void PacketRouter::DetermineActiveRembModule() {
-  // Sender modules take precedence over receiver modules, because SRs (sender
-  // reports) are sent more frequently than RR (receiver reports).
-  // When adding the first sender module, we should change the active REMB
-  // module to be that. Otherwise, we remain with the current active module.
-
-  RtpRtcp* new_active_remb_module_;
-
-  if (!sender_remb_candidates_.empty()) {
-    new_active_remb_module_ = sender_remb_candidates_.front();
-  } else if (!receiver_remb_candidates_.empty()) {
-    new_active_remb_module_ = receiver_remb_candidates_.front();
-  } else {
-    new_active_remb_module_ = nullptr;
-  }
-
-  if (new_active_remb_module_ != active_remb_module_) {
-    if (active_remb_module_) {
-      UnsetActiveRembModule();
-    }
-    if (new_active_remb_module_) {
-      RTC_DCHECK(!new_active_remb_module_->REMB());
-      new_active_remb_module_->SetREMBStatus(true);
-    }
-  }
-
-  active_remb_module_ = new_active_remb_module_;
-}
-
-}  // namespace webrtc
diff --git a/modules/pacing/packet_router.h b/modules/pacing/packet_router.h
deleted file mode 100644
index d76a210..0000000
--- a/modules/pacing/packet_router.h
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- *  Copyright (c) 2015 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_PACING_PACKET_ROUTER_H_
-#define WEBRTC_MODULES_PACING_PACKET_ROUTER_H_
-
-#include <list>
-#include <vector>
-
-#include "webrtc/common_types.h"
-#include "webrtc/modules/pacing/paced_sender.h"
-#include "webrtc/modules/remote_bitrate_estimator/include/remote_bitrate_estimator.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/race_checker.h"
-#include "webrtc/rtc_base/thread_annotations.h"
-
-namespace webrtc {
-
-class RtpRtcp;
-namespace rtcp {
-class TransportFeedback;
-}  // namespace rtcp
-
-// PacketRouter keeps track of rtp send modules to support the pacer.
-// In addition, it handles feedback messages, which are sent on a send
-// module if possible (sender report), otherwise on receive module
-// (receiver report). For the latter case, we also keep track of the
-// receive modules.
-class PacketRouter : public PacedSender::PacketSender,
-                     public TransportSequenceNumberAllocator,
-                     public RemoteBitrateObserver {
- public:
-  PacketRouter();
-  ~PacketRouter() override;
-
-  // TODO(nisse): Delete, as soon as downstream app is updated.
-  RTC_DEPRECATED void AddRtpModule(RtpRtcp* rtp_module) {
-    AddReceiveRtpModule(rtp_module);
-  }
-  RTC_DEPRECATED void RemoveRtpModule(RtpRtcp* rtp_module) {
-    RemoveReceiveRtpModule(rtp_module);
-  }
-
-  void AddSendRtpModule(RtpRtcp* rtp_module, bool remb_candidate);
-  void RemoveSendRtpModule(RtpRtcp* rtp_module);
-  RTC_DEPRECATED void AddSendRtpModule(RtpRtcp* rtp_module) {
-    AddSendRtpModule(rtp_module, true);
-  }
-
-  void AddReceiveRtpModule(RtpRtcp* rtp_module, bool remb_candidate);
-  void RemoveReceiveRtpModule(RtpRtcp* rtp_module);
-  RTC_DEPRECATED void AddReceiveRtpModule(RtpRtcp* rtp_module) {
-    AddReceiveRtpModule(rtp_module, true);
-  }
-
-  // Implements PacedSender::Callback.
-  bool TimeToSendPacket(uint32_t ssrc,
-                        uint16_t sequence_number,
-                        int64_t capture_timestamp,
-                        bool retransmission,
-                        const PacedPacketInfo& packet_info) override;
-
-  size_t TimeToSendPadding(size_t bytes,
-                           const PacedPacketInfo& packet_info) override;
-
-  void SetTransportWideSequenceNumber(uint16_t sequence_number);
-  uint16_t AllocateSequenceNumber() override;
-
-  // Called every time there is a new bitrate estimate for a receive channel
-  // group. This call will trigger a new RTCP REMB packet if the bitrate
-  // estimate has decreased or if no RTCP REMB packet has been sent for
-  // a certain time interval.
-  // Implements RtpReceiveBitrateUpdate.
-  void OnReceiveBitrateChanged(const std::vector<uint32_t>& ssrcs,
-                               uint32_t bitrate_bps) override;
-
-  // Ensures remote party notified of the receive bitrate limit no larger than
-  // |bitrate_bps|.
-  void SetMaxDesiredReceiveBitrate(uint32_t bitrate_bps);
-
-  // Send REMB feedback.
-  virtual bool SendRemb(uint32_t bitrate_bps,
-                        const std::vector<uint32_t>& ssrcs);
-
-  // Send transport feedback packet to send-side.
-  virtual bool SendTransportFeedback(rtcp::TransportFeedback* packet);
-
- private:
-  void AddRembModuleCandidate(RtpRtcp* candidate_module, bool sender)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(modules_crit_);
-  void MaybeRemoveRembModuleCandidate(RtpRtcp* candidate_module, bool sender)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(modules_crit_);
-  void UnsetActiveRembModule() RTC_EXCLUSIVE_LOCKS_REQUIRED(modules_crit_);
-  void DetermineActiveRembModule() RTC_EXCLUSIVE_LOCKS_REQUIRED(modules_crit_);
-
-  rtc::RaceChecker pacer_race_;
-  rtc::CriticalSection modules_crit_;
-  std::list<RtpRtcp*> rtp_send_modules_ RTC_GUARDED_BY(modules_crit_);
-  std::vector<RtpRtcp*> rtp_receive_modules_ RTC_GUARDED_BY(modules_crit_);
-
-  // TODO(eladalon): remb_crit_ only ever held from one function, and it's not
-  // clear if that function can actually be called from more than one thread.
-  rtc::CriticalSection remb_crit_;
-  // The last time a REMB was sent.
-  int64_t last_remb_time_ms_ RTC_GUARDED_BY(remb_crit_);
-  uint32_t last_send_bitrate_bps_ RTC_GUARDED_BY(remb_crit_);
-  // The last bitrate update.
-  uint32_t bitrate_bps_ RTC_GUARDED_BY(remb_crit_);
-  uint32_t max_bitrate_bps_ RTC_GUARDED_BY(remb_crit_);
-
-  // Candidates for the REMB module can be RTP sender/receiver modules, with
-  // the sender modules taking precedence.
-  std::vector<RtpRtcp*> sender_remb_candidates_ RTC_GUARDED_BY(modules_crit_);
-  std::vector<RtpRtcp*> receiver_remb_candidates_ RTC_GUARDED_BY(modules_crit_);
-  RtpRtcp* active_remb_module_ RTC_GUARDED_BY(modules_crit_);
-
-  volatile int transport_seq_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(PacketRouter);
-};
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_PACING_PACKET_ROUTER_H_
diff --git a/modules/pacing/packet_router_unittest.cc b/modules/pacing/packet_router_unittest.cc
deleted file mode 100644
index c33f25c..0000000
--- a/modules/pacing/packet_router_unittest.cc
+++ /dev/null
@@ -1,910 +0,0 @@
-/*
- *  Copyright (c) 2015 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 <list>
-#include <memory>
-
-#include "webrtc/modules/pacing/packet_router.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp.h"
-#include "webrtc/modules/rtp_rtcp/mocks/mock_rtp_rtcp.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/transport_feedback.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/fakeclock.h"
-#include "webrtc/test/gmock.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-// TODO(eladalon): Restructure and/or replace the existing monolithic tests
-// (only some of the test are monolithic) according to the new
-// guidelines - small tests for one thing at a time.
-// (I'm not removing any tests during CL, so as to demonstrate no regressions.)
-
-namespace {
-
-using ::testing::_;
-using ::testing::AnyNumber;
-using ::testing::AtLeast;
-using ::testing::Field;
-using ::testing::Gt;
-using ::testing::Le;
-using ::testing::NiceMock;
-using ::testing::Return;
-using ::testing::ReturnPointee;
-using ::testing::SaveArg;
-
-constexpr int kProbeMinProbes = 5;
-constexpr int kProbeMinBytes = 1000;
-
-class MockRtpRtcpWithRembTracking : public MockRtpRtcp {
- public:
-  MockRtpRtcpWithRembTracking() {
-    ON_CALL(*this, SetREMBStatus(_)).WillByDefault(SaveArg<0>(&remb_));
-    ON_CALL(*this, REMB()).WillByDefault(ReturnPointee(&remb_));
-  }
-
- private:
-  bool remb_ = false;
-};
-}  // namespace
-
-TEST(PacketRouterTest, Sanity_NoModuleRegistered_TimeToSendPacket) {
-  PacketRouter packet_router;
-
-  constexpr uint16_t ssrc = 1234;
-  constexpr uint16_t sequence_number = 17;
-  constexpr uint64_t timestamp = 7890;
-  constexpr bool retransmission = false;
-  const PacedPacketInfo paced_info(1, kProbeMinProbes, kProbeMinBytes);
-
-  // TODO(eladalon): TimeToSendPacket() returning true when nothing was
-  // sent, because no modules were registered, is sub-optimal.
-  // https://bugs.chromium.org/p/webrtc/issues/detail?id=8052
-  EXPECT_TRUE(packet_router.TimeToSendPacket(ssrc, sequence_number, timestamp,
-                                             retransmission, paced_info));
-}
-
-TEST(PacketRouterTest, Sanity_NoModuleRegistered_TimeToSendPadding) {
-  PacketRouter packet_router;
-
-  constexpr size_t bytes = 300;
-  const PacedPacketInfo paced_info(1, kProbeMinProbes, kProbeMinBytes);
-
-  EXPECT_EQ(packet_router.TimeToSendPadding(bytes, paced_info), 0u);
-}
-
-TEST(PacketRouterTest, Sanity_NoModuleRegistered_OnReceiveBitrateChanged) {
-  PacketRouter packet_router;
-
-  const std::vector<uint32_t> ssrcs = {1, 2, 3};
-  constexpr uint32_t bitrate_bps = 10000;
-
-  packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_bps);
-}
-
-TEST(PacketRouterTest, Sanity_NoModuleRegistered_SendRemb) {
-  PacketRouter packet_router;
-
-  const std::vector<uint32_t> ssrcs = {1, 2, 3};
-  constexpr uint32_t bitrate_bps = 10000;
-
-  EXPECT_FALSE(packet_router.SendRemb(bitrate_bps, ssrcs));
-}
-
-TEST(PacketRouterTest, Sanity_NoModuleRegistered_SendTransportFeedback) {
-  PacketRouter packet_router;
-
-  rtcp::TransportFeedback feedback;
-
-  EXPECT_FALSE(packet_router.SendTransportFeedback(&feedback));
-}
-
-TEST(PacketRouterTest, TimeToSendPacket) {
-  PacketRouter packet_router;
-  NiceMock<MockRtpRtcp> rtp_1;
-  NiceMock<MockRtpRtcp> rtp_2;
-
-  packet_router.AddSendRtpModule(&rtp_1, false);
-  packet_router.AddSendRtpModule(&rtp_2, false);
-
-  const uint16_t kSsrc1 = 1234;
-  uint16_t sequence_number = 17;
-  uint64_t timestamp = 7890;
-  bool retransmission = false;
-
-  // Send on the first module by letting rtp_1 be sending with correct ssrc.
-  EXPECT_CALL(rtp_1, SendingMedia()).Times(1).WillOnce(Return(true));
-  EXPECT_CALL(rtp_1, SSRC()).Times(1).WillOnce(Return(kSsrc1));
-  EXPECT_CALL(rtp_1, TimeToSendPacket(
-                         kSsrc1, sequence_number, timestamp, retransmission,
-                         Field(&PacedPacketInfo::probe_cluster_id, 1)))
-      .Times(1)
-      .WillOnce(Return(true));
-  EXPECT_CALL(rtp_2, TimeToSendPacket(_, _, _, _, _)).Times(0);
-  EXPECT_TRUE(packet_router.TimeToSendPacket(
-      kSsrc1, sequence_number, timestamp, retransmission,
-      PacedPacketInfo(1, kProbeMinProbes, kProbeMinBytes)));
-
-  // Send on the second module by letting rtp_2 be sending, but not rtp_1.
-  ++sequence_number;
-  timestamp += 30;
-  retransmission = true;
-  const uint16_t kSsrc2 = 4567;
-  EXPECT_CALL(rtp_1, SendingMedia()).Times(1).WillOnce(Return(false));
-  EXPECT_CALL(rtp_2, SendingMedia()).Times(1).WillOnce(Return(true));
-  EXPECT_CALL(rtp_2, SSRC()).Times(1).WillOnce(Return(kSsrc2));
-  EXPECT_CALL(rtp_1, TimeToSendPacket(_, _, _, _, _)).Times(0);
-  EXPECT_CALL(rtp_2, TimeToSendPacket(
-                         kSsrc2, sequence_number, timestamp, retransmission,
-                         Field(&PacedPacketInfo::probe_cluster_id, 2)))
-      .Times(1)
-      .WillOnce(Return(true));
-  EXPECT_TRUE(packet_router.TimeToSendPacket(
-      kSsrc2, sequence_number, timestamp, retransmission,
-      PacedPacketInfo(2, kProbeMinProbes, kProbeMinBytes)));
-
-  // No module is sending, hence no packet should be sent.
-  EXPECT_CALL(rtp_1, SendingMedia()).Times(1).WillOnce(Return(false));
-  EXPECT_CALL(rtp_1, TimeToSendPacket(_, _, _, _, _)).Times(0);
-  EXPECT_CALL(rtp_2, SendingMedia()).Times(1).WillOnce(Return(false));
-  EXPECT_CALL(rtp_2, TimeToSendPacket(_, _, _, _, _)).Times(0);
-  EXPECT_TRUE(packet_router.TimeToSendPacket(
-      kSsrc1, sequence_number, timestamp, retransmission,
-      PacedPacketInfo(1, kProbeMinProbes, kProbeMinBytes)));
-
-  // Add a packet with incorrect ssrc and test it's dropped in the router.
-  EXPECT_CALL(rtp_1, SendingMedia()).Times(1).WillOnce(Return(true));
-  EXPECT_CALL(rtp_1, SSRC()).Times(1).WillOnce(Return(kSsrc1));
-  EXPECT_CALL(rtp_2, SendingMedia()).Times(1).WillOnce(Return(true));
-  EXPECT_CALL(rtp_2, SSRC()).Times(1).WillOnce(Return(kSsrc2));
-  EXPECT_CALL(rtp_1, TimeToSendPacket(_, _, _, _, _)).Times(0);
-  EXPECT_CALL(rtp_2, TimeToSendPacket(_, _, _, _, _)).Times(0);
-  EXPECT_TRUE(packet_router.TimeToSendPacket(
-      kSsrc1 + kSsrc2, sequence_number, timestamp, retransmission,
-      PacedPacketInfo(1, kProbeMinProbes, kProbeMinBytes)));
-
-  packet_router.RemoveSendRtpModule(&rtp_1);
-
-  // rtp_1 has been removed, try sending a packet on that ssrc and make sure
-  // it is dropped as expected by not expecting any calls to rtp_1.
-  EXPECT_CALL(rtp_2, SendingMedia()).Times(1).WillOnce(Return(true));
-  EXPECT_CALL(rtp_2, SSRC()).Times(1).WillOnce(Return(kSsrc2));
-  EXPECT_CALL(rtp_2, TimeToSendPacket(_, _, _, _, _)).Times(0);
-  EXPECT_TRUE(packet_router.TimeToSendPacket(
-      kSsrc1, sequence_number, timestamp, retransmission,
-      PacedPacketInfo(PacedPacketInfo::kNotAProbe, kProbeMinBytes,
-                      kProbeMinBytes)));
-
-  packet_router.RemoveSendRtpModule(&rtp_2);
-}
-
-TEST(PacketRouterTest, TimeToSendPadding) {
-  PacketRouter packet_router;
-
-  const uint16_t kSsrc1 = 1234;
-  const uint16_t kSsrc2 = 4567;
-
-  NiceMock<MockRtpRtcp> rtp_1;
-  EXPECT_CALL(rtp_1, RtxSendStatus()).WillOnce(Return(kRtxOff));
-  EXPECT_CALL(rtp_1, SSRC()).WillRepeatedly(Return(kSsrc1));
-  NiceMock<MockRtpRtcp> rtp_2;
-  // rtp_2 will be prioritized for padding.
-  EXPECT_CALL(rtp_2, RtxSendStatus()).WillOnce(Return(kRtxRedundantPayloads));
-  EXPECT_CALL(rtp_2, SSRC()).WillRepeatedly(Return(kSsrc2));
-  packet_router.AddSendRtpModule(&rtp_1, false);
-  packet_router.AddSendRtpModule(&rtp_2, false);
-
-  // Default configuration, sending padding on all modules sending media,
-  // ordered by priority (based on rtx mode).
-  const size_t requested_padding_bytes = 1000;
-  const size_t sent_padding_bytes = 890;
-  EXPECT_CALL(rtp_2, SendingMedia()).Times(1).WillOnce(Return(true));
-  EXPECT_CALL(rtp_2, HasBweExtensions()).Times(1).WillOnce(Return(true));
-  EXPECT_CALL(rtp_2,
-              TimeToSendPadding(requested_padding_bytes,
-                                Field(&PacedPacketInfo::probe_cluster_id, 111)))
-      .Times(1)
-      .WillOnce(Return(sent_padding_bytes));
-  EXPECT_CALL(rtp_1, SendingMedia()).Times(1).WillOnce(Return(true));
-  EXPECT_CALL(rtp_1, HasBweExtensions()).Times(1).WillOnce(Return(true));
-  EXPECT_CALL(rtp_1,
-              TimeToSendPadding(requested_padding_bytes - sent_padding_bytes,
-                                Field(&PacedPacketInfo::probe_cluster_id, 111)))
-      .Times(1)
-      .WillOnce(Return(requested_padding_bytes - sent_padding_bytes));
-  EXPECT_EQ(requested_padding_bytes,
-            packet_router.TimeToSendPadding(
-                requested_padding_bytes,
-                PacedPacketInfo(111, kProbeMinBytes, kProbeMinBytes)));
-
-  // Let only the lower priority module be sending and verify the padding
-  // request is routed there.
-  EXPECT_CALL(rtp_2, SendingMedia()).Times(1).WillOnce(Return(false));
-  EXPECT_CALL(rtp_2, TimeToSendPadding(requested_padding_bytes, _)).Times(0);
-  EXPECT_CALL(rtp_1, SendingMedia()).Times(1).WillOnce(Return(true));
-  EXPECT_CALL(rtp_1, HasBweExtensions()).Times(1).WillOnce(Return(true));
-  EXPECT_CALL(rtp_1, TimeToSendPadding(_, _))
-      .Times(1)
-      .WillOnce(Return(sent_padding_bytes));
-  EXPECT_EQ(sent_padding_bytes,
-            packet_router.TimeToSendPadding(
-                requested_padding_bytes,
-                PacedPacketInfo(PacedPacketInfo::kNotAProbe, kProbeMinBytes,
-                                kProbeMinBytes)));
-
-  // No sending module at all.
-  EXPECT_CALL(rtp_1, SendingMedia()).Times(1).WillOnce(Return(false));
-  EXPECT_CALL(rtp_1, TimeToSendPadding(requested_padding_bytes, _)).Times(0);
-  EXPECT_CALL(rtp_2, SendingMedia()).Times(1).WillOnce(Return(false));
-  EXPECT_CALL(rtp_2, TimeToSendPadding(_, _)).Times(0);
-  EXPECT_EQ(0u,
-            packet_router.TimeToSendPadding(
-                requested_padding_bytes,
-                PacedPacketInfo(PacedPacketInfo::kNotAProbe, kProbeMinBytes,
-                                kProbeMinBytes)));
-
-  // Only one module has BWE extensions.
-  EXPECT_CALL(rtp_1, SendingMedia()).Times(1).WillOnce(Return(true));
-  EXPECT_CALL(rtp_1, HasBweExtensions()).Times(1).WillOnce(Return(false));
-  EXPECT_CALL(rtp_1, TimeToSendPadding(requested_padding_bytes, _)).Times(0);
-  EXPECT_CALL(rtp_2, SendingMedia()).Times(1).WillOnce(Return(true));
-  EXPECT_CALL(rtp_2, HasBweExtensions()).Times(1).WillOnce(Return(true));
-  EXPECT_CALL(rtp_2, TimeToSendPadding(requested_padding_bytes, _))
-      .Times(1)
-      .WillOnce(Return(sent_padding_bytes));
-  EXPECT_EQ(sent_padding_bytes,
-            packet_router.TimeToSendPadding(
-                requested_padding_bytes,
-                PacedPacketInfo(PacedPacketInfo::kNotAProbe, kProbeMinBytes,
-                                kProbeMinBytes)));
-
-  packet_router.RemoveSendRtpModule(&rtp_1);
-
-  // rtp_1 has been removed, try sending padding and make sure rtp_1 isn't asked
-  // to send by not expecting any calls. Instead verify rtp_2 is called.
-  EXPECT_CALL(rtp_2, SendingMedia()).Times(1).WillOnce(Return(true));
-  EXPECT_CALL(rtp_2, HasBweExtensions()).Times(1).WillOnce(Return(true));
-  EXPECT_CALL(rtp_2, TimeToSendPadding(requested_padding_bytes, _)).Times(1);
-  EXPECT_EQ(0u,
-            packet_router.TimeToSendPadding(
-                requested_padding_bytes,
-                PacedPacketInfo(PacedPacketInfo::kNotAProbe, kProbeMinBytes,
-                                kProbeMinBytes)));
-
-  packet_router.RemoveSendRtpModule(&rtp_2);
-}
-
-TEST(PacketRouterTest, SenderOnlyFunctionsRespectSendingMedia) {
-  PacketRouter packet_router;
-  NiceMock<MockRtpRtcp> rtp;
-  packet_router.AddSendRtpModule(&rtp, false);
-  static const uint16_t kSsrc = 1234;
-  EXPECT_CALL(rtp, SSRC()).WillRepeatedly(Return(kSsrc));
-  EXPECT_CALL(rtp, SendingMedia()).WillRepeatedly(Return(false));
-
-  // Verify that TimeToSendPacket does not end up in a receiver.
-  EXPECT_CALL(rtp, TimeToSendPacket(_, _, _, _, _)).Times(0);
-  EXPECT_TRUE(packet_router.TimeToSendPacket(
-      kSsrc, 1, 1, false, PacedPacketInfo(PacedPacketInfo::kNotAProbe,
-                                          kProbeMinBytes, kProbeMinBytes)));
-  // Verify that TimeToSendPadding does not end up in a receiver.
-  EXPECT_CALL(rtp, TimeToSendPadding(_, _)).Times(0);
-  EXPECT_EQ(0u,
-            packet_router.TimeToSendPadding(
-                200, PacedPacketInfo(PacedPacketInfo::kNotAProbe,
-                                     kProbeMinBytes, kProbeMinBytes)));
-
-  packet_router.RemoveSendRtpModule(&rtp);
-}
-
-TEST(PacketRouterTest, AllocateSequenceNumbers) {
-  PacketRouter packet_router;
-
-  const uint16_t kStartSeq = 0xFFF0;
-  const size_t kNumPackets = 32;
-
-  packet_router.SetTransportWideSequenceNumber(kStartSeq - 1);
-
-  for (size_t i = 0; i < kNumPackets; ++i) {
-    uint16_t seq = packet_router.AllocateSequenceNumber();
-    uint32_t expected_unwrapped_seq = static_cast<uint32_t>(kStartSeq) + i;
-    EXPECT_EQ(static_cast<uint16_t>(expected_unwrapped_seq & 0xFFFF), seq);
-  }
-}
-
-TEST(PacketRouterTest, SendTransportFeedback) {
-  PacketRouter packet_router;
-  NiceMock<MockRtpRtcp> rtp_1;
-  NiceMock<MockRtpRtcp> rtp_2;
-
-  packet_router.AddSendRtpModule(&rtp_1, false);
-  packet_router.AddReceiveRtpModule(&rtp_2, false);
-
-  rtcp::TransportFeedback feedback;
-  EXPECT_CALL(rtp_1, SendFeedbackPacket(_)).Times(1).WillOnce(Return(true));
-  packet_router.SendTransportFeedback(&feedback);
-  packet_router.RemoveSendRtpModule(&rtp_1);
-  EXPECT_CALL(rtp_2, SendFeedbackPacket(_)).Times(1).WillOnce(Return(true));
-  packet_router.SendTransportFeedback(&feedback);
-  packet_router.RemoveReceiveRtpModule(&rtp_2);
-}
-
-#if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
-TEST(PacketRouterTest, DoubleRegistrationOfSendModuleDisallowed) {
-  PacketRouter packet_router;
-  NiceMock<MockRtpRtcp> module;
-
-  constexpr bool remb_candidate = false;  // Value irrelevant.
-  packet_router.AddSendRtpModule(&module, remb_candidate);
-  EXPECT_DEATH(packet_router.AddSendRtpModule(&module, remb_candidate), "");
-
-  // Test tear-down
-  packet_router.RemoveSendRtpModule(&module);
-}
-
-TEST(PacketRouterTest, DoubleRegistrationOfReceiveModuleDisallowed) {
-  PacketRouter packet_router;
-  NiceMock<MockRtpRtcp> module;
-
-  constexpr bool remb_candidate = false;  // Value irrelevant.
-  packet_router.AddReceiveRtpModule(&module, remb_candidate);
-  EXPECT_DEATH(packet_router.AddReceiveRtpModule(&module, remb_candidate), "");
-
-  // Test tear-down
-  packet_router.RemoveReceiveRtpModule(&module);
-}
-
-TEST(PacketRouterTest, RemovalOfNeverAddedSendModuleDisallowed) {
-  PacketRouter packet_router;
-  NiceMock<MockRtpRtcp> module;
-
-  EXPECT_DEATH(packet_router.RemoveSendRtpModule(&module), "");
-}
-
-TEST(PacketRouterTest, RemovalOfNeverAddedReceiveModuleDisallowed) {
-  PacketRouter packet_router;
-  NiceMock<MockRtpRtcp> module;
-
-  EXPECT_DEATH(packet_router.RemoveReceiveRtpModule(&module), "");
-}
-#endif  // RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
-
-// TODO(eladalon): Remove this test; it should be covered by:
-// 1. SendCandidatePreferredOverReceiveCandidate_SendModuleAddedFirst
-// 2. SendCandidatePreferredOverReceiveCandidate_ReceiveModuleAddedFirst
-// 3. LowerEstimateToSendRemb
-// (Not removing in this CL to prove it doesn't break this test.)
-TEST(PacketRouterRembTest, PreferSendModuleOverReceiveModule) {
-  rtc::ScopedFakeClock clock;
-  NiceMock<MockRtpRtcpWithRembTracking> rtp_recv;
-  NiceMock<MockRtpRtcpWithRembTracking> rtp_send;
-  PacketRouter packet_router;
-
-  packet_router.AddReceiveRtpModule(&rtp_recv, true);
-  ASSERT_TRUE(rtp_recv.REMB());
-
-  const uint32_t bitrate_estimate = 456;
-  const std::vector<uint32_t> ssrcs = {1234};
-
-  packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
-
-  // Call OnReceiveBitrateChanged twice to get a first estimate.
-  clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1000));
-  EXPECT_CALL(rtp_recv, SetREMBData(bitrate_estimate, ssrcs)).Times(1);
-  packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
-
-  // Add a send module, which should be preferred over the receive module.
-  packet_router.AddSendRtpModule(&rtp_send, true);
-  EXPECT_FALSE(rtp_recv.REMB());
-  EXPECT_TRUE(rtp_send.REMB());
-
-  // Lower bitrate to send another REMB packet.
-  EXPECT_CALL(rtp_send, SetREMBData(bitrate_estimate - 100, ssrcs)).Times(1);
-  packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate - 100);
-
-  packet_router.RemoveSendRtpModule(&rtp_send);
-  EXPECT_TRUE(rtp_recv.REMB());
-  EXPECT_FALSE(rtp_send.REMB());
-
-  packet_router.RemoveReceiveRtpModule(&rtp_recv);
-}
-
-TEST(PacketRouterRembTest, LowerEstimateToSendRemb) {
-  rtc::ScopedFakeClock clock;
-  NiceMock<MockRtpRtcpWithRembTracking> rtp;
-  PacketRouter packet_router;
-
-  packet_router.AddSendRtpModule(&rtp, true);
-  EXPECT_TRUE(rtp.REMB());
-
-  uint32_t bitrate_estimate = 456;
-  const std::vector<uint32_t> ssrcs = {1234};
-
-  packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
-
-  // Call OnReceiveBitrateChanged twice to get a first estimate.
-  clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1000));
-  EXPECT_CALL(rtp, SetREMBData(bitrate_estimate, ssrcs)).Times(1);
-  packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
-
-  // Lower the estimate with more than 3% to trigger a call to SetREMBData right
-  // away.
-  bitrate_estimate = bitrate_estimate - 100;
-  EXPECT_CALL(rtp, SetREMBData(bitrate_estimate, ssrcs)).Times(1);
-  packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
-
-  packet_router.RemoveSendRtpModule(&rtp);
-  EXPECT_FALSE(rtp.REMB());
-}
-
-TEST(PacketRouterRembTest, VerifyIncreasingAndDecreasing) {
-  rtc::ScopedFakeClock clock;
-  NiceMock<MockRtpRtcp> rtp;
-  PacketRouter packet_router;
-  packet_router.AddSendRtpModule(&rtp, true);
-
-  uint32_t bitrate_estimate[] = {456, 789};
-  std::vector<uint32_t> ssrcs = {1234, 5678};
-
-  ON_CALL(rtp, REMB()).WillByDefault(Return(true));
-  packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate[0]);
-
-  // Call OnReceiveBitrateChanged twice to get a first estimate.
-  EXPECT_CALL(rtp, SetREMBData(bitrate_estimate[0], ssrcs)).Times(1);
-  clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1000));
-  packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate[0]);
-
-  packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate[1] + 100);
-
-  // Lower the estimate to trigger a callback.
-  EXPECT_CALL(rtp, SetREMBData(bitrate_estimate[1], ssrcs)).Times(1);
-  packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate[1]);
-
-  packet_router.RemoveSendRtpModule(&rtp);
-}
-
-TEST(PacketRouterRembTest, NoRembForIncreasedBitrate) {
-  rtc::ScopedFakeClock clock;
-  NiceMock<MockRtpRtcp> rtp;
-  PacketRouter packet_router;
-  packet_router.AddSendRtpModule(&rtp, true);
-
-  uint32_t bitrate_estimate = 456;
-  std::vector<uint32_t> ssrcs = {1234, 5678};
-
-  ON_CALL(rtp, REMB()).WillByDefault(Return(true));
-  packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
-
-  // Call OnReceiveBitrateChanged twice to get a first estimate.
-  EXPECT_CALL(rtp, SetREMBData(bitrate_estimate, ssrcs)).Times(1);
-  clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1000));
-  packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
-
-  // Increased estimate shouldn't trigger a callback right away.
-  EXPECT_CALL(rtp, SetREMBData(_, _)).Times(0);
-  packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate + 1);
-
-  // Decreasing the estimate less than 3% shouldn't trigger a new callback.
-  EXPECT_CALL(rtp, SetREMBData(_, _)).Times(0);
-  int lower_estimate = bitrate_estimate * 98 / 100;
-  packet_router.OnReceiveBitrateChanged(ssrcs, lower_estimate);
-
-  packet_router.RemoveSendRtpModule(&rtp);
-}
-
-TEST(PacketRouterRembTest, ChangeSendRtpModule) {
-  rtc::ScopedFakeClock clock;
-  NiceMock<MockRtpRtcp> rtp_send;
-  NiceMock<MockRtpRtcp> rtp_recv;
-  PacketRouter packet_router;
-  packet_router.AddSendRtpModule(&rtp_send, true);
-  packet_router.AddReceiveRtpModule(&rtp_recv, true);
-
-  uint32_t bitrate_estimate = 456;
-  std::vector<uint32_t> ssrcs = {1234, 5678};
-
-  ON_CALL(rtp_send, REMB()).WillByDefault(Return(true));
-  packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
-
-  // Call OnReceiveBitrateChanged twice to get a first estimate.
-  clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1000));
-  EXPECT_CALL(rtp_send, SetREMBData(bitrate_estimate, ssrcs)).Times(1);
-  packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
-
-  // Decrease estimate to trigger a REMB.
-  bitrate_estimate = bitrate_estimate - 100;
-  EXPECT_CALL(rtp_send, SetREMBData(bitrate_estimate, ssrcs)).Times(1);
-  packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
-
-  // Remove the sending module -> should get remb on the second module.
-  packet_router.RemoveSendRtpModule(&rtp_send);
-
-  ON_CALL(rtp_send, REMB()).WillByDefault(Return(false));
-  ON_CALL(rtp_recv, REMB()).WillByDefault(Return(true));
-
-  packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
-
-  bitrate_estimate = bitrate_estimate - 100;
-  EXPECT_CALL(rtp_recv, SetREMBData(bitrate_estimate, ssrcs)).Times(1);
-  packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
-
-  packet_router.RemoveReceiveRtpModule(&rtp_recv);
-}
-
-TEST(PacketRouterRembTest, OnlyOneRembForRepeatedOnReceiveBitrateChanged) {
-  rtc::ScopedFakeClock clock;
-  NiceMock<MockRtpRtcp> rtp;
-  PacketRouter packet_router;
-  packet_router.AddSendRtpModule(&rtp, true);
-
-  uint32_t bitrate_estimate = 456;
-  const std::vector<uint32_t> ssrcs = {1234};
-
-  ON_CALL(rtp, REMB()).WillByDefault(Return(true));
-  packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
-
-  // Call OnReceiveBitrateChanged twice to get a first estimate.
-  clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1000));
-  EXPECT_CALL(rtp, SetREMBData(_, _)).Times(1);
-  packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
-
-  // Lower the estimate, should trigger a call to SetREMBData right away.
-  bitrate_estimate = bitrate_estimate - 100;
-  EXPECT_CALL(rtp, SetREMBData(bitrate_estimate, ssrcs)).Times(1);
-  packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
-
-  // Call OnReceiveBitrateChanged again, this should not trigger a new callback.
-  EXPECT_CALL(rtp, SetREMBData(_, _)).Times(0);
-  packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
-  packet_router.RemoveSendRtpModule(&rtp);
-}
-
-TEST(PacketRouterRembTest, SetMaxDesiredReceiveBitrateLimitsSetREMBData) {
-  rtc::ScopedFakeClock clock;
-  PacketRouter packet_router;
-  clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1000));
-  NiceMock<MockRtpRtcpWithRembTracking> remb_sender;
-  constexpr bool remb_candidate = true;
-  packet_router.AddSendRtpModule(&remb_sender, remb_candidate);
-  ASSERT_TRUE(remb_sender.REMB());
-
-  const uint32_t cap_bitrate = 100000;
-  EXPECT_CALL(remb_sender, SetREMBData(Le(cap_bitrate), _)).Times(AtLeast(1));
-  EXPECT_CALL(remb_sender, SetREMBData(Gt(cap_bitrate), _)).Times(0);
-
-  const std::vector<uint32_t> ssrcs = {1234};
-  packet_router.SetMaxDesiredReceiveBitrate(cap_bitrate);
-  packet_router.OnReceiveBitrateChanged(ssrcs, cap_bitrate + 5000);
-  clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1000));
-  packet_router.OnReceiveBitrateChanged(ssrcs, cap_bitrate - 5000);
-
-  // Test tear-down.
-  packet_router.RemoveSendRtpModule(&remb_sender);
-}
-
-TEST(PacketRouterRembTest,
-     SetMaxDesiredReceiveBitrateTriggersRembWhenMoreRestrictive) {
-  rtc::ScopedFakeClock clock;
-  PacketRouter packet_router;
-  clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1000));
-  NiceMock<MockRtpRtcpWithRembTracking> remb_sender;
-  constexpr bool remb_candidate = true;
-  packet_router.AddSendRtpModule(&remb_sender, remb_candidate);
-  ASSERT_TRUE(remb_sender.REMB());
-
-  const uint32_t measured_bitrate_bps = 150000;
-  const uint32_t cap_bitrate_bps = measured_bitrate_bps - 5000;
-  const std::vector<uint32_t> ssrcs = {1234};
-  EXPECT_CALL(remb_sender, SetREMBData(measured_bitrate_bps, _));
-  packet_router.OnReceiveBitrateChanged(ssrcs, measured_bitrate_bps);
-
-  EXPECT_CALL(remb_sender, SetREMBData(cap_bitrate_bps, _));
-  packet_router.SetMaxDesiredReceiveBitrate(cap_bitrate_bps);
-
-  // Test tear-down.
-  packet_router.RemoveSendRtpModule(&remb_sender);
-}
-
-TEST(PacketRouterRembTest,
-     SetMaxDesiredReceiveBitrateDoesNotTriggerRembWhenAsRestrictive) {
-  rtc::ScopedFakeClock clock;
-  PacketRouter packet_router;
-  clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1000));
-  NiceMock<MockRtpRtcpWithRembTracking> remb_sender;
-  constexpr bool remb_candidate = true;
-  packet_router.AddSendRtpModule(&remb_sender, remb_candidate);
-  ASSERT_TRUE(remb_sender.REMB());
-
-  const uint32_t measured_bitrate_bps = 150000;
-  const uint32_t cap_bitrate_bps = measured_bitrate_bps;
-  const std::vector<uint32_t> ssrcs = {1234};
-  EXPECT_CALL(remb_sender, SetREMBData(measured_bitrate_bps, _));
-  packet_router.OnReceiveBitrateChanged(ssrcs, measured_bitrate_bps);
-
-  EXPECT_CALL(remb_sender, SetREMBData(_, _)).Times(0);
-  packet_router.SetMaxDesiredReceiveBitrate(cap_bitrate_bps);
-
-  // Test tear-down.
-  packet_router.RemoveSendRtpModule(&remb_sender);
-}
-
-TEST(PacketRouterRembTest,
-     SetMaxDesiredReceiveBitrateDoesNotTriggerRembWhenLessRestrictive) {
-  rtc::ScopedFakeClock clock;
-  PacketRouter packet_router;
-  clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1000));
-  NiceMock<MockRtpRtcpWithRembTracking> remb_sender;
-  constexpr bool remb_candidate = true;
-  packet_router.AddSendRtpModule(&remb_sender, remb_candidate);
-  ASSERT_TRUE(remb_sender.REMB());
-
-  const uint32_t measured_bitrate_bps = 150000;
-  const uint32_t cap_bitrate_bps = measured_bitrate_bps + 500;
-  const std::vector<uint32_t> ssrcs = {1234};
-  EXPECT_CALL(remb_sender, SetREMBData(measured_bitrate_bps, _));
-  packet_router.OnReceiveBitrateChanged(ssrcs, measured_bitrate_bps);
-
-  EXPECT_CALL(remb_sender, SetREMBData(_, _)).Times(0);
-  packet_router.SetMaxDesiredReceiveBitrate(cap_bitrate_bps);
-
-  // Test tear-down.
-  packet_router.RemoveSendRtpModule(&remb_sender);
-}
-
-TEST(PacketRouterRembTest,
-     SetMaxDesiredReceiveBitrateTriggersRembWhenNoRecentMeasure) {
-  rtc::ScopedFakeClock clock;
-  PacketRouter packet_router;
-  clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1000));
-  NiceMock<MockRtpRtcpWithRembTracking> remb_sender;
-  constexpr bool remb_candidate = true;
-  packet_router.AddSendRtpModule(&remb_sender, remb_candidate);
-  ASSERT_TRUE(remb_sender.REMB());
-
-  const uint32_t measured_bitrate_bps = 150000;
-  const uint32_t cap_bitrate_bps = measured_bitrate_bps + 5000;
-  const std::vector<uint32_t> ssrcs = {1234};
-  EXPECT_CALL(remb_sender, SetREMBData(measured_bitrate_bps, _));
-  packet_router.OnReceiveBitrateChanged(ssrcs, measured_bitrate_bps);
-  clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1000));
-
-  EXPECT_CALL(remb_sender, SetREMBData(cap_bitrate_bps, _));
-  packet_router.SetMaxDesiredReceiveBitrate(cap_bitrate_bps);
-
-  // Test tear-down.
-  packet_router.RemoveSendRtpModule(&remb_sender);
-}
-
-TEST(PacketRouterRembTest,
-     SetMaxDesiredReceiveBitrateTriggersRembWhenNoMeasures) {
-  rtc::ScopedFakeClock clock;
-  PacketRouter packet_router;
-  clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1000));
-  NiceMock<MockRtpRtcpWithRembTracking> remb_sender;
-  constexpr bool remb_candidate = true;
-  packet_router.AddSendRtpModule(&remb_sender, remb_candidate);
-  ASSERT_TRUE(remb_sender.REMB());
-
-  // Set cap.
-  EXPECT_CALL(remb_sender, SetREMBData(100000, _)).Times(1);
-  packet_router.SetMaxDesiredReceiveBitrate(100000);
-  // Increase cap.
-  EXPECT_CALL(remb_sender, SetREMBData(200000, _)).Times(1);
-  packet_router.SetMaxDesiredReceiveBitrate(200000);
-  // Decrease cap.
-  EXPECT_CALL(remb_sender, SetREMBData(150000, _)).Times(1);
-  packet_router.SetMaxDesiredReceiveBitrate(150000);
-
-  // Test tear-down.
-  packet_router.RemoveSendRtpModule(&remb_sender);
-}
-
-// Only register receiving modules and make sure we fallback to trigger a REMB
-// packet on this one.
-TEST(PacketRouterRembTest, NoSendingRtpModule) {
-  rtc::ScopedFakeClock clock;
-  NiceMock<MockRtpRtcp> rtp;
-  PacketRouter packet_router;
-
-  EXPECT_CALL(rtp, SetREMBStatus(true)).Times(1);
-  packet_router.AddReceiveRtpModule(&rtp, true);
-
-  uint32_t bitrate_estimate = 456;
-  const std::vector<uint32_t> ssrcs = {1234};
-
-  ON_CALL(rtp, REMB()).WillByDefault(Return(true));
-  packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
-
-  // Call OnReceiveBitrateChanged twice to get a first estimate.
-  clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1000));
-  EXPECT_CALL(rtp, SetREMBData(bitrate_estimate, ssrcs)).Times(1);
-  packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
-
-  // Lower the estimate to trigger a new packet REMB packet.
-  EXPECT_CALL(rtp, SetREMBData(bitrate_estimate - 100, ssrcs)).Times(1);
-  packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate - 100);
-
-  EXPECT_CALL(rtp, SetREMBStatus(false)).Times(1);
-  packet_router.RemoveReceiveRtpModule(&rtp);
-}
-
-TEST(PacketRouterRembTest, NonCandidateSendRtpModuleNotUsedForRemb) {
-  rtc::ScopedFakeClock clock;
-  PacketRouter packet_router;
-  NiceMock<MockRtpRtcpWithRembTracking> module;
-
-  constexpr bool remb_candidate = false;
-
-  packet_router.AddSendRtpModule(&module, remb_candidate);
-  EXPECT_FALSE(module.REMB());
-
-  constexpr uint32_t bitrate_estimate = 456;
-  const std::vector<uint32_t> ssrcs = {1234};
-  EXPECT_CALL(module, SetREMBData(_, _)).Times(0);
-  clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1000));
-  packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
-
-  // Test tear-down
-  packet_router.RemoveSendRtpModule(&module);
-}
-
-TEST(PacketRouterRembTest, CandidateSendRtpModuleUsedForRemb) {
-  rtc::ScopedFakeClock clock;
-  PacketRouter packet_router;
-  NiceMock<MockRtpRtcpWithRembTracking> module;
-
-  constexpr bool remb_candidate = true;
-
-  packet_router.AddSendRtpModule(&module, remb_candidate);
-  EXPECT_TRUE(module.REMB());
-
-  constexpr uint32_t bitrate_estimate = 456;
-  const std::vector<uint32_t> ssrcs = {1234};
-  EXPECT_CALL(module, SetREMBData(bitrate_estimate, ssrcs)).Times(1);
-  clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1000));
-  packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
-
-  // Test tear-down
-  packet_router.RemoveSendRtpModule(&module);
-}
-
-TEST(PacketRouterRembTest, NonCandidateReceiveRtpModuleNotUsedForRemb) {
-  rtc::ScopedFakeClock clock;
-  PacketRouter packet_router;
-  NiceMock<MockRtpRtcpWithRembTracking> module;
-
-  constexpr bool remb_candidate = false;
-
-  packet_router.AddReceiveRtpModule(&module, remb_candidate);
-  ASSERT_FALSE(module.REMB());
-
-  constexpr uint32_t bitrate_estimate = 456;
-  const std::vector<uint32_t> ssrcs = {1234};
-  EXPECT_CALL(module, SetREMBData(_, _)).Times(0);
-  clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1000));
-  packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
-
-  // Test tear-down
-  packet_router.RemoveReceiveRtpModule(&module);
-}
-
-TEST(PacketRouterRembTest, CandidateReceiveRtpModuleUsedForRemb) {
-  rtc::ScopedFakeClock clock;
-  PacketRouter packet_router;
-  NiceMock<MockRtpRtcpWithRembTracking> module;
-
-  constexpr bool remb_candidate = true;
-
-  packet_router.AddReceiveRtpModule(&module, remb_candidate);
-  EXPECT_TRUE(module.REMB());
-
-  constexpr uint32_t bitrate_estimate = 456;
-  const std::vector<uint32_t> ssrcs = {1234};
-  EXPECT_CALL(module, SetREMBData(bitrate_estimate, ssrcs)).Times(1);
-  clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1000));
-  packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
-
-  // Test tear-down
-  packet_router.RemoveReceiveRtpModule(&module);
-}
-
-TEST(PacketRouterRembTest,
-     SendCandidatePreferredOverReceiveCandidate_SendModuleAddedFirst) {
-  rtc::ScopedFakeClock clock;
-  PacketRouter packet_router;
-  NiceMock<MockRtpRtcpWithRembTracking> send_module;
-  NiceMock<MockRtpRtcpWithRembTracking> receive_module;
-
-  constexpr bool remb_candidate = true;
-
-  // Send module added - activated.
-  packet_router.AddSendRtpModule(&send_module, remb_candidate);
-  ASSERT_TRUE(send_module.REMB());
-
-  // Receive module added - the send module remains the active one.
-  packet_router.AddReceiveRtpModule(&receive_module, remb_candidate);
-  EXPECT_TRUE(send_module.REMB());
-  EXPECT_FALSE(receive_module.REMB());
-
-  constexpr uint32_t bitrate_estimate = 456;
-  const std::vector<uint32_t> ssrcs = {1234};
-  EXPECT_CALL(send_module, SetREMBData(bitrate_estimate, ssrcs)).Times(1);
-  EXPECT_CALL(receive_module, SetREMBData(_, _)).Times(0);
-
-  clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1000));
-  packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
-
-  // Test tear-down
-  packet_router.RemoveReceiveRtpModule(&receive_module);
-  packet_router.RemoveSendRtpModule(&send_module);
-}
-
-TEST(PacketRouterRembTest,
-     SendCandidatePreferredOverReceiveCandidate_ReceiveModuleAddedFirst) {
-  rtc::ScopedFakeClock clock;
-  PacketRouter packet_router;
-  NiceMock<MockRtpRtcpWithRembTracking> send_module;
-  NiceMock<MockRtpRtcpWithRembTracking> receive_module;
-
-  constexpr bool remb_candidate = true;
-
-  // Receive module added - activated.
-  packet_router.AddReceiveRtpModule(&receive_module, remb_candidate);
-  ASSERT_TRUE(receive_module.REMB());
-
-  // Send module added - replaces receive module as active.
-  packet_router.AddSendRtpModule(&send_module, remb_candidate);
-  EXPECT_FALSE(receive_module.REMB());
-  EXPECT_TRUE(send_module.REMB());
-
-  constexpr uint32_t bitrate_estimate = 456;
-  const std::vector<uint32_t> ssrcs = {1234};
-  EXPECT_CALL(send_module, SetREMBData(bitrate_estimate, ssrcs)).Times(1);
-  EXPECT_CALL(receive_module, SetREMBData(_, _)).Times(0);
-
-  clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1000));
-  packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
-
-  // Test tear-down
-  packet_router.RemoveReceiveRtpModule(&receive_module);
-  packet_router.RemoveSendRtpModule(&send_module);
-}
-
-TEST(PacketRouterRembTest, ReceiveModuleTakesOverWhenLastSendModuleRemoved) {
-  rtc::ScopedFakeClock clock;
-  PacketRouter packet_router;
-  NiceMock<MockRtpRtcpWithRembTracking> send_module;
-  NiceMock<MockRtpRtcpWithRembTracking> receive_module;
-
-  constexpr bool remb_candidate = true;
-
-  // Send module active, receive module inactive.
-  packet_router.AddSendRtpModule(&send_module, remb_candidate);
-  packet_router.AddReceiveRtpModule(&receive_module, remb_candidate);
-  ASSERT_TRUE(send_module.REMB());
-  ASSERT_FALSE(receive_module.REMB());
-
-  // Send module removed - receive module becomes active.
-  packet_router.RemoveSendRtpModule(&send_module);
-  EXPECT_FALSE(send_module.REMB());
-  EXPECT_TRUE(receive_module.REMB());
-  constexpr uint32_t bitrate_estimate = 456;
-  const std::vector<uint32_t> ssrcs = {1234};
-  EXPECT_CALL(send_module, SetREMBData(_, _)).Times(0);
-  EXPECT_CALL(receive_module, SetREMBData(bitrate_estimate, ssrcs)).Times(1);
-
-  clock.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1000));
-  packet_router.OnReceiveBitrateChanged(ssrcs, bitrate_estimate);
-
-  // Test tear-down
-  packet_router.RemoveReceiveRtpModule(&receive_module);
-}
-
-}  // namespace webrtc
diff --git a/modules/remote_bitrate_estimator/BUILD.gn b/modules/remote_bitrate_estimator/BUILD.gn
deleted file mode 100644
index 72e6f1d..0000000
--- a/modules/remote_bitrate_estimator/BUILD.gn
+++ /dev/null
@@ -1,263 +0,0 @@
-# Copyright (c) 2014 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.
-
-import("../../webrtc.gni")
-
-rtc_static_library("remote_bitrate_estimator") {
-  # TODO(mbonadei): Remove (bugs.webrtc.org/6828)
-  # Errors on cyclic dependency with:
-  # rtp_rtcp:rtp_rtcp if enabled.
-  check_includes = false
-
-  sources = [
-    "aimd_rate_control.cc",
-    "aimd_rate_control.h",
-    "bwe_defines.cc",
-    "include/bwe_defines.h",
-    "include/remote_bitrate_estimator.h",
-    "include/send_time_history.h",
-    "inter_arrival.cc",
-    "inter_arrival.h",
-    "overuse_detector.cc",
-    "overuse_detector.h",
-    "overuse_estimator.cc",
-    "overuse_estimator.h",
-    "remote_bitrate_estimator_abs_send_time.cc",
-    "remote_bitrate_estimator_abs_send_time.h",
-    "remote_bitrate_estimator_single_stream.cc",
-    "remote_bitrate_estimator_single_stream.h",
-    "remote_estimator_proxy.cc",
-    "remote_estimator_proxy.h",
-    "send_time_history.cc",
-    "test/bwe_test_logging.h",
-  ]
-
-  if (rtc_enable_bwe_test_logging) {
-    defines = [ "BWE_TEST_LOGGING_COMPILE_TIME_ENABLE=1" ]
-    sources += [ "test/bwe_test_logging.cc" ]
-  } else {
-    defines = [ "BWE_TEST_LOGGING_COMPILE_TIME_ENABLE=0" ]
-  }
-
-  if (!build_with_chromium && is_clang) {
-    # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-    suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-  }
-
-  deps = [
-    "../..:webrtc_common",
-    "../../rtc_base:rtc_base",
-    "../../rtc_base:rtc_base_approved",
-    "../../system_wrappers",
-  ]
-}
-
-if (!build_with_chromium) {
-  rtc_source_set("bwe_rtp") {
-    testonly = true
-    sources = [
-      "tools/bwe_rtp.cc",
-      "tools/bwe_rtp.h",
-    ]
-    deps = [
-      ":remote_bitrate_estimator",
-      "../../rtc_base:rtc_base_approved",
-      "../../test:rtp_test_utils",
-      "../rtp_rtcp:rtp_rtcp",
-    ]
-    if (is_clang) {
-      # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-    }
-  }
-}
-
-if (rtc_include_tests) {
-  rtc_static_library("bwe_simulator_lib") {
-    testonly = true
-    sources = [
-      "test/bbr_paced_sender.cc",
-      "test/bbr_paced_sender.h",
-      "test/bwe.cc",
-      "test/bwe.h",
-      "test/bwe_test.cc",
-      "test/bwe_test.h",
-      "test/bwe_test_baselinefile.cc",
-      "test/bwe_test_baselinefile.h",
-      "test/bwe_test_fileutils.cc",
-      "test/bwe_test_fileutils.h",
-      "test/bwe_test_framework.cc",
-      "test/bwe_test_framework.h",
-      "test/bwe_test_logging.h",
-      "test/estimators/bbr.cc",
-      "test/estimators/bbr.h",
-      "test/estimators/congestion_window.cc",
-      "test/estimators/congestion_window.h",
-      "test/estimators/max_bandwidth_filter.cc",
-      "test/estimators/max_bandwidth_filter.h",
-      "test/estimators/min_rtt_filter.h",
-      "test/estimators/nada.cc",
-      "test/estimators/nada.h",
-      "test/estimators/remb.cc",
-      "test/estimators/remb.h",
-      "test/estimators/send_side.cc",
-      "test/estimators/send_side.h",
-      "test/estimators/tcp.cc",
-      "test/estimators/tcp.h",
-      "test/metric_recorder.cc",
-      "test/metric_recorder.h",
-      "test/packet.h",
-      "test/packet_receiver.cc",
-      "test/packet_receiver.h",
-      "test/packet_sender.cc",
-      "test/packet_sender.h",
-    ]
-
-    if (rtc_enable_bwe_test_logging) {
-      defines = [ "BWE_TEST_LOGGING_COMPILE_TIME_ENABLE=1" ]
-    } else {
-      defines = [ "BWE_TEST_LOGGING_COMPILE_TIME_ENABLE=0" ]
-    }
-
-    if (!build_with_chromium && is_clang) {
-      # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-    }
-
-    if (is_win) {
-      cflags = [
-        # TODO(kjellander): Bug 261: fix this warning.
-        "/wd4373",  # virtual function override.
-      ]
-    }
-
-    deps = [
-      ":remote_bitrate_estimator",
-      "..:module_api",
-      "../..:webrtc_common",
-      "../../api:optional",
-      "../../rtc_base:gtest_prod",
-      "../../rtc_base:rtc_base",
-      "../../rtc_base:rtc_base_approved",
-      "../../system_wrappers",
-      "../../test:test_support",
-      "../../voice_engine",
-      "../bitrate_controller",
-      "../congestion_controller",
-      "../pacing",
-      "../rtp_rtcp",
-      "//testing/gmock",
-      "//testing/gtest",
-    ]
-  }
-
-  rtc_source_set("remote_bitrate_estimator_perf_tests") {
-    testonly = true
-
-    # Skip restricting visibility on mobile platforms since the tests on those
-    # gets additional generated targets which would require many lines here to
-    # cover (which would be confusing to read and hard to maintain).
-    if (!is_android && !is_ios) {
-      visibility = [ "../..:webrtc_perf_tests" ]
-    }
-    sources = [
-      "remote_bitrate_estimators_test.cc",
-    ]
-    deps = [
-      ":bwe_simulator_lib",
-      ":remote_bitrate_estimator",
-      "../../rtc_base:rtc_base_approved",
-      "../../test:test_support",
-    ]
-    if (!build_with_chromium && is_clang) {
-      # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-    }
-  }
-
-  rtc_source_set("remote_bitrate_estimator_unittests") {
-    testonly = true
-
-    # Skip restricting visibility on mobile platforms since the tests on those
-    # gets additional generated targets which would require many lines here to
-    # cover (which would be confusing to read and hard to maintain).
-    if (!is_android && !is_ios) {
-      visibility = [ "..:modules_unittests" ]
-    }
-    sources = [
-      "aimd_rate_control_unittest.cc",
-      "inter_arrival_unittest.cc",
-      "overuse_detector_unittest.cc",
-      "remote_bitrate_estimator_abs_send_time_unittest.cc",
-      "remote_bitrate_estimator_single_stream_unittest.cc",
-      "remote_bitrate_estimator_unittest_helper.cc",
-      "remote_bitrate_estimator_unittest_helper.h",
-      "remote_estimator_proxy_unittest.cc",
-      "send_time_history_unittest.cc",
-      "test/bwe_test_framework_unittest.cc",
-      "test/bwe_unittest.cc",
-      "test/estimators/congestion_window_unittest.cc",
-      "test/estimators/max_bandwidth_filter_unittest.cc",
-      "test/estimators/min_rtt_filter_unittest.cc",
-      "test/estimators/nada_unittest.cc",
-      "test/metric_recorder_unittest.cc",
-    ]
-    deps = [
-      ":bwe_simulator_lib",
-      ":remote_bitrate_estimator",
-      "../..:webrtc_common",
-      "../../rtc_base:rtc_base",
-      "../../rtc_base:rtc_base_approved",
-      "../../system_wrappers:system_wrappers",
-      "../../test:field_trial",
-      "../../test:test_support",
-      "../pacing:pacing",
-      "../rtp_rtcp:rtp_rtcp",
-      "//testing/gmock",
-    ]
-    if (is_win) {
-      cflags = [
-        # TODO(kjellander): bugs.webrtc.org/261: Fix this warning.
-        "/wd4373",  # virtual function override.
-      ]
-    }
-    if (!build_with_chromium && is_clang) {
-      # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-    }
-  }
-
-  rtc_test("bwe_simulations_tests") {
-    testonly = true
-
-    sources = [
-      "bwe_simulations.cc",
-    ]
-    deps = [
-      ":bwe_simulator_lib",
-      ":remote_bitrate_estimator",
-      "../..:webrtc_common",
-      "../../rtc_base:rtc_base_approved",
-      "../../test:test_main",
-      "//testing/gmock",
-      "//testing/gtest",
-    ]
-
-    if (!build_with_chromium && is_clang) {
-      # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-    }
-
-    if (is_win) {
-      cflags = [
-        # TODO(kjellander): bugs.webrtc.org/261: Fix this warning.
-        "/wd4373",  # virtual function override.
-      ]
-    }
-  }
-}
diff --git a/modules/remote_bitrate_estimator/DEPS b/modules/remote_bitrate_estimator/DEPS
deleted file mode 100644
index 6d0079d..0000000
--- a/modules/remote_bitrate_estimator/DEPS
+++ /dev/null
@@ -1,10 +0,0 @@
-include_rules = [
-  "+webrtc/logging/rtc_event_log",
-  "+webrtc/system_wrappers",
-]
-
-specific_include_rules = {
-  "nada\.h": [
-    "+webrtc/voice_engine",
-  ],
-}
diff --git a/modules/remote_bitrate_estimator/OWNERS b/modules/remote_bitrate_estimator/OWNERS
deleted file mode 100644
index 51132bd..0000000
--- a/modules/remote_bitrate_estimator/OWNERS
+++ /dev/null
@@ -1,10 +0,0 @@
-stefan@webrtc.org
-terelius@webrtc.org
-asapersson@webrtc.org
-mflodman@webrtc.org
-philipel@webrtc.org
-
-# These are for the common case of adding or renaming files. If you're doing
-# structural changes, please get a review from a reviewer in this file.
-per-file *.gn=*
-per-file *.gni=*
diff --git a/modules/remote_bitrate_estimator/aimd_rate_control.cc b/modules/remote_bitrate_estimator/aimd_rate_control.cc
deleted file mode 100644
index dc6f02d..0000000
--- a/modules/remote_bitrate_estimator/aimd_rate_control.cc
+++ /dev/null
@@ -1,327 +0,0 @@
-/*
- *  Copyright (c) 2014 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/remote_bitrate_estimator/aimd_rate_control.h"
-
-#include <algorithm>
-#include <cassert>
-#include <cmath>
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/safe_minmax.h"
-
-#include "webrtc/modules/remote_bitrate_estimator/overuse_detector.h"
-#include "webrtc/modules/remote_bitrate_estimator/include/bwe_defines.h"
-#include "webrtc/modules/remote_bitrate_estimator/include/remote_bitrate_estimator.h"
-#include "webrtc/modules/remote_bitrate_estimator/test/bwe_test_logging.h"
-
-namespace webrtc {
-
-static const int64_t kDefaultRttMs = 200;
-static const int64_t kMaxFeedbackIntervalMs = 1000;
-
-AimdRateControl::AimdRateControl()
-    : min_configured_bitrate_bps_(congestion_controller::GetMinBitrateBps()),
-      max_configured_bitrate_bps_(30000000),
-      current_bitrate_bps_(max_configured_bitrate_bps_),
-      avg_max_bitrate_kbps_(-1.0f),
-      var_max_bitrate_kbps_(0.4f),
-      rate_control_state_(kRcHold),
-      rate_control_region_(kRcMaxUnknown),
-      time_last_bitrate_change_(-1),
-      time_first_incoming_estimate_(-1),
-      bitrate_is_initialized_(false),
-      beta_(0.85f),
-      rtt_(kDefaultRttMs),
-      in_experiment_(!AdaptiveThresholdExperimentIsDisabled()) {}
-
-AimdRateControl::~AimdRateControl() {}
-
-void AimdRateControl::SetStartBitrate(int start_bitrate_bps) {
-  current_bitrate_bps_ = start_bitrate_bps;
-  bitrate_is_initialized_ = true;
-}
-
-void AimdRateControl::SetMinBitrate(int min_bitrate_bps) {
-  min_configured_bitrate_bps_ = min_bitrate_bps;
-  current_bitrate_bps_ = std::max<int>(min_bitrate_bps, current_bitrate_bps_);
-}
-
-bool AimdRateControl::ValidEstimate() const {
-  return bitrate_is_initialized_;
-}
-
-int64_t AimdRateControl::GetFeedbackInterval() const {
-  // Estimate how often we can send RTCP if we allocate up to 5% of bandwidth
-  // to feedback.
-  static const int kRtcpSize = 80;
-  const int64_t interval = static_cast<int64_t>(
-      kRtcpSize * 8.0 * 1000.0 / (0.05 * current_bitrate_bps_) + 0.5);
-  const int64_t kMinFeedbackIntervalMs = 200;
-  return rtc::SafeClamp(interval, kMinFeedbackIntervalMs,
-                        kMaxFeedbackIntervalMs);
-}
-
-bool AimdRateControl::TimeToReduceFurther(int64_t time_now,
-                                          uint32_t incoming_bitrate_bps) const {
-  const int64_t bitrate_reduction_interval =
-      std::max<int64_t>(std::min<int64_t>(rtt_, 200), 10);
-  if (time_now - time_last_bitrate_change_ >= bitrate_reduction_interval) {
-    return true;
-  }
-  if (ValidEstimate()) {
-    // TODO(terelius/holmer): Investigate consequences of increasing
-    // the threshold to 0.95 * LatestEstimate().
-    const uint32_t threshold = static_cast<uint32_t> (0.5 * LatestEstimate());
-    return incoming_bitrate_bps < threshold;
-  }
-  return false;
-}
-
-uint32_t AimdRateControl::LatestEstimate() const {
-  return current_bitrate_bps_;
-}
-
-void AimdRateControl::SetRtt(int64_t rtt) {
-  rtt_ = rtt;
-}
-
-uint32_t AimdRateControl::Update(const RateControlInput* input,
-                                 int64_t now_ms) {
-  RTC_CHECK(input);
-
-  // Set the initial bit rate value to what we're receiving the first half
-  // second.
-  if (!bitrate_is_initialized_) {
-    const int64_t kInitializationTimeMs = 5000;
-    RTC_DCHECK_LE(kBitrateWindowMs, kInitializationTimeMs);
-    if (time_first_incoming_estimate_ < 0) {
-      if (input->incoming_bitrate)
-        time_first_incoming_estimate_ = now_ms;
-    } else if (now_ms - time_first_incoming_estimate_ > kInitializationTimeMs &&
-               input->incoming_bitrate) {
-      current_bitrate_bps_ = *input->incoming_bitrate;
-      bitrate_is_initialized_ = true;
-    }
-  }
-
-  current_bitrate_bps_ = ChangeBitrate(current_bitrate_bps_, *input, now_ms);
-  return current_bitrate_bps_;
-}
-
-void AimdRateControl::SetEstimate(int bitrate_bps, int64_t now_ms) {
-  bitrate_is_initialized_ = true;
-  current_bitrate_bps_ = ClampBitrate(bitrate_bps, bitrate_bps);
-  time_last_bitrate_change_ = now_ms;
-}
-
-int AimdRateControl::GetNearMaxIncreaseRateBps() const {
-  RTC_DCHECK_GT(current_bitrate_bps_, 0);
-  double bits_per_frame = static_cast<double>(current_bitrate_bps_) / 30.0;
-  double packets_per_frame = std::ceil(bits_per_frame / (8.0 * 1200.0));
-  double avg_packet_size_bits = bits_per_frame / packets_per_frame;
-
-  // Approximate the over-use estimator delay to 100 ms.
-  const int64_t response_time = in_experiment_ ? (rtt_ + 100) * 2 : rtt_ + 100;
-  constexpr double kMinIncreaseRateBps = 4000;
-  return static_cast<int>(std::max(
-      kMinIncreaseRateBps, (avg_packet_size_bits * 1000) / response_time));
-}
-
-int AimdRateControl::GetExpectedBandwidthPeriodMs() const {
-  constexpr int kMinPeriodMs = 500;
-  constexpr int kMaxPeriodMs = 50000;
-
-  int increase_rate = GetNearMaxIncreaseRateBps();
-  if (!last_decrease_)
-    return kMinPeriodMs;
-
-  return std::min(kMaxPeriodMs,
-                  std::max<int>(1000 * static_cast<int64_t>(*last_decrease_) /
-                                    increase_rate,
-                                kMinPeriodMs));
-}
-
-uint32_t AimdRateControl::ChangeBitrate(uint32_t new_bitrate_bps,
-                                        const RateControlInput& input,
-                                        int64_t now_ms) {
-  uint32_t incoming_bitrate_bps =
-      input.incoming_bitrate.value_or(current_bitrate_bps_);
-
-  // An over-use should always trigger us to reduce the bitrate, even though
-  // we have not yet established our first estimate. By acting on the over-use,
-  // we will end up with a valid estimate.
-  if (!bitrate_is_initialized_ &&
-      input.bw_state != BandwidthUsage::kBwOverusing)
-    return current_bitrate_bps_;
-
-  ChangeState(input, now_ms);
-  // Calculated here because it's used in multiple places.
-  const float incoming_bitrate_kbps = incoming_bitrate_bps / 1000.0f;
-  // Calculate the max bit rate std dev given the normalized
-  // variance and the current incoming bit rate.
-  const float std_max_bit_rate = sqrt(var_max_bitrate_kbps_ *
-                                      avg_max_bitrate_kbps_);
-  switch (rate_control_state_) {
-    case kRcHold:
-      break;
-
-    case kRcIncrease:
-      if (avg_max_bitrate_kbps_ >= 0 &&
-          incoming_bitrate_kbps >
-              avg_max_bitrate_kbps_ + 3 * std_max_bit_rate) {
-        ChangeRegion(kRcMaxUnknown);
-        avg_max_bitrate_kbps_ = -1.0;
-      }
-      if (rate_control_region_ == kRcNearMax) {
-        uint32_t additive_increase_bps =
-            AdditiveRateIncrease(now_ms, time_last_bitrate_change_);
-        new_bitrate_bps += additive_increase_bps;
-      } else {
-        uint32_t multiplicative_increase_bps = MultiplicativeRateIncrease(
-            now_ms, time_last_bitrate_change_, new_bitrate_bps);
-        new_bitrate_bps += multiplicative_increase_bps;
-      }
-
-      time_last_bitrate_change_ = now_ms;
-      break;
-
-    case kRcDecrease:
-      // Set bit rate to something slightly lower than max
-      // to get rid of any self-induced delay.
-      new_bitrate_bps =
-          static_cast<uint32_t>(beta_ * incoming_bitrate_bps + 0.5);
-      if (new_bitrate_bps > current_bitrate_bps_) {
-        // Avoid increasing the rate when over-using.
-        if (rate_control_region_ != kRcMaxUnknown) {
-          new_bitrate_bps = static_cast<uint32_t>(
-              beta_ * avg_max_bitrate_kbps_ * 1000 + 0.5f);
-        }
-        new_bitrate_bps = std::min(new_bitrate_bps, current_bitrate_bps_);
-      }
-      ChangeRegion(kRcNearMax);
-
-      if (bitrate_is_initialized_ &&
-          incoming_bitrate_bps < current_bitrate_bps_) {
-        constexpr float kDegradationFactor = 0.9f;
-        if (new_bitrate_bps <
-            kDegradationFactor * beta_ * current_bitrate_bps_) {
-          // If bitrate decreases more than a normal back off after overuse, it
-          // indicates a real network degradation. We do not let such a decrease
-          // to determine the bandwidth estimation period.
-          last_decrease_ = rtc::Optional<int>();
-        } else {
-          last_decrease_ = rtc::Optional<int>(
-              current_bitrate_bps_ - new_bitrate_bps);
-        }
-      }
-      if (incoming_bitrate_kbps <
-          avg_max_bitrate_kbps_ - 3 * std_max_bit_rate) {
-        avg_max_bitrate_kbps_ = -1.0f;
-      }
-
-      bitrate_is_initialized_ = true;
-      UpdateMaxBitRateEstimate(incoming_bitrate_kbps);
-      // Stay on hold until the pipes are cleared.
-      rate_control_state_ = kRcHold;
-      time_last_bitrate_change_ = now_ms;
-      break;
-
-    default:
-      assert(false);
-  }
-  return ClampBitrate(new_bitrate_bps, incoming_bitrate_bps);
-}
-
-uint32_t AimdRateControl::ClampBitrate(uint32_t new_bitrate_bps,
-                                       uint32_t incoming_bitrate_bps) const {
-  // Don't change the bit rate if the send side is too far off.
-  // We allow a bit more lag at very low rates to not too easily get stuck if
-  // the encoder produces uneven outputs.
-  const uint32_t max_bitrate_bps =
-      static_cast<uint32_t>(1.5f * incoming_bitrate_bps) + 10000;
-  if (new_bitrate_bps > current_bitrate_bps_ &&
-      new_bitrate_bps > max_bitrate_bps) {
-    new_bitrate_bps = std::max(current_bitrate_bps_, max_bitrate_bps);
-  }
-  new_bitrate_bps = std::max(new_bitrate_bps, min_configured_bitrate_bps_);
-  return new_bitrate_bps;
-}
-
-uint32_t AimdRateControl::MultiplicativeRateIncrease(
-    int64_t now_ms, int64_t last_ms, uint32_t current_bitrate_bps) const {
-  double alpha = 1.08;
-  if (last_ms > -1) {
-    auto time_since_last_update_ms =
-        rtc::SafeMin<int64_t>(now_ms - last_ms, 1000);
-    alpha = pow(alpha,  time_since_last_update_ms / 1000.0);
-  }
-  uint32_t multiplicative_increase_bps = std::max(
-      current_bitrate_bps * (alpha - 1.0), 1000.0);
-  return multiplicative_increase_bps;
-}
-
-uint32_t AimdRateControl::AdditiveRateIncrease(int64_t now_ms,
-                                               int64_t last_ms) const {
-  return static_cast<uint32_t>((now_ms - last_ms) *
-                               GetNearMaxIncreaseRateBps() / 1000);
-}
-
-void AimdRateControl::UpdateMaxBitRateEstimate(float incoming_bitrate_kbps) {
-  const float alpha = 0.05f;
-  if (avg_max_bitrate_kbps_ == -1.0f) {
-    avg_max_bitrate_kbps_ = incoming_bitrate_kbps;
-  } else {
-    avg_max_bitrate_kbps_ = (1 - alpha) * avg_max_bitrate_kbps_ +
-        alpha * incoming_bitrate_kbps;
-  }
-  // Estimate the max bit rate variance and normalize the variance
-  // with the average max bit rate.
-  const float norm = std::max(avg_max_bitrate_kbps_, 1.0f);
-  var_max_bitrate_kbps_ = (1 - alpha) * var_max_bitrate_kbps_ +
-      alpha * (avg_max_bitrate_kbps_ - incoming_bitrate_kbps) *
-          (avg_max_bitrate_kbps_ - incoming_bitrate_kbps) / norm;
-  // 0.4 ~= 14 kbit/s at 500 kbit/s
-  if (var_max_bitrate_kbps_ < 0.4f) {
-    var_max_bitrate_kbps_ = 0.4f;
-  }
-  // 2.5f ~= 35 kbit/s at 500 kbit/s
-  if (var_max_bitrate_kbps_ > 2.5f) {
-    var_max_bitrate_kbps_ = 2.5f;
-  }
-}
-
-void AimdRateControl::ChangeState(const RateControlInput& input,
-                                  int64_t now_ms) {
-  switch (input.bw_state) {
-    case BandwidthUsage::kBwNormal:
-      if (rate_control_state_ == kRcHold) {
-        time_last_bitrate_change_ = now_ms;
-        rate_control_state_ = kRcIncrease;
-      }
-      break;
-    case BandwidthUsage::kBwOverusing:
-      if (rate_control_state_ != kRcDecrease) {
-        rate_control_state_ = kRcDecrease;
-      }
-      break;
-    case BandwidthUsage::kBwUnderusing:
-      rate_control_state_ = kRcHold;
-      break;
-    default:
-      assert(false);
-  }
-}
-
-void AimdRateControl::ChangeRegion(RateControlRegion region) {
-  rate_control_region_ = region;
-}
-
-}  // namespace webrtc
diff --git a/modules/remote_bitrate_estimator/aimd_rate_control.h b/modules/remote_bitrate_estimator/aimd_rate_control.h
deleted file mode 100644
index 24cb4d3..0000000
--- a/modules/remote_bitrate_estimator/aimd_rate_control.h
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- *  Copyright (c) 2014 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_REMOTE_BITRATE_ESTIMATOR_AIMD_RATE_CONTROL_H_
-#define WEBRTC_MODULES_REMOTE_BITRATE_ESTIMATOR_AIMD_RATE_CONTROL_H_
-
-#include "webrtc/modules/remote_bitrate_estimator/include/bwe_defines.h"
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace webrtc {
-
-// A rate control implementation based on additive increases of
-// bitrate when no over-use is detected and multiplicative decreases when
-// over-uses are detected. When we think the available bandwidth has changes or
-// is unknown, we will switch to a "slow-start mode" where we increase
-// multiplicatively.
-class AimdRateControl {
- public:
-  AimdRateControl();
-  ~AimdRateControl();
-
-  // Returns true if there is a valid estimate of the incoming bitrate, false
-  // otherwise.
-  bool ValidEstimate() const;
-  void SetStartBitrate(int start_bitrate_bps);
-  void SetMinBitrate(int min_bitrate_bps);
-  int64_t GetFeedbackInterval() const;
-  // Returns true if the bitrate estimate hasn't been changed for more than
-  // an RTT, or if the incoming_bitrate is less than half of the current
-  // estimate. Should be used to decide if we should reduce the rate further
-  // when over-using.
-  bool TimeToReduceFurther(int64_t time_now,
-                           uint32_t incoming_bitrate_bps) const;
-  uint32_t LatestEstimate() const;
-  void SetRtt(int64_t rtt);
-  uint32_t Update(const RateControlInput* input, int64_t now_ms);
-  void SetEstimate(int bitrate_bps, int64_t now_ms);
-
-  // Returns the increase rate when used bandwidth is near the link capacity.
-  int GetNearMaxIncreaseRateBps() const;
-  // Returns the expected time between overuse signals (assuming steady state).
-  int GetExpectedBandwidthPeriodMs() const;
-
- private:
-  // Update the target bitrate according based on, among other things,
-  // the current rate control state, the current target bitrate and the incoming
-  // bitrate. When in the "increase" state the bitrate will be increased either
-  // additively or multiplicatively depending on the rate control region. When
-  // in the "decrease" state the bitrate will be decreased to slightly below the
-  // incoming bitrate. When in the "hold" state the bitrate will be kept
-  // constant to allow built up queues to drain.
-  uint32_t ChangeBitrate(uint32_t current_bitrate,
-                         const RateControlInput& input,
-                         int64_t now_ms);
-  // Clamps new_bitrate_bps to within the configured min bitrate and a linear
-  // function of the incoming bitrate, so that the new bitrate can't grow too
-  // large compared to the bitrate actually being received by the other end.
-  uint32_t ClampBitrate(uint32_t new_bitrate_bps,
-                        uint32_t incoming_bitrate_bps) const;
-  uint32_t MultiplicativeRateIncrease(int64_t now_ms, int64_t last_ms,
-                                      uint32_t current_bitrate_bps) const;
-  uint32_t AdditiveRateIncrease(int64_t now_ms, int64_t last_ms) const;
-  void UpdateChangePeriod(int64_t now_ms);
-  void UpdateMaxBitRateEstimate(float incoming_bit_rate_kbps);
-  void ChangeState(const RateControlInput& input, int64_t now_ms);
-  void ChangeRegion(RateControlRegion region);
-
-  uint32_t min_configured_bitrate_bps_;
-  uint32_t max_configured_bitrate_bps_;
-  uint32_t current_bitrate_bps_;
-  float avg_max_bitrate_kbps_;
-  float var_max_bitrate_kbps_;
-  RateControlState rate_control_state_;
-  RateControlRegion rate_control_region_;
-  int64_t time_last_bitrate_change_;
-  int64_t time_first_incoming_estimate_;
-  bool bitrate_is_initialized_;
-  float beta_;
-  int64_t rtt_;
-  bool in_experiment_;
-  rtc::Optional<int> last_decrease_;
-};
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_REMOTE_BITRATE_ESTIMATOR_AIMD_RATE_CONTROL_H_
diff --git a/modules/remote_bitrate_estimator/aimd_rate_control_unittest.cc b/modules/remote_bitrate_estimator/aimd_rate_control_unittest.cc
deleted file mode 100644
index cf6b5a5..0000000
--- a/modules/remote_bitrate_estimator/aimd_rate_control_unittest.cc
+++ /dev/null
@@ -1,197 +0,0 @@
-/*
- *  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 <memory>
-
-#include "webrtc/modules/remote_bitrate_estimator/aimd_rate_control.h"
-#include "webrtc/system_wrappers/include/clock.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-namespace {
-
-constexpr int64_t kClockInitialTime = 123456;
-
-constexpr int kMinBwePeriodMs = 500;
-constexpr int kMaxBwePeriodMs = 50000;
-
-// After an overuse, we back off to 85% to the received bitrate.
-constexpr double kFractionAfterOveruse = 0.85;
-
-struct AimdRateControlStates {
-  std::unique_ptr<AimdRateControl> aimd_rate_control;
-  std::unique_ptr<SimulatedClock> simulated_clock;
-};
-
-AimdRateControlStates CreateAimdRateControlStates() {
-  AimdRateControlStates states;
-  states.aimd_rate_control.reset(new AimdRateControl());
-  states.simulated_clock.reset(new SimulatedClock(kClockInitialTime));
-  return states;
-}
-
-void UpdateRateControl(const AimdRateControlStates& states,
-                       const BandwidthUsage& bandwidth_usage,
-                       int bitrate,
-                       int64_t now_ms) {
-  RateControlInput input(bandwidth_usage, rtc::Optional<uint32_t>(bitrate),
-                         now_ms);
-  states.aimd_rate_control->Update(&input, now_ms);
-}
-
-}  // namespace
-
-TEST(AimdRateControlTest, MinNearMaxIncreaseRateOnLowBandwith) {
-  auto states = CreateAimdRateControlStates();
-  constexpr int kBitrate = 30000;
-  states.aimd_rate_control->SetEstimate(
-      kBitrate, states.simulated_clock->TimeInMilliseconds());
-  EXPECT_EQ(4000, states.aimd_rate_control->GetNearMaxIncreaseRateBps());
-}
-
-TEST(AimdRateControlTest, NearMaxIncreaseRateIs5kbpsOn90kbpsAnd200msRtt) {
-  auto states = CreateAimdRateControlStates();
-  constexpr int kBitrate = 90000;
-  states.aimd_rate_control->SetEstimate(
-      kBitrate, states.simulated_clock->TimeInMilliseconds());
-  EXPECT_EQ(5000, states.aimd_rate_control->GetNearMaxIncreaseRateBps());
-}
-
-TEST(AimdRateControlTest, NearMaxIncreaseRateIs5kbpsOn60kbpsAnd100msRtt) {
-  auto states = CreateAimdRateControlStates();
-  constexpr int kBitrate = 60000;
-  states.aimd_rate_control->SetEstimate(
-      kBitrate, states.simulated_clock->TimeInMilliseconds());
-  states.aimd_rate_control->SetRtt(100);
-  EXPECT_EQ(5000, states.aimd_rate_control->GetNearMaxIncreaseRateBps());
-}
-
-TEST(AimdRateControlTest, GetIncreaseRateAndBandwidthPeriod) {
-  auto states = CreateAimdRateControlStates();
-  constexpr int kBitrate = 300000;
-  states.aimd_rate_control->SetEstimate(
-      kBitrate, states.simulated_clock->TimeInMilliseconds());
-  UpdateRateControl(states, BandwidthUsage::kBwOverusing, kBitrate,
-                    states.simulated_clock->TimeInMilliseconds());
-  EXPECT_NEAR(14000, states.aimd_rate_control->GetNearMaxIncreaseRateBps(),
-              1000);
-  EXPECT_EQ(kMinBwePeriodMs,
-            states.aimd_rate_control->GetExpectedBandwidthPeriodMs());
-}
-
-TEST(AimdRateControlTest, BweLimitedByAckedBitrate) {
-  auto states = CreateAimdRateControlStates();
-  constexpr int kAckedBitrate = 10000;
-  states.aimd_rate_control->SetEstimate(
-      kAckedBitrate, states.simulated_clock->TimeInMilliseconds());
-  while (states.simulated_clock->TimeInMilliseconds() - kClockInitialTime <
-         20000) {
-    UpdateRateControl(states, BandwidthUsage::kBwNormal, kAckedBitrate,
-                      states.simulated_clock->TimeInMilliseconds());
-    states.simulated_clock->AdvanceTimeMilliseconds(100);
-  }
-  ASSERT_TRUE(states.aimd_rate_control->ValidEstimate());
-  EXPECT_EQ(static_cast<uint32_t>(1.5 * kAckedBitrate + 10000),
-            states.aimd_rate_control->LatestEstimate());
-}
-
-TEST(AimdRateControlTest, BweNotLimitedByDecreasingAckedBitrate) {
-  auto states = CreateAimdRateControlStates();
-  constexpr int kAckedBitrate = 100000;
-  states.aimd_rate_control->SetEstimate(
-      kAckedBitrate, states.simulated_clock->TimeInMilliseconds());
-  while (states.simulated_clock->TimeInMilliseconds() - kClockInitialTime <
-         20000) {
-    UpdateRateControl(states, BandwidthUsage::kBwNormal, kAckedBitrate,
-                      states.simulated_clock->TimeInMilliseconds());
-    states.simulated_clock->AdvanceTimeMilliseconds(100);
-  }
-  ASSERT_TRUE(states.aimd_rate_control->ValidEstimate());
-  // If the acked bitrate decreases the BWE shouldn't be reduced to 1.5x
-  // what's being acked, but also shouldn't get to increase more.
-  uint32_t prev_estimate = states.aimd_rate_control->LatestEstimate();
-  UpdateRateControl(states, BandwidthUsage::kBwNormal, kAckedBitrate / 2,
-                    states.simulated_clock->TimeInMilliseconds());
-  uint32_t new_estimate = states.aimd_rate_control->LatestEstimate();
-  EXPECT_NEAR(new_estimate, static_cast<uint32_t>(1.5 * kAckedBitrate + 10000),
-              2000);
-  EXPECT_EQ(new_estimate, prev_estimate);
-}
-
-TEST(AimdRateControlTest, MinPeriodUntilFirstOveruse) {
-  auto states = CreateAimdRateControlStates();
-  states.aimd_rate_control->SetStartBitrate(300000);
-  EXPECT_EQ(kMinBwePeriodMs,
-            states.aimd_rate_control->GetExpectedBandwidthPeriodMs());
-  states.simulated_clock->AdvanceTimeMilliseconds(100);
-  UpdateRateControl(states, BandwidthUsage::kBwOverusing, 280000,
-                    states.simulated_clock->TimeInMilliseconds());
-  EXPECT_NE(kMinBwePeriodMs,
-            states.aimd_rate_control->GetExpectedBandwidthPeriodMs());
-}
-
-TEST(AimdRateControlTest, ExpectedPeriodAfter20kbpsDropAnd5kbpsIncrease) {
-  auto states = CreateAimdRateControlStates();
-  constexpr int kInitialBitrate = 110000;
-  states.aimd_rate_control->SetEstimate(
-      kInitialBitrate, states.simulated_clock->TimeInMilliseconds());
-  states.simulated_clock->AdvanceTimeMilliseconds(100);
-  // Make the bitrate drop by 20 kbps to get to 90 kbps.
-  // The rate increase at 90 kbps should be 5 kbps, so the period should be 4 s.
-  constexpr int kAckedBitrate =
-      (kInitialBitrate - 20000) / kFractionAfterOveruse;
-  UpdateRateControl(states, BandwidthUsage::kBwOverusing, kAckedBitrate,
-                    states.simulated_clock->TimeInMilliseconds());
-  EXPECT_EQ(5000, states.aimd_rate_control->GetNearMaxIncreaseRateBps());
-  EXPECT_EQ(4000, states.aimd_rate_control->GetExpectedBandwidthPeriodMs());
-}
-
-TEST(AimdRateControlTest, MinPeriodAfterLargeBitrateDecrease) {
-  auto states = CreateAimdRateControlStates();
-  constexpr int kInitialBitrate = 110000;
-  states.aimd_rate_control->SetEstimate(
-      kInitialBitrate, states.simulated_clock->TimeInMilliseconds());
-  states.simulated_clock->AdvanceTimeMilliseconds(100);
-  // Make such a large drop in bitrate that should be treated as network
-  // degradation.
-  constexpr int kAckedBitrate = kInitialBitrate * 3 / 4 / kFractionAfterOveruse;
-  UpdateRateControl(states, BandwidthUsage::kBwOverusing, kAckedBitrate,
-                    states.simulated_clock->TimeInMilliseconds());
-  EXPECT_EQ(kMinBwePeriodMs,
-            states.aimd_rate_control->GetExpectedBandwidthPeriodMs());
-}
-
-TEST(AimdRateControlTest, BandwidthPeriodIsNotBelowMin) {
-  auto states = CreateAimdRateControlStates();
-  constexpr int kInitialBitrate = 10000;
-  states.aimd_rate_control->SetEstimate(
-      kInitialBitrate, states.simulated_clock->TimeInMilliseconds());
-  states.simulated_clock->AdvanceTimeMilliseconds(100);
-  // Make a small (1.5 kbps) bitrate drop to 8.5 kbps.
-  UpdateRateControl(states, BandwidthUsage::kBwOverusing, kInitialBitrate - 1,
-                    states.simulated_clock->TimeInMilliseconds());
-  EXPECT_EQ(kMinBwePeriodMs,
-            states.aimd_rate_control->GetExpectedBandwidthPeriodMs());
-}
-
-TEST(AimdRateControlTest, BandwidthPeriodIsNotAboveMax) {
-  auto states = CreateAimdRateControlStates();
-  constexpr int kInitialBitrate = 50000000;
-  states.aimd_rate_control->SetEstimate(
-      kInitialBitrate, states.simulated_clock->TimeInMilliseconds());
-  states.simulated_clock->AdvanceTimeMilliseconds(100);
-  // Make a large (10 Mbps) bitrate drop to 10 kbps.
-  constexpr int kAckedBitrate = 40000000 / kFractionAfterOveruse;
-  UpdateRateControl(states, BandwidthUsage::kBwOverusing, kAckedBitrate,
-                    states.simulated_clock->TimeInMilliseconds());
-  EXPECT_EQ(kMaxBwePeriodMs,
-            states.aimd_rate_control->GetExpectedBandwidthPeriodMs());
-}
-
-}  // namespace webrtc
diff --git a/modules/remote_bitrate_estimator/bwe_defines.cc b/modules/remote_bitrate_estimator/bwe_defines.cc
deleted file mode 100644
index 15eafc2..0000000
--- a/modules/remote_bitrate_estimator/bwe_defines.cc
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- *  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/remote_bitrate_estimator/include/bwe_defines.h"
-#include "webrtc/system_wrappers/include/field_trial.h"
-
-namespace webrtc {
-
-const char kBweTypeHistogram[] = "WebRTC.BWE.Types";
-
-namespace congestion_controller {
-int GetMinBitrateBps() {
-  constexpr int kAudioMinBitrateBps = 5000;
-  constexpr int kMinBitrateBps = 10000;
-  if (webrtc::field_trial::IsEnabled("WebRTC-Audio-SendSideBwe")) {
-    return kAudioMinBitrateBps;
-  }
-  return kMinBitrateBps;
-}
-
-}  // namespace congestion_controller
-
-RateControlInput::RateControlInput(
-    BandwidthUsage bw_state,
-    const rtc::Optional<uint32_t>& incoming_bitrate,
-    double noise_var)
-    : bw_state(bw_state),
-      incoming_bitrate(incoming_bitrate),
-      noise_var(noise_var) {}
-
-RateControlInput::~RateControlInput() = default;
-
-}  // namespace webrtc
diff --git a/modules/remote_bitrate_estimator/bwe_simulations.cc b/modules/remote_bitrate_estimator/bwe_simulations.cc
deleted file mode 100644
index 92d5a55..0000000
--- a/modules/remote_bitrate_estimator/bwe_simulations.cc
+++ /dev/null
@@ -1,554 +0,0 @@
-/*
- *  Copyright (c) 2014 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 <memory>
-
-#include "webrtc/modules/remote_bitrate_estimator/include/remote_bitrate_estimator.h"
-#include "webrtc/modules/remote_bitrate_estimator/test/bwe_test.h"
-#include "webrtc/modules/remote_bitrate_estimator/test/packet_receiver.h"
-#include "webrtc/modules/remote_bitrate_estimator/test/packet_sender.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/testsupport/fileutils.h"
-
-namespace webrtc {
-namespace testing {
-namespace bwe {
-
-// This test fixture is used to instantiate tests running with adaptive video
-// senders.
-class BweSimulation : public BweTest,
-                      public ::testing::TestWithParam<BandwidthEstimatorType> {
- public:
-  BweSimulation()
-      : BweTest(), random_(Clock::GetRealTimeClock()->TimeInMicroseconds()) {}
-  virtual ~BweSimulation() {}
-
- protected:
-  void SetUp() override {
-    BweTest::SetUp();
-    VerboseLogging(true);
-  }
-
-  Random random_;
-
- private:
-  RTC_DISALLOW_COPY_AND_ASSIGN(BweSimulation);
-};
-
-INSTANTIATE_TEST_CASE_P(VideoSendersTest,
-                        BweSimulation,
-                        ::testing::Values(kRembEstimator,
-                                          kSendSideEstimator,
-                                          kNadaEstimator,
-                                          kBbrEstimator));
-
-TEST_P(BweSimulation, SprintUplinkTest) {
-  AdaptiveVideoSource source(0, 30, 300, 0, 0);
-  VideoSender sender(&uplink_, &source, GetParam());
-  RateCounterFilter counter1(&uplink_, 0, "sender_output",
-                             bwe_names[GetParam()]);
-  TraceBasedDeliveryFilter filter(&uplink_, 0, "link_capacity");
-  RateCounterFilter counter2(&uplink_, 0, "Receiver", bwe_names[GetParam()]);
-  PacketReceiver receiver(&uplink_, 0, GetParam(), true, true);
-  ASSERT_TRUE(filter.Init(test::ResourcePath("sprint-uplink", "rx")));
-  RunFor(60 * 1000);
-}
-
-TEST_P(BweSimulation, Verizon4gDownlinkTest) {
-  AdaptiveVideoSource source(0, 30, 300, 0, 0);
-  VideoSender sender(&downlink_, &source, GetParam());
-  RateCounterFilter counter1(&downlink_, 0, "sender_output",
-                             std::string() + bwe_names[GetParam()] + "_up");
-  TraceBasedDeliveryFilter filter(&downlink_, 0, "link_capacity");
-  RateCounterFilter counter2(&downlink_, 0, "Receiver",
-                             std::string() + bwe_names[GetParam()] + "_down");
-  PacketReceiver receiver(&downlink_, 0, GetParam(), true, true);
-  ASSERT_TRUE(filter.Init(test::ResourcePath("verizon4g-downlink", "rx")));
-  RunFor(22 * 60 * 1000);
-}
-
-TEST_P(BweSimulation, Choke1000kbps500kbps1000kbpsBiDirectional) {
-  const int kFlowIds[] = {0, 1};
-  const size_t kNumFlows = sizeof(kFlowIds) / sizeof(kFlowIds[0]);
-
-  AdaptiveVideoSource source(kFlowIds[0], 30, 300, 0, 0);
-  VideoSender sender(&uplink_, &source, GetParam());
-  ChokeFilter choke(&uplink_, kFlowIds[0]);
-  RateCounterFilter counter(&uplink_, kFlowIds[0], "Receiver_0",
-                            bwe_names[GetParam()]);
-  PacketReceiver receiver(&uplink_, kFlowIds[0], GetParam(), true, false);
-
-  AdaptiveVideoSource source2(kFlowIds[1], 30, 300, 0, 0);
-  VideoSender sender2(&downlink_, &source2, GetParam());
-  ChokeFilter choke2(&downlink_, kFlowIds[1]);
-  DelayFilter delay(&downlink_, CreateFlowIds(kFlowIds, kNumFlows));
-  RateCounterFilter counter2(&downlink_, kFlowIds[1], "Receiver_1",
-                             bwe_names[GetParam()]);
-  PacketReceiver receiver2(&downlink_, kFlowIds[1], GetParam(), true, false);
-
-  choke2.set_capacity_kbps(500);
-  delay.SetOneWayDelayMs(0);
-
-  choke.set_capacity_kbps(1000);
-  choke.set_max_delay_ms(500);
-  RunFor(60 * 1000);
-  choke.set_capacity_kbps(500);
-  RunFor(60 * 1000);
-  choke.set_capacity_kbps(1000);
-  RunFor(60 * 1000);
-}
-
-TEST_P(BweSimulation, Choke1000kbps500kbps1000kbps) {
-  AdaptiveVideoSource source(0, 30, 300, 0, 0);
-  VideoSender sender(&uplink_, &source, GetParam());
-  ChokeFilter choke(&uplink_, 0);
-  RateCounterFilter counter(&uplink_, 0, "Receiver", bwe_names[GetParam()]);
-  PacketReceiver receiver(&uplink_, 0, GetParam(), true, false);
-
-  choke.set_capacity_kbps(1000);
-  choke.set_max_delay_ms(500);
-  RunFor(60 * 1000);
-  choke.set_capacity_kbps(500);
-  RunFor(60 * 1000);
-  choke.set_capacity_kbps(1000);
-  RunFor(60 * 1000);
-}
-
-TEST_P(BweSimulation, SimulationsCompiled) {
-  AdaptiveVideoSource source(0, 30, 300, 0, 0);
-  PacedVideoSender sender(&uplink_, &source, GetParam());
-  int zero = 0;
-  // CreateFlowIds() doesn't support passing int as a flow id, so we pass
-  // pointer instead.
-  DelayFilter delay(&uplink_, CreateFlowIds(&zero, 1));
-  delay.SetOneWayDelayMs(100);
-  ChokeFilter filter(&uplink_, 0);
-  RateCounterFilter counter(&uplink_, 0, "Receiver", bwe_names[GetParam()]);
-  PacketReceiver receiver(&uplink_, 0, GetParam(), true, true);
-  filter.set_max_delay_ms(500);
-  filter.set_capacity_kbps(1000);
-  RunFor(60 * 1000);
-  filter.set_capacity_kbps(500);
-  RunFor(50 * 1000);
-  filter.set_capacity_kbps(1000);
-  RunFor(60 * 1000);
-  filter.set_capacity_kbps(200);
-  RunFor(60 * 1000);
-  filter.set_capacity_kbps(50);
-  RunFor(60 * 1000);
-  filter.set_capacity_kbps(200);
-  RunFor(60 * 1000);
-  filter.set_capacity_kbps(500);
-  RunFor(60 * 1000);
-  filter.set_capacity_kbps(300);
-  RunFor(60 * 1000);
-  filter.set_capacity_kbps(1000);
-  RunFor(60 * 1000);
-  const int kStartingCapacityKbps = 150;
-  const int kEndingCapacityKbps = 1500;
-  const int kStepKbps = 5;
-  const int kStepTimeMs = 1000;
-  for (int i = kStartingCapacityKbps; i <= kEndingCapacityKbps;
-       i += kStepKbps) {
-    filter.set_capacity_kbps(i);
-    RunFor(kStepTimeMs);
-  }
-  for (int i = kEndingCapacityKbps; i >= kStartingCapacityKbps;
-       i -= kStepKbps) {
-    filter.set_capacity_kbps(i);
-    RunFor(kStepTimeMs);
-  }
-  filter.set_capacity_kbps(150);
-  RunFor(120 * 1000);
-  filter.set_capacity_kbps(500);
-  RunFor(60 * 1000);
-}
-
-TEST_P(BweSimulation, PacerChoke1000kbps500kbps1000kbps) {
-  AdaptiveVideoSource source(0, 30, 300, 0, 0);
-  PacedVideoSender sender(&uplink_, &source, GetParam());
-  const int kFlowId = 0;
-  // CreateFlowIds() doesn't support passing int as a flow id, so we pass
-  // pointer instead.
-  DelayFilter delay(&uplink_, CreateFlowIds(&kFlowId, 1));
-  delay.SetOneWayDelayMs(100);
-  ChokeFilter filter(&uplink_, 0);
-  RateCounterFilter counter(&uplink_, 0, "Receiver", bwe_names[GetParam()]);
-  PacketReceiver receiver(&uplink_, 0, GetParam(), true, true);
-  filter.set_capacity_kbps(1000);
-  filter.set_max_delay_ms(500);
-  RunFor(60 * 1000);
-  filter.set_capacity_kbps(500);
-  RunFor(60 * 1000);
-  filter.set_capacity_kbps(1000);
-  RunFor(60 * 1000);
-}
-
-TEST_P(BweSimulation, PacerChoke10000kbps) {
-  PeriodicKeyFrameSource source(0, 30, 300, 0, 0, 1000);
-  PacedVideoSender sender(&uplink_, &source, GetParam());
-  ChokeFilter filter(&uplink_, 0);
-  RateCounterFilter counter(&uplink_, 0, "Receiver", bwe_names[GetParam()]);
-  PacketReceiver receiver(&uplink_, 0, GetParam(), true, true);
-  filter.set_capacity_kbps(10000);
-  filter.set_max_delay_ms(500);
-  RunFor(60 * 1000);
-}
-
-TEST_P(BweSimulation, PacerChoke200kbps30kbps200kbps) {
-  AdaptiveVideoSource source(0, 30, 300, 0, 0);
-  PacedVideoSender sender(&uplink_, &source, GetParam());
-  ChokeFilter filter(&uplink_, 0);
-  RateCounterFilter counter(&uplink_, 0, "Receiver", bwe_names[GetParam()]);
-  PacketReceiver receiver(&uplink_, 0, GetParam(), true, true);
-  filter.set_capacity_kbps(200);
-  filter.set_max_delay_ms(500);
-  RunFor(60 * 1000);
-  filter.set_capacity_kbps(30);
-  RunFor(60 * 1000);
-  filter.set_capacity_kbps(200);
-  RunFor(60 * 1000);
-}
-
-TEST_P(BweSimulation, Choke200kbps30kbps200kbps) {
-  AdaptiveVideoSource source(0, 30, 300, 0, 0);
-  VideoSender sender(&uplink_, &source, GetParam());
-  ChokeFilter filter(&uplink_, 0);
-  RateCounterFilter counter(&uplink_, 0, "Receiver", bwe_names[GetParam()]);
-  PacketReceiver receiver(&uplink_, 0, GetParam(), true, true);
-  filter.set_capacity_kbps(200);
-  filter.set_max_delay_ms(500);
-  RunFor(60 * 1000);
-  filter.set_capacity_kbps(30);
-  RunFor(60 * 1000);
-  filter.set_capacity_kbps(200);
-  RunFor(60 * 1000);
-}
-
-TEST_P(BweSimulation, PacerChoke50kbps15kbps50kbps) {
-  AdaptiveVideoSource source(0, 30, 300, 0, 0);
-  PacedVideoSender sender(&uplink_, &source, GetParam());
-  ChokeFilter filter(&uplink_, 0);
-  RateCounterFilter counter(&uplink_, 0, "Receiver", bwe_names[GetParam()]);
-  PacketReceiver receiver(&uplink_, 0, GetParam(), true, true);
-  filter.set_capacity_kbps(50);
-  filter.set_max_delay_ms(500);
-  RunFor(60 * 1000);
-  filter.set_capacity_kbps(15);
-  RunFor(60 * 1000);
-  filter.set_capacity_kbps(50);
-  RunFor(60 * 1000);
-}
-
-TEST_P(BweSimulation, Choke50kbps15kbps50kbps) {
-  AdaptiveVideoSource source(0, 30, 300, 0, 0);
-  VideoSender sender(&uplink_, &source, GetParam());
-  ChokeFilter filter(&uplink_, 0);
-  RateCounterFilter counter(&uplink_, 0, "Receiver", bwe_names[GetParam()]);
-  PacketReceiver receiver(&uplink_, 0, GetParam(), true, true);
-  filter.set_capacity_kbps(50);
-  filter.set_max_delay_ms(500);
-  RunFor(60 * 1000);
-  filter.set_capacity_kbps(15);
-  RunFor(60 * 1000);
-  filter.set_capacity_kbps(50);
-  RunFor(60 * 1000);
-}
-
-TEST_P(BweSimulation, GoogleWifiTrace3Mbps) {
-  AdaptiveVideoSource source(0, 30, 300, 0, 0);
-  VideoSender sender(&uplink_, &source, GetParam());
-  RateCounterFilter counter1(&uplink_, 0, "sender_output",
-                             bwe_names[GetParam()]);
-  TraceBasedDeliveryFilter filter(&uplink_, 0, "link_capacity");
-  filter.set_max_delay_ms(500);
-  RateCounterFilter counter2(&uplink_, 0, "Receiver", bwe_names[GetParam()]);
-  PacketReceiver receiver(&uplink_, 0, GetParam(), true, true);
-  ASSERT_TRUE(filter.Init(test::ResourcePath("google-wifi-3mbps", "rx")));
-  RunFor(300 * 1000);
-}
-
-TEST_P(BweSimulation, LinearIncreasingCapacity) {
-  PeriodicKeyFrameSource source(0, 30, 300, 0, 0, 1000000);
-  PacedVideoSender sender(&uplink_, &source, GetParam());
-  ChokeFilter filter(&uplink_, 0);
-  RateCounterFilter counter(&uplink_, 0, "Receiver", bwe_names[GetParam()]);
-  PacketReceiver receiver(&uplink_, 0, GetParam(), true, true);
-  filter.set_max_delay_ms(500);
-  const int kStartingCapacityKbps = 150;
-  const int kEndingCapacityKbps = 1500;
-  const int kStepKbps = 5;
-  const int kStepTimeMs = 1000;
-
-  for (int i = kStartingCapacityKbps; i <= kEndingCapacityKbps;
-       i += kStepKbps) {
-    filter.set_capacity_kbps(i);
-    RunFor(kStepTimeMs);
-  }
-}
-
-TEST_P(BweSimulation, LinearDecreasingCapacity) {
-  PeriodicKeyFrameSource source(0, 30, 300, 0, 0, 1000000);
-  PacedVideoSender sender(&uplink_, &source, GetParam());
-  ChokeFilter filter(&uplink_, 0);
-  RateCounterFilter counter(&uplink_, 0, "Receiver", bwe_names[GetParam()]);
-  PacketReceiver receiver(&uplink_, 0, GetParam(), true, true);
-  filter.set_max_delay_ms(500);
-  const int kStartingCapacityKbps = 1500;
-  const int kEndingCapacityKbps = 150;
-  const int kStepKbps = -5;
-  const int kStepTimeMs = 1000;
-
-  for (int i = kStartingCapacityKbps; i >= kEndingCapacityKbps;
-       i += kStepKbps) {
-    filter.set_capacity_kbps(i);
-    RunFor(kStepTimeMs);
-  }
-}
-
-TEST_P(BweSimulation, PacerGoogleWifiTrace3Mbps) {
-  PeriodicKeyFrameSource source(0, 30, 300, 0, 0, 1000);
-  PacedVideoSender sender(&uplink_, &source, GetParam());
-  int kFlowId = 0;
-  // CreateFlowIds() doesn't support passing int as a flow id, so we pass
-  // pointer instead.
-  DelayFilter delay(&uplink_, CreateFlowIds(&kFlowId, 1));
-  delay.SetOneWayDelayMs(100);
-  RateCounterFilter counter1(&uplink_, 0, "sender_output",
-                             bwe_names[GetParam()]);
-  TraceBasedDeliveryFilter filter(&uplink_, 0, "link_capacity");
-  filter.set_max_delay_ms(500);
-  RateCounterFilter counter2(&uplink_, 0, "Receiver", bwe_names[GetParam()]);
-  PacketReceiver receiver(&uplink_, 0, GetParam(), true, true);
-  ASSERT_TRUE(filter.Init(test::ResourcePath("google-wifi-3mbps", "rx")));
-  RunFor(300 * 1000);
-}
-
-TEST_P(BweSimulation, PacerGoogleWifiTrace3MbpsLowFramerate) {
-  PeriodicKeyFrameSource source(0, 5, 300, 0, 0, 1000);
-  PacedVideoSender sender(&uplink_, &source, GetParam());
-  RateCounterFilter counter1(&uplink_, 0, "sender_output",
-                             bwe_names[GetParam()]);
-  TraceBasedDeliveryFilter filter(&uplink_, 0, "link_capacity");
-  filter.set_max_delay_ms(500);
-  RateCounterFilter counter2(&uplink_, 0, "Receiver", bwe_names[GetParam()]);
-  PacketReceiver receiver(&uplink_, 0, GetParam(), true, true);
-  ASSERT_TRUE(filter.Init(test::ResourcePath("google-wifi-3mbps", "rx")));
-  RunFor(300 * 1000);
-}
-
-TEST_P(BweSimulation, SelfFairnessTest) {
-  Random prng(Clock::GetRealTimeClock()->TimeInMicroseconds());
-  const int kAllFlowIds[] = {0, 1, 2, 3};
-  const size_t kNumFlows = sizeof(kAllFlowIds) / sizeof(kAllFlowIds[0]);
-  std::unique_ptr<VideoSource> sources[kNumFlows];
-  std::unique_ptr<VideoSender> senders[kNumFlows];
-  for (size_t i = 0; i < kNumFlows; ++i) {
-    // Streams started 20 seconds apart to give them different advantage when
-    // competing for the bandwidth.
-    sources[i].reset(new AdaptiveVideoSource(kAllFlowIds[i], 30, 300, 0,
-                                             i * prng.Rand(39999)));
-    senders[i].reset(new VideoSender(&uplink_, sources[i].get(), GetParam()));
-  }
-
-  ChokeFilter choke(&uplink_, CreateFlowIds(kAllFlowIds, kNumFlows));
-  choke.set_capacity_kbps(1000);
-
-  std::unique_ptr<RateCounterFilter> rate_counters[kNumFlows];
-  for (size_t i = 0; i < kNumFlows; ++i) {
-    rate_counters[i].reset(
-        new RateCounterFilter(&uplink_, CreateFlowIds(&kAllFlowIds[i], 1),
-                              "Receiver", bwe_names[GetParam()]));
-  }
-
-  RateCounterFilter total_utilization(
-      &uplink_, CreateFlowIds(kAllFlowIds, kNumFlows), "total_utilization",
-      "Total_link_utilization");
-
-  std::unique_ptr<PacketReceiver> receivers[kNumFlows];
-  for (size_t i = 0; i < kNumFlows; ++i) {
-    receivers[i].reset(new PacketReceiver(&uplink_, kAllFlowIds[i], GetParam(),
-                                          i == 0, false));
-  }
-
-  RunFor(30 * 60 * 1000);
-}
-
-TEST_P(BweSimulation, PacedSelfFairness50msTest) {
-  const int64_t kAverageOffsetMs = 20 * 1000;
-  const int kNumRmcatFlows = 4;
-  int64_t offsets_ms[kNumRmcatFlows];
-  offsets_ms[0] = random_.Rand(2 * kAverageOffsetMs);
-  for (int i = 1; i < kNumRmcatFlows; ++i) {
-    offsets_ms[i] = offsets_ms[i - 1] + random_.Rand(2 * kAverageOffsetMs);
-  }
-  RunFairnessTest(GetParam(), kNumRmcatFlows, 0, 1000, 3000, 50, 50, 0,
-                  offsets_ms);
-}
-
-TEST_P(BweSimulation, PacedSelfFairness500msTest) {
-  const int64_t kAverageOffsetMs = 20 * 1000;
-  const int kNumRmcatFlows = 4;
-  int64_t offsets_ms[kNumRmcatFlows];
-  offsets_ms[0] = random_.Rand(2 * kAverageOffsetMs);
-  for (int i = 1; i < kNumRmcatFlows; ++i) {
-    offsets_ms[i] = offsets_ms[i - 1] + random_.Rand(2 * kAverageOffsetMs);
-  }
-  RunFairnessTest(GetParam(), kNumRmcatFlows, 0, 1000, 3000, 500, 50, 0,
-                  offsets_ms);
-}
-
-TEST_P(BweSimulation, PacedSelfFairness1000msTest) {
-  const int64_t kAverageOffsetMs = 20 * 1000;
-  const int kNumRmcatFlows = 4;
-  int64_t offsets_ms[kNumRmcatFlows];
-  offsets_ms[0] = random_.Rand(2 * kAverageOffsetMs);
-  for (int i = 1; i < kNumRmcatFlows; ++i) {
-    offsets_ms[i] = offsets_ms[i - 1] + random_.Rand(2 * kAverageOffsetMs);
-  }
-  RunFairnessTest(GetParam(), 4, 0, 1000, 3000, 1000, 50, 0, offsets_ms);
-}
-
-TEST_P(BweSimulation, TcpFairness50msTest) {
-  const int64_t kAverageOffsetMs = 20 * 1000;
-  int64_t offset_ms[] = {random_.Rand(2 * kAverageOffsetMs), 0};
-  RunFairnessTest(GetParam(), 1, 1, 1000, 2000, 50, 50, 0, offset_ms);
-}
-
-TEST_P(BweSimulation, TcpFairness500msTest) {
-  const int64_t kAverageOffsetMs = 20 * 1000;
-  int64_t offset_ms[] = {random_.Rand(2 * kAverageOffsetMs), 0};
-  RunFairnessTest(GetParam(), 1, 1, 1000, 2000, 500, 50, 0, offset_ms);
-}
-
-TEST_P(BweSimulation, TcpFairness1000msTest) {
-  const int kAverageOffsetMs = 20 * 1000;
-  int64_t offset_ms[] = {random_.Rand(2 * kAverageOffsetMs), 0};
-  RunFairnessTest(GetParam(), 1, 1, 1000, 2000, 1000, 50, 0, offset_ms);
-}
-
-// The following test cases begin with "Evaluation" as a reference to the
-// Internet draft https://tools.ietf.org/html/draft-ietf-rmcat-eval-test-01.
-
-TEST_P(BweSimulation, Evaluation1) {
-  RunVariableCapacity1SingleFlow(GetParam());
-}
-
-TEST_P(BweSimulation, Evaluation2) {
-  const size_t kNumFlows = 2;
-  RunVariableCapacity2MultipleFlows(GetParam(), kNumFlows);
-}
-
-TEST_P(BweSimulation, Evaluation3) {
-  RunBidirectionalFlow(GetParam());
-}
-
-TEST_P(BweSimulation, Evaluation4) {
-  RunSelfFairness(GetParam());
-}
-
-TEST_P(BweSimulation, Evaluation5) {
-  RunRoundTripTimeFairness(GetParam());
-}
-
-TEST_P(BweSimulation, Evaluation6) {
-  RunLongTcpFairness(GetParam());
-}
-
-// Different calls to the Evaluation7 will create the same FileSizes
-// and StartingTimes as long as the seeds remain unchanged. This is essential
-// when calling it with multiple estimators for comparison purposes.
-TEST_P(BweSimulation, Evaluation7) {
-  const int kNumTcpFiles = 10;
-  RunMultipleShortTcpFairness(GetParam(),
-                              BweTest::GetFileSizesBytes(kNumTcpFiles),
-                              BweTest::GetStartingTimesMs(kNumTcpFiles));
-}
-
-TEST_P(BweSimulation, Evaluation8) {
-  RunPauseResumeFlows(GetParam());
-}
-
-// Following test cases begin with "GccComparison" run the
-// evaluation test cases for both GCC and other calling RMCAT.
-
-TEST_P(BweSimulation, GccComparison1) {
-  RunVariableCapacity1SingleFlow(GetParam());
-  BweTest gcc_test(false);
-  gcc_test.RunVariableCapacity1SingleFlow(kSendSideEstimator);
-}
-
-TEST_P(BweSimulation, GccComparison2) {
-  const size_t kNumFlows = 2;
-  RunVariableCapacity2MultipleFlows(GetParam(), kNumFlows);
-  BweTest gcc_test(false);
-  gcc_test.RunVariableCapacity2MultipleFlows(kSendSideEstimator, kNumFlows);
-}
-
-TEST_P(BweSimulation, GccComparison3) {
-  RunBidirectionalFlow(GetParam());
-  BweTest gcc_test(false);
-  gcc_test.RunBidirectionalFlow(kSendSideEstimator);
-}
-
-TEST_P(BweSimulation, GccComparison4) {
-  RunSelfFairness(GetParam());
-  BweTest gcc_test(false);
-  gcc_test.RunSelfFairness(GetParam());
-}
-
-TEST_P(BweSimulation, GccComparison5) {
-  RunRoundTripTimeFairness(GetParam());
-  BweTest gcc_test(false);
-  gcc_test.RunRoundTripTimeFairness(kSendSideEstimator);
-}
-
-TEST_P(BweSimulation, GccComparison6) {
-  RunLongTcpFairness(GetParam());
-  BweTest gcc_test(false);
-  gcc_test.RunLongTcpFairness(kSendSideEstimator);
-}
-
-TEST_P(BweSimulation, GccComparison7) {
-  const int kNumTcpFiles = 10;
-
-  std::vector<int> tcp_file_sizes_bytes =
-      BweTest::GetFileSizesBytes(kNumTcpFiles);
-  std::vector<int64_t> tcp_starting_times_ms =
-      BweTest::GetStartingTimesMs(kNumTcpFiles);
-
-  RunMultipleShortTcpFairness(GetParam(), tcp_file_sizes_bytes,
-                              tcp_starting_times_ms);
-
-  BweTest gcc_test(false);
-  gcc_test.RunMultipleShortTcpFairness(kSendSideEstimator, tcp_file_sizes_bytes,
-                                       tcp_starting_times_ms);
-}
-
-TEST_P(BweSimulation, GccComparison8) {
-  RunPauseResumeFlows(GetParam());
-  BweTest gcc_test(false);
-  gcc_test.RunPauseResumeFlows(kSendSideEstimator);
-}
-
-TEST_P(BweSimulation, GccComparisonChoke) {
-  int array[] = {1000, 500, 1000};
-  std::vector<int> capacities_kbps(array, array + 3);
-  RunChoke(GetParam(), capacities_kbps);
-
-  BweTest gcc_test(false);
-  gcc_test.RunChoke(kSendSideEstimator, capacities_kbps);
-}
-
-}  // namespace bwe
-}  // namespace testing
-}  // namespace webrtc
-
diff --git a/modules/remote_bitrate_estimator/include/bwe_defines.h b/modules/remote_bitrate_estimator/include/bwe_defines.h
deleted file mode 100644
index 426dbb1..0000000
--- a/modules/remote_bitrate_estimator/include/bwe_defines.h
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- *  Copyright (c) 2012 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_REMOTE_BITRATE_ESTIMATOR_INCLUDE_BWE_DEFINES_H_
-#define WEBRTC_MODULES_REMOTE_BITRATE_ESTIMATOR_INCLUDE_BWE_DEFINES_H_
-
-#include "webrtc/api/optional.h"
-#include "webrtc/typedefs.h"
-
-#define BWE_MAX(a, b) ((a) > (b) ? (a) : (b))
-#define BWE_MIN(a, b) ((a) < (b) ? (a) : (b))
-
-namespace webrtc {
-
-namespace congestion_controller {
-int GetMinBitrateBps();
-}  // namespace congestion_controller
-
-static const int64_t kBitrateWindowMs = 1000;
-
-extern const char kBweTypeHistogram[];
-
-enum BweNames {
-  kReceiverNoExtension = 0,
-  kReceiverTOffset = 1,
-  kReceiverAbsSendTime = 2,
-  kSendSideTransportSeqNum = 3,
-  kBweNamesMax = 4
-};
-
-enum class BandwidthUsage {
-  kBwNormal = 0,
-  kBwUnderusing = 1,
-  kBwOverusing = 2,
-};
-
-enum RateControlState { kRcHold, kRcIncrease, kRcDecrease };
-
-enum RateControlRegion { kRcNearMax, kRcAboveMax, kRcMaxUnknown };
-
-struct RateControlInput {
-  RateControlInput(BandwidthUsage bw_state,
-                   const rtc::Optional<uint32_t>& incoming_bitrate,
-                   double noise_var);
-  ~RateControlInput();
-
-  BandwidthUsage bw_state;
-  rtc::Optional<uint32_t> incoming_bitrate;
-  double noise_var;
-};
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_REMOTE_BITRATE_ESTIMATOR_INCLUDE_BWE_DEFINES_H_
diff --git a/modules/remote_bitrate_estimator/include/remote_bitrate_estimator.h b/modules/remote_bitrate_estimator/include/remote_bitrate_estimator.h
deleted file mode 100644
index 0177b81..0000000
--- a/modules/remote_bitrate_estimator/include/remote_bitrate_estimator.h
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- *  Copyright (c) 2012 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.
- */
-
-// This class estimates the incoming available bandwidth.
-
-#ifndef WEBRTC_MODULES_REMOTE_BITRATE_ESTIMATOR_INCLUDE_REMOTE_BITRATE_ESTIMATOR_H_
-#define WEBRTC_MODULES_REMOTE_BITRATE_ESTIMATOR_INCLUDE_REMOTE_BITRATE_ESTIMATOR_H_
-
-#include <map>
-#include <vector>
-
-#include "webrtc/common_types.h"
-#include "webrtc/modules/include/module.h"
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-class Clock;
-
-// RemoteBitrateObserver is used to signal changes in bitrate estimates for
-// the incoming streams.
-class RemoteBitrateObserver {
- public:
-  // Called when a receive channel group has a new bitrate estimate for the
-  // incoming streams.
-  virtual void OnReceiveBitrateChanged(const std::vector<uint32_t>& ssrcs,
-                                       uint32_t bitrate) = 0;
-
-  virtual ~RemoteBitrateObserver() {}
-};
-
-// TODO(holmer): Remove when all implementations have been updated.
-struct ReceiveBandwidthEstimatorStats {};
-
-class RemoteBitrateEstimator : public CallStatsObserver, public Module {
- public:
-  ~RemoteBitrateEstimator() override {}
-
-  // Called for each incoming packet. Updates the incoming payload bitrate
-  // estimate and the over-use detector. If an over-use is detected the
-  // remote bitrate estimate will be updated. Note that |payload_size| is the
-  // packet size excluding headers.
-  // Note that |arrival_time_ms| can be of an arbitrary time base.
-  virtual void IncomingPacket(int64_t arrival_time_ms,
-                              size_t payload_size,
-                              const RTPHeader& header) = 0;
-
-  // Removes all data for |ssrc|.
-  virtual void RemoveStream(uint32_t ssrc) = 0;
-
-  // Returns true if a valid estimate exists and sets |bitrate_bps| to the
-  // estimated payload bitrate in bits per second. |ssrcs| is the list of ssrcs
-  // currently being received and of which the bitrate estimate is based upon.
-  virtual bool LatestEstimate(std::vector<uint32_t>* ssrcs,
-                              uint32_t* bitrate_bps) const = 0;
-
-  // TODO(holmer): Remove when all implementations have been updated.
-  virtual bool GetStats(ReceiveBandwidthEstimatorStats* output) const;
-
-  virtual void SetMinBitrate(int min_bitrate_bps) = 0;
-
- protected:
-  static const int64_t kProcessIntervalMs = 500;
-  static const int64_t kStreamTimeOutMs = 2000;
-};
-
-inline bool RemoteBitrateEstimator::GetStats(
-    ReceiveBandwidthEstimatorStats* output) const {
-  return false;
-}
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_REMOTE_BITRATE_ESTIMATOR_INCLUDE_REMOTE_BITRATE_ESTIMATOR_H_
diff --git a/modules/remote_bitrate_estimator/include/send_time_history.h b/modules/remote_bitrate_estimator/include/send_time_history.h
deleted file mode 100644
index bc3b8cc..0000000
--- a/modules/remote_bitrate_estimator/include/send_time_history.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- *  Copyright (c) 2015 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_REMOTE_BITRATE_ESTIMATOR_INCLUDE_SEND_TIME_HISTORY_H_
-#define WEBRTC_MODULES_REMOTE_BITRATE_ESTIMATOR_INCLUDE_SEND_TIME_HISTORY_H_
-
-#include <map>
-
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/rtc_base/basictypes.h"
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace webrtc {
-class Clock;
-struct PacketFeedback;
-
-class SendTimeHistory {
- public:
-  SendTimeHistory(const Clock* clock, int64_t packet_age_limit_ms);
-  ~SendTimeHistory();
-
-  // Cleanup old entries, then add new packet info with provided parameters.
-  void AddAndRemoveOld(const PacketFeedback& packet);
-
-  // Updates packet info identified by |sequence_number| with |send_time_ms|.
-  // Return false if not found.
-  bool OnSentPacket(uint16_t sequence_number, int64_t send_time_ms);
-
-  // Look up PacketFeedback for a sent packet, based on the sequence number, and
-  // populate all fields except for arrival_time. The packet parameter must
-  // thus be non-null and have the sequence_number field set.
-  bool GetFeedback(PacketFeedback* packet_feedback, bool remove);
-
-  size_t GetOutstandingBytes(uint16_t local_net_id,
-                             uint16_t remote_net_id) const;
-
- private:
-  const Clock* const clock_;
-  const int64_t packet_age_limit_ms_;
-  SequenceNumberUnwrapper seq_num_unwrapper_;
-  std::map<int64_t, PacketFeedback> history_;
-  rtc::Optional<int64_t> latest_acked_seq_num_;
-
-  RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(SendTimeHistory);
-};
-
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_REMOTE_BITRATE_ESTIMATOR_INCLUDE_SEND_TIME_HISTORY_H_
diff --git a/modules/remote_bitrate_estimator/inter_arrival.cc b/modules/remote_bitrate_estimator/inter_arrival.cc
deleted file mode 100644
index 81244f5..0000000
--- a/modules/remote_bitrate_estimator/inter_arrival.cc
+++ /dev/null
@@ -1,157 +0,0 @@
-/*
- *  Copyright (c) 2013 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/remote_bitrate_estimator/inter_arrival.h"
-
-#include <algorithm>
-#include <cassert>
-
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/rtc_base/logging.h"
-
-namespace webrtc {
-
-static const int kBurstDeltaThresholdMs = 5;
-
-InterArrival::InterArrival(uint32_t timestamp_group_length_ticks,
-                           double timestamp_to_ms_coeff,
-                           bool enable_burst_grouping)
-    : kTimestampGroupLengthTicks(timestamp_group_length_ticks),
-      current_timestamp_group_(),
-      prev_timestamp_group_(),
-      timestamp_to_ms_coeff_(timestamp_to_ms_coeff),
-      burst_grouping_(enable_burst_grouping),
-      num_consecutive_reordered_packets_(0) {}
-
-bool InterArrival::ComputeDeltas(uint32_t timestamp,
-                                 int64_t arrival_time_ms,
-                                 int64_t system_time_ms,
-                                 size_t packet_size,
-                                 uint32_t* timestamp_delta,
-                                 int64_t* arrival_time_delta_ms,
-                                 int* packet_size_delta) {
-  assert(timestamp_delta != NULL);
-  assert(arrival_time_delta_ms != NULL);
-  assert(packet_size_delta != NULL);
-  bool calculated_deltas = false;
-  if (current_timestamp_group_.IsFirstPacket()) {
-    // We don't have enough data to update the filter, so we store it until we
-    // have two frames of data to process.
-    current_timestamp_group_.timestamp = timestamp;
-    current_timestamp_group_.first_timestamp = timestamp;
-  } else if (!PacketInOrder(timestamp)) {
-    return false;
-  } else if (NewTimestampGroup(arrival_time_ms, timestamp)) {
-    // First packet of a later frame, the previous frame sample is ready.
-    if (prev_timestamp_group_.complete_time_ms >= 0) {
-      *timestamp_delta = current_timestamp_group_.timestamp -
-                         prev_timestamp_group_.timestamp;
-      *arrival_time_delta_ms = current_timestamp_group_.complete_time_ms -
-                               prev_timestamp_group_.complete_time_ms;
-      // Check system time differences to see if we have an unproportional jump
-      // in arrival time. In that case reset the inter-arrival computations.
-      int64_t system_time_delta_ms =
-          current_timestamp_group_.last_system_time_ms -
-          prev_timestamp_group_.last_system_time_ms;
-      if (*arrival_time_delta_ms - system_time_delta_ms >=
-          kArrivalTimeOffsetThresholdMs) {
-        LOG(LS_WARNING) << "The arrival time clock offset has changed (diff = "
-                        << *arrival_time_delta_ms - system_time_delta_ms
-                        << " ms), resetting.";
-        Reset();
-        return false;
-      }
-      if (*arrival_time_delta_ms < 0) {
-        // The group of packets has been reordered since receiving its local
-        // arrival timestamp.
-        ++num_consecutive_reordered_packets_;
-        if (num_consecutive_reordered_packets_ >= kReorderedResetThreshold) {
-          LOG(LS_WARNING) << "Packets are being reordered on the path from the "
-                             "socket to the bandwidth estimator. Ignoring this "
-                             "packet for bandwidth estimation, resetting.";
-          Reset();
-        }
-        return false;
-      } else {
-        num_consecutive_reordered_packets_ = 0;
-      }
-      assert(*arrival_time_delta_ms >= 0);
-      *packet_size_delta = static_cast<int>(current_timestamp_group_.size) -
-          static_cast<int>(prev_timestamp_group_.size);
-      calculated_deltas = true;
-    }
-    prev_timestamp_group_ = current_timestamp_group_;
-    // The new timestamp is now the current frame.
-    current_timestamp_group_.first_timestamp = timestamp;
-    current_timestamp_group_.timestamp = timestamp;
-    current_timestamp_group_.size = 0;
-  } else {
-    current_timestamp_group_.timestamp = LatestTimestamp(
-        current_timestamp_group_.timestamp, timestamp);
-  }
-  // Accumulate the frame size.
-  current_timestamp_group_.size += packet_size;
-  current_timestamp_group_.complete_time_ms = arrival_time_ms;
-  current_timestamp_group_.last_system_time_ms = system_time_ms;
-
-  return calculated_deltas;
-}
-
-bool InterArrival::PacketInOrder(uint32_t timestamp) {
-  if (current_timestamp_group_.IsFirstPacket()) {
-    return true;
-  } else {
-    // Assume that a diff which is bigger than half the timestamp interval
-    // (32 bits) must be due to reordering. This code is almost identical to
-    // that in IsNewerTimestamp() in module_common_types.h.
-    uint32_t timestamp_diff = timestamp -
-        current_timestamp_group_.first_timestamp;
-    return timestamp_diff < 0x80000000;
-  }
-}
-
-// Assumes that |timestamp| is not reordered compared to
-// |current_timestamp_group_|.
-bool InterArrival::NewTimestampGroup(int64_t arrival_time_ms,
-                                     uint32_t timestamp) const {
-  if (current_timestamp_group_.IsFirstPacket()) {
-    return false;
-  } else if (BelongsToBurst(arrival_time_ms, timestamp)) {
-    return false;
-  } else {
-    uint32_t timestamp_diff = timestamp -
-        current_timestamp_group_.first_timestamp;
-    return timestamp_diff > kTimestampGroupLengthTicks;
-  }
-}
-
-bool InterArrival::BelongsToBurst(int64_t arrival_time_ms,
-                                  uint32_t timestamp) const {
-  if (!burst_grouping_) {
-    return false;
-  }
-  assert(current_timestamp_group_.complete_time_ms >= 0);
-  int64_t arrival_time_delta_ms = arrival_time_ms -
-      current_timestamp_group_.complete_time_ms;
-  uint32_t timestamp_diff = timestamp - current_timestamp_group_.timestamp;
-  int64_t ts_delta_ms = timestamp_to_ms_coeff_ * timestamp_diff + 0.5;
-  if (ts_delta_ms == 0)
-    return true;
-  int propagation_delta_ms = arrival_time_delta_ms - ts_delta_ms;
-  return propagation_delta_ms < 0 &&
-      arrival_time_delta_ms <= kBurstDeltaThresholdMs;
-}
-
-void InterArrival::Reset() {
-  num_consecutive_reordered_packets_ = 0;
-  current_timestamp_group_ = TimestampGroup();
-  prev_timestamp_group_ = TimestampGroup();
-}
-}  // namespace webrtc
diff --git a/modules/remote_bitrate_estimator/inter_arrival.h b/modules/remote_bitrate_estimator/inter_arrival.h
deleted file mode 100644
index 0074269..0000000
--- a/modules/remote_bitrate_estimator/inter_arrival.h
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- *  Copyright (c) 2013 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_REMOTE_BITRATE_ESTIMATOR_INTER_ARRIVAL_H_
-#define WEBRTC_MODULES_REMOTE_BITRATE_ESTIMATOR_INTER_ARRIVAL_H_
-
-#include <cstddef>
-
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-// Helper class to compute the inter-arrival time delta and the size delta
-// between two timestamp groups. A timestamp is a 32 bit unsigned number with
-// a client defined rate.
-class InterArrival {
- public:
-  // After this many packet groups received out of order InterArrival will
-  // reset, assuming that clocks have made a jump.
-  static constexpr int kReorderedResetThreshold = 3;
-  static constexpr int64_t kArrivalTimeOffsetThresholdMs = 3000;
-
-  // A timestamp group is defined as all packets with a timestamp which are at
-  // most timestamp_group_length_ticks older than the first timestamp in that
-  // group.
-  InterArrival(uint32_t timestamp_group_length_ticks,
-               double timestamp_to_ms_coeff,
-               bool enable_burst_grouping);
-
-  // This function returns true if a delta was computed, or false if the current
-  // group is still incomplete or if only one group has been completed.
-  // |timestamp| is the timestamp.
-  // |arrival_time_ms| is the local time at which the packet arrived.
-  // |packet_size| is the size of the packet.
-  // |timestamp_delta| (output) is the computed timestamp delta.
-  // |arrival_time_delta_ms| (output) is the computed arrival-time delta.
-  // |packet_size_delta| (output) is the computed size delta.
-  bool ComputeDeltas(uint32_t timestamp,
-                     int64_t arrival_time_ms,
-                     int64_t system_time_ms,
-                     size_t packet_size,
-                     uint32_t* timestamp_delta,
-                     int64_t* arrival_time_delta_ms,
-                     int* packet_size_delta);
-
- private:
-  struct TimestampGroup {
-    TimestampGroup()
-        : size(0),
-          first_timestamp(0),
-          timestamp(0),
-          complete_time_ms(-1) {}
-
-    bool IsFirstPacket() const {
-      return complete_time_ms == -1;
-    }
-
-    size_t size;
-    uint32_t first_timestamp;
-    uint32_t timestamp;
-    int64_t complete_time_ms;
-    int64_t last_system_time_ms;
-  };
-
-  // Returns true if the packet with timestamp |timestamp| arrived in order.
-  bool PacketInOrder(uint32_t timestamp);
-
-  // Returns true if the last packet was the end of the current batch and the
-  // packet with |timestamp| is the first of a new batch.
-  bool NewTimestampGroup(int64_t arrival_time_ms, uint32_t timestamp) const;
-
-  bool BelongsToBurst(int64_t arrival_time_ms, uint32_t timestamp) const;
-
-  void Reset();
-
-  const uint32_t kTimestampGroupLengthTicks;
-  TimestampGroup current_timestamp_group_;
-  TimestampGroup prev_timestamp_group_;
-  double timestamp_to_ms_coeff_;
-  bool burst_grouping_;
-  int num_consecutive_reordered_packets_;
-
-  RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(InterArrival);
-};
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_REMOTE_BITRATE_ESTIMATOR_INTER_ARRIVAL_H_
diff --git a/modules/remote_bitrate_estimator/inter_arrival_unittest.cc b/modules/remote_bitrate_estimator/inter_arrival_unittest.cc
deleted file mode 100644
index 1076419..0000000
--- a/modules/remote_bitrate_estimator/inter_arrival_unittest.cc
+++ /dev/null
@@ -1,536 +0,0 @@
-/*
- *  Copyright (c) 2013 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 <memory>
-
-#include "webrtc/common_types.h"
-#include "webrtc/modules/remote_bitrate_estimator/inter_arrival.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-namespace testing {
-
-enum {
-  kTimestampGroupLengthUs = 5000,
-  kMinStep = 20,
-  kTriggerNewGroupUs = kTimestampGroupLengthUs + kMinStep,
-  kBurstThresholdMs = 5,
-  kAbsSendTimeFraction = 18,
-  kAbsSendTimeInterArrivalUpshift = 8,
-  kInterArrivalShift = kAbsSendTimeFraction + kAbsSendTimeInterArrivalUpshift,
-};
-
-const double kRtpTimestampToMs = 1.0 / 90.0;
-const double kAstToMs = 1000.0 / static_cast<double>(1 << kInterArrivalShift);
-
-class InterArrivalTest : public ::testing::Test {
- protected:
-  virtual void SetUp() {
-    inter_arrival_.reset(
-        new InterArrival(kTimestampGroupLengthUs / 1000, 1.0, true));
-    inter_arrival_rtp_.reset(new InterArrival(
-        MakeRtpTimestamp(kTimestampGroupLengthUs),
-        kRtpTimestampToMs,
-        true));
-    inter_arrival_ast_.reset(new InterArrival(
-        MakeAbsSendTime(kTimestampGroupLengthUs),
-        kAstToMs,
-        true));
-  }
-
-  // Test that neither inter_arrival instance complete the timestamp group from
-  // the given data.
-  void ExpectFalse(int64_t timestamp_us, int64_t arrival_time_ms,
-                   size_t packet_size) {
-    InternalExpectFalse(inter_arrival_rtp_.get(),
-                        MakeRtpTimestamp(timestamp_us), arrival_time_ms,
-                        packet_size);
-    InternalExpectFalse(inter_arrival_ast_.get(), MakeAbsSendTime(timestamp_us),
-                        arrival_time_ms, packet_size);
-  }
-
-  // Test that both inter_arrival instances complete the timestamp group from
-  // the given data and that all returned deltas are as expected (except
-  // timestamp delta, which is rounded from us to different ranges and must
-  // match within an interval, given in |timestamp_near].
-  void ExpectTrue(int64_t timestamp_us, int64_t arrival_time_ms,
-                  size_t packet_size, int64_t expected_timestamp_delta_us,
-                  int64_t expected_arrival_time_delta_ms,
-                  int expected_packet_size_delta,
-                  uint32_t timestamp_near) {
-    InternalExpectTrue(inter_arrival_rtp_.get(), MakeRtpTimestamp(timestamp_us),
-                       arrival_time_ms, packet_size,
-                       MakeRtpTimestamp(expected_timestamp_delta_us),
-                       expected_arrival_time_delta_ms,
-                       expected_packet_size_delta, timestamp_near);
-    InternalExpectTrue(inter_arrival_ast_.get(), MakeAbsSendTime(timestamp_us),
-                       arrival_time_ms, packet_size,
-                       MakeAbsSendTime(expected_timestamp_delta_us),
-                       expected_arrival_time_delta_ms,
-                       expected_packet_size_delta, timestamp_near << 8);
-  }
-
-  void WrapTestHelper(int64_t wrap_start_us, uint32_t timestamp_near,
-                      bool unorderly_within_group) {
-    // Step through the range of a 32 bit int, 1/4 at a time to not cause
-    // packets close to wraparound to be judged as out of order.
-
-    // G1
-    int64_t arrival_time = 17;
-    ExpectFalse(0, arrival_time, 1);
-
-    // G2
-    arrival_time += kBurstThresholdMs + 1;
-    ExpectFalse(wrap_start_us / 4, arrival_time, 1);
-
-    // G3
-    arrival_time += kBurstThresholdMs + 1;
-    ExpectTrue(wrap_start_us / 2, arrival_time, 1,
-               wrap_start_us / 4, 6, 0,   // Delta G2-G1
-               0);
-
-    // G4
-    arrival_time += kBurstThresholdMs + 1;
-    int64_t g4_arrival_time = arrival_time;
-    ExpectTrue(wrap_start_us / 2 + wrap_start_us / 4, arrival_time, 1,
-               wrap_start_us / 4, 6, 0,   // Delta G3-G2
-               timestamp_near);
-
-    // G5
-    arrival_time += kBurstThresholdMs + 1;
-    ExpectTrue(wrap_start_us, arrival_time, 2,
-               wrap_start_us / 4, 6, 0,   // Delta G4-G3
-               timestamp_near);
-    for (int i = 0; i < 10; ++i) {
-      // Slowly step across the wrap point.
-      arrival_time += kBurstThresholdMs + 1;
-      if (unorderly_within_group) {
-        // These packets arrive with timestamps in decreasing order but are
-        // nevertheless accumulated to group because their timestamps are higher
-        // than the initial timestamp of the group.
-        ExpectFalse(wrap_start_us + kMinStep * (9 - i), arrival_time, 1);
-      } else {
-        ExpectFalse(wrap_start_us + kMinStep * i, arrival_time, 1);
-      }
-    }
-    int64_t g5_arrival_time = arrival_time;
-
-    // This packet is out of order and should be dropped.
-    arrival_time += kBurstThresholdMs + 1;
-    ExpectFalse(wrap_start_us - 100, arrival_time, 100);
-
-    // G6
-    arrival_time += kBurstThresholdMs + 1;
-    int64_t g6_arrival_time = arrival_time;
-    ExpectTrue(wrap_start_us + kTriggerNewGroupUs, arrival_time, 10,
-               wrap_start_us / 4 + 9 * kMinStep,
-               g5_arrival_time - g4_arrival_time,
-               (2 + 10) - 1,  // Delta G5-G4
-               timestamp_near);
-
-    // This packet is out of order and should be dropped.
-    arrival_time += kBurstThresholdMs + 1;
-    ExpectFalse(wrap_start_us + kTimestampGroupLengthUs, arrival_time, 100);
-
-    // G7
-    arrival_time += kBurstThresholdMs + 1;
-    ExpectTrue(wrap_start_us + 2 * kTriggerNewGroupUs,
-               arrival_time, 100,
-               // Delta G6-G5
-               kTriggerNewGroupUs - 9 * kMinStep,
-               g6_arrival_time - g5_arrival_time,
-               10 - (2 + 10),
-               timestamp_near);
-  }
-
-  std::unique_ptr<InterArrival> inter_arrival_;
-
- private:
-  static uint32_t MakeRtpTimestamp(int64_t us) {
-    return static_cast<uint32_t>(static_cast<uint64_t>(us * 90 + 500) / 1000);
-  }
-
-  static uint32_t MakeAbsSendTime(int64_t us) {
-    uint32_t absolute_send_time = static_cast<uint32_t>(
-        ((static_cast<uint64_t>(us) << 18) + 500000) / 1000000) & 0x00FFFFFFul;
-    return absolute_send_time << 8;
-  }
-
-  static void InternalExpectFalse(InterArrival* inter_arrival,
-                                  uint32_t timestamp, int64_t arrival_time_ms,
-                                  size_t packet_size) {
-    uint32_t dummy_timestamp = 101;
-    int64_t dummy_arrival_time_ms = 303;
-    int dummy_packet_size = 909;
-    bool computed = inter_arrival->ComputeDeltas(
-        timestamp, arrival_time_ms, arrival_time_ms, packet_size,
-        &dummy_timestamp, &dummy_arrival_time_ms, &dummy_packet_size);
-    EXPECT_EQ(computed, false);
-    EXPECT_EQ(101ul, dummy_timestamp);
-    EXPECT_EQ(303, dummy_arrival_time_ms);
-    EXPECT_EQ(909, dummy_packet_size);
-  }
-
-  static void InternalExpectTrue(InterArrival* inter_arrival,
-                                 uint32_t timestamp, int64_t arrival_time_ms,
-                                 size_t packet_size,
-                                 uint32_t expected_timestamp_delta,
-                                 int64_t expected_arrival_time_delta_ms,
-                                 int expected_packet_size_delta,
-                                 uint32_t timestamp_near) {
-    uint32_t delta_timestamp = 101;
-    int64_t delta_arrival_time_ms = 303;
-    int delta_packet_size = 909;
-    bool computed = inter_arrival->ComputeDeltas(
-        timestamp, arrival_time_ms, arrival_time_ms, packet_size,
-        &delta_timestamp, &delta_arrival_time_ms, &delta_packet_size);
-    EXPECT_EQ(true, computed);
-    EXPECT_NEAR(expected_timestamp_delta, delta_timestamp, timestamp_near);
-    EXPECT_EQ(expected_arrival_time_delta_ms, delta_arrival_time_ms);
-    EXPECT_EQ(expected_packet_size_delta, delta_packet_size);
-  }
-
-  std::unique_ptr<InterArrival> inter_arrival_rtp_;
-  std::unique_ptr<InterArrival> inter_arrival_ast_;
-};
-
-TEST_F(InterArrivalTest, FirstPacket) {
-  ExpectFalse(0, 17, 1);
-}
-
-TEST_F(InterArrivalTest, FirstGroup) {
-  // G1
-  int64_t arrival_time = 17;
-  int64_t g1_arrival_time = arrival_time;
-  ExpectFalse(0, arrival_time, 1);
-
-  // G2
-  arrival_time += kBurstThresholdMs + 1;
-  int64_t g2_arrival_time = arrival_time;
-  ExpectFalse(kTriggerNewGroupUs, arrival_time, 2);
-
-  // G3
-  // Only once the first packet of the third group arrives, do we see the deltas
-  // between the first two.
-  arrival_time += kBurstThresholdMs + 1;
-  ExpectTrue(2 * kTriggerNewGroupUs, arrival_time, 1,
-             // Delta G2-G1
-             kTriggerNewGroupUs, g2_arrival_time - g1_arrival_time, 1,
-             0);
-}
-
-TEST_F(InterArrivalTest, SecondGroup) {
-  // G1
-  int64_t arrival_time = 17;
-  int64_t g1_arrival_time = arrival_time;
-  ExpectFalse(0, arrival_time, 1);
-
-  // G2
-  arrival_time += kBurstThresholdMs + 1;
-  int64_t g2_arrival_time = arrival_time;
-  ExpectFalse(kTriggerNewGroupUs, arrival_time, 2);
-
-  // G3
-  arrival_time += kBurstThresholdMs + 1;
-  int64_t g3_arrival_time = arrival_time;
-  ExpectTrue(2 * kTriggerNewGroupUs, arrival_time, 1,
-             // Delta G2-G1
-             kTriggerNewGroupUs, g2_arrival_time - g1_arrival_time, 1,
-             0);
-
-  // G4
-  // First packet of 4th group yields deltas between group 2 and 3.
-  arrival_time += kBurstThresholdMs + 1;
-  ExpectTrue(3 * kTriggerNewGroupUs, arrival_time, 2,
-             // Delta G3-G2
-             kTriggerNewGroupUs, g3_arrival_time - g2_arrival_time, -1,
-             0);
-}
-
-TEST_F(InterArrivalTest, AccumulatedGroup) {
-  // G1
-  int64_t arrival_time = 17;
-  int64_t g1_arrival_time = arrival_time;
-  ExpectFalse(0, arrival_time, 1);
-
-  // G2
-  arrival_time += kBurstThresholdMs + 1;
-  ExpectFalse(kTriggerNewGroupUs, 28, 2);
-  int64_t timestamp = kTriggerNewGroupUs;
-  for (int i = 0; i < 10; ++i) {
-    // A bunch of packets arriving within the same group.
-    arrival_time += kBurstThresholdMs + 1;
-    timestamp += kMinStep;
-    ExpectFalse(timestamp, arrival_time, 1);
-  }
-  int64_t g2_arrival_time = arrival_time;
-  int64_t g2_timestamp = timestamp;
-
-  // G3
-  arrival_time = 500;
-  ExpectTrue(2 * kTriggerNewGroupUs, arrival_time, 100,
-             g2_timestamp, g2_arrival_time - g1_arrival_time,
-             (2 + 10) - 1,   // Delta G2-G1
-             0);
-}
-
-TEST_F(InterArrivalTest, OutOfOrderPacket) {
-  // G1
-  int64_t arrival_time = 17;
-  int64_t timestamp = 0;
-  ExpectFalse(timestamp, arrival_time, 1);
-  int64_t g1_timestamp = timestamp;
-  int64_t g1_arrival_time = arrival_time;
-
-  // G2
-  arrival_time += 11;
-  timestamp += kTriggerNewGroupUs;
-  ExpectFalse(timestamp, 28, 2);
-  for (int i = 0; i < 10; ++i) {
-    arrival_time += kBurstThresholdMs + 1;
-    timestamp += kMinStep;
-    ExpectFalse(timestamp, arrival_time, 1);
-  }
-  int64_t g2_timestamp = timestamp;
-  int64_t g2_arrival_time = arrival_time;
-
-  // This packet is out of order and should be dropped.
-  arrival_time = 281;
-  ExpectFalse(g1_timestamp, arrival_time, 100);
-
-  // G3
-  arrival_time = 500;
-  timestamp = 2 * kTriggerNewGroupUs;
-  ExpectTrue(timestamp, arrival_time, 100,
-             // Delta G2-G1
-             g2_timestamp - g1_timestamp, g2_arrival_time - g1_arrival_time,
-             (2 + 10) - 1,
-             0);
-}
-
-TEST_F(InterArrivalTest, OutOfOrderWithinGroup) {
-  // G1
-  int64_t arrival_time = 17;
-  int64_t timestamp = 0;
-  ExpectFalse(timestamp, arrival_time, 1);
-  int64_t g1_timestamp = timestamp;
-  int64_t g1_arrival_time = arrival_time;
-
-  // G2
-  timestamp += kTriggerNewGroupUs;
-  arrival_time += 11;
-  ExpectFalse(kTriggerNewGroupUs, 28, 2);
-  timestamp += 10 * kMinStep;
-  int64_t g2_timestamp = timestamp;
-  for (int i = 0; i < 10; ++i) {
-    // These packets arrive with timestamps in decreasing order but are
-    // nevertheless accumulated to group because their timestamps are higher
-    // than the initial timestamp of the group.
-    arrival_time += kBurstThresholdMs + 1;
-    ExpectFalse(timestamp, arrival_time, 1);
-    timestamp -= kMinStep;
-  }
-  int64_t g2_arrival_time = arrival_time;
-
-  // However, this packet is deemed out of order and should be dropped.
-  arrival_time = 281;
-  timestamp = g1_timestamp;
-  ExpectFalse(timestamp, arrival_time, 100);
-
-  // G3
-  timestamp = 2 * kTriggerNewGroupUs;
-  arrival_time = 500;
-  ExpectTrue(timestamp, arrival_time, 100,
-             g2_timestamp - g1_timestamp, g2_arrival_time - g1_arrival_time,
-             (2 + 10) - 1,
-             0);
-}
-
-TEST_F(InterArrivalTest, TwoBursts) {
-  // G1
-  int64_t g1_arrival_time = 17;
-  ExpectFalse(0, g1_arrival_time, 1);
-
-  // G2
-  int64_t timestamp = kTriggerNewGroupUs;
-  int64_t arrival_time = 100;  // Simulate no packets arriving for 100 ms.
-  for (int i = 0; i < 10; ++i) {
-    // A bunch of packets arriving in one burst (within 5 ms apart).
-    timestamp += 30000;
-    arrival_time += kBurstThresholdMs;
-    ExpectFalse(timestamp, arrival_time, 1);
-  }
-  int64_t g2_arrival_time = arrival_time;
-  int64_t g2_timestamp = timestamp;
-
-  // G3
-  timestamp += 30000;
-  arrival_time += kBurstThresholdMs + 1;
-  ExpectTrue(timestamp, arrival_time, 100,
-             g2_timestamp, g2_arrival_time - g1_arrival_time,
-             10 - 1,  // Delta G2-G1
-             0);
-}
-
-
-TEST_F(InterArrivalTest, NoBursts) {
-  // G1
-  ExpectFalse(0, 17, 1);
-
-  // G2
-  int64_t timestamp = kTriggerNewGroupUs;
-  int64_t arrival_time = 28;
-  ExpectFalse(timestamp, arrival_time, 2);
-
-  // G3
-  ExpectTrue(kTriggerNewGroupUs + 30000, arrival_time + kBurstThresholdMs + 1,
-             100, timestamp - 0, arrival_time - 17,
-             2 - 1,  // Delta G2-G1
-             0);
-}
-
-// Yields 0xfffffffe when converted to internal representation in
-// inter_arrival_rtp_ and inter_arrival_ast_ respectively.
-static const int64_t kStartRtpTimestampWrapUs = 47721858827;
-static const int64_t kStartAbsSendTimeWrapUs = 63999995;
-
-TEST_F(InterArrivalTest, RtpTimestampWrap) {
-  WrapTestHelper(kStartRtpTimestampWrapUs, 1, false);
-}
-
-TEST_F(InterArrivalTest, AbsSendTimeWrap) {
-  WrapTestHelper(kStartAbsSendTimeWrapUs, 1, false);
-}
-
-TEST_F(InterArrivalTest, RtpTimestampWrapOutOfOrderWithinGroup) {
-  WrapTestHelper(kStartRtpTimestampWrapUs, 1, true);
-}
-
-TEST_F(InterArrivalTest, AbsSendTimeWrapOutOfOrderWithinGroup) {
-  WrapTestHelper(kStartAbsSendTimeWrapUs, 1, true);
-}
-
-TEST_F(InterArrivalTest, PositiveArrivalTimeJump) {
-  const size_t kPacketSize = 1000;
-  uint32_t send_time_ms = 10000;
-  int64_t arrival_time_ms = 20000;
-  int64_t system_time_ms = 30000;
-
-  uint32_t send_delta;
-  int64_t arrival_delta;
-  int size_delta;
-  EXPECT_FALSE(inter_arrival_->ComputeDeltas(
-      send_time_ms, arrival_time_ms, system_time_ms, kPacketSize, &send_delta,
-      &arrival_delta, &size_delta));
-
-  const int kTimeDeltaMs = 30;
-  send_time_ms += kTimeDeltaMs;
-  arrival_time_ms += kTimeDeltaMs;
-  system_time_ms += kTimeDeltaMs;
-  EXPECT_FALSE(inter_arrival_->ComputeDeltas(
-      send_time_ms, arrival_time_ms, system_time_ms, kPacketSize, &send_delta,
-      &arrival_delta, &size_delta));
-
-  send_time_ms += kTimeDeltaMs;
-  arrival_time_ms += kTimeDeltaMs + InterArrival::kArrivalTimeOffsetThresholdMs;
-  system_time_ms += kTimeDeltaMs;
-  EXPECT_TRUE(inter_arrival_->ComputeDeltas(
-      send_time_ms, arrival_time_ms, system_time_ms, kPacketSize, &send_delta,
-      &arrival_delta, &size_delta));
-  EXPECT_EQ(kTimeDeltaMs, static_cast<int>(send_delta));
-  EXPECT_EQ(kTimeDeltaMs, arrival_delta);
-  EXPECT_EQ(size_delta, 0);
-
-  send_time_ms += kTimeDeltaMs;
-  arrival_time_ms += kTimeDeltaMs;
-  system_time_ms += kTimeDeltaMs;
-  // The previous arrival time jump should now be detected and cause a reset.
-  EXPECT_FALSE(inter_arrival_->ComputeDeltas(
-      send_time_ms, arrival_time_ms, system_time_ms, kPacketSize, &send_delta,
-      &arrival_delta, &size_delta));
-
-  // The two next packets will not give a valid delta since we're in the initial
-  // state.
-  for (int i = 0; i < 2; ++i) {
-    send_time_ms += kTimeDeltaMs;
-    arrival_time_ms += kTimeDeltaMs;
-    system_time_ms += kTimeDeltaMs;
-    EXPECT_FALSE(inter_arrival_->ComputeDeltas(
-        send_time_ms, arrival_time_ms, system_time_ms, kPacketSize, &send_delta,
-        &arrival_delta, &size_delta));
-  }
-
-  send_time_ms += kTimeDeltaMs;
-  arrival_time_ms += kTimeDeltaMs;
-  system_time_ms += kTimeDeltaMs;
-  EXPECT_TRUE(inter_arrival_->ComputeDeltas(
-      send_time_ms, arrival_time_ms, system_time_ms, kPacketSize, &send_delta,
-      &arrival_delta, &size_delta));
-  EXPECT_EQ(kTimeDeltaMs, static_cast<int>(send_delta));
-  EXPECT_EQ(kTimeDeltaMs, arrival_delta);
-  EXPECT_EQ(size_delta, 0);
-}
-
-TEST_F(InterArrivalTest, NegativeArrivalTimeJump) {
-  const size_t kPacketSize = 1000;
-  uint32_t send_time_ms = 10000;
-  int64_t arrival_time_ms = 20000;
-  int64_t system_time_ms = 30000;
-
-  uint32_t send_delta;
-  int64_t arrival_delta;
-  int size_delta;
-  EXPECT_FALSE(inter_arrival_->ComputeDeltas(
-      send_time_ms, arrival_time_ms, system_time_ms, kPacketSize, &send_delta,
-      &arrival_delta, &size_delta));
-
-  const int kTimeDeltaMs = 30;
-  send_time_ms += kTimeDeltaMs;
-  arrival_time_ms += kTimeDeltaMs;
-  system_time_ms += kTimeDeltaMs;
-  EXPECT_FALSE(inter_arrival_->ComputeDeltas(
-      send_time_ms, arrival_time_ms, system_time_ms, kPacketSize, &send_delta,
-      &arrival_delta, &size_delta));
-
-  send_time_ms += kTimeDeltaMs;
-  arrival_time_ms += kTimeDeltaMs;
-  system_time_ms += kTimeDeltaMs;
-  EXPECT_TRUE(inter_arrival_->ComputeDeltas(
-      send_time_ms, arrival_time_ms, system_time_ms, kPacketSize, &send_delta,
-      &arrival_delta, &size_delta));
-  EXPECT_EQ(kTimeDeltaMs, static_cast<int>(send_delta));
-  EXPECT_EQ(kTimeDeltaMs, arrival_delta);
-  EXPECT_EQ(size_delta, 0);
-
-  // Three out of order will fail, after that we will be reset and two more will
-  // fail before we get our first valid delta after the reset.
-  arrival_time_ms -= 1000;
-  for (int i = 0; i < InterArrival::kReorderedResetThreshold + 3; ++i) {
-    send_time_ms += kTimeDeltaMs;
-    arrival_time_ms += kTimeDeltaMs;
-    system_time_ms += kTimeDeltaMs;
-    // The previous arrival time jump should now be detected and cause a reset.
-    EXPECT_FALSE(inter_arrival_->ComputeDeltas(
-        send_time_ms, arrival_time_ms, system_time_ms, kPacketSize, &send_delta,
-        &arrival_delta, &size_delta));
-  }
-
-  send_time_ms += kTimeDeltaMs;
-  arrival_time_ms += kTimeDeltaMs;
-  system_time_ms += kTimeDeltaMs;
-  EXPECT_TRUE(inter_arrival_->ComputeDeltas(
-      send_time_ms, arrival_time_ms, system_time_ms, kPacketSize, &send_delta,
-      &arrival_delta, &size_delta));
-  EXPECT_EQ(kTimeDeltaMs, static_cast<int>(send_delta));
-  EXPECT_EQ(kTimeDeltaMs, arrival_delta);
-  EXPECT_EQ(size_delta, 0);
-}
-}  // namespace testing
-}  // namespace webrtc
diff --git a/modules/remote_bitrate_estimator/overuse_detector.cc b/modules/remote_bitrate_estimator/overuse_detector.cc
deleted file mode 100644
index b7d5ca3..0000000
--- a/modules/remote_bitrate_estimator/overuse_detector.cc
+++ /dev/null
@@ -1,162 +0,0 @@
-/*
- *  Copyright (c) 2012 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/remote_bitrate_estimator/overuse_detector.h"
-
-#include <math.h>
-#include <stdlib.h>
-
-#include <algorithm>
-#include <sstream>
-#include <string>
-
-#include "webrtc/modules/remote_bitrate_estimator/include/bwe_defines.h"
-#include "webrtc/modules/remote_bitrate_estimator/test/bwe_test_logging.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_utility.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/safe_minmax.h"
-#include "webrtc/system_wrappers/include/field_trial.h"
-
-namespace webrtc {
-
-const char kAdaptiveThresholdExperiment[] = "WebRTC-AdaptiveBweThreshold";
-const char kEnabledPrefix[] = "Enabled";
-const size_t kEnabledPrefixLength = sizeof(kEnabledPrefix) - 1;
-const char kDisabledPrefix[] = "Disabled";
-const size_t kDisabledPrefixLength = sizeof(kDisabledPrefix) - 1;
-
-const double kMaxAdaptOffsetMs = 15.0;
-const double kOverUsingTimeThreshold = 10;
-const int kMinNumDeltas = 60;
-
-bool AdaptiveThresholdExperimentIsDisabled() {
-  std::string experiment_string =
-      webrtc::field_trial::FindFullName(kAdaptiveThresholdExperiment);
-  const size_t kMinExperimentLength = kDisabledPrefixLength;
-  if (experiment_string.length() < kMinExperimentLength)
-    return false;
-  return experiment_string.substr(0, kDisabledPrefixLength) == kDisabledPrefix;
-}
-
-// Gets thresholds from the experiment name following the format
-// "WebRTC-AdaptiveBweThreshold/Enabled-0.5,0.002/".
-bool ReadExperimentConstants(double* k_up, double* k_down) {
-  std::string experiment_string =
-      webrtc::field_trial::FindFullName(kAdaptiveThresholdExperiment);
-  const size_t kMinExperimentLength = kEnabledPrefixLength + 3;
-  if (experiment_string.length() < kMinExperimentLength ||
-      experiment_string.substr(0, kEnabledPrefixLength) != kEnabledPrefix)
-    return false;
-  return sscanf(experiment_string.substr(kEnabledPrefixLength + 1).c_str(),
-                "%lf,%lf", k_up, k_down) == 2;
-}
-
-OveruseDetector::OveruseDetector()
-    // Experiment is on by default, but can be disabled with finch by setting
-    // the field trial string to "WebRTC-AdaptiveBweThreshold/Disabled/".
-    : in_experiment_(!AdaptiveThresholdExperimentIsDisabled()),
-      k_up_(0.0087),
-      k_down_(0.039),
-      overusing_time_threshold_(100),
-      threshold_(12.5),
-      last_update_ms_(-1),
-      prev_offset_(0.0),
-      time_over_using_(-1),
-      overuse_counter_(0),
-      hypothesis_(BandwidthUsage::kBwNormal) {
-  if (!AdaptiveThresholdExperimentIsDisabled())
-    InitializeExperiment();
-}
-
-OveruseDetector::~OveruseDetector() {}
-
-BandwidthUsage OveruseDetector::State() const {
-  return hypothesis_;
-}
-
-BandwidthUsage OveruseDetector::Detect(double offset,
-                                       double ts_delta,
-                                       int num_of_deltas,
-                                       int64_t now_ms) {
-  if (num_of_deltas < 2) {
-    return BandwidthUsage::kBwNormal;
-  }
-  const double T = std::min(num_of_deltas, kMinNumDeltas) * offset;
-  BWE_TEST_LOGGING_PLOT(1, "T", now_ms, T);
-  BWE_TEST_LOGGING_PLOT(1, "threshold", now_ms, threshold_);
-  if (T > threshold_) {
-    if (time_over_using_ == -1) {
-      // Initialize the timer. Assume that we've been
-      // over-using half of the time since the previous
-      // sample.
-      time_over_using_ = ts_delta / 2;
-    } else {
-      // Increment timer
-      time_over_using_ += ts_delta;
-    }
-    overuse_counter_++;
-    if (time_over_using_ > overusing_time_threshold_ && overuse_counter_ > 1) {
-      if (offset >= prev_offset_) {
-        time_over_using_ = 0;
-        overuse_counter_ = 0;
-        hypothesis_ = BandwidthUsage::kBwOverusing;
-      }
-    }
-  } else if (T < -threshold_) {
-    time_over_using_ = -1;
-    overuse_counter_ = 0;
-    hypothesis_ = BandwidthUsage::kBwUnderusing;
-  } else {
-    time_over_using_ = -1;
-    overuse_counter_ = 0;
-    hypothesis_ = BandwidthUsage::kBwNormal;
-  }
-  prev_offset_ = offset;
-
-  UpdateThreshold(T, now_ms);
-
-  return hypothesis_;
-}
-
-void OveruseDetector::UpdateThreshold(double modified_offset, int64_t now_ms) {
-  if (!in_experiment_)
-    return;
-
-  if (last_update_ms_ == -1)
-    last_update_ms_ = now_ms;
-
-  if (fabs(modified_offset) > threshold_ + kMaxAdaptOffsetMs) {
-    // Avoid adapting the threshold to big latency spikes, caused e.g.,
-    // by a sudden capacity drop.
-    last_update_ms_ = now_ms;
-    return;
-  }
-
-  const double k = fabs(modified_offset) < threshold_ ? k_down_ : k_up_;
-  const int64_t kMaxTimeDeltaMs = 100;
-  int64_t time_delta_ms = std::min(now_ms - last_update_ms_, kMaxTimeDeltaMs);
-  threshold_ +=
-      k * (fabs(modified_offset) - threshold_) * time_delta_ms;
-  threshold_ = rtc::SafeClamp(threshold_, 6.f, 600.f);
-  last_update_ms_ = now_ms;
-}
-
-void OveruseDetector::InitializeExperiment() {
-  RTC_DCHECK(in_experiment_);
-  double k_up = 0.0;
-  double k_down = 0.0;
-  overusing_time_threshold_ = kOverUsingTimeThreshold;
-  if (ReadExperimentConstants(&k_up, &k_down)) {
-    k_up_ = k_up;
-    k_down_ = k_down;
-  }
-}
-}  // namespace webrtc
diff --git a/modules/remote_bitrate_estimator/overuse_detector.h b/modules/remote_bitrate_estimator/overuse_detector.h
deleted file mode 100644
index 399bfa4..0000000
--- a/modules/remote_bitrate_estimator/overuse_detector.h
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- *  Copyright (c) 2012 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_REMOTE_BITRATE_ESTIMATOR_OVERUSE_DETECTOR_H_
-#define WEBRTC_MODULES_REMOTE_BITRATE_ESTIMATOR_OVERUSE_DETECTOR_H_
-
-#include <list>
-
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/modules/remote_bitrate_estimator/include/bwe_defines.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-bool AdaptiveThresholdExperimentIsDisabled();
-
-class OveruseDetector {
- public:
-  OveruseDetector();
-  virtual ~OveruseDetector();
-
-  // Update the detection state based on the estimated inter-arrival time delta
-  // offset. |timestamp_delta| is the delta between the last timestamp which the
-  // estimated offset is based on and the last timestamp on which the last
-  // offset was based on, representing the time between detector updates.
-  // |num_of_deltas| is the number of deltas the offset estimate is based on.
-  // Returns the state after the detection update.
-  BandwidthUsage Detect(double offset,
-                        double timestamp_delta,
-                        int num_of_deltas,
-                        int64_t now_ms);
-
-  // Returns the current detector state.
-  BandwidthUsage State() const;
-
- private:
-  void UpdateThreshold(double modified_offset, int64_t now_ms);
-  void InitializeExperiment();
-
-  bool in_experiment_;
-  double k_up_;
-  double k_down_;
-  double overusing_time_threshold_;
-  double threshold_;
-  int64_t last_update_ms_;
-  double prev_offset_;
-  double time_over_using_;
-  int overuse_counter_;
-  BandwidthUsage hypothesis_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(OveruseDetector);
-};
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_REMOTE_BITRATE_ESTIMATOR_OVERUSE_DETECTOR_H_
diff --git a/modules/remote_bitrate_estimator/overuse_detector_unittest.cc b/modules/remote_bitrate_estimator/overuse_detector_unittest.cc
deleted file mode 100644
index e90a4ee..0000000
--- a/modules/remote_bitrate_estimator/overuse_detector_unittest.cc
+++ /dev/null
@@ -1,779 +0,0 @@
-/*
- *  Copyright (c) 2012 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 <math.h>
-
-#include <algorithm>
-#include <cmath>
-#include <cstdlib>
-#include <memory>
-
-#include "webrtc/common_types.h"
-#include "webrtc/modules/remote_bitrate_estimator/inter_arrival.h"
-#include "webrtc/modules/remote_bitrate_estimator/overuse_detector.h"
-#include "webrtc/modules/remote_bitrate_estimator/overuse_estimator.h"
-#include "webrtc/rtc_base/random.h"
-#include "webrtc/rtc_base/rate_statistics.h"
-#include "webrtc/test/field_trial.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-namespace testing {
-
-const double kRtpTimestampToMs = 1.0 / 90.0;
-
-class OveruseDetectorTest : public ::testing::Test {
- public:
-  OveruseDetectorTest()
-      : now_ms_(0),
-        receive_time_ms_(0),
-        rtp_timestamp_(10 * 90),
-        overuse_detector_(),
-        overuse_estimator_(new OveruseEstimator(options_)),
-        inter_arrival_(new InterArrival(5 * 90, kRtpTimestampToMs, true)),
-        random_(123456789) {}
-
- protected:
-  void SetUp() override {
-    overuse_detector_.reset(new OveruseDetector());
-  }
-
-  int Run100000Samples(int packets_per_frame, size_t packet_size, int mean_ms,
-                       int standard_deviation_ms) {
-    int unique_overuse = 0;
-    int last_overuse = -1;
-    for (int i = 0; i < 100000; ++i) {
-      for (int j = 0; j < packets_per_frame; ++j) {
-        UpdateDetector(rtp_timestamp_, receive_time_ms_, packet_size);
-      }
-      rtp_timestamp_ += mean_ms * 90;
-      now_ms_ += mean_ms;
-      receive_time_ms_ = std::max<int64_t>(
-          receive_time_ms_,
-          now_ms_ + static_cast<int64_t>(
-                        random_.Gaussian(0, standard_deviation_ms) + 0.5));
-      if (BandwidthUsage::kBwOverusing == overuse_detector_->State()) {
-        if (last_overuse + 1 != i) {
-          unique_overuse++;
-        }
-        last_overuse = i;
-      }
-    }
-    return unique_overuse;
-  }
-
-  int RunUntilOveruse(int packets_per_frame, size_t packet_size, int mean_ms,
-                      int standard_deviation_ms, int drift_per_frame_ms) {
-    // Simulate a higher send pace, that is too high.
-    for (int i = 0; i < 1000; ++i) {
-      for (int j = 0; j < packets_per_frame; ++j) {
-        UpdateDetector(rtp_timestamp_, receive_time_ms_, packet_size);
-      }
-      rtp_timestamp_ += mean_ms * 90;
-      now_ms_ += mean_ms + drift_per_frame_ms;
-      receive_time_ms_ = std::max<int64_t>(
-          receive_time_ms_,
-          now_ms_ + static_cast<int64_t>(
-                        random_.Gaussian(0, standard_deviation_ms) + 0.5));
-      if (BandwidthUsage::kBwOverusing == overuse_detector_->State()) {
-        return i + 1;
-      }
-    }
-    return -1;
-  }
-
-  void UpdateDetector(uint32_t rtp_timestamp, int64_t receive_time_ms,
-                      size_t packet_size) {
-    uint32_t timestamp_delta;
-    int64_t time_delta;
-    int size_delta;
-    if (inter_arrival_->ComputeDeltas(
-            rtp_timestamp, receive_time_ms, receive_time_ms, packet_size,
-            &timestamp_delta, &time_delta, &size_delta)) {
-      double timestamp_delta_ms = timestamp_delta / 90.0;
-      overuse_estimator_->Update(time_delta, timestamp_delta_ms, size_delta,
-                                 overuse_detector_->State(), receive_time_ms);
-      overuse_detector_->Detect(
-          overuse_estimator_->offset(), timestamp_delta_ms,
-          overuse_estimator_->num_of_deltas(), receive_time_ms);
-    }
-  }
-
-  int64_t now_ms_;
-  int64_t receive_time_ms_;
-  uint32_t rtp_timestamp_;
-  OverUseDetectorOptions options_;
-  std::unique_ptr<OveruseDetector> overuse_detector_;
-  std::unique_ptr<OveruseEstimator> overuse_estimator_;
-  std::unique_ptr<InterArrival> inter_arrival_;
-  Random random_;
-};
-
-TEST_F(OveruseDetectorTest, GaussianRandom) {
-  int buckets[100];
-  memset(buckets, 0, sizeof(buckets));
-  for (int i = 0; i < 100000; ++i) {
-    int index = random_.Gaussian(49, 10);
-    if (index >= 0 && index < 100)
-      buckets[index]++;
-  }
-  for (int n = 0; n < 100; ++n) {
-    printf("Bucket n:%d, %d\n", n, buckets[n]);
-  }
-}
-
-TEST_F(OveruseDetectorTest, SimpleNonOveruse30fps) {
-  size_t packet_size = 1200;
-  uint32_t frame_duration_ms = 33;
-  uint32_t rtp_timestamp = 10 * 90;
-
-  // No variance.
-  for (int i = 0; i < 1000; ++i) {
-    UpdateDetector(rtp_timestamp, now_ms_, packet_size);
-    now_ms_ += frame_duration_ms;
-    rtp_timestamp += frame_duration_ms * 90;
-    EXPECT_EQ(BandwidthUsage::kBwNormal, overuse_detector_->State());
-  }
-}
-
-// Roughly 1 Mbit/s
-TEST_F(OveruseDetectorTest, SimpleNonOveruseWithReceiveVariance) {
-  uint32_t frame_duration_ms = 10;
-  uint32_t rtp_timestamp = 10 * 90;
-  size_t packet_size = 1200;
-
-  for (int i = 0; i < 1000; ++i) {
-    UpdateDetector(rtp_timestamp, now_ms_, packet_size);
-    rtp_timestamp += frame_duration_ms * 90;
-    if (i % 2) {
-      now_ms_ += frame_duration_ms - 5;
-    } else {
-      now_ms_ += frame_duration_ms + 5;
-    }
-    EXPECT_EQ(BandwidthUsage::kBwNormal, overuse_detector_->State());
-  }
-}
-
-TEST_F(OveruseDetectorTest, SimpleNonOveruseWithRtpTimestampVariance) {
-  // Roughly 1 Mbit/s.
-  uint32_t frame_duration_ms = 10;
-  uint32_t rtp_timestamp = 10 * 90;
-  size_t packet_size = 1200;
-
-  for (int i = 0; i < 1000; ++i) {
-    UpdateDetector(rtp_timestamp, now_ms_, packet_size);
-    now_ms_ += frame_duration_ms;
-    if (i % 2) {
-      rtp_timestamp += (frame_duration_ms - 5) * 90;
-    } else {
-      rtp_timestamp += (frame_duration_ms + 5) * 90;
-    }
-    EXPECT_EQ(BandwidthUsage::kBwNormal, overuse_detector_->State());
-  }
-}
-
-TEST_F(OveruseDetectorTest, SimpleOveruse2000Kbit30fps) {
-  size_t packet_size = 1200;
-  int packets_per_frame = 6;
-  int frame_duration_ms = 33;
-  int drift_per_frame_ms = 1;
-  int sigma_ms = 0;  // No variance.
-  int unique_overuse = Run100000Samples(packets_per_frame, packet_size,
-                                        frame_duration_ms, sigma_ms);
-
-  EXPECT_EQ(0, unique_overuse);
-  int frames_until_overuse = RunUntilOveruse(packets_per_frame, packet_size,
-      frame_duration_ms, sigma_ms, drift_per_frame_ms);
-  EXPECT_EQ(7, frames_until_overuse);
-}
-
-TEST_F(OveruseDetectorTest, SimpleOveruse100kbit10fps) {
-  size_t packet_size = 1200;
-  int packets_per_frame = 1;
-  int frame_duration_ms = 100;
-  int drift_per_frame_ms = 1;
-  int sigma_ms = 0;  // No variance.
-  int unique_overuse = Run100000Samples(packets_per_frame, packet_size,
-                                        frame_duration_ms, sigma_ms);
-
-  EXPECT_EQ(0, unique_overuse);
-  int frames_until_overuse = RunUntilOveruse(packets_per_frame, packet_size,
-      frame_duration_ms, sigma_ms, drift_per_frame_ms);
-  EXPECT_EQ(7, frames_until_overuse);
-}
-
-TEST_F(OveruseDetectorTest, DISABLED_OveruseWithHighVariance100Kbit10fps) {
-  uint32_t frame_duration_ms = 100;
-  uint32_t drift_per_frame_ms = 10;
-  uint32_t rtp_timestamp = frame_duration_ms * 90;
-  size_t packet_size = 1200;
-  int offset = 10;
-
-  // Run 1000 samples to reach steady state.
-  for (int i = 0; i < 1000; ++i) {
-    UpdateDetector(rtp_timestamp, now_ms_, packet_size);
-    rtp_timestamp += frame_duration_ms * 90;
-    if (i % 2) {
-      offset = random_.Rand(0, 49);
-      now_ms_ += frame_duration_ms - offset;
-    } else {
-      now_ms_ += frame_duration_ms + offset;
-    }
-    EXPECT_EQ(BandwidthUsage::kBwNormal, overuse_detector_->State());
-  }
-  // Simulate a higher send pace, that is too high.
-  // Above noise generate a standard deviation of approximately 28 ms.
-  // Total build up of 150 ms.
-  for (int j = 0; j < 15; ++j) {
-    UpdateDetector(rtp_timestamp, now_ms_, packet_size);
-    now_ms_ += frame_duration_ms + drift_per_frame_ms;
-    rtp_timestamp += frame_duration_ms * 90;
-    EXPECT_EQ(BandwidthUsage::kBwNormal, overuse_detector_->State());
-  }
-  UpdateDetector(rtp_timestamp, now_ms_, packet_size);
-  EXPECT_EQ(BandwidthUsage::kBwOverusing, overuse_detector_->State());
-}
-
-TEST_F(OveruseDetectorTest, DISABLED_OveruseWithLowVariance100Kbit10fps) {
-  uint32_t frame_duration_ms = 100;
-  uint32_t drift_per_frame_ms = 1;
-  uint32_t rtp_timestamp = frame_duration_ms * 90;
-  size_t packet_size = 1200;
-  int offset = 10;
-
-  // Run 1000 samples to reach steady state.
-  for (int i = 0; i < 1000; ++i) {
-    UpdateDetector(rtp_timestamp, now_ms_, packet_size);
-    rtp_timestamp += frame_duration_ms * 90;
-    if (i % 2) {
-      offset = random_.Rand(0, 1);
-      now_ms_ += frame_duration_ms - offset;
-    } else {
-      now_ms_ += frame_duration_ms + offset;
-    }
-    EXPECT_EQ(BandwidthUsage::kBwNormal, overuse_detector_->State());
-  }
-  // Simulate a higher send pace, that is too high.
-  // Total build up of 6 ms.
-  for (int j = 0; j < 6; ++j) {
-    UpdateDetector(rtp_timestamp, now_ms_, packet_size);
-    now_ms_ += frame_duration_ms + drift_per_frame_ms;
-    rtp_timestamp += frame_duration_ms * 90;
-    EXPECT_EQ(BandwidthUsage::kBwNormal, overuse_detector_->State());
-  }
-  UpdateDetector(rtp_timestamp, now_ms_, packet_size);
-  EXPECT_EQ(BandwidthUsage::kBwOverusing, overuse_detector_->State());
-}
-
-TEST_F(OveruseDetectorTest, OveruseWithLowVariance2000Kbit30fps) {
-  uint32_t frame_duration_ms = 33;
-  uint32_t drift_per_frame_ms = 1;
-  uint32_t rtp_timestamp = frame_duration_ms * 90;
-  size_t packet_size = 1200;
-  int offset = 0;
-
-  // Run 1000 samples to reach steady state.
-  for (int i = 0; i < 1000; ++i) {
-    UpdateDetector(rtp_timestamp, now_ms_, packet_size);
-    UpdateDetector(rtp_timestamp, now_ms_, packet_size);
-    UpdateDetector(rtp_timestamp, now_ms_, packet_size);
-    UpdateDetector(rtp_timestamp, now_ms_, packet_size);
-    UpdateDetector(rtp_timestamp, now_ms_, packet_size);
-    UpdateDetector(rtp_timestamp, now_ms_, packet_size);
-    rtp_timestamp += frame_duration_ms * 90;
-    if (i % 2) {
-      offset = random_.Rand(0, 1);
-      now_ms_ += frame_duration_ms - offset;
-    } else {
-      now_ms_ += frame_duration_ms + offset;
-    }
-    EXPECT_EQ(BandwidthUsage::kBwNormal, overuse_detector_->State());
-  }
-  // Simulate a higher send pace, that is too high.
-  // Total build up of 30 ms.
-  for (int j = 0; j < 3; ++j) {
-    UpdateDetector(rtp_timestamp, now_ms_, packet_size);
-    UpdateDetector(rtp_timestamp, now_ms_, packet_size);
-    UpdateDetector(rtp_timestamp, now_ms_, packet_size);
-    UpdateDetector(rtp_timestamp, now_ms_, packet_size);
-    UpdateDetector(rtp_timestamp, now_ms_, packet_size);
-    UpdateDetector(rtp_timestamp, now_ms_, packet_size);
-    now_ms_ += frame_duration_ms + drift_per_frame_ms * 6;
-    rtp_timestamp += frame_duration_ms * 90;
-    EXPECT_EQ(BandwidthUsage::kBwNormal, overuse_detector_->State());
-  }
-  UpdateDetector(rtp_timestamp, now_ms_, packet_size);
-  EXPECT_EQ(BandwidthUsage::kBwOverusing, overuse_detector_->State());
-}
-
-#if defined(WEBRTC_ANDROID)
-#define MAYBE_LowGaussianVariance30Kbit3fps \
-  DISABLED_LowGaussianVariance30Kbit3fps
-#else
-#define MAYBE_LowGaussianVariance30Kbit3fps LowGaussianVariance30Kbit3fps
-#endif
-TEST_F(OveruseDetectorTest, MAYBE_LowGaussianVariance30Kbit3fps) {
-  size_t packet_size = 1200;
-  int packets_per_frame = 1;
-  int frame_duration_ms = 333;
-  int drift_per_frame_ms = 1;
-  int sigma_ms = 3;
-  int unique_overuse = Run100000Samples(packets_per_frame, packet_size,
-                                        frame_duration_ms, sigma_ms);
-  EXPECT_EQ(0, unique_overuse);
-  int frames_until_overuse = RunUntilOveruse(packets_per_frame, packet_size,
-      frame_duration_ms, sigma_ms, drift_per_frame_ms);
-  EXPECT_EQ(20, frames_until_overuse);
-}
-
-TEST_F(OveruseDetectorTest, LowGaussianVarianceFastDrift30Kbit3fps) {
-  size_t packet_size = 1200;
-  int packets_per_frame = 1;
-  int frame_duration_ms = 333;
-  int drift_per_frame_ms = 100;
-  int sigma_ms = 3;
-  int unique_overuse = Run100000Samples(packets_per_frame, packet_size,
-                                        frame_duration_ms, sigma_ms);
-  EXPECT_EQ(0, unique_overuse);
-  int frames_until_overuse = RunUntilOveruse(packets_per_frame, packet_size,
-      frame_duration_ms, sigma_ms, drift_per_frame_ms);
-  EXPECT_EQ(4, frames_until_overuse);
-}
-
-TEST_F(OveruseDetectorTest, HighGaussianVariance30Kbit3fps) {
-  size_t packet_size = 1200;
-  int packets_per_frame = 1;
-  int frame_duration_ms = 333;
-  int drift_per_frame_ms = 1;
-  int sigma_ms = 10;
-  int unique_overuse = Run100000Samples(packets_per_frame, packet_size,
-                                        frame_duration_ms, sigma_ms);
-  EXPECT_EQ(0, unique_overuse);
-  int frames_until_overuse = RunUntilOveruse(packets_per_frame, packet_size,
-      frame_duration_ms, sigma_ms, drift_per_frame_ms);
-  EXPECT_EQ(44, frames_until_overuse);
-}
-
-TEST_F(OveruseDetectorTest, HighGaussianVarianceFastDrift30Kbit3fps) {
-  size_t packet_size = 1200;
-  int packets_per_frame = 1;
-  int frame_duration_ms = 333;
-  int drift_per_frame_ms = 100;
-  int sigma_ms = 10;
-  int unique_overuse = Run100000Samples(packets_per_frame, packet_size,
-                                        frame_duration_ms, sigma_ms);
-  EXPECT_EQ(0, unique_overuse);
-  int frames_until_overuse = RunUntilOveruse(packets_per_frame, packet_size,
-      frame_duration_ms, sigma_ms, drift_per_frame_ms);
-  EXPECT_EQ(4, frames_until_overuse);
-}
-
-#if defined(WEBRTC_ANDROID)
-#define MAYBE_LowGaussianVariance100Kbit5fps \
-  DISABLED_LowGaussianVariance100Kbit5fps
-#else
-#define MAYBE_LowGaussianVariance100Kbit5fps LowGaussianVariance100Kbit5fps
-#endif
-TEST_F(OveruseDetectorTest, MAYBE_LowGaussianVariance100Kbit5fps) {
-  size_t packet_size = 1200;
-  int packets_per_frame = 2;
-  int frame_duration_ms = 200;
-  int drift_per_frame_ms = 1;
-  int sigma_ms = 3;
-  int unique_overuse = Run100000Samples(packets_per_frame, packet_size,
-                                        frame_duration_ms, sigma_ms);
-  EXPECT_EQ(0, unique_overuse);
-  int frames_until_overuse = RunUntilOveruse(packets_per_frame, packet_size,
-      frame_duration_ms, sigma_ms, drift_per_frame_ms);
-  EXPECT_EQ(20, frames_until_overuse);
-}
-
-#if defined(WEBRTC_ANDROID)
-#define MAYBE_HighGaussianVariance100Kbit5fps \
-  DISABLED_HighGaussianVariance100Kbit5fps
-#else
-#define MAYBE_HighGaussianVariance100Kbit5fps HighGaussianVariance100Kbit5fps
-#endif
-TEST_F(OveruseDetectorTest, MAYBE_HighGaussianVariance100Kbit5fps) {
-  size_t packet_size = 1200;
-  int packets_per_frame = 2;
-  int frame_duration_ms = 200;
-  int drift_per_frame_ms = 1;
-  int sigma_ms = 10;
-  int unique_overuse = Run100000Samples(packets_per_frame, packet_size,
-                                        frame_duration_ms, sigma_ms);
-  EXPECT_EQ(0, unique_overuse);
-  int frames_until_overuse = RunUntilOveruse(packets_per_frame, packet_size,
-      frame_duration_ms, sigma_ms, drift_per_frame_ms);
-  EXPECT_EQ(44, frames_until_overuse);
-}
-
-#if defined(WEBRTC_ANDROID)
-#define MAYBE_LowGaussianVariance100Kbit10fps \
-  DISABLED_LowGaussianVariance100Kbit10fps
-#else
-#define MAYBE_LowGaussianVariance100Kbit10fps LowGaussianVariance100Kbit10fps
-#endif
-TEST_F(OveruseDetectorTest, MAYBE_LowGaussianVariance100Kbit10fps) {
-  size_t packet_size = 1200;
-  int packets_per_frame = 1;
-  int frame_duration_ms = 100;
-  int drift_per_frame_ms = 1;
-  int sigma_ms = 3;
-  int unique_overuse = Run100000Samples(packets_per_frame, packet_size,
-                                        frame_duration_ms, sigma_ms);
-  EXPECT_EQ(0, unique_overuse);
-  int frames_until_overuse = RunUntilOveruse(packets_per_frame, packet_size,
-      frame_duration_ms, sigma_ms, drift_per_frame_ms);
-  EXPECT_EQ(20, frames_until_overuse);
-}
-
-#if defined(WEBRTC_ANDROID)
-#define MAYBE_HighGaussianVariance100Kbit10fps \
-  DISABLED_HighGaussianVariance100Kbit10fps
-#else
-#define MAYBE_HighGaussianVariance100Kbit10fps HighGaussianVariance100Kbit10fps
-#endif
-TEST_F(OveruseDetectorTest, MAYBE_HighGaussianVariance100Kbit10fps) {
-  size_t packet_size = 1200;
-  int packets_per_frame = 1;
-  int frame_duration_ms = 100;
-  int drift_per_frame_ms = 1;
-  int sigma_ms = 10;
-  int unique_overuse = Run100000Samples(packets_per_frame, packet_size,
-                                        frame_duration_ms, sigma_ms);
-  EXPECT_EQ(0, unique_overuse);
-  int frames_until_overuse = RunUntilOveruse(packets_per_frame, packet_size,
-      frame_duration_ms, sigma_ms, drift_per_frame_ms);
-  EXPECT_EQ(44, frames_until_overuse);
-}
-
-#if defined(WEBRTC_ANDROID)
-#define MAYBE_LowGaussianVariance300Kbit30fps \
-  DISABLED_LowGaussianVariance300Kbit30fps
-#else
-#define MAYBE_LowGaussianVariance300Kbit30fps LowGaussianVariance300Kbit30fps
-#endif
-TEST_F(OveruseDetectorTest, MAYBE_LowGaussianVariance300Kbit30fps) {
-  size_t packet_size = 1200;
-  int packets_per_frame = 1;
-  int frame_duration_ms = 33;
-  int drift_per_frame_ms = 1;
-  int sigma_ms = 3;
-  int unique_overuse = Run100000Samples(packets_per_frame, packet_size,
-                                        frame_duration_ms, sigma_ms);
-  EXPECT_EQ(0, unique_overuse);
-  int frames_until_overuse = RunUntilOveruse(packets_per_frame, packet_size,
-      frame_duration_ms, sigma_ms, drift_per_frame_ms);
-  EXPECT_EQ(19, frames_until_overuse);
-}
-
-TEST_F(OveruseDetectorTest, LowGaussianVarianceFastDrift300Kbit30fps) {
-  size_t packet_size = 1200;
-  int packets_per_frame = 1;
-  int frame_duration_ms = 33;
-  int drift_per_frame_ms = 10;
-  int sigma_ms = 3;
-  int unique_overuse = Run100000Samples(packets_per_frame, packet_size,
-                                        frame_duration_ms, sigma_ms);
-  EXPECT_EQ(0, unique_overuse);
-  int frames_until_overuse = RunUntilOveruse(packets_per_frame, packet_size,
-      frame_duration_ms, sigma_ms, drift_per_frame_ms);
-  EXPECT_EQ(5, frames_until_overuse);
-}
-
-TEST_F(OveruseDetectorTest, HighGaussianVariance300Kbit30fps) {
-  size_t packet_size = 1200;
-  int packets_per_frame = 1;
-  int frame_duration_ms = 33;
-  int drift_per_frame_ms = 1;
-  int sigma_ms = 10;
-  int unique_overuse = Run100000Samples(packets_per_frame, packet_size,
-                                        frame_duration_ms, sigma_ms);
-  EXPECT_EQ(0, unique_overuse);
-  int frames_until_overuse = RunUntilOveruse(packets_per_frame, packet_size,
-      frame_duration_ms, sigma_ms, drift_per_frame_ms);
-  EXPECT_EQ(44, frames_until_overuse);
-}
-
-TEST_F(OveruseDetectorTest, HighGaussianVarianceFastDrift300Kbit30fps) {
-  size_t packet_size = 1200;
-  int packets_per_frame = 1;
-  int frame_duration_ms = 33;
-  int drift_per_frame_ms = 10;
-  int sigma_ms = 10;
-  int unique_overuse = Run100000Samples(packets_per_frame, packet_size,
-                                        frame_duration_ms, sigma_ms);
-  EXPECT_EQ(0, unique_overuse);
-  int frames_until_overuse = RunUntilOveruse(packets_per_frame, packet_size,
-      frame_duration_ms, sigma_ms, drift_per_frame_ms);
-  EXPECT_EQ(10, frames_until_overuse);
-}
-
-#if defined(WEBRTC_ANDROID)
-#define MAYBE_LowGaussianVariance1000Kbit30fps \
-  DISABLED_LowGaussianVariance1000Kbit30fps
-#else
-#define MAYBE_LowGaussianVariance1000Kbit30fps LowGaussianVariance1000Kbit30fps
-#endif
-TEST_F(OveruseDetectorTest, MAYBE_LowGaussianVariance1000Kbit30fps) {
-  size_t packet_size = 1200;
-  int packets_per_frame = 3;
-  int frame_duration_ms = 33;
-  int drift_per_frame_ms = 1;
-  int sigma_ms = 3;
-  int unique_overuse = Run100000Samples(packets_per_frame, packet_size,
-                                        frame_duration_ms, sigma_ms);
-  EXPECT_EQ(0, unique_overuse);
-  int frames_until_overuse = RunUntilOveruse(packets_per_frame, packet_size,
-      frame_duration_ms, sigma_ms, drift_per_frame_ms);
-  EXPECT_EQ(19, frames_until_overuse);
-}
-
-TEST_F(OveruseDetectorTest, LowGaussianVarianceFastDrift1000Kbit30fps) {
-  size_t packet_size = 1200;
-  int packets_per_frame = 3;
-  int frame_duration_ms = 33;
-  int drift_per_frame_ms = 10;
-  int sigma_ms = 3;
-  int unique_overuse = Run100000Samples(packets_per_frame, packet_size,
-                                        frame_duration_ms, sigma_ms);
-  EXPECT_EQ(0, unique_overuse);
-  int frames_until_overuse = RunUntilOveruse(packets_per_frame, packet_size,
-      frame_duration_ms, sigma_ms, drift_per_frame_ms);
-  EXPECT_EQ(5, frames_until_overuse);
-}
-
-TEST_F(OveruseDetectorTest, HighGaussianVariance1000Kbit30fps) {
-  size_t packet_size = 1200;
-  int packets_per_frame = 3;
-  int frame_duration_ms = 33;
-  int drift_per_frame_ms = 1;
-  int sigma_ms = 10;
-  int unique_overuse = Run100000Samples(packets_per_frame, packet_size,
-                                        frame_duration_ms, sigma_ms);
-  EXPECT_EQ(0, unique_overuse);
-  int frames_until_overuse = RunUntilOveruse(packets_per_frame, packet_size,
-      frame_duration_ms, sigma_ms, drift_per_frame_ms);
-  EXPECT_EQ(44, frames_until_overuse);
-}
-
-TEST_F(OveruseDetectorTest, HighGaussianVarianceFastDrift1000Kbit30fps) {
-  size_t packet_size = 1200;
-  int packets_per_frame = 3;
-  int frame_duration_ms = 33;
-  int drift_per_frame_ms = 10;
-  int sigma_ms = 10;
-  int unique_overuse = Run100000Samples(packets_per_frame, packet_size,
-                                        frame_duration_ms, sigma_ms);
-  EXPECT_EQ(0, unique_overuse);
-  int frames_until_overuse = RunUntilOveruse(packets_per_frame, packet_size,
-      frame_duration_ms, sigma_ms, drift_per_frame_ms);
-  EXPECT_EQ(10, frames_until_overuse);
-}
-
-#if defined(WEBRTC_ANDROID)
-#define MAYBE_LowGaussianVariance2000Kbit30fps \
-  DISABLED_LowGaussianVariance2000Kbit30fps
-#else
-#define MAYBE_LowGaussianVariance2000Kbit30fps LowGaussianVariance2000Kbit30fps
-#endif
-TEST_F(OveruseDetectorTest, MAYBE_LowGaussianVariance2000Kbit30fps) {
-  size_t packet_size = 1200;
-  int packets_per_frame = 6;
-  int frame_duration_ms = 33;
-  int drift_per_frame_ms = 1;
-  int sigma_ms = 3;
-  int unique_overuse = Run100000Samples(packets_per_frame, packet_size,
-                                        frame_duration_ms, sigma_ms);
-  EXPECT_EQ(0, unique_overuse);
-  int frames_until_overuse = RunUntilOveruse(packets_per_frame, packet_size,
-      frame_duration_ms, sigma_ms, drift_per_frame_ms);
-  EXPECT_EQ(19, frames_until_overuse);
-}
-
-TEST_F(OveruseDetectorTest, LowGaussianVarianceFastDrift2000Kbit30fps) {
-  size_t packet_size = 1200;
-  int packets_per_frame = 6;
-  int frame_duration_ms = 33;
-  int drift_per_frame_ms = 10;
-  int sigma_ms = 3;
-  int unique_overuse = Run100000Samples(packets_per_frame, packet_size,
-                                        frame_duration_ms, sigma_ms);
-  EXPECT_EQ(0, unique_overuse);
-  int frames_until_overuse = RunUntilOveruse(packets_per_frame, packet_size,
-      frame_duration_ms, sigma_ms, drift_per_frame_ms);
-  EXPECT_EQ(5, frames_until_overuse);
-}
-
-TEST_F(OveruseDetectorTest, HighGaussianVariance2000Kbit30fps) {
-  size_t packet_size = 1200;
-  int packets_per_frame = 6;
-  int frame_duration_ms = 33;
-  int drift_per_frame_ms = 1;
-  int sigma_ms = 10;
-  int unique_overuse = Run100000Samples(packets_per_frame, packet_size,
-                                        frame_duration_ms, sigma_ms);
-  EXPECT_EQ(0, unique_overuse);
-  int frames_until_overuse = RunUntilOveruse(packets_per_frame, packet_size,
-      frame_duration_ms, sigma_ms, drift_per_frame_ms);
-  EXPECT_EQ(44, frames_until_overuse);
-}
-
-TEST_F(OveruseDetectorTest, HighGaussianVarianceFastDrift2000Kbit30fps) {
-  size_t packet_size = 1200;
-  int packets_per_frame = 6;
-  int frame_duration_ms = 33;
-  int drift_per_frame_ms = 10;
-  int sigma_ms = 10;
-  int unique_overuse = Run100000Samples(packets_per_frame, packet_size,
-                                        frame_duration_ms, sigma_ms);
-  EXPECT_EQ(0, unique_overuse);
-  int frames_until_overuse = RunUntilOveruse(packets_per_frame, packet_size,
-      frame_duration_ms, sigma_ms, drift_per_frame_ms);
-  EXPECT_EQ(10, frames_until_overuse);
-}
-
-class OveruseDetectorExperimentTest : public OveruseDetectorTest {
- public:
-  OveruseDetectorExperimentTest()
-      : override_field_trials_(
-            "WebRTC-AdaptiveBweThreshold/Enabled-0.01,0.00018/") {}
-
- protected:
-  void SetUp() override {
-    overuse_detector_.reset(new OveruseDetector());
-  }
-
-  test::ScopedFieldTrials override_field_trials_;
-};
-
-TEST_F(OveruseDetectorExperimentTest, ThresholdAdapts) {
-  const double kOffset = 0.21;
-  double kTsDelta = 3000.0;
-  int64_t now_ms = 0;
-  int num_deltas = 60;
-  const int kBatchLength = 10;
-
-  // Pass in a positive offset and verify it triggers overuse.
-  bool overuse_detected = false;
-  for (int i = 0; i < kBatchLength; ++i) {
-    BandwidthUsage overuse_state =
-        overuse_detector_->Detect(kOffset, kTsDelta, num_deltas, now_ms);
-    if (overuse_state == BandwidthUsage::kBwOverusing) {
-      overuse_detected = true;
-    }
-    ++num_deltas;
-    now_ms += 5;
-  }
-  EXPECT_TRUE(overuse_detected);
-
-  // Force the threshold to increase by passing in a higher offset.
-  overuse_detected = false;
-  for (int i = 0; i < kBatchLength; ++i) {
-    BandwidthUsage overuse_state =
-        overuse_detector_->Detect(1.1 * kOffset, kTsDelta, num_deltas, now_ms);
-    if (overuse_state == BandwidthUsage::kBwOverusing) {
-      overuse_detected = true;
-    }
-    ++num_deltas;
-    now_ms += 5;
-  }
-  EXPECT_TRUE(overuse_detected);
-
-  // Verify that the same offset as before no longer triggers overuse.
-  overuse_detected = false;
-  for (int i = 0; i < kBatchLength; ++i) {
-    BandwidthUsage overuse_state =
-        overuse_detector_->Detect(kOffset, kTsDelta, num_deltas, now_ms);
-    if (overuse_state == BandwidthUsage::kBwOverusing) {
-      overuse_detected = true;
-    }
-    ++num_deltas;
-    now_ms += 5;
-  }
-  EXPECT_FALSE(overuse_detected);
-
-  // Pass in a low offset to make the threshold adapt down.
-  for (int i = 0; i < 15 * kBatchLength; ++i) {
-    BandwidthUsage overuse_state =
-        overuse_detector_->Detect(0.7 * kOffset, kTsDelta, num_deltas, now_ms);
-    if (overuse_state == BandwidthUsage::kBwOverusing) {
-      overuse_detected = true;
-    }
-    ++num_deltas;
-    now_ms += 5;
-  }
-  EXPECT_FALSE(overuse_detected);
-
-  // Make sure the original offset now again triggers overuse.
-  for (int i = 0; i < kBatchLength; ++i) {
-    BandwidthUsage overuse_state =
-        overuse_detector_->Detect(kOffset, kTsDelta, num_deltas, now_ms);
-    if (overuse_state == BandwidthUsage::kBwOverusing) {
-      overuse_detected = true;
-    }
-    ++num_deltas;
-    now_ms += 5;
-  }
-  EXPECT_TRUE(overuse_detected);
-}
-
-TEST_F(OveruseDetectorExperimentTest, DoesntAdaptToSpikes) {
-  const double kOffset = 1.0;
-  const double kLargeOffset = 20.0;
-  double kTsDelta = 3000.0;
-  int64_t now_ms = 0;
-  int num_deltas = 60;
-  const int kBatchLength = 10;
-  const int kShortBatchLength = 3;
-
-  // Pass in a positive offset and verify it triggers overuse.
-  bool overuse_detected = false;
-  for (int i = 0; i < kBatchLength; ++i) {
-    BandwidthUsage overuse_state =
-        overuse_detector_->Detect(kOffset, kTsDelta, num_deltas, now_ms);
-    if (overuse_state == BandwidthUsage::kBwOverusing) {
-      overuse_detected = true;
-    }
-    ++num_deltas;
-    now_ms += 5;
-  }
-
-  // Pass in a large offset. This shouldn't have a too big impact on the
-  // threshold, but still trigger an overuse.
-  now_ms += 100;
-  overuse_detected = false;
-  for (int i = 0; i < kShortBatchLength; ++i) {
-    BandwidthUsage overuse_state =
-        overuse_detector_->Detect(kLargeOffset, kTsDelta, num_deltas, now_ms);
-    if (overuse_state == BandwidthUsage::kBwOverusing) {
-      overuse_detected = true;
-    }
-    ++num_deltas;
-    now_ms += 5;
-  }
-  EXPECT_TRUE(overuse_detected);
-
-  // Pass in a positive normal offset and verify it still triggers.
-  overuse_detected = false;
-  for (int i = 0; i < kBatchLength; ++i) {
-    BandwidthUsage overuse_state =
-        overuse_detector_->Detect(kOffset, kTsDelta, num_deltas, now_ms);
-    if (overuse_state == BandwidthUsage::kBwOverusing) {
-      overuse_detected = true;
-    }
-    ++num_deltas;
-    now_ms += 5;
-  }
-  EXPECT_TRUE(overuse_detected);
-}
-}  // namespace testing
-}  // namespace webrtc
diff --git a/modules/remote_bitrate_estimator/overuse_estimator.cc b/modules/remote_bitrate_estimator/overuse_estimator.cc
deleted file mode 100644
index 27afdd0..0000000
--- a/modules/remote_bitrate_estimator/overuse_estimator.cc
+++ /dev/null
@@ -1,166 +0,0 @@
-/*
- *  Copyright (c) 2013 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/remote_bitrate_estimator/overuse_estimator.h"
-
-#include <assert.h>
-#include <math.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include <algorithm>
-
-#include "webrtc/modules/remote_bitrate_estimator/include/bwe_defines.h"
-#include "webrtc/modules/remote_bitrate_estimator/test/bwe_test_logging.h"
-#include "webrtc/rtc_base/logging.h"
-
-namespace webrtc {
-
-enum { kMinFramePeriodHistoryLength = 60 };
-enum { kDeltaCounterMax = 1000 };
-
-OveruseEstimator::OveruseEstimator(const OverUseDetectorOptions& options)
-    : options_(options),
-      num_of_deltas_(0),
-      slope_(options_.initial_slope),
-      offset_(options_.initial_offset),
-      prev_offset_(options_.initial_offset),
-      E_(),
-      process_noise_(),
-      avg_noise_(options_.initial_avg_noise),
-      var_noise_(options_.initial_var_noise),
-      ts_delta_hist_() {
-  memcpy(E_, options_.initial_e, sizeof(E_));
-  memcpy(process_noise_, options_.initial_process_noise,
-         sizeof(process_noise_));
-}
-
-OveruseEstimator::~OveruseEstimator() {
-  ts_delta_hist_.clear();
-}
-
-void OveruseEstimator::Update(int64_t t_delta,
-                              double ts_delta,
-                              int size_delta,
-                              BandwidthUsage current_hypothesis,
-                              int64_t now_ms) {
-  const double min_frame_period = UpdateMinFramePeriod(ts_delta);
-  const double t_ts_delta = t_delta - ts_delta;
-  BWE_TEST_LOGGING_PLOT(1, "dm_ms", now_ms, t_ts_delta);
-  double fs_delta = size_delta;
-
-  ++num_of_deltas_;
-  if (num_of_deltas_ > kDeltaCounterMax) {
-    num_of_deltas_ = kDeltaCounterMax;
-  }
-
-  // Update the Kalman filter.
-  E_[0][0] += process_noise_[0];
-  E_[1][1] += process_noise_[1];
-
-  if ((current_hypothesis == BandwidthUsage::kBwOverusing &&
-       offset_ < prev_offset_) ||
-      (current_hypothesis == BandwidthUsage::kBwUnderusing &&
-       offset_ > prev_offset_)) {
-    E_[1][1] += 10 * process_noise_[1];
-  }
-
-  const double h[2] = {fs_delta, 1.0};
-  const double Eh[2] = {E_[0][0]*h[0] + E_[0][1]*h[1],
-                        E_[1][0]*h[0] + E_[1][1]*h[1]};
-
-  BWE_TEST_LOGGING_PLOT(1, "d_ms", now_ms, slope_ * h[0] - offset_);
-
-  const double residual = t_ts_delta - slope_*h[0] - offset_;
-
-  const bool in_stable_state =
-      (current_hypothesis == BandwidthUsage::kBwNormal);
-  const double max_residual = 3.0 * sqrt(var_noise_);
-  // We try to filter out very late frames. For instance periodic key
-  // frames doesn't fit the Gaussian model well.
-  if (fabs(residual) < max_residual) {
-    UpdateNoiseEstimate(residual, min_frame_period, in_stable_state);
-  } else {
-    UpdateNoiseEstimate(residual < 0 ? -max_residual : max_residual,
-                        min_frame_period, in_stable_state);
-  }
-
-  const double denom = var_noise_ + h[0]*Eh[0] + h[1]*Eh[1];
-
-  const double K[2] = {Eh[0] / denom,
-                       Eh[1] / denom};
-
-  const double IKh[2][2] = {{1.0 - K[0]*h[0], -K[0]*h[1]},
-                            {-K[1]*h[0], 1.0 - K[1]*h[1]}};
-  const double e00 = E_[0][0];
-  const double e01 = E_[0][1];
-
-  // Update state.
-  E_[0][0] = e00 * IKh[0][0] + E_[1][0] * IKh[0][1];
-  E_[0][1] = e01 * IKh[0][0] + E_[1][1] * IKh[0][1];
-  E_[1][0] = e00 * IKh[1][0] + E_[1][0] * IKh[1][1];
-  E_[1][1] = e01 * IKh[1][0] + E_[1][1] * IKh[1][1];
-
-  // The covariance matrix must be positive semi-definite.
-  bool positive_semi_definite = E_[0][0] + E_[1][1] >= 0 &&
-      E_[0][0] * E_[1][1] - E_[0][1] * E_[1][0] >= 0 && E_[0][0] >= 0;
-  assert(positive_semi_definite);
-  if (!positive_semi_definite) {
-    LOG(LS_ERROR) << "The over-use estimator's covariance matrix is no longer "
-                     "semi-definite.";
-  }
-
-  slope_ = slope_ + K[0] * residual;
-  prev_offset_ = offset_;
-  offset_ = offset_ + K[1] * residual;
-
-  BWE_TEST_LOGGING_PLOT(1, "kc", now_ms, K[0]);
-  BWE_TEST_LOGGING_PLOT(1, "km", now_ms, K[1]);
-  BWE_TEST_LOGGING_PLOT(1, "slope_1/bps", now_ms, slope_);
-  BWE_TEST_LOGGING_PLOT(1, "var_noise", now_ms, var_noise_);
-}
-
-double OveruseEstimator::UpdateMinFramePeriod(double ts_delta) {
-  double min_frame_period = ts_delta;
-  if (ts_delta_hist_.size() >= kMinFramePeriodHistoryLength) {
-    ts_delta_hist_.pop_front();
-  }
-  for (const double old_ts_delta : ts_delta_hist_) {
-    min_frame_period = std::min(old_ts_delta, min_frame_period);
-  }
-  ts_delta_hist_.push_back(ts_delta);
-  return min_frame_period;
-}
-
-void OveruseEstimator::UpdateNoiseEstimate(double residual,
-                                           double ts_delta,
-                                           bool stable_state) {
-  if (!stable_state) {
-    return;
-  }
-  // Faster filter during startup to faster adapt to the jitter level
-  // of the network. |alpha| is tuned for 30 frames per second, but is scaled
-  // according to |ts_delta|.
-  double alpha = 0.01;
-  if (num_of_deltas_ > 10*30) {
-    alpha = 0.002;
-  }
-  // Only update the noise estimate if we're not over-using. |beta| is a
-  // function of alpha and the time delta since the previous update.
-  const double beta = pow(1 - alpha, ts_delta * 30.0 / 1000.0);
-  avg_noise_ = beta * avg_noise_
-              + (1 - beta) * residual;
-  var_noise_ = beta * var_noise_
-              + (1 - beta) * (avg_noise_ - residual) * (avg_noise_ - residual);
-  if (var_noise_ < 1) {
-    var_noise_ = 1;
-  }
-}
-}  // namespace webrtc
diff --git a/modules/remote_bitrate_estimator/overuse_estimator.h b/modules/remote_bitrate_estimator/overuse_estimator.h
deleted file mode 100644
index d05ddee..0000000
--- a/modules/remote_bitrate_estimator/overuse_estimator.h
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- *  Copyright (c) 2013 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_REMOTE_BITRATE_ESTIMATOR_OVERUSE_ESTIMATOR_H_
-#define WEBRTC_MODULES_REMOTE_BITRATE_ESTIMATOR_OVERUSE_ESTIMATOR_H_
-
-#include <deque>
-
-#include "webrtc/common_types.h"
-#include "webrtc/modules/remote_bitrate_estimator/include/bwe_defines.h"
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace webrtc {
-
-class OveruseEstimator {
- public:
-  explicit OveruseEstimator(const OverUseDetectorOptions& options);
-  ~OveruseEstimator();
-
-  // Update the estimator with a new sample. The deltas should represent deltas
-  // between timestamp groups as defined by the InterArrival class.
-  // |current_hypothesis| should be the hypothesis of the over-use detector at
-  // this time.
-  void Update(int64_t t_delta,
-              double ts_delta,
-              int size_delta,
-              BandwidthUsage current_hypothesis,
-              int64_t now_ms);
-
-  // Returns the estimated noise/jitter variance in ms^2.
-  double var_noise() const {
-    return var_noise_;
-  }
-
-  // Returns the estimated inter-arrival time delta offset in ms.
-  double offset() const {
-    return offset_;
-  }
-
-  // Returns the number of deltas which the current over-use estimator state is
-  // based on.
-  unsigned int num_of_deltas() const {
-    return num_of_deltas_;
-  }
-
- private:
-  double UpdateMinFramePeriod(double ts_delta);
-  void UpdateNoiseEstimate(double residual, double ts_delta, bool stable_state);
-
-  // Must be first member variable. Cannot be const because we need to be
-  // copyable.
-  OverUseDetectorOptions options_;
-  uint16_t num_of_deltas_;
-  double slope_;
-  double offset_;
-  double prev_offset_;
-  double E_[2][2];
-  double process_noise_[2];
-  double avg_noise_;
-  double var_noise_;
-  std::deque<double> ts_delta_hist_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(OveruseEstimator);
-};
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_REMOTE_BITRATE_ESTIMATOR_OVERUSE_ESTIMATOR_H_
diff --git a/modules/remote_bitrate_estimator/remote_bitrate_estimator_abs_send_time.cc b/modules/remote_bitrate_estimator/remote_bitrate_estimator_abs_send_time.cc
deleted file mode 100644
index c43bc12..0000000
--- a/modules/remote_bitrate_estimator/remote_bitrate_estimator_abs_send_time.cc
+++ /dev/null
@@ -1,416 +0,0 @@
-/*
- *  Copyright (c) 2013 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/remote_bitrate_estimator/remote_bitrate_estimator_abs_send_time.h"
-
-#include <math.h>
-
-#include <algorithm>
-
-#include "webrtc/modules/pacing/paced_sender.h"
-#include "webrtc/modules/remote_bitrate_estimator/include/remote_bitrate_estimator.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/thread_annotations.h"
-#include "webrtc/system_wrappers/include/metrics.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-enum {
-  kTimestampGroupLengthMs = 5,
-  kAbsSendTimeFraction = 18,
-  kAbsSendTimeInterArrivalUpshift = 8,
-  kInterArrivalShift = kAbsSendTimeFraction + kAbsSendTimeInterArrivalUpshift,
-  kInitialProbingIntervalMs = 2000,
-  kMinClusterSize = 4,
-  kMaxProbePackets = 15,
-  kExpectedNumberOfProbes = 3
-};
-
-static const double kTimestampToMs = 1000.0 /
-    static_cast<double>(1 << kInterArrivalShift);
-
-template<typename K, typename V>
-std::vector<K> Keys(const std::map<K, V>& map) {
-  std::vector<K> keys;
-  keys.reserve(map.size());
-  for (typename std::map<K, V>::const_iterator it = map.begin();
-      it != map.end(); ++it) {
-    keys.push_back(it->first);
-  }
-  return keys;
-}
-
-uint32_t ConvertMsTo24Bits(int64_t time_ms) {
-  uint32_t time_24_bits =
-      static_cast<uint32_t>(
-          ((static_cast<uint64_t>(time_ms) << kAbsSendTimeFraction) + 500) /
-          1000) &
-      0x00FFFFFF;
-  return time_24_bits;
-}
-
-bool RemoteBitrateEstimatorAbsSendTime::IsWithinClusterBounds(
-    int send_delta_ms,
-    const Cluster& cluster_aggregate) {
-    if (cluster_aggregate.count == 0)
-      return true;
-    float cluster_mean = cluster_aggregate.send_mean_ms /
-                         static_cast<float>(cluster_aggregate.count);
-    return fabs(static_cast<float>(send_delta_ms) - cluster_mean) < 2.5f;
-  }
-
-  void RemoteBitrateEstimatorAbsSendTime::AddCluster(
-      std::list<Cluster>* clusters,
-      Cluster* cluster) {
-    cluster->send_mean_ms /= static_cast<float>(cluster->count);
-    cluster->recv_mean_ms /= static_cast<float>(cluster->count);
-    cluster->mean_size /= cluster->count;
-    clusters->push_back(*cluster);
-  }
-
-  RemoteBitrateEstimatorAbsSendTime::RemoteBitrateEstimatorAbsSendTime(
-      RemoteBitrateObserver* observer,
-      const Clock* clock)
-      : clock_(clock),
-        observer_(observer),
-        inter_arrival_(),
-        estimator_(),
-        detector_(),
-        incoming_bitrate_(kBitrateWindowMs, 8000),
-        incoming_bitrate_initialized_(false),
-        total_probes_received_(0),
-        first_packet_time_ms_(-1),
-        last_update_ms_(-1),
-        uma_recorded_(false) {
-    RTC_DCHECK(observer_);
-    LOG(LS_INFO) << "RemoteBitrateEstimatorAbsSendTime: Instantiating.";
-}
-
-void RemoteBitrateEstimatorAbsSendTime::ComputeClusters(
-    std::list<Cluster>* clusters) const {
-  Cluster current;
-  int64_t prev_send_time = -1;
-  int64_t prev_recv_time = -1;
-  for (std::list<Probe>::const_iterator it = probes_.begin();
-       it != probes_.end();
-       ++it) {
-    if (prev_send_time >= 0) {
-      int send_delta_ms = it->send_time_ms - prev_send_time;
-      int recv_delta_ms = it->recv_time_ms - prev_recv_time;
-      if (send_delta_ms >= 1 && recv_delta_ms >= 1) {
-        ++current.num_above_min_delta;
-      }
-      if (!IsWithinClusterBounds(send_delta_ms, current)) {
-        if (current.count >= kMinClusterSize &&
-            current.send_mean_ms > 0.0f &&
-            current.recv_mean_ms > 0.0f) {
-          AddCluster(clusters, &current);
-        }
-        current = Cluster();
-      }
-      current.send_mean_ms += send_delta_ms;
-      current.recv_mean_ms += recv_delta_ms;
-      current.mean_size += it->payload_size;
-      ++current.count;
-    }
-    prev_send_time = it->send_time_ms;
-    prev_recv_time = it->recv_time_ms;
-  }
-  if (current.count >= kMinClusterSize &&
-      current.send_mean_ms > 0.0f &&
-      current.recv_mean_ms > 0.0f) {
-    AddCluster(clusters, &current);
-  }
-}
-
-std::list<Cluster>::const_iterator
-RemoteBitrateEstimatorAbsSendTime::FindBestProbe(
-    const std::list<Cluster>& clusters) const {
-  int highest_probe_bitrate_bps = 0;
-  std::list<Cluster>::const_iterator best_it = clusters.end();
-  for (std::list<Cluster>::const_iterator it = clusters.begin();
-       it != clusters.end();
-       ++it) {
-    if (it->send_mean_ms == 0 || it->recv_mean_ms == 0)
-      continue;
-    if (it->num_above_min_delta > it->count / 2 &&
-        (it->recv_mean_ms - it->send_mean_ms <= 2.0f &&
-         it->send_mean_ms - it->recv_mean_ms <= 5.0f)) {
-      int probe_bitrate_bps =
-          std::min(it->GetSendBitrateBps(), it->GetRecvBitrateBps());
-      if (probe_bitrate_bps > highest_probe_bitrate_bps) {
-        highest_probe_bitrate_bps = probe_bitrate_bps;
-        best_it = it;
-      }
-    } else {
-      int send_bitrate_bps = it->mean_size * 8 * 1000 / it->send_mean_ms;
-      int recv_bitrate_bps = it->mean_size * 8 * 1000 / it->recv_mean_ms;
-      LOG(LS_INFO) << "Probe failed, sent at " << send_bitrate_bps
-                   << " bps, received at " << recv_bitrate_bps
-                   << " bps. Mean send delta: " << it->send_mean_ms
-                   << " ms, mean recv delta: " << it->recv_mean_ms
-                   << " ms, num probes: " << it->count;
-      break;
-    }
-  }
-  return best_it;
-}
-
-RemoteBitrateEstimatorAbsSendTime::ProbeResult
-RemoteBitrateEstimatorAbsSendTime::ProcessClusters(int64_t now_ms) {
-  std::list<Cluster> clusters;
-  ComputeClusters(&clusters);
-  if (clusters.empty()) {
-    // If we reach the max number of probe packets and still have no clusters,
-    // we will remove the oldest one.
-    if (probes_.size() >= kMaxProbePackets)
-      probes_.pop_front();
-    return ProbeResult::kNoUpdate;
-  }
-
-  std::list<Cluster>::const_iterator best_it = FindBestProbe(clusters);
-  if (best_it != clusters.end()) {
-    int probe_bitrate_bps =
-        std::min(best_it->GetSendBitrateBps(), best_it->GetRecvBitrateBps());
-    // Make sure that a probe sent on a lower bitrate than our estimate can't
-    // reduce the estimate.
-    if (IsBitrateImproving(probe_bitrate_bps)) {
-      LOG(LS_INFO) << "Probe successful, sent at "
-                   << best_it->GetSendBitrateBps() << " bps, received at "
-                   << best_it->GetRecvBitrateBps()
-                   << " bps. Mean send delta: " << best_it->send_mean_ms
-                   << " ms, mean recv delta: " << best_it->recv_mean_ms
-                   << " ms, num probes: " << best_it->count;
-      remote_rate_.SetEstimate(probe_bitrate_bps, now_ms);
-      return ProbeResult::kBitrateUpdated;
-    }
-  }
-
-  // Not probing and received non-probe packet, or finished with current set
-  // of probes.
-  if (clusters.size() >= kExpectedNumberOfProbes)
-    probes_.clear();
-  return ProbeResult::kNoUpdate;
-}
-
-bool RemoteBitrateEstimatorAbsSendTime::IsBitrateImproving(
-    int new_bitrate_bps) const {
-  bool initial_probe = !remote_rate_.ValidEstimate() && new_bitrate_bps > 0;
-  bool bitrate_above_estimate =
-      remote_rate_.ValidEstimate() &&
-      new_bitrate_bps > static_cast<int>(remote_rate_.LatestEstimate());
-  return initial_probe || bitrate_above_estimate;
-}
-
-void RemoteBitrateEstimatorAbsSendTime::IncomingPacket(
-    int64_t arrival_time_ms,
-    size_t payload_size,
-    const RTPHeader& header) {
-  RTC_DCHECK_RUNS_SERIALIZED(&network_race_);
-  if (!header.extension.hasAbsoluteSendTime) {
-    LOG(LS_WARNING) << "RemoteBitrateEstimatorAbsSendTimeImpl: Incoming packet "
-                       "is missing absolute send time extension!";
-    return;
-  }
-  IncomingPacketInfo(arrival_time_ms, header.extension.absoluteSendTime,
-                     payload_size, header.ssrc);
-}
-
-void RemoteBitrateEstimatorAbsSendTime::IncomingPacketInfo(
-    int64_t arrival_time_ms,
-    uint32_t send_time_24bits,
-    size_t payload_size,
-    uint32_t ssrc) {
-  RTC_CHECK(send_time_24bits < (1ul << 24));
-  if (!uma_recorded_) {
-    RTC_HISTOGRAM_ENUMERATION(kBweTypeHistogram, BweNames::kReceiverAbsSendTime,
-                              BweNames::kBweNamesMax);
-    uma_recorded_ = true;
-  }
-  // Shift up send time to use the full 32 bits that inter_arrival works with,
-  // so wrapping works properly.
-  uint32_t timestamp = send_time_24bits << kAbsSendTimeInterArrivalUpshift;
-  int64_t send_time_ms = static_cast<int64_t>(timestamp) * kTimestampToMs;
-
-  int64_t now_ms = clock_->TimeInMilliseconds();
-  // TODO(holmer): SSRCs are only needed for REMB, should be broken out from
-  // here.
-
-  // Check if incoming bitrate estimate is valid, and if it needs to be reset.
-  rtc::Optional<uint32_t> incoming_bitrate =
-      incoming_bitrate_.Rate(arrival_time_ms);
-  if (incoming_bitrate) {
-    incoming_bitrate_initialized_ = true;
-  } else if (incoming_bitrate_initialized_) {
-    // Incoming bitrate had a previous valid value, but now not enough data
-    // point are left within the current window. Reset incoming bitrate
-    // estimator so that the window size will only contain new data points.
-    incoming_bitrate_.Reset();
-    incoming_bitrate_initialized_ = false;
-  }
-  incoming_bitrate_.Update(payload_size, arrival_time_ms);
-
-  if (first_packet_time_ms_ == -1)
-    first_packet_time_ms_ = now_ms;
-
-  uint32_t ts_delta = 0;
-  int64_t t_delta = 0;
-  int size_delta = 0;
-  bool update_estimate = false;
-  uint32_t target_bitrate_bps = 0;
-  std::vector<uint32_t> ssrcs;
-  {
-    rtc::CritScope lock(&crit_);
-
-    TimeoutStreams(now_ms);
-    RTC_DCHECK(inter_arrival_.get());
-    RTC_DCHECK(estimator_.get());
-    ssrcs_[ssrc] = now_ms;
-
-    // For now only try to detect probes while we don't have a valid estimate.
-    // We currently assume that only packets larger than 200 bytes are paced by
-    // the sender.
-    const size_t kMinProbePacketSize = 200;
-    if (payload_size > kMinProbePacketSize &&
-        (!remote_rate_.ValidEstimate() ||
-         now_ms - first_packet_time_ms_ < kInitialProbingIntervalMs)) {
-      // TODO(holmer): Use a map instead to get correct order?
-      if (total_probes_received_ < kMaxProbePackets) {
-        int send_delta_ms = -1;
-        int recv_delta_ms = -1;
-        if (!probes_.empty()) {
-          send_delta_ms = send_time_ms - probes_.back().send_time_ms;
-          recv_delta_ms = arrival_time_ms - probes_.back().recv_time_ms;
-        }
-        LOG(LS_INFO) << "Probe packet received: send time=" << send_time_ms
-                     << " ms, recv time=" << arrival_time_ms
-                     << " ms, send delta=" << send_delta_ms
-                     << " ms, recv delta=" << recv_delta_ms << " ms.";
-      }
-      probes_.push_back(Probe(send_time_ms, arrival_time_ms, payload_size));
-      ++total_probes_received_;
-      // Make sure that a probe which updated the bitrate immediately has an
-      // effect by calling the OnReceiveBitrateChanged callback.
-      if (ProcessClusters(now_ms) == ProbeResult::kBitrateUpdated)
-        update_estimate = true;
-    }
-    if (inter_arrival_->ComputeDeltas(timestamp, arrival_time_ms, now_ms,
-                                      payload_size, &ts_delta, &t_delta,
-                                      &size_delta)) {
-      double ts_delta_ms = (1000.0 * ts_delta) / (1 << kInterArrivalShift);
-      estimator_->Update(t_delta, ts_delta_ms, size_delta, detector_.State(),
-                         arrival_time_ms);
-      detector_.Detect(estimator_->offset(), ts_delta_ms,
-                       estimator_->num_of_deltas(), arrival_time_ms);
-    }
-
-    if (!update_estimate) {
-      // Check if it's time for a periodic update or if we should update because
-      // of an over-use.
-      if (last_update_ms_ == -1 ||
-          now_ms - last_update_ms_ > remote_rate_.GetFeedbackInterval()) {
-        update_estimate = true;
-      } else if (detector_.State() == BandwidthUsage::kBwOverusing) {
-        rtc::Optional<uint32_t> incoming_rate =
-            incoming_bitrate_.Rate(arrival_time_ms);
-        if (incoming_rate &&
-            remote_rate_.TimeToReduceFurther(now_ms, *incoming_rate)) {
-          update_estimate = true;
-        }
-      }
-    }
-
-    if (update_estimate) {
-      // The first overuse should immediately trigger a new estimate.
-      // We also have to update the estimate immediately if we are overusing
-      // and the target bitrate is too high compared to what we are receiving.
-      const RateControlInput input(detector_.State(),
-                                   incoming_bitrate_.Rate(arrival_time_ms),
-                                   estimator_->var_noise());
-      target_bitrate_bps = remote_rate_.Update(&input, now_ms);
-      update_estimate = remote_rate_.ValidEstimate();
-      ssrcs = Keys(ssrcs_);
-    }
-  }
-  if (update_estimate) {
-    last_update_ms_ = now_ms;
-    observer_->OnReceiveBitrateChanged(ssrcs, target_bitrate_bps);
-  }
-}
-
-void RemoteBitrateEstimatorAbsSendTime::Process() {}
-
-int64_t RemoteBitrateEstimatorAbsSendTime::TimeUntilNextProcess() {
-  const int64_t kDisabledModuleTime = 1000;
-  return kDisabledModuleTime;
-}
-
-void RemoteBitrateEstimatorAbsSendTime::TimeoutStreams(int64_t now_ms) {
-  for (Ssrcs::iterator it = ssrcs_.begin(); it != ssrcs_.end();) {
-    if ((now_ms - it->second) > kStreamTimeOutMs) {
-      ssrcs_.erase(it++);
-    } else {
-      ++it;
-    }
-  }
-  if (ssrcs_.empty()) {
-    // We can't update the estimate if we don't have any active streams.
-    inter_arrival_.reset(
-        new InterArrival((kTimestampGroupLengthMs << kInterArrivalShift) / 1000,
-                         kTimestampToMs, true));
-    estimator_.reset(new OveruseEstimator(OverUseDetectorOptions()));
-    // We deliberately don't reset the first_packet_time_ms_ here for now since
-    // we only probe for bandwidth in the beginning of a call right now.
-  }
-}
-
-void RemoteBitrateEstimatorAbsSendTime::OnRttUpdate(int64_t avg_rtt_ms,
-                                                    int64_t max_rtt_ms) {
-  rtc::CritScope lock(&crit_);
-  remote_rate_.SetRtt(avg_rtt_ms);
-}
-
-void RemoteBitrateEstimatorAbsSendTime::RemoveStream(uint32_t ssrc) {
-  rtc::CritScope lock(&crit_);
-  ssrcs_.erase(ssrc);
-}
-
-bool RemoteBitrateEstimatorAbsSendTime::LatestEstimate(
-    std::vector<uint32_t>* ssrcs,
-    uint32_t* bitrate_bps) const {
-  // Currently accessed from both the process thread (see
-  // ModuleRtpRtcpImpl::Process()) and the configuration thread (see
-  // Call::GetStats()). Should in the future only be accessed from a single
-  // thread.
-  RTC_DCHECK(ssrcs);
-  RTC_DCHECK(bitrate_bps);
-  rtc::CritScope lock(&crit_);
-  if (!remote_rate_.ValidEstimate()) {
-    return false;
-  }
-  *ssrcs = Keys(ssrcs_);
-  if (ssrcs_.empty()) {
-    *bitrate_bps = 0;
-  } else {
-    *bitrate_bps = remote_rate_.LatestEstimate();
-  }
-  return true;
-}
-
-void RemoteBitrateEstimatorAbsSendTime::SetMinBitrate(int min_bitrate_bps) {
-  // Called from both the configuration thread and the network thread. Shouldn't
-  // be called from the network thread in the future.
-  rtc::CritScope lock(&crit_);
-  remote_rate_.SetMinBitrate(min_bitrate_bps);
-}
-}  // namespace webrtc
diff --git a/modules/remote_bitrate_estimator/remote_bitrate_estimator_abs_send_time.h b/modules/remote_bitrate_estimator/remote_bitrate_estimator_abs_send_time.h
deleted file mode 100644
index cde266f..0000000
--- a/modules/remote_bitrate_estimator/remote_bitrate_estimator_abs_send_time.h
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- *  Copyright (c) 2015 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_REMOTE_BITRATE_ESTIMATOR_REMOTE_BITRATE_ESTIMATOR_ABS_SEND_TIME_H_
-#define WEBRTC_MODULES_REMOTE_BITRATE_ESTIMATOR_REMOTE_BITRATE_ESTIMATOR_ABS_SEND_TIME_H_
-
-#include <list>
-#include <map>
-#include <memory>
-#include <vector>
-
-#include "webrtc/modules/remote_bitrate_estimator/aimd_rate_control.h"
-#include "webrtc/modules/remote_bitrate_estimator/include/remote_bitrate_estimator.h"
-#include "webrtc/modules/remote_bitrate_estimator/inter_arrival.h"
-#include "webrtc/modules/remote_bitrate_estimator/overuse_detector.h"
-#include "webrtc/modules/remote_bitrate_estimator/overuse_estimator.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/race_checker.h"
-#include "webrtc/rtc_base/rate_statistics.h"
-
-namespace webrtc {
-
-struct Probe {
-  Probe(int64_t send_time_ms, int64_t recv_time_ms, size_t payload_size)
-      : send_time_ms(send_time_ms),
-        recv_time_ms(recv_time_ms),
-        payload_size(payload_size) {}
-  int64_t send_time_ms;
-  int64_t recv_time_ms;
-  size_t payload_size;
-};
-
-struct Cluster {
-  Cluster()
-      : send_mean_ms(0.0f),
-        recv_mean_ms(0.0f),
-        mean_size(0),
-        count(0),
-        num_above_min_delta(0) {}
-
-  int GetSendBitrateBps() const {
-    RTC_CHECK_GT(send_mean_ms, 0.0f);
-    return mean_size * 8 * 1000 / send_mean_ms;
-  }
-
-  int GetRecvBitrateBps() const {
-    RTC_CHECK_GT(recv_mean_ms, 0.0f);
-    return mean_size * 8 * 1000 / recv_mean_ms;
-  }
-
-  float send_mean_ms;
-  float recv_mean_ms;
-  // TODO(holmer): Add some variance metric as well?
-  size_t mean_size;
-  int count;
-  int num_above_min_delta;
-};
-
-class RemoteBitrateEstimatorAbsSendTime : public RemoteBitrateEstimator {
- public:
-  RemoteBitrateEstimatorAbsSendTime(RemoteBitrateObserver* observer,
-                                    const Clock* clock);
-  virtual ~RemoteBitrateEstimatorAbsSendTime() {}
-
-  void IncomingPacket(int64_t arrival_time_ms,
-                      size_t payload_size,
-                      const RTPHeader& header) override;
-  // This class relies on Process() being called periodically (at least once
-  // every other second) for streams to be timed out properly. Therefore it
-  // shouldn't be detached from the ProcessThread except if it's about to be
-  // deleted.
-  void Process() override;
-  int64_t TimeUntilNextProcess() override;
-  void OnRttUpdate(int64_t avg_rtt_ms, int64_t max_rtt_ms) override;
-  void RemoveStream(uint32_t ssrc) override;
-  bool LatestEstimate(std::vector<uint32_t>* ssrcs,
-                      uint32_t* bitrate_bps) const override;
-  void SetMinBitrate(int min_bitrate_bps) override;
-
- private:
-  typedef std::map<uint32_t, int64_t> Ssrcs;
-  enum class ProbeResult { kBitrateUpdated, kNoUpdate };
-
-  static bool IsWithinClusterBounds(int send_delta_ms,
-                                    const Cluster& cluster_aggregate);
-
-  static void AddCluster(std::list<Cluster>* clusters, Cluster* cluster);
-
-  void IncomingPacketInfo(int64_t arrival_time_ms,
-                          uint32_t send_time_24bits,
-                          size_t payload_size,
-                          uint32_t ssrc);
-
-  void ComputeClusters(std::list<Cluster>* clusters) const;
-
-  std::list<Cluster>::const_iterator FindBestProbe(
-      const std::list<Cluster>& clusters) const;
-
-  // Returns true if a probe which changed the estimate was detected.
-  ProbeResult ProcessClusters(int64_t now_ms)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(&crit_);
-
-  bool IsBitrateImproving(int probe_bitrate_bps) const
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(&crit_);
-
-  void TimeoutStreams(int64_t now_ms) RTC_EXCLUSIVE_LOCKS_REQUIRED(&crit_);
-
-  rtc::RaceChecker network_race_;
-  const Clock* const clock_;
-  RemoteBitrateObserver* const observer_;
-  std::unique_ptr<InterArrival> inter_arrival_;
-  std::unique_ptr<OveruseEstimator> estimator_;
-  OveruseDetector detector_;
-  RateStatistics incoming_bitrate_;
-  bool incoming_bitrate_initialized_;
-  std::vector<int> recent_propagation_delta_ms_;
-  std::vector<int64_t> recent_update_time_ms_;
-  std::list<Probe> probes_;
-  size_t total_probes_received_;
-  int64_t first_packet_time_ms_;
-  int64_t last_update_ms_;
-  bool uma_recorded_;
-
-  rtc::CriticalSection crit_;
-  Ssrcs ssrcs_ RTC_GUARDED_BY(&crit_);
-  AimdRateControl remote_rate_ RTC_GUARDED_BY(&crit_);
-
-  RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(RemoteBitrateEstimatorAbsSendTime);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_REMOTE_BITRATE_ESTIMATOR_REMOTE_BITRATE_ESTIMATOR_ABS_SEND_TIME_H_
diff --git a/modules/remote_bitrate_estimator/remote_bitrate_estimator_abs_send_time_unittest.cc b/modules/remote_bitrate_estimator/remote_bitrate_estimator_abs_send_time_unittest.cc
deleted file mode 100644
index 017cc67..0000000
--- a/modules/remote_bitrate_estimator/remote_bitrate_estimator_abs_send_time_unittest.cc
+++ /dev/null
@@ -1,289 +0,0 @@
-/*
- *  Copyright (c) 2013 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/remote_bitrate_estimator/remote_bitrate_estimator_abs_send_time.h"
-#include "webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_unittest_helper.h"
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace webrtc {
-
-class RemoteBitrateEstimatorAbsSendTimeTest :
-    public RemoteBitrateEstimatorTest {
- public:
-  RemoteBitrateEstimatorAbsSendTimeTest() {}
-  virtual void SetUp() {
-    bitrate_estimator_.reset(new RemoteBitrateEstimatorAbsSendTime(
-        bitrate_observer_.get(), &clock_));
-  }
- protected:
-  RTC_DISALLOW_COPY_AND_ASSIGN(RemoteBitrateEstimatorAbsSendTimeTest);
-};
-
-TEST_F(RemoteBitrateEstimatorAbsSendTimeTest, InitialBehavior) {
-  InitialBehaviorTestHelper(674840);
-}
-
-TEST_F(RemoteBitrateEstimatorAbsSendTimeTest, RateIncreaseReordering) {
-  RateIncreaseReorderingTestHelper(674840);
-}
-
-TEST_F(RemoteBitrateEstimatorAbsSendTimeTest, RateIncreaseRtpTimestamps) {
-  RateIncreaseRtpTimestampsTestHelper(1237);
-}
-
-TEST_F(RemoteBitrateEstimatorAbsSendTimeTest, CapacityDropOneStream) {
-  CapacityDropTestHelper(1, false, 633, 0);
-}
-
-TEST_F(RemoteBitrateEstimatorAbsSendTimeTest, CapacityDropPosOffsetChange) {
-  CapacityDropTestHelper(1, false, 267, 30000);
-}
-
-TEST_F(RemoteBitrateEstimatorAbsSendTimeTest, CapacityDropNegOffsetChange) {
-  CapacityDropTestHelper(1, false, 267, -30000);
-}
-
-TEST_F(RemoteBitrateEstimatorAbsSendTimeTest, CapacityDropOneStreamWrap) {
-  CapacityDropTestHelper(1, true, 633, 0);
-}
-
-TEST_F(RemoteBitrateEstimatorAbsSendTimeTest, CapacityDropTwoStreamsWrap) {
-  CapacityDropTestHelper(2, true, 700, 0);
-}
-
-TEST_F(RemoteBitrateEstimatorAbsSendTimeTest, CapacityDropThreeStreamsWrap) {
-  CapacityDropTestHelper(3, true, 633, 0);
-}
-
-TEST_F(RemoteBitrateEstimatorAbsSendTimeTest, CapacityDropThirteenStreamsWrap) {
-  CapacityDropTestHelper(13, true, 667, 0);
-}
-
-TEST_F(RemoteBitrateEstimatorAbsSendTimeTest, CapacityDropNineteenStreamsWrap) {
-  CapacityDropTestHelper(19, true, 667, 0);
-}
-
-TEST_F(RemoteBitrateEstimatorAbsSendTimeTest, CapacityDropThirtyStreamsWrap) {
-  CapacityDropTestHelper(30, true, 667, 0);
-}
-
-TEST_F(RemoteBitrateEstimatorAbsSendTimeTest, TestTimestampGrouping) {
-  TestTimestampGroupingTestHelper();
-}
-
-TEST_F(RemoteBitrateEstimatorAbsSendTimeTest, TestShortTimeoutAndWrap) {
-  // Simulate a client leaving and rejoining the call after 35 seconds. This
-  // will make abs send time wrap, so if streams aren't timed out properly
-  // the next 30 seconds of packets will be out of order.
-  TestWrappingHelper(35);
-}
-
-TEST_F(RemoteBitrateEstimatorAbsSendTimeTest, TestLongTimeoutAndWrap) {
-  // Simulate a client leaving and rejoining the call after some multiple of
-  // 64 seconds later. This will cause a zero difference in abs send times due
-  // to the wrap, but a big difference in arrival time, if streams aren't
-  // properly timed out.
-  TestWrappingHelper(10 * 64);
-}
-
-TEST_F(RemoteBitrateEstimatorAbsSendTimeTest, TestProcessAfterTimeout) {
-  // This time constant must be equal to the ones defined for the
-  // RemoteBitrateEstimator.
-  const int64_t kStreamTimeOutMs = 2000;
-  const int64_t kProcessIntervalMs = 1000;
-  IncomingPacket(0, 1000, clock_.TimeInMilliseconds(), 0, 0);
-  clock_.AdvanceTimeMilliseconds(kStreamTimeOutMs + 1);
-  // Trigger timeout.
-  bitrate_estimator_->Process();
-  clock_.AdvanceTimeMilliseconds(kProcessIntervalMs);
-  // This shouldn't crash.
-  bitrate_estimator_->Process();
-}
-
-TEST_F(RemoteBitrateEstimatorAbsSendTimeTest, TestProbeDetection) {
-  const int kProbeLength = 5;
-  int64_t now_ms = clock_.TimeInMilliseconds();
-  // First burst sent at 8 * 1000 / 10 = 800 kbps.
-  for (int i = 0; i < kProbeLength; ++i) {
-    clock_.AdvanceTimeMilliseconds(10);
-    now_ms = clock_.TimeInMilliseconds();
-    IncomingPacket(0, 1000, now_ms, 90 * now_ms, AbsSendTime(now_ms, 1000));
-  }
-
-  // Second burst sent at 8 * 1000 / 5 = 1600 kbps.
-  for (int i = 0; i < kProbeLength; ++i) {
-    clock_.AdvanceTimeMilliseconds(5);
-    now_ms = clock_.TimeInMilliseconds();
-    IncomingPacket(0, 1000, now_ms, 90 * now_ms, AbsSendTime(now_ms, 1000));
-  }
-
-  bitrate_estimator_->Process();
-  EXPECT_TRUE(bitrate_observer_->updated());
-  EXPECT_GT(bitrate_observer_->latest_bitrate(), 1500000u);
-}
-
-TEST_F(RemoteBitrateEstimatorAbsSendTimeTest,
-       TestProbeDetectionNonPacedPackets) {
-  const int kProbeLength = 5;
-  int64_t now_ms = clock_.TimeInMilliseconds();
-  // First burst sent at 8 * 1000 / 10 = 800 kbps, but with every other packet
-  // not being paced which could mess things up.
-  for (int i = 0; i < kProbeLength; ++i) {
-    clock_.AdvanceTimeMilliseconds(5);
-    now_ms = clock_.TimeInMilliseconds();
-    IncomingPacket(0, 1000, now_ms, 90 * now_ms, AbsSendTime(now_ms, 1000));
-    // Non-paced packet, arriving 5 ms after.
-    clock_.AdvanceTimeMilliseconds(5);
-    IncomingPacket(0, 100, now_ms, 90 * now_ms, AbsSendTime(now_ms, 1000));
-  }
-
-  bitrate_estimator_->Process();
-  EXPECT_TRUE(bitrate_observer_->updated());
-  EXPECT_GT(bitrate_observer_->latest_bitrate(), 800000u);
-}
-
-// Packets will require 5 ms to be transmitted to the receiver, causing packets
-// of the second probe to be dispersed.
-TEST_F(RemoteBitrateEstimatorAbsSendTimeTest,
-       TestProbeDetectionTooHighBitrate) {
-  const int kProbeLength = 5;
-  int64_t now_ms = clock_.TimeInMilliseconds();
-  int64_t send_time_ms = 0;
-  // First burst sent at 8 * 1000 / 10 = 800 kbps.
-  for (int i = 0; i < kProbeLength; ++i) {
-    clock_.AdvanceTimeMilliseconds(10);
-    now_ms = clock_.TimeInMilliseconds();
-    send_time_ms += 10;
-    IncomingPacket(0, 1000, now_ms, 90 * send_time_ms,
-                   AbsSendTime(send_time_ms, 1000));
-  }
-
-  // Second burst sent at 8 * 1000 / 5 = 1600 kbps, arriving at 8 * 1000 / 8 =
-  // 1000 kbps.
-  for (int i = 0; i < kProbeLength; ++i) {
-    clock_.AdvanceTimeMilliseconds(8);
-    now_ms = clock_.TimeInMilliseconds();
-    send_time_ms += 5;
-    IncomingPacket(0, 1000, now_ms, send_time_ms,
-                   AbsSendTime(send_time_ms, 1000));
-  }
-
-  bitrate_estimator_->Process();
-  EXPECT_TRUE(bitrate_observer_->updated());
-  EXPECT_NEAR(bitrate_observer_->latest_bitrate(), 800000u, 10000);
-}
-
-TEST_F(RemoteBitrateEstimatorAbsSendTimeTest,
-       TestProbeDetectionSlightlyFasterArrival) {
-  const int kProbeLength = 5;
-  int64_t now_ms = clock_.TimeInMilliseconds();
-  // First burst sent at 8 * 1000 / 10 = 800 kbps.
-  // Arriving at 8 * 1000 / 5 = 1600 kbps.
-  int64_t send_time_ms = 0;
-  for (int i = 0; i < kProbeLength; ++i) {
-    clock_.AdvanceTimeMilliseconds(5);
-    send_time_ms += 10;
-    now_ms = clock_.TimeInMilliseconds();
-    IncomingPacket(0, 1000, now_ms, 90 * send_time_ms,
-                   AbsSendTime(send_time_ms, 1000));
-  }
-
-  bitrate_estimator_->Process();
-  EXPECT_TRUE(bitrate_observer_->updated());
-  EXPECT_GT(bitrate_observer_->latest_bitrate(), 800000u);
-}
-
-TEST_F(RemoteBitrateEstimatorAbsSendTimeTest, TestProbeDetectionFasterArrival) {
-  const int kProbeLength = 5;
-  int64_t now_ms = clock_.TimeInMilliseconds();
-  // First burst sent at 8 * 1000 / 10 = 800 kbps.
-  // Arriving at 8 * 1000 / 5 = 1600 kbps.
-  int64_t send_time_ms = 0;
-  for (int i = 0; i < kProbeLength; ++i) {
-    clock_.AdvanceTimeMilliseconds(1);
-    send_time_ms += 10;
-    now_ms = clock_.TimeInMilliseconds();
-    IncomingPacket(0, 1000, now_ms, 90 * send_time_ms,
-                   AbsSendTime(send_time_ms, 1000));
-  }
-
-  bitrate_estimator_->Process();
-  EXPECT_FALSE(bitrate_observer_->updated());
-}
-
-TEST_F(RemoteBitrateEstimatorAbsSendTimeTest, TestProbeDetectionSlowerArrival) {
-  const int kProbeLength = 5;
-  int64_t now_ms = clock_.TimeInMilliseconds();
-  // First burst sent at 8 * 1000 / 5 = 1600 kbps.
-  // Arriving at 8 * 1000 / 7 = 1142 kbps.
-  int64_t send_time_ms = 0;
-  for (int i = 0; i < kProbeLength; ++i) {
-    clock_.AdvanceTimeMilliseconds(7);
-    send_time_ms += 5;
-    now_ms = clock_.TimeInMilliseconds();
-    IncomingPacket(0, 1000, now_ms, 90 * send_time_ms,
-                   AbsSendTime(send_time_ms, 1000));
-  }
-
-  bitrate_estimator_->Process();
-  EXPECT_TRUE(bitrate_observer_->updated());
-  EXPECT_NEAR(bitrate_observer_->latest_bitrate(), 1140000, 10000);
-}
-
-TEST_F(RemoteBitrateEstimatorAbsSendTimeTest,
-       TestProbeDetectionSlowerArrivalHighBitrate) {
-  const int kProbeLength = 5;
-  int64_t now_ms = clock_.TimeInMilliseconds();
-  // Burst sent at 8 * 1000 / 1 = 8000 kbps.
-  // Arriving at 8 * 1000 / 2 = 4000 kbps.
-  int64_t send_time_ms = 0;
-  for (int i = 0; i < kProbeLength; ++i) {
-    clock_.AdvanceTimeMilliseconds(2);
-    send_time_ms += 1;
-    now_ms = clock_.TimeInMilliseconds();
-    IncomingPacket(0, 1000, now_ms, 90 * send_time_ms,
-                   AbsSendTime(send_time_ms, 1000));
-  }
-
-  bitrate_estimator_->Process();
-  EXPECT_TRUE(bitrate_observer_->updated());
-  EXPECT_NEAR(bitrate_observer_->latest_bitrate(), 4000000u, 10000);
-}
-
-TEST_F(RemoteBitrateEstimatorAbsSendTimeTest, ProbingIgnoresSmallPackets) {
-  const int kProbeLength = 5;
-  int64_t now_ms = clock_.TimeInMilliseconds();
-  // Probing with 200 bytes every 10 ms, should be ignored by the probe
-  // detection.
-  for (int i = 0; i < kProbeLength; ++i) {
-    clock_.AdvanceTimeMilliseconds(10);
-    now_ms = clock_.TimeInMilliseconds();
-    IncomingPacket(0, 200, now_ms, 90 * now_ms, AbsSendTime(now_ms, 1000));
-  }
-
-  bitrate_estimator_->Process();
-  EXPECT_FALSE(bitrate_observer_->updated());
-
-  // Followed by a probe with 1000 bytes packets, should be detected as a
-  // probe.
-  for (int i = 0; i < kProbeLength; ++i) {
-    clock_.AdvanceTimeMilliseconds(10);
-    now_ms = clock_.TimeInMilliseconds();
-    IncomingPacket(0, 1000, now_ms, 90 * now_ms, AbsSendTime(now_ms, 1000));
-  }
-
-  // Wait long enough so that we can call Process again.
-  clock_.AdvanceTimeMilliseconds(1000);
-
-  bitrate_estimator_->Process();
-  EXPECT_TRUE(bitrate_observer_->updated());
-  EXPECT_NEAR(bitrate_observer_->latest_bitrate(), 800000u, 10000);
-}
-}  // namespace webrtc
diff --git a/modules/remote_bitrate_estimator/remote_bitrate_estimator_single_stream.cc b/modules/remote_bitrate_estimator/remote_bitrate_estimator_single_stream.cc
deleted file mode 100644
index 050a5b7..0000000
--- a/modules/remote_bitrate_estimator/remote_bitrate_estimator_single_stream.cc
+++ /dev/null
@@ -1,256 +0,0 @@
-/*
- *  Copyright (c) 2012 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/remote_bitrate_estimator/remote_bitrate_estimator_single_stream.h"
-
-#include <utility>
-
-#include "webrtc/modules/remote_bitrate_estimator/aimd_rate_control.h"
-#include "webrtc/modules/remote_bitrate_estimator/inter_arrival.h"
-#include "webrtc/modules/remote_bitrate_estimator/overuse_detector.h"
-#include "webrtc/modules/remote_bitrate_estimator/overuse_estimator.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/system_wrappers/include/clock.h"
-#include "webrtc/system_wrappers/include/metrics.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-enum { kTimestampGroupLengthMs = 5 };
-static const double kTimestampToMs = 1.0 / 90.0;
-
-struct RemoteBitrateEstimatorSingleStream::Detector {
-  explicit Detector(int64_t last_packet_time_ms,
-                    const OverUseDetectorOptions& options,
-                    bool enable_burst_grouping)
-      : last_packet_time_ms(last_packet_time_ms),
-        inter_arrival(90 * kTimestampGroupLengthMs,
-                      kTimestampToMs,
-                      enable_burst_grouping),
-        estimator(options),
-        detector() {}
-  int64_t last_packet_time_ms;
-  InterArrival inter_arrival;
-  OveruseEstimator estimator;
-  OveruseDetector detector;
-};
-
-RemoteBitrateEstimatorSingleStream::RemoteBitrateEstimatorSingleStream(
-    RemoteBitrateObserver* observer,
-    const Clock* clock)
-    : clock_(clock),
-      incoming_bitrate_(kBitrateWindowMs, 8000),
-      last_valid_incoming_bitrate_(0),
-      remote_rate_(new AimdRateControl()),
-      observer_(observer),
-      last_process_time_(-1),
-      process_interval_ms_(kProcessIntervalMs),
-      uma_recorded_(false) {
-  LOG(LS_INFO) << "RemoteBitrateEstimatorSingleStream: Instantiating.";
-}
-
-RemoteBitrateEstimatorSingleStream::~RemoteBitrateEstimatorSingleStream() {
-  while (!overuse_detectors_.empty()) {
-    SsrcOveruseEstimatorMap::iterator it = overuse_detectors_.begin();
-    delete it->second;
-    overuse_detectors_.erase(it);
-  }
-}
-
-void RemoteBitrateEstimatorSingleStream::IncomingPacket(
-    int64_t arrival_time_ms,
-    size_t payload_size,
-    const RTPHeader& header) {
-  if (!uma_recorded_) {
-    BweNames type = BweNames::kReceiverTOffset;
-    if (!header.extension.hasTransmissionTimeOffset)
-      type = BweNames::kReceiverNoExtension;
-    RTC_HISTOGRAM_ENUMERATION(kBweTypeHistogram, type, BweNames::kBweNamesMax);
-    uma_recorded_ = true;
-  }
-  uint32_t ssrc = header.ssrc;
-  uint32_t rtp_timestamp = header.timestamp +
-      header.extension.transmissionTimeOffset;
-  int64_t now_ms = clock_->TimeInMilliseconds();
-  rtc::CritScope cs(&crit_sect_);
-  SsrcOveruseEstimatorMap::iterator it = overuse_detectors_.find(ssrc);
-  if (it == overuse_detectors_.end()) {
-    // This is a new SSRC. Adding to map.
-    // TODO(holmer): If the channel changes SSRC the old SSRC will still be
-    // around in this map until the channel is deleted. This is OK since the
-    // callback will no longer be called for the old SSRC. This will be
-    // automatically cleaned up when we have one RemoteBitrateEstimator per REMB
-    // group.
-    std::pair<SsrcOveruseEstimatorMap::iterator, bool> insert_result =
-        overuse_detectors_.insert(std::make_pair(
-            ssrc, new Detector(now_ms, OverUseDetectorOptions(), true)));
-    it = insert_result.first;
-  }
-  Detector* estimator = it->second;
-  estimator->last_packet_time_ms = now_ms;
-
-  // Check if incoming bitrate estimate is valid, and if it needs to be reset.
-  rtc::Optional<uint32_t> incoming_bitrate = incoming_bitrate_.Rate(now_ms);
-  if (incoming_bitrate) {
-    last_valid_incoming_bitrate_ = *incoming_bitrate;
-  } else if (last_valid_incoming_bitrate_ > 0) {
-    // Incoming bitrate had a previous valid value, but now not enough data
-    // point are left within the current window. Reset incoming bitrate
-    // estimator so that the window size will only contain new data points.
-    incoming_bitrate_.Reset();
-    last_valid_incoming_bitrate_ = 0;
-  }
-  incoming_bitrate_.Update(payload_size, now_ms);
-
-  const BandwidthUsage prior_state = estimator->detector.State();
-  uint32_t timestamp_delta = 0;
-  int64_t time_delta = 0;
-  int size_delta = 0;
-  if (estimator->inter_arrival.ComputeDeltas(
-          rtp_timestamp, arrival_time_ms, now_ms, payload_size,
-          &timestamp_delta, &time_delta, &size_delta)) {
-    double timestamp_delta_ms = timestamp_delta * kTimestampToMs;
-    estimator->estimator.Update(time_delta, timestamp_delta_ms, size_delta,
-                                estimator->detector.State(), now_ms);
-    estimator->detector.Detect(estimator->estimator.offset(),
-                               timestamp_delta_ms,
-                               estimator->estimator.num_of_deltas(), now_ms);
-  }
-  if (estimator->detector.State() == BandwidthUsage::kBwOverusing) {
-    rtc::Optional<uint32_t> incoming_bitrate_bps =
-        incoming_bitrate_.Rate(now_ms);
-    if (incoming_bitrate_bps &&
-        (prior_state != BandwidthUsage::kBwOverusing ||
-         GetRemoteRate()->TimeToReduceFurther(now_ms, *incoming_bitrate_bps))) {
-      // The first overuse should immediately trigger a new estimate.
-      // We also have to update the estimate immediately if we are overusing
-      // and the target bitrate is too high compared to what we are receiving.
-      UpdateEstimate(now_ms);
-    }
-  }
-}
-
-void RemoteBitrateEstimatorSingleStream::Process() {
-  {
-    rtc::CritScope cs(&crit_sect_);
-    UpdateEstimate(clock_->TimeInMilliseconds());
-  }
-  last_process_time_ = clock_->TimeInMilliseconds();
-}
-
-int64_t RemoteBitrateEstimatorSingleStream::TimeUntilNextProcess() {
-  if (last_process_time_ < 0) {
-    return 0;
-  }
-  rtc::CritScope cs_(&crit_sect_);
-  RTC_DCHECK_GT(process_interval_ms_, 0);
-  return last_process_time_ + process_interval_ms_ -
-      clock_->TimeInMilliseconds();
-}
-
-void RemoteBitrateEstimatorSingleStream::UpdateEstimate(int64_t now_ms) {
-  BandwidthUsage bw_state = BandwidthUsage::kBwNormal;
-  double sum_var_noise = 0.0;
-  SsrcOveruseEstimatorMap::iterator it = overuse_detectors_.begin();
-  while (it != overuse_detectors_.end()) {
-    const int64_t time_of_last_received_packet =
-        it->second->last_packet_time_ms;
-    if (time_of_last_received_packet >= 0 &&
-        now_ms - time_of_last_received_packet > kStreamTimeOutMs) {
-      // This over-use detector hasn't received packets for |kStreamTimeOutMs|
-      // milliseconds and is considered stale.
-      delete it->second;
-      overuse_detectors_.erase(it++);
-    } else {
-      sum_var_noise += it->second->estimator.var_noise();
-      // Make sure that we trigger an over-use if any of the over-use detectors
-      // is detecting over-use.
-      if (it->second->detector.State() > bw_state) {
-        bw_state = it->second->detector.State();
-      }
-      ++it;
-    }
-  }
-  // We can't update the estimate if we don't have any active streams.
-  if (overuse_detectors_.empty()) {
-    return;
-  }
-  AimdRateControl* remote_rate = GetRemoteRate();
-
-  double mean_noise_var = sum_var_noise /
-      static_cast<double>(overuse_detectors_.size());
-  const RateControlInput input(bw_state,
-                               incoming_bitrate_.Rate(now_ms),
-                               mean_noise_var);
-  uint32_t target_bitrate = remote_rate->Update(&input, now_ms);
-  if (remote_rate->ValidEstimate()) {
-    process_interval_ms_ = remote_rate->GetFeedbackInterval();
-    RTC_DCHECK_GT(process_interval_ms_, 0);
-    std::vector<uint32_t> ssrcs;
-    GetSsrcs(&ssrcs);
-    if (observer_)
-      observer_->OnReceiveBitrateChanged(ssrcs, target_bitrate);
-  }
-}
-
-void RemoteBitrateEstimatorSingleStream::OnRttUpdate(int64_t avg_rtt_ms,
-                                                     int64_t max_rtt_ms) {
-  rtc::CritScope cs(&crit_sect_);
-  GetRemoteRate()->SetRtt(avg_rtt_ms);
-}
-
-void RemoteBitrateEstimatorSingleStream::RemoveStream(unsigned int ssrc) {
-  rtc::CritScope cs(&crit_sect_);
-  SsrcOveruseEstimatorMap::iterator it = overuse_detectors_.find(ssrc);
-  if (it != overuse_detectors_.end()) {
-    delete it->second;
-    overuse_detectors_.erase(it);
-  }
-}
-
-bool RemoteBitrateEstimatorSingleStream::LatestEstimate(
-    std::vector<uint32_t>* ssrcs,
-    uint32_t* bitrate_bps) const {
-  rtc::CritScope cs(&crit_sect_);
-  assert(bitrate_bps);
-  if (!remote_rate_->ValidEstimate()) {
-    return false;
-  }
-  GetSsrcs(ssrcs);
-  if (ssrcs->empty())
-    *bitrate_bps = 0;
-  else
-    *bitrate_bps = remote_rate_->LatestEstimate();
-  return true;
-}
-
-void RemoteBitrateEstimatorSingleStream::GetSsrcs(
-    std::vector<uint32_t>* ssrcs) const {
-  assert(ssrcs);
-  ssrcs->resize(overuse_detectors_.size());
-  int i = 0;
-  for (SsrcOveruseEstimatorMap::const_iterator it = overuse_detectors_.begin();
-      it != overuse_detectors_.end(); ++it, ++i) {
-    (*ssrcs)[i] = it->first;
-  }
-}
-
-AimdRateControl* RemoteBitrateEstimatorSingleStream::GetRemoteRate() {
-  if (!remote_rate_)
-    remote_rate_.reset(new AimdRateControl());
-  return remote_rate_.get();
-}
-
-void RemoteBitrateEstimatorSingleStream::SetMinBitrate(int min_bitrate_bps) {
-  rtc::CritScope cs(&crit_sect_);
-  remote_rate_->SetMinBitrate(min_bitrate_bps);
-}
-
-}  // namespace webrtc
diff --git a/modules/remote_bitrate_estimator/remote_bitrate_estimator_single_stream.h b/modules/remote_bitrate_estimator/remote_bitrate_estimator_single_stream.h
deleted file mode 100644
index 4634492..0000000
--- a/modules/remote_bitrate_estimator/remote_bitrate_estimator_single_stream.h
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- *  Copyright (c) 2015 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_REMOTE_BITRATE_ESTIMATOR_REMOTE_BITRATE_ESTIMATOR_SINGLE_STREAM_H_
-#define WEBRTC_MODULES_REMOTE_BITRATE_ESTIMATOR_REMOTE_BITRATE_ESTIMATOR_SINGLE_STREAM_H_
-
-#include <map>
-#include <memory>
-#include <vector>
-
-#include "webrtc/modules/remote_bitrate_estimator/aimd_rate_control.h"
-#include "webrtc/modules/remote_bitrate_estimator/include/remote_bitrate_estimator.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/rate_statistics.h"
-
-namespace webrtc {
-
-class RemoteBitrateEstimatorSingleStream : public RemoteBitrateEstimator {
- public:
-  RemoteBitrateEstimatorSingleStream(RemoteBitrateObserver* observer,
-                                     const Clock* clock);
-  virtual ~RemoteBitrateEstimatorSingleStream();
-
-  void IncomingPacket(int64_t arrival_time_ms,
-                      size_t payload_size,
-                      const RTPHeader& header) override;
-  void Process() override;
-  int64_t TimeUntilNextProcess() override;
-  void OnRttUpdate(int64_t avg_rtt_ms, int64_t max_rtt_ms) override;
-  void RemoveStream(uint32_t ssrc) override;
-  bool LatestEstimate(std::vector<uint32_t>* ssrcs,
-                      uint32_t* bitrate_bps) const override;
-  void SetMinBitrate(int min_bitrate_bps) override;
-
- private:
-  struct Detector;
-
-  typedef std::map<uint32_t, Detector*> SsrcOveruseEstimatorMap;
-
-  // Triggers a new estimate calculation.
-  void UpdateEstimate(int64_t time_now)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_sect_);
-
-  void GetSsrcs(std::vector<uint32_t>* ssrcs) const
-      RTC_SHARED_LOCKS_REQUIRED(crit_sect_);
-
-  // Returns |remote_rate_| if the pointed to object exists,
-  // otherwise creates it.
-  AimdRateControl* GetRemoteRate() RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_sect_);
-
-  const Clock* const clock_;
-  SsrcOveruseEstimatorMap overuse_detectors_ RTC_GUARDED_BY(crit_sect_);
-  RateStatistics incoming_bitrate_ RTC_GUARDED_BY(crit_sect_);
-  uint32_t last_valid_incoming_bitrate_ RTC_GUARDED_BY(crit_sect_);
-  std::unique_ptr<AimdRateControl> remote_rate_ RTC_GUARDED_BY(crit_sect_);
-  RemoteBitrateObserver* const observer_ RTC_GUARDED_BY(crit_sect_);
-  rtc::CriticalSection crit_sect_;
-  int64_t last_process_time_;
-  int64_t process_interval_ms_ RTC_GUARDED_BY(crit_sect_);
-  bool uma_recorded_;
-
-  RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(RemoteBitrateEstimatorSingleStream);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_REMOTE_BITRATE_ESTIMATOR_REMOTE_BITRATE_ESTIMATOR_SINGLE_STREAM_H_
diff --git a/modules/remote_bitrate_estimator/remote_bitrate_estimator_single_stream_unittest.cc b/modules/remote_bitrate_estimator/remote_bitrate_estimator_single_stream_unittest.cc
deleted file mode 100644
index 639a8ce..0000000
--- a/modules/remote_bitrate_estimator/remote_bitrate_estimator_single_stream_unittest.cc
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- *  Copyright (c) 2013 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/remote_bitrate_estimator/remote_bitrate_estimator_single_stream.h"
-#include "webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_unittest_helper.h"
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace webrtc {
-
-class RemoteBitrateEstimatorSingleTest :
-    public RemoteBitrateEstimatorTest {
- public:
-  RemoteBitrateEstimatorSingleTest() {}
-  virtual void SetUp() {
-    bitrate_estimator_.reset(new RemoteBitrateEstimatorSingleStream(
-        bitrate_observer_.get(), &clock_));
-  }
- protected:
-  RTC_DISALLOW_COPY_AND_ASSIGN(RemoteBitrateEstimatorSingleTest);
-};
-
-TEST_F(RemoteBitrateEstimatorSingleTest, InitialBehavior) {
-  InitialBehaviorTestHelper(508017);
-}
-
-TEST_F(RemoteBitrateEstimatorSingleTest, RateIncreaseReordering) {
-  RateIncreaseReorderingTestHelper(506422);
-}
-
-TEST_F(RemoteBitrateEstimatorSingleTest, RateIncreaseRtpTimestamps) {
-  RateIncreaseRtpTimestampsTestHelper(1267);
-}
-
-TEST_F(RemoteBitrateEstimatorSingleTest, CapacityDropOneStream) {
-  CapacityDropTestHelper(1, false, 633, 0);
-}
-
-TEST_F(RemoteBitrateEstimatorSingleTest, CapacityDropOneStreamWrap) {
-  CapacityDropTestHelper(1, true, 633, 0);
-}
-
-TEST_F(RemoteBitrateEstimatorSingleTest, CapacityDropTwoStreamsWrap) {
-  CapacityDropTestHelper(2, true, 767, 0);
-}
-
-TEST_F(RemoteBitrateEstimatorSingleTest, CapacityDropThreeStreamsWrap) {
-  CapacityDropTestHelper(3, true, 567, 0);
-}
-
-TEST_F(RemoteBitrateEstimatorSingleTest, CapacityDropThirteenStreamsWrap) {
-  CapacityDropTestHelper(13, true, 733, 0);
-}
-
-TEST_F(RemoteBitrateEstimatorSingleTest, CapacityDropNineteenStreamsWrap) {
-  CapacityDropTestHelper(19, true, 700, 0);
-}
-
-TEST_F(RemoteBitrateEstimatorSingleTest, CapacityDropThirtyStreamsWrap) {
-  CapacityDropTestHelper(30, true, 733, 0);
-}
-
-TEST_F(RemoteBitrateEstimatorSingleTest, TestTimestampGrouping) {
-  TestTimestampGroupingTestHelper();
-}
-}  // namespace webrtc
diff --git a/modules/remote_bitrate_estimator/remote_bitrate_estimator_unittest_helper.cc b/modules/remote_bitrate_estimator/remote_bitrate_estimator_unittest_helper.cc
deleted file mode 100644
index 4c12eac..0000000
--- a/modules/remote_bitrate_estimator/remote_bitrate_estimator_unittest_helper.cc
+++ /dev/null
@@ -1,616 +0,0 @@
-/*
- *  Copyright (c) 2012 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/remote_bitrate_estimator/remote_bitrate_estimator_unittest_helper.h"
-
-#include <algorithm>
-#include <limits>
-#include <utility>
-
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-
-const size_t kMtu = 1200;
-const uint32_t kAcceptedBitrateErrorBps = 50000;
-
-// Number of packets needed before we have a valid estimate.
-const int kNumInitialPackets = 2;
-
-namespace testing {
-
-void TestBitrateObserver::OnReceiveBitrateChanged(
-    const std::vector<uint32_t>& ssrcs,
-    uint32_t bitrate) {
-  latest_bitrate_ = bitrate;
-  updated_ = true;
-}
-
-RtpStream::RtpStream(int fps,
-                     int bitrate_bps,
-                     uint32_t ssrc,
-                     uint32_t frequency,
-                     uint32_t timestamp_offset,
-                     int64_t rtcp_receive_time)
-    : fps_(fps),
-      bitrate_bps_(bitrate_bps),
-      ssrc_(ssrc),
-      frequency_(frequency),
-      next_rtp_time_(0),
-      next_rtcp_time_(rtcp_receive_time),
-      rtp_timestamp_offset_(timestamp_offset),
-      kNtpFracPerMs(4.294967296E6) {
-  assert(fps_ > 0);
-}
-
-void RtpStream::set_rtp_timestamp_offset(uint32_t offset) {
-  rtp_timestamp_offset_ = offset;
-}
-
-// Generates a new frame for this stream. If called too soon after the
-// previous frame, no frame will be generated. The frame is split into
-// packets.
-int64_t RtpStream::GenerateFrame(int64_t time_now_us, PacketList* packets) {
-  if (time_now_us < next_rtp_time_) {
-    return next_rtp_time_;
-  }
-  assert(packets != NULL);
-  size_t bits_per_frame = (bitrate_bps_ + fps_ / 2) / fps_;
-  size_t n_packets =
-      std::max<size_t>((bits_per_frame + 4 * kMtu) / (8 * kMtu), 1u);
-  size_t packet_size = (bits_per_frame + 4 * n_packets) / (8 * n_packets);
-  for (size_t i = 0; i < n_packets; ++i) {
-    RtpPacket* packet = new RtpPacket;
-    packet->send_time = time_now_us + kSendSideOffsetUs;
-    packet->size = packet_size;
-    packet->rtp_timestamp = rtp_timestamp_offset_ + static_cast<uint32_t>(
-        ((frequency_ / 1000) * packet->send_time + 500) / 1000);
-    packet->ssrc = ssrc_;
-    packets->push_back(packet);
-  }
-  next_rtp_time_ = time_now_us + (1000000 + fps_ / 2) / fps_;
-  return next_rtp_time_;
-}
-
-// The send-side time when the next frame can be generated.
-int64_t RtpStream::next_rtp_time() const {
-  return next_rtp_time_;
-}
-
-// Generates an RTCP packet.
-RtpStream::RtcpPacket* RtpStream::Rtcp(int64_t time_now_us) {
-  if (time_now_us < next_rtcp_time_) {
-    return NULL;
-  }
-  RtcpPacket* rtcp = new RtcpPacket;
-  int64_t send_time_us = time_now_us + kSendSideOffsetUs;
-  rtcp->timestamp = rtp_timestamp_offset_ + static_cast<uint32_t>(
-      ((frequency_ / 1000) * send_time_us + 500) / 1000);
-  rtcp->ntp_secs = send_time_us / 1000000;
-  rtcp->ntp_frac = static_cast<int64_t>((send_time_us % 1000000) *
-      kNtpFracPerMs);
-  rtcp->ssrc = ssrc_;
-  next_rtcp_time_ = time_now_us + kRtcpIntervalUs;
-  return rtcp;
-}
-
-void RtpStream::set_bitrate_bps(int bitrate_bps) {
-  ASSERT_GE(bitrate_bps, 0);
-  bitrate_bps_ = bitrate_bps;
-}
-
-int RtpStream::bitrate_bps() const {
-  return bitrate_bps_;
-}
-
-uint32_t RtpStream::ssrc() const {
-  return ssrc_;
-}
-
-bool RtpStream::Compare(const std::pair<uint32_t, RtpStream*>& left,
-                        const std::pair<uint32_t, RtpStream*>& right) {
-  return left.second->next_rtp_time_ < right.second->next_rtp_time_;
-}
-
-StreamGenerator::StreamGenerator(int capacity, int64_t time_now)
-    : capacity_(capacity),
-      prev_arrival_time_us_(time_now) {}
-
-StreamGenerator::~StreamGenerator() {
-  for (StreamMap::iterator it = streams_.begin(); it != streams_.end();
-      ++it) {
-    delete it->second;
-  }
-  streams_.clear();
-}
-
-// Add a new stream.
-void StreamGenerator::AddStream(RtpStream* stream) {
-  streams_[stream->ssrc()] = stream;
-}
-
-// Set the link capacity.
-void StreamGenerator::set_capacity_bps(int capacity_bps) {
-  ASSERT_GT(capacity_bps, 0);
-  capacity_ = capacity_bps;
-}
-
-// Divides |bitrate_bps| among all streams. The allocated bitrate per stream
-// is decided by the current allocation ratios.
-void StreamGenerator::SetBitrateBps(int bitrate_bps) {
-  ASSERT_GE(streams_.size(), 0u);
-  int total_bitrate_before = 0;
-  for (StreamMap::iterator it = streams_.begin(); it != streams_.end(); ++it) {
-    total_bitrate_before += it->second->bitrate_bps();
-  }
-  int64_t bitrate_before = 0;
-  int total_bitrate_after = 0;
-  for (StreamMap::iterator it = streams_.begin(); it != streams_.end(); ++it) {
-    bitrate_before += it->second->bitrate_bps();
-    int64_t bitrate_after = (bitrate_before * bitrate_bps +
-        total_bitrate_before / 2) / total_bitrate_before;
-    it->second->set_bitrate_bps(bitrate_after - total_bitrate_after);
-    total_bitrate_after += it->second->bitrate_bps();
-  }
-  ASSERT_EQ(bitrate_before, total_bitrate_before);
-  EXPECT_EQ(total_bitrate_after, bitrate_bps);
-}
-
-// Set the RTP timestamp offset for the stream identified by |ssrc|.
-void StreamGenerator::set_rtp_timestamp_offset(uint32_t ssrc, uint32_t offset) {
-  streams_[ssrc]->set_rtp_timestamp_offset(offset);
-}
-
-// TODO(holmer): Break out the channel simulation part from this class to make
-// it possible to simulate different types of channels.
-int64_t StreamGenerator::GenerateFrame(RtpStream::PacketList* packets,
-                                       int64_t time_now_us) {
-  assert(packets != NULL);
-  assert(packets->empty());
-  assert(capacity_ > 0);
-  StreamMap::iterator it = std::min_element(streams_.begin(), streams_.end(),
-                                            RtpStream::Compare);
-  (*it).second->GenerateFrame(time_now_us, packets);
-  int i = 0;
-  for (RtpStream::PacketList::iterator packet_it = packets->begin();
-      packet_it != packets->end(); ++packet_it) {
-    int capacity_bpus = capacity_ / 1000;
-    int64_t required_network_time_us =
-        (8 * 1000 * (*packet_it)->size + capacity_bpus / 2) / capacity_bpus;
-    prev_arrival_time_us_ = std::max(time_now_us + required_network_time_us,
-        prev_arrival_time_us_ + required_network_time_us);
-    (*packet_it)->arrival_time = prev_arrival_time_us_;
-    ++i;
-  }
-  it = std::min_element(streams_.begin(), streams_.end(), RtpStream::Compare);
-  return std::max((*it).second->next_rtp_time(), time_now_us);
-}
-}  // namespace testing
-
-RemoteBitrateEstimatorTest::RemoteBitrateEstimatorTest()
-    : clock_(100000000),
-      bitrate_observer_(new testing::TestBitrateObserver),
-      stream_generator_(new testing::StreamGenerator(
-          1e6,  // Capacity.
-          clock_.TimeInMicroseconds())),
-      arrival_time_offset_ms_(0) {}
-
-RemoteBitrateEstimatorTest::~RemoteBitrateEstimatorTest() {}
-
-void RemoteBitrateEstimatorTest::AddDefaultStream() {
-  stream_generator_->AddStream(new testing::RtpStream(
-    30,          // Frames per second.
-    3e5,         // Bitrate.
-    1,           // SSRC.
-    90000,       // RTP frequency.
-    0xFFFFF000,  // Timestamp offset.
-    0));         // RTCP receive time.
-}
-
-uint32_t RemoteBitrateEstimatorTest::AbsSendTime(int64_t t, int64_t denom) {
-  return (((t << 18) + (denom >> 1)) / denom) & 0x00fffffful;
-}
-
-uint32_t RemoteBitrateEstimatorTest::AddAbsSendTime(uint32_t t1, uint32_t t2) {
-  return (t1 + t2) & 0x00fffffful;
-}
-
-const uint32_t RemoteBitrateEstimatorTest::kDefaultSsrc = 1;
-
-void RemoteBitrateEstimatorTest::IncomingPacket(uint32_t ssrc,
-                                                size_t payload_size,
-                                                int64_t arrival_time,
-                                                uint32_t rtp_timestamp,
-                                                uint32_t absolute_send_time) {
-  RTPHeader header;
-  memset(&header, 0, sizeof(header));
-  header.ssrc = ssrc;
-  header.timestamp = rtp_timestamp;
-  header.extension.hasAbsoluteSendTime = true;
-  header.extension.absoluteSendTime = absolute_send_time;
-  RTC_CHECK_GE(arrival_time + arrival_time_offset_ms_, 0);
-  bitrate_estimator_->IncomingPacket(arrival_time + arrival_time_offset_ms_,
-                                     payload_size, header);
-}
-
-// Generates a frame of packets belonging to a stream at a given bitrate and
-// with a given ssrc. The stream is pushed through a very simple simulated
-// network, and is then given to the receive-side bandwidth estimator.
-// Returns true if an over-use was seen, false otherwise.
-// The StreamGenerator::updated() should be used to check for any changes in
-// target bitrate after the call to this function.
-bool RemoteBitrateEstimatorTest::GenerateAndProcessFrame(uint32_t ssrc,
-                                                         uint32_t bitrate_bps) {
-  RTC_DCHECK_GT(bitrate_bps, 0);
-  stream_generator_->SetBitrateBps(bitrate_bps);
-  testing::RtpStream::PacketList packets;
-  int64_t next_time_us = stream_generator_->GenerateFrame(
-      &packets, clock_.TimeInMicroseconds());
-  bool overuse = false;
-  while (!packets.empty()) {
-    testing::RtpStream::RtpPacket* packet = packets.front();
-    bitrate_observer_->Reset();
-    // The simulated clock should match the time of packet->arrival_time
-    // since both are used in IncomingPacket().
-    clock_.AdvanceTimeMicroseconds(packet->arrival_time -
-                                   clock_.TimeInMicroseconds());
-    IncomingPacket(packet->ssrc, packet->size,
-                   (packet->arrival_time + 500) / 1000, packet->rtp_timestamp,
-                   AbsSendTime(packet->send_time, 1000000));
-    if (bitrate_observer_->updated()) {
-      if (bitrate_observer_->latest_bitrate() < bitrate_bps)
-        overuse = true;
-    }
-    delete packet;
-    packets.pop_front();
-  }
-  if (bitrate_estimator_->TimeUntilNextProcess() <= 0)
-    bitrate_estimator_->Process();
-  clock_.AdvanceTimeMicroseconds(next_time_us - clock_.TimeInMicroseconds());
-  return overuse;
-}
-
-// Run the bandwidth estimator with a stream of |number_of_frames| frames, or
-// until it reaches |target_bitrate|.
-// Can for instance be used to run the estimator for some time to get it
-// into a steady state.
-uint32_t RemoteBitrateEstimatorTest::SteadyStateRun(uint32_t ssrc,
-                                                    int max_number_of_frames,
-                                                    uint32_t start_bitrate,
-                                                    uint32_t min_bitrate,
-                                                    uint32_t max_bitrate,
-                                                    uint32_t target_bitrate) {
-  uint32_t bitrate_bps = start_bitrate;
-  bool bitrate_update_seen = false;
-  // Produce |number_of_frames| frames and give them to the estimator.
-  for (int i = 0; i < max_number_of_frames; ++i) {
-    bool overuse = GenerateAndProcessFrame(ssrc, bitrate_bps);
-    if (overuse) {
-      EXPECT_LT(bitrate_observer_->latest_bitrate(), max_bitrate);
-      EXPECT_GT(bitrate_observer_->latest_bitrate(), min_bitrate);
-      bitrate_bps = bitrate_observer_->latest_bitrate();
-      bitrate_update_seen = true;
-    } else if (bitrate_observer_->updated()) {
-      bitrate_bps = bitrate_observer_->latest_bitrate();
-      bitrate_observer_->Reset();
-    }
-    if (bitrate_update_seen && bitrate_bps > target_bitrate) {
-      break;
-    }
-  }
-  EXPECT_TRUE(bitrate_update_seen);
-  return bitrate_bps;
-}
-
-void RemoteBitrateEstimatorTest::InitialBehaviorTestHelper(
-    uint32_t expected_converge_bitrate) {
-  const int kFramerate = 50;  // 50 fps to avoid rounding errors.
-  const int kFrameIntervalMs = 1000 / kFramerate;
-  const uint32_t kFrameIntervalAbsSendTime = AbsSendTime(1, kFramerate);
-  uint32_t bitrate_bps = 0;
-  uint32_t timestamp = 0;
-  uint32_t absolute_send_time = 0;
-  std::vector<uint32_t> ssrcs;
-  EXPECT_FALSE(bitrate_estimator_->LatestEstimate(&ssrcs, &bitrate_bps));
-  EXPECT_EQ(0u, ssrcs.size());
-  clock_.AdvanceTimeMilliseconds(1000);
-  bitrate_estimator_->Process();
-  EXPECT_FALSE(bitrate_estimator_->LatestEstimate(&ssrcs, &bitrate_bps));
-  EXPECT_FALSE(bitrate_observer_->updated());
-  bitrate_observer_->Reset();
-  clock_.AdvanceTimeMilliseconds(1000);
-  // Inserting packets for 5 seconds to get a valid estimate.
-  for (int i = 0; i < 5 * kFramerate + 1 + kNumInitialPackets; ++i) {
-    if (i == kNumInitialPackets) {
-      bitrate_estimator_->Process();
-      EXPECT_FALSE(bitrate_estimator_->LatestEstimate(&ssrcs, &bitrate_bps));
-      EXPECT_EQ(0u, ssrcs.size());
-      EXPECT_FALSE(bitrate_observer_->updated());
-      bitrate_observer_->Reset();
-    }
-
-    IncomingPacket(kDefaultSsrc, kMtu, clock_.TimeInMilliseconds(), timestamp,
-                   absolute_send_time);
-    clock_.AdvanceTimeMilliseconds(1000 / kFramerate);
-    timestamp += 90 * kFrameIntervalMs;
-    absolute_send_time = AddAbsSendTime(absolute_send_time,
-                                        kFrameIntervalAbsSendTime);
-  }
-  bitrate_estimator_->Process();
-  EXPECT_TRUE(bitrate_estimator_->LatestEstimate(&ssrcs, &bitrate_bps));
-  ASSERT_EQ(1u, ssrcs.size());
-  EXPECT_EQ(kDefaultSsrc, ssrcs.front());
-  EXPECT_NEAR(expected_converge_bitrate, bitrate_bps, kAcceptedBitrateErrorBps);
-  EXPECT_TRUE(bitrate_observer_->updated());
-  bitrate_observer_->Reset();
-  EXPECT_EQ(bitrate_observer_->latest_bitrate(), bitrate_bps);
-  bitrate_estimator_->RemoveStream(kDefaultSsrc);
-  EXPECT_TRUE(bitrate_estimator_->LatestEstimate(&ssrcs, &bitrate_bps));
-  ASSERT_EQ(0u, ssrcs.size());
-  EXPECT_EQ(0u, bitrate_bps);
-}
-
-void RemoteBitrateEstimatorTest::RateIncreaseReorderingTestHelper(
-    uint32_t expected_bitrate_bps) {
-  const int kFramerate = 50;  // 50 fps to avoid rounding errors.
-  const int kFrameIntervalMs = 1000 / kFramerate;
-  const uint32_t kFrameIntervalAbsSendTime = AbsSendTime(1, kFramerate);
-  uint32_t timestamp = 0;
-  uint32_t absolute_send_time = 0;
-  // Inserting packets for five seconds to get a valid estimate.
-  for (int i = 0; i < 5 * kFramerate + 1 + kNumInitialPackets; ++i) {
-    // TODO(sprang): Remove this hack once the single stream estimator is gone,
-    // as it doesn't do anything in Process().
-    if (i == kNumInitialPackets) {
-      // Process after we have enough frames to get a valid input rate estimate.
-      bitrate_estimator_->Process();
-      EXPECT_FALSE(bitrate_observer_->updated());  // No valid estimate.
-    }
-
-    IncomingPacket(kDefaultSsrc, kMtu, clock_.TimeInMilliseconds(), timestamp,
-                   absolute_send_time);
-    clock_.AdvanceTimeMilliseconds(kFrameIntervalMs);
-    timestamp += 90 * kFrameIntervalMs;
-    absolute_send_time = AddAbsSendTime(absolute_send_time,
-                                        kFrameIntervalAbsSendTime);
-  }
-  bitrate_estimator_->Process();
-  EXPECT_TRUE(bitrate_observer_->updated());
-  EXPECT_NEAR(expected_bitrate_bps,
-              bitrate_observer_->latest_bitrate(),
-              kAcceptedBitrateErrorBps);
-  for (int i = 0; i < 10; ++i) {
-    clock_.AdvanceTimeMilliseconds(2 * kFrameIntervalMs);
-    timestamp += 2 * 90 * kFrameIntervalMs;
-    absolute_send_time = AddAbsSendTime(absolute_send_time,
-                                        2 * kFrameIntervalAbsSendTime);
-    IncomingPacket(kDefaultSsrc, 1000, clock_.TimeInMilliseconds(), timestamp,
-                   absolute_send_time);
-    IncomingPacket(
-        kDefaultSsrc, 1000, clock_.TimeInMilliseconds(),
-        timestamp - 90 * kFrameIntervalMs,
-        AddAbsSendTime(absolute_send_time,
-                       -static_cast<int>(kFrameIntervalAbsSendTime)));
-  }
-  bitrate_estimator_->Process();
-  EXPECT_TRUE(bitrate_observer_->updated());
-  EXPECT_NEAR(expected_bitrate_bps,
-              bitrate_observer_->latest_bitrate(),
-              kAcceptedBitrateErrorBps);
-}
-
-// Make sure we initially increase the bitrate as expected.
-void RemoteBitrateEstimatorTest::RateIncreaseRtpTimestampsTestHelper(
-    int expected_iterations) {
-  // This threshold corresponds approximately to increasing linearly with
-  // bitrate(i) = 1.04 * bitrate(i-1) + 1000
-  // until bitrate(i) > 500000, with bitrate(1) ~= 30000.
-  uint32_t bitrate_bps = 30000;
-  int iterations = 0;
-  AddDefaultStream();
-  // Feed the estimator with a stream of packets and verify that it reaches
-  // 500 kbps at the expected time.
-  while (bitrate_bps < 5e5) {
-    bool overuse = GenerateAndProcessFrame(kDefaultSsrc, bitrate_bps);
-    if (overuse) {
-      EXPECT_GT(bitrate_observer_->latest_bitrate(), bitrate_bps);
-      bitrate_bps = bitrate_observer_->latest_bitrate();
-      bitrate_observer_->Reset();
-    } else if (bitrate_observer_->updated()) {
-      bitrate_bps = bitrate_observer_->latest_bitrate();
-      bitrate_observer_->Reset();
-    }
-    ++iterations;
-    ASSERT_LE(iterations, expected_iterations);
-  }
-  ASSERT_EQ(expected_iterations, iterations);
-}
-
-void RemoteBitrateEstimatorTest::CapacityDropTestHelper(
-    int number_of_streams,
-    bool wrap_time_stamp,
-    uint32_t expected_bitrate_drop_delta,
-    int64_t receiver_clock_offset_change_ms) {
-  const int kFramerate = 30;
-  const int kStartBitrate = 900e3;
-  const int kMinExpectedBitrate = 800e3;
-  const int kMaxExpectedBitrate = 1100e3;
-  const uint32_t kInitialCapacityBps = 1000e3;
-  const uint32_t kReducedCapacityBps = 500e3;
-
-  int steady_state_time = 0;
-  if (number_of_streams <= 1) {
-    steady_state_time = 10;
-    AddDefaultStream();
-  } else {
-    steady_state_time = 10 * number_of_streams;
-    int bitrate_sum = 0;
-    int kBitrateDenom = number_of_streams * (number_of_streams - 1);
-    for (int i = 0; i < number_of_streams; i++) {
-      // First stream gets half available bitrate, while the rest share the
-      // remaining half i.e.: 1/2 = Sum[n/(N*(N-1))] for n=1..N-1 (rounded up)
-      int bitrate = kStartBitrate / 2;
-      if (i > 0) {
-        bitrate = (kStartBitrate * i + kBitrateDenom / 2) / kBitrateDenom;
-      }
-      uint32_t mask = ~0ull << (32 - i);
-      stream_generator_->AddStream(
-          new testing::RtpStream(kFramerate,          // Frames per second.
-                                 bitrate,             // Bitrate.
-                                 kDefaultSsrc + i,    // SSRC.
-                                 90000,               // RTP frequency.
-                                 0xFFFFF000u ^ mask,  // Timestamp offset.
-                                 0));                 // RTCP receive time.
-      bitrate_sum += bitrate;
-    }
-    ASSERT_EQ(bitrate_sum, kStartBitrate);
-  }
-  if (wrap_time_stamp) {
-    stream_generator_->set_rtp_timestamp_offset(kDefaultSsrc,
-        std::numeric_limits<uint32_t>::max() - steady_state_time * 90000);
-  }
-
-  // Run in steady state to make the estimator converge.
-  stream_generator_->set_capacity_bps(kInitialCapacityBps);
-  uint32_t bitrate_bps = SteadyStateRun(
-      kDefaultSsrc, steady_state_time * kFramerate, kStartBitrate,
-      kMinExpectedBitrate, kMaxExpectedBitrate, kInitialCapacityBps);
-  EXPECT_NEAR(kInitialCapacityBps, bitrate_bps, 130000u);
-  bitrate_observer_->Reset();
-
-  // Add an offset to make sure the BWE can handle it.
-  arrival_time_offset_ms_ += receiver_clock_offset_change_ms;
-
-  // Reduce the capacity and verify the decrease time.
-  stream_generator_->set_capacity_bps(kReducedCapacityBps);
-  int64_t overuse_start_time = clock_.TimeInMilliseconds();
-  int64_t bitrate_drop_time = -1;
-  for (int i = 0; i < 100 * number_of_streams; ++i) {
-    GenerateAndProcessFrame(kDefaultSsrc, bitrate_bps);
-    if (bitrate_drop_time == -1 &&
-        bitrate_observer_->latest_bitrate() <= kReducedCapacityBps) {
-      bitrate_drop_time = clock_.TimeInMilliseconds();
-    }
-    if (bitrate_observer_->updated())
-      bitrate_bps = bitrate_observer_->latest_bitrate();
-  }
-
-  EXPECT_NEAR(expected_bitrate_drop_delta,
-              bitrate_drop_time - overuse_start_time, 33);
-
-  // Remove stream one by one.
-  uint32_t latest_bps = 0;
-  std::vector<uint32_t> ssrcs;
-  for (int i = 0; i < number_of_streams; i++) {
-    EXPECT_TRUE(bitrate_estimator_->LatestEstimate(&ssrcs, &latest_bps));
-    EXPECT_EQ(number_of_streams - i, static_cast<int>(ssrcs.size()));
-    EXPECT_EQ(bitrate_bps, latest_bps);
-    for (int j = i; j < number_of_streams; j++) {
-      EXPECT_EQ(kDefaultSsrc + j, ssrcs[j - i]);
-    }
-    bitrate_estimator_->RemoveStream(kDefaultSsrc + i);
-  }
-  EXPECT_TRUE(bitrate_estimator_->LatestEstimate(&ssrcs, &latest_bps));
-  EXPECT_EQ(0u, ssrcs.size());
-  EXPECT_EQ(0u, latest_bps);
-}
-
-void RemoteBitrateEstimatorTest::TestTimestampGroupingTestHelper() {
-  const int kFramerate = 50;  // 50 fps to avoid rounding errors.
-  const int kFrameIntervalMs = 1000 / kFramerate;
-  const uint32_t kFrameIntervalAbsSendTime = AbsSendTime(1, kFramerate);
-  uint32_t timestamp = 0;
-  // Initialize absolute_send_time (24 bits) so that it will definitely wrap
-  // during the test.
-  uint32_t absolute_send_time = AddAbsSendTime(
-      (1 << 24), -static_cast<int>(50 * kFrameIntervalAbsSendTime));
-  // Initial set of frames to increase the bitrate. 6 seconds to have enough
-  // time for the first estimate to be generated and for Process() to be called.
-  for (int i = 0; i <= 6 * kFramerate; ++i) {
-    IncomingPacket(kDefaultSsrc, 1000, clock_.TimeInMilliseconds(), timestamp,
-                   absolute_send_time);
-    bitrate_estimator_->Process();
-    clock_.AdvanceTimeMilliseconds(kFrameIntervalMs);
-    timestamp += 90 * kFrameIntervalMs;
-    absolute_send_time = AddAbsSendTime(absolute_send_time,
-                                        kFrameIntervalAbsSendTime);
-  }
-  EXPECT_TRUE(bitrate_observer_->updated());
-  EXPECT_GE(bitrate_observer_->latest_bitrate(), 400000u);
-
-  // Insert batches of frames which were sent very close in time. Also simulate
-  // capacity over-use to see that we back off correctly.
-  const int kTimestampGroupLength = 15;
-  const uint32_t kTimestampGroupLengthAbsSendTime =
-      AbsSendTime(kTimestampGroupLength, 90000);
-  const uint32_t kSingleRtpTickAbsSendTime = AbsSendTime(1, 90000);
-  for (int i = 0; i < 100; ++i) {
-    for (int j = 0; j < kTimestampGroupLength; ++j) {
-      // Insert |kTimestampGroupLength| frames with just 1 timestamp ticks in
-      // between. Should be treated as part of the same group by the estimator.
-      IncomingPacket(kDefaultSsrc, 100, clock_.TimeInMilliseconds(), timestamp,
-                     absolute_send_time);
-      clock_.AdvanceTimeMilliseconds(kFrameIntervalMs / kTimestampGroupLength);
-      timestamp += 1;
-      absolute_send_time = AddAbsSendTime(absolute_send_time,
-                                          kSingleRtpTickAbsSendTime);
-    }
-    // Increase time until next batch to simulate over-use.
-    clock_.AdvanceTimeMilliseconds(10);
-    timestamp += 90 * kFrameIntervalMs - kTimestampGroupLength;
-    absolute_send_time = AddAbsSendTime(
-        absolute_send_time,
-        AddAbsSendTime(kFrameIntervalAbsSendTime,
-                       -static_cast<int>(kTimestampGroupLengthAbsSendTime)));
-    bitrate_estimator_->Process();
-  }
-  EXPECT_TRUE(bitrate_observer_->updated());
-  // Should have reduced the estimate.
-  EXPECT_LT(bitrate_observer_->latest_bitrate(), 400000u);
-}
-
-void RemoteBitrateEstimatorTest::TestWrappingHelper(
-    int silence_time_s) {
-  const int kFramerate = 100;
-  const int kFrameIntervalMs = 1000 / kFramerate;
-  const uint32_t kFrameIntervalAbsSendTime = AbsSendTime(1, kFramerate);
-  uint32_t absolute_send_time = 0;
-  uint32_t timestamp = 0;
-
-  for (size_t i = 0; i < 3000; ++i) {
-    IncomingPacket(kDefaultSsrc, 1000, clock_.TimeInMilliseconds(), timestamp,
-                   absolute_send_time);
-    timestamp += kFrameIntervalMs;
-    clock_.AdvanceTimeMilliseconds(kFrameIntervalMs);
-    absolute_send_time = AddAbsSendTime(absolute_send_time,
-                                        kFrameIntervalAbsSendTime);
-    bitrate_estimator_->Process();
-  }
-  uint32_t bitrate_before = 0;
-  std::vector<uint32_t> ssrcs;
-  bitrate_estimator_->LatestEstimate(&ssrcs, &bitrate_before);
-
-  clock_.AdvanceTimeMilliseconds(silence_time_s * 1000);
-  absolute_send_time = AddAbsSendTime(absolute_send_time,
-                                      AbsSendTime(silence_time_s, 1));
-  bitrate_estimator_->Process();
-  for (size_t i = 0; i < 21; ++i) {
-    IncomingPacket(kDefaultSsrc, 1000, clock_.TimeInMilliseconds(), timestamp,
-                   absolute_send_time);
-    timestamp += kFrameIntervalMs;
-    clock_.AdvanceTimeMilliseconds(2 * kFrameIntervalMs);
-    absolute_send_time = AddAbsSendTime(absolute_send_time,
-                                        kFrameIntervalAbsSendTime);
-    bitrate_estimator_->Process();
-  }
-  uint32_t bitrate_after = 0;
-  bitrate_estimator_->LatestEstimate(&ssrcs, &bitrate_after);
-  EXPECT_LT(bitrate_after, bitrate_before);
-}
-}  // namespace webrtc
diff --git a/modules/remote_bitrate_estimator/remote_bitrate_estimator_unittest_helper.h b/modules/remote_bitrate_estimator/remote_bitrate_estimator_unittest_helper.h
deleted file mode 100644
index 27c54d6..0000000
--- a/modules/remote_bitrate_estimator/remote_bitrate_estimator_unittest_helper.h
+++ /dev/null
@@ -1,221 +0,0 @@
-/*
- *  Copyright (c) 2012 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_REMOTE_BITRATE_ESTIMATOR_REMOTE_BITRATE_ESTIMATOR_UNITTEST_HELPER_H_
-#define WEBRTC_MODULES_REMOTE_BITRATE_ESTIMATOR_REMOTE_BITRATE_ESTIMATOR_UNITTEST_HELPER_H_
-
-#include <list>
-#include <map>
-#include <memory>
-#include <utility>
-#include <vector>
-
-#include "webrtc/modules/remote_bitrate_estimator/include/remote_bitrate_estimator.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/system_wrappers/include/clock.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-namespace testing {
-
-class TestBitrateObserver : public RemoteBitrateObserver {
- public:
-  TestBitrateObserver() : updated_(false), latest_bitrate_(0) {}
-  virtual ~TestBitrateObserver() {}
-
-  void OnReceiveBitrateChanged(const std::vector<uint32_t>& ssrcs,
-                               uint32_t bitrate) override;
-
-  void Reset() { updated_ = false; }
-
-  bool updated() const { return updated_; }
-
-  uint32_t latest_bitrate() const { return latest_bitrate_; }
-
- private:
-  bool updated_;
-  uint32_t latest_bitrate_;
-};
-
-class RtpStream {
- public:
-  struct RtpPacket {
-    int64_t send_time;
-    int64_t arrival_time;
-    uint32_t rtp_timestamp;
-    size_t size;
-    uint32_t ssrc;
-  };
-
-  struct RtcpPacket {
-    uint32_t ntp_secs;
-    uint32_t ntp_frac;
-    uint32_t timestamp;
-    uint32_t ssrc;
-  };
-
-  typedef std::list<RtpPacket*> PacketList;
-
-  enum { kSendSideOffsetUs = 1000000 };
-
-  RtpStream(int fps,
-            int bitrate_bps,
-            uint32_t ssrc,
-            uint32_t frequency,
-            uint32_t timestamp_offset,
-            int64_t rtcp_receive_time);
-  void set_rtp_timestamp_offset(uint32_t offset);
-
-  // Generates a new frame for this stream. If called too soon after the
-  // previous frame, no frame will be generated. The frame is split into
-  // packets.
-  int64_t GenerateFrame(int64_t time_now_us, PacketList* packets);
-
-  // The send-side time when the next frame can be generated.
-  int64_t next_rtp_time() const;
-
-  // Generates an RTCP packet.
-  RtcpPacket* Rtcp(int64_t time_now_us);
-
-  void set_bitrate_bps(int bitrate_bps);
-
-  int bitrate_bps() const;
-
-  uint32_t ssrc() const;
-
-  static bool Compare(const std::pair<uint32_t, RtpStream*>& left,
-                      const std::pair<uint32_t, RtpStream*>& right);
-
- private:
-  enum { kRtcpIntervalUs = 1000000 };
-
-  int fps_;
-  int bitrate_bps_;
-  uint32_t ssrc_;
-  uint32_t frequency_;
-  int64_t next_rtp_time_;
-  int64_t next_rtcp_time_;
-  uint32_t rtp_timestamp_offset_;
-  const double kNtpFracPerMs;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(RtpStream);
-};
-
-class StreamGenerator {
- public:
-  typedef std::list<RtpStream::RtcpPacket*> RtcpList;
-
-  StreamGenerator(int capacity, int64_t time_now);
-
-  ~StreamGenerator();
-
-  // Add a new stream.
-  void AddStream(RtpStream* stream);
-
-  // Set the link capacity.
-  void set_capacity_bps(int capacity_bps);
-
-  // Divides |bitrate_bps| among all streams. The allocated bitrate per stream
-  // is decided by the initial allocation ratios.
-  void SetBitrateBps(int bitrate_bps);
-
-  // Set the RTP timestamp offset for the stream identified by |ssrc|.
-  void set_rtp_timestamp_offset(uint32_t ssrc, uint32_t offset);
-
-  // TODO(holmer): Break out the channel simulation part from this class to make
-  // it possible to simulate different types of channels.
-  int64_t GenerateFrame(RtpStream::PacketList* packets, int64_t time_now_us);
-
- private:
-  typedef std::map<uint32_t, RtpStream*> StreamMap;
-
-  // Capacity of the simulated channel in bits per second.
-  int capacity_;
-  // The time when the last packet arrived.
-  int64_t prev_arrival_time_us_;
-  // All streams being transmitted on this simulated channel.
-  StreamMap streams_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(StreamGenerator);
-};
-}  // namespace testing
-
-class RemoteBitrateEstimatorTest : public ::testing::Test {
- public:
-  RemoteBitrateEstimatorTest();
-  virtual ~RemoteBitrateEstimatorTest();
-
- protected:
-  virtual void SetUp() = 0;
-
-  void AddDefaultStream();
-
-  // Helper to convert some time format to resolution used in absolute send time
-  // header extension, rounded upwards. |t| is the time to convert, in some
-  // resolution. |denom| is the value to divide |t| by to get whole seconds,
-  // e.g. |denom| = 1000 if |t| is in milliseconds.
-  static uint32_t AbsSendTime(int64_t t, int64_t denom);
-
-  // Helper to add two absolute send time values and keep it less than 1<<24.
-  static uint32_t AddAbsSendTime(uint32_t t1, uint32_t t2);
-
-  // Helper to create a WebRtcRTPHeader containing the relevant data for the
-  // estimator (all other fields are cleared) and call IncomingPacket on the
-  // estimator.
-  void IncomingPacket(uint32_t ssrc,
-                      size_t payload_size,
-                      int64_t arrival_time,
-                      uint32_t rtp_timestamp,
-                      uint32_t absolute_send_time);
-
-  // Generates a frame of packets belonging to a stream at a given bitrate and
-  // with a given ssrc. The stream is pushed through a very simple simulated
-  // network, and is then given to the receive-side bandwidth estimator.
-  // Returns true if an over-use was seen, false otherwise.
-  // The StreamGenerator::updated() should be used to check for any changes in
-  // target bitrate after the call to this function.
-  bool GenerateAndProcessFrame(uint32_t ssrc, uint32_t bitrate_bps);
-
-  // Run the bandwidth estimator with a stream of |number_of_frames| frames, or
-  // until it reaches |target_bitrate|.
-  // Can for instance be used to run the estimator for some time to get it
-  // into a steady state.
-  uint32_t SteadyStateRun(uint32_t ssrc,
-                          int number_of_frames,
-                          uint32_t start_bitrate,
-                          uint32_t min_bitrate,
-                          uint32_t max_bitrate,
-                          uint32_t target_bitrate);
-
-  void TestTimestampGroupingTestHelper();
-
-  void TestWrappingHelper(int silence_time_s);
-
-  void InitialBehaviorTestHelper(uint32_t expected_converge_bitrate);
-  void RateIncreaseReorderingTestHelper(uint32_t expected_bitrate);
-  void RateIncreaseRtpTimestampsTestHelper(int expected_iterations);
-  void CapacityDropTestHelper(int number_of_streams,
-                              bool wrap_time_stamp,
-                              uint32_t expected_bitrate_drop_delta,
-                              int64_t receiver_clock_offset_change_ms);
-
-  static const uint32_t kDefaultSsrc;
-
-  SimulatedClock clock_;  // Time at the receiver.
-  std::unique_ptr<testing::TestBitrateObserver> bitrate_observer_;
-  std::unique_ptr<RemoteBitrateEstimator> bitrate_estimator_;
-  std::unique_ptr<testing::StreamGenerator> stream_generator_;
-  int64_t arrival_time_offset_ms_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(RemoteBitrateEstimatorTest);
-};
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_REMOTE_BITRATE_ESTIMATOR_REMOTE_BITRATE_ESTIMATOR_UNITTEST_HELPER_H_
diff --git a/modules/remote_bitrate_estimator/remote_bitrate_estimators_test.cc b/modules/remote_bitrate_estimator/remote_bitrate_estimators_test.cc
deleted file mode 100644
index 97b8bcf..0000000
--- a/modules/remote_bitrate_estimator/remote_bitrate_estimators_test.cc
+++ /dev/null
@@ -1,227 +0,0 @@
-/*
- *  Copyright (c) 2013 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_WIN
-#include <sys/types.h>
-#include <unistd.h>
-#endif
-
-#include <algorithm>
-#include <sstream>
-
-#include "webrtc/modules/remote_bitrate_estimator/include/remote_bitrate_estimator.h"
-#include "webrtc/modules/remote_bitrate_estimator/test/bwe_test.h"
-#include "webrtc/modules/remote_bitrate_estimator/test/packet_receiver.h"
-#include "webrtc/modules/remote_bitrate_estimator/test/packet_sender.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/random.h"
-#include "webrtc/test/testsupport/fileutils.h"
-
-namespace webrtc {
-namespace testing {
-namespace bwe {
-
-// This test fixture is used to instantiate tests running with adaptive video
-// senders.
-class BweFeedbackTest
-    : public BweTest,
-      public ::testing::TestWithParam<BandwidthEstimatorType> {
- public:
-#ifdef WEBRTC_WIN
-  BweFeedbackTest()
-      : BweTest(), random_(Clock::GetRealTimeClock()->TimeInMicroseconds()) {}
-#else
-  BweFeedbackTest()
-      : BweTest(),
-        // Multiply the time by a random-ish odd number derived from the PID.
-        random_((getpid() | 1) *
-                Clock::GetRealTimeClock()->TimeInMicroseconds()) {}
-#endif
-  virtual ~BweFeedbackTest() {}
-
- protected:
-  Random random_;
-
- private:
-  RTC_DISALLOW_COPY_AND_ASSIGN(BweFeedbackTest);
-};
-
-INSTANTIATE_TEST_CASE_P(VideoSendersTest,
-                        BweFeedbackTest,
-                        ::testing::Values(kRembEstimator, kSendSideEstimator));
-
-TEST_P(BweFeedbackTest, ConstantCapacity) {
-  AdaptiveVideoSource source(0, 30, 300, 0, 0);
-  PacedVideoSender sender(&uplink_, &source, GetParam());
-  ChokeFilter filter(&uplink_, 0);
-  RateCounterFilter counter(&uplink_, 0, "Receiver", bwe_names[GetParam()]);
-  PacketReceiver receiver(&uplink_, 0, GetParam(), false, false);
-  const int kCapacityKbps = 1000;
-  filter.set_capacity_kbps(kCapacityKbps);
-  filter.set_max_delay_ms(500);
-  RunFor(180 * 1000);
-  PrintResults(kCapacityKbps, counter.GetBitrateStats(), 0,
-               receiver.GetDelayStats(), counter.GetBitrateStats());
-}
-
-TEST_P(BweFeedbackTest, Choke1000kbps500kbps1000kbps) {
-  AdaptiveVideoSource source(0, 30, 300, 0, 0);
-  PacedVideoSender sender(&uplink_, &source, GetParam());
-  ChokeFilter filter(&uplink_, 0);
-  RateCounterFilter counter(&uplink_, 0, "Receiver", bwe_names[GetParam()]);
-  PacketReceiver receiver(&uplink_, 0, GetParam(), false, false);
-  const int kHighCapacityKbps = 1000;
-  const int kLowCapacityKbps = 500;
-  filter.set_capacity_kbps(kHighCapacityKbps);
-  filter.set_max_delay_ms(500);
-  RunFor(60 * 1000);
-  filter.set_capacity_kbps(kLowCapacityKbps);
-  RunFor(60 * 1000);
-  filter.set_capacity_kbps(kHighCapacityKbps);
-  RunFor(60 * 1000);
-  PrintResults((2 * kHighCapacityKbps + kLowCapacityKbps) / 3.0,
-               counter.GetBitrateStats(), 0, receiver.GetDelayStats(),
-               counter.GetBitrateStats());
-}
-
-TEST_P(BweFeedbackTest, Choke200kbps30kbps200kbps) {
-  AdaptiveVideoSource source(0, 30, 300, 0, 0);
-  PacedVideoSender sender(&uplink_, &source, GetParam());
-  ChokeFilter filter(&uplink_, 0);
-  RateCounterFilter counter(&uplink_, 0, "Receiver", bwe_names[GetParam()]);
-  PacketReceiver receiver(&uplink_, 0, GetParam(), false, false);
-  const int kHighCapacityKbps = 200;
-  const int kLowCapacityKbps = 30;
-  filter.set_capacity_kbps(kHighCapacityKbps);
-  filter.set_max_delay_ms(500);
-  RunFor(60 * 1000);
-  filter.set_capacity_kbps(kLowCapacityKbps);
-  RunFor(60 * 1000);
-  filter.set_capacity_kbps(kHighCapacityKbps);
-  RunFor(60 * 1000);
-
-  PrintResults((2 * kHighCapacityKbps + kLowCapacityKbps) / 3.0,
-               counter.GetBitrateStats(), 0, receiver.GetDelayStats(),
-               counter.GetBitrateStats());
-}
-
-TEST_P(BweFeedbackTest, Verizon4gDownlinkTest) {
-  AdaptiveVideoSource source(0, 30, 300, 0, 0);
-  VideoSender sender(&uplink_, &source, GetParam());
-  RateCounterFilter counter1(&uplink_, 0, "sender_output",
-                             bwe_names[GetParam()]);
-  TraceBasedDeliveryFilter filter(&uplink_, 0, "link_capacity");
-  RateCounterFilter counter2(&uplink_, 0, "Receiver", bwe_names[GetParam()]);
-  PacketReceiver receiver(&uplink_, 0, GetParam(), false, false);
-  ASSERT_TRUE(filter.Init(test::ResourcePath("verizon4g-downlink", "rx")));
-  RunFor(22 * 60 * 1000);
-  PrintResults(filter.GetBitrateStats().GetMean(), counter2.GetBitrateStats(),
-               0, receiver.GetDelayStats(), counter2.GetBitrateStats());
-}
-
-// webrtc:3277
-TEST_P(BweFeedbackTest, GoogleWifiTrace3Mbps) {
-  AdaptiveVideoSource source(0, 30, 300, 0, 0);
-  VideoSender sender(&uplink_, &source, GetParam());
-  RateCounterFilter counter1(&uplink_, 0, "sender_output",
-                             bwe_names[GetParam()]);
-  TraceBasedDeliveryFilter filter(&uplink_, 0, "link_capacity");
-  filter.set_max_delay_ms(500);
-  RateCounterFilter counter2(&uplink_, 0, "Receiver", bwe_names[GetParam()]);
-  PacketReceiver receiver(&uplink_, 0, GetParam(), false, false);
-  ASSERT_TRUE(filter.Init(test::ResourcePath("google-wifi-3mbps", "rx")));
-  RunFor(300 * 1000);
-  PrintResults(filter.GetBitrateStats().GetMean(), counter2.GetBitrateStats(),
-               0, receiver.GetDelayStats(), counter2.GetBitrateStats());
-}
-
-TEST_P(BweFeedbackTest, PacedSelfFairness50msTest) {
-  int64_t kRttMs = 100;
-  int64_t kMaxJitterMs = 15;
-
-  const int kNumRmcatFlows = 4;
-  int64_t offset_ms[kNumRmcatFlows];
-  for (int i = 0; i < kNumRmcatFlows; ++i) {
-    offset_ms[i] = std::max(0, 5000 * i + random_.Rand(-1000, 1000));
-  }
-
-  RunFairnessTest(GetParam(), kNumRmcatFlows, 0, 300, 3000, 50, kRttMs,
-                  kMaxJitterMs, offset_ms);
-}
-
-TEST_P(BweFeedbackTest, PacedSelfFairness500msTest) {
-  int64_t kRttMs = 100;
-  int64_t kMaxJitterMs = 15;
-
-  const int kNumRmcatFlows = 4;
-  int64_t offset_ms[kNumRmcatFlows];
-  for (int i = 0; i < kNumRmcatFlows; ++i) {
-    offset_ms[i] = std::max(0, 5000 * i + random_.Rand(-1000, 1000));
-  }
-
-  RunFairnessTest(GetParam(), kNumRmcatFlows, 0, 300, 3000, 500, kRttMs,
-                  kMaxJitterMs, offset_ms);
-}
-
-TEST_P(BweFeedbackTest, PacedSelfFairness1000msTest) {
-  int64_t kRttMs = 100;
-  int64_t kMaxJitterMs = 15;
-
-  const int kNumRmcatFlows = 4;
-  int64_t offset_ms[kNumRmcatFlows];
-  for (int i = 0; i < kNumRmcatFlows; ++i) {
-    offset_ms[i] = std::max(0, 5000 * i + random_.Rand(-1000, 1000));
-  }
-
-  RunFairnessTest(GetParam(), kNumRmcatFlows, 0, 300, 3000, 1000, kRttMs,
-                  kMaxJitterMs, offset_ms);
-}
-
-TEST_P(BweFeedbackTest, TcpFairness50msTest) {
-  int64_t kRttMs = 100;
-  int64_t kMaxJitterMs = 15;
-
-  int64_t offset_ms[2];  // One TCP, one RMCAT flow.
-  for (int i = 0; i < 2; ++i) {
-    offset_ms[i] = std::max(0, 5000 * i + random_.Rand(-1000, 1000));
-  }
-
-  RunFairnessTest(GetParam(), 1, 1, 300, 2000, 50, kRttMs, kMaxJitterMs,
-                  offset_ms);
-}
-
-TEST_P(BweFeedbackTest, TcpFairness500msTest) {
-  int64_t kRttMs = 100;
-  int64_t kMaxJitterMs = 15;
-
-  int64_t offset_ms[2];  // One TCP, one RMCAT flow.
-  for (int i = 0; i < 2; ++i) {
-    offset_ms[i] = std::max(0, 5000 * i + random_.Rand(-1000, 1000));
-  }
-
-  RunFairnessTest(GetParam(), 1, 1, 300, 2000, 500, kRttMs, kMaxJitterMs,
-                  offset_ms);
-}
-
-TEST_P(BweFeedbackTest, TcpFairness1000msTest) {
-  int64_t kRttMs = 100;
-  int64_t kMaxJitterMs = 15;
-
-  int64_t offset_ms[2];  // One TCP, one RMCAT flow.
-  for (int i = 0; i < 2; ++i) {
-    offset_ms[i] = std::max(0, 5000 * i + random_.Rand(-1000, 1000));
-  }
-
-  RunFairnessTest(GetParam(), 1, 1, 300, 2000, 1000, kRttMs, kMaxJitterMs,
-                  offset_ms);
-}
-}  // namespace bwe
-}  // namespace testing
-}  // namespace webrtc
diff --git a/modules/remote_bitrate_estimator/remote_estimator_proxy.cc b/modules/remote_bitrate_estimator/remote_estimator_proxy.cc
deleted file mode 100644
index 6ddee17..0000000
--- a/modules/remote_bitrate_estimator/remote_estimator_proxy.cc
+++ /dev/null
@@ -1,201 +0,0 @@
-/*
- *  Copyright (c) 2015 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/remote_bitrate_estimator/remote_estimator_proxy.h"
-
-#include <limits>
-#include <algorithm>
-
-#include "webrtc/modules/pacing/packet_router.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/transport_feedback.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/safe_minmax.h"
-#include "webrtc/system_wrappers/include/clock.h"
-
-namespace webrtc {
-
-// TODO(sprang): Tune these!
-const int RemoteEstimatorProxy::kBackWindowMs = 500;
-const int RemoteEstimatorProxy::kMinSendIntervalMs = 50;
-const int RemoteEstimatorProxy::kMaxSendIntervalMs = 250;
-const int RemoteEstimatorProxy::kDefaultSendIntervalMs = 100;
-
-// The maximum allowed value for a timestamp in milliseconds. This is lower
-// than the numerical limit since we often convert to microseconds.
-static constexpr int64_t kMaxTimeMs =
-    std::numeric_limits<int64_t>::max() / 1000;
-
-RemoteEstimatorProxy::RemoteEstimatorProxy(const Clock* clock,
-                                           PacketRouter* packet_router)
-    : clock_(clock),
-      packet_router_(packet_router),
-      last_process_time_ms_(-1),
-      media_ssrc_(0),
-      feedback_sequence_(0),
-      window_start_seq_(-1),
-      send_interval_ms_(kDefaultSendIntervalMs) {}
-
-RemoteEstimatorProxy::~RemoteEstimatorProxy() {}
-
-void RemoteEstimatorProxy::IncomingPacket(int64_t arrival_time_ms,
-                                          size_t payload_size,
-                                          const RTPHeader& header) {
-  if (!header.extension.hasTransportSequenceNumber) {
-    LOG(LS_WARNING) << "RemoteEstimatorProxy: Incoming packet "
-                       "is missing the transport sequence number extension!";
-    return;
-  }
-  rtc::CritScope cs(&lock_);
-  media_ssrc_ = header.ssrc;
-
-  OnPacketArrival(header.extension.transportSequenceNumber, arrival_time_ms);
-}
-
-bool RemoteEstimatorProxy::LatestEstimate(std::vector<unsigned int>* ssrcs,
-                                          unsigned int* bitrate_bps) const {
-  return false;
-}
-
-int64_t RemoteEstimatorProxy::TimeUntilNextProcess() {
-  int64_t time_until_next = 0;
-  if (last_process_time_ms_ != -1) {
-    rtc::CritScope cs(&lock_);
-    int64_t now = clock_->TimeInMilliseconds();
-    if (now - last_process_time_ms_ < send_interval_ms_)
-      time_until_next = (last_process_time_ms_ + send_interval_ms_ - now);
-  }
-  return time_until_next;
-}
-
-void RemoteEstimatorProxy::Process() {
-  last_process_time_ms_ = clock_->TimeInMilliseconds();
-
-  bool more_to_build = true;
-  while (more_to_build) {
-    rtcp::TransportFeedback feedback_packet;
-    if (BuildFeedbackPacket(&feedback_packet)) {
-      RTC_DCHECK(packet_router_ != nullptr);
-      packet_router_->SendTransportFeedback(&feedback_packet);
-    } else {
-      more_to_build = false;
-    }
-  }
-}
-
-void RemoteEstimatorProxy::OnBitrateChanged(int bitrate_bps) {
-  // TwccReportSize = Ipv4(20B) + UDP(8B) + SRTP(10B) +
-  // AverageTwccReport(30B)
-  // TwccReport size at 50ms interval is 24 byte.
-  // TwccReport size at 250ms interval is 36 byte.
-  // AverageTwccReport = (TwccReport(50ms) + TwccReport(250ms)) / 2
-  constexpr int kTwccReportSize = 20 + 8 + 10 + 30;
-  constexpr double kMinTwccRate =
-      kTwccReportSize * 8.0 * 1000.0 / kMaxSendIntervalMs;
-  constexpr double kMaxTwccRate =
-      kTwccReportSize * 8.0 * 1000.0 / kMinSendIntervalMs;
-
-  // Let TWCC reports occupy 5% of total bandwidth.
-  rtc::CritScope cs(&lock_);
-  send_interval_ms_ = static_cast<int>(
-      0.5 + kTwccReportSize * 8.0 * 1000.0 /
-                rtc::SafeClamp(0.05 * bitrate_bps, kMinTwccRate, kMaxTwccRate));
-}
-
-void RemoteEstimatorProxy::OnPacketArrival(uint16_t sequence_number,
-                                           int64_t arrival_time) {
-  if (arrival_time < 0 || arrival_time > kMaxTimeMs) {
-    LOG(LS_WARNING) << "Arrival time out of bounds: " << arrival_time;
-    return;
-  }
-
-  // TODO(holmer): We should handle a backwards wrap here if the first
-  // sequence number was small and the new sequence number is large. The
-  // SequenceNumberUnwrapper doesn't do this, so we should replace this with
-  // calls to IsNewerSequenceNumber instead.
-  int64_t seq = unwrapper_.Unwrap(sequence_number);
-  if (seq > window_start_seq_ + 0xFFFF / 2) {
-    LOG(LS_WARNING) << "Skipping this sequence number (" << sequence_number
-                    << ") since it likely is reordered, but the unwrapper"
-                       "failed to handle it. Feedback window starts at "
-                    << window_start_seq_ << ".";
-    return;
-  }
-
-  if (packet_arrival_times_.lower_bound(window_start_seq_) ==
-      packet_arrival_times_.end()) {
-    // Start new feedback packet, cull old packets.
-    for (auto it = packet_arrival_times_.begin();
-         it != packet_arrival_times_.end() && it->first < seq &&
-         arrival_time - it->second >= kBackWindowMs;) {
-      auto delete_it = it;
-      ++it;
-      packet_arrival_times_.erase(delete_it);
-    }
-  }
-
-  if (window_start_seq_ == -1) {
-    window_start_seq_ = sequence_number;
-  } else if (seq < window_start_seq_) {
-    window_start_seq_ = seq;
-  }
-
-  // We are only interested in the first time a packet is received.
-  if (packet_arrival_times_.find(seq) != packet_arrival_times_.end())
-    return;
-
-  packet_arrival_times_[seq] = arrival_time;
-}
-
-bool RemoteEstimatorProxy::BuildFeedbackPacket(
-    rtcp::TransportFeedback* feedback_packet) {
-  // window_start_seq_ is the first sequence number to include in the current
-  // feedback packet. Some older may still be in the map, in case a reordering
-  // happens and we need to retransmit them.
-  rtc::CritScope cs(&lock_);
-  auto it = packet_arrival_times_.lower_bound(window_start_seq_);
-  if (it == packet_arrival_times_.end()) {
-    // Feedback for all packets already sent.
-    return false;
-  }
-
-  // TODO(sprang): Measure receive times in microseconds and remove the
-  // conversions below.
-  const int64_t first_sequence = it->first;
-  feedback_packet->SetMediaSsrc(media_ssrc_);
-  // Base sequence is the expected next (window_start_seq_). This is known, but
-  // we might not have actually received it, so the base time shall be the time
-  // of the first received packet in the feedback.
-  feedback_packet->SetBase(static_cast<uint16_t>(window_start_seq_ & 0xFFFF),
-                           it->second * 1000);
-  feedback_packet->SetFeedbackSequenceNumber(feedback_sequence_++);
-  for (; it != packet_arrival_times_.end(); ++it) {
-    if (!feedback_packet->AddReceivedPacket(
-            static_cast<uint16_t>(it->first & 0xFFFF), it->second * 1000)) {
-      // If we can't even add the first seq to the feedback packet, we won't be
-      // able to build it at all.
-      RTC_CHECK_NE(first_sequence, it->first);
-
-      // Could not add timestamp, feedback packet might be full. Return and
-      // try again with a fresh packet.
-      break;
-    }
-
-    // Note: Don't erase items from packet_arrival_times_ after sending, in case
-    // they need to be re-sent after a reordering. Removal will be handled
-    // by OnPacketArrival once packets are too old.
-    window_start_seq_ = it->first + 1;
-  }
-
-  return true;
-}
-
-}  // namespace webrtc
diff --git a/modules/remote_bitrate_estimator/remote_estimator_proxy.h b/modules/remote_bitrate_estimator/remote_estimator_proxy.h
deleted file mode 100644
index 129b5e7..0000000
--- a/modules/remote_bitrate_estimator/remote_estimator_proxy.h
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- *  Copyright (c) 2015 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_REMOTE_BITRATE_ESTIMATOR_REMOTE_ESTIMATOR_PROXY_H_
-#define WEBRTC_MODULES_REMOTE_BITRATE_ESTIMATOR_REMOTE_ESTIMATOR_PROXY_H_
-
-#include <map>
-#include <vector>
-
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/modules/remote_bitrate_estimator/include/remote_bitrate_estimator.h"
-#include "webrtc/rtc_base/criticalsection.h"
-
-namespace webrtc {
-
-class Clock;
-class PacketRouter;
-namespace rtcp {
-class TransportFeedback;
-}
-
-// Class used when send-side BWE is enabled: This proxy is instantiated on the
-// receive side. It buffers a number of receive timestamps and then sends
-// transport feedback messages back too the send side.
-
-class RemoteEstimatorProxy : public RemoteBitrateEstimator {
- public:
-  RemoteEstimatorProxy(const Clock* clock, PacketRouter* packet_router);
-  virtual ~RemoteEstimatorProxy();
-
-  void IncomingPacket(int64_t arrival_time_ms,
-                      size_t payload_size,
-                      const RTPHeader& header) override;
-  void RemoveStream(uint32_t ssrc) override {}
-  bool LatestEstimate(std::vector<unsigned int>* ssrcs,
-                      unsigned int* bitrate_bps) const override;
-  void OnRttUpdate(int64_t avg_rtt_ms, int64_t max_rtt_ms) override {}
-  void SetMinBitrate(int min_bitrate_bps) override {}
-  int64_t TimeUntilNextProcess() override;
-  void Process() override;
-  void OnBitrateChanged(int bitrate);
-
-  static const int kMinSendIntervalMs;
-  static const int kMaxSendIntervalMs;
-  static const int kDefaultSendIntervalMs;
-  static const int kBackWindowMs;
-
- private:
-  void OnPacketArrival(uint16_t sequence_number, int64_t arrival_time)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(&lock_);
-  bool BuildFeedbackPacket(rtcp::TransportFeedback* feedback_packet);
-
-  const Clock* const clock_;
-  PacketRouter* const packet_router_;
-  int64_t last_process_time_ms_;
-
-  rtc::CriticalSection lock_;
-
-  uint32_t media_ssrc_ RTC_GUARDED_BY(&lock_);
-  uint8_t feedback_sequence_ RTC_GUARDED_BY(&lock_);
-  SequenceNumberUnwrapper unwrapper_ RTC_GUARDED_BY(&lock_);
-  int64_t window_start_seq_ RTC_GUARDED_BY(&lock_);
-  // Map unwrapped seq -> time.
-  std::map<int64_t, int64_t> packet_arrival_times_ RTC_GUARDED_BY(&lock_);
-  int64_t send_interval_ms_ RTC_GUARDED_BY(&lock_);
-};
-
-}  // namespace webrtc
-
-#endif  //  WEBRTC_MODULES_REMOTE_BITRATE_ESTIMATOR_REMOTE_ESTIMATOR_PROXY_H_
diff --git a/modules/remote_bitrate_estimator/remote_estimator_proxy_unittest.cc b/modules/remote_bitrate_estimator/remote_estimator_proxy_unittest.cc
deleted file mode 100644
index 6657108..0000000
--- a/modules/remote_bitrate_estimator/remote_estimator_proxy_unittest.cc
+++ /dev/null
@@ -1,338 +0,0 @@
-/*
- *  Copyright (c) 2015 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/pacing/packet_router.h"
-#include "webrtc/modules/remote_bitrate_estimator/remote_estimator_proxy.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/transport_feedback.h"
-#include "webrtc/system_wrappers/include/clock.h"
-#include "webrtc/test/gmock.h"
-#include "webrtc/test/gtest.h"
-
-using ::testing::_;
-using ::testing::ElementsAre;
-using ::testing::Invoke;
-using ::testing::Return;
-
-namespace webrtc {
-namespace {
-
-constexpr size_t kDefaultPacketSize = 100;
-constexpr uint32_t kMediaSsrc = 456;
-constexpr uint16_t kBaseSeq = 10;
-constexpr int64_t kBaseTimeMs = 123;
-constexpr int64_t kMaxSmallDeltaMs =
-    (rtcp::TransportFeedback::kDeltaScaleFactor * 0xFF) / 1000;
-
-std::vector<uint16_t> SequenceNumbers(
-    const rtcp::TransportFeedback& feedback_packet) {
-  std::vector<uint16_t> sequence_numbers;
-  for (const auto& rtp_packet_received : feedback_packet.GetReceivedPackets()) {
-    sequence_numbers.push_back(rtp_packet_received.sequence_number());
-  }
-  return sequence_numbers;
-}
-
-std::vector<int64_t> TimestampsMs(
-    const rtcp::TransportFeedback& feedback_packet) {
-  std::vector<int64_t> timestamps;
-  int64_t timestamp_us = feedback_packet.GetBaseTimeUs();
-  for (const auto& rtp_packet_received : feedback_packet.GetReceivedPackets()) {
-    timestamp_us += rtp_packet_received.delta_us();
-    timestamps.push_back(timestamp_us / 1000);
-  }
-  return timestamps;
-}
-
-class MockPacketRouter : public PacketRouter {
- public:
-  MOCK_METHOD1(SendTransportFeedback,
-               bool(rtcp::TransportFeedback* feedback_packet));
-};
-
-class RemoteEstimatorProxyTest : public ::testing::Test {
- public:
-  RemoteEstimatorProxyTest() : clock_(0), proxy_(&clock_, &router_) {}
-
- protected:
-  void IncomingPacket(uint16_t seq, int64_t time_ms) {
-    RTPHeader header;
-    header.extension.hasTransportSequenceNumber = true;
-    header.extension.transportSequenceNumber = seq;
-    header.ssrc = kMediaSsrc;
-    proxy_.IncomingPacket(time_ms, kDefaultPacketSize, header);
-  }
-
-  void Process() {
-    clock_.AdvanceTimeMilliseconds(
-        RemoteEstimatorProxy::kDefaultSendIntervalMs);
-    proxy_.Process();
-  }
-
-  SimulatedClock clock_;
-  testing::StrictMock<MockPacketRouter> router_;
-  RemoteEstimatorProxy proxy_;
-};
-
-TEST_F(RemoteEstimatorProxyTest, SendsSinglePacketFeedback) {
-  IncomingPacket(kBaseSeq, kBaseTimeMs);
-
-  EXPECT_CALL(router_, SendTransportFeedback(_))
-      .WillOnce(Invoke([](rtcp::TransportFeedback* feedback_packet) {
-        EXPECT_EQ(kBaseSeq, feedback_packet->GetBaseSequence());
-        EXPECT_EQ(kMediaSsrc, feedback_packet->media_ssrc());
-
-        EXPECT_THAT(SequenceNumbers(*feedback_packet), ElementsAre(kBaseSeq));
-        EXPECT_THAT(TimestampsMs(*feedback_packet), ElementsAre(kBaseTimeMs));
-        return true;
-      }));
-
-  Process();
-}
-
-TEST_F(RemoteEstimatorProxyTest, DuplicatedPackets) {
-  IncomingPacket(kBaseSeq, kBaseTimeMs);
-  IncomingPacket(kBaseSeq, kBaseTimeMs + 1000);
-
-  EXPECT_CALL(router_, SendTransportFeedback(_))
-      .WillOnce(Invoke([](rtcp::TransportFeedback* feedback_packet) {
-        EXPECT_EQ(kBaseSeq, feedback_packet->GetBaseSequence());
-        EXPECT_EQ(kMediaSsrc, feedback_packet->media_ssrc());
-
-        EXPECT_THAT(SequenceNumbers(*feedback_packet), ElementsAre(kBaseSeq));
-        EXPECT_THAT(TimestampsMs(*feedback_packet), ElementsAre(kBaseTimeMs));
-        return true;
-      }));
-
-  Process();
-}
-
-TEST_F(RemoteEstimatorProxyTest, FeedbackWithMissingStart) {
-  // First feedback.
-  IncomingPacket(kBaseSeq, kBaseTimeMs);
-  IncomingPacket(kBaseSeq + 1, kBaseTimeMs + 1000);
-  EXPECT_CALL(router_, SendTransportFeedback(_)).WillOnce(Return(true));
-  Process();
-
-  // Second feedback starts with a missing packet (DROP kBaseSeq + 2).
-  IncomingPacket(kBaseSeq + 3, kBaseTimeMs + 3000);
-
-  EXPECT_CALL(router_, SendTransportFeedback(_))
-      .WillOnce(Invoke([](rtcp::TransportFeedback* feedback_packet) {
-        EXPECT_EQ(kBaseSeq + 2, feedback_packet->GetBaseSequence());
-        EXPECT_EQ(kMediaSsrc, feedback_packet->media_ssrc());
-
-        EXPECT_THAT(SequenceNumbers(*feedback_packet),
-                    ElementsAre(kBaseSeq + 3));
-        EXPECT_THAT(TimestampsMs(*feedback_packet),
-                    ElementsAre(kBaseTimeMs + 3000));
-        return true;
-      }));
-
-  Process();
-}
-
-TEST_F(RemoteEstimatorProxyTest, SendsFeedbackWithVaryingDeltas) {
-  IncomingPacket(kBaseSeq, kBaseTimeMs);
-  IncomingPacket(kBaseSeq + 1, kBaseTimeMs + kMaxSmallDeltaMs);
-  IncomingPacket(kBaseSeq + 2, kBaseTimeMs + (2 * kMaxSmallDeltaMs) + 1);
-
-  EXPECT_CALL(router_, SendTransportFeedback(_))
-      .WillOnce(Invoke([](rtcp::TransportFeedback* feedback_packet) {
-        EXPECT_EQ(kBaseSeq, feedback_packet->GetBaseSequence());
-        EXPECT_EQ(kMediaSsrc, feedback_packet->media_ssrc());
-
-        EXPECT_THAT(SequenceNumbers(*feedback_packet),
-                    ElementsAre(kBaseSeq, kBaseSeq + 1, kBaseSeq + 2));
-        EXPECT_THAT(TimestampsMs(*feedback_packet),
-                    ElementsAre(kBaseTimeMs, kBaseTimeMs + kMaxSmallDeltaMs,
-                                kBaseTimeMs + (2 * kMaxSmallDeltaMs) + 1));
-        return true;
-      }));
-
-  Process();
-}
-
-TEST_F(RemoteEstimatorProxyTest, SendsFragmentedFeedback) {
-  static constexpr int64_t kTooLargeDelta =
-      rtcp::TransportFeedback::kDeltaScaleFactor * (1 << 16);
-
-  IncomingPacket(kBaseSeq, kBaseTimeMs);
-  IncomingPacket(kBaseSeq + 1, kBaseTimeMs + kTooLargeDelta);
-
-  EXPECT_CALL(router_, SendTransportFeedback(_))
-      .WillOnce(Invoke([](rtcp::TransportFeedback* feedback_packet) {
-        EXPECT_EQ(kBaseSeq, feedback_packet->GetBaseSequence());
-        EXPECT_EQ(kMediaSsrc, feedback_packet->media_ssrc());
-
-        EXPECT_THAT(SequenceNumbers(*feedback_packet), ElementsAre(kBaseSeq));
-        EXPECT_THAT(TimestampsMs(*feedback_packet), ElementsAre(kBaseTimeMs));
-        return true;
-      }))
-      .WillOnce(Invoke([](rtcp::TransportFeedback* feedback_packet) {
-        EXPECT_EQ(kBaseSeq + 1, feedback_packet->GetBaseSequence());
-        EXPECT_EQ(kMediaSsrc, feedback_packet->media_ssrc());
-
-        EXPECT_THAT(SequenceNumbers(*feedback_packet),
-                    ElementsAre(kBaseSeq + 1));
-        EXPECT_THAT(TimestampsMs(*feedback_packet),
-                    ElementsAre(kBaseTimeMs + kTooLargeDelta));
-        return true;
-      }));
-
-  Process();
-}
-
-TEST_F(RemoteEstimatorProxyTest, GracefullyHandlesReorderingAndWrap) {
-  const int64_t kDeltaMs = 1000;
-  const uint16_t kLargeSeq = 62762;
-  IncomingPacket(kBaseSeq, kBaseTimeMs);
-  IncomingPacket(kLargeSeq, kBaseTimeMs + kDeltaMs);
-
-  EXPECT_CALL(router_, SendTransportFeedback(_))
-      .WillOnce(Invoke([](rtcp::TransportFeedback* feedback_packet) {
-        EXPECT_EQ(kBaseSeq, feedback_packet->GetBaseSequence());
-        EXPECT_EQ(kMediaSsrc, feedback_packet->media_ssrc());
-
-        EXPECT_THAT(TimestampsMs(*feedback_packet), ElementsAre(kBaseTimeMs));
-        return true;
-      }));
-
-  Process();
-}
-
-TEST_F(RemoteEstimatorProxyTest, ResendsTimestampsOnReordering) {
-  IncomingPacket(kBaseSeq, kBaseTimeMs);
-  IncomingPacket(kBaseSeq + 2, kBaseTimeMs + 2);
-
-  EXPECT_CALL(router_, SendTransportFeedback(_))
-      .WillOnce(Invoke([](rtcp::TransportFeedback* feedback_packet) {
-        EXPECT_EQ(kBaseSeq, feedback_packet->GetBaseSequence());
-        EXPECT_EQ(kMediaSsrc, feedback_packet->media_ssrc());
-
-        EXPECT_THAT(SequenceNumbers(*feedback_packet),
-                    ElementsAre(kBaseSeq, kBaseSeq + 2));
-        EXPECT_THAT(TimestampsMs(*feedback_packet),
-                    ElementsAre(kBaseTimeMs, kBaseTimeMs + 2));
-        return true;
-      }));
-
-  Process();
-
-  IncomingPacket(kBaseSeq + 1, kBaseTimeMs + 1);
-
-  EXPECT_CALL(router_, SendTransportFeedback(_))
-      .WillOnce(Invoke([](rtcp::TransportFeedback* feedback_packet) {
-        EXPECT_EQ(kBaseSeq + 1, feedback_packet->GetBaseSequence());
-        EXPECT_EQ(kMediaSsrc, feedback_packet->media_ssrc());
-
-        EXPECT_THAT(SequenceNumbers(*feedback_packet),
-                    ElementsAre(kBaseSeq + 1, kBaseSeq + 2));
-        EXPECT_THAT(TimestampsMs(*feedback_packet),
-                    ElementsAre(kBaseTimeMs + 1, kBaseTimeMs + 2));
-        return true;
-      }));
-
-  Process();
-}
-
-TEST_F(RemoteEstimatorProxyTest, RemovesTimestampsOutOfScope) {
-  const int64_t kTimeoutTimeMs =
-      kBaseTimeMs + RemoteEstimatorProxy::kBackWindowMs;
-
-  IncomingPacket(kBaseSeq + 2, kBaseTimeMs);
-
-  EXPECT_CALL(router_, SendTransportFeedback(_))
-      .WillOnce(Invoke([](rtcp::TransportFeedback* feedback_packet) {
-        EXPECT_EQ(kBaseSeq + 2, feedback_packet->GetBaseSequence());
-
-        EXPECT_THAT(TimestampsMs(*feedback_packet), ElementsAre(kBaseTimeMs));
-        return true;
-      }));
-
-  Process();
-
-  IncomingPacket(kBaseSeq + 3, kTimeoutTimeMs);  // kBaseSeq + 2 times out here.
-
-  EXPECT_CALL(router_, SendTransportFeedback(_))
-      .WillOnce(
-          Invoke([kTimeoutTimeMs](rtcp::TransportFeedback* feedback_packet) {
-            EXPECT_EQ(kBaseSeq + 3, feedback_packet->GetBaseSequence());
-
-            EXPECT_THAT(TimestampsMs(*feedback_packet),
-                        ElementsAre(kTimeoutTimeMs));
-            return true;
-          }));
-
-  Process();
-
-  // New group, with sequence starting below the first so that they may be
-  // retransmitted.
-  IncomingPacket(kBaseSeq, kBaseTimeMs - 1);
-  IncomingPacket(kBaseSeq + 1, kTimeoutTimeMs - 1);
-
-  EXPECT_CALL(router_, SendTransportFeedback(_))
-      .WillOnce(
-          Invoke([kTimeoutTimeMs](rtcp::TransportFeedback* feedback_packet) {
-            EXPECT_EQ(kBaseSeq, feedback_packet->GetBaseSequence());
-
-            EXPECT_THAT(SequenceNumbers(*feedback_packet),
-                        ElementsAre(kBaseSeq, kBaseSeq + 1, kBaseSeq + 3));
-            EXPECT_THAT(TimestampsMs(*feedback_packet),
-                        ElementsAre(kBaseTimeMs - 1, kTimeoutTimeMs - 1,
-                                    kTimeoutTimeMs));
-            return true;
-          }));
-
-  Process();
-}
-
-TEST_F(RemoteEstimatorProxyTest, TimeUntilNextProcessIsZeroBeforeFirstProcess) {
-  EXPECT_EQ(0, proxy_.TimeUntilNextProcess());
-}
-
-TEST_F(RemoteEstimatorProxyTest, TimeUntilNextProcessIsDefaultOnUnkownBitrate) {
-  Process();
-  EXPECT_EQ(RemoteEstimatorProxy::kDefaultSendIntervalMs,
-            proxy_.TimeUntilNextProcess());
-}
-
-TEST_F(RemoteEstimatorProxyTest, TimeUntilNextProcessIsMinIntervalOn300kbps) {
-  Process();
-  proxy_.OnBitrateChanged(300000);
-  EXPECT_EQ(RemoteEstimatorProxy::kMinSendIntervalMs,
-            proxy_.TimeUntilNextProcess());
-}
-
-TEST_F(RemoteEstimatorProxyTest, TimeUntilNextProcessIsMaxIntervalOn0kbps) {
-  Process();
-  // TimeUntilNextProcess should be limited by |kMaxSendIntervalMs| when
-  // bitrate is small. We choose 0 bps as a special case, which also tests
-  // erroneous behaviors like division-by-zero.
-  proxy_.OnBitrateChanged(0);
-  EXPECT_EQ(RemoteEstimatorProxy::kMaxSendIntervalMs,
-            proxy_.TimeUntilNextProcess());
-}
-
-TEST_F(RemoteEstimatorProxyTest, TimeUntilNextProcessIsMaxIntervalOn20kbps) {
-  Process();
-  proxy_.OnBitrateChanged(20000);
-  EXPECT_EQ(RemoteEstimatorProxy::kMaxSendIntervalMs,
-            proxy_.TimeUntilNextProcess());
-}
-
-TEST_F(RemoteEstimatorProxyTest, TwccReportsUse5PercentOfAvailableBandwidth) {
-  Process();
-  proxy_.OnBitrateChanged(80000);
-  // 80kbps * 0.05 = TwccReportSize(68B * 8b/B) * 1000ms / SendInterval(136ms)
-  EXPECT_EQ(136, proxy_.TimeUntilNextProcess());
-}
-
-}  // namespace
-}  // namespace webrtc
diff --git a/modules/remote_bitrate_estimator/send_time_history.cc b/modules/remote_bitrate_estimator/send_time_history.cc
deleted file mode 100644
index 4cc7a7c..0000000
--- a/modules/remote_bitrate_estimator/send_time_history.cc
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- *  Copyright (c) 2015 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/remote_bitrate_estimator/include/send_time_history.h"
-
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/system_wrappers/include/clock.h"
-
-namespace webrtc {
-
-SendTimeHistory::SendTimeHistory(const Clock* clock,
-                                 int64_t packet_age_limit_ms)
-    : clock_(clock), packet_age_limit_ms_(packet_age_limit_ms) {}
-
-SendTimeHistory::~SendTimeHistory() {}
-
-void SendTimeHistory::AddAndRemoveOld(const PacketFeedback& packet) {
-  int64_t now_ms = clock_->TimeInMilliseconds();
-  // Remove old.
-  while (!history_.empty() &&
-         now_ms - history_.begin()->second.creation_time_ms >
-             packet_age_limit_ms_) {
-    // TODO(sprang): Warn if erasing (too many) old items?
-    history_.erase(history_.begin());
-  }
-
-  // Add new.
-  int64_t unwrapped_seq_num = seq_num_unwrapper_.Unwrap(packet.sequence_number);
-  history_.insert(std::make_pair(unwrapped_seq_num, packet));
-}
-
-bool SendTimeHistory::OnSentPacket(uint16_t sequence_number,
-                                   int64_t send_time_ms) {
-  int64_t unwrapped_seq_num = seq_num_unwrapper_.Unwrap(sequence_number);
-  auto it = history_.find(unwrapped_seq_num);
-  if (it == history_.end())
-    return false;
-  it->second.send_time_ms = send_time_ms;
-  return true;
-}
-
-bool SendTimeHistory::GetFeedback(PacketFeedback* packet_feedback,
-                                  bool remove) {
-  RTC_DCHECK(packet_feedback);
-  int64_t unwrapped_seq_num =
-      seq_num_unwrapper_.Unwrap(packet_feedback->sequence_number);
-  latest_acked_seq_num_.emplace(
-      std::max(unwrapped_seq_num, latest_acked_seq_num_.value_or(0)));
-  RTC_DCHECK_GE(*latest_acked_seq_num_, 0);
-  auto it = history_.find(unwrapped_seq_num);
-  if (it == history_.end())
-    return false;
-
-  // Save arrival_time not to overwrite it.
-  int64_t arrival_time_ms = packet_feedback->arrival_time_ms;
-  *packet_feedback = it->second;
-  packet_feedback->arrival_time_ms = arrival_time_ms;
-
-  if (remove)
-    history_.erase(it);
-  return true;
-}
-
-size_t SendTimeHistory::GetOutstandingBytes(uint16_t local_net_id,
-                                            uint16_t remote_net_id) const {
-  size_t outstanding_bytes = 0;
-  auto unacked_it = history_.begin();
-  if (latest_acked_seq_num_) {
-    unacked_it = history_.lower_bound(*latest_acked_seq_num_);
-  }
-  for (; unacked_it != history_.end(); ++unacked_it) {
-    if (unacked_it->second.local_net_id == local_net_id &&
-        unacked_it->second.remote_net_id == remote_net_id &&
-        unacked_it->second.send_time_ms >= 0) {
-      outstanding_bytes += unacked_it->second.payload_size;
-    }
-  }
-  return outstanding_bytes;
-}
-
-}  // namespace webrtc
diff --git a/modules/remote_bitrate_estimator/send_time_history_unittest.cc b/modules/remote_bitrate_estimator/send_time_history_unittest.cc
deleted file mode 100644
index c3c047c..0000000
--- a/modules/remote_bitrate_estimator/send_time_history_unittest.cc
+++ /dev/null
@@ -1,235 +0,0 @@
-/*
- *  Copyright (c) 2015 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 <algorithm>
-#include <limits>
-#include <vector>
-
-#include "webrtc/modules/remote_bitrate_estimator/include/send_time_history.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
-#include "webrtc/system_wrappers/include/clock.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-namespace test {
-
-static const int kDefaultHistoryLengthMs = 1000;
-
-class SendTimeHistoryTest : public ::testing::Test {
- protected:
-  SendTimeHistoryTest()
-      : clock_(0), history_(&clock_, kDefaultHistoryLengthMs) {}
-  ~SendTimeHistoryTest() {}
-
-  virtual void SetUp() {}
-
-  virtual void TearDown() {}
-
-  void AddPacketWithSendTime(uint16_t sequence_number,
-                             size_t length,
-                             int64_t send_time_ms,
-                             const PacedPacketInfo& pacing_info) {
-    PacketFeedback packet(clock_.TimeInMilliseconds(), sequence_number, length,
-                          0, 0, pacing_info);
-    history_.AddAndRemoveOld(packet);
-    history_.OnSentPacket(sequence_number, send_time_ms);
-  }
-
-  webrtc::SimulatedClock clock_;
-  SendTimeHistory history_;
-};
-
-TEST_F(SendTimeHistoryTest, SaveAndRestoreNetworkId) {
-  const PacedPacketInfo kPacingInfo(0, 5, 1200);
-  uint16_t sequence_number = 0;
-  int64_t now_ms = clock_.TimeInMilliseconds();
-  for (int i = 1; i < 5; ++i) {
-    PacketFeedback packet(now_ms, sequence_number, 1000, i, i - 1,
-                          kPacingInfo);
-    history_.AddAndRemoveOld(packet);
-    history_.OnSentPacket(sequence_number, now_ms);
-    PacketFeedback restored(now_ms, sequence_number);
-    EXPECT_TRUE(history_.GetFeedback(&restored, sequence_number++));
-    EXPECT_EQ(packet.local_net_id, restored.local_net_id);
-    EXPECT_EQ(packet.remote_net_id, restored.remote_net_id);
-  }
-}
-
-TEST_F(SendTimeHistoryTest, AddRemoveOne) {
-  const uint16_t kSeqNo = 10;
-  // TODO(philipel): Fix PacedPacketInfo constructor?
-  const PacedPacketInfo kPacingInfo(0, 5, 1200);
-  const PacketFeedback kSentPacket(0, 1, kSeqNo, 1, kPacingInfo);
-  AddPacketWithSendTime(kSeqNo, 1, 1, kPacingInfo);
-
-  PacketFeedback received_packet(0, 0, kSeqNo, 0, kPacingInfo);
-  EXPECT_TRUE(history_.GetFeedback(&received_packet, false));
-  EXPECT_EQ(kSentPacket, received_packet);
-
-  PacketFeedback received_packet2(0, 0, kSeqNo, 0, kPacingInfo);
-  EXPECT_TRUE(history_.GetFeedback(&received_packet2, true));
-  EXPECT_EQ(kSentPacket, received_packet2);
-
-  PacketFeedback received_packet3(0, 0, kSeqNo, 0, kPacingInfo);
-  EXPECT_FALSE(history_.GetFeedback(&received_packet3, true));
-}
-
-TEST_F(SendTimeHistoryTest, PopulatesExpectedFields) {
-  const uint16_t kSeqNo = 10;
-  const int64_t kSendTime = 1000;
-  const int64_t kReceiveTime = 2000;
-  const size_t kPayloadSize = 42;
-  const PacedPacketInfo kPacingInfo(3, 10, 1212);
-
-  AddPacketWithSendTime(kSeqNo, kPayloadSize, kSendTime, kPacingInfo);
-
-  PacketFeedback packet_feedback(kReceiveTime, kSeqNo);
-  EXPECT_TRUE(history_.GetFeedback(&packet_feedback, true));
-  EXPECT_EQ(kReceiveTime, packet_feedback.arrival_time_ms);
-  EXPECT_EQ(kSendTime, packet_feedback.send_time_ms);
-  EXPECT_EQ(kSeqNo, packet_feedback.sequence_number);
-  EXPECT_EQ(kPayloadSize, packet_feedback.payload_size);
-  EXPECT_EQ(kPacingInfo, packet_feedback.pacing_info);
-}
-
-TEST_F(SendTimeHistoryTest, AddThenRemoveOutOfOrder) {
-  std::vector<PacketFeedback> sent_packets;
-  std::vector<PacketFeedback> received_packets;
-  const size_t num_items = 100;
-  const size_t kPacketSize = 400;
-  const size_t kTransmissionTime = 1234;
-  const PacedPacketInfo kPacingInfo(1, 2, 200);
-  for (size_t i = 0; i < num_items; ++i) {
-    sent_packets.push_back(PacketFeedback(0, static_cast<int64_t>(i),
-                                          static_cast<uint16_t>(i), kPacketSize,
-                                          kPacingInfo));
-    received_packets.push_back(PacketFeedback(
-        static_cast<int64_t>(i) + kTransmissionTime, 0,
-        static_cast<uint16_t>(i), kPacketSize, PacedPacketInfo()));
-  }
-  for (size_t i = 0; i < num_items; ++i) {
-    PacketFeedback packet = sent_packets[i];
-    packet.arrival_time_ms = -1;
-    packet.send_time_ms = -1;
-    history_.AddAndRemoveOld(packet);
-  }
-  for (size_t i = 0; i < num_items; ++i)
-    history_.OnSentPacket(sent_packets[i].sequence_number,
-                          sent_packets[i].send_time_ms);
-  std::random_shuffle(received_packets.begin(), received_packets.end());
-  for (size_t i = 0; i < num_items; ++i) {
-    PacketFeedback packet = received_packets[i];
-    EXPECT_TRUE(history_.GetFeedback(&packet, false));
-    PacketFeedback sent_packet = sent_packets[packet.sequence_number];
-    sent_packet.arrival_time_ms = packet.arrival_time_ms;
-    EXPECT_EQ(sent_packet, packet);
-    EXPECT_TRUE(history_.GetFeedback(&packet, true));
-  }
-  for (PacketFeedback packet : sent_packets)
-    EXPECT_FALSE(history_.GetFeedback(&packet, false));
-}
-
-TEST_F(SendTimeHistoryTest, HistorySize) {
-  const int kItems = kDefaultHistoryLengthMs / 100;
-  for (int i = 0; i < kItems; ++i) {
-    clock_.AdvanceTimeMilliseconds(100);
-    AddPacketWithSendTime(i, 0, i * 100, PacedPacketInfo());
-  }
-  for (int i = 0; i < kItems; ++i) {
-    PacketFeedback packet(0, 0, static_cast<uint16_t>(i), 0, PacedPacketInfo());
-    EXPECT_TRUE(history_.GetFeedback(&packet, false));
-    EXPECT_EQ(i * 100, packet.send_time_ms);
-  }
-  clock_.AdvanceTimeMilliseconds(101);
-  AddPacketWithSendTime(kItems, 0, kItems * 101, PacedPacketInfo());
-  PacketFeedback packet(0, 0, 0, 0, PacedPacketInfo());
-  EXPECT_FALSE(history_.GetFeedback(&packet, false));
-  for (int i = 1; i < (kItems + 1); ++i) {
-    PacketFeedback packet2(0, 0, static_cast<uint16_t>(i), 0,
-                           PacedPacketInfo());
-    EXPECT_TRUE(history_.GetFeedback(&packet2, false));
-    int64_t expected_time_ms = (i == kItems) ? i * 101 : i * 100;
-    EXPECT_EQ(expected_time_ms, packet2.send_time_ms);
-  }
-}
-
-TEST_F(SendTimeHistoryTest, HistorySizeWithWraparound) {
-  const uint16_t kMaxSeqNo = std::numeric_limits<uint16_t>::max();
-  AddPacketWithSendTime(kMaxSeqNo - 2, 0, 0, PacedPacketInfo());
-
-  clock_.AdvanceTimeMilliseconds(100);
-  AddPacketWithSendTime(kMaxSeqNo - 1, 1, 100, PacedPacketInfo());
-
-  clock_.AdvanceTimeMilliseconds(100);
-  AddPacketWithSendTime(kMaxSeqNo, 0, 200, PacedPacketInfo());
-
-  clock_.AdvanceTimeMilliseconds(kDefaultHistoryLengthMs - 200 + 1);
-  AddPacketWithSendTime(0, 0, kDefaultHistoryLengthMs, PacedPacketInfo());
-
-  PacketFeedback packet(0, static_cast<uint16_t>(kMaxSeqNo - 2));
-  EXPECT_FALSE(history_.GetFeedback(&packet, false));
-  PacketFeedback packet2(0, static_cast<uint16_t>(kMaxSeqNo - 1));
-  EXPECT_TRUE(history_.GetFeedback(&packet2, false));
-  PacketFeedback packet3(0, static_cast<uint16_t>(kMaxSeqNo));
-  EXPECT_TRUE(history_.GetFeedback(&packet3, false));
-  PacketFeedback packet4(0, 0);
-  EXPECT_TRUE(history_.GetFeedback(&packet4, false));
-
-  // Create a gap (kMaxSeqNo - 1) -> 0.
-  PacketFeedback packet5(0, kMaxSeqNo);
-  EXPECT_TRUE(history_.GetFeedback(&packet5, true));
-
-  clock_.AdvanceTimeMilliseconds(100);
-  AddPacketWithSendTime(1, 0, 1100, PacedPacketInfo());
-
-  PacketFeedback packet6(0, static_cast<uint16_t>(kMaxSeqNo - 2));
-  EXPECT_FALSE(history_.GetFeedback(&packet6, false));
-  PacketFeedback packet7(0, static_cast<uint16_t>(kMaxSeqNo - 1));
-  EXPECT_FALSE(history_.GetFeedback(&packet7, false));
-  PacketFeedback packet8(0, kMaxSeqNo);
-  EXPECT_FALSE(history_.GetFeedback(&packet8, false));
-  PacketFeedback packet9(0, 0);
-  EXPECT_TRUE(history_.GetFeedback(&packet9, false));
-  PacketFeedback packet10(0, 1);
-  EXPECT_TRUE(history_.GetFeedback(&packet10, false));
-}
-
-TEST_F(SendTimeHistoryTest, InterlievedGetAndRemove) {
-  const uint16_t kSeqNo = 1;
-  const int64_t kTimestamp = 2;
-  const PacedPacketInfo kPacingInfo1(1, 1, 100);
-  const PacedPacketInfo kPacingInfo2(2, 2, 200);
-  const PacedPacketInfo kPacingInfo3(3, 3, 300);
-  PacketFeedback packets[3] = {
-      {0, kTimestamp, kSeqNo, 0, kPacingInfo1},
-      {0, kTimestamp + 1, kSeqNo + 1, 0, kPacingInfo2},
-      {0, kTimestamp + 2, kSeqNo + 2, 0, kPacingInfo3}};
-
-  AddPacketWithSendTime(packets[0].sequence_number, packets[0].payload_size,
-                        packets[0].send_time_ms, packets[0].pacing_info);
-  AddPacketWithSendTime(packets[1].sequence_number, packets[1].payload_size,
-                        packets[1].send_time_ms, packets[1].pacing_info);
-  PacketFeedback packet(0, 0, packets[0].sequence_number, 0, PacedPacketInfo());
-  EXPECT_TRUE(history_.GetFeedback(&packet, true));
-  EXPECT_EQ(packets[0], packet);
-
-  AddPacketWithSendTime(packets[2].sequence_number, packets[2].payload_size,
-                        packets[2].send_time_ms, packets[2].pacing_info);
-
-  PacketFeedback packet2(0, 0, packets[1].sequence_number, 0, kPacingInfo1);
-  EXPECT_TRUE(history_.GetFeedback(&packet2, true));
-  EXPECT_EQ(packets[1], packet2);
-
-  PacketFeedback packet3(0, 0, packets[2].sequence_number, 0, kPacingInfo2);
-  EXPECT_TRUE(history_.GetFeedback(&packet3, true));
-  EXPECT_EQ(packets[2], packet3);
-}
-}  // namespace test
-}  // namespace webrtc
diff --git a/modules/remote_bitrate_estimator/test/bbr_paced_sender.cc b/modules/remote_bitrate_estimator/test/bbr_paced_sender.cc
deleted file mode 100644
index 3df97aa..0000000
--- a/modules/remote_bitrate_estimator/test/bbr_paced_sender.cc
+++ /dev/null
@@ -1,140 +0,0 @@
-/*
- *  Copyright (c) 2017 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/remote_bitrate_estimator/test/bbr_paced_sender.h"
-
-#include <algorithm>
-#include <queue>
-#include <set>
-#include <vector>
-
-#include "webrtc/modules/pacing/paced_sender.h"
-#include "webrtc/modules/remote_bitrate_estimator/test/estimators/congestion_window.h"
-#include "webrtc/system_wrappers/include/clock.h"
-
-namespace webrtc {
-
-BbrPacedSender::BbrPacedSender(const Clock* clock,
-                               PacedSender::PacketSender* packet_sender,
-                               RtcEventLog* event_log)
-    : clock_(clock),
-      packet_sender_(packet_sender),
-      estimated_bitrate_bps_(100000),
-      min_send_bitrate_kbps_(0),
-      pacing_bitrate_kbps_(0),
-      time_last_update_us_(clock->TimeInMicroseconds()),
-      time_last_update_ms_(clock->TimeInMilliseconds()),
-      next_packet_send_time_(clock_->TimeInMilliseconds()),
-      rounding_error_time_ms_(0.0f),
-      packets_(),
-      max_data_inflight_bytes_(10000),
-      congestion_window_(new testing::bwe::CongestionWindow()) {}
-BbrPacedSender::~BbrPacedSender() {}
-
-void BbrPacedSender::SetEstimatedBitrateAndCongestionWindow(
-    uint32_t bitrate_bps,
-    bool in_probe_rtt,
-    uint64_t congestion_window) {
-  estimated_bitrate_bps_ = bitrate_bps;
-  max_data_inflight_bytes_ = congestion_window;
-}
-
-void BbrPacedSender::SetMinBitrate(int min_send_bitrate_bps) {
-  min_send_bitrate_kbps_ = min_send_bitrate_bps / 1000;
-  pacing_bitrate_kbps_ =
-      std::max(min_send_bitrate_kbps_, estimated_bitrate_bps_ / 1000);
-}
-
-void BbrPacedSender::InsertPacket(RtpPacketSender::Priority priority,
-                                  uint32_t ssrc,
-                                  uint16_t sequence_number,
-                                  int64_t capture_time_ms,
-                                  size_t bytes,
-                                  bool retransmission) {
-  int64_t now_ms = clock_->TimeInMilliseconds();
-  if (capture_time_ms < 0)
-    capture_time_ms = now_ms;
-  packets_.push_back(new Packet(priority, ssrc, sequence_number,
-                                capture_time_ms, now_ms, bytes,
-                                retransmission));
-}
-
-int64_t BbrPacedSender::TimeUntilNextProcess() {
-  // Once errors absolute value hits 1 millisecond, add compensating term to
-  // the |next_packet_send_time_|, so that we can send packet earlier or later,
-  // depending on the error.
-  rounding_error_time_ms_ = std::min(rounding_error_time_ms_, 1.0f);
-  if (rounding_error_time_ms_ < -0.9f)
-    rounding_error_time_ms_ = -1.0f;
-  int64_t result =
-      std::max<int64_t>(next_packet_send_time_ + time_last_update_ms_ -
-                            clock_->TimeInMilliseconds(),
-                        0);
-  if (rounding_error_time_ms_ == 1.0f || rounding_error_time_ms_ == -1.0f) {
-    next_packet_send_time_ -= rounding_error_time_ms_;
-    result = std::max<int64_t>(next_packet_send_time_ + time_last_update_ms_ -
-                                   clock_->TimeInMilliseconds(),
-                               0);
-    rounding_error_time_ms_ = 0;
-  }
-  return result;
-}
-
-void BbrPacedSender::OnBytesAcked(size_t bytes) {
-  congestion_window_->AckReceived(bytes);
-}
-
-void BbrPacedSender::Process() {
-  pacing_bitrate_kbps_ =
-      std::max(min_send_bitrate_kbps_, estimated_bitrate_bps_ / 1000);
-  // If we have nothing to send, try sending again in 1 millisecond.
-  if (packets_.empty()) {
-    next_packet_send_time_ = 1;
-    return;
-  }
-  // If congestion window doesn't allow sending, try again in 1 millisecond.
-  if (packets_.front()->size_in_bytes + congestion_window_->data_inflight() >
-      max_data_inflight_bytes_) {
-    next_packet_send_time_ = 1;
-    return;
-  }
-  bool sent = TryToSendPacket(packets_.front());
-  if (sent) {
-    congestion_window_->PacketSent(packets_.front()->size_in_bytes);
-    delete packets_.front();
-    packets_.pop_front();
-    time_last_update_ms_ = clock_->TimeInMilliseconds();
-    if (!packets_.empty()) {
-      // Calculate in what time we should send current packet.
-      next_packet_send_time_ = (packets_.front()->size_in_bytes * 8000 +
-                                estimated_bitrate_bps_ / 2) /
-                               estimated_bitrate_bps_;
-      // As rounding errors may happen, |rounding_error_time_ms_| could be
-      // positive or negative depending on packet was sent earlier or later,
-      // after it hits certain threshold we will send a packet earlier or later
-      // depending on error we had so far.
-      rounding_error_time_ms_ +=
-          (next_packet_send_time_ - packets_.front()->size_in_bytes * 8000.0f /
-                                        estimated_bitrate_bps_ * 1.0f);
-    } else {
-      // If sending was unsuccessful try again in 1 millisecond.
-      next_packet_send_time_ = 1;
-    }
-  }
-}
-
-bool BbrPacedSender::TryToSendPacket(Packet* packet) {
-  PacedPacketInfo pacing_info;
-  return packet_sender_->TimeToSendPacket(packet->ssrc, packet->sequence_number,
-                                          packet->capture_time_ms,
-                                          packet->retransmission, pacing_info);
-}
-
-}  // namespace webrtc
diff --git a/modules/remote_bitrate_estimator/test/bbr_paced_sender.h b/modules/remote_bitrate_estimator/test/bbr_paced_sender.h
deleted file mode 100644
index f5ddaef..0000000
--- a/modules/remote_bitrate_estimator/test/bbr_paced_sender.h
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- *  Copyright (c) 2017 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_REMOTE_BITRATE_ESTIMATOR_TEST_BBR_PACED_SENDER_H_
-#define WEBRTC_MODULES_REMOTE_BITRATE_ESTIMATOR_TEST_BBR_PACED_SENDER_H_
-
-#include <list>
-#include <memory>
-
-#include "webrtc/modules/pacing/paced_sender.h"
-#include "webrtc/modules/pacing/pacer.h"
-
-namespace webrtc {
-namespace testing {
-namespace bwe {
-class CongestionWindow;
-}
-}  // namespace testing
-
-struct Packet {
-  Packet(RtpPacketSender::Priority priority,
-         uint32_t ssrc,
-         uint16_t seq_number,
-         int64_t capture_time_ms,
-         int64_t enqueue_time_ms,
-         size_t size_in_bytes,
-         bool retransmission)
-      : priority(priority),
-        ssrc(ssrc),
-        sequence_number(seq_number),
-        capture_time_ms(capture_time_ms),
-        enqueue_time_ms(enqueue_time_ms),
-        size_in_bytes(size_in_bytes),
-        retransmission(retransmission) {}
-  RtpPacketSender::Priority priority;
-  uint32_t ssrc;
-  uint16_t sequence_number;
-  int64_t capture_time_ms;
-  int64_t enqueue_time_ms;
-  size_t size_in_bytes;
-  bool retransmission;
-};
-
-class Clock;
-class RtcEventLog;
-struct Packet;
-class BbrPacedSender : public Pacer {
- public:
-  BbrPacedSender(const Clock* clock,
-                 PacedSender::PacketSender* packet_sender,
-                 RtcEventLog* event_log);
-  ~BbrPacedSender() override;
-  void SetEstimatedBitrateAndCongestionWindow(
-      uint32_t bitrate_bps,
-      bool in_probe_rtt,
-      uint64_t congestion_window) override;
-  void SetMinBitrate(int min_send_bitrate_bps);
-  void InsertPacket(RtpPacketSender::Priority priority,
-                    uint32_t ssrc,
-                    uint16_t sequence_number,
-                    int64_t capture_time_ms,
-                    size_t bytes,
-                    bool retransmission) override;
-  int64_t TimeUntilNextProcess() override;
-  void OnBytesAcked(size_t bytes) override;
-  void Process() override;
-  bool TryToSendPacket(Packet* packet);
-
- private:
-  const Clock* const clock_;
-  PacedSender::PacketSender* const packet_sender_;
-  uint32_t estimated_bitrate_bps_;
-  uint32_t min_send_bitrate_kbps_;
-  uint32_t pacing_bitrate_kbps_;
-  int64_t time_last_update_us_;
-  int64_t time_last_update_ms_;
-  int64_t next_packet_send_time_;
-  float rounding_error_time_ms_;
-  std::list<Packet*> packets_;
-  // TODO(gnish): integrate |max_data_inflight| into congestion window class.
-  size_t max_data_inflight_bytes_;
-  std::unique_ptr<testing::bwe::CongestionWindow> congestion_window_;
-};
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_REMOTE_BITRATE_ESTIMATOR_TEST_BBR_PACED_SENDER_H_
diff --git a/modules/remote_bitrate_estimator/test/bwe.cc b/modules/remote_bitrate_estimator/test/bwe.cc
deleted file mode 100644
index abc301c..0000000
--- a/modules/remote_bitrate_estimator/test/bwe.cc
+++ /dev/null
@@ -1,285 +0,0 @@
-/*
- *  Copyright (c) 2015 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/remote_bitrate_estimator/test/bwe.h"
-
-#include <limits>
-
-#include "webrtc/modules/remote_bitrate_estimator/test/estimators/bbr.h"
-#include "webrtc/modules/remote_bitrate_estimator/test/estimators/nada.h"
-#include "webrtc/modules/remote_bitrate_estimator/test/estimators/remb.h"
-#include "webrtc/modules/remote_bitrate_estimator/test/estimators/send_side.h"
-#include "webrtc/modules/remote_bitrate_estimator/test/estimators/tcp.h"
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace webrtc {
-namespace testing {
-namespace bwe {
-
-// With the assumption that packet loss is lower than 97%, the max gap
-// between elements in the set is lower than 0x8000, hence we have a
-// total order in the set. For (x,y,z) subset of the LinkedSet,
-// (x<=y and y<=z) ==> x<=z so the set can be sorted.
-const int kSetCapacity = 1000;
-
-BweReceiver::BweReceiver(int flow_id)
-    : flow_id_(flow_id),
-      received_packets_(kSetCapacity),
-      rate_counter_(),
-      loss_account_() {
-}
-
-BweReceiver::BweReceiver(int flow_id, int64_t window_size_ms)
-    : flow_id_(flow_id),
-      received_packets_(kSetCapacity),
-      rate_counter_(window_size_ms),
-      loss_account_() {
-}
-
-void BweReceiver::ReceivePacket(int64_t arrival_time_ms,
-                                const MediaPacket& media_packet) {
-  if (received_packets_.size() == kSetCapacity) {
-    RelieveSetAndUpdateLoss();
-  }
-
-  received_packets_.Insert(media_packet.sequence_number(),
-                           media_packet.send_time_ms(), arrival_time_ms,
-                           media_packet.payload_size());
-
-  rate_counter_.UpdateRates(media_packet.send_time_ms() * 1000,
-                            static_cast<uint32_t>(media_packet.payload_size()));
-}
-
-class NullBweSender : public BweSender {
- public:
-  NullBweSender() {}
-  virtual ~NullBweSender() {}
-
-  int GetFeedbackIntervalMs() const override { return 1000; }
-  void GiveFeedback(const FeedbackPacket& feedback) override {}
-  void OnPacketsSent(const Packets& packets) override {}
-  int64_t TimeUntilNextProcess() override {
-    return std::numeric_limits<int64_t>::max();
-  }
-  void Process() override {}
-
- private:
-  RTC_DISALLOW_COPY_AND_ASSIGN(NullBweSender);
-};
-
-int64_t GetAbsSendTimeInMs(uint32_t abs_send_time) {
-  const int kInterArrivalShift = 26;
-  const int kAbsSendTimeInterArrivalUpshift = 8;
-  const double kTimestampToMs =
-      1000.0 / static_cast<double>(1 << kInterArrivalShift);
-  uint32_t timestamp = abs_send_time << kAbsSendTimeInterArrivalUpshift;
-  return static_cast<int64_t>(timestamp) * kTimestampToMs;
-}
-
-BweSender* CreateBweSender(BandwidthEstimatorType estimator,
-                           int kbps,
-                           BitrateObserver* observer,
-                           Clock* clock) {
-  switch (estimator) {
-    case kRembEstimator:
-      return new RembBweSender(kbps, observer, clock);
-    case kSendSideEstimator:
-      return new SendSideBweSender(kbps, observer, clock);
-    case kNadaEstimator:
-      return new NadaBweSender(kbps, observer, clock);
-    case kBbrEstimator:
-      return new BbrBweSender(observer, clock);
-    case kTcpEstimator:
-      FALLTHROUGH();
-    case kNullEstimator:
-      return new NullBweSender();
-  }
-  assert(false);
-  return NULL;
-}
-
-BweReceiver* CreateBweReceiver(BandwidthEstimatorType type,
-                               int flow_id,
-                               bool plot) {
-  switch (type) {
-    case kRembEstimator:
-      return new RembReceiver(flow_id, plot);
-    case kSendSideEstimator:
-      return new SendSideBweReceiver(flow_id);
-    case kNadaEstimator:
-      return new NadaBweReceiver(flow_id);
-    case kBbrEstimator:
-      return new BbrBweReceiver(flow_id);
-    case kTcpEstimator:
-      return new TcpBweReceiver(flow_id);
-    case kNullEstimator:
-      return new BweReceiver(flow_id);
-  }
-  assert(false);
-  return NULL;
-}
-
-// Take into account all LinkedSet content.
-void BweReceiver::UpdateLoss() {
-  loss_account_.Add(LinkedSetPacketLossRatio());
-}
-
-// Preserve 10% latest packets and update packet loss based on the oldest
-// 90%, that will be removed.
-void BweReceiver::RelieveSetAndUpdateLoss() {
-  // Compute Loss for the whole LinkedSet and updates loss_account_.
-  UpdateLoss();
-
-  size_t num_preserved_elements = received_packets_.size() / 10;
-  PacketNodeIt it = received_packets_.begin();
-  std::advance(it, num_preserved_elements);
-
-  while (it != received_packets_.end()) {
-    received_packets_.Erase(it++);
-  }
-
-  // Compute Loss for the preserved elements
-  loss_account_.Subtract(LinkedSetPacketLossRatio());
-}
-
-float BweReceiver::GlobalReceiverPacketLossRatio() {
-  UpdateLoss();
-  return loss_account_.LossRatio();
-}
-
-// This function considers at most kSetCapacity = 1000 packets.
-LossAccount BweReceiver::LinkedSetPacketLossRatio() {
-  if (received_packets_.empty()) {
-    return LossAccount();
-  }
-
-  uint16_t oldest_seq_num = received_packets_.OldestSeqNumber();
-  uint16_t newest_seq_num = received_packets_.NewestSeqNumber();
-
-  size_t set_total_packets =
-      static_cast<uint16_t>(newest_seq_num - oldest_seq_num + 1);
-
-  size_t set_received_packets = received_packets_.size();
-  size_t set_lost_packets = set_total_packets - set_received_packets;
-
-  return LossAccount(set_total_packets, set_lost_packets);
-}
-
-uint32_t BweReceiver::RecentKbps() const {
-  return (rate_counter_.bits_per_second() + 500) / 1000;
-}
-
-// Go through a fixed time window of most recent packets received and
-// counts packets missing to obtain the packet loss ratio. If an unordered
-// packet falls out of the timewindow it will be counted as missing.
-// E.g.: for a timewindow covering 5 packets of the following arrival sequence
-// {10 7 9 5 6} 8 3 2 4 1, the output will be 1/6 (#8 is considered as missing).
-float BweReceiver::RecentPacketLossRatio() {
-  if (received_packets_.empty()) {
-    return 0.0f;
-  }
-  int number_packets_received = 0;
-
-  PacketNodeIt node_it = received_packets_.begin();  // Latest.
-
-  // Lowest timestamp limit, oldest one that should be checked.
-  int64_t time_limit_ms = (*node_it)->arrival_time_ms - kPacketLossTimeWindowMs;
-  // Oldest and newest values found within the given time window.
-  uint16_t oldest_seq_num = (*node_it)->sequence_number;
-  uint16_t newest_seq_num = oldest_seq_num;
-
-  while (node_it != received_packets_.end()) {
-    if ((*node_it)->arrival_time_ms < time_limit_ms) {
-      break;
-    }
-    uint16_t seq_num = (*node_it)->sequence_number;
-    if (IsNewerSequenceNumber(seq_num, newest_seq_num)) {
-      newest_seq_num = seq_num;
-    }
-    if (IsNewerSequenceNumber(oldest_seq_num, seq_num)) {
-      oldest_seq_num = seq_num;
-    }
-    ++node_it;
-    ++number_packets_received;
-  }
-  // Interval width between oldest and newest sequence number.
-  // There was an overflow if newest_seq_num < oldest_seq_num.
-  int gap = static_cast<uint16_t>(newest_seq_num - oldest_seq_num + 1);
-
-  return static_cast<float>(gap - number_packets_received) / gap;
-}
-
-LinkedSet::~LinkedSet() {
-  while (!empty())
-    RemoveTail();
-}
-
-void LinkedSet::Insert(uint16_t sequence_number,
-                       int64_t send_time_ms,
-                       int64_t arrival_time_ms,
-                       size_t payload_size) {
-  auto it = map_.find(sequence_number);
-  if (it != map_.end()) {
-    PacketNodeIt node_it = it->second;
-    PacketIdentifierNode* node = *node_it;
-    node->arrival_time_ms = arrival_time_ms;
-    if (node_it != list_.begin()) {
-      list_.erase(node_it);
-      list_.push_front(node);
-      map_[sequence_number] = list_.begin();
-    }
-  } else {
-    if (size() == capacity_) {
-      RemoveTail();
-    }
-    UpdateHead(new PacketIdentifierNode(sequence_number, send_time_ms,
-                                        arrival_time_ms, payload_size));
-  }
-}
-
-void LinkedSet::Insert(PacketIdentifierNode packet_identifier) {
-  Insert(packet_identifier.sequence_number, packet_identifier.send_time_ms,
-         packet_identifier.arrival_time_ms, packet_identifier.payload_size);
-}
-
-void LinkedSet::RemoveTail() {
-  map_.erase(list_.back()->sequence_number);
-  delete list_.back();
-  list_.pop_back();
-}
-void LinkedSet::UpdateHead(PacketIdentifierNode* new_head) {
-  list_.push_front(new_head);
-  map_[new_head->sequence_number] = list_.begin();
-}
-
-void LinkedSet::Erase(PacketNodeIt node_it) {
-  map_.erase((*node_it)->sequence_number);
-  delete (*node_it);
-  list_.erase(node_it);
-}
-
-void LossAccount::Add(LossAccount rhs) {
-  num_total += rhs.num_total;
-  num_lost += rhs.num_lost;
-}
-void LossAccount::Subtract(LossAccount rhs) {
-  num_total -= rhs.num_total;
-  num_lost -= rhs.num_lost;
-}
-
-float LossAccount::LossRatio() {
-  if (num_total == 0)
-    return 0.0f;
-  return static_cast<float>(num_lost) / num_total;
-}
-
-}  // namespace bwe
-}  // namespace testing
-}  // namespace webrtc
diff --git a/modules/remote_bitrate_estimator/test/bwe.h b/modules/remote_bitrate_estimator/test/bwe.h
deleted file mode 100644
index 4474ed2..0000000
--- a/modules/remote_bitrate_estimator/test/bwe.h
+++ /dev/null
@@ -1,199 +0,0 @@
-/*
- *  Copyright (c) 2015 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_REMOTE_BITRATE_ESTIMATOR_TEST_BWE_H_
-#define WEBRTC_MODULES_REMOTE_BITRATE_ESTIMATOR_TEST_BWE_H_
-
-#include <list>
-#include <map>
-#include <sstream>
-#include <string>
-
-#include "webrtc/modules/bitrate_controller/include/bitrate_controller.h"
-#include "webrtc/modules/remote_bitrate_estimator/test/bwe_test_framework.h"
-#include "webrtc/modules/remote_bitrate_estimator/test/packet.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/gtest_prod_util.h"
-
-namespace webrtc {
-namespace testing {
-namespace bwe {
-
-// Overload map comparator.
-class SequenceNumberOlderThan {
- public:
-  bool operator()(uint16_t seq_num_1, uint16_t seq_num_2) const {
-    return IsNewerSequenceNumber(seq_num_2, seq_num_1);
-  }
-};
-
-// Holds information for computing global packet loss.
-struct LossAccount {
-  LossAccount() : num_total(0), num_lost(0) {}
-  LossAccount(size_t num_total, size_t num_lost)
-      : num_total(num_total), num_lost(num_lost) {}
-  void Add(LossAccount rhs);
-  void Subtract(LossAccount rhs);
-  float LossRatio();
-  size_t num_total;
-  size_t num_lost;
-};
-
-// Holds only essential information about packets to be saved for
-// further use, e.g. for calculating packet loss and receiving rate.
-struct PacketIdentifierNode {
-  PacketIdentifierNode(uint16_t sequence_number,
-                       int64_t send_time_ms,
-                       int64_t arrival_time_ms,
-                       size_t payload_size)
-      : sequence_number(sequence_number),
-        send_time_ms(send_time_ms),
-        arrival_time_ms(arrival_time_ms),
-        payload_size(payload_size) {}
-
-  uint16_t sequence_number;
-  int64_t send_time_ms;
-  int64_t arrival_time_ms;
-  size_t payload_size;
-};
-
-typedef std::list<PacketIdentifierNode*>::iterator PacketNodeIt;
-
-// FIFO implementation for a limited capacity set.
-// Used for keeping the latest arrived packets while avoiding duplicates.
-// Allows efficient insertion, deletion and search.
-class LinkedSet {
- public:
-  explicit LinkedSet(int capacity) : capacity_(capacity) {}
-  ~LinkedSet();
-
-  // If the arriving packet (identified by its sequence number) is already
-  // in the LinkedSet, move its Node to the head of the list. Else, create
-  // a PacketIdentifierNode n_ and then UpdateHead(n_), calling RemoveTail()
-  // if the LinkedSet reached its maximum capacity.
-  void Insert(uint16_t sequence_number,
-              int64_t send_time_ms,
-              int64_t arrival_time_ms,
-              size_t payload_size);
-
-  void Insert(PacketIdentifierNode packet_identifier);
-
-  PacketNodeIt begin() { return list_.begin(); }
-  PacketNodeIt end() { return list_.end(); }
-
-  bool empty() const { return list_.empty(); }
-  size_t size() const { return list_.size(); }
-  size_t capacity() const { return capacity_; }
-
-  uint16_t OldestSeqNumber() const { return empty() ? 0 : map_.begin()->first; }
-  uint16_t NewestSeqNumber() const {
-    return empty() ? 0 : map_.rbegin()->first;
-  }
-
-  void Erase(PacketNodeIt node_it);
-
- private:
-  // Pop oldest element from the back of the list and remove it from the map.
-  void RemoveTail();
-  // Add new element to the front of the list and insert it in the map.
-  void UpdateHead(PacketIdentifierNode* new_head);
-  size_t capacity_;
-  std::map<uint16_t, PacketNodeIt, SequenceNumberOlderThan> map_;
-  std::list<PacketIdentifierNode*> list_;
-};
-
-const int kMinBitrateKbps = 10;
-const int kMaxBitrateKbps = 25000;
-
-class BweSender : public Module {
- public:
-  BweSender() {}
-  explicit BweSender(int bitrate_kbps) : bitrate_kbps_(bitrate_kbps) {}
-  virtual ~BweSender() {}
-
-  virtual int GetFeedbackIntervalMs() const = 0;
-  virtual void GiveFeedback(const FeedbackPacket& feedback) = 0;
-  virtual void OnPacketsSent(const Packets& packets) = 0;
-
- protected:
-  int bitrate_kbps_;
-
- private:
-  RTC_DISALLOW_COPY_AND_ASSIGN(BweSender);
-};
-
-class BweReceiver {
- public:
-  explicit BweReceiver(int flow_id);
-  BweReceiver(int flow_id, int64_t window_size_ms);
-
-  virtual ~BweReceiver() {}
-
-  virtual void ReceivePacket(int64_t arrival_time_ms,
-                             const MediaPacket& media_packet);
-  virtual FeedbackPacket* GetFeedback(int64_t now_ms) { return NULL; }
-
-  size_t GetSetCapacity() { return received_packets_.capacity(); }
-  double BitrateWindowS() const { return rate_counter_.BitrateWindowS(); }
-  uint32_t RecentKbps() const;  // Receiving Rate.
-
-  // Computes packet loss during an entire simulation, up to 4 billion packets.
-  float GlobalReceiverPacketLossRatio();  // Plot histogram.
-  float RecentPacketLossRatio();          // Plot dynamics.
-
-  static const int64_t kPacketLossTimeWindowMs = 500;
-  static const int64_t kReceivingRateTimeWindowMs = 1000;
-
- protected:
-  int flow_id_;
-  // Deals with packets sent more than once.
-  LinkedSet received_packets_;
-  // Used for calculating recent receiving rate.
-  RateCounter rate_counter_;
-
- private:
-  FRIEND_TEST_ALL_PREFIXES(BweReceiverTest, RecentKbps);
-  FRIEND_TEST_ALL_PREFIXES(BweReceiverTest, Loss);
-
-  void UpdateLoss();
-  void RelieveSetAndUpdateLoss();
-  // Packet loss for packets stored in the LinkedSet, up to 1000 packets.
-  // Used to update global loss account whenever the set is filled and cleared.
-  LossAccount LinkedSetPacketLossRatio();
-
-  // Used for calculating global packet loss ratio.
-  LossAccount loss_account_;
-};
-
-enum BandwidthEstimatorType {
-  kNullEstimator,
-  kNadaEstimator,
-  kRembEstimator,
-  kSendSideEstimator,
-  kTcpEstimator,
-  kBbrEstimator
-};
-
-const char* const bwe_names[] = {"Null", "NADA", "REMB", "GCC", "TCP", "BBR"};
-
-int64_t GetAbsSendTimeInMs(uint32_t abs_send_time);
-
-BweSender* CreateBweSender(BandwidthEstimatorType estimator,
-                           int kbps,
-                           BitrateObserver* observer,
-                           Clock* clock);
-
-BweReceiver* CreateBweReceiver(BandwidthEstimatorType type,
-                               int flow_id,
-                               bool plot);
-}  // namespace bwe
-}  // namespace testing
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_REMOTE_BITRATE_ESTIMATOR_TEST_BWE_H_
diff --git a/modules/remote_bitrate_estimator/test/bwe_test.cc b/modules/remote_bitrate_estimator/test/bwe_test.cc
deleted file mode 100644
index 357cfa5..0000000
--- a/modules/remote_bitrate_estimator/test/bwe_test.cc
+++ /dev/null
@@ -1,996 +0,0 @@
-/*
- *  Copyright (c) 2013 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/remote_bitrate_estimator/test/bwe_test.h"
-
-#include <memory>
-#include <sstream>
-
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/modules/remote_bitrate_estimator/test/bwe_test_framework.h"
-#include "webrtc/modules/remote_bitrate_estimator/test/metric_recorder.h"
-#include "webrtc/modules/remote_bitrate_estimator/test/packet_receiver.h"
-#include "webrtc/modules/remote_bitrate_estimator/test/packet_sender.h"
-#include "webrtc/rtc_base/arraysize.h"
-#include "webrtc/system_wrappers/include/clock.h"
-#include "webrtc/system_wrappers/include/field_trial.h"
-#include "webrtc/test/testsupport/perf_test.h"
-
-using std::vector;
-
-namespace {
-const int kQuickTestTimeoutMs = 500;
-}
-
-namespace webrtc {
-namespace testing {
-namespace bwe {
-
-PacketProcessorRunner::PacketProcessorRunner(PacketProcessor* processor)
-    : processor_(processor) {
-}
-
-PacketProcessorRunner::~PacketProcessorRunner() {
-  for (Packet* packet : queue_)
-    delete packet;
-}
-
-bool PacketProcessorRunner::RunsProcessor(
-    const PacketProcessor* processor) const {
-  return processor == processor_;
-}
-
-void PacketProcessorRunner::RunFor(int64_t time_ms,
-                                   int64_t time_now_ms,
-                                   Packets* in_out) {
-  Packets to_process;
-  FindPacketsToProcess(processor_->flow_ids(), in_out, &to_process);
-  processor_->RunFor(time_ms, &to_process);
-  QueuePackets(&to_process, time_now_ms * 1000);
-  if (!to_process.empty()) {
-    processor_->Plot(to_process.back()->send_time_ms());
-  }
-  in_out->merge(to_process, DereferencingComparator<Packet>);
-}
-
-void PacketProcessorRunner::FindPacketsToProcess(const FlowIds& flow_ids,
-                                                 Packets* in,
-                                                 Packets* out) {
-  assert(out->empty());
-  for (Packets::iterator it = in->begin(); it != in->end();) {
-    // TODO(holmer): Further optimize this by looking for consecutive flow ids
-    // in the packet list and only doing the binary search + splice once for a
-    // sequence.
-    if (flow_ids.find((*it)->flow_id()) != flow_ids.end()) {
-      Packets::iterator next = it;
-      ++next;
-      out->splice(out->end(), *in, it);
-      it = next;
-    } else {
-      ++it;
-    }
-  }
-}
-
-void PacketProcessorRunner::QueuePackets(Packets* batch,
-                                         int64_t end_of_batch_time_us) {
-  queue_.merge(*batch, DereferencingComparator<Packet>);
-  if (queue_.empty()) {
-    return;
-  }
-  Packets::iterator it = queue_.begin();
-  for (; it != queue_.end(); ++it) {
-    if ((*it)->send_time_us() > end_of_batch_time_us) {
-      break;
-    }
-  }
-  Packets to_transfer;
-  to_transfer.splice(to_transfer.begin(), queue_, queue_.begin(), it);
-  batch->merge(to_transfer, DereferencingComparator<Packet>);
-}
-
-// Plot link capacity by default.
-BweTest::BweTest() : BweTest(true) {
-}
-
-BweTest::BweTest(bool plot_capacity)
-    : run_time_ms_(0),
-      time_now_ms_(-1),
-      simulation_interval_ms_(-1),
-      plot_total_available_capacity_(plot_capacity) {
-  links_.push_back(&uplink_);
-  links_.push_back(&downlink_);
-}
-
-BweTest::~BweTest() {
-  for (Packet* packet : packets_)
-    delete packet;
-}
-
-void BweTest::SetUp() {
-  const ::testing::TestInfo* const test_info =
-      ::testing::UnitTest::GetInstance()->current_test_info();
-  std::string test_name =
-      std::string(test_info->test_case_name()) + "_" +
-      std::string(test_info->name());
-  BWE_TEST_LOGGING_GLOBAL_CONTEXT(test_name);
-  BWE_TEST_LOGGING_GLOBAL_ENABLE(false);
-}
-
-void Link::AddPacketProcessor(PacketProcessor* processor,
-                              ProcessorType processor_type) {
-  assert(processor);
-  switch (processor_type) {
-    case kSender:
-      senders_.push_back(static_cast<PacketSender*>(processor));
-      break;
-    case kReceiver:
-      receivers_.push_back(static_cast<PacketReceiver*>(processor));
-      break;
-    case kRegular:
-      break;
-  }
-  processors_.push_back(PacketProcessorRunner(processor));
-}
-
-void Link::RemovePacketProcessor(PacketProcessor* processor) {
-  for (std::vector<PacketProcessorRunner>::iterator it = processors_.begin();
-       it != processors_.end(); ++it) {
-    if (it->RunsProcessor(processor)) {
-      processors_.erase(it);
-      return;
-    }
-  }
-  assert(false);
-}
-
-// Ownership of the created packets is handed over to the caller.
-void Link::Run(int64_t run_for_ms, int64_t now_ms, Packets* packets) {
-  for (auto& processor : processors_) {
-    processor.RunFor(run_for_ms, now_ms, packets);
-  }
-}
-
-void BweTest::VerboseLogging(bool enable) {
-  BWE_TEST_LOGGING_GLOBAL_ENABLE(enable);
-}
-
-void BweTest::RunFor(int64_t time_ms) {
-  // Set simulation interval from first packet sender.
-  // TODO(holmer): Support different feedback intervals for different flows.
-
-  // For quick perf tests ignore passed timeout
-  if (field_trial::IsEnabled("WebRTC-QuickPerfTest")) {
-    time_ms = kQuickTestTimeoutMs;
-  }
-  if (!uplink_.senders().empty()) {
-    simulation_interval_ms_ = uplink_.senders()[0]->GetFeedbackIntervalMs();
-  } else if (!downlink_.senders().empty()) {
-    simulation_interval_ms_ = downlink_.senders()[0]->GetFeedbackIntervalMs();
-  }
-  assert(simulation_interval_ms_ > 0);
-  if (time_now_ms_ == -1) {
-    time_now_ms_ = simulation_interval_ms_;
-  }
-  for (run_time_ms_ += time_ms;
-       time_now_ms_ <= run_time_ms_ - simulation_interval_ms_;
-       time_now_ms_ += simulation_interval_ms_) {
-    // Packets are first generated on the first link, passed through all the
-    // PacketProcessors and PacketReceivers. The PacketReceivers produces
-    // FeedbackPackets which are then processed by the next link, where they
-    // at some point will be consumed by a PacketSender.
-    for (Link* link : links_)
-      link->Run(simulation_interval_ms_, time_now_ms_, &packets_);
-  }
-}
-
-std::string BweTest::GetTestName() const {
-  const ::testing::TestInfo* const test_info =
-      ::testing::UnitTest::GetInstance()->current_test_info();
-  return std::string(test_info->name());
-}
-
-void BweTest::PrintResults(double max_throughput_kbps,
-                           Stats<double> throughput_kbps,
-                           int flow_id,
-                           Stats<double> flow_delay_ms,
-                           Stats<double> flow_throughput_kbps) {
-  std::map<int, Stats<double>> flow_delays_ms;
-  flow_delays_ms[flow_id] = flow_delay_ms;
-  std::map<int, Stats<double>> flow_throughputs_kbps;
-  flow_throughputs_kbps[flow_id] = flow_throughput_kbps;
-  PrintResults(max_throughput_kbps, throughput_kbps, flow_delays_ms,
-               flow_throughputs_kbps);
-}
-
-void BweTest::PrintResults(double max_throughput_kbps,
-                           Stats<double> throughput_kbps,
-                           std::map<int, Stats<double>> flow_delay_ms,
-                           std::map<int, Stats<double>> flow_throughput_kbps) {
-  double utilization = throughput_kbps.GetMean() / max_throughput_kbps;
-  webrtc::test::PrintResult("BwePerformance", GetTestName(), "Utilization",
-                            utilization * 100.0, "%", false);
-  std::stringstream ss;
-  ss << throughput_kbps.GetStdDev() / throughput_kbps.GetMean();
-  webrtc::test::PrintResult("BwePerformance", GetTestName(),
-                            "Utilization var coeff", ss.str(), "", false);
-  for (auto& kv : flow_throughput_kbps) {
-    ss.str("");
-    ss << "Throughput flow " << kv.first;
-    webrtc::test::PrintResultMeanAndError("BwePerformance", GetTestName(),
-                                          ss.str(), kv.second.AsString(),
-                                          "kbps", false);
-  }
-  for (auto& kv : flow_delay_ms) {
-    ss.str("");
-    ss << "Delay flow " << kv.first;
-    webrtc::test::PrintResultMeanAndError("BwePerformance", GetTestName(),
-                                          ss.str(), kv.second.AsString(), "ms",
-                                          false);
-  }
-  double fairness_index = 1.0;
-  if (!flow_throughput_kbps.empty()) {
-    double squared_bitrate_sum = 0.0;
-    fairness_index = 0.0;
-    for (auto kv : flow_throughput_kbps) {
-      squared_bitrate_sum += kv.second.GetMean() * kv.second.GetMean();
-      fairness_index += kv.second.GetMean();
-    }
-    fairness_index *= fairness_index;
-    fairness_index /= flow_throughput_kbps.size() * squared_bitrate_sum;
-  }
-  webrtc::test::PrintResult("BwePerformance", GetTestName(), "Fairness",
-                            fairness_index * 100, "%", false);
-}
-
-void BweTest::RunFairnessTest(BandwidthEstimatorType bwe_type,
-                              size_t num_media_flows,
-                              size_t num_tcp_flows,
-                              int64_t run_time_seconds,
-                              uint32_t capacity_kbps,
-                              int64_t max_delay_ms,
-                              int64_t rtt_ms,
-                              int64_t max_jitter_ms,
-                              const int64_t* offsets_ms) {
-  RunFairnessTest(bwe_type, num_media_flows, num_tcp_flows, run_time_seconds,
-                  capacity_kbps, max_delay_ms, rtt_ms, max_jitter_ms,
-                  offsets_ms, "Fairness_test", bwe_names[bwe_type]);
-}
-
-void BweTest::RunFairnessTest(BandwidthEstimatorType bwe_type,
-                              size_t num_media_flows,
-                              size_t num_tcp_flows,
-                              int64_t run_time_seconds,
-                              uint32_t capacity_kbps,
-                              int64_t max_delay_ms,
-                              int64_t rtt_ms,
-                              int64_t max_jitter_ms,
-                              const int64_t* offsets_ms,
-                              const std::string& title,
-                              const std::string& flow_name) {
-  std::set<int> all_flow_ids;
-  std::set<int> media_flow_ids;
-  std::set<int> tcp_flow_ids;
-  int next_flow_id = 0;
-  for (size_t i = 0; i < num_media_flows; ++i) {
-    media_flow_ids.insert(next_flow_id);
-    all_flow_ids.insert(next_flow_id);
-    ++next_flow_id;
-  }
-  for (size_t i = 0; i < num_tcp_flows; ++i) {
-    tcp_flow_ids.insert(next_flow_id);
-    all_flow_ids.insert(next_flow_id);
-    ++next_flow_id;
-  }
-
-  std::vector<VideoSource*> sources;
-  std::vector<PacketSender*> senders;
-  std::vector<MetricRecorder*> metric_recorders;
-
-  int64_t max_offset_ms = 0;
-
-  for (int media_flow : media_flow_ids) {
-    sources.push_back(new AdaptiveVideoSource(media_flow, 30, 300, 0,
-                                              offsets_ms[media_flow]));
-    senders.push_back(new PacedVideoSender(&uplink_, sources.back(), bwe_type));
-    max_offset_ms = std::max(max_offset_ms, offsets_ms[media_flow]);
-  }
-
-  for (int tcp_flow : tcp_flow_ids) {
-    senders.push_back(new TcpSender(&uplink_, tcp_flow, offsets_ms[tcp_flow]));
-    max_offset_ms = std::max(max_offset_ms, offsets_ms[tcp_flow]);
-  }
-
-  ChokeFilter choke(&uplink_, all_flow_ids);
-  choke.set_capacity_kbps(capacity_kbps);
-  choke.set_max_delay_ms(max_delay_ms);
-  LinkShare link_share(&choke);
-
-  int64_t one_way_delay_ms = rtt_ms / 2;
-  DelayFilter delay_uplink(&uplink_, all_flow_ids);
-  delay_uplink.SetOneWayDelayMs(one_way_delay_ms);
-
-  JitterFilter jitter(&uplink_, all_flow_ids);
-  jitter.SetMaxJitter(max_jitter_ms);
-
-  std::vector<RateCounterFilter*> rate_counters;
-  for (int flow : media_flow_ids) {
-    rate_counters.push_back(
-        new RateCounterFilter(&uplink_, flow, "Receiver", bwe_names[bwe_type]));
-  }
-  for (int flow : tcp_flow_ids) {
-    rate_counters.push_back(new RateCounterFilter(&uplink_, flow, "Receiver",
-                                                  bwe_names[kTcpEstimator]));
-  }
-
-  RateCounterFilter total_utilization(
-      &uplink_, all_flow_ids, "total_utilization", "Total_link_utilization");
-
-  std::vector<PacketReceiver*> receivers;
-  // Delays is being plotted only for the first flow.
-  // To plot all of them, replace "i == 0" with "true" on new PacketReceiver().
-  for (int media_flow : media_flow_ids) {
-    metric_recorders.push_back(
-        new MetricRecorder(bwe_names[bwe_type], static_cast<int>(media_flow),
-                           senders[media_flow], &link_share));
-    receivers.push_back(new PacketReceiver(&uplink_, media_flow, bwe_type,
-                                           media_flow == 0, false,
-                                           metric_recorders[media_flow]));
-    metric_recorders[media_flow]->set_plot_available_capacity(
-        media_flow == 0 && plot_total_available_capacity_);
-    metric_recorders[media_flow]->set_start_computing_metrics_ms(max_offset_ms);
-  }
-  // Delays is not being plotted only for TCP flows. To plot all of them,
-  // replace first "false" occurence with "true" on new PacketReceiver().
-  for (int tcp_flow : tcp_flow_ids) {
-    metric_recorders.push_back(
-        new MetricRecorder(bwe_names[kTcpEstimator], static_cast<int>(tcp_flow),
-                           senders[tcp_flow], &link_share));
-    receivers.push_back(new PacketReceiver(&uplink_, tcp_flow, kTcpEstimator,
-                                           false, false,
-                                           metric_recorders[tcp_flow]));
-    metric_recorders[tcp_flow]->set_plot_available_capacity(
-        tcp_flow == 0 && plot_total_available_capacity_);
-  }
-
-  DelayFilter delay_downlink(&downlink_, all_flow_ids);
-  delay_downlink.SetOneWayDelayMs(one_way_delay_ms);
-
-  RunFor(run_time_seconds * 1000);
-
-  std::map<int, Stats<double>> flow_throughput_kbps;
-  for (RateCounterFilter* rate_counter : rate_counters) {
-    int flow_id = *rate_counter->flow_ids().begin();
-    flow_throughput_kbps[flow_id] = rate_counter->GetBitrateStats();
-  }
-
-  std::map<int, Stats<double>> flow_delay_ms;
-  for (PacketReceiver* receiver : receivers) {
-    int flow_id = *receiver->flow_ids().begin();
-    flow_delay_ms[flow_id] = receiver->GetDelayStats();
-  }
-
-  PrintResults(capacity_kbps, total_utilization.GetBitrateStats(),
-               flow_delay_ms, flow_throughput_kbps);
-
-  if (!field_trial::IsEnabled("WebRTC-QuickPerfTest")) {
-    for (int i : all_flow_ids) {
-      metric_recorders[i]->PlotThroughputHistogram(
-          title, flow_name, static_cast<int>(num_media_flows), 0);
-
-      metric_recorders[i]->PlotLossHistogram(title, flow_name,
-                                             static_cast<int>(num_media_flows),
-                                             receivers[i]->GlobalPacketLoss());
-    }
-
-    // Pointless to show delay histogram for TCP flow.
-    for (int i : media_flow_ids) {
-      metric_recorders[i]->PlotDelayHistogram(title, bwe_names[bwe_type],
-                                              static_cast<int>(num_media_flows),
-                                              one_way_delay_ms);
-      BWE_TEST_LOGGING_BASELINEBAR(5, bwe_names[bwe_type], one_way_delay_ms, i);
-    }
-  }
-
-  for (VideoSource* source : sources)
-    delete source;
-  for (PacketSender* sender : senders)
-    delete sender;
-  for (RateCounterFilter* rate_counter : rate_counters)
-    delete rate_counter;
-  for (PacketReceiver* receiver : receivers)
-    delete receiver;
-  for (MetricRecorder* recorder : metric_recorders)
-    delete recorder;
-}
-
-void BweTest::RunChoke(BandwidthEstimatorType bwe_type,
-                       std::vector<int> capacities_kbps) {
-  int flow_id = bwe_type;
-  AdaptiveVideoSource source(flow_id, 30, 300, 0, 0);
-  VideoSender sender(&uplink_, &source, bwe_type);
-  ChokeFilter choke(&uplink_, flow_id);
-  LinkShare link_share(&choke);
-  MetricRecorder metric_recorder(bwe_names[bwe_type], flow_id, &sender,
-                                 &link_share);
-  PacketReceiver receiver(&uplink_, flow_id, bwe_type, true, false,
-                          &metric_recorder);
-  metric_recorder.set_plot_available_capacity(plot_total_available_capacity_);
-
-  choke.set_max_delay_ms(500);
-  const int64_t kRunTimeMs = 60 * 1000;
-
-  std::stringstream title("Choke");
-  char delimiter = '_';
-
-  for (auto it = capacities_kbps.begin(); it != capacities_kbps.end(); ++it) {
-    choke.set_capacity_kbps(*it);
-    RunFor(kRunTimeMs);
-    title << delimiter << (*it);
-    delimiter = '-';
-  }
-
-  title << "_kbps,_" << (kRunTimeMs / 1000) << "s_each";
-  metric_recorder.PlotThroughputHistogram(title.str(), bwe_names[bwe_type], 1,
-                                          0);
-  metric_recorder.PlotDelayHistogram(title.str(), bwe_names[bwe_type], 1, 0);
-  // receiver.PlotLossHistogram(title, bwe_names[bwe_type], 1);
-  // receiver.PlotObjectiveHistogram(title, bwe_names[bwe_type], 1);
-}
-
-// 5.1. Single Video and Audio media traffic, forward direction.
-void BweTest::RunVariableCapacity1SingleFlow(BandwidthEstimatorType bwe_type) {
-  const int kFlowId = 0;  // Arbitrary value.
-  AdaptiveVideoSource source(kFlowId, 30, 300, 0, 0);
-  PacedVideoSender sender(&uplink_, &source, bwe_type);
-
-  DefaultEvaluationFilter up_filter(&uplink_, kFlowId);
-  LinkShare link_share(&(up_filter.choke));
-  MetricRecorder metric_recorder(bwe_names[bwe_type], kFlowId, &sender,
-                                 &link_share);
-
-  PacketReceiver receiver(&uplink_, kFlowId, bwe_type, true, true,
-                          &metric_recorder);
-
-  metric_recorder.set_plot_available_capacity(plot_total_available_capacity_);
-
-  DelayFilter down_filter(&downlink_, kFlowId);
-  down_filter.SetOneWayDelayMs(kOneWayDelayMs);
-
-  // Test also with one way propagation delay = 100ms.
-  // up_filter.delay.SetOneWayDelayMs(100);
-  // down_filter.SetOneWayDelayMs(100);
-
-  up_filter.choke.set_capacity_kbps(1000);
-  RunFor(40 * 1000);  // 0-40s.
-  up_filter.choke.set_capacity_kbps(2500);
-  RunFor(20 * 1000);  // 40-60s.
-  up_filter.choke.set_capacity_kbps(600);
-  RunFor(20 * 1000);  // 60-80s.
-  up_filter.choke.set_capacity_kbps(1000);
-  RunFor(20 * 1000);  // 80-100s.
-
-  std::string title("5.1_Variable_capacity_single_flow");
-  metric_recorder.PlotThroughputHistogram(title, bwe_names[bwe_type], 1, 0);
-  metric_recorder.PlotDelayHistogram(title, bwe_names[bwe_type], 1,
-                                     kOneWayDelayMs);
-  metric_recorder.PlotLossHistogram(title, bwe_names[bwe_type], 1,
-                                    receiver.GlobalPacketLoss());
-  BWE_TEST_LOGGING_BASELINEBAR(5, bwe_names[bwe_type], kOneWayDelayMs, kFlowId);
-}
-
-// 5.2. Two forward direction competing flows, variable capacity.
-void BweTest::RunVariableCapacity2MultipleFlows(BandwidthEstimatorType bwe_type,
-                                                size_t num_flows) {
-  std::vector<VideoSource*> sources;
-  std::vector<PacketSender*> senders;
-  std::vector<MetricRecorder*> metric_recorders;
-  std::vector<PacketReceiver*> receivers;
-
-  const int64_t kStartingApartMs = 0;  // Flows initialized simultaneously.
-
-  for (size_t i = 0; i < num_flows; ++i) {
-    sources.push_back(new AdaptiveVideoSource(static_cast<int>(i), 30, 300, 0,
-                                              i * kStartingApartMs));
-    senders.push_back(new VideoSender(&uplink_, sources[i], bwe_type));
-  }
-
-  FlowIds flow_ids = CreateFlowIdRange(0, static_cast<int>(num_flows - 1));
-
-  DefaultEvaluationFilter up_filter(&uplink_, flow_ids);
-  LinkShare link_share(&(up_filter.choke));
-
-  RateCounterFilter total_utilization(&uplink_, flow_ids, "Total_utilization",
-                                      "Total_link_utilization");
-
-  // Delays is being plotted only for the first flow.
-  // To plot all of them, replace "i == 0" with "true" on new PacketReceiver().
-  for (size_t i = 0; i < num_flows; ++i) {
-    metric_recorders.push_back(new MetricRecorder(
-        bwe_names[bwe_type], static_cast<int>(i), senders[i], &link_share));
-
-    receivers.push_back(new PacketReceiver(&uplink_, static_cast<int>(i),
-                                           bwe_type, i == 0, false,
-                                           metric_recorders[i]));
-    metric_recorders[i]->set_plot_available_capacity(
-        i == 0 && plot_total_available_capacity_);
-  }
-
-  DelayFilter down_filter(&downlink_, flow_ids);
-  down_filter.SetOneWayDelayMs(kOneWayDelayMs);
-  // Test also with one way propagation delay = 100ms.
-  // up_filter.delay.SetOneWayDelayMs(100);
-  // down_filter.SetOneWayDelayMs(100);
-
-  up_filter.choke.set_capacity_kbps(4000);
-  RunFor(25 * 1000);  // 0-25s.
-  up_filter.choke.set_capacity_kbps(2000);
-  RunFor(25 * 1000);  // 25-50s.
-  up_filter.choke.set_capacity_kbps(3500);
-  RunFor(25 * 1000);  // 50-75s.
-  up_filter.choke.set_capacity_kbps(1000);
-  RunFor(25 * 1000);  // 75-100s.
-  up_filter.choke.set_capacity_kbps(2000);
-  RunFor(25 * 1000);  // 100-125s.
-
-  std::string title("5.2_Variable_capacity_two_flows");
-  for (size_t i = 0; i < num_flows; ++i) {
-    metric_recorders[i]->PlotThroughputHistogram(title, bwe_names[bwe_type],
-                                                 num_flows, 0);
-    metric_recorders[i]->PlotDelayHistogram(title, bwe_names[bwe_type],
-                                            num_flows, kOneWayDelayMs);
-    metric_recorders[i]->PlotLossHistogram(title, bwe_names[bwe_type],
-                                           num_flows,
-                                           receivers[i]->GlobalPacketLoss());
-    BWE_TEST_LOGGING_BASELINEBAR(5, bwe_names[bwe_type], kOneWayDelayMs, i);
-  }
-
-  for (VideoSource* source : sources)
-    delete source;
-  for (PacketSender* sender : senders)
-    delete sender;
-  for (MetricRecorder* recorder : metric_recorders)
-    delete recorder;
-  for (PacketReceiver* receiver : receivers)
-    delete receiver;
-}
-
-// 5.3. Bi-directional RMCAT flows.
-void BweTest::RunBidirectionalFlow(BandwidthEstimatorType bwe_type) {
-  enum direction { kForward = 0, kBackward };
-  const size_t kNumFlows = 2;
-  std::unique_ptr<AdaptiveVideoSource> sources[kNumFlows];
-  std::unique_ptr<VideoSender> senders[kNumFlows];
-  std::unique_ptr<MetricRecorder> metric_recorders[kNumFlows];
-  std::unique_ptr<PacketReceiver> receivers[kNumFlows];
-
-  sources[kForward].reset(new AdaptiveVideoSource(kForward, 30, 300, 0, 0));
-  senders[kForward].reset(
-      new VideoSender(&uplink_, sources[kForward].get(), bwe_type));
-
-  sources[kBackward].reset(new AdaptiveVideoSource(kBackward, 30, 300, 0, 0));
-  senders[kBackward].reset(
-      new VideoSender(&downlink_, sources[kBackward].get(), bwe_type));
-
-  DefaultEvaluationFilter up_filter(&uplink_, kForward);
-  LinkShare up_link_share(&(up_filter.choke));
-
-  metric_recorders[kForward].reset(new MetricRecorder(
-      bwe_names[bwe_type], kForward, senders[kForward].get(), &up_link_share));
-  receivers[kForward].reset(
-      new PacketReceiver(&uplink_, kForward, bwe_type, true, false,
-                         metric_recorders[kForward].get()));
-
-  metric_recorders[kForward].get()->set_plot_available_capacity(
-      plot_total_available_capacity_);
-
-  DefaultEvaluationFilter down_filter(&downlink_, kBackward);
-  LinkShare down_link_share(&(down_filter.choke));
-
-  metric_recorders[kBackward].reset(
-      new MetricRecorder(bwe_names[bwe_type], kBackward,
-                         senders[kBackward].get(), &down_link_share));
-  receivers[kBackward].reset(
-      new PacketReceiver(&downlink_, kBackward, bwe_type, true, false,
-                         metric_recorders[kBackward].get()));
-
-  metric_recorders[kBackward].get()->set_plot_available_capacity(
-      plot_total_available_capacity_);
-
-  // Test also with one way propagation delay = 100ms.
-  // up_filter.delay.SetOneWayDelayMs(100);
-  // down_filter.delay.SetOneWayDelayMs(100);
-
-  up_filter.choke.set_capacity_kbps(2000);
-  down_filter.choke.set_capacity_kbps(2000);
-  RunFor(20 * 1000);  // 0-20s.
-
-  up_filter.choke.set_capacity_kbps(1000);
-  RunFor(15 * 1000);  // 20-35s.
-
-  down_filter.choke.set_capacity_kbps(800);
-  RunFor(5 * 1000);  // 35-40s.
-
-  up_filter.choke.set_capacity_kbps(500);
-  RunFor(20 * 1000);  // 40-60s.
-
-  up_filter.choke.set_capacity_kbps(2000);
-  RunFor(10 * 1000);  // 60-70s.
-
-  down_filter.choke.set_capacity_kbps(2000);
-  RunFor(30 * 1000);  // 70-100s.
-
-  std::string title("5.3_Bidirectional_flows");
-  for (size_t i = 0; i < kNumFlows; ++i) {
-    metric_recorders[i].get()->PlotThroughputHistogram(
-        title, bwe_names[bwe_type], kNumFlows, 0);
-    metric_recorders[i].get()->PlotDelayHistogram(title, bwe_names[bwe_type],
-                                                  kNumFlows, kOneWayDelayMs);
-    metric_recorders[i].get()->PlotLossHistogram(
-        title, bwe_names[bwe_type], kNumFlows,
-        receivers[i].get()->GlobalPacketLoss());
-    BWE_TEST_LOGGING_BASELINEBAR(5, bwe_names[bwe_type], kOneWayDelayMs, i);
-  }
-}
-
-// 5.4. Three forward direction competing flows, constant capacity.
-void BweTest::RunSelfFairness(BandwidthEstimatorType bwe_type) {
-  const int kNumRmcatFlows = 3;
-  const int kNumTcpFlows = 0;
-  const int64_t kRunTimeS = 120;
-  const int kLinkCapacity = 3500;
-
-  int64_t max_delay_ms = kMaxQueueingDelayMs;
-  int64_t rtt_ms = 2 * kOneWayDelayMs;
-
-  const int64_t kStartingApartMs = 20 * 1000;
-  int64_t offsets_ms[kNumRmcatFlows];
-  for (int i = 0; i < kNumRmcatFlows; ++i) {
-    offsets_ms[i] = kStartingApartMs * i;
-  }
-
-  // Test also with one way propagation delay = 100ms.
-  // rtt_ms = 2 * 100;
-  // Test also with bottleneck queue size = 20ms and 1000ms.
-  // max_delay_ms = 20;
-  // max_delay_ms = 1000;
-
-  std::string title("5.4_Self_fairness_test");
-
-  // Test also with one way propagation delay = 100ms.
-  RunFairnessTest(bwe_type, kNumRmcatFlows, kNumTcpFlows, kRunTimeS,
-                  kLinkCapacity, max_delay_ms, rtt_ms, kMaxJitterMs, offsets_ms,
-                  title, bwe_names[bwe_type]);
-}
-
-// 5.5. Five competing RMCAT flows under different RTTs.
-void BweTest::RunRoundTripTimeFairness(BandwidthEstimatorType bwe_type) {
-  const int kAllFlowIds[] = {0, 1, 2, 3, 4};  // Five RMCAT flows.
-  const int64_t kAllOneWayDelayMs[] = {10, 25, 50, 100, 150};
-  const size_t kNumFlows = arraysize(kAllFlowIds);
-  std::unique_ptr<AdaptiveVideoSource> sources[kNumFlows];
-  std::unique_ptr<VideoSender> senders[kNumFlows];
-  std::unique_ptr<MetricRecorder> metric_recorders[kNumFlows];
-
-  // Flows initialized 10 seconds apart.
-  const int64_t kStartingApartMs = 10 * 1000;
-
-  for (size_t i = 0; i < kNumFlows; ++i) {
-    sources[i].reset(new AdaptiveVideoSource(kAllFlowIds[i], 30, 300, 0,
-                                             i * kStartingApartMs));
-    senders[i].reset(new VideoSender(&uplink_, sources[i].get(), bwe_type));
-  }
-
-  ChokeFilter choke_filter(&uplink_, CreateFlowIds(kAllFlowIds, kNumFlows));
-  LinkShare link_share(&choke_filter);
-
-  JitterFilter jitter_filter(&uplink_, CreateFlowIds(kAllFlowIds, kNumFlows));
-
-  std::unique_ptr<DelayFilter> up_delay_filters[kNumFlows];
-  for (size_t i = 0; i < kNumFlows; ++i) {
-    up_delay_filters[i].reset(new DelayFilter(&uplink_, kAllFlowIds[i]));
-  }
-
-  RateCounterFilter total_utilization(
-      &uplink_, CreateFlowIds(kAllFlowIds, kNumFlows), "Total_utilization",
-      "Total_link_utilization");
-
-  // Delays is being plotted only for the first flow.
-  // To plot all of them, replace "i == 0" with "true" on new PacketReceiver().
-  std::unique_ptr<PacketReceiver> receivers[kNumFlows];
-  for (size_t i = 0; i < kNumFlows; ++i) {
-    metric_recorders[i].reset(
-        new MetricRecorder(bwe_names[bwe_type], static_cast<int>(i),
-                           senders[i].get(), &link_share));
-
-    receivers[i].reset(new PacketReceiver(&uplink_, kAllFlowIds[i], bwe_type,
-                                          i == 0, false,
-                                          metric_recorders[i].get()));
-    metric_recorders[i].get()->set_start_computing_metrics_ms(kStartingApartMs *
-                                                              (kNumFlows - 1));
-    metric_recorders[i].get()->set_plot_available_capacity(
-        i == 0 && plot_total_available_capacity_);
-  }
-
-  std::unique_ptr<DelayFilter> down_delay_filters[kNumFlows];
-  for (size_t i = 0; i < kNumFlows; ++i) {
-    down_delay_filters[i].reset(new DelayFilter(&downlink_, kAllFlowIds[i]));
-  }
-
-  jitter_filter.SetMaxJitter(kMaxJitterMs);
-  choke_filter.set_max_delay_ms(kMaxQueueingDelayMs);
-
-  for (size_t i = 0; i < kNumFlows; ++i) {
-    up_delay_filters[i]->SetOneWayDelayMs(kAllOneWayDelayMs[i]);
-    down_delay_filters[i]->SetOneWayDelayMs(kAllOneWayDelayMs[i]);
-  }
-
-  choke_filter.set_capacity_kbps(3500);
-
-  RunFor(300 * 1000);  // 0-300s.
-
-  std::string title("5.5_Round_Trip_Time_Fairness");
-  for (size_t i = 0; i < kNumFlows; ++i) {
-    metric_recorders[i].get()->PlotThroughputHistogram(
-        title, bwe_names[bwe_type], kNumFlows, 0);
-    metric_recorders[i].get()->PlotDelayHistogram(title, bwe_names[bwe_type],
-                                                  kNumFlows, kOneWayDelayMs);
-    metric_recorders[i].get()->PlotLossHistogram(
-        title, bwe_names[bwe_type], kNumFlows,
-        receivers[i].get()->GlobalPacketLoss());
-    BWE_TEST_LOGGING_BASELINEBAR(5, bwe_names[bwe_type], kAllOneWayDelayMs[i],
-                                 i);
-  }
-}
-
-// 5.6. RMCAT Flow competing with a long TCP Flow.
-void BweTest::RunLongTcpFairness(BandwidthEstimatorType bwe_type) {
-  const size_t kNumRmcatFlows = 1;
-  const size_t kNumTcpFlows = 1;
-  const int64_t kRunTimeS = 120;
-  const int kCapacityKbps = 2000;
-  // Tcp starts at t = 0, media flow at t = 5s.
-  const int64_t kOffSetsMs[] = {5000, 0};
-
-  int64_t max_delay_ms = kMaxQueueingDelayMs;
-  int64_t rtt_ms = 2 * kOneWayDelayMs;
-
-  // Test also with one way propagation delay = 100ms.
-  // rtt_ms = 2 * 100;
-  // Test also with bottleneck queue size = 20ms and 1000ms.
-  // max_delay_ms = 20;
-  // max_delay_ms = 1000;
-
-  std::string title("5.6_Long_TCP_Fairness");
-  std::string flow_name = std::string() +
-      bwe_names[bwe_type] + 'x' + bwe_names[kTcpEstimator];
-
-  RunFairnessTest(bwe_type, kNumRmcatFlows, kNumTcpFlows, kRunTimeS,
-                  kCapacityKbps, max_delay_ms, rtt_ms, kMaxJitterMs, kOffSetsMs,
-                  title, flow_name);
-}
-
-// 5.7. RMCAT Flows competing with multiple short TCP Flows.
-void BweTest::RunMultipleShortTcpFairness(
-    BandwidthEstimatorType bwe_type,
-    std::vector<int> tcp_file_sizes_bytes,
-    std::vector<int64_t> tcp_starting_times_ms) {
-  // Two RMCAT flows and ten TCP flows.
-  const int kAllRmcatFlowIds[] = {0, 1};
-  const int kAllTcpFlowIds[] = {2, 3, 4, 5, 6, 7, 8, 9, 10, 11};
-
-  assert(tcp_starting_times_ms.size() == tcp_file_sizes_bytes.size() &&
-         tcp_starting_times_ms.size() == arraysize(kAllTcpFlowIds));
-
-  const size_t kNumRmcatFlows = arraysize(kAllRmcatFlowIds);
-  const size_t kNumTotalFlows = kNumRmcatFlows + arraysize(kAllTcpFlowIds);
-
-  std::unique_ptr<AdaptiveVideoSource> sources[kNumRmcatFlows];
-  std::unique_ptr<PacketSender> senders[kNumTotalFlows];
-  std::unique_ptr<MetricRecorder> metric_recorders[kNumTotalFlows];
-  std::unique_ptr<PacketReceiver> receivers[kNumTotalFlows];
-
-  // RMCAT Flows are initialized simultaneosly at t=5 seconds.
-  const int64_t kRmcatStartingTimeMs = 5 * 1000;
-  for (size_t id : kAllRmcatFlowIds) {
-    sources[id].reset(new AdaptiveVideoSource(static_cast<int>(id), 30, 300, 0,
-                                              kRmcatStartingTimeMs));
-    senders[id].reset(new VideoSender(&uplink_, sources[id].get(), bwe_type));
-  }
-
-  for (size_t id : kAllTcpFlowIds) {
-    senders[id].reset(new TcpSender(&uplink_, static_cast<int>(id),
-                                    tcp_starting_times_ms[id - kNumRmcatFlows],
-                                    tcp_file_sizes_bytes[id - kNumRmcatFlows]));
-  }
-
-  FlowIds flow_ids = CreateFlowIdRange(0, static_cast<int>(kNumTotalFlows - 1));
-  DefaultEvaluationFilter up_filter(&uplink_, flow_ids);
-
-  LinkShare link_share(&(up_filter.choke));
-
-  RateCounterFilter total_utilization(&uplink_, flow_ids, "Total_utilization",
-                                      "Total_link_utilization");
-
-  // Delays is being plotted only for the first flow.
-  // To plot all of them, replace "i == 0" with "true" on new PacketReceiver().
-  for (size_t id : kAllRmcatFlowIds) {
-    metric_recorders[id].reset(
-        new MetricRecorder(bwe_names[bwe_type], static_cast<int>(id),
-                           senders[id].get(), &link_share));
-    receivers[id].reset(new PacketReceiver(&uplink_, static_cast<int>(id),
-                                           bwe_type, id == 0, false,
-                                           metric_recorders[id].get()));
-    metric_recorders[id].get()->set_start_computing_metrics_ms(
-        kRmcatStartingTimeMs);
-    metric_recorders[id].get()->set_plot_available_capacity(
-        id == 0 && plot_total_available_capacity_);
-  }
-
-  // Delays is not being plotted only for TCP flows. To plot all of them,
-  // replace first "false" occurence with "true" on new PacketReceiver().
-  for (size_t id : kAllTcpFlowIds) {
-    metric_recorders[id].reset(
-        new MetricRecorder(bwe_names[kTcpEstimator], static_cast<int>(id),
-                           senders[id].get(), &link_share));
-    receivers[id].reset(new PacketReceiver(&uplink_, static_cast<int>(id),
-                                           kTcpEstimator, false, false,
-                                           metric_recorders[id].get()));
-    metric_recorders[id].get()->set_plot_available_capacity(
-        id == 0 && plot_total_available_capacity_);
-  }
-
-  DelayFilter down_filter(&downlink_, flow_ids);
-  down_filter.SetOneWayDelayMs(kOneWayDelayMs);
-
-  // Test also with one way propagation delay = 100ms.
-  // up_filter.delay.SetOneWayDelayMs(100);
-  // down_filter.SetOneWayDelayms(100);
-
-  // Test also with bottleneck queue size = 20ms and 1000ms.
-  // up_filter.choke.set_max_delay_ms(20);
-  // up_filter.choke.set_max_delay_ms(1000);
-
-  // Test also with no Jitter:
-  // up_filter.jitter.SetMaxJitter(0);
-
-  up_filter.choke.set_capacity_kbps(2000);
-
-  RunFor(300 * 1000);  // 0-300s.
-
-  std::string title("5.7_Multiple_short_TCP_flows");
-  for (size_t id : kAllRmcatFlowIds) {
-    metric_recorders[id].get()->PlotThroughputHistogram(
-        title, bwe_names[bwe_type], kNumRmcatFlows, 0);
-    metric_recorders[id].get()->PlotDelayHistogram(
-        title, bwe_names[bwe_type], kNumRmcatFlows, kOneWayDelayMs);
-    metric_recorders[id].get()->PlotLossHistogram(
-        title, bwe_names[bwe_type], kNumRmcatFlows,
-        receivers[id].get()->GlobalPacketLoss());
-    BWE_TEST_LOGGING_BASELINEBAR(5, bwe_names[bwe_type], kOneWayDelayMs, id);
-  }
-}
-
-// 5.8. Three forward direction competing flows, constant capacity.
-// During the test, one of the flows is paused and later resumed.
-void BweTest::RunPauseResumeFlows(BandwidthEstimatorType bwe_type) {
-  const int kAllFlowIds[] = {0, 1, 2};  // Three RMCAT flows.
-  const size_t kNumFlows = arraysize(kAllFlowIds);
-
-  std::unique_ptr<AdaptiveVideoSource> sources[kNumFlows];
-  std::unique_ptr<VideoSender> senders[kNumFlows];
-  std::unique_ptr<MetricRecorder> metric_recorders[kNumFlows];
-  std::unique_ptr<PacketReceiver> receivers[kNumFlows];
-
-  // Flows initialized simultaneously.
-  const int64_t kStartingApartMs = 0;
-
-  for (size_t i = 0; i < kNumFlows; ++i) {
-    sources[i].reset(new AdaptiveVideoSource(kAllFlowIds[i], 30, 300, 0,
-                                             i * kStartingApartMs));
-    senders[i].reset(new VideoSender(&uplink_, sources[i].get(), bwe_type));
-  }
-
-  DefaultEvaluationFilter filter(&uplink_,
-                                 CreateFlowIds(kAllFlowIds, kNumFlows));
-
-  LinkShare link_share(&(filter.choke));
-
-  RateCounterFilter total_utilization(
-      &uplink_, CreateFlowIds(kAllFlowIds, kNumFlows), "Total_utilization",
-      "Total_link_utilization");
-
-  // Delays is being plotted only for the first flow.
-  // To plot all of them, replace "i == 0" with "true" on new PacketReceiver().
-  for (size_t i = 0; i < kNumFlows; ++i) {
-    metric_recorders[i].reset(
-        new MetricRecorder(bwe_names[bwe_type], static_cast<int>(i),
-                           senders[i].get(), &link_share));
-    receivers[i].reset(new PacketReceiver(&uplink_, kAllFlowIds[i], bwe_type,
-                                          i == 0, false,
-                                          metric_recorders[i].get()));
-    metric_recorders[i].get()->set_start_computing_metrics_ms(kStartingApartMs *
-                                                              (kNumFlows - 1));
-    metric_recorders[i].get()->set_plot_available_capacity(
-        i == 0 && plot_total_available_capacity_);
-  }
-
-  // Test also with one way propagation delay = 100ms.
-  // filter.delay.SetOneWayDelayMs(100);
-  filter.choke.set_capacity_kbps(3500);
-
-  RunFor(40 * 1000);  // 0-40s.
-  senders[0].get()->Pause();
-  RunFor(20 * 1000);  // 40-60s.
-  senders[0].get()->Resume(20 * 1000);
-  RunFor(60 * 1000);  // 60-120s.
-
-  int64_t paused[] = {20 * 1000, 0, 0};
-
-  // First flow is being paused, hence having a different optimum.
-  const std::string optima_lines[] = {"1", "2", "2"};
-
-  std::string title("5.8_Pause_and_resume_media_flow");
-  for (size_t i = 0; i < kNumFlows; ++i) {
-    metric_recorders[i].get()->PlotThroughputHistogram(
-        title, bwe_names[bwe_type], kNumFlows, paused[i], optima_lines[i]);
-    metric_recorders[i].get()->PlotDelayHistogram(title, bwe_names[bwe_type],
-                                                  kNumFlows, kOneWayDelayMs);
-    metric_recorders[i].get()->PlotLossHistogram(
-        title, bwe_names[bwe_type], kNumFlows,
-        receivers[i].get()->GlobalPacketLoss());
-    BWE_TEST_LOGGING_BASELINEBAR(5, bwe_names[bwe_type], kOneWayDelayMs, i);
-  }
-}
-
-// Following functions are used for randomizing TCP file size and
-// starting time, used on 5.7 RunMultipleShortTcpFairness.
-// They are pseudo-random generators, creating always the same
-// value sequence for a given Random seed.
-
-std::vector<int> BweTest::GetFileSizesBytes(int num_files) {
-  // File size chosen from uniform distribution between [100,1000] kB.
-  const int kMinKbytes = 100;
-  const int kMaxKbytes = 1000;
-
-  Random random(0x12345678);
-  std::vector<int> tcp_file_sizes_bytes;
-
-  while (num_files-- > 0) {
-    tcp_file_sizes_bytes.push_back(random.Rand(kMinKbytes, kMaxKbytes) * 1000);
-  }
-
-  return tcp_file_sizes_bytes;
-}
-
-std::vector<int64_t> BweTest::GetStartingTimesMs(int num_files) {
-  // OFF state behaves as an exp. distribution with mean = 10 seconds.
-  const float kMeanMs = 10000.0f;
-  Random random(0x12345678);
-
-  std::vector<int64_t> tcp_starting_times_ms;
-
-  // Two TCP Flows are initialized simultaneosly at t=0 seconds.
-  for (int i = 0; i < 2; ++i, --num_files) {
-    tcp_starting_times_ms.push_back(0);
-  }
-
-  // Other TCP Flows are initialized in an OFF state.
-  while (num_files-- > 0) {
-    tcp_starting_times_ms.push_back(
-        static_cast<int64_t>(random.Exponential(1.0f / kMeanMs)));
-  }
-
-  return tcp_starting_times_ms;
-}
-
-}  // namespace bwe
-}  // namespace testing
-}  // namespace webrtc
diff --git a/modules/remote_bitrate_estimator/test/bwe_test.h b/modules/remote_bitrate_estimator/test/bwe_test.h
deleted file mode 100644
index 01e439c..0000000
--- a/modules/remote_bitrate_estimator/test/bwe_test.h
+++ /dev/null
@@ -1,196 +0,0 @@
-/*
- *  Copyright (c) 2013 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_REMOTE_BITRATE_ESTIMATOR_TEST_BWE_TEST_H_
-#define WEBRTC_MODULES_REMOTE_BITRATE_ESTIMATOR_TEST_BWE_TEST_H_
-
-#include <map>
-#include <string>
-#include <vector>
-
-#include "webrtc/modules/remote_bitrate_estimator/include/remote_bitrate_estimator.h"
-#include "webrtc/modules/remote_bitrate_estimator/test/bwe.h"
-#include "webrtc/modules/remote_bitrate_estimator/test/bwe_test_framework.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-namespace testing {
-namespace bwe {
-
-class BweReceiver;
-class PacketReceiver;
-class PacketSender;
-
-class PacketProcessorRunner {
- public:
-  explicit PacketProcessorRunner(PacketProcessor* processor);
-  ~PacketProcessorRunner();
-
-  bool RunsProcessor(const PacketProcessor* processor) const;
-  void RunFor(int64_t time_ms, int64_t time_now_ms, Packets* in_out);
-
- private:
-  void FindPacketsToProcess(const FlowIds& flow_ids, Packets* in, Packets* out);
-  void QueuePackets(Packets* batch, int64_t end_of_batch_time_us);
-
-  PacketProcessor* processor_;
-  Packets queue_;
-};
-
-class Link : public PacketProcessorListener {
- public:
-  virtual ~Link() {}
-
-  virtual void AddPacketProcessor(PacketProcessor* processor,
-                                  ProcessorType type);
-  virtual void RemovePacketProcessor(PacketProcessor* processor);
-
-  void Run(int64_t run_for_ms, int64_t now_ms, Packets* packets);
-
-  const std::vector<PacketSender*>& senders() { return senders_; }
-  const std::vector<PacketProcessorRunner>& processors() { return processors_; }
-
- private:
-  std::vector<PacketSender*> senders_;
-  std::vector<PacketReceiver*> receivers_;
-  std::vector<PacketProcessorRunner> processors_;
-};
-
-class BweTest {
- public:
-  BweTest();
-  explicit BweTest(bool plot_capacity);
-  ~BweTest();
-
-  void RunChoke(BandwidthEstimatorType bwe_type,
-                std::vector<int> capacities_kbps);
-
-  void RunVariableCapacity1SingleFlow(BandwidthEstimatorType bwe_type);
-  void RunVariableCapacity2MultipleFlows(BandwidthEstimatorType bwe_type,
-                                         size_t num_flows);
-  void RunBidirectionalFlow(BandwidthEstimatorType bwe_type);
-  void RunSelfFairness(BandwidthEstimatorType bwe_type);
-  void RunRoundTripTimeFairness(BandwidthEstimatorType bwe_type);
-  void RunLongTcpFairness(BandwidthEstimatorType bwe_type);
-  void RunMultipleShortTcpFairness(BandwidthEstimatorType bwe_type,
-                                   std::vector<int> tcp_file_sizes_bytes,
-                                   std::vector<int64_t> tcp_starting_times_ms);
-  void RunPauseResumeFlows(BandwidthEstimatorType bwe_type);
-
-  void RunFairnessTest(BandwidthEstimatorType bwe_type,
-                       size_t num_media_flows,
-                       size_t num_tcp_flows,
-                       int64_t run_time_seconds,
-                       uint32_t capacity_kbps,
-                       int64_t max_delay_ms,
-                       int64_t rtt_ms,
-                       int64_t max_jitter_ms,
-                       const int64_t* offsets_ms);
-
-  void RunFairnessTest(BandwidthEstimatorType bwe_type,
-                       size_t num_media_flows,
-                       size_t num_tcp_flows,
-                       int64_t run_time_seconds,
-                       uint32_t capacity_kbps,
-                       int64_t max_delay_ms,
-                       int64_t rtt_ms,
-                       int64_t max_jitter_ms,
-                       const int64_t* offsets_ms,
-                       const std::string& title,
-                       const std::string& flow_name);
-
-  static std::vector<int> GetFileSizesBytes(int num_files);
-  static std::vector<int64_t> GetStartingTimesMs(int num_files);
-
- protected:
-  void SetUp();
-
-  void VerboseLogging(bool enable);
-  void RunFor(int64_t time_ms);
-  std::string GetTestName() const;
-
-  void PrintResults(double max_throughput_kbps,
-                    Stats<double> throughput_kbps,
-                    int flow_id,
-                    Stats<double> flow_delay_ms,
-                    Stats<double> flow_throughput_kbps);
-
-  void PrintResults(double max_throughput_kbps,
-                    Stats<double> throughput_kbps,
-                    std::map<int, Stats<double>> flow_delay_ms,
-                    std::map<int, Stats<double>> flow_throughput_kbps);
-
-  Link downlink_;
-  Link uplink_;
-
- private:
-  void FindPacketsToProcess(const FlowIds& flow_ids, Packets* in,
-                            Packets* out);
-  void GiveFeedbackToAffectedSenders(PacketReceiver* receiver);
-
-  int64_t run_time_ms_;
-  int64_t time_now_ms_;
-  int64_t simulation_interval_ms_;
-  std::vector<Link*> links_;
-  Packets packets_;
-  bool plot_total_available_capacity_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(BweTest);
-};
-
-// Default Evaluation parameters:
-// Link capacity: 4000ms;
-// Queueing delay capacity: 300ms.
-// One-Way propagation delay: 50ms.
-// Jitter model: Truncated gaussian.
-// Maximum end-to-end jitter: 30ms = 2*standard_deviation.
-// Bottleneck queue type: Drop tail.
-// Path loss ratio: 0%.
-
-const int kOneWayDelayMs = 50;
-const int kMaxQueueingDelayMs = 300;
-const int kMaxCapacityKbps = 4000;
-const int kMaxJitterMs = 15;
-
-struct DefaultEvaluationFilter {
-  DefaultEvaluationFilter(PacketProcessorListener* listener, int flow_id)
-      : choke(listener, flow_id),
-        delay(listener, flow_id),
-        jitter(listener, flow_id) {
-    SetDefaultParameters();
-  }
-
-  DefaultEvaluationFilter(PacketProcessorListener* listener,
-                          const FlowIds& flow_ids)
-      : choke(listener, flow_ids),
-        delay(listener, flow_ids),
-        jitter(listener, flow_ids) {
-    SetDefaultParameters();
-  }
-
-  void SetDefaultParameters() {
-    delay.SetOneWayDelayMs(kOneWayDelayMs);
-    choke.set_max_delay_ms(kMaxQueueingDelayMs);
-    choke.set_capacity_kbps(kMaxCapacityKbps);
-    jitter.SetMaxJitter(kMaxJitterMs);
-  }
-
-  ChokeFilter choke;
-  DelayFilter delay;
-  JitterFilter jitter;
-};
-
-}  // namespace bwe
-}  // namespace testing
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_REMOTE_BITRATE_ESTIMATOR_TEST_BWE_TEST_H_
diff --git a/modules/remote_bitrate_estimator/test/bwe_test_baselinefile.cc b/modules/remote_bitrate_estimator/test/bwe_test_baselinefile.cc
deleted file mode 100644
index 94a3d5e..0000000
--- a/modules/remote_bitrate_estimator/test/bwe_test_baselinefile.cc
+++ /dev/null
@@ -1,168 +0,0 @@
-/*
- *  Copyright (c) 2013 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/remote_bitrate_estimator/test/bwe_test_baselinefile.h"
-
-#include <stdio.h>
-
-#include <algorithm>
-#include <memory>
-#include <vector>
-
-#include "webrtc/modules/remote_bitrate_estimator/test/bwe_test_fileutils.h"
-#include "webrtc/modules/remote_bitrate_estimator/test/bwe_test_logging.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/test/testsupport/fileutils.h"
-
-namespace webrtc {
-namespace testing {
-namespace bwe {
-
-// The format of BWE test baseline files is extremely simple:
-//   1. All read/written entities are 32-bit unsigned integers in network byte
-//      order (Big Endian).
-//   2. Files beging with a 2 word header containing a magic marker and file
-//      format version indicator. The Magic marker reads "BWE!" in a hex dump.
-//   3. Each estimate is logged as a pair of words: time in milliseconds and
-//      estimated bit rate, in bits per second.
-const uint32_t kMagicMarker = 0x42574521;
-const uint32_t kFileVersion1 = 0x00000001;
-const char kResourceSubDir[] = "remote_bitrate_estimator";
-
-class BaseLineFileVerify : public BaseLineFileInterface {
- public:
-  // If |allow_missing_file| is set, VerifyOrWrite() will return true even if
-  // the baseline file is missing. This is the default when verifying files, but
-  // not when updating (i.e. we always write it out if missing).
-  BaseLineFileVerify(const std::string& filepath, bool allow_missing_file)
-      : reader_(),
-        fail_to_read_response_(false) {
-    std::unique_ptr<ResourceFileReader> reader;
-    reader.reset(ResourceFileReader::Create(filepath, "bin"));
-    if (!reader.get()) {
-      printf("WARNING: Missing baseline file for BWE test: %s.bin\n",
-             filepath.c_str());
-      fail_to_read_response_ = allow_missing_file;
-    } else {
-      uint32_t magic_marker = 0;
-      uint32_t file_version = 0;
-      if (reader->Read(&magic_marker) && magic_marker == kMagicMarker &&
-          reader->Read(&file_version) && file_version == kFileVersion1) {
-        reader_.swap(reader);
-      } else {
-        printf("WARNING: Bad baseline file header for BWE test: %s.bin\n",
-               filepath.c_str());
-      }
-    }
-  }
-  virtual ~BaseLineFileVerify() {}
-
-  virtual void Estimate(int64_t time_ms, uint32_t estimate_bps) {
-    if (reader_.get()) {
-      uint32_t read_ms = 0;
-      uint32_t read_bps = 0;
-      if (reader_->Read(&read_ms) && read_ms == time_ms &&
-          reader_->Read(&read_bps) && read_bps == estimate_bps) {
-      } else {
-        printf("ERROR: Baseline differs starting at: %d ms (%d vs %d)!\n",
-            static_cast<uint32_t>(time_ms), estimate_bps, read_bps);
-        reader_.reset(NULL);
-      }
-    }
-  }
-
-  virtual bool VerifyOrWrite() {
-    if (reader_.get()) {
-      if (reader_->IsAtEnd()) {
-        return true;
-      } else {
-        printf("ERROR: Baseline file contains more data!\n");
-        return false;
-      }
-    }
-    return fail_to_read_response_;
-  }
-
- private:
-  std::unique_ptr<ResourceFileReader> reader_;
-  bool fail_to_read_response_;
-
-  RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(BaseLineFileVerify);
-};
-
-class BaseLineFileUpdate : public BaseLineFileInterface {
- public:
-  BaseLineFileUpdate(const std::string& filepath,
-                     BaseLineFileInterface* verifier)
-      : verifier_(verifier),
-        output_content_(),
-        filepath_(filepath) {
-    output_content_.push_back(kMagicMarker);
-    output_content_.push_back(kFileVersion1);
-  }
-  virtual ~BaseLineFileUpdate() {}
-
-  virtual void Estimate(int64_t time_ms, uint32_t estimate_bps) {
-    verifier_->Estimate(time_ms, estimate_bps);
-    output_content_.push_back(static_cast<uint32_t>(time_ms));
-    output_content_.push_back(estimate_bps);
-  }
-
-  virtual bool VerifyOrWrite() {
-    if (!verifier_->VerifyOrWrite()) {
-      std::string dir_path = webrtc::test::OutputPath() + kResourceSubDir;
-      if (!webrtc::test::CreateDir(dir_path)) {
-        printf("WARNING: Cannot create output dir: %s\n", dir_path.c_str());
-        return false;
-      }
-      std::unique_ptr<OutputFileWriter> writer;
-      writer.reset(OutputFileWriter::Create(filepath_, "bin"));
-      if (!writer.get()) {
-        printf("WARNING: Cannot create output file: %s.bin\n",
-            filepath_.c_str());
-        return false;
-      }
-      printf("NOTE: Writing baseline file for BWE test: %s.bin\n",
-             filepath_.c_str());
-      for (std::vector<uint32_t>::iterator it = output_content_.begin();
-          it != output_content_.end(); ++it) {
-        writer->Write(*it);
-      }
-      return true;
-    }
-    printf("NOTE: No change, not writing: %s\n", filepath_.c_str());
-    return true;
-  }
-
- private:
-  std::unique_ptr<BaseLineFileInterface> verifier_;
-  std::vector<uint32_t> output_content_;
-  std::string filepath_;
-
-  RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(BaseLineFileUpdate);
-};
-
-BaseLineFileInterface* BaseLineFileInterface::Create(
-    const std::string& filename, bool write_output_file) {
-  std::string filepath = filename;
-  std::replace(filepath.begin(), filepath.end(), '/', '_');
-  filepath = std::string(kResourceSubDir) + "/" + filepath;
-
-  std::unique_ptr<BaseLineFileInterface> result;
-  result.reset(new BaseLineFileVerify(filepath, !write_output_file));
-  if (write_output_file) {
-    // Takes ownership of the |verifier| instance.
-    result.reset(new BaseLineFileUpdate(filepath, result.release()));
-  }
-  return result.release();
-}
-}  // namespace bwe
-}  // namespace testing
-}  // namespace webrtc
diff --git a/modules/remote_bitrate_estimator/test/bwe_test_baselinefile.h b/modules/remote_bitrate_estimator/test/bwe_test_baselinefile.h
deleted file mode 100644
index b3df712..0000000
--- a/modules/remote_bitrate_estimator/test/bwe_test_baselinefile.h
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- *  Copyright (c) 2013 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_REMOTE_BITRATE_ESTIMATOR_TEST_BWE_TEST_BASELINEFILE_H_
-#define WEBRTC_MODULES_REMOTE_BITRATE_ESTIMATOR_TEST_BWE_TEST_BASELINEFILE_H_
-
-#include <string>
-#include "webrtc/modules/include/module_common_types.h"
-
-namespace webrtc {
-namespace testing {
-namespace bwe {
-
-class BaseLineFileInterface {
- public:
-  virtual ~BaseLineFileInterface() {}
-
-  // Compare, or log, one estimate against the baseline file.
-  virtual void Estimate(int64_t time_ms, uint32_t estimate_bps) = 0;
-
-  // Verify whether there are any differences between the logged estimates and
-  // those read from the baseline file. If updating the baseline file, write out
-  // new file if there were differences. Return true if logged estimates are
-  // identical, or if output file was updated successfully.
-  virtual bool VerifyOrWrite() = 0;
-
-  // Create an instance for either verifying estimates against a baseline file
-  // with name |filename|, living in the resources/ directory or, if the flag
-  // |write_updated_file| is set, write logged estimates to a file with the same
-  // name, living in the out/ directory.
-  static BaseLineFileInterface* Create(const std::string& filename,
-                                       bool write_updated_file);
-};
-}  // namespace bwe
-}  // namespace testing
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_REMOTE_BITRATE_ESTIMATOR_TEST_BWE_TEST_BASELINEFILE_H_
diff --git a/modules/remote_bitrate_estimator/test/bwe_test_fileutils.cc b/modules/remote_bitrate_estimator/test/bwe_test_fileutils.cc
deleted file mode 100644
index 5fe78a7..0000000
--- a/modules/remote_bitrate_estimator/test/bwe_test_fileutils.cc
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- *  Copyright (c) 2013 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/remote_bitrate_estimator/test/bwe_test_fileutils.h"
-
-#ifdef WIN32
-#include <Winsock2.h>
-#else
-#include <arpa/inet.h>
-#endif
-#include <assert.h>
-
-#include "webrtc/modules/remote_bitrate_estimator/test/bwe_test_logging.h"
-#include "webrtc/test/testsupport/fileutils.h"
-
-namespace webrtc {
-namespace testing {
-namespace bwe {
-
-ResourceFileReader::~ResourceFileReader() {
-  if (file_ != NULL) {
-    fclose(file_);
-    file_ = NULL;
-  }
-}
-
-bool ResourceFileReader::IsAtEnd() {
-  int32_t current_pos = ftell(file_);
-  fseek(file_, 0, SEEK_END);
-  int32_t end_pos = ftell(file_);
-  fseek(file_, current_pos, SEEK_SET);
-  return current_pos == end_pos;
-}
-
-bool ResourceFileReader::Read(uint32_t* out) {
-  assert(out);
-  uint32_t tmp = 0;
-  if (fread(&tmp, 1, sizeof(uint32_t), file_) != sizeof(uint32_t)) {
-    printf("Error reading!\n");
-    return false;
-  }
-  *out = ntohl(tmp);
-  return true;
-}
-
-ResourceFileReader* ResourceFileReader::Create(const std::string& filename,
-                                               const std::string& extension) {
-  std::string filepath = webrtc::test::ResourcePath(filename, extension);
-  FILE* file = fopen(filepath.c_str(), "rb");
-  if (file == NULL) {
-    BWE_TEST_LOGGING_CONTEXT("ResourceFileReader");
-    BWE_TEST_LOGGING_LOG1("Create", "Can't read file: %s", filepath.c_str());
-    return 0;
-  } else {
-    return new ResourceFileReader(file);
-  }
-}
-
-OutputFileWriter::~OutputFileWriter() {
-  if (file_ != NULL) {
-    fclose(file_);
-    file_ = NULL;
-  }
-}
-
-bool OutputFileWriter::Write(uint32_t value) {
-  uint32_t tmp = htonl(value);
-  if (fwrite(&tmp, 1, sizeof(uint32_t), file_) != sizeof(uint32_t)) {
-    return false;
-  }
-  return true;
-}
-
-OutputFileWriter* OutputFileWriter::Create(const std::string& filename,
-                                           const std::string& extension) {
-  std::string filepath = webrtc::test::OutputPath() + filename + "." +
-      extension;
-  FILE* file = fopen(filepath.c_str(), "wb");
-  if (file == NULL) {
-    BWE_TEST_LOGGING_CONTEXT("OutputFileWriter");
-    BWE_TEST_LOGGING_LOG1("Create", "Can't write file: %s", filepath.c_str());
-    return NULL;
-  } else {
-    return new OutputFileWriter(file);
-  }
-}
-}  // namespace bwe
-}  // namespace testing
-}  // namespace webrtc
diff --git a/modules/remote_bitrate_estimator/test/bwe_test_fileutils.h b/modules/remote_bitrate_estimator/test/bwe_test_fileutils.h
deleted file mode 100644
index 99bdcf9..0000000
--- a/modules/remote_bitrate_estimator/test/bwe_test_fileutils.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- *  Copyright (c) 2013 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_REMOTE_BITRATE_ESTIMATOR_TEST_BWE_TEST_FILEUTILS_H_
-#define WEBRTC_MODULES_REMOTE_BITRATE_ESTIMATOR_TEST_BWE_TEST_FILEUTILS_H_
-
-#include <stdio.h>
-
-#include <string>
-
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace webrtc {
-namespace testing {
-namespace bwe {
-
-class ResourceFileReader {
- public:
-  ~ResourceFileReader();
-
-  bool IsAtEnd();
-  bool Read(uint32_t* out);
-
-  static ResourceFileReader* Create(const std::string& filename,
-                                    const std::string& extension);
-
- private:
-  explicit ResourceFileReader(FILE* file) : file_(file) {}
-  FILE* file_;
-  RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(ResourceFileReader);
-};
-
-class OutputFileWriter {
- public:
-  ~OutputFileWriter();
-
-  bool Write(uint32_t value);
-
-  static OutputFileWriter* Create(const std::string& filename,
-                                  const std::string& extension);
-
- private:
-  explicit OutputFileWriter(FILE* file) : file_(file) {}
-  FILE* file_;
-  RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(OutputFileWriter);
-};
-}  // namespace bwe
-}  // namespace testing
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_REMOTE_BITRATE_ESTIMATOR_TEST_BWE_TEST_FILEUTILS_H_
diff --git a/modules/remote_bitrate_estimator/test/bwe_test_framework.cc b/modules/remote_bitrate_estimator/test/bwe_test_framework.cc
deleted file mode 100644
index 51c1f55..0000000
--- a/modules/remote_bitrate_estimator/test/bwe_test_framework.cc
+++ /dev/null
@@ -1,829 +0,0 @@
-/*
- *  Copyright (c) 2013 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/remote_bitrate_estimator/test/bwe_test_framework.h"
-
-#include <stdio.h>
-
-#include <sstream>
-
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/safe_minmax.h"
-
-namespace webrtc {
-namespace testing {
-namespace bwe {
-
-class DelayCapHelper {
- public:
-  // Max delay = 0 stands for +infinite.
-  DelayCapHelper() : max_delay_us_(0), delay_stats_() {}
-
-  void set_max_delay_ms(int64_t max_delay_ms) {
-    BWE_TEST_LOGGING_ENABLE(false);
-    BWE_TEST_LOGGING_LOG1("Max Delay", "%d ms", static_cast<int>(max_delay_ms));
-    assert(max_delay_ms >= 0);
-    max_delay_us_ = max_delay_ms * 1000;
-  }
-
-  bool ShouldSendPacket(int64_t send_time_us, int64_t arrival_time_us) {
-    int64_t packet_delay_us = send_time_us - arrival_time_us;
-    delay_stats_.Push((std::min(packet_delay_us, max_delay_us_) + 500) / 1000);
-    return (max_delay_us_ == 0 || max_delay_us_ >= packet_delay_us);
-  }
-
-  const Stats<double>& delay_stats() const {
-    return delay_stats_;
-  }
-
- private:
-  int64_t max_delay_us_;
-  Stats<double> delay_stats_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(DelayCapHelper);
-};
-
-const FlowIds CreateFlowIds(const int *flow_ids_array, size_t num_flow_ids) {
-  FlowIds flow_ids(&flow_ids_array[0], flow_ids_array + num_flow_ids);
-  return flow_ids;
-}
-
-const FlowIds CreateFlowIdRange(int initial_value, int last_value) {
-  int size = last_value - initial_value + 1;
-  assert(size > 0);
-  int* flow_ids_array = new int[size];
-  for (int i = initial_value; i <= last_value; ++i) {
-    flow_ids_array[i - initial_value] = i;
-  }
-  return CreateFlowIds(flow_ids_array, size);
-}
-
-void RateCounter::UpdateRates(int64_t send_time_us, uint32_t payload_size) {
-  ++recently_received_packets_;
-  recently_received_bytes_ += payload_size;
-  last_accumulated_us_ = send_time_us;
-  window_.push_back(std::make_pair(send_time_us, payload_size));
-  while (!window_.empty()) {
-    const TimeSizePair& packet = window_.front();
-    if (packet.first > (last_accumulated_us_ - window_size_us_)) {
-      break;
-    }
-    assert(recently_received_packets_ >= 1);
-    assert(recently_received_bytes_ >= packet.second);
-    --recently_received_packets_;
-    recently_received_bytes_ -= packet.second;
-    window_.pop_front();
-  }
-}
-
-uint32_t RateCounter::bits_per_second() const {
-  return (8 * recently_received_bytes_) / BitrateWindowS();
-}
-
-uint32_t RateCounter::packets_per_second() const {
-  return recently_received_packets_ / BitrateWindowS();
-}
-
-double RateCounter::BitrateWindowS() const {
-  return static_cast<double>(window_size_us_) / (1000 * 1000);
-}
-
-Packet::Packet()
-    : flow_id_(0),
-      creation_time_us_(-1),
-      send_time_us_(-1),
-      sender_timestamp_us_(-1),
-      payload_size_(0) {}
-
-Packet::Packet(int flow_id, int64_t send_time_us, size_t payload_size)
-    : flow_id_(flow_id),
-      creation_time_us_(send_time_us),
-      send_time_us_(send_time_us),
-      sender_timestamp_us_(send_time_us),
-      payload_size_(payload_size) {}
-
-Packet::~Packet() {
-}
-
-bool Packet::operator<(const Packet& rhs) const {
-  return send_time_us_ < rhs.send_time_us_;
-}
-
-void Packet::set_send_time_us(int64_t send_time_us) {
-  assert(send_time_us >= 0);
-  send_time_us_ = send_time_us;
-}
-
-MediaPacket::MediaPacket() {
-  memset(&header_, 0, sizeof(header_));
-}
-
-MediaPacket::MediaPacket(int flow_id,
-                         int64_t send_time_us,
-                         size_t payload_size,
-                         uint16_t sequence_number)
-    : Packet(flow_id, send_time_us, payload_size) {
-  header_ = RTPHeader();
-  header_.sequenceNumber = sequence_number;
-}
-
-MediaPacket::MediaPacket(int flow_id,
-                         int64_t send_time_us,
-                         size_t payload_size,
-                         const RTPHeader& header)
-    : Packet(flow_id, send_time_us, payload_size), header_(header) {
-}
-
-MediaPacket::MediaPacket(int64_t send_time_us, uint16_t sequence_number)
-    : Packet(0, send_time_us, 0) {
-  header_ = RTPHeader();
-  header_.sequenceNumber = sequence_number;
-}
-
-void MediaPacket::SetAbsSendTimeMs(int64_t abs_send_time_ms) {
-  header_.extension.hasAbsoluteSendTime = true;
-  header_.extension.absoluteSendTime = ((static_cast<int64_t>(abs_send_time_ms *
-    (1 << 18)) + 500) / 1000) & 0x00fffffful;
-}
-
-BbrBweFeedback::BbrBweFeedback(
-    int flow_id,
-    int64_t send_time_us,
-    int64_t latest_send_time_ms,
-    const std::vector<uint16_t>& packet_feedback_vector)
-    : FeedbackPacket(flow_id, send_time_us, latest_send_time_ms),
-      packet_feedback_vector_(packet_feedback_vector) {}
-
-RembFeedback::RembFeedback(int flow_id,
-                           int64_t send_time_us,
-                           int64_t last_send_time_ms,
-                           uint32_t estimated_bps,
-                           RTCPReportBlock report_block)
-    : FeedbackPacket(flow_id, send_time_us, last_send_time_ms),
-      estimated_bps_(estimated_bps),
-      report_block_(report_block) {
-}
-
-SendSideBweFeedback::SendSideBweFeedback(
-    int flow_id,
-    int64_t send_time_us,
-    int64_t last_send_time_ms,
-    const std::vector<PacketFeedback>& packet_feedback_vector)
-    : FeedbackPacket(flow_id, send_time_us, last_send_time_ms),
-      packet_feedback_vector_(packet_feedback_vector) {}
-
-bool IsTimeSorted(const Packets& packets) {
-  PacketsConstIt last_it = packets.begin();
-  for (PacketsConstIt it = last_it; it != packets.end(); ++it) {
-    if (it != last_it && **it < **last_it) {
-      return false;
-    }
-    last_it = it;
-  }
-  return true;
-}
-
-PacketProcessor::PacketProcessor(PacketProcessorListener* listener,
-                                 int flow_id,
-                                 ProcessorType type)
-    : listener_(listener), flow_ids_(&flow_id, &flow_id + 1) {
-  if (listener_) {
-    listener_->AddPacketProcessor(this, type);
-  }
-}
-
-PacketProcessor::PacketProcessor(PacketProcessorListener* listener,
-                                 const FlowIds& flow_ids,
-                                 ProcessorType type)
-    : listener_(listener), flow_ids_(flow_ids) {
-  if (listener_) {
-    listener_->AddPacketProcessor(this, type);
-  }
-}
-
-PacketProcessor::~PacketProcessor() {
-  if (listener_) {
-    listener_->RemovePacketProcessor(this);
-  }
-}
-
-uint32_t PacketProcessor::packets_per_second() const {
-  return rate_counter_.packets_per_second();
-}
-
-uint32_t PacketProcessor::bits_per_second() const {
-  return rate_counter_.bits_per_second();
-}
-
-RateCounterFilter::RateCounterFilter(PacketProcessorListener* listener,
-                                     int flow_id,
-                                     const char* name,
-                                     const std::string& algorithm_name)
-    : PacketProcessor(listener, flow_id, kRegular),
-      packets_per_second_stats_(),
-      kbps_stats_(),
-      start_plotting_time_ms_(0),
-      flow_id_(flow_id),
-      name_(name),
-      algorithm_name_(algorithm_name) {
-  // Only used when compiling with BWE test logging enabled.
-  RTC_UNUSED(flow_id_);
-}
-
-RateCounterFilter::RateCounterFilter(PacketProcessorListener* listener,
-                                     const FlowIds& flow_ids,
-                                     const char* name,
-                                     const std::string& algorithm_name)
-    : PacketProcessor(listener, flow_ids, kRegular),
-      packets_per_second_stats_(),
-      kbps_stats_(),
-      start_plotting_time_ms_(0),
-      name_(name),
-      algorithm_name_(algorithm_name) {
-  // TODO(terelius): Appending the flow IDs to the algorithm name is a hack to
-  // keep the current plot functionality without having to print the full
-  // context for each PLOT line. It is unclear whether multiple flow IDs are
-  // needed at all in the long term.
-  std::stringstream ss;
-  ss << algorithm_name_;
-  for (int flow_id : flow_ids) {
-    ss << ',' << flow_id;
-  }
-  algorithm_name_ = ss.str();
-}
-
-RateCounterFilter::RateCounterFilter(PacketProcessorListener* listener,
-                                     const FlowIds& flow_ids,
-                                     const char* name,
-                                     int64_t start_plotting_time_ms,
-                                     const std::string& algorithm_name)
-    : RateCounterFilter(listener, flow_ids, name, algorithm_name) {
-  start_plotting_time_ms_ = start_plotting_time_ms;
-}
-
-RateCounterFilter::~RateCounterFilter() {
-  LogStats();
-}
-
-
-void RateCounterFilter::LogStats() {
-  BWE_TEST_LOGGING_CONTEXT("RateCounterFilter");
-  packets_per_second_stats_.Log("pps");
-  kbps_stats_.Log("kbps");
-}
-
-Stats<double> RateCounterFilter::GetBitrateStats() const {
-  return kbps_stats_;
-}
-
-void RateCounterFilter::Plot(int64_t timestamp_ms) {
-  // TODO(stefan): Reorganize logging configuration to reduce amount
-  // of preprocessor conditionals in the code.
-  uint32_t plot_kbps = 0;
-  if (timestamp_ms >= start_plotting_time_ms_) {
-    plot_kbps = rate_counter_.bits_per_second() / 1000.0;
-  }
-  BWE_TEST_LOGGING_CONTEXT(name_.c_str());
-  if (algorithm_name_.empty()) {
-    BWE_TEST_LOGGING_PLOT_WITH_SSRC(0, "Throughput_kbps#1", timestamp_ms,
-                                    plot_kbps, flow_id_);
-  } else {
-    BWE_TEST_LOGGING_PLOT_WITH_NAME_AND_SSRC(0, "Throughput_kbps#1",
-                                             timestamp_ms, plot_kbps, flow_id_,
-                                             algorithm_name_);
-  }
-  RTC_UNUSED(plot_kbps);
-}
-
-void RateCounterFilter::RunFor(int64_t /*time_ms*/, Packets* in_out) {
-  assert(in_out);
-  for (const Packet* packet : *in_out) {
-    rate_counter_.UpdateRates(packet->send_time_us(),
-                              static_cast<int>(packet->payload_size()));
-  }
-  packets_per_second_stats_.Push(rate_counter_.packets_per_second());
-  kbps_stats_.Push(rate_counter_.bits_per_second() / 1000.0);
-}
-
-LossFilter::LossFilter(PacketProcessorListener* listener, int flow_id)
-    : PacketProcessor(listener, flow_id, kRegular),
-      random_(0x12345678),
-      loss_fraction_(0.0f) {
-}
-
-LossFilter::LossFilter(PacketProcessorListener* listener,
-                       const FlowIds& flow_ids)
-    : PacketProcessor(listener, flow_ids, kRegular),
-      random_(0x12345678),
-      loss_fraction_(0.0f) {
-}
-
-void LossFilter::SetLoss(float loss_percent) {
-  BWE_TEST_LOGGING_ENABLE(false);
-  BWE_TEST_LOGGING_LOG1("Loss", "%f%%", loss_percent);
-  assert(loss_percent >= 0.0f);
-  assert(loss_percent <= 100.0f);
-  loss_fraction_ = loss_percent * 0.01f;
-}
-
-void LossFilter::RunFor(int64_t /*time_ms*/, Packets* in_out) {
-  assert(in_out);
-  for (PacketsIt it = in_out->begin(); it != in_out->end(); ) {
-    if (random_.Rand<float>() < loss_fraction_) {
-      delete *it;
-      it = in_out->erase(it);
-    } else {
-      ++it;
-    }
-  }
-}
-
-const int64_t kDefaultOneWayDelayUs = 0;
-
-DelayFilter::DelayFilter(PacketProcessorListener* listener, int flow_id)
-    : PacketProcessor(listener, flow_id, kRegular),
-      one_way_delay_us_(kDefaultOneWayDelayUs),
-      last_send_time_us_(0) {
-}
-
-DelayFilter::DelayFilter(PacketProcessorListener* listener,
-                         const FlowIds& flow_ids)
-    : PacketProcessor(listener, flow_ids, kRegular),
-      one_way_delay_us_(kDefaultOneWayDelayUs),
-      last_send_time_us_(0) {
-}
-
-void DelayFilter::SetOneWayDelayMs(int64_t one_way_delay_ms) {
-  BWE_TEST_LOGGING_ENABLE(false);
-  BWE_TEST_LOGGING_LOG1("Delay", "%d ms", static_cast<int>(one_way_delay_ms));
-  assert(one_way_delay_ms >= 0);
-  one_way_delay_us_ = one_way_delay_ms * 1000;
-}
-
-void DelayFilter::RunFor(int64_t /*time_ms*/, Packets* in_out) {
-  assert(in_out);
-  for (Packet* packet : *in_out) {
-    int64_t new_send_time_us = packet->send_time_us() + one_way_delay_us_;
-    last_send_time_us_ = std::max(last_send_time_us_, new_send_time_us);
-    packet->set_send_time_us(last_send_time_us_);
-  }
-}
-
-JitterFilter::JitterFilter(PacketProcessorListener* listener, int flow_id)
-    : PacketProcessor(listener, flow_id, kRegular),
-      random_(0x89674523),
-      stddev_jitter_us_(0),
-      last_send_time_us_(0),
-      reordering_(false) {
-}
-
-JitterFilter::JitterFilter(PacketProcessorListener* listener,
-                           const FlowIds& flow_ids)
-    : PacketProcessor(listener, flow_ids, kRegular),
-      random_(0x89674523),
-      stddev_jitter_us_(0),
-      last_send_time_us_(0),
-      reordering_(false) {
-}
-
-const int kN = 3;  // Truncated N sigma gaussian.
-
-void JitterFilter::SetMaxJitter(int64_t max_jitter_ms) {
-  BWE_TEST_LOGGING_ENABLE(false);
-  BWE_TEST_LOGGING_LOG1("Max Jitter", "%d ms", static_cast<int>(max_jitter_ms));
-  assert(max_jitter_ms >= 0);
-  // Truncated gaussian, Max jitter = kN*sigma.
-  stddev_jitter_us_ = (max_jitter_ms * 1000 + kN / 2) / kN;
-}
-
-namespace {
-inline int64_t TruncatedNSigmaGaussian(Random* const random,
-                                       int64_t mean,
-                                       int64_t std_dev) {
-  const int64_t gaussian_random = random->Gaussian(mean, std_dev);
-  return rtc::SafeClamp(gaussian_random, -kN * std_dev, kN * std_dev);
-}
-}
-
-void JitterFilter::RunFor(int64_t /*time_ms*/, Packets* in_out) {
-  assert(in_out);
-  for (Packet* packet : *in_out) {
-    int64_t jitter_us =
-        std::abs(TruncatedNSigmaGaussian(&random_, 0, stddev_jitter_us_));
-    int64_t new_send_time_us = packet->send_time_us() + jitter_us;
-
-    if (!reordering_) {
-      new_send_time_us = std::max(last_send_time_us_, new_send_time_us);
-    }
-
-    // Receiver timestamp cannot be lower than sender timestamp.
-    assert(new_send_time_us >= packet->sender_timestamp_us());
-
-    packet->set_send_time_us(new_send_time_us);
-    last_send_time_us_ = new_send_time_us;
-  }
-}
-
-// Computes the expected value for a right sided (abs) truncated gaussian.
-// Does not take into account  possible reoerdering updates.
-int64_t JitterFilter::MeanUs() {
-  const double kPi = 3.1415926535897932;
-  double max_jitter_us = static_cast<double>(kN * stddev_jitter_us_);
-  double right_sided_mean_us =
-      static_cast<double>(stddev_jitter_us_) / sqrt(kPi / 2.0);
-  double truncated_mean_us =
-      right_sided_mean_us *
-          (1.0 - exp(-pow(static_cast<double>(kN), 2.0) / 2.0)) +
-      max_jitter_us * erfc(static_cast<double>(kN));
-  return static_cast<int64_t>(truncated_mean_us + 0.5);
-}
-
-ReorderFilter::ReorderFilter(PacketProcessorListener* listener, int flow_id)
-    : PacketProcessor(listener, flow_id, kRegular),
-      random_(0x27452389),
-      reorder_fraction_(0.0f) {
-}
-
-ReorderFilter::ReorderFilter(PacketProcessorListener* listener,
-                             const FlowIds& flow_ids)
-    : PacketProcessor(listener, flow_ids, kRegular),
-      random_(0x27452389),
-      reorder_fraction_(0.0f) {
-}
-
-void ReorderFilter::SetReorder(float reorder_percent) {
-  BWE_TEST_LOGGING_ENABLE(false);
-  BWE_TEST_LOGGING_LOG1("Reordering", "%f%%", reorder_percent);
-  assert(reorder_percent >= 0.0f);
-  assert(reorder_percent <= 100.0f);
-  reorder_fraction_ = reorder_percent * 0.01f;
-}
-
-void ReorderFilter::RunFor(int64_t /*time_ms*/, Packets* in_out) {
-  assert(in_out);
-  if (in_out->size() >= 2) {
-    PacketsIt last_it = in_out->begin();
-    PacketsIt it = last_it;
-    while (++it != in_out->end()) {
-      if (random_.Rand<float>() < reorder_fraction_) {
-        int64_t t1 = (*last_it)->send_time_us();
-        int64_t t2 = (*it)->send_time_us();
-        std::swap(*last_it, *it);
-        (*last_it)->set_send_time_us(t1);
-        (*it)->set_send_time_us(t2);
-      }
-      last_it = it;
-    }
-  }
-}
-
-const uint32_t kDefaultKbps = 1200;
-
-ChokeFilter::ChokeFilter(PacketProcessorListener* listener, int flow_id)
-    : PacketProcessor(listener, flow_id, kRegular),
-      capacity_kbps_(kDefaultKbps),
-      last_send_time_us_(0),
-      delay_cap_helper_(new DelayCapHelper()) {
-}
-
-ChokeFilter::ChokeFilter(PacketProcessorListener* listener,
-                         const FlowIds& flow_ids)
-    : PacketProcessor(listener, flow_ids, kRegular),
-      capacity_kbps_(kDefaultKbps),
-      last_send_time_us_(0),
-      delay_cap_helper_(new DelayCapHelper()) {
-}
-
-ChokeFilter::~ChokeFilter() {}
-
-void ChokeFilter::set_capacity_kbps(uint32_t kbps) {
-  BWE_TEST_LOGGING_ENABLE(false);
-  BWE_TEST_LOGGING_LOG1("BitrateChoke", "%d kbps", kbps);
-  capacity_kbps_ = kbps;
-}
-
-uint32_t ChokeFilter::capacity_kbps() {
-  return capacity_kbps_;
-}
-
-void ChokeFilter::RunFor(int64_t /*time_ms*/, Packets* in_out) {
-  assert(in_out);
-  for (PacketsIt it = in_out->begin(); it != in_out->end(); ) {
-    int64_t earliest_send_time_us =
-        std::max(last_send_time_us_, (*it)->send_time_us());
-    int64_t new_send_time_us =
-        earliest_send_time_us +
-        ((*it)->payload_size() * 8 * 1000 + capacity_kbps_ / 2) /
-            capacity_kbps_;
-    BWE_TEST_LOGGING_PLOT(0, "MaxThroughput_", new_send_time_us / 1000,
-                          capacity_kbps_);
-    if (delay_cap_helper_->ShouldSendPacket(new_send_time_us,
-                                            (*it)->send_time_us())) {
-      (*it)->set_send_time_us(new_send_time_us);
-      last_send_time_us_ = new_send_time_us;
-      ++it;
-    } else {
-      delete *it;
-      it = in_out->erase(it);
-    }
-  }
-}
-
-void ChokeFilter::set_max_delay_ms(int64_t max_delay_ms) {
-  delay_cap_helper_->set_max_delay_ms(max_delay_ms);
-}
-
-Stats<double> ChokeFilter::GetDelayStats() const {
-  return delay_cap_helper_->delay_stats();
-}
-
-TraceBasedDeliveryFilter::TraceBasedDeliveryFilter(
-    PacketProcessorListener* listener,
-    int flow_id)
-    : PacketProcessor(listener, flow_id, kRegular),
-      current_offset_us_(0),
-      delivery_times_us_(),
-      next_delivery_it_(),
-      local_time_us_(-1),
-      rate_counter_(new RateCounter),
-      name_(""),
-      delay_cap_helper_(new DelayCapHelper()),
-      packets_per_second_stats_(),
-      kbps_stats_() {
-}
-
-TraceBasedDeliveryFilter::TraceBasedDeliveryFilter(
-    PacketProcessorListener* listener,
-    const FlowIds& flow_ids)
-    : PacketProcessor(listener, flow_ids, kRegular),
-      current_offset_us_(0),
-      delivery_times_us_(),
-      next_delivery_it_(),
-      local_time_us_(-1),
-      rate_counter_(new RateCounter),
-      name_(""),
-      delay_cap_helper_(new DelayCapHelper()),
-      packets_per_second_stats_(),
-      kbps_stats_() {
-}
-
-TraceBasedDeliveryFilter::TraceBasedDeliveryFilter(
-    PacketProcessorListener* listener,
-    int flow_id,
-    const char* name)
-    : PacketProcessor(listener, flow_id, kRegular),
-      current_offset_us_(0),
-      delivery_times_us_(),
-      next_delivery_it_(),
-      local_time_us_(-1),
-      rate_counter_(new RateCounter),
-      name_(name),
-      delay_cap_helper_(new DelayCapHelper()),
-      packets_per_second_stats_(),
-      kbps_stats_() {
-}
-
-TraceBasedDeliveryFilter::~TraceBasedDeliveryFilter() {
-}
-
-bool TraceBasedDeliveryFilter::Init(const std::string& filename) {
-  FILE* trace_file = fopen(filename.c_str(), "r");
-  if (!trace_file) {
-    return false;
-  }
-  int64_t first_timestamp = -1;
-  while (!feof(trace_file)) {
-    const size_t kMaxLineLength = 100;
-    char line[kMaxLineLength];
-    if (fgets(line, kMaxLineLength, trace_file)) {
-      std::string line_string(line);
-      std::istringstream buffer(line_string);
-      int64_t timestamp;
-      buffer >> timestamp;
-      timestamp /= 1000;  // Convert to microseconds.
-      if (first_timestamp == -1)
-        first_timestamp = timestamp;
-      assert(delivery_times_us_.empty() ||
-             timestamp - first_timestamp - delivery_times_us_.back() >= 0);
-      delivery_times_us_.push_back(timestamp - first_timestamp);
-    }
-  }
-  assert(!delivery_times_us_.empty());
-  next_delivery_it_ = delivery_times_us_.begin();
-  fclose(trace_file);
-  return true;
-}
-
-void TraceBasedDeliveryFilter::Plot(int64_t timestamp_ms) {
-  BWE_TEST_LOGGING_CONTEXT(name_.c_str());
-  // This plots the max possible throughput of the trace-based delivery filter,
-  // which will be reached if a packet sent on every packet slot of the trace.
-  BWE_TEST_LOGGING_PLOT(0, "MaxThroughput_#1", timestamp_ms,
-                        rate_counter_->bits_per_second() / 1000.0);
-}
-
-void TraceBasedDeliveryFilter::RunFor(int64_t time_ms, Packets* in_out) {
-  assert(in_out);
-  for (PacketsIt it = in_out->begin(); it != in_out->end();) {
-    while (local_time_us_ < (*it)->send_time_us()) {
-      ProceedToNextSlot();
-    }
-    // Drop any packets that have been queued for too long.
-    while (!delay_cap_helper_->ShouldSendPacket(local_time_us_,
-                                                (*it)->send_time_us())) {
-      delete *it;
-      it = in_out->erase(it);
-      if (it == in_out->end()) {
-        return;
-      }
-    }
-    if (local_time_us_ >= (*it)->send_time_us()) {
-      (*it)->set_send_time_us(local_time_us_);
-      ProceedToNextSlot();
-    }
-    ++it;
-  }
-  packets_per_second_stats_.Push(rate_counter_->packets_per_second());
-  kbps_stats_.Push(rate_counter_->bits_per_second() / 1000.0);
-}
-
-void TraceBasedDeliveryFilter::set_max_delay_ms(int64_t max_delay_ms) {
-  delay_cap_helper_->set_max_delay_ms(max_delay_ms);
-}
-
-Stats<double> TraceBasedDeliveryFilter::GetDelayStats() const {
-  return delay_cap_helper_->delay_stats();
-}
-
-Stats<double> TraceBasedDeliveryFilter::GetBitrateStats() const {
-  return kbps_stats_;
-}
-
-void TraceBasedDeliveryFilter::ProceedToNextSlot() {
-  if (*next_delivery_it_ <= local_time_us_) {
-    ++next_delivery_it_;
-    if (next_delivery_it_ == delivery_times_us_.end()) {
-      // When the trace wraps we allow two packets to be sent back-to-back.
-      for (int64_t& delivery_time_us : delivery_times_us_) {
-        delivery_time_us += local_time_us_ - current_offset_us_;
-      }
-      current_offset_us_ += local_time_us_ - current_offset_us_;
-      next_delivery_it_ = delivery_times_us_.begin();
-    }
-  }
-  local_time_us_ = *next_delivery_it_;
-  const int kPayloadSize = 1200;
-  rate_counter_->UpdateRates(local_time_us_, kPayloadSize);
-}
-
-VideoSource::VideoSource(int flow_id,
-                         float fps,
-                         uint32_t kbps,
-                         uint32_t ssrc,
-                         int64_t first_frame_offset_ms)
-    : kMaxPayloadSizeBytes(1200),
-      kTimestampBase(0xff80ff00ul),
-      frame_period_ms_(1000.0 / fps),
-      bits_per_second_(1000 * kbps),
-      frame_size_bytes_(bits_per_second_ / 8 / fps),
-      random_(0x12345678),
-      flow_id_(flow_id),
-      next_frame_ms_(first_frame_offset_ms),
-      next_frame_rand_ms_(0),
-      now_ms_(0),
-      prototype_header_() {
-  memset(&prototype_header_, 0, sizeof(prototype_header_));
-  prototype_header_.ssrc = ssrc;
-  prototype_header_.sequenceNumber = 0xf000u;
-}
-
-uint32_t VideoSource::NextFrameSize() {
-  return frame_size_bytes_;
-}
-
-int64_t VideoSource::GetTimeUntilNextFrameMs() const {
-  return next_frame_ms_ + next_frame_rand_ms_ - now_ms_;
-}
-
-uint32_t VideoSource::NextPacketSize(uint32_t frame_size,
-                                     uint32_t remaining_payload) {
-  return std::min(kMaxPayloadSizeBytes, remaining_payload);
-}
-
-void VideoSource::RunFor(int64_t time_ms, Packets* in_out) {
-  assert(in_out);
-
-  now_ms_ += time_ms;
-  Packets new_packets;
-
-  while (now_ms_ >= next_frame_ms_) {
-    const int64_t kRandAmplitude = 2;
-    // A variance picked uniformly from {-1, 0, 1} ms is added to the frame
-    // timestamp.
-    next_frame_rand_ms_ = kRandAmplitude * (random_.Rand<float>() - 0.5);
-
-    // Ensure frame will not have a negative timestamp.
-    int64_t next_frame_ms =
-        std::max<int64_t>(next_frame_ms_ + next_frame_rand_ms_, 0);
-
-    prototype_header_.timestamp =
-        kTimestampBase + static_cast<uint32_t>(next_frame_ms * 90.0);
-    prototype_header_.extension.transmissionTimeOffset = 0;
-
-    // Generate new packets for this frame, all with the same timestamp,
-    // but the payload size is capped, so if the whole frame doesn't fit in
-    // one packet, we will see a number of equally sized packets followed by
-    // one smaller at the tail.
-
-    int64_t send_time_us = next_frame_ms * 1000.0;
-
-    uint32_t frame_size = NextFrameSize();
-    uint32_t payload_size = frame_size;
-
-    while (payload_size > 0) {
-      ++prototype_header_.sequenceNumber;
-      uint32_t size = NextPacketSize(frame_size, payload_size);
-      MediaPacket* new_packet =
-          new MediaPacket(flow_id_, send_time_us, size, prototype_header_);
-      new_packets.push_back(new_packet);
-      new_packet->SetAbsSendTimeMs(next_frame_ms);
-      new_packet->set_sender_timestamp_us(send_time_us);
-      payload_size -= size;
-    }
-
-    next_frame_ms_ += frame_period_ms_;
-  }
-
-  in_out->merge(new_packets, DereferencingComparator<Packet>);
-}
-
-AdaptiveVideoSource::AdaptiveVideoSource(int flow_id,
-                                         float fps,
-                                         uint32_t kbps,
-                                         uint32_t ssrc,
-                                         int64_t first_frame_offset_ms)
-    : VideoSource(flow_id, fps, kbps, ssrc, first_frame_offset_ms) {
-}
-
-void AdaptiveVideoSource::SetBitrateBps(int bitrate_bps) {
-  bits_per_second_ = bitrate_bps;
-  frame_size_bytes_ = (bits_per_second_ / 8 * frame_period_ms_ + 500) / 1000;
-}
-
-PeriodicKeyFrameSource::PeriodicKeyFrameSource(int flow_id,
-                                               float fps,
-                                               uint32_t kbps,
-                                               uint32_t ssrc,
-                                               int64_t first_frame_offset_ms,
-                                               int key_frame_interval)
-    : AdaptiveVideoSource(flow_id, fps, kbps, ssrc, first_frame_offset_ms),
-      key_frame_interval_(key_frame_interval),
-      frame_counter_(0),
-      compensation_bytes_(0),
-      compensation_per_frame_(0) {
-}
-
-uint32_t PeriodicKeyFrameSource::NextFrameSize() {
-  uint32_t payload_size = frame_size_bytes_;
-  if (frame_counter_ == 0) {
-    payload_size = kMaxPayloadSizeBytes * 12;
-    compensation_bytes_ = 4 * frame_size_bytes_;
-    compensation_per_frame_ = compensation_bytes_ / 30;
-  } else if (key_frame_interval_ > 0 &&
-             (frame_counter_ % key_frame_interval_ == 0)) {
-    payload_size *= 5;
-    compensation_bytes_ = payload_size - frame_size_bytes_;
-    compensation_per_frame_ = compensation_bytes_ / 30;
-  } else if (compensation_bytes_ > 0) {
-    if (compensation_per_frame_ > static_cast<int>(payload_size)) {
-      // Skip this frame.
-      compensation_bytes_ -= payload_size;
-      payload_size = 0;
-    } else {
-      payload_size -= compensation_per_frame_;
-      compensation_bytes_ -= compensation_per_frame_;
-    }
-  }
-  if (compensation_bytes_ < 0)
-    compensation_bytes_ = 0;
-  ++frame_counter_;
-  return payload_size;
-}
-
-uint32_t PeriodicKeyFrameSource::NextPacketSize(uint32_t frame_size,
-                                                uint32_t remaining_payload) {
-  uint32_t fragments =
-      (frame_size + (kMaxPayloadSizeBytes - 1)) / kMaxPayloadSizeBytes;
-  uint32_t avg_size = (frame_size + fragments - 1) / fragments;
-  return std::min(avg_size, remaining_payload);
-}
-}  // namespace bwe
-}  // namespace testing
-}  // namespace webrtc
diff --git a/modules/remote_bitrate_estimator/test/bwe_test_framework.h b/modules/remote_bitrate_estimator/test/bwe_test_framework.h
deleted file mode 100644
index 08b0a72..0000000
--- a/modules/remote_bitrate_estimator/test/bwe_test_framework.h
+++ /dev/null
@@ -1,473 +0,0 @@
-/*
- *  Copyright (c) 2013 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_REMOTE_BITRATE_ESTIMATOR_TEST_BWE_TEST_FRAMEWORK_H_
-#define WEBRTC_MODULES_REMOTE_BITRATE_ESTIMATOR_TEST_BWE_TEST_FRAMEWORK_H_
-
-#include <assert.h>
-#include <math.h>
-
-#include <algorithm>
-#include <list>
-#include <memory>
-#include <numeric>
-#include <set>
-#include <sstream>
-#include <string>
-#include <utility>
-#include <vector>
-
-#include "webrtc/modules/bitrate_controller/include/bitrate_controller.h"
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/modules/pacing/paced_sender.h"
-#include "webrtc/modules/remote_bitrate_estimator/include/remote_bitrate_estimator.h"
-#include "webrtc/modules/remote_bitrate_estimator/test/bwe_test_logging.h"
-#include "webrtc/modules/remote_bitrate_estimator/test/packet.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/random.h"
-#include "webrtc/system_wrappers/include/clock.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-class RtcpBandwidthObserver;
-
-namespace testing {
-namespace bwe {
-
-class DelayCapHelper;
-
-class RateCounter {
- public:
-  explicit RateCounter(int64_t window_size_ms)
-      : window_size_us_(1000 * window_size_ms),
-        recently_received_packets_(0),
-        recently_received_bytes_(0),
-        last_accumulated_us_(0),
-        window_() {}
-
-  RateCounter() : RateCounter(1000) {}
-
-  void UpdateRates(int64_t send_time_us, uint32_t payload_size);
-
-  int64_t window_size_ms() const { return (window_size_us_ + 500) / 1000; }
-  uint32_t packets_per_second() const;
-  uint32_t bits_per_second() const;
-
-  double BitrateWindowS() const;
-
- private:
-  typedef std::pair<int64_t, uint32_t> TimeSizePair;
-
-  int64_t window_size_us_;
-  uint32_t recently_received_packets_;
-  uint32_t recently_received_bytes_;
-  int64_t last_accumulated_us_;
-  std::list<TimeSizePair> window_;
-};
-
-typedef std::set<int> FlowIds;
-const FlowIds CreateFlowIds(const int *flow_ids_array, size_t num_flow_ids);
-const FlowIds CreateFlowIdRange(int initial_value, int last_value);
-
-template <typename T>
-bool DereferencingComparator(const T* const& a, const T* const& b) {
-  assert(a != NULL);
-  assert(b != NULL);
-  return *a < *b;
-}
-
-template<typename T> class Stats {
- public:
-  Stats()
-      : data_(),
-        last_mean_count_(0),
-        last_variance_count_(0),
-        last_minmax_count_(0),
-        mean_(0),
-        variance_(0),
-        min_(0),
-        max_(0) {
-  }
-
-  void Push(T data_point) {
-    data_.push_back(data_point);
-  }
-
-  T GetMean() {
-    if (last_mean_count_ != data_.size()) {
-      last_mean_count_ = data_.size();
-      mean_ = std::accumulate(data_.begin(), data_.end(), static_cast<T>(0));
-      assert(last_mean_count_ != 0);
-      mean_ /= static_cast<T>(last_mean_count_);
-    }
-    return mean_;
-  }
-  T GetVariance() {
-    if (last_variance_count_ != data_.size()) {
-      last_variance_count_ = data_.size();
-      T mean = GetMean();
-      variance_ = 0;
-      for (const auto& sample : data_) {
-        T diff = (sample - mean);
-        variance_ += diff * diff;
-      }
-      assert(last_variance_count_ != 0);
-      variance_ /= static_cast<T>(last_variance_count_);
-    }
-    return variance_;
-  }
-  T GetStdDev() {
-    return sqrt(static_cast<double>(GetVariance()));
-  }
-  T GetMin() {
-    RefreshMinMax();
-    return min_;
-  }
-  T GetMax() {
-    RefreshMinMax();
-    return max_;
-  }
-
-  std::string AsString() {
-    std::stringstream ss;
-    ss << (GetMean() >= 0 ? GetMean() : -1) << ", " <<
-        (GetStdDev() >= 0 ? GetStdDev() : -1);
-    return ss.str();
-  }
-
-  void Log(const std::string& units) {
-    BWE_TEST_LOGGING_LOG5("", "%f %s\t+/-%f\t[%f,%f]",
-        GetMean(), units.c_str(), GetStdDev(), GetMin(), GetMax());
-  }
-
- private:
-  void RefreshMinMax() {
-    if (last_minmax_count_ != data_.size()) {
-      last_minmax_count_ = data_.size();
-      min_ = max_ = 0;
-      if (data_.empty()) {
-        return;
-      }
-      typename std::vector<T>::const_iterator it = data_.begin();
-      min_ = max_ = *it;
-      while (++it != data_.end()) {
-        min_ = std::min(min_, *it);
-        max_ = std::max(max_, *it);
-      }
-    }
-  }
-
-  std::vector<T> data_;
-  typename std::vector<T>::size_type last_mean_count_;
-  typename std::vector<T>::size_type last_variance_count_;
-  typename std::vector<T>::size_type last_minmax_count_;
-  T mean_;
-  T variance_;
-  T min_;
-  T max_;
-};
-
-bool IsTimeSorted(const Packets& packets);
-
-class PacketProcessor;
-
-enum ProcessorType { kSender, kReceiver, kRegular };
-
-class PacketProcessorListener {
- public:
-  virtual ~PacketProcessorListener() {}
-
-  virtual void AddPacketProcessor(PacketProcessor* processor,
-                                  ProcessorType type) = 0;
-  virtual void RemovePacketProcessor(PacketProcessor* processor) = 0;
-};
-
-class PacketProcessor {
- public:
-  PacketProcessor(PacketProcessorListener* listener,
-                  int flow_id,
-                  ProcessorType type);
-  PacketProcessor(PacketProcessorListener* listener,
-                  const FlowIds& flow_ids,
-                  ProcessorType type);
-  virtual ~PacketProcessor();
-
-  // Called after each simulation batch to allow the processor to plot any
-  // internal data.
-  virtual void Plot(int64_t timestamp_ms) {}
-
-  // Run simulation for |time_ms| milliseconds, consuming packets from, and
-  // producing packets into in_out. The outgoing packet list must be sorted on
-  // |send_time_us_|. The simulation time |time_ms| is optional to use.
-  virtual void RunFor(int64_t time_ms, Packets* in_out) = 0;
-
-  const FlowIds& flow_ids() const { return flow_ids_; }
-
-  uint32_t packets_per_second() const;
-  uint32_t bits_per_second() const;
-
- protected:
-  RateCounter rate_counter_;
-
- private:
-  PacketProcessorListener* listener_;
-  const FlowIds flow_ids_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(PacketProcessor);
-};
-
-class RateCounterFilter : public PacketProcessor {
- public:
-  RateCounterFilter(PacketProcessorListener* listener,
-                    int flow_id,
-                    const char* name,
-                    const std::string& algorithm_name);
-  RateCounterFilter(PacketProcessorListener* listener,
-                    const FlowIds& flow_ids,
-                    const char* name,
-                    const std::string& algorithm_name);
-  RateCounterFilter(PacketProcessorListener* listener,
-                    const FlowIds& flow_ids,
-                    const char* name,
-                    int64_t start_plotting_time_ms,
-                    const std::string& algorithm_name);
-  virtual ~RateCounterFilter();
-
-  void LogStats();
-  Stats<double> GetBitrateStats() const;
-  virtual void Plot(int64_t timestamp_ms);
-  virtual void RunFor(int64_t time_ms, Packets* in_out);
-
- private:
-  Stats<double> packets_per_second_stats_;
-  Stats<double> kbps_stats_;
-  int64_t start_plotting_time_ms_;
-  int flow_id_ = 0;
-  std::string name_;
-  // Algorithm name if single flow, Total link utilization if all flows.
-  std::string algorithm_name_;
-
-  RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(RateCounterFilter);
-};
-
-class LossFilter : public PacketProcessor {
- public:
-  LossFilter(PacketProcessorListener* listener, int flow_id);
-  LossFilter(PacketProcessorListener* listener, const FlowIds& flow_ids);
-  virtual ~LossFilter() {}
-
-  void SetLoss(float loss_percent);
-  virtual void RunFor(int64_t time_ms, Packets* in_out);
-
- private:
-  Random random_;
-  float loss_fraction_;
-
-  RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(LossFilter);
-};
-
-class DelayFilter : public PacketProcessor {
- public:
-  DelayFilter(PacketProcessorListener* listener, int flow_id);
-  DelayFilter(PacketProcessorListener* listener, const FlowIds& flow_ids);
-  virtual ~DelayFilter() {}
-
-  void SetOneWayDelayMs(int64_t one_way_delay_ms);
-  virtual void RunFor(int64_t time_ms, Packets* in_out);
-
- private:
-  int64_t one_way_delay_us_;
-  int64_t last_send_time_us_;
-
-  RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(DelayFilter);
-};
-
-class JitterFilter : public PacketProcessor {
- public:
-  JitterFilter(PacketProcessorListener* listener, int flow_id);
-  JitterFilter(PacketProcessorListener* listener, const FlowIds& flow_ids);
-  virtual ~JitterFilter() {}
-
-  void SetMaxJitter(int64_t stddev_jitter_ms);
-  virtual void RunFor(int64_t time_ms, Packets* in_out);
-  void set_reorderdering(bool reordering) { reordering_ = reordering; }
-  int64_t MeanUs();
-
- private:
-  Random random_;
-  int64_t stddev_jitter_us_;
-  int64_t last_send_time_us_;
-  bool reordering_;  // False by default.
-
-  RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(JitterFilter);
-};
-
-// Reorders two consecutive packets with a probability of reorder_percent.
-class ReorderFilter : public PacketProcessor {
- public:
-  ReorderFilter(PacketProcessorListener* listener, int flow_id);
-  ReorderFilter(PacketProcessorListener* listener, const FlowIds& flow_ids);
-  virtual ~ReorderFilter() {}
-
-  void SetReorder(float reorder_percent);
-  virtual void RunFor(int64_t time_ms, Packets* in_out);
-
- private:
-  Random random_;
-  float reorder_fraction_;
-
-  RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(ReorderFilter);
-};
-
-// Apply a bitrate choke with an infinite queue on the packet stream.
-class ChokeFilter : public PacketProcessor {
- public:
-  ChokeFilter(PacketProcessorListener* listener, int flow_id);
-  ChokeFilter(PacketProcessorListener* listener, const FlowIds& flow_ids);
-  virtual ~ChokeFilter();
-
-  void set_capacity_kbps(uint32_t kbps);
-  void set_max_delay_ms(int64_t max_queueing_delay_ms);
-
-  uint32_t capacity_kbps();
-
-  virtual void RunFor(int64_t time_ms, Packets* in_out);
-
-  Stats<double> GetDelayStats() const;
-
- private:
-  uint32_t capacity_kbps_;
-  int64_t last_send_time_us_;
-  std::unique_ptr<DelayCapHelper> delay_cap_helper_;
-
-  RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(ChokeFilter);
-};
-
-class TraceBasedDeliveryFilter : public PacketProcessor {
- public:
-  TraceBasedDeliveryFilter(PacketProcessorListener* listener, int flow_id);
-  TraceBasedDeliveryFilter(PacketProcessorListener* listener,
-                           const FlowIds& flow_ids);
-  TraceBasedDeliveryFilter(PacketProcessorListener* listener,
-                           int flow_id,
-                           const char* name);
-  virtual ~TraceBasedDeliveryFilter();
-
-  // The file should contain nanosecond timestamps corresponding to the time
-  // when the network can accept another packet. The timestamps should be
-  // separated by new lines, e.g., "100000000\n125000000\n321000000\n..."
-  bool Init(const std::string& filename);
-  virtual void Plot(int64_t timestamp_ms);
-  virtual void RunFor(int64_t time_ms, Packets* in_out);
-
-  void set_max_delay_ms(int64_t max_delay_ms);
-  Stats<double> GetDelayStats() const;
-  Stats<double> GetBitrateStats() const;
-
- private:
-  void ProceedToNextSlot();
-
-  typedef std::vector<int64_t> TimeList;
-  int64_t current_offset_us_;
-  TimeList delivery_times_us_;
-  TimeList::const_iterator next_delivery_it_;
-  int64_t local_time_us_;
-  std::unique_ptr<RateCounter> rate_counter_;
-  std::string name_;
-  std::unique_ptr<DelayCapHelper> delay_cap_helper_;
-  Stats<double> packets_per_second_stats_;
-  Stats<double> kbps_stats_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(TraceBasedDeliveryFilter);
-};
-
-class VideoSource {
- public:
-  VideoSource(int flow_id,
-              float fps,
-              uint32_t kbps,
-              uint32_t ssrc,
-              int64_t first_frame_offset_ms);
-  virtual ~VideoSource() {}
-
-  virtual void RunFor(int64_t time_ms, Packets* in_out);
-
-  virtual int flow_id() const { return flow_id_; }
-  virtual void SetBitrateBps(int bitrate_bps) {}
-  uint32_t bits_per_second() const { return bits_per_second_; }
-  uint32_t max_payload_size_bytes() const { return kMaxPayloadSizeBytes; }
-  int64_t GetTimeUntilNextFrameMs() const;
-
- protected:
-  virtual uint32_t NextFrameSize();
-  virtual uint32_t NextPacketSize(uint32_t frame_size,
-                                  uint32_t remaining_payload);
-
-  const uint32_t kMaxPayloadSizeBytes;
-  const uint32_t kTimestampBase;
-  const double frame_period_ms_;
-  uint32_t bits_per_second_;
-  uint32_t frame_size_bytes_;
-
- private:
-  Random random_;
-  const int flow_id_;
-  int64_t next_frame_ms_;
-  int64_t next_frame_rand_ms_;
-  int64_t now_ms_;
-  RTPHeader prototype_header_;
-
-  RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(VideoSource);
-};
-
-class AdaptiveVideoSource : public VideoSource {
- public:
-  AdaptiveVideoSource(int flow_id,
-                      float fps,
-                      uint32_t kbps,
-                      uint32_t ssrc,
-                      int64_t first_frame_offset_ms);
-  virtual ~AdaptiveVideoSource() {}
-
-  void SetBitrateBps(int bitrate_bps) override;
-
- private:
-  RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(AdaptiveVideoSource);
-};
-
-class PeriodicKeyFrameSource : public AdaptiveVideoSource {
- public:
-  PeriodicKeyFrameSource(int flow_id,
-                         float fps,
-                         uint32_t kbps,
-                         uint32_t ssrc,
-                         int64_t first_frame_offset_ms,
-                         int key_frame_interval);
-  virtual ~PeriodicKeyFrameSource() {}
-
- protected:
-  uint32_t NextFrameSize() override;
-  uint32_t NextPacketSize(uint32_t frame_size,
-                          uint32_t remaining_payload) override;
-
- private:
-  int key_frame_interval_;
-  uint32_t frame_counter_;
-  int compensation_bytes_;
-  int compensation_per_frame_;
-  RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(PeriodicKeyFrameSource);
-};
-}  // namespace bwe
-}  // namespace testing
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_REMOTE_BITRATE_ESTIMATOR_TEST_BWE_TEST_FRAMEWORK_H_
diff --git a/modules/remote_bitrate_estimator/test/bwe_test_framework_unittest.cc b/modules/remote_bitrate_estimator/test/bwe_test_framework_unittest.cc
deleted file mode 100644
index 775756e..0000000
--- a/modules/remote_bitrate_estimator/test/bwe_test_framework_unittest.cc
+++ /dev/null
@@ -1,975 +0,0 @@
-/*
- *  Copyright (c) 2013 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/remote_bitrate_estimator/test/bwe_test_framework.h"
-
-#include <numeric>
-
-#include "webrtc/modules/remote_bitrate_estimator/test/packet.h"
-#include "webrtc/modules/remote_bitrate_estimator/test/packet_sender.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/testsupport/fileutils.h"
-
-namespace webrtc {
-namespace testing {
-namespace bwe {
-
-static bool IsSequenceNumberSorted(const Packets& packets) {
-  PacketsConstIt last_it = packets.begin();
-  for (PacketsConstIt it = last_it; it != packets.end(); ++it) {
-    const MediaPacket* packet = static_cast<const MediaPacket*>(*it);
-    const MediaPacket* last_packet = static_cast<const MediaPacket*>(*last_it);
-    if (IsNewerSequenceNumber(last_packet->header().sequenceNumber,
-                              packet->header().sequenceNumber)) {
-      return false;
-    }
-    last_it = it;
-  }
-  return true;
-}
-
-TEST(BweTestFramework_PacketTest, IsTimeSorted) {
-  Packets packets;
-  // Insert some packets in order...
-  EXPECT_TRUE(IsTimeSorted(packets));
-
-  packets.push_back(new MediaPacket(100, 0));
-  EXPECT_TRUE(IsTimeSorted(packets));
-
-  packets.push_back(new MediaPacket(110, 0));
-  EXPECT_TRUE(IsTimeSorted(packets));
-
-  // ...and one out-of-order...
-  packets.push_back(new MediaPacket(100, 0));
-  EXPECT_FALSE(IsTimeSorted(packets));
-
-  // ...remove the out-of-order packet, insert another in-order packet.
-  delete packets.back();
-  packets.pop_back();
-  packets.push_back(new MediaPacket(120, 0));
-  EXPECT_TRUE(IsTimeSorted(packets));
-
-  for (auto* packet : packets)
-    delete packet;
-}
-
-TEST(BweTestFramework_PacketTest, IsSequenceNumberSorted) {
-  Packets packets;
-  // Insert some packets in order...
-  EXPECT_TRUE(IsSequenceNumberSorted(packets));
-
-  packets.push_back(new MediaPacket(0, 100));
-  EXPECT_TRUE(IsSequenceNumberSorted(packets));
-
-  packets.push_back(new MediaPacket(0, 110));
-  EXPECT_TRUE(IsSequenceNumberSorted(packets));
-
-  // ...and one out-of-order...
-  packets.push_back(new MediaPacket(0, 100));
-  EXPECT_FALSE(IsSequenceNumberSorted(packets));
-
-  // ...remove the out-of-order packet, insert another in-order packet.
-  delete packets.back();
-  packets.pop_back();
-  packets.push_back(new MediaPacket(0, 120));
-  EXPECT_TRUE(IsSequenceNumberSorted(packets));
-
-  for (auto* packet : packets)
-    delete packet;
-}
-
-TEST(BweTestFramework_StatsTest, Mean) {
-  Stats<int32_t> stats;
-  EXPECT_EQ(0, stats.GetMean());
-
-  stats.Push(1);
-  stats.Push(3);
-  EXPECT_EQ(2, stats.GetMean());
-
-  // Integer division rounds (1+3-3)/3 to 0.
-  stats.Push(-3);
-  EXPECT_EQ(0, stats.GetMean());
-}
-
-TEST(BweTestFramework_StatsTest, Variance) {
-  Stats<int32_t> stats;
-  EXPECT_EQ(0, stats.GetVariance());
-
-  // Mean is 2 ; ((1-2)*(1-2)+(3-2)*(3-2))/2 = (1+1)/2 = 1
-  stats.Push(1);
-  stats.Push(3);
-  EXPECT_EQ(1, stats.GetVariance());
-
-  // Integer division rounds 26/3 to 8
-  // Mean is 0 ; (1*1+3*3+(-4)*(-4))/3 = (1+9+16)/3 = 8
-  stats.Push(-4);
-  EXPECT_EQ(8, stats.GetVariance());
-}
-
-TEST(BweTestFramework_StatsTest, StdDev) {
-  Stats<int32_t> stats;
-  EXPECT_EQ(0, stats.GetStdDev());
-
-  // Variance is 1 ; sqrt(1) = 1
-  stats.Push(1);
-  stats.Push(3);
-  EXPECT_EQ(1, stats.GetStdDev());
-
-  // Variance is 8 ; sqrt(8) = 2 with integers.
-  stats.Push(-4);
-  EXPECT_EQ(2, stats.GetStdDev());
-}
-
-TEST(BweTestFramework_StatsTest, MinMax) {
-  Stats<int32_t> stats;
-  EXPECT_EQ(0, stats.GetMin());
-  EXPECT_EQ(0, stats.GetMax());
-
-  stats.Push(1);
-  EXPECT_EQ(1, stats.GetMin());
-  EXPECT_EQ(1, stats.GetMax());
-
-  stats.Push(3);
-  EXPECT_EQ(1, stats.GetMin());
-  EXPECT_EQ(3, stats.GetMax());
-
-  stats.Push(-4);
-  EXPECT_EQ(-4, stats.GetMin());
-  EXPECT_EQ(3, stats.GetMax());
-}
-
-class BweTestFramework_RateCounterFilterTest : public ::testing::Test {
- public:
-  BweTestFramework_RateCounterFilterTest()
-      : filter_(NULL, 0, "", ""), now_ms_(0) {}
-  virtual ~BweTestFramework_RateCounterFilterTest() {}
-
- protected:
-  void TestRateCounter(int64_t run_for_ms, uint32_t payload_bits,
-                       uint32_t expected_pps, uint32_t expected_bps) {
-    Packets packets;
-    RTPHeader header;
-    // "Send" a packet every 10 ms.
-    for (int64_t i = 0; i < run_for_ms; i += 10, now_ms_ += 10) {
-      packets.push_back(
-          new MediaPacket(0, now_ms_ * 1000, payload_bits / 8, header));
-    }
-    filter_.RunFor(run_for_ms, &packets);
-    ASSERT_TRUE(IsTimeSorted(packets));
-    EXPECT_EQ(expected_pps, filter_.packets_per_second());
-    EXPECT_EQ(expected_bps, filter_.bits_per_second());
-
-    for (auto* packet : packets)
-      delete packet;
-  }
-
- private:
-  RateCounterFilter filter_;
-  int64_t now_ms_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(BweTestFramework_RateCounterFilterTest);
-};
-
-TEST_F(BweTestFramework_RateCounterFilterTest, Short) {
-  // 100ms, 100 bytes per packet, should result in 10 pps and 8 kbps. We're
-  // generating one packet every 10 ms ; 10 * 800 = 8k
-  TestRateCounter(100, 800, 10, 8000);
-}
-
-TEST_F(BweTestFramework_RateCounterFilterTest, Medium) {
-  // 100ms, like above.
-  TestRateCounter(100, 800, 10, 8000);
-  // 1000ms, 100 bpp, should result in 100 pps and 80 kbps. We're still
-  // generating packets every 10 ms.
-  TestRateCounter(900, 800, 100, 80000);
-}
-
-TEST_F(BweTestFramework_RateCounterFilterTest, Long) {
-  // 100ms, 1000ms, like above.
-  TestRateCounter(100, 800, 10, 8000);
-  TestRateCounter(900, 800, 100, 80000);
-  // 2000ms, should only see rate of last second, so 100 pps, and 40 kbps now.
-  TestRateCounter(1000, 400, 100, 40000);
-  // 2500ms, half a second with zero payload size. We should get same pps as
-  // before, but kbps should drop to half of previous rate.
-  TestRateCounter(500, 0, 100, 20000);
-  // Another half second with zero payload size. Now the kbps rate should drop
-  // to zero.
-  TestRateCounter(500, 0, 100, 0);
-  // Increate payload size again. 200 * 100 * 0.5 = 10 kbps.
-  TestRateCounter(500, 200, 100, 10000);
-}
-
-static void TestLossFilter(float loss_percent, bool zero_tolerance) {
-  LossFilter filter(NULL, 0);
-  filter.SetLoss(loss_percent);
-  Packets::size_type sent_packets = 0;
-  Packets::size_type remaining_packets = 0;
-
-  // No input should yield no output
-  {
-    Packets packets;
-    sent_packets += packets.size();
-    filter.RunFor(0, &packets);
-    ASSERT_TRUE(IsTimeSorted(packets));
-    ASSERT_TRUE(IsSequenceNumberSorted(packets));
-    remaining_packets += packets.size();
-    EXPECT_EQ(0u, sent_packets);
-    EXPECT_EQ(0u, remaining_packets);
-    for (auto* packet : packets)
-      delete packet;
-  }
-
-  // Generate and process 10000 packets in different batch sizes (some empty)
-  for (int i = 0; i < 2225; ++i) {
-    Packets packets;
-    for (int j = 0; j < i % 10; ++j)
-      packets.push_back(new MediaPacket(i, i));
-    sent_packets += packets.size();
-    filter.RunFor(0, &packets);
-    ASSERT_TRUE(IsTimeSorted(packets));
-    ASSERT_TRUE(IsSequenceNumberSorted(packets));
-    remaining_packets += packets.size();
-    for (auto* packet : packets)
-      delete packet;
-  }
-
-  float loss_fraction = 0.01f * (100.0f - loss_percent);
-  Packets::size_type expected_packets = loss_fraction * sent_packets;
-  if (zero_tolerance) {
-    EXPECT_EQ(expected_packets, remaining_packets);
-  } else {
-    // Require within 1% of expected
-    EXPECT_NEAR(expected_packets, remaining_packets, 100);
-  }
-}
-
-TEST(BweTestFramework_LossFilterTest, Loss0) {
-  // With 0% loss, the result should be exact (no loss).
-  TestLossFilter(0.0f, true);
-}
-
-TEST(BweTestFramework_LossFilterTest, Loss10) {
-  TestLossFilter(10.0f, false);
-}
-
-TEST(BweTestFramework_LossFilterTest, Loss50) {
-  TestLossFilter(50.0f, false);
-}
-
-TEST(BweTestFramework_LossFilterTest, Loss100) {
-  // With 100% loss, the result should be exact (no packets out).
-  TestLossFilter(100.0f, true);
-}
-
-class BweTestFramework_DelayFilterTest : public ::testing::Test {
- public:
-  BweTestFramework_DelayFilterTest()
-      : filter_(NULL, 0), now_ms_(0), sequence_number_(0) {}
-  virtual ~BweTestFramework_DelayFilterTest() {
-    for (auto* packet : accumulated_packets_)
-      delete packet;
-  }
-
- protected:
-  void TestDelayFilter(int64_t run_for_ms, uint32_t in_packets,
-                       uint32_t out_packets) {
-    Packets packets;
-    for (uint32_t i = 0; i < in_packets; ++i) {
-      packets.push_back(new MediaPacket(
-          now_ms_ * 1000 + (sequence_number_ >> 4), sequence_number_));
-      sequence_number_++;
-    }
-    filter_.RunFor(run_for_ms, &packets);
-    ASSERT_TRUE(IsTimeSorted(packets));
-    ASSERT_TRUE(IsSequenceNumberSorted(packets));
-    for (PacketsConstIt it = packets.begin(); it != packets.end(); ++it) {
-      EXPECT_LE(now_ms_ * 1000, (*it)->send_time_us());
-    }
-    EXPECT_EQ(out_packets, packets.size());
-    accumulated_packets_.splice(accumulated_packets_.end(), packets);
-    now_ms_ += run_for_ms;
-  }
-
-  void TestDelayFilter(int64_t delay_ms) {
-    filter_.SetOneWayDelayMs(delay_ms);
-    TestDelayFilter(1, 0, 0);    // No input should yield no output
-
-    // Single packet
-    TestDelayFilter(0, 1, 1);
-    TestDelayFilter(delay_ms, 0, 0);
-
-    for (int i = 0; i < delay_ms; ++i) {
-      filter_.SetOneWayDelayMs(i);
-      TestDelayFilter(1, 10, 10);
-    }
-    TestDelayFilter(0, 0, 0);
-    TestDelayFilter(delay_ms, 0, 0);
-
-    // Wait a little longer - should still see no output
-    TestDelayFilter(delay_ms, 0, 0);
-
-    for (int i = 1; i < delay_ms + 1; ++i) {
-      filter_.SetOneWayDelayMs(i);
-      TestDelayFilter(1, 5, 5);
-    }
-    TestDelayFilter(0, 0, 0);
-    filter_.SetOneWayDelayMs(2 * delay_ms);
-    TestDelayFilter(1, 0, 0);
-    TestDelayFilter(delay_ms, 13, 13);
-    TestDelayFilter(delay_ms, 0, 0);
-
-    // Wait a little longer - should still see no output
-    TestDelayFilter(delay_ms, 0, 0);
-
-    for (int i = 0; i < 2 * delay_ms; ++i) {
-      filter_.SetOneWayDelayMs(2 * delay_ms - i - 1);
-      TestDelayFilter(1, 5, 5);
-    }
-    TestDelayFilter(0, 0, 0);
-    filter_.SetOneWayDelayMs(0);
-    TestDelayFilter(0, 7, 7);
-
-    ASSERT_TRUE(IsTimeSorted(accumulated_packets_));
-    ASSERT_TRUE(IsSequenceNumberSorted(accumulated_packets_));
-  }
-
-  DelayFilter filter_;
-  Packets accumulated_packets_;
-
- private:
-  int64_t now_ms_;
-  uint16_t sequence_number_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(BweTestFramework_DelayFilterTest);
-};
-
-TEST_F(BweTestFramework_DelayFilterTest, Delay0) {
-  TestDelayFilter(1, 0, 0);    // No input should yield no output
-  TestDelayFilter(1, 10, 10);  // Expect no delay (delay time is zero)
-  TestDelayFilter(1, 0, 0);    // Check no packets are still in buffer
-  filter_.SetOneWayDelayMs(0);
-  TestDelayFilter(1, 5, 5);    // Expect no delay (delay time is zero)
-  TestDelayFilter(1, 0, 0);    // Check no packets are still in buffer
-}
-
-TEST_F(BweTestFramework_DelayFilterTest, Delay1) {
-  TestDelayFilter(1);
-}
-
-TEST_F(BweTestFramework_DelayFilterTest, Delay2) {
-  TestDelayFilter(2);
-}
-
-TEST_F(BweTestFramework_DelayFilterTest, Delay20) {
-  TestDelayFilter(20);
-}
-
-TEST_F(BweTestFramework_DelayFilterTest, Delay100) {
-  TestDelayFilter(100);
-}
-
-TEST_F(BweTestFramework_DelayFilterTest, JumpToZeroDelay) {
-  DelayFilter delay(NULL, 0);
-  Packets acc;
-  Packets packets;
-
-  // Delay a bunch of packets, accumulate them to the 'acc' list.
-  delay.SetOneWayDelayMs(100.0f);
-  for (uint32_t i = 0; i < 10; ++i) {
-    packets.push_back(new MediaPacket(i * 100, i));
-  }
-  delay.RunFor(1000, &packets);
-  acc.splice(acc.end(), packets);
-  ASSERT_TRUE(IsTimeSorted(acc));
-  ASSERT_TRUE(IsSequenceNumberSorted(acc));
-
-  // Drop delay to zero, send a few more packets through the delay, append them
-  // to the 'acc' list and verify that it is all sorted.
-  delay.SetOneWayDelayMs(0.0f);
-  for (uint32_t i = 10; i < 50; ++i) {
-    packets.push_back(new MediaPacket(i * 100, i));
-  }
-  delay.RunFor(1000, &packets);
-  acc.splice(acc.end(), packets);
-  ASSERT_TRUE(IsTimeSorted(acc));
-  ASSERT_TRUE(IsSequenceNumberSorted(acc));
-
-  for (auto* packet : acc)
-    delete packet;
-}
-
-TEST_F(BweTestFramework_DelayFilterTest, IncreasingDelay) {
-  // Gradually increase delay.
-  for (int i = 1; i < 50; i += 4) {
-    TestDelayFilter(i);
-  }
-  // Reach a steady state.
-  filter_.SetOneWayDelayMs(100);
-  TestDelayFilter(1, 20, 20);
-  TestDelayFilter(2, 0, 0);
-  TestDelayFilter(99, 20, 20);
-  // Drop delay back down to zero.
-  filter_.SetOneWayDelayMs(0);
-  TestDelayFilter(1, 100, 100);
-  TestDelayFilter(23010, 0, 0);
-  ASSERT_TRUE(IsTimeSorted(accumulated_packets_));
-  ASSERT_TRUE(IsSequenceNumberSorted(accumulated_packets_));
-}
-
-static void TestJitterFilter(int64_t max_jitter_ms) {
-  JitterFilter filter(NULL, 0);
-  filter.SetMaxJitter(max_jitter_ms);
-
-  int64_t now_ms = 0;
-  uint16_t sequence_number = 0;
-
-  // Generate packets, add jitter to them, accumulate the altered packets.
-  Packets original;
-  Packets jittered;
-  for (uint32_t i = 0; i < 1000; ++i) {
-    Packets packets;
-    for (uint32_t j = 0; j < i % 100; ++j) {
-      packets.push_back(new MediaPacket(now_ms * 1000, sequence_number));
-      original.push_back(new MediaPacket(now_ms * 1000, sequence_number));
-      ++sequence_number;
-      now_ms += 5 * max_jitter_ms;
-    }
-    filter.RunFor(max_jitter_ms, &packets);
-    jittered.splice(jittered.end(), packets);
-  }
-
-  // Jittered packets should still be in order.
-  ASSERT_TRUE(IsTimeSorted(original));
-  ASSERT_TRUE(IsTimeSorted(jittered));
-  ASSERT_TRUE(IsSequenceNumberSorted(original));
-  ASSERT_TRUE(IsSequenceNumberSorted(jittered));
-  EXPECT_EQ(original.size(), jittered.size());
-
-  // Make sure jittered and original packets are in same order. Collect time
-  // difference (jitter) in stats, then check that mean jitter is close to zero
-  // and standard deviation of jitter is what we set it to.
-  Stats<double> jitter_us;
-  int64_t max_jitter_obtained_us = 0;
-  for (PacketsIt it1 = original.begin(), it2 = jittered.begin();
-       it1 != original.end() && it2 != jittered.end(); ++it1, ++it2) {
-    const MediaPacket* packet1 = static_cast<const MediaPacket*>(*it1);
-    const MediaPacket* packet2 = static_cast<const MediaPacket*>(*it2);
-    EXPECT_EQ(packet1->header().sequenceNumber,
-              packet2->header().sequenceNumber);
-    max_jitter_obtained_us =
-        std::max(max_jitter_obtained_us,
-                 packet2->send_time_us() - packet1->send_time_us());
-    jitter_us.Push(packet2->send_time_us() - packet1->send_time_us());
-  }
-  EXPECT_NEAR(filter.MeanUs(), jitter_us.GetMean(),
-              max_jitter_ms * 1000.0 * 0.01);
-  EXPECT_NEAR(max_jitter_ms * 1000.0, max_jitter_obtained_us,
-              max_jitter_ms * 1000.0 * 0.01);
-  for (auto* packet : original)
-    delete packet;
-  for (auto* packet : jittered)
-    delete packet;
-}
-
-TEST(BweTestFramework_JitterFilterTest, Jitter0) {
-  TestJitterFilter(0);
-}
-
-TEST(BweTestFramework_JitterFilterTest, Jitter1) {
-  TestJitterFilter(1);
-}
-
-TEST(BweTestFramework_JitterFilterTest, Jitter5) {
-  TestJitterFilter(5);
-}
-
-TEST(BweTestFramework_JitterFilterTest, Jitter10) {
-  TestJitterFilter(10);
-}
-
-TEST(BweTestFramework_JitterFilterTest, Jitter1031) {
-  TestJitterFilter(1031);
-}
-
-static void TestReorderFilter(uint16_t reorder_percent) {
-  const uint16_t kPacketCount = 10000;
-
-  // Generate packets with 10 ms interval.
-  Packets packets;
-  int64_t now_ms = 0;
-  uint16_t sequence_number = 1;
-  for (uint16_t i = 0; i < kPacketCount; ++i, now_ms += 10) {
-    packets.push_back(new MediaPacket(now_ms * 1000, sequence_number++));
-  }
-  ASSERT_TRUE(IsTimeSorted(packets));
-  ASSERT_TRUE(IsSequenceNumberSorted(packets));
-
-  // Reorder packets, verify that send times are still in order.
-  ReorderFilter filter(NULL, 0);
-  filter.SetReorder(reorder_percent);
-  filter.RunFor(now_ms, &packets);
-  ASSERT_TRUE(IsTimeSorted(packets));
-
-  // We measure the amount of reordering by summing the distance by which out-
-  // of-order packets have been moved in the stream.
-  uint16_t distance = 0;
-  uint16_t last_sequence_number = 0;
-  for (auto* packet : packets) {
-    const MediaPacket* media_packet = static_cast<const MediaPacket*>(packet);
-    uint16_t sequence_number = media_packet->header().sequenceNumber;
-    // The expected position for sequence number s is in position s-1.
-    if (sequence_number < last_sequence_number) {
-      distance += last_sequence_number - sequence_number;
-    }
-    last_sequence_number = sequence_number;
-  }
-
-  // The probability that two elements are swapped is p = reorder_percent / 100.
-  double p = static_cast<double>(reorder_percent) / 100;
-  // The expected number of swaps we perform is p * (PacketCount - 1),
-  // and each swap increases the distance by one.
-  double mean = p * (kPacketCount - 1);
-  // If pair i is chosen to be swapped with probability p, the variance for that
-  // pair is p * (1 - p). Since there are (kPacketCount - 1) independent pairs,
-  // the variance for the number of swaps is (kPacketCount - 1) * p * (1 - p).
-  double std_deviation = sqrt((kPacketCount - 1) * p * (1 - p));
-  EXPECT_NEAR(mean, distance, 3 * std_deviation);
-
-  for (auto* packet : packets)
-    delete packet;
-}
-
-TEST(BweTestFramework_ReorderFilterTest, Reorder0) {
-  // For 0% reordering, no packets should have been moved, so result is exact.
-  TestReorderFilter(0);
-}
-
-TEST(BweTestFramework_ReorderFilterTest, Reorder10) {
-  TestReorderFilter(10);
-}
-
-TEST(BweTestFramework_ReorderFilterTest, Reorder20) {
-  TestReorderFilter(20);
-}
-
-TEST(BweTestFramework_ReorderFilterTest, Reorder50) {
-  TestReorderFilter(50);
-}
-
-TEST(BweTestFramework_ReorderFilterTest, Reorder70) {
-  TestReorderFilter(70);
-}
-
-TEST(BweTestFramework_ReorderFilterTest, Reorder100) {
-  // Note that because the implementation works by optionally swapping two
-  // adjacent packets, when the likelihood of a swap is 1.0, a swap will always
-  // occur, so the stream will be in order except for the first packet, which
-  // has been moved to the end. Therefore we expect the result to be exact here.
-  TestReorderFilter(100.0);
-}
-
-class BweTestFramework_ChokeFilterTest : public ::testing::Test {
- public:
-  BweTestFramework_ChokeFilterTest()
-    : now_ms_(0),
-      sequence_number_(0),
-      output_packets_(),
-      send_times_us_() {
-  }
-  virtual ~BweTestFramework_ChokeFilterTest() {
-    for (auto* packet : output_packets_)
-      delete packet;
-  }
-
- protected:
-  void TestChoke(PacketProcessor* filter,
-                 int64_t run_for_ms,
-                 uint32_t packets_to_generate,
-                 size_t expected_kbit_transmitted) {
-    // Generate a bunch of packets, apply choke, verify output is ordered.
-    Packets packets;
-    RTPHeader header;
-    for (uint32_t i = 0; i < packets_to_generate; ++i) {
-      int64_t send_time_ms = now_ms_ + (i * run_for_ms) / packets_to_generate;
-      header.sequenceNumber = sequence_number_++;
-      // Payload is 1000 bits.
-      packets.push_back(new MediaPacket(0, send_time_ms * 1000, 125, header));
-      send_times_us_.push_back(send_time_ms * 1000);
-    }
-    ASSERT_TRUE(IsTimeSorted(packets));
-    filter->RunFor(run_for_ms, &packets);
-    now_ms_ += run_for_ms;
-    output_packets_.splice(output_packets_.end(), packets);
-    ASSERT_TRUE(IsTimeSorted(output_packets_));
-    ASSERT_TRUE(IsSequenceNumberSorted(output_packets_));
-
-    // Sum up the transmitted bytes up until the current time.
-    size_t bytes_transmitted = 0;
-    while (!output_packets_.empty()) {
-      const Packet* packet = output_packets_.front();
-      if (packet->send_time_us() > now_ms_ * 1000) {
-        break;
-      }
-      bytes_transmitted += packet->payload_size();
-      delete output_packets_.front();
-      output_packets_.pop_front();
-    }
-    EXPECT_EQ(expected_kbit_transmitted, (bytes_transmitted * 8 + 500) / 1000);
-  }
-
-  void CheckMaxDelay(int64_t max_delay_ms) {
-    for (const auto* packet : output_packets_) {
-      const MediaPacket* media_packet = static_cast<const MediaPacket*>(packet);
-      int64_t delay_us = media_packet->send_time_us() -
-                         send_times_us_[media_packet->header().sequenceNumber];
-      EXPECT_GE(max_delay_ms * 1000, delay_us);
-    }
-  }
-
- private:
-  int64_t now_ms_;
-  uint16_t sequence_number_;
-  Packets output_packets_;
-  std::vector<int64_t> send_times_us_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(BweTestFramework_ChokeFilterTest);
-};
-
-TEST_F(BweTestFramework_ChokeFilterTest, NoQueue) {
-  const int kCapacityKbps = 10;
-  const size_t kPacketSizeBytes = 125;
-  const int64_t kExpectedSendTimeUs =
-      (kPacketSizeBytes * 8 * 1000 + kCapacityKbps / 2) / kCapacityKbps;
-  uint16_t sequence_number = 0;
-  int64_t send_time_us = 0;
-  ChokeFilter filter(NULL, 0);
-  filter.set_capacity_kbps(10);
-  Packets packets;
-  RTPHeader header;
-  for (int i = 0; i < 2; ++i) {
-    header.sequenceNumber = sequence_number++;
-    // Payload is 1000 bits.
-    packets.push_back(
-        new MediaPacket(0, send_time_us, kPacketSizeBytes, header));
-    // Packets are sent far enough a part plus an extra millisecond so that they
-    // will never be in the choke queue at the same time.
-    send_time_us += kExpectedSendTimeUs + 1000;
-  }
-  ASSERT_TRUE(IsTimeSorted(packets));
-  filter.RunFor(2 * kExpectedSendTimeUs + 1000, &packets);
-  EXPECT_EQ(kExpectedSendTimeUs, packets.front()->send_time_us());
-  delete packets.front();
-  packets.pop_front();
-  EXPECT_EQ(2 * kExpectedSendTimeUs + 1000, packets.front()->send_time_us());
-  delete packets.front();
-  packets.pop_front();
-}
-
-TEST_F(BweTestFramework_ChokeFilterTest, Short) {
-  // 100ms, 100 packets, 10 kbps choke -> 1 kbit of data should have propagated.
-  // That is actually just a single packet, since each packet has 1000 bits of
-  // payload.
-  ChokeFilter filter(NULL, 0);
-  filter.set_capacity_kbps(10);
-  TestChoke(&filter, 100, 100, 1);
-}
-
-TEST_F(BweTestFramework_ChokeFilterTest, Medium) {
-  // 100ms, 10 packets, 10 kbps choke -> 1 packet through, or 1 kbit.
-  ChokeFilter filter(NULL, 0);
-  filter.set_capacity_kbps(10);
-  TestChoke(&filter, 100, 10, 1);
-  // 200ms, no new packets -> another packet through.
-  TestChoke(&filter, 100, 0, 1);
-  // 1000ms, no new packets -> 8 more packets.
-  TestChoke(&filter, 800, 0, 8);
-  // 2000ms, no new packets -> queue is empty so no output.
-  TestChoke(&filter, 1000, 0, 0);
-}
-
-TEST_F(BweTestFramework_ChokeFilterTest, Long) {
-  // 100ms, 100 packets in queue, 10 kbps choke -> 1 packet through, or 1 kbit.
-  ChokeFilter filter(NULL, 0);
-  filter.set_capacity_kbps(10);
-  TestChoke(&filter, 100, 100, 1);
-  // 200ms, no input, another packet through.
-  TestChoke(&filter, 100, 0, 1);
-  // 1000ms, no input, 8 packets through.
-  TestChoke(&filter, 800, 0, 8);
-  // 10000ms, no input, raise choke to 100 kbps. Remaining 90 packets in queue
-  // should be propagated, for a total of 90 kbps.
-  filter.set_capacity_kbps(100);
-  TestChoke(&filter, 9000, 0, 90);
-  // 10100ms, 20 more packets -> 10 packets or 10 kbit through.
-  TestChoke(&filter, 100, 20, 10);
-  // 10300ms, 10 more packets -> 20 packets out.
-  TestChoke(&filter, 200, 10, 20);
-  // 11300ms, no input, queue should be empty.
-  filter.set_capacity_kbps(10);
-  TestChoke(&filter, 1000, 0, 0);
-}
-
-TEST_F(BweTestFramework_ChokeFilterTest, MaxDelay) {
-  // 10 kbps choke, 500 ms delay cap
-  ChokeFilter filter(NULL, 0);
-  filter.set_capacity_kbps(10);
-  filter.set_max_delay_ms(500);
-  // 100ms, 100 packets in queue, 10 kbps choke -> 1 packet through, or 1 kbit.
-  TestChoke(&filter, 100, 100, 1);
-  CheckMaxDelay(500);
-  // 500ms, no input, 4 more packets through.
-  TestChoke(&filter, 400, 0, 4);
-  // 10000ms, no input, remaining packets should have been dropped.
-  TestChoke(&filter, 9500, 0, 0);
-
-  // 100 ms delay cap
-  filter.set_max_delay_ms(100);
-  // 10100ms, 50 more packets -> 1 packets or 1 kbit through.
-  TestChoke(&filter, 100, 50, 1);
-  CheckMaxDelay(100);
-  // 20000ms, no input, remaining packets in queue should have been dropped.
-  TestChoke(&filter, 9900, 0, 0);
-
-  // Reset delay cap (0 is no cap) and verify no packets are dropped.
-  filter.set_capacity_kbps(10);
-  filter.set_max_delay_ms(0);
-  TestChoke(&filter, 100, 100, 1);
-  TestChoke(&filter, 9900, 0, 99);
-}
-
-TEST_F(BweTestFramework_ChokeFilterTest, ShortTrace) {
-  // According to the input file 6 packets should be transmitted within
-  // 100 milliseconds.
-  TraceBasedDeliveryFilter filter(NULL, 0);
-  ASSERT_TRUE(filter.Init(test::ResourcePath("synthetic-trace", "rx")));
-  TestChoke(&filter, 100, 100, 6);
-}
-
-TEST_F(BweTestFramework_ChokeFilterTest, ShortTraceTwoWraps) {
-  // According to the input file 19 packets should be transmitted within
-  // 280 milliseconds (at the wrapping point two packets are sent back to back).
-  TraceBasedDeliveryFilter filter(NULL, 0);
-  ASSERT_TRUE(filter.Init(test::ResourcePath("synthetic-trace", "rx")));
-  TestChoke(&filter, 280, 100, 19);
-}
-
-TEST_F(BweTestFramework_ChokeFilterTest, ShortTraceMaxDelay) {
-  TraceBasedDeliveryFilter filter(NULL, 0);
-  filter.set_max_delay_ms(25);
-  ASSERT_TRUE(filter.Init(test::ResourcePath("synthetic-trace", "rx")));
-  // Uses all slots up to 110 ms. Several packets are being dropped.
-  TestChoke(&filter, 110, 20, 9);
-  CheckMaxDelay(25);
-  // Simulate enough time for the next slot (at 135 ms) to be used. This makes
-  // sure that a slot isn't missed between runs.
-  TestChoke(&filter, 25, 1, 1);
-}
-
-void TestVideoSender(VideoSender* sender,
-                     int64_t run_for_ms,
-                     uint32_t expected_packets,
-                     uint32_t expected_payload_size,
-                     size_t expected_total_payload_size) {
-  assert(sender);
-  Packets packets;
-  sender->RunFor(run_for_ms, &packets);
-  ASSERT_TRUE(IsTimeSorted(packets));
-  ASSERT_TRUE(IsSequenceNumberSorted(packets));
-  EXPECT_EQ(expected_packets, packets.size());
-
-  int64_t send_time_us = -1;
-  size_t total_payload_size = 0;
-  uint32_t absolute_send_time = 0;
-  uint32_t absolute_send_time_wraps = 0;
-  uint32_t rtp_timestamp = 0;
-  uint32_t rtp_timestamp_wraps = 0;
-
-  for (const auto* packet : packets) {
-    const MediaPacket* media_packet = static_cast<const MediaPacket*>(packet);
-    EXPECT_LE(send_time_us, media_packet->send_time_us());
-    send_time_us = media_packet->send_time_us();
-    if (sender->source()->max_payload_size_bytes() !=
-        media_packet->payload_size()) {
-      EXPECT_EQ(expected_payload_size, media_packet->payload_size());
-    }
-    total_payload_size += media_packet->payload_size();
-    if (absolute_send_time >
-        media_packet->header().extension.absoluteSendTime) {
-      absolute_send_time_wraps++;
-    }
-    absolute_send_time = media_packet->header().extension.absoluteSendTime;
-    if (rtp_timestamp > media_packet->header().timestamp) {
-      rtp_timestamp_wraps++;
-    }
-    rtp_timestamp = media_packet->header().timestamp;
-  }
-
-  EXPECT_EQ(expected_total_payload_size, total_payload_size);
-  EXPECT_GE(1u, absolute_send_time_wraps);
-  EXPECT_GE(1u, rtp_timestamp_wraps);
-
-  for (auto* packet : packets)
-    delete packet;
-}
-
-// Random {-1, 0, +1} ms was added to frame timestamps.
-
-TEST(BweTestFramework_VideoSenderTest, Fps1Kbps80_1s) {
-  // 1 fps, 80 kbps
-  VideoSource source(0, 1.0f, 80, 0x1234, 0);
-  VideoSender sender(NULL, &source, kNullEstimator);
-  EXPECT_EQ(80000u, source.bits_per_second());
-  // We're at 1 fps, so all packets should be generated on first call, giving 10
-  // packets of each 1000 bytes, total 10000 bytes.
-  TestVideoSender(&sender, 1, 9, 400, 10000);
-  // 998ms, should see no output here.
-  TestVideoSender(&sender, 997, 0, 0, 0);
-  // 1001ms, should get data for one more frame.
-  TestVideoSender(&sender, 3, 9, 400, 10000);
-  // 1998ms, should see no output here.
-  TestVideoSender(&sender, 997, 0, 0, 0);
-  // 2001ms, one more frame.
-  TestVideoSender(&sender, 3, 9, 400, 10000);
-  // 2998ms, should see nothing.
-  TestVideoSender(&sender, 997, 0, 0, 0);
-}
-
-TEST(BweTestFramework_VideoSenderTest, Fps1Kbps80_1s_Offset) {
-  // 1 fps, 80 kbps, offset 0.5 of a frame period, ==0.5s in this case.
-  VideoSource source(0, 1.0f, 80, 0x1234, 500);
-  VideoSender sender(NULL, &source, kNullEstimator);
-  EXPECT_EQ(80000u, source.bits_per_second());
-  // 498ms, no output.
-  TestVideoSender(&sender, 498, 0, 0, 0);
-  // 501ms, first frame (this is the offset we set), 10 packets of 1000 bytes.
-  TestVideoSender(&sender, 3, 9, 400, 10000);
-  // 1498ms, nothing.
-  TestVideoSender(&sender, 997, 0, 0, 0);
-  // 1501ms, second frame.
-  TestVideoSender(&sender, 3, 9, 400, 10000);
-  // 2498ms, nothing.
-  TestVideoSender(&sender, 997, 0, 0, 0);
-  // 2501ms, third frame.
-  TestVideoSender(&sender, 3, 9, 400, 10000);
-  // 3498ms, nothing.
-  TestVideoSender(&sender, 997, 0, 0, 0);
-}
-
-TEST(BweTestFramework_VideoSenderTest, Fps50Kpbs80_11s) {
-  // 50 fps, 80 kbps.
-  VideoSource source(0, 50.0f, 80, 0x1234, 0);
-  VideoSender sender(NULL, &source, kNullEstimator);
-  EXPECT_EQ(80000u, source.bits_per_second());
-  // 9981, should see 500 frames, 200 byte payloads, total 100000 bytes.
-  TestVideoSender(&sender, 9981, 500, 200, 100000);
-  // 9998ms, nothing.
-  TestVideoSender(&sender, 17, 0, 0, 0);
-  // 10001ms, 501st frame as a single packet.
-  TestVideoSender(&sender, 3, 1, 200, 200);
-  // 10981ms, 49 more frames.
-  TestVideoSender(&sender, 981, 49, 200, 9800);
-  // 10998ms, nothing.
-  TestVideoSender(&sender, 17, 0, 0, 0);
-}
-
-TEST(BweTestFramework_VideoSenderTest, Fps20Kpbs120_1s) {
-  // 20 fps, 120 kbps.
-  VideoSource source(0, 20.0f, 120, 0x1234, 0);
-  VideoSender sender(NULL, &source, kNullEstimator);
-  EXPECT_EQ(120000u, source.bits_per_second());
-  // 451ms, 10 frames with 750 byte payloads, total 7500 bytes.
-  TestVideoSender(&sender, 451, 10, 750, 7500);
-  // 498ms, nothing.
-  TestVideoSender(&sender, 47, 0, 0, 0);
-  // 501ms, one more frame.
-  TestVideoSender(&sender, 3, 1, 750, 750);
-  // 951ms, 9 more frames.
-  TestVideoSender(&sender, 450, 9, 750, 6750);
-  // 998ms, nothing.
-  TestVideoSender(&sender, 47, 0, 0, 0);
-}
-
-TEST(BweTestFramework_VideoSenderTest, Fps25Kbps820_20s) {
-  // 25 fps, 820 kbps.
-  VideoSource source(0, 25.0f, 820, 0x1234, 0);
-  VideoSender sender(NULL, &source, kNullEstimator);
-  EXPECT_EQ(820000u, source.bits_per_second());
-  // 9961ms, 250 frames. 820 kbps = 102500 bytes/s, so total should be 1025000.
-  // Each frame is 102500/25=4100 bytes, or 5 packets (4 @1000 bytes, 1 @100),
-  // so packet count should be 5*250=1250 and last packet of each frame has
-  // 100 bytes of payload.
-  TestVideoSender(&sender, 9961, 1000, 500, 1025000);
-  // 9998ms, nothing.
-  TestVideoSender(&sender, 37, 0, 0, 0);
-  // 19961ms, 250 more frames.
-  TestVideoSender(&sender, 9963, 1000, 500, 1025000);
-  // 19998ms, nothing.
-  TestVideoSender(&sender, 37, 0, 0, 0);
-  // 20001ms, one more frame, as described above (25fps == 40ms/frame).
-  TestVideoSender(&sender, 3, 4, 500, 4100);
-  // 20038ms, nothing.
-  TestVideoSender(&sender, 37, 0, 0, 0);
-}
-
-TEST(BweTestFramework_VideoSenderTest, TestAppendInOrder) {
-  // 1 fps, 80 kbps, 250ms offset.
-  VideoSource source1(0, 1.0f, 80, 0x1234, 250);
-  VideoSender sender1(NULL, &source1, kNullEstimator);
-  EXPECT_EQ(80000u, source1.bits_per_second());
-  Packets packets;
-  // Generate some packets, verify they are sorted.
-  sender1.RunFor(999, &packets);
-  ASSERT_TRUE(IsTimeSorted(packets));
-  ASSERT_TRUE(IsSequenceNumberSorted(packets));
-  EXPECT_EQ(9u, packets.size());
-  // Generate some more packets and verify they are appended to end of list.
-  sender1.RunFor(1000, &packets);
-  ASSERT_TRUE(IsTimeSorted(packets));
-  ASSERT_TRUE(IsSequenceNumberSorted(packets));
-  EXPECT_EQ(18u, packets.size());
-
-  // Another sender, 2 fps, 160 kbps, 150ms offset
-  VideoSource source2(0, 2.0f, 160, 0x2234, 150);
-  VideoSender sender2(NULL, &source2, kNullEstimator);
-  EXPECT_EQ(160000u, source2.bits_per_second());
-  // Generate some packets, verify that they are merged with the packets already
-  // on the list.
-  sender2.RunFor(999, &packets);
-  ASSERT_TRUE(IsTimeSorted(packets));
-  EXPECT_EQ(36u, packets.size());
-  // Generate some more.
-  sender2.RunFor(1000, &packets);
-  ASSERT_TRUE(IsTimeSorted(packets));
-  EXPECT_EQ(54u, packets.size());
-
-  for (auto* packet : packets)
-    delete packet;
-}
-
-TEST(BweTestFramework_VideoSenderTest, FeedbackIneffective) {
-  VideoSource source(0, 25.0f, 820, 0x1234, 0);
-  VideoSender sender(NULL, &source, kNullEstimator);
-
-  EXPECT_EQ(820000u, source.bits_per_second());
-  TestVideoSender(&sender, 9961, 1000, 500, 1025000);
-
-  // Make sure feedback has no effect on a regular video sender.
-  RembFeedback* feedback = new RembFeedback(0, 0, 0, 512000, RTCPReportBlock());
-  Packets packets;
-  packets.push_back(feedback);
-  sender.RunFor(0, &packets);
-  EXPECT_EQ(820000u, source.bits_per_second());
-  TestVideoSender(&sender, 10000, 1000, 500, 1025000);
-}
-}  // namespace bwe
-}  // namespace testing
-}  // namespace webrtc
diff --git a/modules/remote_bitrate_estimator/test/bwe_test_logging.cc b/modules/remote_bitrate_estimator/test/bwe_test_logging.cc
deleted file mode 100644
index 729254a..0000000
--- a/modules/remote_bitrate_estimator/test/bwe_test_logging.cc
+++ /dev/null
@@ -1,259 +0,0 @@
-/*
- *  Copyright (c) 2013 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/remote_bitrate_estimator/test/bwe_test_logging.h"
-
-#if BWE_TEST_LOGGING_COMPILE_TIME_ENABLE
-
-#include <stdarg.h>
-#include <stdio.h>
-
-#include <algorithm>
-#include <sstream>
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/format_macros.h"
-#include "webrtc/rtc_base/platform_thread.h"
-
-namespace webrtc {
-namespace testing {
-namespace bwe {
-
-Logging Logging::g_Logging;
-
-static std::string ToString(uint32_t v) {
-  std::stringstream ss;
-  ss << v;
-  return ss.str();
-}
-
-Logging::Context::Context(uint32_t name, int64_t timestamp_ms, bool enabled) {
-  Logging::GetInstance()->PushState(ToString(name), timestamp_ms, enabled);
-}
-
-Logging::Context::Context(const std::string& name, int64_t timestamp_ms,
-                          bool enabled) {
-  Logging::GetInstance()->PushState(name, timestamp_ms, enabled);
-}
-
-Logging::Context::Context(const char* name, int64_t timestamp_ms,
-                          bool enabled) {
-  Logging::GetInstance()->PushState(name, timestamp_ms, enabled);
-}
-
-Logging::Context::~Context() {
-  Logging::GetInstance()->PopState();
-}
-
-Logging* Logging::GetInstance() {
-  return &g_Logging;
-}
-
-void Logging::SetGlobalContext(uint32_t name) {
-  rtc::CritScope cs(&crit_sect_);
-  thread_map_[rtc::CurrentThreadId()].global_state.tag = ToString(name);
-}
-
-void Logging::SetGlobalContext(const std::string& name) {
-  rtc::CritScope cs(&crit_sect_);
-  thread_map_[rtc::CurrentThreadId()].global_state.tag = name;
-}
-
-void Logging::SetGlobalContext(const char* name) {
-  rtc::CritScope cs(&crit_sect_);
-  thread_map_[rtc::CurrentThreadId()].global_state.tag = name;
-}
-
-void Logging::SetGlobalEnable(bool enabled) {
-  rtc::CritScope cs(&crit_sect_);
-  thread_map_[rtc::CurrentThreadId()].global_state.enabled = enabled;
-}
-
-void Logging::Log(const char format[], ...) {
-  rtc::CritScope cs(&crit_sect_);
-  ThreadMap::iterator it = thread_map_.find(rtc::CurrentThreadId());
-  RTC_DCHECK(it != thread_map_.end());
-  const State& state = it->second.stack.top();
-  if (state.enabled) {
-    printf("%s\t", state.tag.c_str());
-    va_list args;
-    va_start(args, format);
-    vprintf(format, args);
-    va_end(args);
-    printf("\n");
-  }
-}
-
-void Logging::Plot(int figure, const std::string& name, double value) {
-  Plot(figure, name, value, 0, "-");
-}
-
-void Logging::Plot(int figure,
-                   const std::string& name,
-                   double value,
-                   uint32_t ssrc) {
-  Plot(figure, name, value, ssrc, "-");
-}
-
-void Logging::Plot(int figure,
-                   const std::string& name,
-                   double value,
-                   const std::string& alg_name) {
-  Plot(figure, name, value, 0, alg_name);
-}
-
-void Logging::Plot(int figure,
-                   const std::string& name,
-                   double value,
-                   uint32_t ssrc,
-                   const std::string& alg_name) {
-  rtc::CritScope cs(&crit_sect_);
-  ThreadMap::iterator it = thread_map_.find(rtc::CurrentThreadId());
-  RTC_DCHECK(it != thread_map_.end());
-  const State& state = it->second.stack.top();
-  if (state.enabled) {
-    printf("PLOT\t%d\t%s:%" PRIu32 "@%s\t%f\t%f\n", figure, name.c_str(), ssrc,
-           alg_name.c_str(), state.timestamp_ms * 0.001, value);
-  }
-}
-
-void Logging::PlotBar(int figure,
-                      const std::string& name,
-                      double value,
-                      int flow_id) {
-  rtc::CritScope cs(&crit_sect_);
-  ThreadMap::iterator it = thread_map_.find(rtc::CurrentThreadId());
-  RTC_DCHECK(it != thread_map_.end());
-  const State& state = it->second.stack.top();
-  if (state.enabled) {
-    printf("BAR\t%d\t%s_%d\t%f\n", figure, name.c_str(), flow_id, value);
-  }
-}
-
-void Logging::PlotBaselineBar(int figure,
-                              const std::string& name,
-                              double value,
-                              int flow_id) {
-  rtc::CritScope cs(&crit_sect_);
-  ThreadMap::iterator it = thread_map_.find(rtc::CurrentThreadId());
-  RTC_DCHECK(it != thread_map_.end());
-  const State& state = it->second.stack.top();
-  if (state.enabled) {
-    printf("BASELINE\t%d\t%s_%d\t%f\n", figure, name.c_str(), flow_id, value);
-  }
-}
-
-void Logging::PlotErrorBar(int figure,
-                           const std::string& name,
-                           double value,
-                           double ylow,
-                           double yhigh,
-                           const std::string& error_title,
-                           int flow_id) {
-  rtc::CritScope cs(&crit_sect_);
-  ThreadMap::iterator it = thread_map_.find(rtc::CurrentThreadId());
-  RTC_DCHECK(it != thread_map_.end());
-  const State& state = it->second.stack.top();
-  if (state.enabled) {
-    printf("ERRORBAR\t%d\t%s_%d\t%f\t%f\t%f\t%s\n", figure, name.c_str(),
-           flow_id, value, ylow, yhigh, error_title.c_str());
-  }
-}
-
-void Logging::PlotLimitErrorBar(int figure,
-                                const std::string& name,
-                                double value,
-                                double ylow,
-                                double yhigh,
-                                const std::string& error_title,
-                                double ymax,
-                                const std::string& limit_title,
-                                int flow_id) {
-  rtc::CritScope cs(&crit_sect_);
-  ThreadMap::iterator it = thread_map_.find(rtc::CurrentThreadId());
-  RTC_DCHECK(it != thread_map_.end());
-  const State& state = it->second.stack.top();
-  if (state.enabled) {
-    printf("LIMITERRORBAR\t%d\t%s_%d\t%f\t%f\t%f\t%s\t%f\t%s\n", figure,
-           name.c_str(), flow_id, value, ylow, yhigh, error_title.c_str(), ymax,
-           limit_title.c_str());
-  }
-}
-
-void Logging::PlotLabel(int figure,
-                        const std::string& title,
-                        const std::string& y_label,
-                        int num_flows) {
-  rtc::CritScope cs(&crit_sect_);
-  ThreadMap::iterator it = thread_map_.find(rtc::CurrentThreadId());
-  RTC_DCHECK(it != thread_map_.end());
-  const State& state = it->second.stack.top();
-  if (state.enabled) {
-    printf("LABEL\t%d\t%s\t%s\t%d\n", figure, title.c_str(), y_label.c_str(),
-           num_flows);
-  }
-}
-
-Logging::Logging()
-    : thread_map_() {
-}
-
-Logging::State::State() : tag(""), timestamp_ms(0), enabled(true) {}
-
-Logging::State::State(const std::string& tag, int64_t timestamp_ms,
-                      bool enabled)
-    : tag(tag),
-      timestamp_ms(timestamp_ms),
-      enabled(enabled) {
-}
-
-void Logging::State::MergePrevious(const State& previous) {
-  if (tag.empty()) {
-    tag = previous.tag;
-  } else if (!previous.tag.empty()) {
-    tag = previous.tag + "_" + tag;
-  }
-  timestamp_ms = std::max(previous.timestamp_ms, timestamp_ms);
-  enabled = previous.enabled && enabled;
-}
-
-void Logging::PushState(const std::string& append_to_tag, int64_t timestamp_ms,
-                        bool enabled) {
-  rtc::CritScope cs(&crit_sect_);
-  State new_state(append_to_tag, timestamp_ms, enabled);
-  ThreadState* thread_state = &thread_map_[rtc::CurrentThreadId()];
-  std::stack<State>* stack = &thread_state->stack;
-  if (stack->empty()) {
-    new_state.MergePrevious(thread_state->global_state);
-  } else {
-    new_state.MergePrevious(stack->top());
-  }
-  stack->push(new_state);
-}
-
-void Logging::PopState() {
-  rtc::CritScope cs(&crit_sect_);
-  ThreadMap::iterator it = thread_map_.find(rtc::CurrentThreadId());
-  RTC_DCHECK(it != thread_map_.end());
-  std::stack<State>* stack = &it->second.stack;
-  int64_t newest_timestamp_ms = stack->top().timestamp_ms;
-  stack->pop();
-  if (!stack->empty()) {
-    State* state = &stack->top();
-    // Update time so that next log/plot will use the latest time seen so far
-    // in this call tree.
-    state->timestamp_ms = std::max(state->timestamp_ms, newest_timestamp_ms);
-  }
-}
-}  // namespace bwe
-}  // namespace testing
-}  // namespace webrtc
-
-#endif  // BWE_TEST_LOGGING_COMPILE_TIME_ENABLE
diff --git a/modules/remote_bitrate_estimator/test/bwe_test_logging.h b/modules/remote_bitrate_estimator/test/bwe_test_logging.h
deleted file mode 100644
index 76f2aee..0000000
--- a/modules/remote_bitrate_estimator/test/bwe_test_logging.h
+++ /dev/null
@@ -1,351 +0,0 @@
-/*
- *  Copyright (c) 2013 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_REMOTE_BITRATE_ESTIMATOR_TEST_BWE_TEST_LOGGING_H_
-#define WEBRTC_MODULES_REMOTE_BITRATE_ESTIMATOR_TEST_BWE_TEST_LOGGING_H_
-
-// To enable BWE logging, run this command from trunk/ :
-// build/gyp_chromium --depth=. webrtc/modules/modules.gyp
-//   -Denable_bwe_test_logging=1
-#ifndef BWE_TEST_LOGGING_COMPILE_TIME_ENABLE
-#define BWE_TEST_LOGGING_COMPILE_TIME_ENABLE 0
-#endif  // BWE_TEST_LOGGING_COMPILE_TIME_ENABLE
-
-// BWE logging allows you to insert dynamically named log/plot points in the
-// call tree. E.g. the function:
-//  void f1() {
-//    BWE_TEST_LOGGING_TIME(clock_->TimeInMilliseconds());
-//    BWE_TEST_LOGGING_CONTEXT("stream");
-//    for (uint32_t i=0; i<4; ++i) {
-//      BWE_TEST_LOGGING_ENABLE(i & 1);
-//      BWE_TEST_LOGGING_CONTEXT(i);
-//      BWE_TEST_LOGGING_LOG1("weight", "%f tonnes", weights_[i]);
-//      for (float j=0.0f; j<1.0; j+=0.4f) {
-//        BWE_TEST_LOGGING_PLOT(0, "bps", -1, j);
-//      }
-//    }
-//  }
-//
-// Might produce the output:
-//   stream_00000001_weight 13.000000 tonnes
-//   PLOT  stream_00000001_bps  1.000000  0.000000
-//   PLOT  stream_00000001_bps  1.000000  0.400000
-//   PLOT  stream_00000001_bps  1.000000  0.800000
-//   stream_00000003_weight 39.000000 tonnes
-//   PLOT  stream_00000003_bps  1.000000  0.000000
-//   PLOT  stream_00000003_bps  1.000000  0.400000
-//   PLOT  stream_00000003_bps  1.000000  0.800000
-//
-// Log *contexts* are names concatenated with '_' between them, with the name
-// of the logged/plotted string/value last. Plot *time* is inherited down the
-// tree. A branch is enabled by default but can be *disabled* to reduce output.
-// The difference between the LOG and PLOT macros is that PLOT prefixes the line
-// so it can be easily filtered, plus it outputs the current time.
-
-#if !(BWE_TEST_LOGGING_COMPILE_TIME_ENABLE)
-
-// Set a thread-global base logging context. This name will be prepended to all
-// hierarchical contexts.
-// |name| is a char*, std::string or uint32_t to name the context.
-#define BWE_TEST_LOGGING_GLOBAL_CONTEXT(name)
-
-// Thread-globally allow/disallow logging.
-// |enable| is expected to be a bool.
-#define BWE_TEST_LOGGING_GLOBAL_ENABLE(enabled)
-
-// Insert a (hierarchical) logging context.
-// |name| is a char*, std::string or uint32_t to name the context.
-#define BWE_TEST_LOGGING_CONTEXT(name)
-
-// Allow/disallow logging down the call tree from this point. Logging must be
-// enabled all the way to the root of the call tree to take place.
-// |enable| is expected to be a bool.
-#define BWE_TEST_LOGGING_ENABLE(enabled)
-
-// Set current time (only affects PLOT output). Down the call tree, the latest
-// time set always takes precedence.
-// |time| is an int64_t time in ms, or -1 to inherit time from previous context.
-#define BWE_TEST_LOGGING_TIME(time)
-
-// Print to stdout, e.g.:
-//   Context1_Context2_Name  printf-formated-string
-// |name| is a char*, std::string or uint32_t to name the log line.
-// |format| is a printf format string.
-// |_1...| are arguments for printf.
-#define BWE_TEST_LOGGING_LOG1(name, format, _1)
-#define BWE_TEST_LOGGING_LOG2(name, format, _1, _2)
-#define BWE_TEST_LOGGING_LOG3(name, format, _1, _2, _3)
-#define BWE_TEST_LOGGING_LOG4(name, format, _1, _2, _3, _4)
-#define BWE_TEST_LOGGING_LOG5(name, format, _1, _2, _3, _4, _5)
-
-// Print to stdout in tab-separated format suitable for plotting, e.g.:
-//   PLOT figure Context1_Context2_Name  time  value
-// |figure| is a figure id. Different figures are plotted in different windows.
-// |name| is a char*, std::string or uint32_t to name the plotted value.
-// |time| is an int64_t time in ms, or -1 to inherit time from previous context.
-// |value| is a double precision float to be plotted.
-// |ssrc| identifies the source of a stream
-// |alg_name| is an optional argument, a string
-#define BWE_TEST_LOGGING_PLOT(figure, name, time, value)
-#define BWE_TEST_LOGGING_PLOT_WITH_NAME(figure, name, time, value, alg_name)
-#define BWE_TEST_LOGGING_PLOT_WITH_SSRC(figure, name, time, value, ssrc)
-#define BWE_TEST_LOGGING_PLOT_WITH_NAME_AND_SSRC(figure, name, time, value, \
-                                                 ssrc, alg_name)
-
-// Print to stdout in tab-separated format suitable for plotting, e.g.:
-//   BAR figure Context1_Context2_Name  x_left  width  value
-// |figure| is a figure id. Different figures are plotted in different windows.
-// |name| is a char*, std::string or uint32_t to name the plotted value.
-// |value| is a double precision float to be plotted.
-// |ylow| and |yhigh| are double precision float for the error line.
-// |title| is a string and refers to the error label.
-// |ymax| is a double precision float for the limit horizontal line.
-// |limit_title| is a string and refers to the limit label.
-#define BWE_TEST_LOGGING_BAR(figure, name, value, flow_id)
-#define BWE_TEST_LOGGING_ERRORBAR(figure, name, value, ylow, yhigh, \
-                                  error_title, flow_id)
-#define BWE_TEST_LOGGING_LIMITERRORBAR( \
-    figure, name, value, ylow, yhigh, error_title, ymax, limit_title, flow_id)
-
-#define BWE_TEST_LOGGING_BASELINEBAR(figure, name, value, flow_id)
-
-// |num_flows| is an integer refering to the number of RMCAT flows in the
-// scenario.
-// Define |x_label| and |y_label| for plots.
-#define BWE_TEST_LOGGING_LABEL(figure, x_label, y_label, num_flows)
-
-#else  // BWE_TEST_LOGGING_COMPILE_TIME_ENABLE
-
-#include <map>
-#include <memory>
-#include <stack>
-#include <string>
-
-#include "webrtc/common_types.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/criticalsection.h"
-
-#define BWE_TEST_LOGGING_GLOBAL_CONTEXT(name) \
-    do { \
-      webrtc::testing::bwe::Logging::GetInstance()->SetGlobalContext(name); \
-    } while (0)
-
-#define BWE_TEST_LOGGING_GLOBAL_ENABLE(enabled) \
-    do { \
-      webrtc::testing::bwe::Logging::GetInstance()->SetGlobalEnable(enabled); \
-    } while (0)
-
-#define __BWE_TEST_LOGGING_CONTEXT_NAME(ctx, line) ctx ## line
-#define __BWE_TEST_LOGGING_CONTEXT_DECLARE(ctx, line, name, time, enabled) \
-    webrtc::testing::bwe::Logging::Context \
-        __BWE_TEST_LOGGING_CONTEXT_NAME(ctx, line)(name, time, enabled)
-
-#define BWE_TEST_LOGGING_CONTEXT(name) \
-    __BWE_TEST_LOGGING_CONTEXT_DECLARE(__bwe_log_, __LINE__, name, -1, true)
-#define BWE_TEST_LOGGING_ENABLE(enabled) \
-    __BWE_TEST_LOGGING_CONTEXT_DECLARE(__bwe_log_, __LINE__, "", -1, \
-                                       static_cast<bool>(enabled))
-#define BWE_TEST_LOGGING_TIME(time) \
-    __BWE_TEST_LOGGING_CONTEXT_DECLARE(__bwe_log_, __LINE__, "", \
-                                       static_cast<int64_t>(time), true)
-
-#define BWE_TEST_LOGGING_LOG1(name, format, _1) \
-    do { \
-      BWE_TEST_LOGGING_CONTEXT(name); \
-      webrtc::testing::bwe::Logging::GetInstance()->Log(format, _1); \
-    } while (0)
-#define BWE_TEST_LOGGING_LOG2(name, format, _1, _2) \
-    do { \
-      BWE_TEST_LOGGING_CONTEXT(name); \
-      webrtc::testing::bwe::Logging::GetInstance()->Log(format, _1, _2); \
-    } while (0)
-#define BWE_TEST_LOGGING_LOG3(name, format, _1, _2, _3) \
-    do { \
-      BWE_TEST_LOGGING_CONTEXT(name); \
-      webrtc::testing::bwe::Logging::GetInstance()->Log(format, _1, _2, _3); \
-    } while (0)
-#define BWE_TEST_LOGGING_LOG4(name, format, _1, _2, _3, _4) \
-    do { \
-      BWE_TEST_LOGGING_CONTEXT(name); \
-      webrtc::testing::bwe::Logging::GetInstance()->Log(format, _1, _2, _3, \
-                                                        _4); \
-    } while (0)
-#define BWE_TEST_LOGGING_LOG5(name, format, _1, _2, _3, _4, _5) \
-    do {\
-      BWE_TEST_LOGGING_CONTEXT(name); \
-      webrtc::testing::bwe::Logging::GetInstance()->Log(format, _1, _2, _3, \
-                                                        _4, _5); \
-    } while (0)
-
-#define BWE_TEST_LOGGING_PLOT(figure, name, time, value)                     \
-  do {                                                                       \
-    __BWE_TEST_LOGGING_CONTEXT_DECLARE(__bwe_log_, __PLOT__, name,           \
-                                       static_cast<int64_t>(time), true);    \
-    webrtc::testing::bwe::Logging::GetInstance()->Plot(figure, name, value); \
-  } while (0)
-
-#define BWE_TEST_LOGGING_PLOT_WITH_NAME(figure, name, time, value, alg_name) \
-  do {                                                                       \
-    __BWE_TEST_LOGGING_CONTEXT_DECLARE(__bwe_log_, __PLOT__, name,           \
-                                       static_cast<int64_t>(time), true);    \
-    webrtc::testing::bwe::Logging::GetInstance()->Plot(figure, name, value,  \
-                                                       alg_name);            \
-  } while (0)
-
-#define BWE_TEST_LOGGING_PLOT_WITH_SSRC(figure, name, time, value, ssrc)    \
-  do {                                                                      \
-    __BWE_TEST_LOGGING_CONTEXT_DECLARE(__bwe_log_, __PLOT__, name,          \
-                                       static_cast<int64_t>(time), true);   \
-    webrtc::testing::bwe::Logging::GetInstance()->Plot(figure, name, value, \
-                                                       ssrc);               \
-  } while (0)
-
-#define BWE_TEST_LOGGING_PLOT_WITH_NAME_AND_SSRC(figure, name, time, value, \
-                                                 ssrc, alg_name)            \
-  do {                                                                      \
-    __BWE_TEST_LOGGING_CONTEXT_DECLARE(__bwe_log_, __PLOT__, name,          \
-                                       static_cast<int64_t>(time), true);   \
-    webrtc::testing::bwe::Logging::GetInstance()->Plot(figure, name, value, \
-                                                       ssrc, alg_name);     \
-  } while (0)
-
-#define BWE_TEST_LOGGING_BAR(figure, name, value, flow_id)                     \
-  do {                                                                         \
-    BWE_TEST_LOGGING_CONTEXT(name);                                            \
-    webrtc::testing::bwe::Logging::GetInstance()->PlotBar(figure, name, value, \
-                                                          flow_id);            \
-  } while (0)
-
-#define BWE_TEST_LOGGING_BASELINEBAR(figure, name, value, flow_id) \
-  do {                                                             \
-    BWE_TEST_LOGGING_CONTEXT(name);                                \
-    webrtc::testing::bwe::Logging::GetInstance()->PlotBaselineBar( \
-        figure, name, value, flow_id);                             \
-  } while (0)
-
-#define BWE_TEST_LOGGING_ERRORBAR(figure, name, value, ylow, yhigh, title, \
-                                  flow_id)                                 \
-  do {                                                                     \
-    BWE_TEST_LOGGING_CONTEXT(name);                                        \
-    webrtc::testing::bwe::Logging::GetInstance()->PlotErrorBar(            \
-        figure, name, value, ylow, yhigh, title, flow_id);                 \
-  } while (0)
-
-#define BWE_TEST_LOGGING_LIMITERRORBAR(                                        \
-    figure, name, value, ylow, yhigh, error_title, ymax, limit_title, flow_id) \
-  do {                                                                         \
-    BWE_TEST_LOGGING_CONTEXT(name);                                            \
-    webrtc::testing::bwe::Logging::GetInstance()->PlotLimitErrorBar(           \
-        figure, name, value, ylow, yhigh, error_title, ymax, limit_title,      \
-        flow_id);                                                              \
-  } while (0)
-
-#define BWE_TEST_LOGGING_LABEL(figure, title, y_label, num_flows) \
-  do {                                                            \
-    BWE_TEST_LOGGING_CONTEXT(title);                              \
-    webrtc::testing::bwe::Logging::GetInstance()->PlotLabel(      \
-        figure, title, y_label, num_flows);                       \
-  } while (0)
-
-namespace webrtc {
-namespace testing {
-namespace bwe {
-
-class Logging {
- public:
-  class Context {
-   public:
-    Context(uint32_t name, int64_t timestamp_ms, bool enabled);
-    Context(const std::string& name, int64_t timestamp_ms, bool enabled);
-    Context(const char* name, int64_t timestamp_ms, bool enabled);
-    ~Context();
-   private:
-    RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(Context);
-  };
-
-  static Logging* GetInstance();
-
-  void SetGlobalContext(uint32_t name);
-  void SetGlobalContext(const std::string& name);
-  void SetGlobalContext(const char* name);
-  void SetGlobalEnable(bool enabled);
-
-  void Log(const char format[], ...);
-  void Plot(int figure, const std::string& name, double value);
-  void Plot(int figure,
-            const std::string& name,
-            double value,
-            const std::string& alg_name);
-  void Plot(int figure, const std::string& name, double value, uint32_t ssrc);
-  void Plot(int figure,
-            const std::string& name,
-            double value,
-            uint32_t ssrc,
-            const std::string& alg_name);
-  void PlotBar(int figure, const std::string& name, double value, int flow_id);
-  void PlotBaselineBar(int figure,
-                       const std::string& name,
-                       double value,
-                       int flow_id);
-  void PlotErrorBar(int figure,
-                    const std::string& name,
-                    double value,
-                    double ylow,
-                    double yhigh,
-                    const std::string& error_title,
-                    int flow_id);
-
-  void PlotLimitErrorBar(int figure,
-                         const std::string& name,
-                         double value,
-                         double ylow,
-                         double yhigh,
-                         const std::string& error_title,
-                         double ymax,
-                         const std::string& limit_title,
-                         int flow_id);
-  void PlotLabel(int figure,
-                 const std::string& title,
-                 const std::string& y_label,
-                 int num_flows);
-
- private:
-  struct State {
-    State();
-    State(const std::string& new_tag, int64_t timestamp_ms, bool enabled);
-    void MergePrevious(const State& previous);
-
-    std::string tag;
-    int64_t timestamp_ms;
-    bool enabled;
-  };
-  struct ThreadState {
-    State global_state;
-    std::stack<State> stack;
-  };
-  typedef std::map<uint32_t, ThreadState> ThreadMap;
-
-  Logging();
-  void PushState(const std::string& append_to_tag, int64_t timestamp_ms,
-                 bool enabled);
-  void PopState();
-
-  static Logging g_Logging;
-  rtc::CriticalSection crit_sect_;
-  ThreadMap thread_map_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(Logging);
-};
-}  // namespace bwe
-}  // namespace testing
-}  // namespace webrtc
-
-#endif  // BWE_TEST_LOGGING_COMPILE_TIME_ENABLE
-#endif  // WEBRTC_MODULES_REMOTE_BITRATE_ESTIMATOR_TEST_BWE_TEST_LOGGING_H_
diff --git a/modules/remote_bitrate_estimator/test/bwe_unittest.cc b/modules/remote_bitrate_estimator/test/bwe_unittest.cc
deleted file mode 100644
index 3033726..0000000
--- a/modules/remote_bitrate_estimator/test/bwe_unittest.cc
+++ /dev/null
@@ -1,394 +0,0 @@
-/*
- *  Copyright (c) 2015 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/remote_bitrate_estimator/test/bwe.h"
-
-#include <vector>
-
-#include "webrtc/rtc_base/arraysize.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-namespace testing {
-namespace bwe {
-
-const int kSetCapacity = 1000;
-
-class LinkedSetTest : public ::testing::Test {
- public:
-  LinkedSetTest() : linked_set_(kSetCapacity) {}
-
-  ~LinkedSetTest() {}
-
- protected:
-  LinkedSet linked_set_;
-};
-
-TEST_F(LinkedSetTest, EmptySet) {
-  EXPECT_EQ(linked_set_.OldestSeqNumber(), 0);
-  EXPECT_EQ(linked_set_.NewestSeqNumber(), 0);
-}
-
-TEST_F(LinkedSetTest, SinglePacket) {
-  const uint16_t kSeqNumber = 1;  // Arbitrary.
-  // Other parameters don't matter here.
-  linked_set_.Insert(kSeqNumber, 0, 0, 0);
-
-  EXPECT_EQ(linked_set_.OldestSeqNumber(), kSeqNumber);
-  EXPECT_EQ(linked_set_.NewestSeqNumber(), kSeqNumber);
-}
-
-TEST_F(LinkedSetTest, MultiplePackets) {
-  const uint16_t kNumberPackets = 100;
-
-  std::vector<uint16_t> sequence_numbers;
-  for (size_t i = 0; i < kNumberPackets; ++i) {
-    sequence_numbers.push_back(static_cast<uint16_t>(i + 1));
-  }
-  random_shuffle(sequence_numbers.begin(), sequence_numbers.end());
-
-  for (size_t i = 0; i < kNumberPackets; ++i) {
-    // Other parameters don't matter here.
-    linked_set_.Insert(static_cast<uint16_t>(i), 0, 0, 0);
-  }
-
-  // Packets arriving out of order should not affect the following values:
-  EXPECT_EQ(linked_set_.OldestSeqNumber(), 0);
-  EXPECT_EQ(linked_set_.NewestSeqNumber(), kNumberPackets - 1);
-}
-
-TEST_F(LinkedSetTest, Overflow) {
-  const int kFirstSeqNumber = -100;
-  const int kLastSeqNumber = 100;
-
-  for (int i = kFirstSeqNumber; i <= kLastSeqNumber; ++i) {
-    // Other parameters don't matter here.
-    linked_set_.Insert(static_cast<uint16_t>(i), 0, 0, 0);
-  }
-
-  // Packets arriving out of order should not affect the following values:
-  EXPECT_EQ(linked_set_.OldestSeqNumber(),
-            static_cast<uint16_t>(kFirstSeqNumber));
-  EXPECT_EQ(linked_set_.NewestSeqNumber(),
-            static_cast<uint16_t>(kLastSeqNumber));
-}
-
-class SequenceNumberOlderThanTest : public ::testing::Test {
- public:
-  SequenceNumberOlderThanTest() {}
-  ~SequenceNumberOlderThanTest() {}
-
- protected:
-  SequenceNumberOlderThan comparator_;
-};
-
-TEST_F(SequenceNumberOlderThanTest, Operator) {
-  // Operator()(x, y) returns true <==> y is newer than x.
-  EXPECT_TRUE(comparator_.operator()(0x0000, 0x0001));
-  EXPECT_TRUE(comparator_.operator()(0x0001, 0x1000));
-  EXPECT_FALSE(comparator_.operator()(0x0001, 0x0000));
-  EXPECT_FALSE(comparator_.operator()(0x0002, 0x0002));
-  EXPECT_TRUE(comparator_.operator()(0xFFF6, 0x000A));
-  EXPECT_FALSE(comparator_.operator()(0x000A, 0xFFF6));
-  EXPECT_TRUE(comparator_.operator()(0x0000, 0x8000));
-  EXPECT_FALSE(comparator_.operator()(0x8000, 0x0000));
-}
-
-class LossAccountTest : public ::testing::Test {
- public:
-  LossAccountTest() {}
-  ~LossAccountTest() {}
-
- protected:
-  LossAccount loss_account_;
-};
-
-TEST_F(LossAccountTest, Operations) {
-  const size_t kTotal = 100;  // Arbitrary values.
-  const size_t kLost = 10;
-
-  LossAccount rhs(kTotal, kLost);
-
-  loss_account_.Add(rhs);
-  EXPECT_EQ(loss_account_.num_total, kTotal);
-  EXPECT_EQ(loss_account_.num_lost, kLost);
-  EXPECT_NEAR(loss_account_.LossRatio(), static_cast<float>(kLost) / kTotal,
-              0.001f);
-
-  loss_account_.Subtract(rhs);
-  EXPECT_EQ(loss_account_.num_total, 0UL);
-  EXPECT_EQ(loss_account_.num_lost, 0UL);
-  EXPECT_NEAR(loss_account_.LossRatio(), 0.0f, 0.001f);
-}
-
-class BweReceiverTest : public ::testing::Test {
- public:
-  BweReceiverTest() : bwe_receiver_(kFlowId) {}
-  ~BweReceiverTest() {}
-
- protected:
-  const int kFlowId = 1;  // Arbitrary.
-  BweReceiver bwe_receiver_;
-};
-
-TEST_F(BweReceiverTest, ReceivingRateNoPackets) {
-  EXPECT_EQ(bwe_receiver_.RecentKbps(), static_cast<size_t>(0));
-}
-
-TEST_F(BweReceiverTest, ReceivingRateSinglePacket) {
-  const size_t kPayloadSizeBytes = 500 * 1000;
-  const int64_t kSendTimeUs = 300 * 1000;
-  const int64_t kArrivalTimeMs = kSendTimeUs / 1000 + 100;
-  const uint16_t kSequenceNumber = 1;
-  const int64_t kTimeWindowMs = BweReceiver::kReceivingRateTimeWindowMs;
-
-  const MediaPacket media_packet(kFlowId, kSendTimeUs, kPayloadSizeBytes,
-                                 kSequenceNumber);
-  bwe_receiver_.ReceivePacket(kArrivalTimeMs, media_packet);
-
-  const size_t kReceivingRateKbps = 8 * kPayloadSizeBytes / kTimeWindowMs;
-
-  EXPECT_NEAR(bwe_receiver_.RecentKbps(), kReceivingRateKbps,
-              static_cast<float>(kReceivingRateKbps) / 100.0f);
-}
-
-TEST_F(BweReceiverTest, ReceivingRateSmallPackets) {
-  const size_t kPayloadSizeBytes = 100 * 1000;
-  const int64_t kTimeGapMs = 50;  // Between each packet.
-  const int64_t kOneWayDelayMs = 50;
-
-  for (int i = 1; i < 50; ++i) {
-    int64_t send_time_us = i * kTimeGapMs * 1000;
-    int64_t arrival_time_ms = send_time_us / 1000 + kOneWayDelayMs;
-    uint16_t sequence_number = i;
-    const MediaPacket media_packet(kFlowId, send_time_us, kPayloadSizeBytes,
-                                   sequence_number);
-    bwe_receiver_.ReceivePacket(arrival_time_ms, media_packet);
-  }
-
-  const size_t kReceivingRateKbps = 8 * kPayloadSizeBytes / kTimeGapMs;
-  EXPECT_NEAR(bwe_receiver_.RecentKbps(), kReceivingRateKbps,
-              static_cast<float>(kReceivingRateKbps) / 100.0f);
-}
-
-TEST_F(BweReceiverTest, PacketLossNoPackets) {
-  EXPECT_EQ(bwe_receiver_.RecentPacketLossRatio(), 0.0f);
-}
-
-TEST_F(BweReceiverTest, PacketLossSinglePacket) {
-  const MediaPacket media_packet(kFlowId, 0, 0, 0);
-  bwe_receiver_.ReceivePacket(0, media_packet);
-  EXPECT_EQ(bwe_receiver_.RecentPacketLossRatio(), 0.0f);
-}
-
-TEST_F(BweReceiverTest, PacketLossContiguousPackets) {
-  const int64_t kTimeWindowMs = BweReceiver::kPacketLossTimeWindowMs;
-  size_t set_capacity = bwe_receiver_.GetSetCapacity();
-
-  for (int i = 0; i < 10; ++i) {
-    uint16_t sequence_number = static_cast<uint16_t>(i);
-    // Sequence_number and flow_id are the only members that matter here.
-    const MediaPacket media_packet(kFlowId, 0, 0, sequence_number);
-    // Arrival time = 0, all packets will be considered.
-    bwe_receiver_.ReceivePacket(0, media_packet);
-  }
-  EXPECT_EQ(bwe_receiver_.RecentPacketLossRatio(), 0.0f);
-
-  for (int i = 30; i > 20; i--) {
-    uint16_t sequence_number = static_cast<uint16_t>(i);
-    // Sequence_number and flow_id are the only members that matter here.
-    const MediaPacket media_packet(kFlowId, 0, 0, sequence_number);
-    // Only the packets sent in this for loop will be considered.
-    bwe_receiver_.ReceivePacket(2 * kTimeWindowMs, media_packet);
-  }
-  EXPECT_EQ(bwe_receiver_.RecentPacketLossRatio(), 0.0f);
-
-  // Should handle uint16_t overflow.
-  for (int i = 0xFFFF - 10; i < 0xFFFF + 10; ++i) {
-    uint16_t sequence_number = static_cast<uint16_t>(i);
-    const MediaPacket media_packet(kFlowId, 0, 0, sequence_number);
-    // Only the packets sent in this for loop will be considered.
-    bwe_receiver_.ReceivePacket(4 * kTimeWindowMs, media_packet);
-  }
-  EXPECT_EQ(bwe_receiver_.RecentPacketLossRatio(), 0.0f);
-
-  // Should handle set overflow.
-  for (int i = 0; i < set_capacity * 1.5; ++i) {
-    uint16_t sequence_number = static_cast<uint16_t>(i);
-    const MediaPacket media_packet(kFlowId, 0, 0, sequence_number);
-    // Only the packets sent in this for loop will be considered.
-    bwe_receiver_.ReceivePacket(6 * kTimeWindowMs, media_packet);
-  }
-  EXPECT_EQ(bwe_receiver_.RecentPacketLossRatio(), 0.0f);
-}
-
-// Should handle duplicates.
-TEST_F(BweReceiverTest, PacketLossDuplicatedPackets) {
-  const int64_t kTimeWindowMs = BweReceiver::kPacketLossTimeWindowMs;
-
-  for (int i = 0; i < 10; ++i) {
-    const MediaPacket media_packet(kFlowId, 0, 0, 0);
-    // Arrival time = 0, all packets will be considered.
-    bwe_receiver_.ReceivePacket(0, media_packet);
-  }
-  EXPECT_EQ(bwe_receiver_.RecentPacketLossRatio(), 0.0f);
-
-  // Missing the element 5.
-  const uint16_t kSequenceNumbers[] = {1, 2, 3, 4, 6, 7, 8};
-  const int kNumPackets = arraysize(kSequenceNumbers);
-
-  // Insert each sequence number twice.
-  for (int i = 0; i < 2; ++i) {
-    for (int j = 0; j < kNumPackets; j++) {
-      const MediaPacket media_packet(kFlowId, 0, 0, kSequenceNumbers[j]);
-      // Only the packets sent in this for loop will be considered.
-      bwe_receiver_.ReceivePacket(2 * kTimeWindowMs, media_packet);
-    }
-  }
-
-  EXPECT_NEAR(bwe_receiver_.RecentPacketLossRatio(), 1.0f / (kNumPackets + 1),
-              0.1f / (kNumPackets + 1));
-}
-
-TEST_F(BweReceiverTest, PacketLossLakingPackets) {
-  size_t set_capacity = bwe_receiver_.GetSetCapacity();
-  EXPECT_LT(set_capacity, static_cast<size_t>(0xFFFF));
-
-  // Missing every other packet.
-  for (size_t i = 0; i < set_capacity; ++i) {
-    if ((i & 1) == 0) {  // Only even sequence numbers.
-      uint16_t sequence_number = static_cast<uint16_t>(i);
-      const MediaPacket media_packet(kFlowId, 0, 0, sequence_number);
-      // Arrival time = 0, all packets will be considered.
-      bwe_receiver_.ReceivePacket(0, media_packet);
-    }
-  }
-  EXPECT_NEAR(bwe_receiver_.RecentPacketLossRatio(), 0.5f, 0.01f);
-}
-
-TEST_F(BweReceiverTest, PacketLossLakingFewPackets) {
-  size_t set_capacity = bwe_receiver_.GetSetCapacity();
-  EXPECT_LT(set_capacity, static_cast<size_t>(0xFFFF));
-
-  const int kPeriod = 100;
-  // Missing one for each kPeriod packets.
-  for (size_t i = 0; i < set_capacity; ++i) {
-    if ((i % kPeriod) != 0) {
-      uint16_t sequence_number = static_cast<uint16_t>(i);
-      const MediaPacket media_packet(kFlowId, 0, 0, sequence_number);
-      // Arrival time = 0, all packets will be considered.
-      bwe_receiver_.ReceivePacket(0, media_packet);
-    }
-  }
-  EXPECT_NEAR(bwe_receiver_.RecentPacketLossRatio(), 1.0f / kPeriod,
-              0.1f / kPeriod);
-}
-
-// Packet's sequence numbers greatly apart, expect high loss.
-TEST_F(BweReceiverTest, PacketLossWideGap) {
-  const int64_t kTimeWindowMs = BweReceiver::kPacketLossTimeWindowMs;
-
-  const MediaPacket media_packet1(0, 0, 0, 1);
-  const MediaPacket media_packet2(0, 0, 0, 1000);
-  // Only these two packets will be considered.
-  bwe_receiver_.ReceivePacket(0, media_packet1);
-  bwe_receiver_.ReceivePacket(0, media_packet2);
-  EXPECT_NEAR(bwe_receiver_.RecentPacketLossRatio(), 0.998f, 0.0001f);
-
-  const MediaPacket media_packet3(0, 0, 0, 0);
-  const MediaPacket media_packet4(0, 0, 0, 0x8000);
-  // Only these two packets will be considered.
-  bwe_receiver_.ReceivePacket(2 * kTimeWindowMs, media_packet3);
-  bwe_receiver_.ReceivePacket(2 * kTimeWindowMs, media_packet4);
-  EXPECT_NEAR(bwe_receiver_.RecentPacketLossRatio(), 0.99994f, 0.00001f);
-}
-
-// Packets arriving unordered should not be counted as losted.
-TEST_F(BweReceiverTest, PacketLossUnorderedPackets) {
-  size_t num_packets = bwe_receiver_.GetSetCapacity() / 2;
-  std::vector<uint16_t> sequence_numbers;
-
-  for (size_t i = 0; i < num_packets; ++i) {
-    sequence_numbers.push_back(static_cast<uint16_t>(i + 1));
-  }
-
-  random_shuffle(sequence_numbers.begin(), sequence_numbers.end());
-
-  for (size_t i = 0; i < num_packets; ++i) {
-    const MediaPacket media_packet(kFlowId, 0, 0, sequence_numbers[i]);
-    // Arrival time = 0, all packets will be considered.
-    bwe_receiver_.ReceivePacket(0, media_packet);
-  }
-
-  EXPECT_EQ(bwe_receiver_.RecentPacketLossRatio(), 0.0f);
-}
-
-TEST_F(BweReceiverTest, RecentKbps) {
-  EXPECT_EQ(bwe_receiver_.RecentKbps(), 0U);
-
-  const size_t kPacketSizeBytes = 1200;
-  const int kNumPackets = 100;
-
-  double window_size_s = bwe_receiver_.BitrateWindowS();
-
-  // Receive packets at the same time.
-  for (int i = 0; i < kNumPackets; ++i) {
-    MediaPacket packet(kFlowId, 0L, kPacketSizeBytes, static_cast<uint16_t>(i));
-    bwe_receiver_.ReceivePacket(0, packet);
-  }
-
-  EXPECT_NEAR(bwe_receiver_.RecentKbps(),
-              (8 * kNumPackets * kPacketSizeBytes) / (1000 * window_size_s),
-              10);
-
-  int64_t time_gap_ms =
-      2 * 1000 * window_size_s;  // Larger than rate_counter time window.
-
-  MediaPacket packet(kFlowId, time_gap_ms * 1000, kPacketSizeBytes,
-                     static_cast<uint16_t>(kNumPackets));
-  bwe_receiver_.ReceivePacket(time_gap_ms, packet);
-
-  EXPECT_NEAR(bwe_receiver_.RecentKbps(),
-              (8 * kPacketSizeBytes) / (1000 * window_size_s), 10);
-}
-
-TEST_F(BweReceiverTest, Loss) {
-  EXPECT_NEAR(bwe_receiver_.GlobalReceiverPacketLossRatio(), 0.0f, 0.001f);
-
-  LossAccount loss_account = bwe_receiver_.LinkedSetPacketLossRatio();
-  EXPECT_NEAR(loss_account.LossRatio(), 0.0f, 0.001f);
-
-  // Insert packets 1-50 and 151-200;
-  for (int i = 1; i <= 200; ++i) {
-    // Packet size and timestamp do not matter here.
-    MediaPacket packet(kFlowId, 0L, 0UL, static_cast<uint16_t>(i));
-    bwe_receiver_.ReceivePacket(0, packet);
-    if (i == 50) {
-      i += 100;
-    }
-  }
-
-  loss_account = bwe_receiver_.LinkedSetPacketLossRatio();
-  EXPECT_NEAR(loss_account.LossRatio(), 0.5f, 0.001f);
-
-  bwe_receiver_.RelieveSetAndUpdateLoss();
-  EXPECT_EQ(bwe_receiver_.received_packets_.size(), 100U / 10);
-
-  // No packet loss within the preserved packets.
-  loss_account = bwe_receiver_.LinkedSetPacketLossRatio();
-  EXPECT_NEAR(loss_account.LossRatio(), 0.0f, 0.001f);
-
-  // RelieveSetAndUpdateLoss automatically updates loss account.
-  EXPECT_NEAR(bwe_receiver_.GlobalReceiverPacketLossRatio(), 0.5f, 0.001f);
-}
-
-}  // namespace bwe
-}  // namespace testing
-}  // namespace webrtc
diff --git a/modules/remote_bitrate_estimator/test/estimators/bbr.cc b/modules/remote_bitrate_estimator/test/estimators/bbr.cc
deleted file mode 100644
index a8444b4..0000000
--- a/modules/remote_bitrate_estimator/test/estimators/bbr.cc
+++ /dev/null
@@ -1,553 +0,0 @@
-/*
- *  Copyright (c) 2017 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/remote_bitrate_estimator/test/estimators/bbr.h"
-
-#include <stdlib.h>
-#include <algorithm>
-
-#include "webrtc/modules/remote_bitrate_estimator/test/estimators/congestion_window.h"
-#include "webrtc/modules/remote_bitrate_estimator/test/estimators/max_bandwidth_filter.h"
-#include "webrtc/modules/remote_bitrate_estimator/test/estimators/min_rtt_filter.h"
-
-namespace webrtc {
-namespace testing {
-namespace bwe {
-namespace {
-const int kFeedbackIntervalsMs = 5;
-// BBR uses this value to double sending rate each round trip. Design document
-// suggests using this value.
-const float kHighGain = 2.885f;
-// BBR uses this value to drain queues created during STARTUP in one round trip
-// time.
-const float kDrainGain = 1 / kHighGain;
-// kStartupGrowthTarget and kMaxRoundsWithoutGrowth are chosen from
-// experiments, according to the design document.
-const float kStartupGrowthTarget = 1.25f;
-const int kMaxRoundsWithoutGrowth = 3;
-// Pacing gain values for Probe Bandwidth mode.
-const float kPacingGain[] = {1.1f, 0.9f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f};
-const size_t kGainCycleLength = sizeof(kPacingGain) / sizeof(kPacingGain[0]);
-// Least number of rounds PROBE_RTT should last.
-const int kProbeRttDurationRounds = 1;
-// The least amount of milliseconds PROBE_RTT mode should last.
-const int kProbeRttDurationMs = 200;
-// Gain value for congestion window for assuming that network has no queues.
-const float kTargetCongestionWindowGain = 1;
-// Gain value for congestion window in PROBE_BW mode. In theory it should be
-// equal to 1, but in practice because of delayed acks and the way networks
-// work, it is nice to have some extra room in congestion window for full link
-// utilization. Value chosen by observations on different tests.
-const float kCruisingCongestionWindowGain = 2;
-// Pacing gain specific for Recovery mode. Chosen by experiments in simulation
-// tool.
-const float kRecoveryPacingGain = 0.5f;
-// Congestion window gain specific for Recovery mode. Chosen by experiments in
-// simulation tool.
-const float kRecoveryCongestionWindowGain = 1.5f;
-// Number of rounds over which average RTT is stored for Recovery mode.
-const size_t kPastRttsFilterSize = 1;
-// Threshold to assume average RTT has increased for a round. Chosen by
-// experiments in simulation tool.
-const float kRttIncreaseThreshold = 3;
-// Threshold to assume average RTT has decreased for a round. Chosen by
-// experiments in simulation tool.
-const float kRttDecreaseThreshold = 1.5f;
-// If |kCongestionWindowThreshold| of the congestion window is filled up, tell
-// encoder to stop, to avoid building sender side queues.
-const float kCongestionWindowThreshold = 0.69f;
-// Duration we send at |kDefaultRatebps| in order to ensure BBR has data to work
-// with.
-const int64_t kDefaultDurationMs = 200;
-const int64_t kDefaultRatebps = 300000;
-// Congestion window gain for PROBE_RTT mode.
-const float kProbeRttCongestionWindowGain = 0.65f;
-// We need to be sure that data inflight has increased by at least
-// |kTargetCongestionWindowGainForHighGain| compared to the congestion window in
-// PROBE_BW's high gain phase, to make ramp-up quicker. As high gain value has
-// been decreased from 1.25 to 1.1 we need to make
-// |kTargetCongestionWindowGainForHighGain| slightly higher than the actual high
-// gain value.
-const float kTargetCongestionWindowGainForHighGain = 1.15f;
-// Encoder rate gain value for PROBE_RTT mode.
-const float kEncoderRateGainForProbeRtt = 0.1f;
-}  // namespace
-
-BbrBweSender::BbrBweSender(BitrateObserver* observer, Clock* clock)
-    : BweSender(0),
-      observer_(observer),
-      clock_(clock),
-      mode_(STARTUP),
-      max_bandwidth_filter_(new MaxBandwidthFilter()),
-      min_rtt_filter_(new MinRttFilter()),
-      congestion_window_(new CongestionWindow()),
-      rand_(new Random(time(NULL))),
-      round_count_(0),
-      round_trip_end_(0),
-      full_bandwidth_reached_(false),
-      cycle_start_time_ms_(0),
-      cycle_index_(0),
-      bytes_acked_(0),
-      probe_rtt_start_time_ms_(0),
-      minimum_congestion_window_start_time_ms_(0),
-      minimum_congestion_window_start_round_(0),
-      bytes_sent_(0),
-      last_packet_sent_sequence_number_(0),
-      last_packet_acked_sequence_number_(0),
-      last_packet_ack_time_(0),
-      last_packet_send_time_(0),
-      pacing_rate_bps_(0),
-      last_packet_send_time_during_high_gain_ms_(-1),
-      data_sent_before_high_gain_started_bytes_(-1),
-      data_sent_before_high_gain_ended_bytes_(-1),
-      first_packet_ack_time_during_high_gain_ms_(-1),
-      last_packet_ack_time_during_high_gain_ms_(-1),
-      data_acked_before_high_gain_started_bytes_(-1),
-      data_acked_before_high_gain_ended_bytes_(-1),
-      first_packet_seq_num_during_high_gain_(0),
-      last_packet_seq_num_during_high_gain_(0),
-      high_gain_over_(false),
-      packet_stats_(),
-      past_rtts_() {
-  // Initially enter Startup mode.
-  EnterStartup();
-}
-
-BbrBweSender::~BbrBweSender() {}
-
-int BbrBweSender::GetFeedbackIntervalMs() const {
-  return kFeedbackIntervalsMs;
-}
-
-void BbrBweSender::CalculatePacingRate() {
-  pacing_rate_bps_ =
-      max_bandwidth_filter_->max_bandwidth_estimate_bps() * pacing_gain_;
-}
-
-// Declare lost packets as acked.
-void BbrBweSender::HandleLoss(uint64_t last_acked_packet,
-                              uint64_t recently_acked_packet) {
-  for (uint16_t i = last_acked_packet + 1;
-       AheadOrAt<uint16_t>(recently_acked_packet - 1, i); i++) {
-    congestion_window_->AckReceived(packet_stats_[i].payload_size_bytes);
-    observer_->OnBytesAcked(packet_stats_[i].payload_size_bytes);
-  }
-}
-
-void BbrBweSender::AddToPastRtts(int64_t rtt_sample_ms) {
-  uint64_t last_round = 0;
-  if (!past_rtts_.empty())
-    last_round = past_rtts_.back().round;
-
-  // Try to add the sample to the last round.
-  if (last_round == round_count_ && !past_rtts_.empty()) {
-    past_rtts_.back().sum_of_rtts_ms += rtt_sample_ms;
-    past_rtts_.back().num_samples++;
-  } else {
-    // If the sample belongs to a new round, keep number of rounds in the window
-    // equal to |kPastRttsFilterSize|.
-    if (past_rtts_.size() == kPastRttsFilterSize)
-      past_rtts_.pop_front();
-    past_rtts_.push_back(
-        BbrBweSender::AverageRtt(rtt_sample_ms, 1, round_count_));
-  }
-}
-
-void BbrBweSender::GiveFeedback(const FeedbackPacket& feedback) {
-  int64_t now_ms = clock_->TimeInMilliseconds();
-  last_packet_ack_time_ = now_ms;
-  const BbrBweFeedback& fb = static_cast<const BbrBweFeedback&>(feedback);
-  // feedback_vector holds values of acknowledged packets' sequence numbers.
-  const std::vector<uint16_t>& feedback_vector = fb.packet_feedback_vector();
-  // Go through all the packets acked, update variables/containers accordingly.
-  for (uint16_t sequence_number : feedback_vector) {
-    // Completing packet information with a recently received ack.
-    PacketStats* packet = &packet_stats_[sequence_number];
-    bytes_acked_ += packet->payload_size_bytes;
-    packet->data_sent_bytes = bytes_sent_;
-    packet->last_sent_packet_send_time_ms = last_packet_send_time_;
-    packet->data_acked_bytes = bytes_acked_;
-    packet->ack_time_ms = now_ms;
-    // Logic specific to applying "bucket" to high gain, in order to have
-    // quicker ramp-up. We check if we started receiving acks for the packets
-    // sent during high gain phase.
-    if (packet->sequence_number == first_packet_seq_num_during_high_gain_) {
-      first_packet_ack_time_during_high_gain_ms_ = now_ms;
-      // Substracting half of the packet's size to avoid overestimation.
-      data_acked_before_high_gain_started_bytes_ =
-          bytes_acked_ - packet->payload_size_bytes / 2;
-    }
-    // If the last packet of high gain phase has been acked, high gain phase is
-    // over.
-    if (packet->sequence_number == last_packet_seq_num_during_high_gain_) {
-      last_packet_ack_time_during_high_gain_ms_ = now_ms;
-      data_acked_before_high_gain_ended_bytes_ =
-          bytes_acked_ - packet->payload_size_bytes / 2;
-      high_gain_over_ = true;
-    }
-    observer_->OnBytesAcked(packet->payload_size_bytes);
-    congestion_window_->AckReceived(packet->payload_size_bytes);
-    HandleLoss(last_packet_acked_sequence_number_, packet->sequence_number);
-    last_packet_acked_sequence_number_ = packet->sequence_number;
-    // Logic for wrapping sequence numbers. If round started with packet number
-    // x, it can never end on y, if x > y. That could happen when sequence
-    // numbers are wrapped after some point.
-    if (packet->sequence_number == 0)
-      round_trip_end_ = 0;
-  }
-  // Check if new round started for the connection.
-  bool new_round_started = false;
-  if (!feedback_vector.empty()) {
-    if (last_packet_acked_sequence_number_ > round_trip_end_) {
-      new_round_started = true;
-      round_count_++;
-      round_trip_end_ = last_packet_sent_sequence_number_;
-    }
-  }
-  TryEnteringProbeRtt(now_ms);
-  UpdateBandwidthAndMinRtt(now_ms, feedback_vector, bytes_acked_);
-  if (new_round_started && !full_bandwidth_reached_) {
-    full_bandwidth_reached_ = max_bandwidth_filter_->FullBandwidthReached(
-        kStartupGrowthTarget, kMaxRoundsWithoutGrowth);
-  }
-  switch (mode_) {
-    break;
-    case STARTUP:
-      TryExitingStartup();
-      break;
-    case DRAIN:
-      TryExitingDrain(now_ms);
-      break;
-    case PROBE_BW:
-      TryUpdatingCyclePhase(now_ms);
-      break;
-    case PROBE_RTT:
-      TryExitingProbeRtt(now_ms, round_count_);
-      break;
-    case RECOVERY:
-      TryExitingRecovery(new_round_started);
-      break;
-  }
-  TryEnteringRecovery(new_round_started);  // Comment this line to disable
-                                           // entering Recovery mode.
-  for (uint16_t f : feedback_vector)
-    AddToPastRtts(packet_stats_[f].ack_time_ms - packet_stats_[f].send_time_ms);
-  CalculatePacingRate();
-  size_t cwnd = congestion_window_->GetCongestionWindow(
-      mode_, max_bandwidth_filter_->max_bandwidth_estimate_bps(),
-      min_rtt_filter_->min_rtt_ms(), congestion_window_gain_);
-  // Make sure we don't get stuck when pacing_rate is 0, because of simulation
-  // tool specifics.
-  if (!pacing_rate_bps_)
-    pacing_rate_bps_ = 100;
-  BWE_TEST_LOGGING_PLOT(1, "SendRate", now_ms, pacing_rate_bps_ / 1000);
-  int64_t rate_for_pacer_bps = pacing_rate_bps_;
-  int64_t rate_for_encoder_bps = pacing_rate_bps_;
-  if (congestion_window_->data_inflight() >= cwnd * kCongestionWindowThreshold)
-    rate_for_encoder_bps = 0;
-  // We dont completely stop sending during PROBE_RTT, so we need encoder to
-  // produce something, another way of doing this would be telling encoder to
-  // stop and send padding instead of actual data.
-  if (mode_ == PROBE_RTT)
-    rate_for_encoder_bps = rate_for_pacer_bps * kEncoderRateGainForProbeRtt;
-  // Send for 300 kbps for first 200 ms, so that BBR has data to work with.
-  if (now_ms <= kDefaultDurationMs)
-    observer_->OnNetworkChanged(
-        kDefaultRatebps, kDefaultRatebps, false,
-        clock_->TimeInMicroseconds() + kFeedbackIntervalsMs * 1000, cwnd);
-  else
-    observer_->OnNetworkChanged(
-        rate_for_encoder_bps, rate_for_pacer_bps, mode_ == PROBE_RTT,
-        clock_->TimeInMicroseconds() + kFeedbackIntervalsMs * 1000, cwnd);
-}
-
-size_t BbrBweSender::TargetCongestionWindow(float gain) {
-  size_t target_congestion_window =
-      congestion_window_->GetTargetCongestionWindow(
-          max_bandwidth_filter_->max_bandwidth_estimate_bps(),
-          min_rtt_filter_->min_rtt_ms(), gain);
-  return target_congestion_window;
-}
-
-rtc::Optional<int64_t> BbrBweSender::CalculateBandwidthSample(
-    size_t data_sent_bytes,
-    int64_t send_time_delta_ms,
-    size_t data_acked_bytes,
-    int64_t ack_time_delta_ms) {
-  rtc::Optional<int64_t> bandwidth_sample;
-  if (send_time_delta_ms > 0)
-    bandwidth_sample.emplace(data_sent_bytes * 8000 / send_time_delta_ms);
-  rtc::Optional<int64_t> ack_rate;
-  if (ack_time_delta_ms > 0)
-    ack_rate.emplace(data_acked_bytes * 8000 / ack_time_delta_ms);
-  // If send rate couldn't be calculated automaticaly set |bandwidth_sample| to
-  // ack_rate.
-  if (!bandwidth_sample)
-    bandwidth_sample = ack_rate;
-  if (bandwidth_sample && ack_rate)
-    bandwidth_sample.emplace(std::min(*bandwidth_sample, *ack_rate));
-  return bandwidth_sample;
-}
-
-void BbrBweSender::AddSampleForHighGain() {
-  if (!high_gain_over_)
-    return;
-  high_gain_over_ = false;
-  // Calculate data sent/acked and time elapsed only for packets sent during
-  // high gain phase.
-  size_t data_sent_bytes = data_sent_before_high_gain_ended_bytes_ -
-                           data_sent_before_high_gain_started_bytes_;
-  int64_t send_time_delta_ms = last_packet_send_time_during_high_gain_ms_ -
-                               *first_packet_send_time_during_high_gain_ms_;
-  size_t data_acked_bytes = data_acked_before_high_gain_ended_bytes_ -
-                            data_acked_before_high_gain_started_bytes_;
-  int64_t ack_time_delta_ms = last_packet_ack_time_during_high_gain_ms_ -
-                              first_packet_ack_time_during_high_gain_ms_;
-  rtc::Optional<int64_t> bandwidth_sample = CalculateBandwidthSample(
-      data_sent_bytes, send_time_delta_ms, data_acked_bytes, ack_time_delta_ms);
-  if (bandwidth_sample)
-    max_bandwidth_filter_->AddBandwidthSample(*bandwidth_sample, round_count_);
-  first_packet_send_time_during_high_gain_ms_.reset();
-}
-
-void BbrBweSender::UpdateBandwidthAndMinRtt(
-    int64_t now_ms,
-    const std::vector<uint16_t>& feedback_vector,
-    int64_t bytes_acked) {
-  rtc::Optional<int64_t> min_rtt_sample_ms;
-  for (uint16_t f : feedback_vector) {
-    PacketStats packet = packet_stats_[f];
-    size_t data_sent_bytes =
-        packet.data_sent_bytes - packet.data_sent_before_last_sent_packet_bytes;
-    int64_t send_time_delta_ms =
-        packet.last_sent_packet_send_time_ms - packet.send_time_ms;
-    size_t data_acked_bytes = packet.data_acked_bytes -
-                              packet.data_acked_before_last_acked_packet_bytes;
-    int64_t ack_time_delta_ms =
-        packet.ack_time_ms - packet.last_acked_packet_ack_time_ms;
-    rtc::Optional<int64_t> bandwidth_sample =
-        CalculateBandwidthSample(data_sent_bytes, send_time_delta_ms,
-                                 data_acked_bytes, ack_time_delta_ms);
-    if (bandwidth_sample)
-      max_bandwidth_filter_->AddBandwidthSample(*bandwidth_sample,
-                                                round_count_);
-    // AddSampleForHighGain();  // Comment to disable bucket for high gain.
-    if (!min_rtt_sample_ms)
-      min_rtt_sample_ms.emplace(packet.ack_time_ms - packet.send_time_ms);
-    else
-      *min_rtt_sample_ms = std::min(*min_rtt_sample_ms,
-                                    packet.ack_time_ms - packet.send_time_ms);
-    BWE_TEST_LOGGING_PLOT(1, "MinRtt", now_ms,
-                          packet.ack_time_ms - packet.send_time_ms);
-  }
-  // We only feed RTT samples into the min_rtt filter which were not produced
-  // during 1.1 gain phase, to ensure they contain no queueing delay. But if the
-  // rtt sample from 1.1 gain phase improves the current estimate then we should
-  // make it as a new best estimate.
-  if (pacing_gain_ <= 1.0f || !min_rtt_filter_->min_rtt_ms() ||
-      *min_rtt_filter_->min_rtt_ms() >= *min_rtt_sample_ms)
-    min_rtt_filter_->AddRttSample(*min_rtt_sample_ms, now_ms);
-}
-
-void BbrBweSender::EnterStartup() {
-  mode_ = STARTUP;
-  pacing_gain_ = kHighGain;
-  congestion_window_gain_ = kHighGain;
-}
-
-void BbrBweSender::TryExitingStartup() {
-  if (full_bandwidth_reached_) {
-    mode_ = DRAIN;
-    pacing_gain_ = kDrainGain;
-    congestion_window_gain_ = kHighGain;
-  }
-}
-
-void BbrBweSender::TryExitingDrain(int64_t now_ms) {
-  if (congestion_window_->data_inflight() <=
-      TargetCongestionWindow(kTargetCongestionWindowGain))
-    EnterProbeBw(now_ms);
-}
-
-// Start probing with a random gain value, which is different form 0.75,
-// starting with 0.75 doesn't offer any benefits as there are no queues to be
-// drained.
-void BbrBweSender::EnterProbeBw(int64_t now_ms) {
-  mode_ = PROBE_BW;
-  congestion_window_gain_ = kCruisingCongestionWindowGain;
-  int index = rand_->Rand(kGainCycleLength - 2);
-  if (index == 1)
-    index = kGainCycleLength - 1;
-  pacing_gain_ = kPacingGain[index];
-  cycle_start_time_ms_ = now_ms;
-  cycle_index_ = index;
-}
-
-void BbrBweSender::TryUpdatingCyclePhase(int64_t now_ms) {
-  // Each phase should last rougly min_rtt ms time.
-  bool advance_cycle_phase = false;
-  if (min_rtt_filter_->min_rtt_ms())
-    advance_cycle_phase =
-        now_ms - cycle_start_time_ms_ > *min_rtt_filter_->min_rtt_ms();
-  // If BBR was probing and it couldn't increase data inflight sufficiently in
-  // one min_rtt time, continue probing. BBR design doc isn't clear about this,
-  // but condition helps in quicker ramp-up and performs better.
-  if (pacing_gain_ > 1.0 &&
-      congestion_window_->data_inflight() <
-          TargetCongestionWindow(kTargetCongestionWindowGainForHighGain))
-    advance_cycle_phase = false;
-  // If BBR has already drained queues there is no point in continuing draining
-  // phase.
-  if (pacing_gain_ < 1.0 &&
-      congestion_window_->data_inflight() <= TargetCongestionWindow(1))
-    advance_cycle_phase = true;
-  if (advance_cycle_phase) {
-    cycle_index_++;
-    cycle_index_ %= kGainCycleLength;
-    pacing_gain_ = kPacingGain[cycle_index_];
-    cycle_start_time_ms_ = now_ms;
-  }
-}
-
-void BbrBweSender::TryEnteringProbeRtt(int64_t now_ms) {
-  if (min_rtt_filter_->MinRttExpired(now_ms) && mode_ != PROBE_RTT) {
-    mode_ = PROBE_RTT;
-    pacing_gain_ = 1;
-    congestion_window_gain_ = kProbeRttCongestionWindowGain;
-    probe_rtt_start_time_ms_ = now_ms;
-    minimum_congestion_window_start_time_ms_.reset();
-  }
-}
-
-// |minimum_congestion_window_start_time_|'s value is set to the first moment
-// when data inflight was less then
-// |CongestionWindow::kMinimumCongestionWindowBytes|, we should make sure that
-// BBR has been in PROBE_RTT mode for at least one round or 200ms.
-void BbrBweSender::TryExitingProbeRtt(int64_t now_ms, int64_t round) {
-  if (!minimum_congestion_window_start_time_ms_) {
-    if (congestion_window_->data_inflight() <=
-        TargetCongestionWindow(kProbeRttCongestionWindowGain)) {
-      minimum_congestion_window_start_time_ms_.emplace(now_ms);
-      minimum_congestion_window_start_round_ = round;
-    }
-  } else {
-    if (now_ms - *minimum_congestion_window_start_time_ms_ >=
-            kProbeRttDurationMs &&
-        round - minimum_congestion_window_start_round_ >=
-            kProbeRttDurationRounds) {
-      EnterProbeBw(now_ms);
-    }
-  }
-}
-
-void BbrBweSender::TryEnteringRecovery(bool new_round_started) {
-  if (mode_ == RECOVERY || !new_round_started || !full_bandwidth_reached_ ||
-      !min_rtt_filter_->min_rtt_ms())
-    return;
-  uint64_t increased_rtt_round_counter = 0;
-  // If average RTT for past |kPastRttsFilterSize| rounds has been more than
-  // some multiplier of min_rtt_ms enter Recovery.
-  for (BbrBweSender::AverageRtt i : past_rtts_) {
-    if (i.sum_of_rtts_ms / (int64_t)i.num_samples >=
-        *min_rtt_filter_->min_rtt_ms() * kRttIncreaseThreshold)
-      increased_rtt_round_counter++;
-  }
-  if (increased_rtt_round_counter < kPastRttsFilterSize)
-    return;
-  mode_ = RECOVERY;
-  pacing_gain_ = kRecoveryPacingGain;
-  congestion_window_gain_ = kRecoveryCongestionWindowGain;
-}
-
-void BbrBweSender::TryExitingRecovery(bool new_round_started) {
-  if (mode_ != RECOVERY || !new_round_started || !full_bandwidth_reached_)
-    return;
-  // If average RTT for the past round has decreased sufficiently exit Recovery.
-  if (!past_rtts_.empty()) {
-    BbrBweSender::AverageRtt last_round_sample = past_rtts_.back();
-    if (last_round_sample.sum_of_rtts_ms / last_round_sample.num_samples <=
-        *min_rtt_filter_->min_rtt_ms() * kRttDecreaseThreshold) {
-      EnterProbeBw(clock_->TimeInMilliseconds());
-    }
-  }
-}
-
-int64_t BbrBweSender::TimeUntilNextProcess() {
-  return 50;
-}
-
-void BbrBweSender::OnPacketsSent(const Packets& packets) {
-  for (Packet* packet : packets) {
-    if (packet->GetPacketType() == Packet::kMedia) {
-      MediaPacket* media_packet = static_cast<MediaPacket*>(packet);
-      bytes_sent_ += media_packet->payload_size();
-      PacketStats packet_stats = PacketStats(
-          media_packet->sequence_number(), 0,
-          media_packet->sender_timestamp_ms(), 0, last_packet_ack_time_,
-          media_packet->payload_size(), 0, bytes_sent_, 0, bytes_acked_);
-      packet_stats_[media_packet->sequence_number()] = packet_stats;
-      last_packet_send_time_ = media_packet->sender_timestamp_ms();
-      last_packet_sent_sequence_number_ = media_packet->sequence_number();
-      // If this is the first packet sent for high gain phase, save data for it.
-      if (!first_packet_send_time_during_high_gain_ms_ && pacing_gain_ > 1) {
-        first_packet_send_time_during_high_gain_ms_.emplace(
-            last_packet_send_time_);
-        data_sent_before_high_gain_started_bytes_ =
-            bytes_sent_ - media_packet->payload_size() / 2;
-        first_packet_seq_num_during_high_gain_ =
-            media_packet->sequence_number();
-      }
-      // This condition ensures that |last_packet_seq_num_during_high_gain_|
-      // will contain a sequence number of the last packet sent during high gain
-      // phase.
-      if (pacing_gain_ > 1) {
-        last_packet_send_time_during_high_gain_ms_ = last_packet_send_time_;
-        data_sent_before_high_gain_ended_bytes_ =
-            bytes_sent_ - media_packet->payload_size() / 2;
-        last_packet_seq_num_during_high_gain_ = media_packet->sequence_number();
-      }
-      congestion_window_->PacketSent(media_packet->payload_size());
-    }
-  }
-}
-
-void BbrBweSender::Process() {}
-
-BbrBweReceiver::BbrBweReceiver(int flow_id)
-    : BweReceiver(flow_id, kReceivingRateTimeWindowMs),
-      clock_(0),
-      packet_feedbacks_(),
-      last_feedback_ms_(0) {}
-
-BbrBweReceiver::~BbrBweReceiver() {}
-
-void BbrBweReceiver::ReceivePacket(int64_t arrival_time_ms,
-                                   const MediaPacket& media_packet) {
-  packet_feedbacks_.push_back(media_packet.sequence_number());
-  BweReceiver::ReceivePacket(arrival_time_ms, media_packet);
-}
-
-FeedbackPacket* BbrBweReceiver::GetFeedback(int64_t now_ms) {
-  last_feedback_ms_ = now_ms;
-  int64_t corrected_send_time_ms = 0L;
-  if (!received_packets_.empty()) {
-    PacketIdentifierNode* latest = *(received_packets_.begin());
-    corrected_send_time_ms =
-        latest->send_time_ms + now_ms - latest->arrival_time_ms;
-  }
-  FeedbackPacket* fb = new BbrBweFeedback(
-      flow_id_, now_ms * 1000, corrected_send_time_ms, packet_feedbacks_);
-  packet_feedbacks_.clear();
-  return fb;
-}
-}  // namespace bwe
-}  // namespace testing
-}  // namespace webrtc
diff --git a/modules/remote_bitrate_estimator/test/estimators/bbr.h b/modules/remote_bitrate_estimator/test/estimators/bbr.h
deleted file mode 100644
index cf61c57..0000000
--- a/modules/remote_bitrate_estimator/test/estimators/bbr.h
+++ /dev/null
@@ -1,242 +0,0 @@
-/*
- *  Copyright (c) 2017 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_REMOTE_BITRATE_ESTIMATOR_TEST_ESTIMATORS_BBR_H_
-#define WEBRTC_MODULES_REMOTE_BITRATE_ESTIMATOR_TEST_ESTIMATORS_BBR_H_
-
-#include <list>
-#include <map>
-#include <memory>
-#include <vector>
-
-#include "webrtc/api/optional.h"
-#include "webrtc/modules/remote_bitrate_estimator/test/bwe.h"
-#include "webrtc/modules/video_coding/sequence_number_util.h"
-#include "webrtc/rtc_base/random.h"
-
-namespace webrtc {
-namespace testing {
-namespace bwe {
-class MaxBandwidthFilter;
-class MinRttFilter;
-class CongestionWindow;
-class BbrBweSender : public BweSender {
- public:
-  explicit BbrBweSender(BitrateObserver* observer, Clock* clock);
-  virtual ~BbrBweSender();
-  enum Mode {
-    // Startup phase.
-    STARTUP,
-    // Queue draining phase, which where created during startup.
-    DRAIN,
-    // Cruising, probing new bandwidth.
-    PROBE_BW,
-    // Temporarily limiting congestion window size in order to measure
-    // minimum RTT.
-    PROBE_RTT,
-    // Temporarily reducing pacing rate and congestion window, in order to
-    // ensure no queues are built.
-    RECOVERY
-  };
-
-  struct PacketStats {
-    PacketStats() {}
-    PacketStats(uint16_t sequence_number_,
-                int64_t last_sent_packet_send_time_ms_,
-                int64_t send_time_ms_,
-                int64_t ack_time_ms_,
-                int64_t last_acked_packet_ack_time_ms_,
-                size_t payload_size_bytes_,
-                size_t data_sent_bytes_,
-                size_t data_sent_before_last_sent_packet_bytes_,
-                size_t data_acked_bytes_,
-                size_t data_acked_before_last_acked_packet_bytes_)
-        : sequence_number(sequence_number_),
-          last_sent_packet_send_time_ms(last_sent_packet_send_time_ms_),
-          send_time_ms(send_time_ms_),
-          ack_time_ms(ack_time_ms_),
-          last_acked_packet_ack_time_ms(last_acked_packet_ack_time_ms_),
-          payload_size_bytes(payload_size_bytes_),
-          data_sent_bytes(data_sent_bytes_),
-          data_sent_before_last_sent_packet_bytes(
-              data_sent_before_last_sent_packet_bytes_),
-          data_acked_bytes(data_acked_bytes_),
-          data_acked_before_last_acked_packet_bytes(
-              data_acked_before_last_acked_packet_bytes_) {}
-    // Sequence number of this packet.
-    uint16_t sequence_number;
-    // Send time of the last sent packet at ack time of this packet.
-    int64_t last_sent_packet_send_time_ms;
-    // Send time of this packet.
-    int64_t send_time_ms;
-    // Ack time of this packet.
-    int64_t ack_time_ms;
-    // Ack time of the last acked packet at send time of this packet.
-    int64_t last_acked_packet_ack_time_ms;
-    // Payload size of this packet.
-    size_t payload_size_bytes;
-    // Amount of data sent before this packet was sent.
-    size_t data_sent_bytes;
-    // Amount of data sent, before last sent packet.
-    size_t data_sent_before_last_sent_packet_bytes;
-    // Amount of data acked, before this packet was acked.
-    size_t data_acked_bytes;
-    // Amount of data acked, before last acked packet.
-    size_t data_acked_before_last_acked_packet_bytes;
-  };
-  struct AverageRtt {
-    AverageRtt() {}
-    AverageRtt(int64_t sum_of_rtts_ms_, int64_t num_samples_, uint64_t round_)
-        : sum_of_rtts_ms(sum_of_rtts_ms_),
-          num_samples(num_samples_),
-          round(round_) {}
-    // Sum of RTTs over the round.
-    int64_t sum_of_rtts_ms;
-    // Number of RTT samples over the round.
-    int64_t num_samples;
-    // The number of the round average RTT is recorded for.
-    uint64_t round;
-  };
-  void OnPacketsSent(const Packets& packets) override;
-  int GetFeedbackIntervalMs() const override;
-  void GiveFeedback(const FeedbackPacket& feedback) override;
-  int64_t TimeUntilNextProcess() override;
-  void Process() override;
-
- private:
-  void EnterStartup();
-  void UpdateBandwidthAndMinRtt(int64_t now_ms,
-                                const std::vector<uint16_t>& feedback_vector,
-                                int64_t bytes_acked);
-  void TryExitingStartup();
-  void TryExitingDrain(int64_t now_ms);
-  void EnterProbeBw(int64_t now_ms);
-  void TryUpdatingCyclePhase(int64_t now_ms);
-  void TryEnteringProbeRtt(int64_t now_ms);
-  void TryExitingProbeRtt(int64_t now_ms, int64_t round);
-  void TryEnteringRecovery(bool new_round_started);
-  void TryExitingRecovery(bool new_round_started);
-  size_t TargetCongestionWindow(float gain);
-  void CalculatePacingRate();
-
-  // Calculates and returns bandwidth sample as minimum between send rate and
-  // ack rate, returns nothing if sample cannot be calculated.
-  rtc::Optional<int64_t> CalculateBandwidthSample(size_t data_sent,
-                                                  int64_t send_time_delta_ms,
-                                                  size_t data_acked,
-                                                  int64_t ack_time_delta_ms);
-
-  // Calculate and add bandwidth sample only for packets' sent during high gain
-  // phase. Motivation of having a seperate bucket for high gain phase is to
-  // achieve quicker ramp up. Slight overestimations may happen due to window
-  // not being as large as usual.
-  void AddSampleForHighGain();
-
-  // Declares lost packets as acked. Implements simple logic by looking at the
-  // gap between sequence numbers. If there is a gap between sequence numbers we
-  // declare those packets as lost immediately.
-  void HandleLoss(uint64_t last_acked_packet, uint64_t recently_acked_packet);
-  void AddToPastRtts(int64_t rtt_sample_ms);
-  BitrateObserver* observer_;
-  Clock* const clock_;
-  Mode mode_;
-  std::unique_ptr<MaxBandwidthFilter> max_bandwidth_filter_;
-  std::unique_ptr<MinRttFilter> min_rtt_filter_;
-  std::unique_ptr<CongestionWindow> congestion_window_;
-  std::unique_ptr<Random> rand_;
-  uint64_t round_count_;
-  uint64_t round_trip_end_;
-  float pacing_gain_;
-  float congestion_window_gain_;
-
-  // If optimal bandwidth has been discovered and reached, (for example after
-  // Startup mode) set this variable to true.
-  bool full_bandwidth_reached_;
-
-  // Entering time for PROBE_BW mode's cycle phase.
-  int64_t cycle_start_time_ms_;
-
-  // Index number of the currently used gain value in PROBE_BW mode, from 0 to
-  // kGainCycleLength - 1.
-  int64_t cycle_index_;
-  size_t bytes_acked_;
-
-  // Time we entered PROBE_RTT mode.
-  int64_t probe_rtt_start_time_ms_;
-
-  // First moment of time when data inflight decreased below
-  // kMinimumCongestionWindow in PROBE_RTT mode.
-  rtc::Optional<int64_t> minimum_congestion_window_start_time_ms_;
-
-  // First round when data inflight decreased below kMinimumCongestionWindow in
-  // PROBE_RTT mode.
-  int64_t minimum_congestion_window_start_round_;
-  size_t bytes_sent_;
-  uint16_t last_packet_sent_sequence_number_;
-  uint16_t last_packet_acked_sequence_number_;
-  int64_t last_packet_ack_time_;
-  int64_t last_packet_send_time_;
-  int64_t pacing_rate_bps_;
-
-  // Send time of a packet sent first during high gain phase. Also serves as a
-  // flag, holding value means that we are already in high gain.
-  rtc::Optional<int64_t> first_packet_send_time_during_high_gain_ms_;
-
-  // Send time of a packet sent last during high gain phase.
-  int64_t last_packet_send_time_during_high_gain_ms_;
-
-  // Amount of data sent, before first packet was sent during high gain phase.
-  int64_t data_sent_before_high_gain_started_bytes_;
-
-  // Amount of data sent, before last packet was sent during high gain phase.
-  int64_t data_sent_before_high_gain_ended_bytes_;
-
-  // Ack time of a packet acked first during high gain phase.
-  int64_t first_packet_ack_time_during_high_gain_ms_;
-
-  // Ack time of a packet acked last during high gain phase.
-  int64_t last_packet_ack_time_during_high_gain_ms_;
-
-  // Amount of data acked, before the first packet was acked during high gain
-  // phase.
-  int64_t data_acked_before_high_gain_started_bytes_;
-
-  // Amount of data acked, before the last packet was acked during high gain
-  // phase.
-  int64_t data_acked_before_high_gain_ended_bytes_;
-
-  // Sequence number of the first packet sent during high gain phase.
-  uint16_t first_packet_seq_num_during_high_gain_;
-
-  // Sequence number of the last packet sent during high gain phase.
-  uint16_t last_packet_seq_num_during_high_gain_;
-  bool high_gain_over_;
-  std::map<int64_t, PacketStats> packet_stats_;
-  std::list<AverageRtt> past_rtts_;
-};
-
-class BbrBweReceiver : public BweReceiver {
- public:
-  explicit BbrBweReceiver(int flow_id);
-  virtual ~BbrBweReceiver();
-  void ReceivePacket(int64_t arrival_time_ms,
-                     const MediaPacket& media_packet) override;
-  FeedbackPacket* GetFeedback(int64_t now_ms) override;
- private:
-  SimulatedClock clock_;
-  std::vector<uint16_t> packet_feedbacks_;
-  int64_t last_feedback_ms_;
-};
-}  // namespace bwe
-}  // namespace testing
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_REMOTE_BITRATE_ESTIMATOR_TEST_ESTIMATORS_BBR_H_
diff --git a/modules/remote_bitrate_estimator/test/estimators/congestion_window.cc b/modules/remote_bitrate_estimator/test/estimators/congestion_window.cc
deleted file mode 100644
index 5c01e89..0000000
--- a/modules/remote_bitrate_estimator/test/estimators/congestion_window.cc
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- *  Copyright (c) 2017 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/remote_bitrate_estimator/test/estimators/congestion_window.h"
-
-#include <algorithm>
-
-#include "webrtc/modules/remote_bitrate_estimator/test/estimators/bbr.h"
-
-namespace webrtc {
-namespace testing {
-namespace bwe {
-namespace {
-// kStartingCongestionWindowBytes is used to set congestion window when
-// bandwidth delay product is equal to zero, so that we don't set window to zero
-// as well. Chosen randomly by me, because this value shouldn't make any
-// significant difference, as bandwidth delay product is more than zero almost
-// every time.
-const int kStartingCongestionWindowBytes = 6000;
-}  // namespace
-
-CongestionWindow::CongestionWindow() : data_inflight_bytes_(0) {}
-
-CongestionWindow::~CongestionWindow() {}
-
-int CongestionWindow::GetCongestionWindow(BbrBweSender::Mode mode,
-                                          int64_t bandwidth_estimate_bps,
-                                          rtc::Optional<int64_t> min_rtt_ms,
-                                          float gain) {
-  return GetTargetCongestionWindow(bandwidth_estimate_bps, min_rtt_ms, gain);
-}
-
-void CongestionWindow::PacketSent(size_t sent_packet_size_bytes) {
-  data_inflight_bytes_ += sent_packet_size_bytes;
-}
-
-void CongestionWindow::AckReceived(size_t received_packet_size_bytes) {
-  RTC_DCHECK_GE(data_inflight_bytes_ >= received_packet_size_bytes, true);
-  data_inflight_bytes_ -= received_packet_size_bytes;
-}
-
-int CongestionWindow::GetTargetCongestionWindow(
-    int64_t bandwidth_estimate_bps,
-    rtc::Optional<int64_t> min_rtt_ms,
-    float gain) {
-  // If we have no rtt sample yet, return the starting congestion window size.
-  if (!min_rtt_ms)
-    return gain * kStartingCongestionWindowBytes;
-  int bdp = *min_rtt_ms * bandwidth_estimate_bps / 8000;
-  int congestion_window = bdp * gain;
-  // Congestion window could be zero in rare cases, when either no bandwidth
-  // estimate is available, or path's min_rtt value is zero.
-  if (!congestion_window)
-    congestion_window = gain * kStartingCongestionWindowBytes;
-  return congestion_window;
-}
-}  // namespace bwe
-}  // namespace testing
-}  // namespace webrtc
diff --git a/modules/remote_bitrate_estimator/test/estimators/congestion_window.h b/modules/remote_bitrate_estimator/test/estimators/congestion_window.h
deleted file mode 100644
index 3194d81..0000000
--- a/modules/remote_bitrate_estimator/test/estimators/congestion_window.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- *  Copyright (c) 2017 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_REMOTE_BITRATE_ESTIMATOR_TEST_ESTIMATORS_CONGESTION_WINDOW_H_
-#define WEBRTC_MODULES_REMOTE_BITRATE_ESTIMATOR_TEST_ESTIMATORS_CONGESTION_WINDOW_H_
-
-#include "webrtc/modules/remote_bitrate_estimator/test/estimators/bbr.h"
-
-#include "webrtc/api/optional.h"
-
-namespace webrtc {
-namespace testing {
-namespace bwe {
-class CongestionWindow {
- public:
-  CongestionWindow();
-  ~CongestionWindow();
-  int GetCongestionWindow(BbrBweSender::Mode mode,
-                          int64_t bandwidth_estimate,
-                          rtc::Optional<int64_t> min_rtt,
-                          float gain);
-  int GetTargetCongestionWindow(int64_t bandwidth_estimate,
-                                rtc::Optional<int64_t> min_rtt,
-                                float gain);
-  // Packet sent from sender, meaning it is inflight until we receive it and we
-  // should add packet's size to data_inflight.
-  void PacketSent(size_t sent_packet_size);
-
-  // Ack was received by sender, meaning packet is no longer inflight.
-  void AckReceived(size_t received_packet_size);
-
-  size_t data_inflight() { return data_inflight_bytes_; }
-
- private:
-  size_t data_inflight_bytes_;
-};
-}  // namespace bwe
-}  // namespace testing
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_REMOTE_BITRATE_ESTIMATOR_TEST_ESTIMATORS_CONGESTION_WINDOW_H_
diff --git a/modules/remote_bitrate_estimator/test/estimators/congestion_window_unittest.cc b/modules/remote_bitrate_estimator/test/estimators/congestion_window_unittest.cc
deleted file mode 100644
index 2415c13..0000000
--- a/modules/remote_bitrate_estimator/test/estimators/congestion_window_unittest.cc
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- *  Copyright (c) 2017 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/remote_bitrate_estimator/test/estimators/congestion_window.h"
-#include "webrtc/modules/remote_bitrate_estimator/test/estimators/bbr.h"
-
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-namespace testing {
-namespace bwe {
-namespace {
-// Same value used in CongestionWindow class.
-const int64_t kStartingCongestionWindow = 6000;
-}  // namespace
-
-TEST(CongestionWindowTest, InitializationCheck) {
-  CongestionWindow congestion_window;
-  congestion_window.PacketSent(0);
-  EXPECT_EQ(congestion_window.data_inflight(), 0u);
-  congestion_window.AckReceived(0);
-  EXPECT_EQ(congestion_window.data_inflight(), 0u);
-}
-
-TEST(CongestionWindowTest, DataInflight) {
-  CongestionWindow congestion_window;
-  congestion_window.PacketSent(13);
-  EXPECT_EQ(congestion_window.data_inflight(), 13u);
-  congestion_window.AckReceived(12);
-  EXPECT_EQ(congestion_window.data_inflight(), 1u);
-  congestion_window.PacketSent(10);
-  congestion_window.PacketSent(9);
-  EXPECT_EQ(congestion_window.data_inflight(), 20u);
-  congestion_window.AckReceived(20);
-  EXPECT_EQ(congestion_window.data_inflight(), 0u);
-}
-
-TEST(CongestionWindowTest, ZeroBandwidthDelayProduct) {
-  CongestionWindow congestion_window;
-  int64_t target_congestion_window =
-      congestion_window.GetTargetCongestionWindow(
-          100, rtc::Optional<int64_t>(0), 2.885f);
-  EXPECT_EQ(target_congestion_window, 2.885f * kStartingCongestionWindow);
-}
-
-TEST(CongestionWindowTest, CalculateCongestionWindow) {
-  CongestionWindow congestion_window;
-  int64_t cwnd = congestion_window.GetCongestionWindow(
-      BbrBweSender::STARTUP, 800000, rtc::Optional<int64_t>(100l), 2.885f);
-  EXPECT_EQ(cwnd, 28850);
-  cwnd = congestion_window.GetCongestionWindow(
-      BbrBweSender::STARTUP, 400000, rtc::Optional<int64_t>(200l), 2.885f);
-  EXPECT_EQ(cwnd, 28850);
-}
-}  // namespace bwe
-}  // namespace testing
-}  // namespace webrtc
diff --git a/modules/remote_bitrate_estimator/test/estimators/max_bandwidth_filter.cc b/modules/remote_bitrate_estimator/test/estimators/max_bandwidth_filter.cc
deleted file mode 100644
index 3a7e0dd..0000000
--- a/modules/remote_bitrate_estimator/test/estimators/max_bandwidth_filter.cc
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- *  Copyright (c) 2017 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/remote_bitrate_estimator/test/estimators/max_bandwidth_filter.h"
-
-namespace webrtc {
-namespace testing {
-namespace bwe {
-
-const size_t MaxBandwidthFilter::kBandwidthWindowFilterSize;
-
-MaxBandwidthFilter::MaxBandwidthFilter()
-    : bandwidth_last_round_bytes_per_ms_(0),
-      max_bandwidth_estimate_bps_(0),
-      rounds_without_growth_(0) {}
-
-MaxBandwidthFilter::~MaxBandwidthFilter() {}
-
-// For detailed explanation about implementing bandwidth filter this way visit
-// "Bbr design" doc. |sample_bps| was measured during |round|.
-void MaxBandwidthFilter::AddBandwidthSample(int64_t sample_bps, int64_t round) {
-  if (bandwidth_samples_[0].first == 0 ||
-      sample_bps >= bandwidth_samples_[0].first ||
-      round - bandwidth_samples_[2].second >=
-          MaxBandwidthFilter::kBandwidthWindowFilterSize)
-    bandwidth_samples_[0] = bandwidth_samples_[1] =
-        bandwidth_samples_[2] = {sample_bps, round};
-  if (sample_bps >= bandwidth_samples_[1].first) {
-    bandwidth_samples_[1] = {sample_bps, round};
-    bandwidth_samples_[2] = bandwidth_samples_[1];
-  } else {
-    if (sample_bps >= bandwidth_samples_[2].first)
-      bandwidth_samples_[2] = {sample_bps, round};
-  }
-  if (round - bandwidth_samples_[0].second >=
-      MaxBandwidthFilter::kBandwidthWindowFilterSize) {
-    bandwidth_samples_[0] = bandwidth_samples_[1];
-    bandwidth_samples_[1] = bandwidth_samples_[2];
-    bandwidth_samples_[2] = {sample_bps, round};
-    if (round - bandwidth_samples_[0].second >=
-        MaxBandwidthFilter::kBandwidthWindowFilterSize) {
-      bandwidth_samples_[0] = bandwidth_samples_[1];
-      bandwidth_samples_[1] = bandwidth_samples_[2];
-    }
-    max_bandwidth_estimate_bps_ = bandwidth_samples_[0].first;
-    return;
-  }
-  if (bandwidth_samples_[1].first == bandwidth_samples_[0].first &&
-      round - bandwidth_samples_[1].second >
-          MaxBandwidthFilter::kBandwidthWindowFilterSize / 4) {
-    bandwidth_samples_[2] = bandwidth_samples_[1] = {sample_bps, round};
-    max_bandwidth_estimate_bps_ = bandwidth_samples_[0].first;
-    return;
-  }
-  if (bandwidth_samples_[2].first == bandwidth_samples_[1].first &&
-      round - bandwidth_samples_[2].second >
-          MaxBandwidthFilter::kBandwidthWindowFilterSize / 2)
-    bandwidth_samples_[2] = {sample_bps, round};
-  max_bandwidth_estimate_bps_ = bandwidth_samples_[0].first;
-}
-
-bool MaxBandwidthFilter::FullBandwidthReached(float growth_target,
-                                              int max_rounds_without_growth) {
-  // Minimal bandwidth necessary to assume that better bandwidth can still be
-  // found and full bandwidth is not reached.
-  int64_t minimal_bandwidth =
-      bandwidth_last_round_bytes_per_ms_ * growth_target;
-  if (max_bandwidth_estimate_bps_ >= minimal_bandwidth) {
-    bandwidth_last_round_bytes_per_ms_ = max_bandwidth_estimate_bps_;
-    rounds_without_growth_ = 0;
-    return false;
-  }
-  rounds_without_growth_++;
-  return rounds_without_growth_ >= max_rounds_without_growth;
-}
-}  // namespace bwe
-}  // namespace testing
-}  // namespace webrtc
diff --git a/modules/remote_bitrate_estimator/test/estimators/max_bandwidth_filter.h b/modules/remote_bitrate_estimator/test/estimators/max_bandwidth_filter.h
deleted file mode 100644
index 15d0676..0000000
--- a/modules/remote_bitrate_estimator/test/estimators/max_bandwidth_filter.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- *  Copyright (c) 2017 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_REMOTE_BITRATE_ESTIMATOR_TEST_ESTIMATORS_MAX_BANDWIDTH_FILTER_H_
-#define WEBRTC_MODULES_REMOTE_BITRATE_ESTIMATOR_TEST_ESTIMATORS_MAX_BANDWIDTH_FILTER_H_
-
-#include <climits>
-#include <list>
-#include <map>
-#include <memory>
-#include <utility>
-#include <vector>
-
-#include "webrtc/logging/rtc_event_log/mock/mock_rtc_event_log.h"
-#include "webrtc/modules/remote_bitrate_estimator/include/send_time_history.h"
-#include "webrtc/modules/remote_bitrate_estimator/test/bwe.h"
-
-namespace webrtc {
-namespace testing {
-namespace bwe {
-class MaxBandwidthFilter {
- public:
-  // Number of rounds for bandwidth estimate to expire.
-  static const size_t kBandwidthWindowFilterSize = 10;
-
-  MaxBandwidthFilter();
-  ~MaxBandwidthFilter();
-  int64_t max_bandwidth_estimate_bps() { return max_bandwidth_estimate_bps_; }
-
-  // Adds bandwidth sample to the bandwidth filter.
-  void AddBandwidthSample(int64_t sample, int64_t round);
-
-  // Checks if bandwidth has grown by certain multiplier for past x rounds,
-  // to decide whether or full bandwidth was reached.
-  bool FullBandwidthReached(float growth_target, int max_rounds_without_growth);
-
- private:
-  int64_t bandwidth_last_round_bytes_per_ms_;
-  int64_t max_bandwidth_estimate_bps_;
-  int64_t rounds_without_growth_;
-  std::pair<int64_t, size_t> bandwidth_samples_[3];
-};
-}  // namespace bwe
-}  // namespace testing
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_REMOTE_BITRATE_ESTIMATOR_TEST_ESTIMATORS_MAX_BANDWIDTH_FILTER_H_
diff --git a/modules/remote_bitrate_estimator/test/estimators/max_bandwidth_filter_unittest.cc b/modules/remote_bitrate_estimator/test/estimators/max_bandwidth_filter_unittest.cc
deleted file mode 100644
index 6c13fd1..0000000
--- a/modules/remote_bitrate_estimator/test/estimators/max_bandwidth_filter_unittest.cc
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- *  Copyright (c) 2017 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/remote_bitrate_estimator/test/estimators/max_bandwidth_filter.h"
-
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-namespace testing {
-namespace bwe {
-TEST(MaxBandwidthFilterTest, InitializationCheck) {
-  MaxBandwidthFilter max_bandwidth_filter;
-  EXPECT_EQ(max_bandwidth_filter.max_bandwidth_estimate_bps(), 0);
-}
-
-TEST(MaxBandwidthFilterTest, AddOneBandwidthSample) {
-  MaxBandwidthFilter max_bandwidth_filter;
-  max_bandwidth_filter.AddBandwidthSample(13, 4);
-  EXPECT_EQ(max_bandwidth_filter.max_bandwidth_estimate_bps(), 13);
-}
-
-TEST(MaxBandwidthFilterTest, AddSeveralBandwidthSamples) {
-  MaxBandwidthFilter max_bandwidth_filter;
-  max_bandwidth_filter.AddBandwidthSample(10, 5);
-  max_bandwidth_filter.AddBandwidthSample(13, 6);
-  EXPECT_EQ(max_bandwidth_filter.max_bandwidth_estimate_bps(), 13);
-}
-
-TEST(MaxBandwidthFilterTest, FirstSampleTimeOut) {
-  MaxBandwidthFilter max_bandwidth_filter;
-  max_bandwidth_filter.AddBandwidthSample(13, 5);
-  max_bandwidth_filter.AddBandwidthSample(10, 15);
-  EXPECT_EQ(max_bandwidth_filter.max_bandwidth_estimate_bps(), 10);
-}
-
-TEST(MaxBandwidthFilterTest, SecondSampleBecomesTheFirst) {
-  MaxBandwidthFilter max_bandwidth_filter;
-  max_bandwidth_filter.AddBandwidthSample(4, 5);
-  max_bandwidth_filter.AddBandwidthSample(3, 10);
-  max_bandwidth_filter.AddBandwidthSample(2, 15);
-  EXPECT_EQ(max_bandwidth_filter.max_bandwidth_estimate_bps(), 3);
-}
-
-TEST(MaxBandwidthFilterTest, ThirdSampleBecomesTheFirst) {
-  MaxBandwidthFilter max_bandwidth_filter;
-  max_bandwidth_filter.AddBandwidthSample(4, 5);
-  max_bandwidth_filter.AddBandwidthSample(3, 10);
-  max_bandwidth_filter.AddBandwidthSample(2, 25);
-  EXPECT_EQ(max_bandwidth_filter.max_bandwidth_estimate_bps(), 2);
-}
-
-TEST(MaxBandwidthFilterTest, FullBandwidthReached) {
-  MaxBandwidthFilter max_bandwidth_filter;
-  max_bandwidth_filter.AddBandwidthSample(100, 1);
-  EXPECT_EQ(max_bandwidth_filter.FullBandwidthReached(1.25f, 3), false);
-  max_bandwidth_filter.AddBandwidthSample(110, 2);
-  EXPECT_EQ(max_bandwidth_filter.FullBandwidthReached(1.25f, 3), false);
-  max_bandwidth_filter.AddBandwidthSample(120, 3);
-  EXPECT_EQ(max_bandwidth_filter.FullBandwidthReached(1.25f, 3), false);
-  max_bandwidth_filter.AddBandwidthSample(124, 4);
-  EXPECT_EQ(max_bandwidth_filter.FullBandwidthReached(1.25f, 3), true);
-}
-
-TEST(MaxBandwidthFilterTest, FullBandwidthNotReached) {
-  MaxBandwidthFilter max_bandwidth_filter;
-  max_bandwidth_filter.AddBandwidthSample(100, 1);
-  EXPECT_EQ(max_bandwidth_filter.FullBandwidthReached(1.25f, 3), false);
-  max_bandwidth_filter.AddBandwidthSample(110, 2);
-  EXPECT_EQ(max_bandwidth_filter.FullBandwidthReached(1.25f, 3), false);
-  max_bandwidth_filter.AddBandwidthSample(120, 3);
-  EXPECT_EQ(max_bandwidth_filter.FullBandwidthReached(1.25f, 3), false);
-  max_bandwidth_filter.AddBandwidthSample(125, 4);
-  EXPECT_EQ(max_bandwidth_filter.FullBandwidthReached(1.25f, 3), false);
-}
-}  // namespace bwe
-}  // namespace testing
-}  // namespace webrtc
diff --git a/modules/remote_bitrate_estimator/test/estimators/min_rtt_filter.h b/modules/remote_bitrate_estimator/test/estimators/min_rtt_filter.h
deleted file mode 100644
index 82451bd..0000000
--- a/modules/remote_bitrate_estimator/test/estimators/min_rtt_filter.h
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- *  Copyright (c) 2017 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_REMOTE_BITRATE_ESTIMATOR_TEST_ESTIMATORS_MIN_RTT_FILTER_H_
-#define WEBRTC_MODULES_REMOTE_BITRATE_ESTIMATOR_TEST_ESTIMATORS_MIN_RTT_FILTER_H_
-
-#include <cstdint>
-#include <limits>
-#include <list>
-
-#include "webrtc/api/optional.h"
-
-namespace webrtc {
-namespace testing {
-namespace bwe {
-
-// Average rtt for past |kRttFilterSize| packets should grow by
-// |kRttIncreaseThresholdForExpiry| in order to enter PROBE_RTT mode and expire.
-// old min_rtt estimate.
-const float kRttIncreaseThresholdForExpiry = 2.3f;
-const size_t kRttFilterSize = 25;
-
-class MinRttFilter {
- public:
-  // This class implements a simple filter to ensure that PROBE_RTT is only
-  // entered when RTTs start to increase, instead of fixed 10 second window as
-  // in orginal BBR design doc, to avoid unnecessary freezes in stream.
-  MinRttFilter() {}
-  ~MinRttFilter() {}
-
-  rtc::Optional<int64_t> min_rtt_ms() { return min_rtt_ms_; }
-  void AddRttSample(int64_t rtt_ms, int64_t now_ms) {
-    if (!min_rtt_ms_ || rtt_ms <= *min_rtt_ms_ || MinRttExpired(now_ms)) {
-      min_rtt_ms_.emplace(rtt_ms);
-    }
-    rtt_samples_.push_back(rtt_ms);
-    if (rtt_samples_.size() > kRttFilterSize)
-      rtt_samples_.pop_front();
-  }
-
-  // Checks whether or not last RTT values for past |kRttFilterSize| packets
-  // started to increase, meaning we have to update min_rtt estimate.
-  bool MinRttExpired(int64_t now_ms) {
-    if (rtt_samples_.size() < kRttFilterSize || !min_rtt_ms_)
-      return false;
-    int64_t sum_of_rtts_ms = 0;
-    for (int64_t i : rtt_samples_)
-      sum_of_rtts_ms += i;
-    if (sum_of_rtts_ms >=
-        *min_rtt_ms_ * kRttIncreaseThresholdForExpiry * kRttFilterSize) {
-      rtt_samples_.clear();
-      return true;
-    }
-    return false;
-  }
-
- private:
-  rtc::Optional<int64_t> min_rtt_ms_;
-  std::list<int64_t> rtt_samples_;
-};
-}  // namespace bwe
-}  // namespace testing
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_REMOTE_BITRATE_ESTIMATOR_TEST_ESTIMATORS_MIN_RTT_FILTER_H_
diff --git a/modules/remote_bitrate_estimator/test/estimators/min_rtt_filter_unittest.cc b/modules/remote_bitrate_estimator/test/estimators/min_rtt_filter_unittest.cc
deleted file mode 100644
index 5cf08d4..0000000
--- a/modules/remote_bitrate_estimator/test/estimators/min_rtt_filter_unittest.cc
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- *  Copyright (c) 2017 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/remote_bitrate_estimator/test/estimators/min_rtt_filter.h"
-
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-namespace testing {
-namespace bwe {
-TEST(MinRttFilterTest, InitializationCheck) {
-  MinRttFilter min_rtt_filter;
-  EXPECT_FALSE(min_rtt_filter.min_rtt_ms());
-}
-
-TEST(MinRttFilterTest, AddRttSample) {
-  MinRttFilter min_rtt_filter;
-  min_rtt_filter.AddRttSample(120, 5);
-  EXPECT_EQ(*min_rtt_filter.min_rtt_ms(), 120);
-  min_rtt_filter.AddRttSample(121, 6);
-  min_rtt_filter.AddRttSample(119, 7);
-  min_rtt_filter.AddRttSample(140, 10007);
-  EXPECT_EQ(*min_rtt_filter.min_rtt_ms(), 119);
-}
-
-TEST(MinRttFilterTest, MinRttExpired) {
-  MinRttFilter min_rtt_filter;
-  for (int i = 1; i <= 25; i++)
-    min_rtt_filter.AddRttSample(i, i);
-  EXPECT_EQ(min_rtt_filter.MinRttExpired(25), true);
-  EXPECT_EQ(min_rtt_filter.MinRttExpired(24), false);
-}
-}  // namespace bwe
-}  // namespace testing
-}  // namespace webrtc
diff --git a/modules/remote_bitrate_estimator/test/estimators/nada.cc b/modules/remote_bitrate_estimator/test/estimators/nada.cc
deleted file mode 100644
index 0c2bf78..0000000
--- a/modules/remote_bitrate_estimator/test/estimators/nada.cc
+++ /dev/null
@@ -1,293 +0,0 @@
-/*
- *  Copyright (c) 2015 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.
- *
- */
-
-//  Implementation of Network-Assisted Dynamic Adaptation's (NADA's) proposal.
-//  Version according to Draft Document (mentioned in references)
-//  http://tools.ietf.org/html/draft-zhu-rmcat-nada-06
-//  From March 26, 2015.
-
-#include <math.h>
-#include <algorithm>
-#include <vector>
-
-#include "webrtc/modules/remote_bitrate_estimator/test/bwe_test_logging.h"
-#include "webrtc/modules/remote_bitrate_estimator/test/estimators/nada.h"
-#include "webrtc/modules/rtp_rtcp/include/receive_statistics.h"
-#include "webrtc/rtc_base/arraysize.h"
-
-namespace webrtc {
-namespace testing {
-namespace bwe {
-
-namespace {
-// Used as an upper bound for calling AcceleratedRampDown.
-const float kMaxCongestionSignalMs =
-    40.0f + NadaBweSender::kMinNadaBitrateKbps / 15;
-}  // namespace
-
-const int NadaBweSender::kMinNadaBitrateKbps = 50;
-const int64_t NadaBweReceiver::kReceivingRateTimeWindowMs = 500;
-
-NadaBweReceiver::NadaBweReceiver(int flow_id)
-    : BweReceiver(flow_id, kReceivingRateTimeWindowMs),
-      clock_(0),
-      last_feedback_ms_(0),
-      recv_stats_(ReceiveStatistics::Create(&clock_)),
-      baseline_delay_ms_(10000),  // Initialized as an upper bound.
-      delay_signal_ms_(0),
-      last_congestion_signal_ms_(0),
-      last_delays_index_(0),
-      exp_smoothed_delay_ms_(-1),
-      est_queuing_delay_signal_ms_(0) {
-}
-
-NadaBweReceiver::~NadaBweReceiver() {
-}
-
-void NadaBweReceiver::ReceivePacket(int64_t arrival_time_ms,
-                                    const MediaPacket& media_packet) {
-  const float kAlpha = 0.1f;                 // Used for exponential smoothing.
-  const int64_t kDelayLowThresholdMs = 50;   // Referred as d_th.
-  const int64_t kDelayMaxThresholdMs = 400;  // Referred as d_max.
-
-  clock_.AdvanceTimeMilliseconds(arrival_time_ms - clock_.TimeInMilliseconds());
-  recv_stats_->IncomingPacket(media_packet.header(),
-                              media_packet.payload_size(), false);
-  // Refered as x_n.
-  int64_t delay_ms = arrival_time_ms - media_packet.sender_timestamp_ms();
-
-  // The min should be updated within the first 10 minutes.
-  if (clock_.TimeInMilliseconds() < 10 * 60 * 1000) {
-    baseline_delay_ms_ = std::min(baseline_delay_ms_, delay_ms);
-  }
-
-  delay_signal_ms_ = delay_ms - baseline_delay_ms_;  // Refered as d_n.
-  const int kMedian = arraysize(last_delays_ms_);
-  last_delays_ms_[(last_delays_index_++) % kMedian] = delay_signal_ms_;
-  int size = std::min(last_delays_index_, kMedian);
-
-  int64_t median_filtered_delay_ms_ = MedianFilter(last_delays_ms_, size);
-  exp_smoothed_delay_ms_ = ExponentialSmoothingFilter(
-      median_filtered_delay_ms_, exp_smoothed_delay_ms_, kAlpha);
-
-  if (exp_smoothed_delay_ms_ < kDelayLowThresholdMs) {
-    est_queuing_delay_signal_ms_ = exp_smoothed_delay_ms_;
-  } else if (exp_smoothed_delay_ms_ < kDelayMaxThresholdMs) {
-    est_queuing_delay_signal_ms_ = static_cast<int64_t>(
-        pow((static_cast<double>(kDelayMaxThresholdMs -
-                                 exp_smoothed_delay_ms_)) /
-                (kDelayMaxThresholdMs - kDelayLowThresholdMs),
-            4.0) *
-        kDelayLowThresholdMs);
-  } else {
-    est_queuing_delay_signal_ms_ = 0;
-  }
-
-  // Log received packet information.
-  BweReceiver::ReceivePacket(arrival_time_ms, media_packet);
-}
-
-FeedbackPacket* NadaBweReceiver::GetFeedback(int64_t now_ms) {
-  const int64_t kPacketLossPenaltyMs = 1000;  // Referred as d_L.
-
-  if (now_ms - last_feedback_ms_ < 100) {
-    return NULL;
-  }
-
-  float loss_fraction = RecentPacketLossRatio();
-
-  int64_t loss_signal_ms =
-      static_cast<int64_t>(loss_fraction * kPacketLossPenaltyMs + 0.5f);
-  int64_t congestion_signal_ms = est_queuing_delay_signal_ms_ + loss_signal_ms;
-
-  float derivative = 0.0f;
-  if (last_feedback_ms_ > 0) {
-    derivative = (congestion_signal_ms - last_congestion_signal_ms_) /
-                 static_cast<float>(now_ms - last_feedback_ms_);
-  }
-  last_feedback_ms_ = now_ms;
-  last_congestion_signal_ms_ = congestion_signal_ms;
-
-  int64_t corrected_send_time_ms = 0L;
-
-  if (!received_packets_.empty()) {
-    PacketIdentifierNode* latest = *(received_packets_.begin());
-    corrected_send_time_ms =
-        latest->send_time_ms + now_ms - latest->arrival_time_ms;
-  }
-
-  // Sends a tuple containing latest values of <d_hat_n, d_tilde_n, x_n, x'_n,
-  // R_r> and additional information.
-  return new NadaFeedback(flow_id_, now_ms * 1000, exp_smoothed_delay_ms_,
-                          est_queuing_delay_signal_ms_, congestion_signal_ms,
-                          derivative, RecentKbps(), corrected_send_time_ms);
-}
-
-// If size is even, the median is the average of the two middlemost numbers.
-int64_t NadaBweReceiver::MedianFilter(int64_t* last_delays_ms, int size) {
-  std::vector<int64_t> array_copy(last_delays_ms, last_delays_ms + size);
-  std::nth_element(array_copy.begin(), array_copy.begin() + size / 2,
-                   array_copy.end());
-  if (size % 2 == 1) {
-    // Typically, size = 5. For odd size values, right and left are equal.
-    return array_copy.at(size / 2);
-  }
-  int64_t right = array_copy.at(size / 2);
-  std::nth_element(array_copy.begin(), array_copy.begin() + (size - 1) / 2,
-                   array_copy.end());
-  int64_t left = array_copy.at((size - 1) / 2);
-  return (left + right + 1) / 2;
-}
-
-int64_t NadaBweReceiver::ExponentialSmoothingFilter(int64_t new_value,
-                                                    int64_t last_smoothed_value,
-                                                    float alpha) {
-  if (last_smoothed_value < 0) {
-    return new_value;  // Handling initial case.
-  }
-  return static_cast<int64_t>(alpha * new_value +
-                              (1.0f - alpha) * last_smoothed_value + 0.5f);
-}
-
-// Implementation according to Cisco's proposal by default.
-NadaBweSender::NadaBweSender(int kbps, BitrateObserver* observer, Clock* clock)
-    : BweSender(kbps),  // Referred as "Reference Rate" = R_n.,
-      clock_(clock),
-      observer_(observer),
-      original_operating_mode_(true) {
-}
-
-NadaBweSender::NadaBweSender(BitrateObserver* observer, Clock* clock)
-    : BweSender(kMinNadaBitrateKbps),  // Referred as "Reference Rate" = R_n.
-      clock_(clock),
-      observer_(observer),
-      original_operating_mode_(true) {}
-
-NadaBweSender::~NadaBweSender() {
-}
-
-int NadaBweSender::GetFeedbackIntervalMs() const {
-  return 100;
-}
-
-void NadaBweSender::GiveFeedback(const FeedbackPacket& feedback) {
-  const NadaFeedback& fb = static_cast<const NadaFeedback&>(feedback);
-
-  // Following parameters might be optimized.
-  const int64_t kQueuingDelayUpperBoundMs = 10;
-  const float kDerivativeUpperBound =
-      10.0f / std::max<int64_t>(1, min_feedback_delay_ms_);
-  // In the modified version, a higher kMinUpperBound allows a higher d_hat
-  // upper bound for calling AcceleratedRampUp.
-  const float kProportionalityDelayBits = 20.0f;
-
-  int64_t now_ms = clock_->TimeInMilliseconds();
-  float delta_s = now_ms - last_feedback_ms_;
-  last_feedback_ms_ = now_ms;
-  // Update delta_0.
-  min_feedback_delay_ms_ =
-      std::min(min_feedback_delay_ms_, static_cast<int64_t>(delta_s));
-
-  // Update RTT_0.
-  int64_t rtt_ms = now_ms - fb.latest_send_time_ms();
-  min_round_trip_time_ms_ = std::min(min_round_trip_time_ms_, rtt_ms);
-
-  // Independent limits for AcceleratedRampUp conditions variables:
-  // x_n, d_tilde and x'_n in the original implementation, plus
-  // d_hat and receiving_rate in the modified one.
-  // There should be no packet losses/marking, hence x_n == d_tilde.
-  if (original_operating_mode_) {
-    // Original if conditions and rate update.
-    if (fb.congestion_signal() == fb.est_queuing_delay_signal_ms() &&
-        fb.est_queuing_delay_signal_ms() < kQueuingDelayUpperBoundMs &&
-        fb.derivative() < kDerivativeUpperBound) {
-      AcceleratedRampUp(fb);
-    } else {
-      GradualRateUpdate(fb, delta_s, 1.0);
-    }
-  } else {
-    // Modified if conditions and rate update; new ramp down mode.
-    if (fb.congestion_signal() == fb.est_queuing_delay_signal_ms() &&
-        fb.est_queuing_delay_signal_ms() < kQueuingDelayUpperBoundMs &&
-        fb.exp_smoothed_delay_ms() <
-            kMinNadaBitrateKbps / kProportionalityDelayBits &&
-        fb.derivative() < kDerivativeUpperBound &&
-        fb.receiving_rate() > kMinNadaBitrateKbps) {
-      AcceleratedRampUp(fb);
-    } else if (fb.congestion_signal() > kMaxCongestionSignalMs ||
-               fb.exp_smoothed_delay_ms() > kMaxCongestionSignalMs) {
-      AcceleratedRampDown(fb);
-    } else {
-      double bitrate_reference =
-          (2.0 * bitrate_kbps_) / (kMaxBitrateKbps + kMinNadaBitrateKbps);
-      double smoothing_factor = pow(bitrate_reference, 0.75);
-      GradualRateUpdate(fb, delta_s, smoothing_factor);
-    }
-  }
-
-  bitrate_kbps_ = std::min(bitrate_kbps_, kMaxBitrateKbps);
-  bitrate_kbps_ = std::max(bitrate_kbps_, kMinNadaBitrateKbps);
-
-  observer_->OnNetworkChanged(1000 * bitrate_kbps_, 0, rtt_ms);
-}
-
-int64_t NadaBweSender::TimeUntilNextProcess() {
-  return 100;
-}
-
-void NadaBweSender::Process() {
-}
-
-void NadaBweSender::AcceleratedRampUp(const NadaFeedback& fb) {
-  const int kMaxRampUpQueuingDelayMs = 50;  // Referred as T_th.
-  const float kGamma0 = 0.5f;               // Referred as gamma_0.
-
-  float gamma =
-      std::min(kGamma0, static_cast<float>(kMaxRampUpQueuingDelayMs) /
-                            (min_round_trip_time_ms_ + min_feedback_delay_ms_));
-
-  bitrate_kbps_ = static_cast<int>((1.0f + gamma) * fb.receiving_rate() + 0.5f);
-}
-
-void NadaBweSender::AcceleratedRampDown(const NadaFeedback& fb) {
-  const float kGamma0 = 0.9f;
-  float gamma = 3.0f * kMaxCongestionSignalMs /
-                (fb.congestion_signal() + fb.exp_smoothed_delay_ms());
-  gamma = std::min(gamma, kGamma0);
-  bitrate_kbps_ = gamma * fb.receiving_rate() + 0.5f;
-}
-
-void NadaBweSender::GradualRateUpdate(const NadaFeedback& fb,
-                                      float delta_s,
-                                      double smoothing_factor) {
-  const float kTauOMs = 500.0f;           // Referred as tau_o.
-  const float kEta = 2.0f;                // Referred as eta.
-  const float kKappa = 1.0f;              // Referred as kappa.
-  const float kReferenceDelayMs = 10.0f;  // Referred as x_ref.
-  const float kPriorityWeight = 1.0f;     // Referred as w.
-
-  float x_hat = fb.congestion_signal() + kEta * kTauOMs * fb.derivative();
-
-  float kTheta = kPriorityWeight * (kMaxBitrateKbps - kMinNadaBitrateKbps) *
-                 kReferenceDelayMs;
-
-  int original_increase = static_cast<int>(
-      (kKappa * delta_s *
-       (kTheta - (bitrate_kbps_ - kMinNadaBitrateKbps) * x_hat)) /
-          (kTauOMs * kTauOMs) +
-      0.5f);
-
-  bitrate_kbps_ = bitrate_kbps_ + smoothing_factor * original_increase;
-}
-
-}  // namespace bwe
-}  // namespace testing
-}  // namespace webrtc
diff --git a/modules/remote_bitrate_estimator/test/estimators/nada.h b/modules/remote_bitrate_estimator/test/estimators/nada.h
deleted file mode 100644
index 75f769d..0000000
--- a/modules/remote_bitrate_estimator/test/estimators/nada.h
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- *  Copyright (c) 2015 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.
- *
-*/
-
-//  Implementation of Network-Assisted Dynamic Adaptation's (NADA's) proposal
-//  Version according to Draft Document (mentioned in references)
-//  http://tools.ietf.org/html/draft-zhu-rmcat-nada-06
-//  From March 26, 2015.
-
-#ifndef WEBRTC_MODULES_REMOTE_BITRATE_ESTIMATOR_TEST_ESTIMATORS_NADA_H_
-#define WEBRTC_MODULES_REMOTE_BITRATE_ESTIMATOR_TEST_ESTIMATORS_NADA_H_
-
-#include <list>
-#include <map>
-#include <memory>
-
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/modules/remote_bitrate_estimator/test/bwe.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/voice_engine/channel.h"
-
-namespace webrtc {
-
-class ReceiveStatistics;
-
-namespace testing {
-namespace bwe {
-
-class NadaBweReceiver : public BweReceiver {
- public:
-  explicit NadaBweReceiver(int flow_id);
-  virtual ~NadaBweReceiver();
-
-  void ReceivePacket(int64_t arrival_time_ms,
-                     const MediaPacket& media_packet) override;
-  FeedbackPacket* GetFeedback(int64_t now_ms) override;
-
-  static int64_t MedianFilter(int64_t* v, int size);
-  static int64_t ExponentialSmoothingFilter(int64_t new_value,
-                                            int64_t last_smoothed_value,
-                                            float alpha);
-
-  static const int64_t kReceivingRateTimeWindowMs;
-
- private:
-  SimulatedClock clock_;
-  int64_t last_feedback_ms_;
-  std::unique_ptr<ReceiveStatistics> recv_stats_;
-  int64_t baseline_delay_ms_;  // Referred as d_f.
-  int64_t delay_signal_ms_;    // Referred as d_n.
-  int64_t last_congestion_signal_ms_;
-  int last_delays_index_;
-  int64_t exp_smoothed_delay_ms_;        // Referred as d_hat_n.
-  int64_t est_queuing_delay_signal_ms_;  // Referred as d_tilde_n.
-  int64_t last_delays_ms_[5];            // Used for Median Filter.
-};
-
-class NadaBweSender : public BweSender {
- public:
-  static const int kMinNadaBitrateKbps;
-
-  NadaBweSender(int kbps, BitrateObserver* observer, Clock* clock);
-  NadaBweSender(BitrateObserver* observer, Clock* clock);
-  virtual ~NadaBweSender();
-
-  int GetFeedbackIntervalMs() const override;
-  // Updates the min_feedback_delay_ms_ and the min_round_trip_time_ms_.
-  void GiveFeedback(const FeedbackPacket& feedback) override;
-  void OnPacketsSent(const Packets& packets) override {}
-  int64_t TimeUntilNextProcess() override;
-  void Process() override;
-  void AcceleratedRampUp(const NadaFeedback& fb);
-  void AcceleratedRampDown(const NadaFeedback& fb);
-  void GradualRateUpdate(const NadaFeedback& fb,
-                         float delta_s,
-                         double smoothing_factor);
-
-  int bitrate_kbps() const { return bitrate_kbps_; }
-  void set_bitrate_kbps(int bitrate_kbps) { bitrate_kbps_ = bitrate_kbps; }
-  bool original_operating_mode() const { return original_operating_mode_; }
-  void set_original_operating_mode(bool original_operating_mode) {
-    original_operating_mode_ = original_operating_mode;
-  }
-  int64_t NowMs() const { return clock_->TimeInMilliseconds(); }
-
- private:
-  Clock* const clock_;
-  BitrateObserver* const observer_;
-  // Referred as R_min, default initialization for bitrate R_n.
-  int64_t last_feedback_ms_ = 0;
-  // Referred as delta_0, initialized as an upper bound.
-  int64_t min_feedback_delay_ms_ = 200;
-  // Referred as RTT_0, initialized as an upper bound.
-  int64_t min_round_trip_time_ms_ = 100;
-  bool original_operating_mode_;
-
-  RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(NadaBweSender);
-};
-
-}  // namespace bwe
-}  // namespace testing
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_REMOTE_BITRATE_ESTIMATOR_TEST_ESTIMATORS_NADA_H_
diff --git a/modules/remote_bitrate_estimator/test/estimators/nada_unittest.cc b/modules/remote_bitrate_estimator/test/estimators/nada_unittest.cc
deleted file mode 100644
index d6226ab..0000000
--- a/modules/remote_bitrate_estimator/test/estimators/nada_unittest.cc
+++ /dev/null
@@ -1,497 +0,0 @@
-/*
- *  Copyright (c) 2015 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/remote_bitrate_estimator/test/estimators/nada.h"
-
-#include <algorithm>
-#include <memory>
-#include <numeric>
-
-#include "webrtc/modules/remote_bitrate_estimator/test/bwe_test_framework.h"
-#include "webrtc/modules/remote_bitrate_estimator/test/packet.h"
-#include "webrtc/modules/remote_bitrate_estimator/test/packet_sender.h"
-#include "webrtc/rtc_base/arraysize.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/testsupport/fileutils.h"
-
-namespace webrtc {
-namespace testing {
-namespace bwe {
-
-class FilterTest : public ::testing::Test {
- public:
-  void MedianFilterConstantArray() {
-    std::fill_n(raw_signal_, kNumElements, kSignalValue);
-    for (int i = 0; i < kNumElements; ++i) {
-      int size = std::min(5, i + 1);
-      median_filtered_[i] =
-          NadaBweReceiver::MedianFilter(&raw_signal_[i + 1 - size], size);
-    }
-  }
-
-  void MedianFilterIntermittentNoise() {
-    const int kValue = 500;
-    const int kNoise = 100;
-
-    for (int i = 0; i < kNumElements; ++i) {
-      raw_signal_[i] = kValue + kNoise * (i % 10 == 9 ? 1 : 0);
-    }
-    for (int i = 0; i < kNumElements; ++i) {
-      int size = std::min(5, i + 1);
-      median_filtered_[i] =
-          NadaBweReceiver::MedianFilter(&raw_signal_[i + 1 - size], size);
-      EXPECT_EQ(median_filtered_[i], kValue);
-    }
-  }
-
-  void ExponentialSmoothingFilter(const int64_t raw_signal_[],
-                                  int num_elements,
-                                  int64_t exp_smoothed[]) {
-    exp_smoothed[0] =
-        NadaBweReceiver::ExponentialSmoothingFilter(raw_signal_[0], -1, kAlpha);
-    for (int i = 1; i < num_elements; ++i) {
-      exp_smoothed[i] = NadaBweReceiver::ExponentialSmoothingFilter(
-          raw_signal_[i], exp_smoothed[i - 1], kAlpha);
-    }
-  }
-
-  void ExponentialSmoothingConstantArray(int64_t exp_smoothed[]) {
-    std::fill_n(raw_signal_, kNumElements, kSignalValue);
-    ExponentialSmoothingFilter(raw_signal_, kNumElements, exp_smoothed);
-  }
-
- protected:
-  static const int kNumElements = 1000;
-  static const int64_t kSignalValue;
-  static const float kAlpha;
-  int64_t raw_signal_[kNumElements];
-  int64_t median_filtered_[kNumElements];
-};
-
-const int64_t FilterTest::kSignalValue = 200;
-const float FilterTest::kAlpha = 0.1f;
-
-class TestBitrateObserver : public BitrateObserver {
- public:
-  TestBitrateObserver()
-      : last_bitrate_(0), last_fraction_loss_(0), last_rtt_(0) {}
-
-  virtual void OnNetworkChanged(uint32_t bitrate,
-                                uint8_t fraction_loss,
-                                int64_t rtt) {
-    last_bitrate_ = bitrate;
-    last_fraction_loss_ = fraction_loss;
-    last_rtt_ = rtt;
-  }
-  uint32_t last_bitrate_;
-  uint8_t last_fraction_loss_;
-  int64_t last_rtt_;
-};
-
-class NadaSenderSideTest : public ::testing::Test {
- public:
-  NadaSenderSideTest()
-      : observer_(),
-        simulated_clock_(0),
-        nada_sender_(&observer_, &simulated_clock_) {}
-  ~NadaSenderSideTest() {}
-
- private:
-  TestBitrateObserver observer_;
-  SimulatedClock simulated_clock_;
-
- protected:
-  NadaBweSender nada_sender_;
-};
-
-class NadaReceiverSideTest : public ::testing::Test {
- public:
-  NadaReceiverSideTest() : nada_receiver_(kFlowId) {}
-  ~NadaReceiverSideTest() {}
-
- protected:
-  const int kFlowId = 1;  // Arbitrary.
-  NadaBweReceiver nada_receiver_;
-};
-
-class NadaFbGenerator {
- public:
-  NadaFbGenerator();
-
-  static NadaFeedback NotCongestedFb(size_t receiving_rate,
-                                     int64_t ref_signal_ms,
-                                     int64_t send_time_ms) {
-    int64_t exp_smoothed_delay_ms = ref_signal_ms;
-    int64_t est_queuing_delay_signal_ms = ref_signal_ms;
-    int64_t congestion_signal_ms = ref_signal_ms;
-    float derivative = 0.0f;
-    return NadaFeedback(kFlowId, kNowMs, exp_smoothed_delay_ms,
-                        est_queuing_delay_signal_ms, congestion_signal_ms,
-                        derivative, receiving_rate, send_time_ms);
-  }
-
-  static NadaFeedback CongestedFb(size_t receiving_rate, int64_t send_time_ms) {
-    int64_t exp_smoothed_delay_ms = 1000;
-    int64_t est_queuing_delay_signal_ms = 800;
-    int64_t congestion_signal_ms = 1000;
-    float derivative = 1.0f;
-    return NadaFeedback(kFlowId, kNowMs, exp_smoothed_delay_ms,
-                        est_queuing_delay_signal_ms, congestion_signal_ms,
-                        derivative, receiving_rate, send_time_ms);
-  }
-
-  static NadaFeedback ExtremelyCongestedFb(size_t receiving_rate,
-                                           int64_t send_time_ms) {
-    int64_t exp_smoothed_delay_ms = 100000;
-    int64_t est_queuing_delay_signal_ms = 0;
-    int64_t congestion_signal_ms = 100000;
-    float derivative = 10000.0f;
-    return NadaFeedback(kFlowId, kNowMs, exp_smoothed_delay_ms,
-                        est_queuing_delay_signal_ms, congestion_signal_ms,
-                        derivative, receiving_rate, send_time_ms);
-  }
-
- private:
-  // Arbitrary values, won't change these test results.
-  static const int kFlowId = 2;
-  static const int64_t kNowMs = 1000;
-};
-
-// Verify if AcceleratedRampUp is called and that bitrate increases.
-TEST_F(NadaSenderSideTest, AcceleratedRampUp) {
-  const int64_t kRefSignalMs = 1;
-  const int64_t kOneWayDelayMs = 50;
-  int original_bitrate = 2 * NadaBweSender::kMinNadaBitrateKbps;
-  size_t receiving_rate = static_cast<size_t>(original_bitrate);
-  int64_t send_time_ms = nada_sender_.NowMs() - kOneWayDelayMs;
-
-  NadaFeedback not_congested_fb = NadaFbGenerator::NotCongestedFb(
-      receiving_rate, kRefSignalMs, send_time_ms);
-
-  nada_sender_.set_original_operating_mode(true);
-  nada_sender_.set_bitrate_kbps(original_bitrate);
-
-  // Trigger AcceleratedRampUp mode.
-  nada_sender_.GiveFeedback(not_congested_fb);
-  int bitrate_1_kbps = nada_sender_.bitrate_kbps();
-  EXPECT_GT(bitrate_1_kbps, original_bitrate);
-  // Updates the bitrate according to the receiving rate and other constant
-  // parameters.
-  nada_sender_.AcceleratedRampUp(not_congested_fb);
-  EXPECT_EQ(nada_sender_.bitrate_kbps(), bitrate_1_kbps);
-
-  nada_sender_.set_original_operating_mode(false);
-  nada_sender_.set_bitrate_kbps(original_bitrate);
-  // Trigger AcceleratedRampUp mode.
-  nada_sender_.GiveFeedback(not_congested_fb);
-  bitrate_1_kbps = nada_sender_.bitrate_kbps();
-  EXPECT_GT(bitrate_1_kbps, original_bitrate);
-  nada_sender_.AcceleratedRampUp(not_congested_fb);
-  EXPECT_EQ(nada_sender_.bitrate_kbps(), bitrate_1_kbps);
-}
-
-// Verify if AcceleratedRampDown is called and if bitrate decreases.
-TEST_F(NadaSenderSideTest, AcceleratedRampDown) {
-  const int64_t kOneWayDelayMs = 50;
-  int original_bitrate = 3 * NadaBweSender::kMinNadaBitrateKbps;
-  size_t receiving_rate = static_cast<size_t>(original_bitrate);
-  int64_t send_time_ms = nada_sender_.NowMs() - kOneWayDelayMs;
-
-  NadaFeedback congested_fb =
-      NadaFbGenerator::CongestedFb(receiving_rate, send_time_ms);
-
-  nada_sender_.set_original_operating_mode(false);
-  nada_sender_.set_bitrate_kbps(original_bitrate);
-  nada_sender_.GiveFeedback(congested_fb);  // Trigger AcceleratedRampDown mode.
-  int bitrate_1_kbps = nada_sender_.bitrate_kbps();
-  EXPECT_LE(bitrate_1_kbps, original_bitrate * 0.9f + 0.5f);
-  EXPECT_LT(bitrate_1_kbps, original_bitrate);
-
-  // Updates the bitrate according to the receiving rate and other constant
-  // parameters.
-  nada_sender_.AcceleratedRampDown(congested_fb);
-  int bitrate_2_kbps =
-      std::max(nada_sender_.bitrate_kbps(), NadaBweSender::kMinNadaBitrateKbps);
-  EXPECT_EQ(bitrate_2_kbps, bitrate_1_kbps);
-}
-
-TEST_F(NadaSenderSideTest, GradualRateUpdate) {
-  const int64_t kDeltaSMs = 20;
-  const int64_t kRefSignalMs = 20;
-  const int64_t kOneWayDelayMs = 50;
-  int original_bitrate = 5 * NadaBweSender::kMinNadaBitrateKbps;
-  size_t receiving_rate = static_cast<size_t>(original_bitrate);
-  int64_t send_time_ms = nada_sender_.NowMs() - kOneWayDelayMs;
-
-  NadaFeedback congested_fb =
-      NadaFbGenerator::CongestedFb(receiving_rate, send_time_ms);
-  NadaFeedback not_congested_fb = NadaFbGenerator::NotCongestedFb(
-      original_bitrate, kRefSignalMs, send_time_ms);
-
-  nada_sender_.set_bitrate_kbps(original_bitrate);
-  double smoothing_factor = 0.0;
-  nada_sender_.GradualRateUpdate(congested_fb, kDeltaSMs, smoothing_factor);
-  EXPECT_EQ(nada_sender_.bitrate_kbps(), original_bitrate);
-
-  smoothing_factor = 1.0;
-  nada_sender_.GradualRateUpdate(congested_fb, kDeltaSMs, smoothing_factor);
-  EXPECT_LT(nada_sender_.bitrate_kbps(), original_bitrate);
-
-  nada_sender_.set_bitrate_kbps(original_bitrate);
-  nada_sender_.GradualRateUpdate(not_congested_fb, kDeltaSMs, smoothing_factor);
-  EXPECT_GT(nada_sender_.bitrate_kbps(), original_bitrate);
-}
-
-// Sending bitrate should decrease and reach its Min bound.
-TEST_F(NadaSenderSideTest, VeryLowBandwith) {
-  const int64_t kOneWayDelayMs = 50;
-
-  size_t receiving_rate =
-      static_cast<size_t>(NadaBweSender::kMinNadaBitrateKbps);
-  int64_t send_time_ms = nada_sender_.NowMs() - kOneWayDelayMs;
-
-  NadaFeedback extremely_congested_fb =
-      NadaFbGenerator::ExtremelyCongestedFb(receiving_rate, send_time_ms);
-  NadaFeedback congested_fb =
-      NadaFbGenerator::CongestedFb(receiving_rate, send_time_ms);
-
-  nada_sender_.set_bitrate_kbps(5 * NadaBweSender::kMinNadaBitrateKbps);
-  nada_sender_.set_original_operating_mode(true);
-  for (int i = 0; i < 100; ++i) {
-    // Trigger GradualRateUpdate mode.
-    nada_sender_.GiveFeedback(extremely_congested_fb);
-  }
-  // The original implementation doesn't allow the bitrate to stay at kMin,
-  // even if the congestion signal is very high.
-  EXPECT_GE(nada_sender_.bitrate_kbps(), NadaBweSender::kMinNadaBitrateKbps);
-
-  nada_sender_.set_original_operating_mode(false);
-  nada_sender_.set_bitrate_kbps(5 * NadaBweSender::kMinNadaBitrateKbps);
-
-  for (int i = 0; i < 1000; ++i) {
-    int previous_bitrate = nada_sender_.bitrate_kbps();
-    // Trigger AcceleratedRampDown mode.
-    nada_sender_.GiveFeedback(congested_fb);
-    EXPECT_LE(nada_sender_.bitrate_kbps(), previous_bitrate);
-  }
-  EXPECT_EQ(nada_sender_.bitrate_kbps(), NadaBweSender::kMinNadaBitrateKbps);
-}
-
-// Sending bitrate should increase and reach its Max bound.
-TEST_F(NadaSenderSideTest, VeryHighBandwith) {
-  const int64_t kOneWayDelayMs = 50;
-  const size_t kRecentReceivingRate = static_cast<size_t>(kMaxBitrateKbps);
-  const int64_t kRefSignalMs = 1;
-  int64_t send_time_ms = nada_sender_.NowMs() - kOneWayDelayMs;
-
-  NadaFeedback not_congested_fb = NadaFbGenerator::NotCongestedFb(
-      kRecentReceivingRate, kRefSignalMs, send_time_ms);
-
-  nada_sender_.set_original_operating_mode(true);
-  for (int i = 0; i < 100; ++i) {
-    int previous_bitrate = nada_sender_.bitrate_kbps();
-    nada_sender_.GiveFeedback(not_congested_fb);
-    EXPECT_GE(nada_sender_.bitrate_kbps(), previous_bitrate);
-  }
-  EXPECT_EQ(nada_sender_.bitrate_kbps(), kMaxBitrateKbps);
-
-  nada_sender_.set_original_operating_mode(false);
-  nada_sender_.set_bitrate_kbps(NadaBweSender::kMinNadaBitrateKbps);
-
-  for (int i = 0; i < 100; ++i) {
-    int previous_bitrate = nada_sender_.bitrate_kbps();
-    nada_sender_.GiveFeedback(not_congested_fb);
-    EXPECT_GE(nada_sender_.bitrate_kbps(), previous_bitrate);
-  }
-  EXPECT_EQ(nada_sender_.bitrate_kbps(), kMaxBitrateKbps);
-}
-
-TEST_F(NadaReceiverSideTest, FeedbackInitialCases) {
-  std::unique_ptr<NadaFeedback> nada_feedback(
-      static_cast<NadaFeedback*>(nada_receiver_.GetFeedback(0)));
-  EXPECT_EQ(nada_feedback, nullptr);
-
-  nada_feedback.reset(
-      static_cast<NadaFeedback*>(nada_receiver_.GetFeedback(100)));
-  EXPECT_EQ(nada_feedback->exp_smoothed_delay_ms(), -1);
-  EXPECT_EQ(nada_feedback->est_queuing_delay_signal_ms(), 0L);
-  EXPECT_EQ(nada_feedback->congestion_signal(), 0L);
-  EXPECT_EQ(nada_feedback->derivative(), 0.0f);
-  EXPECT_EQ(nada_feedback->receiving_rate(), 0.0f);
-}
-
-TEST_F(NadaReceiverSideTest, FeedbackEmptyQueues) {
-  const int64_t kTimeGapMs = 50;  // Between each packet.
-  const int64_t kOneWayDelayMs = 50;
-
-  // No added latency, delay = kOneWayDelayMs.
-  for (int i = 1; i < 10; ++i) {
-    int64_t send_time_us = i * kTimeGapMs * 1000;
-    int64_t arrival_time_ms = send_time_us / 1000 + kOneWayDelayMs;
-    uint16_t sequence_number = static_cast<uint16_t>(i);
-    // Payload sizes are not important here.
-    const MediaPacket media_packet(kFlowId, send_time_us, 0, sequence_number);
-    nada_receiver_.ReceivePacket(arrival_time_ms, media_packet);
-  }
-
-  // Baseline delay will be equal kOneWayDelayMs.
-  std::unique_ptr<NadaFeedback> nada_feedback(
-      static_cast<NadaFeedback*>(nada_receiver_.GetFeedback(500)));
-  EXPECT_EQ(nada_feedback->exp_smoothed_delay_ms(), 0L);
-  EXPECT_EQ(nada_feedback->est_queuing_delay_signal_ms(), 0L);
-  EXPECT_EQ(nada_feedback->congestion_signal(), 0L);
-  EXPECT_EQ(nada_feedback->derivative(), 0.0f);
-}
-
-TEST_F(NadaReceiverSideTest, FeedbackIncreasingDelay) {
-  // Since packets are 100ms apart, each one corresponds to a feedback.
-  const int64_t kTimeGapMs = 100;  // Between each packet.
-
-  // Raw delays are = [10 20 30 40 50 60 70 80] ms.
-  // Baseline delay will be 50 ms.
-  // Delay signals should be: [0 10 20 30 40 50 60 70] ms.
-  const int64_t kMedianFilteredDelaysMs[] = {0, 5, 10, 15, 20, 30, 40, 50};
-  const int kNumPackets = arraysize(kMedianFilteredDelaysMs);
-  const float kAlpha = 0.1f;  // Used for exponential smoothing.
-
-  int64_t exp_smoothed_delays_ms[kNumPackets];
-  exp_smoothed_delays_ms[0] = kMedianFilteredDelaysMs[0];
-
-  for (int i = 1; i < kNumPackets; ++i) {
-    exp_smoothed_delays_ms[i] = static_cast<int64_t>(
-        kAlpha * kMedianFilteredDelaysMs[i] +
-        (1.0f - kAlpha) * exp_smoothed_delays_ms[i - 1] + 0.5f);
-  }
-
-  for (int i = 0; i < kNumPackets; ++i) {
-    int64_t send_time_us = (i + 1) * kTimeGapMs * 1000;
-    int64_t arrival_time_ms = send_time_us / 1000 + 10 * (i + 1);
-    uint16_t sequence_number = static_cast<uint16_t>(i + 1);
-    // Payload sizes are not important here.
-    const MediaPacket media_packet(kFlowId, send_time_us, 0, sequence_number);
-    nada_receiver_.ReceivePacket(arrival_time_ms, media_packet);
-
-    std::unique_ptr<NadaFeedback> nada_feedback(static_cast<NadaFeedback*>(
-        nada_receiver_.GetFeedback(arrival_time_ms)));
-    EXPECT_EQ(nada_feedback->exp_smoothed_delay_ms(),
-              exp_smoothed_delays_ms[i]);
-    // Since delay signals are lower than 50ms, they will not be non-linearly
-    // warped.
-    EXPECT_EQ(nada_feedback->est_queuing_delay_signal_ms(),
-              exp_smoothed_delays_ms[i]);
-    // Zero loss, congestion signal = queuing_delay
-    EXPECT_EQ(nada_feedback->congestion_signal(), exp_smoothed_delays_ms[i]);
-    if (i == 0) {
-      EXPECT_NEAR(nada_feedback->derivative(),
-                  static_cast<float>(exp_smoothed_delays_ms[i]) / kTimeGapMs,
-                  0.005f);
-    } else {
-      EXPECT_NEAR(nada_feedback->derivative(),
-                  static_cast<float>(exp_smoothed_delays_ms[i] -
-                                     exp_smoothed_delays_ms[i - 1]) /
-                      kTimeGapMs,
-                  0.005f);
-    }
-  }
-}
-
-int64_t Warp(int64_t input) {
-  const int64_t kMinThreshold = 50;   // Referred as d_th.
-  const int64_t kMaxThreshold = 400;  // Referred as d_max.
-  if (input < kMinThreshold) {
-    return input;
-  } else if (input < kMaxThreshold) {
-    return static_cast<int64_t>(
-        pow((static_cast<double>(kMaxThreshold - input)) /
-                (kMaxThreshold - kMinThreshold),
-            4.0) *
-        kMinThreshold);
-  } else {
-    return 0L;
-  }
-}
-
-TEST_F(NadaReceiverSideTest, FeedbackWarpedDelay) {
-  // Since packets are 100ms apart, each one corresponds to a feedback.
-  const int64_t kTimeGapMs = 100;  // Between each packet.
-
-  // Raw delays are = [50 250 450 650 850 1050 1250 1450] ms.
-  // Baseline delay will be 50 ms.
-  // Delay signals should be: [0 200 400 600 800 1000 1200 1400] ms.
-  const int64_t kMedianFilteredDelaysMs[] = {
-      0, 100, 200, 300, 400, 600, 800, 1000};
-  const int kNumPackets = arraysize(kMedianFilteredDelaysMs);
-  const float kAlpha = 0.1f;  // Used for exponential smoothing.
-
-  int64_t exp_smoothed_delays_ms[kNumPackets];
-  exp_smoothed_delays_ms[0] = kMedianFilteredDelaysMs[0];
-
-  for (int i = 1; i < kNumPackets; ++i) {
-    exp_smoothed_delays_ms[i] = static_cast<int64_t>(
-        kAlpha * kMedianFilteredDelaysMs[i] +
-        (1.0f - kAlpha) * exp_smoothed_delays_ms[i - 1] + 0.5f);
-  }
-
-  for (int i = 0; i < kNumPackets; ++i) {
-    int64_t send_time_us = (i + 1) * kTimeGapMs * 1000;
-    int64_t arrival_time_ms = send_time_us / 1000 + 50 + 200 * i;
-    uint16_t sequence_number = static_cast<uint16_t>(i + 1);
-    // Payload sizes are not important here.
-    const MediaPacket media_packet(kFlowId, send_time_us, 0, sequence_number);
-    nada_receiver_.ReceivePacket(arrival_time_ms, media_packet);
-
-    std::unique_ptr<NadaFeedback> nada_feedback(static_cast<NadaFeedback*>(
-        nada_receiver_.GetFeedback(arrival_time_ms)));
-    EXPECT_EQ(nada_feedback->exp_smoothed_delay_ms(),
-              exp_smoothed_delays_ms[i]);
-    // Delays can be non-linearly warped.
-    EXPECT_EQ(nada_feedback->est_queuing_delay_signal_ms(),
-              Warp(exp_smoothed_delays_ms[i]));
-    // Zero loss, congestion signal = queuing_delay
-    EXPECT_EQ(nada_feedback->congestion_signal(),
-              Warp(exp_smoothed_delays_ms[i]));
-  }
-}
-
-TEST_F(FilterTest, MedianConstantArray) {
-  MedianFilterConstantArray();
-  for (int i = 0; i < kNumElements; ++i) {
-    EXPECT_EQ(median_filtered_[i], raw_signal_[i]);
-  }
-}
-
-TEST_F(FilterTest, MedianIntermittentNoise) {
-  MedianFilterIntermittentNoise();
-}
-
-TEST_F(FilterTest, ExponentialSmoothingConstantArray) {
-  int64_t exp_smoothed[kNumElements];
-  ExponentialSmoothingConstantArray(exp_smoothed);
-  for (int i = 0; i < kNumElements; ++i) {
-    EXPECT_EQ(exp_smoothed[i], kSignalValue);
-  }
-}
-
-TEST_F(FilterTest, ExponentialSmoothingInitialPertubation) {
-  const int64_t kSignal[] = {90000, 0, 0, 0, 0, 0};
-  const int kNumElements = arraysize(kSignal);
-  int64_t exp_smoothed[kNumElements];
-  ExponentialSmoothingFilter(kSignal, kNumElements, exp_smoothed);
-  for (int i = 1; i < kNumElements; ++i) {
-    EXPECT_EQ(
-        exp_smoothed[i],
-        static_cast<int64_t>(exp_smoothed[i - 1] * (1.0f - kAlpha) + 0.5f));
-  }
-}
-
-}  // namespace bwe
-}  // namespace testing
-}  // namespace webrtc
diff --git a/modules/remote_bitrate_estimator/test/estimators/remb.cc b/modules/remote_bitrate_estimator/test/estimators/remb.cc
deleted file mode 100644
index c3f1dc9..0000000
--- a/modules/remote_bitrate_estimator/test/estimators/remb.cc
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
- *  Copyright (c) 2015 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 <algorithm>
-
-#include "webrtc/modules/remote_bitrate_estimator/test/estimators/remb.h"
-
-#include "webrtc/modules/bitrate_controller/include/bitrate_controller.h"
-#include "webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_abs_send_time.h"
-#include "webrtc/modules/remote_bitrate_estimator/test/bwe_test_logging.h"
-#include "webrtc/modules/rtp_rtcp/include/receive_statistics.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-namespace testing {
-namespace bwe {
-
-RembBweSender::RembBweSender(int kbps, BitrateObserver* observer, Clock* clock)
-    : bitrate_controller_(
-          BitrateController::CreateBitrateController(clock,
-                                                     observer,
-                                                     &event_log_)),
-      feedback_observer_(bitrate_controller_->CreateRtcpBandwidthObserver()),
-      clock_(clock) {
-  assert(kbps >= kMinBitrateKbps);
-  assert(kbps <= kMaxBitrateKbps);
-  bitrate_controller_->SetStartBitrate(1000 * kbps);
-  bitrate_controller_->SetMinMaxBitrate(1000 * kMinBitrateKbps,
-                                        1000 * kMaxBitrateKbps);
-}
-
-RembBweSender::~RembBweSender() {
-}
-
-void RembBweSender::GiveFeedback(const FeedbackPacket& feedback) {
-  const RembFeedback& remb_feedback =
-      static_cast<const RembFeedback&>(feedback);
-  feedback_observer_->OnReceivedEstimatedBitrate(remb_feedback.estimated_bps());
-  ReportBlockList report_blocks;
-  report_blocks.push_back(remb_feedback.report_block());
-  feedback_observer_->OnReceivedRtcpReceiverReport(
-      report_blocks, 0, clock_->TimeInMilliseconds());
-  bitrate_controller_->Process();
-}
-
-int64_t RembBweSender::TimeUntilNextProcess() {
-  return bitrate_controller_->TimeUntilNextProcess();
-}
-
-void RembBweSender::Process() {
-  bitrate_controller_->Process();
-}
-
-int RembBweSender::GetFeedbackIntervalMs() const {
-  return 100;
-}
-
-RembReceiver::RembReceiver(int flow_id, bool plot)
-    : BweReceiver(flow_id),
-      estimate_log_prefix_(),
-      plot_estimate_(plot),
-      clock_(0),
-      recv_stats_(ReceiveStatistics::Create(&clock_)),
-      latest_estimate_bps_(-1),
-      last_feedback_ms_(-1),
-      estimator_(new RemoteBitrateEstimatorAbsSendTime(this, &clock_)) {
-  std::stringstream ss;
-  ss << "Estimate_" << flow_id_ << "#1";
-  estimate_log_prefix_ = ss.str();
-  // Default RTT in RemoteRateControl is 200 ms ; 50 ms is more realistic.
-  estimator_->OnRttUpdate(50, 50);
-  estimator_->SetMinBitrate(kRemoteBitrateEstimatorMinBitrateBps);
-}
-
-RembReceiver::~RembReceiver() {
-}
-
-void RembReceiver::ReceivePacket(int64_t arrival_time_ms,
-                                 const MediaPacket& media_packet) {
-  recv_stats_->IncomingPacket(media_packet.header(),
-                              media_packet.payload_size(), false);
-
-  latest_estimate_bps_ = -1;
-
-  int64_t step_ms = std::max<int64_t>(estimator_->TimeUntilNextProcess(), 0);
-  while ((clock_.TimeInMilliseconds() + step_ms) < arrival_time_ms) {
-    clock_.AdvanceTimeMilliseconds(step_ms);
-    estimator_->Process();
-    step_ms = std::max<int64_t>(estimator_->TimeUntilNextProcess(), 0);
-  }
-  estimator_->IncomingPacket(arrival_time_ms, media_packet.payload_size(),
-                             media_packet.header());
-  clock_.AdvanceTimeMilliseconds(arrival_time_ms - clock_.TimeInMilliseconds());
-  ASSERT_TRUE(arrival_time_ms == clock_.TimeInMilliseconds());
-
-  // Log received packet information.
-  BweReceiver::ReceivePacket(arrival_time_ms, media_packet);
-}
-
-FeedbackPacket* RembReceiver::GetFeedback(int64_t now_ms) {
-  BWE_TEST_LOGGING_CONTEXT("Remb");
-  uint32_t estimated_bps = 0;
-  RembFeedback* feedback = NULL;
-  if (LatestEstimate(&estimated_bps)) {
-    auto report_blocks = recv_stats_->RtcpReportBlocks(1);
-    if (!report_blocks.empty()) {
-      const rtcp::ReportBlock& stat = report_blocks.front();
-      latest_report_block_.fraction_lost = stat.fraction_lost();
-      latest_report_block_.packets_lost = stat.cumulative_lost();
-      latest_report_block_.extended_highest_sequence_number =
-          stat.extended_high_seq_num();
-      latest_report_block_.jitter = stat.jitter();
-    }
-
-    feedback = new RembFeedback(flow_id_, now_ms * 1000, last_feedback_ms_,
-                                estimated_bps, latest_report_block_);
-    last_feedback_ms_ = now_ms;
-
-    double estimated_kbps = static_cast<double>(estimated_bps) / 1000.0;
-    RTC_UNUSED(estimated_kbps);
-    if (plot_estimate_) {
-      BWE_TEST_LOGGING_PLOT(0, estimate_log_prefix_,
-                            clock_.TimeInMilliseconds(), estimated_kbps);
-    }
-  }
-  return feedback;
-}
-
-void RembReceiver::OnReceiveBitrateChanged(const std::vector<uint32_t>& ssrcs,
-                                           uint32_t bitrate) {}
-
-bool RembReceiver::LatestEstimate(uint32_t* estimate_bps) {
-  if (latest_estimate_bps_ < 0) {
-    std::vector<uint32_t> ssrcs;
-    uint32_t bps = 0;
-    if (!estimator_->LatestEstimate(&ssrcs, &bps)) {
-      return false;
-    }
-    latest_estimate_bps_ = bps;
-  }
-  *estimate_bps = latest_estimate_bps_;
-  return true;
-}
-
-}  // namespace bwe
-}  // namespace testing
-}  // namespace webrtc
diff --git a/modules/remote_bitrate_estimator/test/estimators/remb.h b/modules/remote_bitrate_estimator/test/estimators/remb.h
deleted file mode 100644
index 77086a7..0000000
--- a/modules/remote_bitrate_estimator/test/estimators/remb.h
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- *  Copyright (c) 2015 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_REMOTE_BITRATE_ESTIMATOR_TEST_ESTIMATORS_REMB_H_
-#define WEBRTC_MODULES_REMOTE_BITRATE_ESTIMATOR_TEST_ESTIMATORS_REMB_H_
-
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "webrtc/logging/rtc_event_log/mock/mock_rtc_event_log.h"
-#include "webrtc/modules/remote_bitrate_estimator/test/bwe.h"
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace webrtc {
-
-class BitrateObserver;
-class BitrateController;
-class ReceiveStatistics;
-class StreamStatistician;
-
-namespace testing {
-namespace bwe {
-
-class RembBweSender : public BweSender {
- public:
-  RembBweSender(int kbps, BitrateObserver* observer, Clock* clock);
-  virtual ~RembBweSender();
-
-  int GetFeedbackIntervalMs() const override;
-  void GiveFeedback(const FeedbackPacket& feedback) override;
-  void OnPacketsSent(const Packets& packets) override {}
-  int64_t TimeUntilNextProcess() override;
-  void Process() override;
-
- protected:
-  std::unique_ptr<BitrateController> bitrate_controller_;
-  std::unique_ptr<RtcpBandwidthObserver> feedback_observer_;
-
- private:
-  Clock* clock_;
-  ::testing::NiceMock<MockRtcEventLog> event_log_;
-
-  RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(RembBweSender);
-};
-
-class RembReceiver : public BweReceiver, public RemoteBitrateObserver {
- public:
-  static const uint32_t kRemoteBitrateEstimatorMinBitrateBps = 30000;
-
-  RembReceiver(int flow_id, bool plot);
-  virtual ~RembReceiver();
-
-  void ReceivePacket(int64_t arrival_time_ms,
-                     const MediaPacket& media_packet) override;
-  FeedbackPacket* GetFeedback(int64_t now_ms) override;
-  // Implements RemoteBitrateObserver.
-  void OnReceiveBitrateChanged(const std::vector<uint32_t>& ssrcs,
-                               uint32_t bitrate) override;
-
- private:
-  bool LatestEstimate(uint32_t* estimate_bps);
-
-  std::string estimate_log_prefix_;
-  bool plot_estimate_ = false;
-  SimulatedClock clock_;
-  std::unique_ptr<ReceiveStatistics> recv_stats_;
-  int64_t latest_estimate_bps_;
-  int64_t last_feedback_ms_;
-  std::unique_ptr<RemoteBitrateEstimator> estimator_;
-  RTCPReportBlock latest_report_block_;
-
-  RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(RembReceiver);
-};
-
-}  // namespace bwe
-}  // namespace testing
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_REMOTE_BITRATE_ESTIMATOR_TEST_ESTIMATORS_REMB_H_
diff --git a/modules/remote_bitrate_estimator/test/estimators/send_side.cc b/modules/remote_bitrate_estimator/test/estimators/send_side.cc
deleted file mode 100644
index d419240..0000000
--- a/modules/remote_bitrate_estimator/test/estimators/send_side.cc
+++ /dev/null
@@ -1,178 +0,0 @@
-/*
- *  Copyright (c) 2015 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/remote_bitrate_estimator/test/estimators/send_side.h"
-
-#include <algorithm>
-
-#include "webrtc/modules/congestion_controller/delay_based_bwe.h"
-#include "webrtc/modules/remote_bitrate_estimator/test/bwe_test_logging.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/ptr_util.h"
-
-namespace webrtc {
-namespace testing {
-namespace bwe {
-
-const int kFeedbackIntervalMs = 50;
-
-SendSideBweSender::SendSideBweSender(int kbps,
-                                     BitrateObserver* observer,
-                                     Clock* clock)
-    : bitrate_controller_(
-          BitrateController::CreateBitrateController(clock,
-                                                     observer,
-                                                     &event_log_)),
-      acknowledged_bitrate_estimator_(
-          rtc::MakeUnique<AcknowledgedBitrateEstimator>()),
-      bwe_(new DelayBasedBwe(nullptr, clock)),
-      feedback_observer_(bitrate_controller_->CreateRtcpBandwidthObserver()),
-      clock_(clock),
-      send_time_history_(clock_, 10000),
-      has_received_ack_(false),
-      last_acked_seq_num_(0),
-      last_log_time_ms_(0) {
-  assert(kbps >= kMinBitrateKbps);
-  assert(kbps <= kMaxBitrateKbps);
-  bitrate_controller_->SetStartBitrate(1000 * kbps);
-  bitrate_controller_->SetMinMaxBitrate(1000 * kMinBitrateKbps,
-                                        1000 * kMaxBitrateKbps);
-  bwe_->SetMinBitrate(1000 * kMinBitrateKbps);
-}
-
-SendSideBweSender::~SendSideBweSender() {}
-
-int SendSideBweSender::GetFeedbackIntervalMs() const {
-  return kFeedbackIntervalMs;
-}
-
-void SendSideBweSender::GiveFeedback(const FeedbackPacket& feedback) {
-  const SendSideBweFeedback& fb =
-      static_cast<const SendSideBweFeedback&>(feedback);
-  if (fb.packet_feedback_vector().empty())
-    return;
-  std::vector<PacketFeedback> packet_feedback_vector(
-      fb.packet_feedback_vector());
-  for (PacketFeedback& packet_feedback : packet_feedback_vector) {
-    if (!send_time_history_.GetFeedback(&packet_feedback, true)) {
-      int64_t now_ms = clock_->TimeInMilliseconds();
-      if (now_ms - last_log_time_ms_ > 5000) {
-        LOG(LS_WARNING) << "Ack arrived too late.";
-        last_log_time_ms_ = now_ms;
-      }
-    }
-  }
-
-  int64_t rtt_ms =
-      clock_->TimeInMilliseconds() - feedback.latest_send_time_ms();
-  bwe_->OnRttUpdate(rtt_ms, rtt_ms);
-  BWE_TEST_LOGGING_PLOT(1, "RTT", clock_->TimeInMilliseconds(), rtt_ms);
-
-  std::sort(packet_feedback_vector.begin(), packet_feedback_vector.end(),
-            PacketFeedbackComparator());
-  acknowledged_bitrate_estimator_->IncomingPacketFeedbackVector(
-      packet_feedback_vector);
-  DelayBasedBwe::Result result = bwe_->IncomingPacketFeedbackVector(
-      packet_feedback_vector, acknowledged_bitrate_estimator_->bitrate_bps());
-  if (result.updated)
-    bitrate_controller_->OnDelayBasedBweResult(result);
-
-  if (has_received_ack_) {
-    int expected_packets = fb.packet_feedback_vector().back().sequence_number -
-                           last_acked_seq_num_;
-    // Assuming no reordering for now.
-    if (expected_packets > 0) {
-      int lost_packets = expected_packets -
-                         static_cast<int>(fb.packet_feedback_vector().size());
-      report_block_.fraction_lost = (lost_packets << 8) / expected_packets;
-      report_block_.packets_lost += lost_packets;
-      uint32_t unwrapped = seq_num_unwrapper_.Unwrap(
-          packet_feedback_vector.back().sequence_number);
-      report_block_.extended_highest_sequence_number =
-          std::max(unwrapped, report_block_.extended_highest_sequence_number);
-      ReportBlockList report_blocks;
-      report_blocks.push_back(report_block_);
-      feedback_observer_->OnReceivedRtcpReceiverReport(
-          report_blocks, rtt_ms, clock_->TimeInMilliseconds());
-    }
-    bitrate_controller_->Process();
-
-    last_acked_seq_num_ = LatestSequenceNumber(
-        packet_feedback_vector.back().sequence_number, last_acked_seq_num_);
-  } else {
-    last_acked_seq_num_ = packet_feedback_vector.back().sequence_number;
-    has_received_ack_ = true;
-  }
-}
-
-void SendSideBweSender::OnPacketsSent(const Packets& packets) {
-  for (Packet* packet : packets) {
-    if (packet->GetPacketType() == Packet::kMedia) {
-      MediaPacket* media_packet = static_cast<MediaPacket*>(packet);
-      // TODO(philipel): Add probe_cluster_id to Packet class in order
-      //                 to create tests for probing using cluster ids.
-      PacketFeedback packet_feedback(
-          clock_->TimeInMilliseconds(), media_packet->header().sequenceNumber,
-          media_packet->payload_size(), 0, 0, PacedPacketInfo());
-      send_time_history_.AddAndRemoveOld(packet_feedback);
-      send_time_history_.OnSentPacket(media_packet->header().sequenceNumber,
-                                      media_packet->sender_timestamp_ms());
-    }
-  }
-}
-
-void SendSideBweSender::OnReceiveBitrateChanged(
-    const std::vector<uint32_t>& ssrcs,
-    uint32_t bitrate) {
-  feedback_observer_->OnReceivedEstimatedBitrate(bitrate);
-}
-
-int64_t SendSideBweSender::TimeUntilNextProcess() {
-  return bitrate_controller_->TimeUntilNextProcess();
-}
-
-void SendSideBweSender::Process() {
-  bitrate_controller_->Process();
-}
-
-SendSideBweReceiver::SendSideBweReceiver(int flow_id)
-    : BweReceiver(flow_id), last_feedback_ms_(0) {
-}
-
-SendSideBweReceiver::~SendSideBweReceiver() {
-}
-
-void SendSideBweReceiver::ReceivePacket(int64_t arrival_time_ms,
-                                        const MediaPacket& media_packet) {
-  packet_feedback_vector_.push_back(
-      PacketFeedback(-1, arrival_time_ms, media_packet.sender_timestamp_ms(),
-                     media_packet.header().sequenceNumber,
-                     media_packet.payload_size(), 0, 0, PacedPacketInfo()));
-
-  // Log received packet information.
-  BweReceiver::ReceivePacket(arrival_time_ms, media_packet);
-}
-
-FeedbackPacket* SendSideBweReceiver::GetFeedback(int64_t now_ms) {
-  if (now_ms - last_feedback_ms_ < kFeedbackIntervalMs)
-    return NULL;
-  last_feedback_ms_ = now_ms;
-  int64_t corrected_send_time_ms =
-      packet_feedback_vector_.back().send_time_ms + now_ms -
-      packet_feedback_vector_.back().arrival_time_ms;
-  FeedbackPacket* fb = new SendSideBweFeedback(
-      flow_id_, now_ms * 1000, corrected_send_time_ms, packet_feedback_vector_);
-  packet_feedback_vector_.clear();
-  return fb;
-}
-
-}  // namespace bwe
-}  // namespace testing
-}  // namespace webrtc
diff --git a/modules/remote_bitrate_estimator/test/estimators/send_side.h b/modules/remote_bitrate_estimator/test/estimators/send_side.h
deleted file mode 100644
index ed6a7cd..0000000
--- a/modules/remote_bitrate_estimator/test/estimators/send_side.h
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- *  Copyright (c) 2015 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_REMOTE_BITRATE_ESTIMATOR_TEST_ESTIMATORS_SEND_SIDE_H_
-#define WEBRTC_MODULES_REMOTE_BITRATE_ESTIMATOR_TEST_ESTIMATORS_SEND_SIDE_H_
-
-#include <memory>
-#include <vector>
-
-#include "webrtc/logging/rtc_event_log/mock/mock_rtc_event_log.h"
-#include "webrtc/modules/congestion_controller/acknowledged_bitrate_estimator.h"
-#include "webrtc/modules/remote_bitrate_estimator/include/send_time_history.h"
-#include "webrtc/modules/remote_bitrate_estimator/test/bwe.h"
-
-namespace webrtc {
-namespace testing {
-namespace bwe {
-
-class SendSideBweSender : public BweSender, public RemoteBitrateObserver {
- public:
-  SendSideBweSender(int kbps, BitrateObserver* observer, Clock* clock);
-  virtual ~SendSideBweSender();
-
-  int GetFeedbackIntervalMs() const override;
-  void GiveFeedback(const FeedbackPacket& feedback) override;
-  void OnPacketsSent(const Packets& packets) override;
-  void OnReceiveBitrateChanged(const std::vector<uint32_t>& ssrcs,
-                               uint32_t bitrate) override;
-  int64_t TimeUntilNextProcess() override;
-  void Process() override;
-
- protected:
-  std::unique_ptr<BitrateController> bitrate_controller_;
-  std::unique_ptr<AcknowledgedBitrateEstimator> acknowledged_bitrate_estimator_;
-  std::unique_ptr<DelayBasedBwe> bwe_;
-  std::unique_ptr<RtcpBandwidthObserver> feedback_observer_;
-
- private:
-  Clock* const clock_;
-  RTCPReportBlock report_block_;
-  SendTimeHistory send_time_history_;
-  bool has_received_ack_;
-  uint16_t last_acked_seq_num_;
-  int64_t last_log_time_ms_;
-  SequenceNumberUnwrapper seq_num_unwrapper_;
-  ::testing::NiceMock<MockRtcEventLog> event_log_;
-
-  RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(SendSideBweSender);
-};
-
-class SendSideBweReceiver : public BweReceiver {
- public:
-  explicit SendSideBweReceiver(int flow_id);
-  virtual ~SendSideBweReceiver();
-
-  void ReceivePacket(int64_t arrival_time_ms,
-                     const MediaPacket& media_packet) override;
-  FeedbackPacket* GetFeedback(int64_t now_ms) override;
-
- private:
-  int64_t last_feedback_ms_;
-  std::vector<PacketFeedback> packet_feedback_vector_;
-};
-
-}  // namespace bwe
-}  // namespace testing
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_REMOTE_BITRATE_ESTIMATOR_TEST_ESTIMATORS_SEND_SIDE_H_
diff --git a/modules/remote_bitrate_estimator/test/estimators/tcp.cc b/modules/remote_bitrate_estimator/test/estimators/tcp.cc
deleted file mode 100644
index fefc847..0000000
--- a/modules/remote_bitrate_estimator/test/estimators/tcp.cc
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- *  Copyright (c) 2015 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 <algorithm>
-
-#include "webrtc/modules/remote_bitrate_estimator/test/estimators/tcp.h"
-
-#include "webrtc/modules/bitrate_controller/include/bitrate_controller.h"
-#include "webrtc/modules/remote_bitrate_estimator/test/bwe_test_logging.h"
-#include "webrtc/modules/rtp_rtcp/include/receive_statistics.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-namespace testing {
-namespace bwe {
-
-TcpBweReceiver::TcpBweReceiver(int flow_id)
-    : BweReceiver(flow_id),
-      last_feedback_ms_(0),
-      latest_owd_ms_(0) {
-}
-
-TcpBweReceiver::~TcpBweReceiver() {
-}
-
-void TcpBweReceiver::ReceivePacket(int64_t arrival_time_ms,
-                                   const MediaPacket& media_packet) {
-  latest_owd_ms_ = arrival_time_ms - media_packet.sender_timestamp_ms() / 1000;
-  acks_.push_back(media_packet.header().sequenceNumber);
-
-  // Log received packet information.
-  BweReceiver::ReceivePacket(arrival_time_ms, media_packet);
-}
-
-FeedbackPacket* TcpBweReceiver::GetFeedback(int64_t now_ms) {
-  int64_t corrected_send_time_ms = now_ms - latest_owd_ms_;
-  FeedbackPacket* fb =
-      new TcpFeedback(flow_id_, now_ms * 1000, corrected_send_time_ms, acks_);
-  last_feedback_ms_ = now_ms;
-  acks_.clear();
-  return fb;
-}
-
-}  // namespace bwe
-}  // namespace testing
-}  // namespace webrtc
diff --git a/modules/remote_bitrate_estimator/test/estimators/tcp.h b/modules/remote_bitrate_estimator/test/estimators/tcp.h
deleted file mode 100644
index b33c93e..0000000
--- a/modules/remote_bitrate_estimator/test/estimators/tcp.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- *  Copyright (c) 2015 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_REMOTE_BITRATE_ESTIMATOR_TEST_ESTIMATORS_TCP_H_
-#define WEBRTC_MODULES_REMOTE_BITRATE_ESTIMATOR_TEST_ESTIMATORS_TCP_H_
-
-#include <vector>
-
-#include "webrtc/modules/remote_bitrate_estimator/test/bwe.h"
-
-namespace webrtc {
-namespace testing {
-namespace bwe {
-class TcpBweReceiver : public BweReceiver {
- public:
-  explicit TcpBweReceiver(int flow_id);
-  virtual ~TcpBweReceiver();
-
-  void ReceivePacket(int64_t arrival_time_ms,
-                     const MediaPacket& media_packet) override;
-  FeedbackPacket* GetFeedback(int64_t now_ms) override;
-
- private:
-  int64_t last_feedback_ms_;
-  int64_t latest_owd_ms_;
-  std::vector<uint16_t> acks_;
-};
-}  // namespace bwe
-}  // namespace testing
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_REMOTE_BITRATE_ESTIMATOR_TEST_ESTIMATORS_TCP_H_
diff --git a/modules/remote_bitrate_estimator/test/metric_recorder.cc b/modules/remote_bitrate_estimator/test/metric_recorder.cc
deleted file mode 100644
index c0dc741..0000000
--- a/modules/remote_bitrate_estimator/test/metric_recorder.cc
+++ /dev/null
@@ -1,445 +0,0 @@
-/*
- *  Copyright (c) 2015 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/remote_bitrate_estimator/test/metric_recorder.h"
-
-#include <algorithm>
-
-#include "webrtc/modules/remote_bitrate_estimator/test/packet_sender.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-namespace testing {
-namespace bwe {
-
-namespace {
-// Holder mean, Manhattan distance for p=1, EuclidianNorm/sqrt(n) for p=2.
-template <typename T>
-double NormLp(T sum, size_t size, double p) {
-  return pow(sum / size, 1.0 / p);
-}
-}
-
-const double kP = 1.0;  // Used for Norm Lp.
-
-LinkShare::LinkShare(ChokeFilter* choke_filter)
-    : choke_filter_(choke_filter), running_flows_(choke_filter->flow_ids()) {
-}
-
-void LinkShare::PauseFlow(int flow_id) {
-  running_flows_.erase(flow_id);
-}
-
-void LinkShare::ResumeFlow(int flow_id) {
-  running_flows_.insert(flow_id);
-}
-
-uint32_t LinkShare::TotalAvailableKbps() {
-  return choke_filter_->capacity_kbps();
-}
-
-uint32_t LinkShare::AvailablePerFlowKbps(int flow_id) {
-  uint32_t available_capacity_per_flow_kbps = 0;
-  if (running_flows_.find(flow_id) != running_flows_.end()) {
-    available_capacity_per_flow_kbps =
-        TotalAvailableKbps() / static_cast<uint32_t>(running_flows_.size());
-  }
-  return available_capacity_per_flow_kbps;
-}
-
-MetricRecorder::MetricRecorder(const std::string algorithm_name,
-                               int flow_id,
-                               PacketSender* packet_sender,
-                               LinkShare* link_share)
-    : algorithm_name_(algorithm_name),
-      flow_id_(flow_id),
-      link_share_(link_share),
-      now_ms_(0),
-      sum_delays_ms_(0),
-      delay_histogram_ms_(),
-      sum_delays_square_ms2_(0),
-      sum_throughput_bytes_(0),
-      last_unweighted_estimate_error_(0),
-      optimal_throughput_bits_(0),
-      last_available_bitrate_per_flow_kbps_(0),
-      start_computing_metrics_ms_(0),
-      started_computing_metrics_(false),
-      num_packets_received_(0) {
-  std::fill_n(sum_lp_weighted_estimate_error_, 2, 0);
-  if (packet_sender != nullptr)
-    packet_sender->set_metric_recorder(this);
-}
-
-void MetricRecorder::SetPlotInformation(
-    const std::vector<std::string>& prefixes,
-    bool plot_delay,
-    bool plot_loss) {
-  assert(prefixes.size() == kNumMetrics);
-  for (size_t i = 0; i < kNumMetrics; ++i) {
-    plot_information_[i].prefix = prefixes[i];
-  }
-  plot_information_[kThroughput].plot_interval_ms = 100;
-  plot_information_[kSendingEstimate].plot_interval_ms = 100;
-  plot_information_[kDelay].plot_interval_ms = 100;
-  plot_information_[kLoss].plot_interval_ms = 500;
-  plot_information_[kObjective].plot_interval_ms = 1000;
-  plot_information_[kTotalAvailable].plot_interval_ms = 1000;
-  plot_information_[kAvailablePerFlow].plot_interval_ms = 1000;
-
-  for (int i = kThroughput; i < kNumMetrics; ++i) {
-    plot_information_[i].last_plot_ms = 0;
-    switch (i) {
-      case kSendingEstimate:
-      case kObjective:
-      case kAvailablePerFlow:
-        plot_information_[i].plot = false;
-        break;
-      case kLoss:
-        plot_information_[i].plot = plot_loss;
-        break;
-      case kDelay:
-        plot_information_[i].plot = plot_delay;
-        break;
-      default:
-        plot_information_[i].plot = true;
-    }
-  }
-}
-
-void MetricRecorder::PlotAllDynamics() {
-  for (int i = kThroughput; i < kNumMetrics; ++i) {
-    if (plot_information_[i].plot &&
-        now_ms_ - plot_information_[i].last_plot_ms >=
-            plot_information_[i].plot_interval_ms) {
-      PlotDynamics(i);
-    }
-  }
-}
-
-void MetricRecorder::PlotDynamics(int metric) {
-  if (metric == kTotalAvailable) {
-    BWE_TEST_LOGGING_PLOT_WITH_NAME_AND_SSRC(
-        0, plot_information_[kTotalAvailable].prefix, now_ms_,
-        GetTotalAvailableKbps(), flow_id_, "Available");
-  } else if (metric == kAvailablePerFlow) {
-    BWE_TEST_LOGGING_PLOT_WITH_NAME_AND_SSRC(
-        0, plot_information_[kAvailablePerFlow].prefix, now_ms_,
-        GetAvailablePerFlowKbps(), flow_id_, "Available_per_flow");
-  } else {
-    PlotLine(metric, plot_information_[metric].prefix,
-             plot_information_[metric].time_ms,
-             plot_information_[metric].value);
-  }
-  plot_information_[metric].last_plot_ms = now_ms_;
-}
-
-template <typename T>
-void MetricRecorder::PlotLine(int windows_id,
-                              const std::string& prefix,
-                              int64_t time_ms,
-                              T y) {
-  BWE_TEST_LOGGING_PLOT_WITH_NAME_AND_SSRC(windows_id, prefix, time_ms,
-                                           static_cast<double>(y), flow_id_,
-                                           algorithm_name_);
-}
-
-void MetricRecorder::UpdateTimeMs(int64_t time_ms) {
-  now_ms_ = std::max(now_ms_, time_ms);
-}
-
-void MetricRecorder::UpdateThroughput(int64_t bitrate_kbps,
-                                      size_t payload_size) {
-  // Total throughput should be computed before updating the time.
-  PushThroughputBytes(payload_size, now_ms_);
-  plot_information_[kThroughput].Update(now_ms_, bitrate_kbps);
-}
-
-void MetricRecorder::UpdateSendingEstimateKbps(int64_t bitrate_kbps) {
-  plot_information_[kSendingEstimate].Update(now_ms_, bitrate_kbps);
-}
-
-void MetricRecorder::UpdateDelayMs(int64_t delay_ms) {
-  PushDelayMs(delay_ms, now_ms_);
-  plot_information_[kDelay].Update(now_ms_, delay_ms);
-}
-
-void MetricRecorder::UpdateLoss(float loss_ratio) {
-  plot_information_[kLoss].Update(now_ms_, loss_ratio);
-}
-
-void MetricRecorder::UpdateObjective() {
-  plot_information_[kObjective].Update(now_ms_, ObjectiveFunction());
-}
-
-uint32_t MetricRecorder::GetTotalAvailableKbps() {
-  if (link_share_ == nullptr)
-    return 0;
-  return link_share_->TotalAvailableKbps();
-}
-
-uint32_t MetricRecorder::GetAvailablePerFlowKbps() {
-  if (link_share_ == nullptr)
-    return 0;
-  return link_share_->AvailablePerFlowKbps(flow_id_);
-}
-
-uint32_t MetricRecorder::GetSendingEstimateKbps() {
-  return static_cast<uint32_t>(plot_information_[kSendingEstimate].value);
-}
-
-void MetricRecorder::PushDelayMs(int64_t delay_ms, int64_t arrival_time_ms) {
-  if (ShouldRecord(arrival_time_ms)) {
-    sum_delays_ms_ += delay_ms;
-    sum_delays_square_ms2_ += delay_ms * delay_ms;
-    if (delay_histogram_ms_.find(delay_ms) == delay_histogram_ms_.end()) {
-      delay_histogram_ms_[delay_ms] = 0;
-    }
-    ++delay_histogram_ms_[delay_ms];
-  }
-}
-
-void MetricRecorder::UpdateEstimateError(int64_t new_value) {
-  int64_t lp_value = pow(static_cast<double>(std::abs(new_value)), kP);
-  if (new_value < 0) {
-    sum_lp_weighted_estimate_error_[0] += lp_value;
-  } else {
-    sum_lp_weighted_estimate_error_[1] += lp_value;
-  }
-}
-
-void MetricRecorder::PushThroughputBytes(size_t payload_size,
-                                         int64_t arrival_time_ms) {
-  if (ShouldRecord(arrival_time_ms)) {
-    ++num_packets_received_;
-    sum_throughput_bytes_ += payload_size;
-
-    int64_t current_available_per_flow_kbps =
-        static_cast<int64_t>(GetAvailablePerFlowKbps());
-
-    int64_t current_bitrate_diff_kbps =
-        static_cast<int64_t>(GetSendingEstimateKbps()) -
-        current_available_per_flow_kbps;
-
-    int64_t weighted_estimate_error =
-        (((current_bitrate_diff_kbps + last_unweighted_estimate_error_) *
-          (arrival_time_ms - plot_information_[kThroughput].time_ms)) /
-         2);
-
-    UpdateEstimateError(weighted_estimate_error);
-
-    optimal_throughput_bits_ +=
-        ((current_available_per_flow_kbps +
-          last_available_bitrate_per_flow_kbps_) *
-         (arrival_time_ms - plot_information_[kThroughput].time_ms)) /
-        2;
-
-    last_available_bitrate_per_flow_kbps_ = current_available_per_flow_kbps;
-  }
-}
-
-bool MetricRecorder::ShouldRecord(int64_t arrival_time_ms) {
-  if (arrival_time_ms >= start_computing_metrics_ms_) {
-    if (!started_computing_metrics_) {
-      start_computing_metrics_ms_ = arrival_time_ms;
-      now_ms_ = arrival_time_ms;
-      started_computing_metrics_ = true;
-    }
-    return true;
-  } else {
-    return false;
-  }
-}
-
-void MetricRecorder::PlotThroughputHistogram(
-    const std::string& title,
-    const std::string& bwe_name,
-    size_t num_flows,
-    int64_t extra_offset_ms,
-    const std::string optimum_id) const {
-  double optimal_bitrate_per_flow_kbps = static_cast<double>(
-      optimal_throughput_bits_ / RunDurationMs(extra_offset_ms));
-
-  double neg_error = Renormalize(
-      NormLp(sum_lp_weighted_estimate_error_[0], num_packets_received_, kP));
-  double pos_error = Renormalize(
-      NormLp(sum_lp_weighted_estimate_error_[1], num_packets_received_, kP));
-
-  double average_bitrate_kbps = AverageBitrateKbps(extra_offset_ms);
-
-  // Prevent the error to be too close to zero (plotting issue).
-  double extra_error = average_bitrate_kbps / 500;
-
-  std::string optimum_title =
-      optimum_id.empty() ? "optimal_bitrate" : "optimal_bitrates#" + optimum_id;
-
-  BWE_TEST_LOGGING_LABEL(4, title, "average_bitrate_(kbps)", num_flows);
-  BWE_TEST_LOGGING_LIMITERRORBAR(
-      4, bwe_name, average_bitrate_kbps,
-      average_bitrate_kbps - neg_error - extra_error,
-      average_bitrate_kbps + pos_error + extra_error, "estimate_error",
-      optimal_bitrate_per_flow_kbps, optimum_title, flow_id_);
-
-  BWE_TEST_LOGGING_LOG1("RESULTS >>> " + bwe_name + " Channel utilization : ",
-                        "%lf %%",
-                        100.0 * static_cast<double>(average_bitrate_kbps) /
-                            optimal_bitrate_per_flow_kbps);
-
-  RTC_UNUSED(pos_error);
-  RTC_UNUSED(neg_error);
-  RTC_UNUSED(extra_error);
-  RTC_UNUSED(optimal_bitrate_per_flow_kbps);
-}
-
-void MetricRecorder::PlotThroughputHistogram(const std::string& title,
-                                             const std::string& bwe_name,
-                                             size_t num_flows,
-                                             int64_t extra_offset_ms) const {
-  PlotThroughputHistogram(title, bwe_name, num_flows, extra_offset_ms, "");
-}
-
-void MetricRecorder::PlotDelayHistogram(const std::string& title,
-                                        const std::string& bwe_name,
-                                        size_t num_flows,
-                                        int64_t one_way_path_delay_ms) const {
-  double average_delay_ms =
-      static_cast<double>(sum_delays_ms_) / num_packets_received_;
-  int64_t percentile_5_ms = NthDelayPercentile(5);
-  int64_t percentile_95_ms = NthDelayPercentile(95);
-
-  BWE_TEST_LOGGING_LABEL(5, title, "average_delay_(ms)", num_flows);
-  BWE_TEST_LOGGING_ERRORBAR(5, bwe_name, average_delay_ms, percentile_5_ms,
-                            percentile_95_ms, "5th and 95th percentiles",
-                            flow_id_);
-
-  // Log added latency, disregard baseline path delay.
-  BWE_TEST_LOGGING_LOG1("RESULTS >>> " + bwe_name + " Delay average : ",
-                        "%lf ms", average_delay_ms - one_way_path_delay_ms);
-  BWE_TEST_LOGGING_LOG1("RESULTS >>> " + bwe_name + " Delay 5th percentile : ",
-                        "%ld ms", percentile_5_ms - one_way_path_delay_ms);
-  BWE_TEST_LOGGING_LOG1("RESULTS >>> " + bwe_name + " Delay 95th percentile : ",
-                        "%ld ms", percentile_95_ms - one_way_path_delay_ms);
-
-  RTC_UNUSED(average_delay_ms);
-  RTC_UNUSED(percentile_5_ms);
-  RTC_UNUSED(percentile_95_ms);
-}
-
-void MetricRecorder::PlotLossHistogram(const std::string& title,
-                                       const std::string& bwe_name,
-                                       size_t num_flows,
-                                       float global_loss_ratio) const {
-  BWE_TEST_LOGGING_LABEL(6, title, "packet_loss_ratio_(%)", num_flows);
-  BWE_TEST_LOGGING_BAR(6, bwe_name, 100.0f * global_loss_ratio, flow_id_);
-
-  BWE_TEST_LOGGING_LOG1("RESULTS >>> " + bwe_name + " Loss Ratio : ", "%f %%",
-                        100.0f * global_loss_ratio);
-}
-
-void MetricRecorder::PlotObjectiveHistogram(const std::string& title,
-                                            const std::string& bwe_name,
-                                            size_t num_flows) const {
-  BWE_TEST_LOGGING_LABEL(7, title, "objective_function", num_flows);
-  BWE_TEST_LOGGING_BAR(7, bwe_name, ObjectiveFunction(), flow_id_);
-}
-
-void MetricRecorder::PlotZero() {
-  for (int i = kThroughput; i <= kLoss; ++i) {
-    if (plot_information_[i].plot) {
-      std::stringstream prefix;
-      // TODO(terelius): Since this does not use the BWE_TEST_LOGGING macros,
-      // it hasn't been kept up to date with the plot format. Remove or fix?
-      prefix << "Receiver_" << flow_id_ << "_" + plot_information_[i].prefix;
-      PlotLine(i, prefix.str(), now_ms_, 0);
-      plot_information_[i].last_plot_ms = now_ms_;
-    }
-  }
-}
-
-void MetricRecorder::PauseFlow() {
-  PlotZero();
-  link_share_->PauseFlow(flow_id_);
-}
-
-void MetricRecorder::ResumeFlow(int64_t paused_time_ms) {
-  UpdateTimeMs(now_ms_ + paused_time_ms);
-  PlotZero();
-  link_share_->ResumeFlow(flow_id_);
-}
-
-double MetricRecorder::AverageBitrateKbps(int64_t extra_offset_ms) const {
-  int64_t duration_ms = RunDurationMs(extra_offset_ms);
-  if (duration_ms == 0)
-    return 0.0;
-  return static_cast<double>(8 * sum_throughput_bytes_ / duration_ms);
-}
-
-int64_t MetricRecorder::RunDurationMs(int64_t extra_offset_ms) const {
-  return now_ms_ - start_computing_metrics_ms_ - extra_offset_ms;
-}
-
-double MetricRecorder::DelayStdDev() const {
-  if (num_packets_received_ == 0) {
-    return 0.0;
-  }
-  double mean = static_cast<double>(sum_delays_ms_) / num_packets_received_;
-  double mean2 =
-      static_cast<double>(sum_delays_square_ms2_) / num_packets_received_;
-  return sqrt(mean2 - pow(mean, 2.0));
-}
-
-// Since delay values are bounded in a subset of [0, 5000] ms,
-// this function's execution time is O(1), independend of num_packets_received_.
-int64_t MetricRecorder::NthDelayPercentile(int n) const {
-  if (num_packets_received_ == 0) {
-    return 0;
-  }
-  size_t num_packets_remaining = (n * num_packets_received_) / 100;
-  for (auto hist : delay_histogram_ms_) {
-    if (num_packets_remaining <= hist.second)
-      return static_cast<int64_t>(hist.first);
-    num_packets_remaining -= hist.second;
-  }
-
-  assert(false);
-  return -1;
-}
-
-// The weighted_estimate_error_ was weighted based on time windows.
-// This function scales back the result before plotting.
-double MetricRecorder::Renormalize(double x) const {
-  return (x * num_packets_received_) / now_ms_;
-}
-
-inline double U(int64_t x, double alpha) {
-  if (alpha == 1.0) {
-    return log(static_cast<double>(x));
-  }
-  return pow(static_cast<double>(x), 1.0 - alpha) / (1.0 - alpha);
-}
-
-inline double U(size_t x, double alpha) {
-  return U(static_cast<int64_t>(x), alpha);
-}
-
-// TODO(magalhaesc): Update ObjectiveFunction.
-double MetricRecorder::ObjectiveFunction() const {
-  const double kDelta = 0.15;  // Delay penalty factor.
-  const double kAlpha = 1.0;
-  const double kBeta = 1.0;
-
-  double throughput_metric = U(sum_throughput_bytes_, kAlpha);
-  double delay_penalty = kDelta * U(sum_delays_ms_, kBeta);
-
-  return throughput_metric - delay_penalty;
-}
-
-}  // namespace bwe
-}  // namespace testing
-}  // namespace webrtc
diff --git a/modules/remote_bitrate_estimator/test/metric_recorder.h b/modules/remote_bitrate_estimator/test/metric_recorder.h
deleted file mode 100644
index 56ea1df..0000000
--- a/modules/remote_bitrate_estimator/test/metric_recorder.h
+++ /dev/null
@@ -1,188 +0,0 @@
-/*
- *  Copyright (c) 2015 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_REMOTE_BITRATE_ESTIMATOR_TEST_METRIC_RECORDER_H_
-#define WEBRTC_MODULES_REMOTE_BITRATE_ESTIMATOR_TEST_METRIC_RECORDER_H_
-
-#include <map>
-#include <set>
-#include <string>
-#include <vector>
-
-#include "webrtc/rtc_base/gtest_prod_util.h"
-
-namespace webrtc {
-namespace testing {
-namespace bwe {
-
-class ChokeFilter;
-class PacketSender;
-
-class LinkShare {
- public:
-  explicit LinkShare(ChokeFilter* choke_filter);
-
-  void PauseFlow(int flow_id);   // Increases available capacity per flow.
-  void ResumeFlow(int flow_id);  // Decreases available capacity per flow.
-
-  uint32_t TotalAvailableKbps();
-  // If the given flow is paused, its output is zero.
-  uint32_t AvailablePerFlowKbps(int flow_id);
-
- private:
-  ChokeFilter* choke_filter_;
-  std::set<int> running_flows_;
-};
-
-struct PlotInformation {
-  PlotInformation()
-      : prefix(),
-        last_plot_ms(0),
-        time_ms(0),
-        value(0.0),
-        plot_interval_ms(0) {}
-  template <typename T>
-  void Update(int64_t now_ms, T new_value) {
-    time_ms = now_ms;
-    value = static_cast<double>(new_value);
-  }
-  std::string prefix;
-  bool plot;
-  int64_t last_plot_ms;
-  int64_t time_ms;
-  double value;
-  int64_t plot_interval_ms;
-};
-
-class MetricRecorder {
- public:
-  MetricRecorder(const std::string algorithm_name,
-                 int flow_id,
-                 PacketSender* packet_sender,
-                 LinkShare* link_share);
-
-  void SetPlotInformation(const std::vector<std::string>& prefixes,
-                          bool plot_delay,
-                          bool plot_loss);
-
-  template <typename T>
-  void PlotLine(int windows_id,
-                const std::string& prefix,
-                int64_t time_ms,
-                T y);
-
-  void PlotDynamics(int metric);
-  void PlotAllDynamics();
-
-  void UpdateTimeMs(int64_t time_ms);
-  void UpdateThroughput(int64_t bitrate_kbps, size_t payload_size);
-  void UpdateSendingEstimateKbps(int64_t bitrate_kbps);
-  void UpdateDelayMs(int64_t delay_ms);
-  void UpdateLoss(float loss_ratio);
-  void UpdateObjective();
-
-  void PlotThroughputHistogram(const std::string& title,
-                               const std::string& bwe_name,
-                               size_t num_flows,
-                               int64_t extra_offset_ms,
-                               const std::string optimum_id) const;
-
-  void PlotThroughputHistogram(const std::string& title,
-                               const std::string& bwe_name,
-                               size_t num_flows,
-                               int64_t extra_offset_ms) const;
-
-  void PlotDelayHistogram(const std::string& title,
-                          const std::string& bwe_name,
-                          size_t num_flows,
-                          int64_t one_way_path_delay_ms) const;
-
-  void PlotLossHistogram(const std::string& title,
-                         const std::string& bwe_name,
-                         size_t num_flows,
-                         float global_loss_ratio) const;
-
-  void PlotObjectiveHistogram(const std::string& title,
-                              const std::string& bwe_name,
-                              size_t num_flows) const;
-
-  void set_start_computing_metrics_ms(int64_t start_computing_metrics_ms) {
-    start_computing_metrics_ms_ = start_computing_metrics_ms;
-  }
-
-  void set_plot_available_capacity(bool plot) {
-    plot_information_[kTotalAvailable].plot = plot;
-  }
-
-  void PauseFlow();                         // Plot zero.
-  void ResumeFlow(int64_t paused_time_ms);  // Plot zero.
-  void PlotZero();
-
- private:
-  FRIEND_TEST_ALL_PREFIXES(MetricRecorderTest, NoPackets);
-  FRIEND_TEST_ALL_PREFIXES(MetricRecorderTest, RegularPackets);
-  FRIEND_TEST_ALL_PREFIXES(MetricRecorderTest, VariableDelayPackets);
-
-  uint32_t GetTotalAvailableKbps();
-  uint32_t GetAvailablePerFlowKbps();
-  uint32_t GetSendingEstimateKbps();
-  double ObjectiveFunction() const;
-
-  double Renormalize(double x) const;
-  bool ShouldRecord(int64_t arrival_time_ms);
-
-  void PushDelayMs(int64_t delay_ms, int64_t arrival_time_ms);
-  void PushThroughputBytes(size_t throughput_bytes, int64_t arrival_time_ms);
-
-  void UpdateEstimateError(int64_t new_value);
-  double DelayStdDev() const;
-  int64_t NthDelayPercentile(int n) const;
-  double AverageBitrateKbps(int64_t extra_offset_ms) const;
-  int64_t RunDurationMs(int64_t extra_offset_ms) const;
-
-  enum Metrics {
-    kThroughput = 0,
-    kSendingEstimate,
-    kDelay,
-    kLoss,
-    kObjective,
-    kTotalAvailable,
-    kAvailablePerFlow,
-    kNumMetrics
-  };
-
-  std::string algorithm_name_;
-  int flow_id_;
-  LinkShare* link_share_;
-
-  int64_t now_ms_;
-
-  PlotInformation plot_information_[kNumMetrics];
-
-  int64_t sum_delays_ms_;
-  // delay_histogram_ms_[i] counts how many packets have delay = i ms.
-  std::map<int64_t, size_t> delay_histogram_ms_;
-  int64_t sum_delays_square_ms2_;  // Used to compute standard deviation.
-  size_t sum_throughput_bytes_;
-  // ((Receiving rate - available bitrate per flow) * time window)^p.
-  // 0 for negative values, 1 for positive values.
-  int64_t sum_lp_weighted_estimate_error_[2];
-  int64_t last_unweighted_estimate_error_;
-  int64_t optimal_throughput_bits_;
-  int64_t last_available_bitrate_per_flow_kbps_;
-  int64_t start_computing_metrics_ms_;
-  bool started_computing_metrics_;
-  size_t num_packets_received_;
-};
-
-}  // namespace bwe
-}  // namespace testing
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_REMOTE_BITRATE_ESTIMATOR_TEST_METRIC_RECORDER_H_
diff --git a/modules/remote_bitrate_estimator/test/metric_recorder_unittest.cc b/modules/remote_bitrate_estimator/test/metric_recorder_unittest.cc
deleted file mode 100644
index e8f291c..0000000
--- a/modules/remote_bitrate_estimator/test/metric_recorder_unittest.cc
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- *  Copyright (c) 2015 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/remote_bitrate_estimator/test/metric_recorder.h"
-
-#include <math.h>
-#include <algorithm>
-#include <vector>
-
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-namespace testing {
-namespace bwe {
-
-class MetricRecorderTest : public ::testing::Test {
- public:
-  MetricRecorderTest() : metric_recorder_("Test", 0, nullptr, nullptr) {}
-
-  ~MetricRecorderTest() {}
-
- protected:
-  MetricRecorder metric_recorder_;
-};
-
-TEST_F(MetricRecorderTest, NoPackets) {
-  EXPECT_EQ(metric_recorder_.AverageBitrateKbps(0), 0);
-  EXPECT_EQ(metric_recorder_.DelayStdDev(), 0.0);
-  EXPECT_EQ(metric_recorder_.NthDelayPercentile(0), 0);
-  EXPECT_EQ(metric_recorder_.NthDelayPercentile(5), 0);
-  EXPECT_EQ(metric_recorder_.NthDelayPercentile(95), 0);
-  EXPECT_EQ(metric_recorder_.NthDelayPercentile(100), 0);
-}
-
-TEST_F(MetricRecorderTest, RegularPackets) {
-  const size_t kPayloadSizeBytes = 1200;
-  const int64_t kDelayMs = 20;
-  const int64_t kInterpacketGapMs = 5;
-  const int kNumPackets = 1000;
-
-  for (int i = 0; i < kNumPackets; ++i) {
-    int64_t arrival_time_ms = kInterpacketGapMs * i + kDelayMs;
-    metric_recorder_.UpdateTimeMs(arrival_time_ms);
-    metric_recorder_.PushDelayMs(kDelayMs, arrival_time_ms);
-    metric_recorder_.PushThroughputBytes(kPayloadSizeBytes, arrival_time_ms);
-  }
-
-  EXPECT_NEAR(
-      metric_recorder_.AverageBitrateKbps(0),
-      static_cast<uint32_t>(kPayloadSizeBytes * 8) / (kInterpacketGapMs), 10);
-
-  EXPECT_EQ(metric_recorder_.DelayStdDev(), 0.0);
-
-  EXPECT_EQ(metric_recorder_.NthDelayPercentile(0), kDelayMs);
-  EXPECT_EQ(metric_recorder_.NthDelayPercentile(5), kDelayMs);
-  EXPECT_EQ(metric_recorder_.NthDelayPercentile(95), kDelayMs);
-  EXPECT_EQ(metric_recorder_.NthDelayPercentile(100), kDelayMs);
-}
-
-TEST_F(MetricRecorderTest, VariableDelayPackets) {
-  const size_t kPayloadSizeBytes = 1200;
-  const int64_t kInterpacketGapMs = 2000;
-  const int kNumPackets = 1000;
-
-  std::vector<int64_t> delays_ms;
-  for (int i = 0; i < kNumPackets; ++i) {
-    delays_ms.push_back(static_cast<int64_t>(i + 1));
-  }
-  // Order of packets should not matter here.
-  std::random_shuffle(delays_ms.begin(), delays_ms.end());
-
-  int first_received_ms = delays_ms[0];
-  int64_t last_received_ms = 0;
-  for (int i = 0; i < kNumPackets; ++i) {
-    int64_t arrival_time_ms = kInterpacketGapMs * i + delays_ms[i];
-    last_received_ms = std::max(last_received_ms, arrival_time_ms);
-    metric_recorder_.UpdateTimeMs(arrival_time_ms);
-    metric_recorder_.PushDelayMs(delays_ms[i], arrival_time_ms);
-    metric_recorder_.PushThroughputBytes(kPayloadSizeBytes, arrival_time_ms);
-  }
-
-  size_t received_bits = kPayloadSizeBytes * 8 * kNumPackets;
-  EXPECT_NEAR(metric_recorder_.AverageBitrateKbps(0),
-              static_cast<uint32_t>(received_bits) /
-                  ((last_received_ms - first_received_ms)),
-              10);
-
-  double expected_x = (kNumPackets + 1) / 2.0;
-  double expected_x2 = ((kNumPackets + 1) * (2 * kNumPackets + 1)) / 6.0;
-  double var = expected_x2 - pow(expected_x, 2.0);
-  EXPECT_NEAR(metric_recorder_.DelayStdDev(), sqrt(var), kNumPackets / 1000.0);
-
-  EXPECT_EQ(metric_recorder_.NthDelayPercentile(0), 1);
-  EXPECT_EQ(metric_recorder_.NthDelayPercentile(5), (5 * kNumPackets) / 100);
-  EXPECT_EQ(metric_recorder_.NthDelayPercentile(95), (95 * kNumPackets) / 100);
-  EXPECT_EQ(metric_recorder_.NthDelayPercentile(100), kNumPackets);
-}
-
-}  // namespace bwe
-}  // namespace testing
-}  // namespace webrtc
diff --git a/modules/remote_bitrate_estimator/test/packet.h b/modules/remote_bitrate_estimator/test/packet.h
deleted file mode 100644
index 05e1267..0000000
--- a/modules/remote_bitrate_estimator/test/packet.h
+++ /dev/null
@@ -1,220 +0,0 @@
-/*
- *  Copyright (c) 2015 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_REMOTE_BITRATE_ESTIMATOR_TEST_PACKET_H_
-#define WEBRTC_MODULES_REMOTE_BITRATE_ESTIMATOR_TEST_PACKET_H_
-
-#include <list>
-#include <map>
-#include <utility>
-#include <vector>
-
-#include "webrtc/common_types.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
-#include "webrtc/modules/remote_bitrate_estimator/include/remote_bitrate_estimator.h"
-
-namespace webrtc {
-namespace testing {
-namespace bwe {
-
-class Packet {
- public:
-  enum Type { kMedia, kFeedback };
-
-  Packet();
-  Packet(int flow_id, int64_t send_time_us, size_t payload_size);
-  virtual ~Packet();
-
-  virtual bool operator<(const Packet& rhs) const;
-
-  virtual int flow_id() const { return flow_id_; }
-  virtual void set_send_time_us(int64_t send_time_us);
-  virtual int64_t send_time_us() const { return send_time_us_; }
-  virtual int64_t sender_timestamp_us() const { return sender_timestamp_us_; }
-  virtual size_t payload_size() const { return payload_size_; }
-  virtual Packet::Type GetPacketType() const = 0;
-  virtual void set_sender_timestamp_us(int64_t sender_timestamp_us) {
-    sender_timestamp_us_ = sender_timestamp_us;
-  }
-  virtual int64_t creation_time_ms() const {
-    return (creation_time_us_ + 500) / 1000;
-  }
-  virtual int64_t sender_timestamp_ms() const {
-    return (sender_timestamp_us_ + 500) / 1000;
-  }
-  virtual int64_t send_time_ms() const { return (send_time_us_ + 500) / 1000; }
-
- protected:
-  int flow_id_;
-  int64_t creation_time_us_;  // Time when the packet was created.
-  int64_t send_time_us_;  // Time the packet left last processor touching it.
-  int64_t sender_timestamp_us_;  // Time the packet left the Sender.
-  size_t payload_size_;  // Size of the (non-existent, simulated) payload.
-};
-
-class MediaPacket : public Packet {
- public:
-  MediaPacket();
-  MediaPacket(int flow_id,
-              int64_t send_time_us,
-              size_t payload_size,
-              uint16_t sequence_number);
-  MediaPacket(int flow_id,
-              int64_t send_time_us,
-              size_t payload_size,
-              const RTPHeader& header);
-  MediaPacket(int64_t send_time_us, uint16_t sequence_number);
-
-  virtual ~MediaPacket() {}
-
-  int64_t GetAbsSendTimeInMs() const {
-    int64_t timestamp = header_.extension.absoluteSendTime
-                        << kAbsSendTimeInterArrivalUpshift;
-    return 1000.0 * timestamp / static_cast<double>(1 << kInterArrivalShift);
-  }
-  void SetAbsSendTimeMs(int64_t abs_send_time_ms);
-  const RTPHeader& header() const { return header_; }
-  virtual Packet::Type GetPacketType() const { return kMedia; }
-  uint16_t sequence_number() const { return header_.sequenceNumber; }
-
- private:
-  static const int kAbsSendTimeFraction = 18;
-  static const int kAbsSendTimeInterArrivalUpshift = 8;
-  static const int kInterArrivalShift =
-      kAbsSendTimeFraction + kAbsSendTimeInterArrivalUpshift;
-
-  RTPHeader header_;
-};
-
-class FeedbackPacket : public Packet {
- public:
-  FeedbackPacket(int flow_id,
-                 int64_t this_send_time_us,
-                 int64_t latest_send_time_ms)
-      : Packet(flow_id, this_send_time_us, 0),
-        latest_send_time_ms_(latest_send_time_ms) {}
-  virtual ~FeedbackPacket() {}
-
-  virtual Packet::Type GetPacketType() const { return kFeedback; }
-  int64_t latest_send_time_ms() const { return latest_send_time_ms_; }
-
- private:
-  int64_t latest_send_time_ms_;  // Time stamp for the latest sent FbPacket.
-};
-
-class BbrBweFeedback : public FeedbackPacket {
- public:
-  BbrBweFeedback(int flow_id,
-                 int64_t send_time_us,
-                 int64_t latest_send_time_ms,
-                 const std::vector<uint16_t>& packet_feedback_vector);
-  virtual ~BbrBweFeedback() {}
-
-  const std::vector<uint16_t>& packet_feedback_vector() const {
-    return packet_feedback_vector_;
-  }
-
- private:
-  const std::vector<uint16_t> packet_feedback_vector_;
-};
-
-class RembFeedback : public FeedbackPacket {
- public:
-  RembFeedback(int flow_id,
-               int64_t send_time_us,
-               int64_t latest_send_time_ms,
-               uint32_t estimated_bps,
-               RTCPReportBlock report_block);
-  virtual ~RembFeedback() {}
-
-  uint32_t estimated_bps() const { return estimated_bps_; }
-  RTCPReportBlock report_block() const { return report_block_; }
-
- private:
-  const uint32_t estimated_bps_;
-  const RTCPReportBlock report_block_;
-};
-
-class SendSideBweFeedback : public FeedbackPacket {
- public:
-  typedef std::map<uint16_t, int64_t> ArrivalTimesMap;
-  SendSideBweFeedback(
-      int flow_id,
-      int64_t send_time_us,
-      int64_t latest_send_time_ms,
-      const std::vector<PacketFeedback>& packet_feedback_vector);
-  virtual ~SendSideBweFeedback() {}
-
-  const std::vector<PacketFeedback>& packet_feedback_vector() const {
-    return packet_feedback_vector_;
-  }
-
- private:
-  const std::vector<PacketFeedback> packet_feedback_vector_;
-};
-
-class NadaFeedback : public FeedbackPacket {
- public:
-  NadaFeedback(int flow_id,
-               int64_t this_send_time_us,
-               int64_t exp_smoothed_delay_ms,
-               int64_t est_queuing_delay_signal_ms,
-               int64_t congestion_signal,
-               float derivative,
-               float receiving_rate,
-               int64_t latest_send_time_ms)
-      : FeedbackPacket(flow_id, this_send_time_us, latest_send_time_ms),
-        exp_smoothed_delay_ms_(exp_smoothed_delay_ms),
-        est_queuing_delay_signal_ms_(est_queuing_delay_signal_ms),
-        congestion_signal_(congestion_signal),
-        derivative_(derivative),
-        receiving_rate_(receiving_rate) {}
-  virtual ~NadaFeedback() {}
-
-  int64_t exp_smoothed_delay_ms() const { return exp_smoothed_delay_ms_; }
-  int64_t est_queuing_delay_signal_ms() const {
-    return est_queuing_delay_signal_ms_;
-  }
-  int64_t congestion_signal() const { return congestion_signal_; }
-  float derivative() const { return derivative_; }
-  float receiving_rate() const { return receiving_rate_; }
-
- private:
-  int64_t exp_smoothed_delay_ms_;        // Referred as d_hat_n.
-  int64_t est_queuing_delay_signal_ms_;  // Referred as d_tilde_n.
-  int64_t congestion_signal_;            // Referred as x_n.
-  float derivative_;                     // Referred as x'_n.
-  float receiving_rate_;                 // Referred as R_r.
-};
-
-class TcpFeedback : public FeedbackPacket {
- public:
-  TcpFeedback(int flow_id,
-              int64_t send_time_us,
-              int64_t latest_send_time_ms,
-              const std::vector<uint16_t>& acked_packets)
-      : FeedbackPacket(flow_id, send_time_us, latest_send_time_ms),
-        acked_packets_(acked_packets) {}
-  virtual ~TcpFeedback() {}
-
-  const std::vector<uint16_t>& acked_packets() const { return acked_packets_; }
-
- private:
-  const std::vector<uint16_t> acked_packets_;
-};
-
-typedef std::list<Packet*> Packets;
-typedef std::list<Packet*>::iterator PacketsIt;
-typedef std::list<Packet*>::const_iterator PacketsConstIt;
-
-}  // namespace bwe
-}  // namespace testing
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_REMOTE_BITRATE_ESTIMATOR_TEST_PACKET_H_
diff --git a/modules/remote_bitrate_estimator/test/packet_receiver.cc b/modules/remote_bitrate_estimator/test/packet_receiver.cc
deleted file mode 100644
index 9e786e5..0000000
--- a/modules/remote_bitrate_estimator/test/packet_receiver.cc
+++ /dev/null
@@ -1,146 +0,0 @@
-/*
- *  Copyright (c) 2015 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/remote_bitrate_estimator/test/packet_receiver.h"
-
-#include <vector>
-
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/modules/remote_bitrate_estimator/test/bwe.h"
-#include "webrtc/modules/remote_bitrate_estimator/test/bwe_test_framework.h"
-#include "webrtc/modules/rtp_rtcp/include/receive_statistics.h"
-#include "webrtc/system_wrappers/include/clock.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-namespace testing {
-namespace bwe {
-
-PacketReceiver::PacketReceiver(PacketProcessorListener* listener,
-                               int flow_id,
-                               BandwidthEstimatorType bwe_type,
-                               bool plot_delay,
-                               bool plot_bwe,
-                               MetricRecorder* metric_recorder)
-    : PacketProcessor(listener, flow_id, kReceiver),
-      bwe_receiver_(CreateBweReceiver(bwe_type, flow_id, plot_bwe)),
-      metric_recorder_(metric_recorder),
-      plot_delay_(plot_delay),
-      last_delay_plot_ms_(0),
-      // #2 aligns the plot with the right axis.
-      delay_prefix_("Delay_ms#2"),
-      bwe_type_(bwe_type) {
-  if (metric_recorder_ != nullptr) {
-    // Setup the prefix std::strings used when logging.
-    std::vector<std::string> prefixes;
-
-    // Metric recorder plots them in separated figures,
-    // alignment will take place with the #1 left axis.
-    prefixes.push_back("MetricRecorderThroughput_kbps#1");
-    prefixes.push_back("Sending_Estimate_kbps#1");
-    prefixes.push_back("Delay_ms_#1");
-    prefixes.push_back("Packet_Loss_#1");
-    prefixes.push_back("Objective_function_#1");
-
-    // Plot Total/PerFlow Available capacity together with throughputs.
-    prefixes.push_back("Capacity_kbps#1");         // Total Available.
-    prefixes.push_back("PerFlowCapacity_kbps#1");  // Available per flow.
-
-    bool plot_loss = plot_delay;  // Plot loss if delay is plotted.
-    metric_recorder_->SetPlotInformation(prefixes, plot_delay, plot_loss);
-  }
-}
-
-PacketReceiver::PacketReceiver(PacketProcessorListener* listener,
-                               int flow_id,
-                               BandwidthEstimatorType bwe_type,
-                               bool plot_delay,
-                               bool plot_bwe)
-    : PacketReceiver(listener,
-                     flow_id,
-                     bwe_type,
-                     plot_delay,
-                     plot_bwe,
-                     nullptr) {
-}
-
-PacketReceiver::~PacketReceiver() {
-}
-
-void PacketReceiver::RunFor(int64_t time_ms, Packets* in_out) {
-  Packets feedback;
-  for (auto it = in_out->begin(); it != in_out->end();) {
-    // PacketReceivers are only associated with a single stream, and therefore
-    // should only process a single flow id.
-    // TODO(holmer): Break this out into a Demuxer which implements both
-    // PacketProcessorListener and PacketProcessor.
-    BWE_TEST_LOGGING_CONTEXT("Receiver");
-    if ((*it)->GetPacketType() == Packet::kMedia &&
-        (*it)->flow_id() == *flow_ids().begin()) {
-      BWE_TEST_LOGGING_CONTEXT(*flow_ids().begin());
-      const MediaPacket* media_packet = static_cast<const MediaPacket*>(*it);
-      // We're treating the send time (from previous filter) as the arrival
-      // time once packet reaches the estimator.
-      int64_t arrival_time_ms = media_packet->send_time_ms();
-      int64_t send_time_ms = media_packet->creation_time_ms();
-      delay_stats_.Push(arrival_time_ms - send_time_ms);
-
-      if (metric_recorder_ != nullptr) {
-        metric_recorder_->UpdateTimeMs(arrival_time_ms);
-        UpdateMetrics(arrival_time_ms, send_time_ms,
-                      media_packet->payload_size());
-        metric_recorder_->PlotAllDynamics();
-      } else if (plot_delay_) {
-        PlotDelay(arrival_time_ms, send_time_ms);
-      }
-
-      bwe_receiver_->ReceivePacket(arrival_time_ms, *media_packet);
-      FeedbackPacket* fb = bwe_receiver_->GetFeedback(arrival_time_ms);
-      if (fb)
-        feedback.push_back(fb);
-      delete media_packet;
-      it = in_out->erase(it);
-    } else {
-      ++it;
-    }
-  }
-  // Insert feedback packets to be sent back to the sender.
-  in_out->merge(feedback, DereferencingComparator<Packet>);
-}
-
-void PacketReceiver::UpdateMetrics(int64_t arrival_time_ms,
-                                   int64_t send_time_ms,
-                                   size_t payload_size) {
-  metric_recorder_->UpdateThroughput(bwe_receiver_->RecentKbps(), payload_size);
-  metric_recorder_->UpdateDelayMs(arrival_time_ms - send_time_ms);
-  metric_recorder_->UpdateLoss(bwe_receiver_->RecentPacketLossRatio());
-  metric_recorder_->UpdateObjective();
-}
-
-void PacketReceiver::PlotDelay(int64_t arrival_time_ms, int64_t send_time_ms) {
-  const int64_t kDelayPlotIntervalMs = 100;
-  if (arrival_time_ms >= last_delay_plot_ms_ + kDelayPlotIntervalMs) {
-    BWE_TEST_LOGGING_PLOT_WITH_NAME(0, delay_prefix_, arrival_time_ms,
-                                    arrival_time_ms - send_time_ms,
-                                    bwe_names[bwe_type_]);
-    last_delay_plot_ms_ = arrival_time_ms;
-  }
-}
-
-float PacketReceiver::GlobalPacketLoss() {
-  return bwe_receiver_->GlobalReceiverPacketLossRatio();
-}
-
-Stats<double> PacketReceiver::GetDelayStats() const {
-  return delay_stats_;
-}
-}  // namespace bwe
-}  // namespace testing
-}  // namespace webrtc
diff --git a/modules/remote_bitrate_estimator/test/packet_receiver.h b/modules/remote_bitrate_estimator/test/packet_receiver.h
deleted file mode 100644
index c63e38f..0000000
--- a/modules/remote_bitrate_estimator/test/packet_receiver.h
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- *  Copyright (c) 2015 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_REMOTE_BITRATE_ESTIMATOR_TEST_PACKET_RECEIVER_H_
-#define WEBRTC_MODULES_REMOTE_BITRATE_ESTIMATOR_TEST_PACKET_RECEIVER_H_
-
-#include <memory>
-#include <string>
-
-#include "webrtc/modules/remote_bitrate_estimator/test/bwe.h"
-#include "webrtc/modules/remote_bitrate_estimator/test/bwe_test_framework.h"
-#include "webrtc/modules/remote_bitrate_estimator/test/metric_recorder.h"
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace webrtc {
-namespace testing {
-namespace bwe {
-
-class PacketReceiver : public PacketProcessor {
- public:
-  PacketReceiver(PacketProcessorListener* listener,
-                 int flow_id,
-                 BandwidthEstimatorType bwe_type,
-                 bool plot_delay,
-                 bool plot_bwe);
-  PacketReceiver(PacketProcessorListener* listener,
-                 int flow_id,
-                 BandwidthEstimatorType bwe_type,
-                 bool plot_delay,
-                 bool plot_bwe,
-                 MetricRecorder* metric_recorder);
-  ~PacketReceiver();
-
-  // Implements PacketProcessor.
-  void RunFor(int64_t time_ms, Packets* in_out) override;
-
-  void LogStats();
-
-  Stats<double> GetDelayStats() const;
-
-  float GlobalPacketLoss();
-
- protected:
-  void UpdateMetrics(int64_t arrival_time_ms,
-                     int64_t send_time_ms,
-                     size_t payload_size);
-
-  Stats<double> delay_stats_;
-  std::unique_ptr<BweReceiver> bwe_receiver_;
-
- private:
-  void PlotDelay(int64_t arrival_time_ms, int64_t send_time_ms);
-  MetricRecorder* metric_recorder_;
-  bool plot_delay_;  // Used in case there isn't a metric recorder.
-  int64_t last_delay_plot_ms_;
-  std::string delay_prefix_;
-  BandwidthEstimatorType bwe_type_;
-
-  RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(PacketReceiver);
-};
-}  // namespace bwe
-}  // namespace testing
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_REMOTE_BITRATE_ESTIMATOR_TEST_PACKET_RECEIVER_H_
diff --git a/modules/remote_bitrate_estimator/test/packet_sender.cc b/modules/remote_bitrate_estimator/test/packet_sender.cc
deleted file mode 100644
index 1eed380..0000000
--- a/modules/remote_bitrate_estimator/test/packet_sender.cc
+++ /dev/null
@@ -1,508 +0,0 @@
-/*
- *  Copyright (c) 2015 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/remote_bitrate_estimator/test/packet_sender.h"
-
-#include <algorithm>
-#include <list>
-#include <sstream>
-
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/modules/pacing/pacer.h"
-#include "webrtc/modules/remote_bitrate_estimator/test/bbr_paced_sender.h"
-#include "webrtc/modules/remote_bitrate_estimator/test/bwe.h"
-#include "webrtc/modules/remote_bitrate_estimator/test/metric_recorder.h"
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-namespace testing {
-namespace bwe {
-
-void PacketSender::Pause() {
-  running_ = false;
-  if (metric_recorder_ != nullptr) {
-    metric_recorder_->PauseFlow();
-  }
-}
-
-void PacketSender::Resume(int64_t paused_time_ms) {
-  running_ = true;
-  if (metric_recorder_ != nullptr) {
-    metric_recorder_->ResumeFlow(paused_time_ms);
-  }
-}
-
-void PacketSender::set_metric_recorder(MetricRecorder* metric_recorder) {
-  metric_recorder_ = metric_recorder;
-}
-
-void PacketSender::RecordBitrate() {
-  if (metric_recorder_ != nullptr) {
-    BWE_TEST_LOGGING_CONTEXT("Sender");
-    BWE_TEST_LOGGING_CONTEXT(*flow_ids().begin());
-    metric_recorder_->UpdateTimeMs(clock_.TimeInMilliseconds());
-    metric_recorder_->UpdateSendingEstimateKbps(TargetBitrateKbps());
-  }
-}
-
-std::list<FeedbackPacket*> GetFeedbackPackets(Packets* in_out,
-                                              int64_t end_time_ms,
-                                              int flow_id) {
-  std::list<FeedbackPacket*> fb_packets;
-  for (auto it = in_out->begin(); it != in_out->end();) {
-    if ((*it)->send_time_us() > 1000 * end_time_ms)
-      break;
-    if ((*it)->GetPacketType() == Packet::kFeedback &&
-        flow_id == (*it)->flow_id()) {
-      fb_packets.push_back(static_cast<FeedbackPacket*>(*it));
-      it = in_out->erase(it);
-    } else {
-      ++it;
-    }
-  }
-  return fb_packets;
-}
-
-VideoSender::VideoSender(PacketProcessorListener* listener,
-                         VideoSource* source,
-                         BandwidthEstimatorType estimator_type)
-    : PacketSender(listener, source->flow_id()),
-      source_(source),
-      bwe_(CreateBweSender(estimator_type,
-                           source_->bits_per_second() / 1000,
-                           this,
-                           &clock_)),
-      previous_sending_bitrate_(0) {
-  modules_.push_back(bwe_.get());
-}
-
-VideoSender::~VideoSender() {
-}
-
-void VideoSender::Pause() {
-  previous_sending_bitrate_ = TargetBitrateKbps();
-  PacketSender::Pause();
-}
-
-void VideoSender::Resume(int64_t paused_time_ms) {
-  source_->SetBitrateBps(previous_sending_bitrate_);
-  PacketSender::Resume(paused_time_ms);
-}
-
-void VideoSender::RunFor(int64_t time_ms, Packets* in_out) {
-  std::list<FeedbackPacket*> feedbacks = GetFeedbackPackets(
-      in_out, clock_.TimeInMilliseconds() + time_ms, source_->flow_id());
-  ProcessFeedbackAndGeneratePackets(time_ms, &feedbacks, in_out);
-}
-
-void VideoSender::ProcessFeedbackAndGeneratePackets(
-    int64_t time_ms,
-    std::list<FeedbackPacket*>* feedbacks,
-    Packets* packets) {
-  do {
-    // Make sure to at least run Process() below every 100 ms.
-    int64_t time_to_run_ms = std::min<int64_t>(time_ms, 100);
-    if (!feedbacks->empty()) {
-      int64_t time_until_feedback_ms =
-          feedbacks->front()->send_time_ms() - clock_.TimeInMilliseconds();
-      time_to_run_ms =
-          std::max<int64_t>(std::min(time_ms, time_until_feedback_ms), 0);
-    }
-
-    if (!running_) {
-      source_->SetBitrateBps(0);
-    }
-
-    Packets generated;
-    source_->RunFor(time_to_run_ms, &generated);
-    bwe_->OnPacketsSent(generated);
-    packets->merge(generated, DereferencingComparator<Packet>);
-
-    clock_.AdvanceTimeMilliseconds(time_to_run_ms);
-
-    if (!feedbacks->empty()) {
-      bwe_->GiveFeedback(*feedbacks->front());
-      delete feedbacks->front();
-      feedbacks->pop_front();
-    }
-
-    bwe_->Process();
-
-    time_ms -= time_to_run_ms;
-  } while (time_ms > 0);
-  assert(feedbacks->empty());
-}
-
-int VideoSender::GetFeedbackIntervalMs() const {
-  return bwe_->GetFeedbackIntervalMs();
-}
-
-void VideoSender::OnNetworkChanged(uint32_t target_bitrate_bps,
-                                   uint8_t fraction_lost,
-                                   int64_t rtt) {
-  source_->SetBitrateBps(target_bitrate_bps);
-  RecordBitrate();
-}
-
-uint32_t VideoSender::TargetBitrateKbps() {
-  return (source_->bits_per_second() + 500) / 1000;
-}
-
-PacedVideoSender::PacedVideoSender(PacketProcessorListener* listener,
-                                   VideoSource* source,
-                                   BandwidthEstimatorType estimator)
-    : VideoSender(listener, source, estimator),
-      pacer_(
-          estimator == kBbrEstimator
-              ? static_cast<Pacer*>(new BbrPacedSender(&clock_, this, nullptr))
-              : static_cast<Pacer*>(new PacedSender(&clock_, this, nullptr))) {
-  modules_.push_back(pacer_.get());
-  pacer_->SetEstimatedBitrate(source->bits_per_second());
-}
-
-PacedVideoSender::~PacedVideoSender() {
-  for (Packet* packet : pacer_queue_)
-    delete packet;
-  for (Packet* packet : queue_)
-    delete packet;
-}
-
-void PacedVideoSender::RunFor(int64_t time_ms, Packets* in_out) {
-  int64_t end_time_ms = clock_.TimeInMilliseconds() + time_ms;
-  // Run process periodically to allow the packets to be paced out.
-  std::list<FeedbackPacket*> feedbacks =
-      GetFeedbackPackets(in_out, end_time_ms, source_->flow_id());
-  int64_t last_run_time_ms = -1;
-  BWE_TEST_LOGGING_CONTEXT("Sender");
-  BWE_TEST_LOGGING_CONTEXT(source_->flow_id());
-  do {
-    int64_t time_until_process_ms = TimeUntilNextProcess(modules_);
-    int64_t time_until_feedback_ms = time_ms;
-    if (!feedbacks.empty())
-      time_until_feedback_ms = std::max<int64_t>(
-          feedbacks.front()->send_time_ms() - clock_.TimeInMilliseconds(), 0);
-
-    int64_t time_until_next_event_ms =
-        std::min(time_until_feedback_ms, time_until_process_ms);
-
-    time_until_next_event_ms =
-        std::min(source_->GetTimeUntilNextFrameMs(), time_until_next_event_ms);
-
-    // Never run for longer than we have been asked for.
-    if (clock_.TimeInMilliseconds() + time_until_next_event_ms > end_time_ms)
-      time_until_next_event_ms = end_time_ms - clock_.TimeInMilliseconds();
-
-    // Make sure we don't get stuck if an event doesn't trigger. This typically
-    // happens if the prober wants to probe, but there's no packet to send.
-    if (time_until_next_event_ms == 0 && last_run_time_ms == 0)
-      time_until_next_event_ms = 1;
-    last_run_time_ms = time_until_next_event_ms;
-
-    Packets generated_packets;
-    source_->RunFor(time_until_next_event_ms, &generated_packets);
-    if (!generated_packets.empty()) {
-      for (Packet* packet : generated_packets) {
-        MediaPacket* media_packet = static_cast<MediaPacket*>(packet);
-        pacer_->InsertPacket(
-            PacedSender::kNormalPriority, media_packet->header().ssrc,
-            media_packet->header().sequenceNumber, media_packet->send_time_ms(),
-            media_packet->payload_size(), false);
-        pacer_queue_size_in_bytes_ += media_packet->payload_size();
-        pacer_queue_.push_back(packet);
-        assert(pacer_queue_.size() < 10000);
-      }
-    }
-
-    clock_.AdvanceTimeMilliseconds(time_until_next_event_ms);
-
-    if (time_until_next_event_ms == time_until_feedback_ms) {
-      if (!feedbacks.empty()) {
-        bwe_->GiveFeedback(*feedbacks.front());
-        delete feedbacks.front();
-        feedbacks.pop_front();
-      }
-      bwe_->Process();
-    }
-
-    if (time_until_next_event_ms == time_until_process_ms) {
-      CallProcess(modules_);
-    }
-  } while (clock_.TimeInMilliseconds() < end_time_ms);
-  QueuePackets(in_out, end_time_ms * 1000);
-}
-
-int64_t PacedVideoSender::TimeUntilNextProcess(
-    const std::list<Module*>& modules) {
-  int64_t time_until_next_process_ms = 10;
-  for (Module* module : modules) {
-    int64_t next_process_ms = module->TimeUntilNextProcess();
-    if (next_process_ms < time_until_next_process_ms)
-      time_until_next_process_ms = next_process_ms;
-  }
-  if (time_until_next_process_ms < 0)
-    time_until_next_process_ms = 0;
-  return time_until_next_process_ms;
-}
-
-void PacedVideoSender::CallProcess(const std::list<Module*>& modules) {
-  for (Module* module : modules) {
-    if (module->TimeUntilNextProcess() <= 0) {
-      module->Process();
-    }
-  }
-}
-
-void PacedVideoSender::QueuePackets(Packets* batch,
-                                    int64_t end_of_batch_time_us) {
-  queue_.merge(*batch, DereferencingComparator<Packet>);
-  if (queue_.empty()) {
-    return;
-  }
-  Packets::iterator it = queue_.begin();
-  for (; it != queue_.end(); ++it) {
-    if ((*it)->send_time_us() > end_of_batch_time_us) {
-      break;
-    }
-  }
-  Packets to_transfer;
-  to_transfer.splice(to_transfer.begin(), queue_, queue_.begin(), it);
-  bwe_->OnPacketsSent(to_transfer);
-  batch->merge(to_transfer, DereferencingComparator<Packet>);
-}
-
-bool PacedVideoSender::TimeToSendPacket(uint32_t ssrc,
-                                        uint16_t sequence_number,
-                                        int64_t capture_time_ms,
-                                        bool retransmission,
-                                        const PacedPacketInfo& pacing_info) {
-  for (Packets::iterator it = pacer_queue_.begin(); it != pacer_queue_.end();
-       ++it) {
-    MediaPacket* media_packet = static_cast<MediaPacket*>(*it);
-    if (media_packet->header().sequenceNumber == sequence_number) {
-      int64_t pace_out_time_ms = clock_.TimeInMilliseconds();
-
-      // Make sure a packet is never paced out earlier than when it was put into
-      // the pacer.
-      assert(pace_out_time_ms >= media_packet->send_time_ms());
-      media_packet->SetAbsSendTimeMs(pace_out_time_ms);
-      media_packet->set_send_time_us(1000 * pace_out_time_ms);
-      media_packet->set_sender_timestamp_us(1000 * pace_out_time_ms);
-      queue_.push_back(media_packet);
-      pacer_queue_size_in_bytes_ -= media_packet->payload_size();
-      pacer_queue_.erase(it);
-      return true;
-    }
-  }
-  return false;
-}
-
-size_t PacedVideoSender::TimeToSendPadding(size_t bytes,
-                                           const PacedPacketInfo& pacing_info) {
-  return 0;
-}
-
-void PacedVideoSender::OnNetworkChanged(uint32_t target_bitrate_bps,
-                                        uint8_t fraction_lost,
-                                        int64_t rtt) {
-  VideoSender::OnNetworkChanged(target_bitrate_bps, fraction_lost, rtt);
-  pacer_->SetEstimatedBitrate(target_bitrate_bps);
-}
-
-void PacedVideoSender::OnNetworkChanged(uint32_t bitrate_for_encoder_bps,
-                                        uint32_t bitrate_for_pacer_bps,
-                                        bool in_probe_rtt,
-                                        int64_t target_set_time,
-                                        uint64_t congestion_window) {
-  VideoSender::OnNetworkChanged(bitrate_for_encoder_bps, 0u, 0u);
-  pacer_->SetEstimatedBitrateAndCongestionWindow(
-      bitrate_for_pacer_bps, in_probe_rtt, congestion_window);
-}
-
-void PacedVideoSender::OnBytesAcked(size_t bytes) {
-  pacer_->OnBytesAcked(bytes);
-}
-
-const int kNoLimit = std::numeric_limits<int>::max();
-const int kPacketSizeBytes = 1200;
-
-TcpSender::TcpSender(PacketProcessorListener* listener,
-                     int flow_id,
-                     int64_t offset_ms)
-    : TcpSender(listener, flow_id, offset_ms, kNoLimit) {
-}
-
-TcpSender::TcpSender(PacketProcessorListener* listener,
-                     int flow_id,
-                     int64_t offset_ms,
-                     int send_limit_bytes)
-    : PacketSender(listener, flow_id),
-      cwnd_(10),
-      ssthresh_(kNoLimit),
-      ack_received_(false),
-      last_acked_seq_num_(0),
-      next_sequence_number_(0),
-      offset_ms_(offset_ms),
-      last_reduction_time_ms_(-1),
-      last_rtt_ms_(0),
-      total_sent_bytes_(0),
-      send_limit_bytes_(send_limit_bytes),
-      last_generated_packets_ms_(0),
-      num_recent_sent_packets_(0),
-      bitrate_kbps_(0) {
-}
-
-void TcpSender::RunFor(int64_t time_ms, Packets* in_out) {
-  if (clock_.TimeInMilliseconds() + time_ms < offset_ms_) {
-    clock_.AdvanceTimeMilliseconds(time_ms);
-    if (running_) {
-      Pause();
-    }
-    return;
-  }
-
-  if (!running_ && total_sent_bytes_ == 0) {
-    Resume(offset_ms_);
-  }
-
-  int64_t start_time_ms = clock_.TimeInMilliseconds();
-
-  std::list<FeedbackPacket*> feedbacks = GetFeedbackPackets(
-      in_out, clock_.TimeInMilliseconds() + time_ms, *flow_ids().begin());
-  // The number of packets which are sent in during time_ms depends on the
-  // number of packets in_flight_ and the max number of packets in flight
-  // (cwnd_). Therefore SendPackets() isn't directly dependent on time_ms.
-  for (FeedbackPacket* fb : feedbacks) {
-    clock_.AdvanceTimeMilliseconds(fb->send_time_ms() -
-                                   clock_.TimeInMilliseconds());
-    last_rtt_ms_ = fb->send_time_ms() - fb->latest_send_time_ms();
-    UpdateCongestionControl(fb);
-    SendPackets(in_out);
-  }
-
-  for (auto it = in_flight_.begin(); it != in_flight_.end();) {
-    if (it->time_ms < clock_.TimeInMilliseconds() - 1000)
-      in_flight_.erase(it++);
-    else
-      ++it;
-  }
-
-  clock_.AdvanceTimeMilliseconds(time_ms -
-                                 (clock_.TimeInMilliseconds() - start_time_ms));
-  SendPackets(in_out);
-}
-
-void TcpSender::SendPackets(Packets* in_out) {
-  int cwnd = ceil(cwnd_);
-  int packets_to_send = std::max(cwnd - static_cast<int>(in_flight_.size()), 0);
-  int timed_out = TriggerTimeouts();
-  if (timed_out > 0) {
-    HandleLoss();
-  }
-  if (packets_to_send > 0) {
-    Packets generated = GeneratePackets(packets_to_send);
-    for (Packet* packet : generated)
-      in_flight_.insert(InFlight(*static_cast<MediaPacket*>(packet)));
-
-    in_out->merge(generated, DereferencingComparator<Packet>);
-  }
-}
-
-void TcpSender::UpdateCongestionControl(const FeedbackPacket* fb) {
-  const TcpFeedback* tcp_fb = static_cast<const TcpFeedback*>(fb);
-  RTC_DCHECK(!tcp_fb->acked_packets().empty());
-  ack_received_ = true;
-
-  uint16_t expected = tcp_fb->acked_packets().back() - last_acked_seq_num_;
-  uint16_t missing =
-      expected - static_cast<uint16_t>(tcp_fb->acked_packets().size());
-
-  for (uint16_t ack_seq_num : tcp_fb->acked_packets())
-    in_flight_.erase(InFlight(ack_seq_num, clock_.TimeInMilliseconds()));
-
-  if (missing > 0) {
-    HandleLoss();
-  } else if (cwnd_ <= ssthresh_) {
-    cwnd_ += tcp_fb->acked_packets().size();
-  } else {
-    cwnd_ += 1.0f / cwnd_;
-  }
-
-  last_acked_seq_num_ =
-      LatestSequenceNumber(tcp_fb->acked_packets().back(), last_acked_seq_num_);
-}
-
-int TcpSender::TriggerTimeouts() {
-  int timed_out = 0;
-  for (auto it = in_flight_.begin(); it != in_flight_.end();) {
-    if (it->time_ms < clock_.TimeInMilliseconds() - 1000) {
-      in_flight_.erase(it++);
-      ++timed_out;
-    } else {
-      ++it;
-    }
-  }
-  return timed_out;
-}
-
-void TcpSender::HandleLoss() {
-  if (clock_.TimeInMilliseconds() - last_reduction_time_ms_ < last_rtt_ms_)
-    return;
-  last_reduction_time_ms_ = clock_.TimeInMilliseconds();
-  ssthresh_ = std::max(static_cast<int>(in_flight_.size() / 2), 2);
-  cwnd_ = ssthresh_;
-}
-
-Packets TcpSender::GeneratePackets(size_t num_packets) {
-  Packets generated;
-
-  UpdateSendBitrateEstimate(num_packets);
-
-  for (size_t i = 0; i < num_packets; ++i) {
-    if ((total_sent_bytes_ + kPacketSizeBytes) > send_limit_bytes_) {
-      if (running_) {
-        Pause();
-      }
-      break;
-    }
-    generated.push_back(
-        new MediaPacket(*flow_ids().begin(), 1000 * clock_.TimeInMilliseconds(),
-                        kPacketSizeBytes, next_sequence_number_++));
-    generated.back()->set_sender_timestamp_us(
-        1000 * clock_.TimeInMilliseconds());
-
-    total_sent_bytes_ += kPacketSizeBytes;
-  }
-
-  return generated;
-}
-
-void TcpSender::UpdateSendBitrateEstimate(size_t num_packets) {
-  const int kTimeWindowMs = 500;
-  num_recent_sent_packets_ += num_packets;
-
-  int64_t delta_ms = clock_.TimeInMilliseconds() - last_generated_packets_ms_;
-  if (delta_ms >= kTimeWindowMs) {
-    bitrate_kbps_ =
-        static_cast<uint32_t>(8 * num_recent_sent_packets_ * kPacketSizeBytes) /
-        delta_ms;
-    last_generated_packets_ms_ = clock_.TimeInMilliseconds();
-    num_recent_sent_packets_ = 0;
-  }
-
-  RecordBitrate();
-}
-
-uint32_t TcpSender::TargetBitrateKbps() {
-  return bitrate_kbps_;
-}
-
-}  // namespace bwe
-}  // namespace testing
-}  // namespace webrtc
diff --git a/modules/remote_bitrate_estimator/test/packet_sender.h b/modules/remote_bitrate_estimator/test/packet_sender.h
deleted file mode 100644
index 86ad0e8..0000000
--- a/modules/remote_bitrate_estimator/test/packet_sender.h
+++ /dev/null
@@ -1,207 +0,0 @@
-/*
- *  Copyright (c) 2015 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_REMOTE_BITRATE_ESTIMATOR_TEST_PACKET_SENDER_H_
-#define WEBRTC_MODULES_REMOTE_BITRATE_ESTIMATOR_TEST_PACKET_SENDER_H_
-
-#include <list>
-#include <limits>
-#include <memory>
-#include <set>
-#include <string>
-
-#include "webrtc/modules/include/module.h"
-#include "webrtc/modules/remote_bitrate_estimator/test/bwe.h"
-#include "webrtc/modules/remote_bitrate_estimator/test/bwe_test_framework.h"
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace webrtc {
-namespace testing {
-namespace bwe {
-
-class MetricRecorder;
-
-class PacketSender : public PacketProcessor {
- public:
-  PacketSender(PacketProcessorListener* listener, int flow_id)
-      : PacketProcessor(listener, flow_id, kSender),
-        running_(true),
-        // For Packet::send_time_us() to be comparable with timestamps from
-        // clock_, the clock of the PacketSender and the Source must be aligned.
-        // We assume that both start at time 0.
-        clock_(0),
-        metric_recorder_(nullptr) {}
-  virtual ~PacketSender() {}
-  // Call GiveFeedback() with the returned interval in milliseconds, provided
-  // there is a new estimate available.
-  // Note that changing the feedback interval affects the timing of when the
-  // output of the estimators is sampled and therefore the baseline files may
-  // have to be regenerated.
-  virtual int GetFeedbackIntervalMs() const = 0;
-  void SetSenderTimestamps(Packets* in_out);
-
-  virtual uint32_t TargetBitrateKbps() { return 0; }
-
-  virtual void Pause();
-  virtual void Resume(int64_t paused_time_ms);
-
-  void set_metric_recorder(MetricRecorder* metric_recorder);
-  virtual void RecordBitrate();
-
- protected:
-  bool running_;  // Initialized by default as true.
-  SimulatedClock clock_;
-
- private:
-  MetricRecorder* metric_recorder_;
-};
-
-class VideoSender : public PacketSender, public BitrateObserver {
- public:
-  VideoSender(PacketProcessorListener* listener,
-              VideoSource* source,
-              BandwidthEstimatorType estimator);
-  virtual ~VideoSender();
-
-  int GetFeedbackIntervalMs() const override;
-  void RunFor(int64_t time_ms, Packets* in_out) override;
-
-  virtual VideoSource* source() const { return source_; }
-
-  uint32_t TargetBitrateKbps() override;
-
-  // Implements BitrateObserver.
-  void OnNetworkChanged(uint32_t target_bitrate_bps,
-                        uint8_t fraction_lost,
-                        int64_t rtt) override;
-  void Pause() override;
-  void Resume(int64_t paused_time_ms) override;
-
- protected:
-  void ProcessFeedbackAndGeneratePackets(int64_t time_ms,
-                                         std::list<FeedbackPacket*>* feedbacks,
-                                         Packets* generated);
-
-  VideoSource* source_;
-  std::unique_ptr<BweSender> bwe_;
-  int64_t start_of_run_ms_;
-  std::list<Module*> modules_;
-
- private:
-  uint32_t previous_sending_bitrate_;
-  RTC_DISALLOW_COPY_AND_ASSIGN(VideoSender);
-};
-
-class PacedVideoSender : public VideoSender, public PacedSender::PacketSender {
- public:
-  PacedVideoSender(PacketProcessorListener* listener,
-                   VideoSource* source,
-                   BandwidthEstimatorType estimator);
-  virtual ~PacedVideoSender();
-
-  void RunFor(int64_t time_ms, Packets* in_out) override;
-
-  // Implements PacedSender::Callback.
-  bool TimeToSendPacket(uint32_t ssrc,
-                        uint16_t sequence_number,
-                        int64_t capture_time_ms,
-                        bool retransmission,
-                        const PacedPacketInfo& pacing_info) override;
-  size_t TimeToSendPadding(size_t bytes,
-                           const PacedPacketInfo& pacing_info) override;
-
-  // Implements BitrateObserver.
-  void OnNetworkChanged(uint32_t target_bitrate_bps,
-                        uint8_t fraction_lost,
-                        int64_t rtt) override;
-
-  void OnNetworkChanged(uint32_t bitrate_for_encoder_bps,
-                        uint32_t bitrate_for_pacer_bps,
-                        bool in_probe_rtt,
-                        int64_t rtt,
-                        uint64_t congestion_window) override;
-  size_t pacer_queue_size_in_bytes() override {
-    return pacer_queue_size_in_bytes_;
-  }
-  void OnBytesAcked(size_t bytes) override;
-
- private:
-  int64_t TimeUntilNextProcess(const std::list<Module*>& modules);
-  void CallProcess(const std::list<Module*>& modules);
-  void QueuePackets(Packets* batch, int64_t end_of_batch_time_us);
-
-  size_t pacer_queue_size_in_bytes_ = 0;
-  std::unique_ptr<Pacer> pacer_;
-  Packets queue_;
-  Packets pacer_queue_;
-
-  RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(PacedVideoSender);
-};
-
-class TcpSender : public PacketSender {
- public:
-  TcpSender(PacketProcessorListener* listener, int flow_id, int64_t offset_ms);
-  TcpSender(PacketProcessorListener* listener,
-            int flow_id,
-            int64_t offset_ms,
-            int send_limit_bytes);
-  virtual ~TcpSender() {}
-
-  void RunFor(int64_t time_ms, Packets* in_out) override;
-  int GetFeedbackIntervalMs() const override { return 10; }
-
-  uint32_t TargetBitrateKbps() override;
-
- private:
-  struct InFlight {
-   public:
-    explicit InFlight(const MediaPacket& packet)
-        : sequence_number(packet.header().sequenceNumber),
-          time_ms(packet.send_time_ms()) {}
-
-    InFlight(uint16_t seq_num, int64_t now_ms)
-        : sequence_number(seq_num), time_ms(now_ms) {}
-
-    bool operator<(const InFlight& rhs) const {
-      return sequence_number < rhs.sequence_number;
-    }
-
-    uint16_t sequence_number;  // Sequence number of a packet in flight, or a
-                               // packet which has just been acked.
-    int64_t time_ms;  // Time of when the packet left the sender, or when the
-                      // ack was received.
-  };
-
-  void SendPackets(Packets* in_out);
-  void UpdateCongestionControl(const FeedbackPacket* fb);
-  int TriggerTimeouts();
-  void HandleLoss();
-  Packets GeneratePackets(size_t num_packets);
-  void UpdateSendBitrateEstimate(size_t num_packets);
-
-  float cwnd_;
-  int ssthresh_;
-  std::set<InFlight> in_flight_;
-  bool ack_received_;
-  uint16_t last_acked_seq_num_;
-  uint16_t next_sequence_number_;
-  int64_t offset_ms_;
-  int64_t last_reduction_time_ms_;
-  int64_t last_rtt_ms_;
-  int total_sent_bytes_;
-  int send_limit_bytes_;  // Initialized by default as kNoLimit.
-  int64_t last_generated_packets_ms_;
-  size_t num_recent_sent_packets_;
-  uint32_t bitrate_kbps_;
-};
-}  // namespace bwe
-}  // namespace testing
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_REMOTE_BITRATE_ESTIMATOR_TEST_PACKET_SENDER_H_
diff --git a/modules/remote_bitrate_estimator/test/plot_bars.sh b/modules/remote_bitrate_estimator/test/plot_bars.sh
deleted file mode 100755
index 9f7fb16..0000000
--- a/modules/remote_bitrate_estimator/test/plot_bars.sh
+++ /dev/null
@@ -1,286 +0,0 @@
-#!/bin/bash
-
-# Copyright (c) 2013 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.
-
-# To set up in e.g. Eclipse, run a separate shell and pipe the output from the
-# test into this script.
-#
-# In Eclipse, that amounts to creating a Run Configuration which starts
-# "/bin/bash" with the arguments "-c [trunk_path]/out/Debug/modules_unittests
-# --gtest_filter=*BweTest* | [trunk_path]/webrtc/modules/
-# remote_bitrate_estimator/test/plot_bars.sh
-
-# This script supports multiple figures (windows), the figure is specified as an
-# identifier at the first argument after the PLOT command. Each figure has a
-# single y axis and a dual y axis mode. If any line specifies an axis by ending
-# with "#<axis number (1 or 2)>" two y axis will be used, the first will be
-# assumed to represent bitrate (in kbps) and the second will be assumed to
-# represent time deltas (in ms).
-
-log=$(</dev/stdin)
-
-# Plot histograms.
-function gen_gnuplot_bar_input {
-  x_start=1
-  x_end=3.75
-  bars=$(echo "$log" | grep "BAR")
-
-  labels=$(echo "$log" | grep "^LABEL")
-  figures=($(echo "$bars" | cut -f 2 | sort | uniq))
-
-  echo "reset"  # Clears previous settings.
-
-  echo "set title font 'Verdana,22'"
-  echo "set xtics font 'Verdana,24'"
-  echo "set ytics font 'Verdana,14'"
-  echo "set ylabel font 'Verdana,16'"
-
-  echo "set xrange[$x_start:$x_end]"
-  echo "set style fill solid 0.5"
-  echo "set style fill solid border -1"
-
-  declare -a ydist=(11.5 10.5 10.5)  # Used to correctly offset the y label.
-  i=0
-  for figure in "${figures[@]}" ; do
-
-    echo "set terminal wxt $figure size 440,440 dashed"
-    echo "set ylabel offset ${ydist[$i]}, -3"
-    (( i++ ))
-
-    title=$(echo "$labels" | grep "^LABEL.$figure" | cut -f 3 | \
-                                         head -n 1 | sed 's/_/ /g')
-    y_label=$(echo "$labels" | grep "^LABEL.$figure" | cut -f 4 | \
-                                         head -n 1 | sed 's/_/ /g')
-
-    # RMCAT flows.
-    num_flows=$(echo "$labels" | grep "^LABEL.$figure" | cut -f 5 | \
-                                         head -n 1)
-
-    # RMCAT algorithm 1.
-    x_label_1=$(echo "$log" | grep "BAR.$figure" | cut -f 3 | sed 's/_/\t/g' \
-                                 | cut -f 1  | sort | uniq | head -n 1 )
-
-    # RMCAT algorithm 2.
-    x_label_2=$(echo "$log" | grep "BAR.$figure" | cut -f 3 | sed 's/_/\t/g' \
-                                 | cut -f 1  | sort | uniq |  sed -n 2p)
-
-    x_labels="('$x_label_1' 2, '$x_label_2' 3)"
-    tcp_flow=false
-
-    tcp_space=0.2  # Extra horizontal space between bars.
-
-    # Parse labels if there are other flows in addition to RMCAT ones.
-    IFS='x' read -ra split_label_1 <<< "$x_label_1"
-
-    if (( ${#split_label_1[@]} > "1" )); then
-      tcp_flow=true
-      box_width=$(echo "(1.0-$tcp_space/2)/$num_flows" | bc -l)
-      echo "set xtics font 'Verdana,16'"
-      x_labels="("
-      delimiter=""
-      abscissa=$(echo $x_start + 0.5 + 0.5*$box_width | bc)
-      for label in "${split_label_1[@]}" ; do
-        x_labels+="$delimiter'$label' $abscissa"
-        abscissa=$(echo $abscissa + $box_width | bc)
-        delimiter=", "
-      done
-      abscissa=$(echo $abscissa + $tcp_space | bc)
-      IFS='x' read -ra split_label_2 <<< "$x_label_2"
-      for label in "${split_label_2[@]}" ; do
-        x_labels+="$delimiter'$label' $abscissa"
-        abscissa=$(echo $abscissa + $box_width | bc)
-      done
-      x_labels="$x_labels)"
-    else
-      box_width=$(echo 1.0/$num_flows | bc -l)
-    fi
-
-    echo "set boxwidth $box_width"
-
-    # Plots can be directly exported to image files.
-    file_name=$(echo "$labels" | grep "^LABEL.$figure" | cut -f 5 | head -n 1)
-
-    y_max=0  # Used to scale the plot properly.
-
-    # Scale all latency plots with the same vertical scale.
-    delay_figure=5
-    if (( $figure==$delay_figure )) ; then
-      y_max=400
-    else  # Take y_max = 1.1 * highest plot value.
-
-      # Since only the optimal bitrate for the first flow is being ploted,
-      # consider only this one for scalling purposes.
-      data_sets=$(echo "$bars" | grep "LIMITERRORBAR.$figure" | cut -f 3 | \
-                                     sed 's/_/\t/g' | cut -f 1 | sort | uniq)
-
-      if (( ${#data_sets[@]} > "0" )); then
-        for set in $data_sets ; do
-          y=$(echo "$bars" | grep "LIMITERRORBAR.$figure.$set" | cut -f 8 | \
-                                                                  head -n 1)
-          if (( $(bc <<< "$y > $y_max") == 1 )); then
-            y_max=$y
-          fi
-        done
-      fi
-
-      data_sets=$(echo "$bars" | grep "ERRORBAR.$figure" | cut -f 3 | \
-                                                               sort | uniq)
-      if (( ${#data_sets[@]} > "0" )); then
-        for set in $data_sets ; do
-          y=$(echo "$bars" | grep "ERRORBAR.$figure.$set" | cut -f 6 | \
-                                                                 head -n 1)
-          if (( $(bc <<< "$y > $y_max") == 1 )) ; then
-            y_max=$y
-          fi
-        done
-      fi
-
-      data_sets=$(echo "$bars" | grep "BAR.$figure" | cut -f 3 | sort | uniq)
-
-      for set in $data_sets ; do
-        y=$(echo "$bars" | grep "BAR.$figure.$set" | cut -f 4 | head -n 1)
-        if (( $(bc <<< "$y > $y_max") == 1 )) ; then
-          y_max=$y
-        fi
-      done
-
-      y_max=$(echo $y_max*1.1 | bc)
-    fi
-
-
-    echo "set ylabel \"$y_label\""
-    echo "set yrange[0:$y_max]"
-
-    echo "set multiplot"
-
-    # Plot bars.
-    data_sets=$(echo "$bars" | grep "BAR.$figure" | cut -f 3 | sort | uniq)
-
-    echo "set xtics $x_labels"
-    echo "plot '-' using 1:4:2 with boxes lc variable notitle"
-
-    echo
-
-    color=11  # Green.
-    x_bar=$(echo $x_start + 0.5 + 0.5*$box_width | bc)
-    for set in $data_sets ; do
-      echo -n "$x_bar  $color  "
-      echo "$bars" | grep "BAR.$figure.$set" | cut -f 3,4
-
-      # Add extra space if TCP flows are being plotted.
-      if $tcp_flow && \
-          (( $(bc <<< "$x_bar < $x_start + 1.5 - 0.5*$tcp_space") == 1 )) && \
-          (( $(bc <<< "$x_bar + $box_width > $x_start + 1.5 + 0.5*$tcp_space") \
-           == 1 )); then
-          x_bar=$(echo $x_bar + $tcp_space | bc)
-      fi
-
-      x_bar=$(echo $x_bar + $box_width | bc)
-
-      if (( $(bc <<< "$x_bar > 2.5") == 1 )) ; then
-        color=12  # Blue.
-      fi
-      # Different bar color for TCP flows:
-      if $tcp_flow && \
-         (( $(bc <<< "(100*$x_bar)%100 < 50") == 1 ))
-      then
-        color=18  # Gray.
-      fi
-    done
-    echo "e"
-
-    # Plot Baseline bars, e.g. one-way path delay on latency plots.
-    data_sets=$(echo "$log" | grep "BASELINE.$figure" | cut -f 3 | sort | uniq)
-
-    if (( ${#data_sets} > "0" )); then
-      echo "set xtics $x_labels"
-      echo "plot '-' using 1:4:2 with boxes lc variable notitle"
-
-      echo
-
-      color=18  # Gray.
-      x_bar=$(echo $x_start + 0.5 + 0.5*$box_width | bc)
-      for set in $data_sets ; do
-        echo -n "$x_bar  $color  "
-        echo "$log" | grep "BASELINE.$figure.$set" | cut -f 3,4
-
-        # Add extra space if TCP flows are being plotted.
-        if $tcp_flow && \
-            (( $(bc <<< "$x_bar < $x_start + 1.5 - 0.5*$tcp_space") == 1 )) && \
-            (( $(bc <<< "$x_bar + $box_width > $x_start + 1.5 \
-            + 0.5*$tcp_space") == 1 )); then
-            x_bar=$(echo $x_bar + $tcp_space | bc)
-        fi
-
-        x_bar=$(echo $x_bar + $box_width | bc)
-
-      done
-      echo "e"
-    fi
-
-    # Plot vertical error lines, e.g. y +- sigma.
-    data_sets=$(echo "$bars" | grep "ERRORBAR.$figure" | cut -f 3 | sort | uniq)
-
-    if (( ${#data_sets} > "0" )); then
-
-      echo "set key left"
-      error_title=$(echo "$bars" | grep "ERRORBAR.$figure" | cut -f 7 | \
-                                                 head -n 1 | sed 's/_/ /g')
-
-      echo "set xtics $x_labels"
-      echo "plot '-' using 1:3:4:5 title '$error_title' with yerr"
-
-      x_error_line=$(echo $x_start + 0.5 + 0.5*$box_width | bc)
-      for set in $data_sets ; do
-        echo -n "$x_error_line  "
-        echo "$bars" | grep "ERRORBAR.$figure.$set" | cut -f 3,4,5,6
-
-        # Add extra space if TCP flows are being plotted.
-        if $tcp_flow && \
-          (( $(bc <<< "$x_error_line < $x_start + 1.5 - 0.5*$tcp_space") == 1 \
-          )) && (( $(bc <<< "$x_error_line + $box_width > $x_start + 1.5 \
-          + 0.5*$tcp_space") == 1 )); then
-          x_error_line=$(echo $x_error_line + $tcp_space | bc)
-        fi
-
-        x_error_line=$(echo $x_error_line + $box_width | bc)
-      done
-      echo "e"
-    fi
-
-    # Plot horizontal dashed lines, e.g. y = optimal bitrate.
-    data_sets=$(echo "$bars" | grep "LIMITERRORBAR.$figure" | cut -f 3 \
-                                                     | sort | uniq)
-    if (( ${#data_sets} > "0" )); then
-
-      echo "set style line 1 lt 1 lw 3 pt 3 ps 0 linecolor rgb 'black'"
-
-      limit_titles=$(echo "$bars" | grep "LIMITERRORBAR.$figure" | cut -f 9 \
-                                                         | sort | uniq)
-
-      for title in $limit_titles ; do
-        y_max=$(echo "$bars" | grep "LIMITERRORBAR.$figure" | grep "$title" \
-                                               | cut -f 8 | head -n 1)
-
-        retouched_title=$(echo "$title" | sed 's/#/\t/g' | cut -f 1 \
-                                                         | sed 's/_/ /g')
-
-        echo "set key right top"
-        echo "set xtics $x_labels"
-        echo "plot $y_max lt 7 lw 1 linecolor rgb 'black' \
-                                  title '$retouched_title'"
-      done
-
-    fi
-
-    echo "unset multiplot"
-  done
-}
-
-gen_gnuplot_bar_input | gnuplot -persist
diff --git a/modules/remote_bitrate_estimator/test/plot_dynamics.py b/modules/remote_bitrate_estimator/test/plot_dynamics.py
deleted file mode 100755
index 02b2052..0000000
--- a/modules/remote_bitrate_estimator/test/plot_dynamics.py
+++ /dev/null
@@ -1,182 +0,0 @@
-#!/usr/bin/env python
-# Copyright (c) 2015 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.
-
-# This script is used to plot simulation dynamics. The expected format is
-# PLOT <plot_number> <var_name>:<ssrc>@<alg_name> <time> <value>
-# <var_name> may optionally be followed by #<axis_alignment> but it is
-# deprecated. <plot_number> is also deprecated.
-# Each combination <var_name>:<ssrc>@<alg_name> is stored in it's own time
-# series. The main function defines which time series should be displayed and
-# whether they should should be displayed in the same or separate windows.
-
-
-import matplotlib.pyplot as plt
-import numpy
-import re
-import sys
-
-# Change this to True to save the figure to a file. Look below for details.
-SAVE_FIGURE = False
-
-class ParsePlotLineException(Exception):
-  def __init__(self, reason, line):
-    super(ParsePlotLineException, self).__init__()
-    self.reason = reason
-    self.line = line
-
-
-def ParsePlotLine(line):
-  split_line = line.split()
-  if len(split_line) != 5:
-    raise ParsePlotLineException("Expected 5 arguments on line", line)
-  (plot, _, annotated_var, time, value) = split_line
-  if plot != "PLOT":
-    raise ParsePlotLineException("Line does not begin with \"PLOT\\t\"", line)
-  # The variable name can contain any non-whitespace character except "#:@"
-  match = re.match(r'([^\s#:@]+)(?:#\d)?:(\d+)@(\S+)', annotated_var)
-
-  if match == None:
-    raise ParsePlotLineException("Could not parse variable name, ssrc and \
-                                 algorithm name", annotated_var)
-  var_name = match.group(1)
-  ssrc = match.group(2)
-  alg_name = match.group(3).replace('_', ' ')
-
-  return (var_name, ssrc, alg_name, time, value)
-
-
-def GenerateLabel(var_name, ssrc, ssrc_count, alg_name):
-  label = var_name
-  if ssrc_count > 1 or ssrc != "0":
-    label = label + " flow " + ssrc
-  if alg_name != "-":
-    label = label + " " + alg_name
-  return label
-
-
-class Figure(object):
-  def __init__(self, name):
-    self.name = name
-    self.subplots = []
-
-  def AddSubplot(self, var_names, xlabel, ylabel):
-    self.subplots.append(Subplot(var_names, xlabel, ylabel))
-
-  def AddSample(self, var_name, ssrc, alg_name, time, value):
-    for s in self.subplots:
-      s.AddSample(var_name, ssrc, alg_name, time, value)
-
-  def PlotFigure(self, fig):
-    n = len(self.subplots)
-    for i in range(n):
-      axis = fig.add_subplot(n, 1, i+1)
-      self.subplots[i].PlotSubplot(axis)
-
-class Subplot(object):
-  def __init__(self, var_names, xlabel, ylabel):
-    self.xlabel = xlabel
-    self.ylabel = ylabel
-    self.var_names = var_names
-    self.samples = dict()
-
-  def AddSample(self, var_name, ssrc, alg_name, time, value):
-    if var_name not in self.var_names:
-      return
-
-    if alg_name not in self.samples.keys():
-      self.samples[alg_name] = {}
-    if ssrc not in self.samples[alg_name].keys():
-      self.samples[alg_name][ssrc] = {}
-    if var_name not in self.samples[alg_name][ssrc].keys():
-      self.samples[alg_name][ssrc][var_name] = []
-
-    self.samples[alg_name][ssrc][var_name].append((time, value))
-
-  def PlotSubplot(self, axis):
-    axis.set_xlabel(self.xlabel)
-    axis.set_ylabel(self.ylabel)
-
-    count = 0
-    for alg_name in self.samples.keys():
-      for ssrc in self.samples[alg_name].keys():
-        for var_name in self.samples[alg_name][ssrc].keys():
-          x = [sample[0] for sample in self.samples[alg_name][ssrc][var_name]]
-          y = [sample[1] for sample in self.samples[alg_name][ssrc][var_name]]
-          x = numpy.array(x)
-          y = numpy.array(y)
-          ssrc_count = len(self.samples[alg_name].keys())
-          l = GenerateLabel(var_name, ssrc, ssrc_count, alg_name)
-          if l == 'MaxThroughput_':
-            plt.plot(x, y, label=l, linewidth=4.0)
-          else:
-            plt.plot(x, y, label=l, linewidth=2.0)
-          count += 1
-
-    plt.grid(True)
-    if count > 1:
-      plt.legend(loc='best')
-
-
-def main():
-  receiver = Figure("PacketReceiver")
-  receiver.AddSubplot(['Throughput_kbps', 'MaxThroughput_', 'Capacity_kbps',
-                       'PerFlowCapacity_kbps', 'MetricRecorderThroughput_kbps'],
-                      "Time (s)", "Throughput (kbps)")
-  receiver.AddSubplot(['Delay_ms_', 'Delay_ms'], "Time (s)",
-                      "One-way delay (ms)")
-  receiver.AddSubplot(['Packet_Loss_'], "Time (s)", "Packet Loss Ratio")
-
-  kalman_state = Figure("KalmanState")
-  kalman_state.AddSubplot(['kc', 'km'], "Time (s)", "Kalman gain")
-  kalman_state.AddSubplot(['slope_1/bps'], "Time (s)", "Slope")
-  kalman_state.AddSubplot(['var_noise'], "Time (s)", "Var noise")
-
-  detector_state = Figure("DetectorState")
-  detector_state.AddSubplot(['T', 'threshold'], "Time (s)", "Offset")
-
-  trendline_state = Figure("TrendlineState")
-  trendline_state.AddSubplot(["accumulated_delay_ms", "smoothed_delay_ms"],
-                             "Time (s)", "Delay (ms)")
-  trendline_state.AddSubplot(["trendline_slope"], "Time (s)", "Slope")
-
-  target_bitrate = Figure("TargetBitrate")
-  target_bitrate.AddSubplot(['target_bitrate_bps', 'acknowledged_bitrate'],
-                            "Time (s)", "Bitrate (bps)")
-
-  min_rtt_state = Figure("MinRttState")
-  min_rtt_state.AddSubplot(['MinRtt'], "Time (s)", "Time (ms)")
-
-  # Select which figures to plot here.
-  figures = [receiver, detector_state, trendline_state, target_bitrate,
-    min_rtt_state]
-
-  # Add samples to the figures.
-  for line in sys.stdin:
-    if line.startswith("[ RUN      ]"):
-      test_name = re.search(r'\.(\w+)', line).group(1)
-    if line.startswith("PLOT"):
-      try:
-        (var_name, ssrc, alg_name, time, value) = ParsePlotLine(line)
-        for f in figures:
-          # The sample will be ignored bv the figures that don't need it.
-          f.AddSample(var_name, ssrc, alg_name, time, value)
-      except ParsePlotLineException as e:
-        print e.reason
-        print e.line
-
-  # Plot figures.
-  for f in figures:
-    fig = plt.figure(f.name)
-    f.PlotFigure(fig)
-    if SAVE_FIGURE:
-      fig.savefig(test_name + f.name + ".png")
-  plt.show()
-
-if __name__ == '__main__':
-  main()
diff --git a/modules/remote_bitrate_estimator/tools/bwe_rtp.cc b/modules/remote_bitrate_estimator/tools/bwe_rtp.cc
deleted file mode 100644
index d849398..0000000
--- a/modules/remote_bitrate_estimator/tools/bwe_rtp.cc
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- *  Copyright (c) 2014 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/remote_bitrate_estimator/tools/bwe_rtp.h"
-
-#include <stdio.h>
-
-#include <set>
-#include <sstream>
-#include <string>
-
-#include "webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_abs_send_time.h"
-#include "webrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_single_stream.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_header_parser.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_payload_registry.h"
-#include "webrtc/rtc_base/flags.h"
-#include "webrtc/test/rtp_file_reader.h"
-
-namespace flags {
-
-DEFINE_string(extension_type,
-              "abs",
-              "Extension type, either abs for absolute send time or tsoffset "
-              "for timestamp offset.");
-std::string ExtensionType() {
-  return static_cast<std::string>(FLAG_extension_type);
-}
-
-DEFINE_int(extension_id, 3, "Extension id.");
-int ExtensionId() {
-  return static_cast<int>(FLAG_extension_id);
-}
-
-DEFINE_string(input_file, "", "Input file.");
-std::string InputFile() {
-  return static_cast<std::string>(FLAG_input_file);
-}
-
-DEFINE_string(ssrc_filter,
-              "",
-              "Comma-separated list of SSRCs in hexadecimal which are to be "
-              "used as input to the BWE (only applicable to pcap files).");
-std::set<uint32_t> SsrcFilter() {
-  std::string ssrc_filter_string = static_cast<std::string>(FLAG_ssrc_filter);
-  if (ssrc_filter_string.empty())
-    return std::set<uint32_t>();
-  std::stringstream ss;
-  std::string ssrc_filter = ssrc_filter_string;
-  std::set<uint32_t> ssrcs;
-
-  // Parse the ssrcs in hexadecimal format.
-  ss << std::hex << ssrc_filter;
-  uint32_t ssrc;
-  while (ss >> ssrc) {
-    ssrcs.insert(ssrc);
-    ss.ignore(1, ',');
-  }
-  return ssrcs;
-}
-
-DEFINE_bool(help, false, "Print this message.");
-}  // namespace flags
-
-bool ParseArgsAndSetupEstimator(int argc,
-                                char** argv,
-                                webrtc::Clock* clock,
-                                webrtc::RemoteBitrateObserver* observer,
-                                webrtc::test::RtpFileReader** rtp_reader,
-                                webrtc::RtpHeaderParser** parser,
-                                webrtc::RemoteBitrateEstimator** estimator,
-                                std::string* estimator_used) {
-  if (rtc::FlagList::SetFlagsFromCommandLine(&argc, argv, true)) {
-    return 1;
-  }
-  if (flags::FLAG_help) {
-    rtc::FlagList::Print(nullptr, false);
-    return 0;
-  }
-  std::string filename = flags::InputFile();
-
-  std::set<uint32_t> ssrc_filter = flags::SsrcFilter();
-  fprintf(stderr, "Filter on SSRC: ");
-  for (auto& s : ssrc_filter) {
-    fprintf(stderr, "0x%08x, ", s);
-  }
-  fprintf(stderr, "\n");
-  if (filename.substr(filename.find_last_of(".")) == ".pcap") {
-    fprintf(stderr, "Opening as pcap\n");
-    *rtp_reader = webrtc::test::RtpFileReader::Create(
-        webrtc::test::RtpFileReader::kPcap, filename.c_str(),
-        flags::SsrcFilter());
-  } else {
-    fprintf(stderr, "Opening as rtp\n");
-    *rtp_reader = webrtc::test::RtpFileReader::Create(
-        webrtc::test::RtpFileReader::kRtpDump, filename.c_str());
-  }
-  if (!*rtp_reader) {
-    fprintf(stderr, "Cannot open input file %s\n", filename.c_str());
-    return false;
-  }
-  fprintf(stderr, "Input file: %s\n\n", filename.c_str());
-
-  webrtc::RTPExtensionType extension = webrtc::kRtpExtensionAbsoluteSendTime;
-  if (flags::ExtensionType() == "tsoffset") {
-    extension = webrtc::kRtpExtensionTransmissionTimeOffset;
-    fprintf(stderr, "Extension: toffset\n");
-  } else if (flags::ExtensionType() == "abs") {
-    fprintf(stderr, "Extension: abs\n");
-  } else {
-    fprintf(stderr, "Unknown extension type\n");
-    return false;
-  }
-
-  // Setup the RTP header parser and the bitrate estimator.
-  *parser = webrtc::RtpHeaderParser::Create();
-  (*parser)->RegisterRtpHeaderExtension(extension, flags::ExtensionId());
-  if (estimator) {
-    switch (extension) {
-      case webrtc::kRtpExtensionAbsoluteSendTime: {
-        *estimator =
-            new webrtc::RemoteBitrateEstimatorAbsSendTime(observer, clock);
-        *estimator_used = "AbsoluteSendTimeRemoteBitrateEstimator";
-        break;
-        }
-      case webrtc::kRtpExtensionTransmissionTimeOffset: {
-        *estimator =
-            new webrtc::RemoteBitrateEstimatorSingleStream(observer, clock);
-          *estimator_used = "RemoteBitrateEstimator";
-          break;
-        }
-      default:
-        assert(false);
-    }
-  }
-  return true;
-}
diff --git a/modules/remote_bitrate_estimator/tools/bwe_rtp.h b/modules/remote_bitrate_estimator/tools/bwe_rtp.h
deleted file mode 100644
index 2d12a80..0000000
--- a/modules/remote_bitrate_estimator/tools/bwe_rtp.h
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- *  Copyright (c) 2014 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_REMOTE_BITRATE_ESTIMATOR_TOOLS_BWE_RTP_H_
-#define WEBRTC_MODULES_REMOTE_BITRATE_ESTIMATOR_TOOLS_BWE_RTP_H_
-
-#include <string>
-
-namespace webrtc {
-class Clock;
-class RemoteBitrateEstimator;
-class RemoteBitrateObserver;
-class RtpHeaderParser;
-namespace test {
-class RtpFileReader;
-}
-}
-
-bool ParseArgsAndSetupEstimator(
-    int argc,
-    char** argv,
-    webrtc::Clock* clock,
-    webrtc::RemoteBitrateObserver* observer,
-    webrtc::test::RtpFileReader** rtp_reader,
-    webrtc::RtpHeaderParser** parser,
-    webrtc::RemoteBitrateEstimator** estimator,
-    std::string* estimator_used);
-
-#endif  // WEBRTC_MODULES_REMOTE_BITRATE_ESTIMATOR_TOOLS_BWE_RTP_H_
diff --git a/modules/remote_bitrate_estimator/tools/bwe_rtp_play.cc b/modules/remote_bitrate_estimator/tools/bwe_rtp_play.cc
deleted file mode 100644
index fa9a026..0000000
--- a/modules/remote_bitrate_estimator/tools/bwe_rtp_play.cc
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- *  Copyright (c) 2014 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 <stdio.h>
-
-#include <memory>
-
-#include "webrtc/modules/remote_bitrate_estimator/include/remote_bitrate_estimator.h"
-#include "webrtc/modules/remote_bitrate_estimator/tools/bwe_rtp.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_header_parser.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_payload_registry.h"
-#include "webrtc/rtc_base/format_macros.h"
-#include "webrtc/test/rtp_file_reader.h"
-
-class Observer : public webrtc::RemoteBitrateObserver {
- public:
-  explicit Observer(webrtc::Clock* clock) : clock_(clock) {}
-
-  // Called when a receive channel group has a new bitrate estimate for the
-  // incoming streams.
-  virtual void OnReceiveBitrateChanged(const std::vector<uint32_t>& ssrcs,
-                                       uint32_t bitrate) {
-    printf("[%u] Num SSRCs: %d, bitrate: %u\n",
-           static_cast<uint32_t>(clock_->TimeInMilliseconds()),
-           static_cast<int>(ssrcs.size()), bitrate);
-  }
-
-  virtual ~Observer() {}
-
- private:
-  webrtc::Clock* clock_;
-};
-
-int main(int argc, char** argv) {
-  webrtc::test::RtpFileReader* reader;
-  webrtc::RemoteBitrateEstimator* estimator;
-  webrtc::RtpHeaderParser* parser;
-  std::string estimator_used;
-  webrtc::SimulatedClock clock(0);
-  Observer observer(&clock);
-  if (!ParseArgsAndSetupEstimator(argc, argv, &clock, &observer, &reader,
-                                  &parser, &estimator, &estimator_used)) {
-    return -1;
-  }
-  std::unique_ptr<webrtc::test::RtpFileReader> rtp_reader(reader);
-  std::unique_ptr<webrtc::RtpHeaderParser> rtp_parser(parser);
-  std::unique_ptr<webrtc::RemoteBitrateEstimator> rbe(estimator);
-
-  // Process the file.
-  int packet_counter = 0;
-  int64_t next_rtp_time_ms = 0;
-  int64_t first_rtp_time_ms = -1;
-  int abs_send_time_count = 0;
-  int ts_offset_count = 0;
-  webrtc::test::RtpPacket packet;
-  if (!rtp_reader->NextPacket(&packet)) {
-    printf("No RTP packet found\n");
-    return 0;
-  }
-  first_rtp_time_ms = packet.time_ms;
-  packet.time_ms = packet.time_ms - first_rtp_time_ms;
-  while (true) {
-    if (next_rtp_time_ms <= clock.TimeInMilliseconds()) {
-      if (!parser->IsRtcp(packet.data, packet.length)) {
-        webrtc::RTPHeader header;
-        parser->Parse(packet.data, packet.length, &header);
-        if (header.extension.hasAbsoluteSendTime)
-          ++abs_send_time_count;
-        if (header.extension.hasTransmissionTimeOffset)
-          ++ts_offset_count;
-        size_t packet_length = packet.length;
-        // Some RTP dumps only include the header, in which case packet.length
-        // is equal to the header length. In those cases packet.original_length
-        // usually contains the original packet length.
-        if (packet.original_length > 0) {
-          packet_length = packet.original_length;
-        }
-        rbe->IncomingPacket(clock.TimeInMilliseconds(),
-                            packet_length - header.headerLength, header);
-        ++packet_counter;
-      }
-      if (!rtp_reader->NextPacket(&packet)) {
-        break;
-      }
-      packet.time_ms = packet.time_ms - first_rtp_time_ms;
-      next_rtp_time_ms = packet.time_ms;
-    }
-    int64_t time_until_process_ms = rbe->TimeUntilNextProcess();
-    if (time_until_process_ms <= 0) {
-      rbe->Process();
-    }
-    int64_t time_until_next_event =
-        std::min(rbe->TimeUntilNextProcess(),
-                 next_rtp_time_ms - clock.TimeInMilliseconds());
-    clock.AdvanceTimeMilliseconds(std::max<int64_t>(time_until_next_event, 0));
-  }
-  printf("Parsed %d packets\nTime passed: %" PRId64 " ms\n", packet_counter,
-         clock.TimeInMilliseconds());
-  printf("Estimator used: %s\n", estimator_used.c_str());
-  printf("Packets with absolute send time: %d\n",
-         abs_send_time_count);
-  printf("Packets with timestamp offset: %d\n",
-         ts_offset_count);
-  printf("Packets with no extension: %d\n",
-         packet_counter - ts_offset_count - abs_send_time_count);
-  return 0;
-}
diff --git a/modules/remote_bitrate_estimator/tools/rtp_to_text.cc b/modules/remote_bitrate_estimator/tools/rtp_to_text.cc
deleted file mode 100644
index 7a88236..0000000
--- a/modules/remote_bitrate_estimator/tools/rtp_to_text.cc
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- *  Copyright (c) 2014 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 <stdio.h>
-
-#include <memory>
-#include <sstream>
-
-#include "webrtc/modules/remote_bitrate_estimator/tools/bwe_rtp.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_header_parser.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_payload_registry.h"
-#include "webrtc/rtc_base/format_macros.h"
-#include "webrtc/test/rtp_file_reader.h"
-
-int main(int argc, char** argv) {
-  webrtc::test::RtpFileReader* reader;
-  webrtc::RtpHeaderParser* parser;
-  if (!ParseArgsAndSetupEstimator(argc, argv, NULL, NULL, &reader, &parser,
-                                  NULL, NULL)) {
-    return -1;
-  }
-  bool arrival_time_only = (argc >= 5 && strncmp(argv[4], "-t", 2) == 0);
-  std::unique_ptr<webrtc::test::RtpFileReader> rtp_reader(reader);
-  std::unique_ptr<webrtc::RtpHeaderParser> rtp_parser(parser);
-  fprintf(stdout, "seqnum timestamp ts_offset abs_sendtime recvtime "
-          "markerbit ssrc size original_size\n");
-  int packet_counter = 0;
-  int non_zero_abs_send_time = 0;
-  int non_zero_ts_offsets = 0;
-  webrtc::test::RtpPacket packet;
-  while (rtp_reader->NextPacket(&packet)) {
-    webrtc::RTPHeader header;
-    parser->Parse(packet.data, packet.length, &header);
-    if (header.extension.absoluteSendTime != 0)
-      ++non_zero_abs_send_time;
-    if (header.extension.transmissionTimeOffset != 0)
-      ++non_zero_ts_offsets;
-    if (arrival_time_only) {
-      std::stringstream ss;
-      ss << static_cast<int64_t>(packet.time_ms) * 1000000;
-      fprintf(stdout, "%s\n", ss.str().c_str());
-    } else {
-      fprintf(stdout,
-              "%u %u %d %u %u %d %u %" PRIuS " %" PRIuS "\n",
-              header.sequenceNumber,
-              header.timestamp,
-              header.extension.transmissionTimeOffset,
-              header.extension.absoluteSendTime,
-              packet.time_ms,
-              header.markerBit,
-              header.ssrc,
-              packet.length,
-              packet.original_length);
-    }
-    ++packet_counter;
-  }
-  fprintf(stderr, "Parsed %d packets\n", packet_counter);
-  fprintf(stderr, "Packets with non-zero absolute send time: %d\n",
-         non_zero_abs_send_time);
-  fprintf(stderr, "Packets with non-zero timestamp offset: %d\n",
-         non_zero_ts_offsets);
-  return 0;
-}
diff --git a/modules/rtp_rtcp/BUILD.gn b/modules/rtp_rtcp/BUILD.gn
deleted file mode 100644
index 811dca6..0000000
--- a/modules/rtp_rtcp/BUILD.gn
+++ /dev/null
@@ -1,389 +0,0 @@
-# Copyright (c) 2014 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.
-
-import("../../webrtc.gni")
-
-rtc_source_set("rtp_rtcp_format") {
-  sources = [
-    "include/rtp_cvo.h",
-    "include/rtp_header_extension_map.h",
-    "include/rtp_rtcp_defines.h",
-    "source/byte_io.h",
-    "source/rtp_header_extension_map.cc",
-    "source/rtp_header_extensions.cc",
-    "source/rtp_header_extensions.h",
-    "source/rtp_packet.cc",
-    "source/rtp_packet.h",
-    "source/rtp_packet_received.cc",
-    "source/rtp_packet_received.h",
-    "source/rtp_packet_to_send.h",
-  ]
-
-  deps = [
-    "..:module_api",
-    "../..:webrtc_common",
-    "../../api:array_view",
-    "../../api:libjingle_peerconnection_api",
-    "../../api:optional",
-    "../../common_video",
-    "../../rtc_base:rtc_base_approved",
-    "../../system_wrappers",
-  ]
-}
-
-rtc_static_library("rtp_rtcp") {
-  sources = [
-    "include/flexfec_receiver.h",
-    "include/flexfec_sender.h",
-    "include/receive_statistics.h",
-    "include/remote_ntp_time_estimator.h",
-    "include/rtp_header_parser.h",
-    "include/rtp_payload_registry.h",
-    "include/rtp_receiver.h",
-    "include/rtp_rtcp.h",
-    "include/ulpfec_receiver.h",
-    "source/dtmf_queue.cc",
-    "source/dtmf_queue.h",
-    "source/fec_private_tables_bursty.h",
-    "source/fec_private_tables_random.h",
-    "source/flexfec_header_reader_writer.cc",
-    "source/flexfec_header_reader_writer.h",
-    "source/flexfec_receiver.cc",
-    "source/flexfec_sender.cc",
-    "source/forward_error_correction.cc",
-    "source/forward_error_correction.h",
-    "source/forward_error_correction_internal.cc",
-    "source/forward_error_correction_internal.h",
-    "source/packet_loss_stats.cc",
-    "source/packet_loss_stats.h",
-    "source/playout_delay_oracle.cc",
-    "source/playout_delay_oracle.h",
-    "source/receive_statistics_impl.cc",
-    "source/receive_statistics_impl.h",
-    "source/remote_ntp_time_estimator.cc",
-    "source/rtcp_nack_stats.cc",
-    "source/rtcp_nack_stats.h",
-    "source/rtcp_packet.cc",
-    "source/rtcp_packet.h",
-    "source/rtcp_packet/app.cc",
-    "source/rtcp_packet/app.h",
-    "source/rtcp_packet/bye.cc",
-    "source/rtcp_packet/bye.h",
-    "source/rtcp_packet/common_header.cc",
-    "source/rtcp_packet/common_header.h",
-    "source/rtcp_packet/compound_packet.cc",
-    "source/rtcp_packet/compound_packet.h",
-    "source/rtcp_packet/dlrr.cc",
-    "source/rtcp_packet/dlrr.h",
-    "source/rtcp_packet/extended_jitter_report.cc",
-    "source/rtcp_packet/extended_jitter_report.h",
-    "source/rtcp_packet/extended_reports.cc",
-    "source/rtcp_packet/extended_reports.h",
-    "source/rtcp_packet/fir.cc",
-    "source/rtcp_packet/fir.h",
-    "source/rtcp_packet/nack.cc",
-    "source/rtcp_packet/nack.h",
-    "source/rtcp_packet/pli.cc",
-    "source/rtcp_packet/pli.h",
-    "source/rtcp_packet/psfb.cc",
-    "source/rtcp_packet/psfb.h",
-    "source/rtcp_packet/rapid_resync_request.cc",
-    "source/rtcp_packet/rapid_resync_request.h",
-    "source/rtcp_packet/receiver_report.cc",
-    "source/rtcp_packet/receiver_report.h",
-    "source/rtcp_packet/remb.cc",
-    "source/rtcp_packet/remb.h",
-    "source/rtcp_packet/report_block.cc",
-    "source/rtcp_packet/report_block.h",
-    "source/rtcp_packet/rrtr.cc",
-    "source/rtcp_packet/rrtr.h",
-    "source/rtcp_packet/rtpfb.cc",
-    "source/rtcp_packet/rtpfb.h",
-    "source/rtcp_packet/sdes.cc",
-    "source/rtcp_packet/sdes.h",
-    "source/rtcp_packet/sender_report.cc",
-    "source/rtcp_packet/sender_report.h",
-    "source/rtcp_packet/target_bitrate.cc",
-    "source/rtcp_packet/target_bitrate.h",
-    "source/rtcp_packet/tmmb_item.cc",
-    "source/rtcp_packet/tmmb_item.h",
-    "source/rtcp_packet/tmmbn.cc",
-    "source/rtcp_packet/tmmbn.h",
-    "source/rtcp_packet/tmmbr.cc",
-    "source/rtcp_packet/tmmbr.h",
-    "source/rtcp_packet/transport_feedback.cc",
-    "source/rtcp_packet/transport_feedback.h",
-    "source/rtcp_packet/voip_metric.cc",
-    "source/rtcp_packet/voip_metric.h",
-    "source/rtcp_receiver.cc",
-    "source/rtcp_receiver.h",
-    "source/rtcp_sender.cc",
-    "source/rtcp_sender.h",
-    "source/rtp_format.cc",
-    "source/rtp_format.h",
-    "source/rtp_format_h264.cc",
-    "source/rtp_format_h264.h",
-    "source/rtp_format_video_generic.cc",
-    "source/rtp_format_video_generic.h",
-    "source/rtp_format_vp8.cc",
-    "source/rtp_format_vp8.h",
-    "source/rtp_format_vp9.cc",
-    "source/rtp_format_vp9.h",
-    "source/rtp_header_parser.cc",
-    "source/rtp_packet_history.cc",
-    "source/rtp_packet_history.h",
-    "source/rtp_payload_registry.cc",
-    "source/rtp_receiver_audio.cc",
-    "source/rtp_receiver_audio.h",
-    "source/rtp_receiver_impl.cc",
-    "source/rtp_receiver_impl.h",
-    "source/rtp_receiver_strategy.cc",
-    "source/rtp_receiver_strategy.h",
-    "source/rtp_receiver_video.cc",
-    "source/rtp_receiver_video.h",
-    "source/rtp_rtcp_config.h",
-    "source/rtp_rtcp_impl.cc",
-    "source/rtp_rtcp_impl.h",
-    "source/rtp_sender.cc",
-    "source/rtp_sender.h",
-    "source/rtp_sender_audio.cc",
-    "source/rtp_sender_audio.h",
-    "source/rtp_sender_video.cc",
-    "source/rtp_sender_video.h",
-    "source/rtp_utility.cc",
-    "source/rtp_utility.h",
-    "source/time_util.cc",
-    "source/time_util.h",
-    "source/tmmbr_help.cc",
-    "source/tmmbr_help.h",
-    "source/ulpfec_generator.cc",
-    "source/ulpfec_generator.h",
-    "source/ulpfec_header_reader_writer.cc",
-    "source/ulpfec_header_reader_writer.h",
-    "source/ulpfec_receiver_impl.cc",
-    "source/ulpfec_receiver_impl.h",
-    "source/video_codec_information.h",
-  ]
-
-  if (rtc_enable_bwe_test_logging) {
-    defines = [ "BWE_TEST_LOGGING_COMPILE_TIME_ENABLE=1" ]
-  } else {
-    defines = [ "BWE_TEST_LOGGING_COMPILE_TIME_ENABLE=0" ]
-  }
-
-  if (!build_with_chromium && is_clang) {
-    # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-    suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-  }
-
-  deps = [
-    "..:module_api",
-    "../..:webrtc_common",
-    "../../api:array_view",
-    "../../api:libjingle_peerconnection_api",
-    "../../api:optional",
-    "../../api:transport_api",
-    "../../api/audio_codecs:audio_codecs_api",
-    "../../common_video",
-    "../../logging:rtc_event_log_api",
-    "../../rtc_base:gtest_prod",
-    "../../rtc_base:rtc_base_approved",
-    "../../rtc_base:sequenced_task_checker",
-    "../../system_wrappers",
-    "../audio_coding:audio_format_conversion",
-    "../remote_bitrate_estimator",
-  ]
-
-  public_deps = [
-    ":rtp_rtcp_format",
-  ]
-
-  # TODO(jschuh): Bug 1348: fix this warning.
-  configs += [ "//build/config/compiler:no_size_t_to_int_warning" ]
-
-  if (is_win) {
-    cflags = [
-      # TODO(kjellander): Bug 261: fix this warning.
-      "/wd4373",  # virtual function override.
-    ]
-  }
-}
-
-rtc_source_set("fec_test_helper") {
-  testonly = true
-  sources = [
-    "source/fec_test_helper.cc",
-    "source/fec_test_helper.h",
-  ]
-  deps = [
-    ":rtp_rtcp",
-    "..:module_api",
-    "../../rtc_base:rtc_base_approved",
-  ]
-
-  # TODO(jschuh): bugs.webrtc.org/1348: fix this warning.
-  configs += [ "//build/config/compiler:no_size_t_to_int_warning" ]
-  if (!build_with_chromium && is_clang) {
-    # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-    suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-  }
-}
-
-rtc_source_set("mock_rtp_rtcp") {
-  testonly = true
-  sources = [
-    "mocks/mock_recovered_packet_receiver.h",
-    "mocks/mock_rtcp_rtt_stats.h",
-    "mocks/mock_rtp_rtcp.h",
-  ]
-  deps = [
-    ":rtp_rtcp",
-    "..:module_api",
-    "../../api:optional",
-    "../../rtc_base:rtc_base_approved",
-    "../../test:test_support",
-  ]
-}
-
-if (rtc_include_tests) {
-  rtc_executable("test_packet_masks_metrics") {
-    testonly = true
-
-    sources = [
-      "test/testFec/average_residual_loss_xor_codes.h",
-      "test/testFec/test_packet_masks_metrics.cc",
-    ]
-
-    deps = [
-      ":rtp_rtcp",
-      "../../test:test_main",
-      "//testing/gtest",
-    ]
-  }  # test_packet_masks_metrics
-
-  rtc_source_set("rtp_rtcp_modules_tests") {
-    testonly = true
-
-    # Skip restricting visibility on mobile platforms since the tests on those
-    # gets additional generated targets which would require many lines here to
-    # cover (which would be confusing to read and hard to maintain).
-    if (!is_android && !is_ios) {
-      visibility = [ "../../modules:modules_tests" ]
-    }
-    sources = [
-      "test/testFec/test_fec.cc",
-    ]
-    deps = [
-      ":rtp_rtcp",
-      "../../rtc_base:rtc_base_approved",
-      "../../test:test_support",
-    ]
-    if (!build_with_chromium && is_clang) {
-      # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-    }
-  }
-
-  rtc_source_set("rtp_rtcp_unittests") {
-    testonly = true
-
-    # Skip restricting visibility on mobile platforms since the tests on those
-    # gets additional generated targets which would require many lines here to
-    # cover (which would be confusing to read and hard to maintain).
-    if (!is_android && !is_ios) {
-      visibility = [ "..:modules_unittests" ]
-    }
-    sources = [
-      "source/byte_io_unittest.cc",
-      "source/flexfec_header_reader_writer_unittest.cc",
-      "source/flexfec_receiver_unittest.cc",
-      "source/flexfec_sender_unittest.cc",
-      "source/nack_rtx_unittest.cc",
-      "source/packet_loss_stats_unittest.cc",
-      "source/playout_delay_oracle_unittest.cc",
-      "source/receive_statistics_unittest.cc",
-      "source/remote_ntp_time_estimator_unittest.cc",
-      "source/rtcp_nack_stats_unittest.cc",
-      "source/rtcp_packet/app_unittest.cc",
-      "source/rtcp_packet/bye_unittest.cc",
-      "source/rtcp_packet/common_header_unittest.cc",
-      "source/rtcp_packet/compound_packet_unittest.cc",
-      "source/rtcp_packet/dlrr_unittest.cc",
-      "source/rtcp_packet/extended_jitter_report_unittest.cc",
-      "source/rtcp_packet/extended_reports_unittest.cc",
-      "source/rtcp_packet/fir_unittest.cc",
-      "source/rtcp_packet/nack_unittest.cc",
-      "source/rtcp_packet/pli_unittest.cc",
-      "source/rtcp_packet/rapid_resync_request_unittest.cc",
-      "source/rtcp_packet/receiver_report_unittest.cc",
-      "source/rtcp_packet/remb_unittest.cc",
-      "source/rtcp_packet/report_block_unittest.cc",
-      "source/rtcp_packet/rrtr_unittest.cc",
-      "source/rtcp_packet/sdes_unittest.cc",
-      "source/rtcp_packet/sender_report_unittest.cc",
-      "source/rtcp_packet/target_bitrate_unittest.cc",
-      "source/rtcp_packet/tmmbn_unittest.cc",
-      "source/rtcp_packet/tmmbr_unittest.cc",
-      "source/rtcp_packet/transport_feedback_unittest.cc",
-      "source/rtcp_packet/voip_metric_unittest.cc",
-      "source/rtcp_packet_unittest.cc",
-      "source/rtcp_receiver_unittest.cc",
-      "source/rtcp_sender_unittest.cc",
-      "source/rtp_fec_unittest.cc",
-      "source/rtp_format_h264_unittest.cc",
-      "source/rtp_format_video_generic_unittest.cc",
-      "source/rtp_format_vp8_test_helper.cc",
-      "source/rtp_format_vp8_test_helper.h",
-      "source/rtp_format_vp8_unittest.cc",
-      "source/rtp_format_vp9_unittest.cc",
-      "source/rtp_header_extension_map_unittest.cc",
-      "source/rtp_packet_history_unittest.cc",
-      "source/rtp_packet_unittest.cc",
-      "source/rtp_payload_registry_unittest.cc",
-      "source/rtp_receiver_unittest.cc",
-      "source/rtp_rtcp_impl_unittest.cc",
-      "source/rtp_sender_unittest.cc",
-      "source/rtp_utility_unittest.cc",
-      "source/time_util_unittest.cc",
-      "source/ulpfec_generator_unittest.cc",
-      "source/ulpfec_header_reader_writer_unittest.cc",
-      "source/ulpfec_receiver_unittest.cc",
-      "test/testAPI/test_api.cc",
-      "test/testAPI/test_api.h",
-      "test/testAPI/test_api_audio.cc",
-      "test/testAPI/test_api_rtcp.cc",
-      "test/testAPI/test_api_video.cc",
-    ]
-    deps = [
-      ":fec_test_helper",
-      ":mock_rtp_rtcp",
-      ":rtp_rtcp",
-      "..:module_api",
-      "../..:webrtc_common",
-      "../../api:array_view",
-      "../../api:libjingle_peerconnection_api",
-      "../../api:transport_api",
-      "../../call:rtp_receiver",
-      "../../common_video:common_video",
-      "../../rtc_base:rtc_base_approved",
-      "../../system_wrappers:system_wrappers",
-      "../../test:field_trial",
-      "../../test:rtp_test_utils",
-      "../../test:test_common",
-      "../../test:test_support",
-      "//testing/gmock",
-    ]
-
-    # TODO(jschuh): bugs.webrtc.org/1348: fix this warning.
-    configs += [ "//build/config/compiler:no_size_t_to_int_warning" ]
-    if (!build_with_chromium && is_clang) {
-      # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-    }
-  }
-}
diff --git a/modules/rtp_rtcp/DEPS b/modules/rtp_rtcp/DEPS
deleted file mode 100644
index 83abb27..0000000
--- a/modules/rtp_rtcp/DEPS
+++ /dev/null
@@ -1,6 +0,0 @@
-include_rules = [
-  "+webrtc/call",
-  "+webrtc/common_video",
-  "+webrtc/logging/rtc_event_log",
-  "+webrtc/system_wrappers",
-]
diff --git a/modules/rtp_rtcp/OWNERS b/modules/rtp_rtcp/OWNERS
deleted file mode 100644
index 9377d87..0000000
--- a/modules/rtp_rtcp/OWNERS
+++ /dev/null
@@ -1,10 +0,0 @@
-stefan@webrtc.org
-henrik.lundin@webrtc.org
-mflodman@webrtc.org
-asapersson@webrtc.org
-danilchap@webrtc.org
-
-# These are for the common case of adding or renaming files. If you're doing
-# structural changes, please get a review from a reviewer in this file.
-per-file *.gn=*
-per-file *.gni=*
diff --git a/modules/rtp_rtcp/include/flexfec_receiver.h b/modules/rtp_rtcp/include/flexfec_receiver.h
deleted file mode 100644
index ae46964..0000000
--- a/modules/rtp_rtcp/include/flexfec_receiver.h
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- *  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_RTP_RTCP_INCLUDE_FLEXFEC_RECEIVER_H_
-#define WEBRTC_MODULES_RTP_RTCP_INCLUDE_FLEXFEC_RECEIVER_H_
-
-#include <memory>
-
-#include "webrtc/modules/rtp_rtcp/include/ulpfec_receiver.h"
-#include "webrtc/modules/rtp_rtcp/source/forward_error_correction.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_packet_received.h"
-#include "webrtc/rtc_base/basictypes.h"
-#include "webrtc/rtc_base/sequenced_task_checker.h"
-#include "webrtc/system_wrappers/include/clock.h"
-
-namespace webrtc {
-
-class FlexfecReceiver {
- public:
-  FlexfecReceiver(uint32_t ssrc,
-                  uint32_t protected_media_ssrc,
-                  RecoveredPacketReceiver* recovered_packet_receiver);
-  ~FlexfecReceiver();
-
-  // Inserts a received packet (can be either media or FlexFEC) into the
-  // internal buffer, and sends the received packets to the erasure code.
-  // All newly recovered packets are sent back through the callback.
-  void OnRtpPacket(const RtpPacketReceived& packet);
-
-  // Returns a counter describing the added and recovered packets.
-  FecPacketCounter GetPacketCounter() const;
-
-  // Protected to aid testing.
- protected:
-  bool AddReceivedPacket(const RtpPacketReceived& packet);
-  bool ProcessReceivedPackets();
-
- private:
-  // Config.
-  const uint32_t ssrc_;
-  const uint32_t protected_media_ssrc_;
-
-  // Erasure code interfacing and callback.
-  std::unique_ptr<ForwardErrorCorrection> erasure_code_
-      RTC_GUARDED_BY(sequence_checker_);
-  ForwardErrorCorrection::ReceivedPacketList received_packets_
-      RTC_GUARDED_BY(sequence_checker_);
-  ForwardErrorCorrection::RecoveredPacketList recovered_packets_
-      RTC_GUARDED_BY(sequence_checker_);
-  RecoveredPacketReceiver* const recovered_packet_receiver_;
-
-  // Logging and stats.
-  Clock* const clock_;
-  int64_t last_recovered_packet_ms_ RTC_GUARDED_BY(sequence_checker_);
-  FecPacketCounter packet_counter_ RTC_GUARDED_BY(sequence_checker_);
-
-  rtc::SequencedTaskChecker sequence_checker_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_RTP_RTCP_INCLUDE_FLEXFEC_RECEIVER_H_
diff --git a/modules/rtp_rtcp/include/flexfec_sender.h b/modules/rtp_rtcp/include/flexfec_sender.h
deleted file mode 100644
index 9404f78..0000000
--- a/modules/rtp_rtcp/include/flexfec_sender.h
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- *  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_RTP_RTCP_INCLUDE_FLEXFEC_SENDER_H_
-#define WEBRTC_MODULES_RTP_RTCP_INCLUDE_FLEXFEC_SENDER_H_
-
-#include <memory>
-#include <vector>
-
-#include "webrtc/api/array_view.h"
-#include "webrtc/api/rtpparameters.h"
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/modules/rtp_rtcp/include/flexfec_sender.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_header_extension_map.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_packet_to_send.h"
-#include "webrtc/modules/rtp_rtcp/source/ulpfec_generator.h"
-#include "webrtc/rtc_base/basictypes.h"
-#include "webrtc/rtc_base/random.h"
-#include "webrtc/system_wrappers/include/clock.h"
-
-namespace webrtc {
-
-class RtpPacketToSend;
-
-// Note that this class is not thread safe, and thus requires external
-// synchronization. Currently, this is done using the lock in PayloadRouter.
-
-class FlexfecSender {
- public:
-  FlexfecSender(int payload_type,
-                uint32_t ssrc,
-                uint32_t protected_media_ssrc,
-                const std::vector<RtpExtension>& rtp_header_extensions,
-                rtc::ArrayView<const RtpExtensionSize> extension_sizes,
-                const RtpState* rtp_state,
-                Clock* clock);
-  ~FlexfecSender();
-
-  uint32_t ssrc() const { return ssrc_; }
-
-  // Sets the FEC rate, max frames sent before FEC packets are sent,
-  // and what type of generator matrices are used.
-  void SetFecParameters(const FecProtectionParams& params);
-
-  // Adds a media packet to the internal buffer. When enough media packets
-  // have been added, the FEC packets are generated and stored internally.
-  // These FEC packets are then obtained by calling GetFecPackets().
-  // Returns true if the media packet was successfully added.
-  bool AddRtpPacketAndGenerateFec(const RtpPacketToSend& packet);
-
-  // Returns true if there are generated FEC packets available.
-  bool FecAvailable() const;
-
-  // Returns generated FlexFEC packets.
-  std::vector<std::unique_ptr<RtpPacketToSend>> GetFecPackets();
-
-  // Returns the overhead, per packet, for FlexFEC.
-  size_t MaxPacketOverhead() const;
-
-  // Only called on the VideoSendStream queue, after operation has shut down.
-  RtpState GetRtpState();
-
- private:
-  // Utility.
-  Clock* const clock_;
-  Random random_;
-  int64_t last_generated_packet_ms_;
-
-  // Config.
-  const int payload_type_;
-  const uint32_t timestamp_offset_;
-  const uint32_t ssrc_;
-  const uint32_t protected_media_ssrc_;
-  // Sequence number of next packet to generate.
-  uint16_t seq_num_;
-
-  // Implementation.
-  UlpfecGenerator ulpfec_generator_;
-  const RtpHeaderExtensionMap rtp_header_extension_map_;
-  const size_t header_extensions_size_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_RTP_RTCP_INCLUDE_FLEXFEC_SENDER_H_
diff --git a/modules/rtp_rtcp/include/receive_statistics.h b/modules/rtp_rtcp/include/receive_statistics.h
deleted file mode 100644
index 11e18be..0000000
--- a/modules/rtp_rtcp/include/receive_statistics.h
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- *  Copyright (c) 2013 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_RTP_RTCP_INCLUDE_RECEIVE_STATISTICS_H_
-#define WEBRTC_MODULES_RTP_RTCP_INCLUDE_RECEIVE_STATISTICS_H_
-
-#include <map>
-#include <vector>
-
-#include "webrtc/modules/include/module.h"
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/report_block.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-class Clock;
-
-class ReceiveStatisticsProvider {
- public:
-  virtual ~ReceiveStatisticsProvider() = default;
-  // Collects receive statistic in a form of rtcp report blocks.
-  // Returns at most |max_blocks| report blocks.
-  virtual std::vector<rtcp::ReportBlock> RtcpReportBlocks(
-      size_t max_blocks) = 0;
-};
-
-class StreamStatistician {
- public:
-  virtual ~StreamStatistician();
-
-  virtual bool GetStatistics(RtcpStatistics* statistics, bool reset) = 0;
-  virtual void GetDataCounters(size_t* bytes_received,
-                               uint32_t* packets_received) const = 0;
-
-  // Gets received stream data counters (includes reset counter values).
-  virtual void GetReceiveStreamDataCounters(
-      StreamDataCounters* data_counters) const = 0;
-
-  virtual uint32_t BitrateReceived() const = 0;
-
-  // Returns true if the packet with RTP header |header| is likely to be a
-  // retransmitted packet, false otherwise.
-  virtual bool IsRetransmitOfOldPacket(const RTPHeader& header,
-                                       int64_t min_rtt) const = 0;
-
-  // Returns true if |sequence_number| is received in order, false otherwise.
-  virtual bool IsPacketInOrder(uint16_t sequence_number) const = 0;
-};
-
-typedef std::map<uint32_t, StreamStatistician*> StatisticianMap;
-
-class ReceiveStatistics : public ReceiveStatisticsProvider {
- public:
-  ~ReceiveStatistics() override = default;
-
-  static ReceiveStatistics* Create(Clock* clock);
-
-  // Updates the receive statistics with this packet.
-  virtual void IncomingPacket(const RTPHeader& rtp_header,
-                              size_t packet_length,
-                              bool retransmitted) = 0;
-
-  // Increment counter for number of FEC packets received.
-  virtual void FecPacketReceived(const RTPHeader& header,
-                                 size_t packet_length) = 0;
-
-  // Returns a map of all statisticians which have seen an incoming packet
-  // during the last two seconds.
-  virtual StatisticianMap GetActiveStatisticians() const = 0;
-
-  // Returns a pointer to the statistician of an ssrc.
-  virtual StreamStatistician* GetStatistician(uint32_t ssrc) const = 0;
-
-  // Sets the max reordering threshold in number of packets.
-  virtual void SetMaxReorderingThreshold(int max_reordering_threshold) = 0;
-
-  // Called on new RTCP stats creation.
-  virtual void RegisterRtcpStatisticsCallback(
-      RtcpStatisticsCallback* callback) = 0;
-
-  // Called on new RTP stats creation.
-  virtual void RegisterRtpStatisticsCallback(
-      StreamDataCountersCallback* callback) = 0;
-};
-
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_RTP_RTCP_INCLUDE_RECEIVE_STATISTICS_H_
diff --git a/modules/rtp_rtcp/include/remote_ntp_time_estimator.h b/modules/rtp_rtcp/include/remote_ntp_time_estimator.h
deleted file mode 100644
index e80593b..0000000
--- a/modules/rtp_rtcp/include/remote_ntp_time_estimator.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- *  Copyright (c) 2014 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_RTP_RTCP_INCLUDE_REMOTE_NTP_TIME_ESTIMATOR_H_
-#define WEBRTC_MODULES_RTP_RTCP_INCLUDE_REMOTE_NTP_TIME_ESTIMATOR_H_
-
-#include <memory>
-
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/system_wrappers/include/rtp_to_ntp_estimator.h"
-
-namespace webrtc {
-
-class Clock;
-class TimestampExtrapolator;
-
-// RemoteNtpTimeEstimator can be used to estimate a given RTP timestamp's NTP
-// time in local timebase.
-// Note that it needs to be trained with at least 2 RTCP SR (by calling
-// |UpdateRtcpTimestamp|) before it can be used.
-class RemoteNtpTimeEstimator {
- public:
-  explicit RemoteNtpTimeEstimator(Clock* clock);
-
-  ~RemoteNtpTimeEstimator();
-
-  // Updates the estimator with round trip time |rtt|, NTP seconds |ntp_secs|,
-  // NTP fraction |ntp_frac| and RTP timestamp |rtcp_timestamp|.
-  bool UpdateRtcpTimestamp(int64_t rtt, uint32_t ntp_secs, uint32_t ntp_frac,
-                           uint32_t rtp_timestamp);
-
-  // Estimates the NTP timestamp in local timebase from |rtp_timestamp|.
-  // Returns the NTP timestamp in ms when success. -1 if failed.
-  int64_t Estimate(uint32_t rtp_timestamp);
-
- private:
-  Clock* clock_;
-  std::unique_ptr<TimestampExtrapolator> ts_extrapolator_;
-  RtpToNtpEstimator rtp_to_ntp_;
-  int64_t last_timing_log_ms_;
-  RTC_DISALLOW_COPY_AND_ASSIGN(RemoteNtpTimeEstimator);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_RTP_RTCP_INCLUDE_REMOTE_NTP_TIME_ESTIMATOR_H_
diff --git a/modules/rtp_rtcp/include/rtp_cvo.h b/modules/rtp_rtcp/include/rtp_cvo.h
deleted file mode 100644
index 6ce7312..0000000
--- a/modules/rtp_rtcp/include/rtp_cvo.h
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- *  Copyright (c) 2015 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_RTP_RTCP_INCLUDE_RTP_CVO_H_
-#define WEBRTC_MODULES_RTP_RTCP_INCLUDE_RTP_CVO_H_
-
-#include "webrtc/api/video/video_rotation.h"
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-
-// Please refer to http://www.etsi.org/deliver/etsi_ts/126100_126199/126114/
-// 12.07.00_60/ts_126114v120700p.pdf Section 7.4.5. The rotation of a frame is
-// the clockwise angle the frames must be rotated in order to display the frames
-// correctly if the display is rotated in its natural orientation.
-inline uint8_t ConvertVideoRotationToCVOByte(VideoRotation rotation) {
-  switch (rotation) {
-    case kVideoRotation_0:
-      return 0;
-    case kVideoRotation_90:
-      return 1;
-    case kVideoRotation_180:
-      return 2;
-    case kVideoRotation_270:
-      return 3;
-  }
-  RTC_NOTREACHED();
-  return 0;
-}
-
-inline VideoRotation ConvertCVOByteToVideoRotation(uint8_t cvo_byte) {
-  // CVO byte: |0 0 0 0 C F R R|.
-  const uint8_t rotation_bits = cvo_byte & 0x3;
-  switch (rotation_bits) {
-    case 0:
-      return kVideoRotation_0;
-    case 1:
-      return kVideoRotation_90;
-    case 2:
-      return kVideoRotation_180;
-    case 3:
-      return kVideoRotation_270;
-    default:
-      RTC_NOTREACHED();
-      return kVideoRotation_0;
-  }
-}
-
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_RTP_RTCP_INCLUDE_RTP_CVO_H_
diff --git a/modules/rtp_rtcp/include/rtp_header_extension_map.h b/modules/rtp_rtcp/include/rtp_header_extension_map.h
deleted file mode 100644
index 59ab582..0000000
--- a/modules/rtp_rtcp/include/rtp_header_extension_map.h
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- *  Copyright (c) 2012 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_RTP_RTCP_INCLUDE_RTP_HEADER_EXTENSION_MAP_H_
-#define WEBRTC_MODULES_RTP_RTCP_INCLUDE_RTP_HEADER_EXTENSION_MAP_H_
-
-#include <string>
-
-#include "webrtc/api/array_view.h"
-#include "webrtc/api/rtpparameters.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
-#include "webrtc/rtc_base/basictypes.h"
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-
-struct RtpExtensionSize {
-  RTPExtensionType type;
-  uint8_t value_size;
-};
-
-class RtpHeaderExtensionMap {
- public:
-  static constexpr RTPExtensionType kInvalidType = kRtpExtensionNone;
-  static constexpr int kInvalidId = 0;
-
-  RtpHeaderExtensionMap();
-  explicit RtpHeaderExtensionMap(rtc::ArrayView<const RtpExtension> extensions);
-
-  template <typename Extension>
-  bool Register(int id) {
-    return Register(id, Extension::kId, Extension::kUri);
-  }
-  bool RegisterByType(int id, RTPExtensionType type);
-  bool RegisterByUri(int id, const std::string& uri);
-
-  bool IsRegistered(RTPExtensionType type) const {
-    return GetId(type) != kInvalidId;
-  }
-  // Return kInvalidType if not found.
-  RTPExtensionType GetType(int id) const {
-    RTC_DCHECK_GE(id, kMinId);
-    RTC_DCHECK_LE(id, kMaxId);
-    return types_[id];
-  }
-  // Return kInvalidId if not found.
-  uint8_t GetId(RTPExtensionType type) const {
-    RTC_DCHECK_GT(type, kRtpExtensionNone);
-    RTC_DCHECK_LT(type, kRtpExtensionNumberOfExtensions);
-    return ids_[type];
-  }
-
-  size_t GetTotalLengthInBytes(
-      rtc::ArrayView<const RtpExtensionSize> extensions) const;
-
-  // TODO(danilchap): Remove use of the functions below.
-  int32_t Register(RTPExtensionType type, int id) {
-    return RegisterByType(id, type) ? 0 : -1;
-  }
-  int32_t Deregister(RTPExtensionType type);
-
- private:
-  static constexpr int kMinId = 1;
-  static constexpr int kMaxId = 14;
-  bool Register(int id, RTPExtensionType type, const char* uri);
-
-  RTPExtensionType types_[kMaxId + 1];
-  uint8_t ids_[kRtpExtensionNumberOfExtensions];
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_RTP_RTCP_INCLUDE_RTP_HEADER_EXTENSION_MAP_H_
diff --git a/modules/rtp_rtcp/include/rtp_header_parser.h b/modules/rtp_rtcp/include/rtp_header_parser.h
deleted file mode 100644
index 329de32..0000000
--- a/modules/rtp_rtcp/include/rtp_header_parser.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- *  Copyright (c) 2013 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_RTP_RTCP_INCLUDE_RTP_HEADER_PARSER_H_
-#define WEBRTC_MODULES_RTP_RTCP_INCLUDE_RTP_HEADER_PARSER_H_
-
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-struct RTPHeader;
-
-class RtpHeaderParser {
- public:
-  static RtpHeaderParser* Create();
-  virtual ~RtpHeaderParser() {}
-
-  // Returns true if the packet is an RTCP packet, false otherwise.
-  static bool IsRtcp(const uint8_t* packet, size_t length);
-
-  // Parses the packet and stores the parsed packet in |header|. Returns true on
-  // success, false otherwise.
-  // This method is thread-safe in the sense that it can parse multiple packets
-  // at once.
-  virtual bool Parse(const uint8_t* packet,
-                     size_t length,
-                     RTPHeader* header) const = 0;
-
-  // Registers an RTP header extension and binds it to |id|.
-  virtual bool RegisterRtpHeaderExtension(RTPExtensionType type,
-                                          uint8_t id) = 0;
-
-  // De-registers an RTP header extension.
-  virtual bool DeregisterRtpHeaderExtension(RTPExtensionType type) = 0;
-};
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_RTP_RTCP_INCLUDE_RTP_HEADER_PARSER_H_
diff --git a/modules/rtp_rtcp/include/rtp_payload_registry.h b/modules/rtp_rtcp/include/rtp_payload_registry.h
deleted file mode 100644
index 4eda28d..0000000
--- a/modules/rtp_rtcp/include/rtp_payload_registry.h
+++ /dev/null
@@ -1,130 +0,0 @@
-/*
- *  Copyright (c) 2013 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_RTP_RTCP_INCLUDE_RTP_PAYLOAD_REGISTRY_H_
-#define WEBRTC_MODULES_RTP_RTCP_INCLUDE_RTP_PAYLOAD_REGISTRY_H_
-
-#include <map>
-#include <set>
-
-#include "webrtc/api/audio_codecs/audio_format.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_utility.h"
-#include "webrtc/rtc_base/criticalsection.h"
-
-namespace webrtc {
-
-struct CodecInst;
-class VideoCodec;
-
-class RTPPayloadRegistry {
- public:
-  RTPPayloadRegistry();
-  ~RTPPayloadRegistry();
-
-  // TODO(magjed): Split RTPPayloadRegistry into separate Audio and Video class
-  // and simplify the code. http://crbug/webrtc/6743.
-
-  // Replace all audio receive payload types with the given map.
-  void SetAudioReceivePayloads(std::map<int, SdpAudioFormat> codecs);
-
-  int32_t RegisterReceivePayload(const CodecInst& audio_codec,
-                                 bool* created_new_payload_type);
-  int32_t RegisterReceivePayload(const VideoCodec& video_codec);
-
-  int32_t DeRegisterReceivePayload(int8_t payload_type);
-
-  int32_t ReceivePayloadType(const CodecInst& audio_codec,
-                             int8_t* payload_type) const;
-  int32_t ReceivePayloadType(const VideoCodec& video_codec,
-                             int8_t* payload_type) const;
-
-  bool RtxEnabled() const;
-
-  void SetRtxSsrc(uint32_t ssrc);
-
-  bool GetRtxSsrc(uint32_t* ssrc) const;
-
-  void SetRtxPayloadType(int payload_type, int associated_payload_type);
-
-  bool IsRed(const RTPHeader& header) const;
-
-  bool GetPayloadSpecifics(uint8_t payload_type, PayloadUnion* payload) const;
-
-  int GetPayloadTypeFrequency(uint8_t payload_type) const;
-
-  const RtpUtility::Payload* PayloadTypeToPayload(uint8_t payload_type) const;
-
-  void ResetLastReceivedPayloadTypes() {
-    rtc::CritScope cs(&crit_sect_);
-    last_received_payload_type_ = -1;
-    last_received_media_payload_type_ = -1;
-  }
-
-  // This sets the payload type of the packets being received from the network
-  // on the media SSRC. For instance if packets are encapsulated with RED, this
-  // payload type will be the RED payload type.
-  void SetIncomingPayloadType(const RTPHeader& header);
-
-  // Returns true if the new media payload type has not changed.
-  bool ReportMediaPayloadType(uint8_t media_payload_type);
-
-  int8_t red_payload_type() const { return GetPayloadTypeWithName("red"); }
-  int8_t ulpfec_payload_type() const {
-    return GetPayloadTypeWithName("ulpfec");
-  }
-  int8_t last_received_payload_type() const {
-    rtc::CritScope cs(&crit_sect_);
-    return last_received_payload_type_;
-  }
-  void set_last_received_payload_type(int8_t last_received_payload_type) {
-    rtc::CritScope cs(&crit_sect_);
-    last_received_payload_type_ = last_received_payload_type;
-  }
-
-  int8_t last_received_media_payload_type() const {
-    rtc::CritScope cs(&crit_sect_);
-    return last_received_media_payload_type_;
-  }
-
- private:
-  // Prunes the payload type map of the specific payload type, if it exists.
-  void DeregisterAudioCodecOrRedTypeRegardlessOfPayloadType(
-      const CodecInst& audio_codec);
-
-  bool IsRtxInternal(const RTPHeader& header) const;
-  // Returns the payload type for the payload with name |payload_name|, or -1 if
-  // no such payload is registered.
-  int8_t GetPayloadTypeWithName(const char* payload_name) const;
-
-  rtc::CriticalSection crit_sect_;
-  std::map<int, RtpUtility::Payload> payload_type_map_;
-  int8_t incoming_payload_type_;
-  int8_t last_received_payload_type_;
-  int8_t last_received_media_payload_type_;
-  bool rtx_;
-  // Mapping rtx_payload_type_map_[rtx] = associated.
-  std::map<int, int> rtx_payload_type_map_;
-  uint32_t ssrc_rtx_;
-  // Only warn once per payload type, if an RTX packet is received but
-  // no associated payload type found in |rtx_payload_type_map_|.
-  std::set<int> payload_types_with_suppressed_warnings_
-      RTC_GUARDED_BY(crit_sect_);
-
-  // As a first step in splitting this class up in separate cases for audio and
-  // video, DCHECK that no instance is used for both audio and video.
-#if RTC_DCHECK_IS_ON
-  bool used_for_audio_ RTC_GUARDED_BY(crit_sect_) = false;
-  bool used_for_video_ RTC_GUARDED_BY(crit_sect_) = false;
-#endif
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_RTP_RTCP_INCLUDE_RTP_PAYLOAD_REGISTRY_H_
diff --git a/modules/rtp_rtcp/include/rtp_receiver.h b/modules/rtp_rtcp/include/rtp_receiver.h
deleted file mode 100644
index 95bade6..0000000
--- a/modules/rtp_rtcp/include/rtp_receiver.h
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- *  Copyright (c) 2012 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_RTP_RTCP_INCLUDE_RTP_RECEIVER_H_
-#define WEBRTC_MODULES_RTP_RTCP_INCLUDE_RTP_RECEIVER_H_
-
-#include <vector>
-
-#include "webrtc/api/rtpreceiverinterface.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-struct CodecInst;
-class RTPPayloadRegistry;
-class VideoCodec;
-
-class TelephoneEventHandler {
- public:
-  virtual ~TelephoneEventHandler() {}
-
-  // The following three methods implement the TelephoneEventHandler interface.
-  // Forward DTMFs to decoder for playout.
-  virtual void SetTelephoneEventForwardToDecoder(bool forward_to_decoder) = 0;
-
-  // Is forwarding of outband telephone events turned on/off?
-  virtual bool TelephoneEventForwardToDecoder() const = 0;
-
-  // Is TelephoneEvent configured with payload type payload_type
-  virtual bool TelephoneEventPayloadType(const int8_t payload_type) const = 0;
-};
-
-class RtpReceiver {
- public:
-  // Creates a video-enabled RTP receiver.
-  static RtpReceiver* CreateVideoReceiver(
-      Clock* clock,
-      RtpData* incoming_payload_callback,
-      RtpFeedback* incoming_messages_callback,
-      RTPPayloadRegistry* rtp_payload_registry);
-
-  // Creates an audio-enabled RTP receiver.
-  static RtpReceiver* CreateAudioReceiver(
-      Clock* clock,
-      RtpData* incoming_payload_callback,
-      RtpFeedback* incoming_messages_callback,
-      RTPPayloadRegistry* rtp_payload_registry);
-
-  virtual ~RtpReceiver() {}
-
-  // Returns a TelephoneEventHandler if available.
-  virtual TelephoneEventHandler* GetTelephoneEventHandler() = 0;
-
-  // Registers a receive payload in the payload registry and notifies the media
-  // receiver strategy.
-  virtual int32_t RegisterReceivePayload(const CodecInst& audio_codec) = 0;
-  // Registers a receive payload in the payload registry.
-  virtual int32_t RegisterReceivePayload(const VideoCodec& video_codec) = 0;
-
-  // De-registers |payload_type| from the payload registry.
-  virtual int32_t DeRegisterReceivePayload(const int8_t payload_type) = 0;
-
-  // Parses the media specific parts of an RTP packet and updates the receiver
-  // state. This for instance means that any changes in SSRC and payload type is
-  // detected and acted upon.
-  virtual bool IncomingRtpPacket(const RTPHeader& rtp_header,
-                                 const uint8_t* payload,
-                                 size_t payload_length,
-                                 PayloadUnion payload_specific,
-                                 bool in_order) = 0;
-
-  // Gets the last received timestamp. Returns true if a packet has been
-  // received, false otherwise.
-  virtual bool Timestamp(uint32_t* timestamp) const = 0;
-  // Gets the time in milliseconds when the last timestamp was received.
-  // Returns true if a packet has been received, false otherwise.
-  virtual bool LastReceivedTimeMs(int64_t* receive_time_ms) const = 0;
-
-  // Returns the remote SSRC of the currently received RTP stream.
-  virtual uint32_t SSRC() const = 0;
-
-  // Returns the current remote CSRCs.
-  virtual int32_t CSRCs(uint32_t array_of_csrc[kRtpCsrcSize]) const = 0;
-
-  // Returns the current energy of the RTP stream received.
-  virtual int32_t Energy(uint8_t array_of_energy[kRtpCsrcSize]) const = 0;
-
-  virtual std::vector<RtpSource> GetSources() const = 0;
-};
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_RTP_RTCP_INCLUDE_RTP_RECEIVER_H_
diff --git a/modules/rtp_rtcp/include/rtp_rtcp.h b/modules/rtp_rtcp/include/rtp_rtcp.h
deleted file mode 100644
index 4fb50d1..0000000
--- a/modules/rtp_rtcp/include/rtp_rtcp.h
+++ /dev/null
@@ -1,462 +0,0 @@
-/*
- *  Copyright (c) 2012 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_RTP_RTCP_INCLUDE_RTP_RTCP_H_
-#define WEBRTC_MODULES_RTP_RTCP_INCLUDE_RTP_RTCP_H_
-
-#include <set>
-#include <string>
-#include <utility>
-#include <vector>
-
-#include "webrtc/api/optional.h"
-#include "webrtc/common_types.h"
-#include "webrtc/modules/include/module.h"
-#include "webrtc/modules/rtp_rtcp/include/flexfec_sender.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/deprecation.h"
-
-namespace webrtc {
-
-// Forward declarations.
-class OverheadObserver;
-class RateLimiter;
-class ReceiveStatisticsProvider;
-class RemoteBitrateEstimator;
-class RtcEventLog;
-class RtpReceiver;
-class Transport;
-class VideoBitrateAllocationObserver;
-
-RTPExtensionType StringToRtpExtensionType(const std::string& extension);
-
-namespace rtcp {
-class TransportFeedback;
-}
-
-class RtpRtcp : public Module {
- public:
-  struct Configuration {
-    Configuration();
-
-    // True for a audio version of the RTP/RTCP module object false will create
-    // a video version.
-    bool audio = false;
-    bool receiver_only = false;
-
-    // The clock to use to read time. If nullptr then system clock will be used.
-    Clock* clock = nullptr;
-
-    ReceiveStatisticsProvider* receive_statistics = nullptr;
-
-    // Transport object that will be called when packets are ready to be sent
-    // out on the network.
-    Transport* outgoing_transport = nullptr;
-
-    // Called when the receiver request a intra frame.
-    RtcpIntraFrameObserver* intra_frame_callback = nullptr;
-
-    // Called when we receive a changed estimate from the receiver of out
-    // stream.
-    RtcpBandwidthObserver* bandwidth_callback = nullptr;
-
-    TransportFeedbackObserver* transport_feedback_callback = nullptr;
-    VideoBitrateAllocationObserver* bitrate_allocation_observer = nullptr;
-    RtcpRttStats* rtt_stats = nullptr;
-    RtcpPacketTypeCounterObserver* rtcp_packet_type_counter_observer = nullptr;
-
-    // Estimates the bandwidth available for a set of streams from the same
-    // client.
-    RemoteBitrateEstimator* remote_bitrate_estimator = nullptr;
-
-    // Spread any bursts of packets into smaller bursts to minimize packet loss.
-    RtpPacketSender* paced_sender = nullptr;
-
-    // Generate FlexFEC packets.
-    // TODO(brandtr): Remove when FlexfecSender is wired up to PacedSender.
-    FlexfecSender* flexfec_sender = nullptr;
-
-    TransportSequenceNumberAllocator* transport_sequence_number_allocator =
-        nullptr;
-    BitrateStatisticsObserver* send_bitrate_observer = nullptr;
-    FrameCountObserver* send_frame_count_observer = nullptr;
-    SendSideDelayObserver* send_side_delay_observer = nullptr;
-    RtcEventLog* event_log = nullptr;
-    SendPacketObserver* send_packet_observer = nullptr;
-    RateLimiter* retransmission_rate_limiter = nullptr;
-    OverheadObserver* overhead_observer = nullptr;
-    RtpKeepAliveConfig keepalive_config;
-
-   private:
-    RTC_DISALLOW_COPY_AND_ASSIGN(Configuration);
-  };
-
-  // Create a RTP/RTCP module object using the system clock.
-  // |configuration|  - Configuration of the RTP/RTCP module.
-  static RtpRtcp* CreateRtpRtcp(const RtpRtcp::Configuration& configuration);
-
-  // **************************************************************************
-  // Receiver functions
-  // **************************************************************************
-
-  virtual void IncomingRtcpPacket(const uint8_t* incoming_packet,
-                                  size_t incoming_packet_length) = 0;
-
-  virtual void SetRemoteSSRC(uint32_t ssrc) = 0;
-
-  // **************************************************************************
-  // Sender
-  // **************************************************************************
-
-  // TODO(nisse): Deprecated. Kept temporarily, as an alias for the
-  // new function which has slighly different semantics. Delete as
-  // soon as known applications are updated.
-  virtual int32_t SetMaxTransferUnit(uint16_t size) {
-    SetMaxRtpPacketSize(size);
-    return 0;
-  }
-
-  // Sets the maximum size of an RTP packet, including RTP headers.
-  virtual void SetMaxRtpPacketSize(size_t size) = 0;
-
-  // Returns max RTP packet size. Takes into account RTP headers and
-  // FEC/ULP/RED overhead (when FEC is enabled).
-  virtual size_t MaxRtpPacketSize() const = 0;
-
-  // Sets codec name and payload type. Returns -1 on failure else 0.
-  virtual int32_t RegisterSendPayload(const CodecInst& voice_codec) = 0;
-
-  // Sets codec name and payload type. Return -1 on failure else 0.
-  virtual int32_t RegisterSendPayload(const VideoCodec& video_codec) = 0;
-
-  virtual void RegisterVideoSendPayload(int payload_type,
-                                        const char* payload_name) = 0;
-
-  // Unregisters a send payload.
-  // |payload_type| - payload type of codec
-  // Returns -1 on failure else 0.
-  virtual int32_t DeRegisterSendPayload(int8_t payload_type) = 0;
-
-  // (De)registers RTP header extension type and id.
-  // Returns -1 on failure else 0.
-  virtual int32_t RegisterSendRtpHeaderExtension(RTPExtensionType type,
-                                                 uint8_t id) = 0;
-
-  virtual int32_t DeregisterSendRtpHeaderExtension(RTPExtensionType type) = 0;
-
-  virtual bool HasBweExtensions() const = 0;
-
-  // Returns start timestamp.
-  virtual uint32_t StartTimestamp() const = 0;
-
-  // Sets start timestamp. Start timestamp is set to a random value if this
-  // function is never called.
-  virtual void SetStartTimestamp(uint32_t timestamp) = 0;
-
-  // Returns SequenceNumber.
-  virtual uint16_t SequenceNumber() const = 0;
-
-  // Sets SequenceNumber, default is a random number.
-  virtual void SetSequenceNumber(uint16_t seq) = 0;
-
-  virtual void SetRtpState(const RtpState& rtp_state) = 0;
-  virtual void SetRtxState(const RtpState& rtp_state) = 0;
-  virtual RtpState GetRtpState() const = 0;
-  virtual RtpState GetRtxState() const = 0;
-
-  // Returns SSRC.
-  virtual uint32_t SSRC() const = 0;
-
-  // Sets SSRC, default is a random number.
-  virtual void SetSSRC(uint32_t ssrc) = 0;
-
-  // Sets CSRC.
-  // |csrcs| - vector of CSRCs
-  virtual void SetCsrcs(const std::vector<uint32_t>& csrcs) = 0;
-
-  // Turns on/off sending RTX (RFC 4588). The modes can be set as a combination
-  // of values of the enumerator RtxMode.
-  virtual void SetRtxSendStatus(int modes) = 0;
-
-  // Returns status of sending RTX (RFC 4588). The returned value can be
-  // a combination of values of the enumerator RtxMode.
-  virtual int RtxSendStatus() const = 0;
-
-  // Sets the SSRC to use when sending RTX packets. This doesn't enable RTX,
-  // only the SSRC is set.
-  virtual void SetRtxSsrc(uint32_t ssrc) = 0;
-
-  // Sets the payload type to use when sending RTX packets. Note that this
-  // doesn't enable RTX, only the payload type is set.
-  virtual void SetRtxSendPayloadType(int payload_type,
-                                     int associated_payload_type) = 0;
-
-  // Returns the FlexFEC SSRC, if there is one.
-  virtual rtc::Optional<uint32_t> FlexfecSsrc() const = 0;
-
-  // Sets sending status. Sends kRtcpByeCode when going from true to false.
-  // Returns -1 on failure else 0.
-  virtual int32_t SetSendingStatus(bool sending) = 0;
-
-  // Returns current sending status.
-  virtual bool Sending() const = 0;
-
-  // Starts/Stops media packets. On by default.
-  virtual void SetSendingMediaStatus(bool sending) = 0;
-
-  // Returns current media sending status.
-  virtual bool SendingMedia() const = 0;
-
-  // Returns current bitrate in Kbit/s.
-  virtual void BitrateSent(uint32_t* total_rate,
-                           uint32_t* video_rate,
-                           uint32_t* fec_rate,
-                           uint32_t* nack_rate) const = 0;
-
-  // Used by the codec module to deliver a video or audio frame for
-  // packetization.
-  // |frame_type|    - type of frame to send
-  // |payload_type|  - payload type of frame to send
-  // |timestamp|     - timestamp of frame to send
-  // |payload_data|  - payload buffer of frame to send
-  // |payload_size|  - size of payload buffer to send
-  // |fragmentation| - fragmentation offset data for fragmented frames such
-  //                   as layers or RED
-  // |transport_frame_id_out| - set to RTP timestamp.
-  // Returns true on success.
-  virtual bool SendOutgoingData(FrameType frame_type,
-                                int8_t payload_type,
-                                uint32_t timestamp,
-                                int64_t capture_time_ms,
-                                const uint8_t* payload_data,
-                                size_t payload_size,
-                                const RTPFragmentationHeader* fragmentation,
-                                const RTPVideoHeader* rtp_video_header,
-                                uint32_t* transport_frame_id_out) = 0;
-
-  virtual bool TimeToSendPacket(uint32_t ssrc,
-                                uint16_t sequence_number,
-                                int64_t capture_time_ms,
-                                bool retransmission,
-                                const PacedPacketInfo& pacing_info) = 0;
-
-  virtual size_t TimeToSendPadding(size_t bytes,
-                                   const PacedPacketInfo& pacing_info) = 0;
-
-  // Called on generation of new statistics after an RTP send.
-  virtual void RegisterSendChannelRtpStatisticsCallback(
-      StreamDataCountersCallback* callback) = 0;
-  virtual StreamDataCountersCallback* GetSendChannelRtpStatisticsCallback()
-      const = 0;
-
-  // **************************************************************************
-  // RTCP
-  // **************************************************************************
-
-  // Returns RTCP status.
-  virtual RtcpMode RTCP() const = 0;
-
-  // Sets RTCP status i.e on(compound or non-compound)/off.
-  // |method| - RTCP method to use.
-  virtual void SetRTCPStatus(RtcpMode method) = 0;
-
-  // Sets RTCP CName (i.e unique identifier).
-  // Returns -1 on failure else 0.
-  virtual int32_t SetCNAME(const char* cname) = 0;
-
-  // Returns remote CName.
-  // Returns -1 on failure else 0.
-  virtual int32_t RemoteCNAME(uint32_t remote_ssrc,
-                              char cname[RTCP_CNAME_SIZE]) const = 0;
-
-  // Returns remote NTP.
-  // Returns -1 on failure else 0.
-  virtual int32_t RemoteNTP(uint32_t* received_ntp_secs,
-                            uint32_t* received_ntp_frac,
-                            uint32_t* rtcp_arrival_time_secs,
-                            uint32_t* rtcp_arrival_time_frac,
-                            uint32_t* rtcp_timestamp) const = 0;
-
-  // Returns -1 on failure else 0.
-  virtual int32_t AddMixedCNAME(uint32_t ssrc, const char* cname) = 0;
-
-  // Returns -1 on failure else 0.
-  virtual int32_t RemoveMixedCNAME(uint32_t ssrc) = 0;
-
-  // Returns current RTT (round-trip time) estimate.
-  // Returns -1 on failure else 0.
-  virtual int32_t RTT(uint32_t remote_ssrc,
-                      int64_t* rtt,
-                      int64_t* avg_rtt,
-                      int64_t* min_rtt,
-                      int64_t* max_rtt) const = 0;
-
-  // Forces a send of a RTCP packet. Periodic SR and RR are triggered via the
-  // process function.
-  // Returns -1 on failure else 0.
-  virtual int32_t SendRTCP(RTCPPacketType rtcp_packet_type) = 0;
-
-  // Forces a send of a RTCP packet with more than one packet type.
-  // periodic SR and RR are triggered via the process function
-  // Returns -1 on failure else 0.
-  virtual int32_t SendCompoundRTCP(
-      const std::set<RTCPPacketType>& rtcp_packet_types) = 0;
-
-  // Returns statistics of the amount of data sent.
-  // Returns -1 on failure else 0.
-  virtual int32_t DataCountersRTP(size_t* bytes_sent,
-                                  uint32_t* packets_sent) const = 0;
-
-  // Returns send statistics for the RTP and RTX stream.
-  virtual void GetSendStreamDataCounters(
-      StreamDataCounters* rtp_counters,
-      StreamDataCounters* rtx_counters) const = 0;
-
-  // Returns packet loss statistics for the RTP stream.
-  virtual void GetRtpPacketLossStats(
-      bool outgoing,
-      uint32_t ssrc,
-      struct RtpPacketLossStats* loss_stats) const = 0;
-
-  // Returns received RTCP report block.
-  // Returns -1 on failure else 0.
-  virtual int32_t RemoteRTCPStat(
-      std::vector<RTCPReportBlock>* receive_blocks) const = 0;
-
-  // (APP) Sets application specific data.
-  // Returns -1 on failure else 0.
-  virtual int32_t SetRTCPApplicationSpecificData(uint8_t sub_type,
-                                                 uint32_t name,
-                                                 const uint8_t* data,
-                                                 uint16_t length) = 0;
-  // (XR) Sets VOIP metric.
-  // Returns -1 on failure else 0.
-  virtual int32_t SetRTCPVoIPMetrics(const RTCPVoIPMetric* VoIPMetric) = 0;
-
-  // (XR) Sets Receiver Reference Time Report (RTTR) status.
-  virtual void SetRtcpXrRrtrStatus(bool enable) = 0;
-
-  // Returns current Receiver Reference Time Report (RTTR) status.
-  virtual bool RtcpXrRrtrStatus() const = 0;
-
-  // (REMB) Receiver Estimated Max Bitrate.
-  virtual bool REMB() const = 0;
-
-  virtual void SetREMBStatus(bool enable) = 0;
-
-  virtual void SetREMBData(uint32_t bitrate,
-                           const std::vector<uint32_t>& ssrcs) = 0;
-
-  // (TMMBR) Temporary Max Media Bit Rate
-  virtual bool TMMBR() const = 0;
-
-  virtual void SetTMMBRStatus(bool enable) = 0;
-
-  // (NACK)
-
-  // TODO(holmer): Propagate this API to VideoEngine.
-  // Returns the currently configured selective retransmission settings.
-  virtual int SelectiveRetransmissions() const = 0;
-
-  // TODO(holmer): Propagate this API to VideoEngine.
-  // Sets the selective retransmission settings, which will decide which
-  // packets will be retransmitted if NACKed. Settings are constructed by
-  // combining the constants in enum RetransmissionMode with bitwise OR.
-  // All packets are retransmitted if kRetransmitAllPackets is set, while no
-  // packets are retransmitted if kRetransmitOff is set.
-  // By default all packets except FEC packets are retransmitted. For VP8
-  // with temporal scalability only base layer packets are retransmitted.
-  // Returns -1 on failure, otherwise 0.
-  virtual int SetSelectiveRetransmissions(uint8_t settings) = 0;
-
-  // Sends a Negative acknowledgement packet.
-  // Returns -1 on failure else 0.
-  // TODO(philipel): Deprecate this and start using SendNack instead, mostly
-  // because we want a function that actually send NACK for the specified
-  // packets.
-  virtual int32_t SendNACK(const uint16_t* nack_list, uint16_t size) = 0;
-
-  // Sends NACK for the packets specified.
-  // Note: This assumes the caller keeps track of timing and doesn't rely on
-  // the RTP module to do this.
-  virtual void SendNack(const std::vector<uint16_t>& sequence_numbers) = 0;
-
-  // Store the sent packets, needed to answer to a Negative acknowledgment
-  // requests.
-  virtual void SetStorePacketsStatus(bool enable, uint16_t numberToStore) = 0;
-
-  // Returns true if the module is configured to store packets.
-  virtual bool StorePackets() const = 0;
-
-  // Called on receipt of RTCP report block from remote side.
-  virtual void RegisterRtcpStatisticsCallback(
-      RtcpStatisticsCallback* callback) = 0;
-  virtual RtcpStatisticsCallback* GetRtcpStatisticsCallback() = 0;
-  // BWE feedback packets.
-  virtual bool SendFeedbackPacket(const rtcp::TransportFeedback& packet) = 0;
-
-  virtual void SetVideoBitrateAllocation(const BitrateAllocation& bitrate) = 0;
-
-  // **************************************************************************
-  // Audio
-  // **************************************************************************
-
-  // Sends a TelephoneEvent tone using RFC 2833 (4733).
-  // Returns -1 on failure else 0.
-  virtual int32_t SendTelephoneEventOutband(uint8_t key,
-                                            uint16_t time_ms,
-                                            uint8_t level) = 0;
-
-  // Store the audio level in dBov for header-extension-for-audio-level-
-  // indication.
-  // This API shall be called before transmision of an RTP packet to ensure
-  // that the |level| part of the extended RTP header is updated.
-  // return -1 on failure else 0.
-  virtual int32_t SetAudioLevel(uint8_t level_dbov) = 0;
-
-  // **************************************************************************
-  // Video
-  // **************************************************************************
-
-  // Set RED and ULPFEC payload types. A payload type of -1 means that the
-  // corresponding feature is turned off. Note that we DO NOT support enabling
-  // ULPFEC without enabling RED. However, we DO support enabling RED without
-  // enabling ULPFEC. This is due to an RED/RTX workaround, where the receiver
-  // assumes that RTX packets carry RED if RED has been configured in the SDP,
-  // regardless of what RTX payload type mapping was negotiated in the SDP.
-  // TODO(brandtr): Update this comment when we have removed the RED/RTX
-  // send-side workaround, i.e., when we do not support enabling RED without
-  // enabling ULPFEC.
-  virtual void SetUlpfecConfig(int red_payload_type,
-                               int ulpfec_payload_type) = 0;
-
-  // Set FEC rates, max frames before FEC is sent, and type of FEC masks.
-  // Returns false on failure.
-  virtual bool SetFecParameters(const FecProtectionParams& delta_params,
-                                const FecProtectionParams& key_params) = 0;
-
-  // Deprecated version of member function above.
-  RTC_DEPRECATED
-  int32_t SetFecParameters(const FecProtectionParams* delta_params,
-                           const FecProtectionParams* key_params);
-
-  // Set method for requestion a new key frame.
-  // Returns -1 on failure else 0.
-  virtual int32_t SetKeyFrameRequestMethod(KeyFrameRequestMethod method) = 0;
-
-  // Sends a request for a keyframe.
-  // Returns -1 on failure else 0.
-  virtual int32_t RequestKeyFrame() = 0;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_RTP_RTCP_INCLUDE_RTP_RTCP_H_
diff --git a/modules/rtp_rtcp/include/rtp_rtcp_defines.h b/modules/rtp_rtcp/include/rtp_rtcp_defines.h
deleted file mode 100644
index 8add0a6..0000000
--- a/modules/rtp_rtcp/include/rtp_rtcp_defines.h
+++ /dev/null
@@ -1,489 +0,0 @@
-/*
- *  Copyright (c) 2012 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_RTP_RTCP_INCLUDE_RTP_RTCP_DEFINES_H_
-#define WEBRTC_MODULES_RTP_RTCP_INCLUDE_RTP_RTCP_DEFINES_H_
-
-#include <stddef.h>
-#include <list>
-#include <vector>
-
-#include "webrtc/common_types.h"
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/rtc_base/deprecation.h"
-#include "webrtc/system_wrappers/include/clock.h"
-#include "webrtc/typedefs.h"
-
-#define RTCP_CNAME_SIZE 256    // RFC 3550 page 44, including null termination
-#define IP_PACKET_SIZE 1500    // we assume ethernet
-#define MAX_NUMBER_OF_PARALLEL_TELEPHONE_EVENTS 10
-
-namespace webrtc {
-namespace rtcp {
-class TransportFeedback;
-}
-
-const int kVideoPayloadTypeFrequency = 90000;
-// TODO(solenberg): RTP time stamp rate for RTCP is fixed at 8k, this is legacy
-// and should be fixed.
-// See: https://bugs.chromium.org/p/webrtc/issues/detail?id=6458
-const int kBogusRtpRateForAudioRtcp = 8000;
-
-// Minimum RTP header size in bytes.
-const uint8_t kRtpHeaderSize = 12;
-
-struct AudioPayload {
-    uint32_t    frequency;
-    size_t      channels;
-    uint32_t    rate;
-};
-
-struct VideoPayload {
-  RtpVideoCodecTypes videoCodecType;
-  // The H264 profile only matters if videoCodecType == kRtpVideoH264.
-  H264::Profile h264_profile;
-};
-
-union PayloadUnion {
-    AudioPayload Audio;
-    VideoPayload Video;
-};
-
-enum RTPAliveType { kRtpDead = 0, kRtpNoRtp = 1, kRtpAlive = 2 };
-
-enum ProtectionType {
-  kUnprotectedPacket,
-  kProtectedPacket
-};
-
-enum StorageType {
-  kDontRetransmit,
-  kAllowRetransmission
-};
-
-enum RTPExtensionType {
-  kRtpExtensionNone,
-  kRtpExtensionTransmissionTimeOffset,
-  kRtpExtensionAudioLevel,
-  kRtpExtensionAbsoluteSendTime,
-  kRtpExtensionVideoRotation,
-  kRtpExtensionTransportSequenceNumber,
-  kRtpExtensionPlayoutDelay,
-  kRtpExtensionVideoContentType,
-  kRtpExtensionVideoTiming,
-  kRtpExtensionRtpStreamId,
-  kRtpExtensionRepairedRtpStreamId,
-  kRtpExtensionMid,
-  kRtpExtensionNumberOfExtensions  // Must be the last entity in the enum.
-};
-
-enum RTCPAppSubTypes { kAppSubtypeBwe = 0x00 };
-
-// TODO(sprang): Make this an enum class once rtcp_receiver has been cleaned up.
-enum RTCPPacketType : uint32_t {
-  kRtcpReport = 0x0001,
-  kRtcpSr = 0x0002,
-  kRtcpRr = 0x0004,
-  kRtcpSdes = 0x0008,
-  kRtcpBye = 0x0010,
-  kRtcpPli = 0x0020,
-  kRtcpNack = 0x0040,
-  kRtcpFir = 0x0080,
-  kRtcpTmmbr = 0x0100,
-  kRtcpTmmbn = 0x0200,
-  kRtcpSrReq = 0x0400,
-  kRtcpXrVoipMetric = 0x0800,
-  kRtcpApp = 0x1000,
-  kRtcpRemb = 0x10000,
-  kRtcpTransmissionTimeOffset = 0x20000,
-  kRtcpXrReceiverReferenceTime = 0x40000,
-  kRtcpXrDlrrReportBlock = 0x80000,
-  kRtcpTransportFeedback = 0x100000,
-  kRtcpXrTargetBitrate = 0x200000
-};
-
-enum KeyFrameRequestMethod { kKeyFrameReqPliRtcp, kKeyFrameReqFirRtcp };
-
-enum RtpRtcpPacketType { kPacketRtp = 0, kPacketKeepAlive = 1 };
-
-// kConditionallyRetransmitHigherLayers allows retransmission of video frames
-// in higher layers if either the last frame in that layer was too far back in
-// time, or if we estimate that a new frame will be available in a lower layer
-// in a shorter time than it would take to request and receive a retransmission.
-enum RetransmissionMode : uint8_t {
-  kRetransmitOff = 0x0,
-  kRetransmitFECPackets = 0x1,
-  kRetransmitBaseLayer = 0x2,
-  kRetransmitHigherLayers = 0x4,
-  kConditionallyRetransmitHigherLayers = 0x8,
-  kRetransmitAllPackets = 0xFF
-};
-
-enum RtxMode {
-  kRtxOff                 = 0x0,
-  kRtxRetransmitted       = 0x1,  // Only send retransmissions over RTX.
-  kRtxRedundantPayloads   = 0x2   // Preventively send redundant payloads
-                                  // instead of padding.
-};
-
-const size_t kRtxHeaderSize = 2;
-
-struct RTCPReportBlock {
-  RTCPReportBlock()
-      : sender_ssrc(0),
-        source_ssrc(0),
-        fraction_lost(0),
-        packets_lost(0),
-        extended_highest_sequence_number(0),
-        jitter(0),
-        last_sender_report_timestamp(0),
-        delay_since_last_sender_report(0) {}
-
-  RTCPReportBlock(uint32_t sender_ssrc,
-                  uint32_t source_ssrc,
-                  uint8_t fraction_lost,
-                  uint32_t packets_lost,
-                  uint32_t extended_highest_sequence_number,
-                  uint32_t jitter,
-                  uint32_t last_sender_report_timestamp,
-                  uint32_t delay_since_last_sender_report)
-      : sender_ssrc(sender_ssrc),
-        source_ssrc(source_ssrc),
-        fraction_lost(fraction_lost),
-        packets_lost(packets_lost),
-        extended_highest_sequence_number(extended_highest_sequence_number),
-        jitter(jitter),
-        last_sender_report_timestamp(last_sender_report_timestamp),
-        delay_since_last_sender_report(delay_since_last_sender_report) {}
-
-  // Fields as described by RFC 3550 6.4.2.
-  union {
-    uint32_t sender_ssrc;  // SSRC of sender of this report.
-    RTC_DEPRECATED uint32_t remoteSSRC;
-  };
-  union {
-    uint32_t source_ssrc;  // SSRC of the RTP packet sender.
-    RTC_DEPRECATED uint32_t sourceSSRC;
-  };
-  union {
-    RTC_DEPRECATED uint8_t fractionLost;
-    uint8_t fraction_lost;
-  };
-  union {
-    uint32_t packets_lost;  // 24 bits valid.
-    RTC_DEPRECATED uint32_t cumulativeLost;
-  };
-  union {
-    uint32_t extended_highest_sequence_number;
-    RTC_DEPRECATED uint32_t extendedHighSeqNum;
-  };
-  uint32_t jitter;
-  union {
-    uint32_t last_sender_report_timestamp;
-    RTC_DEPRECATED uint32_t lastSR;
-  };
-  union {
-    uint32_t delay_since_last_sender_report;
-    RTC_DEPRECATED uint32_t delaySinceLastSR;
-  };
-};
-
-typedef std::list<RTCPReportBlock> ReportBlockList;
-
-struct RtpState {
-  RtpState()
-      : sequence_number(0),
-        start_timestamp(0),
-        timestamp(0),
-        capture_time_ms(-1),
-        last_timestamp_time_ms(-1),
-        media_has_been_sent(false) {}
-  uint16_t sequence_number;
-  uint32_t start_timestamp;
-  uint32_t timestamp;
-  int64_t capture_time_ms;
-  int64_t last_timestamp_time_ms;
-  bool media_has_been_sent;
-};
-
-class RtpData {
- public:
-  virtual ~RtpData() {}
-
-  virtual int32_t OnReceivedPayloadData(const uint8_t* payload_data,
-                                        size_t payload_size,
-                                        const WebRtcRTPHeader* rtp_header) = 0;
-};
-
-// Callback interface for packets recovered by FlexFEC or ULPFEC. In
-// the FlexFEC case, the implementation should be able to demultiplex
-// the recovered RTP packets based on SSRC.
-class RecoveredPacketReceiver {
- public:
-  virtual void OnRecoveredPacket(const uint8_t* packet, size_t length) = 0;
-
- protected:
-  virtual ~RecoveredPacketReceiver() = default;
-};
-
-class RtpFeedback {
- public:
-  virtual ~RtpFeedback() {}
-
-  // Receiving payload change or SSRC change. (return success!)
-  /*
-  *   channels    - number of channels in codec (1 = mono, 2 = stereo)
-  */
-  virtual int32_t OnInitializeDecoder(
-      int8_t payload_type,
-      const char payload_name[RTP_PAYLOAD_NAME_SIZE],
-      int frequency,
-      size_t channels,
-      uint32_t rate) = 0;
-
-  virtual void OnIncomingSSRCChanged(uint32_t ssrc) = 0;
-
-  virtual void OnIncomingCSRCChanged(uint32_t csrc, bool added) = 0;
-};
-
-class RtcpIntraFrameObserver {
- public:
-  virtual void OnReceivedIntraFrameRequest(uint32_t ssrc) = 0;
-
-  RTC_DEPRECATED virtual void OnReceivedSLI(uint32_t ssrc,
-                             uint8_t picture_id) {}
-
-  RTC_DEPRECATED virtual void OnReceivedRPSI(uint32_t ssrc,
-                              uint64_t picture_id) {}
-
-  virtual ~RtcpIntraFrameObserver() {}
-};
-
-class RtcpBandwidthObserver {
- public:
-  // REMB or TMMBR
-  virtual void OnReceivedEstimatedBitrate(uint32_t bitrate) = 0;
-
-  virtual void OnReceivedRtcpReceiverReport(
-      const ReportBlockList& report_blocks,
-      int64_t rtt,
-      int64_t now_ms) = 0;
-
-  virtual ~RtcpBandwidthObserver() {}
-};
-
-struct PacketFeedback {
-  PacketFeedback(int64_t arrival_time_ms, uint16_t sequence_number)
-      : PacketFeedback(-1,
-                       arrival_time_ms,
-                       -1,
-                       sequence_number,
-                       0,
-                       0,
-                       0,
-                       PacedPacketInfo()) {}
-
-  PacketFeedback(int64_t arrival_time_ms,
-                 int64_t send_time_ms,
-                 uint16_t sequence_number,
-                 size_t payload_size,
-                 const PacedPacketInfo& pacing_info)
-      : PacketFeedback(-1,
-                       arrival_time_ms,
-                       send_time_ms,
-                       sequence_number,
-                       payload_size,
-                       0,
-                       0,
-                       pacing_info) {}
-
-  PacketFeedback(int64_t creation_time_ms,
-                 uint16_t sequence_number,
-                 size_t payload_size,
-                 uint16_t local_net_id,
-                 uint16_t remote_net_id,
-                 const PacedPacketInfo& pacing_info)
-      : PacketFeedback(creation_time_ms,
-                       -1,
-                       -1,
-                       sequence_number,
-                       payload_size,
-                       local_net_id,
-                       remote_net_id,
-                       pacing_info) {}
-
-  PacketFeedback(int64_t creation_time_ms,
-                 int64_t arrival_time_ms,
-                 int64_t send_time_ms,
-                 uint16_t sequence_number,
-                 size_t payload_size,
-                 uint16_t local_net_id,
-                 uint16_t remote_net_id,
-                 const PacedPacketInfo& pacing_info)
-      : creation_time_ms(creation_time_ms),
-        arrival_time_ms(arrival_time_ms),
-        send_time_ms(send_time_ms),
-        sequence_number(sequence_number),
-        payload_size(payload_size),
-        local_net_id(local_net_id),
-        remote_net_id(remote_net_id),
-        pacing_info(pacing_info) {}
-
-  static constexpr int kNotAProbe = -1;
-  static constexpr int64_t kNotReceived = -1;
-
-  // NOTE! The variable |creation_time_ms| is not used when testing equality.
-  //       This is due to |creation_time_ms| only being used by SendTimeHistory
-  //       for book-keeping, and is of no interest outside that class.
-  // TODO(philipel): Remove |creation_time_ms| from PacketFeedback when cleaning
-  //                 up SendTimeHistory.
-  bool operator==(const PacketFeedback& rhs) const {
-    return arrival_time_ms == rhs.arrival_time_ms &&
-           send_time_ms == rhs.send_time_ms &&
-           sequence_number == rhs.sequence_number &&
-           payload_size == rhs.payload_size && pacing_info == rhs.pacing_info;
-  }
-
-  // Time corresponding to when this object was created.
-  int64_t creation_time_ms;
-  // Time corresponding to when the packet was received. Timestamped with the
-  // receiver's clock. For unreceived packet, the sentinel value kNotReceived
-  // is used.
-  int64_t arrival_time_ms;
-  // Time corresponding to when the packet was sent, timestamped with the
-  // sender's clock.
-  int64_t send_time_ms;
-  // Packet identifier, incremented with 1 for every packet generated by the
-  // sender.
-  uint16_t sequence_number;
-  // Size of the packet excluding RTP headers.
-  size_t payload_size;
-  // The network route ids that this packet is associated with.
-  uint16_t local_net_id;
-  uint16_t remote_net_id;
-  // Pacing information about this packet.
-  PacedPacketInfo pacing_info;
-};
-
-class PacketFeedbackComparator {
- public:
-  inline bool operator()(const PacketFeedback& lhs, const PacketFeedback& rhs) {
-    if (lhs.arrival_time_ms != rhs.arrival_time_ms)
-      return lhs.arrival_time_ms < rhs.arrival_time_ms;
-    if (lhs.send_time_ms != rhs.send_time_ms)
-      return lhs.send_time_ms < rhs.send_time_ms;
-    return lhs.sequence_number < rhs.sequence_number;
-  }
-};
-
-class TransportFeedbackObserver {
- public:
-  TransportFeedbackObserver() {}
-  virtual ~TransportFeedbackObserver() {}
-
-  // Note: Transport-wide sequence number as sequence number.
-  virtual void AddPacket(uint32_t ssrc,
-                         uint16_t sequence_number,
-                         size_t length,
-                         const PacedPacketInfo& pacing_info) = 0;
-
-  virtual void OnTransportFeedback(const rtcp::TransportFeedback& feedback) = 0;
-
-  virtual std::vector<PacketFeedback> GetTransportFeedbackVector() const = 0;
-};
-
-class PacketFeedbackObserver {
- public:
-  virtual ~PacketFeedbackObserver() = default;
-
-  virtual void OnPacketAdded(uint32_t ssrc, uint16_t seq_num) = 0;
-  virtual void OnPacketFeedbackVector(
-      const std::vector<PacketFeedback>& packet_feedback_vector) = 0;
-};
-
-class RtcpRttStats {
- public:
-  virtual void OnRttUpdate(int64_t rtt) = 0;
-
-  virtual int64_t LastProcessedRtt() const = 0;
-
-  virtual ~RtcpRttStats() {}
-};
-
-// Null object version of RtpFeedback.
-class NullRtpFeedback : public RtpFeedback {
- public:
-  ~NullRtpFeedback() override {}
-
-  int32_t OnInitializeDecoder(int8_t payload_type,
-                              const char payloadName[RTP_PAYLOAD_NAME_SIZE],
-                              int frequency,
-                              size_t channels,
-                              uint32_t rate) override;
-
-  void OnIncomingSSRCChanged(uint32_t ssrc) override {}
-  void OnIncomingCSRCChanged(uint32_t csrc, bool added) override {}
-};
-
-inline int32_t NullRtpFeedback::OnInitializeDecoder(
-    int8_t payload_type,
-    const char payloadName[RTP_PAYLOAD_NAME_SIZE],
-    int frequency,
-    size_t channels,
-    uint32_t rate) {
-  return 0;
-}
-
-// Statistics about packet loss for a single directional connection. All values
-// are totals since the connection initiated.
-struct RtpPacketLossStats {
-  // The number of packets lost in events where no adjacent packets were also
-  // lost.
-  uint64_t single_packet_loss_count;
-  // The number of events in which more than one adjacent packet was lost.
-  uint64_t multiple_packet_loss_event_count;
-  // The number of packets lost in events where more than one adjacent packet
-  // was lost.
-  uint64_t multiple_packet_loss_packet_count;
-};
-
-class RtpPacketSender {
- public:
-  RtpPacketSender() {}
-  virtual ~RtpPacketSender() {}
-
-  enum Priority {
-    kHighPriority = 0,    // Pass through; will be sent immediately.
-    kNormalPriority = 2,  // Put in back of the line.
-    kLowPriority = 3,     // Put in back of the low priority line.
-  };
-  // Low priority packets are mixed with the normal priority packets
-  // while we are paused.
-
-  // Returns true if we send the packet now, else it will add the packet
-  // information to the queue and call TimeToSendPacket when it's time to send.
-  virtual void InsertPacket(Priority priority,
-                            uint32_t ssrc,
-                            uint16_t sequence_number,
-                            int64_t capture_time_ms,
-                            size_t bytes,
-                            bool retransmission) = 0;
-};
-
-class TransportSequenceNumberAllocator {
- public:
-  TransportSequenceNumberAllocator() {}
-  virtual ~TransportSequenceNumberAllocator() {}
-
-  virtual uint16_t AllocateSequenceNumber() = 0;
-};
-
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_RTP_RTCP_INCLUDE_RTP_RTCP_DEFINES_H_
diff --git a/modules/rtp_rtcp/include/ulpfec_receiver.h b/modules/rtp_rtcp/include/ulpfec_receiver.h
deleted file mode 100644
index dc9adb4..0000000
--- a/modules/rtp_rtcp/include/ulpfec_receiver.h
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- *  Copyright (c) 2013 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_RTP_RTCP_INCLUDE_ULPFEC_RECEIVER_H_
-#define WEBRTC_MODULES_RTP_RTCP_INCLUDE_ULPFEC_RECEIVER_H_
-
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-struct FecPacketCounter {
-  FecPacketCounter()
-      : num_packets(0),
-        num_fec_packets(0),
-        num_recovered_packets(0),
-        first_packet_time_ms(-1) {}
-
-  size_t num_packets;            // Number of received packets.
-  size_t num_fec_packets;        // Number of received FEC packets.
-  size_t num_recovered_packets;  // Number of recovered media packets using FEC.
-  int64_t first_packet_time_ms;  // Time when first packet is received.
-};
-
-class UlpfecReceiver {
- public:
-  static UlpfecReceiver* Create(uint32_t ssrc,
-                                RecoveredPacketReceiver* callback);
-
-  virtual ~UlpfecReceiver() {}
-
-  // Takes a RED packet, strips the RED header, and adds the resulting
-  // "virtual" RTP packet(s) into the internal buffer.
-  //
-  // TODO(brandtr): Set |ulpfec_payload_type| during constructor call,
-  // rather than as a parameter here.
-  virtual int32_t AddReceivedRedPacket(const RTPHeader& rtp_header,
-                                       const uint8_t* incoming_rtp_packet,
-                                       size_t packet_length,
-                                       uint8_t ulpfec_payload_type) = 0;
-
-  // Sends the received packets to the FEC and returns all packets
-  // (both original media and recovered) through the callback.
-  virtual int32_t ProcessReceivedFec() = 0;
-
-  // Returns a counter describing the added and recovered packets.
-  virtual FecPacketCounter GetPacketCounter() const = 0;
-};
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_RTP_RTCP_INCLUDE_ULPFEC_RECEIVER_H_
diff --git a/modules/rtp_rtcp/mocks/mock_recovered_packet_receiver.h b/modules/rtp_rtcp/mocks/mock_recovered_packet_receiver.h
deleted file mode 100644
index fb8529f..0000000
--- a/modules/rtp_rtcp/mocks/mock_recovered_packet_receiver.h
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- *  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_RTP_RTCP_MOCKS_MOCK_RECOVERED_PACKET_RECEIVER_H_
-#define WEBRTC_MODULES_RTP_RTCP_MOCKS_MOCK_RECOVERED_PACKET_RECEIVER_H_
-
-#include "webrtc/modules/rtp_rtcp/include/flexfec_receiver.h"
-#include "webrtc/rtc_base/basictypes.h"
-#include "webrtc/test/gmock.h"
-
-namespace webrtc {
-
-class MockRecoveredPacketReceiver : public RecoveredPacketReceiver {
- public:
-  MOCK_METHOD2(OnRecoveredPacket, void(const uint8_t* packet, size_t length));
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_RTP_RTCP_MOCKS_MOCK_RECOVERED_PACKET_RECEIVER_H_
diff --git a/modules/rtp_rtcp/mocks/mock_rtcp_rtt_stats.h b/modules/rtp_rtcp/mocks/mock_rtcp_rtt_stats.h
deleted file mode 100644
index 5f2fae9..0000000
--- a/modules/rtp_rtcp/mocks/mock_rtcp_rtt_stats.h
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- *  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_RTP_RTCP_MOCKS_MOCK_RTCP_RTT_STATS_H_
-#define WEBRTC_MODULES_RTP_RTCP_MOCKS_MOCK_RTCP_RTT_STATS_H_
-
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
-#include "webrtc/test/gmock.h"
-
-namespace webrtc {
-
-class MockRtcpRttStats : public RtcpRttStats {
- public:
-  MOCK_METHOD1(OnRttUpdate, void(int64_t rtt));
-  MOCK_CONST_METHOD0(LastProcessedRtt, int64_t());
-};
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_RTP_RTCP_MOCKS_MOCK_RTCP_RTT_STATS_H_
diff --git a/modules/rtp_rtcp/mocks/mock_rtp_rtcp.h b/modules/rtp_rtcp/mocks/mock_rtp_rtcp.h
deleted file mode 100644
index fb0db62..0000000
--- a/modules/rtp_rtcp/mocks/mock_rtp_rtcp.h
+++ /dev/null
@@ -1,212 +0,0 @@
-/*
- *  Copyright (c) 2012 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_RTP_RTCP_MOCKS_MOCK_RTP_RTCP_H_
-#define WEBRTC_MODULES_RTP_RTCP_MOCKS_MOCK_RTP_RTCP_H_
-
-#include <set>
-#include <utility>
-#include <vector>
-
-#include "webrtc/api/optional.h"
-#include "webrtc/modules/include/module.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/transport_feedback.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/test/gmock.h"
-
-namespace webrtc {
-
-class MockRtpData : public RtpData {
- public:
-  MOCK_METHOD3(OnReceivedPayloadData,
-               int32_t(const uint8_t* payload_data,
-                       size_t payload_size,
-                       const WebRtcRTPHeader* rtp_header));
-};
-
-class MockRtpRtcp : public RtpRtcp {
- public:
-  MOCK_METHOD1(RegisterDefaultModule, int32_t(RtpRtcp* module));
-  MOCK_METHOD0(DeRegisterDefaultModule, int32_t());
-  MOCK_METHOD0(DefaultModuleRegistered, bool());
-  MOCK_METHOD0(NumberChildModules, uint32_t());
-  MOCK_METHOD1(RegisterSyncModule, int32_t(RtpRtcp* module));
-  MOCK_METHOD0(DeRegisterSyncModule, int32_t());
-  MOCK_METHOD2(IncomingRtcpPacket,
-               void(const uint8_t* incoming_packet, size_t packet_length));
-  MOCK_METHOD1(SetRemoteSSRC, void(uint32_t ssrc));
-  MOCK_METHOD4(IncomingAudioNTP,
-               int32_t(uint32_t audio_received_ntp_secs,
-                       uint32_t audio_received_ntp_frac,
-                       uint32_t audio_rtcp_arrival_time_secs,
-                       uint32_t audio_rtcp_arrival_time_frac));
-  MOCK_METHOD0(InitSender, int32_t());
-  MOCK_METHOD1(RegisterSendTransport, int32_t(Transport* outgoing_transport));
-  MOCK_METHOD1(SetMaxRtpPacketSize, void(size_t size));
-  MOCK_METHOD1(SetTransportOverhead, void(int transport_overhead_per_packet));
-  MOCK_CONST_METHOD0(MaxRtpPacketSize, size_t());
-  MOCK_METHOD1(RegisterSendPayload, int32_t(const CodecInst& voice_codec));
-  MOCK_METHOD1(RegisterSendPayload, int32_t(const VideoCodec& video_codec));
-  MOCK_METHOD2(RegisterVideoSendPayload,
-               void(int payload_type, const char* payload_name));
-  MOCK_METHOD1(DeRegisterSendPayload, int32_t(int8_t payload_type));
-  MOCK_METHOD2(RegisterSendRtpHeaderExtension,
-               int32_t(RTPExtensionType type, uint8_t id));
-  MOCK_METHOD1(DeregisterSendRtpHeaderExtension,
-               int32_t(RTPExtensionType type));
-  MOCK_CONST_METHOD0(HasBweExtensions, bool());
-  MOCK_CONST_METHOD0(StartTimestamp, uint32_t());
-  MOCK_METHOD1(SetStartTimestamp, void(uint32_t timestamp));
-  MOCK_CONST_METHOD0(SequenceNumber, uint16_t());
-  MOCK_METHOD1(SetSequenceNumber, void(uint16_t seq));
-  MOCK_METHOD1(SetRtpState, void(const RtpState& rtp_state));
-  MOCK_METHOD1(SetRtxState, void(const RtpState& rtp_state));
-  MOCK_CONST_METHOD0(GetRtpState, RtpState());
-  MOCK_CONST_METHOD0(GetRtxState, RtpState());
-  MOCK_CONST_METHOD0(SSRC, uint32_t());
-  MOCK_METHOD1(SetSSRC, void(uint32_t ssrc));
-  MOCK_CONST_METHOD1(CSRCs, int32_t(uint32_t csrcs[kRtpCsrcSize]));
-  MOCK_METHOD1(SetCsrcs, void(const std::vector<uint32_t>& csrcs));
-  MOCK_METHOD1(SetCSRCStatus, int32_t(bool include));
-  MOCK_METHOD1(SetRtxSendStatus, void(int modes));
-  MOCK_CONST_METHOD0(RtxSendStatus, int());
-  MOCK_METHOD1(SetRtxSsrc, void(uint32_t));
-  MOCK_METHOD2(SetRtxSendPayloadType, void(int, int));
-  MOCK_CONST_METHOD0(FlexfecSsrc, rtc::Optional<uint32_t>());
-  MOCK_CONST_METHOD0(RtxSendPayloadType, std::pair<int, int>());
-  MOCK_METHOD1(SetSendingStatus, int32_t(bool sending));
-  MOCK_CONST_METHOD0(Sending, bool());
-  MOCK_METHOD1(SetSendingMediaStatus, void(bool sending));
-  MOCK_CONST_METHOD0(SendingMedia, bool());
-  MOCK_CONST_METHOD4(BitrateSent,
-                     void(uint32_t* total_rate,
-                          uint32_t* video_rate,
-                          uint32_t* fec_rate,
-                          uint32_t* nack_rate));
-  MOCK_METHOD1(RegisterVideoBitrateObserver, void(BitrateStatisticsObserver*));
-  MOCK_CONST_METHOD0(GetVideoBitrateObserver, BitrateStatisticsObserver*(void));
-  MOCK_CONST_METHOD1(EstimatedReceiveBandwidth,
-                     int(uint32_t* available_bandwidth));
-  MOCK_METHOD9(SendOutgoingData,
-               bool(FrameType frame_type,
-                    int8_t payload_type,
-                    uint32_t timestamp,
-                    int64_t capture_time_ms,
-                    const uint8_t* payload_data,
-                    size_t payload_size,
-                    const RTPFragmentationHeader* fragmentation,
-                    const RTPVideoHeader* rtp_video_header,
-                    uint32_t* frame_id_out));
-  MOCK_METHOD5(TimeToSendPacket,
-               bool(uint32_t ssrc,
-                    uint16_t sequence_number,
-                    int64_t capture_time_ms,
-                    bool retransmission,
-                    const PacedPacketInfo& pacing_info));
-  MOCK_METHOD2(TimeToSendPadding,
-               size_t(size_t bytes, const PacedPacketInfo& pacing_info));
-  MOCK_METHOD2(RegisterRtcpObservers,
-               void(RtcpIntraFrameObserver* intra_frame_callback,
-                    RtcpBandwidthObserver* bandwidth_callback));
-  MOCK_CONST_METHOD0(RTCP, RtcpMode());
-  MOCK_METHOD1(SetRTCPStatus, void(RtcpMode method));
-  MOCK_METHOD1(SetCNAME, int32_t(const char cname[RTCP_CNAME_SIZE]));
-  MOCK_CONST_METHOD2(RemoteCNAME,
-                     int32_t(uint32_t remote_ssrc,
-                             char cname[RTCP_CNAME_SIZE]));
-  MOCK_CONST_METHOD5(RemoteNTP,
-                     int32_t(uint32_t* received_ntp_secs,
-                             uint32_t* received_ntp_frac,
-                             uint32_t* rtcp_arrival_time_secs,
-                             uint32_t* rtcp_arrival_time_frac,
-                             uint32_t* rtcp_timestamp));
-  MOCK_METHOD2(AddMixedCNAME,
-               int32_t(uint32_t ssrc, const char cname[RTCP_CNAME_SIZE]));
-  MOCK_METHOD1(RemoveMixedCNAME, int32_t(uint32_t ssrc));
-  MOCK_CONST_METHOD5(RTT,
-                     int32_t(uint32_t remote_ssrc,
-                             int64_t* rtt,
-                             int64_t* avg_rtt,
-                             int64_t* min_rtt,
-                             int64_t* max_rtt));
-  MOCK_METHOD1(SendRTCP, int32_t(RTCPPacketType packet_type));
-  MOCK_METHOD1(SendCompoundRTCP,
-               int32_t(const std::set<RTCPPacketType>& packet_types));
-  MOCK_CONST_METHOD2(DataCountersRTP,
-                     int32_t(size_t* bytes_sent, uint32_t* packets_sent));
-  MOCK_CONST_METHOD2(GetSendStreamDataCounters,
-                     void(StreamDataCounters*, StreamDataCounters*));
-  MOCK_CONST_METHOD3(GetRtpPacketLossStats,
-                     void(bool, uint32_t, struct RtpPacketLossStats*));
-  MOCK_CONST_METHOD1(RemoteRTCPStat,
-                     int32_t(std::vector<RTCPReportBlock>* receive_blocks));
-  MOCK_METHOD4(SetRTCPApplicationSpecificData,
-               int32_t(uint8_t sub_type,
-                       uint32_t name,
-                       const uint8_t* data,
-                       uint16_t length));
-  MOCK_METHOD1(SetRTCPVoIPMetrics, int32_t(const RTCPVoIPMetric* voip_metric));
-  MOCK_METHOD1(SetRtcpXrRrtrStatus, void(bool enable));
-  MOCK_CONST_METHOD0(RtcpXrRrtrStatus, bool());
-  MOCK_CONST_METHOD0(REMB, bool());
-  MOCK_METHOD1(SetREMBStatus, void(bool enable));
-  MOCK_METHOD2(SetREMBData,
-               void(uint32_t bitrate, const std::vector<uint32_t>& ssrcs));
-  MOCK_CONST_METHOD0(TMMBR, bool());
-  MOCK_METHOD1(SetTMMBRStatus, void(bool enable));
-  MOCK_METHOD1(OnBandwidthEstimateUpdate, void(uint16_t bandwidth_kbit));
-  MOCK_CONST_METHOD0(SelectiveRetransmissions, int());
-  MOCK_METHOD1(SetSelectiveRetransmissions, int(uint8_t settings));
-  MOCK_METHOD2(SendNACK, int32_t(const uint16_t* nack_list, uint16_t size));
-  MOCK_METHOD1(SendNack, void(const std::vector<uint16_t>& sequence_numbers));
-  MOCK_METHOD2(SetStorePacketsStatus,
-               void(bool enable, uint16_t number_to_store));
-  MOCK_CONST_METHOD0(StorePackets, bool());
-  MOCK_METHOD1(RegisterRtcpStatisticsCallback, void(RtcpStatisticsCallback*));
-  MOCK_METHOD0(GetRtcpStatisticsCallback, RtcpStatisticsCallback*());
-  MOCK_METHOD1(SendFeedbackPacket, bool(const rtcp::TransportFeedback& packet));
-  MOCK_METHOD3(SendTelephoneEventOutband,
-               int32_t(uint8_t key, uint16_t time_ms, uint8_t level));
-  MOCK_METHOD1(SetSendREDPayloadType, int32_t(int8_t payload_type));
-  MOCK_CONST_METHOD1(SendREDPayloadType, int32_t(int8_t* payload_type));
-  MOCK_METHOD2(SetRTPAudioLevelIndicationStatus,
-               int32_t(bool enable, uint8_t id));
-  MOCK_METHOD1(SetAudioLevel, int32_t(uint8_t level_dbov));
-  MOCK_METHOD1(SetTargetSendBitrate, void(uint32_t bitrate_bps));
-  MOCK_METHOD2(SetUlpfecConfig,
-               void(int red_payload_type, int fec_payload_type));
-  MOCK_METHOD2(SetFecParameters,
-               bool(const FecProtectionParams& delta_params,
-                    const FecProtectionParams& key_params));
-  MOCK_METHOD1(SetKeyFrameRequestMethod, int32_t(KeyFrameRequestMethod method));
-  MOCK_METHOD0(RequestKeyFrame, int32_t());
-  MOCK_METHOD0(Process, void());
-  MOCK_METHOD1(RegisterSendFrameCountObserver, void(FrameCountObserver*));
-  MOCK_CONST_METHOD0(GetSendFrameCountObserver, FrameCountObserver*(void));
-  MOCK_METHOD1(RegisterSendChannelRtpStatisticsCallback,
-               void(StreamDataCountersCallback*));
-  MOCK_CONST_METHOD0(GetSendChannelRtpStatisticsCallback,
-                     StreamDataCountersCallback*(void));
-  MOCK_METHOD1(SetVideoBitrateAllocation, void(const BitrateAllocation&));
-  // Members.
-  unsigned int remote_ssrc_;
-
- private:
-  // Mocking this method is currently not required and having a default
-  // implementation like MOCK_METHOD0(TimeUntilNextProcess, int64_t())
-  // can be dangerous since it can cause a tight loop on a process thread.
-  virtual int64_t TimeUntilNextProcess() { return 0xffffffff; }
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_RTP_RTCP_MOCKS_MOCK_RTP_RTCP_H_
diff --git a/modules/rtp_rtcp/source/byte_io.h b/modules/rtp_rtcp/source/byte_io.h
deleted file mode 100644
index 1724bb0..0000000
--- a/modules/rtp_rtcp/source/byte_io.h
+++ /dev/null
@@ -1,408 +0,0 @@
-/*
- *  Copyright (c) 2013 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_RTP_RTCP_SOURCE_BYTE_IO_H_
-#define WEBRTC_MODULES_RTP_RTCP_SOURCE_BYTE_IO_H_
-
-
-// This file contains classes for reading and writing integer types from/to
-// byte array representations. Signed/unsigned, partial (whole byte) sizes,
-// and big/little endian byte order is all supported.
-//
-// Usage examples:
-//
-// uint8_t* buffer = ...;
-//
-// // Read an unsigned 4 byte integer in big endian format
-// uint32_t val = ByteReader<uint32_t>::ReadBigEndian(buffer);
-//
-// // Read a signed 24-bit (3 byte) integer in little endian format
-// int32_t val = ByteReader<int32_t, 3>::ReadLittle(buffer);
-//
-// // Write an unsigned 8 byte integer in little endian format
-// ByteWriter<uint64_t>::WriteLittleEndian(buffer, val);
-//
-// Write an unsigned 40-bit (5 byte) integer in big endian format
-// ByteWriter<uint64_t, 5>::WriteBigEndian(buffer, val);
-//
-// These classes are implemented as recursive templetizations, inteded to make
-// it easy for the compiler to completely inline the reading/writing.
-
-
-#include <limits>
-
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-// According to ISO C standard ISO/IEC 9899, section 6.2.6.2 (2), the three
-// representations of signed integers allowed are two's complement, one's
-// complement and sign/magnitude. We can detect which is used by looking at
-// the two last bits of -1, which will be 11 in two's complement, 10 in one's
-// complement and 01 in sign/magnitude.
-// TODO(sprang): In the unlikely event that we actually need to support a
-// platform that doesn't use two's complement, implement conversion to/from
-// wire format.
-
-// Assume the if any one signed integer type is two's complement, then all
-// other will be too.
-static_assert(
-    (-1 & 0x03) == 0x03,
-    "Only two's complement representation of signed integers supported.");
-
-// Plain const char* won't work for static_assert, use #define instead.
-#define kSizeErrorMsg "Byte size must be less than or equal to data type size."
-
-// Utility class for getting the unsigned equivalent of a signed type.
-template <typename T>
-struct UnsignedOf;
-
-// Class for reading integers from a sequence of bytes.
-// T = type of integer, B = bytes to read, is_signed = true if signed integer.
-// If is_signed is true and B < sizeof(T), sign extension might be needed.
-template <typename T,
-          unsigned int B = sizeof(T),
-          bool is_signed = std::numeric_limits<T>::is_signed>
-class ByteReader;
-
-// Specialization of ByteReader for unsigned types.
-template <typename T, unsigned int B>
-class ByteReader<T, B, false> {
- public:
-  static T ReadBigEndian(const uint8_t* data) {
-    static_assert(B <= sizeof(T), kSizeErrorMsg);
-    return InternalReadBigEndian(data);
-  }
-
-  static T ReadLittleEndian(const uint8_t* data) {
-    static_assert(B <= sizeof(T), kSizeErrorMsg);
-    return InternalReadLittleEndian(data);
-  }
-
- private:
-  static T InternalReadBigEndian(const uint8_t* data) {
-    T val(0);
-    for (unsigned int i = 0; i < B; ++i)
-      val |= static_cast<T>(data[i]) << ((B - 1 - i) * 8);
-    return val;
-  }
-
-  static T InternalReadLittleEndian(const uint8_t* data) {
-    T val(0);
-    for (unsigned int i = 0; i < B; ++i)
-      val |= static_cast<T>(data[i]) << (i * 8);
-    return val;
-  }
-};
-
-// Specialization of ByteReader for signed types.
-template <typename T, unsigned int B>
-class ByteReader<T, B, true> {
- public:
-  typedef typename UnsignedOf<T>::Type U;
-
-  static T ReadBigEndian(const uint8_t* data) {
-    U unsigned_val = ByteReader<T, B, false>::ReadBigEndian(data);
-    if (B < sizeof(T))
-      unsigned_val = SignExtend(unsigned_val);
-    return ReinterpretAsSigned(unsigned_val);
-  }
-
-  static T ReadLittleEndian(const uint8_t* data) {
-    U unsigned_val = ByteReader<T, B, false>::ReadLittleEndian(data);
-    if (B < sizeof(T))
-      unsigned_val = SignExtend(unsigned_val);
-    return ReinterpretAsSigned(unsigned_val);
-  }
-
- private:
-  // As a hack to avoid implementation-specific or undefined behavior when
-  // bit-shifting or casting signed integers, read as a signed equivalent
-  // instead and convert to signed. This is safe since we have asserted that
-  // two's complement for is used.
-  static T ReinterpretAsSigned(U unsigned_val) {
-    // An unsigned value with only the highest order bit set (ex 0x80).
-    const U kUnsignedHighestBitMask =
-        static_cast<U>(1) << ((sizeof(U) * 8) - 1);
-    // A signed value with only the highest bit set. Since this is two's
-    // complement form, we can use the min value from std::numeric_limits.
-    const T kSignedHighestBitMask = std::numeric_limits<T>::min();
-
-    T val;
-    if ((unsigned_val & kUnsignedHighestBitMask) != 0) {
-      // Casting is only safe when unsigned value can be represented in the
-      // signed target type, so mask out highest bit and mask it back manually.
-      val = static_cast<T>(unsigned_val & ~kUnsignedHighestBitMask);
-      val |= kSignedHighestBitMask;
-    } else {
-      val = static_cast<T>(unsigned_val);
-    }
-    return val;
-  }
-
-  // If number of bytes is less than native data type (eg 24 bit, in int32_t),
-  // and the most significant bit of the actual data is set, we must sign
-  // extend the remaining byte(s) with ones so that the correct negative
-  // number is retained.
-  // Ex: 0x810A0B -> 0xFF810A0B, but 0x710A0B -> 0x00710A0B
-  static U SignExtend(const U val) {
-    const uint8_t kMsb = static_cast<uint8_t>(val >> ((B - 1) * 8));
-    if ((kMsb & 0x80) != 0) {
-      // Create a mask where all bits used by the B bytes are set to one,
-      // for instance 0x00FFFFFF for B = 3. Bit-wise invert that mask (to
-      // (0xFF000000 in the example above) and add it to the input value.
-      // The "B % sizeof(T)" is a workaround to undefined values warnings for
-      // B == sizeof(T), in which case this code won't be called anyway.
-      const U kUsedBitsMask = (1 << ((B % sizeof(T)) * 8)) - 1;
-      return ~kUsedBitsMask | val;
-    }
-    return val;
-  }
-};
-
-// Class for writing integers to a sequence of bytes
-// T = type of integer, B = bytes to write
-template <typename T,
-          unsigned int B = sizeof(T),
-          bool is_signed = std::numeric_limits<T>::is_signed>
-class ByteWriter;
-
-// Specialization of ByteWriter for unsigned types.
-template <typename T, unsigned int B>
-class ByteWriter<T, B, false> {
- public:
-  static void WriteBigEndian(uint8_t* data, T val) {
-    static_assert(B <= sizeof(T), kSizeErrorMsg);
-    for (unsigned int i = 0; i < B; ++i) {
-      data[i] = val >> ((B - 1 - i) * 8);
-    }
-  }
-
-  static void WriteLittleEndian(uint8_t* data, T val) {
-    static_assert(B <= sizeof(T), kSizeErrorMsg);
-    for (unsigned int i = 0; i < B; ++i) {
-      data[i] = val >> (i * 8);
-    }
-  }
-};
-
-// Specialization of ByteWriter for signed types.
-template <typename T, unsigned int B>
-class ByteWriter<T, B, true> {
- public:
-  typedef typename UnsignedOf<T>::Type U;
-
-  static void WriteBigEndian(uint8_t* data, T val) {
-    ByteWriter<U, B, false>::WriteBigEndian(data, ReinterpretAsUnsigned(val));
-  }
-
-  static void WriteLittleEndian(uint8_t* data, T val) {
-    ByteWriter<U, B, false>::WriteLittleEndian(data,
-                                               ReinterpretAsUnsigned(val));
-  }
-
- private:
-  static U ReinterpretAsUnsigned(T val) {
-    // According to ISO C standard ISO/IEC 9899, section 6.3.1.3 (1, 2) a
-    // conversion from signed to unsigned keeps the value if the new type can
-    // represent it, and otherwise adds one more than the max value of T until
-    // the value is in range. For two's complement, this fortunately means
-    // that the bit-wise value will be intact. Thus, since we have asserted that
-    // two's complement form is actually used, a simple cast is sufficient.
-    return static_cast<U>(val);
-  }
-};
-
-// ----- Below follows specializations of UnsignedOf utility class -----
-
-template <>
-struct UnsignedOf<int8_t> {
-  typedef uint8_t Type;
-};
-template <>
-struct UnsignedOf<int16_t> {
-  typedef uint16_t Type;
-};
-template <>
-struct UnsignedOf<int32_t> {
-  typedef uint32_t Type;
-};
-template <>
-struct UnsignedOf<int64_t> {
-  typedef uint64_t Type;
-};
-
-// ----- Below follows specializations for unsigned, B in { 1, 2, 4, 8 } -----
-
-// TODO(sprang): Check if these actually help or if generic cases will be
-// unrolled to and optimized to similar performance.
-
-// Specializations for single bytes
-template <typename T>
-class ByteReader<T, 1, false> {
- public:
-  static T ReadBigEndian(const uint8_t* data) {
-    static_assert(sizeof(T) == 1, kSizeErrorMsg);
-    return data[0];
-  }
-
-  static T ReadLittleEndian(const uint8_t* data) {
-    static_assert(sizeof(T) == 1, kSizeErrorMsg);
-    return data[0];
-  }
-};
-
-template <typename T>
-class ByteWriter<T, 1, false> {
- public:
-  static void WriteBigEndian(uint8_t* data, T val) {
-    static_assert(sizeof(T) == 1, kSizeErrorMsg);
-    data[0] = val;
-  }
-
-  static void WriteLittleEndian(uint8_t* data, T val) {
-    static_assert(sizeof(T) == 1, kSizeErrorMsg);
-    data[0] = val;
-  }
-};
-
-// Specializations for two byte words
-template <typename T>
-class ByteReader<T, 2, false> {
- public:
-  static T ReadBigEndian(const uint8_t* data) {
-    static_assert(sizeof(T) >= 2, kSizeErrorMsg);
-    return (data[0] << 8) | data[1];
-  }
-
-  static T ReadLittleEndian(const uint8_t* data) {
-    static_assert(sizeof(T) >= 2, kSizeErrorMsg);
-    return data[0] | (data[1] << 8);
-  }
-};
-
-template <typename T>
-class ByteWriter<T, 2, false> {
- public:
-  static void WriteBigEndian(uint8_t* data, T val) {
-    static_assert(sizeof(T) >= 2, kSizeErrorMsg);
-    data[0] = val >> 8;
-    data[1] = val;
-  }
-
-  static void WriteLittleEndian(uint8_t* data, T val) {
-    static_assert(sizeof(T) >= 2, kSizeErrorMsg);
-    data[0] = val;
-    data[1] = val >> 8;
-  }
-};
-
-// Specializations for four byte words.
-template <typename T>
-class ByteReader<T, 4, false> {
- public:
-  static T ReadBigEndian(const uint8_t* data) {
-    static_assert(sizeof(T) >= 4, kSizeErrorMsg);
-    return (Get(data, 0) << 24) | (Get(data, 1) << 16) | (Get(data, 2) << 8) |
-           Get(data, 3);
-  }
-
-  static T ReadLittleEndian(const uint8_t* data) {
-    static_assert(sizeof(T) >= 4, kSizeErrorMsg);
-    return Get(data, 0) | (Get(data, 1) << 8) | (Get(data, 2) << 16) |
-           (Get(data, 3) << 24);
-  }
-
- private:
-  inline static T Get(const uint8_t* data, unsigned int index) {
-    return static_cast<T>(data[index]);
-  }
-};
-
-// Specializations for four byte words.
-template <typename T>
-class ByteWriter<T, 4, false> {
- public:
-  static void WriteBigEndian(uint8_t* data, T val) {
-    static_assert(sizeof(T) >= 4, kSizeErrorMsg);
-    data[0] = val >> 24;
-    data[1] = val >> 16;
-    data[2] = val >> 8;
-    data[3] = val;
-  }
-
-  static void WriteLittleEndian(uint8_t* data, T val) {
-    static_assert(sizeof(T) >= 4, kSizeErrorMsg);
-    data[0] = val;
-    data[1] = val >> 8;
-    data[2] = val >> 16;
-    data[3] = val >> 24;
-  }
-};
-
-// Specializations for eight byte words.
-template <typename T>
-class ByteReader<T, 8, false> {
- public:
-  static T ReadBigEndian(const uint8_t* data) {
-    static_assert(sizeof(T) >= 8, kSizeErrorMsg);
-    return
-        (Get(data, 0) << 56) | (Get(data, 1) << 48) |
-        (Get(data, 2) << 40) | (Get(data, 3) << 32) |
-        (Get(data, 4) << 24) | (Get(data, 5) << 16) |
-        (Get(data, 6) << 8)  |  Get(data, 7);
-  }
-
-  static T ReadLittleEndian(const uint8_t* data) {
-    static_assert(sizeof(T) >= 8, kSizeErrorMsg);
-    return
-         Get(data, 0)        | (Get(data, 1) << 8)  |
-        (Get(data, 2) << 16) | (Get(data, 3) << 24) |
-        (Get(data, 4) << 32) | (Get(data, 5) << 40) |
-        (Get(data, 6) << 48) | (Get(data, 7) << 56);
-  }
-
- private:
-  inline static T Get(const uint8_t* data, unsigned int index) {
-    return static_cast<T>(data[index]);
-  }
-};
-
-template <typename T>
-class ByteWriter<T, 8, false> {
- public:
-  static void WriteBigEndian(uint8_t* data, T val) {
-    static_assert(sizeof(T) >= 8, kSizeErrorMsg);
-    data[0] = val >> 56;
-    data[1] = val >> 48;
-    data[2] = val >> 40;
-    data[3] = val >> 32;
-    data[4] = val >> 24;
-    data[5] = val >> 16;
-    data[6] = val >> 8;
-    data[7] = val;
-  }
-
-  static void WriteLittleEndian(uint8_t* data, T val) {
-    static_assert(sizeof(T) >= 8, kSizeErrorMsg);
-    data[0] = val;
-    data[1] = val >> 8;
-    data[2] = val >> 16;
-    data[3] = val >> 24;
-    data[4] = val >> 32;
-    data[5] = val >> 40;
-    data[6] = val >> 48;
-    data[7] = val >> 56;
-  }
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_RTP_RTCP_SOURCE_BYTE_IO_H_
diff --git a/modules/rtp_rtcp/source/byte_io_unittest.cc b/modules/rtp_rtcp/source/byte_io_unittest.cc
deleted file mode 100644
index addf334..0000000
--- a/modules/rtp_rtcp/source/byte_io_unittest.cc
+++ /dev/null
@@ -1,272 +0,0 @@
-/*
- *  Copyright (c) 2012 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 <limits>
-
-#include "webrtc/modules/rtp_rtcp/source/byte_io.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-namespace {
-
-class ByteIoTest : public ::testing::Test {
- protected:
-  ByteIoTest() {}
-  virtual ~ByteIoTest() {}
-
-  enum { kAlignments = sizeof(uint64_t) - 1 };
-
-  // Method to create a test value that is not the same when byte reversed.
-  template <typename T>
-  T CreateTestValue(bool negative, uint8_t num_bytes) {
-    // Examples of output:
-    // T = int32_t, negative = false, num_bytes = 4: 0x00010203
-    // T = int32_t, negative = true, num_bytes = 4: 0xFFFEFDFC
-    // T = int32_t, negative = false, num_bytes = 3: 0x000102
-    // * T = int32_t, negative = true, num_bytes = 3: 0xFFFEFD
-
-    T val = 0;
-    for (uint8_t i = 0; i != num_bytes; ++i) {
-      val = (val << 8) + (negative ? (0xFF - i) : (i + 1));
-    }
-
-    // This loop will create a sign extend mask if num_bytes if necessary.
-    // For the last example (marked * above), the number needs to be sign
-    // extended to be a valid int32_t. The sign extend mask is 0xFF000000.
-    // Comments for each step with this example below.
-    if (std::numeric_limits<T>::is_signed && negative &&
-        num_bytes < sizeof(T)) {
-      // Start with mask = 0xFFFFFFFF.
-      T mask = static_cast<T>(-1);
-      // Create a temporary for the lowest byte (0x000000FF).
-      const T neg_byte = static_cast<T>(0xFF);
-      for (int i = 0; i < num_bytes; ++i) {
-        // And the inverse of the temporary and the mask:
-        // 0xFFFFFFFF & 0xFFFFFF00 = 0xFFFFFF00.
-        // 0xFFFFFF00 & 0xFFFF00FF = 0xFFFF0000.
-        // 0xFFFF0000 & 0xFF00FFFF = 0xFF000000.
-        mask &= ~(neg_byte << (i * 8));
-      }
-      // Add the sign extension mask to the actual value.
-      val |= mask;
-    }
-    return val;
-  }
-
-  // Populate byte buffer with value, in big endian format.
-  template <typename T>
-  void PopulateTestData(uint8_t* data, T value, int num_bytes, bool bigendian) {
-    if (bigendian) {
-      for (int i = 0; i < num_bytes; ++i) {
-        data[i] = (value >> ((num_bytes - i - 1) * 8)) & 0xFF;
-      }
-    } else {
-      for (int i = 0; i < num_bytes; ++i) {
-        data[i] = (value >> (i * 8)) & 0xFF;
-      }
-    }
-  }
-
-  // Test reading big endian numbers.
-  // Template arguments: Type T, read method RM(buffer), B bytes of data.
-  template <typename T, T (*RM)(const uint8_t*), int B>
-  void TestRead(bool big_endian) {
-    // Test both for values that are positive and negative (if signed)
-    for (int neg = 0; neg < 2; ++neg) {
-      bool negative = neg > 0;
-
-      // Write test value to byte buffer, in big endian format.
-      T test_value = CreateTestValue<T>(negative, B);
-      uint8_t bytes[B + kAlignments];
-
-      // Make one test for each alignment.
-      for (int i = 0; i < kAlignments; ++i) {
-        PopulateTestData(bytes + i, test_value, B, big_endian);
-
-        // Check that test value is retrieved from buffer when used read method.
-        EXPECT_EQ(test_value, RM(bytes + i));
-      }
-    }
-  }
-
-  // Test writing big endian numbers.
-  // Template arguments: Type T, write method WM(buffer, value), B bytes of data
-  template <typename T, void (*WM)(uint8_t*, T), int B>
-  void TestWrite(bool big_endian) {
-    // Test both for values that are positive and negative (if signed).
-    for (int neg = 0; neg < 2; ++neg) {
-      bool negative = neg > 0;
-
-      // Write test value to byte buffer, in big endian format.
-      T test_value = CreateTestValue<T>(negative, B);
-      uint8_t expected_bytes[B + kAlignments];
-      uint8_t bytes[B + kAlignments];
-
-      // Make one test for each alignment.
-      for (int i = 0; i < kAlignments; ++i) {
-        PopulateTestData(expected_bytes + i, test_value, B, big_endian);
-
-        // Zero initialize buffer and let WM populate it.
-        memset(bytes, 0, B + kAlignments);
-        WM(bytes + i, test_value);
-
-        // Check that data produced by WM is big endian as expected.
-        for (int j = 0; j < B; ++j) {
-          EXPECT_EQ(expected_bytes[i + j], bytes[i + j]);
-        }
-      }
-    }
-  }
-};
-
-TEST_F(ByteIoTest, Test16UBitBigEndian) {
-  TestRead<uint16_t, ByteReader<uint16_t>::ReadBigEndian,
-      sizeof(uint16_t)>(true);
-  TestWrite<uint16_t, ByteWriter<uint16_t>::WriteBigEndian,
-    sizeof(uint16_t)>(true);
-}
-
-TEST_F(ByteIoTest, Test24UBitBigEndian) {
-  TestRead<uint32_t, ByteReader<uint32_t, 3>::ReadBigEndian, 3>(true);
-  TestWrite<uint32_t, ByteWriter<uint32_t, 3>::WriteBigEndian, 3>(true);
-}
-
-TEST_F(ByteIoTest, Test32UBitBigEndian) {
-  TestRead<uint32_t, ByteReader<uint32_t>::ReadBigEndian,
-      sizeof(uint32_t)>(true);
-  TestWrite<uint32_t, ByteWriter<uint32_t>::WriteBigEndian,
-      sizeof(uint32_t)>(true);
-}
-
-TEST_F(ByteIoTest, Test64UBitBigEndian) {
-  TestRead<uint64_t, ByteReader<uint64_t>::ReadBigEndian,
-      sizeof(uint64_t)>(true);
-  TestWrite<uint64_t, ByteWriter<uint64_t>::WriteBigEndian,
-      sizeof(uint64_t)>(true);
-}
-
-TEST_F(ByteIoTest, Test16SBitBigEndian) {
-  TestRead<int16_t, ByteReader<int16_t>::ReadBigEndian,
-      sizeof(int16_t)>(true);
-  TestWrite<int16_t, ByteWriter<int16_t>::WriteBigEndian,
-      sizeof(int16_t)>(true);
-}
-
-TEST_F(ByteIoTest, Test24SBitBigEndian) {
-  TestRead<int32_t, ByteReader<int32_t, 3>::ReadBigEndian, 3>(true);
-  TestWrite<int32_t, ByteWriter<int32_t, 3>::WriteBigEndian, 3>(true);
-}
-
-TEST_F(ByteIoTest, Test32SBitBigEndian) {
-  TestRead<int32_t, ByteReader<int32_t>::ReadBigEndian,
-      sizeof(int32_t)>(true);
-  TestWrite<int32_t, ByteWriter<int32_t>::WriteBigEndian,
-      sizeof(int32_t)>(true);
-}
-
-TEST_F(ByteIoTest, Test64SBitBigEndian) {
-  TestRead<int64_t, ByteReader<int64_t>::ReadBigEndian,
-      sizeof(int64_t)>(true);
-  TestWrite<int64_t, ByteWriter<int64_t>::WriteBigEndian,
-      sizeof(int64_t)>(true);
-}
-
-TEST_F(ByteIoTest, Test16UBitLittleEndian) {
-  TestRead<uint16_t, ByteReader<uint16_t>::ReadLittleEndian,
-      sizeof(uint16_t)>(false);
-  TestWrite<uint16_t, ByteWriter<uint16_t>::WriteLittleEndian,
-      sizeof(uint16_t)>(false);
-}
-
-TEST_F(ByteIoTest, Test24UBitLittleEndian) {
-  TestRead<uint32_t, ByteReader<uint32_t, 3>::ReadLittleEndian, 3>(false);
-  TestWrite<uint32_t, ByteWriter<uint32_t, 3>::WriteLittleEndian, 3>(false);
-}
-
-TEST_F(ByteIoTest, Test32UBitLittleEndian) {
-  TestRead<uint32_t, ByteReader<uint32_t>::ReadLittleEndian,
-      sizeof(uint32_t)>(false);
-  TestWrite<uint32_t, ByteWriter<uint32_t>::WriteLittleEndian,
-      sizeof(uint32_t)>(false);
-}
-
-TEST_F(ByteIoTest, Test64UBitLittleEndian) {
-  TestRead<uint64_t, ByteReader<uint64_t>::ReadLittleEndian,
-      sizeof(uint64_t)>(false);
-  TestWrite<uint64_t, ByteWriter<uint64_t>::WriteLittleEndian,
-      sizeof(uint64_t)>(false);
-}
-
-TEST_F(ByteIoTest, Test16SBitLittleEndian) {
-  TestRead<int16_t, ByteReader<int16_t>::ReadLittleEndian,
-      sizeof(int16_t)>(false);
-  TestWrite<int16_t, ByteWriter<int16_t>::WriteLittleEndian,
-      sizeof(int16_t)>(false);
-}
-
-TEST_F(ByteIoTest, Test24SBitLittleEndian) {
-  TestRead<int32_t, ByteReader<int32_t, 3>::ReadLittleEndian, 3>(false);
-  TestWrite<int32_t, ByteWriter<int32_t, 3>::WriteLittleEndian, 3>(false);
-}
-
-TEST_F(ByteIoTest, Test32SBitLittleEndian) {
-  TestRead<int32_t, ByteReader<int32_t>::ReadLittleEndian,
-      sizeof(int32_t)>(false);
-  TestWrite<int32_t, ByteWriter<int32_t>::WriteLittleEndian,
-      sizeof(int32_t)>(false);
-}
-
-TEST_F(ByteIoTest, Test64SBitLittleEndian) {
-  TestRead<int64_t, ByteReader<int64_t>::ReadLittleEndian,
-      sizeof(int64_t)>(false);
-  TestWrite<int64_t, ByteWriter<int64_t>::WriteLittleEndian,
-      sizeof(int64_t)>(false);
-}
-
-// Sets up a fixed byte array and converts N bytes from the array into a
-// uint64_t. Verifies the value with hard-coded reference.
-TEST(ByteIo, SanityCheckFixedByteArrayUnsignedReadBigEndian) {
-  uint8_t data[8] = {0xFF, 0xEE, 0xDD, 0xCC, 0xBB, 0xAA, 0x99, 0x88};
-  uint64_t value = ByteReader<uint64_t, 2>::ReadBigEndian(data);
-  EXPECT_EQ(static_cast<uint64_t>(0xFFEE), value);
-  value = ByteReader<uint64_t, 3>::ReadBigEndian(data);
-  EXPECT_EQ(static_cast<uint64_t>(0xFFEEDD), value);
-  value = ByteReader<uint64_t, 4>::ReadBigEndian(data);
-  EXPECT_EQ(static_cast<uint64_t>(0xFFEEDDCC), value);
-  value = ByteReader<uint64_t, 5>::ReadBigEndian(data);
-  EXPECT_EQ(static_cast<uint64_t>(0xFFEEDDCCBB), value);
-  value = ByteReader<uint64_t, 6>::ReadBigEndian(data);
-  EXPECT_EQ(static_cast<uint64_t>(0xFFEEDDCCBBAA), value);
-  value = ByteReader<uint64_t, 7>::ReadBigEndian(data);
-  EXPECT_EQ(static_cast<uint64_t>(0xFFEEDDCCBBAA99), value);
-  value = ByteReader<uint64_t, 8>::ReadBigEndian(data);
-  EXPECT_EQ(static_cast<uint64_t>(0xFFEEDDCCBBAA9988), value);
-}
-
-// Same as above, but for little-endian reading.
-TEST(ByteIo, SanityCheckFixedByteArrayUnsignedReadLittleEndian) {
-  uint8_t data[8] = {0xFF, 0xEE, 0xDD, 0xCC, 0xBB, 0xAA, 0x99, 0x88};
-  uint64_t value = ByteReader<uint64_t, 2>::ReadLittleEndian(data);
-  EXPECT_EQ(static_cast<uint64_t>(0xEEFF), value);
-  value = ByteReader<uint64_t, 3>::ReadLittleEndian(data);
-  EXPECT_EQ(static_cast<uint64_t>(0xDDEEFF), value);
-  value = ByteReader<uint64_t, 4>::ReadLittleEndian(data);
-  EXPECT_EQ(static_cast<uint64_t>(0xCCDDEEFF), value);
-  value = ByteReader<uint64_t, 5>::ReadLittleEndian(data);
-  EXPECT_EQ(static_cast<uint64_t>(0xBBCCDDEEFF), value);
-  value = ByteReader<uint64_t, 6>::ReadLittleEndian(data);
-  EXPECT_EQ(static_cast<uint64_t>(0xAABBCCDDEEFF), value);
-  value = ByteReader<uint64_t, 7>::ReadLittleEndian(data);
-  EXPECT_EQ(static_cast<uint64_t>(0x99AABBCCDDEEFF), value);
-  value = ByteReader<uint64_t, 8>::ReadLittleEndian(data);
-  EXPECT_EQ(static_cast<uint64_t>(0x8899AABBCCDDEEFF), value);
-}
-}  // namespace
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/dtmf_queue.cc b/modules/rtp_rtcp/source/dtmf_queue.cc
deleted file mode 100644
index 7b1c61b..0000000
--- a/modules/rtp_rtcp/source/dtmf_queue.cc
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- *  Copyright (c) 2011 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/rtp_rtcp/source/dtmf_queue.h"
-
-namespace {
-constexpr size_t kDtmfOutbandMax = 20;
-}
-
-namespace webrtc {
-DtmfQueue::DtmfQueue() {}
-
-DtmfQueue::~DtmfQueue() {}
-
-bool DtmfQueue::AddDtmf(const Event& event) {
-  rtc::CritScope lock(&dtmf_critsect_);
-  if (queue_.size() >= kDtmfOutbandMax) {
-    return false;
-  }
-  queue_.push_back(event);
-  return true;
-}
-
-bool DtmfQueue::NextDtmf(Event* event) {
-  RTC_DCHECK(event);
-  rtc::CritScope lock(&dtmf_critsect_);
-  if (queue_.empty()) {
-    return false;
-  }
-
-  *event = queue_.front();
-  queue_.pop_front();
-  return true;
-}
-
-bool DtmfQueue::PendingDtmf() const {
-  rtc::CritScope lock(&dtmf_critsect_);
-  return !queue_.empty();
-}
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/dtmf_queue.h b/modules/rtp_rtcp/source/dtmf_queue.h
deleted file mode 100644
index 9a8c2e7..0000000
--- a/modules/rtp_rtcp/source/dtmf_queue.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- *  Copyright (c) 2011 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_RTP_RTCP_SOURCE_DTMF_QUEUE_H_
-#define WEBRTC_MODULES_RTP_RTCP_SOURCE_DTMF_QUEUE_H_
-
-#include <list>
-
-#include "webrtc/rtc_base/criticalsection.h"
-
-namespace webrtc {
-class DtmfQueue {
- public:
-  struct Event {
-    uint16_t duration_ms = 0;
-    uint8_t payload_type = 0;
-    uint8_t key = 0;
-    uint8_t level = 0;
-  };
-
-  DtmfQueue();
-  ~DtmfQueue();
-
-  bool AddDtmf(const Event& event);
-  bool NextDtmf(Event* event);
-  bool PendingDtmf() const;
-
- private:
-  rtc::CriticalSection dtmf_critsect_;
-  std::list<Event> queue_;
-};
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_RTP_RTCP_SOURCE_DTMF_QUEUE_H_
diff --git a/modules/rtp_rtcp/source/fec_private_tables_bursty.h b/modules/rtp_rtcp/source/fec_private_tables_bursty.h
deleted file mode 100644
index 1fce36a..0000000
--- a/modules/rtp_rtcp/source/fec_private_tables_bursty.h
+++ /dev/null
@@ -1,762 +0,0 @@
-/*
- *  Copyright (c) 2012 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_RTP_RTCP_SOURCE_FEC_PRIVATE_TABLES_BURSTY_H_
-#define WEBRTC_MODULES_RTP_RTCP_SOURCE_FEC_PRIVATE_TABLES_BURSTY_H_
-
-// This file contains a set of packets masks for the FEC code. The masks in
-// this table are specifically designed to favor recovery of bursty/consecutive
-// loss network conditions. The tradeoff is worse recovery for random losses.
-// These packet masks are currently defined to protect up to 12 media packets.
-// They have the following property: for any packet mask defined by the
-// parameters (k,m), where k = number of media packets, m = number of FEC
-// packets, all "consecutive" losses of size <= m are completely recoverable.
-// By consecutive losses we mean consecutive with respect to the sequence
-// number ordering of the list (media and FEC) of packets. The difference
-// between these masks (|kFecMaskBursty|) and |kFecMaskRandom| type, defined
-// in fec_private_tables.h, is more significant for longer codes
-// (i.e., more packets/symbols in the code, so larger (k,m), i.e.,  k > 4,
-// m > 3).
-
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-namespace fec_private_tables {
-
-const uint8_t kMaskBursty1_1[2] = {
-  0x80, 0x00
-};
-
-const uint8_t kMaskBursty2_1[2] = {
-  0xc0, 0x00
-};
-
-const uint8_t kMaskBursty2_2[4] = {
-  0x80, 0x00,
-  0xc0, 0x00
-};
-
-const uint8_t kMaskBursty3_1[2] = {
-  0xe0, 0x00
-};
-
-const uint8_t kMaskBursty3_2[4] = {
-  0xc0, 0x00,
-  0xa0, 0x00
-};
-
-const uint8_t kMaskBursty3_3[6] = {
-  0x80, 0x00,
-  0xc0, 0x00,
-  0x60, 0x00
-};
-
-const uint8_t kMaskBursty4_1[2] = {
-  0xf0, 0x00
-};
-
-const uint8_t kMaskBursty4_2[4] = {
-  0xa0, 0x00,
-  0xd0, 0x00
-};
-
-const uint8_t kMaskBursty4_3[6] = {
-  0xc0, 0x00,
-  0x60, 0x00,
-  0x90, 0x00
-};
-
-const uint8_t kMaskBursty4_4[8] = {
-  0x80, 0x00,
-  0xc0, 0x00,
-  0x60, 0x00,
-  0x30, 0x00
-};
-
-const uint8_t kMaskBursty5_1[2] = {
-  0xf8, 0x00
-};
-
-const uint8_t kMaskBursty5_2[4] = {
-  0xd0, 0x00,
-  0xa8, 0x00
-};
-
-const uint8_t kMaskBursty5_3[6] = {
-  0x70, 0x00,
-  0x90, 0x00,
-  0xc8, 0x00
-};
-
-const uint8_t kMaskBursty5_4[8] = {
-  0xc0, 0x00,
-  0x60, 0x00,
-  0x30, 0x00,
-  0x88, 0x00
-};
-
-const uint8_t kMaskBursty5_5[10] = {
-  0x80, 0x00,
-  0xc0, 0x00,
-  0x60, 0x00,
-  0x30, 0x00,
-  0x18, 0x00
-};
-
-const uint8_t kMaskBursty6_1[2] = {
-  0xfc, 0x00
-};
-
-const uint8_t kMaskBursty6_2[4] = {
-  0xa8, 0x00,
-  0xd4, 0x00
-};
-
-const uint8_t kMaskBursty6_3[6] = {
-  0x94, 0x00,
-  0xc8, 0x00,
-  0x64, 0x00
-};
-
-const uint8_t kMaskBursty6_4[8] = {
-  0x60, 0x00,
-  0x38, 0x00,
-  0x88, 0x00,
-  0xc4, 0x00
-};
-
-const uint8_t kMaskBursty6_5[10] = {
-  0xc0, 0x00,
-  0x60, 0x00,
-  0x30, 0x00,
-  0x18, 0x00,
-  0x84, 0x00
-};
-
-const uint8_t kMaskBursty6_6[12] = {
-  0x80, 0x00,
-  0xc0, 0x00,
-  0x60, 0x00,
-  0x30, 0x00,
-  0x18, 0x00,
-  0x0c, 0x00
-};
-
-const uint8_t kMaskBursty7_1[2] = {
-  0xfe, 0x00
-};
-
-const uint8_t kMaskBursty7_2[4] = {
-  0xd4, 0x00,
-  0xaa, 0x00
-};
-
-const uint8_t kMaskBursty7_3[6] = {
-  0xc8, 0x00,
-  0x74, 0x00,
-  0x92, 0x00
-};
-
-const uint8_t kMaskBursty7_4[8] = {
-  0x38, 0x00,
-  0x8a, 0x00,
-  0xc4, 0x00,
-  0x62, 0x00
-};
-
-const uint8_t kMaskBursty7_5[10] = {
-  0x60, 0x00,
-  0x30, 0x00,
-  0x1c, 0x00,
-  0x84, 0x00,
-  0xc2, 0x00
-};
-
-const uint8_t kMaskBursty7_6[12] = {
-  0xc0, 0x00,
-  0x60, 0x00,
-  0x30, 0x00,
-  0x18, 0x00,
-  0x0c, 0x00,
-  0x82, 0x00
-};
-
-const uint8_t kMaskBursty7_7[14] = {
-  0x80, 0x00,
-  0xc0, 0x00,
-  0x60, 0x00,
-  0x30, 0x00,
-  0x18, 0x00,
-  0x0c, 0x00,
-  0x06, 0x00
-};
-
-const uint8_t kMaskBursty8_1[2] = {
-  0xff, 0x00
-};
-
-const uint8_t kMaskBursty8_2[4] = {
-  0xaa, 0x00,
-  0xd5, 0x00
-};
-
-const uint8_t kMaskBursty8_3[6] = {
-  0x74, 0x00,
-  0x92, 0x00,
-  0xc9, 0x00
-};
-
-const uint8_t kMaskBursty8_4[8] = {
-  0x8a, 0x00,
-  0xc5, 0x00,
-  0x62, 0x00,
-  0x31, 0x00
-};
-
-const uint8_t kMaskBursty8_5[10] = {
-  0x30, 0x00,
-  0x1c, 0x00,
-  0x85, 0x00,
-  0xc2, 0x00,
-  0x61, 0x00
-};
-
-const uint8_t kMaskBursty8_6[12] = {
-  0x60, 0x00,
-  0x30, 0x00,
-  0x18, 0x00,
-  0x0e, 0x00,
-  0x82, 0x00,
-  0xc1, 0x00
-};
-
-const uint8_t kMaskBursty8_7[14] = {
-  0xc0, 0x00,
-  0x60, 0x00,
-  0x30, 0x00,
-  0x18, 0x00,
-  0x0c, 0x00,
-  0x06, 0x00,
-  0x81, 0x00
-};
-
-const uint8_t kMaskBursty8_8[16] = {
-  0x80, 0x00,
-  0xc0, 0x00,
-  0x60, 0x00,
-  0x30, 0x00,
-  0x18, 0x00,
-  0x0c, 0x00,
-  0x06, 0x00,
-  0x03, 0x00
-};
-
-const uint8_t kMaskBursty9_1[2] = {
-  0xff, 0x80
-};
-
-const uint8_t kMaskBursty9_2[4] = {
-  0xd5, 0x00,
-  0xaa, 0x80
-};
-
-const uint8_t kMaskBursty9_3[6] = {
-  0x92, 0x00,
-  0xc9, 0x00,
-  0x74, 0x80
-};
-
-const uint8_t kMaskBursty9_4[8] = {
-  0xc5, 0x00,
-  0x62, 0x00,
-  0x39, 0x00,
-  0x8a, 0x80
-};
-
-const uint8_t kMaskBursty9_5[10] = {
-  0x1c, 0x00,
-  0x85, 0x00,
-  0xc2, 0x80,
-  0x61, 0x00,
-  0x30, 0x80
-};
-
-const uint8_t kMaskBursty9_6[12] = {
-  0x30, 0x00,
-  0x18, 0x00,
-  0x0e, 0x00,
-  0x82, 0x80,
-  0xc1, 0x00,
-  0x60, 0x80
-};
-
-const uint8_t kMaskBursty9_7[14] = {
-  0x60, 0x00,
-  0x30, 0x00,
-  0x18, 0x00,
-  0x0c, 0x00,
-  0x07, 0x00,
-  0x81, 0x00,
-  0xc0, 0x80
-};
-
-const uint8_t kMaskBursty9_8[16] = {
-  0xc0, 0x00,
-  0x60, 0x00,
-  0x30, 0x00,
-  0x18, 0x00,
-  0x0c, 0x00,
-  0x06, 0x00,
-  0x03, 0x00,
-  0x80, 0x80
-};
-
-const uint8_t kMaskBursty9_9[18] = {
-  0x80, 0x00,
-  0xc0, 0x00,
-  0x60, 0x00,
-  0x30, 0x00,
-  0x18, 0x00,
-  0x0c, 0x00,
-  0x06, 0x00,
-  0x03, 0x00,
-  0x01, 0x80
-};
-
-const uint8_t kMaskBursty10_1[2] = {
-  0xff, 0xc0
-};
-
-const uint8_t kMaskBursty10_2[4] = {
-  0xaa, 0x80,
-  0xd5, 0x40
-};
-
-const uint8_t kMaskBursty10_3[6] = {
-  0xc9, 0x00,
-  0x74, 0x80,
-  0x92, 0x40
-};
-
-const uint8_t kMaskBursty10_4[8] = {
-  0x62, 0x00,
-  0x39, 0x00,
-  0x8a, 0x80,
-  0xc5, 0x40
-};
-
-const uint8_t kMaskBursty10_5[10] = {
-  0x85, 0x00,
-  0xc2, 0x80,
-  0x61, 0x40,
-  0x30, 0x80,
-  0x18, 0x40
-};
-
-const uint8_t kMaskBursty10_6[12] = {
-  0x18, 0x00,
-  0x0e, 0x00,
-  0x82, 0x80,
-  0xc1, 0x40,
-  0x60, 0x80,
-  0x30, 0x40
-};
-
-const uint8_t kMaskBursty10_7[14] = {
-  0x30, 0x00,
-  0x18, 0x00,
-  0x0c, 0x00,
-  0x07, 0x00,
-  0x81, 0x40,
-  0xc0, 0x80,
-  0x60, 0x40
-};
-
-const uint8_t kMaskBursty10_8[16] = {
-  0x60, 0x00,
-  0x30, 0x00,
-  0x18, 0x00,
-  0x0c, 0x00,
-  0x06, 0x00,
-  0x03, 0x00,
-  0x80, 0x80,
-  0xc0, 0x40
-};
-
-const uint8_t kMaskBursty10_9[18] = {
-  0xc0, 0x00,
-  0x60, 0x00,
-  0x30, 0x00,
-  0x18, 0x00,
-  0x0c, 0x00,
-  0x06, 0x00,
-  0x03, 0x00,
-  0x01, 0x80,
-  0x80, 0x40
-};
-
-const uint8_t kMaskBursty10_10[20] = {
-  0x80, 0x00,
-  0xc0, 0x00,
-  0x60, 0x00,
-  0x30, 0x00,
-  0x18, 0x00,
-  0x0c, 0x00,
-  0x06, 0x00,
-  0x03, 0x00,
-  0x01, 0x80,
-  0x00, 0xc0
-};
-
-const uint8_t kMaskBursty11_1[2] = {
-  0xff, 0xe0
-};
-
-const uint8_t kMaskBursty11_2[4] = {
-  0xd5, 0x40,
-  0xaa, 0xa0
-};
-
-const uint8_t kMaskBursty11_3[6] = {
-  0x74, 0x80,
-  0x92, 0x40,
-  0xc9, 0x20
-};
-
-const uint8_t kMaskBursty11_4[8] = {
-  0x39, 0x00,
-  0x8a, 0x80,
-  0xc5, 0x40,
-  0x62, 0x20
-};
-
-const uint8_t kMaskBursty11_5[10] = {
-  0xc2, 0xc0,
-  0x61, 0x00,
-  0x30, 0xa0,
-  0x1c, 0x40,
-  0x85, 0x20
-};
-
-const uint8_t kMaskBursty11_6[12] = {
-  0x0e, 0x00,
-  0x82, 0x80,
-  0xc1, 0x40,
-  0x60, 0xa0,
-  0x30, 0x40,
-  0x18, 0x20
-};
-
-const uint8_t kMaskBursty11_7[14] = {
-  0x18, 0x00,
-  0x0c, 0x00,
-  0x07, 0x00,
-  0x81, 0x40,
-  0xc0, 0xa0,
-  0x60, 0x40,
-  0x30, 0x20
-};
-
-const uint8_t kMaskBursty11_8[16] = {
-  0x30, 0x00,
-  0x18, 0x00,
-  0x0c, 0x00,
-  0x06, 0x00,
-  0x03, 0x40,
-  0x80, 0xa0,
-  0xc0, 0x40,
-  0x60, 0x20
-};
-
-const uint8_t kMaskBursty11_9[18] = {
-  0x60, 0x00,
-  0x30, 0x00,
-  0x18, 0x00,
-  0x0c, 0x00,
-  0x06, 0x00,
-  0x03, 0x00,
-  0x01, 0x80,
-  0x80, 0x40,
-  0xc0, 0x20
-};
-
-const uint8_t kMaskBursty11_10[20] = {
-  0xc0, 0x00,
-  0x60, 0x00,
-  0x30, 0x00,
-  0x18, 0x00,
-  0x0c, 0x00,
-  0x06, 0x00,
-  0x03, 0x00,
-  0x01, 0x80,
-  0x00, 0xc0,
-  0x80, 0x20
-};
-
-const uint8_t kMaskBursty11_11[22] = {
-  0x80, 0x00,
-  0xc0, 0x00,
-  0x60, 0x00,
-  0x30, 0x00,
-  0x18, 0x00,
-  0x0c, 0x00,
-  0x06, 0x00,
-  0x03, 0x00,
-  0x01, 0x80,
-  0x00, 0xc0,
-  0x00, 0x60
-};
-
-const uint8_t kMaskBursty12_1[2] = {
-  0xff, 0xf0
-};
-
-const uint8_t kMaskBursty12_2[4] = {
-  0xaa, 0xa0,
-  0xd5, 0x50
-};
-
-const uint8_t kMaskBursty12_3[6] = {
-  0x92, 0x40,
-  0xc9, 0x20,
-  0x74, 0x90
-};
-
-const uint8_t kMaskBursty12_4[8] = {
-  0x8a, 0x80,
-  0xc5, 0x40,
-  0x62, 0x20,
-  0x39, 0x10
-};
-
-const uint8_t kMaskBursty12_5[10] = {
-  0x61, 0x00,
-  0x30, 0xa0,
-  0x1c, 0x50,
-  0x85, 0x20,
-  0xc2, 0x90
-};
-
-const uint8_t kMaskBursty12_6[12] = {
-  0x82, 0x90,
-  0xc1, 0x40,
-  0x60, 0xa0,
-  0x30, 0x50,
-  0x18, 0x20,
-  0x0c, 0x10
-};
-
-const uint8_t kMaskBursty12_7[14] = {
-  0x0c, 0x00,
-  0x07, 0x00,
-  0x81, 0x40,
-  0xc0, 0xa0,
-  0x60, 0x50,
-  0x30, 0x20,
-  0x18, 0x10
-};
-
-const uint8_t kMaskBursty12_8[16] = {
-  0x18, 0x00,
-  0x0c, 0x00,
-  0x06, 0x00,
-  0x03, 0x00,
-  0x80, 0xa0,
-  0xc0, 0x50,
-  0x60, 0x20,
-  0x30, 0x10
-};
-
-const uint8_t kMaskBursty12_9[18] = {
-  0x30, 0x00,
-  0x18, 0x00,
-  0x0c, 0x00,
-  0x06, 0x00,
-  0x03, 0x00,
-  0x01, 0x80,
-  0x80, 0x50,
-  0xc0, 0x20,
-  0x60, 0x10
-};
-
-const uint8_t kMaskBursty12_10[20] = {
-  0x60, 0x00,
-  0x30, 0x00,
-  0x18, 0x00,
-  0x0c, 0x00,
-  0x06, 0x00,
-  0x03, 0x00,
-  0x01, 0x80,
-  0x00, 0xc0,
-  0x80, 0x20,
-  0xc0, 0x10
-};
-
-const uint8_t kMaskBursty12_11[22] = {
-  0xc0, 0x00,
-  0x60, 0x00,
-  0x30, 0x00,
-  0x18, 0x00,
-  0x0c, 0x00,
-  0x06, 0x00,
-  0x03, 0x00,
-  0x01, 0x80,
-  0x00, 0xc0,
-  0x00, 0x60,
-  0x80, 0x10
-};
-
-const uint8_t kMaskBursty12_12[24] = {
-  0x80, 0x00,
-  0xc0, 0x00,
-  0x60, 0x00,
-  0x30, 0x00,
-  0x18, 0x00,
-  0x0c, 0x00,
-  0x06, 0x00,
-  0x03, 0x00,
-  0x01, 0x80,
-  0x00, 0xc0,
-  0x00, 0x60,
-  0x00, 0x30
-};
-
-const uint8_t* const kPacketMaskBursty1[1] = {
-  kMaskBursty1_1
-};
-
-const uint8_t* const kPacketMaskBursty2[2] = {
-  kMaskBursty2_1,
-  kMaskBursty2_2
-};
-
-const uint8_t* const kPacketMaskBursty3[3] = {
-  kMaskBursty3_1,
-  kMaskBursty3_2,
-  kMaskBursty3_3
-};
-
-const uint8_t* const kPacketMaskBursty4[4] = {
-  kMaskBursty4_1,
-  kMaskBursty4_2,
-  kMaskBursty4_3,
-  kMaskBursty4_4
-};
-
-const uint8_t* const kPacketMaskBursty5[5] = {
-  kMaskBursty5_1,
-  kMaskBursty5_2,
-  kMaskBursty5_3,
-  kMaskBursty5_4,
-  kMaskBursty5_5
-};
-
-const uint8_t* const kPacketMaskBursty6[6] = {
-  kMaskBursty6_1,
-  kMaskBursty6_2,
-  kMaskBursty6_3,
-  kMaskBursty6_4,
-  kMaskBursty6_5,
-  kMaskBursty6_6
-};
-
-const uint8_t* const kPacketMaskBursty7[7] = {
-  kMaskBursty7_1,
-  kMaskBursty7_2,
-  kMaskBursty7_3,
-  kMaskBursty7_4,
-  kMaskBursty7_5,
-  kMaskBursty7_6,
-  kMaskBursty7_7
-};
-
-const uint8_t* const kPacketMaskBursty8[8] = {
-  kMaskBursty8_1,
-  kMaskBursty8_2,
-  kMaskBursty8_3,
-  kMaskBursty8_4,
-  kMaskBursty8_5,
-  kMaskBursty8_6,
-  kMaskBursty8_7,
-  kMaskBursty8_8
-};
-
-const uint8_t* const kPacketMaskBursty9[9] = {
-  kMaskBursty9_1,
-  kMaskBursty9_2,
-  kMaskBursty9_3,
-  kMaskBursty9_4,
-  kMaskBursty9_5,
-  kMaskBursty9_6,
-  kMaskBursty9_7,
-  kMaskBursty9_8,
-  kMaskBursty9_9
-};
-
-const uint8_t* const kPacketMaskBursty10[10] = {
-  kMaskBursty10_1,
-  kMaskBursty10_2,
-  kMaskBursty10_3,
-  kMaskBursty10_4,
-  kMaskBursty10_5,
-  kMaskBursty10_6,
-  kMaskBursty10_7,
-  kMaskBursty10_8,
-  kMaskBursty10_9,
-  kMaskBursty10_10
-};
-
-const uint8_t* const kPacketMaskBursty11[11] = {
-  kMaskBursty11_1,
-  kMaskBursty11_2,
-  kMaskBursty11_3,
-  kMaskBursty11_4,
-  kMaskBursty11_5,
-  kMaskBursty11_6,
-  kMaskBursty11_7,
-  kMaskBursty11_8,
-  kMaskBursty11_9,
-  kMaskBursty11_10,
-  kMaskBursty11_11
-};
-
-const uint8_t* const kPacketMaskBursty12[12] = {
-  kMaskBursty12_1,
-  kMaskBursty12_2,
-  kMaskBursty12_3,
-  kMaskBursty12_4,
-  kMaskBursty12_5,
-  kMaskBursty12_6,
-  kMaskBursty12_7,
-  kMaskBursty12_8,
-  kMaskBursty12_9,
-  kMaskBursty12_10,
-  kMaskBursty12_11,
-  kMaskBursty12_12
-};
-
-const uint8_t* const* const kPacketMaskBurstyTbl[12] = {
-  kPacketMaskBursty1,
-  kPacketMaskBursty2,
-  kPacketMaskBursty3,
-  kPacketMaskBursty4,
-  kPacketMaskBursty5,
-  kPacketMaskBursty6,
-  kPacketMaskBursty7,
-  kPacketMaskBursty8,
-  kPacketMaskBursty9,
-  kPacketMaskBursty10,
-  kPacketMaskBursty11,
-  kPacketMaskBursty12
-};
-
-}  // namespace fec_private_tables
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_RTP_RTCP_SOURCE_FEC_PRIVATE_TABLES_BURSTY_H_
diff --git a/modules/rtp_rtcp/source/fec_private_tables_random.h b/modules/rtp_rtcp/source/fec_private_tables_random.h
deleted file mode 100644
index 798c585..0000000
--- a/modules/rtp_rtcp/source/fec_private_tables_random.h
+++ /dev/null
@@ -1,24524 +0,0 @@
-/*
- *  Copyright (c) 2012 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_RTP_RTCP_SOURCE_FEC_PRIVATE_TABLES_RANDOM_H_
-#define WEBRTC_MODULES_RTP_RTCP_SOURCE_FEC_PRIVATE_TABLES_RANDOM_H_
-
-// This file contains a set of packets masks for the FEC code. The masks in
-// this table are specifically designed to favor recovery to random loss.
-// These packet masks are defined to protect up to maximum of 48 media packets.
-
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-namespace fec_private_tables {
-
-const uint8_t kMaskRandom10_1[2] = {
-  0xff, 0xc0
-};
-
-const uint8_t kMaskRandom10_10[20] = {
-  0x4c, 0x00,
-  0x51, 0x00,
-  0xa0, 0x40,
-  0x04, 0xc0,
-  0x03, 0x80,
-  0x86, 0x00,
-  0x29, 0x00,
-  0x42, 0x40,
-  0x98, 0x00,
-  0x30, 0x80
-};
-
-const uint8_t kMaskRandom10_2[4] = {
-  0xaa, 0x80,
-  0xd5, 0x40
-};
-
-const uint8_t kMaskRandom10_3[6] = {
-  0xa4, 0x40,
-  0xc9, 0x00,
-  0x52, 0x80
-};
-
-const uint8_t kMaskRandom10_4[8] = {
-  0xca, 0x00,
-  0x32, 0x80,
-  0xa1, 0x40,
-  0x55, 0x00
-};
-
-const uint8_t kMaskRandom10_5[10] = {
-  0xca, 0x00,
-  0x32, 0x80,
-  0xa1, 0x40,
-  0x55, 0x00,
-  0x08, 0xc0
-};
-
-const uint8_t kMaskRandom10_6[12] = {
-  0x0e, 0x00,
-  0x33, 0x00,
-  0x10, 0xc0,
-  0x45, 0x40,
-  0x88, 0x80,
-  0xe0, 0x00
-};
-
-const uint8_t kMaskRandom10_7[14] = {
-  0x46, 0x00,
-  0x33, 0x00,
-  0x80, 0xc0,
-  0x0c, 0x40,
-  0x28, 0x80,
-  0x94, 0x00,
-  0xc1, 0x00
-};
-
-const uint8_t kMaskRandom10_8[16] = {
-  0x2c, 0x00,
-  0x81, 0x80,
-  0xa0, 0x40,
-  0x05, 0x40,
-  0x18, 0x80,
-  0xc2, 0x00,
-  0x22, 0x80,
-  0x50, 0x40
-};
-
-const uint8_t kMaskRandom10_9[18] = {
-  0x4c, 0x00,
-  0x23, 0x00,
-  0x88, 0xc0,
-  0x21, 0x40,
-  0x52, 0x80,
-  0x94, 0x00,
-  0x26, 0x00,
-  0x48, 0x40,
-  0x91, 0x80
-};
-
-const uint8_t kMaskRandom11_1[2] = {
-  0xff, 0xe0
-};
-
-const uint8_t kMaskRandom11_10[20] = {
-  0x64, 0x40,
-  0x51, 0x40,
-  0xa9, 0x00,
-  0x04, 0xc0,
-  0xd0, 0x00,
-  0x82, 0x40,
-  0x21, 0x20,
-  0x0c, 0x20,
-  0x4a, 0x00,
-  0x12, 0xa0
-};
-
-const uint8_t kMaskRandom11_11[22] = {
-  0x46, 0x40,
-  0x33, 0x20,
-  0x99, 0x00,
-  0x05, 0x80,
-  0x80, 0xa0,
-  0x84, 0x40,
-  0x40, 0x60,
-  0x0a, 0x80,
-  0x68, 0x00,
-  0x10, 0x20,
-  0x30, 0x40
-};
-
-const uint8_t kMaskRandom11_2[4] = {
-  0xec, 0xc0,
-  0x9b, 0xa0
-};
-
-const uint8_t kMaskRandom11_3[6] = {
-  0xca, 0xc0,
-  0xf1, 0x40,
-  0xb6, 0x20
-};
-
-const uint8_t kMaskRandom11_4[8] = {
-  0xc4, 0xc0,
-  0x31, 0x60,
-  0x4b, 0x20,
-  0x2c, 0xa0
-};
-
-const uint8_t kMaskRandom11_5[10] = {
-  0x86, 0x80,
-  0x23, 0x20,
-  0x16, 0x20,
-  0x4c, 0x20,
-  0x41, 0xc0
-};
-
-const uint8_t kMaskRandom11_6[12] = {
-  0x64, 0x40,
-  0x51, 0x40,
-  0x0c, 0xa0,
-  0xa1, 0x20,
-  0x12, 0xa0,
-  0x8a, 0x40
-};
-
-const uint8_t kMaskRandom11_7[14] = {
-  0x46, 0x40,
-  0x33, 0x20,
-  0x91, 0x80,
-  0xa4, 0x20,
-  0x50, 0xa0,
-  0x84, 0xc0,
-  0x09, 0x60
-};
-
-const uint8_t kMaskRandom11_8[16] = {
-  0x0c, 0x80,
-  0x80, 0x60,
-  0xa0, 0x80,
-  0x05, 0x40,
-  0x43, 0x00,
-  0x1a, 0x00,
-  0x60, 0x20,
-  0x14, 0x20
-};
-
-const uint8_t kMaskRandom11_9[18] = {
-  0x46, 0x40,
-  0x62, 0x60,
-  0x8c, 0x00,
-  0x01, 0x60,
-  0x07, 0x80,
-  0xa0, 0x80,
-  0x18, 0xa0,
-  0x91, 0x00,
-  0x78, 0x00
-};
-
-const uint8_t kMaskRandom12_1[2] = {
-  0xff, 0xf0
-};
-
-const uint8_t kMaskRandom12_10[20] = {
-  0x51, 0x40,
-  0x45, 0x10,
-  0x80, 0xd0,
-  0x24, 0x20,
-  0x0a, 0x20,
-  0x00, 0xe0,
-  0xb8, 0x00,
-  0x09, 0x10,
-  0x56, 0x00,
-  0xa2, 0x80
-};
-
-const uint8_t kMaskRandom12_11[22] = {
-  0x53, 0x60,
-  0x21, 0x30,
-  0x10, 0x90,
-  0x00, 0x70,
-  0x0c, 0x10,
-  0x40, 0xc0,
-  0x6a, 0x00,
-  0x86, 0x00,
-  0x24, 0x80,
-  0x89, 0x00,
-  0xc0, 0x20
-};
-
-const uint8_t kMaskRandom12_12[24] = {
-  0x10, 0x60,
-  0x02, 0x30,
-  0x40, 0x50,
-  0x21, 0x80,
-  0x81, 0x10,
-  0x14, 0x80,
-  0x98, 0x00,
-  0x08, 0x90,
-  0x62, 0x00,
-  0x24, 0x20,
-  0x8a, 0x00,
-  0x84, 0x40
-};
-
-const uint8_t kMaskRandom12_2[4] = {
-  0xec, 0xc0,
-  0x93, 0xb0
-};
-
-const uint8_t kMaskRandom12_3[6] = {
-  0x9b, 0x80,
-  0x4f, 0x10,
-  0x3c, 0x60
-};
-
-const uint8_t kMaskRandom12_4[8] = {
-  0x8b, 0x20,
-  0x14, 0xb0,
-  0x22, 0xd0,
-  0x45, 0x50
-};
-
-const uint8_t kMaskRandom12_5[10] = {
-  0x53, 0x60,
-  0x64, 0x20,
-  0x0c, 0xc0,
-  0x82, 0xa0,
-  0x09, 0x30
-};
-
-const uint8_t kMaskRandom12_6[12] = {
-  0x51, 0x40,
-  0xc5, 0x10,
-  0x21, 0x80,
-  0x12, 0x30,
-  0x08, 0xe0,
-  0x2e, 0x00
-};
-
-const uint8_t kMaskRandom12_7[14] = {
-  0x53, 0x60,
-  0x21, 0x30,
-  0x90, 0x90,
-  0x02, 0x50,
-  0x06, 0xa0,
-  0x2c, 0x00,
-  0x88, 0x60
-};
-
-const uint8_t kMaskRandom12_8[16] = {
-  0x20, 0x60,
-  0x80, 0x30,
-  0x42, 0x40,
-  0x01, 0x90,
-  0x14, 0x10,
-  0x0a, 0x80,
-  0x38, 0x00,
-  0xc5, 0x00
-};
-
-const uint8_t kMaskRandom12_9[18] = {
-  0x53, 0x60,
-  0xe4, 0x20,
-  0x24, 0x40,
-  0xa1, 0x10,
-  0x18, 0x30,
-  0x03, 0x90,
-  0x8a, 0x10,
-  0x04, 0x90,
-  0x00, 0xe0
-};
-
-const uint8_t kMaskRandom13_1[2] = {
-  0xff, 0xf8
-};
-
-const uint8_t kMaskRandom13_10[20] = {
-  0xd1, 0x00,
-  0x44, 0x50,
-  0x10, 0x98,
-  0xa0, 0x50,
-  0x4a, 0x08,
-  0x40, 0x30,
-  0x80, 0x28,
-  0x0c, 0x90,
-  0x05, 0x88,
-  0x62, 0x20
-};
-
-const uint8_t kMaskRandom13_11[22] = {
-  0x51, 0x20,
-  0x22, 0x10,
-  0x13, 0x40,
-  0x25, 0x00,
-  0x18, 0x18,
-  0x0a, 0x20,
-  0x88, 0x88,
-  0x06, 0x80,
-  0xe0, 0x20,
-  0x84, 0x40,
-  0x44, 0x18
-};
-
-const uint8_t kMaskRandom13_12[24] = {
-  0x28, 0x28,
-  0x84, 0x50,
-  0x60, 0x40,
-  0x05, 0x48,
-  0x02, 0x98,
-  0x01, 0x30,
-  0x48, 0x10,
-  0x24, 0x80,
-  0x94, 0x00,
-  0x8a, 0x00,
-  0x11, 0x80,
-  0x52, 0x20
-};
-
-const uint8_t kMaskRandom13_13[26] = {
-  0x51, 0x20,
-  0x66, 0x40,
-  0x05, 0x48,
-  0x81, 0x20,
-  0x94, 0x00,
-  0x30, 0x80,
-  0x21, 0x10,
-  0x03, 0xc0,
-  0xe8, 0x00,
-  0x0a, 0x10,
-  0x80, 0x18,
-  0x04, 0x90,
-  0x08, 0xa8
-};
-
-const uint8_t kMaskRandom13_2[4] = {
-  0xec, 0xc0,
-  0x1b, 0x38
-};
-
-const uint8_t kMaskRandom13_3[6] = {
-  0x99, 0xb0,
-  0x46, 0xd8,
-  0x37, 0x28
-};
-
-const uint8_t kMaskRandom13_4[8] = {
-  0x49, 0xb0,
-  0x26, 0xd0,
-  0x85, 0x68,
-  0x52, 0x58
-};
-
-const uint8_t kMaskRandom13_5[10] = {
-  0x51, 0x30,
-  0x66, 0x40,
-  0x0c, 0x68,
-  0xa1, 0xc0,
-  0x22, 0x98
-};
-
-const uint8_t kMaskRandom13_6[12] = {
-  0xd1, 0x20,
-  0x46, 0xd0,
-  0x15, 0x48,
-  0x21, 0x70,
-  0x28, 0xc8,
-  0xaa, 0x20
-};
-
-const uint8_t kMaskRandom13_7[14] = {
-  0x59, 0x20,
-  0x26, 0x50,
-  0xb1, 0x40,
-  0x2b, 0x08,
-  0x14, 0xc8,
-  0xc8, 0x88,
-  0x84, 0xb0
-};
-
-const uint8_t kMaskRandom13_8[16] = {
-  0x80, 0xa8,
-  0x30, 0x90,
-  0x16, 0x08,
-  0x03, 0x30,
-  0x44, 0x60,
-  0x08, 0x18,
-  0xd8, 0x00,
-  0xa1, 0x40
-};
-
-const uint8_t kMaskRandom13_9[18] = {
-  0x59, 0x20,
-  0x66, 0x40,
-  0x14, 0x40,
-  0x21, 0x48,
-  0x02, 0xc8,
-  0x94, 0x10,
-  0x80, 0xa8,
-  0x0a, 0x90,
-  0x40, 0x18
-};
-
-const uint8_t kMaskRandom14_1[2] = {
-  0xff, 0xfc
-};
-
-const uint8_t kMaskRandom14_10[20] = {
-  0xc0, 0xd4,
-  0x1d, 0x40,
-  0xd4, 0x08,
-  0x02, 0x60,
-  0x04, 0x28,
-  0x20, 0x98,
-  0x40, 0x44,
-  0x08, 0x84,
-  0x68, 0x00,
-  0x23, 0x10
-};
-
-const uint8_t kMaskRandom14_11[22] = {
-  0x62, 0xd0,
-  0x35, 0x20,
-  0x14, 0x14,
-  0xc5, 0x08,
-  0x22, 0x0c,
-  0x88, 0xb8,
-  0x42, 0x54,
-  0x28, 0xa4,
-  0x94, 0x20,
-  0x1b, 0x04,
-  0x22, 0xc0
-};
-
-const uint8_t kMaskRandom14_12[24] = {
-  0x81, 0x04,
-  0x40, 0x68,
-  0x90, 0x24,
-  0x28, 0x28,
-  0x52, 0x10,
-  0x41, 0x88,
-  0x09, 0x30,
-  0x48, 0x44,
-  0x04, 0x44,
-  0x0e, 0x80,
-  0xa5, 0x90,
-  0x12, 0x0c
-};
-
-const uint8_t kMaskRandom14_13[26] = {
-  0x62, 0x54,
-  0x34, 0x60,
-  0x48, 0x04,
-  0x00, 0xac,
-  0x28, 0x08,
-  0x81, 0x08,
-  0x23, 0x04,
-  0x06, 0x80,
-  0x80, 0x14,
-  0x30, 0x10,
-  0x8c, 0x20,
-  0x54, 0x00,
-  0x80, 0xc0
-};
-
-const uint8_t kMaskRandom14_14[28] = {
-  0x40, 0x54,
-  0x15, 0x40,
-  0xc0, 0x04,
-  0x28, 0x10,
-  0x05, 0x0c,
-  0x64, 0x80,
-  0x81, 0x80,
-  0x10, 0x98,
-  0x84, 0x20,
-  0x12, 0x30,
-  0x62, 0x00,
-  0x28, 0x60,
-  0x0e, 0x08,
-  0x10, 0x84
-};
-
-const uint8_t kMaskRandom14_2[4] = {
-  0xec, 0xe8,
-  0x3b, 0x9c
-};
-
-const uint8_t kMaskRandom14_3[6] = {
-  0xac, 0xd8,
-  0x55, 0x6c,
-  0x27, 0xb4
-};
-
-const uint8_t kMaskRandom14_4[8] = {
-  0x2c, 0xd8,
-  0x93, 0x68,
-  0x1a, 0xb4,
-  0x47, 0x2c
-};
-
-const uint8_t kMaskRandom14_5[10] = {
-  0x64, 0xd8,
-  0xa5, 0x68,
-  0x52, 0xb4,
-  0x1d, 0xa8,
-  0x9c, 0x54
-};
-
-const uint8_t kMaskRandom14_6[12] = {
-  0x4a, 0x54,
-  0x95, 0x48,
-  0x14, 0xb4,
-  0x51, 0xa8,
-  0x22, 0x6c,
-  0x88, 0x8c
-};
-
-const uint8_t kMaskRandom14_7[14] = {
-  0x62, 0x54,
-  0xb9, 0x20,
-  0x18, 0xb4,
-  0x54, 0x98,
-  0x06, 0x6c,
-  0x85, 0x54,
-  0xaa, 0x88
-};
-
-const uint8_t kMaskRandom14_8[16] = {
-  0xc0, 0x14,
-  0x41, 0x60,
-  0x88, 0x30,
-  0x20, 0xa4,
-  0x0a, 0x48,
-  0x04, 0x98,
-  0x94, 0x40,
-  0x72, 0x00
-};
-
-const uint8_t kMaskRandom14_9[18] = {
-  0xa2, 0x54,
-  0x34, 0x60,
-  0x4a, 0x24,
-  0x20, 0xa8,
-  0x11, 0x84,
-  0x49, 0x08,
-  0x86, 0x0c,
-  0x20, 0xd4,
-  0x88, 0x48
-};
-
-const uint8_t kMaskRandom15_1[2] = {
-  0xff, 0xfe
-};
-
-const uint8_t kMaskRandom15_10[20] = {
-  0xc0, 0xa0,
-  0x15, 0x56,
-  0x74, 0x40,
-  0x00, 0x9c,
-  0x01, 0x2c,
-  0x44, 0x92,
-  0x88, 0x50,
-  0x20, 0xa4,
-  0xaa, 0x04,
-  0x02, 0x62
-};
-
-const uint8_t kMaskRandom15_11[22] = {
-  0x62, 0x22,
-  0xf1, 0x10,
-  0x10, 0x0e,
-  0x10, 0xb0,
-  0x24, 0x24,
-  0x01, 0x12,
-  0x00, 0xc4,
-  0x04, 0xa2,
-  0x02, 0x58,
-  0x2b, 0x00,
-  0x98, 0x40
-};
-
-const uint8_t kMaskRandom15_12[24] = {
-  0x88, 0x90,
-  0x40, 0x54,
-  0x82, 0x62,
-  0x21, 0xa4,
-  0x10, 0x64,
-  0x44, 0x0a,
-  0x10, 0xc8,
-  0x4d, 0x2a,
-  0x38, 0x02,
-  0x17, 0x48,
-  0x90, 0x84,
-  0x72, 0x14
-};
-
-const uint8_t kMaskRandom15_13[26] = {
-  0x62, 0xa2,
-  0x34, 0x44,
-  0x40, 0x4a,
-  0xc4, 0x04,
-  0x08, 0x60,
-  0x94, 0x12,
-  0x88, 0xc0,
-  0x21, 0x32,
-  0xc1, 0x40,
-  0x10, 0x68,
-  0x06, 0x90,
-  0x59, 0x00,
-  0x0a, 0x0c
-};
-
-const uint8_t kMaskRandom15_14[28] = {
-  0x40, 0x82,
-  0x15, 0x54,
-  0x88, 0x12,
-  0xc0, 0x10,
-  0x80, 0xa0,
-  0x01, 0x22,
-  0x40, 0x2c,
-  0x22, 0x02,
-  0x90, 0x04,
-  0x12, 0x40,
-  0x5d, 0x00,
-  0x20, 0x54,
-  0x86, 0x08,
-  0x28, 0x88
-};
-
-const uint8_t kMaskRandom15_15[30] = {
-  0x62, 0x22,
-  0x31, 0x10,
-  0x58, 0x00,
-  0x01, 0x12,
-  0x88, 0x20,
-  0x44, 0x02,
-  0x29, 0x04,
-  0x82, 0xa0,
-  0x0a, 0x1a,
-  0x11, 0xe0,
-  0x84, 0x04,
-  0x86, 0x40,
-  0x00, 0x86,
-  0x44, 0x48,
-  0x10, 0x98
-};
-
-const uint8_t kMaskRandom15_2[4] = {
-  0xec, 0xea,
-  0xbb, 0x9c
-};
-
-const uint8_t kMaskRandom15_3[6] = {
-  0xac, 0x92,
-  0x55, 0x4a,
-  0x43, 0x36
-};
-
-const uint8_t kMaskRandom15_4[8] = {
-  0x25, 0xaa,
-  0x95, 0x54,
-  0x1a, 0x6a,
-  0x43, 0xd4
-};
-
-const uint8_t kMaskRandom15_5[10] = {
-  0x64, 0xa2,
-  0x25, 0x54,
-  0x49, 0x68,
-  0x53, 0x90,
-  0x8e, 0x30
-};
-
-const uint8_t kMaskRandom15_6[12] = {
-  0x62, 0x8a,
-  0x15, 0x54,
-  0x4c, 0x46,
-  0x52, 0x94,
-  0x23, 0x64,
-  0x8a, 0x58
-};
-
-const uint8_t kMaskRandom15_7[14] = {
-  0x62, 0xa2,
-  0xb1, 0x14,
-  0x18, 0x6a,
-  0x44, 0xd4,
-  0x13, 0x64,
-  0x49, 0x1a,
-  0x86, 0x8c
-};
-
-const uint8_t kMaskRandom15_8[16] = {
-  0x90, 0x22,
-  0x09, 0x50,
-  0x00, 0x6a,
-  0x20, 0x34,
-  0x14, 0x44,
-  0xc2, 0x10,
-  0x00, 0xc6,
-  0x65, 0x80
-};
-
-const uint8_t kMaskRandom15_9[18] = {
-  0x62, 0x22,
-  0x24, 0x44,
-  0xc0, 0x50,
-  0x03, 0x0c,
-  0x16, 0x28,
-  0x89, 0x00,
-  0x82, 0x90,
-  0x08, 0xa4,
-  0x90, 0x48
-};
-
-const uint8_t kMaskRandom16_1[2] = {
-  0xff, 0xff
-};
-
-const uint8_t kMaskRandom16_10[20] = {
-  0x45, 0x51,
-  0x10, 0xa2,
-  0x01, 0x25,
-  0x0b, 0x42,
-  0xd8, 0x20,
-  0x82, 0x8c,
-  0x24, 0x4a,
-  0x38, 0x18,
-  0x2a, 0x25,
-  0x84, 0x92
-};
-
-const uint8_t kMaskRandom16_11[22] = {
-  0x55, 0x55,
-  0x2a, 0x22,
-  0x31, 0x11,
-  0x83, 0x42,
-  0x06, 0x98,
-  0x40, 0xe1,
-  0x2c, 0x44,
-  0xd8, 0x28,
-  0x92, 0x81,
-  0x84, 0x32,
-  0x68, 0x0c
-};
-
-const uint8_t kMaskRandom16_12[24] = {
-  0x84, 0x31,
-  0x18, 0xa2,
-  0x4e, 0x01,
-  0x44, 0xc8,
-  0x0e, 0x90,
-  0x20, 0xcc,
-  0x93, 0x40,
-  0x2d, 0x10,
-  0x31, 0x44,
-  0xc0, 0x23,
-  0x11, 0x25,
-  0xe8, 0x80
-};
-
-const uint8_t kMaskRandom16_13[26] = {
-  0x45, 0x15,
-  0x22, 0x22,
-  0x96, 0x0c,
-  0x0c, 0x50,
-  0x62, 0x04,
-  0x49, 0x06,
-  0x11, 0x82,
-  0x12, 0x38,
-  0x40, 0x71,
-  0xa8, 0x8a,
-  0x08, 0xa1,
-  0xa0, 0xc0,
-  0xc5, 0x10
-};
-
-const uint8_t kMaskRandom16_14[28] = {
-  0x45, 0x51,
-  0x22, 0x0a,
-  0x84, 0xd0,
-  0x0c, 0x8a,
-  0x18, 0x06,
-  0x30, 0x03,
-  0x61, 0x08,
-  0x40, 0x11,
-  0x10, 0x2c,
-  0x09, 0x60,
-  0x00, 0x94,
-  0x52, 0x40,
-  0xa4, 0x24,
-  0x82, 0x88
-};
-
-const uint8_t kMaskRandom16_15[30] = {
-  0x55, 0x11,
-  0x22, 0x22,
-  0x11, 0x11,
-  0x80, 0x45,
-  0x20, 0x1a,
-  0x08, 0x68,
-  0x22, 0x84,
-  0x48, 0x09,
-  0x07, 0x01,
-  0x94, 0x20,
-  0x82, 0x06,
-  0x60, 0x48,
-  0x89, 0x80,
-  0x00, 0x8e,
-  0x18, 0x22
-};
-
-const uint8_t kMaskRandom16_16[32] = {
-  0xa4, 0x10,
-  0x01, 0x2a,
-  0x06, 0x42,
-  0x08, 0x68,
-  0x81, 0x90,
-  0x00, 0xf0,
-  0x50, 0x05,
-  0x20, 0x51,
-  0x43, 0x08,
-  0x68, 0x80,
-  0x80, 0x0b,
-  0x10, 0x4c,
-  0x12, 0x30,
-  0x40, 0x85,
-  0x0e, 0x04,
-  0x18, 0x12
-};
-
-const uint8_t kMaskRandom16_2[4] = {
-  0xae, 0xae,
-  0x79, 0x79
-};
-
-const uint8_t kMaskRandom16_3[6] = {
-  0xad, 0x2d,
-  0x76, 0x36,
-  0x26, 0xdb
-};
-
-const uint8_t kMaskRandom16_4[8] = {
-  0x55, 0x55,
-  0xaa, 0xaa,
-  0x35, 0x35,
-  0xca, 0xca
-};
-
-const uint8_t kMaskRandom16_5[10] = {
-  0x55, 0x55,
-  0x2a, 0x2a,
-  0x24, 0x25,
-  0x84, 0xc8,
-  0x10, 0xb6
-};
-
-const uint8_t kMaskRandom16_6[12] = {
-  0x51, 0x51,
-  0x0a, 0x2a,
-  0xa2, 0x15,
-  0x84, 0x4a,
-  0x30, 0x92,
-  0x04, 0xac
-};
-
-const uint8_t kMaskRandom16_7[14] = {
-  0x45, 0x51,
-  0x22, 0x2a,
-  0x91, 0x11,
-  0x2e, 0x08,
-  0x48, 0x34,
-  0x90, 0x29,
-  0x09, 0x86
-};
-
-const uint8_t kMaskRandom16_8[16] = {
-  0x20, 0x54,
-  0x18, 0x88,
-  0x84, 0x07,
-  0x60, 0x48,
-  0x12, 0x82,
-  0x81, 0x41,
-  0x40, 0x62,
-  0x16, 0x30
-};
-
-const uint8_t kMaskRandom16_9[18] = {
-  0x55, 0x51,
-  0x22, 0x2a,
-  0x05, 0x85,
-  0x09, 0x4a,
-  0x84, 0x32,
-  0xc0, 0x0d,
-  0x20, 0xa6,
-  0x1a, 0x09,
-  0x44, 0x64
-};
-
-const uint8_t kMaskRandom17_1[6] = {
-  0xff, 0xff, 0x80, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom17_10[60] = {
-  0x55, 0x8c, 0x80, 0x00, 0x00, 0x00,
-  0xaa, 0x27, 0x00, 0x00, 0x00, 0x00,
-  0xa5, 0x32, 0x80, 0x00, 0x00, 0x00,
-  0x62, 0x61, 0x80, 0x00, 0x00, 0x00,
-  0x3c, 0x5c, 0x00, 0x00, 0x00, 0x00,
-  0x8e, 0xcc, 0x00, 0x00, 0x00, 0x00,
-  0x6a, 0x2b, 0x00, 0x00, 0x00, 0x00,
-  0x36, 0x32, 0x80, 0x00, 0x00, 0x00,
-  0xd1, 0x25, 0x80, 0x00, 0x00, 0x00,
-  0xc8, 0x02, 0x80, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom17_11[66] = {
-  0x55, 0x8c, 0x80, 0x00, 0x00, 0x00,
-  0xaa, 0x27, 0x00, 0x00, 0x00, 0x00,
-  0xa5, 0x32, 0x80, 0x00, 0x00, 0x00,
-  0x62, 0x61, 0x80, 0x00, 0x00, 0x00,
-  0x3c, 0x5c, 0x00, 0x00, 0x00, 0x00,
-  0x51, 0x84, 0x80, 0x00, 0x00, 0x00,
-  0xa2, 0x27, 0x00, 0x00, 0x00, 0x00,
-  0x95, 0x51, 0x80, 0x00, 0x00, 0x00,
-  0x4a, 0x1a, 0x00, 0x00, 0x00, 0x00,
-  0x30, 0x68, 0x00, 0x00, 0x00, 0x00,
-  0x2c, 0x89, 0x00, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom17_12[72] = {
-  0x51, 0x84, 0x80, 0x00, 0x00, 0x00,
-  0xa2, 0x27, 0x00, 0x00, 0x00, 0x00,
-  0x95, 0x51, 0x80, 0x00, 0x00, 0x00,
-  0x4a, 0x1a, 0x00, 0x00, 0x00, 0x00,
-  0x30, 0x68, 0x00, 0x00, 0x00, 0x00,
-  0x2c, 0x89, 0x00, 0x00, 0x00, 0x00,
-  0x55, 0x8c, 0x80, 0x00, 0x00, 0x00,
-  0xaa, 0x27, 0x00, 0x00, 0x00, 0x00,
-  0xa5, 0x32, 0x80, 0x00, 0x00, 0x00,
-  0x62, 0x61, 0x80, 0x00, 0x00, 0x00,
-  0x3c, 0x5c, 0x00, 0x00, 0x00, 0x00,
-  0x51, 0x35, 0x00, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom17_13[78] = {
-  0x51, 0x84, 0x80, 0x00, 0x00, 0x00,
-  0xa2, 0x27, 0x00, 0x00, 0x00, 0x00,
-  0x95, 0x51, 0x80, 0x00, 0x00, 0x00,
-  0x4a, 0x1a, 0x00, 0x00, 0x00, 0x00,
-  0x30, 0x68, 0x00, 0x00, 0x00, 0x00,
-  0x2c, 0x89, 0x00, 0x00, 0x00, 0x00,
-  0x15, 0x8c, 0x00, 0x00, 0x00, 0x00,
-  0x8a, 0x47, 0x00, 0x00, 0x00, 0x00,
-  0x25, 0x81, 0x80, 0x00, 0x00, 0x00,
-  0x62, 0x12, 0x80, 0x00, 0x00, 0x00,
-  0x58, 0x58, 0x00, 0x00, 0x00, 0x00,
-  0x0e, 0x28, 0x80, 0x00, 0x00, 0x00,
-  0x83, 0x34, 0x00, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom17_14[84] = {
-  0x15, 0x8c, 0x00, 0x00, 0x00, 0x00,
-  0x8a, 0x47, 0x00, 0x00, 0x00, 0x00,
-  0x25, 0x81, 0x80, 0x00, 0x00, 0x00,
-  0x62, 0x12, 0x80, 0x00, 0x00, 0x00,
-  0x58, 0x58, 0x00, 0x00, 0x00, 0x00,
-  0x0e, 0x28, 0x80, 0x00, 0x00, 0x00,
-  0x83, 0x34, 0x00, 0x00, 0x00, 0x00,
-  0x51, 0x84, 0x80, 0x00, 0x00, 0x00,
-  0xa2, 0x27, 0x00, 0x00, 0x00, 0x00,
-  0x95, 0x51, 0x80, 0x00, 0x00, 0x00,
-  0x4a, 0x1a, 0x00, 0x00, 0x00, 0x00,
-  0x30, 0x68, 0x00, 0x00, 0x00, 0x00,
-  0x2c, 0x89, 0x00, 0x00, 0x00, 0x00,
-  0xb0, 0xde, 0x80, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom17_15[90] = {
-  0x15, 0x8c, 0x00, 0x00, 0x00, 0x00,
-  0x8a, 0x47, 0x00, 0x00, 0x00, 0x00,
-  0x25, 0x81, 0x80, 0x00, 0x00, 0x00,
-  0x62, 0x12, 0x80, 0x00, 0x00, 0x00,
-  0x58, 0x58, 0x00, 0x00, 0x00, 0x00,
-  0x0e, 0x28, 0x80, 0x00, 0x00, 0x00,
-  0x83, 0x34, 0x00, 0x00, 0x00, 0x00,
-  0x25, 0x2c, 0x00, 0x00, 0x00, 0x00,
-  0x8a, 0x91, 0x00, 0x00, 0x00, 0x00,
-  0x91, 0xc0, 0x80, 0x00, 0x00, 0x00,
-  0x68, 0x06, 0x80, 0x00, 0x00, 0x00,
-  0x32, 0xc8, 0x00, 0x00, 0x00, 0x00,
-  0x43, 0x45, 0x00, 0x00, 0x00, 0x00,
-  0xc4, 0x30, 0x80, 0x00, 0x00, 0x00,
-  0x1c, 0xa2, 0x00, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom17_16[96] = {
-  0x25, 0x2c, 0x00, 0x00, 0x00, 0x00,
-  0x8a, 0x91, 0x00, 0x00, 0x00, 0x00,
-  0x91, 0xc0, 0x80, 0x00, 0x00, 0x00,
-  0x68, 0x06, 0x80, 0x00, 0x00, 0x00,
-  0x32, 0xc8, 0x00, 0x00, 0x00, 0x00,
-  0x43, 0x45, 0x00, 0x00, 0x00, 0x00,
-  0xc4, 0x30, 0x80, 0x00, 0x00, 0x00,
-  0x1c, 0xa2, 0x00, 0x00, 0x00, 0x00,
-  0x15, 0x8c, 0x00, 0x00, 0x00, 0x00,
-  0x8a, 0x47, 0x00, 0x00, 0x00, 0x00,
-  0x25, 0x81, 0x80, 0x00, 0x00, 0x00,
-  0x62, 0x12, 0x80, 0x00, 0x00, 0x00,
-  0x58, 0x58, 0x00, 0x00, 0x00, 0x00,
-  0x0e, 0x28, 0x80, 0x00, 0x00, 0x00,
-  0x83, 0x34, 0x00, 0x00, 0x00, 0x00,
-  0x0a, 0x1c, 0x00, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom17_17[102] = {
-  0x25, 0x2c, 0x00, 0x00, 0x00, 0x00,
-  0x8a, 0x91, 0x00, 0x00, 0x00, 0x00,
-  0x91, 0xc0, 0x80, 0x00, 0x00, 0x00,
-  0x68, 0x06, 0x80, 0x00, 0x00, 0x00,
-  0x32, 0xc8, 0x00, 0x00, 0x00, 0x00,
-  0x43, 0x45, 0x00, 0x00, 0x00, 0x00,
-  0xc4, 0x30, 0x80, 0x00, 0x00, 0x00,
-  0x1c, 0xa2, 0x00, 0x00, 0x00, 0x00,
-  0x25, 0x4c, 0x00, 0x00, 0x00, 0x00,
-  0x8a, 0x66, 0x00, 0x00, 0x00, 0x00,
-  0x91, 0x91, 0x00, 0x00, 0x00, 0x00,
-  0x68, 0x42, 0x80, 0x00, 0x00, 0x00,
-  0x32, 0xa4, 0x00, 0x00, 0x00, 0x00,
-  0x43, 0x13, 0x00, 0x00, 0x00, 0x00,
-  0xc4, 0x30, 0x80, 0x00, 0x00, 0x00,
-  0x1c, 0x88, 0x80, 0x00, 0x00, 0x00,
-  0x3c, 0x09, 0x00, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom17_2[12] = {
-  0xce, 0xce, 0x00, 0x00, 0x00, 0x00,
-  0xb9, 0x39, 0x80, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom17_3[18] = {
-  0xcd, 0xcc, 0x00, 0x00, 0x00, 0x00,
-  0x97, 0x27, 0x00, 0x00, 0x00, 0x00,
-  0xb8, 0xd1, 0x80, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom17_4[24] = {
-  0xca, 0xec, 0x00, 0x00, 0x00, 0x00,
-  0xa9, 0x67, 0x00, 0x00, 0x00, 0x00,
-  0x3a, 0xb1, 0x80, 0x00, 0x00, 0x00,
-  0x55, 0x5a, 0x80, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom17_5[30] = {
-  0x55, 0x44, 0x80, 0x00, 0x00, 0x00,
-  0x2a, 0x66, 0x00, 0x00, 0x00, 0x00,
-  0x25, 0xa1, 0x80, 0x00, 0x00, 0x00,
-  0xe2, 0x12, 0x80, 0x00, 0x00, 0x00,
-  0x99, 0x98, 0x00, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom17_6[36] = {
-  0xd1, 0x4c, 0x00, 0x00, 0x00, 0x00,
-  0xa2, 0xc5, 0x00, 0x00, 0x00, 0x00,
-  0x95, 0x30, 0x80, 0x00, 0x00, 0x00,
-  0xca, 0x0a, 0x80, 0x00, 0x00, 0x00,
-  0xa4, 0xaa, 0x00, 0x00, 0x00, 0x00,
-  0x78, 0x15, 0x00, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom17_7[42] = {
-  0x15, 0x44, 0x80, 0x00, 0x00, 0x00,
-  0x8a, 0x23, 0x00, 0x00, 0x00, 0x00,
-  0x85, 0x91, 0x00, 0x00, 0x00, 0x00,
-  0x32, 0x0a, 0x80, 0x00, 0x00, 0x00,
-  0x58, 0x34, 0x00, 0x00, 0x00, 0x00,
-  0x2c, 0x0d, 0x00, 0x00, 0x00, 0x00,
-  0x43, 0xc8, 0x00, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom17_8[48] = {
-  0x64, 0x16, 0x00, 0x00, 0x00, 0x00,
-  0xa2, 0xc2, 0x00, 0x00, 0x00, 0x00,
-  0x51, 0x60, 0x80, 0x00, 0x00, 0x00,
-  0x4a, 0x85, 0x00, 0x00, 0x00, 0x00,
-  0x38, 0x4c, 0x00, 0x00, 0x00, 0x00,
-  0x89, 0x29, 0x00, 0x00, 0x00, 0x00,
-  0x07, 0x11, 0x80, 0x00, 0x00, 0x00,
-  0x94, 0xb0, 0x00, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom17_9[54] = {
-  0x8e, 0xcc, 0x00, 0x00, 0x00, 0x00,
-  0x6a, 0x2b, 0x00, 0x00, 0x00, 0x00,
-  0x36, 0x32, 0x80, 0x00, 0x00, 0x00,
-  0xd1, 0x25, 0x80, 0x00, 0x00, 0x00,
-  0x55, 0x8c, 0x80, 0x00, 0x00, 0x00,
-  0xaa, 0x27, 0x00, 0x00, 0x00, 0x00,
-  0xa5, 0x32, 0x80, 0x00, 0x00, 0x00,
-  0x62, 0x61, 0x80, 0x00, 0x00, 0x00,
-  0x3c, 0x5c, 0x00, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom18_1[6] = {
-  0xff, 0xff, 0xc0, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom18_10[60] = {
-  0x8c, 0xc6, 0x40, 0x00, 0x00, 0x00,
-  0x27, 0x13, 0x80, 0x00, 0x00, 0x00,
-  0x32, 0x99, 0x40, 0x00, 0x00, 0x00,
-  0x61, 0xb0, 0xc0, 0x00, 0x00, 0x00,
-  0x5c, 0x2e, 0x00, 0x00, 0x00, 0x00,
-  0xcc, 0x66, 0x00, 0x00, 0x00, 0x00,
-  0x2b, 0x15, 0x80, 0x00, 0x00, 0x00,
-  0x32, 0x99, 0x40, 0x00, 0x00, 0x00,
-  0x25, 0x92, 0xc0, 0x00, 0x00, 0x00,
-  0xfd, 0x9d, 0xc0, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom18_11[66] = {
-  0x8c, 0xc6, 0x40, 0x00, 0x00, 0x00,
-  0x27, 0x13, 0x80, 0x00, 0x00, 0x00,
-  0x32, 0x99, 0x40, 0x00, 0x00, 0x00,
-  0x61, 0xb0, 0xc0, 0x00, 0x00, 0x00,
-  0x5c, 0x2e, 0x00, 0x00, 0x00, 0x00,
-  0x84, 0xc2, 0x40, 0x00, 0x00, 0x00,
-  0x27, 0x13, 0x80, 0x00, 0x00, 0x00,
-  0x51, 0xa8, 0xc0, 0x00, 0x00, 0x00,
-  0x1a, 0x0d, 0x00, 0x00, 0x00, 0x00,
-  0x68, 0x34, 0x00, 0x00, 0x00, 0x00,
-  0x89, 0x44, 0x80, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom18_12[72] = {
-  0x84, 0xc2, 0x40, 0x00, 0x00, 0x00,
-  0x27, 0x13, 0x80, 0x00, 0x00, 0x00,
-  0x51, 0xa8, 0xc0, 0x00, 0x00, 0x00,
-  0x1a, 0x0d, 0x00, 0x00, 0x00, 0x00,
-  0x68, 0x34, 0x00, 0x00, 0x00, 0x00,
-  0x89, 0x44, 0x80, 0x00, 0x00, 0x00,
-  0x8c, 0xc6, 0x40, 0x00, 0x00, 0x00,
-  0x27, 0x13, 0x80, 0x00, 0x00, 0x00,
-  0x32, 0x99, 0x40, 0x00, 0x00, 0x00,
-  0x61, 0xb0, 0xc0, 0x00, 0x00, 0x00,
-  0x5c, 0x2e, 0x00, 0x00, 0x00, 0x00,
-  0x5b, 0x0c, 0x40, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom18_13[78] = {
-  0x84, 0xc2, 0x40, 0x00, 0x00, 0x00,
-  0x27, 0x13, 0x80, 0x00, 0x00, 0x00,
-  0x51, 0xa8, 0xc0, 0x00, 0x00, 0x00,
-  0x1a, 0x0d, 0x00, 0x00, 0x00, 0x00,
-  0x68, 0x34, 0x00, 0x00, 0x00, 0x00,
-  0x89, 0x44, 0x80, 0x00, 0x00, 0x00,
-  0x8c, 0x46, 0x00, 0x00, 0x00, 0x00,
-  0x47, 0x23, 0x80, 0x00, 0x00, 0x00,
-  0x81, 0xc0, 0xc0, 0x00, 0x00, 0x00,
-  0x12, 0x89, 0x40, 0x00, 0x00, 0x00,
-  0x58, 0x2c, 0x00, 0x00, 0x00, 0x00,
-  0x28, 0x94, 0x40, 0x00, 0x00, 0x00,
-  0x34, 0x1a, 0x00, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom18_14[84] = {
-  0x8c, 0x46, 0x00, 0x00, 0x00, 0x00,
-  0x47, 0x23, 0x80, 0x00, 0x00, 0x00,
-  0x81, 0xc0, 0xc0, 0x00, 0x00, 0x00,
-  0x12, 0x89, 0x40, 0x00, 0x00, 0x00,
-  0x58, 0x2c, 0x00, 0x00, 0x00, 0x00,
-  0x28, 0x94, 0x40, 0x00, 0x00, 0x00,
-  0x34, 0x1a, 0x00, 0x00, 0x00, 0x00,
-  0x84, 0xc2, 0x40, 0x00, 0x00, 0x00,
-  0x27, 0x13, 0x80, 0x00, 0x00, 0x00,
-  0x51, 0xa8, 0xc0, 0x00, 0x00, 0x00,
-  0x1a, 0x0d, 0x00, 0x00, 0x00, 0x00,
-  0x68, 0x34, 0x00, 0x00, 0x00, 0x00,
-  0x89, 0x44, 0x80, 0x00, 0x00, 0x00,
-  0x7f, 0x4f, 0xc0, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom18_15[90] = {
-  0x8c, 0x46, 0x00, 0x00, 0x00, 0x00,
-  0x47, 0x23, 0x80, 0x00, 0x00, 0x00,
-  0x81, 0xc0, 0xc0, 0x00, 0x00, 0x00,
-  0x12, 0x89, 0x40, 0x00, 0x00, 0x00,
-  0x58, 0x2c, 0x00, 0x00, 0x00, 0x00,
-  0x28, 0x94, 0x40, 0x00, 0x00, 0x00,
-  0x34, 0x1a, 0x00, 0x00, 0x00, 0x00,
-  0x2c, 0x16, 0x00, 0x00, 0x00, 0x00,
-  0x91, 0x48, 0x80, 0x00, 0x00, 0x00,
-  0xc0, 0xe0, 0x40, 0x00, 0x00, 0x00,
-  0x06, 0x83, 0x40, 0x00, 0x00, 0x00,
-  0xc8, 0x64, 0x00, 0x00, 0x00, 0x00,
-  0x45, 0x22, 0x80, 0x00, 0x00, 0x00,
-  0x30, 0x98, 0x40, 0x00, 0x00, 0x00,
-  0xa2, 0x51, 0x00, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom18_16[96] = {
-  0x2c, 0x16, 0x00, 0x00, 0x00, 0x00,
-  0x91, 0x48, 0x80, 0x00, 0x00, 0x00,
-  0xc0, 0xe0, 0x40, 0x00, 0x00, 0x00,
-  0x06, 0x83, 0x40, 0x00, 0x00, 0x00,
-  0xc8, 0x64, 0x00, 0x00, 0x00, 0x00,
-  0x45, 0x22, 0x80, 0x00, 0x00, 0x00,
-  0x30, 0x98, 0x40, 0x00, 0x00, 0x00,
-  0xa2, 0x51, 0x00, 0x00, 0x00, 0x00,
-  0x8c, 0x46, 0x00, 0x00, 0x00, 0x00,
-  0x47, 0x23, 0x80, 0x00, 0x00, 0x00,
-  0x81, 0xc0, 0xc0, 0x00, 0x00, 0x00,
-  0x12, 0x89, 0x40, 0x00, 0x00, 0x00,
-  0x58, 0x2c, 0x00, 0x00, 0x00, 0x00,
-  0x28, 0x94, 0x40, 0x00, 0x00, 0x00,
-  0x34, 0x1a, 0x00, 0x00, 0x00, 0x00,
-  0xef, 0xf2, 0x00, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom18_17[102] = {
-  0x2c, 0x16, 0x00, 0x00, 0x00, 0x00,
-  0x91, 0x48, 0x80, 0x00, 0x00, 0x00,
-  0xc0, 0xe0, 0x40, 0x00, 0x00, 0x00,
-  0x06, 0x83, 0x40, 0x00, 0x00, 0x00,
-  0xc8, 0x64, 0x00, 0x00, 0x00, 0x00,
-  0x45, 0x22, 0x80, 0x00, 0x00, 0x00,
-  0x30, 0x98, 0x40, 0x00, 0x00, 0x00,
-  0xa2, 0x51, 0x00, 0x00, 0x00, 0x00,
-  0x4c, 0x26, 0x00, 0x00, 0x00, 0x00,
-  0x66, 0x33, 0x00, 0x00, 0x00, 0x00,
-  0x91, 0x48, 0x80, 0x00, 0x00, 0x00,
-  0x42, 0xa1, 0x40, 0x00, 0x00, 0x00,
-  0xa4, 0x52, 0x00, 0x00, 0x00, 0x00,
-  0x13, 0x09, 0x80, 0x00, 0x00, 0x00,
-  0x30, 0x98, 0x40, 0x00, 0x00, 0x00,
-  0x88, 0xc4, 0x40, 0x00, 0x00, 0x00,
-  0x09, 0x04, 0x80, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom18_18[108] = {
-  0x4c, 0x26, 0x00, 0x00, 0x00, 0x00,
-  0x66, 0x33, 0x00, 0x00, 0x00, 0x00,
-  0x91, 0x48, 0x80, 0x00, 0x00, 0x00,
-  0x42, 0xa1, 0x40, 0x00, 0x00, 0x00,
-  0xa4, 0x52, 0x00, 0x00, 0x00, 0x00,
-  0x13, 0x09, 0x80, 0x00, 0x00, 0x00,
-  0x30, 0x98, 0x40, 0x00, 0x00, 0x00,
-  0x88, 0xc4, 0x40, 0x00, 0x00, 0x00,
-  0x09, 0x04, 0x80, 0x00, 0x00, 0x00,
-  0x2c, 0x16, 0x00, 0x00, 0x00, 0x00,
-  0x91, 0x48, 0x80, 0x00, 0x00, 0x00,
-  0xc0, 0xe0, 0x40, 0x00, 0x00, 0x00,
-  0x06, 0x83, 0x40, 0x00, 0x00, 0x00,
-  0xc8, 0x64, 0x00, 0x00, 0x00, 0x00,
-  0x45, 0x22, 0x80, 0x00, 0x00, 0x00,
-  0x30, 0x98, 0x40, 0x00, 0x00, 0x00,
-  0xa2, 0x51, 0x00, 0x00, 0x00, 0x00,
-  0xd0, 0x03, 0x40, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom18_2[12] = {
-  0xce, 0x67, 0x00, 0x00, 0x00, 0x00,
-  0x39, 0x9c, 0xc0, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom18_3[18] = {
-  0xcc, 0x66, 0x00, 0x00, 0x00, 0x00,
-  0x27, 0x15, 0x80, 0x00, 0x00, 0x00,
-  0x92, 0xc9, 0x40, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom18_4[24] = {
-  0xec, 0x76, 0x00, 0x00, 0x00, 0x00,
-  0x67, 0x33, 0x80, 0x00, 0x00, 0x00,
-  0xb1, 0xd8, 0xc0, 0x00, 0x00, 0x00,
-  0x5a, 0xad, 0x40, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom18_5[30] = {
-  0x4c, 0xa6, 0x40, 0x00, 0x00, 0x00,
-  0x66, 0x33, 0x00, 0x00, 0x00, 0x00,
-  0x19, 0xd0, 0xc0, 0x00, 0x00, 0x00,
-  0x9c, 0x89, 0x40, 0x00, 0x00, 0x00,
-  0xe3, 0x4c, 0x00, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom18_6[36] = {
-  0xcc, 0x26, 0x00, 0x00, 0x00, 0x00,
-  0x45, 0x62, 0x80, 0x00, 0x00, 0x00,
-  0xb0, 0x98, 0x40, 0x00, 0x00, 0x00,
-  0x8a, 0x85, 0x40, 0x00, 0x00, 0x00,
-  0x29, 0x53, 0x00, 0x00, 0x00, 0x00,
-  0xa6, 0x0a, 0x80, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom18_7[42] = {
-  0x44, 0xa2, 0x40, 0x00, 0x00, 0x00,
-  0x23, 0x11, 0x80, 0x00, 0x00, 0x00,
-  0x91, 0x48, 0x80, 0x00, 0x00, 0x00,
-  0x0a, 0x85, 0x40, 0x00, 0x00, 0x00,
-  0x34, 0x1a, 0x00, 0x00, 0x00, 0x00,
-  0x0b, 0x06, 0x80, 0x00, 0x00, 0x00,
-  0xe0, 0x64, 0x00, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom18_8[48] = {
-  0x16, 0x0b, 0x00, 0x00, 0x00, 0x00,
-  0xc2, 0x61, 0x00, 0x00, 0x00, 0x00,
-  0x60, 0xb0, 0x40, 0x00, 0x00, 0x00,
-  0x85, 0x42, 0x80, 0x00, 0x00, 0x00,
-  0x4c, 0x26, 0x00, 0x00, 0x00, 0x00,
-  0x29, 0x14, 0x80, 0x00, 0x00, 0x00,
-  0x11, 0x88, 0xc0, 0x00, 0x00, 0x00,
-  0xb0, 0x58, 0x00, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom18_9[54] = {
-  0x44, 0xa2, 0x40, 0x00, 0x00, 0x00,
-  0x66, 0x26, 0x00, 0x00, 0x00, 0x00,
-  0x90, 0x49, 0x40, 0x00, 0x00, 0x00,
-  0x01, 0xa5, 0x80, 0x00, 0x00, 0x00,
-  0x0e, 0x12, 0x80, 0x00, 0x00, 0x00,
-  0x13, 0x0b, 0x00, 0x00, 0x00, 0x00,
-  0x20, 0xd0, 0x40, 0x00, 0x00, 0x00,
-  0xc2, 0x51, 0x00, 0x00, 0x00, 0x00,
-  0x29, 0x0c, 0x80, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom19_1[6] = {
-  0xff, 0xff, 0xe0, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom19_10[60] = {
-  0x8c, 0xe3, 0x00, 0x00, 0x00, 0x00,
-  0x27, 0x11, 0xc0, 0x00, 0x00, 0x00,
-  0x32, 0x8d, 0x20, 0x00, 0x00, 0x00,
-  0x61, 0x92, 0x60, 0x00, 0x00, 0x00,
-  0x5c, 0x38, 0x80, 0x00, 0x00, 0x00,
-  0xcc, 0x75, 0x00, 0x00, 0x00, 0x00,
-  0x2b, 0x19, 0xc0, 0x00, 0x00, 0x00,
-  0x32, 0xd2, 0x60, 0x00, 0x00, 0x00,
-  0x25, 0x8e, 0xa0, 0x00, 0x00, 0x00,
-  0x50, 0x88, 0xc0, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom19_11[66] = {
-  0x8c, 0xe3, 0x00, 0x00, 0x00, 0x00,
-  0x27, 0x11, 0xc0, 0x00, 0x00, 0x00,
-  0x32, 0x8d, 0x20, 0x00, 0x00, 0x00,
-  0x61, 0x92, 0x60, 0x00, 0x00, 0x00,
-  0x5c, 0x38, 0x80, 0x00, 0x00, 0x00,
-  0x84, 0x87, 0x00, 0x00, 0x00, 0x00,
-  0x27, 0x19, 0x80, 0x00, 0x00, 0x00,
-  0x51, 0x88, 0x60, 0x00, 0x00, 0x00,
-  0x1a, 0x22, 0xa0, 0x00, 0x00, 0x00,
-  0x68, 0x44, 0x40, 0x00, 0x00, 0x00,
-  0x89, 0x70, 0x00, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom19_12[72] = {
-  0x84, 0x87, 0x00, 0x00, 0x00, 0x00,
-  0x27, 0x19, 0x80, 0x00, 0x00, 0x00,
-  0x51, 0x88, 0x60, 0x00, 0x00, 0x00,
-  0x1a, 0x22, 0xa0, 0x00, 0x00, 0x00,
-  0x68, 0x44, 0x40, 0x00, 0x00, 0x00,
-  0x89, 0x70, 0x00, 0x00, 0x00, 0x00,
-  0x8c, 0xe3, 0x00, 0x00, 0x00, 0x00,
-  0x27, 0x11, 0xc0, 0x00, 0x00, 0x00,
-  0x32, 0x8d, 0x20, 0x00, 0x00, 0x00,
-  0x61, 0x92, 0x60, 0x00, 0x00, 0x00,
-  0x5c, 0x38, 0x80, 0x00, 0x00, 0x00,
-  0x90, 0xc8, 0x80, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom19_13[78] = {
-  0x84, 0x87, 0x00, 0x00, 0x00, 0x00,
-  0x27, 0x19, 0x80, 0x00, 0x00, 0x00,
-  0x51, 0x88, 0x60, 0x00, 0x00, 0x00,
-  0x1a, 0x22, 0xa0, 0x00, 0x00, 0x00,
-  0x68, 0x44, 0x40, 0x00, 0x00, 0x00,
-  0x89, 0x70, 0x00, 0x00, 0x00, 0x00,
-  0x8c, 0x23, 0x00, 0x00, 0x00, 0x00,
-  0x47, 0x19, 0x80, 0x00, 0x00, 0x00,
-  0x81, 0x88, 0x60, 0x00, 0x00, 0x00,
-  0x12, 0x86, 0x20, 0x00, 0x00, 0x00,
-  0x58, 0x14, 0x40, 0x00, 0x00, 0x00,
-  0x28, 0xca, 0x00, 0x00, 0x00, 0x00,
-  0x34, 0x60, 0x80, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom19_14[84] = {
-  0x8c, 0x23, 0x00, 0x00, 0x00, 0x00,
-  0x47, 0x19, 0x80, 0x00, 0x00, 0x00,
-  0x81, 0x88, 0x60, 0x00, 0x00, 0x00,
-  0x12, 0x86, 0x20, 0x00, 0x00, 0x00,
-  0x58, 0x14, 0x40, 0x00, 0x00, 0x00,
-  0x28, 0xca, 0x00, 0x00, 0x00, 0x00,
-  0x34, 0x60, 0x80, 0x00, 0x00, 0x00,
-  0x84, 0x87, 0x00, 0x00, 0x00, 0x00,
-  0x27, 0x19, 0x80, 0x00, 0x00, 0x00,
-  0x51, 0x88, 0x60, 0x00, 0x00, 0x00,
-  0x1a, 0x22, 0xa0, 0x00, 0x00, 0x00,
-  0x68, 0x44, 0x40, 0x00, 0x00, 0x00,
-  0x89, 0x70, 0x00, 0x00, 0x00, 0x00,
-  0x6e, 0x27, 0x60, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom19_15[90] = {
-  0x8c, 0x23, 0x00, 0x00, 0x00, 0x00,
-  0x47, 0x19, 0x80, 0x00, 0x00, 0x00,
-  0x81, 0x88, 0x60, 0x00, 0x00, 0x00,
-  0x12, 0x86, 0x20, 0x00, 0x00, 0x00,
-  0x58, 0x14, 0x40, 0x00, 0x00, 0x00,
-  0x28, 0xca, 0x00, 0x00, 0x00, 0x00,
-  0x34, 0x60, 0x80, 0x00, 0x00, 0x00,
-  0x2c, 0x16, 0x00, 0x00, 0x00, 0x00,
-  0x91, 0x40, 0xc0, 0x00, 0x00, 0x00,
-  0xc0, 0xd0, 0x20, 0x00, 0x00, 0x00,
-  0x06, 0x82, 0xa0, 0x00, 0x00, 0x00,
-  0xc8, 0x0c, 0x40, 0x00, 0x00, 0x00,
-  0x45, 0x61, 0x00, 0x00, 0x00, 0x00,
-  0x30, 0x91, 0x40, 0x00, 0x00, 0x00,
-  0xa2, 0x28, 0x20, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom19_16[96] = {
-  0x2c, 0x16, 0x00, 0x00, 0x00, 0x00,
-  0x91, 0x40, 0xc0, 0x00, 0x00, 0x00,
-  0xc0, 0xd0, 0x20, 0x00, 0x00, 0x00,
-  0x06, 0x82, 0xa0, 0x00, 0x00, 0x00,
-  0xc8, 0x0c, 0x40, 0x00, 0x00, 0x00,
-  0x45, 0x61, 0x00, 0x00, 0x00, 0x00,
-  0x30, 0x91, 0x40, 0x00, 0x00, 0x00,
-  0xa2, 0x28, 0x20, 0x00, 0x00, 0x00,
-  0x8c, 0x23, 0x00, 0x00, 0x00, 0x00,
-  0x47, 0x19, 0x80, 0x00, 0x00, 0x00,
-  0x81, 0x88, 0x60, 0x00, 0x00, 0x00,
-  0x12, 0x86, 0x20, 0x00, 0x00, 0x00,
-  0x58, 0x14, 0x40, 0x00, 0x00, 0x00,
-  0x28, 0xca, 0x00, 0x00, 0x00, 0x00,
-  0x34, 0x60, 0x80, 0x00, 0x00, 0x00,
-  0x7e, 0x75, 0xe0, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom19_17[102] = {
-  0x2c, 0x16, 0x00, 0x00, 0x00, 0x00,
-  0x91, 0x40, 0xc0, 0x00, 0x00, 0x00,
-  0xc0, 0xd0, 0x20, 0x00, 0x00, 0x00,
-  0x06, 0x82, 0xa0, 0x00, 0x00, 0x00,
-  0xc8, 0x0c, 0x40, 0x00, 0x00, 0x00,
-  0x45, 0x61, 0x00, 0x00, 0x00, 0x00,
-  0x30, 0x91, 0x40, 0x00, 0x00, 0x00,
-  0xa2, 0x28, 0x20, 0x00, 0x00, 0x00,
-  0x4c, 0x27, 0x00, 0x00, 0x00, 0x00,
-  0x66, 0x71, 0x80, 0x00, 0x00, 0x00,
-  0x91, 0x40, 0xe0, 0x00, 0x00, 0x00,
-  0x42, 0x90, 0xa0, 0x00, 0x00, 0x00,
-  0xa4, 0x29, 0x40, 0x00, 0x00, 0x00,
-  0x13, 0x5a, 0x00, 0x00, 0x00, 0x00,
-  0x30, 0x93, 0x40, 0x00, 0x00, 0x00,
-  0x88, 0xac, 0x20, 0x00, 0x00, 0x00,
-  0x09, 0x0c, 0xc0, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom19_18[108] = {
-  0x4c, 0x27, 0x00, 0x00, 0x00, 0x00,
-  0x66, 0x71, 0x80, 0x00, 0x00, 0x00,
-  0x91, 0x40, 0xe0, 0x00, 0x00, 0x00,
-  0x42, 0x90, 0xa0, 0x00, 0x00, 0x00,
-  0xa4, 0x29, 0x40, 0x00, 0x00, 0x00,
-  0x13, 0x5a, 0x00, 0x00, 0x00, 0x00,
-  0x30, 0x93, 0x40, 0x00, 0x00, 0x00,
-  0x88, 0xac, 0x20, 0x00, 0x00, 0x00,
-  0x09, 0x0c, 0xc0, 0x00, 0x00, 0x00,
-  0x2c, 0x16, 0x00, 0x00, 0x00, 0x00,
-  0x91, 0x40, 0xc0, 0x00, 0x00, 0x00,
-  0xc0, 0xd0, 0x20, 0x00, 0x00, 0x00,
-  0x06, 0x82, 0xa0, 0x00, 0x00, 0x00,
-  0xc8, 0x0c, 0x40, 0x00, 0x00, 0x00,
-  0x45, 0x61, 0x00, 0x00, 0x00, 0x00,
-  0x30, 0x91, 0x40, 0x00, 0x00, 0x00,
-  0xa2, 0x28, 0x20, 0x00, 0x00, 0x00,
-  0x51, 0x97, 0x20, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom19_19[114] = {
-  0x4c, 0x27, 0x00, 0x00, 0x00, 0x00,
-  0x66, 0x71, 0x80, 0x00, 0x00, 0x00,
-  0x91, 0x40, 0xe0, 0x00, 0x00, 0x00,
-  0x42, 0x90, 0xa0, 0x00, 0x00, 0x00,
-  0xa4, 0x29, 0x40, 0x00, 0x00, 0x00,
-  0x13, 0x5a, 0x00, 0x00, 0x00, 0x00,
-  0x30, 0x93, 0x40, 0x00, 0x00, 0x00,
-  0x88, 0xac, 0x20, 0x00, 0x00, 0x00,
-  0x09, 0x0c, 0xc0, 0x00, 0x00, 0x00,
-  0x4c, 0x26, 0x00, 0x00, 0x00, 0x00,
-  0x66, 0x28, 0x80, 0x00, 0x00, 0x00,
-  0x91, 0x50, 0x20, 0x00, 0x00, 0x00,
-  0x42, 0x82, 0x60, 0x00, 0x00, 0x00,
-  0xa4, 0x01, 0xc0, 0x00, 0x00, 0x00,
-  0x13, 0x43, 0x00, 0x00, 0x00, 0x00,
-  0x30, 0x94, 0x80, 0x00, 0x00, 0x00,
-  0x88, 0xa1, 0x20, 0x00, 0x00, 0x00,
-  0x09, 0x4c, 0x00, 0x00, 0x00, 0x00,
-  0xcd, 0x98, 0x40, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom19_2[12] = {
-  0xce, 0x77, 0x00, 0x00, 0x00, 0x00,
-  0x39, 0xcc, 0xe0, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom19_3[18] = {
-  0xcc, 0x67, 0x00, 0x00, 0x00, 0x00,
-  0x27, 0x2c, 0xc0, 0x00, 0x00, 0x00,
-  0x92, 0xd2, 0x60, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom19_4[24] = {
-  0xec, 0x73, 0x00, 0x00, 0x00, 0x00,
-  0x67, 0x19, 0xc0, 0x00, 0x00, 0x00,
-  0xb1, 0xcc, 0x60, 0x00, 0x00, 0x00,
-  0x5a, 0x96, 0xa0, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom19_5[30] = {
-  0x4c, 0xe7, 0x00, 0x00, 0x00, 0x00,
-  0x66, 0x31, 0xc0, 0x00, 0x00, 0x00,
-  0xa1, 0xcc, 0x60, 0x00, 0x00, 0x00,
-  0x92, 0xa6, 0xa0, 0x00, 0x00, 0x00,
-  0xb8, 0x99, 0x80, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom19_6[36] = {
-  0x4c, 0x36, 0x00, 0x00, 0x00, 0x00,
-  0x45, 0x68, 0x80, 0x00, 0x00, 0x00,
-  0x30, 0xd0, 0x60, 0x00, 0x00, 0x00,
-  0x8a, 0x82, 0xa0, 0x00, 0x00, 0x00,
-  0x26, 0x0b, 0x40, 0x00, 0x00, 0x00,
-  0x95, 0x45, 0x00, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom19_7[42] = {
-  0xc4, 0xa3, 0x00, 0x00, 0x00, 0x00,
-  0x23, 0x19, 0x80, 0x00, 0x00, 0x00,
-  0x91, 0x1c, 0x20, 0x00, 0x00, 0x00,
-  0x4a, 0x82, 0xa0, 0x00, 0x00, 0x00,
-  0x34, 0x49, 0x40, 0x00, 0x00, 0x00,
-  0x8b, 0x4a, 0x00, 0x00, 0x00, 0x00,
-  0xc8, 0x24, 0xc0, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom19_8[48] = {
-  0x16, 0x13, 0x80, 0x00, 0x00, 0x00,
-  0xc2, 0x44, 0xc0, 0x00, 0x00, 0x00,
-  0x60, 0xe8, 0x20, 0x00, 0x00, 0x00,
-  0x85, 0x12, 0x60, 0x00, 0x00, 0x00,
-  0xcc, 0x21, 0x40, 0x00, 0x00, 0x00,
-  0x29, 0x63, 0x00, 0x00, 0x00, 0x00,
-  0x11, 0x98, 0xc0, 0x00, 0x00, 0x00,
-  0xb0, 0x0c, 0x60, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom19_9[54] = {
-  0x44, 0xa7, 0x00, 0x00, 0x00, 0x00,
-  0x66, 0x70, 0x80, 0x00, 0x00, 0x00,
-  0x12, 0xc0, 0xe0, 0x00, 0x00, 0x00,
-  0xc3, 0x10, 0xa0, 0x00, 0x00, 0x00,
-  0x8c, 0x29, 0x40, 0x00, 0x00, 0x00,
-  0x11, 0x5b, 0x00, 0x00, 0x00, 0x00,
-  0x21, 0x93, 0x40, 0x00, 0x00, 0x00,
-  0xa2, 0x2c, 0x00, 0x00, 0x00, 0x00,
-  0x18, 0x0c, 0xe0, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom1_1[2] = {
-  0x80, 0x00
-};
-
-const uint8_t kMaskRandom20_1[6] = {
-  0xff, 0xff, 0xf0, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom20_10[60] = {
-  0x4c, 0x13, 0x00, 0x00, 0x00, 0x00,
-  0x51, 0x14, 0x40, 0x00, 0x00, 0x00,
-  0xa0, 0x68, 0x10, 0x00, 0x00, 0x00,
-  0x04, 0xc1, 0x30, 0x00, 0x00, 0x00,
-  0x03, 0x80, 0xe0, 0x00, 0x00, 0x00,
-  0x86, 0x21, 0x80, 0x00, 0x00, 0x00,
-  0x29, 0x0a, 0x40, 0x00, 0x00, 0x00,
-  0x42, 0x50, 0x90, 0x00, 0x00, 0x00,
-  0x98, 0x26, 0x00, 0x00, 0x00, 0x00,
-  0x30, 0x8c, 0x20, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom20_11[66] = {
-  0xc6, 0x31, 0x80, 0x00, 0x00, 0x00,
-  0x23, 0x88, 0xe0, 0x00, 0x00, 0x00,
-  0x1a, 0x46, 0x90, 0x00, 0x00, 0x00,
-  0x24, 0xc9, 0x30, 0x00, 0x00, 0x00,
-  0x71, 0x1c, 0x40, 0x00, 0x00, 0x00,
-  0x0e, 0x03, 0x80, 0x00, 0x00, 0x00,
-  0x33, 0x0c, 0xc0, 0x00, 0x00, 0x00,
-  0x10, 0xc4, 0x30, 0x00, 0x00, 0x00,
-  0x45, 0x51, 0x50, 0x00, 0x00, 0x00,
-  0x88, 0xa2, 0x20, 0x00, 0x00, 0x00,
-  0xe0, 0x38, 0x00, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom20_12[72] = {
-  0x0e, 0x03, 0x80, 0x00, 0x00, 0x00,
-  0x33, 0x0c, 0xc0, 0x00, 0x00, 0x00,
-  0x10, 0xc4, 0x30, 0x00, 0x00, 0x00,
-  0x45, 0x51, 0x50, 0x00, 0x00, 0x00,
-  0x88, 0xa2, 0x20, 0x00, 0x00, 0x00,
-  0xe0, 0x38, 0x00, 0x00, 0x00, 0x00,
-  0xc6, 0x31, 0x80, 0x00, 0x00, 0x00,
-  0x23, 0x88, 0xe0, 0x00, 0x00, 0x00,
-  0x1a, 0x46, 0x90, 0x00, 0x00, 0x00,
-  0x24, 0xc9, 0x30, 0x00, 0x00, 0x00,
-  0x71, 0x1c, 0x40, 0x00, 0x00, 0x00,
-  0xf5, 0xdc, 0x40, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom20_13[78] = {
-  0x0e, 0x03, 0x80, 0x00, 0x00, 0x00,
-  0x33, 0x0c, 0xc0, 0x00, 0x00, 0x00,
-  0x10, 0xc4, 0x30, 0x00, 0x00, 0x00,
-  0x45, 0x51, 0x50, 0x00, 0x00, 0x00,
-  0x88, 0xa2, 0x20, 0x00, 0x00, 0x00,
-  0xe0, 0x38, 0x00, 0x00, 0x00, 0x00,
-  0x46, 0x11, 0x80, 0x00, 0x00, 0x00,
-  0x33, 0x0c, 0xc0, 0x00, 0x00, 0x00,
-  0x10, 0xc4, 0x30, 0x00, 0x00, 0x00,
-  0x0c, 0x43, 0x10, 0x00, 0x00, 0x00,
-  0x28, 0x8a, 0x20, 0x00, 0x00, 0x00,
-  0x94, 0x25, 0x00, 0x00, 0x00, 0x00,
-  0xc1, 0x30, 0x40, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom20_14[84] = {
-  0x46, 0x11, 0x80, 0x00, 0x00, 0x00,
-  0x33, 0x0c, 0xc0, 0x00, 0x00, 0x00,
-  0x10, 0xc4, 0x30, 0x00, 0x00, 0x00,
-  0x0c, 0x43, 0x10, 0x00, 0x00, 0x00,
-  0x28, 0x8a, 0x20, 0x00, 0x00, 0x00,
-  0x94, 0x25, 0x00, 0x00, 0x00, 0x00,
-  0xc1, 0x30, 0x40, 0x00, 0x00, 0x00,
-  0x0e, 0x03, 0x80, 0x00, 0x00, 0x00,
-  0x33, 0x0c, 0xc0, 0x00, 0x00, 0x00,
-  0x10, 0xc4, 0x30, 0x00, 0x00, 0x00,
-  0x45, 0x51, 0x50, 0x00, 0x00, 0x00,
-  0x88, 0xa2, 0x20, 0x00, 0x00, 0x00,
-  0xe0, 0x38, 0x00, 0x00, 0x00, 0x00,
-  0x56, 0x3e, 0x20, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom20_15[90] = {
-  0x46, 0x11, 0x80, 0x00, 0x00, 0x00,
-  0x33, 0x0c, 0xc0, 0x00, 0x00, 0x00,
-  0x10, 0xc4, 0x30, 0x00, 0x00, 0x00,
-  0x0c, 0x43, 0x10, 0x00, 0x00, 0x00,
-  0x28, 0x8a, 0x20, 0x00, 0x00, 0x00,
-  0x94, 0x25, 0x00, 0x00, 0x00, 0x00,
-  0xc1, 0x30, 0x40, 0x00, 0x00, 0x00,
-  0x2c, 0x0b, 0x00, 0x00, 0x00, 0x00,
-  0x81, 0xa0, 0x60, 0x00, 0x00, 0x00,
-  0xa0, 0x68, 0x10, 0x00, 0x00, 0x00,
-  0x05, 0x41, 0x50, 0x00, 0x00, 0x00,
-  0x18, 0x86, 0x20, 0x00, 0x00, 0x00,
-  0xc2, 0x30, 0x80, 0x00, 0x00, 0x00,
-  0x22, 0x88, 0xa0, 0x00, 0x00, 0x00,
-  0x50, 0x54, 0x10, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom20_16[96] = {
-  0x2c, 0x0b, 0x00, 0x00, 0x00, 0x00,
-  0x81, 0xa0, 0x60, 0x00, 0x00, 0x00,
-  0xa0, 0x68, 0x10, 0x00, 0x00, 0x00,
-  0x05, 0x41, 0x50, 0x00, 0x00, 0x00,
-  0x18, 0x86, 0x20, 0x00, 0x00, 0x00,
-  0xc2, 0x30, 0x80, 0x00, 0x00, 0x00,
-  0x22, 0x88, 0xa0, 0x00, 0x00, 0x00,
-  0x50, 0x54, 0x10, 0x00, 0x00, 0x00,
-  0x46, 0x11, 0x80, 0x00, 0x00, 0x00,
-  0x33, 0x0c, 0xc0, 0x00, 0x00, 0x00,
-  0x10, 0xc4, 0x30, 0x00, 0x00, 0x00,
-  0x0c, 0x43, 0x10, 0x00, 0x00, 0x00,
-  0x28, 0x8a, 0x20, 0x00, 0x00, 0x00,
-  0x94, 0x25, 0x00, 0x00, 0x00, 0x00,
-  0xc1, 0x30, 0x40, 0x00, 0x00, 0x00,
-  0x28, 0x1c, 0x60, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom20_17[102] = {
-  0x2c, 0x0b, 0x00, 0x00, 0x00, 0x00,
-  0x81, 0xa0, 0x60, 0x00, 0x00, 0x00,
-  0xa0, 0x68, 0x10, 0x00, 0x00, 0x00,
-  0x05, 0x41, 0x50, 0x00, 0x00, 0x00,
-  0x18, 0x86, 0x20, 0x00, 0x00, 0x00,
-  0xc2, 0x30, 0x80, 0x00, 0x00, 0x00,
-  0x22, 0x88, 0xa0, 0x00, 0x00, 0x00,
-  0x50, 0x54, 0x10, 0x00, 0x00, 0x00,
-  0x4e, 0x13, 0x80, 0x00, 0x00, 0x00,
-  0xe3, 0x38, 0xc0, 0x00, 0x00, 0x00,
-  0x81, 0xe0, 0x70, 0x00, 0x00, 0x00,
-  0x21, 0x48, 0x50, 0x00, 0x00, 0x00,
-  0x52, 0x94, 0xa0, 0x00, 0x00, 0x00,
-  0xb4, 0x2d, 0x00, 0x00, 0x00, 0x00,
-  0x26, 0x89, 0xa0, 0x00, 0x00, 0x00,
-  0x58, 0x56, 0x10, 0x00, 0x00, 0x00,
-  0x19, 0x86, 0x60, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom20_18[108] = {
-  0x4e, 0x13, 0x80, 0x00, 0x00, 0x00,
-  0xe3, 0x38, 0xc0, 0x00, 0x00, 0x00,
-  0x81, 0xe0, 0x70, 0x00, 0x00, 0x00,
-  0x21, 0x48, 0x50, 0x00, 0x00, 0x00,
-  0x52, 0x94, 0xa0, 0x00, 0x00, 0x00,
-  0xb4, 0x2d, 0x00, 0x00, 0x00, 0x00,
-  0x26, 0x89, 0xa0, 0x00, 0x00, 0x00,
-  0x58, 0x56, 0x10, 0x00, 0x00, 0x00,
-  0x19, 0x86, 0x60, 0x00, 0x00, 0x00,
-  0x2c, 0x0b, 0x00, 0x00, 0x00, 0x00,
-  0x81, 0xa0, 0x60, 0x00, 0x00, 0x00,
-  0xa0, 0x68, 0x10, 0x00, 0x00, 0x00,
-  0x05, 0x41, 0x50, 0x00, 0x00, 0x00,
-  0x18, 0x86, 0x20, 0x00, 0x00, 0x00,
-  0xc2, 0x30, 0x80, 0x00, 0x00, 0x00,
-  0x22, 0x88, 0xa0, 0x00, 0x00, 0x00,
-  0x50, 0x54, 0x10, 0x00, 0x00, 0x00,
-  0x21, 0x7b, 0xf0, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom20_19[114] = {
-  0x4e, 0x13, 0x80, 0x00, 0x00, 0x00,
-  0xe3, 0x38, 0xc0, 0x00, 0x00, 0x00,
-  0x81, 0xe0, 0x70, 0x00, 0x00, 0x00,
-  0x21, 0x48, 0x50, 0x00, 0x00, 0x00,
-  0x52, 0x94, 0xa0, 0x00, 0x00, 0x00,
-  0xb4, 0x2d, 0x00, 0x00, 0x00, 0x00,
-  0x26, 0x89, 0xa0, 0x00, 0x00, 0x00,
-  0x58, 0x56, 0x10, 0x00, 0x00, 0x00,
-  0x19, 0x86, 0x60, 0x00, 0x00, 0x00,
-  0x4c, 0x13, 0x00, 0x00, 0x00, 0x00,
-  0x51, 0x14, 0x40, 0x00, 0x00, 0x00,
-  0xa0, 0x68, 0x10, 0x00, 0x00, 0x00,
-  0x04, 0xc1, 0x30, 0x00, 0x00, 0x00,
-  0x03, 0x80, 0xe0, 0x00, 0x00, 0x00,
-  0x86, 0x21, 0x80, 0x00, 0x00, 0x00,
-  0x29, 0x0a, 0x40, 0x00, 0x00, 0x00,
-  0x42, 0x50, 0x90, 0x00, 0x00, 0x00,
-  0x98, 0x26, 0x00, 0x00, 0x00, 0x00,
-  0x30, 0x8c, 0x20, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom20_2[12] = {
-  0xee, 0x3b, 0x80, 0x00, 0x00, 0x00,
-  0x99, 0xe6, 0x70, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom20_20[120] = {
-  0x4c, 0x13, 0x00, 0x00, 0x00, 0x00,
-  0x51, 0x14, 0x40, 0x00, 0x00, 0x00,
-  0xa0, 0x68, 0x10, 0x00, 0x00, 0x00,
-  0x04, 0xc1, 0x30, 0x00, 0x00, 0x00,
-  0x03, 0x80, 0xe0, 0x00, 0x00, 0x00,
-  0x86, 0x21, 0x80, 0x00, 0x00, 0x00,
-  0x29, 0x0a, 0x40, 0x00, 0x00, 0x00,
-  0x42, 0x50, 0x90, 0x00, 0x00, 0x00,
-  0x98, 0x26, 0x00, 0x00, 0x00, 0x00,
-  0x30, 0x8c, 0x20, 0x00, 0x00, 0x00,
-  0x4e, 0x13, 0x80, 0x00, 0x00, 0x00,
-  0xe3, 0x38, 0xc0, 0x00, 0x00, 0x00,
-  0x81, 0xe0, 0x70, 0x00, 0x00, 0x00,
-  0x21, 0x48, 0x50, 0x00, 0x00, 0x00,
-  0x52, 0x94, 0xa0, 0x00, 0x00, 0x00,
-  0xb4, 0x2d, 0x00, 0x00, 0x00, 0x00,
-  0x26, 0x89, 0xa0, 0x00, 0x00, 0x00,
-  0x58, 0x56, 0x10, 0x00, 0x00, 0x00,
-  0x19, 0x86, 0x60, 0x00, 0x00, 0x00,
-  0xf7, 0x8d, 0xa0, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom20_3[18] = {
-  0xce, 0x33, 0x80, 0x00, 0x00, 0x00,
-  0x55, 0x95, 0x60, 0x00, 0x00, 0x00,
-  0xb1, 0x6a, 0x30, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom20_4[24] = {
-  0xe6, 0x39, 0x80, 0x00, 0x00, 0x00,
-  0x33, 0x8c, 0xe0, 0x00, 0x00, 0x00,
-  0x98, 0xe6, 0x30, 0x00, 0x00, 0x00,
-  0x2d, 0x4b, 0x50, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom20_5[30] = {
-  0xce, 0x33, 0x80, 0x00, 0x00, 0x00,
-  0x63, 0x98, 0xe0, 0x00, 0x00, 0x00,
-  0x98, 0xe5, 0x30, 0x00, 0x00, 0x00,
-  0x2b, 0x53, 0x50, 0x00, 0x00, 0x00,
-  0xb4, 0x5c, 0xa0, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom20_6[36] = {
-  0x4c, 0x1b, 0x00, 0x00, 0x00, 0x00,
-  0x51, 0x34, 0x40, 0x00, 0x00, 0x00,
-  0x20, 0xe8, 0x30, 0x00, 0x00, 0x00,
-  0x85, 0x41, 0x50, 0x00, 0x00, 0x00,
-  0x06, 0x86, 0xa0, 0x00, 0x00, 0x00,
-  0x9a, 0x21, 0x80, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom20_7[42] = {
-  0x4e, 0x11, 0x80, 0x00, 0x00, 0x00,
-  0x33, 0x2c, 0x00, 0x00, 0x00, 0x00,
-  0x10, 0x0e, 0xb0, 0x00, 0x00, 0x00,
-  0x81, 0x51, 0x50, 0x00, 0x00, 0x00,
-  0x24, 0xc4, 0xa0, 0x00, 0x00, 0x00,
-  0xd4, 0x23, 0x00, 0x00, 0x00, 0x00,
-  0x0c, 0xa2, 0x60, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom20_8[48] = {
-  0x27, 0x09, 0xc0, 0x00, 0x00, 0x00,
-  0x89, 0xa2, 0x60, 0x00, 0x00, 0x00,
-  0xd0, 0x74, 0x10, 0x00, 0x00, 0x00,
-  0x24, 0xc9, 0x30, 0x00, 0x00, 0x00,
-  0xe2, 0x90, 0xa0, 0x00, 0x00, 0x00,
-  0xc6, 0x31, 0x80, 0x00, 0x00, 0x00,
-  0x31, 0x8c, 0x60, 0x00, 0x00, 0x00,
-  0x18, 0xc6, 0x30, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom20_9[54] = {
-  0x4e, 0x13, 0x80, 0x00, 0x00, 0x00,
-  0x62, 0x38, 0xc0, 0x00, 0x00, 0x00,
-  0x81, 0xe0, 0x70, 0x00, 0x00, 0x00,
-  0xe1, 0x48, 0x50, 0x00, 0x00, 0x00,
-  0x13, 0x94, 0xa0, 0x00, 0x00, 0x00,
-  0xb4, 0x2d, 0x00, 0x00, 0x00, 0x00,
-  0x26, 0x89, 0xa0, 0x00, 0x00, 0x00,
-  0x58, 0x56, 0x10, 0x00, 0x00, 0x00,
-  0x49, 0x86, 0x50, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom21_1[6] = {
-  0xff, 0xff, 0xf8, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom21_10[60] = {
-  0x4c, 0x19, 0x10, 0x00, 0x00, 0x00,
-  0x51, 0x14, 0x50, 0x00, 0x00, 0x00,
-  0xa0, 0x6a, 0x40, 0x00, 0x00, 0x00,
-  0x04, 0xc1, 0x30, 0x00, 0x00, 0x00,
-  0x03, 0xb4, 0x00, 0x00, 0x00, 0x00,
-  0x86, 0x20, 0x90, 0x00, 0x00, 0x00,
-  0x29, 0x08, 0x48, 0x00, 0x00, 0x00,
-  0x42, 0x43, 0x08, 0x00, 0x00, 0x00,
-  0x98, 0x12, 0x80, 0x00, 0x00, 0x00,
-  0x30, 0x84, 0xa8, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom21_11[66] = {
-  0xc6, 0x21, 0xa0, 0x00, 0x00, 0x00,
-  0x23, 0x88, 0xc8, 0x00, 0x00, 0x00,
-  0x1a, 0x45, 0x88, 0x00, 0x00, 0x00,
-  0x24, 0xd3, 0x08, 0x00, 0x00, 0x00,
-  0x71, 0x10, 0x70, 0x00, 0x00, 0x00,
-  0x0e, 0x19, 0x10, 0x00, 0x00, 0x00,
-  0x33, 0x14, 0x50, 0x00, 0x00, 0x00,
-  0x10, 0xc3, 0x28, 0x00, 0x00, 0x00,
-  0x45, 0x68, 0x48, 0x00, 0x00, 0x00,
-  0x88, 0x84, 0xa8, 0x00, 0x00, 0x00,
-  0xe0, 0x22, 0x90, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom21_12[72] = {
-  0x0e, 0x19, 0x10, 0x00, 0x00, 0x00,
-  0x33, 0x14, 0x50, 0x00, 0x00, 0x00,
-  0x10, 0xc3, 0x28, 0x00, 0x00, 0x00,
-  0x45, 0x68, 0x48, 0x00, 0x00, 0x00,
-  0x88, 0x84, 0xa8, 0x00, 0x00, 0x00,
-  0xe0, 0x22, 0x90, 0x00, 0x00, 0x00,
-  0xc6, 0x21, 0xa0, 0x00, 0x00, 0x00,
-  0x23, 0x88, 0xc8, 0x00, 0x00, 0x00,
-  0x1a, 0x45, 0x88, 0x00, 0x00, 0x00,
-  0x24, 0xd3, 0x08, 0x00, 0x00, 0x00,
-  0x71, 0x10, 0x70, 0x00, 0x00, 0x00,
-  0xa0, 0x65, 0x18, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom21_13[78] = {
-  0x0e, 0x19, 0x10, 0x00, 0x00, 0x00,
-  0x33, 0x14, 0x50, 0x00, 0x00, 0x00,
-  0x10, 0xc3, 0x28, 0x00, 0x00, 0x00,
-  0x45, 0x68, 0x48, 0x00, 0x00, 0x00,
-  0x88, 0x84, 0xa8, 0x00, 0x00, 0x00,
-  0xe0, 0x22, 0x90, 0x00, 0x00, 0x00,
-  0x46, 0x11, 0x90, 0x00, 0x00, 0x00,
-  0x33, 0x0c, 0xc8, 0x00, 0x00, 0x00,
-  0x10, 0xe4, 0x60, 0x00, 0x00, 0x00,
-  0x0c, 0x69, 0x08, 0x00, 0x00, 0x00,
-  0x28, 0x94, 0x28, 0x00, 0x00, 0x00,
-  0x94, 0x21, 0x30, 0x00, 0x00, 0x00,
-  0xc1, 0x02, 0x58, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom21_14[84] = {
-  0x46, 0x11, 0x90, 0x00, 0x00, 0x00,
-  0x33, 0x0c, 0xc8, 0x00, 0x00, 0x00,
-  0x10, 0xe4, 0x60, 0x00, 0x00, 0x00,
-  0x0c, 0x69, 0x08, 0x00, 0x00, 0x00,
-  0x28, 0x94, 0x28, 0x00, 0x00, 0x00,
-  0x94, 0x21, 0x30, 0x00, 0x00, 0x00,
-  0xc1, 0x02, 0x58, 0x00, 0x00, 0x00,
-  0x0e, 0x19, 0x10, 0x00, 0x00, 0x00,
-  0x33, 0x14, 0x50, 0x00, 0x00, 0x00,
-  0x10, 0xc3, 0x28, 0x00, 0x00, 0x00,
-  0x45, 0x68, 0x48, 0x00, 0x00, 0x00,
-  0x88, 0x84, 0xa8, 0x00, 0x00, 0x00,
-  0xe0, 0x22, 0x90, 0x00, 0x00, 0x00,
-  0x4d, 0xd0, 0xc0, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom21_15[90] = {
-  0x46, 0x11, 0x90, 0x00, 0x00, 0x00,
-  0x33, 0x0c, 0xc8, 0x00, 0x00, 0x00,
-  0x10, 0xe4, 0x60, 0x00, 0x00, 0x00,
-  0x0c, 0x69, 0x08, 0x00, 0x00, 0x00,
-  0x28, 0x94, 0x28, 0x00, 0x00, 0x00,
-  0x94, 0x21, 0x30, 0x00, 0x00, 0x00,
-  0xc1, 0x02, 0x58, 0x00, 0x00, 0x00,
-  0x2c, 0x03, 0x20, 0x00, 0x00, 0x00,
-  0x81, 0xa0, 0x18, 0x00, 0x00, 0x00,
-  0xa0, 0x68, 0x20, 0x00, 0x00, 0x00,
-  0x05, 0x41, 0x50, 0x00, 0x00, 0x00,
-  0x18, 0x90, 0xc0, 0x00, 0x00, 0x00,
-  0xc2, 0x06, 0x80, 0x00, 0x00, 0x00,
-  0x22, 0x98, 0x08, 0x00, 0x00, 0x00,
-  0x50, 0x45, 0x08, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom21_16[96] = {
-  0x2c, 0x03, 0x20, 0x00, 0x00, 0x00,
-  0x81, 0xa0, 0x18, 0x00, 0x00, 0x00,
-  0xa0, 0x68, 0x20, 0x00, 0x00, 0x00,
-  0x05, 0x41, 0x50, 0x00, 0x00, 0x00,
-  0x18, 0x90, 0xc0, 0x00, 0x00, 0x00,
-  0xc2, 0x06, 0x80, 0x00, 0x00, 0x00,
-  0x22, 0x98, 0x08, 0x00, 0x00, 0x00,
-  0x50, 0x45, 0x08, 0x00, 0x00, 0x00,
-  0x46, 0x11, 0x90, 0x00, 0x00, 0x00,
-  0x33, 0x0c, 0xc8, 0x00, 0x00, 0x00,
-  0x10, 0xe4, 0x60, 0x00, 0x00, 0x00,
-  0x0c, 0x69, 0x08, 0x00, 0x00, 0x00,
-  0x28, 0x94, 0x28, 0x00, 0x00, 0x00,
-  0x94, 0x21, 0x30, 0x00, 0x00, 0x00,
-  0xc1, 0x02, 0x58, 0x00, 0x00, 0x00,
-  0x3b, 0xf5, 0x38, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom21_17[102] = {
-  0x2c, 0x03, 0x20, 0x00, 0x00, 0x00,
-  0x81, 0xa0, 0x18, 0x00, 0x00, 0x00,
-  0xa0, 0x68, 0x20, 0x00, 0x00, 0x00,
-  0x05, 0x41, 0x50, 0x00, 0x00, 0x00,
-  0x18, 0x90, 0xc0, 0x00, 0x00, 0x00,
-  0xc2, 0x06, 0x80, 0x00, 0x00, 0x00,
-  0x22, 0x98, 0x08, 0x00, 0x00, 0x00,
-  0x50, 0x45, 0x08, 0x00, 0x00, 0x00,
-  0x4e, 0x11, 0x90, 0x00, 0x00, 0x00,
-  0xe3, 0x18, 0x98, 0x00, 0x00, 0x00,
-  0x81, 0xe3, 0x00, 0x00, 0x00, 0x00,
-  0x21, 0x40, 0x58, 0x00, 0x00, 0x00,
-  0x52, 0x81, 0xe0, 0x00, 0x00, 0x00,
-  0xb4, 0x28, 0x20, 0x00, 0x00, 0x00,
-  0x26, 0x86, 0x28, 0x00, 0x00, 0x00,
-  0x58, 0x64, 0x40, 0x00, 0x00, 0x00,
-  0x19, 0x9e, 0x00, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom21_18[108] = {
-  0x4e, 0x11, 0x90, 0x00, 0x00, 0x00,
-  0xe3, 0x18, 0x98, 0x00, 0x00, 0x00,
-  0x81, 0xe3, 0x00, 0x00, 0x00, 0x00,
-  0x21, 0x40, 0x58, 0x00, 0x00, 0x00,
-  0x52, 0x81, 0xe0, 0x00, 0x00, 0x00,
-  0xb4, 0x28, 0x20, 0x00, 0x00, 0x00,
-  0x26, 0x86, 0x28, 0x00, 0x00, 0x00,
-  0x58, 0x64, 0x40, 0x00, 0x00, 0x00,
-  0x19, 0x9e, 0x00, 0x00, 0x00, 0x00,
-  0x2c, 0x03, 0x20, 0x00, 0x00, 0x00,
-  0x81, 0xa0, 0x18, 0x00, 0x00, 0x00,
-  0xa0, 0x68, 0x20, 0x00, 0x00, 0x00,
-  0x05, 0x41, 0x50, 0x00, 0x00, 0x00,
-  0x18, 0x90, 0xc0, 0x00, 0x00, 0x00,
-  0xc2, 0x06, 0x80, 0x00, 0x00, 0x00,
-  0x22, 0x98, 0x08, 0x00, 0x00, 0x00,
-  0x50, 0x45, 0x08, 0x00, 0x00, 0x00,
-  0x5a, 0x56, 0x58, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom21_19[114] = {
-  0x4e, 0x11, 0x90, 0x00, 0x00, 0x00,
-  0xe3, 0x18, 0x98, 0x00, 0x00, 0x00,
-  0x81, 0xe3, 0x00, 0x00, 0x00, 0x00,
-  0x21, 0x40, 0x58, 0x00, 0x00, 0x00,
-  0x52, 0x81, 0xe0, 0x00, 0x00, 0x00,
-  0xb4, 0x28, 0x20, 0x00, 0x00, 0x00,
-  0x26, 0x86, 0x28, 0x00, 0x00, 0x00,
-  0x58, 0x64, 0x40, 0x00, 0x00, 0x00,
-  0x19, 0x9e, 0x00, 0x00, 0x00, 0x00,
-  0x4c, 0x19, 0x10, 0x00, 0x00, 0x00,
-  0x51, 0x14, 0x50, 0x00, 0x00, 0x00,
-  0xa0, 0x6a, 0x40, 0x00, 0x00, 0x00,
-  0x04, 0xc1, 0x30, 0x00, 0x00, 0x00,
-  0x03, 0xb4, 0x00, 0x00, 0x00, 0x00,
-  0x86, 0x20, 0x90, 0x00, 0x00, 0x00,
-  0x29, 0x08, 0x48, 0x00, 0x00, 0x00,
-  0x42, 0x43, 0x08, 0x00, 0x00, 0x00,
-  0x98, 0x12, 0x80, 0x00, 0x00, 0x00,
-  0x30, 0x84, 0xa8, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom21_2[12] = {
-  0xee, 0x3b, 0x30, 0x00, 0x00, 0x00,
-  0x99, 0xe6, 0xe8, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom21_20[120] = {
-  0x4c, 0x19, 0x10, 0x00, 0x00, 0x00,
-  0x51, 0x14, 0x50, 0x00, 0x00, 0x00,
-  0xa0, 0x6a, 0x40, 0x00, 0x00, 0x00,
-  0x04, 0xc1, 0x30, 0x00, 0x00, 0x00,
-  0x03, 0xb4, 0x00, 0x00, 0x00, 0x00,
-  0x86, 0x20, 0x90, 0x00, 0x00, 0x00,
-  0x29, 0x08, 0x48, 0x00, 0x00, 0x00,
-  0x42, 0x43, 0x08, 0x00, 0x00, 0x00,
-  0x98, 0x12, 0x80, 0x00, 0x00, 0x00,
-  0x30, 0x84, 0xa8, 0x00, 0x00, 0x00,
-  0x4e, 0x11, 0x90, 0x00, 0x00, 0x00,
-  0xe3, 0x18, 0x98, 0x00, 0x00, 0x00,
-  0x81, 0xe3, 0x00, 0x00, 0x00, 0x00,
-  0x21, 0x40, 0x58, 0x00, 0x00, 0x00,
-  0x52, 0x81, 0xe0, 0x00, 0x00, 0x00,
-  0xb4, 0x28, 0x20, 0x00, 0x00, 0x00,
-  0x26, 0x86, 0x28, 0x00, 0x00, 0x00,
-  0x58, 0x64, 0x40, 0x00, 0x00, 0x00,
-  0x19, 0x9e, 0x00, 0x00, 0x00, 0x00,
-  0x2a, 0x03, 0x30, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom21_21[126] = {
-  0x4c, 0x19, 0x10, 0x00, 0x00, 0x00,
-  0x51, 0x14, 0x50, 0x00, 0x00, 0x00,
-  0xa0, 0x6a, 0x40, 0x00, 0x00, 0x00,
-  0x04, 0xc1, 0x30, 0x00, 0x00, 0x00,
-  0x03, 0xb4, 0x00, 0x00, 0x00, 0x00,
-  0x86, 0x20, 0x90, 0x00, 0x00, 0x00,
-  0x29, 0x08, 0x48, 0x00, 0x00, 0x00,
-  0x42, 0x43, 0x08, 0x00, 0x00, 0x00,
-  0x98, 0x12, 0x80, 0x00, 0x00, 0x00,
-  0x30, 0x84, 0xa8, 0x00, 0x00, 0x00,
-  0x4c, 0x11, 0x90, 0x00, 0x00, 0x00,
-  0x51, 0x0c, 0xc8, 0x00, 0x00, 0x00,
-  0xa0, 0x66, 0x40, 0x00, 0x00, 0x00,
-  0x04, 0xc1, 0x60, 0x00, 0x00, 0x00,
-  0x03, 0xa0, 0x28, 0x00, 0x00, 0x00,
-  0x86, 0x21, 0x10, 0x00, 0x00, 0x00,
-  0x29, 0x10, 0x18, 0x00, 0x00, 0x00,
-  0x42, 0x42, 0xa0, 0x00, 0x00, 0x00,
-  0x98, 0x1a, 0x00, 0x00, 0x00, 0x00,
-  0x30, 0x84, 0x08, 0x00, 0x00, 0x00,
-  0xdf, 0x4c, 0x10, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom21_3[18] = {
-  0xce, 0x32, 0xb0, 0x00, 0x00, 0x00,
-  0x55, 0xdc, 0x50, 0x00, 0x00, 0x00,
-  0xa8, 0xed, 0x88, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom21_4[24] = {
-  0xe6, 0x31, 0x30, 0x00, 0x00, 0x00,
-  0x33, 0x8c, 0x58, 0x00, 0x00, 0x00,
-  0x98, 0xd2, 0xc8, 0x00, 0x00, 0x00,
-  0x2d, 0x4b, 0x28, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom21_5[30] = {
-  0xce, 0x31, 0xb0, 0x00, 0x00, 0x00,
-  0x63, 0x98, 0xd8, 0x00, 0x00, 0x00,
-  0x98, 0xc7, 0x68, 0x00, 0x00, 0x00,
-  0x4d, 0x6b, 0x50, 0x00, 0x00, 0x00,
-  0xb2, 0x6c, 0xa8, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom21_6[36] = {
-  0x4c, 0x19, 0x10, 0x00, 0x00, 0x00,
-  0x51, 0x14, 0x50, 0x00, 0x00, 0x00,
-  0x20, 0xea, 0x08, 0x00, 0x00, 0x00,
-  0x85, 0x41, 0x28, 0x00, 0x00, 0x00,
-  0x06, 0x80, 0xd8, 0x00, 0x00, 0x00,
-  0x8a, 0x24, 0x30, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom21_7[42] = {
-  0xc6, 0x11, 0x90, 0x00, 0x00, 0x00,
-  0x33, 0x04, 0xc8, 0x00, 0x00, 0x00,
-  0x18, 0x67, 0x40, 0x00, 0x00, 0x00,
-  0x45, 0x42, 0xd0, 0x00, 0x00, 0x00,
-  0x12, 0xd4, 0x28, 0x00, 0x00, 0x00,
-  0xb4, 0x28, 0x30, 0x00, 0x00, 0x00,
-  0x29, 0x92, 0x18, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom21_8[48] = {
-  0x07, 0x0a, 0x70, 0x00, 0x00, 0x00,
-  0x49, 0xa8, 0x28, 0x00, 0x00, 0x00,
-  0xb0, 0x7a, 0x00, 0x00, 0x00, 0x00,
-  0x24, 0xc5, 0xc0, 0x00, 0x00, 0x00,
-  0x52, 0x80, 0xe8, 0x00, 0x00, 0x00,
-  0xc6, 0x31, 0x80, 0x00, 0x00, 0x00,
-  0x31, 0x94, 0x18, 0x00, 0x00, 0x00,
-  0x18, 0xc7, 0x08, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom21_9[54] = {
-  0x4e, 0x11, 0x10, 0x00, 0x00, 0x00,
-  0x62, 0x1a, 0x08, 0x00, 0x00, 0x00,
-  0x80, 0xe9, 0x40, 0x00, 0x00, 0x00,
-  0xa1, 0x50, 0x50, 0x00, 0x00, 0x00,
-  0x53, 0x00, 0x68, 0x00, 0x00, 0x00,
-  0xa4, 0x24, 0x30, 0x00, 0x00, 0x00,
-  0x16, 0xa0, 0x88, 0x00, 0x00, 0x00,
-  0x58, 0x45, 0x20, 0x00, 0x00, 0x00,
-  0x29, 0x86, 0x80, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom22_1[6] = {
-  0xff, 0xff, 0xfc, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom22_10[60] = {
-  0xc0, 0x38, 0x88, 0x00, 0x00, 0x00,
-  0x30, 0x0e, 0x28, 0x00, 0x00, 0x00,
-  0xe8, 0x07, 0x00, 0x00, 0x00, 0x00,
-  0x85, 0x08, 0xa8, 0x00, 0x00, 0x00,
-  0xd0, 0x92, 0x10, 0x00, 0x00, 0x00,
-  0x86, 0x50, 0x48, 0x00, 0x00, 0x00,
-  0x4a, 0x68, 0x0c, 0x00, 0x00, 0x00,
-  0x01, 0xa0, 0x74, 0x00, 0x00, 0x00,
-  0x4c, 0x81, 0x90, 0x00, 0x00, 0x00,
-  0x62, 0x24, 0x04, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom22_11[66] = {
-  0x46, 0x48, 0xc8, 0x00, 0x00, 0x00,
-  0x33, 0x26, 0x64, 0x00, 0x00, 0x00,
-  0x99, 0x13, 0x20, 0x00, 0x00, 0x00,
-  0x05, 0x80, 0xb0, 0x00, 0x00, 0x00,
-  0x80, 0xb0, 0x14, 0x00, 0x00, 0x00,
-  0x84, 0x50, 0x88, 0x00, 0x00, 0x00,
-  0x40, 0x68, 0x0c, 0x00, 0x00, 0x00,
-  0x0a, 0x81, 0x50, 0x00, 0x00, 0x00,
-  0x68, 0x0d, 0x00, 0x00, 0x00, 0x00,
-  0x10, 0x22, 0x04, 0x00, 0x00, 0x00,
-  0x30, 0x46, 0x08, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom22_12[72] = {
-  0x64, 0x4c, 0x88, 0x00, 0x00, 0x00,
-  0x51, 0x4a, 0x28, 0x00, 0x00, 0x00,
-  0x0c, 0xa1, 0x94, 0x00, 0x00, 0x00,
-  0xa1, 0x34, 0x24, 0x00, 0x00, 0x00,
-  0x12, 0xa2, 0x54, 0x00, 0x00, 0x00,
-  0x8a, 0x51, 0x48, 0x00, 0x00, 0x00,
-  0x86, 0x90, 0xd0, 0x00, 0x00, 0x00,
-  0x23, 0x24, 0x64, 0x00, 0x00, 0x00,
-  0x16, 0x22, 0xc4, 0x00, 0x00, 0x00,
-  0x4c, 0x29, 0x84, 0x00, 0x00, 0x00,
-  0x41, 0xc8, 0x38, 0x00, 0x00, 0x00,
-  0xf4, 0x18, 0x9c, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom22_13[78] = {
-  0x64, 0x4c, 0x88, 0x00, 0x00, 0x00,
-  0x51, 0x4a, 0x28, 0x00, 0x00, 0x00,
-  0x0c, 0xa1, 0x94, 0x00, 0x00, 0x00,
-  0xa1, 0x34, 0x24, 0x00, 0x00, 0x00,
-  0x12, 0xa2, 0x54, 0x00, 0x00, 0x00,
-  0x8a, 0x51, 0x48, 0x00, 0x00, 0x00,
-  0x46, 0x48, 0xc8, 0x00, 0x00, 0x00,
-  0x33, 0x26, 0x64, 0x00, 0x00, 0x00,
-  0x91, 0x92, 0x30, 0x00, 0x00, 0x00,
-  0xa4, 0x34, 0x84, 0x00, 0x00, 0x00,
-  0x50, 0xaa, 0x14, 0x00, 0x00, 0x00,
-  0x84, 0xd0, 0x98, 0x00, 0x00, 0x00,
-  0x09, 0x61, 0x2c, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom22_14[84] = {
-  0x46, 0x48, 0xc8, 0x00, 0x00, 0x00,
-  0x33, 0x26, 0x64, 0x00, 0x00, 0x00,
-  0x91, 0x92, 0x30, 0x00, 0x00, 0x00,
-  0xa4, 0x34, 0x84, 0x00, 0x00, 0x00,
-  0x50, 0xaa, 0x14, 0x00, 0x00, 0x00,
-  0x84, 0xd0, 0x98, 0x00, 0x00, 0x00,
-  0x09, 0x61, 0x2c, 0x00, 0x00, 0x00,
-  0x64, 0x4c, 0x88, 0x00, 0x00, 0x00,
-  0x51, 0x4a, 0x28, 0x00, 0x00, 0x00,
-  0x0c, 0xa1, 0x94, 0x00, 0x00, 0x00,
-  0xa1, 0x34, 0x24, 0x00, 0x00, 0x00,
-  0x12, 0xa2, 0x54, 0x00, 0x00, 0x00,
-  0x8a, 0x51, 0x48, 0x00, 0x00, 0x00,
-  0xc6, 0xca, 0xe8, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom22_15[90] = {
-  0x46, 0x48, 0xc8, 0x00, 0x00, 0x00,
-  0x33, 0x26, 0x64, 0x00, 0x00, 0x00,
-  0x91, 0x92, 0x30, 0x00, 0x00, 0x00,
-  0xa4, 0x34, 0x84, 0x00, 0x00, 0x00,
-  0x50, 0xaa, 0x14, 0x00, 0x00, 0x00,
-  0x84, 0xd0, 0x98, 0x00, 0x00, 0x00,
-  0x09, 0x61, 0x2c, 0x00, 0x00, 0x00,
-  0x0c, 0x81, 0x90, 0x00, 0x00, 0x00,
-  0x80, 0x70, 0x0c, 0x00, 0x00, 0x00,
-  0xa0, 0x94, 0x10, 0x00, 0x00, 0x00,
-  0x05, 0x40, 0xa8, 0x00, 0x00, 0x00,
-  0x43, 0x08, 0x60, 0x00, 0x00, 0x00,
-  0x1a, 0x03, 0x40, 0x00, 0x00, 0x00,
-  0x60, 0x2c, 0x04, 0x00, 0x00, 0x00,
-  0x14, 0x22, 0x84, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom22_16[96] = {
-  0x0c, 0x81, 0x90, 0x00, 0x00, 0x00,
-  0x80, 0x70, 0x0c, 0x00, 0x00, 0x00,
-  0xa0, 0x94, 0x10, 0x00, 0x00, 0x00,
-  0x05, 0x40, 0xa8, 0x00, 0x00, 0x00,
-  0x43, 0x08, 0x60, 0x00, 0x00, 0x00,
-  0x1a, 0x03, 0x40, 0x00, 0x00, 0x00,
-  0x60, 0x2c, 0x04, 0x00, 0x00, 0x00,
-  0x14, 0x22, 0x84, 0x00, 0x00, 0x00,
-  0x46, 0x48, 0xc8, 0x00, 0x00, 0x00,
-  0x33, 0x26, 0x64, 0x00, 0x00, 0x00,
-  0x91, 0x92, 0x30, 0x00, 0x00, 0x00,
-  0xa4, 0x34, 0x84, 0x00, 0x00, 0x00,
-  0x50, 0xaa, 0x14, 0x00, 0x00, 0x00,
-  0x84, 0xd0, 0x98, 0x00, 0x00, 0x00,
-  0x09, 0x61, 0x2c, 0x00, 0x00, 0x00,
-  0x86, 0xc1, 0x44, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom22_17[102] = {
-  0x0c, 0x81, 0x90, 0x00, 0x00, 0x00,
-  0x80, 0x70, 0x0c, 0x00, 0x00, 0x00,
-  0xa0, 0x94, 0x10, 0x00, 0x00, 0x00,
-  0x05, 0x40, 0xa8, 0x00, 0x00, 0x00,
-  0x43, 0x08, 0x60, 0x00, 0x00, 0x00,
-  0x1a, 0x03, 0x40, 0x00, 0x00, 0x00,
-  0x60, 0x2c, 0x04, 0x00, 0x00, 0x00,
-  0x14, 0x22, 0x84, 0x00, 0x00, 0x00,
-  0x46, 0x48, 0xc8, 0x00, 0x00, 0x00,
-  0x62, 0x6c, 0x4c, 0x00, 0x00, 0x00,
-  0x8c, 0x11, 0x80, 0x00, 0x00, 0x00,
-  0x01, 0x60, 0x2c, 0x00, 0x00, 0x00,
-  0x07, 0x80, 0xf0, 0x00, 0x00, 0x00,
-  0xa0, 0x94, 0x10, 0x00, 0x00, 0x00,
-  0x18, 0xa3, 0x14, 0x00, 0x00, 0x00,
-  0x91, 0x12, 0x20, 0x00, 0x00, 0x00,
-  0x78, 0x0f, 0x00, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom22_18[108] = {
-  0x46, 0x48, 0xc8, 0x00, 0x00, 0x00,
-  0x62, 0x6c, 0x4c, 0x00, 0x00, 0x00,
-  0x8c, 0x11, 0x80, 0x00, 0x00, 0x00,
-  0x01, 0x60, 0x2c, 0x00, 0x00, 0x00,
-  0x07, 0x80, 0xf0, 0x00, 0x00, 0x00,
-  0xa0, 0x94, 0x10, 0x00, 0x00, 0x00,
-  0x18, 0xa3, 0x14, 0x00, 0x00, 0x00,
-  0x91, 0x12, 0x20, 0x00, 0x00, 0x00,
-  0x78, 0x0f, 0x00, 0x00, 0x00, 0x00,
-  0x0c, 0x81, 0x90, 0x00, 0x00, 0x00,
-  0x80, 0x70, 0x0c, 0x00, 0x00, 0x00,
-  0xa0, 0x94, 0x10, 0x00, 0x00, 0x00,
-  0x05, 0x40, 0xa8, 0x00, 0x00, 0x00,
-  0x43, 0x08, 0x60, 0x00, 0x00, 0x00,
-  0x1a, 0x03, 0x40, 0x00, 0x00, 0x00,
-  0x60, 0x2c, 0x04, 0x00, 0x00, 0x00,
-  0x14, 0x22, 0x84, 0x00, 0x00, 0x00,
-  0xe4, 0xd4, 0x6c, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom22_19[114] = {
-  0x46, 0x48, 0xc8, 0x00, 0x00, 0x00,
-  0x62, 0x6c, 0x4c, 0x00, 0x00, 0x00,
-  0x8c, 0x11, 0x80, 0x00, 0x00, 0x00,
-  0x01, 0x60, 0x2c, 0x00, 0x00, 0x00,
-  0x07, 0x80, 0xf0, 0x00, 0x00, 0x00,
-  0xa0, 0x94, 0x10, 0x00, 0x00, 0x00,
-  0x18, 0xa3, 0x14, 0x00, 0x00, 0x00,
-  0x91, 0x12, 0x20, 0x00, 0x00, 0x00,
-  0x78, 0x0f, 0x00, 0x00, 0x00, 0x00,
-  0x64, 0x4c, 0x88, 0x00, 0x00, 0x00,
-  0x51, 0x4a, 0x28, 0x00, 0x00, 0x00,
-  0xa9, 0x15, 0x20, 0x00, 0x00, 0x00,
-  0x04, 0xc0, 0x98, 0x00, 0x00, 0x00,
-  0xd0, 0x1a, 0x00, 0x00, 0x00, 0x00,
-  0x82, 0x50, 0x48, 0x00, 0x00, 0x00,
-  0x21, 0x24, 0x24, 0x00, 0x00, 0x00,
-  0x0c, 0x21, 0x84, 0x00, 0x00, 0x00,
-  0x4a, 0x09, 0x40, 0x00, 0x00, 0x00,
-  0x12, 0xa2, 0x54, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom22_2[12] = {
-  0xec, 0xdd, 0x98, 0x00, 0x00, 0x00,
-  0x9b, 0xb3, 0x74, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom22_20[120] = {
-  0x64, 0x4c, 0x88, 0x00, 0x00, 0x00,
-  0x51, 0x4a, 0x28, 0x00, 0x00, 0x00,
-  0xa9, 0x15, 0x20, 0x00, 0x00, 0x00,
-  0x04, 0xc0, 0x98, 0x00, 0x00, 0x00,
-  0xd0, 0x1a, 0x00, 0x00, 0x00, 0x00,
-  0x82, 0x50, 0x48, 0x00, 0x00, 0x00,
-  0x21, 0x24, 0x24, 0x00, 0x00, 0x00,
-  0x0c, 0x21, 0x84, 0x00, 0x00, 0x00,
-  0x4a, 0x09, 0x40, 0x00, 0x00, 0x00,
-  0x12, 0xa2, 0x54, 0x00, 0x00, 0x00,
-  0x46, 0x48, 0xc8, 0x00, 0x00, 0x00,
-  0x62, 0x6c, 0x4c, 0x00, 0x00, 0x00,
-  0x8c, 0x11, 0x80, 0x00, 0x00, 0x00,
-  0x01, 0x60, 0x2c, 0x00, 0x00, 0x00,
-  0x07, 0x80, 0xf0, 0x00, 0x00, 0x00,
-  0xa0, 0x94, 0x10, 0x00, 0x00, 0x00,
-  0x18, 0xa3, 0x14, 0x00, 0x00, 0x00,
-  0x91, 0x12, 0x20, 0x00, 0x00, 0x00,
-  0x78, 0x0f, 0x00, 0x00, 0x00, 0x00,
-  0x3b, 0x48, 0xc4, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom22_21[126] = {
-  0x64, 0x4c, 0x88, 0x00, 0x00, 0x00,
-  0x51, 0x4a, 0x28, 0x00, 0x00, 0x00,
-  0xa9, 0x15, 0x20, 0x00, 0x00, 0x00,
-  0x04, 0xc0, 0x98, 0x00, 0x00, 0x00,
-  0xd0, 0x1a, 0x00, 0x00, 0x00, 0x00,
-  0x82, 0x50, 0x48, 0x00, 0x00, 0x00,
-  0x21, 0x24, 0x24, 0x00, 0x00, 0x00,
-  0x0c, 0x21, 0x84, 0x00, 0x00, 0x00,
-  0x4a, 0x09, 0x40, 0x00, 0x00, 0x00,
-  0x12, 0xa2, 0x54, 0x00, 0x00, 0x00,
-  0x46, 0x48, 0xc8, 0x00, 0x00, 0x00,
-  0x33, 0x26, 0x64, 0x00, 0x00, 0x00,
-  0x99, 0x13, 0x20, 0x00, 0x00, 0x00,
-  0x05, 0x80, 0xb0, 0x00, 0x00, 0x00,
-  0x80, 0xb0, 0x14, 0x00, 0x00, 0x00,
-  0x84, 0x50, 0x88, 0x00, 0x00, 0x00,
-  0x40, 0x68, 0x0c, 0x00, 0x00, 0x00,
-  0x0a, 0x81, 0x50, 0x00, 0x00, 0x00,
-  0x68, 0x0d, 0x00, 0x00, 0x00, 0x00,
-  0x10, 0x22, 0x04, 0x00, 0x00, 0x00,
-  0x30, 0x46, 0x08, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom22_22[132] = {
-  0x46, 0x48, 0xc8, 0x00, 0x00, 0x00,
-  0x33, 0x26, 0x64, 0x00, 0x00, 0x00,
-  0x99, 0x13, 0x20, 0x00, 0x00, 0x00,
-  0x05, 0x80, 0xb0, 0x00, 0x00, 0x00,
-  0x80, 0xb0, 0x14, 0x00, 0x00, 0x00,
-  0x84, 0x50, 0x88, 0x00, 0x00, 0x00,
-  0x40, 0x68, 0x0c, 0x00, 0x00, 0x00,
-  0x0a, 0x81, 0x50, 0x00, 0x00, 0x00,
-  0x68, 0x0d, 0x00, 0x00, 0x00, 0x00,
-  0x10, 0x22, 0x04, 0x00, 0x00, 0x00,
-  0x30, 0x46, 0x08, 0x00, 0x00, 0x00,
-  0x64, 0x4c, 0x88, 0x00, 0x00, 0x00,
-  0x51, 0x4a, 0x28, 0x00, 0x00, 0x00,
-  0xa9, 0x15, 0x20, 0x00, 0x00, 0x00,
-  0x04, 0xc0, 0x98, 0x00, 0x00, 0x00,
-  0xd0, 0x1a, 0x00, 0x00, 0x00, 0x00,
-  0x82, 0x50, 0x48, 0x00, 0x00, 0x00,
-  0x21, 0x24, 0x24, 0x00, 0x00, 0x00,
-  0x0c, 0x21, 0x84, 0x00, 0x00, 0x00,
-  0x4a, 0x09, 0x40, 0x00, 0x00, 0x00,
-  0x12, 0xa2, 0x54, 0x00, 0x00, 0x00,
-  0x9e, 0xce, 0x88, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom22_3[18] = {
-  0xca, 0xd9, 0x58, 0x00, 0x00, 0x00,
-  0xf1, 0x5e, 0x28, 0x00, 0x00, 0x00,
-  0xb6, 0x35, 0xc4, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom22_4[24] = {
-  0xc4, 0xd8, 0x98, 0x00, 0x00, 0x00,
-  0x31, 0x66, 0x2c, 0x00, 0x00, 0x00,
-  0x4b, 0x29, 0x64, 0x00, 0x00, 0x00,
-  0x2c, 0xa5, 0x94, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom22_5[30] = {
-  0xc6, 0xd8, 0xd8, 0x00, 0x00, 0x00,
-  0x63, 0x6c, 0x6c, 0x00, 0x00, 0x00,
-  0x1d, 0xa3, 0xb4, 0x00, 0x00, 0x00,
-  0xad, 0x55, 0xa8, 0x00, 0x00, 0x00,
-  0xb2, 0xb6, 0x54, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom22_6[36] = {
-  0x64, 0x4c, 0x88, 0x00, 0x00, 0x00,
-  0x51, 0x4a, 0x28, 0x00, 0x00, 0x00,
-  0xa8, 0x35, 0x04, 0x00, 0x00, 0x00,
-  0xc4, 0xa0, 0x94, 0x00, 0x00, 0x00,
-  0x03, 0x60, 0x6c, 0x00, 0x00, 0x00,
-  0x90, 0xd2, 0x18, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom22_7[42] = {
-  0xc6, 0x48, 0xc8, 0x00, 0x00, 0x00,
-  0x13, 0x26, 0x64, 0x00, 0x00, 0x00,
-  0x8d, 0x13, 0xa0, 0x00, 0x00, 0x00,
-  0x8b, 0x41, 0x68, 0x00, 0x00, 0x00,
-  0x52, 0xaa, 0x14, 0x00, 0x00, 0x00,
-  0xa2, 0xd4, 0x18, 0x00, 0x00, 0x00,
-  0x61, 0xa8, 0x2c, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom22_8[48] = {
-  0x28, 0x85, 0x38, 0x00, 0x00, 0x00,
-  0x21, 0xf4, 0x04, 0x00, 0x00, 0x00,
-  0xe9, 0x1d, 0x00, 0x00, 0x00, 0x00,
-  0x17, 0x02, 0xe0, 0x00, 0x00, 0x00,
-  0x83, 0xa0, 0x54, 0x00, 0x00, 0x00,
-  0x46, 0x18, 0xe8, 0x00, 0x00, 0x00,
-  0x50, 0x6a, 0x0c, 0x00, 0x00, 0x00,
-  0x1c, 0x23, 0x84, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom22_9[54] = {
-  0x44, 0x48, 0xc8, 0x00, 0x00, 0x00,
-  0x28, 0x2d, 0x0c, 0x00, 0x00, 0x00,
-  0x25, 0x14, 0xa0, 0x00, 0x00, 0x00,
-  0x59, 0x0a, 0x20, 0x00, 0x00, 0x00,
-  0x03, 0xa0, 0x34, 0x00, 0x00, 0x00,
-  0xc0, 0xd0, 0x18, 0x00, 0x00, 0x00,
-  0xa2, 0x30, 0x44, 0x00, 0x00, 0x00,
-  0x14, 0x82, 0xd0, 0x00, 0x00, 0x00,
-  0x9a, 0x03, 0x80, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom23_1[6] = {
-  0xff, 0xff, 0xfe, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom23_10[60] = {
-  0x64, 0x4a, 0x28, 0x00, 0x00, 0x00,
-  0x51, 0x48, 0xa2, 0x00, 0x00, 0x00,
-  0xa9, 0x10, 0x1a, 0x00, 0x00, 0x00,
-  0x04, 0xc4, 0x84, 0x00, 0x00, 0x00,
-  0xd0, 0x01, 0x44, 0x00, 0x00, 0x00,
-  0x82, 0x40, 0x1c, 0x00, 0x00, 0x00,
-  0x21, 0x37, 0x00, 0x00, 0x00, 0x00,
-  0x0c, 0x21, 0x22, 0x00, 0x00, 0x00,
-  0x4a, 0x0a, 0xc0, 0x00, 0x00, 0x00,
-  0x12, 0xb4, 0x50, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom23_11[66] = {
-  0x46, 0x4a, 0x6c, 0x00, 0x00, 0x00,
-  0x33, 0x24, 0x26, 0x00, 0x00, 0x00,
-  0x99, 0x02, 0x12, 0x00, 0x00, 0x00,
-  0x05, 0x80, 0x0e, 0x00, 0x00, 0x00,
-  0x80, 0xa1, 0x82, 0x00, 0x00, 0x00,
-  0x84, 0x48, 0x18, 0x00, 0x00, 0x00,
-  0x40, 0x6d, 0x40, 0x00, 0x00, 0x00,
-  0x0a, 0x90, 0xc0, 0x00, 0x00, 0x00,
-  0x68, 0x04, 0x90, 0x00, 0x00, 0x00,
-  0x10, 0x31, 0x20, 0x00, 0x00, 0x00,
-  0x30, 0x58, 0x04, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom23_12[72] = {
-  0x64, 0x4a, 0x28, 0x00, 0x00, 0x00,
-  0x51, 0x58, 0xa2, 0x00, 0x00, 0x00,
-  0x0c, 0xa4, 0x30, 0x00, 0x00, 0x00,
-  0xa1, 0x22, 0x46, 0x00, 0x00, 0x00,
-  0x12, 0xa1, 0x1c, 0x00, 0x00, 0x00,
-  0x8a, 0x45, 0xc0, 0x00, 0x00, 0x00,
-  0x86, 0x8a, 0x6c, 0x00, 0x00, 0x00,
-  0x23, 0x2c, 0x84, 0x00, 0x00, 0x00,
-  0x16, 0x21, 0x98, 0x00, 0x00, 0x00,
-  0x4c, 0x30, 0x54, 0x00, 0x00, 0x00,
-  0x41, 0xc1, 0x26, 0x00, 0x00, 0x00,
-  0x19, 0x56, 0xe4, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom23_13[78] = {
-  0x64, 0x4a, 0x28, 0x00, 0x00, 0x00,
-  0x51, 0x58, 0xa2, 0x00, 0x00, 0x00,
-  0x0c, 0xa4, 0x30, 0x00, 0x00, 0x00,
-  0xa1, 0x22, 0x46, 0x00, 0x00, 0x00,
-  0x12, 0xa1, 0x1c, 0x00, 0x00, 0x00,
-  0x8a, 0x45, 0xc0, 0x00, 0x00, 0x00,
-  0x46, 0x4a, 0x6c, 0x00, 0x00, 0x00,
-  0x33, 0x24, 0x26, 0x00, 0x00, 0x00,
-  0x91, 0x92, 0x12, 0x00, 0x00, 0x00,
-  0xa4, 0x20, 0x4a, 0x00, 0x00, 0x00,
-  0x50, 0xa0, 0xd4, 0x00, 0x00, 0x00,
-  0x84, 0xc5, 0x80, 0x00, 0x00, 0x00,
-  0x09, 0x71, 0x0c, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom23_14[84] = {
-  0x46, 0x4a, 0x6c, 0x00, 0x00, 0x00,
-  0x33, 0x24, 0x26, 0x00, 0x00, 0x00,
-  0x91, 0x92, 0x12, 0x00, 0x00, 0x00,
-  0xa4, 0x20, 0x4a, 0x00, 0x00, 0x00,
-  0x50, 0xa0, 0xd4, 0x00, 0x00, 0x00,
-  0x84, 0xc5, 0x80, 0x00, 0x00, 0x00,
-  0x09, 0x71, 0x0c, 0x00, 0x00, 0x00,
-  0x64, 0x4a, 0x28, 0x00, 0x00, 0x00,
-  0x51, 0x58, 0xa2, 0x00, 0x00, 0x00,
-  0x0c, 0xa4, 0x30, 0x00, 0x00, 0x00,
-  0xa1, 0x22, 0x46, 0x00, 0x00, 0x00,
-  0x12, 0xa1, 0x1c, 0x00, 0x00, 0x00,
-  0x8a, 0x45, 0xc0, 0x00, 0x00, 0x00,
-  0x9c, 0x3f, 0xb2, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom23_15[90] = {
-  0x46, 0x4a, 0x6c, 0x00, 0x00, 0x00,
-  0x33, 0x24, 0x26, 0x00, 0x00, 0x00,
-  0x91, 0x92, 0x12, 0x00, 0x00, 0x00,
-  0xa4, 0x20, 0x4a, 0x00, 0x00, 0x00,
-  0x50, 0xa0, 0xd4, 0x00, 0x00, 0x00,
-  0x84, 0xc5, 0x80, 0x00, 0x00, 0x00,
-  0x09, 0x71, 0x0c, 0x00, 0x00, 0x00,
-  0x0c, 0x84, 0x0c, 0x00, 0x00, 0x00,
-  0x80, 0x70, 0x06, 0x00, 0x00, 0x00,
-  0xa0, 0x88, 0x48, 0x00, 0x00, 0x00,
-  0x05, 0x40, 0x32, 0x00, 0x00, 0x00,
-  0x43, 0x02, 0x82, 0x00, 0x00, 0x00,
-  0x1a, 0x01, 0x50, 0x00, 0x00, 0x00,
-  0x60, 0x27, 0x00, 0x00, 0x00, 0x00,
-  0x14, 0x38, 0xa0, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom23_16[96] = {
-  0x0c, 0x84, 0x0c, 0x00, 0x00, 0x00,
-  0x80, 0x70, 0x06, 0x00, 0x00, 0x00,
-  0xa0, 0x88, 0x48, 0x00, 0x00, 0x00,
-  0x05, 0x40, 0x32, 0x00, 0x00, 0x00,
-  0x43, 0x02, 0x82, 0x00, 0x00, 0x00,
-  0x1a, 0x01, 0x50, 0x00, 0x00, 0x00,
-  0x60, 0x27, 0x00, 0x00, 0x00, 0x00,
-  0x14, 0x38, 0xa0, 0x00, 0x00, 0x00,
-  0x46, 0x4a, 0x6c, 0x00, 0x00, 0x00,
-  0x33, 0x24, 0x26, 0x00, 0x00, 0x00,
-  0x91, 0x92, 0x12, 0x00, 0x00, 0x00,
-  0xa4, 0x20, 0x4a, 0x00, 0x00, 0x00,
-  0x50, 0xa0, 0xd4, 0x00, 0x00, 0x00,
-  0x84, 0xc5, 0x80, 0x00, 0x00, 0x00,
-  0x09, 0x71, 0x0c, 0x00, 0x00, 0x00,
-  0xfa, 0xd9, 0xf4, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom23_17[102] = {
-  0x0c, 0x84, 0x0c, 0x00, 0x00, 0x00,
-  0x80, 0x70, 0x06, 0x00, 0x00, 0x00,
-  0xa0, 0x88, 0x48, 0x00, 0x00, 0x00,
-  0x05, 0x40, 0x32, 0x00, 0x00, 0x00,
-  0x43, 0x02, 0x82, 0x00, 0x00, 0x00,
-  0x1a, 0x01, 0x50, 0x00, 0x00, 0x00,
-  0x60, 0x27, 0x00, 0x00, 0x00, 0x00,
-  0x14, 0x38, 0xa0, 0x00, 0x00, 0x00,
-  0x46, 0x4a, 0x6c, 0x00, 0x00, 0x00,
-  0x62, 0x7c, 0x84, 0x00, 0x00, 0x00,
-  0x8c, 0x04, 0x88, 0x00, 0x00, 0x00,
-  0x01, 0x74, 0x22, 0x00, 0x00, 0x00,
-  0x07, 0x83, 0x06, 0x00, 0x00, 0x00,
-  0xa0, 0x80, 0x72, 0x00, 0x00, 0x00,
-  0x18, 0xb1, 0x42, 0x00, 0x00, 0x00,
-  0x91, 0x00, 0x92, 0x00, 0x00, 0x00,
-  0x78, 0x00, 0x1c, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom23_18[108] = {
-  0x46, 0x4a, 0x6c, 0x00, 0x00, 0x00,
-  0x62, 0x7c, 0x84, 0x00, 0x00, 0x00,
-  0x8c, 0x04, 0x88, 0x00, 0x00, 0x00,
-  0x01, 0x74, 0x22, 0x00, 0x00, 0x00,
-  0x07, 0x83, 0x06, 0x00, 0x00, 0x00,
-  0xa0, 0x80, 0x72, 0x00, 0x00, 0x00,
-  0x18, 0xb1, 0x42, 0x00, 0x00, 0x00,
-  0x91, 0x00, 0x92, 0x00, 0x00, 0x00,
-  0x78, 0x00, 0x1c, 0x00, 0x00, 0x00,
-  0x0c, 0x84, 0x0c, 0x00, 0x00, 0x00,
-  0x80, 0x70, 0x06, 0x00, 0x00, 0x00,
-  0xa0, 0x88, 0x48, 0x00, 0x00, 0x00,
-  0x05, 0x40, 0x32, 0x00, 0x00, 0x00,
-  0x43, 0x02, 0x82, 0x00, 0x00, 0x00,
-  0x1a, 0x01, 0x50, 0x00, 0x00, 0x00,
-  0x60, 0x27, 0x00, 0x00, 0x00, 0x00,
-  0x14, 0x38, 0xa0, 0x00, 0x00, 0x00,
-  0x82, 0x32, 0x56, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom23_19[114] = {
-  0x46, 0x4a, 0x6c, 0x00, 0x00, 0x00,
-  0x62, 0x7c, 0x84, 0x00, 0x00, 0x00,
-  0x8c, 0x04, 0x88, 0x00, 0x00, 0x00,
-  0x01, 0x74, 0x22, 0x00, 0x00, 0x00,
-  0x07, 0x83, 0x06, 0x00, 0x00, 0x00,
-  0xa0, 0x80, 0x72, 0x00, 0x00, 0x00,
-  0x18, 0xb1, 0x42, 0x00, 0x00, 0x00,
-  0x91, 0x00, 0x92, 0x00, 0x00, 0x00,
-  0x78, 0x00, 0x1c, 0x00, 0x00, 0x00,
-  0x64, 0x4a, 0x28, 0x00, 0x00, 0x00,
-  0x51, 0x48, 0xa2, 0x00, 0x00, 0x00,
-  0xa9, 0x10, 0x1a, 0x00, 0x00, 0x00,
-  0x04, 0xc4, 0x84, 0x00, 0x00, 0x00,
-  0xd0, 0x01, 0x44, 0x00, 0x00, 0x00,
-  0x82, 0x40, 0x1c, 0x00, 0x00, 0x00,
-  0x21, 0x37, 0x00, 0x00, 0x00, 0x00,
-  0x0c, 0x21, 0x22, 0x00, 0x00, 0x00,
-  0x4a, 0x0a, 0xc0, 0x00, 0x00, 0x00,
-  0x12, 0xb4, 0x50, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom23_2[12] = {
-  0xec, 0xdd, 0x98, 0x00, 0x00, 0x00,
-  0x9b, 0xb2, 0x76, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom23_20[120] = {
-  0x64, 0x4a, 0x28, 0x00, 0x00, 0x00,
-  0x51, 0x48, 0xa2, 0x00, 0x00, 0x00,
-  0xa9, 0x10, 0x1a, 0x00, 0x00, 0x00,
-  0x04, 0xc4, 0x84, 0x00, 0x00, 0x00,
-  0xd0, 0x01, 0x44, 0x00, 0x00, 0x00,
-  0x82, 0x40, 0x1c, 0x00, 0x00, 0x00,
-  0x21, 0x37, 0x00, 0x00, 0x00, 0x00,
-  0x0c, 0x21, 0x22, 0x00, 0x00, 0x00,
-  0x4a, 0x0a, 0xc0, 0x00, 0x00, 0x00,
-  0x12, 0xb4, 0x50, 0x00, 0x00, 0x00,
-  0x46, 0x4a, 0x6c, 0x00, 0x00, 0x00,
-  0x62, 0x7c, 0x84, 0x00, 0x00, 0x00,
-  0x8c, 0x04, 0x88, 0x00, 0x00, 0x00,
-  0x01, 0x74, 0x22, 0x00, 0x00, 0x00,
-  0x07, 0x83, 0x06, 0x00, 0x00, 0x00,
-  0xa0, 0x80, 0x72, 0x00, 0x00, 0x00,
-  0x18, 0xb1, 0x42, 0x00, 0x00, 0x00,
-  0x91, 0x00, 0x92, 0x00, 0x00, 0x00,
-  0x78, 0x00, 0x1c, 0x00, 0x00, 0x00,
-  0xdb, 0x4a, 0x7a, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom23_21[126] = {
-  0x64, 0x4a, 0x28, 0x00, 0x00, 0x00,
-  0x51, 0x48, 0xa2, 0x00, 0x00, 0x00,
-  0xa9, 0x10, 0x1a, 0x00, 0x00, 0x00,
-  0x04, 0xc4, 0x84, 0x00, 0x00, 0x00,
-  0xd0, 0x01, 0x44, 0x00, 0x00, 0x00,
-  0x82, 0x40, 0x1c, 0x00, 0x00, 0x00,
-  0x21, 0x37, 0x00, 0x00, 0x00, 0x00,
-  0x0c, 0x21, 0x22, 0x00, 0x00, 0x00,
-  0x4a, 0x0a, 0xc0, 0x00, 0x00, 0x00,
-  0x12, 0xb4, 0x50, 0x00, 0x00, 0x00,
-  0x46, 0x4a, 0x6c, 0x00, 0x00, 0x00,
-  0x33, 0x24, 0x26, 0x00, 0x00, 0x00,
-  0x99, 0x02, 0x12, 0x00, 0x00, 0x00,
-  0x05, 0x80, 0x0e, 0x00, 0x00, 0x00,
-  0x80, 0xa1, 0x82, 0x00, 0x00, 0x00,
-  0x84, 0x48, 0x18, 0x00, 0x00, 0x00,
-  0x40, 0x6d, 0x40, 0x00, 0x00, 0x00,
-  0x0a, 0x90, 0xc0, 0x00, 0x00, 0x00,
-  0x68, 0x04, 0x90, 0x00, 0x00, 0x00,
-  0x10, 0x31, 0x20, 0x00, 0x00, 0x00,
-  0x30, 0x58, 0x04, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom23_22[132] = {
-  0x46, 0x4a, 0x6c, 0x00, 0x00, 0x00,
-  0x33, 0x24, 0x26, 0x00, 0x00, 0x00,
-  0x99, 0x02, 0x12, 0x00, 0x00, 0x00,
-  0x05, 0x80, 0x0e, 0x00, 0x00, 0x00,
-  0x80, 0xa1, 0x82, 0x00, 0x00, 0x00,
-  0x84, 0x48, 0x18, 0x00, 0x00, 0x00,
-  0x40, 0x6d, 0x40, 0x00, 0x00, 0x00,
-  0x0a, 0x90, 0xc0, 0x00, 0x00, 0x00,
-  0x68, 0x04, 0x90, 0x00, 0x00, 0x00,
-  0x10, 0x31, 0x20, 0x00, 0x00, 0x00,
-  0x30, 0x58, 0x04, 0x00, 0x00, 0x00,
-  0x64, 0x4a, 0x28, 0x00, 0x00, 0x00,
-  0x51, 0x48, 0xa2, 0x00, 0x00, 0x00,
-  0xa9, 0x10, 0x1a, 0x00, 0x00, 0x00,
-  0x04, 0xc4, 0x84, 0x00, 0x00, 0x00,
-  0xd0, 0x01, 0x44, 0x00, 0x00, 0x00,
-  0x82, 0x40, 0x1c, 0x00, 0x00, 0x00,
-  0x21, 0x37, 0x00, 0x00, 0x00, 0x00,
-  0x0c, 0x21, 0x22, 0x00, 0x00, 0x00,
-  0x4a, 0x0a, 0xc0, 0x00, 0x00, 0x00,
-  0x12, 0xb4, 0x50, 0x00, 0x00, 0x00,
-  0xea, 0x8d, 0x1a, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom23_23[138] = {
-  0x46, 0x4a, 0x6c, 0x00, 0x00, 0x00,
-  0x33, 0x24, 0x26, 0x00, 0x00, 0x00,
-  0x99, 0x02, 0x12, 0x00, 0x00, 0x00,
-  0x05, 0x80, 0x0e, 0x00, 0x00, 0x00,
-  0x80, 0xa1, 0x82, 0x00, 0x00, 0x00,
-  0x84, 0x48, 0x18, 0x00, 0x00, 0x00,
-  0x40, 0x6d, 0x40, 0x00, 0x00, 0x00,
-  0x0a, 0x90, 0xc0, 0x00, 0x00, 0x00,
-  0x68, 0x04, 0x90, 0x00, 0x00, 0x00,
-  0x10, 0x31, 0x20, 0x00, 0x00, 0x00,
-  0x30, 0x58, 0x04, 0x00, 0x00, 0x00,
-  0x46, 0x42, 0x0c, 0x00, 0x00, 0x00,
-  0x33, 0x20, 0x46, 0x00, 0x00, 0x00,
-  0x99, 0x08, 0x0a, 0x00, 0x00, 0x00,
-  0x05, 0x84, 0x30, 0x00, 0x00, 0x00,
-  0x80, 0xb0, 0x22, 0x00, 0x00, 0x00,
-  0x84, 0x42, 0x90, 0x00, 0x00, 0x00,
-  0x40, 0x73, 0x00, 0x00, 0x00, 0x00,
-  0x0a, 0x81, 0x12, 0x00, 0x00, 0x00,
-  0x68, 0x0c, 0x40, 0x00, 0x00, 0x00,
-  0x10, 0x24, 0x84, 0x00, 0x00, 0x00,
-  0x30, 0x51, 0x40, 0x00, 0x00, 0x00,
-  0x5f, 0x50, 0x88, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom23_3[18] = {
-  0xca, 0xd3, 0x64, 0x00, 0x00, 0x00,
-  0xf1, 0x49, 0x3a, 0x00, 0x00, 0x00,
-  0x76, 0x27, 0xd0, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom23_4[24] = {
-  0xc4, 0xd1, 0x64, 0x00, 0x00, 0x00,
-  0x31, 0x62, 0x96, 0x00, 0x00, 0x00,
-  0x4b, 0x24, 0x5a, 0x00, 0x00, 0x00,
-  0x2c, 0xa8, 0xaa, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom23_5[30] = {
-  0xc6, 0xca, 0x6c, 0x00, 0x00, 0x00,
-  0x63, 0x6c, 0x96, 0x00, 0x00, 0x00,
-  0x1d, 0xa1, 0xdc, 0x00, 0x00, 0x00,
-  0xad, 0x55, 0x38, 0x00, 0x00, 0x00,
-  0xb2, 0xb7, 0x06, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom23_6[36] = {
-  0x64, 0x4a, 0x28, 0x00, 0x00, 0x00,
-  0x51, 0x58, 0xa2, 0x00, 0x00, 0x00,
-  0x0c, 0xa4, 0x30, 0x00, 0x00, 0x00,
-  0xa1, 0x22, 0x46, 0x00, 0x00, 0x00,
-  0x12, 0xa1, 0x1c, 0x00, 0x00, 0x00,
-  0x8a, 0x45, 0xc0, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom23_7[42] = {
-  0x46, 0x4a, 0x6c, 0x00, 0x00, 0x00,
-  0x33, 0x24, 0x26, 0x00, 0x00, 0x00,
-  0x91, 0x92, 0x12, 0x00, 0x00, 0x00,
-  0xa4, 0x20, 0x4a, 0x00, 0x00, 0x00,
-  0x50, 0xa0, 0xd4, 0x00, 0x00, 0x00,
-  0x84, 0xc5, 0x80, 0x00, 0x00, 0x00,
-  0x09, 0x71, 0x0c, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom23_8[48] = {
-  0x0c, 0x84, 0x0c, 0x00, 0x00, 0x00,
-  0x80, 0x70, 0x06, 0x00, 0x00, 0x00,
-  0xa0, 0x88, 0x48, 0x00, 0x00, 0x00,
-  0x05, 0x40, 0x32, 0x00, 0x00, 0x00,
-  0x43, 0x02, 0x82, 0x00, 0x00, 0x00,
-  0x1a, 0x01, 0x50, 0x00, 0x00, 0x00,
-  0x60, 0x27, 0x00, 0x00, 0x00, 0x00,
-  0x14, 0x38, 0xa0, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom23_9[54] = {
-  0x46, 0x4a, 0x6c, 0x00, 0x00, 0x00,
-  0x62, 0x7c, 0x84, 0x00, 0x00, 0x00,
-  0x8c, 0x04, 0x88, 0x00, 0x00, 0x00,
-  0x01, 0x74, 0x22, 0x00, 0x00, 0x00,
-  0x07, 0x83, 0x06, 0x00, 0x00, 0x00,
-  0xa0, 0x80, 0x72, 0x00, 0x00, 0x00,
-  0x18, 0xb1, 0x42, 0x00, 0x00, 0x00,
-  0x91, 0x00, 0x92, 0x00, 0x00, 0x00,
-  0x78, 0x00, 0x1c, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom24_1[6] = {
-  0xff, 0xff, 0xff, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom24_10[60] = {
-  0x11, 0x45, 0x14, 0x00, 0x00, 0x00,
-  0x45, 0x34, 0x53, 0x00, 0x00, 0x00,
-  0x00, 0x48, 0x05, 0x00, 0x00, 0x00,
-  0x10, 0x83, 0x09, 0x00, 0x00, 0x00,
-  0x4a, 0x14, 0xa1, 0x00, 0x00, 0x00,
-  0x40, 0xa4, 0x0a, 0x00, 0x00, 0x00,
-  0xa0, 0x6a, 0x02, 0x00, 0x00, 0x00,
-  0x88, 0x80, 0x8c, 0x00, 0x00, 0x00,
-  0x86, 0x08, 0x60, 0x00, 0x00, 0x00,
-  0x54, 0x0d, 0x40, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom24_11[66] = {
-  0x53, 0x65, 0x34, 0x00, 0x00, 0x00,
-  0xa0, 0x32, 0x11, 0x00, 0x00, 0x00,
-  0x15, 0x11, 0x41, 0x00, 0x00, 0x00,
-  0x03, 0x50, 0x15, 0x00, 0x00, 0x00,
-  0x8c, 0x88, 0xc8, 0x00, 0x00, 0x00,
-  0x28, 0x82, 0x88, 0x00, 0x00, 0x00,
-  0x08, 0x48, 0x84, 0x00, 0x00, 0x00,
-  0x99, 0x01, 0x90, 0x00, 0x00, 0x00,
-  0x22, 0x92, 0x29, 0x00, 0x00, 0x00,
-  0x46, 0x04, 0x60, 0x00, 0x00, 0x00,
-  0x8c, 0x2c, 0x02, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom24_12[72] = {
-  0x10, 0x61, 0x06, 0x00, 0x00, 0x00,
-  0x02, 0x30, 0x23, 0x00, 0x00, 0x00,
-  0x40, 0x54, 0x05, 0x00, 0x00, 0x00,
-  0x21, 0x82, 0x18, 0x00, 0x00, 0x00,
-  0x81, 0x18, 0x11, 0x00, 0x00, 0x00,
-  0x14, 0x81, 0x48, 0x00, 0x00, 0x00,
-  0x98, 0x09, 0x80, 0x00, 0x00, 0x00,
-  0x08, 0x90, 0x89, 0x00, 0x00, 0x00,
-  0x62, 0x06, 0x20, 0x00, 0x00, 0x00,
-  0x24, 0x22, 0x42, 0x00, 0x00, 0x00,
-  0x8a, 0x08, 0xa0, 0x00, 0x00, 0x00,
-  0x84, 0x48, 0x44, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom24_13[78] = {
-  0x51, 0x45, 0x14, 0x00, 0x00, 0x00,
-  0xc5, 0x1c, 0x51, 0x00, 0x00, 0x00,
-  0x21, 0x82, 0x18, 0x00, 0x00, 0x00,
-  0x12, 0x31, 0x23, 0x00, 0x00, 0x00,
-  0x08, 0xe0, 0x8e, 0x00, 0x00, 0x00,
-  0x2e, 0x02, 0xe0, 0x00, 0x00, 0x00,
-  0x53, 0x65, 0x36, 0x00, 0x00, 0x00,
-  0x21, 0x32, 0x13, 0x00, 0x00, 0x00,
-  0x90, 0x99, 0x09, 0x00, 0x00, 0x00,
-  0x02, 0x50, 0x25, 0x00, 0x00, 0x00,
-  0x06, 0xa0, 0x6a, 0x00, 0x00, 0x00,
-  0x2c, 0x02, 0xc0, 0x00, 0x00, 0x00,
-  0x88, 0x68, 0x86, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom24_14[84] = {
-  0x53, 0x65, 0x36, 0x00, 0x00, 0x00,
-  0x21, 0x32, 0x13, 0x00, 0x00, 0x00,
-  0x90, 0x99, 0x09, 0x00, 0x00, 0x00,
-  0x02, 0x50, 0x25, 0x00, 0x00, 0x00,
-  0x06, 0xa0, 0x6a, 0x00, 0x00, 0x00,
-  0x2c, 0x02, 0xc0, 0x00, 0x00, 0x00,
-  0x88, 0x68, 0x86, 0x00, 0x00, 0x00,
-  0x51, 0x45, 0x14, 0x00, 0x00, 0x00,
-  0xc5, 0x1c, 0x51, 0x00, 0x00, 0x00,
-  0x21, 0x82, 0x18, 0x00, 0x00, 0x00,
-  0x12, 0x31, 0x23, 0x00, 0x00, 0x00,
-  0x08, 0xe0, 0x8e, 0x00, 0x00, 0x00,
-  0x2e, 0x02, 0xe0, 0x00, 0x00, 0x00,
-  0xf2, 0xd6, 0x8e, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom24_15[90] = {
-  0x53, 0x65, 0x36, 0x00, 0x00, 0x00,
-  0x21, 0x32, 0x13, 0x00, 0x00, 0x00,
-  0x90, 0x99, 0x09, 0x00, 0x00, 0x00,
-  0x02, 0x50, 0x25, 0x00, 0x00, 0x00,
-  0x06, 0xa0, 0x6a, 0x00, 0x00, 0x00,
-  0x2c, 0x02, 0xc0, 0x00, 0x00, 0x00,
-  0x88, 0x68, 0x86, 0x00, 0x00, 0x00,
-  0x20, 0x62, 0x06, 0x00, 0x00, 0x00,
-  0x80, 0x38, 0x03, 0x00, 0x00, 0x00,
-  0x42, 0x44, 0x24, 0x00, 0x00, 0x00,
-  0x01, 0x90, 0x19, 0x00, 0x00, 0x00,
-  0x14, 0x11, 0x41, 0x00, 0x00, 0x00,
-  0x0a, 0x80, 0xa8, 0x00, 0x00, 0x00,
-  0x38, 0x03, 0x80, 0x00, 0x00, 0x00,
-  0xc5, 0x0c, 0x50, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom24_16[96] = {
-  0x20, 0x62, 0x06, 0x00, 0x00, 0x00,
-  0x80, 0x38, 0x03, 0x00, 0x00, 0x00,
-  0x42, 0x44, 0x24, 0x00, 0x00, 0x00,
-  0x01, 0x90, 0x19, 0x00, 0x00, 0x00,
-  0x14, 0x11, 0x41, 0x00, 0x00, 0x00,
-  0x0a, 0x80, 0xa8, 0x00, 0x00, 0x00,
-  0x38, 0x03, 0x80, 0x00, 0x00, 0x00,
-  0xc5, 0x0c, 0x50, 0x00, 0x00, 0x00,
-  0x53, 0x65, 0x36, 0x00, 0x00, 0x00,
-  0x21, 0x32, 0x13, 0x00, 0x00, 0x00,
-  0x90, 0x99, 0x09, 0x00, 0x00, 0x00,
-  0x02, 0x50, 0x25, 0x00, 0x00, 0x00,
-  0x06, 0xa0, 0x6a, 0x00, 0x00, 0x00,
-  0x2c, 0x02, 0xc0, 0x00, 0x00, 0x00,
-  0x88, 0x68, 0x86, 0x00, 0x00, 0x00,
-  0xff, 0x6e, 0x0a, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom24_17[102] = {
-  0x20, 0x62, 0x06, 0x00, 0x00, 0x00,
-  0x80, 0x38, 0x03, 0x00, 0x00, 0x00,
-  0x42, 0x44, 0x24, 0x00, 0x00, 0x00,
-  0x01, 0x90, 0x19, 0x00, 0x00, 0x00,
-  0x14, 0x11, 0x41, 0x00, 0x00, 0x00,
-  0x0a, 0x80, 0xa8, 0x00, 0x00, 0x00,
-  0x38, 0x03, 0x80, 0x00, 0x00, 0x00,
-  0xc5, 0x0c, 0x50, 0x00, 0x00, 0x00,
-  0x53, 0x65, 0x36, 0x00, 0x00, 0x00,
-  0xe4, 0x2e, 0x42, 0x00, 0x00, 0x00,
-  0x24, 0x42, 0x44, 0x00, 0x00, 0x00,
-  0xa1, 0x1a, 0x11, 0x00, 0x00, 0x00,
-  0x18, 0x31, 0x83, 0x00, 0x00, 0x00,
-  0x03, 0x90, 0x39, 0x00, 0x00, 0x00,
-  0x8a, 0x18, 0xa1, 0x00, 0x00, 0x00,
-  0x04, 0x90, 0x49, 0x00, 0x00, 0x00,
-  0x00, 0xe0, 0x0e, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom24_18[108] = {
-  0x53, 0x65, 0x36, 0x00, 0x00, 0x00,
-  0xe4, 0x2e, 0x42, 0x00, 0x00, 0x00,
-  0x24, 0x42, 0x44, 0x00, 0x00, 0x00,
-  0xa1, 0x1a, 0x11, 0x00, 0x00, 0x00,
-  0x18, 0x31, 0x83, 0x00, 0x00, 0x00,
-  0x03, 0x90, 0x39, 0x00, 0x00, 0x00,
-  0x8a, 0x18, 0xa1, 0x00, 0x00, 0x00,
-  0x04, 0x90, 0x49, 0x00, 0x00, 0x00,
-  0x00, 0xe0, 0x0e, 0x00, 0x00, 0x00,
-  0x20, 0x62, 0x06, 0x00, 0x00, 0x00,
-  0x80, 0x38, 0x03, 0x00, 0x00, 0x00,
-  0x42, 0x44, 0x24, 0x00, 0x00, 0x00,
-  0x01, 0x90, 0x19, 0x00, 0x00, 0x00,
-  0x14, 0x11, 0x41, 0x00, 0x00, 0x00,
-  0x0a, 0x80, 0xa8, 0x00, 0x00, 0x00,
-  0x38, 0x03, 0x80, 0x00, 0x00, 0x00,
-  0xc5, 0x0c, 0x50, 0x00, 0x00, 0x00,
-  0x34, 0x50, 0xae, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom24_19[114] = {
-  0x53, 0x65, 0x36, 0x00, 0x00, 0x00,
-  0xe4, 0x2e, 0x42, 0x00, 0x00, 0x00,
-  0x24, 0x42, 0x44, 0x00, 0x00, 0x00,
-  0xa1, 0x1a, 0x11, 0x00, 0x00, 0x00,
-  0x18, 0x31, 0x83, 0x00, 0x00, 0x00,
-  0x03, 0x90, 0x39, 0x00, 0x00, 0x00,
-  0x8a, 0x18, 0xa1, 0x00, 0x00, 0x00,
-  0x04, 0x90, 0x49, 0x00, 0x00, 0x00,
-  0x00, 0xe0, 0x0e, 0x00, 0x00, 0x00,
-  0x51, 0x45, 0x14, 0x00, 0x00, 0x00,
-  0x45, 0x14, 0x51, 0x00, 0x00, 0x00,
-  0x80, 0xd8, 0x0d, 0x00, 0x00, 0x00,
-  0x24, 0x22, 0x42, 0x00, 0x00, 0x00,
-  0x0a, 0x20, 0xa2, 0x00, 0x00, 0x00,
-  0x00, 0xe0, 0x0e, 0x00, 0x00, 0x00,
-  0xb8, 0x0b, 0x80, 0x00, 0x00, 0x00,
-  0x09, 0x10, 0x91, 0x00, 0x00, 0x00,
-  0x56, 0x05, 0x60, 0x00, 0x00, 0x00,
-  0xa2, 0x8a, 0x28, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom24_2[12] = {
-  0xec, 0xce, 0xcc, 0x00, 0x00, 0x00,
-  0x93, 0xb9, 0x3b, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom24_20[120] = {
-  0x51, 0x45, 0x14, 0x00, 0x00, 0x00,
-  0x45, 0x14, 0x51, 0x00, 0x00, 0x00,
-  0x80, 0xd8, 0x0d, 0x00, 0x00, 0x00,
-  0x24, 0x22, 0x42, 0x00, 0x00, 0x00,
-  0x0a, 0x20, 0xa2, 0x00, 0x00, 0x00,
-  0x00, 0xe0, 0x0e, 0x00, 0x00, 0x00,
-  0xb8, 0x0b, 0x80, 0x00, 0x00, 0x00,
-  0x09, 0x10, 0x91, 0x00, 0x00, 0x00,
-  0x56, 0x05, 0x60, 0x00, 0x00, 0x00,
-  0xa2, 0x8a, 0x28, 0x00, 0x00, 0x00,
-  0x53, 0x65, 0x36, 0x00, 0x00, 0x00,
-  0xe4, 0x2e, 0x42, 0x00, 0x00, 0x00,
-  0x24, 0x42, 0x44, 0x00, 0x00, 0x00,
-  0xa1, 0x1a, 0x11, 0x00, 0x00, 0x00,
-  0x18, 0x31, 0x83, 0x00, 0x00, 0x00,
-  0x03, 0x90, 0x39, 0x00, 0x00, 0x00,
-  0x8a, 0x18, 0xa1, 0x00, 0x00, 0x00,
-  0x04, 0x90, 0x49, 0x00, 0x00, 0x00,
-  0x00, 0xe0, 0x0e, 0x00, 0x00, 0x00,
-  0x98, 0xa2, 0x95, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom24_21[126] = {
-  0x51, 0x45, 0x14, 0x00, 0x00, 0x00,
-  0x45, 0x14, 0x51, 0x00, 0x00, 0x00,
-  0x80, 0xd8, 0x0d, 0x00, 0x00, 0x00,
-  0x24, 0x22, 0x42, 0x00, 0x00, 0x00,
-  0x0a, 0x20, 0xa2, 0x00, 0x00, 0x00,
-  0x00, 0xe0, 0x0e, 0x00, 0x00, 0x00,
-  0xb8, 0x0b, 0x80, 0x00, 0x00, 0x00,
-  0x09, 0x10, 0x91, 0x00, 0x00, 0x00,
-  0x56, 0x05, 0x60, 0x00, 0x00, 0x00,
-  0xa2, 0x8a, 0x28, 0x00, 0x00, 0x00,
-  0x53, 0x65, 0x36, 0x00, 0x00, 0x00,
-  0x21, 0x32, 0x13, 0x00, 0x00, 0x00,
-  0x10, 0x91, 0x09, 0x00, 0x00, 0x00,
-  0x00, 0x70, 0x07, 0x00, 0x00, 0x00,
-  0x0c, 0x10, 0xc1, 0x00, 0x00, 0x00,
-  0x40, 0xc4, 0x0c, 0x00, 0x00, 0x00,
-  0x6a, 0x06, 0xa0, 0x00, 0x00, 0x00,
-  0x86, 0x08, 0x60, 0x00, 0x00, 0x00,
-  0x24, 0x82, 0x48, 0x00, 0x00, 0x00,
-  0x89, 0x08, 0x90, 0x00, 0x00, 0x00,
-  0xc0, 0x2c, 0x02, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom24_22[132] = {
-  0x53, 0x65, 0x36, 0x00, 0x00, 0x00,
-  0x21, 0x32, 0x13, 0x00, 0x00, 0x00,
-  0x10, 0x91, 0x09, 0x00, 0x00, 0x00,
-  0x00, 0x70, 0x07, 0x00, 0x00, 0x00,
-  0x0c, 0x10, 0xc1, 0x00, 0x00, 0x00,
-  0x40, 0xc4, 0x0c, 0x00, 0x00, 0x00,
-  0x6a, 0x06, 0xa0, 0x00, 0x00, 0x00,
-  0x86, 0x08, 0x60, 0x00, 0x00, 0x00,
-  0x24, 0x82, 0x48, 0x00, 0x00, 0x00,
-  0x89, 0x08, 0x90, 0x00, 0x00, 0x00,
-  0xc0, 0x2c, 0x02, 0x00, 0x00, 0x00,
-  0x51, 0x45, 0x14, 0x00, 0x00, 0x00,
-  0x45, 0x14, 0x51, 0x00, 0x00, 0x00,
-  0x80, 0xd8, 0x0d, 0x00, 0x00, 0x00,
-  0x24, 0x22, 0x42, 0x00, 0x00, 0x00,
-  0x0a, 0x20, 0xa2, 0x00, 0x00, 0x00,
-  0x00, 0xe0, 0x0e, 0x00, 0x00, 0x00,
-  0xb8, 0x0b, 0x80, 0x00, 0x00, 0x00,
-  0x09, 0x10, 0x91, 0x00, 0x00, 0x00,
-  0x56, 0x05, 0x60, 0x00, 0x00, 0x00,
-  0xa2, 0x8a, 0x28, 0x00, 0x00, 0x00,
-  0x1a, 0xaa, 0xee, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom24_23[138] = {
-  0x53, 0x65, 0x36, 0x00, 0x00, 0x00,
-  0x21, 0x32, 0x13, 0x00, 0x00, 0x00,
-  0x10, 0x91, 0x09, 0x00, 0x00, 0x00,
-  0x00, 0x70, 0x07, 0x00, 0x00, 0x00,
-  0x0c, 0x10, 0xc1, 0x00, 0x00, 0x00,
-  0x40, 0xc4, 0x0c, 0x00, 0x00, 0x00,
-  0x6a, 0x06, 0xa0, 0x00, 0x00, 0x00,
-  0x86, 0x08, 0x60, 0x00, 0x00, 0x00,
-  0x24, 0x82, 0x48, 0x00, 0x00, 0x00,
-  0x89, 0x08, 0x90, 0x00, 0x00, 0x00,
-  0xc0, 0x2c, 0x02, 0x00, 0x00, 0x00,
-  0x10, 0x61, 0x06, 0x00, 0x00, 0x00,
-  0x02, 0x30, 0x23, 0x00, 0x00, 0x00,
-  0x40, 0x54, 0x05, 0x00, 0x00, 0x00,
-  0x21, 0x82, 0x18, 0x00, 0x00, 0x00,
-  0x81, 0x18, 0x11, 0x00, 0x00, 0x00,
-  0x14, 0x81, 0x48, 0x00, 0x00, 0x00,
-  0x98, 0x09, 0x80, 0x00, 0x00, 0x00,
-  0x08, 0x90, 0x89, 0x00, 0x00, 0x00,
-  0x62, 0x06, 0x20, 0x00, 0x00, 0x00,
-  0x24, 0x22, 0x42, 0x00, 0x00, 0x00,
-  0x8a, 0x08, 0xa0, 0x00, 0x00, 0x00,
-  0x84, 0x48, 0x44, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom24_24[144] = {
-  0x10, 0x61, 0x06, 0x00, 0x00, 0x00,
-  0x02, 0x30, 0x23, 0x00, 0x00, 0x00,
-  0x40, 0x54, 0x05, 0x00, 0x00, 0x00,
-  0x21, 0x82, 0x18, 0x00, 0x00, 0x00,
-  0x81, 0x18, 0x11, 0x00, 0x00, 0x00,
-  0x14, 0x81, 0x48, 0x00, 0x00, 0x00,
-  0x98, 0x09, 0x80, 0x00, 0x00, 0x00,
-  0x08, 0x90, 0x89, 0x00, 0x00, 0x00,
-  0x62, 0x06, 0x20, 0x00, 0x00, 0x00,
-  0x24, 0x22, 0x42, 0x00, 0x00, 0x00,
-  0x8a, 0x08, 0xa0, 0x00, 0x00, 0x00,
-  0x84, 0x48, 0x44, 0x00, 0x00, 0x00,
-  0x53, 0x65, 0x36, 0x00, 0x00, 0x00,
-  0x21, 0x32, 0x13, 0x00, 0x00, 0x00,
-  0x10, 0x91, 0x09, 0x00, 0x00, 0x00,
-  0x00, 0x70, 0x07, 0x00, 0x00, 0x00,
-  0x0c, 0x10, 0xc1, 0x00, 0x00, 0x00,
-  0x40, 0xc4, 0x0c, 0x00, 0x00, 0x00,
-  0x6a, 0x06, 0xa0, 0x00, 0x00, 0x00,
-  0x86, 0x08, 0x60, 0x00, 0x00, 0x00,
-  0x24, 0x82, 0x48, 0x00, 0x00, 0x00,
-  0x89, 0x08, 0x90, 0x00, 0x00, 0x00,
-  0xc0, 0x2c, 0x02, 0x00, 0x00, 0x00,
-  0x88, 0x32, 0x59, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom24_3[18] = {
-  0x9b, 0x29, 0xb2, 0x00, 0x00, 0x00,
-  0x49, 0xd4, 0x9d, 0x00, 0x00, 0x00,
-  0x3e, 0x83, 0xe8, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom24_4[24] = {
-  0x8b, 0x28, 0xb2, 0x00, 0x00, 0x00,
-  0x14, 0xb1, 0x4b, 0x00, 0x00, 0x00,
-  0x22, 0xd2, 0x2d, 0x00, 0x00, 0x00,
-  0x45, 0x54, 0x55, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom24_5[30] = {
-  0x53, 0x65, 0x36, 0x00, 0x00, 0x00,
-  0x64, 0xb6, 0x4b, 0x00, 0x00, 0x00,
-  0x0e, 0xe0, 0xee, 0x00, 0x00, 0x00,
-  0xa9, 0xca, 0x9c, 0x00, 0x00, 0x00,
-  0xb8, 0x3b, 0x83, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom24_6[36] = {
-  0xd1, 0x4d, 0x14, 0x00, 0x00, 0x00,
-  0x45, 0x34, 0x53, 0x00, 0x00, 0x00,
-  0x22, 0xd2, 0x2d, 0x00, 0x00, 0x00,
-  0x16, 0xc1, 0x6c, 0x00, 0x00, 0x00,
-  0x0b, 0xa0, 0xba, 0x00, 0x00, 0x00,
-  0xe8, 0x8e, 0x88, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom24_7[42] = {
-  0xd3, 0x65, 0x36, 0x00, 0x00, 0x00,
-  0x25, 0x32, 0x53, 0x00, 0x00, 0x00,
-  0x30, 0xd3, 0x05, 0x00, 0x00, 0x00,
-  0x06, 0x48, 0x6c, 0x00, 0x00, 0x00,
-  0xc0, 0xb8, 0x1b, 0x00, 0x00, 0x00,
-  0x2a, 0xa2, 0xaa, 0x00, 0x00, 0x00,
-  0xa8, 0x4e, 0x84, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom24_8[48] = {
-  0x81, 0x60, 0x16, 0x00, 0x00, 0x00,
-  0x40, 0x3c, 0x03, 0x00, 0x00, 0x00,
-  0x10, 0x91, 0x09, 0x00, 0x00, 0x00,
-  0x06, 0x50, 0x65, 0x00, 0x00, 0x00,
-  0x20, 0x4a, 0x84, 0x00, 0x00, 0x00,
-  0x8a, 0xa0, 0xaa, 0x00, 0x00, 0x00,
-  0x33, 0x03, 0x30, 0x00, 0x00, 0x00,
-  0x4c, 0x84, 0xc8, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom24_9[54] = {
-  0xd3, 0x65, 0x36, 0x00, 0x00, 0x00,
-  0x64, 0x26, 0x42, 0x00, 0x00, 0x00,
-  0x18, 0x41, 0xc4, 0x00, 0x00, 0x00,
-  0xa0, 0x4a, 0x04, 0x00, 0x00, 0x00,
-  0x81, 0x38, 0x13, 0x00, 0x00, 0x00,
-  0x22, 0xa2, 0x2a, 0x00, 0x00, 0x00,
-  0x08, 0x70, 0x87, 0x00, 0x00, 0x00,
-  0x04, 0x90, 0x49, 0x00, 0x00, 0x00,
-  0x01, 0xc0, 0x1c, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom25_1[6] = {
-  0xff, 0xff, 0xff, 0x80, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom25_10[60] = {
-  0x51, 0x4d, 0x10, 0x00, 0x00, 0x00,
-  0x45, 0x14, 0x45, 0x00, 0x00, 0x00,
-  0x80, 0xd1, 0x09, 0x80, 0x00, 0x00,
-  0x24, 0x2a, 0x05, 0x00, 0x00, 0x00,
-  0x0a, 0x24, 0xa0, 0x80, 0x00, 0x00,
-  0x00, 0xe4, 0x03, 0x00, 0x00, 0x00,
-  0xb8, 0x08, 0x02, 0x80, 0x00, 0x00,
-  0x09, 0x10, 0xc9, 0x00, 0x00, 0x00,
-  0x56, 0x00, 0x58, 0x80, 0x00, 0x00,
-  0xa2, 0x86, 0x22, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom25_11[66] = {
-  0x53, 0x65, 0x12, 0x00, 0x00, 0x00,
-  0x21, 0x32, 0x21, 0x00, 0x00, 0x00,
-  0x10, 0x91, 0x34, 0x00, 0x00, 0x00,
-  0x00, 0x72, 0x50, 0x00, 0x00, 0x00,
-  0x0c, 0x11, 0x81, 0x80, 0x00, 0x00,
-  0x40, 0xc0, 0xa2, 0x00, 0x00, 0x00,
-  0x6a, 0x08, 0x88, 0x80, 0x00, 0x00,
-  0x86, 0x00, 0x68, 0x00, 0x00, 0x00,
-  0x24, 0x8e, 0x02, 0x00, 0x00, 0x00,
-  0x89, 0x08, 0x44, 0x00, 0x00, 0x00,
-  0xc0, 0x24, 0x41, 0x80, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom25_12[72] = {
-  0x10, 0x62, 0x82, 0x80, 0x00, 0x00,
-  0x02, 0x38, 0x45, 0x00, 0x00, 0x00,
-  0x40, 0x56, 0x04, 0x00, 0x00, 0x00,
-  0x21, 0x80, 0x54, 0x80, 0x00, 0x00,
-  0x81, 0x10, 0x29, 0x80, 0x00, 0x00,
-  0x14, 0x80, 0x13, 0x00, 0x00, 0x00,
-  0x98, 0x04, 0x81, 0x00, 0x00, 0x00,
-  0x08, 0x92, 0x48, 0x00, 0x00, 0x00,
-  0x62, 0x09, 0x40, 0x00, 0x00, 0x00,
-  0x24, 0x28, 0xa0, 0x00, 0x00, 0x00,
-  0x8a, 0x01, 0x18, 0x00, 0x00, 0x00,
-  0x84, 0x45, 0x22, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom25_13[78] = {
-  0x51, 0x4d, 0x12, 0x00, 0x00, 0x00,
-  0xc5, 0x14, 0x6d, 0x00, 0x00, 0x00,
-  0x21, 0x81, 0x54, 0x80, 0x00, 0x00,
-  0x12, 0x32, 0x17, 0x00, 0x00, 0x00,
-  0x08, 0xe2, 0x8c, 0x80, 0x00, 0x00,
-  0x2e, 0x0a, 0xa2, 0x00, 0x00, 0x00,
-  0x53, 0x65, 0x92, 0x00, 0x00, 0x00,
-  0x21, 0x32, 0x65, 0x00, 0x00, 0x00,
-  0x90, 0x9b, 0x14, 0x00, 0x00, 0x00,
-  0x02, 0x52, 0xb0, 0x80, 0x00, 0x00,
-  0x06, 0xa1, 0x4c, 0x80, 0x00, 0x00,
-  0x2c, 0x0c, 0x88, 0x80, 0x00, 0x00,
-  0x88, 0x68, 0x4b, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom25_14[84] = {
-  0x53, 0x65, 0x92, 0x00, 0x00, 0x00,
-  0x21, 0x32, 0x65, 0x00, 0x00, 0x00,
-  0x90, 0x9b, 0x14, 0x00, 0x00, 0x00,
-  0x02, 0x52, 0xb0, 0x80, 0x00, 0x00,
-  0x06, 0xa1, 0x4c, 0x80, 0x00, 0x00,
-  0x2c, 0x0c, 0x88, 0x80, 0x00, 0x00,
-  0x88, 0x68, 0x4b, 0x00, 0x00, 0x00,
-  0x51, 0x4d, 0x12, 0x00, 0x00, 0x00,
-  0xc5, 0x14, 0x6d, 0x00, 0x00, 0x00,
-  0x21, 0x81, 0x54, 0x80, 0x00, 0x00,
-  0x12, 0x32, 0x17, 0x00, 0x00, 0x00,
-  0x08, 0xe2, 0x8c, 0x80, 0x00, 0x00,
-  0x2e, 0x0a, 0xa2, 0x00, 0x00, 0x00,
-  0x73, 0x76, 0x61, 0x80, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom25_15[90] = {
-  0x53, 0x65, 0x92, 0x00, 0x00, 0x00,
-  0x21, 0x32, 0x65, 0x00, 0x00, 0x00,
-  0x90, 0x9b, 0x14, 0x00, 0x00, 0x00,
-  0x02, 0x52, 0xb0, 0x80, 0x00, 0x00,
-  0x06, 0xa1, 0x4c, 0x80, 0x00, 0x00,
-  0x2c, 0x0c, 0x88, 0x80, 0x00, 0x00,
-  0x88, 0x68, 0x4b, 0x00, 0x00, 0x00,
-  0x20, 0x68, 0x0a, 0x80, 0x00, 0x00,
-  0x80, 0x33, 0x09, 0x00, 0x00, 0x00,
-  0x42, 0x41, 0x60, 0x80, 0x00, 0x00,
-  0x01, 0x90, 0x33, 0x00, 0x00, 0x00,
-  0x14, 0x14, 0x46, 0x00, 0x00, 0x00,
-  0x0a, 0x80, 0x81, 0x80, 0x00, 0x00,
-  0x38, 0x0d, 0x80, 0x00, 0x00, 0x00,
-  0xc5, 0x0a, 0x14, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom25_16[96] = {
-  0x20, 0x68, 0x0a, 0x80, 0x00, 0x00,
-  0x80, 0x33, 0x09, 0x00, 0x00, 0x00,
-  0x42, 0x41, 0x60, 0x80, 0x00, 0x00,
-  0x01, 0x90, 0x33, 0x00, 0x00, 0x00,
-  0x14, 0x14, 0x46, 0x00, 0x00, 0x00,
-  0x0a, 0x80, 0x81, 0x80, 0x00, 0x00,
-  0x38, 0x0d, 0x80, 0x00, 0x00, 0x00,
-  0xc5, 0x0a, 0x14, 0x00, 0x00, 0x00,
-  0x53, 0x65, 0x92, 0x00, 0x00, 0x00,
-  0x21, 0x32, 0x65, 0x00, 0x00, 0x00,
-  0x90, 0x9b, 0x14, 0x00, 0x00, 0x00,
-  0x02, 0x52, 0xb0, 0x80, 0x00, 0x00,
-  0x06, 0xa1, 0x4c, 0x80, 0x00, 0x00,
-  0x2c, 0x0c, 0x88, 0x80, 0x00, 0x00,
-  0x88, 0x68, 0x4b, 0x00, 0x00, 0x00,
-  0x16, 0xe8, 0xdc, 0x80, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom25_17[102] = {
-  0x20, 0x68, 0x0a, 0x80, 0x00, 0x00,
-  0x80, 0x33, 0x09, 0x00, 0x00, 0x00,
-  0x42, 0x41, 0x60, 0x80, 0x00, 0x00,
-  0x01, 0x90, 0x33, 0x00, 0x00, 0x00,
-  0x14, 0x14, 0x46, 0x00, 0x00, 0x00,
-  0x0a, 0x80, 0x81, 0x80, 0x00, 0x00,
-  0x38, 0x0d, 0x80, 0x00, 0x00, 0x00,
-  0xc5, 0x0a, 0x14, 0x00, 0x00, 0x00,
-  0x53, 0x65, 0x92, 0x00, 0x00, 0x00,
-  0xe4, 0x26, 0x64, 0x00, 0x00, 0x00,
-  0x24, 0x41, 0x44, 0x00, 0x00, 0x00,
-  0xa1, 0x12, 0x14, 0x80, 0x00, 0x00,
-  0x18, 0x30, 0x2c, 0x80, 0x00, 0x00,
-  0x03, 0x99, 0x41, 0x00, 0x00, 0x00,
-  0x8a, 0x18, 0x0a, 0x80, 0x00, 0x00,
-  0x04, 0x90, 0xa9, 0x00, 0x00, 0x00,
-  0x00, 0xe4, 0x01, 0x80, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom25_18[108] = {
-  0x53, 0x65, 0x92, 0x00, 0x00, 0x00,
-  0xe4, 0x26, 0x64, 0x00, 0x00, 0x00,
-  0x24, 0x41, 0x44, 0x00, 0x00, 0x00,
-  0xa1, 0x12, 0x14, 0x80, 0x00, 0x00,
-  0x18, 0x30, 0x2c, 0x80, 0x00, 0x00,
-  0x03, 0x99, 0x41, 0x00, 0x00, 0x00,
-  0x8a, 0x18, 0x0a, 0x80, 0x00, 0x00,
-  0x04, 0x90, 0xa9, 0x00, 0x00, 0x00,
-  0x00, 0xe4, 0x01, 0x80, 0x00, 0x00,
-  0x20, 0x68, 0x0a, 0x80, 0x00, 0x00,
-  0x80, 0x33, 0x09, 0x00, 0x00, 0x00,
-  0x42, 0x41, 0x60, 0x80, 0x00, 0x00,
-  0x01, 0x90, 0x33, 0x00, 0x00, 0x00,
-  0x14, 0x14, 0x46, 0x00, 0x00, 0x00,
-  0x0a, 0x80, 0x81, 0x80, 0x00, 0x00,
-  0x38, 0x0d, 0x80, 0x00, 0x00, 0x00,
-  0xc5, 0x0a, 0x14, 0x00, 0x00, 0x00,
-  0xce, 0x9b, 0xe1, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom25_19[114] = {
-  0x53, 0x65, 0x92, 0x00, 0x00, 0x00,
-  0xe4, 0x26, 0x64, 0x00, 0x00, 0x00,
-  0x24, 0x41, 0x44, 0x00, 0x00, 0x00,
-  0xa1, 0x12, 0x14, 0x80, 0x00, 0x00,
-  0x18, 0x30, 0x2c, 0x80, 0x00, 0x00,
-  0x03, 0x99, 0x41, 0x00, 0x00, 0x00,
-  0x8a, 0x18, 0x0a, 0x80, 0x00, 0x00,
-  0x04, 0x90, 0xa9, 0x00, 0x00, 0x00,
-  0x00, 0xe4, 0x01, 0x80, 0x00, 0x00,
-  0x51, 0x4d, 0x10, 0x00, 0x00, 0x00,
-  0x45, 0x14, 0x45, 0x00, 0x00, 0x00,
-  0x80, 0xd1, 0x09, 0x80, 0x00, 0x00,
-  0x24, 0x2a, 0x05, 0x00, 0x00, 0x00,
-  0x0a, 0x24, 0xa0, 0x80, 0x00, 0x00,
-  0x00, 0xe4, 0x03, 0x00, 0x00, 0x00,
-  0xb8, 0x08, 0x02, 0x80, 0x00, 0x00,
-  0x09, 0x10, 0xc9, 0x00, 0x00, 0x00,
-  0x56, 0x00, 0x58, 0x80, 0x00, 0x00,
-  0xa2, 0x86, 0x22, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom25_2[12] = {
-  0xec, 0xce, 0xcc, 0x00, 0x00, 0x00,
-  0x93, 0xb1, 0xb3, 0x80, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom25_20[120] = {
-  0x51, 0x4d, 0x10, 0x00, 0x00, 0x00,
-  0x45, 0x14, 0x45, 0x00, 0x00, 0x00,
-  0x80, 0xd1, 0x09, 0x80, 0x00, 0x00,
-  0x24, 0x2a, 0x05, 0x00, 0x00, 0x00,
-  0x0a, 0x24, 0xa0, 0x80, 0x00, 0x00,
-  0x00, 0xe4, 0x03, 0x00, 0x00, 0x00,
-  0xb8, 0x08, 0x02, 0x80, 0x00, 0x00,
-  0x09, 0x10, 0xc9, 0x00, 0x00, 0x00,
-  0x56, 0x00, 0x58, 0x80, 0x00, 0x00,
-  0xa2, 0x86, 0x22, 0x00, 0x00, 0x00,
-  0x53, 0x65, 0x92, 0x00, 0x00, 0x00,
-  0xe4, 0x26, 0x64, 0x00, 0x00, 0x00,
-  0x24, 0x41, 0x44, 0x00, 0x00, 0x00,
-  0xa1, 0x12, 0x14, 0x80, 0x00, 0x00,
-  0x18, 0x30, 0x2c, 0x80, 0x00, 0x00,
-  0x03, 0x99, 0x41, 0x00, 0x00, 0x00,
-  0x8a, 0x18, 0x0a, 0x80, 0x00, 0x00,
-  0x04, 0x90, 0xa9, 0x00, 0x00, 0x00,
-  0x00, 0xe4, 0x01, 0x80, 0x00, 0x00,
-  0x1b, 0x8a, 0xa0, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom25_21[126] = {
-  0x51, 0x4d, 0x10, 0x00, 0x00, 0x00,
-  0x45, 0x14, 0x45, 0x00, 0x00, 0x00,
-  0x80, 0xd1, 0x09, 0x80, 0x00, 0x00,
-  0x24, 0x2a, 0x05, 0x00, 0x00, 0x00,
-  0x0a, 0x24, 0xa0, 0x80, 0x00, 0x00,
-  0x00, 0xe4, 0x03, 0x00, 0x00, 0x00,
-  0xb8, 0x08, 0x02, 0x80, 0x00, 0x00,
-  0x09, 0x10, 0xc9, 0x00, 0x00, 0x00,
-  0x56, 0x00, 0x58, 0x80, 0x00, 0x00,
-  0xa2, 0x86, 0x22, 0x00, 0x00, 0x00,
-  0x53, 0x65, 0x12, 0x00, 0x00, 0x00,
-  0x21, 0x32, 0x21, 0x00, 0x00, 0x00,
-  0x10, 0x91, 0x34, 0x00, 0x00, 0x00,
-  0x00, 0x72, 0x50, 0x00, 0x00, 0x00,
-  0x0c, 0x11, 0x81, 0x80, 0x00, 0x00,
-  0x40, 0xc0, 0xa2, 0x00, 0x00, 0x00,
-  0x6a, 0x08, 0x88, 0x80, 0x00, 0x00,
-  0x86, 0x00, 0x68, 0x00, 0x00, 0x00,
-  0x24, 0x8e, 0x02, 0x00, 0x00, 0x00,
-  0x89, 0x08, 0x44, 0x00, 0x00, 0x00,
-  0xc0, 0x24, 0x41, 0x80, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom25_22[132] = {
-  0x53, 0x65, 0x12, 0x00, 0x00, 0x00,
-  0x21, 0x32, 0x21, 0x00, 0x00, 0x00,
-  0x10, 0x91, 0x34, 0x00, 0x00, 0x00,
-  0x00, 0x72, 0x50, 0x00, 0x00, 0x00,
-  0x0c, 0x11, 0x81, 0x80, 0x00, 0x00,
-  0x40, 0xc0, 0xa2, 0x00, 0x00, 0x00,
-  0x6a, 0x08, 0x88, 0x80, 0x00, 0x00,
-  0x86, 0x00, 0x68, 0x00, 0x00, 0x00,
-  0x24, 0x8e, 0x02, 0x00, 0x00, 0x00,
-  0x89, 0x08, 0x44, 0x00, 0x00, 0x00,
-  0xc0, 0x24, 0x41, 0x80, 0x00, 0x00,
-  0x51, 0x4d, 0x10, 0x00, 0x00, 0x00,
-  0x45, 0x14, 0x45, 0x00, 0x00, 0x00,
-  0x80, 0xd1, 0x09, 0x80, 0x00, 0x00,
-  0x24, 0x2a, 0x05, 0x00, 0x00, 0x00,
-  0x0a, 0x24, 0xa0, 0x80, 0x00, 0x00,
-  0x00, 0xe4, 0x03, 0x00, 0x00, 0x00,
-  0xb8, 0x08, 0x02, 0x80, 0x00, 0x00,
-  0x09, 0x10, 0xc9, 0x00, 0x00, 0x00,
-  0x56, 0x00, 0x58, 0x80, 0x00, 0x00,
-  0xa2, 0x86, 0x22, 0x00, 0x00, 0x00,
-  0x15, 0xa2, 0x99, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom25_23[138] = {
-  0x53, 0x65, 0x12, 0x00, 0x00, 0x00,
-  0x21, 0x32, 0x21, 0x00, 0x00, 0x00,
-  0x10, 0x91, 0x34, 0x00, 0x00, 0x00,
-  0x00, 0x72, 0x50, 0x00, 0x00, 0x00,
-  0x0c, 0x11, 0x81, 0x80, 0x00, 0x00,
-  0x40, 0xc0, 0xa2, 0x00, 0x00, 0x00,
-  0x6a, 0x08, 0x88, 0x80, 0x00, 0x00,
-  0x86, 0x00, 0x68, 0x00, 0x00, 0x00,
-  0x24, 0x8e, 0x02, 0x00, 0x00, 0x00,
-  0x89, 0x08, 0x44, 0x00, 0x00, 0x00,
-  0xc0, 0x24, 0x41, 0x80, 0x00, 0x00,
-  0x10, 0x62, 0x82, 0x80, 0x00, 0x00,
-  0x02, 0x38, 0x45, 0x00, 0x00, 0x00,
-  0x40, 0x56, 0x04, 0x00, 0x00, 0x00,
-  0x21, 0x80, 0x54, 0x80, 0x00, 0x00,
-  0x81, 0x10, 0x29, 0x80, 0x00, 0x00,
-  0x14, 0x80, 0x13, 0x00, 0x00, 0x00,
-  0x98, 0x04, 0x81, 0x00, 0x00, 0x00,
-  0x08, 0x92, 0x48, 0x00, 0x00, 0x00,
-  0x62, 0x09, 0x40, 0x00, 0x00, 0x00,
-  0x24, 0x28, 0xa0, 0x00, 0x00, 0x00,
-  0x8a, 0x01, 0x18, 0x00, 0x00, 0x00,
-  0x84, 0x45, 0x22, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom25_24[144] = {
-  0x10, 0x62, 0x82, 0x80, 0x00, 0x00,
-  0x02, 0x38, 0x45, 0x00, 0x00, 0x00,
-  0x40, 0x56, 0x04, 0x00, 0x00, 0x00,
-  0x21, 0x80, 0x54, 0x80, 0x00, 0x00,
-  0x81, 0x10, 0x29, 0x80, 0x00, 0x00,
-  0x14, 0x80, 0x13, 0x00, 0x00, 0x00,
-  0x98, 0x04, 0x81, 0x00, 0x00, 0x00,
-  0x08, 0x92, 0x48, 0x00, 0x00, 0x00,
-  0x62, 0x09, 0x40, 0x00, 0x00, 0x00,
-  0x24, 0x28, 0xa0, 0x00, 0x00, 0x00,
-  0x8a, 0x01, 0x18, 0x00, 0x00, 0x00,
-  0x84, 0x45, 0x22, 0x00, 0x00, 0x00,
-  0x53, 0x65, 0x12, 0x00, 0x00, 0x00,
-  0x21, 0x32, 0x21, 0x00, 0x00, 0x00,
-  0x10, 0x91, 0x34, 0x00, 0x00, 0x00,
-  0x00, 0x72, 0x50, 0x00, 0x00, 0x00,
-  0x0c, 0x11, 0x81, 0x80, 0x00, 0x00,
-  0x40, 0xc0, 0xa2, 0x00, 0x00, 0x00,
-  0x6a, 0x08, 0x88, 0x80, 0x00, 0x00,
-  0x86, 0x00, 0x68, 0x00, 0x00, 0x00,
-  0x24, 0x8e, 0x02, 0x00, 0x00, 0x00,
-  0x89, 0x08, 0x44, 0x00, 0x00, 0x00,
-  0xc0, 0x24, 0x41, 0x80, 0x00, 0x00,
-  0xf9, 0x0c, 0x14, 0x80, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom25_25[150] = {
-  0x10, 0x62, 0x82, 0x80, 0x00, 0x00,
-  0x02, 0x38, 0x45, 0x00, 0x00, 0x00,
-  0x40, 0x56, 0x04, 0x00, 0x00, 0x00,
-  0x21, 0x80, 0x54, 0x80, 0x00, 0x00,
-  0x81, 0x10, 0x29, 0x80, 0x00, 0x00,
-  0x14, 0x80, 0x13, 0x00, 0x00, 0x00,
-  0x98, 0x04, 0x81, 0x00, 0x00, 0x00,
-  0x08, 0x92, 0x48, 0x00, 0x00, 0x00,
-  0x62, 0x09, 0x40, 0x00, 0x00, 0x00,
-  0x24, 0x28, 0xa0, 0x00, 0x00, 0x00,
-  0x8a, 0x01, 0x18, 0x00, 0x00, 0x00,
-  0x84, 0x45, 0x22, 0x00, 0x00, 0x00,
-  0x10, 0x65, 0x12, 0x00, 0x00, 0x00,
-  0x02, 0x36, 0x64, 0x00, 0x00, 0x00,
-  0x40, 0x50, 0x54, 0x80, 0x00, 0x00,
-  0x21, 0x88, 0x12, 0x00, 0x00, 0x00,
-  0x81, 0x19, 0x40, 0x00, 0x00, 0x00,
-  0x14, 0x83, 0x08, 0x00, 0x00, 0x00,
-  0x98, 0x02, 0x11, 0x00, 0x00, 0x00,
-  0x08, 0x90, 0x3c, 0x00, 0x00, 0x00,
-  0x62, 0x0e, 0x80, 0x00, 0x00, 0x00,
-  0x24, 0x20, 0xa1, 0x00, 0x00, 0x00,
-  0x8a, 0x08, 0x01, 0x80, 0x00, 0x00,
-  0x84, 0x40, 0x49, 0x00, 0x00, 0x00,
-  0x1c, 0x20, 0x8a, 0x80, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom25_3[18] = {
-  0x9b, 0x89, 0x9b, 0x00, 0x00, 0x00,
-  0x4f, 0x14, 0x6d, 0x80, 0x00, 0x00,
-  0x3c, 0x63, 0x72, 0x80, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom25_4[24] = {
-  0x8b, 0x24, 0x9b, 0x00, 0x00, 0x00,
-  0x14, 0xb2, 0x6d, 0x00, 0x00, 0x00,
-  0x22, 0xd8, 0x56, 0x80, 0x00, 0x00,
-  0x45, 0x55, 0x25, 0x80, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom25_5[30] = {
-  0x53, 0x65, 0x13, 0x00, 0x00, 0x00,
-  0x64, 0x26, 0x64, 0x00, 0x00, 0x00,
-  0x0c, 0xc0, 0xc6, 0x80, 0x00, 0x00,
-  0x82, 0xaa, 0x1c, 0x00, 0x00, 0x00,
-  0x09, 0x32, 0x29, 0x80, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom25_6[36] = {
-  0x51, 0x4d, 0x12, 0x00, 0x00, 0x00,
-  0xc5, 0x14, 0x6d, 0x00, 0x00, 0x00,
-  0x21, 0x81, 0x54, 0x80, 0x00, 0x00,
-  0x12, 0x32, 0x17, 0x00, 0x00, 0x00,
-  0x08, 0xe2, 0x8c, 0x80, 0x00, 0x00,
-  0x2e, 0x0a, 0xa2, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom25_7[42] = {
-  0x53, 0x65, 0x92, 0x00, 0x00, 0x00,
-  0x21, 0x32, 0x65, 0x00, 0x00, 0x00,
-  0x90, 0x9b, 0x14, 0x00, 0x00, 0x00,
-  0x02, 0x52, 0xb0, 0x80, 0x00, 0x00,
-  0x06, 0xa1, 0x4c, 0x80, 0x00, 0x00,
-  0x2c, 0x0c, 0x88, 0x80, 0x00, 0x00,
-  0x88, 0x68, 0x4b, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom25_8[48] = {
-  0x20, 0x68, 0x0a, 0x80, 0x00, 0x00,
-  0x80, 0x33, 0x09, 0x00, 0x00, 0x00,
-  0x42, 0x41, 0x60, 0x80, 0x00, 0x00,
-  0x01, 0x90, 0x33, 0x00, 0x00, 0x00,
-  0x14, 0x14, 0x46, 0x00, 0x00, 0x00,
-  0x0a, 0x80, 0x81, 0x80, 0x00, 0x00,
-  0x38, 0x0d, 0x80, 0x00, 0x00, 0x00,
-  0xc5, 0x0a, 0x14, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom25_9[54] = {
-  0x53, 0x65, 0x92, 0x00, 0x00, 0x00,
-  0xe4, 0x26, 0x64, 0x00, 0x00, 0x00,
-  0x24, 0x41, 0x44, 0x00, 0x00, 0x00,
-  0xa1, 0x12, 0x14, 0x80, 0x00, 0x00,
-  0x18, 0x30, 0x2c, 0x80, 0x00, 0x00,
-  0x03, 0x99, 0x41, 0x00, 0x00, 0x00,
-  0x8a, 0x18, 0x0a, 0x80, 0x00, 0x00,
-  0x04, 0x90, 0xa9, 0x00, 0x00, 0x00,
-  0x00, 0xe4, 0x01, 0x80, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom26_1[6] = {
-  0xff, 0xff, 0xff, 0xc0, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom26_10[60] = {
-  0xd1, 0x06, 0x88, 0x00, 0x00, 0x00,
-  0x44, 0x52, 0x22, 0x80, 0x00, 0x00,
-  0x10, 0x98, 0x84, 0xc0, 0x00, 0x00,
-  0xa0, 0x55, 0x02, 0x80, 0x00, 0x00,
-  0x4a, 0x0a, 0x50, 0x40, 0x00, 0x00,
-  0x40, 0x32, 0x01, 0x80, 0x00, 0x00,
-  0x80, 0x2c, 0x01, 0x40, 0x00, 0x00,
-  0x0c, 0x90, 0x64, 0x80, 0x00, 0x00,
-  0x05, 0x88, 0x2c, 0x40, 0x00, 0x00,
-  0x62, 0x23, 0x11, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom26_11[66] = {
-  0x51, 0x22, 0x89, 0x00, 0x00, 0x00,
-  0x22, 0x11, 0x10, 0x80, 0x00, 0x00,
-  0x13, 0x40, 0x9a, 0x00, 0x00, 0x00,
-  0x25, 0x01, 0x28, 0x00, 0x00, 0x00,
-  0x18, 0x18, 0xc0, 0xc0, 0x00, 0x00,
-  0x0a, 0x20, 0x51, 0x00, 0x00, 0x00,
-  0x88, 0x8c, 0x44, 0x40, 0x00, 0x00,
-  0x06, 0x80, 0x34, 0x00, 0x00, 0x00,
-  0xe0, 0x27, 0x01, 0x00, 0x00, 0x00,
-  0x84, 0x44, 0x22, 0x00, 0x00, 0x00,
-  0x44, 0x1a, 0x20, 0xc0, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom26_12[72] = {
-  0x28, 0x29, 0x41, 0x40, 0x00, 0x00,
-  0x84, 0x54, 0x22, 0x80, 0x00, 0x00,
-  0x60, 0x43, 0x02, 0x00, 0x00, 0x00,
-  0x05, 0x48, 0x2a, 0x40, 0x00, 0x00,
-  0x02, 0x98, 0x14, 0xc0, 0x00, 0x00,
-  0x01, 0x30, 0x09, 0x80, 0x00, 0x00,
-  0x48, 0x12, 0x40, 0x80, 0x00, 0x00,
-  0x24, 0x81, 0x24, 0x00, 0x00, 0x00,
-  0x94, 0x04, 0xa0, 0x00, 0x00, 0x00,
-  0x8a, 0x04, 0x50, 0x00, 0x00, 0x00,
-  0x11, 0x80, 0x8c, 0x00, 0x00, 0x00,
-  0x52, 0x22, 0x91, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom26_13[78] = {
-  0x51, 0x22, 0x89, 0x00, 0x00, 0x00,
-  0x66, 0x43, 0x32, 0x00, 0x00, 0x00,
-  0x05, 0x48, 0x2a, 0x40, 0x00, 0x00,
-  0x81, 0x24, 0x09, 0x00, 0x00, 0x00,
-  0x94, 0x04, 0xa0, 0x00, 0x00, 0x00,
-  0x30, 0x81, 0x84, 0x00, 0x00, 0x00,
-  0x21, 0x11, 0x08, 0x80, 0x00, 0x00,
-  0x03, 0xc0, 0x1e, 0x00, 0x00, 0x00,
-  0xe8, 0x07, 0x40, 0x00, 0x00, 0x00,
-  0x0a, 0x10, 0x50, 0x80, 0x00, 0x00,
-  0x80, 0x1c, 0x00, 0xc0, 0x00, 0x00,
-  0x04, 0x90, 0x24, 0x80, 0x00, 0x00,
-  0x08, 0xa8, 0x45, 0x40, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom26_14[84] = {
-  0x59, 0x22, 0xc9, 0x00, 0x00, 0x00,
-  0x26, 0x51, 0x32, 0x80, 0x00, 0x00,
-  0xb1, 0x45, 0x8a, 0x00, 0x00, 0x00,
-  0x2b, 0x09, 0x58, 0x40, 0x00, 0x00,
-  0x14, 0xc8, 0xa6, 0x40, 0x00, 0x00,
-  0xc8, 0x8e, 0x44, 0x40, 0x00, 0x00,
-  0x84, 0xb4, 0x25, 0x80, 0x00, 0x00,
-  0xd1, 0x26, 0x89, 0x00, 0x00, 0x00,
-  0x46, 0xd2, 0x36, 0x80, 0x00, 0x00,
-  0x15, 0x48, 0xaa, 0x40, 0x00, 0x00,
-  0x21, 0x71, 0x0b, 0x80, 0x00, 0x00,
-  0x28, 0xc9, 0x46, 0x40, 0x00, 0x00,
-  0xaa, 0x25, 0x51, 0x00, 0x00, 0x00,
-  0x5d, 0xa7, 0x78, 0x40, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom26_15[90] = {
-  0x59, 0x22, 0xc9, 0x00, 0x00, 0x00,
-  0x26, 0x51, 0x32, 0x80, 0x00, 0x00,
-  0xb1, 0x45, 0x8a, 0x00, 0x00, 0x00,
-  0x2b, 0x09, 0x58, 0x40, 0x00, 0x00,
-  0x14, 0xc8, 0xa6, 0x40, 0x00, 0x00,
-  0xc8, 0x8e, 0x44, 0x40, 0x00, 0x00,
-  0x84, 0xb4, 0x25, 0x80, 0x00, 0x00,
-  0x80, 0xac, 0x05, 0x40, 0x00, 0x00,
-  0x30, 0x91, 0x84, 0x80, 0x00, 0x00,
-  0x16, 0x08, 0xb0, 0x40, 0x00, 0x00,
-  0x03, 0x30, 0x19, 0x80, 0x00, 0x00,
-  0x44, 0x62, 0x23, 0x00, 0x00, 0x00,
-  0x08, 0x18, 0x40, 0xc0, 0x00, 0x00,
-  0xd8, 0x06, 0xc0, 0x00, 0x00, 0x00,
-  0xa1, 0x45, 0x0a, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom26_16[96] = {
-  0x80, 0xac, 0x05, 0x40, 0x00, 0x00,
-  0x30, 0x91, 0x84, 0x80, 0x00, 0x00,
-  0x16, 0x08, 0xb0, 0x40, 0x00, 0x00,
-  0x03, 0x30, 0x19, 0x80, 0x00, 0x00,
-  0x44, 0x62, 0x23, 0x00, 0x00, 0x00,
-  0x08, 0x18, 0x40, 0xc0, 0x00, 0x00,
-  0xd8, 0x06, 0xc0, 0x00, 0x00, 0x00,
-  0xa1, 0x45, 0x0a, 0x00, 0x00, 0x00,
-  0x59, 0x22, 0xc9, 0x00, 0x00, 0x00,
-  0x26, 0x51, 0x32, 0x80, 0x00, 0x00,
-  0xb1, 0x45, 0x8a, 0x00, 0x00, 0x00,
-  0x2b, 0x09, 0x58, 0x40, 0x00, 0x00,
-  0x14, 0xc8, 0xa6, 0x40, 0x00, 0x00,
-  0xc8, 0x8e, 0x44, 0x40, 0x00, 0x00,
-  0x84, 0xb4, 0x25, 0x80, 0x00, 0x00,
-  0x3c, 0xaf, 0x88, 0x80, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom26_17[102] = {
-  0x80, 0xac, 0x05, 0x40, 0x00, 0x00,
-  0x30, 0x91, 0x84, 0x80, 0x00, 0x00,
-  0x16, 0x08, 0xb0, 0x40, 0x00, 0x00,
-  0x03, 0x30, 0x19, 0x80, 0x00, 0x00,
-  0x44, 0x62, 0x23, 0x00, 0x00, 0x00,
-  0x08, 0x18, 0x40, 0xc0, 0x00, 0x00,
-  0xd8, 0x06, 0xc0, 0x00, 0x00, 0x00,
-  0xa1, 0x45, 0x0a, 0x00, 0x00, 0x00,
-  0x59, 0x22, 0xc9, 0x00, 0x00, 0x00,
-  0x66, 0x43, 0x32, 0x00, 0x00, 0x00,
-  0x14, 0x40, 0xa2, 0x00, 0x00, 0x00,
-  0x21, 0x49, 0x0a, 0x40, 0x00, 0x00,
-  0x02, 0xc8, 0x16, 0x40, 0x00, 0x00,
-  0x94, 0x14, 0xa0, 0x80, 0x00, 0x00,
-  0x80, 0xac, 0x05, 0x40, 0x00, 0x00,
-  0x0a, 0x90, 0x54, 0x80, 0x00, 0x00,
-  0x40, 0x1a, 0x00, 0xc0, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom26_18[108] = {
-  0x59, 0x22, 0xc9, 0x00, 0x00, 0x00,
-  0x66, 0x43, 0x32, 0x00, 0x00, 0x00,
-  0x14, 0x40, 0xa2, 0x00, 0x00, 0x00,
-  0x21, 0x49, 0x0a, 0x40, 0x00, 0x00,
-  0x02, 0xc8, 0x16, 0x40, 0x00, 0x00,
-  0x94, 0x14, 0xa0, 0x80, 0x00, 0x00,
-  0x80, 0xac, 0x05, 0x40, 0x00, 0x00,
-  0x0a, 0x90, 0x54, 0x80, 0x00, 0x00,
-  0x40, 0x1a, 0x00, 0xc0, 0x00, 0x00,
-  0x80, 0xac, 0x05, 0x40, 0x00, 0x00,
-  0x30, 0x91, 0x84, 0x80, 0x00, 0x00,
-  0x16, 0x08, 0xb0, 0x40, 0x00, 0x00,
-  0x03, 0x30, 0x19, 0x80, 0x00, 0x00,
-  0x44, 0x62, 0x23, 0x00, 0x00, 0x00,
-  0x08, 0x18, 0x40, 0xc0, 0x00, 0x00,
-  0xd8, 0x06, 0xc0, 0x00, 0x00, 0x00,
-  0xa1, 0x45, 0x0a, 0x00, 0x00, 0x00,
-  0xaa, 0x0c, 0x83, 0x80, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom26_19[114] = {
-  0x59, 0x22, 0xc9, 0x00, 0x00, 0x00,
-  0x66, 0x43, 0x32, 0x00, 0x00, 0x00,
-  0x14, 0x40, 0xa2, 0x00, 0x00, 0x00,
-  0x21, 0x49, 0x0a, 0x40, 0x00, 0x00,
-  0x02, 0xc8, 0x16, 0x40, 0x00, 0x00,
-  0x94, 0x14, 0xa0, 0x80, 0x00, 0x00,
-  0x80, 0xac, 0x05, 0x40, 0x00, 0x00,
-  0x0a, 0x90, 0x54, 0x80, 0x00, 0x00,
-  0x40, 0x1a, 0x00, 0xc0, 0x00, 0x00,
-  0xd1, 0x06, 0x88, 0x00, 0x00, 0x00,
-  0x44, 0x52, 0x22, 0x80, 0x00, 0x00,
-  0x10, 0x98, 0x84, 0xc0, 0x00, 0x00,
-  0xa0, 0x55, 0x02, 0x80, 0x00, 0x00,
-  0x4a, 0x0a, 0x50, 0x40, 0x00, 0x00,
-  0x40, 0x32, 0x01, 0x80, 0x00, 0x00,
-  0x80, 0x2c, 0x01, 0x40, 0x00, 0x00,
-  0x0c, 0x90, 0x64, 0x80, 0x00, 0x00,
-  0x05, 0x88, 0x2c, 0x40, 0x00, 0x00,
-  0x62, 0x23, 0x11, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom26_2[12] = {
-  0xec, 0xc7, 0x66, 0x00, 0x00, 0x00,
-  0x1b, 0x38, 0xd9, 0xc0, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom26_20[120] = {
-  0xd1, 0x06, 0x88, 0x00, 0x00, 0x00,
-  0x44, 0x52, 0x22, 0x80, 0x00, 0x00,
-  0x10, 0x98, 0x84, 0xc0, 0x00, 0x00,
-  0xa0, 0x55, 0x02, 0x80, 0x00, 0x00,
-  0x4a, 0x0a, 0x50, 0x40, 0x00, 0x00,
-  0x40, 0x32, 0x01, 0x80, 0x00, 0x00,
-  0x80, 0x2c, 0x01, 0x40, 0x00, 0x00,
-  0x0c, 0x90, 0x64, 0x80, 0x00, 0x00,
-  0x05, 0x88, 0x2c, 0x40, 0x00, 0x00,
-  0x62, 0x23, 0x11, 0x00, 0x00, 0x00,
-  0x59, 0x22, 0xc9, 0x00, 0x00, 0x00,
-  0x66, 0x43, 0x32, 0x00, 0x00, 0x00,
-  0x14, 0x40, 0xa2, 0x00, 0x00, 0x00,
-  0x21, 0x49, 0x0a, 0x40, 0x00, 0x00,
-  0x02, 0xc8, 0x16, 0x40, 0x00, 0x00,
-  0x94, 0x14, 0xa0, 0x80, 0x00, 0x00,
-  0x80, 0xac, 0x05, 0x40, 0x00, 0x00,
-  0x0a, 0x90, 0x54, 0x80, 0x00, 0x00,
-  0x40, 0x1a, 0x00, 0xc0, 0x00, 0x00,
-  0xf4, 0x08, 0xec, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom26_21[126] = {
-  0xd1, 0x06, 0x88, 0x00, 0x00, 0x00,
-  0x44, 0x52, 0x22, 0x80, 0x00, 0x00,
-  0x10, 0x98, 0x84, 0xc0, 0x00, 0x00,
-  0xa0, 0x55, 0x02, 0x80, 0x00, 0x00,
-  0x4a, 0x0a, 0x50, 0x40, 0x00, 0x00,
-  0x40, 0x32, 0x01, 0x80, 0x00, 0x00,
-  0x80, 0x2c, 0x01, 0x40, 0x00, 0x00,
-  0x0c, 0x90, 0x64, 0x80, 0x00, 0x00,
-  0x05, 0x88, 0x2c, 0x40, 0x00, 0x00,
-  0x62, 0x23, 0x11, 0x00, 0x00, 0x00,
-  0x51, 0x22, 0x89, 0x00, 0x00, 0x00,
-  0x22, 0x11, 0x10, 0x80, 0x00, 0x00,
-  0x13, 0x40, 0x9a, 0x00, 0x00, 0x00,
-  0x25, 0x01, 0x28, 0x00, 0x00, 0x00,
-  0x18, 0x18, 0xc0, 0xc0, 0x00, 0x00,
-  0x0a, 0x20, 0x51, 0x00, 0x00, 0x00,
-  0x88, 0x8c, 0x44, 0x40, 0x00, 0x00,
-  0x06, 0x80, 0x34, 0x00, 0x00, 0x00,
-  0xe0, 0x27, 0x01, 0x00, 0x00, 0x00,
-  0x84, 0x44, 0x22, 0x00, 0x00, 0x00,
-  0x44, 0x1a, 0x20, 0xc0, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom26_22[132] = {
-  0x51, 0x22, 0x89, 0x00, 0x00, 0x00,
-  0x22, 0x11, 0x10, 0x80, 0x00, 0x00,
-  0x13, 0x40, 0x9a, 0x00, 0x00, 0x00,
-  0x25, 0x01, 0x28, 0x00, 0x00, 0x00,
-  0x18, 0x18, 0xc0, 0xc0, 0x00, 0x00,
-  0x0a, 0x20, 0x51, 0x00, 0x00, 0x00,
-  0x88, 0x8c, 0x44, 0x40, 0x00, 0x00,
-  0x06, 0x80, 0x34, 0x00, 0x00, 0x00,
-  0xe0, 0x27, 0x01, 0x00, 0x00, 0x00,
-  0x84, 0x44, 0x22, 0x00, 0x00, 0x00,
-  0x44, 0x1a, 0x20, 0xc0, 0x00, 0x00,
-  0xd1, 0x06, 0x88, 0x00, 0x00, 0x00,
-  0x44, 0x52, 0x22, 0x80, 0x00, 0x00,
-  0x10, 0x98, 0x84, 0xc0, 0x00, 0x00,
-  0xa0, 0x55, 0x02, 0x80, 0x00, 0x00,
-  0x4a, 0x0a, 0x50, 0x40, 0x00, 0x00,
-  0x40, 0x32, 0x01, 0x80, 0x00, 0x00,
-  0x80, 0x2c, 0x01, 0x40, 0x00, 0x00,
-  0x0c, 0x90, 0x64, 0x80, 0x00, 0x00,
-  0x05, 0x88, 0x2c, 0x40, 0x00, 0x00,
-  0x62, 0x23, 0x11, 0x00, 0x00, 0x00,
-  0x13, 0xc6, 0x6b, 0x40, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom26_23[138] = {
-  0x51, 0x22, 0x89, 0x00, 0x00, 0x00,
-  0x22, 0x11, 0x10, 0x80, 0x00, 0x00,
-  0x13, 0x40, 0x9a, 0x00, 0x00, 0x00,
-  0x25, 0x01, 0x28, 0x00, 0x00, 0x00,
-  0x18, 0x18, 0xc0, 0xc0, 0x00, 0x00,
-  0x0a, 0x20, 0x51, 0x00, 0x00, 0x00,
-  0x88, 0x8c, 0x44, 0x40, 0x00, 0x00,
-  0x06, 0x80, 0x34, 0x00, 0x00, 0x00,
-  0xe0, 0x27, 0x01, 0x00, 0x00, 0x00,
-  0x84, 0x44, 0x22, 0x00, 0x00, 0x00,
-  0x44, 0x1a, 0x20, 0xc0, 0x00, 0x00,
-  0x28, 0x29, 0x41, 0x40, 0x00, 0x00,
-  0x84, 0x54, 0x22, 0x80, 0x00, 0x00,
-  0x60, 0x43, 0x02, 0x00, 0x00, 0x00,
-  0x05, 0x48, 0x2a, 0x40, 0x00, 0x00,
-  0x02, 0x98, 0x14, 0xc0, 0x00, 0x00,
-  0x01, 0x30, 0x09, 0x80, 0x00, 0x00,
-  0x48, 0x12, 0x40, 0x80, 0x00, 0x00,
-  0x24, 0x81, 0x24, 0x00, 0x00, 0x00,
-  0x94, 0x04, 0xa0, 0x00, 0x00, 0x00,
-  0x8a, 0x04, 0x50, 0x00, 0x00, 0x00,
-  0x11, 0x80, 0x8c, 0x00, 0x00, 0x00,
-  0x52, 0x22, 0x91, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom26_24[144] = {
-  0x28, 0x29, 0x41, 0x40, 0x00, 0x00,
-  0x84, 0x54, 0x22, 0x80, 0x00, 0x00,
-  0x60, 0x43, 0x02, 0x00, 0x00, 0x00,
-  0x05, 0x48, 0x2a, 0x40, 0x00, 0x00,
-  0x02, 0x98, 0x14, 0xc0, 0x00, 0x00,
-  0x01, 0x30, 0x09, 0x80, 0x00, 0x00,
-  0x48, 0x12, 0x40, 0x80, 0x00, 0x00,
-  0x24, 0x81, 0x24, 0x00, 0x00, 0x00,
-  0x94, 0x04, 0xa0, 0x00, 0x00, 0x00,
-  0x8a, 0x04, 0x50, 0x00, 0x00, 0x00,
-  0x11, 0x80, 0x8c, 0x00, 0x00, 0x00,
-  0x52, 0x22, 0x91, 0x00, 0x00, 0x00,
-  0x51, 0x22, 0x89, 0x00, 0x00, 0x00,
-  0x22, 0x11, 0x10, 0x80, 0x00, 0x00,
-  0x13, 0x40, 0x9a, 0x00, 0x00, 0x00,
-  0x25, 0x01, 0x28, 0x00, 0x00, 0x00,
-  0x18, 0x18, 0xc0, 0xc0, 0x00, 0x00,
-  0x0a, 0x20, 0x51, 0x00, 0x00, 0x00,
-  0x88, 0x8c, 0x44, 0x40, 0x00, 0x00,
-  0x06, 0x80, 0x34, 0x00, 0x00, 0x00,
-  0xe0, 0x27, 0x01, 0x00, 0x00, 0x00,
-  0x84, 0x44, 0x22, 0x00, 0x00, 0x00,
-  0x44, 0x1a, 0x20, 0xc0, 0x00, 0x00,
-  0xdb, 0x4d, 0xd8, 0x40, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom26_25[150] = {
-  0x28, 0x29, 0x41, 0x40, 0x00, 0x00,
-  0x84, 0x54, 0x22, 0x80, 0x00, 0x00,
-  0x60, 0x43, 0x02, 0x00, 0x00, 0x00,
-  0x05, 0x48, 0x2a, 0x40, 0x00, 0x00,
-  0x02, 0x98, 0x14, 0xc0, 0x00, 0x00,
-  0x01, 0x30, 0x09, 0x80, 0x00, 0x00,
-  0x48, 0x12, 0x40, 0x80, 0x00, 0x00,
-  0x24, 0x81, 0x24, 0x00, 0x00, 0x00,
-  0x94, 0x04, 0xa0, 0x00, 0x00, 0x00,
-  0x8a, 0x04, 0x50, 0x00, 0x00, 0x00,
-  0x11, 0x80, 0x8c, 0x00, 0x00, 0x00,
-  0x52, 0x22, 0x91, 0x00, 0x00, 0x00,
-  0x51, 0x22, 0x89, 0x00, 0x00, 0x00,
-  0x66, 0x43, 0x32, 0x00, 0x00, 0x00,
-  0x05, 0x48, 0x2a, 0x40, 0x00, 0x00,
-  0x81, 0x24, 0x09, 0x00, 0x00, 0x00,
-  0x94, 0x04, 0xa0, 0x00, 0x00, 0x00,
-  0x30, 0x81, 0x84, 0x00, 0x00, 0x00,
-  0x21, 0x11, 0x08, 0x80, 0x00, 0x00,
-  0x03, 0xc0, 0x1e, 0x00, 0x00, 0x00,
-  0xe8, 0x07, 0x40, 0x00, 0x00, 0x00,
-  0x0a, 0x10, 0x50, 0x80, 0x00, 0x00,
-  0x80, 0x1c, 0x00, 0xc0, 0x00, 0x00,
-  0x04, 0x90, 0x24, 0x80, 0x00, 0x00,
-  0x08, 0xa8, 0x45, 0x40, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom26_26[156] = {
-  0x51, 0x22, 0x89, 0x00, 0x00, 0x00,
-  0x66, 0x43, 0x32, 0x00, 0x00, 0x00,
-  0x05, 0x48, 0x2a, 0x40, 0x00, 0x00,
-  0x81, 0x24, 0x09, 0x00, 0x00, 0x00,
-  0x94, 0x04, 0xa0, 0x00, 0x00, 0x00,
-  0x30, 0x81, 0x84, 0x00, 0x00, 0x00,
-  0x21, 0x11, 0x08, 0x80, 0x00, 0x00,
-  0x03, 0xc0, 0x1e, 0x00, 0x00, 0x00,
-  0xe8, 0x07, 0x40, 0x00, 0x00, 0x00,
-  0x0a, 0x10, 0x50, 0x80, 0x00, 0x00,
-  0x80, 0x1c, 0x00, 0xc0, 0x00, 0x00,
-  0x04, 0x90, 0x24, 0x80, 0x00, 0x00,
-  0x08, 0xa8, 0x45, 0x40, 0x00, 0x00,
-  0x28, 0x29, 0x41, 0x40, 0x00, 0x00,
-  0x84, 0x54, 0x22, 0x80, 0x00, 0x00,
-  0x60, 0x43, 0x02, 0x00, 0x00, 0x00,
-  0x05, 0x48, 0x2a, 0x40, 0x00, 0x00,
-  0x02, 0x98, 0x14, 0xc0, 0x00, 0x00,
-  0x01, 0x30, 0x09, 0x80, 0x00, 0x00,
-  0x48, 0x12, 0x40, 0x80, 0x00, 0x00,
-  0x24, 0x81, 0x24, 0x00, 0x00, 0x00,
-  0x94, 0x04, 0xa0, 0x00, 0x00, 0x00,
-  0x8a, 0x04, 0x50, 0x00, 0x00, 0x00,
-  0x11, 0x80, 0x8c, 0x00, 0x00, 0x00,
-  0x52, 0x22, 0x91, 0x00, 0x00, 0x00,
-  0xf9, 0x13, 0x51, 0x80, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom26_3[18] = {
-  0x99, 0xb4, 0xcd, 0x80, 0x00, 0x00,
-  0x46, 0xda, 0x36, 0xc0, 0x00, 0x00,
-  0x37, 0x29, 0xb9, 0x40, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom26_4[24] = {
-  0x49, 0xb2, 0x4d, 0x80, 0x00, 0x00,
-  0x26, 0xd1, 0x36, 0x80, 0x00, 0x00,
-  0x85, 0x6c, 0x2b, 0x40, 0x00, 0x00,
-  0x52, 0x5a, 0x92, 0xc0, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom26_5[30] = {
-  0x51, 0x32, 0x89, 0x80, 0x00, 0x00,
-  0x66, 0x43, 0x32, 0x00, 0x00, 0x00,
-  0x0c, 0x68, 0x63, 0x40, 0x00, 0x00,
-  0xa1, 0xc5, 0x0e, 0x00, 0x00, 0x00,
-  0x22, 0x99, 0x14, 0xc0, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom26_6[36] = {
-  0xd1, 0x26, 0x89, 0x00, 0x00, 0x00,
-  0x46, 0xd2, 0x36, 0x80, 0x00, 0x00,
-  0x15, 0x48, 0xaa, 0x40, 0x00, 0x00,
-  0x21, 0x71, 0x0b, 0x80, 0x00, 0x00,
-  0x28, 0xc9, 0x46, 0x40, 0x00, 0x00,
-  0xaa, 0x25, 0x51, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom26_7[42] = {
-  0x59, 0x22, 0xc9, 0x00, 0x00, 0x00,
-  0x26, 0x51, 0x32, 0x80, 0x00, 0x00,
-  0xb1, 0x45, 0x8a, 0x00, 0x00, 0x00,
-  0x2b, 0x09, 0x58, 0x40, 0x00, 0x00,
-  0x14, 0xc8, 0xa6, 0x40, 0x00, 0x00,
-  0xc8, 0x8e, 0x44, 0x40, 0x00, 0x00,
-  0x84, 0xb4, 0x25, 0x80, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom26_8[48] = {
-  0x80, 0xac, 0x05, 0x40, 0x00, 0x00,
-  0x30, 0x91, 0x84, 0x80, 0x00, 0x00,
-  0x16, 0x08, 0xb0, 0x40, 0x00, 0x00,
-  0x03, 0x30, 0x19, 0x80, 0x00, 0x00,
-  0x44, 0x62, 0x23, 0x00, 0x00, 0x00,
-  0x08, 0x18, 0x40, 0xc0, 0x00, 0x00,
-  0xd8, 0x06, 0xc0, 0x00, 0x00, 0x00,
-  0xa1, 0x45, 0x0a, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom26_9[54] = {
-  0x59, 0x22, 0xc9, 0x00, 0x00, 0x00,
-  0x66, 0x43, 0x32, 0x00, 0x00, 0x00,
-  0x14, 0x40, 0xa2, 0x00, 0x00, 0x00,
-  0x21, 0x49, 0x0a, 0x40, 0x00, 0x00,
-  0x02, 0xc8, 0x16, 0x40, 0x00, 0x00,
-  0x94, 0x14, 0xa0, 0x80, 0x00, 0x00,
-  0x80, 0xac, 0x05, 0x40, 0x00, 0x00,
-  0x0a, 0x90, 0x54, 0x80, 0x00, 0x00,
-  0x40, 0x1a, 0x00, 0xc0, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom27_1[6] = {
-  0xff, 0xff, 0xff, 0xe0, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom27_10[60] = {
-  0xd1, 0x06, 0x06, 0xa0, 0x00, 0x00,
-  0x44, 0x50, 0xea, 0x00, 0x00, 0x00,
-  0x10, 0x9e, 0xa0, 0x40, 0x00, 0x00,
-  0xa0, 0x50, 0x13, 0x00, 0x00, 0x00,
-  0x4a, 0x08, 0x21, 0x40, 0x00, 0x00,
-  0x40, 0x31, 0x04, 0xc0, 0x00, 0x00,
-  0x80, 0x2a, 0x02, 0x20, 0x00, 0x00,
-  0x0c, 0x90, 0x44, 0x20, 0x00, 0x00,
-  0x05, 0x8b, 0x40, 0x00, 0x00, 0x00,
-  0x62, 0x21, 0x18, 0x80, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom27_11[66] = {
-  0x51, 0x23, 0x16, 0x80, 0x00, 0x00,
-  0x22, 0x11, 0xa9, 0x00, 0x00, 0x00,
-  0x13, 0x40, 0xa0, 0xa0, 0x00, 0x00,
-  0x25, 0x06, 0x28, 0x40, 0x00, 0x00,
-  0x18, 0x19, 0x10, 0x60, 0x00, 0x00,
-  0x0a, 0x24, 0x45, 0xc0, 0x00, 0x00,
-  0x88, 0x8a, 0x12, 0xa0, 0x00, 0x00,
-  0x06, 0x81, 0x45, 0x20, 0x00, 0x00,
-  0xe0, 0x24, 0xa1, 0x00, 0x00, 0x00,
-  0x84, 0x40, 0xd8, 0x20, 0x00, 0x00,
-  0x44, 0x19, 0x16, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom27_12[72] = {
-  0x28, 0x2c, 0x08, 0x20, 0x00, 0x00,
-  0x84, 0x52, 0x03, 0x40, 0x00, 0x00,
-  0x60, 0x44, 0x81, 0x20, 0x00, 0x00,
-  0x05, 0x49, 0x41, 0x40, 0x00, 0x00,
-  0x02, 0x9a, 0x90, 0x80, 0x00, 0x00,
-  0x01, 0x32, 0x0c, 0x40, 0x00, 0x00,
-  0x48, 0x10, 0x49, 0x80, 0x00, 0x00,
-  0x24, 0x82, 0x42, 0x20, 0x00, 0x00,
-  0x94, 0x00, 0x22, 0x20, 0x00, 0x00,
-  0x8a, 0x00, 0x74, 0x00, 0x00, 0x00,
-  0x11, 0x85, 0x2c, 0x80, 0x00, 0x00,
-  0x52, 0x20, 0x90, 0x60, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom27_13[78] = {
-  0x51, 0x23, 0x12, 0xa0, 0x00, 0x00,
-  0x66, 0x41, 0xa3, 0x00, 0x00, 0x00,
-  0x05, 0x4a, 0x40, 0x20, 0x00, 0x00,
-  0x81, 0x20, 0x05, 0x60, 0x00, 0x00,
-  0x94, 0x01, 0x40, 0x40, 0x00, 0x00,
-  0x30, 0x84, 0x08, 0x40, 0x00, 0x00,
-  0x21, 0x11, 0x18, 0x20, 0x00, 0x00,
-  0x03, 0xc0, 0x34, 0x00, 0x00, 0x00,
-  0xe8, 0x04, 0x00, 0xa0, 0x00, 0x00,
-  0x0a, 0x11, 0x80, 0x80, 0x00, 0x00,
-  0x80, 0x1c, 0x61, 0x00, 0x00, 0x00,
-  0x04, 0x92, 0xa0, 0x00, 0x00, 0x00,
-  0x08, 0xac, 0x06, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom27_14[84] = {
-  0x59, 0x23, 0x12, 0xa0, 0x00, 0x00,
-  0x26, 0x55, 0xc9, 0x00, 0x00, 0x00,
-  0xb1, 0x40, 0xc5, 0xa0, 0x00, 0x00,
-  0x2b, 0x0a, 0xa4, 0xc0, 0x00, 0x00,
-  0x14, 0xc8, 0x33, 0x60, 0x00, 0x00,
-  0xc8, 0x8c, 0x2a, 0xa0, 0x00, 0x00,
-  0x84, 0xb5, 0x54, 0x40, 0x00, 0x00,
-  0xd1, 0x22, 0x52, 0xa0, 0x00, 0x00,
-  0x46, 0xd4, 0xaa, 0x40, 0x00, 0x00,
-  0x15, 0x48, 0xa5, 0xa0, 0x00, 0x00,
-  0x21, 0x72, 0x8d, 0x40, 0x00, 0x00,
-  0x28, 0xc9, 0x13, 0x60, 0x00, 0x00,
-  0xaa, 0x24, 0x44, 0x60, 0x00, 0x00,
-  0x0a, 0xe7, 0x3b, 0x20, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom27_15[90] = {
-  0x59, 0x23, 0x12, 0xa0, 0x00, 0x00,
-  0x26, 0x55, 0xc9, 0x00, 0x00, 0x00,
-  0xb1, 0x40, 0xc5, 0xa0, 0x00, 0x00,
-  0x2b, 0x0a, 0xa4, 0xc0, 0x00, 0x00,
-  0x14, 0xc8, 0x33, 0x60, 0x00, 0x00,
-  0xc8, 0x8c, 0x2a, 0xa0, 0x00, 0x00,
-  0x84, 0xb5, 0x54, 0x40, 0x00, 0x00,
-  0x80, 0xae, 0x00, 0xa0, 0x00, 0x00,
-  0x30, 0x92, 0x0b, 0x00, 0x00, 0x00,
-  0x16, 0x0c, 0x41, 0x80, 0x00, 0x00,
-  0x03, 0x31, 0x05, 0x20, 0x00, 0x00,
-  0x44, 0x60, 0x52, 0x40, 0x00, 0x00,
-  0x08, 0x18, 0x24, 0xc0, 0x00, 0x00,
-  0xd8, 0x04, 0xa2, 0x00, 0x00, 0x00,
-  0xa1, 0x43, 0x90, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom27_16[96] = {
-  0x80, 0xae, 0x00, 0xa0, 0x00, 0x00,
-  0x30, 0x92, 0x0b, 0x00, 0x00, 0x00,
-  0x16, 0x0c, 0x41, 0x80, 0x00, 0x00,
-  0x03, 0x31, 0x05, 0x20, 0x00, 0x00,
-  0x44, 0x60, 0x52, 0x40, 0x00, 0x00,
-  0x08, 0x18, 0x24, 0xc0, 0x00, 0x00,
-  0xd8, 0x04, 0xa2, 0x00, 0x00, 0x00,
-  0xa1, 0x43, 0x90, 0x00, 0x00, 0x00,
-  0x59, 0x23, 0x12, 0xa0, 0x00, 0x00,
-  0x26, 0x55, 0xc9, 0x00, 0x00, 0x00,
-  0xb1, 0x40, 0xc5, 0xa0, 0x00, 0x00,
-  0x2b, 0x0a, 0xa4, 0xc0, 0x00, 0x00,
-  0x14, 0xc8, 0x33, 0x60, 0x00, 0x00,
-  0xc8, 0x8c, 0x2a, 0xa0, 0x00, 0x00,
-  0x84, 0xb5, 0x54, 0x40, 0x00, 0x00,
-  0x01, 0x50, 0xfb, 0xe0, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom27_17[102] = {
-  0x80, 0xae, 0x00, 0xa0, 0x00, 0x00,
-  0x30, 0x92, 0x0b, 0x00, 0x00, 0x00,
-  0x16, 0x0c, 0x41, 0x80, 0x00, 0x00,
-  0x03, 0x31, 0x05, 0x20, 0x00, 0x00,
-  0x44, 0x60, 0x52, 0x40, 0x00, 0x00,
-  0x08, 0x18, 0x24, 0xc0, 0x00, 0x00,
-  0xd8, 0x04, 0xa2, 0x00, 0x00, 0x00,
-  0xa1, 0x43, 0x90, 0x00, 0x00, 0x00,
-  0x59, 0x25, 0x12, 0xa0, 0x00, 0x00,
-  0x66, 0x41, 0xa3, 0x00, 0x00, 0x00,
-  0x14, 0x42, 0x51, 0x20, 0x00, 0x00,
-  0x21, 0x49, 0x05, 0x40, 0x00, 0x00,
-  0x02, 0xc8, 0x8c, 0x20, 0x00, 0x00,
-  0x94, 0x12, 0x48, 0x40, 0x00, 0x00,
-  0x80, 0xac, 0x30, 0x60, 0x00, 0x00,
-  0x0a, 0x91, 0x06, 0xa0, 0x00, 0x00,
-  0x40, 0x1c, 0x42, 0x40, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom27_18[108] = {
-  0x59, 0x25, 0x12, 0xa0, 0x00, 0x00,
-  0x66, 0x41, 0xa3, 0x00, 0x00, 0x00,
-  0x14, 0x42, 0x51, 0x20, 0x00, 0x00,
-  0x21, 0x49, 0x05, 0x40, 0x00, 0x00,
-  0x02, 0xc8, 0x8c, 0x20, 0x00, 0x00,
-  0x94, 0x12, 0x48, 0x40, 0x00, 0x00,
-  0x80, 0xac, 0x30, 0x60, 0x00, 0x00,
-  0x0a, 0x91, 0x06, 0xa0, 0x00, 0x00,
-  0x40, 0x1c, 0x42, 0x40, 0x00, 0x00,
-  0x80, 0xae, 0x00, 0xa0, 0x00, 0x00,
-  0x30, 0x92, 0x0b, 0x00, 0x00, 0x00,
-  0x16, 0x0c, 0x41, 0x80, 0x00, 0x00,
-  0x03, 0x31, 0x05, 0x20, 0x00, 0x00,
-  0x44, 0x60, 0x52, 0x40, 0x00, 0x00,
-  0x08, 0x18, 0x24, 0xc0, 0x00, 0x00,
-  0xd8, 0x04, 0xa2, 0x00, 0x00, 0x00,
-  0xa1, 0x43, 0x90, 0x00, 0x00, 0x00,
-  0x53, 0xc3, 0x33, 0x80, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom27_19[114] = {
-  0x59, 0x25, 0x12, 0xa0, 0x00, 0x00,
-  0x66, 0x41, 0xa3, 0x00, 0x00, 0x00,
-  0x14, 0x42, 0x51, 0x20, 0x00, 0x00,
-  0x21, 0x49, 0x05, 0x40, 0x00, 0x00,
-  0x02, 0xc8, 0x8c, 0x20, 0x00, 0x00,
-  0x94, 0x12, 0x48, 0x40, 0x00, 0x00,
-  0x80, 0xac, 0x30, 0x60, 0x00, 0x00,
-  0x0a, 0x91, 0x06, 0xa0, 0x00, 0x00,
-  0x40, 0x1c, 0x42, 0x40, 0x00, 0x00,
-  0xd1, 0x06, 0x06, 0xa0, 0x00, 0x00,
-  0x44, 0x50, 0xea, 0x00, 0x00, 0x00,
-  0x10, 0x9e, 0xa0, 0x40, 0x00, 0x00,
-  0xa0, 0x50, 0x13, 0x00, 0x00, 0x00,
-  0x4a, 0x08, 0x21, 0x40, 0x00, 0x00,
-  0x40, 0x31, 0x04, 0xc0, 0x00, 0x00,
-  0x80, 0x2a, 0x02, 0x20, 0x00, 0x00,
-  0x0c, 0x90, 0x44, 0x20, 0x00, 0x00,
-  0x05, 0x8b, 0x40, 0x00, 0x00, 0x00,
-  0x62, 0x21, 0x18, 0x80, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom27_2[12] = {
-  0xec, 0xc7, 0x67, 0x40, 0x00, 0x00,
-  0x1b, 0x39, 0xdc, 0xe0, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom27_20[120] = {
-  0xd1, 0x06, 0x06, 0xa0, 0x00, 0x00,
-  0x44, 0x50, 0xea, 0x00, 0x00, 0x00,
-  0x10, 0x9e, 0xa0, 0x40, 0x00, 0x00,
-  0xa0, 0x50, 0x13, 0x00, 0x00, 0x00,
-  0x4a, 0x08, 0x21, 0x40, 0x00, 0x00,
-  0x40, 0x31, 0x04, 0xc0, 0x00, 0x00,
-  0x80, 0x2a, 0x02, 0x20, 0x00, 0x00,
-  0x0c, 0x90, 0x44, 0x20, 0x00, 0x00,
-  0x05, 0x8b, 0x40, 0x00, 0x00, 0x00,
-  0x62, 0x21, 0x18, 0x80, 0x00, 0x00,
-  0x59, 0x25, 0x12, 0xa0, 0x00, 0x00,
-  0x66, 0x41, 0xa3, 0x00, 0x00, 0x00,
-  0x14, 0x42, 0x51, 0x20, 0x00, 0x00,
-  0x21, 0x49, 0x05, 0x40, 0x00, 0x00,
-  0x02, 0xc8, 0x8c, 0x20, 0x00, 0x00,
-  0x94, 0x12, 0x48, 0x40, 0x00, 0x00,
-  0x80, 0xac, 0x30, 0x60, 0x00, 0x00,
-  0x0a, 0x91, 0x06, 0xa0, 0x00, 0x00,
-  0x40, 0x1c, 0x42, 0x40, 0x00, 0x00,
-  0xcb, 0xff, 0x6f, 0xc0, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom27_21[126] = {
-  0xd1, 0x06, 0x06, 0xa0, 0x00, 0x00,
-  0x44, 0x50, 0xea, 0x00, 0x00, 0x00,
-  0x10, 0x9e, 0xa0, 0x40, 0x00, 0x00,
-  0xa0, 0x50, 0x13, 0x00, 0x00, 0x00,
-  0x4a, 0x08, 0x21, 0x40, 0x00, 0x00,
-  0x40, 0x31, 0x04, 0xc0, 0x00, 0x00,
-  0x80, 0x2a, 0x02, 0x20, 0x00, 0x00,
-  0x0c, 0x90, 0x44, 0x20, 0x00, 0x00,
-  0x05, 0x8b, 0x40, 0x00, 0x00, 0x00,
-  0x62, 0x21, 0x18, 0x80, 0x00, 0x00,
-  0x51, 0x23, 0x16, 0x80, 0x00, 0x00,
-  0x22, 0x11, 0xa9, 0x00, 0x00, 0x00,
-  0x13, 0x40, 0xa0, 0xa0, 0x00, 0x00,
-  0x25, 0x06, 0x28, 0x40, 0x00, 0x00,
-  0x18, 0x19, 0x10, 0x60, 0x00, 0x00,
-  0x0a, 0x24, 0x45, 0xc0, 0x00, 0x00,
-  0x88, 0x8a, 0x12, 0xa0, 0x00, 0x00,
-  0x06, 0x81, 0x45, 0x20, 0x00, 0x00,
-  0xe0, 0x24, 0xa1, 0x00, 0x00, 0x00,
-  0x84, 0x40, 0xd8, 0x20, 0x00, 0x00,
-  0x44, 0x19, 0x16, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom27_22[132] = {
-  0x51, 0x23, 0x16, 0x80, 0x00, 0x00,
-  0x22, 0x11, 0xa9, 0x00, 0x00, 0x00,
-  0x13, 0x40, 0xa0, 0xa0, 0x00, 0x00,
-  0x25, 0x06, 0x28, 0x40, 0x00, 0x00,
-  0x18, 0x19, 0x10, 0x60, 0x00, 0x00,
-  0x0a, 0x24, 0x45, 0xc0, 0x00, 0x00,
-  0x88, 0x8a, 0x12, 0xa0, 0x00, 0x00,
-  0x06, 0x81, 0x45, 0x20, 0x00, 0x00,
-  0xe0, 0x24, 0xa1, 0x00, 0x00, 0x00,
-  0x84, 0x40, 0xd8, 0x20, 0x00, 0x00,
-  0x44, 0x19, 0x16, 0x00, 0x00, 0x00,
-  0xd1, 0x06, 0x06, 0xa0, 0x00, 0x00,
-  0x44, 0x50, 0xea, 0x00, 0x00, 0x00,
-  0x10, 0x9e, 0xa0, 0x40, 0x00, 0x00,
-  0xa0, 0x50, 0x13, 0x00, 0x00, 0x00,
-  0x4a, 0x08, 0x21, 0x40, 0x00, 0x00,
-  0x40, 0x31, 0x04, 0xc0, 0x00, 0x00,
-  0x80, 0x2a, 0x02, 0x20, 0x00, 0x00,
-  0x0c, 0x90, 0x44, 0x20, 0x00, 0x00,
-  0x05, 0x8b, 0x40, 0x00, 0x00, 0x00,
-  0x62, 0x21, 0x18, 0x80, 0x00, 0x00,
-  0xf5, 0x2d, 0x52, 0x40, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom27_23[138] = {
-  0x51, 0x23, 0x16, 0x80, 0x00, 0x00,
-  0x22, 0x11, 0xa9, 0x00, 0x00, 0x00,
-  0x13, 0x40, 0xa0, 0xa0, 0x00, 0x00,
-  0x25, 0x06, 0x28, 0x40, 0x00, 0x00,
-  0x18, 0x19, 0x10, 0x60, 0x00, 0x00,
-  0x0a, 0x24, 0x45, 0xc0, 0x00, 0x00,
-  0x88, 0x8a, 0x12, 0xa0, 0x00, 0x00,
-  0x06, 0x81, 0x45, 0x20, 0x00, 0x00,
-  0xe0, 0x24, 0xa1, 0x00, 0x00, 0x00,
-  0x84, 0x40, 0xd8, 0x20, 0x00, 0x00,
-  0x44, 0x19, 0x16, 0x00, 0x00, 0x00,
-  0x28, 0x2c, 0x08, 0x20, 0x00, 0x00,
-  0x84, 0x52, 0x03, 0x40, 0x00, 0x00,
-  0x60, 0x44, 0x81, 0x20, 0x00, 0x00,
-  0x05, 0x49, 0x41, 0x40, 0x00, 0x00,
-  0x02, 0x9a, 0x90, 0x80, 0x00, 0x00,
-  0x01, 0x32, 0x0c, 0x40, 0x00, 0x00,
-  0x48, 0x10, 0x49, 0x80, 0x00, 0x00,
-  0x24, 0x82, 0x42, 0x20, 0x00, 0x00,
-  0x94, 0x00, 0x22, 0x20, 0x00, 0x00,
-  0x8a, 0x00, 0x74, 0x00, 0x00, 0x00,
-  0x11, 0x85, 0x2c, 0x80, 0x00, 0x00,
-  0x52, 0x20, 0x90, 0x60, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom27_24[144] = {
-  0x28, 0x2c, 0x08, 0x20, 0x00, 0x00,
-  0x84, 0x52, 0x03, 0x40, 0x00, 0x00,
-  0x60, 0x44, 0x81, 0x20, 0x00, 0x00,
-  0x05, 0x49, 0x41, 0x40, 0x00, 0x00,
-  0x02, 0x9a, 0x90, 0x80, 0x00, 0x00,
-  0x01, 0x32, 0x0c, 0x40, 0x00, 0x00,
-  0x48, 0x10, 0x49, 0x80, 0x00, 0x00,
-  0x24, 0x82, 0x42, 0x20, 0x00, 0x00,
-  0x94, 0x00, 0x22, 0x20, 0x00, 0x00,
-  0x8a, 0x00, 0x74, 0x00, 0x00, 0x00,
-  0x11, 0x85, 0x2c, 0x80, 0x00, 0x00,
-  0x52, 0x20, 0x90, 0x60, 0x00, 0x00,
-  0x51, 0x23, 0x16, 0x80, 0x00, 0x00,
-  0x22, 0x11, 0xa9, 0x00, 0x00, 0x00,
-  0x13, 0x40, 0xa0, 0xa0, 0x00, 0x00,
-  0x25, 0x06, 0x28, 0x40, 0x00, 0x00,
-  0x18, 0x19, 0x10, 0x60, 0x00, 0x00,
-  0x0a, 0x24, 0x45, 0xc0, 0x00, 0x00,
-  0x88, 0x8a, 0x12, 0xa0, 0x00, 0x00,
-  0x06, 0x81, 0x45, 0x20, 0x00, 0x00,
-  0xe0, 0x24, 0xa1, 0x00, 0x00, 0x00,
-  0x84, 0x40, 0xd8, 0x20, 0x00, 0x00,
-  0x44, 0x19, 0x16, 0x00, 0x00, 0x00,
-  0xa2, 0x85, 0xdb, 0xa0, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom27_25[150] = {
-  0x28, 0x2c, 0x08, 0x20, 0x00, 0x00,
-  0x84, 0x52, 0x03, 0x40, 0x00, 0x00,
-  0x60, 0x44, 0x81, 0x20, 0x00, 0x00,
-  0x05, 0x49, 0x41, 0x40, 0x00, 0x00,
-  0x02, 0x9a, 0x90, 0x80, 0x00, 0x00,
-  0x01, 0x32, 0x0c, 0x40, 0x00, 0x00,
-  0x48, 0x10, 0x49, 0x80, 0x00, 0x00,
-  0x24, 0x82, 0x42, 0x20, 0x00, 0x00,
-  0x94, 0x00, 0x22, 0x20, 0x00, 0x00,
-  0x8a, 0x00, 0x74, 0x00, 0x00, 0x00,
-  0x11, 0x85, 0x2c, 0x80, 0x00, 0x00,
-  0x52, 0x20, 0x90, 0x60, 0x00, 0x00,
-  0x51, 0x23, 0x12, 0xa0, 0x00, 0x00,
-  0x66, 0x41, 0xa3, 0x00, 0x00, 0x00,
-  0x05, 0x4a, 0x40, 0x20, 0x00, 0x00,
-  0x81, 0x20, 0x05, 0x60, 0x00, 0x00,
-  0x94, 0x01, 0x40, 0x40, 0x00, 0x00,
-  0x30, 0x84, 0x08, 0x40, 0x00, 0x00,
-  0x21, 0x11, 0x18, 0x20, 0x00, 0x00,
-  0x03, 0xc0, 0x34, 0x00, 0x00, 0x00,
-  0xe8, 0x04, 0x00, 0xa0, 0x00, 0x00,
-  0x0a, 0x11, 0x80, 0x80, 0x00, 0x00,
-  0x80, 0x1c, 0x61, 0x00, 0x00, 0x00,
-  0x04, 0x92, 0xa0, 0x00, 0x00, 0x00,
-  0x08, 0xac, 0x06, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom27_26[156] = {
-  0x51, 0x23, 0x12, 0xa0, 0x00, 0x00,
-  0x66, 0x41, 0xa3, 0x00, 0x00, 0x00,
-  0x05, 0x4a, 0x40, 0x20, 0x00, 0x00,
-  0x81, 0x20, 0x05, 0x60, 0x00, 0x00,
-  0x94, 0x01, 0x40, 0x40, 0x00, 0x00,
-  0x30, 0x84, 0x08, 0x40, 0x00, 0x00,
-  0x21, 0x11, 0x18, 0x20, 0x00, 0x00,
-  0x03, 0xc0, 0x34, 0x00, 0x00, 0x00,
-  0xe8, 0x04, 0x00, 0xa0, 0x00, 0x00,
-  0x0a, 0x11, 0x80, 0x80, 0x00, 0x00,
-  0x80, 0x1c, 0x61, 0x00, 0x00, 0x00,
-  0x04, 0x92, 0xa0, 0x00, 0x00, 0x00,
-  0x08, 0xac, 0x06, 0x00, 0x00, 0x00,
-  0x28, 0x2c, 0x08, 0x20, 0x00, 0x00,
-  0x84, 0x52, 0x03, 0x40, 0x00, 0x00,
-  0x60, 0x44, 0x81, 0x20, 0x00, 0x00,
-  0x05, 0x49, 0x41, 0x40, 0x00, 0x00,
-  0x02, 0x9a, 0x90, 0x80, 0x00, 0x00,
-  0x01, 0x32, 0x0c, 0x40, 0x00, 0x00,
-  0x48, 0x10, 0x49, 0x80, 0x00, 0x00,
-  0x24, 0x82, 0x42, 0x20, 0x00, 0x00,
-  0x94, 0x00, 0x22, 0x20, 0x00, 0x00,
-  0x8a, 0x00, 0x74, 0x00, 0x00, 0x00,
-  0x11, 0x85, 0x2c, 0x80, 0x00, 0x00,
-  0x52, 0x20, 0x90, 0x60, 0x00, 0x00,
-  0xcd, 0x41, 0xa2, 0x40, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom27_27[162] = {
-  0x51, 0x23, 0x12, 0xa0, 0x00, 0x00,
-  0x66, 0x41, 0xa3, 0x00, 0x00, 0x00,
-  0x05, 0x4a, 0x40, 0x20, 0x00, 0x00,
-  0x81, 0x20, 0x05, 0x60, 0x00, 0x00,
-  0x94, 0x01, 0x40, 0x40, 0x00, 0x00,
-  0x30, 0x84, 0x08, 0x40, 0x00, 0x00,
-  0x21, 0x11, 0x18, 0x20, 0x00, 0x00,
-  0x03, 0xc0, 0x34, 0x00, 0x00, 0x00,
-  0xe8, 0x04, 0x00, 0xa0, 0x00, 0x00,
-  0x0a, 0x11, 0x80, 0x80, 0x00, 0x00,
-  0x80, 0x1c, 0x61, 0x00, 0x00, 0x00,
-  0x04, 0x92, 0xa0, 0x00, 0x00, 0x00,
-  0x08, 0xac, 0x06, 0x00, 0x00, 0x00,
-  0x51, 0x22, 0x02, 0xa0, 0x00, 0x00,
-  0x66, 0x40, 0xaa, 0x00, 0x00, 0x00,
-  0x05, 0x4e, 0x00, 0x20, 0x00, 0x00,
-  0x81, 0x21, 0x40, 0x80, 0x00, 0x00,
-  0x94, 0x00, 0x28, 0x60, 0x00, 0x00,
-  0x30, 0x83, 0x24, 0x00, 0x00, 0x00,
-  0x21, 0x14, 0x0c, 0x00, 0x00, 0x00,
-  0x03, 0xc0, 0x84, 0xc0, 0x00, 0x00,
-  0xe8, 0x04, 0x21, 0x00, 0x00, 0x00,
-  0x0a, 0x10, 0x91, 0x80, 0x00, 0x00,
-  0x80, 0x1b, 0x10, 0x00, 0x00, 0x00,
-  0x04, 0x91, 0x43, 0x00, 0x00, 0x00,
-  0x08, 0xa8, 0x70, 0x40, 0x00, 0x00,
-  0x9c, 0xc0, 0x84, 0x20, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom27_3[18] = {
-  0x99, 0xb5, 0x66, 0xc0, 0x00, 0x00,
-  0x46, 0xda, 0xab, 0x60, 0x00, 0x00,
-  0x37, 0x29, 0x3d, 0xa0, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom27_4[24] = {
-  0x49, 0xb1, 0x66, 0xc0, 0x00, 0x00,
-  0x26, 0xd4, 0x9b, 0x40, 0x00, 0x00,
-  0x85, 0x68, 0xd5, 0xa0, 0x00, 0x00,
-  0x52, 0x5a, 0x39, 0x60, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom27_5[30] = {
-  0x51, 0x33, 0x26, 0xc0, 0x00, 0x00,
-  0x66, 0x45, 0x2b, 0x40, 0x00, 0x00,
-  0x0c, 0x6a, 0x95, 0xa0, 0x00, 0x00,
-  0xa1, 0xc0, 0xed, 0x40, 0x00, 0x00,
-  0x22, 0x9c, 0xe2, 0xa0, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom27_6[36] = {
-  0xd1, 0x22, 0x52, 0xa0, 0x00, 0x00,
-  0x46, 0xd4, 0xaa, 0x40, 0x00, 0x00,
-  0x15, 0x48, 0xa5, 0xa0, 0x00, 0x00,
-  0x21, 0x72, 0x8d, 0x40, 0x00, 0x00,
-  0x28, 0xc9, 0x13, 0x60, 0x00, 0x00,
-  0xaa, 0x24, 0x44, 0x60, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom27_7[42] = {
-  0x59, 0x23, 0x12, 0xa0, 0x00, 0x00,
-  0x26, 0x55, 0xc9, 0x00, 0x00, 0x00,
-  0xb1, 0x40, 0xc5, 0xa0, 0x00, 0x00,
-  0x2b, 0x0a, 0xa4, 0xc0, 0x00, 0x00,
-  0x14, 0xc8, 0x33, 0x60, 0x00, 0x00,
-  0xc8, 0x8c, 0x2a, 0xa0, 0x00, 0x00,
-  0x84, 0xb5, 0x54, 0x40, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom27_8[48] = {
-  0x80, 0xae, 0x00, 0xa0, 0x00, 0x00,
-  0x30, 0x92, 0x0b, 0x00, 0x00, 0x00,
-  0x16, 0x0c, 0x41, 0x80, 0x00, 0x00,
-  0x03, 0x31, 0x05, 0x20, 0x00, 0x00,
-  0x44, 0x60, 0x52, 0x40, 0x00, 0x00,
-  0x08, 0x18, 0x24, 0xc0, 0x00, 0x00,
-  0xd8, 0x04, 0xa2, 0x00, 0x00, 0x00,
-  0xa1, 0x43, 0x90, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom27_9[54] = {
-  0x59, 0x25, 0x12, 0xa0, 0x00, 0x00,
-  0x66, 0x41, 0xa3, 0x00, 0x00, 0x00,
-  0x14, 0x42, 0x51, 0x20, 0x00, 0x00,
-  0x21, 0x49, 0x05, 0x40, 0x00, 0x00,
-  0x02, 0xc8, 0x8c, 0x20, 0x00, 0x00,
-  0x94, 0x12, 0x48, 0x40, 0x00, 0x00,
-  0x80, 0xac, 0x30, 0x60, 0x00, 0x00,
-  0x0a, 0x91, 0x06, 0xa0, 0x00, 0x00,
-  0x40, 0x1c, 0x42, 0x40, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom28_1[6] = {
-  0xff, 0xff, 0xff, 0xf0, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom28_10[60] = {
-  0xc0, 0xd7, 0x03, 0x50, 0x00, 0x00,
-  0x1d, 0x40, 0x75, 0x00, 0x00, 0x00,
-  0xd4, 0x0b, 0x50, 0x20, 0x00, 0x00,
-  0x02, 0x60, 0x09, 0x80, 0x00, 0x00,
-  0x04, 0x28, 0x10, 0xa0, 0x00, 0x00,
-  0x20, 0x98, 0x82, 0x60, 0x00, 0x00,
-  0x40, 0x45, 0x01, 0x10, 0x00, 0x00,
-  0x08, 0x84, 0x22, 0x10, 0x00, 0x00,
-  0x68, 0x01, 0xa0, 0x00, 0x00, 0x00,
-  0x23, 0x10, 0x8c, 0x40, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom28_11[66] = {
-  0x62, 0xd1, 0x8b, 0x40, 0x00, 0x00,
-  0x35, 0x20, 0xd4, 0x80, 0x00, 0x00,
-  0x14, 0x14, 0x50, 0x50, 0x00, 0x00,
-  0xc5, 0x0b, 0x14, 0x20, 0x00, 0x00,
-  0x22, 0x0c, 0x88, 0x30, 0x00, 0x00,
-  0x88, 0xba, 0x22, 0xe0, 0x00, 0x00,
-  0x42, 0x55, 0x09, 0x50, 0x00, 0x00,
-  0x28, 0xa4, 0xa2, 0x90, 0x00, 0x00,
-  0x94, 0x22, 0x50, 0x80, 0x00, 0x00,
-  0x1b, 0x04, 0x6c, 0x10, 0x00, 0x00,
-  0x22, 0xc0, 0x8b, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom28_12[72] = {
-  0x81, 0x06, 0x04, 0x10, 0x00, 0x00,
-  0x40, 0x69, 0x01, 0xa0, 0x00, 0x00,
-  0x90, 0x26, 0x40, 0x90, 0x00, 0x00,
-  0x28, 0x28, 0xa0, 0xa0, 0x00, 0x00,
-  0x52, 0x11, 0x48, 0x40, 0x00, 0x00,
-  0x41, 0x89, 0x06, 0x20, 0x00, 0x00,
-  0x09, 0x30, 0x24, 0xc0, 0x00, 0x00,
-  0x48, 0x45, 0x21, 0x10, 0x00, 0x00,
-  0x04, 0x44, 0x11, 0x10, 0x00, 0x00,
-  0x0e, 0x80, 0x3a, 0x00, 0x00, 0x00,
-  0xa5, 0x92, 0x96, 0x40, 0x00, 0x00,
-  0x12, 0x0c, 0x48, 0x30, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom28_13[78] = {
-  0x62, 0x55, 0x89, 0x50, 0x00, 0x00,
-  0x34, 0x60, 0xd1, 0x80, 0x00, 0x00,
-  0x48, 0x05, 0x20, 0x10, 0x00, 0x00,
-  0x00, 0xac, 0x02, 0xb0, 0x00, 0x00,
-  0x28, 0x08, 0xa0, 0x20, 0x00, 0x00,
-  0x81, 0x0a, 0x04, 0x20, 0x00, 0x00,
-  0x23, 0x04, 0x8c, 0x10, 0x00, 0x00,
-  0x06, 0x80, 0x1a, 0x00, 0x00, 0x00,
-  0x80, 0x16, 0x00, 0x50, 0x00, 0x00,
-  0x30, 0x10, 0xc0, 0x40, 0x00, 0x00,
-  0x8c, 0x22, 0x30, 0x80, 0x00, 0x00,
-  0x54, 0x01, 0x50, 0x00, 0x00, 0x00,
-  0x80, 0xc2, 0x03, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom28_14[84] = {
-  0x40, 0x55, 0x01, 0x50, 0x00, 0x00,
-  0x15, 0x40, 0x55, 0x00, 0x00, 0x00,
-  0xc0, 0x07, 0x00, 0x10, 0x00, 0x00,
-  0x28, 0x10, 0xa0, 0x40, 0x00, 0x00,
-  0x05, 0x0c, 0x14, 0x30, 0x00, 0x00,
-  0x64, 0x81, 0x92, 0x00, 0x00, 0x00,
-  0x81, 0x82, 0x06, 0x00, 0x00, 0x00,
-  0x10, 0x98, 0x42, 0x60, 0x00, 0x00,
-  0x84, 0x22, 0x10, 0x80, 0x00, 0x00,
-  0x12, 0x30, 0x48, 0xc0, 0x00, 0x00,
-  0x62, 0x01, 0x88, 0x00, 0x00, 0x00,
-  0x28, 0x60, 0xa1, 0x80, 0x00, 0x00,
-  0x0e, 0x08, 0x38, 0x20, 0x00, 0x00,
-  0x10, 0x84, 0x42, 0x10, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom28_15[90] = {
-  0x62, 0x55, 0x89, 0x50, 0x00, 0x00,
-  0xb9, 0x22, 0xe4, 0x80, 0x00, 0x00,
-  0x18, 0xb4, 0x62, 0xd0, 0x00, 0x00,
-  0x54, 0x99, 0x52, 0x60, 0x00, 0x00,
-  0x06, 0x6c, 0x19, 0xb0, 0x00, 0x00,
-  0x85, 0x56, 0x15, 0x50, 0x00, 0x00,
-  0xaa, 0x8a, 0xaa, 0x20, 0x00, 0x00,
-  0xc0, 0x17, 0x00, 0x50, 0x00, 0x00,
-  0x41, 0x61, 0x05, 0x80, 0x00, 0x00,
-  0x88, 0x32, 0x20, 0xc0, 0x00, 0x00,
-  0x20, 0xa4, 0x82, 0x90, 0x00, 0x00,
-  0x0a, 0x48, 0x29, 0x20, 0x00, 0x00,
-  0x04, 0x98, 0x12, 0x60, 0x00, 0x00,
-  0x94, 0x42, 0x51, 0x00, 0x00, 0x00,
-  0x72, 0x01, 0xc8, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom28_16[96] = {
-  0xc0, 0x17, 0x00, 0x50, 0x00, 0x00,
-  0x41, 0x61, 0x05, 0x80, 0x00, 0x00,
-  0x88, 0x32, 0x20, 0xc0, 0x00, 0x00,
-  0x20, 0xa4, 0x82, 0x90, 0x00, 0x00,
-  0x0a, 0x48, 0x29, 0x20, 0x00, 0x00,
-  0x04, 0x98, 0x12, 0x60, 0x00, 0x00,
-  0x94, 0x42, 0x51, 0x00, 0x00, 0x00,
-  0x72, 0x01, 0xc8, 0x00, 0x00, 0x00,
-  0x62, 0x55, 0x89, 0x50, 0x00, 0x00,
-  0xb9, 0x22, 0xe4, 0x80, 0x00, 0x00,
-  0x18, 0xb4, 0x62, 0xd0, 0x00, 0x00,
-  0x54, 0x99, 0x52, 0x60, 0x00, 0x00,
-  0x06, 0x6c, 0x19, 0xb0, 0x00, 0x00,
-  0x85, 0x56, 0x15, 0x50, 0x00, 0x00,
-  0xaa, 0x8a, 0xaa, 0x20, 0x00, 0x00,
-  0xed, 0x76, 0x36, 0x50, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom28_17[102] = {
-  0xc0, 0x17, 0x00, 0x50, 0x00, 0x00,
-  0x41, 0x61, 0x05, 0x80, 0x00, 0x00,
-  0x88, 0x32, 0x20, 0xc0, 0x00, 0x00,
-  0x20, 0xa4, 0x82, 0x90, 0x00, 0x00,
-  0x0a, 0x48, 0x29, 0x20, 0x00, 0x00,
-  0x04, 0x98, 0x12, 0x60, 0x00, 0x00,
-  0x94, 0x42, 0x51, 0x00, 0x00, 0x00,
-  0x72, 0x01, 0xc8, 0x00, 0x00, 0x00,
-  0xa2, 0x56, 0x89, 0x50, 0x00, 0x00,
-  0x34, 0x60, 0xd1, 0x80, 0x00, 0x00,
-  0x4a, 0x25, 0x28, 0x90, 0x00, 0x00,
-  0x20, 0xa8, 0x82, 0xa0, 0x00, 0x00,
-  0x11, 0x84, 0x46, 0x10, 0x00, 0x00,
-  0x49, 0x09, 0x24, 0x20, 0x00, 0x00,
-  0x86, 0x0e, 0x18, 0x30, 0x00, 0x00,
-  0x20, 0xd4, 0x83, 0x50, 0x00, 0x00,
-  0x88, 0x4a, 0x21, 0x20, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom28_18[108] = {
-  0xa2, 0x56, 0x89, 0x50, 0x00, 0x00,
-  0x34, 0x60, 0xd1, 0x80, 0x00, 0x00,
-  0x4a, 0x25, 0x28, 0x90, 0x00, 0x00,
-  0x20, 0xa8, 0x82, 0xa0, 0x00, 0x00,
-  0x11, 0x84, 0x46, 0x10, 0x00, 0x00,
-  0x49, 0x09, 0x24, 0x20, 0x00, 0x00,
-  0x86, 0x0e, 0x18, 0x30, 0x00, 0x00,
-  0x20, 0xd4, 0x83, 0x50, 0x00, 0x00,
-  0x88, 0x4a, 0x21, 0x20, 0x00, 0x00,
-  0xc0, 0x17, 0x00, 0x50, 0x00, 0x00,
-  0x41, 0x61, 0x05, 0x80, 0x00, 0x00,
-  0x88, 0x32, 0x20, 0xc0, 0x00, 0x00,
-  0x20, 0xa4, 0x82, 0x90, 0x00, 0x00,
-  0x0a, 0x48, 0x29, 0x20, 0x00, 0x00,
-  0x04, 0x98, 0x12, 0x60, 0x00, 0x00,
-  0x94, 0x42, 0x51, 0x00, 0x00, 0x00,
-  0x72, 0x01, 0xc8, 0x00, 0x00, 0x00,
-  0x6e, 0x9f, 0x98, 0x10, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom28_19[114] = {
-  0xa2, 0x56, 0x89, 0x50, 0x00, 0x00,
-  0x34, 0x60, 0xd1, 0x80, 0x00, 0x00,
-  0x4a, 0x25, 0x28, 0x90, 0x00, 0x00,
-  0x20, 0xa8, 0x82, 0xa0, 0x00, 0x00,
-  0x11, 0x84, 0x46, 0x10, 0x00, 0x00,
-  0x49, 0x09, 0x24, 0x20, 0x00, 0x00,
-  0x86, 0x0e, 0x18, 0x30, 0x00, 0x00,
-  0x20, 0xd4, 0x83, 0x50, 0x00, 0x00,
-  0x88, 0x4a, 0x21, 0x20, 0x00, 0x00,
-  0xc0, 0xd7, 0x03, 0x50, 0x00, 0x00,
-  0x1d, 0x40, 0x75, 0x00, 0x00, 0x00,
-  0xd4, 0x0b, 0x50, 0x20, 0x00, 0x00,
-  0x02, 0x60, 0x09, 0x80, 0x00, 0x00,
-  0x04, 0x28, 0x10, 0xa0, 0x00, 0x00,
-  0x20, 0x98, 0x82, 0x60, 0x00, 0x00,
-  0x40, 0x45, 0x01, 0x10, 0x00, 0x00,
-  0x08, 0x84, 0x22, 0x10, 0x00, 0x00,
-  0x68, 0x01, 0xa0, 0x00, 0x00, 0x00,
-  0x23, 0x10, 0x8c, 0x40, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom28_2[12] = {
-  0xec, 0xeb, 0xb3, 0xa0, 0x00, 0x00,
-  0x3b, 0x9c, 0xee, 0x70, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom28_20[120] = {
-  0xc0, 0xd7, 0x03, 0x50, 0x00, 0x00,
-  0x1d, 0x40, 0x75, 0x00, 0x00, 0x00,
-  0xd4, 0x0b, 0x50, 0x20, 0x00, 0x00,
-  0x02, 0x60, 0x09, 0x80, 0x00, 0x00,
-  0x04, 0x28, 0x10, 0xa0, 0x00, 0x00,
-  0x20, 0x98, 0x82, 0x60, 0x00, 0x00,
-  0x40, 0x45, 0x01, 0x10, 0x00, 0x00,
-  0x08, 0x84, 0x22, 0x10, 0x00, 0x00,
-  0x68, 0x01, 0xa0, 0x00, 0x00, 0x00,
-  0x23, 0x10, 0x8c, 0x40, 0x00, 0x00,
-  0xa2, 0x56, 0x89, 0x50, 0x00, 0x00,
-  0x34, 0x60, 0xd1, 0x80, 0x00, 0x00,
-  0x4a, 0x25, 0x28, 0x90, 0x00, 0x00,
-  0x20, 0xa8, 0x82, 0xa0, 0x00, 0x00,
-  0x11, 0x84, 0x46, 0x10, 0x00, 0x00,
-  0x49, 0x09, 0x24, 0x20, 0x00, 0x00,
-  0x86, 0x0e, 0x18, 0x30, 0x00, 0x00,
-  0x20, 0xd4, 0x83, 0x50, 0x00, 0x00,
-  0x88, 0x4a, 0x21, 0x20, 0x00, 0x00,
-  0xea, 0x1b, 0x3a, 0x10, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom28_21[126] = {
-  0xc0, 0xd7, 0x03, 0x50, 0x00, 0x00,
-  0x1d, 0x40, 0x75, 0x00, 0x00, 0x00,
-  0xd4, 0x0b, 0x50, 0x20, 0x00, 0x00,
-  0x02, 0x60, 0x09, 0x80, 0x00, 0x00,
-  0x04, 0x28, 0x10, 0xa0, 0x00, 0x00,
-  0x20, 0x98, 0x82, 0x60, 0x00, 0x00,
-  0x40, 0x45, 0x01, 0x10, 0x00, 0x00,
-  0x08, 0x84, 0x22, 0x10, 0x00, 0x00,
-  0x68, 0x01, 0xa0, 0x00, 0x00, 0x00,
-  0x23, 0x10, 0x8c, 0x40, 0x00, 0x00,
-  0x62, 0xd1, 0x8b, 0x40, 0x00, 0x00,
-  0x35, 0x20, 0xd4, 0x80, 0x00, 0x00,
-  0x14, 0x14, 0x50, 0x50, 0x00, 0x00,
-  0xc5, 0x0b, 0x14, 0x20, 0x00, 0x00,
-  0x22, 0x0c, 0x88, 0x30, 0x00, 0x00,
-  0x88, 0xba, 0x22, 0xe0, 0x00, 0x00,
-  0x42, 0x55, 0x09, 0x50, 0x00, 0x00,
-  0x28, 0xa4, 0xa2, 0x90, 0x00, 0x00,
-  0x94, 0x22, 0x50, 0x80, 0x00, 0x00,
-  0x1b, 0x04, 0x6c, 0x10, 0x00, 0x00,
-  0x22, 0xc0, 0x8b, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom28_22[132] = {
-  0x62, 0xd1, 0x8b, 0x40, 0x00, 0x00,
-  0x35, 0x20, 0xd4, 0x80, 0x00, 0x00,
-  0x14, 0x14, 0x50, 0x50, 0x00, 0x00,
-  0xc5, 0x0b, 0x14, 0x20, 0x00, 0x00,
-  0x22, 0x0c, 0x88, 0x30, 0x00, 0x00,
-  0x88, 0xba, 0x22, 0xe0, 0x00, 0x00,
-  0x42, 0x55, 0x09, 0x50, 0x00, 0x00,
-  0x28, 0xa4, 0xa2, 0x90, 0x00, 0x00,
-  0x94, 0x22, 0x50, 0x80, 0x00, 0x00,
-  0x1b, 0x04, 0x6c, 0x10, 0x00, 0x00,
-  0x22, 0xc0, 0x8b, 0x00, 0x00, 0x00,
-  0xc0, 0xd7, 0x03, 0x50, 0x00, 0x00,
-  0x1d, 0x40, 0x75, 0x00, 0x00, 0x00,
-  0xd4, 0x0b, 0x50, 0x20, 0x00, 0x00,
-  0x02, 0x60, 0x09, 0x80, 0x00, 0x00,
-  0x04, 0x28, 0x10, 0xa0, 0x00, 0x00,
-  0x20, 0x98, 0x82, 0x60, 0x00, 0x00,
-  0x40, 0x45, 0x01, 0x10, 0x00, 0x00,
-  0x08, 0x84, 0x22, 0x10, 0x00, 0x00,
-  0x68, 0x01, 0xa0, 0x00, 0x00, 0x00,
-  0x23, 0x10, 0x8c, 0x40, 0x00, 0x00,
-  0x45, 0x05, 0x10, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom28_23[138] = {
-  0x62, 0xd1, 0x8b, 0x40, 0x00, 0x00,
-  0x35, 0x20, 0xd4, 0x80, 0x00, 0x00,
-  0x14, 0x14, 0x50, 0x50, 0x00, 0x00,
-  0xc5, 0x0b, 0x14, 0x20, 0x00, 0x00,
-  0x22, 0x0c, 0x88, 0x30, 0x00, 0x00,
-  0x88, 0xba, 0x22, 0xe0, 0x00, 0x00,
-  0x42, 0x55, 0x09, 0x50, 0x00, 0x00,
-  0x28, 0xa4, 0xa2, 0x90, 0x00, 0x00,
-  0x94, 0x22, 0x50, 0x80, 0x00, 0x00,
-  0x1b, 0x04, 0x6c, 0x10, 0x00, 0x00,
-  0x22, 0xc0, 0x8b, 0x00, 0x00, 0x00,
-  0x81, 0x06, 0x04, 0x10, 0x00, 0x00,
-  0x40, 0x69, 0x01, 0xa0, 0x00, 0x00,
-  0x90, 0x26, 0x40, 0x90, 0x00, 0x00,
-  0x28, 0x28, 0xa0, 0xa0, 0x00, 0x00,
-  0x52, 0x11, 0x48, 0x40, 0x00, 0x00,
-  0x41, 0x89, 0x06, 0x20, 0x00, 0x00,
-  0x09, 0x30, 0x24, 0xc0, 0x00, 0x00,
-  0x48, 0x45, 0x21, 0x10, 0x00, 0x00,
-  0x04, 0x44, 0x11, 0x10, 0x00, 0x00,
-  0x0e, 0x80, 0x3a, 0x00, 0x00, 0x00,
-  0xa5, 0x92, 0x96, 0x40, 0x00, 0x00,
-  0x12, 0x0c, 0x48, 0x30, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom28_24[144] = {
-  0x81, 0x06, 0x04, 0x10, 0x00, 0x00,
-  0x40, 0x69, 0x01, 0xa0, 0x00, 0x00,
-  0x90, 0x26, 0x40, 0x90, 0x00, 0x00,
-  0x28, 0x28, 0xa0, 0xa0, 0x00, 0x00,
-  0x52, 0x11, 0x48, 0x40, 0x00, 0x00,
-  0x41, 0x89, 0x06, 0x20, 0x00, 0x00,
-  0x09, 0x30, 0x24, 0xc0, 0x00, 0x00,
-  0x48, 0x45, 0x21, 0x10, 0x00, 0x00,
-  0x04, 0x44, 0x11, 0x10, 0x00, 0x00,
-  0x0e, 0x80, 0x3a, 0x00, 0x00, 0x00,
-  0xa5, 0x92, 0x96, 0x40, 0x00, 0x00,
-  0x12, 0x0c, 0x48, 0x30, 0x00, 0x00,
-  0x62, 0xd1, 0x8b, 0x40, 0x00, 0x00,
-  0x35, 0x20, 0xd4, 0x80, 0x00, 0x00,
-  0x14, 0x14, 0x50, 0x50, 0x00, 0x00,
-  0xc5, 0x0b, 0x14, 0x20, 0x00, 0x00,
-  0x22, 0x0c, 0x88, 0x30, 0x00, 0x00,
-  0x88, 0xba, 0x22, 0xe0, 0x00, 0x00,
-  0x42, 0x55, 0x09, 0x50, 0x00, 0x00,
-  0x28, 0xa4, 0xa2, 0x90, 0x00, 0x00,
-  0x94, 0x22, 0x50, 0x80, 0x00, 0x00,
-  0x1b, 0x04, 0x6c, 0x10, 0x00, 0x00,
-  0x22, 0xc0, 0x8b, 0x00, 0x00, 0x00,
-  0x6f, 0xd8, 0xee, 0xa0, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom28_25[150] = {
-  0x81, 0x06, 0x04, 0x10, 0x00, 0x00,
-  0x40, 0x69, 0x01, 0xa0, 0x00, 0x00,
-  0x90, 0x26, 0x40, 0x90, 0x00, 0x00,
-  0x28, 0x28, 0xa0, 0xa0, 0x00, 0x00,
-  0x52, 0x11, 0x48, 0x40, 0x00, 0x00,
-  0x41, 0x89, 0x06, 0x20, 0x00, 0x00,
-  0x09, 0x30, 0x24, 0xc0, 0x00, 0x00,
-  0x48, 0x45, 0x21, 0x10, 0x00, 0x00,
-  0x04, 0x44, 0x11, 0x10, 0x00, 0x00,
-  0x0e, 0x80, 0x3a, 0x00, 0x00, 0x00,
-  0xa5, 0x92, 0x96, 0x40, 0x00, 0x00,
-  0x12, 0x0c, 0x48, 0x30, 0x00, 0x00,
-  0x62, 0x55, 0x89, 0x50, 0x00, 0x00,
-  0x34, 0x60, 0xd1, 0x80, 0x00, 0x00,
-  0x48, 0x05, 0x20, 0x10, 0x00, 0x00,
-  0x00, 0xac, 0x02, 0xb0, 0x00, 0x00,
-  0x28, 0x08, 0xa0, 0x20, 0x00, 0x00,
-  0x81, 0x0a, 0x04, 0x20, 0x00, 0x00,
-  0x23, 0x04, 0x8c, 0x10, 0x00, 0x00,
-  0x06, 0x80, 0x1a, 0x00, 0x00, 0x00,
-  0x80, 0x16, 0x00, 0x50, 0x00, 0x00,
-  0x30, 0x10, 0xc0, 0x40, 0x00, 0x00,
-  0x8c, 0x22, 0x30, 0x80, 0x00, 0x00,
-  0x54, 0x01, 0x50, 0x00, 0x00, 0x00,
-  0x80, 0xc2, 0x03, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom28_26[156] = {
-  0x62, 0x55, 0x89, 0x50, 0x00, 0x00,
-  0x34, 0x60, 0xd1, 0x80, 0x00, 0x00,
-  0x48, 0x05, 0x20, 0x10, 0x00, 0x00,
-  0x00, 0xac, 0x02, 0xb0, 0x00, 0x00,
-  0x28, 0x08, 0xa0, 0x20, 0x00, 0x00,
-  0x81, 0x0a, 0x04, 0x20, 0x00, 0x00,
-  0x23, 0x04, 0x8c, 0x10, 0x00, 0x00,
-  0x06, 0x80, 0x1a, 0x00, 0x00, 0x00,
-  0x80, 0x16, 0x00, 0x50, 0x00, 0x00,
-  0x30, 0x10, 0xc0, 0x40, 0x00, 0x00,
-  0x8c, 0x22, 0x30, 0x80, 0x00, 0x00,
-  0x54, 0x01, 0x50, 0x00, 0x00, 0x00,
-  0x80, 0xc2, 0x03, 0x00, 0x00, 0x00,
-  0x81, 0x06, 0x04, 0x10, 0x00, 0x00,
-  0x40, 0x69, 0x01, 0xa0, 0x00, 0x00,
-  0x90, 0x26, 0x40, 0x90, 0x00, 0x00,
-  0x28, 0x28, 0xa0, 0xa0, 0x00, 0x00,
-  0x52, 0x11, 0x48, 0x40, 0x00, 0x00,
-  0x41, 0x89, 0x06, 0x20, 0x00, 0x00,
-  0x09, 0x30, 0x24, 0xc0, 0x00, 0x00,
-  0x48, 0x45, 0x21, 0x10, 0x00, 0x00,
-  0x04, 0x44, 0x11, 0x10, 0x00, 0x00,
-  0x0e, 0x80, 0x3a, 0x00, 0x00, 0x00,
-  0xa5, 0x92, 0x96, 0x40, 0x00, 0x00,
-  0x12, 0x0c, 0x48, 0x30, 0x00, 0x00,
-  0xf1, 0x64, 0xbe, 0x40, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom28_27[162] = {
-  0x62, 0x55, 0x89, 0x50, 0x00, 0x00,
-  0x34, 0x60, 0xd1, 0x80, 0x00, 0x00,
-  0x48, 0x05, 0x20, 0x10, 0x00, 0x00,
-  0x00, 0xac, 0x02, 0xb0, 0x00, 0x00,
-  0x28, 0x08, 0xa0, 0x20, 0x00, 0x00,
-  0x81, 0x0a, 0x04, 0x20, 0x00, 0x00,
-  0x23, 0x04, 0x8c, 0x10, 0x00, 0x00,
-  0x06, 0x80, 0x1a, 0x00, 0x00, 0x00,
-  0x80, 0x16, 0x00, 0x50, 0x00, 0x00,
-  0x30, 0x10, 0xc0, 0x40, 0x00, 0x00,
-  0x8c, 0x22, 0x30, 0x80, 0x00, 0x00,
-  0x54, 0x01, 0x50, 0x00, 0x00, 0x00,
-  0x80, 0xc2, 0x03, 0x00, 0x00, 0x00,
-  0x40, 0x55, 0x01, 0x50, 0x00, 0x00,
-  0x15, 0x40, 0x55, 0x00, 0x00, 0x00,
-  0xc0, 0x07, 0x00, 0x10, 0x00, 0x00,
-  0x28, 0x10, 0xa0, 0x40, 0x00, 0x00,
-  0x05, 0x0c, 0x14, 0x30, 0x00, 0x00,
-  0x64, 0x81, 0x92, 0x00, 0x00, 0x00,
-  0x81, 0x82, 0x06, 0x00, 0x00, 0x00,
-  0x10, 0x98, 0x42, 0x60, 0x00, 0x00,
-  0x84, 0x22, 0x10, 0x80, 0x00, 0x00,
-  0x12, 0x30, 0x48, 0xc0, 0x00, 0x00,
-  0x62, 0x01, 0x88, 0x00, 0x00, 0x00,
-  0x28, 0x60, 0xa1, 0x80, 0x00, 0x00,
-  0x0e, 0x08, 0x38, 0x20, 0x00, 0x00,
-  0x10, 0x84, 0x42, 0x10, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom28_28[168] = {
-  0x40, 0x55, 0x01, 0x50, 0x00, 0x00,
-  0x15, 0x40, 0x55, 0x00, 0x00, 0x00,
-  0xc0, 0x07, 0x00, 0x10, 0x00, 0x00,
-  0x28, 0x10, 0xa0, 0x40, 0x00, 0x00,
-  0x05, 0x0c, 0x14, 0x30, 0x00, 0x00,
-  0x64, 0x81, 0x92, 0x00, 0x00, 0x00,
-  0x81, 0x82, 0x06, 0x00, 0x00, 0x00,
-  0x10, 0x98, 0x42, 0x60, 0x00, 0x00,
-  0x84, 0x22, 0x10, 0x80, 0x00, 0x00,
-  0x12, 0x30, 0x48, 0xc0, 0x00, 0x00,
-  0x62, 0x01, 0x88, 0x00, 0x00, 0x00,
-  0x28, 0x60, 0xa1, 0x80, 0x00, 0x00,
-  0x0e, 0x08, 0x38, 0x20, 0x00, 0x00,
-  0x10, 0x84, 0x42, 0x10, 0x00, 0x00,
-  0x62, 0x55, 0x89, 0x50, 0x00, 0x00,
-  0x34, 0x60, 0xd1, 0x80, 0x00, 0x00,
-  0x48, 0x05, 0x20, 0x10, 0x00, 0x00,
-  0x00, 0xac, 0x02, 0xb0, 0x00, 0x00,
-  0x28, 0x08, 0xa0, 0x20, 0x00, 0x00,
-  0x81, 0x0a, 0x04, 0x20, 0x00, 0x00,
-  0x23, 0x04, 0x8c, 0x10, 0x00, 0x00,
-  0x06, 0x80, 0x1a, 0x00, 0x00, 0x00,
-  0x80, 0x16, 0x00, 0x50, 0x00, 0x00,
-  0x30, 0x10, 0xc0, 0x40, 0x00, 0x00,
-  0x8c, 0x22, 0x30, 0x80, 0x00, 0x00,
-  0x54, 0x01, 0x50, 0x00, 0x00, 0x00,
-  0x80, 0xc2, 0x03, 0x00, 0x00, 0x00,
-  0x36, 0x4f, 0x1f, 0xb0, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom28_3[18] = {
-  0xac, 0xda, 0xb3, 0x60, 0x00, 0x00,
-  0x55, 0x6d, 0x55, 0xb0, 0x00, 0x00,
-  0x27, 0xb4, 0x9e, 0xd0, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom28_4[24] = {
-  0x2c, 0xd8, 0xb3, 0x60, 0x00, 0x00,
-  0x93, 0x6a, 0x4d, 0xa0, 0x00, 0x00,
-  0x1a, 0xb4, 0x6a, 0xd0, 0x00, 0x00,
-  0x47, 0x2d, 0x1c, 0xb0, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom28_5[30] = {
-  0x64, 0xd9, 0x93, 0x60, 0x00, 0x00,
-  0xa5, 0x6a, 0x95, 0xa0, 0x00, 0x00,
-  0x52, 0xb5, 0x4a, 0xd0, 0x00, 0x00,
-  0x1d, 0xa8, 0x76, 0xa0, 0x00, 0x00,
-  0x9c, 0x56, 0x71, 0x50, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom28_6[36] = {
-  0x4a, 0x55, 0x29, 0x50, 0x00, 0x00,
-  0x95, 0x4a, 0x55, 0x20, 0x00, 0x00,
-  0x14, 0xb4, 0x52, 0xd0, 0x00, 0x00,
-  0x51, 0xa9, 0x46, 0xa0, 0x00, 0x00,
-  0x22, 0x6c, 0x89, 0xb0, 0x00, 0x00,
-  0x88, 0x8e, 0x22, 0x30, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom28_7[42] = {
-  0x62, 0x55, 0x89, 0x50, 0x00, 0x00,
-  0xb9, 0x22, 0xe4, 0x80, 0x00, 0x00,
-  0x18, 0xb4, 0x62, 0xd0, 0x00, 0x00,
-  0x54, 0x99, 0x52, 0x60, 0x00, 0x00,
-  0x06, 0x6c, 0x19, 0xb0, 0x00, 0x00,
-  0x85, 0x56, 0x15, 0x50, 0x00, 0x00,
-  0xaa, 0x8a, 0xaa, 0x20, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom28_8[48] = {
-  0xc0, 0x17, 0x00, 0x50, 0x00, 0x00,
-  0x41, 0x61, 0x05, 0x80, 0x00, 0x00,
-  0x88, 0x32, 0x20, 0xc0, 0x00, 0x00,
-  0x20, 0xa4, 0x82, 0x90, 0x00, 0x00,
-  0x0a, 0x48, 0x29, 0x20, 0x00, 0x00,
-  0x04, 0x98, 0x12, 0x60, 0x00, 0x00,
-  0x94, 0x42, 0x51, 0x00, 0x00, 0x00,
-  0x72, 0x01, 0xc8, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom28_9[54] = {
-  0xa2, 0x56, 0x89, 0x50, 0x00, 0x00,
-  0x34, 0x60, 0xd1, 0x80, 0x00, 0x00,
-  0x4a, 0x25, 0x28, 0x90, 0x00, 0x00,
-  0x20, 0xa8, 0x82, 0xa0, 0x00, 0x00,
-  0x11, 0x84, 0x46, 0x10, 0x00, 0x00,
-  0x49, 0x09, 0x24, 0x20, 0x00, 0x00,
-  0x86, 0x0e, 0x18, 0x30, 0x00, 0x00,
-  0x20, 0xd4, 0x83, 0x50, 0x00, 0x00,
-  0x88, 0x4a, 0x21, 0x20, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom29_1[6] = {
-  0xff, 0xff, 0xff, 0xf8, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom29_10[60] = {
-  0xc0, 0xd7, 0x02, 0x80, 0x00, 0x00,
-  0x1d, 0x40, 0x55, 0x58, 0x00, 0x00,
-  0xd4, 0x09, 0xd1, 0x00, 0x00, 0x00,
-  0x02, 0x60, 0x02, 0x70, 0x00, 0x00,
-  0x04, 0x28, 0x04, 0xb0, 0x00, 0x00,
-  0x20, 0x99, 0x12, 0x48, 0x00, 0x00,
-  0x40, 0x46, 0x21, 0x40, 0x00, 0x00,
-  0x08, 0x84, 0x82, 0x90, 0x00, 0x00,
-  0x68, 0x02, 0xa8, 0x10, 0x00, 0x00,
-  0x23, 0x10, 0x09, 0x88, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom29_11[66] = {
-  0x62, 0xd1, 0x88, 0x88, 0x00, 0x00,
-  0x35, 0x23, 0xc4, 0x40, 0x00, 0x00,
-  0x14, 0x14, 0x40, 0x38, 0x00, 0x00,
-  0xc5, 0x08, 0x42, 0xc0, 0x00, 0x00,
-  0x22, 0x0c, 0x90, 0x90, 0x00, 0x00,
-  0x88, 0xb8, 0x04, 0x48, 0x00, 0x00,
-  0x42, 0x54, 0x03, 0x10, 0x00, 0x00,
-  0x28, 0xa4, 0x12, 0x88, 0x00, 0x00,
-  0x94, 0x20, 0x09, 0x60, 0x00, 0x00,
-  0x1b, 0x04, 0xac, 0x00, 0x00, 0x00,
-  0x22, 0xc2, 0x61, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom29_12[72] = {
-  0x81, 0x06, 0x22, 0x40, 0x00, 0x00,
-  0x40, 0x69, 0x01, 0x50, 0x00, 0x00,
-  0x90, 0x26, 0x09, 0x88, 0x00, 0x00,
-  0x28, 0x28, 0x86, 0x90, 0x00, 0x00,
-  0x52, 0x10, 0x41, 0x90, 0x00, 0x00,
-  0x41, 0x89, 0x10, 0x28, 0x00, 0x00,
-  0x09, 0x30, 0x43, 0x20, 0x00, 0x00,
-  0x48, 0x45, 0x34, 0xa8, 0x00, 0x00,
-  0x04, 0x44, 0xe0, 0x08, 0x00, 0x00,
-  0x0e, 0x80, 0x5d, 0x20, 0x00, 0x00,
-  0xa5, 0x92, 0x42, 0x10, 0x00, 0x00,
-  0x12, 0x0d, 0xc8, 0x50, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom29_13[78] = {
-  0x62, 0x55, 0x8a, 0x88, 0x00, 0x00,
-  0x34, 0x60, 0xd1, 0x10, 0x00, 0x00,
-  0x48, 0x05, 0x01, 0x28, 0x00, 0x00,
-  0x00, 0xaf, 0x10, 0x10, 0x00, 0x00,
-  0x28, 0x08, 0x21, 0x80, 0x00, 0x00,
-  0x81, 0x0a, 0x50, 0x48, 0x00, 0x00,
-  0x23, 0x06, 0x23, 0x00, 0x00, 0x00,
-  0x06, 0x80, 0x84, 0xc8, 0x00, 0x00,
-  0x80, 0x17, 0x05, 0x00, 0x00, 0x00,
-  0x30, 0x10, 0x41, 0xa0, 0x00, 0x00,
-  0x8c, 0x20, 0x1a, 0x40, 0x00, 0x00,
-  0x54, 0x01, 0x64, 0x00, 0x00, 0x00,
-  0x80, 0xc0, 0x28, 0x30, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom29_14[84] = {
-  0x40, 0x55, 0x02, 0x08, 0x00, 0x00,
-  0x15, 0x40, 0x55, 0x50, 0x00, 0x00,
-  0xc0, 0x06, 0x20, 0x48, 0x00, 0x00,
-  0x28, 0x13, 0x00, 0x40, 0x00, 0x00,
-  0x05, 0x0e, 0x02, 0x80, 0x00, 0x00,
-  0x64, 0x80, 0x04, 0x88, 0x00, 0x00,
-  0x81, 0x81, 0x00, 0xb0, 0x00, 0x00,
-  0x10, 0x98, 0x88, 0x08, 0x00, 0x00,
-  0x84, 0x22, 0x40, 0x10, 0x00, 0x00,
-  0x12, 0x30, 0x49, 0x00, 0x00, 0x00,
-  0x62, 0x01, 0x74, 0x00, 0x00, 0x00,
-  0x28, 0x60, 0x81, 0x50, 0x00, 0x00,
-  0x0e, 0x0a, 0x18, 0x20, 0x00, 0x00,
-  0x10, 0x84, 0xa2, 0x20, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom29_15[90] = {
-  0x62, 0x55, 0x8a, 0x88, 0x00, 0x00,
-  0xb9, 0x22, 0xc4, 0x50, 0x00, 0x00,
-  0x18, 0xb4, 0x61, 0xa8, 0x00, 0x00,
-  0x54, 0x99, 0x13, 0x50, 0x00, 0x00,
-  0x06, 0x6c, 0x4d, 0x90, 0x00, 0x00,
-  0x85, 0x55, 0x24, 0x68, 0x00, 0x00,
-  0xaa, 0x8a, 0x1a, 0x30, 0x00, 0x00,
-  0xc0, 0x16, 0x40, 0x88, 0x00, 0x00,
-  0x41, 0x60, 0x25, 0x40, 0x00, 0x00,
-  0x88, 0x30, 0x01, 0xa8, 0x00, 0x00,
-  0x20, 0xa4, 0x80, 0xd0, 0x00, 0x00,
-  0x0a, 0x48, 0x51, 0x10, 0x00, 0x00,
-  0x04, 0x9b, 0x08, 0x40, 0x00, 0x00,
-  0x94, 0x40, 0x03, 0x18, 0x00, 0x00,
-  0x72, 0x01, 0x96, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom29_16[96] = {
-  0xc0, 0x16, 0x40, 0x88, 0x00, 0x00,
-  0x41, 0x60, 0x25, 0x40, 0x00, 0x00,
-  0x88, 0x30, 0x01, 0xa8, 0x00, 0x00,
-  0x20, 0xa4, 0x80, 0xd0, 0x00, 0x00,
-  0x0a, 0x48, 0x51, 0x10, 0x00, 0x00,
-  0x04, 0x9b, 0x08, 0x40, 0x00, 0x00,
-  0x94, 0x40, 0x03, 0x18, 0x00, 0x00,
-  0x72, 0x01, 0x96, 0x00, 0x00, 0x00,
-  0x62, 0x55, 0x8a, 0x88, 0x00, 0x00,
-  0xb9, 0x22, 0xc4, 0x50, 0x00, 0x00,
-  0x18, 0xb4, 0x61, 0xa8, 0x00, 0x00,
-  0x54, 0x99, 0x13, 0x50, 0x00, 0x00,
-  0x06, 0x6c, 0x4d, 0x90, 0x00, 0x00,
-  0x85, 0x55, 0x24, 0x68, 0x00, 0x00,
-  0xaa, 0x8a, 0x1a, 0x30, 0x00, 0x00,
-  0x0d, 0x2c, 0xf2, 0x20, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom29_17[102] = {
-  0xc0, 0x16, 0x40, 0x88, 0x00, 0x00,
-  0x41, 0x60, 0x25, 0x40, 0x00, 0x00,
-  0x88, 0x30, 0x01, 0xa8, 0x00, 0x00,
-  0x20, 0xa4, 0x80, 0xd0, 0x00, 0x00,
-  0x0a, 0x48, 0x51, 0x10, 0x00, 0x00,
-  0x04, 0x9b, 0x08, 0x40, 0x00, 0x00,
-  0x94, 0x40, 0x03, 0x18, 0x00, 0x00,
-  0x72, 0x01, 0x96, 0x00, 0x00, 0x00,
-  0xa2, 0x55, 0x88, 0x88, 0x00, 0x00,
-  0x34, 0x60, 0x91, 0x10, 0x00, 0x00,
-  0x4a, 0x27, 0x01, 0x40, 0x00, 0x00,
-  0x20, 0xa8, 0x0c, 0x30, 0x00, 0x00,
-  0x11, 0x84, 0x58, 0xa0, 0x00, 0x00,
-  0x49, 0x0a, 0x24, 0x00, 0x00, 0x00,
-  0x86, 0x0e, 0x0a, 0x40, 0x00, 0x00,
-  0x20, 0xd4, 0x22, 0x90, 0x00, 0x00,
-  0x88, 0x4a, 0x41, 0x20, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom29_18[108] = {
-  0xa2, 0x55, 0x88, 0x88, 0x00, 0x00,
-  0x34, 0x60, 0x91, 0x10, 0x00, 0x00,
-  0x4a, 0x27, 0x01, 0x40, 0x00, 0x00,
-  0x20, 0xa8, 0x0c, 0x30, 0x00, 0x00,
-  0x11, 0x84, 0x58, 0xa0, 0x00, 0x00,
-  0x49, 0x0a, 0x24, 0x00, 0x00, 0x00,
-  0x86, 0x0e, 0x0a, 0x40, 0x00, 0x00,
-  0x20, 0xd4, 0x22, 0x90, 0x00, 0x00,
-  0x88, 0x4a, 0x41, 0x20, 0x00, 0x00,
-  0xc0, 0x16, 0x40, 0x88, 0x00, 0x00,
-  0x41, 0x60, 0x25, 0x40, 0x00, 0x00,
-  0x88, 0x30, 0x01, 0xa8, 0x00, 0x00,
-  0x20, 0xa4, 0x80, 0xd0, 0x00, 0x00,
-  0x0a, 0x48, 0x51, 0x10, 0x00, 0x00,
-  0x04, 0x9b, 0x08, 0x40, 0x00, 0x00,
-  0x94, 0x40, 0x03, 0x18, 0x00, 0x00,
-  0x72, 0x01, 0x96, 0x00, 0x00, 0x00,
-  0x71, 0x36, 0xf2, 0xb0, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom29_19[114] = {
-  0xa2, 0x55, 0x88, 0x88, 0x00, 0x00,
-  0x34, 0x60, 0x91, 0x10, 0x00, 0x00,
-  0x4a, 0x27, 0x01, 0x40, 0x00, 0x00,
-  0x20, 0xa8, 0x0c, 0x30, 0x00, 0x00,
-  0x11, 0x84, 0x58, 0xa0, 0x00, 0x00,
-  0x49, 0x0a, 0x24, 0x00, 0x00, 0x00,
-  0x86, 0x0e, 0x0a, 0x40, 0x00, 0x00,
-  0x20, 0xd4, 0x22, 0x90, 0x00, 0x00,
-  0x88, 0x4a, 0x41, 0x20, 0x00, 0x00,
-  0xc0, 0xd7, 0x02, 0x80, 0x00, 0x00,
-  0x1d, 0x40, 0x55, 0x58, 0x00, 0x00,
-  0xd4, 0x09, 0xd1, 0x00, 0x00, 0x00,
-  0x02, 0x60, 0x02, 0x70, 0x00, 0x00,
-  0x04, 0x28, 0x04, 0xb0, 0x00, 0x00,
-  0x20, 0x99, 0x12, 0x48, 0x00, 0x00,
-  0x40, 0x46, 0x21, 0x40, 0x00, 0x00,
-  0x08, 0x84, 0x82, 0x90, 0x00, 0x00,
-  0x68, 0x02, 0xa8, 0x10, 0x00, 0x00,
-  0x23, 0x10, 0x09, 0x88, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom29_2[12] = {
-  0xec, 0xeb, 0xb3, 0xa8, 0x00, 0x00,
-  0x3b, 0x9e, 0xee, 0x70, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom29_20[120] = {
-  0xc0, 0xd7, 0x02, 0x80, 0x00, 0x00,
-  0x1d, 0x40, 0x55, 0x58, 0x00, 0x00,
-  0xd4, 0x09, 0xd1, 0x00, 0x00, 0x00,
-  0x02, 0x60, 0x02, 0x70, 0x00, 0x00,
-  0x04, 0x28, 0x04, 0xb0, 0x00, 0x00,
-  0x20, 0x99, 0x12, 0x48, 0x00, 0x00,
-  0x40, 0x46, 0x21, 0x40, 0x00, 0x00,
-  0x08, 0x84, 0x82, 0x90, 0x00, 0x00,
-  0x68, 0x02, 0xa8, 0x10, 0x00, 0x00,
-  0x23, 0x10, 0x09, 0x88, 0x00, 0x00,
-  0xa2, 0x55, 0x88, 0x88, 0x00, 0x00,
-  0x34, 0x60, 0x91, 0x10, 0x00, 0x00,
-  0x4a, 0x27, 0x01, 0x40, 0x00, 0x00,
-  0x20, 0xa8, 0x0c, 0x30, 0x00, 0x00,
-  0x11, 0x84, 0x58, 0xa0, 0x00, 0x00,
-  0x49, 0x0a, 0x24, 0x00, 0x00, 0x00,
-  0x86, 0x0e, 0x0a, 0x40, 0x00, 0x00,
-  0x20, 0xd4, 0x22, 0x90, 0x00, 0x00,
-  0x88, 0x4a, 0x41, 0x20, 0x00, 0x00,
-  0xe7, 0xec, 0xdc, 0xb0, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom29_21[126] = {
-  0xc0, 0xd7, 0x02, 0x80, 0x00, 0x00,
-  0x1d, 0x40, 0x55, 0x58, 0x00, 0x00,
-  0xd4, 0x09, 0xd1, 0x00, 0x00, 0x00,
-  0x02, 0x60, 0x02, 0x70, 0x00, 0x00,
-  0x04, 0x28, 0x04, 0xb0, 0x00, 0x00,
-  0x20, 0x99, 0x12, 0x48, 0x00, 0x00,
-  0x40, 0x46, 0x21, 0x40, 0x00, 0x00,
-  0x08, 0x84, 0x82, 0x90, 0x00, 0x00,
-  0x68, 0x02, 0xa8, 0x10, 0x00, 0x00,
-  0x23, 0x10, 0x09, 0x88, 0x00, 0x00,
-  0x62, 0xd1, 0x88, 0x88, 0x00, 0x00,
-  0x35, 0x23, 0xc4, 0x40, 0x00, 0x00,
-  0x14, 0x14, 0x40, 0x38, 0x00, 0x00,
-  0xc5, 0x08, 0x42, 0xc0, 0x00, 0x00,
-  0x22, 0x0c, 0x90, 0x90, 0x00, 0x00,
-  0x88, 0xb8, 0x04, 0x48, 0x00, 0x00,
-  0x42, 0x54, 0x03, 0x10, 0x00, 0x00,
-  0x28, 0xa4, 0x12, 0x88, 0x00, 0x00,
-  0x94, 0x20, 0x09, 0x60, 0x00, 0x00,
-  0x1b, 0x04, 0xac, 0x00, 0x00, 0x00,
-  0x22, 0xc2, 0x61, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom29_22[132] = {
-  0x62, 0xd1, 0x88, 0x88, 0x00, 0x00,
-  0x35, 0x23, 0xc4, 0x40, 0x00, 0x00,
-  0x14, 0x14, 0x40, 0x38, 0x00, 0x00,
-  0xc5, 0x08, 0x42, 0xc0, 0x00, 0x00,
-  0x22, 0x0c, 0x90, 0x90, 0x00, 0x00,
-  0x88, 0xb8, 0x04, 0x48, 0x00, 0x00,
-  0x42, 0x54, 0x03, 0x10, 0x00, 0x00,
-  0x28, 0xa4, 0x12, 0x88, 0x00, 0x00,
-  0x94, 0x20, 0x09, 0x60, 0x00, 0x00,
-  0x1b, 0x04, 0xac, 0x00, 0x00, 0x00,
-  0x22, 0xc2, 0x61, 0x00, 0x00, 0x00,
-  0xc0, 0xd7, 0x02, 0x80, 0x00, 0x00,
-  0x1d, 0x40, 0x55, 0x58, 0x00, 0x00,
-  0xd4, 0x09, 0xd1, 0x00, 0x00, 0x00,
-  0x02, 0x60, 0x02, 0x70, 0x00, 0x00,
-  0x04, 0x28, 0x04, 0xb0, 0x00, 0x00,
-  0x20, 0x99, 0x12, 0x48, 0x00, 0x00,
-  0x40, 0x46, 0x21, 0x40, 0x00, 0x00,
-  0x08, 0x84, 0x82, 0x90, 0x00, 0x00,
-  0x68, 0x02, 0xa8, 0x10, 0x00, 0x00,
-  0x23, 0x10, 0x09, 0x88, 0x00, 0x00,
-  0x1c, 0x90, 0xa9, 0xa0, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom29_23[138] = {
-  0x62, 0xd1, 0x88, 0x88, 0x00, 0x00,
-  0x35, 0x23, 0xc4, 0x40, 0x00, 0x00,
-  0x14, 0x14, 0x40, 0x38, 0x00, 0x00,
-  0xc5, 0x08, 0x42, 0xc0, 0x00, 0x00,
-  0x22, 0x0c, 0x90, 0x90, 0x00, 0x00,
-  0x88, 0xb8, 0x04, 0x48, 0x00, 0x00,
-  0x42, 0x54, 0x03, 0x10, 0x00, 0x00,
-  0x28, 0xa4, 0x12, 0x88, 0x00, 0x00,
-  0x94, 0x20, 0x09, 0x60, 0x00, 0x00,
-  0x1b, 0x04, 0xac, 0x00, 0x00, 0x00,
-  0x22, 0xc2, 0x61, 0x00, 0x00, 0x00,
-  0x81, 0x06, 0x22, 0x40, 0x00, 0x00,
-  0x40, 0x69, 0x01, 0x50, 0x00, 0x00,
-  0x90, 0x26, 0x09, 0x88, 0x00, 0x00,
-  0x28, 0x28, 0x86, 0x90, 0x00, 0x00,
-  0x52, 0x10, 0x41, 0x90, 0x00, 0x00,
-  0x41, 0x89, 0x10, 0x28, 0x00, 0x00,
-  0x09, 0x30, 0x43, 0x20, 0x00, 0x00,
-  0x48, 0x45, 0x34, 0xa8, 0x00, 0x00,
-  0x04, 0x44, 0xe0, 0x08, 0x00, 0x00,
-  0x0e, 0x80, 0x5d, 0x20, 0x00, 0x00,
-  0xa5, 0x92, 0x42, 0x10, 0x00, 0x00,
-  0x12, 0x0d, 0xc8, 0x50, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom29_24[144] = {
-  0x81, 0x06, 0x22, 0x40, 0x00, 0x00,
-  0x40, 0x69, 0x01, 0x50, 0x00, 0x00,
-  0x90, 0x26, 0x09, 0x88, 0x00, 0x00,
-  0x28, 0x28, 0x86, 0x90, 0x00, 0x00,
-  0x52, 0x10, 0x41, 0x90, 0x00, 0x00,
-  0x41, 0x89, 0x10, 0x28, 0x00, 0x00,
-  0x09, 0x30, 0x43, 0x20, 0x00, 0x00,
-  0x48, 0x45, 0x34, 0xa8, 0x00, 0x00,
-  0x04, 0x44, 0xe0, 0x08, 0x00, 0x00,
-  0x0e, 0x80, 0x5d, 0x20, 0x00, 0x00,
-  0xa5, 0x92, 0x42, 0x10, 0x00, 0x00,
-  0x12, 0x0d, 0xc8, 0x50, 0x00, 0x00,
-  0x62, 0xd1, 0x88, 0x88, 0x00, 0x00,
-  0x35, 0x23, 0xc4, 0x40, 0x00, 0x00,
-  0x14, 0x14, 0x40, 0x38, 0x00, 0x00,
-  0xc5, 0x08, 0x42, 0xc0, 0x00, 0x00,
-  0x22, 0x0c, 0x90, 0x90, 0x00, 0x00,
-  0x88, 0xb8, 0x04, 0x48, 0x00, 0x00,
-  0x42, 0x54, 0x03, 0x10, 0x00, 0x00,
-  0x28, 0xa4, 0x12, 0x88, 0x00, 0x00,
-  0x94, 0x20, 0x09, 0x60, 0x00, 0x00,
-  0x1b, 0x04, 0xac, 0x00, 0x00, 0x00,
-  0x22, 0xc2, 0x61, 0x00, 0x00, 0x00,
-  0xbd, 0x86, 0x97, 0xc0, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom29_25[150] = {
-  0x81, 0x06, 0x22, 0x40, 0x00, 0x00,
-  0x40, 0x69, 0x01, 0x50, 0x00, 0x00,
-  0x90, 0x26, 0x09, 0x88, 0x00, 0x00,
-  0x28, 0x28, 0x86, 0x90, 0x00, 0x00,
-  0x52, 0x10, 0x41, 0x90, 0x00, 0x00,
-  0x41, 0x89, 0x10, 0x28, 0x00, 0x00,
-  0x09, 0x30, 0x43, 0x20, 0x00, 0x00,
-  0x48, 0x45, 0x34, 0xa8, 0x00, 0x00,
-  0x04, 0x44, 0xe0, 0x08, 0x00, 0x00,
-  0x0e, 0x80, 0x5d, 0x20, 0x00, 0x00,
-  0xa5, 0x92, 0x42, 0x10, 0x00, 0x00,
-  0x12, 0x0d, 0xc8, 0x50, 0x00, 0x00,
-  0x62, 0x55, 0x8a, 0x88, 0x00, 0x00,
-  0x34, 0x60, 0xd1, 0x10, 0x00, 0x00,
-  0x48, 0x05, 0x01, 0x28, 0x00, 0x00,
-  0x00, 0xaf, 0x10, 0x10, 0x00, 0x00,
-  0x28, 0x08, 0x21, 0x80, 0x00, 0x00,
-  0x81, 0x0a, 0x50, 0x48, 0x00, 0x00,
-  0x23, 0x06, 0x23, 0x00, 0x00, 0x00,
-  0x06, 0x80, 0x84, 0xc8, 0x00, 0x00,
-  0x80, 0x17, 0x05, 0x00, 0x00, 0x00,
-  0x30, 0x10, 0x41, 0xa0, 0x00, 0x00,
-  0x8c, 0x20, 0x1a, 0x40, 0x00, 0x00,
-  0x54, 0x01, 0x64, 0x00, 0x00, 0x00,
-  0x80, 0xc0, 0x28, 0x30, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom29_26[156] = {
-  0x62, 0x55, 0x8a, 0x88, 0x00, 0x00,
-  0x34, 0x60, 0xd1, 0x10, 0x00, 0x00,
-  0x48, 0x05, 0x01, 0x28, 0x00, 0x00,
-  0x00, 0xaf, 0x10, 0x10, 0x00, 0x00,
-  0x28, 0x08, 0x21, 0x80, 0x00, 0x00,
-  0x81, 0x0a, 0x50, 0x48, 0x00, 0x00,
-  0x23, 0x06, 0x23, 0x00, 0x00, 0x00,
-  0x06, 0x80, 0x84, 0xc8, 0x00, 0x00,
-  0x80, 0x17, 0x05, 0x00, 0x00, 0x00,
-  0x30, 0x10, 0x41, 0xa0, 0x00, 0x00,
-  0x8c, 0x20, 0x1a, 0x40, 0x00, 0x00,
-  0x54, 0x01, 0x64, 0x00, 0x00, 0x00,
-  0x80, 0xc0, 0x28, 0x30, 0x00, 0x00,
-  0x81, 0x06, 0x22, 0x40, 0x00, 0x00,
-  0x40, 0x69, 0x01, 0x50, 0x00, 0x00,
-  0x90, 0x26, 0x09, 0x88, 0x00, 0x00,
-  0x28, 0x28, 0x86, 0x90, 0x00, 0x00,
-  0x52, 0x10, 0x41, 0x90, 0x00, 0x00,
-  0x41, 0x89, 0x10, 0x28, 0x00, 0x00,
-  0x09, 0x30, 0x43, 0x20, 0x00, 0x00,
-  0x48, 0x45, 0x34, 0xa8, 0x00, 0x00,
-  0x04, 0x44, 0xe0, 0x08, 0x00, 0x00,
-  0x0e, 0x80, 0x5d, 0x20, 0x00, 0x00,
-  0xa5, 0x92, 0x42, 0x10, 0x00, 0x00,
-  0x12, 0x0d, 0xc8, 0x50, 0x00, 0x00,
-  0xb5, 0x4c, 0xa9, 0x70, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom29_27[162] = {
-  0x62, 0x55, 0x8a, 0x88, 0x00, 0x00,
-  0x34, 0x60, 0xd1, 0x10, 0x00, 0x00,
-  0x48, 0x05, 0x01, 0x28, 0x00, 0x00,
-  0x00, 0xaf, 0x10, 0x10, 0x00, 0x00,
-  0x28, 0x08, 0x21, 0x80, 0x00, 0x00,
-  0x81, 0x0a, 0x50, 0x48, 0x00, 0x00,
-  0x23, 0x06, 0x23, 0x00, 0x00, 0x00,
-  0x06, 0x80, 0x84, 0xc8, 0x00, 0x00,
-  0x80, 0x17, 0x05, 0x00, 0x00, 0x00,
-  0x30, 0x10, 0x41, 0xa0, 0x00, 0x00,
-  0x8c, 0x20, 0x1a, 0x40, 0x00, 0x00,
-  0x54, 0x01, 0x64, 0x00, 0x00, 0x00,
-  0x80, 0xc0, 0x28, 0x30, 0x00, 0x00,
-  0x40, 0x55, 0x02, 0x08, 0x00, 0x00,
-  0x15, 0x40, 0x55, 0x50, 0x00, 0x00,
-  0xc0, 0x06, 0x20, 0x48, 0x00, 0x00,
-  0x28, 0x13, 0x00, 0x40, 0x00, 0x00,
-  0x05, 0x0e, 0x02, 0x80, 0x00, 0x00,
-  0x64, 0x80, 0x04, 0x88, 0x00, 0x00,
-  0x81, 0x81, 0x00, 0xb0, 0x00, 0x00,
-  0x10, 0x98, 0x88, 0x08, 0x00, 0x00,
-  0x84, 0x22, 0x40, 0x10, 0x00, 0x00,
-  0x12, 0x30, 0x49, 0x00, 0x00, 0x00,
-  0x62, 0x01, 0x74, 0x00, 0x00, 0x00,
-  0x28, 0x60, 0x81, 0x50, 0x00, 0x00,
-  0x0e, 0x0a, 0x18, 0x20, 0x00, 0x00,
-  0x10, 0x84, 0xa2, 0x20, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom29_28[168] = {
-  0x40, 0x55, 0x02, 0x08, 0x00, 0x00,
-  0x15, 0x40, 0x55, 0x50, 0x00, 0x00,
-  0xc0, 0x06, 0x20, 0x48, 0x00, 0x00,
-  0x28, 0x13, 0x00, 0x40, 0x00, 0x00,
-  0x05, 0x0e, 0x02, 0x80, 0x00, 0x00,
-  0x64, 0x80, 0x04, 0x88, 0x00, 0x00,
-  0x81, 0x81, 0x00, 0xb0, 0x00, 0x00,
-  0x10, 0x98, 0x88, 0x08, 0x00, 0x00,
-  0x84, 0x22, 0x40, 0x10, 0x00, 0x00,
-  0x12, 0x30, 0x49, 0x00, 0x00, 0x00,
-  0x62, 0x01, 0x74, 0x00, 0x00, 0x00,
-  0x28, 0x60, 0x81, 0x50, 0x00, 0x00,
-  0x0e, 0x0a, 0x18, 0x20, 0x00, 0x00,
-  0x10, 0x84, 0xa2, 0x20, 0x00, 0x00,
-  0x62, 0x55, 0x8a, 0x88, 0x00, 0x00,
-  0x34, 0x60, 0xd1, 0x10, 0x00, 0x00,
-  0x48, 0x05, 0x01, 0x28, 0x00, 0x00,
-  0x00, 0xaf, 0x10, 0x10, 0x00, 0x00,
-  0x28, 0x08, 0x21, 0x80, 0x00, 0x00,
-  0x81, 0x0a, 0x50, 0x48, 0x00, 0x00,
-  0x23, 0x06, 0x23, 0x00, 0x00, 0x00,
-  0x06, 0x80, 0x84, 0xc8, 0x00, 0x00,
-  0x80, 0x17, 0x05, 0x00, 0x00, 0x00,
-  0x30, 0x10, 0x41, 0xa0, 0x00, 0x00,
-  0x8c, 0x20, 0x1a, 0x40, 0x00, 0x00,
-  0x54, 0x01, 0x64, 0x00, 0x00, 0x00,
-  0x80, 0xc0, 0x28, 0x30, 0x00, 0x00,
-  0xbe, 0x1f, 0x99, 0xb0, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom29_29[174] = {
-  0x40, 0x55, 0x02, 0x08, 0x00, 0x00,
-  0x15, 0x40, 0x55, 0x50, 0x00, 0x00,
-  0xc0, 0x06, 0x20, 0x48, 0x00, 0x00,
-  0x28, 0x13, 0x00, 0x40, 0x00, 0x00,
-  0x05, 0x0e, 0x02, 0x80, 0x00, 0x00,
-  0x64, 0x80, 0x04, 0x88, 0x00, 0x00,
-  0x81, 0x81, 0x00, 0xb0, 0x00, 0x00,
-  0x10, 0x98, 0x88, 0x08, 0x00, 0x00,
-  0x84, 0x22, 0x40, 0x10, 0x00, 0x00,
-  0x12, 0x30, 0x49, 0x00, 0x00, 0x00,
-  0x62, 0x01, 0x74, 0x00, 0x00, 0x00,
-  0x28, 0x60, 0x81, 0x50, 0x00, 0x00,
-  0x0e, 0x0a, 0x18, 0x20, 0x00, 0x00,
-  0x10, 0x84, 0xa2, 0x20, 0x00, 0x00,
-  0x40, 0x55, 0x88, 0x88, 0x00, 0x00,
-  0x15, 0x40, 0xc4, 0x40, 0x00, 0x00,
-  0xc0, 0x05, 0x60, 0x00, 0x00, 0x00,
-  0x28, 0x10, 0x04, 0x48, 0x00, 0x00,
-  0x05, 0x0e, 0x20, 0x80, 0x00, 0x00,
-  0x64, 0x81, 0x10, 0x08, 0x00, 0x00,
-  0x81, 0x80, 0xa4, 0x10, 0x00, 0x00,
-  0x10, 0x9a, 0x0a, 0x80, 0x00, 0x00,
-  0x84, 0x20, 0x28, 0x68, 0x00, 0x00,
-  0x12, 0x30, 0x47, 0x80, 0x00, 0x00,
-  0x62, 0x02, 0x10, 0x10, 0x00, 0x00,
-  0x28, 0x62, 0x19, 0x00, 0x00, 0x00,
-  0x0e, 0x08, 0x02, 0x18, 0x00, 0x00,
-  0x10, 0x85, 0x11, 0x20, 0x00, 0x00,
-  0x29, 0x50, 0x42, 0x60, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom29_3[18] = {
-  0xac, 0xda, 0xb2, 0x48, 0x00, 0x00,
-  0x55, 0x6d, 0x55, 0x28, 0x00, 0x00,
-  0x27, 0xb5, 0x0c, 0xd8, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom29_4[24] = {
-  0x2c, 0xd8, 0x96, 0xa8, 0x00, 0x00,
-  0x93, 0x6a, 0x55, 0x50, 0x00, 0x00,
-  0x1a, 0xb4, 0x69, 0xa8, 0x00, 0x00,
-  0x47, 0x2d, 0x0f, 0x50, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom29_5[30] = {
-  0x64, 0xd9, 0x92, 0x88, 0x00, 0x00,
-  0xa5, 0x68, 0x95, 0x50, 0x00, 0x00,
-  0x52, 0xb5, 0x25, 0xa0, 0x00, 0x00,
-  0x1d, 0xa9, 0x4e, 0x40, 0x00, 0x00,
-  0x9c, 0x56, 0x38, 0xc0, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom29_6[36] = {
-  0x4a, 0x55, 0x8a, 0x28, 0x00, 0x00,
-  0x95, 0x48, 0x55, 0x50, 0x00, 0x00,
-  0x14, 0xb5, 0x31, 0x18, 0x00, 0x00,
-  0x51, 0xa9, 0x4a, 0x50, 0x00, 0x00,
-  0x22, 0x6c, 0x8d, 0x90, 0x00, 0x00,
-  0x88, 0x8e, 0x29, 0x60, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom29_7[42] = {
-  0x62, 0x55, 0x8a, 0x88, 0x00, 0x00,
-  0xb9, 0x22, 0xc4, 0x50, 0x00, 0x00,
-  0x18, 0xb4, 0x61, 0xa8, 0x00, 0x00,
-  0x54, 0x99, 0x13, 0x50, 0x00, 0x00,
-  0x06, 0x6c, 0x4d, 0x90, 0x00, 0x00,
-  0x85, 0x55, 0x24, 0x68, 0x00, 0x00,
-  0xaa, 0x8a, 0x1a, 0x30, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom29_8[48] = {
-  0xc0, 0x16, 0x40, 0x88, 0x00, 0x00,
-  0x41, 0x60, 0x25, 0x40, 0x00, 0x00,
-  0x88, 0x30, 0x01, 0xa8, 0x00, 0x00,
-  0x20, 0xa4, 0x80, 0xd0, 0x00, 0x00,
-  0x0a, 0x48, 0x51, 0x10, 0x00, 0x00,
-  0x04, 0x9b, 0x08, 0x40, 0x00, 0x00,
-  0x94, 0x40, 0x03, 0x18, 0x00, 0x00,
-  0x72, 0x01, 0x96, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom29_9[54] = {
-  0xa2, 0x55, 0x88, 0x88, 0x00, 0x00,
-  0x34, 0x60, 0x91, 0x10, 0x00, 0x00,
-  0x4a, 0x27, 0x01, 0x40, 0x00, 0x00,
-  0x20, 0xa8, 0x0c, 0x30, 0x00, 0x00,
-  0x11, 0x84, 0x58, 0xa0, 0x00, 0x00,
-  0x49, 0x0a, 0x24, 0x00, 0x00, 0x00,
-  0x86, 0x0e, 0x0a, 0x40, 0x00, 0x00,
-  0x20, 0xd4, 0x22, 0x90, 0x00, 0x00,
-  0x88, 0x4a, 0x41, 0x20, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom2_1[2] = {
-  0xc0, 0x00
-};
-
-const uint8_t kMaskRandom2_2[4] = {
-  0xc0, 0x00,
-  0x80, 0x00
-};
-
-const uint8_t kMaskRandom30_1[6] = {
-  0xff, 0xff, 0xff, 0xfc, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom30_10[60] = {
-  0xc0, 0xa1, 0x81, 0x40, 0x00, 0x00,
-  0x15, 0x56, 0x2a, 0xac, 0x00, 0x00,
-  0x74, 0x40, 0xe8, 0x80, 0x00, 0x00,
-  0x00, 0x9c, 0x01, 0x38, 0x00, 0x00,
-  0x01, 0x2c, 0x02, 0x58, 0x00, 0x00,
-  0x44, 0x92, 0x89, 0x24, 0x00, 0x00,
-  0x88, 0x51, 0x10, 0xa0, 0x00, 0x00,
-  0x20, 0xa4, 0x41, 0x48, 0x00, 0x00,
-  0xaa, 0x05, 0x54, 0x08, 0x00, 0x00,
-  0x02, 0x62, 0x04, 0xc4, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom30_11[66] = {
-  0x62, 0x22, 0xc4, 0x44, 0x00, 0x00,
-  0xf1, 0x11, 0xe2, 0x20, 0x00, 0x00,
-  0x10, 0x0e, 0x20, 0x1c, 0x00, 0x00,
-  0x10, 0xb0, 0x21, 0x60, 0x00, 0x00,
-  0x24, 0x24, 0x48, 0x48, 0x00, 0x00,
-  0x01, 0x12, 0x02, 0x24, 0x00, 0x00,
-  0x00, 0xc4, 0x01, 0x88, 0x00, 0x00,
-  0x04, 0xa2, 0x09, 0x44, 0x00, 0x00,
-  0x02, 0x58, 0x04, 0xb0, 0x00, 0x00,
-  0x2b, 0x00, 0x56, 0x00, 0x00, 0x00,
-  0x98, 0x41, 0x30, 0x80, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom30_12[72] = {
-  0x88, 0x91, 0x11, 0x20, 0x00, 0x00,
-  0x40, 0x54, 0x80, 0xa8, 0x00, 0x00,
-  0x82, 0x63, 0x04, 0xc4, 0x00, 0x00,
-  0x21, 0xa4, 0x43, 0x48, 0x00, 0x00,
-  0x10, 0x64, 0x20, 0xc8, 0x00, 0x00,
-  0x44, 0x0a, 0x88, 0x14, 0x00, 0x00,
-  0x10, 0xc8, 0x21, 0x90, 0x00, 0x00,
-  0x4d, 0x2a, 0x9a, 0x54, 0x00, 0x00,
-  0x38, 0x02, 0x70, 0x04, 0x00, 0x00,
-  0x17, 0x48, 0x2e, 0x90, 0x00, 0x00,
-  0x90, 0x85, 0x21, 0x08, 0x00, 0x00,
-  0x72, 0x14, 0xe4, 0x28, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom30_13[78] = {
-  0x62, 0xa2, 0xc5, 0x44, 0x00, 0x00,
-  0x34, 0x44, 0x68, 0x88, 0x00, 0x00,
-  0x40, 0x4a, 0x80, 0x94, 0x00, 0x00,
-  0xc4, 0x05, 0x88, 0x08, 0x00, 0x00,
-  0x08, 0x60, 0x10, 0xc0, 0x00, 0x00,
-  0x94, 0x13, 0x28, 0x24, 0x00, 0x00,
-  0x88, 0xc1, 0x11, 0x80, 0x00, 0x00,
-  0x21, 0x32, 0x42, 0x64, 0x00, 0x00,
-  0xc1, 0x41, 0x82, 0x80, 0x00, 0x00,
-  0x10, 0x68, 0x20, 0xd0, 0x00, 0x00,
-  0x06, 0x90, 0x0d, 0x20, 0x00, 0x00,
-  0x59, 0x00, 0xb2, 0x00, 0x00, 0x00,
-  0x0a, 0x0c, 0x14, 0x18, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom30_14[84] = {
-  0x40, 0x82, 0x81, 0x04, 0x00, 0x00,
-  0x15, 0x54, 0x2a, 0xa8, 0x00, 0x00,
-  0x88, 0x13, 0x10, 0x24, 0x00, 0x00,
-  0xc0, 0x11, 0x80, 0x20, 0x00, 0x00,
-  0x80, 0xa1, 0x01, 0x40, 0x00, 0x00,
-  0x01, 0x22, 0x02, 0x44, 0x00, 0x00,
-  0x40, 0x2c, 0x80, 0x58, 0x00, 0x00,
-  0x22, 0x02, 0x44, 0x04, 0x00, 0x00,
-  0x90, 0x05, 0x20, 0x08, 0x00, 0x00,
-  0x12, 0x40, 0x24, 0x80, 0x00, 0x00,
-  0x5d, 0x00, 0xba, 0x00, 0x00, 0x00,
-  0x20, 0x54, 0x40, 0xa8, 0x00, 0x00,
-  0x86, 0x09, 0x0c, 0x10, 0x00, 0x00,
-  0x28, 0x88, 0x51, 0x10, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom30_15[90] = {
-  0x62, 0x22, 0xc4, 0x44, 0x00, 0x00,
-  0x31, 0x10, 0x62, 0x20, 0x00, 0x00,
-  0x58, 0x00, 0xb0, 0x00, 0x00, 0x00,
-  0x01, 0x12, 0x02, 0x24, 0x00, 0x00,
-  0x88, 0x21, 0x10, 0x40, 0x00, 0x00,
-  0x44, 0x02, 0x88, 0x04, 0x00, 0x00,
-  0x29, 0x04, 0x52, 0x08, 0x00, 0x00,
-  0x82, 0xa1, 0x05, 0x40, 0x00, 0x00,
-  0x0a, 0x1a, 0x14, 0x34, 0x00, 0x00,
-  0x11, 0xe0, 0x23, 0xc0, 0x00, 0x00,
-  0x84, 0x05, 0x08, 0x08, 0x00, 0x00,
-  0x86, 0x41, 0x0c, 0x80, 0x00, 0x00,
-  0x00, 0x86, 0x01, 0x0c, 0x00, 0x00,
-  0x44, 0x48, 0x88, 0x90, 0x00, 0x00,
-  0x10, 0x98, 0x21, 0x30, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom30_16[96] = {
-  0x90, 0x23, 0x20, 0x44, 0x00, 0x00,
-  0x09, 0x50, 0x12, 0xa0, 0x00, 0x00,
-  0x00, 0x6a, 0x00, 0xd4, 0x00, 0x00,
-  0x20, 0x34, 0x40, 0x68, 0x00, 0x00,
-  0x14, 0x44, 0x28, 0x88, 0x00, 0x00,
-  0xc2, 0x11, 0x84, 0x20, 0x00, 0x00,
-  0x00, 0xc6, 0x01, 0x8c, 0x00, 0x00,
-  0x65, 0x80, 0xcb, 0x00, 0x00, 0x00,
-  0x62, 0xa2, 0xc5, 0x44, 0x00, 0x00,
-  0xb1, 0x15, 0x62, 0x28, 0x00, 0x00,
-  0x18, 0x6a, 0x30, 0xd4, 0x00, 0x00,
-  0x44, 0xd4, 0x89, 0xa8, 0x00, 0x00,
-  0x13, 0x64, 0x26, 0xc8, 0x00, 0x00,
-  0x49, 0x1a, 0x92, 0x34, 0x00, 0x00,
-  0x86, 0x8d, 0x0d, 0x18, 0x00, 0x00,
-  0xce, 0x58, 0xa0, 0x14, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom30_17[102] = {
-  0x90, 0x23, 0x20, 0x44, 0x00, 0x00,
-  0x09, 0x50, 0x12, 0xa0, 0x00, 0x00,
-  0x00, 0x6a, 0x00, 0xd4, 0x00, 0x00,
-  0x20, 0x34, 0x40, 0x68, 0x00, 0x00,
-  0x14, 0x44, 0x28, 0x88, 0x00, 0x00,
-  0xc2, 0x11, 0x84, 0x20, 0x00, 0x00,
-  0x00, 0xc6, 0x01, 0x8c, 0x00, 0x00,
-  0x65, 0x80, 0xcb, 0x00, 0x00, 0x00,
-  0x62, 0x22, 0xc4, 0x44, 0x00, 0x00,
-  0x24, 0x44, 0x48, 0x88, 0x00, 0x00,
-  0xc0, 0x51, 0x80, 0xa0, 0x00, 0x00,
-  0x03, 0x0c, 0x06, 0x18, 0x00, 0x00,
-  0x16, 0x28, 0x2c, 0x50, 0x00, 0x00,
-  0x89, 0x01, 0x12, 0x00, 0x00, 0x00,
-  0x82, 0x91, 0x05, 0x20, 0x00, 0x00,
-  0x08, 0xa4, 0x11, 0x48, 0x00, 0x00,
-  0x90, 0x49, 0x20, 0x90, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom30_18[108] = {
-  0x62, 0x22, 0xc4, 0x44, 0x00, 0x00,
-  0x24, 0x44, 0x48, 0x88, 0x00, 0x00,
-  0xc0, 0x51, 0x80, 0xa0, 0x00, 0x00,
-  0x03, 0x0c, 0x06, 0x18, 0x00, 0x00,
-  0x16, 0x28, 0x2c, 0x50, 0x00, 0x00,
-  0x89, 0x01, 0x12, 0x00, 0x00, 0x00,
-  0x82, 0x91, 0x05, 0x20, 0x00, 0x00,
-  0x08, 0xa4, 0x11, 0x48, 0x00, 0x00,
-  0x90, 0x49, 0x20, 0x90, 0x00, 0x00,
-  0x90, 0x23, 0x20, 0x44, 0x00, 0x00,
-  0x09, 0x50, 0x12, 0xa0, 0x00, 0x00,
-  0x00, 0x6a, 0x00, 0xd4, 0x00, 0x00,
-  0x20, 0x34, 0x40, 0x68, 0x00, 0x00,
-  0x14, 0x44, 0x28, 0x88, 0x00, 0x00,
-  0xc2, 0x11, 0x84, 0x20, 0x00, 0x00,
-  0x00, 0xc6, 0x01, 0x8c, 0x00, 0x00,
-  0x65, 0x80, 0xcb, 0x00, 0x00, 0x00,
-  0x00, 0xb2, 0x47, 0x80, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom30_19[114] = {
-  0x62, 0x22, 0xc4, 0x44, 0x00, 0x00,
-  0x24, 0x44, 0x48, 0x88, 0x00, 0x00,
-  0xc0, 0x51, 0x80, 0xa0, 0x00, 0x00,
-  0x03, 0x0c, 0x06, 0x18, 0x00, 0x00,
-  0x16, 0x28, 0x2c, 0x50, 0x00, 0x00,
-  0x89, 0x01, 0x12, 0x00, 0x00, 0x00,
-  0x82, 0x91, 0x05, 0x20, 0x00, 0x00,
-  0x08, 0xa4, 0x11, 0x48, 0x00, 0x00,
-  0x90, 0x49, 0x20, 0x90, 0x00, 0x00,
-  0xc0, 0xa1, 0x81, 0x40, 0x00, 0x00,
-  0x15, 0x56, 0x2a, 0xac, 0x00, 0x00,
-  0x74, 0x40, 0xe8, 0x80, 0x00, 0x00,
-  0x00, 0x9c, 0x01, 0x38, 0x00, 0x00,
-  0x01, 0x2c, 0x02, 0x58, 0x00, 0x00,
-  0x44, 0x92, 0x89, 0x24, 0x00, 0x00,
-  0x88, 0x51, 0x10, 0xa0, 0x00, 0x00,
-  0x20, 0xa4, 0x41, 0x48, 0x00, 0x00,
-  0xaa, 0x05, 0x54, 0x08, 0x00, 0x00,
-  0x02, 0x62, 0x04, 0xc4, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom30_2[12] = {
-  0xec, 0xeb, 0xd9, 0xd4, 0x00, 0x00,
-  0xbb, 0x9d, 0x77, 0x38, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom30_20[120] = {
-  0xc0, 0xa1, 0x81, 0x40, 0x00, 0x00,
-  0x15, 0x56, 0x2a, 0xac, 0x00, 0x00,
-  0x74, 0x40, 0xe8, 0x80, 0x00, 0x00,
-  0x00, 0x9c, 0x01, 0x38, 0x00, 0x00,
-  0x01, 0x2c, 0x02, 0x58, 0x00, 0x00,
-  0x44, 0x92, 0x89, 0x24, 0x00, 0x00,
-  0x88, 0x51, 0x10, 0xa0, 0x00, 0x00,
-  0x20, 0xa4, 0x41, 0x48, 0x00, 0x00,
-  0xaa, 0x05, 0x54, 0x08, 0x00, 0x00,
-  0x02, 0x62, 0x04, 0xc4, 0x00, 0x00,
-  0x62, 0x22, 0xc4, 0x44, 0x00, 0x00,
-  0x24, 0x44, 0x48, 0x88, 0x00, 0x00,
-  0xc0, 0x51, 0x80, 0xa0, 0x00, 0x00,
-  0x03, 0x0c, 0x06, 0x18, 0x00, 0x00,
-  0x16, 0x28, 0x2c, 0x50, 0x00, 0x00,
-  0x89, 0x01, 0x12, 0x00, 0x00, 0x00,
-  0x82, 0x91, 0x05, 0x20, 0x00, 0x00,
-  0x08, 0xa4, 0x11, 0x48, 0x00, 0x00,
-  0x90, 0x49, 0x20, 0x90, 0x00, 0x00,
-  0x51, 0x88, 0xd1, 0x78, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom30_21[126] = {
-  0xc0, 0xa1, 0x81, 0x40, 0x00, 0x00,
-  0x15, 0x56, 0x2a, 0xac, 0x00, 0x00,
-  0x74, 0x40, 0xe8, 0x80, 0x00, 0x00,
-  0x00, 0x9c, 0x01, 0x38, 0x00, 0x00,
-  0x01, 0x2c, 0x02, 0x58, 0x00, 0x00,
-  0x44, 0x92, 0x89, 0x24, 0x00, 0x00,
-  0x88, 0x51, 0x10, 0xa0, 0x00, 0x00,
-  0x20, 0xa4, 0x41, 0x48, 0x00, 0x00,
-  0xaa, 0x05, 0x54, 0x08, 0x00, 0x00,
-  0x02, 0x62, 0x04, 0xc4, 0x00, 0x00,
-  0x62, 0x22, 0xc4, 0x44, 0x00, 0x00,
-  0xf1, 0x11, 0xe2, 0x20, 0x00, 0x00,
-  0x10, 0x0e, 0x20, 0x1c, 0x00, 0x00,
-  0x10, 0xb0, 0x21, 0x60, 0x00, 0x00,
-  0x24, 0x24, 0x48, 0x48, 0x00, 0x00,
-  0x01, 0x12, 0x02, 0x24, 0x00, 0x00,
-  0x00, 0xc4, 0x01, 0x88, 0x00, 0x00,
-  0x04, 0xa2, 0x09, 0x44, 0x00, 0x00,
-  0x02, 0x58, 0x04, 0xb0, 0x00, 0x00,
-  0x2b, 0x00, 0x56, 0x00, 0x00, 0x00,
-  0x98, 0x41, 0x30, 0x80, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom30_22[132] = {
-  0x62, 0x22, 0xc4, 0x44, 0x00, 0x00,
-  0xf1, 0x11, 0xe2, 0x20, 0x00, 0x00,
-  0x10, 0x0e, 0x20, 0x1c, 0x00, 0x00,
-  0x10, 0xb0, 0x21, 0x60, 0x00, 0x00,
-  0x24, 0x24, 0x48, 0x48, 0x00, 0x00,
-  0x01, 0x12, 0x02, 0x24, 0x00, 0x00,
-  0x00, 0xc4, 0x01, 0x88, 0x00, 0x00,
-  0x04, 0xa2, 0x09, 0x44, 0x00, 0x00,
-  0x02, 0x58, 0x04, 0xb0, 0x00, 0x00,
-  0x2b, 0x00, 0x56, 0x00, 0x00, 0x00,
-  0x98, 0x41, 0x30, 0x80, 0x00, 0x00,
-  0xc0, 0xa1, 0x81, 0x40, 0x00, 0x00,
-  0x15, 0x56, 0x2a, 0xac, 0x00, 0x00,
-  0x74, 0x40, 0xe8, 0x80, 0x00, 0x00,
-  0x00, 0x9c, 0x01, 0x38, 0x00, 0x00,
-  0x01, 0x2c, 0x02, 0x58, 0x00, 0x00,
-  0x44, 0x92, 0x89, 0x24, 0x00, 0x00,
-  0x88, 0x51, 0x10, 0xa0, 0x00, 0x00,
-  0x20, 0xa4, 0x41, 0x48, 0x00, 0x00,
-  0xaa, 0x05, 0x54, 0x08, 0x00, 0x00,
-  0x02, 0x62, 0x04, 0xc4, 0x00, 0x00,
-  0x03, 0x10, 0x18, 0x74, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom30_23[138] = {
-  0x62, 0x22, 0xc4, 0x44, 0x00, 0x00,
-  0xf1, 0x11, 0xe2, 0x20, 0x00, 0x00,
-  0x10, 0x0e, 0x20, 0x1c, 0x00, 0x00,
-  0x10, 0xb0, 0x21, 0x60, 0x00, 0x00,
-  0x24, 0x24, 0x48, 0x48, 0x00, 0x00,
-  0x01, 0x12, 0x02, 0x24, 0x00, 0x00,
-  0x00, 0xc4, 0x01, 0x88, 0x00, 0x00,
-  0x04, 0xa2, 0x09, 0x44, 0x00, 0x00,
-  0x02, 0x58, 0x04, 0xb0, 0x00, 0x00,
-  0x2b, 0x00, 0x56, 0x00, 0x00, 0x00,
-  0x98, 0x41, 0x30, 0x80, 0x00, 0x00,
-  0x88, 0x91, 0x11, 0x20, 0x00, 0x00,
-  0x40, 0x54, 0x80, 0xa8, 0x00, 0x00,
-  0x82, 0x63, 0x04, 0xc4, 0x00, 0x00,
-  0x21, 0xa4, 0x43, 0x48, 0x00, 0x00,
-  0x10, 0x64, 0x20, 0xc8, 0x00, 0x00,
-  0x44, 0x0a, 0x88, 0x14, 0x00, 0x00,
-  0x10, 0xc8, 0x21, 0x90, 0x00, 0x00,
-  0x4d, 0x2a, 0x9a, 0x54, 0x00, 0x00,
-  0x38, 0x02, 0x70, 0x04, 0x00, 0x00,
-  0x17, 0x48, 0x2e, 0x90, 0x00, 0x00,
-  0x90, 0x85, 0x21, 0x08, 0x00, 0x00,
-  0x72, 0x14, 0xe4, 0x28, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom30_24[144] = {
-  0x88, 0x91, 0x11, 0x20, 0x00, 0x00,
-  0x40, 0x54, 0x80, 0xa8, 0x00, 0x00,
-  0x82, 0x63, 0x04, 0xc4, 0x00, 0x00,
-  0x21, 0xa4, 0x43, 0x48, 0x00, 0x00,
-  0x10, 0x64, 0x20, 0xc8, 0x00, 0x00,
-  0x44, 0x0a, 0x88, 0x14, 0x00, 0x00,
-  0x10, 0xc8, 0x21, 0x90, 0x00, 0x00,
-  0x4d, 0x2a, 0x9a, 0x54, 0x00, 0x00,
-  0x38, 0x02, 0x70, 0x04, 0x00, 0x00,
-  0x17, 0x48, 0x2e, 0x90, 0x00, 0x00,
-  0x90, 0x85, 0x21, 0x08, 0x00, 0x00,
-  0x72, 0x14, 0xe4, 0x28, 0x00, 0x00,
-  0x62, 0x22, 0xc4, 0x44, 0x00, 0x00,
-  0xf1, 0x11, 0xe2, 0x20, 0x00, 0x00,
-  0x10, 0x0e, 0x20, 0x1c, 0x00, 0x00,
-  0x10, 0xb0, 0x21, 0x60, 0x00, 0x00,
-  0x24, 0x24, 0x48, 0x48, 0x00, 0x00,
-  0x01, 0x12, 0x02, 0x24, 0x00, 0x00,
-  0x00, 0xc4, 0x01, 0x88, 0x00, 0x00,
-  0x04, 0xa2, 0x09, 0x44, 0x00, 0x00,
-  0x02, 0x58, 0x04, 0xb0, 0x00, 0x00,
-  0x2b, 0x00, 0x56, 0x00, 0x00, 0x00,
-  0x98, 0x41, 0x30, 0x80, 0x00, 0x00,
-  0xf3, 0x4d, 0x1c, 0x70, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom30_25[150] = {
-  0x88, 0x91, 0x11, 0x20, 0x00, 0x00,
-  0x40, 0x54, 0x80, 0xa8, 0x00, 0x00,
-  0x82, 0x63, 0x04, 0xc4, 0x00, 0x00,
-  0x21, 0xa4, 0x43, 0x48, 0x00, 0x00,
-  0x10, 0x64, 0x20, 0xc8, 0x00, 0x00,
-  0x44, 0x0a, 0x88, 0x14, 0x00, 0x00,
-  0x10, 0xc8, 0x21, 0x90, 0x00, 0x00,
-  0x4d, 0x2a, 0x9a, 0x54, 0x00, 0x00,
-  0x38, 0x02, 0x70, 0x04, 0x00, 0x00,
-  0x17, 0x48, 0x2e, 0x90, 0x00, 0x00,
-  0x90, 0x85, 0x21, 0x08, 0x00, 0x00,
-  0x72, 0x14, 0xe4, 0x28, 0x00, 0x00,
-  0x62, 0xa2, 0xc5, 0x44, 0x00, 0x00,
-  0x34, 0x44, 0x68, 0x88, 0x00, 0x00,
-  0x40, 0x4a, 0x80, 0x94, 0x00, 0x00,
-  0xc4, 0x05, 0x88, 0x08, 0x00, 0x00,
-  0x08, 0x60, 0x10, 0xc0, 0x00, 0x00,
-  0x94, 0x13, 0x28, 0x24, 0x00, 0x00,
-  0x88, 0xc1, 0x11, 0x80, 0x00, 0x00,
-  0x21, 0x32, 0x42, 0x64, 0x00, 0x00,
-  0xc1, 0x41, 0x82, 0x80, 0x00, 0x00,
-  0x10, 0x68, 0x20, 0xd0, 0x00, 0x00,
-  0x06, 0x90, 0x0d, 0x20, 0x00, 0x00,
-  0x59, 0x00, 0xb2, 0x00, 0x00, 0x00,
-  0x0a, 0x0c, 0x14, 0x18, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom30_26[156] = {
-  0x62, 0xa2, 0xc5, 0x44, 0x00, 0x00,
-  0x34, 0x44, 0x68, 0x88, 0x00, 0x00,
-  0x40, 0x4a, 0x80, 0x94, 0x00, 0x00,
-  0xc4, 0x05, 0x88, 0x08, 0x00, 0x00,
-  0x08, 0x60, 0x10, 0xc0, 0x00, 0x00,
-  0x94, 0x13, 0x28, 0x24, 0x00, 0x00,
-  0x88, 0xc1, 0x11, 0x80, 0x00, 0x00,
-  0x21, 0x32, 0x42, 0x64, 0x00, 0x00,
-  0xc1, 0x41, 0x82, 0x80, 0x00, 0x00,
-  0x10, 0x68, 0x20, 0xd0, 0x00, 0x00,
-  0x06, 0x90, 0x0d, 0x20, 0x00, 0x00,
-  0x59, 0x00, 0xb2, 0x00, 0x00, 0x00,
-  0x0a, 0x0c, 0x14, 0x18, 0x00, 0x00,
-  0x88, 0x91, 0x11, 0x20, 0x00, 0x00,
-  0x40, 0x54, 0x80, 0xa8, 0x00, 0x00,
-  0x82, 0x63, 0x04, 0xc4, 0x00, 0x00,
-  0x21, 0xa4, 0x43, 0x48, 0x00, 0x00,
-  0x10, 0x64, 0x20, 0xc8, 0x00, 0x00,
-  0x44, 0x0a, 0x88, 0x14, 0x00, 0x00,
-  0x10, 0xc8, 0x21, 0x90, 0x00, 0x00,
-  0x4d, 0x2a, 0x9a, 0x54, 0x00, 0x00,
-  0x38, 0x02, 0x70, 0x04, 0x00, 0x00,
-  0x17, 0x48, 0x2e, 0x90, 0x00, 0x00,
-  0x90, 0x85, 0x21, 0x08, 0x00, 0x00,
-  0x72, 0x14, 0xe4, 0x28, 0x00, 0x00,
-  0x83, 0x11, 0xad, 0xe8, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom30_27[162] = {
-  0x62, 0xa2, 0xc5, 0x44, 0x00, 0x00,
-  0x34, 0x44, 0x68, 0x88, 0x00, 0x00,
-  0x40, 0x4a, 0x80, 0x94, 0x00, 0x00,
-  0xc4, 0x05, 0x88, 0x08, 0x00, 0x00,
-  0x08, 0x60, 0x10, 0xc0, 0x00, 0x00,
-  0x94, 0x13, 0x28, 0x24, 0x00, 0x00,
-  0x88, 0xc1, 0x11, 0x80, 0x00, 0x00,
-  0x21, 0x32, 0x42, 0x64, 0x00, 0x00,
-  0xc1, 0x41, 0x82, 0x80, 0x00, 0x00,
-  0x10, 0x68, 0x20, 0xd0, 0x00, 0x00,
-  0x06, 0x90, 0x0d, 0x20, 0x00, 0x00,
-  0x59, 0x00, 0xb2, 0x00, 0x00, 0x00,
-  0x0a, 0x0c, 0x14, 0x18, 0x00, 0x00,
-  0x40, 0x82, 0x81, 0x04, 0x00, 0x00,
-  0x15, 0x54, 0x2a, 0xa8, 0x00, 0x00,
-  0x88, 0x13, 0x10, 0x24, 0x00, 0x00,
-  0xc0, 0x11, 0x80, 0x20, 0x00, 0x00,
-  0x80, 0xa1, 0x01, 0x40, 0x00, 0x00,
-  0x01, 0x22, 0x02, 0x44, 0x00, 0x00,
-  0x40, 0x2c, 0x80, 0x58, 0x00, 0x00,
-  0x22, 0x02, 0x44, 0x04, 0x00, 0x00,
-  0x90, 0x05, 0x20, 0x08, 0x00, 0x00,
-  0x12, 0x40, 0x24, 0x80, 0x00, 0x00,
-  0x5d, 0x00, 0xba, 0x00, 0x00, 0x00,
-  0x20, 0x54, 0x40, 0xa8, 0x00, 0x00,
-  0x86, 0x09, 0x0c, 0x10, 0x00, 0x00,
-  0x28, 0x88, 0x51, 0x10, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom30_28[168] = {
-  0x40, 0x82, 0x81, 0x04, 0x00, 0x00,
-  0x15, 0x54, 0x2a, 0xa8, 0x00, 0x00,
-  0x88, 0x13, 0x10, 0x24, 0x00, 0x00,
-  0xc0, 0x11, 0x80, 0x20, 0x00, 0x00,
-  0x80, 0xa1, 0x01, 0x40, 0x00, 0x00,
-  0x01, 0x22, 0x02, 0x44, 0x00, 0x00,
-  0x40, 0x2c, 0x80, 0x58, 0x00, 0x00,
-  0x22, 0x02, 0x44, 0x04, 0x00, 0x00,
-  0x90, 0x05, 0x20, 0x08, 0x00, 0x00,
-  0x12, 0x40, 0x24, 0x80, 0x00, 0x00,
-  0x5d, 0x00, 0xba, 0x00, 0x00, 0x00,
-  0x20, 0x54, 0x40, 0xa8, 0x00, 0x00,
-  0x86, 0x09, 0x0c, 0x10, 0x00, 0x00,
-  0x28, 0x88, 0x51, 0x10, 0x00, 0x00,
-  0x62, 0xa2, 0xc5, 0x44, 0x00, 0x00,
-  0x34, 0x44, 0x68, 0x88, 0x00, 0x00,
-  0x40, 0x4a, 0x80, 0x94, 0x00, 0x00,
-  0xc4, 0x05, 0x88, 0x08, 0x00, 0x00,
-  0x08, 0x60, 0x10, 0xc0, 0x00, 0x00,
-  0x94, 0x13, 0x28, 0x24, 0x00, 0x00,
-  0x88, 0xc1, 0x11, 0x80, 0x00, 0x00,
-  0x21, 0x32, 0x42, 0x64, 0x00, 0x00,
-  0xc1, 0x41, 0x82, 0x80, 0x00, 0x00,
-  0x10, 0x68, 0x20, 0xd0, 0x00, 0x00,
-  0x06, 0x90, 0x0d, 0x20, 0x00, 0x00,
-  0x59, 0x00, 0xb2, 0x00, 0x00, 0x00,
-  0x0a, 0x0c, 0x14, 0x18, 0x00, 0x00,
-  0x94, 0x59, 0x03, 0x18, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom30_29[174] = {
-  0x40, 0x82, 0x81, 0x04, 0x00, 0x00,
-  0x15, 0x54, 0x2a, 0xa8, 0x00, 0x00,
-  0x88, 0x13, 0x10, 0x24, 0x00, 0x00,
-  0xc0, 0x11, 0x80, 0x20, 0x00, 0x00,
-  0x80, 0xa1, 0x01, 0x40, 0x00, 0x00,
-  0x01, 0x22, 0x02, 0x44, 0x00, 0x00,
-  0x40, 0x2c, 0x80, 0x58, 0x00, 0x00,
-  0x22, 0x02, 0x44, 0x04, 0x00, 0x00,
-  0x90, 0x05, 0x20, 0x08, 0x00, 0x00,
-  0x12, 0x40, 0x24, 0x80, 0x00, 0x00,
-  0x5d, 0x00, 0xba, 0x00, 0x00, 0x00,
-  0x20, 0x54, 0x40, 0xa8, 0x00, 0x00,
-  0x86, 0x09, 0x0c, 0x10, 0x00, 0x00,
-  0x28, 0x88, 0x51, 0x10, 0x00, 0x00,
-  0x62, 0x22, 0xc4, 0x44, 0x00, 0x00,
-  0x31, 0x10, 0x62, 0x20, 0x00, 0x00,
-  0x58, 0x00, 0xb0, 0x00, 0x00, 0x00,
-  0x01, 0x12, 0x02, 0x24, 0x00, 0x00,
-  0x88, 0x21, 0x10, 0x40, 0x00, 0x00,
-  0x44, 0x02, 0x88, 0x04, 0x00, 0x00,
-  0x29, 0x04, 0x52, 0x08, 0x00, 0x00,
-  0x82, 0xa1, 0x05, 0x40, 0x00, 0x00,
-  0x0a, 0x1a, 0x14, 0x34, 0x00, 0x00,
-  0x11, 0xe0, 0x23, 0xc0, 0x00, 0x00,
-  0x84, 0x05, 0x08, 0x08, 0x00, 0x00,
-  0x86, 0x41, 0x0c, 0x80, 0x00, 0x00,
-  0x00, 0x86, 0x01, 0x0c, 0x00, 0x00,
-  0x44, 0x48, 0x88, 0x90, 0x00, 0x00,
-  0x10, 0x98, 0x21, 0x30, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom30_3[18] = {
-  0xac, 0x93, 0x59, 0x24, 0x00, 0x00,
-  0x55, 0x4a, 0xaa, 0x94, 0x00, 0x00,
-  0x43, 0x36, 0x86, 0x6c, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom30_30[180] = {
-  0x62, 0x22, 0xc4, 0x44, 0x00, 0x00,
-  0x31, 0x10, 0x62, 0x20, 0x00, 0x00,
-  0x58, 0x00, 0xb0, 0x00, 0x00, 0x00,
-  0x01, 0x12, 0x02, 0x24, 0x00, 0x00,
-  0x88, 0x21, 0x10, 0x40, 0x00, 0x00,
-  0x44, 0x02, 0x88, 0x04, 0x00, 0x00,
-  0x29, 0x04, 0x52, 0x08, 0x00, 0x00,
-  0x82, 0xa1, 0x05, 0x40, 0x00, 0x00,
-  0x0a, 0x1a, 0x14, 0x34, 0x00, 0x00,
-  0x11, 0xe0, 0x23, 0xc0, 0x00, 0x00,
-  0x84, 0x05, 0x08, 0x08, 0x00, 0x00,
-  0x86, 0x41, 0x0c, 0x80, 0x00, 0x00,
-  0x00, 0x86, 0x01, 0x0c, 0x00, 0x00,
-  0x44, 0x48, 0x88, 0x90, 0x00, 0x00,
-  0x10, 0x98, 0x21, 0x30, 0x00, 0x00,
-  0x40, 0x82, 0x81, 0x04, 0x00, 0x00,
-  0x15, 0x54, 0x2a, 0xa8, 0x00, 0x00,
-  0x88, 0x13, 0x10, 0x24, 0x00, 0x00,
-  0xc0, 0x11, 0x80, 0x20, 0x00, 0x00,
-  0x80, 0xa1, 0x01, 0x40, 0x00, 0x00,
-  0x01, 0x22, 0x02, 0x44, 0x00, 0x00,
-  0x40, 0x2c, 0x80, 0x58, 0x00, 0x00,
-  0x22, 0x02, 0x44, 0x04, 0x00, 0x00,
-  0x90, 0x05, 0x20, 0x08, 0x00, 0x00,
-  0x12, 0x40, 0x24, 0x80, 0x00, 0x00,
-  0x5d, 0x00, 0xba, 0x00, 0x00, 0x00,
-  0x20, 0x54, 0x40, 0xa8, 0x00, 0x00,
-  0x86, 0x09, 0x0c, 0x10, 0x00, 0x00,
-  0x28, 0x88, 0x51, 0x10, 0x00, 0x00,
-  0x46, 0xf1, 0xef, 0xec, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom30_4[24] = {
-  0x25, 0xaa, 0x4b, 0x54, 0x00, 0x00,
-  0x95, 0x55, 0x2a, 0xa8, 0x00, 0x00,
-  0x1a, 0x6a, 0x34, 0xd4, 0x00, 0x00,
-  0x43, 0xd4, 0x87, 0xa8, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom30_5[30] = {
-  0x64, 0xa2, 0xc9, 0x44, 0x00, 0x00,
-  0x25, 0x54, 0x4a, 0xa8, 0x00, 0x00,
-  0x49, 0x68, 0x92, 0xd0, 0x00, 0x00,
-  0x53, 0x90, 0xa7, 0x20, 0x00, 0x00,
-  0x8e, 0x31, 0x1c, 0x60, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom30_6[36] = {
-  0x62, 0x8a, 0xc5, 0x14, 0x00, 0x00,
-  0x15, 0x54, 0x2a, 0xa8, 0x00, 0x00,
-  0x4c, 0x46, 0x98, 0x8c, 0x00, 0x00,
-  0x52, 0x94, 0xa5, 0x28, 0x00, 0x00,
-  0x23, 0x64, 0x46, 0xc8, 0x00, 0x00,
-  0x8a, 0x59, 0x14, 0xb0, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom30_7[42] = {
-  0x62, 0xa2, 0xc5, 0x44, 0x00, 0x00,
-  0xb1, 0x15, 0x62, 0x28, 0x00, 0x00,
-  0x18, 0x6a, 0x30, 0xd4, 0x00, 0x00,
-  0x44, 0xd4, 0x89, 0xa8, 0x00, 0x00,
-  0x13, 0x64, 0x26, 0xc8, 0x00, 0x00,
-  0x49, 0x1a, 0x92, 0x34, 0x00, 0x00,
-  0x86, 0x8d, 0x0d, 0x18, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom30_8[48] = {
-  0x90, 0x23, 0x20, 0x44, 0x00, 0x00,
-  0x09, 0x50, 0x12, 0xa0, 0x00, 0x00,
-  0x00, 0x6a, 0x00, 0xd4, 0x00, 0x00,
-  0x20, 0x34, 0x40, 0x68, 0x00, 0x00,
-  0x14, 0x44, 0x28, 0x88, 0x00, 0x00,
-  0xc2, 0x11, 0x84, 0x20, 0x00, 0x00,
-  0x00, 0xc6, 0x01, 0x8c, 0x00, 0x00,
-  0x65, 0x80, 0xcb, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom30_9[54] = {
-  0x62, 0x22, 0xc4, 0x44, 0x00, 0x00,
-  0x24, 0x44, 0x48, 0x88, 0x00, 0x00,
-  0xc0, 0x51, 0x80, 0xa0, 0x00, 0x00,
-  0x03, 0x0c, 0x06, 0x18, 0x00, 0x00,
-  0x16, 0x28, 0x2c, 0x50, 0x00, 0x00,
-  0x89, 0x01, 0x12, 0x00, 0x00, 0x00,
-  0x82, 0x91, 0x05, 0x20, 0x00, 0x00,
-  0x08, 0xa4, 0x11, 0x48, 0x00, 0x00,
-  0x90, 0x49, 0x20, 0x90, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom31_1[6] = {
-  0xff, 0xff, 0xff, 0xfe, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom31_10[60] = {
-  0xc0, 0xa0, 0x8a, 0xa2, 0x00, 0x00,
-  0x15, 0x56, 0x21, 0x44, 0x00, 0x00,
-  0x74, 0x40, 0x02, 0x4a, 0x00, 0x00,
-  0x00, 0x9c, 0x16, 0x84, 0x00, 0x00,
-  0x01, 0x2d, 0xb0, 0x40, 0x00, 0x00,
-  0x44, 0x93, 0x05, 0x18, 0x00, 0x00,
-  0x88, 0x50, 0x48, 0x94, 0x00, 0x00,
-  0x20, 0xa4, 0x70, 0x30, 0x00, 0x00,
-  0xaa, 0x04, 0x54, 0x4a, 0x00, 0x00,
-  0x02, 0x63, 0x09, 0x24, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom31_11[66] = {
-  0x62, 0x22, 0xaa, 0xaa, 0x00, 0x00,
-  0xf1, 0x10, 0x54, 0x44, 0x00, 0x00,
-  0x10, 0x0e, 0x62, 0x22, 0x00, 0x00,
-  0x10, 0xb1, 0x06, 0x84, 0x00, 0x00,
-  0x24, 0x24, 0x0d, 0x30, 0x00, 0x00,
-  0x01, 0x12, 0x81, 0xc2, 0x00, 0x00,
-  0x00, 0xc4, 0x58, 0x88, 0x00, 0x00,
-  0x04, 0xa3, 0xb0, 0x50, 0x00, 0x00,
-  0x02, 0x59, 0x25, 0x02, 0x00, 0x00,
-  0x2b, 0x01, 0x08, 0x64, 0x00, 0x00,
-  0x98, 0x40, 0xd0, 0x18, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom31_12[72] = {
-  0x88, 0x91, 0x08, 0x62, 0x00, 0x00,
-  0x40, 0x54, 0x31, 0x44, 0x00, 0x00,
-  0x82, 0x62, 0x9c, 0x02, 0x00, 0x00,
-  0x21, 0xa4, 0x89, 0x90, 0x00, 0x00,
-  0x10, 0x64, 0x1d, 0x20, 0x00, 0x00,
-  0x44, 0x0a, 0x41, 0x98, 0x00, 0x00,
-  0x10, 0xc9, 0x26, 0x80, 0x00, 0x00,
-  0x4d, 0x2a, 0x5a, 0x20, 0x00, 0x00,
-  0x38, 0x02, 0x62, 0x88, 0x00, 0x00,
-  0x17, 0x49, 0x80, 0x46, 0x00, 0x00,
-  0x90, 0x84, 0x22, 0x4a, 0x00, 0x00,
-  0x72, 0x15, 0xd1, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom31_13[78] = {
-  0x62, 0xa2, 0x8a, 0x2a, 0x00, 0x00,
-  0x34, 0x44, 0x44, 0x44, 0x00, 0x00,
-  0x40, 0x4b, 0x2c, 0x18, 0x00, 0x00,
-  0xc4, 0x04, 0x18, 0xa0, 0x00, 0x00,
-  0x08, 0x60, 0xc4, 0x08, 0x00, 0x00,
-  0x94, 0x12, 0x92, 0x0c, 0x00, 0x00,
-  0x88, 0xc0, 0x23, 0x04, 0x00, 0x00,
-  0x21, 0x32, 0x24, 0x70, 0x00, 0x00,
-  0xc1, 0x40, 0x80, 0xe2, 0x00, 0x00,
-  0x10, 0x69, 0x51, 0x14, 0x00, 0x00,
-  0x06, 0x90, 0x11, 0x42, 0x00, 0x00,
-  0x59, 0x01, 0x41, 0x80, 0x00, 0x00,
-  0x0a, 0x0d, 0x8a, 0x20, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom31_14[84] = {
-  0x40, 0x82, 0x8a, 0xa2, 0x00, 0x00,
-  0x15, 0x54, 0x44, 0x14, 0x00, 0x00,
-  0x88, 0x13, 0x09, 0xa0, 0x00, 0x00,
-  0xc0, 0x10, 0x19, 0x14, 0x00, 0x00,
-  0x80, 0xa0, 0x30, 0x0c, 0x00, 0x00,
-  0x01, 0x22, 0x60, 0x06, 0x00, 0x00,
-  0x40, 0x2c, 0xc2, 0x10, 0x00, 0x00,
-  0x22, 0x02, 0x80, 0x22, 0x00, 0x00,
-  0x90, 0x04, 0x20, 0x58, 0x00, 0x00,
-  0x12, 0x40, 0x12, 0xc0, 0x00, 0x00,
-  0x5d, 0x00, 0x01, 0x28, 0x00, 0x00,
-  0x20, 0x54, 0xa4, 0x80, 0x00, 0x00,
-  0x86, 0x09, 0x48, 0x48, 0x00, 0x00,
-  0x28, 0x89, 0x05, 0x10, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom31_15[90] = {
-  0x62, 0x22, 0xaa, 0x22, 0x00, 0x00,
-  0x31, 0x10, 0x44, 0x44, 0x00, 0x00,
-  0x58, 0x00, 0x22, 0x22, 0x00, 0x00,
-  0x01, 0x13, 0x00, 0x8a, 0x00, 0x00,
-  0x88, 0x20, 0x40, 0x34, 0x00, 0x00,
-  0x44, 0x02, 0x10, 0xd0, 0x00, 0x00,
-  0x29, 0x04, 0x45, 0x08, 0x00, 0x00,
-  0x82, 0xa0, 0x90, 0x12, 0x00, 0x00,
-  0x0a, 0x1a, 0x0e, 0x02, 0x00, 0x00,
-  0x11, 0xe1, 0x28, 0x40, 0x00, 0x00,
-  0x84, 0x05, 0x04, 0x0c, 0x00, 0x00,
-  0x86, 0x40, 0xc0, 0x90, 0x00, 0x00,
-  0x00, 0x87, 0x13, 0x00, 0x00, 0x00,
-  0x44, 0x48, 0x01, 0x1c, 0x00, 0x00,
-  0x10, 0x98, 0x30, 0x44, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom31_16[96] = {
-  0x90, 0x22, 0x40, 0xa8, 0x00, 0x00,
-  0x09, 0x50, 0x31, 0x10, 0x00, 0x00,
-  0x00, 0x6b, 0x08, 0x0e, 0x00, 0x00,
-  0x20, 0x34, 0xc0, 0x90, 0x00, 0x00,
-  0x14, 0x44, 0x25, 0x04, 0x00, 0x00,
-  0xc2, 0x11, 0x02, 0x82, 0x00, 0x00,
-  0x00, 0xc6, 0x80, 0xc4, 0x00, 0x00,
-  0x65, 0x80, 0x2c, 0x60, 0x00, 0x00,
-  0x62, 0xa2, 0x8a, 0xa2, 0x00, 0x00,
-  0xb1, 0x14, 0x44, 0x54, 0x00, 0x00,
-  0x18, 0x6b, 0x22, 0x22, 0x00, 0x00,
-  0x44, 0xd4, 0x5c, 0x10, 0x00, 0x00,
-  0x13, 0x64, 0x90, 0x68, 0x00, 0x00,
-  0x49, 0x1b, 0x20, 0x52, 0x00, 0x00,
-  0x86, 0x8c, 0x13, 0x0c, 0x00, 0x00,
-  0x8d, 0x94, 0xa9, 0xe0, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom31_17[102] = {
-  0x90, 0x22, 0x40, 0xa8, 0x00, 0x00,
-  0x09, 0x50, 0x31, 0x10, 0x00, 0x00,
-  0x00, 0x6b, 0x08, 0x0e, 0x00, 0x00,
-  0x20, 0x34, 0xc0, 0x90, 0x00, 0x00,
-  0x14, 0x44, 0x25, 0x04, 0x00, 0x00,
-  0xc2, 0x11, 0x02, 0x82, 0x00, 0x00,
-  0x00, 0xc6, 0x80, 0xc4, 0x00, 0x00,
-  0x65, 0x80, 0x2c, 0x60, 0x00, 0x00,
-  0x62, 0x22, 0xaa, 0xa2, 0x00, 0x00,
-  0x24, 0x44, 0x44, 0x54, 0x00, 0x00,
-  0xc0, 0x50, 0x0b, 0x0a, 0x00, 0x00,
-  0x03, 0x0c, 0x12, 0x94, 0x00, 0x00,
-  0x16, 0x29, 0x08, 0x64, 0x00, 0x00,
-  0x89, 0x01, 0x80, 0x1a, 0x00, 0x00,
-  0x82, 0x90, 0x41, 0x4c, 0x00, 0x00,
-  0x08, 0xa4, 0x34, 0x12, 0x00, 0x00,
-  0x90, 0x48, 0x88, 0xc8, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom31_18[108] = {
-  0x62, 0x22, 0xaa, 0xa2, 0x00, 0x00,
-  0x24, 0x44, 0x44, 0x54, 0x00, 0x00,
-  0xc0, 0x50, 0x0b, 0x0a, 0x00, 0x00,
-  0x03, 0x0c, 0x12, 0x94, 0x00, 0x00,
-  0x16, 0x29, 0x08, 0x64, 0x00, 0x00,
-  0x89, 0x01, 0x80, 0x1a, 0x00, 0x00,
-  0x82, 0x90, 0x41, 0x4c, 0x00, 0x00,
-  0x08, 0xa4, 0x34, 0x12, 0x00, 0x00,
-  0x90, 0x48, 0x88, 0xc8, 0x00, 0x00,
-  0x90, 0x22, 0x40, 0xa8, 0x00, 0x00,
-  0x09, 0x50, 0x31, 0x10, 0x00, 0x00,
-  0x00, 0x6b, 0x08, 0x0e, 0x00, 0x00,
-  0x20, 0x34, 0xc0, 0x90, 0x00, 0x00,
-  0x14, 0x44, 0x25, 0x04, 0x00, 0x00,
-  0xc2, 0x11, 0x02, 0x82, 0x00, 0x00,
-  0x00, 0xc6, 0x80, 0xc4, 0x00, 0x00,
-  0x65, 0x80, 0x2c, 0x60, 0x00, 0x00,
-  0xe3, 0xd1, 0x2e, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom31_19[114] = {
-  0x62, 0x22, 0xaa, 0xa2, 0x00, 0x00,
-  0x24, 0x44, 0x44, 0x54, 0x00, 0x00,
-  0xc0, 0x50, 0x0b, 0x0a, 0x00, 0x00,
-  0x03, 0x0c, 0x12, 0x94, 0x00, 0x00,
-  0x16, 0x29, 0x08, 0x64, 0x00, 0x00,
-  0x89, 0x01, 0x80, 0x1a, 0x00, 0x00,
-  0x82, 0x90, 0x41, 0x4c, 0x00, 0x00,
-  0x08, 0xa4, 0x34, 0x12, 0x00, 0x00,
-  0x90, 0x48, 0x88, 0xc8, 0x00, 0x00,
-  0xc0, 0xa0, 0x8a, 0xa2, 0x00, 0x00,
-  0x15, 0x56, 0x21, 0x44, 0x00, 0x00,
-  0x74, 0x40, 0x02, 0x4a, 0x00, 0x00,
-  0x00, 0x9c, 0x16, 0x84, 0x00, 0x00,
-  0x01, 0x2d, 0xb0, 0x40, 0x00, 0x00,
-  0x44, 0x93, 0x05, 0x18, 0x00, 0x00,
-  0x88, 0x50, 0x48, 0x94, 0x00, 0x00,
-  0x20, 0xa4, 0x70, 0x30, 0x00, 0x00,
-  0xaa, 0x04, 0x54, 0x4a, 0x00, 0x00,
-  0x02, 0x63, 0x09, 0x24, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom31_2[12] = {
-  0xec, 0xeb, 0x5d, 0x5c, 0x00, 0x00,
-  0xbb, 0x9c, 0xf2, 0xf2, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom31_20[120] = {
-  0xc0, 0xa0, 0x8a, 0xa2, 0x00, 0x00,
-  0x15, 0x56, 0x21, 0x44, 0x00, 0x00,
-  0x74, 0x40, 0x02, 0x4a, 0x00, 0x00,
-  0x00, 0x9c, 0x16, 0x84, 0x00, 0x00,
-  0x01, 0x2d, 0xb0, 0x40, 0x00, 0x00,
-  0x44, 0x93, 0x05, 0x18, 0x00, 0x00,
-  0x88, 0x50, 0x48, 0x94, 0x00, 0x00,
-  0x20, 0xa4, 0x70, 0x30, 0x00, 0x00,
-  0xaa, 0x04, 0x54, 0x4a, 0x00, 0x00,
-  0x02, 0x63, 0x09, 0x24, 0x00, 0x00,
-  0x62, 0x22, 0xaa, 0xa2, 0x00, 0x00,
-  0x24, 0x44, 0x44, 0x54, 0x00, 0x00,
-  0xc0, 0x50, 0x0b, 0x0a, 0x00, 0x00,
-  0x03, 0x0c, 0x12, 0x94, 0x00, 0x00,
-  0x16, 0x29, 0x08, 0x64, 0x00, 0x00,
-  0x89, 0x01, 0x80, 0x1a, 0x00, 0x00,
-  0x82, 0x90, 0x41, 0x4c, 0x00, 0x00,
-  0x08, 0xa4, 0x34, 0x12, 0x00, 0x00,
-  0x90, 0x48, 0x88, 0xc8, 0x00, 0x00,
-  0x9a, 0xd4, 0x6a, 0x36, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom31_21[126] = {
-  0xc0, 0xa0, 0x8a, 0xa2, 0x00, 0x00,
-  0x15, 0x56, 0x21, 0x44, 0x00, 0x00,
-  0x74, 0x40, 0x02, 0x4a, 0x00, 0x00,
-  0x00, 0x9c, 0x16, 0x84, 0x00, 0x00,
-  0x01, 0x2d, 0xb0, 0x40, 0x00, 0x00,
-  0x44, 0x93, 0x05, 0x18, 0x00, 0x00,
-  0x88, 0x50, 0x48, 0x94, 0x00, 0x00,
-  0x20, 0xa4, 0x70, 0x30, 0x00, 0x00,
-  0xaa, 0x04, 0x54, 0x4a, 0x00, 0x00,
-  0x02, 0x63, 0x09, 0x24, 0x00, 0x00,
-  0x62, 0x22, 0xaa, 0xaa, 0x00, 0x00,
-  0xf1, 0x10, 0x54, 0x44, 0x00, 0x00,
-  0x10, 0x0e, 0x62, 0x22, 0x00, 0x00,
-  0x10, 0xb1, 0x06, 0x84, 0x00, 0x00,
-  0x24, 0x24, 0x0d, 0x30, 0x00, 0x00,
-  0x01, 0x12, 0x81, 0xc2, 0x00, 0x00,
-  0x00, 0xc4, 0x58, 0x88, 0x00, 0x00,
-  0x04, 0xa3, 0xb0, 0x50, 0x00, 0x00,
-  0x02, 0x59, 0x25, 0x02, 0x00, 0x00,
-  0x2b, 0x01, 0x08, 0x64, 0x00, 0x00,
-  0x98, 0x40, 0xd0, 0x18, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom31_22[132] = {
-  0x62, 0x22, 0xaa, 0xaa, 0x00, 0x00,
-  0xf1, 0x10, 0x54, 0x44, 0x00, 0x00,
-  0x10, 0x0e, 0x62, 0x22, 0x00, 0x00,
-  0x10, 0xb1, 0x06, 0x84, 0x00, 0x00,
-  0x24, 0x24, 0x0d, 0x30, 0x00, 0x00,
-  0x01, 0x12, 0x81, 0xc2, 0x00, 0x00,
-  0x00, 0xc4, 0x58, 0x88, 0x00, 0x00,
-  0x04, 0xa3, 0xb0, 0x50, 0x00, 0x00,
-  0x02, 0x59, 0x25, 0x02, 0x00, 0x00,
-  0x2b, 0x01, 0x08, 0x64, 0x00, 0x00,
-  0x98, 0x40, 0xd0, 0x18, 0x00, 0x00,
-  0xc0, 0xa0, 0x8a, 0xa2, 0x00, 0x00,
-  0x15, 0x56, 0x21, 0x44, 0x00, 0x00,
-  0x74, 0x40, 0x02, 0x4a, 0x00, 0x00,
-  0x00, 0x9c, 0x16, 0x84, 0x00, 0x00,
-  0x01, 0x2d, 0xb0, 0x40, 0x00, 0x00,
-  0x44, 0x93, 0x05, 0x18, 0x00, 0x00,
-  0x88, 0x50, 0x48, 0x94, 0x00, 0x00,
-  0x20, 0xa4, 0x70, 0x30, 0x00, 0x00,
-  0xaa, 0x04, 0x54, 0x4a, 0x00, 0x00,
-  0x02, 0x63, 0x09, 0x24, 0x00, 0x00,
-  0x32, 0x23, 0x73, 0x8e, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom31_23[138] = {
-  0x62, 0x22, 0xaa, 0xaa, 0x00, 0x00,
-  0xf1, 0x10, 0x54, 0x44, 0x00, 0x00,
-  0x10, 0x0e, 0x62, 0x22, 0x00, 0x00,
-  0x10, 0xb1, 0x06, 0x84, 0x00, 0x00,
-  0x24, 0x24, 0x0d, 0x30, 0x00, 0x00,
-  0x01, 0x12, 0x81, 0xc2, 0x00, 0x00,
-  0x00, 0xc4, 0x58, 0x88, 0x00, 0x00,
-  0x04, 0xa3, 0xb0, 0x50, 0x00, 0x00,
-  0x02, 0x59, 0x25, 0x02, 0x00, 0x00,
-  0x2b, 0x01, 0x08, 0x64, 0x00, 0x00,
-  0x98, 0x40, 0xd0, 0x18, 0x00, 0x00,
-  0x88, 0x91, 0x08, 0x62, 0x00, 0x00,
-  0x40, 0x54, 0x31, 0x44, 0x00, 0x00,
-  0x82, 0x62, 0x9c, 0x02, 0x00, 0x00,
-  0x21, 0xa4, 0x89, 0x90, 0x00, 0x00,
-  0x10, 0x64, 0x1d, 0x20, 0x00, 0x00,
-  0x44, 0x0a, 0x41, 0x98, 0x00, 0x00,
-  0x10, 0xc9, 0x26, 0x80, 0x00, 0x00,
-  0x4d, 0x2a, 0x5a, 0x20, 0x00, 0x00,
-  0x38, 0x02, 0x62, 0x88, 0x00, 0x00,
-  0x17, 0x49, 0x80, 0x46, 0x00, 0x00,
-  0x90, 0x84, 0x22, 0x4a, 0x00, 0x00,
-  0x72, 0x15, 0xd1, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom31_24[144] = {
-  0x88, 0x91, 0x08, 0x62, 0x00, 0x00,
-  0x40, 0x54, 0x31, 0x44, 0x00, 0x00,
-  0x82, 0x62, 0x9c, 0x02, 0x00, 0x00,
-  0x21, 0xa4, 0x89, 0x90, 0x00, 0x00,
-  0x10, 0x64, 0x1d, 0x20, 0x00, 0x00,
-  0x44, 0x0a, 0x41, 0x98, 0x00, 0x00,
-  0x10, 0xc9, 0x26, 0x80, 0x00, 0x00,
-  0x4d, 0x2a, 0x5a, 0x20, 0x00, 0x00,
-  0x38, 0x02, 0x62, 0x88, 0x00, 0x00,
-  0x17, 0x49, 0x80, 0x46, 0x00, 0x00,
-  0x90, 0x84, 0x22, 0x4a, 0x00, 0x00,
-  0x72, 0x15, 0xd1, 0x00, 0x00, 0x00,
-  0x62, 0x22, 0xaa, 0xaa, 0x00, 0x00,
-  0xf1, 0x10, 0x54, 0x44, 0x00, 0x00,
-  0x10, 0x0e, 0x62, 0x22, 0x00, 0x00,
-  0x10, 0xb1, 0x06, 0x84, 0x00, 0x00,
-  0x24, 0x24, 0x0d, 0x30, 0x00, 0x00,
-  0x01, 0x12, 0x81, 0xc2, 0x00, 0x00,
-  0x00, 0xc4, 0x58, 0x88, 0x00, 0x00,
-  0x04, 0xa3, 0xb0, 0x50, 0x00, 0x00,
-  0x02, 0x59, 0x25, 0x02, 0x00, 0x00,
-  0x2b, 0x01, 0x08, 0x64, 0x00, 0x00,
-  0x98, 0x40, 0xd0, 0x18, 0x00, 0x00,
-  0xf0, 0xdf, 0x91, 0xb6, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom31_25[150] = {
-  0x88, 0x91, 0x08, 0x62, 0x00, 0x00,
-  0x40, 0x54, 0x31, 0x44, 0x00, 0x00,
-  0x82, 0x62, 0x9c, 0x02, 0x00, 0x00,
-  0x21, 0xa4, 0x89, 0x90, 0x00, 0x00,
-  0x10, 0x64, 0x1d, 0x20, 0x00, 0x00,
-  0x44, 0x0a, 0x41, 0x98, 0x00, 0x00,
-  0x10, 0xc9, 0x26, 0x80, 0x00, 0x00,
-  0x4d, 0x2a, 0x5a, 0x20, 0x00, 0x00,
-  0x38, 0x02, 0x62, 0x88, 0x00, 0x00,
-  0x17, 0x49, 0x80, 0x46, 0x00, 0x00,
-  0x90, 0x84, 0x22, 0x4a, 0x00, 0x00,
-  0x72, 0x15, 0xd1, 0x00, 0x00, 0x00,
-  0x62, 0xa2, 0x8a, 0x2a, 0x00, 0x00,
-  0x34, 0x44, 0x44, 0x44, 0x00, 0x00,
-  0x40, 0x4b, 0x2c, 0x18, 0x00, 0x00,
-  0xc4, 0x04, 0x18, 0xa0, 0x00, 0x00,
-  0x08, 0x60, 0xc4, 0x08, 0x00, 0x00,
-  0x94, 0x12, 0x92, 0x0c, 0x00, 0x00,
-  0x88, 0xc0, 0x23, 0x04, 0x00, 0x00,
-  0x21, 0x32, 0x24, 0x70, 0x00, 0x00,
-  0xc1, 0x40, 0x80, 0xe2, 0x00, 0x00,
-  0x10, 0x69, 0x51, 0x14, 0x00, 0x00,
-  0x06, 0x90, 0x11, 0x42, 0x00, 0x00,
-  0x59, 0x01, 0x41, 0x80, 0x00, 0x00,
-  0x0a, 0x0d, 0x8a, 0x20, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom31_26[156] = {
-  0x62, 0xa2, 0x8a, 0x2a, 0x00, 0x00,
-  0x34, 0x44, 0x44, 0x44, 0x00, 0x00,
-  0x40, 0x4b, 0x2c, 0x18, 0x00, 0x00,
-  0xc4, 0x04, 0x18, 0xa0, 0x00, 0x00,
-  0x08, 0x60, 0xc4, 0x08, 0x00, 0x00,
-  0x94, 0x12, 0x92, 0x0c, 0x00, 0x00,
-  0x88, 0xc0, 0x23, 0x04, 0x00, 0x00,
-  0x21, 0x32, 0x24, 0x70, 0x00, 0x00,
-  0xc1, 0x40, 0x80, 0xe2, 0x00, 0x00,
-  0x10, 0x69, 0x51, 0x14, 0x00, 0x00,
-  0x06, 0x90, 0x11, 0x42, 0x00, 0x00,
-  0x59, 0x01, 0x41, 0x80, 0x00, 0x00,
-  0x0a, 0x0d, 0x8a, 0x20, 0x00, 0x00,
-  0x88, 0x91, 0x08, 0x62, 0x00, 0x00,
-  0x40, 0x54, 0x31, 0x44, 0x00, 0x00,
-  0x82, 0x62, 0x9c, 0x02, 0x00, 0x00,
-  0x21, 0xa4, 0x89, 0x90, 0x00, 0x00,
-  0x10, 0x64, 0x1d, 0x20, 0x00, 0x00,
-  0x44, 0x0a, 0x41, 0x98, 0x00, 0x00,
-  0x10, 0xc9, 0x26, 0x80, 0x00, 0x00,
-  0x4d, 0x2a, 0x5a, 0x20, 0x00, 0x00,
-  0x38, 0x02, 0x62, 0x88, 0x00, 0x00,
-  0x17, 0x49, 0x80, 0x46, 0x00, 0x00,
-  0x90, 0x84, 0x22, 0x4a, 0x00, 0x00,
-  0x72, 0x15, 0xd1, 0x00, 0x00, 0x00,
-  0xc5, 0x75, 0x48, 0xba, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom31_27[162] = {
-  0x62, 0xa2, 0x8a, 0x2a, 0x00, 0x00,
-  0x34, 0x44, 0x44, 0x44, 0x00, 0x00,
-  0x40, 0x4b, 0x2c, 0x18, 0x00, 0x00,
-  0xc4, 0x04, 0x18, 0xa0, 0x00, 0x00,
-  0x08, 0x60, 0xc4, 0x08, 0x00, 0x00,
-  0x94, 0x12, 0x92, 0x0c, 0x00, 0x00,
-  0x88, 0xc0, 0x23, 0x04, 0x00, 0x00,
-  0x21, 0x32, 0x24, 0x70, 0x00, 0x00,
-  0xc1, 0x40, 0x80, 0xe2, 0x00, 0x00,
-  0x10, 0x69, 0x51, 0x14, 0x00, 0x00,
-  0x06, 0x90, 0x11, 0x42, 0x00, 0x00,
-  0x59, 0x01, 0x41, 0x80, 0x00, 0x00,
-  0x0a, 0x0d, 0x8a, 0x20, 0x00, 0x00,
-  0x40, 0x82, 0x8a, 0xa2, 0x00, 0x00,
-  0x15, 0x54, 0x44, 0x14, 0x00, 0x00,
-  0x88, 0x13, 0x09, 0xa0, 0x00, 0x00,
-  0xc0, 0x10, 0x19, 0x14, 0x00, 0x00,
-  0x80, 0xa0, 0x30, 0x0c, 0x00, 0x00,
-  0x01, 0x22, 0x60, 0x06, 0x00, 0x00,
-  0x40, 0x2c, 0xc2, 0x10, 0x00, 0x00,
-  0x22, 0x02, 0x80, 0x22, 0x00, 0x00,
-  0x90, 0x04, 0x20, 0x58, 0x00, 0x00,
-  0x12, 0x40, 0x12, 0xc0, 0x00, 0x00,
-  0x5d, 0x00, 0x01, 0x28, 0x00, 0x00,
-  0x20, 0x54, 0xa4, 0x80, 0x00, 0x00,
-  0x86, 0x09, 0x48, 0x48, 0x00, 0x00,
-  0x28, 0x89, 0x05, 0x10, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom31_28[168] = {
-  0x40, 0x82, 0x8a, 0xa2, 0x00, 0x00,
-  0x15, 0x54, 0x44, 0x14, 0x00, 0x00,
-  0x88, 0x13, 0x09, 0xa0, 0x00, 0x00,
-  0xc0, 0x10, 0x19, 0x14, 0x00, 0x00,
-  0x80, 0xa0, 0x30, 0x0c, 0x00, 0x00,
-  0x01, 0x22, 0x60, 0x06, 0x00, 0x00,
-  0x40, 0x2c, 0xc2, 0x10, 0x00, 0x00,
-  0x22, 0x02, 0x80, 0x22, 0x00, 0x00,
-  0x90, 0x04, 0x20, 0x58, 0x00, 0x00,
-  0x12, 0x40, 0x12, 0xc0, 0x00, 0x00,
-  0x5d, 0x00, 0x01, 0x28, 0x00, 0x00,
-  0x20, 0x54, 0xa4, 0x80, 0x00, 0x00,
-  0x86, 0x09, 0x48, 0x48, 0x00, 0x00,
-  0x28, 0x89, 0x05, 0x10, 0x00, 0x00,
-  0x62, 0xa2, 0x8a, 0x2a, 0x00, 0x00,
-  0x34, 0x44, 0x44, 0x44, 0x00, 0x00,
-  0x40, 0x4b, 0x2c, 0x18, 0x00, 0x00,
-  0xc4, 0x04, 0x18, 0xa0, 0x00, 0x00,
-  0x08, 0x60, 0xc4, 0x08, 0x00, 0x00,
-  0x94, 0x12, 0x92, 0x0c, 0x00, 0x00,
-  0x88, 0xc0, 0x23, 0x04, 0x00, 0x00,
-  0x21, 0x32, 0x24, 0x70, 0x00, 0x00,
-  0xc1, 0x40, 0x80, 0xe2, 0x00, 0x00,
-  0x10, 0x69, 0x51, 0x14, 0x00, 0x00,
-  0x06, 0x90, 0x11, 0x42, 0x00, 0x00,
-  0x59, 0x01, 0x41, 0x80, 0x00, 0x00,
-  0x0a, 0x0d, 0x8a, 0x20, 0x00, 0x00,
-  0xbc, 0x0d, 0xca, 0x28, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom31_29[174] = {
-  0x40, 0x82, 0x8a, 0xa2, 0x00, 0x00,
-  0x15, 0x54, 0x44, 0x14, 0x00, 0x00,
-  0x88, 0x13, 0x09, 0xa0, 0x00, 0x00,
-  0xc0, 0x10, 0x19, 0x14, 0x00, 0x00,
-  0x80, 0xa0, 0x30, 0x0c, 0x00, 0x00,
-  0x01, 0x22, 0x60, 0x06, 0x00, 0x00,
-  0x40, 0x2c, 0xc2, 0x10, 0x00, 0x00,
-  0x22, 0x02, 0x80, 0x22, 0x00, 0x00,
-  0x90, 0x04, 0x20, 0x58, 0x00, 0x00,
-  0x12, 0x40, 0x12, 0xc0, 0x00, 0x00,
-  0x5d, 0x00, 0x01, 0x28, 0x00, 0x00,
-  0x20, 0x54, 0xa4, 0x80, 0x00, 0x00,
-  0x86, 0x09, 0x48, 0x48, 0x00, 0x00,
-  0x28, 0x89, 0x05, 0x10, 0x00, 0x00,
-  0x62, 0x22, 0xaa, 0x22, 0x00, 0x00,
-  0x31, 0x10, 0x44, 0x44, 0x00, 0x00,
-  0x58, 0x00, 0x22, 0x22, 0x00, 0x00,
-  0x01, 0x13, 0x00, 0x8a, 0x00, 0x00,
-  0x88, 0x20, 0x40, 0x34, 0x00, 0x00,
-  0x44, 0x02, 0x10, 0xd0, 0x00, 0x00,
-  0x29, 0x04, 0x45, 0x08, 0x00, 0x00,
-  0x82, 0xa0, 0x90, 0x12, 0x00, 0x00,
-  0x0a, 0x1a, 0x0e, 0x02, 0x00, 0x00,
-  0x11, 0xe1, 0x28, 0x40, 0x00, 0x00,
-  0x84, 0x05, 0x04, 0x0c, 0x00, 0x00,
-  0x86, 0x40, 0xc0, 0x90, 0x00, 0x00,
-  0x00, 0x87, 0x13, 0x00, 0x00, 0x00,
-  0x44, 0x48, 0x01, 0x1c, 0x00, 0x00,
-  0x10, 0x98, 0x30, 0x44, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom31_3[18] = {
-  0xac, 0x93, 0x5a, 0x5a, 0x00, 0x00,
-  0x55, 0x4a, 0xec, 0x6c, 0x00, 0x00,
-  0x43, 0x36, 0x4d, 0xb6, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom31_30[180] = {
-  0x62, 0x22, 0xaa, 0x22, 0x00, 0x00,
-  0x31, 0x10, 0x44, 0x44, 0x00, 0x00,
-  0x58, 0x00, 0x22, 0x22, 0x00, 0x00,
-  0x01, 0x13, 0x00, 0x8a, 0x00, 0x00,
-  0x88, 0x20, 0x40, 0x34, 0x00, 0x00,
-  0x44, 0x02, 0x10, 0xd0, 0x00, 0x00,
-  0x29, 0x04, 0x45, 0x08, 0x00, 0x00,
-  0x82, 0xa0, 0x90, 0x12, 0x00, 0x00,
-  0x0a, 0x1a, 0x0e, 0x02, 0x00, 0x00,
-  0x11, 0xe1, 0x28, 0x40, 0x00, 0x00,
-  0x84, 0x05, 0x04, 0x0c, 0x00, 0x00,
-  0x86, 0x40, 0xc0, 0x90, 0x00, 0x00,
-  0x00, 0x87, 0x13, 0x00, 0x00, 0x00,
-  0x44, 0x48, 0x01, 0x1c, 0x00, 0x00,
-  0x10, 0x98, 0x30, 0x44, 0x00, 0x00,
-  0x40, 0x82, 0x8a, 0xa2, 0x00, 0x00,
-  0x15, 0x54, 0x44, 0x14, 0x00, 0x00,
-  0x88, 0x13, 0x09, 0xa0, 0x00, 0x00,
-  0xc0, 0x10, 0x19, 0x14, 0x00, 0x00,
-  0x80, 0xa0, 0x30, 0x0c, 0x00, 0x00,
-  0x01, 0x22, 0x60, 0x06, 0x00, 0x00,
-  0x40, 0x2c, 0xc2, 0x10, 0x00, 0x00,
-  0x22, 0x02, 0x80, 0x22, 0x00, 0x00,
-  0x90, 0x04, 0x20, 0x58, 0x00, 0x00,
-  0x12, 0x40, 0x12, 0xc0, 0x00, 0x00,
-  0x5d, 0x00, 0x01, 0x28, 0x00, 0x00,
-  0x20, 0x54, 0xa4, 0x80, 0x00, 0x00,
-  0x86, 0x09, 0x48, 0x48, 0x00, 0x00,
-  0x28, 0x89, 0x05, 0x10, 0x00, 0x00,
-  0xe1, 0x4f, 0xe0, 0x80, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom31_31[186] = {
-  0x62, 0x22, 0xaa, 0x22, 0x00, 0x00,
-  0x31, 0x10, 0x44, 0x44, 0x00, 0x00,
-  0x58, 0x00, 0x22, 0x22, 0x00, 0x00,
-  0x01, 0x13, 0x00, 0x8a, 0x00, 0x00,
-  0x88, 0x20, 0x40, 0x34, 0x00, 0x00,
-  0x44, 0x02, 0x10, 0xd0, 0x00, 0x00,
-  0x29, 0x04, 0x45, 0x08, 0x00, 0x00,
-  0x82, 0xa0, 0x90, 0x12, 0x00, 0x00,
-  0x0a, 0x1a, 0x0e, 0x02, 0x00, 0x00,
-  0x11, 0xe1, 0x28, 0x40, 0x00, 0x00,
-  0x84, 0x05, 0x04, 0x0c, 0x00, 0x00,
-  0x86, 0x40, 0xc0, 0x90, 0x00, 0x00,
-  0x00, 0x87, 0x13, 0x00, 0x00, 0x00,
-  0x44, 0x48, 0x01, 0x1c, 0x00, 0x00,
-  0x10, 0x98, 0x30, 0x44, 0x00, 0x00,
-  0x62, 0x23, 0x48, 0x20, 0x00, 0x00,
-  0x31, 0x10, 0x02, 0x54, 0x00, 0x00,
-  0x58, 0x00, 0x0c, 0x84, 0x00, 0x00,
-  0x01, 0x12, 0x10, 0xd0, 0x00, 0x00,
-  0x88, 0x21, 0x03, 0x20, 0x00, 0x00,
-  0x44, 0x02, 0x01, 0xe0, 0x00, 0x00,
-  0x29, 0x04, 0xa0, 0x0a, 0x00, 0x00,
-  0x82, 0xa0, 0x40, 0xa2, 0x00, 0x00,
-  0x0a, 0x1a, 0x86, 0x10, 0x00, 0x00,
-  0x11, 0xe0, 0xd1, 0x00, 0x00, 0x00,
-  0x84, 0x05, 0x00, 0x16, 0x00, 0x00,
-  0x86, 0x40, 0x20, 0x98, 0x00, 0x00,
-  0x00, 0x86, 0x24, 0x60, 0x00, 0x00,
-  0x44, 0x48, 0x81, 0x0a, 0x00, 0x00,
-  0x10, 0x98, 0x1c, 0x08, 0x00, 0x00,
-  0x87, 0x74, 0x30, 0x24, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom31_4[24] = {
-  0x25, 0xaa, 0xaa, 0xaa, 0x00, 0x00,
-  0x95, 0x55, 0x55, 0x54, 0x00, 0x00,
-  0x1a, 0x6a, 0x6a, 0x6a, 0x00, 0x00,
-  0x43, 0xd5, 0x95, 0x94, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom31_5[30] = {
-  0x64, 0xa2, 0xaa, 0xaa, 0x00, 0x00,
-  0x25, 0x54, 0x54, 0x54, 0x00, 0x00,
-  0x49, 0x68, 0x48, 0x4a, 0x00, 0x00,
-  0x53, 0x91, 0x09, 0x90, 0x00, 0x00,
-  0x8e, 0x30, 0x21, 0x6c, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom31_6[36] = {
-  0x62, 0x8a, 0xa2, 0xa2, 0x00, 0x00,
-  0x15, 0x54, 0x14, 0x54, 0x00, 0x00,
-  0x4c, 0x47, 0x44, 0x2a, 0x00, 0x00,
-  0x52, 0x95, 0x08, 0x94, 0x00, 0x00,
-  0x23, 0x64, 0x61, 0x24, 0x00, 0x00,
-  0x8a, 0x58, 0x09, 0x58, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom31_7[42] = {
-  0x62, 0xa2, 0x8a, 0xa2, 0x00, 0x00,
-  0xb1, 0x14, 0x44, 0x54, 0x00, 0x00,
-  0x18, 0x6b, 0x22, 0x22, 0x00, 0x00,
-  0x44, 0xd4, 0x5c, 0x10, 0x00, 0x00,
-  0x13, 0x64, 0x90, 0x68, 0x00, 0x00,
-  0x49, 0x1b, 0x20, 0x52, 0x00, 0x00,
-  0x86, 0x8c, 0x13, 0x0c, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom31_8[48] = {
-  0x90, 0x22, 0x40, 0xa8, 0x00, 0x00,
-  0x09, 0x50, 0x31, 0x10, 0x00, 0x00,
-  0x00, 0x6b, 0x08, 0x0e, 0x00, 0x00,
-  0x20, 0x34, 0xc0, 0x90, 0x00, 0x00,
-  0x14, 0x44, 0x25, 0x04, 0x00, 0x00,
-  0xc2, 0x11, 0x02, 0x82, 0x00, 0x00,
-  0x00, 0xc6, 0x80, 0xc4, 0x00, 0x00,
-  0x65, 0x80, 0x2c, 0x60, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom31_9[54] = {
-  0x62, 0x22, 0xaa, 0xa2, 0x00, 0x00,
-  0x24, 0x44, 0x44, 0x54, 0x00, 0x00,
-  0xc0, 0x50, 0x0b, 0x0a, 0x00, 0x00,
-  0x03, 0x0c, 0x12, 0x94, 0x00, 0x00,
-  0x16, 0x29, 0x08, 0x64, 0x00, 0x00,
-  0x89, 0x01, 0x80, 0x1a, 0x00, 0x00,
-  0x82, 0x90, 0x41, 0x4c, 0x00, 0x00,
-  0x08, 0xa4, 0x34, 0x12, 0x00, 0x00,
-  0x90, 0x48, 0x88, 0xc8, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom32_1[6] = {
-  0xff, 0xff, 0xff, 0xff, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom32_10[60] = {
-  0x45, 0x51, 0x45, 0x51, 0x00, 0x00,
-  0x10, 0xa2, 0x10, 0xa2, 0x00, 0x00,
-  0x01, 0x25, 0x01, 0x25, 0x00, 0x00,
-  0x0b, 0x42, 0x0b, 0x42, 0x00, 0x00,
-  0xd8, 0x20, 0xd8, 0x20, 0x00, 0x00,
-  0x82, 0x8c, 0x82, 0x8c, 0x00, 0x00,
-  0x24, 0x4a, 0x24, 0x4a, 0x00, 0x00,
-  0x38, 0x18, 0x38, 0x18, 0x00, 0x00,
-  0x2a, 0x25, 0x2a, 0x25, 0x00, 0x00,
-  0x84, 0x92, 0x84, 0x92, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom32_11[66] = {
-  0x55, 0x55, 0x55, 0x55, 0x00, 0x00,
-  0x2a, 0x22, 0x2a, 0x22, 0x00, 0x00,
-  0x31, 0x11, 0x31, 0x11, 0x00, 0x00,
-  0x83, 0x42, 0x83, 0x42, 0x00, 0x00,
-  0x06, 0x98, 0x06, 0x98, 0x00, 0x00,
-  0x40, 0xe1, 0x40, 0xe1, 0x00, 0x00,
-  0x2c, 0x44, 0x2c, 0x44, 0x00, 0x00,
-  0xd8, 0x28, 0xd8, 0x28, 0x00, 0x00,
-  0x92, 0x81, 0x92, 0x81, 0x00, 0x00,
-  0x84, 0x32, 0x84, 0x32, 0x00, 0x00,
-  0x68, 0x0c, 0x68, 0x0c, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom32_12[72] = {
-  0x84, 0x31, 0x84, 0x31, 0x00, 0x00,
-  0x18, 0xa2, 0x18, 0xa2, 0x00, 0x00,
-  0x4e, 0x01, 0x4e, 0x01, 0x00, 0x00,
-  0x44, 0xc8, 0x44, 0xc8, 0x00, 0x00,
-  0x0e, 0x90, 0x0e, 0x90, 0x00, 0x00,
-  0x20, 0xcc, 0x20, 0xcc, 0x00, 0x00,
-  0x93, 0x40, 0x93, 0x40, 0x00, 0x00,
-  0x2d, 0x10, 0x2d, 0x10, 0x00, 0x00,
-  0x31, 0x44, 0x31, 0x44, 0x00, 0x00,
-  0xc0, 0x23, 0xc0, 0x23, 0x00, 0x00,
-  0x11, 0x25, 0x11, 0x25, 0x00, 0x00,
-  0xe8, 0x80, 0xe8, 0x80, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom32_13[78] = {
-  0x45, 0x15, 0x45, 0x15, 0x00, 0x00,
-  0x22, 0x22, 0x22, 0x22, 0x00, 0x00,
-  0x96, 0x0c, 0x96, 0x0c, 0x00, 0x00,
-  0x0c, 0x50, 0x0c, 0x50, 0x00, 0x00,
-  0x62, 0x04, 0x62, 0x04, 0x00, 0x00,
-  0x49, 0x06, 0x49, 0x06, 0x00, 0x00,
-  0x11, 0x82, 0x11, 0x82, 0x00, 0x00,
-  0x12, 0x38, 0x12, 0x38, 0x00, 0x00,
-  0x40, 0x71, 0x40, 0x71, 0x00, 0x00,
-  0xa8, 0x8a, 0xa8, 0x8a, 0x00, 0x00,
-  0x08, 0xa1, 0x08, 0xa1, 0x00, 0x00,
-  0xa0, 0xc0, 0xa0, 0xc0, 0x00, 0x00,
-  0xc5, 0x10, 0xc5, 0x10, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom32_14[84] = {
-  0x45, 0x51, 0x45, 0x51, 0x00, 0x00,
-  0x22, 0x0a, 0x22, 0x0a, 0x00, 0x00,
-  0x84, 0xd0, 0x84, 0xd0, 0x00, 0x00,
-  0x0c, 0x8a, 0x0c, 0x8a, 0x00, 0x00,
-  0x18, 0x06, 0x18, 0x06, 0x00, 0x00,
-  0x30, 0x03, 0x30, 0x03, 0x00, 0x00,
-  0x61, 0x08, 0x61, 0x08, 0x00, 0x00,
-  0x40, 0x11, 0x40, 0x11, 0x00, 0x00,
-  0x10, 0x2c, 0x10, 0x2c, 0x00, 0x00,
-  0x09, 0x60, 0x09, 0x60, 0x00, 0x00,
-  0x00, 0x94, 0x00, 0x94, 0x00, 0x00,
-  0x52, 0x40, 0x52, 0x40, 0x00, 0x00,
-  0xa4, 0x24, 0xa4, 0x24, 0x00, 0x00,
-  0x82, 0x88, 0x82, 0x88, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom32_15[90] = {
-  0x55, 0x11, 0x55, 0x11, 0x00, 0x00,
-  0x22, 0x22, 0x22, 0x22, 0x00, 0x00,
-  0x11, 0x11, 0x11, 0x11, 0x00, 0x00,
-  0x80, 0x45, 0x80, 0x45, 0x00, 0x00,
-  0x20, 0x1a, 0x20, 0x1a, 0x00, 0x00,
-  0x08, 0x68, 0x08, 0x68, 0x00, 0x00,
-  0x22, 0x84, 0x22, 0x84, 0x00, 0x00,
-  0x48, 0x09, 0x48, 0x09, 0x00, 0x00,
-  0x07, 0x01, 0x07, 0x01, 0x00, 0x00,
-  0x94, 0x20, 0x94, 0x20, 0x00, 0x00,
-  0x82, 0x06, 0x82, 0x06, 0x00, 0x00,
-  0x60, 0x48, 0x60, 0x48, 0x00, 0x00,
-  0x89, 0x80, 0x89, 0x80, 0x00, 0x00,
-  0x00, 0x8e, 0x00, 0x8e, 0x00, 0x00,
-  0x18, 0x22, 0x18, 0x22, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom32_16[96] = {
-  0xa4, 0x10, 0xa4, 0x10, 0x00, 0x00,
-  0x01, 0x2a, 0x01, 0x2a, 0x00, 0x00,
-  0x06, 0x42, 0x06, 0x42, 0x00, 0x00,
-  0x08, 0x68, 0x08, 0x68, 0x00, 0x00,
-  0x81, 0x90, 0x81, 0x90, 0x00, 0x00,
-  0x00, 0xf0, 0x00, 0xf0, 0x00, 0x00,
-  0x50, 0x05, 0x50, 0x05, 0x00, 0x00,
-  0x20, 0x51, 0x20, 0x51, 0x00, 0x00,
-  0x43, 0x08, 0x43, 0x08, 0x00, 0x00,
-  0x68, 0x80, 0x68, 0x80, 0x00, 0x00,
-  0x80, 0x0b, 0x80, 0x0b, 0x00, 0x00,
-  0x10, 0x4c, 0x10, 0x4c, 0x00, 0x00,
-  0x12, 0x30, 0x12, 0x30, 0x00, 0x00,
-  0x40, 0x85, 0x40, 0x85, 0x00, 0x00,
-  0x0e, 0x04, 0x0e, 0x04, 0x00, 0x00,
-  0x18, 0x12, 0x18, 0x12, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom32_17[102] = {
-  0x20, 0x54, 0x20, 0x54, 0x00, 0x00,
-  0x18, 0x88, 0x18, 0x88, 0x00, 0x00,
-  0x84, 0x07, 0x84, 0x07, 0x00, 0x00,
-  0x60, 0x48, 0x60, 0x48, 0x00, 0x00,
-  0x12, 0x82, 0x12, 0x82, 0x00, 0x00,
-  0x81, 0x41, 0x81, 0x41, 0x00, 0x00,
-  0x40, 0x62, 0x40, 0x62, 0x00, 0x00,
-  0x16, 0x30, 0x16, 0x30, 0x00, 0x00,
-  0x55, 0x51, 0x55, 0x51, 0x00, 0x00,
-  0x22, 0x2a, 0x22, 0x2a, 0x00, 0x00,
-  0x05, 0x85, 0x05, 0x85, 0x00, 0x00,
-  0x09, 0x4a, 0x09, 0x4a, 0x00, 0x00,
-  0x84, 0x32, 0x84, 0x32, 0x00, 0x00,
-  0xc0, 0x0d, 0xc0, 0x0d, 0x00, 0x00,
-  0x20, 0xa6, 0x20, 0xa6, 0x00, 0x00,
-  0x1a, 0x09, 0x1a, 0x09, 0x00, 0x00,
-  0x44, 0x64, 0x44, 0x64, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom32_18[108] = {
-  0x55, 0x51, 0x55, 0x51, 0x00, 0x00,
-  0x22, 0x2a, 0x22, 0x2a, 0x00, 0x00,
-  0x05, 0x85, 0x05, 0x85, 0x00, 0x00,
-  0x09, 0x4a, 0x09, 0x4a, 0x00, 0x00,
-  0x84, 0x32, 0x84, 0x32, 0x00, 0x00,
-  0xc0, 0x0d, 0xc0, 0x0d, 0x00, 0x00,
-  0x20, 0xa6, 0x20, 0xa6, 0x00, 0x00,
-  0x1a, 0x09, 0x1a, 0x09, 0x00, 0x00,
-  0x44, 0x64, 0x44, 0x64, 0x00, 0x00,
-  0x20, 0x54, 0x20, 0x54, 0x00, 0x00,
-  0x18, 0x88, 0x18, 0x88, 0x00, 0x00,
-  0x84, 0x07, 0x84, 0x07, 0x00, 0x00,
-  0x60, 0x48, 0x60, 0x48, 0x00, 0x00,
-  0x12, 0x82, 0x12, 0x82, 0x00, 0x00,
-  0x81, 0x41, 0x81, 0x41, 0x00, 0x00,
-  0x40, 0x62, 0x40, 0x62, 0x00, 0x00,
-  0x16, 0x30, 0x16, 0x30, 0x00, 0x00,
-  0x1e, 0xb2, 0xd8, 0x53, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom32_19[114] = {
-  0x55, 0x51, 0x55, 0x51, 0x00, 0x00,
-  0x22, 0x2a, 0x22, 0x2a, 0x00, 0x00,
-  0x05, 0x85, 0x05, 0x85, 0x00, 0x00,
-  0x09, 0x4a, 0x09, 0x4a, 0x00, 0x00,
-  0x84, 0x32, 0x84, 0x32, 0x00, 0x00,
-  0xc0, 0x0d, 0xc0, 0x0d, 0x00, 0x00,
-  0x20, 0xa6, 0x20, 0xa6, 0x00, 0x00,
-  0x1a, 0x09, 0x1a, 0x09, 0x00, 0x00,
-  0x44, 0x64, 0x44, 0x64, 0x00, 0x00,
-  0x45, 0x51, 0x45, 0x51, 0x00, 0x00,
-  0x10, 0xa2, 0x10, 0xa2, 0x00, 0x00,
-  0x01, 0x25, 0x01, 0x25, 0x00, 0x00,
-  0x0b, 0x42, 0x0b, 0x42, 0x00, 0x00,
-  0xd8, 0x20, 0xd8, 0x20, 0x00, 0x00,
-  0x82, 0x8c, 0x82, 0x8c, 0x00, 0x00,
-  0x24, 0x4a, 0x24, 0x4a, 0x00, 0x00,
-  0x38, 0x18, 0x38, 0x18, 0x00, 0x00,
-  0x2a, 0x25, 0x2a, 0x25, 0x00, 0x00,
-  0x84, 0x92, 0x84, 0x92, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom32_2[12] = {
-  0xae, 0xae, 0xae, 0xae, 0x00, 0x00,
-  0x79, 0x79, 0x79, 0x79, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom32_20[120] = {
-  0x45, 0x51, 0x45, 0x51, 0x00, 0x00,
-  0x10, 0xa2, 0x10, 0xa2, 0x00, 0x00,
-  0x01, 0x25, 0x01, 0x25, 0x00, 0x00,
-  0x0b, 0x42, 0x0b, 0x42, 0x00, 0x00,
-  0xd8, 0x20, 0xd8, 0x20, 0x00, 0x00,
-  0x82, 0x8c, 0x82, 0x8c, 0x00, 0x00,
-  0x24, 0x4a, 0x24, 0x4a, 0x00, 0x00,
-  0x38, 0x18, 0x38, 0x18, 0x00, 0x00,
-  0x2a, 0x25, 0x2a, 0x25, 0x00, 0x00,
-  0x84, 0x92, 0x84, 0x92, 0x00, 0x00,
-  0x55, 0x51, 0x55, 0x51, 0x00, 0x00,
-  0x22, 0x2a, 0x22, 0x2a, 0x00, 0x00,
-  0x05, 0x85, 0x05, 0x85, 0x00, 0x00,
-  0x09, 0x4a, 0x09, 0x4a, 0x00, 0x00,
-  0x84, 0x32, 0x84, 0x32, 0x00, 0x00,
-  0xc0, 0x0d, 0xc0, 0x0d, 0x00, 0x00,
-  0x20, 0xa6, 0x20, 0xa6, 0x00, 0x00,
-  0x1a, 0x09, 0x1a, 0x09, 0x00, 0x00,
-  0x44, 0x64, 0x44, 0x64, 0x00, 0x00,
-  0x96, 0xd3, 0xf6, 0xac, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom32_21[126] = {
-  0x45, 0x51, 0x45, 0x51, 0x00, 0x00,
-  0x10, 0xa2, 0x10, 0xa2, 0x00, 0x00,
-  0x01, 0x25, 0x01, 0x25, 0x00, 0x00,
-  0x0b, 0x42, 0x0b, 0x42, 0x00, 0x00,
-  0xd8, 0x20, 0xd8, 0x20, 0x00, 0x00,
-  0x82, 0x8c, 0x82, 0x8c, 0x00, 0x00,
-  0x24, 0x4a, 0x24, 0x4a, 0x00, 0x00,
-  0x38, 0x18, 0x38, 0x18, 0x00, 0x00,
-  0x2a, 0x25, 0x2a, 0x25, 0x00, 0x00,
-  0x84, 0x92, 0x84, 0x92, 0x00, 0x00,
-  0x55, 0x55, 0x55, 0x55, 0x00, 0x00,
-  0x2a, 0x22, 0x2a, 0x22, 0x00, 0x00,
-  0x31, 0x11, 0x31, 0x11, 0x00, 0x00,
-  0x83, 0x42, 0x83, 0x42, 0x00, 0x00,
-  0x06, 0x98, 0x06, 0x98, 0x00, 0x00,
-  0x40, 0xe1, 0x40, 0xe1, 0x00, 0x00,
-  0x2c, 0x44, 0x2c, 0x44, 0x00, 0x00,
-  0xd8, 0x28, 0xd8, 0x28, 0x00, 0x00,
-  0x92, 0x81, 0x92, 0x81, 0x00, 0x00,
-  0x84, 0x32, 0x84, 0x32, 0x00, 0x00,
-  0x68, 0x0c, 0x68, 0x0c, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom32_22[132] = {
-  0x55, 0x55, 0x55, 0x55, 0x00, 0x00,
-  0x2a, 0x22, 0x2a, 0x22, 0x00, 0x00,
-  0x31, 0x11, 0x31, 0x11, 0x00, 0x00,
-  0x83, 0x42, 0x83, 0x42, 0x00, 0x00,
-  0x06, 0x98, 0x06, 0x98, 0x00, 0x00,
-  0x40, 0xe1, 0x40, 0xe1, 0x00, 0x00,
-  0x2c, 0x44, 0x2c, 0x44, 0x00, 0x00,
-  0xd8, 0x28, 0xd8, 0x28, 0x00, 0x00,
-  0x92, 0x81, 0x92, 0x81, 0x00, 0x00,
-  0x84, 0x32, 0x84, 0x32, 0x00, 0x00,
-  0x68, 0x0c, 0x68, 0x0c, 0x00, 0x00,
-  0x45, 0x51, 0x45, 0x51, 0x00, 0x00,
-  0x10, 0xa2, 0x10, 0xa2, 0x00, 0x00,
-  0x01, 0x25, 0x01, 0x25, 0x00, 0x00,
-  0x0b, 0x42, 0x0b, 0x42, 0x00, 0x00,
-  0xd8, 0x20, 0xd8, 0x20, 0x00, 0x00,
-  0x82, 0x8c, 0x82, 0x8c, 0x00, 0x00,
-  0x24, 0x4a, 0x24, 0x4a, 0x00, 0x00,
-  0x38, 0x18, 0x38, 0x18, 0x00, 0x00,
-  0x2a, 0x25, 0x2a, 0x25, 0x00, 0x00,
-  0x84, 0x92, 0x84, 0x92, 0x00, 0x00,
-  0xeb, 0xb2, 0x22, 0x89, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom32_23[138] = {
-  0x55, 0x55, 0x55, 0x55, 0x00, 0x00,
-  0x2a, 0x22, 0x2a, 0x22, 0x00, 0x00,
-  0x31, 0x11, 0x31, 0x11, 0x00, 0x00,
-  0x83, 0x42, 0x83, 0x42, 0x00, 0x00,
-  0x06, 0x98, 0x06, 0x98, 0x00, 0x00,
-  0x40, 0xe1, 0x40, 0xe1, 0x00, 0x00,
-  0x2c, 0x44, 0x2c, 0x44, 0x00, 0x00,
-  0xd8, 0x28, 0xd8, 0x28, 0x00, 0x00,
-  0x92, 0x81, 0x92, 0x81, 0x00, 0x00,
-  0x84, 0x32, 0x84, 0x32, 0x00, 0x00,
-  0x68, 0x0c, 0x68, 0x0c, 0x00, 0x00,
-  0x84, 0x31, 0x84, 0x31, 0x00, 0x00,
-  0x18, 0xa2, 0x18, 0xa2, 0x00, 0x00,
-  0x4e, 0x01, 0x4e, 0x01, 0x00, 0x00,
-  0x44, 0xc8, 0x44, 0xc8, 0x00, 0x00,
-  0x0e, 0x90, 0x0e, 0x90, 0x00, 0x00,
-  0x20, 0xcc, 0x20, 0xcc, 0x00, 0x00,
-  0x93, 0x40, 0x93, 0x40, 0x00, 0x00,
-  0x2d, 0x10, 0x2d, 0x10, 0x00, 0x00,
-  0x31, 0x44, 0x31, 0x44, 0x00, 0x00,
-  0xc0, 0x23, 0xc0, 0x23, 0x00, 0x00,
-  0x11, 0x25, 0x11, 0x25, 0x00, 0x00,
-  0xe8, 0x80, 0xe8, 0x80, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom32_24[144] = {
-  0x84, 0x31, 0x84, 0x31, 0x00, 0x00,
-  0x18, 0xa2, 0x18, 0xa2, 0x00, 0x00,
-  0x4e, 0x01, 0x4e, 0x01, 0x00, 0x00,
-  0x44, 0xc8, 0x44, 0xc8, 0x00, 0x00,
-  0x0e, 0x90, 0x0e, 0x90, 0x00, 0x00,
-  0x20, 0xcc, 0x20, 0xcc, 0x00, 0x00,
-  0x93, 0x40, 0x93, 0x40, 0x00, 0x00,
-  0x2d, 0x10, 0x2d, 0x10, 0x00, 0x00,
-  0x31, 0x44, 0x31, 0x44, 0x00, 0x00,
-  0xc0, 0x23, 0xc0, 0x23, 0x00, 0x00,
-  0x11, 0x25, 0x11, 0x25, 0x00, 0x00,
-  0xe8, 0x80, 0xe8, 0x80, 0x00, 0x00,
-  0x55, 0x55, 0x55, 0x55, 0x00, 0x00,
-  0x2a, 0x22, 0x2a, 0x22, 0x00, 0x00,
-  0x31, 0x11, 0x31, 0x11, 0x00, 0x00,
-  0x83, 0x42, 0x83, 0x42, 0x00, 0x00,
-  0x06, 0x98, 0x06, 0x98, 0x00, 0x00,
-  0x40, 0xe1, 0x40, 0xe1, 0x00, 0x00,
-  0x2c, 0x44, 0x2c, 0x44, 0x00, 0x00,
-  0xd8, 0x28, 0xd8, 0x28, 0x00, 0x00,
-  0x92, 0x81, 0x92, 0x81, 0x00, 0x00,
-  0x84, 0x32, 0x84, 0x32, 0x00, 0x00,
-  0x68, 0x0c, 0x68, 0x0c, 0x00, 0x00,
-  0xf3, 0x5a, 0x2f, 0x5d, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom32_25[150] = {
-  0x84, 0x31, 0x84, 0x31, 0x00, 0x00,
-  0x18, 0xa2, 0x18, 0xa2, 0x00, 0x00,
-  0x4e, 0x01, 0x4e, 0x01, 0x00, 0x00,
-  0x44, 0xc8, 0x44, 0xc8, 0x00, 0x00,
-  0x0e, 0x90, 0x0e, 0x90, 0x00, 0x00,
-  0x20, 0xcc, 0x20, 0xcc, 0x00, 0x00,
-  0x93, 0x40, 0x93, 0x40, 0x00, 0x00,
-  0x2d, 0x10, 0x2d, 0x10, 0x00, 0x00,
-  0x31, 0x44, 0x31, 0x44, 0x00, 0x00,
-  0xc0, 0x23, 0xc0, 0x23, 0x00, 0x00,
-  0x11, 0x25, 0x11, 0x25, 0x00, 0x00,
-  0xe8, 0x80, 0xe8, 0x80, 0x00, 0x00,
-  0x45, 0x15, 0x45, 0x15, 0x00, 0x00,
-  0x22, 0x22, 0x22, 0x22, 0x00, 0x00,
-  0x96, 0x0c, 0x96, 0x0c, 0x00, 0x00,
-  0x0c, 0x50, 0x0c, 0x50, 0x00, 0x00,
-  0x62, 0x04, 0x62, 0x04, 0x00, 0x00,
-  0x49, 0x06, 0x49, 0x06, 0x00, 0x00,
-  0x11, 0x82, 0x11, 0x82, 0x00, 0x00,
-  0x12, 0x38, 0x12, 0x38, 0x00, 0x00,
-  0x40, 0x71, 0x40, 0x71, 0x00, 0x00,
-  0xa8, 0x8a, 0xa8, 0x8a, 0x00, 0x00,
-  0x08, 0xa1, 0x08, 0xa1, 0x00, 0x00,
-  0xa0, 0xc0, 0xa0, 0xc0, 0x00, 0x00,
-  0xc5, 0x10, 0xc5, 0x10, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom32_26[156] = {
-  0x45, 0x15, 0x45, 0x15, 0x00, 0x00,
-  0x22, 0x22, 0x22, 0x22, 0x00, 0x00,
-  0x96, 0x0c, 0x96, 0x0c, 0x00, 0x00,
-  0x0c, 0x50, 0x0c, 0x50, 0x00, 0x00,
-  0x62, 0x04, 0x62, 0x04, 0x00, 0x00,
-  0x49, 0x06, 0x49, 0x06, 0x00, 0x00,
-  0x11, 0x82, 0x11, 0x82, 0x00, 0x00,
-  0x12, 0x38, 0x12, 0x38, 0x00, 0x00,
-  0x40, 0x71, 0x40, 0x71, 0x00, 0x00,
-  0xa8, 0x8a, 0xa8, 0x8a, 0x00, 0x00,
-  0x08, 0xa1, 0x08, 0xa1, 0x00, 0x00,
-  0xa0, 0xc0, 0xa0, 0xc0, 0x00, 0x00,
-  0xc5, 0x10, 0xc5, 0x10, 0x00, 0x00,
-  0x84, 0x31, 0x84, 0x31, 0x00, 0x00,
-  0x18, 0xa2, 0x18, 0xa2, 0x00, 0x00,
-  0x4e, 0x01, 0x4e, 0x01, 0x00, 0x00,
-  0x44, 0xc8, 0x44, 0xc8, 0x00, 0x00,
-  0x0e, 0x90, 0x0e, 0x90, 0x00, 0x00,
-  0x20, 0xcc, 0x20, 0xcc, 0x00, 0x00,
-  0x93, 0x40, 0x93, 0x40, 0x00, 0x00,
-  0x2d, 0x10, 0x2d, 0x10, 0x00, 0x00,
-  0x31, 0x44, 0x31, 0x44, 0x00, 0x00,
-  0xc0, 0x23, 0xc0, 0x23, 0x00, 0x00,
-  0x11, 0x25, 0x11, 0x25, 0x00, 0x00,
-  0xe8, 0x80, 0xe8, 0x80, 0x00, 0x00,
-  0x52, 0x15, 0x62, 0x0a, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom32_27[162] = {
-  0x45, 0x15, 0x45, 0x15, 0x00, 0x00,
-  0x22, 0x22, 0x22, 0x22, 0x00, 0x00,
-  0x96, 0x0c, 0x96, 0x0c, 0x00, 0x00,
-  0x0c, 0x50, 0x0c, 0x50, 0x00, 0x00,
-  0x62, 0x04, 0x62, 0x04, 0x00, 0x00,
-  0x49, 0x06, 0x49, 0x06, 0x00, 0x00,
-  0x11, 0x82, 0x11, 0x82, 0x00, 0x00,
-  0x12, 0x38, 0x12, 0x38, 0x00, 0x00,
-  0x40, 0x71, 0x40, 0x71, 0x00, 0x00,
-  0xa8, 0x8a, 0xa8, 0x8a, 0x00, 0x00,
-  0x08, 0xa1, 0x08, 0xa1, 0x00, 0x00,
-  0xa0, 0xc0, 0xa0, 0xc0, 0x00, 0x00,
-  0xc5, 0x10, 0xc5, 0x10, 0x00, 0x00,
-  0x45, 0x51, 0x45, 0x51, 0x00, 0x00,
-  0x22, 0x0a, 0x22, 0x0a, 0x00, 0x00,
-  0x84, 0xd0, 0x84, 0xd0, 0x00, 0x00,
-  0x0c, 0x8a, 0x0c, 0x8a, 0x00, 0x00,
-  0x18, 0x06, 0x18, 0x06, 0x00, 0x00,
-  0x30, 0x03, 0x30, 0x03, 0x00, 0x00,
-  0x61, 0x08, 0x61, 0x08, 0x00, 0x00,
-  0x40, 0x11, 0x40, 0x11, 0x00, 0x00,
-  0x10, 0x2c, 0x10, 0x2c, 0x00, 0x00,
-  0x09, 0x60, 0x09, 0x60, 0x00, 0x00,
-  0x00, 0x94, 0x00, 0x94, 0x00, 0x00,
-  0x52, 0x40, 0x52, 0x40, 0x00, 0x00,
-  0xa4, 0x24, 0xa4, 0x24, 0x00, 0x00,
-  0x82, 0x88, 0x82, 0x88, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom32_28[168] = {
-  0x45, 0x51, 0x45, 0x51, 0x00, 0x00,
-  0x22, 0x0a, 0x22, 0x0a, 0x00, 0x00,
-  0x84, 0xd0, 0x84, 0xd0, 0x00, 0x00,
-  0x0c, 0x8a, 0x0c, 0x8a, 0x00, 0x00,
-  0x18, 0x06, 0x18, 0x06, 0x00, 0x00,
-  0x30, 0x03, 0x30, 0x03, 0x00, 0x00,
-  0x61, 0x08, 0x61, 0x08, 0x00, 0x00,
-  0x40, 0x11, 0x40, 0x11, 0x00, 0x00,
-  0x10, 0x2c, 0x10, 0x2c, 0x00, 0x00,
-  0x09, 0x60, 0x09, 0x60, 0x00, 0x00,
-  0x00, 0x94, 0x00, 0x94, 0x00, 0x00,
-  0x52, 0x40, 0x52, 0x40, 0x00, 0x00,
-  0xa4, 0x24, 0xa4, 0x24, 0x00, 0x00,
-  0x82, 0x88, 0x82, 0x88, 0x00, 0x00,
-  0x45, 0x15, 0x45, 0x15, 0x00, 0x00,
-  0x22, 0x22, 0x22, 0x22, 0x00, 0x00,
-  0x96, 0x0c, 0x96, 0x0c, 0x00, 0x00,
-  0x0c, 0x50, 0x0c, 0x50, 0x00, 0x00,
-  0x62, 0x04, 0x62, 0x04, 0x00, 0x00,
-  0x49, 0x06, 0x49, 0x06, 0x00, 0x00,
-  0x11, 0x82, 0x11, 0x82, 0x00, 0x00,
-  0x12, 0x38, 0x12, 0x38, 0x00, 0x00,
-  0x40, 0x71, 0x40, 0x71, 0x00, 0x00,
-  0xa8, 0x8a, 0xa8, 0x8a, 0x00, 0x00,
-  0x08, 0xa1, 0x08, 0xa1, 0x00, 0x00,
-  0xa0, 0xc0, 0xa0, 0xc0, 0x00, 0x00,
-  0xc5, 0x10, 0xc5, 0x10, 0x00, 0x00,
-  0x7f, 0xe2, 0xbc, 0x01, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom32_29[174] = {
-  0x45, 0x51, 0x45, 0x51, 0x00, 0x00,
-  0x22, 0x0a, 0x22, 0x0a, 0x00, 0x00,
-  0x84, 0xd0, 0x84, 0xd0, 0x00, 0x00,
-  0x0c, 0x8a, 0x0c, 0x8a, 0x00, 0x00,
-  0x18, 0x06, 0x18, 0x06, 0x00, 0x00,
-  0x30, 0x03, 0x30, 0x03, 0x00, 0x00,
-  0x61, 0x08, 0x61, 0x08, 0x00, 0x00,
-  0x40, 0x11, 0x40, 0x11, 0x00, 0x00,
-  0x10, 0x2c, 0x10, 0x2c, 0x00, 0x00,
-  0x09, 0x60, 0x09, 0x60, 0x00, 0x00,
-  0x00, 0x94, 0x00, 0x94, 0x00, 0x00,
-  0x52, 0x40, 0x52, 0x40, 0x00, 0x00,
-  0xa4, 0x24, 0xa4, 0x24, 0x00, 0x00,
-  0x82, 0x88, 0x82, 0x88, 0x00, 0x00,
-  0x55, 0x11, 0x55, 0x11, 0x00, 0x00,
-  0x22, 0x22, 0x22, 0x22, 0x00, 0x00,
-  0x11, 0x11, 0x11, 0x11, 0x00, 0x00,
-  0x80, 0x45, 0x80, 0x45, 0x00, 0x00,
-  0x20, 0x1a, 0x20, 0x1a, 0x00, 0x00,
-  0x08, 0x68, 0x08, 0x68, 0x00, 0x00,
-  0x22, 0x84, 0x22, 0x84, 0x00, 0x00,
-  0x48, 0x09, 0x48, 0x09, 0x00, 0x00,
-  0x07, 0x01, 0x07, 0x01, 0x00, 0x00,
-  0x94, 0x20, 0x94, 0x20, 0x00, 0x00,
-  0x82, 0x06, 0x82, 0x06, 0x00, 0x00,
-  0x60, 0x48, 0x60, 0x48, 0x00, 0x00,
-  0x89, 0x80, 0x89, 0x80, 0x00, 0x00,
-  0x00, 0x8e, 0x00, 0x8e, 0x00, 0x00,
-  0x18, 0x22, 0x18, 0x22, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom32_3[18] = {
-  0xad, 0x2d, 0xad, 0x2d, 0x00, 0x00,
-  0x76, 0x36, 0x76, 0x36, 0x00, 0x00,
-  0x26, 0xdb, 0x26, 0xdb, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom32_30[180] = {
-  0x55, 0x11, 0x55, 0x11, 0x00, 0x00,
-  0x22, 0x22, 0x22, 0x22, 0x00, 0x00,
-  0x11, 0x11, 0x11, 0x11, 0x00, 0x00,
-  0x80, 0x45, 0x80, 0x45, 0x00, 0x00,
-  0x20, 0x1a, 0x20, 0x1a, 0x00, 0x00,
-  0x08, 0x68, 0x08, 0x68, 0x00, 0x00,
-  0x22, 0x84, 0x22, 0x84, 0x00, 0x00,
-  0x48, 0x09, 0x48, 0x09, 0x00, 0x00,
-  0x07, 0x01, 0x07, 0x01, 0x00, 0x00,
-  0x94, 0x20, 0x94, 0x20, 0x00, 0x00,
-  0x82, 0x06, 0x82, 0x06, 0x00, 0x00,
-  0x60, 0x48, 0x60, 0x48, 0x00, 0x00,
-  0x89, 0x80, 0x89, 0x80, 0x00, 0x00,
-  0x00, 0x8e, 0x00, 0x8e, 0x00, 0x00,
-  0x18, 0x22, 0x18, 0x22, 0x00, 0x00,
-  0x45, 0x51, 0x45, 0x51, 0x00, 0x00,
-  0x22, 0x0a, 0x22, 0x0a, 0x00, 0x00,
-  0x84, 0xd0, 0x84, 0xd0, 0x00, 0x00,
-  0x0c, 0x8a, 0x0c, 0x8a, 0x00, 0x00,
-  0x18, 0x06, 0x18, 0x06, 0x00, 0x00,
-  0x30, 0x03, 0x30, 0x03, 0x00, 0x00,
-  0x61, 0x08, 0x61, 0x08, 0x00, 0x00,
-  0x40, 0x11, 0x40, 0x11, 0x00, 0x00,
-  0x10, 0x2c, 0x10, 0x2c, 0x00, 0x00,
-  0x09, 0x60, 0x09, 0x60, 0x00, 0x00,
-  0x00, 0x94, 0x00, 0x94, 0x00, 0x00,
-  0x52, 0x40, 0x52, 0x40, 0x00, 0x00,
-  0xa4, 0x24, 0xa4, 0x24, 0x00, 0x00,
-  0x82, 0x88, 0x82, 0x88, 0x00, 0x00,
-  0x1e, 0x27, 0xe2, 0xd8, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom32_31[186] = {
-  0x55, 0x11, 0x55, 0x11, 0x00, 0x00,
-  0x22, 0x22, 0x22, 0x22, 0x00, 0x00,
-  0x11, 0x11, 0x11, 0x11, 0x00, 0x00,
-  0x80, 0x45, 0x80, 0x45, 0x00, 0x00,
-  0x20, 0x1a, 0x20, 0x1a, 0x00, 0x00,
-  0x08, 0x68, 0x08, 0x68, 0x00, 0x00,
-  0x22, 0x84, 0x22, 0x84, 0x00, 0x00,
-  0x48, 0x09, 0x48, 0x09, 0x00, 0x00,
-  0x07, 0x01, 0x07, 0x01, 0x00, 0x00,
-  0x94, 0x20, 0x94, 0x20, 0x00, 0x00,
-  0x82, 0x06, 0x82, 0x06, 0x00, 0x00,
-  0x60, 0x48, 0x60, 0x48, 0x00, 0x00,
-  0x89, 0x80, 0x89, 0x80, 0x00, 0x00,
-  0x00, 0x8e, 0x00, 0x8e, 0x00, 0x00,
-  0x18, 0x22, 0x18, 0x22, 0x00, 0x00,
-  0xa4, 0x10, 0xa4, 0x10, 0x00, 0x00,
-  0x01, 0x2a, 0x01, 0x2a, 0x00, 0x00,
-  0x06, 0x42, 0x06, 0x42, 0x00, 0x00,
-  0x08, 0x68, 0x08, 0x68, 0x00, 0x00,
-  0x81, 0x90, 0x81, 0x90, 0x00, 0x00,
-  0x00, 0xf0, 0x00, 0xf0, 0x00, 0x00,
-  0x50, 0x05, 0x50, 0x05, 0x00, 0x00,
-  0x20, 0x51, 0x20, 0x51, 0x00, 0x00,
-  0x43, 0x08, 0x43, 0x08, 0x00, 0x00,
-  0x68, 0x80, 0x68, 0x80, 0x00, 0x00,
-  0x80, 0x0b, 0x80, 0x0b, 0x00, 0x00,
-  0x10, 0x4c, 0x10, 0x4c, 0x00, 0x00,
-  0x12, 0x30, 0x12, 0x30, 0x00, 0x00,
-  0x40, 0x85, 0x40, 0x85, 0x00, 0x00,
-  0x0e, 0x04, 0x0e, 0x04, 0x00, 0x00,
-  0x18, 0x12, 0x18, 0x12, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom32_32[192] = {
-  0xa4, 0x10, 0xa4, 0x10, 0x00, 0x00,
-  0x01, 0x2a, 0x01, 0x2a, 0x00, 0x00,
-  0x06, 0x42, 0x06, 0x42, 0x00, 0x00,
-  0x08, 0x68, 0x08, 0x68, 0x00, 0x00,
-  0x81, 0x90, 0x81, 0x90, 0x00, 0x00,
-  0x00, 0xf0, 0x00, 0xf0, 0x00, 0x00,
-  0x50, 0x05, 0x50, 0x05, 0x00, 0x00,
-  0x20, 0x51, 0x20, 0x51, 0x00, 0x00,
-  0x43, 0x08, 0x43, 0x08, 0x00, 0x00,
-  0x68, 0x80, 0x68, 0x80, 0x00, 0x00,
-  0x80, 0x0b, 0x80, 0x0b, 0x00, 0x00,
-  0x10, 0x4c, 0x10, 0x4c, 0x00, 0x00,
-  0x12, 0x30, 0x12, 0x30, 0x00, 0x00,
-  0x40, 0x85, 0x40, 0x85, 0x00, 0x00,
-  0x0e, 0x04, 0x0e, 0x04, 0x00, 0x00,
-  0x18, 0x12, 0x18, 0x12, 0x00, 0x00,
-  0x55, 0x11, 0x55, 0x11, 0x00, 0x00,
-  0x22, 0x22, 0x22, 0x22, 0x00, 0x00,
-  0x11, 0x11, 0x11, 0x11, 0x00, 0x00,
-  0x80, 0x45, 0x80, 0x45, 0x00, 0x00,
-  0x20, 0x1a, 0x20, 0x1a, 0x00, 0x00,
-  0x08, 0x68, 0x08, 0x68, 0x00, 0x00,
-  0x22, 0x84, 0x22, 0x84, 0x00, 0x00,
-  0x48, 0x09, 0x48, 0x09, 0x00, 0x00,
-  0x07, 0x01, 0x07, 0x01, 0x00, 0x00,
-  0x94, 0x20, 0x94, 0x20, 0x00, 0x00,
-  0x82, 0x06, 0x82, 0x06, 0x00, 0x00,
-  0x60, 0x48, 0x60, 0x48, 0x00, 0x00,
-  0x89, 0x80, 0x89, 0x80, 0x00, 0x00,
-  0x00, 0x8e, 0x00, 0x8e, 0x00, 0x00,
-  0x18, 0x22, 0x18, 0x22, 0x00, 0x00,
-  0x60, 0xc4, 0x02, 0x02, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom32_4[24] = {
-  0x55, 0x55, 0x55, 0x55, 0x00, 0x00,
-  0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00,
-  0x35, 0x35, 0x35, 0x35, 0x00, 0x00,
-  0xca, 0xca, 0xca, 0xca, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom32_5[30] = {
-  0x55, 0x55, 0x55, 0x55, 0x00, 0x00,
-  0x2a, 0x2a, 0x2a, 0x2a, 0x00, 0x00,
-  0x24, 0x25, 0x24, 0x25, 0x00, 0x00,
-  0x84, 0xc8, 0x84, 0xc8, 0x00, 0x00,
-  0x10, 0xb6, 0x10, 0xb6, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom32_6[36] = {
-  0x51, 0x51, 0x51, 0x51, 0x00, 0x00,
-  0x0a, 0x2a, 0x0a, 0x2a, 0x00, 0x00,
-  0xa2, 0x15, 0xa2, 0x15, 0x00, 0x00,
-  0x84, 0x4a, 0x84, 0x4a, 0x00, 0x00,
-  0x30, 0x92, 0x30, 0x92, 0x00, 0x00,
-  0x04, 0xac, 0x04, 0xac, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom32_7[42] = {
-  0x45, 0x51, 0x45, 0x51, 0x00, 0x00,
-  0x22, 0x2a, 0x22, 0x2a, 0x00, 0x00,
-  0x91, 0x11, 0x91, 0x11, 0x00, 0x00,
-  0x2e, 0x08, 0x2e, 0x08, 0x00, 0x00,
-  0x48, 0x34, 0x48, 0x34, 0x00, 0x00,
-  0x90, 0x29, 0x90, 0x29, 0x00, 0x00,
-  0x09, 0x86, 0x09, 0x86, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom32_8[48] = {
-  0x20, 0x54, 0x20, 0x54, 0x00, 0x00,
-  0x18, 0x88, 0x18, 0x88, 0x00, 0x00,
-  0x84, 0x07, 0x84, 0x07, 0x00, 0x00,
-  0x60, 0x48, 0x60, 0x48, 0x00, 0x00,
-  0x12, 0x82, 0x12, 0x82, 0x00, 0x00,
-  0x81, 0x41, 0x81, 0x41, 0x00, 0x00,
-  0x40, 0x62, 0x40, 0x62, 0x00, 0x00,
-  0x16, 0x30, 0x16, 0x30, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom32_9[54] = {
-  0x55, 0x51, 0x55, 0x51, 0x00, 0x00,
-  0x22, 0x2a, 0x22, 0x2a, 0x00, 0x00,
-  0x05, 0x85, 0x05, 0x85, 0x00, 0x00,
-  0x09, 0x4a, 0x09, 0x4a, 0x00, 0x00,
-  0x84, 0x32, 0x84, 0x32, 0x00, 0x00,
-  0xc0, 0x0d, 0xc0, 0x0d, 0x00, 0x00,
-  0x20, 0xa6, 0x20, 0xa6, 0x00, 0x00,
-  0x1a, 0x09, 0x1a, 0x09, 0x00, 0x00,
-  0x44, 0x64, 0x44, 0x64, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom33_1[6] = {
-  0xff, 0xff, 0xff, 0xff, 0x80, 0x00
-};
-
-const uint8_t kMaskRandom33_10[60] = {
-  0x45, 0x51, 0x55, 0x8c, 0x80, 0x00,
-  0x10, 0xa2, 0xaa, 0x27, 0x00, 0x00,
-  0x01, 0x25, 0xa5, 0x32, 0x80, 0x00,
-  0x0b, 0x42, 0x62, 0x61, 0x80, 0x00,
-  0xd8, 0x20, 0x3c, 0x5c, 0x00, 0x00,
-  0x82, 0x8c, 0x8e, 0xcc, 0x00, 0x00,
-  0x24, 0x4a, 0x6a, 0x2b, 0x00, 0x00,
-  0x38, 0x18, 0x36, 0x32, 0x80, 0x00,
-  0x2a, 0x25, 0xd1, 0x25, 0x80, 0x00,
-  0x84, 0x92, 0xc8, 0x02, 0x80, 0x00
-};
-
-const uint8_t kMaskRandom33_11[66] = {
-  0x55, 0x55, 0x55, 0x8c, 0x80, 0x00,
-  0x2a, 0x22, 0xaa, 0x27, 0x00, 0x00,
-  0x31, 0x11, 0xa5, 0x32, 0x80, 0x00,
-  0x83, 0x42, 0x62, 0x61, 0x80, 0x00,
-  0x06, 0x98, 0x3c, 0x5c, 0x00, 0x00,
-  0x40, 0xe1, 0x51, 0x84, 0x80, 0x00,
-  0x2c, 0x44, 0xa2, 0x27, 0x00, 0x00,
-  0xd8, 0x28, 0x95, 0x51, 0x80, 0x00,
-  0x92, 0x81, 0x4a, 0x1a, 0x00, 0x00,
-  0x84, 0x32, 0x30, 0x68, 0x00, 0x00,
-  0x68, 0x0c, 0x2c, 0x89, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom33_12[72] = {
-  0x84, 0x31, 0x51, 0x84, 0x80, 0x00,
-  0x18, 0xa2, 0xa2, 0x27, 0x00, 0x00,
-  0x4e, 0x01, 0x95, 0x51, 0x80, 0x00,
-  0x44, 0xc8, 0x4a, 0x1a, 0x00, 0x00,
-  0x0e, 0x90, 0x30, 0x68, 0x00, 0x00,
-  0x20, 0xcc, 0x2c, 0x89, 0x00, 0x00,
-  0x93, 0x40, 0x55, 0x8c, 0x80, 0x00,
-  0x2d, 0x10, 0xaa, 0x27, 0x00, 0x00,
-  0x31, 0x44, 0xa5, 0x32, 0x80, 0x00,
-  0xc0, 0x23, 0x62, 0x61, 0x80, 0x00,
-  0x11, 0x25, 0x3c, 0x5c, 0x00, 0x00,
-  0xe8, 0x80, 0x51, 0x35, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom33_13[78] = {
-  0x45, 0x15, 0x51, 0x84, 0x80, 0x00,
-  0x22, 0x22, 0xa2, 0x27, 0x00, 0x00,
-  0x96, 0x0c, 0x95, 0x51, 0x80, 0x00,
-  0x0c, 0x50, 0x4a, 0x1a, 0x00, 0x00,
-  0x62, 0x04, 0x30, 0x68, 0x00, 0x00,
-  0x49, 0x06, 0x2c, 0x89, 0x00, 0x00,
-  0x11, 0x82, 0x15, 0x8c, 0x00, 0x00,
-  0x12, 0x38, 0x8a, 0x47, 0x00, 0x00,
-  0x40, 0x71, 0x25, 0x81, 0x80, 0x00,
-  0xa8, 0x8a, 0x62, 0x12, 0x80, 0x00,
-  0x08, 0xa1, 0x58, 0x58, 0x00, 0x00,
-  0xa0, 0xc0, 0x0e, 0x28, 0x80, 0x00,
-  0xc5, 0x10, 0x83, 0x34, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom33_14[84] = {
-  0x45, 0x51, 0x15, 0x8c, 0x00, 0x00,
-  0x22, 0x0a, 0x8a, 0x47, 0x00, 0x00,
-  0x84, 0xd0, 0x25, 0x81, 0x80, 0x00,
-  0x0c, 0x8a, 0x62, 0x12, 0x80, 0x00,
-  0x18, 0x06, 0x58, 0x58, 0x00, 0x00,
-  0x30, 0x03, 0x0e, 0x28, 0x80, 0x00,
-  0x61, 0x08, 0x83, 0x34, 0x00, 0x00,
-  0x40, 0x11, 0x51, 0x84, 0x80, 0x00,
-  0x10, 0x2c, 0xa2, 0x27, 0x00, 0x00,
-  0x09, 0x60, 0x95, 0x51, 0x80, 0x00,
-  0x00, 0x94, 0x4a, 0x1a, 0x00, 0x00,
-  0x52, 0x40, 0x30, 0x68, 0x00, 0x00,
-  0xa4, 0x24, 0x2c, 0x89, 0x00, 0x00,
-  0x82, 0x88, 0xb0, 0xde, 0x80, 0x00
-};
-
-const uint8_t kMaskRandom33_15[90] = {
-  0x55, 0x11, 0x15, 0x8c, 0x00, 0x00,
-  0x22, 0x22, 0x8a, 0x47, 0x00, 0x00,
-  0x11, 0x11, 0x25, 0x81, 0x80, 0x00,
-  0x80, 0x45, 0x62, 0x12, 0x80, 0x00,
-  0x20, 0x1a, 0x58, 0x58, 0x00, 0x00,
-  0x08, 0x68, 0x0e, 0x28, 0x80, 0x00,
-  0x22, 0x84, 0x83, 0x34, 0x00, 0x00,
-  0x48, 0x09, 0x25, 0x2c, 0x00, 0x00,
-  0x07, 0x01, 0x8a, 0x91, 0x00, 0x00,
-  0x94, 0x20, 0x91, 0xc0, 0x80, 0x00,
-  0x82, 0x06, 0x68, 0x06, 0x80, 0x00,
-  0x60, 0x48, 0x32, 0xc8, 0x00, 0x00,
-  0x89, 0x80, 0x43, 0x45, 0x00, 0x00,
-  0x00, 0x8e, 0xc4, 0x30, 0x80, 0x00,
-  0x18, 0x22, 0x1c, 0xa2, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom33_16[96] = {
-  0xa4, 0x10, 0x25, 0x2c, 0x00, 0x00,
-  0x01, 0x2a, 0x8a, 0x91, 0x00, 0x00,
-  0x06, 0x42, 0x91, 0xc0, 0x80, 0x00,
-  0x08, 0x68, 0x68, 0x06, 0x80, 0x00,
-  0x81, 0x90, 0x32, 0xc8, 0x00, 0x00,
-  0x00, 0xf0, 0x43, 0x45, 0x00, 0x00,
-  0x50, 0x05, 0xc4, 0x30, 0x80, 0x00,
-  0x20, 0x51, 0x1c, 0xa2, 0x00, 0x00,
-  0x43, 0x08, 0x15, 0x8c, 0x00, 0x00,
-  0x68, 0x80, 0x8a, 0x47, 0x00, 0x00,
-  0x80, 0x0b, 0x25, 0x81, 0x80, 0x00,
-  0x10, 0x4c, 0x62, 0x12, 0x80, 0x00,
-  0x12, 0x30, 0x58, 0x58, 0x00, 0x00,
-  0x40, 0x85, 0x0e, 0x28, 0x80, 0x00,
-  0x0e, 0x04, 0x83, 0x34, 0x00, 0x00,
-  0x18, 0x12, 0x0a, 0x1c, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom33_17[102] = {
-  0x20, 0x54, 0x64, 0x16, 0x00, 0x00,
-  0x18, 0x88, 0xa2, 0xc2, 0x00, 0x00,
-  0x84, 0x07, 0x51, 0x60, 0x80, 0x00,
-  0x60, 0x48, 0x4a, 0x85, 0x00, 0x00,
-  0x12, 0x82, 0x38, 0x4c, 0x00, 0x00,
-  0x81, 0x41, 0x89, 0x29, 0x00, 0x00,
-  0x40, 0x62, 0x07, 0x11, 0x80, 0x00,
-  0x16, 0x30, 0x94, 0xb0, 0x00, 0x00,
-  0x55, 0x51, 0x8e, 0xcc, 0x00, 0x00,
-  0x22, 0x2a, 0x6a, 0x2b, 0x00, 0x00,
-  0x05, 0x85, 0x36, 0x32, 0x80, 0x00,
-  0x09, 0x4a, 0xd1, 0x25, 0x80, 0x00,
-  0x84, 0x32, 0x55, 0x8c, 0x80, 0x00,
-  0xc0, 0x0d, 0xaa, 0x27, 0x00, 0x00,
-  0x20, 0xa6, 0xa5, 0x32, 0x80, 0x00,
-  0x1a, 0x09, 0x62, 0x61, 0x80, 0x00,
-  0x44, 0x64, 0x3c, 0x5c, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom33_18[108] = {
-  0x55, 0x51, 0x8e, 0xcc, 0x00, 0x00,
-  0x22, 0x2a, 0x6a, 0x2b, 0x00, 0x00,
-  0x05, 0x85, 0x36, 0x32, 0x80, 0x00,
-  0x09, 0x4a, 0xd1, 0x25, 0x80, 0x00,
-  0x84, 0x32, 0x55, 0x8c, 0x80, 0x00,
-  0xc0, 0x0d, 0xaa, 0x27, 0x00, 0x00,
-  0x20, 0xa6, 0xa5, 0x32, 0x80, 0x00,
-  0x1a, 0x09, 0x62, 0x61, 0x80, 0x00,
-  0x44, 0x64, 0x3c, 0x5c, 0x00, 0x00,
-  0x20, 0x54, 0x64, 0x16, 0x00, 0x00,
-  0x18, 0x88, 0xa2, 0xc2, 0x00, 0x00,
-  0x84, 0x07, 0x51, 0x60, 0x80, 0x00,
-  0x60, 0x48, 0x4a, 0x85, 0x00, 0x00,
-  0x12, 0x82, 0x38, 0x4c, 0x00, 0x00,
-  0x81, 0x41, 0x89, 0x29, 0x00, 0x00,
-  0x40, 0x62, 0x07, 0x11, 0x80, 0x00,
-  0x16, 0x30, 0x94, 0xb0, 0x00, 0x00,
-  0x89, 0x53, 0x03, 0xad, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom33_19[114] = {
-  0x55, 0x51, 0x8e, 0xcc, 0x00, 0x00,
-  0x22, 0x2a, 0x6a, 0x2b, 0x00, 0x00,
-  0x05, 0x85, 0x36, 0x32, 0x80, 0x00,
-  0x09, 0x4a, 0xd1, 0x25, 0x80, 0x00,
-  0x84, 0x32, 0x55, 0x8c, 0x80, 0x00,
-  0xc0, 0x0d, 0xaa, 0x27, 0x00, 0x00,
-  0x20, 0xa6, 0xa5, 0x32, 0x80, 0x00,
-  0x1a, 0x09, 0x62, 0x61, 0x80, 0x00,
-  0x44, 0x64, 0x3c, 0x5c, 0x00, 0x00,
-  0x45, 0x51, 0x55, 0x8c, 0x80, 0x00,
-  0x10, 0xa2, 0xaa, 0x27, 0x00, 0x00,
-  0x01, 0x25, 0xa5, 0x32, 0x80, 0x00,
-  0x0b, 0x42, 0x62, 0x61, 0x80, 0x00,
-  0xd8, 0x20, 0x3c, 0x5c, 0x00, 0x00,
-  0x82, 0x8c, 0x8e, 0xcc, 0x00, 0x00,
-  0x24, 0x4a, 0x6a, 0x2b, 0x00, 0x00,
-  0x38, 0x18, 0x36, 0x32, 0x80, 0x00,
-  0x2a, 0x25, 0xd1, 0x25, 0x80, 0x00,
-  0x84, 0x92, 0xc8, 0x02, 0x80, 0x00
-};
-
-const uint8_t kMaskRandom33_2[12] = {
-  0xae, 0xae, 0xce, 0xce, 0x00, 0x00,
-  0x79, 0x79, 0xb9, 0x39, 0x80, 0x00
-};
-
-const uint8_t kMaskRandom33_20[120] = {
-  0x45, 0x51, 0x55, 0x8c, 0x80, 0x00,
-  0x10, 0xa2, 0xaa, 0x27, 0x00, 0x00,
-  0x01, 0x25, 0xa5, 0x32, 0x80, 0x00,
-  0x0b, 0x42, 0x62, 0x61, 0x80, 0x00,
-  0xd8, 0x20, 0x3c, 0x5c, 0x00, 0x00,
-  0x82, 0x8c, 0x8e, 0xcc, 0x00, 0x00,
-  0x24, 0x4a, 0x6a, 0x2b, 0x00, 0x00,
-  0x38, 0x18, 0x36, 0x32, 0x80, 0x00,
-  0x2a, 0x25, 0xd1, 0x25, 0x80, 0x00,
-  0x84, 0x92, 0xc8, 0x02, 0x80, 0x00,
-  0x55, 0x51, 0x8e, 0xcc, 0x00, 0x00,
-  0x22, 0x2a, 0x6a, 0x2b, 0x00, 0x00,
-  0x05, 0x85, 0x36, 0x32, 0x80, 0x00,
-  0x09, 0x4a, 0xd1, 0x25, 0x80, 0x00,
-  0x84, 0x32, 0x55, 0x8c, 0x80, 0x00,
-  0xc0, 0x0d, 0xaa, 0x27, 0x00, 0x00,
-  0x20, 0xa6, 0xa5, 0x32, 0x80, 0x00,
-  0x1a, 0x09, 0x62, 0x61, 0x80, 0x00,
-  0x44, 0x64, 0x3c, 0x5c, 0x00, 0x00,
-  0x73, 0x5f, 0x5b, 0x0e, 0x80, 0x00
-};
-
-const uint8_t kMaskRandom33_21[126] = {
-  0x45, 0x51, 0x55, 0x8c, 0x80, 0x00,
-  0x10, 0xa2, 0xaa, 0x27, 0x00, 0x00,
-  0x01, 0x25, 0xa5, 0x32, 0x80, 0x00,
-  0x0b, 0x42, 0x62, 0x61, 0x80, 0x00,
-  0xd8, 0x20, 0x3c, 0x5c, 0x00, 0x00,
-  0x82, 0x8c, 0x8e, 0xcc, 0x00, 0x00,
-  0x24, 0x4a, 0x6a, 0x2b, 0x00, 0x00,
-  0x38, 0x18, 0x36, 0x32, 0x80, 0x00,
-  0x2a, 0x25, 0xd1, 0x25, 0x80, 0x00,
-  0x84, 0x92, 0xc8, 0x02, 0x80, 0x00,
-  0x55, 0x55, 0x55, 0x8c, 0x80, 0x00,
-  0x2a, 0x22, 0xaa, 0x27, 0x00, 0x00,
-  0x31, 0x11, 0xa5, 0x32, 0x80, 0x00,
-  0x83, 0x42, 0x62, 0x61, 0x80, 0x00,
-  0x06, 0x98, 0x3c, 0x5c, 0x00, 0x00,
-  0x40, 0xe1, 0x51, 0x84, 0x80, 0x00,
-  0x2c, 0x44, 0xa2, 0x27, 0x00, 0x00,
-  0xd8, 0x28, 0x95, 0x51, 0x80, 0x00,
-  0x92, 0x81, 0x4a, 0x1a, 0x00, 0x00,
-  0x84, 0x32, 0x30, 0x68, 0x00, 0x00,
-  0x68, 0x0c, 0x2c, 0x89, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom33_22[132] = {
-  0x55, 0x55, 0x55, 0x8c, 0x80, 0x00,
-  0x2a, 0x22, 0xaa, 0x27, 0x00, 0x00,
-  0x31, 0x11, 0xa5, 0x32, 0x80, 0x00,
-  0x83, 0x42, 0x62, 0x61, 0x80, 0x00,
-  0x06, 0x98, 0x3c, 0x5c, 0x00, 0x00,
-  0x40, 0xe1, 0x51, 0x84, 0x80, 0x00,
-  0x2c, 0x44, 0xa2, 0x27, 0x00, 0x00,
-  0xd8, 0x28, 0x95, 0x51, 0x80, 0x00,
-  0x92, 0x81, 0x4a, 0x1a, 0x00, 0x00,
-  0x84, 0x32, 0x30, 0x68, 0x00, 0x00,
-  0x68, 0x0c, 0x2c, 0x89, 0x00, 0x00,
-  0x45, 0x51, 0x55, 0x8c, 0x80, 0x00,
-  0x10, 0xa2, 0xaa, 0x27, 0x00, 0x00,
-  0x01, 0x25, 0xa5, 0x32, 0x80, 0x00,
-  0x0b, 0x42, 0x62, 0x61, 0x80, 0x00,
-  0xd8, 0x20, 0x3c, 0x5c, 0x00, 0x00,
-  0x82, 0x8c, 0x8e, 0xcc, 0x00, 0x00,
-  0x24, 0x4a, 0x6a, 0x2b, 0x00, 0x00,
-  0x38, 0x18, 0x36, 0x32, 0x80, 0x00,
-  0x2a, 0x25, 0xd1, 0x25, 0x80, 0x00,
-  0x84, 0x92, 0xc8, 0x02, 0x80, 0x00,
-  0xcc, 0xe3, 0x42, 0x6b, 0x80, 0x00
-};
-
-const uint8_t kMaskRandom33_23[138] = {
-  0x55, 0x55, 0x55, 0x8c, 0x80, 0x00,
-  0x2a, 0x22, 0xaa, 0x27, 0x00, 0x00,
-  0x31, 0x11, 0xa5, 0x32, 0x80, 0x00,
-  0x83, 0x42, 0x62, 0x61, 0x80, 0x00,
-  0x06, 0x98, 0x3c, 0x5c, 0x00, 0x00,
-  0x40, 0xe1, 0x51, 0x84, 0x80, 0x00,
-  0x2c, 0x44, 0xa2, 0x27, 0x00, 0x00,
-  0xd8, 0x28, 0x95, 0x51, 0x80, 0x00,
-  0x92, 0x81, 0x4a, 0x1a, 0x00, 0x00,
-  0x84, 0x32, 0x30, 0x68, 0x00, 0x00,
-  0x68, 0x0c, 0x2c, 0x89, 0x00, 0x00,
-  0x84, 0x31, 0x51, 0x84, 0x80, 0x00,
-  0x18, 0xa2, 0xa2, 0x27, 0x00, 0x00,
-  0x4e, 0x01, 0x95, 0x51, 0x80, 0x00,
-  0x44, 0xc8, 0x4a, 0x1a, 0x00, 0x00,
-  0x0e, 0x90, 0x30, 0x68, 0x00, 0x00,
-  0x20, 0xcc, 0x2c, 0x89, 0x00, 0x00,
-  0x93, 0x40, 0x55, 0x8c, 0x80, 0x00,
-  0x2d, 0x10, 0xaa, 0x27, 0x00, 0x00,
-  0x31, 0x44, 0xa5, 0x32, 0x80, 0x00,
-  0xc0, 0x23, 0x62, 0x61, 0x80, 0x00,
-  0x11, 0x25, 0x3c, 0x5c, 0x00, 0x00,
-  0xe8, 0x80, 0x51, 0x35, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom33_24[144] = {
-  0x84, 0x31, 0x51, 0x84, 0x80, 0x00,
-  0x18, 0xa2, 0xa2, 0x27, 0x00, 0x00,
-  0x4e, 0x01, 0x95, 0x51, 0x80, 0x00,
-  0x44, 0xc8, 0x4a, 0x1a, 0x00, 0x00,
-  0x0e, 0x90, 0x30, 0x68, 0x00, 0x00,
-  0x20, 0xcc, 0x2c, 0x89, 0x00, 0x00,
-  0x93, 0x40, 0x55, 0x8c, 0x80, 0x00,
-  0x2d, 0x10, 0xaa, 0x27, 0x00, 0x00,
-  0x31, 0x44, 0xa5, 0x32, 0x80, 0x00,
-  0xc0, 0x23, 0x62, 0x61, 0x80, 0x00,
-  0x11, 0x25, 0x3c, 0x5c, 0x00, 0x00,
-  0xe8, 0x80, 0x51, 0x35, 0x00, 0x00,
-  0x55, 0x55, 0x55, 0x8c, 0x80, 0x00,
-  0x2a, 0x22, 0xaa, 0x27, 0x00, 0x00,
-  0x31, 0x11, 0xa5, 0x32, 0x80, 0x00,
-  0x83, 0x42, 0x62, 0x61, 0x80, 0x00,
-  0x06, 0x98, 0x3c, 0x5c, 0x00, 0x00,
-  0x40, 0xe1, 0x51, 0x84, 0x80, 0x00,
-  0x2c, 0x44, 0xa2, 0x27, 0x00, 0x00,
-  0xd8, 0x28, 0x95, 0x51, 0x80, 0x00,
-  0x92, 0x81, 0x4a, 0x1a, 0x00, 0x00,
-  0x84, 0x32, 0x30, 0x68, 0x00, 0x00,
-  0x68, 0x0c, 0x2c, 0x89, 0x00, 0x00,
-  0xdc, 0x4e, 0xfc, 0x70, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom33_25[150] = {
-  0x84, 0x31, 0x51, 0x84, 0x80, 0x00,
-  0x18, 0xa2, 0xa2, 0x27, 0x00, 0x00,
-  0x4e, 0x01, 0x95, 0x51, 0x80, 0x00,
-  0x44, 0xc8, 0x4a, 0x1a, 0x00, 0x00,
-  0x0e, 0x90, 0x30, 0x68, 0x00, 0x00,
-  0x20, 0xcc, 0x2c, 0x89, 0x00, 0x00,
-  0x93, 0x40, 0x55, 0x8c, 0x80, 0x00,
-  0x2d, 0x10, 0xaa, 0x27, 0x00, 0x00,
-  0x31, 0x44, 0xa5, 0x32, 0x80, 0x00,
-  0xc0, 0x23, 0x62, 0x61, 0x80, 0x00,
-  0x11, 0x25, 0x3c, 0x5c, 0x00, 0x00,
-  0xe8, 0x80, 0x51, 0x35, 0x00, 0x00,
-  0x45, 0x15, 0x51, 0x84, 0x80, 0x00,
-  0x22, 0x22, 0xa2, 0x27, 0x00, 0x00,
-  0x96, 0x0c, 0x95, 0x51, 0x80, 0x00,
-  0x0c, 0x50, 0x4a, 0x1a, 0x00, 0x00,
-  0x62, 0x04, 0x30, 0x68, 0x00, 0x00,
-  0x49, 0x06, 0x2c, 0x89, 0x00, 0x00,
-  0x11, 0x82, 0x15, 0x8c, 0x00, 0x00,
-  0x12, 0x38, 0x8a, 0x47, 0x00, 0x00,
-  0x40, 0x71, 0x25, 0x81, 0x80, 0x00,
-  0xa8, 0x8a, 0x62, 0x12, 0x80, 0x00,
-  0x08, 0xa1, 0x58, 0x58, 0x00, 0x00,
-  0xa0, 0xc0, 0x0e, 0x28, 0x80, 0x00,
-  0xc5, 0x10, 0x83, 0x34, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom33_26[156] = {
-  0x45, 0x15, 0x51, 0x84, 0x80, 0x00,
-  0x22, 0x22, 0xa2, 0x27, 0x00, 0x00,
-  0x96, 0x0c, 0x95, 0x51, 0x80, 0x00,
-  0x0c, 0x50, 0x4a, 0x1a, 0x00, 0x00,
-  0x62, 0x04, 0x30, 0x68, 0x00, 0x00,
-  0x49, 0x06, 0x2c, 0x89, 0x00, 0x00,
-  0x11, 0x82, 0x15, 0x8c, 0x00, 0x00,
-  0x12, 0x38, 0x8a, 0x47, 0x00, 0x00,
-  0x40, 0x71, 0x25, 0x81, 0x80, 0x00,
-  0xa8, 0x8a, 0x62, 0x12, 0x80, 0x00,
-  0x08, 0xa1, 0x58, 0x58, 0x00, 0x00,
-  0xa0, 0xc0, 0x0e, 0x28, 0x80, 0x00,
-  0xc5, 0x10, 0x83, 0x34, 0x00, 0x00,
-  0x84, 0x31, 0x51, 0x84, 0x80, 0x00,
-  0x18, 0xa2, 0xa2, 0x27, 0x00, 0x00,
-  0x4e, 0x01, 0x95, 0x51, 0x80, 0x00,
-  0x44, 0xc8, 0x4a, 0x1a, 0x00, 0x00,
-  0x0e, 0x90, 0x30, 0x68, 0x00, 0x00,
-  0x20, 0xcc, 0x2c, 0x89, 0x00, 0x00,
-  0x93, 0x40, 0x55, 0x8c, 0x80, 0x00,
-  0x2d, 0x10, 0xaa, 0x27, 0x00, 0x00,
-  0x31, 0x44, 0xa5, 0x32, 0x80, 0x00,
-  0xc0, 0x23, 0x62, 0x61, 0x80, 0x00,
-  0x11, 0x25, 0x3c, 0x5c, 0x00, 0x00,
-  0xe8, 0x80, 0x51, 0x35, 0x00, 0x00,
-  0xa4, 0xa4, 0xfc, 0x91, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom33_27[162] = {
-  0x45, 0x15, 0x51, 0x84, 0x80, 0x00,
-  0x22, 0x22, 0xa2, 0x27, 0x00, 0x00,
-  0x96, 0x0c, 0x95, 0x51, 0x80, 0x00,
-  0x0c, 0x50, 0x4a, 0x1a, 0x00, 0x00,
-  0x62, 0x04, 0x30, 0x68, 0x00, 0x00,
-  0x49, 0x06, 0x2c, 0x89, 0x00, 0x00,
-  0x11, 0x82, 0x15, 0x8c, 0x00, 0x00,
-  0x12, 0x38, 0x8a, 0x47, 0x00, 0x00,
-  0x40, 0x71, 0x25, 0x81, 0x80, 0x00,
-  0xa8, 0x8a, 0x62, 0x12, 0x80, 0x00,
-  0x08, 0xa1, 0x58, 0x58, 0x00, 0x00,
-  0xa0, 0xc0, 0x0e, 0x28, 0x80, 0x00,
-  0xc5, 0x10, 0x83, 0x34, 0x00, 0x00,
-  0x45, 0x51, 0x15, 0x8c, 0x00, 0x00,
-  0x22, 0x0a, 0x8a, 0x47, 0x00, 0x00,
-  0x84, 0xd0, 0x25, 0x81, 0x80, 0x00,
-  0x0c, 0x8a, 0x62, 0x12, 0x80, 0x00,
-  0x18, 0x06, 0x58, 0x58, 0x00, 0x00,
-  0x30, 0x03, 0x0e, 0x28, 0x80, 0x00,
-  0x61, 0x08, 0x83, 0x34, 0x00, 0x00,
-  0x40, 0x11, 0x51, 0x84, 0x80, 0x00,
-  0x10, 0x2c, 0xa2, 0x27, 0x00, 0x00,
-  0x09, 0x60, 0x95, 0x51, 0x80, 0x00,
-  0x00, 0x94, 0x4a, 0x1a, 0x00, 0x00,
-  0x52, 0x40, 0x30, 0x68, 0x00, 0x00,
-  0xa4, 0x24, 0x2c, 0x89, 0x00, 0x00,
-  0x82, 0x88, 0xb0, 0xde, 0x80, 0x00
-};
-
-const uint8_t kMaskRandom33_28[168] = {
-  0x45, 0x51, 0x15, 0x8c, 0x00, 0x00,
-  0x22, 0x0a, 0x8a, 0x47, 0x00, 0x00,
-  0x84, 0xd0, 0x25, 0x81, 0x80, 0x00,
-  0x0c, 0x8a, 0x62, 0x12, 0x80, 0x00,
-  0x18, 0x06, 0x58, 0x58, 0x00, 0x00,
-  0x30, 0x03, 0x0e, 0x28, 0x80, 0x00,
-  0x61, 0x08, 0x83, 0x34, 0x00, 0x00,
-  0x40, 0x11, 0x51, 0x84, 0x80, 0x00,
-  0x10, 0x2c, 0xa2, 0x27, 0x00, 0x00,
-  0x09, 0x60, 0x95, 0x51, 0x80, 0x00,
-  0x00, 0x94, 0x4a, 0x1a, 0x00, 0x00,
-  0x52, 0x40, 0x30, 0x68, 0x00, 0x00,
-  0xa4, 0x24, 0x2c, 0x89, 0x00, 0x00,
-  0x82, 0x88, 0xb0, 0xde, 0x80, 0x00,
-  0x45, 0x15, 0x51, 0x84, 0x80, 0x00,
-  0x22, 0x22, 0xa2, 0x27, 0x00, 0x00,
-  0x96, 0x0c, 0x95, 0x51, 0x80, 0x00,
-  0x0c, 0x50, 0x4a, 0x1a, 0x00, 0x00,
-  0x62, 0x04, 0x30, 0x68, 0x00, 0x00,
-  0x49, 0x06, 0x2c, 0x89, 0x00, 0x00,
-  0x11, 0x82, 0x15, 0x8c, 0x00, 0x00,
-  0x12, 0x38, 0x8a, 0x47, 0x00, 0x00,
-  0x40, 0x71, 0x25, 0x81, 0x80, 0x00,
-  0xa8, 0x8a, 0x62, 0x12, 0x80, 0x00,
-  0x08, 0xa1, 0x58, 0x58, 0x00, 0x00,
-  0xa0, 0xc0, 0x0e, 0x28, 0x80, 0x00,
-  0xc5, 0x10, 0x83, 0x34, 0x00, 0x00,
-  0x1b, 0xf4, 0xaa, 0xec, 0x80, 0x00
-};
-
-const uint8_t kMaskRandom33_29[174] = {
-  0x45, 0x51, 0x15, 0x8c, 0x00, 0x00,
-  0x22, 0x0a, 0x8a, 0x47, 0x00, 0x00,
-  0x84, 0xd0, 0x25, 0x81, 0x80, 0x00,
-  0x0c, 0x8a, 0x62, 0x12, 0x80, 0x00,
-  0x18, 0x06, 0x58, 0x58, 0x00, 0x00,
-  0x30, 0x03, 0x0e, 0x28, 0x80, 0x00,
-  0x61, 0x08, 0x83, 0x34, 0x00, 0x00,
-  0x40, 0x11, 0x51, 0x84, 0x80, 0x00,
-  0x10, 0x2c, 0xa2, 0x27, 0x00, 0x00,
-  0x09, 0x60, 0x95, 0x51, 0x80, 0x00,
-  0x00, 0x94, 0x4a, 0x1a, 0x00, 0x00,
-  0x52, 0x40, 0x30, 0x68, 0x00, 0x00,
-  0xa4, 0x24, 0x2c, 0x89, 0x00, 0x00,
-  0x82, 0x88, 0xb0, 0xde, 0x80, 0x00,
-  0x55, 0x11, 0x15, 0x8c, 0x00, 0x00,
-  0x22, 0x22, 0x8a, 0x47, 0x00, 0x00,
-  0x11, 0x11, 0x25, 0x81, 0x80, 0x00,
-  0x80, 0x45, 0x62, 0x12, 0x80, 0x00,
-  0x20, 0x1a, 0x58, 0x58, 0x00, 0x00,
-  0x08, 0x68, 0x0e, 0x28, 0x80, 0x00,
-  0x22, 0x84, 0x83, 0x34, 0x00, 0x00,
-  0x48, 0x09, 0x25, 0x2c, 0x00, 0x00,
-  0x07, 0x01, 0x8a, 0x91, 0x00, 0x00,
-  0x94, 0x20, 0x91, 0xc0, 0x80, 0x00,
-  0x82, 0x06, 0x68, 0x06, 0x80, 0x00,
-  0x60, 0x48, 0x32, 0xc8, 0x00, 0x00,
-  0x89, 0x80, 0x43, 0x45, 0x00, 0x00,
-  0x00, 0x8e, 0xc4, 0x30, 0x80, 0x00,
-  0x18, 0x22, 0x1c, 0xa2, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom33_3[18] = {
-  0xad, 0x2d, 0xcd, 0xcc, 0x00, 0x00,
-  0x76, 0x36, 0x97, 0x27, 0x00, 0x00,
-  0x26, 0xdb, 0xb8, 0xd1, 0x80, 0x00
-};
-
-const uint8_t kMaskRandom33_30[180] = {
-  0x55, 0x11, 0x15, 0x8c, 0x00, 0x00,
-  0x22, 0x22, 0x8a, 0x47, 0x00, 0x00,
-  0x11, 0x11, 0x25, 0x81, 0x80, 0x00,
-  0x80, 0x45, 0x62, 0x12, 0x80, 0x00,
-  0x20, 0x1a, 0x58, 0x58, 0x00, 0x00,
-  0x08, 0x68, 0x0e, 0x28, 0x80, 0x00,
-  0x22, 0x84, 0x83, 0x34, 0x00, 0x00,
-  0x48, 0x09, 0x25, 0x2c, 0x00, 0x00,
-  0x07, 0x01, 0x8a, 0x91, 0x00, 0x00,
-  0x94, 0x20, 0x91, 0xc0, 0x80, 0x00,
-  0x82, 0x06, 0x68, 0x06, 0x80, 0x00,
-  0x60, 0x48, 0x32, 0xc8, 0x00, 0x00,
-  0x89, 0x80, 0x43, 0x45, 0x00, 0x00,
-  0x00, 0x8e, 0xc4, 0x30, 0x80, 0x00,
-  0x18, 0x22, 0x1c, 0xa2, 0x00, 0x00,
-  0x45, 0x51, 0x15, 0x8c, 0x00, 0x00,
-  0x22, 0x0a, 0x8a, 0x47, 0x00, 0x00,
-  0x84, 0xd0, 0x25, 0x81, 0x80, 0x00,
-  0x0c, 0x8a, 0x62, 0x12, 0x80, 0x00,
-  0x18, 0x06, 0x58, 0x58, 0x00, 0x00,
-  0x30, 0x03, 0x0e, 0x28, 0x80, 0x00,
-  0x61, 0x08, 0x83, 0x34, 0x00, 0x00,
-  0x40, 0x11, 0x51, 0x84, 0x80, 0x00,
-  0x10, 0x2c, 0xa2, 0x27, 0x00, 0x00,
-  0x09, 0x60, 0x95, 0x51, 0x80, 0x00,
-  0x00, 0x94, 0x4a, 0x1a, 0x00, 0x00,
-  0x52, 0x40, 0x30, 0x68, 0x00, 0x00,
-  0xa4, 0x24, 0x2c, 0x89, 0x00, 0x00,
-  0x82, 0x88, 0xb0, 0xde, 0x80, 0x00,
-  0x6d, 0xd2, 0x8c, 0x00, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom33_31[186] = {
-  0x55, 0x11, 0x15, 0x8c, 0x00, 0x00,
-  0x22, 0x22, 0x8a, 0x47, 0x00, 0x00,
-  0x11, 0x11, 0x25, 0x81, 0x80, 0x00,
-  0x80, 0x45, 0x62, 0x12, 0x80, 0x00,
-  0x20, 0x1a, 0x58, 0x58, 0x00, 0x00,
-  0x08, 0x68, 0x0e, 0x28, 0x80, 0x00,
-  0x22, 0x84, 0x83, 0x34, 0x00, 0x00,
-  0x48, 0x09, 0x25, 0x2c, 0x00, 0x00,
-  0x07, 0x01, 0x8a, 0x91, 0x00, 0x00,
-  0x94, 0x20, 0x91, 0xc0, 0x80, 0x00,
-  0x82, 0x06, 0x68, 0x06, 0x80, 0x00,
-  0x60, 0x48, 0x32, 0xc8, 0x00, 0x00,
-  0x89, 0x80, 0x43, 0x45, 0x00, 0x00,
-  0x00, 0x8e, 0xc4, 0x30, 0x80, 0x00,
-  0x18, 0x22, 0x1c, 0xa2, 0x00, 0x00,
-  0xa4, 0x10, 0x25, 0x2c, 0x00, 0x00,
-  0x01, 0x2a, 0x8a, 0x91, 0x00, 0x00,
-  0x06, 0x42, 0x91, 0xc0, 0x80, 0x00,
-  0x08, 0x68, 0x68, 0x06, 0x80, 0x00,
-  0x81, 0x90, 0x32, 0xc8, 0x00, 0x00,
-  0x00, 0xf0, 0x43, 0x45, 0x00, 0x00,
-  0x50, 0x05, 0xc4, 0x30, 0x80, 0x00,
-  0x20, 0x51, 0x1c, 0xa2, 0x00, 0x00,
-  0x43, 0x08, 0x15, 0x8c, 0x00, 0x00,
-  0x68, 0x80, 0x8a, 0x47, 0x00, 0x00,
-  0x80, 0x0b, 0x25, 0x81, 0x80, 0x00,
-  0x10, 0x4c, 0x62, 0x12, 0x80, 0x00,
-  0x12, 0x30, 0x58, 0x58, 0x00, 0x00,
-  0x40, 0x85, 0x0e, 0x28, 0x80, 0x00,
-  0x0e, 0x04, 0x83, 0x34, 0x00, 0x00,
-  0x18, 0x12, 0x0a, 0x1c, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom33_32[192] = {
-  0xa4, 0x10, 0x25, 0x2c, 0x00, 0x00,
-  0x01, 0x2a, 0x8a, 0x91, 0x00, 0x00,
-  0x06, 0x42, 0x91, 0xc0, 0x80, 0x00,
-  0x08, 0x68, 0x68, 0x06, 0x80, 0x00,
-  0x81, 0x90, 0x32, 0xc8, 0x00, 0x00,
-  0x00, 0xf0, 0x43, 0x45, 0x00, 0x00,
-  0x50, 0x05, 0xc4, 0x30, 0x80, 0x00,
-  0x20, 0x51, 0x1c, 0xa2, 0x00, 0x00,
-  0x43, 0x08, 0x15, 0x8c, 0x00, 0x00,
-  0x68, 0x80, 0x8a, 0x47, 0x00, 0x00,
-  0x80, 0x0b, 0x25, 0x81, 0x80, 0x00,
-  0x10, 0x4c, 0x62, 0x12, 0x80, 0x00,
-  0x12, 0x30, 0x58, 0x58, 0x00, 0x00,
-  0x40, 0x85, 0x0e, 0x28, 0x80, 0x00,
-  0x0e, 0x04, 0x83, 0x34, 0x00, 0x00,
-  0x18, 0x12, 0x0a, 0x1c, 0x00, 0x00,
-  0x55, 0x11, 0x15, 0x8c, 0x00, 0x00,
-  0x22, 0x22, 0x8a, 0x47, 0x00, 0x00,
-  0x11, 0x11, 0x25, 0x81, 0x80, 0x00,
-  0x80, 0x45, 0x62, 0x12, 0x80, 0x00,
-  0x20, 0x1a, 0x58, 0x58, 0x00, 0x00,
-  0x08, 0x68, 0x0e, 0x28, 0x80, 0x00,
-  0x22, 0x84, 0x83, 0x34, 0x00, 0x00,
-  0x48, 0x09, 0x25, 0x2c, 0x00, 0x00,
-  0x07, 0x01, 0x8a, 0x91, 0x00, 0x00,
-  0x94, 0x20, 0x91, 0xc0, 0x80, 0x00,
-  0x82, 0x06, 0x68, 0x06, 0x80, 0x00,
-  0x60, 0x48, 0x32, 0xc8, 0x00, 0x00,
-  0x89, 0x80, 0x43, 0x45, 0x00, 0x00,
-  0x00, 0x8e, 0xc4, 0x30, 0x80, 0x00,
-  0x18, 0x22, 0x1c, 0xa2, 0x00, 0x00,
-  0x73, 0x8e, 0x12, 0xca, 0x80, 0x00
-};
-
-const uint8_t kMaskRandom33_33[198] = {
-  0xa4, 0x10, 0x25, 0x2c, 0x00, 0x00,
-  0x01, 0x2a, 0x8a, 0x91, 0x00, 0x00,
-  0x06, 0x42, 0x91, 0xc0, 0x80, 0x00,
-  0x08, 0x68, 0x68, 0x06, 0x80, 0x00,
-  0x81, 0x90, 0x32, 0xc8, 0x00, 0x00,
-  0x00, 0xf0, 0x43, 0x45, 0x00, 0x00,
-  0x50, 0x05, 0xc4, 0x30, 0x80, 0x00,
-  0x20, 0x51, 0x1c, 0xa2, 0x00, 0x00,
-  0x43, 0x08, 0x15, 0x8c, 0x00, 0x00,
-  0x68, 0x80, 0x8a, 0x47, 0x00, 0x00,
-  0x80, 0x0b, 0x25, 0x81, 0x80, 0x00,
-  0x10, 0x4c, 0x62, 0x12, 0x80, 0x00,
-  0x12, 0x30, 0x58, 0x58, 0x00, 0x00,
-  0x40, 0x85, 0x0e, 0x28, 0x80, 0x00,
-  0x0e, 0x04, 0x83, 0x34, 0x00, 0x00,
-  0x18, 0x12, 0x0a, 0x1c, 0x00, 0x00,
-  0xa4, 0x10, 0x25, 0x2c, 0x00, 0x00,
-  0x01, 0x2a, 0x8a, 0x91, 0x00, 0x00,
-  0x06, 0x42, 0x91, 0xc0, 0x80, 0x00,
-  0x08, 0x68, 0x68, 0x06, 0x80, 0x00,
-  0x81, 0x90, 0x32, 0xc8, 0x00, 0x00,
-  0x00, 0xf0, 0x43, 0x45, 0x00, 0x00,
-  0x50, 0x05, 0xc4, 0x30, 0x80, 0x00,
-  0x20, 0x51, 0x1c, 0xa2, 0x00, 0x00,
-  0x43, 0x08, 0x25, 0x4c, 0x00, 0x00,
-  0x68, 0x80, 0x8a, 0x66, 0x00, 0x00,
-  0x80, 0x0b, 0x91, 0x91, 0x00, 0x00,
-  0x10, 0x4c, 0x68, 0x42, 0x80, 0x00,
-  0x12, 0x30, 0x32, 0xa4, 0x00, 0x00,
-  0x40, 0x85, 0x43, 0x13, 0x00, 0x00,
-  0x0e, 0x04, 0xc4, 0x30, 0x80, 0x00,
-  0x18, 0x12, 0x1c, 0x88, 0x80, 0x00,
-  0xdb, 0x10, 0x3c, 0x09, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom33_4[24] = {
-  0x55, 0x55, 0xca, 0xec, 0x00, 0x00,
-  0xaa, 0xaa, 0xa9, 0x67, 0x00, 0x00,
-  0x35, 0x35, 0x3a, 0xb1, 0x80, 0x00,
-  0xca, 0xca, 0x55, 0x5a, 0x80, 0x00
-};
-
-const uint8_t kMaskRandom33_5[30] = {
-  0x55, 0x55, 0x55, 0x44, 0x80, 0x00,
-  0x2a, 0x2a, 0x2a, 0x66, 0x00, 0x00,
-  0x24, 0x25, 0x25, 0xa1, 0x80, 0x00,
-  0x84, 0xc8, 0xe2, 0x12, 0x80, 0x00,
-  0x10, 0xb6, 0x99, 0x98, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom33_6[36] = {
-  0x51, 0x51, 0xd1, 0x4c, 0x00, 0x00,
-  0x0a, 0x2a, 0xa2, 0xc5, 0x00, 0x00,
-  0xa2, 0x15, 0x95, 0x30, 0x80, 0x00,
-  0x84, 0x4a, 0xca, 0x0a, 0x80, 0x00,
-  0x30, 0x92, 0xa4, 0xaa, 0x00, 0x00,
-  0x04, 0xac, 0x78, 0x15, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom33_7[42] = {
-  0x45, 0x51, 0x15, 0x44, 0x80, 0x00,
-  0x22, 0x2a, 0x8a, 0x23, 0x00, 0x00,
-  0x91, 0x11, 0x85, 0x91, 0x00, 0x00,
-  0x2e, 0x08, 0x32, 0x0a, 0x80, 0x00,
-  0x48, 0x34, 0x58, 0x34, 0x00, 0x00,
-  0x90, 0x29, 0x2c, 0x0d, 0x00, 0x00,
-  0x09, 0x86, 0x43, 0xc8, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom33_8[48] = {
-  0x20, 0x54, 0x64, 0x16, 0x00, 0x00,
-  0x18, 0x88, 0xa2, 0xc2, 0x00, 0x00,
-  0x84, 0x07, 0x51, 0x60, 0x80, 0x00,
-  0x60, 0x48, 0x4a, 0x85, 0x00, 0x00,
-  0x12, 0x82, 0x38, 0x4c, 0x00, 0x00,
-  0x81, 0x41, 0x89, 0x29, 0x00, 0x00,
-  0x40, 0x62, 0x07, 0x11, 0x80, 0x00,
-  0x16, 0x30, 0x94, 0xb0, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom33_9[54] = {
-  0x55, 0x51, 0x8e, 0xcc, 0x00, 0x00,
-  0x22, 0x2a, 0x6a, 0x2b, 0x00, 0x00,
-  0x05, 0x85, 0x36, 0x32, 0x80, 0x00,
-  0x09, 0x4a, 0xd1, 0x25, 0x80, 0x00,
-  0x84, 0x32, 0x55, 0x8c, 0x80, 0x00,
-  0xc0, 0x0d, 0xaa, 0x27, 0x00, 0x00,
-  0x20, 0xa6, 0xa5, 0x32, 0x80, 0x00,
-  0x1a, 0x09, 0x62, 0x61, 0x80, 0x00,
-  0x44, 0x64, 0x3c, 0x5c, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom34_1[6] = {
-  0xff, 0xff, 0xff, 0xff, 0xc0, 0x00
-};
-
-const uint8_t kMaskRandom34_10[60] = {
-  0x55, 0x8c, 0xaa, 0xc6, 0x40, 0x00,
-  0xaa, 0x27, 0x55, 0x13, 0x80, 0x00,
-  0xa5, 0x32, 0xd2, 0x99, 0x40, 0x00,
-  0x62, 0x61, 0xb1, 0x30, 0xc0, 0x00,
-  0x3c, 0x5c, 0x1e, 0x2e, 0x00, 0x00,
-  0x8e, 0xcc, 0x47, 0x66, 0x00, 0x00,
-  0x6a, 0x2b, 0x35, 0x15, 0x80, 0x00,
-  0x36, 0x32, 0x9b, 0x19, 0x40, 0x00,
-  0xd1, 0x25, 0xe8, 0x92, 0xc0, 0x00,
-  0xc8, 0x02, 0xe4, 0x01, 0x40, 0x00
-};
-
-const uint8_t kMaskRandom34_11[66] = {
-  0x55, 0x8c, 0xaa, 0xc6, 0x40, 0x00,
-  0xaa, 0x27, 0x55, 0x13, 0x80, 0x00,
-  0xa5, 0x32, 0xd2, 0x99, 0x40, 0x00,
-  0x62, 0x61, 0xb1, 0x30, 0xc0, 0x00,
-  0x3c, 0x5c, 0x1e, 0x2e, 0x00, 0x00,
-  0x51, 0x84, 0xa8, 0xc2, 0x40, 0x00,
-  0xa2, 0x27, 0x51, 0x13, 0x80, 0x00,
-  0x95, 0x51, 0xca, 0xa8, 0xc0, 0x00,
-  0x4a, 0x1a, 0x25, 0x0d, 0x00, 0x00,
-  0x30, 0x68, 0x18, 0x34, 0x00, 0x00,
-  0x2c, 0x89, 0x16, 0x44, 0x80, 0x00
-};
-
-const uint8_t kMaskRandom34_12[72] = {
-  0x51, 0x84, 0xa8, 0xc2, 0x40, 0x00,
-  0xa2, 0x27, 0x51, 0x13, 0x80, 0x00,
-  0x95, 0x51, 0xca, 0xa8, 0xc0, 0x00,
-  0x4a, 0x1a, 0x25, 0x0d, 0x00, 0x00,
-  0x30, 0x68, 0x18, 0x34, 0x00, 0x00,
-  0x2c, 0x89, 0x16, 0x44, 0x80, 0x00,
-  0x55, 0x8c, 0xaa, 0xc6, 0x40, 0x00,
-  0xaa, 0x27, 0x55, 0x13, 0x80, 0x00,
-  0xa5, 0x32, 0xd2, 0x99, 0x40, 0x00,
-  0x62, 0x61, 0xb1, 0x30, 0xc0, 0x00,
-  0x3c, 0x5c, 0x1e, 0x2e, 0x00, 0x00,
-  0x51, 0x35, 0x28, 0x9a, 0x80, 0x00
-};
-
-const uint8_t kMaskRandom34_13[78] = {
-  0x51, 0x84, 0xa8, 0xc2, 0x40, 0x00,
-  0xa2, 0x27, 0x51, 0x13, 0x80, 0x00,
-  0x95, 0x51, 0xca, 0xa8, 0xc0, 0x00,
-  0x4a, 0x1a, 0x25, 0x0d, 0x00, 0x00,
-  0x30, 0x68, 0x18, 0x34, 0x00, 0x00,
-  0x2c, 0x89, 0x16, 0x44, 0x80, 0x00,
-  0x15, 0x8c, 0x0a, 0xc6, 0x00, 0x00,
-  0x8a, 0x47, 0x45, 0x23, 0x80, 0x00,
-  0x25, 0x81, 0x92, 0xc0, 0xc0, 0x00,
-  0x62, 0x12, 0xb1, 0x09, 0x40, 0x00,
-  0x58, 0x58, 0x2c, 0x2c, 0x00, 0x00,
-  0x0e, 0x28, 0x87, 0x14, 0x40, 0x00,
-  0x83, 0x34, 0x41, 0x9a, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom34_14[84] = {
-  0x15, 0x8c, 0x0a, 0xc6, 0x00, 0x00,
-  0x8a, 0x47, 0x45, 0x23, 0x80, 0x00,
-  0x25, 0x81, 0x92, 0xc0, 0xc0, 0x00,
-  0x62, 0x12, 0xb1, 0x09, 0x40, 0x00,
-  0x58, 0x58, 0x2c, 0x2c, 0x00, 0x00,
-  0x0e, 0x28, 0x87, 0x14, 0x40, 0x00,
-  0x83, 0x34, 0x41, 0x9a, 0x00, 0x00,
-  0x51, 0x84, 0xa8, 0xc2, 0x40, 0x00,
-  0xa2, 0x27, 0x51, 0x13, 0x80, 0x00,
-  0x95, 0x51, 0xca, 0xa8, 0xc0, 0x00,
-  0x4a, 0x1a, 0x25, 0x0d, 0x00, 0x00,
-  0x30, 0x68, 0x18, 0x34, 0x00, 0x00,
-  0x2c, 0x89, 0x16, 0x44, 0x80, 0x00,
-  0xb0, 0xde, 0xd8, 0x6f, 0x40, 0x00
-};
-
-const uint8_t kMaskRandom34_15[90] = {
-  0x15, 0x8c, 0x0a, 0xc6, 0x00, 0x00,
-  0x8a, 0x47, 0x45, 0x23, 0x80, 0x00,
-  0x25, 0x81, 0x92, 0xc0, 0xc0, 0x00,
-  0x62, 0x12, 0xb1, 0x09, 0x40, 0x00,
-  0x58, 0x58, 0x2c, 0x2c, 0x00, 0x00,
-  0x0e, 0x28, 0x87, 0x14, 0x40, 0x00,
-  0x83, 0x34, 0x41, 0x9a, 0x00, 0x00,
-  0x25, 0x2c, 0x12, 0x96, 0x00, 0x00,
-  0x8a, 0x91, 0x45, 0x48, 0x80, 0x00,
-  0x91, 0xc0, 0xc8, 0xe0, 0x40, 0x00,
-  0x68, 0x06, 0xb4, 0x03, 0x40, 0x00,
-  0x32, 0xc8, 0x19, 0x64, 0x00, 0x00,
-  0x43, 0x45, 0x21, 0xa2, 0x80, 0x00,
-  0xc4, 0x30, 0xe2, 0x18, 0x40, 0x00,
-  0x1c, 0xa2, 0x0e, 0x51, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom34_16[96] = {
-  0x25, 0x2c, 0x12, 0x96, 0x00, 0x00,
-  0x8a, 0x91, 0x45, 0x48, 0x80, 0x00,
-  0x91, 0xc0, 0xc8, 0xe0, 0x40, 0x00,
-  0x68, 0x06, 0xb4, 0x03, 0x40, 0x00,
-  0x32, 0xc8, 0x19, 0x64, 0x00, 0x00,
-  0x43, 0x45, 0x21, 0xa2, 0x80, 0x00,
-  0xc4, 0x30, 0xe2, 0x18, 0x40, 0x00,
-  0x1c, 0xa2, 0x0e, 0x51, 0x00, 0x00,
-  0x15, 0x8c, 0x0a, 0xc6, 0x00, 0x00,
-  0x8a, 0x47, 0x45, 0x23, 0x80, 0x00,
-  0x25, 0x81, 0x92, 0xc0, 0xc0, 0x00,
-  0x62, 0x12, 0xb1, 0x09, 0x40, 0x00,
-  0x58, 0x58, 0x2c, 0x2c, 0x00, 0x00,
-  0x0e, 0x28, 0x87, 0x14, 0x40, 0x00,
-  0x83, 0x34, 0x41, 0x9a, 0x00, 0x00,
-  0x0a, 0x1c, 0x05, 0x0e, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom34_17[102] = {
-  0x25, 0x2c, 0x12, 0x96, 0x00, 0x00,
-  0x8a, 0x91, 0x45, 0x48, 0x80, 0x00,
-  0x91, 0xc0, 0xc8, 0xe0, 0x40, 0x00,
-  0x68, 0x06, 0xb4, 0x03, 0x40, 0x00,
-  0x32, 0xc8, 0x19, 0x64, 0x00, 0x00,
-  0x43, 0x45, 0x21, 0xa2, 0x80, 0x00,
-  0xc4, 0x30, 0xe2, 0x18, 0x40, 0x00,
-  0x1c, 0xa2, 0x0e, 0x51, 0x00, 0x00,
-  0x25, 0x4c, 0x12, 0xa6, 0x00, 0x00,
-  0x8a, 0x66, 0x45, 0x33, 0x00, 0x00,
-  0x91, 0x91, 0x48, 0xc8, 0x80, 0x00,
-  0x68, 0x42, 0xb4, 0x21, 0x40, 0x00,
-  0x32, 0xa4, 0x19, 0x52, 0x00, 0x00,
-  0x43, 0x13, 0x21, 0x89, 0x80, 0x00,
-  0xc4, 0x30, 0xe2, 0x18, 0x40, 0x00,
-  0x1c, 0x88, 0x8e, 0x44, 0x40, 0x00,
-  0x3c, 0x09, 0x1e, 0x04, 0x80, 0x00
-};
-
-const uint8_t kMaskRandom34_18[108] = {
-  0x8e, 0xcc, 0x47, 0x66, 0x00, 0x00,
-  0x6a, 0x2b, 0x35, 0x15, 0x80, 0x00,
-  0x36, 0x32, 0x9b, 0x19, 0x40, 0x00,
-  0xd1, 0x25, 0xe8, 0x92, 0xc0, 0x00,
-  0x55, 0x8c, 0xaa, 0xc6, 0x40, 0x00,
-  0xaa, 0x27, 0x55, 0x13, 0x80, 0x00,
-  0xa5, 0x32, 0xd2, 0x99, 0x40, 0x00,
-  0x62, 0x61, 0xb1, 0x30, 0xc0, 0x00,
-  0x3c, 0x5c, 0x1e, 0x2e, 0x00, 0x00,
-  0x64, 0x16, 0x32, 0x0b, 0x00, 0x00,
-  0xa2, 0xc2, 0x51, 0x61, 0x00, 0x00,
-  0x51, 0x60, 0xa8, 0xb0, 0x40, 0x00,
-  0x4a, 0x85, 0x25, 0x42, 0x80, 0x00,
-  0x38, 0x4c, 0x1c, 0x26, 0x00, 0x00,
-  0x89, 0x29, 0x44, 0x94, 0x80, 0x00,
-  0x07, 0x11, 0x83, 0x88, 0xc0, 0x00,
-  0x94, 0xb0, 0x4a, 0x58, 0x00, 0x00,
-  0x89, 0x70, 0xf3, 0xf7, 0x40, 0x00
-};
-
-const uint8_t kMaskRandom34_19[114] = {
-  0x8e, 0xcc, 0x47, 0x66, 0x00, 0x00,
-  0x6a, 0x2b, 0x35, 0x15, 0x80, 0x00,
-  0x36, 0x32, 0x9b, 0x19, 0x40, 0x00,
-  0xd1, 0x25, 0xe8, 0x92, 0xc0, 0x00,
-  0x55, 0x8c, 0xaa, 0xc6, 0x40, 0x00,
-  0xaa, 0x27, 0x55, 0x13, 0x80, 0x00,
-  0xa5, 0x32, 0xd2, 0x99, 0x40, 0x00,
-  0x62, 0x61, 0xb1, 0x30, 0xc0, 0x00,
-  0x3c, 0x5c, 0x1e, 0x2e, 0x00, 0x00,
-  0x55, 0x8c, 0xaa, 0xc6, 0x40, 0x00,
-  0xaa, 0x27, 0x55, 0x13, 0x80, 0x00,
-  0xa5, 0x32, 0xd2, 0x99, 0x40, 0x00,
-  0x62, 0x61, 0xb1, 0x30, 0xc0, 0x00,
-  0x3c, 0x5c, 0x1e, 0x2e, 0x00, 0x00,
-  0x8e, 0xcc, 0x47, 0x66, 0x00, 0x00,
-  0x6a, 0x2b, 0x35, 0x15, 0x80, 0x00,
-  0x36, 0x32, 0x9b, 0x19, 0x40, 0x00,
-  0xd1, 0x25, 0xe8, 0x92, 0xc0, 0x00,
-  0xc8, 0x02, 0xe4, 0x01, 0x40, 0x00
-};
-
-const uint8_t kMaskRandom34_2[12] = {
-  0xce, 0xce, 0x67, 0x67, 0x00, 0x00,
-  0xb9, 0x39, 0xdc, 0x9c, 0xc0, 0x00
-};
-
-const uint8_t kMaskRandom34_20[120] = {
-  0x55, 0x8c, 0xaa, 0xc6, 0x40, 0x00,
-  0xaa, 0x27, 0x55, 0x13, 0x80, 0x00,
-  0xa5, 0x32, 0xd2, 0x99, 0x40, 0x00,
-  0x62, 0x61, 0xb1, 0x30, 0xc0, 0x00,
-  0x3c, 0x5c, 0x1e, 0x2e, 0x00, 0x00,
-  0x8e, 0xcc, 0x47, 0x66, 0x00, 0x00,
-  0x6a, 0x2b, 0x35, 0x15, 0x80, 0x00,
-  0x36, 0x32, 0x9b, 0x19, 0x40, 0x00,
-  0xd1, 0x25, 0xe8, 0x92, 0xc0, 0x00,
-  0xc8, 0x02, 0xe4, 0x01, 0x40, 0x00,
-  0x8e, 0xcc, 0x47, 0x66, 0x00, 0x00,
-  0x6a, 0x2b, 0x35, 0x15, 0x80, 0x00,
-  0x36, 0x32, 0x9b, 0x19, 0x40, 0x00,
-  0xd1, 0x25, 0xe8, 0x92, 0xc0, 0x00,
-  0x55, 0x8c, 0xaa, 0xc6, 0x40, 0x00,
-  0xaa, 0x27, 0x55, 0x13, 0x80, 0x00,
-  0xa5, 0x32, 0xd2, 0x99, 0x40, 0x00,
-  0x62, 0x61, 0xb1, 0x30, 0xc0, 0x00,
-  0x3c, 0x5c, 0x1e, 0x2e, 0x00, 0x00,
-  0x5d, 0xc5, 0xfe, 0xd8, 0x40, 0x00
-};
-
-const uint8_t kMaskRandom34_21[126] = {
-  0x55, 0x8c, 0xaa, 0xc6, 0x40, 0x00,
-  0xaa, 0x27, 0x55, 0x13, 0x80, 0x00,
-  0xa5, 0x32, 0xd2, 0x99, 0x40, 0x00,
-  0x62, 0x61, 0xb1, 0x30, 0xc0, 0x00,
-  0x3c, 0x5c, 0x1e, 0x2e, 0x00, 0x00,
-  0x8e, 0xcc, 0x47, 0x66, 0x00, 0x00,
-  0x6a, 0x2b, 0x35, 0x15, 0x80, 0x00,
-  0x36, 0x32, 0x9b, 0x19, 0x40, 0x00,
-  0xd1, 0x25, 0xe8, 0x92, 0xc0, 0x00,
-  0xc8, 0x02, 0xe4, 0x01, 0x40, 0x00,
-  0x55, 0x8c, 0xaa, 0xc6, 0x40, 0x00,
-  0xaa, 0x27, 0x55, 0x13, 0x80, 0x00,
-  0xa5, 0x32, 0xd2, 0x99, 0x40, 0x00,
-  0x62, 0x61, 0xb1, 0x30, 0xc0, 0x00,
-  0x3c, 0x5c, 0x1e, 0x2e, 0x00, 0x00,
-  0x51, 0x84, 0xa8, 0xc2, 0x40, 0x00,
-  0xa2, 0x27, 0x51, 0x13, 0x80, 0x00,
-  0x95, 0x51, 0xca, 0xa8, 0xc0, 0x00,
-  0x4a, 0x1a, 0x25, 0x0d, 0x00, 0x00,
-  0x30, 0x68, 0x18, 0x34, 0x00, 0x00,
-  0x2c, 0x89, 0x16, 0x44, 0x80, 0x00
-};
-
-const uint8_t kMaskRandom34_22[132] = {
-  0x55, 0x8c, 0xaa, 0xc6, 0x40, 0x00,
-  0xaa, 0x27, 0x55, 0x13, 0x80, 0x00,
-  0xa5, 0x32, 0xd2, 0x99, 0x40, 0x00,
-  0x62, 0x61, 0xb1, 0x30, 0xc0, 0x00,
-  0x3c, 0x5c, 0x1e, 0x2e, 0x00, 0x00,
-  0x51, 0x84, 0xa8, 0xc2, 0x40, 0x00,
-  0xa2, 0x27, 0x51, 0x13, 0x80, 0x00,
-  0x95, 0x51, 0xca, 0xa8, 0xc0, 0x00,
-  0x4a, 0x1a, 0x25, 0x0d, 0x00, 0x00,
-  0x30, 0x68, 0x18, 0x34, 0x00, 0x00,
-  0x2c, 0x89, 0x16, 0x44, 0x80, 0x00,
-  0x55, 0x8c, 0xaa, 0xc6, 0x40, 0x00,
-  0xaa, 0x27, 0x55, 0x13, 0x80, 0x00,
-  0xa5, 0x32, 0xd2, 0x99, 0x40, 0x00,
-  0x62, 0x61, 0xb1, 0x30, 0xc0, 0x00,
-  0x3c, 0x5c, 0x1e, 0x2e, 0x00, 0x00,
-  0x8e, 0xcc, 0x47, 0x66, 0x00, 0x00,
-  0x6a, 0x2b, 0x35, 0x15, 0x80, 0x00,
-  0x36, 0x32, 0x9b, 0x19, 0x40, 0x00,
-  0xd1, 0x25, 0xe8, 0x92, 0xc0, 0x00,
-  0xc8, 0x02, 0xe4, 0x01, 0x40, 0x00,
-  0x2a, 0xf7, 0x4f, 0xf5, 0x80, 0x00
-};
-
-const uint8_t kMaskRandom34_23[138] = {
-  0x55, 0x8c, 0xaa, 0xc6, 0x40, 0x00,
-  0xaa, 0x27, 0x55, 0x13, 0x80, 0x00,
-  0xa5, 0x32, 0xd2, 0x99, 0x40, 0x00,
-  0x62, 0x61, 0xb1, 0x30, 0xc0, 0x00,
-  0x3c, 0x5c, 0x1e, 0x2e, 0x00, 0x00,
-  0x51, 0x84, 0xa8, 0xc2, 0x40, 0x00,
-  0xa2, 0x27, 0x51, 0x13, 0x80, 0x00,
-  0x95, 0x51, 0xca, 0xa8, 0xc0, 0x00,
-  0x4a, 0x1a, 0x25, 0x0d, 0x00, 0x00,
-  0x30, 0x68, 0x18, 0x34, 0x00, 0x00,
-  0x2c, 0x89, 0x16, 0x44, 0x80, 0x00,
-  0x51, 0x84, 0xa8, 0xc2, 0x40, 0x00,
-  0xa2, 0x27, 0x51, 0x13, 0x80, 0x00,
-  0x95, 0x51, 0xca, 0xa8, 0xc0, 0x00,
-  0x4a, 0x1a, 0x25, 0x0d, 0x00, 0x00,
-  0x30, 0x68, 0x18, 0x34, 0x00, 0x00,
-  0x2c, 0x89, 0x16, 0x44, 0x80, 0x00,
-  0x55, 0x8c, 0xaa, 0xc6, 0x40, 0x00,
-  0xaa, 0x27, 0x55, 0x13, 0x80, 0x00,
-  0xa5, 0x32, 0xd2, 0x99, 0x40, 0x00,
-  0x62, 0x61, 0xb1, 0x30, 0xc0, 0x00,
-  0x3c, 0x5c, 0x1e, 0x2e, 0x00, 0x00,
-  0x51, 0x35, 0x28, 0x9a, 0x80, 0x00
-};
-
-const uint8_t kMaskRandom34_24[144] = {
-  0x51, 0x84, 0xa8, 0xc2, 0x40, 0x00,
-  0xa2, 0x27, 0x51, 0x13, 0x80, 0x00,
-  0x95, 0x51, 0xca, 0xa8, 0xc0, 0x00,
-  0x4a, 0x1a, 0x25, 0x0d, 0x00, 0x00,
-  0x30, 0x68, 0x18, 0x34, 0x00, 0x00,
-  0x2c, 0x89, 0x16, 0x44, 0x80, 0x00,
-  0x55, 0x8c, 0xaa, 0xc6, 0x40, 0x00,
-  0xaa, 0x27, 0x55, 0x13, 0x80, 0x00,
-  0xa5, 0x32, 0xd2, 0x99, 0x40, 0x00,
-  0x62, 0x61, 0xb1, 0x30, 0xc0, 0x00,
-  0x3c, 0x5c, 0x1e, 0x2e, 0x00, 0x00,
-  0x51, 0x35, 0x28, 0x9a, 0x80, 0x00,
-  0x55, 0x8c, 0xaa, 0xc6, 0x40, 0x00,
-  0xaa, 0x27, 0x55, 0x13, 0x80, 0x00,
-  0xa5, 0x32, 0xd2, 0x99, 0x40, 0x00,
-  0x62, 0x61, 0xb1, 0x30, 0xc0, 0x00,
-  0x3c, 0x5c, 0x1e, 0x2e, 0x00, 0x00,
-  0x51, 0x84, 0xa8, 0xc2, 0x40, 0x00,
-  0xa2, 0x27, 0x51, 0x13, 0x80, 0x00,
-  0x95, 0x51, 0xca, 0xa8, 0xc0, 0x00,
-  0x4a, 0x1a, 0x25, 0x0d, 0x00, 0x00,
-  0x30, 0x68, 0x18, 0x34, 0x00, 0x00,
-  0x2c, 0x89, 0x16, 0x44, 0x80, 0x00,
-  0x4c, 0xb8, 0x04, 0x74, 0xc0, 0x00
-};
-
-const uint8_t kMaskRandom34_25[150] = {
-  0x51, 0x84, 0xa8, 0xc2, 0x40, 0x00,
-  0xa2, 0x27, 0x51, 0x13, 0x80, 0x00,
-  0x95, 0x51, 0xca, 0xa8, 0xc0, 0x00,
-  0x4a, 0x1a, 0x25, 0x0d, 0x00, 0x00,
-  0x30, 0x68, 0x18, 0x34, 0x00, 0x00,
-  0x2c, 0x89, 0x16, 0x44, 0x80, 0x00,
-  0x55, 0x8c, 0xaa, 0xc6, 0x40, 0x00,
-  0xaa, 0x27, 0x55, 0x13, 0x80, 0x00,
-  0xa5, 0x32, 0xd2, 0x99, 0x40, 0x00,
-  0x62, 0x61, 0xb1, 0x30, 0xc0, 0x00,
-  0x3c, 0x5c, 0x1e, 0x2e, 0x00, 0x00,
-  0x51, 0x35, 0x28, 0x9a, 0x80, 0x00,
-  0x51, 0x84, 0xa8, 0xc2, 0x40, 0x00,
-  0xa2, 0x27, 0x51, 0x13, 0x80, 0x00,
-  0x95, 0x51, 0xca, 0xa8, 0xc0, 0x00,
-  0x4a, 0x1a, 0x25, 0x0d, 0x00, 0x00,
-  0x30, 0x68, 0x18, 0x34, 0x00, 0x00,
-  0x2c, 0x89, 0x16, 0x44, 0x80, 0x00,
-  0x15, 0x8c, 0x0a, 0xc6, 0x00, 0x00,
-  0x8a, 0x47, 0x45, 0x23, 0x80, 0x00,
-  0x25, 0x81, 0x92, 0xc0, 0xc0, 0x00,
-  0x62, 0x12, 0xb1, 0x09, 0x40, 0x00,
-  0x58, 0x58, 0x2c, 0x2c, 0x00, 0x00,
-  0x0e, 0x28, 0x87, 0x14, 0x40, 0x00,
-  0x83, 0x34, 0x41, 0x9a, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom34_26[156] = {
-  0x51, 0x84, 0xa8, 0xc2, 0x40, 0x00,
-  0xa2, 0x27, 0x51, 0x13, 0x80, 0x00,
-  0x95, 0x51, 0xca, 0xa8, 0xc0, 0x00,
-  0x4a, 0x1a, 0x25, 0x0d, 0x00, 0x00,
-  0x30, 0x68, 0x18, 0x34, 0x00, 0x00,
-  0x2c, 0x89, 0x16, 0x44, 0x80, 0x00,
-  0x15, 0x8c, 0x0a, 0xc6, 0x00, 0x00,
-  0x8a, 0x47, 0x45, 0x23, 0x80, 0x00,
-  0x25, 0x81, 0x92, 0xc0, 0xc0, 0x00,
-  0x62, 0x12, 0xb1, 0x09, 0x40, 0x00,
-  0x58, 0x58, 0x2c, 0x2c, 0x00, 0x00,
-  0x0e, 0x28, 0x87, 0x14, 0x40, 0x00,
-  0x83, 0x34, 0x41, 0x9a, 0x00, 0x00,
-  0x51, 0x84, 0xa8, 0xc2, 0x40, 0x00,
-  0xa2, 0x27, 0x51, 0x13, 0x80, 0x00,
-  0x95, 0x51, 0xca, 0xa8, 0xc0, 0x00,
-  0x4a, 0x1a, 0x25, 0x0d, 0x00, 0x00,
-  0x30, 0x68, 0x18, 0x34, 0x00, 0x00,
-  0x2c, 0x89, 0x16, 0x44, 0x80, 0x00,
-  0x55, 0x8c, 0xaa, 0xc6, 0x40, 0x00,
-  0xaa, 0x27, 0x55, 0x13, 0x80, 0x00,
-  0xa5, 0x32, 0xd2, 0x99, 0x40, 0x00,
-  0x62, 0x61, 0xb1, 0x30, 0xc0, 0x00,
-  0x3c, 0x5c, 0x1e, 0x2e, 0x00, 0x00,
-  0x51, 0x35, 0x28, 0x9a, 0x80, 0x00,
-  0x95, 0x20, 0xe9, 0xef, 0xc0, 0x00
-};
-
-const uint8_t kMaskRandom34_27[162] = {
-  0x51, 0x84, 0xa8, 0xc2, 0x40, 0x00,
-  0xa2, 0x27, 0x51, 0x13, 0x80, 0x00,
-  0x95, 0x51, 0xca, 0xa8, 0xc0, 0x00,
-  0x4a, 0x1a, 0x25, 0x0d, 0x00, 0x00,
-  0x30, 0x68, 0x18, 0x34, 0x00, 0x00,
-  0x2c, 0x89, 0x16, 0x44, 0x80, 0x00,
-  0x15, 0x8c, 0x0a, 0xc6, 0x00, 0x00,
-  0x8a, 0x47, 0x45, 0x23, 0x80, 0x00,
-  0x25, 0x81, 0x92, 0xc0, 0xc0, 0x00,
-  0x62, 0x12, 0xb1, 0x09, 0x40, 0x00,
-  0x58, 0x58, 0x2c, 0x2c, 0x00, 0x00,
-  0x0e, 0x28, 0x87, 0x14, 0x40, 0x00,
-  0x83, 0x34, 0x41, 0x9a, 0x00, 0x00,
-  0x15, 0x8c, 0x0a, 0xc6, 0x00, 0x00,
-  0x8a, 0x47, 0x45, 0x23, 0x80, 0x00,
-  0x25, 0x81, 0x92, 0xc0, 0xc0, 0x00,
-  0x62, 0x12, 0xb1, 0x09, 0x40, 0x00,
-  0x58, 0x58, 0x2c, 0x2c, 0x00, 0x00,
-  0x0e, 0x28, 0x87, 0x14, 0x40, 0x00,
-  0x83, 0x34, 0x41, 0x9a, 0x00, 0x00,
-  0x51, 0x84, 0xa8, 0xc2, 0x40, 0x00,
-  0xa2, 0x27, 0x51, 0x13, 0x80, 0x00,
-  0x95, 0x51, 0xca, 0xa8, 0xc0, 0x00,
-  0x4a, 0x1a, 0x25, 0x0d, 0x00, 0x00,
-  0x30, 0x68, 0x18, 0x34, 0x00, 0x00,
-  0x2c, 0x89, 0x16, 0x44, 0x80, 0x00,
-  0xb0, 0xde, 0xd8, 0x6f, 0x40, 0x00
-};
-
-const uint8_t kMaskRandom34_28[168] = {
-  0x15, 0x8c, 0x0a, 0xc6, 0x00, 0x00,
-  0x8a, 0x47, 0x45, 0x23, 0x80, 0x00,
-  0x25, 0x81, 0x92, 0xc0, 0xc0, 0x00,
-  0x62, 0x12, 0xb1, 0x09, 0x40, 0x00,
-  0x58, 0x58, 0x2c, 0x2c, 0x00, 0x00,
-  0x0e, 0x28, 0x87, 0x14, 0x40, 0x00,
-  0x83, 0x34, 0x41, 0x9a, 0x00, 0x00,
-  0x51, 0x84, 0xa8, 0xc2, 0x40, 0x00,
-  0xa2, 0x27, 0x51, 0x13, 0x80, 0x00,
-  0x95, 0x51, 0xca, 0xa8, 0xc0, 0x00,
-  0x4a, 0x1a, 0x25, 0x0d, 0x00, 0x00,
-  0x30, 0x68, 0x18, 0x34, 0x00, 0x00,
-  0x2c, 0x89, 0x16, 0x44, 0x80, 0x00,
-  0xb0, 0xde, 0xd8, 0x6f, 0x40, 0x00,
-  0x51, 0x84, 0xa8, 0xc2, 0x40, 0x00,
-  0xa2, 0x27, 0x51, 0x13, 0x80, 0x00,
-  0x95, 0x51, 0xca, 0xa8, 0xc0, 0x00,
-  0x4a, 0x1a, 0x25, 0x0d, 0x00, 0x00,
-  0x30, 0x68, 0x18, 0x34, 0x00, 0x00,
-  0x2c, 0x89, 0x16, 0x44, 0x80, 0x00,
-  0x15, 0x8c, 0x0a, 0xc6, 0x00, 0x00,
-  0x8a, 0x47, 0x45, 0x23, 0x80, 0x00,
-  0x25, 0x81, 0x92, 0xc0, 0xc0, 0x00,
-  0x62, 0x12, 0xb1, 0x09, 0x40, 0x00,
-  0x58, 0x58, 0x2c, 0x2c, 0x00, 0x00,
-  0x0e, 0x28, 0x87, 0x14, 0x40, 0x00,
-  0x83, 0x34, 0x41, 0x9a, 0x00, 0x00,
-  0x10, 0x6c, 0xff, 0x60, 0x80, 0x00
-};
-
-const uint8_t kMaskRandom34_29[174] = {
-  0x15, 0x8c, 0x0a, 0xc6, 0x00, 0x00,
-  0x8a, 0x47, 0x45, 0x23, 0x80, 0x00,
-  0x25, 0x81, 0x92, 0xc0, 0xc0, 0x00,
-  0x62, 0x12, 0xb1, 0x09, 0x40, 0x00,
-  0x58, 0x58, 0x2c, 0x2c, 0x00, 0x00,
-  0x0e, 0x28, 0x87, 0x14, 0x40, 0x00,
-  0x83, 0x34, 0x41, 0x9a, 0x00, 0x00,
-  0x51, 0x84, 0xa8, 0xc2, 0x40, 0x00,
-  0xa2, 0x27, 0x51, 0x13, 0x80, 0x00,
-  0x95, 0x51, 0xca, 0xa8, 0xc0, 0x00,
-  0x4a, 0x1a, 0x25, 0x0d, 0x00, 0x00,
-  0x30, 0x68, 0x18, 0x34, 0x00, 0x00,
-  0x2c, 0x89, 0x16, 0x44, 0x80, 0x00,
-  0xb0, 0xde, 0xd8, 0x6f, 0x40, 0x00,
-  0x15, 0x8c, 0x0a, 0xc6, 0x00, 0x00,
-  0x8a, 0x47, 0x45, 0x23, 0x80, 0x00,
-  0x25, 0x81, 0x92, 0xc0, 0xc0, 0x00,
-  0x62, 0x12, 0xb1, 0x09, 0x40, 0x00,
-  0x58, 0x58, 0x2c, 0x2c, 0x00, 0x00,
-  0x0e, 0x28, 0x87, 0x14, 0x40, 0x00,
-  0x83, 0x34, 0x41, 0x9a, 0x00, 0x00,
-  0x25, 0x2c, 0x12, 0x96, 0x00, 0x00,
-  0x8a, 0x91, 0x45, 0x48, 0x80, 0x00,
-  0x91, 0xc0, 0xc8, 0xe0, 0x40, 0x00,
-  0x68, 0x06, 0xb4, 0x03, 0x40, 0x00,
-  0x32, 0xc8, 0x19, 0x64, 0x00, 0x00,
-  0x43, 0x45, 0x21, 0xa2, 0x80, 0x00,
-  0xc4, 0x30, 0xe2, 0x18, 0x40, 0x00,
-  0x1c, 0xa2, 0x0e, 0x51, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom34_3[18] = {
-  0xcd, 0xcc, 0x66, 0xe6, 0x00, 0x00,
-  0x97, 0x27, 0x4b, 0x93, 0x80, 0x00,
-  0xb8, 0xd1, 0xdc, 0x68, 0xc0, 0x00
-};
-
-const uint8_t kMaskRandom34_30[180] = {
-  0x15, 0x8c, 0x0a, 0xc6, 0x00, 0x00,
-  0x8a, 0x47, 0x45, 0x23, 0x80, 0x00,
-  0x25, 0x81, 0x92, 0xc0, 0xc0, 0x00,
-  0x62, 0x12, 0xb1, 0x09, 0x40, 0x00,
-  0x58, 0x58, 0x2c, 0x2c, 0x00, 0x00,
-  0x0e, 0x28, 0x87, 0x14, 0x40, 0x00,
-  0x83, 0x34, 0x41, 0x9a, 0x00, 0x00,
-  0x25, 0x2c, 0x12, 0x96, 0x00, 0x00,
-  0x8a, 0x91, 0x45, 0x48, 0x80, 0x00,
-  0x91, 0xc0, 0xc8, 0xe0, 0x40, 0x00,
-  0x68, 0x06, 0xb4, 0x03, 0x40, 0x00,
-  0x32, 0xc8, 0x19, 0x64, 0x00, 0x00,
-  0x43, 0x45, 0x21, 0xa2, 0x80, 0x00,
-  0xc4, 0x30, 0xe2, 0x18, 0x40, 0x00,
-  0x1c, 0xa2, 0x0e, 0x51, 0x00, 0x00,
-  0x15, 0x8c, 0x0a, 0xc6, 0x00, 0x00,
-  0x8a, 0x47, 0x45, 0x23, 0x80, 0x00,
-  0x25, 0x81, 0x92, 0xc0, 0xc0, 0x00,
-  0x62, 0x12, 0xb1, 0x09, 0x40, 0x00,
-  0x58, 0x58, 0x2c, 0x2c, 0x00, 0x00,
-  0x0e, 0x28, 0x87, 0x14, 0x40, 0x00,
-  0x83, 0x34, 0x41, 0x9a, 0x00, 0x00,
-  0x51, 0x84, 0xa8, 0xc2, 0x40, 0x00,
-  0xa2, 0x27, 0x51, 0x13, 0x80, 0x00,
-  0x95, 0x51, 0xca, 0xa8, 0xc0, 0x00,
-  0x4a, 0x1a, 0x25, 0x0d, 0x00, 0x00,
-  0x30, 0x68, 0x18, 0x34, 0x00, 0x00,
-  0x2c, 0x89, 0x16, 0x44, 0x80, 0x00,
-  0xb0, 0xde, 0xd8, 0x6f, 0x40, 0x00,
-  0x87, 0x93, 0x96, 0xc7, 0x80, 0x00
-};
-
-const uint8_t kMaskRandom34_31[186] = {
-  0x15, 0x8c, 0x0a, 0xc6, 0x00, 0x00,
-  0x8a, 0x47, 0x45, 0x23, 0x80, 0x00,
-  0x25, 0x81, 0x92, 0xc0, 0xc0, 0x00,
-  0x62, 0x12, 0xb1, 0x09, 0x40, 0x00,
-  0x58, 0x58, 0x2c, 0x2c, 0x00, 0x00,
-  0x0e, 0x28, 0x87, 0x14, 0x40, 0x00,
-  0x83, 0x34, 0x41, 0x9a, 0x00, 0x00,
-  0x25, 0x2c, 0x12, 0x96, 0x00, 0x00,
-  0x8a, 0x91, 0x45, 0x48, 0x80, 0x00,
-  0x91, 0xc0, 0xc8, 0xe0, 0x40, 0x00,
-  0x68, 0x06, 0xb4, 0x03, 0x40, 0x00,
-  0x32, 0xc8, 0x19, 0x64, 0x00, 0x00,
-  0x43, 0x45, 0x21, 0xa2, 0x80, 0x00,
-  0xc4, 0x30, 0xe2, 0x18, 0x40, 0x00,
-  0x1c, 0xa2, 0x0e, 0x51, 0x00, 0x00,
-  0x25, 0x2c, 0x12, 0x96, 0x00, 0x00,
-  0x8a, 0x91, 0x45, 0x48, 0x80, 0x00,
-  0x91, 0xc0, 0xc8, 0xe0, 0x40, 0x00,
-  0x68, 0x06, 0xb4, 0x03, 0x40, 0x00,
-  0x32, 0xc8, 0x19, 0x64, 0x00, 0x00,
-  0x43, 0x45, 0x21, 0xa2, 0x80, 0x00,
-  0xc4, 0x30, 0xe2, 0x18, 0x40, 0x00,
-  0x1c, 0xa2, 0x0e, 0x51, 0x00, 0x00,
-  0x15, 0x8c, 0x0a, 0xc6, 0x00, 0x00,
-  0x8a, 0x47, 0x45, 0x23, 0x80, 0x00,
-  0x25, 0x81, 0x92, 0xc0, 0xc0, 0x00,
-  0x62, 0x12, 0xb1, 0x09, 0x40, 0x00,
-  0x58, 0x58, 0x2c, 0x2c, 0x00, 0x00,
-  0x0e, 0x28, 0x87, 0x14, 0x40, 0x00,
-  0x83, 0x34, 0x41, 0x9a, 0x00, 0x00,
-  0x0a, 0x1c, 0x05, 0x0e, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom34_32[192] = {
-  0x25, 0x2c, 0x12, 0x96, 0x00, 0x00,
-  0x8a, 0x91, 0x45, 0x48, 0x80, 0x00,
-  0x91, 0xc0, 0xc8, 0xe0, 0x40, 0x00,
-  0x68, 0x06, 0xb4, 0x03, 0x40, 0x00,
-  0x32, 0xc8, 0x19, 0x64, 0x00, 0x00,
-  0x43, 0x45, 0x21, 0xa2, 0x80, 0x00,
-  0xc4, 0x30, 0xe2, 0x18, 0x40, 0x00,
-  0x1c, 0xa2, 0x0e, 0x51, 0x00, 0x00,
-  0x15, 0x8c, 0x0a, 0xc6, 0x00, 0x00,
-  0x8a, 0x47, 0x45, 0x23, 0x80, 0x00,
-  0x25, 0x81, 0x92, 0xc0, 0xc0, 0x00,
-  0x62, 0x12, 0xb1, 0x09, 0x40, 0x00,
-  0x58, 0x58, 0x2c, 0x2c, 0x00, 0x00,
-  0x0e, 0x28, 0x87, 0x14, 0x40, 0x00,
-  0x83, 0x34, 0x41, 0x9a, 0x00, 0x00,
-  0x0a, 0x1c, 0x05, 0x0e, 0x00, 0x00,
-  0x15, 0x8c, 0x0a, 0xc6, 0x00, 0x00,
-  0x8a, 0x47, 0x45, 0x23, 0x80, 0x00,
-  0x25, 0x81, 0x92, 0xc0, 0xc0, 0x00,
-  0x62, 0x12, 0xb1, 0x09, 0x40, 0x00,
-  0x58, 0x58, 0x2c, 0x2c, 0x00, 0x00,
-  0x0e, 0x28, 0x87, 0x14, 0x40, 0x00,
-  0x83, 0x34, 0x41, 0x9a, 0x00, 0x00,
-  0x25, 0x2c, 0x12, 0x96, 0x00, 0x00,
-  0x8a, 0x91, 0x45, 0x48, 0x80, 0x00,
-  0x91, 0xc0, 0xc8, 0xe0, 0x40, 0x00,
-  0x68, 0x06, 0xb4, 0x03, 0x40, 0x00,
-  0x32, 0xc8, 0x19, 0x64, 0x00, 0x00,
-  0x43, 0x45, 0x21, 0xa2, 0x80, 0x00,
-  0xc4, 0x30, 0xe2, 0x18, 0x40, 0x00,
-  0x1c, 0xa2, 0x0e, 0x51, 0x00, 0x00,
-  0xa6, 0x27, 0xa9, 0x4a, 0x40, 0x00
-};
-
-const uint8_t kMaskRandom34_33[198] = {
-  0x25, 0x2c, 0x12, 0x96, 0x00, 0x00,
-  0x8a, 0x91, 0x45, 0x48, 0x80, 0x00,
-  0x91, 0xc0, 0xc8, 0xe0, 0x40, 0x00,
-  0x68, 0x06, 0xb4, 0x03, 0x40, 0x00,
-  0x32, 0xc8, 0x19, 0x64, 0x00, 0x00,
-  0x43, 0x45, 0x21, 0xa2, 0x80, 0x00,
-  0xc4, 0x30, 0xe2, 0x18, 0x40, 0x00,
-  0x1c, 0xa2, 0x0e, 0x51, 0x00, 0x00,
-  0x15, 0x8c, 0x0a, 0xc6, 0x00, 0x00,
-  0x8a, 0x47, 0x45, 0x23, 0x80, 0x00,
-  0x25, 0x81, 0x92, 0xc0, 0xc0, 0x00,
-  0x62, 0x12, 0xb1, 0x09, 0x40, 0x00,
-  0x58, 0x58, 0x2c, 0x2c, 0x00, 0x00,
-  0x0e, 0x28, 0x87, 0x14, 0x40, 0x00,
-  0x83, 0x34, 0x41, 0x9a, 0x00, 0x00,
-  0x0a, 0x1c, 0x05, 0x0e, 0x00, 0x00,
-  0x25, 0x2c, 0x12, 0x96, 0x00, 0x00,
-  0x8a, 0x91, 0x45, 0x48, 0x80, 0x00,
-  0x91, 0xc0, 0xc8, 0xe0, 0x40, 0x00,
-  0x68, 0x06, 0xb4, 0x03, 0x40, 0x00,
-  0x32, 0xc8, 0x19, 0x64, 0x00, 0x00,
-  0x43, 0x45, 0x21, 0xa2, 0x80, 0x00,
-  0xc4, 0x30, 0xe2, 0x18, 0x40, 0x00,
-  0x1c, 0xa2, 0x0e, 0x51, 0x00, 0x00,
-  0x25, 0x4c, 0x12, 0xa6, 0x00, 0x00,
-  0x8a, 0x66, 0x45, 0x33, 0x00, 0x00,
-  0x91, 0x91, 0x48, 0xc8, 0x80, 0x00,
-  0x68, 0x42, 0xb4, 0x21, 0x40, 0x00,
-  0x32, 0xa4, 0x19, 0x52, 0x00, 0x00,
-  0x43, 0x13, 0x21, 0x89, 0x80, 0x00,
-  0xc4, 0x30, 0xe2, 0x18, 0x40, 0x00,
-  0x1c, 0x88, 0x8e, 0x44, 0x40, 0x00,
-  0x3c, 0x09, 0x1e, 0x04, 0x80, 0x00
-};
-
-const uint8_t kMaskRandom34_34[204] = {
-  0x25, 0x2c, 0x12, 0x96, 0x00, 0x00,
-  0x8a, 0x91, 0x45, 0x48, 0x80, 0x00,
-  0x91, 0xc0, 0xc8, 0xe0, 0x40, 0x00,
-  0x68, 0x06, 0xb4, 0x03, 0x40, 0x00,
-  0x32, 0xc8, 0x19, 0x64, 0x00, 0x00,
-  0x43, 0x45, 0x21, 0xa2, 0x80, 0x00,
-  0xc4, 0x30, 0xe2, 0x18, 0x40, 0x00,
-  0x1c, 0xa2, 0x0e, 0x51, 0x00, 0x00,
-  0x25, 0x4c, 0x12, 0xa6, 0x00, 0x00,
-  0x8a, 0x66, 0x45, 0x33, 0x00, 0x00,
-  0x91, 0x91, 0x48, 0xc8, 0x80, 0x00,
-  0x68, 0x42, 0xb4, 0x21, 0x40, 0x00,
-  0x32, 0xa4, 0x19, 0x52, 0x00, 0x00,
-  0x43, 0x13, 0x21, 0x89, 0x80, 0x00,
-  0xc4, 0x30, 0xe2, 0x18, 0x40, 0x00,
-  0x1c, 0x88, 0x8e, 0x44, 0x40, 0x00,
-  0x3c, 0x09, 0x1e, 0x04, 0x80, 0x00,
-  0x25, 0x2c, 0x12, 0x96, 0x00, 0x00,
-  0x8a, 0x91, 0x45, 0x48, 0x80, 0x00,
-  0x91, 0xc0, 0xc8, 0xe0, 0x40, 0x00,
-  0x68, 0x06, 0xb4, 0x03, 0x40, 0x00,
-  0x32, 0xc8, 0x19, 0x64, 0x00, 0x00,
-  0x43, 0x45, 0x21, 0xa2, 0x80, 0x00,
-  0xc4, 0x30, 0xe2, 0x18, 0x40, 0x00,
-  0x1c, 0xa2, 0x0e, 0x51, 0x00, 0x00,
-  0x15, 0x8c, 0x0a, 0xc6, 0x00, 0x00,
-  0x8a, 0x47, 0x45, 0x23, 0x80, 0x00,
-  0x25, 0x81, 0x92, 0xc0, 0xc0, 0x00,
-  0x62, 0x12, 0xb1, 0x09, 0x40, 0x00,
-  0x58, 0x58, 0x2c, 0x2c, 0x00, 0x00,
-  0x0e, 0x28, 0x87, 0x14, 0x40, 0x00,
-  0x83, 0x34, 0x41, 0x9a, 0x00, 0x00,
-  0x0a, 0x1c, 0x05, 0x0e, 0x00, 0x00,
-  0x30, 0x3c, 0xb3, 0xe6, 0x80, 0x00
-};
-
-const uint8_t kMaskRandom34_4[24] = {
-  0xca, 0xec, 0x65, 0x76, 0x00, 0x00,
-  0xa9, 0x67, 0x54, 0xb3, 0x80, 0x00,
-  0x3a, 0xb1, 0x9d, 0x58, 0xc0, 0x00,
-  0x55, 0x5a, 0xaa, 0xad, 0x40, 0x00
-};
-
-const uint8_t kMaskRandom34_5[30] = {
-  0x55, 0x44, 0xaa, 0xa2, 0x40, 0x00,
-  0x2a, 0x66, 0x15, 0x33, 0x00, 0x00,
-  0x25, 0xa1, 0x92, 0xd0, 0xc0, 0x00,
-  0xe2, 0x12, 0xf1, 0x09, 0x40, 0x00,
-  0x99, 0x98, 0x4c, 0xcc, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom34_6[36] = {
-  0xd1, 0x4c, 0x68, 0xa6, 0x00, 0x00,
-  0xa2, 0xc5, 0x51, 0x62, 0x80, 0x00,
-  0x95, 0x30, 0xca, 0x98, 0x40, 0x00,
-  0xca, 0x0a, 0xe5, 0x05, 0x40, 0x00,
-  0xa4, 0xaa, 0x52, 0x55, 0x00, 0x00,
-  0x78, 0x15, 0x3c, 0x0a, 0x80, 0x00
-};
-
-const uint8_t kMaskRandom34_7[42] = {
-  0x15, 0x44, 0x8a, 0xa2, 0x40, 0x00,
-  0x8a, 0x23, 0x45, 0x11, 0x80, 0x00,
-  0x85, 0x91, 0x42, 0xc8, 0x80, 0x00,
-  0x32, 0x0a, 0x99, 0x05, 0x40, 0x00,
-  0x58, 0x34, 0x2c, 0x1a, 0x00, 0x00,
-  0x2c, 0x0d, 0x16, 0x06, 0x80, 0x00,
-  0x43, 0xc8, 0x21, 0xe4, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom34_8[48] = {
-  0x64, 0x16, 0x32, 0x0b, 0x00, 0x00,
-  0xa2, 0xc2, 0x51, 0x61, 0x00, 0x00,
-  0x51, 0x60, 0xa8, 0xb0, 0x40, 0x00,
-  0x4a, 0x85, 0x25, 0x42, 0x80, 0x00,
-  0x38, 0x4c, 0x1c, 0x26, 0x00, 0x00,
-  0x89, 0x29, 0x44, 0x94, 0x80, 0x00,
-  0x07, 0x11, 0x83, 0x88, 0xc0, 0x00,
-  0x94, 0xb0, 0x4a, 0x58, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom34_9[54] = {
-  0x8e, 0xcc, 0x47, 0x66, 0x00, 0x00,
-  0x6a, 0x2b, 0x35, 0x15, 0x80, 0x00,
-  0x36, 0x32, 0x9b, 0x19, 0x40, 0x00,
-  0xd1, 0x25, 0xe8, 0x92, 0xc0, 0x00,
-  0x55, 0x8c, 0xaa, 0xc6, 0x40, 0x00,
-  0xaa, 0x27, 0x55, 0x13, 0x80, 0x00,
-  0xa5, 0x32, 0xd2, 0x99, 0x40, 0x00,
-  0x62, 0x61, 0xb1, 0x30, 0xc0, 0x00,
-  0x3c, 0x5c, 0x1e, 0x2e, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom35_1[6] = {
-  0xff, 0xff, 0xff, 0xff, 0xe0, 0x00
-};
-
-const uint8_t kMaskRandom35_10[60] = {
-  0x55, 0x8c, 0xc6, 0x63, 0x20, 0x00,
-  0xaa, 0x27, 0x13, 0x89, 0xc0, 0x00,
-  0xa5, 0x32, 0x99, 0x4c, 0xa0, 0x00,
-  0x62, 0x61, 0xb0, 0xd8, 0x60, 0x00,
-  0x3c, 0x5c, 0x2e, 0x17, 0x00, 0x00,
-  0x8e, 0xcc, 0x66, 0x33, 0x00, 0x00,
-  0x6a, 0x2b, 0x15, 0x8a, 0xc0, 0x00,
-  0x36, 0x32, 0x99, 0x4c, 0xa0, 0x00,
-  0xd1, 0x25, 0x92, 0xc9, 0x60, 0x00,
-  0xc8, 0x02, 0xfe, 0xce, 0xe0, 0x00
-};
-
-const uint8_t kMaskRandom35_11[66] = {
-  0x55, 0x8c, 0xc6, 0x63, 0x20, 0x00,
-  0xaa, 0x27, 0x13, 0x89, 0xc0, 0x00,
-  0xa5, 0x32, 0x99, 0x4c, 0xa0, 0x00,
-  0x62, 0x61, 0xb0, 0xd8, 0x60, 0x00,
-  0x3c, 0x5c, 0x2e, 0x17, 0x00, 0x00,
-  0x51, 0x84, 0xc2, 0x61, 0x20, 0x00,
-  0xa2, 0x27, 0x13, 0x89, 0xc0, 0x00,
-  0x95, 0x51, 0xa8, 0xd4, 0x60, 0x00,
-  0x4a, 0x1a, 0x0d, 0x06, 0x80, 0x00,
-  0x30, 0x68, 0x34, 0x1a, 0x00, 0x00,
-  0x2c, 0x89, 0x44, 0xa2, 0x40, 0x00
-};
-
-const uint8_t kMaskRandom35_12[72] = {
-  0x51, 0x84, 0xc2, 0x61, 0x20, 0x00,
-  0xa2, 0x27, 0x13, 0x89, 0xc0, 0x00,
-  0x95, 0x51, 0xa8, 0xd4, 0x60, 0x00,
-  0x4a, 0x1a, 0x0d, 0x06, 0x80, 0x00,
-  0x30, 0x68, 0x34, 0x1a, 0x00, 0x00,
-  0x2c, 0x89, 0x44, 0xa2, 0x40, 0x00,
-  0x55, 0x8c, 0xc6, 0x63, 0x20, 0x00,
-  0xaa, 0x27, 0x13, 0x89, 0xc0, 0x00,
-  0xa5, 0x32, 0x99, 0x4c, 0xa0, 0x00,
-  0x62, 0x61, 0xb0, 0xd8, 0x60, 0x00,
-  0x3c, 0x5c, 0x2e, 0x17, 0x00, 0x00,
-  0x51, 0x35, 0x2d, 0x86, 0x20, 0x00
-};
-
-const uint8_t kMaskRandom35_13[78] = {
-  0x51, 0x84, 0xc2, 0x61, 0x20, 0x00,
-  0xa2, 0x27, 0x13, 0x89, 0xc0, 0x00,
-  0x95, 0x51, 0xa8, 0xd4, 0x60, 0x00,
-  0x4a, 0x1a, 0x0d, 0x06, 0x80, 0x00,
-  0x30, 0x68, 0x34, 0x1a, 0x00, 0x00,
-  0x2c, 0x89, 0x44, 0xa2, 0x40, 0x00,
-  0x15, 0x8c, 0x46, 0x23, 0x00, 0x00,
-  0x8a, 0x47, 0x23, 0x91, 0xc0, 0x00,
-  0x25, 0x81, 0xc0, 0xe0, 0x60, 0x00,
-  0x62, 0x12, 0x89, 0x44, 0xa0, 0x00,
-  0x58, 0x58, 0x2c, 0x16, 0x00, 0x00,
-  0x0e, 0x28, 0x94, 0x4a, 0x20, 0x00,
-  0x83, 0x34, 0x1a, 0x0d, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom35_14[84] = {
-  0x15, 0x8c, 0x46, 0x23, 0x00, 0x00,
-  0x8a, 0x47, 0x23, 0x91, 0xc0, 0x00,
-  0x25, 0x81, 0xc0, 0xe0, 0x60, 0x00,
-  0x62, 0x12, 0x89, 0x44, 0xa0, 0x00,
-  0x58, 0x58, 0x2c, 0x16, 0x00, 0x00,
-  0x0e, 0x28, 0x94, 0x4a, 0x20, 0x00,
-  0x83, 0x34, 0x1a, 0x0d, 0x00, 0x00,
-  0x51, 0x84, 0xc2, 0x61, 0x20, 0x00,
-  0xa2, 0x27, 0x13, 0x89, 0xc0, 0x00,
-  0x95, 0x51, 0xa8, 0xd4, 0x60, 0x00,
-  0x4a, 0x1a, 0x0d, 0x06, 0x80, 0x00,
-  0x30, 0x68, 0x34, 0x1a, 0x00, 0x00,
-  0x2c, 0x89, 0x44, 0xa2, 0x40, 0x00,
-  0xb0, 0xde, 0xbf, 0xa7, 0xe0, 0x00
-};
-
-const uint8_t kMaskRandom35_15[90] = {
-  0x15, 0x8c, 0x46, 0x23, 0x00, 0x00,
-  0x8a, 0x47, 0x23, 0x91, 0xc0, 0x00,
-  0x25, 0x81, 0xc0, 0xe0, 0x60, 0x00,
-  0x62, 0x12, 0x89, 0x44, 0xa0, 0x00,
-  0x58, 0x58, 0x2c, 0x16, 0x00, 0x00,
-  0x0e, 0x28, 0x94, 0x4a, 0x20, 0x00,
-  0x83, 0x34, 0x1a, 0x0d, 0x00, 0x00,
-  0x25, 0x2c, 0x16, 0x0b, 0x00, 0x00,
-  0x8a, 0x91, 0x48, 0xa4, 0x40, 0x00,
-  0x91, 0xc0, 0xe0, 0x70, 0x20, 0x00,
-  0x68, 0x06, 0x83, 0x41, 0xa0, 0x00,
-  0x32, 0xc8, 0x64, 0x32, 0x00, 0x00,
-  0x43, 0x45, 0x22, 0x91, 0x40, 0x00,
-  0xc4, 0x30, 0x98, 0x4c, 0x20, 0x00,
-  0x1c, 0xa2, 0x51, 0x28, 0x80, 0x00
-};
-
-const uint8_t kMaskRandom35_16[96] = {
-  0x25, 0x2c, 0x16, 0x0b, 0x00, 0x00,
-  0x8a, 0x91, 0x48, 0xa4, 0x40, 0x00,
-  0x91, 0xc0, 0xe0, 0x70, 0x20, 0x00,
-  0x68, 0x06, 0x83, 0x41, 0xa0, 0x00,
-  0x32, 0xc8, 0x64, 0x32, 0x00, 0x00,
-  0x43, 0x45, 0x22, 0x91, 0x40, 0x00,
-  0xc4, 0x30, 0x98, 0x4c, 0x20, 0x00,
-  0x1c, 0xa2, 0x51, 0x28, 0x80, 0x00,
-  0x15, 0x8c, 0x46, 0x23, 0x00, 0x00,
-  0x8a, 0x47, 0x23, 0x91, 0xc0, 0x00,
-  0x25, 0x81, 0xc0, 0xe0, 0x60, 0x00,
-  0x62, 0x12, 0x89, 0x44, 0xa0, 0x00,
-  0x58, 0x58, 0x2c, 0x16, 0x00, 0x00,
-  0x0e, 0x28, 0x94, 0x4a, 0x20, 0x00,
-  0x83, 0x34, 0x1a, 0x0d, 0x00, 0x00,
-  0x0a, 0x1c, 0x77, 0xf9, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom35_17[102] = {
-  0x25, 0x2c, 0x16, 0x0b, 0x00, 0x00,
-  0x8a, 0x91, 0x48, 0xa4, 0x40, 0x00,
-  0x91, 0xc0, 0xe0, 0x70, 0x20, 0x00,
-  0x68, 0x06, 0x83, 0x41, 0xa0, 0x00,
-  0x32, 0xc8, 0x64, 0x32, 0x00, 0x00,
-  0x43, 0x45, 0x22, 0x91, 0x40, 0x00,
-  0xc4, 0x30, 0x98, 0x4c, 0x20, 0x00,
-  0x1c, 0xa2, 0x51, 0x28, 0x80, 0x00,
-  0x25, 0x4c, 0x26, 0x13, 0x00, 0x00,
-  0x8a, 0x66, 0x33, 0x19, 0x80, 0x00,
-  0x91, 0x91, 0x48, 0xa4, 0x40, 0x00,
-  0x68, 0x42, 0xa1, 0x50, 0xa0, 0x00,
-  0x32, 0xa4, 0x52, 0x29, 0x00, 0x00,
-  0x43, 0x13, 0x09, 0x84, 0xc0, 0x00,
-  0xc4, 0x30, 0x98, 0x4c, 0x20, 0x00,
-  0x1c, 0x88, 0xc4, 0x62, 0x20, 0x00,
-  0x3c, 0x09, 0x04, 0x82, 0x40, 0x00
-};
-
-const uint8_t kMaskRandom35_18[108] = {
-  0x8e, 0xcc, 0x22, 0x51, 0x20, 0x00,
-  0x6a, 0x2b, 0x33, 0x13, 0x00, 0x00,
-  0x36, 0x32, 0xc8, 0x24, 0xa0, 0x00,
-  0xd1, 0x25, 0x80, 0xd2, 0xc0, 0x00,
-  0x55, 0x8c, 0x87, 0x09, 0x40, 0x00,
-  0xaa, 0x27, 0x09, 0x85, 0x80, 0x00,
-  0xa5, 0x32, 0x90, 0x68, 0x20, 0x00,
-  0x62, 0x61, 0xe1, 0x28, 0x80, 0x00,
-  0x3c, 0x5c, 0x14, 0x86, 0x40, 0x00,
-  0x64, 0x16, 0x0b, 0x05, 0x80, 0x00,
-  0xa2, 0xc2, 0x61, 0x30, 0x80, 0x00,
-  0x51, 0x60, 0xb0, 0x58, 0x20, 0x00,
-  0x4a, 0x85, 0x42, 0xa1, 0x40, 0x00,
-  0x38, 0x4c, 0x26, 0x13, 0x00, 0x00,
-  0x89, 0x29, 0x14, 0x8a, 0x40, 0x00,
-  0x07, 0x11, 0x88, 0xc4, 0x60, 0x00,
-  0x94, 0xb0, 0x58, 0x2c, 0x00, 0x00,
-  0x40, 0xc9, 0x65, 0xbe, 0xc0, 0x00
-};
-
-const uint8_t kMaskRandom35_19[114] = {
-  0x8e, 0xcc, 0x22, 0x51, 0x20, 0x00,
-  0x6a, 0x2b, 0x33, 0x13, 0x00, 0x00,
-  0x36, 0x32, 0xc8, 0x24, 0xa0, 0x00,
-  0xd1, 0x25, 0x80, 0xd2, 0xc0, 0x00,
-  0x55, 0x8c, 0x87, 0x09, 0x40, 0x00,
-  0xaa, 0x27, 0x09, 0x85, 0x80, 0x00,
-  0xa5, 0x32, 0x90, 0x68, 0x20, 0x00,
-  0x62, 0x61, 0xe1, 0x28, 0x80, 0x00,
-  0x3c, 0x5c, 0x14, 0x86, 0x40, 0x00,
-  0x55, 0x8c, 0xc6, 0x63, 0x20, 0x00,
-  0xaa, 0x27, 0x13, 0x89, 0xc0, 0x00,
-  0xa5, 0x32, 0x99, 0x4c, 0xa0, 0x00,
-  0x62, 0x61, 0xb0, 0xd8, 0x60, 0x00,
-  0x3c, 0x5c, 0x2e, 0x17, 0x00, 0x00,
-  0x8e, 0xcc, 0x66, 0x33, 0x00, 0x00,
-  0x6a, 0x2b, 0x15, 0x8a, 0xc0, 0x00,
-  0x36, 0x32, 0x99, 0x4c, 0xa0, 0x00,
-  0xd1, 0x25, 0x92, 0xc9, 0x60, 0x00,
-  0xc8, 0x02, 0xfe, 0xce, 0xe0, 0x00
-};
-
-const uint8_t kMaskRandom35_2[12] = {
-  0xce, 0xce, 0x67, 0x33, 0x80, 0x00,
-  0xb9, 0x39, 0x9c, 0xce, 0x60, 0x00
-};
-
-const uint8_t kMaskRandom35_20[120] = {
-  0x55, 0x8c, 0xc6, 0x63, 0x20, 0x00,
-  0xaa, 0x27, 0x13, 0x89, 0xc0, 0x00,
-  0xa5, 0x32, 0x99, 0x4c, 0xa0, 0x00,
-  0x62, 0x61, 0xb0, 0xd8, 0x60, 0x00,
-  0x3c, 0x5c, 0x2e, 0x17, 0x00, 0x00,
-  0x8e, 0xcc, 0x66, 0x33, 0x00, 0x00,
-  0x6a, 0x2b, 0x15, 0x8a, 0xc0, 0x00,
-  0x36, 0x32, 0x99, 0x4c, 0xa0, 0x00,
-  0xd1, 0x25, 0x92, 0xc9, 0x60, 0x00,
-  0xc8, 0x02, 0xfe, 0xce, 0xe0, 0x00,
-  0x8e, 0xcc, 0x22, 0x51, 0x20, 0x00,
-  0x6a, 0x2b, 0x33, 0x13, 0x00, 0x00,
-  0x36, 0x32, 0xc8, 0x24, 0xa0, 0x00,
-  0xd1, 0x25, 0x80, 0xd2, 0xc0, 0x00,
-  0x55, 0x8c, 0x87, 0x09, 0x40, 0x00,
-  0xaa, 0x27, 0x09, 0x85, 0x80, 0x00,
-  0xa5, 0x32, 0x90, 0x68, 0x20, 0x00,
-  0x62, 0x61, 0xe1, 0x28, 0x80, 0x00,
-  0x3c, 0x5c, 0x14, 0x86, 0x40, 0x00,
-  0x63, 0x36, 0x5c, 0xd3, 0x80, 0x00
-};
-
-const uint8_t kMaskRandom35_21[126] = {
-  0x55, 0x8c, 0xc6, 0x63, 0x20, 0x00,
-  0xaa, 0x27, 0x13, 0x89, 0xc0, 0x00,
-  0xa5, 0x32, 0x99, 0x4c, 0xa0, 0x00,
-  0x62, 0x61, 0xb0, 0xd8, 0x60, 0x00,
-  0x3c, 0x5c, 0x2e, 0x17, 0x00, 0x00,
-  0x8e, 0xcc, 0x66, 0x33, 0x00, 0x00,
-  0x6a, 0x2b, 0x15, 0x8a, 0xc0, 0x00,
-  0x36, 0x32, 0x99, 0x4c, 0xa0, 0x00,
-  0xd1, 0x25, 0x92, 0xc9, 0x60, 0x00,
-  0xc8, 0x02, 0xfe, 0xce, 0xe0, 0x00,
-  0x55, 0x8c, 0xc6, 0x63, 0x20, 0x00,
-  0xaa, 0x27, 0x13, 0x89, 0xc0, 0x00,
-  0xa5, 0x32, 0x99, 0x4c, 0xa0, 0x00,
-  0x62, 0x61, 0xb0, 0xd8, 0x60, 0x00,
-  0x3c, 0x5c, 0x2e, 0x17, 0x00, 0x00,
-  0x51, 0x84, 0xc2, 0x61, 0x20, 0x00,
-  0xa2, 0x27, 0x13, 0x89, 0xc0, 0x00,
-  0x95, 0x51, 0xa8, 0xd4, 0x60, 0x00,
-  0x4a, 0x1a, 0x0d, 0x06, 0x80, 0x00,
-  0x30, 0x68, 0x34, 0x1a, 0x00, 0x00,
-  0x2c, 0x89, 0x44, 0xa2, 0x40, 0x00
-};
-
-const uint8_t kMaskRandom35_22[132] = {
-  0x55, 0x8c, 0xc6, 0x63, 0x20, 0x00,
-  0xaa, 0x27, 0x13, 0x89, 0xc0, 0x00,
-  0xa5, 0x32, 0x99, 0x4c, 0xa0, 0x00,
-  0x62, 0x61, 0xb0, 0xd8, 0x60, 0x00,
-  0x3c, 0x5c, 0x2e, 0x17, 0x00, 0x00,
-  0x51, 0x84, 0xc2, 0x61, 0x20, 0x00,
-  0xa2, 0x27, 0x13, 0x89, 0xc0, 0x00,
-  0x95, 0x51, 0xa8, 0xd4, 0x60, 0x00,
-  0x4a, 0x1a, 0x0d, 0x06, 0x80, 0x00,
-  0x30, 0x68, 0x34, 0x1a, 0x00, 0x00,
-  0x2c, 0x89, 0x44, 0xa2, 0x40, 0x00,
-  0x55, 0x8c, 0xc6, 0x63, 0x20, 0x00,
-  0xaa, 0x27, 0x13, 0x89, 0xc0, 0x00,
-  0xa5, 0x32, 0x99, 0x4c, 0xa0, 0x00,
-  0x62, 0x61, 0xb0, 0xd8, 0x60, 0x00,
-  0x3c, 0x5c, 0x2e, 0x17, 0x00, 0x00,
-  0x8e, 0xcc, 0x66, 0x33, 0x00, 0x00,
-  0x6a, 0x2b, 0x15, 0x8a, 0xc0, 0x00,
-  0x36, 0x32, 0x99, 0x4c, 0xa0, 0x00,
-  0xd1, 0x25, 0x92, 0xc9, 0x60, 0x00,
-  0xc8, 0x02, 0xfe, 0xce, 0xe0, 0x00,
-  0x84, 0xc7, 0xbc, 0xcc, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom35_23[138] = {
-  0x55, 0x8c, 0xc6, 0x63, 0x20, 0x00,
-  0xaa, 0x27, 0x13, 0x89, 0xc0, 0x00,
-  0xa5, 0x32, 0x99, 0x4c, 0xa0, 0x00,
-  0x62, 0x61, 0xb0, 0xd8, 0x60, 0x00,
-  0x3c, 0x5c, 0x2e, 0x17, 0x00, 0x00,
-  0x51, 0x84, 0xc2, 0x61, 0x20, 0x00,
-  0xa2, 0x27, 0x13, 0x89, 0xc0, 0x00,
-  0x95, 0x51, 0xa8, 0xd4, 0x60, 0x00,
-  0x4a, 0x1a, 0x0d, 0x06, 0x80, 0x00,
-  0x30, 0x68, 0x34, 0x1a, 0x00, 0x00,
-  0x2c, 0x89, 0x44, 0xa2, 0x40, 0x00,
-  0x51, 0x84, 0xc2, 0x61, 0x20, 0x00,
-  0xa2, 0x27, 0x13, 0x89, 0xc0, 0x00,
-  0x95, 0x51, 0xa8, 0xd4, 0x60, 0x00,
-  0x4a, 0x1a, 0x0d, 0x06, 0x80, 0x00,
-  0x30, 0x68, 0x34, 0x1a, 0x00, 0x00,
-  0x2c, 0x89, 0x44, 0xa2, 0x40, 0x00,
-  0x55, 0x8c, 0xc6, 0x63, 0x20, 0x00,
-  0xaa, 0x27, 0x13, 0x89, 0xc0, 0x00,
-  0xa5, 0x32, 0x99, 0x4c, 0xa0, 0x00,
-  0x62, 0x61, 0xb0, 0xd8, 0x60, 0x00,
-  0x3c, 0x5c, 0x2e, 0x17, 0x00, 0x00,
-  0x51, 0x35, 0x2d, 0x86, 0x20, 0x00
-};
-
-const uint8_t kMaskRandom35_24[144] = {
-  0x51, 0x84, 0xc2, 0x61, 0x20, 0x00,
-  0xa2, 0x27, 0x13, 0x89, 0xc0, 0x00,
-  0x95, 0x51, 0xa8, 0xd4, 0x60, 0x00,
-  0x4a, 0x1a, 0x0d, 0x06, 0x80, 0x00,
-  0x30, 0x68, 0x34, 0x1a, 0x00, 0x00,
-  0x2c, 0x89, 0x44, 0xa2, 0x40, 0x00,
-  0x55, 0x8c, 0xc6, 0x63, 0x20, 0x00,
-  0xaa, 0x27, 0x13, 0x89, 0xc0, 0x00,
-  0xa5, 0x32, 0x99, 0x4c, 0xa0, 0x00,
-  0x62, 0x61, 0xb0, 0xd8, 0x60, 0x00,
-  0x3c, 0x5c, 0x2e, 0x17, 0x00, 0x00,
-  0x51, 0x35, 0x2d, 0x86, 0x20, 0x00,
-  0x55, 0x8c, 0xc6, 0x63, 0x20, 0x00,
-  0xaa, 0x27, 0x13, 0x89, 0xc0, 0x00,
-  0xa5, 0x32, 0x99, 0x4c, 0xa0, 0x00,
-  0x62, 0x61, 0xb0, 0xd8, 0x60, 0x00,
-  0x3c, 0x5c, 0x2e, 0x17, 0x00, 0x00,
-  0x51, 0x84, 0xc2, 0x61, 0x20, 0x00,
-  0xa2, 0x27, 0x13, 0x89, 0xc0, 0x00,
-  0x95, 0x51, 0xa8, 0xd4, 0x60, 0x00,
-  0x4a, 0x1a, 0x0d, 0x06, 0x80, 0x00,
-  0x30, 0x68, 0x34, 0x1a, 0x00, 0x00,
-  0x2c, 0x89, 0x44, 0xa2, 0x40, 0x00,
-  0x0d, 0xfb, 0x06, 0x89, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom35_25[150] = {
-  0x51, 0x84, 0xc2, 0x61, 0x20, 0x00,
-  0xa2, 0x27, 0x13, 0x89, 0xc0, 0x00,
-  0x95, 0x51, 0xa8, 0xd4, 0x60, 0x00,
-  0x4a, 0x1a, 0x0d, 0x06, 0x80, 0x00,
-  0x30, 0x68, 0x34, 0x1a, 0x00, 0x00,
-  0x2c, 0x89, 0x44, 0xa2, 0x40, 0x00,
-  0x55, 0x8c, 0xc6, 0x63, 0x20, 0x00,
-  0xaa, 0x27, 0x13, 0x89, 0xc0, 0x00,
-  0xa5, 0x32, 0x99, 0x4c, 0xa0, 0x00,
-  0x62, 0x61, 0xb0, 0xd8, 0x60, 0x00,
-  0x3c, 0x5c, 0x2e, 0x17, 0x00, 0x00,
-  0x51, 0x35, 0x2d, 0x86, 0x20, 0x00,
-  0x51, 0x84, 0xc2, 0x61, 0x20, 0x00,
-  0xa2, 0x27, 0x13, 0x89, 0xc0, 0x00,
-  0x95, 0x51, 0xa8, 0xd4, 0x60, 0x00,
-  0x4a, 0x1a, 0x0d, 0x06, 0x80, 0x00,
-  0x30, 0x68, 0x34, 0x1a, 0x00, 0x00,
-  0x2c, 0x89, 0x44, 0xa2, 0x40, 0x00,
-  0x15, 0x8c, 0x46, 0x23, 0x00, 0x00,
-  0x8a, 0x47, 0x23, 0x91, 0xc0, 0x00,
-  0x25, 0x81, 0xc0, 0xe0, 0x60, 0x00,
-  0x62, 0x12, 0x89, 0x44, 0xa0, 0x00,
-  0x58, 0x58, 0x2c, 0x16, 0x00, 0x00,
-  0x0e, 0x28, 0x94, 0x4a, 0x20, 0x00,
-  0x83, 0x34, 0x1a, 0x0d, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom35_26[156] = {
-  0x51, 0x84, 0xc2, 0x61, 0x20, 0x00,
-  0xa2, 0x27, 0x13, 0x89, 0xc0, 0x00,
-  0x95, 0x51, 0xa8, 0xd4, 0x60, 0x00,
-  0x4a, 0x1a, 0x0d, 0x06, 0x80, 0x00,
-  0x30, 0x68, 0x34, 0x1a, 0x00, 0x00,
-  0x2c, 0x89, 0x44, 0xa2, 0x40, 0x00,
-  0x15, 0x8c, 0x46, 0x23, 0x00, 0x00,
-  0x8a, 0x47, 0x23, 0x91, 0xc0, 0x00,
-  0x25, 0x81, 0xc0, 0xe0, 0x60, 0x00,
-  0x62, 0x12, 0x89, 0x44, 0xa0, 0x00,
-  0x58, 0x58, 0x2c, 0x16, 0x00, 0x00,
-  0x0e, 0x28, 0x94, 0x4a, 0x20, 0x00,
-  0x83, 0x34, 0x1a, 0x0d, 0x00, 0x00,
-  0x51, 0x84, 0xc2, 0x61, 0x20, 0x00,
-  0xa2, 0x27, 0x13, 0x89, 0xc0, 0x00,
-  0x95, 0x51, 0xa8, 0xd4, 0x60, 0x00,
-  0x4a, 0x1a, 0x0d, 0x06, 0x80, 0x00,
-  0x30, 0x68, 0x34, 0x1a, 0x00, 0x00,
-  0x2c, 0x89, 0x44, 0xa2, 0x40, 0x00,
-  0x55, 0x8c, 0xc6, 0x63, 0x20, 0x00,
-  0xaa, 0x27, 0x13, 0x89, 0xc0, 0x00,
-  0xa5, 0x32, 0x99, 0x4c, 0xa0, 0x00,
-  0x62, 0x61, 0xb0, 0xd8, 0x60, 0x00,
-  0x3c, 0x5c, 0x2e, 0x17, 0x00, 0x00,
-  0x51, 0x35, 0x2d, 0x86, 0x20, 0x00,
-  0xc4, 0x57, 0x70, 0x47, 0x40, 0x00
-};
-
-const uint8_t kMaskRandom35_27[162] = {
-  0x51, 0x84, 0xc2, 0x61, 0x20, 0x00,
-  0xa2, 0x27, 0x13, 0x89, 0xc0, 0x00,
-  0x95, 0x51, 0xa8, 0xd4, 0x60, 0x00,
-  0x4a, 0x1a, 0x0d, 0x06, 0x80, 0x00,
-  0x30, 0x68, 0x34, 0x1a, 0x00, 0x00,
-  0x2c, 0x89, 0x44, 0xa2, 0x40, 0x00,
-  0x15, 0x8c, 0x46, 0x23, 0x00, 0x00,
-  0x8a, 0x47, 0x23, 0x91, 0xc0, 0x00,
-  0x25, 0x81, 0xc0, 0xe0, 0x60, 0x00,
-  0x62, 0x12, 0x89, 0x44, 0xa0, 0x00,
-  0x58, 0x58, 0x2c, 0x16, 0x00, 0x00,
-  0x0e, 0x28, 0x94, 0x4a, 0x20, 0x00,
-  0x83, 0x34, 0x1a, 0x0d, 0x00, 0x00,
-  0x15, 0x8c, 0x46, 0x23, 0x00, 0x00,
-  0x8a, 0x47, 0x23, 0x91, 0xc0, 0x00,
-  0x25, 0x81, 0xc0, 0xe0, 0x60, 0x00,
-  0x62, 0x12, 0x89, 0x44, 0xa0, 0x00,
-  0x58, 0x58, 0x2c, 0x16, 0x00, 0x00,
-  0x0e, 0x28, 0x94, 0x4a, 0x20, 0x00,
-  0x83, 0x34, 0x1a, 0x0d, 0x00, 0x00,
-  0x51, 0x84, 0xc2, 0x61, 0x20, 0x00,
-  0xa2, 0x27, 0x13, 0x89, 0xc0, 0x00,
-  0x95, 0x51, 0xa8, 0xd4, 0x60, 0x00,
-  0x4a, 0x1a, 0x0d, 0x06, 0x80, 0x00,
-  0x30, 0x68, 0x34, 0x1a, 0x00, 0x00,
-  0x2c, 0x89, 0x44, 0xa2, 0x40, 0x00,
-  0xb0, 0xde, 0xbf, 0xa7, 0xe0, 0x00
-};
-
-const uint8_t kMaskRandom35_28[168] = {
-  0x15, 0x8c, 0x46, 0x23, 0x00, 0x00,
-  0x8a, 0x47, 0x23, 0x91, 0xc0, 0x00,
-  0x25, 0x81, 0xc0, 0xe0, 0x60, 0x00,
-  0x62, 0x12, 0x89, 0x44, 0xa0, 0x00,
-  0x58, 0x58, 0x2c, 0x16, 0x00, 0x00,
-  0x0e, 0x28, 0x94, 0x4a, 0x20, 0x00,
-  0x83, 0x34, 0x1a, 0x0d, 0x00, 0x00,
-  0x51, 0x84, 0xc2, 0x61, 0x20, 0x00,
-  0xa2, 0x27, 0x13, 0x89, 0xc0, 0x00,
-  0x95, 0x51, 0xa8, 0xd4, 0x60, 0x00,
-  0x4a, 0x1a, 0x0d, 0x06, 0x80, 0x00,
-  0x30, 0x68, 0x34, 0x1a, 0x00, 0x00,
-  0x2c, 0x89, 0x44, 0xa2, 0x40, 0x00,
-  0xb0, 0xde, 0xbf, 0xa7, 0xe0, 0x00,
-  0x51, 0x84, 0xc2, 0x61, 0x20, 0x00,
-  0xa2, 0x27, 0x13, 0x89, 0xc0, 0x00,
-  0x95, 0x51, 0xa8, 0xd4, 0x60, 0x00,
-  0x4a, 0x1a, 0x0d, 0x06, 0x80, 0x00,
-  0x30, 0x68, 0x34, 0x1a, 0x00, 0x00,
-  0x2c, 0x89, 0x44, 0xa2, 0x40, 0x00,
-  0x15, 0x8c, 0x46, 0x23, 0x00, 0x00,
-  0x8a, 0x47, 0x23, 0x91, 0xc0, 0x00,
-  0x25, 0x81, 0xc0, 0xe0, 0x60, 0x00,
-  0x62, 0x12, 0x89, 0x44, 0xa0, 0x00,
-  0x58, 0x58, 0x2c, 0x16, 0x00, 0x00,
-  0x0e, 0x28, 0x94, 0x4a, 0x20, 0x00,
-  0x83, 0x34, 0x1a, 0x0d, 0x00, 0x00,
-  0x34, 0x4a, 0x80, 0x94, 0x40, 0x00
-};
-
-const uint8_t kMaskRandom35_29[174] = {
-  0x15, 0x8c, 0x46, 0x23, 0x00, 0x00,
-  0x8a, 0x47, 0x23, 0x91, 0xc0, 0x00,
-  0x25, 0x81, 0xc0, 0xe0, 0x60, 0x00,
-  0x62, 0x12, 0x89, 0x44, 0xa0, 0x00,
-  0x58, 0x58, 0x2c, 0x16, 0x00, 0x00,
-  0x0e, 0x28, 0x94, 0x4a, 0x20, 0x00,
-  0x83, 0x34, 0x1a, 0x0d, 0x00, 0x00,
-  0x51, 0x84, 0xc2, 0x61, 0x20, 0x00,
-  0xa2, 0x27, 0x13, 0x89, 0xc0, 0x00,
-  0x95, 0x51, 0xa8, 0xd4, 0x60, 0x00,
-  0x4a, 0x1a, 0x0d, 0x06, 0x80, 0x00,
-  0x30, 0x68, 0x34, 0x1a, 0x00, 0x00,
-  0x2c, 0x89, 0x44, 0xa2, 0x40, 0x00,
-  0xb0, 0xde, 0xbf, 0xa7, 0xe0, 0x00,
-  0x15, 0x8c, 0x46, 0x23, 0x00, 0x00,
-  0x8a, 0x47, 0x23, 0x91, 0xc0, 0x00,
-  0x25, 0x81, 0xc0, 0xe0, 0x60, 0x00,
-  0x62, 0x12, 0x89, 0x44, 0xa0, 0x00,
-  0x58, 0x58, 0x2c, 0x16, 0x00, 0x00,
-  0x0e, 0x28, 0x94, 0x4a, 0x20, 0x00,
-  0x83, 0x34, 0x1a, 0x0d, 0x00, 0x00,
-  0x25, 0x2c, 0x16, 0x0b, 0x00, 0x00,
-  0x8a, 0x91, 0x48, 0xa4, 0x40, 0x00,
-  0x91, 0xc0, 0xe0, 0x70, 0x20, 0x00,
-  0x68, 0x06, 0x83, 0x41, 0xa0, 0x00,
-  0x32, 0xc8, 0x64, 0x32, 0x00, 0x00,
-  0x43, 0x45, 0x22, 0x91, 0x40, 0x00,
-  0xc4, 0x30, 0x98, 0x4c, 0x20, 0x00,
-  0x1c, 0xa2, 0x51, 0x28, 0x80, 0x00
-};
-
-const uint8_t kMaskRandom35_3[18] = {
-  0xcd, 0xcc, 0x66, 0x33, 0x00, 0x00,
-  0x97, 0x27, 0x13, 0x8a, 0xc0, 0x00,
-  0xb8, 0xd1, 0xc9, 0x64, 0xa0, 0x00
-};
-
-const uint8_t kMaskRandom35_30[180] = {
-  0x15, 0x8c, 0x46, 0x23, 0x00, 0x00,
-  0x8a, 0x47, 0x23, 0x91, 0xc0, 0x00,
-  0x25, 0x81, 0xc0, 0xe0, 0x60, 0x00,
-  0x62, 0x12, 0x89, 0x44, 0xa0, 0x00,
-  0x58, 0x58, 0x2c, 0x16, 0x00, 0x00,
-  0x0e, 0x28, 0x94, 0x4a, 0x20, 0x00,
-  0x83, 0x34, 0x1a, 0x0d, 0x00, 0x00,
-  0x25, 0x2c, 0x16, 0x0b, 0x00, 0x00,
-  0x8a, 0x91, 0x48, 0xa4, 0x40, 0x00,
-  0x91, 0xc0, 0xe0, 0x70, 0x20, 0x00,
-  0x68, 0x06, 0x83, 0x41, 0xa0, 0x00,
-  0x32, 0xc8, 0x64, 0x32, 0x00, 0x00,
-  0x43, 0x45, 0x22, 0x91, 0x40, 0x00,
-  0xc4, 0x30, 0x98, 0x4c, 0x20, 0x00,
-  0x1c, 0xa2, 0x51, 0x28, 0x80, 0x00,
-  0x15, 0x8c, 0x46, 0x23, 0x00, 0x00,
-  0x8a, 0x47, 0x23, 0x91, 0xc0, 0x00,
-  0x25, 0x81, 0xc0, 0xe0, 0x60, 0x00,
-  0x62, 0x12, 0x89, 0x44, 0xa0, 0x00,
-  0x58, 0x58, 0x2c, 0x16, 0x00, 0x00,
-  0x0e, 0x28, 0x94, 0x4a, 0x20, 0x00,
-  0x83, 0x34, 0x1a, 0x0d, 0x00, 0x00,
-  0x51, 0x84, 0xc2, 0x61, 0x20, 0x00,
-  0xa2, 0x27, 0x13, 0x89, 0xc0, 0x00,
-  0x95, 0x51, 0xa8, 0xd4, 0x60, 0x00,
-  0x4a, 0x1a, 0x0d, 0x06, 0x80, 0x00,
-  0x30, 0x68, 0x34, 0x1a, 0x00, 0x00,
-  0x2c, 0x89, 0x44, 0xa2, 0x40, 0x00,
-  0xb0, 0xde, 0xbf, 0xa7, 0xe0, 0x00,
-  0x32, 0x1b, 0x9f, 0x09, 0x20, 0x00
-};
-
-const uint8_t kMaskRandom35_31[186] = {
-  0x15, 0x8c, 0x46, 0x23, 0x00, 0x00,
-  0x8a, 0x47, 0x23, 0x91, 0xc0, 0x00,
-  0x25, 0x81, 0xc0, 0xe0, 0x60, 0x00,
-  0x62, 0x12, 0x89, 0x44, 0xa0, 0x00,
-  0x58, 0x58, 0x2c, 0x16, 0x00, 0x00,
-  0x0e, 0x28, 0x94, 0x4a, 0x20, 0x00,
-  0x83, 0x34, 0x1a, 0x0d, 0x00, 0x00,
-  0x25, 0x2c, 0x16, 0x0b, 0x00, 0x00,
-  0x8a, 0x91, 0x48, 0xa4, 0x40, 0x00,
-  0x91, 0xc0, 0xe0, 0x70, 0x20, 0x00,
-  0x68, 0x06, 0x83, 0x41, 0xa0, 0x00,
-  0x32, 0xc8, 0x64, 0x32, 0x00, 0x00,
-  0x43, 0x45, 0x22, 0x91, 0x40, 0x00,
-  0xc4, 0x30, 0x98, 0x4c, 0x20, 0x00,
-  0x1c, 0xa2, 0x51, 0x28, 0x80, 0x00,
-  0x25, 0x2c, 0x16, 0x0b, 0x00, 0x00,
-  0x8a, 0x91, 0x48, 0xa4, 0x40, 0x00,
-  0x91, 0xc0, 0xe0, 0x70, 0x20, 0x00,
-  0x68, 0x06, 0x83, 0x41, 0xa0, 0x00,
-  0x32, 0xc8, 0x64, 0x32, 0x00, 0x00,
-  0x43, 0x45, 0x22, 0x91, 0x40, 0x00,
-  0xc4, 0x30, 0x98, 0x4c, 0x20, 0x00,
-  0x1c, 0xa2, 0x51, 0x28, 0x80, 0x00,
-  0x15, 0x8c, 0x46, 0x23, 0x00, 0x00,
-  0x8a, 0x47, 0x23, 0x91, 0xc0, 0x00,
-  0x25, 0x81, 0xc0, 0xe0, 0x60, 0x00,
-  0x62, 0x12, 0x89, 0x44, 0xa0, 0x00,
-  0x58, 0x58, 0x2c, 0x16, 0x00, 0x00,
-  0x0e, 0x28, 0x94, 0x4a, 0x20, 0x00,
-  0x83, 0x34, 0x1a, 0x0d, 0x00, 0x00,
-  0x0a, 0x1c, 0x77, 0xf9, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom35_32[192] = {
-  0x25, 0x2c, 0x16, 0x0b, 0x00, 0x00,
-  0x8a, 0x91, 0x48, 0xa4, 0x40, 0x00,
-  0x91, 0xc0, 0xe0, 0x70, 0x20, 0x00,
-  0x68, 0x06, 0x83, 0x41, 0xa0, 0x00,
-  0x32, 0xc8, 0x64, 0x32, 0x00, 0x00,
-  0x43, 0x45, 0x22, 0x91, 0x40, 0x00,
-  0xc4, 0x30, 0x98, 0x4c, 0x20, 0x00,
-  0x1c, 0xa2, 0x51, 0x28, 0x80, 0x00,
-  0x15, 0x8c, 0x46, 0x23, 0x00, 0x00,
-  0x8a, 0x47, 0x23, 0x91, 0xc0, 0x00,
-  0x25, 0x81, 0xc0, 0xe0, 0x60, 0x00,
-  0x62, 0x12, 0x89, 0x44, 0xa0, 0x00,
-  0x58, 0x58, 0x2c, 0x16, 0x00, 0x00,
-  0x0e, 0x28, 0x94, 0x4a, 0x20, 0x00,
-  0x83, 0x34, 0x1a, 0x0d, 0x00, 0x00,
-  0x0a, 0x1c, 0x77, 0xf9, 0x00, 0x00,
-  0x15, 0x8c, 0x46, 0x23, 0x00, 0x00,
-  0x8a, 0x47, 0x23, 0x91, 0xc0, 0x00,
-  0x25, 0x81, 0xc0, 0xe0, 0x60, 0x00,
-  0x62, 0x12, 0x89, 0x44, 0xa0, 0x00,
-  0x58, 0x58, 0x2c, 0x16, 0x00, 0x00,
-  0x0e, 0x28, 0x94, 0x4a, 0x20, 0x00,
-  0x83, 0x34, 0x1a, 0x0d, 0x00, 0x00,
-  0x25, 0x2c, 0x16, 0x0b, 0x00, 0x00,
-  0x8a, 0x91, 0x48, 0xa4, 0x40, 0x00,
-  0x91, 0xc0, 0xe0, 0x70, 0x20, 0x00,
-  0x68, 0x06, 0x83, 0x41, 0xa0, 0x00,
-  0x32, 0xc8, 0x64, 0x32, 0x00, 0x00,
-  0x43, 0x45, 0x22, 0x91, 0x40, 0x00,
-  0xc4, 0x30, 0x98, 0x4c, 0x20, 0x00,
-  0x1c, 0xa2, 0x51, 0x28, 0x80, 0x00,
-  0xeb, 0x31, 0x7b, 0x80, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom35_33[198] = {
-  0x25, 0x2c, 0x16, 0x0b, 0x00, 0x00,
-  0x8a, 0x91, 0x48, 0xa4, 0x40, 0x00,
-  0x91, 0xc0, 0xe0, 0x70, 0x20, 0x00,
-  0x68, 0x06, 0x83, 0x41, 0xa0, 0x00,
-  0x32, 0xc8, 0x64, 0x32, 0x00, 0x00,
-  0x43, 0x45, 0x22, 0x91, 0x40, 0x00,
-  0xc4, 0x30, 0x98, 0x4c, 0x20, 0x00,
-  0x1c, 0xa2, 0x51, 0x28, 0x80, 0x00,
-  0x15, 0x8c, 0x46, 0x23, 0x00, 0x00,
-  0x8a, 0x47, 0x23, 0x91, 0xc0, 0x00,
-  0x25, 0x81, 0xc0, 0xe0, 0x60, 0x00,
-  0x62, 0x12, 0x89, 0x44, 0xa0, 0x00,
-  0x58, 0x58, 0x2c, 0x16, 0x00, 0x00,
-  0x0e, 0x28, 0x94, 0x4a, 0x20, 0x00,
-  0x83, 0x34, 0x1a, 0x0d, 0x00, 0x00,
-  0x0a, 0x1c, 0x77, 0xf9, 0x00, 0x00,
-  0x25, 0x2c, 0x16, 0x0b, 0x00, 0x00,
-  0x8a, 0x91, 0x48, 0xa4, 0x40, 0x00,
-  0x91, 0xc0, 0xe0, 0x70, 0x20, 0x00,
-  0x68, 0x06, 0x83, 0x41, 0xa0, 0x00,
-  0x32, 0xc8, 0x64, 0x32, 0x00, 0x00,
-  0x43, 0x45, 0x22, 0x91, 0x40, 0x00,
-  0xc4, 0x30, 0x98, 0x4c, 0x20, 0x00,
-  0x1c, 0xa2, 0x51, 0x28, 0x80, 0x00,
-  0x25, 0x4c, 0x26, 0x13, 0x00, 0x00,
-  0x8a, 0x66, 0x33, 0x19, 0x80, 0x00,
-  0x91, 0x91, 0x48, 0xa4, 0x40, 0x00,
-  0x68, 0x42, 0xa1, 0x50, 0xa0, 0x00,
-  0x32, 0xa4, 0x52, 0x29, 0x00, 0x00,
-  0x43, 0x13, 0x09, 0x84, 0xc0, 0x00,
-  0xc4, 0x30, 0x98, 0x4c, 0x20, 0x00,
-  0x1c, 0x88, 0xc4, 0x62, 0x20, 0x00,
-  0x3c, 0x09, 0x04, 0x82, 0x40, 0x00
-};
-
-const uint8_t kMaskRandom35_34[204] = {
-  0x25, 0x2c, 0x16, 0x0b, 0x00, 0x00,
-  0x8a, 0x91, 0x48, 0xa4, 0x40, 0x00,
-  0x91, 0xc0, 0xe0, 0x70, 0x20, 0x00,
-  0x68, 0x06, 0x83, 0x41, 0xa0, 0x00,
-  0x32, 0xc8, 0x64, 0x32, 0x00, 0x00,
-  0x43, 0x45, 0x22, 0x91, 0x40, 0x00,
-  0xc4, 0x30, 0x98, 0x4c, 0x20, 0x00,
-  0x1c, 0xa2, 0x51, 0x28, 0x80, 0x00,
-  0x25, 0x4c, 0x26, 0x13, 0x00, 0x00,
-  0x8a, 0x66, 0x33, 0x19, 0x80, 0x00,
-  0x91, 0x91, 0x48, 0xa4, 0x40, 0x00,
-  0x68, 0x42, 0xa1, 0x50, 0xa0, 0x00,
-  0x32, 0xa4, 0x52, 0x29, 0x00, 0x00,
-  0x43, 0x13, 0x09, 0x84, 0xc0, 0x00,
-  0xc4, 0x30, 0x98, 0x4c, 0x20, 0x00,
-  0x1c, 0x88, 0xc4, 0x62, 0x20, 0x00,
-  0x3c, 0x09, 0x04, 0x82, 0x40, 0x00,
-  0x25, 0x2c, 0x16, 0x0b, 0x00, 0x00,
-  0x8a, 0x91, 0x48, 0xa4, 0x40, 0x00,
-  0x91, 0xc0, 0xe0, 0x70, 0x20, 0x00,
-  0x68, 0x06, 0x83, 0x41, 0xa0, 0x00,
-  0x32, 0xc8, 0x64, 0x32, 0x00, 0x00,
-  0x43, 0x45, 0x22, 0x91, 0x40, 0x00,
-  0xc4, 0x30, 0x98, 0x4c, 0x20, 0x00,
-  0x1c, 0xa2, 0x51, 0x28, 0x80, 0x00,
-  0x15, 0x8c, 0x46, 0x23, 0x00, 0x00,
-  0x8a, 0x47, 0x23, 0x91, 0xc0, 0x00,
-  0x25, 0x81, 0xc0, 0xe0, 0x60, 0x00,
-  0x62, 0x12, 0x89, 0x44, 0xa0, 0x00,
-  0x58, 0x58, 0x2c, 0x16, 0x00, 0x00,
-  0x0e, 0x28, 0x94, 0x4a, 0x20, 0x00,
-  0x83, 0x34, 0x1a, 0x0d, 0x00, 0x00,
-  0x0a, 0x1c, 0x77, 0xf9, 0x00, 0x00,
-  0x70, 0x07, 0xcd, 0x8c, 0xc0, 0x00
-};
-
-const uint8_t kMaskRandom35_35[210] = {
-  0x25, 0x2c, 0x16, 0x0b, 0x00, 0x00,
-  0x8a, 0x91, 0x48, 0xa4, 0x40, 0x00,
-  0x91, 0xc0, 0xe0, 0x70, 0x20, 0x00,
-  0x68, 0x06, 0x83, 0x41, 0xa0, 0x00,
-  0x32, 0xc8, 0x64, 0x32, 0x00, 0x00,
-  0x43, 0x45, 0x22, 0x91, 0x40, 0x00,
-  0xc4, 0x30, 0x98, 0x4c, 0x20, 0x00,
-  0x1c, 0xa2, 0x51, 0x28, 0x80, 0x00,
-  0x25, 0x4c, 0x26, 0x13, 0x00, 0x00,
-  0x8a, 0x66, 0x33, 0x19, 0x80, 0x00,
-  0x91, 0x91, 0x48, 0xa4, 0x40, 0x00,
-  0x68, 0x42, 0xa1, 0x50, 0xa0, 0x00,
-  0x32, 0xa4, 0x52, 0x29, 0x00, 0x00,
-  0x43, 0x13, 0x09, 0x84, 0xc0, 0x00,
-  0xc4, 0x30, 0x98, 0x4c, 0x20, 0x00,
-  0x1c, 0x88, 0xc4, 0x62, 0x20, 0x00,
-  0x3c, 0x09, 0x04, 0x82, 0x40, 0x00,
-  0x25, 0x2c, 0x26, 0x13, 0x00, 0x00,
-  0x8a, 0x91, 0x33, 0x19, 0x80, 0x00,
-  0x91, 0xc0, 0xc8, 0xa4, 0x40, 0x00,
-  0x68, 0x06, 0xa1, 0x50, 0xa0, 0x00,
-  0x32, 0xc8, 0x52, 0x29, 0x00, 0x00,
-  0x43, 0x45, 0x09, 0x84, 0xc0, 0x00,
-  0xc4, 0x30, 0x98, 0x4c, 0x20, 0x00,
-  0x1c, 0xa2, 0x44, 0x62, 0x20, 0x00,
-  0x25, 0x4c, 0x04, 0x82, 0x40, 0x00,
-  0x8a, 0x66, 0x16, 0x0b, 0x00, 0x00,
-  0x91, 0x91, 0x48, 0xa4, 0x40, 0x00,
-  0x68, 0x42, 0xe0, 0x70, 0x20, 0x00,
-  0x32, 0xa4, 0x03, 0x41, 0xa0, 0x00,
-  0x43, 0x13, 0x64, 0x32, 0x00, 0x00,
-  0xc4, 0x30, 0xa2, 0x91, 0x40, 0x00,
-  0x1c, 0x88, 0x98, 0x4c, 0x20, 0x00,
-  0x3c, 0x09, 0x51, 0x28, 0x80, 0x00,
-  0xc2, 0x1c, 0x68, 0x01, 0xa0, 0x00
-};
-
-const uint8_t kMaskRandom35_4[24] = {
-  0xca, 0xec, 0x76, 0x3b, 0x00, 0x00,
-  0xa9, 0x67, 0x33, 0x99, 0xc0, 0x00,
-  0x3a, 0xb1, 0xd8, 0xec, 0x60, 0x00,
-  0x55, 0x5a, 0xad, 0x56, 0xa0, 0x00
-};
-
-const uint8_t kMaskRandom35_5[30] = {
-  0x55, 0x44, 0xa6, 0x53, 0x20, 0x00,
-  0x2a, 0x66, 0x33, 0x19, 0x80, 0x00,
-  0x25, 0xa1, 0x8c, 0xe8, 0x60, 0x00,
-  0xe2, 0x12, 0xce, 0x44, 0xa0, 0x00,
-  0x99, 0x98, 0x71, 0xa6, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom35_6[36] = {
-  0xd1, 0x4c, 0x66, 0x13, 0x00, 0x00,
-  0xa2, 0xc5, 0x22, 0xb1, 0x40, 0x00,
-  0x95, 0x30, 0xd8, 0x4c, 0x20, 0x00,
-  0xca, 0x0a, 0xc5, 0x42, 0xa0, 0x00,
-  0xa4, 0xaa, 0x14, 0xa9, 0x80, 0x00,
-  0x78, 0x15, 0x53, 0x05, 0x40, 0x00
-};
-
-const uint8_t kMaskRandom35_7[42] = {
-  0x15, 0x44, 0xa2, 0x51, 0x20, 0x00,
-  0x8a, 0x23, 0x11, 0x88, 0xc0, 0x00,
-  0x85, 0x91, 0x48, 0xa4, 0x40, 0x00,
-  0x32, 0x0a, 0x85, 0x42, 0xa0, 0x00,
-  0x58, 0x34, 0x1a, 0x0d, 0x00, 0x00,
-  0x2c, 0x0d, 0x05, 0x83, 0x40, 0x00,
-  0x43, 0xc8, 0x70, 0x32, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom35_8[48] = {
-  0x64, 0x16, 0x0b, 0x05, 0x80, 0x00,
-  0xa2, 0xc2, 0x61, 0x30, 0x80, 0x00,
-  0x51, 0x60, 0xb0, 0x58, 0x20, 0x00,
-  0x4a, 0x85, 0x42, 0xa1, 0x40, 0x00,
-  0x38, 0x4c, 0x26, 0x13, 0x00, 0x00,
-  0x89, 0x29, 0x14, 0x8a, 0x40, 0x00,
-  0x07, 0x11, 0x88, 0xc4, 0x60, 0x00,
-  0x94, 0xb0, 0x58, 0x2c, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom35_9[54] = {
-  0x8e, 0xcc, 0x22, 0x51, 0x20, 0x00,
-  0x6a, 0x2b, 0x33, 0x13, 0x00, 0x00,
-  0x36, 0x32, 0xc8, 0x24, 0xa0, 0x00,
-  0xd1, 0x25, 0x80, 0xd2, 0xc0, 0x00,
-  0x55, 0x8c, 0x87, 0x09, 0x40, 0x00,
-  0xaa, 0x27, 0x09, 0x85, 0x80, 0x00,
-  0xa5, 0x32, 0x90, 0x68, 0x20, 0x00,
-  0x62, 0x61, 0xe1, 0x28, 0x80, 0x00,
-  0x3c, 0x5c, 0x14, 0x86, 0x40, 0x00
-};
-
-const uint8_t kMaskRandom36_1[6] = {
-  0xff, 0xff, 0xff, 0xff, 0xf0, 0x00
-};
-
-const uint8_t kMaskRandom36_10[60] = {
-  0x8c, 0xc6, 0x63, 0x31, 0x90, 0x00,
-  0x27, 0x13, 0x89, 0xc4, 0xe0, 0x00,
-  0x32, 0x99, 0x4c, 0xa6, 0x50, 0x00,
-  0x61, 0xb0, 0xd8, 0x6c, 0x30, 0x00,
-  0x5c, 0x2e, 0x17, 0x0b, 0x80, 0x00,
-  0xcc, 0x66, 0x33, 0x19, 0x80, 0x00,
-  0x2b, 0x15, 0x8a, 0xc5, 0x60, 0x00,
-  0x32, 0x99, 0x4c, 0xa6, 0x50, 0x00,
-  0x25, 0x92, 0xc9, 0x64, 0xb0, 0x00,
-  0xfd, 0x9d, 0xff, 0x67, 0x70, 0x00
-};
-
-const uint8_t kMaskRandom36_11[66] = {
-  0x8c, 0xc6, 0x63, 0x31, 0x90, 0x00,
-  0x27, 0x13, 0x89, 0xc4, 0xe0, 0x00,
-  0x32, 0x99, 0x4c, 0xa6, 0x50, 0x00,
-  0x61, 0xb0, 0xd8, 0x6c, 0x30, 0x00,
-  0x5c, 0x2e, 0x17, 0x0b, 0x80, 0x00,
-  0x84, 0xc2, 0x61, 0x30, 0x90, 0x00,
-  0x27, 0x13, 0x89, 0xc4, 0xe0, 0x00,
-  0x51, 0xa8, 0xd4, 0x6a, 0x30, 0x00,
-  0x1a, 0x0d, 0x06, 0x83, 0x40, 0x00,
-  0x68, 0x34, 0x1a, 0x0d, 0x00, 0x00,
-  0x89, 0x44, 0xa2, 0x51, 0x20, 0x00
-};
-
-const uint8_t kMaskRandom36_12[72] = {
-  0x84, 0xc2, 0x61, 0x30, 0x90, 0x00,
-  0x27, 0x13, 0x89, 0xc4, 0xe0, 0x00,
-  0x51, 0xa8, 0xd4, 0x6a, 0x30, 0x00,
-  0x1a, 0x0d, 0x06, 0x83, 0x40, 0x00,
-  0x68, 0x34, 0x1a, 0x0d, 0x00, 0x00,
-  0x89, 0x44, 0xa2, 0x51, 0x20, 0x00,
-  0x8c, 0xc6, 0x63, 0x31, 0x90, 0x00,
-  0x27, 0x13, 0x89, 0xc4, 0xe0, 0x00,
-  0x32, 0x99, 0x4c, 0xa6, 0x50, 0x00,
-  0x61, 0xb0, 0xd8, 0x6c, 0x30, 0x00,
-  0x5c, 0x2e, 0x17, 0x0b, 0x80, 0x00,
-  0x5b, 0x0c, 0x56, 0xc3, 0x10, 0x00
-};
-
-const uint8_t kMaskRandom36_13[78] = {
-  0x84, 0xc2, 0x61, 0x30, 0x90, 0x00,
-  0x27, 0x13, 0x89, 0xc4, 0xe0, 0x00,
-  0x51, 0xa8, 0xd4, 0x6a, 0x30, 0x00,
-  0x1a, 0x0d, 0x06, 0x83, 0x40, 0x00,
-  0x68, 0x34, 0x1a, 0x0d, 0x00, 0x00,
-  0x89, 0x44, 0xa2, 0x51, 0x20, 0x00,
-  0x8c, 0x46, 0x23, 0x11, 0x80, 0x00,
-  0x47, 0x23, 0x91, 0xc8, 0xe0, 0x00,
-  0x81, 0xc0, 0xe0, 0x70, 0x30, 0x00,
-  0x12, 0x89, 0x44, 0xa2, 0x50, 0x00,
-  0x58, 0x2c, 0x16, 0x0b, 0x00, 0x00,
-  0x28, 0x94, 0x4a, 0x25, 0x10, 0x00,
-  0x34, 0x1a, 0x0d, 0x06, 0x80, 0x00
-};
-
-const uint8_t kMaskRandom36_14[84] = {
-  0x8c, 0x46, 0x23, 0x11, 0x80, 0x00,
-  0x47, 0x23, 0x91, 0xc8, 0xe0, 0x00,
-  0x81, 0xc0, 0xe0, 0x70, 0x30, 0x00,
-  0x12, 0x89, 0x44, 0xa2, 0x50, 0x00,
-  0x58, 0x2c, 0x16, 0x0b, 0x00, 0x00,
-  0x28, 0x94, 0x4a, 0x25, 0x10, 0x00,
-  0x34, 0x1a, 0x0d, 0x06, 0x80, 0x00,
-  0x84, 0xc2, 0x61, 0x30, 0x90, 0x00,
-  0x27, 0x13, 0x89, 0xc4, 0xe0, 0x00,
-  0x51, 0xa8, 0xd4, 0x6a, 0x30, 0x00,
-  0x1a, 0x0d, 0x06, 0x83, 0x40, 0x00,
-  0x68, 0x34, 0x1a, 0x0d, 0x00, 0x00,
-  0x89, 0x44, 0xa2, 0x51, 0x20, 0x00,
-  0x7f, 0x4f, 0xdf, 0xd3, 0xf0, 0x00
-};
-
-const uint8_t kMaskRandom36_15[90] = {
-  0x8c, 0x46, 0x23, 0x11, 0x80, 0x00,
-  0x47, 0x23, 0x91, 0xc8, 0xe0, 0x00,
-  0x81, 0xc0, 0xe0, 0x70, 0x30, 0x00,
-  0x12, 0x89, 0x44, 0xa2, 0x50, 0x00,
-  0x58, 0x2c, 0x16, 0x0b, 0x00, 0x00,
-  0x28, 0x94, 0x4a, 0x25, 0x10, 0x00,
-  0x34, 0x1a, 0x0d, 0x06, 0x80, 0x00,
-  0x2c, 0x16, 0x0b, 0x05, 0x80, 0x00,
-  0x91, 0x48, 0xa4, 0x52, 0x20, 0x00,
-  0xc0, 0xe0, 0x70, 0x38, 0x10, 0x00,
-  0x06, 0x83, 0x41, 0xa0, 0xd0, 0x00,
-  0xc8, 0x64, 0x32, 0x19, 0x00, 0x00,
-  0x45, 0x22, 0x91, 0x48, 0xa0, 0x00,
-  0x30, 0x98, 0x4c, 0x26, 0x10, 0x00,
-  0xa2, 0x51, 0x28, 0x94, 0x40, 0x00
-};
-
-const uint8_t kMaskRandom36_16[96] = {
-  0x2c, 0x16, 0x0b, 0x05, 0x80, 0x00,
-  0x91, 0x48, 0xa4, 0x52, 0x20, 0x00,
-  0xc0, 0xe0, 0x70, 0x38, 0x10, 0x00,
-  0x06, 0x83, 0x41, 0xa0, 0xd0, 0x00,
-  0xc8, 0x64, 0x32, 0x19, 0x00, 0x00,
-  0x45, 0x22, 0x91, 0x48, 0xa0, 0x00,
-  0x30, 0x98, 0x4c, 0x26, 0x10, 0x00,
-  0xa2, 0x51, 0x28, 0x94, 0x40, 0x00,
-  0x8c, 0x46, 0x23, 0x11, 0x80, 0x00,
-  0x47, 0x23, 0x91, 0xc8, 0xe0, 0x00,
-  0x81, 0xc0, 0xe0, 0x70, 0x30, 0x00,
-  0x12, 0x89, 0x44, 0xa2, 0x50, 0x00,
-  0x58, 0x2c, 0x16, 0x0b, 0x00, 0x00,
-  0x28, 0x94, 0x4a, 0x25, 0x10, 0x00,
-  0x34, 0x1a, 0x0d, 0x06, 0x80, 0x00,
-  0xef, 0xf2, 0x3b, 0xfc, 0x80, 0x00
-};
-
-const uint8_t kMaskRandom36_17[102] = {
-  0x2c, 0x16, 0x0b, 0x05, 0x80, 0x00,
-  0x91, 0x48, 0xa4, 0x52, 0x20, 0x00,
-  0xc0, 0xe0, 0x70, 0x38, 0x10, 0x00,
-  0x06, 0x83, 0x41, 0xa0, 0xd0, 0x00,
-  0xc8, 0x64, 0x32, 0x19, 0x00, 0x00,
-  0x45, 0x22, 0x91, 0x48, 0xa0, 0x00,
-  0x30, 0x98, 0x4c, 0x26, 0x10, 0x00,
-  0xa2, 0x51, 0x28, 0x94, 0x40, 0x00,
-  0x4c, 0x26, 0x13, 0x09, 0x80, 0x00,
-  0x66, 0x33, 0x19, 0x8c, 0xc0, 0x00,
-  0x91, 0x48, 0xa4, 0x52, 0x20, 0x00,
-  0x42, 0xa1, 0x50, 0xa8, 0x50, 0x00,
-  0xa4, 0x52, 0x29, 0x14, 0x80, 0x00,
-  0x13, 0x09, 0x84, 0xc2, 0x60, 0x00,
-  0x30, 0x98, 0x4c, 0x26, 0x10, 0x00,
-  0x88, 0xc4, 0x62, 0x31, 0x10, 0x00,
-  0x09, 0x04, 0x82, 0x41, 0x20, 0x00
-};
-
-const uint8_t kMaskRandom36_18[108] = {
-  0x4c, 0x26, 0x13, 0x09, 0x80, 0x00,
-  0x66, 0x33, 0x19, 0x8c, 0xc0, 0x00,
-  0x91, 0x48, 0xa4, 0x52, 0x20, 0x00,
-  0x42, 0xa1, 0x50, 0xa8, 0x50, 0x00,
-  0xa4, 0x52, 0x29, 0x14, 0x80, 0x00,
-  0x13, 0x09, 0x84, 0xc2, 0x60, 0x00,
-  0x30, 0x98, 0x4c, 0x26, 0x10, 0x00,
-  0x88, 0xc4, 0x62, 0x31, 0x10, 0x00,
-  0x09, 0x04, 0x82, 0x41, 0x20, 0x00,
-  0x2c, 0x16, 0x0b, 0x05, 0x80, 0x00,
-  0x91, 0x48, 0xa4, 0x52, 0x20, 0x00,
-  0xc0, 0xe0, 0x70, 0x38, 0x10, 0x00,
-  0x06, 0x83, 0x41, 0xa0, 0xd0, 0x00,
-  0xc8, 0x64, 0x32, 0x19, 0x00, 0x00,
-  0x45, 0x22, 0x91, 0x48, 0xa0, 0x00,
-  0x30, 0x98, 0x4c, 0x26, 0x10, 0x00,
-  0xa2, 0x51, 0x28, 0x94, 0x40, 0x00,
-  0xd0, 0x03, 0x74, 0x00, 0xd0, 0x00
-};
-
-const uint8_t kMaskRandom36_19[114] = {
-  0x44, 0xa2, 0x51, 0x28, 0x90, 0x00,
-  0x66, 0x26, 0x19, 0x89, 0x80, 0x00,
-  0x90, 0x49, 0x64, 0x12, 0x50, 0x00,
-  0x01, 0xa5, 0x80, 0x69, 0x60, 0x00,
-  0x0e, 0x12, 0x83, 0x84, 0xa0, 0x00,
-  0x13, 0x0b, 0x04, 0xc2, 0xc0, 0x00,
-  0x20, 0xd0, 0x48, 0x34, 0x10, 0x00,
-  0xc2, 0x51, 0x30, 0x94, 0x40, 0x00,
-  0x29, 0x0c, 0x8a, 0x43, 0x20, 0x00,
-  0x8c, 0xc6, 0x63, 0x31, 0x90, 0x00,
-  0x27, 0x13, 0x89, 0xc4, 0xe0, 0x00,
-  0x32, 0x99, 0x4c, 0xa6, 0x50, 0x00,
-  0x61, 0xb0, 0xd8, 0x6c, 0x30, 0x00,
-  0x5c, 0x2e, 0x17, 0x0b, 0x80, 0x00,
-  0xcc, 0x66, 0x33, 0x19, 0x80, 0x00,
-  0x2b, 0x15, 0x8a, 0xc5, 0x60, 0x00,
-  0x32, 0x99, 0x4c, 0xa6, 0x50, 0x00,
-  0x25, 0x92, 0xc9, 0x64, 0xb0, 0x00,
-  0xfd, 0x9d, 0xff, 0x67, 0x70, 0x00
-};
-
-const uint8_t kMaskRandom36_2[12] = {
-  0xce, 0x67, 0x33, 0x99, 0xc0, 0x00,
-  0x39, 0x9c, 0xce, 0x67, 0x30, 0x00
-};
-
-const uint8_t kMaskRandom36_20[120] = {
-  0x8c, 0xc6, 0x63, 0x31, 0x90, 0x00,
-  0x27, 0x13, 0x89, 0xc4, 0xe0, 0x00,
-  0x32, 0x99, 0x4c, 0xa6, 0x50, 0x00,
-  0x61, 0xb0, 0xd8, 0x6c, 0x30, 0x00,
-  0x5c, 0x2e, 0x17, 0x0b, 0x80, 0x00,
-  0xcc, 0x66, 0x33, 0x19, 0x80, 0x00,
-  0x2b, 0x15, 0x8a, 0xc5, 0x60, 0x00,
-  0x32, 0x99, 0x4c, 0xa6, 0x50, 0x00,
-  0x25, 0x92, 0xc9, 0x64, 0xb0, 0x00,
-  0xfd, 0x9d, 0xff, 0x67, 0x70, 0x00,
-  0x44, 0xa2, 0x51, 0x28, 0x90, 0x00,
-  0x66, 0x26, 0x19, 0x89, 0x80, 0x00,
-  0x90, 0x49, 0x64, 0x12, 0x50, 0x00,
-  0x01, 0xa5, 0x80, 0x69, 0x60, 0x00,
-  0x0e, 0x12, 0x83, 0x84, 0xa0, 0x00,
-  0x13, 0x0b, 0x04, 0xc2, 0xc0, 0x00,
-  0x20, 0xd0, 0x48, 0x34, 0x10, 0x00,
-  0xc2, 0x51, 0x30, 0x94, 0x40, 0x00,
-  0x29, 0x0c, 0x8a, 0x43, 0x20, 0x00,
-  0x45, 0xb9, 0x08, 0x16, 0x30, 0x00
-};
-
-const uint8_t kMaskRandom36_21[126] = {
-  0x8c, 0xc6, 0x63, 0x31, 0x90, 0x00,
-  0x27, 0x13, 0x89, 0xc4, 0xe0, 0x00,
-  0x32, 0x99, 0x4c, 0xa6, 0x50, 0x00,
-  0x61, 0xb0, 0xd8, 0x6c, 0x30, 0x00,
-  0x5c, 0x2e, 0x17, 0x0b, 0x80, 0x00,
-  0xcc, 0x66, 0x33, 0x19, 0x80, 0x00,
-  0x2b, 0x15, 0x8a, 0xc5, 0x60, 0x00,
-  0x32, 0x99, 0x4c, 0xa6, 0x50, 0x00,
-  0x25, 0x92, 0xc9, 0x64, 0xb0, 0x00,
-  0xfd, 0x9d, 0xff, 0x67, 0x70, 0x00,
-  0x8c, 0xc6, 0x63, 0x31, 0x90, 0x00,
-  0x27, 0x13, 0x89, 0xc4, 0xe0, 0x00,
-  0x32, 0x99, 0x4c, 0xa6, 0x50, 0x00,
-  0x61, 0xb0, 0xd8, 0x6c, 0x30, 0x00,
-  0x5c, 0x2e, 0x17, 0x0b, 0x80, 0x00,
-  0x84, 0xc2, 0x61, 0x30, 0x90, 0x00,
-  0x27, 0x13, 0x89, 0xc4, 0xe0, 0x00,
-  0x51, 0xa8, 0xd4, 0x6a, 0x30, 0x00,
-  0x1a, 0x0d, 0x06, 0x83, 0x40, 0x00,
-  0x68, 0x34, 0x1a, 0x0d, 0x00, 0x00,
-  0x89, 0x44, 0xa2, 0x51, 0x20, 0x00
-};
-
-const uint8_t kMaskRandom36_22[132] = {
-  0x8c, 0xc6, 0x63, 0x31, 0x90, 0x00,
-  0x27, 0x13, 0x89, 0xc4, 0xe0, 0x00,
-  0x32, 0x99, 0x4c, 0xa6, 0x50, 0x00,
-  0x61, 0xb0, 0xd8, 0x6c, 0x30, 0x00,
-  0x5c, 0x2e, 0x17, 0x0b, 0x80, 0x00,
-  0x84, 0xc2, 0x61, 0x30, 0x90, 0x00,
-  0x27, 0x13, 0x89, 0xc4, 0xe0, 0x00,
-  0x51, 0xa8, 0xd4, 0x6a, 0x30, 0x00,
-  0x1a, 0x0d, 0x06, 0x83, 0x40, 0x00,
-  0x68, 0x34, 0x1a, 0x0d, 0x00, 0x00,
-  0x89, 0x44, 0xa2, 0x51, 0x20, 0x00,
-  0x8c, 0xc6, 0x63, 0x31, 0x90, 0x00,
-  0x27, 0x13, 0x89, 0xc4, 0xe0, 0x00,
-  0x32, 0x99, 0x4c, 0xa6, 0x50, 0x00,
-  0x61, 0xb0, 0xd8, 0x6c, 0x30, 0x00,
-  0x5c, 0x2e, 0x17, 0x0b, 0x80, 0x00,
-  0xcc, 0x66, 0x33, 0x19, 0x80, 0x00,
-  0x2b, 0x15, 0x8a, 0xc5, 0x60, 0x00,
-  0x32, 0x99, 0x4c, 0xa6, 0x50, 0x00,
-  0x25, 0x92, 0xc9, 0x64, 0xb0, 0x00,
-  0xfd, 0x9d, 0xff, 0x67, 0x70, 0x00,
-  0x71, 0x04, 0xba, 0x7b, 0xe0, 0x00
-};
-
-const uint8_t kMaskRandom36_23[138] = {
-  0x8c, 0xc6, 0x63, 0x31, 0x90, 0x00,
-  0x27, 0x13, 0x89, 0xc4, 0xe0, 0x00,
-  0x32, 0x99, 0x4c, 0xa6, 0x50, 0x00,
-  0x61, 0xb0, 0xd8, 0x6c, 0x30, 0x00,
-  0x5c, 0x2e, 0x17, 0x0b, 0x80, 0x00,
-  0x84, 0xc2, 0x61, 0x30, 0x90, 0x00,
-  0x27, 0x13, 0x89, 0xc4, 0xe0, 0x00,
-  0x51, 0xa8, 0xd4, 0x6a, 0x30, 0x00,
-  0x1a, 0x0d, 0x06, 0x83, 0x40, 0x00,
-  0x68, 0x34, 0x1a, 0x0d, 0x00, 0x00,
-  0x89, 0x44, 0xa2, 0x51, 0x20, 0x00,
-  0x84, 0xc2, 0x61, 0x30, 0x90, 0x00,
-  0x27, 0x13, 0x89, 0xc4, 0xe0, 0x00,
-  0x51, 0xa8, 0xd4, 0x6a, 0x30, 0x00,
-  0x1a, 0x0d, 0x06, 0x83, 0x40, 0x00,
-  0x68, 0x34, 0x1a, 0x0d, 0x00, 0x00,
-  0x89, 0x44, 0xa2, 0x51, 0x20, 0x00,
-  0x8c, 0xc6, 0x63, 0x31, 0x90, 0x00,
-  0x27, 0x13, 0x89, 0xc4, 0xe0, 0x00,
-  0x32, 0x99, 0x4c, 0xa6, 0x50, 0x00,
-  0x61, 0xb0, 0xd8, 0x6c, 0x30, 0x00,
-  0x5c, 0x2e, 0x17, 0x0b, 0x80, 0x00,
-  0x5b, 0x0c, 0x56, 0xc3, 0x10, 0x00
-};
-
-const uint8_t kMaskRandom36_24[144] = {
-  0x84, 0xc2, 0x61, 0x30, 0x90, 0x00,
-  0x27, 0x13, 0x89, 0xc4, 0xe0, 0x00,
-  0x51, 0xa8, 0xd4, 0x6a, 0x30, 0x00,
-  0x1a, 0x0d, 0x06, 0x83, 0x40, 0x00,
-  0x68, 0x34, 0x1a, 0x0d, 0x00, 0x00,
-  0x89, 0x44, 0xa2, 0x51, 0x20, 0x00,
-  0x8c, 0xc6, 0x63, 0x31, 0x90, 0x00,
-  0x27, 0x13, 0x89, 0xc4, 0xe0, 0x00,
-  0x32, 0x99, 0x4c, 0xa6, 0x50, 0x00,
-  0x61, 0xb0, 0xd8, 0x6c, 0x30, 0x00,
-  0x5c, 0x2e, 0x17, 0x0b, 0x80, 0x00,
-  0x5b, 0x0c, 0x56, 0xc3, 0x10, 0x00,
-  0x8c, 0xc6, 0x63, 0x31, 0x90, 0x00,
-  0x27, 0x13, 0x89, 0xc4, 0xe0, 0x00,
-  0x32, 0x99, 0x4c, 0xa6, 0x50, 0x00,
-  0x61, 0xb0, 0xd8, 0x6c, 0x30, 0x00,
-  0x5c, 0x2e, 0x17, 0x0b, 0x80, 0x00,
-  0x84, 0xc2, 0x61, 0x30, 0x90, 0x00,
-  0x27, 0x13, 0x89, 0xc4, 0xe0, 0x00,
-  0x51, 0xa8, 0xd4, 0x6a, 0x30, 0x00,
-  0x1a, 0x0d, 0x06, 0x83, 0x40, 0x00,
-  0x68, 0x34, 0x1a, 0x0d, 0x00, 0x00,
-  0x89, 0x44, 0xa2, 0x51, 0x20, 0x00,
-  0x76, 0x3a, 0xeb, 0x17, 0xc0, 0x00
-};
-
-const uint8_t kMaskRandom36_25[150] = {
-  0x84, 0xc2, 0x61, 0x30, 0x90, 0x00,
-  0x27, 0x13, 0x89, 0xc4, 0xe0, 0x00,
-  0x51, 0xa8, 0xd4, 0x6a, 0x30, 0x00,
-  0x1a, 0x0d, 0x06, 0x83, 0x40, 0x00,
-  0x68, 0x34, 0x1a, 0x0d, 0x00, 0x00,
-  0x89, 0x44, 0xa2, 0x51, 0x20, 0x00,
-  0x8c, 0xc6, 0x63, 0x31, 0x90, 0x00,
-  0x27, 0x13, 0x89, 0xc4, 0xe0, 0x00,
-  0x32, 0x99, 0x4c, 0xa6, 0x50, 0x00,
-  0x61, 0xb0, 0xd8, 0x6c, 0x30, 0x00,
-  0x5c, 0x2e, 0x17, 0x0b, 0x80, 0x00,
-  0x5b, 0x0c, 0x56, 0xc3, 0x10, 0x00,
-  0x84, 0xc2, 0x61, 0x30, 0x90, 0x00,
-  0x27, 0x13, 0x89, 0xc4, 0xe0, 0x00,
-  0x51, 0xa8, 0xd4, 0x6a, 0x30, 0x00,
-  0x1a, 0x0d, 0x06, 0x83, 0x40, 0x00,
-  0x68, 0x34, 0x1a, 0x0d, 0x00, 0x00,
-  0x89, 0x44, 0xa2, 0x51, 0x20, 0x00,
-  0x8c, 0x46, 0x23, 0x11, 0x80, 0x00,
-  0x47, 0x23, 0x91, 0xc8, 0xe0, 0x00,
-  0x81, 0xc0, 0xe0, 0x70, 0x30, 0x00,
-  0x12, 0x89, 0x44, 0xa2, 0x50, 0x00,
-  0x58, 0x2c, 0x16, 0x0b, 0x00, 0x00,
-  0x28, 0x94, 0x4a, 0x25, 0x10, 0x00,
-  0x34, 0x1a, 0x0d, 0x06, 0x80, 0x00
-};
-
-const uint8_t kMaskRandom36_26[156] = {
-  0x84, 0xc2, 0x61, 0x30, 0x90, 0x00,
-  0x27, 0x13, 0x89, 0xc4, 0xe0, 0x00,
-  0x51, 0xa8, 0xd4, 0x6a, 0x30, 0x00,
-  0x1a, 0x0d, 0x06, 0x83, 0x40, 0x00,
-  0x68, 0x34, 0x1a, 0x0d, 0x00, 0x00,
-  0x89, 0x44, 0xa2, 0x51, 0x20, 0x00,
-  0x8c, 0x46, 0x23, 0x11, 0x80, 0x00,
-  0x47, 0x23, 0x91, 0xc8, 0xe0, 0x00,
-  0x81, 0xc0, 0xe0, 0x70, 0x30, 0x00,
-  0x12, 0x89, 0x44, 0xa2, 0x50, 0x00,
-  0x58, 0x2c, 0x16, 0x0b, 0x00, 0x00,
-  0x28, 0x94, 0x4a, 0x25, 0x10, 0x00,
-  0x34, 0x1a, 0x0d, 0x06, 0x80, 0x00,
-  0x84, 0xc2, 0x61, 0x30, 0x90, 0x00,
-  0x27, 0x13, 0x89, 0xc4, 0xe0, 0x00,
-  0x51, 0xa8, 0xd4, 0x6a, 0x30, 0x00,
-  0x1a, 0x0d, 0x06, 0x83, 0x40, 0x00,
-  0x68, 0x34, 0x1a, 0x0d, 0x00, 0x00,
-  0x89, 0x44, 0xa2, 0x51, 0x20, 0x00,
-  0x8c, 0xc6, 0x63, 0x31, 0x90, 0x00,
-  0x27, 0x13, 0x89, 0xc4, 0xe0, 0x00,
-  0x32, 0x99, 0x4c, 0xa6, 0x50, 0x00,
-  0x61, 0xb0, 0xd8, 0x6c, 0x30, 0x00,
-  0x5c, 0x2e, 0x17, 0x0b, 0x80, 0x00,
-  0x5b, 0x0c, 0x56, 0xc3, 0x10, 0x00,
-  0xec, 0x58, 0x0e, 0x6c, 0xe0, 0x00
-};
-
-const uint8_t kMaskRandom36_27[162] = {
-  0x84, 0xc2, 0x61, 0x30, 0x90, 0x00,
-  0x27, 0x13, 0x89, 0xc4, 0xe0, 0x00,
-  0x51, 0xa8, 0xd4, 0x6a, 0x30, 0x00,
-  0x1a, 0x0d, 0x06, 0x83, 0x40, 0x00,
-  0x68, 0x34, 0x1a, 0x0d, 0x00, 0x00,
-  0x89, 0x44, 0xa2, 0x51, 0x20, 0x00,
-  0x8c, 0x46, 0x23, 0x11, 0x80, 0x00,
-  0x47, 0x23, 0x91, 0xc8, 0xe0, 0x00,
-  0x81, 0xc0, 0xe0, 0x70, 0x30, 0x00,
-  0x12, 0x89, 0x44, 0xa2, 0x50, 0x00,
-  0x58, 0x2c, 0x16, 0x0b, 0x00, 0x00,
-  0x28, 0x94, 0x4a, 0x25, 0x10, 0x00,
-  0x34, 0x1a, 0x0d, 0x06, 0x80, 0x00,
-  0x8c, 0x46, 0x23, 0x11, 0x80, 0x00,
-  0x47, 0x23, 0x91, 0xc8, 0xe0, 0x00,
-  0x81, 0xc0, 0xe0, 0x70, 0x30, 0x00,
-  0x12, 0x89, 0x44, 0xa2, 0x50, 0x00,
-  0x58, 0x2c, 0x16, 0x0b, 0x00, 0x00,
-  0x28, 0x94, 0x4a, 0x25, 0x10, 0x00,
-  0x34, 0x1a, 0x0d, 0x06, 0x80, 0x00,
-  0x84, 0xc2, 0x61, 0x30, 0x90, 0x00,
-  0x27, 0x13, 0x89, 0xc4, 0xe0, 0x00,
-  0x51, 0xa8, 0xd4, 0x6a, 0x30, 0x00,
-  0x1a, 0x0d, 0x06, 0x83, 0x40, 0x00,
-  0x68, 0x34, 0x1a, 0x0d, 0x00, 0x00,
-  0x89, 0x44, 0xa2, 0x51, 0x20, 0x00,
-  0x7f, 0x4f, 0xdf, 0xd3, 0xf0, 0x00
-};
-
-const uint8_t kMaskRandom36_28[168] = {
-  0x8c, 0x46, 0x23, 0x11, 0x80, 0x00,
-  0x47, 0x23, 0x91, 0xc8, 0xe0, 0x00,
-  0x81, 0xc0, 0xe0, 0x70, 0x30, 0x00,
-  0x12, 0x89, 0x44, 0xa2, 0x50, 0x00,
-  0x58, 0x2c, 0x16, 0x0b, 0x00, 0x00,
-  0x28, 0x94, 0x4a, 0x25, 0x10, 0x00,
-  0x34, 0x1a, 0x0d, 0x06, 0x80, 0x00,
-  0x84, 0xc2, 0x61, 0x30, 0x90, 0x00,
-  0x27, 0x13, 0x89, 0xc4, 0xe0, 0x00,
-  0x51, 0xa8, 0xd4, 0x6a, 0x30, 0x00,
-  0x1a, 0x0d, 0x06, 0x83, 0x40, 0x00,
-  0x68, 0x34, 0x1a, 0x0d, 0x00, 0x00,
-  0x89, 0x44, 0xa2, 0x51, 0x20, 0x00,
-  0x7f, 0x4f, 0xdf, 0xd3, 0xf0, 0x00,
-  0x84, 0xc2, 0x61, 0x30, 0x90, 0x00,
-  0x27, 0x13, 0x89, 0xc4, 0xe0, 0x00,
-  0x51, 0xa8, 0xd4, 0x6a, 0x30, 0x00,
-  0x1a, 0x0d, 0x06, 0x83, 0x40, 0x00,
-  0x68, 0x34, 0x1a, 0x0d, 0x00, 0x00,
-  0x89, 0x44, 0xa2, 0x51, 0x20, 0x00,
-  0x8c, 0x46, 0x23, 0x11, 0x80, 0x00,
-  0x47, 0x23, 0x91, 0xc8, 0xe0, 0x00,
-  0x81, 0xc0, 0xe0, 0x70, 0x30, 0x00,
-  0x12, 0x89, 0x44, 0xa2, 0x50, 0x00,
-  0x58, 0x2c, 0x16, 0x0b, 0x00, 0x00,
-  0x28, 0x94, 0x4a, 0x25, 0x10, 0x00,
-  0x34, 0x1a, 0x0d, 0x06, 0x80, 0x00,
-  0x29, 0xfd, 0x91, 0x6f, 0xd0, 0x00
-};
-
-const uint8_t kMaskRandom36_29[174] = {
-  0x8c, 0x46, 0x23, 0x11, 0x80, 0x00,
-  0x47, 0x23, 0x91, 0xc8, 0xe0, 0x00,
-  0x81, 0xc0, 0xe0, 0x70, 0x30, 0x00,
-  0x12, 0x89, 0x44, 0xa2, 0x50, 0x00,
-  0x58, 0x2c, 0x16, 0x0b, 0x00, 0x00,
-  0x28, 0x94, 0x4a, 0x25, 0x10, 0x00,
-  0x34, 0x1a, 0x0d, 0x06, 0x80, 0x00,
-  0x84, 0xc2, 0x61, 0x30, 0x90, 0x00,
-  0x27, 0x13, 0x89, 0xc4, 0xe0, 0x00,
-  0x51, 0xa8, 0xd4, 0x6a, 0x30, 0x00,
-  0x1a, 0x0d, 0x06, 0x83, 0x40, 0x00,
-  0x68, 0x34, 0x1a, 0x0d, 0x00, 0x00,
-  0x89, 0x44, 0xa2, 0x51, 0x20, 0x00,
-  0x7f, 0x4f, 0xdf, 0xd3, 0xf0, 0x00,
-  0x8c, 0x46, 0x23, 0x11, 0x80, 0x00,
-  0x47, 0x23, 0x91, 0xc8, 0xe0, 0x00,
-  0x81, 0xc0, 0xe0, 0x70, 0x30, 0x00,
-  0x12, 0x89, 0x44, 0xa2, 0x50, 0x00,
-  0x58, 0x2c, 0x16, 0x0b, 0x00, 0x00,
-  0x28, 0x94, 0x4a, 0x25, 0x10, 0x00,
-  0x34, 0x1a, 0x0d, 0x06, 0x80, 0x00,
-  0x2c, 0x16, 0x0b, 0x05, 0x80, 0x00,
-  0x91, 0x48, 0xa4, 0x52, 0x20, 0x00,
-  0xc0, 0xe0, 0x70, 0x38, 0x10, 0x00,
-  0x06, 0x83, 0x41, 0xa0, 0xd0, 0x00,
-  0xc8, 0x64, 0x32, 0x19, 0x00, 0x00,
-  0x45, 0x22, 0x91, 0x48, 0xa0, 0x00,
-  0x30, 0x98, 0x4c, 0x26, 0x10, 0x00,
-  0xa2, 0x51, 0x28, 0x94, 0x40, 0x00
-};
-
-const uint8_t kMaskRandom36_3[18] = {
-  0xcc, 0x66, 0x33, 0x19, 0x80, 0x00,
-  0x27, 0x15, 0x89, 0xc5, 0x60, 0x00,
-  0x92, 0xc9, 0x64, 0xb2, 0x50, 0x00
-};
-
-const uint8_t kMaskRandom36_30[180] = {
-  0x8c, 0x46, 0x23, 0x11, 0x80, 0x00,
-  0x47, 0x23, 0x91, 0xc8, 0xe0, 0x00,
-  0x81, 0xc0, 0xe0, 0x70, 0x30, 0x00,
-  0x12, 0x89, 0x44, 0xa2, 0x50, 0x00,
-  0x58, 0x2c, 0x16, 0x0b, 0x00, 0x00,
-  0x28, 0x94, 0x4a, 0x25, 0x10, 0x00,
-  0x34, 0x1a, 0x0d, 0x06, 0x80, 0x00,
-  0x2c, 0x16, 0x0b, 0x05, 0x80, 0x00,
-  0x91, 0x48, 0xa4, 0x52, 0x20, 0x00,
-  0xc0, 0xe0, 0x70, 0x38, 0x10, 0x00,
-  0x06, 0x83, 0x41, 0xa0, 0xd0, 0x00,
-  0xc8, 0x64, 0x32, 0x19, 0x00, 0x00,
-  0x45, 0x22, 0x91, 0x48, 0xa0, 0x00,
-  0x30, 0x98, 0x4c, 0x26, 0x10, 0x00,
-  0xa2, 0x51, 0x28, 0x94, 0x40, 0x00,
-  0x8c, 0x46, 0x23, 0x11, 0x80, 0x00,
-  0x47, 0x23, 0x91, 0xc8, 0xe0, 0x00,
-  0x81, 0xc0, 0xe0, 0x70, 0x30, 0x00,
-  0x12, 0x89, 0x44, 0xa2, 0x50, 0x00,
-  0x58, 0x2c, 0x16, 0x0b, 0x00, 0x00,
-  0x28, 0x94, 0x4a, 0x25, 0x10, 0x00,
-  0x34, 0x1a, 0x0d, 0x06, 0x80, 0x00,
-  0x84, 0xc2, 0x61, 0x30, 0x90, 0x00,
-  0x27, 0x13, 0x89, 0xc4, 0xe0, 0x00,
-  0x51, 0xa8, 0xd4, 0x6a, 0x30, 0x00,
-  0x1a, 0x0d, 0x06, 0x83, 0x40, 0x00,
-  0x68, 0x34, 0x1a, 0x0d, 0x00, 0x00,
-  0x89, 0x44, 0xa2, 0x51, 0x20, 0x00,
-  0x7f, 0x4f, 0xdf, 0xd3, 0xf0, 0x00,
-  0xc5, 0x38, 0xbb, 0x98, 0x80, 0x00
-};
-
-const uint8_t kMaskRandom36_31[186] = {
-  0x8c, 0x46, 0x23, 0x11, 0x80, 0x00,
-  0x47, 0x23, 0x91, 0xc8, 0xe0, 0x00,
-  0x81, 0xc0, 0xe0, 0x70, 0x30, 0x00,
-  0x12, 0x89, 0x44, 0xa2, 0x50, 0x00,
-  0x58, 0x2c, 0x16, 0x0b, 0x00, 0x00,
-  0x28, 0x94, 0x4a, 0x25, 0x10, 0x00,
-  0x34, 0x1a, 0x0d, 0x06, 0x80, 0x00,
-  0x2c, 0x16, 0x0b, 0x05, 0x80, 0x00,
-  0x91, 0x48, 0xa4, 0x52, 0x20, 0x00,
-  0xc0, 0xe0, 0x70, 0x38, 0x10, 0x00,
-  0x06, 0x83, 0x41, 0xa0, 0xd0, 0x00,
-  0xc8, 0x64, 0x32, 0x19, 0x00, 0x00,
-  0x45, 0x22, 0x91, 0x48, 0xa0, 0x00,
-  0x30, 0x98, 0x4c, 0x26, 0x10, 0x00,
-  0xa2, 0x51, 0x28, 0x94, 0x40, 0x00,
-  0x2c, 0x16, 0x0b, 0x05, 0x80, 0x00,
-  0x91, 0x48, 0xa4, 0x52, 0x20, 0x00,
-  0xc0, 0xe0, 0x70, 0x38, 0x10, 0x00,
-  0x06, 0x83, 0x41, 0xa0, 0xd0, 0x00,
-  0xc8, 0x64, 0x32, 0x19, 0x00, 0x00,
-  0x45, 0x22, 0x91, 0x48, 0xa0, 0x00,
-  0x30, 0x98, 0x4c, 0x26, 0x10, 0x00,
-  0xa2, 0x51, 0x28, 0x94, 0x40, 0x00,
-  0x8c, 0x46, 0x23, 0x11, 0x80, 0x00,
-  0x47, 0x23, 0x91, 0xc8, 0xe0, 0x00,
-  0x81, 0xc0, 0xe0, 0x70, 0x30, 0x00,
-  0x12, 0x89, 0x44, 0xa2, 0x50, 0x00,
-  0x58, 0x2c, 0x16, 0x0b, 0x00, 0x00,
-  0x28, 0x94, 0x4a, 0x25, 0x10, 0x00,
-  0x34, 0x1a, 0x0d, 0x06, 0x80, 0x00,
-  0xef, 0xf2, 0x3b, 0xfc, 0x80, 0x00
-};
-
-const uint8_t kMaskRandom36_32[192] = {
-  0x2c, 0x16, 0x0b, 0x05, 0x80, 0x00,
-  0x91, 0x48, 0xa4, 0x52, 0x20, 0x00,
-  0xc0, 0xe0, 0x70, 0x38, 0x10, 0x00,
-  0x06, 0x83, 0x41, 0xa0, 0xd0, 0x00,
-  0xc8, 0x64, 0x32, 0x19, 0x00, 0x00,
-  0x45, 0x22, 0x91, 0x48, 0xa0, 0x00,
-  0x30, 0x98, 0x4c, 0x26, 0x10, 0x00,
-  0xa2, 0x51, 0x28, 0x94, 0x40, 0x00,
-  0x8c, 0x46, 0x23, 0x11, 0x80, 0x00,
-  0x47, 0x23, 0x91, 0xc8, 0xe0, 0x00,
-  0x81, 0xc0, 0xe0, 0x70, 0x30, 0x00,
-  0x12, 0x89, 0x44, 0xa2, 0x50, 0x00,
-  0x58, 0x2c, 0x16, 0x0b, 0x00, 0x00,
-  0x28, 0x94, 0x4a, 0x25, 0x10, 0x00,
-  0x34, 0x1a, 0x0d, 0x06, 0x80, 0x00,
-  0xef, 0xf2, 0x3b, 0xfc, 0x80, 0x00,
-  0x8c, 0x46, 0x23, 0x11, 0x80, 0x00,
-  0x47, 0x23, 0x91, 0xc8, 0xe0, 0x00,
-  0x81, 0xc0, 0xe0, 0x70, 0x30, 0x00,
-  0x12, 0x89, 0x44, 0xa2, 0x50, 0x00,
-  0x58, 0x2c, 0x16, 0x0b, 0x00, 0x00,
-  0x28, 0x94, 0x4a, 0x25, 0x10, 0x00,
-  0x34, 0x1a, 0x0d, 0x06, 0x80, 0x00,
-  0x2c, 0x16, 0x0b, 0x05, 0x80, 0x00,
-  0x91, 0x48, 0xa4, 0x52, 0x20, 0x00,
-  0xc0, 0xe0, 0x70, 0x38, 0x10, 0x00,
-  0x06, 0x83, 0x41, 0xa0, 0xd0, 0x00,
-  0xc8, 0x64, 0x32, 0x19, 0x00, 0x00,
-  0x45, 0x22, 0x91, 0x48, 0xa0, 0x00,
-  0x30, 0x98, 0x4c, 0x26, 0x10, 0x00,
-  0xa2, 0x51, 0x28, 0x94, 0x40, 0x00,
-  0x3a, 0x28, 0x9c, 0x2f, 0xc0, 0x00
-};
-
-const uint8_t kMaskRandom36_33[198] = {
-  0x2c, 0x16, 0x0b, 0x05, 0x80, 0x00,
-  0x91, 0x48, 0xa4, 0x52, 0x20, 0x00,
-  0xc0, 0xe0, 0x70, 0x38, 0x10, 0x00,
-  0x06, 0x83, 0x41, 0xa0, 0xd0, 0x00,
-  0xc8, 0x64, 0x32, 0x19, 0x00, 0x00,
-  0x45, 0x22, 0x91, 0x48, 0xa0, 0x00,
-  0x30, 0x98, 0x4c, 0x26, 0x10, 0x00,
-  0xa2, 0x51, 0x28, 0x94, 0x40, 0x00,
-  0x8c, 0x46, 0x23, 0x11, 0x80, 0x00,
-  0x47, 0x23, 0x91, 0xc8, 0xe0, 0x00,
-  0x81, 0xc0, 0xe0, 0x70, 0x30, 0x00,
-  0x12, 0x89, 0x44, 0xa2, 0x50, 0x00,
-  0x58, 0x2c, 0x16, 0x0b, 0x00, 0x00,
-  0x28, 0x94, 0x4a, 0x25, 0x10, 0x00,
-  0x34, 0x1a, 0x0d, 0x06, 0x80, 0x00,
-  0xef, 0xf2, 0x3b, 0xfc, 0x80, 0x00,
-  0x2c, 0x16, 0x0b, 0x05, 0x80, 0x00,
-  0x91, 0x48, 0xa4, 0x52, 0x20, 0x00,
-  0xc0, 0xe0, 0x70, 0x38, 0x10, 0x00,
-  0x06, 0x83, 0x41, 0xa0, 0xd0, 0x00,
-  0xc8, 0x64, 0x32, 0x19, 0x00, 0x00,
-  0x45, 0x22, 0x91, 0x48, 0xa0, 0x00,
-  0x30, 0x98, 0x4c, 0x26, 0x10, 0x00,
-  0xa2, 0x51, 0x28, 0x94, 0x40, 0x00,
-  0x4c, 0x26, 0x13, 0x09, 0x80, 0x00,
-  0x66, 0x33, 0x19, 0x8c, 0xc0, 0x00,
-  0x91, 0x48, 0xa4, 0x52, 0x20, 0x00,
-  0x42, 0xa1, 0x50, 0xa8, 0x50, 0x00,
-  0xa4, 0x52, 0x29, 0x14, 0x80, 0x00,
-  0x13, 0x09, 0x84, 0xc2, 0x60, 0x00,
-  0x30, 0x98, 0x4c, 0x26, 0x10, 0x00,
-  0x88, 0xc4, 0x62, 0x31, 0x10, 0x00,
-  0x09, 0x04, 0x82, 0x41, 0x20, 0x00
-};
-
-const uint8_t kMaskRandom36_34[204] = {
-  0x2c, 0x16, 0x0b, 0x05, 0x80, 0x00,
-  0x91, 0x48, 0xa4, 0x52, 0x20, 0x00,
-  0xc0, 0xe0, 0x70, 0x38, 0x10, 0x00,
-  0x06, 0x83, 0x41, 0xa0, 0xd0, 0x00,
-  0xc8, 0x64, 0x32, 0x19, 0x00, 0x00,
-  0x45, 0x22, 0x91, 0x48, 0xa0, 0x00,
-  0x30, 0x98, 0x4c, 0x26, 0x10, 0x00,
-  0xa2, 0x51, 0x28, 0x94, 0x40, 0x00,
-  0x4c, 0x26, 0x13, 0x09, 0x80, 0x00,
-  0x66, 0x33, 0x19, 0x8c, 0xc0, 0x00,
-  0x91, 0x48, 0xa4, 0x52, 0x20, 0x00,
-  0x42, 0xa1, 0x50, 0xa8, 0x50, 0x00,
-  0xa4, 0x52, 0x29, 0x14, 0x80, 0x00,
-  0x13, 0x09, 0x84, 0xc2, 0x60, 0x00,
-  0x30, 0x98, 0x4c, 0x26, 0x10, 0x00,
-  0x88, 0xc4, 0x62, 0x31, 0x10, 0x00,
-  0x09, 0x04, 0x82, 0x41, 0x20, 0x00,
-  0x2c, 0x16, 0x0b, 0x05, 0x80, 0x00,
-  0x91, 0x48, 0xa4, 0x52, 0x20, 0x00,
-  0xc0, 0xe0, 0x70, 0x38, 0x10, 0x00,
-  0x06, 0x83, 0x41, 0xa0, 0xd0, 0x00,
-  0xc8, 0x64, 0x32, 0x19, 0x00, 0x00,
-  0x45, 0x22, 0x91, 0x48, 0xa0, 0x00,
-  0x30, 0x98, 0x4c, 0x26, 0x10, 0x00,
-  0xa2, 0x51, 0x28, 0x94, 0x40, 0x00,
-  0x8c, 0x46, 0x23, 0x11, 0x80, 0x00,
-  0x47, 0x23, 0x91, 0xc8, 0xe0, 0x00,
-  0x81, 0xc0, 0xe0, 0x70, 0x30, 0x00,
-  0x12, 0x89, 0x44, 0xa2, 0x50, 0x00,
-  0x58, 0x2c, 0x16, 0x0b, 0x00, 0x00,
-  0x28, 0x94, 0x4a, 0x25, 0x10, 0x00,
-  0x34, 0x1a, 0x0d, 0x06, 0x80, 0x00,
-  0xef, 0xf2, 0x3b, 0xfc, 0x80, 0x00,
-  0xf7, 0x5e, 0x66, 0x5b, 0x60, 0x00
-};
-
-const uint8_t kMaskRandom36_35[210] = {
-  0x2c, 0x16, 0x0b, 0x05, 0x80, 0x00,
-  0x91, 0x48, 0xa4, 0x52, 0x20, 0x00,
-  0xc0, 0xe0, 0x70, 0x38, 0x10, 0x00,
-  0x06, 0x83, 0x41, 0xa0, 0xd0, 0x00,
-  0xc8, 0x64, 0x32, 0x19, 0x00, 0x00,
-  0x45, 0x22, 0x91, 0x48, 0xa0, 0x00,
-  0x30, 0x98, 0x4c, 0x26, 0x10, 0x00,
-  0xa2, 0x51, 0x28, 0x94, 0x40, 0x00,
-  0x4c, 0x26, 0x13, 0x09, 0x80, 0x00,
-  0x66, 0x33, 0x19, 0x8c, 0xc0, 0x00,
-  0x91, 0x48, 0xa4, 0x52, 0x20, 0x00,
-  0x42, 0xa1, 0x50, 0xa8, 0x50, 0x00,
-  0xa4, 0x52, 0x29, 0x14, 0x80, 0x00,
-  0x13, 0x09, 0x84, 0xc2, 0x60, 0x00,
-  0x30, 0x98, 0x4c, 0x26, 0x10, 0x00,
-  0x88, 0xc4, 0x62, 0x31, 0x10, 0x00,
-  0x09, 0x04, 0x82, 0x41, 0x20, 0x00,
-  0x4c, 0x26, 0x13, 0x09, 0x80, 0x00,
-  0x66, 0x33, 0x19, 0x8c, 0xc0, 0x00,
-  0x91, 0x48, 0xa4, 0x52, 0x20, 0x00,
-  0x42, 0xa1, 0x50, 0xa8, 0x50, 0x00,
-  0xa4, 0x52, 0x29, 0x14, 0x80, 0x00,
-  0x13, 0x09, 0x84, 0xc2, 0x60, 0x00,
-  0x30, 0x98, 0x4c, 0x26, 0x10, 0x00,
-  0x88, 0xc4, 0x62, 0x31, 0x10, 0x00,
-  0x09, 0x04, 0x82, 0x41, 0x20, 0x00,
-  0x2c, 0x16, 0x0b, 0x05, 0x80, 0x00,
-  0x91, 0x48, 0xa4, 0x52, 0x20, 0x00,
-  0xc0, 0xe0, 0x70, 0x38, 0x10, 0x00,
-  0x06, 0x83, 0x41, 0xa0, 0xd0, 0x00,
-  0xc8, 0x64, 0x32, 0x19, 0x00, 0x00,
-  0x45, 0x22, 0x91, 0x48, 0xa0, 0x00,
-  0x30, 0x98, 0x4c, 0x26, 0x10, 0x00,
-  0xa2, 0x51, 0x28, 0x94, 0x40, 0x00,
-  0xd0, 0x03, 0x74, 0x00, 0xd0, 0x00
-};
-
-const uint8_t kMaskRandom36_36[216] = {
-  0x4c, 0x26, 0x13, 0x09, 0x80, 0x00,
-  0x66, 0x33, 0x19, 0x8c, 0xc0, 0x00,
-  0x91, 0x48, 0xa4, 0x52, 0x20, 0x00,
-  0x42, 0xa1, 0x50, 0xa8, 0x50, 0x00,
-  0xa4, 0x52, 0x29, 0x14, 0x80, 0x00,
-  0x13, 0x09, 0x84, 0xc2, 0x60, 0x00,
-  0x30, 0x98, 0x4c, 0x26, 0x10, 0x00,
-  0x88, 0xc4, 0x62, 0x31, 0x10, 0x00,
-  0x09, 0x04, 0x82, 0x41, 0x20, 0x00,
-  0x2c, 0x16, 0x0b, 0x05, 0x80, 0x00,
-  0x91, 0x48, 0xa4, 0x52, 0x20, 0x00,
-  0xc0, 0xe0, 0x70, 0x38, 0x10, 0x00,
-  0x06, 0x83, 0x41, 0xa0, 0xd0, 0x00,
-  0xc8, 0x64, 0x32, 0x19, 0x00, 0x00,
-  0x45, 0x22, 0x91, 0x48, 0xa0, 0x00,
-  0x30, 0x98, 0x4c, 0x26, 0x10, 0x00,
-  0xa2, 0x51, 0x28, 0x94, 0x40, 0x00,
-  0xd0, 0x03, 0x74, 0x00, 0xd0, 0x00,
-  0x2c, 0x16, 0x0b, 0x05, 0x80, 0x00,
-  0x91, 0x48, 0xa4, 0x52, 0x20, 0x00,
-  0xc0, 0xe0, 0x70, 0x38, 0x10, 0x00,
-  0x06, 0x83, 0x41, 0xa0, 0xd0, 0x00,
-  0xc8, 0x64, 0x32, 0x19, 0x00, 0x00,
-  0x45, 0x22, 0x91, 0x48, 0xa0, 0x00,
-  0x30, 0x98, 0x4c, 0x26, 0x10, 0x00,
-  0xa2, 0x51, 0x28, 0x94, 0x40, 0x00,
-  0x4c, 0x26, 0x13, 0x09, 0x80, 0x00,
-  0x66, 0x33, 0x19, 0x8c, 0xc0, 0x00,
-  0x91, 0x48, 0xa4, 0x52, 0x20, 0x00,
-  0x42, 0xa1, 0x50, 0xa8, 0x50, 0x00,
-  0xa4, 0x52, 0x29, 0x14, 0x80, 0x00,
-  0x13, 0x09, 0x84, 0xc2, 0x60, 0x00,
-  0x30, 0x98, 0x4c, 0x26, 0x10, 0x00,
-  0x88, 0xc4, 0x62, 0x31, 0x10, 0x00,
-  0x09, 0x04, 0x82, 0x41, 0x20, 0x00,
-  0xa4, 0x9c, 0x31, 0x13, 0x80, 0x00
-};
-
-const uint8_t kMaskRandom36_4[24] = {
-  0xec, 0x76, 0x3b, 0x1d, 0x80, 0x00,
-  0x67, 0x33, 0x99, 0xcc, 0xe0, 0x00,
-  0xb1, 0xd8, 0xec, 0x76, 0x30, 0x00,
-  0x5a, 0xad, 0x56, 0xab, 0x50, 0x00
-};
-
-const uint8_t kMaskRandom36_5[30] = {
-  0x4c, 0xa6, 0x53, 0x29, 0x90, 0x00,
-  0x66, 0x33, 0x19, 0x8c, 0xc0, 0x00,
-  0x19, 0xd0, 0xc6, 0x74, 0x30, 0x00,
-  0x9c, 0x89, 0x67, 0x22, 0x50, 0x00,
-  0xe3, 0x4c, 0x38, 0xd3, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom36_6[36] = {
-  0xcc, 0x26, 0x33, 0x09, 0x80, 0x00,
-  0x45, 0x62, 0x91, 0x58, 0xa0, 0x00,
-  0xb0, 0x98, 0x6c, 0x26, 0x10, 0x00,
-  0x8a, 0x85, 0x62, 0xa1, 0x50, 0x00,
-  0x29, 0x53, 0x0a, 0x54, 0xc0, 0x00,
-  0xa6, 0x0a, 0xa9, 0x82, 0xa0, 0x00
-};
-
-const uint8_t kMaskRandom36_7[42] = {
-  0x44, 0xa2, 0x51, 0x28, 0x90, 0x00,
-  0x23, 0x11, 0x88, 0xc4, 0x60, 0x00,
-  0x91, 0x48, 0xa4, 0x52, 0x20, 0x00,
-  0x0a, 0x85, 0x42, 0xa1, 0x50, 0x00,
-  0x34, 0x1a, 0x0d, 0x06, 0x80, 0x00,
-  0x0b, 0x06, 0x82, 0xc1, 0xa0, 0x00,
-  0xe0, 0x64, 0x38, 0x19, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom36_8[48] = {
-  0x16, 0x0b, 0x05, 0x82, 0xc0, 0x00,
-  0xc2, 0x61, 0x30, 0x98, 0x40, 0x00,
-  0x60, 0xb0, 0x58, 0x2c, 0x10, 0x00,
-  0x85, 0x42, 0xa1, 0x50, 0xa0, 0x00,
-  0x4c, 0x26, 0x13, 0x09, 0x80, 0x00,
-  0x29, 0x14, 0x8a, 0x45, 0x20, 0x00,
-  0x11, 0x88, 0xc4, 0x62, 0x30, 0x00,
-  0xb0, 0x58, 0x2c, 0x16, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom36_9[54] = {
-  0x44, 0xa2, 0x51, 0x28, 0x90, 0x00,
-  0x66, 0x26, 0x19, 0x89, 0x80, 0x00,
-  0x90, 0x49, 0x64, 0x12, 0x50, 0x00,
-  0x01, 0xa5, 0x80, 0x69, 0x60, 0x00,
-  0x0e, 0x12, 0x83, 0x84, 0xa0, 0x00,
-  0x13, 0x0b, 0x04, 0xc2, 0xc0, 0x00,
-  0x20, 0xd0, 0x48, 0x34, 0x10, 0x00,
-  0xc2, 0x51, 0x30, 0x94, 0x40, 0x00,
-  0x29, 0x0c, 0x8a, 0x43, 0x20, 0x00
-};
-
-const uint8_t kMaskRandom37_1[6] = {
-  0xff, 0xff, 0xff, 0xff, 0xf8, 0x00
-};
-
-const uint8_t kMaskRandom37_10[60] = {
-  0x8c, 0xc6, 0x63, 0x38, 0xc0, 0x00,
-  0x27, 0x13, 0x89, 0xc4, 0x70, 0x00,
-  0x32, 0x99, 0x4c, 0xa3, 0x48, 0x00,
-  0x61, 0xb0, 0xd8, 0x64, 0x98, 0x00,
-  0x5c, 0x2e, 0x17, 0x0e, 0x20, 0x00,
-  0xcc, 0x66, 0x33, 0x1d, 0x40, 0x00,
-  0x2b, 0x15, 0x8a, 0xc6, 0x70, 0x00,
-  0x32, 0x99, 0x4c, 0xb4, 0x98, 0x00,
-  0x25, 0x92, 0xc9, 0x63, 0xa8, 0x00,
-  0xfd, 0x9d, 0xd4, 0x22, 0x30, 0x00
-};
-
-const uint8_t kMaskRandom37_11[66] = {
-  0x8c, 0xc6, 0x63, 0x38, 0xc0, 0x00,
-  0x27, 0x13, 0x89, 0xc4, 0x70, 0x00,
-  0x32, 0x99, 0x4c, 0xa3, 0x48, 0x00,
-  0x61, 0xb0, 0xd8, 0x64, 0x98, 0x00,
-  0x5c, 0x2e, 0x17, 0x0e, 0x20, 0x00,
-  0x84, 0xc2, 0x61, 0x21, 0xc0, 0x00,
-  0x27, 0x13, 0x89, 0xc6, 0x60, 0x00,
-  0x51, 0xa8, 0xd4, 0x62, 0x18, 0x00,
-  0x1a, 0x0d, 0x06, 0x88, 0xa8, 0x00,
-  0x68, 0x34, 0x1a, 0x11, 0x10, 0x00,
-  0x89, 0x44, 0xa2, 0x5c, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom37_12[72] = {
-  0x84, 0xc2, 0x61, 0x21, 0xc0, 0x00,
-  0x27, 0x13, 0x89, 0xc6, 0x60, 0x00,
-  0x51, 0xa8, 0xd4, 0x62, 0x18, 0x00,
-  0x1a, 0x0d, 0x06, 0x88, 0xa8, 0x00,
-  0x68, 0x34, 0x1a, 0x11, 0x10, 0x00,
-  0x89, 0x44, 0xa2, 0x5c, 0x00, 0x00,
-  0x8c, 0xc6, 0x63, 0x38, 0xc0, 0x00,
-  0x27, 0x13, 0x89, 0xc4, 0x70, 0x00,
-  0x32, 0x99, 0x4c, 0xa3, 0x48, 0x00,
-  0x61, 0xb0, 0xd8, 0x64, 0x98, 0x00,
-  0x5c, 0x2e, 0x17, 0x0e, 0x20, 0x00,
-  0x5b, 0x0c, 0x64, 0x32, 0x20, 0x00
-};
-
-const uint8_t kMaskRandom37_13[78] = {
-  0x84, 0xc2, 0x61, 0x21, 0xc0, 0x00,
-  0x27, 0x13, 0x89, 0xc6, 0x60, 0x00,
-  0x51, 0xa8, 0xd4, 0x62, 0x18, 0x00,
-  0x1a, 0x0d, 0x06, 0x88, 0xa8, 0x00,
-  0x68, 0x34, 0x1a, 0x11, 0x10, 0x00,
-  0x89, 0x44, 0xa2, 0x5c, 0x00, 0x00,
-  0x8c, 0x46, 0x23, 0x08, 0xc0, 0x00,
-  0x47, 0x23, 0x91, 0xc6, 0x60, 0x00,
-  0x81, 0xc0, 0xe0, 0x62, 0x18, 0x00,
-  0x12, 0x89, 0x44, 0xa1, 0x88, 0x00,
-  0x58, 0x2c, 0x16, 0x05, 0x10, 0x00,
-  0x28, 0x94, 0x4a, 0x32, 0x80, 0x00,
-  0x34, 0x1a, 0x0d, 0x18, 0x20, 0x00
-};
-
-const uint8_t kMaskRandom37_14[84] = {
-  0x8c, 0x46, 0x23, 0x08, 0xc0, 0x00,
-  0x47, 0x23, 0x91, 0xc6, 0x60, 0x00,
-  0x81, 0xc0, 0xe0, 0x62, 0x18, 0x00,
-  0x12, 0x89, 0x44, 0xa1, 0x88, 0x00,
-  0x58, 0x2c, 0x16, 0x05, 0x10, 0x00,
-  0x28, 0x94, 0x4a, 0x32, 0x80, 0x00,
-  0x34, 0x1a, 0x0d, 0x18, 0x20, 0x00,
-  0x84, 0xc2, 0x61, 0x21, 0xc0, 0x00,
-  0x27, 0x13, 0x89, 0xc6, 0x60, 0x00,
-  0x51, 0xa8, 0xd4, 0x62, 0x18, 0x00,
-  0x1a, 0x0d, 0x06, 0x88, 0xa8, 0x00,
-  0x68, 0x34, 0x1a, 0x11, 0x10, 0x00,
-  0x89, 0x44, 0xa2, 0x5c, 0x00, 0x00,
-  0x7f, 0x4f, 0xdb, 0x89, 0xd8, 0x00
-};
-
-const uint8_t kMaskRandom37_15[90] = {
-  0x8c, 0x46, 0x23, 0x08, 0xc0, 0x00,
-  0x47, 0x23, 0x91, 0xc6, 0x60, 0x00,
-  0x81, 0xc0, 0xe0, 0x62, 0x18, 0x00,
-  0x12, 0x89, 0x44, 0xa1, 0x88, 0x00,
-  0x58, 0x2c, 0x16, 0x05, 0x10, 0x00,
-  0x28, 0x94, 0x4a, 0x32, 0x80, 0x00,
-  0x34, 0x1a, 0x0d, 0x18, 0x20, 0x00,
-  0x2c, 0x16, 0x0b, 0x05, 0x80, 0x00,
-  0x91, 0x48, 0xa4, 0x50, 0x30, 0x00,
-  0xc0, 0xe0, 0x70, 0x34, 0x08, 0x00,
-  0x06, 0x83, 0x41, 0xa0, 0xa8, 0x00,
-  0xc8, 0x64, 0x32, 0x03, 0x10, 0x00,
-  0x45, 0x22, 0x91, 0x58, 0x40, 0x00,
-  0x30, 0x98, 0x4c, 0x24, 0x50, 0x00,
-  0xa2, 0x51, 0x28, 0x8a, 0x08, 0x00
-};
-
-const uint8_t kMaskRandom37_16[96] = {
-  0x2c, 0x16, 0x0b, 0x05, 0x80, 0x00,
-  0x91, 0x48, 0xa4, 0x50, 0x30, 0x00,
-  0xc0, 0xe0, 0x70, 0x34, 0x08, 0x00,
-  0x06, 0x83, 0x41, 0xa0, 0xa8, 0x00,
-  0xc8, 0x64, 0x32, 0x03, 0x10, 0x00,
-  0x45, 0x22, 0x91, 0x58, 0x40, 0x00,
-  0x30, 0x98, 0x4c, 0x24, 0x50, 0x00,
-  0xa2, 0x51, 0x28, 0x8a, 0x08, 0x00,
-  0x8c, 0x46, 0x23, 0x08, 0xc0, 0x00,
-  0x47, 0x23, 0x91, 0xc6, 0x60, 0x00,
-  0x81, 0xc0, 0xe0, 0x62, 0x18, 0x00,
-  0x12, 0x89, 0x44, 0xa1, 0x88, 0x00,
-  0x58, 0x2c, 0x16, 0x05, 0x10, 0x00,
-  0x28, 0x94, 0x4a, 0x32, 0x80, 0x00,
-  0x34, 0x1a, 0x0d, 0x18, 0x20, 0x00,
-  0xef, 0xf2, 0x1f, 0x9d, 0x78, 0x00
-};
-
-const uint8_t kMaskRandom37_17[102] = {
-  0x2c, 0x16, 0x0b, 0x05, 0x80, 0x00,
-  0x91, 0x48, 0xa4, 0x50, 0x30, 0x00,
-  0xc0, 0xe0, 0x70, 0x34, 0x08, 0x00,
-  0x06, 0x83, 0x41, 0xa0, 0xa8, 0x00,
-  0xc8, 0x64, 0x32, 0x03, 0x10, 0x00,
-  0x45, 0x22, 0x91, 0x58, 0x40, 0x00,
-  0x30, 0x98, 0x4c, 0x24, 0x50, 0x00,
-  0xa2, 0x51, 0x28, 0x8a, 0x08, 0x00,
-  0x4c, 0x26, 0x13, 0x09, 0xc0, 0x00,
-  0x66, 0x33, 0x19, 0x9c, 0x60, 0x00,
-  0x91, 0x48, 0xa4, 0x50, 0x38, 0x00,
-  0x42, 0xa1, 0x50, 0xa4, 0x28, 0x00,
-  0xa4, 0x52, 0x29, 0x0a, 0x50, 0x00,
-  0x13, 0x09, 0x84, 0xd6, 0x80, 0x00,
-  0x30, 0x98, 0x4c, 0x24, 0xd0, 0x00,
-  0x88, 0xc4, 0x62, 0x2b, 0x08, 0x00,
-  0x09, 0x04, 0x82, 0x43, 0x30, 0x00
-};
-
-const uint8_t kMaskRandom37_18[108] = {
-  0x4c, 0x26, 0x13, 0x09, 0xc0, 0x00,
-  0x66, 0x33, 0x19, 0x9c, 0x60, 0x00,
-  0x91, 0x48, 0xa4, 0x50, 0x38, 0x00,
-  0x42, 0xa1, 0x50, 0xa4, 0x28, 0x00,
-  0xa4, 0x52, 0x29, 0x0a, 0x50, 0x00,
-  0x13, 0x09, 0x84, 0xd6, 0x80, 0x00,
-  0x30, 0x98, 0x4c, 0x24, 0xd0, 0x00,
-  0x88, 0xc4, 0x62, 0x2b, 0x08, 0x00,
-  0x09, 0x04, 0x82, 0x43, 0x30, 0x00,
-  0x2c, 0x16, 0x0b, 0x05, 0x80, 0x00,
-  0x91, 0x48, 0xa4, 0x50, 0x30, 0x00,
-  0xc0, 0xe0, 0x70, 0x34, 0x08, 0x00,
-  0x06, 0x83, 0x41, 0xa0, 0xa8, 0x00,
-  0xc8, 0x64, 0x32, 0x03, 0x10, 0x00,
-  0x45, 0x22, 0x91, 0x58, 0x40, 0x00,
-  0x30, 0x98, 0x4c, 0x24, 0x50, 0x00,
-  0xa2, 0x51, 0x28, 0x8a, 0x08, 0x00,
-  0xd0, 0x03, 0x54, 0x65, 0xc8, 0x00
-};
-
-const uint8_t kMaskRandom37_19[114] = {
-  0x44, 0xa2, 0x51, 0x29, 0xc0, 0x00,
-  0x66, 0x26, 0x19, 0x9c, 0x20, 0x00,
-  0x90, 0x49, 0x44, 0xb0, 0x38, 0x00,
-  0x01, 0xa5, 0xb0, 0xc4, 0x28, 0x00,
-  0x0e, 0x12, 0xa3, 0x0a, 0x50, 0x00,
-  0x13, 0x0b, 0x04, 0x56, 0xc0, 0x00,
-  0x20, 0xd0, 0x48, 0x64, 0xd0, 0x00,
-  0xc2, 0x51, 0x28, 0x8b, 0x00, 0x00,
-  0x29, 0x0c, 0x86, 0x03, 0x38, 0x00,
-  0x8c, 0xc6, 0x63, 0x38, 0xc0, 0x00,
-  0x27, 0x13, 0x89, 0xc4, 0x70, 0x00,
-  0x32, 0x99, 0x4c, 0xa3, 0x48, 0x00,
-  0x61, 0xb0, 0xd8, 0x64, 0x98, 0x00,
-  0x5c, 0x2e, 0x17, 0x0e, 0x20, 0x00,
-  0xcc, 0x66, 0x33, 0x1d, 0x40, 0x00,
-  0x2b, 0x15, 0x8a, 0xc6, 0x70, 0x00,
-  0x32, 0x99, 0x4c, 0xb4, 0x98, 0x00,
-  0x25, 0x92, 0xc9, 0x63, 0xa8, 0x00,
-  0xfd, 0x9d, 0xd4, 0x22, 0x30, 0x00
-};
-
-const uint8_t kMaskRandom37_2[12] = {
-  0xce, 0x67, 0x33, 0x9d, 0xc0, 0x00,
-  0x39, 0x9c, 0xce, 0x73, 0x38, 0x00
-};
-
-const uint8_t kMaskRandom37_20[120] = {
-  0x8c, 0xc6, 0x63, 0x38, 0xc0, 0x00,
-  0x27, 0x13, 0x89, 0xc4, 0x70, 0x00,
-  0x32, 0x99, 0x4c, 0xa3, 0x48, 0x00,
-  0x61, 0xb0, 0xd8, 0x64, 0x98, 0x00,
-  0x5c, 0x2e, 0x17, 0x0e, 0x20, 0x00,
-  0xcc, 0x66, 0x33, 0x1d, 0x40, 0x00,
-  0x2b, 0x15, 0x8a, 0xc6, 0x70, 0x00,
-  0x32, 0x99, 0x4c, 0xb4, 0x98, 0x00,
-  0x25, 0x92, 0xc9, 0x63, 0xa8, 0x00,
-  0xfd, 0x9d, 0xd4, 0x22, 0x30, 0x00,
-  0x44, 0xa2, 0x51, 0x29, 0xc0, 0x00,
-  0x66, 0x26, 0x19, 0x9c, 0x20, 0x00,
-  0x90, 0x49, 0x44, 0xb0, 0x38, 0x00,
-  0x01, 0xa5, 0xb0, 0xc4, 0x28, 0x00,
-  0x0e, 0x12, 0xa3, 0x0a, 0x50, 0x00,
-  0x13, 0x0b, 0x04, 0x56, 0xc0, 0x00,
-  0x20, 0xd0, 0x48, 0x64, 0xd0, 0x00,
-  0xc2, 0x51, 0x28, 0x8b, 0x00, 0x00,
-  0x29, 0x0c, 0x86, 0x03, 0x38, 0x00,
-  0xe5, 0x44, 0xda, 0x3a, 0xc8, 0x00
-};
-
-const uint8_t kMaskRandom37_21[126] = {
-  0x8c, 0xc6, 0x63, 0x38, 0xc0, 0x00,
-  0x27, 0x13, 0x89, 0xc4, 0x70, 0x00,
-  0x32, 0x99, 0x4c, 0xa3, 0x48, 0x00,
-  0x61, 0xb0, 0xd8, 0x64, 0x98, 0x00,
-  0x5c, 0x2e, 0x17, 0x0e, 0x20, 0x00,
-  0xcc, 0x66, 0x33, 0x1d, 0x40, 0x00,
-  0x2b, 0x15, 0x8a, 0xc6, 0x70, 0x00,
-  0x32, 0x99, 0x4c, 0xb4, 0x98, 0x00,
-  0x25, 0x92, 0xc9, 0x63, 0xa8, 0x00,
-  0xfd, 0x9d, 0xd4, 0x22, 0x30, 0x00,
-  0x8c, 0xc6, 0x63, 0x38, 0xc0, 0x00,
-  0x27, 0x13, 0x89, 0xc4, 0x70, 0x00,
-  0x32, 0x99, 0x4c, 0xa3, 0x48, 0x00,
-  0x61, 0xb0, 0xd8, 0x64, 0x98, 0x00,
-  0x5c, 0x2e, 0x17, 0x0e, 0x20, 0x00,
-  0x84, 0xc2, 0x61, 0x21, 0xc0, 0x00,
-  0x27, 0x13, 0x89, 0xc6, 0x60, 0x00,
-  0x51, 0xa8, 0xd4, 0x62, 0x18, 0x00,
-  0x1a, 0x0d, 0x06, 0x88, 0xa8, 0x00,
-  0x68, 0x34, 0x1a, 0x11, 0x10, 0x00,
-  0x89, 0x44, 0xa2, 0x5c, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom37_22[132] = {
-  0x8c, 0xc6, 0x63, 0x38, 0xc0, 0x00,
-  0x27, 0x13, 0x89, 0xc4, 0x70, 0x00,
-  0x32, 0x99, 0x4c, 0xa3, 0x48, 0x00,
-  0x61, 0xb0, 0xd8, 0x64, 0x98, 0x00,
-  0x5c, 0x2e, 0x17, 0x0e, 0x20, 0x00,
-  0x84, 0xc2, 0x61, 0x21, 0xc0, 0x00,
-  0x27, 0x13, 0x89, 0xc6, 0x60, 0x00,
-  0x51, 0xa8, 0xd4, 0x62, 0x18, 0x00,
-  0x1a, 0x0d, 0x06, 0x88, 0xa8, 0x00,
-  0x68, 0x34, 0x1a, 0x11, 0x10, 0x00,
-  0x89, 0x44, 0xa2, 0x5c, 0x00, 0x00,
-  0x8c, 0xc6, 0x63, 0x38, 0xc0, 0x00,
-  0x27, 0x13, 0x89, 0xc4, 0x70, 0x00,
-  0x32, 0x99, 0x4c, 0xa3, 0x48, 0x00,
-  0x61, 0xb0, 0xd8, 0x64, 0x98, 0x00,
-  0x5c, 0x2e, 0x17, 0x0e, 0x20, 0x00,
-  0xcc, 0x66, 0x33, 0x1d, 0x40, 0x00,
-  0x2b, 0x15, 0x8a, 0xc6, 0x70, 0x00,
-  0x32, 0x99, 0x4c, 0xb4, 0x98, 0x00,
-  0x25, 0x92, 0xc9, 0x63, 0xa8, 0x00,
-  0xfd, 0x9d, 0xd4, 0x22, 0x30, 0x00,
-  0xe4, 0xd3, 0xff, 0x5a, 0x28, 0x00
-};
-
-const uint8_t kMaskRandom37_23[138] = {
-  0x8c, 0xc6, 0x63, 0x38, 0xc0, 0x00,
-  0x27, 0x13, 0x89, 0xc4, 0x70, 0x00,
-  0x32, 0x99, 0x4c, 0xa3, 0x48, 0x00,
-  0x61, 0xb0, 0xd8, 0x64, 0x98, 0x00,
-  0x5c, 0x2e, 0x17, 0x0e, 0x20, 0x00,
-  0x84, 0xc2, 0x61, 0x21, 0xc0, 0x00,
-  0x27, 0x13, 0x89, 0xc6, 0x60, 0x00,
-  0x51, 0xa8, 0xd4, 0x62, 0x18, 0x00,
-  0x1a, 0x0d, 0x06, 0x88, 0xa8, 0x00,
-  0x68, 0x34, 0x1a, 0x11, 0x10, 0x00,
-  0x89, 0x44, 0xa2, 0x5c, 0x00, 0x00,
-  0x84, 0xc2, 0x61, 0x21, 0xc0, 0x00,
-  0x27, 0x13, 0x89, 0xc6, 0x60, 0x00,
-  0x51, 0xa8, 0xd4, 0x62, 0x18, 0x00,
-  0x1a, 0x0d, 0x06, 0x88, 0xa8, 0x00,
-  0x68, 0x34, 0x1a, 0x11, 0x10, 0x00,
-  0x89, 0x44, 0xa2, 0x5c, 0x00, 0x00,
-  0x8c, 0xc6, 0x63, 0x38, 0xc0, 0x00,
-  0x27, 0x13, 0x89, 0xc4, 0x70, 0x00,
-  0x32, 0x99, 0x4c, 0xa3, 0x48, 0x00,
-  0x61, 0xb0, 0xd8, 0x64, 0x98, 0x00,
-  0x5c, 0x2e, 0x17, 0x0e, 0x20, 0x00,
-  0x5b, 0x0c, 0x64, 0x32, 0x20, 0x00
-};
-
-const uint8_t kMaskRandom37_24[144] = {
-  0x84, 0xc2, 0x61, 0x21, 0xc0, 0x00,
-  0x27, 0x13, 0x89, 0xc6, 0x60, 0x00,
-  0x51, 0xa8, 0xd4, 0x62, 0x18, 0x00,
-  0x1a, 0x0d, 0x06, 0x88, 0xa8, 0x00,
-  0x68, 0x34, 0x1a, 0x11, 0x10, 0x00,
-  0x89, 0x44, 0xa2, 0x5c, 0x00, 0x00,
-  0x8c, 0xc6, 0x63, 0x38, 0xc0, 0x00,
-  0x27, 0x13, 0x89, 0xc4, 0x70, 0x00,
-  0x32, 0x99, 0x4c, 0xa3, 0x48, 0x00,
-  0x61, 0xb0, 0xd8, 0x64, 0x98, 0x00,
-  0x5c, 0x2e, 0x17, 0x0e, 0x20, 0x00,
-  0x5b, 0x0c, 0x64, 0x32, 0x20, 0x00,
-  0x8c, 0xc6, 0x63, 0x38, 0xc0, 0x00,
-  0x27, 0x13, 0x89, 0xc4, 0x70, 0x00,
-  0x32, 0x99, 0x4c, 0xa3, 0x48, 0x00,
-  0x61, 0xb0, 0xd8, 0x64, 0x98, 0x00,
-  0x5c, 0x2e, 0x17, 0x0e, 0x20, 0x00,
-  0x84, 0xc2, 0x61, 0x21, 0xc0, 0x00,
-  0x27, 0x13, 0x89, 0xc6, 0x60, 0x00,
-  0x51, 0xa8, 0xd4, 0x62, 0x18, 0x00,
-  0x1a, 0x0d, 0x06, 0x88, 0xa8, 0x00,
-  0x68, 0x34, 0x1a, 0x11, 0x10, 0x00,
-  0x89, 0x44, 0xa2, 0x5c, 0x00, 0x00,
-  0xad, 0x58, 0xb2, 0x36, 0x68, 0x00
-};
-
-const uint8_t kMaskRandom37_25[150] = {
-  0x84, 0xc2, 0x61, 0x21, 0xc0, 0x00,
-  0x27, 0x13, 0x89, 0xc6, 0x60, 0x00,
-  0x51, 0xa8, 0xd4, 0x62, 0x18, 0x00,
-  0x1a, 0x0d, 0x06, 0x88, 0xa8, 0x00,
-  0x68, 0x34, 0x1a, 0x11, 0x10, 0x00,
-  0x89, 0x44, 0xa2, 0x5c, 0x00, 0x00,
-  0x8c, 0xc6, 0x63, 0x38, 0xc0, 0x00,
-  0x27, 0x13, 0x89, 0xc4, 0x70, 0x00,
-  0x32, 0x99, 0x4c, 0xa3, 0x48, 0x00,
-  0x61, 0xb0, 0xd8, 0x64, 0x98, 0x00,
-  0x5c, 0x2e, 0x17, 0x0e, 0x20, 0x00,
-  0x5b, 0x0c, 0x64, 0x32, 0x20, 0x00,
-  0x84, 0xc2, 0x61, 0x21, 0xc0, 0x00,
-  0x27, 0x13, 0x89, 0xc6, 0x60, 0x00,
-  0x51, 0xa8, 0xd4, 0x62, 0x18, 0x00,
-  0x1a, 0x0d, 0x06, 0x88, 0xa8, 0x00,
-  0x68, 0x34, 0x1a, 0x11, 0x10, 0x00,
-  0x89, 0x44, 0xa2, 0x5c, 0x00, 0x00,
-  0x8c, 0x46, 0x23, 0x08, 0xc0, 0x00,
-  0x47, 0x23, 0x91, 0xc6, 0x60, 0x00,
-  0x81, 0xc0, 0xe0, 0x62, 0x18, 0x00,
-  0x12, 0x89, 0x44, 0xa1, 0x88, 0x00,
-  0x58, 0x2c, 0x16, 0x05, 0x10, 0x00,
-  0x28, 0x94, 0x4a, 0x32, 0x80, 0x00,
-  0x34, 0x1a, 0x0d, 0x18, 0x20, 0x00
-};
-
-const uint8_t kMaskRandom37_26[156] = {
-  0x84, 0xc2, 0x61, 0x21, 0xc0, 0x00,
-  0x27, 0x13, 0x89, 0xc6, 0x60, 0x00,
-  0x51, 0xa8, 0xd4, 0x62, 0x18, 0x00,
-  0x1a, 0x0d, 0x06, 0x88, 0xa8, 0x00,
-  0x68, 0x34, 0x1a, 0x11, 0x10, 0x00,
-  0x89, 0x44, 0xa2, 0x5c, 0x00, 0x00,
-  0x8c, 0x46, 0x23, 0x08, 0xc0, 0x00,
-  0x47, 0x23, 0x91, 0xc6, 0x60, 0x00,
-  0x81, 0xc0, 0xe0, 0x62, 0x18, 0x00,
-  0x12, 0x89, 0x44, 0xa1, 0x88, 0x00,
-  0x58, 0x2c, 0x16, 0x05, 0x10, 0x00,
-  0x28, 0x94, 0x4a, 0x32, 0x80, 0x00,
-  0x34, 0x1a, 0x0d, 0x18, 0x20, 0x00,
-  0x84, 0xc2, 0x61, 0x21, 0xc0, 0x00,
-  0x27, 0x13, 0x89, 0xc6, 0x60, 0x00,
-  0x51, 0xa8, 0xd4, 0x62, 0x18, 0x00,
-  0x1a, 0x0d, 0x06, 0x88, 0xa8, 0x00,
-  0x68, 0x34, 0x1a, 0x11, 0x10, 0x00,
-  0x89, 0x44, 0xa2, 0x5c, 0x00, 0x00,
-  0x8c, 0xc6, 0x63, 0x38, 0xc0, 0x00,
-  0x27, 0x13, 0x89, 0xc4, 0x70, 0x00,
-  0x32, 0x99, 0x4c, 0xa3, 0x48, 0x00,
-  0x61, 0xb0, 0xd8, 0x64, 0x98, 0x00,
-  0x5c, 0x2e, 0x17, 0x0e, 0x20, 0x00,
-  0x5b, 0x0c, 0x64, 0x32, 0x20, 0x00,
-  0x7f, 0xb2, 0x5a, 0xaa, 0x20, 0x00
-};
-
-const uint8_t kMaskRandom37_27[162] = {
-  0x84, 0xc2, 0x61, 0x21, 0xc0, 0x00,
-  0x27, 0x13, 0x89, 0xc6, 0x60, 0x00,
-  0x51, 0xa8, 0xd4, 0x62, 0x18, 0x00,
-  0x1a, 0x0d, 0x06, 0x88, 0xa8, 0x00,
-  0x68, 0x34, 0x1a, 0x11, 0x10, 0x00,
-  0x89, 0x44, 0xa2, 0x5c, 0x00, 0x00,
-  0x8c, 0x46, 0x23, 0x08, 0xc0, 0x00,
-  0x47, 0x23, 0x91, 0xc6, 0x60, 0x00,
-  0x81, 0xc0, 0xe0, 0x62, 0x18, 0x00,
-  0x12, 0x89, 0x44, 0xa1, 0x88, 0x00,
-  0x58, 0x2c, 0x16, 0x05, 0x10, 0x00,
-  0x28, 0x94, 0x4a, 0x32, 0x80, 0x00,
-  0x34, 0x1a, 0x0d, 0x18, 0x20, 0x00,
-  0x8c, 0x46, 0x23, 0x08, 0xc0, 0x00,
-  0x47, 0x23, 0x91, 0xc6, 0x60, 0x00,
-  0x81, 0xc0, 0xe0, 0x62, 0x18, 0x00,
-  0x12, 0x89, 0x44, 0xa1, 0x88, 0x00,
-  0x58, 0x2c, 0x16, 0x05, 0x10, 0x00,
-  0x28, 0x94, 0x4a, 0x32, 0x80, 0x00,
-  0x34, 0x1a, 0x0d, 0x18, 0x20, 0x00,
-  0x84, 0xc2, 0x61, 0x21, 0xc0, 0x00,
-  0x27, 0x13, 0x89, 0xc6, 0x60, 0x00,
-  0x51, 0xa8, 0xd4, 0x62, 0x18, 0x00,
-  0x1a, 0x0d, 0x06, 0x88, 0xa8, 0x00,
-  0x68, 0x34, 0x1a, 0x11, 0x10, 0x00,
-  0x89, 0x44, 0xa2, 0x5c, 0x00, 0x00,
-  0x7f, 0x4f, 0xdb, 0x89, 0xd8, 0x00
-};
-
-const uint8_t kMaskRandom37_28[168] = {
-  0x8c, 0x46, 0x23, 0x08, 0xc0, 0x00,
-  0x47, 0x23, 0x91, 0xc6, 0x60, 0x00,
-  0x81, 0xc0, 0xe0, 0x62, 0x18, 0x00,
-  0x12, 0x89, 0x44, 0xa1, 0x88, 0x00,
-  0x58, 0x2c, 0x16, 0x05, 0x10, 0x00,
-  0x28, 0x94, 0x4a, 0x32, 0x80, 0x00,
-  0x34, 0x1a, 0x0d, 0x18, 0x20, 0x00,
-  0x84, 0xc2, 0x61, 0x21, 0xc0, 0x00,
-  0x27, 0x13, 0x89, 0xc6, 0x60, 0x00,
-  0x51, 0xa8, 0xd4, 0x62, 0x18, 0x00,
-  0x1a, 0x0d, 0x06, 0x88, 0xa8, 0x00,
-  0x68, 0x34, 0x1a, 0x11, 0x10, 0x00,
-  0x89, 0x44, 0xa2, 0x5c, 0x00, 0x00,
-  0x7f, 0x4f, 0xdb, 0x89, 0xd8, 0x00,
-  0x84, 0xc2, 0x61, 0x21, 0xc0, 0x00,
-  0x27, 0x13, 0x89, 0xc6, 0x60, 0x00,
-  0x51, 0xa8, 0xd4, 0x62, 0x18, 0x00,
-  0x1a, 0x0d, 0x06, 0x88, 0xa8, 0x00,
-  0x68, 0x34, 0x1a, 0x11, 0x10, 0x00,
-  0x89, 0x44, 0xa2, 0x5c, 0x00, 0x00,
-  0x8c, 0x46, 0x23, 0x08, 0xc0, 0x00,
-  0x47, 0x23, 0x91, 0xc6, 0x60, 0x00,
-  0x81, 0xc0, 0xe0, 0x62, 0x18, 0x00,
-  0x12, 0x89, 0x44, 0xa1, 0x88, 0x00,
-  0x58, 0x2c, 0x16, 0x05, 0x10, 0x00,
-  0x28, 0x94, 0x4a, 0x32, 0x80, 0x00,
-  0x34, 0x1a, 0x0d, 0x18, 0x20, 0x00,
-  0x7b, 0xc4, 0x24, 0xbf, 0x10, 0x00
-};
-
-const uint8_t kMaskRandom37_29[174] = {
-  0x8c, 0x46, 0x23, 0x08, 0xc0, 0x00,
-  0x47, 0x23, 0x91, 0xc6, 0x60, 0x00,
-  0x81, 0xc0, 0xe0, 0x62, 0x18, 0x00,
-  0x12, 0x89, 0x44, 0xa1, 0x88, 0x00,
-  0x58, 0x2c, 0x16, 0x05, 0x10, 0x00,
-  0x28, 0x94, 0x4a, 0x32, 0x80, 0x00,
-  0x34, 0x1a, 0x0d, 0x18, 0x20, 0x00,
-  0x84, 0xc2, 0x61, 0x21, 0xc0, 0x00,
-  0x27, 0x13, 0x89, 0xc6, 0x60, 0x00,
-  0x51, 0xa8, 0xd4, 0x62, 0x18, 0x00,
-  0x1a, 0x0d, 0x06, 0x88, 0xa8, 0x00,
-  0x68, 0x34, 0x1a, 0x11, 0x10, 0x00,
-  0x89, 0x44, 0xa2, 0x5c, 0x00, 0x00,
-  0x7f, 0x4f, 0xdb, 0x89, 0xd8, 0x00,
-  0x8c, 0x46, 0x23, 0x08, 0xc0, 0x00,
-  0x47, 0x23, 0x91, 0xc6, 0x60, 0x00,
-  0x81, 0xc0, 0xe0, 0x62, 0x18, 0x00,
-  0x12, 0x89, 0x44, 0xa1, 0x88, 0x00,
-  0x58, 0x2c, 0x16, 0x05, 0x10, 0x00,
-  0x28, 0x94, 0x4a, 0x32, 0x80, 0x00,
-  0x34, 0x1a, 0x0d, 0x18, 0x20, 0x00,
-  0x2c, 0x16, 0x0b, 0x05, 0x80, 0x00,
-  0x91, 0x48, 0xa4, 0x50, 0x30, 0x00,
-  0xc0, 0xe0, 0x70, 0x34, 0x08, 0x00,
-  0x06, 0x83, 0x41, 0xa0, 0xa8, 0x00,
-  0xc8, 0x64, 0x32, 0x03, 0x10, 0x00,
-  0x45, 0x22, 0x91, 0x58, 0x40, 0x00,
-  0x30, 0x98, 0x4c, 0x24, 0x50, 0x00,
-  0xa2, 0x51, 0x28, 0x8a, 0x08, 0x00
-};
-
-const uint8_t kMaskRandom37_3[18] = {
-  0xcc, 0x66, 0x33, 0x19, 0xc0, 0x00,
-  0x27, 0x15, 0x89, 0xcb, 0x30, 0x00,
-  0x92, 0xc9, 0x64, 0xb4, 0x98, 0x00
-};
-
-const uint8_t kMaskRandom37_30[180] = {
-  0x8c, 0x46, 0x23, 0x08, 0xc0, 0x00,
-  0x47, 0x23, 0x91, 0xc6, 0x60, 0x00,
-  0x81, 0xc0, 0xe0, 0x62, 0x18, 0x00,
-  0x12, 0x89, 0x44, 0xa1, 0x88, 0x00,
-  0x58, 0x2c, 0x16, 0x05, 0x10, 0x00,
-  0x28, 0x94, 0x4a, 0x32, 0x80, 0x00,
-  0x34, 0x1a, 0x0d, 0x18, 0x20, 0x00,
-  0x2c, 0x16, 0x0b, 0x05, 0x80, 0x00,
-  0x91, 0x48, 0xa4, 0x50, 0x30, 0x00,
-  0xc0, 0xe0, 0x70, 0x34, 0x08, 0x00,
-  0x06, 0x83, 0x41, 0xa0, 0xa8, 0x00,
-  0xc8, 0x64, 0x32, 0x03, 0x10, 0x00,
-  0x45, 0x22, 0x91, 0x58, 0x40, 0x00,
-  0x30, 0x98, 0x4c, 0x24, 0x50, 0x00,
-  0xa2, 0x51, 0x28, 0x8a, 0x08, 0x00,
-  0x8c, 0x46, 0x23, 0x08, 0xc0, 0x00,
-  0x47, 0x23, 0x91, 0xc6, 0x60, 0x00,
-  0x81, 0xc0, 0xe0, 0x62, 0x18, 0x00,
-  0x12, 0x89, 0x44, 0xa1, 0x88, 0x00,
-  0x58, 0x2c, 0x16, 0x05, 0x10, 0x00,
-  0x28, 0x94, 0x4a, 0x32, 0x80, 0x00,
-  0x34, 0x1a, 0x0d, 0x18, 0x20, 0x00,
-  0x84, 0xc2, 0x61, 0x21, 0xc0, 0x00,
-  0x27, 0x13, 0x89, 0xc6, 0x60, 0x00,
-  0x51, 0xa8, 0xd4, 0x62, 0x18, 0x00,
-  0x1a, 0x0d, 0x06, 0x88, 0xa8, 0x00,
-  0x68, 0x34, 0x1a, 0x11, 0x10, 0x00,
-  0x89, 0x44, 0xa2, 0x5c, 0x00, 0x00,
-  0x7f, 0x4f, 0xdb, 0x89, 0xd8, 0x00,
-  0x1d, 0x8e, 0x11, 0xb0, 0xe8, 0x00
-};
-
-const uint8_t kMaskRandom37_31[186] = {
-  0x8c, 0x46, 0x23, 0x08, 0xc0, 0x00,
-  0x47, 0x23, 0x91, 0xc6, 0x60, 0x00,
-  0x81, 0xc0, 0xe0, 0x62, 0x18, 0x00,
-  0x12, 0x89, 0x44, 0xa1, 0x88, 0x00,
-  0x58, 0x2c, 0x16, 0x05, 0x10, 0x00,
-  0x28, 0x94, 0x4a, 0x32, 0x80, 0x00,
-  0x34, 0x1a, 0x0d, 0x18, 0x20, 0x00,
-  0x2c, 0x16, 0x0b, 0x05, 0x80, 0x00,
-  0x91, 0x48, 0xa4, 0x50, 0x30, 0x00,
-  0xc0, 0xe0, 0x70, 0x34, 0x08, 0x00,
-  0x06, 0x83, 0x41, 0xa0, 0xa8, 0x00,
-  0xc8, 0x64, 0x32, 0x03, 0x10, 0x00,
-  0x45, 0x22, 0x91, 0x58, 0x40, 0x00,
-  0x30, 0x98, 0x4c, 0x24, 0x50, 0x00,
-  0xa2, 0x51, 0x28, 0x8a, 0x08, 0x00,
-  0x2c, 0x16, 0x0b, 0x05, 0x80, 0x00,
-  0x91, 0x48, 0xa4, 0x50, 0x30, 0x00,
-  0xc0, 0xe0, 0x70, 0x34, 0x08, 0x00,
-  0x06, 0x83, 0x41, 0xa0, 0xa8, 0x00,
-  0xc8, 0x64, 0x32, 0x03, 0x10, 0x00,
-  0x45, 0x22, 0x91, 0x58, 0x40, 0x00,
-  0x30, 0x98, 0x4c, 0x24, 0x50, 0x00,
-  0xa2, 0x51, 0x28, 0x8a, 0x08, 0x00,
-  0x8c, 0x46, 0x23, 0x08, 0xc0, 0x00,
-  0x47, 0x23, 0x91, 0xc6, 0x60, 0x00,
-  0x81, 0xc0, 0xe0, 0x62, 0x18, 0x00,
-  0x12, 0x89, 0x44, 0xa1, 0x88, 0x00,
-  0x58, 0x2c, 0x16, 0x05, 0x10, 0x00,
-  0x28, 0x94, 0x4a, 0x32, 0x80, 0x00,
-  0x34, 0x1a, 0x0d, 0x18, 0x20, 0x00,
-  0xef, 0xf2, 0x1f, 0x9d, 0x78, 0x00
-};
-
-const uint8_t kMaskRandom37_32[192] = {
-  0x2c, 0x16, 0x0b, 0x05, 0x80, 0x00,
-  0x91, 0x48, 0xa4, 0x50, 0x30, 0x00,
-  0xc0, 0xe0, 0x70, 0x34, 0x08, 0x00,
-  0x06, 0x83, 0x41, 0xa0, 0xa8, 0x00,
-  0xc8, 0x64, 0x32, 0x03, 0x10, 0x00,
-  0x45, 0x22, 0x91, 0x58, 0x40, 0x00,
-  0x30, 0x98, 0x4c, 0x24, 0x50, 0x00,
-  0xa2, 0x51, 0x28, 0x8a, 0x08, 0x00,
-  0x8c, 0x46, 0x23, 0x08, 0xc0, 0x00,
-  0x47, 0x23, 0x91, 0xc6, 0x60, 0x00,
-  0x81, 0xc0, 0xe0, 0x62, 0x18, 0x00,
-  0x12, 0x89, 0x44, 0xa1, 0x88, 0x00,
-  0x58, 0x2c, 0x16, 0x05, 0x10, 0x00,
-  0x28, 0x94, 0x4a, 0x32, 0x80, 0x00,
-  0x34, 0x1a, 0x0d, 0x18, 0x20, 0x00,
-  0xef, 0xf2, 0x1f, 0x9d, 0x78, 0x00,
-  0x8c, 0x46, 0x23, 0x08, 0xc0, 0x00,
-  0x47, 0x23, 0x91, 0xc6, 0x60, 0x00,
-  0x81, 0xc0, 0xe0, 0x62, 0x18, 0x00,
-  0x12, 0x89, 0x44, 0xa1, 0x88, 0x00,
-  0x58, 0x2c, 0x16, 0x05, 0x10, 0x00,
-  0x28, 0x94, 0x4a, 0x32, 0x80, 0x00,
-  0x34, 0x1a, 0x0d, 0x18, 0x20, 0x00,
-  0x2c, 0x16, 0x0b, 0x05, 0x80, 0x00,
-  0x91, 0x48, 0xa4, 0x50, 0x30, 0x00,
-  0xc0, 0xe0, 0x70, 0x34, 0x08, 0x00,
-  0x06, 0x83, 0x41, 0xa0, 0xa8, 0x00,
-  0xc8, 0x64, 0x32, 0x03, 0x10, 0x00,
-  0x45, 0x22, 0x91, 0x58, 0x40, 0x00,
-  0x30, 0x98, 0x4c, 0x24, 0x50, 0x00,
-  0xa2, 0x51, 0x28, 0x8a, 0x08, 0x00,
-  0xf7, 0x95, 0x57, 0x8c, 0x40, 0x00
-};
-
-const uint8_t kMaskRandom37_33[198] = {
-  0x2c, 0x16, 0x0b, 0x05, 0x80, 0x00,
-  0x91, 0x48, 0xa4, 0x50, 0x30, 0x00,
-  0xc0, 0xe0, 0x70, 0x34, 0x08, 0x00,
-  0x06, 0x83, 0x41, 0xa0, 0xa8, 0x00,
-  0xc8, 0x64, 0x32, 0x03, 0x10, 0x00,
-  0x45, 0x22, 0x91, 0x58, 0x40, 0x00,
-  0x30, 0x98, 0x4c, 0x24, 0x50, 0x00,
-  0xa2, 0x51, 0x28, 0x8a, 0x08, 0x00,
-  0x8c, 0x46, 0x23, 0x08, 0xc0, 0x00,
-  0x47, 0x23, 0x91, 0xc6, 0x60, 0x00,
-  0x81, 0xc0, 0xe0, 0x62, 0x18, 0x00,
-  0x12, 0x89, 0x44, 0xa1, 0x88, 0x00,
-  0x58, 0x2c, 0x16, 0x05, 0x10, 0x00,
-  0x28, 0x94, 0x4a, 0x32, 0x80, 0x00,
-  0x34, 0x1a, 0x0d, 0x18, 0x20, 0x00,
-  0xef, 0xf2, 0x1f, 0x9d, 0x78, 0x00,
-  0x2c, 0x16, 0x0b, 0x05, 0x80, 0x00,
-  0x91, 0x48, 0xa4, 0x50, 0x30, 0x00,
-  0xc0, 0xe0, 0x70, 0x34, 0x08, 0x00,
-  0x06, 0x83, 0x41, 0xa0, 0xa8, 0x00,
-  0xc8, 0x64, 0x32, 0x03, 0x10, 0x00,
-  0x45, 0x22, 0x91, 0x58, 0x40, 0x00,
-  0x30, 0x98, 0x4c, 0x24, 0x50, 0x00,
-  0xa2, 0x51, 0x28, 0x8a, 0x08, 0x00,
-  0x4c, 0x26, 0x13, 0x09, 0xc0, 0x00,
-  0x66, 0x33, 0x19, 0x9c, 0x60, 0x00,
-  0x91, 0x48, 0xa4, 0x50, 0x38, 0x00,
-  0x42, 0xa1, 0x50, 0xa4, 0x28, 0x00,
-  0xa4, 0x52, 0x29, 0x0a, 0x50, 0x00,
-  0x13, 0x09, 0x84, 0xd6, 0x80, 0x00,
-  0x30, 0x98, 0x4c, 0x24, 0xd0, 0x00,
-  0x88, 0xc4, 0x62, 0x2b, 0x08, 0x00,
-  0x09, 0x04, 0x82, 0x43, 0x30, 0x00
-};
-
-const uint8_t kMaskRandom37_34[204] = {
-  0x2c, 0x16, 0x0b, 0x05, 0x80, 0x00,
-  0x91, 0x48, 0xa4, 0x50, 0x30, 0x00,
-  0xc0, 0xe0, 0x70, 0x34, 0x08, 0x00,
-  0x06, 0x83, 0x41, 0xa0, 0xa8, 0x00,
-  0xc8, 0x64, 0x32, 0x03, 0x10, 0x00,
-  0x45, 0x22, 0x91, 0x58, 0x40, 0x00,
-  0x30, 0x98, 0x4c, 0x24, 0x50, 0x00,
-  0xa2, 0x51, 0x28, 0x8a, 0x08, 0x00,
-  0x4c, 0x26, 0x13, 0x09, 0xc0, 0x00,
-  0x66, 0x33, 0x19, 0x9c, 0x60, 0x00,
-  0x91, 0x48, 0xa4, 0x50, 0x38, 0x00,
-  0x42, 0xa1, 0x50, 0xa4, 0x28, 0x00,
-  0xa4, 0x52, 0x29, 0x0a, 0x50, 0x00,
-  0x13, 0x09, 0x84, 0xd6, 0x80, 0x00,
-  0x30, 0x98, 0x4c, 0x24, 0xd0, 0x00,
-  0x88, 0xc4, 0x62, 0x2b, 0x08, 0x00,
-  0x09, 0x04, 0x82, 0x43, 0x30, 0x00,
-  0x2c, 0x16, 0x0b, 0x05, 0x80, 0x00,
-  0x91, 0x48, 0xa4, 0x50, 0x30, 0x00,
-  0xc0, 0xe0, 0x70, 0x34, 0x08, 0x00,
-  0x06, 0x83, 0x41, 0xa0, 0xa8, 0x00,
-  0xc8, 0x64, 0x32, 0x03, 0x10, 0x00,
-  0x45, 0x22, 0x91, 0x58, 0x40, 0x00,
-  0x30, 0x98, 0x4c, 0x24, 0x50, 0x00,
-  0xa2, 0x51, 0x28, 0x8a, 0x08, 0x00,
-  0x8c, 0x46, 0x23, 0x08, 0xc0, 0x00,
-  0x47, 0x23, 0x91, 0xc6, 0x60, 0x00,
-  0x81, 0xc0, 0xe0, 0x62, 0x18, 0x00,
-  0x12, 0x89, 0x44, 0xa1, 0x88, 0x00,
-  0x58, 0x2c, 0x16, 0x05, 0x10, 0x00,
-  0x28, 0x94, 0x4a, 0x32, 0x80, 0x00,
-  0x34, 0x1a, 0x0d, 0x18, 0x20, 0x00,
-  0xef, 0xf2, 0x1f, 0x9d, 0x78, 0x00,
-  0x31, 0x9c, 0xfb, 0x37, 0xc0, 0x00
-};
-
-const uint8_t kMaskRandom37_35[210] = {
-  0x2c, 0x16, 0x0b, 0x05, 0x80, 0x00,
-  0x91, 0x48, 0xa4, 0x50, 0x30, 0x00,
-  0xc0, 0xe0, 0x70, 0x34, 0x08, 0x00,
-  0x06, 0x83, 0x41, 0xa0, 0xa8, 0x00,
-  0xc8, 0x64, 0x32, 0x03, 0x10, 0x00,
-  0x45, 0x22, 0x91, 0x58, 0x40, 0x00,
-  0x30, 0x98, 0x4c, 0x24, 0x50, 0x00,
-  0xa2, 0x51, 0x28, 0x8a, 0x08, 0x00,
-  0x4c, 0x26, 0x13, 0x09, 0xc0, 0x00,
-  0x66, 0x33, 0x19, 0x9c, 0x60, 0x00,
-  0x91, 0x48, 0xa4, 0x50, 0x38, 0x00,
-  0x42, 0xa1, 0x50, 0xa4, 0x28, 0x00,
-  0xa4, 0x52, 0x29, 0x0a, 0x50, 0x00,
-  0x13, 0x09, 0x84, 0xd6, 0x80, 0x00,
-  0x30, 0x98, 0x4c, 0x24, 0xd0, 0x00,
-  0x88, 0xc4, 0x62, 0x2b, 0x08, 0x00,
-  0x09, 0x04, 0x82, 0x43, 0x30, 0x00,
-  0x4c, 0x26, 0x13, 0x09, 0xc0, 0x00,
-  0x66, 0x33, 0x19, 0x9c, 0x60, 0x00,
-  0x91, 0x48, 0xa4, 0x50, 0x38, 0x00,
-  0x42, 0xa1, 0x50, 0xa4, 0x28, 0x00,
-  0xa4, 0x52, 0x29, 0x0a, 0x50, 0x00,
-  0x13, 0x09, 0x84, 0xd6, 0x80, 0x00,
-  0x30, 0x98, 0x4c, 0x24, 0xd0, 0x00,
-  0x88, 0xc4, 0x62, 0x2b, 0x08, 0x00,
-  0x09, 0x04, 0x82, 0x43, 0x30, 0x00,
-  0x2c, 0x16, 0x0b, 0x05, 0x80, 0x00,
-  0x91, 0x48, 0xa4, 0x50, 0x30, 0x00,
-  0xc0, 0xe0, 0x70, 0x34, 0x08, 0x00,
-  0x06, 0x83, 0x41, 0xa0, 0xa8, 0x00,
-  0xc8, 0x64, 0x32, 0x03, 0x10, 0x00,
-  0x45, 0x22, 0x91, 0x58, 0x40, 0x00,
-  0x30, 0x98, 0x4c, 0x24, 0x50, 0x00,
-  0xa2, 0x51, 0x28, 0x8a, 0x08, 0x00,
-  0xd0, 0x03, 0x54, 0x65, 0xc8, 0x00
-};
-
-const uint8_t kMaskRandom37_36[216] = {
-  0x4c, 0x26, 0x13, 0x09, 0xc0, 0x00,
-  0x66, 0x33, 0x19, 0x9c, 0x60, 0x00,
-  0x91, 0x48, 0xa4, 0x50, 0x38, 0x00,
-  0x42, 0xa1, 0x50, 0xa4, 0x28, 0x00,
-  0xa4, 0x52, 0x29, 0x0a, 0x50, 0x00,
-  0x13, 0x09, 0x84, 0xd6, 0x80, 0x00,
-  0x30, 0x98, 0x4c, 0x24, 0xd0, 0x00,
-  0x88, 0xc4, 0x62, 0x2b, 0x08, 0x00,
-  0x09, 0x04, 0x82, 0x43, 0x30, 0x00,
-  0x2c, 0x16, 0x0b, 0x05, 0x80, 0x00,
-  0x91, 0x48, 0xa4, 0x50, 0x30, 0x00,
-  0xc0, 0xe0, 0x70, 0x34, 0x08, 0x00,
-  0x06, 0x83, 0x41, 0xa0, 0xa8, 0x00,
-  0xc8, 0x64, 0x32, 0x03, 0x10, 0x00,
-  0x45, 0x22, 0x91, 0x58, 0x40, 0x00,
-  0x30, 0x98, 0x4c, 0x24, 0x50, 0x00,
-  0xa2, 0x51, 0x28, 0x8a, 0x08, 0x00,
-  0xd0, 0x03, 0x54, 0x65, 0xc8, 0x00,
-  0x2c, 0x16, 0x0b, 0x05, 0x80, 0x00,
-  0x91, 0x48, 0xa4, 0x50, 0x30, 0x00,
-  0xc0, 0xe0, 0x70, 0x34, 0x08, 0x00,
-  0x06, 0x83, 0x41, 0xa0, 0xa8, 0x00,
-  0xc8, 0x64, 0x32, 0x03, 0x10, 0x00,
-  0x45, 0x22, 0x91, 0x58, 0x40, 0x00,
-  0x30, 0x98, 0x4c, 0x24, 0x50, 0x00,
-  0xa2, 0x51, 0x28, 0x8a, 0x08, 0x00,
-  0x4c, 0x26, 0x13, 0x09, 0xc0, 0x00,
-  0x66, 0x33, 0x19, 0x9c, 0x60, 0x00,
-  0x91, 0x48, 0xa4, 0x50, 0x38, 0x00,
-  0x42, 0xa1, 0x50, 0xa4, 0x28, 0x00,
-  0xa4, 0x52, 0x29, 0x0a, 0x50, 0x00,
-  0x13, 0x09, 0x84, 0xd6, 0x80, 0x00,
-  0x30, 0x98, 0x4c, 0x24, 0xd0, 0x00,
-  0x88, 0xc4, 0x62, 0x2b, 0x08, 0x00,
-  0x09, 0x04, 0x82, 0x43, 0x30, 0x00,
-  0xc3, 0xc7, 0xce, 0xd8, 0x50, 0x00
-};
-
-const uint8_t kMaskRandom37_37[222] = {
-  0x4c, 0x26, 0x13, 0x09, 0xc0, 0x00,
-  0x66, 0x33, 0x19, 0x9c, 0x60, 0x00,
-  0x91, 0x48, 0xa4, 0x50, 0x38, 0x00,
-  0x42, 0xa1, 0x50, 0xa4, 0x28, 0x00,
-  0xa4, 0x52, 0x29, 0x0a, 0x50, 0x00,
-  0x13, 0x09, 0x84, 0xd6, 0x80, 0x00,
-  0x30, 0x98, 0x4c, 0x24, 0xd0, 0x00,
-  0x88, 0xc4, 0x62, 0x2b, 0x08, 0x00,
-  0x09, 0x04, 0x82, 0x43, 0x30, 0x00,
-  0x2c, 0x16, 0x0b, 0x05, 0x80, 0x00,
-  0x91, 0x48, 0xa4, 0x50, 0x30, 0x00,
-  0xc0, 0xe0, 0x70, 0x34, 0x08, 0x00,
-  0x06, 0x83, 0x41, 0xa0, 0xa8, 0x00,
-  0xc8, 0x64, 0x32, 0x03, 0x10, 0x00,
-  0x45, 0x22, 0x91, 0x58, 0x40, 0x00,
-  0x30, 0x98, 0x4c, 0x24, 0x50, 0x00,
-  0xa2, 0x51, 0x28, 0x8a, 0x08, 0x00,
-  0xd0, 0x03, 0x54, 0x65, 0xc8, 0x00,
-  0x4c, 0x26, 0x13, 0x09, 0xc0, 0x00,
-  0x66, 0x33, 0x19, 0x9c, 0x60, 0x00,
-  0x91, 0x48, 0xa4, 0x50, 0x38, 0x00,
-  0x42, 0xa1, 0x50, 0xa4, 0x28, 0x00,
-  0xa4, 0x52, 0x29, 0x0a, 0x50, 0x00,
-  0x13, 0x09, 0x84, 0xd6, 0x80, 0x00,
-  0x30, 0x98, 0x4c, 0x24, 0xd0, 0x00,
-  0x88, 0xc4, 0x62, 0x2b, 0x08, 0x00,
-  0x09, 0x04, 0x82, 0x43, 0x30, 0x00,
-  0x2c, 0x16, 0x13, 0x09, 0x80, 0x00,
-  0x91, 0x48, 0x99, 0x8a, 0x20, 0x00,
-  0xc0, 0xe0, 0x64, 0x54, 0x08, 0x00,
-  0x06, 0x83, 0x50, 0xa0, 0x98, 0x00,
-  0xc8, 0x64, 0x29, 0x00, 0x70, 0x00,
-  0x45, 0x22, 0x84, 0xd0, 0xc0, 0x00,
-  0x30, 0x98, 0x4c, 0x25, 0x20, 0x00,
-  0xa2, 0x51, 0x22, 0x28, 0x48, 0x00,
-  0xd0, 0x03, 0x42, 0x53, 0x00, 0x00,
-  0xee, 0xf5, 0xb3, 0x66, 0x10, 0x00
-};
-
-const uint8_t kMaskRandom37_4[24] = {
-  0xec, 0x76, 0x3b, 0x1c, 0xc0, 0x00,
-  0x67, 0x33, 0x99, 0xc6, 0x70, 0x00,
-  0xb1, 0xd8, 0xec, 0x73, 0x18, 0x00,
-  0x5a, 0xad, 0x56, 0xa5, 0xa8, 0x00
-};
-
-const uint8_t kMaskRandom37_5[30] = {
-  0x4c, 0xa6, 0x53, 0x39, 0xc0, 0x00,
-  0x66, 0x33, 0x19, 0x8c, 0x70, 0x00,
-  0x19, 0xd0, 0xe8, 0x73, 0x18, 0x00,
-  0x9c, 0x89, 0x64, 0xa9, 0xa8, 0x00,
-  0xe3, 0x4c, 0x2e, 0x26, 0x60, 0x00
-};
-
-const uint8_t kMaskRandom37_6[36] = {
-  0xcc, 0x26, 0x13, 0x0d, 0x80, 0x00,
-  0x45, 0x62, 0x91, 0x5a, 0x20, 0x00,
-  0xb0, 0x98, 0x4c, 0x34, 0x18, 0x00,
-  0x8a, 0x85, 0x62, 0xa0, 0xa8, 0x00,
-  0x29, 0x53, 0x09, 0x82, 0xd0, 0x00,
-  0xa6, 0x0a, 0xa5, 0x51, 0x40, 0x00
-};
-
-const uint8_t kMaskRandom37_7[42] = {
-  0x44, 0xa2, 0x71, 0x28, 0xc0, 0x00,
-  0x23, 0x11, 0x88, 0xc6, 0x60, 0x00,
-  0x91, 0x48, 0xa4, 0x47, 0x08, 0x00,
-  0x0a, 0x85, 0x52, 0xa0, 0xa8, 0x00,
-  0x34, 0x1a, 0x0d, 0x12, 0x50, 0x00,
-  0x0b, 0x06, 0xa2, 0xd2, 0x80, 0x00,
-  0xe0, 0x64, 0x32, 0x09, 0x30, 0x00
-};
-
-const uint8_t kMaskRandom37_8[48] = {
-  0x16, 0x0b, 0x05, 0x84, 0xe0, 0x00,
-  0xc2, 0x61, 0x30, 0x91, 0x30, 0x00,
-  0x60, 0xb0, 0x58, 0x3a, 0x08, 0x00,
-  0x85, 0x42, 0xa1, 0x44, 0x98, 0x00,
-  0x4c, 0x26, 0x33, 0x08, 0x50, 0x00,
-  0x29, 0x14, 0x8a, 0x58, 0xc0, 0x00,
-  0x11, 0x88, 0xc4, 0x66, 0x30, 0x00,
-  0xb0, 0x58, 0x2c, 0x03, 0x18, 0x00
-};
-
-const uint8_t kMaskRandom37_9[54] = {
-  0x44, 0xa2, 0x51, 0x29, 0xc0, 0x00,
-  0x66, 0x26, 0x19, 0x9c, 0x20, 0x00,
-  0x90, 0x49, 0x44, 0xb0, 0x38, 0x00,
-  0x01, 0xa5, 0xb0, 0xc4, 0x28, 0x00,
-  0x0e, 0x12, 0xa3, 0x0a, 0x50, 0x00,
-  0x13, 0x0b, 0x04, 0x56, 0xc0, 0x00,
-  0x20, 0xd0, 0x48, 0x64, 0xd0, 0x00,
-  0xc2, 0x51, 0x28, 0x8b, 0x00, 0x00,
-  0x29, 0x0c, 0x86, 0x03, 0x38, 0x00
-};
-
-const uint8_t kMaskRandom38_1[6] = {
-  0xff, 0xff, 0xff, 0xff, 0xfc, 0x00
-};
-
-const uint8_t kMaskRandom38_10[60] = {
-  0x8c, 0xe3, 0x11, 0x9c, 0x60, 0x00,
-  0x27, 0x11, 0xc4, 0xe2, 0x38, 0x00,
-  0x32, 0x8d, 0x26, 0x51, 0xa4, 0x00,
-  0x61, 0x92, 0x6c, 0x32, 0x4c, 0x00,
-  0x5c, 0x38, 0x8b, 0x87, 0x10, 0x00,
-  0xcc, 0x75, 0x19, 0x8e, 0xa0, 0x00,
-  0x2b, 0x19, 0xc5, 0x63, 0x38, 0x00,
-  0x32, 0xd2, 0x66, 0x5a, 0x4c, 0x00,
-  0x25, 0x8e, 0xa4, 0xb1, 0xd4, 0x00,
-  0x50, 0x88, 0xca, 0x11, 0x18, 0x00
-};
-
-const uint8_t kMaskRandom38_11[66] = {
-  0x8c, 0xe3, 0x11, 0x9c, 0x60, 0x00,
-  0x27, 0x11, 0xc4, 0xe2, 0x38, 0x00,
-  0x32, 0x8d, 0x26, 0x51, 0xa4, 0x00,
-  0x61, 0x92, 0x6c, 0x32, 0x4c, 0x00,
-  0x5c, 0x38, 0x8b, 0x87, 0x10, 0x00,
-  0x84, 0x87, 0x10, 0x90, 0xe0, 0x00,
-  0x27, 0x19, 0x84, 0xe3, 0x30, 0x00,
-  0x51, 0x88, 0x6a, 0x31, 0x0c, 0x00,
-  0x1a, 0x22, 0xa3, 0x44, 0x54, 0x00,
-  0x68, 0x44, 0x4d, 0x08, 0x88, 0x00,
-  0x89, 0x70, 0x11, 0x2e, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom38_12[72] = {
-  0x84, 0x87, 0x10, 0x90, 0xe0, 0x00,
-  0x27, 0x19, 0x84, 0xe3, 0x30, 0x00,
-  0x51, 0x88, 0x6a, 0x31, 0x0c, 0x00,
-  0x1a, 0x22, 0xa3, 0x44, 0x54, 0x00,
-  0x68, 0x44, 0x4d, 0x08, 0x88, 0x00,
-  0x89, 0x70, 0x11, 0x2e, 0x00, 0x00,
-  0x8c, 0xe3, 0x11, 0x9c, 0x60, 0x00,
-  0x27, 0x11, 0xc4, 0xe2, 0x38, 0x00,
-  0x32, 0x8d, 0x26, 0x51, 0xa4, 0x00,
-  0x61, 0x92, 0x6c, 0x32, 0x4c, 0x00,
-  0x5c, 0x38, 0x8b, 0x87, 0x10, 0x00,
-  0x90, 0xc8, 0x92, 0x19, 0x10, 0x00
-};
-
-const uint8_t kMaskRandom38_13[78] = {
-  0x84, 0x87, 0x10, 0x90, 0xe0, 0x00,
-  0x27, 0x19, 0x84, 0xe3, 0x30, 0x00,
-  0x51, 0x88, 0x6a, 0x31, 0x0c, 0x00,
-  0x1a, 0x22, 0xa3, 0x44, 0x54, 0x00,
-  0x68, 0x44, 0x4d, 0x08, 0x88, 0x00,
-  0x89, 0x70, 0x11, 0x2e, 0x00, 0x00,
-  0x8c, 0x23, 0x11, 0x84, 0x60, 0x00,
-  0x47, 0x19, 0x88, 0xe3, 0x30, 0x00,
-  0x81, 0x88, 0x70, 0x31, 0x0c, 0x00,
-  0x12, 0x86, 0x22, 0x50, 0xc4, 0x00,
-  0x58, 0x14, 0x4b, 0x02, 0x88, 0x00,
-  0x28, 0xca, 0x05, 0x19, 0x40, 0x00,
-  0x34, 0x60, 0x86, 0x8c, 0x10, 0x00
-};
-
-const uint8_t kMaskRandom38_14[84] = {
-  0x8c, 0x23, 0x11, 0x84, 0x60, 0x00,
-  0x47, 0x19, 0x88, 0xe3, 0x30, 0x00,
-  0x81, 0x88, 0x70, 0x31, 0x0c, 0x00,
-  0x12, 0x86, 0x22, 0x50, 0xc4, 0x00,
-  0x58, 0x14, 0x4b, 0x02, 0x88, 0x00,
-  0x28, 0xca, 0x05, 0x19, 0x40, 0x00,
-  0x34, 0x60, 0x86, 0x8c, 0x10, 0x00,
-  0x84, 0x87, 0x10, 0x90, 0xe0, 0x00,
-  0x27, 0x19, 0x84, 0xe3, 0x30, 0x00,
-  0x51, 0x88, 0x6a, 0x31, 0x0c, 0x00,
-  0x1a, 0x22, 0xa3, 0x44, 0x54, 0x00,
-  0x68, 0x44, 0x4d, 0x08, 0x88, 0x00,
-  0x89, 0x70, 0x11, 0x2e, 0x00, 0x00,
-  0x6e, 0x27, 0x6d, 0xc4, 0xec, 0x00
-};
-
-const uint8_t kMaskRandom38_15[90] = {
-  0x8c, 0x23, 0x11, 0x84, 0x60, 0x00,
-  0x47, 0x19, 0x88, 0xe3, 0x30, 0x00,
-  0x81, 0x88, 0x70, 0x31, 0x0c, 0x00,
-  0x12, 0x86, 0x22, 0x50, 0xc4, 0x00,
-  0x58, 0x14, 0x4b, 0x02, 0x88, 0x00,
-  0x28, 0xca, 0x05, 0x19, 0x40, 0x00,
-  0x34, 0x60, 0x86, 0x8c, 0x10, 0x00,
-  0x2c, 0x16, 0x05, 0x82, 0xc0, 0x00,
-  0x91, 0x40, 0xd2, 0x28, 0x18, 0x00,
-  0xc0, 0xd0, 0x38, 0x1a, 0x04, 0x00,
-  0x06, 0x82, 0xa0, 0xd0, 0x54, 0x00,
-  0xc8, 0x0c, 0x59, 0x01, 0x88, 0x00,
-  0x45, 0x61, 0x08, 0xac, 0x20, 0x00,
-  0x30, 0x91, 0x46, 0x12, 0x28, 0x00,
-  0xa2, 0x28, 0x34, 0x45, 0x04, 0x00
-};
-
-const uint8_t kMaskRandom38_16[96] = {
-  0x2c, 0x16, 0x05, 0x82, 0xc0, 0x00,
-  0x91, 0x40, 0xd2, 0x28, 0x18, 0x00,
-  0xc0, 0xd0, 0x38, 0x1a, 0x04, 0x00,
-  0x06, 0x82, 0xa0, 0xd0, 0x54, 0x00,
-  0xc8, 0x0c, 0x59, 0x01, 0x88, 0x00,
-  0x45, 0x61, 0x08, 0xac, 0x20, 0x00,
-  0x30, 0x91, 0x46, 0x12, 0x28, 0x00,
-  0xa2, 0x28, 0x34, 0x45, 0x04, 0x00,
-  0x8c, 0x23, 0x11, 0x84, 0x60, 0x00,
-  0x47, 0x19, 0x88, 0xe3, 0x30, 0x00,
-  0x81, 0x88, 0x70, 0x31, 0x0c, 0x00,
-  0x12, 0x86, 0x22, 0x50, 0xc4, 0x00,
-  0x58, 0x14, 0x4b, 0x02, 0x88, 0x00,
-  0x28, 0xca, 0x05, 0x19, 0x40, 0x00,
-  0x34, 0x60, 0x86, 0x8c, 0x10, 0x00,
-  0x7e, 0x75, 0xef, 0xce, 0xbc, 0x00
-};
-
-const uint8_t kMaskRandom38_17[102] = {
-  0x2c, 0x16, 0x05, 0x82, 0xc0, 0x00,
-  0x91, 0x40, 0xd2, 0x28, 0x18, 0x00,
-  0xc0, 0xd0, 0x38, 0x1a, 0x04, 0x00,
-  0x06, 0x82, 0xa0, 0xd0, 0x54, 0x00,
-  0xc8, 0x0c, 0x59, 0x01, 0x88, 0x00,
-  0x45, 0x61, 0x08, 0xac, 0x20, 0x00,
-  0x30, 0x91, 0x46, 0x12, 0x28, 0x00,
-  0xa2, 0x28, 0x34, 0x45, 0x04, 0x00,
-  0x4c, 0x27, 0x09, 0x84, 0xe0, 0x00,
-  0x66, 0x71, 0x8c, 0xce, 0x30, 0x00,
-  0x91, 0x40, 0xf2, 0x28, 0x1c, 0x00,
-  0x42, 0x90, 0xa8, 0x52, 0x14, 0x00,
-  0xa4, 0x29, 0x54, 0x85, 0x28, 0x00,
-  0x13, 0x5a, 0x02, 0x6b, 0x40, 0x00,
-  0x30, 0x93, 0x46, 0x12, 0x68, 0x00,
-  0x88, 0xac, 0x31, 0x15, 0x84, 0x00,
-  0x09, 0x0c, 0xc1, 0x21, 0x98, 0x00
-};
-
-const uint8_t kMaskRandom38_18[108] = {
-  0x4c, 0x27, 0x09, 0x84, 0xe0, 0x00,
-  0x66, 0x71, 0x8c, 0xce, 0x30, 0x00,
-  0x91, 0x40, 0xf2, 0x28, 0x1c, 0x00,
-  0x42, 0x90, 0xa8, 0x52, 0x14, 0x00,
-  0xa4, 0x29, 0x54, 0x85, 0x28, 0x00,
-  0x13, 0x5a, 0x02, 0x6b, 0x40, 0x00,
-  0x30, 0x93, 0x46, 0x12, 0x68, 0x00,
-  0x88, 0xac, 0x31, 0x15, 0x84, 0x00,
-  0x09, 0x0c, 0xc1, 0x21, 0x98, 0x00,
-  0x2c, 0x16, 0x05, 0x82, 0xc0, 0x00,
-  0x91, 0x40, 0xd2, 0x28, 0x18, 0x00,
-  0xc0, 0xd0, 0x38, 0x1a, 0x04, 0x00,
-  0x06, 0x82, 0xa0, 0xd0, 0x54, 0x00,
-  0xc8, 0x0c, 0x59, 0x01, 0x88, 0x00,
-  0x45, 0x61, 0x08, 0xac, 0x20, 0x00,
-  0x30, 0x91, 0x46, 0x12, 0x28, 0x00,
-  0xa2, 0x28, 0x34, 0x45, 0x04, 0x00,
-  0x51, 0x97, 0x2a, 0x32, 0xe4, 0x00
-};
-
-const uint8_t kMaskRandom38_19[114] = {
-  0x4c, 0x27, 0x09, 0x84, 0xe0, 0x00,
-  0x66, 0x71, 0x8c, 0xce, 0x30, 0x00,
-  0x91, 0x40, 0xf2, 0x28, 0x1c, 0x00,
-  0x42, 0x90, 0xa8, 0x52, 0x14, 0x00,
-  0xa4, 0x29, 0x54, 0x85, 0x28, 0x00,
-  0x13, 0x5a, 0x02, 0x6b, 0x40, 0x00,
-  0x30, 0x93, 0x46, 0x12, 0x68, 0x00,
-  0x88, 0xac, 0x31, 0x15, 0x84, 0x00,
-  0x09, 0x0c, 0xc1, 0x21, 0x98, 0x00,
-  0x4c, 0x26, 0x09, 0x84, 0xc0, 0x00,
-  0x66, 0x28, 0x8c, 0xc5, 0x10, 0x00,
-  0x91, 0x50, 0x32, 0x2a, 0x04, 0x00,
-  0x42, 0x82, 0x68, 0x50, 0x4c, 0x00,
-  0xa4, 0x01, 0xd4, 0x80, 0x38, 0x00,
-  0x13, 0x43, 0x02, 0x68, 0x60, 0x00,
-  0x30, 0x94, 0x86, 0x12, 0x90, 0x00,
-  0x88, 0xa1, 0x31, 0x14, 0x24, 0x00,
-  0x09, 0x4c, 0x01, 0x29, 0x80, 0x00,
-  0xcd, 0x98, 0x59, 0xb3, 0x08, 0x00
-};
-
-const uint8_t kMaskRandom38_2[12] = {
-  0xce, 0x77, 0x19, 0xce, 0xe0, 0x00,
-  0x39, 0xcc, 0xe7, 0x39, 0x9c, 0x00
-};
-
-const uint8_t kMaskRandom38_20[120] = {
-  0x8c, 0xe3, 0x11, 0x9c, 0x60, 0x00,
-  0x27, 0x11, 0xc4, 0xe2, 0x38, 0x00,
-  0x32, 0x8d, 0x26, 0x51, 0xa4, 0x00,
-  0x61, 0x92, 0x6c, 0x32, 0x4c, 0x00,
-  0x5c, 0x38, 0x8b, 0x87, 0x10, 0x00,
-  0xcc, 0x75, 0x19, 0x8e, 0xa0, 0x00,
-  0x2b, 0x19, 0xc5, 0x63, 0x38, 0x00,
-  0x32, 0xd2, 0x66, 0x5a, 0x4c, 0x00,
-  0x25, 0x8e, 0xa4, 0xb1, 0xd4, 0x00,
-  0x50, 0x88, 0xca, 0x11, 0x18, 0x00,
-  0x44, 0xa7, 0x08, 0x94, 0xe0, 0x00,
-  0x66, 0x70, 0x8c, 0xce, 0x10, 0x00,
-  0x12, 0xc0, 0xe2, 0x58, 0x1c, 0x00,
-  0xc3, 0x10, 0xb8, 0x62, 0x14, 0x00,
-  0x8c, 0x29, 0x51, 0x85, 0x28, 0x00,
-  0x11, 0x5b, 0x02, 0x2b, 0x60, 0x00,
-  0x21, 0x93, 0x44, 0x32, 0x68, 0x00,
-  0xa2, 0x2c, 0x14, 0x45, 0x80, 0x00,
-  0x18, 0x0c, 0xe3, 0x01, 0x9c, 0x00,
-  0xe6, 0xbc, 0x88, 0xe3, 0x78, 0x00
-};
-
-const uint8_t kMaskRandom38_21[126] = {
-  0x8c, 0xe3, 0x11, 0x9c, 0x60, 0x00,
-  0x27, 0x11, 0xc4, 0xe2, 0x38, 0x00,
-  0x32, 0x8d, 0x26, 0x51, 0xa4, 0x00,
-  0x61, 0x92, 0x6c, 0x32, 0x4c, 0x00,
-  0x5c, 0x38, 0x8b, 0x87, 0x10, 0x00,
-  0xcc, 0x75, 0x19, 0x8e, 0xa0, 0x00,
-  0x2b, 0x19, 0xc5, 0x63, 0x38, 0x00,
-  0x32, 0xd2, 0x66, 0x5a, 0x4c, 0x00,
-  0x25, 0x8e, 0xa4, 0xb1, 0xd4, 0x00,
-  0x50, 0x88, 0xca, 0x11, 0x18, 0x00,
-  0x8c, 0xe3, 0x11, 0x9c, 0x60, 0x00,
-  0x27, 0x11, 0xc4, 0xe2, 0x38, 0x00,
-  0x32, 0x8d, 0x26, 0x51, 0xa4, 0x00,
-  0x61, 0x92, 0x6c, 0x32, 0x4c, 0x00,
-  0x5c, 0x38, 0x8b, 0x87, 0x10, 0x00,
-  0x84, 0x87, 0x10, 0x90, 0xe0, 0x00,
-  0x27, 0x19, 0x84, 0xe3, 0x30, 0x00,
-  0x51, 0x88, 0x6a, 0x31, 0x0c, 0x00,
-  0x1a, 0x22, 0xa3, 0x44, 0x54, 0x00,
-  0x68, 0x44, 0x4d, 0x08, 0x88, 0x00,
-  0x89, 0x70, 0x11, 0x2e, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom38_22[132] = {
-  0x8c, 0xe3, 0x11, 0x9c, 0x60, 0x00,
-  0x27, 0x11, 0xc4, 0xe2, 0x38, 0x00,
-  0x32, 0x8d, 0x26, 0x51, 0xa4, 0x00,
-  0x61, 0x92, 0x6c, 0x32, 0x4c, 0x00,
-  0x5c, 0x38, 0x8b, 0x87, 0x10, 0x00,
-  0x84, 0x87, 0x10, 0x90, 0xe0, 0x00,
-  0x27, 0x19, 0x84, 0xe3, 0x30, 0x00,
-  0x51, 0x88, 0x6a, 0x31, 0x0c, 0x00,
-  0x1a, 0x22, 0xa3, 0x44, 0x54, 0x00,
-  0x68, 0x44, 0x4d, 0x08, 0x88, 0x00,
-  0x89, 0x70, 0x11, 0x2e, 0x00, 0x00,
-  0x8c, 0xe3, 0x11, 0x9c, 0x60, 0x00,
-  0x27, 0x11, 0xc4, 0xe2, 0x38, 0x00,
-  0x32, 0x8d, 0x26, 0x51, 0xa4, 0x00,
-  0x61, 0x92, 0x6c, 0x32, 0x4c, 0x00,
-  0x5c, 0x38, 0x8b, 0x87, 0x10, 0x00,
-  0xcc, 0x75, 0x19, 0x8e, 0xa0, 0x00,
-  0x2b, 0x19, 0xc5, 0x63, 0x38, 0x00,
-  0x32, 0xd2, 0x66, 0x5a, 0x4c, 0x00,
-  0x25, 0x8e, 0xa4, 0xb1, 0xd4, 0x00,
-  0x50, 0x88, 0xca, 0x11, 0x18, 0x00,
-  0x0c, 0x3c, 0x48, 0x3d, 0x58, 0x00
-};
-
-const uint8_t kMaskRandom38_23[138] = {
-  0x8c, 0xe3, 0x11, 0x9c, 0x60, 0x00,
-  0x27, 0x11, 0xc4, 0xe2, 0x38, 0x00,
-  0x32, 0x8d, 0x26, 0x51, 0xa4, 0x00,
-  0x61, 0x92, 0x6c, 0x32, 0x4c, 0x00,
-  0x5c, 0x38, 0x8b, 0x87, 0x10, 0x00,
-  0x84, 0x87, 0x10, 0x90, 0xe0, 0x00,
-  0x27, 0x19, 0x84, 0xe3, 0x30, 0x00,
-  0x51, 0x88, 0x6a, 0x31, 0x0c, 0x00,
-  0x1a, 0x22, 0xa3, 0x44, 0x54, 0x00,
-  0x68, 0x44, 0x4d, 0x08, 0x88, 0x00,
-  0x89, 0x70, 0x11, 0x2e, 0x00, 0x00,
-  0x84, 0x87, 0x10, 0x90, 0xe0, 0x00,
-  0x27, 0x19, 0x84, 0xe3, 0x30, 0x00,
-  0x51, 0x88, 0x6a, 0x31, 0x0c, 0x00,
-  0x1a, 0x22, 0xa3, 0x44, 0x54, 0x00,
-  0x68, 0x44, 0x4d, 0x08, 0x88, 0x00,
-  0x89, 0x70, 0x11, 0x2e, 0x00, 0x00,
-  0x8c, 0xe3, 0x11, 0x9c, 0x60, 0x00,
-  0x27, 0x11, 0xc4, 0xe2, 0x38, 0x00,
-  0x32, 0x8d, 0x26, 0x51, 0xa4, 0x00,
-  0x61, 0x92, 0x6c, 0x32, 0x4c, 0x00,
-  0x5c, 0x38, 0x8b, 0x87, 0x10, 0x00,
-  0x90, 0xc8, 0x92, 0x19, 0x10, 0x00
-};
-
-const uint8_t kMaskRandom38_24[144] = {
-  0x84, 0x87, 0x10, 0x90, 0xe0, 0x00,
-  0x27, 0x19, 0x84, 0xe3, 0x30, 0x00,
-  0x51, 0x88, 0x6a, 0x31, 0x0c, 0x00,
-  0x1a, 0x22, 0xa3, 0x44, 0x54, 0x00,
-  0x68, 0x44, 0x4d, 0x08, 0x88, 0x00,
-  0x89, 0x70, 0x11, 0x2e, 0x00, 0x00,
-  0x8c, 0xe3, 0x11, 0x9c, 0x60, 0x00,
-  0x27, 0x11, 0xc4, 0xe2, 0x38, 0x00,
-  0x32, 0x8d, 0x26, 0x51, 0xa4, 0x00,
-  0x61, 0x92, 0x6c, 0x32, 0x4c, 0x00,
-  0x5c, 0x38, 0x8b, 0x87, 0x10, 0x00,
-  0x90, 0xc8, 0x92, 0x19, 0x10, 0x00,
-  0x8c, 0xe3, 0x11, 0x9c, 0x60, 0x00,
-  0x27, 0x11, 0xc4, 0xe2, 0x38, 0x00,
-  0x32, 0x8d, 0x26, 0x51, 0xa4, 0x00,
-  0x61, 0x92, 0x6c, 0x32, 0x4c, 0x00,
-  0x5c, 0x38, 0x8b, 0x87, 0x10, 0x00,
-  0x84, 0x87, 0x10, 0x90, 0xe0, 0x00,
-  0x27, 0x19, 0x84, 0xe3, 0x30, 0x00,
-  0x51, 0x88, 0x6a, 0x31, 0x0c, 0x00,
-  0x1a, 0x22, 0xa3, 0x44, 0x54, 0x00,
-  0x68, 0x44, 0x4d, 0x08, 0x88, 0x00,
-  0x89, 0x70, 0x11, 0x2e, 0x00, 0x00,
-  0x93, 0xc8, 0xb3, 0xbe, 0x5c, 0x00
-};
-
-const uint8_t kMaskRandom38_25[150] = {
-  0x84, 0x87, 0x10, 0x90, 0xe0, 0x00,
-  0x27, 0x19, 0x84, 0xe3, 0x30, 0x00,
-  0x51, 0x88, 0x6a, 0x31, 0x0c, 0x00,
-  0x1a, 0x22, 0xa3, 0x44, 0x54, 0x00,
-  0x68, 0x44, 0x4d, 0x08, 0x88, 0x00,
-  0x89, 0x70, 0x11, 0x2e, 0x00, 0x00,
-  0x8c, 0xe3, 0x11, 0x9c, 0x60, 0x00,
-  0x27, 0x11, 0xc4, 0xe2, 0x38, 0x00,
-  0x32, 0x8d, 0x26, 0x51, 0xa4, 0x00,
-  0x61, 0x92, 0x6c, 0x32, 0x4c, 0x00,
-  0x5c, 0x38, 0x8b, 0x87, 0x10, 0x00,
-  0x90, 0xc8, 0x92, 0x19, 0x10, 0x00,
-  0x84, 0x87, 0x10, 0x90, 0xe0, 0x00,
-  0x27, 0x19, 0x84, 0xe3, 0x30, 0x00,
-  0x51, 0x88, 0x6a, 0x31, 0x0c, 0x00,
-  0x1a, 0x22, 0xa3, 0x44, 0x54, 0x00,
-  0x68, 0x44, 0x4d, 0x08, 0x88, 0x00,
-  0x89, 0x70, 0x11, 0x2e, 0x00, 0x00,
-  0x8c, 0x23, 0x11, 0x84, 0x60, 0x00,
-  0x47, 0x19, 0x88, 0xe3, 0x30, 0x00,
-  0x81, 0x88, 0x70, 0x31, 0x0c, 0x00,
-  0x12, 0x86, 0x22, 0x50, 0xc4, 0x00,
-  0x58, 0x14, 0x4b, 0x02, 0x88, 0x00,
-  0x28, 0xca, 0x05, 0x19, 0x40, 0x00,
-  0x34, 0x60, 0x86, 0x8c, 0x10, 0x00
-};
-
-const uint8_t kMaskRandom38_26[156] = {
-  0x84, 0x87, 0x10, 0x90, 0xe0, 0x00,
-  0x27, 0x19, 0x84, 0xe3, 0x30, 0x00,
-  0x51, 0x88, 0x6a, 0x31, 0x0c, 0x00,
-  0x1a, 0x22, 0xa3, 0x44, 0x54, 0x00,
-  0x68, 0x44, 0x4d, 0x08, 0x88, 0x00,
-  0x89, 0x70, 0x11, 0x2e, 0x00, 0x00,
-  0x8c, 0x23, 0x11, 0x84, 0x60, 0x00,
-  0x47, 0x19, 0x88, 0xe3, 0x30, 0x00,
-  0x81, 0x88, 0x70, 0x31, 0x0c, 0x00,
-  0x12, 0x86, 0x22, 0x50, 0xc4, 0x00,
-  0x58, 0x14, 0x4b, 0x02, 0x88, 0x00,
-  0x28, 0xca, 0x05, 0x19, 0x40, 0x00,
-  0x34, 0x60, 0x86, 0x8c, 0x10, 0x00,
-  0x84, 0x87, 0x10, 0x90, 0xe0, 0x00,
-  0x27, 0x19, 0x84, 0xe3, 0x30, 0x00,
-  0x51, 0x88, 0x6a, 0x31, 0x0c, 0x00,
-  0x1a, 0x22, 0xa3, 0x44, 0x54, 0x00,
-  0x68, 0x44, 0x4d, 0x08, 0x88, 0x00,
-  0x89, 0x70, 0x11, 0x2e, 0x00, 0x00,
-  0x8c, 0xe3, 0x11, 0x9c, 0x60, 0x00,
-  0x27, 0x11, 0xc4, 0xe2, 0x38, 0x00,
-  0x32, 0x8d, 0x26, 0x51, 0xa4, 0x00,
-  0x61, 0x92, 0x6c, 0x32, 0x4c, 0x00,
-  0x5c, 0x38, 0x8b, 0x87, 0x10, 0x00,
-  0x90, 0xc8, 0x92, 0x19, 0x10, 0x00,
-  0x4b, 0xab, 0xfc, 0xe6, 0xe8, 0x00
-};
-
-const uint8_t kMaskRandom38_27[162] = {
-  0x84, 0x87, 0x10, 0x90, 0xe0, 0x00,
-  0x27, 0x19, 0x84, 0xe3, 0x30, 0x00,
-  0x51, 0x88, 0x6a, 0x31, 0x0c, 0x00,
-  0x1a, 0x22, 0xa3, 0x44, 0x54, 0x00,
-  0x68, 0x44, 0x4d, 0x08, 0x88, 0x00,
-  0x89, 0x70, 0x11, 0x2e, 0x00, 0x00,
-  0x8c, 0x23, 0x11, 0x84, 0x60, 0x00,
-  0x47, 0x19, 0x88, 0xe3, 0x30, 0x00,
-  0x81, 0x88, 0x70, 0x31, 0x0c, 0x00,
-  0x12, 0x86, 0x22, 0x50, 0xc4, 0x00,
-  0x58, 0x14, 0x4b, 0x02, 0x88, 0x00,
-  0x28, 0xca, 0x05, 0x19, 0x40, 0x00,
-  0x34, 0x60, 0x86, 0x8c, 0x10, 0x00,
-  0x8c, 0x23, 0x11, 0x84, 0x60, 0x00,
-  0x47, 0x19, 0x88, 0xe3, 0x30, 0x00,
-  0x81, 0x88, 0x70, 0x31, 0x0c, 0x00,
-  0x12, 0x86, 0x22, 0x50, 0xc4, 0x00,
-  0x58, 0x14, 0x4b, 0x02, 0x88, 0x00,
-  0x28, 0xca, 0x05, 0x19, 0x40, 0x00,
-  0x34, 0x60, 0x86, 0x8c, 0x10, 0x00,
-  0x84, 0x87, 0x10, 0x90, 0xe0, 0x00,
-  0x27, 0x19, 0x84, 0xe3, 0x30, 0x00,
-  0x51, 0x88, 0x6a, 0x31, 0x0c, 0x00,
-  0x1a, 0x22, 0xa3, 0x44, 0x54, 0x00,
-  0x68, 0x44, 0x4d, 0x08, 0x88, 0x00,
-  0x89, 0x70, 0x11, 0x2e, 0x00, 0x00,
-  0x6e, 0x27, 0x6d, 0xc4, 0xec, 0x00
-};
-
-const uint8_t kMaskRandom38_28[168] = {
-  0x8c, 0x23, 0x11, 0x84, 0x60, 0x00,
-  0x47, 0x19, 0x88, 0xe3, 0x30, 0x00,
-  0x81, 0x88, 0x70, 0x31, 0x0c, 0x00,
-  0x12, 0x86, 0x22, 0x50, 0xc4, 0x00,
-  0x58, 0x14, 0x4b, 0x02, 0x88, 0x00,
-  0x28, 0xca, 0x05, 0x19, 0x40, 0x00,
-  0x34, 0x60, 0x86, 0x8c, 0x10, 0x00,
-  0x84, 0x87, 0x10, 0x90, 0xe0, 0x00,
-  0x27, 0x19, 0x84, 0xe3, 0x30, 0x00,
-  0x51, 0x88, 0x6a, 0x31, 0x0c, 0x00,
-  0x1a, 0x22, 0xa3, 0x44, 0x54, 0x00,
-  0x68, 0x44, 0x4d, 0x08, 0x88, 0x00,
-  0x89, 0x70, 0x11, 0x2e, 0x00, 0x00,
-  0x6e, 0x27, 0x6d, 0xc4, 0xec, 0x00,
-  0x84, 0x87, 0x10, 0x90, 0xe0, 0x00,
-  0x27, 0x19, 0x84, 0xe3, 0x30, 0x00,
-  0x51, 0x88, 0x6a, 0x31, 0x0c, 0x00,
-  0x1a, 0x22, 0xa3, 0x44, 0x54, 0x00,
-  0x68, 0x44, 0x4d, 0x08, 0x88, 0x00,
-  0x89, 0x70, 0x11, 0x2e, 0x00, 0x00,
-  0x8c, 0x23, 0x11, 0x84, 0x60, 0x00,
-  0x47, 0x19, 0x88, 0xe3, 0x30, 0x00,
-  0x81, 0x88, 0x70, 0x31, 0x0c, 0x00,
-  0x12, 0x86, 0x22, 0x50, 0xc4, 0x00,
-  0x58, 0x14, 0x4b, 0x02, 0x88, 0x00,
-  0x28, 0xca, 0x05, 0x19, 0x40, 0x00,
-  0x34, 0x60, 0x86, 0x8c, 0x10, 0x00,
-  0x70, 0x1b, 0x5b, 0x2c, 0x0c, 0x00
-};
-
-const uint8_t kMaskRandom38_29[174] = {
-  0x8c, 0x23, 0x11, 0x84, 0x60, 0x00,
-  0x47, 0x19, 0x88, 0xe3, 0x30, 0x00,
-  0x81, 0x88, 0x70, 0x31, 0x0c, 0x00,
-  0x12, 0x86, 0x22, 0x50, 0xc4, 0x00,
-  0x58, 0x14, 0x4b, 0x02, 0x88, 0x00,
-  0x28, 0xca, 0x05, 0x19, 0x40, 0x00,
-  0x34, 0x60, 0x86, 0x8c, 0x10, 0x00,
-  0x84, 0x87, 0x10, 0x90, 0xe0, 0x00,
-  0x27, 0x19, 0x84, 0xe3, 0x30, 0x00,
-  0x51, 0x88, 0x6a, 0x31, 0x0c, 0x00,
-  0x1a, 0x22, 0xa3, 0x44, 0x54, 0x00,
-  0x68, 0x44, 0x4d, 0x08, 0x88, 0x00,
-  0x89, 0x70, 0x11, 0x2e, 0x00, 0x00,
-  0x6e, 0x27, 0x6d, 0xc4, 0xec, 0x00,
-  0x8c, 0x23, 0x11, 0x84, 0x60, 0x00,
-  0x47, 0x19, 0x88, 0xe3, 0x30, 0x00,
-  0x81, 0x88, 0x70, 0x31, 0x0c, 0x00,
-  0x12, 0x86, 0x22, 0x50, 0xc4, 0x00,
-  0x58, 0x14, 0x4b, 0x02, 0x88, 0x00,
-  0x28, 0xca, 0x05, 0x19, 0x40, 0x00,
-  0x34, 0x60, 0x86, 0x8c, 0x10, 0x00,
-  0x2c, 0x16, 0x05, 0x82, 0xc0, 0x00,
-  0x91, 0x40, 0xd2, 0x28, 0x18, 0x00,
-  0xc0, 0xd0, 0x38, 0x1a, 0x04, 0x00,
-  0x06, 0x82, 0xa0, 0xd0, 0x54, 0x00,
-  0xc8, 0x0c, 0x59, 0x01, 0x88, 0x00,
-  0x45, 0x61, 0x08, 0xac, 0x20, 0x00,
-  0x30, 0x91, 0x46, 0x12, 0x28, 0x00,
-  0xa2, 0x28, 0x34, 0x45, 0x04, 0x00
-};
-
-const uint8_t kMaskRandom38_3[18] = {
-  0xcc, 0x67, 0x19, 0x8c, 0xe0, 0x00,
-  0x27, 0x2c, 0xc4, 0xe5, 0x98, 0x00,
-  0x92, 0xd2, 0x72, 0x5a, 0x4c, 0x00
-};
-
-const uint8_t kMaskRandom38_30[180] = {
-  0x8c, 0x23, 0x11, 0x84, 0x60, 0x00,
-  0x47, 0x19, 0x88, 0xe3, 0x30, 0x00,
-  0x81, 0x88, 0x70, 0x31, 0x0c, 0x00,
-  0x12, 0x86, 0x22, 0x50, 0xc4, 0x00,
-  0x58, 0x14, 0x4b, 0x02, 0x88, 0x00,
-  0x28, 0xca, 0x05, 0x19, 0x40, 0x00,
-  0x34, 0x60, 0x86, 0x8c, 0x10, 0x00,
-  0x2c, 0x16, 0x05, 0x82, 0xc0, 0x00,
-  0x91, 0x40, 0xd2, 0x28, 0x18, 0x00,
-  0xc0, 0xd0, 0x38, 0x1a, 0x04, 0x00,
-  0x06, 0x82, 0xa0, 0xd0, 0x54, 0x00,
-  0xc8, 0x0c, 0x59, 0x01, 0x88, 0x00,
-  0x45, 0x61, 0x08, 0xac, 0x20, 0x00,
-  0x30, 0x91, 0x46, 0x12, 0x28, 0x00,
-  0xa2, 0x28, 0x34, 0x45, 0x04, 0x00,
-  0x8c, 0x23, 0x11, 0x84, 0x60, 0x00,
-  0x47, 0x19, 0x88, 0xe3, 0x30, 0x00,
-  0x81, 0x88, 0x70, 0x31, 0x0c, 0x00,
-  0x12, 0x86, 0x22, 0x50, 0xc4, 0x00,
-  0x58, 0x14, 0x4b, 0x02, 0x88, 0x00,
-  0x28, 0xca, 0x05, 0x19, 0x40, 0x00,
-  0x34, 0x60, 0x86, 0x8c, 0x10, 0x00,
-  0x84, 0x87, 0x10, 0x90, 0xe0, 0x00,
-  0x27, 0x19, 0x84, 0xe3, 0x30, 0x00,
-  0x51, 0x88, 0x6a, 0x31, 0x0c, 0x00,
-  0x1a, 0x22, 0xa3, 0x44, 0x54, 0x00,
-  0x68, 0x44, 0x4d, 0x08, 0x88, 0x00,
-  0x89, 0x70, 0x11, 0x2e, 0x00, 0x00,
-  0x6e, 0x27, 0x6d, 0xc4, 0xec, 0x00,
-  0x5b, 0x16, 0xdf, 0xb8, 0xd0, 0x00
-};
-
-const uint8_t kMaskRandom38_31[186] = {
-  0x8c, 0x23, 0x11, 0x84, 0x60, 0x00,
-  0x47, 0x19, 0x88, 0xe3, 0x30, 0x00,
-  0x81, 0x88, 0x70, 0x31, 0x0c, 0x00,
-  0x12, 0x86, 0x22, 0x50, 0xc4, 0x00,
-  0x58, 0x14, 0x4b, 0x02, 0x88, 0x00,
-  0x28, 0xca, 0x05, 0x19, 0x40, 0x00,
-  0x34, 0x60, 0x86, 0x8c, 0x10, 0x00,
-  0x2c, 0x16, 0x05, 0x82, 0xc0, 0x00,
-  0x91, 0x40, 0xd2, 0x28, 0x18, 0x00,
-  0xc0, 0xd0, 0x38, 0x1a, 0x04, 0x00,
-  0x06, 0x82, 0xa0, 0xd0, 0x54, 0x00,
-  0xc8, 0x0c, 0x59, 0x01, 0x88, 0x00,
-  0x45, 0x61, 0x08, 0xac, 0x20, 0x00,
-  0x30, 0x91, 0x46, 0x12, 0x28, 0x00,
-  0xa2, 0x28, 0x34, 0x45, 0x04, 0x00,
-  0x2c, 0x16, 0x05, 0x82, 0xc0, 0x00,
-  0x91, 0x40, 0xd2, 0x28, 0x18, 0x00,
-  0xc0, 0xd0, 0x38, 0x1a, 0x04, 0x00,
-  0x06, 0x82, 0xa0, 0xd0, 0x54, 0x00,
-  0xc8, 0x0c, 0x59, 0x01, 0x88, 0x00,
-  0x45, 0x61, 0x08, 0xac, 0x20, 0x00,
-  0x30, 0x91, 0x46, 0x12, 0x28, 0x00,
-  0xa2, 0x28, 0x34, 0x45, 0x04, 0x00,
-  0x8c, 0x23, 0x11, 0x84, 0x60, 0x00,
-  0x47, 0x19, 0x88, 0xe3, 0x30, 0x00,
-  0x81, 0x88, 0x70, 0x31, 0x0c, 0x00,
-  0x12, 0x86, 0x22, 0x50, 0xc4, 0x00,
-  0x58, 0x14, 0x4b, 0x02, 0x88, 0x00,
-  0x28, 0xca, 0x05, 0x19, 0x40, 0x00,
-  0x34, 0x60, 0x86, 0x8c, 0x10, 0x00,
-  0x7e, 0x75, 0xef, 0xce, 0xbc, 0x00
-};
-
-const uint8_t kMaskRandom38_32[192] = {
-  0x2c, 0x16, 0x05, 0x82, 0xc0, 0x00,
-  0x91, 0x40, 0xd2, 0x28, 0x18, 0x00,
-  0xc0, 0xd0, 0x38, 0x1a, 0x04, 0x00,
-  0x06, 0x82, 0xa0, 0xd0, 0x54, 0x00,
-  0xc8, 0x0c, 0x59, 0x01, 0x88, 0x00,
-  0x45, 0x61, 0x08, 0xac, 0x20, 0x00,
-  0x30, 0x91, 0x46, 0x12, 0x28, 0x00,
-  0xa2, 0x28, 0x34, 0x45, 0x04, 0x00,
-  0x8c, 0x23, 0x11, 0x84, 0x60, 0x00,
-  0x47, 0x19, 0x88, 0xe3, 0x30, 0x00,
-  0x81, 0x88, 0x70, 0x31, 0x0c, 0x00,
-  0x12, 0x86, 0x22, 0x50, 0xc4, 0x00,
-  0x58, 0x14, 0x4b, 0x02, 0x88, 0x00,
-  0x28, 0xca, 0x05, 0x19, 0x40, 0x00,
-  0x34, 0x60, 0x86, 0x8c, 0x10, 0x00,
-  0x7e, 0x75, 0xef, 0xce, 0xbc, 0x00,
-  0x8c, 0x23, 0x11, 0x84, 0x60, 0x00,
-  0x47, 0x19, 0x88, 0xe3, 0x30, 0x00,
-  0x81, 0x88, 0x70, 0x31, 0x0c, 0x00,
-  0x12, 0x86, 0x22, 0x50, 0xc4, 0x00,
-  0x58, 0x14, 0x4b, 0x02, 0x88, 0x00,
-  0x28, 0xca, 0x05, 0x19, 0x40, 0x00,
-  0x34, 0x60, 0x86, 0x8c, 0x10, 0x00,
-  0x2c, 0x16, 0x05, 0x82, 0xc0, 0x00,
-  0x91, 0x40, 0xd2, 0x28, 0x18, 0x00,
-  0xc0, 0xd0, 0x38, 0x1a, 0x04, 0x00,
-  0x06, 0x82, 0xa0, 0xd0, 0x54, 0x00,
-  0xc8, 0x0c, 0x59, 0x01, 0x88, 0x00,
-  0x45, 0x61, 0x08, 0xac, 0x20, 0x00,
-  0x30, 0x91, 0x46, 0x12, 0x28, 0x00,
-  0xa2, 0x28, 0x34, 0x45, 0x04, 0x00,
-  0x33, 0x10, 0x02, 0x4e, 0x54, 0x00
-};
-
-const uint8_t kMaskRandom38_33[198] = {
-  0x2c, 0x16, 0x05, 0x82, 0xc0, 0x00,
-  0x91, 0x40, 0xd2, 0x28, 0x18, 0x00,
-  0xc0, 0xd0, 0x38, 0x1a, 0x04, 0x00,
-  0x06, 0x82, 0xa0, 0xd0, 0x54, 0x00,
-  0xc8, 0x0c, 0x59, 0x01, 0x88, 0x00,
-  0x45, 0x61, 0x08, 0xac, 0x20, 0x00,
-  0x30, 0x91, 0x46, 0x12, 0x28, 0x00,
-  0xa2, 0x28, 0x34, 0x45, 0x04, 0x00,
-  0x8c, 0x23, 0x11, 0x84, 0x60, 0x00,
-  0x47, 0x19, 0x88, 0xe3, 0x30, 0x00,
-  0x81, 0x88, 0x70, 0x31, 0x0c, 0x00,
-  0x12, 0x86, 0x22, 0x50, 0xc4, 0x00,
-  0x58, 0x14, 0x4b, 0x02, 0x88, 0x00,
-  0x28, 0xca, 0x05, 0x19, 0x40, 0x00,
-  0x34, 0x60, 0x86, 0x8c, 0x10, 0x00,
-  0x7e, 0x75, 0xef, 0xce, 0xbc, 0x00,
-  0x2c, 0x16, 0x05, 0x82, 0xc0, 0x00,
-  0x91, 0x40, 0xd2, 0x28, 0x18, 0x00,
-  0xc0, 0xd0, 0x38, 0x1a, 0x04, 0x00,
-  0x06, 0x82, 0xa0, 0xd0, 0x54, 0x00,
-  0xc8, 0x0c, 0x59, 0x01, 0x88, 0x00,
-  0x45, 0x61, 0x08, 0xac, 0x20, 0x00,
-  0x30, 0x91, 0x46, 0x12, 0x28, 0x00,
-  0xa2, 0x28, 0x34, 0x45, 0x04, 0x00,
-  0x4c, 0x27, 0x09, 0x84, 0xe0, 0x00,
-  0x66, 0x71, 0x8c, 0xce, 0x30, 0x00,
-  0x91, 0x40, 0xf2, 0x28, 0x1c, 0x00,
-  0x42, 0x90, 0xa8, 0x52, 0x14, 0x00,
-  0xa4, 0x29, 0x54, 0x85, 0x28, 0x00,
-  0x13, 0x5a, 0x02, 0x6b, 0x40, 0x00,
-  0x30, 0x93, 0x46, 0x12, 0x68, 0x00,
-  0x88, 0xac, 0x31, 0x15, 0x84, 0x00,
-  0x09, 0x0c, 0xc1, 0x21, 0x98, 0x00
-};
-
-const uint8_t kMaskRandom38_34[204] = {
-  0x2c, 0x16, 0x05, 0x82, 0xc0, 0x00,
-  0x91, 0x40, 0xd2, 0x28, 0x18, 0x00,
-  0xc0, 0xd0, 0x38, 0x1a, 0x04, 0x00,
-  0x06, 0x82, 0xa0, 0xd0, 0x54, 0x00,
-  0xc8, 0x0c, 0x59, 0x01, 0x88, 0x00,
-  0x45, 0x61, 0x08, 0xac, 0x20, 0x00,
-  0x30, 0x91, 0x46, 0x12, 0x28, 0x00,
-  0xa2, 0x28, 0x34, 0x45, 0x04, 0x00,
-  0x4c, 0x27, 0x09, 0x84, 0xe0, 0x00,
-  0x66, 0x71, 0x8c, 0xce, 0x30, 0x00,
-  0x91, 0x40, 0xf2, 0x28, 0x1c, 0x00,
-  0x42, 0x90, 0xa8, 0x52, 0x14, 0x00,
-  0xa4, 0x29, 0x54, 0x85, 0x28, 0x00,
-  0x13, 0x5a, 0x02, 0x6b, 0x40, 0x00,
-  0x30, 0x93, 0x46, 0x12, 0x68, 0x00,
-  0x88, 0xac, 0x31, 0x15, 0x84, 0x00,
-  0x09, 0x0c, 0xc1, 0x21, 0x98, 0x00,
-  0x2c, 0x16, 0x05, 0x82, 0xc0, 0x00,
-  0x91, 0x40, 0xd2, 0x28, 0x18, 0x00,
-  0xc0, 0xd0, 0x38, 0x1a, 0x04, 0x00,
-  0x06, 0x82, 0xa0, 0xd0, 0x54, 0x00,
-  0xc8, 0x0c, 0x59, 0x01, 0x88, 0x00,
-  0x45, 0x61, 0x08, 0xac, 0x20, 0x00,
-  0x30, 0x91, 0x46, 0x12, 0x28, 0x00,
-  0xa2, 0x28, 0x34, 0x45, 0x04, 0x00,
-  0x8c, 0x23, 0x11, 0x84, 0x60, 0x00,
-  0x47, 0x19, 0x88, 0xe3, 0x30, 0x00,
-  0x81, 0x88, 0x70, 0x31, 0x0c, 0x00,
-  0x12, 0x86, 0x22, 0x50, 0xc4, 0x00,
-  0x58, 0x14, 0x4b, 0x02, 0x88, 0x00,
-  0x28, 0xca, 0x05, 0x19, 0x40, 0x00,
-  0x34, 0x60, 0x86, 0x8c, 0x10, 0x00,
-  0x7e, 0x75, 0xef, 0xce, 0xbc, 0x00,
-  0x91, 0x48, 0xfa, 0xf0, 0xd8, 0x00
-};
-
-const uint8_t kMaskRandom38_35[210] = {
-  0x2c, 0x16, 0x05, 0x82, 0xc0, 0x00,
-  0x91, 0x40, 0xd2, 0x28, 0x18, 0x00,
-  0xc0, 0xd0, 0x38, 0x1a, 0x04, 0x00,
-  0x06, 0x82, 0xa0, 0xd0, 0x54, 0x00,
-  0xc8, 0x0c, 0x59, 0x01, 0x88, 0x00,
-  0x45, 0x61, 0x08, 0xac, 0x20, 0x00,
-  0x30, 0x91, 0x46, 0x12, 0x28, 0x00,
-  0xa2, 0x28, 0x34, 0x45, 0x04, 0x00,
-  0x4c, 0x27, 0x09, 0x84, 0xe0, 0x00,
-  0x66, 0x71, 0x8c, 0xce, 0x30, 0x00,
-  0x91, 0x40, 0xf2, 0x28, 0x1c, 0x00,
-  0x42, 0x90, 0xa8, 0x52, 0x14, 0x00,
-  0xa4, 0x29, 0x54, 0x85, 0x28, 0x00,
-  0x13, 0x5a, 0x02, 0x6b, 0x40, 0x00,
-  0x30, 0x93, 0x46, 0x12, 0x68, 0x00,
-  0x88, 0xac, 0x31, 0x15, 0x84, 0x00,
-  0x09, 0x0c, 0xc1, 0x21, 0x98, 0x00,
-  0x4c, 0x27, 0x09, 0x84, 0xe0, 0x00,
-  0x66, 0x71, 0x8c, 0xce, 0x30, 0x00,
-  0x91, 0x40, 0xf2, 0x28, 0x1c, 0x00,
-  0x42, 0x90, 0xa8, 0x52, 0x14, 0x00,
-  0xa4, 0x29, 0x54, 0x85, 0x28, 0x00,
-  0x13, 0x5a, 0x02, 0x6b, 0x40, 0x00,
-  0x30, 0x93, 0x46, 0x12, 0x68, 0x00,
-  0x88, 0xac, 0x31, 0x15, 0x84, 0x00,
-  0x09, 0x0c, 0xc1, 0x21, 0x98, 0x00,
-  0x2c, 0x16, 0x05, 0x82, 0xc0, 0x00,
-  0x91, 0x40, 0xd2, 0x28, 0x18, 0x00,
-  0xc0, 0xd0, 0x38, 0x1a, 0x04, 0x00,
-  0x06, 0x82, 0xa0, 0xd0, 0x54, 0x00,
-  0xc8, 0x0c, 0x59, 0x01, 0x88, 0x00,
-  0x45, 0x61, 0x08, 0xac, 0x20, 0x00,
-  0x30, 0x91, 0x46, 0x12, 0x28, 0x00,
-  0xa2, 0x28, 0x34, 0x45, 0x04, 0x00,
-  0x51, 0x97, 0x2a, 0x32, 0xe4, 0x00
-};
-
-const uint8_t kMaskRandom38_36[216] = {
-  0x4c, 0x27, 0x09, 0x84, 0xe0, 0x00,
-  0x66, 0x71, 0x8c, 0xce, 0x30, 0x00,
-  0x91, 0x40, 0xf2, 0x28, 0x1c, 0x00,
-  0x42, 0x90, 0xa8, 0x52, 0x14, 0x00,
-  0xa4, 0x29, 0x54, 0x85, 0x28, 0x00,
-  0x13, 0x5a, 0x02, 0x6b, 0x40, 0x00,
-  0x30, 0x93, 0x46, 0x12, 0x68, 0x00,
-  0x88, 0xac, 0x31, 0x15, 0x84, 0x00,
-  0x09, 0x0c, 0xc1, 0x21, 0x98, 0x00,
-  0x2c, 0x16, 0x05, 0x82, 0xc0, 0x00,
-  0x91, 0x40, 0xd2, 0x28, 0x18, 0x00,
-  0xc0, 0xd0, 0x38, 0x1a, 0x04, 0x00,
-  0x06, 0x82, 0xa0, 0xd0, 0x54, 0x00,
-  0xc8, 0x0c, 0x59, 0x01, 0x88, 0x00,
-  0x45, 0x61, 0x08, 0xac, 0x20, 0x00,
-  0x30, 0x91, 0x46, 0x12, 0x28, 0x00,
-  0xa2, 0x28, 0x34, 0x45, 0x04, 0x00,
-  0x51, 0x97, 0x2a, 0x32, 0xe4, 0x00,
-  0x2c, 0x16, 0x05, 0x82, 0xc0, 0x00,
-  0x91, 0x40, 0xd2, 0x28, 0x18, 0x00,
-  0xc0, 0xd0, 0x38, 0x1a, 0x04, 0x00,
-  0x06, 0x82, 0xa0, 0xd0, 0x54, 0x00,
-  0xc8, 0x0c, 0x59, 0x01, 0x88, 0x00,
-  0x45, 0x61, 0x08, 0xac, 0x20, 0x00,
-  0x30, 0x91, 0x46, 0x12, 0x28, 0x00,
-  0xa2, 0x28, 0x34, 0x45, 0x04, 0x00,
-  0x4c, 0x27, 0x09, 0x84, 0xe0, 0x00,
-  0x66, 0x71, 0x8c, 0xce, 0x30, 0x00,
-  0x91, 0x40, 0xf2, 0x28, 0x1c, 0x00,
-  0x42, 0x90, 0xa8, 0x52, 0x14, 0x00,
-  0xa4, 0x29, 0x54, 0x85, 0x28, 0x00,
-  0x13, 0x5a, 0x02, 0x6b, 0x40, 0x00,
-  0x30, 0x93, 0x46, 0x12, 0x68, 0x00,
-  0x88, 0xac, 0x31, 0x15, 0x84, 0x00,
-  0x09, 0x0c, 0xc1, 0x21, 0x98, 0x00,
-  0x80, 0x95, 0xc2, 0x68, 0x28, 0x00
-};
-
-const uint8_t kMaskRandom38_37[222] = {
-  0x4c, 0x27, 0x09, 0x84, 0xe0, 0x00,
-  0x66, 0x71, 0x8c, 0xce, 0x30, 0x00,
-  0x91, 0x40, 0xf2, 0x28, 0x1c, 0x00,
-  0x42, 0x90, 0xa8, 0x52, 0x14, 0x00,
-  0xa4, 0x29, 0x54, 0x85, 0x28, 0x00,
-  0x13, 0x5a, 0x02, 0x6b, 0x40, 0x00,
-  0x30, 0x93, 0x46, 0x12, 0x68, 0x00,
-  0x88, 0xac, 0x31, 0x15, 0x84, 0x00,
-  0x09, 0x0c, 0xc1, 0x21, 0x98, 0x00,
-  0x2c, 0x16, 0x05, 0x82, 0xc0, 0x00,
-  0x91, 0x40, 0xd2, 0x28, 0x18, 0x00,
-  0xc0, 0xd0, 0x38, 0x1a, 0x04, 0x00,
-  0x06, 0x82, 0xa0, 0xd0, 0x54, 0x00,
-  0xc8, 0x0c, 0x59, 0x01, 0x88, 0x00,
-  0x45, 0x61, 0x08, 0xac, 0x20, 0x00,
-  0x30, 0x91, 0x46, 0x12, 0x28, 0x00,
-  0xa2, 0x28, 0x34, 0x45, 0x04, 0x00,
-  0x51, 0x97, 0x2a, 0x32, 0xe4, 0x00,
-  0x4c, 0x27, 0x09, 0x84, 0xe0, 0x00,
-  0x66, 0x71, 0x8c, 0xce, 0x30, 0x00,
-  0x91, 0x40, 0xf2, 0x28, 0x1c, 0x00,
-  0x42, 0x90, 0xa8, 0x52, 0x14, 0x00,
-  0xa4, 0x29, 0x54, 0x85, 0x28, 0x00,
-  0x13, 0x5a, 0x02, 0x6b, 0x40, 0x00,
-  0x30, 0x93, 0x46, 0x12, 0x68, 0x00,
-  0x88, 0xac, 0x31, 0x15, 0x84, 0x00,
-  0x09, 0x0c, 0xc1, 0x21, 0x98, 0x00,
-  0x4c, 0x26, 0x09, 0x84, 0xc0, 0x00,
-  0x66, 0x28, 0x8c, 0xc5, 0x10, 0x00,
-  0x91, 0x50, 0x32, 0x2a, 0x04, 0x00,
-  0x42, 0x82, 0x68, 0x50, 0x4c, 0x00,
-  0xa4, 0x01, 0xd4, 0x80, 0x38, 0x00,
-  0x13, 0x43, 0x02, 0x68, 0x60, 0x00,
-  0x30, 0x94, 0x86, 0x12, 0x90, 0x00,
-  0x88, 0xa1, 0x31, 0x14, 0x24, 0x00,
-  0x09, 0x4c, 0x01, 0x29, 0x80, 0x00,
-  0xcd, 0x98, 0x59, 0xb3, 0x08, 0x00
-};
-
-const uint8_t kMaskRandom38_38[228] = {
-  0x4c, 0x27, 0x09, 0x84, 0xe0, 0x00,
-  0x66, 0x71, 0x8c, 0xce, 0x30, 0x00,
-  0x91, 0x40, 0xf2, 0x28, 0x1c, 0x00,
-  0x42, 0x90, 0xa8, 0x52, 0x14, 0x00,
-  0xa4, 0x29, 0x54, 0x85, 0x28, 0x00,
-  0x13, 0x5a, 0x02, 0x6b, 0x40, 0x00,
-  0x30, 0x93, 0x46, 0x12, 0x68, 0x00,
-  0x88, 0xac, 0x31, 0x15, 0x84, 0x00,
-  0x09, 0x0c, 0xc1, 0x21, 0x98, 0x00,
-  0x4c, 0x26, 0x09, 0x84, 0xc0, 0x00,
-  0x66, 0x28, 0x8c, 0xc5, 0x10, 0x00,
-  0x91, 0x50, 0x32, 0x2a, 0x04, 0x00,
-  0x42, 0x82, 0x68, 0x50, 0x4c, 0x00,
-  0xa4, 0x01, 0xd4, 0x80, 0x38, 0x00,
-  0x13, 0x43, 0x02, 0x68, 0x60, 0x00,
-  0x30, 0x94, 0x86, 0x12, 0x90, 0x00,
-  0x88, 0xa1, 0x31, 0x14, 0x24, 0x00,
-  0x09, 0x4c, 0x01, 0x29, 0x80, 0x00,
-  0xcd, 0x98, 0x59, 0xb3, 0x08, 0x00,
-  0x4c, 0x27, 0x09, 0x84, 0xe0, 0x00,
-  0x66, 0x71, 0x8c, 0xce, 0x30, 0x00,
-  0x91, 0x40, 0xf2, 0x28, 0x1c, 0x00,
-  0x42, 0x90, 0xa8, 0x52, 0x14, 0x00,
-  0xa4, 0x29, 0x54, 0x85, 0x28, 0x00,
-  0x13, 0x5a, 0x02, 0x6b, 0x40, 0x00,
-  0x30, 0x93, 0x46, 0x12, 0x68, 0x00,
-  0x88, 0xac, 0x31, 0x15, 0x84, 0x00,
-  0x09, 0x0c, 0xc1, 0x21, 0x98, 0x00,
-  0x2c, 0x16, 0x05, 0x82, 0xc0, 0x00,
-  0x91, 0x40, 0xd2, 0x28, 0x18, 0x00,
-  0xc0, 0xd0, 0x38, 0x1a, 0x04, 0x00,
-  0x06, 0x82, 0xa0, 0xd0, 0x54, 0x00,
-  0xc8, 0x0c, 0x59, 0x01, 0x88, 0x00,
-  0x45, 0x61, 0x08, 0xac, 0x20, 0x00,
-  0x30, 0x91, 0x46, 0x12, 0x28, 0x00,
-  0xa2, 0x28, 0x34, 0x45, 0x04, 0x00,
-  0x51, 0x97, 0x2a, 0x32, 0xe4, 0x00,
-  0x8c, 0xed, 0x11, 0x5f, 0x24, 0x00
-};
-
-const uint8_t kMaskRandom38_4[24] = {
-  0xec, 0x73, 0x1d, 0x8e, 0x60, 0x00,
-  0x67, 0x19, 0xcc, 0xe3, 0x38, 0x00,
-  0xb1, 0xcc, 0x76, 0x39, 0x8c, 0x00,
-  0x5a, 0x96, 0xab, 0x52, 0xd4, 0x00
-};
-
-const uint8_t kMaskRandom38_5[30] = {
-  0x4c, 0xe7, 0x09, 0x9c, 0xe0, 0x00,
-  0x66, 0x31, 0xcc, 0xc6, 0x38, 0x00,
-  0xa1, 0xcc, 0x74, 0x39, 0x8c, 0x00,
-  0x92, 0xa6, 0xb2, 0x54, 0xd4, 0x00,
-  0xb8, 0x99, 0x97, 0x13, 0x30, 0x00
-};
-
-const uint8_t kMaskRandom38_6[36] = {
-  0x4c, 0x36, 0x09, 0x86, 0xc0, 0x00,
-  0x45, 0x68, 0x88, 0xad, 0x10, 0x00,
-  0x30, 0xd0, 0x66, 0x1a, 0x0c, 0x00,
-  0x8a, 0x82, 0xb1, 0x50, 0x54, 0x00,
-  0x26, 0x0b, 0x44, 0xc1, 0x68, 0x00,
-  0x95, 0x45, 0x12, 0xa8, 0xa0, 0x00
-};
-
-const uint8_t kMaskRandom38_7[42] = {
-  0xc4, 0xa3, 0x18, 0x94, 0x60, 0x00,
-  0x23, 0x19, 0x84, 0x63, 0x30, 0x00,
-  0x91, 0x1c, 0x32, 0x23, 0x84, 0x00,
-  0x4a, 0x82, 0xa9, 0x50, 0x54, 0x00,
-  0x34, 0x49, 0x46, 0x89, 0x28, 0x00,
-  0x8b, 0x4a, 0x11, 0x69, 0x40, 0x00,
-  0xc8, 0x24, 0xd9, 0x04, 0x98, 0x00
-};
-
-const uint8_t kMaskRandom38_8[48] = {
-  0x16, 0x13, 0x82, 0xc2, 0x70, 0x00,
-  0xc2, 0x44, 0xd8, 0x48, 0x98, 0x00,
-  0x60, 0xe8, 0x2c, 0x1d, 0x04, 0x00,
-  0x85, 0x12, 0x70, 0xa2, 0x4c, 0x00,
-  0xcc, 0x21, 0x59, 0x84, 0x28, 0x00,
-  0x29, 0x63, 0x05, 0x2c, 0x60, 0x00,
-  0x11, 0x98, 0xc2, 0x33, 0x18, 0x00,
-  0xb0, 0x0c, 0x76, 0x01, 0x8c, 0x00
-};
-
-const uint8_t kMaskRandom38_9[54] = {
-  0x44, 0xa7, 0x08, 0x94, 0xe0, 0x00,
-  0x66, 0x70, 0x8c, 0xce, 0x10, 0x00,
-  0x12, 0xc0, 0xe2, 0x58, 0x1c, 0x00,
-  0xc3, 0x10, 0xb8, 0x62, 0x14, 0x00,
-  0x8c, 0x29, 0x51, 0x85, 0x28, 0x00,
-  0x11, 0x5b, 0x02, 0x2b, 0x60, 0x00,
-  0x21, 0x93, 0x44, 0x32, 0x68, 0x00,
-  0xa2, 0x2c, 0x14, 0x45, 0x80, 0x00,
-  0x18, 0x0c, 0xe3, 0x01, 0x9c, 0x00
-};
-
-const uint8_t kMaskRandom39_1[6] = {
-  0xff, 0xff, 0xff, 0xff, 0xfe, 0x00
-};
-
-const uint8_t kMaskRandom39_10[60] = {
-  0x8c, 0xe3, 0x09, 0x82, 0x60, 0x00,
-  0x27, 0x11, 0xca, 0x22, 0x88, 0x00,
-  0x32, 0x8d, 0x34, 0x0d, 0x02, 0x00,
-  0x61, 0x92, 0x60, 0x98, 0x26, 0x00,
-  0x5c, 0x38, 0x80, 0x70, 0x1c, 0x00,
-  0xcc, 0x75, 0x10, 0xc4, 0x30, 0x00,
-  0x2b, 0x19, 0xc5, 0x21, 0x48, 0x00,
-  0x32, 0xd2, 0x68, 0x4a, 0x12, 0x00,
-  0x25, 0x8e, 0xb3, 0x04, 0xc0, 0x00,
-  0x50, 0x88, 0xc6, 0x11, 0x84, 0x00
-};
-
-const uint8_t kMaskRandom39_11[66] = {
-  0x8c, 0xe3, 0x18, 0xc6, 0x30, 0x00,
-  0x27, 0x11, 0xc4, 0x71, 0x1c, 0x00,
-  0x32, 0x8d, 0x23, 0x48, 0xd2, 0x00,
-  0x61, 0x92, 0x64, 0x99, 0x26, 0x00,
-  0x5c, 0x38, 0x8e, 0x23, 0x88, 0x00,
-  0x84, 0x87, 0x01, 0xc0, 0x70, 0x00,
-  0x27, 0x19, 0x86, 0x61, 0x98, 0x00,
-  0x51, 0x88, 0x62, 0x18, 0x86, 0x00,
-  0x1a, 0x22, 0xa8, 0xaa, 0x2a, 0x00,
-  0x68, 0x44, 0x51, 0x14, 0x44, 0x00,
-  0x89, 0x70, 0x1c, 0x07, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom39_12[72] = {
-  0x84, 0x87, 0x01, 0xc0, 0x70, 0x00,
-  0x27, 0x19, 0x86, 0x61, 0x98, 0x00,
-  0x51, 0x88, 0x62, 0x18, 0x86, 0x00,
-  0x1a, 0x22, 0xa8, 0xaa, 0x2a, 0x00,
-  0x68, 0x44, 0x51, 0x14, 0x44, 0x00,
-  0x89, 0x70, 0x1c, 0x07, 0x00, 0x00,
-  0x8c, 0xe3, 0x18, 0xc6, 0x30, 0x00,
-  0x27, 0x11, 0xc4, 0x71, 0x1c, 0x00,
-  0x32, 0x8d, 0x23, 0x48, 0xd2, 0x00,
-  0x61, 0x92, 0x64, 0x99, 0x26, 0x00,
-  0x5c, 0x38, 0x8e, 0x23, 0x88, 0x00,
-  0x90, 0xc8, 0x9e, 0xbb, 0x88, 0x00
-};
-
-const uint8_t kMaskRandom39_13[78] = {
-  0x84, 0x87, 0x01, 0xc0, 0x70, 0x00,
-  0x27, 0x19, 0x86, 0x61, 0x98, 0x00,
-  0x51, 0x88, 0x62, 0x18, 0x86, 0x00,
-  0x1a, 0x22, 0xa8, 0xaa, 0x2a, 0x00,
-  0x68, 0x44, 0x51, 0x14, 0x44, 0x00,
-  0x89, 0x70, 0x1c, 0x07, 0x00, 0x00,
-  0x8c, 0x23, 0x08, 0xc2, 0x30, 0x00,
-  0x47, 0x19, 0x86, 0x61, 0x98, 0x00,
-  0x81, 0x88, 0x62, 0x18, 0x86, 0x00,
-  0x12, 0x86, 0x21, 0x88, 0x62, 0x00,
-  0x58, 0x14, 0x45, 0x11, 0x44, 0x00,
-  0x28, 0xca, 0x12, 0x84, 0xa0, 0x00,
-  0x34, 0x60, 0x98, 0x26, 0x08, 0x00
-};
-
-const uint8_t kMaskRandom39_14[84] = {
-  0x8c, 0x23, 0x08, 0xc2, 0x30, 0x00,
-  0x47, 0x19, 0x86, 0x61, 0x98, 0x00,
-  0x81, 0x88, 0x62, 0x18, 0x86, 0x00,
-  0x12, 0x86, 0x21, 0x88, 0x62, 0x00,
-  0x58, 0x14, 0x45, 0x11, 0x44, 0x00,
-  0x28, 0xca, 0x12, 0x84, 0xa0, 0x00,
-  0x34, 0x60, 0x98, 0x26, 0x08, 0x00,
-  0x84, 0x87, 0x01, 0xc0, 0x70, 0x00,
-  0x27, 0x19, 0x86, 0x61, 0x98, 0x00,
-  0x51, 0x88, 0x62, 0x18, 0x86, 0x00,
-  0x1a, 0x22, 0xa8, 0xaa, 0x2a, 0x00,
-  0x68, 0x44, 0x51, 0x14, 0x44, 0x00,
-  0x89, 0x70, 0x1c, 0x07, 0x00, 0x00,
-  0x6e, 0x27, 0x6a, 0xc7, 0xc4, 0x00
-};
-
-const uint8_t kMaskRandom39_15[90] = {
-  0x8c, 0x23, 0x08, 0xc2, 0x30, 0x00,
-  0x47, 0x19, 0x86, 0x61, 0x98, 0x00,
-  0x81, 0x88, 0x62, 0x18, 0x86, 0x00,
-  0x12, 0x86, 0x21, 0x88, 0x62, 0x00,
-  0x58, 0x14, 0x45, 0x11, 0x44, 0x00,
-  0x28, 0xca, 0x12, 0x84, 0xa0, 0x00,
-  0x34, 0x60, 0x98, 0x26, 0x08, 0x00,
-  0x2c, 0x16, 0x05, 0x81, 0x60, 0x00,
-  0x91, 0x40, 0xd0, 0x34, 0x0c, 0x00,
-  0xc0, 0xd0, 0x34, 0x0d, 0x02, 0x00,
-  0x06, 0x82, 0xa0, 0xa8, 0x2a, 0x00,
-  0xc8, 0x0c, 0x43, 0x10, 0xc4, 0x00,
-  0x45, 0x61, 0x18, 0x46, 0x10, 0x00,
-  0x30, 0x91, 0x44, 0x51, 0x14, 0x00,
-  0xa2, 0x28, 0x2a, 0x0a, 0x82, 0x00
-};
-
-const uint8_t kMaskRandom39_16[96] = {
-  0x2c, 0x16, 0x05, 0x81, 0x60, 0x00,
-  0x91, 0x40, 0xd0, 0x34, 0x0c, 0x00,
-  0xc0, 0xd0, 0x34, 0x0d, 0x02, 0x00,
-  0x06, 0x82, 0xa0, 0xa8, 0x2a, 0x00,
-  0xc8, 0x0c, 0x43, 0x10, 0xc4, 0x00,
-  0x45, 0x61, 0x18, 0x46, 0x10, 0x00,
-  0x30, 0x91, 0x44, 0x51, 0x14, 0x00,
-  0xa2, 0x28, 0x2a, 0x0a, 0x82, 0x00,
-  0x8c, 0x23, 0x08, 0xc2, 0x30, 0x00,
-  0x47, 0x19, 0x86, 0x61, 0x98, 0x00,
-  0x81, 0x88, 0x62, 0x18, 0x86, 0x00,
-  0x12, 0x86, 0x21, 0x88, 0x62, 0x00,
-  0x58, 0x14, 0x45, 0x11, 0x44, 0x00,
-  0x28, 0xca, 0x12, 0x84, 0xa0, 0x00,
-  0x34, 0x60, 0x98, 0x26, 0x08, 0x00,
-  0x7e, 0x75, 0xe5, 0x03, 0x8c, 0x00
-};
-
-const uint8_t kMaskRandom39_17[102] = {
-  0x2c, 0x16, 0x05, 0x81, 0x60, 0x00,
-  0x91, 0x40, 0xd0, 0x34, 0x0c, 0x00,
-  0xc0, 0xd0, 0x34, 0x0d, 0x02, 0x00,
-  0x06, 0x82, 0xa0, 0xa8, 0x2a, 0x00,
-  0xc8, 0x0c, 0x43, 0x10, 0xc4, 0x00,
-  0x45, 0x61, 0x18, 0x46, 0x10, 0x00,
-  0x30, 0x91, 0x44, 0x51, 0x14, 0x00,
-  0xa2, 0x28, 0x2a, 0x0a, 0x82, 0x00,
-  0x4c, 0x27, 0x09, 0xc2, 0x70, 0x00,
-  0x66, 0x71, 0x9c, 0x67, 0x18, 0x00,
-  0x91, 0x40, 0xf0, 0x3c, 0x0e, 0x00,
-  0x42, 0x90, 0xa4, 0x29, 0x0a, 0x00,
-  0xa4, 0x29, 0x4a, 0x52, 0x94, 0x00,
-  0x13, 0x5a, 0x16, 0x85, 0xa0, 0x00,
-  0x30, 0x93, 0x44, 0xd1, 0x34, 0x00,
-  0x88, 0xac, 0x2b, 0x0a, 0xc2, 0x00,
-  0x09, 0x0c, 0xc3, 0x30, 0xcc, 0x00
-};
-
-const uint8_t kMaskRandom39_18[108] = {
-  0x4c, 0x27, 0x09, 0xc2, 0x70, 0x00,
-  0x66, 0x71, 0x9c, 0x67, 0x18, 0x00,
-  0x91, 0x40, 0xf0, 0x3c, 0x0e, 0x00,
-  0x42, 0x90, 0xa4, 0x29, 0x0a, 0x00,
-  0xa4, 0x29, 0x4a, 0x52, 0x94, 0x00,
-  0x13, 0x5a, 0x16, 0x85, 0xa0, 0x00,
-  0x30, 0x93, 0x44, 0xd1, 0x34, 0x00,
-  0x88, 0xac, 0x2b, 0x0a, 0xc2, 0x00,
-  0x09, 0x0c, 0xc3, 0x30, 0xcc, 0x00,
-  0x2c, 0x16, 0x05, 0x81, 0x60, 0x00,
-  0x91, 0x40, 0xd0, 0x34, 0x0c, 0x00,
-  0xc0, 0xd0, 0x34, 0x0d, 0x02, 0x00,
-  0x06, 0x82, 0xa0, 0xa8, 0x2a, 0x00,
-  0xc8, 0x0c, 0x43, 0x10, 0xc4, 0x00,
-  0x45, 0x61, 0x18, 0x46, 0x10, 0x00,
-  0x30, 0x91, 0x44, 0x51, 0x14, 0x00,
-  0xa2, 0x28, 0x2a, 0x0a, 0x82, 0x00,
-  0x51, 0x97, 0x24, 0x2f, 0x7e, 0x00
-};
-
-const uint8_t kMaskRandom39_19[114] = {
-  0x4c, 0x27, 0x09, 0xc2, 0x70, 0x00,
-  0x66, 0x71, 0x9c, 0x67, 0x18, 0x00,
-  0x91, 0x40, 0xf0, 0x3c, 0x0e, 0x00,
-  0x42, 0x90, 0xa4, 0x29, 0x0a, 0x00,
-  0xa4, 0x29, 0x4a, 0x52, 0x94, 0x00,
-  0x13, 0x5a, 0x16, 0x85, 0xa0, 0x00,
-  0x30, 0x93, 0x44, 0xd1, 0x34, 0x00,
-  0x88, 0xac, 0x2b, 0x0a, 0xc2, 0x00,
-  0x09, 0x0c, 0xc3, 0x30, 0xcc, 0x00,
-  0x4c, 0x26, 0x09, 0x82, 0x60, 0x00,
-  0x66, 0x28, 0x8a, 0x22, 0x88, 0x00,
-  0x91, 0x50, 0x34, 0x0d, 0x02, 0x00,
-  0x42, 0x82, 0x60, 0x98, 0x26, 0x00,
-  0xa4, 0x01, 0xc0, 0x70, 0x1c, 0x00,
-  0x13, 0x43, 0x10, 0xc4, 0x30, 0x00,
-  0x30, 0x94, 0x85, 0x21, 0x48, 0x00,
-  0x88, 0xa1, 0x28, 0x4a, 0x12, 0x00,
-  0x09, 0x4c, 0x13, 0x04, 0xc0, 0x00,
-  0xcd, 0x98, 0x46, 0x11, 0x84, 0x00
-};
-
-const uint8_t kMaskRandom39_2[12] = {
-  0xce, 0x77, 0x1d, 0xc7, 0x70, 0x00,
-  0x39, 0xcc, 0xf3, 0x3c, 0xce, 0x00
-};
-
-const uint8_t kMaskRandom39_20[120] = {
-  0x8c, 0xe3, 0x09, 0x82, 0x60, 0x00,
-  0x27, 0x11, 0xca, 0x22, 0x88, 0x00,
-  0x32, 0x8d, 0x34, 0x0d, 0x02, 0x00,
-  0x61, 0x92, 0x60, 0x98, 0x26, 0x00,
-  0x5c, 0x38, 0x80, 0x70, 0x1c, 0x00,
-  0xcc, 0x75, 0x10, 0xc4, 0x30, 0x00,
-  0x2b, 0x19, 0xc5, 0x21, 0x48, 0x00,
-  0x32, 0xd2, 0x68, 0x4a, 0x12, 0x00,
-  0x25, 0x8e, 0xb3, 0x04, 0xc0, 0x00,
-  0x50, 0x88, 0xc6, 0x11, 0x84, 0x00,
-  0x44, 0xa7, 0x09, 0xc2, 0x70, 0x00,
-  0x66, 0x70, 0x8c, 0x47, 0x18, 0x00,
-  0x12, 0xc0, 0xf0, 0x3c, 0x0e, 0x00,
-  0xc3, 0x10, 0xbc, 0x29, 0x0a, 0x00,
-  0x8c, 0x29, 0x42, 0x72, 0x94, 0x00,
-  0x11, 0x5b, 0x16, 0x85, 0xa0, 0x00,
-  0x21, 0x93, 0x44, 0xd1, 0x34, 0x00,
-  0xa2, 0x2c, 0x0b, 0x0a, 0xc2, 0x00,
-  0x18, 0x0c, 0xe9, 0x30, 0xca, 0x00,
-  0x0d, 0xba, 0x52, 0x38, 0xbc, 0x00
-};
-
-const uint8_t kMaskRandom39_21[126] = {
-  0x8c, 0xe3, 0x09, 0x82, 0x60, 0x00,
-  0x27, 0x11, 0xca, 0x22, 0x88, 0x00,
-  0x32, 0x8d, 0x34, 0x0d, 0x02, 0x00,
-  0x61, 0x92, 0x60, 0x98, 0x26, 0x00,
-  0x5c, 0x38, 0x80, 0x70, 0x1c, 0x00,
-  0xcc, 0x75, 0x10, 0xc4, 0x30, 0x00,
-  0x2b, 0x19, 0xc5, 0x21, 0x48, 0x00,
-  0x32, 0xd2, 0x68, 0x4a, 0x12, 0x00,
-  0x25, 0x8e, 0xb3, 0x04, 0xc0, 0x00,
-  0x50, 0x88, 0xc6, 0x11, 0x84, 0x00,
-  0x8c, 0xe3, 0x18, 0xc6, 0x30, 0x00,
-  0x27, 0x11, 0xc4, 0x71, 0x1c, 0x00,
-  0x32, 0x8d, 0x23, 0x48, 0xd2, 0x00,
-  0x61, 0x92, 0x64, 0x99, 0x26, 0x00,
-  0x5c, 0x38, 0x8e, 0x23, 0x88, 0x00,
-  0x84, 0x87, 0x01, 0xc0, 0x70, 0x00,
-  0x27, 0x19, 0x86, 0x61, 0x98, 0x00,
-  0x51, 0x88, 0x62, 0x18, 0x86, 0x00,
-  0x1a, 0x22, 0xa8, 0xaa, 0x2a, 0x00,
-  0x68, 0x44, 0x51, 0x14, 0x44, 0x00,
-  0x89, 0x70, 0x1c, 0x07, 0x00, 0x00
-};
-
-const uint8_t kMaskRandom39_22[132] = {
-  0x8c, 0xe3, 0x18, 0xc6, 0x30, 0x00,
-  0x27, 0x11, 0xc4, 0x71, 0x1c, 0x00,
-  0x32, 0x8d, 0x23, 0x48, 0xd2, 0x00,
-  0x61, 0x92, 0x64, 0x99, 0x26, 0x00,
-  0x5c, 0x38, 0x8e, 0x23, 0x88, 0x00,
-  0x84, 0x87, 0x01, 0xc0, 0x70, 0x00,
-  0x27, 0x19, 0x86, 0x61, 0x98, 0x00,
-  0x51, 0x88, 0x62, 0x18, 0x86, 0x00,
-  0x1a, 0x22, 0xa8, 0xaa, 0x2a, 0x00,
-  0x68, 0x44, 0x51, 0x14, 0x44, 0x00,
-  0x89, 0x70, 0x1c, 0x07, 0x00, 0x00,
-  0x8c, 0xe3, 0x09, 0x82, 0x60, 0x00,
-  0x27, 0x11, 0xca, 0x22, 0x88, 0x00,
-  0x32, 0x8d, 0x34, 0x0d, 0x02, 0x00,
-  0x61, 0x92, 0x60, 0x98, 0x26, 0x00,
-  0x5c, 0x38, 0x80, 0x70, 0x1c, 0x00,
-  0xcc, 0x75, 0x10, 0xc4, 0x30, 0x00,
-  0x2b, 0x19, 0xc5, 0x21, 0x48, 0x00,
-  0x32, 0xd2, 0x68, 0x4a, 0x12, 0x00,
-  0x25, 0x8e, 0xb3, 0x04, 0xc0, 0x00,
-  0x50, 0x88, 0xc6, 0x11, 0x84, 0x00,
-  0xfc, 0x5a, 0xb2, 0x13, 0x12, 0x00
-};
-
-const uint8_t kMaskRandom39_23[138] = {
-  0x8c, 0xe3, 0x18, 0xc6, 0x30, 0x00,
-  0x27, 0x11, 0xc4, 0x71, 0x1c, 0x00,
-  0x32, 0x8d, 0x23, 0x48, 0xd2, 0x00,
-  0x61, 0x92, 0x64, 0x99, 0x26, 0x00,
-  0x5c, 0x38, 0x8e, 0x23, 0x88, 0x00,
-  0x84, 0x87, 0x01, 0xc0, 0x70, 0x00,
-  0x27, 0x19, 0x86, 0x61, 0x98, 0x00,
-  0x51, 0x88, 0x62, 0x18, 0x86, 0x00,
-  0x1a, 0x22, 0xa8, 0xaa, 0x2a, 0x00,
-  0x68, 0x44, 0x51, 0x14, 0x44, 0x00,
-  0x89, 0x70, 0x1c, 0x07, 0x00, 0x00,
-  0x84, 0x87, 0x01, 0xc0, 0x70, 0x00,
-  0x27, 0x19, 0x86, 0x61, 0x98, 0x00,
-  0x51, 0x88, 0x62, 0x18, 0x86, 0x00,
-  0x1a, 0x22, 0xa8, 0xaa, 0x2a, 0x00,
-  0x68, 0x44, 0x51, 0x14, 0x44, 0x00,
-  0x89, 0x70, 0x1c, 0x07, 0x00, 0x00,
-  0x8c, 0xe3, 0x18, 0xc6, 0x30, 0x00,
-  0x27, 0x11, 0xc4, 0x71, 0x1c, 0x00,
-  0x32, 0x8d, 0x23, 0x48, 0xd2, 0x00,
-  0x61, 0x92, 0x64, 0x99, 0x26, 0x00,
-  0x5c, 0x38, 0x8e, 0x23, 0x88, 0x00,
-  0x90, 0xc8, 0x9e, 0xbb, 0x88, 0x00
-};
-
-const uint8_t kMaskRandom39_24[144] = {
-  0x84, 0x87, 0x01, 0xc0, 0x70, 0x00,
-  0x27, 0x19, 0x86, 0x61, 0x98, 0x00,
-  0x51, 0x88, 0x62, 0x18, 0x86, 0x00,
-  0x1a, 0x22, 0xa8, 0xaa, 0x2a, 0x00,
-  0x68, 0x44, 0x51, 0x14, 0x44, 0x00,
-  0x89, 0x70, 0x1c, 0x07, 0x00, 0x00,
-  0x8c, 0xe3, 0x18, 0xc6, 0x30, 0x00,
-  0x27, 0x11, 0xc4, 0x71, 0x1c, 0x00,
-  0x32, 0x8d, 0x23, 0x48, 0xd2, 0x00,
-  0x61, 0x92, 0x64, 0x99, 0x26, 0x00,
-  0x5c, 0x38, 0x8e, 0x23, 0x88, 0x00,
-  0x90, 0xc8, 0x9e, 0xbb, 0x88, 0x00,
-  0x8c, 0xe3, 0x18, 0xc6, 0x30, 0x00,
-  0x27, 0x11, 0xc4, 0x71, 0x1c, 0x00,
-  0x32, 0x8d, 0x23, 0x48, 0xd2, 0x00,
-  0x61, 0x92, 0x64, 0x99, 0x26, 0x00,
-  0x5c, 0x38, 0x8e, 0x23, 0x88, 0x00,
-  0x84, 0x87, 0x01, 0xc0, 0x70, 0x00,
-  0x27, 0x19, 0x86, 0x61, 0x98, 0x00,
-  0x51, 0x88, 0x62, 0x18, 0x86, 0x00,
-  0x1a, 0x22, 0xa8, 0xaa, 0x2a, 0x00,
-  0x68, 0x44, 0x51, 0x14, 0x44, 0x00,
-  0x89, 0x70, 0x1c, 0x07, 0x00, 0x00,
-  0xac, 0xbc, 0xf0, 0xff, 0x62, 0x00
-};
-
-const uint8_t kMaskRandom39_25[150] = {
-  0x84, 0x87, 0x01, 0xc0, 0x70, 0x00,
-  0x27, 0x19, 0x86, 0x61, 0x98, 0x00,
-  0x51, 0x88, 0x62, 0x18, 0x86, 0x00,
-  0x1a, 0x22, 0xa8, 0xaa, 0x2a, 0x00,
-  0x68, 0x44, 0x51, 0x14, 0x44, 0x00,
-  0x89, 0x70, 0x1c, 0x07, 0x00, 0x00,
-  0x8c, 0xe3, 0x18, 0xc6, 0x30, 0x00,
-  0x27, 0x11, 0xc4, 0x71, 0x1c, 0x00,
-  0x32, 0x8d, 0x23, 0x48, 0xd2, 0x00,
-  0x61, 0x92, 0x64, 0x99, 0x26, 0x00,
-  0x5c, 0x38, 0x8e, 0x23, 0x88, 0x00,
-  0x90, 0xc8, 0x9e, 0xbb, 0x88, 0x00,
-  0x84, 0x87, 0x01, 0xc0, 0x70, 0x00,
-  0x27, 0x19, 0x86, 0x61, 0x98, 0x00,
-  0x51, 0x88, 0x62, 0x18, 0x86, 0x00,
-  0x1a, 0x22, 0xa8, 0xaa, 0x2a, 0x00,
-  0x68, 0x44, 0x51, 0x14, 0x44, 0x00,
-  0x89, 0x70, 0x1c, 0x07, 0x00, 0x00,
-  0x8c, 0x23, 0x08, 0xc2, 0x30, 0x00,
-  0x47, 0x19, 0x86, 0x61, 0x98, 0x00,
-  0x81, 0x88, 0x62, 0x18, 0x86, 0x00,
-  0x12, 0x86, 0x21, 0x88, 0x62, 0x00,
-  0x58, 0x14, 0x45, 0x11, 0x44, 0x00,
-  0x28, 0xca, 0x12, 0x84, 0xa0, 0x00,
-  0x34, 0x60, 0x98, 0x26, 0x08, 0x00
-};
-
-const uint8_t kMaskRandom39_26[156] = {
-  0x84, 0x87, 0x01, 0xc0, 0x70, 0x00,
-  0x27, 0x19, 0x86, 0x61, 0x98, 0x00,
-  0x51, 0x88, 0x62, 0x18, 0x86, 0x00,
-  0x1a, 0x22, 0xa8, 0xaa, 0x2a, 0x00,
-  0x68, 0x44, 0x51, 0x14, 0x44, 0x00,
-  0x89, 0x70, 0x1c, 0x07, 0x00, 0x00,
-  0x8c, 0x23, 0x08, 0xc2, 0x30, 0x00,
-  0x47, 0x19, 0x86, 0x61, 0x98, 0x00,
-  0x81, 0x88, 0x62, 0x18, 0x86, 0x00,
-  0x12, 0x86, 0x21, 0x88, 0x62, 0x00,
-  0x58, 0x14, 0x45, 0x11, 0x44, 0x00,
-  0x28, 0xca, 0x12, 0x84, 0xa0, 0x00,
-  0x34, 0x60, 0x98, 0x26, 0x08, 0x00,
-  0x84, 0x87, 0x01, 0xc0, 0x70, 0x00,
-  0x27, 0x19, 0x86, 0x61, 0x98, 0x00,
-  0x51, 0x88, 0x62, 0x18, 0x86, 0x00,
-  0x1a, 0x22, 0xa8, 0xaa, 0x2a, 0x00,
-  0x68, 0x44, 0x51, 0x14, 0x44, 0x00,
-  0x89, 0x70, 0x1c, 0x07, 0x00, 0x00,
-  0x8c, 0xe3, 0x18, 0xc6, 0x30, 0x00,
-  0x27, 0x11, 0xc4, 0x71, 0x1c, 0x00,
-  0x32, 0x8d, 0x23, 0x48, 0xd2, 0x00,
-  0x61, 0x92, 0x64, 0x99, 0x26, 0x00,
-  0x5c, 0x38, 0x8e, 0x23, 0x88, 0x00,
-  0x90, 0xc8, 0x9e, 0xbb, 0x88, 0x00,
-  0x10, 0x17, 0x44, 0x72, 0xec, 0x00
-};
-
-const uint8_t kMaskRandom39_27[162] = {
-  0x84, 0x87, 0x01, 0xc0, 0x70, 0x00,
-  0x27, 0x19, 0x86, 0x61, 0x98, 0x00,
-  0x51, 0x88, 0x62, 0x18, 0x86, 0x00,
-  0x1a, 0x22, 0xa8, 0xaa, 0x2a, 0x00,
-  0x68, 0x44, 0x51, 0x14, 0x44, 0x00,
-  0x89, 0x70, 0x1c, 0x07, 0x00, 0x00,
-  0x8c, 0x23, 0x08, 0xc2, 0x30, 0x00,
-  0x47, 0x19, 0x86, 0x61, 0x98, 0x00,
-  0x81, 0x88, 0x62, 0x18, 0x86, 0x00,
-  0x12, 0x86, 0x21, 0x88, 0x62, 0x00,
-  0x58, 0x14, 0x45, 0x11, 0x44, 0x00,
-  0x28, 0xca, 0x12, 0x84, 0xa0, 0x00,
-  0x34, 0x60, 0x98, 0x26, 0x08, 0x00,
-  0x8c, 0x23, 0x08, 0xc2, 0x30, 0x00,
-  0x47, 0x19, 0x86, 0x61, 0x98, 0x00,
-  0x81, 0x88, 0x62, 0x18, 0x86, 0x00,
-  0x12, 0x86, 0x21, 0x88, 0x62, 0x00,
-  0x58, 0x14, 0x45, 0x11, 0x44, 0x00,
-  0x28, 0xca, 0x12, 0x84, 0xa0, 0x00,
-  0x34, 0x60, 0x98, 0x26, 0x08, 0x00,
-  0x84, 0x87, 0x01, 0xc0, 0x70, 0x00,
-  0x27, 0x19, 0x86, 0x61, 0x98, 0x00,
-  0x51, 0x88, 0x62, 0x18, 0x86, 0x00,
-  0x1a, 0x22, 0xa8, 0xaa, 0x2a, 0x00,
-  0x68, 0x44, 0x51, 0x14, 0x44, 0x00,
-  0x89, 0x70, 0x1c, 0x07, 0x00, 0x00,
-  0x6e, 0x27, 0x6a, 0xc7, 0xc4, 0x00
-};
-
-const uint8_t kMaskRandom39_28[168] = {
-  0x8c, 0x23, 0x08, 0xc2, 0x30, 0x00,
-  0x47, 0x19, 0x86, 0x61, 0x98, 0x00,
-  0x81, 0x88, 0x62, 0x18, 0x86, 0x00,
-  0x12, 0x86, 0x21, 0x88, 0x62, 0x00,
-  0x58, 0x14, 0x45, 0x11, 0x44, 0x00,
-  0x28, 0xca, 0x12, 0x84, 0xa0, 0x00,
-  0x34, 0x60, 0x98, 0x26, 0x08, 0x00,
-  0x84, 0x87, 0x01, 0xc0, 0x70, 0x00,
-  0x27, 0x19, 0x86, 0x61, 0x98, 0x00,
-  0x51, 0x88, 0x62, 0x18, 0x86, 0x00,
-  0x1a, 0x22, 0xa8, 0xaa, 0x2a, 0x00,
-  0x68, 0x44, 0x51, 0x14, 0x44, 0x00,
-  0x89, 0x70, 0x1c, 0x07, 0x00, 0x00,
-  0x6e, 0x27, 0x6a, 0xc7, 0xc4, 0x00,
-  0x84, 0x87, 0x01, 0xc0, 0x70, 0x00,
-  0x27, 0x19, 0x86, 0x61, 0x98, 0x00,
-  0x51, 0x88, 0x62, 0x18, 0x86, 0x00,
-  0x1a, 0x22, 0xa8, 0xaa, 0x2a, 0x00,
-  0x68, 0x44, 0x51, 0x14, 0x44, 0x00,
-  0x89, 0x70, 0x1c, 0x07, 0x00, 0x00,
-  0x8c, 0x23, 0x08, 0xc2, 0x30, 0x00,
-  0x47, 0x19, 0x86, 0x61, 0x98, 0x00,
-  0x81, 0x88, 0x62, 0x18, 0x86, 0x00,
-  0x12, 0x86, 0x21, 0x88, 0x62, 0x00,
-  0x58, 0x14, 0x45, 0x11, 0x44, 0x00,
-  0x28, 0xca, 0x12, 0x84, 0xa0, 0x00,
-  0x34, 0x60, 0x98, 0x26, 0x08, 0x00,
-  0x86, 0xb6, 0x04, 0xbc, 0x1e, 0x00
-};
-
-const uint8_t kMaskRandom39_29[174] = {
-  0x8c, 0x23, 0x08, 0xc2, 0x30, 0x00,
-  0x47, 0x19, 0x86, 0x61, 0x98, 0x00,
-  0x81, 0x88, 0x62, 0x18, 0x86, 0x00,
-  0x12, 0x86, 0x21, 0x88, 0x62, 0x00,
-  0x58, 0x14, 0x45, 0x11, 0x44, 0x00,
-  0x28, 0xca, 0x12, 0x84, 0xa0, 0x00,
-  0x34, 0x60, 0x98, 0x26, 0x08, 0x00,
-  0x84, 0x87, 0x01, 0xc0, 0x70, 0x00,
-  0x27, 0x19, 0x86, 0x61, 0x98, 0x00,
-  0x51, 0x88, 0x62, 0x18, 0x86, 0x00,
-  0x1a, 0x22, 0xa8, 0xaa, 0x2a, 0x00,
-  0x68, 0x44, 0x51, 0x14, 0x44, 0x00,
-  0x89, 0x70, 0x1c, 0x07, 0x00, 0x00,
-  0x6e, 0x27, 0x6a, 0xc7, 0xc4, 0x00,
-  0x8c, 0x23, 0x08, 0xc2, 0x30, 0x00,
-  0x47, 0x19, 0x86, 0x61, 0x98, 0x00,
-  0x81, 0x88, 0x62, 0x18, 0x86, 0x00,
-  0x12, 0x86, 0x21, 0x88, 0x62, 0x00,
-  0x58, 0x14, 0x45, 0x11, 0x44, 0x00,
-  0x28, 0xca, 0x12, 0x84, 0xa0, 0x00,
-  0x34, 0x60, 0x98, 0x26, 0x08, 0x00,
-  0x2c, 0x16, 0x05, 0x81, 0x60, 0x00,
-  0x91, 0x40, 0xd0, 0x34, 0x0c, 0x00,
-  0xc0, 0xd0, 0x34, 0x0d, 0x02, 0x00,
-  0x06, 0x82, 0xa0, 0xa8, 0x2a, 0x00,
-  0xc8, 0x0c, 0x43, 0x10, 0xc4, 0x00,
-  0x45, 0x61, 0x18, 0x46, 0x10, 0x00,
-  0x30, 0x91, 0x44, 0x51, 0x14, 0x00,
-  0xa2, 0x28, 0x2a, 0x0a, 0x82, 0x00
-};
-
-const uint8_t kMaskRandom39_3[18] = {
-  0xcc, 0x67, 0x19, 0xc6, 0x70, 0x00,
-  0x27, 0x2c, 0xca, 0xb2, 0xac, 0x00,
-  0x92, 0xd2, 0x76, 0x2d, 0x46, 0x00
-};
-
-const uint8_t kMaskRandom39_30[180] = {
-  0x8c, 0x23, 0x08, 0xc2, 0x30, 0x00,
-  0x47, 0x19, 0x86, 0x61, 0x98, 0x00,
-  0x81, 0x88, 0x62, 0x18, 0x86, 0x00,
-  0x12, 0x86, 0x21, 0x88, 0x62, 0x00,
-  0x58, 0x14, 0x45, 0x11, 0x44, 0x00,
-  0x28, 0xca, 0x12, 0x84, 0xa0, 0x00,
-  0x34, 0x60, 0x98, 0x26, 0x08, 0x00,
-  0x2c, 0x16, 0x05, 0x81, 0x60, 0x00,
-  0x91, 0x40, 0xd0, 0x34, 0x0c, 0x00,
-  0xc0, 0xd0, 0x34, 0x0d, 0x02, 0x00,
-  0x06, 0x82, 0xa0, 0xa8, 0x2a, 0x00,
-  0xc8, 0x0c, 0x43, 0x10, 0xc4, 0x00,
-  0x45, 0x61, 0x18, 0x46, 0x10, 0x00,
-  0x30, 0x91, 0x44, 0x51, 0x14, 0x00,
-  0xa2, 0x28, 0x2a, 0x0a, 0x82, 0x00,
-  0x8c, 0x23, 0x08, 0xc2, 0x30, 0x00,
-  0x47, 0x19, 0x86, 0x61, 0x98, 0x00,
-  0x81, 0x88, 0x62, 0x18, 0x86, 0x00,
-  0x12, 0x86, 0x21, 0x88, 0x62, 0x00,
-  0x58, 0x14, 0x45, 0x11, 0x44, 0x00,
-  0x28, 0xca, 0x12, 0x84, 0xa0, 0x00,
-  0x34, 0x60, 0x98, 0x26, 0x08, 0x00,
-  0x84, 0x87, 0x01, 0xc0, 0x70, 0x00,
-  0x27, 0x19, 0x86, 0x61, 0x98, 0x00,
-  0x51, 0x88, 0x62, 0x18, 0x86, 0x00,
-  0x1a, 0x22, 0xa8, 0xaa, 0x2a, 0x00,
-  0x68, 0x44, 0x51, 0x14, 0x44, 0x00,
-  0x89, 0x70, 0x1c, 0x07, 0x00, 0x00,
-  0x6e, 0x27, 0x6a, 0xc7, 0xc4, 0x00,
-  0xb3, 0x1d, 0x13, 0x03, 0x5a, 0x00
-};
-
-const uint8_t kMaskRandom39_31[186] = {
-  0x8c, 0x23, 0x08, 0xc2, 0x30, 0x00,
-  0x47, 0x19, 0x86, 0x61, 0x98, 0x00,
-  0x81, 0x88, 0x62, 0x18, 0x86, 0x00,
-  0x12, 0x86, 0x21, 0x88, 0x62, 0x00,
-  0x58, 0x14, 0x45, 0x11, 0x44, 0x00,
-  0x28, 0xca, 0x12, 0x84, 0xa0, 0x00,
-  0x34, 0x60, 0x98, 0x26, 0x08, 0x00,
-  0x2c, 0x16, 0x05, 0x81, 0x60, 0x00,
-  0x91, 0x40, 0xd0, 0x34, 0x0c, 0x00,
-  0xc0, 0xd0, 0x34, 0x0d, 0x02, 0x00,
-  0x06, 0x82, 0xa0, 0xa8, 0x2a, 0x00,
-  0xc8, 0x0c, 0x43, 0x10, 0xc4, 0x00,
-  0x45, 0x61, 0x18, 0x46, 0x10, 0x00,
-  0x30, 0x91, 0x44, 0x51, 0x14, 0x00,
-  0xa2, 0x28, 0x2a, 0x0a, 0x82, 0x00,
-  0x2c, 0x16, 0x05, 0x81, 0x60, 0x00,
-  0x91, 0x40, 0xd0, 0x34, 0x0c, 0x00,
-  0xc0, 0xd0, 0x34, 0x0d, 0x02, 0x00,
-  0x06, 0x82, 0xa0, 0xa8, 0x2a, 0x00,
-  0xc8, 0x0c, 0x43, 0x10, 0xc4, 0x00,
-  0x45, 0x61, 0x18, 0x46, 0x10, 0x00,
-  0x30, 0x91, 0x44, 0x51, 0x14, 0x00,
-  0xa2, 0x28, 0x2a, 0x0a, 0x82, 0x00,
-  0x8c, 0x23, 0x08, 0xc2, 0x30, 0x00,
-  0x47, 0x19, 0x86, 0x61, 0x98, 0x00,
-  0x81, 0x88, 0x62, 0x18, 0x86, 0x00,
-  0x12, 0x86, 0x21, 0x88, 0x62, 0x00,
-  0x58, 0x14, 0x45, 0x11, 0x44, 0x00,
-  0x28, 0xca, 0x12, 0x84, 0xa0, 0x00,
-  0x34, 0x60, 0x98, 0x26, 0x08, 0x00,
-  0x7e, 0x75, 0xe5, 0x03, 0x8c, 0x00
-};
-
-const uint8_t kMaskRandom39_32[192] = {
-  0x2c, 0x16, 0x05, 0x81, 0x60, 0x00,
-  0x91, 0x40, 0xd0, 0x34, 0x0c, 0x00,
-  0xc0, 0xd0, 0x34, 0x0d, 0x02, 0x00,
-  0x06, 0x82, 0xa0, 0xa8, 0x2a, 0x00,
-  0xc8, 0x0c, 0x43, 0x10, 0xc4, 0x00,
-  0x45, 0x61, 0x18, 0x46, 0x10, 0x00,
-  0x30, 0x91, 0x44, 0x51, 0x14, 0x00,
-  0xa2, 0x28, 0x2a, 0x0a, 0x82, 0x00,
-  0x8c, 0x23, 0x08, 0xc2, 0x30, 0x00,
-  0x47, 0x19, 0x86, 0x61, 0x98, 0x00,
-  0x81, 0x88, 0x62, 0x18, 0x86, 0x00,
-  0x12, 0x86, 0x21, 0x88, 0x62, 0x00,
-  0x58, 0x14, 0x45, 0x11, 0x44, 0x00,
-  0x28, 0xca, 0x12, 0x84, 0xa0, 0x00,
-  0x34, 0x60, 0x98, 0x26, 0x08, 0x00,
-  0x7e, 0x75, 0xe5, 0x03, 0x8c, 0x00,
-  0x8c, 0x23, 0x08, 0xc2, 0x30, 0x00,
-  0x47, 0x19, 0x86, 0x61, 0x98, 0x00,
-  0x81, 0x88, 0x62, 0x18, 0x86, 0x00,
-  0x12, 0x86, 0x21, 0x88, 0x62, 0x00,
-  0x58, 0x14, 0x45, 0x11, 0x44, 0x00,
-  0x28, 0xca, 0x12, 0x84, 0xa0, 0x00,
-  0x34, 0x60, 0x98, 0x26, 0x08, 0x00,
-  0x2c, 0x16, 0x05, 0x81, 0x60, 0x00,
-  0x91, 0x40, 0xd0, 0x34, 0x0c, 0x00,
-  0xc0, 0xd0, 0x34, 0x0d, 0x02, 0x00,
-  0x06, 0x82, 0xa0, 0xa8, 0x2a, 0x00,
-  0xc8, 0x0c, 0x43, 0x10, 0xc4, 0x00,
-  0x45, 0x61, 0x18, 0x46, 0x10, 0x00,
-  0x30, 0x91, 0x44, 0x51, 0x14, 0x00,
-  0xa2, 0x28, 0x2a, 0x0a, 0x82, 0x00,
-  0x83, 0x1a, 0x3c, 0x2a, 0x7a, 0x00
-};
-
-const uint8_t kMaskRandom39_33[198] = {
-  0x2c, 0x16, 0x05, 0x81, 0x60, 0x00,
-  0x91, 0x40, 0xd0, 0x34, 0x0c, 0x00,
-  0xc0, 0xd0, 0x34, 0x0d, 0x02, 0x00,
-  0x06, 0x82, 0xa0, 0xa8, 0x2a, 0x00,
-  0xc8, 0x0c, 0x43, 0x10, 0xc4, 0x00,
-  0x45, 0x61, 0x18, 0x46, 0x10, 0x00,
-  0x30, 0x91, 0x44, 0x51, 0x14, 0x00,
-  0xa2, 0x28, 0x2a, 0x0a, 0x82, 0x00,
-  0x8c, 0x23, 0x08, 0xc2, 0x30, 0x00,
-  0x47, 0x19, 0x86, 0x61, 0x98, 0x00,
-  0x81, 0x88, 0x62, 0x18, 0x86, 0x00,
-  0x12, 0x86, 0x21, 0x88, 0x62, 0x00,
-  0x58, 0x14, 0x45, 0x11, 0x44, 0x00,
-  0x28, 0xca, 0x12, 0x84, 0xa0, 0x00,
-  0x34, 0x60, 0x98, 0x26, 0x08, 0x00,
-  0x7e, 0x75, 0xe5, 0x03, 0x8c, 0x00,
-  0x2c, 0x16, 0x05, 0x81, 0x60, 0x00,
-  0x91, 0x40, 0xd0, 0x34, 0x0c, 0x00,
-  0xc0, 0xd0, 0x34, 0x0d, 0x02, 0x00,
-  0x06, 0x82, 0xa0, 0xa8, 0x2a, 0x00,
-  0xc8, 0x0c, 0x43, 0x10, 0xc4, 0x00,
-  0x45, 0x61, 0x18, 0x46, 0x10, 0x00,
-  0x30, 0x91, 0x44, 0x51, 0x14, 0x00,
-  0xa2, 0x28, 0x2a, 0x0a, 0x82, 0x00,
-  0x4c, 0x27, 0x09, 0xc2, 0x70, 0x00,
-  0x66, 0x71, 0x9c, 0x67, 0x18, 0x00,
-  0x91, 0x40, 0xf0, 0x3c, 0x0e, 0x00,
-  0x42, 0x90, 0xa4, 0x29, 0x0a, 0x00,
-  0xa4, 0x29, 0x4a, 0x52, 0x94, 0x00,
-  0x13, 0x5a, 0x16, 0x85, 0xa0, 0x00,
-  0x30, 0x93, 0x44, 0xd1, 0x34, 0x00,
-  0x88, 0xac, 0x2b, 0x0a, 0xc2, 0x00,
-  0x09, 0x0c, 0xc3, 0x30, 0xcc, 0x00
-};
-
-const uint8_t kMaskRandom39_34[204] = {
-  0x2c, 0x16, 0x05, 0x81, 0x60, 0x00,
-  0x91, 0x40, 0xd0, 0x34, 0x0c, 0x00,
-  0xc0, 0xd0, 0x34, 0x0d, 0x02, 0x00,
-  0x06, 0x82, 0xa0, 0xa8, 0x2a, 0x00,
-  0xc8, 0x0c, 0x43, 0x10, 0xc4, 0x00,
-  0x45, 0x61, 0x18, 0x46, 0x10, 0x00,
-  0x30, 0x91, 0x44, 0x51, 0x14, 0x00,
-  0xa2, 0x28, 0x2a, 0x0a, 0x82, 0x00,
-  0x4c, 0x27, 0x09, 0xc2, 0x70, 0x00,
-  0x66, 0x71, 0x9c, 0x67, 0x18, 0x00,
-  0x91, 0x40, 0xf0, 0x3c, 0x0e, 0x00,
-  0x42, 0x90, 0xa4, 0x29, 0x0a, 0x00,
-  0xa4, 0x29, 0x4a, 0x52, 0x94, 0x00,
-  0x13, 0x5a, 0x16, 0x85, 0xa0, 0x00,
-  0x30, 0x93, 0x44, 0xd1, 0x34, 0x00,
-  0x88, 0xac, 0x2b, 0x0a, 0xc2, 0x00,
-  0x09, 0x0c, 0xc3, 0x30, 0xcc, 0x00,
-  0x2c, 0x16, 0x05, 0x81, 0x60, 0x00,
-  0x91, 0x40, 0xd0, 0x34, 0x0c, 0x00,
-  0xc0, 0xd0, 0x34, 0x0d, 0x02, 0x00,
-  0x06, 0x82, 0xa0, 0xa8, 0x2a, 0x00,
-  0xc8, 0x0c, 0x43, 0x10, 0xc4, 0x00,
-  0x45, 0x61, 0x18, 0x46, 0x10, 0x00,
-  0x30, 0x91, 0x44, 0x51, 0x14, 0x00,
-  0xa2, 0x28, 0x2a, 0x0a, 0x82, 0x00,
-  0x8c, 0x23, 0x08, 0xc2, 0x30, 0x00,
-  0x47, 0x19, 0x86, 0x61, 0x98, 0x00,
-  0x81, 0x88, 0x62, 0x18, 0x86, 0x00,
-  0x12, 0x86, 0x21, 0x88, 0x62, 0x00,
-  0x58, 0x14, 0x45, 0x11, 0x44, 0x00,
-  0x28, 0xca, 0x12, 0x84, 0xa0, 0x00,
-  0x34, 0x60, 0x98, 0x26, 0x08, 0x00,
-  0x7e, 0x75, 0xe5, 0x03, 0x8c, 0x00,
-  0xc6, 0xbb, 0x7e, 0xd9, 0x80, 0x00
-};
-
-const uint8_t kMaskRandom39_35[210] = {
-  0x2c, 0x16, 0x05, 0x81, 0x60, 0x00,
-  0x91, 0x40, 0xd0, 0x34, 0x0c, 0x00,
-  0xc0, 0xd0, 0x34, 0x0d, 0x02, 0x00,
-  0x06, 0x82, 0xa0, 0xa8, 0x2a, 0x00,
-  0xc8, 0x0c, 0x43, 0x10, 0xc4, 0x00,
-  0x45, 0x61, 0x18, 0x46, 0x10, 0x00,
-  0x30, 0x91, 0x44, 0x51, 0x14, 0x00,
-  0xa2, 0x28, 0x2a, 0x0a, 0x82, 0x00,
-  0x4c, 0x27, 0x09, 0xc2, 0x70, 0x00,
-  0x66, 0x71, 0x9c, 0x67, 0x18, 0x00,
-  0x91, 0x40, 0xf0, 0x3c, 0x0e, 0x00,
-  0x42, 0x90, 0xa4, 0x29, 0x0a, 0x00,
-  0xa4, 0x29, 0x4a, 0x52, 0x94, 0x00,
-  0x13, 0x5a, 0x16, 0x85, 0xa0, 0x00,
-  0x30, 0x93, 0x44, 0xd1, 0x34, 0x00,
-  0x88, 0xac, 0x2b, 0x0a, 0xc2, 0x00,
-  0x09, 0x0c, 0xc3, 0x30, 0xcc, 0x00,
-  0x4c, 0x27, 0x09, 0xc2, 0x70, 0x00,
-  0x66, 0x71, 0x9c, 0x67, 0x18, 0x00,
-  0x91, 0x40, 0xf0, 0x3c, 0x0e, 0x00,
-  0x42, 0x90, 0xa4, 0x29, 0x0a, 0x00,
-  0xa4, 0x29, 0x4a, 0x52, 0x94, 0x00,
-  0x13, 0x5a, 0x16, 0x85, 0xa0, 0x00,
-  0x30, 0x93, 0x44, 0xd1, 0x34, 0x00,
-  0x88, 0xac, 0x2b, 0x0a, 0xc2, 0x00,
-  0x09, 0x0c, 0xc3, 0x30, 0xcc, 0x00,
-  0x2c, 0x16, 0x05, 0x81, 0x60, 0x00,
-  0x91, 0x40, 0xd0, 0x34, 0x0c, 0x00,
-  0xc0, 0xd0, 0x34, 0x0d, 0x02, 0x00,
-  0x06, 0x82, 0xa0, 0xa8, 0x2a, 0x00,
-  0xc8, 0x0c, 0x43, 0x10, 0xc4, 0x00,
-  0x45, 0x61, 0x18, 0x46, 0x10, 0x00,
-  0x30, 0x91, 0x44, 0x51, 0x14, 0x00,
-  0xa2, 0x28, 0x2a, 0x0a, 0x82, 0x00,
-  0x51, 0x97, 0x24, 0x2f, 0x7e, 0x00
-};
-
-const uint8_t kMaskRandom39_36[216] = {
-  0x4c, 0x27, 0x09, 0xc2, 0x70, 0x00,
-  0x66, 0x71, 0x9c, 0x67, 0x18, 0x00,
-  0x91, 0x40, 0xf0, 0x3c, 0x0e, 0x00,
-  0x42, 0x90, 0xa4, 0x29, 0x0a, 0x00,
-  0xa4, 0x29, 0x4a, 0x52, 0x94, 0x00,
-  0x13, 0x5a, 0x16, 0x85, 0xa0, 0x00,
-  0x30, 0x93, 0x44, 0xd1, 0x34, 0x00,
-  0x88, 0xac, 0x2b, 0x0a, 0xc2, 0x00,
-  0x09, 0x0c, 0xc3, 0x30, 0xcc, 0x00,
-  0x2c, 0x16, 0x05, 0x81, 0x60, 0x00,
-  0x91, 0x40, 0xd0, 0x34, 0x0c, 0x00,
-  0xc0, 0xd0, 0x34, 0x0d, 0x02, 0x00,
-  0x06, 0x82, 0xa0, 0xa8, 0x2a, 0x00,
-  0xc8, 0x0c, 0x43, 0x10, 0xc4, 0x00,
-  0x45, 0x61, 0x18, 0x46, 0x10, 0x00,
-  0x30, 0x91, 0x44, 0x51, 0x14, 0x00,
-  0xa2, 0x28, 0x2a, 0x0a, 0x82, 0x00,
-  0x51, 0x97, 0x24, 0x2f, 0x7e, 0x00,
-  0x2c, 0x16, 0x05, 0x81, 0x60, 0x00,
-  0x91, 0x40, 0xd0, 0x34, 0x0c, 0x00,
-  0xc0, 0xd0, 0x34, 0x0d, 0x02, 0x00,
-  0x06, 0x82, 0xa0, 0xa8, 0x2a, 0x00,
-  0xc8, 0x0c, 0x43, 0x10, 0xc4, 0x00,
-  0x45, 0x61, 0x18, 0x46, 0x10, 0x00,
-  0x30, 0x91, 0x44, 0x51, 0x14, 0x00,
-  0xa2, 0x28, 0x2a, 0x0a, 0x82, 0x00,
-  0x4c, 0x27, 0x09, 0xc2, 0x70, 0x00,
-  0x66, 0x71, 0x9c, 0x67, 0x18, 0x00,
-  0x91, 0x40, 0xf0, 0x3c, 0x0e, 0x00,
-  0x42, 0x90, 0xa4, 0x29, 0x0a, 0x00,
-  0xa4, 0x29, 0x4a, 0x52, 0x94, 0x00,
-  0x13, 0x5a, 0x16, 0x85, 0xa0, 0x00,
-  0x30, 0x93, 0x44, 0xd1, 0x34, 0x00,
-  0x88, 0xac, 0x2b, 0x0a, 0xc2, 0x00,
-  0x09, 0x0c, 0xc3, 0x30, 0xcc, 0x00,
-  0x11, 0x78, 0xfe, 0x43, 0xd6, 0x00
-};
-
-const uint8_t kMaskRandom39_37[222] = {
-  0x4c, 0x27, 0x09, 0xc2, 0x70, 0x00,
-  0x66, 0x71, 0x9c, 0x67, 0x18, 0x00,
-  0x91, 0x40, 0xf0, 0x3c, 0x0e, 0x00,
-  0x42, 0x90, 0xa4, 0x29, 0x0a, 0x00,
-  0xa4, 0x29, 0x4a, 0x52, 0x94, 0x00,
-  0x13, 0x5a, 0x16, 0x85, 0xa0, 0x00,
-  0x30, 0x93, 0x44, 0xd1, 0x34, 0x00,
-  0x88, 0xac, 0x2b, 0x0a, 0xc2, 0x00,
-  0x09, 0x0c, 0xc3, 0x30, 0xcc, 0x00,
-  0x2c, 0x16, 0x05, 0x81, 0x60, 0x00,
-  0x91, 0x40, 0xd0, 0x34, 0x0c, 0x00,
-  0xc0, 0xd0, 0x34, 0x0d, 0x02, 0x00,
-  0x06, 0x82, 0xa0, 0xa8, 0x2a, 0x00,
-  0xc8, 0x0c, 0x43, 0x10, 0xc4, 0x00,
-  0x45, 0x61, 0x18, 0x46, 0x10, 0x00,
-  0x30, 0x91, 0x44, 0x51, 0x14, 0x00,
-  0xa2, 0x28, 0x2a, 0x0a, 0x82, 0x00,
-  0x51, 0x97, 0x24, 0x2f, 0x7e, 0x00,
-  0x4c, 0x27, 0x09, 0xc2, 0x70, 0x00,
-  0x66, 0x71, 0x9c, 0x67, 0x18, 0x00,
-  0x91, 0x40, 0xf0, 0x3c, 0x0e, 0x00,
-  0x42, 0x90, 0xa4, 0x29, 0x0a, 0x00,
-  0xa4, 0x29, 0x4a, 0x52, 0x94, 0x00,
-  0x13, 0x5a, 0x16, 0x85, 0xa0, 0x00,
-  0x30, 0x93, 0x44, 0xd1, 0x34, 0x00,
-  0x88, 0xac, 0x2b, 0x0a, 0xc2, 0x00,
-  0x09, 0x0c, 0xc3, 0x30, 0xcc, 0x00,
-  0x4c, 0x26, 0x09, 0x82, 0x60, 0x00,
-  0x66, 0x28, 0x8a, 0x22, 0x88, 0x00,
-  0x91, 0x50, 0x34, 0x0d, 0x02, 0x00,
-  0x42, 0x82, 0x60, 0x98, 0x26, 0x00,
-  0xa4, 0x01, 0xc0, 0x70, 0x1c, 0x00,
-  0x13, 0x43, 0x10, 0xc4, 0x30, 0x00,
-  0x30, 0x94, 0x85, 0x21, 0x48, 0x00,
-  0x88, 0xa1, 0x28, 0x4a, 0x12, 0x00,
-  0x09, 0x4c, 0x13, 0x04, 0xc0, 0x00,
-  0xcd, 0x98, 0x46, 0x11, 0x84, 0x00
-};
-
-const uint8_t kMaskRandom39_38[228] = {
-  0x4c, 0x27, 0x09, 0xc2, 0x70, 0x00,
-  0x66, 0x71, 0x9c, 0x67, 0x18, 0x00,
-  0x91, 0x40, 0xf0, 0x3c, 0x0e, 0x00,
-  0x42, 0x90, 0xa4, 0x29, 0x0a, 0x00,
-  0xa4, 0x29, 0x4a, 0x52, 0x94, 0x00,
-  0x13, 0x5a, 0x16, 0x85, 0xa0, 0x00,
-  0x30, 0x93, 0x44, 0xd1, 0x34, 0x00,
-  0x88, 0xac, 0x2b, 0x0a, 0xc2, 0x00,
-  0x09, 0x0c, 0xc3, 0x30, 0xcc, 0x00,
-  0x4c, 0x26, 0x09, 0x82, 0x60, 0x00,
-  0x66, 0x28, 0x8a, 0x22, 0x88, 0x00,
-  0x91, 0x50, 0x34, 0x0d, 0x02, 0x00,
-  0x42, 0x82, 0x60, 0x98, 0x26, 0x00,
-  0xa4, 0x01, 0xc0, 0x70, 0x1c, 0x00,
-  0x13, 0x43, 0x10, 0xc4, 0x30, 0x00,
-  0x30, 0x94, 0x85, 0x21, 0x48, 0x00,
-  0x88, 0xa1, 0x28, 0x4a, 0x12, 0x00,
-  0x09, 0x4c, 0x13, 0x04, 0xc0, 0x00,
-  0xcd, 0x98, 0x46, 0x11, 0x84, 0x00,
-  0x4c, 0x27, 0x09, 0xc2, 0x70, 0x00,
-  0x66, 0x71, 0x9c, 0x67, 0x18, 0x00,
-  0x91, 0x40, 0xf0, 0x3c, 0x0e, 0x00,
-  0x42, 0x90, 0xa4, 0x29, 0x0a, 0x00,
-  0xa4, 0x29, 0x4a, 0x52, 0x94, 0x00,
-  0x13, 0x5a, 0x16, 0x85, 0xa0, 0x00,
-  0x30, 0x93, 0x44, 0xd1, 0x34, 0x00,
-  0x88, 0xac, 0x2b, 0x0a, 0xc2, 0x00,
-  0x09, 0x0c, 0xc3, 0x30, 0xcc, 0x00,
-  0x2c, 0x16, 0x05, 0x81, 0x60, 0x00,
-  0x91, 0x40, 0xd0, 0x34, 0x0c, 0x00,
-  0xc0, 0xd0, 0x34, 0x0d, 0x02, 0x00,
-  0x06, 0x82, 0xa0, 0xa8, 0x2a, 0x00,
-  0xc8, 0x0c, 0x43, 0x10, 0xc4, 0x00,
-  0x45, 0x61, 0x18, 0x46, 0x10, 0x00,
-  0x30, 0x91, 0x44, 0x51, 0x14, 0x00,
-  0xa2, 0x28, 0x2a, 0x0a, 0x82, 0x00,
-  0x51, 0x97, 0x24, 0x2f, 0x7e, 0x00,
-  0x9e, 0xd8, 0x3c, 0x7e, 0x2e, 0x00
-};
-
-const uint8_t kMaskRandom39_39[234] = {
-  0x4c, 0x27, 0x09, 0xc2, 0x70, 0x00,
-  0x66, 0x71, 0x9c, 0x67, 0x18, 0x00,
-  0x91, 0x40, 0xf0, 0x3c, 0x0e, 0x00,
-  0x42, 0x90, 0xa4, 0x29, 0x0a, 0x00,
-  0xa4, 0x29, 0x4a, 0x52, 0x94, 0x00,
-  0x13, 0x5a, 0x16, 0x85, 0xa0, 0x00,
-  0x30, 0x93, 0x44, 0xd1, 0x34, 0x00,
-  0x88, 0xac, 0x2b, 0x0a, 0xc2, 0x00,
-  0x09, 0x0c, 0xc3, 0x30, 0xcc, 0x00,
-  0x4c, 0x26, 0x09, 0x82, 0x60, 0x00,
-  0x66, 0x28, 0x8a, 0x22, 0x88, 0x00,
-  0x91, 0x50, 0x34, 0x0d, 0x02, 0x00,
-  0x42, 0x82, 0x60, 0x98, 0x26, 0x00,
-  0xa4, 0x01, 0xc0, 0x70, 0x1c, 0x00,
-  0x13, 0x43, 0x10, 0xc4, 0x30, 0x00,
-  0x30, 0x94, 0x85, 0x21, 0x48, 0x00,
-  0x88, 0xa1, 0x28, 0x4a, 0x12, 0x00,
-  0x09, 0x4c, 0x13, 0x04, 0xc0, 0x00,
-  0xcd, 0x98, 0x46, 0x11, 0x84, 0x00,
-  0x4c, 0x27, 0x09, 0x82, 0x60, 0x00,
-  0x66, 0x71, 0x8a, 0x22, 0x88, 0x00,
-  0x91, 0x40, 0xf4, 0x0d, 0x02, 0x00,
-  0x42, 0x90, 0xa0, 0x98, 0x26, 0x00,
-  0xa4, 0x29, 0x40, 0x70, 0x1c, 0x00,
-  0x13, 0x5a, 0x10, 0xc4, 0x30, 0x00,
-  0x30, 0x93, 0x45, 0x21, 0x48, 0x00,
-  0x88, 0xac, 0x28, 0x4a, 0x12, 0x00,
-  0x09, 0x0c, 0xd3, 0x04, 0xc0, 0x00,
-  0x4c, 0x26, 0x06, 0x11, 0x84, 0x00,
-  0x66, 0x28, 0x89, 0xc2, 0x70, 0x00,
-  0x91, 0x50, 0x3c, 0x67, 0x18, 0x00,
-  0x42, 0x82, 0x70, 0x3c, 0x0e, 0x00,
-  0xa4, 0x01, 0xc4, 0x29, 0x0a, 0x00,
-  0x13, 0x43, 0x0a, 0x52, 0x94, 0x00,
-  0x30, 0x94, 0x96, 0x85, 0xa0, 0x00,
-  0x88, 0xa1, 0x24, 0xd1, 0x34, 0x00,
-  0x09, 0x4c, 0x0b, 0x0a, 0xc2, 0x00,
-  0xcd, 0x98, 0x43, 0x30, 0xcc, 0x00,
-  0x1d, 0x04, 0x3e, 0xf1, 0xb4, 0x00
-};
-
-const uint8_t kMaskRandom39_4[24] = {
-  0xec, 0x73, 0x1c, 0xc7, 0x30, 0x00,
-  0x67, 0x19, 0xc6, 0x71, 0x9c, 0x00,
-  0xb1, 0xcc, 0x73, 0x1c, 0xc6, 0x00,
-  0x5a, 0x96, 0xa5, 0xa9, 0x6a, 0x00
-};
-
-const uint8_t kMaskRandom39_5[30] = {
-  0x4c, 0xe7, 0x19, 0xc6, 0x70, 0x00,
-  0x66, 0x31, 0xcc, 0x73, 0x1c, 0x00,
-  0xa1, 0xcc, 0x73, 0x1c, 0xa6, 0x00,
-  0x92, 0xa6, 0xa5, 0x6a, 0x6a, 0x00,
-  0xb8, 0x99, 0x96, 0x8b, 0x94, 0x00
-};
-
-const uint8_t kMaskRandom39_6[36] = {
-  0x4c, 0x36, 0x09, 0x83, 0x60, 0x00,
-  0x45, 0x68, 0x8a, 0x26, 0x88, 0x00,
-  0x30, 0xd0, 0x64, 0x1d, 0x06, 0x00,
-  0x8a, 0x82, 0xb0, 0xa8, 0x2a, 0x00,
-  0x26, 0x0b, 0x40, 0xd0, 0xd4, 0x00,
-  0x95, 0x45, 0x13, 0x44, 0x30, 0x00
-};
-
-const uint8_t kMaskRandom39_7[42] = {
-  0xc4, 0xa3, 0x09, 0xc2, 0x30, 0x00,
-  0x23, 0x19, 0x86, 0x65, 0x80, 0x00,
-  0x91, 0x1c, 0x22, 0x01, 0xd6, 0x00,
-  0x4a, 0x82, 0xb0, 0x2a, 0x2a, 0x00,
-  0x34, 0x49, 0x44, 0x98, 0x94, 0x00,
-  0x8b, 0x4a, 0x1a, 0x84, 0x60, 0x00,
-  0xc8, 0x24, 0xc1, 0x94, 0x4c, 0x00
-};
-
-const uint8_t kMaskRandom39_8[48] = {
-  0x16, 0x13, 0x84, 0xe1, 0x38, 0x00,
-  0xc2, 0x44, 0xd1, 0x34, 0x4c, 0x00,
-  0x60, 0xe8, 0x3a, 0x0e, 0x82, 0x00,
-  0x85, 0x12, 0x64, 0x99, 0x26, 0x00,
-  0xcc, 0x21, 0x5c, 0x52, 0x14, 0x00,
-  0x29, 0x63, 0x18, 0xc6, 0x30, 0x00,
-  0x11, 0x98, 0xc6, 0x31, 0x8c, 0x00,
-  0xb0, 0x0c, 0x63, 0x18, 0xc6, 0x00
-};
-
-const uint8_t kMaskRandom39_9[54] = {
-  0x44, 0xa7, 0x09, 0xc2, 0x70, 0x00,
-  0x66, 0x70, 0x8c, 0x47, 0x18, 0x00,
-  0x12, 0xc0, 0xf0, 0x3c, 0x0e, 0x00,
-  0xc3, 0x10, 0xbc, 0x29, 0x0a, 0x00,
-  0x8c, 0x29, 0x42, 0x72, 0x94, 0x00,
-  0x11, 0x5b, 0x16, 0x85, 0xa0, 0x00,
-  0x21, 0x93, 0x44, 0xd1, 0x34, 0x00,
-  0xa2, 0x2c, 0x0b, 0x0a, 0xc2, 0x00,
-  0x18, 0x0c, 0xe9, 0x30, 0xca, 0x00
-};
-
-const uint8_t kMaskRandom3_1[2] = {
-  0xe0, 0x00
-};
-
-const uint8_t kMaskRandom3_2[4] = {
-  0xc0, 0x00,
-  0xa0, 0x00
-};
-
-const uint8_t kMaskRandom3_3[6] = {
-  0xc0, 0x00,
-  0xa0, 0x00,
-  0x60, 0x00
-};
-
-const uint8_t kMaskRandom40_1[6] = {
-  0xff, 0xff, 0xff, 0xff, 0xff, 0x00
-};
-
-const uint8_t kMaskRandom40_10[60] = {
-  0x4c, 0x13, 0x04, 0xc1, 0x30, 0x00,
-  0x51, 0x14, 0x45, 0x11, 0x44, 0x00,
-  0xa0, 0x68, 0x1a, 0x06, 0x81, 0x00,
-  0x04, 0xc1, 0x30, 0x4c, 0x13, 0x00,
-  0x03, 0x80, 0xe0, 0x38, 0x0e, 0x00,
-  0x86, 0x21, 0x88, 0x62, 0x18, 0x00,
-  0x29, 0x0a, 0x42, 0x90, 0xa4, 0x00,
-  0x42, 0x50, 0x94, 0x25, 0x09, 0x00,
-  0x98, 0x26, 0x09, 0x82, 0x60, 0x00,
-  0x30, 0x8c, 0x23, 0x08, 0xc2, 0x00
-};
-
-const uint8_t kMaskRandom40_11[66] = {
-  0xc6, 0x31, 0x8c, 0x63, 0x18, 0x00,
-  0x23, 0x88, 0xe2, 0x38, 0x8e, 0x00,
-  0x1a, 0x46, 0x91, 0xa4, 0x69, 0x00,
-  0x24, 0xc9, 0x32, 0x4c, 0x93, 0x00,
-  0x71, 0x1c, 0x47, 0x11, 0xc4, 0x00,
-  0x0e, 0x03, 0x80, 0xe0, 0x38, 0x00,
-  0x33, 0x0c, 0xc3, 0x30, 0xcc, 0x00,
-  0x10, 0xc4, 0x31, 0x0c, 0x43, 0x00,
-  0x45, 0x51, 0x54, 0x55, 0x15, 0x00,
-  0x88, 0xa2, 0x28, 0x8a, 0x22, 0x00,
-  0xe0, 0x38, 0x0e, 0x03, 0x80, 0x00
-};
-
-const uint8_t kMaskRandom40_12[72] = {
-  0x0e, 0x03, 0x80, 0xe0, 0x38, 0x00,
-  0x33, 0x0c, 0xc3, 0x30, 0xcc, 0x00,
-  0x10, 0xc4, 0x31, 0x0c, 0x43, 0x00,
-  0x45, 0x51, 0x54, 0x55, 0x15, 0x00,
-  0x88, 0xa2, 0x28, 0x8a, 0x22, 0x00,
-  0xe0, 0x38, 0x0e, 0x03, 0x80, 0x00,
-  0xc6, 0x31, 0x8c, 0x63, 0x18, 0x00,
-  0x23, 0x88, 0xe2, 0x38, 0x8e, 0x00,
-  0x1a, 0x46, 0x91, 0xa4, 0x69, 0x00,
-  0x24, 0xc9, 0x32, 0x4c, 0x93, 0x00,
-  0x71, 0x1c, 0x47, 0x11, 0xc4, 0x00,
-  0xf5, 0xdc, 0x4f, 0x5d, 0xc4, 0x00
-};
-
-const uint8_t kMaskRandom40_13[78] = {
-  0x0e, 0x03, 0x80, 0xe0, 0x38, 0x00,
-  0x33, 0x0c, 0xc3, 0x30, 0xcc, 0x00,
-  0x10, 0xc4, 0x31, 0x0c, 0x43, 0x00,
-  0x45, 0x51, 0x54, 0x55, 0x15, 0x00,
-  0x88, 0xa2, 0x28, 0x8a, 0x22, 0x00,
-  0xe0, 0x38, 0x0e, 0x03, 0x80, 0x00,
-  0x46, 0x11, 0x84, 0x61, 0x18, 0x00,
-  0x33, 0x0c, 0xc3, 0x30, 0xcc, 0x00,
-  0x10, 0xc4, 0x31, 0x0c, 0x43, 0x00,
-  0x0c, 0x43, 0x10, 0xc4, 0x31, 0x00,
-  0x28, 0x8a, 0x22, 0x88, 0xa2, 0x00,
-  0x94, 0x25, 0x09, 0x42, 0x50, 0x00,
-  0xc1, 0x30, 0x4c, 0x13, 0x04, 0x00
-};
-
-const uint8_t kMaskRandom40_14[84] = {
-  0x46, 0x11, 0x84, 0x61, 0x18, 0x00,
-  0x33, 0x0c, 0xc3, 0x30, 0xcc, 0x00,
-  0x10, 0xc4, 0x31, 0x0c, 0x43, 0x00,
-  0x0c, 0x43, 0x10, 0xc4, 0x31, 0x00,
-  0x28, 0x8a, 0x22, 0x88, 0xa2, 0x00,
-  0x94, 0x25, 0x09, 0x42, 0x50, 0x00,
-  0xc1, 0x30, 0x4c, 0x13, 0x04, 0x00,
-  0x0e, 0x03, 0x80, 0xe0, 0x38, 0x00,
-  0x33, 0x0c, 0xc3, 0x30, 0xcc, 0x00,
-  0x10, 0xc4, 0x31, 0x0c, 0x43, 0x00,
-  0x45, 0x51, 0x54, 0x55, 0x15, 0x00,
-  0x88, 0xa2, 0x28, 0x8a, 0x22, 0x00,
-  0xe0, 0x38, 0x0e, 0x03, 0x80, 0x00,
-  0x56, 0x3e, 0x25, 0x63, 0xe2, 0x00
-};
-
-const uint8_t kMaskRandom40_15[90] = {
-  0x46, 0x11, 0x84, 0x61, 0x18, 0x00,
-  0x33, 0x0c, 0xc3, 0x30, 0xcc, 0x00,
-  0x10, 0xc4, 0x31, 0x0c, 0x43, 0x00,
-  0x0c, 0x43, 0x10, 0xc4, 0x31, 0x00,
-  0x28, 0x8a, 0x22, 0x88, 0xa2, 0x00,
-  0x94, 0x25, 0x09, 0x42, 0x50, 0x00,
-  0xc1, 0x30, 0x4c, 0x13, 0x04, 0x00,
-  0x2c, 0x0b, 0x02, 0xc0, 0xb0, 0x00,
-  0x81, 0xa0, 0x68, 0x1a, 0x06, 0x00,
-  0xa0, 0x68, 0x1a, 0x06, 0x81, 0x00,
-  0x05, 0x41, 0x50, 0x54, 0x15, 0x00,
-  0x18, 0x86, 0x21, 0x88, 0x62, 0x00,
-  0xc2, 0x30, 0x8c, 0x23, 0x08, 0x00,
-  0x22, 0x88, 0xa2, 0x28, 0x8a, 0x00,
-  0x50, 0x54, 0x15, 0x05, 0x41, 0x00
-};
-
-const uint8_t kMaskRandom40_16[96] = {
-  0x2c, 0x0b, 0x02, 0xc0, 0xb0, 0x00,
-  0x81, 0xa0, 0x68, 0x1a, 0x06, 0x00,
-  0xa0, 0x68, 0x1a, 0x06, 0x81, 0x00,
-  0x05, 0x41, 0x50, 0x54, 0x15, 0x00,
-  0x18, 0x86, 0x21, 0x88, 0x62, 0x00,
-  0xc2, 0x30, 0x8c, 0x23, 0x08, 0x00,
-  0x22, 0x88, 0xa2, 0x28, 0x8a, 0x00,
-  0x50, 0x54, 0x15, 0x05, 0x41, 0x00,
-  0x46, 0x11, 0x84, 0x61, 0x18, 0x00,
-  0x33, 0x0c, 0xc3, 0x30, 0xcc, 0x00,
-  0x10, 0xc4, 0x31, 0x0c, 0x43, 0x00,
-  0x0c, 0x43, 0x10, 0xc4, 0x31, 0x00,
-  0x28, 0x8a, 0x22, 0x88, 0xa2, 0x00,
-  0x94, 0x25, 0x09, 0x42, 0x50, 0x00,
-  0xc1, 0x30, 0x4c, 0x13, 0x04, 0x00,
-  0x28, 0x1c, 0x62, 0x81, 0xc6, 0x00
-};
-
-const uint8_t kMaskRandom40_17[102] = {
-  0x2c, 0x0b, 0x02, 0xc0, 0xb0, 0x00,
-  0x81, 0xa0, 0x68, 0x1a, 0x06, 0x00,
-  0xa0, 0x68, 0x1a, 0x06, 0x81, 0x00,
-  0x05, 0x41, 0x50, 0x54, 0x15, 0x00,
-  0x18, 0x86, 0x21, 0x88, 0x62, 0x00,
-  0xc2, 0x30, 0x8c, 0x23, 0x08, 0x00,
-  0x22, 0x88, 0xa2, 0x28, 0x8a, 0x00,
-  0x50, 0x54, 0x15, 0x05, 0x41, 0x00,
-  0x4e, 0x13, 0x84, 0xe1, 0x38, 0x00,
-  0xe3, 0x38, 0xce, 0x33, 0x8c, 0x00,
-  0x81, 0xe0, 0x78, 0x1e, 0x07, 0x00,
-  0x21, 0x48, 0x52, 0x14, 0x85, 0x00,
-  0x52, 0x94, 0xa5, 0x29, 0x4a, 0x00,
-  0xb4, 0x2d, 0x0b, 0x42, 0xd0, 0x00,
-  0x26, 0x89, 0xa2, 0x68, 0x9a, 0x00,
-  0x58, 0x56, 0x15, 0x85, 0x61, 0x00,
-  0x19, 0x86, 0x61, 0x98, 0x66, 0x00
-};
-
-const uint8_t kMaskRandom40_18[108] = {
-  0x4e, 0x13, 0x84, 0xe1, 0x38, 0x00,
-  0xe3, 0x38, 0xce, 0x33, 0x8c, 0x00,
-  0x81, 0xe0, 0x78, 0x1e, 0x07, 0x00,
-  0x21, 0x48, 0x52, 0x14, 0x85, 0x00,
-  0x52, 0x94, 0xa5, 0x29, 0x4a, 0x00,
-  0xb4, 0x2d, 0x0b, 0x42, 0xd0, 0x00,
-  0x26, 0x89, 0xa2, 0x68, 0x9a, 0x00,
-  0x58, 0x56, 0x15, 0x85, 0x61, 0x00,
-  0x19, 0x86, 0x61, 0x98, 0x66, 0x00,
-  0x2c, 0x0b, 0x02, 0xc0, 0xb0, 0x00,
-  0x81, 0xa0, 0x68, 0x1a, 0x06, 0x00,
-  0xa0, 0x68, 0x1a, 0x06, 0x81, 0x00,
-  0x05, 0x41, 0x50, 0x54, 0x15, 0x00,
-  0x18, 0x86, 0x21, 0x88, 0x62, 0x00,
-  0xc2, 0x30, 0x8c, 0x23, 0x08, 0x00,
-  0x22, 0x88, 0xa2, 0x28, 0x8a, 0x00,
-  0x50, 0x54, 0x15, 0x05, 0x41, 0x00,
-  0x21, 0x7b, 0xf2, 0x17, 0xbf, 0x00
-};
-
-const uint8_t kMaskRandom40_19[114] = {
-  0x4e, 0x13, 0x84, 0xe1, 0x38, 0x00,
-  0xe3, 0x38, 0xce, 0x33, 0x8c, 0x00,
-  0x81, 0xe0, 0x78, 0x1e, 0x07, 0x00,
-  0x21, 0x48, 0x52, 0x14, 0x85, 0x00,
-  0x52, 0x94, 0xa5, 0x29, 0x4a, 0x00,
-  0xb4, 0x2d, 0x0b, 0x42, 0xd0, 0x00,
-  0x26, 0x89, 0xa2, 0x68, 0x9a, 0x00,
-  0x58, 0x56, 0x15, 0x85, 0x61, 0x00,
-  0x19, 0x86, 0x61, 0x98, 0x66, 0x00,
-  0x4c, 0x13, 0x04, 0xc1, 0x30, 0x00,
-  0x51, 0x14, 0x45, 0x11, 0x44, 0x00,
-  0xa0, 0x68, 0x1a, 0x06, 0x81, 0x00,
-  0x04, 0xc1, 0x30, 0x4c, 0x13, 0x00,
-  0x03, 0x80, 0xe0, 0x38, 0x0e, 0x00,
-  0x86, 0x21, 0x88, 0x62, 0x18, 0x00,
-  0x29, 0x0a, 0x42, 0x90, 0xa4, 0x00,
-  0x42, 0x50, 0x94, 0x25, 0x09, 0x00,
-  0x98, 0x26, 0x09, 0x82, 0x60, 0x00,
-  0x30, 0x8c, 0x23, 0x08, 0xc2, 0x00
-};
-
-const uint8_t kMaskRandom40_2[12] = {
-  0xee, 0x3b, 0x8e, 0xe3, 0xb8, 0x00,
-  0x99, 0xe6, 0x79, 0x9e, 0x67, 0x00
-};
-
-const uint8_t kMaskRandom40_20[120] = {
-  0x4c, 0x13, 0x04, 0xc1, 0x30, 0x00,
-  0x51, 0x14, 0x45, 0x11, 0x44, 0x00,
-  0xa0, 0x68, 0x1a, 0x06, 0x81, 0x00,
-  0x04, 0xc1, 0x30, 0x4c, 0x13, 0x00,
-  0x03, 0x80, 0xe0, 0x38, 0x0e, 0x00,
-  0x86, 0x21, 0x88, 0x62, 0x18, 0x00,
-  0x29, 0x0a, 0x42, 0x90, 0xa4, 0x00,
-  0x42, 0x50, 0x94, 0x25, 0x09, 0x00,
-  0x98, 0x26, 0x09, 0x82, 0x60, 0x00,
-  0x30, 0x8c, 0x23, 0x08, 0xc2, 0x00,
-  0x4e, 0x13, 0x84, 0xe1, 0x38, 0x00,
-  0xe3, 0x38, 0xce, 0x33, 0x8c, 0x00,
-  0x81, 0xe0, 0x78, 0x1e, 0x07, 0x00,
-  0x21, 0x48, 0x52, 0x14, 0x85, 0x00,
-  0x52, 0x94, 0xa5, 0x29, 0x4a, 0x00,
-  0xb4, 0x2d, 0x0b, 0x42, 0xd0, 0x00,
-  0x26, 0x89, 0xa2, 0x68, 0x9a, 0x00,
-  0x58, 0x56, 0x15, 0x85, 0x61, 0x00,
-  0x19, 0x86, 0x61, 0x98, 0x66, 0x00,
-  0xf7, 0x8d, 0xaf, 0x78, 0xda, 0x00
-};
-
-const uint8_t kMaskRandom40_21[126] = {
-  0x4c, 0x13, 0x04, 0xc1, 0x30, 0x00,
-  0x51, 0x14, 0x45, 0x11, 0x44, 0x00,
-  0xa0, 0x68, 0x1a, 0x06, 0x81, 0x00,
-  0x04, 0xc1, 0x30, 0x4c, 0x13, 0x00,
-  0x03, 0x80, 0xe0, 0x38, 0x0e, 0x00,
-  0x86, 0x21, 0x88, 0x62, 0x18, 0x00,
-  0x29, 0x0a, 0x42, 0x90, 0xa4, 0x00,
-  0x42, 0x50, 0x94, 0x25, 0x09, 0x00,
-  0x98, 0x26, 0x09, 0x82, 0x60, 0x00,
-  0x30, 0x8c, 0x23, 0x08, 0xc2, 0x00,
-  0xc6, 0x31, 0x8c, 0x63, 0x18, 0x00,
-  0x23, 0x88, 0xe2, 0x38, 0x8e, 0x00,
-  0x1a, 0x46, 0x91, 0xa4, 0x69, 0x00,
-  0x24, 0xc9, 0x32, 0x4c, 0x93, 0x00,
-  0x71, 0x1c, 0x47, 0x11, 0xc4, 0x00,
-  0x0e, 0x03, 0x80, 0xe0, 0x38, 0x00,
-  0x33, 0x0c, 0xc3, 0x30, 0xcc, 0x00,
-  0x10, 0xc4, 0x31, 0x0c, 0x43, 0x00,
-  0x45, 0x51, 0x54, 0x55, 0x15, 0x00,
-  0x88, 0xa2, 0x28, 0x8a, 0x22, 0x00,
-  0xe0, 0x38, 0x0e, 0x03, 0x80, 0x00
-};
-
-const uint8_t kMaskRandom40_22[132] = {
-  0xc6, 0x31, 0x8c, 0x63, 0x18, 0x00,
-  0x23, 0x88, 0xe2, 0x38, 0x8e, 0x00,
-  0x1a, 0x46, 0x91, 0xa4, 0x69, 0x00,
-  0x24, 0xc9, 0x32, 0x4c, 0x93, 0x00,
-  0x71, 0x1c, 0x47, 0x11, 0xc4, 0x00,
-  0x0e, 0x03, 0x80, 0xe0, 0x38, 0x00,
-  0x33, 0x0c, 0xc3, 0x30, 0xcc, 0x00,
-  0x10, 0xc4, 0x31, 0x0c, 0x43, 0x00,
-  0x45, 0x51, 0x54, 0x55, 0x15, 0x00,
-  0x88, 0xa2, 0x28, 0x8a, 0x22, 0x00,
-  0xe0, 0x38, 0x0e, 0x03, 0x80, 0x00,
-  0x4c, 0x13, 0x04, 0xc1, 0x30, 0x00,
-  0x51, 0x14, 0x45, 0x11, 0x44, 0x00,
-  0xa0, 0x68, 0x1a, 0x06, 0x81, 0x00,
-  0x04, 0xc1, 0x30, 0x4c, 0x13, 0x00,
-  0x03, 0x80, 0xe0, 0x38, 0x0e, 0x00,
-  0x86, 0x21, 0x88, 0x62, 0x18, 0x00,
-  0x29, 0x0a, 0x42, 0x90, 0xa4, 0x00,
-  0x42, 0x50, 0x94, 0x25, 0x09, 0x00,
-  0x98, 0x26, 0x09, 0x82, 0x60, 0x00,
-  0x30, 0x8c, 0x23, 0x08, 0xc2, 0x00,
-  0x89, 0xee, 0x1f, 0x38, 0xca, 0x00
-};
-
-const uint8_t kMaskRandom40_23[138] = {
-  0xc6, 0x31, 0x8c, 0x63, 0x18, 0x00,
-  0x23, 0x88, 0xe2, 0x38, 0x8e, 0x00,
-  0x1a, 0x46, 0x91, 0xa4, 0x69, 0x00,
-  0x24, 0xc9, 0x32, 0x4c, 0x93, 0x00,
-  0x71, 0x1c, 0x47, 0x11, 0xc4, 0x00,
-  0x0e, 0x03, 0x80, 0xe0, 0x38, 0x00,
-  0x33, 0x0c, 0xc3, 0x30, 0xcc, 0x00,
-  0x10, 0xc4, 0x31, 0x0c, 0x43, 0x00,
-  0x45, 0x51, 0x54, 0x55, 0x15, 0x00,
-  0x88, 0xa2, 0x28, 0x8a, 0x22, 0x00,
-  0xe0, 0x38, 0x0e, 0x03, 0x80, 0x00,
-  0x0e, 0x03, 0x80, 0xe0, 0x38, 0x00,
-  0x33, 0x0c, 0xc3, 0x30, 0xcc, 0x00,
-  0x10, 0xc4, 0x31, 0x0c, 0x43, 0x00,
-  0x45, 0x51, 0x54, 0x55, 0x15, 0x00,
-  0x88, 0xa2, 0x28, 0x8a, 0x22, 0x00,
-  0xe0, 0x38, 0x0e, 0x03, 0x80, 0x00,
-  0xc6, 0x31, 0x8c, 0x63, 0x18, 0x00,
-  0x23, 0x88, 0xe2, 0x38, 0x8e, 0x00,
-  0x1a, 0x46, 0x91, 0xa4, 0x69, 0x00,
-  0x24, 0xc9, 0x32, 0x4c, 0x93, 0x00,
-  0x71, 0x1c, 0x47, 0x11, 0xc4, 0x00,
-  0xf5, 0xdc, 0x4f, 0x5d, 0xc4, 0x00
-};
-
-const uint8_t kMaskRandom40_24[144] = {
-  0x0e, 0x03, 0x80, 0xe0, 0x38, 0x00,
-  0x33, 0x0c, 0xc3, 0x30, 0xcc, 0x00,
-  0x10, 0xc4, 0x31, 0x0c, 0x43, 0x00,
-  0x45, 0x51, 0x54, 0x55, 0x15, 0x00,
-  0x88, 0xa2, 0x28, 0x8a, 0x22, 0x00,
-  0xe0, 0x38, 0x0e, 0x03, 0x80, 0x00,
-  0xc6, 0x31, 0x8c, 0x63, 0x18, 0x00,
-  0x23, 0x88, 0xe2, 0x38, 0x8e, 0x00,
-  0x1a, 0x46, 0x91, 0xa4, 0x69, 0x00,
-  0x24, 0xc9, 0x32, 0x4c, 0x93, 0x00,
-  0x71, 0x1c, 0x47, 0x11, 0xc4, 0x00,
-  0xf5, 0xdc, 0x4f, 0x5d, 0xc4, 0x00,
-  0xc6, 0x31, 0x8c, 0x63, 0x18, 0x00,
-  0x23, 0x88, 0xe2, 0x38, 0x8e, 0x00,
-  0x1a, 0x46, 0x91, 0xa4, 0x69, 0x00,
-  0x24, 0xc9, 0x32, 0x4c, 0x93, 0x00,
-  0x71, 0x1c, 0x47, 0x11, 0xc4, 0x00,
-  0x0e, 0x03, 0x80, 0xe0, 0x38, 0x00,
-  0x33, 0x0c, 0xc3, 0x30, 0xcc, 0x00,
-  0x10, 0xc4, 0x31, 0x0c, 0x43, 0x00,
-  0x45, 0x51, 0x54, 0x55, 0x15, 0x00,
-  0x88, 0xa2, 0x28, 0x8a, 0x22, 0x00,
-  0xe0, 0x38, 0x0e, 0x03, 0x80, 0x00,
-  0x68, 0xde, 0x83, 0xa9, 0xcf, 0x00
-};
-
-const uint8_t kMaskRandom40_25[150] = {
-  0x0e, 0x03, 0x80, 0xe0, 0x38, 0x00,
-  0x33, 0x0c, 0xc3, 0x30, 0xcc, 0x00,
-  0x10, 0xc4, 0x31, 0x0c, 0x43, 0x00,
-  0x45, 0x51, 0x54, 0x55, 0x15, 0x00,
-  0x88, 0xa2, 0x28, 0x8a, 0x22, 0x00,
-  0xe0, 0x38, 0x0e, 0x03, 0x80, 0x00,
-  0xc6, 0x31, 0x8c, 0x63, 0x18, 0x00,
-  0x23, 0x88, 0xe2, 0x38, 0x8e, 0x00,
-  0x1a, 0x46, 0x91, 0xa4, 0x69, 0x00,
-  0x24, 0xc9, 0x32, 0x4c, 0x93, 0x00,
-  0x71, 0x1c, 0x47, 0x11, 0xc4, 0x00,
-  0xf5, 0xdc, 0x4f, 0x5d, 0xc4, 0x00,
-  0x0e, 0x03, 0x80, 0xe0, 0x38, 0x00,
-  0x33, 0x0c, 0xc3, 0x30, 0xcc, 0x00,
-  0x10, 0xc4, 0x31, 0x0c, 0x43, 0x00,
-  0x45, 0x51, 0x54, 0x55, 0x15, 0x00,
-  0x88, 0xa2, 0x28, 0x8a, 0x22, 0x00,
-  0xe0, 0x38, 0x0e, 0x03, 0x80, 0x00,
-  0x46, 0x11, 0x84, 0x61, 0x18, 0x00,
-  0x33, 0x0c, 0xc3, 0x30, 0xcc, 0x00,
-  0x10, 0xc4, 0x31, 0x0c, 0x43, 0x00,
-  0x0c, 0x43, 0x10, 0xc4, 0x31, 0x00,
-  0x28, 0x8a, 0x22, 0x88, 0xa2, 0x00,
-  0x94, 0x25, 0x09, 0x42, 0x50, 0x00,
-  0xc1, 0x30, 0x4c, 0x13, 0x04, 0x00
-};
-
-const uint8_t kMaskRandom40_26[156] = {
-  0x0e, 0x03, 0x80, 0xe0, 0x38, 0x00,
-  0x33, 0x0c, 0xc3, 0x30, 0xcc, 0x00,
-  0x10, 0xc4, 0x31, 0x0c, 0x43, 0x00,
-  0x45, 0x51, 0x54, 0x55, 0x15, 0x00,
-  0x88, 0xa2, 0x28, 0x8a, 0x22, 0x00,
-  0xe0, 0x38, 0x0e, 0x03, 0x80, 0x00,
-  0x46, 0x11, 0x84, 0x61, 0x18, 0x00,
-  0x33, 0x0c, 0xc3, 0x30, 0xcc, 0x00,
-  0x10, 0xc4, 0x31, 0x0c, 0x43, 0x00,
-  0x0c, 0x43, 0x10, 0xc4, 0x31, 0x00,
-  0x28, 0x8a, 0x22, 0x88, 0xa2, 0x00,
-  0x94, 0x25, 0x09, 0x42, 0x50, 0x00,
-  0xc1, 0x30, 0x4c, 0x13, 0x04, 0x00,
-  0x0e, 0x03, 0x80, 0xe0, 0x38, 0x00,
-  0x33, 0x0c, 0xc3, 0x30, 0xcc, 0x00,
-  0x10, 0xc4, 0x31, 0x0c, 0x43, 0x00,
-  0x45, 0x51, 0x54, 0x55, 0x15, 0x00,
-  0x88, 0xa2, 0x28, 0x8a, 0x22, 0x00,
-  0xe0, 0x38, 0x0e, 0x03, 0x80, 0x00,
-  0xc6, 0x31, 0x8c, 0x63, 0x18, 0x00,
-  0x23, 0x88, 0xe2, 0x38, 0x8e, 0x00,
-  0x1a, 0x46, 0x91, 0xa4, 0x69, 0x00,
-  0x24, 0xc9, 0x32, 0x4c, 0x93, 0x00,
-  0x71, 0x1c, 0x47, 0x11, 0xc4, 0x00,
-  0xf5, 0xdc, 0x4f, 0x5d, 0xc4, 0x00,
-  0x06, 0x8e, 0x8c, 0x1a, 0xd2, 0x00
-};
-
-const uint8_t kMaskRandom40_27[162] = {
-  0x0e, 0x03, 0x80, 0xe0, 0x38, 0x00,
-  0x33, 0x0c, 0xc3, 0x30, 0xcc, 0x00,
-  0x10, 0xc4, 0x31, 0x0c, 0x43, 0x00,
-  0x45, 0x51, 0x54, 0x55, 0x15, 0x00,
-  0x88, 0xa2, 0x28, 0x8a, 0x22, 0x00,
-  0xe0, 0x38, 0x0e, 0x03, 0x80, 0x00,
-  0x46, 0x11, 0x84, 0x61, 0x18, 0x00,
-  0x33, 0x0c, 0xc3, 0x30, 0xcc, 0x00,
-  0x10, 0xc4, 0x31, 0x0c, 0x43, 0x00,
-  0x0c, 0x43, 0x10, 0xc4, 0x31, 0x00,
-  0x28, 0x8a, 0x22, 0x88, 0xa2, 0x00,
-  0x94, 0x25, 0x09, 0x42, 0x50, 0x00,
-  0xc1, 0x30, 0x4c, 0x13, 0x04, 0x00,
-  0x46, 0x11, 0x84, 0x61, 0x18, 0x00,
-  0x33, 0x0c, 0xc3, 0x30, 0xcc, 0x00,
-  0x10, 0xc4, 0x31, 0x0c, 0x43, 0x00,
-  0x0c, 0x43, 0x10, 0xc4, 0x31, 0x00,
-  0x28, 0x8a, 0x22, 0x88, 0xa2, 0x00,
-  0x94, 0x25, 0x09, 0x42, 0x50, 0x00,
-  0xc1, 0x30, 0x4c, 0x13, 0x04, 0x00,
-  0x0e, 0x03, 0x80, 0xe0, 0x38, 0x00,
-  0x33, 0x0c, 0xc3, 0x30, 0xcc, 0x00,
-  0x10, 0xc4, 0x31, 0x0c, 0x43, 0x00,
-  0x45, 0x51, 0x54, 0x55, 0x15, 0x00,
-  0x88, 0xa2, 0x28, 0x8a, 0x22, 0x00,
-  0xe0, 0x38, 0x0e, 0x03, 0x80, 0x00,
-  0x56, 0x3e, 0x25, 0x63, 0xe2, 0x00
-};
-
-const uint8_t kMaskRandom40_28[168] = {
-  0x46, 0x11, 0x84, 0x61, 0x18, 0x00,
-  0x33, 0x0c, 0xc3, 0x30, 0xcc, 0x00,
-  0x10, 0xc4, 0x31, 0x0c, 0x43, 0x00,
-  0x0c, 0x43, 0x10, 0xc4, 0x31, 0x00,
-  0x28, 0x8a, 0x22, 0x88, 0xa2, 0x00,
-  0x94, 0x25, 0x09, 0x42, 0x50, 0x00,
-  0xc1, 0x30, 0x4c, 0x13, 0x04, 0x00,
-  0x0e, 0x03, 0x80, 0xe0, 0x38, 0x00,
-  0x33, 0x0c, 0xc3, 0x30, 0xcc, 0x00,
-  0x10, 0xc4, 0x31, 0x0c, 0x43, 0x00,
-  0x45, 0x51, 0x54, 0x55, 0x15, 0x00,
-  0x88, 0xa2, 0x28, 0x8a, 0x22, 0x00,
-  0xe0, 0x38, 0x0e, 0x03, 0x80, 0x00,
-  0x56, 0x3e, 0x25, 0x63, 0xe2, 0x00,
-  0x0e, 0x03, 0x80, 0xe0, 0x38, 0x00,
-  0x33, 0x0c, 0xc3, 0x30, 0xcc, 0x00,
-  0x10, 0xc4, 0x31, 0x0c, 0x43, 0x00,
-  0x45, 0x51, 0x54, 0x55, 0x15, 0x00,
-  0x88, 0xa2, 0x28, 0x8a, 0x22, 0x00,
-  0xe0, 0x38, 0x0e, 0x03, 0x80, 0x00,
-  0x46, 0x11, 0x84, 0x61, 0x18, 0x00,
-  0x33, 0x0c, 0xc3, 0x30, 0xcc, 0x00,
-  0x10, 0xc4, 0x31, 0x0c, 0x43, 0x00,
-  0x0c, 0x43, 0x10, 0xc4, 0x31, 0x00,
-  0x28, 0x8a, 0x22, 0x88, 0xa2, 0x00,
-  0x94, 0x25, 0x09, 0x42, 0x50, 0x00,
-  0xc1, 0x30, 0x4c, 0x13, 0x04, 0x00,
-  0x68, 0x0e, 0x9b, 0x52, 0xb6, 0x00
-};
-
-const uint8_t kMaskRandom40_29[174] = {
-  0x46, 0x11, 0x84, 0x61, 0x18, 0x00,
-  0x33, 0x0c, 0xc3, 0x30, 0xcc, 0x00,
-  0x10, 0xc4, 0x31, 0x0c, 0x43, 0x00,
-  0x0c, 0x43, 0x10, 0xc4, 0x31, 0x00,
-  0x28, 0x8a, 0x22, 0x88, 0xa2, 0x00,
-  0x94, 0x25, 0x09, 0x42, 0x50, 0x00,
-  0xc1, 0x30, 0x4c, 0x13, 0x04, 0x00,
-  0x0e, 0x03, 0x80, 0xe0, 0x38, 0x00,
-  0x33, 0x0c, 0xc3, 0x30, 0xcc, 0x00,
-  0x10, 0xc4, 0x31, 0x0c, 0x43, 0x00,
-  0x45, 0x51, 0x54, 0x55, 0x15, 0x00,
-  0x88, 0xa2, 0x28, 0x8a, 0x22, 0x00,
-  0xe0, 0x38, 0x0e, 0x03, 0x80, 0x00,
-  0x56, 0x3e, 0x25, 0x63, 0xe2, 0x00,
-  0x46, 0x11, 0x84, 0x61, 0x18, 0x00,
-  0x33, 0x0c, 0xc3, 0x30, 0xcc, 0x00,
-  0x10, 0xc4, 0x31, 0x0c, 0x43, 0x00,
-  0x0c, 0x43, 0x10, 0xc4, 0x31, 0x00,
-  0x28, 0x8a, 0x22, 0x88, 0xa2, 0x00,
-  0x94, 0x25, 0x09, 0x42, 0x50, 0x00,
-  0xc1, 0x30, 0x4c, 0x13, 0x04, 0x00,
-  0x2c, 0x0b, 0x02, 0xc0, 0xb0, 0x00,
-  0x81, 0xa0, 0x68, 0x1a, 0x06, 0x00,
-  0xa0, 0x68, 0x1a, 0x06, 0x81, 0x00,
-  0x05, 0x41, 0x50, 0x54, 0x15, 0x00,
-  0x18, 0x86, 0x21, 0x88, 0x62, 0x00,
-  0xc2, 0x30, 0x8c, 0x23, 0x08, 0x00,
-  0x22, 0x88, 0xa2, 0x28, 0x8a, 0x00,
-  0x50, 0x54, 0x15, 0x05, 0x41, 0x00
-};
-
-const uint8_t kMaskRandom40_3[18] = {
-  0xce, 0x33, 0x8c, 0xe3, 0x38, 0x00,
-  0x55, 0x95, 0x65, 0x59, 0x56, 0x00,
-  0xb1, 0x6a, 0x3b, 0x16, 0xa3, 0x00
-};
-
-const uint8_t kMaskRandom40_30[180] = {
-  0x46, 0x11, 0x84, 0x61, 0x18, 0x00,
-  0x33, 0x0c, 0xc3, 0x30, 0xcc, 0x00,
-  0x10, 0xc4, 0x31, 0x0c, 0x43, 0x00,
-  0x0c, 0x43, 0x10, 0xc4, 0x31, 0x00,
-  0x28, 0x8a, 0x22, 0x88, 0xa2, 0x00,
-  0x94, 0x25, 0x09, 0x42, 0x50, 0x00,
-  0xc1, 0x30, 0x4c, 0x13, 0x04, 0x00,
-  0x2c, 0x0b, 0x02, 0xc0, 0xb0, 0x00,
-  0x81, 0xa0, 0x68, 0x1a, 0x06, 0x00,
-  0xa0, 0x68, 0x1a, 0x06, 0x81, 0x00,
-  0x05, 0x41, 0x50, 0x54, 0x15, 0x00,
-  0x18, 0x86, 0x21, 0x88, 0x62, 0x00,
-  0xc2, 0x30, 0x8c, 0x23, 0x08, 0x00,
-  0x22, 0x88, 0xa2, 0x28, 0x8a, 0x00,
-  0x50, 0x54, 0x15, 0x05, 0x41, 0x00,
-  0x46, 0x11, 0x84, 0x61, 0x18, 0x00,
-  0x33, 0x0c, 0xc3, 0x30, 0xcc, 0x00,
-  0x10, 0xc4, 0x31, 0x0c, 0x43, 0x00,
-  0x0c, 0x43, 0x10, 0xc4, 0x31, 0x00,
-  0x28, 0x8a, 0x22, 0x88, 0xa2, 0x00,
-  0x94, 0x25, 0x09, 0x42, 0x50, 0x00,
-  0xc1, 0x30, 0x4c, 0x13, 0x04, 0x00,
-  0x0e, 0x03, 0x80, 0xe0, 0x38, 0x00,
-  0x33, 0x0c, 0xc3, 0x30, 0xcc, 0x00,
-  0x10, 0xc4, 0x31, 0x0c, 0x43, 0x00,
-  0x45, 0x51, 0x54, 0x55, 0x15, 0x00,
-  0x88, 0xa2, 0x28, 0x8a, 0x22, 0x00,
-  0xe0, 0x38, 0x0e, 0x03, 0x80, 0x00,
-  0x56, 0x3e, 0x25, 0x63, 0xe2, 0x00,
-  0xe1, 0x47, 0x04, 0x05, 0x47, 0x00
-};
-
-const uint8_t kMaskRandom40_31[186] = {
-  0x46, 0x11, 0x84, 0x61, 0x18, 0x00,
-  0x33, 0x0c, 0xc3, 0x30, 0xcc, 0x00,
-  0x10, 0xc4, 0x31, 0x0c, 0x43, 0x00,
-  0x0c, 0x43, 0x10, 0xc4, 0x31, 0x00,
-  0x28, 0x8a, 0x22, 0x88, 0xa2, 0x00,
-  0x94, 0x25, 0x09, 0x42, 0x50, 0x00,
-  0xc1, 0x30, 0x4c, 0x13, 0x04, 0x00,
-  0x2c, 0x0b, 0x02, 0xc0, 0xb0, 0x00,
-  0x81, 0xa0, 0x68, 0x1a, 0x06, 0x00,
-  0xa0, 0x68, 0x1a, 0x06, 0x81, 0x00,
-  0x05, 0x41, 0x50, 0x54, 0x15, 0x00,
-  0x18, 0x86, 0x21, 0x88, 0x62, 0x00,
-  0xc2, 0x30, 0x8c, 0x23, 0x08, 0x00,
-  0x22, 0x88, 0xa2, 0x28, 0x8a, 0x00,
-  0x50, 0x54, 0x15, 0x05, 0x41, 0x00,
-  0x2c, 0x0b, 0x02, 0xc0, 0xb0, 0x00,
-  0x81, 0xa0, 0x68, 0x1a, 0x06, 0x00,
-  0xa0, 0x68, 0x1a, 0x06, 0x81, 0x00,
-  0x05, 0x41, 0x50, 0x54, 0x15, 0x00,
-  0x18, 0x86, 0x21, 0x88, 0x62, 0x00,
-  0xc2, 0x30, 0x8c, 0x23, 0x08, 0x00,
-  0x22, 0x88, 0xa2, 0x28, 0x8a, 0x00,
-  0x50, 0x54, 0x15, 0x05, 0x41, 0x00,
-  0x46, 0x11, 0x84, 0x61, 0x18, 0x00,
-  0x33, 0x0c, 0xc3, 0x30, 0xcc, 0x00,
-  0x10, 0xc4, 0x31, 0x0c, 0x43, 0x00,
-  0x0c, 0x43, 0x10, 0xc4, 0x31, 0x00,
-  0x28, 0x8a, 0x22, 0x88, 0xa2, 0x00,
-  0x94, 0x25, 0x09, 0x42, 0x50, 0x00,
-  0xc1, 0x30, 0x4c, 0x13, 0x04, 0x00,
-  0x28, 0x1c, 0x62, 0x81, 0xc6, 0x00
-};
-
-const uint8_t kMaskRandom40_32[192] = {
-  0x2c, 0x0b, 0x02, 0xc0, 0xb0, 0x00,
-  0x81, 0xa0, 0x68, 0x1a, 0x06, 0x00,
-  0xa0, 0x68, 0x1a, 0x06, 0x81, 0x00,
-  0x05, 0x41, 0x50, 0x54, 0x15, 0x00,
-  0x18, 0x86, 0x21, 0x88, 0x62, 0x00,
-  0xc2, 0x30, 0x8c, 0x23, 0x08, 0x00,
-  0x22, 0x88, 0xa2, 0x28, 0x8a, 0x00,
-  0x50, 0x54, 0x15, 0x05, 0x41, 0x00,
-  0x46, 0x11, 0x84, 0x61, 0x18, 0x00,
-  0x33, 0x0c, 0xc3, 0x30, 0xcc, 0x00,
-  0x10, 0xc4, 0x31, 0x0c, 0x43, 0x00,
-  0x0c, 0x43, 0x10, 0xc4, 0x31, 0x00,
-  0x28, 0x8a, 0x22, 0x88, 0xa2, 0x00,
-  0x94, 0x25, 0x09, 0x42, 0x50, 0x00,
-  0xc1, 0x30, 0x4c, 0x13, 0x04, 0x00,
-  0x28, 0x1c, 0x62, 0x81, 0xc6, 0x00,
-  0x46, 0x11, 0x84, 0x61, 0x18, 0x00,
-  0x33, 0x0c, 0xc3, 0x30, 0xcc, 0x00,
-  0x10, 0xc4, 0x31, 0x0c, 0x43, 0x00,
-  0x0c, 0x43, 0x10, 0xc4, 0x31, 0x00,
-  0x28, 0x8a, 0x22, 0x88, 0xa2, 0x00,
-  0x94, 0x25, 0x09, 0x42, 0x50, 0x00,
-  0xc1, 0x30, 0x4c, 0x13, 0x04, 0x00,
-  0x2c, 0x0b, 0x02, 0xc0, 0xb0, 0x00,
-  0x81, 0xa0, 0x68, 0x1a, 0x06, 0x00,
-  0xa0, 0x68, 0x1a, 0x06, 0x81, 0x00,
-  0x05, 0x41, 0x50, 0x54, 0x15, 0x00,
-  0x18, 0x86, 0x21, 0x88, 0x62, 0x00,
-  0xc2, 0x30, 0x8c, 0x23, 0x08, 0x00,
-  0x22, 0x88, 0xa2, 0x28, 0x8a, 0x00,
-  0x50, 0x54, 0x15, 0x05, 0x41, 0x00,
-  0x03, 0x0c, 0x46, 0x10, 0xc5, 0x00
-};
-
-const uint8_t kMaskRandom40_33[198] = {
-  0x2c, 0x0b, 0x02, 0xc0, 0xb0, 0x00,
-  0x81, 0xa0, 0x68, 0x1a, 0x06, 0x00,
-  0xa0, 0x68, 0x1a, 0x06, 0x81, 0x00,
-  0x05, 0x41, 0x50, 0x54, 0x15, 0x00,
-  0x18, 0x86, 0x21, 0x88, 0x62, 0x00,
-  0xc2, 0x30, 0x8c, 0x23, 0x08, 0x00,
-  0x22, 0x88, 0xa2, 0x28, 0x8a, 0x00,
-  0x50, 0x54, 0x15, 0x05, 0x41, 0x00,
-  0x46, 0x11, 0x84, 0x61, 0x18, 0x00,
-  0x33, 0x0c, 0xc3, 0x30, 0xcc, 0x00,
-  0x10, 0xc4, 0x31, 0x0c, 0x43, 0x00,
-  0x0c, 0x43, 0x10, 0xc4, 0x31, 0x00,
-  0x28, 0x8a, 0x22, 0x88, 0xa2, 0x00,
-  0x94, 0x25, 0x09, 0x42, 0x50, 0x00,
-  0xc1, 0x30, 0x4c, 0x13, 0x04, 0x00,
-  0x28, 0x1c, 0x62, 0x81, 0xc6, 0x00,
-  0x2c, 0x0b, 0x02, 0xc0, 0xb0, 0x00,
-  0x81, 0xa0, 0x68, 0x1a, 0x06, 0x00,
-  0xa0, 0x68, 0x1a, 0x06, 0x81, 0x00,
-  0x05, 0x41, 0x50, 0x54, 0x15, 0x00,
-  0x18, 0x86, 0x21, 0x88, 0x62, 0x00,
-  0xc2, 0x30, 0x8c, 0x23, 0x08, 0x00,
-  0x22, 0x88, 0xa2, 0x28, 0x8a, 0x00,
-  0x50, 0x54, 0x15, 0x05, 0x41, 0x00,
-  0x4e, 0x13, 0x84, 0xe1, 0x38, 0x00,
-  0xe3, 0x38, 0xce, 0x33, 0x8c, 0x00,
-  0x81, 0xe0, 0x78, 0x1e, 0x07, 0x00,
-  0x21, 0x48, 0x52, 0x14, 0x85, 0x00,
-  0x52, 0x94, 0xa5, 0x29, 0x4a, 0x00,
-  0xb4, 0x2d, 0x0b, 0x42, 0xd0, 0x00,
-  0x26, 0x89, 0xa2, 0x68, 0x9a, 0x00,
-  0x58, 0x56, 0x15, 0x85, 0x61, 0x00,
-  0x19, 0x86, 0x61, 0x98, 0x66, 0x00
-};
-
-const uint8_t kMaskRandom40_34[204] = {
-  0x2c, 0x0b, 0x02, 0xc0, 0xb0, 0x00,
-  0x81, 0xa0, 0x68, 0x1a, 0x06, 0x00,
-  0xa0, 0x68, 0x1a, 0x06, 0x81, 0x00,
-  0x05, 0x41, 0x50, 0x54, 0x15, 0x00,
-  0x18, 0x86, 0x21, 0x88, 0x62, 0x00,
-  0xc2, 0x30, 0x8c, 0x23, 0x08, 0x00,
-  0x22, 0x88, 0xa2, 0x28, 0x8a, 0x00,
-  0x50, 0x54, 0x15, 0x05, 0x41, 0x00,
-  0x4e, 0x13, 0x84, 0xe1, 0x38, 0x00,
-  0xe3, 0x38, 0xce, 0x33, 0x8c, 0x00,
-  0x81, 0xe0, 0x78, 0x1e, 0x07, 0x00,
-  0x21, 0x48, 0x52, 0x14, 0x85, 0x00,
-  0x52, 0x94, 0xa5, 0x29, 0x4a, 0x00,
-  0xb4, 0x2d, 0x0b, 0x42, 0xd0, 0x00,
-  0x26, 0x89, 0xa2, 0x68, 0x9a, 0x00,
-  0x58, 0x56, 0x15, 0x85, 0x61, 0x00,
-  0x19, 0x86, 0x61, 0x98, 0x66, 0x00,
-  0x2c, 0x0b, 0x02, 0xc0, 0xb0, 0x00,
-  0x81, 0xa0, 0x68, 0x1a, 0x06, 0x00,
-  0xa0, 0x68, 0x1a, 0x06, 0x81, 0x00,
-  0x05, 0x41, 0x50, 0x54, 0x15, 0x00,
-  0x18, 0x86, 0x21, 0x88, 0x62, 0x00,
-  0xc2, 0x30, 0x8c, 0x23, 0x08, 0x00,
-  0x22, 0x88, 0xa2, 0x28, 0x8a, 0x00,
-  0x50, 0x54, 0x15, 0x05, 0x41, 0x00,
-  0x46, 0x11, 0x84, 0x61, 0x18, 0x00,
-  0x33, 0x0c, 0xc3, 0x30, 0xcc, 0x00,
-  0x10, 0xc4, 0x31, 0x0c, 0x43, 0x00,
-  0x0c, 0x43, 0x10, 0xc4, 0x31, 0x00,
-  0x28, 0x8a, 0x22, 0x88, 0xa2, 0x00,
-  0x94, 0x25, 0x09, 0x42, 0x50, 0x00,
-  0xc1, 0x30, 0x4c, 0x13, 0x04, 0x00,
-  0x28, 0x1c, 0x62, 0x81, 0xc6, 0x00,
-  0x87, 0x3c, 0x08, 0x19, 0x31, 0x00
-};
-
-const uint8_t kMaskRandom40_35[210] = {
-  0x2c, 0x0b, 0x02, 0xc0, 0xb0, 0x00,
-  0x81, 0xa0, 0x68, 0x1a, 0x06, 0x00,
-  0xa0, 0x68, 0x1a, 0x06, 0x81, 0x00,
-  0x05, 0x41, 0x50, 0x54, 0x15, 0x00,
-  0x18, 0x86, 0x21, 0x88, 0x62, 0x00,
-  0xc2, 0x30, 0x8c, 0x23, 0x08, 0x00,
-  0x22, 0x88, 0xa2, 0x28, 0x8a, 0x00,
-  0x50, 0x54, 0x15, 0x05, 0x41, 0x00,
-  0x4e, 0x13, 0x84, 0xe1, 0x38, 0x00,
-  0xe3, 0x38, 0xce, 0x33, 0x8c, 0x00,
-  0x81, 0xe0, 0x78, 0x1e, 0x07, 0x00,
-  0x21, 0x48, 0x52, 0x14, 0x85, 0x00,
-  0x52, 0x94, 0xa5, 0x29, 0x4a, 0x00,
-  0xb4, 0x2d, 0x0b, 0x42, 0xd0, 0x00,
-  0x26, 0x89, 0xa2, 0x68, 0x9a, 0x00,
-  0x58, 0x56, 0x15, 0x85, 0x61, 0x00,
-  0x19, 0x86, 0x61, 0x98, 0x66, 0x00,
-  0x4e, 0x13, 0x84, 0xe1, 0x38, 0x00,
-  0xe3, 0x38, 0xce, 0x33, 0x8c, 0x00,
-  0x81, 0xe0, 0x78, 0x1e, 0x07, 0x00,
-  0x21, 0x48, 0x52, 0x14, 0x85, 0x00,
-  0x52, 0x94, 0xa5, 0x29, 0x4a, 0x00,
-  0xb4, 0x2d, 0x0b, 0x42, 0xd0, 0x00,
-  0x26, 0x89, 0xa2, 0x68, 0x9a, 0x00,
-  0x58, 0x56, 0x15, 0x85, 0x61, 0x00,
-  0x19, 0x86, 0x61, 0x98, 0x66, 0x00,
-  0x2c, 0x0b, 0x02, 0xc0, 0xb0, 0x00,
-  0x81, 0xa0, 0x68, 0x1a, 0x06, 0x00,
-  0xa0, 0x68, 0x1a, 0x06, 0x81, 0x00,
-  0x05, 0x41, 0x50, 0x54, 0x15, 0x00,
-  0x18, 0x86, 0x21, 0x88, 0x62, 0x00,
-  0xc2, 0x30, 0x8c, 0x23, 0x08, 0x00,
-  0x22, 0x88, 0xa2, 0x28, 0x8a, 0x00,
-  0x50, 0x54, 0x15, 0x05, 0x41, 0x00,
-  0x21, 0x7b, 0xf2, 0x17, 0xbf, 0x00
-};
-
-const uint8_t kMaskRandom40_36[216] = {
-  0x4e, 0x13, 0x84, 0xe1, 0x38, 0x00,
-  0xe3, 0x38, 0xce, 0x33, 0x8c, 0x00,
-  0x81, 0xe0, 0x78, 0x1e, 0x07, 0x00,
-  0x21, 0x48, 0x52, 0x14, 0x85, 0x00,
-  0x52, 0x94, 0xa5, 0x29, 0x4a, 0x00,
-  0xb4, 0x2d, 0x0b, 0x42, 0xd0, 0x00,
-  0x26, 0x89, 0xa2, 0x68, 0x9a, 0x00,
-  0x58, 0x56, 0x15, 0x85, 0x61, 0x00,
-  0x19, 0x86, 0x61, 0x98, 0x66, 0x00,
-  0x2c, 0x0b, 0x02, 0xc0, 0xb0, 0x00,
-  0x81, 0xa0, 0x68, 0x1a, 0x06, 0x00,
-  0xa0, 0x68, 0x1a, 0x06, 0x81, 0x00,
-  0x05, 0x41, 0x50, 0x54, 0x15, 0x00,
-  0x18, 0x86, 0x21, 0x88, 0x62, 0x00,
-  0xc2, 0x30, 0x8c, 0x23, 0x08, 0x00,
-  0x22, 0x88, 0xa2, 0x28, 0x8a, 0x00,
-  0x50, 0x54, 0x15, 0x05, 0x41, 0x00,
-  0x21, 0x7b, 0xf2, 0x17, 0xbf, 0x00,
-  0x2c, 0x0b, 0x02, 0xc0, 0xb0, 0x00,
-  0x81, 0xa0, 0x68, 0x1a, 0x06, 0x00,
-  0xa0, 0x68, 0x1a, 0x06, 0x81, 0x00,
-  0x05, 0x41, 0x50, 0x54, 0x15, 0x00,
-  0x18, 0x86, 0x21, 0x88, 0x62, 0x00,
-  0xc2, 0x30, 0x8c, 0x23, 0x08, 0x00,
-  0x22, 0x88, 0xa2, 0x28, 0x8a, 0x00,
-  0x50, 0x54, 0x15, 0x05, 0x41, 0x00,
-  0x4e, 0x13, 0x84, 0xe1, 0x38, 0x00,
-  0xe3, 0x38, 0xce, 0x33, 0x8c, 0x00,
-  0x81, 0xe0, 0x78, 0x1e, 0x07, 0x00,
-  0x21, 0x48, 0x52, 0x14, 0x85, 0x00,
-  0x52, 0x94, 0xa5, 0x29, 0x4a, 0x00,
-  0xb4, 0x2d, 0x0b, 0x42, 0xd0, 0x00,
-  0x26, 0x89, 0xa2, 0x68, 0x9a, 0x00,
-  0x58, 0x56, 0x15, 0x85, 0x61, 0x00,
-  0x19, 0x86, 0x61, 0x98, 0x66, 0x00,
-  0x1e, 0xb9, 0x3d, 0x25, 0xcc, 0x00
-};
-
-const uint8_t kMaskRandom40_37[222] = {
-  0x4e, 0x13, 0x84, 0xe1, 0x38, 0x00,
-  0xe3, 0x38, 0xce, 0x33, 0x8c, 0x00,
-  0x81, 0xe0, 0x78, 0x1e, 0x07, 0x00,
-  0x21, 0x48, 0x52, 0x14, 0x85, 0x00,
-  0x52, 0x94, 0xa5, 0x29, 0x4a, 0x00,
-  0xb4, 0x2d, 0x0b, 0x42, 0xd0, 0x00,
-  0x26, 0x89, 0xa2, 0x68, 0x9a, 0x00,
-  0x58, 0x56, 0x15, 0x85, 0x61, 0x00,
-  0x19, 0x86, 0x61, 0x98, 0x66, 0x00,
-  0x2c, 0x0b, 0x02, 0xc0, 0xb0, 0x00,
-  0x81, 0xa0, 0x68, 0x1a, 0x06, 0x00,
-  0xa0, 0x68, 0x1a, 0x06, 0x81, 0x00,
-  0x05, 0x41, 0x50, 0x54, 0x15, 0x00,
-  0x18, 0x86, 0x21, 0x88, 0x62, 0x00,
-  0xc2, 0x30, 0x8c, 0x23, 0x08, 0x00,
-  0x22, 0x88, 0xa2, 0x28, 0x8a, 0x00,
-  0x50, 0x54, 0x15, 0x05, 0x41, 0x00,
-  0x21, 0x7b, 0xf2, 0x17, 0xbf, 0x00,
-  0x4e, 0x13, 0x84, 0xe1, 0x38, 0x00,
-  0xe3, 0x38, 0xce, 0x33, 0x8c, 0x00,
-  0x81, 0xe0, 0x78, 0x1e, 0x07, 0x00,
-  0x21, 0x48, 0x52, 0x14, 0x85, 0x00,
-  0x52, 0x94, 0xa5, 0x29, 0x4a, 0x00,
-  0xb4, 0x2d, 0x0b, 0x42, 0xd0, 0x00,
-  0x26, 0x89, 0xa2, 0x68, 0x9a, 0x00,
-  0x58, 0x56, 0x15, 0x85, 0x61, 0x00,
-  0x19, 0x86, 0x61, 0x98, 0x66, 0x00,
-  0x4c, 0x13, 0x04, 0xc1, 0x30, 0x00,
-  0x51, 0x14, 0x45, 0x11, 0x44, 0x00,
-  0xa0, 0x68, 0x1a, 0x06, 0x81, 0x00,
-  0x04, 0xc1, 0x30, 0x4c, 0x13, 0x00,
-  0x03, 0x80, 0xe0, 0x38, 0x0e, 0x00,
-  0x86, 0x21, 0x88, 0x62, 0x18, 0x00,
-  0x29, 0x0a, 0x42, 0x90, 0xa4, 0x00,
-  0x42, 0x50, 0x94, 0x25, 0x09, 0x00,
-  0x98, 0x26, 0x09, 0x82, 0x60, 0x00,
-  0x30, 0x8c, 0x23, 0x08, 0xc2, 0x00
-};
-
-const uint8_t kMaskRandom40_38[228] = {
-  0x4e, 0x13, 0x84, 0xe1, 0x38, 0x00,
-  0xe3, 0x38, 0xce, 0x33, 0x8c, 0x00,
-  0x81, 0xe0, 0x78, 0x1e, 0x07, 0x00,
-  0x21, 0x48, 0x52, 0x14, 0x85, 0x00,
-  0x52, 0x94, 0xa5, 0x29, 0x4a, 0x00,
-  0xb4, 0x2d, 0x0b, 0x42, 0xd0, 0x00,
-  0x26, 0x89, 0xa2, 0x68, 0x9a, 0x00,
-  0x58, 0x56, 0x15, 0x85, 0x61, 0x00,
-  0x19, 0x86, 0x61, 0x98, 0x66, 0x00,
-  0x4c, 0x13, 0x04, 0xc1, 0x30, 0x00,
-  0x51, 0x14, 0x45, 0x11, 0x44, 0x00,
-  0xa0, 0x68, 0x1a, 0x06, 0x81, 0x00,
-  0x04, 0xc1, 0x30, 0x4c, 0x13, 0x00,
-  0x03, 0x80, 0xe0, 0x38, 0x0e, 0x00,
-  0x86, 0x21, 0x88, 0x62, 0x18, 0x00,
-  0x29, 0x0a, 0x42, 0x90, 0xa4, 0x00,
-  0x42, 0x50, 0x94, 0x25, 0x09, 0x00,
-  0x98, 0x26, 0x09, 0x82, 0x60, 0x00,
-  0x30, 0x8c, 0x23, 0x08, 0xc2, 0x00,
-  0x4e, 0x13, 0x84, 0xe1, 0x38, 0x00,
-  0xe3, 0x38, 0xce, 0x33, 0x8c, 0x00,
-  0x81, 0xe0, 0x78, 0x1e, 0x07, 0x00,
-  0x21, 0x48, 0x52, 0x14, 0x85, 0x00,
-  0x52, 0x94, 0xa5, 0x29, 0x4a, 0x00,
-  0xb4, 0x2d, 0x0b, 0x42, 0xd0, 0x00,
-  0x26, 0x89, 0xa2, 0x68, 0x9a, 0x00,
-  0x58, 0x56, 0x15, 0x85, 0x61, 0x00,
-  0x19, 0x86, 0x61, 0x98, 0x66, 0x00,
-  0x2c, 0x0b, 0x02, 0xc0, 0xb0, 0x00,
-  0x81, 0xa0, 0x68, 0x1a, 0x06, 0x00,
-  0xa0, 0x68, 0x1a, 0x06, 0x81, 0x00,
-  0x05, 0x41, 0x50, 0x54, 0x15, 0x00,
-  0x18, 0x86, 0x21, 0x88, 0x62, 0x00,
-  0xc2, 0x30, 0x8c, 0x23, 0x08, 0x00,
-  0x22, 0x88, 0xa2, 0x28, 0x8a, 0x00,
-  0x50, 0x54, 0x15, 0x05, 0x41, 0x00,
-  0x21, 0x7b, 0xf2, 0x17, 0xbf, 0x00,
-  0xea, 0xaa, 0x20, 0xa2, 0x1b, 0x00
-};
-
-const uint8_t kMaskRandom40_39[234] = {
-  0x4e, 0x13, 0x84, 0xe1, 0x38, 0x00,
-  0xe3, 0x38, 0xce, 0x33, 0x8c, 0x00,
-  0x81, 0xe0, 0x78, 0x1e, 0x07, 0x00,
-  0x21, 0x48, 0x52, 0x14, 0x85, 0x00,
-  0x52, 0x94, 0xa5, 0x29, 0x4a, 0x00,
-  0xb4, 0x2d, 0x0b, 0x42, 0xd0, 0x00,
-  0x26, 0x89, 0xa2, 0x68, 0x9a, 0x00,
-  0x58, 0x56, 0x15, 0x85, 0x61, 0x00,
-  0x19, 0x86, 0x61, 0x98, 0x66, 0x00,
-  0x4c, 0x13, 0x04, 0xc1, 0x30, 0x00,
-  0x51, 0x14, 0x45, 0x11, 0x44, 0x00,
-  0xa0, 0x68, 0x1a, 0x06, 0x81, 0x00,
-  0x04, 0xc1, 0x30, 0x4c, 0x13, 0x00,
-  0x03, 0x80, 0xe0, 0x38, 0x0e, 0x00,
-  0x86, 0x21, 0x88, 0x62, 0x18, 0x00,
-  0x29, 0x0a, 0x42, 0x90, 0xa4, 0x00,
-  0x42, 0x50, 0x94, 0x25, 0x09, 0x00,
-  0x98, 0x26, 0x09, 0x82, 0x60, 0x00,
-  0x30, 0x8c, 0x23, 0x08, 0xc2, 0x00,
-  0x4c, 0x13, 0x04, 0xc1, 0x30, 0x00,
-  0x51, 0x14, 0x45, 0x11, 0x44, 0x00,
-  0xa0, 0x68, 0x1a, 0x06, 0x81, 0x00,
-  0x04, 0xc1, 0x30, 0x4c, 0x13, 0x00,
-  0x03, 0x80, 0xe0, 0x38, 0x0e, 0x00,
-  0x86, 0x21, 0x88, 0x62, 0x18, 0x00,
-  0x29, 0x0a, 0x42, 0x90, 0xa4, 0x00,
-  0x42, 0x50, 0x94, 0x25, 0x09, 0x00,
-  0x98, 0x26, 0x09, 0x82, 0x60, 0x00,
-  0x30, 0x8c, 0x23, 0x08, 0xc2, 0x00,
-  0x4e, 0x13, 0x84, 0xe1, 0x38, 0x00,
-  0xe3, 0x38, 0xce, 0x33, 0x8c, 0x00,
-  0x81, 0xe0, 0x78, 0x1e, 0x07, 0x00,
-  0x21, 0x48, 0x52, 0x14, 0x85, 0x00,
-  0x52, 0x94, 0xa5, 0x29, 0x4a, 0x00,
-  0xb4, 0x2d, 0x0b, 0x42, 0xd0, 0x00,
-  0x26, 0x89, 0xa2, 0x68, 0x9a, 0x00,
-  0x58, 0x56, 0x15, 0x85, 0x61, 0x00,
-  0x19, 0x86, 0x61, 0x98, 0x66, 0x00,
-  0xf7, 0x8d, 0xaf, 0x78, 0xda, 0x00
-};
-
-const uint8_t kMaskRandom40_4[24] = {
-  0xe6, 0x39, 0x8e, 0x63, 0x98, 0x00,
-  0x33, 0x8c, 0xe3, 0x38, 0xce, 0x00,
-  0x98, 0xe6, 0x39, 0x8e, 0x63, 0x00,
-  0x2d, 0x4b, 0x52, 0xd4, 0xb5, 0x00
-};
-
-const uint8_t kMaskRandom40_40[240] = {
-  0x4c, 0x13, 0x04, 0xc1, 0x30, 0x00,
-  0x51, 0x14, 0x45, 0x11, 0x44, 0x00,
-  0xa0, 0x68, 0x1a, 0x06, 0x81, 0x00,
-  0x04, 0xc1, 0x30, 0x4c, 0x13, 0x00,
-  0x03, 0x80, 0xe0, 0x38, 0x0e, 0x00,
-  0x86, 0x21, 0x88, 0x62, 0x18, 0x00,
-  0x29, 0x0a, 0x42, 0x90, 0xa4, 0x00,
-  0x42, 0x50, 0x94, 0x25, 0x09, 0x00,
-  0x98, 0x26, 0x09, 0x82, 0x60, 0x00,
-  0x30, 0x8c, 0x23, 0x08, 0xc2, 0x00,
-  0x4e, 0x13, 0x84, 0xe1, 0x38, 0x00,
-  0xe3, 0x38, 0xce, 0x33, 0x8c, 0x00,
-  0x81, 0xe0, 0x78, 0x1e, 0x07, 0x00,
-  0x21, 0x48, 0x52, 0x14, 0x85, 0x00,
-  0x52, 0x94, 0xa5, 0x29, 0x4a, 0x00,
-  0xb4, 0x2d, 0x0b, 0x42, 0xd0, 0x00,
-  0x26, 0x89, 0xa2, 0x68, 0x9a, 0x00,
-  0x58, 0x56, 0x15, 0x85, 0x61, 0x00,
-  0x19, 0x86, 0x61, 0x98, 0x66, 0x00,
-  0xf7, 0x8d, 0xaf, 0x78, 0xda, 0x00,
-  0x4e, 0x13, 0x84, 0xe1, 0x38, 0x00,
-  0xe3, 0x38, 0xce, 0x33, 0x8c, 0x00,
-  0x81, 0xe0, 0x78, 0x1e, 0x07, 0x00,
-  0x21, 0x48, 0x52, 0x14, 0x85, 0x00,
-  0x52, 0x94, 0xa5, 0x29, 0x4a, 0x00,
-  0xb4, 0x2d, 0x0b, 0x42, 0xd0, 0x00,
-  0x26, 0x89, 0xa2, 0x68, 0x9a, 0x00,
-  0x58, 0x56, 0x15, 0x85, 0x61, 0x00,
-  0x19, 0x86, 0x61, 0x98, 0x66, 0x00,
-  0x4c, 0x13, 0x04, 0xc1, 0x30, 0x00,
-  0x51, 0x14, 0x45, 0x11, 0x44, 0x00,
-  0xa0, 0x68, 0x1a, 0x06, 0x81, 0x00,
-  0x04, 0xc1, 0x30, 0x4c, 0x13, 0x00,
-  0x03, 0x80, 0xe0, 0x38, 0x0e, 0x00,
-  0x86, 0x21, 0x88, 0x62, 0x18, 0x00,
-  0x29, 0x0a, 0x42, 0x90, 0xa4, 0x00,
-  0x42, 0x50, 0x94, 0x25, 0x09, 0x00,
-  0x98, 0x26, 0x09, 0x82, 0x60, 0x00,
-  0x30, 0x8c, 0x23, 0x08, 0xc2, 0x00,
-  0xa6, 0xf3, 0xab, 0x1b, 0x87, 0x00
-};
-
-const uint8_t kMaskRandom40_5[30] = {
-  0xce, 0x33, 0x8c, 0xe3, 0x38, 0x00,
-  0x63, 0x98, 0xe6, 0x39, 0x8e, 0x00,
-  0x98, 0xe5, 0x39, 0x8e, 0x53, 0x00,
-  0x2b, 0x53, 0x52, 0xb5, 0x35, 0x00,
-  0xb4, 0x5c, 0xab, 0x45, 0xca, 0x00
-};
-
-const uint8_t kMaskRandom40_6[36] = {
-  0x4c, 0x1b, 0x04, 0xc1, 0xb0, 0x00,
-  0x51, 0x34, 0x45, 0x13, 0x44, 0x00,
-  0x20, 0xe8, 0x32, 0x0e, 0x83, 0x00,
-  0x85, 0x41, 0x58, 0x54, 0x15, 0x00,
-  0x06, 0x86, 0xa0, 0x68, 0x6a, 0x00,
-  0x9a, 0x21, 0x89, 0xa2, 0x18, 0x00
-};
-
-const uint8_t kMaskRandom40_7[42] = {
-  0x4e, 0x11, 0x84, 0xe1, 0x18, 0x00,
-  0x33, 0x2c, 0x03, 0x32, 0xc0, 0x00,
-  0x10, 0x0e, 0xb1, 0x00, 0xeb, 0x00,
-  0x81, 0x51, 0x58, 0x15, 0x15, 0x00,
-  0x24, 0xc4, 0xa2, 0x4c, 0x4a, 0x00,
-  0xd4, 0x23, 0x0d, 0x42, 0x30, 0x00,
-  0x0c, 0xa2, 0x60, 0xca, 0x26, 0x00
-};
-
-const uint8_t kMaskRandom40_8[48] = {
-  0x27, 0x09, 0xc2, 0x70, 0x9c, 0x00,
-  0x89, 0xa2, 0x68, 0x9a, 0x26, 0x00,
-  0xd0, 0x74, 0x1d, 0x07, 0x41, 0x00,
-  0x24, 0xc9, 0x32, 0x4c, 0x93, 0x00,
-  0xe2, 0x90, 0xae, 0x29, 0x0a, 0x00,
-  0xc6, 0x31, 0x8c, 0x63, 0x18, 0x00,
-  0x31, 0x8c, 0x63, 0x18, 0xc6, 0x00,
-  0x18, 0xc6, 0x31, 0x8c, 0x63, 0x00
-};
-
-const uint8_t kMaskRandom40_9[54] = {
-  0x4e, 0x13, 0x84, 0xe1, 0x38, 0x00,
-  0x62, 0x38, 0xc6, 0x23, 0x8c, 0x00,
-  0x81, 0xe0, 0x78, 0x1e, 0x07, 0x00,
-  0xe1, 0x48, 0x5e, 0x14, 0x85, 0x00,
-  0x13, 0x94, 0xa1, 0x39, 0x4a, 0x00,
-  0xb4, 0x2d, 0x0b, 0x42, 0xd0, 0x00,
-  0x26, 0x89, 0xa2, 0x68, 0x9a, 0x00,
-  0x58, 0x56, 0x15, 0x85, 0x61, 0x00,
-  0x49, 0x86, 0x54, 0x98, 0x65, 0x00
-};
-
-const uint8_t kMaskRandom41_1[6] = {
-  0xff, 0xff, 0xff, 0xff, 0xff, 0x80
-};
-
-const uint8_t kMaskRandom41_10[60] = {
-  0x4c, 0x13, 0x04, 0xc1, 0x91, 0x00,
-  0x51, 0x14, 0x45, 0x11, 0x45, 0x00,
-  0xa0, 0x68, 0x1a, 0x06, 0xa4, 0x00,
-  0x04, 0xc1, 0x30, 0x4c, 0x13, 0x00,
-  0x03, 0x80, 0xe0, 0x3b, 0x40, 0x00,
-  0x86, 0x21, 0x88, 0x62, 0x09, 0x00,
-  0x29, 0x0a, 0x42, 0x90, 0x84, 0x80,
-  0x42, 0x50, 0x94, 0x24, 0x30, 0x80,
-  0x98, 0x26, 0x09, 0x81, 0x28, 0x00,
-  0x30, 0x8c, 0x23, 0x08, 0x4a, 0x80
-};
-
-const uint8_t kMaskRandom41_11[66] = {
-  0xc6, 0x31, 0x8c, 0x62, 0x1a, 0x00,
-  0x23, 0x88, 0xe2, 0x38, 0x8c, 0x80,
-  0x1a, 0x46, 0x91, 0xa4, 0x58, 0x80,
-  0x24, 0xc9, 0x32, 0x4d, 0x30, 0x80,
-  0x71, 0x1c, 0x47, 0x11, 0x07, 0x00,
-  0x0e, 0x03, 0x80, 0xe1, 0x91, 0x00,
-  0x33, 0x0c, 0xc3, 0x31, 0x45, 0x00,
-  0x10, 0xc4, 0x31, 0x0c, 0x32, 0x80,
-  0x45, 0x51, 0x54, 0x56, 0x84, 0x80,
-  0x88, 0xa2, 0x28, 0x88, 0x4a, 0x80,
-  0xe0, 0x38, 0x0e, 0x02, 0x29, 0x00
-};
-
-const uint8_t kMaskRandom41_12[72] = {
-  0x0e, 0x03, 0x80, 0xe1, 0x91, 0x00,
-  0x33, 0x0c, 0xc3, 0x31, 0x45, 0x00,
-  0x10, 0xc4, 0x31, 0x0c, 0x32, 0x80,
-  0x45, 0x51, 0x54, 0x56, 0x84, 0x80,
-  0x88, 0xa2, 0x28, 0x88, 0x4a, 0x80,
-  0xe0, 0x38, 0x0e, 0x02, 0x29, 0x00,
-  0xc6, 0x31, 0x8c, 0x62, 0x1a, 0x00,
-  0x23, 0x88, 0xe2, 0x38, 0x8c, 0x80,
-  0x1a, 0x46, 0x91, 0xa4, 0x58, 0x80,
-  0x24, 0xc9, 0x32, 0x4d, 0x30, 0x80,
-  0x71, 0x1c, 0x47, 0x11, 0x07, 0x00,
-  0xf5, 0xdc, 0x4a, 0x06, 0x51, 0x80
-};
-
-const uint8_t kMaskRandom41_13[78] = {
-  0x0e, 0x03, 0x80, 0xe1, 0x91, 0x00,
-  0x33, 0x0c, 0xc3, 0x31, 0x45, 0x00,
-  0x10, 0xc4, 0x31, 0x0c, 0x32, 0x80,
-  0x45, 0x51, 0x54, 0x56, 0x84, 0x80,
-  0x88, 0xa2, 0x28, 0x88, 0x4a, 0x80,
-  0xe0, 0x38, 0x0e, 0x02, 0x29, 0x00,
-  0x46, 0x11, 0x84, 0x61, 0x19, 0x00,
-  0x33, 0x0c, 0xc3, 0x30, 0xcc, 0x80,
-  0x10, 0xc4, 0x31, 0x0e, 0x46, 0x00,
-  0x0c, 0x43, 0x10, 0xc6, 0x90, 0x80,
-  0x28, 0x8a, 0x22, 0x89, 0x42, 0x80,
-  0x94, 0x25, 0x09, 0x42, 0x13, 0x00,
-  0xc1, 0x30, 0x4c, 0x10, 0x25, 0x80
-};
-
-const uint8_t kMaskRandom41_14[84] = {
-  0x46, 0x11, 0x84, 0x61, 0x19, 0x00,
-  0x33, 0x0c, 0xc3, 0x30, 0xcc, 0x80,
-  0x10, 0xc4, 0x31, 0x0e, 0x46, 0x00,
-  0x0c, 0x43, 0x10, 0xc6, 0x90, 0x80,
-  0x28, 0x8a, 0x22, 0x89, 0x42, 0x80,
-  0x94, 0x25, 0x09, 0x42, 0x13, 0x00,
-  0xc1, 0x30, 0x4c, 0x10, 0x25, 0x80,
-  0x0e, 0x03, 0x80, 0xe1, 0x91, 0x00,
-  0x33, 0x0c, 0xc3, 0x31, 0x45, 0x00,
-  0x10, 0xc4, 0x31, 0x0c, 0x32, 0x80,
-  0x45, 0x51, 0x54, 0x56, 0x84, 0x80,
-  0x88, 0xa2, 0x28, 0x88, 0x4a, 0x80,
-  0xe0, 0x38, 0x0e, 0x02, 0x29, 0x00,
-  0x56, 0x3e, 0x24, 0xdd, 0x0c, 0x00
-};
-
-const uint8_t kMaskRandom41_15[90] = {
-  0x46, 0x11, 0x84, 0x61, 0x19, 0x00,
-  0x33, 0x0c, 0xc3, 0x30, 0xcc, 0x80,
-  0x10, 0xc4, 0x31, 0x0e, 0x46, 0x00,
-  0x0c, 0x43, 0x10, 0xc6, 0x90, 0x80,
-  0x28, 0x8a, 0x22, 0x89, 0x42, 0x80,
-  0x94, 0x25, 0x09, 0x42, 0x13, 0x00,
-  0xc1, 0x30, 0x4c, 0x10, 0x25, 0x80,
-  0x2c, 0x0b, 0x02, 0xc0, 0x32, 0x00,
-  0x81, 0xa0, 0x68, 0x1a, 0x01, 0x80,
-  0xa0, 0x68, 0x1a, 0x06, 0x82, 0x00,
-  0x05, 0x41, 0x50, 0x54, 0x15, 0x00,
-  0x18, 0x86, 0x21, 0x89, 0x0c, 0x00,
-  0xc2, 0x30, 0x8c, 0x20, 0x68, 0x00,
-  0x22, 0x88, 0xa2, 0x29, 0x80, 0x80,
-  0x50, 0x54, 0x15, 0x04, 0x50, 0x80
-};
-
-const uint8_t kMaskRandom41_16[96] = {
-  0x2c, 0x0b, 0x02, 0xc0, 0x32, 0x00,
-  0x81, 0xa0, 0x68, 0x1a, 0x01, 0x80,
-  0xa0, 0x68, 0x1a, 0x06, 0x82, 0x00,
-  0x05, 0x41, 0x50, 0x54, 0x15, 0x00,
-  0x18, 0x86, 0x21, 0x89, 0x0c, 0x00,
-  0xc2, 0x30, 0x8c, 0x20, 0x68, 0x00,
-  0x22, 0x88, 0xa2, 0x29, 0x80, 0x80,
-  0x50, 0x54, 0x15, 0x04, 0x50, 0x80,
-  0x46, 0x11, 0x84, 0x61, 0x19, 0x00,
-  0x33, 0x0c, 0xc3, 0x30, 0xcc, 0x80,
-  0x10, 0xc4, 0x31, 0x0e, 0x46, 0x00,
-  0x0c, 0x43, 0x10, 0xc6, 0x90, 0x80,
-  0x28, 0x8a, 0x22, 0x89, 0x42, 0x80,
-  0x94, 0x25, 0x09, 0x42, 0x13, 0x00,
-  0xc1, 0x30, 0x4c, 0x10, 0x25, 0x80,
-  0x28, 0x1c, 0x63, 0xbf, 0x53, 0x80
-};
-
-const uint8_t kMaskRandom41_17[102] = {
-  0x2c, 0x0b, 0x02, 0xc0, 0x32, 0x00,
-  0x81, 0xa0, 0x68, 0x1a, 0x01, 0x80,
-  0xa0, 0x68, 0x1a, 0x06, 0x82, 0x00,
-  0x05, 0x41, 0x50, 0x54, 0x15, 0x00,
-  0x18, 0x86, 0x21, 0x89, 0x0c, 0x00,
-  0xc2, 0x30, 0x8c, 0x20, 0x68, 0x00,
-  0x22, 0x88, 0xa2, 0x29, 0x80, 0x80,
-  0x50, 0x54, 0x15, 0x04, 0x50, 0x80,
-  0x4e, 0x13, 0x84, 0xe1, 0x19, 0x00,
-  0xe3, 0x38, 0xce, 0x31, 0x89, 0x80,
-  0x81, 0xe0, 0x78, 0x1e, 0x30, 0x00,
-  0x21, 0x48, 0x52, 0x14, 0x05, 0x80,
-  0x52, 0x94, 0xa5, 0x28, 0x1e, 0x00,
-  0xb4, 0x2d, 0x0b, 0x42, 0x82, 0x00,
-  0x26, 0x89, 0xa2, 0x68, 0x62, 0x80,
-  0x58, 0x56, 0x15, 0x86, 0x44, 0x00,
-  0x19, 0x86, 0x61, 0x99, 0xe0, 0x00
-};
-
-const uint8_t kMaskRandom41_18[108] = {
-  0x4e, 0x13, 0x84, 0xe1, 0x19, 0x00,
-  0xe3, 0x38, 0xce, 0x31, 0x89, 0x80,
-  0x81, 0xe0, 0x78, 0x1e, 0x30, 0x00,
-  0x21, 0x48, 0x52, 0x14, 0x05, 0x80,
-  0x52, 0x94, 0xa5, 0x28, 0x1e, 0x00,
-  0xb4, 0x2d, 0x0b, 0x42, 0x82, 0x00,
-  0x26, 0x89, 0xa2, 0x68, 0x62, 0x80,
-  0x58, 0x56, 0x15, 0x86, 0x44, 0x00,
-  0x19, 0x86, 0x61, 0x99, 0xe0, 0x00,
-  0x2c, 0x0b, 0x02, 0xc0, 0x32, 0x00,
-  0x81, 0xa0, 0x68, 0x1a, 0x01, 0x80,
-  0xa0, 0x68, 0x1a, 0x06, 0x82, 0x00,
-  0x05, 0x41, 0x50, 0x54, 0x15, 0x00,
-  0x18, 0x86, 0x21, 0x89, 0x0c, 0x00,
-  0xc2, 0x30, 0x8c, 0x20, 0x68, 0x00,
-  0x22, 0x88, 0xa2, 0x29, 0x80, 0x80,
-  0x50, 0x54, 0x15, 0x04, 0x50, 0x80,
-  0x21, 0x7b, 0xf5, 0xa5, 0x65, 0x80
-};
-
-const uint8_t kMaskRandom41_19[114] = {
-  0x4e, 0x13, 0x84, 0xe1, 0x19, 0x00,
-  0xe3, 0x38, 0xce, 0x31, 0x89, 0x80,
-  0x81, 0xe0, 0x78, 0x1e, 0x30, 0x00,
-  0x21, 0x48, 0x52, 0x14, 0x05, 0x80,
-  0x52, 0x94, 0xa5, 0x28, 0x1e, 0x00,
-  0xb4, 0x2d, 0x0b, 0x42, 0x82, 0x00,
-  0x26, 0x89, 0xa2, 0x68, 0x62, 0x80,
-  0x58, 0x56, 0x15, 0x86, 0x44, 0x00,
-  0x19, 0x86, 0x61, 0x99, 0xe0, 0x00,
-  0x4c, 0x13, 0x04, 0xc1, 0x91, 0x00,
-  0x51, 0x14, 0x45, 0x11, 0x45, 0x00,
-  0xa0, 0x68, 0x1a, 0x06, 0xa4, 0x00,
-  0x04, 0xc1, 0x30, 0x4c, 0x13, 0x00,
-  0x03, 0x80, 0xe0, 0x3b, 0x40, 0x00,
-  0x86, 0x21, 0x88, 0x62, 0x09, 0x00,
-  0x29, 0x0a, 0x42, 0x90, 0x84, 0x80,
-  0x42, 0x50, 0x94, 0x24, 0x30, 0x80,
-  0x98, 0x26, 0x09, 0x81, 0x28, 0x00,
-  0x30, 0x8c, 0x23, 0x08, 0x4a, 0x80
-};
-
-const uint8_t kMaskRandom41_2[12] = {
-  0xee, 0x3b, 0x8e, 0xe3, 0xb3, 0x00,
-  0x99, 0xe6, 0x79, 0x9e, 0x6e, 0x80
-};
-
-const uint8_t kMaskRandom41_20[120] = {
-  0x4c, 0x13, 0x04, 0xc1, 0x91, 0x00,
-  0x51, 0x14, 0x45, 0x11, 0x45, 0x00,
-  0xa0, 0x68, 0x1a, 0x06, 0xa4, 0x00,
-  0x04, 0xc1, 0x30, 0x4c, 0x13, 0x00,
-  0x03, 0x80, 0xe0, 0x3b, 0x40, 0x00,
-  0x86, 0x21, 0x88, 0x62, 0x09, 0x00,
-  0x29, 0x0a, 0x42, 0x90, 0x84, 0x80,
-  0x42, 0x50, 0x94, 0x24, 0x30, 0x80,
-  0x98, 0x26, 0x09, 0x81, 0x28, 0x00,
-  0x30, 0x8c, 0x23, 0x08, 0x4a, 0x80,
-  0x4e, 0x13, 0x84, 0xe1, 0x19, 0x00,
-  0xe3, 0x38, 0xce, 0x31, 0x89, 0x80,
-  0x81, 0xe0, 0x78, 0x1e, 0x30, 0x00,
-  0x21, 0x48, 0x52, 0x14, 0x05, 0x80,
-  0x52, 0x94, 0xa5, 0x28, 0x1e, 0x00,
-  0xb4, 0x2d, 0x0b, 0x42, 0x82, 0x00,
-  0x26, 0x89, 0xa2, 0x68, 0x62, 0x80,
-  0x58, 0x56, 0x15, 0x86, 0x44, 0x00,
-  0x19, 0x86, 0x61, 0x99, 0xe0, 0x00,
-  0xf7, 0x8d, 0xa2, 0xa0, 0x33, 0x00
-};
-
-const uint8_t kMaskRandom41_21[126] = {
-  0x4c, 0x13, 0x04, 0xc1, 0x91, 0x00,
-  0x51, 0x14, 0x45, 0x11, 0x45, 0x00,
-  0xa0, 0x68, 0x1a, 0x06, 0xa4, 0x00,
-  0x04, 0xc1, 0x30, 0x4c, 0x13, 0x00,
-  0x03, 0x80, 0xe0, 0x3b, 0x40, 0x00,
-  0x86, 0x21, 0x88, 0x62, 0x09, 0x00,
-  0x29, 0x0a, 0x42, 0x90, 0x84, 0x80,
-  0x42, 0x50, 0x94, 0x24, 0x30, 0x80,
-  0x98, 0x26, 0x09, 0x81, 0x28, 0x00,
-  0x30, 0x8c, 0x23, 0x08, 0x4a, 0x80,
-  0xc6, 0x31, 0x8c, 0x62, 0x1a, 0x00,
-  0x23, 0x88, 0xe2, 0x38, 0x8c, 0x80,
-  0x1a, 0x46, 0x91, 0xa4, 0x58, 0x80,
-  0x24, 0xc9, 0x32, 0x4d, 0x30, 0x80,
-  0x71, 0x1c, 0x47, 0x11, 0x07, 0x00,
-  0x0e, 0x03, 0x80, 0xe1, 0x91, 0x00,
-  0x33, 0x0c, 0xc3, 0x31, 0x45, 0x00,
-  0x10, 0xc4, 0x31, 0x0c, 0x32, 0x80,
-  0x45, 0x51, 0x54, 0x56, 0x84, 0x80,
-  0x88, 0xa2, 0x28, 0x88, 0x4a, 0x80,
-  0xe0, 0x38, 0x0e, 0x02, 0x29, 0x00
-};
-
-const uint8_t kMaskRandom41_22[132] = {
-  0xc6, 0x31, 0x8c, 0x62, 0x1a, 0x00,
-  0x23, 0x88, 0xe2, 0x38, 0x8c, 0x80,
-  0x1a, 0x46, 0x91, 0xa4, 0x58, 0x80,
-  0x24, 0xc9, 0x32, 0x4d, 0x30, 0x80,
-  0x71, 0x1c, 0x47, 0x11, 0x07, 0x00,
-  0x0e, 0x03, 0x80, 0xe1, 0x91, 0x00,
-  0x33, 0x0c, 0xc3, 0x31, 0x45, 0x00,
-  0x10, 0xc4, 0x31, 0x0c, 0x32, 0x80,
-  0x45, 0x51, 0x54, 0x56, 0x84, 0x80,
-  0x88, 0xa2, 0x28, 0x88, 0x4a, 0x80,
-  0xe0, 0x38, 0x0e, 0x02, 0x29, 0x00,
-  0x4c, 0x13, 0x04, 0xc1, 0x91, 0x00,
-  0x51, 0x14, 0x45, 0x11, 0x45, 0x00,
-  0xa0, 0x68, 0x1a, 0x06, 0xa4, 0x00,
-  0x04, 0xc1, 0x30, 0x4c, 0x13, 0x00,
-  0x03, 0x80, 0xe0, 0x3b, 0x40, 0x00,
-  0x86, 0x21, 0x88, 0x62, 0x09, 0x00,
-  0x29, 0x0a, 0x42, 0x90, 0x84, 0x80,
-  0x42, 0x50, 0x94, 0x24, 0x30, 0x80,
-  0x98, 0x26, 0x09, 0x81, 0x28, 0x00,
-  0x30, 0x8c, 0x23, 0x08, 0x4a, 0x80,
-  0x33, 0x09, 0x6e, 0x49, 0x6b, 0x80
-};
-
-const uint8_t kMaskRandom41_23[138] = {
-  0xc6, 0x31, 0x8c, 0x62, 0x1a, 0x00,
-  0x23, 0x88, 0xe2, 0x38, 0x8c, 0x80,
-  0x1a, 0x46, 0x91, 0xa4, 0x58, 0x80,
-  0x24, 0xc9, 0x32, 0x4d, 0x30, 0x80,
-  0x71, 0x1c, 0x47, 0x11, 0x07, 0x00,
-  0x0e, 0x03, 0x80, 0xe1, 0x91, 0x00,
-  0x33, 0x0c, 0xc3, 0x31, 0x45, 0x00,
-  0x10, 0xc4, 0x31, 0x0c, 0x32, 0x80,
-  0x45, 0x51, 0x54, 0x56, 0x84, 0x80,
-  0x88, 0xa2, 0x28, 0x88, 0x4a, 0x80,
-  0xe0, 0x38, 0x0e, 0x02, 0x29, 0x00,
-  0x0e, 0x03, 0x80, 0xe1, 0x91, 0x00,
-  0x33, 0x0c, 0xc3, 0x31, 0x45, 0x00,
-  0x10, 0xc4, 0x31, 0x0c, 0x32, 0x80,
-  0x45, 0x51, 0x54, 0x56, 0x84, 0x80,
-  0x88, 0xa2, 0x28, 0x88, 0x4a, 0x80,
-  0xe0, 0x38, 0x0e, 0x02, 0x29, 0x00,
-  0xc6, 0x31, 0x8c, 0x62, 0x1a, 0x00,
-  0x23, 0x88, 0xe2, 0x38, 0x8c, 0x80,
-  0x1a, 0x46, 0x91, 0xa4, 0x58, 0x80,
-  0x24, 0xc9, 0x32, 0x4d, 0x30, 0x80,
-  0x71, 0x1c, 0x47, 0x11, 0x07, 0x00,
-  0xf5, 0xdc, 0x4a, 0x06, 0x51, 0x80
-};
-
-const uint8_t kMaskRandom41_24[144] = {
-  0x0e, 0x03, 0x80, 0xe1, 0x91, 0x00,
-  0x33, 0x0c, 0xc3, 0x31, 0x45, 0x00,
-  0x10, 0xc4, 0x31, 0x0c, 0x32, 0x80,
-  0x45, 0x51, 0x54, 0x56, 0x84, 0x80,
-  0x88, 0xa2, 0x28, 0x88, 0x4a, 0x80,
-  0xe0, 0x38, 0x0e, 0x02, 0x29, 0x00,
-  0xc6, 0x31, 0x8c, 0x62, 0x1a, 0x00,
-  0x23, 0x88, 0xe2, 0x38, 0x8c, 0x80,
-  0x1a, 0x46, 0x91, 0xa4, 0x58, 0x80,
-  0x24, 0xc9, 0x32, 0x4d, 0x30, 0x80,
-  0x71, 0x1c, 0x47, 0x11, 0x07, 0x00,
-  0xf5, 0xdc, 0x4a, 0x06, 0x51, 0x80,
-  0xc6, 0x31, 0x8c, 0x62, 0x1a, 0x00,
-  0x23, 0x88, 0xe2, 0x38, 0x8c, 0x80,
-  0x1a, 0x46, 0x91, 0xa4, 0x58, 0x80,
-  0x24, 0xc9, 0x32, 0x4d, 0x30, 0x80,
-  0x71, 0x1c, 0x47, 0x11, 0x07, 0x00,
-  0x0e, 0x03, 0x80, 0xe1, 0x91, 0x00,
-  0x33, 0x0c, 0xc3, 0x31, 0x45, 0x00,
-  0x10, 0xc4, 0x31, 0x0c, 0x32, 0x80,
-  0x45, 0x51, 0x54, 0x56, 0x84, 0x80,
-  0x88, 0xa2, 0x28, 0x88, 0x4a, 0x80,
-  0xe0, 0x38, 0x0e, 0x02, 0x29, 0x00,
-  0x45, 0xa6, 0xef, 0xc9, 0xc3, 0x00
-};
-
-const uint8_t kMaskRandom41_25[150] = {
-  0x0e, 0x03, 0x80, 0xe1, 0x91, 0x00,
-  0x33, 0x0c, 0xc3, 0x31, 0x45, 0x00,
-  0x10, 0xc4, 0x31, 0x0c, 0x32, 0x80,
-  0x45, 0x51, 0x54, 0x56, 0x84, 0x80,
-  0x88, 0xa2, 0x28, 0x88, 0x4a, 0x80,
-  0xe0, 0x38, 0x0e, 0x02, 0x29, 0x00,
-  0xc6, 0x31, 0x8c, 0x62, 0x1a, 0x00,
-  0x23, 0x88, 0xe2, 0x38, 0x8c, 0x80,
-  0x1a, 0x46, 0x91, 0xa4, 0x58, 0x80,
-  0x24, 0xc9, 0x32, 0x4d, 0x30, 0x80,
-  0x71, 0x1c, 0x47, 0x11, 0x07, 0x00,
-  0xf5, 0xdc, 0x4a, 0x06, 0x51, 0x80,
-  0x0e, 0x03, 0x80, 0xe1, 0x91, 0x00,
-  0x33, 0x0c, 0xc3, 0x31, 0x45, 0x00,
-  0x10, 0xc4, 0x31, 0x0c, 0x32, 0x80,
-  0x45, 0x51, 0x54, 0x56, 0x84, 0x80,
-  0x88, 0xa2, 0x28, 0x88, 0x4a, 0x80,
-  0xe0, 0x38, 0x0e, 0x02, 0x29, 0x00,
-  0x46, 0x11, 0x84, 0x61, 0x19, 0x00,
-  0x33, 0x0c, 0xc3, 0x30, 0xcc, 0x80,
-  0x10, 0xc4, 0x31, 0x0e, 0x46, 0x00,
-  0x0c, 0x43, 0x10, 0xc6, 0x90, 0x80,
-  0x28, 0x8a, 0x22, 0x89, 0x42, 0x80,
-  0x94, 0x25, 0x09, 0x42, 0x13, 0x00,
-  0xc1, 0x30, 0x4c, 0x10, 0x25, 0x80
-};
-
-const uint8_t kMaskRandom41_26[156] = {
-  0x0e, 0x03, 0x80, 0xe1, 0x91, 0x00,
-  0x33, 0x0c, 0xc3, 0x31, 0x45, 0x00,
-  0x10, 0xc4, 0x31, 0x0c, 0x32, 0x80,
-  0x45, 0x51, 0x54, 0x56, 0x84, 0x80,
-  0x88, 0xa2, 0x28, 0x88, 0x4a, 0x80,
-  0xe0, 0x38, 0x0e, 0x02, 0x29, 0x00,
-  0x46, 0x11, 0x84, 0x61, 0x19, 0x00,
-  0x33, 0x0c, 0xc3, 0x30, 0xcc, 0x80,
-  0x10, 0xc4, 0x31, 0x0e, 0x46, 0x00,
-  0x0c, 0x43, 0x10, 0xc6, 0x90, 0x80,
-  0x28, 0x8a, 0x22, 0x89, 0x42, 0x80,
-  0x94, 0x25, 0x09, 0x42, 0x13, 0x00,
-  0xc1, 0x30, 0x4c, 0x10, 0x25, 0x80,
-  0x0e, 0x03, 0x80, 0xe1, 0x91, 0x00,
-  0x33, 0x0c, 0xc3, 0x31, 0x45, 0x00,
-  0x10, 0xc4, 0x31, 0x0c, 0x32, 0x80,
-  0x45, 0x51, 0x54, 0x56, 0x84, 0x80,
-  0x88, 0xa2, 0x28, 0x88, 0x4a, 0x80,
-  0xe0, 0x38, 0x0e, 0x02, 0x29, 0x00,
-  0xc6, 0x31, 0x8c, 0x62, 0x1a, 0x00,
-  0x23, 0x88, 0xe2, 0x38, 0x8c, 0x80,
-  0x1a, 0x46, 0x91, 0xa4, 0x58, 0x80,
-  0x24, 0xc9, 0x32, 0x4d, 0x30, 0x80,
-  0x71, 0x1c, 0x47, 0x11, 0x07, 0x00,
-  0xf5, 0xdc, 0x4a, 0x06, 0x51, 0x80,
-  0x6f, 0x72, 0xf1, 0xe7, 0x1a, 0x80
-};
-
-const uint8_t kMaskRandom41_27[162] = {
-  0x0e, 0x03, 0x80, 0xe1, 0x91, 0x00,
-  0x33, 0x0c, 0xc3, 0x31, 0x45, 0x00,
-  0x10, 0xc4, 0x31, 0x0c, 0x32, 0x80,
-  0x45, 0x51, 0x54, 0x56, 0x84, 0x80,
-  0x88, 0xa2, 0x28, 0x88, 0x4a, 0x80,
-  0xe0, 0x38, 0x0e, 0x02, 0x29, 0x00,
-  0x46, 0x11, 0x84, 0x61, 0x19, 0x00,
-  0x33, 0x0c, 0xc3, 0x30, 0xcc, 0x80,
-  0x10, 0xc4, 0x31, 0x0e, 0x46, 0x00,
-  0x0c, 0x43, 0x10, 0xc6, 0x90, 0x80,
-  0x28, 0x8a, 0x22, 0x89, 0x42, 0x80,
-  0x94, 0x25, 0x09, 0x42, 0x13, 0x00,
-  0xc1, 0x30, 0x4c, 0x10, 0x25, 0x80,
-  0x46, 0x11, 0x84, 0x61, 0x19, 0x00,
-  0x33, 0x0c, 0xc3, 0x30, 0xcc, 0x80,
-  0x10, 0xc4, 0x31, 0x0e, 0x46, 0x00,
-  0x0c, 0x43, 0x10, 0xc6, 0x90, 0x80,
-  0x28, 0x8a, 0x22, 0x89, 0x42, 0x80,
-  0x94, 0x25, 0x09, 0x42, 0x13, 0x00,
-  0xc1, 0x30, 0x4c, 0x10, 0x25, 0x80,
-  0x0e, 0x03, 0x80, 0xe1, 0x91, 0x00,
-  0x33, 0x0c, 0xc3, 0x31, 0x45, 0x00,
-  0x10, 0xc4, 0x31, 0x0c, 0x32, 0x80,
-  0x45, 0x51, 0x54, 0x56, 0x84, 0x80,
-  0x88, 0xa2, 0x28, 0x88, 0x4a, 0x80,
-  0xe0, 0x38, 0x0e, 0x02, 0x29, 0x00,
-  0x56, 0x3e, 0x24, 0xdd, 0x0c, 0x00
-};
-
-const uint8_t kMaskRandom41_28[168] = {
-  0x46, 0x11, 0x84, 0x61, 0x19, 0x00,
-  0x33, 0x0c, 0xc3, 0x30, 0xcc, 0x80,
-  0x10, 0xc4, 0x31, 0x0e, 0x46, 0x00,
-  0x0c, 0x43, 0x10, 0xc6, 0x90, 0x80,
-  0x28, 0x8a, 0x22, 0x89, 0x42, 0x80,
-  0x94, 0x25, 0x09, 0x42, 0x13, 0x00,
-  0xc1, 0x30, 0x4c, 0x10, 0x25, 0x80,
-  0x0e, 0x03, 0x80, 0xe1, 0x91, 0x00,
-  0x33, 0x0c, 0xc3, 0x31, 0x45, 0x00,
-  0x10, 0xc4, 0x31, 0x0c, 0x32, 0x80,
-  0x45, 0x51, 0x54, 0x56, 0x84, 0x80,
-  0x88, 0xa2, 0x28, 0x88, 0x4a, 0x80,
-  0xe0, 0x38, 0x0e, 0x02, 0x29, 0x00,
-  0x56, 0x3e, 0x24, 0xdd, 0x0c, 0x00,
-  0x0e, 0x03, 0x80, 0xe1, 0x91, 0x00,
-  0x33, 0x0c, 0xc3, 0x31, 0x45, 0x00,
-  0x10, 0xc4, 0x31, 0x0c, 0x32, 0x80,
-  0x45, 0x51, 0x54, 0x56, 0x84, 0x80,
-  0x88, 0xa2, 0x28, 0x88, 0x4a, 0x80,
-  0xe0, 0x38, 0x0e, 0x02, 0x29, 0x00,
-  0x46, 0x11, 0x84, 0x61, 0x19, 0x00,
-  0x33, 0x0c, 0xc3, 0x30, 0xcc, 0x80,
-  0x10, 0xc4, 0x31, 0x0e, 0x46, 0x00,
-  0x0c, 0x43, 0x10, 0xc6, 0x90, 0x80,
-  0x28, 0x8a, 0x22, 0x89, 0x42, 0x80,
-  0x94, 0x25, 0x09, 0x42, 0x13, 0x00,
-  0xc1, 0x30, 0x4c, 0x10, 0x25, 0x80,
-  0x61, 0x2c, 0xfa, 0x25, 0x38, 0x00
-};
-
-const uint8_t kMaskRandom41_29[174] = {
-  0x46, 0x11, 0x84, 0x61, 0x19, 0x00,
-  0x33, 0x0c, 0xc3, 0x30, 0xcc, 0x80,
-  0x10, 0xc4, 0x31, 0x0e, 0x46, 0x00,
-  0x0c, 0x43, 0x10, 0xc6, 0x90, 0x80,
-  0x28, 0x8a, 0x22, 0x89, 0x42, 0x80,
-  0x94, 0x25, 0x09, 0x42, 0x13, 0x00,
-  0xc1, 0x30, 0x4c, 0x10, 0x25, 0x80,
-  0x0e, 0x03, 0x80, 0xe1, 0x91, 0x00,
-  0x33, 0x0c, 0xc3, 0x31, 0x45, 0x00,
-  0x10, 0xc4, 0x31, 0x0c, 0x32, 0x80,
-  0x45, 0x51, 0x54, 0x56, 0x84, 0x80,
-  0x88, 0xa2, 0x28, 0x88, 0x4a, 0x80,
-  0xe0, 0x38, 0x0e, 0x02, 0x29, 0x00,
-  0x56, 0x3e, 0x24, 0xdd, 0x0c, 0x00,
-  0x46, 0x11, 0x84, 0x61, 0x19, 0x00,
-  0x33, 0x0c, 0xc3, 0x30, 0xcc, 0x80,
-  0x10, 0xc4, 0x31, 0x0e, 0x46, 0x00,
-  0x0c, 0x43, 0x10, 0xc6, 0x90, 0x80,
-  0x28, 0x8a, 0x22, 0x89, 0x42, 0x80,
-  0x94, 0x25, 0x09, 0x42, 0x13, 0x00,
-  0xc1, 0x30, 0x4c, 0x10, 0x25, 0x80,
-  0x2c, 0x0b, 0x02, 0xc0, 0x32, 0x00,
-  0x81, 0xa0, 0x68, 0x1a, 0x01, 0x80,
-  0xa0, 0x68, 0x1a, 0x06, 0x82, 0x00,
-  0x05, 0x41, 0x50, 0x54, 0x15, 0x00,
-  0x18, 0x86, 0x21, 0x89, 0x0c, 0x00,
-  0xc2, 0x30, 0x8c, 0x20, 0x68, 0x00,
-  0x22, 0x88, 0xa2, 0x29, 0x80, 0x80,
-  0x50, 0x54, 0x15, 0x04, 0x50, 0x80
-};
-
-const uint8_t kMaskRandom41_3[18] = {
-  0xce, 0x33, 0x8c, 0xe3, 0x2b, 0x00,
-  0x55, 0x95, 0x65, 0x5d, 0xc5, 0x00,
-  0xb1, 0x6a, 0x3a, 0x8e, 0xd8, 0x80
-};
-
-const uint8_t kMaskRandom41_30[180] = {
-  0x46, 0x11, 0x84, 0x61, 0x19, 0x00,
-  0x33, 0x0c, 0xc3, 0x30, 0xcc, 0x80,
-  0x10, 0xc4, 0x31, 0x0e, 0x46, 0x00,
-  0x0c, 0x43, 0x10, 0xc6, 0x90, 0x80,
-  0x28, 0x8a, 0x22, 0x89, 0x42, 0x80,
-  0x94, 0x25, 0x09, 0x42, 0x13, 0x00,
-  0xc1, 0x30, 0x4c, 0x10, 0x25, 0x80,
-  0x2c, 0x0b, 0x02, 0xc0, 0x32, 0x00,
-  0x81, 0xa0, 0x68, 0x1a, 0x01, 0x80,
-  0xa0, 0x68, 0x1a, 0x06, 0x82, 0x00,
-  0x05, 0x41, 0x50, 0x54, 0x15, 0x00,
-  0x18, 0x86, 0x21, 0x89, 0x0c, 0x00,
-  0xc2, 0x30, 0x8c, 0x20, 0x68, 0x00,
-  0x22, 0x88, 0xa2, 0x29, 0x80, 0x80,
-  0x50, 0x54, 0x15, 0x04, 0x50, 0x80,
-  0x46, 0x11, 0x84, 0x61, 0x19, 0x00,
-  0x33, 0x0c, 0xc3, 0x30, 0xcc, 0x80,
-  0x10, 0xc4, 0x31, 0x0e, 0x46, 0x00,
-  0x0c, 0x43, 0x10, 0xc6, 0x90, 0x80,
-  0x28, 0x8a, 0x22, 0x89, 0x42, 0x80,
-  0x94, 0x25, 0x09, 0x42, 0x13, 0x00,
-  0xc1, 0x30, 0x4c, 0x10, 0x25, 0x80,
-  0x0e, 0x03, 0x80, 0xe1, 0x91, 0x00,
-  0x33, 0x0c, 0xc3, 0x31, 0x45, 0x00,
-  0x10, 0xc4, 0x31, 0x0c, 0x32, 0x80,
-  0x45, 0x51, 0x54, 0x56, 0x84, 0x80,
-  0x88, 0xa2, 0x28, 0x88, 0x4a, 0x80,
-  0xe0, 0x38, 0x0e, 0x02, 0x29, 0x00,
-  0x56, 0x3e, 0x24, 0xdd, 0x0c, 0x00,
-  0x59, 0x53, 0x31, 0x62, 0x15, 0x00
-};
-
-const uint8_t kMaskRandom41_31[186] = {
-  0x46, 0x11, 0x84, 0x61, 0x19, 0x00,
-  0x33, 0x0c, 0xc3, 0x30, 0xcc, 0x80,
-  0x10, 0xc4, 0x31, 0x0e, 0x46, 0x00,
-  0x0c, 0x43, 0x10, 0xc6, 0x90, 0x80,
-  0x28, 0x8a, 0x22, 0x89, 0x42, 0x80,
-  0x94, 0x25, 0x09, 0x42, 0x13, 0x00,
-  0xc1, 0x30, 0x4c, 0x10, 0x25, 0x80,
-  0x2c, 0x0b, 0x02, 0xc0, 0x32, 0x00,
-  0x81, 0xa0, 0x68, 0x1a, 0x01, 0x80,
-  0xa0, 0x68, 0x1a, 0x06, 0x82, 0x00,
-  0x05, 0x41, 0x50, 0x54, 0x15, 0x00,
-  0x18, 0x86, 0x21, 0x89, 0x0c, 0x00,
-  0xc2, 0x30, 0x8c, 0x20, 0x68, 0x00,
-  0x22, 0x88, 0xa2, 0x29, 0x80, 0x80,
-  0x50, 0x54, 0x15, 0x04, 0x50, 0x80,
-  0x2c, 0x0b, 0x02, 0xc0, 0x32, 0x00,
-  0x81, 0xa0, 0x68, 0x1a, 0x01, 0x80,
-  0xa0, 0x68, 0x1a, 0x06, 0x82, 0x00,
-  0x05, 0x41, 0x50, 0x54, 0x15, 0x00,
-  0x18, 0x86, 0x21, 0x89, 0x0c, 0x00,
-  0xc2, 0x30, 0x8c, 0x20, 0x68, 0x00,
-  0x22, 0x88, 0xa2, 0x29, 0x80, 0x80,
-  0x50, 0x54, 0x15, 0x04, 0x50, 0x80,
-  0x46, 0x11, 0x84, 0x61, 0x19, 0x00,
-  0x33, 0x0c, 0xc3, 0x30, 0xcc, 0x80,
-  0x10, 0xc4, 0x31, 0x0e, 0x46, 0x00,
-  0x0c, 0x43, 0x10, 0xc6, 0x90, 0x80,
-  0x28, 0x8a, 0x22, 0x89, 0x42, 0x80,
-  0x94, 0x25, 0x09, 0x42, 0x13, 0x00,
-  0xc1, 0x30, 0x4c, 0x10, 0x25, 0x80,
-  0x28, 0x1c, 0x63, 0xbf, 0x53, 0x80
-};
-
-const uint8_t kMaskRandom41_32[192] = {
-  0x2c, 0x0b, 0x02, 0xc0, 0x32, 0x00,
-  0x81, 0xa0, 0x68, 0x1a, 0x01, 0x80,
-  0xa0, 0x68, 0x1a, 0x06, 0x82, 0x00,
-  0x05, 0x41, 0x50, 0x54, 0x15, 0x00,
-  0x18, 0x86, 0x21, 0x89, 0x0c, 0x00,
-  0xc2, 0x30, 0x8c, 0x20, 0x68, 0x00,
-  0x22, 0x88, 0xa2, 0x29, 0x80, 0x80,
-  0x50, 0x54, 0x15, 0x04, 0x50, 0x80,
-  0x46, 0x11, 0x84, 0x61, 0x19, 0x00,
-  0x33, 0x0c, 0xc3, 0x30, 0xcc, 0x80,
-  0x10, 0xc4, 0x31, 0x0e, 0x46, 0x00,
-  0x0c, 0x43, 0x10, 0xc6, 0x90, 0x80,
-  0x28, 0x8a, 0x22, 0x89, 0x42, 0x80,
-  0x94, 0x25, 0x09, 0x42, 0x13, 0x00,
-  0xc1, 0x30, 0x4c, 0x10, 0x25, 0x80,
-  0x28, 0x1c, 0x63, 0xbf, 0x53, 0x80,
-  0x46, 0x11, 0x84, 0x61, 0x19, 0x00,
-  0x33, 0x0c, 0xc3, 0x30, 0xcc, 0x80,
-  0x10, 0xc4, 0x31, 0x0e, 0x46, 0x00,
-  0x0c, 0x43, 0x10, 0xc6, 0x90, 0x80,
-  0x28, 0x8a, 0x22, 0x89, 0x42, 0x80,
-  0x94, 0x25, 0x09, 0x42, 0x13, 0x00,
-  0xc1, 0x30, 0x4c, 0x10, 0x25, 0x80,
-  0x2c, 0x0b, 0x02, 0xc0, 0x32, 0x00,
-  0x81, 0xa0, 0x68, 0x1a, 0x01, 0x80,
-  0xa0, 0x68, 0x1a, 0x06, 0x82, 0x00,
-  0x05, 0x41, 0x50, 0x54, 0x15, 0x00,
-  0x18, 0x86, 0x21, 0x89, 0x0c, 0x00,
-  0xc2, 0x30, 0x8c, 0x20, 0x68, 0x00,
-  0x22, 0x88, 0xa2, 0x29, 0x80, 0x80,
-  0x50, 0x54, 0x15, 0x04, 0x50, 0x80,
-  0xca, 0xbb, 0xcb, 0x6d, 0xaa, 0x00
-};
-
-const uint8_t kMaskRandom41_33[198] = {
-  0x2c, 0x0b, 0x02, 0xc0, 0x32, 0x00,
-  0x81, 0xa0, 0x68, 0x1a, 0x01, 0x80,
-  0xa0, 0x68, 0x1a, 0x06, 0x82, 0x00,
-  0x05, 0x41, 0x50, 0x54, 0x15, 0x00,
-  0x18, 0x86, 0x21, 0x89, 0x0c, 0x00,
-  0xc2, 0x30, 0x8c, 0x20, 0x68, 0x00,
-  0x22, 0x88, 0xa2, 0x29, 0x80, 0x80,
-  0x50, 0x54, 0x15, 0x04, 0x50, 0x80,
-  0x46, 0x11, 0x84, 0x61, 0x19, 0x00,
-  0x33, 0x0c, 0xc3, 0x30, 0xcc, 0x80,
-  0x10, 0xc4, 0x31, 0x0e, 0x46, 0x00,
-  0x0c, 0x43, 0x10, 0xc6, 0x90, 0x80,
-  0x28, 0x8a, 0x22, 0x89, 0x42, 0x80,
-  0x94, 0x25, 0x09, 0x42, 0x13, 0x00,
-  0xc1, 0x30, 0x4c, 0x10, 0x25, 0x80,
-  0x28, 0x1c, 0x63, 0xbf, 0x53, 0x80,
-  0x2c, 0x0b, 0x02, 0xc0, 0x32, 0x00,
-  0x81, 0xa0, 0x68, 0x1a, 0x01, 0x80,
-  0xa0, 0x68, 0x1a, 0x06, 0x82, 0x00,
-  0x05, 0x41, 0x50, 0x54, 0x15, 0x00,
-  0x18, 0x86, 0x21, 0x89, 0x0c, 0x00,
-  0xc2, 0x30, 0x8c, 0x20, 0x68, 0x00,
-  0x22, 0x88, 0xa2, 0x29, 0x80, 0x80,
-  0x50, 0x54, 0x15, 0x04, 0x50, 0x80,
-  0x4e, 0x13, 0x84, 0xe1, 0x19, 0x00,
-  0xe3, 0x38, 0xce, 0x31, 0x89, 0x80,
-  0x81, 0xe0, 0x78, 0x1e, 0x30, 0x00,
-  0x21, 0x48, 0x52, 0x14, 0x05, 0x80,
-  0x52, 0x94, 0xa5, 0x28, 0x1e, 0x00,
-  0xb4, 0x2d, 0x0b, 0x42, 0x82, 0x00,
-  0x26, 0x89, 0xa2, 0x68, 0x62, 0x80,
-  0x58, 0x56, 0x15, 0x86, 0x44, 0x00,
-  0x19, 0x86, 0x61, 0x99, 0xe0, 0x00
-};
-
-const uint8_t kMaskRandom41_34[204] = {
-  0x2c, 0x0b, 0x02, 0xc0, 0x32, 0x00,
-  0x81, 0xa0, 0x68, 0x1a, 0x01, 0x80,
-  0xa0, 0x68, 0x1a, 0x06, 0x82, 0x00,
-  0x05, 0x41, 0x50, 0x54, 0x15, 0x00,
-  0x18, 0x86, 0x21, 0x89, 0x0c, 0x00,
-  0xc2, 0x30, 0x8c, 0x20, 0x68, 0x00,
-  0x22, 0x88, 0xa2, 0x29, 0x80, 0x80,
-  0x50, 0x54, 0x15, 0x04, 0x50, 0x80,
-  0x4e, 0x13, 0x84, 0xe1, 0x19, 0x00,
-  0xe3, 0x38, 0xce, 0x31, 0x89, 0x80,
-  0x81, 0xe0, 0x78, 0x1e, 0x30, 0x00,
-  0x21, 0x48, 0x52, 0x14, 0x05, 0x80,
-  0x52, 0x94, 0xa5, 0x28, 0x1e, 0x00,
-  0xb4, 0x2d, 0x0b, 0x42, 0x82, 0x00,
-  0x26, 0x89, 0xa2, 0x68, 0x62, 0x80,
-  0x58, 0x56, 0x15, 0x86, 0x44, 0x00,
-  0x19, 0x86, 0x61, 0x99, 0xe0, 0x00,
-  0x2c, 0x0b, 0x02, 0xc0, 0x32, 0x00,
-  0x81, 0xa0, 0x68, 0x1a, 0x01, 0x80,
-  0xa0, 0x68, 0x1a, 0x06, 0x82, 0x00,
-  0x05, 0x41, 0x50, 0x54, 0x15, 0x00,
-  0x18, 0x86, 0x21, 0x89, 0x0c, 0x00,
-  0xc2, 0x30, 0x8c, 0x20, 0x68, 0x00,
-  0x22, 0x88, 0xa2, 0x29, 0x80, 0x80,
-  0x50, 0x54, 0x15, 0x04, 0x50, 0x80,
-  0x46, 0x11, 0x84, 0x61, 0x19, 0x00,
-  0x33, 0x0c, 0xc3, 0x30, 0xcc, 0x80,
-  0x10, 0xc4, 0x31, 0x0e, 0x46, 0x00,
-  0x0c, 0x43, 0x10, 0xc6, 0x90, 0x80,
-  0x28, 0x8a, 0x22, 0x89, 0x42, 0x80,
-  0x94, 0x25, 0x09, 0x42, 0x13, 0x00,
-  0xc1, 0x30, 0x4c, 0x10, 0x25, 0x80,
-  0x28, 0x1c, 0x63, 0xbf, 0x53, 0x80,
-  0xbd, 0x37, 0x3f, 0x75, 0x36, 0x80
-};
-
-const uint8_t kMaskRandom41_35[210] = {
-  0x2c, 0x0b, 0x02, 0xc0, 0x32, 0x00,
-  0x81, 0xa0, 0x68, 0x1a, 0x01, 0x80,
-  0xa0, 0x68, 0x1a, 0x06, 0x82, 0x00,
-  0x05, 0x41, 0x50, 0x54, 0x15, 0x00,
-  0x18, 0x86, 0x21, 0x89, 0x0c, 0x00,
-  0xc2, 0x30, 0x8c, 0x20, 0x68, 0x00,
-  0x22, 0x88, 0xa2, 0x29, 0x80, 0x80,
-  0x50, 0x54, 0x15, 0x04, 0x50, 0x80,
-  0x4e, 0x13, 0x84, 0xe1, 0x19, 0x00,
-  0xe3, 0x38, 0xce, 0x31, 0x89, 0x80,
-  0x81, 0xe0, 0x78, 0x1e, 0x30, 0x00,
-  0x21, 0x48, 0x52, 0x14, 0x05, 0x80,
-  0x52, 0x94, 0xa5, 0x28, 0x1e, 0x00,
-  0xb4, 0x2d, 0x0b, 0x42, 0x82, 0x00,
-  0x26, 0x89, 0xa2, 0x68, 0x62, 0x80,
-  0x58, 0x56, 0x15, 0x86, 0x44, 0x00,
-  0x19, 0x86, 0x61, 0x99, 0xe0, 0x00,
-  0x4e, 0x13, 0x84, 0xe1, 0x19, 0x00,
-  0xe3, 0x38, 0xce, 0x31, 0x89, 0x80,
-  0x81, 0xe0, 0x78, 0x1e, 0x30, 0x00,
-  0x21, 0x48, 0x52, 0x14, 0x05, 0x80,
-  0x52, 0x94, 0xa5, 0x28, 0x1e, 0x00,
-  0xb4, 0x2d, 0x0b, 0x42, 0x82, 0x00,
-  0x26, 0x89, 0xa2, 0x68, 0x62, 0x80,
-  0x58, 0x56, 0x15, 0x86, 0x44, 0x00,
-  0x19, 0x86, 0x61, 0x99, 0xe0, 0x00,
-  0x2c, 0x0b, 0x02, 0xc0, 0x32, 0x00,
-  0x81, 0xa0, 0x68, 0x1a, 0x01, 0x80,
-  0xa0, 0x68, 0x1a, 0x06, 0x82, 0x00,
-  0x05, 0x41, 0x50, 0x54, 0x15, 0x00,
-  0x18, 0x86, 0x21, 0x89, 0x0c, 0x00,
-  0xc2, 0x30, 0x8c, 0x20, 0x68, 0x00,
-  0x22, 0x88, 0xa2, 0x29, 0x80, 0x80,
-  0x50, 0x54, 0x15, 0x04, 0x50, 0x80,
-  0x21, 0x7b, 0xf5, 0xa5, 0x65, 0x80
-};
-
-const uint8_t kMaskRandom41_36[216] = {
-  0x4e, 0x13, 0x84, 0xe1, 0x19, 0x00,
-  0xe3, 0x38, 0xce, 0x31, 0x89, 0x80,
-  0x81, 0xe0, 0x78, 0x1e, 0x30, 0x00,
-  0x21, 0x48, 0x52, 0x14, 0x05, 0x80,
-  0x52, 0x94, 0xa5, 0x28, 0x1e, 0x00,
-  0xb4, 0x2d, 0x0b, 0x42, 0x82, 0x00,
-  0x26, 0x89, 0xa2, 0x68, 0x62, 0x80,
-  0x58, 0x56, 0x15, 0x86, 0x44, 0x00,
-  0x19, 0x86, 0x61, 0x99, 0xe0, 0x00,
-  0x2c, 0x0b, 0x02, 0xc0, 0x32, 0x00,
-  0x81, 0xa0, 0x68, 0x1a, 0x01, 0x80,
-  0xa0, 0x68, 0x1a, 0x06, 0x82, 0x00,
-  0x05, 0x41, 0x50, 0x54, 0x15, 0x00,
-  0x18, 0x86, 0x21, 0x89, 0x0c, 0x00,
-  0xc2, 0x30, 0x8c, 0x20, 0x68, 0x00,
-  0x22, 0x88, 0xa2, 0x29, 0x80, 0x80,
-  0x50, 0x54, 0x15, 0x04, 0x50, 0x80,
-  0x21, 0x7b, 0xf5, 0xa5, 0x65, 0x80,
-  0x2c, 0x0b, 0x02, 0xc0, 0x32, 0x00,
-  0x81, 0xa0, 0x68, 0x1a, 0x01, 0x80,
-  0xa0, 0x68, 0x1a, 0x06, 0x82, 0x00,
-  0x05, 0x41, 0x50, 0x54, 0x15, 0x00,
-  0x18, 0x86, 0x21, 0x89, 0x0c, 0x00,
-  0xc2, 0x30, 0x8c, 0x20, 0x68, 0x00,
-  0x22, 0x88, 0xa2, 0x29, 0x80, 0x80,
-  0x50, 0x54, 0x15, 0x04, 0x50, 0x80,
-  0x4e, 0x13, 0x84, 0xe1, 0x19, 0x00,
-  0xe3, 0x38, 0xce, 0x31, 0x89, 0x80,
-  0x81, 0xe0, 0x78, 0x1e, 0x30, 0x00,
-  0x21, 0x48, 0x52, 0x14, 0x05, 0x80,
-  0x52, 0x94, 0xa5, 0x28, 0x1e, 0x00,
-  0xb4, 0x2d, 0x0b, 0x42, 0x82, 0x00,
-  0x26, 0x89, 0xa2, 0x68, 0x62, 0x80,
-  0x58, 0x56, 0x15, 0x86, 0x44, 0x00,
-  0x19, 0x86, 0x61, 0x99, 0xe0, 0x00,
-  0xc1, 0xb1, 0x80, 0xbe, 0x3e, 0x00
-};
-
-const uint8_t kMaskRandom41_37[222] = {
-  0x4e, 0x13, 0x84, 0xe1, 0x19, 0x00,
-  0xe3, 0x38, 0xce, 0x31, 0x89, 0x80,
-  0x81, 0xe0, 0x78, 0x1e, 0x30, 0x00,
-  0x21, 0x48, 0x52, 0x14, 0x05, 0x80,
-  0x52, 0x94, 0xa5, 0x28, 0x1e, 0x00,
-  0xb4, 0x2d, 0x0b, 0x42, 0x82, 0x00,
-  0x26, 0x89, 0xa2, 0x68, 0x62, 0x80,
-  0x58, 0x56, 0x15, 0x86, 0x44, 0x00,
-  0x19, 0x86, 0x61, 0x99, 0xe0, 0x00,
-  0x2c, 0x0b, 0x02, 0xc0, 0x32, 0x00,
-  0x81, 0xa0, 0x68, 0x1a, 0x01, 0x80,
-  0xa0, 0x68, 0x1a, 0x06, 0x82, 0x00,
-  0x05, 0x41, 0x50, 0x54, 0x15, 0x00,
-  0x18, 0x86, 0x21, 0x89, 0x0c, 0x00,
-  0xc2, 0x30, 0x8c, 0x20, 0x68, 0x00,
-  0x22, 0x88, 0xa2, 0x29, 0x80, 0x80,
-  0x50, 0x54, 0x15, 0x04, 0x50, 0x80,
-  0x21, 0x7b, 0xf5, 0xa5, 0x65, 0x80,
-  0x4e, 0x13, 0x84, 0xe1, 0x19, 0x00,
-  0xe3, 0x38, 0xce, 0x31, 0x89, 0x80,
-  0x81, 0xe0, 0x78, 0x1e, 0x30, 0x00,
-  0x21, 0x48, 0x52, 0x14, 0x05, 0x80,
-  0x52, 0x94, 0xa5, 0x28, 0x1e, 0x00,
-  0xb4, 0x2d, 0x0b, 0x42, 0x82, 0x00,
-  0x26, 0x89, 0xa2, 0x68, 0x62, 0x80,
-  0x58, 0x56, 0x15, 0x86, 0x44, 0x00,
-  0x19, 0x86, 0x61, 0x99, 0xe0, 0x00,
-  0x4c, 0x13, 0x04, 0xc1, 0x91, 0x00,
-  0x51, 0x14, 0x45, 0x11, 0x45, 0x00,
-  0xa0, 0x68, 0x1a, 0x06, 0xa4, 0x00,
-  0x04, 0xc1, 0x30, 0x4c, 0x13, 0x00,
-  0x03, 0x80, 0xe0, 0x3b, 0x40, 0x00,
-  0x86, 0x21, 0x88, 0x62, 0x09, 0x00,
-  0x29, 0x0a, 0x42, 0x90, 0x84, 0x80,
-  0x42, 0x50, 0x94, 0x24, 0x30, 0x80,
-  0x98, 0x26, 0x09, 0x81, 0x28, 0x00,
-  0x30, 0x8c, 0x23, 0x08, 0x4a, 0x80
-};
-
-const uint8_t kMaskRandom41_38[228] = {
-  0x4e, 0x13, 0x84, 0xe1, 0x19, 0x00,
-  0xe3, 0x38, 0xce, 0x31, 0x89, 0x80,
-  0x81, 0xe0, 0x78, 0x1e, 0x30, 0x00,
-  0x21, 0x48, 0x52, 0x14, 0x05, 0x80,
-  0x52, 0x94, 0xa5, 0x28, 0x1e, 0x00,
-  0xb4, 0x2d, 0x0b, 0x42, 0x82, 0x00,
-  0x26, 0x89, 0xa2, 0x68, 0x62, 0x80,
-  0x58, 0x56, 0x15, 0x86, 0x44, 0x00,
-  0x19, 0x86, 0x61, 0x99, 0xe0, 0x00,
-  0x4c, 0x13, 0x04, 0xc1, 0x91, 0x00,
-  0x51, 0x14, 0x45, 0x11, 0x45, 0x00,
-  0xa0, 0x68, 0x1a, 0x06, 0xa4, 0x00,
-  0x04, 0xc1, 0x30, 0x4c, 0x13, 0x00,
-  0x03, 0x80, 0xe0, 0x3b, 0x40, 0x00,
-  0x86, 0x21, 0x88, 0x62, 0x09, 0x00,
-  0x29, 0x0a, 0x42, 0x90, 0x84, 0x80,
-  0x42, 0x50, 0x94, 0x24, 0x30, 0x80,
-  0x98, 0x26, 0x09, 0x81, 0x28, 0x00,
-  0x30, 0x8c, 0x23, 0x08, 0x4a, 0x80,
-  0x4e, 0x13, 0x84, 0xe1, 0x19, 0x00,
-  0xe3, 0x38, 0xce, 0x31, 0x89, 0x80,
-  0x81, 0xe0, 0x78, 0x1e, 0x30, 0x00,
-  0x21, 0x48, 0x52, 0x14, 0x05, 0x80,
-  0x52, 0x94, 0xa5, 0x28, 0x1e, 0x00,
-  0xb4, 0x2d, 0x0b, 0x42, 0x82, 0x00,
-  0x26, 0x89, 0xa2, 0x68, 0x62, 0x80,
-  0x58, 0x56, 0x15, 0x86, 0x44, 0x00,
-  0x19, 0x86, 0x61, 0x99, 0xe0, 0x00,
-  0x2c, 0x0b, 0x02, 0xc0, 0x32, 0x00,
-  0x81, 0xa0, 0x68, 0x1a, 0x01, 0x80,
-  0xa0, 0x68, 0x1a, 0x06, 0x82, 0x00,
-  0x05, 0x41, 0x50, 0x54, 0x15, 0x00,
-  0x18, 0x86, 0x21, 0x89, 0x0c, 0x00,
-  0xc2, 0x30, 0x8c, 0x20, 0x68, 0x00,
-  0x22, 0x88, 0xa2, 0x29, 0x80, 0x80,
-  0x50, 0x54, 0x15, 0x04, 0x50, 0x80,
-  0x21, 0x7b, 0xf5, 0xa5, 0x65, 0x80,
-  0xea, 0xc8, 0xbb, 0xd4, 0x5d, 0x00
-};
-
-const uint8_t kMaskRandom41_39[234] = {
-  0x4e, 0x13, 0x84, 0xe1, 0x19, 0x00,
-  0xe3, 0x38, 0xce, 0x31, 0x89, 0x80,
-  0x81, 0xe0, 0x78, 0x1e, 0x30, 0x00,
-  0x21, 0x48, 0x52, 0x14, 0x05, 0x80,
-  0x52, 0x94, 0xa5, 0x28, 0x1e, 0x00,
-  0xb4, 0x2d, 0x0b, 0x42, 0x82, 0x00,
-  0x26, 0x89, 0xa2, 0x68, 0x62, 0x80,
-  0x58, 0x56, 0x15, 0x86, 0x44, 0x00,
-  0x19, 0x86, 0x61, 0x99, 0xe0, 0x00,
-  0x4c, 0x13, 0x04, 0xc1, 0x91, 0x00,
-  0x51, 0x14, 0x45, 0x11, 0x45, 0x00,
-  0xa0, 0x68, 0x1a, 0x06, 0xa4, 0x00,
-  0x04, 0xc1, 0x30, 0x4c, 0x13, 0x00,
-  0x03, 0x80, 0xe0, 0x3b, 0x40, 0x00,
-  0x86, 0x21, 0x88, 0x62, 0x09, 0x00,
-  0x29, 0x0a, 0x42, 0x90, 0x84, 0x80,
-  0x42, 0x50, 0x94, 0x24, 0x30, 0x80,
-  0x98, 0x26, 0x09, 0x81, 0x28, 0x00,
-  0x30, 0x8c, 0x23, 0x08, 0x4a, 0x80,
-  0x4c, 0x13, 0x04, 0xc1, 0x91, 0x00,
-  0x51, 0x14, 0x45, 0x11, 0x45, 0x00,
-  0xa0, 0x68, 0x1a, 0x06, 0xa4, 0x00,
-  0x04, 0xc1, 0x30, 0x4c, 0x13, 0x00,
-  0x03, 0x80, 0xe0, 0x3b, 0x40, 0x00,
-  0x86, 0x21, 0x88, 0x62, 0x09, 0x00,
-  0x29, 0x0a, 0x42, 0x90, 0x84, 0x80,
-  0x42, 0x50, 0x94, 0x24, 0x30, 0x80,
-  0x98, 0x26, 0x09, 0x81, 0x28, 0x00,
-  0x30, 0x8c, 0x23, 0x08, 0x4a, 0x80,
-  0x4e, 0x13, 0x84, 0xe1, 0x19, 0x00,
-  0xe3, 0x38, 0xce, 0x31, 0x89, 0x80,
-  0x81, 0xe0, 0x78, 0x1e, 0x30, 0x00,
-  0x21, 0x48, 0x52, 0x14, 0x05, 0x80,
-  0x52, 0x94, 0xa5, 0x28, 0x1e, 0x00,
-  0xb4, 0x2d, 0x0b, 0x42, 0x82, 0x00,
-  0x26, 0x89, 0xa2, 0x68, 0x62, 0x80,
-  0x58, 0x56, 0x15, 0x86, 0x44, 0x00,
-  0x19, 0x86, 0x61, 0x99, 0xe0, 0x00,
-  0xf7, 0x8d, 0xa2, 0xa0, 0x33, 0x00
-};
-
-const uint8_t kMaskRandom41_4[24] = {
-  0xe6, 0x39, 0x8e, 0x63, 0x13, 0x00,
-  0x33, 0x8c, 0xe3, 0x38, 0xc5, 0x80,
-  0x98, 0xe6, 0x39, 0x8d, 0x2c, 0x80,
-  0x2d, 0x4b, 0x52, 0xd4, 0xb2, 0x80
-};
-
-const uint8_t kMaskRandom41_40[240] = {
-  0x4c, 0x13, 0x04, 0xc1, 0x91, 0x00,
-  0x51, 0x14, 0x45, 0x11, 0x45, 0x00,
-  0xa0, 0x68, 0x1a, 0x06, 0xa4, 0x00,
-  0x04, 0xc1, 0x30, 0x4c, 0x13, 0x00,
-  0x03, 0x80, 0xe0, 0x3b, 0x40, 0x00,
-  0x86, 0x21, 0x88, 0x62, 0x09, 0x00,
-  0x29, 0x0a, 0x42, 0x90, 0x84, 0x80,
-  0x42, 0x50, 0x94, 0x24, 0x30, 0x80,
-  0x98, 0x26, 0x09, 0x81, 0x28, 0x00,
-  0x30, 0x8c, 0x23, 0x08, 0x4a, 0x80,
-  0x4e, 0x13, 0x84, 0xe1, 0x19, 0x00,
-  0xe3, 0x38, 0xce, 0x31, 0x89, 0x80,
-  0x81, 0xe0, 0x78, 0x1e, 0x30, 0x00,
-  0x21, 0x48, 0x52, 0x14, 0x05, 0x80,
-  0x52, 0x94, 0xa5, 0x28, 0x1e, 0x00,
-  0xb4, 0x2d, 0x0b, 0x42, 0x82, 0x00,
-  0x26, 0x89, 0xa2, 0x68, 0x62, 0x80,
-  0x58, 0x56, 0x15, 0x86, 0x44, 0x00,
-  0x19, 0x86, 0x61, 0x99, 0xe0, 0x00,
-  0xf7, 0x8d, 0xa2, 0xa0, 0x33, 0x00,
-  0x4e, 0x13, 0x84, 0xe1, 0x19, 0x00,
-  0xe3, 0x38, 0xce, 0x31, 0x89, 0x80,
-  0x81, 0xe0, 0x78, 0x1e, 0x30, 0x00,
-  0x21, 0x48, 0x52, 0x14, 0x05, 0x80,
-  0x52, 0x94, 0xa5, 0x28, 0x1e, 0x00,
-  0xb4, 0x2d, 0x0b, 0x42, 0x82, 0x00,
-  0x26, 0x89, 0xa2, 0x68, 0x62, 0x80,
-  0x58, 0x56, 0x15, 0x86, 0x44, 0x00,
-  0x19, 0x86, 0x61, 0x99, 0xe0, 0x00,
-  0x4c, 0x13, 0x04, 0xc1, 0x91, 0x00,
-  0x51, 0x14, 0x45, 0x11, 0x45, 0x00,
-  0xa0, 0x68, 0x1a, 0x06, 0xa4, 0x00,
-  0x04, 0xc1, 0x30, 0x4c, 0x13, 0x00,
-  0x03, 0x80, 0xe0, 0x3b, 0x40, 0x00,
-  0x86, 0x21, 0x88, 0x62, 0x09, 0x00,
-  0x29, 0x0a, 0x42, 0x90, 0x84, 0x80,
-  0x42, 0x50, 0x94, 0x24, 0x30, 0x80,
-  0x98, 0x26, 0x09, 0x81, 0x28, 0x00,
-  0x30, 0x8c, 0x23, 0x08, 0x4a, 0x80,
-  0xe8, 0x07, 0x18, 0x9a, 0x02, 0x00
-};
-
-const uint8_t kMaskRandom41_41[246] = {
-  0x4c, 0x13, 0x04, 0xc1, 0x91, 0x00,
-  0x51, 0x14, 0x45, 0x11, 0x45, 0x00,
-  0xa0, 0x68, 0x1a, 0x06, 0xa4, 0x00,
-  0x04, 0xc1, 0x30, 0x4c, 0x13, 0x00,
-  0x03, 0x80, 0xe0, 0x3b, 0x40, 0x00,
-  0x86, 0x21, 0x88, 0x62, 0x09, 0x00,
-  0x29, 0x0a, 0x42, 0x90, 0x84, 0x80,
-  0x42, 0x50, 0x94, 0x24, 0x30, 0x80,
-  0x98, 0x26, 0x09, 0x81, 0x28, 0x00,
-  0x30, 0x8c, 0x23, 0x08, 0x4a, 0x80,
-  0x4e, 0x13, 0x84, 0xe1, 0x19, 0x00,
-  0xe3, 0x38, 0xce, 0x31, 0x89, 0x80,
-  0x81, 0xe0, 0x78, 0x1e, 0x30, 0x00,
-  0x21, 0x48, 0x52, 0x14, 0x05, 0x80,
-  0x52, 0x94, 0xa5, 0x28, 0x1e, 0x00,
-  0xb4, 0x2d, 0x0b, 0x42, 0x82, 0x00,
-  0x26, 0x89, 0xa2, 0x68, 0x62, 0x80,
-  0x58, 0x56, 0x15, 0x86, 0x44, 0x00,
-  0x19, 0x86, 0x61, 0x99, 0xe0, 0x00,
-  0xf7, 0x8d, 0xa2, 0xa0, 0x33, 0x00,
-  0x4c, 0x13, 0x04, 0xc1, 0x91, 0x00,
-  0x51, 0x14, 0x45, 0x11, 0x45, 0x00,
-  0xa0, 0x68, 0x1a, 0x06, 0xa4, 0x00,
-  0x04, 0xc1, 0x30, 0x4c, 0x13, 0x00,
-  0x03, 0x80, 0xe0, 0x3b, 0x40, 0x00,
-  0x86, 0x21, 0x88, 0x62, 0x09, 0x00,
-  0x29, 0x0a, 0x42, 0x90, 0x84, 0x80,
-  0x42, 0x50, 0x94, 0x24, 0x30, 0x80,
-  0x98, 0x26, 0x09, 0x81, 0x28, 0x00,
-  0x30, 0x8c, 0x23, 0x08, 0x4a, 0x80,
-  0x4e, 0x13, 0x84, 0xc1, 0x19, 0x00,
-  0xe3, 0x38, 0xc5, 0x10, 0xcc, 0x80,
-  0x81, 0xe0, 0x7a, 0x06, 0x64, 0x00,
-  0x21, 0x48, 0x50, 0x4c, 0x16, 0x00,
-  0x52, 0x94, 0xa0, 0x3a, 0x02, 0x80,
-  0xb4, 0x2d, 0x08, 0x62, 0x11, 0x00,
-  0x26, 0x89, 0xa2, 0x91, 0x01, 0x80,
-  0x58, 0x56, 0x14, 0x24, 0x2a, 0x00,
-  0x19, 0x86, 0x69, 0x81, 0xa0, 0x00,
-  0xf7, 0x8d, 0xa3, 0x08, 0x40, 0x80,
-  0x2b, 0xea, 0x4d, 0xf4, 0xc1, 0x00
-};
-
-const uint8_t kMaskRandom41_5[30] = {
-  0xce, 0x33, 0x8c, 0xe3, 0x1b, 0x00,
-  0x63, 0x98, 0xe6, 0x39, 0x8d, 0x80,
-  0x98, 0xe5, 0x39, 0x8c, 0x76, 0x80,
-  0x2b, 0x53, 0x54, 0xd6, 0xb5, 0x00,
-  0xb4, 0x5c, 0xab, 0x26, 0xca, 0x80
-};
-
-const uint8_t kMaskRandom41_6[36] = {
-  0x4c, 0x1b, 0x04, 0xc1, 0x91, 0x00,
-  0x51, 0x34, 0x45, 0x11, 0x45, 0x00,
-  0x20, 0xe8, 0x32, 0x0e, 0xa0, 0x80,
-  0x85, 0x41, 0x58, 0x54, 0x12, 0x80,
-  0x06, 0x86, 0xa0, 0x68, 0x0d, 0x80,
-  0x9a, 0x21, 0x88, 0xa2, 0x43, 0x00
-};
-
-const uint8_t kMaskRandom41_7[42] = {
-  0x4e, 0x11, 0x8c, 0x61, 0x19, 0x00,
-  0x33, 0x2c, 0x03, 0x30, 0x4c, 0x80,
-  0x10, 0x0e, 0xb1, 0x86, 0x74, 0x00,
-  0x81, 0x51, 0x54, 0x54, 0x2d, 0x00,
-  0x24, 0xc4, 0xa1, 0x2d, 0x42, 0x80,
-  0xd4, 0x23, 0x0b, 0x42, 0x83, 0x00,
-  0x0c, 0xa2, 0x62, 0x99, 0x21, 0x80
-};
-
-const uint8_t kMaskRandom41_8[48] = {
-  0x27, 0x09, 0xc0, 0x70, 0xa7, 0x00,
-  0x89, 0xa2, 0x64, 0x9a, 0x82, 0x80,
-  0xd0, 0x74, 0x1b, 0x07, 0xa0, 0x00,
-  0x24, 0xc9, 0x32, 0x4c, 0x5c, 0x00,
-  0xe2, 0x90, 0xa5, 0x28, 0x0e, 0x80,
-  0xc6, 0x31, 0x8c, 0x63, 0x18, 0x00,
-  0x31, 0x8c, 0x63, 0x19, 0x41, 0x80,
-  0x18, 0xc6, 0x31, 0x8c, 0x70, 0x80
-};
-
-const uint8_t kMaskRandom41_9[54] = {
-  0x4e, 0x13, 0x84, 0xe1, 0x11, 0x00,
-  0x62, 0x38, 0xc6, 0x21, 0xa0, 0x80,
-  0x81, 0xe0, 0x78, 0x0e, 0x94, 0x00,
-  0xe1, 0x48, 0x5a, 0x15, 0x05, 0x00,
-  0x13, 0x94, 0xa5, 0x30, 0x06, 0x80,
-  0xb4, 0x2d, 0x0a, 0x42, 0x43, 0x00,
-  0x26, 0x89, 0xa1, 0x6a, 0x08, 0x80,
-  0x58, 0x56, 0x15, 0x84, 0x52, 0x00,
-  0x49, 0x86, 0x52, 0x98, 0x68, 0x00
-};
-
-const uint8_t kMaskRandom42_1[6] = {
-  0xff, 0xff, 0xff, 0xff, 0xff, 0xc0
-};
-
-const uint8_t kMaskRandom42_10[60] = {
-  0x4c, 0x19, 0x12, 0x60, 0xc8, 0x80,
-  0x51, 0x14, 0x52, 0x88, 0xa2, 0x80,
-  0xa0, 0x6a, 0x45, 0x03, 0x52, 0x00,
-  0x04, 0xc1, 0x30, 0x26, 0x09, 0x80,
-  0x03, 0xb4, 0x00, 0x1d, 0xa0, 0x00,
-  0x86, 0x20, 0x94, 0x31, 0x04, 0x80,
-  0x29, 0x08, 0x49, 0x48, 0x42, 0x40,
-  0x42, 0x43, 0x0a, 0x12, 0x18, 0x40,
-  0x98, 0x12, 0x84, 0xc0, 0x94, 0x00,
-  0x30, 0x84, 0xa9, 0x84, 0x25, 0x40
-};
-
-const uint8_t kMaskRandom42_11[66] = {
-  0xc6, 0x21, 0xa6, 0x31, 0x0d, 0x00,
-  0x23, 0x88, 0xc9, 0x1c, 0x46, 0x40,
-  0x1a, 0x45, 0x88, 0xd2, 0x2c, 0x40,
-  0x24, 0xd3, 0x09, 0x26, 0x98, 0x40,
-  0x71, 0x10, 0x73, 0x88, 0x83, 0x80,
-  0x0e, 0x19, 0x10, 0x70, 0xc8, 0x80,
-  0x33, 0x14, 0x51, 0x98, 0xa2, 0x80,
-  0x10, 0xc3, 0x28, 0x86, 0x19, 0x40,
-  0x45, 0x68, 0x4a, 0x2b, 0x42, 0x40,
-  0x88, 0x84, 0xac, 0x44, 0x25, 0x40,
-  0xe0, 0x22, 0x97, 0x01, 0x14, 0x80
-};
-
-const uint8_t kMaskRandom42_12[72] = {
-  0x0e, 0x19, 0x10, 0x70, 0xc8, 0x80,
-  0x33, 0x14, 0x51, 0x98, 0xa2, 0x80,
-  0x10, 0xc3, 0x28, 0x86, 0x19, 0x40,
-  0x45, 0x68, 0x4a, 0x2b, 0x42, 0x40,
-  0x88, 0x84, 0xac, 0x44, 0x25, 0x40,
-  0xe0, 0x22, 0x97, 0x01, 0x14, 0x80,
-  0xc6, 0x21, 0xa6, 0x31, 0x0d, 0x00,
-  0x23, 0x88, 0xc9, 0x1c, 0x46, 0x40,
-  0x1a, 0x45, 0x88, 0xd2, 0x2c, 0x40,
-  0x24, 0xd3, 0x09, 0x26, 0x98, 0x40,
-  0x71, 0x10, 0x73, 0x88, 0x83, 0x80,
-  0xa0, 0x65, 0x1d, 0x03, 0x28, 0xc0
-};
-
-const uint8_t kMaskRandom42_13[78] = {
-  0x0e, 0x19, 0x10, 0x70, 0xc8, 0x80,
-  0x33, 0x14, 0x51, 0x98, 0xa2, 0x80,
-  0x10, 0xc3, 0x28, 0x86, 0x19, 0x40,
-  0x45, 0x68, 0x4a, 0x2b, 0x42, 0x40,
-  0x88, 0x84, 0xac, 0x44, 0x25, 0x40,
-  0xe0, 0x22, 0x97, 0x01, 0x14, 0x80,
-  0x46, 0x11, 0x92, 0x30, 0x8c, 0x80,
-  0x33, 0x0c, 0xc9, 0x98, 0x66, 0x40,
-  0x10, 0xe4, 0x60, 0x87, 0x23, 0x00,
-  0x0c, 0x69, 0x08, 0x63, 0x48, 0x40,
-  0x28, 0x94, 0x29, 0x44, 0xa1, 0x40,
-  0x94, 0x21, 0x34, 0xa1, 0x09, 0x80,
-  0xc1, 0x02, 0x5e, 0x08, 0x12, 0xc0
-};
-
-const uint8_t kMaskRandom42_14[84] = {
-  0x46, 0x11, 0x92, 0x30, 0x8c, 0x80,
-  0x33, 0x0c, 0xc9, 0x98, 0x66, 0x40,
-  0x10, 0xe4, 0x60, 0x87, 0x23, 0x00,
-  0x0c, 0x69, 0x08, 0x63, 0x48, 0x40,
-  0x28, 0x94, 0x29, 0x44, 0xa1, 0x40,
-  0x94, 0x21, 0x34, 0xa1, 0x09, 0x80,
-  0xc1, 0x02, 0x5e, 0x08, 0x12, 0xc0,
-  0x0e, 0x19, 0x10, 0x70, 0xc8, 0x80,
-  0x33, 0x14, 0x51, 0x98, 0xa2, 0x80,
-  0x10, 0xc3, 0x28, 0x86, 0x19, 0x40,
-  0x45, 0x68, 0x4a, 0x2b, 0x42, 0x40,
-  0x88, 0x84, 0xac, 0x44, 0x25, 0x40,
-  0xe0, 0x22, 0x97, 0x01, 0x14, 0x80,
-  0x4d, 0xd0, 0xc2, 0x6e, 0x86, 0x00
-};
-
-const uint8_t kMaskRandom42_15[90] = {
-  0x46, 0x11, 0x92, 0x30, 0x8c, 0x80,
-  0x33, 0x0c, 0xc9, 0x98, 0x66, 0x40,
-  0x10, 0xe4, 0x60, 0x87, 0x23, 0x00,
-  0x0c, 0x69, 0x08, 0x63, 0x48, 0x40,
-  0x28, 0x94, 0x29, 0x44, 0xa1, 0x40,
-  0x94, 0x21, 0x34, 0xa1, 0x09, 0x80,
-  0xc1, 0x02, 0x5e, 0x08, 0x12, 0xc0,
-  0x2c, 0x03, 0x21, 0x60, 0x19, 0x00,
-  0x81, 0xa0, 0x1c, 0x0d, 0x00, 0xc0,
-  0xa0, 0x68, 0x25, 0x03, 0x41, 0x00,
-  0x05, 0x41, 0x50, 0x2a, 0x0a, 0x80,
-  0x18, 0x90, 0xc0, 0xc4, 0x86, 0x00,
-  0xc2, 0x06, 0x86, 0x10, 0x34, 0x00,
-  0x22, 0x98, 0x09, 0x14, 0xc0, 0x40,
-  0x50, 0x45, 0x0a, 0x82, 0x28, 0x40
-};
-
-const uint8_t kMaskRandom42_16[96] = {
-  0x2c, 0x03, 0x21, 0x60, 0x19, 0x00,
-  0x81, 0xa0, 0x1c, 0x0d, 0x00, 0xc0,
-  0xa0, 0x68, 0x25, 0x03, 0x41, 0x00,
-  0x05, 0x41, 0x50, 0x2a, 0x0a, 0x80,
-  0x18, 0x90, 0xc0, 0xc4, 0x86, 0x00,
-  0xc2, 0x06, 0x86, 0x10, 0x34, 0x00,
-  0x22, 0x98, 0x09, 0x14, 0xc0, 0x40,
-  0x50, 0x45, 0x0a, 0x82, 0x28, 0x40,
-  0x46, 0x11, 0x92, 0x30, 0x8c, 0x80,
-  0x33, 0x0c, 0xc9, 0x98, 0x66, 0x40,
-  0x10, 0xe4, 0x60, 0x87, 0x23, 0x00,
-  0x0c, 0x69, 0x08, 0x63, 0x48, 0x40,
-  0x28, 0x94, 0x29, 0x44, 0xa1, 0x40,
-  0x94, 0x21, 0x34, 0xa1, 0x09, 0x80,
-  0xc1, 0x02, 0x5e, 0x08, 0x12, 0xc0,
-  0x3b, 0xf5, 0x39, 0xdf, 0xa9, 0xc0
-};
-
-const uint8_t kMaskRandom42_17[102] = {
-  0x2c, 0x03, 0x21, 0x60, 0x19, 0x00,
-  0x81, 0xa0, 0x1c, 0x0d, 0x00, 0xc0,
-  0xa0, 0x68, 0x25, 0x03, 0x41, 0x00,
-  0x05, 0x41, 0x50, 0x2a, 0x0a, 0x80,
-  0x18, 0x90, 0xc0, 0xc4, 0x86, 0x00,
-  0xc2, 0x06, 0x86, 0x10, 0x34, 0x00,
-  0x22, 0x98, 0x09, 0x14, 0xc0, 0x40,
-  0x50, 0x45, 0x0a, 0x82, 0x28, 0x40,
-  0x4e, 0x11, 0x92, 0x70, 0x8c, 0x80,
-  0xe3, 0x18, 0x9f, 0x18, 0xc4, 0xc0,
-  0x81, 0xe3, 0x04, 0x0f, 0x18, 0x00,
-  0x21, 0x40, 0x59, 0x0a, 0x02, 0xc0,
-  0x52, 0x81, 0xe2, 0x94, 0x0f, 0x00,
-  0xb4, 0x28, 0x25, 0xa1, 0x41, 0x00,
-  0x26, 0x86, 0x29, 0x34, 0x31, 0x40,
-  0x58, 0x64, 0x42, 0xc3, 0x22, 0x00,
-  0x19, 0x9e, 0x00, 0xcc, 0xf0, 0x00
-};
-
-const uint8_t kMaskRandom42_18[108] = {
-  0x4e, 0x11, 0x92, 0x70, 0x8c, 0x80,
-  0xe3, 0x18, 0x9f, 0x18, 0xc4, 0xc0,
-  0x81, 0xe3, 0x04, 0x0f, 0x18, 0x00,
-  0x21, 0x40, 0x59, 0x0a, 0x02, 0xc0,
-  0x52, 0x81, 0xe2, 0x94, 0x0f, 0x00,
-  0xb4, 0x28, 0x25, 0xa1, 0x41, 0x00,
-  0x26, 0x86, 0x29, 0x34, 0x31, 0x40,
-  0x58, 0x64, 0x42, 0xc3, 0x22, 0x00,
-  0x19, 0x9e, 0x00, 0xcc, 0xf0, 0x00,
-  0x2c, 0x03, 0x21, 0x60, 0x19, 0x00,
-  0x81, 0xa0, 0x1c, 0x0d, 0x00, 0xc0,
-  0xa0, 0x68, 0x25, 0x03, 0x41, 0x00,
-  0x05, 0x41, 0x50, 0x2a, 0x0a, 0x80,
-  0x18, 0x90, 0xc0, 0xc4, 0x86, 0x00,
-  0xc2, 0x06, 0x86, 0x10, 0x34, 0x00,
-  0x22, 0x98, 0x09, 0x14, 0xc0, 0x40,
-  0x50, 0x45, 0x0a, 0x82, 0x28, 0x40,
-  0x5a, 0x56, 0x5a, 0xd2, 0xb2, 0xc0
-};
-
-const uint8_t kMaskRandom42_19[114] = {
-  0x4e, 0x11, 0x92, 0x70, 0x8c, 0x80,
-  0xe3, 0x18, 0x9f, 0x18, 0xc4, 0xc0,
-  0x81, 0xe3, 0x04, 0x0f, 0x18, 0x00,
-  0x21, 0x40, 0x59, 0x0a, 0x02, 0xc0,
-  0x52, 0x81, 0xe2, 0x94, 0x0f, 0x00,
-  0xb4, 0x28, 0x25, 0xa1, 0x41, 0x00,
-  0x26, 0x86, 0x29, 0x34, 0x31, 0x40,
-  0x58, 0x64, 0x42, 0xc3, 0x22, 0x00,
-  0x19, 0x9e, 0x00, 0xcc, 0xf0, 0x00,
-  0x4c, 0x19, 0x12, 0x60, 0xc8, 0x80,
-  0x51, 0x14, 0x52, 0x88, 0xa2, 0x80,
-  0xa0, 0x6a, 0x45, 0x03, 0x52, 0x00,
-  0x04, 0xc1, 0x30, 0x26, 0x09, 0x80,
-  0x03, 0xb4, 0x00, 0x1d, 0xa0, 0x00,
-  0x86, 0x20, 0x94, 0x31, 0x04, 0x80,
-  0x29, 0x08, 0x49, 0x48, 0x42, 0x40,
-  0x42, 0x43, 0x0a, 0x12, 0x18, 0x40,
-  0x98, 0x12, 0x84, 0xc0, 0x94, 0x00,
-  0x30, 0x84, 0xa9, 0x84, 0x25, 0x40
-};
-
-const uint8_t kMaskRandom42_2[12] = {
-  0xee, 0x3b, 0x37, 0x71, 0xd9, 0x80,
-  0x99, 0xe6, 0xec, 0xcf, 0x37, 0x40
-};
-
-const uint8_t kMaskRandom42_20[120] = {
-  0x4c, 0x19, 0x12, 0x60, 0xc8, 0x80,
-  0x51, 0x14, 0x52, 0x88, 0xa2, 0x80,
-  0xa0, 0x6a, 0x45, 0x03, 0x52, 0x00,
-  0x04, 0xc1, 0x30, 0x26, 0x09, 0x80,
-  0x03, 0xb4, 0x00, 0x1d, 0xa0, 0x00,
-  0x86, 0x20, 0x94, 0x31, 0x04, 0x80,
-  0x29, 0x08, 0x49, 0x48, 0x42, 0x40,
-  0x42, 0x43, 0x0a, 0x12, 0x18, 0x40,
-  0x98, 0x12, 0x84, 0xc0, 0x94, 0x00,
-  0x30, 0x84, 0xa9, 0x84, 0x25, 0x40,
-  0x4e, 0x11, 0x92, 0x70, 0x8c, 0x80,
-  0xe3, 0x18, 0x9f, 0x18, 0xc4, 0xc0,
-  0x81, 0xe3, 0x04, 0x0f, 0x18, 0x00,
-  0x21, 0x40, 0x59, 0x0a, 0x02, 0xc0,
-  0x52, 0x81, 0xe2, 0x94, 0x0f, 0x00,
-  0xb4, 0x28, 0x25, 0xa1, 0x41, 0x00,
-  0x26, 0x86, 0x29, 0x34, 0x31, 0x40,
-  0x58, 0x64, 0x42, 0xc3, 0x22, 0x00,
-  0x19, 0x9e, 0x00, 0xcc, 0xf0, 0x00,
-  0x2a, 0x03, 0x31, 0x50, 0x19, 0x80
-};
-
-const uint8_t kMaskRandom42_21[126] = {
-  0x4c, 0x19, 0x12, 0x60, 0xc8, 0x80,
-  0x51, 0x14, 0x52, 0x88, 0xa2, 0x80,
-  0xa0, 0x6a, 0x45, 0x03, 0x52, 0x00,
-  0x04, 0xc1, 0x30, 0x26, 0x09, 0x80,
-  0x03, 0xb4, 0x00, 0x1d, 0xa0, 0x00,
-  0x86, 0x20, 0x94, 0x31, 0x04, 0x80,
-  0x29, 0x08, 0x49, 0x48, 0x42, 0x40,
-  0x42, 0x43, 0x0a, 0x12, 0x18, 0x40,
-  0x98, 0x12, 0x84, 0xc0, 0x94, 0x00,
-  0x30, 0x84, 0xa9, 0x84, 0x25, 0x40,
-  0x4c, 0x11, 0x92, 0x60, 0x8c, 0x80,
-  0x51, 0x0c, 0xca, 0x88, 0x66, 0x40,
-  0xa0, 0x66, 0x45, 0x03, 0x32, 0x00,
-  0x04, 0xc1, 0x60, 0x26, 0x0b, 0x00,
-  0x03, 0xa0, 0x28, 0x1d, 0x01, 0x40,
-  0x86, 0x21, 0x14, 0x31, 0x08, 0x80,
-  0x29, 0x10, 0x19, 0x48, 0x80, 0xc0,
-  0x42, 0x42, 0xa2, 0x12, 0x15, 0x00,
-  0x98, 0x1a, 0x04, 0xc0, 0xd0, 0x00,
-  0x30, 0x84, 0x09, 0x84, 0x20, 0x40,
-  0xdf, 0x4c, 0x16, 0xfa, 0x60, 0x80
-};
-
-const uint8_t kMaskRandom42_22[132] = {
-  0xc6, 0x21, 0xa6, 0x31, 0x0d, 0x00,
-  0x23, 0x88, 0xc9, 0x1c, 0x46, 0x40,
-  0x1a, 0x45, 0x88, 0xd2, 0x2c, 0x40,
-  0x24, 0xd3, 0x09, 0x26, 0x98, 0x40,
-  0x71, 0x10, 0x73, 0x88, 0x83, 0x80,
-  0x0e, 0x19, 0x10, 0x70, 0xc8, 0x80,
-  0x33, 0x14, 0x51, 0x98, 0xa2, 0x80,
-  0x10, 0xc3, 0x28, 0x86, 0x19, 0x40,
-  0x45, 0x68, 0x4a, 0x2b, 0x42, 0x40,
-  0x88, 0x84, 0xac, 0x44, 0x25, 0x40,
-  0xe0, 0x22, 0x97, 0x01, 0x14, 0x80,
-  0x4c, 0x19, 0x12, 0x60, 0xc8, 0x80,
-  0x51, 0x14, 0x52, 0x88, 0xa2, 0x80,
-  0xa0, 0x6a, 0x45, 0x03, 0x52, 0x00,
-  0x04, 0xc1, 0x30, 0x26, 0x09, 0x80,
-  0x03, 0xb4, 0x00, 0x1d, 0xa0, 0x00,
-  0x86, 0x20, 0x94, 0x31, 0x04, 0x80,
-  0x29, 0x08, 0x49, 0x48, 0x42, 0x40,
-  0x42, 0x43, 0x0a, 0x12, 0x18, 0x40,
-  0x98, 0x12, 0x84, 0xc0, 0x94, 0x00,
-  0x30, 0x84, 0xa9, 0x84, 0x25, 0x40,
-  0xdb, 0x36, 0xb0, 0x33, 0x14, 0x80
-};
-
-const uint8_t kMaskRandom42_23[138] = {
-  0xc6, 0x21, 0xa6, 0x31, 0x0d, 0x00,
-  0x23, 0x88, 0xc9, 0x1c, 0x46, 0x40,
-  0x1a, 0x45, 0x88, 0xd2, 0x2c, 0x40,
-  0x24, 0xd3, 0x09, 0x26, 0x98, 0x40,
-  0x71, 0x10, 0x73, 0x88, 0x83, 0x80,
-  0x0e, 0x19, 0x10, 0x70, 0xc8, 0x80,
-  0x33, 0x14, 0x51, 0x98, 0xa2, 0x80,
-  0x10, 0xc3, 0x28, 0x86, 0x19, 0x40,
-  0x45, 0x68, 0x4a, 0x2b, 0x42, 0x40,
-  0x88, 0x84, 0xac, 0x44, 0x25, 0x40,
-  0xe0, 0x22, 0x97, 0x01, 0x14, 0x80,
-  0x0e, 0x19, 0x10, 0x70, 0xc8, 0x80,
-  0x33, 0x14, 0x51, 0x98, 0xa2, 0x80,
-  0x10, 0xc3, 0x28, 0x86, 0x19, 0x40,
-  0x45, 0x68, 0x4a, 0x2b, 0x42, 0x40,
-  0x88, 0x84, 0xac, 0x44, 0x25, 0x40,
-  0xe0, 0x22, 0x97, 0x01, 0x14, 0x80,
-  0xc6, 0x21, 0xa6, 0x31, 0x0d, 0x00,
-  0x23, 0x88, 0xc9, 0x1c, 0x46, 0x40,
-  0x1a, 0x45, 0x88, 0xd2, 0x2c, 0x40,
-  0x24, 0xd3, 0x09, 0x26, 0x98, 0x40,
-  0x71, 0x10, 0x73, 0x88, 0x83, 0x80,
-  0xa0, 0x65, 0x1d, 0x03, 0x28, 0xc0
-};
-
-const uint8_t kMaskRandom42_24[144] = {
-  0x0e, 0x19, 0x10, 0x70, 0xc8, 0x80,
-  0x33, 0x14, 0x51, 0x98, 0xa2, 0x80,
-  0x10, 0xc3, 0x28, 0x86, 0x19, 0x40,
-  0x45, 0x68, 0x4a, 0x2b, 0x42, 0x40,
-  0x88, 0x84, 0xac, 0x44, 0x25, 0x40,
-  0xe0, 0x22, 0x97, 0x01, 0x14, 0x80,
-  0xc6, 0x21, 0xa6, 0x31, 0x0d, 0x00,
-  0x23, 0x88, 0xc9, 0x1c, 0x46, 0x40,
-  0x1a, 0x45, 0x88, 0xd2, 0x2c, 0x40,
-  0x24, 0xd3, 0x09, 0x26, 0x98, 0x40,
-  0x71, 0x10, 0x73, 0x88, 0x83, 0x80,
-  0xa0, 0x65, 0x1d, 0x03, 0x28, 0xc0,
-  0xc6, 0x21, 0xa6, 0x31, 0x0d, 0x00,
-  0x23, 0x88, 0xc9, 0x1c, 0x46, 0x40,
-  0x1a, 0x45, 0x88, 0xd2, 0x2c, 0x40,
-  0x24, 0xd3, 0x09, 0x26, 0x98, 0x40,
-  0x71, 0x10, 0x73, 0x88, 0x83, 0x80,
-  0x0e, 0x19, 0x10, 0x70, 0xc8, 0x80,
-  0x33, 0x14, 0x51, 0x98, 0xa2, 0x80,
-  0x10, 0xc3, 0x28, 0x86, 0x19, 0x40,
-  0x45, 0x68, 0x4a, 0x2b, 0x42, 0x40,
-  0x88, 0x84, 0xac, 0x44, 0x25, 0x40,
-  0xe0, 0x22, 0x97, 0x01, 0x14, 0x80,
-  0x2e, 0x1c, 0x92, 0xbb, 0x07, 0xc0
-};
-
-const uint8_t kMaskRandom42_25[150] = {
-  0x0e, 0x19, 0x10, 0x70, 0xc8, 0x80,
-  0x33, 0x14, 0x51, 0x98, 0xa2, 0x80,
-  0x10, 0xc3, 0x28, 0x86, 0x19, 0x40,
-  0x45, 0x68, 0x4a, 0x2b, 0x42, 0x40,
-  0x88, 0x84, 0xac, 0x44, 0x25, 0x40,
-  0xe0, 0x22, 0x97, 0x01, 0x14, 0x80,
-  0xc6, 0x21, 0xa6, 0x31, 0x0d, 0x00,
-  0x23, 0x88, 0xc9, 0x1c, 0x46, 0x40,
-  0x1a, 0x45, 0x88, 0xd2, 0x2c, 0x40,
-  0x24, 0xd3, 0x09, 0x26, 0x98, 0x40,
-  0x71, 0x10, 0x73, 0x88, 0x83, 0x80,
-  0xa0, 0x65, 0x1d, 0x03, 0x28, 0xc0,
-  0x0e, 0x19, 0x10, 0x70, 0xc8, 0x80,
-  0x33, 0x14, 0x51, 0x98, 0xa2, 0x80,
-  0x10, 0xc3, 0x28, 0x86, 0x19, 0x40,
-  0x45, 0x68, 0x4a, 0x2b, 0x42, 0x40,
-  0x88, 0x84, 0xac, 0x44, 0x25, 0x40,
-  0xe0, 0x22, 0x97, 0x01, 0x14, 0x80,
-  0x46, 0x11, 0x92, 0x30, 0x8c, 0x80,
-  0x33, 0x0c, 0xc9, 0x98, 0x66, 0x40,
-  0x10, 0xe4, 0x60, 0x87, 0x23, 0x00,
-  0x0c, 0x69, 0x08, 0x63, 0x48, 0x40,
-  0x28, 0x94, 0x29, 0x44, 0xa1, 0x40,
-  0x94, 0x21, 0x34, 0xa1, 0x09, 0x80,
-  0xc1, 0x02, 0x5e, 0x08, 0x12, 0xc0
-};
-
-const uint8_t kMaskRandom42_26[156] = {
-  0x0e, 0x19, 0x10, 0x70, 0xc8, 0x80,
-  0x33, 0x14, 0x51, 0x98, 0xa2, 0x80,
-  0x10, 0xc3, 0x28, 0x86, 0x19, 0x40,
-  0x45, 0x68, 0x4a, 0x2b, 0x42, 0x40,
-  0x88, 0x84, 0xac, 0x44, 0x25, 0x40,
-  0xe0, 0x22, 0x97, 0x01, 0x14, 0x80,
-  0x46, 0x11, 0x92, 0x30, 0x8c, 0x80,
-  0x33, 0x0c, 0xc9, 0x98, 0x66, 0x40,
-  0x10, 0xe4, 0x60, 0x87, 0x23, 0x00,
-  0x0c, 0x69, 0x08, 0x63, 0x48, 0x40,
-  0x28, 0x94, 0x29, 0x44, 0xa1, 0x40,
-  0x94, 0x21, 0x34, 0xa1, 0x09, 0x80,
-  0xc1, 0x02, 0x5e, 0x08, 0x12, 0xc0,
-  0x0e, 0x19, 0x10, 0x70, 0xc8, 0x80,
-  0x33, 0x14, 0x51, 0x98, 0xa2, 0x80,
-  0x10, 0xc3, 0x28, 0x86, 0x19, 0x40,
-  0x45, 0x68, 0x4a, 0x2b, 0x42, 0x40,
-  0x88, 0x84, 0xac, 0x44, 0x25, 0x40,
-  0xe0, 0x22, 0x97, 0x01, 0x14, 0x80,
-  0xc6, 0x21, 0xa6, 0x31, 0x0d, 0x00,
-  0x23, 0x88, 0xc9, 0x1c, 0x46, 0x40,
-  0x1a, 0x45, 0x88, 0xd2, 0x2c, 0x40,
-  0x24, 0xd3, 0x09, 0x26, 0x98, 0x40,
-  0x71, 0x10, 0x73, 0x88, 0x83, 0x80,
-  0xa0, 0x65, 0x1d, 0x03, 0x28, 0xc0,
-  0xb8, 0x41, 0xed, 0xa3, 0x77, 0xc0
-};
-
-const uint8_t kMaskRandom42_27[162] = {
-  0x0e, 0x19, 0x10, 0x70, 0xc8, 0x80,
-  0x33, 0x14, 0x51, 0x98, 0xa2, 0x80,
-  0x10, 0xc3, 0x28, 0x86, 0x19, 0x40,
-  0x45, 0x68, 0x4a, 0x2b, 0x42, 0x40,
-  0x88, 0x84, 0xac, 0x44, 0x25, 0x40,
-  0xe0, 0x22, 0x97, 0x01, 0x14, 0x80,
-  0x46, 0x11, 0x92, 0x30, 0x8c, 0x80,
-  0x33, 0x0c, 0xc9, 0x98, 0x66, 0x40,
-  0x10, 0xe4, 0x60, 0x87, 0x23, 0x00,
-  0x0c, 0x69, 0x08, 0x63, 0x48, 0x40,
-  0x28, 0x94, 0x29, 0x44, 0xa1, 0x40,
-  0x94, 0x21, 0x34, 0xa1, 0x09, 0x80,
-  0xc1, 0x02, 0x5e, 0x08, 0x12, 0xc0,
-  0x46, 0x11, 0x92, 0x30, 0x8c, 0x80,
-  0x33, 0x0c, 0xc9, 0x98, 0x66, 0x40,
-  0x10, 0xe4, 0x60, 0x87, 0x23, 0x00,
-  0x0c, 0x69, 0x08, 0x63, 0x48, 0x40,
-  0x28, 0x94, 0x29, 0x44, 0xa1, 0x40,
-  0x94, 0x21, 0x34, 0xa1, 0x09, 0x80,
-  0xc1, 0x02, 0x5e, 0x08, 0x12, 0xc0,
-  0x0e, 0x19, 0x10, 0x70, 0xc8, 0x80,
-  0x33, 0x14, 0x51, 0x98, 0xa2, 0x80,
-  0x10, 0xc3, 0x28, 0x86, 0x19, 0x40,
-  0x45, 0x68, 0x4a, 0x2b, 0x42, 0x40,
-  0x88, 0x84, 0xac, 0x44, 0x25, 0x40,
-  0xe0, 0x22, 0x97, 0x01, 0x14, 0x80,
-  0x4d, 0xd0, 0xc2, 0x6e, 0x86, 0x00
-};
-
-const uint8_t kMaskRandom42_28[168] = {
-  0x46, 0x11, 0x92, 0x30, 0x8c, 0x80,
-  0x33, 0x0c, 0xc9, 0x98, 0x66, 0x40,
-  0x10, 0xe4, 0x60, 0x87, 0x23, 0x00,
-  0x0c, 0x69, 0x08, 0x63, 0x48, 0x40,
-  0x28, 0x94, 0x29, 0x44, 0xa1, 0x40,
-  0x94, 0x21, 0x34, 0xa1, 0x09, 0x80,
-  0xc1, 0x02, 0x5e, 0x08, 0x12, 0xc0,
-  0x0e, 0x19, 0x10, 0x70, 0xc8, 0x80,
-  0x33, 0x14, 0x51, 0x98, 0xa2, 0x80,
-  0x10, 0xc3, 0x28, 0x86, 0x19, 0x40,
-  0x45, 0x68, 0x4a, 0x2b, 0x42, 0x40,
-  0x88, 0x84, 0xac, 0x44, 0x25, 0x40,
-  0xe0, 0x22, 0x97, 0x01, 0x14, 0x80,
-  0x4d, 0xd0, 0xc2, 0x6e, 0x86, 0x00,
-  0x0e, 0x19, 0x10, 0x70, 0xc8, 0x80,
-  0x33, 0x14, 0x51, 0x98, 0xa2, 0x80,
-  0x10, 0xc3, 0x28, 0x86, 0x19, 0x40,
-  0x45, 0x68, 0x4a, 0x2b, 0x42, 0x40,
-  0x88, 0x84, 0xac, 0x44, 0x25, 0x40,
-  0xe0, 0x22, 0x97, 0x01, 0x14, 0x80,
-  0x46, 0x11, 0x92, 0x30, 0x8c, 0x80,
-  0x33, 0x0c, 0xc9, 0x98, 0x66, 0x40,
-  0x10, 0xe4, 0x60, 0x87, 0x23, 0x00,
-  0x0c, 0x69, 0x08, 0x63, 0x48, 0x40,
-  0x28, 0x94, 0x29, 0x44, 0xa1, 0x40,
-  0x94, 0x21, 0x34, 0xa1, 0x09, 0x80,
-  0xc1, 0x02, 0x5e, 0x08, 0x12, 0xc0,
-  0xc3, 0x3c, 0x56, 0xc2, 0x30, 0x40
-};
-
-const uint8_t kMaskRandom42_29[174] = {
-  0x46, 0x11, 0x92, 0x30, 0x8c, 0x80,
-  0x33, 0x0c, 0xc9, 0x98, 0x66, 0x40,
-  0x10, 0xe4, 0x60, 0x87, 0x23, 0x00,
-  0x0c, 0x69, 0x08, 0x63, 0x48, 0x40,
-  0x28, 0x94, 0x29, 0x44, 0xa1, 0x40,
-  0x94, 0x21, 0x34, 0xa1, 0x09, 0x80,
-  0xc1, 0x02, 0x5e, 0x08, 0x12, 0xc0,
-  0x0e, 0x19, 0x10, 0x70, 0xc8, 0x80,
-  0x33, 0x14, 0x51, 0x98, 0xa2, 0x80,
-  0x10, 0xc3, 0x28, 0x86, 0x19, 0x40,
-  0x45, 0x68, 0x4a, 0x2b, 0x42, 0x40,
-  0x88, 0x84, 0xac, 0x44, 0x25, 0x40,
-  0xe0, 0x22, 0x97, 0x01, 0x14, 0x80,
-  0x4d, 0xd0, 0xc2, 0x6e, 0x86, 0x00,
-  0x46, 0x11, 0x92, 0x30, 0x8c, 0x80,
-  0x33, 0x0c, 0xc9, 0x98, 0x66, 0x40,
-  0x10, 0xe4, 0x60, 0x87, 0x23, 0x00,
-  0x0c, 0x69, 0x08, 0x63, 0x48, 0x40,
-  0x28, 0x94, 0x29, 0x44, 0xa1, 0x40,
-  0x94, 0x21, 0x34, 0xa1, 0x09, 0x80,
-  0xc1, 0x02, 0x5e, 0x08, 0x12, 0xc0,
-  0x2c, 0x03, 0x21, 0x60, 0x19, 0x00,
-  0x81, 0xa0, 0x1c, 0x0d, 0x00, 0xc0,
-  0xa0, 0x68, 0x25, 0x03, 0x41, 0x00,
-  0x05, 0x41, 0x50, 0x2a, 0x0a, 0x80,
-  0x18, 0x90, 0xc0, 0xc4, 0x86, 0x00,
-  0xc2, 0x06, 0x86, 0x10, 0x34, 0x00,
-  0x22, 0x98, 0x09, 0x14, 0xc0, 0x40,
-  0x50, 0x45, 0x0a, 0x82, 0x28, 0x40
-};
-
-const uint8_t kMaskRandom42_3[18] = {
-  0xce, 0x32, 0xb6, 0x71, 0x95, 0x80,
-  0x55, 0xdc, 0x52, 0xae, 0xe2, 0x80,
-  0xa8, 0xed, 0x8d, 0x47, 0x6c, 0x40
-};
-
-const uint8_t kMaskRandom42_30[180] = {
-  0x46, 0x11, 0x92, 0x30, 0x8c, 0x80,
-  0x33, 0x0c, 0xc9, 0x98, 0x66, 0x40,
-  0x10, 0xe4, 0x60, 0x87, 0x23, 0x00,
-  0x0c, 0x69, 0x08, 0x63, 0x48, 0x40,
-  0x28, 0x94, 0x29, 0x44, 0xa1, 0x40,
-  0x94, 0x21, 0x34, 0xa1, 0x09, 0x80,
-  0xc1, 0x02, 0x5e, 0x08, 0x12, 0xc0,
-  0x2c, 0x03, 0x21, 0x60, 0x19, 0x00,
-  0x81, 0xa0, 0x1c, 0x0d, 0x00, 0xc0,
-  0xa0, 0x68, 0x25, 0x03, 0x41, 0x00,
-  0x05, 0x41, 0x50, 0x2a, 0x0a, 0x80,
-  0x18, 0x90, 0xc0, 0xc4, 0x86, 0x00,
-  0xc2, 0x06, 0x86, 0x10, 0x34, 0x00,
-  0x22, 0x98, 0x09, 0x14, 0xc0, 0x40,
-  0x50, 0x45, 0x0a, 0x82, 0x28, 0x40,
-  0x46, 0x11, 0x92, 0x30, 0x8c, 0x80,
-  0x33, 0x0c, 0xc9, 0x98, 0x66, 0x40,
-  0x10, 0xe4, 0x60, 0x87, 0x23, 0x00,
-  0x0c, 0x69, 0x08, 0x63, 0x48, 0x40,
-  0x28, 0x94, 0x29, 0x44, 0xa1, 0x40,
-  0x94, 0x21, 0x34, 0xa1, 0x09, 0x80,
-  0xc1, 0x02, 0x5e, 0x08, 0x12, 0xc0,
-  0x0e, 0x19, 0x10, 0x70, 0xc8, 0x80,
-  0x33, 0x14, 0x51, 0x98, 0xa2, 0x80,
-  0x10, 0xc3, 0x28, 0x86, 0x19, 0x40,
-  0x45, 0x68, 0x4a, 0x2b, 0x42, 0x40,
-  0x88, 0x84, 0xac, 0x44, 0x25, 0x40,
-  0xe0, 0x22, 0x97, 0x01, 0x14, 0x80,
-  0x4d, 0xd0, 0xc2, 0x6e, 0x86, 0x00,
-  0xf5, 0xdd, 0x0d, 0x58, 0xeb, 0x00
-};
-
-const uint8_t kMaskRandom42_31[186] = {
-  0x46, 0x11, 0x92, 0x30, 0x8c, 0x80,
-  0x33, 0x0c, 0xc9, 0x98, 0x66, 0x40,
-  0x10, 0xe4, 0x60, 0x87, 0x23, 0x00,
-  0x0c, 0x69, 0x08, 0x63, 0x48, 0x40,
-  0x28, 0x94, 0x29, 0x44, 0xa1, 0x40,
-  0x94, 0x21, 0x34, 0xa1, 0x09, 0x80,
-  0xc1, 0x02, 0x5e, 0x08, 0x12, 0xc0,
-  0x2c, 0x03, 0x21, 0x60, 0x19, 0x00,
-  0x81, 0xa0, 0x1c, 0x0d, 0x00, 0xc0,
-  0xa0, 0x68, 0x25, 0x03, 0x41, 0x00,
-  0x05, 0x41, 0x50, 0x2a, 0x0a, 0x80,
-  0x18, 0x90, 0xc0, 0xc4, 0x86, 0x00,
-  0xc2, 0x06, 0x86, 0x10, 0x34, 0x00,
-  0x22, 0x98, 0x09, 0x14, 0xc0, 0x40,
-  0x50, 0x45, 0x0a, 0x82, 0x28, 0x40,
-  0x2c, 0x03, 0x21, 0x60, 0x19, 0x00,
-  0x81, 0xa0, 0x1c, 0x0d, 0x00, 0xc0,
-  0xa0, 0x68, 0x25, 0x03, 0x41, 0x00,
-  0x05, 0x41, 0x50, 0x2a, 0x0a, 0x80,
-  0x18, 0x90, 0xc0, 0xc4, 0x86, 0x00,
-  0xc2, 0x06, 0x86, 0x10, 0x34, 0x00,
-  0x22, 0x98, 0x09, 0x14, 0xc0, 0x40,
-  0x50, 0x45, 0x0a, 0x82, 0x28, 0x40,
-  0x46, 0x11, 0x92, 0x30, 0x8c, 0x80,
-  0x33, 0x0c, 0xc9, 0x98, 0x66, 0x40,
-  0x10, 0xe4, 0x60, 0x87, 0x23, 0x00,
-  0x0c, 0x69, 0x08, 0x63, 0x48, 0x40,
-  0x28, 0x94, 0x29, 0x44, 0xa1, 0x40,
-  0x94, 0x21, 0x34, 0xa1, 0x09, 0x80,
-  0xc1, 0x02, 0x5e, 0x08, 0x12, 0xc0,
-  0x3b, 0xf5, 0x39, 0xdf, 0xa9, 0xc0
-};
-
-const uint8_t kMaskRandom42_32[192] = {
-  0x2c, 0x03, 0x21, 0x60, 0x19, 0x00,
-  0x81, 0xa0, 0x1c, 0x0d, 0x00, 0xc0,
-  0xa0, 0x68, 0x25, 0x03, 0x41, 0x00,
-  0x05, 0x41, 0x50, 0x2a, 0x0a, 0x80,
-  0x18, 0x90, 0xc0, 0xc4, 0x86, 0x00,
-  0xc2, 0x06, 0x86, 0x10, 0x34, 0x00,
-  0x22, 0x98, 0x09, 0x14, 0xc0, 0x40,
-  0x50, 0x45, 0x0a, 0x82, 0x28, 0x40,
-  0x46, 0x11, 0x92, 0x30, 0x8c, 0x80,
-  0x33, 0x0c, 0xc9, 0x98, 0x66, 0x40,
-  0x10, 0xe4, 0x60, 0x87, 0x23, 0x00,
-  0x0c, 0x69, 0x08, 0x63, 0x48, 0x40,
-  0x28, 0x94, 0x29, 0x44, 0xa1, 0x40,
-  0x94, 0x21, 0x34, 0xa1, 0x09, 0x80,
-  0xc1, 0x02, 0x5e, 0x08, 0x12, 0xc0,
-  0x3b, 0xf5, 0x39, 0xdf, 0xa9, 0xc0,
-  0x46, 0x11, 0x92, 0x30, 0x8c, 0x80,
-  0x33, 0x0c, 0xc9, 0x98, 0x66, 0x40,
-  0x10, 0xe4, 0x60, 0x87, 0x23, 0x00,
-  0x0c, 0x69, 0x08, 0x63, 0x48, 0x40,
-  0x28, 0x94, 0x29, 0x44, 0xa1, 0x40,
-  0x94, 0x21, 0x34, 0xa1, 0x09, 0x80,
-  0xc1, 0x02, 0x5e, 0x08, 0x12, 0xc0,
-  0x2c, 0x03, 0x21, 0x60, 0x19, 0x00,
-  0x81, 0xa0, 0x1c, 0x0d, 0x00, 0xc0,
-  0xa0, 0x68, 0x25, 0x03, 0x41, 0x00,
-  0x05, 0x41, 0x50, 0x2a, 0x0a, 0x80,
-  0x18, 0x90, 0xc0, 0xc4, 0x86, 0x00,
-  0xc2, 0x06, 0x86, 0x10, 0x34, 0x00,
-  0x22, 0x98, 0x09, 0x14, 0xc0, 0x40,
-  0x50, 0x45, 0x0a, 0x82, 0x28, 0x40,
-  0xf9, 0x1f, 0xb6, 0xe1, 0x09, 0xc0
-};
-
-const uint8_t kMaskRandom42_33[198] = {
-  0x2c, 0x03, 0x21, 0x60, 0x19, 0x00,
-  0x81, 0xa0, 0x1c, 0x0d, 0x00, 0xc0,
-  0xa0, 0x68, 0x25, 0x03, 0x41, 0x00,
-  0x05, 0x41, 0x50, 0x2a, 0x0a, 0x80,
-  0x18, 0x90, 0xc0, 0xc4, 0x86, 0x00,
-  0xc2, 0x06, 0x86, 0x10, 0x34, 0x00,
-  0x22, 0x98, 0x09, 0x14, 0xc0, 0x40,
-  0x50, 0x45, 0x0a, 0x82, 0x28, 0x40,
-  0x46, 0x11, 0x92, 0x30, 0x8c, 0x80,
-  0x33, 0x0c, 0xc9, 0x98, 0x66, 0x40,
-  0x10, 0xe4, 0x60, 0x87, 0x23, 0x00,
-  0x0c, 0x69, 0x08, 0x63, 0x48, 0x40,
-  0x28, 0x94, 0x29, 0x44, 0xa1, 0x40,
-  0x94, 0x21, 0x34, 0xa1, 0x09, 0x80,
-  0xc1, 0x02, 0x5e, 0x08, 0x12, 0xc0,
-  0x3b, 0xf5, 0x39, 0xdf, 0xa9, 0xc0,
-  0x2c, 0x03, 0x21, 0x60, 0x19, 0x00,
-  0x81, 0xa0, 0x1c, 0x0d, 0x00, 0xc0,
-  0xa0, 0x68, 0x25, 0x03, 0x41, 0x00,
-  0x05, 0x41, 0x50, 0x2a, 0x0a, 0x80,
-  0x18, 0x90, 0xc0, 0xc4, 0x86, 0x00,
-  0xc2, 0x06, 0x86, 0x10, 0x34, 0x00,
-  0x22, 0x98, 0x09, 0x14, 0xc0, 0x40,
-  0x50, 0x45, 0x0a, 0x82, 0x28, 0x40,
-  0x4e, 0x11, 0x92, 0x70, 0x8c, 0x80,
-  0xe3, 0x18, 0x9f, 0x18, 0xc4, 0xc0,
-  0x81, 0xe3, 0x04, 0x0f, 0x18, 0x00,
-  0x21, 0x40, 0x59, 0x0a, 0x02, 0xc0,
-  0x52, 0x81, 0xe2, 0x94, 0x0f, 0x00,
-  0xb4, 0x28, 0x25, 0xa1, 0x41, 0x00,
-  0x26, 0x86, 0x29, 0x34, 0x31, 0x40,
-  0x58, 0x64, 0x42, 0xc3, 0x22, 0x00,
-  0x19, 0x9e, 0x00, 0xcc, 0xf0, 0x00
-};
-
-const uint8_t kMaskRandom42_34[204] = {
-  0x2c, 0x03, 0x21, 0x60, 0x19, 0x00,
-  0x81, 0xa0, 0x1c, 0x0d, 0x00, 0xc0,
-  0xa0, 0x68, 0x25, 0x03, 0x41, 0x00,
-  0x05, 0x41, 0x50, 0x2a, 0x0a, 0x80,
-  0x18, 0x90, 0xc0, 0xc4, 0x86, 0x00,
-  0xc2, 0x06, 0x86, 0x10, 0x34, 0x00,
-  0x22, 0x98, 0x09, 0x14, 0xc0, 0x40,
-  0x50, 0x45, 0x0a, 0x82, 0x28, 0x40,
-  0x4e, 0x11, 0x92, 0x70, 0x8c, 0x80,
-  0xe3, 0x18, 0x9f, 0x18, 0xc4, 0xc0,
-  0x81, 0xe3, 0x04, 0x0f, 0x18, 0x00,
-  0x21, 0x40, 0x59, 0x0a, 0x02, 0xc0,
-  0x52, 0x81, 0xe2, 0x94, 0x0f, 0x00,
-  0xb4, 0x28, 0x25, 0xa1, 0x41, 0x00,
-  0x26, 0x86, 0x29, 0x34, 0x31, 0x40,
-  0x58, 0x64, 0x42, 0xc3, 0x22, 0x00,
-  0x19, 0x9e, 0x00, 0xcc, 0xf0, 0x00,
-  0x2c, 0x03, 0x21, 0x60, 0x19, 0x00,
-  0x81, 0xa0, 0x1c, 0x0d, 0x00, 0xc0,
-  0xa0, 0x68, 0x25, 0x03, 0x41, 0x00,
-  0x05, 0x41, 0x50, 0x2a, 0x0a, 0x80,
-  0x18, 0x90, 0xc0, 0xc4, 0x86, 0x00,
-  0xc2, 0x06, 0x86, 0x10, 0x34, 0x00,
-  0x22, 0x98, 0x09, 0x14, 0xc0, 0x40,
-  0x50, 0x45, 0x0a, 0x82, 0x28, 0x40,
-  0x46, 0x11, 0x92, 0x30, 0x8c, 0x80,
-  0x33, 0x0c, 0xc9, 0x98, 0x66, 0x40,
-  0x10, 0xe4, 0x60, 0x87, 0x23, 0x00,
-  0x0c, 0x69, 0x08, 0x63, 0x48, 0x40,
-  0x28, 0x94, 0x29, 0x44, 0xa1, 0x40,
-  0x94, 0x21, 0x34, 0xa1, 0x09, 0x80,
-  0xc1, 0x02, 0x5e, 0x08, 0x12, 0xc0,
-  0x3b, 0xf5, 0x39, 0xdf, 0xa9, 0xc0,
-  0xf8, 0xbf, 0xf6, 0x76, 0x1b, 0x80
-};
-
-const uint8_t kMaskRandom42_35[210] = {
-  0x2c, 0x03, 0x21, 0x60, 0x19, 0x00,
-  0x81, 0xa0, 0x1c, 0x0d, 0x00, 0xc0,
-  0xa0, 0x68, 0x25, 0x03, 0x41, 0x00,
-  0x05, 0x41, 0x50, 0x2a, 0x0a, 0x80,
-  0x18, 0x90, 0xc0, 0xc4, 0x86, 0x00,
-  0xc2, 0x06, 0x86, 0x10, 0x34, 0x00,
-  0x22, 0x98, 0x09, 0x14, 0xc0, 0x40,
-  0x50, 0x45, 0x0a, 0x82, 0x28, 0x40,
-  0x4e, 0x11, 0x92, 0x70, 0x8c, 0x80,
-  0xe3, 0x18, 0x9f, 0x18, 0xc4, 0xc0,
-  0x81, 0xe3, 0x04, 0x0f, 0x18, 0x00,
-  0x21, 0x40, 0x59, 0x0a, 0x02, 0xc0,
-  0x52, 0x81, 0xe2, 0x94, 0x0f, 0x00,
-  0xb4, 0x28, 0x25, 0xa1, 0x41, 0x00,
-  0x26, 0x86, 0x29, 0x34, 0x31, 0x40,
-  0x58, 0x64, 0x42, 0xc3, 0x22, 0x00,
-  0x19, 0x9e, 0x00, 0xcc, 0xf0, 0x00,
-  0x4e, 0x11, 0x92, 0x70, 0x8c, 0x80,
-  0xe3, 0x18, 0x9f, 0x18, 0xc4, 0xc0,
-  0x81, 0xe3, 0x04, 0x0f, 0x18, 0x00,
-  0x21, 0x40, 0x59, 0x0a, 0x02, 0xc0,
-  0x52, 0x81, 0xe2, 0x94, 0x0f, 0x00,
-  0xb4, 0x28, 0x25, 0xa1, 0x41, 0x00,
-  0x26, 0x86, 0x29, 0x34, 0x31, 0x40,
-  0x58, 0x64, 0x42, 0xc3, 0x22, 0x00,
-  0x19, 0x9e, 0x00, 0xcc, 0xf0, 0x00,
-  0x2c, 0x03, 0x21, 0x60, 0x19, 0x00,
-  0x81, 0xa0, 0x1c, 0x0d, 0x00, 0xc0,
-  0xa0, 0x68, 0x25, 0x03, 0x41, 0x00,
-  0x05, 0x41, 0x50, 0x2a, 0x0a, 0x80,
-  0x18, 0x90, 0xc0, 0xc4, 0x86, 0x00,
-  0xc2, 0x06, 0x86, 0x10, 0x34, 0x00,
-  0x22, 0x98, 0x09, 0x14, 0xc0, 0x40,
-  0x50, 0x45, 0x0a, 0x82, 0x28, 0x40,
-  0x5a, 0x56, 0x5a, 0xd2, 0xb2, 0xc0
-};
-
-const uint8_t kMaskRandom42_36[216] = {
-  0x4e, 0x11, 0x92, 0x70, 0x8c, 0x80,
-  0xe3, 0x18, 0x9f, 0x18, 0xc4, 0xc0,
-  0x81, 0xe3, 0x04, 0x0f, 0x18, 0x00,
-  0x21, 0x40, 0x59, 0x0a, 0x02, 0xc0,
-  0x52, 0x81, 0xe2, 0x94, 0x0f, 0x00,
-  0xb4, 0x28, 0x25, 0xa1, 0x41, 0x00,
-  0x26, 0x86, 0x29, 0x34, 0x31, 0x40,
-  0x58, 0x64, 0x42, 0xc3, 0x22, 0x00,
-  0x19, 0x9e, 0x00, 0xcc, 0xf0, 0x00,
-  0x2c, 0x03, 0x21, 0x60, 0x19, 0x00,
-  0x81, 0xa0, 0x1c, 0x0d, 0x00, 0xc0,
-  0xa0, 0x68, 0x25, 0x03, 0x41, 0x00,
-  0x05, 0x41, 0x50, 0x2a, 0x0a, 0x80,
-  0x18, 0x90, 0xc0, 0xc4, 0x86, 0x00,
-  0xc2, 0x06, 0x86, 0x10, 0x34, 0x00,
-  0x22, 0x98, 0x09, 0x14, 0xc0, 0x40,
-  0x50, 0x45, 0x0a, 0x82, 0x28, 0x40,
-  0x5a, 0x56, 0x5a, 0xd2, 0xb2, 0xc0,
-  0x2c, 0x03, 0x21, 0x60, 0x19, 0x00,
-  0x81, 0xa0, 0x1c, 0x0d, 0x00, 0xc0,
-  0xa0, 0x68, 0x25, 0x03, 0x41, 0x00,
-  0x05, 0x41, 0x50, 0x2a, 0x0a, 0x80,
-  0x18, 0x90, 0xc0, 0xc4, 0x86, 0x00,
-  0xc2, 0x06, 0x86, 0x10, 0x34, 0x00,
-  0x22, 0x98, 0x09, 0x14, 0xc0, 0x40,
-  0x50, 0x45, 0x0a, 0x82, 0x28, 0x40,
-  0x4e, 0x11, 0x92, 0x70, 0x8c, 0x80,
-  0xe3, 0x18, 0x9f, 0x18, 0xc4, 0xc0,
-  0x81, 0xe3, 0x04, 0x0f, 0x18, 0x00,
-  0x21, 0x40, 0x59, 0x0a, 0x02, 0xc0,
-  0x52, 0x81, 0xe2, 0x94, 0x0f, 0x00,
-  0xb4, 0x28, 0x25, 0xa1, 0x41, 0x00,
-  0x26, 0x86, 0x29, 0x34, 0x31, 0x40,
-  0x58, 0x64, 0x42, 0xc3, 0x22, 0x00,
-  0x19, 0x9e, 0x00, 0xcc, 0xf0, 0x00,
-  0x57, 0xc7, 0x03, 0xf9, 0xc6, 0x00
-};
-
-const uint8_t kMaskRandom42_37[222] = {
-  0x4e, 0x11, 0x92, 0x70, 0x8c, 0x80,
-  0xe3, 0x18, 0x9f, 0x18, 0xc4, 0xc0,
-  0x81, 0xe3, 0x04, 0x0f, 0x18, 0x00,
-  0x21, 0x40, 0x59, 0x0a, 0x02, 0xc0,
-  0x52, 0x81, 0xe2, 0x94, 0x0f, 0x00,
-  0xb4, 0x28, 0x25, 0xa1, 0x41, 0x00,
-  0x26, 0x86, 0x29, 0x34, 0x31, 0x40,
-  0x58, 0x64, 0x42, 0xc3, 0x22, 0x00,
-  0x19, 0x9e, 0x00, 0xcc, 0xf0, 0x00,
-  0x2c, 0x03, 0x21, 0x60, 0x19, 0x00,
-  0x81, 0xa0, 0x1c, 0x0d, 0x00, 0xc0,
-  0xa0, 0x68, 0x25, 0x03, 0x41, 0x00,
-  0x05, 0x41, 0x50, 0x2a, 0x0a, 0x80,
-  0x18, 0x90, 0xc0, 0xc4, 0x86, 0x00,
-  0xc2, 0x06, 0x86, 0x10, 0x34, 0x00,
-  0x22, 0x98, 0x09, 0x14, 0xc0, 0x40,
-  0x50, 0x45, 0x0a, 0x82, 0x28, 0x40,
-  0x5a, 0x56, 0x5a, 0xd2, 0xb2, 0xc0,
-  0x4e, 0x11, 0x92, 0x70, 0x8c, 0x80,
-  0xe3, 0x18, 0x9f, 0x18, 0xc4, 0xc0,
-  0x81, 0xe3, 0x04, 0x0f, 0x18, 0x00,
-  0x21, 0x40, 0x59, 0x0a, 0x02, 0xc0,
-  0x52, 0x81, 0xe2, 0x94, 0x0f, 0x00,
-  0xb4, 0x28, 0x25, 0xa1, 0x41, 0x00,
-  0x26, 0x86, 0x29, 0x34, 0x31, 0x40,
-  0x58, 0x64, 0x42, 0xc3, 0x22, 0x00,
-  0x19, 0x9e, 0x00, 0xcc, 0xf0, 0x00,
-  0x4c, 0x19, 0x12, 0x60, 0xc8, 0x80,
-  0x51, 0x14, 0x52, 0x88, 0xa2, 0x80,
-  0xa0, 0x6a, 0x45, 0x03, 0x52, 0x00,
-  0x04, 0xc1, 0x30, 0x26, 0x09, 0x80,
-  0x03, 0xb4, 0x00, 0x1d, 0xa0, 0x00,
-  0x86, 0x20, 0x94, 0x31, 0x04, 0x80,
-  0x29, 0x08, 0x49, 0x48, 0x42, 0x40,
-  0x42, 0x43, 0x0a, 0x12, 0x18, 0x40,
-  0x98, 0x12, 0x84, 0xc0, 0x94, 0x00,
-  0x30, 0x84, 0xa9, 0x84, 0x25, 0x40
-};
-
-const uint8_t kMaskRandom42_38[228] = {
-  0x4e, 0x11, 0x92, 0x70, 0x8c, 0x80,
-  0xe3, 0x18, 0x9f, 0x18, 0xc4, 0xc0,
-  0x81, 0xe3, 0x04, 0x0f, 0x18, 0x00,
-  0x21, 0x40, 0x59, 0x0a, 0x02, 0xc0,
-  0x52, 0x81, 0xe2, 0x94, 0x0f, 0x00,
-  0xb4, 0x28, 0x25, 0xa1, 0x41, 0x00,
-  0x26, 0x86, 0x29, 0x34, 0x31, 0x40,
-  0x58, 0x64, 0x42, 0xc3, 0x22, 0x00,
-  0x19, 0x9e, 0x00, 0xcc, 0xf0, 0x00,
-  0x4c, 0x19, 0x12, 0x60, 0xc8, 0x80,
-  0x51, 0x14, 0x52, 0x88, 0xa2, 0x80,
-  0xa0, 0x6a, 0x45, 0x03, 0x52, 0x00,
-  0x04, 0xc1, 0x30, 0x26, 0x09, 0x80,
-  0x03, 0xb4, 0x00, 0x1d, 0xa0, 0x00,
-  0x86, 0x20, 0x94, 0x31, 0x04, 0x80,
-  0x29, 0x08, 0x49, 0x48, 0x42, 0x40,
-  0x42, 0x43, 0x0a, 0x12, 0x18, 0x40,
-  0x98, 0x12, 0x84, 0xc0, 0x94, 0x00,
-  0x30, 0x84, 0xa9, 0x84, 0x25, 0x40,
-  0x4e, 0x11, 0x92, 0x70, 0x8c, 0x80,
-  0xe3, 0x18, 0x9f, 0x18, 0xc4, 0xc0,
-  0x81, 0xe3, 0x04, 0x0f, 0x18, 0x00,
-  0x21, 0x40, 0x59, 0x0a, 0x02, 0xc0,
-  0x52, 0x81, 0xe2, 0x94, 0x0f, 0x00,
-  0xb4, 0x28, 0x25, 0xa1, 0x41, 0x00,
-  0x26, 0x86, 0x29, 0x34, 0x31, 0x40,
-  0x58, 0x64, 0x42, 0xc3, 0x22, 0x00,
-  0x19, 0x9e, 0x00, 0xcc, 0xf0, 0x00,
-  0x2c, 0x03, 0x21, 0x60, 0x19, 0x00,
-  0x81, 0xa0, 0x1c, 0x0d, 0x00, 0xc0,
-  0xa0, 0x68, 0x25, 0x03, 0x41, 0x00,
-  0x05, 0x41, 0x50, 0x2a, 0x0a, 0x80,
-  0x18, 0x90, 0xc0, 0xc4, 0x86, 0x00,
-  0xc2, 0x06, 0x86, 0x10, 0x34, 0x00,
-  0x22, 0x98, 0x09, 0x14, 0xc0, 0x40,
-  0x50, 0x45, 0x0a, 0x82, 0x28, 0x40,
-  0x5a, 0x56, 0x5a, 0xd2, 0xb2, 0xc0,
-  0x05, 0x19, 0x55, 0xee, 0xe2, 0xc0
-};
-
-const uint8_t kMaskRandom42_39[234] = {
-  0x4e, 0x11, 0x92, 0x70, 0x8c, 0x80,
-  0xe3, 0x18, 0x9f, 0x18, 0xc4, 0xc0,
-  0x81, 0xe3, 0x04, 0x0f, 0x18, 0x00,
-  0x21, 0x40, 0x59, 0x0a, 0x02, 0xc0,
-  0x52, 0x81, 0xe2, 0x94, 0x0f, 0x00,
-  0xb4, 0x28, 0x25, 0xa1, 0x41, 0x00,
-  0x26, 0x86, 0x29, 0x34, 0x31, 0x40,
-  0x58, 0x64, 0x42, 0xc3, 0x22, 0x00,
-  0x19, 0x9e, 0x00, 0xcc, 0xf0, 0x00,
-  0x4c, 0x19, 0x12, 0x60, 0xc8, 0x80,
-  0x51, 0x14, 0x52, 0x88, 0xa2, 0x80,
-  0xa0, 0x6a, 0x45, 0x03, 0x52, 0x00,
-  0x04, 0xc1, 0x30, 0x26, 0x09, 0x80,
-  0x03, 0xb4, 0x00, 0x1d, 0xa0, 0x00,
-  0x86, 0x20, 0x94, 0x31, 0x04, 0x80,
-  0x29, 0x08, 0x49, 0x48, 0x42, 0x40,
-  0x42, 0x43, 0x0a, 0x12, 0x18, 0x40,
-  0x98, 0x12, 0x84, 0xc0, 0x94, 0x00,
-  0x30, 0x84, 0xa9, 0x84, 0x25, 0x40,
-  0x4c, 0x19, 0x12, 0x60, 0xc8, 0x80,
-  0x51, 0x14, 0x52, 0x88, 0xa2, 0x80,
-  0xa0, 0x6a, 0x45, 0x03, 0x52, 0x00,
-  0x04, 0xc1, 0x30, 0x26, 0x09, 0x80,
-  0x03, 0xb4, 0x00, 0x1d, 0xa0, 0x00,
-  0x86, 0x20, 0x94, 0x31, 0x04, 0x80,
-  0x29, 0x08, 0x49, 0x48, 0x42, 0x40,
-  0x42, 0x43, 0x0a, 0x12, 0x18, 0x40,
-  0x98, 0x12, 0x84, 0xc0, 0x94, 0x00,
-  0x30, 0x84, 0xa9, 0x84, 0x25, 0x40,
-  0x4e, 0x11, 0x92, 0x70, 0x8c, 0x80,
-  0xe3, 0x18, 0x9f, 0x18, 0xc4, 0xc0,
-  0x81, 0xe3, 0x04, 0x0f, 0x18, 0x00,
-  0x21, 0x40, 0x59, 0x0a, 0x02, 0xc0,
-  0x52, 0x81, 0xe2, 0x94, 0x0f, 0x00,
-  0xb4, 0x28, 0x25, 0xa1, 0x41, 0x00,
-  0x26, 0x86, 0x29, 0x34, 0x31, 0x40,
-  0x58, 0x64, 0x42, 0xc3, 0x22, 0x00,
-  0x19, 0x9e, 0x00, 0xcc, 0xf0, 0x00,
-  0x2a, 0x03, 0x31, 0x50, 0x19, 0x80
-};
-
-const uint8_t kMaskRandom42_4[24] = {
-  0xe6, 0x31, 0x37, 0x31, 0x89, 0x80,
-  0x33, 0x8c, 0x59, 0x9c, 0x62, 0xc0,
-  0x98, 0xd2, 0xcc, 0xc6, 0x96, 0x40,
-  0x2d, 0x4b, 0x29, 0x6a, 0x59, 0x40
-};
-
-const uint8_t kMaskRandom42_40[240] = {
-  0x4c, 0x19, 0x12, 0x60, 0xc8, 0x80,
-  0x51, 0x14, 0x52, 0x88, 0xa2, 0x80,
-  0xa0, 0x6a, 0x45, 0x03, 0x52, 0x00,
-  0x04, 0xc1, 0x30, 0x26, 0x09, 0x80,
-  0x03, 0xb4, 0x00, 0x1d, 0xa0, 0x00,
-  0x86, 0x20, 0x94, 0x31, 0x04, 0x80,
-  0x29, 0x08, 0x49, 0x48, 0x42, 0x40,
-  0x42, 0x43, 0x0a, 0x12, 0x18, 0x40,
-  0x98, 0x12, 0x84, 0xc0, 0x94, 0x00,
-  0x30, 0x84, 0xa9, 0x84, 0x25, 0x40,
-  0x4e, 0x11, 0x92, 0x70, 0x8c, 0x80,
-  0xe3, 0x18, 0x9f, 0x18, 0xc4, 0xc0,
-  0x81, 0xe3, 0x04, 0x0f, 0x18, 0x00,
-  0x21, 0x40, 0x59, 0x0a, 0x02, 0xc0,
-  0x52, 0x81, 0xe2, 0x94, 0x0f, 0x00,
-  0xb4, 0x28, 0x25, 0xa1, 0x41, 0x00,
-  0x26, 0x86, 0x29, 0x34, 0x31, 0x40,
-  0x58, 0x64, 0x42, 0xc3, 0x22, 0x00,
-  0x19, 0x9e, 0x00, 0xcc, 0xf0, 0x00,
-  0x2a, 0x03, 0x31, 0x50, 0x19, 0x80,
-  0x4e, 0x11, 0x92, 0x70, 0x8c, 0x80,
-  0xe3, 0x18, 0x9f, 0x18, 0xc4, 0xc0,
-  0x81, 0xe3, 0x04, 0x0f, 0x18, 0x00,
-  0x21, 0x40, 0x59, 0x0a, 0x02, 0xc0,
-  0x52, 0x81, 0xe2, 0x94, 0x0f, 0x00,
-  0xb4, 0x28, 0x25, 0xa1, 0x41, 0x00,
-  0x26, 0x86, 0x29, 0x34, 0x31, 0x40,
-  0x58, 0x64, 0x42, 0xc3, 0x22, 0x00,
-  0x19, 0x9e, 0x00, 0xcc, 0xf0, 0x00,
-  0x4c, 0x19, 0x12, 0x60, 0xc8, 0x80,
-  0x51, 0x14, 0x52, 0x88, 0xa2, 0x80,
-  0xa0, 0x6a, 0x45, 0x03, 0x52, 0x00,
-  0x04, 0xc1, 0x30, 0x26, 0x09, 0x80,
-  0x03, 0xb4, 0x00, 0x1d, 0xa0, 0x00,
-  0x86, 0x20, 0x94, 0x31, 0x04, 0x80,
-  0x29, 0x08, 0x49, 0x48, 0x42, 0x40,
-  0x42, 0x43, 0x0a, 0x12, 0x18, 0x40,
-  0x98, 0x12, 0x84, 0xc0, 0x94, 0x00,
-  0x30, 0x84, 0xa9, 0x84, 0x25, 0x40,
-  0xf9, 0xdb, 0x5d, 0x7a, 0xd4, 0x40
-};
-
-const uint8_t kMaskRandom42_41[246] = {
-  0x4c, 0x19, 0x12, 0x60, 0xc8, 0x80,
-  0x51, 0x14, 0x52, 0x88, 0xa2, 0x80,
-  0xa0, 0x6a, 0x45, 0x03, 0x52, 0x00,
-  0x04, 0xc1, 0x30, 0x26, 0x09, 0x80,
-  0x03, 0xb4, 0x00, 0x1d, 0xa0, 0x00,
-  0x86, 0x20, 0x94, 0x31, 0x04, 0x80,
-  0x29, 0x08, 0x49, 0x48, 0x42, 0x40,
-  0x42, 0x43, 0x0a, 0x12, 0x18, 0x40,
-  0x98, 0x12, 0x84, 0xc0, 0x94, 0x00,
-  0x30, 0x84, 0xa9, 0x84, 0x25, 0x40,
-  0x4e, 0x11, 0x92, 0x70, 0x8c, 0x80,
-  0xe3, 0x18, 0x9f, 0x18, 0xc4, 0xc0,
-  0x81, 0xe3, 0x04, 0x0f, 0x18, 0x00,
-  0x21, 0x40, 0x59, 0x0a, 0x02, 0xc0,
-  0x52, 0x81, 0xe2, 0x94, 0x0f, 0x00,
-  0xb4, 0x28, 0x25, 0xa1, 0x41, 0x00,
-  0x26, 0x86, 0x29, 0x34, 0x31, 0x40,
-  0x58, 0x64, 0x42, 0xc3, 0x22, 0x00,
-  0x19, 0x9e, 0x00, 0xcc, 0xf0, 0x00,
-  0x2a, 0x03, 0x31, 0x50, 0x19, 0x80,
-  0x4c, 0x19, 0x12, 0x60, 0xc8, 0x80,
-  0x51, 0x14, 0x52, 0x88, 0xa2, 0x80,
-  0xa0, 0x6a, 0x45, 0x03, 0x52, 0x00,
-  0x04, 0xc1, 0x30, 0x26, 0x09, 0x80,
-  0x03, 0xb4, 0x00, 0x1d, 0xa0, 0x00,
-  0x86, 0x20, 0x94, 0x31, 0x04, 0x80,
-  0x29, 0x08, 0x49, 0x48, 0x42, 0x40,
-  0x42, 0x43, 0x0a, 0x12, 0x18, 0x40,
-  0x98, 0x12, 0x84, 0xc0, 0x94, 0x00,
-  0x30, 0x84, 0xa9, 0x84, 0x25, 0x40,
-  0x4c, 0x11, 0x92, 0x60, 0x8c, 0x80,
-  0x51, 0x0c, 0xca, 0x88, 0x66, 0x40,
-  0xa0, 0x66, 0x45, 0x03, 0x32, 0x00,
-  0x04, 0xc1, 0x60, 0x26, 0x0b, 0x00,
-  0x03, 0xa0, 0x28, 0x1d, 0x01, 0x40,
-  0x86, 0x21, 0x14, 0x31, 0x08, 0x80,
-  0x29, 0x10, 0x19, 0x48, 0x80, 0xc0,
-  0x42, 0x42, 0xa2, 0x12, 0x15, 0x00,
-  0x98, 0x1a, 0x04, 0xc0, 0xd0, 0x00,
-  0x30, 0x84, 0x09, 0x84, 0x20, 0x40,
-  0xdf, 0x4c, 0x16, 0xfa, 0x60, 0x80
-};
-
-const uint8_t kMaskRandom42_42[252] = {
-  0x4c, 0x19, 0x12, 0x60, 0xc8, 0x80,
-  0x51, 0x14, 0x52, 0x88, 0xa2, 0x80,
-  0xa0, 0x6a, 0x45, 0x03, 0x52, 0x00,
-  0x04, 0xc1, 0x30, 0x26, 0x09, 0x80,
-  0x03, 0xb4, 0x00, 0x1d, 0xa0, 0x00,
-  0x86, 0x20, 0x94, 0x31, 0x04, 0x80,
-  0x29, 0x08, 0x49, 0x48, 0x42, 0x40,
-  0x42, 0x43, 0x0a, 0x12, 0x18, 0x40,
-  0x98, 0x12, 0x84, 0xc0, 0x94, 0x00,
-  0x30, 0x84, 0xa9, 0x84, 0x25, 0x40,
-  0x4c, 0x11, 0x92, 0x60, 0x8c, 0x80,
-  0x51, 0x0c, 0xca, 0x88, 0x66, 0x40,
-  0xa0, 0x66, 0x45, 0x03, 0x32, 0x00,
-  0x04, 0xc1, 0x60, 0x26, 0x0b, 0x00,
-  0x03, 0xa0, 0x28, 0x1d, 0x01, 0x40,
-  0x86, 0x21, 0x14, 0x31, 0x08, 0x80,
-  0x29, 0x10, 0x19, 0x48, 0x80, 0xc0,
-  0x42, 0x42, 0xa2, 0x12, 0x15, 0x00,
-  0x98, 0x1a, 0x04, 0xc0, 0xd0, 0x00,
-  0x30, 0x84, 0x09, 0x84, 0x20, 0x40,
-  0xdf, 0x4c, 0x16, 0xfa, 0x60, 0x80,
-  0x4c, 0x19, 0x12, 0x60, 0xc8, 0x80,
-  0x51, 0x14, 0x52, 0x88, 0xa2, 0x80,
-  0xa0, 0x6a, 0x45, 0x03, 0x52, 0x00,
-  0x04, 0xc1, 0x30, 0x26, 0x09, 0x80,
-  0x03, 0xb4, 0x00, 0x1d, 0xa0, 0x00,
-  0x86, 0x20, 0x94, 0x31, 0x04, 0x80,
-  0x29, 0x08, 0x49, 0x48, 0x42, 0x40,
-  0x42, 0x43, 0x0a, 0x12, 0x18, 0x40,
-  0x98, 0x12, 0x84, 0xc0, 0x94, 0x00,
-  0x30, 0x84, 0xa9, 0x84, 0x25, 0x40,
-  0x4e, 0x11, 0x92, 0x70, 0x8c, 0x80,
-  0xe3, 0x18, 0x9f, 0x18, 0xc4, 0xc0,
-  0x81, 0xe3, 0x04, 0x0f, 0x18, 0x00,
-  0x21, 0x40, 0x59, 0x0a, 0x02, 0xc0,
-  0x52, 0x81, 0xe2, 0x94, 0x0f, 0x00,
-  0xb4, 0x28, 0x25, 0xa1, 0x41, 0x00,
-  0x26, 0x86, 0x29, 0x34, 0x31, 0x40,
-  0x58, 0x64, 0x42, 0xc3, 0x22, 0x00,
-  0x19, 0x9e, 0x00, 0xcc, 0xf0, 0x00,
-  0x2a, 0x03, 0x31, 0x50, 0x19, 0x80,
-  0xea, 0x9e, 0x23, 0xb3, 0x65, 0x00
-};
-
-const uint8_t kMaskRandom42_5[30] = {
-  0xce, 0x31, 0xb6, 0x71, 0x8d, 0x80,
-  0x63, 0x98, 0xdb, 0x1c, 0xc6, 0xc0,
-  0x98, 0xc7, 0x6c, 0xc6, 0x3b, 0x40,
-  0x4d, 0x6b, 0x52, 0x6b, 0x5a, 0x80,
-  0xb2, 0x6c, 0xad, 0x93, 0x65, 0x40
-};
-
-const uint8_t kMaskRandom42_6[36] = {
-  0x4c, 0x19, 0x12, 0x60, 0xc8, 0x80,
-  0x51, 0x14, 0x52, 0x88, 0xa2, 0x80,
-  0x20, 0xea, 0x09, 0x07, 0x50, 0x40,
-  0x85, 0x41, 0x2c, 0x2a, 0x09, 0x40,
-  0x06, 0x80, 0xd8, 0x34, 0x06, 0xc0,
-  0x8a, 0x24, 0x34, 0x51, 0x21, 0x80
-};
-
-const uint8_t kMaskRandom42_7[42] = {
-  0xc6, 0x11, 0x96, 0x30, 0x8c, 0x80,
-  0x33, 0x04, 0xc9, 0x98, 0x26, 0x40,
-  0x18, 0x67, 0x40, 0xc3, 0x3a, 0x00,
-  0x45, 0x42, 0xd2, 0x2a, 0x16, 0x80,
-  0x12, 0xd4, 0x28, 0x96, 0xa1, 0x40,
-  0xb4, 0x28, 0x35, 0xa1, 0x41, 0x80,
-  0x29, 0x92, 0x19, 0x4c, 0x90, 0xc0
-};
-
-const uint8_t kMaskRandom42_8[48] = {
-  0x07, 0x0a, 0x70, 0x38, 0x53, 0x80,
-  0x49, 0xa8, 0x2a, 0x4d, 0x41, 0x40,
-  0xb0, 0x7a, 0x05, 0x83, 0xd0, 0x00,
-  0x24, 0xc5, 0xc1, 0x26, 0x2e, 0x00,
-  0x52, 0x80, 0xea, 0x94, 0x07, 0x40,
-  0xc6, 0x31, 0x86, 0x31, 0x8c, 0x00,
-  0x31, 0x94, 0x19, 0x8c, 0xa0, 0xc0,
-  0x18, 0xc7, 0x08, 0xc6, 0x38, 0x40
-};
-
-const uint8_t kMaskRandom42_9[54] = {
-  0x4e, 0x11, 0x12, 0x70, 0x88, 0x80,
-  0x62, 0x1a, 0x0b, 0x10, 0xd0, 0x40,
-  0x80, 0xe9, 0x44, 0x07, 0x4a, 0x00,
-  0xa1, 0x50, 0x55, 0x0a, 0x82, 0x80,
-  0x53, 0x00, 0x6a, 0x98, 0x03, 0x40,
-  0xa4, 0x24, 0x35, 0x21, 0x21, 0x80,
-  0x16, 0xa0, 0x88, 0xb5, 0x04, 0x40,
-  0x58, 0x45, 0x22, 0xc2, 0x29, 0x00,
-  0x29, 0x86, 0x81, 0x4c, 0x34, 0x00
-};
-
-const uint8_t kMaskRandom43_1[6] = {
-  0xff, 0xff, 0xff, 0xff, 0xff, 0xe0
-};
-
-const uint8_t kMaskRandom43_10[60] = {
-  0x4c, 0x19, 0x16, 0x01, 0xc4, 0x40,
-  0x51, 0x14, 0x51, 0x80, 0x71, 0x40,
-  0xa0, 0x6a, 0x47, 0x40, 0x38, 0x00,
-  0x04, 0xc1, 0x34, 0x28, 0x45, 0x40,
-  0x03, 0xb4, 0x06, 0x84, 0x90, 0x80,
-  0x86, 0x20, 0x94, 0x32, 0x82, 0x40,
-  0x29, 0x08, 0x4a, 0x53, 0x40, 0x60,
-  0x42, 0x43, 0x08, 0x0d, 0x03, 0xa0,
-  0x98, 0x12, 0x82, 0x64, 0x0c, 0x80,
-  0x30, 0x84, 0xab, 0x11, 0x20, 0x20
-};
-
-const uint8_t kMaskRandom43_11[66] = {
-  0xc6, 0x21, 0xa2, 0x32, 0x46, 0x40,
-  0x23, 0x88, 0xc9, 0x99, 0x33, 0x20,
-  0x1a, 0x45, 0x8c, 0xc8, 0x99, 0x00,
-  0x24, 0xd3, 0x08, 0x2c, 0x05, 0x80,
-  0x71, 0x10, 0x74, 0x05, 0x80, 0xa0,
-  0x0e, 0x19, 0x14, 0x22, 0x84, 0x40,
-  0x33, 0x14, 0x52, 0x03, 0x40, 0x60,
-  0x10, 0xc3, 0x28, 0x54, 0x0a, 0x80,
-  0x45, 0x68, 0x4b, 0x40, 0x68, 0x00,
-  0x88, 0x84, 0xa8, 0x81, 0x10, 0x20,
-  0xe0, 0x22, 0x91, 0x82, 0x30, 0x40
-};
-
-const uint8_t kMaskRandom43_12[72] = {
-  0x0e, 0x19, 0x13, 0x22, 0x64, 0x40,
-  0x33, 0x14, 0x52, 0x8a, 0x51, 0x40,
-  0x10, 0xc3, 0x28, 0x65, 0x0c, 0xa0,
-  0x45, 0x68, 0x4d, 0x09, 0xa1, 0x20,
-  0x88, 0x84, 0xa8, 0x95, 0x12, 0xa0,
-  0xe0, 0x22, 0x94, 0x52, 0x8a, 0x40,
-  0xc6, 0x21, 0xa4, 0x34, 0x86, 0x80,
-  0x23, 0x88, 0xc9, 0x19, 0x23, 0x20,
-  0x1a, 0x45, 0x88, 0xb1, 0x16, 0x20,
-  0x24, 0xd3, 0x0a, 0x61, 0x4c, 0x20,
-  0x71, 0x10, 0x72, 0x0e, 0x41, 0xc0,
-  0xa0, 0x65, 0x1f, 0xa0, 0xc4, 0xe0
-};
-
-const uint8_t kMaskRandom43_13[78] = {
-  0x0e, 0x19, 0x13, 0x22, 0x64, 0x40,
-  0x33, 0x14, 0x52, 0x8a, 0x51, 0x40,
-  0x10, 0xc3, 0x28, 0x65, 0x0c, 0xa0,
-  0x45, 0x68, 0x4d, 0x09, 0xa1, 0x20,
-  0x88, 0x84, 0xa8, 0x95, 0x12, 0xa0,
-  0xe0, 0x22, 0x94, 0x52, 0x8a, 0x40,
-  0x46, 0x11, 0x92, 0x32, 0x46, 0x40,
-  0x33, 0x0c, 0xc9, 0x99, 0x33, 0x20,
-  0x10, 0xe4, 0x64, 0x8c, 0x91, 0x80,
-  0x0c, 0x69, 0x0d, 0x21, 0xa4, 0x20,
-  0x28, 0x94, 0x2a, 0x85, 0x50, 0xa0,
-  0x94, 0x21, 0x34, 0x26, 0x84, 0xc0,
-  0xc1, 0x02, 0x58, 0x4b, 0x09, 0x60
-};
-
-const uint8_t kMaskRandom43_14[84] = {
-  0x46, 0x11, 0x92, 0x32, 0x46, 0x40,
-  0x33, 0x0c, 0xc9, 0x99, 0x33, 0x20,
-  0x10, 0xe4, 0x64, 0x8c, 0x91, 0x80,
-  0x0c, 0x69, 0x0d, 0x21, 0xa4, 0x20,
-  0x28, 0x94, 0x2a, 0x85, 0x50, 0xa0,
-  0x94, 0x21, 0x34, 0x26, 0x84, 0xc0,
-  0xc1, 0x02, 0x58, 0x4b, 0x09, 0x60,
-  0x0e, 0x19, 0x13, 0x22, 0x64, 0x40,
-  0x33, 0x14, 0x52, 0x8a, 0x51, 0x40,
-  0x10, 0xc3, 0x28, 0x65, 0x0c, 0xa0,
-  0x45, 0x68, 0x4d, 0x09, 0xa1, 0x20,
-  0x88, 0x84, 0xa8, 0x95, 0x12, 0xa0,
-  0xe0, 0x22, 0x94, 0x52, 0x8a, 0x40,
-  0x4d, 0xd0, 0xc6, 0x36, 0x57, 0x40
-};
-
-const uint8_t kMaskRandom43_15[90] = {
-  0x46, 0x11, 0x92, 0x32, 0x46, 0x40,
-  0x33, 0x0c, 0xc9, 0x99, 0x33, 0x20,
-  0x10, 0xe4, 0x64, 0x8c, 0x91, 0x80,
-  0x0c, 0x69, 0x0d, 0x21, 0xa4, 0x20,
-  0x28, 0x94, 0x2a, 0x85, 0x50, 0xa0,
-  0x94, 0x21, 0x34, 0x26, 0x84, 0xc0,
-  0xc1, 0x02, 0x58, 0x4b, 0x09, 0x60,
-  0x2c, 0x03, 0x20, 0x64, 0x0c, 0x80,
-  0x81, 0xa0, 0x1c, 0x03, 0x80, 0x60,
-  0xa0, 0x68, 0x25, 0x04, 0xa0, 0x80,
-  0x05, 0x41, 0x50, 0x2a, 0x05, 0x40,
-  0x18, 0x90, 0xc2, 0x18, 0x43, 0x00,
-  0xc2, 0x06, 0x80, 0xd0, 0x1a, 0x00,
-  0x22, 0x98, 0x0b, 0x01, 0x60, 0x20,
-  0x50, 0x45, 0x08, 0xa1, 0x14, 0x20
-};
-
-const uint8_t kMaskRandom43_16[96] = {
-  0x2c, 0x03, 0x20, 0x64, 0x0c, 0x80,
-  0x81, 0xa0, 0x1c, 0x03, 0x80, 0x60,
-  0xa0, 0x68, 0x25, 0x04, 0xa0, 0x80,
-  0x05, 0x41, 0x50, 0x2a, 0x05, 0x40,
-  0x18, 0x90, 0xc2, 0x18, 0x43, 0x00,
-  0xc2, 0x06, 0x80, 0xd0, 0x1a, 0x00,
-  0x22, 0x98, 0x0b, 0x01, 0x60, 0x20,
-  0x50, 0x45, 0x08, 0xa1, 0x14, 0x20,
-  0x46, 0x11, 0x92, 0x32, 0x46, 0x40,
-  0x33, 0x0c, 0xc9, 0x99, 0x33, 0x20,
-  0x10, 0xe4, 0x64, 0x8c, 0x91, 0x80,
-  0x0c, 0x69, 0x0d, 0x21, 0xa4, 0x20,
-  0x28, 0x94, 0x2a, 0x85, 0x50, 0xa0,
-  0x94, 0x21, 0x34, 0x26, 0x84, 0xc0,
-  0xc1, 0x02, 0x58, 0x4b, 0x09, 0x60,
-  0x3b, 0xf5, 0x3c, 0x36, 0x0a, 0x20
-};
-
-const uint8_t kMaskRandom43_17[102] = {
-  0x2c, 0x03, 0x20, 0x64, 0x0c, 0x80,
-  0x81, 0xa0, 0x1c, 0x03, 0x80, 0x60,
-  0xa0, 0x68, 0x25, 0x04, 0xa0, 0x80,
-  0x05, 0x41, 0x50, 0x2a, 0x05, 0x40,
-  0x18, 0x90, 0xc2, 0x18, 0x43, 0x00,
-  0xc2, 0x06, 0x80, 0xd0, 0x1a, 0x00,
-  0x22, 0x98, 0x0b, 0x01, 0x60, 0x20,
-  0x50, 0x45, 0x08, 0xa1, 0x14, 0x20,
-  0x4e, 0x11, 0x92, 0x32, 0x46, 0x40,
-  0xe3, 0x18, 0x9b, 0x13, 0x62, 0x60,
-  0x81, 0xe3, 0x04, 0x60, 0x8c, 0x00,
-  0x21, 0x40, 0x58, 0x0b, 0x01, 0x60,
-  0x52, 0x81, 0xe0, 0x3c, 0x07, 0x80,
-  0xb4, 0x28, 0x25, 0x04, 0xa0, 0x80,
-  0x26, 0x86, 0x28, 0xc5, 0x18, 0xa0,
-  0x58, 0x64, 0x44, 0x88, 0x91, 0x00,
-  0x19, 0x9e, 0x03, 0xc0, 0x78, 0x00
-};
-
-const uint8_t kMaskRandom43_18[108] = {
-  0x4e, 0x11, 0x92, 0x32, 0x46, 0x40,
-  0xe3, 0x18, 0x9b, 0x13, 0x62, 0x60,
-  0x81, 0xe3, 0x04, 0x60, 0x8c, 0x00,
-  0x21, 0x40, 0x58, 0x0b, 0x01, 0x60,
-  0x52, 0x81, 0xe0, 0x3c, 0x07, 0x80,
-  0xb4, 0x28, 0x25, 0x04, 0xa0, 0x80,
-  0x26, 0x86, 0x28, 0xc5, 0x18, 0xa0,
-  0x58, 0x64, 0x44, 0x88, 0x91, 0x00,
-  0x19, 0x9e, 0x03, 0xc0, 0x78, 0x00,
-  0x2c, 0x03, 0x20, 0x64, 0x0c, 0x80,
-  0x81, 0xa0, 0x1c, 0x03, 0x80, 0x60,
-  0xa0, 0x68, 0x25, 0x04, 0xa0, 0x80,
-  0x05, 0x41, 0x50, 0x2a, 0x05, 0x40,
-  0x18, 0x90, 0xc2, 0x18, 0x43, 0x00,
-  0xc2, 0x06, 0x80, 0xd0, 0x1a, 0x00,
-  0x22, 0x98, 0x0b, 0x01, 0x60, 0x20,
-  0x50, 0x45, 0x08, 0xa1, 0x14, 0x20,
-  0x5a, 0x56, 0x5f, 0x26, 0xa3, 0x60
-};
-
-const uint8_t kMaskRandom43_19[114] = {
-  0x4e, 0x11, 0x92, 0x32, 0x46, 0x40,
-  0xe3, 0x18, 0x9b, 0x13, 0x62, 0x60,
-  0x81, 0xe3, 0x04, 0x60, 0x8c, 0x00,
-  0x21, 0x40, 0x58, 0x0b, 0x01, 0x60,
-  0x52, 0x81, 0xe0, 0x3c, 0x07, 0x80,
-  0xb4, 0x28, 0x25, 0x04, 0xa0, 0x80,
-  0x26, 0x86, 0x28, 0xc5, 0x18, 0xa0,
-  0x58, 0x64, 0x44, 0x88, 0x91, 0x00,
-  0x19, 0x9e, 0x03, 0xc0, 0x78, 0x00,
-  0x4c, 0x19, 0x13, 0x22, 0x64, 0x40,
-  0x51, 0x14, 0x52, 0x8a, 0x51, 0x40,
-  0xa0, 0x6a, 0x45, 0x48, 0xa9, 0x00,
-  0x04, 0xc1, 0x30, 0x26, 0x04, 0xc0,
-  0x03, 0xb4, 0x06, 0x80, 0xd0, 0x00,
-  0x86, 0x20, 0x94, 0x12, 0x82, 0x40,
-  0x29, 0x08, 0x49, 0x09, 0x21, 0x20,
-  0x42, 0x43, 0x08, 0x61, 0x0c, 0x20,
-  0x98, 0x12, 0x82, 0x50, 0x4a, 0x00,
-  0x30, 0x84, 0xa8, 0x95, 0x12, 0xa0
-};
-
-const uint8_t kMaskRandom43_2[12] = {
-  0xee, 0x3b, 0x37, 0x66, 0xec, 0xc0,
-  0x99, 0xe6, 0xec, 0xdd, 0x9b, 0xa0
-};
-
-const uint8_t kMaskRandom43_20[120] = {
-  0x4c, 0x19, 0x13, 0x22, 0x64, 0x40,
-  0x51, 0x14, 0x52, 0x8a, 0x51, 0x40,
-  0xa0, 0x6a, 0x45, 0x48, 0xa9, 0x00,
-  0x04, 0xc1, 0x30, 0x26, 0x04, 0xc0,
-  0x03, 0xb4, 0x06, 0x80, 0xd0, 0x00,
-  0x86, 0x20, 0x94, 0x12, 0x82, 0x40,
-  0x29, 0x08, 0x49, 0x09, 0x21, 0x20,
-  0x42, 0x43, 0x08, 0x61, 0x0c, 0x20,
-  0x98, 0x12, 0x82, 0x50, 0x4a, 0x00,
-  0x30, 0x84, 0xa8, 0x95, 0x12, 0xa0,
-  0x4e, 0x11, 0x92, 0x32, 0x46, 0x40,
-  0xe3, 0x18, 0x9b, 0x13, 0x62, 0x60,
-  0x81, 0xe3, 0x04, 0x60, 0x8c, 0x00,
-  0x21, 0x40, 0x58, 0x0b, 0x01, 0x60,
-  0x52, 0x81, 0xe0, 0x3c, 0x07, 0x80,
-  0xb4, 0x28, 0x25, 0x04, 0xa0, 0x80,
-  0x26, 0x86, 0x28, 0xc5, 0x18, 0xa0,
-  0x58, 0x64, 0x44, 0x88, 0x91, 0x00,
-  0x19, 0x9e, 0x03, 0xc0, 0x78, 0x00,
-  0x2a, 0x03, 0x31, 0xda, 0x46, 0x20
-};
-
-const uint8_t kMaskRandom43_21[126] = {
-  0x4c, 0x19, 0x13, 0x22, 0x64, 0x40,
-  0x51, 0x14, 0x52, 0x8a, 0x51, 0x40,
-  0xa0, 0x6a, 0x45, 0x48, 0xa9, 0x00,
-  0x04, 0xc1, 0x30, 0x26, 0x04, 0xc0,
-  0x03, 0xb4, 0x06, 0x80, 0xd0, 0x00,
-  0x86, 0x20, 0x94, 0x12, 0x82, 0x40,
-  0x29, 0x08, 0x49, 0x09, 0x21, 0x20,
-  0x42, 0x43, 0x08, 0x61, 0x0c, 0x20,
-  0x98, 0x12, 0x82, 0x50, 0x4a, 0x00,
-  0x30, 0x84, 0xa8, 0x95, 0x12, 0xa0,
-  0x4c, 0x11, 0x92, 0x32, 0x46, 0x40,
-  0x51, 0x0c, 0xc9, 0x99, 0x33, 0x20,
-  0xa0, 0x66, 0x44, 0xc8, 0x99, 0x00,
-  0x04, 0xc1, 0x60, 0x2c, 0x05, 0x80,
-  0x03, 0xa0, 0x2c, 0x05, 0x80, 0xa0,
-  0x86, 0x21, 0x14, 0x22, 0x84, 0x40,
-  0x29, 0x10, 0x1a, 0x03, 0x40, 0x60,
-  0x42, 0x42, 0xa0, 0x54, 0x0a, 0x80,
-  0x98, 0x1a, 0x03, 0x40, 0x68, 0x00,
-  0x30, 0x84, 0x08, 0x81, 0x10, 0x20,
-  0xdf, 0x4c, 0x11, 0x82, 0x30, 0x40
-};
-
-const uint8_t kMaskRandom43_22[132] = {
-  0xc6, 0x21, 0xa2, 0x32, 0x46, 0x40,
-  0x23, 0x88, 0xc9, 0x99, 0x33, 0x20,
-  0x1a, 0x45, 0x8c, 0xc8, 0x99, 0x00,
-  0x24, 0xd3, 0x08, 0x2c, 0x05, 0x80,
-  0x71, 0x10, 0x74, 0x05, 0x80, 0xa0,
-  0x0e, 0x19, 0x14, 0x22, 0x84, 0x40,
-  0x33, 0x14, 0x52, 0x03, 0x40, 0x60,
-  0x10, 0xc3, 0x28, 0x54, 0x0a, 0x80,
-  0x45, 0x68, 0x4b, 0x40, 0x68, 0x00,
-  0x88, 0x84, 0xa8, 0x81, 0x10, 0x20,
-  0xe0, 0x22, 0x91, 0x82, 0x30, 0x40,
-  0x4c, 0x19, 0x16, 0x01, 0xc4, 0x40,
-  0x51, 0x14, 0x51, 0x80, 0x71, 0x40,
-  0xa0, 0x6a, 0x47, 0x40, 0x38, 0x00,
-  0x04, 0xc1, 0x34, 0x28, 0x45, 0x40,
-  0x03, 0xb4, 0x06, 0x84, 0x90, 0x80,
-  0x86, 0x20, 0x94, 0x32, 0x82, 0x40,
-  0x29, 0x08, 0x4a, 0x53, 0x40, 0x60,
-  0x42, 0x43, 0x08, 0x0d, 0x03, 0xa0,
-  0x98, 0x12, 0x82, 0x64, 0x0c, 0x80,
-  0x30, 0x84, 0xab, 0x11, 0x20, 0x20,
-  0xfe, 0x2c, 0x85, 0xcc, 0x24, 0x80
-};
-
-const uint8_t kMaskRandom43_23[138] = {
-  0xc6, 0x21, 0xa2, 0x32, 0x46, 0x40,
-  0x23, 0x88, 0xc9, 0x99, 0x33, 0x20,
-  0x1a, 0x45, 0x8c, 0xc8, 0x99, 0x00,
-  0x24, 0xd3, 0x08, 0x2c, 0x05, 0x80,
-  0x71, 0x10, 0x74, 0x05, 0x80, 0xa0,
-  0x0e, 0x19, 0x14, 0x22, 0x84, 0x40,
-  0x33, 0x14, 0x52, 0x03, 0x40, 0x60,
-  0x10, 0xc3, 0x28, 0x54, 0x0a, 0x80,
-  0x45, 0x68, 0x4b, 0x40, 0x68, 0x00,
-  0x88, 0x84, 0xa8, 0x81, 0x10, 0x20,
-  0xe0, 0x22, 0x91, 0x82, 0x30, 0x40,
-  0x0e, 0x19, 0x13, 0x22, 0x64, 0x40,
-  0x33, 0x14, 0x52, 0x8a, 0x51, 0x40,
-  0x10, 0xc3, 0x28, 0x65, 0x0c, 0xa0,
-  0x45, 0x68, 0x4d, 0x09, 0xa1, 0x20,
-  0x88, 0x84, 0xa8, 0x95, 0x12, 0xa0,
-  0xe0, 0x22, 0x94, 0x52, 0x8a, 0x40,
-  0xc6, 0x21, 0xa4, 0x34, 0x86, 0x80,
-  0x23, 0x88, 0xc9, 0x19, 0x23, 0x20,
-  0x1a, 0x45, 0x88, 0xb1, 0x16, 0x20,
-  0x24, 0xd3, 0x0a, 0x61, 0x4c, 0x20,
-  0x71, 0x10, 0x72, 0x0e, 0x41, 0xc0,
-  0xa0, 0x65, 0x1f, 0xa0, 0xc4, 0xe0
-};
-
-const uint8_t kMaskRandom43_24[144] = {
-  0x0e, 0x19, 0x13, 0x22, 0x64, 0x40,
-  0x33, 0x14, 0x52, 0x8a, 0x51, 0x40,
-  0x10, 0xc3, 0x28, 0x65, 0x0c, 0xa0,
-  0x45, 0x68, 0x4d, 0x09, 0xa1, 0x20,
-  0x88, 0x84, 0xa8, 0x95, 0x12, 0xa0,
-  0xe0, 0x22, 0x94, 0x52, 0x8a, 0x40,
-  0xc6, 0x21, 0xa4, 0x34, 0x86, 0x80,
-  0x23, 0x88, 0xc9, 0x19, 0x23, 0x20,
-  0x1a, 0x45, 0x88, 0xb1, 0x16, 0x20,
-  0x24, 0xd3, 0x0a, 0x61, 0x4c, 0x20,
-  0x71, 0x10, 0x72, 0x0e, 0x41, 0xc0,
-  0xa0, 0x65, 0x1f, 0xa0, 0xc4, 0xe0,
-  0xc6, 0x21, 0xa2, 0x32, 0x46, 0x40,
-  0x23, 0x88, 0xc9, 0x99, 0x33, 0x20,
-  0x1a, 0x45, 0x8c, 0xc8, 0x99, 0x00,
-  0x24, 0xd3, 0x08, 0x2c, 0x05, 0x80,
-  0x71, 0x10, 0x74, 0x05, 0x80, 0xa0,
-  0x0e, 0x19, 0x14, 0x22, 0x84, 0x40,
-  0x33, 0x14, 0x52, 0x03, 0x40, 0x60,
-  0x10, 0xc3, 0x28, 0x54, 0x0a, 0x80,
-  0x45, 0x68, 0x4b, 0x40, 0x68, 0x00,
-  0x88, 0x84, 0xa8, 0x81, 0x10, 0x20,
-  0xe0, 0x22, 0x91, 0x82, 0x30, 0x40,
-  0xf9, 0xb1, 0x26, 0x6c, 0x51, 0xe0
-};
-
-const uint8_t kMaskRandom43_25[150] = {
-  0x0e, 0x19, 0x13, 0x22, 0x64, 0x40,
-  0x33, 0x14, 0x52, 0x8a, 0x51, 0x40,
-  0x10, 0xc3, 0x28, 0x65, 0x0c, 0xa0,
-  0x45, 0x68, 0x4d, 0x09, 0xa1, 0x20,
-  0x88, 0x84, 0xa8, 0x95, 0x12, 0xa0,
-  0xe0, 0x22, 0x94, 0x52, 0x8a, 0x40,
-  0xc6, 0x21, 0xa4, 0x34, 0x86, 0x80,
-  0x23, 0x88, 0xc9, 0x19, 0x23, 0x20,
-  0x1a, 0x45, 0x88, 0xb1, 0x16, 0x20,
-  0x24, 0xd3, 0x0a, 0x61, 0x4c, 0x20,
-  0x71, 0x10, 0x72, 0x0e, 0x41, 0xc0,
-  0xa0, 0x65, 0x1f, 0xa0, 0xc4, 0xe0,
-  0x0e, 0x19, 0x13, 0x22, 0x64, 0x40,
-  0x33, 0x14, 0x52, 0x8a, 0x51, 0x40,
-  0x10, 0xc3, 0x28, 0x65, 0x0c, 0xa0,
-  0x45, 0x68, 0x4d, 0x09, 0xa1, 0x20,
-  0x88, 0x84, 0xa8, 0x95, 0x12, 0xa0,
-  0xe0, 0x22, 0x94, 0x52, 0x8a, 0x40,
-  0x46, 0x11, 0x92, 0x32, 0x46, 0x40,
-  0x33, 0x0c, 0xc9, 0x99, 0x33, 0x20,
-  0x10, 0xe4, 0x64, 0x8c, 0x91, 0x80,
-  0x0c, 0x69, 0x0d, 0x21, 0xa4, 0x20,
-  0x28, 0x94, 0x2a, 0x85, 0x50, 0xa0,
-  0x94, 0x21, 0x34, 0x26, 0x84, 0xc0,
-  0xc1, 0x02, 0x58, 0x4b, 0x09, 0x60
-};
-
-const uint8_t kMaskRandom43_26[156] = {
-  0x0e, 0x19, 0x13, 0x22, 0x64, 0x40,
-  0x33, 0x14, 0x52, 0x8a, 0x51, 0x40,
-  0x10, 0xc3, 0x28, 0x65, 0x0c, 0xa0,
-  0x45, 0x68, 0x4d, 0x09, 0xa1, 0x20,
-  0x88, 0x84, 0xa8, 0x95, 0x12, 0xa0,
-  0xe0, 0x22, 0x94, 0x52, 0x8a, 0x40,
-  0x46, 0x11, 0x92, 0x32, 0x46, 0x40,
-  0x33, 0x0c, 0xc9, 0x99, 0x33, 0x20,
-  0x10, 0xe4, 0x64, 0x8c, 0x91, 0x80,
-  0x0c, 0x69, 0x0d, 0x21, 0xa4, 0x20,
-  0x28, 0x94, 0x2a, 0x85, 0x50, 0xa0,
-  0x94, 0x21, 0x34, 0x26, 0x84, 0xc0,
-  0xc1, 0x02, 0x58, 0x4b, 0x09, 0x60,
-  0x0e, 0x19, 0x13, 0x22, 0x64, 0x40,
-  0x33, 0x14, 0x52, 0x8a, 0x51, 0x40,
-  0x10, 0xc3, 0x28, 0x65, 0x0c, 0xa0,
-  0x45, 0x68, 0x4d, 0x09, 0xa1, 0x20,
-  0x88, 0x84, 0xa8, 0x95, 0x12, 0xa0,
-  0xe0, 0x22, 0x94, 0x52, 0x8a, 0x40,
-  0xc6, 0x21, 0xa4, 0x34, 0x86, 0x80,
-  0x23, 0x88, 0xc9, 0x19, 0x23, 0x20,
-  0x1a, 0x45, 0x88, 0xb1, 0x16, 0x20,
-  0x24, 0xd3, 0x0a, 0x61, 0x4c, 0x20,
-  0x71, 0x10, 0x72, 0x0e, 0x41, 0xc0,
-  0xa0, 0x65, 0x1f, 0xa0, 0xc4, 0xe0,
-  0xef, 0x84, 0x77, 0xca, 0x0d, 0x40
-};
-
-const uint8_t kMaskRandom43_27[162] = {
-  0x0e, 0x19, 0x13, 0x22, 0x64, 0x40,
-  0x33, 0x14, 0x52, 0x8a, 0x51, 0x40,
-  0x10, 0xc3, 0x28, 0x65, 0x0c, 0xa0,
-  0x45, 0x68, 0x4d, 0x09, 0xa1, 0x20,
-  0x88, 0x84, 0xa8, 0x95, 0x12, 0xa0,
-  0xe0, 0x22, 0x94, 0x52, 0x8a, 0x40,
-  0x46, 0x11, 0x92, 0x32, 0x46, 0x40,
-  0x33, 0x0c, 0xc9, 0x99, 0x33, 0x20,
-  0x10, 0xe4, 0x64, 0x8c, 0x91, 0x80,
-  0x0c, 0x69, 0x0d, 0x21, 0xa4, 0x20,
-  0x28, 0x94, 0x2a, 0x85, 0x50, 0xa0,
-  0x94, 0x21, 0x34, 0x26, 0x84, 0xc0,
-  0xc1, 0x02, 0x58, 0x4b, 0x09, 0x60,
-  0x46, 0x11, 0x92, 0x32, 0x46, 0x40,
-  0x33, 0x0c, 0xc9, 0x99, 0x33, 0x20,
-  0x10, 0xe4, 0x64, 0x8c, 0x91, 0x80,
-  0x0c, 0x69, 0x0d, 0x21, 0xa4, 0x20,
-  0x28, 0x94, 0x2a, 0x85, 0x50, 0xa0,
-  0x94, 0x21, 0x34, 0x26, 0x84, 0xc0,
-  0xc1, 0x02, 0x58, 0x4b, 0x09, 0x60,
-  0x0e, 0x19, 0x13, 0x22, 0x64, 0x40,
-  0x33, 0x14, 0x52, 0x8a, 0x51, 0x40,
-  0x10, 0xc3, 0x28, 0x65, 0x0c, 0xa0,
-  0x45, 0x68, 0x4d, 0x09, 0xa1, 0x20,
-  0x88, 0x84, 0xa8, 0x95, 0x12, 0xa0,
-  0xe0, 0x22, 0x94, 0x52, 0x8a, 0x40,
-  0x4d, 0xd0, 0xc6, 0x36, 0x57, 0x40
-};
-
-const uint8_t kMaskRandom43_28[168] = {
-  0x46, 0x11, 0x92, 0x32, 0x46, 0x40,
-  0x33, 0x0c, 0xc9, 0x99, 0x33, 0x20,
-  0x10, 0xe4, 0x64, 0x8c, 0x91, 0x80,
-  0x0c, 0x69, 0x0d, 0x21, 0xa4, 0x20,
-  0x28, 0x94, 0x2a, 0x85, 0x50, 0xa0,
-  0x94, 0x21, 0x34, 0x26, 0x84, 0xc0,
-  0xc1, 0x02, 0x58, 0x4b, 0x09, 0x60,
-  0x0e, 0x19, 0x13, 0x22, 0x64, 0x40,
-  0x33, 0x14, 0x52, 0x8a, 0x51, 0x40,
-  0x10, 0xc3, 0x28, 0x65, 0x0c, 0xa0,
-  0x45, 0x68, 0x4d, 0x09, 0xa1, 0x20,
-  0x88, 0x84, 0xa8, 0x95, 0x12, 0xa0,
-  0xe0, 0x22, 0x94, 0x52, 0x8a, 0x40,
-  0x4d, 0xd0, 0xc6, 0x36, 0x57, 0x40,
-  0x0e, 0x19, 0x13, 0x22, 0x64, 0x40,
-  0x33, 0x14, 0x52, 0x8a, 0x51, 0x40,
-  0x10, 0xc3, 0x28, 0x65, 0x0c, 0xa0,
-  0x45, 0x68, 0x4d, 0x09, 0xa1, 0x20,
-  0x88, 0x84, 0xa8, 0x95, 0x12, 0xa0,
-  0xe0, 0x22, 0x94, 0x52, 0x8a, 0x40,
-  0x46, 0x11, 0x92, 0x32, 0x46, 0x40,
-  0x33, 0x0c, 0xc9, 0x99, 0x33, 0x20,
-  0x10, 0xe4, 0x64, 0x8c, 0x91, 0x80,
-  0x0c, 0x69, 0x0d, 0x21, 0xa4, 0x20,
-  0x28, 0x94, 0x2a, 0x85, 0x50, 0xa0,
-  0x94, 0x21, 0x34, 0x26, 0x84, 0xc0,
-  0xc1, 0x02, 0x58, 0x4b, 0x09, 0x60,
-  0x16, 0xc9, 0x53, 0x1e, 0xc4, 0x00
-};
-
-const uint8_t kMaskRandom43_29[174] = {
-  0x46, 0x11, 0x92, 0x32, 0x46, 0x40,
-  0x33, 0x0c, 0xc9, 0x99, 0x33, 0x20,
-  0x10, 0xe4, 0x64, 0x8c, 0x91, 0x80,
-  0x0c, 0x69, 0x0d, 0x21, 0xa4, 0x20,
-  0x28, 0x94, 0x2a, 0x85, 0x50, 0xa0,
-  0x94, 0x21, 0x34, 0x26, 0x84, 0xc0,
-  0xc1, 0x02, 0x58, 0x4b, 0x09, 0x60,
-  0x0e, 0x19, 0x13, 0x22, 0x64, 0x40,
-  0x33, 0x14, 0x52, 0x8a, 0x51, 0x40,
-  0x10, 0xc3, 0x28, 0x65, 0x0c, 0xa0,
-  0x45, 0x68, 0x4d, 0x09, 0xa1, 0x20,
-  0x88, 0x84, 0xa8, 0x95, 0x12, 0xa0,
-  0xe0, 0x22, 0x94, 0x52, 0x8a, 0x40,
-  0x4d, 0xd0, 0xc6, 0x36, 0x57, 0x40,
-  0x46, 0x11, 0x92, 0x32, 0x46, 0x40,
-  0x33, 0x0c, 0xc9, 0x99, 0x33, 0x20,
-  0x10, 0xe4, 0x64, 0x8c, 0x91, 0x80,
-  0x0c, 0x69, 0x0d, 0x21, 0xa4, 0x20,
-  0x28, 0x94, 0x2a, 0x85, 0x50, 0xa0,
-  0x94, 0x21, 0x34, 0x26, 0x84, 0xc0,
-  0xc1, 0x02, 0x58, 0x4b, 0x09, 0x60,
-  0x2c, 0x03, 0x20, 0x64, 0x0c, 0x80,
-  0x81, 0xa0, 0x1c, 0x03, 0x80, 0x60,
-  0xa0, 0x68, 0x25, 0x04, 0xa0, 0x80,
-  0x05, 0x41, 0x50, 0x2a, 0x05, 0x40,
-  0x18, 0x90, 0xc2, 0x18, 0x43, 0x00,
-  0xc2, 0x06, 0x80, 0xd0, 0x1a, 0x00,
-  0x22, 0x98, 0x0b, 0x01, 0x60, 0x20,
-  0x50, 0x45, 0x08, 0xa1, 0x14, 0x20
-};
-
-const uint8_t kMaskRandom43_3[18] = {
-  0xce, 0x32, 0xb6, 0x56, 0xca, 0xc0,
-  0x55, 0xdc, 0x57, 0x8a, 0xf1, 0x40,
-  0xa8, 0xed, 0x8d, 0xb1, 0xae, 0x20
-};
-
-const uint8_t kMaskRandom43_30[180] = {
-  0x46, 0x11, 0x92, 0x32, 0x46, 0x40,
-  0x33, 0x0c, 0xc9, 0x99, 0x33, 0x20,
-  0x10, 0xe4, 0x64, 0x8c, 0x91, 0x80,
-  0x0c, 0x69, 0x0d, 0x21, 0xa4, 0x20,
-  0x28, 0x94, 0x2a, 0x85, 0x50, 0xa0,
-  0x94, 0x21, 0x34, 0x26, 0x84, 0xc0,
-  0xc1, 0x02, 0x58, 0x4b, 0x09, 0x60,
-  0x2c, 0x03, 0x20, 0x64, 0x0c, 0x80,
-  0x81, 0xa0, 0x1c, 0x03, 0x80, 0x60,
-  0xa0, 0x68, 0x25, 0x04, 0xa0, 0x80,
-  0x05, 0x41, 0x50, 0x2a, 0x05, 0x40,
-  0x18, 0x90, 0xc2, 0x18, 0x43, 0x00,
-  0xc2, 0x06, 0x80, 0xd0, 0x1a, 0x00,
-  0x22, 0x98, 0x0b, 0x01, 0x60, 0x20,
-  0x50, 0x45, 0x08, 0xa1, 0x14, 0x20,
-  0x46, 0x11, 0x92, 0x32, 0x46, 0x40,
-  0x33, 0x0c, 0xc9, 0x99, 0x33, 0x20,
-  0x10, 0xe4, 0x64, 0x8c, 0x91, 0x80,
-  0x0c, 0x69, 0x0d, 0x21, 0xa4, 0x20,
-  0x28, 0x94, 0x2a, 0x85, 0x50, 0xa0,
-  0x94, 0x21, 0x34, 0x26, 0x84, 0xc0,
-  0xc1, 0x02, 0x58, 0x4b, 0x09, 0x60,
-  0x0e, 0x19, 0x13, 0x22, 0x64, 0x40,
-  0x33, 0x14, 0x52, 0x8a, 0x51, 0x40,
-  0x10, 0xc3, 0x28, 0x65, 0x0c, 0xa0,
-  0x45, 0x68, 0x4d, 0x09, 0xa1, 0x20,
-  0x88, 0x84, 0xa8, 0x95, 0x12, 0xa0,
-  0xe0, 0x22, 0x94, 0x52, 0x8a, 0x40,
-  0x4d, 0xd0, 0xc6, 0x36, 0x57, 0x40,
-  0x79, 0x4a, 0x8f, 0x42, 0x79, 0x40
-};
-
-const uint8_t kMaskRandom43_31[186] = {
-  0x46, 0x11, 0x92, 0x32, 0x46, 0x40,
-  0x33, 0x0c, 0xc9, 0x99, 0x33, 0x20,
-  0x10, 0xe4, 0x64, 0x8c, 0x91, 0x80,
-  0x0c, 0x69, 0x0d, 0x21, 0xa4, 0x20,
-  0x28, 0x94, 0x2a, 0x85, 0x50, 0xa0,
-  0x94, 0x21, 0x34, 0x26, 0x84, 0xc0,
-  0xc1, 0x02, 0x58, 0x4b, 0x09, 0x60,
-  0x2c, 0x03, 0x20, 0x64, 0x0c, 0x80,
-  0x81, 0xa0, 0x1c, 0x03, 0x80, 0x60,
-  0xa0, 0x68, 0x25, 0x04, 0xa0, 0x80,
-  0x05, 0x41, 0x50, 0x2a, 0x05, 0x40,
-  0x18, 0x90, 0xc2, 0x18, 0x43, 0x00,
-  0xc2, 0x06, 0x80, 0xd0, 0x1a, 0x00,
-  0x22, 0x98, 0x0b, 0x01, 0x60, 0x20,
-  0x50, 0x45, 0x08, 0xa1, 0x14, 0x20,
-  0x2c, 0x03, 0x20, 0x64, 0x0c, 0x80,
-  0x81, 0xa0, 0x1c, 0x03, 0x80, 0x60,
-  0xa0, 0x68, 0x25, 0x04, 0xa0, 0x80,
-  0x05, 0x41, 0x50, 0x2a, 0x05, 0x40,
-  0x18, 0x90, 0xc2, 0x18, 0x43, 0x00,
-  0xc2, 0x06, 0x80, 0xd0, 0x1a, 0x00,
-  0x22, 0x98, 0x0b, 0x01, 0x60, 0x20,
-  0x50, 0x45, 0x08, 0xa1, 0x14, 0x20,
-  0x46, 0x11, 0x92, 0x32, 0x46, 0x40,
-  0x33, 0x0c, 0xc9, 0x99, 0x33, 0x20,
-  0x10, 0xe4, 0x64, 0x8c, 0x91, 0x80,
-  0x0c, 0x69, 0x0d, 0x21, 0xa4, 0x20,
-  0x28, 0x94, 0x2a, 0x85, 0x50, 0xa0,
-  0x94, 0x21, 0x34, 0x26, 0x84, 0xc0,
-  0xc1, 0x02, 0x58, 0x4b, 0x09, 0x60,
-  0x3b, 0xf5, 0x3c, 0x36, 0x0a, 0x20
-};
-
-const uint8_t kMaskRandom43_32[192] = {
-  0x2c, 0x03, 0x20, 0x64, 0x0c, 0x80,
-  0x81, 0xa0, 0x1c, 0x03, 0x80, 0x60,
-  0xa0, 0x68, 0x25, 0x04, 0xa0, 0x80,
-  0x05, 0x41, 0x50, 0x2a, 0x05, 0x40,
-  0x18, 0x90, 0xc2, 0x18, 0x43, 0x00,
-  0xc2, 0x06, 0x80, 0xd0, 0x1a, 0x00,
-  0x22, 0x98, 0x0b, 0x01, 0x60, 0x20,
-  0x50, 0x45, 0x08, 0xa1, 0x14, 0x20,
-  0x46, 0x11, 0x92, 0x32, 0x46, 0x40,
-  0x33, 0x0c, 0xc9, 0x99, 0x33, 0x20,
-  0x10, 0xe4, 0x64, 0x8c, 0x91, 0x80,
-  0x0c, 0x69, 0x0d, 0x21, 0xa4, 0x20,
-  0x28, 0x94, 0x2a, 0x85, 0x50, 0xa0,
-  0x94, 0x21, 0x34, 0x26, 0x84, 0xc0,
-  0xc1, 0x02, 0x58, 0x4b, 0x09, 0x60,
-  0x3b, 0xf5, 0x3c, 0x36, 0x0a, 0x20,
-  0x46, 0x11, 0x92, 0x32, 0x46, 0x40,
-  0x33, 0x0c, 0xc9, 0x99, 0x33, 0x20,
-  0x10, 0xe4, 0x64, 0x8c, 0x91, 0x80,
-  0x0c, 0x69, 0x0d, 0x21, 0xa4, 0x20,
-  0x28, 0x94, 0x2a, 0x85, 0x50, 0xa0,
-  0x94, 0x21, 0x34, 0x26, 0x84, 0xc0,
-  0xc1, 0x02, 0x58, 0x4b, 0x09, 0x60,
-  0x2c, 0x03, 0x20, 0x64, 0x0c, 0x80,
-  0x81, 0xa0, 0x1c, 0x03, 0x80, 0x60,
-  0xa0, 0x68, 0x25, 0x04, 0xa0, 0x80,
-  0x05, 0x41, 0x50, 0x2a, 0x05, 0x40,
-  0x18, 0x90, 0xc2, 0x18, 0x43, 0x00,
-  0xc2, 0x06, 0x80, 0xd0, 0x1a, 0x00,
-  0x22, 0x98, 0x0b, 0x01, 0x60, 0x20,
-  0x50, 0x45, 0x08, 0xa1, 0x14, 0x20,
-  0xd1, 0xd1, 0x11, 0xa4, 0xed, 0xc0
-};
-
-const uint8_t kMaskRandom43_33[198] = {
-  0x2c, 0x03, 0x20, 0x64, 0x0c, 0x80,
-  0x81, 0xa0, 0x1c, 0x03, 0x80, 0x60,
-  0xa0, 0x68, 0x25, 0x04, 0xa0, 0x80,
-  0x05, 0x41, 0x50, 0x2a, 0x05, 0x40,
-  0x18, 0x90, 0xc2, 0x18, 0x43, 0x00,
-  0xc2, 0x06, 0x80, 0xd0, 0x1a, 0x00,
-  0x22, 0x98, 0x0b, 0x01, 0x60, 0x20,
-  0x50, 0x45, 0x08, 0xa1, 0x14, 0x20,
-  0x46, 0x11, 0x92, 0x32, 0x46, 0x40,
-  0x33, 0x0c, 0xc9, 0x99, 0x33, 0x20,
-  0x10, 0xe4, 0x64, 0x8c, 0x91, 0x80,
-  0x0c, 0x69, 0x0d, 0x21, 0xa4, 0x20,
-  0x28, 0x94, 0x2a, 0x85, 0x50, 0xa0,
-  0x94, 0x21, 0x34, 0x26, 0x84, 0xc0,
-  0xc1, 0x02, 0x58, 0x4b, 0x09, 0x60,
-  0x3b, 0xf5, 0x3c, 0x36, 0x0a, 0x20,
-  0x2c, 0x03, 0x20, 0x64, 0x0c, 0x80,
-  0x81, 0xa0, 0x1c, 0x03, 0x80, 0x60,
-  0xa0, 0x68, 0x25, 0x04, 0xa0, 0x80,
-  0x05, 0x41, 0x50, 0x2a, 0x05, 0x40,
-  0x18, 0x90, 0xc2, 0x18, 0x43, 0x00,
-  0xc2, 0x06, 0x80, 0xd0, 0x1a, 0x00,
-  0x22, 0x98, 0x0b, 0x01, 0x60, 0x20,
-  0x50, 0x45, 0x08, 0xa1, 0x14, 0x20,
-  0x4e, 0x11, 0x92, 0x32, 0x46, 0x40,
-  0xe3, 0x18, 0x9b, 0x13, 0x62, 0x60,
-  0x81, 0xe3, 0x04, 0x60, 0x8c, 0x00,
-  0x21, 0x40, 0x58, 0x0b, 0x01, 0x60,
-  0x52, 0x81, 0xe0, 0x3c, 0x07, 0x80,
-  0xb4, 0x28, 0x25, 0x04, 0xa0, 0x80,
-  0x26, 0x86, 0x28, 0xc5, 0x18, 0xa0,
-  0x58, 0x64, 0x44, 0x88, 0x91, 0x00,
-  0x19, 0x9e, 0x03, 0xc0, 0x78, 0x00
-};
-
-const uint8_t kMaskRandom43_34[204] = {
-  0x2c, 0x03, 0x20, 0x64, 0x0c, 0x80,
-  0x81, 0xa0, 0x1c, 0x03, 0x80, 0x60,
-  0xa0, 0x68, 0x25, 0x04, 0xa0, 0x80,
-  0x05, 0x41, 0x50, 0x2a, 0x05, 0x40,
-  0x18, 0x90, 0xc2, 0x18, 0x43, 0x00,
-  0xc2, 0x06, 0x80, 0xd0, 0x1a, 0x00,
-  0x22, 0x98, 0x0b, 0x01, 0x60, 0x20,
-  0x50, 0x45, 0x08, 0xa1, 0x14, 0x20,
-  0x4e, 0x11, 0x92, 0x32, 0x46, 0x40,
-  0xe3, 0x18, 0x9b, 0x13, 0x62, 0x60,
-  0x81, 0xe3, 0x04, 0x60, 0x8c, 0x00,
-  0x21, 0x40, 0x58, 0x0b, 0x01, 0x60,
-  0x52, 0x81, 0xe0, 0x3c, 0x07, 0x80,
-  0xb4, 0x28, 0x25, 0x04, 0xa0, 0x80,
-  0x26, 0x86, 0x28, 0xc5, 0x18, 0xa0,
-  0x58, 0x64, 0x44, 0x88, 0x91, 0x00,
-  0x19, 0x9e, 0x03, 0xc0, 0x78, 0x00,
-  0x2c, 0x03, 0x20, 0x64, 0x0c, 0x80,
-  0x81, 0xa0, 0x1c, 0x03, 0x80, 0x60,
-  0xa0, 0x68, 0x25, 0x04, 0xa0, 0x80,
-  0x05, 0x41, 0x50, 0x2a, 0x05, 0x40,
-  0x18, 0x90, 0xc2, 0x18, 0x43, 0x00,
-  0xc2, 0x06, 0x80, 0xd0, 0x1a, 0x00,
-  0x22, 0x98, 0x0b, 0x01, 0x60, 0x20,
-  0x50, 0x45, 0x08, 0xa1, 0x14, 0x20,
-  0x46, 0x11, 0x92, 0x32, 0x46, 0x40,
-  0x33, 0x0c, 0xc9, 0x99, 0x33, 0x20,
-  0x10, 0xe4, 0x64, 0x8c, 0x91, 0x80,
-  0x0c, 0x69, 0x0d, 0x21, 0xa4, 0x20,
-  0x28, 0x94, 0x2a, 0x85, 0x50, 0xa0,
-  0x94, 0x21, 0x34, 0x26, 0x84, 0xc0,
-  0xc1, 0x02, 0x58, 0x4b, 0x09, 0x60,
-  0x3b, 0xf5, 0x3c, 0x36, 0x0a, 0x20,
-  0x76, 0x81, 0x4d, 0x33, 0x66, 0x00
-};
-
-const uint8_t kMaskRandom43_35[210] = {
-  0x2c, 0x03, 0x20, 0x64, 0x0c, 0x80,
-  0x81, 0xa0, 0x1c, 0x03, 0x80, 0x60,
-  0xa0, 0x68, 0x25, 0x04, 0xa0, 0x80,
-  0x05, 0x41, 0x50, 0x2a, 0x05, 0x40,
-  0x18, 0x90, 0xc2, 0x18, 0x43, 0x00,
-  0xc2, 0x06, 0x80, 0xd0, 0x1a, 0x00,
-  0x22, 0x98, 0x0b, 0x01, 0x60, 0x20,
-  0x50, 0x45, 0x08, 0xa1, 0x14, 0x20,
-  0x4e, 0x11, 0x92, 0x32, 0x46, 0x40,
-  0xe3, 0x18, 0x9b, 0x13, 0x62, 0x60,
-  0x81, 0xe3, 0x04, 0x60, 0x8c, 0x00,
-  0x21, 0x40, 0x58, 0x0b, 0x01, 0x60,
-  0x52, 0x81, 0xe0, 0x3c, 0x07, 0x80,
-  0xb4, 0x28, 0x25, 0x04, 0xa0, 0x80,
-  0x26, 0x86, 0x28, 0xc5, 0x18, 0xa0,
-  0x58, 0x64, 0x44, 0x88, 0x91, 0x00,
-  0x19, 0x9e, 0x03, 0xc0, 0x78, 0x00,
-  0x4e, 0x11, 0x92, 0x32, 0x46, 0x40,
-  0xe3, 0x18, 0x9b, 0x13, 0x62, 0x60,
-  0x81, 0xe3, 0x04, 0x60, 0x8c, 0x00,
-  0x21, 0x40, 0x58, 0x0b, 0x01, 0x60,
-  0x52, 0x81, 0xe0, 0x3c, 0x07, 0x80,
-  0xb4, 0x28, 0x25, 0x04, 0xa0, 0x80,
-  0x26, 0x86, 0x28, 0xc5, 0x18, 0xa0,
-  0x58, 0x64, 0x44, 0x88, 0x91, 0x00,
-  0x19, 0x9e, 0x03, 0xc0, 0x78, 0x00,
-  0x2c, 0x03, 0x20, 0x64, 0x0c, 0x80,
-  0x81, 0xa0, 0x1c, 0x03, 0x80, 0x60,
-  0xa0, 0x68, 0x25, 0x04, 0xa0, 0x80,
-  0x05, 0x41, 0x50, 0x2a, 0x05, 0x40,
-  0x18, 0x90, 0xc2, 0x18, 0x43, 0x00,
-  0xc2, 0x06, 0x80, 0xd0, 0x1a, 0x00,
-  0x22, 0x98, 0x0b, 0x01, 0x60, 0x20,
-  0x50, 0x45, 0x08, 0xa1, 0x14, 0x20,
-  0x5a, 0x56, 0x5f, 0x26, 0xa3, 0x60
-};
-
-const uint8_t kMaskRandom43_36[216] = {
-  0x4e, 0x11, 0x92, 0x32, 0x46, 0x40,
-  0xe3, 0x18, 0x9b, 0x13, 0x62, 0x60,
-  0x81, 0xe3, 0x04, 0x60, 0x8c, 0x00,
-  0x21, 0x40, 0x58, 0x0b, 0x01, 0x60,
-  0x52, 0x81, 0xe0, 0x3c, 0x07, 0x80,
-  0xb4, 0x28, 0x25, 0x04, 0xa0, 0x80,
-  0x26, 0x86, 0x28, 0xc5, 0x18, 0xa0,
-  0x58, 0x64, 0x44, 0x88, 0x91, 0x00,
-  0x19, 0x9e, 0x03, 0xc0, 0x78, 0x00,
-  0x2c, 0x03, 0x20, 0x64, 0x0c, 0x80,
-  0x81, 0xa0, 0x1c, 0x03, 0x80, 0x60,
-  0xa0, 0x68, 0x25, 0x04, 0xa0, 0x80,
-  0x05, 0x41, 0x50, 0x2a, 0x05, 0x40,
-  0x18, 0x90, 0xc2, 0x18, 0x43, 0x00,
-  0xc2, 0x06, 0x80, 0xd0, 0x1a, 0x00,
-  0x22, 0x98, 0x0b, 0x01, 0x60, 0x20,
-  0x50, 0x45, 0x08, 0xa1, 0x14, 0x20,
-  0x5a, 0x56, 0x5f, 0x26, 0xa3, 0x60,
-  0x2c, 0x03, 0x20, 0x64, 0x0c, 0x80,
-  0x81, 0xa0, 0x1c, 0x03, 0x80, 0x60,
-  0xa0, 0x68, 0x25, 0x04, 0xa0, 0x80,
-  0x05, 0x41, 0x50, 0x2a, 0x05, 0x40,
-  0x18, 0x90, 0xc2, 0x18, 0x43, 0x00,
-  0xc2, 0x06, 0x80, 0xd0, 0x1a, 0x00,
-  0x22, 0x98, 0x0b, 0x01, 0x60, 0x20,
-  0x50, 0x45, 0x08, 0xa1, 0x14, 0x20,
-  0x4e, 0x11, 0x92, 0x32, 0x46, 0x40,
-  0xe3, 0x18, 0x9b, 0x13, 0x62, 0x60,
-  0x81, 0xe3, 0x04, 0x60, 0x8c, 0x00,
-  0x21, 0x40, 0x58, 0x0b, 0x01, 0x60,
-  0x52, 0x81, 0xe0, 0x3c, 0x07, 0x80,
-  0xb4, 0x28, 0x25, 0x04, 0xa0, 0x80,
-  0x26, 0x86, 0x28, 0xc5, 0x18, 0xa0,
-  0x58, 0x64, 0x44, 0x88, 0x91, 0x00,
-  0x19, 0x9e, 0x03, 0xc0, 0x78, 0x00,
-  0xa3, 0x85, 0x0a, 0xb5, 0x11, 0x60
-};
-
-const uint8_t kMaskRandom43_37[222] = {
-  0x4e, 0x11, 0x92, 0x32, 0x46, 0x40,
-  0xe3, 0x18, 0x9b, 0x13, 0x62, 0x60,
-  0x81, 0xe3, 0x04, 0x60, 0x8c, 0x00,
-  0x21, 0x40, 0x58, 0x0b, 0x01, 0x60,
-  0x52, 0x81, 0xe0, 0x3c, 0x07, 0x80,
-  0xb4, 0x28, 0x25, 0x04, 0xa0, 0x80,
-  0x26, 0x86, 0x28, 0xc5, 0x18, 0xa0,
-  0x58, 0x64, 0x44, 0x88, 0x91, 0x00,
-  0x19, 0x9e, 0x03, 0xc0, 0x78, 0x00,
-  0x2c, 0x03, 0x20, 0x64, 0x0c, 0x80,
-  0x81, 0xa0, 0x1c, 0x03, 0x80, 0x60,
-  0xa0, 0x68, 0x25, 0x04, 0xa0, 0x80,
-  0x05, 0x41, 0x50, 0x2a, 0x05, 0x40,
-  0x18, 0x90, 0xc2, 0x18, 0x43, 0x00,
-  0xc2, 0x06, 0x80, 0xd0, 0x1a, 0x00,
-  0x22, 0x98, 0x0b, 0x01, 0x60, 0x20,
-  0x50, 0x45, 0x08, 0xa1, 0x14, 0x20,
-  0x5a, 0x56, 0x5f, 0x26, 0xa3, 0x60,
-  0x4e, 0x11, 0x92, 0x32, 0x46, 0x40,
-  0xe3, 0x18, 0x9b, 0x13, 0x62, 0x60,
-  0x81, 0xe3, 0x04, 0x60, 0x8c, 0x00,
-  0x21, 0x40, 0x58, 0x0b, 0x01, 0x60,
-  0x52, 0x81, 0xe0, 0x3c, 0x07, 0x80,
-  0xb4, 0x28, 0x25, 0x04, 0xa0, 0x80,
-  0x26, 0x86, 0x28, 0xc5, 0x18, 0xa0,
-  0x58, 0x64, 0x44, 0x88, 0x91, 0x00,
-  0x19, 0x9e, 0x03, 0xc0, 0x78, 0x00,
-  0x4c, 0x19, 0x13, 0x22, 0x64, 0x40,
-  0x51, 0x14, 0x52, 0x8a, 0x51, 0x40,
-  0xa0, 0x6a, 0x45, 0x48, 0xa9, 0x00,
-  0x04, 0xc1, 0x30, 0x26, 0x04, 0xc0,
-  0x03, 0xb4, 0x06, 0x80, 0xd0, 0x00,
-  0x86, 0x20, 0x94, 0x12, 0x82, 0x40,
-  0x29, 0x08, 0x49, 0x09, 0x21, 0x20,
-  0x42, 0x43, 0x08, 0x61, 0x0c, 0x20,
-  0x98, 0x12, 0x82, 0x50, 0x4a, 0x00,
-  0x30, 0x84, 0xa8, 0x95, 0x12, 0xa0
-};
-
-const uint8_t kMaskRandom43_38[228] = {
-  0x4e, 0x11, 0x92, 0x32, 0x46, 0x40,
-  0xe3, 0x18, 0x9b, 0x13, 0x62, 0x60,
-  0x81, 0xe3, 0x04, 0x60, 0x8c, 0x00,
-  0x21, 0x40, 0x58, 0x0b, 0x01, 0x60,
-  0x52, 0x81, 0xe0, 0x3c, 0x07, 0x80,
-  0xb4, 0x28, 0x25, 0x04, 0xa0, 0x80,
-  0x26, 0x86, 0x28, 0xc5, 0x18, 0xa0,
-  0x58, 0x64, 0x44, 0x88, 0x91, 0x00,
-  0x19, 0x9e, 0x03, 0xc0, 0x78, 0x00,
-  0x4c, 0x19, 0x13, 0x22, 0x64, 0x40,
-  0x51, 0x14, 0x52, 0x8a, 0x51, 0x40,
-  0xa0, 0x6a, 0x45, 0x48, 0xa9, 0x00,
-  0x04, 0xc1, 0x30, 0x26, 0x04, 0xc0,
-  0x03, 0xb4, 0x06, 0x80, 0xd0, 0x00,
-  0x86, 0x20, 0x94, 0x12, 0x82, 0x40,
-  0x29, 0x08, 0x49, 0x09, 0x21, 0x20,
-  0x42, 0x43, 0x08, 0x61, 0x0c, 0x20,
-  0x98, 0x12, 0x82, 0x50, 0x4a, 0x00,
-  0x30, 0x84, 0xa8, 0x95, 0x12, 0xa0,
-  0x4e, 0x11, 0x92, 0x32, 0x46, 0x40,
-  0xe3, 0x18, 0x9b, 0x13, 0x62, 0x60,
-  0x81, 0xe3, 0x04, 0x60, 0x8c, 0x00,
-  0x21, 0x40, 0x58, 0x0b, 0x01, 0x60,
-  0x52, 0x81, 0xe0, 0x3c, 0x07, 0x80,
-  0xb4, 0x28, 0x25, 0x04, 0xa0, 0x80,
-  0x26, 0x86, 0x28, 0xc5, 0x18, 0xa0,
-  0x58, 0x64, 0x44, 0x88, 0x91, 0x00,
-  0x19, 0x9e, 0x03, 0xc0, 0x78, 0x00,
-  0x2c, 0x03, 0x20, 0x64, 0x0c, 0x80,
-  0x81, 0xa0, 0x1c, 0x03, 0x80, 0x60,
-  0xa0, 0x68, 0x25, 0x04, 0xa0, 0x80,
-  0x05, 0x41, 0x50, 0x2a, 0x05, 0x40,
-  0x18, 0x90, 0xc2, 0x18, 0x43, 0x00,
-  0xc2, 0x06, 0x80, 0xd0, 0x1a, 0x00,
-  0x22, 0x98, 0x0b, 0x01, 0x60, 0x20,
-  0x50, 0x45, 0x08, 0xa1, 0x14, 0x20,
-  0x5a, 0x56, 0x5f, 0x26, 0xa3, 0x60,
-  0x9a, 0x16, 0x97, 0x21, 0xb9, 0x80
-};
-
-const uint8_t kMaskRandom43_39[234] = {
-  0x4e, 0x11, 0x92, 0x32, 0x46, 0x40,
-  0xe3, 0x18, 0x9b, 0x13, 0x62, 0x60,
-  0x81, 0xe3, 0x04, 0x60, 0x8c, 0x00,
-  0x21, 0x40, 0x58, 0x0b, 0x01, 0x60,
-  0x52, 0x81, 0xe0, 0x3c, 0x07, 0x80,
-  0xb4, 0x28, 0x25, 0x04, 0xa0, 0x80,
-  0x26, 0x86, 0x28, 0xc5, 0x18, 0xa0,
-  0x58, 0x64, 0x44, 0x88, 0x91, 0x00,
-  0x19, 0x9e, 0x03, 0xc0, 0x78, 0x00,
-  0x4c, 0x19, 0x13, 0x22, 0x64, 0x40,
-  0x51, 0x14, 0x52, 0x8a, 0x51, 0x40,
-  0xa0, 0x6a, 0x45, 0x48, 0xa9, 0x00,
-  0x04, 0xc1, 0x30, 0x26, 0x04, 0xc0,
-  0x03, 0xb4, 0x06, 0x80, 0xd0, 0x00,
-  0x86, 0x20, 0x94, 0x12, 0x82, 0x40,
-  0x29, 0x08, 0x49, 0x09, 0x21, 0x20,
-  0x42, 0x43, 0x08, 0x61, 0x0c, 0x20,
-  0x98, 0x12, 0x82, 0x50, 0x4a, 0x00,
-  0x30, 0x84, 0xa8, 0x95, 0x12, 0xa0,
-  0x4c, 0x19, 0x13, 0x22, 0x64, 0x40,
-  0x51, 0x14, 0x52, 0x8a, 0x51, 0x40,
-  0xa0, 0x6a, 0x45, 0x48, 0xa9, 0x00,
-  0x04, 0xc1, 0x30, 0x26, 0x04, 0xc0,
-  0x03, 0xb4, 0x06, 0x80, 0xd0, 0x00,
-  0x86, 0x20, 0x94, 0x12, 0x82, 0x40,
-  0x29, 0x08, 0x49, 0x09, 0x21, 0x20,
-  0x42, 0x43, 0x08, 0x61, 0x0c, 0x20,
-  0x98, 0x12, 0x82, 0x50, 0x4a, 0x00,
-  0x30, 0x84, 0xa8, 0x95, 0x12, 0xa0,
-  0x4e, 0x11, 0x92, 0x32, 0x46, 0x40,
-  0xe3, 0x18, 0x9b, 0x13, 0x62, 0x60,
-  0x81, 0xe3, 0x04, 0x60, 0x8c, 0x00,
-  0x21, 0x40, 0x58, 0x0b, 0x01, 0x60,
-  0x52, 0x81, 0xe0, 0x3c, 0x07, 0x80,
-  0xb4, 0x28, 0x25, 0x04, 0xa0, 0x80,
-  0x26, 0x86, 0x28, 0xc5, 0x18, 0xa0,
-  0x58, 0x64, 0x44, 0x88, 0x91, 0x00,
-  0x19, 0x9e, 0x03, 0xc0, 0x78, 0x00,
-  0x2a, 0x03, 0x31, 0xda, 0x46, 0x20
-};
-
-const uint8_t kMaskRandom43_4[24] = {
-  0xe6, 0x31, 0x36, 0x26, 0xc4, 0xc0,
-  0x33, 0x8c, 0x59, 0x8b, 0x31, 0x60,
-  0x98, 0xd2, 0xca, 0x59, 0x4b, 0x20,
-  0x2d, 0x4b, 0x29, 0x65, 0x2c, 0xa0
-};
-
-const uint8_t kMaskRandom43_40[240] = {
-  0x4c, 0x19, 0x13, 0x22, 0x64, 0x40,
-  0x51, 0x14, 0x52, 0x8a, 0x51, 0x40,
-  0xa0, 0x6a, 0x45, 0x48, 0xa9, 0x00,
-  0x04, 0xc1, 0x30, 0x26, 0x04, 0xc0,
-  0x03, 0xb4, 0x06, 0x80, 0xd0, 0x00,
-  0x86, 0x20, 0x94, 0x12, 0x82, 0x40,
-  0x29, 0x08, 0x49, 0x09, 0x21, 0x20,
-  0x42, 0x43, 0x08, 0x61, 0x0c, 0x20,
-  0x98, 0x12, 0x82, 0x50, 0x4a, 0x00,
-  0x30, 0x84, 0xa8, 0x95, 0x12, 0xa0,
-  0x4e, 0x11, 0x92, 0x32, 0x46, 0x40,
-  0xe3, 0x18, 0x9b, 0x13, 0x62, 0x60,
-  0x81, 0xe3, 0x04, 0x60, 0x8c, 0x00,
-  0x21, 0x40, 0x58, 0x0b, 0x01, 0x60,
-  0x52, 0x81, 0xe0, 0x3c, 0x07, 0x80,
-  0xb4, 0x28, 0x25, 0x04, 0xa0, 0x80,
-  0x26, 0x86, 0x28, 0xc5, 0x18, 0xa0,
-  0x58, 0x64, 0x44, 0x88, 0x91, 0x00,
-  0x19, 0x9e, 0x03, 0xc0, 0x78, 0x00,
-  0x2a, 0x03, 0x31, 0xda, 0x46, 0x20,
-  0x4e, 0x11, 0x92, 0x32, 0x46, 0x40,
-  0xe3, 0x18, 0x9b, 0x13, 0x62, 0x60,
-  0x81, 0xe3, 0x04, 0x60, 0x8c, 0x00,
-  0x21, 0x40, 0x58, 0x0b, 0x01, 0x60,
-  0x52, 0x81, 0xe0, 0x3c, 0x07, 0x80,
-  0xb4, 0x28, 0x25, 0x04, 0xa0, 0x80,
-  0x26, 0x86, 0x28, 0xc5, 0x18, 0xa0,
-  0x58, 0x64, 0x44, 0x88, 0x91, 0x00,
-  0x19, 0x9e, 0x03, 0xc0, 0x78, 0x00,
-  0x4c, 0x19, 0x13, 0x22, 0x64, 0x40,
-  0x51, 0x14, 0x52, 0x8a, 0x51, 0x40,
-  0xa0, 0x6a, 0x45, 0x48, 0xa9, 0x00,
-  0x04, 0xc1, 0x30, 0x26, 0x04, 0xc0,
-  0x03, 0xb4, 0x06, 0x80, 0xd0, 0x00,
-  0x86, 0x20, 0x94, 0x12, 0x82, 0x40,
-  0x29, 0x08, 0x49, 0x09, 0x21, 0x20,
-  0x42, 0x43, 0x08, 0x61, 0x0c, 0x20,
-  0x98, 0x12, 0x82, 0x50, 0x4a, 0x00,
-  0x30, 0x84, 0xa8, 0x95, 0x12, 0xa0,
-  0x3a, 0xab, 0x77, 0x63, 0xef, 0x60
-};
-
-const uint8_t kMaskRandom43_41[246] = {
-  0x4c, 0x19, 0x13, 0x22, 0x64, 0x40,
-  0x51, 0x14, 0x52, 0x8a, 0x51, 0x40,
-  0xa0, 0x6a, 0x45, 0x48, 0xa9, 0x00,
-  0x04, 0xc1, 0x30, 0x26, 0x04, 0xc0,
-  0x03, 0xb4, 0x06, 0x80, 0xd0, 0x00,
-  0x86, 0x20, 0x94, 0x12, 0x82, 0x40,
-  0x29, 0x08, 0x49, 0x09, 0x21, 0x20,
-  0x42, 0x43, 0x08, 0x61, 0x0c, 0x20,
-  0x98, 0x12, 0x82, 0x50, 0x4a, 0x00,
-  0x30, 0x84, 0xa8, 0x95, 0x12, 0xa0,
-  0x4e, 0x11, 0x92, 0x32, 0x46, 0x40,
-  0xe3, 0x18, 0x9b, 0x13, 0x62, 0x60,
-  0x81, 0xe3, 0x04, 0x60, 0x8c, 0x00,
-  0x21, 0x40, 0x58, 0x0b, 0x01, 0x60,
-  0x52, 0x81, 0xe0, 0x3c, 0x07, 0x80,
-  0xb4, 0x28, 0x25, 0x04, 0xa0, 0x80,
-  0x26, 0x86, 0x28, 0xc5, 0x18, 0xa0,
-  0x58, 0x64, 0x44, 0x88, 0x91, 0x00,
-  0x19, 0x9e, 0x03, 0xc0, 0x78, 0x00,
-  0x2a, 0x03, 0x31, 0xda, 0x46, 0x20,
-  0x4c, 0x19, 0x13, 0x22, 0x64, 0x40,
-  0x51, 0x14, 0x52, 0x8a, 0x51, 0x40,
-  0xa0, 0x6a, 0x45, 0x48, 0xa9, 0x00,
-  0x04, 0xc1, 0x30, 0x26, 0x04, 0xc0,
-  0x03, 0xb4, 0x06, 0x80, 0xd0, 0x00,
-  0x86, 0x20, 0x94, 0x12, 0x82, 0x40,
-  0x29, 0x08, 0x49, 0x09, 0x21, 0x20,
-  0x42, 0x43, 0x08, 0x61, 0x0c, 0x20,
-  0x98, 0x12, 0x82, 0x50, 0x4a, 0x00,
-  0x30, 0x84, 0xa8, 0x95, 0x12, 0xa0,
-  0x4c, 0x11, 0x92, 0x32, 0x46, 0x40,
-  0x51, 0x0c, 0xc9, 0x99, 0x33, 0x20,
-  0xa0, 0x66, 0x44, 0xc8, 0x99, 0x00,
-  0x04, 0xc1, 0x60, 0x2c, 0x05, 0x80,
-  0x03, 0xa0, 0x2c, 0x05, 0x80, 0xa0,
-  0x86, 0x21, 0x14, 0x22, 0x84, 0x40,
-  0x29, 0x10, 0x1a, 0x03, 0x40, 0x60,
-  0x42, 0x42, 0xa0, 0x54, 0x0a, 0x80,
-  0x98, 0x1a, 0x03, 0x40, 0x68, 0x00,
-  0x30, 0x84, 0x08, 0x81, 0x10, 0x20,
-  0xdf, 0x4c, 0x11, 0x82, 0x30, 0x40
-};
-
-const uint8_t kMaskRandom43_42[252] = {
-  0x4c, 0x19, 0x13, 0x22, 0x64, 0x40,
-  0x51, 0x14, 0x52, 0x8a, 0x51, 0x40,
-  0xa0, 0x6a, 0x45, 0x48, 0xa9, 0x00,
-  0x04, 0xc1, 0x30, 0x26, 0x04, 0xc0,
-  0x03, 0xb4, 0x06, 0x80, 0xd0, 0x00,
-  0x86, 0x20, 0x94, 0x12, 0x82, 0x40,
-  0x29, 0x08, 0x49, 0x09, 0x21, 0x20,
-  0x42, 0x43, 0x08, 0x61, 0x0c, 0x20,
-  0x98, 0x12, 0x82, 0x50, 0x4a, 0x00,
-  0x30, 0x84, 0xa8, 0x95, 0x12, 0xa0,
-  0x4c, 0x11, 0x92, 0x32, 0x46, 0x40,
-  0x51, 0x0c, 0xc9, 0x99, 0x33, 0x20,
-  0xa0, 0x66, 0x44, 0xc8, 0x99, 0x00,
-  0x04, 0xc1, 0x60, 0x2c, 0x05, 0x80,
-  0x03, 0xa0, 0x2c, 0x05, 0x80, 0xa0,
-  0x86, 0x21, 0x14, 0x22, 0x84, 0x40,
-  0x29, 0x10, 0x1a, 0x03, 0x40, 0x60,
-  0x42, 0x42, 0xa0, 0x54, 0x0a, 0x80,
-  0x98, 0x1a, 0x03, 0x40, 0x68, 0x00,
-  0x30, 0x84, 0x08, 0x81, 0x10, 0x20,
-  0xdf, 0x4c, 0x11, 0x82, 0x30, 0x40,
-  0x4c, 0x19, 0x13, 0x22, 0x64, 0x40,
-  0x51, 0x14, 0x52, 0x8a, 0x51, 0x40,
-  0xa0, 0x6a, 0x45, 0x48, 0xa9, 0x00,
-  0x04, 0xc1, 0x30, 0x26, 0x04, 0xc0,
-  0x03, 0xb4, 0x06, 0x80, 0xd0, 0x00,
-  0x86, 0x20, 0x94, 0x12, 0x82, 0x40,
-  0x29, 0x08, 0x49, 0x09, 0x21, 0x20,
-  0x42, 0x43, 0x08, 0x61, 0x0c, 0x20,
-  0x98, 0x12, 0x82, 0x50, 0x4a, 0x00,
-  0x30, 0x84, 0xa8, 0x95, 0x12, 0xa0,
-  0x4e, 0x11, 0x92, 0x32, 0x46, 0x40,
-  0xe3, 0x18, 0x9b, 0x13, 0x62, 0x60,
-  0x81, 0xe3, 0x04, 0x60, 0x8c, 0x00,
-  0x21, 0x40, 0x58, 0x0b, 0x01, 0x60,
-  0x52, 0x81, 0xe0, 0x3c, 0x07, 0x80,
-  0xb4, 0x28, 0x25, 0x04, 0xa0, 0x80,
-  0x26, 0x86, 0x28, 0xc5, 0x18, 0xa0,
-  0x58, 0x64, 0x44, 0x88, 0x91, 0x00,
-  0x19, 0x9e, 0x03, 0xc0, 0x78, 0x00,
-  0x2a, 0x03, 0x31, 0xda, 0x46, 0x20,
-  0x26, 0x84, 0x10, 0xcd, 0xf7, 0x60
-};
-
-const uint8_t kMaskRandom43_43[258] = {
-  0x4c, 0x19, 0x13, 0x22, 0x64, 0x40,
-  0x51, 0x14, 0x52, 0x8a, 0x51, 0x40,
-  0xa0, 0x6a, 0x45, 0x48, 0xa9, 0x00,
-  0x04, 0xc1, 0x30, 0x26, 0x04, 0xc0,
-  0x03, 0xb4, 0x06, 0x80, 0xd0, 0x00,
-  0x86, 0x20, 0x94, 0x12, 0x82, 0x40,
-  0x29, 0x08, 0x49, 0x09, 0x21, 0x20,
-  0x42, 0x43, 0x08, 0x61, 0x0c, 0x20,
-  0x98, 0x12, 0x82, 0x50, 0x4a, 0x00,
-  0x30, 0x84, 0xa8, 0x95, 0x12, 0xa0,
-  0x4c, 0x11, 0x92, 0x32, 0x46, 0x40,
-  0x51, 0x0c, 0xc9, 0x99, 0x33, 0x20,
-  0xa0, 0x66, 0x44, 0xc8, 0x99, 0x00,
-  0x04, 0xc1, 0x60, 0x2c, 0x05, 0x80,
-  0x03, 0xa0, 0x2c, 0x05, 0x80, 0xa0,
-  0x86, 0x21, 0x14, 0x22, 0x84, 0x40,
-  0x29, 0x10, 0x1a, 0x03, 0x40, 0x60,
-  0x42, 0x42, 0xa0, 0x54, 0x0a, 0x80,
-  0x98, 0x1a, 0x03, 0x40, 0x68, 0x00,
-  0x30, 0x84, 0x08, 0x81, 0x10, 0x20,
-  0xdf, 0x4c, 0x11, 0x82, 0x30, 0x40,
-  0x4c, 0x19, 0x12, 0x32, 0x46, 0x40,
-  0x51, 0x14, 0x51, 0x99, 0x33, 0x20,
-  0xa0, 0x6a, 0x44, 0xc8, 0x99, 0x00,
-  0x04, 0xc1, 0x30, 0x2c, 0x05, 0x80,
-  0x03, 0xb4, 0x04, 0x05, 0x80, 0xa0,
-  0x86, 0x20, 0x94, 0x22, 0x84, 0x40,
-  0x29, 0x08, 0x4a, 0x03, 0x40, 0x60,
-  0x42, 0x43, 0x08, 0x54, 0x0a, 0x80,
-  0x98, 0x12, 0x83, 0x40, 0x68, 0x00,
-  0x30, 0x84, 0xa8, 0x81, 0x10, 0x20,
-  0x4c, 0x11, 0x91, 0x82, 0x30, 0x40,
-  0x51, 0x0c, 0xcb, 0x22, 0x64, 0x40,
-  0xa0, 0x66, 0x42, 0x8a, 0x51, 0x40,
-  0x04, 0xc1, 0x65, 0x48, 0xa9, 0x00,
-  0x03, 0xa0, 0x28, 0x26, 0x04, 0xc0,
-  0x86, 0x21, 0x16, 0x80, 0xd0, 0x00,
-  0x29, 0x10, 0x1c, 0x12, 0x82, 0x40,
-  0x42, 0x42, 0xa1, 0x09, 0x21, 0x20,
-  0x98, 0x1a, 0x00, 0x61, 0x0c, 0x20,
-  0x30, 0x84, 0x0a, 0x50, 0x4a, 0x00,
-  0xdf, 0x4c, 0x10, 0x95, 0x12, 0xa0,
-  0x72, 0x06, 0x94, 0xf6, 0x74, 0x40
-};
-
-const uint8_t kMaskRandom43_5[30] = {
-  0xce, 0x31, 0xb6, 0x36, 0xc6, 0xc0,
-  0x63, 0x98, 0xdb, 0x1b, 0x63, 0x60,
-  0x98, 0xc7, 0x68, 0xed, 0x1d, 0xa0,
-  0x4d, 0x6b, 0x55, 0x6a, 0xad, 0x40,
-  0xb2, 0x6c, 0xad, 0x95, 0xb2, 0xa0
-};
-
-const uint8_t kMaskRandom43_6[36] = {
-  0x4c, 0x19, 0x13, 0x22, 0x64, 0x40,
-  0x51, 0x14, 0x52, 0x8a, 0x51, 0x40,
-  0x20, 0xea, 0x0d, 0x41, 0xa8, 0x20,
-  0x85, 0x41, 0x2e, 0x25, 0x04, 0xa0,
-  0x06, 0x80, 0xd8, 0x1b, 0x03, 0x60,
-  0x8a, 0x24, 0x34, 0x86, 0x90, 0xc0
-};
-
-const uint8_t kMaskRandom43_7[42] = {
-  0xc6, 0x11, 0x96, 0x32, 0x46, 0x40,
-  0x33, 0x04, 0xc8, 0x99, 0x33, 0x20,
-  0x18, 0x67, 0x44, 0x68, 0x9d, 0x00,
-  0x45, 0x42, 0xd4, 0x5a, 0x0b, 0x40,
-  0x12, 0xd4, 0x2a, 0x95, 0x50, 0xa0,
-  0xb4, 0x28, 0x35, 0x16, 0xa0, 0xc0,
-  0x29, 0x92, 0x1b, 0x0d, 0x41, 0x60
-};
-
-const uint8_t kMaskRandom43_8[48] = {
-  0x07, 0x0a, 0x71, 0x44, 0x29, 0xc0,
-  0x49, 0xa8, 0x29, 0x0f, 0xa0, 0x20,
-  0xb0, 0x7a, 0x07, 0x48, 0xe8, 0x00,
-  0x24, 0xc5, 0xc0, 0xb8, 0x17, 0x00,
-  0x52, 0x80, 0xec, 0x1d, 0x02, 0xa0,
-  0xc6, 0x31, 0x82, 0x30, 0xc7, 0x40,
-  0x31, 0x94, 0x1a, 0x83, 0x50, 0x60,
-  0x18, 0xc7, 0x08, 0xe1, 0x1c, 0x20
-};
-
-const uint8_t kMaskRandom43_9[54] = {
-  0x4e, 0x11, 0x12, 0x22, 0x46, 0x40,
-  0x62, 0x1a, 0x09, 0x41, 0x68, 0x60,
-  0x80, 0xe9, 0x41, 0x28, 0xa5, 0x00,
-  0xa1, 0x50, 0x52, 0xc8, 0x51, 0x00,
-  0x53, 0x00, 0x68, 0x1d, 0x01, 0xa0,
-  0xa4, 0x24, 0x36, 0x06, 0x80, 0xc0,
-  0x16, 0xa0, 0x8d, 0x11, 0x82, 0x20,
-  0x58, 0x45, 0x20, 0xa4, 0x16, 0x80,
-  0x29, 0x86, 0x84, 0xd0, 0x1c, 0x00
-};
-
-const uint8_t kMaskRandom44_1[6] = {
-  0xff, 0xff, 0xff, 0xff, 0xff, 0xf0
-};
-
-const uint8_t kMaskRandom44_10[60] = {
-  0xc0, 0x38, 0x8b, 0x00, 0xe2, 0x20,
-  0x30, 0x0e, 0x28, 0xc0, 0x38, 0xa0,
-  0xe8, 0x07, 0x03, 0xa0, 0x1c, 0x00,
-  0x85, 0x08, 0xaa, 0x14, 0x22, 0xa0,
-  0xd0, 0x92, 0x13, 0x42, 0x48, 0x40,
-  0x86, 0x50, 0x4a, 0x19, 0x41, 0x20,
-  0x4a, 0x68, 0x0d, 0x29, 0xa0, 0x30,
-  0x01, 0xa0, 0x74, 0x06, 0x81, 0xd0,
-  0x4c, 0x81, 0x91, 0x32, 0x06, 0x40,
-  0x62, 0x24, 0x05, 0x88, 0x90, 0x10
-};
-
-const uint8_t kMaskRandom44_11[66] = {
-  0x46, 0x48, 0xc9, 0x19, 0x23, 0x20,
-  0x33, 0x26, 0x64, 0xcc, 0x99, 0x90,
-  0x99, 0x13, 0x22, 0x64, 0x4c, 0x80,
-  0x05, 0x80, 0xb0, 0x16, 0x02, 0xc0,
-  0x80, 0xb0, 0x16, 0x02, 0xc0, 0x50,
-  0x84, 0x50, 0x8a, 0x11, 0x42, 0x20,
-  0x40, 0x68, 0x0d, 0x01, 0xa0, 0x30,
-  0x0a, 0x81, 0x50, 0x2a, 0x05, 0x40,
-  0x68, 0x0d, 0x01, 0xa0, 0x34, 0x00,
-  0x10, 0x22, 0x04, 0x40, 0x88, 0x10,
-  0x30, 0x46, 0x08, 0xc1, 0x18, 0x20
-};
-
-const uint8_t kMaskRandom44_12[72] = {
-  0x64, 0x4c, 0x89, 0x91, 0x32, 0x20,
-  0x51, 0x4a, 0x29, 0x45, 0x28, 0xa0,
-  0x0c, 0xa1, 0x94, 0x32, 0x86, 0x50,
-  0xa1, 0x34, 0x26, 0x84, 0xd0, 0x90,
-  0x12, 0xa2, 0x54, 0x4a, 0x89, 0x50,
-  0x8a, 0x51, 0x4a, 0x29, 0x45, 0x20,
-  0x86, 0x90, 0xd2, 0x1a, 0x43, 0x40,
-  0x23, 0x24, 0x64, 0x8c, 0x91, 0x90,
-  0x16, 0x22, 0xc4, 0x58, 0x8b, 0x10,
-  0x4c, 0x29, 0x85, 0x30, 0xa6, 0x10,
-  0x41, 0xc8, 0x39, 0x07, 0x20, 0xe0,
-  0xf4, 0x18, 0x9f, 0xd0, 0x62, 0x70
-};
-
-const uint8_t kMaskRandom44_13[78] = {
-  0x64, 0x4c, 0x89, 0x91, 0x32, 0x20,
-  0x51, 0x4a, 0x29, 0x45, 0x28, 0xa0,
-  0x0c, 0xa1, 0x94, 0x32, 0x86, 0x50,
-  0xa1, 0x34, 0x26, 0x84, 0xd0, 0x90,
-  0x12, 0xa2, 0x54, 0x4a, 0x89, 0x50,
-  0x8a, 0x51, 0x4a, 0x29, 0x45, 0x20,
-  0x46, 0x48, 0xc9, 0x19, 0x23, 0x20,
-  0x33, 0x26, 0x64, 0xcc, 0x99, 0x90,
-  0x91, 0x92, 0x32, 0x46, 0x48, 0xc0,
-  0xa4, 0x34, 0x86, 0x90, 0xd2, 0x10,
-  0x50, 0xaa, 0x15, 0x42, 0xa8, 0x50,
-  0x84, 0xd0, 0x9a, 0x13, 0x42, 0x60,
-  0x09, 0x61, 0x2c, 0x25, 0x84, 0xb0
-};
-
-const uint8_t kMaskRandom44_14[84] = {
-  0x46, 0x48, 0xc9, 0x19, 0x23, 0x20,
-  0x33, 0x26, 0x64, 0xcc, 0x99, 0x90,
-  0x91, 0x92, 0x32, 0x46, 0x48, 0xc0,
-  0xa4, 0x34, 0x86, 0x90, 0xd2, 0x10,
-  0x50, 0xaa, 0x15, 0x42, 0xa8, 0x50,
-  0x84, 0xd0, 0x9a, 0x13, 0x42, 0x60,
-  0x09, 0x61, 0x2c, 0x25, 0x84, 0xb0,
-  0x64, 0x4c, 0x89, 0x91, 0x32, 0x20,
-  0x51, 0x4a, 0x29, 0x45, 0x28, 0xa0,
-  0x0c, 0xa1, 0x94, 0x32, 0x86, 0x50,
-  0xa1, 0x34, 0x26, 0x84, 0xd0, 0x90,
-  0x12, 0xa2, 0x54, 0x4a, 0x89, 0x50,
-  0x8a, 0x51, 0x4a, 0x29, 0x45, 0x20,
-  0xc6, 0xca, 0xeb, 0x1b, 0x2b, 0xa0
-};
-
-const uint8_t kMaskRandom44_15[90] = {
-  0x46, 0x48, 0xc9, 0x19, 0x23, 0x20,
-  0x33, 0x26, 0x64, 0xcc, 0x99, 0x90,
-  0x91, 0x92, 0x32, 0x46, 0x48, 0xc0,
-  0xa4, 0x34, 0x86, 0x90, 0xd2, 0x10,
-  0x50, 0xaa, 0x15, 0x42, 0xa8, 0x50,
-  0x84, 0xd0, 0x9a, 0x13, 0x42, 0x60,
-  0x09, 0x61, 0x2c, 0x25, 0x84, 0xb0,
-  0x0c, 0x81, 0x90, 0x32, 0x06, 0x40,
-  0x80, 0x70, 0x0e, 0x01, 0xc0, 0x30,
-  0xa0, 0x94, 0x12, 0x82, 0x50, 0x40,
-  0x05, 0x40, 0xa8, 0x15, 0x02, 0xa0,
-  0x43, 0x08, 0x61, 0x0c, 0x21, 0x80,
-  0x1a, 0x03, 0x40, 0x68, 0x0d, 0x00,
-  0x60, 0x2c, 0x05, 0x80, 0xb0, 0x10,
-  0x14, 0x22, 0x84, 0x50, 0x8a, 0x10
-};
-
-const uint8_t kMaskRandom44_16[96] = {
-  0x0c, 0x81, 0x90, 0x32, 0x06, 0x40,
-  0x80, 0x70, 0x0e, 0x01, 0xc0, 0x30,
-  0xa0, 0x94, 0x12, 0x82, 0x50, 0x40,
-  0x05, 0x40, 0xa8, 0x15, 0x02, 0xa0,
-  0x43, 0x08, 0x61, 0x0c, 0x21, 0x80,
-  0x1a, 0x03, 0x40, 0x68, 0x0d, 0x00,
-  0x60, 0x2c, 0x05, 0x80, 0xb0, 0x10,
-  0x14, 0x22, 0x84, 0x50, 0x8a, 0x10,
-  0x46, 0x48, 0xc9, 0x19, 0x23, 0x20,
-  0x33, 0x26, 0x64, 0xcc, 0x99, 0x90,
-  0x91, 0x92, 0x32, 0x46, 0x48, 0xc0,
-  0xa4, 0x34, 0x86, 0x90, 0xd2, 0x10,
-  0x50, 0xaa, 0x15, 0x42, 0xa8, 0x50,
-  0x84, 0xd0, 0x9a, 0x13, 0x42, 0x60,
-  0x09, 0x61, 0x2c, 0x25, 0x84, 0xb0,
-  0x86, 0xc1, 0x46, 0x1b, 0x05, 0x10
-};
-
-const uint8_t kMaskRandom44_17[102] = {
-  0x0c, 0x81, 0x90, 0x32, 0x06, 0x40,
-  0x80, 0x70, 0x0e, 0x01, 0xc0, 0x30,
-  0xa0, 0x94, 0x12, 0x82, 0x50, 0x40,
-  0x05, 0x40, 0xa8, 0x15, 0x02, 0xa0,
-  0x43, 0x08, 0x61, 0x0c, 0x21, 0x80,
-  0x1a, 0x03, 0x40, 0x68, 0x0d, 0x00,
-  0x60, 0x2c, 0x05, 0x80, 0xb0, 0x10,
-  0x14, 0x22, 0x84, 0x50, 0x8a, 0x10,
-  0x46, 0x48, 0xc9, 0x19, 0x23, 0x20,
-  0x62, 0x6c, 0x4d, 0x89, 0xb1, 0x30,
-  0x8c, 0x11, 0x82, 0x30, 0x46, 0x00,
-  0x01, 0x60, 0x2c, 0x05, 0x80, 0xb0,
-  0x07, 0x80, 0xf0, 0x1e, 0x03, 0xc0,
-  0xa0, 0x94, 0x12, 0x82, 0x50, 0x40,
-  0x18, 0xa3, 0x14, 0x62, 0x8c, 0x50,
-  0x91, 0x12, 0x22, 0x44, 0x48, 0x80,
-  0x78, 0x0f, 0x01, 0xe0, 0x3c, 0x00
-};
-
-const uint8_t kMaskRandom44_18[108] = {
-  0x46, 0x48, 0xc9, 0x19, 0x23, 0x20,
-  0x62, 0x6c, 0x4d, 0x89, 0xb1, 0x30,
-  0x8c, 0x11, 0x82, 0x30, 0x46, 0x00,
-  0x01, 0x60, 0x2c, 0x05, 0x80, 0xb0,
-  0x07, 0x80, 0xf0, 0x1e, 0x03, 0xc0,
-  0xa0, 0x94, 0x12, 0x82, 0x50, 0x40,
-  0x18, 0xa3, 0x14, 0x62, 0x8c, 0x50,
-  0x91, 0x12, 0x22, 0x44, 0x48, 0x80,
-  0x78, 0x0f, 0x01, 0xe0, 0x3c, 0x00,
-  0x0c, 0x81, 0x90, 0x32, 0x06, 0x40,
-  0x80, 0x70, 0x0e, 0x01, 0xc0, 0x30,
-  0xa0, 0x94, 0x12, 0x82, 0x50, 0x40,
-  0x05, 0x40, 0xa8, 0x15, 0x02, 0xa0,
-  0x43, 0x08, 0x61, 0x0c, 0x21, 0x80,
-  0x1a, 0x03, 0x40, 0x68, 0x0d, 0x00,
-  0x60, 0x2c, 0x05, 0x80, 0xb0, 0x10,
-  0x14, 0x22, 0x84, 0x50, 0x8a, 0x10,
-  0xe4, 0xd4, 0x6f, 0x93, 0x51, 0xb0
-};
-
-const uint8_t kMaskRandom44_19[114] = {
-  0x46, 0x48, 0xc9, 0x19, 0x23, 0x20,
-  0x62, 0x6c, 0x4d, 0x89, 0xb1, 0x30,
-  0x8c, 0x11, 0x82, 0x30, 0x46, 0x00,
-  0x01, 0x60, 0x2c, 0x05, 0x80, 0xb0,
-  0x07, 0x80, 0xf0, 0x1e, 0x03, 0xc0,
-  0xa0, 0x94, 0x12, 0x82, 0x50, 0x40,
-  0x18, 0xa3, 0x14, 0x62, 0x8c, 0x50,
-  0x91, 0x12, 0x22, 0x44, 0x48, 0x80,
-  0x78, 0x0f, 0x01, 0xe0, 0x3c, 0x00,
-  0x64, 0x4c, 0x89, 0x91, 0x32, 0x20,
-  0x51, 0x4a, 0x29, 0x45, 0x28, 0xa0,
-  0xa9, 0x15, 0x22, 0xa4, 0x54, 0x80,
-  0x04, 0xc0, 0x98, 0x13, 0x02, 0x60,
-  0xd0, 0x1a, 0x03, 0x40, 0x68, 0x00,
-  0x82, 0x50, 0x4a, 0x09, 0x41, 0x20,
-  0x21, 0x24, 0x24, 0x84, 0x90, 0x90,
-  0x0c, 0x21, 0x84, 0x30, 0x86, 0x10,
-  0x4a, 0x09, 0x41, 0x28, 0x25, 0x00,
-  0x12, 0xa2, 0x54, 0x4a, 0x89, 0x50
-};
-
-const uint8_t kMaskRandom44_2[12] = {
-  0xec, 0xdd, 0x9b, 0xb3, 0x76, 0x60,
-  0x9b, 0xb3, 0x76, 0x6e, 0xcd, 0xd0
-};
-
-const uint8_t kMaskRandom44_20[120] = {
-  0x64, 0x4c, 0x89, 0x91, 0x32, 0x20,
-  0x51, 0x4a, 0x29, 0x45, 0x28, 0xa0,
-  0xa9, 0x15, 0x22, 0xa4, 0x54, 0x80,
-  0x04, 0xc0, 0x98, 0x13, 0x02, 0x60,
-  0xd0, 0x1a, 0x03, 0x40, 0x68, 0x00,
-  0x82, 0x50, 0x4a, 0x09, 0x41, 0x20,
-  0x21, 0x24, 0x24, 0x84, 0x90, 0x90,
-  0x0c, 0x21, 0x84, 0x30, 0x86, 0x10,
-  0x4a, 0x09, 0x41, 0x28, 0x25, 0x00,
-  0x12, 0xa2, 0x54, 0x4a, 0x89, 0x50,
-  0x46, 0x48, 0xc9, 0x19, 0x23, 0x20,
-  0x62, 0x6c, 0x4d, 0x89, 0xb1, 0x30,
-  0x8c, 0x11, 0x82, 0x30, 0x46, 0x00,
-  0x01, 0x60, 0x2c, 0x05, 0x80, 0xb0,
-  0x07, 0x80, 0xf0, 0x1e, 0x03, 0xc0,
-  0xa0, 0x94, 0x12, 0x82, 0x50, 0x40,
-  0x18, 0xa3, 0x14, 0x62, 0x8c, 0x50,
-  0x91, 0x12, 0x22, 0x44, 0x48, 0x80,
-  0x78, 0x0f, 0x01, 0xe0, 0x3c, 0x00,
-  0x3b, 0x48, 0xc4, 0xed, 0x23, 0x10
-};
-
-const uint8_t kMaskRandom44_21[126] = {
-  0x64, 0x4c, 0x89, 0x91, 0x32, 0x20,
-  0x51, 0x4a, 0x29, 0x45, 0x28, 0xa0,
-  0xa9, 0x15, 0x22, 0xa4, 0x54, 0x80,
-  0x04, 0xc0, 0x98, 0x13, 0x02, 0x60,
-  0xd0, 0x1a, 0x03, 0x40, 0x68, 0x00,
-  0x82, 0x50, 0x4a, 0x09, 0x41, 0x20,
-  0x21, 0x24, 0x24, 0x84, 0x90, 0x90,
-  0x0c, 0x21, 0x84, 0x30, 0x86, 0x10,
-  0x4a, 0x09, 0x41, 0x28, 0x25, 0x00,
-  0x12, 0xa2, 0x54, 0x4a, 0x89, 0x50,
-  0x46, 0x48, 0xc9, 0x19, 0x23, 0x20,
-  0x33, 0x26, 0x64, 0xcc, 0x99, 0x90,
-  0x99, 0x13, 0x22, 0x64, 0x4c, 0x80,
-  0x05, 0x80, 0xb0, 0x16, 0x02, 0xc0,
-  0x80, 0xb0, 0x16, 0x02, 0xc0, 0x50,
-  0x84, 0x50, 0x8a, 0x11, 0x42, 0x20,
-  0x40, 0x68, 0x0d, 0x01, 0xa0, 0x30,
-  0x0a, 0x81, 0x50, 0x2a, 0x05, 0x40,
-  0x68, 0x0d, 0x01, 0xa0, 0x34, 0x00,
-  0x10, 0x22, 0x04, 0x40, 0x88, 0x10,
-  0x30, 0x46, 0x08, 0xc1, 0x18, 0x20
-};
-
-const uint8_t kMaskRandom44_22[132] = {
-  0x46, 0x48, 0xc9, 0x19, 0x23, 0x20,
-  0x33, 0x26, 0x64, 0xcc, 0x99, 0x90,
-  0x99, 0x13, 0x22, 0x64, 0x4c, 0x80,
-  0x05, 0x80, 0xb0, 0x16, 0x02, 0xc0,
-  0x80, 0xb0, 0x16, 0x02, 0xc0, 0x50,
-  0x84, 0x50, 0x8a, 0x11, 0x42, 0x20,
-  0x40, 0x68, 0x0d, 0x01, 0xa0, 0x30,
-  0x0a, 0x81, 0x50, 0x2a, 0x05, 0x40,
-  0x68, 0x0d, 0x01, 0xa0, 0x34, 0x00,
-  0x10, 0x22, 0x04, 0x40, 0x88, 0x10,
-  0x30, 0x46, 0x08, 0xc1, 0x18, 0x20,
-  0x64, 0x4c, 0x89, 0x91, 0x32, 0x20,
-  0x51, 0x4a, 0x29, 0x45, 0x28, 0xa0,
-  0xa9, 0x15, 0x22, 0xa4, 0x54, 0x80,
-  0x04, 0xc0, 0x98, 0x13, 0x02, 0x60,
-  0xd0, 0x1a, 0x03, 0x40, 0x68, 0x00,
-  0x82, 0x50, 0x4a, 0x09, 0x41, 0x20,
-  0x21, 0x24, 0x24, 0x84, 0x90, 0x90,
-  0x0c, 0x21, 0x84, 0x30, 0x86, 0x10,
-  0x4a, 0x09, 0x41, 0x28, 0x25, 0x00,
-  0x12, 0xa2, 0x54, 0x4a, 0x89, 0x50,
-  0x9e, 0xce, 0x8a, 0x7b, 0x3a, 0x20
-};
-
-const uint8_t kMaskRandom44_23[138] = {
-  0x46, 0x48, 0xc9, 0x19, 0x23, 0x20,
-  0x33, 0x26, 0x64, 0xcc, 0x99, 0x90,
-  0x99, 0x13, 0x22, 0x64, 0x4c, 0x80,
-  0x05, 0x80, 0xb0, 0x16, 0x02, 0xc0,
-  0x80, 0xb0, 0x16, 0x02, 0xc0, 0x50,
-  0x84, 0x50, 0x8a, 0x11, 0x42, 0x20,
-  0x40, 0x68, 0x0d, 0x01, 0xa0, 0x30,
-  0x0a, 0x81, 0x50, 0x2a, 0x05, 0x40,
-  0x68, 0x0d, 0x01, 0xa0, 0x34, 0x00,
-  0x10, 0x22, 0x04, 0x40, 0x88, 0x10,
-  0x30, 0x46, 0x08, 0xc1, 0x18, 0x20,
-  0x64, 0x4c, 0x89, 0x91, 0x32, 0x20,
-  0x51, 0x4a, 0x29, 0x45, 0x28, 0xa0,
-  0x0c, 0xa1, 0x94, 0x32, 0x86, 0x50,
-  0xa1, 0x34, 0x26, 0x84, 0xd0, 0x90,
-  0x12, 0xa2, 0x54, 0x4a, 0x89, 0x50,
-  0x8a, 0x51, 0x4a, 0x29, 0x45, 0x20,
-  0x86, 0x90, 0xd2, 0x1a, 0x43, 0x40,
-  0x23, 0x24, 0x64, 0x8c, 0x91, 0x90,
-  0x16, 0x22, 0xc4, 0x58, 0x8b, 0x10,
-  0x4c, 0x29, 0x85, 0x30, 0xa6, 0x10,
-  0x41, 0xc8, 0x39, 0x07, 0x20, 0xe0,
-  0xf4, 0x18, 0x9f, 0xd0, 0x62, 0x70
-};
-
-const uint8_t kMaskRandom44_24[144] = {
-  0x64, 0x4c, 0x89, 0x91, 0x32, 0x20,
-  0x51, 0x4a, 0x29, 0x45, 0x28, 0xa0,
-  0x0c, 0xa1, 0x94, 0x32, 0x86, 0x50,
-  0xa1, 0x34, 0x26, 0x84, 0xd0, 0x90,
-  0x12, 0xa2, 0x54, 0x4a, 0x89, 0x50,
-  0x8a, 0x51, 0x4a, 0x29, 0x45, 0x20,
-  0x86, 0x90, 0xd2, 0x1a, 0x43, 0x40,
-  0x23, 0x24, 0x64, 0x8c, 0x91, 0x90,
-  0x16, 0x22, 0xc4, 0x58, 0x8b, 0x10,
-  0x4c, 0x29, 0x85, 0x30, 0xa6, 0x10,
-  0x41, 0xc8, 0x39, 0x07, 0x20, 0xe0,
-  0xf4, 0x18, 0x9f, 0xd0, 0x62, 0x70,
-  0x46, 0x48, 0xc9, 0x19, 0x23, 0x20,
-  0x33, 0x26, 0x64, 0xcc, 0x99, 0x90,
-  0x99, 0x13, 0x22, 0x64, 0x4c, 0x80,
-  0x05, 0x80, 0xb0, 0x16, 0x02, 0xc0,
-  0x80, 0xb0, 0x16, 0x02, 0xc0, 0x50,
-  0x84, 0x50, 0x8a, 0x11, 0x42, 0x20,
-  0x40, 0x68, 0x0d, 0x01, 0xa0, 0x30,
-  0x0a, 0x81, 0x50, 0x2a, 0x05, 0x40,
-  0x68, 0x0d, 0x01, 0xa0, 0x34, 0x00,
-  0x10, 0x22, 0x04, 0x40, 0x88, 0x10,
-  0x30, 0x46, 0x08, 0xc1, 0x18, 0x20,
-  0x15, 0x0f, 0x44, 0x6d, 0x9d, 0xa0
-};
-
-const uint8_t kMaskRandom44_25[150] = {
-  0x64, 0x4c, 0x89, 0x91, 0x32, 0x20,
-  0x51, 0x4a, 0x29, 0x45, 0x28, 0xa0,
-  0x0c, 0xa1, 0x94, 0x32, 0x86, 0x50,
-  0xa1, 0x34, 0x26, 0x84, 0xd0, 0x90,
-  0x12, 0xa2, 0x54, 0x4a, 0x89, 0x50,
-  0x8a, 0x51, 0x4a, 0x29, 0x45, 0x20,
-  0x86, 0x90, 0xd2, 0x1a, 0x43, 0x40,
-  0x23, 0x24, 0x64, 0x8c, 0x91, 0x90,
-  0x16, 0x22, 0xc4, 0x58, 0x8b, 0x10,
-  0x4c, 0x29, 0x85, 0x30, 0xa6, 0x10,
-  0x41, 0xc8, 0x39, 0x07, 0x20, 0xe0,
-  0xf4, 0x18, 0x9f, 0xd0, 0x62, 0x70,
-  0x64, 0x4c, 0x89, 0x91, 0x32, 0x20,
-  0x51, 0x4a, 0x29, 0x45, 0x28, 0xa0,
-  0x0c, 0xa1, 0x94, 0x32, 0x86, 0x50,
-  0xa1, 0x34, 0x26, 0x84, 0xd0, 0x90,
-  0x12, 0xa2, 0x54, 0x4a, 0x89, 0x50,
-  0x8a, 0x51, 0x4a, 0x29, 0x45, 0x20,
-  0x46, 0x48, 0xc9, 0x19, 0x23, 0x20,
-  0x33, 0x26, 0x64, 0xcc, 0x99, 0x90,
-  0x91, 0x92, 0x32, 0x46, 0x48, 0xc0,
-  0xa4, 0x34, 0x86, 0x90, 0xd2, 0x10,
-  0x50, 0xaa, 0x15, 0x42, 0xa8, 0x50,
-  0x84, 0xd0, 0x9a, 0x13, 0x42, 0x60,
-  0x09, 0x61, 0x2c, 0x25, 0x84, 0xb0
-};
-
-const uint8_t kMaskRandom44_26[156] = {
-  0x64, 0x4c, 0x89, 0x91, 0x32, 0x20,
-  0x51, 0x4a, 0x29, 0x45, 0x28, 0xa0,
-  0x0c, 0xa1, 0x94, 0x32, 0x86, 0x50,
-  0xa1, 0x34, 0x26, 0x84, 0xd0, 0x90,
-  0x12, 0xa2, 0x54, 0x4a, 0x89, 0x50,
-  0x8a, 0x51, 0x4a, 0x29, 0x45, 0x20,
-  0x46, 0x48, 0xc9, 0x19, 0x23, 0x20,
-  0x33, 0x26, 0x64, 0xcc, 0x99, 0x90,
-  0x91, 0x92, 0x32, 0x46, 0x48, 0xc0,
-  0xa4, 0x34, 0x86, 0x90, 0xd2, 0x10,
-  0x50, 0xaa, 0x15, 0x42, 0xa8, 0x50,
-  0x84, 0xd0, 0x9a, 0x13, 0x42, 0x60,
-  0x09, 0x61, 0x2c, 0x25, 0x84, 0xb0,
-  0x64, 0x4c, 0x89, 0x91, 0x32, 0x20,
-  0x51, 0x4a, 0x29, 0x45, 0x28, 0xa0,
-  0x0c, 0xa1, 0x94, 0x32, 0x86, 0x50,
-  0xa1, 0x34, 0x26, 0x84, 0xd0, 0x90,
-  0x12, 0xa2, 0x54, 0x4a, 0x89, 0x50,
-  0x8a, 0x51, 0x4a, 0x29, 0x45, 0x20,
-  0x86, 0x90, 0xd2, 0x1a, 0x43, 0x40,
-  0x23, 0x24, 0x64, 0x8c, 0x91, 0x90,
-  0x16, 0x22, 0xc4, 0x58, 0x8b, 0x10,
-  0x4c, 0x29, 0x85, 0x30, 0xa6, 0x10,
-  0x41, 0xc8, 0x39, 0x07, 0x20, 0xe0,
-  0xf4, 0x18, 0x9f, 0xd0, 0x62, 0x70,
-  0x02, 0xcb, 0x64, 0xb8, 0x55, 0x80
-};
-
-const uint8_t kMaskRandom44_27[162] = {
-  0x64, 0x4c, 0x89, 0x91, 0x32, 0x20,
-  0x51, 0x4a, 0x29, 0x45, 0x28, 0xa0,
-  0x0c, 0xa1, 0x94, 0x32, 0x86, 0x50,
-  0xa1, 0x34, 0x26, 0x84, 0xd0, 0x90,
-  0x12, 0xa2, 0x54, 0x4a, 0x89, 0x50,
-  0x8a, 0x51, 0x4a, 0x29, 0x45, 0x20,
-  0x46, 0x48, 0xc9, 0x19, 0x23, 0x20,
-  0x33, 0x26, 0x64, 0xcc, 0x99, 0x90,
-  0x91, 0x92, 0x32, 0x46, 0x48, 0xc0,
-  0xa4, 0x34, 0x86, 0x90, 0xd2, 0x10,
-  0x50, 0xaa, 0x15, 0x42, 0xa8, 0x50,
-  0x84, 0xd0, 0x9a, 0x13, 0x42, 0x60,
-  0x09, 0x61, 0x2c, 0x25, 0x84, 0xb0,
-  0x46, 0x48, 0xc9, 0x19, 0x23, 0x20,
-  0x33, 0x26, 0x64, 0xcc, 0x99, 0x90,
-  0x91, 0x92, 0x32, 0x46, 0x48, 0xc0,
-  0xa4, 0x34, 0x86, 0x90, 0xd2, 0x10,
-  0x50, 0xaa, 0x15, 0x42, 0xa8, 0x50,
-  0x84, 0xd0, 0x9a, 0x13, 0x42, 0x60,
-  0x09, 0x61, 0x2c, 0x25, 0x84, 0xb0,
-  0x64, 0x4c, 0x89, 0x91, 0x32, 0x20,
-  0x51, 0x4a, 0x29, 0x45, 0x28, 0xa0,
-  0x0c, 0xa1, 0x94, 0x32, 0x86, 0x50,
-  0xa1, 0x34, 0x26, 0x84, 0xd0, 0x90,
-  0x12, 0xa2, 0x54, 0x4a, 0x89, 0x50,
-  0x8a, 0x51, 0x4a, 0x29, 0x45, 0x20,
-  0xc6, 0xca, 0xeb, 0x1b, 0x2b, 0xa0
-};
-
-const uint8_t kMaskRandom44_28[168] = {
-  0x46, 0x48, 0xc9, 0x19, 0x23, 0x20,
-  0x33, 0x26, 0x64, 0xcc, 0x99, 0x90,
-  0x91, 0x92, 0x32, 0x46, 0x48, 0xc0,
-  0xa4, 0x34, 0x86, 0x90, 0xd2, 0x10,
-  0x50, 0xaa, 0x15, 0x42, 0xa8, 0x50,
-  0x84, 0xd0, 0x9a, 0x13, 0x42, 0x60,
-  0x09, 0x61, 0x2c, 0x25, 0x84, 0xb0,
-  0x64, 0x4c, 0x89, 0x91, 0x32, 0x20,
-  0x51, 0x4a, 0x29, 0x45, 0x28, 0xa0,
-  0x0c, 0xa1, 0x94, 0x32, 0x86, 0x50,
-  0xa1, 0x34, 0x26, 0x84, 0xd0, 0x90,
-  0x12, 0xa2, 0x54, 0x4a, 0x89, 0x50,
-  0x8a, 0x51, 0x4a, 0x29, 0x45, 0x20,
-  0xc6, 0xca, 0xeb, 0x1b, 0x2b, 0xa0,
-  0x64, 0x4c, 0x89, 0x91, 0x32, 0x20,
-  0x51, 0x4a, 0x29, 0x45, 0x28, 0xa0,
-  0x0c, 0xa1, 0x94, 0x32, 0x86, 0x50,
-  0xa1, 0x34, 0x26, 0x84, 0xd0, 0x90,
-  0x12, 0xa2, 0x54, 0x4a, 0x89, 0x50,
-  0x8a, 0x51, 0x4a, 0x29, 0x45, 0x20,
-  0x46, 0x48, 0xc9, 0x19, 0x23, 0x20,
-  0x33, 0x26, 0x64, 0xcc, 0x99, 0x90,
-  0x91, 0x92, 0x32, 0x46, 0x48, 0xc0,
-  0xa4, 0x34, 0x86, 0x90, 0xd2, 0x10,
-  0x50, 0xaa, 0x15, 0x42, 0xa8, 0x50,
-  0x84, 0xd0, 0x9a, 0x13, 0x42, 0x60,
-  0x09, 0x61, 0x2c, 0x25, 0x84, 0xb0,
-  0x66, 0x26, 0x6c, 0x91, 0xc7, 0x20
-};
-
-const uint8_t kMaskRandom44_29[174] = {
-  0x46, 0x48, 0xc9, 0x19, 0x23, 0x20,
-  0x33, 0x26, 0x64, 0xcc, 0x99, 0x90,
-  0x91, 0x92, 0x32, 0x46, 0x48, 0xc0,
-  0xa4, 0x34, 0x86, 0x90, 0xd2, 0x10,
-  0x50, 0xaa, 0x15, 0x42, 0xa8, 0x50,
-  0x84, 0xd0, 0x9a, 0x13, 0x42, 0x60,
-  0x09, 0x61, 0x2c, 0x25, 0x84, 0xb0,
-  0x64, 0x4c, 0x89, 0x91, 0x32, 0x20,
-  0x51, 0x4a, 0x29, 0x45, 0x28, 0xa0,
-  0x0c, 0xa1, 0x94, 0x32, 0x86, 0x50,
-  0xa1, 0x34, 0x26, 0x84, 0xd0, 0x90,
-  0x12, 0xa2, 0x54, 0x4a, 0x89, 0x50,
-  0x8a, 0x51, 0x4a, 0x29, 0x45, 0x20,
-  0xc6, 0xca, 0xeb, 0x1b, 0x2b, 0xa0,
-  0x46, 0x48, 0xc9, 0x19, 0x23, 0x20,
-  0x33, 0x26, 0x64, 0xcc, 0x99, 0x90,
-  0x91, 0x92, 0x32, 0x46, 0x48, 0xc0,
-  0xa4, 0x34, 0x86, 0x90, 0xd2, 0x10,
-  0x50, 0xaa, 0x15, 0x42, 0xa8, 0x50,
-  0x84, 0xd0, 0x9a, 0x13, 0x42, 0x60,
-  0x09, 0x61, 0x2c, 0x25, 0x84, 0xb0,
-  0x0c, 0x81, 0x90, 0x32, 0x06, 0x40,
-  0x80, 0x70, 0x0e, 0x01, 0xc0, 0x30,
-  0xa0, 0x94, 0x12, 0x82, 0x50, 0x40,
-  0x05, 0x40, 0xa8, 0x15, 0x02, 0xa0,
-  0x43, 0x08, 0x61, 0x0c, 0x21, 0x80,
-  0x1a, 0x03, 0x40, 0x68, 0x0d, 0x00,
-  0x60, 0x2c, 0x05, 0x80, 0xb0, 0x10,
-  0x14, 0x22, 0x84, 0x50, 0x8a, 0x10
-};
-
-const uint8_t kMaskRandom44_3[18] = {
-  0xca, 0xd9, 0x5b, 0x2b, 0x65, 0x60,
-  0xf1, 0x5e, 0x2b, 0xc5, 0x78, 0xa0,
-  0xb6, 0x35, 0xc6, 0xd8, 0xd7, 0x10
-};
-
-const uint8_t kMaskRandom44_30[180] = {
-  0x46, 0x48, 0xc9, 0x19, 0x23, 0x20,
-  0x33, 0x26, 0x64, 0xcc, 0x99, 0x90,
-  0x91, 0x92, 0x32, 0x46, 0x48, 0xc0,
-  0xa4, 0x34, 0x86, 0x90, 0xd2, 0x10,
-  0x50, 0xaa, 0x15, 0x42, 0xa8, 0x50,
-  0x84, 0xd0, 0x9a, 0x13, 0x42, 0x60,
-  0x09, 0x61, 0x2c, 0x25, 0x84, 0xb0,
-  0x0c, 0x81, 0x90, 0x32, 0x06, 0x40,
-  0x80, 0x70, 0x0e, 0x01, 0xc0, 0x30,
-  0xa0, 0x94, 0x12, 0x82, 0x50, 0x40,
-  0x05, 0x40, 0xa8, 0x15, 0x02, 0xa0,
-  0x43, 0x08, 0x61, 0x0c, 0x21, 0x80,
-  0x1a, 0x03, 0x40, 0x68, 0x0d, 0x00,
-  0x60, 0x2c, 0x05, 0x80, 0xb0, 0x10,
-  0x14, 0x22, 0x84, 0x50, 0x8a, 0x10,
-  0x46, 0x48, 0xc9, 0x19, 0x23, 0x20,
-  0x33, 0x26, 0x64, 0xcc, 0x99, 0x90,
-  0x91, 0x92, 0x32, 0x46, 0x48, 0xc0,
-  0xa4, 0x34, 0x86, 0x90, 0xd2, 0x10,
-  0x50, 0xaa, 0x15, 0x42, 0xa8, 0x50,
-  0x84, 0xd0, 0x9a, 0x13, 0x42, 0x60,
-  0x09, 0x61, 0x2c, 0x25, 0x84, 0xb0,
-  0x64, 0x4c, 0x89, 0x91, 0x32, 0x20,
-  0x51, 0x4a, 0x29, 0x45, 0x28, 0xa0,
-  0x0c, 0xa1, 0x94, 0x32, 0x86, 0x50,
-  0xa1, 0x34, 0x26, 0x84, 0xd0, 0x90,
-  0x12, 0xa2, 0x54, 0x4a, 0x89, 0x50,
-  0x8a, 0x51, 0x4a, 0x29, 0x45, 0x20,
-  0xc6, 0xca, 0xeb, 0x1b, 0x2b, 0xa0,
-  0x60, 0xf4, 0x75, 0x84, 0x90, 0xc0
-};
-
-const uint8_t kMaskRandom44_31[186] = {
-  0x46, 0x48, 0xc9, 0x19, 0x23, 0x20,
-  0x33, 0x26, 0x64, 0xcc, 0x99, 0x90,
-  0x91, 0x92, 0x32, 0x46, 0x48, 0xc0,
-  0xa4, 0x34, 0x86, 0x90, 0xd2, 0x10,
-  0x50, 0xaa, 0x15, 0x42, 0xa8, 0x50,
-  0x84, 0xd0, 0x9a, 0x13, 0x42, 0x60,
-  0x09, 0x61, 0x2c, 0x25, 0x84, 0xb0,
-  0x0c, 0x81, 0x90, 0x32, 0x06, 0x40,
-  0x80, 0x70, 0x0e, 0x01, 0xc0, 0x30,
-  0xa0, 0x94, 0x12, 0x82, 0x50, 0x40,
-  0x05, 0x40, 0xa8, 0x15, 0x02, 0xa0,
-  0x43, 0x08, 0x61, 0x0c, 0x21, 0x80,
-  0x1a, 0x03, 0x40, 0x68, 0x0d, 0x00,
-  0x60, 0x2c, 0x05, 0x80, 0xb0, 0x10,
-  0x14, 0x22, 0x84, 0x50, 0x8a, 0x10,
-  0x0c, 0x81, 0x90, 0x32, 0x06, 0x40,
-  0x80, 0x70, 0x0e, 0x01, 0xc0, 0x30,
-  0xa0, 0x94, 0x12, 0x82, 0x50, 0x40,
-  0x05, 0x40, 0xa8, 0x15, 0x02, 0xa0,
-  0x43, 0x08, 0x61, 0x0c, 0x21, 0x80,
-  0x1a, 0x03, 0x40, 0x68, 0x0d, 0x00,
-  0x60, 0x2c, 0x05, 0x80, 0xb0, 0x10,
-  0x14, 0x22, 0x84, 0x50, 0x8a, 0x10,
-  0x46, 0x48, 0xc9, 0x19, 0x23, 0x20,
-  0x33, 0x26, 0x64, 0xcc, 0x99, 0x90,
-  0x91, 0x92, 0x32, 0x46, 0x48, 0xc0,
-  0xa4, 0x34, 0x86, 0x90, 0xd2, 0x10,
-  0x50, 0xaa, 0x15, 0x42, 0xa8, 0x50,
-  0x84, 0xd0, 0x9a, 0x13, 0x42, 0x60,
-  0x09, 0x61, 0x2c, 0x25, 0x84, 0xb0,
-  0x86, 0xc1, 0x46, 0x1b, 0x05, 0x10
-};
-
-const uint8_t kMaskRandom44_32[192] = {
-  0x0c, 0x81, 0x90, 0x32, 0x06, 0x40,
-  0x80, 0x70, 0x0e, 0x01, 0xc0, 0x30,
-  0xa0, 0x94, 0x12, 0x82, 0x50, 0x40,
-  0x05, 0x40, 0xa8, 0x15, 0x02, 0xa0,
-  0x43, 0x08, 0x61, 0x0c, 0x21, 0x80,
-  0x1a, 0x03, 0x40, 0x68, 0x0d, 0x00,
-  0x60, 0x2c, 0x05, 0x80, 0xb0, 0x10,
-  0x14, 0x22, 0x84, 0x50, 0x8a, 0x10,
-  0x46, 0x48, 0xc9, 0x19, 0x23, 0x20,
-  0x33, 0x26, 0x64, 0xcc, 0x99, 0x90,
-  0x91, 0x92, 0x32, 0x46, 0x48, 0xc0,
-  0xa4, 0x34, 0x86, 0x90, 0xd2, 0x10,
-  0x50, 0xaa, 0x15, 0x42, 0xa8, 0x50,
-  0x84, 0xd0, 0x9a, 0x13, 0x42, 0x60,
-  0x09, 0x61, 0x2c, 0x25, 0x84, 0xb0,
-  0x86, 0xc1, 0x46, 0x1b, 0x05, 0x10,
-  0x46, 0x48, 0xc9, 0x19, 0x23, 0x20,
-  0x33, 0x26, 0x64, 0xcc, 0x99, 0x90,
-  0x91, 0x92, 0x32, 0x46, 0x48, 0xc0,
-  0xa4, 0x34, 0x86, 0x90, 0xd2, 0x10,
-  0x50, 0xaa, 0x15, 0x42, 0xa8, 0x50,
-  0x84, 0xd0, 0x9a, 0x13, 0x42, 0x60,
-  0x09, 0x61, 0x2c, 0x25, 0x84, 0xb0,
-  0x0c, 0x81, 0x90, 0x32, 0x06, 0x40,
-  0x80, 0x70, 0x0e, 0x01, 0xc0, 0x30,
-  0xa0, 0x94, 0x12, 0x82, 0x50, 0x40,
-  0x05, 0x40, 0xa8, 0x15, 0x02, 0xa0,
-  0x43, 0x08, 0x61, 0x0c, 0x21, 0x80,
-  0x1a, 0x03, 0x40, 0x68, 0x0d, 0x00,
-  0x60, 0x2c, 0x05, 0x80, 0xb0, 0x10,
-  0x14, 0x22, 0x84, 0x50, 0x8a, 0x10,
-  0x3e, 0x39, 0x86, 0x5c, 0xd9, 0xd0
-};
-
-const uint8_t kMaskRandom44_33[198] = {
-  0x0c, 0x81, 0x90, 0x32, 0x06, 0x40,
-  0x80, 0x70, 0x0e, 0x01, 0xc0, 0x30,
-  0xa0, 0x94, 0x12, 0x82, 0x50, 0x40,
-  0x05, 0x40, 0xa8, 0x15, 0x02, 0xa0,
-  0x43, 0x08, 0x61, 0x0c, 0x21, 0x80,
-  0x1a, 0x03, 0x40, 0x68, 0x0d, 0x00,
-  0x60, 0x2c, 0x05, 0x80, 0xb0, 0x10,
-  0x14, 0x22, 0x84, 0x50, 0x8a, 0x10,
-  0x46, 0x48, 0xc9, 0x19, 0x23, 0x20,
-  0x33, 0x26, 0x64, 0xcc, 0x99, 0x90,
-  0x91, 0x92, 0x32, 0x46, 0x48, 0xc0,
-  0xa4, 0x34, 0x86, 0x90, 0xd2, 0x10,
-  0x50, 0xaa, 0x15, 0x42, 0xa8, 0x50,
-  0x84, 0xd0, 0x9a, 0x13, 0x42, 0x60,
-  0x09, 0x61, 0x2c, 0x25, 0x84, 0xb0,
-  0x86, 0xc1, 0x46, 0x1b, 0x05, 0x10,
-  0x0c, 0x81, 0x90, 0x32, 0x06, 0x40,
-  0x80, 0x70, 0x0e, 0x01, 0xc0, 0x30,
-  0xa0, 0x94, 0x12, 0x82, 0x50, 0x40,
-  0x05, 0x40, 0xa8, 0x15, 0x02, 0xa0,
-  0x43, 0x08, 0x61, 0x0c, 0x21, 0x80,
-  0x1a, 0x03, 0x40, 0x68, 0x0d, 0x00,
-  0x60, 0x2c, 0x05, 0x80, 0xb0, 0x10,
-  0x14, 0x22, 0x84, 0x50, 0x8a, 0x10,
-  0x46, 0x48, 0xc9, 0x19, 0x23, 0x20,
-  0x62, 0x6c, 0x4d, 0x89, 0xb1, 0x30,
-  0x8c, 0x11, 0x82, 0x30, 0x46, 0x00,
-  0x01, 0x60, 0x2c, 0x05, 0x80, 0xb0,
-  0x07, 0x80, 0xf0, 0x1e, 0x03, 0xc0,
-  0xa0, 0x94, 0x12, 0x82, 0x50, 0x40,
-  0x18, 0xa3, 0x14, 0x62, 0x8c, 0x50,
-  0x91, 0x12, 0x22, 0x44, 0x48, 0x80,
-  0x78, 0x0f, 0x01, 0xe0, 0x3c, 0x00
-};
-
-const uint8_t kMaskRandom44_34[204] = {
-  0x0c, 0x81, 0x90, 0x32, 0x06, 0x40,
-  0x80, 0x70, 0x0e, 0x01, 0xc0, 0x30,
-  0xa0, 0x94, 0x12, 0x82, 0x50, 0x40,
-  0x05, 0x40, 0xa8, 0x15, 0x02, 0xa0,
-  0x43, 0x08, 0x61, 0x0c, 0x21, 0x80,
-  0x1a, 0x03, 0x40, 0x68, 0x0d, 0x00,
-  0x60, 0x2c, 0x05, 0x80, 0xb0, 0x10,
-  0x14, 0x22, 0x84, 0x50, 0x8a, 0x10,
-  0x46, 0x48, 0xc9, 0x19, 0x23, 0x20,
-  0x62, 0x6c, 0x4d, 0x89, 0xb1, 0x30,
-  0x8c, 0x11, 0x82, 0x30, 0x46, 0x00,
-  0x01, 0x60, 0x2c, 0x05, 0x80, 0xb0,
-  0x07, 0x80, 0xf0, 0x1e, 0x03, 0xc0,
-  0xa0, 0x94, 0x12, 0x82, 0x50, 0x40,
-  0x18, 0xa3, 0x14, 0x62, 0x8c, 0x50,
-  0x91, 0x12, 0x22, 0x44, 0x48, 0x80,
-  0x78, 0x0f, 0x01, 0xe0, 0x3c, 0x00,
-  0x0c, 0x81, 0x90, 0x32, 0x06, 0x40,
-  0x80, 0x70, 0x0e, 0x01, 0xc0, 0x30,
-  0xa0, 0x94, 0x12, 0x82, 0x50, 0x40,
-  0x05, 0x40, 0xa8, 0x15, 0x02, 0xa0,
-  0x43, 0x08, 0x61, 0x0c, 0x21, 0x80,
-  0x1a, 0x03, 0x40, 0x68, 0x0d, 0x00,
-  0x60, 0x2c, 0x05, 0x80, 0xb0, 0x10,
-  0x14, 0x22, 0x84, 0x50, 0x8a, 0x10,
-  0x46, 0x48, 0xc9, 0x19, 0x23, 0x20,
-  0x33, 0x26, 0x64, 0xcc, 0x99, 0x90,
-  0x91, 0x92, 0x32, 0x46, 0x48, 0xc0,
-  0xa4, 0x34, 0x86, 0x90, 0xd2, 0x10,
-  0x50, 0xaa, 0x15, 0x42, 0xa8, 0x50,
-  0x84, 0xd0, 0x9a, 0x13, 0x42, 0x60,
-  0x09, 0x61, 0x2c, 0x25, 0x84, 0xb0,
-  0x86, 0xc1, 0x46, 0x1b, 0x05, 0x10,
-  0xb5, 0xc7, 0xe8, 0x0c, 0xb9, 0x90
-};
-
-const uint8_t kMaskRandom44_35[210] = {
-  0x0c, 0x81, 0x90, 0x32, 0x06, 0x40,
-  0x80, 0x70, 0x0e, 0x01, 0xc0, 0x30,
-  0xa0, 0x94, 0x12, 0x82, 0x50, 0x40,
-  0x05, 0x40, 0xa8, 0x15, 0x02, 0xa0,
-  0x43, 0x08, 0x61, 0x0c, 0x21, 0x80,
-  0x1a, 0x03, 0x40, 0x68, 0x0d, 0x00,
-  0x60, 0x2c, 0x05, 0x80, 0xb0, 0x10,
-  0x14, 0x22, 0x84, 0x50, 0x8a, 0x10,
-  0x46, 0x48, 0xc9, 0x19, 0x23, 0x20,
-  0x62, 0x6c, 0x4d, 0x89, 0xb1, 0x30,
-  0x8c, 0x11, 0x82, 0x30, 0x46, 0x00,
-  0x01, 0x60, 0x2c, 0x05, 0x80, 0xb0,
-  0x07, 0x80, 0xf0, 0x1e, 0x03, 0xc0,
-  0xa0, 0x94, 0x12, 0x82, 0x50, 0x40,
-  0x18, 0xa3, 0x14, 0x62, 0x8c, 0x50,
-  0x91, 0x12, 0x22, 0x44, 0x48, 0x80,
-  0x78, 0x0f, 0x01, 0xe0, 0x3c, 0x00,
-  0x46, 0x48, 0xc9, 0x19, 0x23, 0x20,
-  0x62, 0x6c, 0x4d, 0x89, 0xb1, 0x30,
-  0x8c, 0x11, 0x82, 0x30, 0x46, 0x00,
-  0x01, 0x60, 0x2c, 0x05, 0x80, 0xb0,
-  0x07, 0x80, 0xf0, 0x1e, 0x03, 0xc0,
-  0xa0, 0x94, 0x12, 0x82, 0x50, 0x40,
-  0x18, 0xa3, 0x14, 0x62, 0x8c, 0x50,
-  0x91, 0x12, 0x22, 0x44, 0x48, 0x80,
-  0x78, 0x0f, 0x01, 0xe0, 0x3c, 0x00,
-  0x0c, 0x81, 0x90, 0x32, 0x06, 0x40,
-  0x80, 0x70, 0x0e, 0x01, 0xc0, 0x30,
-  0xa0, 0x94, 0x12, 0x82, 0x50, 0x40,
-  0x05, 0x40, 0xa8, 0x15, 0x02, 0xa0,
-  0x43, 0x08, 0x61, 0x0c, 0x21, 0x80,
-  0x1a, 0x03, 0x40, 0x68, 0x0d, 0x00,
-  0x60, 0x2c, 0x05, 0x80, 0xb0, 0x10,
-  0x14, 0x22, 0x84, 0x50, 0x8a, 0x10,
-  0xe4, 0xd4, 0x6f, 0x93, 0x51, 0xb0
-};
-
-const uint8_t kMaskRandom44_36[216] = {
-  0x46, 0x48, 0xc9, 0x19, 0x23, 0x20,
-  0x62, 0x6c, 0x4d, 0x89, 0xb1, 0x30,
-  0x8c, 0x11, 0x82, 0x30, 0x46, 0x00,
-  0x01, 0x60, 0x2c, 0x05, 0x80, 0xb0,
-  0x07, 0x80, 0xf0, 0x1e, 0x03, 0xc0,
-  0xa0, 0x94, 0x12, 0x82, 0x50, 0x40,
-  0x18, 0xa3, 0x14, 0x62, 0x8c, 0x50,
-  0x91, 0x12, 0x22, 0x44, 0x48, 0x80,
-  0x78, 0x0f, 0x01, 0xe0, 0x3c, 0x00,
-  0x0c, 0x81, 0x90, 0x32, 0x06, 0x40,
-  0x80, 0x70, 0x0e, 0x01, 0xc0, 0x30,
-  0xa0, 0x94, 0x12, 0x82, 0x50, 0x40,
-  0x05, 0x40, 0xa8, 0x15, 0x02, 0xa0,
-  0x43, 0x08, 0x61, 0x0c, 0x21, 0x80,
-  0x1a, 0x03, 0x40, 0x68, 0x0d, 0x00,
-  0x60, 0x2c, 0x05, 0x80, 0xb0, 0x10,
-  0x14, 0x22, 0x84, 0x50, 0x8a, 0x10,
-  0xe4, 0xd4, 0x6f, 0x93, 0x51, 0xb0,
-  0x0c, 0x81, 0x90, 0x32, 0x06, 0x40,
-  0x80, 0x70, 0x0e, 0x01, 0xc0, 0x30,
-  0xa0, 0x94, 0x12, 0x82, 0x50, 0x40,
-  0x05, 0x40, 0xa8, 0x15, 0x02, 0xa0,
-  0x43, 0x08, 0x61, 0x0c, 0x21, 0x80,
-  0x1a, 0x03, 0x40, 0x68, 0x0d, 0x00,
-  0x60, 0x2c, 0x05, 0x80, 0xb0, 0x10,
-  0x14, 0x22, 0x84, 0x50, 0x8a, 0x10,
-  0x46, 0x48, 0xc9, 0x19, 0x23, 0x20,
-  0x62, 0x6c, 0x4d, 0x89, 0xb1, 0x30,
-  0x8c, 0x11, 0x82, 0x30, 0x46, 0x00,
-  0x01, 0x60, 0x2c, 0x05, 0x80, 0xb0,
-  0x07, 0x80, 0xf0, 0x1e, 0x03, 0xc0,
-  0xa0, 0x94, 0x12, 0x82, 0x50, 0x40,
-  0x18, 0xa3, 0x14, 0x62, 0x8c, 0x50,
-  0x91, 0x12, 0x22, 0x44, 0x48, 0x80,
-  0x78, 0x0f, 0x01, 0xe0, 0x3c, 0x00,
-  0xa6, 0x92, 0x01, 0x65, 0x91, 0x20
-};
-
-const uint8_t kMaskRandom44_37[222] = {
-  0x46, 0x48, 0xc9, 0x19, 0x23, 0x20,
-  0x62, 0x6c, 0x4d, 0x89, 0xb1, 0x30,
-  0x8c, 0x11, 0x82, 0x30, 0x46, 0x00,
-  0x01, 0x60, 0x2c, 0x05, 0x80, 0xb0,
-  0x07, 0x80, 0xf0, 0x1e, 0x03, 0xc0,
-  0xa0, 0x94, 0x12, 0x82, 0x50, 0x40,
-  0x18, 0xa3, 0x14, 0x62, 0x8c, 0x50,
-  0x91, 0x12, 0x22, 0x44, 0x48, 0x80,
-  0x78, 0x0f, 0x01, 0xe0, 0x3c, 0x00,
-  0x0c, 0x81, 0x90, 0x32, 0x06, 0x40,
-  0x80, 0x70, 0x0e, 0x01, 0xc0, 0x30,
-  0xa0, 0x94, 0x12, 0x82, 0x50, 0x40,
-  0x05, 0x40, 0xa8, 0x15, 0x02, 0xa0,
-  0x43, 0x08, 0x61, 0x0c, 0x21, 0x80,
-  0x1a, 0x03, 0x40, 0x68, 0x0d, 0x00,
-  0x60, 0x2c, 0x05, 0x80, 0xb0, 0x10,
-  0x14, 0x22, 0x84, 0x50, 0x8a, 0x10,
-  0xe4, 0xd4, 0x6f, 0x93, 0x51, 0xb0,
-  0x46, 0x48, 0xc9, 0x19, 0x23, 0x20,
-  0x62, 0x6c, 0x4d, 0x89, 0xb1, 0x30,
-  0x8c, 0x11, 0x82, 0x30, 0x46, 0x00,
-  0x01, 0x60, 0x2c, 0x05, 0x80, 0xb0,
-  0x07, 0x80, 0xf0, 0x1e, 0x03, 0xc0,
-  0xa0, 0x94, 0x12, 0x82, 0x50, 0x40,
-  0x18, 0xa3, 0x14, 0x62, 0x8c, 0x50,
-  0x91, 0x12, 0x22, 0x44, 0x48, 0x80,
-  0x78, 0x0f, 0x01, 0xe0, 0x3c, 0x00,
-  0x64, 0x4c, 0x89, 0x91, 0x32, 0x20,
-  0x51, 0x4a, 0x29, 0x45, 0x28, 0xa0,
-  0xa9, 0x15, 0x22, 0xa4, 0x54, 0x80,
-  0x04, 0xc0, 0x98, 0x13, 0x02, 0x60,
-  0xd0, 0x1a, 0x03, 0x40, 0x68, 0x00,
-  0x82, 0x50, 0x4a, 0x09, 0x41, 0x20,
-  0x21, 0x24, 0x24, 0x84, 0x90, 0x90,
-  0x0c, 0x21, 0x84, 0x30, 0x86, 0x10,
-  0x4a, 0x09, 0x41, 0x28, 0x25, 0x00,
-  0x12, 0xa2, 0x54, 0x4a, 0x89, 0x50
-};
-
-const uint8_t kMaskRandom44_38[228] = {
-  0x46, 0x48, 0xc9, 0x19, 0x23, 0x20,
-  0x62, 0x6c, 0x4d, 0x89, 0xb1, 0x30,
-  0x8c, 0x11, 0x82, 0x30, 0x46, 0x00,
-  0x01, 0x60, 0x2c, 0x05, 0x80, 0xb0,
-  0x07, 0x80, 0xf0, 0x1e, 0x03, 0xc0,
-  0xa0, 0x94, 0x12, 0x82, 0x50, 0x40,
-  0x18, 0xa3, 0x14, 0x62, 0x8c, 0x50,
-  0x91, 0x12, 0x22, 0x44, 0x48, 0x80,
-  0x78, 0x0f, 0x01, 0xe0, 0x3c, 0x00,
-  0x64, 0x4c, 0x89, 0x91, 0x32, 0x20,
-  0x51, 0x4a, 0x29, 0x45, 0x28, 0xa0,
-  0xa9, 0x15, 0x22, 0xa4, 0x54, 0x80,
-  0x04, 0xc0, 0x98, 0x13, 0x02, 0x60,
-  0xd0, 0x1a, 0x03, 0x40, 0x68, 0x00,
-  0x82, 0x50, 0x4a, 0x09, 0x41, 0x20,
-  0x21, 0x24, 0x24, 0x84, 0x90, 0x90,
-  0x0c, 0x21, 0x84, 0x30, 0x86, 0x10,
-  0x4a, 0x09, 0x41, 0x28, 0x25, 0x00,
-  0x12, 0xa2, 0x54, 0x4a, 0x89, 0x50,
-  0x46, 0x48, 0xc9, 0x19, 0x23, 0x20,
-  0x62, 0x6c, 0x4d, 0x89, 0xb1, 0x30,
-  0x8c, 0x11, 0x82, 0x30, 0x46, 0x00,
-  0x01, 0x60, 0x2c, 0x05, 0x80, 0xb0,
-  0x07, 0x80, 0xf0, 0x1e, 0x03, 0xc0,
-  0xa0, 0x94, 0x12, 0x82, 0x50, 0x40,
-  0x18, 0xa3, 0x14, 0x62, 0x8c, 0x50,
-  0x91, 0x12, 0x22, 0x44, 0x48, 0x80,
-  0x78, 0x0f, 0x01, 0xe0, 0x3c, 0x00,
-  0x0c, 0x81, 0x90, 0x32, 0x06, 0x40,
-  0x80, 0x70, 0x0e, 0x01, 0xc0, 0x30,
-  0xa0, 0x94, 0x12, 0x82, 0x50, 0x40,
-  0x05, 0x40, 0xa8, 0x15, 0x02, 0xa0,
-  0x43, 0x08, 0x61, 0x0c, 0x21, 0x80,
-  0x1a, 0x03, 0x40, 0x68, 0x0d, 0x00,
-  0x60, 0x2c, 0x05, 0x80, 0xb0, 0x10,
-  0x14, 0x22, 0x84, 0x50, 0x8a, 0x10,
-  0xe4, 0xd4, 0x6f, 0x93, 0x51, 0xb0,
-  0x43, 0x64, 0xf2, 0xe5, 0x5d, 0x10
-};
-
-const uint8_t kMaskRandom44_39[234] = {
-  0x46, 0x48, 0xc9, 0x19, 0x23, 0x20,
-  0x62, 0x6c, 0x4d, 0x89, 0xb1, 0x30,
-  0x8c, 0x11, 0x82, 0x30, 0x46, 0x00,
-  0x01, 0x60, 0x2c, 0x05, 0x80, 0xb0,
-  0x07, 0x80, 0xf0, 0x1e, 0x03, 0xc0,
-  0xa0, 0x94, 0x12, 0x82, 0x50, 0x40,
-  0x18, 0xa3, 0x14, 0x62, 0x8c, 0x50,
-  0x91, 0x12, 0x22, 0x44, 0x48, 0x80,
-  0x78, 0x0f, 0x01, 0xe0, 0x3c, 0x00,
-  0x64, 0x4c, 0x89, 0x91, 0x32, 0x20,
-  0x51, 0x4a, 0x29, 0x45, 0x28, 0xa0,
-  0xa9, 0x15, 0x22, 0xa4, 0x54, 0x80,
-  0x04, 0xc0, 0x98, 0x13, 0x02, 0x60,
-  0xd0, 0x1a, 0x03, 0x40, 0x68, 0x00,
-  0x82, 0x50, 0x4a, 0x09, 0x41, 0x20,
-  0x21, 0x24, 0x24, 0x84, 0x90, 0x90,
-  0x0c, 0x21, 0x84, 0x30, 0x86, 0x10,
-  0x4a, 0x09, 0x41, 0x28, 0x25, 0x00,
-  0x12, 0xa2, 0x54, 0x4a, 0x89, 0x50,
-  0x64, 0x4c, 0x89, 0x91, 0x32, 0x20,
-  0x51, 0x4a, 0x29, 0x45, 0x28, 0xa0,
-  0xa9, 0x15, 0x22, 0xa4, 0x54, 0x80,
-  0x04, 0xc0, 0x98, 0x13, 0x02, 0x60,
-  0xd0, 0x1a, 0x03, 0x40, 0x68, 0x00,
-  0x82, 0x50, 0x4a, 0x09, 0x41, 0x20,
-  0x21, 0x24, 0x24, 0x84, 0x90, 0x90,
-  0x0c, 0x21, 0x84, 0x30, 0x86, 0x10,
-  0x4a, 0x09, 0x41, 0x28, 0x25, 0x00,
-  0x12, 0xa2, 0x54, 0x4a, 0x89, 0x50,
-  0x46, 0x48, 0xc9, 0x19, 0x23, 0x20,
-  0x62, 0x6c, 0x4d, 0x89, 0xb1, 0x30,
-  0x8c, 0x11, 0x82, 0x30, 0x46, 0x00,
-  0x01, 0x60, 0x2c, 0x05, 0x80, 0xb0,
-  0x07, 0x80, 0xf0, 0x1e, 0x03, 0xc0,
-  0xa0, 0x94, 0x12, 0x82, 0x50, 0x40,
-  0x18, 0xa3, 0x14, 0x62, 0x8c, 0x50,
-  0x91, 0x12, 0x22, 0x44, 0x48, 0x80,
-  0x78, 0x0f, 0x01, 0xe0, 0x3c, 0x00,
-  0x3b, 0x48, 0xc4, 0xed, 0x23, 0x10
-};
-
-const uint8_t kMaskRandom44_4[24] = {
-  0xc4, 0xd8, 0x9b, 0x13, 0x62, 0x60,
-  0x31, 0x66, 0x2c, 0xc5, 0x98, 0xb0,
-  0x4b, 0x29, 0x65, 0x2c, 0xa5, 0x90,
-  0x2c, 0xa5, 0x94, 0xb2, 0x96, 0x50
-};
-
-const uint8_t kMaskRandom44_40[240] = {
-  0x64, 0x4c, 0x89, 0x91, 0x32, 0x20,
-  0x51, 0x4a, 0x29, 0x45, 0x28, 0xa0,
-  0xa9, 0x15, 0x22, 0xa4, 0x54, 0x80,
-  0x04, 0xc0, 0x98, 0x13, 0x02, 0x60,
-  0xd0, 0x1a, 0x03, 0x40, 0x68, 0x00,
-  0x82, 0x50, 0x4a, 0x09, 0x41, 0x20,
-  0x21, 0x24, 0x24, 0x84, 0x90, 0x90,
-  0x0c, 0x21, 0x84, 0x30, 0x86, 0x10,
-  0x4a, 0x09, 0x41, 0x28, 0x25, 0x00,
-  0x12, 0xa2, 0x54, 0x4a, 0x89, 0x50,
-  0x46, 0x48, 0xc9, 0x19, 0x23, 0x20,
-  0x62, 0x6c, 0x4d, 0x89, 0xb1, 0x30,
-  0x8c, 0x11, 0x82, 0x30, 0x46, 0x00,
-  0x01, 0x60, 0x2c, 0x05, 0x80, 0xb0,
-  0x07, 0x80, 0xf0, 0x1e, 0x03, 0xc0,
-  0xa0, 0x94, 0x12, 0x82, 0x50, 0x40,
-  0x18, 0xa3, 0x14, 0x62, 0x8c, 0x50,
-  0x91, 0x12, 0x22, 0x44, 0x48, 0x80,
-  0x78, 0x0f, 0x01, 0xe0, 0x3c, 0x00,
-  0x3b, 0x48, 0xc4, 0xed, 0x23, 0x10,
-  0x46, 0x48, 0xc9, 0x19, 0x23, 0x20,
-  0x62, 0x6c, 0x4d, 0x89, 0xb1, 0x30,
-  0x8c, 0x11, 0x82, 0x30, 0x46, 0x00,
-  0x01, 0x60, 0x2c, 0x05, 0x80, 0xb0,
-  0x07, 0x80, 0xf0, 0x1e, 0x03, 0xc0,
-  0xa0, 0x94, 0x12, 0x82, 0x50, 0x40,
-  0x18, 0xa3, 0x14, 0x62, 0x8c, 0x50,
-  0x91, 0x12, 0x22, 0x44, 0x48, 0x80,
-  0x78, 0x0f, 0x01, 0xe0, 0x3c, 0x00,
-  0x64, 0x4c, 0x89, 0x91, 0x32, 0x20,
-  0x51, 0x4a, 0x29, 0x45, 0x28, 0xa0,
-  0xa9, 0x15, 0x22, 0xa4, 0x54, 0x80,
-  0x04, 0xc0, 0x98, 0x13, 0x02, 0x60,
-  0xd0, 0x1a, 0x03, 0x40, 0x68, 0x00,
-  0x82, 0x50, 0x4a, 0x09, 0x41, 0x20,
-  0x21, 0x24, 0x24, 0x84, 0x90, 0x90,
-  0x0c, 0x21, 0x84, 0x30, 0x86, 0x10,
-  0x4a, 0x09, 0x41, 0x28, 0x25, 0x00,
-  0x12, 0xa2, 0x54, 0x4a, 0x89, 0x50,
-  0xd8, 0x2a, 0x16, 0x26, 0x51, 0x40
-};
-
-const uint8_t kMaskRandom44_41[246] = {
-  0x64, 0x4c, 0x89, 0x91, 0x32, 0x20,
-  0x51, 0x4a, 0x29, 0x45, 0x28, 0xa0,
-  0xa9, 0x15, 0x22, 0xa4, 0x54, 0x80,
-  0x04, 0xc0, 0x98, 0x13, 0x02, 0x60,
-  0xd0, 0x1a, 0x03, 0x40, 0x68, 0x00,
-  0x82, 0x50, 0x4a, 0x09, 0x41, 0x20,
-  0x21, 0x24, 0x24, 0x84, 0x90, 0x90,
-  0x0c, 0x21, 0x84, 0x30, 0x86, 0x10,
-  0x4a, 0x09, 0x41, 0x28, 0x25, 0x00,
-  0x12, 0xa2, 0x54, 0x4a, 0x89, 0x50,
-  0x46, 0x48, 0xc9, 0x19, 0x23, 0x20,
-  0x62, 0x6c, 0x4d, 0x89, 0xb1, 0x30,
-  0x8c, 0x11, 0x82, 0x30, 0x46, 0x00,
-  0x01, 0x60, 0x2c, 0x05, 0x80, 0xb0,
-  0x07, 0x80, 0xf0, 0x1e, 0x03, 0xc0,
-  0xa0, 0x94, 0x12, 0x82, 0x50, 0x40,
-  0x18, 0xa3, 0x14, 0x62, 0x8c, 0x50,
-  0x91, 0x12, 0x22, 0x44, 0x48, 0x80,
-  0x78, 0x0f, 0x01, 0xe0, 0x3c, 0x00,
-  0x3b, 0x48, 0xc4, 0xed, 0x23, 0x10,
-  0x64, 0x4c, 0x89, 0x91, 0x32, 0x20,
-  0x51, 0x4a, 0x29, 0x45, 0x28, 0xa0,
-  0xa9, 0x15, 0x22, 0xa4, 0x54, 0x80,
-  0x04, 0xc0, 0x98, 0x13, 0x02, 0x60,
-  0xd0, 0x1a, 0x03, 0x40, 0x68, 0x00,
-  0x82, 0x50, 0x4a, 0x09, 0x41, 0x20,
-  0x21, 0x24, 0x24, 0x84, 0x90, 0x90,
-  0x0c, 0x21, 0x84, 0x30, 0x86, 0x10,
-  0x4a, 0x09, 0x41, 0x28, 0x25, 0x00,
-  0x12, 0xa2, 0x54, 0x4a, 0x89, 0x50,
-  0x46, 0x48, 0xc9, 0x19, 0x23, 0x20,
-  0x33, 0x26, 0x64, 0xcc, 0x99, 0x90,
-  0x99, 0x13, 0x22, 0x64, 0x4c, 0x80,
-  0x05, 0x80, 0xb0, 0x16, 0x02, 0xc0,
-  0x80, 0xb0, 0x16, 0x02, 0xc0, 0x50,
-  0x84, 0x50, 0x8a, 0x11, 0x42, 0x20,
-  0x40, 0x68, 0x0d, 0x01, 0xa0, 0x30,
-  0x0a, 0x81, 0x50, 0x2a, 0x05, 0x40,
-  0x68, 0x0d, 0x01, 0xa0, 0x34, 0x00,
-  0x10, 0x22, 0x04, 0x40, 0x88, 0x10,
-  0x30, 0x46, 0x08, 0xc1, 0x18, 0x20
-};
-
-const uint8_t kMaskRandom44_42[252] = {
-  0x64, 0x4c, 0x89, 0x91, 0x32, 0x20,
-  0x51, 0x4a, 0x29, 0x45, 0x28, 0xa0,
-  0xa9, 0x15, 0x22, 0xa4, 0x54, 0x80,
-  0x04, 0xc0, 0x98, 0x13, 0x02, 0x60,
-  0xd0, 0x1a, 0x03, 0x40, 0x68, 0x00,
-  0x82, 0x50, 0x4a, 0x09, 0x41, 0x20,
-  0x21, 0x24, 0x24, 0x84, 0x90, 0x90,
-  0x0c, 0x21, 0x84, 0x30, 0x86, 0x10,
-  0x4a, 0x09, 0x41, 0x28, 0x25, 0x00,
-  0x12, 0xa2, 0x54, 0x4a, 0x89, 0x50,
-  0x46, 0x48, 0xc9, 0x19, 0x23, 0x20,
-  0x33, 0x26, 0x64, 0xcc, 0x99, 0x90,
-  0x99, 0x13, 0x22, 0x64, 0x4c, 0x80,
-  0x05, 0x80, 0xb0, 0x16, 0x02, 0xc0,
-  0x80, 0xb0, 0x16, 0x02, 0xc0, 0x50,
-  0x84, 0x50, 0x8a, 0x11, 0x42, 0x20,
-  0x40, 0x68, 0x0d, 0x01, 0xa0, 0x30,
-  0x0a, 0x81, 0x50, 0x2a, 0x05, 0x40,
-  0x68, 0x0d, 0x01, 0xa0, 0x34, 0x00,
-  0x10, 0x22, 0x04, 0x40, 0x88, 0x10,
-  0x30, 0x46, 0x08, 0xc1, 0x18, 0x20,
-  0x64, 0x4c, 0x89, 0x91, 0x32, 0x20,
-  0x51, 0x4a, 0x29, 0x45, 0x28, 0xa0,
-  0xa9, 0x15, 0x22, 0xa4, 0x54, 0x80,
-  0x04, 0xc0, 0x98, 0x13, 0x02, 0x60,
-  0xd0, 0x1a, 0x03, 0x40, 0x68, 0x00,
-  0x82, 0x50, 0x4a, 0x09, 0x41, 0x20,
-  0x21, 0x24, 0x24, 0x84, 0x90, 0x90,
-  0x0c, 0x21, 0x84, 0x30, 0x86, 0x10,
-  0x4a, 0x09, 0x41, 0x28, 0x25, 0x00,
-  0x12, 0xa2, 0x54, 0x4a, 0x89, 0x50,
-  0x46, 0x48, 0xc9, 0x19, 0x23, 0x20,
-  0x62, 0x6c, 0x4d, 0x89, 0xb1, 0x30,
-  0x8c, 0x11, 0x82, 0x30, 0x46, 0x00,
-  0x01, 0x60, 0x2c, 0x05, 0x80, 0xb0,
-  0x07, 0x80, 0xf0, 0x1e, 0x03, 0xc0,
-  0xa0, 0x94, 0x12, 0x82, 0x50, 0x40,
-  0x18, 0xa3, 0x14, 0x62, 0x8c, 0x50,
-  0x91, 0x12, 0x22, 0x44, 0x48, 0x80,
-  0x78, 0x0f, 0x01, 0xe0, 0x3c, 0x00,
-  0x3b, 0x48, 0xc4, 0xed, 0x23, 0x10,
-  0xd9, 0xc1, 0x6f, 0xa8, 0x1c, 0x90
-};
-
-const uint8_t kMaskRandom44_43[258] = {
-  0x64, 0x4c, 0x89, 0x91, 0x32, 0x20,
-  0x51, 0x4a, 0x29, 0x45, 0x28, 0xa0,
-  0xa9, 0x15, 0x22, 0xa4, 0x54, 0x80,
-  0x04, 0xc0, 0x98, 0x13, 0x02, 0x60,
-  0xd0, 0x1a, 0x03, 0x40, 0x68, 0x00,
-  0x82, 0x50, 0x4a, 0x09, 0x41, 0x20,
-  0x21, 0x24, 0x24, 0x84, 0x90, 0x90,
-  0x0c, 0x21, 0x84, 0x30, 0x86, 0x10,
-  0x4a, 0x09, 0x41, 0x28, 0x25, 0x00,
-  0x12, 0xa2, 0x54, 0x4a, 0x89, 0x50,
-  0x46, 0x48, 0xc9, 0x19, 0x23, 0x20,
-  0x33, 0x26, 0x64, 0xcc, 0x99, 0x90,
-  0x99, 0x13, 0x22, 0x64, 0x4c, 0x80,
-  0x05, 0x80, 0xb0, 0x16, 0x02, 0xc0,
-  0x80, 0xb0, 0x16, 0x02, 0xc0, 0x50,
-  0x84, 0x50, 0x8a, 0x11, 0x42, 0x20,
-  0x40, 0x68, 0x0d, 0x01, 0xa0, 0x30,
-  0x0a, 0x81, 0x50, 0x2a, 0x05, 0x40,
-  0x68, 0x0d, 0x01, 0xa0, 0x34, 0x00,
-  0x10, 0x22, 0x04, 0x40, 0x88, 0x10,
-  0x30, 0x46, 0x08, 0xc1, 0x18, 0x20,
-  0x46, 0x48, 0xc9, 0x19, 0x23, 0x20,
-  0x33, 0x26, 0x64, 0xcc, 0x99, 0x90,
-  0x99, 0x13, 0x22, 0x64, 0x4c, 0x80,
-  0x05, 0x80, 0xb0, 0x16, 0x02, 0xc0,
-  0x80, 0xb0, 0x16, 0x02, 0xc0, 0x50,
-  0x84, 0x50, 0x8a, 0x11, 0x42, 0x20,
-  0x40, 0x68, 0x0d, 0x01, 0xa0, 0x30,
-  0x0a, 0x81, 0x50, 0x2a, 0x05, 0x40,
-  0x68, 0x0d, 0x01, 0xa0, 0x34, 0x00,
-  0x10, 0x22, 0x04, 0x40, 0x88, 0x10,
-  0x30, 0x46, 0x08, 0xc1, 0x18, 0x20,
-  0x64, 0x4c, 0x89, 0x91, 0x32, 0x20,
-  0x51, 0x4a, 0x29, 0x45, 0x28, 0xa0,
-  0xa9, 0x15, 0x22, 0xa4, 0x54, 0x80,
-  0x04, 0xc0, 0x98, 0x13, 0x02, 0x60,
-  0xd0, 0x1a, 0x03, 0x40, 0x68, 0x00,
-  0x82, 0x50, 0x4a, 0x09, 0x41, 0x20,
-  0x21, 0x24, 0x24, 0x84, 0x90, 0x90,
-  0x0c, 0x21, 0x84, 0x30, 0x86, 0x10,
-  0x4a, 0x09, 0x41, 0x28, 0x25, 0x00,
-  0x12, 0xa2, 0x54, 0x4a, 0x89, 0x50,
-  0x9e, 0xce, 0x8a, 0x7b, 0x3a, 0x20
-};
-
-const uint8_t kMaskRandom44_44[264] = {
-  0x46, 0x48, 0xc9, 0x19, 0x23, 0x20,
-  0x33, 0x26, 0x64, 0xcc, 0x99, 0x90,
-  0x99, 0x13, 0x22, 0x64, 0x4c, 0x80,
-  0x05, 0x80, 0xb0, 0x16, 0x02, 0xc0,
-  0x80, 0xb0, 0x16, 0x02, 0xc0, 0x50,
-  0x84, 0x50, 0x8a, 0x11, 0x42, 0x20,
-  0x40, 0x68, 0x0d, 0x01, 0xa0, 0x30,
-  0x0a, 0x81, 0x50, 0x2a, 0x05, 0x40,
-  0x68, 0x0d, 0x01, 0xa0, 0x34, 0x00,
-  0x10, 0x22, 0x04, 0x40, 0x88, 0x10,
-  0x30, 0x46, 0x08, 0xc1, 0x18, 0x20,
-  0x64, 0x4c, 0x89, 0x91, 0x32, 0x20,
-  0x51, 0x4a, 0x29, 0x45, 0x28, 0xa0,
-  0xa9, 0x15, 0x22, 0xa4, 0x54, 0x80,
-  0x04, 0xc0, 0x98, 0x13, 0x02, 0x60,
-  0xd0, 0x1a, 0x03, 0x40, 0x68, 0x00,
-  0x82, 0x50, 0x4a, 0x09, 0x41, 0x20,
-  0x21, 0x24, 0x24, 0x84, 0x90, 0x90,
-  0x0c, 0x21, 0x84, 0x30, 0x86, 0x10,
-  0x4a, 0x09, 0x41, 0x28, 0x25, 0x00,
-  0x12, 0xa2, 0x54, 0x4a, 0x89, 0x50,
-  0x9e, 0xce, 0x8a, 0x7b, 0x3a, 0x20,
-  0x64, 0x4c, 0x89, 0x91, 0x32, 0x20,
-  0x51, 0x4a, 0x29, 0x45, 0x28, 0xa0,
-  0xa9, 0x15, 0x22, 0xa4, 0x54, 0x80,
-  0x04, 0xc0, 0x98, 0x13, 0x02, 0x60,
-  0xd0, 0x1a, 0x03, 0x40, 0x68, 0x00,
-  0x82, 0x50, 0x4a, 0x09, 0x41, 0x20,
-  0x21, 0x24, 0x24, 0x84, 0x90, 0x90,
-  0x0c, 0x21, 0x84, 0x30, 0x86, 0x10,
-  0x4a, 0x09, 0x41, 0x28, 0x25, 0x00,
-  0x12, 0xa2, 0x54, 0x4a, 0x89, 0x50,
-  0x46, 0x48, 0xc9, 0x19, 0x23, 0x20,
-  0x33, 0x26, 0x64, 0xcc, 0x99, 0x90,
-  0x99, 0x13, 0x22, 0x64, 0x4c, 0x80,
-  0x05, 0x80, 0xb0, 0x16, 0x02, 0xc0,
-  0x80, 0xb0, 0x16, 0x02, 0xc0, 0x50,
-  0x84, 0x50, 0x8a, 0x11, 0x42, 0x20,
-  0x40, 0x68, 0x0d, 0x01, 0xa0, 0x30,
-  0x0a, 0x81, 0x50, 0x2a, 0x05, 0x40,
-  0x68, 0x0d, 0x01, 0xa0, 0x34, 0x00,
-  0x10, 0x22, 0x04, 0x40, 0x88, 0x10,
-  0x30, 0x46, 0x08, 0xc1, 0x18, 0x20,
-  0xb5, 0x1c, 0x1c, 0x21, 0xac, 0xa0
-};
-
-const uint8_t kMaskRandom44_5[30] = {
-  0xc6, 0xd8, 0xdb, 0x1b, 0x63, 0x60,
-  0x63, 0x6c, 0x6d, 0x8d, 0xb1, 0xb0,
-  0x1d, 0xa3, 0xb4, 0x76, 0x8e, 0xd0,
-  0xad, 0x55, 0xaa, 0xb5, 0x56, 0xa0,
-  0xb2, 0xb6, 0x56, 0xca, 0xd9, 0x50
-};
-
-const uint8_t kMaskRandom44_6[36] = {
-  0x64, 0x4c, 0x89, 0x91, 0x32, 0x20,
-  0x51, 0x4a, 0x29, 0x45, 0x28, 0xa0,
-  0xa8, 0x35, 0x06, 0xa0, 0xd4, 0x10,
-  0xc4, 0xa0, 0x97, 0x12, 0x82, 0x50,
-  0x03, 0x60, 0x6c, 0x0d, 0x81, 0xb0,
-  0x90, 0xd2, 0x1a, 0x43, 0x48, 0x60
-};
-
-const uint8_t kMaskRandom44_7[42] = {
-  0xc6, 0x48, 0xcb, 0x19, 0x23, 0x20,
-  0x13, 0x26, 0x64, 0x4c, 0x99, 0x90,
-  0x8d, 0x13, 0xa2, 0x34, 0x4e, 0x80,
-  0x8b, 0x41, 0x6a, 0x2d, 0x05, 0xa0,
-  0x52, 0xaa, 0x15, 0x4a, 0xa8, 0x50,
-  0xa2, 0xd4, 0x1a, 0x8b, 0x50, 0x60,
-  0x61, 0xa8, 0x2d, 0x86, 0xa0, 0xb0
-};
-
-const uint8_t kMaskRandom44_8[48] = {
-  0x28, 0x85, 0x38, 0xa2, 0x14, 0xe0,
-  0x21, 0xf4, 0x04, 0x87, 0xd0, 0x10,
-  0xe9, 0x1d, 0x03, 0xa4, 0x74, 0x00,
-  0x17, 0x02, 0xe0, 0x5c, 0x0b, 0x80,
-  0x83, 0xa0, 0x56, 0x0e, 0x81, 0x50,
-  0x46, 0x18, 0xe9, 0x18, 0x63, 0xa0,
-  0x50, 0x6a, 0x0d, 0x41, 0xa8, 0x30,
-  0x1c, 0x23, 0x84, 0x70, 0x8e, 0x10
-};
-
-const uint8_t kMaskRandom44_9[54] = {
-  0x44, 0x48, 0xc9, 0x11, 0x23, 0x20,
-  0x28, 0x2d, 0x0c, 0xa0, 0xb4, 0x30,
-  0x25, 0x14, 0xa0, 0x94, 0x52, 0x80,
-  0x59, 0x0a, 0x21, 0x64, 0x28, 0x80,
-  0x03, 0xa0, 0x34, 0x0e, 0x80, 0xd0,
-  0xc0, 0xd0, 0x1b, 0x03, 0x40, 0x60,
-  0xa2, 0x30, 0x46, 0x88, 0xc1, 0x10,
-  0x14, 0x82, 0xd0, 0x52, 0x0b, 0x40,
-  0x9a, 0x03, 0x82, 0x68, 0x0e, 0x00
-};
-
-const uint8_t kMaskRandom45_1[6] = {
-  0xff, 0xff, 0xff, 0xff, 0xff, 0xf8
-};
-
-const uint8_t kMaskRandom45_10[60] = {
-  0xc0, 0x38, 0x89, 0x91, 0x28, 0xa0,
-  0x30, 0x0e, 0x29, 0x45, 0x22, 0x88,
-  0xe8, 0x07, 0x02, 0xa4, 0x40, 0x68,
-  0x85, 0x08, 0xa8, 0x13, 0x12, 0x10,
-  0xd0, 0x92, 0x13, 0x40, 0x05, 0x10,
-  0x86, 0x50, 0x4a, 0x09, 0x00, 0x70,
-  0x4a, 0x68, 0x0c, 0x84, 0xdc, 0x00,
-  0x01, 0xa0, 0x74, 0x30, 0x84, 0x88,
-  0x4c, 0x81, 0x91, 0x28, 0x2b, 0x00,
-  0x62, 0x24, 0x04, 0x4a, 0xd1, 0x40
-};
-
-const uint8_t kMaskRandom45_11[66] = {
-  0x46, 0x48, 0xc9, 0x19, 0x29, 0xb0,
-  0x33, 0x26, 0x64, 0xcc, 0x90, 0x98,
-  0x99, 0x13, 0x22, 0x64, 0x08, 0x48,
-  0x05, 0x80, 0xb0, 0x16, 0x00, 0x38,
-  0x80, 0xb0, 0x16, 0x02, 0x86, 0x08,
-  0x84, 0x50, 0x8a, 0x11, 0x20, 0x60,
-  0x40, 0x68, 0x0d, 0x01, 0xb5, 0x00,
-  0x0a, 0x81, 0x50, 0x2a, 0x43, 0x00,
-  0x68, 0x0d, 0x01, 0xa0, 0x12, 0x40,
-  0x10, 0x22, 0x04, 0x40, 0xc4, 0x80,
-  0x30, 0x46, 0x08, 0xc1, 0x60, 0x10
-};
-
-const uint8_t kMaskRandom45_12[72] = {
-  0x64, 0x4c, 0x89, 0x91, 0x28, 0xa0,
-  0x51, 0x4a, 0x29, 0x45, 0x62, 0x88,
-  0x0c, 0xa1, 0x94, 0x32, 0x90, 0xc0,
-  0xa1, 0x34, 0x26, 0x84, 0x89, 0x18,
-  0x12, 0xa2, 0x54, 0x4a, 0x84, 0x70,
-  0x8a, 0x51, 0x4a, 0x29, 0x17, 0x00,
-  0x86, 0x90, 0xd2, 0x1a, 0x29, 0xb0,
-  0x23, 0x24, 0x64, 0x8c, 0xb2, 0x10,
-  0x16, 0x22, 0xc4, 0x58, 0x86, 0x60,
-  0x4c, 0x29, 0x85, 0x30, 0xc1, 0x50,
-  0x41, 0xc8, 0x39, 0x07, 0x04, 0x98,
-  0xf4, 0x18, 0x9c, 0x65, 0x5b, 0x90
-};
-
-const uint8_t kMaskRandom45_13[78] = {
-  0x64, 0x4c, 0x89, 0x91, 0x28, 0xa0,
-  0x51, 0x4a, 0x29, 0x45, 0x62, 0x88,
-  0x0c, 0xa1, 0x94, 0x32, 0x90, 0xc0,
-  0xa1, 0x34, 0x26, 0x84, 0x89, 0x18,
-  0x12, 0xa2, 0x54, 0x4a, 0x84, 0x70,
-  0x8a, 0x51, 0x4a, 0x29, 0x17, 0x00,
-  0x46, 0x48, 0xc9, 0x19, 0x29, 0xb0,
-  0x33, 0x26, 0x64, 0xcc, 0x90, 0x98,
-  0x91, 0x92, 0x32, 0x46, 0x48, 0x48,
-  0xa4, 0x34, 0x86, 0x90, 0x81, 0x28,
-  0x50, 0xaa, 0x15, 0x42, 0x83, 0x50,
-  0x84, 0xd0, 0x9a, 0x13, 0x16, 0x00,
-  0x09, 0x61, 0x2c, 0x25, 0xc4, 0x30
-};
-
-const uint8_t kMaskRandom45_14[84] = {
-  0x46, 0x48, 0xc9, 0x19, 0x29, 0xb0,
-  0x33, 0x26, 0x64, 0xcc, 0x90, 0x98,
-  0x91, 0x92, 0x32, 0x46, 0x48, 0x48,
-  0xa4, 0x34, 0x86, 0x90, 0x81, 0x28,
-  0x50, 0xaa, 0x15, 0x42, 0x83, 0x50,
-  0x84, 0xd0, 0x9a, 0x13, 0x16, 0x00,
-  0x09, 0x61, 0x2c, 0x25, 0xc4, 0x30,
-  0x64, 0x4c, 0x89, 0x91, 0x28, 0xa0,
-  0x51, 0x4a, 0x29, 0x45, 0x62, 0x88,
-  0x0c, 0xa1, 0x94, 0x32, 0x90, 0xc0,
-  0xa1, 0x34, 0x26, 0x84, 0x89, 0x18,
-  0x12, 0xa2, 0x54, 0x4a, 0x84, 0x70,
-  0x8a, 0x51, 0x4a, 0x29, 0x17, 0x00,
-  0xc6, 0xca, 0xea, 0x70, 0xfe, 0xc8
-};
-
-const uint8_t kMaskRandom45_15[90] = {
-  0x46, 0x48, 0xc9, 0x19, 0x29, 0xb0,
-  0x33, 0x26, 0x64, 0xcc, 0x90, 0x98,
-  0x91, 0x92, 0x32, 0x46, 0x48, 0x48,
-  0xa4, 0x34, 0x86, 0x90, 0x81, 0x28,
-  0x50, 0xaa, 0x15, 0x42, 0x83, 0x50,
-  0x84, 0xd0, 0x9a, 0x13, 0x16, 0x00,
-  0x09, 0x61, 0x2c, 0x25, 0xc4, 0x30,
-  0x0c, 0x81, 0x90, 0x32, 0x10, 0x30,
-  0x80, 0x70, 0x0e, 0x01, 0xc0, 0x18,
-  0xa0, 0x94, 0x12, 0x82, 0x21, 0x20,
-  0x05, 0x40, 0xa8, 0x15, 0x00, 0xc8,
-  0x43, 0x08, 0x61, 0x0c, 0x0a, 0x08,
-  0x1a, 0x03, 0x40, 0x68, 0x05, 0x40,
-  0x60, 0x2c, 0x05, 0x80, 0x9c, 0x00,
-  0x14, 0x22, 0x84, 0x50, 0xe2, 0x80
-};
-
-const uint8_t kMaskRandom45_16[96] = {
-  0x0c, 0x81, 0x90, 0x32, 0x10, 0x30,
-  0x80, 0x70, 0x0e, 0x01, 0xc0, 0x18,
-  0xa0, 0x94, 0x12, 0x82, 0x21, 0x20,
-  0x05, 0x40, 0xa8, 0x15, 0x00, 0xc8,
-  0x43, 0x08, 0x61, 0x0c, 0x0a, 0x08,
-  0x1a, 0x03, 0x40, 0x68, 0x05, 0x40,
-  0x60, 0x2c, 0x05, 0x80, 0x9c, 0x00,
-  0x14, 0x22, 0x84, 0x50, 0xe2, 0x80,
-  0x46, 0x48, 0xc9, 0x19, 0x29, 0xb0,
-  0x33, 0x26, 0x64, 0xcc, 0x90, 0x98,
-  0x91, 0x92, 0x32, 0x46, 0x48, 0x48,
-  0xa4, 0x34, 0x86, 0x90, 0x81, 0x28,
-  0x50, 0xaa, 0x15, 0x42, 0x83, 0x50,
-  0x84, 0xd0, 0x9a, 0x13, 0x16, 0x00,
-  0x09, 0x61, 0x2c, 0x25, 0xc4, 0x30,
-  0x86, 0xc1, 0x47, 0xeb, 0x67, 0xd0
-};
-
-const uint8_t kMaskRandom45_17[102] = {
-  0x0c, 0x81, 0x90, 0x32, 0x10, 0x30,
-  0x80, 0x70, 0x0e, 0x01, 0xc0, 0x18,
-  0xa0, 0x94, 0x12, 0x82, 0x21, 0x20,
-  0x05, 0x40, 0xa8, 0x15, 0x00, 0xc8,
-  0x43, 0x08, 0x61, 0x0c, 0x0a, 0x08,
-  0x1a, 0x03, 0x40, 0x68, 0x05, 0x40,
-  0x60, 0x2c, 0x05, 0x80, 0x9c, 0x00,
-  0x14, 0x22, 0x84, 0x50, 0xe2, 0x80,
-  0x46, 0x48, 0xc9, 0x19, 0x29, 0xb0,
-  0x62, 0x6c, 0x4d, 0x89, 0xf2, 0x10,
-  0x8c, 0x11, 0x82, 0x30, 0x12, 0x20,
-  0x01, 0x60, 0x2c, 0x05, 0xd0, 0x88,
-  0x07, 0x80, 0xf0, 0x1e, 0x0c, 0x18,
-  0xa0, 0x94, 0x12, 0x82, 0x01, 0xc8,
-  0x18, 0xa3, 0x14, 0x62, 0xc5, 0x08,
-  0x91, 0x12, 0x22, 0x44, 0x02, 0x48,
-  0x78, 0x0f, 0x01, 0xe0, 0x00, 0x70
-};
-
-const uint8_t kMaskRandom45_18[108] = {
-  0x46, 0x48, 0xc9, 0x19, 0x29, 0xb0,
-  0x62, 0x6c, 0x4d, 0x89, 0xf2, 0x10,
-  0x8c, 0x11, 0x82, 0x30, 0x12, 0x20,
-  0x01, 0x60, 0x2c, 0x05, 0xd0, 0x88,
-  0x07, 0x80, 0xf0, 0x1e, 0x0c, 0x18,
-  0xa0, 0x94, 0x12, 0x82, 0x01, 0xc8,
-  0x18, 0xa3, 0x14, 0x62, 0xc5, 0x08,
-  0x91, 0x12, 0x22, 0x44, 0x02, 0x48,
-  0x78, 0x0f, 0x01, 0xe0, 0x00, 0x70,
-  0x0c, 0x81, 0x90, 0x32, 0x10, 0x30,
-  0x80, 0x70, 0x0e, 0x01, 0xc0, 0x18,
-  0xa0, 0x94, 0x12, 0x82, 0x21, 0x20,
-  0x05, 0x40, 0xa8, 0x15, 0x00, 0xc8,
-  0x43, 0x08, 0x61, 0x0c, 0x0a, 0x08,
-  0x1a, 0x03, 0x40, 0x68, 0x05, 0x40,
-  0x60, 0x2c, 0x05, 0x80, 0x9c, 0x00,
-  0x14, 0x22, 0x84, 0x50, 0xe2, 0x80,
-  0xe4, 0xd4, 0x6e, 0x08, 0xc9, 0x58
-};
-
-const uint8_t kMaskRandom45_19[114] = {
-  0x46, 0x48, 0xc9, 0x19, 0x29, 0xb0,
-  0x62, 0x6c, 0x4d, 0x89, 0xf2, 0x10,
-  0x8c, 0x11, 0x82, 0x30, 0x12, 0x20,
-  0x01, 0x60, 0x2c, 0x05, 0xd0, 0x88,
-  0x07, 0x80, 0xf0, 0x1e, 0x0c, 0x18,
-  0xa0, 0x94, 0x12, 0x82, 0x01, 0xc8,
-  0x18, 0xa3, 0x14, 0x62, 0xc5, 0x08,
-  0x91, 0x12, 0x22, 0x44, 0x02, 0x48,
-  0x78, 0x0f, 0x01, 0xe0, 0x00, 0x70,
-  0x64, 0x4c, 0x89, 0x91, 0x28, 0xa0,
-  0x51, 0x4a, 0x29, 0x45, 0x22, 0x88,
-  0xa9, 0x15, 0x22, 0xa4, 0x40, 0x68,
-  0x04, 0xc0, 0x98, 0x13, 0x12, 0x10,
-  0xd0, 0x1a, 0x03, 0x40, 0x05, 0x10,
-  0x82, 0x50, 0x4a, 0x09, 0x00, 0x70,
-  0x21, 0x24, 0x24, 0x84, 0xdc, 0x00,
-  0x0c, 0x21, 0x84, 0x30, 0x84, 0x88,
-  0x4a, 0x09, 0x41, 0x28, 0x2b, 0x00,
-  0x12, 0xa2, 0x54, 0x4a, 0xd1, 0x40
-};
-
-const uint8_t kMaskRandom45_2[12] = {
-  0xec, 0xdd, 0x9b, 0xb3, 0x76, 0x60,
-  0x9b, 0xb3, 0x76, 0x6e, 0xc9, 0xd8
-};
-
-const uint8_t kMaskRandom45_20[120] = {
-  0x64, 0x4c, 0x89, 0x91, 0x28, 0xa0,
-  0x51, 0x4a, 0x29, 0x45, 0x22, 0x88,
-  0xa9, 0x15, 0x22, 0xa4, 0x40, 0x68,
-  0x04, 0xc0, 0x98, 0x13, 0x12, 0x10,
-  0xd0, 0x1a, 0x03, 0x40, 0x05, 0x10,
-  0x82, 0x50, 0x4a, 0x09, 0x00, 0x70,
-  0x21, 0x24, 0x24, 0x84, 0xdc, 0x00,
-  0x0c, 0x21, 0x84, 0x30, 0x84, 0x88,
-  0x4a, 0x09, 0x41, 0x28, 0x2b, 0x00,
-  0x12, 0xa2, 0x54, 0x4a, 0xd1, 0x40,
-  0x46, 0x48, 0xc9, 0x19, 0x29, 0xb0,
-  0x62, 0x6c, 0x4d, 0x89, 0xf2, 0x10,
-  0x8c, 0x11, 0x82, 0x30, 0x12, 0x20,
-  0x01, 0x60, 0x2c, 0x05, 0xd0, 0x88,
-  0x07, 0x80, 0xf0, 0x1e, 0x0c, 0x18,
-  0xa0, 0x94, 0x12, 0x82, 0x01, 0xc8,
-  0x18, 0xa3, 0x14, 0x62, 0xc5, 0x08,
-  0x91, 0x12, 0x22, 0x44, 0x02, 0x48,
-  0x78, 0x0f, 0x01, 0xe0, 0x00, 0x70,
-  0x3b, 0x48, 0xc7, 0x6d, 0x29, 0xe8
-};
-
-const uint8_t kMaskRandom45_21[126] = {
-  0x64, 0x4c, 0x89, 0x91, 0x28, 0xa0,
-  0x51, 0x4a, 0x29, 0x45, 0x22, 0x88,
-  0xa9, 0x15, 0x22, 0xa4, 0x40, 0x68,
-  0x04, 0xc0, 0x98, 0x13, 0x12, 0x10,
-  0xd0, 0x1a, 0x03, 0x40, 0x05, 0x10,
-  0x82, 0x50, 0x4a, 0x09, 0x00, 0x70,
-  0x21, 0x24, 0x24, 0x84, 0xdc, 0x00,
-  0x0c, 0x21, 0x84, 0x30, 0x84, 0x88,
-  0x4a, 0x09, 0x41, 0x28, 0x2b, 0x00,
-  0x12, 0xa2, 0x54, 0x4a, 0xd1, 0x40,
-  0x46, 0x48, 0xc9, 0x19, 0x29, 0xb0,
-  0x33, 0x26, 0x64, 0xcc, 0x90, 0x98,
-  0x99, 0x13, 0x22, 0x64, 0x08, 0x48,
-  0x05, 0x80, 0xb0, 0x16, 0x00, 0x38,
-  0x80, 0xb0, 0x16, 0x02, 0x86, 0x08,
-  0x84, 0x50, 0x8a, 0x11, 0x20, 0x60,
-  0x40, 0x68, 0x0d, 0x01, 0xb5, 0x00,
-  0x0a, 0x81, 0x50, 0x2a, 0x43, 0x00,
-  0x68, 0x0d, 0x01, 0xa0, 0x12, 0x40,
-  0x10, 0x22, 0x04, 0x40, 0xc4, 0x80,
-  0x30, 0x46, 0x08, 0xc1, 0x60, 0x10
-};
-
-const uint8_t kMaskRandom45_22[132] = {
-  0x46, 0x48, 0xc9, 0x19, 0x29, 0xb0,
-  0x33, 0x26, 0x64, 0xcc, 0x90, 0x98,
-  0x99, 0x13, 0x22, 0x64, 0x08, 0x48,
-  0x05, 0x80, 0xb0, 0x16, 0x00, 0x38,
-  0x80, 0xb0, 0x16, 0x02, 0x86, 0x08,
-  0x84, 0x50, 0x8a, 0x11, 0x20, 0x60,
-  0x40, 0x68, 0x0d, 0x01, 0xb5, 0x00,
-  0x0a, 0x81, 0x50, 0x2a, 0x43, 0x00,
-  0x68, 0x0d, 0x01, 0xa0, 0x12, 0x40,
-  0x10, 0x22, 0x04, 0x40, 0xc4, 0x80,
-  0x30, 0x46, 0x08, 0xc1, 0x60, 0x10,
-  0x64, 0x4c, 0x89, 0x91, 0x28, 0xa0,
-  0x51, 0x4a, 0x29, 0x45, 0x22, 0x88,
-  0xa9, 0x15, 0x22, 0xa4, 0x40, 0x68,
-  0x04, 0xc0, 0x98, 0x13, 0x12, 0x10,
-  0xd0, 0x1a, 0x03, 0x40, 0x05, 0x10,
-  0x82, 0x50, 0x4a, 0x09, 0x00, 0x70,
-  0x21, 0x24, 0x24, 0x84, 0xdc, 0x00,
-  0x0c, 0x21, 0x84, 0x30, 0x84, 0x88,
-  0x4a, 0x09, 0x41, 0x28, 0x2b, 0x00,
-  0x12, 0xa2, 0x54, 0x4a, 0xd1, 0x40,
-  0x9e, 0xce, 0x8b, 0xaa, 0x34, 0x68
-};
-
-const uint8_t kMaskRandom45_23[138] = {
-  0x46, 0x48, 0xc9, 0x19, 0x29, 0xb0,
-  0x33, 0x26, 0x64, 0xcc, 0x90, 0x98,
-  0x99, 0x13, 0x22, 0x64, 0x08, 0x48,
-  0x05, 0x80, 0xb0, 0x16, 0x00, 0x38,
-  0x80, 0xb0, 0x16, 0x02, 0x86, 0x08,
-  0x84, 0x50, 0x8a, 0x11, 0x20, 0x60,
-  0x40, 0x68, 0x0d, 0x01, 0xb5, 0x00,
-  0x0a, 0x81, 0x50, 0x2a, 0x43, 0x00,
-  0x68, 0x0d, 0x01, 0xa0, 0x12, 0x40,
-  0x10, 0x22, 0x04, 0x40, 0xc4, 0x80,
-  0x30, 0x46, 0x08, 0xc1, 0x60, 0x10,
-  0x64, 0x4c, 0x89, 0x91, 0x28, 0xa0,
-  0x51, 0x4a, 0x29, 0x45, 0x62, 0x88,
-  0x0c, 0xa1, 0x94, 0x32, 0x90, 0xc0,
-  0xa1, 0x34, 0x26, 0x84, 0x89, 0x18,
-  0x12, 0xa2, 0x54, 0x4a, 0x84, 0x70,
-  0x8a, 0x51, 0x4a, 0x29, 0x17, 0x00,
-  0x86, 0x90, 0xd2, 0x1a, 0x29, 0xb0,
-  0x23, 0x24, 0x64, 0x8c, 0xb2, 0x10,
-  0x16, 0x22, 0xc4, 0x58, 0x86, 0x60,
-  0x4c, 0x29, 0x85, 0x30, 0xc1, 0x50,
-  0x41, 0xc8, 0x39, 0x07, 0x04, 0x98,
-  0xf4, 0x18, 0x9c, 0x65, 0x5b, 0x90
-};
-
-const uint8_t kMaskRandom45_24[144] = {
-  0x64, 0x4c, 0x89, 0x91, 0x28, 0xa0,
-  0x51, 0x4a, 0x29, 0x45, 0x62, 0x88,
-  0x0c, 0xa1, 0x94, 0x32, 0x90, 0xc0,
-  0xa1, 0x34, 0x26, 0x84, 0x89, 0x18,
-  0x12, 0xa2, 0x54, 0x4a, 0x84, 0x70,
-  0x8a, 0x51, 0x4a, 0x29, 0x17, 0x00,
-  0x86, 0x90, 0xd2, 0x1a, 0x29, 0xb0,
-  0x23, 0x24, 0x64, 0x8c, 0xb2, 0x10,
-  0x16, 0x22, 0xc4, 0x58, 0x86, 0x60,
-  0x4c, 0x29, 0x85, 0x30, 0xc1, 0x50,
-  0x41, 0xc8, 0x39, 0x07, 0x04, 0x98,
-  0xf4, 0x18, 0x9c, 0x65, 0x5b, 0x90,
-  0x46, 0x48, 0xc9, 0x19, 0x29, 0xb0,
-  0x33, 0x26, 0x64, 0xcc, 0x90, 0x98,
-  0x99, 0x13, 0x22, 0x64, 0x08, 0x48,
-  0x05, 0x80, 0xb0, 0x16, 0x00, 0x38,
-  0x80, 0xb0, 0x16, 0x02, 0x86, 0x08,
-  0x84, 0x50, 0x8a, 0x11, 0x20, 0x60,
-  0x40, 0x68, 0x0d, 0x01, 0xb5, 0x00,
-  0x0a, 0x81, 0x50, 0x2a, 0x43, 0x00,
-  0x68, 0x0d, 0x01, 0xa0, 0x12, 0x40,
-  0x10, 0x22, 0x04, 0x40, 0xc4, 0x80,
-  0x30, 0x46, 0x08, 0xc1, 0x60, 0x10,
-  0x95, 0x91, 0xad, 0xd9, 0x86, 0x98
-};
-
-const uint8_t kMaskRandom45_25[150] = {
-  0x64, 0x4c, 0x89, 0x91, 0x28, 0xa0,
-  0x51, 0x4a, 0x29, 0x45, 0x62, 0x88,
-  0x0c, 0xa1, 0x94, 0x32, 0x90, 0xc0,
-  0xa1, 0x34, 0x26, 0x84, 0x89, 0x18,
-  0x12, 0xa2, 0x54, 0x4a, 0x84, 0x70,
-  0x8a, 0x51, 0x4a, 0x29, 0x17, 0x00,
-  0x86, 0x90, 0xd2, 0x1a, 0x29, 0xb0,
-  0x23, 0x24, 0x64, 0x8c, 0xb2, 0x10,
-  0x16, 0x22, 0xc4, 0x58, 0x86, 0x60,
-  0x4c, 0x29, 0x85, 0x30, 0xc1, 0x50,
-  0x41, 0xc8, 0x39, 0x07, 0x04, 0x98,
-  0xf4, 0x18, 0x9c, 0x65, 0x5b, 0x90,
-  0x64, 0x4c, 0x89, 0x91, 0x28, 0xa0,
-  0x51, 0x4a, 0x29, 0x45, 0x62, 0x88,
-  0x0c, 0xa1, 0x94, 0x32, 0x90, 0xc0,
-  0xa1, 0x34, 0x26, 0x84, 0x89, 0x18,
-  0x12, 0xa2, 0x54, 0x4a, 0x84, 0x70,
-  0x8a, 0x51, 0x4a, 0x29, 0x17, 0x00,
-  0x46, 0x48, 0xc9, 0x19, 0x29, 0xb0,
-  0x33, 0x26, 0x64, 0xcc, 0x90, 0x98,
-  0x91, 0x92, 0x32, 0x46, 0x48, 0x48,
-  0xa4, 0x34, 0x86, 0x90, 0x81, 0x28,
-  0x50, 0xaa, 0x15, 0x42, 0x83, 0x50,
-  0x84, 0xd0, 0x9a, 0x13, 0x16, 0x00,
-  0x09, 0x61, 0x2c, 0x25, 0xc4, 0x30
-};
-
-const uint8_t kMaskRandom45_26[156] = {
-  0x64, 0x4c, 0x89, 0x91, 0x28, 0xa0,
-  0x51, 0x4a, 0x29, 0x45, 0x62, 0x88,
-  0x0c, 0xa1, 0x94, 0x32, 0x90, 0xc0,
-  0xa1, 0x34, 0x26, 0x84, 0x89, 0x18,
-  0x12, 0xa2, 0x54, 0x4a, 0x84, 0x70,
-  0x8a, 0x51, 0x4a, 0x29, 0x17, 0x00,
-  0x46, 0x48, 0xc9, 0x19, 0x29, 0xb0,
-  0x33, 0x26, 0x64, 0xcc, 0x90, 0x98,
-  0x91, 0x92, 0x32, 0x46, 0x48, 0x48,
-  0xa4, 0x34, 0x86, 0x90, 0x81, 0x28,
-  0x50, 0xaa, 0x15, 0x42, 0x83, 0x50,
-  0x84, 0xd0, 0x9a, 0x13, 0x16, 0x00,
-  0x09, 0x61, 0x2c, 0x25, 0xc4, 0x30,
-  0x64, 0x4c, 0x89, 0x91, 0x28, 0xa0,
-  0x51, 0x4a, 0x29, 0x45, 0x62, 0x88,
-  0x0c, 0xa1, 0x94, 0x32, 0x90, 0xc0,
-  0xa1, 0x34, 0x26, 0x84, 0x89, 0x18,
-  0x12, 0xa2, 0x54, 0x4a, 0x84, 0x70,
-  0x8a, 0x51, 0x4a, 0x29, 0x17, 0x00,
-  0x86, 0x90, 0xd2, 0x1a, 0x29, 0xb0,
-  0x23, 0x24, 0x64, 0x8c, 0xb2, 0x10,
-  0x16, 0x22, 0xc4, 0x58, 0x86, 0x60,
-  0x4c, 0x29, 0x85, 0x30, 0xc1, 0x50,
-  0x41, 0xc8, 0x39, 0x07, 0x04, 0x98,
-  0xf4, 0x18, 0x9c, 0x65, 0x5b, 0x90,
-  0xb0, 0xfd, 0xb2, 0xf3, 0x8a, 0xc0
-};
-
-const uint8_t kMaskRandom45_27[162] = {
-  0x64, 0x4c, 0x89, 0x91, 0x28, 0xa0,
-  0x51, 0x4a, 0x29, 0x45, 0x62, 0x88,
-  0x0c, 0xa1, 0x94, 0x32, 0x90, 0xc0,
-  0xa1, 0x34, 0x26, 0x84, 0x89, 0x18,
-  0x12, 0xa2, 0x54, 0x4a, 0x84, 0x70,
-  0x8a, 0x51, 0x4a, 0x29, 0x17, 0x00,
-  0x46, 0x48, 0xc9, 0x19, 0x29, 0xb0,
-  0x33, 0x26, 0x64, 0xcc, 0x90, 0x98,
-  0x91, 0x92, 0x32, 0x46, 0x48, 0x48,
-  0xa4, 0x34, 0x86, 0x90, 0x81, 0x28,
-  0x50, 0xaa, 0x15, 0x42, 0x83, 0x50,
-  0x84, 0xd0, 0x9a, 0x13, 0x16, 0x00,
-  0x09, 0x61, 0x2c, 0x25, 0xc4, 0x30,
-  0x46, 0x48, 0xc9, 0x19, 0x29, 0xb0,
-  0x33, 0x26, 0x64, 0xcc, 0x90, 0x98,
-  0x91, 0x92, 0x32, 0x46, 0x48, 0x48,
-  0xa4, 0x34, 0x86, 0x90, 0x81, 0x28,
-  0x50, 0xaa, 0x15, 0x42, 0x83, 0x50,
-  0x84, 0xd0, 0x9a, 0x13, 0x16, 0x00,
-  0x09, 0x61, 0x2c, 0x25, 0xc4, 0x30,
-  0x64, 0x4c, 0x89, 0x91, 0x28, 0xa0,
-  0x51, 0x4a, 0x29, 0x45, 0x62, 0x88,
-  0x0c, 0xa1, 0x94, 0x32, 0x90, 0xc0,
-  0xa1, 0x34, 0x26, 0x84, 0x89, 0x18,
-  0x12, 0xa2, 0x54, 0x4a, 0x84, 0x70,
-  0x8a, 0x51, 0x4a, 0x29, 0x17, 0x00,
-  0xc6, 0xca, 0xea, 0x70, 0xfe, 0xc8
-};
-
-const uint8_t kMaskRandom45_28[168] = {
-  0x46, 0x48, 0xc9, 0x19, 0x29, 0xb0,
-  0x33, 0x26, 0x64, 0xcc, 0x90, 0x98,
-  0x91, 0x92, 0x32, 0x46, 0x48, 0x48,
-  0xa4, 0x34, 0x86, 0x90, 0x81, 0x28,
-  0x50, 0xaa, 0x15, 0x42, 0x83, 0x50,
-  0x84, 0xd0, 0x9a, 0x13, 0x16, 0x00,
-  0x09, 0x61, 0x2c, 0x25, 0xc4, 0x30,
-  0x64, 0x4c, 0x89, 0x91, 0x28, 0xa0,
-  0x51, 0x4a, 0x29, 0x45, 0x62, 0x88,
-  0x0c, 0xa1, 0x94, 0x32, 0x90, 0xc0,
-  0xa1, 0x34, 0x26, 0x84, 0x89, 0x18,
-  0x12, 0xa2, 0x54, 0x4a, 0x84, 0x70,
-  0x8a, 0x51, 0x4a, 0x29, 0x17, 0x00,
-  0xc6, 0xca, 0xea, 0x70, 0xfe, 0xc8,
-  0x64, 0x4c, 0x89, 0x91, 0x28, 0xa0,
-  0x51, 0x4a, 0x29, 0x45, 0x62, 0x88,
-  0x0c, 0xa1, 0x94, 0x32, 0x90, 0xc0,
-  0xa1, 0x34, 0x26, 0x84, 0x89, 0x18,
-  0x12, 0xa2, 0x54, 0x4a, 0x84, 0x70,
-  0x8a, 0x51, 0x4a, 0x29, 0x17, 0x00,
-  0x46, 0x48, 0xc9, 0x19, 0x29, 0xb0,
-  0x33, 0x26, 0x64, 0xcc, 0x90, 0x98,
-  0x91, 0x92, 0x32, 0x46, 0x48, 0x48,
-  0xa4, 0x34, 0x86, 0x90, 0x81, 0x28,
-  0x50, 0xaa, 0x15, 0x42, 0x83, 0x50,
-  0x84, 0xd0, 0x9a, 0x13, 0x16, 0x00,
-  0x09, 0x61, 0x2c, 0x25, 0xc4, 0x30,
-  0x44, 0x46, 0x28, 0xfb, 0x66, 0x80
-};
-
-const uint8_t kMaskRandom45_29[174] = {
-  0x46, 0x48, 0xc9, 0x19, 0x29, 0xb0,
-  0x33, 0x26, 0x64, 0xcc, 0x90, 0x98,
-  0x91, 0x92, 0x32, 0x46, 0x48, 0x48,
-  0xa4, 0x34, 0x86, 0x90, 0x81, 0x28,
-  0x50, 0xaa, 0x15, 0x42, 0x83, 0x50,
-  0x84, 0xd0, 0x9a, 0x13, 0x16, 0x00,
-  0x09, 0x61, 0x2c, 0x25, 0xc4, 0x30,
-  0x64, 0x4c, 0x89, 0x91, 0x28, 0xa0,
-  0x51, 0x4a, 0x29, 0x45, 0x62, 0x88,
-  0x0c, 0xa1, 0x94, 0x32, 0x90, 0xc0,
-  0xa1, 0x34, 0x26, 0x84, 0x89, 0x18,
-  0x12, 0xa2, 0x54, 0x4a, 0x84, 0x70,
-  0x8a, 0x51, 0x4a, 0x29, 0x17, 0x00,
-  0xc6, 0xca, 0xea, 0x70, 0xfe, 0xc8,
-  0x46, 0x48, 0xc9, 0x19, 0x29, 0xb0,
-  0x33, 0x26, 0x64, 0xcc, 0x90, 0x98,
-  0x91, 0x92, 0x32, 0x46, 0x48, 0x48,
-  0xa4, 0x34, 0x86, 0x90, 0x81, 0x28,
-  0x50, 0xaa, 0x15, 0x42, 0x83, 0x50,
-  0x84, 0xd0, 0x9a, 0x13, 0x16, 0x00,
-  0x09, 0x61, 0x2c, 0x25, 0xc4, 0x30,
-  0x0c, 0x81, 0x90, 0x32, 0x10, 0x30,
-  0x80, 0x70, 0x0e, 0x01, 0xc0, 0x18,
-  0xa0, 0x94, 0x12, 0x82, 0x21, 0x20,
-  0x05, 0x40, 0xa8, 0x15, 0x00, 0xc8,
-  0x43, 0x08, 0x61, 0x0c, 0x0a, 0x08,
-  0x1a, 0x03, 0x40, 0x68, 0x05, 0x40,
-  0x60, 0x2c, 0x05, 0x80, 0x9c, 0x00,
-  0x14, 0x22, 0x84, 0x50, 0xe2, 0x80
-};
-
-const uint8_t kMaskRandom45_3[18] = {
-  0xca, 0xd9, 0x5b, 0x2b, 0x4d, 0x90,
-  0xf1, 0x5e, 0x2b, 0xc5, 0x24, 0xe8,
-  0xb6, 0x35, 0xc5, 0xd8, 0x9f, 0x40
-};
-
-const uint8_t kMaskRandom45_30[180] = {
-  0x46, 0x48, 0xc9, 0x19, 0x29, 0xb0,
-  0x33, 0x26, 0x64, 0xcc, 0x90, 0x98,
-  0x91, 0x92, 0x32, 0x46, 0x48, 0x48,
-  0xa4, 0x34, 0x86, 0x90, 0x81, 0x28,
-  0x50, 0xaa, 0x15, 0x42, 0x83, 0x50,
-  0x84, 0xd0, 0x9a, 0x13, 0x16, 0x00,
-  0x09, 0x61, 0x2c, 0x25, 0xc4, 0x30,
-  0x0c, 0x81, 0x90, 0x32, 0x10, 0x30,
-  0x80, 0x70, 0x0e, 0x01, 0xc0, 0x18,
-  0xa0, 0x94, 0x12, 0x82, 0x21, 0x20,
-  0x05, 0x40, 0xa8, 0x15, 0x00, 0xc8,
-  0x43, 0x08, 0x61, 0x0c, 0x0a, 0x08,
-  0x1a, 0x03, 0x40, 0x68, 0x05, 0x40,
-  0x60, 0x2c, 0x05, 0x80, 0x9c, 0x00,
-  0x14, 0x22, 0x84, 0x50, 0xe2, 0x80,
-  0x46, 0x48, 0xc9, 0x19, 0x29, 0xb0,
-  0x33, 0x26, 0x64, 0xcc, 0x90, 0x98,
-  0x91, 0x92, 0x32, 0x46, 0x48, 0x48,
-  0xa4, 0x34, 0x86, 0x90, 0x81, 0x28,
-  0x50, 0xaa, 0x15, 0x42, 0x83, 0x50,
-  0x84, 0xd0, 0x9a, 0x13, 0x16, 0x00,
-  0x09, 0x61, 0x2c, 0x25, 0xc4, 0x30,
-  0x64, 0x4c, 0x89, 0x91, 0x28, 0xa0,
-  0x51, 0x4a, 0x29, 0x45, 0x62, 0x88,
-  0x0c, 0xa1, 0x94, 0x32, 0x90, 0xc0,
-  0xa1, 0x34, 0x26, 0x84, 0x89, 0x18,
-  0x12, 0xa2, 0x54, 0x4a, 0x84, 0x70,
-  0x8a, 0x51, 0x4a, 0x29, 0x17, 0x00,
-  0xc6, 0xca, 0xea, 0x70, 0xfe, 0xc8,
-  0x1c, 0xc9, 0x43, 0x25, 0xa7, 0x00
-};
-
-const uint8_t kMaskRandom45_31[186] = {
-  0x46, 0x48, 0xc9, 0x19, 0x29, 0xb0,
-  0x33, 0x26, 0x64, 0xcc, 0x90, 0x98,
-  0x91, 0x92, 0x32, 0x46, 0x48, 0x48,
-  0xa4, 0x34, 0x86, 0x90, 0x81, 0x28,
-  0x50, 0xaa, 0x15, 0x42, 0x83, 0x50,
-  0x84, 0xd0, 0x9a, 0x13, 0x16, 0x00,
-  0x09, 0x61, 0x2c, 0x25, 0xc4, 0x30,
-  0x0c, 0x81, 0x90, 0x32, 0x10, 0x30,
-  0x80, 0x70, 0x0e, 0x01, 0xc0, 0x18,
-  0xa0, 0x94, 0x12, 0x82, 0x21, 0x20,
-  0x05, 0x40, 0xa8, 0x15, 0x00, 0xc8,
-  0x43, 0x08, 0x61, 0x0c, 0x0a, 0x08,
-  0x1a, 0x03, 0x40, 0x68, 0x05, 0x40,
-  0x60, 0x2c, 0x05, 0x80, 0x9c, 0x00,
-  0x14, 0x22, 0x84, 0x50, 0xe2, 0x80,
-  0x0c, 0x81, 0x90, 0x32, 0x10, 0x30,
-  0x80, 0x70, 0x0e, 0x01, 0xc0, 0x18,
-  0xa0, 0x94, 0x12, 0x82, 0x21, 0x20,
-  0x05, 0x40, 0xa8, 0x15, 0x00, 0xc8,
-  0x43, 0x08, 0x61, 0x0c, 0x0a, 0x08,
-  0x1a, 0x03, 0x40, 0x68, 0x05, 0x40,
-  0x60, 0x2c, 0x05, 0x80, 0x9c, 0x00,
-  0x14, 0x22, 0x84, 0x50, 0xe2, 0x80,
-  0x46, 0x48, 0xc9, 0x19, 0x29, 0xb0,
-  0x33, 0x26, 0x64, 0xcc, 0x90, 0x98,
-  0x91, 0x92, 0x32, 0x46, 0x48, 0x48,
-  0xa4, 0x34, 0x86, 0x90, 0x81, 0x28,
-  0x50, 0xaa, 0x15, 0x42, 0x83, 0x50,
-  0x84, 0xd0, 0x9a, 0x13, 0x16, 0x00,
-  0x09, 0x61, 0x2c, 0x25, 0xc4, 0x30,
-  0x86, 0xc1, 0x47, 0xeb, 0x67, 0xd0
-};
-
-const uint8_t kMaskRandom45_32[192] = {
-  0x0c, 0x81, 0x90, 0x32, 0x10, 0x30,
-  0x80, 0x70, 0x0e, 0x01, 0xc0, 0x18,
-  0xa0, 0x94, 0x12, 0x82, 0x21, 0x20,
-  0x05, 0x40, 0xa8, 0x15, 0x00, 0xc8,
-  0x43, 0x08, 0x61, 0x0c, 0x0a, 0x08,
-  0x1a, 0x03, 0x40, 0x68, 0x05, 0x40,
-  0x60, 0x2c, 0x05, 0x80, 0x9c, 0x00,
-  0x14, 0x22, 0x84, 0x50, 0xe2, 0x80,
-  0x46, 0x48, 0xc9, 0x19, 0x29, 0xb0,
-  0x33, 0x26, 0x64, 0xcc, 0x90, 0x98,
-  0x91, 0x92, 0x32, 0x46, 0x48, 0x48,
-  0xa4, 0x34, 0x86, 0x90, 0x81, 0x28,
-  0x50, 0xaa, 0x15, 0x42, 0x83, 0x50,
-  0x84, 0xd0, 0x9a, 0x13, 0x16, 0x00,
-  0x09, 0x61, 0x2c, 0x25, 0xc4, 0x30,
-  0x86, 0xc1, 0x47, 0xeb, 0x67, 0xd0,
-  0x46, 0x48, 0xc9, 0x19, 0x29, 0xb0,
-  0x33, 0x26, 0x64, 0xcc, 0x90, 0x98,
-  0x91, 0x92, 0x32, 0x46, 0x48, 0x48,
-  0xa4, 0x34, 0x86, 0x90, 0x81, 0x28,
-  0x50, 0xaa, 0x15, 0x42, 0x83, 0x50,
-  0x84, 0xd0, 0x9a, 0x13, 0x16, 0x00,
-  0x09, 0x61, 0x2c, 0x25, 0xc4, 0x30,
-  0x0c, 0x81, 0x90, 0x32, 0x10, 0x30,
-  0x80, 0x70, 0x0e, 0x01, 0xc0, 0x18,
-  0xa0, 0x94, 0x12, 0x82, 0x21, 0x20,
-  0x05, 0x40, 0xa8, 0x15, 0x00, 0xc8,
-  0x43, 0x08, 0x61, 0x0c, 0x0a, 0x08,
-  0x1a, 0x03, 0x40, 0x68, 0x05, 0x40,
-  0x60, 0x2c, 0x05, 0x80, 0x9c, 0x00,
-  0x14, 0x22, 0x84, 0x50, 0xe2, 0x80,
-  0x40, 0x7e, 0xc1, 0x30, 0x29, 0x50
-};
-
-const uint8_t kMaskRandom45_33[198] = {
-  0x0c, 0x81, 0x90, 0x32, 0x10, 0x30,
-  0x80, 0x70, 0x0e, 0x01, 0xc0, 0x18,
-  0xa0, 0x94, 0x12, 0x82, 0x21, 0x20,
-  0x05, 0x40, 0xa8, 0x15, 0x00, 0xc8,
-  0x43, 0x08, 0x61, 0x0c, 0x0a, 0x08,
-  0x1a, 0x03, 0x40, 0x68, 0x05, 0x40,
-  0x60, 0x2c, 0x05, 0x80, 0x9c, 0x00,
-  0x14, 0x22, 0x84, 0x50, 0xe2, 0x80,
-  0x46, 0x48, 0xc9, 0x19, 0x29, 0xb0,
-  0x33, 0x26, 0x64, 0xcc, 0x90, 0x98,
-  0x91, 0x92, 0x32, 0x46, 0x48, 0x48,
-  0xa4, 0x34, 0x86, 0x90, 0x81, 0x28,
-  0x50, 0xaa, 0x15, 0x42, 0x83, 0x50,
-  0x84, 0xd0, 0x9a, 0x13, 0x16, 0x00,
-  0x09, 0x61, 0x2c, 0x25, 0xc4, 0x30,
-  0x86, 0xc1, 0x47, 0xeb, 0x67, 0xd0,
-  0x0c, 0x81, 0x90, 0x32, 0x10, 0x30,
-  0x80, 0x70, 0x0e, 0x01, 0xc0, 0x18,
-  0xa0, 0x94, 0x12, 0x82, 0x21, 0x20,
-  0x05, 0x40, 0xa8, 0x15, 0x00, 0xc8,
-  0x43, 0x08, 0x61, 0x0c, 0x0a, 0x08,
-  0x1a, 0x03, 0x40, 0x68, 0x05, 0x40,
-  0x60, 0x2c, 0x05, 0x80, 0x9c, 0x00,
-  0x14, 0x22, 0x84, 0x50, 0xe2, 0x80,
-  0x46, 0x48, 0xc9, 0x19, 0x29, 0xb0,
-  0x62, 0x6c, 0x4d, 0x89, 0xf2, 0x10,
-  0x8c, 0x11, 0x82, 0x30, 0x12, 0x20,
-  0x01, 0x60, 0x2c, 0x05, 0xd0, 0x88,
-  0x07, 0x80, 0xf0, 0x1e, 0x0c, 0x18,
-  0xa0, 0x94, 0x12, 0x82, 0x01, 0xc8,
-  0x18, 0xa3, 0x14, 0x62, 0xc5, 0x08,
-  0x91, 0x12, 0x22, 0x44, 0x02, 0x48,
-  0x78, 0x0f, 0x01, 0xe0, 0x00, 0x70
-};
-
-const uint8_t kMaskRandom45_34[204] = {
-  0x0c, 0x81, 0x90, 0x32, 0x10, 0x30,
-  0x80, 0x70, 0x0e, 0x01, 0xc0, 0x18,
-  0xa0, 0x94, 0x12, 0x82, 0x21, 0x20,
-  0x05, 0x40, 0xa8, 0x15, 0x00, 0xc8,
-  0x43, 0x08, 0x61, 0x0c, 0x0a, 0x08,
-  0x1a, 0x03, 0x40, 0x68, 0x05, 0x40,
-  0x60, 0x2c, 0x05, 0x80, 0x9c, 0x00,
-  0x14, 0x22, 0x84, 0x50, 0xe2, 0x80,
-  0x46, 0x48, 0xc9, 0x19, 0x29, 0xb0,
-  0x62, 0x6c, 0x4d, 0x89, 0xf2, 0x10,
-  0x8c, 0x11, 0x82, 0x30, 0x12, 0x20,
-  0x01, 0x60, 0x2c, 0x05, 0xd0, 0x88,
-  0x07, 0x80, 0xf0, 0x1e, 0x0c, 0x18,
-  0xa0, 0x94, 0x12, 0x82, 0x01, 0xc8,
-  0x18, 0xa3, 0x14, 0x62, 0xc5, 0x08,
-  0x91, 0x12, 0x22, 0x44, 0x02, 0x48,
-  0x78, 0x0f, 0x01, 0xe0, 0x00, 0x70,
-  0x0c, 0x81, 0x90, 0x32, 0x10, 0x30,
-  0x80, 0x70, 0x0e, 0x01, 0xc0, 0x18,
-  0xa0, 0x94, 0x12, 0x82, 0x21, 0x20,
-  0x05, 0x40, 0xa8, 0x15, 0x00, 0xc8,
-  0x43, 0x08, 0x61, 0x0c, 0x0a, 0x08,
-  0x1a, 0x03, 0x40, 0x68, 0x05, 0x40,
-  0x60, 0x2c, 0x05, 0x80, 0x9c, 0x00,
-  0x14, 0x22, 0x84, 0x50, 0xe2, 0x80,
-  0x46, 0x48, 0xc9, 0x19, 0x29, 0xb0,
-  0x33, 0x26, 0x64, 0xcc, 0x90, 0x98,
-  0x91, 0x92, 0x32, 0x46, 0x48, 0x48,
-  0xa4, 0x34, 0x86, 0x90, 0x81, 0x28,
-  0x50, 0xaa, 0x15, 0x42, 0x83, 0x50,
-  0x84, 0xd0, 0x9a, 0x13, 0x16, 0x00,
-  0x09, 0x61, 0x2c, 0x25, 0xc4, 0x30,
-  0x86, 0xc1, 0x47, 0xeb, 0x67, 0xd0,
-  0x1f, 0x78, 0x45, 0x5e, 0x46, 0x50
-};
-
-const uint8_t kMaskRandom45_35[210] = {
-  0x0c, 0x81, 0x90, 0x32, 0x10, 0x30,
-  0x80, 0x70, 0x0e, 0x01, 0xc0, 0x18,
-  0xa0, 0x94, 0x12, 0x82, 0x21, 0x20,
-  0x05, 0x40, 0xa8, 0x15, 0x00, 0xc8,
-  0x43, 0x08, 0x61, 0x0c, 0x0a, 0x08,
-  0x1a, 0x03, 0x40, 0x68, 0x05, 0x40,
-  0x60, 0x2c, 0x05, 0x80, 0x9c, 0x00,
-  0x14, 0x22, 0x84, 0x50, 0xe2, 0x80,
-  0x46, 0x48, 0xc9, 0x19, 0x29, 0xb0,
-  0x62, 0x6c, 0x4d, 0x89, 0xf2, 0x10,
-  0x8c, 0x11, 0x82, 0x30, 0x12, 0x20,
-  0x01, 0x60, 0x2c, 0x05, 0xd0, 0x88,
-  0x07, 0x80, 0xf0, 0x1e, 0x0c, 0x18,
-  0xa0, 0x94, 0x12, 0x82, 0x01, 0xc8,
-  0x18, 0xa3, 0x14, 0x62, 0xc5, 0x08,
-  0x91, 0x12, 0x22, 0x44, 0x02, 0x48,
-  0x78, 0x0f, 0x01, 0xe0, 0x00, 0x70,
-  0x46, 0x48, 0xc9, 0x19, 0x29, 0xb0,
-  0x62, 0x6c, 0x4d, 0x89, 0xf2, 0x10,
-  0x8c, 0x11, 0x82, 0x30, 0x12, 0x20,
-  0x01, 0x60, 0x2c, 0x05, 0xd0, 0x88,
-  0x07, 0x80, 0xf0, 0x1e, 0x0c, 0x18,
-  0xa0, 0x94, 0x12, 0x82, 0x01, 0xc8,
-  0x18, 0xa3, 0x14, 0x62, 0xc5, 0x08,
-  0x91, 0x12, 0x22, 0x44, 0x02, 0x48,
-  0x78, 0x0f, 0x01, 0xe0, 0x00, 0x70,
-  0x0c, 0x81, 0x90, 0x32, 0x10, 0x30,
-  0x80, 0x70, 0x0e, 0x01, 0xc0, 0x18,
-  0xa0, 0x94, 0x12, 0x82, 0x21, 0x20,
-  0x05, 0x40, 0xa8, 0x15, 0x00, 0xc8,
-  0x43, 0x08, 0x61, 0x0c, 0x0a, 0x08,
-  0x1a, 0x03, 0x40, 0x68, 0x05, 0x40,
-  0x60, 0x2c, 0x05, 0x80, 0x9c, 0x00,
-  0x14, 0x22, 0x84, 0x50, 0xe2, 0x80,
-  0xe4, 0xd4, 0x6e, 0x08, 0xc9, 0x58
-};
-
-const uint8_t kMaskRandom45_36[216] = {
-  0x46, 0x48, 0xc9, 0x19, 0x29, 0xb0,
-  0x62, 0x6c, 0x4d, 0x89, 0xf2, 0x10,
-  0x8c, 0x11, 0x82, 0x30, 0x12, 0x20,
-  0x01, 0x60, 0x2c, 0x05, 0xd0, 0x88,
-  0x07, 0x80, 0xf0, 0x1e, 0x0c, 0x18,
-  0xa0, 0x94, 0x12, 0x82, 0x01, 0xc8,
-  0x18, 0xa3, 0x14, 0x62, 0xc5, 0x08,
-  0x91, 0x12, 0x22, 0x44, 0x02, 0x48,
-  0x78, 0x0f, 0x01, 0xe0, 0x00, 0x70,
-  0x0c, 0x81, 0x90, 0x32, 0x10, 0x30,
-  0x80, 0x70, 0x0e, 0x01, 0xc0, 0x18,
-  0xa0, 0x94, 0x12, 0x82, 0x21, 0x20,
-  0x05, 0x40, 0xa8, 0x15, 0x00, 0xc8,
-  0x43, 0x08, 0x61, 0x0c, 0x0a, 0x08,
-  0x1a, 0x03, 0x40, 0x68, 0x05, 0x40,
-  0x60, 0x2c, 0x05, 0x80, 0x9c, 0x00,
-  0x14, 0x22, 0x84, 0x50, 0xe2, 0x80,
-  0xe4, 0xd4, 0x6e, 0x08, 0xc9, 0x58,
-  0x0c, 0x81, 0x90, 0x32, 0x10, 0x30,
-  0x80, 0x70, 0x0e, 0x01, 0xc0, 0x18,
-  0xa0, 0x94, 0x12, 0x82, 0x21, 0x20,
-  0x05, 0x40, 0xa8, 0x15, 0x00, 0xc8,
-  0x43, 0x08, 0x61, 0x0c, 0x0a, 0x08,
-  0x1a, 0x03, 0x40, 0x68, 0x05, 0x40,
-  0x60, 0x2c, 0x05, 0x80, 0x9c, 0x00,
-  0x14, 0x22, 0x84, 0x50, 0xe2, 0x80,
-  0x46, 0x48, 0xc9, 0x19, 0x29, 0xb0,
-  0x62, 0x6c, 0x4d, 0x89, 0xf2, 0x10,
-  0x8c, 0x11, 0x82, 0x30, 0x12, 0x20,
-  0x01, 0x60, 0x2c, 0x05, 0xd0, 0x88,
-  0x07, 0x80, 0xf0, 0x1e, 0x0c, 0x18,
-  0xa0, 0x94, 0x12, 0x82, 0x01, 0xc8,
-  0x18, 0xa3, 0x14, 0x62, 0xc5, 0x08,
-  0x91, 0x12, 0x22, 0x44, 0x02, 0x48,
-  0x78, 0x0f, 0x01, 0xe0, 0x00, 0x70,
-  0xd0, 0x1a, 0xf0, 0x14, 0xf0, 0xe8
-};
-
-const uint8_t kMaskRandom45_37[222] = {
-  0x46, 0x48, 0xc9, 0x19, 0x29, 0xb0,
-  0x62, 0x6c, 0x4d, 0x89, 0xf2, 0x10,
-  0x8c, 0x11, 0x82, 0x30, 0x12, 0x20,
-  0x01, 0x60, 0x2c, 0x05, 0xd0, 0x88,
-  0x07, 0x80, 0xf0, 0x1e, 0x0c, 0x18,
-  0xa0, 0x94, 0x12, 0x82, 0x01, 0xc8,
-  0x18, 0xa3, 0x14, 0x62, 0xc5, 0x08,
-  0x91, 0x12, 0x22, 0x44, 0x02, 0x48,
-  0x78, 0x0f, 0x01, 0xe0, 0x00, 0x70,
-  0x0c, 0x81, 0x90, 0x32, 0x10, 0x30,
-  0x80, 0x70, 0x0e, 0x01, 0xc0, 0x18,
-  0xa0, 0x94, 0x12, 0x82, 0x21, 0x20,
-  0x05, 0x40, 0xa8, 0x15, 0x00, 0xc8,
-  0x43, 0x08, 0x61, 0x0c, 0x0a, 0x08,
-  0x1a, 0x03, 0x40, 0x68, 0x05, 0x40,
-  0x60, 0x2c, 0x05, 0x80, 0x9c, 0x00,
-  0x14, 0x22, 0x84, 0x50, 0xe2, 0x80,
-  0xe4, 0xd4, 0x6e, 0x08, 0xc9, 0x58,
-  0x46, 0x48, 0xc9, 0x19, 0x29, 0xb0,
-  0x62, 0x6c, 0x4d, 0x89, 0xf2, 0x10,
-  0x8c, 0x11, 0x82, 0x30, 0x12, 0x20,
-  0x01, 0x60, 0x2c, 0x05, 0xd0, 0x88,
-  0x07, 0x80, 0xf0, 0x1e, 0x0c, 0x18,
-  0xa0, 0x94, 0x12, 0x82, 0x01, 0xc8,
-  0x18, 0xa3, 0x14, 0x62, 0xc5, 0x08,
-  0x91, 0x12, 0x22, 0x44, 0x02, 0x48,
-  0x78, 0x0f, 0x01, 0xe0, 0x00, 0x70,
-  0x64, 0x4c, 0x89, 0x91, 0x28, 0xa0,
-  0x51, 0x4a, 0x29, 0x45, 0x22, 0x88,
-  0xa9, 0x15, 0x22, 0xa4, 0x40, 0x68,
-  0x04, 0xc0, 0x98, 0x13, 0x12, 0x10,
-  0xd0, 0x1a, 0x03, 0x40, 0x05, 0x10,
-  0x82, 0x50, 0x4a, 0x09, 0x00, 0x70,
-  0x21, 0x24, 0x24, 0x84, 0xdc, 0x00,
-  0x0c, 0x21, 0x84, 0x30, 0x84, 0x88,
-  0x4a, 0x09, 0x41, 0x28, 0x2b, 0x00,
-  0x12, 0xa2, 0x54, 0x4a, 0xd1, 0x40
-};
-
-const uint8_t kMaskRandom45_38[228] = {
-  0x46, 0x48, 0xc9, 0x19, 0x29, 0xb0,
-  0x62, 0x6c, 0x4d, 0x89, 0xf2, 0x10,
-  0x8c, 0x11, 0x82, 0x30, 0x12, 0x20,
-  0x01, 0x60, 0x2c, 0x05, 0xd0, 0x88,
-  0x07, 0x80, 0xf0, 0x1e, 0x0c, 0x18,
-  0xa0, 0x94, 0x12, 0x82, 0x01, 0xc8,
-  0x18, 0xa3, 0x14, 0x62, 0xc5, 0x08,
-  0x91, 0x12, 0x22, 0x44, 0x02, 0x48,
-  0x78, 0x0f, 0x01, 0xe0, 0x00, 0x70,
-  0x64, 0x4c, 0x89, 0x91, 0x28, 0xa0,
-  0x51, 0x4a, 0x29, 0x45, 0x22, 0x88,
-  0xa9, 0x15, 0x22, 0xa4, 0x40, 0x68,
-  0x04, 0xc0, 0x98, 0x13, 0x12, 0x10,
-  0xd0, 0x1a, 0x03, 0x40, 0x05, 0x10,
-  0x82, 0x50, 0x4a, 0x09, 0x00, 0x70,
-  0x21, 0x24, 0x24, 0x84, 0xdc, 0x00,
-  0x0c, 0x21, 0x84, 0x30, 0x84, 0x88,
-  0x4a, 0x09, 0x41, 0x28, 0x2b, 0x00,
-  0x12, 0xa2, 0x54, 0x4a, 0xd1, 0x40,
-  0x46, 0x48, 0xc9, 0x19, 0x29, 0xb0,
-  0x62, 0x6c, 0x4d, 0x89, 0xf2, 0x10,
-  0x8c, 0x11, 0x82, 0x30, 0x12, 0x20,
-  0x01, 0x60, 0x2c, 0x05, 0xd0, 0x88,
-  0x07, 0x80, 0xf0, 0x1e, 0x0c, 0x18,
-  0xa0, 0x94, 0x12, 0x82, 0x01, 0xc8,
-  0x18, 0xa3, 0x14, 0x62, 0xc5, 0x08,
-  0x91, 0x12, 0x22, 0x44, 0x02, 0x48,
-  0x78, 0x0f, 0x01, 0xe0, 0x00, 0x70,
-  0x0c, 0x81, 0x90, 0x32, 0x10, 0x30,
-  0x80, 0x70, 0x0e, 0x01, 0xc0, 0x18,
-  0xa0, 0x94, 0x12, 0x82, 0x21, 0x20,
-  0x05, 0x40, 0xa8, 0x15, 0x00, 0xc8,
-  0x43, 0x08, 0x61, 0x0c, 0x0a, 0x08,
-  0x1a, 0x03, 0x40, 0x68, 0x05, 0x40,
-  0x60, 0x2c, 0x05, 0x80, 0x9c, 0x00,
-  0x14, 0x22, 0x84, 0x50, 0xe2, 0x80,
-  0xe4, 0xd4, 0x6e, 0x08, 0xc9, 0x58,
-  0x04, 0x67, 0x1b, 0xba, 0x1d, 0xa0
-};
-
-const uint8_t kMaskRandom45_39[234] = {
-  0x46, 0x48, 0xc9, 0x19, 0x29, 0xb0,
-  0x62, 0x6c, 0x4d, 0x89, 0xf2, 0x10,
-  0x8c, 0x11, 0x82, 0x30, 0x12, 0x20,
-  0x01, 0x60, 0x2c, 0x05, 0xd0, 0x88,
-  0x07, 0x80, 0xf0, 0x1e, 0x0c, 0x18,
-  0xa0, 0x94, 0x12, 0x82, 0x01, 0xc8,
-  0x18, 0xa3, 0x14, 0x62, 0xc5, 0x08,
-  0x91, 0x12, 0x22, 0x44, 0x02, 0x48,
-  0x78, 0x0f, 0x01, 0xe0, 0x00, 0x70,
-  0x64, 0x4c, 0x89, 0x91, 0x28, 0xa0,
-  0x51, 0x4a, 0x29, 0x45, 0x22, 0x88,
-  0xa9, 0x15, 0x22, 0xa4, 0x40, 0x68,
-  0x04, 0xc0, 0x98, 0x13, 0x12, 0x10,
-  0xd0, 0x1a, 0x03, 0x40, 0x05, 0x10,
-  0x82, 0x50, 0x4a, 0x09, 0x00, 0x70,
-  0x21, 0x24, 0x24, 0x84, 0xdc, 0x00,
-  0x0c, 0x21, 0x84, 0x30, 0x84, 0x88,
-  0x4a, 0x09, 0x41, 0x28, 0x2b, 0x00,
-  0x12, 0xa2, 0x54, 0x4a, 0xd1, 0x40,
-  0x64, 0x4c, 0x89, 0x91, 0x28, 0xa0,
-  0x51, 0x4a, 0x29, 0x45, 0x22, 0x88,
-  0xa9, 0x15, 0x22, 0xa4, 0x40, 0x68,
-  0x04, 0xc0, 0x98, 0x13, 0x12, 0x10,
-  0xd0, 0x1a, 0x03, 0x40, 0x05, 0x10,
-  0x82, 0x50, 0x4a, 0x09, 0x00, 0x70,
-  0x21, 0x24, 0x24, 0x84, 0xdc, 0x00,
-  0x0c, 0x21, 0x84, 0x30, 0x84, 0x88,
-  0x4a, 0x09, 0x41, 0x28, 0x2b, 0x00,
-  0x12, 0xa2, 0x54, 0x4a, 0xd1, 0x40,
-  0x46, 0x48, 0xc9, 0x19, 0x29, 0xb0,
-  0x62, 0x6c, 0x4d, 0x89, 0xf2, 0x10,
-  0x8c, 0x11, 0x82, 0x30, 0x12, 0x20,
-  0x01, 0x60, 0x2c, 0x05, 0xd0, 0x88,
-  0x07, 0x80, 0xf0, 0x1e, 0x0c, 0x18,
-  0xa0, 0x94, 0x12, 0x82, 0x01, 0xc8,
-  0x18, 0xa3, 0x14, 0x62, 0xc5, 0x08,
-  0x91, 0x12, 0x22, 0x44, 0x02, 0x48,
-  0x78, 0x0f, 0x01, 0xe0, 0x00, 0x70,
-  0x3b, 0x48, 0xc7, 0x6d, 0x29, 0xe8
-};
-
-const uint8_t kMaskRandom45_4[24] = {
-  0xc4, 0xd8, 0x9b, 0x13, 0x45, 0x90,
-  0x31, 0x66, 0x2c, 0xc5, 0x8a, 0x58,
-  0x4b, 0x29, 0x65, 0x2c, 0x91, 0x68,
-  0x2c, 0xa5, 0x94, 0xb2, 0xa2, 0xa8
-};
-
-const uint8_t kMaskRandom45_40[240] = {
-  0x64, 0x4c, 0x89, 0x91, 0x28, 0xa0,
-  0x51, 0x4a, 0x29, 0x45, 0x22, 0x88,
-  0xa9, 0x15, 0x22, 0xa4, 0x40, 0x68,
-  0x04, 0xc0, 0x98, 0x13, 0x12, 0x10,
-  0xd0, 0x1a, 0x03, 0x40, 0x05, 0x10,
-  0x82, 0x50, 0x4a, 0x09, 0x00, 0x70,
-  0x21, 0x24, 0x24, 0x84, 0xdc, 0x00,
-  0x0c, 0x21, 0x84, 0x30, 0x84, 0x88,
-  0x4a, 0x09, 0x41, 0x28, 0x2b, 0x00,
-  0x12, 0xa2, 0x54, 0x4a, 0xd1, 0x40,
-  0x46, 0x48, 0xc9, 0x19, 0x29, 0xb0,
-  0x62, 0x6c, 0x4d, 0x89, 0xf2, 0x10,
-  0x8c, 0x11, 0x82, 0x30, 0x12, 0x20,
-  0x01, 0x60, 0x2c, 0x05, 0xd0, 0x88,
-  0x07, 0x80, 0xf0, 0x1e, 0x0c, 0x18,
-  0xa0, 0x94, 0x12, 0x82, 0x01, 0xc8,
-  0x18, 0xa3, 0x14, 0x62, 0xc5, 0x08,
-  0x91, 0x12, 0x22, 0x44, 0x02, 0x48,
-  0x78, 0x0f, 0x01, 0xe0, 0x00, 0x70,
-  0x3b, 0x48, 0xc7, 0x6d, 0x29, 0xe8,
-  0x46, 0x48, 0xc9, 0x19, 0x29, 0xb0,
-  0x62, 0x6c, 0x4d, 0x89, 0xf2, 0x10,
-  0x8c, 0x11, 0x82, 0x30, 0x12, 0x20,
-  0x01, 0x60, 0x2c, 0x05, 0xd0, 0x88,
-  0x07, 0x80, 0xf0, 0x1e, 0x0c, 0x18,
-  0xa0, 0x94, 0x12, 0x82, 0x01, 0xc8,
-  0x18, 0xa3, 0x14, 0x62, 0xc5, 0x08,
-  0x91, 0x12, 0x22, 0x44, 0x02, 0x48,
-  0x78, 0x0f, 0x01, 0xe0, 0x00, 0x70,
-  0x64, 0x4c, 0x89, 0x91, 0x28, 0xa0,
-  0x51, 0x4a, 0x29, 0x45, 0x22, 0x88,
-  0xa9, 0x15, 0x22, 0xa4, 0x40, 0x68,
-  0x04, 0xc0, 0x98, 0x13, 0x12, 0x10,
-  0xd0, 0x1a, 0x03, 0x40, 0x05, 0x10,
-  0x82, 0x50, 0x4a, 0x09, 0x00, 0x70,
-  0x21, 0x24, 0x24, 0x84, 0xdc, 0x00,
-  0x0c, 0x21, 0x84, 0x30, 0x84, 0x88,
-  0x4a, 0x09, 0x41, 0x28, 0x2b, 0x00,
-  0x12, 0xa2, 0x54, 0x4a, 0xd1, 0x40,
-  0xd9, 0x40, 0x46, 0xe6, 0x4f, 0xd8
-};
-
-const uint8_t kMaskRandom45_41[246] = {
-  0x64, 0x4c, 0x89, 0x91, 0x28, 0xa0,
-  0x51, 0x4a, 0x29, 0x45, 0x22, 0x88,
-  0xa9, 0x15, 0x22, 0xa4, 0x40, 0x68,
-  0x04, 0xc0, 0x98, 0x13, 0x12, 0x10,
-  0xd0, 0x1a, 0x03, 0x40, 0x05, 0x10,
-  0x82, 0x50, 0x4a, 0x09, 0x00, 0x70,
-  0x21, 0x24, 0x24, 0x84, 0xdc, 0x00,
-  0x0c, 0x21, 0x84, 0x30, 0x84, 0x88,
-  0x4a, 0x09, 0x41, 0x28, 0x2b, 0x00,
-  0x12, 0xa2, 0x54, 0x4a, 0xd1, 0x40,
-  0x46, 0x48, 0xc9, 0x19, 0x29, 0xb0,
-  0x62, 0x6c, 0x4d, 0x89, 0xf2, 0x10,
-  0x8c, 0x11, 0x82, 0x30, 0x12, 0x20,
-  0x01, 0x60, 0x2c, 0x05, 0xd0, 0x88,
-  0x07, 0x80, 0xf0, 0x1e, 0x0c, 0x18,
-  0xa0, 0x94, 0x12, 0x82, 0x01, 0xc8,
-  0x18, 0xa3, 0x14, 0x62, 0xc5, 0x08,
-  0x91, 0x12, 0x22, 0x44, 0x02, 0x48,
-  0x78, 0x0f, 0x01, 0xe0, 0x00, 0x70,
-  0x3b, 0x48, 0xc7, 0x6d, 0x29, 0xe8,
-  0x64, 0x4c, 0x89, 0x91, 0x28, 0xa0,
-  0x51, 0x4a, 0x29, 0x45, 0x22, 0x88,
-  0xa9, 0x15, 0x22, 0xa4, 0x40, 0x68,
-  0x04, 0xc0, 0x98, 0x13, 0x12, 0x10,
-  0xd0, 0x1a, 0x03, 0x40, 0x05, 0x10,
-  0x82, 0x50, 0x4a, 0x09, 0x00, 0x70,
-  0x21, 0x24, 0x24, 0x84, 0xdc, 0x00,
-  0x0c, 0x21, 0x84, 0x30, 0x84, 0x88,
-  0x4a, 0x09, 0x41, 0x28, 0x2b, 0x00,
-  0x12, 0xa2, 0x54, 0x4a, 0xd1, 0x40,
-  0x46, 0x48, 0xc9, 0x19, 0x29, 0xb0,
-  0x33, 0x26, 0x64, 0xcc, 0x90, 0x98,
-  0x99, 0x13, 0x22, 0x64, 0x08, 0x48,
-  0x05, 0x80, 0xb0, 0x16, 0x00, 0x38,
-  0x80, 0xb0, 0x16, 0x02, 0x86, 0x08,
-  0x84, 0x50, 0x8a, 0x11, 0x20, 0x60,
-  0x40, 0x68, 0x0d, 0x01, 0xb5, 0x00,
-  0x0a, 0x81, 0x50, 0x2a, 0x43, 0x00,
-  0x68, 0x0d, 0x01, 0xa0, 0x12, 0x40,
-  0x10, 0x22, 0x04, 0x40, 0xc4, 0x80,
-  0x30, 0x46, 0x08, 0xc1, 0x60, 0x10
-};
-
-const uint8_t kMaskRandom45_42[252] = {
-  0x64, 0x4c, 0x89, 0x91, 0x28, 0xa0,
-  0x51, 0x4a, 0x29, 0x45, 0x22, 0x88,
-  0xa9, 0x15, 0x22, 0xa4, 0x40, 0x68,
-  0x04, 0xc0, 0x98, 0x13, 0x12, 0x10,
-  0xd0, 0x1a, 0x03, 0x40, 0x05, 0x10,
-  0x82, 0x50, 0x4a, 0x09, 0x00, 0x70,
-  0x21, 0x24, 0x24, 0x84, 0xdc, 0x00,
-  0x0c, 0x21, 0x84, 0x30, 0x84, 0x88,
-  0x4a, 0x09, 0x41, 0x28, 0x2b, 0x00,
-  0x12, 0xa2, 0x54, 0x4a, 0xd1, 0x40,
-  0x46, 0x48, 0xc9, 0x19, 0x29, 0xb0,
-  0x33, 0x26, 0x64, 0xcc, 0x90, 0x98,
-  0x99, 0x13, 0x22, 0x64, 0x08, 0x48,
-  0x05, 0x80, 0xb0, 0x16, 0x00, 0x38,
-  0x80, 0xb0, 0x16, 0x02, 0x86, 0x08,
-  0x84, 0x50, 0x8a, 0x11, 0x20, 0x60,
-  0x40, 0x68, 0x0d, 0x01, 0xb5, 0x00,
-  0x0a, 0x81, 0x50, 0x2a, 0x43, 0x00,
-  0x68, 0x0d, 0x01, 0xa0, 0x12, 0x40,
-  0x10, 0x22, 0x04, 0x40, 0xc4, 0x80,
-  0x30, 0x46, 0x08, 0xc1, 0x60, 0x10,
-  0x64, 0x4c, 0x89, 0x91, 0x28, 0xa0,
-  0x51, 0x4a, 0x29, 0x45, 0x22, 0x88,
-  0xa9, 0x15, 0x22, 0xa4, 0x40, 0x68,
-  0x04, 0xc0, 0x98, 0x13, 0x12, 0x10,
-  0xd0, 0x1a, 0x03, 0x40, 0x05, 0x10,
-  0x82, 0x50, 0x4a, 0x09, 0x00, 0x70,
-  0x21, 0x24, 0x24, 0x84, 0xdc, 0x00,
-  0x0c, 0x21, 0x84, 0x30, 0x84, 0x88,
-  0x4a, 0x09, 0x41, 0x28, 0x2b, 0x00,
-  0x12, 0xa2, 0x54, 0x4a, 0xd1, 0x40,
-  0x46, 0x48, 0xc9, 0x19, 0x29, 0xb0,
-  0x62, 0x6c, 0x4d, 0x89, 0xf2, 0x10,
-  0x8c, 0x11, 0x82, 0x30, 0x12, 0x20,
-  0x01, 0x60, 0x2c, 0x05, 0xd0, 0x88,
-  0x07, 0x80, 0xf0, 0x1e, 0x0c, 0x18,
-  0xa0, 0x94, 0x12, 0x82, 0x01, 0xc8,
-  0x18, 0xa3, 0x14, 0x62, 0xc5, 0x08,
-  0x91, 0x12, 0x22, 0x44, 0x02, 0x48,
-  0x78, 0x0f, 0x01, 0xe0, 0x00, 0x70,
-  0x3b, 0x48, 0xc7, 0x6d, 0x29, 0xe8,
-  0xac, 0xcc, 0x04, 0x41, 0x97, 0x30
-};
-
-const uint8_t kMaskRandom45_43[258] = {
-  0x64, 0x4c, 0x89, 0x91, 0x28, 0xa0,
-  0x51, 0x4a, 0x29, 0x45, 0x22, 0x88,
-  0xa9, 0x15, 0x22, 0xa4, 0x40, 0x68,
-  0x04, 0xc0, 0x98, 0x13, 0x12, 0x10,
-  0xd0, 0x1a, 0x03, 0x40, 0x05, 0x10,
-  0x82, 0x50, 0x4a, 0x09, 0x00, 0x70,
-  0x21, 0x24, 0x24, 0x84, 0xdc, 0x00,
-  0x0c, 0x21, 0x84, 0x30, 0x84, 0x88,
-  0x4a, 0x09, 0x41, 0x28, 0x2b, 0x00,
-  0x12, 0xa2, 0x54, 0x4a, 0xd1, 0x40,
-  0x46, 0x48, 0xc9, 0x19, 0x29, 0xb0,
-  0x33, 0x26, 0x64, 0xcc, 0x90, 0x98,
-  0x99, 0x13, 0x22, 0x64, 0x08, 0x48,
-  0x05, 0x80, 0xb0, 0x16, 0x00, 0x38,
-  0x80, 0xb0, 0x16, 0x02, 0x86, 0x08,
-  0x84, 0x50, 0x8a, 0x11, 0x20, 0x60,
-  0x40, 0x68, 0x0d, 0x01, 0xb5, 0x00,
-  0x0a, 0x81, 0x50, 0x2a, 0x43, 0x00,
-  0x68, 0x0d, 0x01, 0xa0, 0x12, 0x40,
-  0x10, 0x22, 0x04, 0x40, 0xc4, 0x80,
-  0x30, 0x46, 0x08, 0xc1, 0x60, 0x10,
-  0x46, 0x48, 0xc9, 0x19, 0x29, 0xb0,
-  0x33, 0x26, 0x64, 0xcc, 0x90, 0x98,
-  0x99, 0x13, 0x22, 0x64, 0x08, 0x48,
-  0x05, 0x80, 0xb0, 0x16, 0x00, 0x38,
-  0x80, 0xb0, 0x16, 0x02, 0x86, 0x08,
-  0x84, 0x50, 0x8a, 0x11, 0x20, 0x60,
-  0x40, 0x68, 0x0d, 0x01, 0xb5, 0x00,
-  0x0a, 0x81, 0x50, 0x2a, 0x43, 0x00,
-  0x68, 0x0d, 0x01, 0xa0, 0x12, 0x40,
-  0x10, 0x22, 0x04, 0x40, 0xc4, 0x80,
-  0x30, 0x46, 0x08, 0xc1, 0x60, 0x10,
-  0x64, 0x4c, 0x89, 0x91, 0x28, 0xa0,
-  0x51, 0x4a, 0x29, 0x45, 0x22, 0x88,
-  0xa9, 0x15, 0x22, 0xa4, 0x40, 0x68,
-  0x04, 0xc0, 0x98, 0x13, 0x12, 0x10,
-  0xd0, 0x1a, 0x03, 0x40, 0x05, 0x10,
-  0x82, 0x50, 0x4a, 0x09, 0x00, 0x70,
-  0x21, 0x24, 0x24, 0x84, 0xdc, 0x00,
-  0x0c, 0x21, 0x84, 0x30, 0x84, 0x88,
-  0x4a, 0x09, 0x41, 0x28, 0x2b, 0x00,
-  0x12, 0xa2, 0x54, 0x4a, 0xd1, 0x40,
-  0x9e, 0xce, 0x8b, 0xaa, 0x34, 0x68
-};
-
-const uint8_t kMaskRandom45_44[264] = {
-  0x46, 0x48, 0xc9, 0x19, 0x29, 0xb0,
-  0x33, 0x26, 0x64, 0xcc, 0x90, 0x98,
-  0x99, 0x13, 0x22, 0x64, 0x08, 0x48,
-  0x05, 0x80, 0xb0, 0x16, 0x00, 0x38,
-  0x80, 0xb0, 0x16, 0x02, 0x86, 0x08,
-  0x84, 0x50, 0x8a, 0x11, 0x20, 0x60,
-  0x40, 0x68, 0x0d, 0x01, 0xb5, 0x00,
-  0x0a, 0x81, 0x50, 0x2a, 0x43, 0x00,
-  0x68, 0x0d, 0x01, 0xa0, 0x12, 0x40,
-  0x10, 0x22, 0x04, 0x40, 0xc4, 0x80,
-  0x30, 0x46, 0x08, 0xc1, 0x60, 0x10,
-  0x64, 0x4c, 0x89, 0x91, 0x28, 0xa0,
-  0x51, 0x4a, 0x29, 0x45, 0x22, 0x88,
-  0xa9, 0x15, 0x22, 0xa4, 0x40, 0x68,
-  0x04, 0xc0, 0x98, 0x13, 0x12, 0x10,
-  0xd0, 0x1a, 0x03, 0x40, 0x05, 0x10,
-  0x82, 0x50, 0x4a, 0x09, 0x00, 0x70,
-  0x21, 0x24, 0x24, 0x84, 0xdc, 0x00,
-  0x0c, 0x21, 0x84, 0x30, 0x84, 0x88,
-  0x4a, 0x09, 0x41, 0x28, 0x2b, 0x00,
-  0x12, 0xa2, 0x54, 0x4a, 0xd1, 0x40,
-  0x9e, 0xce, 0x8b, 0xaa, 0x34, 0x68,
-  0x64, 0x4c, 0x89, 0x91, 0x28, 0xa0,
-  0x51, 0x4a, 0x29, 0x45, 0x22, 0x88,
-  0xa9, 0x15, 0x22, 0xa4, 0x40, 0x68,
-  0x04, 0xc0, 0x98, 0x13, 0x12, 0x10,
-  0xd0, 0x1a, 0x03, 0x40, 0x05, 0x10,
-  0x82, 0x50, 0x4a, 0x09, 0x00, 0x70,
-  0x21, 0x24, 0x24, 0x84, 0xdc, 0x00,
-  0x0c, 0x21, 0x84, 0x30, 0x84, 0x88,
-  0x4a, 0x09, 0x41, 0x28, 0x2b, 0x00,
-  0x12, 0xa2, 0x54, 0x4a, 0xd1, 0x40,
-  0x46, 0x48, 0xc9, 0x19, 0x29, 0xb0,
-  0x33, 0x26, 0x64, 0xcc, 0x90, 0x98,
-  0x99, 0x13, 0x22, 0x64, 0x08, 0x48,
-  0x05, 0x80, 0xb0, 0x16, 0x00, 0x38,
-  0x80, 0xb0, 0x16, 0x02, 0x86, 0x08,
-  0x84, 0x50, 0x8a, 0x11, 0x20, 0x60,
-  0x40, 0x68, 0x0d, 0x01, 0xb5, 0x00,
-  0x0a, 0x81, 0x50, 0x2a, 0x43, 0x00,
-  0x68, 0x0d, 0x01, 0xa0, 0x12, 0x40,
-  0x10, 0x22, 0x04, 0x40, 0xc4, 0x80,
-  0x30, 0x46, 0x08, 0xc1, 0x60, 0x10,
-  0xf8, 0x40, 0xe3, 0x2e, 0x16, 0x00
-};
-
-const uint8_t kMaskRandom45_45[270] = {
-  0x46, 0x48, 0xc9, 0x19, 0x29, 0xb0,
-  0x33, 0x26, 0x64, 0xcc, 0x90, 0x98,
-  0x99, 0x13, 0x22, 0x64, 0x08, 0x48,
-  0x05, 0x80, 0xb0, 0x16, 0x00, 0x38,
-  0x80, 0xb0, 0x16, 0x02, 0x86, 0x08,
-  0x84, 0x50, 0x8a, 0x11, 0x20, 0x60,
-  0x40, 0x68, 0x0d, 0x01, 0xb5, 0x00,
-  0x0a, 0x81, 0x50, 0x2a, 0x43, 0x00,
-  0x68, 0x0d, 0x01, 0xa0, 0x12, 0x40,
-  0x10, 0x22, 0x04, 0x40, 0xc4, 0x80,
-  0x30, 0x46, 0x08, 0xc1, 0x60, 0x10,
-  0x64, 0x4c, 0x89, 0x91, 0x28, 0xa0,
-  0x51, 0x4a, 0x29, 0x45, 0x22, 0x88,
-  0xa9, 0x15, 0x22, 0xa4, 0x40, 0x68,
-  0x04, 0xc0, 0x98, 0x13, 0x12, 0x10,
-  0xd0, 0x1a, 0x03, 0x40, 0x05, 0x10,
-  0x82, 0x50, 0x4a, 0x09, 0x00, 0x70,
-  0x21, 0x24, 0x24, 0x84, 0xdc, 0x00,
-  0x0c, 0x21, 0x84, 0x30, 0x84, 0x88,
-  0x4a, 0x09, 0x41, 0x28, 0x2b, 0x00,
-  0x12, 0xa2, 0x54, 0x4a, 0xd1, 0x40,
-  0x9e, 0xce, 0x8b, 0xaa, 0x34, 0x68,
-  0x46, 0x48, 0xc9, 0x19, 0x29, 0xb0,
-  0x33, 0x26, 0x64, 0xcc, 0x90, 0x98,
-  0x99, 0x13, 0x22, 0x64, 0x08, 0x48,
-  0x05, 0x80, 0xb0, 0x16, 0x00, 0x38,
-  0x80, 0xb0, 0x16, 0x02, 0x86, 0x08,
-  0x84, 0x50, 0x8a, 0x11, 0x20, 0x60,
-  0x40, 0x68, 0x0d, 0x01, 0xb5, 0x00,
-  0x0a, 0x81, 0x50, 0x2a, 0x43, 0x00,
-  0x68, 0x0d, 0x01, 0xa0, 0x12, 0x40,
-  0x10, 0x22, 0x04, 0x40, 0xc4, 0x80,
-  0x30, 0x46, 0x08, 0xc1, 0x60, 0x10,
-  0x64, 0x4c, 0x89, 0x19, 0x08, 0x30,
-  0x51, 0x4a, 0x28, 0xcc, 0x81, 0x18,
-  0xa9, 0x15, 0x22, 0x64, 0x20, 0x28,
-  0x04, 0xc0, 0x98, 0x16, 0x10, 0xc0,
-  0xd0, 0x1a, 0x02, 0x02, 0xc0, 0x88,
-  0x82, 0x50, 0x4a, 0x11, 0x0a, 0x40,
-  0x21, 0x24, 0x25, 0x01, 0xcc, 0x00,
-  0x0c, 0x21, 0x84, 0x2a, 0x04, 0x48,
-  0x4a, 0x09, 0x41, 0xa0, 0x31, 0x00,
-  0x12, 0xa2, 0x54, 0x40, 0x92, 0x10,
-  0x9e, 0xce, 0x88, 0xc1, 0x45, 0x00,
-  0xfb, 0x97, 0x5d, 0x7d, 0x42, 0x20
-};
-
-const uint8_t kMaskRandom45_5[30] = {
-  0xc6, 0xd8, 0xdb, 0x1b, 0x29, 0xb0,
-  0x63, 0x6c, 0x6d, 0x8d, 0xb2, 0x58,
-  0x1d, 0xa3, 0xb4, 0x76, 0x87, 0x70,
-  0xad, 0x55, 0xaa, 0xb5, 0x54, 0xe0,
-  0xb2, 0xb6, 0x56, 0xca, 0xdc, 0x18
-};
-
-const uint8_t kMaskRandom45_6[36] = {
-  0x64, 0x4c, 0x89, 0x91, 0x28, 0xa0,
-  0x51, 0x4a, 0x29, 0x45, 0x62, 0x88,
-  0xa8, 0x35, 0x04, 0x32, 0x90, 0xc0,
-  0xc4, 0xa0, 0x96, 0x84, 0x89, 0x18,
-  0x03, 0x60, 0x6c, 0x4a, 0x84, 0x70,
-  0x90, 0xd2, 0x1a, 0x29, 0x17, 0x00
-};
-
-const uint8_t kMaskRandom45_7[42] = {
-  0xc6, 0x48, 0xc9, 0x19, 0x29, 0xb0,
-  0x13, 0x26, 0x64, 0xcc, 0x90, 0x98,
-  0x8d, 0x13, 0xa2, 0x46, 0x48, 0x48,
-  0x8b, 0x41, 0x6a, 0x90, 0x81, 0x28,
-  0x52, 0xaa, 0x15, 0x42, 0x83, 0x50,
-  0xa2, 0xd4, 0x1a, 0x13, 0x16, 0x00,
-  0x61, 0xa8, 0x2c, 0x25, 0xc4, 0x30
-};
-
-const uint8_t kMaskRandom45_8[48] = {
-  0x28, 0x85, 0x38, 0x32, 0x10, 0x30,
-  0x21, 0xf4, 0x06, 0x01, 0xc0, 0x18,
-  0xe9, 0x1d, 0x02, 0x82, 0x21, 0x20,
-  0x17, 0x02, 0xe0, 0x15, 0x00, 0xc8,
-  0x83, 0xa0, 0x55, 0x0c, 0x0a, 0x08,
-  0x46, 0x18, 0xe8, 0x68, 0x05, 0x40,
-  0x50, 0x6a, 0x0d, 0x80, 0x9c, 0x00,
-  0x1c, 0x23, 0x84, 0x50, 0xe2, 0x80
-};
-
-const uint8_t kMaskRandom45_9[54] = {
-  0x44, 0x48, 0xc9, 0x19, 0x29, 0xb0,
-  0x28, 0x2d, 0x0d, 0x89, 0xf2, 0x10,
-  0x25, 0x14, 0xa2, 0x30, 0x12, 0x20,
-  0x59, 0x0a, 0x20, 0x05, 0xd0, 0x88,
-  0x03, 0xa0, 0x34, 0x1e, 0x0c, 0x18,
-  0xc0, 0xd0, 0x1a, 0x82, 0x01, 0xc8,
-  0xa2, 0x30, 0x44, 0x62, 0xc5, 0x08,
-  0x14, 0x82, 0xd2, 0x44, 0x02, 0x48,
-  0x9a, 0x03, 0x81, 0xe0, 0x00, 0x70
-};
-
-const uint8_t kMaskRandom46_1[6] = {
-  0xff, 0xff, 0xff, 0xff, 0xff, 0xfc
-};
-
-const uint8_t kMaskRandom46_10[60] = {
-  0x64, 0x4a, 0x28, 0xc8, 0x94, 0x50,
-  0x51, 0x48, 0xa2, 0xa2, 0x91, 0x44,
-  0xa9, 0x10, 0x1b, 0x52, 0x20, 0x34,
-  0x04, 0xc4, 0x84, 0x09, 0x89, 0x08,
-  0xd0, 0x01, 0x45, 0xa0, 0x02, 0x88,
-  0x82, 0x40, 0x1d, 0x04, 0x80, 0x38,
-  0x21, 0x37, 0x00, 0x42, 0x6e, 0x00,
-  0x0c, 0x21, 0x22, 0x18, 0x42, 0x44,
-  0x4a, 0x0a, 0xc0, 0x94, 0x15, 0x80,
-  0x12, 0xb4, 0x50, 0x25, 0x68, 0xa0
-};
-
-const uint8_t kMaskRandom46_11[66] = {
-  0x46, 0x4a, 0x6c, 0x8c, 0x94, 0xd8,
-  0x33, 0x24, 0x26, 0x66, 0x48, 0x4c,
-  0x99, 0x02, 0x13, 0x32, 0x04, 0x24,
-  0x05, 0x80, 0x0e, 0x0b, 0x00, 0x1c,
-  0x80, 0xa1, 0x83, 0x01, 0x43, 0x04,
-  0x84, 0x48, 0x19, 0x08, 0x90, 0x30,
-  0x40, 0x6d, 0x40, 0x80, 0xda, 0x80,
-  0x0a, 0x90, 0xc0, 0x15, 0x21, 0x80,
-  0x68, 0x04, 0x90, 0xd0, 0x09, 0x20,
-  0x10, 0x31, 0x20, 0x20, 0x62, 0x40,
-  0x30, 0x58, 0x04, 0x60, 0xb0, 0x08
-};
-
-const uint8_t kMaskRandom46_12[72] = {
-  0x64, 0x4a, 0x28, 0xc8, 0x94, 0x50,
-  0x51, 0x58, 0xa2, 0xa2, 0xb1, 0x44,
-  0x0c, 0xa4, 0x30, 0x19, 0x48, 0x60,
-  0xa1, 0x22, 0x47, 0x42, 0x44, 0x8c,
-  0x12, 0xa1, 0x1c, 0x25, 0x42, 0x38,
-  0x8a, 0x45, 0xc1, 0x14, 0x8b, 0x80,
-  0x86, 0x8a, 0x6d, 0x0d, 0x14, 0xd8,
-  0x23, 0x2c, 0x84, 0x46, 0x59, 0x08,
-  0x16, 0x21, 0x98, 0x2c, 0x43, 0x30,
-  0x4c, 0x30, 0x54, 0x98, 0x60, 0xa8,
-  0x41, 0xc1, 0x26, 0x83, 0x82, 0x4c,
-  0x19, 0x56, 0xe4, 0x32, 0xad, 0xc8
-};
-
-const uint8_t kMaskRandom46_13[78] = {
-  0x64, 0x4a, 0x28, 0xc8, 0x94, 0x50,
-  0x51, 0x58, 0xa2, 0xa2, 0xb1, 0x44,
-  0x0c, 0xa4, 0x30, 0x19, 0x48, 0x60,
-  0xa1, 0x22, 0x47, 0x42, 0x44, 0x8c,
-  0x12, 0xa1, 0x1c, 0x25, 0x42, 0x38,
-  0x8a, 0x45, 0xc1, 0x14, 0x8b, 0x80,
-  0x46, 0x4a, 0x6c, 0x8c, 0x94, 0xd8,
-  0x33, 0x24, 0x26, 0x66, 0x48, 0x4c,
-  0x91, 0x92, 0x13, 0x23, 0x24, 0x24,
-  0xa4, 0x20, 0x4b, 0x48, 0x40, 0x94,
-  0x50, 0xa0, 0xd4, 0xa1, 0x41, 0xa8,
-  0x84, 0xc5, 0x81, 0x09, 0x8b, 0x00,
-  0x09, 0x71, 0x0c, 0x12, 0xe2, 0x18
-};
-
-const uint8_t kMaskRandom46_14[84] = {
-  0x46, 0x4a, 0x6c, 0x8c, 0x94, 0xd8,
-  0x33, 0x24, 0x26, 0x66, 0x48, 0x4c,
-  0x91, 0x92, 0x13, 0x23, 0x24, 0x24,
-  0xa4, 0x20, 0x4b, 0x48, 0x40, 0x94,
-  0x50, 0xa0, 0xd4, 0xa1, 0x41, 0xa8,
-  0x84, 0xc5, 0x81, 0x09, 0x8b, 0x00,
-  0x09, 0x71, 0x0c, 0x12, 0xe2, 0x18,
-  0x64, 0x4a, 0x28, 0xc8, 0x94, 0x50,
-  0x51, 0x58, 0xa2, 0xa2, 0xb1, 0x44,
-  0x0c, 0xa4, 0x30, 0x19, 0x48, 0x60,
-  0xa1, 0x22, 0x47, 0x42, 0x44, 0x8c,
-  0x12, 0xa1, 0x1c, 0x25, 0x42, 0x38,
-  0x8a, 0x45, 0xc1, 0x14, 0x8b, 0x80,
-  0x9c, 0x3f, 0xb3, 0x38, 0x7f, 0x64
-};
-
-const uint8_t kMaskRandom46_15[90] = {
-  0x46, 0x4a, 0x6c, 0x8c, 0x94, 0xd8,
-  0x33, 0x24, 0x26, 0x66, 0x48, 0x4c,
-  0x91, 0x92, 0x13, 0x23, 0x24, 0x24,
-  0xa4, 0x20, 0x4b, 0x48, 0x40, 0x94,
-  0x50, 0xa0, 0xd4, 0xa1, 0x41, 0xa8,
-  0x84, 0xc5, 0x81, 0x09, 0x8b, 0x00,
-  0x09, 0x71, 0x0c, 0x12, 0xe2, 0x18,
-  0x0c, 0x84, 0x0c, 0x19, 0x08, 0x18,
-  0x80, 0x70, 0x07, 0x00, 0xe0, 0x0c,
-  0xa0, 0x88, 0x49, 0x41, 0x10, 0x90,
-  0x05, 0x40, 0x32, 0x0a, 0x80, 0x64,
-  0x43, 0x02, 0x82, 0x86, 0x05, 0x04,
-  0x1a, 0x01, 0x50, 0x34, 0x02, 0xa0,
-  0x60, 0x27, 0x00, 0xc0, 0x4e, 0x00,
-  0x14, 0x38, 0xa0, 0x28, 0x71, 0x40
-};
-
-const uint8_t kMaskRandom46_16[96] = {
-  0x0c, 0x84, 0x0c, 0x19, 0x08, 0x18,
-  0x80, 0x70, 0x07, 0x00, 0xe0, 0x0c,
-  0xa0, 0x88, 0x49, 0x41, 0x10, 0x90,
-  0x05, 0x40, 0x32, 0x0a, 0x80, 0x64,
-  0x43, 0x02, 0x82, 0x86, 0x05, 0x04,
-  0x1a, 0x01, 0x50, 0x34, 0x02, 0xa0,
-  0x60, 0x27, 0x00, 0xc0, 0x4e, 0x00,
-  0x14, 0x38, 0xa0, 0x28, 0x71, 0x40,
-  0x46, 0x4a, 0x6c, 0x8c, 0x94, 0xd8,
-  0x33, 0x24, 0x26, 0x66, 0x48, 0x4c,
-  0x91, 0x92, 0x13, 0x23, 0x24, 0x24,
-  0xa4, 0x20, 0x4b, 0x48, 0x40, 0x94,
-  0x50, 0xa0, 0xd4, 0xa1, 0x41, 0xa8,
-  0x84, 0xc5, 0x81, 0x09, 0x8b, 0x00,
-  0x09, 0x71, 0x0c, 0x12, 0xe2, 0x18,
-  0xfa, 0xd9, 0xf5, 0xf5, 0xb3, 0xe8
-};
-
-const uint8_t kMaskRandom46_17[102] = {
-  0x0c, 0x84, 0x0c, 0x19, 0x08, 0x18,
-  0x80, 0x70, 0x07, 0x00, 0xe0, 0x0c,
-  0xa0, 0x88, 0x49, 0x41, 0x10, 0x90,
-  0x05, 0x40, 0x32, 0x0a, 0x80, 0x64,
-  0x43, 0x02, 0x82, 0x86, 0x05, 0x04,
-  0x1a, 0x01, 0x50, 0x34, 0x02, 0xa0,
-  0x60, 0x27, 0x00, 0xc0, 0x4e, 0x00,
-  0x14, 0x38, 0xa0, 0x28, 0x71, 0x40,
-  0x46, 0x4a, 0x6c, 0x8c, 0x94, 0xd8,
-  0x62, 0x7c, 0x84, 0xc4, 0xf9, 0x08,
-  0x8c, 0x04, 0x89, 0x18, 0x09, 0x10,
-  0x01, 0x74, 0x22, 0x02, 0xe8, 0x44,
-  0x07, 0x83, 0x06, 0x0f, 0x06, 0x0c,
-  0xa0, 0x80, 0x73, 0x41, 0x00, 0xe4,
-  0x18, 0xb1, 0x42, 0x31, 0x62, 0x84,
-  0x91, 0x00, 0x93, 0x22, 0x01, 0x24,
-  0x78, 0x00, 0x1c, 0xf0, 0x00, 0x38
-};
-
-const uint8_t kMaskRandom46_18[108] = {
-  0x46, 0x4a, 0x6c, 0x8c, 0x94, 0xd8,
-  0x62, 0x7c, 0x84, 0xc4, 0xf9, 0x08,
-  0x8c, 0x04, 0x89, 0x18, 0x09, 0x10,
-  0x01, 0x74, 0x22, 0x02, 0xe8, 0x44,
-  0x07, 0x83, 0x06, 0x0f, 0x06, 0x0c,
-  0xa0, 0x80, 0x73, 0x41, 0x00, 0xe4,
-  0x18, 0xb1, 0x42, 0x31, 0x62, 0x84,
-  0x91, 0x00, 0x93, 0x22, 0x01, 0x24,
-  0x78, 0x00, 0x1c, 0xf0, 0x00, 0x38,
-  0x0c, 0x84, 0x0c, 0x19, 0x08, 0x18,
-  0x80, 0x70, 0x07, 0x00, 0xe0, 0x0c,
-  0xa0, 0x88, 0x49, 0x41, 0x10, 0x90,
-  0x05, 0x40, 0x32, 0x0a, 0x80, 0x64,
-  0x43, 0x02, 0x82, 0x86, 0x05, 0x04,
-  0x1a, 0x01, 0x50, 0x34, 0x02, 0xa0,
-  0x60, 0x27, 0x00, 0xc0, 0x4e, 0x00,
-  0x14, 0x38, 0xa0, 0x28, 0x71, 0x40,
-  0x82, 0x32, 0x57, 0x04, 0x64, 0xac
-};
-
-const uint8_t kMaskRandom46_19[114] = {
-  0x46, 0x4a, 0x6c, 0x8c, 0x94, 0xd8,
-  0x62, 0x7c, 0x84, 0xc4, 0xf9, 0x08,
-  0x8c, 0x04, 0x89, 0x18, 0x09, 0x10,
-  0x01, 0x74, 0x22, 0x02, 0xe8, 0x44,
-  0x07, 0x83, 0x06, 0x0f, 0x06, 0x0c,
-  0xa0, 0x80, 0x73, 0x41, 0x00, 0xe4,
-  0x18, 0xb1, 0x42, 0x31, 0x62, 0x84,
-  0x91, 0x00, 0x93, 0x22, 0x01, 0x24,
-  0x78, 0x00, 0x1c, 0xf0, 0x00, 0x38,
-  0x64, 0x4a, 0x28, 0xc8, 0x94, 0x50,
-  0x51, 0x48, 0xa2, 0xa2, 0x91, 0x44,
-  0xa9, 0x10, 0x1b, 0x52, 0x20, 0x34,
-  0x04, 0xc4, 0x84, 0x09, 0x89, 0x08,
-  0xd0, 0x01, 0x45, 0xa0, 0x02, 0x88,
-  0x82, 0x40, 0x1d, 0x04, 0x80, 0x38,
-  0x21, 0x37, 0x00, 0x42, 0x6e, 0x00,
-  0x0c, 0x21, 0x22, 0x18, 0x42, 0x44,
-  0x4a, 0x0a, 0xc0, 0x94, 0x15, 0x80,
-  0x12, 0xb4, 0x50, 0x25, 0x68, 0xa0
-};
-
-const uint8_t kMaskRandom46_2[12] = {
-  0xec, 0xdd, 0x99, 0xd9, 0xbb, 0x30,
-  0x9b, 0xb2, 0x77, 0x37, 0x64, 0xec
-};
-
-const uint8_t kMaskRandom46_20[120] = {
-  0x64, 0x4a, 0x28, 0xc8, 0x94, 0x50,
-  0x51, 0x48, 0xa2, 0xa2, 0x91, 0x44,
-  0xa9, 0x10, 0x1b, 0x52, 0x20, 0x34,
-  0x04, 0xc4, 0x84, 0x09, 0x89, 0x08,
-  0xd0, 0x01, 0x45, 0xa0, 0x02, 0x88,
-  0x82, 0x40, 0x1d, 0x04, 0x80, 0x38,
-  0x21, 0x37, 0x00, 0x42, 0x6e, 0x00,
-  0x0c, 0x21, 0x22, 0x18, 0x42, 0x44,
-  0x4a, 0x0a, 0xc0, 0x94, 0x15, 0x80,
-  0x12, 0xb4, 0x50, 0x25, 0x68, 0xa0,
-  0x46, 0x4a, 0x6c, 0x8c, 0x94, 0xd8,
-  0x62, 0x7c, 0x84, 0xc4, 0xf9, 0x08,
-  0x8c, 0x04, 0x89, 0x18, 0x09, 0x10,
-  0x01, 0x74, 0x22, 0x02, 0xe8, 0x44,
-  0x07, 0x83, 0x06, 0x0f, 0x06, 0x0c,
-  0xa0, 0x80, 0x73, 0x41, 0x00, 0xe4,
-  0x18, 0xb1, 0x42, 0x31, 0x62, 0x84,
-  0x91, 0x00, 0x93, 0x22, 0x01, 0x24,
-  0x78, 0x00, 0x1c, 0xf0, 0x00, 0x38,
-  0xdb, 0x4a, 0x7b, 0xb6, 0x94, 0xf4
-};
-
-const uint8_t kMaskRandom46_21[126] = {
-  0x64, 0x4a, 0x28, 0xc8, 0x94, 0x50,
-  0x51, 0x48, 0xa2, 0xa2, 0x91, 0x44,
-  0xa9, 0x10, 0x1b, 0x52, 0x20, 0x34,
-  0x04, 0xc4, 0x84, 0x09, 0x89, 0x08,
-  0xd0, 0x01, 0x45, 0xa0, 0x02, 0x88,
-  0x82, 0x40, 0x1d, 0x04, 0x80, 0x38,
-  0x21, 0x37, 0x00, 0x42, 0x6e, 0x00,
-  0x0c, 0x21, 0x22, 0x18, 0x42, 0x44,
-  0x4a, 0x0a, 0xc0, 0x94, 0x15, 0x80,
-  0x12, 0xb4, 0x50, 0x25, 0x68, 0xa0,
-  0x46, 0x4a, 0x6c, 0x8c, 0x94, 0xd8,
-  0x33, 0x24, 0x26, 0x66, 0x48, 0x4c,
-  0x99, 0x02, 0x13, 0x32, 0x04, 0x24,
-  0x05, 0x80, 0x0e, 0x0b, 0x00, 0x1c,
-  0x80, 0xa1, 0x83, 0x01, 0x43, 0x04,
-  0x84, 0x48, 0x19, 0x08, 0x90, 0x30,
-  0x40, 0x6d, 0x40, 0x80, 0xda, 0x80,
-  0x0a, 0x90, 0xc0, 0x15, 0x21, 0x80,
-  0x68, 0x04, 0x90, 0xd0, 0x09, 0x20,
-  0x10, 0x31, 0x20, 0x20, 0x62, 0x40,
-  0x30, 0x58, 0x04, 0x60, 0xb0, 0x08
-};
-
-const uint8_t kMaskRandom46_22[132] = {
-  0x46, 0x4a, 0x6c, 0x8c, 0x94, 0xd8,
-  0x33, 0x24, 0x26, 0x66, 0x48, 0x4c,
-  0x99, 0x02, 0x13, 0x32, 0x04, 0x24,
-  0x05, 0x80, 0x0e, 0x0b, 0x00, 0x1c,
-  0x80, 0xa1, 0x83, 0x01, 0x43, 0x04,
-  0x84, 0x48, 0x19, 0x08, 0x90, 0x30,
-  0x40, 0x6d, 0x40, 0x80, 0xda, 0x80,
-  0x0a, 0x90, 0xc0, 0x15, 0x21, 0x80,
-  0x68, 0x04, 0x90, 0xd0, 0x09, 0x20,
-  0x10, 0x31, 0x20, 0x20, 0x62, 0x40,
-  0x30, 0x58, 0x04, 0x60, 0xb0, 0x08,
-  0x64, 0x4a, 0x28, 0xc8, 0x94, 0x50,
-  0x51, 0x48, 0xa2, 0xa2, 0x91, 0x44,
-  0xa9, 0x10, 0x1b, 0x52, 0x20, 0x34,
-  0x04, 0xc4, 0x84, 0x09, 0x89, 0x08,
-  0xd0, 0x01, 0x45, 0xa0, 0x02, 0x88,
-  0x82, 0x40, 0x1d, 0x04, 0x80, 0x38,
-  0x21, 0x37, 0x00, 0x42, 0x6e, 0x00,
-  0x0c, 0x21, 0x22, 0x18, 0x42, 0x44,
-  0x4a, 0x0a, 0xc0, 0x94, 0x15, 0x80,
-  0x12, 0xb4, 0x50, 0x25, 0x68, 0xa0,
-  0xea, 0x8d, 0x1b, 0xd5, 0x1a, 0x34
-};
-
-const uint8_t kMaskRandom46_23[138] = {
-  0x46, 0x4a, 0x6c, 0x8c, 0x94, 0xd8,
-  0x33, 0x24, 0x26, 0x66, 0x48, 0x4c,
-  0x99, 0x02, 0x13, 0x32, 0x04, 0x24,
-  0x05, 0x80, 0x0e, 0x0b, 0x00, 0x1c,
-  0x80, 0xa1, 0x83, 0x01, 0x43, 0x04,
-  0x84, 0x48, 0x19, 0x08, 0x90, 0x30,
-  0x40, 0x6d, 0x40, 0x80, 0xda, 0x80,
-  0x0a, 0x90, 0xc0, 0x15, 0x21, 0x80,
-  0x68, 0x04, 0x90, 0xd0, 0x09, 0x20,
-  0x10, 0x31, 0x20, 0x20, 0x62, 0x40,
-  0x30, 0x58, 0x04, 0x60, 0xb0, 0x08,
-  0x46, 0x42, 0x0c, 0x8c, 0x84, 0x18,
-  0x33, 0x20, 0x46, 0x66, 0x40, 0x8c,
-  0x99, 0x08, 0x0b, 0x32, 0x10, 0x14,
-  0x05, 0x84, 0x30, 0x0b, 0x08, 0x60,
-  0x80, 0xb0, 0x23, 0x01, 0x60, 0x44,
-  0x84, 0x42, 0x91, 0x08, 0x85, 0x20,
-  0x40, 0x73, 0x00, 0x80, 0xe6, 0x00,
-  0x0a, 0x81, 0x12, 0x15, 0x02, 0x24,
-  0x68, 0x0c, 0x40, 0xd0, 0x18, 0x80,
-  0x10, 0x24, 0x84, 0x20, 0x49, 0x08,
-  0x30, 0x51, 0x40, 0x60, 0xa2, 0x80,
-  0x5f, 0x50, 0x88, 0xbe, 0xa1, 0x10
-};
-
-const uint8_t kMaskRandom46_24[144] = {
-  0x64, 0x4a, 0x28, 0xc8, 0x94, 0x50,
-  0x51, 0x58, 0xa2, 0xa2, 0xb1, 0x44,
-  0x0c, 0xa4, 0x30, 0x19, 0x48, 0x60,
-  0xa1, 0x22, 0x47, 0x42, 0x44, 0x8c,
-  0x12, 0xa1, 0x1c, 0x25, 0x42, 0x38,
-  0x8a, 0x45, 0xc1, 0x14, 0x8b, 0x80,
-  0x86, 0x8a, 0x6d, 0x0d, 0x14, 0xd8,
-  0x23, 0x2c, 0x84, 0x46, 0x59, 0x08,
-  0x16, 0x21, 0x98, 0x2c, 0x43, 0x30,
-  0x4c, 0x30, 0x54, 0x98, 0x60, 0xa8,
-  0x41, 0xc1, 0x26, 0x83, 0x82, 0x4c,
-  0x19, 0x56, 0xe4, 0x32, 0xad, 0xc8,
-  0x46, 0x4a, 0x6c, 0x8c, 0x94, 0xd8,
-  0x33, 0x24, 0x26, 0x66, 0x48, 0x4c,
-  0x99, 0x02, 0x13, 0x32, 0x04, 0x24,
-  0x05, 0x80, 0x0e, 0x0b, 0x00, 0x1c,
-  0x80, 0xa1, 0x83, 0x01, 0x43, 0x04,
-  0x84, 0x48, 0x19, 0x08, 0x90, 0x30,
-  0x40, 0x6d, 0x40, 0x80, 0xda, 0x80,
-  0x0a, 0x90, 0xc0, 0x15, 0x21, 0x80,
-  0x68, 0x04, 0x90, 0xd0, 0x09, 0x20,
-  0x10, 0x31, 0x20, 0x20, 0x62, 0x40,
-  0x30, 0x58, 0x04, 0x60, 0xb0, 0x08,
-  0x18, 0x8b, 0x03, 0xb4, 0x3b, 0x10
-};
-
-const uint8_t kMaskRandom46_25[150] = {
-  0x64, 0x4a, 0x28, 0xc8, 0x94, 0x50,
-  0x51, 0x58, 0xa2, 0xa2, 0xb1, 0x44,
-  0x0c, 0xa4, 0x30, 0x19, 0x48, 0x60,
-  0xa1, 0x22, 0x47, 0x42, 0x44, 0x8c,
-  0x12, 0xa1, 0x1c, 0x25, 0x42, 0x38,
-  0x8a, 0x45, 0xc1, 0x14, 0x8b, 0x80,
-  0x86, 0x8a, 0x6d, 0x0d, 0x14, 0xd8,
-  0x23, 0x2c, 0x84, 0x46, 0x59, 0x08,
-  0x16, 0x21, 0x98, 0x2c, 0x43, 0x30,
-  0x4c, 0x30, 0x54, 0x98, 0x60, 0xa8,
-  0x41, 0xc1, 0x26, 0x83, 0x82, 0x4c,
-  0x19, 0x56, 0xe4, 0x32, 0xad, 0xc8,
-  0x64, 0x4a, 0x28, 0xc8, 0x94, 0x50,
-  0x51, 0x58, 0xa2, 0xa2, 0xb1, 0x44,
-  0x0c, 0xa4, 0x30, 0x19, 0x48, 0x60,
-  0xa1, 0x22, 0x47, 0x42, 0x44, 0x8c,
-  0x12, 0xa1, 0x1c, 0x25, 0x42, 0x38,
-  0x8a, 0x45, 0xc1, 0x14, 0x8b, 0x80,
-  0x46, 0x4a, 0x6c, 0x8c, 0x94, 0xd8,
-  0x33, 0x24, 0x26, 0x66, 0x48, 0x4c,
-  0x91, 0x92, 0x13, 0x23, 0x24, 0x24,
-  0xa4, 0x20, 0x4b, 0x48, 0x40, 0x94,
-  0x50, 0xa0, 0xd4, 0xa1, 0x41, 0xa8,
-  0x84, 0xc5, 0x81, 0x09, 0x8b, 0x00,
-  0x09, 0x71, 0x0c, 0x12, 0xe2, 0x18
-};
-
-const uint8_t kMaskRandom46_26[156] = {
-  0x64, 0x4a, 0x28, 0xc8, 0x94, 0x50,
-  0x51, 0x58, 0xa2, 0xa2, 0xb1, 0x44,
-  0x0c, 0xa4, 0x30, 0x19, 0x48, 0x60,
-  0xa1, 0x22, 0x47, 0x42, 0x44, 0x8c,
-  0x12, 0xa1, 0x1c, 0x25, 0x42, 0x38,
-  0x8a, 0x45, 0xc1, 0x14, 0x8b, 0x80,
-  0x46, 0x4a, 0x6c, 0x8c, 0x94, 0xd8,
-  0x33, 0x24, 0x26, 0x66, 0x48, 0x4c,
-  0x91, 0x92, 0x13, 0x23, 0x24, 0x24,
-  0xa4, 0x20, 0x4b, 0x48, 0x40, 0x94,
-  0x50, 0xa0, 0xd4, 0xa1, 0x41, 0xa8,
-  0x84, 0xc5, 0x81, 0x09, 0x8b, 0x00,
-  0x09, 0x71, 0x0c, 0x12, 0xe2, 0x18,
-  0x64, 0x4a, 0x28, 0xc8, 0x94, 0x50,
-  0x51, 0x58, 0xa2, 0xa2, 0xb1, 0x44,
-  0x0c, 0xa4, 0x30, 0x19, 0x48, 0x60,
-  0xa1, 0x22, 0x47, 0x42, 0x44, 0x8c,
-  0x12, 0xa1, 0x1c, 0x25, 0x42, 0x38,
-  0x8a, 0x45, 0xc1, 0x14, 0x8b, 0x80,
-  0x86, 0x8a, 0x6d, 0x0d, 0x14, 0xd8,
-  0x23, 0x2c, 0x84, 0x46, 0x59, 0x08,
-  0x16, 0x21, 0x98, 0x2c, 0x43, 0x30,
-  0x4c, 0x30, 0x54, 0x98, 0x60, 0xa8,
-  0x41, 0xc1, 0x26, 0x83, 0x82, 0x4c,
-  0x19, 0x56, 0xe4, 0x32, 0xad, 0xc8,
-  0x2d, 0x6d, 0xd2, 0x57, 0xd6, 0x2c
-};
-
-const uint8_t kMaskRandom46_27[162] = {
-  0x64, 0x4a, 0x28, 0xc8, 0x94, 0x50,
-  0x51, 0x58, 0xa2, 0xa2, 0xb1, 0x44,
-  0x0c, 0xa4, 0x30, 0x19, 0x48, 0x60,
-  0xa1, 0x22, 0x47, 0x42, 0x44, 0x8c,
-  0x12, 0xa1, 0x1c, 0x25, 0x42, 0x38,
-  0x8a, 0x45, 0xc1, 0x14, 0x8b, 0x80,
-  0x46, 0x4a, 0x6c, 0x8c, 0x94, 0xd8,
-  0x33, 0x24, 0x26, 0x66, 0x48, 0x4c,
-  0x91, 0x92, 0x13, 0x23, 0x24, 0x24,
-  0xa4, 0x20, 0x4b, 0x48, 0x40, 0x94,
-  0x50, 0xa0, 0xd4, 0xa1, 0x41, 0xa8,
-  0x84, 0xc5, 0x81, 0x09, 0x8b, 0x00,
-  0x09, 0x71, 0x0c, 0x12, 0xe2, 0x18,
-  0x46, 0x4a, 0x6c, 0x8c, 0x94, 0xd8,
-  0x33, 0x24, 0x26, 0x66, 0x48, 0x4c,
-  0x91, 0x92, 0x13, 0x23, 0x24, 0x24,
-  0xa4, 0x20, 0x4b, 0x48, 0x40, 0x94,
-  0x50, 0xa0, 0xd4, 0xa1, 0x41, 0xa8,
-  0x84, 0xc5, 0x81, 0x09, 0x8b, 0x00,
-  0x09, 0x71, 0x0c, 0x12, 0xe2, 0x18,
-  0x64, 0x4a, 0x28, 0xc8, 0x94, 0x50,
-  0x51, 0x58, 0xa2, 0xa2, 0xb1, 0x44,
-  0x0c, 0xa4, 0x30, 0x19, 0x48, 0x60,
-  0xa1, 0x22, 0x47, 0x42, 0x44, 0x8c,
-  0x12, 0xa1, 0x1c, 0x25, 0x42, 0x38,
-  0x8a, 0x45, 0xc1, 0x14, 0x8b, 0x80,
-  0x9c, 0x3f, 0xb3, 0x38, 0x7f, 0x64
-};
-
-const uint8_t kMaskRandom46_28[168] = {
-  0x46, 0x4a, 0x6c, 0x8c, 0x94, 0xd8,
-  0x33, 0x24, 0x26, 0x66, 0x48, 0x4c,
-  0x91, 0x92, 0x13, 0x23, 0x24, 0x24,
-  0xa4, 0x20, 0x4b, 0x48, 0x40, 0x94,
-  0x50, 0xa0, 0xd4, 0xa1, 0x41, 0xa8,
-  0x84, 0xc5, 0x81, 0x09, 0x8b, 0x00,
-  0x09, 0x71, 0x0c, 0x12, 0xe2, 0x18,
-  0x64, 0x4a, 0x28, 0xc8, 0x94, 0x50,
-  0x51, 0x58, 0xa2, 0xa2, 0xb1, 0x44,
-  0x0c, 0xa4, 0x30, 0x19, 0x48, 0x60,
-  0xa1, 0x22, 0x47, 0x42, 0x44, 0x8c,
-  0x12, 0xa1, 0x1c, 0x25, 0x42, 0x38,
-  0x8a, 0x45, 0xc1, 0x14, 0x8b, 0x80,
-  0x9c, 0x3f, 0xb3, 0x38, 0x7f, 0x64,
-  0x64, 0x4a, 0x28, 0xc8, 0x94, 0x50,
-  0x51, 0x58, 0xa2, 0xa2, 0xb1, 0x44,
-  0x0c, 0xa4, 0x30, 0x19, 0x48, 0x60,
-  0xa1, 0x22, 0x47, 0x42, 0x44, 0x8c,
-  0x12, 0xa1, 0x1c, 0x25, 0x42, 0x38,
-  0x8a, 0x45, 0xc1, 0x14, 0x8b, 0x80,
-  0x46, 0x4a, 0x6c, 0x8c, 0x94, 0xd8,
-  0x33, 0x24, 0x26, 0x66, 0x48, 0x4c,
-  0x91, 0x92, 0x13, 0x23, 0x24, 0x24,
-  0xa4, 0x20, 0x4b, 0x48, 0x40, 0x94,
-  0x50, 0xa0, 0xd4, 0xa1, 0x41, 0xa8,
-  0x84, 0xc5, 0x81, 0x09, 0x8b, 0x00,
-  0x09, 0x71, 0x0c, 0x12, 0xe2, 0x18,
-  0xfa, 0x52, 0xf9, 0x72, 0xd9, 0x68
-};
-
-const uint8_t kMaskRandom46_29[174] = {
-  0x46, 0x4a, 0x6c, 0x8c, 0x94, 0xd8,
-  0x33, 0x24, 0x26, 0x66, 0x48, 0x4c,
-  0x91, 0x92, 0x13, 0x23, 0x24, 0x24,
-  0xa4, 0x20, 0x4b, 0x48, 0x40, 0x94,
-  0x50, 0xa0, 0xd4, 0xa1, 0x41, 0xa8,
-  0x84, 0xc5, 0x81, 0x09, 0x8b, 0x00,
-  0x09, 0x71, 0x0c, 0x12, 0xe2, 0x18,
-  0x64, 0x4a, 0x28, 0xc8, 0x94, 0x50,
-  0x51, 0x58, 0xa2, 0xa2, 0xb1, 0x44,
-  0x0c, 0xa4, 0x30, 0x19, 0x48, 0x60,
-  0xa1, 0x22, 0x47, 0x42, 0x44, 0x8c,
-  0x12, 0xa1, 0x1c, 0x25, 0x42, 0x38,
-  0x8a, 0x45, 0xc1, 0x14, 0x8b, 0x80,
-  0x9c, 0x3f, 0xb3, 0x38, 0x7f, 0x64,
-  0x46, 0x4a, 0x6c, 0x8c, 0x94, 0xd8,
-  0x33, 0x24, 0x26, 0x66, 0x48, 0x4c,
-  0x91, 0x92, 0x13, 0x23, 0x24, 0x24,
-  0xa4, 0x20, 0x4b, 0x48, 0x40, 0x94,
-  0x50, 0xa0, 0xd4, 0xa1, 0x41, 0xa8,
-  0x84, 0xc5, 0x81, 0x09, 0x8b, 0x00,
-  0x09, 0x71, 0x0c, 0x12, 0xe2, 0x18,
-  0x0c, 0x84, 0x0c, 0x19, 0x08, 0x18,
-  0x80, 0x70, 0x07, 0x00, 0xe0, 0x0c,
-  0xa0, 0x88, 0x49, 0x41, 0x10, 0x90,
-  0x05, 0x40, 0x32, 0x0a, 0x80, 0x64,
-  0x43, 0x02, 0x82, 0x86, 0x05, 0x04,
-  0x1a, 0x01, 0x50, 0x34, 0x02, 0xa0,
-  0x60, 0x27, 0x00, 0xc0, 0x4e, 0x00,
-  0x14, 0x38, 0xa0, 0x28, 0x71, 0x40
-};
-
-const uint8_t kMaskRandom46_3[18] = {
-  0xca, 0xd3, 0x65, 0x95, 0xa6, 0xc8,
-  0xf1, 0x49, 0x3b, 0xe2, 0x92, 0x74,
-  0x76, 0x27, 0xd0, 0xec, 0x4f, 0xa0
-};
-
-const uint8_t kMaskRandom46_30[180] = {
-  0x46, 0x4a, 0x6c, 0x8c, 0x94, 0xd8,
-  0x33, 0x24, 0x26, 0x66, 0x48, 0x4c,
-  0x91, 0x92, 0x13, 0x23, 0x24, 0x24,
-  0xa4, 0x20, 0x4b, 0x48, 0x40, 0x94,
-  0x50, 0xa0, 0xd4, 0xa1, 0x41, 0xa8,
-  0x84, 0xc5, 0x81, 0x09, 0x8b, 0x00,
-  0x09, 0x71, 0x0c, 0x12, 0xe2, 0x18,
-  0x0c, 0x84, 0x0c, 0x19, 0x08, 0x18,
-  0x80, 0x70, 0x07, 0x00, 0xe0, 0x0c,
-  0xa0, 0x88, 0x49, 0x41, 0x10, 0x90,
-  0x05, 0x40, 0x32, 0x0a, 0x80, 0x64,
-  0x43, 0x02, 0x82, 0x86, 0x05, 0x04,
-  0x1a, 0x01, 0x50, 0x34, 0x02, 0xa0,
-  0x60, 0x27, 0x00, 0xc0, 0x4e, 0x00,
-  0x14, 0x38, 0xa0, 0x28, 0x71, 0x40,
-  0x46, 0x4a, 0x6c, 0x8c, 0x94, 0xd8,
-  0x33, 0x24, 0x26, 0x66, 0x48, 0x4c,
-  0x91, 0x92, 0x13, 0x23, 0x24, 0x24,
-  0xa4, 0x20, 0x4b, 0x48, 0x40, 0x94,
-  0x50, 0xa0, 0xd4, 0xa1, 0x41, 0xa8,
-  0x84, 0xc5, 0x81, 0x09, 0x8b, 0x00,
-  0x09, 0x71, 0x0c, 0x12, 0xe2, 0x18,
-  0x64, 0x4a, 0x28, 0xc8, 0x94, 0x50,
-  0x51, 0x58, 0xa2, 0xa2, 0xb1, 0x44,
-  0x0c, 0xa4, 0x30, 0x19, 0x48, 0x60,
-  0xa1, 0x22, 0x47, 0x42, 0x44, 0x8c,
-  0x12, 0xa1, 0x1c, 0x25, 0x42, 0x38,
-  0x8a, 0x45, 0xc1, 0x14, 0x8b, 0x80,
-  0x9c, 0x3f, 0xb3, 0x38, 0x7f, 0x64,
-  0x99, 0xf6, 0x0a, 0xdd, 0x16, 0xb0
-};
-
-const uint8_t kMaskRandom46_31[186] = {
-  0x46, 0x4a, 0x6c, 0x8c, 0x94, 0xd8,
-  0x33, 0x24, 0x26, 0x66, 0x48, 0x4c,
-  0x91, 0x92, 0x13, 0x23, 0x24, 0x24,
-  0xa4, 0x20, 0x4b, 0x48, 0x40, 0x94,
-  0x50, 0xa0, 0xd4, 0xa1, 0x41, 0xa8,
-  0x84, 0xc5, 0x81, 0x09, 0x8b, 0x00,
-  0x09, 0x71, 0x0c, 0x12, 0xe2, 0x18,
-  0x0c, 0x84, 0x0c, 0x19, 0x08, 0x18,
-  0x80, 0x70, 0x07, 0x00, 0xe0, 0x0c,
-  0xa0, 0x88, 0x49, 0x41, 0x10, 0x90,
-  0x05, 0x40, 0x32, 0x0a, 0x80, 0x64,
-  0x43, 0x02, 0x82, 0x86, 0x05, 0x04,
-  0x1a, 0x01, 0x50, 0x34, 0x02, 0xa0,
-  0x60, 0x27, 0x00, 0xc0, 0x4e, 0x00,
-  0x14, 0x38, 0xa0, 0x28, 0x71, 0x40,
-  0x0c, 0x84, 0x0c, 0x19, 0x08, 0x18,
-  0x80, 0x70, 0x07, 0x00, 0xe0, 0x0c,
-  0xa0, 0x88, 0x49, 0x41, 0x10, 0x90,
-  0x05, 0x40, 0x32, 0x0a, 0x80, 0x64,
-  0x43, 0x02, 0x82, 0x86, 0x05, 0x04,
-  0x1a, 0x01, 0x50, 0x34, 0x02, 0xa0,
-  0x60, 0x27, 0x00, 0xc0, 0x4e, 0x00,
-  0x14, 0x38, 0xa0, 0x28, 0x71, 0x40,
-  0x46, 0x4a, 0x6c, 0x8c, 0x94, 0xd8,
-  0x33, 0x24, 0x26, 0x66, 0x48, 0x4c,
-  0x91, 0x92, 0x13, 0x23, 0x24, 0x24,
-  0xa4, 0x20, 0x4b, 0x48, 0x40, 0x94,
-  0x50, 0xa0, 0xd4, 0xa1, 0x41, 0xa8,
-  0x84, 0xc5, 0x81, 0x09, 0x8b, 0x00,
-  0x09, 0x71, 0x0c, 0x12, 0xe2, 0x18,
-  0xfa, 0xd9, 0xf5, 0xf5, 0xb3, 0xe8
-};
-
-const uint8_t kMaskRandom46_32[192] = {
-  0x0c, 0x84, 0x0c, 0x19, 0x08, 0x18,
-  0x80, 0x70, 0x07, 0x00, 0xe0, 0x0c,
-  0xa0, 0x88, 0x49, 0x41, 0x10, 0x90,
-  0x05, 0x40, 0x32, 0x0a, 0x80, 0x64,
-  0x43, 0x02, 0x82, 0x86, 0x05, 0x04,
-  0x1a, 0x01, 0x50, 0x34, 0x02, 0xa0,
-  0x60, 0x27, 0x00, 0xc0, 0x4e, 0x00,
-  0x14, 0x38, 0xa0, 0x28, 0x71, 0x40,
-  0x46, 0x4a, 0x6c, 0x8c, 0x94, 0xd8,
-  0x33, 0x24, 0x26, 0x66, 0x48, 0x4c,
-  0x91, 0x92, 0x13, 0x23, 0x24, 0x24,
-  0xa4, 0x20, 0x4b, 0x48, 0x40, 0x94,
-  0x50, 0xa0, 0xd4, 0xa1, 0x41, 0xa8,
-  0x84, 0xc5, 0x81, 0x09, 0x8b, 0x00,
-  0x09, 0x71, 0x0c, 0x12, 0xe2, 0x18,
-  0xfa, 0xd9, 0xf5, 0xf5, 0xb3, 0xe8,
-  0x46, 0x4a, 0x6c, 0x8c, 0x94, 0xd8,
-  0x33, 0x24, 0x26, 0x66, 0x48, 0x4c,
-  0x91, 0x92, 0x13, 0x23, 0x24, 0x24,
-  0xa4, 0x20, 0x4b, 0x48, 0x40, 0x94,
-  0x50, 0xa0, 0xd4, 0xa1, 0x41, 0xa8,
-  0x84, 0xc5, 0x81, 0x09, 0x8b, 0x00,
-  0x09, 0x71, 0x0c, 0x12, 0xe2, 0x18,
-  0x0c, 0x84, 0x0c, 0x19, 0x08, 0x18,
-  0x80, 0x70, 0x07, 0x00, 0xe0, 0x0c,
-  0xa0, 0x88, 0x49, 0x41, 0x10, 0x90,
-  0x05, 0x40, 0x32, 0x0a, 0x80, 0x64,
-  0x43, 0x02, 0x82, 0x86, 0x05, 0x04,
-  0x1a, 0x01, 0x50, 0x34, 0x02, 0xa0,
-  0x60, 0x27, 0x00, 0xc0, 0x4e, 0x00,
-  0x14, 0x38, 0xa0, 0x28, 0x71, 0x40,
-  0x69, 0xcd, 0xeb, 0x51, 0xc9, 0xa8
-};
-
-const uint8_t kMaskRandom46_33[198] = {
-  0x0c, 0x84, 0x0c, 0x19, 0x08, 0x18,
-  0x80, 0x70, 0x07, 0x00, 0xe0, 0x0c,
-  0xa0, 0x88, 0x49, 0x41, 0x10, 0x90,
-  0x05, 0x40, 0x32, 0x0a, 0x80, 0x64,
-  0x43, 0x02, 0x82, 0x86, 0x05, 0x04,
-  0x1a, 0x01, 0x50, 0x34, 0x02, 0xa0,
-  0x60, 0x27, 0x00, 0xc0, 0x4e, 0x00,
-  0x14, 0x38, 0xa0, 0x28, 0x71, 0x40,
-  0x46, 0x4a, 0x6c, 0x8c, 0x94, 0xd8,
-  0x33, 0x24, 0x26, 0x66, 0x48, 0x4c,
-  0x91, 0x92, 0x13, 0x23, 0x24, 0x24,
-  0xa4, 0x20, 0x4b, 0x48, 0x40, 0x94,
-  0x50, 0xa0, 0xd4, 0xa1, 0x41, 0xa8,
-  0x84, 0xc5, 0x81, 0x09, 0x8b, 0x00,
-  0x09, 0x71, 0x0c, 0x12, 0xe2, 0x18,
-  0xfa, 0xd9, 0xf5, 0xf5, 0xb3, 0xe8,
-  0x0c, 0x84, 0x0c, 0x19, 0x08, 0x18,
-  0x80, 0x70, 0x07, 0x00, 0xe0, 0x0c,
-  0xa0, 0x88, 0x49, 0x41, 0x10, 0x90,
-  0x05, 0x40, 0x32, 0x0a, 0x80, 0x64,
-  0x43, 0x02, 0x82, 0x86, 0x05, 0x04,
-  0x1a, 0x01, 0x50, 0x34, 0x02, 0xa0,
-  0x60, 0x27, 0x00, 0xc0, 0x4e, 0x00,
-  0x14, 0x38, 0xa0, 0x28, 0x71, 0x40,
-  0x46, 0x4a, 0x6c, 0x8c, 0x94, 0xd8,
-  0x62, 0x7c, 0x84, 0xc4, 0xf9, 0x08,
-  0x8c, 0x04, 0x89, 0x18, 0x09, 0x10,
-  0x01, 0x74, 0x22, 0x02, 0xe8, 0x44,
-  0x07, 0x83, 0x06, 0x0f, 0x06, 0x0c,
-  0xa0, 0x80, 0x73, 0x41, 0x00, 0xe4,
-  0x18, 0xb1, 0x42, 0x31, 0x62, 0x84,
-  0x91, 0x00, 0x93, 0x22, 0x01, 0x24,
-  0x78, 0x00, 0x1c, 0xf0, 0x00, 0x38
-};
-
-const uint8_t kMaskRandom46_34[204] = {
-  0x0c, 0x84, 0x0c, 0x19, 0x08, 0x18,
-  0x80, 0x70, 0x07, 0x00, 0xe0, 0x0c,
-  0xa0, 0x88, 0x49, 0x41, 0x10, 0x90,
-  0x05, 0x40, 0x32, 0x0a, 0x80, 0x64,
-  0x43, 0x02, 0x82, 0x86, 0x05, 0x04,
-  0x1a, 0x01, 0x50, 0x34, 0x02, 0xa0,
-  0x60, 0x27, 0x00, 0xc0, 0x4e, 0x00,
-  0x14, 0x38, 0xa0, 0x28, 0x71, 0x40,
-  0x46, 0x4a, 0x6c, 0x8c, 0x94, 0xd8,
-  0x62, 0x7c, 0x84, 0xc4, 0xf9, 0x08,
-  0x8c, 0x04, 0x89, 0x18, 0x09, 0x10,
-  0x01, 0x74, 0x22, 0x02, 0xe8, 0x44,
-  0x07, 0x83, 0x06, 0x0f, 0x06, 0x0c,
-  0xa0, 0x80, 0x73, 0x41, 0x00, 0xe4,
-  0x18, 0xb1, 0x42, 0x31, 0x62, 0x84,
-  0x91, 0x00, 0x93, 0x22, 0x01, 0x24,
-  0x78, 0x00, 0x1c, 0xf0, 0x00, 0x38,
-  0x0c, 0x84, 0x0c, 0x19, 0x08, 0x18,
-  0x80, 0x70, 0x07, 0x00, 0xe0, 0x0c,
-  0xa0, 0x88, 0x49, 0x41, 0x10, 0x90,
-  0x05, 0x40, 0x32, 0x0a, 0x80, 0x64,
-  0x43, 0x02, 0x82, 0x86, 0x05, 0x04,
-  0x1a, 0x01, 0x50, 0x34, 0x02, 0xa0,
-  0x60, 0x27, 0x00, 0xc0, 0x4e, 0x00,
-  0x14, 0x38, 0xa0, 0x28, 0x71, 0x40,
-  0x46, 0x4a, 0x6c, 0x8c, 0x94, 0xd8,
-  0x33, 0x24, 0x26, 0x66, 0x48, 0x4c,
-  0x91, 0x92, 0x13, 0x23, 0x24, 0x24,
-  0xa4, 0x20, 0x4b, 0x48, 0x40, 0x94,
-  0x50, 0xa0, 0xd4, 0xa1, 0x41, 0xa8,
-  0x84, 0xc5, 0x81, 0x09, 0x8b, 0x00,
-  0x09, 0x71, 0x0c, 0x12, 0xe2, 0x18,
-  0xfa, 0xd9, 0xf5, 0xf5, 0xb3, 0xe8,
-  0x60, 0xf0, 0x13, 0xf0, 0x4d, 0xe0
-};
-
-const uint8_t kMaskRandom46_35[210] = {
-  0x0c, 0x84, 0x0c, 0x19, 0x08, 0x18,
-  0x80, 0x70, 0x07, 0x00, 0xe0, 0x0c,
-  0xa0, 0x88, 0x49, 0x41, 0x10, 0x90,
-  0x05, 0x40, 0x32, 0x0a, 0x80, 0x64,
-  0x43, 0x02, 0x82, 0x86, 0x05, 0x04,
-  0x1a, 0x01, 0x50, 0x34, 0x02, 0xa0,
-  0x60, 0x27, 0x00, 0xc0, 0x4e, 0x00,
-  0x14, 0x38, 0xa0, 0x28, 0x71, 0x40,
-  0x46, 0x4a, 0x6c, 0x8c, 0x94, 0xd8,
-  0x62, 0x7c, 0x84, 0xc4, 0xf9, 0x08,
-  0x8c, 0x04, 0x89, 0x18, 0x09, 0x10,
-  0x01, 0x74, 0x22, 0x02, 0xe8, 0x44,
-  0x07, 0x83, 0x06, 0x0f, 0x06, 0x0c,
-  0xa0, 0x80, 0x73, 0x41, 0x00, 0xe4,
-  0x18, 0xb1, 0x42, 0x31, 0x62, 0x84,
-  0x91, 0x00, 0x93, 0x22, 0x01, 0x24,
-  0x78, 0x00, 0x1c, 0xf0, 0x00, 0x38,
-  0x46, 0x4a, 0x6c, 0x8c, 0x94, 0xd8,
-  0x62, 0x7c, 0x84, 0xc4, 0xf9, 0x08,
-  0x8c, 0x04, 0x89, 0x18, 0x09, 0x10,
-  0x01, 0x74, 0x22, 0x02, 0xe8, 0x44,
-  0x07, 0x83, 0x06, 0x0f, 0x06, 0x0c,
-  0xa0, 0x80, 0x73, 0x41, 0x00, 0xe4,
-  0x18, 0xb1, 0x42, 0x31, 0x62, 0x84,
-  0x91, 0x00, 0x93, 0x22, 0x01, 0x24,
-  0x78, 0x00, 0x1c, 0xf0, 0x00, 0x38,
-  0x0c, 0x84, 0x0c, 0x19, 0x08, 0x18,
-  0x80, 0x70, 0x07, 0x00, 0xe0, 0x0c,
-  0xa0, 0x88, 0x49, 0x41, 0x10, 0x90,
-  0x05, 0x40, 0x32, 0x0a, 0x80, 0x64,
-  0x43, 0x02, 0x82, 0x86, 0x05, 0x04,
-  0x1a, 0x01, 0x50, 0x34, 0x02, 0xa0,
-  0x60, 0x27, 0x00, 0xc0, 0x4e, 0x00,
-  0x14, 0x38, 0xa0, 0x28, 0x71, 0x40,
-  0x82, 0x32, 0x57, 0x04, 0x64, 0xac
-};
-
-const uint8_t kMaskRandom46_36[216] = {
-  0x46, 0x4a, 0x6c, 0x8c, 0x94, 0xd8,
-  0x62, 0x7c, 0x84, 0xc4, 0xf9, 0x08,
-  0x8c, 0x04, 0x89, 0x18, 0x09, 0x10,
-  0x01, 0x74, 0x22, 0x02, 0xe8, 0x44,
-  0x07, 0x83, 0x06, 0x0f, 0x06, 0x0c,
-  0xa0, 0x80, 0x73, 0x41, 0x00, 0xe4,
-  0x18, 0xb1, 0x42, 0x31, 0x62, 0x84,
-  0x91, 0x00, 0x93, 0x22, 0x01, 0x24,
-  0x78, 0x00, 0x1c, 0xf0, 0x00, 0x38,
-  0x0c, 0x84, 0x0c, 0x19, 0x08, 0x18,
-  0x80, 0x70, 0x07, 0x00, 0xe0, 0x0c,
-  0xa0, 0x88, 0x49, 0x41, 0x10, 0x90,
-  0x05, 0x40, 0x32, 0x0a, 0x80, 0x64,
-  0x43, 0x02, 0x82, 0x86, 0x05, 0x04,
-  0x1a, 0x01, 0x50, 0x34, 0x02, 0xa0,
-  0x60, 0x27, 0x00, 0xc0, 0x4e, 0x00,
-  0x14, 0x38, 0xa0, 0x28, 0x71, 0x40,
-  0x82, 0x32, 0x57, 0x04, 0x64, 0xac,
-  0x0c, 0x84, 0x0c, 0x19, 0x08, 0x18,
-  0x80, 0x70, 0x07, 0x00, 0xe0, 0x0c,
-  0xa0, 0x88, 0x49, 0x41, 0x10, 0x90,
-  0x05, 0x40, 0x32, 0x0a, 0x80, 0x64,
-  0x43, 0x02, 0x82, 0x86, 0x05, 0x04,
-  0x1a, 0x01, 0x50, 0x34, 0x02, 0xa0,
-  0x60, 0x27, 0x00, 0xc0, 0x4e, 0x00,
-  0x14, 0x38, 0xa0, 0x28, 0x71, 0x40,
-  0x46, 0x4a, 0x6c, 0x8c, 0x94, 0xd8,
-  0x62, 0x7c, 0x84, 0xc4, 0xf9, 0x08,
-  0x8c, 0x04, 0x89, 0x18, 0x09, 0x10,
-  0x01, 0x74, 0x22, 0x02, 0xe8, 0x44,
-  0x07, 0x83, 0x06, 0x0f, 0x06, 0x0c,
-  0xa0, 0x80, 0x73, 0x41, 0x00, 0xe4,
-  0x18, 0xb1, 0x42, 0x31, 0x62, 0x84,
-  0x91, 0x00, 0x93, 0x22, 0x01, 0x24,
-  0x78, 0x00, 0x1c, 0xf0, 0x00, 0x38,
-  0x6c, 0x3a, 0x45, 0x70, 0xd7, 0x00
-};
-
-const uint8_t kMaskRandom46_37[222] = {
-  0x46, 0x4a, 0x6c, 0x8c, 0x94, 0xd8,
-  0x62, 0x7c, 0x84, 0xc4, 0xf9, 0x08,
-  0x8c, 0x04, 0x89, 0x18, 0x09, 0x10,
-  0x01, 0x74, 0x22, 0x02, 0xe8, 0x44,
-  0x07, 0x83, 0x06, 0x0f, 0x06, 0x0c,
-  0xa0, 0x80, 0x73, 0x41, 0x00, 0xe4,
-  0x18, 0xb1, 0x42, 0x31, 0x62, 0x84,
-  0x91, 0x00, 0x93, 0x22, 0x01, 0x24,
-  0x78, 0x00, 0x1c, 0xf0, 0x00, 0x38,
-  0x0c, 0x84, 0x0c, 0x19, 0x08, 0x18,
-  0x80, 0x70, 0x07, 0x00, 0xe0, 0x0c,
-  0xa0, 0x88, 0x49, 0x41, 0x10, 0x90,
-  0x05, 0x40, 0x32, 0x0a, 0x80, 0x64,
-  0x43, 0x02, 0x82, 0x86, 0x05, 0x04,
-  0x1a, 0x01, 0x50, 0x34, 0x02, 0xa0,
-  0x60, 0x27, 0x00, 0xc0, 0x4e, 0x00,
-  0x14, 0x38, 0xa0, 0x28, 0x71, 0x40,
-  0x82, 0x32, 0x57, 0x04, 0x64, 0xac,
-  0x46, 0x4a, 0x6c, 0x8c, 0x94, 0xd8,
-  0x62, 0x7c, 0x84, 0xc4, 0xf9, 0x08,
-  0x8c, 0x04, 0x89, 0x18, 0x09, 0x10,
-  0x01, 0x74, 0x22, 0x02, 0xe8, 0x44,
-  0x07, 0x83, 0x06, 0x0f, 0x06, 0x0c,
-  0xa0, 0x80, 0x73, 0x41, 0x00, 0xe4,
-  0x18, 0xb1, 0x42, 0x31, 0x62, 0x84,
-  0x91, 0x00, 0x93, 0x22, 0x01, 0x24,
-  0x78, 0x00, 0x1c, 0xf0, 0x00, 0x38,
-  0x64, 0x4a, 0x28, 0xc8, 0x94, 0x50,
-  0x51, 0x48, 0xa2, 0xa2, 0x91, 0x44,
-  0xa9, 0x10, 0x1b, 0x52, 0x20, 0x34,
-  0x04, 0xc4, 0x84, 0x09, 0x89, 0x08,
-  0xd0, 0x01, 0x45, 0xa0, 0x02, 0x88,
-  0x82, 0x40, 0x1d, 0x04, 0x80, 0x38,
-  0x21, 0x37, 0x00, 0x42, 0x6e, 0x00,
-  0x0c, 0x21, 0x22, 0x18, 0x42, 0x44,
-  0x4a, 0x0a, 0xc0, 0x94, 0x15, 0x80,
-  0x12, 0xb4, 0x50, 0x25, 0x68, 0xa0
-};
-
-const uint8_t kMaskRandom46_38[228] = {
-  0x46, 0x4a, 0x6c, 0x8c, 0x94, 0xd8,
-  0x62, 0x7c, 0x84, 0xc4, 0xf9, 0x08,
-  0x8c, 0x04, 0x89, 0x18, 0x09, 0x10,
-  0x01, 0x74, 0x22, 0x02, 0xe8, 0x44,
-  0x07, 0x83, 0x06, 0x0f, 0x06, 0x0c,
-  0xa0, 0x80, 0x73, 0x41, 0x00, 0xe4,
-  0x18, 0xb1, 0x42, 0x31, 0x62, 0x84,
-  0x91, 0x00, 0x93, 0x22, 0x01, 0x24,
-  0x78, 0x00, 0x1c, 0xf0, 0x00, 0x38,
-  0x64, 0x4a, 0x28, 0xc8, 0x94, 0x50,
-  0x51, 0x48, 0xa2, 0xa2, 0x91, 0x44,
-  0xa9, 0x10, 0x1b, 0x52, 0x20, 0x34,
-  0x04, 0xc4, 0x84, 0x09, 0x89, 0x08,
-  0xd0, 0x01, 0x45, 0xa0, 0x02, 0x88,
-  0x82, 0x40, 0x1d, 0x04, 0x80, 0x38,
-  0x21, 0x37, 0x00, 0x42, 0x6e, 0x00,
-  0x0c, 0x21, 0x22, 0x18, 0x42, 0x44,
-  0x4a, 0x0a, 0xc0, 0x94, 0x15, 0x80,
-  0x12, 0xb4, 0x50, 0x25, 0x68, 0xa0,
-  0x46, 0x4a, 0x6c, 0x8c, 0x94, 0xd8,
-  0x62, 0x7c, 0x84, 0xc4, 0xf9, 0x08,
-  0x8c, 0x04, 0x89, 0x18, 0x09, 0x10,
-  0x01, 0x74, 0x22, 0x02, 0xe8, 0x44,
-  0x07, 0x83, 0x06, 0x0f, 0x06, 0x0c,
-  0xa0, 0x80, 0x73, 0x41, 0x00, 0xe4,
-  0x18, 0xb1, 0x42, 0x31, 0x62, 0x84,
-  0x91, 0x00, 0x93, 0x22, 0x01, 0x24,
-  0x78, 0x00, 0x1c, 0xf0, 0x00, 0x38,
-  0x0c, 0x84, 0x0c, 0x19, 0x08, 0x18,
-  0x80, 0x70, 0x07, 0x00, 0xe0, 0x0c,
-  0xa0, 0x88, 0x49, 0x41, 0x10, 0x90,
-  0x05, 0x40, 0x32, 0x0a, 0x80, 0x64,
-  0x43, 0x02, 0x82, 0x86, 0x05, 0x04,
-  0x1a, 0x01, 0x50, 0x34, 0x02, 0xa0,
-  0x60, 0x27, 0x00, 0xc0, 0x4e, 0x00,
-  0x14, 0x38, 0xa0, 0x28, 0x71, 0x40,
-  0x82, 0x32, 0x57, 0x04, 0x64, 0xac,
-  0x72, 0x2b, 0xa5, 0xd4, 0xb9, 0x30
-};
-
-const uint8_t kMaskRandom46_39[234] = {
-  0x46, 0x4a, 0x6c, 0x8c, 0x94, 0xd8,
-  0x62, 0x7c, 0x84, 0xc4, 0xf9, 0x08,
-  0x8c, 0x04, 0x89, 0x18, 0x09, 0x10,
-  0x01, 0x74, 0x22, 0x02, 0xe8, 0x44,
-  0x07, 0x83, 0x06, 0x0f, 0x06, 0x0c,
-  0xa0, 0x80, 0x73, 0x41, 0x00, 0xe4,
-  0x18, 0xb1, 0x42, 0x31, 0x62, 0x84,
-  0x91, 0x00, 0x93, 0x22, 0x01, 0x24,
-  0x78, 0x00, 0x1c, 0xf0, 0x00, 0x38,
-  0x64, 0x4a, 0x28, 0xc8, 0x94, 0x50,
-  0x51, 0x48, 0xa2, 0xa2, 0x91, 0x44,
-  0xa9, 0x10, 0x1b, 0x52, 0x20, 0x34,
-  0x04, 0xc4, 0x84, 0x09, 0x89, 0x08,
-  0xd0, 0x01, 0x45, 0xa0, 0x02, 0x88,
-  0x82, 0x40, 0x1d, 0x04, 0x80, 0x38,
-  0x21, 0x37, 0x00, 0x42, 0x6e, 0x00,
-  0x0c, 0x21, 0x22, 0x18, 0x42, 0x44,
-  0x4a, 0x0a, 0xc0, 0x94, 0x15, 0x80,
-  0x12, 0xb4, 0x50, 0x25, 0x68, 0xa0,
-  0x64, 0x4a, 0x28, 0xc8, 0x94, 0x50,
-  0x51, 0x48, 0xa2, 0xa2, 0x91, 0x44,
-  0xa9, 0x10, 0x1b, 0x52, 0x20, 0x34,
-  0x04, 0xc4, 0x84, 0x09, 0x89, 0x08,
-  0xd0, 0x01, 0x45, 0xa0, 0x02, 0x88,
-  0x82, 0x40, 0x1d, 0x04, 0x80, 0x38,
-  0x21, 0x37, 0x00, 0x42, 0x6e, 0x00,
-  0x0c, 0x21, 0x22, 0x18, 0x42, 0x44,
-  0x4a, 0x0a, 0xc0, 0x94, 0x15, 0x80,
-  0x12, 0xb4, 0x50, 0x25, 0x68, 0xa0,
-  0x46, 0x4a, 0x6c, 0x8c, 0x94, 0xd8,
-  0x62, 0x7c, 0x84, 0xc4, 0xf9, 0x08,
-  0x8c, 0x04, 0x89, 0x18, 0x09, 0x10,
-  0x01, 0x74, 0x22, 0x02, 0xe8, 0x44,
-  0x07, 0x83, 0x06, 0x0f, 0x06, 0x0c,
-  0xa0, 0x80, 0x73, 0x41, 0x00, 0xe4,
-  0x18, 0xb1, 0x42, 0x31, 0x62, 0x84,
-  0x91, 0x00, 0x93, 0x22, 0x01, 0x24,
-  0x78, 0x00, 0x1c, 0xf0, 0x00, 0x38,
-  0xdb, 0x4a, 0x7b, 0xb6, 0x94, 0xf4
-};
-
-const uint8_t kMaskRandom46_4[24] = {
-  0xc4, 0xd1, 0x65, 0x89, 0xa2, 0xc8,
-  0x31, 0x62, 0x96, 0x62, 0xc5, 0x2c,
-  0x4b, 0x24, 0x5a, 0x96, 0x48, 0xb4,
-  0x2c, 0xa8, 0xaa, 0x59, 0x51, 0x54
-};
-
-const uint8_t kMaskRandom46_40[240] = {
-  0x64, 0x4a, 0x28, 0xc8, 0x94, 0x50,
-  0x51, 0x48, 0xa2, 0xa2, 0x91, 0x44,
-  0xa9, 0x10, 0x1b, 0x52, 0x20, 0x34,
-  0x04, 0xc4, 0x84, 0x09, 0x89, 0x08,
-  0xd0, 0x01, 0x45, 0xa0, 0x02, 0x88,
-  0x82, 0x40, 0x1d, 0x04, 0x80, 0x38,
-  0x21, 0x37, 0x00, 0x42, 0x6e, 0x00,
-  0x0c, 0x21, 0x22, 0x18, 0x42, 0x44,
-  0x4a, 0x0a, 0xc0, 0x94, 0x15, 0x80,
-  0x12, 0xb4, 0x50, 0x25, 0x68, 0xa0,
-  0x46, 0x4a, 0x6c, 0x8c, 0x94, 0xd8,
-  0x62, 0x7c, 0x84, 0xc4, 0xf9, 0x08,
-  0x8c, 0x04, 0x89, 0x18, 0x09, 0x10,
-  0x01, 0x74, 0x22, 0x02, 0xe8, 0x44,
-  0x07, 0x83, 0x06, 0x0f, 0x06, 0x0c,
-  0xa0, 0x80, 0x73, 0x41, 0x00, 0xe4,
-  0x18, 0xb1, 0x42, 0x31, 0x62, 0x84,
-  0x91, 0x00, 0x93, 0x22, 0x01, 0x24,
-  0x78, 0x00, 0x1c, 0xf0, 0x00, 0x38,
-  0xdb, 0x4a, 0x7b, 0xb6, 0x94, 0xf4,
-  0x46, 0x4a, 0x6c, 0x8c, 0x94, 0xd8,
-  0x62, 0x7c, 0x84, 0xc4, 0xf9, 0x08,
-  0x8c, 0x04, 0x89, 0x18, 0x09, 0x10,
-  0x01, 0x74, 0x22, 0x02, 0xe8, 0x44,
-  0x07, 0x83, 0x06, 0x0f, 0x06, 0x0c,
-  0xa0, 0x80, 0x73, 0x41, 0x00, 0xe4,
-  0x18, 0xb1, 0x42, 0x31, 0x62, 0x84,
-  0x91, 0x00, 0x93, 0x22, 0x01, 0x24,
-  0x78, 0x00, 0x1c, 0xf0, 0x00, 0x38,
-  0x64, 0x4a, 0x28, 0xc8, 0x94, 0x50,
-  0x51, 0x48, 0xa2, 0xa2, 0x91, 0x44,
-  0xa9, 0x10, 0x1b, 0x52, 0x20, 0x34,
-  0x04, 0xc4, 0x84, 0x09, 0x89, 0x08,
-  0xd0, 0x01, 0x45, 0xa0, 0x02, 0x88,
-  0x82, 0x40, 0x1d, 0x04, 0x80, 0x38,
-  0x21, 0x37, 0x00, 0x42, 0x6e, 0x00,
-  0x0c, 0x21, 0x22, 0x18, 0x42, 0x44,
-  0x4a, 0x0a, 0xc0, 0x94, 0x15, 0x80,
-  0x12, 0xb4, 0x50, 0x25, 0x68, 0xa0,
-  0x7c, 0xc8, 0x93, 0x63, 0x3c, 0x80
-};
-
-const uint8_t kMaskRandom46_41[246] = {
-  0x64, 0x4a, 0x28, 0xc8, 0x94, 0x50,
-  0x51, 0x48, 0xa2, 0xa2, 0x91, 0x44,
-  0xa9, 0x10, 0x1b, 0x52, 0x20, 0x34,
-  0x04, 0xc4, 0x84, 0x09, 0x89, 0x08,
-  0xd0, 0x01, 0x45, 0xa0, 0x02, 0x88,
-  0x82, 0x40, 0x1d, 0x04, 0x80, 0x38,
-  0x21, 0x37, 0x00, 0x42, 0x6e, 0x00,
-  0x0c, 0x21, 0x22, 0x18, 0x42, 0x44,
-  0x4a, 0x0a, 0xc0, 0x94, 0x15, 0x80,
-  0x12, 0xb4, 0x50, 0x25, 0x68, 0xa0,
-  0x46, 0x4a, 0x6c, 0x8c, 0x94, 0xd8,
-  0x62, 0x7c, 0x84, 0xc4, 0xf9, 0x08,
-  0x8c, 0x04, 0x89, 0x18, 0x09, 0x10,
-  0x01, 0x74, 0x22, 0x02, 0xe8, 0x44,
-  0x07, 0x83, 0x06, 0x0f, 0x06, 0x0c,
-  0xa0, 0x80, 0x73, 0x41, 0x00, 0xe4,
-  0x18, 0xb1, 0x42, 0x31, 0x62, 0x84,
-  0x91, 0x00, 0x93, 0x22, 0x01, 0x24,
-  0x78, 0x00, 0x1c, 0xf0, 0x00, 0x38,
-  0xdb, 0x4a, 0x7b, 0xb6, 0x94, 0xf4,
-  0x64, 0x4a, 0x28, 0xc8, 0x94, 0x50,
-  0x51, 0x48, 0xa2, 0xa2, 0x91, 0x44,
-  0xa9, 0x10, 0x1b, 0x52, 0x20, 0x34,
-  0x04, 0xc4, 0x84, 0x09, 0x89, 0x08,
-  0xd0, 0x01, 0x45, 0xa0, 0x02, 0x88,
-  0x82, 0x40, 0x1d, 0x04, 0x80, 0x38,
-  0x21, 0x37, 0x00, 0x42, 0x6e, 0x00,
-  0x0c, 0x21, 0x22, 0x18, 0x42, 0x44,
-  0x4a, 0x0a, 0xc0, 0x94, 0x15, 0x80,
-  0x12, 0xb4, 0x50, 0x25, 0x68, 0xa0,
-  0x46, 0x4a, 0x6c, 0x8c, 0x94, 0xd8,
-  0x33, 0x24, 0x26, 0x66, 0x48, 0x4c,
-  0x99, 0x02, 0x13, 0x32, 0x04, 0x24,
-  0x05, 0x80, 0x0e, 0x0b, 0x00, 0x1c,
-  0x80, 0xa1, 0x83, 0x01, 0x43, 0x04,
-  0x84, 0x48, 0x19, 0x08, 0x90, 0x30,
-  0x40, 0x6d, 0x40, 0x80, 0xda, 0x80,
-  0x0a, 0x90, 0xc0, 0x15, 0x21, 0x80,
-  0x68, 0x04, 0x90, 0xd0, 0x09, 0x20,
-  0x10, 0x31, 0x20, 0x20, 0x62, 0x40,
-  0x30, 0x58, 0x04, 0x60, 0xb0, 0x08
-};
-
-const uint8_t kMaskRandom46_42[252] = {
-  0x64, 0x4a, 0x28, 0xc8, 0x94, 0x50,
-  0x51, 0x48, 0xa2, 0xa2, 0x91, 0x44,
-  0xa9, 0x10, 0x1b, 0x52, 0x20, 0x34,
-  0x04, 0xc4, 0x84, 0x09, 0x89, 0x08,
-  0xd0, 0x01, 0x45, 0xa0, 0x02, 0x88,
-  0x82, 0x40, 0x1d, 0x04, 0x80, 0x38,
-  0x21, 0x37, 0x00, 0x42, 0x6e, 0x00,
-  0x0c, 0x21, 0x22, 0x18, 0x42, 0x44,
-  0x4a, 0x0a, 0xc0, 0x94, 0x15, 0x80,
-  0x12, 0xb4, 0x50, 0x25, 0x68, 0xa0,
-  0x46, 0x4a, 0x6c, 0x8c, 0x94, 0xd8,
-  0x33, 0x24, 0x26, 0x66, 0x48, 0x4c,
-  0x99, 0x02, 0x13, 0x32, 0x04, 0x24,
-  0x05, 0x80, 0x0e, 0x0b, 0x00, 0x1c,
-  0x80, 0xa1, 0x83, 0x01, 0x43, 0x04,
-  0x84, 0x48, 0x19, 0x08, 0x90, 0x30,
-  0x40, 0x6d, 0x40, 0x80, 0xda, 0x80,
-  0x0a, 0x90, 0xc0, 0x15, 0x21, 0x80,
-  0x68, 0x04, 0x90, 0xd0, 0x09, 0x20,
-  0x10, 0x31, 0x20, 0x20, 0x62, 0x40,
-  0x30, 0x58, 0x04, 0x60, 0xb0, 0x08,
-  0x64, 0x4a, 0x28, 0xc8, 0x94, 0x50,
-  0x51, 0x48, 0xa2, 0xa2, 0x91, 0x44,
-  0xa9, 0x10, 0x1b, 0x52, 0x20, 0x34,
-  0x04, 0xc4, 0x84, 0x09, 0x89, 0x08,
-  0xd0, 0x01, 0x45, 0xa0, 0x02, 0x88,
-  0x82, 0x40, 0x1d, 0x04, 0x80, 0x38,
-  0x21, 0x37, 0x00, 0x42, 0x6e, 0x00,
-  0x0c, 0x21, 0x22, 0x18, 0x42, 0x44,
-  0x4a, 0x0a, 0xc0, 0x94, 0x15, 0x80,
-  0x12, 0xb4, 0x50, 0x25, 0x68, 0xa0,
-  0x46, 0x4a, 0x6c, 0x8c, 0x94, 0xd8,
-  0x62, 0x7c, 0x84, 0xc4, 0xf9, 0x08,
-  0x8c, 0x04, 0x89, 0x18, 0x09, 0x10,
-  0x01, 0x74, 0x22, 0x02, 0xe8, 0x44,
-  0x07, 0x83, 0x06, 0x0f, 0x06, 0x0c,
-  0xa0, 0x80, 0x73, 0x41, 0x00, 0xe4,
-  0x18, 0xb1, 0x42, 0x31, 0x62, 0x84,
-  0x91, 0x00, 0x93, 0x22, 0x01, 0x24,
-  0x78, 0x00, 0x1c, 0xf0, 0x00, 0x38,
-  0xdb, 0x4a, 0x7b, 0xb6, 0x94, 0xf4,
-  0xfc, 0x6e, 0x89, 0x54, 0x4f, 0x00
-};
-
-const uint8_t kMaskRandom46_43[258] = {
-  0x64, 0x4a, 0x28, 0xc8, 0x94, 0x50,
-  0x51, 0x48, 0xa2, 0xa2, 0x91, 0x44,
-  0xa9, 0x10, 0x1b, 0x52, 0x20, 0x34,
-  0x04, 0xc4, 0x84, 0x09, 0x89, 0x08,
-  0xd0, 0x01, 0x45, 0xa0, 0x02, 0x88,
-  0x82, 0x40, 0x1d, 0x04, 0x80, 0x38,
-  0x21, 0x37, 0x00, 0x42, 0x6e, 0x00,
-  0x0c, 0x21, 0x22, 0x18, 0x42, 0x44,
-  0x4a, 0x0a, 0xc0, 0x94, 0x15, 0x80,
-  0x12, 0xb4, 0x50, 0x25, 0x68, 0xa0,
-  0x46, 0x4a, 0x6c, 0x8c, 0x94, 0xd8,
-  0x33, 0x24, 0x26, 0x66, 0x48, 0x4c,
-  0x99, 0x02, 0x13, 0x32, 0x04, 0x24,
-  0x05, 0x80, 0x0e, 0x0b, 0x00, 0x1c,
-  0x80, 0xa1, 0x83, 0x01, 0x43, 0x04,
-  0x84, 0x48, 0x19, 0x08, 0x90, 0x30,
-  0x40, 0x6d, 0x40, 0x80, 0xda, 0x80,
-  0x0a, 0x90, 0xc0, 0x15, 0x21, 0x80,
-  0x68, 0x04, 0x90, 0xd0, 0x09, 0x20,
-  0x10, 0x31, 0x20, 0x20, 0x62, 0x40,
-  0x30, 0x58, 0x04, 0x60, 0xb0, 0x08,
-  0x46, 0x4a, 0x6c, 0x8c, 0x94, 0xd8,
-  0x33, 0x24, 0x26, 0x66, 0x48, 0x4c,
-  0x99, 0x02, 0x13, 0x32, 0x04, 0x24,
-  0x05, 0x80, 0x0e, 0x0b, 0x00, 0x1c,
-  0x80, 0xa1, 0x83, 0x01, 0x43, 0x04,
-  0x84, 0x48, 0x19, 0x08, 0x90, 0x30,
-  0x40, 0x6d, 0x40, 0x80, 0xda, 0x80,
-  0x0a, 0x90, 0xc0, 0x15, 0x21, 0x80,
-  0x68, 0x04, 0x90, 0xd0, 0x09, 0x20,
-  0x10, 0x31, 0x20, 0x20, 0x62, 0x40,
-  0x30, 0x58, 0x04, 0x60, 0xb0, 0x08,
-  0x64, 0x4a, 0x28, 0xc8, 0x94, 0x50,
-  0x51, 0x48, 0xa2, 0xa2, 0x91, 0x44,
-  0xa9, 0x10, 0x1b, 0x52, 0x20, 0x34,
-  0x04, 0xc4, 0x84, 0x09, 0x89, 0x08,
-  0xd0, 0x01, 0x45, 0xa0, 0x02, 0x88,
-  0x82, 0x40, 0x1d, 0x04, 0x80, 0x38,
-  0x21, 0x37, 0x00, 0x42, 0x6e, 0x00,
-  0x0c, 0x21, 0x22, 0x18, 0x42, 0x44,
-  0x4a, 0x0a, 0xc0, 0x94, 0x15, 0x80,
-  0x12, 0xb4, 0x50, 0x25, 0x68, 0xa0,
-  0xea, 0x8d, 0x1b, 0xd5, 0x1a, 0x34
-};
-
-const uint8_t kMaskRandom46_44[264] = {
-  0x46, 0x4a, 0x6c, 0x8c, 0x94, 0xd8,
-  0x33, 0x24, 0x26, 0x66, 0x48, 0x4c,
-  0x99, 0x02, 0x13, 0x32, 0x04, 0x24,
-  0x05, 0x80, 0x0e, 0x0b, 0x00, 0x1c,
-  0x80, 0xa1, 0x83, 0x01, 0x43, 0x04,
-  0x84, 0x48, 0x19, 0x08, 0x90, 0x30,
-  0x40, 0x6d, 0x40, 0x80, 0xda, 0x80,
-  0x0a, 0x90, 0xc0, 0x15, 0x21, 0x80,
-  0x68, 0x04, 0x90, 0xd0, 0x09, 0x20,
-  0x10, 0x31, 0x20, 0x20, 0x62, 0x40,
-  0x30, 0x58, 0x04, 0x60, 0xb0, 0x08,
-  0x64, 0x4a, 0x28, 0xc8, 0x94, 0x50,
-  0x51, 0x48, 0xa2, 0xa2, 0x91, 0x44,
-  0xa9, 0x10, 0x1b, 0x52, 0x20, 0x34,
-  0x04, 0xc4, 0x84, 0x09, 0x89, 0x08,
-  0xd0, 0x01, 0x45, 0xa0, 0x02, 0x88,
-  0x82, 0x40, 0x1d, 0x04, 0x80, 0x38,
-  0x21, 0x37, 0x00, 0x42, 0x6e, 0x00,
-  0x0c, 0x21, 0x22, 0x18, 0x42, 0x44,
-  0x4a, 0x0a, 0xc0, 0x94, 0x15, 0x80,
-  0x12, 0xb4, 0x50, 0x25, 0x68, 0xa0,
-  0xea, 0x8d, 0x1b, 0xd5, 0x1a, 0x34,
-  0x64, 0x4a, 0x28, 0xc8, 0x94, 0x50,
-  0x51, 0x48, 0xa2, 0xa2, 0x91, 0x44,
-  0xa9, 0x10, 0x1b, 0x52, 0x20, 0x34,
-  0x04, 0xc4, 0x84, 0x09, 0x89, 0x08,
-  0xd0, 0x01, 0x45, 0xa0, 0x02, 0x88,
-  0x82, 0x40, 0x1d, 0x04, 0x80, 0x38,
-  0x21, 0x37, 0x00, 0x42, 0x6e, 0x00,
-  0x0c, 0x21, 0x22, 0x18, 0x42, 0x44,
-  0x4a, 0x0a, 0xc0, 0x94, 0x15, 0x80,
-  0x12, 0xb4, 0x50, 0x25, 0x68, 0xa0,
-  0x46, 0x4a, 0x6c, 0x8c, 0x94, 0xd8,
-  0x33, 0x24, 0x26, 0x66, 0x48, 0x4c,
-  0x99, 0x02, 0x13, 0x32, 0x04, 0x24,
-  0x05, 0x80, 0x0e, 0x0b, 0x00, 0x1c,
-  0x80, 0xa1, 0x83, 0x01, 0x43, 0x04,
-  0x84, 0x48, 0x19, 0x08, 0x90, 0x30,
-  0x40, 0x6d, 0x40, 0x80, 0xda, 0x80,
-  0x0a, 0x90, 0xc0, 0x15, 0x21, 0x80,
-  0x68, 0x04, 0x90, 0xd0, 0x09, 0x20,
-  0x10, 0x31, 0x20, 0x20, 0x62, 0x40,
-  0x30, 0x58, 0x04, 0x60, 0xb0, 0x08,
-  0x1a, 0x8a, 0x00, 0x1c, 0x89, 0x54
-};
-
-const uint8_t kMaskRandom46_45[270] = {
-  0x46, 0x4a, 0x6c, 0x8c, 0x94, 0xd8,
-  0x33, 0x24, 0x26, 0x66, 0x48, 0x4c,
-  0x99, 0x02, 0x13, 0x32, 0x04, 0x24,
-  0x05, 0x80, 0x0e, 0x0b, 0x00, 0x1c,
-  0x80, 0xa1, 0x83, 0x01, 0x43, 0x04,
-  0x84, 0x48, 0x19, 0x08, 0x90, 0x30,
-  0x40, 0x6d, 0x40, 0x80, 0xda, 0x80,
-  0x0a, 0x90, 0xc0, 0x15, 0x21, 0x80,
-  0x68, 0x04, 0x90, 0xd0, 0x09, 0x20,
-  0x10, 0x31, 0x20, 0x20, 0x62, 0x40,
-  0x30, 0x58, 0x04, 0x60, 0xb0, 0x08,
-  0x64, 0x4a, 0x28, 0xc8, 0x94, 0x50,
-  0x51, 0x48, 0xa2, 0xa2, 0x91, 0x44,
-  0xa9, 0x10, 0x1b, 0x52, 0x20, 0x34,
-  0x04, 0xc4, 0x84, 0x09, 0x89, 0x08,
-  0xd0, 0x01, 0x45, 0xa0, 0x02, 0x88,
-  0x82, 0x40, 0x1d, 0x04, 0x80, 0x38,
-  0x21, 0x37, 0x00, 0x42, 0x6e, 0x00,
-  0x0c, 0x21, 0x22, 0x18, 0x42, 0x44,
-  0x4a, 0x0a, 0xc0, 0x94, 0x15, 0x80,
-  0x12, 0xb4, 0x50, 0x25, 0x68, 0xa0,
-  0xea, 0x8d, 0x1b, 0xd5, 0x1a, 0x34,
-  0x46, 0x4a, 0x6c, 0x8c, 0x94, 0xd8,
-  0x33, 0x24, 0x26, 0x66, 0x48, 0x4c,
-  0x99, 0x02, 0x13, 0x32, 0x04, 0x24,
-  0x05, 0x80, 0x0e, 0x0b, 0x00, 0x1c,
-  0x80, 0xa1, 0x83, 0x01, 0x43, 0x04,
-  0x84, 0x48, 0x19, 0x08, 0x90, 0x30,
-  0x40, 0x6d, 0x40, 0x80, 0xda, 0x80,
-  0x0a, 0x90, 0xc0, 0x15, 0x21, 0x80,
-  0x68, 0x04, 0x90, 0xd0, 0x09, 0x20,
-  0x10, 0x31, 0x20, 0x20, 0x62, 0x40,
-  0x30, 0x58, 0x04, 0x60, 0xb0, 0x08,
-  0x46, 0x42, 0x0c, 0x8c, 0x84, 0x18,
-  0x33, 0x20, 0x46, 0x66, 0x40, 0x8c,
-  0x99, 0x08, 0x0b, 0x32, 0x10, 0x14,
-  0x05, 0x84, 0x30, 0x0b, 0x08, 0x60,
-  0x80, 0xb0, 0x23, 0x01, 0x60, 0x44,
-  0x84, 0x42, 0x91, 0x08, 0x85, 0x20,
-  0x40, 0x73, 0x00, 0x80, 0xe6, 0x00,
-  0x0a, 0x81, 0x12, 0x15, 0x02, 0x24,
-  0x68, 0x0c, 0x40, 0xd0, 0x18, 0x80,
-  0x10, 0x24, 0x84, 0x20, 0x49, 0x08,
-  0x30, 0x51, 0x40, 0x60, 0xa2, 0x80,
-  0x5f, 0x50, 0x88, 0xbe, 0xa1, 0x10
-};
-
-const uint8_t kMaskRandom46_46[276] = {
-  0x46, 0x4a, 0x6c, 0x8c, 0x94, 0xd8,
-  0x33, 0x24, 0x26, 0x66, 0x48, 0x4c,
-  0x99, 0x02, 0x13, 0x32, 0x04, 0x24,
-  0x05, 0x80, 0x0e, 0x0b, 0x00, 0x1c,
-  0x80, 0xa1, 0x83, 0x01, 0x43, 0x04,
-  0x84, 0x48, 0x19, 0x08, 0x90, 0x30,
-  0x40, 0x6d, 0x40, 0x80, 0xda, 0x80,
-  0x0a, 0x90, 0xc0, 0x15, 0x21, 0x80,
-  0x68, 0x04, 0x90, 0xd0, 0x09, 0x20,
-  0x10, 0x31, 0x20, 0x20, 0x62, 0x40,
-  0x30, 0x58, 0x04, 0x60, 0xb0, 0x08,
-  0x46, 0x42, 0x0c, 0x8c, 0x84, 0x18,
-  0x33, 0x20, 0x46, 0x66, 0x40, 0x8c,
-  0x99, 0x08, 0x0b, 0x32, 0x10, 0x14,
-  0x05, 0x84, 0x30, 0x0b, 0x08, 0x60,
-  0x80, 0xb0, 0x23, 0x01, 0x60, 0x44,
-  0x84, 0x42, 0x91, 0x08, 0x85, 0x20,
-  0x40, 0x73, 0x00, 0x80, 0xe6, 0x00,
-  0x0a, 0x81, 0x12, 0x15, 0x02, 0x24,
-  0x68, 0x0c, 0x40, 0xd0, 0x18, 0x80,
-  0x10, 0x24, 0x84, 0x20, 0x49, 0x08,
-  0x30, 0x51, 0x40, 0x60, 0xa2, 0x80,
-  0x5f, 0x50, 0x88, 0xbe, 0xa1, 0x10,
-  0x46, 0x4a, 0x6c, 0x8c, 0x94, 0xd8,
-  0x33, 0x24, 0x26, 0x66, 0x48, 0x4c,
-  0x99, 0x02, 0x13, 0x32, 0x04, 0x24,
-  0x05, 0x80, 0x0e, 0x0b, 0x00, 0x1c,
-  0x80, 0xa1, 0x83, 0x01, 0x43, 0x04,
-  0x84, 0x48, 0x19, 0x08, 0x90, 0x30,
-  0x40, 0x6d, 0x40, 0x80, 0xda, 0x80,
-  0x0a, 0x90, 0xc0, 0x15, 0x21, 0x80,
-  0x68, 0x04, 0x90, 0xd0, 0x09, 0x20,
-  0x10, 0x31, 0x20, 0x20, 0x62, 0x40,
-  0x30, 0x58, 0x04, 0x60, 0xb0, 0x08,
-  0x64, 0x4a, 0x28, 0xc8, 0x94, 0x50,
-  0x51, 0x48, 0xa2, 0xa2, 0x91, 0x44,
-  0xa9, 0x10, 0x1b, 0x52, 0x20, 0x34,
-  0x04, 0xc4, 0x84, 0x09, 0x89, 0x08,
-  0xd0, 0x01, 0x45, 0xa0, 0x02, 0x88,
-  0x82, 0x40, 0x1d, 0x04, 0x80, 0x38,
-  0x21, 0x37, 0x00, 0x42, 0x6e, 0x00,
-  0x0c, 0x21, 0x22, 0x18, 0x42, 0x44,
-  0x4a, 0x0a, 0xc0, 0x94, 0x15, 0x80,
-  0x12, 0xb4, 0x50, 0x25, 0x68, 0xa0,
-  0xea, 0x8d, 0x1b, 0xd5, 0x1a, 0x34,
-  0xd5, 0xdf, 0x59, 0xb9, 0xba, 0x10
-};
-
-const uint8_t kMaskRandom46_5[30] = {
-  0xc6, 0xca, 0x6d, 0x8d, 0x94, 0xd8,
-  0x63, 0x6c, 0x96, 0xc6, 0xd9, 0x2c,
-  0x1d, 0xa1, 0xdc, 0x3b, 0x43, 0xb8,
-  0xad, 0x55, 0x39, 0x5a, 0xaa, 0x70,
-  0xb2, 0xb7, 0x07, 0x65, 0x6e, 0x0c
-};
-
-const uint8_t kMaskRandom46_6[36] = {
-  0x64, 0x4a, 0x28, 0xc8, 0x94, 0x50,
-  0x51, 0x58, 0xa2, 0xa2, 0xb1, 0x44,
-  0x0c, 0xa4, 0x30, 0x19, 0x48, 0x60,
-  0xa1, 0x22, 0x47, 0x42, 0x44, 0x8c,
-  0x12, 0xa1, 0x1c, 0x25, 0x42, 0x38,
-  0x8a, 0x45, 0xc1, 0x14, 0x8b, 0x80
-};
-
-const uint8_t kMaskRandom46_7[42] = {
-  0x46, 0x4a, 0x6c, 0x8c, 0x94, 0xd8,
-  0x33, 0x24, 0x26, 0x66, 0x48, 0x4c,
-  0x91, 0x92, 0x13, 0x23, 0x24, 0x24,
-  0xa4, 0x20, 0x4b, 0x48, 0x40, 0x94,
-  0x50, 0xa0, 0xd4, 0xa1, 0x41, 0xa8,
-  0x84, 0xc5, 0x81, 0x09, 0x8b, 0x00,
-  0x09, 0x71, 0x0c, 0x12, 0xe2, 0x18
-};
-
-const uint8_t kMaskRandom46_8[48] = {
-  0x0c, 0x84, 0x0c, 0x19, 0x08, 0x18,
-  0x80, 0x70, 0x07, 0x00, 0xe0, 0x0c,
-  0xa0, 0x88, 0x49, 0x41, 0x10, 0x90,
-  0x05, 0x40, 0x32, 0x0a, 0x80, 0x64,
-  0x43, 0x02, 0x82, 0x86, 0x05, 0x04,
-  0x1a, 0x01, 0x50, 0x34, 0x02, 0xa0,
-  0x60, 0x27, 0x00, 0xc0, 0x4e, 0x00,
-  0x14, 0x38, 0xa0, 0x28, 0x71, 0x40
-};
-
-const uint8_t kMaskRandom46_9[54] = {
-  0x46, 0x4a, 0x6c, 0x8c, 0x94, 0xd8,
-  0x62, 0x7c, 0x84, 0xc4, 0xf9, 0x08,
-  0x8c, 0x04, 0x89, 0x18, 0x09, 0x10,
-  0x01, 0x74, 0x22, 0x02, 0xe8, 0x44,
-  0x07, 0x83, 0x06, 0x0f, 0x06, 0x0c,
-  0xa0, 0x80, 0x73, 0x41, 0x00, 0xe4,
-  0x18, 0xb1, 0x42, 0x31, 0x62, 0x84,
-  0x91, 0x00, 0x93, 0x22, 0x01, 0x24,
-  0x78, 0x00, 0x1c, 0xf0, 0x00, 0x38
-};
-
-const uint8_t kMaskRandom47_1[6] = {
-  0xff, 0xff, 0xff, 0xff, 0xff, 0xfe
-};
-
-const uint8_t kMaskRandom47_10[60] = {
-  0x64, 0x4a, 0x28, 0x22, 0x8a, 0x28,
-  0x51, 0x48, 0xa2, 0x8a, 0x68, 0xa6,
-  0xa9, 0x10, 0x1a, 0x00, 0x90, 0x0a,
-  0x04, 0xc4, 0x84, 0x21, 0x06, 0x12,
-  0xd0, 0x01, 0x44, 0x94, 0x29, 0x42,
-  0x82, 0x40, 0x1c, 0x81, 0x48, 0x14,
-  0x21, 0x37, 0x01, 0x40, 0xd4, 0x04,
-  0x0c, 0x21, 0x23, 0x11, 0x01, 0x18,
-  0x4a, 0x0a, 0xc1, 0x0c, 0x10, 0xc0,
-  0x12, 0xb4, 0x50, 0xa8, 0x1a, 0x80
-};
-
-const uint8_t kMaskRandom47_11[66] = {
-  0x46, 0x4a, 0x6c, 0xa6, 0xca, 0x68,
-  0x33, 0x24, 0x27, 0x40, 0x64, 0x22,
-  0x99, 0x02, 0x12, 0x2a, 0x22, 0x82,
-  0x05, 0x80, 0x0e, 0x06, 0xa0, 0x2a,
-  0x80, 0xa1, 0x83, 0x19, 0x11, 0x90,
-  0x84, 0x48, 0x18, 0x51, 0x05, 0x10,
-  0x40, 0x6d, 0x40, 0x10, 0x91, 0x08,
-  0x0a, 0x90, 0xc1, 0x32, 0x03, 0x20,
-  0x68, 0x04, 0x90, 0x45, 0x24, 0x52,
-  0x10, 0x31, 0x20, 0x8c, 0x08, 0xc0,
-  0x30, 0x58, 0x05, 0x18, 0x58, 0x04
-};
-
-const uint8_t kMaskRandom47_12[72] = {
-  0x64, 0x4a, 0x28, 0x20, 0xc2, 0x0c,
-  0x51, 0x58, 0xa2, 0x04, 0x60, 0x46,
-  0x0c, 0xa4, 0x30, 0x80, 0xa8, 0x0a,
-  0xa1, 0x22, 0x46, 0x43, 0x04, 0x30,
-  0x12, 0xa1, 0x1d, 0x02, 0x30, 0x22,
-  0x8a, 0x45, 0xc0, 0x29, 0x02, 0x90,
-  0x86, 0x8a, 0x6d, 0x30, 0x13, 0x00,
-  0x23, 0x2c, 0x84, 0x11, 0x21, 0x12,
-  0x16, 0x21, 0x98, 0xc4, 0x0c, 0x40,
-  0x4c, 0x30, 0x54, 0x48, 0x44, 0x84,
-  0x41, 0xc1, 0x27, 0x14, 0x11, 0x40,
-  0x19, 0x56, 0xe5, 0x08, 0x90, 0x88
-};
-
-const uint8_t kMaskRandom47_13[78] = {
-  0x64, 0x4a, 0x28, 0xa2, 0x8a, 0x28,
-  0x51, 0x58, 0xa3, 0x8a, 0x38, 0xa2,
-  0x0c, 0xa4, 0x30, 0x43, 0x04, 0x30,
-  0xa1, 0x22, 0x46, 0x24, 0x62, 0x46,
-  0x12, 0xa1, 0x1c, 0x11, 0xc1, 0x1c,
-  0x8a, 0x45, 0xc0, 0x5c, 0x05, 0xc0,
-  0x46, 0x4a, 0x6c, 0xa6, 0xca, 0x6c,
-  0x33, 0x24, 0x26, 0x42, 0x64, 0x26,
-  0x91, 0x92, 0x13, 0x21, 0x32, 0x12,
-  0xa4, 0x20, 0x4a, 0x04, 0xa0, 0x4a,
-  0x50, 0xa0, 0xd4, 0x0d, 0x40, 0xd4,
-  0x84, 0xc5, 0x80, 0x58, 0x05, 0x80,
-  0x09, 0x71, 0x0d, 0x10, 0xd1, 0x0c
-};
-
-const uint8_t kMaskRandom47_14[84] = {
-  0x46, 0x4a, 0x6c, 0xa6, 0xca, 0x6c,
-  0x33, 0x24, 0x26, 0x42, 0x64, 0x26,
-  0x91, 0x92, 0x13, 0x21, 0x32, 0x12,
-  0xa4, 0x20, 0x4a, 0x04, 0xa0, 0x4a,
-  0x50, 0xa0, 0xd4, 0x0d, 0x40, 0xd4,
-  0x84, 0xc5, 0x80, 0x58, 0x05, 0x80,
-  0x09, 0x71, 0x0d, 0x10, 0xd1, 0x0c,
-  0x64, 0x4a, 0x28, 0xa2, 0x8a, 0x28,
-  0x51, 0x58, 0xa3, 0x8a, 0x38, 0xa2,
-  0x0c, 0xa4, 0x30, 0x43, 0x04, 0x30,
-  0xa1, 0x22, 0x46, 0x24, 0x62, 0x46,
-  0x12, 0xa1, 0x1c, 0x11, 0xc1, 0x1c,
-  0x8a, 0x45, 0xc0, 0x5c, 0x05, 0xc0,
-  0x9c, 0x3f, 0xb3, 0xe5, 0xad, 0x1c
-};
-
-const uint8_t kMaskRandom47_15[90] = {
-  0x46, 0x4a, 0x6c, 0xa6, 0xca, 0x6c,
-  0x33, 0x24, 0x26, 0x42, 0x64, 0x26,
-  0x91, 0x92, 0x13, 0x21, 0x32, 0x12,
-  0xa4, 0x20, 0x4a, 0x04, 0xa0, 0x4a,
-  0x50, 0xa0, 0xd4, 0x0d, 0x40, 0xd4,
-  0x84, 0xc5, 0x80, 0x58, 0x05, 0x80,
-  0x09, 0x71, 0x0d, 0x10, 0xd1, 0x0c,
-  0x0c, 0x84, 0x0c, 0x40, 0xc4, 0x0c,
-  0x80, 0x70, 0x07, 0x00, 0x70, 0x06,
-  0xa0, 0x88, 0x48, 0x84, 0x88, 0x48,
-  0x05, 0x40, 0x32, 0x03, 0x20, 0x32,
-  0x43, 0x02, 0x82, 0x28, 0x22, 0x82,
-  0x1a, 0x01, 0x50, 0x15, 0x01, 0x50,
-  0x60, 0x27, 0x00, 0x70, 0x07, 0x00,
-  0x14, 0x38, 0xa1, 0x8a, 0x18, 0xa0
-};
-
-const uint8_t kMaskRandom47_16[96] = {
-  0x0c, 0x84, 0x0c, 0x40, 0xc4, 0x0c,
-  0x80, 0x70, 0x07, 0x00, 0x70, 0x06,
-  0xa0, 0x88, 0x48, 0x84, 0x88, 0x48,
-  0x05, 0x40, 0x32, 0x03, 0x20, 0x32,
-  0x43, 0x02, 0x82, 0x28, 0x22, 0x82,
-  0x1a, 0x01, 0x50, 0x15, 0x01, 0x50,
-  0x60, 0x27, 0x00, 0x70, 0x07, 0x00,
-  0x14, 0x38, 0xa1, 0x8a, 0x18, 0xa0,
-  0x46, 0x4a, 0x6c, 0xa6, 0xca, 0x6c,
-  0x33, 0x24, 0x26, 0x42, 0x64, 0x26,
-  0x91, 0x92, 0x13, 0x21, 0x32, 0x12,
-  0xa4, 0x20, 0x4a, 0x04, 0xa0, 0x4a,
-  0x50, 0xa0, 0xd4, 0x0d, 0x40, 0xd4,
-  0x84, 0xc5, 0x80, 0x58, 0x05, 0x80,
-  0x09, 0x71, 0x0d, 0x10, 0xd1, 0x0c,
-  0xfa, 0xd9, 0xf5, 0xfe, 0xdc, 0x14
-};
-
-const uint8_t kMaskRandom47_17[102] = {
-  0x0c, 0x84, 0x0c, 0x40, 0xc4, 0x0c,
-  0x80, 0x70, 0x07, 0x00, 0x70, 0x06,
-  0xa0, 0x88, 0x48, 0x84, 0x88, 0x48,
-  0x05, 0x40, 0x32, 0x03, 0x20, 0x32,
-  0x43, 0x02, 0x82, 0x28, 0x22, 0x82,
-  0x1a, 0x01, 0x50, 0x15, 0x01, 0x50,
-  0x60, 0x27, 0x00, 0x70, 0x07, 0x00,
-  0x14, 0x38, 0xa1, 0x8a, 0x18, 0xa0,
-  0x46, 0x4a, 0x6c, 0xa6, 0xca, 0x6c,
-  0x62, 0x7c, 0x85, 0xc8, 0x5c, 0x84,
-  0x8c, 0x04, 0x88, 0x48, 0x84, 0x88,
-  0x01, 0x74, 0x23, 0x42, 0x34, 0x22,
-  0x07, 0x83, 0x06, 0x30, 0x63, 0x06,
-  0xa0, 0x80, 0x72, 0x07, 0x20, 0x72,
-  0x18, 0xb1, 0x43, 0x14, 0x31, 0x42,
-  0x91, 0x00, 0x92, 0x09, 0x20, 0x92,
-  0x78, 0x00, 0x1c, 0x01, 0xc0, 0x1c
-};
-
-const uint8_t kMaskRandom47_18[108] = {
-  0x46, 0x4a, 0x6c, 0xa6, 0xca, 0x6c,
-  0x62, 0x7c, 0x85, 0xc8, 0x5c, 0x84,
-  0x8c, 0x04, 0x88, 0x48, 0x84, 0x88,
-  0x01, 0x74, 0x23, 0x42, 0x34, 0x22,
-  0x07, 0x83, 0x06, 0x30, 0x63, 0x06,
-  0xa0, 0x80, 0x72, 0x07, 0x20, 0x72,
-  0x18, 0xb1, 0x43, 0x14, 0x31, 0x42,
-  0x91, 0x00, 0x92, 0x09, 0x20, 0x92,
-  0x78, 0x00, 0x1c, 0x01, 0xc0, 0x1c,
-  0x0c, 0x84, 0x0c, 0x40, 0xc4, 0x0c,
-  0x80, 0x70, 0x07, 0x00, 0x70, 0x06,
-  0xa0, 0x88, 0x48, 0x84, 0x88, 0x48,
-  0x05, 0x40, 0x32, 0x03, 0x20, 0x32,
-  0x43, 0x02, 0x82, 0x28, 0x22, 0x82,
-  0x1a, 0x01, 0x50, 0x15, 0x01, 0x50,
-  0x60, 0x27, 0x00, 0x70, 0x07, 0x00,
-  0x14, 0x38, 0xa1, 0x8a, 0x18, 0xa0,
-  0x82, 0x32, 0x56, 0x68, 0xa1, 0x5c
-};
-
-const uint8_t kMaskRandom47_19[114] = {
-  0x46, 0x4a, 0x6c, 0xa6, 0xca, 0x6c,
-  0x62, 0x7c, 0x85, 0xc8, 0x5c, 0x84,
-  0x8c, 0x04, 0x88, 0x48, 0x84, 0x88,
-  0x01, 0x74, 0x23, 0x42, 0x34, 0x22,
-  0x07, 0x83, 0x06, 0x30, 0x63, 0x06,
-  0xa0, 0x80, 0x72, 0x07, 0x20, 0x72,
-  0x18, 0xb1, 0x43, 0x14, 0x31, 0x42,
-  0x91, 0x00, 0x92, 0x09, 0x20, 0x92,
-  0x78, 0x00, 0x1c, 0x01, 0xc0, 0x1c,
-  0x64, 0x4a, 0x28, 0xa2, 0x8a, 0x28,
-  0x51, 0x48, 0xa2, 0x8a, 0x28, 0xa2,
-  0xa9, 0x10, 0x1b, 0x01, 0xb0, 0x1a,
-  0x04, 0xc4, 0x84, 0x48, 0x44, 0x84,
-  0xd0, 0x01, 0x44, 0x14, 0x41, 0x44,
-  0x82, 0x40, 0x1c, 0x01, 0xc0, 0x1c,
-  0x21, 0x37, 0x01, 0x70, 0x17, 0x00,
-  0x0c, 0x21, 0x22, 0x12, 0x21, 0x22,
-  0x4a, 0x0a, 0xc0, 0xac, 0x0a, 0xc0,
-  0x12, 0xb4, 0x51, 0x45, 0x14, 0x50
-};
-
-const uint8_t kMaskRandom47_2[12] = {
-  0xec, 0xdd, 0x99, 0xd9, 0x9d, 0x98,
-  0x9b, 0xb2, 0x77, 0x27, 0x72, 0x76
-};
-
-const uint8_t kMaskRandom47_20[120] = {
-  0x64, 0x4a, 0x28, 0xa2, 0x8a, 0x28,
-  0x51, 0x48, 0xa2, 0x8a, 0x28, 0xa2,
-  0xa9, 0x10, 0x1b, 0x01, 0xb0, 0x1a,
-  0x04, 0xc4, 0x84, 0x48, 0x44, 0x84,
-  0xd0, 0x01, 0x44, 0x14, 0x41, 0x44,
-  0x82, 0x40, 0x1c, 0x01, 0xc0, 0x1c,
-  0x21, 0x37, 0x01, 0x70, 0x17, 0x00,
-  0x0c, 0x21, 0x22, 0x12, 0x21, 0x22,
-  0x4a, 0x0a, 0xc0, 0xac, 0x0a, 0xc0,
-  0x12, 0xb4, 0x51, 0x45, 0x14, 0x50,
-  0x46, 0x4a, 0x6c, 0xa6, 0xca, 0x6c,
-  0x62, 0x7c, 0x85, 0xc8, 0x5c, 0x84,
-  0x8c, 0x04, 0x88, 0x48, 0x84, 0x88,
-  0x01, 0x74, 0x23, 0x42, 0x34, 0x22,
-  0x07, 0x83, 0x06, 0x30, 0x63, 0x06,
-  0xa0, 0x80, 0x72, 0x07, 0x20, 0x72,
-  0x18, 0xb1, 0x43, 0x14, 0x31, 0x42,
-  0x91, 0x00, 0x92, 0x09, 0x20, 0x92,
-  0x78, 0x00, 0x1c, 0x01, 0xc0, 0x1c,
-  0xdb, 0x4a, 0x7b, 0x31, 0x45, 0x2a
-};
-
-const uint8_t kMaskRandom47_21[126] = {
-  0x64, 0x4a, 0x28, 0xa2, 0x8a, 0x28,
-  0x51, 0x48, 0xa2, 0x8a, 0x28, 0xa2,
-  0xa9, 0x10, 0x1b, 0x01, 0xb0, 0x1a,
-  0x04, 0xc4, 0x84, 0x48, 0x44, 0x84,
-  0xd0, 0x01, 0x44, 0x14, 0x41, 0x44,
-  0x82, 0x40, 0x1c, 0x01, 0xc0, 0x1c,
-  0x21, 0x37, 0x01, 0x70, 0x17, 0x00,
-  0x0c, 0x21, 0x22, 0x12, 0x21, 0x22,
-  0x4a, 0x0a, 0xc0, 0xac, 0x0a, 0xc0,
-  0x12, 0xb4, 0x51, 0x45, 0x14, 0x50,
-  0x46, 0x4a, 0x6c, 0xa6, 0xca, 0x6c,
-  0x33, 0x24, 0x26, 0x42, 0x64, 0x26,
-  0x99, 0x02, 0x12, 0x21, 0x22, 0x12,
-  0x05, 0x80, 0x0e, 0x00, 0xe0, 0x0e,
-  0x80, 0xa1, 0x82, 0x18, 0x21, 0x82,
-  0x84, 0x48, 0x18, 0x81, 0x88, 0x18,
-  0x40, 0x6d, 0x40, 0xd4, 0x0d, 0x40,
-  0x0a, 0x90, 0xc1, 0x0c, 0x10, 0xc0,
-  0x68, 0x04, 0x90, 0x49, 0x04, 0x90,
-  0x10, 0x31, 0x21, 0x12, 0x11, 0x20,
-  0x30, 0x58, 0x05, 0x80, 0x58, 0x04
-};
-
-const uint8_t kMaskRandom47_22[132] = {
-  0x46, 0x4a, 0x6c, 0xa6, 0xca, 0x6c,
-  0x33, 0x24, 0x26, 0x42, 0x64, 0x26,
-  0x99, 0x02, 0x12, 0x21, 0x22, 0x12,
-  0x05, 0x80, 0x0e, 0x00, 0xe0, 0x0e,
-  0x80, 0xa1, 0x82, 0x18, 0x21, 0x82,
-  0x84, 0x48, 0x18, 0x81, 0x88, 0x18,
-  0x40, 0x6d, 0x40, 0xd4, 0x0d, 0x40,
-  0x0a, 0x90, 0xc1, 0x0c, 0x10, 0xc0,
-  0x68, 0x04, 0x90, 0x49, 0x04, 0x90,
-  0x10, 0x31, 0x21, 0x12, 0x11, 0x20,
-  0x30, 0x58, 0x05, 0x80, 0x58, 0x04,
-  0x64, 0x4a, 0x28, 0xa2, 0x8a, 0x28,
-  0x51, 0x48, 0xa2, 0x8a, 0x28, 0xa2,
-  0xa9, 0x10, 0x1b, 0x01, 0xb0, 0x1a,
-  0x04, 0xc4, 0x84, 0x48, 0x44, 0x84,
-  0xd0, 0x01, 0x44, 0x14, 0x41, 0x44,
-  0x82, 0x40, 0x1c, 0x01, 0xc0, 0x1c,
-  0x21, 0x37, 0x01, 0x70, 0x17, 0x00,
-  0x0c, 0x21, 0x22, 0x12, 0x21, 0x22,
-  0x4a, 0x0a, 0xc0, 0xac, 0x0a, 0xc0,
-  0x12, 0xb4, 0x51, 0x45, 0x14, 0x50,
-  0xea, 0x8d, 0x1a, 0x35, 0x55, 0xdc
-};
-
-const uint8_t kMaskRandom47_23[138] = {
-  0x46, 0x4a, 0x6c, 0xa6, 0xca, 0x6c,
-  0x33, 0x24, 0x26, 0x42, 0x64, 0x26,
-  0x99, 0x02, 0x12, 0x21, 0x22, 0x12,
-  0x05, 0x80, 0x0e, 0x00, 0xe0, 0x0e,
-  0x80, 0xa1, 0x82, 0x18, 0x21, 0x82,
-  0x84, 0x48, 0x18, 0x81, 0x88, 0x18,
-  0x40, 0x6d, 0x40, 0xd4, 0x0d, 0x40,
-  0x0a, 0x90, 0xc1, 0x0c, 0x10, 0xc0,
-  0x68, 0x04, 0x90, 0x49, 0x04, 0x90,
-  0x10, 0x31, 0x21, 0x12, 0x11, 0x20,
-  0x30, 0x58, 0x05, 0x80, 0x58, 0x04,
-  0x46, 0x42, 0x0c, 0x20, 0xc2, 0x0c,
-  0x33, 0x20, 0x46, 0x04, 0x60, 0x46,
-  0x99, 0x08, 0x0a, 0x80, 0xa8, 0x0a,
-  0x05, 0x84, 0x30, 0x43, 0x04, 0x30,
-  0x80, 0xb0, 0x23, 0x02, 0x30, 0x22,
-  0x84, 0x42, 0x90, 0x29, 0x02, 0x90,
-  0x40, 0x73, 0x01, 0x30, 0x13, 0x00,
-  0x0a, 0x81, 0x12, 0x11, 0x21, 0x12,
-  0x68, 0x0c, 0x40, 0xc4, 0x0c, 0x40,
-  0x10, 0x24, 0x84, 0x48, 0x44, 0x84,
-  0x30, 0x51, 0x41, 0x14, 0x11, 0x40,
-  0x5f, 0x50, 0x89, 0x08, 0x90, 0x88
-};
-
-const uint8_t kMaskRandom47_24[144] = {
-  0x64, 0x4a, 0x28, 0x20, 0xc2, 0x0c,
-  0x51, 0x58, 0xa2, 0x04, 0x60, 0x46,
-  0x0c, 0xa4, 0x30, 0x80, 0xa8, 0x0a,
-  0xa1, 0x22, 0x46, 0x43, 0x04, 0x30,
-  0x12, 0xa1, 0x1d, 0x02, 0x30, 0x22,
-  0x8a, 0x45, 0xc0, 0x29, 0x02, 0x90,
-  0x86, 0x8a, 0x6d, 0x30, 0x13, 0x00,
-  0x23, 0x2c, 0x84, 0x11, 0x21, 0x12,
-  0x16, 0x21, 0x98, 0xc4, 0x0c, 0x40,
-  0x4c, 0x30, 0x54, 0x48, 0x44, 0x84,
-  0x41, 0xc1, 0x27, 0x14, 0x11, 0x40,
-  0x19, 0x56, 0xe5, 0x08, 0x90, 0x88,
-  0x46, 0x4a, 0x6c, 0xa6, 0xca, 0x68,
-  0x33, 0x24, 0x27, 0x40, 0x64, 0x22,
-  0x99, 0x02, 0x12, 0x2a, 0x22, 0x82,
-  0x05, 0x80, 0x0e, 0x06, 0xa0, 0x2a,
-  0x80, 0xa1, 0x83, 0x19, 0x11, 0x90,
-  0x84, 0x48, 0x18, 0x51, 0x05, 0x10,
-  0x40, 0x6d, 0x40, 0x10, 0x91, 0x08,
-  0x0a, 0x90, 0xc1, 0x32, 0x03, 0x20,
-  0x68, 0x04, 0x90, 0x45, 0x24, 0x52,
-  0x10, 0x31, 0x20, 0x8c, 0x08, 0xc0,
-  0x30, 0x58, 0x05, 0x18, 0x58, 0x04,
-  0x27, 0x41, 0x35, 0x57, 0x7e, 0x6a
-};
-
-const uint8_t kMaskRandom47_25[150] = {
-  0x64, 0x4a, 0x28, 0x20, 0xc2, 0x0c,
-  0x51, 0x58, 0xa2, 0x04, 0x60, 0x46,
-  0x0c, 0xa4, 0x30, 0x80, 0xa8, 0x0a,
-  0xa1, 0x22, 0x46, 0x43, 0x04, 0x30,
-  0x12, 0xa1, 0x1d, 0x02, 0x30, 0x22,
-  0x8a, 0x45, 0xc0, 0x29, 0x02, 0x90,
-  0x86, 0x8a, 0x6d, 0x30, 0x13, 0x00,
-  0x23, 0x2c, 0x84, 0x11, 0x21, 0x12,
-  0x16, 0x21, 0x98, 0xc4, 0x0c, 0x40,
-  0x4c, 0x30, 0x54, 0x48, 0x44, 0x84,
-  0x41, 0xc1, 0x27, 0x14, 0x11, 0x40,
-  0x19, 0x56, 0xe5, 0x08, 0x90, 0x88,
-  0x64, 0x4a, 0x28, 0xa2, 0x8a, 0x28,
-  0x51, 0x58, 0xa3, 0x8a, 0x38, 0xa2,
-  0x0c, 0xa4, 0x30, 0x43, 0x04, 0x30,
-  0xa1, 0x22, 0x46, 0x24, 0x62, 0x46,
-  0x12, 0xa1, 0x1c, 0x11, 0xc1, 0x1c,
-  0x8a, 0x45, 0xc0, 0x5c, 0x05, 0xc0,
-  0x46, 0x4a, 0x6c, 0xa6, 0xca, 0x6c,
-  0x33, 0x24, 0x26, 0x42, 0x64, 0x26,
-  0x91, 0x92, 0x13, 0x21, 0x32, 0x12,
-  0xa4, 0x20, 0x4a, 0x04, 0xa0, 0x4a,
-  0x50, 0xa0, 0xd4, 0x0d, 0x40, 0xd4,
-  0x84, 0xc5, 0x80, 0x58, 0x05, 0x80,
-  0x09, 0x71, 0x0d, 0x10, 0xd1, 0x0c
-};
-
-const uint8_t kMaskRandom47_26[156] = {
-  0x64, 0x4a, 0x28, 0xa2, 0x8a, 0x28,
-  0x51, 0x58, 0xa3, 0x8a, 0x38, 0xa2,
-  0x0c, 0xa4, 0x30, 0x43, 0x04, 0x30,
-  0xa1, 0x22, 0x46, 0x24, 0x62, 0x46,
-  0x12, 0xa1, 0x1c, 0x11, 0xc1, 0x1c,
-  0x8a, 0x45, 0xc0, 0x5c, 0x05, 0xc0,
-  0x46, 0x4a, 0x6c, 0xa6, 0xca, 0x6c,
-  0x33, 0x24, 0x26, 0x42, 0x64, 0x26,
-  0x91, 0x92, 0x13, 0x21, 0x32, 0x12,
-  0xa4, 0x20, 0x4a, 0x04, 0xa0, 0x4a,
-  0x50, 0xa0, 0xd4, 0x0d, 0x40, 0xd4,
-  0x84, 0xc5, 0x80, 0x58, 0x05, 0x80,
-  0x09, 0x71, 0x0d, 0x10, 0xd1, 0x0c,
-  0x64, 0x4a, 0x28, 0x20, 0xc2, 0x0c,
-  0x51, 0x58, 0xa2, 0x04, 0x60, 0x46,
-  0x0c, 0xa4, 0x30, 0x80, 0xa8, 0x0a,
-  0xa1, 0x22, 0x46, 0x43, 0x04, 0x30,
-  0x12, 0xa1, 0x1d, 0x02, 0x30, 0x22,
-  0x8a, 0x45, 0xc0, 0x29, 0x02, 0x90,
-  0x86, 0x8a, 0x6d, 0x30, 0x13, 0x00,
-  0x23, 0x2c, 0x84, 0x11, 0x21, 0x12,
-  0x16, 0x21, 0x98, 0xc4, 0x0c, 0x40,
-  0x4c, 0x30, 0x54, 0x48, 0x44, 0x84,
-  0x41, 0xc1, 0x27, 0x14, 0x11, 0x40,
-  0x19, 0x56, 0xe5, 0x08, 0x90, 0x88,
-  0x6c, 0xea, 0xc4, 0x42, 0x20, 0x9e
-};
-
-const uint8_t kMaskRandom47_27[162] = {
-  0x64, 0x4a, 0x28, 0xa2, 0x8a, 0x28,
-  0x51, 0x58, 0xa3, 0x8a, 0x38, 0xa2,
-  0x0c, 0xa4, 0x30, 0x43, 0x04, 0x30,
-  0xa1, 0x22, 0x46, 0x24, 0x62, 0x46,
-  0x12, 0xa1, 0x1c, 0x11, 0xc1, 0x1c,
-  0x8a, 0x45, 0xc0, 0x5c, 0x05, 0xc0,
-  0x46, 0x4a, 0x6c, 0xa6, 0xca, 0x6c,
-  0x33, 0x24, 0x26, 0x42, 0x64, 0x26,
-  0x91, 0x92, 0x13, 0x21, 0x32, 0x12,
-  0xa4, 0x20, 0x4a, 0x04, 0xa0, 0x4a,
-  0x50, 0xa0, 0xd4, 0x0d, 0x40, 0xd4,
-  0x84, 0xc5, 0x80, 0x58, 0x05, 0x80,
-  0x09, 0x71, 0x0d, 0x10, 0xd1, 0x0c,
-  0x46, 0x4a, 0x6c, 0xa6, 0xca, 0x6c,
-  0x33, 0x24, 0x26, 0x42, 0x64, 0x26,
-  0x91, 0x92, 0x13, 0x21, 0x32, 0x12,
-  0xa4, 0x20, 0x4a, 0x04, 0xa0, 0x4a,
-  0x50, 0xa0, 0xd4, 0x0d, 0x40, 0xd4,
-  0x84, 0xc5, 0x80, 0x58, 0x05, 0x80,
-  0x09, 0x71, 0x0d, 0x10, 0xd1, 0x0c,
-  0x64, 0x4a, 0x28, 0xa2, 0x8a, 0x28,
-  0x51, 0x58, 0xa3, 0x8a, 0x38, 0xa2,
-  0x0c, 0xa4, 0x30, 0x43, 0x04, 0x30,
-  0xa1, 0x22, 0x46, 0x24, 0x62, 0x46,
-  0x12, 0xa1, 0x1c, 0x11, 0xc1, 0x1c,
-  0x8a, 0x45, 0xc0, 0x5c, 0x05, 0xc0,
-  0x9c, 0x3f, 0xb3, 0xe5, 0xad, 0x1c
-};
-
-const uint8_t kMaskRandom47_28[168] = {
-  0x46, 0x4a, 0x6c, 0xa6, 0xca, 0x6c,
-  0x33, 0x24, 0x26, 0x42, 0x64, 0x26,
-  0x91, 0x92, 0x13, 0x21, 0x32, 0x12,
-  0xa4, 0x20, 0x4a, 0x04, 0xa0, 0x4a,
-  0x50, 0xa0, 0xd4, 0x0d, 0x40, 0xd4,
-  0x84, 0xc5, 0x80, 0x58, 0x05, 0x80,
-  0x09, 0x71, 0x0d, 0x10, 0xd1, 0x0c,
-  0x64, 0x4a, 0x28, 0xa2, 0x8a, 0x28,
-  0x51, 0x58, 0xa3, 0x8a, 0x38, 0xa2,
-  0x0c, 0xa4, 0x30, 0x43, 0x04, 0x30,
-  0xa1, 0x22, 0x46, 0x24, 0x62, 0x46,
-  0x12, 0xa1, 0x1c, 0x11, 0xc1, 0x1c,
-  0x8a, 0x45, 0xc0, 0x5c, 0x05, 0xc0,
-  0x9c, 0x3f, 0xb3, 0xe5, 0xad, 0x1c,
-  0x64, 0x4a, 0x28, 0xa2, 0x8a, 0x28,
-  0x51, 0x58, 0xa3, 0x8a, 0x38, 0xa2,
-  0x0c, 0xa4, 0x30, 0x43, 0x04, 0x30,
-  0xa1, 0x22, 0x46, 0x24, 0x62, 0x46,
-  0x12, 0xa1, 0x1c, 0x11, 0xc1, 0x1c,
-  0x8a, 0x45, 0xc0, 0x5c, 0x05, 0xc0,
-  0x46, 0x4a, 0x6c, 0xa6, 0xca, 0x6c,
-  0x33, 0x24, 0x26, 0x42, 0x64, 0x26,
-  0x91, 0x92, 0x13, 0x21, 0x32, 0x12,
-  0xa4, 0x20, 0x4a, 0x04, 0xa0, 0x4a,
-  0x50, 0xa0, 0xd4, 0x0d, 0x40, 0xd4,
-  0x84, 0xc5, 0x80, 0x58, 0x05, 0x80,
-  0x09, 0x71, 0x0d, 0x10, 0xd1, 0x0c,
-  0x86, 0x1e, 0xa6, 0xaf, 0x3d, 0x04
-};
-
-const uint8_t kMaskRandom47_29[174] = {
-  0x46, 0x4a, 0x6c, 0xa6, 0xca, 0x6c,
-  0x33, 0x24, 0x26, 0x42, 0x64, 0x26,
-  0x91, 0x92, 0x13, 0x21, 0x32, 0x12,
-  0xa4, 0x20, 0x4a, 0x04, 0xa0, 0x4a,
-  0x50, 0xa0, 0xd4, 0x0d, 0x40, 0xd4,
-  0x84, 0xc5, 0x80, 0x58, 0x05, 0x80,
-  0x09, 0x71, 0x0d, 0x10, 0xd1, 0x0c,
-  0x64, 0x4a, 0x28, 0xa2, 0x8a, 0x28,
-  0x51, 0x58, 0xa3, 0x8a, 0x38, 0xa2,
-  0x0c, 0xa4, 0x30, 0x43, 0x04, 0x30,
-  0xa1, 0x22, 0x46, 0x24, 0x62, 0x46,
-  0x12, 0xa1, 0x1c, 0x11, 0xc1, 0x1c,
-  0x8a, 0x45, 0xc0, 0x5c, 0x05, 0xc0,
-  0x9c, 0x3f, 0xb3, 0xe5, 0xad, 0x1c,
-  0x46, 0x4a, 0x6c, 0xa6, 0xca, 0x6c,
-  0x33, 0x24, 0x26, 0x42, 0x64, 0x26,
-  0x91, 0x92, 0x13, 0x21, 0x32, 0x12,
-  0xa4, 0x20, 0x4a, 0x04, 0xa0, 0x4a,
-  0x50, 0xa0, 0xd4, 0x0d, 0x40, 0xd4,
-  0x84, 0xc5, 0x80, 0x58, 0x05, 0x80,
-  0x09, 0x71, 0x0d, 0x10, 0xd1, 0x0c,
-  0x0c, 0x84, 0x0c, 0x40, 0xc4, 0x0c,
-  0x80, 0x70, 0x07, 0x00, 0x70, 0x06,
-  0xa0, 0x88, 0x48, 0x84, 0x88, 0x48,
-  0x05, 0x40, 0x32, 0x03, 0x20, 0x32,
-  0x43, 0x02, 0x82, 0x28, 0x22, 0x82,
-  0x1a, 0x01, 0x50, 0x15, 0x01, 0x50,
-  0x60, 0x27, 0x00, 0x70, 0x07, 0x00,
-  0x14, 0x38, 0xa1, 0x8a, 0x18, 0xa0
-};
-
-const uint8_t kMaskRandom47_3[18] = {
-  0xca, 0xd3, 0x65, 0x36, 0x53, 0x64,
-  0xf1, 0x49, 0x3a, 0x93, 0xa9, 0x3a,
-  0x76, 0x27, 0xd0, 0x7d, 0x07, 0xd0
-};
-
-const uint8_t kMaskRandom47_30[180] = {
-  0x46, 0x4a, 0x6c, 0xa6, 0xca, 0x6c,
-  0x33, 0x24, 0x26, 0x42, 0x64, 0x26,
-  0x91, 0x92, 0x13, 0x21, 0x32, 0x12,
-  0xa4, 0x20, 0x4a, 0x04, 0xa0, 0x4a,
-  0x50, 0xa0, 0xd4, 0x0d, 0x40, 0xd4,
-  0x84, 0xc5, 0x80, 0x58, 0x05, 0x80,
-  0x09, 0x71, 0x0d, 0x10, 0xd1, 0x0c,
-  0x0c, 0x84, 0x0c, 0x40, 0xc4, 0x0c,
-  0x80, 0x70, 0x07, 0x00, 0x70, 0x06,
-  0xa0, 0x88, 0x48, 0x84, 0x88, 0x48,
-  0x05, 0x40, 0x32, 0x03, 0x20, 0x32,
-  0x43, 0x02, 0x82, 0x28, 0x22, 0x82,
-  0x1a, 0x01, 0x50, 0x15, 0x01, 0x50,
-  0x60, 0x27, 0x00, 0x70, 0x07, 0x00,
-  0x14, 0x38, 0xa1, 0x8a, 0x18, 0xa0,
-  0x46, 0x4a, 0x6c, 0xa6, 0xca, 0x6c,
-  0x33, 0x24, 0x26, 0x42, 0x64, 0x26,
-  0x91, 0x92, 0x13, 0x21, 0x32, 0x12,
-  0xa4, 0x20, 0x4a, 0x04, 0xa0, 0x4a,
-  0x50, 0xa0, 0xd4, 0x0d, 0x40, 0xd4,
-  0x84, 0xc5, 0x80, 0x58, 0x05, 0x80,
-  0x09, 0x71, 0x0d, 0x10, 0xd1, 0x0c,
-  0x64, 0x4a, 0x28, 0xa2, 0x8a, 0x28,
-  0x51, 0x58, 0xa3, 0x8a, 0x38, 0xa2,
-  0x0c, 0xa4, 0x30, 0x43, 0x04, 0x30,
-  0xa1, 0x22, 0x46, 0x24, 0x62, 0x46,
-  0x12, 0xa1, 0x1c, 0x11, 0xc1, 0x1c,
-  0x8a, 0x45, 0xc0, 0x5c, 0x05, 0xc0,
-  0x9c, 0x3f, 0xb3, 0xe5, 0xad, 0x1c,
-  0x97, 0x43, 0x63, 0xc6, 0x09, 0x9c
-};
-
-const uint8_t kMaskRandom47_31[186] = {
-  0x46, 0x4a, 0x6c, 0xa6, 0xca, 0x6c,
-  0x33, 0x24, 0x26, 0x42, 0x64, 0x26,
-  0x91, 0x92, 0x13, 0x21, 0x32, 0x12,
-  0xa4, 0x20, 0x4a, 0x04, 0xa0, 0x4a,
-  0x50, 0xa0, 0xd4, 0x0d, 0x40, 0xd4,
-  0x84, 0xc5, 0x80, 0x58, 0x05, 0x80,
-  0x09, 0x71, 0x0d, 0x10, 0xd1, 0x0c,
-  0x0c, 0x84, 0x0c, 0x40, 0xc4, 0x0c,
-  0x80, 0x70, 0x07, 0x00, 0x70, 0x06,
-  0xa0, 0x88, 0x48, 0x84, 0x88, 0x48,
-  0x05, 0x40, 0x32, 0x03, 0x20, 0x32,
-  0x43, 0x02, 0x82, 0x28, 0x22, 0x82,
-  0x1a, 0x01, 0x50, 0x15, 0x01, 0x50,
-  0x60, 0x27, 0x00, 0x70, 0x07, 0x00,
-  0x14, 0x38, 0xa1, 0x8a, 0x18, 0xa0,
-  0x0c, 0x84, 0x0c, 0x40, 0xc4, 0x0c,
-  0x80, 0x70, 0x07, 0x00, 0x70, 0x06,
-  0xa0, 0x88, 0x48, 0x84, 0x88, 0x48,
-  0x05, 0x40, 0x32, 0x03, 0x20, 0x32,
-  0x43, 0x02, 0x82, 0x28, 0x22, 0x82,
-  0x1a, 0x01, 0x50, 0x15, 0x01, 0x50,
-  0x60, 0x27, 0x00, 0x70, 0x07, 0x00,
-  0x14, 0x38, 0xa1, 0x8a, 0x18, 0xa0,
-  0x46, 0x4a, 0x6c, 0xa6, 0xca, 0x6c,
-  0x33, 0x24, 0x26, 0x42, 0x64, 0x26,
-  0x91, 0x92, 0x13, 0x21, 0x32, 0x12,
-  0xa4, 0x20, 0x4a, 0x04, 0xa0, 0x4a,
-  0x50, 0xa0, 0xd4, 0x0d, 0x40, 0xd4,
-  0x84, 0xc5, 0x80, 0x58, 0x05, 0x80,
-  0x09, 0x71, 0x0d, 0x10, 0xd1, 0x0c,
-  0xfa, 0xd9, 0xf5, 0xfe, 0xdc, 0x14
-};
-
-const uint8_t kMaskRandom47_32[192] = {
-  0x0c, 0x84, 0x0c, 0x40, 0xc4, 0x0c,
-  0x80, 0x70, 0x07, 0x00, 0x70, 0x06,
-  0xa0, 0x88, 0x48, 0x84, 0x88, 0x48,
-  0x05, 0x40, 0x32, 0x03, 0x20, 0x32,
-  0x43, 0x02, 0x82, 0x28, 0x22, 0x82,
-  0x1a, 0x01, 0x50, 0x15, 0x01, 0x50,
-  0x60, 0x27, 0x00, 0x70, 0x07, 0x00,
-  0x14, 0x38, 0xa1, 0x8a, 0x18, 0xa0,
-  0x46, 0x4a, 0x6c, 0xa6, 0xca, 0x6c,
-  0x33, 0x24, 0x26, 0x42, 0x64, 0x26,
-  0x91, 0x92, 0x13, 0x21, 0x32, 0x12,
-  0xa4, 0x20, 0x4a, 0x04, 0xa0, 0x4a,
-  0x50, 0xa0, 0xd4, 0x0d, 0x40, 0xd4,
-  0x84, 0xc5, 0x80, 0x58, 0x05, 0x80,
-  0x09, 0x71, 0x0d, 0x10, 0xd1, 0x0c,
-  0xfa, 0xd9, 0xf5, 0xfe, 0xdc, 0x14,
-  0x46, 0x4a, 0x6c, 0xa6, 0xca, 0x6c,
-  0x33, 0x24, 0x26, 0x42, 0x64, 0x26,
-  0x91, 0x92, 0x13, 0x21, 0x32, 0x12,
-  0xa4, 0x20, 0x4a, 0x04, 0xa0, 0x4a,
-  0x50, 0xa0, 0xd4, 0x0d, 0x40, 0xd4,
-  0x84, 0xc5, 0x80, 0x58, 0x05, 0x80,
-  0x09, 0x71, 0x0d, 0x10, 0xd1, 0x0c,
-  0x0c, 0x84, 0x0c, 0x40, 0xc4, 0x0c,
-  0x80, 0x70, 0x07, 0x00, 0x70, 0x06,
-  0xa0, 0x88, 0x48, 0x84, 0x88, 0x48,
-  0x05, 0x40, 0x32, 0x03, 0x20, 0x32,
-  0x43, 0x02, 0x82, 0x28, 0x22, 0x82,
-  0x1a, 0x01, 0x50, 0x15, 0x01, 0x50,
-  0x60, 0x27, 0x00, 0x70, 0x07, 0x00,
-  0x14, 0x38, 0xa1, 0x8a, 0x18, 0xa0,
-  0xe5, 0x50, 0x45, 0x63, 0xc2, 0xf4
-};
-
-const uint8_t kMaskRandom47_33[198] = {
-  0x0c, 0x84, 0x0c, 0x40, 0xc4, 0x0c,
-  0x80, 0x70, 0x07, 0x00, 0x70, 0x06,
-  0xa0, 0x88, 0x48, 0x84, 0x88, 0x48,
-  0x05, 0x40, 0x32, 0x03, 0x20, 0x32,
-  0x43, 0x02, 0x82, 0x28, 0x22, 0x82,
-  0x1a, 0x01, 0x50, 0x15, 0x01, 0x50,
-  0x60, 0x27, 0x00, 0x70, 0x07, 0x00,
-  0x14, 0x38, 0xa1, 0x8a, 0x18, 0xa0,
-  0x46, 0x4a, 0x6c, 0xa6, 0xca, 0x6c,
-  0x33, 0x24, 0x26, 0x42, 0x64, 0x26,
-  0x91, 0x92, 0x13, 0x21, 0x32, 0x12,
-  0xa4, 0x20, 0x4a, 0x04, 0xa0, 0x4a,
-  0x50, 0xa0, 0xd4, 0x0d, 0x40, 0xd4,
-  0x84, 0xc5, 0x80, 0x58, 0x05, 0x80,
-  0x09, 0x71, 0x0d, 0x10, 0xd1, 0x0c,
-  0xfa, 0xd9, 0xf5, 0xfe, 0xdc, 0x14,
-  0x0c, 0x84, 0x0c, 0x40, 0xc4, 0x0c,
-  0x80, 0x70, 0x07, 0x00, 0x70, 0x06,
-  0xa0, 0x88, 0x48, 0x84, 0x88, 0x48,
-  0x05, 0x40, 0x32, 0x03, 0x20, 0x32,
-  0x43, 0x02, 0x82, 0x28, 0x22, 0x82,
-  0x1a, 0x01, 0x50, 0x15, 0x01, 0x50,
-  0x60, 0x27, 0x00, 0x70, 0x07, 0x00,
-  0x14, 0x38, 0xa1, 0x8a, 0x18, 0xa0,
-  0x46, 0x4a, 0x6c, 0xa6, 0xca, 0x6c,
-  0x62, 0x7c, 0x85, 0xc8, 0x5c, 0x84,
-  0x8c, 0x04, 0x88, 0x48, 0x84, 0x88,
-  0x01, 0x74, 0x23, 0x42, 0x34, 0x22,
-  0x07, 0x83, 0x06, 0x30, 0x63, 0x06,
-  0xa0, 0x80, 0x72, 0x07, 0x20, 0x72,
-  0x18, 0xb1, 0x43, 0x14, 0x31, 0x42,
-  0x91, 0x00, 0x92, 0x09, 0x20, 0x92,
-  0x78, 0x00, 0x1c, 0x01, 0xc0, 0x1c
-};
-
-const uint8_t kMaskRandom47_34[204] = {
-  0x0c, 0x84, 0x0c, 0x40, 0xc4, 0x0c,
-  0x80, 0x70, 0x07, 0x00, 0x70, 0x06,
-  0xa0, 0x88, 0x48, 0x84, 0x88, 0x48,
-  0x05, 0x40, 0x32, 0x03, 0x20, 0x32,
-  0x43, 0x02, 0x82, 0x28, 0x22, 0x82,
-  0x1a, 0x01, 0x50, 0x15, 0x01, 0x50,
-  0x60, 0x27, 0x00, 0x70, 0x07, 0x00,
-  0x14, 0x38, 0xa1, 0x8a, 0x18, 0xa0,
-  0x46, 0x4a, 0x6c, 0xa6, 0xca, 0x6c,
-  0x62, 0x7c, 0x85, 0xc8, 0x5c, 0x84,
-  0x8c, 0x04, 0x88, 0x48, 0x84, 0x88,
-  0x01, 0x74, 0x23, 0x42, 0x34, 0x22,
-  0x07, 0x83, 0x06, 0x30, 0x63, 0x06,
-  0xa0, 0x80, 0x72, 0x07, 0x20, 0x72,
-  0x18, 0xb1, 0x43, 0x14, 0x31, 0x42,
-  0x91, 0x00, 0x92, 0x09, 0x20, 0x92,
-  0x78, 0x00, 0x1c, 0x01, 0xc0, 0x1c,
-  0x0c, 0x84, 0x0c, 0x40, 0xc4, 0x0c,
-  0x80, 0x70, 0x07, 0x00, 0x70, 0x06,
-  0xa0, 0x88, 0x48, 0x84, 0x88, 0x48,
-  0x05, 0x40, 0x32, 0x03, 0x20, 0x32,
-  0x43, 0x02, 0x82, 0x28, 0x22, 0x82,
-  0x1a, 0x01, 0x50, 0x15, 0x01, 0x50,
-  0x60, 0x27, 0x00, 0x70, 0x07, 0x00,
-  0x14, 0x38, 0xa1, 0x8a, 0x18, 0xa0,
-  0x46, 0x4a, 0x6c, 0xa6, 0xca, 0x6c,
-  0x33, 0x24, 0x26, 0x42, 0x64, 0x26,
-  0x91, 0x92, 0x13, 0x21, 0x32, 0x12,
-  0xa4, 0x20, 0x4a, 0x04, 0xa0, 0x4a,
-  0x50, 0xa0, 0xd4, 0x0d, 0x40, 0xd4,
-  0x84, 0xc5, 0x80, 0x58, 0x05, 0x80,
-  0x09, 0x71, 0x0d, 0x10, 0xd1, 0x0c,
-  0xfa, 0xd9, 0xf5, 0xfe, 0xdc, 0x14,
-  0xef, 0xbb, 0xa6, 0x23, 0x5c, 0xbe
-};
-
-const uint8_t kMaskRandom47_35[210] = {
-  0x0c, 0x84, 0x0c, 0x40, 0xc4, 0x0c,
-  0x80, 0x70, 0x07, 0x00, 0x70, 0x06,
-  0xa0, 0x88, 0x48, 0x84, 0x88, 0x48,
-  0x05, 0x40, 0x32, 0x03, 0x20, 0x32,
-  0x43, 0x02, 0x82, 0x28, 0x22, 0x82,
-  0x1a, 0x01, 0x50, 0x15, 0x01, 0x50,
-  0x60, 0x27, 0x00, 0x70, 0x07, 0x00,
-  0x14, 0x38, 0xa1, 0x8a, 0x18, 0xa0,
-  0x46, 0x4a, 0x6c, 0xa6, 0xca, 0x6c,
-  0x62, 0x7c, 0x85, 0xc8, 0x5c, 0x84,
-  0x8c, 0x04, 0x88, 0x48, 0x84, 0x88,
-  0x01, 0x74, 0x23, 0x42, 0x34, 0x22,
-  0x07, 0x83, 0x06, 0x30, 0x63, 0x06,
-  0xa0, 0x80, 0x72, 0x07, 0x20, 0x72,
-  0x18, 0xb1, 0x43, 0x14, 0x31, 0x42,
-  0x91, 0x00, 0x92, 0x09, 0x20, 0x92,
-  0x78, 0x00, 0x1c, 0x01, 0xc0, 0x1c,
-  0x46, 0x4a, 0x6c, 0xa6, 0xca, 0x6c,
-  0x62, 0x7c, 0x85, 0xc8, 0x5c, 0x84,
-  0x8c, 0x04, 0x88, 0x48, 0x84, 0x88,
-  0x01, 0x74, 0x23, 0x42, 0x34, 0x22,
-  0x07, 0x83, 0x06, 0x30, 0x63, 0x06,
-  0xa0, 0x80, 0x72, 0x07, 0x20, 0x72,
-  0x18, 0xb1, 0x43, 0x14, 0x31, 0x42,
-  0x91, 0x00, 0x92, 0x09, 0x20, 0x92,
-  0x78, 0x00, 0x1c, 0x01, 0xc0, 0x1c,
-  0x0c, 0x84, 0x0c, 0x40, 0xc4, 0x0c,
-  0x80, 0x70, 0x07, 0x00, 0x70, 0x06,
-  0xa0, 0x88, 0x48, 0x84, 0x88, 0x48,
-  0x05, 0x40, 0x32, 0x03, 0x20, 0x32,
-  0x43, 0x02, 0x82, 0x28, 0x22, 0x82,
-  0x1a, 0x01, 0x50, 0x15, 0x01, 0x50,
-  0x60, 0x27, 0x00, 0x70, 0x07, 0x00,
-  0x14, 0x38, 0xa1, 0x8a, 0x18, 0xa0,
-  0x82, 0x32, 0x56, 0x68, 0xa1, 0x5c
-};
-
-const uint8_t kMaskRandom47_36[216] = {
-  0x46, 0x4a, 0x6c, 0xa6, 0xca, 0x6c,
-  0x62, 0x7c, 0x85, 0xc8, 0x5c, 0x84,
-  0x8c, 0x04, 0x88, 0x48, 0x84, 0x88,
-  0x01, 0x74, 0x23, 0x42, 0x34, 0x22,
-  0x07, 0x83, 0x06, 0x30, 0x63, 0x06,
-  0xa0, 0x80, 0x72, 0x07, 0x20, 0x72,
-  0x18, 0xb1, 0x43, 0x14, 0x31, 0x42,
-  0x91, 0x00, 0x92, 0x09, 0x20, 0x92,
-  0x78, 0x00, 0x1c, 0x01, 0xc0, 0x1c,
-  0x0c, 0x84, 0x0c, 0x40, 0xc4, 0x0c,
-  0x80, 0x70, 0x07, 0x00, 0x70, 0x06,
-  0xa0, 0x88, 0x48, 0x84, 0x88, 0x48,
-  0x05, 0x40, 0x32, 0x03, 0x20, 0x32,
-  0x43, 0x02, 0x82, 0x28, 0x22, 0x82,
-  0x1a, 0x01, 0x50, 0x15, 0x01, 0x50,
-  0x60, 0x27, 0x00, 0x70, 0x07, 0x00,
-  0x14, 0x38, 0xa1, 0x8a, 0x18, 0xa0,
-  0x82, 0x32, 0x56, 0x68, 0xa1, 0x5c,
-  0x0c, 0x84, 0x0c, 0x40, 0xc4, 0x0c,
-  0x80, 0x70, 0x07, 0x00, 0x70, 0x06,
-  0xa0, 0x88, 0x48, 0x84, 0x88, 0x48,
-  0x05, 0x40, 0x32, 0x03, 0x20, 0x32,
-  0x43, 0x02, 0x82, 0x28, 0x22, 0x82,
-  0x1a, 0x01, 0x50, 0x15, 0x01, 0x50,
-  0x60, 0x27, 0x00, 0x70, 0x07, 0x00,
-  0x14, 0x38, 0xa1, 0x8a, 0x18, 0xa0,
-  0x46, 0x4a, 0x6c, 0xa6, 0xca, 0x6c,
-  0x62, 0x7c, 0x85, 0xc8, 0x5c, 0x84,
-  0x8c, 0x04, 0x88, 0x48, 0x84, 0x88,
-  0x01, 0x74, 0x23, 0x42, 0x34, 0x22,
-  0x07, 0x83, 0x06, 0x30, 0x63, 0x06,
-  0xa0, 0x80, 0x72, 0x07, 0x20, 0x72,
-  0x18, 0xb1, 0x43, 0x14, 0x31, 0x42,
-  0x91, 0x00, 0x92, 0x09, 0x20, 0x92,
-  0x78, 0x00, 0x1c, 0x01, 0xc0, 0x1c,
-  0x0e, 0xd7, 0x38, 0x20, 0x87, 0x66
-};
-
-const uint8_t kMaskRandom47_37[222] = {
-  0x46, 0x4a, 0x6c, 0xa6, 0xca, 0x6c,
-  0x62, 0x7c, 0x85, 0xc8, 0x5c, 0x84,
-  0x8c, 0x04, 0x88, 0x48, 0x84, 0x88,
-  0x01, 0x74, 0x23, 0x42, 0x34, 0x22,
-  0x07, 0x83, 0x06, 0x30, 0x63, 0x06,
-  0xa0, 0x80, 0x72, 0x07, 0x20, 0x72,
-  0x18, 0xb1, 0x43, 0x14, 0x31, 0x42,
-  0x91, 0x00, 0x92, 0x09, 0x20, 0x92,
-  0x78, 0x00, 0x1c, 0x01, 0xc0, 0x1c,
-  0x0c, 0x84, 0x0c, 0x40, 0xc4, 0x0c,
-  0x80, 0x70, 0x07, 0x00, 0x70, 0x06,
-  0xa0, 0x88, 0x48, 0x84, 0x88, 0x48,
-  0x05, 0x40, 0x32, 0x03, 0x20, 0x32,
-  0x43, 0x02, 0x82, 0x28, 0x22, 0x82,
-  0x1a, 0x01, 0x50, 0x15, 0x01, 0x50,
-  0x60, 0x27, 0x00, 0x70, 0x07, 0x00,
-  0x14, 0x38, 0xa1, 0x8a, 0x18, 0xa0,
-  0x82, 0x32, 0x56, 0x68, 0xa1, 0x5c,
-  0x46, 0x4a, 0x6c, 0xa6, 0xca, 0x6c,
-  0x62, 0x7c, 0x85, 0xc8, 0x5c, 0x84,
-  0x8c, 0x04, 0x88, 0x48, 0x84, 0x88,
-  0x01, 0x74, 0x23, 0x42, 0x34, 0x22,
-  0x07, 0x83, 0x06, 0x30, 0x63, 0x06,
-  0xa0, 0x80, 0x72, 0x07, 0x20, 0x72,
-  0x18, 0xb1, 0x43, 0x14, 0x31, 0x42,
-  0x91, 0x00, 0x92, 0x09, 0x20, 0x92,
-  0x78, 0x00, 0x1c, 0x01, 0xc0, 0x1c,
-  0x64, 0x4a, 0x28, 0xa2, 0x8a, 0x28,
-  0x51, 0x48, 0xa2, 0x8a, 0x28, 0xa2,
-  0xa9, 0x10, 0x1b, 0x01, 0xb0, 0x1a,
-  0x04, 0xc4, 0x84, 0x48, 0x44, 0x84,
-  0xd0, 0x01, 0x44, 0x14, 0x41, 0x44,
-  0x82, 0x40, 0x1c, 0x01, 0xc0, 0x1c,
-  0x21, 0x37, 0x01, 0x70, 0x17, 0x00,
-  0x0c, 0x21, 0x22, 0x12, 0x21, 0x22,
-  0x4a, 0x0a, 0xc0, 0xac, 0x0a, 0xc0,
-  0x12, 0xb4, 0x51, 0x45, 0x14, 0x50
-};
-
-const uint8_t kMaskRandom47_38[228] = {
-  0x46, 0x4a, 0x6c, 0xa6, 0xca, 0x6c,
-  0x62, 0x7c, 0x85, 0xc8, 0x5c, 0x84,
-  0x8c, 0x04, 0x88, 0x48, 0x84, 0x88,
-  0x01, 0x74, 0x23, 0x42, 0x34, 0x22,
-  0x07, 0x83, 0x06, 0x30, 0x63, 0x06,
-  0xa0, 0x80, 0x72, 0x07, 0x20, 0x72,
-  0x18, 0xb1, 0x43, 0x14, 0x31, 0x42,
-  0x91, 0x00, 0x92, 0x09, 0x20, 0x92,
-  0x78, 0x00, 0x1c, 0x01, 0xc0, 0x1c,
-  0x64, 0x4a, 0x28, 0xa2, 0x8a, 0x28,
-  0x51, 0x48, 0xa2, 0x8a, 0x28, 0xa2,
-  0xa9, 0x10, 0x1b, 0x01, 0xb0, 0x1a,
-  0x04, 0xc4, 0x84, 0x48, 0x44, 0x84,
-  0xd0, 0x01, 0x44, 0x14, 0x41, 0x44,
-  0x82, 0x40, 0x1c, 0x01, 0xc0, 0x1c,
-  0x21, 0x37, 0x01, 0x70, 0x17, 0x00,
-  0x0c, 0x21, 0x22, 0x12, 0x21, 0x22,
-  0x4a, 0x0a, 0xc0, 0xac, 0x0a, 0xc0,
-  0x12, 0xb4, 0x51, 0x45, 0x14, 0x50,
-  0x46, 0x4a, 0x6c, 0xa6, 0xca, 0x6c,
-  0x62, 0x7c, 0x85, 0xc8, 0x5c, 0x84,
-  0x8c, 0x04, 0x88, 0x48, 0x84, 0x88,
-  0x01, 0x74, 0x23, 0x42, 0x34, 0x22,
-  0x07, 0x83, 0x06, 0x30, 0x63, 0x06,
-  0xa0, 0x80, 0x72, 0x07, 0x20, 0x72,
-  0x18, 0xb1, 0x43, 0x14, 0x31, 0x42,
-  0x91, 0x00, 0x92, 0x09, 0x20, 0x92,
-  0x78, 0x00, 0x1c, 0x01, 0xc0, 0x1c,
-  0x0c, 0x84, 0x0c, 0x40, 0xc4, 0x0c,
-  0x80, 0x70, 0x07, 0x00, 0x70, 0x06,
-  0xa0, 0x88, 0x48, 0x84, 0x88, 0x48,
-  0x05, 0x40, 0x32, 0x03, 0x20, 0x32,
-  0x43, 0x02, 0x82, 0x28, 0x22, 0x82,
-  0x1a, 0x01, 0x50, 0x15, 0x01, 0x50,
-  0x60, 0x27, 0x00, 0x70, 0x07, 0x00,
-  0x14, 0x38, 0xa1, 0x8a, 0x18, 0xa0,
-  0x82, 0x32, 0x56, 0x68, 0xa1, 0x5c,
-  0x7b, 0x47, 0xa5, 0xde, 0x9a, 0xd4
-};
-
-const uint8_t kMaskRandom47_39[234] = {
-  0x46, 0x4a, 0x6c, 0xa6, 0xca, 0x6c,
-  0x62, 0x7c, 0x85, 0xc8, 0x5c, 0x84,
-  0x8c, 0x04, 0x88, 0x48, 0x84, 0x88,
-  0x01, 0x74, 0x23, 0x42, 0x34, 0x22,
-  0x07, 0x83, 0x06, 0x30, 0x63, 0x06,
-  0xa0, 0x80, 0x72, 0x07, 0x20, 0x72,
-  0x18, 0xb1, 0x43, 0x14, 0x31, 0x42,
-  0x91, 0x00, 0x92, 0x09, 0x20, 0x92,
-  0x78, 0x00, 0x1c, 0x01, 0xc0, 0x1c,
-  0x64, 0x4a, 0x28, 0xa2, 0x8a, 0x28,
-  0x51, 0x48, 0xa2, 0x8a, 0x28, 0xa2,
-  0xa9, 0x10, 0x1b, 0x01, 0xb0, 0x1a,
-  0x04, 0xc4, 0x84, 0x48, 0x44, 0x84,
-  0xd0, 0x01, 0x44, 0x14, 0x41, 0x44,
-  0x82, 0x40, 0x1c, 0x01, 0xc0, 0x1c,
-  0x21, 0x37, 0x01, 0x70, 0x17, 0x00,
-  0x0c, 0x21, 0x22, 0x12, 0x21, 0x22,
-  0x4a, 0x0a, 0xc0, 0xac, 0x0a, 0xc0,
-  0x12, 0xb4, 0x51, 0x45, 0x14, 0x50,
-  0x64, 0x4a, 0x28, 0xa2, 0x8a, 0x28,
-  0x51, 0x48, 0xa2, 0x8a, 0x28, 0xa2,
-  0xa9, 0x10, 0x1b, 0x01, 0xb0, 0x1a,
-  0x04, 0xc4, 0x84, 0x48, 0x44, 0x84,
-  0xd0, 0x01, 0x44, 0x14, 0x41, 0x44,
-  0x82, 0x40, 0x1c, 0x01, 0xc0, 0x1c,
-  0x21, 0x37, 0x01, 0x70, 0x17, 0x00,
-  0x0c, 0x21, 0x22, 0x12, 0x21, 0x22,
-  0x4a, 0x0a, 0xc0, 0xac, 0x0a, 0xc0,
-  0x12, 0xb4, 0x51, 0x45, 0x14, 0x50,
-  0x46, 0x4a, 0x6c, 0xa6, 0xca, 0x6c,
-  0x62, 0x7c, 0x85, 0xc8, 0x5c, 0x84,
-  0x8c, 0x04, 0x88, 0x48, 0x84, 0x88,
-  0x01, 0x74, 0x23, 0x42, 0x34, 0x22,
-  0x07, 0x83, 0x06, 0x30, 0x63, 0x06,
-  0xa0, 0x80, 0x72, 0x07, 0x20, 0x72,
-  0x18, 0xb1, 0x43, 0x14, 0x31, 0x42,
-  0x91, 0x00, 0x92, 0x09, 0x20, 0x92,
-  0x78, 0x00, 0x1c, 0x01, 0xc0, 0x1c,
-  0xdb, 0x4a, 0x7b, 0x31, 0x45, 0x2a
-};
-
-const uint8_t kMaskRandom47_4[24] = {
-  0xc4, 0xd1, 0x65, 0x16, 0x51, 0x64,
-  0x31, 0x62, 0x96, 0x29, 0x62, 0x96,
-  0x4b, 0x24, 0x5a, 0x45, 0xa4, 0x5a,
-  0x2c, 0xa8, 0xaa, 0x8a, 0xa8, 0xaa
-};
-
-const uint8_t kMaskRandom47_40[240] = {
-  0x64, 0x4a, 0x28, 0xa2, 0x8a, 0x28,
-  0x51, 0x48, 0xa2, 0x8a, 0x28, 0xa2,
-  0xa9, 0x10, 0x1b, 0x01, 0xb0, 0x1a,
-  0x04, 0xc4, 0x84, 0x48, 0x44, 0x84,
-  0xd0, 0x01, 0x44, 0x14, 0x41, 0x44,
-  0x82, 0x40, 0x1c, 0x01, 0xc0, 0x1c,
-  0x21, 0x37, 0x01, 0x70, 0x17, 0x00,
-  0x0c, 0x21, 0x22, 0x12, 0x21, 0x22,
-  0x4a, 0x0a, 0xc0, 0xac, 0x0a, 0xc0,
-  0x12, 0xb4, 0x51, 0x45, 0x14, 0x50,
-  0x46, 0x4a, 0x6c, 0xa6, 0xca, 0x6c,
-  0x62, 0x7c, 0x85, 0xc8, 0x5c, 0x84,
-  0x8c, 0x04, 0x88, 0x48, 0x84, 0x88,
-  0x01, 0x74, 0x23, 0x42, 0x34, 0x22,
-  0x07, 0x83, 0x06, 0x30, 0x63, 0x06,
-  0xa0, 0x80, 0x72, 0x07, 0x20, 0x72,
-  0x18, 0xb1, 0x43, 0x14, 0x31, 0x42,
-  0x91, 0x00, 0x92, 0x09, 0x20, 0x92,
-  0x78, 0x00, 0x1c, 0x01, 0xc0, 0x1c,
-  0xdb, 0x4a, 0x7b, 0x31, 0x45, 0x2a,
-  0x46, 0x4a, 0x6c, 0xa6, 0xca, 0x6c,
-  0x62, 0x7c, 0x85, 0xc8, 0x5c, 0x84,
-  0x8c, 0x04, 0x88, 0x48, 0x84, 0x88,
-  0x01, 0x74, 0x23, 0x42, 0x34, 0x22,
-  0x07, 0x83, 0x06, 0x30, 0x63, 0x06,
-  0xa0, 0x80, 0x72, 0x07, 0x20, 0x72,
-  0x18, 0xb1, 0x43, 0x14, 0x31, 0x42,
-  0x91, 0x00, 0x92, 0x09, 0x20, 0x92,
-  0x78, 0x00, 0x1c, 0x01, 0xc0, 0x1c,
-  0x64, 0x4a, 0x28, 0xa2, 0x8a, 0x28,
-  0x51, 0x48, 0xa2, 0x8a, 0x28, 0xa2,
-  0xa9, 0x10, 0x1b, 0x01, 0xb0, 0x1a,
-  0x04, 0xc4, 0x84, 0x48, 0x44, 0x84,
-  0xd0, 0x01, 0x44, 0x14, 0x41, 0x44,
-  0x82, 0x40, 0x1c, 0x01, 0xc0, 0x1c,
-  0x21, 0x37, 0x01, 0x70, 0x17, 0x00,
-  0x0c, 0x21, 0x22, 0x12, 0x21, 0x22,
-  0x4a, 0x0a, 0xc0, 0xac, 0x0a, 0xc0,
-  0x12, 0xb4, 0x51, 0x45, 0x14, 0x50,
-  0xc4, 0xae, 0x5e, 0x33, 0xf5, 0x1a
-};
-
-const uint8_t kMaskRandom47_41[246] = {
-  0x64, 0x4a, 0x28, 0xa2, 0x8a, 0x28,
-  0x51, 0x48, 0xa2, 0x8a, 0x28, 0xa2,
-  0xa9, 0x10, 0x1b, 0x01, 0xb0, 0x1a,
-  0x04, 0xc4, 0x84, 0x48, 0x44, 0x84,
-  0xd0, 0x01, 0x44, 0x14, 0x41, 0x44,
-  0x82, 0x40, 0x1c, 0x01, 0xc0, 0x1c,
-  0x21, 0x37, 0x01, 0x70, 0x17, 0x00,
-  0x0c, 0x21, 0x22, 0x12, 0x21, 0x22,
-  0x4a, 0x0a, 0xc0, 0xac, 0x0a, 0xc0,
-  0x12, 0xb4, 0x51, 0x45, 0x14, 0x50,
-  0x46, 0x4a, 0x6c, 0xa6, 0xca, 0x6c,
-  0x62, 0x7c, 0x85, 0xc8, 0x5c, 0x84,
-  0x8c, 0x04, 0x88, 0x48, 0x84, 0x88,
-  0x01, 0x74, 0x23, 0x42, 0x34, 0x22,
-  0x07, 0x83, 0x06, 0x30, 0x63, 0x06,
-  0xa0, 0x80, 0x72, 0x07, 0x20, 0x72,
-  0x18, 0xb1, 0x43, 0x14, 0x31, 0x42,
-  0x91, 0x00, 0x92, 0x09, 0x20, 0x92,
-  0x78, 0x00, 0x1c, 0x01, 0xc0, 0x1c,
-  0xdb, 0x4a, 0x7b, 0x31, 0x45, 0x2a,
-  0x64, 0x4a, 0x28, 0xa2, 0x8a, 0x28,
-  0x51, 0x48, 0xa2, 0x8a, 0x28, 0xa2,
-  0xa9, 0x10, 0x1b, 0x01, 0xb0, 0x1a,
-  0x04, 0xc4, 0x84, 0x48, 0x44, 0x84,
-  0xd0, 0x01, 0x44, 0x14, 0x41, 0x44,
-  0x82, 0x40, 0x1c, 0x01, 0xc0, 0x1c,
-  0x21, 0x37, 0x01, 0x70, 0x17, 0x00,
-  0x0c, 0x21, 0x22, 0x12, 0x21, 0x22,
-  0x4a, 0x0a, 0xc0, 0xac, 0x0a, 0xc0,
-  0x12, 0xb4, 0x51, 0x45, 0x14, 0x50,
-  0x46, 0x4a, 0x6c, 0xa6, 0xca, 0x6c,
-  0x33, 0x24, 0x26, 0x42, 0x64, 0x26,
-  0x99, 0x02, 0x12, 0x21, 0x22, 0x12,
-  0x05, 0x80, 0x0e, 0x00, 0xe0, 0x0e,
-  0x80, 0xa1, 0x82, 0x18, 0x21, 0x82,
-  0x84, 0x48, 0x18, 0x81, 0x88, 0x18,
-  0x40, 0x6d, 0x40, 0xd4, 0x0d, 0x40,
-  0x0a, 0x90, 0xc1, 0x0c, 0x10, 0xc0,
-  0x68, 0x04, 0x90, 0x49, 0x04, 0x90,
-  0x10, 0x31, 0x21, 0x12, 0x11, 0x20,
-  0x30, 0x58, 0x05, 0x80, 0x58, 0x04
-};
-
-const uint8_t kMaskRandom47_42[252] = {
-  0x64, 0x4a, 0x28, 0xa2, 0x8a, 0x28,
-  0x51, 0x48, 0xa2, 0x8a, 0x28, 0xa2,
-  0xa9, 0x10, 0x1b, 0x01, 0xb0, 0x1a,
-  0x04, 0xc4, 0x84, 0x48, 0x44, 0x84,
-  0xd0, 0x01, 0x44, 0x14, 0x41, 0x44,
-  0x82, 0x40, 0x1c, 0x01, 0xc0, 0x1c,
-  0x21, 0x37, 0x01, 0x70, 0x17, 0x00,
-  0x0c, 0x21, 0x22, 0x12, 0x21, 0x22,
-  0x4a, 0x0a, 0xc0, 0xac, 0x0a, 0xc0,
-  0x12, 0xb4, 0x51, 0x45, 0x14, 0x50,
-  0x46, 0x4a, 0x6c, 0xa6, 0xca, 0x6c,
-  0x33, 0x24, 0x26, 0x42, 0x64, 0x26,
-  0x99, 0x02, 0x12, 0x21, 0x22, 0x12,
-  0x05, 0x80, 0x0e, 0x00, 0xe0, 0x0e,
-  0x80, 0xa1, 0x82, 0x18, 0x21, 0x82,
-  0x84, 0x48, 0x18, 0x81, 0x88, 0x18,
-  0x40, 0x6d, 0x40, 0xd4, 0x0d, 0x40,
-  0x0a, 0x90, 0xc1, 0x0c, 0x10, 0xc0,
-  0x68, 0x04, 0x90, 0x49, 0x04, 0x90,
-  0x10, 0x31, 0x21, 0x12, 0x11, 0x20,
-  0x30, 0x58, 0x05, 0x80, 0x58, 0x04,
-  0x64, 0x4a, 0x28, 0xa2, 0x8a, 0x28,
-  0x51, 0x48, 0xa2, 0x8a, 0x28, 0xa2,
-  0xa9, 0x10, 0x1b, 0x01, 0xb0, 0x1a,
-  0x04, 0xc4, 0x84, 0x48, 0x44, 0x84,
-  0xd0, 0x01, 0x44, 0x14, 0x41, 0x44,
-  0x82, 0x40, 0x1c, 0x01, 0xc0, 0x1c,
-  0x21, 0x37, 0x01, 0x70, 0x17, 0x00,
-  0x0c, 0x21, 0x22, 0x12, 0x21, 0x22,
-  0x4a, 0x0a, 0xc0, 0xac, 0x0a, 0xc0,
-  0x12, 0xb4, 0x51, 0x45, 0x14, 0x50,
-  0x46, 0x4a, 0x6c, 0xa6, 0xca, 0x6c,
-  0x62, 0x7c, 0x85, 0xc8, 0x5c, 0x84,
-  0x8c, 0x04, 0x88, 0x48, 0x84, 0x88,
-  0x01, 0x74, 0x23, 0x42, 0x34, 0x22,
-  0x07, 0x83, 0x06, 0x30, 0x63, 0x06,
-  0xa0, 0x80, 0x72, 0x07, 0x20, 0x72,
-  0x18, 0xb1, 0x43, 0x14, 0x31, 0x42,
-  0x91, 0x00, 0x92, 0x09, 0x20, 0x92,
-  0x78, 0x00, 0x1c, 0x01, 0xc0, 0x1c,
-  0xdb, 0x4a, 0x7b, 0x31, 0x45, 0x2a,
-  0x3c, 0xb0, 0x36, 0x3b, 0x14, 0xa2
-};
-
-const uint8_t kMaskRandom47_43[258] = {
-  0x64, 0x4a, 0x28, 0xa2, 0x8a, 0x28,
-  0x51, 0x48, 0xa2, 0x8a, 0x28, 0xa2,
-  0xa9, 0x10, 0x1b, 0x01, 0xb0, 0x1a,
-  0x04, 0xc4, 0x84, 0x48, 0x44, 0x84,
-  0xd0, 0x01, 0x44, 0x14, 0x41, 0x44,
-  0x82, 0x40, 0x1c, 0x01, 0xc0, 0x1c,
-  0x21, 0x37, 0x01, 0x70, 0x17, 0x00,
-  0x0c, 0x21, 0x22, 0x12, 0x21, 0x22,
-  0x4a, 0x0a, 0xc0, 0xac, 0x0a, 0xc0,
-  0x12, 0xb4, 0x51, 0x45, 0x14, 0x50,
-  0x46, 0x4a, 0x6c, 0xa6, 0xca, 0x6c,
-  0x33, 0x24, 0x26, 0x42, 0x64, 0x26,
-  0x99, 0x02, 0x12, 0x21, 0x22, 0x12,
-  0x05, 0x80, 0x0e, 0x00, 0xe0, 0x0e,
-  0x80, 0xa1, 0x82, 0x18, 0x21, 0x82,
-  0x84, 0x48, 0x18, 0x81, 0x88, 0x18,
-  0x40, 0x6d, 0x40, 0xd4, 0x0d, 0x40,
-  0x0a, 0x90, 0xc1, 0x0c, 0x10, 0xc0,
-  0x68, 0x04, 0x90, 0x49, 0x04, 0x90,
-  0x10, 0x31, 0x21, 0x12, 0x11, 0x20,
-  0x30, 0x58, 0x05, 0x80, 0x58, 0x04,
-  0x46, 0x4a, 0x6c, 0xa6, 0xca, 0x6c,
-  0x33, 0x24, 0x26, 0x42, 0x64, 0x26,
-  0x99, 0x02, 0x12, 0x21, 0x22, 0x12,
-  0x05, 0x80, 0x0e, 0x00, 0xe0, 0x0e,
-  0x80, 0xa1, 0x82, 0x18, 0x21, 0x82,
-  0x84, 0x48, 0x18, 0x81, 0x88, 0x18,
-  0x40, 0x6d, 0x40, 0xd4, 0x0d, 0x40,
-  0x0a, 0x90, 0xc1, 0x0c, 0x10, 0xc0,
-  0x68, 0x04, 0x90, 0x49, 0x04, 0x90,
-  0x10, 0x31, 0x21, 0x12, 0x11, 0x20,
-  0x30, 0x58, 0x05, 0x80, 0x58, 0x04,
-  0x64, 0x4a, 0x28, 0xa2, 0x8a, 0x28,
-  0x51, 0x48, 0xa2, 0x8a, 0x28, 0xa2,
-  0xa9, 0x10, 0x1b, 0x01, 0xb0, 0x1a,
-  0x04, 0xc4, 0x84, 0x48, 0x44, 0x84,
-  0xd0, 0x01, 0x44, 0x14, 0x41, 0x44,
-  0x82, 0x40, 0x1c, 0x01, 0xc0, 0x1c,
-  0x21, 0x37, 0x01, 0x70, 0x17, 0x00,
-  0x0c, 0x21, 0x22, 0x12, 0x21, 0x22,
-  0x4a, 0x0a, 0xc0, 0xac, 0x0a, 0xc0,
-  0x12, 0xb4, 0x51, 0x45, 0x14, 0x50,
-  0xea, 0x8d, 0x1a, 0x35, 0x55, 0xdc
-};
-
-const uint8_t kMaskRandom47_44[264] = {
-  0x46, 0x4a, 0x6c, 0xa6, 0xca, 0x6c,
-  0x33, 0x24, 0x26, 0x42, 0x64, 0x26,
-  0x99, 0x02, 0x12, 0x21, 0x22, 0x12,
-  0x05, 0x80, 0x0e, 0x00, 0xe0, 0x0e,
-  0x80, 0xa1, 0x82, 0x18, 0x21, 0x82,
-  0x84, 0x48, 0x18, 0x81, 0x88, 0x18,
-  0x40, 0x6d, 0x40, 0xd4, 0x0d, 0x40,
-  0x0a, 0x90, 0xc1, 0x0c, 0x10, 0xc0,
-  0x68, 0x04, 0x90, 0x49, 0x04, 0x90,
-  0x10, 0x31, 0x21, 0x12, 0x11, 0x20,
-  0x30, 0x58, 0x05, 0x80, 0x58, 0x04,
-  0x64, 0x4a, 0x28, 0xa2, 0x8a, 0x28,
-  0x51, 0x48, 0xa2, 0x8a, 0x28, 0xa2,
-  0xa9, 0x10, 0x1b, 0x01, 0xb0, 0x1a,
-  0x04, 0xc4, 0x84, 0x48, 0x44, 0x84,
-  0xd0, 0x01, 0x44, 0x14, 0x41, 0x44,
-  0x82, 0x40, 0x1c, 0x01, 0xc0, 0x1c,
-  0x21, 0x37, 0x01, 0x70, 0x17, 0x00,
-  0x0c, 0x21, 0x22, 0x12, 0x21, 0x22,
-  0x4a, 0x0a, 0xc0, 0xac, 0x0a, 0xc0,
-  0x12, 0xb4, 0x51, 0x45, 0x14, 0x50,
-  0xea, 0x8d, 0x1a, 0x35, 0x55, 0xdc,
-  0x64, 0x4a, 0x28, 0xa2, 0x8a, 0x28,
-  0x51, 0x48, 0xa2, 0x8a, 0x28, 0xa2,
-  0xa9, 0x10, 0x1b, 0x01, 0xb0, 0x1a,
-  0x04, 0xc4, 0x84, 0x48, 0x44, 0x84,
-  0xd0, 0x01, 0x44, 0x14, 0x41, 0x44,
-  0x82, 0x40, 0x1c, 0x01, 0xc0, 0x1c,
-  0x21, 0x37, 0x01, 0x70, 0x17, 0x00,
-  0x0c, 0x21, 0x22, 0x12, 0x21, 0x22,
-  0x4a, 0x0a, 0xc0, 0xac, 0x0a, 0xc0,
-  0x12, 0xb4, 0x51, 0x45, 0x14, 0x50,
-  0x46, 0x4a, 0x6c, 0xa6, 0xca, 0x6c,
-  0x33, 0x24, 0x26, 0x42, 0x64, 0x26,
-  0x99, 0x02, 0x12, 0x21, 0x22, 0x12,
-  0x05, 0x80, 0x0e, 0x00, 0xe0, 0x0e,
-  0x80, 0xa1, 0x82, 0x18, 0x21, 0x82,
-  0x84, 0x48, 0x18, 0x81, 0x88, 0x18,
-  0x40, 0x6d, 0x40, 0xd4, 0x0d, 0x40,
-  0x0a, 0x90, 0xc1, 0x0c, 0x10, 0xc0,
-  0x68, 0x04, 0x90, 0x49, 0x04, 0x90,
-  0x10, 0x31, 0x21, 0x12, 0x11, 0x20,
-  0x30, 0x58, 0x05, 0x80, 0x58, 0x04,
-  0xd4, 0x8a, 0xd4, 0xd3, 0x3f, 0xe6
-};
-
-const uint8_t kMaskRandom47_45[270] = {
-  0x46, 0x4a, 0x6c, 0xa6, 0xca, 0x6c,
-  0x33, 0x24, 0x26, 0x42, 0x64, 0x26,
-  0x99, 0x02, 0x12, 0x21, 0x22, 0x12,
-  0x05, 0x80, 0x0e, 0x00, 0xe0, 0x0e,
-  0x80, 0xa1, 0x82, 0x18, 0x21, 0x82,
-  0x84, 0x48, 0x18, 0x81, 0x88, 0x18,
-  0x40, 0x6d, 0x40, 0xd4, 0x0d, 0x40,
-  0x0a, 0x90, 0xc1, 0x0c, 0x10, 0xc0,
-  0x68, 0x04, 0x90, 0x49, 0x04, 0x90,
-  0x10, 0x31, 0x21, 0x12, 0x11, 0x20,
-  0x30, 0x58, 0x05, 0x80, 0x58, 0x04,
-  0x64, 0x4a, 0x28, 0xa2, 0x8a, 0x28,
-  0x51, 0x48, 0xa2, 0x8a, 0x28, 0xa2,
-  0xa9, 0x10, 0x1b, 0x01, 0xb0, 0x1a,
-  0x04, 0xc4, 0x84, 0x48, 0x44, 0x84,
-  0xd0, 0x01, 0x44, 0x14, 0x41, 0x44,
-  0x82, 0x40, 0x1c, 0x01, 0xc0, 0x1c,
-  0x21, 0x37, 0x01, 0x70, 0x17, 0x00,
-  0x0c, 0x21, 0x22, 0x12, 0x21, 0x22,
-  0x4a, 0x0a, 0xc0, 0xac, 0x0a, 0xc0,
-  0x12, 0xb4, 0x51, 0x45, 0x14, 0x50,
-  0xea, 0x8d, 0x1a, 0x35, 0x55, 0xdc,
-  0x46, 0x4a, 0x6c, 0xa6, 0xca, 0x6c,
-  0x33, 0x24, 0x26, 0x42, 0x64, 0x26,
-  0x99, 0x02, 0x12, 0x21, 0x22, 0x12,
-  0x05, 0x80, 0x0e, 0x00, 0xe0, 0x0e,
-  0x80, 0xa1, 0x82, 0x18, 0x21, 0x82,
-  0x84, 0x48, 0x18, 0x81, 0x88, 0x18,
-  0x40, 0x6d, 0x40, 0xd4, 0x0d, 0x40,
-  0x0a, 0x90, 0xc1, 0x0c, 0x10, 0xc0,
-  0x68, 0x04, 0x90, 0x49, 0x04, 0x90,
-  0x10, 0x31, 0x21, 0x12, 0x11, 0x20,
-  0x30, 0x58, 0x05, 0x80, 0x58, 0x04,
-  0x46, 0x42, 0x0c, 0x20, 0xc2, 0x0c,
-  0x33, 0x20, 0x46, 0x04, 0x60, 0x46,
-  0x99, 0x08, 0x0a, 0x80, 0xa8, 0x0a,
-  0x05, 0x84, 0x30, 0x43, 0x04, 0x30,
-  0x80, 0xb0, 0x23, 0x02, 0x30, 0x22,
-  0x84, 0x42, 0x90, 0x29, 0x02, 0x90,
-  0x40, 0x73, 0x01, 0x30, 0x13, 0x00,
-  0x0a, 0x81, 0x12, 0x11, 0x21, 0x12,
-  0x68, 0x0c, 0x40, 0xc4, 0x0c, 0x40,
-  0x10, 0x24, 0x84, 0x48, 0x44, 0x84,
-  0x30, 0x51, 0x41, 0x14, 0x11, 0x40,
-  0x5f, 0x50, 0x89, 0x08, 0x90, 0x88
-};
-
-const uint8_t kMaskRandom47_46[276] = {
-  0x46, 0x4a, 0x6c, 0xa6, 0xca, 0x6c,
-  0x33, 0x24, 0x26, 0x42, 0x64, 0x26,
-  0x99, 0x02, 0x12, 0x21, 0x22, 0x12,
-  0x05, 0x80, 0x0e, 0x00, 0xe0, 0x0e,
-  0x80, 0xa1, 0x82, 0x18, 0x21, 0x82,
-  0x84, 0x48, 0x18, 0x81, 0x88, 0x18,
-  0x40, 0x6d, 0x40, 0xd4, 0x0d, 0x40,
-  0x0a, 0x90, 0xc1, 0x0c, 0x10, 0xc0,
-  0x68, 0x04, 0x90, 0x49, 0x04, 0x90,
-  0x10, 0x31, 0x21, 0x12, 0x11, 0x20,
-  0x30, 0x58, 0x05, 0x80, 0x58, 0x04,
-  0x46, 0x42, 0x0c, 0x20, 0xc2, 0x0c,
-  0x33, 0x20, 0x46, 0x04, 0x60, 0x46,
-  0x99, 0x08, 0x0a, 0x80, 0xa8, 0x0a,
-  0x05, 0x84, 0x30, 0x43, 0x04, 0x30,
-  0x80, 0xb0, 0x23, 0x02, 0x30, 0x22,
-  0x84, 0x42, 0x90, 0x29, 0x02, 0x90,
-  0x40, 0x73, 0x01, 0x30, 0x13, 0x00,
-  0x0a, 0x81, 0x12, 0x11, 0x21, 0x12,
-  0x68, 0x0c, 0x40, 0xc4, 0x0c, 0x40,
-  0x10, 0x24, 0x84, 0x48, 0x44, 0x84,
-  0x30, 0x51, 0x41, 0x14, 0x11, 0x40,
-  0x5f, 0x50, 0x89, 0x08, 0x90, 0x88,
-  0x46, 0x4a, 0x6c, 0xa6, 0xca, 0x6c,
-  0x33, 0x24, 0x26, 0x42, 0x64, 0x26,
-  0x99, 0x02, 0x12, 0x21, 0x22, 0x12,
-  0x05, 0x80, 0x0e, 0x00, 0xe0, 0x0e,
-  0x80, 0xa1, 0x82, 0x18, 0x21, 0x82,
-  0x84, 0x48, 0x18, 0x81, 0x88, 0x18,
-  0x40, 0x6d, 0x40, 0xd4, 0x0d, 0x40,
-  0x0a, 0x90, 0xc1, 0x0c, 0x10, 0xc0,
-  0x68, 0x04, 0x90, 0x49, 0x04, 0x90,
-  0x10, 0x31, 0x21, 0x12, 0x11, 0x20,
-  0x30, 0x58, 0x05, 0x80, 0x58, 0x04,
-  0x64, 0x4a, 0x28, 0xa2, 0x8a, 0x28,
-  0x51, 0x48, 0xa2, 0x8a, 0x28, 0xa2,
-  0xa9, 0x10, 0x1b, 0x01, 0xb0, 0x1a,
-  0x04, 0xc4, 0x84, 0x48, 0x44, 0x84,
-  0xd0, 0x01, 0x44, 0x14, 0x41, 0x44,
-  0x82, 0x40, 0x1c, 0x01, 0xc0, 0x1c,
-  0x21, 0x37, 0x01, 0x70, 0x17, 0x00,
-  0x0c, 0x21, 0x22, 0x12, 0x21, 0x22,
-  0x4a, 0x0a, 0xc0, 0xac, 0x0a, 0xc0,
-  0x12, 0xb4, 0x51, 0x45, 0x14, 0x50,
-  0xea, 0x8d, 0x1a, 0x35, 0x55, 0xdc,
-  0x37, 0x9d, 0xcf, 0xe0, 0xe4, 0x20
-};
-
-const uint8_t kMaskRandom47_47[282] = {
-  0x46, 0x4a, 0x6c, 0xa6, 0xca, 0x6c,
-  0x33, 0x24, 0x26, 0x42, 0x64, 0x26,
-  0x99, 0x02, 0x12, 0x21, 0x22, 0x12,
-  0x05, 0x80, 0x0e, 0x00, 0xe0, 0x0e,
-  0x80, 0xa1, 0x82, 0x18, 0x21, 0x82,
-  0x84, 0x48, 0x18, 0x81, 0x88, 0x18,
-  0x40, 0x6d, 0x40, 0xd4, 0x0d, 0x40,
-  0x0a, 0x90, 0xc1, 0x0c, 0x10, 0xc0,
-  0x68, 0x04, 0x90, 0x49, 0x04, 0x90,
-  0x10, 0x31, 0x21, 0x12, 0x11, 0x20,
-  0x30, 0x58, 0x05, 0x80, 0x58, 0x04,
-  0x46, 0x42, 0x0c, 0x20, 0xc2, 0x0c,
-  0x33, 0x20, 0x46, 0x04, 0x60, 0x46,
-  0x99, 0x08, 0x0a, 0x80, 0xa8, 0x0a,
-  0x05, 0x84, 0x30, 0x43, 0x04, 0x30,
-  0x80, 0xb0, 0x23, 0x02, 0x30, 0x22,
-  0x84, 0x42, 0x90, 0x29, 0x02, 0x90,
-  0x40, 0x73, 0x01, 0x30, 0x13, 0x00,
-  0x0a, 0x81, 0x12, 0x11, 0x21, 0x12,
-  0x68, 0x0c, 0x40, 0xc4, 0x0c, 0x40,
-  0x10, 0x24, 0x84, 0x48, 0x44, 0x84,
-  0x30, 0x51, 0x41, 0x14, 0x11, 0x40,
-  0x5f, 0x50, 0x89, 0x08, 0x90, 0x88,
-  0x46, 0x4a, 0x6c, 0x20, 0xc2, 0x0c,
-  0x33, 0x24, 0x26, 0x04, 0x60, 0x46,
-  0x99, 0x02, 0x12, 0x80, 0xa8, 0x0a,
-  0x05, 0x80, 0x0e, 0x43, 0x04, 0x30,
-  0x80, 0xa1, 0x83, 0x02, 0x30, 0x22,
-  0x84, 0x48, 0x18, 0x29, 0x02, 0x90,
-  0x40, 0x6d, 0x41, 0x30, 0x13, 0x00,
-  0x0a, 0x90, 0xc0, 0x11, 0x21, 0x12,
-  0x68, 0x04, 0x90, 0xc4, 0x0c, 0x40,
-  0x10, 0x31, 0x20, 0x48, 0x44, 0x84,
-  0x30, 0x58, 0x05, 0x14, 0x11, 0x40,
-  0x46, 0x42, 0x0d, 0x08, 0x90, 0x88,
-  0x33, 0x20, 0x46, 0xa6, 0xca, 0x6c,
-  0x99, 0x08, 0x0a, 0x42, 0x64, 0x26,
-  0x05, 0x84, 0x30, 0x21, 0x22, 0x12,
-  0x80, 0xb0, 0x22, 0x00, 0xe0, 0x0e,
-  0x84, 0x42, 0x90, 0x18, 0x21, 0x82,
-  0x40, 0x73, 0x00, 0x81, 0x88, 0x18,
-  0x0a, 0x81, 0x12, 0xd4, 0x0d, 0x40,
-  0x68, 0x0c, 0x41, 0x0c, 0x10, 0xc0,
-  0x10, 0x24, 0x84, 0x49, 0x04, 0x90,
-  0x30, 0x51, 0x41, 0x12, 0x11, 0x20,
-  0x5f, 0x50, 0x89, 0x80, 0x58, 0x04,
-  0x1f, 0x2f, 0x63, 0x10, 0x64, 0xb2
-};
-
-const uint8_t kMaskRandom47_5[30] = {
-  0xc6, 0xca, 0x6c, 0xa6, 0xca, 0x6c,
-  0x63, 0x6c, 0x96, 0xc9, 0x6c, 0x96,
-  0x1d, 0xa1, 0xdc, 0x1d, 0xc1, 0xdc,
-  0xad, 0x55, 0x39, 0x53, 0x95, 0x38,
-  0xb2, 0xb7, 0x07, 0x70, 0x77, 0x06
-};
-
-const uint8_t kMaskRandom47_6[36] = {
-  0x64, 0x4a, 0x29, 0xa2, 0x9a, 0x28,
-  0x51, 0x58, 0xa2, 0x8a, 0x68, 0xa6,
-  0x0c, 0xa4, 0x30, 0x45, 0xa4, 0x5a,
-  0xa1, 0x22, 0x46, 0x2d, 0x82, 0xd8,
-  0x12, 0xa1, 0x1c, 0x17, 0x41, 0x74,
-  0x8a, 0x45, 0xc1, 0xd1, 0x1d, 0x10
-};
-
-const uint8_t kMaskRandom47_7[42] = {
-  0x46, 0x4a, 0x6d, 0xa6, 0xca, 0x6c,
-  0x33, 0x24, 0x26, 0x4a, 0x64, 0xa6,
-  0x91, 0x92, 0x12, 0x61, 0xa6, 0x0a,
-  0xa4, 0x20, 0x4a, 0x0c, 0x90, 0xd8,
-  0x50, 0xa0, 0xd5, 0x81, 0x70, 0x36,
-  0x84, 0xc5, 0x80, 0x55, 0x45, 0x54,
-  0x09, 0x71, 0x0d, 0x50, 0x9d, 0x08
-};
-
-const uint8_t kMaskRandom47_8[48] = {
-  0x0c, 0x84, 0x0d, 0x02, 0xc0, 0x2c,
-  0x80, 0x70, 0x06, 0x80, 0x78, 0x06,
-  0xa0, 0x88, 0x48, 0x21, 0x22, 0x12,
-  0x05, 0x40, 0x32, 0x0c, 0xa0, 0xca,
-  0x43, 0x02, 0x82, 0x40, 0x95, 0x08,
-  0x1a, 0x01, 0x51, 0x15, 0x41, 0x54,
-  0x60, 0x27, 0x00, 0x66, 0x06, 0x60,
-  0x14, 0x38, 0xa0, 0x99, 0x09, 0x90
-};
-
-const uint8_t kMaskRandom47_9[54] = {
-  0x46, 0x4a, 0x6d, 0xa6, 0xca, 0x6c,
-  0x62, 0x7c, 0x84, 0xc8, 0x4c, 0x84,
-  0x8c, 0x04, 0x88, 0x30, 0x83, 0x88,
-  0x01, 0x74, 0x23, 0x40, 0x94, 0x08,
-  0x07, 0x83, 0x07, 0x02, 0x70, 0x26,
-  0xa0, 0x80, 0x72, 0x45, 0x44, 0x54,
-  0x18, 0xb1, 0x42, 0x10, 0xe1, 0x0e,
-  0x91, 0x00, 0x92, 0x09, 0x20, 0x92,
-  0x78, 0x00, 0x1c, 0x03, 0x80, 0x38
-};
-
-const uint8_t kMaskRandom48_1[6] = {
-  0xff, 0xff, 0xff, 0xff, 0xff, 0xff
-};
-
-const uint8_t kMaskRandom48_10[60] = {
-  0x11, 0x45, 0x14, 0x11, 0x45, 0x14,
-  0x45, 0x34, 0x53, 0x45, 0x34, 0x53,
-  0x00, 0x48, 0x05, 0x00, 0x48, 0x05,
-  0x10, 0x83, 0x09, 0x10, 0x83, 0x09,
-  0x4a, 0x14, 0xa1, 0x4a, 0x14, 0xa1,
-  0x40, 0xa4, 0x0a, 0x40, 0xa4, 0x0a,
-  0xa0, 0x6a, 0x02, 0xa0, 0x6a, 0x02,
-  0x88, 0x80, 0x8c, 0x88, 0x80, 0x8c,
-  0x86, 0x08, 0x60, 0x86, 0x08, 0x60,
-  0x54, 0x0d, 0x40, 0x54, 0x0d, 0x40
-};
-
-const uint8_t kMaskRandom48_11[66] = {
-  0x53, 0x65, 0x34, 0x53, 0x65, 0x34,
-  0xa0, 0x32, 0x11, 0xa0, 0x32, 0x11,
-  0x15, 0x11, 0x41, 0x15, 0x11, 0x41,
-  0x03, 0x50, 0x15, 0x03, 0x50, 0x15,
-  0x8c, 0x88, 0xc8, 0x8c, 0x88, 0xc8,
-  0x28, 0x82, 0x88, 0x28, 0x82, 0x88,
-  0x08, 0x48, 0x84, 0x08, 0x48, 0x84,
-  0x99, 0x01, 0x90, 0x99, 0x01, 0x90,
-  0x22, 0x92, 0x29, 0x22, 0x92, 0x29,
-  0x46, 0x04, 0x60, 0x46, 0x04, 0x60,
-  0x8c, 0x2c, 0x02, 0x8c, 0x2c, 0x02
-};
-
-const uint8_t kMaskRandom48_12[72] = {
-  0x10, 0x61, 0x06, 0x10, 0x61, 0x06,
-  0x02, 0x30, 0x23, 0x02, 0x30, 0x23,
-  0x40, 0x54, 0x05, 0x40, 0x54, 0x05,
-  0x21, 0x82, 0x18, 0x21, 0x82, 0x18,
-  0x81, 0x18, 0x11, 0x81, 0x18, 0x11,
-  0x14, 0x81, 0x48, 0x14, 0x81, 0x48,
-  0x98, 0x09, 0x80, 0x98, 0x09, 0x80,
-  0x08, 0x90, 0x89, 0x08, 0x90, 0x89,
-  0x62, 0x06, 0x20, 0x62, 0x06, 0x20,
-  0x24, 0x22, 0x42, 0x24, 0x22, 0x42,
-  0x8a, 0x08, 0xa0, 0x8a, 0x08, 0xa0,
-  0x84, 0x48, 0x44, 0x84, 0x48, 0x44
-};
-
-const uint8_t kMaskRandom48_13[78] = {
-  0x51, 0x45, 0x14, 0x51, 0x45, 0x14,
-  0xc5, 0x1c, 0x51, 0xc5, 0x1c, 0x51,
-  0x21, 0x82, 0x18, 0x21, 0x82, 0x18,
-  0x12, 0x31, 0x23, 0x12, 0x31, 0x23,
-  0x08, 0xe0, 0x8e, 0x08, 0xe0, 0x8e,
-  0x2e, 0x02, 0xe0, 0x2e, 0x02, 0xe0,
-  0x53, 0x65, 0x36, 0x53, 0x65, 0x36,
-  0x21, 0x32, 0x13, 0x21, 0x32, 0x13,
-  0x90, 0x99, 0x09, 0x90, 0x99, 0x09,
-  0x02, 0x50, 0x25, 0x02, 0x50, 0x25,
-  0x06, 0xa0, 0x6a, 0x06, 0xa0, 0x6a,
-  0x2c, 0x02, 0xc0, 0x2c, 0x02, 0xc0,
-  0x88, 0x68, 0x86, 0x88, 0x68, 0x86
-};
-
-const uint8_t kMaskRandom48_14[84] = {
-  0x53, 0x65, 0x36, 0x53, 0x65, 0x36,
-  0x21, 0x32, 0x13, 0x21, 0x32, 0x13,
-  0x90, 0x99, 0x09, 0x90, 0x99, 0x09,
-  0x02, 0x50, 0x25, 0x02, 0x50, 0x25,
-  0x06, 0xa0, 0x6a, 0x06, 0xa0, 0x6a,
-  0x2c, 0x02, 0xc0, 0x2c, 0x02, 0xc0,
-  0x88, 0x68, 0x86, 0x88, 0x68, 0x86,
-  0x51, 0x45, 0x14, 0x51, 0x45, 0x14,
-  0xc5, 0x1c, 0x51, 0xc5, 0x1c, 0x51,
-  0x21, 0x82, 0x18, 0x21, 0x82, 0x18,
-  0x12, 0x31, 0x23, 0x12, 0x31, 0x23,
-  0x08, 0xe0, 0x8e, 0x08, 0xe0, 0x8e,
-  0x2e, 0x02, 0xe0, 0x2e, 0x02, 0xe0,
-  0xf2, 0xd6, 0x8e, 0xf2, 0xd6, 0x8e
-};
-
-const uint8_t kMaskRandom48_15[90] = {
-  0x53, 0x65, 0x36, 0x53, 0x65, 0x36,
-  0x21, 0x32, 0x13, 0x21, 0x32, 0x13,
-  0x90, 0x99, 0x09, 0x90, 0x99, 0x09,
-  0x02, 0x50, 0x25, 0x02, 0x50, 0x25,
-  0x06, 0xa0, 0x6a, 0x06, 0xa0, 0x6a,
-  0x2c, 0x02, 0xc0, 0x2c, 0x02, 0xc0,
-  0x88, 0x68, 0x86, 0x88, 0x68, 0x86,
-  0x20, 0x62, 0x06, 0x20, 0x62, 0x06,
-  0x80, 0x38, 0x03, 0x80, 0x38, 0x03,
-  0x42, 0x44, 0x24, 0x42, 0x44, 0x24,
-  0x01, 0x90, 0x19, 0x01, 0x90, 0x19,
-  0x14, 0x11, 0x41, 0x14, 0x11, 0x41,
-  0x0a, 0x80, 0xa8, 0x0a, 0x80, 0xa8,
-  0x38, 0x03, 0x80, 0x38, 0x03, 0x80,
-  0xc5, 0x0c, 0x50, 0xc5, 0x0c, 0x50
-};
-
-const uint8_t kMaskRandom48_16[96] = {
-  0x20, 0x62, 0x06, 0x20, 0x62, 0x06,
-  0x80, 0x38, 0x03, 0x80, 0x38, 0x03,
-  0x42, 0x44, 0x24, 0x42, 0x44, 0x24,
-  0x01, 0x90, 0x19, 0x01, 0x90, 0x19,
-  0x14, 0x11, 0x41, 0x14, 0x11, 0x41,
-  0x0a, 0x80, 0xa8, 0x0a, 0x80, 0xa8,
-  0x38, 0x03, 0x80, 0x38, 0x03, 0x80,
-  0xc5, 0x0c, 0x50, 0xc5, 0x0c, 0x50,
-  0x53, 0x65, 0x36, 0x53, 0x65, 0x36,
-  0x21, 0x32, 0x13, 0x21, 0x32, 0x13,
-  0x90, 0x99, 0x09, 0x90, 0x99, 0x09,
-  0x02, 0x50, 0x25, 0x02, 0x50, 0x25,
-  0x06, 0xa0, 0x6a, 0x06, 0xa0, 0x6a,
-  0x2c, 0x02, 0xc0, 0x2c, 0x02, 0xc0,
-  0x88, 0x68, 0x86, 0x88, 0x68, 0x86,
-  0xff, 0x6e, 0x0a, 0xff, 0x6e, 0x0a
-};
-
-const uint8_t kMaskRandom48_17[102] = {
-  0x20, 0x62, 0x06, 0x20, 0x62, 0x06,
-  0x80, 0x38, 0x03, 0x80, 0x38, 0x03,
-  0x42, 0x44, 0x24, 0x42, 0x44, 0x24,
-  0x01, 0x90, 0x19, 0x01, 0x90, 0x19,
-  0x14, 0x11, 0x41, 0x14, 0x11, 0x41,
-  0x0a, 0x80, 0xa8, 0x0a, 0x80, 0xa8,
-  0x38, 0x03, 0x80, 0x38, 0x03, 0x80,
-  0xc5, 0x0c, 0x50, 0xc5, 0x0c, 0x50,
-  0x53, 0x65, 0x36, 0x53, 0x65, 0x36,
-  0xe4, 0x2e, 0x42, 0xe4, 0x2e, 0x42,
-  0x24, 0x42, 0x44, 0x24, 0x42, 0x44,
-  0xa1, 0x1a, 0x11, 0xa1, 0x1a, 0x11,
-  0x18, 0x31, 0x83, 0x18, 0x31, 0x83,
-  0x03, 0x90, 0x39, 0x03, 0x90, 0x39,
-  0x8a, 0x18, 0xa1, 0x8a, 0x18, 0xa1,
-  0x04, 0x90, 0x49, 0x04, 0x90, 0x49,
-  0x00, 0xe0, 0x0e, 0x00, 0xe0, 0x0e
-};
-
-const uint8_t kMaskRandom48_18[108] = {
-  0x53, 0x65, 0x36, 0x53, 0x65, 0x36,
-  0xe4, 0x2e, 0x42, 0xe4, 0x2e, 0x42,
-  0x24, 0x42, 0x44, 0x24, 0x42, 0x44,
-  0xa1, 0x1a, 0x11, 0xa1, 0x1a, 0x11,
-  0x18, 0x31, 0x83, 0x18, 0x31, 0x83,
-  0x03, 0x90, 0x39, 0x03, 0x90, 0x39,
-  0x8a, 0x18, 0xa1, 0x8a, 0x18, 0xa1,
-  0x04, 0x90, 0x49, 0x04, 0x90, 0x49,
-  0x00, 0xe0, 0x0e, 0x00, 0xe0, 0x0e,
-  0x20, 0x62, 0x06, 0x20, 0x62, 0x06,
-  0x80, 0x38, 0x03, 0x80, 0x38, 0x03,
-  0x42, 0x44, 0x24, 0x42, 0x44, 0x24,
-  0x01, 0x90, 0x19, 0x01, 0x90, 0x19,
-  0x14, 0x11, 0x41, 0x14, 0x11, 0x41,
-  0x0a, 0x80, 0xa8, 0x0a, 0x80, 0xa8,
-  0x38, 0x03, 0x80, 0x38, 0x03, 0x80,
-  0xc5, 0x0c, 0x50, 0xc5, 0x0c, 0x50,
-  0x34, 0x50, 0xae, 0x34, 0x50, 0xae
-};
-
-const uint8_t kMaskRandom48_19[114] = {
-  0x53, 0x65, 0x36, 0x53, 0x65, 0x36,
-  0xe4, 0x2e, 0x42, 0xe4, 0x2e, 0x42,
-  0x24, 0x42, 0x44, 0x24, 0x42, 0x44,
-  0xa1, 0x1a, 0x11, 0xa1, 0x1a, 0x11,
-  0x18, 0x31, 0x83, 0x18, 0x31, 0x83,
-  0x03, 0x90, 0x39, 0x03, 0x90, 0x39,
-  0x8a, 0x18, 0xa1, 0x8a, 0x18, 0xa1,
-  0x04, 0x90, 0x49, 0x04, 0x90, 0x49,
-  0x00, 0xe0, 0x0e, 0x00, 0xe0, 0x0e,
-  0x51, 0x45, 0x14, 0x51, 0x45, 0x14,
-  0x45, 0x14, 0x51, 0x45, 0x14, 0x51,
-  0x80, 0xd8, 0x0d, 0x80, 0xd8, 0x0d,
-  0x24, 0x22, 0x42, 0x24, 0x22, 0x42,
-  0x0a, 0x20, 0xa2, 0x0a, 0x20, 0xa2,
-  0x00, 0xe0, 0x0e, 0x00, 0xe0, 0x0e,
-  0xb8, 0x0b, 0x80, 0xb8, 0x0b, 0x80,
-  0x09, 0x10, 0x91, 0x09, 0x10, 0x91,
-  0x56, 0x05, 0x60, 0x56, 0x05, 0x60,
-  0xa2, 0x8a, 0x28, 0xa2, 0x8a, 0x28
-};
-
-const uint8_t kMaskRandom48_2[12] = {
-  0xec, 0xce, 0xcc, 0xec, 0xce, 0xcc,
-  0x93, 0xb9, 0x3b, 0x93, 0xb9, 0x3b
-};
-
-const uint8_t kMaskRandom48_20[120] = {
-  0x51, 0x45, 0x14, 0x51, 0x45, 0x14,
-  0x45, 0x14, 0x51, 0x45, 0x14, 0x51,
-  0x80, 0xd8, 0x0d, 0x80, 0xd8, 0x0d,
-  0x24, 0x22, 0x42, 0x24, 0x22, 0x42,
-  0x0a, 0x20, 0xa2, 0x0a, 0x20, 0xa2,
-  0x00, 0xe0, 0x0e, 0x00, 0xe0, 0x0e,
-  0xb8, 0x0b, 0x80, 0xb8, 0x0b, 0x80,
-  0x09, 0x10, 0x91, 0x09, 0x10, 0x91,
-  0x56, 0x05, 0x60, 0x56, 0x05, 0x60,
-  0xa2, 0x8a, 0x28, 0xa2, 0x8a, 0x28,
-  0x53, 0x65, 0x36, 0x53, 0x65, 0x36,
-  0xe4, 0x2e, 0x42, 0xe4, 0x2e, 0x42,
-  0x24, 0x42, 0x44, 0x24, 0x42, 0x44,
-  0xa1, 0x1a, 0x11, 0xa1, 0x1a, 0x11,
-  0x18, 0x31, 0x83, 0x18, 0x31, 0x83,
-  0x03, 0x90, 0x39, 0x03, 0x90, 0x39,
-  0x8a, 0x18, 0xa1, 0x8a, 0x18, 0xa1,
-  0x04, 0x90, 0x49, 0x04, 0x90, 0x49,
-  0x00, 0xe0, 0x0e, 0x00, 0xe0, 0x0e,
-  0x98, 0xa2, 0x95, 0x98, 0xa2, 0x95
-};
-
-const uint8_t kMaskRandom48_21[126] = {
-  0x51, 0x45, 0x14, 0x51, 0x45, 0x14,
-  0x45, 0x14, 0x51, 0x45, 0x14, 0x51,
-  0x80, 0xd8, 0x0d, 0x80, 0xd8, 0x0d,
-  0x24, 0x22, 0x42, 0x24, 0x22, 0x42,
-  0x0a, 0x20, 0xa2, 0x0a, 0x20, 0xa2,
-  0x00, 0xe0, 0x0e, 0x00, 0xe0, 0x0e,
-  0xb8, 0x0b, 0x80, 0xb8, 0x0b, 0x80,
-  0x09, 0x10, 0x91, 0x09, 0x10, 0x91,
-  0x56, 0x05, 0x60, 0x56, 0x05, 0x60,
-  0xa2, 0x8a, 0x28, 0xa2, 0x8a, 0x28,
-  0x53, 0x65, 0x36, 0x53, 0x65, 0x36,
-  0x21, 0x32, 0x13, 0x21, 0x32, 0x13,
-  0x10, 0x91, 0x09, 0x10, 0x91, 0x09,
-  0x00, 0x70, 0x07, 0x00, 0x70, 0x07,
-  0x0c, 0x10, 0xc1, 0x0c, 0x10, 0xc1,
-  0x40, 0xc4, 0x0c, 0x40, 0xc4, 0x0c,
-  0x6a, 0x06, 0xa0, 0x6a, 0x06, 0xa0,
-  0x86, 0x08, 0x60, 0x86, 0x08, 0x60,
-  0x24, 0x82, 0x48, 0x24, 0x82, 0x48,
-  0x89, 0x08, 0x90, 0x89, 0x08, 0x90,
-  0xc0, 0x2c, 0x02, 0xc0, 0x2c, 0x02
-};
-
-const uint8_t kMaskRandom48_22[132] = {
-  0x53, 0x65, 0x36, 0x53, 0x65, 0x36,
-  0x21, 0x32, 0x13, 0x21, 0x32, 0x13,
-  0x10, 0x91, 0x09, 0x10, 0x91, 0x09,
-  0x00, 0x70, 0x07, 0x00, 0x70, 0x07,
-  0x0c, 0x10, 0xc1, 0x0c, 0x10, 0xc1,
-  0x40, 0xc4, 0x0c, 0x40, 0xc4, 0x0c,
-  0x6a, 0x06, 0xa0, 0x6a, 0x06, 0xa0,
-  0x86, 0x08, 0x60, 0x86, 0x08, 0x60,
-  0x24, 0x82, 0x48, 0x24, 0x82, 0x48,
-  0x89, 0x08, 0x90, 0x89, 0x08, 0x90,
-  0xc0, 0x2c, 0x02, 0xc0, 0x2c, 0x02,
-  0x51, 0x45, 0x14, 0x51, 0x45, 0x14,
-  0x45, 0x14, 0x51, 0x45, 0x14, 0x51,
-  0x80, 0xd8, 0x0d, 0x80, 0xd8, 0x0d,
-  0x24, 0x22, 0x42, 0x24, 0x22, 0x42,
-  0x0a, 0x20, 0xa2, 0x0a, 0x20, 0xa2,
-  0x00, 0xe0, 0x0e, 0x00, 0xe0, 0x0e,
-  0xb8, 0x0b, 0x80, 0xb8, 0x0b, 0x80,
-  0x09, 0x10, 0x91, 0x09, 0x10, 0x91,
-  0x56, 0x05, 0x60, 0x56, 0x05, 0x60,
-  0xa2, 0x8a, 0x28, 0xa2, 0x8a, 0x28,
-  0x1a, 0xaa, 0xee, 0x1a, 0xaa, 0xee
-};
-
-const uint8_t kMaskRandom48_23[138] = {
-  0x53, 0x65, 0x36, 0x53, 0x65, 0x36,
-  0x21, 0x32, 0x13, 0x21, 0x32, 0x13,
-  0x10, 0x91, 0x09, 0x10, 0x91, 0x09,
-  0x00, 0x70, 0x07, 0x00, 0x70, 0x07,
-  0x0c, 0x10, 0xc1, 0x0c, 0x10, 0xc1,
-  0x40, 0xc4, 0x0c, 0x40, 0xc4, 0x0c,
-  0x6a, 0x06, 0xa0, 0x6a, 0x06, 0xa0,
-  0x86, 0x08, 0x60, 0x86, 0x08, 0x60,
-  0x24, 0x82, 0x48, 0x24, 0x82, 0x48,
-  0x89, 0x08, 0x90, 0x89, 0x08, 0x90,
-  0xc0, 0x2c, 0x02, 0xc0, 0x2c, 0x02,
-  0x10, 0x61, 0x06, 0x10, 0x61, 0x06,
-  0x02, 0x30, 0x23, 0x02, 0x30, 0x23,
-  0x40, 0x54, 0x05, 0x40, 0x54, 0x05,
-  0x21, 0x82, 0x18, 0x21, 0x82, 0x18,
-  0x81, 0x18, 0x11, 0x81, 0x18, 0x11,
-  0x14, 0x81, 0x48, 0x14, 0x81, 0x48,
-  0x98, 0x09, 0x80, 0x98, 0x09, 0x80,
-  0x08, 0x90, 0x89, 0x08, 0x90, 0x89,
-  0x62, 0x06, 0x20, 0x62, 0x06, 0x20,
-  0x24, 0x22, 0x42, 0x24, 0x22, 0x42,
-  0x8a, 0x08, 0xa0, 0x8a, 0x08, 0xa0,
-  0x84, 0x48, 0x44, 0x84, 0x48, 0x44
-};
-
-const uint8_t kMaskRandom48_24[144] = {
-  0x10, 0x61, 0x06, 0x10, 0x61, 0x06,
-  0x02, 0x30, 0x23, 0x02, 0x30, 0x23,
-  0x40, 0x54, 0x05, 0x40, 0x54, 0x05,
-  0x21, 0x82, 0x18, 0x21, 0x82, 0x18,
-  0x81, 0x18, 0x11, 0x81, 0x18, 0x11,
-  0x14, 0x81, 0x48, 0x14, 0x81, 0x48,
-  0x98, 0x09, 0x80, 0x98, 0x09, 0x80,
-  0x08, 0x90, 0x89, 0x08, 0x90, 0x89,
-  0x62, 0x06, 0x20, 0x62, 0x06, 0x20,
-  0x24, 0x22, 0x42, 0x24, 0x22, 0x42,
-  0x8a, 0x08, 0xa0, 0x8a, 0x08, 0xa0,
-  0x84, 0x48, 0x44, 0x84, 0x48, 0x44,
-  0x53, 0x65, 0x36, 0x53, 0x65, 0x36,
-  0x21, 0x32, 0x13, 0x21, 0x32, 0x13,
-  0x10, 0x91, 0x09, 0x10, 0x91, 0x09,
-  0x00, 0x70, 0x07, 0x00, 0x70, 0x07,
-  0x0c, 0x10, 0xc1, 0x0c, 0x10, 0xc1,
-  0x40, 0xc4, 0x0c, 0x40, 0xc4, 0x0c,
-  0x6a, 0x06, 0xa0, 0x6a, 0x06, 0xa0,
-  0x86, 0x08, 0x60, 0x86, 0x08, 0x60,
-  0x24, 0x82, 0x48, 0x24, 0x82, 0x48,
-  0x89, 0x08, 0x90, 0x89, 0x08, 0x90,
-  0xc0, 0x2c, 0x02, 0xc0, 0x2c, 0x02,
-  0x88, 0x32, 0x59, 0x88, 0x32, 0x59
-};
-
-const uint8_t kMaskRandom48_25[150] = {
-  0x10, 0x61, 0x06, 0x10, 0x61, 0x06,
-  0x02, 0x30, 0x23, 0x02, 0x30, 0x23,
-  0x40, 0x54, 0x05, 0x40, 0x54, 0x05,
-  0x21, 0x82, 0x18, 0x21, 0x82, 0x18,
-  0x81, 0x18, 0x11, 0x81, 0x18, 0x11,
-  0x14, 0x81, 0x48, 0x14, 0x81, 0x48,
-  0x98, 0x09, 0x80, 0x98, 0x09, 0x80,
-  0x08, 0x90, 0x89, 0x08, 0x90, 0x89,
-  0x62, 0x06, 0x20, 0x62, 0x06, 0x20,
-  0x24, 0x22, 0x42, 0x24, 0x22, 0x42,
-  0x8a, 0x08, 0xa0, 0x8a, 0x08, 0xa0,
-  0x84, 0x48, 0x44, 0x84, 0x48, 0x44,
-  0x51, 0x45, 0x14, 0x51, 0x45, 0x14,
-  0xc5, 0x1c, 0x51, 0xc5, 0x1c, 0x51,
-  0x21, 0x82, 0x18, 0x21, 0x82, 0x18,
-  0x12, 0x31, 0x23, 0x12, 0x31, 0x23,
-  0x08, 0xe0, 0x8e, 0x08, 0xe0, 0x8e,
-  0x2e, 0x02, 0xe0, 0x2e, 0x02, 0xe0,
-  0x53, 0x65, 0x36, 0x53, 0x65, 0x36,
-  0x21, 0x32, 0x13, 0x21, 0x32, 0x13,
-  0x90, 0x99, 0x09, 0x90, 0x99, 0x09,
-  0x02, 0x50, 0x25, 0x02, 0x50, 0x25,
-  0x06, 0xa0, 0x6a, 0x06, 0xa0, 0x6a,
-  0x2c, 0x02, 0xc0, 0x2c, 0x02, 0xc0,
-  0x88, 0x68, 0x86, 0x88, 0x68, 0x86
-};
-
-const uint8_t kMaskRandom48_26[156] = {
-  0x51, 0x45, 0x14, 0x51, 0x45, 0x14,
-  0xc5, 0x1c, 0x51, 0xc5, 0x1c, 0x51,
-  0x21, 0x82, 0x18, 0x21, 0x82, 0x18,
-  0x12, 0x31, 0x23, 0x12, 0x31, 0x23,
-  0x08, 0xe0, 0x8e, 0x08, 0xe0, 0x8e,
-  0x2e, 0x02, 0xe0, 0x2e, 0x02, 0xe0,
-  0x53, 0x65, 0x36, 0x53, 0x65, 0x36,
-  0x21, 0x32, 0x13, 0x21, 0x32, 0x13,
-  0x90, 0x99, 0x09, 0x90, 0x99, 0x09,
-  0x02, 0x50, 0x25, 0x02, 0x50, 0x25,
-  0x06, 0xa0, 0x6a, 0x06, 0xa0, 0x6a,
-  0x2c, 0x02, 0xc0, 0x2c, 0x02, 0xc0,
-  0x88, 0x68, 0x86, 0x88, 0x68, 0x86,
-  0x10, 0x61, 0x06, 0x10, 0x61, 0x06,
-  0x02, 0x30, 0x23, 0x02, 0x30, 0x23,
-  0x40, 0x54, 0x05, 0x40, 0x54, 0x05,
-  0x21, 0x82, 0x18, 0x21, 0x82, 0x18,
-  0x81, 0x18, 0x11, 0x81, 0x18, 0x11,
-  0x14, 0x81, 0x48, 0x14, 0x81, 0x48,
-  0x98, 0x09, 0x80, 0x98, 0x09, 0x80,
-  0x08, 0x90, 0x89, 0x08, 0x90, 0x89,
-  0x62, 0x06, 0x20, 0x62, 0x06, 0x20,
-  0x24, 0x22, 0x42, 0x24, 0x22, 0x42,
-  0x8a, 0x08, 0xa0, 0x8a, 0x08, 0xa0,
-  0x84, 0x48, 0x44, 0x84, 0x48, 0x44,
-  0x3e, 0x20, 0x79, 0xe5, 0x55, 0x70
-};
-
-const uint8_t kMaskRandom48_27[162] = {
-  0x51, 0x45, 0x14, 0x51, 0x45, 0x14,
-  0xc5, 0x1c, 0x51, 0xc5, 0x1c, 0x51,
-  0x21, 0x82, 0x18, 0x21, 0x82, 0x18,
-  0x12, 0x31, 0x23, 0x12, 0x31, 0x23,
-  0x08, 0xe0, 0x8e, 0x08, 0xe0, 0x8e,
-  0x2e, 0x02, 0xe0, 0x2e, 0x02, 0xe0,
-  0x53, 0x65, 0x36, 0x53, 0x65, 0x36,
-  0x21, 0x32, 0x13, 0x21, 0x32, 0x13,
-  0x90, 0x99, 0x09, 0x90, 0x99, 0x09,
-  0x02, 0x50, 0x25, 0x02, 0x50, 0x25,
-  0x06, 0xa0, 0x6a, 0x06, 0xa0, 0x6a,
-  0x2c, 0x02, 0xc0, 0x2c, 0x02, 0xc0,
-  0x88, 0x68, 0x86, 0x88, 0x68, 0x86,
-  0x53, 0x65, 0x36, 0x53, 0x65, 0x36,
-  0x21, 0x32, 0x13, 0x21, 0x32, 0x13,
-  0x90, 0x99, 0x09, 0x90, 0x99, 0x09,
-  0x02, 0x50, 0x25, 0x02, 0x50, 0x25,
-  0x06, 0xa0, 0x6a, 0x06, 0xa0, 0x6a,
-  0x2c, 0x02, 0xc0, 0x2c, 0x02, 0xc0,
-  0x88, 0x68, 0x86, 0x88, 0x68, 0x86,
-  0x51, 0x45, 0x14, 0x51, 0x45, 0x14,
-  0xc5, 0x1c, 0x51, 0xc5, 0x1c, 0x51,
-  0x21, 0x82, 0x18, 0x21, 0x82, 0x18,
-  0x12, 0x31, 0x23, 0x12, 0x31, 0x23,
-  0x08, 0xe0, 0x8e, 0x08, 0xe0, 0x8e,
-  0x2e, 0x02, 0xe0, 0x2e, 0x02, 0xe0,
-  0xf2, 0xd6, 0x8e, 0xf2, 0xd6, 0x8e
-};
-
-const uint8_t kMaskRandom48_28[168] = {
-  0x53, 0x65, 0x36, 0x53, 0x65, 0x36,
-  0x21, 0x32, 0x13, 0x21, 0x32, 0x13,
-  0x90, 0x99, 0x09, 0x90, 0x99, 0x09,
-  0x02, 0x50, 0x25, 0x02, 0x50, 0x25,
-  0x06, 0xa0, 0x6a, 0x06, 0xa0, 0x6a,
-  0x2c, 0x02, 0xc0, 0x2c, 0x02, 0xc0,
-  0x88, 0x68, 0x86, 0x88, 0x68, 0x86,
-  0x51, 0x45, 0x14, 0x51, 0x45, 0x14,
-  0xc5, 0x1c, 0x51, 0xc5, 0x1c, 0x51,
-  0x21, 0x82, 0x18, 0x21, 0x82, 0x18,
-  0x12, 0x31, 0x23, 0x12, 0x31, 0x23,
-  0x08, 0xe0, 0x8e, 0x08, 0xe0, 0x8e,
-  0x2e, 0x02, 0xe0, 0x2e, 0x02, 0xe0,
-  0xf2, 0xd6, 0x8e, 0xf2, 0xd6, 0x8e,
-  0x51, 0x45, 0x14, 0x51, 0x45, 0x14,
-  0xc5, 0x1c, 0x51, 0xc5, 0x1c, 0x51,
-  0x21, 0x82, 0x18, 0x21, 0x82, 0x18,
-  0x12, 0x31, 0x23, 0x12, 0x31, 0x23,
-  0x08, 0xe0, 0x8e, 0x08, 0xe0, 0x8e,
-  0x2e, 0x02, 0xe0, 0x2e, 0x02, 0xe0,
-  0x53, 0x65, 0x36, 0x53, 0x65, 0x36,
-  0x21, 0x32, 0x13, 0x21, 0x32, 0x13,
-  0x90, 0x99, 0x09, 0x90, 0x99, 0x09,
-  0x02, 0x50, 0x25, 0x02, 0x50, 0x25,
-  0x06, 0xa0, 0x6a, 0x06, 0xa0, 0x6a,
-  0x2c, 0x02, 0xc0, 0x2c, 0x02, 0xc0,
-  0x88, 0x68, 0x86, 0x88, 0x68, 0x86,
-  0x32, 0xe3, 0xc0, 0x4a, 0xf2, 0x2a
-};
-
-const uint8_t kMaskRandom48_29[174] = {
-  0x53, 0x65, 0x36, 0x53, 0x65, 0x36,
-  0x21, 0x32, 0x13, 0x21, 0x32, 0x13,
-  0x90, 0x99, 0x09, 0x90, 0x99, 0x09,
-  0x02, 0x50, 0x25, 0x02, 0x50, 0x25,
-  0x06, 0xa0, 0x6a, 0x06, 0xa0, 0x6a,
-  0x2c, 0x02, 0xc0, 0x2c, 0x02, 0xc0,
-  0x88, 0x68, 0x86, 0x88, 0x68, 0x86,
-  0x51, 0x45, 0x14, 0x51, 0x45, 0x14,
-  0xc5, 0x1c, 0x51, 0xc5, 0x1c, 0x51,
-  0x21, 0x82, 0x18, 0x21, 0x82, 0x18,
-  0x12, 0x31, 0x23, 0x12, 0x31, 0x23,
-  0x08, 0xe0, 0x8e, 0x08, 0xe0, 0x8e,
-  0x2e, 0x02, 0xe0, 0x2e, 0x02, 0xe0,
-  0xf2, 0xd6, 0x8e, 0xf2, 0xd6, 0x8e,
-  0x53, 0x65, 0x36, 0x53, 0x65, 0x36,
-  0x21, 0x32, 0x13, 0x21, 0x32, 0x13,
-  0x90, 0x99, 0x09, 0x90, 0x99, 0x09,
-  0x02, 0x50, 0x25, 0x02, 0x50, 0x25,
-  0x06, 0xa0, 0x6a, 0x06, 0xa0, 0x6a,
-  0x2c, 0x02, 0xc0, 0x2c, 0x02, 0xc0,
-  0x88, 0x68, 0x86, 0x88, 0x68, 0x86,
-  0x20, 0x62, 0x06, 0x20, 0x62, 0x06,
-  0x80, 0x38, 0x03, 0x80, 0x38, 0x03,
-  0x42, 0x44, 0x24, 0x42, 0x44, 0x24,
-  0x01, 0x90, 0x19, 0x01, 0x90, 0x19,
-  0x14, 0x11, 0x41, 0x14, 0x11, 0x41,
-  0x0a, 0x80, 0xa8, 0x0a, 0x80, 0xa8,
-  0x38, 0x03, 0x80, 0x38, 0x03, 0x80,
-  0xc5, 0x0c, 0x50, 0xc5, 0x0c, 0x50
-};
-
-const uint8_t kMaskRandom48_3[18] = {
-  0x9b, 0x29, 0xb2, 0x9b, 0x29, 0xb2,
-  0x49, 0xd4, 0x9d, 0x49, 0xd4, 0x9d,
-  0x3e, 0x83, 0xe8, 0x3e, 0x83, 0xe8
-};
-
-const uint8_t kMaskRandom48_30[180] = {
-  0x53, 0x65, 0x36, 0x53, 0x65, 0x36,
-  0x21, 0x32, 0x13, 0x21, 0x32, 0x13,
-  0x90, 0x99, 0x09, 0x90, 0x99, 0x09,
-  0x02, 0x50, 0x25, 0x02, 0x50, 0x25,
-  0x06, 0xa0, 0x6a, 0x06, 0xa0, 0x6a,
-  0x2c, 0x02, 0xc0, 0x2c, 0x02, 0xc0,
-  0x88, 0x68, 0x86, 0x88, 0x68, 0x86,
-  0x20, 0x62, 0x06, 0x20, 0x62, 0x06,
-  0x80, 0x38, 0x03, 0x80, 0x38, 0x03,
-  0x42, 0x44, 0x24, 0x42, 0x44, 0x24,
-  0x01, 0x90, 0x19, 0x01, 0x90, 0x19,
-  0x14, 0x11, 0x41, 0x14, 0x11, 0x41,
-  0x0a, 0x80, 0xa8, 0x0a, 0x80, 0xa8,
-  0x38, 0x03, 0x80, 0x38, 0x03, 0x80,
-  0xc5, 0x0c, 0x50, 0xc5, 0x0c, 0x50,
-  0x53, 0x65, 0x36, 0x53, 0x65, 0x36,
-  0x21, 0x32, 0x13, 0x21, 0x32, 0x13,
-  0x90, 0x99, 0x09, 0x90, 0x99, 0x09,
-  0x02, 0x50, 0x25, 0x02, 0x50, 0x25,
-  0x06, 0xa0, 0x6a, 0x06, 0xa0, 0x6a,
-  0x2c, 0x02, 0xc0, 0x2c, 0x02, 0xc0,
-  0x88, 0x68, 0x86, 0x88, 0x68, 0x86,
-  0x51, 0x45, 0x14, 0x51, 0x45, 0x14,
-  0xc5, 0x1c, 0x51, 0xc5, 0x1c, 0x51,
-  0x21, 0x82, 0x18, 0x21, 0x82, 0x18,
-  0x12, 0x31, 0x23, 0x12, 0x31, 0x23,
-  0x08, 0xe0, 0x8e, 0x08, 0xe0, 0x8e,
-  0x2e, 0x02, 0xe0, 0x2e, 0x02, 0xe0,
-  0xf2, 0xd6, 0x8e, 0xf2, 0xd6, 0x8e,
-  0x66, 0xf3, 0x9a, 0xdd, 0x68, 0x93
-};
-
-const uint8_t kMaskRandom48_31[186] = {
-  0x53, 0x65, 0x36, 0x53, 0x65, 0x36,
-  0x21, 0x32, 0x13, 0x21, 0x32, 0x13,
-  0x90, 0x99, 0x09, 0x90, 0x99, 0x09,
-  0x02, 0x50, 0x25, 0x02, 0x50, 0x25,
-  0x06, 0xa0, 0x6a, 0x06, 0xa0, 0x6a,
-  0x2c, 0x02, 0xc0, 0x2c, 0x02, 0xc0,
-  0x88, 0x68, 0x86, 0x88, 0x68, 0x86,
-  0x20, 0x62, 0x06, 0x20, 0x62, 0x06,
-  0x80, 0x38, 0x03, 0x80, 0x38, 0x03,
-  0x42, 0x44, 0x24, 0x42, 0x44, 0x24,
-  0x01, 0x90, 0x19, 0x01, 0x90, 0x19,
-  0x14, 0x11, 0x41, 0x14, 0x11, 0x41,
-  0x0a, 0x80, 0xa8, 0x0a, 0x80, 0xa8,
-  0x38, 0x03, 0x80, 0x38, 0x03, 0x80,
-  0xc5, 0x0c, 0x50, 0xc5, 0x0c, 0x50,
-  0x20, 0x62, 0x06, 0x20, 0x62, 0x06,
-  0x80, 0x38, 0x03, 0x80, 0x38, 0x03,
-  0x42, 0x44, 0x24, 0x42, 0x44, 0x24,
-  0x01, 0x90, 0x19, 0x01, 0x90, 0x19,
-  0x14, 0x11, 0x41, 0x14, 0x11, 0x41,
-  0x0a, 0x80, 0xa8, 0x0a, 0x80, 0xa8,
-  0x38, 0x03, 0x80, 0x38, 0x03, 0x80,
-  0xc5, 0x0c, 0x50, 0xc5, 0x0c, 0x50,
-  0x53, 0x65, 0x36, 0x53, 0x65, 0x36,
-  0x21, 0x32, 0x13, 0x21, 0x32, 0x13,
-  0x90, 0x99, 0x09, 0x90, 0x99, 0x09,
-  0x02, 0x50, 0x25, 0x02, 0x50, 0x25,
-  0x06, 0xa0, 0x6a, 0x06, 0xa0, 0x6a,
-  0x2c, 0x02, 0xc0, 0x2c, 0x02, 0xc0,
-  0x88, 0x68, 0x86, 0x88, 0x68, 0x86,
-  0xff, 0x6e, 0x0a, 0xff, 0x6e, 0x0a
-};
-
-const uint8_t kMaskRandom48_32[192] = {
-  0x20, 0x62, 0x06, 0x20, 0x62, 0x06,
-  0x80, 0x38, 0x03, 0x80, 0x38, 0x03,
-  0x42, 0x44, 0x24, 0x42, 0x44, 0x24,
-  0x01, 0x90, 0x19, 0x01, 0x90, 0x19,
-  0x14, 0x11, 0x41, 0x14, 0x11, 0x41,
-  0x0a, 0x80, 0xa8, 0x0a, 0x80, 0xa8,
-  0x38, 0x03, 0x80, 0x38, 0x03, 0x80,
-  0xc5, 0x0c, 0x50, 0xc5, 0x0c, 0x50,
-  0x53, 0x65, 0x36, 0x53, 0x65, 0x36,
-  0x21, 0x32, 0x13, 0x21, 0x32, 0x13,
-  0x90, 0x99, 0x09, 0x90, 0x99, 0x09,
-  0x02, 0x50, 0x25, 0x02, 0x50, 0x25,
-  0x06, 0xa0, 0x6a, 0x06, 0xa0, 0x6a,
-  0x2c, 0x02, 0xc0, 0x2c, 0x02, 0xc0,
-  0x88, 0x68, 0x86, 0x88, 0x68, 0x86,
-  0xff, 0x6e, 0x0a, 0xff, 0x6e, 0x0a,
-  0x53, 0x65, 0x36, 0x53, 0x65, 0x36,
-  0x21, 0x32, 0x13, 0x21, 0x32, 0x13,
-  0x90, 0x99, 0x09, 0x90, 0x99, 0x09,
-  0x02, 0x50, 0x25, 0x02, 0x50, 0x25,
-  0x06, 0xa0, 0x6a, 0x06, 0xa0, 0x6a,
-  0x2c, 0x02, 0xc0, 0x2c, 0x02, 0xc0,
-  0x88, 0x68, 0x86, 0x88, 0x68, 0x86,
-  0x20, 0x62, 0x06, 0x20, 0x62, 0x06,
-  0x80, 0x38, 0x03, 0x80, 0x38, 0x03,
-  0x42, 0x44, 0x24, 0x42, 0x44, 0x24,
-  0x01, 0x90, 0x19, 0x01, 0x90, 0x19,
-  0x14, 0x11, 0x41, 0x14, 0x11, 0x41,
-  0x0a, 0x80, 0xa8, 0x0a, 0x80, 0xa8,
-  0x38, 0x03, 0x80, 0x38, 0x03, 0x80,
-  0xc5, 0x0c, 0x50, 0xc5, 0x0c, 0x50,
-  0xd5, 0x4a, 0x4f, 0x48, 0xb5, 0x31
-};
-
-const uint8_t kMaskRandom48_33[198] = {
-  0x20, 0x62, 0x06, 0x20, 0x62, 0x06,
-  0x80, 0x38, 0x03, 0x80, 0x38, 0x03,
-  0x42, 0x44, 0x24, 0x42, 0x44, 0x24,
-  0x01, 0x90, 0x19, 0x01, 0x90, 0x19,
-  0x14, 0x11, 0x41, 0x14, 0x11, 0x41,
-  0x0a, 0x80, 0xa8, 0x0a, 0x80, 0xa8,
-  0x38, 0x03, 0x80, 0x38, 0x03, 0x80,
-  0xc5, 0x0c, 0x50, 0xc5, 0x0c, 0x50,
-  0x53, 0x65, 0x36, 0x53, 0x65, 0x36,
-  0x21, 0x32, 0x13, 0x21, 0x32, 0x13,
-  0x90, 0x99, 0x09, 0x90, 0x99, 0x09,
-  0x02, 0x50, 0x25, 0x02, 0x50, 0x25,
-  0x06, 0xa0, 0x6a, 0x06, 0xa0, 0x6a,
-  0x2c, 0x02, 0xc0, 0x2c, 0x02, 0xc0,
-  0x88, 0x68, 0x86, 0x88, 0x68, 0x86,
-  0xff, 0x6e, 0x0a, 0xff, 0x6e, 0x0a,
-  0x20, 0x62, 0x06, 0x20, 0x62, 0x06,
-  0x80, 0x38, 0x03, 0x80, 0x38, 0x03,
-  0x42, 0x44, 0x24, 0x42, 0x44, 0x24,
-  0x01, 0x90, 0x19, 0x01, 0x90, 0x19,
-  0x14, 0x11, 0x41, 0x14, 0x11, 0x41,
-  0x0a, 0x80, 0xa8, 0x0a, 0x80, 0xa8,
-  0x38, 0x03, 0x80, 0x38, 0x03, 0x80,
-  0xc5, 0x0c, 0x50, 0xc5, 0x0c, 0x50,
-  0x53, 0x65, 0x36, 0x53, 0x65, 0x36,
-  0xe4, 0x2e, 0x42, 0xe4, 0x2e, 0x42,
-  0x24, 0x42, 0x44, 0x24, 0x42, 0x44,
-  0xa1, 0x1a, 0x11, 0xa1, 0x1a, 0x11,
-  0x18, 0x31, 0x83, 0x18, 0x31, 0x83,
-  0x03, 0x90, 0x39, 0x03, 0x90, 0x39,
-  0x8a, 0x18, 0xa1, 0x8a, 0x18, 0xa1,
-  0x04, 0x90, 0x49, 0x04, 0x90, 0x49,
-  0x00, 0xe0, 0x0e, 0x00, 0xe0, 0x0e
-};
-
-const uint8_t kMaskRandom48_34[204] = {
-  0x20, 0x62, 0x06, 0x20, 0x62, 0x06,
-  0x80, 0x38, 0x03, 0x80, 0x38, 0x03,
-  0x42, 0x44, 0x24, 0x42, 0x44, 0x24,
-  0x01, 0x90, 0x19, 0x01, 0x90, 0x19,
-  0x14, 0x11, 0x41, 0x14, 0x11, 0x41,
-  0x0a, 0x80, 0xa8, 0x0a, 0x80, 0xa8,
-  0x38, 0x03, 0x80, 0x38, 0x03, 0x80,
-  0xc5, 0x0c, 0x50, 0xc5, 0x0c, 0x50,
-  0x53, 0x65, 0x36, 0x53, 0x65, 0x36,
-  0xe4, 0x2e, 0x42, 0xe4, 0x2e, 0x42,
-  0x24, 0x42, 0x44, 0x24, 0x42, 0x44,
-  0xa1, 0x1a, 0x11, 0xa1, 0x1a, 0x11,
-  0x18, 0x31, 0x83, 0x18, 0x31, 0x83,
-  0x03, 0x90, 0x39, 0x03, 0x90, 0x39,
-  0x8a, 0x18, 0xa1, 0x8a, 0x18, 0xa1,
-  0x04, 0x90, 0x49, 0x04, 0x90, 0x49,
-  0x00, 0xe0, 0x0e, 0x00, 0xe0, 0x0e,
-  0x20, 0x62, 0x06, 0x20, 0x62, 0x06,
-  0x80, 0x38, 0x03, 0x80, 0x38, 0x03,
-  0x42, 0x44, 0x24, 0x42, 0x44, 0x24,
-  0x01, 0x90, 0x19, 0x01, 0x90, 0x19,
-  0x14, 0x11, 0x41, 0x14, 0x11, 0x41,
-  0x0a, 0x80, 0xa8, 0x0a, 0x80, 0xa8,
-  0x38, 0x03, 0x80, 0x38, 0x03, 0x80,
-  0xc5, 0x0c, 0x50, 0xc5, 0x0c, 0x50,
-  0x53, 0x65, 0x36, 0x53, 0x65, 0x36,
-  0x21, 0x32, 0x13, 0x21, 0x32, 0x13,
-  0x90, 0x99, 0x09, 0x90, 0x99, 0x09,
-  0x02, 0x50, 0x25, 0x02, 0x50, 0x25,
-  0x06, 0xa0, 0x6a, 0x06, 0xa0, 0x6a,
-  0x2c, 0x02, 0xc0, 0x2c, 0x02, 0xc0,
-  0x88, 0x68, 0x86, 0x88, 0x68, 0x86,
-  0xff, 0x6e, 0x0a, 0xff, 0x6e, 0x0a,
-  0x40, 0x72, 0x4c, 0xe8, 0xf2, 0x42
-};
-
-const uint8_t kMaskRandom48_35[210] = {
-  0x20, 0x62, 0x06, 0x20, 0x62, 0x06,
-  0x80, 0x38, 0x03, 0x80, 0x38, 0x03,
-  0x42, 0x44, 0x24, 0x42, 0x44, 0x24,
-  0x01, 0x90, 0x19, 0x01, 0x90, 0x19,
-  0x14, 0x11, 0x41, 0x14, 0x11, 0x41,
-  0x0a, 0x80, 0xa8, 0x0a, 0x80, 0xa8,
-  0x38, 0x03, 0x80, 0x38, 0x03, 0x80,
-  0xc5, 0x0c, 0x50, 0xc5, 0x0c, 0x50,
-  0x53, 0x65, 0x36, 0x53, 0x65, 0x36,
-  0xe4, 0x2e, 0x42, 0xe4, 0x2e, 0x42,
-  0x24, 0x42, 0x44, 0x24, 0x42, 0x44,
-  0xa1, 0x1a, 0x11, 0xa1, 0x1a, 0x11,
-  0x18, 0x31, 0x83, 0x18, 0x31, 0x83,
-  0x03, 0x90, 0x39, 0x03, 0x90, 0x39,
-  0x8a, 0x18, 0xa1, 0x8a, 0x18, 0xa1,
-  0x04, 0x90, 0x49, 0x04, 0x90, 0x49,
-  0x00, 0xe0, 0x0e, 0x00, 0xe0, 0x0e,
-  0x53, 0x65, 0x36, 0x53, 0x65, 0x36,
-  0xe4, 0x2e, 0x42, 0xe4, 0x2e, 0x42,
-  0x24, 0x42, 0x44, 0x24, 0x42, 0x44,
-  0xa1, 0x1a, 0x11, 0xa1, 0x1a, 0x11,
-  0x18, 0x31, 0x83, 0x18, 0x31, 0x83,
-  0x03, 0x90, 0x39, 0x03, 0x90, 0x39,
-  0x8a, 0x18, 0xa1, 0x8a, 0x18, 0xa1,
-  0x04, 0x90, 0x49, 0x04, 0x90, 0x49,
-  0x00, 0xe0, 0x0e, 0x00, 0xe0, 0x0e,
-  0x20, 0x62, 0x06, 0x20, 0x62, 0x06,
-  0x80, 0x38, 0x03, 0x80, 0x38, 0x03,
-  0x42, 0x44, 0x24, 0x42, 0x44, 0x24,
-  0x01, 0x90, 0x19, 0x01, 0x90, 0x19,
-  0x14, 0x11, 0x41, 0x14, 0x11, 0x41,
-  0x0a, 0x80, 0xa8, 0x0a, 0x80, 0xa8,
-  0x38, 0x03, 0x80, 0x38, 0x03, 0x80,
-  0xc5, 0x0c, 0x50, 0xc5, 0x0c, 0x50,
-  0x34, 0x50, 0xae, 0x34, 0x50, 0xae
-};
-
-const uint8_t kMaskRandom48_36[216] = {
-  0x53, 0x65, 0x36, 0x53, 0x65, 0x36,
-  0xe4, 0x2e, 0x42, 0xe4, 0x2e, 0x42,
-  0x24, 0x42, 0x44, 0x24, 0x42, 0x44,
-  0xa1, 0x1a, 0x11, 0xa1, 0x1a, 0x11,
-  0x18, 0x31, 0x83, 0x18, 0x31, 0x83,
-  0x03, 0x90, 0x39, 0x03, 0x90, 0x39,
-  0x8a, 0x18, 0xa1, 0x8a, 0x18, 0xa1,
-  0x04, 0x90, 0x49, 0x04, 0x90, 0x49,
-  0x00, 0xe0, 0x0e, 0x00, 0xe0, 0x0e,
-  0x20, 0x62, 0x06, 0x20, 0x62, 0x06,
-  0x80, 0x38, 0x03, 0x80, 0x38, 0x03,
-  0x42, 0x44, 0x24, 0x42, 0x44, 0x24,
-  0x01, 0x90, 0x19, 0x01, 0x90, 0x19,
-  0x14, 0x11, 0x41, 0x14, 0x11, 0x41,
-  0x0a, 0x80, 0xa8, 0x0a, 0x80, 0xa8,
-  0x38, 0x03, 0x80, 0x38, 0x03, 0x80,
-  0xc5, 0x0c, 0x50, 0xc5, 0x0c, 0x50,
-  0x34, 0x50, 0xae, 0x34, 0x50, 0xae,
-  0x20, 0x62, 0x06, 0x20, 0x62, 0x06,
-  0x80, 0x38, 0x03, 0x80, 0x38, 0x03,
-  0x42, 0x44, 0x24, 0x42, 0x44, 0x24,
-  0x01, 0x90, 0x19, 0x01, 0x90, 0x19,
-  0x14, 0x11, 0x41, 0x14, 0x11, 0x41,
-  0x0a, 0x80, 0xa8, 0x0a, 0x80, 0xa8,
-  0x38, 0x03, 0x80, 0x38, 0x03, 0x80,
-  0xc5, 0x0c, 0x50, 0xc5, 0x0c, 0x50,
-  0x53, 0x65, 0x36, 0x53, 0x65, 0x36,
-  0xe4, 0x2e, 0x42, 0xe4, 0x2e, 0x42,
-  0x24, 0x42, 0x44, 0x24, 0x42, 0x44,
-  0xa1, 0x1a, 0x11, 0xa1, 0x1a, 0x11,
-  0x18, 0x31, 0x83, 0x18, 0x31, 0x83,
-  0x03, 0x90, 0x39, 0x03, 0x90, 0x39,
-  0x8a, 0x18, 0xa1, 0x8a, 0x18, 0xa1,
-  0x04, 0x90, 0x49, 0x04, 0x90, 0x49,
-  0x00, 0xe0, 0x0e, 0x00, 0xe0, 0x0e,
-  0x71, 0xba, 0x8b, 0xf3, 0xfa, 0x9d
-};
-
-const uint8_t kMaskRandom48_37[222] = {
-  0x53, 0x65, 0x36, 0x53, 0x65, 0x36,
-  0xe4, 0x2e, 0x42, 0xe4, 0x2e, 0x42,
-  0x24, 0x42, 0x44, 0x24, 0x42, 0x44,
-  0xa1, 0x1a, 0x11, 0xa1, 0x1a, 0x11,
-  0x18, 0x31, 0x83, 0x18, 0x31, 0x83,
-  0x03, 0x90, 0x39, 0x03, 0x90, 0x39,
-  0x8a, 0x18, 0xa1, 0x8a, 0x18, 0xa1,
-  0x04, 0x90, 0x49, 0x04, 0x90, 0x49,
-  0x00, 0xe0, 0x0e, 0x00, 0xe0, 0x0e,
-  0x20, 0x62, 0x06, 0x20, 0x62, 0x06,
-  0x80, 0x38, 0x03, 0x80, 0x38, 0x03,
-  0x42, 0x44, 0x24, 0x42, 0x44, 0x24,
-  0x01, 0x90, 0x19, 0x01, 0x90, 0x19,
-  0x14, 0x11, 0x41, 0x14, 0x11, 0x41,
-  0x0a, 0x80, 0xa8, 0x0a, 0x80, 0xa8,
-  0x38, 0x03, 0x80, 0x38, 0x03, 0x80,
-  0xc5, 0x0c, 0x50, 0xc5, 0x0c, 0x50,
-  0x34, 0x50, 0xae, 0x34, 0x50, 0xae,
-  0x53, 0x65, 0x36, 0x53, 0x65, 0x36,
-  0xe4, 0x2e, 0x42, 0xe4, 0x2e, 0x42,
-  0x24, 0x42, 0x44, 0x24, 0x42, 0x44,
-  0xa1, 0x1a, 0x11, 0xa1, 0x1a, 0x11,
-  0x18, 0x31, 0x83, 0x18, 0x31, 0x83,
-  0x03, 0x90, 0x39, 0x03, 0x90, 0x39,
-  0x8a, 0x18, 0xa1, 0x8a, 0x18, 0xa1,
-  0x04, 0x90, 0x49, 0x04, 0x90, 0x49,
-  0x00, 0xe0, 0x0e, 0x00, 0xe0, 0x0e,
-  0x51, 0x45, 0x14, 0x51, 0x45, 0x14,
-  0x45, 0x14, 0x51, 0x45, 0x14, 0x51,
-  0x80, 0xd8, 0x0d, 0x80, 0xd8, 0x0d,
-  0x24, 0x22, 0x42, 0x24, 0x22, 0x42,
-  0x0a, 0x20, 0xa2, 0x0a, 0x20, 0xa2,
-  0x00, 0xe0, 0x0e, 0x00, 0xe0, 0x0e,
-  0xb8, 0x0b, 0x80, 0xb8, 0x0b, 0x80,
-  0x09, 0x10, 0x91, 0x09, 0x10, 0x91,
-  0x56, 0x05, 0x60, 0x56, 0x05, 0x60,
-  0xa2, 0x8a, 0x28, 0xa2, 0x8a, 0x28
-};
-
-const uint8_t kMaskRandom48_38[228] = {
-  0x53, 0x65, 0x36, 0x53, 0x65, 0x36,
-  0xe4, 0x2e, 0x42, 0xe4, 0x2e, 0x42,
-  0x24, 0x42, 0x44, 0x24, 0x42, 0x44,
-  0xa1, 0x1a, 0x11, 0xa1, 0x1a, 0x11,
-  0x18, 0x31, 0x83, 0x18, 0x31, 0x83,
-  0x03, 0x90, 0x39, 0x03, 0x90, 0x39,
-  0x8a, 0x18, 0xa1, 0x8a, 0x18, 0xa1,
-  0x04, 0x90, 0x49, 0x04, 0x90, 0x49,
-  0x00, 0xe0, 0x0e, 0x00, 0xe0, 0x0e,
-  0x51, 0x45, 0x14, 0x51, 0x45, 0x14,
-  0x45, 0x14, 0x51, 0x45, 0x14, 0x51,
-  0x80, 0xd8, 0x0d, 0x80, 0xd8, 0x0d,
-  0x24, 0x22, 0x42, 0x24, 0x22, 0x42,
-  0x0a, 0x20, 0xa2, 0x0a, 0x20, 0xa2,
-  0x00, 0xe0, 0x0e, 0x00, 0xe0, 0x0e,
-  0xb8, 0x0b, 0x80, 0xb8, 0x0b, 0x80,
-  0x09, 0x10, 0x91, 0x09, 0x10, 0x91,
-  0x56, 0x05, 0x60, 0x56, 0x05, 0x60,
-  0xa2, 0x8a, 0x28, 0xa2, 0x8a, 0x28,
-  0x53, 0x65, 0x36, 0x53, 0x65, 0x36,
-  0xe4, 0x2e, 0x42, 0xe4, 0x2e, 0x42,
-  0x24, 0x42, 0x44, 0x24, 0x42, 0x44,
-  0xa1, 0x1a, 0x11, 0xa1, 0x1a, 0x11,
-  0x18, 0x31, 0x83, 0x18, 0x31, 0x83,
-  0x03, 0x90, 0x39, 0x03, 0x90, 0x39,
-  0x8a, 0x18, 0xa1, 0x8a, 0x18, 0xa1,
-  0x04, 0x90, 0x49, 0x04, 0x90, 0x49,
-  0x00, 0xe0, 0x0e, 0x00, 0xe0, 0x0e,
-  0x20, 0x62, 0x06, 0x20, 0x62, 0x06,
-  0x80, 0x38, 0x03, 0x80, 0x38, 0x03,
-  0x42, 0x44, 0x24, 0x42, 0x44, 0x24,
-  0x01, 0x90, 0x19, 0x01, 0x90, 0x19,
-  0x14, 0x11, 0x41, 0x14, 0x11, 0x41,
-  0x0a, 0x80, 0xa8, 0x0a, 0x80, 0xa8,
-  0x38, 0x03, 0x80, 0x38, 0x03, 0x80,
-  0xc5, 0x0c, 0x50, 0xc5, 0x0c, 0x50,
-  0x34, 0x50, 0xae, 0x34, 0x50, 0xae,
-  0x2a, 0x7a, 0xf6, 0x8c, 0xde, 0x51
-};
-
-const uint8_t kMaskRandom48_39[234] = {
-  0x53, 0x65, 0x36, 0x53, 0x65, 0x36,
-  0xe4, 0x2e, 0x42, 0xe4, 0x2e, 0x42,
-  0x24, 0x42, 0x44, 0x24, 0x42, 0x44,
-  0xa1, 0x1a, 0x11, 0xa1, 0x1a, 0x11,
-  0x18, 0x31, 0x83, 0x18, 0x31, 0x83,
-  0x03, 0x90, 0x39, 0x03, 0x90, 0x39,
-  0x8a, 0x18, 0xa1, 0x8a, 0x18, 0xa1,
-  0x04, 0x90, 0x49, 0x04, 0x90, 0x49,
-  0x00, 0xe0, 0x0e, 0x00, 0xe0, 0x0e,
-  0x51, 0x45, 0x14, 0x51, 0x45, 0x14,
-  0x45, 0x14, 0x51, 0x45, 0x14, 0x51,
-  0x80, 0xd8, 0x0d, 0x80, 0xd8, 0x0d,
-  0x24, 0x22, 0x42, 0x24, 0x22, 0x42,
-  0x0a, 0x20, 0xa2, 0x0a, 0x20, 0xa2,
-  0x00, 0xe0, 0x0e, 0x00, 0xe0, 0x0e,
-  0xb8, 0x0b, 0x80, 0xb8, 0x0b, 0x80,
-  0x09, 0x10, 0x91, 0x09, 0x10, 0x91,
-  0x56, 0x05, 0x60, 0x56, 0x05, 0x60,
-  0xa2, 0x8a, 0x28, 0xa2, 0x8a, 0x28,
-  0x51, 0x45, 0x14, 0x51, 0x45, 0x14,
-  0x45, 0x14, 0x51, 0x45, 0x14, 0x51,
-  0x80, 0xd8, 0x0d, 0x80, 0xd8, 0x0d,
-  0x24, 0x22, 0x42, 0x24, 0x22, 0x42,
-  0x0a, 0x20, 0xa2, 0x0a, 0x20, 0xa2,
-  0x00, 0xe0, 0x0e, 0x00, 0xe0, 0x0e,
-  0xb8, 0x0b, 0x80, 0xb8, 0x0b, 0x80,
-  0x09, 0x10, 0x91, 0x09, 0x10, 0x91,
-  0x56, 0x05, 0x60, 0x56, 0x05, 0x60,
-  0xa2, 0x8a, 0x28, 0xa2, 0x8a, 0x28,
-  0x53, 0x65, 0x36, 0x53, 0x65, 0x36,
-  0xe4, 0x2e, 0x42, 0xe4, 0x2e, 0x42,
-  0x24, 0x42, 0x44, 0x24, 0x42, 0x44,
-  0xa1, 0x1a, 0x11, 0xa1, 0x1a, 0x11,
-  0x18, 0x31, 0x83, 0x18, 0x31, 0x83,
-  0x03, 0x90, 0x39, 0x03, 0x90, 0x39,
-  0x8a, 0x18, 0xa1, 0x8a, 0x18, 0xa1,
-  0x04, 0x90, 0x49, 0x04, 0x90, 0x49,
-  0x00, 0xe0, 0x0e, 0x00, 0xe0, 0x0e,
-  0x98, 0xa2, 0x95, 0x98, 0xa2, 0x95
-};
-
-const uint8_t kMaskRandom48_4[24] = {
-  0x8b, 0x28, 0xb2, 0x8b, 0x28, 0xb2,
-  0x14, 0xb1, 0x4b, 0x14, 0xb1, 0x4b,
-  0x22, 0xd2, 0x2d, 0x22, 0xd2, 0x2d,
-  0x45, 0x54, 0x55, 0x45, 0x54, 0x55
-};
-
-const uint8_t kMaskRandom48_40[240] = {
-  0x51, 0x45, 0x14, 0x51, 0x45, 0x14,
-  0x45, 0x14, 0x51, 0x45, 0x14, 0x51,
-  0x80, 0xd8, 0x0d, 0x80, 0xd8, 0x0d,
-  0x24, 0x22, 0x42, 0x24, 0x22, 0x42,
-  0x0a, 0x20, 0xa2, 0x0a, 0x20, 0xa2,
-  0x00, 0xe0, 0x0e, 0x00, 0xe0, 0x0e,
-  0xb8, 0x0b, 0x80, 0xb8, 0x0b, 0x80,
-  0x09, 0x10, 0x91, 0x09, 0x10, 0x91,
-  0x56, 0x05, 0x60, 0x56, 0x05, 0x60,
-  0xa2, 0x8a, 0x28, 0xa2, 0x8a, 0x28,
-  0x53, 0x65, 0x36, 0x53, 0x65, 0x36,
-  0xe4, 0x2e, 0x42, 0xe4, 0x2e, 0x42,
-  0x24, 0x42, 0x44, 0x24, 0x42, 0x44,
-  0xa1, 0x1a, 0x11, 0xa1, 0x1a, 0x11,
-  0x18, 0x31, 0x83, 0x18, 0x31, 0x83,
-  0x03, 0x90, 0x39, 0x03, 0x90, 0x39,
-  0x8a, 0x18, 0xa1, 0x8a, 0x18, 0xa1,
-  0x04, 0x90, 0x49, 0x04, 0x90, 0x49,
-  0x00, 0xe0, 0x0e, 0x00, 0xe0, 0x0e,
-  0x98, 0xa2, 0x95, 0x98, 0xa2, 0x95,
-  0x53, 0x65, 0x36, 0x53, 0x65, 0x36,
-  0xe4, 0x2e, 0x42, 0xe4, 0x2e, 0x42,
-  0x24, 0x42, 0x44, 0x24, 0x42, 0x44,
-  0xa1, 0x1a, 0x11, 0xa1, 0x1a, 0x11,
-  0x18, 0x31, 0x83, 0x18, 0x31, 0x83,
-  0x03, 0x90, 0x39, 0x03, 0x90, 0x39,
-  0x8a, 0x18, 0xa1, 0x8a, 0x18, 0xa1,
-  0x04, 0x90, 0x49, 0x04, 0x90, 0x49,
-  0x00, 0xe0, 0x0e, 0x00, 0xe0, 0x0e,
-  0x51, 0x45, 0x14, 0x51, 0x45, 0x14,
-  0x45, 0x14, 0x51, 0x45, 0x14, 0x51,
-  0x80, 0xd8, 0x0d, 0x80, 0xd8, 0x0d,
-  0x24, 0x22, 0x42, 0x24, 0x22, 0x42,
-  0x0a, 0x20, 0xa2, 0x0a, 0x20, 0xa2,
-  0x00, 0xe0, 0x0e, 0x00, 0xe0, 0x0e,
-  0xb8, 0x0b, 0x80, 0xb8, 0x0b, 0x80,
-  0x09, 0x10, 0x91, 0x09, 0x10, 0x91,
-  0x56, 0x05, 0x60, 0x56, 0x05, 0x60,
-  0xa2, 0x8a, 0x28, 0xa2, 0x8a, 0x28,
-  0x20, 0x5f, 0x68, 0xd5, 0xa2, 0x1b
-};
-
-const uint8_t kMaskRandom48_41[246] = {
-  0x51, 0x45, 0x14, 0x51, 0x45, 0x14,
-  0x45, 0x14, 0x51, 0x45, 0x14, 0x51,
-  0x80, 0xd8, 0x0d, 0x80, 0xd8, 0x0d,
-  0x24, 0x22, 0x42, 0x24, 0x22, 0x42,
-  0x0a, 0x20, 0xa2, 0x0a, 0x20, 0xa2,
-  0x00, 0xe0, 0x0e, 0x00, 0xe0, 0x0e,
-  0xb8, 0x0b, 0x80, 0xb8, 0x0b, 0x80,
-  0x09, 0x10, 0x91, 0x09, 0x10, 0x91,
-  0x56, 0x05, 0x60, 0x56, 0x05, 0x60,
-  0xa2, 0x8a, 0x28, 0xa2, 0x8a, 0x28,
-  0x53, 0x65, 0x36, 0x53, 0x65, 0x36,
-  0xe4, 0x2e, 0x42, 0xe4, 0x2e, 0x42,
-  0x24, 0x42, 0x44, 0x24, 0x42, 0x44,
-  0xa1, 0x1a, 0x11, 0xa1, 0x1a, 0x11,
-  0x18, 0x31, 0x83, 0x18, 0x31, 0x83,
-  0x03, 0x90, 0x39, 0x03, 0x90, 0x39,
-  0x8a, 0x18, 0xa1, 0x8a, 0x18, 0xa1,
-  0x04, 0x90, 0x49, 0x04, 0x90, 0x49,
-  0x00, 0xe0, 0x0e, 0x00, 0xe0, 0x0e,
-  0x98, 0xa2, 0x95, 0x98, 0xa2, 0x95,
-  0x51, 0x45, 0x14, 0x51, 0x45, 0x14,
-  0x45, 0x14, 0x51, 0x45, 0x14, 0x51,
-  0x80, 0xd8, 0x0d, 0x80, 0xd8, 0x0d,
-  0x24, 0x22, 0x42, 0x24, 0x22, 0x42,
-  0x0a, 0x20, 0xa2, 0x0a, 0x20, 0xa2,
-  0x00, 0xe0, 0x0e, 0x00, 0xe0, 0x0e,
-  0xb8, 0x0b, 0x80, 0xb8, 0x0b, 0x80,
-  0x09, 0x10, 0x91, 0x09, 0x10, 0x91,
-  0x56, 0x05, 0x60, 0x56, 0x05, 0x60,
-  0xa2, 0x8a, 0x28, 0xa2, 0x8a, 0x28,
-  0x53, 0x65, 0x36, 0x53, 0x65, 0x36,
-  0x21, 0x32, 0x13, 0x21, 0x32, 0x13,
-  0x10, 0x91, 0x09, 0x10, 0x91, 0x09,
-  0x00, 0x70, 0x07, 0x00, 0x70, 0x07,
-  0x0c, 0x10, 0xc1, 0x0c, 0x10, 0xc1,
-  0x40, 0xc4, 0x0c, 0x40, 0xc4, 0x0c,
-  0x6a, 0x06, 0xa0, 0x6a, 0x06, 0xa0,
-  0x86, 0x08, 0x60, 0x86, 0x08, 0x60,
-  0x24, 0x82, 0x48, 0x24, 0x82, 0x48,
-  0x89, 0x08, 0x90, 0x89, 0x08, 0x90,
-  0xc0, 0x2c, 0x02, 0xc0, 0x2c, 0x02
-};
-
-const uint8_t kMaskRandom48_42[252] = {
-  0x51, 0x45, 0x14, 0x51, 0x45, 0x14,
-  0x45, 0x14, 0x51, 0x45, 0x14, 0x51,
-  0x80, 0xd8, 0x0d, 0x80, 0xd8, 0x0d,
-  0x24, 0x22, 0x42, 0x24, 0x22, 0x42,
-  0x0a, 0x20, 0xa2, 0x0a, 0x20, 0xa2,
-  0x00, 0xe0, 0x0e, 0x00, 0xe0, 0x0e,
-  0xb8, 0x0b, 0x80, 0xb8, 0x0b, 0x80,
-  0x09, 0x10, 0x91, 0x09, 0x10, 0x91,
-  0x56, 0x05, 0x60, 0x56, 0x05, 0x60,
-  0xa2, 0x8a, 0x28, 0xa2, 0x8a, 0x28,
-  0x53, 0x65, 0x36, 0x53, 0x65, 0x36,
-  0x21, 0x32, 0x13, 0x21, 0x32, 0x13,
-  0x10, 0x91, 0x09, 0x10, 0x91, 0x09,
-  0x00, 0x70, 0x07, 0x00, 0x70, 0x07,
-  0x0c, 0x10, 0xc1, 0x0c, 0x10, 0xc1,
-  0x40, 0xc4, 0x0c, 0x40, 0xc4, 0x0c,
-  0x6a, 0x06, 0xa0, 0x6a, 0x06, 0xa0,
-  0x86, 0x08, 0x60, 0x86, 0x08, 0x60,
-  0x24, 0x82, 0x48, 0x24, 0x82, 0x48,
-  0x89, 0x08, 0x90, 0x89, 0x08, 0x90,
-  0xc0, 0x2c, 0x02, 0xc0, 0x2c, 0x02,
-  0x51, 0x45, 0x14, 0x51, 0x45, 0x14,
-  0x45, 0x14, 0x51, 0x45, 0x14, 0x51,
-  0x80, 0xd8, 0x0d, 0x80, 0xd8, 0x0d,
-  0x24, 0x22, 0x42, 0x24, 0x22, 0x42,
-  0x0a, 0x20, 0xa2, 0x0a, 0x20, 0xa2,
-  0x00, 0xe0, 0x0e, 0x00, 0xe0, 0x0e,
-  0xb8, 0x0b, 0x80, 0xb8, 0x0b, 0x80,
-  0x09, 0x10, 0x91, 0x09, 0x10, 0x91,
-  0x56, 0x05, 0x60, 0x56, 0x05, 0x60,
-  0xa2, 0x8a, 0x28, 0xa2, 0x8a, 0x28,
-  0x53, 0x65, 0x36, 0x53, 0x65, 0x36,
-  0xe4, 0x2e, 0x42, 0xe4, 0x2e, 0x42,
-  0x24, 0x42, 0x44, 0x24, 0x42, 0x44,
-  0xa1, 0x1a, 0x11, 0xa1, 0x1a, 0x11,
-  0x18, 0x31, 0x83, 0x18, 0x31, 0x83,
-  0x03, 0x90, 0x39, 0x03, 0x90, 0x39,
-  0x8a, 0x18, 0xa1, 0x8a, 0x18, 0xa1,
-  0x04, 0x90, 0x49, 0x04, 0x90, 0x49,
-  0x00, 0xe0, 0x0e, 0x00, 0xe0, 0x0e,
-  0x98, 0xa2, 0x95, 0x98, 0xa2, 0x95,
-  0x66, 0xcf, 0xa3, 0x47, 0x69, 0x00
-};
-
-const uint8_t kMaskRandom48_43[258] = {
-  0x51, 0x45, 0x14, 0x51, 0x45, 0x14,
-  0x45, 0x14, 0x51, 0x45, 0x14, 0x51,
-  0x80, 0xd8, 0x0d, 0x80, 0xd8, 0x0d,
-  0x24, 0x22, 0x42, 0x24, 0x22, 0x42,
-  0x0a, 0x20, 0xa2, 0x0a, 0x20, 0xa2,
-  0x00, 0xe0, 0x0e, 0x00, 0xe0, 0x0e,
-  0xb8, 0x0b, 0x80, 0xb8, 0x0b, 0x80,
-  0x09, 0x10, 0x91, 0x09, 0x10, 0x91,
-  0x56, 0x05, 0x60, 0x56, 0x05, 0x60,
-  0xa2, 0x8a, 0x28, 0xa2, 0x8a, 0x28,
-  0x53, 0x65, 0x36, 0x53, 0x65, 0x36,
-  0x21, 0x32, 0x13, 0x21, 0x32, 0x13,
-  0x10, 0x91, 0x09, 0x10, 0x91, 0x09,
-  0x00, 0x70, 0x07, 0x00, 0x70, 0x07,
-  0x0c, 0x10, 0xc1, 0x0c, 0x10, 0xc1,
-  0x40, 0xc4, 0x0c, 0x40, 0xc4, 0x0c,
-  0x6a, 0x06, 0xa0, 0x6a, 0x06, 0xa0,
-  0x86, 0x08, 0x60, 0x86, 0x08, 0x60,
-  0x24, 0x82, 0x48, 0x24, 0x82, 0x48,
-  0x89, 0x08, 0x90, 0x89, 0x08, 0x90,
-  0xc0, 0x2c, 0x02, 0xc0, 0x2c, 0x02,
-  0x53, 0x65, 0x36, 0x53, 0x65, 0x36,
-  0x21, 0x32, 0x13, 0x21, 0x32, 0x13,
-  0x10, 0x91, 0x09, 0x10, 0x91, 0x09,
-  0x00, 0x70, 0x07, 0x00, 0x70, 0x07,
-  0x0c, 0x10, 0xc1, 0x0c, 0x10, 0xc1,
-  0x40, 0xc4, 0x0c, 0x40, 0xc4, 0x0c,
-  0x6a, 0x06, 0xa0, 0x6a, 0x06, 0xa0,
-  0x86, 0x08, 0x60, 0x86, 0x08, 0x60,
-  0x24, 0x82, 0x48, 0x24, 0x82, 0x48,
-  0x89, 0x08, 0x90, 0x89, 0x08, 0x90,
-  0xc0, 0x2c, 0x02, 0xc0, 0x2c, 0x02,
-  0x51, 0x45, 0x14, 0x51, 0x45, 0x14,
-  0x45, 0x14, 0x51, 0x45, 0x14, 0x51,
-  0x80, 0xd8, 0x0d, 0x80, 0xd8, 0x0d,
-  0x24, 0x22, 0x42, 0x24, 0x22, 0x42,
-  0x0a, 0x20, 0xa2, 0x0a, 0x20, 0xa2,
-  0x00, 0xe0, 0x0e, 0x00, 0xe0, 0x0e,
-  0xb8, 0x0b, 0x80, 0xb8, 0x0b, 0x80,
-  0x09, 0x10, 0x91, 0x09, 0x10, 0x91,
-  0x56, 0x05, 0x60, 0x56, 0x05, 0x60,
-  0xa2, 0x8a, 0x28, 0xa2, 0x8a, 0x28,
-  0x1a, 0xaa, 0xee, 0x1a, 0xaa, 0xee
-};
-
-const uint8_t kMaskRandom48_44[264] = {
-  0x53, 0x65, 0x36, 0x53, 0x65, 0x36,
-  0x21, 0x32, 0x13, 0x21, 0x32, 0x13,
-  0x10, 0x91, 0x09, 0x10, 0x91, 0x09,
-  0x00, 0x70, 0x07, 0x00, 0x70, 0x07,
-  0x0c, 0x10, 0xc1, 0x0c, 0x10, 0xc1,
-  0x40, 0xc4, 0x0c, 0x40, 0xc4, 0x0c,
-  0x6a, 0x06, 0xa0, 0x6a, 0x06, 0xa0,
-  0x86, 0x08, 0x60, 0x86, 0x08, 0x60,
-  0x24, 0x82, 0x48, 0x24, 0x82, 0x48,
-  0x89, 0x08, 0x90, 0x89, 0x08, 0x90,
-  0xc0, 0x2c, 0x02, 0xc0, 0x2c, 0x02,
-  0x51, 0x45, 0x14, 0x51, 0x45, 0x14,
-  0x45, 0x14, 0x51, 0x45, 0x14, 0x51,
-  0x80, 0xd8, 0x0d, 0x80, 0xd8, 0x0d,
-  0x24, 0x22, 0x42, 0x24, 0x22, 0x42,
-  0x0a, 0x20, 0xa2, 0x0a, 0x20, 0xa2,
-  0x00, 0xe0, 0x0e, 0x00, 0xe0, 0x0e,
-  0xb8, 0x0b, 0x80, 0xb8, 0x0b, 0x80,
-  0x09, 0x10, 0x91, 0x09, 0x10, 0x91,
-  0x56, 0x05, 0x60, 0x56, 0x05, 0x60,
-  0xa2, 0x8a, 0x28, 0xa2, 0x8a, 0x28,
-  0x1a, 0xaa, 0xee, 0x1a, 0xaa, 0xee,
-  0x51, 0x45, 0x14, 0x51, 0x45, 0x14,
-  0x45, 0x14, 0x51, 0x45, 0x14, 0x51,
-  0x80, 0xd8, 0x0d, 0x80, 0xd8, 0x0d,
-  0x24, 0x22, 0x42, 0x24, 0x22, 0x42,
-  0x0a, 0x20, 0xa2, 0x0a, 0x20, 0xa2,
-  0x00, 0xe0, 0x0e, 0x00, 0xe0, 0x0e,
-  0xb8, 0x0b, 0x80, 0xb8, 0x0b, 0x80,
-  0x09, 0x10, 0x91, 0x09, 0x10, 0x91,
-  0x56, 0x05, 0x60, 0x56, 0x05, 0x60,
-  0xa2, 0x8a, 0x28, 0xa2, 0x8a, 0x28,
-  0x53, 0x65, 0x36, 0x53, 0x65, 0x36,
-  0x21, 0x32, 0x13, 0x21, 0x32, 0x13,
-  0x10, 0x91, 0x09, 0x10, 0x91, 0x09,
-  0x00, 0x70, 0x07, 0x00, 0x70, 0x07,
-  0x0c, 0x10, 0xc1, 0x0c, 0x10, 0xc1,
-  0x40, 0xc4, 0x0c, 0x40, 0xc4, 0x0c,
-  0x6a, 0x06, 0xa0, 0x6a, 0x06, 0xa0,
-  0x86, 0x08, 0x60, 0x86, 0x08, 0x60,
-  0x24, 0x82, 0x48, 0x24, 0x82, 0x48,
-  0x89, 0x08, 0x90, 0x89, 0x08, 0x90,
-  0xc0, 0x2c, 0x02, 0xc0, 0x2c, 0x02,
-  0xc6, 0x40, 0x1f, 0x57, 0xc6, 0xe6
-};
-
-const uint8_t kMaskRandom48_45[270] = {
-  0x53, 0x65, 0x36, 0x53, 0x65, 0x36,
-  0x21, 0x32, 0x13, 0x21, 0x32, 0x13,
-  0x10, 0x91, 0x09, 0x10, 0x91, 0x09,
-  0x00, 0x70, 0x07, 0x00, 0x70, 0x07,
-  0x0c, 0x10, 0xc1, 0x0c, 0x10, 0xc1,
-  0x40, 0xc4, 0x0c, 0x40, 0xc4, 0x0c,
-  0x6a, 0x06, 0xa0, 0x6a, 0x06, 0xa0,
-  0x86, 0x08, 0x60, 0x86, 0x08, 0x60,
-  0x24, 0x82, 0x48, 0x24, 0x82, 0x48,
-  0x89, 0x08, 0x90, 0x89, 0x08, 0x90,
-  0xc0, 0x2c, 0x02, 0xc0, 0x2c, 0x02,
-  0x51, 0x45, 0x14, 0x51, 0x45, 0x14,
-  0x45, 0x14, 0x51, 0x45, 0x14, 0x51,
-  0x80, 0xd8, 0x0d, 0x80, 0xd8, 0x0d,
-  0x24, 0x22, 0x42, 0x24, 0x22, 0x42,
-  0x0a, 0x20, 0xa2, 0x0a, 0x20, 0xa2,
-  0x00, 0xe0, 0x0e, 0x00, 0xe0, 0x0e,
-  0xb8, 0x0b, 0x80, 0xb8, 0x0b, 0x80,
-  0x09, 0x10, 0x91, 0x09, 0x10, 0x91,
-  0x56, 0x05, 0x60, 0x56, 0x05, 0x60,
-  0xa2, 0x8a, 0x28, 0xa2, 0x8a, 0x28,
-  0x1a, 0xaa, 0xee, 0x1a, 0xaa, 0xee,
-  0x53, 0x65, 0x36, 0x53, 0x65, 0x36,
-  0x21, 0x32, 0x13, 0x21, 0x32, 0x13,
-  0x10, 0x91, 0x09, 0x10, 0x91, 0x09,
-  0x00, 0x70, 0x07, 0x00, 0x70, 0x07,
-  0x0c, 0x10, 0xc1, 0x0c, 0x10, 0xc1,
-  0x40, 0xc4, 0x0c, 0x40, 0xc4, 0x0c,
-  0x6a, 0x06, 0xa0, 0x6a, 0x06, 0xa0,
-  0x86, 0x08, 0x60, 0x86, 0x08, 0x60,
-  0x24, 0x82, 0x48, 0x24, 0x82, 0x48,
-  0x89, 0x08, 0x90, 0x89, 0x08, 0x90,
-  0xc0, 0x2c, 0x02, 0xc0, 0x2c, 0x02,
-  0x10, 0x61, 0x06, 0x10, 0x61, 0x06,
-  0x02, 0x30, 0x23, 0x02, 0x30, 0x23,
-  0x40, 0x54, 0x05, 0x40, 0x54, 0x05,
-  0x21, 0x82, 0x18, 0x21, 0x82, 0x18,
-  0x81, 0x18, 0x11, 0x81, 0x18, 0x11,
-  0x14, 0x81, 0x48, 0x14, 0x81, 0x48,
-  0x98, 0x09, 0x80, 0x98, 0x09, 0x80,
-  0x08, 0x90, 0x89, 0x08, 0x90, 0x89,
-  0x62, 0x06, 0x20, 0x62, 0x06, 0x20,
-  0x24, 0x22, 0x42, 0x24, 0x22, 0x42,
-  0x8a, 0x08, 0xa0, 0x8a, 0x08, 0xa0,
-  0x84, 0x48, 0x44, 0x84, 0x48, 0x44
-};
-
-const uint8_t kMaskRandom48_46[276] = {
-  0x53, 0x65, 0x36, 0x53, 0x65, 0x36,
-  0x21, 0x32, 0x13, 0x21, 0x32, 0x13,
-  0x10, 0x91, 0x09, 0x10, 0x91, 0x09,
-  0x00, 0x70, 0x07, 0x00, 0x70, 0x07,
-  0x0c, 0x10, 0xc1, 0x0c, 0x10, 0xc1,
-  0x40, 0xc4, 0x0c, 0x40, 0xc4, 0x0c,
-  0x6a, 0x06, 0xa0, 0x6a, 0x06, 0xa0,
-  0x86, 0x08, 0x60, 0x86, 0x08, 0x60,
-  0x24, 0x82, 0x48, 0x24, 0x82, 0x48,
-  0x89, 0x08, 0x90, 0x89, 0x08, 0x90,
-  0xc0, 0x2c, 0x02, 0xc0, 0x2c, 0x02,
-  0x10, 0x61, 0x06, 0x10, 0x61, 0x06,
-  0x02, 0x30, 0x23, 0x02, 0x30, 0x23,
-  0x40, 0x54, 0x05, 0x40, 0x54, 0x05,
-  0x21, 0x82, 0x18, 0x21, 0x82, 0x18,
-  0x81, 0x18, 0x11, 0x81, 0x18, 0x11,
-  0x14, 0x81, 0x48, 0x14, 0x81, 0x48,
-  0x98, 0x09, 0x80, 0x98, 0x09, 0x80,
-  0x08, 0x90, 0x89, 0x08, 0x90, 0x89,
-  0x62, 0x06, 0x20, 0x62, 0x06, 0x20,
-  0x24, 0x22, 0x42, 0x24, 0x22, 0x42,
-  0x8a, 0x08, 0xa0, 0x8a, 0x08, 0xa0,
-  0x84, 0x48, 0x44, 0x84, 0x48, 0x44,
-  0x53, 0x65, 0x36, 0x53, 0x65, 0x36,
-  0x21, 0x32, 0x13, 0x21, 0x32, 0x13,
-  0x10, 0x91, 0x09, 0x10, 0x91, 0x09,
-  0x00, 0x70, 0x07, 0x00, 0x70, 0x07,
-  0x0c, 0x10, 0xc1, 0x0c, 0x10, 0xc1,
-  0x40, 0xc4, 0x0c, 0x40, 0xc4, 0x0c,
-  0x6a, 0x06, 0xa0, 0x6a, 0x06, 0xa0,
-  0x86, 0x08, 0x60, 0x86, 0x08, 0x60,
-  0x24, 0x82, 0x48, 0x24, 0x82, 0x48,
-  0x89, 0x08, 0x90, 0x89, 0x08, 0x90,
-  0xc0, 0x2c, 0x02, 0xc0, 0x2c, 0x02,
-  0x51, 0x45, 0x14, 0x51, 0x45, 0x14,
-  0x45, 0x14, 0x51, 0x45, 0x14, 0x51,
-  0x80, 0xd8, 0x0d, 0x80, 0xd8, 0x0d,
-  0x24, 0x22, 0x42, 0x24, 0x22, 0x42,
-  0x0a, 0x20, 0xa2, 0x0a, 0x20, 0xa2,
-  0x00, 0xe0, 0x0e, 0x00, 0xe0, 0x0e,
-  0xb8, 0x0b, 0x80, 0xb8, 0x0b, 0x80,
-  0x09, 0x10, 0x91, 0x09, 0x10, 0x91,
-  0x56, 0x05, 0x60, 0x56, 0x05, 0x60,
-  0xa2, 0x8a, 0x28, 0xa2, 0x8a, 0x28,
-  0x1a, 0xaa, 0xee, 0x1a, 0xaa, 0xee,
-  0x10, 0xf9, 0xab, 0x12, 0x14, 0xef
-};
-
-const uint8_t kMaskRandom48_47[282] = {
-  0x53, 0x65, 0x36, 0x53, 0x65, 0x36,
-  0x21, 0x32, 0x13, 0x21, 0x32, 0x13,
-  0x10, 0x91, 0x09, 0x10, 0x91, 0x09,
-  0x00, 0x70, 0x07, 0x00, 0x70, 0x07,
-  0x0c, 0x10, 0xc1, 0x0c, 0x10, 0xc1,
-  0x40, 0xc4, 0x0c, 0x40, 0xc4, 0x0c,
-  0x6a, 0x06, 0xa0, 0x6a, 0x06, 0xa0,
-  0x86, 0x08, 0x60, 0x86, 0x08, 0x60,
-  0x24, 0x82, 0x48, 0x24, 0x82, 0x48,
-  0x89, 0x08, 0x90, 0x89, 0x08, 0x90,
-  0xc0, 0x2c, 0x02, 0xc0, 0x2c, 0x02,
-  0x10, 0x61, 0x06, 0x10, 0x61, 0x06,
-  0x02, 0x30, 0x23, 0x02, 0x30, 0x23,
-  0x40, 0x54, 0x05, 0x40, 0x54, 0x05,
-  0x21, 0x82, 0x18, 0x21, 0x82, 0x18,
-  0x81, 0x18, 0x11, 0x81, 0x18, 0x11,
-  0x14, 0x81, 0x48, 0x14, 0x81, 0x48,
-  0x98, 0x09, 0x80, 0x98, 0x09, 0x80,
-  0x08, 0x90, 0x89, 0x08, 0x90, 0x89,
-  0x62, 0x06, 0x20, 0x62, 0x06, 0x20,
-  0x24, 0x22, 0x42, 0x24, 0x22, 0x42,
-  0x8a, 0x08, 0xa0, 0x8a, 0x08, 0xa0,
-  0x84, 0x48, 0x44, 0x84, 0x48, 0x44,
-  0x10, 0x61, 0x06, 0x10, 0x61, 0x06,
-  0x02, 0x30, 0x23, 0x02, 0x30, 0x23,
-  0x40, 0x54, 0x05, 0x40, 0x54, 0x05,
-  0x21, 0x82, 0x18, 0x21, 0x82, 0x18,
-  0x81, 0x18, 0x11, 0x81, 0x18, 0x11,
-  0x14, 0x81, 0x48, 0x14, 0x81, 0x48,
-  0x98, 0x09, 0x80, 0x98, 0x09, 0x80,
-  0x08, 0x90, 0x89, 0x08, 0x90, 0x89,
-  0x62, 0x06, 0x20, 0x62, 0x06, 0x20,
-  0x24, 0x22, 0x42, 0x24, 0x22, 0x42,
-  0x8a, 0x08, 0xa0, 0x8a, 0x08, 0xa0,
-  0x84, 0x48, 0x44, 0x84, 0x48, 0x44,
-  0x53, 0x65, 0x36, 0x53, 0x65, 0x36,
-  0x21, 0x32, 0x13, 0x21, 0x32, 0x13,
-  0x10, 0x91, 0x09, 0x10, 0x91, 0x09,
-  0x00, 0x70, 0x07, 0x00, 0x70, 0x07,
-  0x0c, 0x10, 0xc1, 0x0c, 0x10, 0xc1,
-  0x40, 0xc4, 0x0c, 0x40, 0xc4, 0x0c,
-  0x6a, 0x06, 0xa0, 0x6a, 0x06, 0xa0,
-  0x86, 0x08, 0x60, 0x86, 0x08, 0x60,
-  0x24, 0x82, 0x48, 0x24, 0x82, 0x48,
-  0x89, 0x08, 0x90, 0x89, 0x08, 0x90,
-  0xc0, 0x2c, 0x02, 0xc0, 0x2c, 0x02,
-  0x88, 0x32, 0x59, 0x88, 0x32, 0x59
-};
-
-const uint8_t kMaskRandom48_48[288] = {
-  0x10, 0x61, 0x06, 0x10, 0x61, 0x06,
-  0x02, 0x30, 0x23, 0x02, 0x30, 0x23,
-  0x40, 0x54, 0x05, 0x40, 0x54, 0x05,
-  0x21, 0x82, 0x18, 0x21, 0x82, 0x18,
-  0x81, 0x18, 0x11, 0x81, 0x18, 0x11,
-  0x14, 0x81, 0x48, 0x14, 0x81, 0x48,
-  0x98, 0x09, 0x80, 0x98, 0x09, 0x80,
-  0x08, 0x90, 0x89, 0x08, 0x90, 0x89,
-  0x62, 0x06, 0x20, 0x62, 0x06, 0x20,
-  0x24, 0x22, 0x42, 0x24, 0x22, 0x42,
-  0x8a, 0x08, 0xa0, 0x8a, 0x08, 0xa0,
-  0x84, 0x48, 0x44, 0x84, 0x48, 0x44,
-  0x53, 0x65, 0x36, 0x53, 0x65, 0x36,
-  0x21, 0x32, 0x13, 0x21, 0x32, 0x13,
-  0x10, 0x91, 0x09, 0x10, 0x91, 0x09,
-  0x00, 0x70, 0x07, 0x00, 0x70, 0x07,
-  0x0c, 0x10, 0xc1, 0x0c, 0x10, 0xc1,
-  0x40, 0xc4, 0x0c, 0x40, 0xc4, 0x0c,
-  0x6a, 0x06, 0xa0, 0x6a, 0x06, 0xa0,
-  0x86, 0x08, 0x60, 0x86, 0x08, 0x60,
-  0x24, 0x82, 0x48, 0x24, 0x82, 0x48,
-  0x89, 0x08, 0x90, 0x89, 0x08, 0x90,
-  0xc0, 0x2c, 0x02, 0xc0, 0x2c, 0x02,
-  0x88, 0x32, 0x59, 0x88, 0x32, 0x59,
-  0x53, 0x65, 0x36, 0x53, 0x65, 0x36,
-  0x21, 0x32, 0x13, 0x21, 0x32, 0x13,
-  0x10, 0x91, 0x09, 0x10, 0x91, 0x09,
-  0x00, 0x70, 0x07, 0x00, 0x70, 0x07,
-  0x0c, 0x10, 0xc1, 0x0c, 0x10, 0xc1,
-  0x40, 0xc4, 0x0c, 0x40, 0xc4, 0x0c,
-  0x6a, 0x06, 0xa0, 0x6a, 0x06, 0xa0,
-  0x86, 0x08, 0x60, 0x86, 0x08, 0x60,
-  0x24, 0x82, 0x48, 0x24, 0x82, 0x48,
-  0x89, 0x08, 0x90, 0x89, 0x08, 0x90,
-  0xc0, 0x2c, 0x02, 0xc0, 0x2c, 0x02,
-  0x10, 0x61, 0x06, 0x10, 0x61, 0x06,
-  0x02, 0x30, 0x23, 0x02, 0x30, 0x23,
-  0x40, 0x54, 0x05, 0x40, 0x54, 0x05,
-  0x21, 0x82, 0x18, 0x21, 0x82, 0x18,
-  0x81, 0x18, 0x11, 0x81, 0x18, 0x11,
-  0x14, 0x81, 0x48, 0x14, 0x81, 0x48,
-  0x98, 0x09, 0x80, 0x98, 0x09, 0x80,
-  0x08, 0x90, 0x89, 0x08, 0x90, 0x89,
-  0x62, 0x06, 0x20, 0x62, 0x06, 0x20,
-  0x24, 0x22, 0x42, 0x24, 0x22, 0x42,
-  0x8a, 0x08, 0xa0, 0x8a, 0x08, 0xa0,
-  0x84, 0x48, 0x44, 0x84, 0x48, 0x44,
-  0xff, 0x9b, 0xdf, 0xec, 0xae, 0x0e
-};
-
-const uint8_t kMaskRandom48_5[30] = {
-  0x53, 0x65, 0x36, 0x53, 0x65, 0x36,
-  0x64, 0xb6, 0x4b, 0x64, 0xb6, 0x4b,
-  0x0e, 0xe0, 0xee, 0x0e, 0xe0, 0xee,
-  0xa9, 0xca, 0x9c, 0xa9, 0xca, 0x9c,
-  0xb8, 0x3b, 0x83, 0xb8, 0x3b, 0x83
-};
-
-const uint8_t kMaskRandom48_6[36] = {
-  0xd1, 0x4d, 0x14, 0xd1, 0x4d, 0x14,
-  0x45, 0x34, 0x53, 0x45, 0x34, 0x53,
-  0x22, 0xd2, 0x2d, 0x22, 0xd2, 0x2d,
-  0x16, 0xc1, 0x6c, 0x16, 0xc1, 0x6c,
-  0x0b, 0xa0, 0xba, 0x0b, 0xa0, 0xba,
-  0xe8, 0x8e, 0x88, 0xe8, 0x8e, 0x88
-};
-
-const uint8_t kMaskRandom48_7[42] = {
-  0xd3, 0x65, 0x36, 0xd3, 0x65, 0x36,
-  0x25, 0x32, 0x53, 0x25, 0x32, 0x53,
-  0x30, 0xd3, 0x05, 0x30, 0xd3, 0x05,
-  0x06, 0x48, 0x6c, 0x06, 0x48, 0x6c,
-  0xc0, 0xb8, 0x1b, 0xc0, 0xb8, 0x1b,
-  0x2a, 0xa2, 0xaa, 0x2a, 0xa2, 0xaa,
-  0xa8, 0x4e, 0x84, 0xa8, 0x4e, 0x84
-};
-
-const uint8_t kMaskRandom48_8[48] = {
-  0x81, 0x60, 0x16, 0x81, 0x60, 0x16,
-  0x40, 0x3c, 0x03, 0x40, 0x3c, 0x03,
-  0x10, 0x91, 0x09, 0x10, 0x91, 0x09,
-  0x06, 0x50, 0x65, 0x06, 0x50, 0x65,
-  0x20, 0x4a, 0x84, 0x20, 0x4a, 0x84,
-  0x8a, 0xa0, 0xaa, 0x8a, 0xa0, 0xaa,
-  0x33, 0x03, 0x30, 0x33, 0x03, 0x30,
-  0x4c, 0x84, 0xc8, 0x4c, 0x84, 0xc8
-};
-
-const uint8_t kMaskRandom48_9[54] = {
-  0xd3, 0x65, 0x36, 0xd3, 0x65, 0x36,
-  0x64, 0x26, 0x42, 0x64, 0x26, 0x42,
-  0x18, 0x41, 0xc4, 0x18, 0x41, 0xc4,
-  0xa0, 0x4a, 0x04, 0xa0, 0x4a, 0x04,
-  0x81, 0x38, 0x13, 0x81, 0x38, 0x13,
-  0x22, 0xa2, 0x2a, 0x22, 0xa2, 0x2a,
-  0x08, 0x70, 0x87, 0x08, 0x70, 0x87,
-  0x04, 0x90, 0x49, 0x04, 0x90, 0x49,
-  0x01, 0xc0, 0x1c, 0x01, 0xc0, 0x1c
-};
-
-const uint8_t kMaskRandom4_1[2] = {
-  0xf0, 0x00
-};
-
-const uint8_t kMaskRandom4_2[4] = {
-  0xc0, 0x00,
-  0xb0, 0x00
-};
-
-const uint8_t kMaskRandom4_3[6] = {
-  0xc0, 0x00,
-  0xb0, 0x00,
-  0x60, 0x00
-};
-
-const uint8_t kMaskRandom4_4[8] = {
-  0xc0, 0x00,
-  0xa0, 0x00,
-  0x30, 0x00,
-  0x50, 0x00
-};
-
-const uint8_t kMaskRandom5_1[2] = {
-  0xf8, 0x00
-};
-
-const uint8_t kMaskRandom5_2[4] = {
-  0xa8, 0x00,
-  0xd0, 0x00
-};
-
-const uint8_t kMaskRandom5_3[6] = {
-  0xb0, 0x00,
-  0xc8, 0x00,
-  0x50, 0x00
-};
-
-const uint8_t kMaskRandom5_4[8] = {
-  0xc8, 0x00,
-  0xb0, 0x00,
-  0x50, 0x00,
-  0x28, 0x00
-};
-
-const uint8_t kMaskRandom5_5[10] = {
-  0xc0, 0x00,
-  0x30, 0x00,
-  0x18, 0x00,
-  0xa0, 0x00,
-  0x48, 0x00
-};
-
-const uint8_t kMaskRandom6_1[2] = {
-  0xfc, 0x00
-};
-
-const uint8_t kMaskRandom6_2[4] = {
-  0xa8, 0x00,
-  0xd4, 0x00
-};
-
-const uint8_t kMaskRandom6_3[6] = {
-  0xd0, 0x00,
-  0x68, 0x00,
-  0xa4, 0x00
-};
-
-const uint8_t kMaskRandom6_4[8] = {
-  0xa8, 0x00,
-  0x58, 0x00,
-  0x64, 0x00,
-  0x94, 0x00
-};
-
-const uint8_t kMaskRandom6_5[10] = {
-  0xa8, 0x00,
-  0x84, 0x00,
-  0x64, 0x00,
-  0x90, 0x00,
-  0x58, 0x00
-};
-
-const uint8_t kMaskRandom6_6[12] = {
-  0x98, 0x00,
-  0x64, 0x00,
-  0x50, 0x00,
-  0x14, 0x00,
-  0xa8, 0x00,
-  0xe0, 0x00
-};
-
-const uint8_t kMaskRandom7_1[2] = {
-  0xfe, 0x00
-};
-
-const uint8_t kMaskRandom7_2[4] = {
-  0xd4, 0x00,
-  0xaa, 0x00
-};
-
-const uint8_t kMaskRandom7_3[6] = {
-  0xd0, 0x00,
-  0xaa, 0x00,
-  0x64, 0x00
-};
-
-const uint8_t kMaskRandom7_4[8] = {
-  0xd0, 0x00,
-  0xaa, 0x00,
-  0x64, 0x00,
-  0x1c, 0x00
-};
-
-const uint8_t kMaskRandom7_5[10] = {
-  0x0c, 0x00,
-  0xb0, 0x00,
-  0x1a, 0x00,
-  0xc4, 0x00,
-  0x62, 0x00
-};
-
-const uint8_t kMaskRandom7_6[12] = {
-  0x8c, 0x00,
-  0x4a, 0x00,
-  0x64, 0x00,
-  0xd0, 0x00,
-  0xa0, 0x00,
-  0x32, 0x00
-};
-
-const uint8_t kMaskRandom7_7[14] = {
-  0x4a, 0x00,
-  0x94, 0x00,
-  0x1a, 0x00,
-  0xc4, 0x00,
-  0x28, 0x00,
-  0xc2, 0x00,
-  0x34, 0x00
-};
-
-const uint8_t kMaskRandom8_1[2] = {
-  0xff, 0x00
-};
-
-const uint8_t kMaskRandom8_2[4] = {
-  0xaa, 0x00,
-  0xd5, 0x00
-};
-
-const uint8_t kMaskRandom8_3[6] = {
-  0xc5, 0x00,
-  0x92, 0x00,
-  0x6a, 0x00
-};
-
-const uint8_t kMaskRandom8_4[8] = {
-  0x45, 0x00,
-  0xb4, 0x00,
-  0x6a, 0x00,
-  0x89, 0x00
-};
-
-const uint8_t kMaskRandom8_5[10] = {
-  0x8c, 0x00,
-  0x92, 0x00,
-  0x2b, 0x00,
-  0x51, 0x00,
-  0x64, 0x00
-};
-
-const uint8_t kMaskRandom8_6[12] = {
-  0xa1, 0x00,
-  0x52, 0x00,
-  0x91, 0x00,
-  0x2a, 0x00,
-  0xc4, 0x00,
-  0x4c, 0x00
-};
-
-const uint8_t kMaskRandom8_7[14] = {
-  0x15, 0x00,
-  0xc2, 0x00,
-  0x25, 0x00,
-  0x62, 0x00,
-  0x58, 0x00,
-  0x8c, 0x00,
-  0xa3, 0x00
-};
-
-const uint8_t kMaskRandom8_8[16] = {
-  0x25, 0x00,
-  0x8a, 0x00,
-  0x91, 0x00,
-  0x68, 0x00,
-  0x32, 0x00,
-  0x43, 0x00,
-  0xc4, 0x00,
-  0x1c, 0x00
-};
-
-const uint8_t kMaskRandom9_1[2] = {
-  0xff, 0x80
-};
-
-const uint8_t kMaskRandom9_2[4] = {
-  0xaa, 0x80,
-  0xd5, 0x00
-};
-
-const uint8_t kMaskRandom9_3[6] = {
-  0xa5, 0x00,
-  0xc8, 0x00,
-  0x52, 0x80
-};
-
-const uint8_t kMaskRandom9_4[8] = {
-  0xa2, 0x00,
-  0xc9, 0x00,
-  0x52, 0x80,
-  0x24, 0x80
-};
-
-const uint8_t kMaskRandom9_5[10] = {
-  0x8c, 0x00,
-  0x25, 0x00,
-  0x92, 0x80,
-  0x41, 0x80,
-  0x58, 0x00
-};
-
-const uint8_t kMaskRandom9_6[12] = {
-  0x84, 0x80,
-  0x27, 0x00,
-  0x51, 0x80,
-  0x1a, 0x00,
-  0x68, 0x00,
-  0x89, 0x00
-};
-
-const uint8_t kMaskRandom9_7[14] = {
-  0x8c, 0x00,
-  0x47, 0x00,
-  0x81, 0x80,
-  0x12, 0x80,
-  0x58, 0x00,
-  0x28, 0x80,
-  0xb4, 0x00
-};
-
-const uint8_t kMaskRandom9_8[16] = {
-  0x2c, 0x00,
-  0x91, 0x00,
-  0x40, 0x80,
-  0x06, 0x80,
-  0xc8, 0x00,
-  0x45, 0x00,
-  0x30, 0x80,
-  0xa2, 0x00
-};
-
-const uint8_t kMaskRandom9_9[18] = {
-  0x4c, 0x00,
-  0x62, 0x00,
-  0x91, 0x00,
-  0x42, 0x80,
-  0xa4, 0x00,
-  0x13, 0x00,
-  0x30, 0x80,
-  0x88, 0x80,
-  0x09, 0x00
-};
-
-const uint8_t* const kPacketMaskRandom1[1] = {
-  kMaskRandom1_1
-};
-
-const uint8_t* const kPacketMaskRandom2[2] = {
-  kMaskRandom2_1,
-  kMaskRandom2_2
-};
-
-const uint8_t* const kPacketMaskRandom3[3] = {
-  kMaskRandom3_1,
-  kMaskRandom3_2,
-  kMaskRandom3_3
-};
-
-const uint8_t* const kPacketMaskRandom4[4] = {
-  kMaskRandom4_1,
-  kMaskRandom4_2,
-  kMaskRandom4_3,
-  kMaskRandom4_4
-};
-
-const uint8_t* const kPacketMaskRandom5[5] = {
-  kMaskRandom5_1,
-  kMaskRandom5_2,
-  kMaskRandom5_3,
-  kMaskRandom5_4,
-  kMaskRandom5_5
-};
-
-const uint8_t* const kPacketMaskRandom6[6] = {
-  kMaskRandom6_1,
-  kMaskRandom6_2,
-  kMaskRandom6_3,
-  kMaskRandom6_4,
-  kMaskRandom6_5,
-  kMaskRandom6_6
-};
-
-const uint8_t* const kPacketMaskRandom7[7] = {
-  kMaskRandom7_1,
-  kMaskRandom7_2,
-  kMaskRandom7_3,
-  kMaskRandom7_4,
-  kMaskRandom7_5,
-  kMaskRandom7_6,
-  kMaskRandom7_7
-};
-
-const uint8_t* const kPacketMaskRandom8[8] = {
-  kMaskRandom8_1,
-  kMaskRandom8_2,
-  kMaskRandom8_3,
-  kMaskRandom8_4,
-  kMaskRandom8_5,
-  kMaskRandom8_6,
-  kMaskRandom8_7,
-  kMaskRandom8_8
-};
-
-const uint8_t* const kPacketMaskRandom9[9] = {
-  kMaskRandom9_1,
-  kMaskRandom9_2,
-  kMaskRandom9_3,
-  kMaskRandom9_4,
-  kMaskRandom9_5,
-  kMaskRandom9_6,
-  kMaskRandom9_7,
-  kMaskRandom9_8,
-  kMaskRandom9_9
-};
-
-const uint8_t* const kPacketMaskRandom10[10] = {
-  kMaskRandom10_1,
-  kMaskRandom10_2,
-  kMaskRandom10_3,
-  kMaskRandom10_4,
-  kMaskRandom10_5,
-  kMaskRandom10_6,
-  kMaskRandom10_7,
-  kMaskRandom10_8,
-  kMaskRandom10_9,
-  kMaskRandom10_10
-};
-
-const uint8_t* const kPacketMaskRandom11[11] = {
-  kMaskRandom11_1,
-  kMaskRandom11_2,
-  kMaskRandom11_3,
-  kMaskRandom11_4,
-  kMaskRandom11_5,
-  kMaskRandom11_6,
-  kMaskRandom11_7,
-  kMaskRandom11_8,
-  kMaskRandom11_9,
-  kMaskRandom11_10,
-  kMaskRandom11_11
-};
-
-const uint8_t* const kPacketMaskRandom12[12] = {
-  kMaskRandom12_1,
-  kMaskRandom12_2,
-  kMaskRandom12_3,
-  kMaskRandom12_4,
-  kMaskRandom12_5,
-  kMaskRandom12_6,
-  kMaskRandom12_7,
-  kMaskRandom12_8,
-  kMaskRandom12_9,
-  kMaskRandom12_10,
-  kMaskRandom12_11,
-  kMaskRandom12_12
-};
-
-const uint8_t* const kPacketMaskRandom13[13] = {
-  kMaskRandom13_1,
-  kMaskRandom13_2,
-  kMaskRandom13_3,
-  kMaskRandom13_4,
-  kMaskRandom13_5,
-  kMaskRandom13_6,
-  kMaskRandom13_7,
-  kMaskRandom13_8,
-  kMaskRandom13_9,
-  kMaskRandom13_10,
-  kMaskRandom13_11,
-  kMaskRandom13_12,
-  kMaskRandom13_13
-};
-
-const uint8_t* const kPacketMaskRandom14[14] = {
-  kMaskRandom14_1,
-  kMaskRandom14_2,
-  kMaskRandom14_3,
-  kMaskRandom14_4,
-  kMaskRandom14_5,
-  kMaskRandom14_6,
-  kMaskRandom14_7,
-  kMaskRandom14_8,
-  kMaskRandom14_9,
-  kMaskRandom14_10,
-  kMaskRandom14_11,
-  kMaskRandom14_12,
-  kMaskRandom14_13,
-  kMaskRandom14_14
-};
-
-const uint8_t* const kPacketMaskRandom15[15] = {
-  kMaskRandom15_1,
-  kMaskRandom15_2,
-  kMaskRandom15_3,
-  kMaskRandom15_4,
-  kMaskRandom15_5,
-  kMaskRandom15_6,
-  kMaskRandom15_7,
-  kMaskRandom15_8,
-  kMaskRandom15_9,
-  kMaskRandom15_10,
-  kMaskRandom15_11,
-  kMaskRandom15_12,
-  kMaskRandom15_13,
-  kMaskRandom15_14,
-  kMaskRandom15_15
-};
-
-const uint8_t* const kPacketMaskRandom16[16] = {
-  kMaskRandom16_1,
-  kMaskRandom16_2,
-  kMaskRandom16_3,
-  kMaskRandom16_4,
-  kMaskRandom16_5,
-  kMaskRandom16_6,
-  kMaskRandom16_7,
-  kMaskRandom16_8,
-  kMaskRandom16_9,
-  kMaskRandom16_10,
-  kMaskRandom16_11,
-  kMaskRandom16_12,
-  kMaskRandom16_13,
-  kMaskRandom16_14,
-  kMaskRandom16_15,
-  kMaskRandom16_16
-};
-
-const uint8_t* const kPacketMaskRandom17[17] = {
-  kMaskRandom17_1,
-  kMaskRandom17_2,
-  kMaskRandom17_3,
-  kMaskRandom17_4,
-  kMaskRandom17_5,
-  kMaskRandom17_6,
-  kMaskRandom17_7,
-  kMaskRandom17_8,
-  kMaskRandom17_9,
-  kMaskRandom17_10,
-  kMaskRandom17_11,
-  kMaskRandom17_12,
-  kMaskRandom17_13,
-  kMaskRandom17_14,
-  kMaskRandom17_15,
-  kMaskRandom17_16,
-  kMaskRandom17_17
-};
-
-const uint8_t* const kPacketMaskRandom18[18] = {
-  kMaskRandom18_1,
-  kMaskRandom18_2,
-  kMaskRandom18_3,
-  kMaskRandom18_4,
-  kMaskRandom18_5,
-  kMaskRandom18_6,
-  kMaskRandom18_7,
-  kMaskRandom18_8,
-  kMaskRandom18_9,
-  kMaskRandom18_10,
-  kMaskRandom18_11,
-  kMaskRandom18_12,
-  kMaskRandom18_13,
-  kMaskRandom18_14,
-  kMaskRandom18_15,
-  kMaskRandom18_16,
-  kMaskRandom18_17,
-  kMaskRandom18_18
-};
-
-const uint8_t* const kPacketMaskRandom19[19] = {
-  kMaskRandom19_1,
-  kMaskRandom19_2,
-  kMaskRandom19_3,
-  kMaskRandom19_4,
-  kMaskRandom19_5,
-  kMaskRandom19_6,
-  kMaskRandom19_7,
-  kMaskRandom19_8,
-  kMaskRandom19_9,
-  kMaskRandom19_10,
-  kMaskRandom19_11,
-  kMaskRandom19_12,
-  kMaskRandom19_13,
-  kMaskRandom19_14,
-  kMaskRandom19_15,
-  kMaskRandom19_16,
-  kMaskRandom19_17,
-  kMaskRandom19_18,
-  kMaskRandom19_19
-};
-
-const uint8_t* const kPacketMaskRandom20[20] = {
-  kMaskRandom20_1,
-  kMaskRandom20_2,
-  kMaskRandom20_3,
-  kMaskRandom20_4,
-  kMaskRandom20_5,
-  kMaskRandom20_6,
-  kMaskRandom20_7,
-  kMaskRandom20_8,
-  kMaskRandom20_9,
-  kMaskRandom20_10,
-  kMaskRandom20_11,
-  kMaskRandom20_12,
-  kMaskRandom20_13,
-  kMaskRandom20_14,
-  kMaskRandom20_15,
-  kMaskRandom20_16,
-  kMaskRandom20_17,
-  kMaskRandom20_18,
-  kMaskRandom20_19,
-  kMaskRandom20_20
-};
-
-const uint8_t* const kPacketMaskRandom21[21] = {
-  kMaskRandom21_1,
-  kMaskRandom21_2,
-  kMaskRandom21_3,
-  kMaskRandom21_4,
-  kMaskRandom21_5,
-  kMaskRandom21_6,
-  kMaskRandom21_7,
-  kMaskRandom21_8,
-  kMaskRandom21_9,
-  kMaskRandom21_10,
-  kMaskRandom21_11,
-  kMaskRandom21_12,
-  kMaskRandom21_13,
-  kMaskRandom21_14,
-  kMaskRandom21_15,
-  kMaskRandom21_16,
-  kMaskRandom21_17,
-  kMaskRandom21_18,
-  kMaskRandom21_19,
-  kMaskRandom21_20,
-  kMaskRandom21_21
-};
-
-const uint8_t* const kPacketMaskRandom22[22] = {
-  kMaskRandom22_1,
-  kMaskRandom22_2,
-  kMaskRandom22_3,
-  kMaskRandom22_4,
-  kMaskRandom22_5,
-  kMaskRandom22_6,
-  kMaskRandom22_7,
-  kMaskRandom22_8,
-  kMaskRandom22_9,
-  kMaskRandom22_10,
-  kMaskRandom22_11,
-  kMaskRandom22_12,
-  kMaskRandom22_13,
-  kMaskRandom22_14,
-  kMaskRandom22_15,
-  kMaskRandom22_16,
-  kMaskRandom22_17,
-  kMaskRandom22_18,
-  kMaskRandom22_19,
-  kMaskRandom22_20,
-  kMaskRandom22_21,
-  kMaskRandom22_22
-};
-
-const uint8_t* const kPacketMaskRandom23[23] = {
-  kMaskRandom23_1,
-  kMaskRandom23_2,
-  kMaskRandom23_3,
-  kMaskRandom23_4,
-  kMaskRandom23_5,
-  kMaskRandom23_6,
-  kMaskRandom23_7,
-  kMaskRandom23_8,
-  kMaskRandom23_9,
-  kMaskRandom23_10,
-  kMaskRandom23_11,
-  kMaskRandom23_12,
-  kMaskRandom23_13,
-  kMaskRandom23_14,
-  kMaskRandom23_15,
-  kMaskRandom23_16,
-  kMaskRandom23_17,
-  kMaskRandom23_18,
-  kMaskRandom23_19,
-  kMaskRandom23_20,
-  kMaskRandom23_21,
-  kMaskRandom23_22,
-  kMaskRandom23_23
-};
-
-const uint8_t* const kPacketMaskRandom24[24] = {
-  kMaskRandom24_1,
-  kMaskRandom24_2,
-  kMaskRandom24_3,
-  kMaskRandom24_4,
-  kMaskRandom24_5,
-  kMaskRandom24_6,
-  kMaskRandom24_7,
-  kMaskRandom24_8,
-  kMaskRandom24_9,
-  kMaskRandom24_10,
-  kMaskRandom24_11,
-  kMaskRandom24_12,
-  kMaskRandom24_13,
-  kMaskRandom24_14,
-  kMaskRandom24_15,
-  kMaskRandom24_16,
-  kMaskRandom24_17,
-  kMaskRandom24_18,
-  kMaskRandom24_19,
-  kMaskRandom24_20,
-  kMaskRandom24_21,
-  kMaskRandom24_22,
-  kMaskRandom24_23,
-  kMaskRandom24_24
-};
-
-const uint8_t* const kPacketMaskRandom25[25] = {
-  kMaskRandom25_1,
-  kMaskRandom25_2,
-  kMaskRandom25_3,
-  kMaskRandom25_4,
-  kMaskRandom25_5,
-  kMaskRandom25_6,
-  kMaskRandom25_7,
-  kMaskRandom25_8,
-  kMaskRandom25_9,
-  kMaskRandom25_10,
-  kMaskRandom25_11,
-  kMaskRandom25_12,
-  kMaskRandom25_13,
-  kMaskRandom25_14,
-  kMaskRandom25_15,
-  kMaskRandom25_16,
-  kMaskRandom25_17,
-  kMaskRandom25_18,
-  kMaskRandom25_19,
-  kMaskRandom25_20,
-  kMaskRandom25_21,
-  kMaskRandom25_22,
-  kMaskRandom25_23,
-  kMaskRandom25_24,
-  kMaskRandom25_25
-};
-
-const uint8_t* const kPacketMaskRandom26[26] = {
-  kMaskRandom26_1,
-  kMaskRandom26_2,
-  kMaskRandom26_3,
-  kMaskRandom26_4,
-  kMaskRandom26_5,
-  kMaskRandom26_6,
-  kMaskRandom26_7,
-  kMaskRandom26_8,
-  kMaskRandom26_9,
-  kMaskRandom26_10,
-  kMaskRandom26_11,
-  kMaskRandom26_12,
-  kMaskRandom26_13,
-  kMaskRandom26_14,
-  kMaskRandom26_15,
-  kMaskRandom26_16,
-  kMaskRandom26_17,
-  kMaskRandom26_18,
-  kMaskRandom26_19,
-  kMaskRandom26_20,
-  kMaskRandom26_21,
-  kMaskRandom26_22,
-  kMaskRandom26_23,
-  kMaskRandom26_24,
-  kMaskRandom26_25,
-  kMaskRandom26_26
-};
-
-const uint8_t* const kPacketMaskRandom27[27] = {
-  kMaskRandom27_1,
-  kMaskRandom27_2,
-  kMaskRandom27_3,
-  kMaskRandom27_4,
-  kMaskRandom27_5,
-  kMaskRandom27_6,
-  kMaskRandom27_7,
-  kMaskRandom27_8,
-  kMaskRandom27_9,
-  kMaskRandom27_10,
-  kMaskRandom27_11,
-  kMaskRandom27_12,
-  kMaskRandom27_13,
-  kMaskRandom27_14,
-  kMaskRandom27_15,
-  kMaskRandom27_16,
-  kMaskRandom27_17,
-  kMaskRandom27_18,
-  kMaskRandom27_19,
-  kMaskRandom27_20,
-  kMaskRandom27_21,
-  kMaskRandom27_22,
-  kMaskRandom27_23,
-  kMaskRandom27_24,
-  kMaskRandom27_25,
-  kMaskRandom27_26,
-  kMaskRandom27_27
-};
-
-const uint8_t* const kPacketMaskRandom28[28] = {
-  kMaskRandom28_1,
-  kMaskRandom28_2,
-  kMaskRandom28_3,
-  kMaskRandom28_4,
-  kMaskRandom28_5,
-  kMaskRandom28_6,
-  kMaskRandom28_7,
-  kMaskRandom28_8,
-  kMaskRandom28_9,
-  kMaskRandom28_10,
-  kMaskRandom28_11,
-  kMaskRandom28_12,
-  kMaskRandom28_13,
-  kMaskRandom28_14,
-  kMaskRandom28_15,
-  kMaskRandom28_16,
-  kMaskRandom28_17,
-  kMaskRandom28_18,
-  kMaskRandom28_19,
-  kMaskRandom28_20,
-  kMaskRandom28_21,
-  kMaskRandom28_22,
-  kMaskRandom28_23,
-  kMaskRandom28_24,
-  kMaskRandom28_25,
-  kMaskRandom28_26,
-  kMaskRandom28_27,
-  kMaskRandom28_28
-};
-
-const uint8_t* const kPacketMaskRandom29[29] = {
-  kMaskRandom29_1,
-  kMaskRandom29_2,
-  kMaskRandom29_3,
-  kMaskRandom29_4,
-  kMaskRandom29_5,
-  kMaskRandom29_6,
-  kMaskRandom29_7,
-  kMaskRandom29_8,
-  kMaskRandom29_9,
-  kMaskRandom29_10,
-  kMaskRandom29_11,
-  kMaskRandom29_12,
-  kMaskRandom29_13,
-  kMaskRandom29_14,
-  kMaskRandom29_15,
-  kMaskRandom29_16,
-  kMaskRandom29_17,
-  kMaskRandom29_18,
-  kMaskRandom29_19,
-  kMaskRandom29_20,
-  kMaskRandom29_21,
-  kMaskRandom29_22,
-  kMaskRandom29_23,
-  kMaskRandom29_24,
-  kMaskRandom29_25,
-  kMaskRandom29_26,
-  kMaskRandom29_27,
-  kMaskRandom29_28,
-  kMaskRandom29_29
-};
-
-const uint8_t* const kPacketMaskRandom30[30] = {
-  kMaskRandom30_1,
-  kMaskRandom30_2,
-  kMaskRandom30_3,
-  kMaskRandom30_4,
-  kMaskRandom30_5,
-  kMaskRandom30_6,
-  kMaskRandom30_7,
-  kMaskRandom30_8,
-  kMaskRandom30_9,
-  kMaskRandom30_10,
-  kMaskRandom30_11,
-  kMaskRandom30_12,
-  kMaskRandom30_13,
-  kMaskRandom30_14,
-  kMaskRandom30_15,
-  kMaskRandom30_16,
-  kMaskRandom30_17,
-  kMaskRandom30_18,
-  kMaskRandom30_19,
-  kMaskRandom30_20,
-  kMaskRandom30_21,
-  kMaskRandom30_22,
-  kMaskRandom30_23,
-  kMaskRandom30_24,
-  kMaskRandom30_25,
-  kMaskRandom30_26,
-  kMaskRandom30_27,
-  kMaskRandom30_28,
-  kMaskRandom30_29,
-  kMaskRandom30_30
-};
-
-const uint8_t* const kPacketMaskRandom31[31] = {
-  kMaskRandom31_1,
-  kMaskRandom31_2,
-  kMaskRandom31_3,
-  kMaskRandom31_4,
-  kMaskRandom31_5,
-  kMaskRandom31_6,
-  kMaskRandom31_7,
-  kMaskRandom31_8,
-  kMaskRandom31_9,
-  kMaskRandom31_10,
-  kMaskRandom31_11,
-  kMaskRandom31_12,
-  kMaskRandom31_13,
-  kMaskRandom31_14,
-  kMaskRandom31_15,
-  kMaskRandom31_16,
-  kMaskRandom31_17,
-  kMaskRandom31_18,
-  kMaskRandom31_19,
-  kMaskRandom31_20,
-  kMaskRandom31_21,
-  kMaskRandom31_22,
-  kMaskRandom31_23,
-  kMaskRandom31_24,
-  kMaskRandom31_25,
-  kMaskRandom31_26,
-  kMaskRandom31_27,
-  kMaskRandom31_28,
-  kMaskRandom31_29,
-  kMaskRandom31_30,
-  kMaskRandom31_31
-};
-
-const uint8_t* const kPacketMaskRandom32[32] = {
-  kMaskRandom32_1,
-  kMaskRandom32_2,
-  kMaskRandom32_3,
-  kMaskRandom32_4,
-  kMaskRandom32_5,
-  kMaskRandom32_6,
-  kMaskRandom32_7,
-  kMaskRandom32_8,
-  kMaskRandom32_9,
-  kMaskRandom32_10,
-  kMaskRandom32_11,
-  kMaskRandom32_12,
-  kMaskRandom32_13,
-  kMaskRandom32_14,
-  kMaskRandom32_15,
-  kMaskRandom32_16,
-  kMaskRandom32_17,
-  kMaskRandom32_18,
-  kMaskRandom32_19,
-  kMaskRandom32_20,
-  kMaskRandom32_21,
-  kMaskRandom32_22,
-  kMaskRandom32_23,
-  kMaskRandom32_24,
-  kMaskRandom32_25,
-  kMaskRandom32_26,
-  kMaskRandom32_27,
-  kMaskRandom32_28,
-  kMaskRandom32_29,
-  kMaskRandom32_30,
-  kMaskRandom32_31,
-  kMaskRandom32_32
-};
-
-const uint8_t* const kPacketMaskRandom33[33] = {
-  kMaskRandom33_1,
-  kMaskRandom33_2,
-  kMaskRandom33_3,
-  kMaskRandom33_4,
-  kMaskRandom33_5,
-  kMaskRandom33_6,
-  kMaskRandom33_7,
-  kMaskRandom33_8,
-  kMaskRandom33_9,
-  kMaskRandom33_10,
-  kMaskRandom33_11,
-  kMaskRandom33_12,
-  kMaskRandom33_13,
-  kMaskRandom33_14,
-  kMaskRandom33_15,
-  kMaskRandom33_16,
-  kMaskRandom33_17,
-  kMaskRandom33_18,
-  kMaskRandom33_19,
-  kMaskRandom33_20,
-  kMaskRandom33_21,
-  kMaskRandom33_22,
-  kMaskRandom33_23,
-  kMaskRandom33_24,
-  kMaskRandom33_25,
-  kMaskRandom33_26,
-  kMaskRandom33_27,
-  kMaskRandom33_28,
-  kMaskRandom33_29,
-  kMaskRandom33_30,
-  kMaskRandom33_31,
-  kMaskRandom33_32,
-  kMaskRandom33_33
-};
-
-const uint8_t* const kPacketMaskRandom34[34] = {
-  kMaskRandom34_1,
-  kMaskRandom34_2,
-  kMaskRandom34_3,
-  kMaskRandom34_4,
-  kMaskRandom34_5,
-  kMaskRandom34_6,
-  kMaskRandom34_7,
-  kMaskRandom34_8,
-  kMaskRandom34_9,
-  kMaskRandom34_10,
-  kMaskRandom34_11,
-  kMaskRandom34_12,
-  kMaskRandom34_13,
-  kMaskRandom34_14,
-  kMaskRandom34_15,
-  kMaskRandom34_16,
-  kMaskRandom34_17,
-  kMaskRandom34_18,
-  kMaskRandom34_19,
-  kMaskRandom34_20,
-  kMaskRandom34_21,
-  kMaskRandom34_22,
-  kMaskRandom34_23,
-  kMaskRandom34_24,
-  kMaskRandom34_25,
-  kMaskRandom34_26,
-  kMaskRandom34_27,
-  kMaskRandom34_28,
-  kMaskRandom34_29,
-  kMaskRandom34_30,
-  kMaskRandom34_31,
-  kMaskRandom34_32,
-  kMaskRandom34_33,
-  kMaskRandom34_34
-};
-
-const uint8_t* const kPacketMaskRandom35[35] = {
-  kMaskRandom35_1,
-  kMaskRandom35_2,
-  kMaskRandom35_3,
-  kMaskRandom35_4,
-  kMaskRandom35_5,
-  kMaskRandom35_6,
-  kMaskRandom35_7,
-  kMaskRandom35_8,
-  kMaskRandom35_9,
-  kMaskRandom35_10,
-  kMaskRandom35_11,
-  kMaskRandom35_12,
-  kMaskRandom35_13,
-  kMaskRandom35_14,
-  kMaskRandom35_15,
-  kMaskRandom35_16,
-  kMaskRandom35_17,
-  kMaskRandom35_18,
-  kMaskRandom35_19,
-  kMaskRandom35_20,
-  kMaskRandom35_21,
-  kMaskRandom35_22,
-  kMaskRandom35_23,
-  kMaskRandom35_24,
-  kMaskRandom35_25,
-  kMaskRandom35_26,
-  kMaskRandom35_27,
-  kMaskRandom35_28,
-  kMaskRandom35_29,
-  kMaskRandom35_30,
-  kMaskRandom35_31,
-  kMaskRandom35_32,
-  kMaskRandom35_33,
-  kMaskRandom35_34,
-  kMaskRandom35_35
-};
-
-const uint8_t* const kPacketMaskRandom36[36] = {
-  kMaskRandom36_1,
-  kMaskRandom36_2,
-  kMaskRandom36_3,
-  kMaskRandom36_4,
-  kMaskRandom36_5,
-  kMaskRandom36_6,
-  kMaskRandom36_7,
-  kMaskRandom36_8,
-  kMaskRandom36_9,
-  kMaskRandom36_10,
-  kMaskRandom36_11,
-  kMaskRandom36_12,
-  kMaskRandom36_13,
-  kMaskRandom36_14,
-  kMaskRandom36_15,
-  kMaskRandom36_16,
-  kMaskRandom36_17,
-  kMaskRandom36_18,
-  kMaskRandom36_19,
-  kMaskRandom36_20,
-  kMaskRandom36_21,
-  kMaskRandom36_22,
-  kMaskRandom36_23,
-  kMaskRandom36_24,
-  kMaskRandom36_25,
-  kMaskRandom36_26,
-  kMaskRandom36_27,
-  kMaskRandom36_28,
-  kMaskRandom36_29,
-  kMaskRandom36_30,
-  kMaskRandom36_31,
-  kMaskRandom36_32,
-  kMaskRandom36_33,
-  kMaskRandom36_34,
-  kMaskRandom36_35,
-  kMaskRandom36_36
-};
-
-const uint8_t* const kPacketMaskRandom37[37] = {
-  kMaskRandom37_1,
-  kMaskRandom37_2,
-  kMaskRandom37_3,
-  kMaskRandom37_4,
-  kMaskRandom37_5,
-  kMaskRandom37_6,
-  kMaskRandom37_7,
-  kMaskRandom37_8,
-  kMaskRandom37_9,
-  kMaskRandom37_10,
-  kMaskRandom37_11,
-  kMaskRandom37_12,
-  kMaskRandom37_13,
-  kMaskRandom37_14,
-  kMaskRandom37_15,
-  kMaskRandom37_16,
-  kMaskRandom37_17,
-  kMaskRandom37_18,
-  kMaskRandom37_19,
-  kMaskRandom37_20,
-  kMaskRandom37_21,
-  kMaskRandom37_22,
-  kMaskRandom37_23,
-  kMaskRandom37_24,
-  kMaskRandom37_25,
-  kMaskRandom37_26,
-  kMaskRandom37_27,
-  kMaskRandom37_28,
-  kMaskRandom37_29,
-  kMaskRandom37_30,
-  kMaskRandom37_31,
-  kMaskRandom37_32,
-  kMaskRandom37_33,
-  kMaskRandom37_34,
-  kMaskRandom37_35,
-  kMaskRandom37_36,
-  kMaskRandom37_37
-};
-
-const uint8_t* const kPacketMaskRandom38[38] = {
-  kMaskRandom38_1,
-  kMaskRandom38_2,
-  kMaskRandom38_3,
-  kMaskRandom38_4,
-  kMaskRandom38_5,
-  kMaskRandom38_6,
-  kMaskRandom38_7,
-  kMaskRandom38_8,
-  kMaskRandom38_9,
-  kMaskRandom38_10,
-  kMaskRandom38_11,
-  kMaskRandom38_12,
-  kMaskRandom38_13,
-  kMaskRandom38_14,
-  kMaskRandom38_15,
-  kMaskRandom38_16,
-  kMaskRandom38_17,
-  kMaskRandom38_18,
-  kMaskRandom38_19,
-  kMaskRandom38_20,
-  kMaskRandom38_21,
-  kMaskRandom38_22,
-  kMaskRandom38_23,
-  kMaskRandom38_24,
-  kMaskRandom38_25,
-  kMaskRandom38_26,
-  kMaskRandom38_27,
-  kMaskRandom38_28,
-  kMaskRandom38_29,
-  kMaskRandom38_30,
-  kMaskRandom38_31,
-  kMaskRandom38_32,
-  kMaskRandom38_33,
-  kMaskRandom38_34,
-  kMaskRandom38_35,
-  kMaskRandom38_36,
-  kMaskRandom38_37,
-  kMaskRandom38_38
-};
-
-const uint8_t* const kPacketMaskRandom39[39] = {
-  kMaskRandom39_1,
-  kMaskRandom39_2,
-  kMaskRandom39_3,
-  kMaskRandom39_4,
-  kMaskRandom39_5,
-  kMaskRandom39_6,
-  kMaskRandom39_7,
-  kMaskRandom39_8,
-  kMaskRandom39_9,
-  kMaskRandom39_10,
-  kMaskRandom39_11,
-  kMaskRandom39_12,
-  kMaskRandom39_13,
-  kMaskRandom39_14,
-  kMaskRandom39_15,
-  kMaskRandom39_16,
-  kMaskRandom39_17,
-  kMaskRandom39_18,
-  kMaskRandom39_19,
-  kMaskRandom39_20,
-  kMaskRandom39_21,
-  kMaskRandom39_22,
-  kMaskRandom39_23,
-  kMaskRandom39_24,
-  kMaskRandom39_25,
-  kMaskRandom39_26,
-  kMaskRandom39_27,
-  kMaskRandom39_28,
-  kMaskRandom39_29,
-  kMaskRandom39_30,
-  kMaskRandom39_31,
-  kMaskRandom39_32,
-  kMaskRandom39_33,
-  kMaskRandom39_34,
-  kMaskRandom39_35,
-  kMaskRandom39_36,
-  kMaskRandom39_37,
-  kMaskRandom39_38,
-  kMaskRandom39_39
-};
-
-const uint8_t* const kPacketMaskRandom40[40] = {
-  kMaskRandom40_1,
-  kMaskRandom40_2,
-  kMaskRandom40_3,
-  kMaskRandom40_4,
-  kMaskRandom40_5,
-  kMaskRandom40_6,
-  kMaskRandom40_7,
-  kMaskRandom40_8,
-  kMaskRandom40_9,
-  kMaskRandom40_10,
-  kMaskRandom40_11,
-  kMaskRandom40_12,
-  kMaskRandom40_13,
-  kMaskRandom40_14,
-  kMaskRandom40_15,
-  kMaskRandom40_16,
-  kMaskRandom40_17,
-  kMaskRandom40_18,
-  kMaskRandom40_19,
-  kMaskRandom40_20,
-  kMaskRandom40_21,
-  kMaskRandom40_22,
-  kMaskRandom40_23,
-  kMaskRandom40_24,
-  kMaskRandom40_25,
-  kMaskRandom40_26,
-  kMaskRandom40_27,
-  kMaskRandom40_28,
-  kMaskRandom40_29,
-  kMaskRandom40_30,
-  kMaskRandom40_31,
-  kMaskRandom40_32,
-  kMaskRandom40_33,
-  kMaskRandom40_34,
-  kMaskRandom40_35,
-  kMaskRandom40_36,
-  kMaskRandom40_37,
-  kMaskRandom40_38,
-  kMaskRandom40_39,
-  kMaskRandom40_40
-};
-
-const uint8_t* const kPacketMaskRandom41[41] = {
-  kMaskRandom41_1,
-  kMaskRandom41_2,
-  kMaskRandom41_3,
-  kMaskRandom41_4,
-  kMaskRandom41_5,
-  kMaskRandom41_6,
-  kMaskRandom41_7,
-  kMaskRandom41_8,
-  kMaskRandom41_9,
-  kMaskRandom41_10,
-  kMaskRandom41_11,
-  kMaskRandom41_12,
-  kMaskRandom41_13,
-  kMaskRandom41_14,
-  kMaskRandom41_15,
-  kMaskRandom41_16,
-  kMaskRandom41_17,
-  kMaskRandom41_18,
-  kMaskRandom41_19,
-  kMaskRandom41_20,
-  kMaskRandom41_21,
-  kMaskRandom41_22,
-  kMaskRandom41_23,
-  kMaskRandom41_24,
-  kMaskRandom41_25,
-  kMaskRandom41_26,
-  kMaskRandom41_27,
-  kMaskRandom41_28,
-  kMaskRandom41_29,
-  kMaskRandom41_30,
-  kMaskRandom41_31,
-  kMaskRandom41_32,
-  kMaskRandom41_33,
-  kMaskRandom41_34,
-  kMaskRandom41_35,
-  kMaskRandom41_36,
-  kMaskRandom41_37,
-  kMaskRandom41_38,
-  kMaskRandom41_39,
-  kMaskRandom41_40,
-  kMaskRandom41_41
-};
-
-const uint8_t* const kPacketMaskRandom42[42] = {
-  kMaskRandom42_1,
-  kMaskRandom42_2,
-  kMaskRandom42_3,
-  kMaskRandom42_4,
-  kMaskRandom42_5,
-  kMaskRandom42_6,
-  kMaskRandom42_7,
-  kMaskRandom42_8,
-  kMaskRandom42_9,
-  kMaskRandom42_10,
-  kMaskRandom42_11,
-  kMaskRandom42_12,
-  kMaskRandom42_13,
-  kMaskRandom42_14,
-  kMaskRandom42_15,
-  kMaskRandom42_16,
-  kMaskRandom42_17,
-  kMaskRandom42_18,
-  kMaskRandom42_19,
-  kMaskRandom42_20,
-  kMaskRandom42_21,
-  kMaskRandom42_22,
-  kMaskRandom42_23,
-  kMaskRandom42_24,
-  kMaskRandom42_25,
-  kMaskRandom42_26,
-  kMaskRandom42_27,
-  kMaskRandom42_28,
-  kMaskRandom42_29,
-  kMaskRandom42_30,
-  kMaskRandom42_31,
-  kMaskRandom42_32,
-  kMaskRandom42_33,
-  kMaskRandom42_34,
-  kMaskRandom42_35,
-  kMaskRandom42_36,
-  kMaskRandom42_37,
-  kMaskRandom42_38,
-  kMaskRandom42_39,
-  kMaskRandom42_40,
-  kMaskRandom42_41,
-  kMaskRandom42_42
-};
-
-const uint8_t* const kPacketMaskRandom43[43] = {
-  kMaskRandom43_1,
-  kMaskRandom43_2,
-  kMaskRandom43_3,
-  kMaskRandom43_4,
-  kMaskRandom43_5,
-  kMaskRandom43_6,
-  kMaskRandom43_7,
-  kMaskRandom43_8,
-  kMaskRandom43_9,
-  kMaskRandom43_10,
-  kMaskRandom43_11,
-  kMaskRandom43_12,
-  kMaskRandom43_13,
-  kMaskRandom43_14,
-  kMaskRandom43_15,
-  kMaskRandom43_16,
-  kMaskRandom43_17,
-  kMaskRandom43_18,
-  kMaskRandom43_19,
-  kMaskRandom43_20,
-  kMaskRandom43_21,
-  kMaskRandom43_22,
-  kMaskRandom43_23,
-  kMaskRandom43_24,
-  kMaskRandom43_25,
-  kMaskRandom43_26,
-  kMaskRandom43_27,
-  kMaskRandom43_28,
-  kMaskRandom43_29,
-  kMaskRandom43_30,
-  kMaskRandom43_31,
-  kMaskRandom43_32,
-  kMaskRandom43_33,
-  kMaskRandom43_34,
-  kMaskRandom43_35,
-  kMaskRandom43_36,
-  kMaskRandom43_37,
-  kMaskRandom43_38,
-  kMaskRandom43_39,
-  kMaskRandom43_40,
-  kMaskRandom43_41,
-  kMaskRandom43_42,
-  kMaskRandom43_43
-};
-
-const uint8_t* const kPacketMaskRandom44[44] = {
-  kMaskRandom44_1,
-  kMaskRandom44_2,
-  kMaskRandom44_3,
-  kMaskRandom44_4,
-  kMaskRandom44_5,
-  kMaskRandom44_6,
-  kMaskRandom44_7,
-  kMaskRandom44_8,
-  kMaskRandom44_9,
-  kMaskRandom44_10,
-  kMaskRandom44_11,
-  kMaskRandom44_12,
-  kMaskRandom44_13,
-  kMaskRandom44_14,
-  kMaskRandom44_15,
-  kMaskRandom44_16,
-  kMaskRandom44_17,
-  kMaskRandom44_18,
-  kMaskRandom44_19,
-  kMaskRandom44_20,
-  kMaskRandom44_21,
-  kMaskRandom44_22,
-  kMaskRandom44_23,
-  kMaskRandom44_24,
-  kMaskRandom44_25,
-  kMaskRandom44_26,
-  kMaskRandom44_27,
-  kMaskRandom44_28,
-  kMaskRandom44_29,
-  kMaskRandom44_30,
-  kMaskRandom44_31,
-  kMaskRandom44_32,
-  kMaskRandom44_33,
-  kMaskRandom44_34,
-  kMaskRandom44_35,
-  kMaskRandom44_36,
-  kMaskRandom44_37,
-  kMaskRandom44_38,
-  kMaskRandom44_39,
-  kMaskRandom44_40,
-  kMaskRandom44_41,
-  kMaskRandom44_42,
-  kMaskRandom44_43,
-  kMaskRandom44_44
-};
-
-const uint8_t* const kPacketMaskRandom45[45] = {
-  kMaskRandom45_1,
-  kMaskRandom45_2,
-  kMaskRandom45_3,
-  kMaskRandom45_4,
-  kMaskRandom45_5,
-  kMaskRandom45_6,
-  kMaskRandom45_7,
-  kMaskRandom45_8,
-  kMaskRandom45_9,
-  kMaskRandom45_10,
-  kMaskRandom45_11,
-  kMaskRandom45_12,
-  kMaskRandom45_13,
-  kMaskRandom45_14,
-  kMaskRandom45_15,
-  kMaskRandom45_16,
-  kMaskRandom45_17,
-  kMaskRandom45_18,
-  kMaskRandom45_19,
-  kMaskRandom45_20,
-  kMaskRandom45_21,
-  kMaskRandom45_22,
-  kMaskRandom45_23,
-  kMaskRandom45_24,
-  kMaskRandom45_25,
-  kMaskRandom45_26,
-  kMaskRandom45_27,
-  kMaskRandom45_28,
-  kMaskRandom45_29,
-  kMaskRandom45_30,
-  kMaskRandom45_31,
-  kMaskRandom45_32,
-  kMaskRandom45_33,
-  kMaskRandom45_34,
-  kMaskRandom45_35,
-  kMaskRandom45_36,
-  kMaskRandom45_37,
-  kMaskRandom45_38,
-  kMaskRandom45_39,
-  kMaskRandom45_40,
-  kMaskRandom45_41,
-  kMaskRandom45_42,
-  kMaskRandom45_43,
-  kMaskRandom45_44,
-  kMaskRandom45_45
-};
-
-const uint8_t* const kPacketMaskRandom46[46] = {
-  kMaskRandom46_1,
-  kMaskRandom46_2,
-  kMaskRandom46_3,
-  kMaskRandom46_4,
-  kMaskRandom46_5,
-  kMaskRandom46_6,
-  kMaskRandom46_7,
-  kMaskRandom46_8,
-  kMaskRandom46_9,
-  kMaskRandom46_10,
-  kMaskRandom46_11,
-  kMaskRandom46_12,
-  kMaskRandom46_13,
-  kMaskRandom46_14,
-  kMaskRandom46_15,
-  kMaskRandom46_16,
-  kMaskRandom46_17,
-  kMaskRandom46_18,
-  kMaskRandom46_19,
-  kMaskRandom46_20,
-  kMaskRandom46_21,
-  kMaskRandom46_22,
-  kMaskRandom46_23,
-  kMaskRandom46_24,
-  kMaskRandom46_25,
-  kMaskRandom46_26,
-  kMaskRandom46_27,
-  kMaskRandom46_28,
-  kMaskRandom46_29,
-  kMaskRandom46_30,
-  kMaskRandom46_31,
-  kMaskRandom46_32,
-  kMaskRandom46_33,
-  kMaskRandom46_34,
-  kMaskRandom46_35,
-  kMaskRandom46_36,
-  kMaskRandom46_37,
-  kMaskRandom46_38,
-  kMaskRandom46_39,
-  kMaskRandom46_40,
-  kMaskRandom46_41,
-  kMaskRandom46_42,
-  kMaskRandom46_43,
-  kMaskRandom46_44,
-  kMaskRandom46_45,
-  kMaskRandom46_46
-};
-
-const uint8_t* const kPacketMaskRandom47[47] = {
-  kMaskRandom47_1,
-  kMaskRandom47_2,
-  kMaskRandom47_3,
-  kMaskRandom47_4,
-  kMaskRandom47_5,
-  kMaskRandom47_6,
-  kMaskRandom47_7,
-  kMaskRandom47_8,
-  kMaskRandom47_9,
-  kMaskRandom47_10,
-  kMaskRandom47_11,
-  kMaskRandom47_12,
-  kMaskRandom47_13,
-  kMaskRandom47_14,
-  kMaskRandom47_15,
-  kMaskRandom47_16,
-  kMaskRandom47_17,
-  kMaskRandom47_18,
-  kMaskRandom47_19,
-  kMaskRandom47_20,
-  kMaskRandom47_21,
-  kMaskRandom47_22,
-  kMaskRandom47_23,
-  kMaskRandom47_24,
-  kMaskRandom47_25,
-  kMaskRandom47_26,
-  kMaskRandom47_27,
-  kMaskRandom47_28,
-  kMaskRandom47_29,
-  kMaskRandom47_30,
-  kMaskRandom47_31,
-  kMaskRandom47_32,
-  kMaskRandom47_33,
-  kMaskRandom47_34,
-  kMaskRandom47_35,
-  kMaskRandom47_36,
-  kMaskRandom47_37,
-  kMaskRandom47_38,
-  kMaskRandom47_39,
-  kMaskRandom47_40,
-  kMaskRandom47_41,
-  kMaskRandom47_42,
-  kMaskRandom47_43,
-  kMaskRandom47_44,
-  kMaskRandom47_45,
-  kMaskRandom47_46,
-  kMaskRandom47_47
-};
-
-const uint8_t* const kPacketMaskRandom48[48] = {
-  kMaskRandom48_1,
-  kMaskRandom48_2,
-  kMaskRandom48_3,
-  kMaskRandom48_4,
-  kMaskRandom48_5,
-  kMaskRandom48_6,
-  kMaskRandom48_7,
-  kMaskRandom48_8,
-  kMaskRandom48_9,
-  kMaskRandom48_10,
-  kMaskRandom48_11,
-  kMaskRandom48_12,
-  kMaskRandom48_13,
-  kMaskRandom48_14,
-  kMaskRandom48_15,
-  kMaskRandom48_16,
-  kMaskRandom48_17,
-  kMaskRandom48_18,
-  kMaskRandom48_19,
-  kMaskRandom48_20,
-  kMaskRandom48_21,
-  kMaskRandom48_22,
-  kMaskRandom48_23,
-  kMaskRandom48_24,
-  kMaskRandom48_25,
-  kMaskRandom48_26,
-  kMaskRandom48_27,
-  kMaskRandom48_28,
-  kMaskRandom48_29,
-  kMaskRandom48_30,
-  kMaskRandom48_31,
-  kMaskRandom48_32,
-  kMaskRandom48_33,
-  kMaskRandom48_34,
-  kMaskRandom48_35,
-  kMaskRandom48_36,
-  kMaskRandom48_37,
-  kMaskRandom48_38,
-  kMaskRandom48_39,
-  kMaskRandom48_40,
-  kMaskRandom48_41,
-  kMaskRandom48_42,
-  kMaskRandom48_43,
-  kMaskRandom48_44,
-  kMaskRandom48_45,
-  kMaskRandom48_46,
-  kMaskRandom48_47,
-  kMaskRandom48_48
-};
-
-const uint8_t* const* const kPacketMaskRandomTbl[48] = {
-  kPacketMaskRandom1,
-  kPacketMaskRandom2,
-  kPacketMaskRandom3,
-  kPacketMaskRandom4,
-  kPacketMaskRandom5,
-  kPacketMaskRandom6,
-  kPacketMaskRandom7,
-  kPacketMaskRandom8,
-  kPacketMaskRandom9,
-  kPacketMaskRandom10,
-  kPacketMaskRandom11,
-  kPacketMaskRandom12,
-  kPacketMaskRandom13,
-  kPacketMaskRandom14,
-  kPacketMaskRandom15,
-  kPacketMaskRandom16,
-  kPacketMaskRandom17,
-  kPacketMaskRandom18,
-  kPacketMaskRandom19,
-  kPacketMaskRandom20,
-  kPacketMaskRandom21,
-  kPacketMaskRandom22,
-  kPacketMaskRandom23,
-  kPacketMaskRandom24,
-  kPacketMaskRandom25,
-  kPacketMaskRandom26,
-  kPacketMaskRandom27,
-  kPacketMaskRandom28,
-  kPacketMaskRandom29,
-  kPacketMaskRandom30,
-  kPacketMaskRandom31,
-  kPacketMaskRandom32,
-  kPacketMaskRandom33,
-  kPacketMaskRandom34,
-  kPacketMaskRandom35,
-  kPacketMaskRandom36,
-  kPacketMaskRandom37,
-  kPacketMaskRandom38,
-  kPacketMaskRandom39,
-  kPacketMaskRandom40,
-  kPacketMaskRandom41,
-  kPacketMaskRandom42,
-  kPacketMaskRandom43,
-  kPacketMaskRandom44,
-  kPacketMaskRandom45,
-  kPacketMaskRandom46,
-  kPacketMaskRandom47,
-  kPacketMaskRandom48
-};
-
-}  // namespace fec_private_tables
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_RTP_RTCP_SOURCE_FEC_PRIVATE_TABLES_RANDOM_H_
diff --git a/modules/rtp_rtcp/source/fec_test_helper.cc b/modules/rtp_rtcp/source/fec_test_helper.cc
deleted file mode 100644
index 45dfbf5..0000000
--- a/modules/rtp_rtcp/source/fec_test_helper.cc
+++ /dev/null
@@ -1,217 +0,0 @@
-/*
- *  Copyright (c) 2012 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/rtp_rtcp/source/fec_test_helper.h"
-
-#include <memory>
-#include <utility>
-
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
-#include "webrtc/modules/rtp_rtcp/source/byte_io.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_utility.h"
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-namespace test {
-namespace fec {
-
-namespace {
-constexpr uint8_t kFecPayloadType = 96;
-constexpr uint8_t kRedPayloadType = 97;
-constexpr uint8_t kVp8PayloadType = 120;
-
-constexpr int kPacketTimestampIncrement = 3000;
-}  // namespace
-
-ForwardErrorCorrection::PacketList MediaPacketGenerator::ConstructMediaPackets(
-    int num_media_packets,
-    uint16_t start_seq_num) {
-  RTC_DCHECK_GT(num_media_packets, 0);
-  uint16_t seq_num = start_seq_num;
-  int time_stamp = random_->Rand<int>();
-
-  ForwardErrorCorrection::PacketList media_packets;
-
-  for (int i = 0; i < num_media_packets; ++i) {
-    std::unique_ptr<ForwardErrorCorrection::Packet> media_packet(
-        new ForwardErrorCorrection::Packet());
-    media_packet->length = random_->Rand(min_packet_size_, max_packet_size_);
-
-    // Generate random values for the first 2 bytes
-    media_packet->data[0] = random_->Rand<uint8_t>();
-    media_packet->data[1] = random_->Rand<uint8_t>();
-
-    // The first two bits are assumed to be 10 by the FEC encoder.
-    // In fact the FEC decoder will set the two first bits to 10 regardless of
-    // what they actually were. Set the first two bits to 10 so that a memcmp
-    // can be performed for the whole restored packet.
-    media_packet->data[0] |= 0x80;
-    media_packet->data[0] &= 0xbf;
-
-    // FEC is applied to a whole frame.
-    // A frame is signaled by multiple packets without the marker bit set
-    // followed by the last packet of the frame for which the marker bit is set.
-    // Only push one (fake) frame to the FEC.
-    media_packet->data[1] &= 0x7f;
-
-    webrtc::ByteWriter<uint16_t>::WriteBigEndian(&media_packet->data[2],
-                                                 seq_num);
-    webrtc::ByteWriter<uint32_t>::WriteBigEndian(&media_packet->data[4],
-                                                 time_stamp);
-    webrtc::ByteWriter<uint32_t>::WriteBigEndian(&media_packet->data[8], ssrc_);
-
-    // Generate random values for payload.
-    for (size_t j = 12; j < media_packet->length; ++j)
-      media_packet->data[j] = random_->Rand<uint8_t>();
-    seq_num++;
-    media_packets.push_back(std::move(media_packet));
-  }
-  // Last packet, set marker bit.
-  ForwardErrorCorrection::Packet* media_packet = media_packets.back().get();
-  RTC_DCHECK(media_packet);
-  media_packet->data[1] |= 0x80;
-
-  next_seq_num_ = seq_num;
-
-  return media_packets;
-}
-
-ForwardErrorCorrection::PacketList MediaPacketGenerator::ConstructMediaPackets(
-    int num_media_packets) {
-  return ConstructMediaPackets(num_media_packets, random_->Rand<uint16_t>());
-}
-
-uint16_t MediaPacketGenerator::GetNextSeqNum() {
-  return next_seq_num_;
-}
-
-AugmentedPacketGenerator::AugmentedPacketGenerator(uint32_t ssrc)
-    : num_packets_(0), ssrc_(ssrc), seq_num_(0), timestamp_(0) {}
-
-void AugmentedPacketGenerator::NewFrame(size_t num_packets) {
-  num_packets_ = num_packets;
-  timestamp_ += kPacketTimestampIncrement;
-}
-
-uint16_t AugmentedPacketGenerator::NextPacketSeqNum() {
-  return ++seq_num_;
-}
-
-std::unique_ptr<AugmentedPacket> AugmentedPacketGenerator::NextPacket(
-    size_t offset,
-    size_t length) {
-  std::unique_ptr<AugmentedPacket> packet(new AugmentedPacket());
-
-  for (size_t i = 0; i < length; ++i)
-    packet->data[i + kRtpHeaderSize] = offset + i;
-  packet->length = length + kRtpHeaderSize;
-  memset(&packet->header, 0, sizeof(WebRtcRTPHeader));
-  packet->header.frameType = kVideoFrameDelta;
-  packet->header.header.headerLength = kRtpHeaderSize;
-  packet->header.header.markerBit = (num_packets_ == 1);
-  packet->header.header.payloadType = kVp8PayloadType;
-  packet->header.header.sequenceNumber = seq_num_;
-  packet->header.header.timestamp = timestamp_;
-  packet->header.header.ssrc = ssrc_;
-  WriteRtpHeader(packet->header.header, packet->data);
-  ++seq_num_;
-  --num_packets_;
-
-  return packet;
-}
-
-void AugmentedPacketGenerator::WriteRtpHeader(const RTPHeader& header,
-                                              uint8_t* data) {
-  data[0] = 0x80;  // Version 2.
-  data[1] = header.payloadType;
-  data[1] |= (header.markerBit ? kRtpMarkerBitMask : 0);
-  ByteWriter<uint16_t>::WriteBigEndian(data + 2, header.sequenceNumber);
-  ByteWriter<uint32_t>::WriteBigEndian(data + 4, header.timestamp);
-  ByteWriter<uint32_t>::WriteBigEndian(data + 8, header.ssrc);
-}
-
-FlexfecPacketGenerator::FlexfecPacketGenerator(uint32_t media_ssrc,
-                                               uint32_t flexfec_ssrc)
-    : AugmentedPacketGenerator(media_ssrc),
-      flexfec_ssrc_(flexfec_ssrc),
-      flexfec_seq_num_(0),
-      flexfec_timestamp_(0) {}
-
-std::unique_ptr<AugmentedPacket> FlexfecPacketGenerator::BuildFlexfecPacket(
-    const ForwardErrorCorrection::Packet& packet) {
-  RTC_DCHECK_LE(packet.length,
-                static_cast<size_t>(IP_PACKET_SIZE - kRtpHeaderSize));
-
-  RTPHeader header;
-  header.sequenceNumber = flexfec_seq_num_;
-  ++flexfec_seq_num_;
-  header.timestamp = flexfec_timestamp_;
-  flexfec_timestamp_ += kPacketTimestampIncrement;
-  header.ssrc = flexfec_ssrc_;
-
-  std::unique_ptr<AugmentedPacket> packet_with_rtp_header(
-      new AugmentedPacket());
-  WriteRtpHeader(header, packet_with_rtp_header->data);
-  memcpy(packet_with_rtp_header->data + kRtpHeaderSize, packet.data,
-         packet.length);
-  packet_with_rtp_header->length = kRtpHeaderSize + packet.length;
-
-  return packet_with_rtp_header;
-}
-
-UlpfecPacketGenerator::UlpfecPacketGenerator(uint32_t ssrc)
-    : AugmentedPacketGenerator(ssrc) {}
-
-std::unique_ptr<AugmentedPacket> UlpfecPacketGenerator::BuildMediaRedPacket(
-    const AugmentedPacket& packet) {
-  std::unique_ptr<AugmentedPacket> red_packet(new AugmentedPacket());
-
-  const size_t kHeaderLength = packet.header.header.headerLength;
-  red_packet->header = packet.header;
-  red_packet->length = packet.length + 1;  // 1 byte RED header.
-  // Copy RTP header.
-  memcpy(red_packet->data, packet.data, kHeaderLength);
-  SetRedHeader(red_packet->data[1] & 0x7f, kHeaderLength, red_packet.get());
-  memcpy(red_packet->data + kHeaderLength + 1, packet.data + kHeaderLength,
-         packet.length - kHeaderLength);
-
-  return red_packet;
-}
-
-std::unique_ptr<AugmentedPacket> UlpfecPacketGenerator::BuildUlpfecRedPacket(
-    const ForwardErrorCorrection::Packet& packet) {
-  // Create a fake media packet to get a correct header. 1 byte RED header.
-  ++num_packets_;
-  std::unique_ptr<AugmentedPacket> red_packet =
-      NextPacket(0, packet.length + 1);
-
-  red_packet->data[1] &= ~0x80;  // Clear marker bit.
-  const size_t kHeaderLength = red_packet->header.header.headerLength;
-  SetRedHeader(kFecPayloadType, kHeaderLength, red_packet.get());
-  memcpy(red_packet->data + kHeaderLength + 1, packet.data, packet.length);
-  red_packet->length = kHeaderLength + 1 + packet.length;
-
-  return red_packet;
-}
-
-void UlpfecPacketGenerator::SetRedHeader(uint8_t payload_type,
-                                         size_t header_length,
-                                         AugmentedPacket* red_packet) {
-  // Replace payload type.
-  red_packet->data[1] &= 0x80;             // Reset.
-  red_packet->data[1] += kRedPayloadType;  // Replace.
-
-  // Add RED header, f-bit always 0.
-  red_packet->data[header_length] = payload_type;
-}
-
-}  // namespace fec
-}  // namespace test
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/fec_test_helper.h b/modules/rtp_rtcp/source/fec_test_helper.h
deleted file mode 100644
index fce99dc..0000000
--- a/modules/rtp_rtcp/source/fec_test_helper.h
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- *  Copyright (c) 2012 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_RTP_RTCP_SOURCE_FEC_TEST_HELPER_H_
-#define WEBRTC_MODULES_RTP_RTCP_SOURCE_FEC_TEST_HELPER_H_
-
-#include <memory>
-
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/modules/rtp_rtcp/source/forward_error_correction.h"
-#include "webrtc/rtc_base/basictypes.h"
-#include "webrtc/rtc_base/random.h"
-
-namespace webrtc {
-namespace test {
-namespace fec {
-
-struct AugmentedPacket : public ForwardErrorCorrection::Packet {
-  WebRtcRTPHeader header;
-};
-
-// TODO(brandtr): Consider merging MediaPacketGenerator and
-// AugmentedPacketGenerator into a single class, since their functionality is
-// similar.
-
-// This class generates media packets corresponding to a single frame.
-class MediaPacketGenerator {
- public:
-  MediaPacketGenerator(uint32_t min_packet_size,
-                       uint32_t max_packet_size,
-                       uint32_t ssrc,
-                       Random* random)
-      : min_packet_size_(min_packet_size),
-        max_packet_size_(max_packet_size),
-        ssrc_(ssrc),
-        random_(random) {}
-
-  // Construct the media packets, up to |num_media_packets| packets.
-  ForwardErrorCorrection::PacketList ConstructMediaPackets(
-      int num_media_packets,
-      uint16_t start_seq_num);
-  ForwardErrorCorrection::PacketList ConstructMediaPackets(
-      int num_media_packets);
-
-  uint16_t GetNextSeqNum();
-
- private:
-  uint32_t min_packet_size_;
-  uint32_t max_packet_size_;
-  uint32_t ssrc_;
-  Random* random_;
-
-  ForwardErrorCorrection::PacketList media_packets_;
-  uint16_t next_seq_num_;
-};
-
-// This class generates media packets with a certain structure of the payload.
-class AugmentedPacketGenerator {
- public:
-  explicit AugmentedPacketGenerator(uint32_t ssrc);
-
-  // Prepare for generating a new set of packets, corresponding to a frame.
-  void NewFrame(size_t num_packets);
-
-  // Increment and return the newly incremented sequence number.
-  uint16_t NextPacketSeqNum();
-
-  // Return the next packet in the current frame.
-  std::unique_ptr<AugmentedPacket> NextPacket(size_t offset, size_t length);
-
- protected:
-  // Given |header|, writes the appropriate RTP header fields in |data|.
-  static void WriteRtpHeader(const RTPHeader& header, uint8_t* data);
-
-  // Number of packets left to generate, in the current frame.
-  size_t num_packets_;
-
- private:
-  uint32_t ssrc_;
-  uint16_t seq_num_;
-  uint32_t timestamp_;
-};
-
-// This class generates media and FlexFEC packets for a single frame.
-class FlexfecPacketGenerator : public AugmentedPacketGenerator {
- public:
-  FlexfecPacketGenerator(uint32_t media_ssrc, uint32_t flexfec_ssrc);
-
-  // Creates a new AugmentedPacket (with RTP headers) from a
-  // FlexFEC packet (without RTP headers).
-  std::unique_ptr<AugmentedPacket> BuildFlexfecPacket(
-      const ForwardErrorCorrection::Packet& packet);
-
- private:
-  uint32_t flexfec_ssrc_;
-  uint16_t flexfec_seq_num_;
-  uint32_t flexfec_timestamp_;
-};
-
-// This class generates media and ULPFEC packets (both encapsulated in RED)
-// for a single frame.
-class UlpfecPacketGenerator : public AugmentedPacketGenerator {
- public:
-  explicit UlpfecPacketGenerator(uint32_t ssrc);
-
-  // Creates a new AugmentedPacket with the RED header added to the packet.
-  static std::unique_ptr<AugmentedPacket> BuildMediaRedPacket(
-      const AugmentedPacket& packet);
-
-  // Creates a new AugmentedPacket with FEC payload and RED header. Does this by
-  // creating a new fake media AugmentedPacket, clears the marker bit and adds a
-  // RED header. Finally replaces the payload with the content of
-  // |packet->data|.
-  std::unique_ptr<AugmentedPacket> BuildUlpfecRedPacket(
-      const ForwardErrorCorrection::Packet& packet);
-
- private:
-  static void SetRedHeader(uint8_t payload_type,
-                           size_t header_length,
-                           AugmentedPacket* red_packet);
-};
-
-}  // namespace fec
-}  // namespace test
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_RTP_RTCP_SOURCE_FEC_TEST_HELPER_H_
diff --git a/modules/rtp_rtcp/source/flexfec_header_reader_writer.cc b/modules/rtp_rtcp/source/flexfec_header_reader_writer.cc
deleted file mode 100644
index d1a1b04..0000000
--- a/modules/rtp_rtcp/source/flexfec_header_reader_writer.cc
+++ /dev/null
@@ -1,311 +0,0 @@
-/*
- *  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/rtp_rtcp/source/flexfec_header_reader_writer.h"
-
-#include <string.h>
-
-#include <utility>
-
-#include "webrtc/modules/rtp_rtcp/source/byte_io.h"
-#include "webrtc/modules/rtp_rtcp/source/forward_error_correction_internal.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-
-namespace webrtc {
-
-namespace {
-
-// Maximum number of media packets that can be protected in one batch.
-constexpr size_t kMaxMediaPackets = 48;  // Since we are reusing ULPFEC masks.
-
-// Maximum number of FEC packets stored inside ForwardErrorCorrection.
-constexpr size_t kMaxFecPackets = kMaxMediaPackets;
-
-// Size (in bytes) of packet masks, given number of K bits set.
-constexpr size_t kFlexfecPacketMaskSizes[] = {2, 6, 14};
-
-// Size (in bytes) of part of header which is not packet mask specific.
-constexpr size_t kBaseHeaderSize = 12;
-
-// Size (in bytes) of part of header which is stream specific.
-constexpr size_t kStreamSpecificHeaderSize = 6;
-
-// Size (in bytes) of header, given the single stream packet mask size, i.e.
-// the number of K-bits set.
-constexpr size_t kHeaderSizes[] = {
-    kBaseHeaderSize + kStreamSpecificHeaderSize + kFlexfecPacketMaskSizes[0],
-    kBaseHeaderSize + kStreamSpecificHeaderSize + kFlexfecPacketMaskSizes[1],
-    kBaseHeaderSize + kStreamSpecificHeaderSize + kFlexfecPacketMaskSizes[2]};
-
-// We currently only support single-stream protection.
-// TODO(brandtr): Update this when we support multistream protection.
-constexpr uint8_t kSsrcCount = 1;
-
-// There are three reserved bytes that MUST be set to zero in the header.
-constexpr uint32_t kReservedBits = 0;
-
-// TODO(brandtr): Update this when we support multistream protection.
-constexpr size_t kPacketMaskOffset =
-    kBaseHeaderSize + kStreamSpecificHeaderSize;
-
-// Here we count the K-bits as belonging to the packet mask.
-// This can be used in conjunction with FlexfecHeaderWriter::MinPacketMaskSize,
-// which calculates a bound on the needed packet mask size including K-bits,
-// given a packet mask without K-bits.
-size_t FlexfecHeaderSize(size_t packet_mask_size) {
-  RTC_DCHECK_LE(packet_mask_size, kFlexfecPacketMaskSizes[2]);
-  if (packet_mask_size <= kFlexfecPacketMaskSizes[0]) {
-    return kHeaderSizes[0];
-  } else if (packet_mask_size <= kFlexfecPacketMaskSizes[1]) {
-    return kHeaderSizes[1];
-  }
-  return kHeaderSizes[2];
-}
-
-}  // namespace
-
-FlexfecHeaderReader::FlexfecHeaderReader()
-    : FecHeaderReader(kMaxMediaPackets, kMaxFecPackets) {}
-
-FlexfecHeaderReader::~FlexfecHeaderReader() = default;
-
-// TODO(brandtr): Update this function when we support flexible masks,
-// retransmissions, and/or several protected SSRCs.
-bool FlexfecHeaderReader::ReadFecHeader(
-    ForwardErrorCorrection::ReceivedFecPacket* fec_packet) const {
-  if (fec_packet->pkt->length <= kBaseHeaderSize + kStreamSpecificHeaderSize) {
-    LOG(LS_WARNING) << "Discarding truncated FlexFEC packet.";
-    return false;
-  }
-  bool r_bit = (fec_packet->pkt->data[0] & 0x80) != 0;
-  if (r_bit) {
-    LOG(LS_INFO) << "FlexFEC packet with retransmission bit set. We do not yet "
-                    "support this, thus discarding the packet.";
-    return false;
-  }
-  bool f_bit = (fec_packet->pkt->data[0] & 0x40) != 0;
-  if (f_bit) {
-    LOG(LS_INFO) << "FlexFEC packet with inflexible generator matrix. We do "
-                    "not yet support this, thus discarding packet.";
-    return false;
-  }
-  uint8_t ssrc_count =
-      ByteReader<uint8_t>::ReadBigEndian(&fec_packet->pkt->data[8]);
-  if (ssrc_count != 1) {
-    LOG(LS_INFO) << "FlexFEC packet protecting multiple media SSRCs. We do not "
-                    "yet support this, thus discarding packet.";
-    return false;
-  }
-  uint32_t protected_ssrc =
-      ByteReader<uint32_t>::ReadBigEndian(&fec_packet->pkt->data[12]);
-  uint16_t seq_num_base =
-      ByteReader<uint16_t>::ReadBigEndian(&fec_packet->pkt->data[16]);
-
-  // Parse the FlexFEC packet mask and remove the interleaved K-bits.
-  // (See FEC header schematic in flexfec_header_reader_writer.h.)
-  // We store the packed packet mask in-band, which "destroys" the standards
-  // compliance of the header. That is fine though, since the code that
-  // reads from the header (from this point and onwards) is aware of this.
-  // TODO(brandtr): When the FEC packet classes have been refactored, store
-  // the packed packet masks out-of-band, thus leaving the FlexFEC header as is.
-  //
-  // We treat the mask parts as unsigned integers with host order endianness
-  // in order to simplify the bit shifting between bytes.
-  if (fec_packet->pkt->length < kHeaderSizes[0]) {
-    LOG(LS_WARNING) << "Discarding truncated FlexFEC packet.";
-    return false;
-  }
-  uint8_t* const packet_mask = fec_packet->pkt->data + kPacketMaskOffset;
-  bool k_bit0 = (packet_mask[0] & 0x80) != 0;
-  uint16_t mask_part0 = ByteReader<uint16_t>::ReadBigEndian(&packet_mask[0]);
-  // Shift away K-bit 0, implicitly clearing the last bit.
-  mask_part0 <<= 1;
-  ByteWriter<uint16_t>::WriteBigEndian(&packet_mask[0], mask_part0);
-  size_t packet_mask_size;
-  if (k_bit0) {
-    // The first K-bit is set, and the packet mask is thus only 2 bytes long.
-    // We have now read the entire FEC header, and the rest of the packet
-    // is payload.
-    packet_mask_size = kFlexfecPacketMaskSizes[0];
-  } else {
-    if (fec_packet->pkt->length < kHeaderSizes[1]) {
-      return false;
-    }
-    bool k_bit1 = (packet_mask[2] & 0x80) != 0;
-    // We have already shifted the first two bytes of the packet mask one step
-    // to the left, thus removing K-bit 0. We will now shift the next four bytes
-    // of the packet mask two steps to the left. (One step for the removed
-    // K-bit 0, and one step for the to be removed K-bit 1).
-    uint8_t bit15 = (packet_mask[2] >> 6) & 0x01;
-    packet_mask[1] |= bit15;
-    uint32_t mask_part1 = ByteReader<uint32_t>::ReadBigEndian(&packet_mask[2]);
-    // Shift away K-bit 1 and bit 15, implicitly clearing the last two bits.
-    mask_part1 <<= 2;
-    ByteWriter<uint32_t>::WriteBigEndian(&packet_mask[2], mask_part1);
-    if (k_bit1) {
-      // The first K-bit is clear, but the second K-bit is set. The packet
-      // mask is thus 6 bytes long.  We have now read the entire FEC header,
-      // and the rest of the packet is payload.
-      packet_mask_size = kFlexfecPacketMaskSizes[1];
-    } else {
-      if (fec_packet->pkt->length < kHeaderSizes[2]) {
-        LOG(LS_WARNING) << "Discarding truncated FlexFEC packet.";
-        return false;
-      }
-      bool k_bit2 = (packet_mask[6] & 0x80) != 0;
-      if (k_bit2) {
-        // The first and second K-bits are clear, but the third K-bit is set.
-        // The packet mask is thus 14 bytes long. We have now read the entire
-        // FEC header, and the rest of the packet is payload.
-        packet_mask_size = kFlexfecPacketMaskSizes[2];
-      } else {
-        LOG(LS_WARNING) << "Discarding FlexFEC packet with malformed header.";
-        return false;
-      }
-      // At this point, K-bits 0 and 1 have been removed, and the front-most
-      // part of the FlexFEC packet mask has been packed accordingly. We will
-      // now shift the remaning part of the packet mask three steps to the left.
-      // This corresponds to the (in total) three K-bits, which have been
-      // removed.
-      uint8_t tail_bits = (packet_mask[6] >> 5) & 0x03;
-      packet_mask[5] |= tail_bits;
-      uint64_t mask_part2 =
-          ByteReader<uint64_t>::ReadBigEndian(&packet_mask[6]);
-      // Shift away K-bit 2, bit 46, and bit 47, implicitly clearing the last
-      // three bits.
-      mask_part2 <<= 3;
-      ByteWriter<uint64_t>::WriteBigEndian(&packet_mask[6], mask_part2);
-    }
-  }
-
-  // Store "ULPFECized" packet mask info.
-  fec_packet->fec_header_size = FlexfecHeaderSize(packet_mask_size);
-  fec_packet->protected_ssrc = protected_ssrc;
-  fec_packet->seq_num_base = seq_num_base;
-  fec_packet->packet_mask_offset = kPacketMaskOffset;
-  fec_packet->packet_mask_size = packet_mask_size;
-
-  // In FlexFEC, all media packets are protected in their entirety.
-  fec_packet->protection_length =
-      fec_packet->pkt->length - fec_packet->fec_header_size;
-
-  return true;
-}
-
-FlexfecHeaderWriter::FlexfecHeaderWriter()
-    : FecHeaderWriter(kMaxMediaPackets, kMaxFecPackets, kHeaderSizes[2]) {}
-
-FlexfecHeaderWriter::~FlexfecHeaderWriter() = default;
-
-size_t FlexfecHeaderWriter::MinPacketMaskSize(const uint8_t* packet_mask,
-                                              size_t packet_mask_size) const {
-  if (packet_mask_size == kUlpfecPacketMaskSizeLBitClear &&
-      (packet_mask[1] & 0x01) == 0) {
-    // Packet mask is 16 bits long, with bit 15 clear.
-    // It can be used as is.
-    return kFlexfecPacketMaskSizes[0];
-  } else if (packet_mask_size == kUlpfecPacketMaskSizeLBitClear) {
-    // Packet mask is 16 bits long, with bit 15 set.
-    // We must expand the packet mask with zeros in the FlexFEC header.
-    return kFlexfecPacketMaskSizes[1];
-  } else if (packet_mask_size == kUlpfecPacketMaskSizeLBitSet &&
-             (packet_mask[5] & 0x03) == 0) {
-    // Packet mask is 48 bits long, with bits 46 and 47 clear.
-    // It can be used as is.
-    return kFlexfecPacketMaskSizes[1];
-  } else if (packet_mask_size == kUlpfecPacketMaskSizeLBitSet) {
-    // Packet mask is 48 bits long, with at least one of bits 46 and 47 set.
-    // We must expand it with zeros.
-    return kFlexfecPacketMaskSizes[2];
-  }
-  RTC_NOTREACHED() << "Incorrect packet mask size: " << packet_mask_size << ".";
-  return kFlexfecPacketMaskSizes[2];
-}
-
-size_t FlexfecHeaderWriter::FecHeaderSize(size_t packet_mask_size) const {
-  return FlexfecHeaderSize(packet_mask_size);
-}
-
-// This function adapts the precomputed ULPFEC packet masks to the
-// FlexFEC header standard. Note that the header size is computed by
-// FecHeaderSize(), so in this function we can be sure that we are
-// writing in space that is intended for the header.
-//
-// TODO(brandtr): Update this function when we support offset-based masks,
-// retransmissions, and protecting multiple SSRCs.
-void FlexfecHeaderWriter::FinalizeFecHeader(
-    uint32_t media_ssrc,
-    uint16_t seq_num_base,
-    const uint8_t* packet_mask,
-    size_t packet_mask_size,
-    ForwardErrorCorrection::Packet* fec_packet) const {
-  fec_packet->data[0] &= 0x7f;  // Clear R bit.
-  fec_packet->data[0] &= 0xbf;  // Clear F bit.
-  ByteWriter<uint8_t>::WriteBigEndian(&fec_packet->data[8], kSsrcCount);
-  ByteWriter<uint32_t, 3>::WriteBigEndian(&fec_packet->data[9], kReservedBits);
-  ByteWriter<uint32_t>::WriteBigEndian(&fec_packet->data[12], media_ssrc);
-  ByteWriter<uint16_t>::WriteBigEndian(&fec_packet->data[16], seq_num_base);
-  // Adapt ULPFEC packet mask to FlexFEC header.
-  //
-  // We treat the mask parts as unsigned integers with host order endianness
-  // in order to simplify the bit shifting between bytes.
-  uint8_t* const written_packet_mask = fec_packet->data + kPacketMaskOffset;
-  if (packet_mask_size == kUlpfecPacketMaskSizeLBitSet) {
-    // The packet mask is 48 bits long.
-    uint16_t tmp_mask_part0 =
-        ByteReader<uint16_t>::ReadBigEndian(&packet_mask[0]);
-    uint32_t tmp_mask_part1 =
-        ByteReader<uint32_t>::ReadBigEndian(&packet_mask[2]);
-
-    tmp_mask_part0 >>= 1;  // Shift, thus clearing K-bit 0.
-    ByteWriter<uint16_t>::WriteBigEndian(&written_packet_mask[0],
-                                         tmp_mask_part0);
-    tmp_mask_part1 >>= 2;  // Shift, thus clearing K-bit 1 and bit 15.
-    ByteWriter<uint32_t>::WriteBigEndian(&written_packet_mask[2],
-                                         tmp_mask_part1);
-    bool bit15 = (packet_mask[1] & 0x01) != 0;
-    if (bit15)
-      written_packet_mask[2] |= 0x40;  // Set bit 15.
-    bool bit46 = (packet_mask[5] & 0x02) != 0;
-    bool bit47 = (packet_mask[5] & 0x01) != 0;
-    if (!bit46 && !bit47) {
-      written_packet_mask[2] |= 0x80;  // Set K-bit 1.
-    } else {
-      memset(&written_packet_mask[6], 0, 8);  // Clear all trailing bits.
-      written_packet_mask[6] |= 0x80;         // Set K-bit 2.
-      if (bit46)
-        written_packet_mask[6] |= 0x40;  // Set bit 46.
-      if (bit47)
-        written_packet_mask[6] |= 0x20;  // Set bit 47.
-    }
-  } else if (packet_mask_size == kUlpfecPacketMaskSizeLBitClear) {
-    // The packet mask is 16 bits long.
-    uint16_t tmp_mask_part0 =
-        ByteReader<uint16_t>::ReadBigEndian(&packet_mask[0]);
-
-    tmp_mask_part0 >>= 1;  // Shift, thus clearing K-bit 0.
-    ByteWriter<uint16_t>::WriteBigEndian(&written_packet_mask[0],
-                                         tmp_mask_part0);
-    bool bit15 = (packet_mask[1] & 0x01) != 0;
-    if (!bit15) {
-      written_packet_mask[0] |= 0x80;  // Set K-bit 0.
-    } else {
-      memset(&written_packet_mask[2], 0U, 4);  // Clear all trailing bits.
-      written_packet_mask[2] |= 0x80;          // Set K-bit 1.
-      written_packet_mask[2] |= 0x40;          // Set bit 15.
-    }
-  } else {
-    RTC_NOTREACHED() << "Incorrect packet mask size: " << packet_mask_size
-                     << ".";
-  }
-}
-
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/flexfec_header_reader_writer.h b/modules/rtp_rtcp/source/flexfec_header_reader_writer.h
deleted file mode 100644
index 720a8b6..0000000
--- a/modules/rtp_rtcp/source/flexfec_header_reader_writer.h
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- *  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_RTP_RTCP_SOURCE_FLEXFEC_HEADER_READER_WRITER_H_
-#define WEBRTC_MODULES_RTP_RTCP_SOURCE_FLEXFEC_HEADER_READER_WRITER_H_
-
-#include "webrtc/modules/rtp_rtcp/source/forward_error_correction.h"
-#include "webrtc/rtc_base/basictypes.h"
-
-namespace webrtc {
-
-// FlexFEC header, minimum 20 bytes.
-//     0                   1                   2                   3
-//     0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
-//    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//  0 |R|F|P|X|  CC   |M| PT recovery |        length recovery        |
-//    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//  4 |                          TS recovery                          |
-//    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//  8 |   SSRCCount   |                    reserved                   |
-//    +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
-// 12 |                             SSRC_i                            |
-//    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-// 16 |           SN base_i           |k|          Mask [0-14]        |
-//    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-// 20 |k|                   Mask [15-45] (optional)                   |
-//    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-// 24 |k|                                                             |
-//    +-+                   Mask [46-108] (optional)                  |
-// 28 |                                                               |
-//    +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
-//    :                     ... next in SSRC_i ...                    :
-//
-//
-// FlexFEC header in 'inflexible' mode (F = 1), 20 bytes.
-//     0                   1                   2                   3
-//     0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
-//    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//  0 |0|1|P|X|  CC   |M| PT recovery |        length recovery        |
-//    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//  4 |                          TS recovery                          |
-//    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//  8 |   SSRCCount   |                    reserved                   |
-//    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-// 12 |                             SSRC_i                            |
-//    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-// 16 |           SN base_i           |  M (columns)  |    N (rows)   |
-//    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-
-class FlexfecHeaderReader : public FecHeaderReader {
- public:
-  FlexfecHeaderReader();
-  ~FlexfecHeaderReader() override;
-
-  bool ReadFecHeader(
-      ForwardErrorCorrection::ReceivedFecPacket* fec_packet) const override;
-};
-
-class FlexfecHeaderWriter : public FecHeaderWriter {
- public:
-  FlexfecHeaderWriter();
-  ~FlexfecHeaderWriter() override;
-
-  size_t MinPacketMaskSize(const uint8_t* packet_mask,
-                           size_t packet_mask_size) const override;
-
-  size_t FecHeaderSize(size_t packet_mask_row_size) const override;
-
-  void FinalizeFecHeader(
-      uint32_t media_ssrc,
-      uint16_t seq_num_base,
-      const uint8_t* packet_mask,
-      size_t packet_mask_size,
-      ForwardErrorCorrection::Packet* fec_packet) const override;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_RTP_RTCP_SOURCE_FLEXFEC_HEADER_READER_WRITER_H_
diff --git a/modules/rtp_rtcp/source/flexfec_header_reader_writer_unittest.cc b/modules/rtp_rtcp/source/flexfec_header_reader_writer_unittest.cc
deleted file mode 100644
index 6b7c9c5..0000000
--- a/modules/rtp_rtcp/source/flexfec_header_reader_writer_unittest.cc
+++ /dev/null
@@ -1,559 +0,0 @@
-/*
- *  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 <string.h>
-
-#include <memory>
-#include <utility>
-
-#include "webrtc/modules/rtp_rtcp/source/byte_io.h"
-#include "webrtc/modules/rtp_rtcp/source/flexfec_header_reader_writer.h"
-#include "webrtc/modules/rtp_rtcp/source/forward_error_correction.h"
-#include "webrtc/modules/rtp_rtcp/source/forward_error_correction_internal.h"
-#include "webrtc/rtc_base/basictypes.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/random.h"
-#include "webrtc/rtc_base/scoped_ref_ptr.h"
-#include "webrtc/test/gmock.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-namespace {
-
-using Packet = ForwardErrorCorrection::Packet;
-using ReceivedFecPacket = ForwardErrorCorrection::ReceivedFecPacket;
-
-// General. Assume single-stream protection.
-constexpr uint32_t kMediaSsrc = 1254983;
-constexpr uint16_t kMediaStartSeqNum = 825;
-constexpr size_t kMediaPacketLength = 1234;
-constexpr uint32_t kFlexfecSsrc = 52142;
-
-constexpr size_t kFlexfecHeaderSizes[] = {20, 24, 32};
-constexpr size_t kFlexfecPacketMaskOffset = 18;
-constexpr size_t kFlexfecPacketMaskSizes[] = {2, 6, 14};
-constexpr size_t kFlexfecMaxPacketSize = kFlexfecPacketMaskSizes[2];
-
-// Reader tests.
-constexpr uint8_t kNoRBit = 0 << 7;
-constexpr uint8_t kNoFBit = 0 << 6;
-constexpr uint8_t kPtRecovery = 123;
-constexpr uint8_t kLengthRecov[] = {0xab, 0xcd};
-constexpr uint8_t kTsRecovery[] = {0x01, 0x23, 0x45, 0x67};
-constexpr uint8_t kSsrcCount = 1;
-constexpr uint8_t kReservedBits = 0x00;
-constexpr uint8_t kProtSsrc[] = {0x11, 0x22, 0x33, 0x44};
-constexpr uint8_t kSnBase[] = {0xaa, 0xbb};
-constexpr uint8_t kPayloadBits = 0x00;
-
-std::unique_ptr<uint8_t[]> GeneratePacketMask(size_t packet_mask_size,
-                                              uint64_t seed) {
-  Random random(seed);
-  std::unique_ptr<uint8_t[]> packet_mask(new uint8_t[kFlexfecMaxPacketSize]);
-  memset(packet_mask.get(), 0, kFlexfecMaxPacketSize);
-  for (size_t i = 0; i < packet_mask_size; ++i) {
-    packet_mask[i] = random.Rand<uint8_t>();
-  }
-  return packet_mask;
-}
-
-void ClearBit(size_t index, uint8_t* packet_mask) {
-  packet_mask[index / 8] &= ~(1 << (7 - index % 8));
-}
-
-void SetBit(size_t index, uint8_t* packet_mask) {
-  packet_mask[index / 8] |= (1 << (7 - index % 8));
-}
-
-rtc::scoped_refptr<Packet> WriteHeader(const uint8_t* packet_mask,
-                                       size_t packet_mask_size) {
-  FlexfecHeaderWriter writer;
-  rtc::scoped_refptr<Packet> written_packet(new Packet());
-  written_packet->length = kMediaPacketLength;
-  for (size_t i = 0; i < written_packet->length; ++i) {
-    written_packet->data[i] = i;  // Actual content doesn't matter.
-  }
-  writer.FinalizeFecHeader(kMediaSsrc, kMediaStartSeqNum, packet_mask,
-                           packet_mask_size, written_packet.get());
-  return written_packet;
-}
-
-std::unique_ptr<ReceivedFecPacket> ReadHeader(const Packet& written_packet) {
-  FlexfecHeaderReader reader;
-  std::unique_ptr<ReceivedFecPacket> read_packet(new ReceivedFecPacket());
-  read_packet->ssrc = kFlexfecSsrc;
-  read_packet->pkt = rtc::scoped_refptr<Packet>(new Packet());
-  memcpy(read_packet->pkt->data, written_packet.data, written_packet.length);
-  read_packet->pkt->length = written_packet.length;
-  EXPECT_TRUE(reader.ReadFecHeader(read_packet.get()));
-  return read_packet;
-}
-
-void VerifyReadHeaders(size_t expected_fec_header_size,
-                       const uint8_t* expected_packet_mask,
-                       size_t expected_packet_mask_size,
-                       const ReceivedFecPacket& read_packet) {
-  EXPECT_EQ(expected_fec_header_size, read_packet.fec_header_size);
-  EXPECT_EQ(ByteReader<uint32_t>::ReadBigEndian(kProtSsrc),
-            read_packet.protected_ssrc);
-  EXPECT_EQ(ByteReader<uint16_t>::ReadBigEndian(kSnBase),
-            read_packet.seq_num_base);
-  const size_t packet_mask_offset = read_packet.packet_mask_offset;
-  EXPECT_EQ(kFlexfecPacketMaskOffset, packet_mask_offset);
-  EXPECT_EQ(expected_packet_mask_size, read_packet.packet_mask_size);
-  EXPECT_EQ(read_packet.pkt->length - expected_fec_header_size,
-            read_packet.protection_length);
-  // Ensure that the K-bits are removed and the packet mask has been packed.
-  EXPECT_THAT(::testing::make_tuple(read_packet.pkt->data + packet_mask_offset,
-                                    read_packet.packet_mask_size),
-              ::testing::ElementsAreArray(expected_packet_mask,
-                                          expected_packet_mask_size));
-}
-
-void VerifyFinalizedHeaders(const uint8_t* expected_packet_mask,
-                            size_t expected_packet_mask_size,
-                            const Packet& written_packet) {
-  const uint8_t* packet = written_packet.data;
-  EXPECT_EQ(0x00, packet[0] & 0x80);  // F bit clear.
-  EXPECT_EQ(0x00, packet[0] & 0x40);  // R bit clear.
-  EXPECT_EQ(0x01, packet[8]);         // SSRCCount = 1.
-  EXPECT_EQ(kMediaSsrc, ByteReader<uint32_t>::ReadBigEndian(packet + 12));
-  EXPECT_EQ(kMediaStartSeqNum,
-            ByteReader<uint16_t>::ReadBigEndian(packet + 16));
-  EXPECT_THAT(::testing::make_tuple(packet + kFlexfecPacketMaskOffset,
-                                    expected_packet_mask_size),
-              ::testing::ElementsAreArray(expected_packet_mask,
-                                          expected_packet_mask_size));
-}
-
-void VerifyWrittenAndReadHeaders(size_t expected_fec_header_size,
-                                 const uint8_t* expected_packet_mask,
-                                 size_t expected_packet_mask_size,
-                                 const Packet& written_packet,
-                                 const ReceivedFecPacket& read_packet) {
-  EXPECT_EQ(kFlexfecSsrc, read_packet.ssrc);
-  EXPECT_EQ(expected_fec_header_size, read_packet.fec_header_size);
-  EXPECT_EQ(kMediaSsrc, read_packet.protected_ssrc);
-  EXPECT_EQ(kMediaStartSeqNum, read_packet.seq_num_base);
-  EXPECT_EQ(kFlexfecPacketMaskOffset, read_packet.packet_mask_offset);
-  ASSERT_EQ(expected_packet_mask_size, read_packet.packet_mask_size);
-  EXPECT_EQ(written_packet.length - expected_fec_header_size,
-            read_packet.protection_length);
-  // Verify that the call to ReadFecHeader did normalize the packet masks.
-  EXPECT_THAT(
-      ::testing::make_tuple(read_packet.pkt->data + kFlexfecPacketMaskOffset,
-                            read_packet.packet_mask_size),
-      ::testing::ElementsAreArray(expected_packet_mask,
-                                  expected_packet_mask_size));
-  // Verify that the call to ReadFecHeader did not tamper with the payload.
-  EXPECT_THAT(::testing::make_tuple(
-                  read_packet.pkt->data + read_packet.fec_header_size,
-                  read_packet.pkt->length - read_packet.fec_header_size),
-              ::testing::ElementsAreArray(
-                  written_packet.data + expected_fec_header_size,
-                  written_packet.length - expected_fec_header_size));
-}
-
-}  // namespace
-
-TEST(FlexfecHeaderReaderTest, ReadsHeaderWithKBit0Set) {
-  constexpr uint8_t kKBit0 = 1 << 7;
-  constexpr size_t kExpectedPacketMaskSize = 2;
-  constexpr size_t kExpectedFecHeaderSize = 20;
-  // clang-format off
-  constexpr uint8_t kFlexfecPktMask[] = {kKBit0 | 0x08, 0x81};
-  constexpr uint8_t kUlpfecPacketMask[] =        {0x11, 0x02};
-  // clang-format on
-  constexpr uint8_t kPacketData[] = {
-      kNoRBit | kNoFBit, kPtRecovery,    kLengthRecov[0],    kLengthRecov[1],
-      kTsRecovery[0],    kTsRecovery[1], kTsRecovery[2],     kTsRecovery[3],
-      kSsrcCount,        kReservedBits,  kReservedBits,      kReservedBits,
-      kProtSsrc[0],      kProtSsrc[1],   kProtSsrc[2],       kProtSsrc[3],
-      kSnBase[0],        kSnBase[1],     kFlexfecPktMask[0], kFlexfecPktMask[1],
-      kPayloadBits,      kPayloadBits,   kPayloadBits,       kPayloadBits};
-  const size_t packet_length = sizeof(kPacketData);
-  ReceivedFecPacket read_packet;
-  read_packet.pkt = rtc::scoped_refptr<Packet>(new Packet());
-  memcpy(read_packet.pkt->data, kPacketData, packet_length);
-  read_packet.pkt->length = packet_length;
-
-  FlexfecHeaderReader reader;
-  EXPECT_TRUE(reader.ReadFecHeader(&read_packet));
-
-  VerifyReadHeaders(kExpectedFecHeaderSize, kUlpfecPacketMask,
-                    kExpectedPacketMaskSize, read_packet);
-}
-
-TEST(FlexfecHeaderReaderTest, ReadsHeaderWithKBit1Set) {
-  constexpr uint8_t kKBit0 = 0 << 7;
-  constexpr uint8_t kKBit1 = 1 << 7;
-  constexpr size_t kExpectedPacketMaskSize = 6;
-  constexpr size_t kExpectedFecHeaderSize = 24;
-  // clang-format off
-  constexpr uint8_t kFlxfecPktMsk[] = {kKBit0 | 0x48, 0x81,
-                                       kKBit1 | 0x02, 0x11, 0x00, 0x21};
-  constexpr uint8_t kUlpfecPacketMask[] =      {0x91, 0x02,
-                                                0x08, 0x44, 0x00, 0x84};
-  // clang-format on
-  constexpr uint8_t kPacketData[] = {
-      kNoRBit | kNoFBit, kPtRecovery,      kLengthRecov[0],  kLengthRecov[1],
-      kTsRecovery[0],    kTsRecovery[1],   kTsRecovery[2],   kTsRecovery[3],
-      kSsrcCount,        kReservedBits,    kReservedBits,    kReservedBits,
-      kProtSsrc[0],      kProtSsrc[1],     kProtSsrc[2],     kProtSsrc[3],
-      kSnBase[0],        kSnBase[1],       kFlxfecPktMsk[0], kFlxfecPktMsk[1],
-      kFlxfecPktMsk[2],  kFlxfecPktMsk[3], kFlxfecPktMsk[4], kFlxfecPktMsk[5],
-      kPayloadBits,      kPayloadBits,     kPayloadBits,     kPayloadBits};
-  const size_t packet_length = sizeof(kPacketData);
-  ReceivedFecPacket read_packet;
-  read_packet.pkt = rtc::scoped_refptr<Packet>(new Packet());
-  memcpy(read_packet.pkt->data, kPacketData, packet_length);
-  read_packet.pkt->length = packet_length;
-
-  FlexfecHeaderReader reader;
-  EXPECT_TRUE(reader.ReadFecHeader(&read_packet));
-
-  VerifyReadHeaders(kExpectedFecHeaderSize, kUlpfecPacketMask,
-                    kExpectedPacketMaskSize, read_packet);
-}
-
-TEST(FlexfecHeaderReaderTest, ReadsHeaderWithKBit2Set) {
-  constexpr uint8_t kKBit0 = 0 << 7;
-  constexpr uint8_t kKBit1 = 0 << 7;
-  constexpr uint8_t kKBit2 = 1 << 7;
-  constexpr size_t kExpectedPacketMaskSize = 14;
-  constexpr size_t kExpectedFecHeaderSize = 32;
-  // clang-format off
-  constexpr uint8_t kFlxfcPktMsk[] = {kKBit0 | 0x48, 0x81,
-                                      kKBit1 | 0x02, 0x11, 0x00, 0x21,
-                                      kKBit2 | 0x01, 0x11, 0x11, 0x11,
-                                               0x11, 0x11, 0x11, 0x11};
-  constexpr uint8_t kUlpfecPacketMask[] =     {0x91, 0x02,
-                                               0x08, 0x44, 0x00, 0x84,
-                                               0x08, 0x88, 0x88, 0x88,
-                                               0x88, 0x88, 0x88, 0x88};
-  // clang-format on
-  constexpr uint8_t kPacketData[] = {
-      kNoRBit | kNoFBit, kPtRecovery,      kLengthRecov[0],  kLengthRecov[1],
-      kTsRecovery[0],    kTsRecovery[1],   kTsRecovery[2],   kTsRecovery[3],
-      kSsrcCount,        kReservedBits,    kReservedBits,    kReservedBits,
-      kProtSsrc[0],      kProtSsrc[1],     kProtSsrc[2],     kProtSsrc[3],
-      kSnBase[0],        kSnBase[1],       kFlxfcPktMsk[0],  kFlxfcPktMsk[1],
-      kFlxfcPktMsk[2],   kFlxfcPktMsk[3],  kFlxfcPktMsk[4],  kFlxfcPktMsk[5],
-      kFlxfcPktMsk[6],   kFlxfcPktMsk[7],  kFlxfcPktMsk[8],  kFlxfcPktMsk[9],
-      kFlxfcPktMsk[10],  kFlxfcPktMsk[11], kFlxfcPktMsk[12], kFlxfcPktMsk[13],
-      kPayloadBits,      kPayloadBits,     kPayloadBits,     kPayloadBits};
-  const size_t packet_length = sizeof(kPacketData);
-  ReceivedFecPacket read_packet;
-  read_packet.pkt = rtc::scoped_refptr<Packet>(new Packet());
-  memcpy(read_packet.pkt->data, kPacketData, packet_length);
-  read_packet.pkt->length = packet_length;
-
-  FlexfecHeaderReader reader;
-  EXPECT_TRUE(reader.ReadFecHeader(&read_packet));
-
-  VerifyReadHeaders(kExpectedFecHeaderSize, kUlpfecPacketMask,
-                    kExpectedPacketMaskSize, read_packet);
-}
-
-TEST(FlexfecHeaderReaderTest, ReadPacketWithoutStreamSpecificHeaderShouldFail) {
-  const size_t packet_mask_size = kUlpfecPacketMaskSizeLBitClear;
-  auto packet_mask = GeneratePacketMask(packet_mask_size, 0xabcd);
-  auto written_packet = WriteHeader(packet_mask.get(), packet_mask_size);
-
-  // Simulate short received packet.
-  ReceivedFecPacket read_packet;
-  read_packet.ssrc = kFlexfecSsrc;
-  read_packet.pkt = std::move(written_packet);
-  read_packet.pkt->length = 12;
-
-  FlexfecHeaderReader reader;
-  EXPECT_FALSE(reader.ReadFecHeader(&read_packet));
-}
-
-TEST(FlexfecHeaderReaderTest, ReadShortPacketWithKBit0SetShouldFail) {
-  const size_t packet_mask_size = kUlpfecPacketMaskSizeLBitClear;
-  auto packet_mask = GeneratePacketMask(packet_mask_size, 0xabcd);
-  auto written_packet = WriteHeader(packet_mask.get(), packet_mask_size);
-
-  // Simulate short received packet.
-  ReceivedFecPacket read_packet;
-  read_packet.ssrc = kFlexfecSsrc;
-  read_packet.pkt = std::move(written_packet);
-  read_packet.pkt->length = 18;
-
-  FlexfecHeaderReader reader;
-  EXPECT_FALSE(reader.ReadFecHeader(&read_packet));
-}
-
-TEST(FlexfecHeaderReaderTest, ReadShortPacketWithKBit1SetShouldFail) {
-  const size_t packet_mask_size = kUlpfecPacketMaskSizeLBitClear;
-  auto packet_mask = GeneratePacketMask(packet_mask_size, 0xabcd);
-  SetBit(15, packet_mask.get());  // This expands the packet mask "once".
-  auto written_packet = WriteHeader(packet_mask.get(), packet_mask_size);
-
-  // Simulate short received packet.
-  ReceivedFecPacket read_packet;
-  read_packet.ssrc = kFlexfecSsrc;
-  read_packet.pkt = std::move(written_packet);
-  read_packet.pkt->length = 20;
-
-  FlexfecHeaderReader reader;
-  EXPECT_FALSE(reader.ReadFecHeader(&read_packet));
-}
-
-TEST(FlexfecHeaderReaderTest, ReadShortPacketWithKBit2SetShouldFail) {
-  const size_t packet_mask_size = kUlpfecPacketMaskSizeLBitSet;
-  auto packet_mask = GeneratePacketMask(packet_mask_size, 0xabcd);
-  SetBit(47, packet_mask.get());  // This expands the packet mask "twice".
-  auto written_packet = WriteHeader(packet_mask.get(), packet_mask_size);
-
-  // Simulate short received packet.
-  ReceivedFecPacket read_packet;
-  read_packet.ssrc = kFlexfecSsrc;
-  read_packet.pkt = std::move(written_packet);
-  read_packet.pkt->length = 24;
-
-  FlexfecHeaderReader reader;
-  EXPECT_FALSE(reader.ReadFecHeader(&read_packet));
-}
-
-TEST(FlexfecHeaderWriterTest, FinalizesHeaderWithKBit0Set) {
-  constexpr size_t kExpectedPacketMaskSize = 2;
-  constexpr uint8_t kFlexfecPacketMask[] = {0x88, 0x81};
-  constexpr uint8_t kUlpfecPacketMask[] = {0x11, 0x02};
-  Packet written_packet;
-  written_packet.length = kMediaPacketLength;
-  for (size_t i = 0; i < written_packet.length; ++i) {
-    written_packet.data[i] = i;
-  }
-
-  FlexfecHeaderWriter writer;
-  writer.FinalizeFecHeader(kMediaSsrc, kMediaStartSeqNum, kUlpfecPacketMask,
-                           sizeof(kUlpfecPacketMask), &written_packet);
-
-  VerifyFinalizedHeaders(kFlexfecPacketMask, kExpectedPacketMaskSize,
-                         written_packet);
-}
-
-TEST(FlexfecHeaderWriterTest, FinalizesHeaderWithKBit1Set) {
-  constexpr size_t kExpectedPacketMaskSize = 6;
-  constexpr uint8_t kFlexfecPacketMask[] = {0x48, 0x81, 0x82, 0x11, 0x00, 0x21};
-  constexpr uint8_t kUlpfecPacketMask[] = {0x91, 0x02, 0x08, 0x44, 0x00, 0x84};
-  Packet written_packet;
-  written_packet.length = kMediaPacketLength;
-  for (size_t i = 0; i < written_packet.length; ++i) {
-    written_packet.data[i] = i;
-  }
-
-  FlexfecHeaderWriter writer;
-  writer.FinalizeFecHeader(kMediaSsrc, kMediaStartSeqNum, kUlpfecPacketMask,
-                           sizeof(kUlpfecPacketMask), &written_packet);
-
-  VerifyFinalizedHeaders(kFlexfecPacketMask, kExpectedPacketMaskSize,
-                         written_packet);
-}
-
-TEST(FlexfecHeaderWriterTest, FinalizesHeaderWithKBit2Set) {
-  constexpr size_t kExpectedPacketMaskSize = 14;
-  constexpr uint8_t kFlexfecPacketMask[] = {
-      0x11, 0x11,                                     // K-bit 0 clear.
-      0x11, 0x11, 0x11, 0x10,                         // K-bit 1 clear.
-      0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00  // K-bit 2 set.
-  };
-  constexpr uint8_t kUlpfecPacketMask[] = {0x22, 0x22, 0x44, 0x44, 0x44, 0x41};
-  Packet written_packet;
-  written_packet.length = kMediaPacketLength;
-  for (size_t i = 0; i < written_packet.length; ++i) {
-    written_packet.data[i] = i;
-  }
-
-  FlexfecHeaderWriter writer;
-  writer.FinalizeFecHeader(kMediaSsrc, kMediaStartSeqNum, kUlpfecPacketMask,
-                           sizeof(kUlpfecPacketMask), &written_packet);
-
-  VerifyFinalizedHeaders(kFlexfecPacketMask, kExpectedPacketMaskSize,
-                         written_packet);
-}
-
-TEST(FlexfecHeaderWriterTest, ContractsShortUlpfecPacketMaskWithBit15Clear) {
-  const size_t packet_mask_size = kUlpfecPacketMaskSizeLBitClear;
-  auto packet_mask = GeneratePacketMask(packet_mask_size, 0xabcd);
-  ClearBit(15, packet_mask.get());
-
-  FlexfecHeaderWriter writer;
-  size_t min_packet_mask_size =
-      writer.MinPacketMaskSize(packet_mask.get(), packet_mask_size);
-
-  EXPECT_EQ(kFlexfecPacketMaskSizes[0], min_packet_mask_size);
-  EXPECT_EQ(kFlexfecHeaderSizes[0], writer.FecHeaderSize(min_packet_mask_size));
-}
-
-TEST(FlexfecHeaderWriterTest, ExpandsShortUlpfecPacketMaskWithBit15Set) {
-  const size_t packet_mask_size = kUlpfecPacketMaskSizeLBitClear;
-  auto packet_mask = GeneratePacketMask(packet_mask_size, 0xabcd);
-  SetBit(15, packet_mask.get());
-
-  FlexfecHeaderWriter writer;
-  size_t min_packet_mask_size =
-      writer.MinPacketMaskSize(packet_mask.get(), packet_mask_size);
-
-  EXPECT_EQ(kFlexfecPacketMaskSizes[1], min_packet_mask_size);
-  EXPECT_EQ(kFlexfecHeaderSizes[1], writer.FecHeaderSize(min_packet_mask_size));
-}
-
-TEST(FlexfecHeaderWriterTest,
-     ContractsLongUlpfecPacketMaskWithBit46ClearBit47Clear) {
-  const size_t packet_mask_size = kUlpfecPacketMaskSizeLBitSet;
-  auto packet_mask = GeneratePacketMask(packet_mask_size, 0xabcd);
-  ClearBit(46, packet_mask.get());
-  ClearBit(47, packet_mask.get());
-
-  FlexfecHeaderWriter writer;
-  size_t min_packet_mask_size =
-      writer.MinPacketMaskSize(packet_mask.get(), packet_mask_size);
-
-  EXPECT_EQ(kFlexfecPacketMaskSizes[1], min_packet_mask_size);
-  EXPECT_EQ(kFlexfecHeaderSizes[1], writer.FecHeaderSize(min_packet_mask_size));
-}
-
-TEST(FlexfecHeaderWriterTest,
-     ExpandsLongUlpfecPacketMaskWithBit46SetBit47Clear) {
-  const size_t packet_mask_size = kUlpfecPacketMaskSizeLBitSet;
-  auto packet_mask = GeneratePacketMask(packet_mask_size, 0xabcd);
-  SetBit(46, packet_mask.get());
-  ClearBit(47, packet_mask.get());
-
-  FlexfecHeaderWriter writer;
-  size_t min_packet_mask_size =
-      writer.MinPacketMaskSize(packet_mask.get(), packet_mask_size);
-
-  EXPECT_EQ(kFlexfecPacketMaskSizes[2], min_packet_mask_size);
-  EXPECT_EQ(kFlexfecHeaderSizes[2], writer.FecHeaderSize(min_packet_mask_size));
-}
-
-TEST(FlexfecHeaderWriterTest,
-     ExpandsLongUlpfecPacketMaskWithBit46ClearBit47Set) {
-  const size_t packet_mask_size = kUlpfecPacketMaskSizeLBitSet;
-  auto packet_mask = GeneratePacketMask(packet_mask_size, 0xabcd);
-  ClearBit(46, packet_mask.get());
-  SetBit(47, packet_mask.get());
-
-  FlexfecHeaderWriter writer;
-  size_t min_packet_mask_size =
-      writer.MinPacketMaskSize(packet_mask.get(), packet_mask_size);
-
-  EXPECT_EQ(kFlexfecPacketMaskSizes[2], min_packet_mask_size);
-  EXPECT_EQ(kFlexfecHeaderSizes[2], writer.FecHeaderSize(min_packet_mask_size));
-}
-
-TEST(FlexfecHeaderWriterTest, ExpandsLongUlpfecPacketMaskWithBit46SetBit47Set) {
-  const size_t packet_mask_size = kUlpfecPacketMaskSizeLBitSet;
-  auto packet_mask = GeneratePacketMask(packet_mask_size, 0xabcd);
-  SetBit(46, packet_mask.get());
-  SetBit(47, packet_mask.get());
-
-  FlexfecHeaderWriter writer;
-  size_t min_packet_mask_size =
-      writer.MinPacketMaskSize(packet_mask.get(), packet_mask_size);
-
-  EXPECT_EQ(kFlexfecPacketMaskSizes[2], min_packet_mask_size);
-  EXPECT_EQ(kFlexfecHeaderSizes[2], writer.FecHeaderSize(min_packet_mask_size));
-}
-
-TEST(FlexfecHeaderReaderWriterTest,
-     WriteAndReadSmallUlpfecPacketHeaderWithMaskBit15Clear) {
-  const size_t packet_mask_size = kUlpfecPacketMaskSizeLBitClear;
-  auto packet_mask = GeneratePacketMask(packet_mask_size, 0xabcd);
-  ClearBit(15, packet_mask.get());
-
-  auto written_packet = WriteHeader(packet_mask.get(), packet_mask_size);
-  auto read_packet = ReadHeader(*written_packet);
-
-  VerifyWrittenAndReadHeaders(kFlexfecHeaderSizes[0], packet_mask.get(),
-                              kFlexfecPacketMaskSizes[0], *written_packet,
-                              *read_packet);
-}
-
-TEST(FlexfecHeaderReaderWriterTest,
-     WriteAndReadSmallUlpfecPacketHeaderWithMaskBit15Set) {
-  const size_t packet_mask_size = kUlpfecPacketMaskSizeLBitClear;
-  auto packet_mask = GeneratePacketMask(packet_mask_size, 0xabcd);
-  SetBit(15, packet_mask.get());
-
-  auto written_packet = WriteHeader(packet_mask.get(), packet_mask_size);
-  auto read_packet = ReadHeader(*written_packet);
-
-  VerifyWrittenAndReadHeaders(kFlexfecHeaderSizes[1], packet_mask.get(),
-                              kFlexfecPacketMaskSizes[1], *written_packet,
-                              *read_packet);
-}
-
-TEST(FlexfecHeaderReaderWriterTest,
-     WriteAndReadLargeUlpfecPacketHeaderWithMaskBits46And47Clear) {
-  const size_t packet_mask_size = kUlpfecPacketMaskSizeLBitSet;
-  auto packet_mask = GeneratePacketMask(packet_mask_size, 0xabcd);
-  ClearBit(46, packet_mask.get());
-  ClearBit(47, packet_mask.get());
-
-  auto written_packet = WriteHeader(packet_mask.get(), packet_mask_size);
-  auto read_packet = ReadHeader(*written_packet);
-
-  VerifyWrittenAndReadHeaders(kFlexfecHeaderSizes[1], packet_mask.get(),
-                              kFlexfecPacketMaskSizes[1], *written_packet,
-                              *read_packet);
-}
-
-TEST(FlexfecHeaderReaderWriterTest,
-     WriteAndReadLargeUlpfecPacketHeaderWithMaskBit46SetBit47Clear) {
-  const size_t packet_mask_size = kUlpfecPacketMaskSizeLBitSet;
-  auto packet_mask = GeneratePacketMask(packet_mask_size, 0xabcd);
-  SetBit(46, packet_mask.get());
-  ClearBit(47, packet_mask.get());
-
-  auto written_packet = WriteHeader(packet_mask.get(), packet_mask_size);
-  auto read_packet = ReadHeader(*written_packet);
-
-  VerifyWrittenAndReadHeaders(kFlexfecHeaderSizes[2], packet_mask.get(),
-                              kFlexfecPacketMaskSizes[2], *written_packet,
-                              *read_packet);
-}
-
-TEST(FlexfecHeaderReaderWriterTest,
-     WriteAndReadLargeUlpfecPacketHeaderMaskWithBit46ClearBit47Set) {
-  const size_t packet_mask_size = kUlpfecPacketMaskSizeLBitSet;
-  auto packet_mask = GeneratePacketMask(packet_mask_size, 0xabcd);
-  ClearBit(46, packet_mask.get());
-  SetBit(47, packet_mask.get());
-
-  auto written_packet = WriteHeader(packet_mask.get(), packet_mask_size);
-  auto read_packet = ReadHeader(*written_packet);
-
-  VerifyWrittenAndReadHeaders(kFlexfecHeaderSizes[2], packet_mask.get(),
-                              kFlexfecPacketMaskSizes[2], *written_packet,
-                              *read_packet);
-}
-
-TEST(FlexfecHeaderReaderWriterTest,
-     WriteAndReadLargeUlpfecPacketHeaderWithMaskBits46And47Set) {
-  const size_t packet_mask_size = kUlpfecPacketMaskSizeLBitSet;
-  auto packet_mask = GeneratePacketMask(packet_mask_size, 0xabcd);
-  SetBit(46, packet_mask.get());
-  SetBit(47, packet_mask.get());
-
-  auto written_packet = WriteHeader(packet_mask.get(), packet_mask_size);
-  auto read_packet = ReadHeader(*written_packet);
-
-  VerifyWrittenAndReadHeaders(kFlexfecHeaderSizes[2], packet_mask.get(),
-                              kFlexfecPacketMaskSizes[2], *written_packet,
-                              *read_packet);
-}
-
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/flexfec_receiver.cc b/modules/rtp_rtcp/source/flexfec_receiver.cc
deleted file mode 100644
index af85827..0000000
--- a/modules/rtp_rtcp/source/flexfec_receiver.cc
+++ /dev/null
@@ -1,156 +0,0 @@
-/*
- *  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/rtp_rtcp/include/flexfec_receiver.h"
-
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/scoped_ref_ptr.h"
-
-namespace webrtc {
-
-namespace {
-
-using Packet = ForwardErrorCorrection::Packet;
-using ReceivedPacket = ForwardErrorCorrection::ReceivedPacket;
-
-// Minimum header size (in bytes) of a well-formed non-singular FlexFEC packet.
-constexpr size_t kMinFlexfecHeaderSize = 20;
-
-// How often to log the recovered packets to the text log.
-constexpr int kPacketLogIntervalMs = 10000;
-
-}  // namespace
-
-FlexfecReceiver::FlexfecReceiver(
-    uint32_t ssrc,
-    uint32_t protected_media_ssrc,
-    RecoveredPacketReceiver* recovered_packet_receiver)
-    : ssrc_(ssrc),
-      protected_media_ssrc_(protected_media_ssrc),
-      erasure_code_(
-          ForwardErrorCorrection::CreateFlexfec(ssrc, protected_media_ssrc)),
-      recovered_packet_receiver_(recovered_packet_receiver),
-      clock_(Clock::GetRealTimeClock()),
-      last_recovered_packet_ms_(-1) {
-  // It's OK to create this object on a different thread/task queue than
-  // the one used during main operation.
-  sequence_checker_.Detach();
-}
-
-FlexfecReceiver::~FlexfecReceiver() = default;
-
-void FlexfecReceiver::OnRtpPacket(const RtpPacketReceived& packet) {
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&sequence_checker_);
-  if (!AddReceivedPacket(packet)) {
-    return;
-  }
-  ProcessReceivedPackets();
-}
-
-FecPacketCounter FlexfecReceiver::GetPacketCounter() const {
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&sequence_checker_);
-  return packet_counter_;
-}
-
-// TODO(eladalon): Consider using packet.recovered() to avoid processing
-// recovered packets here.
-bool FlexfecReceiver::AddReceivedPacket(const RtpPacketReceived& packet) {
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&sequence_checker_);
-
-  // RTP packets with a full base header (12 bytes), but without payload,
-  // could conceivably be useful in the decoding. Therefore we check
-  // with a non-strict inequality here.
-  RTC_DCHECK_GE(packet.size(), kRtpHeaderSize);
-
-  // Demultiplex based on SSRC, and insert into erasure code decoder.
-  std::unique_ptr<ReceivedPacket> received_packet(new ReceivedPacket());
-  received_packet->seq_num = packet.SequenceNumber();
-  received_packet->ssrc = packet.Ssrc();
-  if (received_packet->ssrc == ssrc_) {
-    // This is a FlexFEC packet.
-    if (packet.payload_size() < kMinFlexfecHeaderSize) {
-      LOG(LS_WARNING) << "Truncated FlexFEC packet, discarding.";
-      return false;
-    }
-    received_packet->is_fec = true;
-    ++packet_counter_.num_fec_packets;
-
-    // Insert packet payload into erasure code.
-    // TODO(brandtr): Remove this memcpy when the FEC packet classes
-    // are using COW buffers internally.
-    received_packet->pkt = rtc::scoped_refptr<Packet>(new Packet());
-    auto payload = packet.payload();
-    memcpy(received_packet->pkt->data, payload.data(), payload.size());
-    received_packet->pkt->length = payload.size();
-  } else {
-    // This is a media packet, or a FlexFEC packet belonging to some
-    // other FlexFEC stream.
-    if (received_packet->ssrc != protected_media_ssrc_) {
-      return false;
-    }
-    received_packet->is_fec = false;
-
-    // Insert entire packet into erasure code.
-    // TODO(brandtr): Remove this memcpy too.
-    received_packet->pkt = rtc::scoped_refptr<Packet>(new Packet());
-    memcpy(received_packet->pkt->data, packet.data(), packet.size());
-    received_packet->pkt->length = packet.size();
-  }
-
-  received_packets_.push_back(std::move(received_packet));
-  ++packet_counter_.num_packets;
-
-  return true;
-}
-
-// Note that the implementation of this member function and the implementation
-// in UlpfecReceiver::ProcessReceivedFec() are slightly different.
-// This implementation only returns _recovered_ media packets through the
-// callback, whereas the implementation in UlpfecReceiver returns _all inserted_
-// media packets through the callback. The latter behaviour makes sense
-// for ULPFEC, since the ULPFEC receiver is owned by the RtpVideoStreamReceiver.
-// Here, however, the received media pipeline is more decoupled from the
-// FlexFEC decoder, and we therefore do not interfere with the reception
-// of non-recovered media packets.
-bool FlexfecReceiver::ProcessReceivedPackets() {
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&sequence_checker_);
-
-  // Decode.
-  if (!received_packets_.empty()) {
-    if (erasure_code_->DecodeFec(&received_packets_, &recovered_packets_) !=
-        0) {
-      return false;
-    }
-  }
-  // Return recovered packets through callback.
-  for (const auto& recovered_packet : recovered_packets_) {
-    if (recovered_packet->returned) {
-      continue;
-    }
-    ++packet_counter_.num_recovered_packets;
-    // Set this flag first, since OnRecoveredPacket may end up here
-    // again, with the same packet.
-    recovered_packet->returned = true;
-    recovered_packet_receiver_->OnRecoveredPacket(
-        recovered_packet->pkt->data, recovered_packet->pkt->length);
-    // Periodically log the incoming packets.
-    int64_t now_ms = clock_->TimeInMilliseconds();
-    if (now_ms - last_recovered_packet_ms_ > kPacketLogIntervalMs) {
-      uint32_t media_ssrc =
-          ForwardErrorCorrection::ParseSsrc(recovered_packet->pkt->data);
-      LOG(LS_VERBOSE) << "Recovered media packet with SSRC: " << media_ssrc
-                      << " from FlexFEC stream with SSRC: " << ssrc_ << ".";
-      last_recovered_packet_ms_ = now_ms;
-    }
-  }
-  return true;
-}
-
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/flexfec_receiver_unittest.cc b/modules/rtp_rtcp/source/flexfec_receiver_unittest.cc
deleted file mode 100644
index 93c49cb..0000000
--- a/modules/rtp_rtcp/source/flexfec_receiver_unittest.cc
+++ /dev/null
@@ -1,571 +0,0 @@
-/*
- *  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 <algorithm>
-#include <memory>
-
-#include "webrtc/modules/rtp_rtcp/include/flexfec_receiver.h"
-#include "webrtc/modules/rtp_rtcp/mocks/mock_recovered_packet_receiver.h"
-#include "webrtc/modules/rtp_rtcp/source/fec_test_helper.h"
-#include "webrtc/modules/rtp_rtcp/source/forward_error_correction.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_packet_received.h"
-#include "webrtc/rtc_base/basictypes.h"
-#include "webrtc/test/gmock.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-namespace {
-
-using ::testing::_;
-using ::testing::Args;
-using ::testing::ElementsAreArray;
-using ::testing::Return;
-
-using test::fec::FlexfecPacketGenerator;
-using Packet = ForwardErrorCorrection::Packet;
-using PacketList = ForwardErrorCorrection::PacketList;
-
-constexpr size_t kPayloadLength = 500;
-constexpr uint32_t kFlexfecSsrc = 42984;
-constexpr uint32_t kMediaSsrc = 8353;
-
-RtpPacketReceived ParsePacket(const Packet& packet) {
-  RtpPacketReceived parsed_packet;
-  EXPECT_TRUE(parsed_packet.Parse(packet.data, packet.length));
-  return parsed_packet;
-}
-
-}  // namespace
-
-class FlexfecReceiverForTest : public FlexfecReceiver {
- public:
-  FlexfecReceiverForTest(uint32_t ssrc,
-                         uint32_t protected_media_ssrc,
-                         RecoveredPacketReceiver* recovered_packet_receiver)
-      : FlexfecReceiver(ssrc, protected_media_ssrc, recovered_packet_receiver) {
-  }
-  // Expose methods for tests.
-  using FlexfecReceiver::AddReceivedPacket;
-  using FlexfecReceiver::ProcessReceivedPackets;
-};
-
-class FlexfecReceiverTest : public ::testing::Test {
- protected:
-  FlexfecReceiverTest()
-      : receiver_(kFlexfecSsrc, kMediaSsrc, &recovered_packet_receiver_),
-        erasure_code_(
-            ForwardErrorCorrection::CreateFlexfec(kFlexfecSsrc, kMediaSsrc)),
-        packet_generator_(kMediaSsrc, kFlexfecSsrc) {}
-
-  // Generates |num_media_packets| corresponding to a single frame.
-  void PacketizeFrame(size_t num_media_packets,
-                      size_t frame_offset,
-                      PacketList* media_packets);
-
-  // Generates |num_fec_packets| FEC packets, given |media_packets|.
-  std::list<Packet*> EncodeFec(const PacketList& media_packets,
-                               size_t num_fec_packets);
-
-  FlexfecReceiverForTest receiver_;
-  std::unique_ptr<ForwardErrorCorrection> erasure_code_;
-
-  FlexfecPacketGenerator packet_generator_;
-  testing::StrictMock<MockRecoveredPacketReceiver> recovered_packet_receiver_;
-};
-
-void FlexfecReceiverTest::PacketizeFrame(size_t num_media_packets,
-                                         size_t frame_offset,
-                                         PacketList* media_packets) {
-  packet_generator_.NewFrame(num_media_packets);
-  for (size_t i = 0; i < num_media_packets; ++i) {
-    std::unique_ptr<Packet> next_packet(
-        packet_generator_.NextPacket(frame_offset + i, kPayloadLength));
-    media_packets->push_back(std::move(next_packet));
-  }
-}
-
-std::list<Packet*> FlexfecReceiverTest::EncodeFec(
-    const PacketList& media_packets,
-    size_t num_fec_packets) {
-  const uint8_t protection_factor =
-      num_fec_packets * 255 / media_packets.size();
-  constexpr int kNumImportantPackets = 0;
-  constexpr bool kUseUnequalProtection = false;
-  constexpr FecMaskType kFecMaskType = kFecMaskRandom;
-  std::list<Packet*> fec_packets;
-  EXPECT_EQ(0, erasure_code_->EncodeFec(
-                   media_packets, protection_factor, kNumImportantPackets,
-                   kUseUnequalProtection, kFecMaskType, &fec_packets));
-  EXPECT_EQ(num_fec_packets, fec_packets.size());
-  return fec_packets;
-}
-
-TEST_F(FlexfecReceiverTest, ReceivesMediaPacket) {
-  packet_generator_.NewFrame(1);
-  std::unique_ptr<Packet> media_packet(
-      packet_generator_.NextPacket(0, kPayloadLength));
-
-  EXPECT_TRUE(receiver_.AddReceivedPacket(ParsePacket(*media_packet)));
-  EXPECT_TRUE(receiver_.ProcessReceivedPackets());
-}
-
-TEST_F(FlexfecReceiverTest, ReceivesMediaAndFecPackets) {
-  const size_t kNumMediaPackets = 1;
-  const size_t kNumFecPackets = 1;
-
-  PacketList media_packets;
-  PacketizeFrame(kNumMediaPackets, 0, &media_packets);
-  std::list<Packet*> fec_packets = EncodeFec(media_packets, kNumFecPackets);
-  const auto& media_packet = media_packets.front();
-  auto fec_packet = packet_generator_.BuildFlexfecPacket(*fec_packets.front());
-
-  EXPECT_TRUE(receiver_.AddReceivedPacket(ParsePacket(*media_packet)));
-  EXPECT_TRUE(receiver_.ProcessReceivedPackets());
-  EXPECT_TRUE(receiver_.AddReceivedPacket(ParsePacket(*fec_packet)));
-  EXPECT_TRUE(receiver_.ProcessReceivedPackets());
-}
-
-TEST_F(FlexfecReceiverTest, FailsOnTruncatedFecPacket) {
-  const size_t kNumMediaPackets = 1;
-  const size_t kNumFecPackets = 1;
-
-  PacketList media_packets;
-  PacketizeFrame(kNumMediaPackets, 0, &media_packets);
-  std::list<Packet*> fec_packets = EncodeFec(media_packets, kNumFecPackets);
-  const auto& media_packet = media_packets.front();
-  // Simulate truncated FlexFEC payload.
-  fec_packets.front()->length = 1;
-  auto fec_packet = packet_generator_.BuildFlexfecPacket(*fec_packets.front());
-
-  EXPECT_TRUE(receiver_.AddReceivedPacket(ParsePacket(*media_packet)));
-  EXPECT_TRUE(receiver_.ProcessReceivedPackets());
-  EXPECT_FALSE(receiver_.AddReceivedPacket(ParsePacket(*fec_packet)));
-}
-
-TEST_F(FlexfecReceiverTest, FailsOnUnknownMediaSsrc) {
-  const size_t kNumMediaPackets = 1;
-
-  PacketList media_packets;
-  PacketizeFrame(kNumMediaPackets, 0, &media_packets);
-  auto& media_packet = media_packets.front();
-  // Corrupt the SSRC.
-  media_packet->data[8] = 0;
-  media_packet->data[9] = 1;
-  media_packet->data[10] = 2;
-  media_packet->data[11] = 3;
-
-  EXPECT_FALSE(receiver_.AddReceivedPacket(ParsePacket(*media_packet)));
-}
-
-TEST_F(FlexfecReceiverTest, FailsOnUnknownFecSsrc) {
-  const size_t kNumMediaPackets = 1;
-  const size_t kNumFecPackets = 1;
-
-  PacketList media_packets;
-  PacketizeFrame(kNumMediaPackets, 0, &media_packets);
-  std::list<Packet*> fec_packets = EncodeFec(media_packets, kNumFecPackets);
-  const auto& media_packet = media_packets.front();
-  auto fec_packet = packet_generator_.BuildFlexfecPacket(*fec_packets.front());
-  // Corrupt the SSRC.
-  fec_packet->data[8] = 4;
-  fec_packet->data[9] = 5;
-  fec_packet->data[10] = 6;
-  fec_packet->data[11] = 7;
-
-  EXPECT_TRUE(receiver_.AddReceivedPacket(ParsePacket(*media_packet)));
-  EXPECT_TRUE(receiver_.ProcessReceivedPackets());
-  EXPECT_FALSE(receiver_.AddReceivedPacket(ParsePacket(*fec_packet)));
-}
-
-TEST_F(FlexfecReceiverTest, ReceivesMultiplePackets) {
-  const size_t kNumMediaPackets = 2;
-  const size_t kNumFecPackets = 1;
-
-  PacketList media_packets;
-  PacketizeFrame(kNumMediaPackets, 0, &media_packets);
-  std::list<Packet*> fec_packets = EncodeFec(media_packets, kNumFecPackets);
-
-  // Receive all media packets.
-  for (const auto& media_packet : media_packets) {
-    EXPECT_TRUE(receiver_.AddReceivedPacket(ParsePacket(*media_packet)));
-    EXPECT_TRUE(receiver_.ProcessReceivedPackets());
-  }
-
-  // Receive FEC packet.
-  auto fec_packet = fec_packets.front();
-  std::unique_ptr<Packet> packet_with_rtp_header =
-      packet_generator_.BuildFlexfecPacket(*fec_packet);
-  EXPECT_TRUE(
-      receiver_.AddReceivedPacket(ParsePacket(*packet_with_rtp_header)));
-  EXPECT_TRUE(receiver_.ProcessReceivedPackets());
-}
-
-TEST_F(FlexfecReceiverTest, RecoversFromSingleMediaLoss) {
-  const size_t kNumMediaPackets = 2;
-  const size_t kNumFecPackets = 1;
-
-  PacketList media_packets;
-  PacketizeFrame(kNumMediaPackets, 0, &media_packets);
-  std::list<Packet*> fec_packets = EncodeFec(media_packets, kNumFecPackets);
-
-  // Receive first media packet but drop second.
-  auto media_it = media_packets.begin();
-  receiver_.OnRtpPacket(ParsePacket(**media_it));
-
-  // Receive FEC packet and ensure recovery of lost media packet.
-  auto fec_it = fec_packets.begin();
-  std::unique_ptr<Packet> packet_with_rtp_header =
-      packet_generator_.BuildFlexfecPacket(**fec_it);
-  media_it++;
-  EXPECT_CALL(recovered_packet_receiver_,
-              OnRecoveredPacket(_, (*media_it)->length))
-      .With(
-          Args<0, 1>(ElementsAreArray((*media_it)->data, (*media_it)->length)));
-  receiver_.OnRtpPacket(ParsePacket(*packet_with_rtp_header));
-}
-
-TEST_F(FlexfecReceiverTest, RecoversFromDoubleMediaLoss) {
-  const size_t kNumMediaPackets = 2;
-  const size_t kNumFecPackets = 2;
-
-  PacketList media_packets;
-  PacketizeFrame(kNumMediaPackets, 0, &media_packets);
-  std::list<Packet*> fec_packets = EncodeFec(media_packets, kNumFecPackets);
-
-  // Drop both media packets.
-
-  // Receive first FEC packet and recover first lost media packet.
-  auto fec_it = fec_packets.begin();
-  std::unique_ptr<Packet> packet_with_rtp_header =
-      packet_generator_.BuildFlexfecPacket(**fec_it);
-  auto media_it = media_packets.begin();
-  EXPECT_CALL(recovered_packet_receiver_,
-              OnRecoveredPacket(_, (*media_it)->length))
-      .With(
-          Args<0, 1>(ElementsAreArray((*media_it)->data, (*media_it)->length)));
-  receiver_.OnRtpPacket(ParsePacket(*packet_with_rtp_header));
-
-  // Receive second FEC packet and recover second lost media packet.
-  fec_it++;
-  packet_with_rtp_header = packet_generator_.BuildFlexfecPacket(**fec_it);
-  media_it++;
-  EXPECT_CALL(recovered_packet_receiver_,
-              OnRecoveredPacket(_, (*media_it)->length))
-      .With(
-          Args<0, 1>(ElementsAreArray((*media_it)->data, (*media_it)->length)));
-  receiver_.OnRtpPacket(ParsePacket(*packet_with_rtp_header));
-}
-
-TEST_F(FlexfecReceiverTest, DoesNotRecoverFromMediaAndFecLoss) {
-  const size_t kNumMediaPackets = 2;
-  const size_t kNumFecPackets = 1;
-
-  PacketList media_packets;
-  PacketizeFrame(kNumMediaPackets, 0, &media_packets);
-  std::list<Packet*> fec_packets = EncodeFec(media_packets, kNumFecPackets);
-
-  // Receive first media packet.
-  auto media_it = media_packets.begin();
-  receiver_.OnRtpPacket(ParsePacket(**media_it));
-
-  // Drop second media packet and FEC packet. Do not expect call back.
-}
-
-TEST_F(FlexfecReceiverTest, DoesNotCallbackTwice) {
-  const size_t kNumMediaPackets = 2;
-  const size_t kNumFecPackets = 1;
-
-  PacketList media_packets;
-  PacketizeFrame(kNumMediaPackets, 0, &media_packets);
-  std::list<Packet*> fec_packets = EncodeFec(media_packets, kNumFecPackets);
-
-  // Receive first media packet but drop second.
-  auto media_it = media_packets.begin();
-  receiver_.OnRtpPacket(ParsePacket(**media_it));
-
-  // Receive FEC packet and ensure recovery of lost media packet.
-  auto fec_it = fec_packets.begin();
-  std::unique_ptr<Packet> packet_with_rtp_header =
-      packet_generator_.BuildFlexfecPacket(**fec_it);
-  media_it++;
-  EXPECT_CALL(recovered_packet_receiver_,
-              OnRecoveredPacket(_, (*media_it)->length))
-      .With(
-          Args<0, 1>(ElementsAreArray((*media_it)->data, (*media_it)->length)));
-  receiver_.OnRtpPacket(ParsePacket(*packet_with_rtp_header));
-
-  // Receive the FEC packet again, but do not call back.
-  receiver_.OnRtpPacket(ParsePacket(*packet_with_rtp_header));
-
-  // Receive the first media packet again, but do not call back.
-  media_it = media_packets.begin();
-  receiver_.OnRtpPacket(ParsePacket(**media_it));
-
-  // Receive the second media packet again (the one recovered above),
-  // but do not call back again.
-  media_it++;
-  receiver_.OnRtpPacket(ParsePacket(**media_it));
-}
-
-// Here we are implicitly assuming packet masks that are suitable for
-// this type of 50% correlated loss. If we are changing our precomputed
-// packet masks, this test might need to be updated.
-TEST_F(FlexfecReceiverTest, RecoversFrom50PercentLoss) {
-  const size_t kNumFecPackets = 5;
-  const size_t kNumFrames = 2 * kNumFecPackets;
-  const size_t kNumMediaPacketsPerFrame = 1;
-
-  PacketList media_packets;
-  for (size_t i = 0; i < kNumFrames; ++i) {
-    PacketizeFrame(kNumMediaPacketsPerFrame, i, &media_packets);
-  }
-  std::list<Packet*> fec_packets = EncodeFec(media_packets, kNumFecPackets);
-
-  // Drop every second media packet.
-  auto media_it = media_packets.begin();
-  while (media_it != media_packets.end()) {
-    receiver_.OnRtpPacket(ParsePacket(**media_it));
-    ++media_it;
-    if (media_it == media_packets.end()) {
-      break;
-    }
-    ++media_it;
-  }
-
-  // Receive all FEC packets.
-  media_it = media_packets.begin();
-  for (const auto& fec_packet : fec_packets) {
-    std::unique_ptr<Packet> fec_packet_with_rtp_header =
-        packet_generator_.BuildFlexfecPacket(*fec_packet);
-    ++media_it;
-    if (media_it == media_packets.end()) {
-      break;
-    }
-    EXPECT_CALL(recovered_packet_receiver_,
-                OnRecoveredPacket(_, (*media_it)->length))
-        .With(Args<0, 1>(
-            ElementsAreArray((*media_it)->data, (*media_it)->length)));
-    receiver_.OnRtpPacket(ParsePacket(*fec_packet_with_rtp_header));
-    ++media_it;
-  }
-}
-
-TEST_F(FlexfecReceiverTest, DelayedFecPacketDoesHelp) {
-  // These values need to be updated if the underlying erasure code
-  // implementation changes.
-  const size_t kNumFrames = 48;
-  const size_t kNumMediaPacketsPerFrame = 1;
-  const size_t kNumFecPackets = 1;
-
-  PacketList media_packets;
-  PacketizeFrame(kNumMediaPacketsPerFrame, 0, &media_packets);
-  PacketizeFrame(kNumMediaPacketsPerFrame, 1, &media_packets);
-  // Protect two first frames.
-  std::list<Packet*> fec_packets = EncodeFec(media_packets, kNumFecPackets);
-  for (size_t i = 2; i < kNumFrames; ++i) {
-    PacketizeFrame(kNumMediaPacketsPerFrame, i, &media_packets);
-  }
-
-  // Drop first media packet and delay FEC packet.
-  auto media_it = media_packets.begin();
-  ++media_it;
-
-  // Receive all other media packets.
-  while (media_it != media_packets.end()) {
-    receiver_.OnRtpPacket(ParsePacket(**media_it));
-    ++media_it;
-  }
-
-  // Receive FEC packet and recover first media packet.
-  auto fec_it = fec_packets.begin();
-  std::unique_ptr<Packet> packet_with_rtp_header =
-      packet_generator_.BuildFlexfecPacket(**fec_it);
-  media_it = media_packets.begin();
-  EXPECT_CALL(recovered_packet_receiver_,
-              OnRecoveredPacket(_, (*media_it)->length))
-      .With(
-          Args<0, 1>(ElementsAreArray((*media_it)->data, (*media_it)->length)));
-  receiver_.OnRtpPacket(ParsePacket(*packet_with_rtp_header));
-}
-
-TEST_F(FlexfecReceiverTest, TooDelayedFecPacketDoesNotHelp) {
-  // These values need to be updated if the underlying erasure code
-  // implementation changes.
-  const size_t kNumFrames = 49;
-  const size_t kNumMediaPacketsPerFrame = 1;
-  const size_t kNumFecPackets = 1;
-
-  PacketList media_packets;
-  PacketizeFrame(kNumMediaPacketsPerFrame, 0, &media_packets);
-  PacketizeFrame(kNumMediaPacketsPerFrame, 1, &media_packets);
-  // Protect two first frames.
-  std::list<Packet*> fec_packets = EncodeFec(media_packets, kNumFecPackets);
-  for (size_t i = 2; i < kNumFrames; ++i) {
-    PacketizeFrame(kNumMediaPacketsPerFrame, i, &media_packets);
-  }
-
-  // Drop first media packet and delay FEC packet.
-  auto media_it = media_packets.begin();
-  ++media_it;
-
-  // Receive all other media packets.
-  while (media_it != media_packets.end()) {
-    receiver_.OnRtpPacket(ParsePacket(**media_it));
-    ++media_it;
-  }
-
-  // Receive FEC packet.
-  auto fec_it = fec_packets.begin();
-  std::unique_ptr<Packet> packet_with_rtp_header =
-      packet_generator_.BuildFlexfecPacket(**fec_it);
-  receiver_.OnRtpPacket(ParsePacket(*packet_with_rtp_header));
-
-  // Do not expect a call back.
-}
-
-TEST_F(FlexfecReceiverTest, RecoversWithMediaPacketsOutOfOrder) {
-  const size_t kNumMediaPackets = 6;
-  const size_t kNumFecPackets = 2;
-
-  PacketList media_packets;
-  PacketizeFrame(kNumMediaPackets, 0, &media_packets);
-  std::list<Packet*> fec_packets = EncodeFec(media_packets, kNumFecPackets);
-
-  // Lose two media packets, and receive the others out of order.
-  auto media_it = media_packets.begin();
-  auto media_packet0 = media_it++;
-  auto media_packet1 = media_it++;
-  auto media_packet2 = media_it++;
-  auto media_packet3 = media_it++;
-  auto media_packet4 = media_it++;
-  auto media_packet5 = media_it++;
-  receiver_.OnRtpPacket(ParsePacket(**media_packet5));
-  receiver_.OnRtpPacket(ParsePacket(**media_packet2));
-  receiver_.OnRtpPacket(ParsePacket(**media_packet3));
-  receiver_.OnRtpPacket(ParsePacket(**media_packet0));
-
-  // Expect to recover lost media packets.
-  EXPECT_CALL(recovered_packet_receiver_,
-              OnRecoveredPacket(_, (*media_packet1)->length))
-      .With(Args<0, 1>(
-          ElementsAreArray((*media_packet1)->data, (*media_packet1)->length)));
-  EXPECT_CALL(recovered_packet_receiver_,
-              OnRecoveredPacket(_, (*media_packet4)->length))
-      .With(Args<0, 1>(
-          ElementsAreArray((*media_packet4)->data, (*media_packet4)->length)));
-
-  // Add FEC packets.
-  auto fec_it = fec_packets.begin();
-  std::unique_ptr<Packet> packet_with_rtp_header;
-  while (fec_it != fec_packets.end()) {
-    packet_with_rtp_header = packet_generator_.BuildFlexfecPacket(**fec_it);
-    receiver_.OnRtpPacket(ParsePacket(*packet_with_rtp_header));
-    ++fec_it;
-  }
-}
-
-// Recovered media packets may be fed back into the FlexfecReceiver by the
-// callback. This test ensures the idempotency of such a situation.
-TEST_F(FlexfecReceiverTest, RecoveryCallbackDoesNotLoopInfinitely) {
-  class LoopbackRecoveredPacketReceiver : public RecoveredPacketReceiver {
-   public:
-    const int kMaxRecursionDepth = 10;
-
-    LoopbackRecoveredPacketReceiver()
-        : receiver_(nullptr),
-          did_receive_call_back_(false),
-          recursion_depth_(0),
-          deep_recursion_(false) {}
-
-    void SetReceiver(FlexfecReceiver* receiver) { receiver_ = receiver; }
-    bool DidReceiveCallback() const { return did_receive_call_back_; }
-    bool DeepRecursion() const { return deep_recursion_; }
-
-    // Implements RecoveredPacketReceiver.
-    void OnRecoveredPacket(const uint8_t* packet, size_t length) {
-      RtpPacketReceived parsed_packet;
-      EXPECT_TRUE(parsed_packet.Parse(packet, length));
-
-      did_receive_call_back_ = true;
-
-      if (recursion_depth_ > kMaxRecursionDepth) {
-        deep_recursion_ = true;
-        return;
-      }
-      ++recursion_depth_;
-      RTC_DCHECK(receiver_);
-      receiver_->OnRtpPacket(parsed_packet);
-      --recursion_depth_;
-    }
-
-   private:
-    FlexfecReceiver* receiver_;
-    bool did_receive_call_back_;
-    int recursion_depth_;
-    bool deep_recursion_;
-  } loopback_recovered_packet_receiver;
-
-  // Feed recovered packets back into |receiver|.
-  FlexfecReceiver receiver(kFlexfecSsrc, kMediaSsrc,
-                           &loopback_recovered_packet_receiver);
-  loopback_recovered_packet_receiver.SetReceiver(&receiver);
-
-  const size_t kNumMediaPackets = 2;
-  const size_t kNumFecPackets = 1;
-
-  PacketList media_packets;
-  PacketizeFrame(kNumMediaPackets, 0, &media_packets);
-  std::list<Packet*> fec_packets = EncodeFec(media_packets, kNumFecPackets);
-
-  // Receive first media packet but drop second.
-  auto media_it = media_packets.begin();
-  receiver.OnRtpPacket(ParsePacket(**media_it));
-
-  // Receive FEC packet and verify that a packet was recovered.
-  auto fec_it = fec_packets.begin();
-  std::unique_ptr<Packet> packet_with_rtp_header =
-      packet_generator_.BuildFlexfecPacket(**fec_it);
-  receiver.OnRtpPacket(ParsePacket(*packet_with_rtp_header));
-  EXPECT_TRUE(loopback_recovered_packet_receiver.DidReceiveCallback());
-  EXPECT_FALSE(loopback_recovered_packet_receiver.DeepRecursion());
-}
-
-TEST_F(FlexfecReceiverTest, CalculatesNumberOfPackets) {
-  const size_t kNumMediaPackets = 2;
-  const size_t kNumFecPackets = 1;
-
-  PacketList media_packets;
-  PacketizeFrame(kNumMediaPackets, 0, &media_packets);
-  std::list<Packet*> fec_packets = EncodeFec(media_packets, kNumFecPackets);
-
-  // Receive first media packet but drop second.
-  auto media_it = media_packets.begin();
-  receiver_.OnRtpPacket(ParsePacket(**media_it));
-
-  // Receive FEC packet and ensure recovery of lost media packet.
-  auto fec_it = fec_packets.begin();
-  std::unique_ptr<Packet> packet_with_rtp_header =
-      packet_generator_.BuildFlexfecPacket(**fec_it);
-  media_it++;
-  EXPECT_CALL(recovered_packet_receiver_,
-              OnRecoveredPacket(_, (*media_it)->length))
-      .With(
-          Args<0, 1>(ElementsAreArray((*media_it)->data, (*media_it)->length)));
-  receiver_.OnRtpPacket(ParsePacket(*packet_with_rtp_header));
-
-  // Check stats calculations.
-  FecPacketCounter packet_counter = receiver_.GetPacketCounter();
-  EXPECT_EQ(2U, packet_counter.num_packets);
-  EXPECT_EQ(1U, packet_counter.num_fec_packets);
-  EXPECT_EQ(1U, packet_counter.num_recovered_packets);
-}
-
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/flexfec_sender.cc b/modules/rtp_rtcp/source/flexfec_sender.cc
deleted file mode 100644
index 214304f..0000000
--- a/modules/rtp_rtcp/source/flexfec_sender.cc
+++ /dev/null
@@ -1,169 +0,0 @@
-/*
- *  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/rtp_rtcp/include/flexfec_sender.h"
-
-#include <utility>
-
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
-#include "webrtc/modules/rtp_rtcp/source/forward_error_correction.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_header_extensions.h"
-#include "webrtc/rtc_base/logging.h"
-
-namespace webrtc {
-
-namespace {
-
-// Let first sequence number be in the first half of the interval.
-constexpr uint16_t kMaxInitRtpSeqNumber = 0x7fff;
-
-// See breakdown in flexfec_header_reader_writer.cc.
-constexpr size_t kFlexfecMaxHeaderSize = 32;
-
-// Since we will mainly use FlexFEC to protect video streams, we use a 90 kHz
-// clock for the RTP timestamps. (This is according to the RFC, which states
-// that it is RECOMMENDED to use the same clock frequency for FlexFEC as for
-// the protected media stream.)
-// The constant converts from clock millisecond timestamps to the 90 kHz
-// RTP timestamp.
-const int kMsToRtpTimestamp = kVideoPayloadTypeFrequency / 1000;
-
-// How often to log the generated FEC packets to the text log.
-constexpr int64_t kPacketLogIntervalMs = 10000;
-
-RtpHeaderExtensionMap RegisterBweExtensions(
-    const std::vector<RtpExtension>& rtp_header_extensions) {
-  RtpHeaderExtensionMap map;
-  for (const auto& extension : rtp_header_extensions) {
-    if (extension.uri == TransportSequenceNumber::kUri) {
-      map.Register<TransportSequenceNumber>(extension.id);
-    } else if (extension.uri == AbsoluteSendTime::kUri) {
-      map.Register<AbsoluteSendTime>(extension.id);
-    } else if (extension.uri == TransmissionOffset::kUri) {
-      map.Register<TransmissionOffset>(extension.id);
-    } else {
-      LOG(LS_INFO) << "FlexfecSender only supports RTP header extensions for "
-                   << "BWE, so the extension " << extension.ToString()
-                   << " will not be used.";
-    }
-  }
-  return map;
-}
-
-}  // namespace
-
-FlexfecSender::FlexfecSender(
-    int payload_type,
-    uint32_t ssrc,
-    uint32_t protected_media_ssrc,
-    const std::vector<RtpExtension>& rtp_header_extensions,
-    rtc::ArrayView<const RtpExtensionSize> extension_sizes,
-    const RtpState* rtp_state,
-    Clock* clock)
-    : clock_(clock),
-      random_(clock_->TimeInMicroseconds()),
-      last_generated_packet_ms_(-1),
-      payload_type_(payload_type),
-      // Reset RTP state if this is not the first time we are operating.
-      // Otherwise, randomize the initial timestamp offset and RTP sequence
-      // numbers. (This is not intended to be cryptographically strong.)
-      timestamp_offset_(rtp_state ? rtp_state->start_timestamp
-                                  : random_.Rand<uint32_t>()),
-      ssrc_(ssrc),
-      protected_media_ssrc_(protected_media_ssrc),
-      seq_num_(rtp_state ? rtp_state->sequence_number
-                         : random_.Rand(1, kMaxInitRtpSeqNumber)),
-      ulpfec_generator_(
-          ForwardErrorCorrection::CreateFlexfec(ssrc, protected_media_ssrc)),
-      rtp_header_extension_map_(RegisterBweExtensions(rtp_header_extensions)),
-      header_extensions_size_(
-          rtp_header_extension_map_.GetTotalLengthInBytes(extension_sizes)) {
-  // This object should not have been instantiated if FlexFEC is disabled.
-  RTC_DCHECK_GE(payload_type, 0);
-  RTC_DCHECK_LE(payload_type, 127);
-}
-
-FlexfecSender::~FlexfecSender() = default;
-
-// We are reusing the implementation from UlpfecGenerator for SetFecParameters,
-// AddRtpPacketAndGenerateFec, and FecAvailable.
-void FlexfecSender::SetFecParameters(const FecProtectionParams& params) {
-  ulpfec_generator_.SetFecParameters(params);
-}
-
-bool FlexfecSender::AddRtpPacketAndGenerateFec(const RtpPacketToSend& packet) {
-  // TODO(brandtr): Generalize this SSRC check when we support multistream
-  // protection.
-  RTC_DCHECK_EQ(packet.Ssrc(), protected_media_ssrc_);
-  return ulpfec_generator_.AddRtpPacketAndGenerateFec(
-             packet.data(), packet.payload_size(), packet.headers_size()) == 0;
-}
-
-bool FlexfecSender::FecAvailable() const {
-  return ulpfec_generator_.FecAvailable();
-}
-
-std::vector<std::unique_ptr<RtpPacketToSend>> FlexfecSender::GetFecPackets() {
-  std::vector<std::unique_ptr<RtpPacketToSend>> fec_packets_to_send;
-  fec_packets_to_send.reserve(ulpfec_generator_.generated_fec_packets_.size());
-  for (const auto& fec_packet : ulpfec_generator_.generated_fec_packets_) {
-    std::unique_ptr<RtpPacketToSend> fec_packet_to_send(
-        new RtpPacketToSend(&rtp_header_extension_map_));
-
-    // RTP header.
-    fec_packet_to_send->SetMarker(false);
-    fec_packet_to_send->SetPayloadType(payload_type_);
-    fec_packet_to_send->SetSequenceNumber(seq_num_++);
-    fec_packet_to_send->SetTimestamp(
-        timestamp_offset_ +
-        static_cast<uint32_t>(kMsToRtpTimestamp *
-                              clock_->TimeInMilliseconds()));
-    // Set "capture time" so that the TransmissionOffset header extension
-    // can be set by the RTPSender.
-    fec_packet_to_send->set_capture_time_ms(clock_->TimeInMilliseconds());
-    fec_packet_to_send->SetSsrc(ssrc_);
-    // Reserve extensions, if registered. These will be set by the RTPSender.
-    fec_packet_to_send->ReserveExtension<AbsoluteSendTime>();
-    fec_packet_to_send->ReserveExtension<TransmissionOffset>();
-    fec_packet_to_send->ReserveExtension<TransportSequenceNumber>();
-
-    // RTP payload.
-    uint8_t* payload = fec_packet_to_send->AllocatePayload(fec_packet->length);
-    memcpy(payload, fec_packet->data, fec_packet->length);
-
-    fec_packets_to_send.push_back(std::move(fec_packet_to_send));
-  }
-  ulpfec_generator_.ResetState();
-
-  int64_t now_ms = clock_->TimeInMilliseconds();
-  if (!fec_packets_to_send.empty() &&
-      now_ms - last_generated_packet_ms_ > kPacketLogIntervalMs) {
-    LOG(LS_VERBOSE) << "Generated " << fec_packets_to_send.size()
-                    << " FlexFEC packets with payload type: " << payload_type_
-                    << " and SSRC: " << ssrc_ << ".";
-    last_generated_packet_ms_ = now_ms;
-  }
-
-  return fec_packets_to_send;
-}
-
-// The overhead is BWE RTP header extensions and FlexFEC header.
-size_t FlexfecSender::MaxPacketOverhead() const {
-  return header_extensions_size_ + kFlexfecMaxHeaderSize;
-}
-
-RtpState FlexfecSender::GetRtpState() {
-  RtpState rtp_state;
-  rtp_state.sequence_number = seq_num_;
-  rtp_state.start_timestamp = timestamp_offset_;
-  return rtp_state;
-}
-
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/flexfec_sender_unittest.cc b/modules/rtp_rtcp/source/flexfec_sender_unittest.cc
deleted file mode 100644
index da33837..0000000
--- a/modules/rtp_rtcp/source/flexfec_sender_unittest.cc
+++ /dev/null
@@ -1,323 +0,0 @@
-/*
- *  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 <vector>
-
-#include "webrtc/api/rtpparameters.h"
-#include "webrtc/modules/rtp_rtcp/include/flexfec_sender.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
-#include "webrtc/modules/rtp_rtcp/source/fec_test_helper.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_header_extensions.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_packet_to_send.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_sender.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_utility.h"
-#include "webrtc/system_wrappers/include/clock.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-namespace {
-
-using RtpUtility::Word32Align;
-using test::fec::AugmentedPacket;
-using test::fec::AugmentedPacketGenerator;
-
-constexpr int kFlexfecPayloadType = 123;
-constexpr uint32_t kMediaSsrc = 1234;
-constexpr uint32_t kFlexfecSsrc = 5678;
-const std::vector<RtpExtension> kNoRtpHeaderExtensions;
-const std::vector<RtpExtensionSize> kNoRtpHeaderExtensionSizes;
-// Assume a single protected media SSRC.
-constexpr size_t kFlexfecMaxHeaderSize = 32;
-constexpr size_t kPayloadLength = 50;
-
-constexpr int64_t kInitialSimulatedClockTime = 1;
-// These values are deterministically given by the PRNG, due to our fixed seed.
-// They should be updated if the PRNG implementation changes.
-constexpr uint16_t kDeterministicSequenceNumber = 28732;
-constexpr uint32_t kDeterministicTimestamp = 2305613085;
-
-std::unique_ptr<RtpPacketToSend> GenerateSingleFlexfecPacket(
-    FlexfecSender* sender) {
-  // Parameters selected to generate a single FEC packet.
-  FecProtectionParams params;
-  params.fec_rate = 15;
-  params.max_fec_frames = 1;
-  params.fec_mask_type = kFecMaskRandom;
-  constexpr size_t kNumPackets = 4;
-
-  sender->SetFecParameters(params);
-  AugmentedPacketGenerator packet_generator(kMediaSsrc);
-  packet_generator.NewFrame(kNumPackets);
-  for (size_t i = 0; i < kNumPackets; ++i) {
-    std::unique_ptr<AugmentedPacket> packet =
-        packet_generator.NextPacket(i, kPayloadLength);
-    RtpPacketToSend rtp_packet(nullptr);  // No header extensions.
-    rtp_packet.Parse(packet->data, packet->length);
-    EXPECT_TRUE(sender->AddRtpPacketAndGenerateFec(rtp_packet));
-  }
-  EXPECT_TRUE(sender->FecAvailable());
-  std::vector<std::unique_ptr<RtpPacketToSend>> fec_packets =
-      sender->GetFecPackets();
-  EXPECT_FALSE(sender->FecAvailable());
-  EXPECT_EQ(1U, fec_packets.size());
-
-  return std::move(fec_packets.front());
-}
-
-}  // namespace
-
-TEST(FlexfecSenderTest, Ssrc) {
-  SimulatedClock clock(kInitialSimulatedClockTime);
-  FlexfecSender sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc,
-                       kNoRtpHeaderExtensions, kNoRtpHeaderExtensionSizes,
-                       nullptr /* rtp_state */, &clock);
-
-  EXPECT_EQ(kFlexfecSsrc, sender.ssrc());
-}
-
-TEST(FlexfecSenderTest, NoFecAvailableBeforeMediaAdded) {
-  SimulatedClock clock(kInitialSimulatedClockTime);
-  FlexfecSender sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc,
-                       kNoRtpHeaderExtensions, kNoRtpHeaderExtensionSizes,
-                       nullptr /* rtp_state */, &clock);
-
-  EXPECT_FALSE(sender.FecAvailable());
-  auto fec_packets = sender.GetFecPackets();
-  EXPECT_EQ(0U, fec_packets.size());
-}
-
-TEST(FlexfecSenderTest, ProtectOneFrameWithOneFecPacket) {
-  SimulatedClock clock(kInitialSimulatedClockTime);
-  FlexfecSender sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc,
-                       kNoRtpHeaderExtensions, kNoRtpHeaderExtensionSizes,
-                       nullptr /* rtp_state */, &clock);
-  auto fec_packet = GenerateSingleFlexfecPacket(&sender);
-
-  EXPECT_EQ(kRtpHeaderSize, fec_packet->headers_size());
-  EXPECT_FALSE(fec_packet->Marker());
-  EXPECT_EQ(kFlexfecPayloadType, fec_packet->PayloadType());
-  EXPECT_EQ(kDeterministicSequenceNumber, fec_packet->SequenceNumber());
-  EXPECT_EQ(kDeterministicTimestamp, fec_packet->Timestamp());
-  EXPECT_EQ(kFlexfecSsrc, fec_packet->Ssrc());
-  EXPECT_LE(kPayloadLength, fec_packet->payload_size());
-}
-
-TEST(FlexfecSenderTest, ProtectTwoFramesWithOneFecPacket) {
-  // FEC parameters selected to generate a single FEC packet per frame.
-  FecProtectionParams params;
-  params.fec_rate = 15;
-  params.max_fec_frames = 2;
-  params.fec_mask_type = kFecMaskRandom;
-  constexpr size_t kNumFrames = 2;
-  constexpr size_t kNumPacketsPerFrame = 2;
-  SimulatedClock clock(kInitialSimulatedClockTime);
-  FlexfecSender sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc,
-                       kNoRtpHeaderExtensions, kNoRtpHeaderExtensionSizes,
-                       nullptr /* rtp_state */, &clock);
-  sender.SetFecParameters(params);
-
-  AugmentedPacketGenerator packet_generator(kMediaSsrc);
-  for (size_t i = 0; i < kNumFrames; ++i) {
-    packet_generator.NewFrame(kNumPacketsPerFrame);
-    for (size_t j = 0; j < kNumPacketsPerFrame; ++j) {
-      std::unique_ptr<AugmentedPacket> packet =
-          packet_generator.NextPacket(i, kPayloadLength);
-      RtpPacketToSend rtp_packet(nullptr);
-      rtp_packet.Parse(packet->data, packet->length);
-      EXPECT_TRUE(sender.AddRtpPacketAndGenerateFec(rtp_packet));
-    }
-  }
-  EXPECT_TRUE(sender.FecAvailable());
-  std::vector<std::unique_ptr<RtpPacketToSend>> fec_packets =
-      sender.GetFecPackets();
-  EXPECT_FALSE(sender.FecAvailable());
-  ASSERT_EQ(1U, fec_packets.size());
-
-  RtpPacketToSend* fec_packet = fec_packets.front().get();
-  EXPECT_EQ(kRtpHeaderSize, fec_packet->headers_size());
-  EXPECT_FALSE(fec_packet->Marker());
-  EXPECT_EQ(kFlexfecPayloadType, fec_packet->PayloadType());
-  EXPECT_EQ(kDeterministicSequenceNumber, fec_packet->SequenceNumber());
-  EXPECT_EQ(kDeterministicTimestamp, fec_packet->Timestamp());
-  EXPECT_EQ(kFlexfecSsrc, fec_packet->Ssrc());
-}
-
-TEST(FlexfecSenderTest, ProtectTwoFramesWithTwoFecPackets) {
-  // FEC parameters selected to generate a single FEC packet per frame.
-  FecProtectionParams params;
-  params.fec_rate = 30;
-  params.max_fec_frames = 1;
-  params.fec_mask_type = kFecMaskRandom;
-  constexpr size_t kNumFrames = 2;
-  constexpr size_t kNumPacketsPerFrame = 2;
-  SimulatedClock clock(kInitialSimulatedClockTime);
-  FlexfecSender sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc,
-                       kNoRtpHeaderExtensions, kNoRtpHeaderExtensionSizes,
-                       nullptr /* rtp_state */, &clock);
-  sender.SetFecParameters(params);
-
-  AugmentedPacketGenerator packet_generator(kMediaSsrc);
-  for (size_t i = 0; i < kNumFrames; ++i) {
-    packet_generator.NewFrame(kNumPacketsPerFrame);
-    for (size_t j = 0; j < kNumPacketsPerFrame; ++j) {
-      std::unique_ptr<AugmentedPacket> packet =
-          packet_generator.NextPacket(i, kPayloadLength);
-      RtpPacketToSend rtp_packet(nullptr);
-      rtp_packet.Parse(packet->data, packet->length);
-      EXPECT_TRUE(sender.AddRtpPacketAndGenerateFec(rtp_packet));
-    }
-    EXPECT_TRUE(sender.FecAvailable());
-    std::vector<std::unique_ptr<RtpPacketToSend>> fec_packets =
-        sender.GetFecPackets();
-    EXPECT_FALSE(sender.FecAvailable());
-    ASSERT_EQ(1U, fec_packets.size());
-
-    RtpPacketToSend* fec_packet = fec_packets.front().get();
-    EXPECT_EQ(kRtpHeaderSize, fec_packet->headers_size());
-    EXPECT_FALSE(fec_packet->Marker());
-    EXPECT_EQ(kFlexfecPayloadType, fec_packet->PayloadType());
-    EXPECT_EQ(static_cast<uint16_t>(kDeterministicSequenceNumber + i),
-              fec_packet->SequenceNumber());
-    EXPECT_EQ(kDeterministicTimestamp, fec_packet->Timestamp());
-    EXPECT_EQ(kFlexfecSsrc, fec_packet->Ssrc());
-  }
-}
-
-// In the tests, we only consider RTP header extensions that are useful for BWE.
-TEST(FlexfecSenderTest, NoRtpHeaderExtensionsForBweByDefault) {
-  const std::vector<RtpExtension> kRtpHeaderExtensions{};
-  SimulatedClock clock(kInitialSimulatedClockTime);
-  FlexfecSender sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc,
-                       kRtpHeaderExtensions, kNoRtpHeaderExtensionSizes,
-                       nullptr /* rtp_state */, &clock);
-  auto fec_packet = GenerateSingleFlexfecPacket(&sender);
-
-  EXPECT_FALSE(fec_packet->HasExtension<AbsoluteSendTime>());
-  EXPECT_FALSE(fec_packet->HasExtension<TransmissionOffset>());
-  EXPECT_FALSE(fec_packet->HasExtension<TransportSequenceNumber>());
-}
-
-TEST(FlexfecSenderTest, RegisterAbsoluteSendTimeRtpHeaderExtension) {
-  const std::vector<RtpExtension> kRtpHeaderExtensions{
-      {RtpExtension::kAbsSendTimeUri, 1}};
-  SimulatedClock clock(kInitialSimulatedClockTime);
-  FlexfecSender sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc,
-                       kRtpHeaderExtensions, kNoRtpHeaderExtensionSizes,
-                       nullptr /* rtp_state */, &clock);
-  auto fec_packet = GenerateSingleFlexfecPacket(&sender);
-
-  EXPECT_TRUE(fec_packet->HasExtension<AbsoluteSendTime>());
-  EXPECT_FALSE(fec_packet->HasExtension<TransmissionOffset>());
-  EXPECT_FALSE(fec_packet->HasExtension<TransportSequenceNumber>());
-}
-
-TEST(FlexfecSenderTest, RegisterTransmissionOffsetRtpHeaderExtension) {
-  const std::vector<RtpExtension> kRtpHeaderExtensions{
-      {RtpExtension::kTimestampOffsetUri, 1}};
-  SimulatedClock clock(kInitialSimulatedClockTime);
-  FlexfecSender sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc,
-                       kRtpHeaderExtensions, kNoRtpHeaderExtensionSizes,
-                       nullptr /* rtp_state */, &clock);
-  auto fec_packet = GenerateSingleFlexfecPacket(&sender);
-
-  EXPECT_FALSE(fec_packet->HasExtension<AbsoluteSendTime>());
-  EXPECT_TRUE(fec_packet->HasExtension<TransmissionOffset>());
-  EXPECT_FALSE(fec_packet->HasExtension<TransportSequenceNumber>());
-}
-
-TEST(FlexfecSenderTest, RegisterTransportSequenceNumberRtpHeaderExtension) {
-  const std::vector<RtpExtension> kRtpHeaderExtensions{
-      {RtpExtension::kTransportSequenceNumberUri, 1}};
-  SimulatedClock clock(kInitialSimulatedClockTime);
-  FlexfecSender sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc,
-                       kRtpHeaderExtensions, kNoRtpHeaderExtensionSizes,
-                       nullptr /* rtp_state */, &clock);
-  auto fec_packet = GenerateSingleFlexfecPacket(&sender);
-
-  EXPECT_FALSE(fec_packet->HasExtension<AbsoluteSendTime>());
-  EXPECT_FALSE(fec_packet->HasExtension<TransmissionOffset>());
-  EXPECT_TRUE(fec_packet->HasExtension<TransportSequenceNumber>());
-}
-
-TEST(FlexfecSenderTest, RegisterAllRtpHeaderExtensionsForBwe) {
-  const std::vector<RtpExtension> kRtpHeaderExtensions{
-      {RtpExtension::kAbsSendTimeUri, 1},
-      {RtpExtension::kTimestampOffsetUri, 2},
-      {RtpExtension::kTransportSequenceNumberUri, 3}};
-  SimulatedClock clock(kInitialSimulatedClockTime);
-  FlexfecSender sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc,
-                       kRtpHeaderExtensions, kNoRtpHeaderExtensionSizes,
-                       nullptr /* rtp_state */, &clock);
-  auto fec_packet = GenerateSingleFlexfecPacket(&sender);
-
-  EXPECT_TRUE(fec_packet->HasExtension<AbsoluteSendTime>());
-  EXPECT_TRUE(fec_packet->HasExtension<TransmissionOffset>());
-  EXPECT_TRUE(fec_packet->HasExtension<TransportSequenceNumber>());
-}
-
-TEST(FlexfecSenderTest, MaxPacketOverhead) {
-  SimulatedClock clock(kInitialSimulatedClockTime);
-  FlexfecSender sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc,
-                       kNoRtpHeaderExtensions, kNoRtpHeaderExtensionSizes,
-                       nullptr /* rtp_state */, &clock);
-
-  EXPECT_EQ(kFlexfecMaxHeaderSize, sender.MaxPacketOverhead());
-}
-
-TEST(FlexfecSenderTest, MaxPacketOverheadWithExtensions) {
-  const std::vector<RtpExtension> kRtpHeaderExtensions{
-      {RtpExtension::kAbsSendTimeUri, 1},
-      {RtpExtension::kTimestampOffsetUri, 2},
-      {RtpExtension::kTransportSequenceNumberUri, 3}};
-  SimulatedClock clock(kInitialSimulatedClockTime);
-  const size_t kExtensionHeaderLength = 1;
-  const size_t kRtpOneByteHeaderLength = 4;
-  const size_t kExtensionsTotalSize = Word32Align(
-      kRtpOneByteHeaderLength +
-      kExtensionHeaderLength + AbsoluteSendTime::kValueSizeBytes +
-      kExtensionHeaderLength + TransmissionOffset::kValueSizeBytes +
-      kExtensionHeaderLength + TransportSequenceNumber::kValueSizeBytes);
-  FlexfecSender sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc,
-                       kRtpHeaderExtensions, RTPSender::FecExtensionSizes(),
-                       nullptr /* rtp_state */, &clock);
-
-  EXPECT_EQ(kExtensionsTotalSize + kFlexfecMaxHeaderSize,
-            sender.MaxPacketOverhead());
-}
-
-TEST(FlexfecSenderTest, SetsAndGetsRtpState) {
-  RtpState initial_rtp_state;
-  initial_rtp_state.sequence_number = 100;
-  initial_rtp_state.start_timestamp = 200;
-  SimulatedClock clock(kInitialSimulatedClockTime);
-  FlexfecSender sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc,
-                       kNoRtpHeaderExtensions, kNoRtpHeaderExtensionSizes,
-                       &initial_rtp_state, &clock);
-
-  auto fec_packet = GenerateSingleFlexfecPacket(&sender);
-  EXPECT_EQ(initial_rtp_state.sequence_number, fec_packet->SequenceNumber());
-  EXPECT_EQ(initial_rtp_state.start_timestamp, fec_packet->Timestamp());
-
-  clock.AdvanceTimeMilliseconds(1000);
-  fec_packet = GenerateSingleFlexfecPacket(&sender);
-  EXPECT_EQ(initial_rtp_state.sequence_number + 1,
-            fec_packet->SequenceNumber());
-  EXPECT_EQ(initial_rtp_state.start_timestamp + 1 * kVideoPayloadTypeFrequency,
-            fec_packet->Timestamp());
-
-  RtpState updated_rtp_state = sender.GetRtpState();
-  EXPECT_EQ(initial_rtp_state.sequence_number + 2,
-            updated_rtp_state.sequence_number);
-  EXPECT_EQ(initial_rtp_state.start_timestamp,
-            updated_rtp_state.start_timestamp);
-}
-
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/forward_error_correction.cc b/modules/rtp_rtcp/source/forward_error_correction.cc
deleted file mode 100644
index 7e524bf..0000000
--- a/modules/rtp_rtcp/source/forward_error_correction.cc
+++ /dev/null
@@ -1,793 +0,0 @@
-/*
- *  Copyright (c) 2012 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/rtp_rtcp/source/forward_error_correction.h"
-
-#include <string.h>
-
-#include <algorithm>
-#include <iterator>
-#include <utility>
-
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
-#include "webrtc/modules/rtp_rtcp/source/byte_io.h"
-#include "webrtc/modules/rtp_rtcp/source/flexfec_header_reader_writer.h"
-#include "webrtc/modules/rtp_rtcp/source/forward_error_correction_internal.h"
-#include "webrtc/modules/rtp_rtcp/source/ulpfec_header_reader_writer.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-
-namespace webrtc {
-
-namespace {
-// Transport header size in bytes. Assume UDP/IPv4 as a reasonable minimum.
-constexpr size_t kTransportOverhead = 28;
-}  // namespace
-
-ForwardErrorCorrection::Packet::Packet() : length(0), data(), ref_count_(0) {}
-ForwardErrorCorrection::Packet::~Packet() = default;
-
-int32_t ForwardErrorCorrection::Packet::AddRef() {
-  return ++ref_count_;
-}
-
-int32_t ForwardErrorCorrection::Packet::Release() {
-  int32_t ref_count;
-  ref_count = --ref_count_;
-  if (ref_count == 0)
-    delete this;
-  return ref_count;
-}
-
-// This comparator is used to compare std::unique_ptr's pointing to
-// subclasses of SortablePackets. It needs to be parametric since
-// the std::unique_ptr's are not covariant w.r.t. the types that
-// they are pointing to.
-template <typename S, typename T>
-bool ForwardErrorCorrection::SortablePacket::LessThan::operator() (
-    const S& first,
-    const T& second) {
-  RTC_DCHECK_EQ(first->ssrc, second->ssrc);
-  return IsNewerSequenceNumber(second->seq_num, first->seq_num);
-}
-
-ForwardErrorCorrection::ReceivedPacket::ReceivedPacket() = default;
-ForwardErrorCorrection::ReceivedPacket::~ReceivedPacket() = default;
-
-ForwardErrorCorrection::RecoveredPacket::RecoveredPacket() = default;
-ForwardErrorCorrection::RecoveredPacket::~RecoveredPacket() = default;
-
-ForwardErrorCorrection::ProtectedPacket::ProtectedPacket() = default;
-ForwardErrorCorrection::ProtectedPacket::~ProtectedPacket() = default;
-
-ForwardErrorCorrection::ReceivedFecPacket::ReceivedFecPacket() = default;
-ForwardErrorCorrection::ReceivedFecPacket::~ReceivedFecPacket() = default;
-
-ForwardErrorCorrection::ForwardErrorCorrection(
-    std::unique_ptr<FecHeaderReader> fec_header_reader,
-    std::unique_ptr<FecHeaderWriter> fec_header_writer,
-    uint32_t ssrc,
-    uint32_t protected_media_ssrc)
-    : ssrc_(ssrc),
-      protected_media_ssrc_(protected_media_ssrc),
-      fec_header_reader_(std::move(fec_header_reader)),
-      fec_header_writer_(std::move(fec_header_writer)),
-      generated_fec_packets_(fec_header_writer_->MaxFecPackets()),
-      packet_mask_size_(0) {}
-
-ForwardErrorCorrection::~ForwardErrorCorrection() = default;
-
-std::unique_ptr<ForwardErrorCorrection> ForwardErrorCorrection::CreateUlpfec(
-    uint32_t ssrc) {
-  std::unique_ptr<FecHeaderReader> fec_header_reader(new UlpfecHeaderReader());
-  std::unique_ptr<FecHeaderWriter> fec_header_writer(new UlpfecHeaderWriter());
-  return std::unique_ptr<ForwardErrorCorrection>(new ForwardErrorCorrection(
-      std::move(fec_header_reader), std::move(fec_header_writer), ssrc, ssrc));
-}
-
-std::unique_ptr<ForwardErrorCorrection> ForwardErrorCorrection::CreateFlexfec(
-    uint32_t ssrc,
-    uint32_t protected_media_ssrc) {
-  std::unique_ptr<FecHeaderReader> fec_header_reader(new FlexfecHeaderReader());
-  std::unique_ptr<FecHeaderWriter> fec_header_writer(new FlexfecHeaderWriter());
-  return std::unique_ptr<ForwardErrorCorrection>(new ForwardErrorCorrection(
-      std::move(fec_header_reader), std::move(fec_header_writer), ssrc,
-      protected_media_ssrc));
-}
-
-int ForwardErrorCorrection::EncodeFec(const PacketList& media_packets,
-                                      uint8_t protection_factor,
-                                      int num_important_packets,
-                                      bool use_unequal_protection,
-                                      FecMaskType fec_mask_type,
-                                      std::list<Packet*>* fec_packets) {
-  const size_t num_media_packets = media_packets.size();
-
-  // Sanity check arguments.
-  RTC_DCHECK_GT(num_media_packets, 0);
-  RTC_DCHECK_GE(num_important_packets, 0);
-  RTC_DCHECK_LE(num_important_packets, num_media_packets);
-  RTC_DCHECK(fec_packets->empty());
-  const size_t max_media_packets = fec_header_writer_->MaxMediaPackets();
-  if (num_media_packets > max_media_packets) {
-    LOG(LS_WARNING) << "Can't protect " << num_media_packets
-                    << " media packets per frame. Max is " << max_media_packets
-                    << ".";
-    return -1;
-  }
-
-  // Error check the media packets.
-  for (const auto& media_packet : media_packets) {
-    RTC_DCHECK(media_packet);
-    if (media_packet->length < kRtpHeaderSize) {
-      LOG(LS_WARNING) << "Media packet " << media_packet->length << " bytes "
-                      << "is smaller than RTP header.";
-      return -1;
-    }
-    // Ensure the FEC packets will fit in a typical MTU.
-    if (media_packet->length + MaxPacketOverhead() + kTransportOverhead >
-        IP_PACKET_SIZE) {
-      LOG(LS_WARNING) << "Media packet " << media_packet->length << " bytes "
-                      << "with overhead is larger than " << IP_PACKET_SIZE
-                      << " bytes.";
-    }
-  }
-
-  // Prepare generated FEC packets.
-  int num_fec_packets = NumFecPackets(num_media_packets, protection_factor);
-  if (num_fec_packets == 0) {
-    return 0;
-  }
-  for (int i = 0; i < num_fec_packets; ++i) {
-    memset(generated_fec_packets_[i].data, 0, IP_PACKET_SIZE);
-    // Use this as a marker for untouched packets.
-    generated_fec_packets_[i].length = 0;
-    fec_packets->push_back(&generated_fec_packets_[i]);
-  }
-
-  const internal::PacketMaskTable mask_table(fec_mask_type, num_media_packets);
-  packet_mask_size_ = internal::PacketMaskSize(num_media_packets);
-  memset(packet_masks_, 0, num_fec_packets * packet_mask_size_);
-  internal::GeneratePacketMasks(num_media_packets, num_fec_packets,
-                                num_important_packets, use_unequal_protection,
-                                mask_table, packet_masks_);
-
-  // Adapt packet masks to missing media packets.
-  int num_mask_bits = InsertZerosInPacketMasks(media_packets, num_fec_packets);
-  if (num_mask_bits < 0) {
-    return -1;
-  }
-  packet_mask_size_ = internal::PacketMaskSize(num_mask_bits);
-
-  // Write FEC packets to |generated_fec_packets_|.
-  GenerateFecPayloads(media_packets, num_fec_packets);
-  // TODO(brandtr): Generalize this when multistream protection support is
-  // added.
-  const uint32_t media_ssrc = ParseSsrc(media_packets.front()->data);
-  const uint16_t seq_num_base =
-      ParseSequenceNumber(media_packets.front()->data);
-  FinalizeFecHeaders(num_fec_packets, media_ssrc, seq_num_base);
-
-  return 0;
-}
-
-int ForwardErrorCorrection::NumFecPackets(int num_media_packets,
-                                          int protection_factor) {
-  // Result in Q0 with an unsigned round.
-  int num_fec_packets = (num_media_packets * protection_factor + (1 << 7)) >> 8;
-  // Generate at least one FEC packet if we need protection.
-  if (protection_factor > 0 && num_fec_packets == 0) {
-    num_fec_packets = 1;
-  }
-  RTC_DCHECK_LE(num_fec_packets, num_media_packets);
-  return num_fec_packets;
-}
-
-void ForwardErrorCorrection::GenerateFecPayloads(
-    const PacketList& media_packets,
-    size_t num_fec_packets) {
-  RTC_DCHECK(!media_packets.empty());
-  for (size_t i = 0; i < num_fec_packets; ++i) {
-    Packet* const fec_packet = &generated_fec_packets_[i];
-    size_t pkt_mask_idx = i * packet_mask_size_;
-    const size_t min_packet_mask_size = fec_header_writer_->MinPacketMaskSize(
-        &packet_masks_[pkt_mask_idx], packet_mask_size_);
-    const size_t fec_header_size =
-        fec_header_writer_->FecHeaderSize(min_packet_mask_size);
-
-    size_t media_pkt_idx = 0;
-    auto media_packets_it = media_packets.cbegin();
-    uint16_t prev_seq_num = ParseSequenceNumber((*media_packets_it)->data);
-    while (media_packets_it != media_packets.end()) {
-      Packet* const media_packet = media_packets_it->get();
-      // Should |media_packet| be protected by |fec_packet|?
-      if (packet_masks_[pkt_mask_idx] & (1 << (7 - media_pkt_idx))) {
-        size_t media_payload_length = media_packet->length - kRtpHeaderSize;
-
-        bool first_protected_packet = (fec_packet->length == 0);
-        size_t fec_packet_length = fec_header_size + media_payload_length;
-        if (fec_packet_length > fec_packet->length) {
-          // Recall that XORing with zero (which the FEC packets are prefilled
-          // with) is the identity operator, thus all prior XORs are
-          // still correct even though we expand the packet length here.
-          fec_packet->length = fec_packet_length;
-        }
-        if (first_protected_packet) {
-          // Write P, X, CC, M, and PT recovery fields.
-          // Note that bits 0, 1, and 16 are overwritten in FinalizeFecHeaders.
-          memcpy(&fec_packet->data[0], &media_packet->data[0], 2);
-          // Write length recovery field. (This is a temporary location for
-          // ULPFEC.)
-          ByteWriter<uint16_t>::WriteBigEndian(&fec_packet->data[2],
-                                               media_payload_length);
-          // Write timestamp recovery field.
-          memcpy(&fec_packet->data[4], &media_packet->data[4], 4);
-          // Write payload.
-          memcpy(&fec_packet->data[fec_header_size],
-                 &media_packet->data[kRtpHeaderSize], media_payload_length);
-        } else {
-          XorHeaders(*media_packet, fec_packet);
-          XorPayloads(*media_packet, media_payload_length, fec_header_size,
-                      fec_packet);
-        }
-      }
-      media_packets_it++;
-      if (media_packets_it != media_packets.end()) {
-        uint16_t seq_num = ParseSequenceNumber((*media_packets_it)->data);
-        media_pkt_idx += static_cast<uint16_t>(seq_num - prev_seq_num);
-        prev_seq_num = seq_num;
-      }
-      pkt_mask_idx += media_pkt_idx / 8;
-      media_pkt_idx %= 8;
-    }
-    RTC_DCHECK_GT(fec_packet->length, 0)
-        << "Packet mask is wrong or poorly designed.";
-  }
-}
-
-int ForwardErrorCorrection::InsertZerosInPacketMasks(
-    const PacketList& media_packets,
-    size_t num_fec_packets) {
-  size_t num_media_packets = media_packets.size();
-  if (num_media_packets <= 1) {
-    return num_media_packets;
-  }
-  uint16_t last_seq_num = ParseSequenceNumber(media_packets.back()->data);
-  uint16_t first_seq_num = ParseSequenceNumber(media_packets.front()->data);
-  size_t total_missing_seq_nums =
-      static_cast<uint16_t>(last_seq_num - first_seq_num) - num_media_packets +
-      1;
-  if (total_missing_seq_nums == 0) {
-    // All sequence numbers are covered by the packet mask.
-    // No zero insertion required.
-    return num_media_packets;
-  }
-  const size_t max_media_packets = fec_header_writer_->MaxMediaPackets();
-  if (total_missing_seq_nums + num_media_packets > max_media_packets) {
-    return -1;
-  }
-  // Allocate the new mask.
-  size_t tmp_packet_mask_size =
-      internal::PacketMaskSize(total_missing_seq_nums + num_media_packets);
-  memset(tmp_packet_masks_, 0, num_fec_packets * tmp_packet_mask_size);
-
-  auto media_packets_it = media_packets.cbegin();
-  uint16_t prev_seq_num = first_seq_num;
-  ++media_packets_it;
-
-  // Insert the first column.
-  internal::CopyColumn(tmp_packet_masks_, tmp_packet_mask_size, packet_masks_,
-                       packet_mask_size_, num_fec_packets, 0, 0);
-  size_t new_bit_index = 1;
-  size_t old_bit_index = 1;
-  // Insert zeros in the bit mask for every hole in the sequence.
-  while (media_packets_it != media_packets.end()) {
-    if (new_bit_index == max_media_packets) {
-      // We can only cover up to 48 packets.
-      break;
-    }
-    uint16_t seq_num = ParseSequenceNumber((*media_packets_it)->data);
-    const int num_zeros_to_insert =
-        static_cast<uint16_t>(seq_num - prev_seq_num - 1);
-    if (num_zeros_to_insert > 0) {
-      internal::InsertZeroColumns(num_zeros_to_insert, tmp_packet_masks_,
-                                  tmp_packet_mask_size, num_fec_packets,
-                                  new_bit_index);
-    }
-    new_bit_index += num_zeros_to_insert;
-    internal::CopyColumn(tmp_packet_masks_, tmp_packet_mask_size, packet_masks_,
-                         packet_mask_size_, num_fec_packets, new_bit_index,
-                         old_bit_index);
-    ++new_bit_index;
-    ++old_bit_index;
-    prev_seq_num = seq_num;
-    ++media_packets_it;
-  }
-  if (new_bit_index % 8 != 0) {
-    // We didn't fill the last byte. Shift bits to correct position.
-    for (uint16_t row = 0; row < num_fec_packets; ++row) {
-      int new_byte_index = row * tmp_packet_mask_size + new_bit_index / 8;
-      tmp_packet_masks_[new_byte_index] <<= (7 - (new_bit_index % 8));
-    }
-  }
-  // Replace the old mask with the new.
-  memcpy(packet_masks_, tmp_packet_masks_,
-         num_fec_packets * tmp_packet_mask_size);
-  return new_bit_index;
-}
-
-void ForwardErrorCorrection::FinalizeFecHeaders(size_t num_fec_packets,
-                                                uint32_t media_ssrc,
-                                                uint16_t seq_num_base) {
-  for (size_t i = 0; i < num_fec_packets; ++i) {
-    fec_header_writer_->FinalizeFecHeader(
-        media_ssrc, seq_num_base, &packet_masks_[i * packet_mask_size_],
-        packet_mask_size_, &generated_fec_packets_[i]);
-  }
-}
-
-void ForwardErrorCorrection::ResetState(
-    RecoveredPacketList* recovered_packets) {
-  // Free the memory for any existing recovered packets, if the caller hasn't.
-  recovered_packets->clear();
-  received_fec_packets_.clear();
-}
-
-void ForwardErrorCorrection::InsertMediaPacket(
-    RecoveredPacketList* recovered_packets,
-    ReceivedPacket* received_packet) {
-  RTC_DCHECK_EQ(received_packet->ssrc, protected_media_ssrc_);
-
-  // Search for duplicate packets.
-  for (const auto& recovered_packet : *recovered_packets) {
-    RTC_DCHECK_EQ(recovered_packet->ssrc, received_packet->ssrc);
-    if (recovered_packet->seq_num == received_packet->seq_num) {
-      // Duplicate packet, no need to add to list.
-      // Delete duplicate media packet data.
-      received_packet->pkt = nullptr;
-      return;
-    }
-  }
-
-  std::unique_ptr<RecoveredPacket> recovered_packet(new RecoveredPacket());
-  // This "recovered packet" was not recovered using parity packets.
-  recovered_packet->was_recovered = false;
-  // This media packet has already been passed on.
-  recovered_packet->returned = true;
-  recovered_packet->ssrc = received_packet->ssrc;
-  recovered_packet->seq_num = received_packet->seq_num;
-  recovered_packet->pkt = received_packet->pkt;
-  recovered_packet->pkt->length = received_packet->pkt->length;
-  // TODO(holmer): Consider replacing this with a binary search for the right
-  // position, and then just insert the new packet. Would get rid of the sort.
-  RecoveredPacket* recovered_packet_ptr = recovered_packet.get();
-  recovered_packets->push_back(std::move(recovered_packet));
-  recovered_packets->sort(SortablePacket::LessThan());
-  UpdateCoveringFecPackets(*recovered_packet_ptr);
-}
-
-void ForwardErrorCorrection::UpdateCoveringFecPackets(
-    const RecoveredPacket& packet) {
-  for (auto& fec_packet : received_fec_packets_) {
-    // Is this FEC packet protecting the media packet |packet|?
-    auto protected_it = std::lower_bound(fec_packet->protected_packets.begin(),
-                                         fec_packet->protected_packets.end(),
-                                         &packet, SortablePacket::LessThan());
-    if (protected_it != fec_packet->protected_packets.end() &&
-        (*protected_it)->seq_num == packet.seq_num) {
-      // Found an FEC packet which is protecting |packet|.
-      (*protected_it)->pkt = packet.pkt;
-    }
-  }
-}
-
-void ForwardErrorCorrection::InsertFecPacket(
-    const RecoveredPacketList& recovered_packets,
-    ReceivedPacket* received_packet) {
-  RTC_DCHECK_EQ(received_packet->ssrc, ssrc_);
-
-  // Check for duplicate.
-  for (const auto& existing_fec_packet : received_fec_packets_) {
-    RTC_DCHECK_EQ(existing_fec_packet->ssrc, received_packet->ssrc);
-    if (existing_fec_packet->seq_num == received_packet->seq_num) {
-      // Delete duplicate FEC packet data.
-      received_packet->pkt = nullptr;
-      return;
-    }
-  }
-
-  std::unique_ptr<ReceivedFecPacket> fec_packet(new ReceivedFecPacket());
-  fec_packet->pkt = received_packet->pkt;
-  fec_packet->ssrc = received_packet->ssrc;
-  fec_packet->seq_num = received_packet->seq_num;
-  // Parse ULPFEC/FlexFEC header specific info.
-  bool ret = fec_header_reader_->ReadFecHeader(fec_packet.get());
-  if (!ret) {
-    return;
-  }
-
-  // TODO(brandtr): Update here when we support multistream protection.
-  if (fec_packet->protected_ssrc != protected_media_ssrc_) {
-    LOG(LS_INFO)
-        << "Received FEC packet is protecting an unknown media SSRC; dropping.";
-    return;
-  }
-
-  // Parse packet mask from header and represent as protected packets.
-  for (uint16_t byte_idx = 0; byte_idx < fec_packet->packet_mask_size;
-       ++byte_idx) {
-    uint8_t packet_mask =
-        fec_packet->pkt->data[fec_packet->packet_mask_offset + byte_idx];
-    for (uint16_t bit_idx = 0; bit_idx < 8; ++bit_idx) {
-      if (packet_mask & (1 << (7 - bit_idx))) {
-        std::unique_ptr<ProtectedPacket> protected_packet(
-            new ProtectedPacket());
-        // This wraps naturally with the sequence number.
-        protected_packet->ssrc = protected_media_ssrc_;
-        protected_packet->seq_num = static_cast<uint16_t>(
-            fec_packet->seq_num_base + (byte_idx << 3) + bit_idx);
-        protected_packet->pkt = nullptr;
-        fec_packet->protected_packets.push_back(std::move(protected_packet));
-      }
-    }
-  }
-
-  if (fec_packet->protected_packets.empty()) {
-    // All-zero packet mask; we can discard this FEC packet.
-    LOG(LS_WARNING) << "Received FEC packet has an all-zero packet mask.";
-  } else {
-    AssignRecoveredPackets(recovered_packets, fec_packet.get());
-    // TODO(holmer): Consider replacing this with a binary search for the right
-    // position, and then just insert the new packet. Would get rid of the sort.
-    received_fec_packets_.push_back(std::move(fec_packet));
-    received_fec_packets_.sort(SortablePacket::LessThan());
-    const size_t max_fec_packets = fec_header_reader_->MaxFecPackets();
-    if (received_fec_packets_.size() > max_fec_packets) {
-      received_fec_packets_.pop_front();
-    }
-    RTC_DCHECK_LE(received_fec_packets_.size(), max_fec_packets);
-  }
-}
-
-void ForwardErrorCorrection::AssignRecoveredPackets(
-    const RecoveredPacketList& recovered_packets,
-    ReceivedFecPacket* fec_packet) {
-  ProtectedPacketList* protected_packets = &fec_packet->protected_packets;
-  std::vector<RecoveredPacket*> recovered_protected_packets;
-
-  // Find intersection between the (sorted) containers |protected_packets|
-  // and |recovered_packets|, i.e. all protected packets that have already
-  // been recovered. Update the corresponding protected packets to point to
-  // the recovered packets.
-  auto it_p = protected_packets->cbegin();
-  auto it_r = recovered_packets.cbegin();
-  SortablePacket::LessThan less_than;
-  while (it_p != protected_packets->end() && it_r != recovered_packets.end()) {
-    if (less_than(*it_p, *it_r)) {
-      ++it_p;
-    } else if (less_than(*it_r, *it_p)) {
-      ++it_r;
-    } else {  // *it_p == *it_r.
-      // This protected packet has already been recovered.
-      (*it_p)->pkt = (*it_r)->pkt;
-      ++it_p;
-      ++it_r;
-    }
-  }
-}
-
-void ForwardErrorCorrection::InsertPackets(
-    ReceivedPacketList* received_packets,
-    RecoveredPacketList* recovered_packets) {
-  while (!received_packets->empty()) {
-    ReceivedPacket* received_packet = received_packets->front().get();
-
-    // Discard old FEC packets such that the sequence numbers in
-    // |received_fec_packets_| span at most 1/2 of the sequence number space.
-    // This is important for keeping |received_fec_packets_| sorted, and may
-    // also reduce the possibility of incorrect decoding due to sequence number
-    // wrap-around.
-    // TODO(marpan/holmer): We should be able to improve detection/discarding of
-    // old FEC packets based on timestamp information or better sequence number
-    // thresholding (e.g., to distinguish between wrap-around and reordering).
-    if (!received_fec_packets_.empty() &&
-        received_packet->ssrc == received_fec_packets_.front()->ssrc) {
-      // It only makes sense to detect wrap-around when |received_packet|
-      // and |front_received_fec_packet| belong to the same sequence number
-      // space, i.e., the same SSRC. This happens when |received_packet|
-      // is a FEC packet, or if |received_packet| is a media packet and
-      // RED+ULPFEC is used.
-      auto it = received_fec_packets_.begin();
-      while (it != received_fec_packets_.end()) {
-        uint16_t seq_num_diff = abs(static_cast<int>(received_packet->seq_num) -
-                                    static_cast<int>((*it)->seq_num));
-        if (seq_num_diff > 0x3fff) {
-          it = received_fec_packets_.erase(it);
-        } else {
-          // No need to keep iterating, since |received_fec_packets_| is sorted.
-          break;
-        }
-      }
-    }
-
-    if (received_packet->is_fec) {
-      InsertFecPacket(*recovered_packets, received_packet);
-    } else {
-      InsertMediaPacket(recovered_packets, received_packet);
-    }
-    // Delete the received packet "wrapper".
-    received_packets->pop_front();
-  }
-  RTC_DCHECK(received_packets->empty());
-  DiscardOldRecoveredPackets(recovered_packets);
-}
-
-bool ForwardErrorCorrection::StartPacketRecovery(
-    const ReceivedFecPacket& fec_packet,
-    RecoveredPacket* recovered_packet) {
-  // Sanity check packet length.
-  if (fec_packet.pkt->length < fec_packet.fec_header_size) {
-    LOG(LS_WARNING)
-        << "The FEC packet is truncated: it does not contain enough room "
-        << "for its own header.";
-    return false;
-  }
-  // Initialize recovered packet data.
-  recovered_packet->pkt = new Packet();
-  memset(recovered_packet->pkt->data, 0, IP_PACKET_SIZE);
-  recovered_packet->returned = false;
-  recovered_packet->was_recovered = true;
-  // Copy bytes corresponding to minimum RTP header size.
-  // Note that the sequence number and SSRC fields will be overwritten
-  // at the end of packet recovery.
-  memcpy(&recovered_packet->pkt->data, fec_packet.pkt->data, kRtpHeaderSize);
-  // Copy remaining FEC payload.
-  if (fec_packet.protection_length >
-      std::min(sizeof(recovered_packet->pkt->data) - kRtpHeaderSize,
-               sizeof(fec_packet.pkt->data) - fec_packet.fec_header_size)) {
-    LOG(LS_WARNING) << "Incorrect protection length, dropping FEC packet.";
-    return false;
-  }
-  memcpy(&recovered_packet->pkt->data[kRtpHeaderSize],
-         &fec_packet.pkt->data[fec_packet.fec_header_size],
-         fec_packet.protection_length);
-  return true;
-}
-
-bool ForwardErrorCorrection::FinishPacketRecovery(
-    const ReceivedFecPacket& fec_packet,
-    RecoveredPacket* recovered_packet) {
-  // Set the RTP version to 2.
-  recovered_packet->pkt->data[0] |= 0x80;  // Set the 1st bit.
-  recovered_packet->pkt->data[0] &= 0xbf;  // Clear the 2nd bit.
-  // Recover the packet length, from temporary location.
-  recovered_packet->pkt->length =
-      ByteReader<uint16_t>::ReadBigEndian(&recovered_packet->pkt->data[2]) +
-      kRtpHeaderSize;
-  if (recovered_packet->pkt->length >
-      sizeof(recovered_packet->pkt->data) - kRtpHeaderSize) {
-    LOG(LS_WARNING) << "The recovered packet had a length larger than a "
-                    << "typical IP packet, and is thus dropped.";
-    return false;
-  }
-  // Set the SN field.
-  ByteWriter<uint16_t>::WriteBigEndian(&recovered_packet->pkt->data[2],
-                                       recovered_packet->seq_num);
-  // Set the SSRC field.
-  ByteWriter<uint32_t>::WriteBigEndian(&recovered_packet->pkt->data[8],
-                                       fec_packet.protected_ssrc);
-  recovered_packet->ssrc = fec_packet.protected_ssrc;
-  return true;
-}
-
-void ForwardErrorCorrection::XorHeaders(const Packet& src, Packet* dst) {
-  // XOR the first 2 bytes of the header: V, P, X, CC, M, PT fields.
-  dst->data[0] ^= src.data[0];
-  dst->data[1] ^= src.data[1];
-
-  // XOR the length recovery field.
-  uint8_t src_payload_length_network_order[2];
-  ByteWriter<uint16_t>::WriteBigEndian(src_payload_length_network_order,
-                                       src.length - kRtpHeaderSize);
-  dst->data[2] ^= src_payload_length_network_order[0];
-  dst->data[3] ^= src_payload_length_network_order[1];
-
-  // XOR the 5th to 8th bytes of the header: the timestamp field.
-  dst->data[4] ^= src.data[4];
-  dst->data[5] ^= src.data[5];
-  dst->data[6] ^= src.data[6];
-  dst->data[7] ^= src.data[7];
-
-  // Skip the 9th to 12th bytes of the header.
-}
-
-void ForwardErrorCorrection::XorPayloads(const Packet& src,
-                                         size_t payload_length,
-                                         size_t dst_offset,
-                                         Packet* dst) {
-  // XOR the payload.
-  RTC_DCHECK_LE(kRtpHeaderSize + payload_length, sizeof(src.data));
-  RTC_DCHECK_LE(dst_offset + payload_length, sizeof(dst->data));
-  for (size_t i = 0; i < payload_length; ++i) {
-    dst->data[dst_offset + i] ^= src.data[kRtpHeaderSize + i];
-  }
-}
-
-bool ForwardErrorCorrection::RecoverPacket(const ReceivedFecPacket& fec_packet,
-                                           RecoveredPacket* recovered_packet) {
-  if (!StartPacketRecovery(fec_packet, recovered_packet)) {
-    return false;
-  }
-  for (const auto& protected_packet : fec_packet.protected_packets) {
-    if (protected_packet->pkt == nullptr) {
-      // This is the packet we're recovering.
-      recovered_packet->seq_num = protected_packet->seq_num;
-    } else {
-      XorHeaders(*protected_packet->pkt, recovered_packet->pkt);
-      XorPayloads(*protected_packet->pkt, protected_packet->pkt->length,
-                  kRtpHeaderSize, recovered_packet->pkt);
-    }
-  }
-  if (!FinishPacketRecovery(fec_packet, recovered_packet)) {
-    return false;
-  }
-  return true;
-}
-
-void ForwardErrorCorrection::AttemptRecovery(
-    RecoveredPacketList* recovered_packets) {
-  auto fec_packet_it = received_fec_packets_.begin();
-  while (fec_packet_it != received_fec_packets_.end()) {
-    // Search for each FEC packet's protected media packets.
-    int packets_missing = NumCoveredPacketsMissing(**fec_packet_it);
-
-    // We can only recover one packet with an FEC packet.
-    if (packets_missing == 1) {
-      // Recovery possible.
-      std::unique_ptr<RecoveredPacket> recovered_packet(new RecoveredPacket());
-      recovered_packet->pkt = nullptr;
-      if (!RecoverPacket(**fec_packet_it, recovered_packet.get())) {
-        // Can't recover using this packet, drop it.
-        fec_packet_it = received_fec_packets_.erase(fec_packet_it);
-        continue;
-      }
-
-      auto recovered_packet_ptr = recovered_packet.get();
-      // Add recovered packet to the list of recovered packets and update any
-      // FEC packets covering this packet with a pointer to the data.
-      // TODO(holmer): Consider replacing this with a binary search for the
-      // right position, and then just insert the new packet. Would get rid of
-      // the sort.
-      recovered_packets->push_back(std::move(recovered_packet));
-      recovered_packets->sort(SortablePacket::LessThan());
-      UpdateCoveringFecPackets(*recovered_packet_ptr);
-      DiscardOldRecoveredPackets(recovered_packets);
-      fec_packet_it = received_fec_packets_.erase(fec_packet_it);
-
-      // A packet has been recovered. We need to check the FEC list again, as
-      // this may allow additional packets to be recovered.
-      // Restart for first FEC packet.
-      fec_packet_it = received_fec_packets_.begin();
-    } else if (packets_missing == 0) {
-      // Either all protected packets arrived or have been recovered. We can
-      // discard this FEC packet.
-      fec_packet_it = received_fec_packets_.erase(fec_packet_it);
-    } else {
-      fec_packet_it++;
-    }
-  }
-}
-
-int ForwardErrorCorrection::NumCoveredPacketsMissing(
-    const ReceivedFecPacket& fec_packet) {
-  int packets_missing = 0;
-  for (const auto& protected_packet : fec_packet.protected_packets) {
-    if (protected_packet->pkt == nullptr) {
-      ++packets_missing;
-      if (packets_missing > 1) {
-        break;  // We can't recover more than one packet.
-      }
-    }
-  }
-  return packets_missing;
-}
-
-void ForwardErrorCorrection::DiscardOldRecoveredPackets(
-    RecoveredPacketList* recovered_packets) {
-  const size_t max_media_packets = fec_header_reader_->MaxMediaPackets();
-  while (recovered_packets->size() > max_media_packets) {
-    recovered_packets->pop_front();
-  }
-  RTC_DCHECK_LE(recovered_packets->size(), max_media_packets);
-}
-
-uint16_t ForwardErrorCorrection::ParseSequenceNumber(uint8_t* packet) {
-  return (packet[2] << 8) + packet[3];
-}
-
-uint32_t ForwardErrorCorrection::ParseSsrc(uint8_t* packet) {
-  return (packet[8] << 24) + (packet[9] << 16) + (packet[10] << 8) + packet[11];
-}
-
-int ForwardErrorCorrection::DecodeFec(
-    ReceivedPacketList* received_packets,
-    RecoveredPacketList* recovered_packets) {
-  RTC_DCHECK(received_packets);
-  RTC_DCHECK(recovered_packets);
-
-  const size_t max_media_packets = fec_header_reader_->MaxMediaPackets();
-  if (recovered_packets->size() == max_media_packets) {
-    const RecoveredPacket* back_recovered_packet =
-        recovered_packets->back().get();
-    for (const auto& received_packet : *received_packets) {
-      if (received_packet->ssrc == back_recovered_packet->ssrc) {
-        const unsigned int seq_num_diff =
-            abs(static_cast<int>(received_packet->seq_num) -
-                static_cast<int>(back_recovered_packet->seq_num));
-        if (seq_num_diff > max_media_packets) {
-          // A big gap in sequence numbers. The old recovered packets
-          // are now useless, so it's safe to do a reset.
-          LOG(LS_INFO) << "Big gap in media/ULPFEC sequence numbers. No need "
-                          "to keep the old packets in the FEC buffers, thus "
-                          "resetting them.";
-          ResetState(recovered_packets);
-          break;
-        }
-      }
-    }
-  }
-
-  InsertPackets(received_packets, recovered_packets);
-  AttemptRecovery(recovered_packets);
-
-  return 0;
-}
-
-size_t ForwardErrorCorrection::MaxPacketOverhead() const {
-  return fec_header_writer_->MaxPacketOverhead();
-}
-
-FecHeaderReader::FecHeaderReader(size_t max_media_packets,
-                                 size_t max_fec_packets)
-    : max_media_packets_(max_media_packets),
-      max_fec_packets_(max_fec_packets) {}
-
-FecHeaderReader::~FecHeaderReader() = default;
-
-size_t FecHeaderReader::MaxMediaPackets() const {
-  return max_media_packets_;
-}
-
-size_t FecHeaderReader::MaxFecPackets() const {
-  return max_fec_packets_;
-}
-
-FecHeaderWriter::FecHeaderWriter(size_t max_media_packets,
-                                 size_t max_fec_packets,
-                                 size_t max_packet_overhead)
-    : max_media_packets_(max_media_packets),
-      max_fec_packets_(max_fec_packets),
-      max_packet_overhead_(max_packet_overhead) {}
-
-FecHeaderWriter::~FecHeaderWriter() = default;
-
-size_t FecHeaderWriter::MaxMediaPackets() const {
-  return max_media_packets_;
-}
-
-size_t FecHeaderWriter::MaxFecPackets() const {
-  return max_fec_packets_;
-}
-
-size_t FecHeaderWriter::MaxPacketOverhead() const {
-  return max_packet_overhead_;
-}
-
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/forward_error_correction.h b/modules/rtp_rtcp/source/forward_error_correction.h
deleted file mode 100644
index 673d15b..0000000
--- a/modules/rtp_rtcp/source/forward_error_correction.h
+++ /dev/null
@@ -1,421 +0,0 @@
-/*
- *  Copyright (c) 2012 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_RTP_RTCP_SOURCE_FORWARD_ERROR_CORRECTION_H_
-#define WEBRTC_MODULES_RTP_RTCP_SOURCE_FORWARD_ERROR_CORRECTION_H_
-
-#include <stdint.h>
-
-#include <list>
-#include <memory>
-#include <vector>
-
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
-#include "webrtc/modules/rtp_rtcp/source/forward_error_correction_internal.h"
-#include "webrtc/rtc_base/basictypes.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/refcount.h"
-#include "webrtc/rtc_base/scoped_ref_ptr.h"
-
-namespace webrtc {
-
-class FecHeaderReader;
-class FecHeaderWriter;
-
-// Performs codec-independent forward error correction (FEC), based on RFC 5109.
-// Option exists to enable unequal protection (UEP) across packets.
-// This is not to be confused with protection within packets
-// (referred to as uneven level protection (ULP) in RFC 5109).
-// TODO(brandtr): Split this class into a separate encoder
-// and a separate decoder.
-class ForwardErrorCorrection {
- public:
-  // TODO(holmer): As a next step all these struct-like packet classes should be
-  // refactored into proper classes, and their members should be made private.
-  // This will require parts of the functionality in forward_error_correction.cc
-  // and receiver_fec.cc to be refactored into the packet classes.
-  class Packet {
-   public:
-    Packet();
-    virtual ~Packet();
-
-    // Add a reference.
-    virtual int32_t AddRef();
-
-    // Release a reference. Will delete the object if the reference count
-    // reaches zero.
-    virtual int32_t Release();
-
-    size_t length;                 // Length of packet in bytes.
-    uint8_t data[IP_PACKET_SIZE];  // Packet data.
-
-   private:
-    int32_t ref_count_;  // Counts the number of references to a packet.
-  };
-
-  // TODO(holmer): Refactor into a proper class.
-  class SortablePacket {
-   public:
-    // Functor which returns true if the sequence number of |first|
-    // is < the sequence number of |second|. Should only ever be called for
-    // packets belonging to the same SSRC.
-    struct LessThan {
-      template <typename S, typename T>
-      bool operator() (const S& first, const T& second);
-    };
-
-    uint32_t ssrc;
-    uint16_t seq_num;
-  };
-
-  // The received list parameter of DecodeFec() references structs of this type.
-  //
-  // TODO(holmer): Refactor into a proper class.
-  class ReceivedPacket : public SortablePacket {
-   public:
-    ReceivedPacket();
-    ~ReceivedPacket();
-
-    bool is_fec;    // Set to true if this is an FEC packet and false
-                    // otherwise.
-    rtc::scoped_refptr<Packet> pkt;  // Pointer to the packet storage.
-  };
-
-  // The recovered list parameter of DecodeFec() references structs of
-  // this type.
-  // TODO(holmer): Refactor into a proper class.
-  class RecoveredPacket : public SortablePacket {
-   public:
-    RecoveredPacket();
-    ~RecoveredPacket();
-
-    bool was_recovered;  // Will be true if this packet was recovered by
-                         // the FEC. Otherwise it was a media packet passed in
-                         // through the received packet list.
-    bool returned;  // True when the packet already has been returned to the
-                    // caller through the callback.
-    rtc::scoped_refptr<Packet> pkt;  // Pointer to the packet storage.
-  };
-
-  // Used to link media packets to their protecting FEC packets.
-  //
-  // TODO(holmer): Refactor into a proper class.
-  class ProtectedPacket : public SortablePacket {
-   public:
-    ProtectedPacket();
-    ~ProtectedPacket();
-
-    rtc::scoped_refptr<ForwardErrorCorrection::Packet> pkt;
-  };
-
-  using ProtectedPacketList = std::list<std::unique_ptr<ProtectedPacket>>;
-
-  // Used for internal storage of received FEC packets in a list.
-  //
-  // TODO(holmer): Refactor into a proper class.
-  class ReceivedFecPacket : public SortablePacket {
-   public:
-    ReceivedFecPacket();
-    ~ReceivedFecPacket();
-
-    // List of media packets that this FEC packet protects.
-    ProtectedPacketList protected_packets;
-    // RTP header fields.
-    uint32_t ssrc;
-    // FEC header fields.
-    size_t fec_header_size;
-    uint32_t protected_ssrc;
-    uint16_t seq_num_base;
-    size_t packet_mask_offset;  // Relative start of FEC header.
-    size_t packet_mask_size;
-    size_t protection_length;
-    // Raw data.
-    rtc::scoped_refptr<ForwardErrorCorrection::Packet> pkt;
-  };
-
-  using PacketList = std::list<std::unique_ptr<Packet>>;
-  using ReceivedPacketList = std::list<std::unique_ptr<ReceivedPacket>>;
-  using RecoveredPacketList = std::list<std::unique_ptr<RecoveredPacket>>;
-  using ReceivedFecPacketList = std::list<std::unique_ptr<ReceivedFecPacket>>;
-
-  ~ForwardErrorCorrection();
-
-  // Creates a ForwardErrorCorrection tailored for a specific FEC scheme.
-  static std::unique_ptr<ForwardErrorCorrection> CreateUlpfec(uint32_t ssrc);
-  static std::unique_ptr<ForwardErrorCorrection> CreateFlexfec(
-      uint32_t ssrc,
-      uint32_t protected_media_ssrc);
-
-  // Generates a list of FEC packets from supplied media packets.
-  //
-  // Input:  media_packets          List of media packets to protect, of type
-  //                                Packet. All packets must belong to the
-  //                                same frame and the list must not be empty.
-  // Input:  protection_factor      FEC protection overhead in the [0, 255]
-  //                                domain. To obtain 100% overhead, or an
-  //                                equal number of FEC packets as
-  //                                media packets, use 255.
-  // Input:  num_important_packets  The number of "important" packets in the
-  //                                frame. These packets may receive greater
-  //                                protection than the remaining packets.
-  //                                The important packets must be located at the
-  //                                start of the media packet list. For codecs
-  //                                with data partitioning, the important
-  //                                packets may correspond to first partition
-  //                                packets.
-  // Input:  use_unequal_protection Parameter to enable/disable unequal
-  //                                protection (UEP) across packets. Enabling
-  //                                UEP will allocate more protection to the
-  //                                num_important_packets from the start of the
-  //                                media_packets.
-  // Input:  fec_mask_type          The type of packet mask used in the FEC.
-  //                                Random or bursty type may be selected. The
-  //                                bursty type is only defined up to 12 media
-  //                                packets. If the number of media packets is
-  //                                above 12, the packet masks from the random
-  //                                table will be selected.
-  // Output: fec_packets            List of pointers to generated FEC packets,
-  //                                of type Packet. Must be empty on entry.
-  //                                The memory available through the list will
-  //                                be valid until the next call to
-  //                                EncodeFec().
-  //
-  // Returns 0 on success, -1 on failure.
-  //
-  int EncodeFec(const PacketList& media_packets,
-                uint8_t protection_factor,
-                int num_important_packets,
-                bool use_unequal_protection,
-                FecMaskType fec_mask_type,
-                std::list<Packet*>* fec_packets);
-
-  // Decodes a list of received media and FEC packets. It will parse the
-  // |received_packets|, storing FEC packets internally, and move
-  // media packets to |recovered_packets|. The recovered list will be
-  // sorted by ascending sequence number and have duplicates removed.
-  // The function should be called as new packets arrive, and
-  // |recovered_packets| will be progressively assembled with each call.
-  // When the function returns, |received_packets| will be empty.
-  //
-  // The caller will allocate packets submitted through |received_packets|.
-  // The function will handle allocation of recovered packets.
-  //
-  // Input:  received_packets   List of new received packets, of type
-  //                            ReceivedPacket, belonging to a single
-  //                            frame. At output the list will be empty,
-  //                            with packets either stored internally,
-  //                            or accessible through the recovered list.
-  // Output: recovered_packets  List of recovered media packets, of type
-  //                            RecoveredPacket, belonging to a single
-  //                            frame. The memory available through the
-  //                            list will be valid until the next call to
-  //                            DecodeFec().
-  //
-  // Returns 0 on success, -1 on failure.
-  //
-  int DecodeFec(ReceivedPacketList* received_packets,
-                RecoveredPacketList* recovered_packets);
-
-  // Get the number of generated FEC packets, given the number of media packets
-  // and the protection factor.
-  static int NumFecPackets(int num_media_packets, int protection_factor);
-
-  // Gets the maximum size of the FEC headers in bytes, which must be
-  // accounted for as packet overhead.
-  size_t MaxPacketOverhead() const;
-
-  // Reset internal states from last frame and clear |recovered_packets|.
-  // Frees all memory allocated by this class.
-  void ResetState(RecoveredPacketList* recovered_packets);
-
-  // TODO(brandtr): Remove these functions when the Packet classes
-  // have been refactored.
-  static uint16_t ParseSequenceNumber(uint8_t* packet);
-  static uint32_t ParseSsrc(uint8_t* packet);
-
- protected:
-  ForwardErrorCorrection(std::unique_ptr<FecHeaderReader> fec_header_reader,
-                         std::unique_ptr<FecHeaderWriter> fec_header_writer,
-                         uint32_t ssrc,
-                         uint32_t protected_media_ssrc);
-
- private:
-  // Analyzes |media_packets| for holes in the sequence and inserts zero columns
-  // into the |packet_mask| where those holes are found. Zero columns means that
-  // those packets will have no protection.
-  // Returns the number of bits used for one row of the new packet mask.
-  // Requires that |packet_mask| has at least 6 * |num_fec_packets| bytes
-  // allocated.
-  int InsertZerosInPacketMasks(const PacketList& media_packets,
-                               size_t num_fec_packets);
-
-  // Writes FEC payloads and some recovery fields in the FEC headers.
-  void GenerateFecPayloads(const PacketList& media_packets,
-                           size_t num_fec_packets);
-
-  // Writes the FEC header fields that are not written by GenerateFecPayloads.
-  // This includes writing the packet masks.
-  void FinalizeFecHeaders(size_t num_fec_packets,
-                          uint32_t media_ssrc,
-                          uint16_t seq_num_base);
-
-  // Inserts the |received_packets| into the internal received FEC packet list
-  // or into |recovered_packets|.
-  void InsertPackets(ReceivedPacketList* received_packets,
-                     RecoveredPacketList* recovered_packets);
-
-  // Inserts the |received_packet| into |recovered_packets|. Deletes duplicates.
-  void InsertMediaPacket(RecoveredPacketList* recovered_packets,
-                         ReceivedPacket* received_packet);
-
-  // Assigns pointers to the recovered packet from all FEC packets which cover
-  // it.
-  // Note: This reduces the complexity when we want to try to recover a packet
-  // since we don't have to find the intersection between recovered packets and
-  // packets covered by the FEC packet.
-  void UpdateCoveringFecPackets(const RecoveredPacket& packet);
-
-  // Insert |received_packet| into internal FEC list. Deletes duplicates.
-  void InsertFecPacket(const RecoveredPacketList& recovered_packets,
-                       ReceivedPacket* received_packet);
-
-  // Assigns pointers to already recovered packets covered by |fec_packet|.
-  static void AssignRecoveredPackets(
-      const RecoveredPacketList& recovered_packets,
-      ReceivedFecPacket* fec_packet);
-
-  // Attempt to recover missing packets, using the internally stored
-  // received FEC packets.
-  void AttemptRecovery(RecoveredPacketList* recovered_packets);
-
-  // Initializes headers and payload before the XOR operation
-  // that recovers a packet.
-  static bool StartPacketRecovery(const ReceivedFecPacket& fec_packet,
-                                  RecoveredPacket* recovered_packet);
-
-  // Performs XOR between the first 8 bytes of |src| and |dst| and stores
-  // the result in |dst|. The 3rd and 4th bytes are used for storing
-  // the length recovery field.
-  static void XorHeaders(const Packet& src, Packet* dst);
-
-  // Performs XOR between the payloads of |src| and |dst| and stores the result
-  // in |dst|. The parameter |dst_offset| determines at  what byte the
-  // XOR operation starts in |dst|. In total, |payload_length| bytes are XORed.
-  static void XorPayloads(const Packet& src,
-                          size_t payload_length,
-                          size_t dst_offset,
-                          Packet* dst);
-
-  // Finalizes recovery of packet by setting RTP header fields.
-  // This is not specific to the FEC scheme used.
-  static bool FinishPacketRecovery(const ReceivedFecPacket& fec_packet,
-                                   RecoveredPacket* recovered_packet);
-
-  // Recover a missing packet.
-  static bool RecoverPacket(const ReceivedFecPacket& fec_packet,
-                            RecoveredPacket* recovered_packet);
-
-  // Get the number of missing media packets which are covered by |fec_packet|.
-  // An FEC packet can recover at most one packet, and if zero packets are
-  // missing the FEC packet can be discarded. This function returns 2 when two
-  // or more packets are missing.
-  static int NumCoveredPacketsMissing(const ReceivedFecPacket& fec_packet);
-
-  // Discards old packets in |recovered_packets|, which are no longer relevant
-  // for recovering lost packets.
-  void DiscardOldRecoveredPackets(RecoveredPacketList* recovered_packets);
-
-  // These SSRCs are only used by the decoder.
-  const uint32_t ssrc_;
-  const uint32_t protected_media_ssrc_;
-
-  std::unique_ptr<FecHeaderReader> fec_header_reader_;
-  std::unique_ptr<FecHeaderWriter> fec_header_writer_;
-
-  std::vector<Packet> generated_fec_packets_;
-  ReceivedFecPacketList received_fec_packets_;
-
-  // Arrays used to avoid dynamically allocating memory when generating
-  // the packet masks.
-  // (There are never more than |kUlpfecMaxMediaPackets| FEC packets generated.)
-  uint8_t packet_masks_[kUlpfecMaxMediaPackets * kUlpfecMaxPacketMaskSize];
-  uint8_t tmp_packet_masks_[kUlpfecMaxMediaPackets * kUlpfecMaxPacketMaskSize];
-  size_t packet_mask_size_;
-};
-
-// Classes derived from FecHeader{Reader,Writer} encapsulate the
-// specifics of reading and writing FEC header for, e.g., ULPFEC
-// and FlexFEC.
-class FecHeaderReader {
- public:
-  virtual ~FecHeaderReader();
-
-  // The maximum number of media packets that can be covered by one FEC packet.
-  size_t MaxMediaPackets() const;
-
-  // The maximum number of FEC packets that is supported, per call
-  // to ForwardErrorCorrection::EncodeFec().
-  size_t MaxFecPackets() const;
-
-  // Parses FEC header and stores information in ReceivedFecPacket members.
-  virtual bool ReadFecHeader(
-      ForwardErrorCorrection::ReceivedFecPacket* fec_packet) const = 0;
-
- protected:
-  FecHeaderReader(size_t max_media_packets, size_t max_fec_packets);
-
-  const size_t max_media_packets_;
-  const size_t max_fec_packets_;
-};
-
-class FecHeaderWriter {
- public:
-  virtual ~FecHeaderWriter();
-
-  // The maximum number of media packets that can be covered by one FEC packet.
-  size_t MaxMediaPackets() const;
-
-  // The maximum number of FEC packets that is supported, per call
-  // to ForwardErrorCorrection::EncodeFec().
-  size_t MaxFecPackets() const;
-
-  // The maximum overhead (in bytes) per packet, due to FEC headers.
-  size_t MaxPacketOverhead() const;
-
-  // Calculates the minimum packet mask size needed (in bytes),
-  // given the discrete options of the ULPFEC masks and the bits
-  // set in the current packet mask.
-  virtual size_t MinPacketMaskSize(const uint8_t* packet_mask,
-                                   size_t packet_mask_size) const = 0;
-
-  // The header size (in bytes), given the packet mask size.
-  virtual size_t FecHeaderSize(size_t packet_mask_size) const = 0;
-
-  // Writes FEC header.
-  virtual void FinalizeFecHeader(
-      uint32_t media_ssrc,
-      uint16_t seq_num_base,
-      const uint8_t* packet_mask,
-      size_t packet_mask_size,
-      ForwardErrorCorrection::Packet* fec_packet) const = 0;
-
- protected:
-  FecHeaderWriter(size_t max_media_packets,
-                  size_t max_fec_packets,
-                  size_t max_packet_overhead);
-
-  const size_t max_media_packets_;
-  const size_t max_fec_packets_;
-  const size_t max_packet_overhead_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_RTP_RTCP_SOURCE_FORWARD_ERROR_CORRECTION_H_
diff --git a/modules/rtp_rtcp/source/forward_error_correction_internal.cc b/modules/rtp_rtcp/source/forward_error_correction_internal.cc
deleted file mode 100644
index b411686..0000000
--- a/modules/rtp_rtcp/source/forward_error_correction_internal.cc
+++ /dev/null
@@ -1,433 +0,0 @@
-/*
- *  Copyright (c) 2012 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/rtp_rtcp/source/forward_error_correction_internal.h"
-
-#include <assert.h>
-#include <string.h>
-
-#include <algorithm>
-
-#include "webrtc/modules/rtp_rtcp/source/fec_private_tables_bursty.h"
-#include "webrtc/modules/rtp_rtcp/source/fec_private_tables_random.h"
-#include "webrtc/rtc_base/checks.h"
-
-namespace {
-using webrtc::fec_private_tables::kPacketMaskBurstyTbl;
-using webrtc::fec_private_tables::kPacketMaskRandomTbl;
-
-// Allow for different modes of protection for packets in UEP case.
-enum ProtectionMode {
-  kModeNoOverlap,
-  kModeOverlap,
-  kModeBiasFirstPacket,
-};
-
-// Fits an input mask (sub_mask) to an output mask.
-// The mask is a matrix where the rows are the FEC packets,
-// and the columns are the source packets the FEC is applied to.
-// Each row of the mask is represented by a number of mask bytes.
-//
-// \param[in]  num_mask_bytes     The number of mask bytes of output mask.
-// \param[in]  num_sub_mask_bytes The number of mask bytes of input mask.
-// \param[in]  num_rows           The number of rows of the input mask.
-// \param[in]  sub_mask           A pointer to hold the input mask, of size
-//                                [0, num_rows * num_sub_mask_bytes]
-// \param[out] packet_mask        A pointer to hold the output mask, of size
-//                                [0, x * num_mask_bytes], where x >= num_rows.
-void FitSubMask(int num_mask_bytes,
-                int num_sub_mask_bytes,
-                int num_rows,
-                const uint8_t* sub_mask,
-                uint8_t* packet_mask) {
-  if (num_mask_bytes == num_sub_mask_bytes) {
-    memcpy(packet_mask, sub_mask, num_rows * num_sub_mask_bytes);
-  } else {
-    for (int i = 0; i < num_rows; ++i) {
-      int pkt_mask_idx = i * num_mask_bytes;
-      int pkt_mask_idx2 = i * num_sub_mask_bytes;
-      for (int j = 0; j < num_sub_mask_bytes; ++j) {
-        packet_mask[pkt_mask_idx] = sub_mask[pkt_mask_idx2];
-        pkt_mask_idx++;
-        pkt_mask_idx2++;
-      }
-    }
-  }
-}
-
-// Shifts a mask by number of columns (bits), and fits it to an output mask.
-// The mask is a matrix where the rows are the FEC packets,
-// and the columns are the source packets the FEC is applied to.
-// Each row of the mask is represented by a number of mask bytes.
-//
-// \param[in]  num_mask_bytes     The number of mask bytes of output mask.
-// \param[in]  num_sub_mask_bytes The number of mask bytes of input mask.
-// \param[in]  num_column_shift   The number columns to be shifted, and
-//                                the starting row for the output mask.
-// \param[in]  end_row            The ending row for the output mask.
-// \param[in]  sub_mask           A pointer to hold the input mask, of size
-//                                [0, (end_row_fec - start_row_fec) *
-//                                    num_sub_mask_bytes]
-// \param[out] packet_mask        A pointer to hold the output mask, of size
-//                                [0, x * num_mask_bytes],
-//                                where x >= end_row_fec.
-// TODO(marpan): This function is doing three things at the same time:
-// shift within a byte, byte shift and resizing.
-// Split up into subroutines.
-void ShiftFitSubMask(int num_mask_bytes,
-                     int res_mask_bytes,
-                     int num_column_shift,
-                     int end_row,
-                     const uint8_t* sub_mask,
-                     uint8_t* packet_mask) {
-  // Number of bit shifts within a byte
-  const int num_bit_shifts = (num_column_shift % 8);
-  const int num_byte_shifts = num_column_shift >> 3;
-
-  // Modify new mask with sub-mask21.
-
-  // Loop over the remaining FEC packets.
-  for (int i = num_column_shift; i < end_row; ++i) {
-    // Byte index of new mask, for row i and column res_mask_bytes,
-    // offset by the number of bytes shifts
-    int pkt_mask_idx =
-        i * num_mask_bytes + res_mask_bytes - 1 + num_byte_shifts;
-    // Byte index of sub_mask, for row i and column res_mask_bytes
-    int pkt_mask_idx2 =
-        (i - num_column_shift) * res_mask_bytes + res_mask_bytes - 1;
-
-    uint8_t shift_right_curr_byte = 0;
-    uint8_t shift_left_prev_byte = 0;
-    uint8_t comb_new_byte = 0;
-
-    // Handle case of num_mask_bytes > res_mask_bytes:
-    // For a given row, copy the rightmost "numBitShifts" bits
-    // of the last byte of sub_mask into output mask.
-    if (num_mask_bytes > res_mask_bytes) {
-      shift_left_prev_byte = (sub_mask[pkt_mask_idx2] << (8 - num_bit_shifts));
-      packet_mask[pkt_mask_idx + 1] = shift_left_prev_byte;
-    }
-
-    // For each row i (FEC packet), shift the bit-mask of the sub_mask.
-    // Each row of the mask contains "resMaskBytes" of bytes.
-    // We start from the last byte of the sub_mask and move to first one.
-    for (int j = res_mask_bytes - 1; j > 0; j--) {
-      // Shift current byte of sub21 to the right by "numBitShifts".
-      shift_right_curr_byte = sub_mask[pkt_mask_idx2] >> num_bit_shifts;
-
-      // Fill in shifted bits with bits from the previous (left) byte:
-      // First shift the previous byte to the left by "8-numBitShifts".
-      shift_left_prev_byte =
-          (sub_mask[pkt_mask_idx2 - 1] << (8 - num_bit_shifts));
-
-      // Then combine both shifted bytes into new mask byte.
-      comb_new_byte = shift_right_curr_byte | shift_left_prev_byte;
-
-      // Assign to new mask.
-      packet_mask[pkt_mask_idx] = comb_new_byte;
-      pkt_mask_idx--;
-      pkt_mask_idx2--;
-    }
-    // For the first byte in the row (j=0 case).
-    shift_right_curr_byte = sub_mask[pkt_mask_idx2] >> num_bit_shifts;
-    packet_mask[pkt_mask_idx] = shift_right_curr_byte;
-  }
-}
-}  // namespace
-
-namespace webrtc {
-namespace internal {
-
-PacketMaskTable::PacketMaskTable(FecMaskType fec_mask_type,
-                                 int num_media_packets)
-    : fec_mask_type_(InitMaskType(fec_mask_type, num_media_packets)),
-      fec_packet_mask_table_(InitMaskTable(fec_mask_type_)) {}
-
-// Sets |fec_mask_type_| to the type of packet mask selected. The type of
-// packet mask selected is based on |fec_mask_type| and |num_media_packets|.
-// If |num_media_packets| is larger than the maximum allowed by |fec_mask_type|
-// for the bursty type, then the random type is selected.
-FecMaskType PacketMaskTable::InitMaskType(FecMaskType fec_mask_type,
-                                          int num_media_packets) {
-  // The mask should not be bigger than |packetMaskTbl|.
-  assert(num_media_packets <= static_cast<int>(sizeof(kPacketMaskRandomTbl) /
-                                               sizeof(*kPacketMaskRandomTbl)));
-  switch (fec_mask_type) {
-    case kFecMaskRandom: {
-      return kFecMaskRandom;
-    }
-    case kFecMaskBursty: {
-      int max_media_packets = static_cast<int>(sizeof(kPacketMaskBurstyTbl) /
-                                               sizeof(*kPacketMaskBurstyTbl));
-      if (num_media_packets > max_media_packets) {
-        return kFecMaskRandom;
-      } else {
-        return kFecMaskBursty;
-      }
-    }
-  }
-  assert(false);
-  return kFecMaskRandom;
-}
-
-// Returns the pointer to the packet mask tables corresponding to type
-// |fec_mask_type|.
-const uint8_t* const* const* PacketMaskTable::InitMaskTable(
-    FecMaskType fec_mask_type) {
-  switch (fec_mask_type) {
-    case kFecMaskRandom: {
-      return kPacketMaskRandomTbl;
-    }
-    case kFecMaskBursty: {
-      return kPacketMaskBurstyTbl;
-    }
-  }
-  assert(false);
-  return kPacketMaskRandomTbl;
-}
-
-// Remaining protection after important (first partition) packet protection
-void RemainingPacketProtection(int num_media_packets,
-                               int num_fec_remaining,
-                               int num_fec_for_imp_packets,
-                               int num_mask_bytes,
-                               ProtectionMode mode,
-                               uint8_t* packet_mask,
-                               const PacketMaskTable& mask_table) {
-  if (mode == kModeNoOverlap) {
-    // sub_mask21
-
-    const int res_mask_bytes =
-        PacketMaskSize(num_media_packets - num_fec_for_imp_packets);
-
-    const uint8_t* packet_mask_sub_21 =
-        mask_table.fec_packet_mask_table()[num_media_packets -
-                                           num_fec_for_imp_packets -
-                                           1][num_fec_remaining - 1];
-
-    ShiftFitSubMask(num_mask_bytes, res_mask_bytes, num_fec_for_imp_packets,
-                    (num_fec_for_imp_packets + num_fec_remaining),
-                    packet_mask_sub_21, packet_mask);
-
-  } else if (mode == kModeOverlap || mode == kModeBiasFirstPacket) {
-    // sub_mask22
-
-    const uint8_t* packet_mask_sub_22 =
-        mask_table.fec_packet_mask_table()[num_media_packets -
-                                           1][num_fec_remaining - 1];
-
-    FitSubMask(num_mask_bytes, num_mask_bytes, num_fec_remaining,
-               packet_mask_sub_22,
-               &packet_mask[num_fec_for_imp_packets * num_mask_bytes]);
-
-    if (mode == kModeBiasFirstPacket) {
-      for (int i = 0; i < num_fec_remaining; ++i) {
-        int pkt_mask_idx = i * num_mask_bytes;
-        packet_mask[pkt_mask_idx] = packet_mask[pkt_mask_idx] | (1 << 7);
-      }
-    }
-  } else {
-    assert(false);
-  }
-}
-
-// Protection for important (first partition) packets
-void ImportantPacketProtection(int num_fec_for_imp_packets,
-                               int num_imp_packets,
-                               int num_mask_bytes,
-                               uint8_t* packet_mask,
-                               const PacketMaskTable& mask_table) {
-  const int num_imp_mask_bytes = PacketMaskSize(num_imp_packets);
-
-  // Get sub_mask1 from table
-  const uint8_t* packet_mask_sub_1 =
-      mask_table.fec_packet_mask_table()[num_imp_packets -
-                                         1][num_fec_for_imp_packets - 1];
-
-  FitSubMask(num_mask_bytes, num_imp_mask_bytes, num_fec_for_imp_packets,
-             packet_mask_sub_1, packet_mask);
-}
-
-// This function sets the protection allocation: i.e., how many FEC packets
-// to use for num_imp (1st partition) packets, given the: number of media
-// packets, number of FEC packets, and number of 1st partition packets.
-int SetProtectionAllocation(int num_media_packets,
-                            int num_fec_packets,
-                            int num_imp_packets) {
-  // TODO(marpan): test different cases for protection allocation:
-
-  // Use at most (alloc_par * num_fec_packets) for important packets.
-  float alloc_par = 0.5;
-  int max_num_fec_for_imp = alloc_par * num_fec_packets;
-
-  int num_fec_for_imp_packets = (num_imp_packets < max_num_fec_for_imp)
-                                    ? num_imp_packets
-                                    : max_num_fec_for_imp;
-
-  // Fall back to equal protection in this case
-  if (num_fec_packets == 1 && (num_media_packets > 2 * num_imp_packets)) {
-    num_fec_for_imp_packets = 0;
-  }
-
-  return num_fec_for_imp_packets;
-}
-
-// Modification for UEP: reuse the off-line tables for the packet masks.
-// Note: these masks were designed for equal packet protection case,
-// assuming random packet loss.
-
-// Current version has 3 modes (options) to build UEP mask from existing ones.
-// Various other combinations may be added in future versions.
-// Longer-term, we may add another set of tables specifically for UEP cases.
-// TODO(marpan): also consider modification of masks for bursty loss cases.
-
-// Mask is characterized as (#packets_to_protect, #fec_for_protection).
-// Protection factor defined as: (#fec_for_protection / #packets_to_protect).
-
-// Let k=num_media_packets, n=total#packets, (n-k)=num_fec_packets,
-// m=num_imp_packets.
-
-// For ProtectionMode 0 and 1:
-// one mask (sub_mask1) is used for 1st partition packets,
-// the other mask (sub_mask21/22, for 0/1) is for the remaining FEC packets.
-
-// In both mode 0 and 1, the packets of 1st partition (num_imp_packets) are
-// treated equally important, and are afforded more protection than the
-// residual partition packets.
-
-// For num_imp_packets:
-// sub_mask1 = (m, t): protection = t/(m), where t=F(k,n-k,m).
-// t=F(k,n-k,m) is the number of packets used to protect first partition in
-// sub_mask1. This is determined from the function SetProtectionAllocation().
-
-// For the left-over protection:
-// Mode 0: sub_mask21 = (k-m,n-k-t): protection = (n-k-t)/(k-m)
-// mode 0 has no protection overlap between the two partitions.
-// For mode 0, we would typically set t = min(m, n-k).
-
-// Mode 1: sub_mask22 = (k, n-k-t), with protection (n-k-t)/(k)
-// mode 1 has protection overlap between the two partitions (preferred).
-
-// For ProtectionMode 2:
-// This gives 1st packet of list (which is 1st packet of 1st partition) more
-// protection. In mode 2, the equal protection mask (which is obtained from
-// mode 1 for t=0) is modified (more "1s" added in 1st column of packet mask)
-// to bias higher protection for the 1st source packet.
-
-// Protection Mode 2 may be extended for a sort of sliding protection
-// (i.e., vary the number/density of "1s" across columns) across packets.
-
-void UnequalProtectionMask(int num_media_packets,
-                           int num_fec_packets,
-                           int num_imp_packets,
-                           int num_mask_bytes,
-                           uint8_t* packet_mask,
-                           const PacketMaskTable& mask_table) {
-  // Set Protection type and allocation
-  // TODO(marpan): test/update for best mode and some combinations thereof.
-
-  ProtectionMode mode = kModeOverlap;
-  int num_fec_for_imp_packets = 0;
-
-  if (mode != kModeBiasFirstPacket) {
-    num_fec_for_imp_packets = SetProtectionAllocation(
-        num_media_packets, num_fec_packets, num_imp_packets);
-  }
-
-  int num_fec_remaining = num_fec_packets - num_fec_for_imp_packets;
-  // Done with setting protection type and allocation
-
-  //
-  // Generate sub_mask1
-  //
-  if (num_fec_for_imp_packets > 0) {
-    ImportantPacketProtection(num_fec_for_imp_packets, num_imp_packets,
-                              num_mask_bytes, packet_mask, mask_table);
-  }
-
-  //
-  // Generate sub_mask2
-  //
-  if (num_fec_remaining > 0) {
-    RemainingPacketProtection(num_media_packets, num_fec_remaining,
-                              num_fec_for_imp_packets, num_mask_bytes, mode,
-                              packet_mask, mask_table);
-  }
-}
-
-void GeneratePacketMasks(int num_media_packets,
-                         int num_fec_packets,
-                         int num_imp_packets,
-                         bool use_unequal_protection,
-                         const PacketMaskTable& mask_table,
-                         uint8_t* packet_mask) {
-  assert(num_media_packets > 0);
-  assert(num_fec_packets <= num_media_packets && num_fec_packets > 0);
-  assert(num_imp_packets <= num_media_packets && num_imp_packets >= 0);
-
-  const int num_mask_bytes = PacketMaskSize(num_media_packets);
-
-  // Equal-protection for these cases.
-  if (!use_unequal_protection || num_imp_packets == 0) {
-    // Retrieve corresponding mask table directly:for equal-protection case.
-    // Mask = (k,n-k), with protection factor = (n-k)/k,
-    // where k = num_media_packets, n=total#packets, (n-k)=num_fec_packets.
-    memcpy(packet_mask,
-           mask_table.fec_packet_mask_table()[num_media_packets -
-                                              1][num_fec_packets - 1],
-           num_fec_packets * num_mask_bytes);
-  } else {  // UEP case
-    UnequalProtectionMask(num_media_packets, num_fec_packets, num_imp_packets,
-                          num_mask_bytes, packet_mask, mask_table);
-  }  // End of UEP modification
-}  // End of GetPacketMasks
-
-size_t PacketMaskSize(size_t num_sequence_numbers) {
-  RTC_DCHECK_LE(num_sequence_numbers, 8 * kUlpfecPacketMaskSizeLBitSet);
-  if (num_sequence_numbers > 8 * kUlpfecPacketMaskSizeLBitClear) {
-    return kUlpfecPacketMaskSizeLBitSet;
-  }
-  return kUlpfecPacketMaskSizeLBitClear;
-}
-
-void InsertZeroColumns(int num_zeros,
-                       uint8_t* new_mask,
-                       int new_mask_bytes,
-                       int num_fec_packets,
-                       int new_bit_index) {
-  for (uint16_t row = 0; row < num_fec_packets; ++row) {
-    const int new_byte_index = row * new_mask_bytes + new_bit_index / 8;
-    const int max_shifts = (7 - (new_bit_index % 8));
-    new_mask[new_byte_index] <<= std::min(num_zeros, max_shifts);
-  }
-}
-
-void CopyColumn(uint8_t* new_mask,
-                int new_mask_bytes,
-                uint8_t* old_mask,
-                int old_mask_bytes,
-                int num_fec_packets,
-                int new_bit_index,
-                int old_bit_index) {
-  // Copy column from the old mask to the beginning of the new mask and shift it
-  // out from the old mask.
-  for (uint16_t row = 0; row < num_fec_packets; ++row) {
-    int new_byte_index = row * new_mask_bytes + new_bit_index / 8;
-    int old_byte_index = row * old_mask_bytes + old_bit_index / 8;
-    new_mask[new_byte_index] |= ((old_mask[old_byte_index] & 0x80) >> 7);
-    if (new_bit_index % 8 != 7) {
-      new_mask[new_byte_index] <<= 1;
-    }
-    old_mask[old_byte_index] <<= 1;
-  }
-}
-
-}  // namespace internal
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/forward_error_correction_internal.h b/modules/rtp_rtcp/source/forward_error_correction_internal.h
deleted file mode 100644
index b437cee..0000000
--- a/modules/rtp_rtcp/source/forward_error_correction_internal.h
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- *  Copyright (c) 2012 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_RTP_RTCP_SOURCE_FORWARD_ERROR_CORRECTION_INTERNAL_H_
-#define WEBRTC_MODULES_RTP_RTCP_SOURCE_FORWARD_ERROR_CORRECTION_INTERNAL_H_
-
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-// Maximum number of media packets that can be protected
-// by these packet masks.
-constexpr size_t kUlpfecMaxMediaPackets = 48;
-
-// Packet mask size in bytes (given L bit).
-constexpr size_t kUlpfecPacketMaskSizeLBitClear = 2;
-constexpr size_t kUlpfecPacketMaskSizeLBitSet = 6;
-
-// Convenience constants.
-constexpr size_t kUlpfecMinPacketMaskSize = kUlpfecPacketMaskSizeLBitClear;
-constexpr size_t kUlpfecMaxPacketMaskSize = kUlpfecPacketMaskSizeLBitSet;
-
-namespace internal {
-
-class PacketMaskTable {
- public:
-  PacketMaskTable(FecMaskType fec_mask_type, int num_media_packets);
-  ~PacketMaskTable() {}
-  FecMaskType fec_mask_type() const { return fec_mask_type_; }
-  const uint8_t* const* const* fec_packet_mask_table() const {
-    return fec_packet_mask_table_;
-  }
-
- private:
-  FecMaskType InitMaskType(FecMaskType fec_mask_type, int num_media_packets);
-  const uint8_t* const* const* InitMaskTable(FecMaskType fec_mask_type_);
-  const FecMaskType fec_mask_type_;
-  const uint8_t* const* const* fec_packet_mask_table_;
-};
-
-// Returns an array of packet masks. The mask of a single FEC packet
-// corresponds to a number of mask bytes. The mask indicates which
-// media packets should be protected by the FEC packet.
-
-// \param[in]  num_media_packets       The number of media packets to protect.
-//                                     [1, max_media_packets].
-// \param[in]  num_fec_packets         The number of FEC packets which will
-//                                     be generated. [1, num_media_packets].
-// \param[in]  num_imp_packets         The number of important packets.
-//                                     [0, num_media_packets].
-//                                     num_imp_packets = 0 is the equal
-//                                     protection scenario.
-// \param[in]  use_unequal_protection  Enables unequal protection: allocates
-//                                     more protection to the num_imp_packets.
-// \param[in]  mask_table              An instance of the |PacketMaskTable|
-//                                     class, which contains the type of FEC
-//                                     packet mask used, and a pointer to the
-//                                     corresponding packet masks.
-// \param[out] packet_mask             A pointer to hold the packet mask array,
-//                                     of size: num_fec_packets *
-//                                     "number of mask bytes".
-void GeneratePacketMasks(int num_media_packets, int num_fec_packets,
-                         int num_imp_packets, bool use_unequal_protection,
-                         const PacketMaskTable& mask_table,
-                         uint8_t* packet_mask);
-
-// Returns the required packet mask size, given the number of sequence numbers
-// that will be covered.
-size_t PacketMaskSize(size_t num_sequence_numbers);
-
-// Inserts |num_zeros| zero columns into |new_mask| at position
-// |new_bit_index|. If the current byte of |new_mask| can't fit all zeros, the
-// byte will be filled with zeros from |new_bit_index|, but the next byte will
-// be untouched.
-void InsertZeroColumns(int num_zeros,
-                       uint8_t* new_mask,
-                       int new_mask_bytes,
-                       int num_fec_packets,
-                       int new_bit_index);
-
-// Copies the left most bit column from the byte pointed to by
-// |old_bit_index| in |old_mask| to the right most column of the byte pointed
-// to by |new_bit_index| in |new_mask|. |old_mask_bytes| and |new_mask_bytes|
-// represent the number of bytes used per row for each mask. |num_fec_packets|
-// represent the number of rows of the masks.
-// The copied bit is shifted out from |old_mask| and is shifted one step to
-// the left in |new_mask|. |new_mask| will contain "xxxx xxn0" after this
-// operation, where x are previously inserted bits and n is the new bit.
-void CopyColumn(uint8_t* new_mask,
-                int new_mask_bytes,
-                uint8_t* old_mask,
-                int old_mask_bytes,
-                int num_fec_packets,
-                int new_bit_index,
-                int old_bit_index);
-
-}  // namespace internal
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_RTP_RTCP_SOURCE_FORWARD_ERROR_CORRECTION_INTERNAL_H_
diff --git a/modules/rtp_rtcp/source/nack_rtx_unittest.cc b/modules/rtp_rtcp/source/nack_rtx_unittest.cc
deleted file mode 100644
index 89d68e1..0000000
--- a/modules/rtp_rtcp/source/nack_rtx_unittest.cc
+++ /dev/null
@@ -1,290 +0,0 @@
-/*
-*  Copyright (c) 2013 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 <algorithm>
-#include <iterator>
-#include <list>
-#include <memory>
-#include <set>
-
-#include "webrtc/api/call/transport.h"
-#include "webrtc/call/rtp_stream_receiver_controller.h"
-#include "webrtc/call/rtx_receive_stream.h"
-#include "webrtc/common_types.h"
-#include "webrtc/modules/rtp_rtcp/include/receive_statistics.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_packet_received.h"
-#include "webrtc/rtc_base/rate_limiter.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-const int kVideoNackListSize = 30;
-const uint32_t kTestSsrc = 3456;
-const uint32_t kTestRtxSsrc = kTestSsrc + 1;
-const uint16_t kTestSequenceNumber = 2345;
-const uint32_t kTestNumberOfPackets = 1350;
-const int kTestNumberOfRtxPackets = 149;
-const int kNumFrames = 30;
-const int kPayloadType = 123;
-const int kRtxPayloadType = 98;
-const int64_t kMaxRttMs = 1000;
-
-class VerifyingMediaStream : public RtpPacketSinkInterface {
- public:
-  VerifyingMediaStream() {}
-
-  void OnRtpPacket(const RtpPacketReceived& packet) override {
-    if (!sequence_numbers_.empty())
-      EXPECT_EQ(kTestSsrc, packet.Ssrc());
-
-    sequence_numbers_.push_back(packet.SequenceNumber());
-  }
-  std::list<uint16_t> sequence_numbers_;
-};
-
-class RtxLoopBackTransport : public webrtc::Transport {
- public:
-  explicit RtxLoopBackTransport(uint32_t rtx_ssrc)
-      : count_(0),
-        packet_loss_(0),
-        consecutive_drop_start_(0),
-        consecutive_drop_end_(0),
-        rtx_ssrc_(rtx_ssrc),
-        count_rtx_ssrc_(0),
-        module_(NULL) {}
-
-  void SetSendModule(RtpRtcp* rtpRtcpModule) {
-    module_ = rtpRtcpModule;
-  }
-
-  void DropEveryNthPacket(int n) { packet_loss_ = n; }
-
-  void DropConsecutivePackets(int start, int total) {
-    consecutive_drop_start_ = start;
-    consecutive_drop_end_ = start + total;
-    packet_loss_ = 0;
-  }
-
-  bool SendRtp(const uint8_t* data,
-               size_t len,
-               const PacketOptions& options) override {
-    count_++;
-    RtpPacketReceived packet;
-    if (!packet.Parse(data, len))
-      return false;
-    if (packet.Ssrc() == rtx_ssrc_) {
-      count_rtx_ssrc_++;
-    } else {
-      // For non-RTX packets only.
-      expected_sequence_numbers_.insert(expected_sequence_numbers_.end(),
-                                        packet.SequenceNumber());
-    }
-    if (packet_loss_ > 0) {
-      if ((count_ % packet_loss_) == 0) {
-        return true;
-      }
-    } else if (count_ >= consecutive_drop_start_ &&
-               count_ < consecutive_drop_end_) {
-      return true;
-    }
-    EXPECT_TRUE(stream_receiver_controller_.OnRtpPacket(packet));
-    return true;
-  }
-
-  bool SendRtcp(const uint8_t* data, size_t len) override {
-    module_->IncomingRtcpPacket((const uint8_t*)data, len);
-    return true;
-  }
-  int count_;
-  int packet_loss_;
-  int consecutive_drop_start_;
-  int consecutive_drop_end_;
-  uint32_t rtx_ssrc_;
-  int count_rtx_ssrc_;
-  RtpRtcp* module_;
-  RtpStreamReceiverController stream_receiver_controller_;
-  std::set<uint16_t> expected_sequence_numbers_;
-};
-
-class RtpRtcpRtxNackTest : public ::testing::Test {
- protected:
-  RtpRtcpRtxNackTest()
-      : rtp_rtcp_module_(nullptr),
-        transport_(kTestRtxSsrc),
-        rtx_stream_(&media_stream_,
-                    rtx_associated_payload_types_,
-                    kTestSsrc),
-        payload_data_length(sizeof(payload_data)),
-        fake_clock(123456),
-        retransmission_rate_limiter_(&fake_clock, kMaxRttMs) {}
-  ~RtpRtcpRtxNackTest() {}
-
-  void SetUp() override {
-    RtpRtcp::Configuration configuration;
-    configuration.audio = false;
-    configuration.clock = &fake_clock;
-    receive_statistics_.reset(ReceiveStatistics::Create(&fake_clock));
-    configuration.receive_statistics = receive_statistics_.get();
-    configuration.outgoing_transport = &transport_;
-    configuration.retransmission_rate_limiter = &retransmission_rate_limiter_;
-    rtp_rtcp_module_ = RtpRtcp::CreateRtpRtcp(configuration);
-
-    rtp_rtcp_module_->SetSSRC(kTestSsrc);
-    rtp_rtcp_module_->SetRTCPStatus(RtcpMode::kCompound);
-    rtp_rtcp_module_->SetStorePacketsStatus(true, 600);
-    EXPECT_EQ(0, rtp_rtcp_module_->SetSendingStatus(true));
-    rtp_rtcp_module_->SetSequenceNumber(kTestSequenceNumber);
-    rtp_rtcp_module_->SetStartTimestamp(111111);
-
-    // Used for NACK processing.
-    // TODO(nisse): Unclear on which side? It's confusing to use a
-    // single rtp_rtcp module for both send and receive side.
-    rtp_rtcp_module_->SetRemoteSSRC(kTestSsrc);
-
-    rtp_rtcp_module_->RegisterVideoSendPayload(kPayloadType, "video");
-    rtp_rtcp_module_->SetRtxSendPayloadType(kRtxPayloadType, kPayloadType);
-    transport_.SetSendModule(rtp_rtcp_module_);
-    media_receiver_ = transport_.stream_receiver_controller_.CreateReceiver(
-        kTestSsrc, &media_stream_);
-
-    for (size_t n = 0; n < payload_data_length; n++) {
-      payload_data[n] = n % 10;
-    }
-  }
-
-  int BuildNackList(uint16_t* nack_list) {
-    media_stream_.sequence_numbers_.sort();
-    std::list<uint16_t> missing_sequence_numbers;
-    std::list<uint16_t>::iterator it = media_stream_.sequence_numbers_.begin();
-
-    while (it != media_stream_.sequence_numbers_.end()) {
-      uint16_t sequence_number_1 = *it;
-      ++it;
-      if (it != media_stream_.sequence_numbers_.end()) {
-        uint16_t sequence_number_2 = *it;
-        // Add all missing sequence numbers to list
-        for (uint16_t i = sequence_number_1 + 1; i < sequence_number_2; ++i) {
-          missing_sequence_numbers.push_back(i);
-        }
-      }
-    }
-    int n = 0;
-    for (it = missing_sequence_numbers.begin();
-         it != missing_sequence_numbers.end(); ++it) {
-      nack_list[n++] = (*it);
-    }
-    return n;
-  }
-
-  bool ExpectedPacketsReceived() {
-    std::list<uint16_t> received_sorted;
-    std::copy(media_stream_.sequence_numbers_.begin(),
-              media_stream_.sequence_numbers_.end(),
-              std::back_inserter(received_sorted));
-    received_sorted.sort();
-    return received_sorted.size() ==
-               transport_.expected_sequence_numbers_.size() &&
-           std::equal(received_sorted.begin(), received_sorted.end(),
-                      transport_.expected_sequence_numbers_.begin());
-  }
-
-  void RunRtxTest(RtxMode rtx_method, int loss) {
-    rtx_receiver_ = transport_.stream_receiver_controller_.CreateReceiver(
-        kTestRtxSsrc, &rtx_stream_);
-    rtp_rtcp_module_->SetRtxSendStatus(rtx_method);
-    rtp_rtcp_module_->SetRtxSsrc(kTestRtxSsrc);
-    transport_.DropEveryNthPacket(loss);
-    uint32_t timestamp = 3000;
-    uint16_t nack_list[kVideoNackListSize];
-    for (int frame = 0; frame < kNumFrames; ++frame) {
-      EXPECT_TRUE(rtp_rtcp_module_->SendOutgoingData(
-          webrtc::kVideoFrameDelta, kPayloadType, timestamp, timestamp / 90,
-          payload_data, payload_data_length, nullptr, nullptr, nullptr));
-      // Min required delay until retransmit = 5 + RTT ms (RTT = 0).
-      fake_clock.AdvanceTimeMilliseconds(5);
-      int length = BuildNackList(nack_list);
-      if (length > 0)
-        rtp_rtcp_module_->SendNACK(nack_list, length);
-      fake_clock.AdvanceTimeMilliseconds(28);  //  33ms - 5ms delay.
-      rtp_rtcp_module_->Process();
-      // Prepare next frame.
-      timestamp += 3000;
-    }
-    media_stream_.sequence_numbers_.sort();
-  }
-
-  void TearDown() override { delete rtp_rtcp_module_; }
-
-  std::unique_ptr<ReceiveStatistics> receive_statistics_;
-  RtpRtcp* rtp_rtcp_module_;
-  RtxLoopBackTransport transport_;
-  const std::map<int, int> rtx_associated_payload_types_ =
-      {{kRtxPayloadType, kPayloadType}};
-  VerifyingMediaStream media_stream_;
-  RtxReceiveStream rtx_stream_;
-  uint8_t payload_data[65000];
-  size_t payload_data_length;
-  SimulatedClock fake_clock;
-  RateLimiter retransmission_rate_limiter_;
-  std::unique_ptr<RtpStreamReceiverInterface> media_receiver_;
-  std::unique_ptr<RtpStreamReceiverInterface> rtx_receiver_;
-};
-
-TEST_F(RtpRtcpRtxNackTest, LongNackList) {
-  const int kNumPacketsToDrop = 900;
-  const int kNumRequiredRtcp = 4;
-  uint32_t timestamp = 3000;
-  uint16_t nack_list[kNumPacketsToDrop];
-  // Disable StorePackets to be able to set a larger packet history.
-  rtp_rtcp_module_->SetStorePacketsStatus(false, 0);
-  // Enable StorePackets with a packet history of 2000 packets.
-  rtp_rtcp_module_->SetStorePacketsStatus(true, 2000);
-  // Drop 900 packets from the second one so that we get a NACK list which is
-  // big enough to require 4 RTCP packets to be fully transmitted to the sender.
-  transport_.DropConsecutivePackets(2, kNumPacketsToDrop);
-  // Send 30 frames which at the default size is roughly what we need to get
-  // enough packets.
-  for (int frame = 0; frame < kNumFrames; ++frame) {
-    EXPECT_TRUE(rtp_rtcp_module_->SendOutgoingData(
-        webrtc::kVideoFrameDelta, kPayloadType, timestamp, timestamp / 90,
-        payload_data, payload_data_length, nullptr, nullptr, nullptr));
-    // Prepare next frame.
-    timestamp += 3000;
-    fake_clock.AdvanceTimeMilliseconds(33);
-    rtp_rtcp_module_->Process();
-  }
-  EXPECT_FALSE(transport_.expected_sequence_numbers_.empty());
-  EXPECT_FALSE(media_stream_.sequence_numbers_.empty());
-  size_t last_receive_count = media_stream_.sequence_numbers_.size();
-  int length = BuildNackList(nack_list);
-  for (int i = 0; i < kNumRequiredRtcp - 1; ++i) {
-    rtp_rtcp_module_->SendNACK(nack_list, length);
-    EXPECT_GT(media_stream_.sequence_numbers_.size(), last_receive_count);
-    last_receive_count = media_stream_.sequence_numbers_.size();
-    EXPECT_FALSE(ExpectedPacketsReceived());
-  }
-  rtp_rtcp_module_->SendNACK(nack_list, length);
-  EXPECT_GT(media_stream_.sequence_numbers_.size(), last_receive_count);
-  EXPECT_TRUE(ExpectedPacketsReceived());
-}
-
-TEST_F(RtpRtcpRtxNackTest, RtxNack) {
-  RunRtxTest(kRtxRetransmitted, 10);
-  EXPECT_EQ(kTestSequenceNumber, *(media_stream_.sequence_numbers_.begin()));
-  EXPECT_EQ(kTestSequenceNumber + kTestNumberOfPackets - 1,
-            *(media_stream_.sequence_numbers_.rbegin()));
-  EXPECT_EQ(kTestNumberOfPackets, media_stream_.sequence_numbers_.size());
-  EXPECT_EQ(kTestNumberOfRtxPackets, transport_.count_rtx_ssrc_);
-  EXPECT_TRUE(ExpectedPacketsReceived());
-}
-
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/packet_loss_stats.cc b/modules/rtp_rtcp/source/packet_loss_stats.cc
deleted file mode 100644
index 12f8bfa..0000000
--- a/modules/rtp_rtcp/source/packet_loss_stats.cc
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
- *  Copyright (c) 2015 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/rtp_rtcp/source/packet_loss_stats.h"
-
-#include <vector>
-
-#include "webrtc/rtc_base/checks.h"
-
-// After this many packets are added, adding additional packets will cause the
-// oldest packets to be pruned from the buffer.
-static const int kBufferSize = 100;
-
-namespace webrtc {
-
-PacketLossStats::PacketLossStats()
-    : single_loss_historic_count_(0),
-      multiple_loss_historic_event_count_(0),
-      multiple_loss_historic_packet_count_(0) {
-}
-
-void PacketLossStats::AddLostPacket(uint16_t sequence_number) {
-  // Detect sequence number wrap around.
-  if (!lost_packets_buffer_.empty() &&
-      static_cast<int>(*(lost_packets_buffer_.rbegin())) - sequence_number
-      > 0x8000) {
-    // The buffer contains large numbers and this is a small number.
-    lost_packets_wrapped_buffer_.insert(sequence_number);
-  } else {
-    lost_packets_buffer_.insert(sequence_number);
-  }
-  if (lost_packets_wrapped_buffer_.size() + lost_packets_buffer_.size()
-      > kBufferSize || (!lost_packets_wrapped_buffer_.empty() &&
-                        *(lost_packets_wrapped_buffer_.rbegin()) > 0x4000)) {
-    PruneBuffer();
-  }
-}
-
-int PacketLossStats::GetSingleLossCount() const {
-  int single_loss_count, unused1, unused2;
-  ComputeLossCounts(&single_loss_count, &unused1, &unused2);
-  return single_loss_count;
-}
-
-int PacketLossStats::GetMultipleLossEventCount() const {
-  int event_count, unused1, unused2;
-  ComputeLossCounts(&unused1, &event_count, &unused2);
-  return event_count;
-}
-
-int PacketLossStats::GetMultipleLossPacketCount() const {
-  int packet_count, unused1, unused2;
-  ComputeLossCounts(&unused1, &unused2, &packet_count);
-  return packet_count;
-}
-
-void PacketLossStats::ComputeLossCounts(
-    int* out_single_loss_count,
-    int* out_multiple_loss_event_count,
-    int* out_multiple_loss_packet_count) const {
-  *out_single_loss_count = single_loss_historic_count_;
-  *out_multiple_loss_event_count = multiple_loss_historic_event_count_;
-  *out_multiple_loss_packet_count = multiple_loss_historic_packet_count_;
-  if (lost_packets_buffer_.empty()) {
-    RTC_DCHECK(lost_packets_wrapped_buffer_.empty());
-    return;
-  }
-  uint16_t last_num = 0;
-  int sequential_count = 0;
-  std::vector<const std::set<uint16_t>*> buffers;
-  buffers.push_back(&lost_packets_buffer_);
-  buffers.push_back(&lost_packets_wrapped_buffer_);
-  for (auto buffer : buffers) {
-    for (auto it = buffer->begin(); it != buffer->end(); ++it) {
-      uint16_t current_num = *it;
-      if (sequential_count > 0 && current_num != ((last_num + 1) & 0xFFFF)) {
-        if (sequential_count == 1) {
-          (*out_single_loss_count)++;
-        } else {
-          (*out_multiple_loss_event_count)++;
-          *out_multiple_loss_packet_count += sequential_count;
-        }
-        sequential_count = 0;
-      }
-      sequential_count++;
-      last_num = current_num;
-    }
-  }
-  if (sequential_count == 1) {
-    (*out_single_loss_count)++;
-  } else if (sequential_count > 1) {
-    (*out_multiple_loss_event_count)++;
-    *out_multiple_loss_packet_count += sequential_count;
-  }
-}
-
-void PacketLossStats::PruneBuffer() {
-  // Remove the oldest lost packet and any contiguous packets and move them
-  // into the historic counts.
-  auto it = lost_packets_buffer_.begin();
-  uint16_t last_removed = 0;
-  int remove_count = 0;
-  // Count adjacent packets and continue counting if it is wrap around by
-  // swapping in the wrapped buffer and letting our value wrap as well.
-  while (remove_count == 0 || (!lost_packets_buffer_.empty() &&
-                               *it == ((last_removed + 1) & 0xFFFF))) {
-    last_removed = *it;
-    remove_count++;
-    auto to_erase = it++;
-    lost_packets_buffer_.erase(to_erase);
-    if (lost_packets_buffer_.empty()) {
-      lost_packets_buffer_.swap(lost_packets_wrapped_buffer_);
-      it = lost_packets_buffer_.begin();
-    }
-  }
-  if (remove_count > 1) {
-    multiple_loss_historic_event_count_++;
-    multiple_loss_historic_packet_count_ += remove_count;
-  } else {
-    single_loss_historic_count_++;
-  }
-  // Continue pruning if the wrapped buffer is beyond a threshold and there are
-  // things left in the pre-wrapped buffer.
-  if (!lost_packets_wrapped_buffer_.empty() &&
-      *(lost_packets_wrapped_buffer_.rbegin()) > 0x4000) {
-    PruneBuffer();
-  }
-}
-
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/packet_loss_stats.h b/modules/rtp_rtcp/source/packet_loss_stats.h
deleted file mode 100644
index 2eab043..0000000
--- a/modules/rtp_rtcp/source/packet_loss_stats.h
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- *  Copyright (c) 2015 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_RTP_RTCP_SOURCE_PACKET_LOSS_STATS_H_
-#define WEBRTC_MODULES_RTP_RTCP_SOURCE_PACKET_LOSS_STATS_H_
-
-#include <stdint.h>
-#include <set>
-
-namespace webrtc {
-
-// Keeps track of statistics of packet loss including whether losses are a
-// single packet or multiple packets in a row.
-class PacketLossStats {
- public:
-  PacketLossStats();
-  ~PacketLossStats() {}
-
-  // Adds a lost packet to the stats by sequence number.
-  void AddLostPacket(uint16_t sequence_number);
-
-  // Queries the number of packets that were lost by themselves, no neighboring
-  // packets were lost.
-  int GetSingleLossCount() const;
-
-  // Queries the number of times that multiple packets with sequential numbers
-  // were lost. This is the number of events with more than one packet lost,
-  // regardless of the size of the event;
-  int GetMultipleLossEventCount() const;
-
-  // Queries the number of packets lost in multiple packet loss events. Combined
-  // with the event count, this can be used to determine the average event size.
-  int GetMultipleLossPacketCount() const;
-
- private:
-  std::set<uint16_t> lost_packets_buffer_;
-  std::set<uint16_t> lost_packets_wrapped_buffer_;
-  int single_loss_historic_count_;
-  int multiple_loss_historic_event_count_;
-  int multiple_loss_historic_packet_count_;
-
-  void ComputeLossCounts(int* out_single_loss_count,
-                         int* out_multiple_loss_event_count,
-                         int* out_multiple_loss_packet_count) const;
-  void PruneBuffer();
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_RTP_RTCP_SOURCE_PACKET_LOSS_STATS_H_
diff --git a/modules/rtp_rtcp/source/packet_loss_stats_unittest.cc b/modules/rtp_rtcp/source/packet_loss_stats_unittest.cc
deleted file mode 100644
index b82f46b..0000000
--- a/modules/rtp_rtcp/source/packet_loss_stats_unittest.cc
+++ /dev/null
@@ -1,197 +0,0 @@
-/*
- *  Copyright (c) 2015 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/rtp_rtcp/source/packet_loss_stats.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-class PacketLossStatsTest : public ::testing::Test {
- protected:
-  PacketLossStats stats_;
-};
-
-// Add a lost packet as every other packet, they should all count as single
-// losses.
-TEST_F(PacketLossStatsTest, EveryOtherPacket) {
-  for (int i = 0; i < 1000; i += 2) {
-    stats_.AddLostPacket(i);
-  }
-  EXPECT_EQ(500, stats_.GetSingleLossCount());
-  EXPECT_EQ(0, stats_.GetMultipleLossEventCount());
-  EXPECT_EQ(0, stats_.GetMultipleLossPacketCount());
-}
-
-// Add a lost packet as every other packet, but such that the sequence numbers
-// will wrap around while they are being added.
-TEST_F(PacketLossStatsTest, EveryOtherPacketWrapped) {
-  for (int i = 65500; i < 66500; i += 2) {
-    stats_.AddLostPacket(i & 0xFFFF);
-  }
-  EXPECT_EQ(500, stats_.GetSingleLossCount());
-  EXPECT_EQ(0, stats_.GetMultipleLossEventCount());
-  EXPECT_EQ(0, stats_.GetMultipleLossPacketCount());
-}
-
-// Add a lost packet as every other packet, but such that the sequence numbers
-// will wrap around close to the very end, such that the buffer contains packets
-// on either side of the wrapping.
-TEST_F(PacketLossStatsTest, EveryOtherPacketWrappedAtEnd) {
-  for (int i = 64600; i < 65600; i += 2) {
-    stats_.AddLostPacket(i & 0xFFFF);
-  }
-  EXPECT_EQ(500, stats_.GetSingleLossCount());
-  EXPECT_EQ(0, stats_.GetMultipleLossEventCount());
-  EXPECT_EQ(0, stats_.GetMultipleLossPacketCount());
-}
-
-// Add a lost packet as the first three of every eight packets. Each set of
-// three should count as a multiple loss event and three multiple loss packets.
-TEST_F(PacketLossStatsTest, FirstThreeOfEight) {
-  for (int i = 0; i < 1000; ++i) {
-    if ((i & 7) < 3) {
-      stats_.AddLostPacket(i);
-    }
-  }
-  EXPECT_EQ(0, stats_.GetSingleLossCount());
-  EXPECT_EQ(125, stats_.GetMultipleLossEventCount());
-  EXPECT_EQ(375, stats_.GetMultipleLossPacketCount());
-}
-
-// Add a lost packet as the first three of every eight packets such that the
-// sequence numbers wrap in the middle of adding them.
-TEST_F(PacketLossStatsTest, FirstThreeOfEightWrapped) {
-  for (int i = 65500; i < 66500; ++i) {
-    if ((i & 7) < 3) {
-      stats_.AddLostPacket(i & 0xFFFF);
-    }
-  }
-  EXPECT_EQ(0, stats_.GetSingleLossCount());
-  EXPECT_EQ(125, stats_.GetMultipleLossEventCount());
-  EXPECT_EQ(375, stats_.GetMultipleLossPacketCount());
-}
-
-// Add a lost packet as the first three of every eight packets such that the
-// sequence numbers wrap near the end of adding them and there are still numbers
-// in the buffer from before the wrapping.
-TEST_F(PacketLossStatsTest, FirstThreeOfEightWrappedAtEnd) {
-  for (int i = 64600; i < 65600; ++i) {
-    if ((i & 7) < 3) {
-      stats_.AddLostPacket(i & 0xFFFF);
-    }
-  }
-  EXPECT_EQ(0, stats_.GetSingleLossCount());
-  EXPECT_EQ(125, stats_.GetMultipleLossEventCount());
-  EXPECT_EQ(375, stats_.GetMultipleLossPacketCount());
-}
-
-// Add loss packets as the first three and the fifth of every eight packets. The
-// set of three should be multiple loss and the fifth should be single loss.
-TEST_F(PacketLossStatsTest, FirstThreeAndFifthOfEight) {
-  for (int i = 0; i < 1000; ++i) {
-    if ((i & 7) < 3 || (i & 7) == 4) {
-      stats_.AddLostPacket(i);
-    }
-  }
-  EXPECT_EQ(125, stats_.GetSingleLossCount());
-  EXPECT_EQ(125, stats_.GetMultipleLossEventCount());
-  EXPECT_EQ(375, stats_.GetMultipleLossPacketCount());
-}
-
-// Add loss packets as the first three and the fifth of every eight packets such
-// that the sequence numbers wrap in the middle of adding them.
-TEST_F(PacketLossStatsTest, FirstThreeAndFifthOfEightWrapped) {
-  for (int i = 65500; i < 66500; ++i) {
-    if ((i & 7) < 3 || (i & 7) == 4) {
-      stats_.AddLostPacket(i & 0xFFFF);
-    }
-  }
-  EXPECT_EQ(125, stats_.GetSingleLossCount());
-  EXPECT_EQ(125, stats_.GetMultipleLossEventCount());
-  EXPECT_EQ(375, stats_.GetMultipleLossPacketCount());
-}
-
-// Add loss packets as the first three and the fifth of every eight packets such
-// that the sequence numbers wrap near the end of adding them and there are
-// packets from before the wrapping still in the buffer.
-TEST_F(PacketLossStatsTest, FirstThreeAndFifthOfEightWrappedAtEnd) {
-  for (int i = 64600; i < 65600; ++i) {
-    if ((i & 7) < 3 || (i & 7) == 4) {
-      stats_.AddLostPacket(i & 0xFFFF);
-    }
-  }
-  EXPECT_EQ(125, stats_.GetSingleLossCount());
-  EXPECT_EQ(125, stats_.GetMultipleLossEventCount());
-  EXPECT_EQ(375, stats_.GetMultipleLossPacketCount());
-}
-
-// Add loss packets such that there is a multiple loss event that continues
-// around the wrapping of sequence numbers.
-TEST_F(PacketLossStatsTest, MultipleLossEventWrapped) {
-  for (int i = 60000; i < 60500; i += 2) {
-    stats_.AddLostPacket(i);
-  }
-  for (int i = 65530; i < 65540; ++i) {
-    stats_.AddLostPacket(i & 0xFFFF);
-  }
-  EXPECT_EQ(250, stats_.GetSingleLossCount());
-  EXPECT_EQ(1, stats_.GetMultipleLossEventCount());
-  EXPECT_EQ(10, stats_.GetMultipleLossPacketCount());
-}
-
-// Add loss packets such that there is a multiple loss event that continues
-// around the wrapping of sequence numbers and then is pushed out of the buffer.
-TEST_F(PacketLossStatsTest, MultipleLossEventWrappedPushedOut) {
-  for (int i = 60000; i < 60500; i += 2) {
-    stats_.AddLostPacket(i);
-  }
-  for (int i = 65530; i < 65540; ++i) {
-    stats_.AddLostPacket(i & 0xFFFF);
-  }
-  for (int i = 1000; i < 1500; i += 2) {
-    stats_.AddLostPacket(i);
-  }
-  EXPECT_EQ(500, stats_.GetSingleLossCount());
-  EXPECT_EQ(1, stats_.GetMultipleLossEventCount());
-  EXPECT_EQ(10, stats_.GetMultipleLossPacketCount());
-}
-
-// Add loss packets out of order and ensure that they still get counted
-// correctly as single or multiple loss events.
-TEST_F(PacketLossStatsTest, OutOfOrder) {
-  for (int i = 0; i < 1000; i += 10) {
-    stats_.AddLostPacket(i + 5);
-    stats_.AddLostPacket(i + 7);
-    stats_.AddLostPacket(i + 4);
-    stats_.AddLostPacket(i + 1);
-    stats_.AddLostPacket(i + 2);
-  }
-  EXPECT_EQ(100, stats_.GetSingleLossCount());
-  EXPECT_EQ(200, stats_.GetMultipleLossEventCount());
-  EXPECT_EQ(400, stats_.GetMultipleLossPacketCount());
-}
-
-// Add loss packets out of order and ensure that they still get counted
-// correctly as single or multiple loss events, and wrap in the middle of
-// adding.
-TEST_F(PacketLossStatsTest, OutOfOrderWrapped) {
-  for (int i = 65000; i < 66000; i += 10) {
-    stats_.AddLostPacket((i + 5) & 0xFFFF);
-    stats_.AddLostPacket((i + 7) & 0xFFFF);
-    stats_.AddLostPacket((i + 4) & 0xFFFF);
-    stats_.AddLostPacket((i + 1) & 0xFFFF);
-    stats_.AddLostPacket((i + 2) & 0xFFFF);
-  }
-  EXPECT_EQ(100, stats_.GetSingleLossCount());
-  EXPECT_EQ(200, stats_.GetMultipleLossEventCount());
-  EXPECT_EQ(400, stats_.GetMultipleLossPacketCount());
-}
-
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/playout_delay_oracle.cc b/modules/rtp_rtcp/source/playout_delay_oracle.cc
deleted file mode 100644
index 0ca81ed..0000000
--- a/modules/rtp_rtcp/source/playout_delay_oracle.cc
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- *  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/rtp_rtcp/source/playout_delay_oracle.h"
-
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_header_extensions.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-
-namespace webrtc {
-
-PlayoutDelayOracle::PlayoutDelayOracle()
-    : high_sequence_number_(0),
-      send_playout_delay_(false),
-      ssrc_(0),
-      playout_delay_{-1, -1} {}
-
-PlayoutDelayOracle::~PlayoutDelayOracle() {}
-
-void PlayoutDelayOracle::UpdateRequest(uint32_t ssrc,
-                                       PlayoutDelay playout_delay,
-                                       uint16_t seq_num) {
-  rtc::CritScope lock(&crit_sect_);
-  RTC_DCHECK_LE(playout_delay.min_ms, PlayoutDelayLimits::kMaxMs);
-  RTC_DCHECK_LE(playout_delay.max_ms, PlayoutDelayLimits::kMaxMs);
-  RTC_DCHECK_LE(playout_delay.min_ms, playout_delay.max_ms);
-  int64_t unwrapped_seq_num = unwrapper_.Unwrap(seq_num);
-  if (playout_delay.min_ms >= 0 &&
-      playout_delay.min_ms != playout_delay_.min_ms) {
-    send_playout_delay_ = true;
-    playout_delay_.min_ms = playout_delay.min_ms;
-    high_sequence_number_ = unwrapped_seq_num;
-  }
-
-  if (playout_delay.max_ms >= 0 &&
-      playout_delay.max_ms != playout_delay_.max_ms) {
-    send_playout_delay_ = true;
-    playout_delay_.max_ms = playout_delay.max_ms;
-    high_sequence_number_ = unwrapped_seq_num;
-  }
-  ssrc_ = ssrc;
-}
-
-// If an ACK is received on the packet containing the playout delay extension,
-// we stop sending the extension on future packets.
-void PlayoutDelayOracle::OnReceivedRtcpReportBlocks(
-    const ReportBlockList& report_blocks) {
-  rtc::CritScope lock(&crit_sect_);
-  for (const RTCPReportBlock& report_block : report_blocks) {
-    if ((ssrc_ == report_block.source_ssrc) && send_playout_delay_ &&
-        (report_block.extended_highest_sequence_number >
-         high_sequence_number_)) {
-      send_playout_delay_ = false;
-    }
-  }
-}
-
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/playout_delay_oracle.h b/modules/rtp_rtcp/source/playout_delay_oracle.h
deleted file mode 100644
index b0d734b..0000000
--- a/modules/rtp_rtcp/source/playout_delay_oracle.h
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- *  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_RTP_RTCP_SOURCE_PLAYOUT_DELAY_ORACLE_H_
-#define WEBRTC_MODULES_RTP_RTCP_SOURCE_PLAYOUT_DELAY_ORACLE_H_
-
-#include <stdint.h>
-
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/thread_annotations.h"
-
-namespace webrtc {
-
-// This class tracks the application requests to limit minimum and maximum
-// playout delay and makes a decision on whether the current RTP frame
-// should include the playout out delay extension header.
-//
-//  Playout delay can be defined in terms of capture and render time as follows:
-//
-// Render time = Capture time in receiver time + playout delay
-//
-// The application specifies a minimum and maximum limit for the playout delay
-// which are both communicated to the receiver and the receiver can adapt
-// the playout delay within this range based on observed network jitter.
-class PlayoutDelayOracle {
- public:
-  PlayoutDelayOracle();
-  ~PlayoutDelayOracle();
-
-  // Returns true if the current frame should include the playout delay
-  // extension
-  bool send_playout_delay() const {
-    rtc::CritScope lock(&crit_sect_);
-    return send_playout_delay_;
-  }
-
-  // Returns current playout delay.
-  PlayoutDelay playout_delay() const {
-    rtc::CritScope lock(&crit_sect_);
-    return playout_delay_;
-  }
-
-  // Updates the application requested playout delay, current ssrc
-  // and the current sequence number.
-  void UpdateRequest(uint32_t ssrc,
-                     PlayoutDelay playout_delay,
-                     uint16_t seq_num);
-
-  void OnReceivedRtcpReportBlocks(const ReportBlockList& report_blocks);
-
- private:
-  // The playout delay information is updated from the encoder thread(s).
-  // The sequence number feedback is updated from the worker thread.
-  // Guards access to data across multiple threads.
-  rtc::CriticalSection crit_sect_;
-  // The current highest sequence number on which playout delay has been sent.
-  int64_t high_sequence_number_ RTC_GUARDED_BY(crit_sect_);
-  // Indicates whether the playout delay should go on the next frame.
-  bool send_playout_delay_ RTC_GUARDED_BY(crit_sect_);
-  // Sender ssrc.
-  uint32_t ssrc_ RTC_GUARDED_BY(crit_sect_);
-  // Sequence number unwrapper.
-  SequenceNumberUnwrapper unwrapper_ RTC_GUARDED_BY(crit_sect_);
-  // Playout delay values on the next frame if |send_playout_delay_| is set.
-  PlayoutDelay playout_delay_ RTC_GUARDED_BY(crit_sect_);
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(PlayoutDelayOracle);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_RTP_RTCP_SOURCE_PLAYOUT_DELAY_ORACLE_H_
diff --git a/modules/rtp_rtcp/source/playout_delay_oracle_unittest.cc b/modules/rtp_rtcp/source/playout_delay_oracle_unittest.cc
deleted file mode 100644
index f32e821..0000000
--- a/modules/rtp_rtcp/source/playout_delay_oracle_unittest.cc
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- *  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/rtp_rtcp/source/playout_delay_oracle.h"
-
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-namespace {
-constexpr int kSsrc = 100;
-constexpr int kSequenceNumber = 100;
-constexpr int kMinPlayoutDelay = 0;
-constexpr int kMaxPlayoutDelay = 150;
-}  // namespace
-
-class PlayoutDelayOracleTest : public ::testing::Test {
- protected:
-  void ReportRTCPFeedback(int ssrc, int seq_num) {
-    RTCPReportBlock report_block;
-    report_block.source_ssrc = ssrc;
-    report_block.extended_highest_sequence_number = seq_num;
-    report_blocks_.push_back(report_block);
-    playout_delay_oracle_.OnReceivedRtcpReportBlocks(report_blocks_);
-  }
-
-  ReportBlockList report_blocks_;
-  PlayoutDelayOracle playout_delay_oracle_;
-};
-
-TEST_F(PlayoutDelayOracleTest, DisabledByDefault) {
-  EXPECT_FALSE(playout_delay_oracle_.send_playout_delay());
-  EXPECT_EQ(-1, playout_delay_oracle_.playout_delay().min_ms);
-  EXPECT_EQ(-1, playout_delay_oracle_.playout_delay().max_ms);
-}
-
-TEST_F(PlayoutDelayOracleTest, SendPlayoutDelayUntilSeqNumberExceeds) {
-  PlayoutDelay playout_delay = {kMinPlayoutDelay, kMaxPlayoutDelay};
-  playout_delay_oracle_.UpdateRequest(kSsrc, playout_delay, kSequenceNumber);
-  EXPECT_TRUE(playout_delay_oracle_.send_playout_delay());
-  EXPECT_EQ(kMinPlayoutDelay, playout_delay_oracle_.playout_delay().min_ms);
-  EXPECT_EQ(kMaxPlayoutDelay, playout_delay_oracle_.playout_delay().max_ms);
-
-  // Oracle indicates playout delay should be sent if highest sequence number
-  // acked is lower than the sequence number of the first packet containing
-  // playout delay.
-  ReportRTCPFeedback(kSsrc, kSequenceNumber - 1);
-  EXPECT_TRUE(playout_delay_oracle_.send_playout_delay());
-
-  // An invalid ssrc feedback report is dropped by the oracle.
-  ReportRTCPFeedback(kSsrc + 1, kSequenceNumber + 1);
-  EXPECT_TRUE(playout_delay_oracle_.send_playout_delay());
-
-  // Oracle indicates playout delay should not be sent if sequence number
-  // acked on a matching ssrc indicates the receiver has received the playout
-  // delay values.
-  ReportRTCPFeedback(kSsrc, kSequenceNumber + 1);
-  EXPECT_FALSE(playout_delay_oracle_.send_playout_delay());
-}
-
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/receive_statistics_impl.cc b/modules/rtp_rtcp/source/receive_statistics_impl.cc
deleted file mode 100644
index 9c7bb2a..0000000
--- a/modules/rtp_rtcp/source/receive_statistics_impl.cc
+++ /dev/null
@@ -1,514 +0,0 @@
-/*
- *  Copyright (c) 2013 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/rtp_rtcp/source/receive_statistics_impl.h"
-
-#include <math.h>
-
-#include <cstdlib>
-#include <vector>
-
-#include "webrtc/modules/remote_bitrate_estimator/test/bwe_test_logging.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_rtcp_config.h"
-#include "webrtc/modules/rtp_rtcp/source/time_util.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/system_wrappers/include/clock.h"
-
-namespace webrtc {
-
-const int64_t kStatisticsTimeoutMs = 8000;
-const int64_t kStatisticsProcessIntervalMs = 1000;
-
-StreamStatistician::~StreamStatistician() {}
-
-StreamStatisticianImpl::StreamStatisticianImpl(
-    uint32_t ssrc,
-    Clock* clock,
-    RtcpStatisticsCallback* rtcp_callback,
-    StreamDataCountersCallback* rtp_callback)
-    : ssrc_(ssrc),
-      clock_(clock),
-      incoming_bitrate_(kStatisticsProcessIntervalMs,
-                        RateStatistics::kBpsScale),
-      max_reordering_threshold_(kDefaultMaxReorderingThreshold),
-      jitter_q4_(0),
-      cumulative_loss_(0),
-      jitter_q4_transmission_time_offset_(0),
-      last_receive_time_ms_(0),
-      last_received_timestamp_(0),
-      last_received_transmission_time_offset_(0),
-      received_seq_first_(0),
-      received_seq_max_(0),
-      received_seq_wraps_(0),
-      received_packet_overhead_(12),
-      last_report_inorder_packets_(0),
-      last_report_old_packets_(0),
-      last_report_seq_max_(0),
-      rtcp_callback_(rtcp_callback),
-      rtp_callback_(rtp_callback) {}
-
-void StreamStatisticianImpl::IncomingPacket(const RTPHeader& header,
-                                            size_t packet_length,
-                                            bool retransmitted) {
-  auto counters = UpdateCounters(header, packet_length, retransmitted);
-  rtp_callback_->DataCountersUpdated(counters, ssrc_);
-}
-
-StreamDataCounters StreamStatisticianImpl::UpdateCounters(
-    const RTPHeader& header,
-    size_t packet_length,
-    bool retransmitted) {
-  rtc::CritScope cs(&stream_lock_);
-  bool in_order = InOrderPacketInternal(header.sequenceNumber);
-  RTC_DCHECK_EQ(ssrc_, header.ssrc);
-  incoming_bitrate_.Update(packet_length, clock_->TimeInMilliseconds());
-  receive_counters_.transmitted.AddPacket(packet_length, header);
-  if (!in_order && retransmitted) {
-    receive_counters_.retransmitted.AddPacket(packet_length, header);
-  }
-
-  if (receive_counters_.transmitted.packets == 1) {
-    received_seq_first_ = header.sequenceNumber;
-    receive_counters_.first_packet_time_ms = clock_->TimeInMilliseconds();
-  }
-
-  // Count only the new packets received. That is, if packets 1, 2, 3, 5, 4, 6
-  // are received, 4 will be ignored.
-  if (in_order) {
-    // Current time in samples.
-    NtpTime receive_time = clock_->CurrentNtpTime();
-
-    // Wrong if we use RetransmitOfOldPacket.
-    if (receive_counters_.transmitted.packets > 1 &&
-        received_seq_max_ > header.sequenceNumber) {
-      // Wrap around detected.
-      received_seq_wraps_++;
-    }
-    // New max.
-    received_seq_max_ = header.sequenceNumber;
-
-    // If new time stamp and more than one in-order packet received, calculate
-    // new jitter statistics.
-    if (header.timestamp != last_received_timestamp_ &&
-        (receive_counters_.transmitted.packets -
-         receive_counters_.retransmitted.packets) > 1) {
-      UpdateJitter(header, receive_time);
-    }
-    last_received_timestamp_ = header.timestamp;
-    last_receive_time_ntp_ = receive_time;
-    last_receive_time_ms_ = clock_->TimeInMilliseconds();
-  }
-
-  size_t packet_oh = header.headerLength + header.paddingLength;
-
-  // Our measured overhead. Filter from RFC 5104 4.2.1.2:
-  // avg_OH (new) = 15/16*avg_OH (old) + 1/16*pckt_OH,
-  received_packet_overhead_ = (15 * received_packet_overhead_ + packet_oh) >> 4;
-  return receive_counters_;
-}
-
-void StreamStatisticianImpl::UpdateJitter(const RTPHeader& header,
-                                          NtpTime receive_time) {
-  uint32_t receive_time_rtp =
-      NtpToRtp(receive_time, header.payload_type_frequency);
-  uint32_t last_receive_time_rtp =
-      NtpToRtp(last_receive_time_ntp_, header.payload_type_frequency);
-  int32_t time_diff_samples = (receive_time_rtp - last_receive_time_rtp) -
-      (header.timestamp - last_received_timestamp_);
-
-  time_diff_samples = std::abs(time_diff_samples);
-
-  // lib_jingle sometimes deliver crazy jumps in TS for the same stream.
-  // If this happens, don't update jitter value. Use 5 secs video frequency
-  // as the threshold.
-  if (time_diff_samples < 450000) {
-    // Note we calculate in Q4 to avoid using float.
-    int32_t jitter_diff_q4 = (time_diff_samples << 4) - jitter_q4_;
-    jitter_q4_ += ((jitter_diff_q4 + 8) >> 4);
-  }
-
-  // Extended jitter report, RFC 5450.
-  // Actual network jitter, excluding the source-introduced jitter.
-  int32_t time_diff_samples_ext =
-    (receive_time_rtp - last_receive_time_rtp) -
-    ((header.timestamp +
-      header.extension.transmissionTimeOffset) -
-     (last_received_timestamp_ +
-      last_received_transmission_time_offset_));
-
-  time_diff_samples_ext = std::abs(time_diff_samples_ext);
-
-  if (time_diff_samples_ext < 450000) {
-    int32_t jitter_diffQ4TransmissionTimeOffset =
-      (time_diff_samples_ext << 4) - jitter_q4_transmission_time_offset_;
-    jitter_q4_transmission_time_offset_ +=
-      ((jitter_diffQ4TransmissionTimeOffset + 8) >> 4);
-  }
-}
-
-void StreamStatisticianImpl::FecPacketReceived(const RTPHeader& header,
-                                               size_t packet_length) {
-  StreamDataCounters counters;
-  {
-    rtc::CritScope cs(&stream_lock_);
-    receive_counters_.fec.AddPacket(packet_length, header);
-    counters = receive_counters_;
-  }
-  rtp_callback_->DataCountersUpdated(counters, ssrc_);
-}
-
-void StreamStatisticianImpl::SetMaxReorderingThreshold(
-    int max_reordering_threshold) {
-  rtc::CritScope cs(&stream_lock_);
-  max_reordering_threshold_ = max_reordering_threshold;
-}
-
-bool StreamStatisticianImpl::GetStatistics(RtcpStatistics* statistics,
-                                           bool reset) {
-  {
-    rtc::CritScope cs(&stream_lock_);
-    if (received_seq_first_ == 0 &&
-        receive_counters_.transmitted.payload_bytes == 0) {
-      // We have not received anything.
-      return false;
-    }
-
-    if (!reset) {
-      if (last_report_inorder_packets_ == 0) {
-        // No report.
-        return false;
-      }
-      // Just get last report.
-      *statistics = last_reported_statistics_;
-      return true;
-    }
-
-    *statistics = CalculateRtcpStatistics();
-  }
-
-  rtcp_callback_->StatisticsUpdated(*statistics, ssrc_);
-  return true;
-}
-
-RtcpStatistics StreamStatisticianImpl::CalculateRtcpStatistics() {
-  RtcpStatistics stats;
-
-  if (last_report_inorder_packets_ == 0) {
-    // First time we send a report.
-    last_report_seq_max_ = received_seq_first_ - 1;
-  }
-
-  // Calculate fraction lost.
-  uint16_t exp_since_last = (received_seq_max_ - last_report_seq_max_);
-
-  if (last_report_seq_max_ > received_seq_max_) {
-    // Can we assume that the seq_num can't go decrease over a full RTCP period?
-    exp_since_last = 0;
-  }
-
-  // Number of received RTP packets since last report, counts all packets but
-  // not re-transmissions.
-  uint32_t rec_since_last =
-      (receive_counters_.transmitted.packets -
-       receive_counters_.retransmitted.packets) - last_report_inorder_packets_;
-
-  // With NACK we don't know the expected retransmissions during the last
-  // second. We know how many "old" packets we have received. We just count
-  // the number of old received to estimate the loss, but it still does not
-  // guarantee an exact number since we run this based on time triggered by
-  // sending of an RTP packet. This should have a minimum effect.
-
-  // With NACK we don't count old packets as received since they are
-  // re-transmitted. We use RTT to decide if a packet is re-ordered or
-  // re-transmitted.
-  uint32_t retransmitted_packets =
-      receive_counters_.retransmitted.packets - last_report_old_packets_;
-  rec_since_last += retransmitted_packets;
-
-  int32_t missing = 0;
-  if (exp_since_last > rec_since_last) {
-    missing = (exp_since_last - rec_since_last);
-  }
-  uint8_t local_fraction_lost = 0;
-  if (exp_since_last) {
-    // Scale 0 to 255, where 255 is 100% loss.
-    local_fraction_lost =
-        static_cast<uint8_t>(255 * missing / exp_since_last);
-  }
-  stats.fraction_lost = local_fraction_lost;
-
-  // We need a counter for cumulative loss too.
-  // TODO(danilchap): Ensure cumulative loss is below maximum value of 2^24.
-  cumulative_loss_ += missing;
-  stats.packets_lost = cumulative_loss_;
-  stats.extended_highest_sequence_number =
-      (received_seq_wraps_ << 16) + received_seq_max_;
-  // Note: internal jitter value is in Q4 and needs to be scaled by 1/16.
-  stats.jitter = jitter_q4_ >> 4;
-
-  // Store this report.
-  last_reported_statistics_ = stats;
-
-  // Only for report blocks in RTCP SR and RR.
-  last_report_inorder_packets_ =
-      receive_counters_.transmitted.packets -
-      receive_counters_.retransmitted.packets;
-  last_report_old_packets_ = receive_counters_.retransmitted.packets;
-  last_report_seq_max_ = received_seq_max_;
-  BWE_TEST_LOGGING_PLOT_WITH_SSRC(1, "cumulative_loss_pkts",
-                                  clock_->TimeInMilliseconds(),
-                                  cumulative_loss_, ssrc_);
-  BWE_TEST_LOGGING_PLOT_WITH_SSRC(
-      1, "received_seq_max_pkts", clock_->TimeInMilliseconds(),
-      (received_seq_max_ - received_seq_first_), ssrc_);
-
-  return stats;
-}
-
-void StreamStatisticianImpl::GetDataCounters(
-    size_t* bytes_received, uint32_t* packets_received) const {
-  rtc::CritScope cs(&stream_lock_);
-  if (bytes_received) {
-    *bytes_received = receive_counters_.transmitted.payload_bytes +
-                      receive_counters_.transmitted.header_bytes +
-                      receive_counters_.transmitted.padding_bytes;
-  }
-  if (packets_received) {
-    *packets_received = receive_counters_.transmitted.packets;
-  }
-}
-
-void StreamStatisticianImpl::GetReceiveStreamDataCounters(
-    StreamDataCounters* data_counters) const {
-  rtc::CritScope cs(&stream_lock_);
-  *data_counters = receive_counters_;
-}
-
-uint32_t StreamStatisticianImpl::BitrateReceived() const {
-  rtc::CritScope cs(&stream_lock_);
-  return incoming_bitrate_.Rate(clock_->TimeInMilliseconds()).value_or(0);
-}
-
-void StreamStatisticianImpl::LastReceiveTimeNtp(uint32_t* secs,
-                                                uint32_t* frac) const {
-  rtc::CritScope cs(&stream_lock_);
-  *secs = last_receive_time_ntp_.seconds();
-  *frac = last_receive_time_ntp_.fractions();
-}
-
-bool StreamStatisticianImpl::IsRetransmitOfOldPacket(
-    const RTPHeader& header, int64_t min_rtt) const {
-  rtc::CritScope cs(&stream_lock_);
-  if (InOrderPacketInternal(header.sequenceNumber)) {
-    return false;
-  }
-  uint32_t frequency_khz = header.payload_type_frequency / 1000;
-  assert(frequency_khz > 0);
-
-  int64_t time_diff_ms = clock_->TimeInMilliseconds() -
-      last_receive_time_ms_;
-
-  // Diff in time stamp since last received in order.
-  uint32_t timestamp_diff = header.timestamp - last_received_timestamp_;
-  uint32_t rtp_time_stamp_diff_ms = timestamp_diff / frequency_khz;
-
-  int64_t max_delay_ms = 0;
-  if (min_rtt == 0) {
-    // Jitter standard deviation in samples.
-    float jitter_std = sqrt(static_cast<float>(jitter_q4_ >> 4));
-
-    // 2 times the standard deviation => 95% confidence.
-    // And transform to milliseconds by dividing by the frequency in kHz.
-    max_delay_ms = static_cast<int64_t>((2 * jitter_std) / frequency_khz);
-
-    // Min max_delay_ms is 1.
-    if (max_delay_ms == 0) {
-      max_delay_ms = 1;
-    }
-  } else {
-    max_delay_ms = (min_rtt / 3) + 1;
-  }
-  return time_diff_ms > rtp_time_stamp_diff_ms + max_delay_ms;
-}
-
-bool StreamStatisticianImpl::IsPacketInOrder(uint16_t sequence_number) const {
-  rtc::CritScope cs(&stream_lock_);
-  return InOrderPacketInternal(sequence_number);
-}
-
-bool StreamStatisticianImpl::InOrderPacketInternal(
-    uint16_t sequence_number) const {
-  // First packet is always in order.
-  if (last_receive_time_ms_ == 0)
-    return true;
-
-  if (IsNewerSequenceNumber(sequence_number, received_seq_max_)) {
-    return true;
-  } else {
-    // If we have a restart of the remote side this packet is still in order.
-    return !IsNewerSequenceNumber(sequence_number, received_seq_max_ -
-                                  max_reordering_threshold_);
-  }
-}
-
-ReceiveStatistics* ReceiveStatistics::Create(Clock* clock) {
-  return new ReceiveStatisticsImpl(clock);
-}
-
-ReceiveStatisticsImpl::ReceiveStatisticsImpl(Clock* clock)
-    : clock_(clock),
-      rtcp_stats_callback_(NULL),
-      rtp_stats_callback_(NULL) {}
-
-ReceiveStatisticsImpl::~ReceiveStatisticsImpl() {
-  while (!statisticians_.empty()) {
-    delete statisticians_.begin()->second;
-    statisticians_.erase(statisticians_.begin());
-  }
-}
-
-void ReceiveStatisticsImpl::IncomingPacket(const RTPHeader& header,
-                                           size_t packet_length,
-                                           bool retransmitted) {
-  StreamStatisticianImpl* impl;
-  {
-    rtc::CritScope cs(&receive_statistics_lock_);
-    StatisticianImplMap::iterator it = statisticians_.find(header.ssrc);
-    if (it != statisticians_.end()) {
-      impl = it->second;
-    } else {
-      impl = new StreamStatisticianImpl(header.ssrc, clock_, this, this);
-      statisticians_[header.ssrc] = impl;
-    }
-  }
-  // StreamStatisticianImpl instance is created once and only destroyed when
-  // this whole ReceiveStatisticsImpl is destroyed. StreamStatisticianImpl has
-  // it's own locking so don't hold receive_statistics_lock_ (potential
-  // deadlock).
-  impl->IncomingPacket(header, packet_length, retransmitted);
-}
-
-void ReceiveStatisticsImpl::FecPacketReceived(const RTPHeader& header,
-                                              size_t packet_length) {
-  StreamStatisticianImpl* impl;
-  {
-    rtc::CritScope cs(&receive_statistics_lock_);
-    StatisticianImplMap::iterator it = statisticians_.find(header.ssrc);
-    // Ignore FEC if it is the first packet.
-    if (it == statisticians_.end())
-      return;
-    impl = it->second;
-  }
-  impl->FecPacketReceived(header, packet_length);
-}
-
-StatisticianMap ReceiveStatisticsImpl::GetActiveStatisticians() const {
-  StatisticianMap active_statisticians;
-  rtc::CritScope cs(&receive_statistics_lock_);
-  for (StatisticianImplMap::const_iterator it = statisticians_.begin();
-       it != statisticians_.end(); ++it) {
-    uint32_t secs;
-    uint32_t frac;
-    it->second->LastReceiveTimeNtp(&secs, &frac);
-    if (clock_->CurrentNtpInMilliseconds() -
-        Clock::NtpToMs(secs, frac) < kStatisticsTimeoutMs) {
-      active_statisticians[it->first] = it->second;
-    }
-  }
-  return active_statisticians;
-}
-
-StreamStatistician* ReceiveStatisticsImpl::GetStatistician(
-    uint32_t ssrc) const {
-  rtc::CritScope cs(&receive_statistics_lock_);
-  StatisticianImplMap::const_iterator it = statisticians_.find(ssrc);
-  if (it == statisticians_.end())
-    return NULL;
-  return it->second;
-}
-
-void ReceiveStatisticsImpl::SetMaxReorderingThreshold(
-    int max_reordering_threshold) {
-  rtc::CritScope cs(&receive_statistics_lock_);
-  for (StatisticianImplMap::iterator it = statisticians_.begin();
-       it != statisticians_.end(); ++it) {
-    it->second->SetMaxReorderingThreshold(max_reordering_threshold);
-  }
-}
-
-void ReceiveStatisticsImpl::RegisterRtcpStatisticsCallback(
-    RtcpStatisticsCallback* callback) {
-  rtc::CritScope cs(&receive_statistics_lock_);
-  if (callback != NULL)
-    assert(rtcp_stats_callback_ == NULL);
-  rtcp_stats_callback_ = callback;
-}
-
-void ReceiveStatisticsImpl::StatisticsUpdated(const RtcpStatistics& statistics,
-                                              uint32_t ssrc) {
-  rtc::CritScope cs(&receive_statistics_lock_);
-  if (rtcp_stats_callback_)
-    rtcp_stats_callback_->StatisticsUpdated(statistics, ssrc);
-}
-
-void ReceiveStatisticsImpl::CNameChanged(const char* cname, uint32_t ssrc) {
-  rtc::CritScope cs(&receive_statistics_lock_);
-  if (rtcp_stats_callback_)
-    rtcp_stats_callback_->CNameChanged(cname, ssrc);
-}
-
-void ReceiveStatisticsImpl::RegisterRtpStatisticsCallback(
-    StreamDataCountersCallback* callback) {
-  rtc::CritScope cs(&receive_statistics_lock_);
-  if (callback != NULL)
-    assert(rtp_stats_callback_ == NULL);
-  rtp_stats_callback_ = callback;
-}
-
-void ReceiveStatisticsImpl::DataCountersUpdated(const StreamDataCounters& stats,
-                                                uint32_t ssrc) {
-  rtc::CritScope cs(&receive_statistics_lock_);
-  if (rtp_stats_callback_) {
-    rtp_stats_callback_->DataCountersUpdated(stats, ssrc);
-  }
-}
-
-std::vector<rtcp::ReportBlock> ReceiveStatisticsImpl::RtcpReportBlocks(
-    size_t max_blocks) {
-  StatisticianMap statisticians = GetActiveStatisticians();
-  std::vector<rtcp::ReportBlock> result;
-  result.reserve(std::min(max_blocks, statisticians.size()));
-  for (auto& statistician : statisticians) {
-    // TODO(danilchap): Select statistician subset across multiple calls using
-    // round-robin, as described in rfc3550 section 6.4 when single
-    // rtcp_module/receive_statistics will be used for more rtp streams.
-    if (result.size() == max_blocks)
-      break;
-
-    // Do we have receive statistics to send?
-    RtcpStatistics stats;
-    if (!statistician.second->GetStatistics(&stats, true))
-      continue;
-    result.emplace_back();
-    rtcp::ReportBlock& block = result.back();
-    block.SetMediaSsrc(statistician.first);
-    block.SetFractionLost(stats.fraction_lost);
-    if (!block.SetCumulativeLost(stats.packets_lost)) {
-      LOG(LS_WARNING) << "Cumulative lost is oversized.";
-      result.pop_back();
-      continue;
-    }
-    block.SetExtHighestSeqNum(stats.extended_highest_sequence_number);
-    block.SetJitter(stats.jitter);
-  }
-  return result;
-}
-
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/receive_statistics_impl.h b/modules/rtp_rtcp/source/receive_statistics_impl.h
deleted file mode 100644
index b80a91a..0000000
--- a/modules/rtp_rtcp/source/receive_statistics_impl.h
+++ /dev/null
@@ -1,138 +0,0 @@
-/*
- *  Copyright (c) 2013 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_RTP_RTCP_SOURCE_RECEIVE_STATISTICS_IMPL_H_
-#define WEBRTC_MODULES_RTP_RTCP_SOURCE_RECEIVE_STATISTICS_IMPL_H_
-
-#include "webrtc/modules/rtp_rtcp/include/receive_statistics.h"
-
-#include <algorithm>
-#include <map>
-#include <vector>
-
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/rate_statistics.h"
-#include "webrtc/system_wrappers/include/ntp_time.h"
-
-namespace webrtc {
-
-class StreamStatisticianImpl : public StreamStatistician {
- public:
-  StreamStatisticianImpl(uint32_t ssrc,
-                         Clock* clock,
-                         RtcpStatisticsCallback* rtcp_callback,
-                         StreamDataCountersCallback* rtp_callback);
-  virtual ~StreamStatisticianImpl() {}
-
-  bool GetStatistics(RtcpStatistics* statistics, bool reset) override;
-  void GetDataCounters(size_t* bytes_received,
-                       uint32_t* packets_received) const override;
-  void GetReceiveStreamDataCounters(
-      StreamDataCounters* data_counters) const override;
-  uint32_t BitrateReceived() const override;
-  bool IsRetransmitOfOldPacket(const RTPHeader& header,
-                               int64_t min_rtt) const override;
-  bool IsPacketInOrder(uint16_t sequence_number) const override;
-
-  void IncomingPacket(const RTPHeader& rtp_header,
-                      size_t packet_length,
-                      bool retransmitted);
-  void FecPacketReceived(const RTPHeader& header, size_t packet_length);
-  void SetMaxReorderingThreshold(int max_reordering_threshold);
-  virtual void LastReceiveTimeNtp(uint32_t* secs, uint32_t* frac) const;
-
- private:
-  bool InOrderPacketInternal(uint16_t sequence_number) const;
-  RtcpStatistics CalculateRtcpStatistics()
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(stream_lock_);
-  void UpdateJitter(const RTPHeader& header, NtpTime receive_time);
-  StreamDataCounters UpdateCounters(const RTPHeader& rtp_header,
-                                    size_t packet_length,
-                                    bool retransmitted);
-
-  const uint32_t ssrc_;
-  Clock* const clock_;
-  rtc::CriticalSection stream_lock_;
-  RateStatistics incoming_bitrate_;
-  int max_reordering_threshold_;  // In number of packets or sequence numbers.
-
-  // Stats on received RTP packets.
-  uint32_t jitter_q4_;
-  uint32_t cumulative_loss_;
-  uint32_t jitter_q4_transmission_time_offset_;
-
-  int64_t last_receive_time_ms_;
-  NtpTime last_receive_time_ntp_;
-  uint32_t last_received_timestamp_;
-  int32_t last_received_transmission_time_offset_;
-  uint16_t received_seq_first_;
-  uint16_t received_seq_max_;
-  uint16_t received_seq_wraps_;
-
-  // Current counter values.
-  size_t received_packet_overhead_;
-  StreamDataCounters receive_counters_;
-
-  // Counter values when we sent the last report.
-  uint32_t last_report_inorder_packets_;
-  uint32_t last_report_old_packets_;
-  uint16_t last_report_seq_max_;
-  RtcpStatistics last_reported_statistics_;
-
-  // stream_lock_ shouldn't be held when calling callbacks.
-  RtcpStatisticsCallback* const rtcp_callback_;
-  StreamDataCountersCallback* const rtp_callback_;
-};
-
-class ReceiveStatisticsImpl : public ReceiveStatistics,
-                              public RtcpStatisticsCallback,
-                              public StreamDataCountersCallback {
- public:
-  explicit ReceiveStatisticsImpl(Clock* clock);
-
-  ~ReceiveStatisticsImpl();
-
-  // Implement ReceiveStatisticsProvider.
-  std::vector<rtcp::ReportBlock> RtcpReportBlocks(size_t max_blocks) override;
-
-  // Implement ReceiveStatistics.
-  void IncomingPacket(const RTPHeader& header,
-                      size_t packet_length,
-                      bool retransmitted) override;
-  void FecPacketReceived(const RTPHeader& header,
-                         size_t packet_length) override;
-  StatisticianMap GetActiveStatisticians() const override;
-  StreamStatistician* GetStatistician(uint32_t ssrc) const override;
-  void SetMaxReorderingThreshold(int max_reordering_threshold) override;
-
-  void RegisterRtcpStatisticsCallback(
-      RtcpStatisticsCallback* callback) override;
-
-  void RegisterRtpStatisticsCallback(
-      StreamDataCountersCallback* callback) override;
-
- private:
-  void StatisticsUpdated(const RtcpStatistics& statistics,
-                         uint32_t ssrc) override;
-  void CNameChanged(const char* cname, uint32_t ssrc) override;
-  void DataCountersUpdated(const StreamDataCounters& counters,
-                           uint32_t ssrc) override;
-
-  typedef std::map<uint32_t, StreamStatisticianImpl*> StatisticianImplMap;
-
-  Clock* const clock_;
-  rtc::CriticalSection receive_statistics_lock_;
-  StatisticianImplMap statisticians_;
-
-  RtcpStatisticsCallback* rtcp_stats_callback_;
-  StreamDataCountersCallback* rtp_stats_callback_;
-};
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_RTP_RTCP_SOURCE_RECEIVE_STATISTICS_IMPL_H_
diff --git a/modules/rtp_rtcp/source/receive_statistics_unittest.cc b/modules/rtp_rtcp/source/receive_statistics_unittest.cc
deleted file mode 100644
index 4264ac4..0000000
--- a/modules/rtp_rtcp/source/receive_statistics_unittest.cc
+++ /dev/null
@@ -1,382 +0,0 @@
-/*
- *  Copyright (c) 2013 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 <memory>
-
-#include "webrtc/modules/rtp_rtcp/include/receive_statistics.h"
-#include "webrtc/system_wrappers/include/clock.h"
-#include "webrtc/test/gmock.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-const size_t kPacketSize1 = 100;
-const size_t kPacketSize2 = 300;
-const uint32_t kSsrc1 = 1;
-const uint32_t kSsrc2 = 2;
-
-class ReceiveStatisticsTest : public ::testing::Test {
- public:
-  ReceiveStatisticsTest() :
-      clock_(0),
-      receive_statistics_(ReceiveStatistics::Create(&clock_)) {
-    memset(&header1_, 0, sizeof(header1_));
-    header1_.ssrc = kSsrc1;
-    header1_.sequenceNumber = 100;
-    memset(&header2_, 0, sizeof(header2_));
-    header2_.ssrc = kSsrc2;
-    header2_.sequenceNumber = 100;
-  }
-
- protected:
-  SimulatedClock clock_;
-  std::unique_ptr<ReceiveStatistics> receive_statistics_;
-  RTPHeader header1_;
-  RTPHeader header2_;
-};
-
-TEST_F(ReceiveStatisticsTest, TwoIncomingSsrcs) {
-  receive_statistics_->IncomingPacket(header1_, kPacketSize1, false);
-  ++header1_.sequenceNumber;
-  receive_statistics_->IncomingPacket(header2_, kPacketSize2, false);
-  ++header2_.sequenceNumber;
-  clock_.AdvanceTimeMilliseconds(100);
-  receive_statistics_->IncomingPacket(header1_, kPacketSize1, false);
-  ++header1_.sequenceNumber;
-  receive_statistics_->IncomingPacket(header2_, kPacketSize2, false);
-  ++header2_.sequenceNumber;
-
-  StreamStatistician* statistician =
-      receive_statistics_->GetStatistician(kSsrc1);
-  ASSERT_TRUE(statistician != NULL);
-  EXPECT_GT(statistician->BitrateReceived(), 0u);
-  size_t bytes_received = 0;
-  uint32_t packets_received = 0;
-  statistician->GetDataCounters(&bytes_received, &packets_received);
-  EXPECT_EQ(200u, bytes_received);
-  EXPECT_EQ(2u, packets_received);
-
-  statistician =
-      receive_statistics_->GetStatistician(kSsrc2);
-  ASSERT_TRUE(statistician != NULL);
-  EXPECT_GT(statistician->BitrateReceived(), 0u);
-  statistician->GetDataCounters(&bytes_received, &packets_received);
-  EXPECT_EQ(600u, bytes_received);
-  EXPECT_EQ(2u, packets_received);
-
-  StatisticianMap statisticians = receive_statistics_->GetActiveStatisticians();
-  EXPECT_EQ(2u, statisticians.size());
-  // Add more incoming packets and verify that they are registered in both
-  // access methods.
-  receive_statistics_->IncomingPacket(header1_, kPacketSize1, false);
-  ++header1_.sequenceNumber;
-  receive_statistics_->IncomingPacket(header2_, kPacketSize2, false);
-  ++header2_.sequenceNumber;
-
-  statisticians[kSsrc1]->GetDataCounters(&bytes_received, &packets_received);
-  EXPECT_EQ(300u, bytes_received);
-  EXPECT_EQ(3u, packets_received);
-  statisticians[kSsrc2]->GetDataCounters(&bytes_received, &packets_received);
-  EXPECT_EQ(900u, bytes_received);
-  EXPECT_EQ(3u, packets_received);
-
-  receive_statistics_->GetStatistician(kSsrc1)->GetDataCounters(
-      &bytes_received, &packets_received);
-  EXPECT_EQ(300u, bytes_received);
-  EXPECT_EQ(3u, packets_received);
-  receive_statistics_->GetStatistician(kSsrc2)->GetDataCounters(
-      &bytes_received, &packets_received);
-  EXPECT_EQ(900u, bytes_received);
-  EXPECT_EQ(3u, packets_received);
-}
-
-TEST_F(ReceiveStatisticsTest, ActiveStatisticians) {
-  receive_statistics_->IncomingPacket(header1_, kPacketSize1, false);
-  ++header1_.sequenceNumber;
-  clock_.AdvanceTimeMilliseconds(1000);
-  receive_statistics_->IncomingPacket(header2_, kPacketSize2, false);
-  ++header2_.sequenceNumber;
-  StatisticianMap statisticians = receive_statistics_->GetActiveStatisticians();
-  // Nothing should time out since only 1000 ms has passed since the first
-  // packet came in.
-  EXPECT_EQ(2u, statisticians.size());
-
-  clock_.AdvanceTimeMilliseconds(7000);
-  // kSsrc1 should have timed out.
-  statisticians = receive_statistics_->GetActiveStatisticians();
-  EXPECT_EQ(1u, statisticians.size());
-
-  clock_.AdvanceTimeMilliseconds(1000);
-  // kSsrc2 should have timed out.
-  statisticians = receive_statistics_->GetActiveStatisticians();
-  EXPECT_EQ(0u, statisticians.size());
-
-  receive_statistics_->IncomingPacket(header1_, kPacketSize1, false);
-  ++header1_.sequenceNumber;
-  // kSsrc1 should be active again and the data counters should have survived.
-  statisticians = receive_statistics_->GetActiveStatisticians();
-  EXPECT_EQ(1u, statisticians.size());
-  StreamStatistician* statistician =
-      receive_statistics_->GetStatistician(kSsrc1);
-  ASSERT_TRUE(statistician != NULL);
-  size_t bytes_received = 0;
-  uint32_t packets_received = 0;
-  statistician->GetDataCounters(&bytes_received, &packets_received);
-  EXPECT_EQ(200u, bytes_received);
-  EXPECT_EQ(2u, packets_received);
-}
-
-TEST_F(ReceiveStatisticsTest, GetReceiveStreamDataCounters) {
-  receive_statistics_->IncomingPacket(header1_, kPacketSize1, false);
-  StreamStatistician* statistician =
-      receive_statistics_->GetStatistician(kSsrc1);
-  ASSERT_TRUE(statistician != NULL);
-
-  StreamDataCounters counters;
-  statistician->GetReceiveStreamDataCounters(&counters);
-  EXPECT_GT(counters.first_packet_time_ms, -1);
-  EXPECT_EQ(1u, counters.transmitted.packets);
-
-  receive_statistics_->IncomingPacket(header1_, kPacketSize1, false);
-  statistician->GetReceiveStreamDataCounters(&counters);
-  EXPECT_GT(counters.first_packet_time_ms, -1);
-  EXPECT_EQ(2u, counters.transmitted.packets);
-}
-
-TEST_F(ReceiveStatisticsTest, RtcpCallbacks) {
-  class TestCallback : public RtcpStatisticsCallback {
-   public:
-    TestCallback()
-        : RtcpStatisticsCallback(), num_calls_(0), ssrc_(0), stats_() {}
-    virtual ~TestCallback() {}
-
-    void StatisticsUpdated(const RtcpStatistics& statistics,
-                           uint32_t ssrc) override {
-      ssrc_ = ssrc;
-      stats_ = statistics;
-      ++num_calls_;
-    }
-
-    void CNameChanged(const char* cname, uint32_t ssrc) override {}
-
-    uint32_t num_calls_;
-    uint32_t ssrc_;
-    RtcpStatistics stats_;
-  } callback;
-
-  receive_statistics_->RegisterRtcpStatisticsCallback(&callback);
-
-  // Add some arbitrary data, with loss and jitter.
-  header1_.sequenceNumber = 1;
-  clock_.AdvanceTimeMilliseconds(7);
-  header1_.timestamp += 3;
-  receive_statistics_->IncomingPacket(header1_, kPacketSize1, false);
-  header1_.sequenceNumber += 2;
-  clock_.AdvanceTimeMilliseconds(9);
-  header1_.timestamp += 9;
-  receive_statistics_->IncomingPacket(header1_, kPacketSize1, false);
-  --header1_.sequenceNumber;
-  clock_.AdvanceTimeMilliseconds(13);
-  header1_.timestamp += 47;
-  receive_statistics_->IncomingPacket(header1_, kPacketSize1, true);
-  header1_.sequenceNumber += 3;
-  clock_.AdvanceTimeMilliseconds(11);
-  header1_.timestamp += 17;
-  receive_statistics_->IncomingPacket(header1_, kPacketSize1, false);
-  ++header1_.sequenceNumber;
-
-  EXPECT_EQ(0u, callback.num_calls_);
-
-  // Call GetStatistics, simulating a timed rtcp sender thread.
-  RtcpStatistics statistics;
-  receive_statistics_->GetStatistician(kSsrc1)
-      ->GetStatistics(&statistics, true);
-
-  EXPECT_EQ(1u, callback.num_calls_);
-  EXPECT_EQ(callback.ssrc_, kSsrc1);
-  EXPECT_EQ(statistics.packets_lost, callback.stats_.packets_lost);
-  EXPECT_EQ(statistics.extended_highest_sequence_number,
-            callback.stats_.extended_highest_sequence_number);
-  EXPECT_EQ(statistics.fraction_lost, callback.stats_.fraction_lost);
-  EXPECT_EQ(statistics.jitter, callback.stats_.jitter);
-  EXPECT_EQ(51, statistics.fraction_lost);
-  EXPECT_EQ(1u, statistics.packets_lost);
-  EXPECT_EQ(5u, statistics.extended_highest_sequence_number);
-  EXPECT_EQ(4u, statistics.jitter);
-
-  receive_statistics_->RegisterRtcpStatisticsCallback(NULL);
-
-  // Add some more data.
-  header1_.sequenceNumber = 1;
-  clock_.AdvanceTimeMilliseconds(7);
-  header1_.timestamp += 3;
-  receive_statistics_->IncomingPacket(header1_, kPacketSize1, false);
-  header1_.sequenceNumber += 2;
-  clock_.AdvanceTimeMilliseconds(9);
-  header1_.timestamp += 9;
-  receive_statistics_->IncomingPacket(header1_, kPacketSize1, false);
-  --header1_.sequenceNumber;
-  clock_.AdvanceTimeMilliseconds(13);
-  header1_.timestamp += 47;
-  receive_statistics_->IncomingPacket(header1_, kPacketSize1, true);
-  header1_.sequenceNumber += 3;
-  clock_.AdvanceTimeMilliseconds(11);
-  header1_.timestamp += 17;
-  receive_statistics_->IncomingPacket(header1_, kPacketSize1, false);
-  ++header1_.sequenceNumber;
-
-  receive_statistics_->GetStatistician(kSsrc1)
-      ->GetStatistics(&statistics, true);
-
-  // Should not have been called after deregister.
-  EXPECT_EQ(1u, callback.num_calls_);
-}
-
-class RtpTestCallback : public StreamDataCountersCallback {
- public:
-  RtpTestCallback()
-      : StreamDataCountersCallback(), num_calls_(0), ssrc_(0), stats_() {}
-  virtual ~RtpTestCallback() {}
-
-  virtual void DataCountersUpdated(const StreamDataCounters& counters,
-                                   uint32_t ssrc) {
-    ssrc_ = ssrc;
-    stats_ = counters;
-    ++num_calls_;
-  }
-
-  void MatchPacketCounter(const RtpPacketCounter& expected,
-                          const RtpPacketCounter& actual) {
-    EXPECT_EQ(expected.payload_bytes, actual.payload_bytes);
-    EXPECT_EQ(expected.header_bytes, actual.header_bytes);
-    EXPECT_EQ(expected.padding_bytes, actual.padding_bytes);
-    EXPECT_EQ(expected.packets, actual.packets);
-  }
-
-  void Matches(uint32_t num_calls,
-               uint32_t ssrc,
-               const StreamDataCounters& expected) {
-    EXPECT_EQ(num_calls, num_calls_);
-    EXPECT_EQ(ssrc, ssrc_);
-    MatchPacketCounter(expected.transmitted, stats_.transmitted);
-    MatchPacketCounter(expected.retransmitted, stats_.retransmitted);
-    MatchPacketCounter(expected.fec, stats_.fec);
-  }
-
-  uint32_t num_calls_;
-  uint32_t ssrc_;
-  StreamDataCounters stats_;
-};
-
-TEST_F(ReceiveStatisticsTest, RtpCallbacks) {
-  RtpTestCallback callback;
-  receive_statistics_->RegisterRtpStatisticsCallback(&callback);
-
-  const size_t kHeaderLength = 20;
-  const size_t kPaddingLength = 9;
-
-  // One packet of size kPacketSize1.
-  header1_.headerLength = kHeaderLength;
-  receive_statistics_->IncomingPacket(
-      header1_, kPacketSize1 + kHeaderLength, false);
-  StreamDataCounters expected;
-  expected.transmitted.payload_bytes = kPacketSize1;
-  expected.transmitted.header_bytes = kHeaderLength;
-  expected.transmitted.padding_bytes = 0;
-  expected.transmitted.packets = 1;
-  expected.retransmitted.payload_bytes = 0;
-  expected.retransmitted.header_bytes = 0;
-  expected.retransmitted.padding_bytes = 0;
-  expected.retransmitted.packets = 0;
-  expected.fec.packets = 0;
-  callback.Matches(1, kSsrc1, expected);
-
-  ++header1_.sequenceNumber;
-  clock_.AdvanceTimeMilliseconds(5);
-  header1_.paddingLength = 9;
-  // Another packet of size kPacketSize1 with 9 bytes padding.
-  receive_statistics_->IncomingPacket(
-      header1_, kPacketSize1 + kHeaderLength + kPaddingLength, false);
-  expected.transmitted.payload_bytes = kPacketSize1 * 2;
-  expected.transmitted.header_bytes = kHeaderLength * 2;
-  expected.transmitted.padding_bytes = kPaddingLength;
-  expected.transmitted.packets = 2;
-  callback.Matches(2, kSsrc1, expected);
-
-  clock_.AdvanceTimeMilliseconds(5);
-  // Retransmit last packet.
-  receive_statistics_->IncomingPacket(
-      header1_, kPacketSize1 + kHeaderLength + kPaddingLength, true);
-  expected.transmitted.payload_bytes = kPacketSize1 * 3;
-  expected.transmitted.header_bytes = kHeaderLength * 3;
-  expected.transmitted.padding_bytes = kPaddingLength * 2;
-  expected.transmitted.packets = 3;
-  expected.retransmitted.payload_bytes = kPacketSize1;
-  expected.retransmitted.header_bytes = kHeaderLength;
-  expected.retransmitted.padding_bytes = kPaddingLength;
-  expected.retransmitted.packets = 1;
-  callback.Matches(3, kSsrc1, expected);
-
-  header1_.paddingLength = 0;
-  ++header1_.sequenceNumber;
-  clock_.AdvanceTimeMilliseconds(5);
-  // One FEC packet.
-  receive_statistics_->IncomingPacket(
-      header1_, kPacketSize1 + kHeaderLength, false);
-  receive_statistics_->FecPacketReceived(header1_,
-                                         kPacketSize1 + kHeaderLength);
-  expected.transmitted.payload_bytes = kPacketSize1 * 4;
-  expected.transmitted.header_bytes = kHeaderLength * 4;
-  expected.transmitted.packets = 4;
-  expected.fec.payload_bytes = kPacketSize1;
-  expected.fec.header_bytes = kHeaderLength;
-  expected.fec.packets = 1;
-  callback.Matches(5, kSsrc1, expected);
-
-  receive_statistics_->RegisterRtpStatisticsCallback(NULL);
-
-  // New stats, but callback should not be called.
-  ++header1_.sequenceNumber;
-  clock_.AdvanceTimeMilliseconds(5);
-  receive_statistics_->IncomingPacket(
-      header1_, kPacketSize1 + kHeaderLength, true);
-  callback.Matches(5, kSsrc1, expected);
-}
-
-TEST_F(ReceiveStatisticsTest, RtpCallbacksFecFirst) {
-  RtpTestCallback callback;
-  receive_statistics_->RegisterRtpStatisticsCallback(&callback);
-
-  const uint32_t kHeaderLength = 20;
-  header1_.headerLength = kHeaderLength;
-
-  // If first packet is FEC, ignore it.
-  receive_statistics_->FecPacketReceived(header1_,
-                                         kPacketSize1 + kHeaderLength);
-  EXPECT_EQ(0u, callback.num_calls_);
-
-  receive_statistics_->IncomingPacket(
-      header1_, kPacketSize1 + kHeaderLength, false);
-  StreamDataCounters expected;
-  expected.transmitted.payload_bytes = kPacketSize1;
-  expected.transmitted.header_bytes = kHeaderLength;
-  expected.transmitted.padding_bytes = 0;
-  expected.transmitted.packets = 1;
-  expected.fec.packets = 0;
-  callback.Matches(1, kSsrc1, expected);
-
-  receive_statistics_->FecPacketReceived(header1_,
-                                         kPacketSize1 + kHeaderLength);
-  expected.fec.payload_bytes = kPacketSize1;
-  expected.fec.header_bytes = kHeaderLength;
-  expected.fec.packets = 1;
-  callback.Matches(2, kSsrc1, expected);
-}
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/remote_ntp_time_estimator.cc b/modules/rtp_rtcp/source/remote_ntp_time_estimator.cc
deleted file mode 100644
index b39c5a6..0000000
--- a/modules/rtp_rtcp/source/remote_ntp_time_estimator.cc
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- *  Copyright (c) 2014 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/rtp_rtcp/include/remote_ntp_time_estimator.h"
-
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/system_wrappers/include/clock.h"
-#include "webrtc/system_wrappers/include/timestamp_extrapolator.h"
-
-namespace webrtc {
-
-static const int kTimingLogIntervalMs = 10000;
-
-// TODO(wu): Refactor this class so that it can be shared with
-// vie_sync_module.cc.
-RemoteNtpTimeEstimator::RemoteNtpTimeEstimator(Clock* clock)
-    : clock_(clock),
-      ts_extrapolator_(new TimestampExtrapolator(clock_->TimeInMilliseconds())),
-      last_timing_log_ms_(-1) {
-}
-
-RemoteNtpTimeEstimator::~RemoteNtpTimeEstimator() {}
-
-bool RemoteNtpTimeEstimator::UpdateRtcpTimestamp(int64_t rtt,
-                                                 uint32_t ntp_secs,
-                                                 uint32_t ntp_frac,
-                                                 uint32_t rtcp_timestamp) {
-  bool new_rtcp_sr = false;
-  if (!rtp_to_ntp_.UpdateMeasurements(ntp_secs, ntp_frac, rtcp_timestamp,
-                                      &new_rtcp_sr)) {
-    return false;
-  }
-  if (!new_rtcp_sr) {
-    // No new RTCP SR since last time this function was called.
-    return true;
-  }
-  // Update extrapolator with the new arrival time.
-  // The extrapolator assumes the TimeInMilliseconds time.
-  int64_t receiver_arrival_time_ms = clock_->TimeInMilliseconds();
-  int64_t sender_send_time_ms = Clock::NtpToMs(ntp_secs, ntp_frac);
-  int64_t sender_arrival_time_90k = (sender_send_time_ms + rtt / 2) * 90;
-  ts_extrapolator_->Update(receiver_arrival_time_ms, sender_arrival_time_90k);
-  return true;
-}
-
-int64_t RemoteNtpTimeEstimator::Estimate(uint32_t rtp_timestamp) {
-  int64_t sender_capture_ntp_ms = 0;
-  if (!rtp_to_ntp_.Estimate(rtp_timestamp, &sender_capture_ntp_ms)) {
-    return -1;
-  }
-  uint32_t timestamp = sender_capture_ntp_ms * 90;
-  int64_t receiver_capture_ms =
-      ts_extrapolator_->ExtrapolateLocalTime(timestamp);
-  int64_t ntp_offset =
-      clock_->CurrentNtpInMilliseconds() - clock_->TimeInMilliseconds();
-  int64_t receiver_capture_ntp_ms = receiver_capture_ms + ntp_offset;
-  int64_t now_ms = clock_->TimeInMilliseconds();
-  if (now_ms - last_timing_log_ms_ > kTimingLogIntervalMs) {
-    LOG(LS_INFO) << "RTP timestamp: " << rtp_timestamp
-                 << " in NTP clock: " << sender_capture_ntp_ms
-                 << " estimated time in receiver clock: " << receiver_capture_ms
-                 << " converted to NTP clock: " << receiver_capture_ntp_ms;
-    last_timing_log_ms_ = now_ms;
-  }
-  return receiver_capture_ntp_ms;
-}
-
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/remote_ntp_time_estimator_unittest.cc b/modules/rtp_rtcp/source/remote_ntp_time_estimator_unittest.cc
deleted file mode 100644
index 1f6ccf1..0000000
--- a/modules/rtp_rtcp/source/remote_ntp_time_estimator_unittest.cc
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
-*  Copyright (c) 2014 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/common_types.h"
-#include "webrtc/modules/rtp_rtcp/include/remote_ntp_time_estimator.h"
-#include "webrtc/system_wrappers/include/clock.h"
-#include "webrtc/test/gmock.h"
-#include "webrtc/test/gtest.h"
-
-using ::testing::_;
-using ::testing::DoAll;
-using ::testing::Return;
-using ::testing::SetArgPointee;
-
-namespace webrtc {
-
-static const int64_t kTestRtt = 10;
-static const int64_t kLocalClockInitialTimeMs = 123;
-static const int64_t kRemoteClockInitialTimeMs = 345;
-static const uint32_t kTimestampOffset = 567;
-
-class RemoteNtpTimeEstimatorTest : public ::testing::Test {
- protected:
-  RemoteNtpTimeEstimatorTest()
-      : local_clock_(kLocalClockInitialTimeMs * 1000),
-        remote_clock_(kRemoteClockInitialTimeMs * 1000),
-        estimator_(&local_clock_) {}
-  ~RemoteNtpTimeEstimatorTest() {}
-
-  void AdvanceTimeMilliseconds(int64_t ms) {
-    local_clock_.AdvanceTimeMilliseconds(ms);
-    remote_clock_.AdvanceTimeMilliseconds(ms);
-  }
-
-  uint32_t GetRemoteTimestamp() {
-    return static_cast<uint32_t>(remote_clock_.TimeInMilliseconds()) * 90 +
-           kTimestampOffset;
-  }
-
-  void SendRtcpSr() {
-    uint32_t rtcp_timestamp = GetRemoteTimestamp();
-    NtpTime ntp = remote_clock_.CurrentNtpTime();
-
-    AdvanceTimeMilliseconds(kTestRtt / 2);
-    ReceiveRtcpSr(kTestRtt, rtcp_timestamp, ntp.seconds(), ntp.fractions());
-  }
-
-  void UpdateRtcpTimestamp(int64_t rtt, uint32_t ntp_secs, uint32_t ntp_frac,
-                           uint32_t rtp_timestamp, bool expected_result) {
-    EXPECT_EQ(expected_result,
-              estimator_.UpdateRtcpTimestamp(rtt, ntp_secs, ntp_frac,
-                                             rtp_timestamp));
-  }
-
-  void ReceiveRtcpSr(int64_t rtt,
-                     uint32_t rtcp_timestamp,
-                     uint32_t ntp_seconds,
-                     uint32_t ntp_fractions) {
-    UpdateRtcpTimestamp(rtt, ntp_seconds, ntp_fractions, rtcp_timestamp, true);
-  }
-
-  SimulatedClock local_clock_;
-  SimulatedClock remote_clock_;
-  RemoteNtpTimeEstimator estimator_;
-};
-
-TEST_F(RemoteNtpTimeEstimatorTest, Estimate) {
-  // Failed without valid NTP.
-  UpdateRtcpTimestamp(kTestRtt, 0, 0, 0, false);
-
-  AdvanceTimeMilliseconds(1000);
-  // Remote peer sends first RTCP SR.
-  SendRtcpSr();
-
-  // Remote sends a RTP packet.
-  AdvanceTimeMilliseconds(15);
-  uint32_t rtp_timestamp = GetRemoteTimestamp();
-  int64_t capture_ntp_time_ms = local_clock_.CurrentNtpInMilliseconds();
-
-  // Local peer needs at least 2 RTCP SR to calculate the capture time.
-  const int64_t kNotEnoughRtcpSr = -1;
-  EXPECT_EQ(kNotEnoughRtcpSr, estimator_.Estimate(rtp_timestamp));
-
-  AdvanceTimeMilliseconds(800);
-  // Remote sends second RTCP SR.
-  SendRtcpSr();
-
-  // Local peer gets enough RTCP SR to calculate the capture time.
-  EXPECT_EQ(capture_ntp_time_ms, estimator_.Estimate(rtp_timestamp));
-}
-
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/rtcp_nack_stats.cc b/modules/rtp_rtcp/source/rtcp_nack_stats.cc
deleted file mode 100644
index 91fdc6e..0000000
--- a/modules/rtp_rtcp/source/rtcp_nack_stats.cc
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- *  Copyright (c) 2017 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/rtp_rtcp/source/rtcp_nack_stats.h"
-
-#include "webrtc/modules/include/module_common_types.h"
-
-namespace webrtc {
-
-RtcpNackStats::RtcpNackStats()
-    : max_sequence_number_(0),
-      requests_(0),
-      unique_requests_(0) {}
-
-void RtcpNackStats::ReportRequest(uint16_t sequence_number) {
-  if (requests_ == 0 ||
-      IsNewerSequenceNumber(sequence_number, max_sequence_number_)) {
-    max_sequence_number_ =  sequence_number;
-    ++unique_requests_;
-  }
-  ++requests_;
-}
-
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/rtcp_nack_stats.h b/modules/rtp_rtcp/source/rtcp_nack_stats.h
deleted file mode 100644
index 72fad6c..0000000
--- a/modules/rtp_rtcp/source/rtcp_nack_stats.h
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
-*  Copyright (c) 2017 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_RTP_RTCP_SOURCE_RTCP_NACK_STATS_H_
-#define WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_NACK_STATS_H_
-
-#include <stdint.h>
-
-namespace webrtc {
-
-class RtcpNackStats {
- public:
-  RtcpNackStats();
-
-  // Updates stats with requested sequence number.
-  // This function should be called for each NACK request to calculate the
-  // number of unique NACKed RTP packets.
-  void ReportRequest(uint16_t sequence_number);
-
-  // Gets the number of NACKed RTP packets.
-  uint32_t requests() const { return requests_; }
-
-  // Gets the number of unique NACKed RTP packets.
-  uint32_t unique_requests() const { return unique_requests_; }
-
- private:
-  uint16_t max_sequence_number_;
-  uint32_t requests_;
-  uint32_t unique_requests_;
-};
-
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_NACK_STATS_H_
diff --git a/modules/rtp_rtcp/source/rtcp_nack_stats_unittest.cc b/modules/rtp_rtcp/source/rtcp_nack_stats_unittest.cc
deleted file mode 100644
index 6583f79..0000000
--- a/modules/rtp_rtcp/source/rtcp_nack_stats_unittest.cc
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- *  Copyright (c) 2017 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/rtp_rtcp/source/rtcp_nack_stats.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-TEST(RtcpNackStatsTest, Requests) {
-  RtcpNackStats stats;
-  EXPECT_EQ(0U, stats.unique_requests());
-  EXPECT_EQ(0U, stats.requests());
-  stats.ReportRequest(10);
-  EXPECT_EQ(1U, stats.unique_requests());
-  EXPECT_EQ(1U, stats.requests());
-
-  stats.ReportRequest(10);
-  EXPECT_EQ(1U, stats.unique_requests());
-  stats.ReportRequest(11);
-  EXPECT_EQ(2U, stats.unique_requests());
-
-  stats.ReportRequest(11);
-  EXPECT_EQ(2U, stats.unique_requests());
-  stats.ReportRequest(13);
-  EXPECT_EQ(3U, stats.unique_requests());
-
-  stats.ReportRequest(11);
-  EXPECT_EQ(3U, stats.unique_requests());
-  EXPECT_EQ(6U, stats.requests());
-}
-
-TEST(RtcpNackStatsTest, RequestsWithWrap) {
-  RtcpNackStats stats;
-  stats.ReportRequest(65534);
-  EXPECT_EQ(1U, stats.unique_requests());
-
-  stats.ReportRequest(65534);
-  EXPECT_EQ(1U, stats.unique_requests());
-  stats.ReportRequest(65535);
-  EXPECT_EQ(2U, stats.unique_requests());
-
-  stats.ReportRequest(65535);
-  EXPECT_EQ(2U, stats.unique_requests());
-  stats.ReportRequest(0);
-  EXPECT_EQ(3U, stats.unique_requests());
-
-  stats.ReportRequest(65535);
-  EXPECT_EQ(3U, stats.unique_requests());
-  stats.ReportRequest(0);
-  EXPECT_EQ(3U, stats.unique_requests());
-  stats.ReportRequest(1);
-  EXPECT_EQ(4U, stats.unique_requests());
-  EXPECT_EQ(8U, stats.requests());
-}
-
-}  // namespace webrtc
-
diff --git a/modules/rtp_rtcp/source/rtcp_packet.cc b/modules/rtp_rtcp/source/rtcp_packet.cc
deleted file mode 100644
index 7d40971..0000000
--- a/modules/rtp_rtcp/source/rtcp_packet.cc
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- *  Copyright (c) 2014 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/rtp_rtcp/source/rtcp_packet.h"
-
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-namespace rtcp {
-constexpr size_t RtcpPacket::kHeaderLength;
-
-rtc::Buffer RtcpPacket::Build() const {
-  rtc::Buffer packet(BlockLength());
-
-  size_t length = 0;
-  bool created = Create(packet.data(), &length, packet.capacity(), nullptr);
-  RTC_DCHECK(created) << "Invalid packet is not supported.";
-  RTC_DCHECK_EQ(length, packet.size())
-      << "BlockLength mispredicted size used by Create";
-
-  return packet;
-}
-
-bool RtcpPacket::BuildExternalBuffer(uint8_t* buffer,
-                                     size_t max_length,
-                                     PacketReadyCallback* callback) const {
-  size_t index = 0;
-  if (!Create(buffer, &index, max_length, callback))
-    return false;
-  return OnBufferFull(buffer, &index, callback);
-}
-
-bool RtcpPacket::OnBufferFull(uint8_t* packet,
-                              size_t* index,
-                              PacketReadyCallback* callback) const {
-  if (*index == 0)
-    return false;
-  RTC_DCHECK(callback) << "Fragmentation not supported.";
-  callback->OnPacketReady(packet, *index);
-  *index = 0;
-  return true;
-}
-
-size_t RtcpPacket::HeaderLength() const {
-  size_t length_in_bytes = BlockLength();
-  RTC_DCHECK_GT(length_in_bytes, 0);
-  RTC_DCHECK_EQ(length_in_bytes % 4, 0) << "Padding not supported";
-  // Length in 32-bit words without common header.
-  return (length_in_bytes - kHeaderLength) / 4;
-}
-
-// From RFC 3550, RTP: A Transport Protocol for Real-Time Applications.
-//
-// RTP header format.
-//   0                   1                   2                   3
-//   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
-//  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//  |V=2|P| RC/FMT  |      PT       |             length            |
-//  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-void RtcpPacket::CreateHeader(
-    uint8_t count_or_format,  // Depends on packet type.
-    uint8_t packet_type,
-    size_t length,
-    uint8_t* buffer,
-    size_t* pos) {
-  RTC_DCHECK_LE(length, 0xffffU);
-  RTC_DCHECK_LE(count_or_format, 0x1f);
-  constexpr uint8_t kVersionBits = 2 << 6;
-  constexpr uint8_t kNoPaddingBit = 0 << 5;
-  buffer[*pos + 0] = kVersionBits | kNoPaddingBit | count_or_format;
-  buffer[*pos + 1] = packet_type;
-  buffer[*pos + 2] = (length >> 8) & 0xff;
-  buffer[*pos + 3] = length & 0xff;
-  *pos += kHeaderLength;
-}
-
-}  // namespace rtcp
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/rtcp_packet.h b/modules/rtp_rtcp/source/rtcp_packet.h
deleted file mode 100644
index f99b5b9..0000000
--- a/modules/rtp_rtcp/source/rtcp_packet.h
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- *  Copyright (c) 2014 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_RTP_RTCP_SOURCE_RTCP_PACKET_H_
-#define WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_PACKET_H_
-
-#include "webrtc/rtc_base/basictypes.h"
-#include "webrtc/rtc_base/buffer.h"
-
-namespace webrtc {
-namespace rtcp {
-// Class for building RTCP packets.
-//
-//  Example:
-//  ReportBlock report_block;
-//  report_block.SetMediaSsrc(234);
-//  report_block.SetFractionLost(10);
-//
-//  ReceiverReport rr;
-//  rr.SetSenderSsrc(123);
-//  rr.AddReportBlock(report_block);
-//
-//  Fir fir;
-//  fir.SetSenderSsrc(123);
-//  fir.AddRequestTo(234, 56);
-//
-//  size_t length = 0;                     // Builds an intra frame request
-//  uint8_t packet[kPacketSize];           // with sequence number 56.
-//  fir.Build(packet, &length, kPacketSize);
-//
-//  rtc::Buffer packet = fir.Build();      // Returns a RawPacket holding
-//                                         // the built rtcp packet.
-//
-//  CompoundPacket compound;               // Builds a compound RTCP packet with
-//  compound.Append(&rr);                  // a receiver report, report block
-//  compound.Append(&fir);                 // and fir message.
-//  rtc::Buffer packet = compound.Build();
-
-class RtcpPacket {
- public:
-  // Callback used to signal that an RTCP packet is ready. Note that this may
-  // not contain all data in this RtcpPacket; if a packet cannot fit in
-  // max_length bytes, it will be fragmented and multiple calls to this
-  // callback will be made.
-  class PacketReadyCallback {
-   public:
-    virtual void OnPacketReady(uint8_t* data, size_t length) = 0;
-
-   protected:
-    PacketReadyCallback() {}
-    virtual ~PacketReadyCallback() {}
-  };
-
-  virtual ~RtcpPacket() {}
-
-  // Convenience method mostly used for test. Creates packet without
-  // fragmentation using BlockLength() to allocate big enough buffer.
-  rtc::Buffer Build() const;
-
-  // Returns true if call to Create succeeded. Provided buffer reference
-  // will be used for all calls to callback.
-  bool BuildExternalBuffer(uint8_t* buffer,
-                           size_t max_length,
-                           PacketReadyCallback* callback) const;
-
-  // Size of this packet in bytes (including headers).
-  virtual size_t BlockLength() const = 0;
-
-  // Creates packet in the given buffer at the given position.
-  // Calls PacketReadyCallback::OnPacketReady if remaining buffer is too small
-  // and assume buffer can be reused after OnPacketReady returns.
-  virtual bool Create(uint8_t* packet,
-                      size_t* index,
-                      size_t max_length,
-                      PacketReadyCallback* callback) const = 0;
-
- protected:
-  // Size of the rtcp common header.
-  static constexpr size_t kHeaderLength = 4;
-  RtcpPacket() {}
-
-  static void CreateHeader(uint8_t count_or_format,
-                           uint8_t packet_type,
-                           size_t block_length,  // Payload size in 32bit words.
-                           uint8_t* buffer,
-                           size_t* pos);
-
-  bool OnBufferFull(uint8_t* packet,
-                    size_t* index,
-                    PacketReadyCallback* callback) const;
-  // Size of the rtcp packet as written in header.
-  size_t HeaderLength() const;
-};
-}  // namespace rtcp
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_PACKET_H_
diff --git a/modules/rtp_rtcp/source/rtcp_packet/app.cc b/modules/rtp_rtcp/source/rtcp_packet/app.cc
deleted file mode 100644
index 8d02dfc..0000000
--- a/modules/rtp_rtcp/source/rtcp_packet/app.cc
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- *  Copyright (c) 2015 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/rtp_rtcp/source/rtcp_packet/app.h"
-
-#include "webrtc/modules/rtp_rtcp/source/byte_io.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/common_header.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-
-namespace webrtc {
-namespace rtcp {
-constexpr uint8_t App::kPacketType;
-constexpr size_t App::kMaxDataSize;
-// Application-Defined packet (APP) (RFC 3550).
-//
-//     0                   1                   2                   3
-//     0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
-//    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//    |V=2|P| subtype |   PT=APP=204  |             length            |
-//    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//  0 |                           SSRC/CSRC                           |
-//    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//  4 |                          name (ASCII)                         |
-//    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//  8 |                   application-dependent data                ...
-//    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-
-App::App() : sub_type_(0), ssrc_(0), name_(0) {}
-
-App::~App() = default;
-
-bool App::Parse(const CommonHeader& packet) {
-  RTC_DCHECK_EQ(packet.type(), kPacketType);
-  if (packet.payload_size_bytes() < kAppBaseLength) {
-    LOG(LS_WARNING) << "Packet is too small to be a valid APP packet";
-    return false;
-  }
-  if (packet.payload_size_bytes() % 4 != 0) {
-    LOG(LS_WARNING)
-        << "Packet payload must be 32 bits aligned to make a valid APP packet";
-    return false;
-  }
-  sub_type_ = packet.fmt();
-  ssrc_ = ByteReader<uint32_t>::ReadBigEndian(&packet.payload()[0]);
-  name_ = ByteReader<uint32_t>::ReadBigEndian(&packet.payload()[4]);
-  data_.SetData(packet.payload() + kAppBaseLength,
-                packet.payload_size_bytes() - kAppBaseLength);
-  return true;
-}
-
-void App::SetSubType(uint8_t subtype) {
-  RTC_DCHECK_LE(subtype, 0x1f);
-  sub_type_ = subtype;
-}
-
-void App::SetData(const uint8_t* data, size_t data_length) {
-  RTC_DCHECK(data);
-  RTC_DCHECK_EQ(data_length % 4, 0) << "Data must be 32 bits aligned.";
-  RTC_DCHECK_LE(data_length, kMaxDataSize) << "App data size " << data_length
-                                           << " exceed maximum of "
-                                           << kMaxDataSize << " bytes.";
-  data_.SetData(data, data_length);
-}
-
-size_t App::BlockLength() const {
-  return kHeaderLength + kAppBaseLength + data_.size();
-}
-
-bool App::Create(uint8_t* packet,
-                 size_t* index,
-                 size_t max_length,
-                 RtcpPacket::PacketReadyCallback* callback) const {
-  while (*index + BlockLength() > max_length) {
-    if (!OnBufferFull(packet, index, callback))
-      return false;
-  }
-  const size_t index_end = *index + BlockLength();
-  CreateHeader(sub_type_, kPacketType, HeaderLength(), packet, index);
-
-  ByteWriter<uint32_t>::WriteBigEndian(&packet[*index + 0], ssrc_);
-  ByteWriter<uint32_t>::WriteBigEndian(&packet[*index + 4], name_);
-  memcpy(&packet[*index + 8], data_.data(), data_.size());
-  *index += (8 + data_.size());
-  RTC_DCHECK_EQ(index_end, *index);
-  return true;
-}
-
-}  // namespace rtcp
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/rtcp_packet/app.h b/modules/rtp_rtcp/source/rtcp_packet/app.h
deleted file mode 100644
index 7368b7c..0000000
--- a/modules/rtp_rtcp/source/rtcp_packet/app.h
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- *  Copyright (c) 2015 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_RTP_RTCP_SOURCE_RTCP_PACKET_APP_H_
-#define WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_PACKET_APP_H_
-
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet.h"
-#include "webrtc/rtc_base/buffer.h"
-
-namespace webrtc {
-namespace rtcp {
-class CommonHeader;
-
-class App : public RtcpPacket {
- public:
-  static constexpr uint8_t kPacketType = 204;
-  App();
-  ~App() override;
-
-  // Parse assumes header is already parsed and validated.
-  bool Parse(const CommonHeader& packet);
-
-  void SetSsrc(uint32_t ssrc) { ssrc_ = ssrc; }
-  void SetSubType(uint8_t subtype);
-  void SetName(uint32_t name) { name_ = name; }
-  void SetData(const uint8_t* data, size_t data_length);
-
-  uint8_t sub_type() const { return sub_type_; }
-  uint32_t ssrc() const { return ssrc_; }
-  uint32_t name() const { return name_; }
-  size_t data_size() const { return data_.size(); }
-  const uint8_t* data() const { return data_.data(); }
-
-  size_t BlockLength() const override;
-
-  bool Create(uint8_t* packet,
-              size_t* index,
-              size_t max_length,
-              RtcpPacket::PacketReadyCallback* callback) const override;
-
- private:
-  static constexpr size_t kAppBaseLength = 8;  // Ssrc and Name.
-  static constexpr size_t kMaxDataSize = 0xffff * 4 - kAppBaseLength;
-
-  uint8_t sub_type_;
-  uint32_t ssrc_;
-  uint32_t name_;
-  rtc::Buffer data_;
-};
-
-}  // namespace rtcp
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_PACKET_APP_H_
diff --git a/modules/rtp_rtcp/source/rtcp_packet/app_unittest.cc b/modules/rtp_rtcp/source/rtcp_packet/app_unittest.cc
deleted file mode 100644
index 91783d0..0000000
--- a/modules/rtp_rtcp/source/rtcp_packet/app_unittest.cc
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- *  Copyright (c) 2015 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/rtp_rtcp/source/rtcp_packet/app.h"
-
-#include "webrtc/test/gmock.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/rtcp_packet_parser.h"
-
-namespace webrtc {
-namespace {
-
-using ::testing::ElementsAreArray;
-using ::testing::make_tuple;
-using ::webrtc::rtcp::App;
-
-constexpr uint32_t kName = ((uint32_t)'n' << 24) | ((uint32_t)'a' << 16) |
-                           ((uint32_t)'m' << 8) | (uint32_t)'e';
-constexpr uint8_t kSubtype = 0x1e;
-constexpr uint32_t kSenderSsrc = 0x12345678;
-constexpr uint8_t kData[] = {'t', 'e', 's', 't', 'd', 'a', 't', 'a'};
-constexpr uint8_t kVersionBits = 2 << 6;
-constexpr uint8_t kPaddingBit = 1 << 5;
-// clang-format off
-constexpr uint8_t kPacketWithoutData[] = {
-    kVersionBits | kSubtype, App::kPacketType, 0x00, 0x02,
-    0x12, 0x34, 0x56, 0x78,
-    'n',  'a',  'm',  'e'};
-constexpr uint8_t kPacketWithData[] = {
-    kVersionBits | kSubtype, App::kPacketType, 0x00, 0x04,
-    0x12, 0x34, 0x56, 0x78,
-    'n',  'a',  'm',  'e',
-    't',  'e',  's',  't',
-    'd',  'a',  't',  'a'};
-constexpr uint8_t kTooSmallPacket[] = {
-    kVersionBits | kSubtype, App::kPacketType, 0x00, 0x01,
-    0x12, 0x34, 0x56, 0x78};
-constexpr uint8_t kPaddingSize = 1;
-constexpr uint8_t kPacketWithUnalignedPayload[] = {
-    kVersionBits | kPaddingBit | kSubtype, App::kPacketType, 0x00, 0x03,
-    0x12, 0x34, 0x56, 0x78,
-     'n',  'a',  'm',  'e',
-     'd',  'a',  't', kPaddingSize};
-// clang-format on
-}  // namespace
-
-TEST(RtcpPacketAppTest, CreateWithoutData) {
-  App app;
-  app.SetSsrc(kSenderSsrc);
-  app.SetSubType(kSubtype);
-  app.SetName(kName);
-
-  rtc::Buffer raw = app.Build();
-
-  EXPECT_THAT(make_tuple(raw.data(), raw.size()),
-              ElementsAreArray(kPacketWithoutData));
-}
-
-TEST(RtcpPacketAppTest, ParseWithoutData) {
-  App parsed;
-  EXPECT_TRUE(test::ParseSinglePacket(kPacketWithoutData, &parsed));
-
-  EXPECT_EQ(kSenderSsrc, parsed.ssrc());
-  EXPECT_EQ(kSubtype, parsed.sub_type());
-  EXPECT_EQ(kName, parsed.name());
-  EXPECT_EQ(0u, parsed.data_size());
-}
-
-TEST(RtcpPacketAppTest, CreateWithData) {
-  App app;
-  app.SetSsrc(kSenderSsrc);
-  app.SetSubType(kSubtype);
-  app.SetName(kName);
-  app.SetData(kData, sizeof(kData));
-
-  rtc::Buffer raw = app.Build();
-
-  EXPECT_THAT(make_tuple(raw.data(), raw.size()),
-              ElementsAreArray(kPacketWithData));
-}
-
-TEST(RtcpPacketAppTest, ParseWithData) {
-  App parsed;
-  EXPECT_TRUE(test::ParseSinglePacket(kPacketWithData, &parsed));
-
-  EXPECT_EQ(kSenderSsrc, parsed.ssrc());
-  EXPECT_EQ(kSubtype, parsed.sub_type());
-  EXPECT_EQ(kName, parsed.name());
-  EXPECT_THAT(make_tuple(parsed.data(), parsed.data_size()),
-              ElementsAreArray(kData));
-}
-
-TEST(RtcpPacketAppTest, ParseFailsOnTooSmallPacket) {
-  App parsed;
-  EXPECT_FALSE(test::ParseSinglePacket(kTooSmallPacket, &parsed));
-}
-
-TEST(RtcpPacketAppTest, ParseFailsOnUnalignedPayload) {
-  App parsed;
-  EXPECT_FALSE(test::ParseSinglePacket(kPacketWithUnalignedPayload, &parsed));
-}
-
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/rtcp_packet/bye.cc b/modules/rtp_rtcp/source/rtcp_packet/bye.cc
deleted file mode 100644
index d5c204d..0000000
--- a/modules/rtp_rtcp/source/rtcp_packet/bye.cc
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
- *  Copyright (c) 2015 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/rtp_rtcp/source/rtcp_packet/bye.h"
-
-#include <utility>
-
-#include "webrtc/modules/rtp_rtcp/source/byte_io.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/common_header.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-
-namespace webrtc {
-namespace rtcp {
-constexpr uint8_t Bye::kPacketType;
-// Bye packet (BYE) (RFC 3550).
-//
-//        0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
-//       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//       |V=2|P|    SC   |   PT=BYE=203  |             length            |
-//       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//       |                           SSRC/CSRC                           |
-//       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//       :                              ...                              :
-//       +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
-// (opt) |     length    |               reason for leaving            ...
-//       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-Bye::Bye() : sender_ssrc_(0) {}
-
-Bye::~Bye() = default;
-
-bool Bye::Parse(const CommonHeader& packet) {
-  RTC_DCHECK_EQ(packet.type(), kPacketType);
-
-  const uint8_t src_count = packet.count();
-  // Validate packet.
-  if (packet.payload_size_bytes() < 4u * src_count) {
-    LOG(LS_WARNING)
-        << "Packet is too small to contain CSRCs it promise to have.";
-    return false;
-  }
-  const uint8_t* const payload = packet.payload();
-  bool has_reason = packet.payload_size_bytes() > 4u * src_count;
-  uint8_t reason_length = 0;
-  if (has_reason) {
-    reason_length = payload[4u * src_count];
-    if (packet.payload_size_bytes() - 4u * src_count < 1u + reason_length) {
-      LOG(LS_WARNING) << "Invalid reason length: " << reason_length;
-      return false;
-    }
-  }
-  // Once sure packet is valid, copy values.
-  if (src_count == 0) {  // A count value of zero is valid, but useless.
-    sender_ssrc_ = 0;
-    csrcs_.clear();
-  } else {
-    sender_ssrc_ = ByteReader<uint32_t>::ReadBigEndian(payload);
-    csrcs_.resize(src_count - 1);
-    for (size_t i = 1; i < src_count; ++i)
-      csrcs_[i - 1] = ByteReader<uint32_t>::ReadBigEndian(&payload[4 * i]);
-  }
-
-  if (has_reason) {
-    reason_.assign(reinterpret_cast<const char*>(&payload[4u * src_count + 1]),
-                   reason_length);
-  } else {
-    reason_.clear();
-  }
-
-  return true;
-}
-
-bool Bye::Create(uint8_t* packet,
-                 size_t* index,
-                 size_t max_length,
-                 RtcpPacket::PacketReadyCallback* callback) const {
-  while (*index + BlockLength() > max_length) {
-    if (!OnBufferFull(packet, index, callback))
-      return false;
-  }
-  const size_t index_end = *index + BlockLength();
-
-  CreateHeader(1 + csrcs_.size(), kPacketType, HeaderLength(), packet, index);
-  // Store srcs of the leaving clients.
-  ByteWriter<uint32_t>::WriteBigEndian(&packet[*index], sender_ssrc_);
-  *index += sizeof(uint32_t);
-  for (uint32_t csrc : csrcs_) {
-    ByteWriter<uint32_t>::WriteBigEndian(&packet[*index], csrc);
-    *index += sizeof(uint32_t);
-  }
-  // Store the reason to leave.
-  if (!reason_.empty()) {
-    uint8_t reason_length = reason_.size();
-    packet[(*index)++] = reason_length;
-    memcpy(&packet[*index], reason_.data(), reason_length);
-    *index += reason_length;
-    // Add padding bytes if needed.
-    size_t bytes_to_pad = index_end - *index;
-    RTC_DCHECK_LE(bytes_to_pad, 3);
-    if (bytes_to_pad > 0) {
-      memset(&packet[*index], 0, bytes_to_pad);
-      *index += bytes_to_pad;
-    }
-  }
-  RTC_DCHECK_EQ(index_end, *index);
-  return true;
-}
-
-bool Bye::SetCsrcs(std::vector<uint32_t> csrcs) {
-  if (csrcs.size() > kMaxNumberOfCsrcs) {
-    LOG(LS_WARNING) << "Too many CSRCs for Bye packet.";
-    return false;
-  }
-  csrcs_ = std::move(csrcs);
-  return true;
-}
-
-void Bye::SetReason(std::string reason) {
-  RTC_DCHECK_LE(reason.size(), 0xffu);
-  reason_ = std::move(reason);
-}
-
-size_t Bye::BlockLength() const {
-  size_t src_count = (1 + csrcs_.size());
-  size_t reason_size_in_32bits = reason_.empty() ? 0 : (reason_.size() / 4 + 1);
-  return kHeaderLength + 4 * (src_count + reason_size_in_32bits);
-}
-
-}  // namespace rtcp
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/rtcp_packet/bye.h b/modules/rtp_rtcp/source/rtcp_packet/bye.h
deleted file mode 100644
index e82f01c..0000000
--- a/modules/rtp_rtcp/source/rtcp_packet/bye.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- *  Copyright (c) 2015 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_RTP_RTCP_SOURCE_RTCP_PACKET_BYE_H_
-#define WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_PACKET_BYE_H_
-
-#include <string>
-#include <vector>
-
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet.h"
-
-namespace webrtc {
-namespace rtcp {
-class CommonHeader;
-
-class Bye : public RtcpPacket {
- public:
-  static constexpr uint8_t kPacketType = 203;
-
-  Bye();
-  ~Bye() override;
-
-  // Parse assumes header is already parsed and validated.
-  bool Parse(const CommonHeader& packet);
-
-  void SetSenderSsrc(uint32_t ssrc) { sender_ssrc_ = ssrc; }
-  bool SetCsrcs(std::vector<uint32_t> csrcs);
-  void SetReason(std::string reason);
-
-  uint32_t sender_ssrc() const { return sender_ssrc_; }
-  const std::vector<uint32_t>& csrcs() const { return csrcs_; }
-  const std::string& reason() const { return reason_; }
-
-  size_t BlockLength() const override;
-
-  bool Create(uint8_t* packet,
-              size_t* index,
-              size_t max_length,
-              RtcpPacket::PacketReadyCallback* callback) const override;
-
- private:
-  static const int kMaxNumberOfCsrcs = 0x1f - 1;  // First item is sender SSRC.
-
-  uint32_t sender_ssrc_;
-  std::vector<uint32_t> csrcs_;
-  std::string reason_;
-};
-
-}  // namespace rtcp
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_PACKET_BYE_H_
diff --git a/modules/rtp_rtcp/source/rtcp_packet/bye_unittest.cc b/modules/rtp_rtcp/source/rtcp_packet/bye_unittest.cc
deleted file mode 100644
index cc97867..0000000
--- a/modules/rtp_rtcp/source/rtcp_packet/bye_unittest.cc
+++ /dev/null
@@ -1,147 +0,0 @@
-/*
- *  Copyright (c) 2015 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/rtp_rtcp/source/rtcp_packet/bye.h"
-
-#include "webrtc/test/gmock.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/rtcp_packet_parser.h"
-
-using testing::ElementsAre;
-using webrtc::rtcp::Bye;
-
-namespace webrtc {
-namespace {
-const uint32_t kSenderSsrc = 0x12345678;
-const uint32_t kCsrc1 = 0x22232425;
-const uint32_t kCsrc2 = 0x33343536;
-}  // namespace
-
-TEST(RtcpPacketByeTest, CreateAndParseWithoutReason) {
-  Bye bye;
-  bye.SetSenderSsrc(kSenderSsrc);
-
-  rtc::Buffer raw = bye.Build();
-  Bye parsed_bye;
-  EXPECT_TRUE(test::ParseSinglePacket(raw, &parsed_bye));
-
-  EXPECT_EQ(kSenderSsrc, parsed_bye.sender_ssrc());
-  EXPECT_TRUE(parsed_bye.csrcs().empty());
-  EXPECT_TRUE(parsed_bye.reason().empty());
-}
-
-TEST(RtcpPacketByeTest, CreateAndParseWithCsrcs) {
-  Bye bye;
-  bye.SetSenderSsrc(kSenderSsrc);
-  EXPECT_TRUE(bye.SetCsrcs({kCsrc1, kCsrc2}));
-  EXPECT_TRUE(bye.reason().empty());
-
-  rtc::Buffer raw = bye.Build();
-  Bye parsed_bye;
-  EXPECT_TRUE(test::ParseSinglePacket(raw, &parsed_bye));
-
-  EXPECT_EQ(kSenderSsrc, parsed_bye.sender_ssrc());
-  EXPECT_THAT(parsed_bye.csrcs(), ElementsAre(kCsrc1, kCsrc2));
-  EXPECT_TRUE(parsed_bye.reason().empty());
-}
-
-TEST(RtcpPacketByeTest, CreateAndParseWithCsrcsAndAReason) {
-  Bye bye;
-  const std::string kReason = "Some Reason";
-
-  bye.SetSenderSsrc(kSenderSsrc);
-  EXPECT_TRUE(bye.SetCsrcs({kCsrc1, kCsrc2}));
-  bye.SetReason(kReason);
-
-  rtc::Buffer raw = bye.Build();
-  Bye parsed_bye;
-  EXPECT_TRUE(test::ParseSinglePacket(raw, &parsed_bye));
-
-  EXPECT_EQ(kSenderSsrc, parsed_bye.sender_ssrc());
-  EXPECT_THAT(parsed_bye.csrcs(), ElementsAre(kCsrc1, kCsrc2));
-  EXPECT_EQ(kReason, parsed_bye.reason());
-}
-
-TEST(RtcpPacketByeTest, CreateWithTooManyCsrcs) {
-  Bye bye;
-  bye.SetSenderSsrc(kSenderSsrc);
-  const int kMaxCsrcs = (1 << 5) - 2;  // 5 bit len, first item is sender SSRC.
-  EXPECT_TRUE(bye.SetCsrcs(std::vector<uint32_t>(kMaxCsrcs, kCsrc1)));
-  EXPECT_FALSE(bye.SetCsrcs(std::vector<uint32_t>(kMaxCsrcs + 1, kCsrc1)));
-}
-
-TEST(RtcpPacketByeTest, CreateAndParseWithAReason) {
-  Bye bye;
-  const std::string kReason = "Some Random Reason";
-
-  bye.SetSenderSsrc(kSenderSsrc);
-  bye.SetReason(kReason);
-
-  rtc::Buffer raw = bye.Build();
-  Bye parsed_bye;
-  EXPECT_TRUE(test::ParseSinglePacket(raw, &parsed_bye));
-
-  EXPECT_EQ(kSenderSsrc, parsed_bye.sender_ssrc());
-  EXPECT_TRUE(parsed_bye.csrcs().empty());
-  EXPECT_EQ(kReason, parsed_bye.reason());
-}
-
-TEST(RtcpPacketByeTest, CreateAndParseWithReasons) {
-  // Test that packet creation/parsing behave with reasons of different length
-  // both when it require padding and when it does not.
-  for (size_t reminder = 0; reminder < 4; ++reminder) {
-    const std::string kReason(4 + reminder, 'a' + reminder);
-    Bye bye;
-    bye.SetSenderSsrc(kSenderSsrc);
-    bye.SetReason(kReason);
-
-    rtc::Buffer raw = bye.Build();
-    Bye parsed_bye;
-    EXPECT_TRUE(test::ParseSinglePacket(raw, &parsed_bye));
-
-    EXPECT_EQ(kReason, parsed_bye.reason());
-  }
-}
-
-TEST(RtcpPacketByeTest, ParseEmptyPacket) {
-  uint8_t kEmptyPacket[] = {0x80, Bye::kPacketType, 0, 0};
-  Bye parsed_bye;
-  EXPECT_TRUE(test::ParseSinglePacket(kEmptyPacket, &parsed_bye));
-  EXPECT_EQ(0u, parsed_bye.sender_ssrc());
-  EXPECT_TRUE(parsed_bye.csrcs().empty());
-  EXPECT_TRUE(parsed_bye.reason().empty());
-}
-
-TEST(RtcpPacketByeTest, ParseFailOnInvalidSrcCount) {
-  Bye bye;
-  bye.SetSenderSsrc(kSenderSsrc);
-
-  rtc::Buffer raw = bye.Build();
-  raw[0]++;  // Damage the packet: increase ssrc count by one.
-
-  Bye parsed_bye;
-  EXPECT_FALSE(test::ParseSinglePacket(raw, &parsed_bye));
-}
-
-TEST(RtcpPacketByeTest, ParseFailOnInvalidReasonLength) {
-  Bye bye;
-  bye.SetSenderSsrc(kSenderSsrc);
-  bye.SetReason("18 characters long");
-
-  rtc::Buffer raw = bye.Build();
-  // Damage the packet: decrease payload size by 4 bytes
-  raw[3]--;
-  raw.SetSize(raw.size() - 4);
-
-  Bye parsed_bye;
-  EXPECT_FALSE(test::ParseSinglePacket(raw, &parsed_bye));
-}
-
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/rtcp_packet/common_header.cc b/modules/rtp_rtcp/source/rtcp_packet/common_header.cc
deleted file mode 100644
index 9971208..0000000
--- a/modules/rtp_rtcp/source/rtcp_packet/common_header.cc
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- *  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/rtp_rtcp/source/rtcp_packet/common_header.h"
-
-#include "webrtc/modules/rtp_rtcp/source/byte_io.h"
-#include "webrtc/rtc_base/logging.h"
-
-namespace webrtc {
-namespace rtcp {
-//    0                   1           1       2                   3
-//    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
-//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-// 0 |V=2|P|   C/F   |
-//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-// 1                 |  Packet Type  |
-//   ----------------+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-// 2                                 |             length            |
-//   --------------------------------+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//
-// Common header for all RTCP packets, 4 octets.
-bool CommonHeader::Parse(const uint8_t* buffer, size_t size_bytes) {
-  const size_t kHeaderSizeBytes = 4;
-  const uint8_t kVersion = 2;
-
-  if (size_bytes < kHeaderSizeBytes) {
-    LOG(LS_WARNING) << "Too little data (" << size_bytes << " byte"
-                    << (size_bytes != 1 ? "s" : "")
-                    << ") remaining in buffer to parse RTCP header (4 bytes).";
-    return false;
-  }
-
-  uint8_t version = buffer[0] >> 6;
-  if (version != kVersion) {
-    LOG(LS_WARNING) << "Invalid RTCP header: Version must be "
-                    << static_cast<int>(kVersion) << " but was "
-                    << static_cast<int>(version);
-    return false;
-  }
-
-  bool has_padding = (buffer[0] & 0x20) != 0;
-  count_or_format_ = buffer[0] & 0x1F;
-  packet_type_ = buffer[1];
-  payload_size_ = ByteReader<uint16_t>::ReadBigEndian(&buffer[2]) * 4;
-  payload_ = buffer + kHeaderSizeBytes;
-  padding_size_ = 0;
-
-  if (size_bytes < kHeaderSizeBytes + payload_size_) {
-    LOG(LS_WARNING) << "Buffer too small (" << size_bytes
-                    << " bytes) to fit an RtcpPacket with a header and "
-                    << payload_size_ << " bytes.";
-    return false;
-  }
-
-  if (has_padding) {
-    if (payload_size_ == 0) {
-      LOG(LS_WARNING) << "Invalid RTCP header: Padding bit set but 0 payload "
-                         "size specified.";
-      return false;
-    }
-
-    padding_size_ = payload_[payload_size_ - 1];
-    if (padding_size_ == 0) {
-      LOG(LS_WARNING) << "Invalid RTCP header: Padding bit set but 0 padding "
-                         "size specified.";
-      return false;
-    }
-    if (padding_size_ > payload_size_) {
-      LOG(LS_WARNING) << "Invalid RTCP header: Too many padding bytes ("
-                      << padding_size_ << ") for a packet payload size of "
-                      << payload_size_ << " bytes.";
-      return false;
-    }
-    payload_size_ -= padding_size_;
-  }
-  return true;
-}
-}  // namespace rtcp
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/rtcp_packet/common_header.h b/modules/rtp_rtcp/source/rtcp_packet/common_header.h
deleted file mode 100644
index a36b199..0000000
--- a/modules/rtp_rtcp/source/rtcp_packet/common_header.h
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- *  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_RTP_RTCP_SOURCE_RTCP_PACKET_COMMON_HEADER_H_
-#define WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_PACKET_COMMON_HEADER_H_
-
-#include "webrtc/rtc_base/basictypes.h"
-
-namespace webrtc {
-namespace rtcp {
-class CommonHeader {
- public:
-  CommonHeader() {}
-  CommonHeader(const CommonHeader&) = default;
-  CommonHeader& operator =(const CommonHeader&) = default;
-
-  bool Parse(const uint8_t* buffer, size_t size_bytes);
-
-  uint8_t type() const { return packet_type_; }
-  // Depending on packet type same header field can be used either as count or
-  // as feedback message type (fmt). Caller expected to know how it is used.
-  uint8_t fmt() const { return count_or_format_; }
-  uint8_t count() const { return count_or_format_; }
-  size_t payload_size_bytes() const { return payload_size_; }
-  const uint8_t* payload() const { return payload_; }
-  // Returns pointer to the next RTCP packet in compound packet.
-  const uint8_t* NextPacket() const {
-    return payload_ + payload_size_ + padding_size_;
-  }
-
- private:
-  uint8_t packet_type_ = 0;
-  uint8_t count_or_format_ = 0;
-  uint8_t padding_size_ = 0;
-  uint32_t payload_size_ = 0;
-  const uint8_t* payload_ = nullptr;
-};
-}  // namespace rtcp
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_PACKET_COMMON_HEADER_H_
diff --git a/modules/rtp_rtcp/source/rtcp_packet/common_header_unittest.cc b/modules/rtp_rtcp/source/rtcp_packet/common_header_unittest.cc
deleted file mode 100644
index f224226..0000000
--- a/modules/rtp_rtcp/source/rtcp_packet/common_header_unittest.cc
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- *  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/rtp_rtcp/source/rtcp_packet/common_header.h"
-
-#include "webrtc/test/gtest.h"
-
-using webrtc::rtcp::CommonHeader;
-
-namespace webrtc {
-namespace {
-const size_t kHeaderSizeBytes = 4;
-}  // namespace
-
-TEST(RtcpCommonHeaderTest, TooSmallBuffer) {
-  uint8_t buffer[] = {0x80, 0x00, 0x00, 0x00};
-  CommonHeader header;
-  // Buffer needs to be able to hold the header.
-  EXPECT_FALSE(header.Parse(buffer, 0));
-  EXPECT_FALSE(header.Parse(buffer, 1));
-  EXPECT_FALSE(header.Parse(buffer, 2));
-  EXPECT_FALSE(header.Parse(buffer, 3));
-  EXPECT_TRUE(header.Parse(buffer, 4));
-}
-
-TEST(RtcpCommonHeaderTest, Version) {
-  uint8_t buffer[] = {0x00, 0x00, 0x00, 0x00};
-  CommonHeader header;
-  // Version 2 is the only allowed.
-  buffer[0] = 0 << 6;
-  EXPECT_FALSE(header.Parse(buffer, sizeof(buffer)));
-  buffer[0] = 1 << 6;
-  EXPECT_FALSE(header.Parse(buffer, sizeof(buffer)));
-  buffer[0] = 2 << 6;
-  EXPECT_TRUE(header.Parse(buffer, sizeof(buffer)));
-  buffer[0] = 3 << 6;
-  EXPECT_FALSE(header.Parse(buffer, sizeof(buffer)));
-}
-
-TEST(RtcpCommonHeaderTest, PacketSize) {
-  uint8_t buffer[] = {0x80, 0x00, 0x00, 0x02,
-                      0x00, 0x00, 0x00, 0x00,
-                      0x00, 0x00, 0x00, 0x00};
-  CommonHeader header;
-  EXPECT_FALSE(header.Parse(buffer, sizeof(buffer) - 1));
-  EXPECT_TRUE(header.Parse(buffer, sizeof(buffer)));
-  EXPECT_EQ(8u, header.payload_size_bytes());
-  EXPECT_EQ(buffer + sizeof(buffer), header.NextPacket());
-}
-
-TEST(RtcpCommonHeaderTest, PaddingAndPayloadSize) {
-  // Set v = 2, p = 1, but leave fmt, pt as 0.
-  uint8_t buffer[] = {0xa0, 0x00, 0x00, 0x00,
-                      0x00, 0x00, 0x00, 0x00,
-                      0x00, 0x00, 0x00, 0x00};
-  CommonHeader header;
-  // Padding bit set, but no byte for padding (can't specify padding length).
-  EXPECT_FALSE(header.Parse(buffer, 4));
-
-  buffer[3] = 2;  //  Set payload size to 2x32bit.
-  const size_t kPayloadSizeBytes = buffer[3] * 4;
-  const size_t kPaddingAddress = kHeaderSizeBytes + kPayloadSizeBytes - 1;
-
-  // Padding one byte larger than possible.
-  buffer[kPaddingAddress] = kPayloadSizeBytes + 1;
-  EXPECT_FALSE(header.Parse(buffer, sizeof(buffer)));
-
-  // Invalid zero padding size.
-  buffer[kPaddingAddress] = 0;
-  EXPECT_FALSE(header.Parse(buffer, sizeof(buffer)));
-
-  // Pure padding packet.
-  buffer[kPaddingAddress] = kPayloadSizeBytes;
-  EXPECT_TRUE(header.Parse(buffer, sizeof(buffer)));
-  EXPECT_EQ(0u, header.payload_size_bytes());
-  EXPECT_EQ(buffer + sizeof(buffer), header.NextPacket());
-  EXPECT_EQ(header.payload(), buffer + kHeaderSizeBytes);
-
-  // Single byte of actual data.
-  buffer[kPaddingAddress] = kPayloadSizeBytes - 1;
-  EXPECT_TRUE(header.Parse(buffer, sizeof(buffer)));
-  EXPECT_EQ(1u, header.payload_size_bytes());
-  EXPECT_EQ(buffer + sizeof(buffer), header.NextPacket());
-}
-
-TEST(RtcpCommonHeaderTest, FormatAndPayloadType) {
-  uint8_t buffer[] = {0x9e, 0xab, 0x00, 0x00};
-  CommonHeader header;
-  EXPECT_TRUE(header.Parse(buffer, sizeof(buffer)));
-
-  EXPECT_EQ(header.count(), 0x1e);
-  EXPECT_EQ(header.fmt(), 0x1e);
-  EXPECT_EQ(header.type(), 0xab);
-  EXPECT_EQ(header.payload_size_bytes(), 0u);
-  EXPECT_EQ(header.payload(), buffer + kHeaderSizeBytes);
-}
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/rtcp_packet/compound_packet.cc b/modules/rtp_rtcp/source/rtcp_packet/compound_packet.cc
deleted file mode 100644
index 28437c8..0000000
--- a/modules/rtp_rtcp/source/rtcp_packet/compound_packet.cc
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- *  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/rtp_rtcp/source/rtcp_packet/compound_packet.h"
-
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-namespace rtcp {
-
-CompoundPacket::CompoundPacket() = default;
-
-CompoundPacket::~CompoundPacket() = default;
-
-void CompoundPacket::Append(RtcpPacket* packet) {
-  RTC_CHECK(packet);
-  appended_packets_.push_back(packet);
-}
-
-bool CompoundPacket::Create(uint8_t* packet,
-                            size_t* index,
-                            size_t max_length,
-                            RtcpPacket::PacketReadyCallback* callback) const {
-  for (RtcpPacket* appended : appended_packets_) {
-    if (!appended->Create(packet, index, max_length, callback))
-      return false;
-  }
-  return true;
-}
-
-size_t CompoundPacket::BlockLength() const {
-  size_t block_length = 0;
-  for (RtcpPacket* appended : appended_packets_) {
-    block_length += appended->BlockLength();
-  }
-  return block_length;
-}
-
-}  // namespace rtcp
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/rtcp_packet/compound_packet.h b/modules/rtp_rtcp/source/rtcp_packet/compound_packet.h
deleted file mode 100644
index ea32b35..0000000
--- a/modules/rtp_rtcp/source/rtcp_packet/compound_packet.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- *  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_RTP_RTCP_SOURCE_RTCP_PACKET_COMPOUND_PACKET_H_
-#define WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_PACKET_COMPOUND_PACKET_H_
-
-#include <vector>
-
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet.h"
-#include "webrtc/rtc_base/basictypes.h"
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace webrtc {
-namespace rtcp {
-
-class CompoundPacket : public RtcpPacket {
- public:
-  CompoundPacket();
-  ~CompoundPacket() override;
-
-  void Append(RtcpPacket* packet);
-
-  // Size of this packet in bytes (i.e. total size of nested packets).
-  size_t BlockLength() const override;
-  // Returns true if all calls to Create succeeded.
-  bool Create(uint8_t* packet,
-              size_t* index,
-              size_t max_length,
-              RtcpPacket::PacketReadyCallback* callback) const override;
-
- protected:
-  std::vector<RtcpPacket*> appended_packets_;
-
- private:
-  RTC_DISALLOW_COPY_AND_ASSIGN(CompoundPacket);
-};
-
-}  // namespace rtcp
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_PACKET_COMPOUND_PACKET_H_
diff --git a/modules/rtp_rtcp/source/rtcp_packet/compound_packet_unittest.cc b/modules/rtp_rtcp/source/rtcp_packet/compound_packet_unittest.cc
deleted file mode 100644
index 4c1c238..0000000
--- a/modules/rtp_rtcp/source/rtcp_packet/compound_packet_unittest.cc
+++ /dev/null
@@ -1,161 +0,0 @@
-/*
- *  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/rtp_rtcp/source/rtcp_packet/compound_packet.h"
-
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/bye.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/fir.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/receiver_report.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/sender_report.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/rtcp_packet_parser.h"
-
-using webrtc::rtcp::Bye;
-using webrtc::rtcp::CompoundPacket;
-using webrtc::rtcp::Fir;
-using webrtc::rtcp::ReceiverReport;
-using webrtc::rtcp::ReportBlock;
-using webrtc::rtcp::SenderReport;
-using webrtc::test::RtcpPacketParser;
-
-namespace webrtc {
-
-const uint32_t kSenderSsrc = 0x12345678;
-const uint32_t kRemoteSsrc = 0x23456789;
-const uint8_t kSeqNo = 13;
-
-TEST(RtcpCompoundPacketTest, AppendPacket) {
-  CompoundPacket compound;
-  Fir fir;
-  fir.AddRequestTo(kRemoteSsrc, kSeqNo);
-  ReportBlock rb;
-  ReceiverReport rr;
-  rr.SetSenderSsrc(kSenderSsrc);
-  EXPECT_TRUE(rr.AddReportBlock(rb));
-  compound.Append(&rr);
-  compound.Append(&fir);
-
-  rtc::Buffer packet = compound.Build();
-  RtcpPacketParser parser;
-  parser.Parse(packet.data(), packet.size());
-  EXPECT_EQ(1, parser.receiver_report()->num_packets());
-  EXPECT_EQ(kSenderSsrc, parser.receiver_report()->sender_ssrc());
-  EXPECT_EQ(1u, parser.receiver_report()->report_blocks().size());
-  EXPECT_EQ(1, parser.fir()->num_packets());
-}
-
-TEST(RtcpCompoundPacketTest, AppendPacketWithOwnAppendedPacket) {
-  CompoundPacket root;
-  CompoundPacket leaf;
-  Fir fir;
-  fir.AddRequestTo(kRemoteSsrc, kSeqNo);
-  Bye bye;
-  ReportBlock rb;
-
-  ReceiverReport rr;
-  EXPECT_TRUE(rr.AddReportBlock(rb));
-  leaf.Append(&rr);
-  leaf.Append(&fir);
-
-  SenderReport sr;
-  root.Append(&sr);
-  root.Append(&bye);
-  root.Append(&leaf);
-
-  rtc::Buffer packet = root.Build();
-  RtcpPacketParser parser;
-  parser.Parse(packet.data(), packet.size());
-  EXPECT_EQ(1, parser.sender_report()->num_packets());
-  EXPECT_EQ(1, parser.receiver_report()->num_packets());
-  EXPECT_EQ(1u, parser.receiver_report()->report_blocks().size());
-  EXPECT_EQ(1, parser.bye()->num_packets());
-  EXPECT_EQ(1, parser.fir()->num_packets());
-}
-
-TEST(RtcpCompoundPacketTest, BuildWithInputBuffer) {
-  CompoundPacket compound;
-  Fir fir;
-  fir.AddRequestTo(kRemoteSsrc, kSeqNo);
-  ReportBlock rb;
-  ReceiverReport rr;
-  rr.SetSenderSsrc(kSenderSsrc);
-  EXPECT_TRUE(rr.AddReportBlock(rb));
-  compound.Append(&rr);
-  compound.Append(&fir);
-
-  const size_t kRrLength = 8;
-  const size_t kReportBlockLength = 24;
-  const size_t kFirLength = 20;
-
-  class Verifier : public rtcp::RtcpPacket::PacketReadyCallback {
-   public:
-    void OnPacketReady(uint8_t* data, size_t length) override {
-      RtcpPacketParser parser;
-      parser.Parse(data, length);
-      EXPECT_EQ(1, parser.receiver_report()->num_packets());
-      EXPECT_EQ(1u, parser.receiver_report()->report_blocks().size());
-      EXPECT_EQ(1, parser.fir()->num_packets());
-      ++packets_created_;
-    }
-
-    int packets_created_ = 0;
-  } verifier;
-  const size_t kBufferSize = kRrLength + kReportBlockLength + kFirLength;
-  uint8_t buffer[kBufferSize];
-  EXPECT_TRUE(compound.BuildExternalBuffer(buffer, kBufferSize, &verifier));
-  EXPECT_EQ(1, verifier.packets_created_);
-}
-
-TEST(RtcpCompoundPacketTest, BuildWithTooSmallBuffer_FragmentedSend) {
-  CompoundPacket compound;
-  Fir fir;
-  fir.AddRequestTo(kRemoteSsrc, kSeqNo);
-  ReportBlock rb;
-  ReceiverReport rr;
-  rr.SetSenderSsrc(kSenderSsrc);
-  EXPECT_TRUE(rr.AddReportBlock(rb));
-  compound.Append(&rr);
-  compound.Append(&fir);
-
-  const size_t kRrLength = 8;
-  const size_t kReportBlockLength = 24;
-
-  class Verifier : public rtcp::RtcpPacket::PacketReadyCallback {
-   public:
-    void OnPacketReady(uint8_t* data, size_t length) override {
-      RtcpPacketParser parser;
-      parser.Parse(data, length);
-      switch (packets_created_++) {
-        case 0:
-          EXPECT_EQ(1, parser.receiver_report()->num_packets());
-          EXPECT_EQ(1U, parser.receiver_report()->report_blocks().size());
-          EXPECT_EQ(0, parser.fir()->num_packets());
-          break;
-        case 1:
-          EXPECT_EQ(0, parser.receiver_report()->num_packets());
-          EXPECT_EQ(0U, parser.receiver_report()->report_blocks().size());
-          EXPECT_EQ(1, parser.fir()->num_packets());
-          break;
-        default:
-          ADD_FAILURE() << "OnPacketReady not expected to be called "
-                        << packets_created_ << " times.";
-      }
-    }
-
-    int packets_created_ = 0;
-  } verifier;
-  const size_t kBufferSize = kRrLength + kReportBlockLength;
-  uint8_t buffer[kBufferSize];
-  EXPECT_TRUE(compound.BuildExternalBuffer(buffer, kBufferSize, &verifier));
-  EXPECT_EQ(2, verifier.packets_created_);
-}
-
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/rtcp_packet/dlrr.cc b/modules/rtp_rtcp/source/rtcp_packet/dlrr.cc
deleted file mode 100644
index b7ca58c..0000000
--- a/modules/rtp_rtcp/source/rtcp_packet/dlrr.cc
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- *  Copyright (c) 2015 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/rtp_rtcp/source/rtcp_packet/dlrr.h"
-
-#include "webrtc/modules/rtp_rtcp/source/byte_io.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-
-namespace webrtc {
-namespace rtcp {
-// DLRR Report Block (RFC 3611).
-//
-//   0                   1                   2                   3
-//   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
-//  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//  |     BT=5      |   reserved    |         block length          |
-//  +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
-//  |                 SSRC_1 (SSRC of first receiver)               | sub-
-//  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ block
-//  |                         last RR (LRR)                         |   1
-//  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//  |                   delay since last RR (DLRR)                  |
-//  +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
-//  |                 SSRC_2 (SSRC of second receiver)              | sub-
-//  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ block
-//  :                               ...                             :   2
-
-Dlrr::Dlrr() = default;
-
-Dlrr::Dlrr(const Dlrr& other) = default;
-
-Dlrr::~Dlrr() = default;
-
-bool Dlrr::Parse(const uint8_t* buffer, uint16_t block_length_32bits) {
-  RTC_DCHECK(buffer[0] == kBlockType);
-  // kReserved = buffer[1];
-  RTC_DCHECK_EQ(block_length_32bits,
-                ByteReader<uint16_t>::ReadBigEndian(&buffer[2]));
-  if (block_length_32bits % 3 != 0) {
-    LOG(LS_WARNING) << "Invalid size for dlrr block.";
-    return false;
-  }
-
-  size_t blocks_count = block_length_32bits / 3;
-  const uint8_t* read_at = buffer + kBlockHeaderLength;
-  sub_blocks_.resize(blocks_count);
-  for (ReceiveTimeInfo& sub_block : sub_blocks_) {
-    sub_block.ssrc = ByteReader<uint32_t>::ReadBigEndian(&read_at[0]);
-    sub_block.last_rr = ByteReader<uint32_t>::ReadBigEndian(&read_at[4]);
-    sub_block.delay_since_last_rr =
-        ByteReader<uint32_t>::ReadBigEndian(&read_at[8]);
-    read_at += kSubBlockLength;
-  }
-  return true;
-}
-
-size_t Dlrr::BlockLength() const {
-  if (sub_blocks_.empty())
-    return 0;
-  return kBlockHeaderLength + kSubBlockLength * sub_blocks_.size();
-}
-
-void Dlrr::Create(uint8_t* buffer) const {
-  if (sub_blocks_.empty())  // No subblocks, no need to write header either.
-    return;
-  // Create block header.
-  const uint8_t kReserved = 0;
-  buffer[0] = kBlockType;
-  buffer[1] = kReserved;
-  ByteWriter<uint16_t>::WriteBigEndian(&buffer[2], 3 * sub_blocks_.size());
-  // Create sub blocks.
-  uint8_t* write_at = buffer + kBlockHeaderLength;
-  for (const ReceiveTimeInfo& sub_block : sub_blocks_) {
-    ByteWriter<uint32_t>::WriteBigEndian(&write_at[0], sub_block.ssrc);
-    ByteWriter<uint32_t>::WriteBigEndian(&write_at[4], sub_block.last_rr);
-    ByteWriter<uint32_t>::WriteBigEndian(&write_at[8],
-                                         sub_block.delay_since_last_rr);
-    write_at += kSubBlockLength;
-  }
-  RTC_DCHECK_EQ(buffer + BlockLength(), write_at);
-}
-
-}  // namespace rtcp
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/rtcp_packet/dlrr.h b/modules/rtp_rtcp/source/rtcp_packet/dlrr.h
deleted file mode 100644
index 16bc115..0000000
--- a/modules/rtp_rtcp/source/rtcp_packet/dlrr.h
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- *  Copyright (c) 2015 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_RTP_RTCP_SOURCE_RTCP_PACKET_DLRR_H_
-#define WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_PACKET_DLRR_H_
-
-#include <vector>
-
-#include "webrtc/rtc_base/basictypes.h"
-
-namespace webrtc {
-namespace rtcp {
-struct ReceiveTimeInfo {
-  // RFC 3611 4.5
-  ReceiveTimeInfo() : ssrc(0), last_rr(0), delay_since_last_rr(0) {}
-  ReceiveTimeInfo(uint32_t ssrc, uint32_t last_rr, uint32_t delay)
-      : ssrc(ssrc), last_rr(last_rr), delay_since_last_rr(delay) {}
-  uint32_t ssrc;
-  uint32_t last_rr;
-  uint32_t delay_since_last_rr;
-};
-
-// DLRR Report Block: Delay since the Last Receiver Report (RFC 3611).
-class Dlrr {
- public:
-  static const uint8_t kBlockType = 5;
-
-  Dlrr();
-  Dlrr(const Dlrr& other);
-  ~Dlrr();
-
-  Dlrr& operator=(const Dlrr& other) = default;
-
-  // Dlrr without items treated same as no dlrr block.
-  explicit operator bool() const { return !sub_blocks_.empty(); }
-
-  // Second parameter is value read from block header,
-  // i.e. size of block in 32bits excluding block header itself.
-  bool Parse(const uint8_t* buffer, uint16_t block_length_32bits);
-
-  size_t BlockLength() const;
-  // Fills buffer with the Dlrr.
-  // Consumes BlockLength() bytes.
-  void Create(uint8_t* buffer) const;
-
-  void ClearItems() { sub_blocks_.clear(); }
-  void AddDlrrItem(const ReceiveTimeInfo& time_info) {
-    sub_blocks_.push_back(time_info);
-  }
-
-  const std::vector<ReceiveTimeInfo>& sub_blocks() const { return sub_blocks_; }
-
- private:
-  static const size_t kBlockHeaderLength = 4;
-  static const size_t kSubBlockLength = 12;
-
-  std::vector<ReceiveTimeInfo> sub_blocks_;
-};
-}  // namespace rtcp
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_PACKET_DLRR_H_
diff --git a/modules/rtp_rtcp/source/rtcp_packet/dlrr_unittest.cc b/modules/rtp_rtcp/source/rtcp_packet/dlrr_unittest.cc
deleted file mode 100644
index 6144ab7..0000000
--- a/modules/rtp_rtcp/source/rtcp_packet/dlrr_unittest.cc
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- *  Copyright (c) 2015 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/rtp_rtcp/source/rtcp_packet/dlrr.h"
-
-#include "webrtc/modules/rtp_rtcp/source/byte_io.h"
-#include "webrtc/test/gtest.h"
-
-using webrtc::rtcp::Dlrr;
-using webrtc::rtcp::ReceiveTimeInfo;
-
-namespace webrtc {
-namespace {
-const uint32_t kSsrc = 0x12345678;
-const uint32_t kLastRR = 0x23344556;
-const uint32_t kDelay = 0x33343536;
-const uint8_t kBlock[] = {0x05, 0x00, 0x00, 0x03, 0x12, 0x34, 0x56, 0x78,
-                          0x23, 0x34, 0x45, 0x56, 0x33, 0x34, 0x35, 0x36};
-const size_t kBlockSizeBytes = sizeof(kBlock);
-}  // namespace
-
-TEST(RtcpPacketDlrrTest, Empty) {
-  Dlrr dlrr;
-
-  EXPECT_EQ(0u, dlrr.BlockLength());
-}
-
-TEST(RtcpPacketDlrrTest, Create) {
-  Dlrr dlrr;
-  dlrr.AddDlrrItem(ReceiveTimeInfo(kSsrc, kLastRR, kDelay));
-
-  ASSERT_EQ(kBlockSizeBytes, dlrr.BlockLength());
-  uint8_t buffer[kBlockSizeBytes];
-
-  dlrr.Create(buffer);
-  EXPECT_EQ(0, memcmp(buffer, kBlock, kBlockSizeBytes));
-}
-
-TEST(RtcpPacketDlrrTest, Parse) {
-  Dlrr dlrr;
-  uint16_t block_length = ByteReader<uint16_t>::ReadBigEndian(&kBlock[2]);
-  EXPECT_TRUE(dlrr.Parse(kBlock, block_length));
-
-  EXPECT_EQ(1u, dlrr.sub_blocks().size());
-  const ReceiveTimeInfo& block = dlrr.sub_blocks().front();
-  EXPECT_EQ(kSsrc, block.ssrc);
-  EXPECT_EQ(kLastRR, block.last_rr);
-  EXPECT_EQ(kDelay, block.delay_since_last_rr);
-}
-
-TEST(RtcpPacketDlrrTest, ParseFailsOnBadSize) {
-  const size_t kBigBufferSize = 0x100;  // More than enough.
-  uint8_t buffer[kBigBufferSize];
-  buffer[0] = Dlrr::kBlockType;
-  buffer[1] = 0;  // Reserved.
-  buffer[2] = 0;  // Most significant size byte.
-  for (uint8_t size = 3; size < 6; ++size) {
-    buffer[3] = size;
-    Dlrr dlrr;
-    // Parse should be successful only when size is multiple of 3.
-    EXPECT_EQ(size % 3 == 0, dlrr.Parse(buffer, static_cast<uint16_t>(size)));
-  }
-}
-
-TEST(RtcpPacketDlrrTest, CreateAndParseManySubBlocks) {
-  const size_t kBufferSize = 0x1000;  // More than enough.
-  const size_t kManyDlrrItems = 50;
-  uint8_t buffer[kBufferSize];
-
-  // Create.
-  Dlrr dlrr;
-  for (size_t i = 1; i <= kManyDlrrItems; ++i)
-    dlrr.AddDlrrItem(ReceiveTimeInfo(kSsrc + i, kLastRR + i, kDelay + i));
-  size_t used_buffer_size = dlrr.BlockLength();
-  ASSERT_LE(used_buffer_size, kBufferSize);
-  dlrr.Create(buffer);
-
-  // Parse.
-  Dlrr parsed;
-  uint16_t block_length = ByteReader<uint16_t>::ReadBigEndian(&buffer[2]);
-  EXPECT_EQ(used_buffer_size, (block_length + 1) * 4u);
-  EXPECT_TRUE(parsed.Parse(buffer, block_length));
-  EXPECT_EQ(kManyDlrrItems, parsed.sub_blocks().size());
-}
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/rtcp_packet/extended_jitter_report.cc b/modules/rtp_rtcp/source/rtcp_packet/extended_jitter_report.cc
deleted file mode 100644
index 575184f..0000000
--- a/modules/rtp_rtcp/source/rtcp_packet/extended_jitter_report.cc
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- *  Copyright (c) 2015 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/rtp_rtcp/source/rtcp_packet/extended_jitter_report.h"
-
-#include <utility>
-
-#include "webrtc/modules/rtp_rtcp/source/byte_io.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/common_header.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-
-namespace webrtc {
-namespace rtcp {
-constexpr uint8_t ExtendedJitterReport::kPacketType;
-// Transmission Time Offsets in RTP Streams (RFC 5450).
-//
-//      0                   1                   2                   3
-//      0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
-//     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-// hdr |V=2|P|    RC   |   PT=IJ=195   |             length            |
-//     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//     |                      inter-arrival jitter                     |
-//     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//     .                                                               .
-//     .                                                               .
-//     .                                                               .
-//     |                      inter-arrival jitter                     |
-//     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//
-//  If present, this RTCP packet must be placed after a receiver report
-//  (inside a compound RTCP packet), and MUST have the same value for RC
-//  (reception report count) as the receiver report.
-
-ExtendedJitterReport::ExtendedJitterReport() = default;
-
-ExtendedJitterReport::~ExtendedJitterReport() = default;
-
-bool ExtendedJitterReport::Parse(const CommonHeader& packet) {
-  RTC_DCHECK_EQ(packet.type(), kPacketType);
-
-  const uint8_t number_of_jitters = packet.count();
-
-  if (packet.payload_size_bytes() < number_of_jitters * kJitterSizeBytes) {
-    LOG(LS_WARNING) << "Packet is too small to contain all the jitter.";
-    return false;
-  }
-
-  inter_arrival_jitters_.resize(number_of_jitters);
-  for (size_t index = 0; index < number_of_jitters; ++index) {
-    inter_arrival_jitters_[index] = ByteReader<uint32_t>::ReadBigEndian(
-        &packet.payload()[index * kJitterSizeBytes]);
-  }
-
-  return true;
-}
-
-bool ExtendedJitterReport::SetJitterValues(std::vector<uint32_t> values) {
-  if (values.size() > kMaxNumberOfJitterValues) {
-    LOG(LS_WARNING) << "Too many inter-arrival jitter items.";
-    return false;
-  }
-  inter_arrival_jitters_ = std::move(values);
-  return true;
-}
-
-size_t ExtendedJitterReport::BlockLength() const {
-  return kHeaderLength + kJitterSizeBytes * inter_arrival_jitters_.size();
-}
-
-bool ExtendedJitterReport::Create(
-    uint8_t* packet,
-    size_t* index,
-    size_t max_length,
-    RtcpPacket::PacketReadyCallback* callback) const {
-  while (*index + BlockLength() > max_length) {
-    if (!OnBufferFull(packet, index, callback))
-      return false;
-  }
-  const size_t index_end = *index + BlockLength();
-  size_t length = inter_arrival_jitters_.size();
-  CreateHeader(length, kPacketType, length, packet, index);
-
-  for (uint32_t jitter : inter_arrival_jitters_) {
-    ByteWriter<uint32_t>::WriteBigEndian(packet + *index, jitter);
-    *index += kJitterSizeBytes;
-  }
-  // Sanity check.
-  RTC_DCHECK_EQ(index_end, *index);
-  return true;
-}
-
-}  // namespace rtcp
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/rtcp_packet/extended_jitter_report.h b/modules/rtp_rtcp/source/rtcp_packet/extended_jitter_report.h
deleted file mode 100644
index 1771e02..0000000
--- a/modules/rtp_rtcp/source/rtcp_packet/extended_jitter_report.h
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- *  Copyright (c) 2015 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_RTP_RTCP_SOURCE_RTCP_PACKET_EXTENDED_JITTER_REPORT_H_
-#define WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_PACKET_EXTENDED_JITTER_REPORT_H_
-
-#include <vector>
-
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet.h"
-
-namespace webrtc {
-namespace rtcp {
-class CommonHeader;
-
-class ExtendedJitterReport : public RtcpPacket {
- public:
-  static constexpr uint8_t kPacketType = 195;
-  static constexpr size_t kMaxNumberOfJitterValues = 0x1f;
-
-  ExtendedJitterReport();
-  ~ExtendedJitterReport() override;
-
-  // Parse assumes header is already parsed and validated.
-  bool Parse(const CommonHeader& packet);
-
-  bool SetJitterValues(std::vector<uint32_t> jitter_values);
-
-  const std::vector<uint32_t>& jitter_values() {
-    return inter_arrival_jitters_;
-  }
-
-  size_t BlockLength() const override;
-
-  bool Create(uint8_t* packet,
-              size_t* index,
-              size_t max_length,
-              RtcpPacket::PacketReadyCallback* callback) const override;
-
- private:
-  static constexpr size_t kJitterSizeBytes = 4;
-
-  std::vector<uint32_t> inter_arrival_jitters_;
-};
-
-}  // namespace rtcp
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_PACKET_EXTENDED_JITTER_REPORT_H_
diff --git a/modules/rtp_rtcp/source/rtcp_packet/extended_jitter_report_unittest.cc b/modules/rtp_rtcp/source/rtcp_packet/extended_jitter_report_unittest.cc
deleted file mode 100644
index 39eb931..0000000
--- a/modules/rtp_rtcp/source/rtcp_packet/extended_jitter_report_unittest.cc
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- *  Copyright (c) 2015 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/rtp_rtcp/source/rtcp_packet/extended_jitter_report.h"
-
-#include "webrtc/test/gmock.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/rtcp_packet_parser.h"
-
-using testing::ElementsAre;
-using testing::IsEmpty;
-using webrtc::rtcp::ExtendedJitterReport;
-
-namespace webrtc {
-namespace {
-constexpr uint32_t kJitter1 = 0x11121314;
-constexpr uint32_t kJitter2 = 0x22242628;
-}  // namespace
-
-TEST(RtcpPacketExtendedJitterReportTest, CreateAndParseWithoutItems) {
-  ExtendedJitterReport ij;
-  rtc::Buffer raw = ij.Build();
-
-  ExtendedJitterReport parsed;
-  EXPECT_TRUE(test::ParseSinglePacket(raw, &parsed));
-
-  EXPECT_THAT(parsed.jitter_values(), IsEmpty());
-}
-
-TEST(RtcpPacketExtendedJitterReportTest, CreateAndParseWithOneItem) {
-  ExtendedJitterReport ij;
-  EXPECT_TRUE(ij.SetJitterValues({kJitter1}));
-  rtc::Buffer raw = ij.Build();
-
-  ExtendedJitterReport parsed;
-  EXPECT_TRUE(test::ParseSinglePacket(raw, &parsed));
-
-  EXPECT_THAT(parsed.jitter_values(), ElementsAre(kJitter1));
-}
-
-TEST(RtcpPacketExtendedJitterReportTest, CreateAndParseWithTwoItems) {
-  ExtendedJitterReport ij;
-  EXPECT_TRUE(ij.SetJitterValues({kJitter1, kJitter2}));
-  rtc::Buffer raw = ij.Build();
-
-  ExtendedJitterReport parsed;
-  EXPECT_TRUE(test::ParseSinglePacket(raw, &parsed));
-
-  EXPECT_THAT(parsed.jitter_values(), ElementsAre(kJitter1, kJitter2));
-}
-
-TEST(RtcpPacketExtendedJitterReportTest, CreateWithTooManyItems) {
-  ExtendedJitterReport ij;
-  const int kMaxItems = ExtendedJitterReport::kMaxNumberOfJitterValues;
-  EXPECT_FALSE(
-      ij.SetJitterValues(std::vector<uint32_t>(kMaxItems + 1, kJitter1)));
-  EXPECT_TRUE(ij.SetJitterValues(std::vector<uint32_t>(kMaxItems, kJitter1)));
-}
-
-TEST(RtcpPacketExtendedJitterReportTest, ParseFailsWithTooManyItems) {
-  ExtendedJitterReport ij;
-  ij.SetJitterValues({kJitter1});
-  rtc::Buffer raw = ij.Build();
-  raw[0]++;  // Damage packet: increase jitter count by 1.
-  ExtendedJitterReport parsed;
-  EXPECT_FALSE(test::ParseSinglePacket(raw, &parsed));
-}
-
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/rtcp_packet/extended_reports.cc b/modules/rtp_rtcp/source/rtcp_packet/extended_reports.cc
deleted file mode 100644
index eb84cd7..0000000
--- a/modules/rtp_rtcp/source/rtcp_packet/extended_reports.cc
+++ /dev/null
@@ -1,211 +0,0 @@
-/*
- *  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/rtp_rtcp/source/rtcp_packet/extended_reports.h"
-
-#include "webrtc/modules/rtp_rtcp/source/byte_io.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/common_header.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-
-namespace webrtc {
-namespace rtcp {
-constexpr uint8_t ExtendedReports::kPacketType;
-// From RFC 3611: RTP Control Protocol Extended Reports (RTCP XR).
-//
-// Format for XR packets:
-//
-//   0                   1                   2                   3
-//   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
-//  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//  |V=2|P|reserved |   PT=XR=207   |             length            |
-//  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//  |                              SSRC                             |
-//  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//  :                         report blocks                         :
-//  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//
-// Extended report block:
-//   0                   1                   2                   3
-//   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
-//  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//  |  Block Type   |   reserved    |         block length          |
-//  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//  :             type-specific block contents                      :
-//  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-ExtendedReports::ExtendedReports() : sender_ssrc_(0) {}
-ExtendedReports::~ExtendedReports() {}
-
-bool ExtendedReports::Parse(const CommonHeader& packet) {
-  RTC_DCHECK_EQ(packet.type(), kPacketType);
-
-  if (packet.payload_size_bytes() < kXrBaseLength) {
-    LOG(LS_WARNING) << "Packet is too small to be an ExtendedReports packet.";
-    return false;
-  }
-
-  sender_ssrc_ = ByteReader<uint32_t>::ReadBigEndian(packet.payload());
-  rrtr_block_.reset();
-  dlrr_block_.ClearItems();
-  voip_metric_block_.reset();
-  target_bitrate_ = rtc::Optional<TargetBitrate>();
-
-  const uint8_t* current_block = packet.payload() + kXrBaseLength;
-  const uint8_t* const packet_end =
-      packet.payload() + packet.payload_size_bytes();
-  constexpr size_t kBlockHeaderSizeBytes = 4;
-  while (current_block + kBlockHeaderSizeBytes <= packet_end) {
-    uint8_t block_type = ByteReader<uint8_t>::ReadBigEndian(current_block);
-    uint16_t block_length =
-        ByteReader<uint16_t>::ReadBigEndian(current_block + 2);
-    const uint8_t* next_block =
-        current_block + kBlockHeaderSizeBytes + block_length * 4;
-    if (next_block > packet_end) {
-      LOG(LS_WARNING) << "Report block in extended report packet is too big.";
-      return false;
-    }
-    switch (block_type) {
-      case Rrtr::kBlockType:
-        ParseRrtrBlock(current_block, block_length);
-        break;
-      case Dlrr::kBlockType:
-        ParseDlrrBlock(current_block, block_length);
-        break;
-      case VoipMetric::kBlockType:
-        ParseVoipMetricBlock(current_block, block_length);
-        break;
-      case TargetBitrate::kBlockType:
-        ParseTargetBitrateBlock(current_block, block_length);
-        break;
-      default:
-        // Unknown block, ignore.
-        LOG(LS_WARNING) << "Unknown extended report block type " << block_type;
-        break;
-    }
-    current_block = next_block;
-  }
-
-  return true;
-}
-
-void ExtendedReports::SetRrtr(const Rrtr& rrtr) {
-  if (rrtr_block_)
-    LOG(LS_WARNING) << "Rrtr already set, overwriting.";
-  rrtr_block_.emplace(rrtr);
-}
-
-void ExtendedReports::AddDlrrItem(const ReceiveTimeInfo& time_info) {
-  dlrr_block_.AddDlrrItem(time_info);
-}
-
-void ExtendedReports::SetVoipMetric(const VoipMetric& voip_metric) {
-  if (voip_metric_block_)
-    LOG(LS_WARNING) << "Voip metric already set, overwriting.";
-  voip_metric_block_.emplace(voip_metric);
-}
-
-void ExtendedReports::SetTargetBitrate(const TargetBitrate& bitrate) {
-  if (target_bitrate_)
-    LOG(LS_WARNING) << "TargetBitrate already set, overwriting.";
-
-  target_bitrate_ = rtc::Optional<TargetBitrate>(bitrate);
-}
-
-size_t ExtendedReports::BlockLength() const {
-  return kHeaderLength + kXrBaseLength + RrtrLength() + DlrrLength() +
-         VoipMetricLength() + TargetBitrateLength();
-}
-
-bool ExtendedReports::Create(uint8_t* packet,
-                             size_t* index,
-                             size_t max_length,
-                             RtcpPacket::PacketReadyCallback* callback) const {
-  while (*index + BlockLength() > max_length) {
-    if (!OnBufferFull(packet, index, callback))
-      return false;
-  }
-  size_t index_end = *index + BlockLength();
-  const uint8_t kReserved = 0;
-  CreateHeader(kReserved, kPacketType, HeaderLength(), packet, index);
-  ByteWriter<uint32_t>::WriteBigEndian(packet + *index, sender_ssrc_);
-  *index += sizeof(uint32_t);
-  if (rrtr_block_) {
-    rrtr_block_->Create(packet + *index);
-    *index += Rrtr::kLength;
-  }
-  if (dlrr_block_) {
-    dlrr_block_.Create(packet + *index);
-    *index += dlrr_block_.BlockLength();
-  }
-  if (voip_metric_block_) {
-    voip_metric_block_->Create(packet + *index);
-    *index += VoipMetric::kLength;
-  }
-  if (target_bitrate_) {
-    target_bitrate_->Create(packet + *index);
-    *index += target_bitrate_->BlockLength();
-  }
-  RTC_CHECK_EQ(*index, index_end);
-  return true;
-}
-
-size_t ExtendedReports::TargetBitrateLength() const {
-  if (target_bitrate_)
-    return target_bitrate_->BlockLength();
-  return 0;
-}
-
-void ExtendedReports::ParseRrtrBlock(const uint8_t* block,
-                                     uint16_t block_length) {
-  if (block_length != Rrtr::kBlockLength) {
-    LOG(LS_WARNING) << "Incorrect rrtr block size " << block_length
-                    << " Should be " << Rrtr::kBlockLength;
-    return;
-  }
-  if (rrtr_block_) {
-    LOG(LS_WARNING) << "Two rrtr blocks found in same Extended Report packet";
-    return;
-  }
-  rrtr_block_.emplace();
-  rrtr_block_->Parse(block);
-}
-
-void ExtendedReports::ParseDlrrBlock(const uint8_t* block,
-                                     uint16_t block_length) {
-  if (dlrr_block_) {
-    LOG(LS_WARNING) << "Two Dlrr blocks found in same Extended Report packet";
-    return;
-  }
-  dlrr_block_.Parse(block, block_length);
-}
-
-void ExtendedReports::ParseVoipMetricBlock(const uint8_t* block,
-                                           uint16_t block_length) {
-  if (block_length != VoipMetric::kBlockLength) {
-    LOG(LS_WARNING) << "Incorrect voip metric block size " << block_length
-                    << " Should be " << VoipMetric::kBlockLength;
-    return;
-  }
-  if (voip_metric_block_) {
-    LOG(LS_WARNING)
-        << "Two Voip Metric blocks found in same Extended Report packet";
-    return;
-  }
-  voip_metric_block_.emplace();
-  voip_metric_block_->Parse(block);
-}
-
-void ExtendedReports::ParseTargetBitrateBlock(const uint8_t* block,
-                                              uint16_t block_length) {
-  target_bitrate_.emplace();
-  target_bitrate_->Parse(block, block_length);
-}
-}  // namespace rtcp
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/rtcp_packet/extended_reports.h b/modules/rtp_rtcp/source/rtcp_packet/extended_reports.h
deleted file mode 100644
index 33a23de..0000000
--- a/modules/rtp_rtcp/source/rtcp_packet/extended_reports.h
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- *  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_RTP_RTCP_SOURCE_RTCP_PACKET_EXTENDED_REPORTS_H_
-#define WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_PACKET_EXTENDED_REPORTS_H_
-
-#include <vector>
-
-#include "webrtc/api/optional.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/dlrr.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/rrtr.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/target_bitrate.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/voip_metric.h"
-
-namespace webrtc {
-namespace rtcp {
-class CommonHeader;
-
-// From RFC 3611: RTP Control Protocol Extended Reports (RTCP XR).
-class ExtendedReports : public RtcpPacket {
- public:
-  static constexpr uint8_t kPacketType = 207;
-
-  ExtendedReports();
-  ~ExtendedReports() override;
-
-  // Parse assumes header is already parsed and validated.
-  bool Parse(const CommonHeader& packet);
-
-  void SetSenderSsrc(uint32_t ssrc) { sender_ssrc_ = ssrc; }
-
-  void SetRrtr(const Rrtr& rrtr);
-  void AddDlrrItem(const ReceiveTimeInfo& time_info);
-  void SetVoipMetric(const VoipMetric& voip_metric);
-  void SetTargetBitrate(const TargetBitrate& target_bitrate);
-
-  uint32_t sender_ssrc() const { return sender_ssrc_; }
-  const rtc::Optional<Rrtr>& rrtr() const { return rrtr_block_; }
-  const Dlrr& dlrr() const { return dlrr_block_; }
-  const rtc::Optional<VoipMetric>& voip_metric() const {
-    return voip_metric_block_;
-  }
-  const rtc::Optional<TargetBitrate>& target_bitrate() const {
-    return target_bitrate_;
-  }
-
-  size_t BlockLength() const override;
-
-  bool Create(uint8_t* packet,
-              size_t* index,
-              size_t max_length,
-              RtcpPacket::PacketReadyCallback* callback) const override;
-
- private:
-  static constexpr size_t kXrBaseLength = 4;
-
-  size_t RrtrLength() const { return rrtr_block_ ? Rrtr::kLength : 0; }
-  size_t DlrrLength() const { return dlrr_block_.BlockLength(); }
-  size_t VoipMetricLength() const {
-    return voip_metric_block_ ? VoipMetric::kLength : 0;
-  }
-  size_t TargetBitrateLength() const;
-
-  void ParseRrtrBlock(const uint8_t* block, uint16_t block_length);
-  void ParseDlrrBlock(const uint8_t* block, uint16_t block_length);
-  void ParseVoipMetricBlock(const uint8_t* block, uint16_t block_length);
-  void ParseTargetBitrateBlock(const uint8_t* block, uint16_t block_length);
-
-  uint32_t sender_ssrc_;
-  rtc::Optional<Rrtr> rrtr_block_;
-  Dlrr dlrr_block_;  // Dlrr without items treated same as no dlrr block.
-  rtc::Optional<VoipMetric> voip_metric_block_;
-  rtc::Optional<TargetBitrate> target_bitrate_;
-};
-}  // namespace rtcp
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_PACKET_EXTENDED_REPORTS_H_
diff --git a/modules/rtp_rtcp/source/rtcp_packet/extended_reports_unittest.cc b/modules/rtp_rtcp/source/rtcp_packet/extended_reports_unittest.cc
deleted file mode 100644
index 08ffd49..0000000
--- a/modules/rtp_rtcp/source/rtcp_packet/extended_reports_unittest.cc
+++ /dev/null
@@ -1,254 +0,0 @@
-/*
- *  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/rtp_rtcp/source/rtcp_packet/extended_reports.h"
-
-#include "webrtc/rtc_base/random.h"
-#include "webrtc/test/gmock.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/rtcp_packet_parser.h"
-
-using testing::ElementsAre;
-using testing::ElementsAreArray;
-using testing::make_tuple;
-using webrtc::rtcp::Dlrr;
-using webrtc::rtcp::ExtendedReports;
-using webrtc::rtcp::ReceiveTimeInfo;
-using webrtc::rtcp::Rrtr;
-using webrtc::rtcp::VoipMetric;
-
-namespace webrtc {
-// Define comparision operators that shouldn't be needed in production,
-// but make testing matches more clear.
-bool operator==(const RTCPVoIPMetric& metric1, const RTCPVoIPMetric& metric2) {
-  return metric1.lossRate == metric2.lossRate &&
-         metric1.discardRate == metric2.discardRate &&
-         metric1.burstDensity == metric2.burstDensity &&
-         metric1.gapDensity == metric2.gapDensity &&
-         metric1.burstDuration == metric2.burstDuration &&
-         metric1.gapDuration == metric2.gapDuration &&
-         metric1.roundTripDelay == metric2.roundTripDelay &&
-         metric1.endSystemDelay == metric2.endSystemDelay &&
-         metric1.signalLevel == metric2.signalLevel &&
-         metric1.noiseLevel == metric2.noiseLevel &&
-         metric1.RERL == metric2.RERL &&
-         metric1.Gmin == metric2.Gmin &&
-         metric1.Rfactor == metric2.Rfactor &&
-         metric1.extRfactor == metric2.extRfactor &&
-         metric1.MOSLQ == metric2.MOSLQ &&
-         metric1.MOSCQ == metric2.MOSCQ &&
-         metric1.RXconfig == metric2.RXconfig &&
-         metric1.JBnominal == metric2.JBnominal &&
-         metric1.JBmax == metric2.JBmax &&
-         metric1.JBabsMax == metric2.JBabsMax;
-}
-
-namespace rtcp {
-bool operator==(const Rrtr& rrtr1, const Rrtr& rrtr2) {
-  return rrtr1.ntp() == rrtr2.ntp();
-}
-
-bool operator==(const ReceiveTimeInfo& time1, const ReceiveTimeInfo& time2) {
-  return time1.ssrc == time2.ssrc &&
-         time1.last_rr == time2.last_rr &&
-         time1.delay_since_last_rr == time2.delay_since_last_rr;
-}
-
-bool operator==(const VoipMetric& metric1, const VoipMetric& metric2) {
-  return metric1.ssrc() == metric2.ssrc() &&
-         metric1.voip_metric() == metric2.voip_metric();
-}
-}  // namespace rtcp
-
-namespace {
-constexpr uint32_t kSenderSsrc = 0x12345678;
-constexpr uint8_t kEmptyPacket[] = {0x80, 207,  0x00, 0x01,
-                                    0x12, 0x34, 0x56, 0x78};
-}  // namespace
-
-class RtcpPacketExtendedReportsTest : public ::testing::Test {
- public:
-  RtcpPacketExtendedReportsTest() : random_(0x123456789) {}
-
- protected:
-  template <typename T>
-  T Rand() {
-    return random_.Rand<T>();
-  }
-
- private:
-  Random random_;
-};
-
-template <>
-ReceiveTimeInfo RtcpPacketExtendedReportsTest::Rand<ReceiveTimeInfo>() {
-  uint32_t ssrc = Rand<uint32_t>();
-  uint32_t last_rr = Rand<uint32_t>();
-  uint32_t delay_since_last_rr = Rand<uint32_t>();
-  return ReceiveTimeInfo(ssrc, last_rr, delay_since_last_rr);
-}
-
-template <>
-NtpTime RtcpPacketExtendedReportsTest::Rand<NtpTime>() {
-  uint32_t secs = Rand<uint32_t>();
-  uint32_t frac = Rand<uint32_t>();
-  return NtpTime(secs, frac);
-}
-
-template <>
-Rrtr RtcpPacketExtendedReportsTest::Rand<Rrtr>() {
-  Rrtr rrtr;
-  rrtr.SetNtp(Rand<NtpTime>());
-  return rrtr;
-}
-
-template <>
-RTCPVoIPMetric RtcpPacketExtendedReportsTest::Rand<RTCPVoIPMetric>() {
-  RTCPVoIPMetric metric;
-  metric.lossRate       = Rand<uint8_t>();
-  metric.discardRate    = Rand<uint8_t>();
-  metric.burstDensity   = Rand<uint8_t>();
-  metric.gapDensity     = Rand<uint8_t>();
-  metric.burstDuration  = Rand<uint16_t>();
-  metric.gapDuration    = Rand<uint16_t>();
-  metric.roundTripDelay = Rand<uint16_t>();
-  metric.endSystemDelay = Rand<uint16_t>();
-  metric.signalLevel    = Rand<uint8_t>();
-  metric.noiseLevel     = Rand<uint8_t>();
-  metric.RERL           = Rand<uint8_t>();
-  metric.Gmin           = Rand<uint8_t>();
-  metric.Rfactor        = Rand<uint8_t>();
-  metric.extRfactor     = Rand<uint8_t>();
-  metric.MOSLQ          = Rand<uint8_t>();
-  metric.MOSCQ          = Rand<uint8_t>();
-  metric.RXconfig       = Rand<uint8_t>();
-  metric.JBnominal      = Rand<uint16_t>();
-  metric.JBmax          = Rand<uint16_t>();
-  metric.JBabsMax       = Rand<uint16_t>();
-  return metric;
-}
-
-template <>
-VoipMetric RtcpPacketExtendedReportsTest::Rand<VoipMetric>() {
-  VoipMetric voip_metric;
-  voip_metric.SetMediaSsrc(Rand<uint32_t>());
-  voip_metric.SetVoipMetric(Rand<RTCPVoIPMetric>());
-  return voip_metric;
-}
-
-TEST_F(RtcpPacketExtendedReportsTest, CreateWithoutReportBlocks) {
-  ExtendedReports xr;
-  xr.SetSenderSsrc(kSenderSsrc);
-
-  rtc::Buffer packet = xr.Build();
-
-  EXPECT_THAT(make_tuple(packet.data(), packet.size()),
-              ElementsAreArray(kEmptyPacket));
-}
-
-TEST_F(RtcpPacketExtendedReportsTest, ParseWithoutReportBlocks) {
-  ExtendedReports parsed;
-  EXPECT_TRUE(test::ParseSinglePacket(kEmptyPacket, &parsed));
-  EXPECT_EQ(kSenderSsrc, parsed.sender_ssrc());
-  EXPECT_FALSE(parsed.rrtr());
-  EXPECT_FALSE(parsed.dlrr());
-  EXPECT_FALSE(parsed.voip_metric());
-}
-
-TEST_F(RtcpPacketExtendedReportsTest, CreateAndParseWithRrtrBlock) {
-  const Rrtr kRrtr = Rand<Rrtr>();
-  ExtendedReports xr;
-  xr.SetSenderSsrc(kSenderSsrc);
-  xr.SetRrtr(kRrtr);
-  rtc::Buffer packet = xr.Build();
-
-  ExtendedReports mparsed;
-  EXPECT_TRUE(test::ParseSinglePacket(packet, &mparsed));
-  const ExtendedReports& parsed = mparsed;
-
-  EXPECT_EQ(kSenderSsrc, parsed.sender_ssrc());
-  EXPECT_EQ(kRrtr, parsed.rrtr());
-}
-
-TEST_F(RtcpPacketExtendedReportsTest, CreateAndParseWithDlrrWithOneSubBlock) {
-  const ReceiveTimeInfo kTimeInfo = Rand<ReceiveTimeInfo>();
-  ExtendedReports xr;
-  xr.SetSenderSsrc(kSenderSsrc);
-  xr.AddDlrrItem(kTimeInfo);
-
-  rtc::Buffer packet = xr.Build();
-
-  ExtendedReports mparsed;
-  EXPECT_TRUE(test::ParseSinglePacket(packet, &mparsed));
-  const ExtendedReports& parsed = mparsed;
-
-  EXPECT_EQ(kSenderSsrc, parsed.sender_ssrc());
-  EXPECT_THAT(parsed.dlrr().sub_blocks(), ElementsAre(kTimeInfo));
-}
-
-TEST_F(RtcpPacketExtendedReportsTest, CreateAndParseWithDlrrWithTwoSubBlocks) {
-  const ReceiveTimeInfo kTimeInfo1 = Rand<ReceiveTimeInfo>();
-  const ReceiveTimeInfo kTimeInfo2 = Rand<ReceiveTimeInfo>();
-  ExtendedReports xr;
-  xr.SetSenderSsrc(kSenderSsrc);
-  xr.AddDlrrItem(kTimeInfo1);
-  xr.AddDlrrItem(kTimeInfo2);
-
-  rtc::Buffer packet = xr.Build();
-
-  ExtendedReports mparsed;
-  EXPECT_TRUE(test::ParseSinglePacket(packet, &mparsed));
-  const ExtendedReports& parsed = mparsed;
-
-  EXPECT_EQ(kSenderSsrc, parsed.sender_ssrc());
-  EXPECT_THAT(parsed.dlrr().sub_blocks(), ElementsAre(kTimeInfo1, kTimeInfo2));
-}
-
-TEST_F(RtcpPacketExtendedReportsTest, CreateAndParseWithVoipMetric) {
-  const VoipMetric kVoipMetric = Rand<VoipMetric>();
-
-  ExtendedReports xr;
-  xr.SetSenderSsrc(kSenderSsrc);
-  xr.SetVoipMetric(kVoipMetric);
-
-  rtc::Buffer packet = xr.Build();
-
-  ExtendedReports mparsed;
-  EXPECT_TRUE(test::ParseSinglePacket(packet, &mparsed));
-  const ExtendedReports& parsed = mparsed;
-
-  EXPECT_EQ(kSenderSsrc, parsed.sender_ssrc());
-  EXPECT_EQ(kVoipMetric, parsed.voip_metric());
-}
-
-TEST_F(RtcpPacketExtendedReportsTest, CreateAndParseWithMultipleReportBlocks) {
-  const Rrtr kRrtr = Rand<Rrtr>();
-  const ReceiveTimeInfo kTimeInfo = Rand<ReceiveTimeInfo>();
-  const VoipMetric kVoipMetric = Rand<VoipMetric>();
-
-  ExtendedReports xr;
-  xr.SetSenderSsrc(kSenderSsrc);
-  xr.SetRrtr(kRrtr);
-  xr.AddDlrrItem(kTimeInfo);
-  xr.SetVoipMetric(kVoipMetric);
-
-  rtc::Buffer packet = xr.Build();
-
-  ExtendedReports mparsed;
-  EXPECT_TRUE(test::ParseSinglePacket(packet, &mparsed));
-  const ExtendedReports& parsed = mparsed;
-
-  EXPECT_EQ(kSenderSsrc, parsed.sender_ssrc());
-  EXPECT_EQ(kRrtr, parsed.rrtr());
-  EXPECT_THAT(parsed.dlrr().sub_blocks(), ElementsAre(kTimeInfo));
-  EXPECT_EQ(kVoipMetric, parsed.voip_metric());
-}
-
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/rtcp_packet/fir.cc b/modules/rtp_rtcp/source/rtcp_packet/fir.cc
deleted file mode 100644
index 5beb16f..0000000
--- a/modules/rtp_rtcp/source/rtcp_packet/fir.cc
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- *  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/rtp_rtcp/source/rtcp_packet/fir.h"
-
-#include "webrtc/modules/rtp_rtcp/source/byte_io.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/common_header.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-
-namespace webrtc {
-namespace rtcp {
-constexpr uint8_t Fir::kFeedbackMessageType;
-// RFC 4585: Feedback format.
-// Common packet format:
-//
-//   0                   1                   2                   3
-//   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
-//  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//  |V=2|P|   FMT   |       PT      |          length               |
-//  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//  |                  SSRC of packet sender                        |
-//  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//  |             SSRC of media source (unused) = 0                 |
-//  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//  :            Feedback Control Information (FCI)                 :
-//  :                                                               :
-// Full intra request (FIR) (RFC 5104).
-// The Feedback Control Information (FCI) for the Full Intra Request
-// consists of one or more FCI entries.
-// FCI:
-//   0                   1                   2                   3
-//   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
-//  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//  |                              SSRC                             |
-//  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//  | Seq nr.       |    Reserved = 0                               |
-//  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-
-Fir::Fir() = default;
-
-Fir::~Fir() = default;
-
-bool Fir::Parse(const CommonHeader& packet) {
-  RTC_DCHECK_EQ(packet.type(), kPacketType);
-  RTC_DCHECK_EQ(packet.fmt(), kFeedbackMessageType);
-
-  // The FCI field MUST contain one or more FIR entries.
-  if (packet.payload_size_bytes() < kCommonFeedbackLength + kFciLength) {
-    LOG(LS_WARNING) << "Packet is too small to be a valid FIR packet.";
-    return false;
-  }
-
-  if ((packet.payload_size_bytes() - kCommonFeedbackLength) % kFciLength != 0) {
-    LOG(LS_WARNING) << "Invalid size for a valid FIR packet.";
-    return false;
-  }
-
-  ParseCommonFeedback(packet.payload());
-
-  size_t number_of_fci_items =
-      (packet.payload_size_bytes() - kCommonFeedbackLength) / kFciLength;
-  const uint8_t* next_fci = packet.payload() + kCommonFeedbackLength;
-  items_.resize(number_of_fci_items);
-  for (Request& request : items_) {
-    request.ssrc = ByteReader<uint32_t>::ReadBigEndian(next_fci);
-    request.seq_nr = ByteReader<uint8_t>::ReadBigEndian(next_fci + 4);
-    next_fci += kFciLength;
-  }
-  return true;
-}
-
-size_t Fir::BlockLength() const {
-  return kHeaderLength + kCommonFeedbackLength + kFciLength * items_.size();
-}
-
-bool Fir::Create(uint8_t* packet,
-                 size_t* index,
-                 size_t max_length,
-                 RtcpPacket::PacketReadyCallback* callback) const {
-  RTC_DCHECK(!items_.empty());
-  while (*index + BlockLength() > max_length) {
-    if (!OnBufferFull(packet, index, callback))
-      return false;
-  }
-  size_t index_end = *index + BlockLength();
-  CreateHeader(kFeedbackMessageType, kPacketType, HeaderLength(), packet,
-               index);
-  RTC_DCHECK_EQ(Psfb::media_ssrc(), 0);
-  CreateCommonFeedback(packet + *index);
-  *index += kCommonFeedbackLength;
-
-  constexpr uint32_t kReserved = 0;
-  for (const Request& request : items_) {
-    ByteWriter<uint32_t>::WriteBigEndian(packet + *index, request.ssrc);
-    ByteWriter<uint8_t>::WriteBigEndian(packet + *index + 4, request.seq_nr);
-    ByteWriter<uint32_t, 3>::WriteBigEndian(packet + *index + 5, kReserved);
-    *index += kFciLength;
-  }
-  RTC_CHECK_EQ(*index, index_end);
-  return true;
-}
-}  // namespace rtcp
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/rtcp_packet/fir.h b/modules/rtp_rtcp/source/rtcp_packet/fir.h
deleted file mode 100644
index 0f11697..0000000
--- a/modules/rtp_rtcp/source/rtcp_packet/fir.h
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- *  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_RTP_RTCP_SOURCE_RTCP_PACKET_FIR_H_
-#define WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_PACKET_FIR_H_
-
-#include <vector>
-
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/psfb.h"
-#include "webrtc/rtc_base/basictypes.h"
-
-namespace webrtc {
-namespace rtcp {
-class CommonHeader;
-// Full intra request (FIR) (RFC 5104).
-class Fir : public Psfb {
- public:
-  static constexpr uint8_t kFeedbackMessageType = 4;
-  struct Request {
-    Request() : ssrc(0), seq_nr(0) {}
-    Request(uint32_t ssrc, uint8_t seq_nr) : ssrc(ssrc), seq_nr(seq_nr) {}
-    uint32_t ssrc;
-    uint8_t seq_nr;
-  };
-
-  Fir();
-  ~Fir() override;
-
-  // Parse assumes header is already parsed and validated.
-  bool Parse(const CommonHeader& packet);
-
-  void AddRequestTo(uint32_t ssrc, uint8_t seq_num) {
-    items_.emplace_back(ssrc, seq_num);
-  }
-  const std::vector<Request>& requests() const { return items_; }
-
-  size_t BlockLength() const override;
-
-  bool Create(uint8_t* packet,
-              size_t* index,
-              size_t max_length,
-              RtcpPacket::PacketReadyCallback* callback) const override;
-
- private:
-  static constexpr size_t kFciLength = 8;
-
-  // SSRC of media source is not used in FIR packet. Shadow base functions.
-  void SetMediaSsrc(uint32_t ssrc);
-  uint32_t media_ssrc() const;
-
-  std::vector<Request> items_;
-};
-}  // namespace rtcp
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_PACKET_FIR_H_
diff --git a/modules/rtp_rtcp/source/rtcp_packet/fir_unittest.cc b/modules/rtp_rtcp/source/rtcp_packet/fir_unittest.cc
deleted file mode 100644
index 7680fcb..0000000
--- a/modules/rtp_rtcp/source/rtcp_packet/fir_unittest.cc
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- *  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/rtp_rtcp/source/rtcp_packet/fir.h"
-
-#include "webrtc/test/gmock.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/rtcp_packet_parser.h"
-
-using testing::AllOf;
-using testing::ElementsAre;
-using testing::ElementsAreArray;
-using testing::Eq;
-using testing::Field;
-using testing::make_tuple;
-using webrtc::rtcp::Fir;
-
-namespace webrtc {
-namespace {
-
-constexpr uint32_t kSenderSsrc = 0x12345678;
-constexpr uint32_t kRemoteSsrc = 0x23456789;
-constexpr uint8_t kSeqNr = 13;
-// Manually created Fir packet matching constants above.
-constexpr uint8_t kPacket[] = {0x84,  206, 0x00, 0x04,
-                               0x12, 0x34, 0x56, 0x78,
-                               0x00, 0x00, 0x00, 0x00,
-                               0x23, 0x45, 0x67, 0x89,
-                               0x0d, 0x00, 0x00, 0x00};
-}  // namespace
-
-TEST(RtcpPacketFirTest, Parse) {
-  Fir mutable_parsed;
-  EXPECT_TRUE(test::ParseSinglePacket(kPacket, &mutable_parsed));
-  const Fir& parsed = mutable_parsed;  // Read values from constant object.
-
-  EXPECT_EQ(kSenderSsrc, parsed.sender_ssrc());
-  EXPECT_THAT(parsed.requests(),
-              ElementsAre(AllOf(Field(&Fir::Request::ssrc, Eq(kRemoteSsrc)),
-                                Field(&Fir::Request::seq_nr, Eq(kSeqNr)))));
-}
-
-TEST(RtcpPacketFirTest, Create) {
-  Fir fir;
-  fir.SetSenderSsrc(kSenderSsrc);
-  fir.AddRequestTo(kRemoteSsrc, kSeqNr);
-
-  rtc::Buffer packet = fir.Build();
-
-  EXPECT_THAT(make_tuple(packet.data(), packet.size()),
-              ElementsAreArray(kPacket));
-}
-
-TEST(RtcpPacketFirTest, TwoFciEntries) {
-  Fir fir;
-  fir.SetSenderSsrc(kSenderSsrc);
-  fir.AddRequestTo(kRemoteSsrc, kSeqNr);
-  fir.AddRequestTo(kRemoteSsrc + 1, kSeqNr + 1);
-
-  rtc::Buffer packet = fir.Build();
-  Fir parsed;
-  EXPECT_TRUE(test::ParseSinglePacket(packet, &parsed));
-
-  EXPECT_EQ(kSenderSsrc, parsed.sender_ssrc());
-  EXPECT_THAT(parsed.requests(),
-              ElementsAre(AllOf(Field(&Fir::Request::ssrc, Eq(kRemoteSsrc)),
-                                Field(&Fir::Request::seq_nr, Eq(kSeqNr))),
-                          AllOf(Field(&Fir::Request::ssrc, Eq(kRemoteSsrc + 1)),
-                                Field(&Fir::Request::seq_nr, Eq(kSeqNr + 1)))));
-}
-
-TEST(RtcpPacketFirTest, ParseFailsOnZeroFciEntries) {
-  constexpr uint8_t kPacketWithoutFci[] = {0x84,  206, 0x00, 0x02,
-                                           0x12, 0x34, 0x56, 0x78,
-                                           0x00, 0x00, 0x00, 0x00};
-  Fir parsed;
-  EXPECT_FALSE(test::ParseSinglePacket(kPacketWithoutFci, &parsed));
-}
-
-TEST(RtcpPacketFirTest, ParseFailsOnFractionalFciEntries) {
-  constexpr uint8_t kPacketWithOneAndHalfFci[] = {0x84,  206, 0x00, 0x05,
-                                                  0x12, 0x34, 0x56, 0x78,
-                                                  0x00, 0x00, 0x00, 0x00,
-                                                  0x23, 0x45, 0x67, 0x89,
-                                                  0x0d, 0x00, 0x00, 0x00,
-                                                   'h',  'a',  'l',  'f'};
-
-  Fir parsed;
-  EXPECT_FALSE(test::ParseSinglePacket(kPacketWithOneAndHalfFci, &parsed));
-}
-
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/rtcp_packet/nack.cc b/modules/rtp_rtcp/source/rtcp_packet/nack.cc
deleted file mode 100644
index 478f8dc..0000000
--- a/modules/rtp_rtcp/source/rtcp_packet/nack.cc
+++ /dev/null
@@ -1,169 +0,0 @@
-/*
- *  Copyright (c) 2015 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/rtp_rtcp/source/rtcp_packet/nack.h"
-
-#include <algorithm>
-
-#include "webrtc/modules/rtp_rtcp/source/byte_io.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/common_header.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-
-namespace webrtc {
-namespace rtcp {
-constexpr uint8_t Nack::kFeedbackMessageType;
-constexpr size_t Nack::kNackItemLength;
-// RFC 4585: Feedback format.
-//
-// Common packet format:
-//
-//    0                   1                   2                   3
-//    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
-//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//   |V=2|P|   FMT   |       PT      |          length               |
-//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-// 0 |                  SSRC of packet sender                        |
-//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-// 4 |                  SSRC of media source                         |
-//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//   :            Feedback Control Information (FCI)                 :
-//   :                                                               :
-//
-// Generic NACK (RFC 4585).
-//
-// FCI:
-//    0                   1                   2                   3
-//    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
-//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//   |            PID                |             BLP               |
-//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-Nack::Nack() {}
-Nack::~Nack() {}
-
-bool Nack::Parse(const CommonHeader& packet) {
-  RTC_DCHECK_EQ(packet.type(), kPacketType);
-  RTC_DCHECK_EQ(packet.fmt(), kFeedbackMessageType);
-
-  if (packet.payload_size_bytes() < kCommonFeedbackLength + kNackItemLength) {
-    LOG(LS_WARNING) << "Payload length " << packet.payload_size_bytes()
-                    << " is too small for a Nack.";
-    return false;
-  }
-  size_t nack_items =
-      (packet.payload_size_bytes() - kCommonFeedbackLength) / kNackItemLength;
-
-  ParseCommonFeedback(packet.payload());
-  const uint8_t* next_nack = packet.payload() + kCommonFeedbackLength;
-
-  packet_ids_.clear();
-  packed_.resize(nack_items);
-  for (size_t index = 0; index < nack_items; ++index) {
-    packed_[index].first_pid = ByteReader<uint16_t>::ReadBigEndian(next_nack);
-    packed_[index].bitmask = ByteReader<uint16_t>::ReadBigEndian(next_nack + 2);
-    next_nack += kNackItemLength;
-  }
-  Unpack();
-
-  return true;
-}
-
-size_t Nack::BlockLength() const {
-  return kHeaderLength + kCommonFeedbackLength +
-         packed_.size() * kNackItemLength;
-}
-
-bool Nack::Create(uint8_t* packet,
-                  size_t* index,
-                  size_t max_length,
-                  RtcpPacket::PacketReadyCallback* callback) const {
-  RTC_DCHECK(!packed_.empty());
-  // If nack list can't fit in packet, try to fragment.
-  constexpr size_t kNackHeaderLength = kHeaderLength + kCommonFeedbackLength;
-  for (size_t nack_index = 0; nack_index < packed_.size();) {
-    size_t bytes_left_in_buffer = max_length - *index;
-    if (bytes_left_in_buffer < kNackHeaderLength + kNackItemLength) {
-      if (!OnBufferFull(packet, index, callback))
-        return false;
-      continue;
-    }
-    size_t num_nack_fields =
-        std::min((bytes_left_in_buffer - kNackHeaderLength) / kNackItemLength,
-                 packed_.size() - nack_index);
-
-    size_t payload_size_bytes =
-        kCommonFeedbackLength + (num_nack_fields * kNackItemLength);
-    size_t payload_size_32bits =
-        rtc::CheckedDivExact<size_t>(payload_size_bytes, 4);
-    CreateHeader(kFeedbackMessageType, kPacketType, payload_size_32bits, packet,
-                 index);
-
-    CreateCommonFeedback(packet + *index);
-    *index += kCommonFeedbackLength;
-
-    size_t nack_end_index = nack_index + num_nack_fields;
-    for (; nack_index < nack_end_index; ++nack_index) {
-      const PackedNack& item = packed_[nack_index];
-      ByteWriter<uint16_t>::WriteBigEndian(packet + *index + 0, item.first_pid);
-      ByteWriter<uint16_t>::WriteBigEndian(packet + *index + 2, item.bitmask);
-      *index += kNackItemLength;
-    }
-    RTC_DCHECK_LE(*index, max_length);
-  }
-
-  return true;
-}
-
-void Nack::SetPacketIds(const uint16_t* nack_list, size_t length) {
-  RTC_DCHECK(nack_list);
-  RTC_DCHECK(packet_ids_.empty());
-  RTC_DCHECK(packed_.empty());
-  packet_ids_.assign(nack_list, nack_list + length);
-  Pack();
-}
-
-void Nack::Pack() {
-  RTC_DCHECK(!packet_ids_.empty());
-  RTC_DCHECK(packed_.empty());
-  auto it = packet_ids_.begin();
-  const auto end = packet_ids_.end();
-  while (it != end) {
-    PackedNack item;
-    item.first_pid = *it++;
-    // Bitmask specifies losses in any of the 16 packets following the pid.
-    item.bitmask = 0;
-    while (it != end) {
-      uint16_t shift = static_cast<uint16_t>(*it - item.first_pid - 1);
-      if (shift <= 15) {
-        item.bitmask |= (1 << shift);
-        ++it;
-      } else {
-        break;
-      }
-    }
-    packed_.push_back(item);
-  }
-}
-
-void Nack::Unpack() {
-  RTC_DCHECK(packet_ids_.empty());
-  RTC_DCHECK(!packed_.empty());
-  for (const PackedNack& item : packed_) {
-    packet_ids_.push_back(item.first_pid);
-    uint16_t pid = item.first_pid + 1;
-    for (uint16_t bitmask = item.bitmask; bitmask != 0; bitmask >>= 1, ++pid) {
-      if (bitmask & 1)
-        packet_ids_.push_back(pid);
-    }
-  }
-}
-
-}  // namespace rtcp
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/rtcp_packet/nack.h b/modules/rtp_rtcp/source/rtcp_packet/nack.h
deleted file mode 100644
index 44d0f74..0000000
--- a/modules/rtp_rtcp/source/rtcp_packet/nack.h
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- *  Copyright (c) 2015 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_RTP_RTCP_SOURCE_RTCP_PACKET_NACK_H_
-#define WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_PACKET_NACK_H_
-
-#include <vector>
-
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/rtpfb.h"
-#include "webrtc/rtc_base/basictypes.h"
-
-namespace webrtc {
-namespace rtcp {
-class CommonHeader;
-
-class Nack : public Rtpfb {
- public:
-  static constexpr uint8_t kFeedbackMessageType = 1;
-  Nack();
-  ~Nack() override;
-
-  // Parse assumes header is already parsed and validated.
-  bool Parse(const CommonHeader& packet);
-
-  void SetPacketIds(const uint16_t* nack_list, size_t length);
-  const std::vector<uint16_t>& packet_ids() const { return packet_ids_; }
-
-  size_t BlockLength() const override;
-
-  bool Create(uint8_t* packet,
-              size_t* index,
-              size_t max_length,
-              RtcpPacket::PacketReadyCallback* callback) const override;
-
- private:
-  static constexpr size_t kNackItemLength = 4;
-  struct PackedNack {
-    uint16_t first_pid;
-    uint16_t bitmask;
-  };
-
-  void Pack();    // Fills packed_ using packed_ids_. (used in SetPacketIds).
-  void Unpack();  // Fills packet_ids_ using packed_. (used in Parse).
-
-  std::vector<PackedNack> packed_;
-  std::vector<uint16_t> packet_ids_;
-};
-
-}  // namespace rtcp
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_PACKET_NACK_H_
diff --git a/modules/rtp_rtcp/source/rtcp_packet/nack_unittest.cc b/modules/rtp_rtcp/source/rtcp_packet/nack_unittest.cc
deleted file mode 100644
index f523598..0000000
--- a/modules/rtp_rtcp/source/rtcp_packet/nack_unittest.cc
+++ /dev/null
@@ -1,178 +0,0 @@
-/*
- *  Copyright (c) 2015 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/rtp_rtcp/source/rtcp_packet/nack.h"
-
-#include "webrtc/test/gmock.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/rtcp_packet_parser.h"
-
-namespace webrtc {
-namespace {
-
-using ::testing::_;
-using ::testing::ElementsAreArray;
-using ::testing::Invoke;
-using ::testing::make_tuple;
-using ::testing::UnorderedElementsAreArray;
-using ::webrtc::rtcp::Nack;
-
-constexpr uint32_t kSenderSsrc = 0x12345678;
-constexpr uint32_t kRemoteSsrc = 0x23456789;
-
-constexpr uint16_t kList[] = {0, 1, 3, 8, 16};
-constexpr size_t kListLength = sizeof(kList) / sizeof(kList[0]);
-constexpr uint8_t kVersionBits = 2 << 6;
-// clang-format off
-constexpr uint8_t kPacket[] = {
-    kVersionBits | Nack::kFeedbackMessageType, Nack::kPacketType, 0, 3,
-    0x12, 0x34, 0x56, 0x78,
-    0x23, 0x45, 0x67, 0x89,
-    0x00, 0x00, 0x80, 0x85};
-
-constexpr uint16_t kWrapList[] = {0xffdc, 0xffec, 0xfffe, 0xffff, 0x0000,
-                                  0x0001, 0x0003, 0x0014, 0x0064};
-constexpr size_t kWrapListLength = sizeof(kWrapList) / sizeof(kWrapList[0]);
-constexpr uint8_t kWrapPacket[] = {
-    kVersionBits | Nack::kFeedbackMessageType, Nack::kPacketType, 0, 6,
-    0x12, 0x34, 0x56, 0x78,
-    0x23, 0x45, 0x67, 0x89,
-    0xff, 0xdc, 0x80, 0x00,
-    0xff, 0xfe, 0x00, 0x17,
-    0x00, 0x14, 0x00, 0x00,
-    0x00, 0x64, 0x00, 0x00};
-constexpr uint8_t kTooSmallPacket[] = {
-    kVersionBits | Nack::kFeedbackMessageType, Nack::kPacketType, 0, 2,
-    0x12, 0x34, 0x56, 0x78,
-    0x23, 0x45, 0x67, 0x89};
-// clang-format on
-}  // namespace
-
-TEST(RtcpPacketNackTest, Create) {
-  Nack nack;
-  nack.SetSenderSsrc(kSenderSsrc);
-  nack.SetMediaSsrc(kRemoteSsrc);
-  nack.SetPacketIds(kList, kListLength);
-
-  rtc::Buffer packet = nack.Build();
-
-  EXPECT_THAT(make_tuple(packet.data(), packet.size()),
-              ElementsAreArray(kPacket));
-}
-
-TEST(RtcpPacketNackTest, Parse) {
-  Nack parsed;
-  EXPECT_TRUE(test::ParseSinglePacket(kPacket, &parsed));
-  const Nack& const_parsed = parsed;
-
-  EXPECT_EQ(kSenderSsrc, const_parsed.sender_ssrc());
-  EXPECT_EQ(kRemoteSsrc, const_parsed.media_ssrc());
-  EXPECT_THAT(const_parsed.packet_ids(), ElementsAreArray(kList));
-}
-
-TEST(RtcpPacketNackTest, CreateWrap) {
-  Nack nack;
-  nack.SetSenderSsrc(kSenderSsrc);
-  nack.SetMediaSsrc(kRemoteSsrc);
-  nack.SetPacketIds(kWrapList, kWrapListLength);
-
-  rtc::Buffer packet = nack.Build();
-
-  EXPECT_THAT(make_tuple(packet.data(), packet.size()),
-              ElementsAreArray(kWrapPacket));
-}
-
-TEST(RtcpPacketNackTest, ParseWrap) {
-  Nack parsed;
-  EXPECT_TRUE(test::ParseSinglePacket(kWrapPacket, &parsed));
-
-  EXPECT_EQ(kSenderSsrc, parsed.sender_ssrc());
-  EXPECT_EQ(kRemoteSsrc, parsed.media_ssrc());
-  EXPECT_THAT(parsed.packet_ids(), ElementsAreArray(kWrapList));
-}
-
-TEST(RtcpPacketNackTest, BadOrder) {
-  // Does not guarantee optimal packing, but should guarantee correctness.
-  const uint16_t kUnorderedList[] = {1, 25, 13, 12, 9, 27, 29};
-  const size_t kUnorderedListLength =
-      sizeof(kUnorderedList) / sizeof(kUnorderedList[0]);
-  Nack nack;
-  nack.SetSenderSsrc(kSenderSsrc);
-  nack.SetMediaSsrc(kRemoteSsrc);
-  nack.SetPacketIds(kUnorderedList, kUnorderedListLength);
-
-  rtc::Buffer packet = nack.Build();
-
-  Nack parsed;
-  EXPECT_TRUE(test::ParseSinglePacket(packet, &parsed));
-
-  EXPECT_EQ(kSenderSsrc, parsed.sender_ssrc());
-  EXPECT_EQ(kRemoteSsrc, parsed.media_ssrc());
-  EXPECT_THAT(parsed.packet_ids(), UnorderedElementsAreArray(kUnorderedList));
-}
-
-TEST(RtcpPacketNackTest, CreateFragmented) {
-  Nack nack;
-  const uint16_t kList[] = {1, 100, 200, 300, 400};
-  const uint16_t kListLength = sizeof(kList) / sizeof(kList[0]);
-  nack.SetSenderSsrc(kSenderSsrc);
-  nack.SetMediaSsrc(kRemoteSsrc);
-  nack.SetPacketIds(kList, kListLength);
-
-  class MockPacketReadyCallback : public rtcp::RtcpPacket::PacketReadyCallback {
-   public:
-    MOCK_METHOD2(OnPacketReady, void(uint8_t*, size_t));
-  } verifier;
-
-  class NackVerifier {
-   public:
-    explicit NackVerifier(std::vector<uint16_t> ids) : ids_(ids) {}
-    void operator()(uint8_t* data, size_t length) {
-      Nack nack;
-      EXPECT_TRUE(test::ParseSinglePacket(data, length, &nack));
-      EXPECT_EQ(kSenderSsrc, nack.sender_ssrc());
-      EXPECT_EQ(kRemoteSsrc, nack.media_ssrc());
-      EXPECT_THAT(nack.packet_ids(), ElementsAreArray(ids_));
-    }
-    std::vector<uint16_t> ids_;
-  } packet1({1, 100, 200}), packet2({300, 400});
-
-  EXPECT_CALL(verifier, OnPacketReady(_, _))
-      .WillOnce(Invoke(packet1))
-      .WillOnce(Invoke(packet2));
-  const size_t kBufferSize = 12 + (3 * 4);  // Fits common header + 3 nack items
-  uint8_t buffer[kBufferSize];
-  EXPECT_TRUE(nack.BuildExternalBuffer(buffer, kBufferSize, &verifier));
-}
-
-TEST(RtcpPacketNackTest, CreateFailsWithTooSmallBuffer) {
-  const uint16_t kList[] = {1};
-  const size_t kMinNackBlockSize = 16;
-  Nack nack;
-  nack.SetSenderSsrc(kSenderSsrc);
-  nack.SetMediaSsrc(kRemoteSsrc);
-  nack.SetPacketIds(kList, 1);
-  class Verifier : public rtcp::RtcpPacket::PacketReadyCallback {
-   public:
-    void OnPacketReady(uint8_t* data, size_t length) override {
-      ADD_FAILURE() << "Buffer should be too small.";
-    }
-  } verifier;
-  uint8_t buffer[kMinNackBlockSize - 1];
-  EXPECT_FALSE(
-      nack.BuildExternalBuffer(buffer, kMinNackBlockSize - 1, &verifier));
-}
-
-TEST(RtcpPacketNackTest, ParseFailsWithTooSmallBuffer) {
-  Nack parsed;
-  EXPECT_FALSE(test::ParseSinglePacket(kTooSmallPacket, &parsed));
-}
-
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/rtcp_packet/pli.cc b/modules/rtp_rtcp/source/rtcp_packet/pli.cc
deleted file mode 100644
index 3db3394..0000000
--- a/modules/rtp_rtcp/source/rtcp_packet/pli.cc
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- *  Copyright (c) 2015 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/rtp_rtcp/source/rtcp_packet/pli.h"
-
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/common_header.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-
-namespace webrtc {
-namespace rtcp {
-constexpr uint8_t Pli::kFeedbackMessageType;
-// RFC 4585: Feedback format.
-//
-// Common packet format:
-//
-//   0                   1                   2                   3
-//   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
-//  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//  |V=2|P|   FMT   |       PT      |          length               |
-//  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//  |                  SSRC of packet sender                        |
-//  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//  |                  SSRC of media source                         |
-//  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//  :            Feedback Control Information (FCI)                 :
-//  :                                                               :
-
-//
-// Picture loss indication (PLI) (RFC 4585).
-// FCI: no feedback control information.
-bool Pli::Parse(const CommonHeader& packet) {
-  RTC_DCHECK_EQ(packet.type(), kPacketType);
-  RTC_DCHECK_EQ(packet.fmt(), kFeedbackMessageType);
-
-  if (packet.payload_size_bytes() < kCommonFeedbackLength) {
-    LOG(LS_WARNING) << "Packet is too small to be a valid PLI packet";
-    return false;
-  }
-
-  ParseCommonFeedback(packet.payload());
-  return true;
-}
-
-size_t Pli::BlockLength() const {
-  return kHeaderLength + kCommonFeedbackLength;
-}
-
-bool Pli::Create(uint8_t* packet,
-                 size_t* index,
-                 size_t max_length,
-                 RtcpPacket::PacketReadyCallback* callback) const {
-  while (*index + BlockLength() > max_length) {
-    if (!OnBufferFull(packet, index, callback))
-      return false;
-  }
-
-  CreateHeader(kFeedbackMessageType, kPacketType, HeaderLength(), packet,
-               index);
-  CreateCommonFeedback(packet + *index);
-  *index += kCommonFeedbackLength;
-  return true;
-}
-
-}  // namespace rtcp
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/rtcp_packet/pli.h b/modules/rtp_rtcp/source/rtcp_packet/pli.h
deleted file mode 100644
index e464891..0000000
--- a/modules/rtp_rtcp/source/rtcp_packet/pli.h
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- *  Copyright (c) 2015 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_RTP_RTCP_SOURCE_RTCP_PACKET_PLI_H_
-#define WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_PACKET_PLI_H_
-
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/psfb.h"
-#include "webrtc/rtc_base/basictypes.h"
-
-namespace webrtc {
-namespace rtcp {
-class CommonHeader;
-// Picture loss indication (PLI) (RFC 4585).
-class Pli : public Psfb {
- public:
-  static constexpr uint8_t kFeedbackMessageType = 1;
-
-  Pli() {}
-  ~Pli() override {}
-
-  bool Parse(const CommonHeader& packet);
-
-  size_t BlockLength() const override;
-
-  bool Create(uint8_t* packet,
-              size_t* index,
-              size_t max_length,
-              RtcpPacket::PacketReadyCallback* callback) const override;
-};
-
-}  // namespace rtcp
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_PACKET_PLI_H_
diff --git a/modules/rtp_rtcp/source/rtcp_packet/pli_unittest.cc b/modules/rtp_rtcp/source/rtcp_packet/pli_unittest.cc
deleted file mode 100644
index 8aba81b..0000000
--- a/modules/rtp_rtcp/source/rtcp_packet/pli_unittest.cc
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- *  Copyright (c) 2015 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/rtp_rtcp/source/rtcp_packet/pli.h"
-
-#include "webrtc/test/gmock.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/rtcp_packet_parser.h"
-
-using testing::ElementsAreArray;
-using testing::make_tuple;
-using webrtc::rtcp::Pli;
-
-namespace webrtc {
-namespace {
-const uint32_t kSenderSsrc = 0x12345678;
-const uint32_t kRemoteSsrc = 0x23456789;
-// Manually created Pli packet matching constants above.
-const uint8_t kPacket[] = {0x81, 206,  0x00, 0x02,
-                           0x12, 0x34, 0x56, 0x78,
-                           0x23, 0x45, 0x67, 0x89};
-}  // namespace
-
-TEST(RtcpPacketPliTest, Parse) {
-  Pli mutable_parsed;
-  EXPECT_TRUE(test::ParseSinglePacket(kPacket, &mutable_parsed));
-  const Pli& parsed = mutable_parsed;  // Read values from constant object.
-
-  EXPECT_EQ(kSenderSsrc, parsed.sender_ssrc());
-  EXPECT_EQ(kRemoteSsrc, parsed.media_ssrc());
-}
-
-TEST(RtcpPacketPliTest, Create) {
-  Pli pli;
-  pli.SetSenderSsrc(kSenderSsrc);
-  pli.SetMediaSsrc(kRemoteSsrc);
-
-  rtc::Buffer packet = pli.Build();
-
-  EXPECT_THAT(make_tuple(packet.data(), packet.size()),
-      ElementsAreArray(kPacket));
-}
-
-TEST(RtcpPacketPliTest, ParseFailsOnTooSmallPacket) {
-  const uint8_t kTooSmallPacket[] = {0x81, 206,  0x00, 0x01,
-                                     0x12, 0x34, 0x56, 0x78};
-
-  Pli parsed;
-  EXPECT_FALSE(test::ParseSinglePacket(kTooSmallPacket, &parsed));
-}
-
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/rtcp_packet/psfb.cc b/modules/rtp_rtcp/source/rtcp_packet/psfb.cc
deleted file mode 100644
index 0a9e4a3..0000000
--- a/modules/rtp_rtcp/source/rtcp_packet/psfb.cc
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- *  Copyright (c) 2015 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/rtp_rtcp/source/rtcp_packet/psfb.h"
-
-#include "webrtc/modules/rtp_rtcp/source/byte_io.h"
-
-namespace webrtc {
-namespace rtcp {
-constexpr uint8_t Psfb::kPacketType;
-constexpr size_t Psfb::kCommonFeedbackLength;
-// RFC 4585: Feedback format.
-//
-// Common packet format:
-//
-//    0                   1                   2                   3
-//    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
-//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//   |V=2|P|   FMT   |       PT      |          length               |
-//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-// 0 |                  SSRC of packet sender                        |
-//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-// 4 |                  SSRC of media source                         |
-//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//   :            Feedback Control Information (FCI)                 :
-//   :                                                               :
-
-void Psfb::ParseCommonFeedback(const uint8_t* payload) {
-  sender_ssrc_ = ByteReader<uint32_t>::ReadBigEndian(&payload[0]);
-  media_ssrc_ = ByteReader<uint32_t>::ReadBigEndian(&payload[4]);
-}
-
-void Psfb::CreateCommonFeedback(uint8_t* payload) const {
-  ByteWriter<uint32_t>::WriteBigEndian(&payload[0], sender_ssrc_);
-  ByteWriter<uint32_t>::WriteBigEndian(&payload[4], media_ssrc_);
-}
-
-}  // namespace rtcp
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/rtcp_packet/psfb.h b/modules/rtp_rtcp/source/rtcp_packet/psfb.h
deleted file mode 100644
index 96ad413..0000000
--- a/modules/rtp_rtcp/source/rtcp_packet/psfb.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- *  Copyright (c) 2015 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_RTP_RTCP_SOURCE_RTCP_PACKET_PSFB_H_
-#define WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_PACKET_PSFB_H_
-
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet.h"
-#include "webrtc/rtc_base/basictypes.h"
-
-namespace webrtc {
-namespace rtcp {
-
-// PSFB: Payload-specific feedback message.
-// RFC 4585, Section 6.3.
-class Psfb : public RtcpPacket {
- public:
-  static constexpr uint8_t kPacketType = 206;
-
-  Psfb() : sender_ssrc_(0), media_ssrc_(0) {}
-  ~Psfb() override {}
-
-  void SetSenderSsrc(uint32_t ssrc) { sender_ssrc_ = ssrc; }
-  void SetMediaSsrc(uint32_t ssrc) { media_ssrc_ = ssrc; }
-
-  uint32_t sender_ssrc() const { return sender_ssrc_; }
-  uint32_t media_ssrc() const { return media_ssrc_; }
-
- protected:
-  static constexpr size_t kCommonFeedbackLength = 8;
-  void ParseCommonFeedback(const uint8_t* payload);
-  void CreateCommonFeedback(uint8_t* payload) const;
-
- private:
-  uint32_t sender_ssrc_;
-  uint32_t media_ssrc_;
-};
-
-}  // namespace rtcp
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_PACKET_PSFB_H_
diff --git a/modules/rtp_rtcp/source/rtcp_packet/rapid_resync_request.cc b/modules/rtp_rtcp/source/rtcp_packet/rapid_resync_request.cc
deleted file mode 100644
index 943c238..0000000
--- a/modules/rtp_rtcp/source/rtcp_packet/rapid_resync_request.cc
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- *  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/rtp_rtcp/source/rtcp_packet/rapid_resync_request.h"
-
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/common_header.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-
-namespace webrtc {
-namespace rtcp {
-constexpr uint8_t RapidResyncRequest::kFeedbackMessageType;
-// RFC 4585: Feedback format.
-// Rapid Resynchronisation Request (draft-perkins-avt-rapid-rtp-sync-03).
-//
-//   0                   1                   2                   3
-//   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
-//  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//  |V=2|P|  FMT=5  |     PT=205    |         length=2              |
-//  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//  |                  SSRC of packet sender                        |
-//  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//  |                  SSRC of media source                         |
-//  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-bool RapidResyncRequest::Parse(const CommonHeader& packet) {
-  RTC_DCHECK_EQ(packet.type(), kPacketType);
-  RTC_DCHECK_EQ(packet.fmt(), kFeedbackMessageType);
-
-  if (packet.payload_size_bytes() != kCommonFeedbackLength) {
-    LOG(LS_WARNING) << "Packet payload size should be " << kCommonFeedbackLength
-                    << " instead of " << packet.payload_size_bytes()
-                    << " to be a valid Rapid Resynchronisation Request";
-    return false;
-  }
-
-  ParseCommonFeedback(packet.payload());
-  return true;
-}
-
-size_t RapidResyncRequest::BlockLength() const {
-  return kHeaderLength + kCommonFeedbackLength;
-}
-
-bool RapidResyncRequest::Create(
-    uint8_t* packet,
-    size_t* index,
-    size_t max_length,
-    RtcpPacket::PacketReadyCallback* callback) const {
-  while (*index + BlockLength() > max_length) {
-    if (!OnBufferFull(packet, index, callback))
-      return false;
-  }
-
-  CreateHeader(kFeedbackMessageType, kPacketType, HeaderLength(), packet,
-               index);
-  CreateCommonFeedback(packet + *index);
-  *index += kCommonFeedbackLength;
-  return true;
-}
-}  // namespace rtcp
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/rtcp_packet/rapid_resync_request.h b/modules/rtp_rtcp/source/rtcp_packet/rapid_resync_request.h
deleted file mode 100644
index 0a11083..0000000
--- a/modules/rtp_rtcp/source/rtcp_packet/rapid_resync_request.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- *  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_RTP_RTCP_SOURCE_RTCP_PACKET_RAPID_RESYNC_REQUEST_H_
-#define WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_PACKET_RAPID_RESYNC_REQUEST_H_
-
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/rtpfb.h"
-#include "webrtc/rtc_base/basictypes.h"
-
-namespace webrtc {
-namespace rtcp {
-class CommonHeader;
-
-// draft-perkins-avt-rapid-rtp-sync-03
-class RapidResyncRequest : public Rtpfb {
- public:
-  static constexpr uint8_t kFeedbackMessageType = 5;
-
-  RapidResyncRequest() {}
-  ~RapidResyncRequest() override {}
-
-  // Parse assumes header is already parsed and validated.
-  bool Parse(const CommonHeader& header);
-
-  size_t BlockLength() const override;
-
-  bool Create(uint8_t* packet,
-              size_t* index,
-              size_t max_length,
-              RtcpPacket::PacketReadyCallback* callback) const override;
-};
-}  // namespace rtcp
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_PACKET_RAPID_RESYNC_REQUEST_H_
diff --git a/modules/rtp_rtcp/source/rtcp_packet/rapid_resync_request_unittest.cc b/modules/rtp_rtcp/source/rtcp_packet/rapid_resync_request_unittest.cc
deleted file mode 100644
index 5564186..0000000
--- a/modules/rtp_rtcp/source/rtcp_packet/rapid_resync_request_unittest.cc
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- *  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/rtp_rtcp/source/rtcp_packet/rapid_resync_request.h"
-
-#include "webrtc/test/gmock.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/rtcp_packet_parser.h"
-
-using testing::ElementsAreArray;
-using testing::make_tuple;
-using webrtc::rtcp::RapidResyncRequest;
-
-namespace webrtc {
-namespace {
-const uint32_t kSenderSsrc = 0x12345678;
-const uint32_t kRemoteSsrc = 0x23456789;
-// Manually created packet matching constants above.
-const uint8_t kPacket[] = {0x85, 205,  0x00, 0x02,
-                           0x12, 0x34, 0x56, 0x78,
-                           0x23, 0x45, 0x67, 0x89};
-}  // namespace
-
-TEST(RtcpPacketRapidResyncRequestTest, Parse) {
-  RapidResyncRequest mutable_parsed;
-  EXPECT_TRUE(test::ParseSinglePacket(kPacket, &mutable_parsed));
-  const RapidResyncRequest& parsed = mutable_parsed;
-
-  EXPECT_EQ(kSenderSsrc, parsed.sender_ssrc());
-  EXPECT_EQ(kRemoteSsrc, parsed.media_ssrc());
-}
-
-TEST(RtcpPacketRapidResyncRequestTest, Create) {
-  RapidResyncRequest rrr;
-  rrr.SetSenderSsrc(kSenderSsrc);
-  rrr.SetMediaSsrc(kRemoteSsrc);
-
-  rtc::Buffer packet = rrr.Build();
-
-  EXPECT_THAT(make_tuple(packet.data(), packet.size()),
-              ElementsAreArray(kPacket));
-}
-
-TEST(RtcpPacketRapidResyncRequestTest, ParseFailsOnTooSmallPacket) {
-  const uint8_t kTooSmallPacket[] = {0x85, 205,  0x00, 0x01,
-                                     0x12, 0x34, 0x56, 0x78};
-  RapidResyncRequest parsed;
-  EXPECT_FALSE(test::ParseSinglePacket(kTooSmallPacket, &parsed));
-}
-
-TEST(RtcpPacketRapidResyncRequestTest, ParseFailsOnTooLargePacket) {
-  const uint8_t kTooLargePacket[] = {0x85, 205,  0x00, 0x03,
-                                     0x12, 0x34, 0x56, 0x78,
-                                     0x32, 0x21, 0x65, 0x87,
-                                     0x23, 0x45, 0x67, 0x89};
-  RapidResyncRequest parsed;
-  EXPECT_FALSE(test::ParseSinglePacket(kTooLargePacket, &parsed));
-}
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/rtcp_packet/receiver_report.cc b/modules/rtp_rtcp/source/rtcp_packet/receiver_report.cc
deleted file mode 100644
index fd67600..0000000
--- a/modules/rtp_rtcp/source/rtcp_packet/receiver_report.cc
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- *  Copyright (c) 2015 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/rtp_rtcp/source/rtcp_packet/receiver_report.h"
-
-#include <utility>
-
-#include "webrtc/modules/rtp_rtcp/source/byte_io.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/common_header.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-
-namespace webrtc {
-namespace rtcp {
-constexpr uint8_t ReceiverReport::kPacketType;
-constexpr size_t ReceiverReport::kMaxNumberOfReportBlocks;
-// RTCP receiver report (RFC 3550).
-//
-//   0                   1                   2                   3
-//   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
-//  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//  |V=2|P|    RC   |   PT=RR=201   |             length            |
-//  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//  |                     SSRC of packet sender                     |
-//  +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
-//  |                         report block(s)                       |
-//  |                            ....                               |
-
-ReceiverReport::ReceiverReport() : sender_ssrc_(0) {}
-
-ReceiverReport::~ReceiverReport() = default;
-
-bool ReceiverReport::Parse(const CommonHeader& packet) {
-  RTC_DCHECK_EQ(packet.type(), kPacketType);
-
-  const uint8_t report_blocks_count = packet.count();
-
-  if (packet.payload_size_bytes() <
-      kRrBaseLength + report_blocks_count * ReportBlock::kLength) {
-    LOG(LS_WARNING) << "Packet is too small to contain all the data.";
-    return false;
-  }
-
-  sender_ssrc_ = ByteReader<uint32_t>::ReadBigEndian(packet.payload());
-
-  const uint8_t* next_report_block = packet.payload() + kRrBaseLength;
-
-  report_blocks_.resize(report_blocks_count);
-  for (ReportBlock& block : report_blocks_) {
-    block.Parse(next_report_block, ReportBlock::kLength);
-    next_report_block += ReportBlock::kLength;
-  }
-
-  RTC_DCHECK_LE(next_report_block - packet.payload(),
-                static_cast<ptrdiff_t>(packet.payload_size_bytes()));
-  return true;
-}
-
-size_t ReceiverReport::BlockLength() const {
-  return kHeaderLength + kRrBaseLength +
-         report_blocks_.size() * ReportBlock::kLength;
-}
-
-bool ReceiverReport::Create(uint8_t* packet,
-                            size_t* index,
-                            size_t max_length,
-                            RtcpPacket::PacketReadyCallback* callback) const {
-  while (*index + BlockLength() > max_length) {
-    if (!OnBufferFull(packet, index, callback))
-      return false;
-  }
-  CreateHeader(report_blocks_.size(), kPacketType, HeaderLength(), packet,
-               index);
-  ByteWriter<uint32_t>::WriteBigEndian(packet + *index, sender_ssrc_);
-  *index += kRrBaseLength;
-  for (const ReportBlock& block : report_blocks_) {
-    block.Create(packet + *index);
-    *index += ReportBlock::kLength;
-  }
-  return true;
-}
-
-bool ReceiverReport::AddReportBlock(const ReportBlock& block) {
-  if (report_blocks_.size() >= kMaxNumberOfReportBlocks) {
-    LOG(LS_WARNING) << "Max report blocks reached.";
-    return false;
-  }
-  report_blocks_.push_back(block);
-  return true;
-}
-
-bool ReceiverReport::SetReportBlocks(std::vector<ReportBlock> blocks) {
-  if (blocks.size() > kMaxNumberOfReportBlocks) {
-    LOG(LS_WARNING) << "Too many report blocks (" << blocks.size()
-                    << ") for receiver report.";
-    return false;
-  }
-  report_blocks_ = std::move(blocks);
-  return true;
-}
-
-}  // namespace rtcp
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/rtcp_packet/receiver_report.h b/modules/rtp_rtcp/source/rtcp_packet/receiver_report.h
deleted file mode 100644
index 1b08f64..0000000
--- a/modules/rtp_rtcp/source/rtcp_packet/receiver_report.h
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- *  Copyright (c) 2015 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_RTP_RTCP_SOURCE_RTCP_PACKET_RECEIVER_REPORT_H_
-#define WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_PACKET_RECEIVER_REPORT_H_
-
-#include <vector>
-
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/report_block.h"
-#include "webrtc/rtc_base/basictypes.h"
-
-namespace webrtc {
-namespace rtcp {
-class CommonHeader;
-
-class ReceiverReport : public RtcpPacket {
- public:
-  static constexpr uint8_t kPacketType = 201;
-  static constexpr size_t kMaxNumberOfReportBlocks = 0x1f;
-
-  ReceiverReport();
-  ~ReceiverReport() override;
-
-  // Parse assumes header is already parsed and validated.
-  bool Parse(const CommonHeader& packet);
-
-  void SetSenderSsrc(uint32_t ssrc) { sender_ssrc_ = ssrc; }
-  bool AddReportBlock(const ReportBlock& block);
-  bool SetReportBlocks(std::vector<ReportBlock> blocks);
-
-  uint32_t sender_ssrc() const { return sender_ssrc_; }
-  const std::vector<ReportBlock>& report_blocks() const {
-    return report_blocks_;
-  }
-
-  size_t BlockLength() const override;
-
-  bool Create(uint8_t* packet,
-              size_t* index,
-              size_t max_length,
-              RtcpPacket::PacketReadyCallback* callback) const override;
-
- private:
-  static const size_t kRrBaseLength = 4;
-
-  uint32_t sender_ssrc_;
-  std::vector<ReportBlock> report_blocks_;
-};
-
-}  // namespace rtcp
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_PACKET_RECEIVER_REPORT_H_
diff --git a/modules/rtp_rtcp/source/rtcp_packet/receiver_report_unittest.cc b/modules/rtp_rtcp/source/rtcp_packet/receiver_report_unittest.cc
deleted file mode 100644
index d9b89c8..0000000
--- a/modules/rtp_rtcp/source/rtcp_packet/receiver_report_unittest.cc
+++ /dev/null
@@ -1,161 +0,0 @@
-/*
- *  Copyright (c) 2015 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/rtp_rtcp/source/rtcp_packet/receiver_report.h"
-
-#include <utility>
-
-#include "webrtc/test/gmock.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/rtcp_packet_parser.h"
-
-using testing::ElementsAreArray;
-using testing::IsEmpty;
-using testing::make_tuple;
-using webrtc::rtcp::ReceiverReport;
-using webrtc::rtcp::ReportBlock;
-
-namespace webrtc {
-namespace {
-const uint32_t kSenderSsrc = 0x12345678;
-const uint32_t kRemoteSsrc = 0x23456789;
-const uint8_t kFractionLost = 55;
-const uint32_t kCumulativeLost = 0x111213;
-const uint32_t kExtHighestSeqNum = 0x22232425;
-const uint32_t kJitter = 0x33343536;
-const uint32_t kLastSr = 0x44454647;
-const uint32_t kDelayLastSr = 0x55565758;
-// Manually created ReceiverReport with one ReportBlock matching constants
-// above.
-// Having this block allows to test Create and Parse separately.
-const uint8_t kPacket[] = {0x81, 201,  0x00, 0x07, 0x12, 0x34, 0x56, 0x78,
-                           0x23, 0x45, 0x67, 0x89, 55,   0x11, 0x12, 0x13,
-                           0x22, 0x23, 0x24, 0x25, 0x33, 0x34, 0x35, 0x36,
-                           0x44, 0x45, 0x46, 0x47, 0x55, 0x56, 0x57, 0x58};
-}  // namespace
-
-TEST(RtcpPacketReceiverReportTest, ParseWithOneReportBlock) {
-  ReceiverReport rr;
-  EXPECT_TRUE(test::ParseSinglePacket(kPacket, &rr));
-  const ReceiverReport& parsed = rr;
-
-  EXPECT_EQ(kSenderSsrc, parsed.sender_ssrc());
-  EXPECT_EQ(1u, parsed.report_blocks().size());
-  const ReportBlock& rb = parsed.report_blocks().front();
-  EXPECT_EQ(kRemoteSsrc, rb.source_ssrc());
-  EXPECT_EQ(kFractionLost, rb.fraction_lost());
-  EXPECT_EQ(kCumulativeLost, rb.cumulative_lost());
-  EXPECT_EQ(kExtHighestSeqNum, rb.extended_high_seq_num());
-  EXPECT_EQ(kJitter, rb.jitter());
-  EXPECT_EQ(kLastSr, rb.last_sr());
-  EXPECT_EQ(kDelayLastSr, rb.delay_since_last_sr());
-}
-
-TEST(RtcpPacketReceiverReportTest, ParseFailsOnIncorrectSize) {
-  rtc::Buffer damaged_packet(kPacket);
-  damaged_packet[0]++;  // Damage the packet: increase count field.
-  ReceiverReport rr;
-  EXPECT_FALSE(test::ParseSinglePacket(damaged_packet, &rr));
-}
-
-TEST(RtcpPacketReceiverReportTest, CreateWithOneReportBlock) {
-  ReceiverReport rr;
-  rr.SetSenderSsrc(kSenderSsrc);
-  ReportBlock rb;
-  rb.SetMediaSsrc(kRemoteSsrc);
-  rb.SetFractionLost(kFractionLost);
-  rb.SetCumulativeLost(kCumulativeLost);
-  rb.SetExtHighestSeqNum(kExtHighestSeqNum);
-  rb.SetJitter(kJitter);
-  rb.SetLastSr(kLastSr);
-  rb.SetDelayLastSr(kDelayLastSr);
-  rr.AddReportBlock(rb);
-
-  rtc::Buffer raw = rr.Build();
-
-  EXPECT_THAT(make_tuple(raw.data(), raw.size()), ElementsAreArray(kPacket));
-}
-
-TEST(RtcpPacketReceiverReportTest, CreateAndParseWithoutReportBlocks) {
-  ReceiverReport rr;
-  rr.SetSenderSsrc(kSenderSsrc);
-
-  rtc::Buffer raw = rr.Build();
-  ReceiverReport parsed;
-  EXPECT_TRUE(test::ParseSinglePacket(raw, &parsed));
-
-  EXPECT_EQ(kSenderSsrc, parsed.sender_ssrc());
-  EXPECT_THAT(parsed.report_blocks(), IsEmpty());
-}
-
-TEST(RtcpPacketReceiverReportTest, CreateAndParseWithTwoReportBlocks) {
-  ReceiverReport rr;
-  ReportBlock rb1;
-  rb1.SetMediaSsrc(kRemoteSsrc);
-  ReportBlock rb2;
-  rb2.SetMediaSsrc(kRemoteSsrc + 1);
-
-  rr.SetSenderSsrc(kSenderSsrc);
-  EXPECT_TRUE(rr.AddReportBlock(rb1));
-  EXPECT_TRUE(rr.AddReportBlock(rb2));
-
-  rtc::Buffer raw = rr.Build();
-  ReceiverReport parsed;
-  EXPECT_TRUE(test::ParseSinglePacket(raw, &parsed));
-
-  EXPECT_EQ(kSenderSsrc, parsed.sender_ssrc());
-  EXPECT_EQ(2u, parsed.report_blocks().size());
-  EXPECT_EQ(kRemoteSsrc, parsed.report_blocks()[0].source_ssrc());
-  EXPECT_EQ(kRemoteSsrc + 1, parsed.report_blocks()[1].source_ssrc());
-}
-
-TEST(RtcpPacketReceiverReportTest, CreateWithTooManyReportBlocks) {
-  ReceiverReport rr;
-  rr.SetSenderSsrc(kSenderSsrc);
-  ReportBlock rb;
-  for (size_t i = 0; i < ReceiverReport::kMaxNumberOfReportBlocks; ++i) {
-    rb.SetMediaSsrc(kRemoteSsrc + i);
-    EXPECT_TRUE(rr.AddReportBlock(rb));
-  }
-  rb.SetMediaSsrc(kRemoteSsrc + ReceiverReport::kMaxNumberOfReportBlocks);
-  EXPECT_FALSE(rr.AddReportBlock(rb));
-}
-
-TEST(RtcpPacketReceiverReportTest, SetReportBlocksOverwritesOldBlocks) {
-  ReceiverReport rr;
-  ReportBlock report_block;
-  // Use jitter field of the report blocks to distinguish them.
-  report_block.SetJitter(1001u);
-  rr.AddReportBlock(report_block);
-  ASSERT_EQ(rr.report_blocks().size(), 1u);
-  ASSERT_EQ(rr.report_blocks()[0].jitter(), 1001u);
-
-  std::vector<ReportBlock> blocks(3u);
-  blocks[0].SetJitter(2001u);
-  blocks[1].SetJitter(3001u);
-  blocks[2].SetJitter(4001u);
-  EXPECT_TRUE(rr.SetReportBlocks(blocks));
-  ASSERT_EQ(rr.report_blocks().size(), 3u);
-  EXPECT_EQ(rr.report_blocks()[0].jitter(), 2001u);
-  EXPECT_EQ(rr.report_blocks()[1].jitter(), 3001u);
-  EXPECT_EQ(rr.report_blocks()[2].jitter(), 4001u);
-}
-
-TEST(RtcpPacketReceiverReportTest, SetReportBlocksMaxLimit) {
-  ReceiverReport rr;
-  std::vector<ReportBlock> max_blocks(ReceiverReport::kMaxNumberOfReportBlocks);
-  EXPECT_TRUE(rr.SetReportBlocks(std::move(max_blocks)));
-
-  std::vector<ReportBlock> one_too_many_blocks(
-      ReceiverReport::kMaxNumberOfReportBlocks + 1);
-  EXPECT_FALSE(rr.SetReportBlocks(std::move(one_too_many_blocks)));
-}
-
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/rtcp_packet/remb.cc b/modules/rtp_rtcp/source/rtcp_packet/remb.cc
deleted file mode 100644
index 8e2eceb..0000000
--- a/modules/rtp_rtcp/source/rtcp_packet/remb.cc
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- *  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/rtp_rtcp/source/rtcp_packet/remb.h"
-
-#include <utility>
-
-#include "webrtc/modules/rtp_rtcp/source/byte_io.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/common_header.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-
-namespace webrtc {
-namespace rtcp {
-constexpr uint8_t Remb::kFeedbackMessageType;
-// Receiver Estimated Max Bitrate (REMB) (draft-alvestrand-rmcat-remb).
-//
-//     0                   1                   2                   3
-//     0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
-//    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//    |V=2|P| FMT=15  |   PT=206      |             length            |
-//    +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
-//  0 |                  SSRC of packet sender                        |
-//    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//  4 |                       Unused = 0                              |
-//    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//  8 |  Unique identifier 'R' 'E' 'M' 'B'                            |
-//    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-// 12 |  Num SSRC     | BR Exp    |  BR Mantissa                      |
-//    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-// 16 |   SSRC feedback                                               |
-//    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//    :  ...                                                          :
-
-Remb::Remb() : bitrate_bps_(0) {}
-
-Remb::~Remb() = default;
-
-bool Remb::Parse(const CommonHeader& packet) {
-  RTC_DCHECK(packet.type() == kPacketType);
-  RTC_DCHECK_EQ(packet.fmt(), kFeedbackMessageType);
-
-  if (packet.payload_size_bytes() < 16) {
-    LOG(LS_WARNING) << "Payload length " << packet.payload_size_bytes()
-                    << " is too small for Remb packet.";
-    return false;
-  }
-  const uint8_t* const payload = packet.payload();
-  if (kUniqueIdentifier != ByteReader<uint32_t>::ReadBigEndian(&payload[8])) {
-    LOG(LS_WARNING) << "REMB identifier not found, not a REMB packet.";
-    return false;
-  }
-  uint8_t number_of_ssrcs = payload[12];
-  if (packet.payload_size_bytes() !=
-      kCommonFeedbackLength + (2 + number_of_ssrcs) * 4) {
-    LOG(LS_WARNING) << "Payload size " << packet.payload_size_bytes()
-                    << " does not match " << number_of_ssrcs << " ssrcs.";
-    return false;
-  }
-
-  ParseCommonFeedback(payload);
-  uint8_t exponenta = payload[13] >> 2;
-  uint64_t mantissa = (static_cast<uint32_t>(payload[13] & 0x03) << 16) |
-                      ByteReader<uint16_t>::ReadBigEndian(&payload[14]);
-  bitrate_bps_ = (mantissa << exponenta);
-  bool shift_overflow = (bitrate_bps_ >> exponenta) != mantissa;
-  if (shift_overflow) {
-    LOG(LS_ERROR) << "Invalid remb bitrate value : " << mantissa
-                  << "*2^" << static_cast<int>(exponenta);
-    return false;
-  }
-
-  const uint8_t* next_ssrc = payload + 16;
-  ssrcs_.clear();
-  ssrcs_.reserve(number_of_ssrcs);
-  for (uint8_t i = 0; i < number_of_ssrcs; ++i) {
-    ssrcs_.push_back(ByteReader<uint32_t>::ReadBigEndian(next_ssrc));
-    next_ssrc += sizeof(uint32_t);
-  }
-
-  return true;
-}
-
-bool Remb::SetSsrcs(std::vector<uint32_t> ssrcs) {
-  if (ssrcs.size() > kMaxNumberOfSsrcs) {
-    LOG(LS_WARNING) << "Not enough space for all given SSRCs.";
-    return false;
-  }
-  ssrcs_ = std::move(ssrcs);
-  return true;
-}
-
-size_t Remb::BlockLength() const {
-  return kHeaderLength + kCommonFeedbackLength + (2 + ssrcs_.size()) * 4;
-}
-
-bool Remb::Create(uint8_t* packet,
-                  size_t* index,
-                  size_t max_length,
-                  RtcpPacket::PacketReadyCallback* callback) const {
-  while (*index + BlockLength() > max_length) {
-    if (!OnBufferFull(packet, index, callback))
-      return false;
-  }
-  size_t index_end = *index + BlockLength();
-  CreateHeader(kFeedbackMessageType, kPacketType, HeaderLength(), packet,
-               index);
-  RTC_DCHECK_EQ(0, Psfb::media_ssrc());
-  CreateCommonFeedback(packet + *index);
-  *index += kCommonFeedbackLength;
-
-  ByteWriter<uint32_t>::WriteBigEndian(packet + *index, kUniqueIdentifier);
-  *index += sizeof(uint32_t);
-  const uint32_t kMaxMantissa = 0x3ffff;  // 18 bits.
-  uint64_t mantissa = bitrate_bps_;
-  uint8_t exponenta = 0;
-  while (mantissa > kMaxMantissa) {
-    mantissa >>= 1;
-    ++exponenta;
-  }
-  packet[(*index)++] = ssrcs_.size();
-  packet[(*index)++] = (exponenta << 2) | (mantissa >> 16);
-  ByteWriter<uint16_t>::WriteBigEndian(packet + *index, mantissa & 0xffff);
-  *index += sizeof(uint16_t);
-
-  for (uint32_t ssrc : ssrcs_) {
-    ByteWriter<uint32_t>::WriteBigEndian(packet + *index, ssrc);
-    *index += sizeof(uint32_t);
-  }
-  RTC_DCHECK_EQ(index_end, *index);
-  return true;
-}
-}  // namespace rtcp
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/rtcp_packet/remb.h b/modules/rtp_rtcp/source/rtcp_packet/remb.h
deleted file mode 100644
index 062effa..0000000
--- a/modules/rtp_rtcp/source/rtcp_packet/remb.h
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- *  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_RTP_RTCP_SOURCE_RTCP_PACKET_REMB_H_
-#define WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_PACKET_REMB_H_
-
-#include <vector>
-
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/psfb.h"
-#include "webrtc/rtc_base/basictypes.h"
-
-namespace webrtc {
-namespace rtcp {
-class CommonHeader;
-
-// Receiver Estimated Max Bitrate (REMB) (draft-alvestrand-rmcat-remb).
-class Remb : public Psfb {
- public:
-  static constexpr uint8_t kFeedbackMessageType = 15;
-  static constexpr size_t kMaxNumberOfSsrcs = 0xff;
-
-  Remb();
-  ~Remb() override;
-
-  // Parse assumes header is already parsed and validated.
-  bool Parse(const CommonHeader& packet);
-
-  bool SetSsrcs(std::vector<uint32_t> ssrcs);
-  void SetBitrateBps(uint64_t bitrate_bps) { bitrate_bps_ = bitrate_bps; }
-
-  uint64_t bitrate_bps() const { return bitrate_bps_; }
-  const std::vector<uint32_t>& ssrcs() const { return ssrcs_; }
-
-  size_t BlockLength() const override;
-
-  bool Create(uint8_t* packet,
-              size_t* index,
-              size_t max_length,
-              RtcpPacket::PacketReadyCallback* callback) const override;
-
- private:
-  static constexpr uint32_t kUniqueIdentifier = 0x52454D42;  // 'R' 'E' 'M' 'B'.
-
-  // Media ssrc is unused, shadow base class setter and getter.
-  void SetMediaSsrc(uint32_t);
-  uint32_t media_ssrc() const;
-
-  uint64_t bitrate_bps_;
-  std::vector<uint32_t> ssrcs_;
-};
-}  // namespace rtcp
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_PACKET_REMB_H_
diff --git a/modules/rtp_rtcp/source/rtcp_packet/remb_unittest.cc b/modules/rtp_rtcp/source/rtcp_packet/remb_unittest.cc
deleted file mode 100644
index f7b1dcf..0000000
--- a/modules/rtp_rtcp/source/rtcp_packet/remb_unittest.cc
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- *  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/rtp_rtcp/source/rtcp_packet/remb.h"
-
-#include "webrtc/test/gmock.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/rtcp_packet_parser.h"
-
-using testing::ElementsAreArray;
-using testing::IsEmpty;
-using testing::make_tuple;
-using webrtc::rtcp::Remb;
-
-namespace webrtc {
-namespace {
-const uint32_t kSenderSsrc = 0x12345678;
-const uint32_t kRemoteSsrcs[] = {0x23456789, 0x2345678a, 0x2345678b};
-const uint32_t kBitrateBps = 0x3fb93 * 2;  // 522022;
-const uint64_t kBitrateBps64bit = 0x3fb93ULL << 30;
-const uint8_t kPacket[] = {0x8f, 206,  0x00, 0x07, 0x12, 0x34, 0x56, 0x78,
-                           0x00, 0x00, 0x00, 0x00, 'R',  'E',  'M',  'B',
-                           0x03, 0x07, 0xfb, 0x93, 0x23, 0x45, 0x67, 0x89,
-                           0x23, 0x45, 0x67, 0x8a, 0x23, 0x45, 0x67, 0x8b};
-const size_t kPacketLength = sizeof(kPacket);
-}  // namespace
-
-TEST(RtcpPacketRembTest, Create) {
-  Remb remb;
-  remb.SetSenderSsrc(kSenderSsrc);
-  remb.SetSsrcs(
-      std::vector<uint32_t>(std::begin(kRemoteSsrcs), std::end(kRemoteSsrcs)));
-  remb.SetBitrateBps(kBitrateBps);
-
-  rtc::Buffer packet = remb.Build();
-
-  EXPECT_THAT(make_tuple(packet.data(), packet.size()),
-              ElementsAreArray(kPacket));
-}
-
-TEST(RtcpPacketRembTest, Parse) {
-  Remb remb;
-  EXPECT_TRUE(test::ParseSinglePacket(kPacket, &remb));
-  const Remb& parsed = remb;
-
-  EXPECT_EQ(kSenderSsrc, parsed.sender_ssrc());
-  EXPECT_EQ(kBitrateBps, parsed.bitrate_bps());
-  EXPECT_THAT(parsed.ssrcs(), ElementsAreArray(kRemoteSsrcs));
-}
-
-TEST(RtcpPacketRembTest, CreateAndParseWithoutSsrcs) {
-  Remb remb;
-  remb.SetSenderSsrc(kSenderSsrc);
-  remb.SetBitrateBps(kBitrateBps);
-  rtc::Buffer packet = remb.Build();
-
-  Remb parsed;
-  EXPECT_TRUE(test::ParseSinglePacket(packet, &parsed));
-  EXPECT_EQ(kSenderSsrc, parsed.sender_ssrc());
-  EXPECT_EQ(kBitrateBps, parsed.bitrate_bps());
-  EXPECT_THAT(parsed.ssrcs(), IsEmpty());
-}
-
-TEST(RtcpPacketRembTest, CreateAndParse64bitBitrate) {
-  Remb remb;
-  remb.SetBitrateBps(kBitrateBps64bit);
-  rtc::Buffer packet = remb.Build();
-
-  Remb parsed;
-  EXPECT_TRUE(test::ParseSinglePacket(packet, &parsed));
-  EXPECT_EQ(kBitrateBps64bit, parsed.bitrate_bps());
-}
-
-TEST(RtcpPacketRembTest, ParseFailsOnTooSmallPacketToBeRemb) {
-  // Make it too small.
-  constexpr size_t kTooSmallSize = (1 + 3) * 4;
-  uint8_t packet[kTooSmallSize];
-  memcpy(packet, kPacket, kTooSmallSize);
-  packet[3] = 3;
-
-  Remb remb;
-  EXPECT_FALSE(test::ParseSinglePacket(packet, &remb));
-}
-
-TEST(RtcpPacketRembTest, ParseFailsWhenUniqueIdentifierIsNotRemb) {
-  uint8_t packet[kPacketLength];
-  memcpy(packet, kPacket, kPacketLength);
-  packet[12] = 'N';  // Swap 'R' -> 'N' in the 'REMB' unique identifier.
-
-  Remb remb;
-  EXPECT_FALSE(test::ParseSinglePacket(packet, &remb));
-}
-
-TEST(RtcpPacketRembTest, ParseFailsWhenBitrateDoNotFitIn64bits) {
-  uint8_t packet[kPacketLength];
-  memcpy(packet, kPacket, kPacketLength);
-  packet[17] |= 0xfc;  // Set exponenta component to maximum of 63.
-  packet[19] |= 0x02;  // Ensure mantissa is at least 2.
-
-  Remb remb;
-  EXPECT_FALSE(test::ParseSinglePacket(packet, &remb));
-}
-
-TEST(RtcpPacketRembTest, ParseFailsWhenSsrcCountMismatchLength) {
-  uint8_t packet[kPacketLength];
-  memcpy(packet, kPacket, kPacketLength);
-  packet[16]++;  // Swap 3 -> 4 in the ssrcs count.
-
-  Remb remb;
-  EXPECT_FALSE(test::ParseSinglePacket(packet, &remb));
-}
-
-TEST(RtcpPacketRembTest, TooManySsrcs) {
-  Remb remb;
-  EXPECT_FALSE(remb.SetSsrcs(
-      std::vector<uint32_t>(Remb::kMaxNumberOfSsrcs + 1, kRemoteSsrcs[0])));
-  EXPECT_TRUE(remb.SetSsrcs(
-      std::vector<uint32_t>(Remb::kMaxNumberOfSsrcs, kRemoteSsrcs[0])));
-}
-
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/rtcp_packet/report_block.cc b/modules/rtp_rtcp/source/rtcp_packet/report_block.cc
deleted file mode 100644
index 9589d89..0000000
--- a/modules/rtp_rtcp/source/rtcp_packet/report_block.cc
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- *  Copyright (c) 2015 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/rtp_rtcp/source/rtcp_packet/report_block.h"
-
-#include "webrtc/modules/rtp_rtcp/source/byte_io.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-
-namespace webrtc {
-namespace rtcp {
-
-// From RFC 3550, RTP: A Transport Protocol for Real-Time Applications.
-//
-// RTCP report block (RFC 3550).
-//
-//     0                   1                   2                   3
-//     0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
-//    +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
-//  0 |                 SSRC_1 (SSRC of first source)                 |
-//    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//  4 | fraction lost |       cumulative number of packets lost       |
-//    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//  8 |           extended highest sequence number received           |
-//    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-// 12 |                      interarrival jitter                      |
-//    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-// 16 |                         last SR (LSR)                         |
-//    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-// 20 |                   delay since last SR (DLSR)                  |
-// 24 +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
-ReportBlock::ReportBlock()
-    : source_ssrc_(0),
-      fraction_lost_(0),
-      cumulative_lost_(0),
-      extended_high_seq_num_(0),
-      jitter_(0),
-      last_sr_(0),
-      delay_since_last_sr_(0) {}
-
-bool ReportBlock::Parse(const uint8_t* buffer, size_t length) {
-  RTC_DCHECK(buffer != nullptr);
-  if (length < ReportBlock::kLength) {
-    LOG(LS_ERROR) << "Report Block should be 24 bytes long";
-    return false;
-  }
-
-  source_ssrc_ = ByteReader<uint32_t>::ReadBigEndian(&buffer[0]);
-  fraction_lost_ = buffer[4];
-  cumulative_lost_ = ByteReader<uint32_t, 3>::ReadBigEndian(&buffer[5]);
-  extended_high_seq_num_ = ByteReader<uint32_t>::ReadBigEndian(&buffer[8]);
-  jitter_ = ByteReader<uint32_t>::ReadBigEndian(&buffer[12]);
-  last_sr_ = ByteReader<uint32_t>::ReadBigEndian(&buffer[16]);
-  delay_since_last_sr_ = ByteReader<uint32_t>::ReadBigEndian(&buffer[20]);
-
-  return true;
-}
-
-void ReportBlock::Create(uint8_t* buffer) const {
-  // Runtime check should be done while setting cumulative_lost.
-  RTC_DCHECK_LT(cumulative_lost(), (1 << 24));  // Have only 3 bytes for it.
-
-  ByteWriter<uint32_t>::WriteBigEndian(&buffer[0], source_ssrc());
-  ByteWriter<uint8_t>::WriteBigEndian(&buffer[4], fraction_lost());
-  ByteWriter<uint32_t, 3>::WriteBigEndian(&buffer[5], cumulative_lost());
-  ByteWriter<uint32_t>::WriteBigEndian(&buffer[8], extended_high_seq_num());
-  ByteWriter<uint32_t>::WriteBigEndian(&buffer[12], jitter());
-  ByteWriter<uint32_t>::WriteBigEndian(&buffer[16], last_sr());
-  ByteWriter<uint32_t>::WriteBigEndian(&buffer[20], delay_since_last_sr());
-}
-
-bool ReportBlock::SetCumulativeLost(uint32_t cumulative_lost) {
-  if (cumulative_lost >= (1u << 24)) {  // Have only 3 bytes to store it.
-    LOG(LS_WARNING) << "Cumulative lost is too big to fit into Report Block";
-    return false;
-  }
-  cumulative_lost_ = cumulative_lost;
-  return true;
-}
-
-}  // namespace rtcp
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/rtcp_packet/report_block.h b/modules/rtp_rtcp/source/rtcp_packet/report_block.h
deleted file mode 100644
index 0156cc0..0000000
--- a/modules/rtp_rtcp/source/rtcp_packet/report_block.h
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- *  Copyright (c) 2015 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_RTP_RTCP_SOURCE_RTCP_PACKET_REPORT_BLOCK_H_
-#define WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_PACKET_REPORT_BLOCK_H_
-
-#include "webrtc/rtc_base/basictypes.h"
-
-namespace webrtc {
-namespace rtcp {
-
-class ReportBlock {
- public:
-  static const size_t kLength = 24;
-
-  ReportBlock();
-  ~ReportBlock() {}
-
-  bool Parse(const uint8_t* buffer, size_t length);
-
-  // Fills buffer with the ReportBlock.
-  // Consumes ReportBlock::kLength bytes.
-  void Create(uint8_t* buffer) const;
-
-  void SetMediaSsrc(uint32_t ssrc) { source_ssrc_ = ssrc; }
-  void SetFractionLost(uint8_t fraction_lost) {
-    fraction_lost_ = fraction_lost;
-  }
-  bool SetCumulativeLost(uint32_t cumulative_lost);
-  void SetExtHighestSeqNum(uint32_t ext_highest_seq_num) {
-    extended_high_seq_num_ = ext_highest_seq_num;
-  }
-  void SetJitter(uint32_t jitter) { jitter_ = jitter; }
-  void SetLastSr(uint32_t last_sr) { last_sr_ = last_sr; }
-  void SetDelayLastSr(uint32_t delay_last_sr) {
-    delay_since_last_sr_ = delay_last_sr;
-  }
-
-  uint32_t source_ssrc() const { return source_ssrc_; }
-  uint8_t fraction_lost() const { return fraction_lost_; }
-  uint32_t cumulative_lost() const { return cumulative_lost_; }
-  uint32_t extended_high_seq_num() const { return extended_high_seq_num_; }
-  uint32_t jitter() const { return jitter_; }
-  uint32_t last_sr() const { return last_sr_; }
-  uint32_t delay_since_last_sr() const { return delay_since_last_sr_; }
-
- private:
-  uint32_t source_ssrc_;
-  uint8_t fraction_lost_;
-  uint32_t cumulative_lost_;
-  uint32_t extended_high_seq_num_;
-  uint32_t jitter_;
-  uint32_t last_sr_;
-  uint32_t delay_since_last_sr_;
-};
-
-}  // namespace rtcp
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_PACKET_REPORT_BLOCK_H_
diff --git a/modules/rtp_rtcp/source/rtcp_packet/report_block_unittest.cc b/modules/rtp_rtcp/source/rtcp_packet/report_block_unittest.cc
deleted file mode 100644
index 9d6117a..0000000
--- a/modules/rtp_rtcp/source/rtcp_packet/report_block_unittest.cc
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- *  Copyright (c) 2015 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/rtp_rtcp/source/rtcp_packet/report_block.h"
-
-#include <limits>
-
-#include "webrtc/rtc_base/random.h"
-#include "webrtc/test/gtest.h"
-
-using webrtc::rtcp::ReportBlock;
-
-namespace webrtc {
-namespace {
-
-const uint32_t kRemoteSsrc = 0x23456789;
-const uint8_t kFractionLost = 55;
-// Use values that are streamed differently LE and BE.
-const uint32_t kCumulativeLost = 0x111213;
-const uint32_t kExtHighestSeqNum = 0x22232425;
-const uint32_t kJitter = 0x33343536;
-const uint32_t kLastSr = 0x44454647;
-const uint32_t kDelayLastSr = 0x55565758;
-const size_t kBufferLength = ReportBlock::kLength;
-
-TEST(RtcpPacketReportBlockTest, ParseChecksLength) {
-  uint8_t buffer[kBufferLength];
-  memset(buffer, 0, sizeof(buffer));
-
-  ReportBlock rb;
-  EXPECT_FALSE(rb.Parse(buffer, kBufferLength - 1));
-  EXPECT_TRUE(rb.Parse(buffer, kBufferLength));
-}
-
-TEST(RtcpPacketReportBlockTest, ParseAnyData) {
-  uint8_t buffer[kBufferLength];
-  // Fill buffer with semi-random data.
-  Random generator(0x256F8A285EC829ull);
-  for (size_t i = 0; i < kBufferLength; ++i)
-    buffer[i] = static_cast<uint8_t>(generator.Rand(0, 0xff));
-
-  ReportBlock rb;
-  EXPECT_TRUE(rb.Parse(buffer, kBufferLength));
-}
-
-TEST(RtcpPacketReportBlockTest, ParseMatchCreate) {
-  ReportBlock rb;
-  rb.SetMediaSsrc(kRemoteSsrc);
-  rb.SetFractionLost(kFractionLost);
-  rb.SetCumulativeLost(kCumulativeLost);
-  rb.SetExtHighestSeqNum(kExtHighestSeqNum);
-  rb.SetJitter(kJitter);
-  rb.SetLastSr(kLastSr);
-  rb.SetDelayLastSr(kDelayLastSr);
-
-  uint8_t buffer[kBufferLength];
-  rb.Create(buffer);
-
-  ReportBlock parsed;
-  EXPECT_TRUE(parsed.Parse(buffer, kBufferLength));
-
-  EXPECT_EQ(kRemoteSsrc, parsed.source_ssrc());
-  EXPECT_EQ(kFractionLost, parsed.fraction_lost());
-  EXPECT_EQ(kCumulativeLost, parsed.cumulative_lost());
-  EXPECT_EQ(kExtHighestSeqNum, parsed.extended_high_seq_num());
-  EXPECT_EQ(kJitter, parsed.jitter());
-  EXPECT_EQ(kLastSr, parsed.last_sr());
-  EXPECT_EQ(kDelayLastSr, parsed.delay_since_last_sr());
-}
-
-TEST(RtcpPacketReportBlockTest, ValidateCumulativeLost) {
-  const uint32_t kMaxCumulativeLost = 0xffffff;
-  ReportBlock rb;
-  EXPECT_FALSE(rb.SetCumulativeLost(kMaxCumulativeLost + 1));
-  EXPECT_TRUE(rb.SetCumulativeLost(kMaxCumulativeLost));
-}
-
-}  // namespace
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/rtcp_packet/rrtr.cc b/modules/rtp_rtcp/source/rtcp_packet/rrtr.cc
deleted file mode 100644
index 0f81f3a..0000000
--- a/modules/rtp_rtcp/source/rtcp_packet/rrtr.cc
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- *  Copyright (c) 2015 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/rtp_rtcp/source/rtcp_packet/rrtr.h"
-
-#include "webrtc/modules/rtp_rtcp/source/byte_io.h"
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-namespace rtcp {
-// Receiver Reference Time Report Block (RFC 3611).
-//
-//   0                   1                   2                   3
-//   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
-//  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//  |     BT=4      |   reserved    |       block length = 2        |
-//  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//  |              NTP timestamp, most significant word             |
-//  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//  |             NTP timestamp, least significant word             |
-//  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-
-void Rrtr::Parse(const uint8_t* buffer) {
-  RTC_DCHECK(buffer[0] == kBlockType);
-  // reserved = buffer[1];
-  RTC_DCHECK(ByteReader<uint16_t>::ReadBigEndian(&buffer[2]) == kBlockLength);
-  uint32_t seconds = ByteReader<uint32_t>::ReadBigEndian(&buffer[4]);
-  uint32_t fraction = ByteReader<uint32_t>::ReadBigEndian(&buffer[8]);
-  ntp_.Set(seconds, fraction);
-}
-
-void Rrtr::Create(uint8_t* buffer) const {
-  const uint8_t kReserved = 0;
-  buffer[0] = kBlockType;
-  buffer[1] = kReserved;
-  ByteWriter<uint16_t>::WriteBigEndian(&buffer[2], kBlockLength);
-  ByteWriter<uint32_t>::WriteBigEndian(&buffer[4], ntp_.seconds());
-  ByteWriter<uint32_t>::WriteBigEndian(&buffer[8], ntp_.fractions());
-}
-
-}  // namespace rtcp
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/rtcp_packet/rrtr.h b/modules/rtp_rtcp/source/rtcp_packet/rrtr.h
deleted file mode 100644
index b87efe8..0000000
--- a/modules/rtp_rtcp/source/rtcp_packet/rrtr.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- *  Copyright (c) 2015 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_RTP_RTCP_SOURCE_RTCP_PACKET_RRTR_H_
-#define WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_PACKET_RRTR_H_
-
-#include "webrtc/rtc_base/basictypes.h"
-#include "webrtc/system_wrappers/include/ntp_time.h"
-
-namespace webrtc {
-namespace rtcp {
-
-class Rrtr {
- public:
-  static const uint8_t kBlockType = 4;
-  static const uint16_t kBlockLength = 2;
-  static const size_t kLength = 4 * (kBlockLength + 1);  // 12
-
-  Rrtr() {}
-  Rrtr(const Rrtr&) = default;
-  ~Rrtr() {}
-
-  Rrtr& operator=(const Rrtr&) = default;
-
-  void Parse(const uint8_t* buffer);
-
-  // Fills buffer with the Rrtr.
-  // Consumes Rrtr::kLength bytes.
-  void Create(uint8_t* buffer) const;
-
-  void SetNtp(NtpTime ntp) { ntp_ = ntp; }
-
-  NtpTime ntp() const { return ntp_; }
-
- private:
-  NtpTime ntp_;
-};
-
-}  // namespace rtcp
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_PACKET_RRTR_H_
diff --git a/modules/rtp_rtcp/source/rtcp_packet/rrtr_unittest.cc b/modules/rtp_rtcp/source/rtcp_packet/rrtr_unittest.cc
deleted file mode 100644
index 70bfe0b..0000000
--- a/modules/rtp_rtcp/source/rtcp_packet/rrtr_unittest.cc
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- *  Copyright (c) 2015 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/rtp_rtcp/source/rtcp_packet/rrtr.h"
-
-#include "webrtc/test/gtest.h"
-
-using webrtc::rtcp::Rrtr;
-
-namespace webrtc {
-namespace {
-
-const uint32_t kNtpSec = 0x12345678;
-const uint32_t kNtpFrac = 0x23456789;
-const uint8_t kBlock[] = {0x04, 0x00, 0x00, 0x02,
-                          0x12, 0x34, 0x56, 0x78,
-                          0x23, 0x45, 0x67, 0x89};
-const size_t kBlockSizeBytes = sizeof(kBlock);
-static_assert(
-    kBlockSizeBytes == Rrtr::kLength,
-    "Size of manually created Rrtr block should match class constant");
-
-TEST(RtcpPacketRrtrTest, Create) {
-  uint8_t buffer[Rrtr::kLength];
-  Rrtr rrtr;
-  rrtr.SetNtp(NtpTime(kNtpSec, kNtpFrac));
-
-  rrtr.Create(buffer);
-  EXPECT_EQ(0, memcmp(buffer, kBlock, kBlockSizeBytes));
-}
-
-TEST(RtcpPacketRrtrTest, Parse) {
-  Rrtr read_rrtr;
-  read_rrtr.Parse(kBlock);
-
-  // Run checks on const object to ensure all accessors have const modifier.
-  const Rrtr& parsed = read_rrtr;
-
-  EXPECT_EQ(kNtpSec, parsed.ntp().seconds());
-  EXPECT_EQ(kNtpFrac, parsed.ntp().fractions());
-}
-
-}  // namespace
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/rtcp_packet/rtpfb.cc b/modules/rtp_rtcp/source/rtcp_packet/rtpfb.cc
deleted file mode 100644
index 1286229..0000000
--- a/modules/rtp_rtcp/source/rtcp_packet/rtpfb.cc
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- *  Copyright (c) 2015 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/rtp_rtcp/source/rtcp_packet/rtpfb.h"
-
-#include "webrtc/modules/rtp_rtcp/source/byte_io.h"
-
-namespace webrtc {
-namespace rtcp {
-constexpr uint8_t Rtpfb::kPacketType;
-// RFC 4585, Section 6.1: Feedback format.
-//
-// Common packet format:
-//
-//    0                   1                   2                   3
-//    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
-//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//   |V=2|P|   FMT   |       PT      |          length               |
-//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-// 0 |                  SSRC of packet sender                        |
-//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-// 4 |                  SSRC of media source                         |
-//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//   :            Feedback Control Information (FCI)                 :
-//   :                                                               :
-
-void Rtpfb::ParseCommonFeedback(const uint8_t* payload) {
-  sender_ssrc_ = ByteReader<uint32_t>::ReadBigEndian(&payload[0]);
-  media_ssrc_ = ByteReader<uint32_t>::ReadBigEndian(&payload[4]);
-}
-
-void Rtpfb::CreateCommonFeedback(uint8_t* payload) const {
-  ByteWriter<uint32_t>::WriteBigEndian(&payload[0], sender_ssrc_);
-  ByteWriter<uint32_t>::WriteBigEndian(&payload[4], media_ssrc_);
-}
-
-}  // namespace rtcp
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/rtcp_packet/rtpfb.h b/modules/rtp_rtcp/source/rtcp_packet/rtpfb.h
deleted file mode 100644
index 734ed9a..0000000
--- a/modules/rtp_rtcp/source/rtcp_packet/rtpfb.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- *  Copyright (c) 2015 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_RTP_RTCP_SOURCE_RTCP_PACKET_RTPFB_H_
-#define WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_PACKET_RTPFB_H_
-
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet.h"
-#include "webrtc/rtc_base/basictypes.h"
-
-namespace webrtc {
-namespace rtcp {
-
-// RTPFB: Transport layer feedback message.
-// RFC4585, Section 6.2
-class Rtpfb : public RtcpPacket {
- public:
-  static constexpr uint8_t kPacketType = 205;
-
-  Rtpfb() : sender_ssrc_(0), media_ssrc_(0) {}
-  ~Rtpfb() override {}
-
-  void SetSenderSsrc(uint32_t ssrc) { sender_ssrc_ = ssrc; }
-  void SetMediaSsrc(uint32_t ssrc) { media_ssrc_ = ssrc; }
-
-  uint32_t sender_ssrc() const { return sender_ssrc_; }
-  uint32_t media_ssrc() const { return media_ssrc_; }
-
- protected:
-  static constexpr size_t kCommonFeedbackLength = 8;
-  void ParseCommonFeedback(const uint8_t* payload);
-  void CreateCommonFeedback(uint8_t* payload) const;
-
- private:
-  uint32_t sender_ssrc_;
-  uint32_t media_ssrc_;
-};
-
-}  // namespace rtcp
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_PACKET_RTPFB_H_
diff --git a/modules/rtp_rtcp/source/rtcp_packet/sdes.cc b/modules/rtp_rtcp/source/rtcp_packet/sdes.cc
deleted file mode 100644
index e747467..0000000
--- a/modules/rtp_rtcp/source/rtcp_packet/sdes.cc
+++ /dev/null
@@ -1,194 +0,0 @@
-/*
- *  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/rtp_rtcp/source/rtcp_packet/sdes.h"
-
-#include <utility>
-
-#include "webrtc/modules/rtp_rtcp/source/byte_io.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/common_header.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-
-namespace webrtc {
-namespace rtcp {
-constexpr uint8_t Sdes::kPacketType;
-constexpr size_t Sdes::kMaxNumberOfChunks;
-// Source Description (SDES) (RFC 3550).
-//
-//         0                   1                   2                   3
-//         0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
-//        +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-// header |V=2|P|    SC   |  PT=SDES=202  |             length            |
-//        +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
-// chunk  |                          SSRC/CSRC_1                          |
-//   1    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//        |                           SDES items                          |
-//        |                              ...                              |
-//        +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
-// chunk  |                          SSRC/CSRC_2                          |
-//   2    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//        |                           SDES items                          |
-//        |                              ...                              |
-//        +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
-//
-// Canonical End-Point Identifier SDES Item (CNAME)
-//
-//    0                   1                   2                   3
-//    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
-//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//   |    CNAME=1    |     length    | user and domain name        ...
-//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-namespace {
-const uint8_t kTerminatorTag = 0;
-const uint8_t kCnameTag = 1;
-
-size_t ChunkSize(const Sdes::Chunk& chunk) {
-  // Chunk:
-  // SSRC/CSRC (4 bytes) | CNAME=1 (1 byte) | length (1 byte) | cname | padding.
-  size_t chunk_payload_size = 4 + 1 + 1 + chunk.cname.size();
-  size_t padding_size = 4 - (chunk_payload_size % 4);  // Minimum 1.
-  return chunk_payload_size + padding_size;
-}
-}  // namespace
-
-Sdes::Sdes() : block_length_(RtcpPacket::kHeaderLength) {}
-
-Sdes::~Sdes() {}
-
-bool Sdes::Parse(const CommonHeader& packet) {
-  RTC_DCHECK_EQ(packet.type(), kPacketType);
-
-  uint8_t number_of_chunks = packet.count();
-  std::vector<Chunk> chunks;  // Read chunk into temporary array, so that in
-                              // case of an error original array would stay
-                              // unchanged.
-  size_t block_length = kHeaderLength;
-
-  if (packet.payload_size_bytes() % 4 != 0) {
-    LOG(LS_WARNING) << "Invalid payload size " << packet.payload_size_bytes()
-                    << " bytes for a valid Sdes packet. Size should be"
-                       " multiple of 4 bytes";
-  }
-  const uint8_t* const payload_end =
-      packet.payload() + packet.payload_size_bytes();
-  const uint8_t* looking_at = packet.payload();
-  chunks.resize(number_of_chunks);
-  for (size_t i = 0; i < number_of_chunks;) {
-    // Each chunk consumes at least 8 bytes.
-    if (payload_end - looking_at < 8) {
-      LOG(LS_WARNING) << "Not enough space left for chunk #" << (i + 1);
-      return false;
-    }
-    chunks[i].ssrc = ByteReader<uint32_t>::ReadBigEndian(looking_at);
-    looking_at += sizeof(uint32_t);
-    bool cname_found = false;
-
-    uint8_t item_type;
-    while ((item_type = *(looking_at++)) != kTerminatorTag) {
-      if (looking_at >= payload_end) {
-        LOG(LS_WARNING) << "Unexpected end of packet while reading chunk #"
-                        << (i + 1) << ". Expected to find size of the text.";
-        return false;
-      }
-      uint8_t item_length = *(looking_at++);
-      const size_t kTerminatorSize = 1;
-      if (looking_at + item_length + kTerminatorSize > payload_end) {
-        LOG(LS_WARNING) << "Unexpected end of packet while reading chunk #"
-                        << (i + 1) << ". Expected to find text of size "
-                        << item_length;
-        return false;
-      }
-      if (item_type == kCnameTag) {
-        if (cname_found) {
-          LOG(LS_WARNING) << "Found extra CNAME for same ssrc in chunk #"
-                          << (i + 1);
-          return false;
-        }
-        cname_found = true;
-        chunks[i].cname.assign(reinterpret_cast<const char*>(looking_at),
-                               item_length);
-      }
-      looking_at += item_length;
-    }
-    if (cname_found) {
-      // block_length calculates length of the packet that would be generated by
-      // Build/Create functions. Adjust it same way WithCName function does.
-      block_length += ChunkSize(chunks[i]);
-      ++i;
-    } else {
-      // RFC states CNAME item is mandatory.
-      // But same time it allows chunk without items.
-      // So while parsing, ignore all chunks without cname,
-      // but do not fail the parse.
-      LOG(LS_WARNING) << "CNAME not found for ssrc " << chunks[i].ssrc;
-      --number_of_chunks;
-      chunks.resize(number_of_chunks);
-    }
-    // Adjust to 32bit boundary.
-    looking_at += (payload_end - looking_at) % 4;
-  }
-
-  chunks_ = std::move(chunks);
-  block_length_ = block_length;
-  return true;
-}
-
-bool Sdes::AddCName(uint32_t ssrc, std::string cname) {
-  RTC_DCHECK_LE(cname.length(), 0xffu);
-  if (chunks_.size() >= kMaxNumberOfChunks) {
-    LOG(LS_WARNING) << "Max SDES chunks reached.";
-    return false;
-  }
-  Chunk chunk;
-  chunk.ssrc = ssrc;
-  chunk.cname = std::move(cname);
-  chunks_.push_back(chunk);
-  block_length_ += ChunkSize(chunk);
-  return true;
-}
-
-size_t Sdes::BlockLength() const {
-  return block_length_;
-}
-
-bool Sdes::Create(uint8_t* packet,
-                  size_t* index,
-                  size_t max_length,
-                  RtcpPacket::PacketReadyCallback* callback) const {
-  while (*index + BlockLength() > max_length) {
-    if (!OnBufferFull(packet, index, callback))
-      return false;
-  }
-  const size_t index_end = *index + BlockLength();
-  CreateHeader(chunks_.size(), kPacketType, HeaderLength(), packet, index);
-
-  for (const Sdes::Chunk& chunk : chunks_) {
-    ByteWriter<uint32_t>::WriteBigEndian(&packet[*index + 0], chunk.ssrc);
-    ByteWriter<uint8_t>::WriteBigEndian(&packet[*index + 4], kCnameTag);
-    ByteWriter<uint8_t>::WriteBigEndian(&packet[*index + 5],
-                                        chunk.cname.size());
-    memcpy(&packet[*index + 6], chunk.cname.data(), chunk.cname.size());
-    *index += (6 + chunk.cname.size());
-
-    // In each chunk, the list of items must be terminated by one or more null
-    // octets. The next chunk must start on a 32-bit boundary.
-    // CNAME (1 byte) | length (1 byte) | name | padding.
-    size_t padding_size = 4 - ((6 + chunk.cname.size()) % 4);
-    const int kPadding = 0;
-    memset(packet + *index, kPadding, padding_size);
-    *index += padding_size;
-  }
-
-  RTC_CHECK_EQ(*index, index_end);
-  return true;
-}
-}  // namespace rtcp
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/rtcp_packet/sdes.h b/modules/rtp_rtcp/source/rtcp_packet/sdes.h
deleted file mode 100644
index 5ce518e..0000000
--- a/modules/rtp_rtcp/source/rtcp_packet/sdes.h
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- *  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_RTP_RTCP_SOURCE_RTCP_PACKET_SDES_H_
-#define WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_PACKET_SDES_H_
-
-#include <string>
-#include <vector>
-
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet.h"
-#include "webrtc/rtc_base/basictypes.h"
-
-namespace webrtc {
-namespace rtcp {
-class CommonHeader;
-// Source Description (SDES) (RFC 3550).
-class Sdes : public RtcpPacket {
- public:
-  struct Chunk {
-    uint32_t ssrc;
-    std::string cname;
-  };
-  static constexpr uint8_t kPacketType = 202;
-  static constexpr size_t kMaxNumberOfChunks = 0x1f;
-
-  Sdes();
-  ~Sdes() override;
-
-  // Parse assumes header is already parsed and validated.
-  bool Parse(const CommonHeader& packet);
-
-  bool AddCName(uint32_t ssrc, std::string cname);
-
-  const std::vector<Chunk>& chunks() const { return chunks_; }
-
-  size_t BlockLength() const override;
-
-  bool Create(uint8_t* packet,
-              size_t* index,
-              size_t max_length,
-              RtcpPacket::PacketReadyCallback* callback) const override;
-
- private:
-  std::vector<Chunk> chunks_;
-  size_t block_length_;
-};
-}  // namespace rtcp
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_PACKET_SDES_H_
diff --git a/modules/rtp_rtcp/source/rtcp_packet/sdes_unittest.cc b/modules/rtp_rtcp/source/rtcp_packet/sdes_unittest.cc
deleted file mode 100644
index 5c5601b..0000000
--- a/modules/rtp_rtcp/source/rtcp_packet/sdes_unittest.cc
+++ /dev/null
@@ -1,249 +0,0 @@
-/*
- *  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/rtp_rtcp/source/rtcp_packet/sdes.h"
-
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/rtcp_packet_parser.h"
-
-using webrtc::rtcp::Sdes;
-
-namespace webrtc {
-namespace {
-const uint32_t kSenderSsrc = 0x12345678;
-const uint8_t kPadding = 0;
-const uint8_t kTerminatorTag = 0;
-const uint8_t kCnameTag = 1;
-const uint8_t kNameTag = 2;
-const uint8_t kEmailTag = 3;
-}  // namespace
-
-TEST(RtcpPacketSdesTest, CreateAndParseWithoutChunks) {
-  Sdes sdes;
-
-  rtc::Buffer packet = sdes.Build();
-  Sdes parsed;
-  EXPECT_TRUE(test::ParseSinglePacket(packet, &parsed));
-
-  EXPECT_EQ(0u, parsed.chunks().size());
-}
-
-TEST(RtcpPacketSdesTest, CreateAndParseWithOneChunk) {
-  const std::string kCname = "alice@host";
-
-  Sdes sdes;
-  EXPECT_TRUE(sdes.AddCName(kSenderSsrc, kCname));
-
-  rtc::Buffer packet = sdes.Build();
-  Sdes sdes_parsed;
-  EXPECT_TRUE(test::ParseSinglePacket(packet, &sdes_parsed));
-  const Sdes& parsed = sdes_parsed;  // Ensure accessors are const.
-
-  EXPECT_EQ(1u, parsed.chunks().size());
-  EXPECT_EQ(kSenderSsrc, parsed.chunks()[0].ssrc);
-  EXPECT_EQ(kCname, parsed.chunks()[0].cname);
-}
-
-TEST(RtcpPacketSdesTest, CreateAndParseWithMultipleChunks) {
-  Sdes sdes;
-  EXPECT_TRUE(sdes.AddCName(kSenderSsrc + 0, "a"));
-  EXPECT_TRUE(sdes.AddCName(kSenderSsrc + 1, "ab"));
-  EXPECT_TRUE(sdes.AddCName(kSenderSsrc + 2, "abc"));
-  EXPECT_TRUE(sdes.AddCName(kSenderSsrc + 3, "abcd"));
-  EXPECT_TRUE(sdes.AddCName(kSenderSsrc + 4, "abcde"));
-  EXPECT_TRUE(sdes.AddCName(kSenderSsrc + 5, "abcdef"));
-
-  rtc::Buffer packet = sdes.Build();
-  Sdes parsed;
-  EXPECT_TRUE(test::ParseSinglePacket(packet, &parsed));
-
-  EXPECT_EQ(6u, parsed.chunks().size());
-  EXPECT_EQ(kSenderSsrc + 5, parsed.chunks()[5].ssrc);
-  EXPECT_EQ("abcdef", parsed.chunks()[5].cname);
-}
-
-TEST(RtcpPacketSdesTest, CreateWithTooManyChunks) {
-  const size_t kMaxChunks = (1 << 5) - 1;
-  Sdes sdes;
-  for (size_t i = 0; i < kMaxChunks; ++i) {
-    uint32_t ssrc = kSenderSsrc + i;
-    std::ostringstream oss;
-    oss << "cname" << i;
-    EXPECT_TRUE(sdes.AddCName(ssrc, oss.str()));
-  }
-  EXPECT_FALSE(sdes.AddCName(kSenderSsrc + kMaxChunks, "foo"));
-}
-
-TEST(RtcpPacketSdesTest, CreateAndParseCnameItemWithEmptyString) {
-  Sdes sdes;
-  EXPECT_TRUE(sdes.AddCName(kSenderSsrc, ""));
-
-  rtc::Buffer packet = sdes.Build();
-  Sdes parsed;
-  EXPECT_TRUE(test::ParseSinglePacket(packet, &parsed));
-
-  EXPECT_EQ(1u, parsed.chunks().size());
-  EXPECT_EQ(kSenderSsrc, parsed.chunks()[0].ssrc);
-  EXPECT_EQ("", parsed.chunks()[0].cname);
-}
-
-TEST(RtcpPacketSdesTest, ParseSkipsNonCNameField) {
-  const uint8_t kName[] = "abc";
-  const uint8_t kCname[] = "de";
-  const uint8_t kValidPacket[] = {0x81,  202, 0x00, 0x04,
-                                  0x12, 0x34, 0x56, 0x78,
-                                  kNameTag,  3, kName[0],  kName[1], kName[2],
-                                  kCnameTag, 2, kCname[0], kCname[1],
-                                  kTerminatorTag, kPadding, kPadding};
-  // Sanity checks packet was assembled correctly.
-  ASSERT_EQ(0u, sizeof(kValidPacket) % 4);
-  ASSERT_EQ(kValidPacket[3] + 1u, sizeof(kValidPacket) / 4);
-
-  Sdes parsed;
-  EXPECT_TRUE(test::ParseSinglePacket(kValidPacket, &parsed));
-
-  EXPECT_EQ(1u, parsed.chunks().size());
-  EXPECT_EQ(kSenderSsrc, parsed.chunks()[0].ssrc);
-  EXPECT_EQ("de", parsed.chunks()[0].cname);
-}
-
-TEST(RtcpPacketSdesTest, ParseSkipsChunksWithoutCName) {
-  const uint8_t kName[] = "ab";
-  const uint8_t kEmail[] = "de";
-  const uint8_t kCname[] = "def";
-  const uint8_t kPacket[] = {0x82,  202, 0x00, 0x07,
-      0x12, 0x34, 0x56, 0x78,  // 1st chunk.
-      kNameTag,  3, kName[0],  kName[1], kName[2],
-      kEmailTag, 2, kEmail[0], kEmail[1],
-      kTerminatorTag, kPadding, kPadding,
-      0x23, 0x45, 0x67, 0x89,  // 2nd chunk.
-      kCnameTag, 3, kCname[0], kCname[1], kCname[2],
-      kTerminatorTag, kPadding, kPadding};
-  // Sanity checks packet was assembled correctly.
-  ASSERT_EQ(0u, sizeof(kPacket) % 4);
-  ASSERT_EQ(kPacket[3] + 1u, sizeof(kPacket) / 4);
-
-  Sdes parsed;
-  EXPECT_TRUE(test::ParseSinglePacket(kPacket, &parsed));
-  ASSERT_EQ(1u, parsed.chunks().size());
-  EXPECT_EQ(0x23456789u, parsed.chunks()[0].ssrc);
-  EXPECT_EQ("def", parsed.chunks()[0].cname);
-}
-
-TEST(RtcpPacketSdesTest, ParseFailsWithoutChunkItemTerminator) {
-  const uint8_t kName[] = "abc";
-  const uint8_t kCname[] = "d";
-  // No place for next chunk item.
-  const uint8_t kInvalidPacket[] = {0x81,  202, 0x00, 0x03,
-                                    0x12, 0x34, 0x56, 0x78,
-                                    kNameTag,  3, kName[0], kName[1], kName[2],
-                                    kCnameTag, 1, kCname[0]};
-  // Sanity checks packet was assembled correctly.
-  ASSERT_EQ(0u, sizeof(kInvalidPacket) % 4);
-  ASSERT_EQ(kInvalidPacket[3] + 1u, sizeof(kInvalidPacket) / 4);
-
-  Sdes parsed;
-  EXPECT_FALSE(test::ParseSinglePacket(kInvalidPacket, &parsed));
-}
-
-TEST(RtcpPacketSdesTest, ParseFailsWithDamagedChunkItem) {
-  const uint8_t kName[] = "ab";
-  const uint8_t kCname[] = "d";
-  // Next chunk item has non-terminator type, but not the size.
-  const uint8_t kInvalidPacket[] = {0x81,  202, 0x00, 0x03,
-                                    0x12, 0x34, 0x56, 0x78,
-                                    kNameTag,  2, kName[0], kName[1],
-                                    kCnameTag, 1, kCname[0],
-                                    kEmailTag};
-  // Sanity checks packet was assembled correctly.
-  ASSERT_EQ(0u, sizeof(kInvalidPacket) % 4);
-  ASSERT_EQ(kInvalidPacket[3] + 1u, sizeof(kInvalidPacket) / 4);
-
-  Sdes parsed;
-  EXPECT_FALSE(test::ParseSinglePacket(kInvalidPacket, &parsed));
-}
-
-TEST(RtcpPacketSdesTest, ParseFailsWithTooLongChunkItem) {
-  const uint8_t kName[] = "abc";
-  const uint8_t kCname[] = "d";
-  // Last chunk item has length that goes beyond the buffer end.
-  const uint8_t kInvalidPacket[] = {0x81,  202, 0x00, 0x03,
-                                    0x12, 0x34, 0x56, 0x78,
-                                    kNameTag,  3, kName[0], kName[1], kName[2],
-                                    kCnameTag, 2, kCname[0]};
-  // Sanity checks packet was assembled correctly.
-  ASSERT_EQ(0u, sizeof(kInvalidPacket) % 4);
-  ASSERT_EQ(kInvalidPacket[3] + 1u, sizeof(kInvalidPacket) / 4);
-
-  Sdes parsed;
-  EXPECT_FALSE(test::ParseSinglePacket(kInvalidPacket, &parsed));
-}
-
-TEST(RtcpPacketSdesTest, ParseFailsWithTwoCNames) {
-  const uint8_t kCname1[] = "a";
-  const uint8_t kCname2[] = "de";
-  const uint8_t kInvalidPacket[] = {0x81,  202, 0x00, 0x03,
-                                    0x12, 0x34, 0x56, 0x78,
-                                    kCnameTag, 1, kCname1[0],
-                                    kCnameTag, 2, kCname2[0], kCname2[1],
-                                    kTerminatorTag};
-  // Sanity checks packet was assembled correctly.
-  ASSERT_EQ(0u, sizeof(kInvalidPacket) % 4);
-  ASSERT_EQ(kInvalidPacket[3] + 1u, sizeof(kInvalidPacket) / 4);
-
-  Sdes parsed;
-  EXPECT_FALSE(test::ParseSinglePacket(kInvalidPacket, &parsed));
-}
-
-TEST(RtcpPacketSdesTest, ParseFailsWithTooLittleSpaceForNextChunk) {
-  const uint8_t kCname[] = "a";
-  const uint8_t kEmail[] = "de";
-  // Two chunks are promised in the header, but no place for the second chunk.
-  const uint8_t kInvalidPacket[] = {0x82,  202, 0x00, 0x04,
-                                    0x12, 0x34, 0x56, 0x78,  // 1st chunk.
-                                    kCnameTag, 1, kCname[0],
-                                    kEmailTag, 2, kEmail[0], kEmail[1],
-                                    kTerminatorTag,
-                                    0x23, 0x45, 0x67, 0x89};  // 2nd chunk.
-  // Sanity checks packet was assembled correctly.
-  ASSERT_EQ(0u, sizeof(kInvalidPacket) % 4);
-  ASSERT_EQ(kInvalidPacket[3] + 1u, sizeof(kInvalidPacket) / 4);
-
-  Sdes parsed;
-  EXPECT_FALSE(test::ParseSinglePacket(kInvalidPacket, &parsed));
-}
-
-TEST(RtcpPacketSdesTest, ParsedSdesCanBeReusedForBuilding) {
-  Sdes source;
-  const std::string kAlice = "alice@host";
-  const std::string kBob = "bob@host";
-  source.AddCName(kSenderSsrc, kAlice);
-
-  rtc::Buffer packet1 = source.Build();
-  Sdes middle;
-  test::ParseSinglePacket(packet1, &middle);
-
-  EXPECT_EQ(source.BlockLength(), middle.BlockLength());
-
-  middle.AddCName(kSenderSsrc + 1, kBob);
-
-  rtc::Buffer packet2 = middle.Build();
-  Sdes destination;
-  test::ParseSinglePacket(packet2, &destination);
-
-  EXPECT_EQ(middle.BlockLength(), destination.BlockLength());
-
-  EXPECT_EQ(2u, destination.chunks().size());
-  EXPECT_EQ(kSenderSsrc, destination.chunks()[0].ssrc);
-  EXPECT_EQ(kAlice, destination.chunks()[0].cname);
-  EXPECT_EQ(kSenderSsrc + 1, destination.chunks()[1].ssrc);
-  EXPECT_EQ(kBob, destination.chunks()[1].cname);
-}
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/rtcp_packet/sender_report.cc b/modules/rtp_rtcp/source/rtcp_packet/sender_report.cc
deleted file mode 100644
index a43ee18..0000000
--- a/modules/rtp_rtcp/source/rtcp_packet/sender_report.cc
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- *  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/rtp_rtcp/source/rtcp_packet/sender_report.h"
-
-#include <utility>
-
-#include "webrtc/modules/rtp_rtcp/source/byte_io.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/common_header.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-
-namespace webrtc {
-namespace rtcp {
-constexpr uint8_t SenderReport::kPacketType;
-constexpr size_t SenderReport::kMaxNumberOfReportBlocks;
-//    Sender report (SR) (RFC 3550).
-//     0                   1                   2                   3
-//     0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
-//    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//    |V=2|P|    RC   |   PT=SR=200   |             length            |
-//    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//  0 |                         SSRC of sender                        |
-//    +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
-//  4 |              NTP timestamp, most significant word             |
-//    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//  8 |             NTP timestamp, least significant word             |
-//    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-// 12 |                         RTP timestamp                         |
-//    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-// 16 |                     sender's packet count                     |
-//    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-// 20 |                      sender's octet count                     |
-// 24 +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
-
-SenderReport::SenderReport()
-    : sender_ssrc_(0),
-      rtp_timestamp_(0),
-      sender_packet_count_(0),
-      sender_octet_count_(0) {}
-
-SenderReport::~SenderReport() = default;
-
-bool SenderReport::Parse(const CommonHeader& packet) {
-  RTC_DCHECK_EQ(packet.type(), kPacketType);
-
-  const uint8_t report_block_count = packet.count();
-  if (packet.payload_size_bytes() <
-      kSenderBaseLength + report_block_count * ReportBlock::kLength) {
-    LOG(LS_WARNING) << "Packet is too small to contain all the data.";
-    return false;
-  }
-  // Read SenderReport header.
-  const uint8_t* const payload = packet.payload();
-  sender_ssrc_ = ByteReader<uint32_t>::ReadBigEndian(&payload[0]);
-  uint32_t secs = ByteReader<uint32_t>::ReadBigEndian(&payload[4]);
-  uint32_t frac = ByteReader<uint32_t>::ReadBigEndian(&payload[8]);
-  ntp_.Set(secs, frac);
-  rtp_timestamp_ = ByteReader<uint32_t>::ReadBigEndian(&payload[12]);
-  sender_packet_count_ = ByteReader<uint32_t>::ReadBigEndian(&payload[16]);
-  sender_octet_count_ = ByteReader<uint32_t>::ReadBigEndian(&payload[20]);
-  report_blocks_.resize(report_block_count);
-  const uint8_t* next_block = payload + kSenderBaseLength;
-  for (ReportBlock& block : report_blocks_) {
-    bool block_parsed = block.Parse(next_block, ReportBlock::kLength);
-    RTC_DCHECK(block_parsed);
-    next_block += ReportBlock::kLength;
-  }
-  // Double check we didn't read beyond provided buffer.
-  RTC_DCHECK_LE(next_block - payload,
-                static_cast<ptrdiff_t>(packet.payload_size_bytes()));
-  return true;
-}
-
-size_t SenderReport::BlockLength() const {
-  return kHeaderLength + kSenderBaseLength +
-         report_blocks_.size() * ReportBlock::kLength;
-}
-
-bool SenderReport::Create(uint8_t* packet,
-                          size_t* index,
-                          size_t max_length,
-                          RtcpPacket::PacketReadyCallback* callback) const {
-  while (*index + BlockLength() > max_length) {
-    if (!OnBufferFull(packet, index, callback))
-      return false;
-  }
-  const size_t index_end = *index + BlockLength();
-
-  CreateHeader(report_blocks_.size(), kPacketType, HeaderLength(), packet,
-               index);
-  // Write SenderReport header.
-  ByteWriter<uint32_t>::WriteBigEndian(&packet[*index + 0], sender_ssrc_);
-  ByteWriter<uint32_t>::WriteBigEndian(&packet[*index + 4], ntp_.seconds());
-  ByteWriter<uint32_t>::WriteBigEndian(&packet[*index + 8], ntp_.fractions());
-  ByteWriter<uint32_t>::WriteBigEndian(&packet[*index + 12], rtp_timestamp_);
-  ByteWriter<uint32_t>::WriteBigEndian(&packet[*index + 16],
-                                       sender_packet_count_);
-  ByteWriter<uint32_t>::WriteBigEndian(&packet[*index + 20],
-                                       sender_octet_count_);
-  *index += kSenderBaseLength;
-  // Write report blocks.
-  for (const ReportBlock& block : report_blocks_) {
-    block.Create(packet + *index);
-    *index += ReportBlock::kLength;
-  }
-  // Ensure bytes written match expected.
-  RTC_DCHECK_EQ(*index, index_end);
-  return true;
-}
-
-bool SenderReport::AddReportBlock(const ReportBlock& block) {
-  if (report_blocks_.size() >= kMaxNumberOfReportBlocks) {
-    LOG(LS_WARNING) << "Max report blocks reached.";
-    return false;
-  }
-  report_blocks_.push_back(block);
-  return true;
-}
-
-bool SenderReport::SetReportBlocks(std::vector<ReportBlock> blocks) {
-  if (blocks.size() > kMaxNumberOfReportBlocks) {
-    LOG(LS_WARNING) << "Too many report blocks (" << blocks.size()
-                    << ") for sender report.";
-    return false;
-  }
-  report_blocks_ = std::move(blocks);
-  return true;
-}
-
-}  // namespace rtcp
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/rtcp_packet/sender_report.h b/modules/rtp_rtcp/source/rtcp_packet/sender_report.h
deleted file mode 100644
index 69b55db..0000000
--- a/modules/rtp_rtcp/source/rtcp_packet/sender_report.h
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- *  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_RTP_RTCP_SOURCE_RTCP_PACKET_SENDER_REPORT_H_
-#define WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_PACKET_SENDER_REPORT_H_
-
-#include <vector>
-
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/report_block.h"
-#include "webrtc/system_wrappers/include/ntp_time.h"
-
-namespace webrtc {
-namespace rtcp {
-class CommonHeader;
-
-class SenderReport : public RtcpPacket {
- public:
-  static constexpr uint8_t kPacketType = 200;
-  static constexpr size_t kMaxNumberOfReportBlocks = 0x1f;
-
-  SenderReport();
-  ~SenderReport() override;
-
-  // Parse assumes header is already parsed and validated.
-  bool Parse(const CommonHeader& packet);
-
-  void SetSenderSsrc(uint32_t ssrc) { sender_ssrc_ = ssrc; }
-  void SetNtp(NtpTime ntp) { ntp_ = ntp; }
-  void SetRtpTimestamp(uint32_t rtp_timestamp) {
-    rtp_timestamp_ = rtp_timestamp;
-  }
-  void SetPacketCount(uint32_t packet_count) {
-    sender_packet_count_ = packet_count;
-  }
-  void SetOctetCount(uint32_t octet_count) {
-    sender_octet_count_ = octet_count;
-  }
-  bool AddReportBlock(const ReportBlock& block);
-  bool SetReportBlocks(std::vector<ReportBlock> blocks);
-  void ClearReportBlocks() { report_blocks_.clear(); }
-
-  uint32_t sender_ssrc() const { return sender_ssrc_; }
-  NtpTime ntp() const { return ntp_; }
-  uint32_t rtp_timestamp() const { return rtp_timestamp_; }
-  uint32_t sender_packet_count() const { return sender_packet_count_; }
-  uint32_t sender_octet_count() const { return sender_octet_count_; }
-
-  const std::vector<ReportBlock>& report_blocks() const {
-    return report_blocks_;
-  }
-
-  size_t BlockLength() const override;
-
-  bool Create(uint8_t* packet,
-              size_t* index,
-              size_t max_length,
-              RtcpPacket::PacketReadyCallback* callback) const override;
-
- private:
-  const size_t kSenderBaseLength = 24;
-
-  uint32_t sender_ssrc_;
-  NtpTime ntp_;
-  uint32_t rtp_timestamp_;
-  uint32_t sender_packet_count_;
-  uint32_t sender_octet_count_;
-  std::vector<ReportBlock> report_blocks_;
-};
-
-}  // namespace rtcp
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_PACKET_SENDER_REPORT_H_
diff --git a/modules/rtp_rtcp/source/rtcp_packet/sender_report_unittest.cc b/modules/rtp_rtcp/source/rtcp_packet/sender_report_unittest.cc
deleted file mode 100644
index 8e3a926..0000000
--- a/modules/rtp_rtcp/source/rtcp_packet/sender_report_unittest.cc
+++ /dev/null
@@ -1,145 +0,0 @@
-/*
- *  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/rtp_rtcp/source/rtcp_packet/sender_report.h"
-
-#include <utility>
-
-#include "webrtc/test/gmock.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/rtcp_packet_parser.h"
-
-using testing::ElementsAreArray;
-using testing::make_tuple;
-using webrtc::rtcp::ReportBlock;
-using webrtc::rtcp::SenderReport;
-
-namespace webrtc {
-namespace {
-const uint32_t kSenderSsrc = 0x12345678;
-const uint32_t kRemoteSsrc = 0x23456789;
-const NtpTime kNtp(0x11121418, 0x22242628);
-const uint32_t kRtpTimestamp = 0x33343536;
-const uint32_t kPacketCount = 0x44454647;
-const uint32_t kOctetCount = 0x55565758;
-const uint8_t kPacket[] = {0x80,  200, 0x00, 0x06,
-                           0x12, 0x34, 0x56, 0x78,
-                           0x11, 0x12, 0x14, 0x18,
-                           0x22, 0x24, 0x26, 0x28,
-                           0x33, 0x34, 0x35, 0x36,
-                           0x44, 0x45, 0x46, 0x47,
-                           0x55, 0x56, 0x57, 0x58};
-}  // namespace
-
-TEST(RtcpPacketSenderReportTest, CreateWithoutReportBlocks) {
-  SenderReport sr;
-  sr.SetSenderSsrc(kSenderSsrc);
-  sr.SetNtp(kNtp);
-  sr.SetRtpTimestamp(kRtpTimestamp);
-  sr.SetPacketCount(kPacketCount);
-  sr.SetOctetCount(kOctetCount);
-
-  rtc::Buffer raw = sr.Build();
-  EXPECT_THAT(make_tuple(raw.data(), raw.size()), ElementsAreArray(kPacket));
-}
-
-TEST(RtcpPacketSenderReportTest, ParseWithoutReportBlocks) {
-  SenderReport parsed;
-  EXPECT_TRUE(test::ParseSinglePacket(kPacket, &parsed));
-
-  EXPECT_EQ(kSenderSsrc, parsed.sender_ssrc());
-  EXPECT_EQ(kNtp, parsed.ntp());
-  EXPECT_EQ(kRtpTimestamp, parsed.rtp_timestamp());
-  EXPECT_EQ(kPacketCount, parsed.sender_packet_count());
-  EXPECT_EQ(kOctetCount, parsed.sender_octet_count());
-  EXPECT_TRUE(parsed.report_blocks().empty());
-}
-
-TEST(RtcpPacketSenderReportTest, CreateAndParseWithOneReportBlock) {
-  ReportBlock rb;
-  rb.SetMediaSsrc(kRemoteSsrc);
-
-  SenderReport sr;
-  sr.SetSenderSsrc(kSenderSsrc);
-  EXPECT_TRUE(sr.AddReportBlock(rb));
-
-  rtc::Buffer raw = sr.Build();
-  SenderReport parsed;
-  EXPECT_TRUE(test::ParseSinglePacket(raw, &parsed));
-
-  EXPECT_EQ(kSenderSsrc, parsed.sender_ssrc());
-  EXPECT_EQ(1u, parsed.report_blocks().size());
-  EXPECT_EQ(kRemoteSsrc, parsed.report_blocks()[0].source_ssrc());
-}
-
-TEST(RtcpPacketSenderReportTest, CreateAndParseWithTwoReportBlocks) {
-  ReportBlock rb1;
-  rb1.SetMediaSsrc(kRemoteSsrc);
-  ReportBlock rb2;
-  rb2.SetMediaSsrc(kRemoteSsrc + 1);
-
-  SenderReport sr;
-  sr.SetSenderSsrc(kSenderSsrc);
-  EXPECT_TRUE(sr.AddReportBlock(rb1));
-  EXPECT_TRUE(sr.AddReportBlock(rb2));
-
-  rtc::Buffer raw = sr.Build();
-  SenderReport parsed;
-  EXPECT_TRUE(test::ParseSinglePacket(raw, &parsed));
-
-  EXPECT_EQ(kSenderSsrc, parsed.sender_ssrc());
-  EXPECT_EQ(2u, parsed.report_blocks().size());
-  EXPECT_EQ(kRemoteSsrc, parsed.report_blocks()[0].source_ssrc());
-  EXPECT_EQ(kRemoteSsrc + 1, parsed.report_blocks()[1].source_ssrc());
-}
-
-TEST(RtcpPacketSenderReportTest, CreateWithTooManyReportBlocks) {
-  SenderReport sr;
-  sr.SetSenderSsrc(kSenderSsrc);
-  ReportBlock rb;
-  for (size_t i = 0; i < SenderReport::kMaxNumberOfReportBlocks; ++i) {
-    rb.SetMediaSsrc(kRemoteSsrc + i);
-    EXPECT_TRUE(sr.AddReportBlock(rb));
-  }
-  rb.SetMediaSsrc(kRemoteSsrc + SenderReport::kMaxNumberOfReportBlocks);
-  EXPECT_FALSE(sr.AddReportBlock(rb));
-}
-
-TEST(RtcpPacketSenderReportTest, SetReportBlocksOverwritesOldBlocks) {
-  SenderReport sr;
-  ReportBlock report_block;
-  // Use jitter field of the report blocks to distinguish them.
-  report_block.SetJitter(1001u);
-  sr.AddReportBlock(report_block);
-  ASSERT_EQ(sr.report_blocks().size(), 1u);
-  ASSERT_EQ(sr.report_blocks()[0].jitter(), 1001u);
-
-  std::vector<ReportBlock> blocks(3u);
-  blocks[0].SetJitter(2001u);
-  blocks[1].SetJitter(3001u);
-  blocks[2].SetJitter(4001u);
-  EXPECT_TRUE(sr.SetReportBlocks(blocks));
-  ASSERT_EQ(sr.report_blocks().size(), 3u);
-  EXPECT_EQ(sr.report_blocks()[0].jitter(), 2001u);
-  EXPECT_EQ(sr.report_blocks()[1].jitter(), 3001u);
-  EXPECT_EQ(sr.report_blocks()[2].jitter(), 4001u);
-}
-
-TEST(RtcpPacketSenderReportTest, SetReportBlocksMaxLimit) {
-  SenderReport sr;
-  std::vector<ReportBlock> max_blocks(SenderReport::kMaxNumberOfReportBlocks);
-  EXPECT_TRUE(sr.SetReportBlocks(std::move(max_blocks)));
-
-  std::vector<ReportBlock> one_too_many_blocks(
-      SenderReport::kMaxNumberOfReportBlocks + 1);
-  EXPECT_FALSE(sr.SetReportBlocks(std::move(one_too_many_blocks)));
-}
-
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/rtcp_packet/target_bitrate.cc b/modules/rtp_rtcp/source/rtcp_packet/target_bitrate.cc
deleted file mode 100644
index 7f1fae4..0000000
--- a/modules/rtp_rtcp/source/rtcp_packet/target_bitrate.cc
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- *  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/rtp_rtcp/source/rtcp_packet/target_bitrate.h"
-
-#include "webrtc/modules/rtp_rtcp/source/byte_io.h"
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-namespace rtcp {
-constexpr size_t kTargetBitrateHeaderSizeBytes = 4;
-constexpr uint8_t TargetBitrate::kBlockType;
-const size_t TargetBitrate::kBitrateItemSizeBytes = 4;
-
-TargetBitrate::BitrateItem::BitrateItem()
-    : spatial_layer(0), temporal_layer(0), target_bitrate_kbps(0) {}
-
-TargetBitrate::BitrateItem::BitrateItem(uint8_t spatial_layer,
-                                        uint8_t temporal_layer,
-                                        uint32_t target_bitrate_kbps)
-    : spatial_layer(spatial_layer),
-      temporal_layer(temporal_layer),
-      target_bitrate_kbps(target_bitrate_kbps) {}
-
-//  RFC 4585: Feedback format.
-//
-//  Common packet format:
-//
-//   0                   1                   2                   3
-//   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
-//  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//  |     BT=42     |   reserved    |         block length          |
-//  +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
-//
-//  Target bitrate item (repeat as many times as necessary).
-//
-//  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//  |   S   |   T   |                Target Bitrate                 |
-//  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//  :  ...                                                          :
-//
-//  Spatial Layer (S): 4 bits
-//    Indicates which temporal layer this bitrate concerns.
-//
-//  Temporal Layer (T): 4 bits
-//    Indicates which temporal layer this bitrate concerns.
-//
-//  Target Bitrate: 24 bits
-//    The encoder target bitrate for this layer, in kbps.
-//
-//  As an example of how S and T are intended to be used, VP8 simulcast will
-//  use a separate TargetBitrate message per stream, since they are transmitted
-//  on separate SSRCs, with temporal layers grouped by stream.
-//  If VP9 SVC is used, there will be only one SSRC, so each spatial and
-//  temporal layer combo used shall be specified in the TargetBitrate packet.
-
-TargetBitrate::TargetBitrate() {}
-TargetBitrate::~TargetBitrate() {}
-
-void TargetBitrate::Parse(const uint8_t* block, uint16_t block_length) {
-  // Validate block header (should already have been parsed and checked).
-  RTC_DCHECK_EQ(block[0], kBlockType);
-  RTC_DCHECK_EQ(block_length, ByteReader<uint16_t>::ReadBigEndian(&block[2]));
-
-  // Header specifies block length - 1, but since we ignore the header, which
-  // occupies exactly on block, we can just treat this as payload length.
-  const size_t payload_bytes = block_length * 4;
-  const size_t num_items = payload_bytes / kBitrateItemSizeBytes;
-  size_t index = kTargetBitrateHeaderSizeBytes;
-  bitrates_.clear();
-  for (size_t i = 0; i < num_items; ++i) {
-    uint8_t layers = block[index];
-    uint32_t bitrate_kbps =
-        ByteReader<uint32_t, 3>::ReadBigEndian(&block[index + 1]);
-    index += kBitrateItemSizeBytes;
-    AddTargetBitrate((layers >> 4) & 0x0F, layers & 0x0F, bitrate_kbps);
-  }
-}
-
-void TargetBitrate::AddTargetBitrate(uint8_t spatial_layer,
-                                     uint8_t temporal_layer,
-                                     uint32_t target_bitrate_kbps) {
-  RTC_DCHECK_LE(spatial_layer, 0x0F);
-  RTC_DCHECK_LE(temporal_layer, 0x0F);
-  RTC_DCHECK_LE(target_bitrate_kbps, 0x00FFFFFFU);
-  bitrates_.push_back(
-      BitrateItem(spatial_layer, temporal_layer, target_bitrate_kbps));
-}
-
-const std::vector<TargetBitrate::BitrateItem>&
-TargetBitrate::GetTargetBitrates() const {
-  return bitrates_;
-}
-
-size_t TargetBitrate::BlockLength() const {
-  return kTargetBitrateHeaderSizeBytes +
-         bitrates_.size() * kBitrateItemSizeBytes;
-}
-
-void TargetBitrate::Create(uint8_t* buffer) const {
-  buffer[0] = kBlockType;
-  buffer[1] = 0;  // Reserved.
-  const size_t block_length_words = (BlockLength() / 4) - 1;
-  ByteWriter<uint16_t>::WriteBigEndian(&buffer[2], block_length_words);
-
-  size_t index = kTargetBitrateHeaderSizeBytes;
-  for (const BitrateItem& item : bitrates_) {
-    buffer[index] = (item.spatial_layer << 4) | item.temporal_layer;
-    ByteWriter<uint32_t, 3>::WriteBigEndian(&buffer[index + 1],
-                                            item.target_bitrate_kbps);
-    index += kBitrateItemSizeBytes;
-  }
-}
-
-}  // namespace rtcp
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/rtcp_packet/target_bitrate.h b/modules/rtp_rtcp/source/rtcp_packet/target_bitrate.h
deleted file mode 100644
index 0781a6b..0000000
--- a/modules/rtp_rtcp/source/rtcp_packet/target_bitrate.h
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- *  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_RTP_RTCP_SOURCE_RTCP_PACKET_TARGET_BITRATE_H_
-#define WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_PACKET_TARGET_BITRATE_H_
-
-#include <vector>
-
-#include "webrtc/rtc_base/basictypes.h"
-
-namespace webrtc {
-namespace rtcp {
-
-class TargetBitrate {
- public:
-  // TODO(sprang): This block type is just a place holder. We need to get an
-  //               id assigned by IANA.
-  static constexpr uint8_t kBlockType = 42;
-  static const size_t kBitrateItemSizeBytes;
-
-  struct BitrateItem {
-    BitrateItem();
-    BitrateItem(uint8_t spatial_layer,
-                uint8_t temporal_layer,
-                uint32_t target_bitrate_kbps);
-
-    uint8_t spatial_layer;
-    uint8_t temporal_layer;
-    uint32_t target_bitrate_kbps;
-  };
-
-  TargetBitrate();
-  ~TargetBitrate();
-
-  void AddTargetBitrate(uint8_t spatial_layer,
-                        uint8_t temporal_layer,
-                        uint32_t target_bitrate_kbps);
-
-  const std::vector<BitrateItem>& GetTargetBitrates() const;
-
-  void Parse(const uint8_t* block, uint16_t block_length);
-
-  size_t BlockLength() const;
-
-  void Create(uint8_t* buffer) const;
-
- private:
-  std::vector<BitrateItem> bitrates_;
-};
-
-}  // namespace rtcp
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_PACKET_TARGET_BITRATE_H_
diff --git a/modules/rtp_rtcp/source/rtcp_packet/target_bitrate_unittest.cc b/modules/rtp_rtcp/source/rtcp_packet/target_bitrate_unittest.cc
deleted file mode 100644
index 75efe31..0000000
--- a/modules/rtp_rtcp/source/rtcp_packet/target_bitrate_unittest.cc
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- *  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/rtp_rtcp/source/rtcp_packet/target_bitrate.h"
-
-#include "webrtc/modules/rtp_rtcp/source/byte_io.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/extended_reports.h"
-#include "webrtc/rtc_base/buffer.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/rtcp_packet_parser.h"
-
-namespace webrtc {
-namespace {
-using BitrateItem = rtcp::TargetBitrate::BitrateItem;
-using rtcp::TargetBitrate;
-using test::ParseSinglePacket;
-
-constexpr uint32_t kSsrc = 0x12345678;
-
-// clang-format off
-const uint8_t kPacket[] = { TargetBitrate::kBlockType,  // Block ID.
-                                  0x00,                 // Reserved.
-                                        0x00, 0x04,     // Length = 4 words.
-                            0x00, 0x01, 0x02, 0x03,     // S0T0 0x010203 kbps.
-                            0x01, 0x02, 0x03, 0x04,     // S0T1 0x020304 kbps.
-                            0x10, 0x03, 0x04, 0x05,     // S1T0 0x030405 kbps.
-                            0x11, 0x04, 0x05, 0x06 };   // S1T1 0x040506 kbps.
-constexpr size_t kPacketLengthBlocks = ((sizeof(kPacket) + 3) / 4) - 1;
-// clang-format on
-
-void ExpectBirateItemEquals(const BitrateItem& expected,
-                            const BitrateItem& actual) {
-  EXPECT_EQ(expected.spatial_layer, actual.spatial_layer);
-  EXPECT_EQ(expected.temporal_layer, actual.temporal_layer);
-  EXPECT_EQ(expected.target_bitrate_kbps, actual.target_bitrate_kbps);
-}
-
-void CheckBitrateItems(const std::vector<BitrateItem>& bitrates) {
-  EXPECT_EQ(4U, bitrates.size());
-  ExpectBirateItemEquals(BitrateItem(0, 0, 0x010203), bitrates[0]);
-  ExpectBirateItemEquals(BitrateItem(0, 1, 0x020304), bitrates[1]);
-  ExpectBirateItemEquals(BitrateItem(1, 0, 0x030405), bitrates[2]);
-  ExpectBirateItemEquals(BitrateItem(1, 1, 0x040506), bitrates[3]);
-}
-
-}  // namespace
-
-TEST(TargetBitrateTest, Parse) {
-  TargetBitrate target_bitrate;
-  target_bitrate.Parse(kPacket, kPacketLengthBlocks);
-  CheckBitrateItems(target_bitrate.GetTargetBitrates());
-}
-
-TEST(TargetBitrateTest, FullPacket) {
-  const size_t kXRHeaderSize = 8;  // RTCP header (4) + SSRC (4).
-  const size_t kTotalSize = kXRHeaderSize + sizeof(kPacket);
-  uint8_t kRtcpPacket[kTotalSize] = {2 << 6, 207,  0x00, (kTotalSize / 4) - 1,
-                                     0x12,   0x34, 0x56, 0x78};  // SSRC.
-  memcpy(&kRtcpPacket[kXRHeaderSize], kPacket, sizeof(kPacket));
-  rtcp::ExtendedReports xr;
-  EXPECT_TRUE(ParseSinglePacket(kRtcpPacket, &xr));
-  EXPECT_EQ(kSsrc, xr.sender_ssrc());
-  const rtc::Optional<TargetBitrate>& target_bitrate = xr.target_bitrate();
-  ASSERT_TRUE(static_cast<bool>(target_bitrate));
-  CheckBitrateItems(target_bitrate->GetTargetBitrates());
-}
-
-TEST(TargetBitrateTest, Create) {
-  TargetBitrate target_bitrate;
-  target_bitrate.AddTargetBitrate(0, 0, 0x010203);
-  target_bitrate.AddTargetBitrate(0, 1, 0x020304);
-  target_bitrate.AddTargetBitrate(1, 0, 0x030405);
-  target_bitrate.AddTargetBitrate(1, 1, 0x040506);
-
-  uint8_t buffer[sizeof(kPacket)] = {};
-  ASSERT_EQ(sizeof(kPacket), target_bitrate.BlockLength());
-  target_bitrate.Create(buffer);
-
-  EXPECT_EQ(0, memcmp(kPacket, buffer, sizeof(kPacket)));
-}
-
-TEST(TargetBitrateTest, ParseNullBitratePacket) {
-  const uint8_t kNullPacket[] = {TargetBitrate::kBlockType, 0x00, 0x00, 0x00};
-  TargetBitrate target_bitrate;
-  target_bitrate.Parse(kNullPacket, 0);
-  EXPECT_TRUE(target_bitrate.GetTargetBitrates().empty());
-}
-
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/rtcp_packet/tmmb_item.cc b/modules/rtp_rtcp/source/rtcp_packet/tmmb_item.cc
deleted file mode 100644
index 97e361a..0000000
--- a/modules/rtp_rtcp/source/rtcp_packet/tmmb_item.cc
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- *  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/rtp_rtcp/source/rtcp_packet/tmmb_item.h"
-
-#include "webrtc/modules/rtp_rtcp/source/byte_io.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-
-namespace webrtc {
-namespace rtcp {
-TmmbItem::TmmbItem(uint32_t ssrc, uint64_t bitrate_bps, uint16_t overhead)
-    : ssrc_(ssrc), bitrate_bps_(bitrate_bps), packet_overhead_(overhead) {
-  RTC_DCHECK_LE(overhead, 0x1ffu);
-}
-
-//    0                   1                   2                   3
-//    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
-//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-// 0 |                              SSRC                             |
-//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-// 4 | MxTBR Exp |  MxTBR Mantissa                 |Measured Overhead|
-//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-bool TmmbItem::Parse(const uint8_t* buffer) {
-  ssrc_ = ByteReader<uint32_t>::ReadBigEndian(&buffer[0]);
-  // Read 4 bytes into 1 block.
-  uint32_t compact = ByteReader<uint32_t>::ReadBigEndian(&buffer[4]);
-  // Split 1 block into 3 components.
-  uint8_t exponent = compact >> 26;              // 6 bits.
-  uint64_t mantissa = (compact >> 9) & 0x1ffff;  // 17 bits.
-  uint16_t overhead = compact & 0x1ff;           // 9 bits.
-  // Combine 3 components into 2 values.
-  bitrate_bps_ = (mantissa << exponent);
-
-  bool shift_overflow = (bitrate_bps_ >> exponent) != mantissa;
-  if (shift_overflow) {
-    LOG(LS_ERROR) << "Invalid tmmb bitrate value : " << mantissa
-                  << "*2^" << static_cast<int>(exponent);
-    return false;
-  }
-  packet_overhead_ = overhead;
-  return true;
-}
-
-void TmmbItem::Create(uint8_t* buffer) const {
-  constexpr uint64_t kMaxMantissa = 0x1ffff;  // 17 bits.
-  uint64_t mantissa = bitrate_bps_;
-  uint32_t exponent = 0;
-  while (mantissa > kMaxMantissa) {
-    mantissa >>= 1;
-    ++exponent;
-  }
-
-  ByteWriter<uint32_t>::WriteBigEndian(&buffer[0], ssrc_);
-  uint32_t compact = (exponent << 26) | (mantissa << 9) | packet_overhead_;
-  ByteWriter<uint32_t>::WriteBigEndian(&buffer[4], compact);
-}
-
-void TmmbItem::set_packet_overhead(uint16_t overhead) {
-  RTC_DCHECK_LE(overhead, 0x1ffu);
-  packet_overhead_ = overhead;
-}
-}  // namespace rtcp
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/rtcp_packet/tmmb_item.h b/modules/rtp_rtcp/source/rtcp_packet/tmmb_item.h
deleted file mode 100644
index 31071c0..0000000
--- a/modules/rtp_rtcp/source/rtcp_packet/tmmb_item.h
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- *  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_RTP_RTCP_SOURCE_RTCP_PACKET_TMMB_ITEM_H_
-#define WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_PACKET_TMMB_ITEM_H_
-
-#include "webrtc/rtc_base/basictypes.h"
-
-namespace webrtc {
-namespace rtcp {
-// RFC5104, Section 3.5.4
-// Temporary Maximum Media Stream Bitrate Request/Notification.
-// Used both by TMMBR and TMMBN rtcp packets.
-class TmmbItem {
- public:
-  static const size_t kLength = 8;
-
-  TmmbItem() : ssrc_(0), bitrate_bps_(0), packet_overhead_(0) {}
-  TmmbItem(uint32_t ssrc, uint64_t bitrate_bps, uint16_t overhead);
-
-  bool Parse(const uint8_t* buffer);
-  void Create(uint8_t* buffer) const;
-
-  void set_ssrc(uint32_t ssrc) { ssrc_ = ssrc; }
-  void set_bitrate_bps(uint64_t bitrate_bps) { bitrate_bps_ = bitrate_bps; }
-  void set_packet_overhead(uint16_t overhead);
-
-  uint32_t ssrc() const { return ssrc_; }
-  uint64_t bitrate_bps() const { return bitrate_bps_; }
-  uint16_t packet_overhead() const { return packet_overhead_; }
-
- private:
-  // Media stream id.
-  uint32_t ssrc_;
-  // Maximum total media bit rate that the media receiver is
-  // currently prepared to accept for this media stream.
-  uint64_t bitrate_bps_;
-  // Per-packet overhead that the media receiver has observed
-  // for this media stream at its chosen reference protocol layer.
-  uint16_t packet_overhead_;
-};
-}  // namespace rtcp
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_PACKET_TMMB_ITEM_H_
diff --git a/modules/rtp_rtcp/source/rtcp_packet/tmmbn.cc b/modules/rtp_rtcp/source/rtcp_packet/tmmbn.cc
deleted file mode 100644
index 3f26983..0000000
--- a/modules/rtp_rtcp/source/rtcp_packet/tmmbn.cc
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- *  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/rtp_rtcp/source/rtcp_packet/tmmbn.h"
-
-#include "webrtc/modules/rtp_rtcp/source/byte_io.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/common_header.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-
-namespace webrtc {
-namespace rtcp {
-constexpr uint8_t Tmmbn::kFeedbackMessageType;
-// RFC 4585: Feedback format.
-// Common packet format:
-//
-//    0                   1                   2                   3
-//    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
-//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//   |V=2|P|   FMT   |       PT      |          length               |
-//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//   |                  SSRC of packet sender                        |
-//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//   |             SSRC of media source (unused) = 0                 |
-//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//   :            Feedback Control Information (FCI)                 :
-//   :                                                               :
-// Temporary Maximum Media Stream Bit Rate Notification (TMMBN) (RFC 5104).
-// The Feedback Control Information (FCI) consists of zero, one, or more
-// TMMBN FCI entries.
-//    0                   1                   2                   3
-//    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
-//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//   |                              SSRC                             |
-//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//   | MxTBR Exp |  MxTBR Mantissa                 |Measured Overhead|
-//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-
-Tmmbn::Tmmbn() = default;
-
-Tmmbn::~Tmmbn() = default;
-
-bool Tmmbn::Parse(const CommonHeader& packet) {
-  RTC_DCHECK_EQ(packet.type(), kPacketType);
-  RTC_DCHECK_EQ(packet.fmt(), kFeedbackMessageType);
-
-  if (packet.payload_size_bytes() < kCommonFeedbackLength) {
-    LOG(LS_WARNING) << "Payload length " << packet.payload_size_bytes()
-                    << " is too small for TMMBN.";
-    return false;
-  }
-  size_t items_size_bytes = packet.payload_size_bytes() - kCommonFeedbackLength;
-  if (items_size_bytes % TmmbItem::kLength != 0) {
-    LOG(LS_WARNING) << "Payload length " << packet.payload_size_bytes()
-                    << " is not valid for TMMBN.";
-    return false;
-  }
-  ParseCommonFeedback(packet.payload());
-  const uint8_t* next_item = packet.payload() + kCommonFeedbackLength;
-
-  size_t number_of_items = items_size_bytes / TmmbItem::kLength;
-  items_.resize(number_of_items);
-  for (TmmbItem& item : items_) {
-    if (!item.Parse(next_item))
-      return false;
-    next_item += TmmbItem::kLength;
-  }
-  return true;
-}
-
-void Tmmbn::AddTmmbr(const TmmbItem& item) {
-  items_.push_back(item);
-}
-
-size_t Tmmbn::BlockLength() const {
-  return kHeaderLength + kCommonFeedbackLength +
-         TmmbItem::kLength * items_.size();
-}
-
-bool Tmmbn::Create(uint8_t* packet,
-                   size_t* index,
-                   size_t max_length,
-                   RtcpPacket::PacketReadyCallback* callback) const {
-  while (*index + BlockLength() > max_length) {
-    if (!OnBufferFull(packet, index, callback))
-      return false;
-  }
-  const size_t index_end = *index + BlockLength();
-
-  CreateHeader(kFeedbackMessageType, kPacketType, HeaderLength(), packet,
-               index);
-  RTC_DCHECK_EQ(0, Rtpfb::media_ssrc());
-  CreateCommonFeedback(packet + *index);
-  *index += kCommonFeedbackLength;
-  for (const TmmbItem& item : items_) {
-    item.Create(packet + *index);
-    *index += TmmbItem::kLength;
-  }
-  RTC_CHECK_EQ(index_end, *index);
-  return true;
-}
-}  // namespace rtcp
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/rtcp_packet/tmmbn.h b/modules/rtp_rtcp/source/rtcp_packet/tmmbn.h
deleted file mode 100644
index 3a06e44..0000000
--- a/modules/rtp_rtcp/source/rtcp_packet/tmmbn.h
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- *  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_RTP_RTCP_SOURCE_RTCP_PACKET_TMMBN_H_
-#define WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_PACKET_TMMBN_H_
-
-#include <vector>
-
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/rtpfb.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/tmmb_item.h"
-#include "webrtc/rtc_base/basictypes.h"
-
-namespace webrtc {
-namespace rtcp {
-class CommonHeader;
-
-// Temporary Maximum Media Stream Bit Rate Notification (TMMBN).
-// RFC 5104, Section 4.2.2.
-class Tmmbn : public Rtpfb {
- public:
-  static constexpr uint8_t kFeedbackMessageType = 4;
-
-  Tmmbn();
-  ~Tmmbn() override;
-
-  // Parse assumes header is already parsed and validated.
-  bool Parse(const CommonHeader& packet);
-
-  void AddTmmbr(const TmmbItem& item);
-
-  const std::vector<TmmbItem>& items() const { return items_; }
-
-  size_t BlockLength() const override;
-
-  bool Create(uint8_t* packet,
-              size_t* index,
-              size_t max_length,
-              RtcpPacket::PacketReadyCallback* callback) const override;
-
- private:
-  // Media ssrc is unused, shadow base class setter and getter.
-  void SetMediaSsrc(uint32_t ssrc);
-  uint32_t media_ssrc() const;
-
-  std::vector<TmmbItem> items_;
-};
-}  // namespace rtcp
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_PACKET_TMMBN_H_
diff --git a/modules/rtp_rtcp/source/rtcp_packet/tmmbn_unittest.cc b/modules/rtp_rtcp/source/rtcp_packet/tmmbn_unittest.cc
deleted file mode 100644
index c85cc10..0000000
--- a/modules/rtp_rtcp/source/rtcp_packet/tmmbn_unittest.cc
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- *  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/rtp_rtcp/source/rtcp_packet/tmmbn.h"
-
-#include "webrtc/test/gmock.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/rtcp_packet_parser.h"
-
-using testing::ElementsAreArray;
-using testing::IsEmpty;
-using testing::make_tuple;
-using webrtc::rtcp::TmmbItem;
-using webrtc::rtcp::Tmmbn;
-
-namespace webrtc {
-namespace {
-const uint32_t kSenderSsrc = 0x12345678;
-const uint32_t kRemoteSsrc = 0x23456789;
-const uint32_t kBitrateBps = 312000;
-const uint16_t kOverhead = 0x1fe;
-const uint8_t kPacket[] = {0x84, 205,  0x00, 0x04,
-                           0x12, 0x34, 0x56, 0x78,
-                           0x00, 0x00, 0x00, 0x00,
-                           0x23, 0x45, 0x67, 0x89,
-                           0x0a, 0x61, 0x61, 0xfe};
-}  // namespace
-
-TEST(RtcpPacketTmmbnTest, Create) {
-  Tmmbn tmmbn;
-  tmmbn.SetSenderSsrc(kSenderSsrc);
-  tmmbn.AddTmmbr(TmmbItem(kRemoteSsrc, kBitrateBps, kOverhead));
-
-  rtc::Buffer packet = tmmbn.Build();
-
-  EXPECT_THAT(make_tuple(packet.data(), packet.size()),
-              ElementsAreArray(kPacket));
-}
-
-TEST(RtcpPacketTmmbnTest, Parse) {
-  Tmmbn tmmbn;
-  EXPECT_TRUE(test::ParseSinglePacket(kPacket, &tmmbn));
-
-  const Tmmbn& parsed = tmmbn;
-
-  EXPECT_EQ(kSenderSsrc, parsed.sender_ssrc());
-  ASSERT_EQ(1u, parsed.items().size());
-  EXPECT_EQ(kRemoteSsrc, parsed.items().front().ssrc());
-  EXPECT_EQ(kBitrateBps, parsed.items().front().bitrate_bps());
-  EXPECT_EQ(kOverhead, parsed.items().front().packet_overhead());
-}
-
-TEST(RtcpPacketTmmbnTest, CreateAndParseWithoutItems) {
-  Tmmbn tmmbn;
-  tmmbn.SetSenderSsrc(kSenderSsrc);
-
-  rtc::Buffer packet = tmmbn.Build();
-  Tmmbn parsed;
-  EXPECT_TRUE(test::ParseSinglePacket(packet, &parsed));
-
-  EXPECT_EQ(kSenderSsrc, parsed.sender_ssrc());
-  EXPECT_THAT(parsed.items(), IsEmpty());
-}
-
-TEST(RtcpPacketTmmbnTest, CreateAndParseWithTwoItems) {
-  Tmmbn tmmbn;
-  tmmbn.SetSenderSsrc(kSenderSsrc);
-  tmmbn.AddTmmbr(TmmbItem(kRemoteSsrc, kBitrateBps, kOverhead));
-  tmmbn.AddTmmbr(TmmbItem(kRemoteSsrc + 1, 4 * kBitrateBps, 40));
-
-  rtc::Buffer packet = tmmbn.Build();
-  Tmmbn parsed;
-  EXPECT_TRUE(test::ParseSinglePacket(packet, &parsed));
-
-  EXPECT_EQ(kSenderSsrc, parsed.sender_ssrc());
-  EXPECT_EQ(2u, parsed.items().size());
-  EXPECT_EQ(kRemoteSsrc, parsed.items()[0].ssrc());
-  EXPECT_EQ(kBitrateBps, parsed.items()[0].bitrate_bps());
-  EXPECT_EQ(kOverhead, parsed.items()[0].packet_overhead());
-  EXPECT_EQ(kRemoteSsrc + 1, parsed.items()[1].ssrc());
-  EXPECT_EQ(4 * kBitrateBps, parsed.items()[1].bitrate_bps());
-  EXPECT_EQ(40U, parsed.items()[1].packet_overhead());
-}
-
-TEST(RtcpPacketTmmbnTest, ParseFailsOnTooSmallPacket) {
-  const uint8_t kSmallPacket[] = {0x84, 205,  0x00, 0x01,
-                                  0x12, 0x34, 0x56, 0x78};
-  Tmmbn tmmbn;
-  EXPECT_FALSE(test::ParseSinglePacket(kSmallPacket, &tmmbn));
-}
-
-TEST(RtcpPacketTmmbnTest, ParseFailsOnUnAlignedPacket) {
-  const uint8_t kUnalignedPacket[] = {0x84,  205, 0x00, 0x03,
-                                      0x12, 0x34, 0x56, 0x78,
-                                      0x00, 0x00, 0x00, 0x00,
-                                      0x23, 0x45, 0x67, 0x89};
-
-  Tmmbn tmmbn;
-  EXPECT_FALSE(test::ParseSinglePacket(kUnalignedPacket, &tmmbn));
-}
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/rtcp_packet/tmmbr.cc b/modules/rtp_rtcp/source/rtcp_packet/tmmbr.cc
deleted file mode 100644
index 96abf81..0000000
--- a/modules/rtp_rtcp/source/rtcp_packet/tmmbr.cc
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- *  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/rtp_rtcp/source/rtcp_packet/tmmbr.h"
-
-#include "webrtc/modules/rtp_rtcp/source/byte_io.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/common_header.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-
-namespace webrtc {
-namespace rtcp {
-constexpr uint8_t Tmmbr::kFeedbackMessageType;
-// RFC 4585: Feedback format.
-// Common packet format:
-//
-//   0                   1                   2                   3
-//   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
-//  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//  |V=2|P|   FMT   |       PT      |          length               |
-//  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//  |                  SSRC of packet sender                        |
-//  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//  |             SSRC of media source (unused) = 0                 |
-//  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//  :            Feedback Control Information (FCI)                 :
-//  :                                                               :
-// Temporary Maximum Media Stream Bit Rate Request (TMMBR) (RFC 5104).
-// The Feedback Control Information (FCI) for the TMMBR
-// consists of one or more FCI entries.
-// FCI:
-//   0                   1                   2                   3
-//   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
-//  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//  |                              SSRC                             |
-//  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//  | MxTBR Exp |  MxTBR Mantissa                 |Measured Overhead|
-//  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-
-Tmmbr::Tmmbr() = default;
-
-Tmmbr::~Tmmbr() = default;
-
-bool Tmmbr::Parse(const CommonHeader& packet) {
-  RTC_DCHECK_EQ(packet.type(), kPacketType);
-  RTC_DCHECK_EQ(packet.fmt(), kFeedbackMessageType);
-
-  if (packet.payload_size_bytes() < kCommonFeedbackLength + TmmbItem::kLength) {
-    LOG(LS_WARNING) << "Payload length " << packet.payload_size_bytes()
-                    << " is too small for a TMMBR.";
-    return false;
-  }
-  size_t items_size_bytes = packet.payload_size_bytes() - kCommonFeedbackLength;
-  if (items_size_bytes % TmmbItem::kLength != 0) {
-    LOG(LS_WARNING) << "Payload length " << packet.payload_size_bytes()
-                    << " is not valid for a TMMBR.";
-    return false;
-  }
-  ParseCommonFeedback(packet.payload());
-
-  const uint8_t* next_item = packet.payload() + kCommonFeedbackLength;
-  size_t number_of_items = items_size_bytes / TmmbItem::kLength;
-  items_.resize(number_of_items);
-  for (TmmbItem& item : items_) {
-    if (!item.Parse(next_item))
-      return false;
-    next_item += TmmbItem::kLength;
-  }
-  return true;
-}
-
-void Tmmbr::AddTmmbr(const TmmbItem& item) {
-  items_.push_back(item);
-}
-
-size_t Tmmbr::BlockLength() const {
-  return kHeaderLength + kCommonFeedbackLength +
-         TmmbItem::kLength * items_.size();
-}
-
-bool Tmmbr::Create(uint8_t* packet,
-                   size_t* index,
-                   size_t max_length,
-                   RtcpPacket::PacketReadyCallback* callback) const {
-  RTC_DCHECK(!items_.empty());
-  while (*index + BlockLength() > max_length) {
-    if (!OnBufferFull(packet, index, callback))
-      return false;
-  }
-  const size_t index_end = *index + BlockLength();
-
-  CreateHeader(kFeedbackMessageType, kPacketType, HeaderLength(), packet,
-               index);
-  RTC_DCHECK_EQ(0, Rtpfb::media_ssrc());
-  CreateCommonFeedback(packet + *index);
-  *index += kCommonFeedbackLength;
-  for (const TmmbItem& item : items_) {
-    item.Create(packet + *index);
-    *index += TmmbItem::kLength;
-  }
-  RTC_CHECK_EQ(index_end, *index);
-  return true;
-}
-}  // namespace rtcp
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/rtcp_packet/tmmbr.h b/modules/rtp_rtcp/source/rtcp_packet/tmmbr.h
deleted file mode 100644
index 4209ddf..0000000
--- a/modules/rtp_rtcp/source/rtcp_packet/tmmbr.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- *  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_RTP_RTCP_SOURCE_RTCP_PACKET_TMMBR_H_
-#define WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_PACKET_TMMBR_H_
-
-#include <vector>
-
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/rtpfb.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/tmmb_item.h"
-#include "webrtc/rtc_base/basictypes.h"
-
-namespace webrtc {
-namespace rtcp {
-class CommonHeader;
-
-// Temporary Maximum Media Stream Bit Rate Request (TMMBR).
-// RFC 5104, Section 4.2.1.
-class Tmmbr : public Rtpfb {
- public:
-  static constexpr uint8_t kFeedbackMessageType = 3;
-
-  Tmmbr();
-  ~Tmmbr() override;
-
-  // Parse assumes header is already parsed and validated.
-  bool Parse(const CommonHeader& packet);
-
-  void AddTmmbr(const TmmbItem& item);
-
-  const std::vector<TmmbItem>& requests() const { return items_; }
-
-  size_t BlockLength() const override;
-
-  bool Create(uint8_t* packet,
-              size_t* index,
-              size_t max_length,
-              RtcpPacket::PacketReadyCallback* callback) const override;
-
- private:
-  // Media ssrc is unused, shadow base class setter.
-  void SetMediaSsrc(uint32_t ssrc);
-
-  std::vector<TmmbItem> items_;
-};
-}  // namespace rtcp
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_PACKET_TMMBR_H_
diff --git a/modules/rtp_rtcp/source/rtcp_packet/tmmbr_unittest.cc b/modules/rtp_rtcp/source/rtcp_packet/tmmbr_unittest.cc
deleted file mode 100644
index 0126468..0000000
--- a/modules/rtp_rtcp/source/rtcp_packet/tmmbr_unittest.cc
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- *  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/rtp_rtcp/source/rtcp_packet/tmmbr.h"
-
-#include "webrtc/test/gmock.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/rtcp_packet_parser.h"
-
-using testing::ElementsAreArray;
-using testing::IsEmpty;
-using testing::make_tuple;
-using webrtc::rtcp::TmmbItem;
-using webrtc::rtcp::Tmmbr;
-
-namespace webrtc {
-namespace {
-const uint32_t kSenderSsrc = 0x12345678;
-const uint32_t kRemoteSsrc = 0x23456789;
-const uint32_t kBitrateBps = 312000;
-const uint16_t kOverhead = 0x1fe;
-const uint8_t kPacket[] = {0x83,  205, 0x00, 0x04,
-                           0x12, 0x34, 0x56, 0x78,
-                           0x00, 0x00, 0x00, 0x00,
-                           0x23, 0x45, 0x67, 0x89,
-                           0x0a, 0x61, 0x61, 0xfe};
-}  // namespace
-
-TEST(RtcpPacketTmmbrTest, Create) {
-  Tmmbr tmmbr;
-  tmmbr.SetSenderSsrc(kSenderSsrc);
-  tmmbr.AddTmmbr(TmmbItem(kRemoteSsrc, kBitrateBps, kOverhead));
-
-  rtc::Buffer packet = tmmbr.Build();
-
-  EXPECT_THAT(make_tuple(packet.data(), packet.size()),
-              ElementsAreArray(kPacket));
-}
-
-TEST(RtcpPacketTmmbrTest, Parse) {
-  Tmmbr tmmbr;
-  EXPECT_TRUE(test::ParseSinglePacket(kPacket, &tmmbr));
-  const Tmmbr& parsed = tmmbr;
-
-  EXPECT_EQ(kSenderSsrc, parsed.sender_ssrc());
-  ASSERT_EQ(1u, parsed.requests().size());
-  EXPECT_EQ(kRemoteSsrc, parsed.requests().front().ssrc());
-  EXPECT_EQ(kBitrateBps, parsed.requests().front().bitrate_bps());
-  EXPECT_EQ(kOverhead, parsed.requests().front().packet_overhead());
-}
-
-TEST(RtcpPacketTmmbrTest, CreateAndParseWithTwoEntries) {
-  Tmmbr tmmbr;
-  tmmbr.SetSenderSsrc(kSenderSsrc);
-  tmmbr.AddTmmbr(TmmbItem(kRemoteSsrc, kBitrateBps, kOverhead));
-  tmmbr.AddTmmbr(TmmbItem(kRemoteSsrc + 1, 4 * kBitrateBps, kOverhead + 1));
-
-  rtc::Buffer packet = tmmbr.Build();
-
-  Tmmbr parsed;
-  EXPECT_TRUE(test::ParseSinglePacket(packet, &parsed));
-
-  EXPECT_EQ(kSenderSsrc, parsed.sender_ssrc());
-  EXPECT_EQ(2u, parsed.requests().size());
-  EXPECT_EQ(kRemoteSsrc, parsed.requests()[0].ssrc());
-  EXPECT_EQ(kRemoteSsrc + 1, parsed.requests()[1].ssrc());
-}
-
-TEST(RtcpPacketTmmbrTest, ParseFailsWithoutItems) {
-  const uint8_t kZeroItemsPacket[] = {0x83,  205, 0x00, 0x02,
-                                      0x12, 0x34, 0x56, 0x78,
-                                      0x00, 0x00, 0x00, 0x00};
-
-  Tmmbr tmmbr;
-  EXPECT_FALSE(test::ParseSinglePacket(kZeroItemsPacket, &tmmbr));
-}
-
-TEST(RtcpPacketTmmbrTest, ParseFailsOnUnAlignedPacket) {
-  const uint8_t kUnalignedPacket[] = {0x83,  205, 0x00, 0x05,
-                                      0x12, 0x34, 0x56, 0x78,
-                                      0x00, 0x00, 0x00, 0x00,
-                                      0x23, 0x45, 0x67, 0x89,
-                                      0x0a, 0x61, 0x61, 0xfe,
-                                      0x34, 0x56, 0x78, 0x9a};
-
-  Tmmbr tmmbr;
-  EXPECT_FALSE(test::ParseSinglePacket(kUnalignedPacket, &tmmbr));
-}
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/rtcp_packet/transport_feedback.cc b/modules/rtp_rtcp/source/rtcp_packet/transport_feedback.cc
deleted file mode 100644
index 057fe55..0000000
--- a/modules/rtp_rtcp/source/rtcp_packet/transport_feedback.cc
+++ /dev/null
@@ -1,643 +0,0 @@
-/*
- *  Copyright (c) 2015 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/rtp_rtcp/source/rtcp_packet/transport_feedback.h"
-
-#include <algorithm>
-
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/modules/rtp_rtcp/source/byte_io.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/common_header.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/trace_event.h"
-
-namespace webrtc {
-namespace rtcp {
-namespace {
-// Header size:
-// * 4 bytes Common RTCP Packet Header
-// * 8 bytes Common Packet Format for RTCP Feedback Messages
-// * 8 bytes FeedbackPacket header
-constexpr size_t kTransportFeedbackHeaderSizeBytes = 4 + 8 + 8;
-constexpr size_t kChunkSizeBytes = 2;
-// TODO(sprang): Add support for dynamic max size for easier fragmentation,
-// eg. set it to what's left in the buffer or IP_PACKET_SIZE.
-// Size constraint imposed by RTCP common header: 16bit size field interpreted
-// as number of four byte words minus the first header word.
-constexpr size_t kMaxSizeBytes = (1 << 16) * 4;
-// Payload size:
-// * 8 bytes Common Packet Format for RTCP Feedback Messages
-// * 8 bytes FeedbackPacket header.
-// * 2 bytes for one chunk.
-constexpr size_t kMinPayloadSizeBytes = 8 + 8 + 2;
-constexpr size_t kBaseScaleFactor =
-    TransportFeedback::kDeltaScaleFactor * (1 << 8);
-constexpr int64_t kTimeWrapPeriodUs = (1ll << 24) * kBaseScaleFactor;
-
-//    Message format
-//
-//     0                   1                   2                   3
-//     0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
-//    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//    |V=2|P|  FMT=15 |    PT=205     |           length              |
-//    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//  0 |                     SSRC of packet sender                     |
-//    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//  4 |                      SSRC of media source                     |
-//    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//  8 |      base sequence number     |      packet status count      |
-//    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-// 12 |                 reference time                | fb pkt. count |
-//    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-// 16 |          packet chunk         |         packet chunk          |
-//    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//    .                                                               .
-//    .                                                               .
-//    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//    |         packet chunk          |  recv delta   |  recv delta   |
-//    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//    .                                                               .
-//    .                                                               .
-//    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//    |           recv delta          |  recv delta   | zero padding  |
-//    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-}  // namespace
-constexpr uint8_t TransportFeedback::kFeedbackMessageType;
-constexpr size_t TransportFeedback::kMaxReportedPackets;
-
-// Keep delta_sizes that can be encoded into single chunk if it is last chunk.
-class TransportFeedback::LastChunk {
- public:
-  using DeltaSize = TransportFeedback::DeltaSize;
-
-  LastChunk();
-
-  bool Empty() const;
-  void Clear();
-  // Return if delta sizes still can be encoded into single chunk with added
-  // |delta_size|.
-  bool CanAdd(DeltaSize delta_size) const;
-  // Add |delta_size|, assumes |CanAdd(delta_size)|,
-  void Add(DeltaSize delta_size);
-
-  // Encode chunk as large as possible removing encoded delta sizes.
-  // Assume CanAdd() == false for some valid delta_size.
-  uint16_t Emit();
-  // Encode all stored delta_sizes into single chunk, pad with 0s if needed.
-  uint16_t EncodeLast() const;
-
-  // Decode up to |max_size| delta sizes from |chunk|.
-  void Decode(uint16_t chunk, size_t max_size);
-  // Appends content of the Lastchunk to |deltas|.
-  void AppendTo(std::vector<DeltaSize>* deltas) const;
-
- private:
-  static constexpr size_t kMaxRunLengthCapacity = 0x1fff;
-  static constexpr size_t kMaxOneBitCapacity = 14;
-  static constexpr size_t kMaxTwoBitCapacity = 7;
-  static constexpr size_t kMaxVectorCapacity = kMaxOneBitCapacity;
-  static constexpr DeltaSize kLarge = 2;
-
-  uint16_t EncodeOneBit() const;
-  void DecodeOneBit(uint16_t chunk, size_t max_size);
-
-  uint16_t EncodeTwoBit(size_t size) const;
-  void DecodeTwoBit(uint16_t chunk, size_t max_size);
-
-  uint16_t EncodeRunLength() const;
-  void DecodeRunLength(uint16_t chunk, size_t max_size);
-
-  DeltaSize delta_sizes_[kMaxVectorCapacity];
-  uint16_t size_;
-  bool all_same_;
-  bool has_large_delta_;
-};
-constexpr size_t TransportFeedback::LastChunk::kMaxRunLengthCapacity;
-constexpr size_t TransportFeedback::LastChunk::kMaxOneBitCapacity;
-constexpr size_t TransportFeedback::LastChunk::kMaxTwoBitCapacity;
-constexpr size_t TransportFeedback::LastChunk::kMaxVectorCapacity;
-
-TransportFeedback::LastChunk::LastChunk() {
-  Clear();
-}
-
-bool TransportFeedback::LastChunk::Empty() const {
-  return size_ == 0;
-}
-
-void TransportFeedback::LastChunk::Clear() {
-  size_ = 0;
-  all_same_ = true;
-  has_large_delta_ = false;
-}
-
-bool TransportFeedback::LastChunk::CanAdd(DeltaSize delta_size) const {
-  RTC_DCHECK_LE(delta_size, 2);
-  if (size_ < kMaxTwoBitCapacity)
-    return true;
-  if (size_ < kMaxOneBitCapacity && !has_large_delta_ && delta_size != kLarge)
-    return true;
-  if (size_ < kMaxRunLengthCapacity && all_same_ &&
-      delta_sizes_[0] == delta_size)
-    return true;
-  return false;
-}
-
-void TransportFeedback::LastChunk::Add(DeltaSize delta_size) {
-  RTC_DCHECK(CanAdd(delta_size));
-  if (size_ < kMaxVectorCapacity)
-    delta_sizes_[size_] = delta_size;
-  size_++;
-  all_same_ = all_same_ && delta_size == delta_sizes_[0];
-  has_large_delta_ = has_large_delta_ || delta_size == kLarge;
-}
-
-uint16_t TransportFeedback::LastChunk::Emit() {
-  RTC_DCHECK(!CanAdd(0) || !CanAdd(1) || !CanAdd(2));
-  if (all_same_) {
-    uint16_t chunk = EncodeRunLength();
-    Clear();
-    return chunk;
-  }
-  if (size_ == kMaxOneBitCapacity) {
-    uint16_t chunk = EncodeOneBit();
-    Clear();
-    return chunk;
-  }
-  RTC_DCHECK_GE(size_, kMaxTwoBitCapacity);
-  uint16_t chunk = EncodeTwoBit(kMaxTwoBitCapacity);
-  // Remove |kMaxTwoBitCapacity| encoded delta sizes:
-  // Shift remaining delta sizes and recalculate all_same_ && has_large_delta_.
-  size_ -= kMaxTwoBitCapacity;
-  all_same_ = true;
-  has_large_delta_ = false;
-  for (size_t i = 0; i < size_; ++i) {
-    DeltaSize delta_size = delta_sizes_[kMaxTwoBitCapacity + i];
-    delta_sizes_[i] = delta_size;
-    all_same_ = all_same_ && delta_size == delta_sizes_[0];
-    has_large_delta_ = has_large_delta_ || delta_size == kLarge;
-  }
-
-  return chunk;
-}
-
-uint16_t TransportFeedback::LastChunk::EncodeLast() const {
-  RTC_DCHECK_GT(size_, 0);
-  if (all_same_)
-    return EncodeRunLength();
-  if (size_ <= kMaxTwoBitCapacity)
-    return EncodeTwoBit(size_);
-  return EncodeOneBit();
-}
-
-// Appends content of the Lastchunk to |deltas|.
-void TransportFeedback::LastChunk::AppendTo(
-    std::vector<DeltaSize>* deltas) const {
-  if (all_same_) {
-    deltas->insert(deltas->end(), size_, delta_sizes_[0]);
-  } else {
-    deltas->insert(deltas->end(), delta_sizes_, delta_sizes_ + size_);
-  }
-}
-
-void TransportFeedback::LastChunk::Decode(uint16_t chunk, size_t max_size) {
-  if ((chunk & 0x8000) == 0) {
-    DecodeRunLength(chunk, max_size);
-  } else if ((chunk & 0x4000) == 0) {
-    DecodeOneBit(chunk, max_size);
-  } else {
-    DecodeTwoBit(chunk, max_size);
-  }
-}
-
-//  One Bit Status Vector Chunk
-//
-//  0                   1
-//  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
-//  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//  |T|S|       symbol list         |
-//  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//
-//  T = 1
-//  S = 0
-//  Symbol list = 14 entries where 0 = not received, 1 = received 1-byte delta.
-uint16_t TransportFeedback::LastChunk::EncodeOneBit() const {
-  RTC_DCHECK(!has_large_delta_);
-  RTC_DCHECK_LE(size_, kMaxOneBitCapacity);
-  uint16_t chunk = 0x8000;
-  for (size_t i = 0; i < size_; ++i)
-    chunk |= delta_sizes_[i] << (kMaxOneBitCapacity - 1 - i);
-  return chunk;
-}
-
-void TransportFeedback::LastChunk::DecodeOneBit(uint16_t chunk,
-                                                size_t max_size) {
-  RTC_DCHECK_EQ(chunk & 0xc000, 0x8000);
-  size_ = std::min(kMaxOneBitCapacity, max_size);
-  has_large_delta_ = false;
-  all_same_ = false;
-  for (size_t i = 0; i < size_; ++i)
-    delta_sizes_[i] = (chunk >> (kMaxOneBitCapacity - 1 - i)) & 0x01;
-}
-
-//  Two Bit Status Vector Chunk
-//
-//  0                   1
-//  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
-//  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//  |T|S|       symbol list         |
-//  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//
-//  T = 1
-//  S = 1
-//  symbol list = 7 entries of two bits each.
-uint16_t TransportFeedback::LastChunk::EncodeTwoBit(size_t size) const {
-  RTC_DCHECK_LE(size, size_);
-  uint16_t chunk = 0xc000;
-  for (size_t i = 0; i < size; ++i)
-    chunk |= delta_sizes_[i] << 2 * (kMaxTwoBitCapacity - 1 - i);
-  return chunk;
-}
-
-void TransportFeedback::LastChunk::DecodeTwoBit(uint16_t chunk,
-                                                size_t max_size) {
-  RTC_DCHECK_EQ(chunk & 0xc000, 0xc000);
-  size_ = std::min(kMaxTwoBitCapacity, max_size);
-  has_large_delta_ = true;
-  all_same_ = false;
-  for (size_t i = 0; i < size_; ++i)
-    delta_sizes_[i] = (chunk >> 2 * (kMaxTwoBitCapacity - 1 - i)) & 0x03;
-}
-
-//  Run Length Status Vector Chunk
-//
-//  0                   1
-//  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
-//  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//  |T| S |       Run Length        |
-//  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//
-//  T = 0
-//  S = symbol
-//  Run Length = Unsigned integer denoting the run length of the symbol
-uint16_t TransportFeedback::LastChunk::EncodeRunLength() const {
-  RTC_DCHECK(all_same_);
-  RTC_DCHECK_LE(size_, kMaxRunLengthCapacity);
-  return (delta_sizes_[0] << 13) | size_;
-}
-
-void TransportFeedback::LastChunk::DecodeRunLength(uint16_t chunk,
-                                                   size_t max_count) {
-  RTC_DCHECK_EQ(chunk & 0x8000, 0);
-  size_ = std::min<size_t>(chunk & 0x1fff, max_count);
-  size_t delta_size = (chunk >> 13) & 0x03;
-  has_large_delta_ = delta_size >= kLarge;
-  all_same_ = true;
-  // To make it consistent with Add function, populate delta_sizes_ beyound 1st.
-  for (size_t i = 0; i < std::min<size_t>(size_, kMaxVectorCapacity); ++i)
-    delta_sizes_[i] = delta_size;
-}
-
-TransportFeedback::TransportFeedback()
-    : base_seq_no_(0),
-      num_seq_no_(0),
-      base_time_ticks_(0),
-      feedback_seq_(0),
-      last_timestamp_us_(0),
-      last_chunk_(new LastChunk()),
-      size_bytes_(kTransportFeedbackHeaderSizeBytes) {}
-
-TransportFeedback::~TransportFeedback() {}
-
-void TransportFeedback::SetBase(uint16_t base_sequence,
-                                int64_t ref_timestamp_us) {
-  RTC_DCHECK_EQ(num_seq_no_, 0);
-  RTC_DCHECK_GE(ref_timestamp_us, 0);
-  base_seq_no_ = base_sequence;
-  base_time_ticks_ = (ref_timestamp_us % kTimeWrapPeriodUs) / kBaseScaleFactor;
-  last_timestamp_us_ = GetBaseTimeUs();
-}
-
-void TransportFeedback::SetFeedbackSequenceNumber(uint8_t feedback_sequence) {
-  feedback_seq_ = feedback_sequence;
-}
-
-bool TransportFeedback::AddReceivedPacket(uint16_t sequence_number,
-                                          int64_t timestamp_us) {
-  // Convert to ticks and round.
-  int64_t delta_full = (timestamp_us - last_timestamp_us_) % kTimeWrapPeriodUs;
-  if (delta_full > kTimeWrapPeriodUs / 2)
-    delta_full -= kTimeWrapPeriodUs;
-  delta_full +=
-      delta_full < 0 ? -(kDeltaScaleFactor / 2) : kDeltaScaleFactor / 2;
-  delta_full /= kDeltaScaleFactor;
-
-  int16_t delta = static_cast<int16_t>(delta_full);
-  // If larger than 16bit signed, we can't represent it - need new fb packet.
-  if (delta != delta_full) {
-    LOG(LS_WARNING) << "Delta value too large ( >= 2^16 ticks )";
-    return false;
-  }
-
-  uint16_t next_seq_no = base_seq_no_ + num_seq_no_;
-  if (sequence_number != next_seq_no) {
-    uint16_t last_seq_no = next_seq_no - 1;
-    if (!IsNewerSequenceNumber(sequence_number, last_seq_no))
-      return false;
-    for (; next_seq_no != sequence_number; ++next_seq_no)
-      if (!AddDeltaSize(0))
-        return false;
-  }
-
-  DeltaSize delta_size = (delta >= 0 && delta <= 0xff) ? 1 : 2;
-  if (!AddDeltaSize(delta_size))
-    return false;
-
-  packets_.emplace_back(sequence_number, delta);
-  last_timestamp_us_ += delta * kDeltaScaleFactor;
-  size_bytes_ += delta_size;
-  return true;
-}
-
-const std::vector<TransportFeedback::ReceivedPacket>&
-TransportFeedback::GetReceivedPackets() const {
-  return packets_;
-}
-
-uint16_t TransportFeedback::GetBaseSequence() const {
-  return base_seq_no_;
-}
-
-int64_t TransportFeedback::GetBaseTimeUs() const {
-  return static_cast<int64_t>(base_time_ticks_) * kBaseScaleFactor;
-}
-
-// De-serialize packet.
-bool TransportFeedback::Parse(const CommonHeader& packet) {
-  RTC_DCHECK_EQ(packet.type(), kPacketType);
-  RTC_DCHECK_EQ(packet.fmt(), kFeedbackMessageType);
-  TRACE_EVENT0("webrtc", "TransportFeedback::Parse");
-
-  if (packet.payload_size_bytes() < kMinPayloadSizeBytes) {
-    LOG(LS_WARNING) << "Buffer too small (" << packet.payload_size_bytes()
-                    << " bytes) to fit a "
-                       "FeedbackPacket. Minimum size = "
-                    << kMinPayloadSizeBytes;
-    return false;
-  }
-
-  const uint8_t* const payload = packet.payload();
-  ParseCommonFeedback(payload);
-
-  base_seq_no_ = ByteReader<uint16_t>::ReadBigEndian(&payload[8]);
-  size_t status_count = ByteReader<uint16_t>::ReadBigEndian(&payload[10]);
-  base_time_ticks_ = ByteReader<int32_t, 3>::ReadBigEndian(&payload[12]);
-  feedback_seq_ = payload[15];
-  Clear();
-  size_t index = 16;
-  const size_t end_index = packet.payload_size_bytes();
-
-  if (status_count == 0) {
-    LOG(LS_WARNING) << "Empty feedback messages not allowed.";
-    return false;
-  }
-
-  std::vector<uint8_t> delta_sizes;
-  delta_sizes.reserve(status_count);
-  while (delta_sizes.size() < status_count) {
-    if (index + kChunkSizeBytes > end_index) {
-      LOG(LS_WARNING) << "Buffer overflow while parsing packet.";
-      Clear();
-      return false;
-    }
-
-    uint16_t chunk = ByteReader<uint16_t>::ReadBigEndian(&payload[index]);
-    index += kChunkSizeBytes;
-    encoded_chunks_.push_back(chunk);
-    last_chunk_->Decode(chunk, status_count - delta_sizes.size());
-    last_chunk_->AppendTo(&delta_sizes);
-  }
-  // Last chunk is stored in the |last_chunk_|.
-  encoded_chunks_.pop_back();
-  RTC_DCHECK_EQ(delta_sizes.size(), status_count);
-  num_seq_no_ = status_count;
-
-  uint16_t seq_no = base_seq_no_;
-  for (size_t delta_size : delta_sizes) {
-    if (index + delta_size > end_index) {
-      LOG(LS_WARNING) << "Buffer overflow while parsing packet.";
-      Clear();
-      return false;
-    }
-    switch (delta_size) {
-      case 0:
-        break;
-      case 1: {
-        int16_t delta = payload[index];
-        packets_.emplace_back(seq_no, delta);
-        last_timestamp_us_ += delta * kDeltaScaleFactor;
-        index += delta_size;
-        break;
-      }
-      case 2: {
-        int16_t delta = ByteReader<int16_t>::ReadBigEndian(&payload[index]);
-        packets_.emplace_back(seq_no, delta);
-        last_timestamp_us_ += delta * kDeltaScaleFactor;
-        index += delta_size;
-        break;
-      }
-      case 3:
-        Clear();
-        LOG(LS_WARNING) << "Invalid delta_size for seq_no " << seq_no;
-        return false;
-      default:
-        RTC_NOTREACHED();
-        break;
-    }
-    ++seq_no;
-  }
-  size_bytes_ = RtcpPacket::kHeaderLength + index;
-  RTC_DCHECK_LE(index, end_index);
-  return true;
-}
-
-std::unique_ptr<TransportFeedback> TransportFeedback::ParseFrom(
-    const uint8_t* buffer,
-    size_t length) {
-  CommonHeader header;
-  if (!header.Parse(buffer, length))
-    return nullptr;
-  if (header.type() != kPacketType || header.fmt() != kFeedbackMessageType)
-    return nullptr;
-  std::unique_ptr<TransportFeedback> parsed(new TransportFeedback);
-  if (!parsed->Parse(header))
-    return nullptr;
-  return parsed;
-}
-
-bool TransportFeedback::IsConsistent() const {
-  size_t packet_size = kTransportFeedbackHeaderSizeBytes;
-  std::vector<DeltaSize> delta_sizes;
-  LastChunk chunk_decoder;
-  for (uint16_t chunk : encoded_chunks_) {
-    chunk_decoder.Decode(chunk, kMaxReportedPackets);
-    chunk_decoder.AppendTo(&delta_sizes);
-    packet_size += kChunkSizeBytes;
-  }
-  if (!last_chunk_->Empty()) {
-    last_chunk_->AppendTo(&delta_sizes);
-    packet_size += kChunkSizeBytes;
-  }
-  if (num_seq_no_ != delta_sizes.size()) {
-    LOG(LS_ERROR) << delta_sizes.size() << " packets encoded. Expected "
-                  << num_seq_no_;
-    return false;
-  }
-  int64_t timestamp_us = base_time_ticks_ * kBaseScaleFactor;
-  auto packet_it = packets_.begin();
-  uint16_t seq_no = base_seq_no_;
-  for (DeltaSize delta_size : delta_sizes) {
-    if (delta_size > 0) {
-      if (packet_it == packets_.end()) {
-        LOG(LS_ERROR) << "Failed to find delta for seq_no " << seq_no;
-        return false;
-      }
-      if (packet_it->sequence_number() != seq_no) {
-        LOG(LS_ERROR) << "Expected to find delta for seq_no " << seq_no
-                      << ". Next delta is for " << packet_it->sequence_number();
-        return false;
-      }
-      if (delta_size == 1 &&
-          (packet_it->delta_ticks() < 0 || packet_it->delta_ticks() > 0xff)) {
-        LOG(LS_ERROR) << "Delta " << packet_it->delta_ticks() << " for seq_no "
-                      << seq_no << " doesn't fit into one byte";
-        return false;
-      }
-      timestamp_us += packet_it->delta_us();
-      ++packet_it;
-    }
-    packet_size += delta_size;
-    ++seq_no;
-  }
-  if (packet_it != packets_.end()) {
-    LOG(LS_ERROR) << "Unencoded delta for seq_no "
-                  << packet_it->sequence_number();
-    return false;
-  }
-  if (timestamp_us != last_timestamp_us_) {
-    LOG(LS_ERROR) << "Last timestamp mismatch. Calculated: " << timestamp_us
-                  << ". Saved: " << last_timestamp_us_;
-    return false;
-  }
-  if (size_bytes_ != packet_size) {
-    LOG(LS_ERROR) << "Rtcp packet size mismatch. Calculated: " << packet_size
-                  << ". Saved: " << size_bytes_;
-    return false;
-  }
-  return true;
-}
-
-size_t TransportFeedback::BlockLength() const {
-  // Round size_bytes_ up to multiple of 32bits.
-  return (size_bytes_ + 3) & (~static_cast<size_t>(3));
-}
-
-// Serialize packet.
-bool TransportFeedback::Create(uint8_t* packet,
-                               size_t* position,
-                               size_t max_length,
-                               PacketReadyCallback* callback) const {
-  if (num_seq_no_ == 0)
-    return false;
-
-  while (*position + BlockLength() > max_length) {
-    if (!OnBufferFull(packet, position, callback))
-      return false;
-  }
-  const size_t position_end = *position + BlockLength();
-
-  CreateHeader(kFeedbackMessageType, kPacketType, HeaderLength(), packet,
-               position);
-  CreateCommonFeedback(packet + *position);
-  *position += kCommonFeedbackLength;
-
-  ByteWriter<uint16_t>::WriteBigEndian(&packet[*position], base_seq_no_);
-  *position += 2;
-
-  ByteWriter<uint16_t>::WriteBigEndian(&packet[*position], num_seq_no_);
-  *position += 2;
-
-  ByteWriter<int32_t, 3>::WriteBigEndian(&packet[*position], base_time_ticks_);
-  *position += 3;
-
-  packet[(*position)++] = feedback_seq_;
-
-  for (uint16_t chunk : encoded_chunks_) {
-    ByteWriter<uint16_t>::WriteBigEndian(&packet[*position], chunk);
-    *position += 2;
-  }
-  if (!last_chunk_->Empty()) {
-    uint16_t chunk = last_chunk_->EncodeLast();
-    ByteWriter<uint16_t>::WriteBigEndian(&packet[*position], chunk);
-    *position += 2;
-  }
-
-  for (const auto& received_packet : packets_) {
-    int16_t delta = received_packet.delta_ticks();
-    if (delta >= 0 && delta <= 0xFF) {
-      packet[(*position)++] = delta;
-    } else {
-      ByteWriter<int16_t>::WriteBigEndian(&packet[*position], delta);
-      *position += 2;
-    }
-  }
-
-  while ((*position % 4) != 0)
-    packet[(*position)++] = 0;
-
-  RTC_DCHECK_EQ(*position, position_end);
-  return true;
-}
-
-void TransportFeedback::Clear() {
-  num_seq_no_ = 0;
-  last_timestamp_us_ = GetBaseTimeUs();
-  packets_.clear();
-  encoded_chunks_.clear();
-  last_chunk_->Clear();
-  size_bytes_ = kTransportFeedbackHeaderSizeBytes;
-}
-
-bool TransportFeedback::AddDeltaSize(DeltaSize delta_size) {
-  if (num_seq_no_ == kMaxReportedPackets)
-    return false;
-  size_t add_chunk_size = last_chunk_->Empty() ? kChunkSizeBytes : 0;
-  if (size_bytes_ + delta_size + add_chunk_size > kMaxSizeBytes)
-    return false;
-
-  if (last_chunk_->CanAdd(delta_size)) {
-    size_bytes_ += add_chunk_size;
-    last_chunk_->Add(delta_size);
-    ++num_seq_no_;
-    return true;
-  }
-  if (size_bytes_ + delta_size + kChunkSizeBytes > kMaxSizeBytes)
-    return false;
-
-  encoded_chunks_.push_back(last_chunk_->Emit());
-  size_bytes_ += kChunkSizeBytes;
-  last_chunk_->Add(delta_size);
-  ++num_seq_no_;
-  return true;
-}
-
-}  // namespace rtcp
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/rtcp_packet/transport_feedback.h b/modules/rtp_rtcp/source/rtcp_packet/transport_feedback.h
deleted file mode 100644
index 35fe90b..0000000
--- a/modules/rtp_rtcp/source/rtcp_packet/transport_feedback.h
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- *  Copyright (c) 2015 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_RTP_RTCP_SOURCE_RTCP_PACKET_TRANSPORT_FEEDBACK_H_
-#define WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_PACKET_TRANSPORT_FEEDBACK_H_
-
-#include <memory>
-#include <vector>
-
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/rtpfb.h"
-
-namespace webrtc {
-namespace rtcp {
-class CommonHeader;
-
-class TransportFeedback : public Rtpfb {
- public:
-  class ReceivedPacket {
-   public:
-    ReceivedPacket(uint16_t sequence_number, int16_t delta_ticks)
-        : sequence_number_(sequence_number), delta_ticks_(delta_ticks) {}
-    ReceivedPacket(const ReceivedPacket&) = default;
-    ReceivedPacket& operator=(const ReceivedPacket&) = default;
-
-    uint16_t sequence_number() const { return sequence_number_; }
-    int16_t delta_ticks() const { return delta_ticks_; }
-    int32_t delta_us() const { return delta_ticks_ * kDeltaScaleFactor; }
-
-   private:
-    uint16_t sequence_number_;
-    int16_t delta_ticks_;
-  };
-  // TODO(sprang): IANA reg?
-  static constexpr uint8_t kFeedbackMessageType = 15;
-  // Convert to multiples of 0.25ms.
-  static constexpr int kDeltaScaleFactor = 250;
-  // Maximum number of packets (including missing) TransportFeedback can report.
-  static constexpr size_t kMaxReportedPackets = 0xffff;
-
-  TransportFeedback();
-  ~TransportFeedback() override;
-
-  void SetBase(uint16_t base_sequence,     // Seq# of first packet in this msg.
-               int64_t ref_timestamp_us);  // Reference timestamp for this msg.
-  void SetFeedbackSequenceNumber(uint8_t feedback_sequence);
-  // NOTE: This method requires increasing sequence numbers (excepting wraps).
-  bool AddReceivedPacket(uint16_t sequence_number, int64_t timestamp_us);
-  const std::vector<ReceivedPacket>& GetReceivedPackets() const;
-
-  uint16_t GetBaseSequence() const;
-
-  // Returns number of packets (including missing) this feedback describes.
-  size_t GetPacketStatusCount() const { return num_seq_no_; }
-
-  // Get the reference time in microseconds, including any precision loss.
-  int64_t GetBaseTimeUs() const;
-
-  bool Parse(const CommonHeader& packet);
-  static std::unique_ptr<TransportFeedback> ParseFrom(const uint8_t* buffer,
-                                                      size_t length);
-  // Pre and postcondition for all public methods. Should always return true.
-  // This function is for tests.
-  bool IsConsistent() const;
-
-  size_t BlockLength() const override;
-
-  bool Create(uint8_t* packet,
-              size_t* position,
-              size_t max_length,
-              PacketReadyCallback* callback) const override;
-
- private:
-  // Size in bytes of a delta time in rtcp packet.
-  // Valid values are 0 (packet wasn't received), 1 or 2.
-  using DeltaSize = uint8_t;
-  // Keeps DeltaSizes that can be encoded into single chunk if it is last chunk.
-  class LastChunk;
-
-  // Reset packet to consistent empty state.
-  void Clear();
-
-  bool AddDeltaSize(DeltaSize delta_size);
-
-  uint16_t base_seq_no_;
-  uint16_t num_seq_no_;
-  int32_t base_time_ticks_;
-  uint8_t feedback_seq_;
-
-  int64_t last_timestamp_us_;
-  std::vector<ReceivedPacket> packets_;
-  // All but last encoded packet chunks.
-  std::vector<uint16_t> encoded_chunks_;
-  const std::unique_ptr<LastChunk> last_chunk_;
-  size_t size_bytes_;
-};
-
-}  // namespace rtcp
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_PACKET_TRANSPORT_FEEDBACK_H_
diff --git a/modules/rtp_rtcp/source/rtcp_packet/transport_feedback_unittest.cc b/modules/rtp_rtcp/source/rtcp_packet/transport_feedback_unittest.cc
deleted file mode 100644
index b2923da..0000000
--- a/modules/rtp_rtcp/source/rtcp_packet/transport_feedback_unittest.cc
+++ /dev/null
@@ -1,470 +0,0 @@
-/*
- *  Copyright (c) 2015 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/rtp_rtcp/source/rtcp_packet/transport_feedback.h"
-
-#include <limits>
-#include <memory>
-
-#include "webrtc/modules/rtp_rtcp/source/byte_io.h"
-#include "webrtc/test/gmock.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-namespace {
-
-using ::testing::ElementsAreArray;
-using rtcp::TransportFeedback;
-
-static const int kHeaderSize = 20;
-static const int kStatusChunkSize = 2;
-static const int kSmallDeltaSize = 1;
-static const int kLargeDeltaSize = 2;
-
-static const int64_t kDeltaLimit = 0xFF * TransportFeedback::kDeltaScaleFactor;
-
-class FeedbackTester {
- public:
-  FeedbackTester()
-      : expected_size_(kAnySize),
-        default_delta_(TransportFeedback::kDeltaScaleFactor * 4) {}
-
-  void WithExpectedSize(size_t expected_size) {
-    expected_size_ = expected_size;
-  }
-
-  void WithDefaultDelta(int64_t delta) { default_delta_ = delta; }
-
-  void WithInput(const uint16_t received_seq[],
-                 const int64_t received_ts[],
-                 uint16_t length) {
-    std::unique_ptr<int64_t[]> temp_deltas;
-    if (received_ts == nullptr) {
-      temp_deltas.reset(new int64_t[length]);
-      GenerateDeltas(received_seq, length, temp_deltas.get());
-      received_ts = temp_deltas.get();
-    }
-
-    expected_seq_.clear();
-    expected_deltas_.clear();
-    feedback_.reset(new TransportFeedback());
-    feedback_->SetBase(received_seq[0], received_ts[0]);
-    ASSERT_TRUE(feedback_->IsConsistent());
-
-    int64_t last_time = feedback_->GetBaseTimeUs();
-    for (int i = 0; i < length; ++i) {
-      int64_t time = received_ts[i];
-      EXPECT_TRUE(feedback_->AddReceivedPacket(received_seq[i], time));
-
-      if (last_time != -1) {
-        int64_t delta = time - last_time;
-        expected_deltas_.push_back(delta);
-      }
-      last_time = time;
-    }
-    ASSERT_TRUE(feedback_->IsConsistent());
-    expected_seq_.insert(expected_seq_.begin(), &received_seq[0],
-                         &received_seq[length]);
-  }
-
-  void VerifyPacket() {
-    ASSERT_TRUE(feedback_->IsConsistent());
-    serialized_ = feedback_->Build();
-    VerifyInternal();
-    feedback_ = TransportFeedback::ParseFrom(serialized_.data(),
-                                             serialized_.size());
-    ASSERT_TRUE(feedback_->IsConsistent());
-    ASSERT_NE(nullptr, feedback_.get());
-    VerifyInternal();
-  }
-
-  static const size_t kAnySize = static_cast<size_t>(0) - 1;
-
- private:
-  void VerifyInternal() {
-    if (expected_size_ != kAnySize) {
-      // Round up to whole 32-bit words.
-      size_t expected_size_words = (expected_size_ + 3) / 4;
-      size_t expected_size_bytes = expected_size_words * 4;
-      EXPECT_EQ(expected_size_bytes, serialized_.size());
-    }
-
-    std::vector<uint16_t> actual_seq_nos;
-    std::vector<int64_t> actual_deltas_us;
-    for (const auto& packet : feedback_->GetReceivedPackets()) {
-      actual_seq_nos.push_back(packet.sequence_number());
-      actual_deltas_us.push_back(packet.delta_us());
-    }
-    EXPECT_THAT(actual_seq_nos, ElementsAreArray(expected_seq_));
-    EXPECT_THAT(actual_deltas_us, ElementsAreArray(expected_deltas_));
-  }
-
-  void GenerateDeltas(const uint16_t seq[],
-                      const size_t length,
-                      int64_t* deltas) {
-    uint16_t last_seq = seq[0];
-    int64_t offset = 0;
-
-    for (size_t i = 0; i < length; ++i) {
-      if (seq[i] < last_seq)
-        offset += 0x10000 * default_delta_;
-      last_seq = seq[i];
-
-      deltas[i] = offset + (last_seq * default_delta_);
-    }
-  }
-
-  std::vector<uint16_t> expected_seq_;
-  std::vector<int64_t> expected_deltas_;
-  size_t expected_size_;
-  int64_t default_delta_;
-  std::unique_ptr<TransportFeedback> feedback_;
-  rtc::Buffer serialized_;
-};
-
-TEST(RtcpPacketTest, TransportFeedback_OneBitVector) {
-  const uint16_t kReceived[] = {1, 2, 7, 8, 9, 10, 13};
-  const size_t kLength = sizeof(kReceived) / sizeof(uint16_t);
-  const size_t kExpectedSizeBytes =
-      kHeaderSize + kStatusChunkSize + (kLength * kSmallDeltaSize);
-
-  FeedbackTester test;
-  test.WithExpectedSize(kExpectedSizeBytes);
-  test.WithInput(kReceived, nullptr, kLength);
-  test.VerifyPacket();
-}
-
-TEST(RtcpPacketTest, TransportFeedback_FullOneBitVector) {
-  const uint16_t kReceived[] = {1, 2, 7, 8, 9, 10, 13, 14};
-  const size_t kLength = sizeof(kReceived) / sizeof(uint16_t);
-  const size_t kExpectedSizeBytes =
-      kHeaderSize + kStatusChunkSize + (kLength * kSmallDeltaSize);
-
-  FeedbackTester test;
-  test.WithExpectedSize(kExpectedSizeBytes);
-  test.WithInput(kReceived, nullptr, kLength);
-  test.VerifyPacket();
-}
-
-TEST(RtcpPacketTest, TransportFeedback_OneBitVector_WrapReceived) {
-  const uint16_t kMax = 0xFFFF;
-  const uint16_t kReceived[] = {kMax - 2, kMax - 1, kMax, 0, 1, 2};
-  const size_t kLength = sizeof(kReceived) / sizeof(uint16_t);
-  const size_t kExpectedSizeBytes =
-      kHeaderSize + kStatusChunkSize + (kLength * kSmallDeltaSize);
-
-  FeedbackTester test;
-  test.WithExpectedSize(kExpectedSizeBytes);
-  test.WithInput(kReceived, nullptr, kLength);
-  test.VerifyPacket();
-}
-
-TEST(RtcpPacketTest, TransportFeedback_OneBitVector_WrapMissing) {
-  const uint16_t kMax = 0xFFFF;
-  const uint16_t kReceived[] = {kMax - 2, kMax - 1, 1, 2};
-  const size_t kLength = sizeof(kReceived) / sizeof(uint16_t);
-  const size_t kExpectedSizeBytes =
-      kHeaderSize + kStatusChunkSize + (kLength * kSmallDeltaSize);
-
-  FeedbackTester test;
-  test.WithExpectedSize(kExpectedSizeBytes);
-  test.WithInput(kReceived, nullptr, kLength);
-  test.VerifyPacket();
-}
-
-TEST(RtcpPacketTest, TransportFeedback_TwoBitVector) {
-  const uint16_t kReceived[] = {1, 2, 6, 7};
-  const size_t kLength = sizeof(kReceived) / sizeof(uint16_t);
-  const size_t kExpectedSizeBytes =
-      kHeaderSize + kStatusChunkSize + (kLength * kLargeDeltaSize);
-
-  FeedbackTester test;
-  test.WithExpectedSize(kExpectedSizeBytes);
-  test.WithDefaultDelta(kDeltaLimit + TransportFeedback::kDeltaScaleFactor);
-  test.WithInput(kReceived, nullptr, kLength);
-  test.VerifyPacket();
-}
-
-TEST(RtcpPacketTest, TransportFeedback_TwoBitVectorFull) {
-  const uint16_t kReceived[] = {1, 2, 6, 7, 8};
-  const size_t kLength = sizeof(kReceived) / sizeof(uint16_t);
-  const size_t kExpectedSizeBytes =
-      kHeaderSize + (2 * kStatusChunkSize) + (kLength * kLargeDeltaSize);
-
-  FeedbackTester test;
-  test.WithExpectedSize(kExpectedSizeBytes);
-  test.WithDefaultDelta(kDeltaLimit + TransportFeedback::kDeltaScaleFactor);
-  test.WithInput(kReceived, nullptr, kLength);
-  test.VerifyPacket();
-}
-
-TEST(RtcpPacketTest, TransportFeedback_LargeAndNegativeDeltas) {
-  const uint16_t kReceived[] = {1, 2, 6, 7, 8};
-  const int64_t kReceiveTimes[] = {
-      2000,
-      1000,
-      4000,
-      3000,
-      3000 + TransportFeedback::kDeltaScaleFactor * (1 << 8)};
-  const size_t kLength = sizeof(kReceived) / sizeof(uint16_t);
-  const size_t kExpectedSizeBytes =
-      kHeaderSize + kStatusChunkSize + (3 * kLargeDeltaSize) + kSmallDeltaSize;
-
-  FeedbackTester test;
-  test.WithExpectedSize(kExpectedSizeBytes);
-  test.WithInput(kReceived, kReceiveTimes, kLength);
-  test.VerifyPacket();
-}
-
-TEST(RtcpPacketTest, TransportFeedback_MaxRle) {
-  // Expected chunks created:
-  // * 1-bit vector chunk (1xreceived + 13xdropped)
-  // * RLE chunk of max length for dropped symbol
-  // * 1-bit vector chunk (1xreceived + 13xdropped)
-
-  const size_t kPacketCount = (1 << 13) - 1 + 14;
-  const uint16_t kReceived[] = {0, kPacketCount};
-  const int64_t kReceiveTimes[] = {1000, 2000};
-  const size_t kLength = sizeof(kReceived) / sizeof(uint16_t);
-  const size_t kExpectedSizeBytes =
-      kHeaderSize + (3 * kStatusChunkSize) + (kLength * kSmallDeltaSize);
-
-  FeedbackTester test;
-  test.WithExpectedSize(kExpectedSizeBytes);
-  test.WithInput(kReceived, kReceiveTimes, kLength);
-  test.VerifyPacket();
-}
-
-TEST(RtcpPacketTest, TransportFeedback_MinRle) {
-  // Expected chunks created:
-  // * 1-bit vector chunk (1xreceived + 13xdropped)
-  // * RLE chunk of length 15 for dropped symbol
-  // * 1-bit vector chunk (1xreceived + 13xdropped)
-
-  const uint16_t kReceived[] = {0, (14 * 2) + 1};
-  const int64_t kReceiveTimes[] = {1000, 2000};
-  const size_t kLength = sizeof(kReceived) / sizeof(uint16_t);
-  const size_t kExpectedSizeBytes =
-      kHeaderSize + (3 * kStatusChunkSize) + (kLength * kSmallDeltaSize);
-
-  FeedbackTester test;
-  test.WithExpectedSize(kExpectedSizeBytes);
-  test.WithInput(kReceived, kReceiveTimes, kLength);
-  test.VerifyPacket();
-}
-
-TEST(RtcpPacketTest, TransportFeedback_OneToTwoBitVector) {
-  const size_t kTwoBitVectorCapacity = 7;
-  const uint16_t kReceived[] = {0, kTwoBitVectorCapacity - 1};
-  const int64_t kReceiveTimes[] = {
-      0, kDeltaLimit + TransportFeedback::kDeltaScaleFactor};
-  const size_t kLength = sizeof(kReceived) / sizeof(uint16_t);
-  const size_t kExpectedSizeBytes =
-      kHeaderSize + kStatusChunkSize + kSmallDeltaSize + kLargeDeltaSize;
-
-  FeedbackTester test;
-  test.WithExpectedSize(kExpectedSizeBytes);
-  test.WithInput(kReceived, kReceiveTimes, kLength);
-  test.VerifyPacket();
-}
-
-TEST(RtcpPacketTest, TransportFeedback_OneToTwoBitVectorSimpleSplit) {
-  const size_t kTwoBitVectorCapacity = 7;
-  const uint16_t kReceived[] = {0, kTwoBitVectorCapacity};
-  const int64_t kReceiveTimes[] = {
-      0, kDeltaLimit + TransportFeedback::kDeltaScaleFactor};
-  const size_t kLength = sizeof(kReceived) / sizeof(uint16_t);
-  const size_t kExpectedSizeBytes =
-      kHeaderSize + (kStatusChunkSize * 2) + kSmallDeltaSize + kLargeDeltaSize;
-
-  FeedbackTester test;
-  test.WithExpectedSize(kExpectedSizeBytes);
-  test.WithInput(kReceived, kReceiveTimes, kLength);
-  test.VerifyPacket();
-}
-
-TEST(RtcpPacketTest, TransportFeedback_OneToTwoBitVectorSplit) {
-  // With received small delta = S, received large delta = L, use input
-  // SSSSSSSSLSSSSSSSSSSSS. This will cause a 1:2 split at the L.
-  // After split there will be two symbols in symbol_vec: SL.
-
-  const int64_t kLargeDelta = TransportFeedback::kDeltaScaleFactor * (1 << 8);
-  const size_t kNumPackets = (3 * 7) + 1;
-  const size_t kExpectedSizeBytes = kHeaderSize + (kStatusChunkSize * 3) +
-                                    (kSmallDeltaSize * (kNumPackets - 1)) +
-                                    (kLargeDeltaSize * 1);
-
-  uint16_t kReceived[kNumPackets];
-  for (size_t i = 0; i < kNumPackets; ++i)
-    kReceived[i] = i;
-
-  int64_t kReceiveTimes[kNumPackets];
-  kReceiveTimes[0] = 1000;
-  for (size_t i = 1; i < kNumPackets; ++i) {
-    int delta = (i == 8) ? kLargeDelta : 1000;
-    kReceiveTimes[i] = kReceiveTimes[i - 1] + delta;
-  }
-
-  FeedbackTester test;
-  test.WithExpectedSize(kExpectedSizeBytes);
-  test.WithInput(kReceived, kReceiveTimes, kNumPackets);
-  test.VerifyPacket();
-}
-
-TEST(RtcpPacketTest, TransportFeedback_Aliasing) {
-  TransportFeedback feedback;
-  feedback.SetBase(0, 0);
-
-  const int kSamples = 100;
-  const int64_t kTooSmallDelta = TransportFeedback::kDeltaScaleFactor / 3;
-
-  for (int i = 0; i < kSamples; ++i)
-    feedback.AddReceivedPacket(i, i * kTooSmallDelta);
-
-  feedback.Build();
-
-  int64_t accumulated_delta = 0;
-  int num_samples = 0;
-  for (const auto& packet : feedback.GetReceivedPackets()) {
-    accumulated_delta += packet.delta_us();
-    int64_t expected_time = num_samples * kTooSmallDelta;
-    ++num_samples;
-
-    EXPECT_NEAR(expected_time, accumulated_delta,
-                TransportFeedback::kDeltaScaleFactor / 2);
-  }
-}
-
-TEST(RtcpPacketTest, TransportFeedback_Limits) {
-  // Sequence number wrap above 0x8000.
-  std::unique_ptr<TransportFeedback> packet(new TransportFeedback());
-  packet->SetBase(0, 0);
-  EXPECT_TRUE(packet->AddReceivedPacket(0x0, 0));
-  EXPECT_TRUE(packet->AddReceivedPacket(0x8000, 1000));
-
-  packet.reset(new TransportFeedback());
-  packet->SetBase(0, 0);
-  EXPECT_TRUE(packet->AddReceivedPacket(0x0, 0));
-  EXPECT_FALSE(packet->AddReceivedPacket(0x8000 + 1, 1000));
-
-  // Packet status count max 0xFFFF.
-  packet.reset(new TransportFeedback());
-  packet->SetBase(0, 0);
-  EXPECT_TRUE(packet->AddReceivedPacket(0x0, 0));
-  EXPECT_TRUE(packet->AddReceivedPacket(0x8000, 1000));
-  EXPECT_TRUE(packet->AddReceivedPacket(0xFFFE, 2000));
-  EXPECT_FALSE(packet->AddReceivedPacket(0xFFFF, 3000));
-
-  // Too large delta.
-  packet.reset(new TransportFeedback());
-  packet->SetBase(0, 0);
-  int64_t kMaxPositiveTimeDelta = std::numeric_limits<int16_t>::max() *
-                                  TransportFeedback::kDeltaScaleFactor;
-  EXPECT_FALSE(packet->AddReceivedPacket(
-      1, kMaxPositiveTimeDelta + TransportFeedback::kDeltaScaleFactor));
-  EXPECT_TRUE(packet->AddReceivedPacket(1, kMaxPositiveTimeDelta));
-
-  // Too large negative delta.
-  packet.reset(new TransportFeedback());
-  packet->SetBase(0, 0);
-  int64_t kMaxNegativeTimeDelta = std::numeric_limits<int16_t>::min() *
-                                  TransportFeedback::kDeltaScaleFactor;
-  EXPECT_FALSE(packet->AddReceivedPacket(
-      1, kMaxNegativeTimeDelta - TransportFeedback::kDeltaScaleFactor));
-  EXPECT_TRUE(packet->AddReceivedPacket(1, kMaxNegativeTimeDelta));
-
-  // Base time at maximum value.
-  int64_t kMaxBaseTime =
-      static_cast<int64_t>(TransportFeedback::kDeltaScaleFactor) * (1L << 8) *
-      ((1L << 23) - 1);
-  packet.reset(new TransportFeedback());
-  packet->SetBase(0, kMaxBaseTime);
-  EXPECT_TRUE(packet->AddReceivedPacket(0, kMaxBaseTime));
-  // Serialize and de-serialize (verify 24bit parsing).
-  rtc::Buffer raw_packet = packet->Build();
-  packet = TransportFeedback::ParseFrom(raw_packet.data(), raw_packet.size());
-  EXPECT_EQ(kMaxBaseTime, packet->GetBaseTimeUs());
-
-  // Base time above maximum value.
-  int64_t kTooLargeBaseTime =
-      kMaxBaseTime + (TransportFeedback::kDeltaScaleFactor * (1L << 8));
-  packet.reset(new TransportFeedback());
-  packet->SetBase(0, kTooLargeBaseTime);
-  packet->AddReceivedPacket(0, kTooLargeBaseTime);
-  raw_packet = packet->Build();
-  packet = TransportFeedback::ParseFrom(raw_packet.data(), raw_packet.size());
-  EXPECT_NE(kTooLargeBaseTime, packet->GetBaseTimeUs());
-
-  // TODO(sprang): Once we support max length lower than RTCP length limit,
-  // add back test for max size in bytes.
-}
-
-TEST(RtcpPacketTest, TransportFeedback_Padding) {
-  const size_t kExpectedSizeBytes =
-      kHeaderSize + kStatusChunkSize + kSmallDeltaSize;
-  const size_t kExpectedSizeWords = (kExpectedSizeBytes + 3) / 4;
-
-  TransportFeedback feedback;
-  feedback.SetBase(0, 0);
-  EXPECT_TRUE(feedback.AddReceivedPacket(0, 0));
-
-  rtc::Buffer packet = feedback.Build();
-  EXPECT_EQ(kExpectedSizeWords * 4, packet.size());
-  ASSERT_GT(kExpectedSizeWords * 4, kExpectedSizeBytes);
-  for (size_t i = kExpectedSizeBytes; i < kExpectedSizeWords * 4; ++i)
-    EXPECT_EQ(0u, packet.data()[i]);
-
-  // Modify packet by adding 4 bytes of padding at the end. Not currently used
-  // when we're sending, but need to be able to handle it when receiving.
-
-  const int kPaddingBytes = 4;
-  const size_t kExpectedSizeWithPadding =
-      (kExpectedSizeWords * 4) + kPaddingBytes;
-  uint8_t mod_buffer[kExpectedSizeWithPadding];
-  memcpy(mod_buffer, packet.data(), kExpectedSizeWords * 4);
-  memset(&mod_buffer[kExpectedSizeWords * 4], 0, kPaddingBytes - 1);
-  mod_buffer[kExpectedSizeWithPadding - 1] = kPaddingBytes;
-  const uint8_t padding_flag = 1 << 5;
-  mod_buffer[0] |= padding_flag;
-  ByteWriter<uint16_t>::WriteBigEndian(
-      &mod_buffer[2], ByteReader<uint16_t>::ReadBigEndian(&mod_buffer[2]) +
-                          ((kPaddingBytes + 3) / 4));
-
-  std::unique_ptr<TransportFeedback> parsed_packet(
-      TransportFeedback::ParseFrom(mod_buffer, kExpectedSizeWithPadding));
-  ASSERT_TRUE(parsed_packet.get() != nullptr);
-  EXPECT_EQ(kExpectedSizeWords * 4, packet.size());  // Padding not included.
-}
-
-TEST(RtcpPacketTest, TransportFeedback_CorrectlySplitsVectorChunks) {
-  const int kOneBitVectorCapacity = 14;
-  const int64_t kLargeTimeDelta =
-      TransportFeedback::kDeltaScaleFactor * (1 << 8);
-
-  // Test that a number of small deltas followed by a large delta results in a
-  // correct split into multiple chunks, as needed.
-
-  for (int deltas = 0; deltas <= kOneBitVectorCapacity + 1; ++deltas) {
-    TransportFeedback feedback;
-    feedback.SetBase(0, 0);
-    for (int i = 0; i < deltas; ++i)
-      feedback.AddReceivedPacket(i, i * 1000);
-    feedback.AddReceivedPacket(deltas, deltas * 1000 + kLargeTimeDelta);
-
-    rtc::Buffer serialized_packet = feedback.Build();
-    std::unique_ptr<TransportFeedback> deserialized_packet =
-        TransportFeedback::ParseFrom(serialized_packet.data(),
-                                     serialized_packet.size());
-    EXPECT_TRUE(deserialized_packet.get() != nullptr);
-  }
-}
-
-}  // namespace
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/rtcp_packet/voip_metric.cc b/modules/rtp_rtcp/source/rtcp_packet/voip_metric.cc
deleted file mode 100644
index 1b3bbf3..0000000
--- a/modules/rtp_rtcp/source/rtcp_packet/voip_metric.cc
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- *  Copyright (c) 2015 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/rtp_rtcp/source/rtcp_packet/voip_metric.h"
-
-#include "webrtc/modules/rtp_rtcp/source/byte_io.h"
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-namespace rtcp {
-// VoIP Metrics Report Block (RFC 3611).
-//
-//     0                   1                   2                   3
-//     0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
-//    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//  0 |     BT=7      |   reserved    |       block length = 8        |
-//    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//  4 |                        SSRC of source                         |
-//    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//  8 |   loss rate   | discard rate  | burst density |  gap density  |
-//    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-// 12 |       burst duration          |         gap duration          |
-//    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-// 16 |     round trip delay          |       end system delay        |
-//    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-// 20 | signal level  |  noise level  |     RERL      |     Gmin      |
-//    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-// 24 |   R factor    | ext. R factor |    MOS-LQ     |    MOS-CQ     |
-//    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-// 28 |   RX config   |   reserved    |          JB nominal           |
-//    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-// 32 |          JB maximum           |          JB abs max           |
-// 36 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-VoipMetric::VoipMetric() : ssrc_(0) {
-  memset(&voip_metric_, 0, sizeof(voip_metric_));
-}
-
-void VoipMetric::Parse(const uint8_t* buffer) {
-  RTC_DCHECK(buffer[0] == kBlockType);
-  // reserved = buffer[1];
-  RTC_DCHECK(ByteReader<uint16_t>::ReadBigEndian(&buffer[2]) == kBlockLength);
-  ssrc_ = ByteReader<uint32_t>::ReadBigEndian(&buffer[4]);
-  voip_metric_.lossRate = buffer[8];
-  voip_metric_.discardRate = buffer[9];
-  voip_metric_.burstDensity = buffer[10];
-  voip_metric_.gapDensity = buffer[11];
-  voip_metric_.burstDuration = ByteReader<uint16_t>::ReadBigEndian(&buffer[12]);
-  voip_metric_.gapDuration = ByteReader<uint16_t>::ReadBigEndian(&buffer[14]);
-  voip_metric_.roundTripDelay =
-      ByteReader<uint16_t>::ReadBigEndian(&buffer[16]);
-  voip_metric_.endSystemDelay =
-      ByteReader<uint16_t>::ReadBigEndian(&buffer[18]);
-  voip_metric_.signalLevel = buffer[20];
-  voip_metric_.noiseLevel = buffer[21];
-  voip_metric_.RERL = buffer[22];
-  voip_metric_.Gmin = buffer[23];
-  voip_metric_.Rfactor = buffer[24];
-  voip_metric_.extRfactor = buffer[25];
-  voip_metric_.MOSLQ = buffer[26];
-  voip_metric_.MOSCQ = buffer[27];
-  voip_metric_.RXconfig = buffer[28];
-  // reserved = buffer[29];
-  voip_metric_.JBnominal = ByteReader<uint16_t>::ReadBigEndian(&buffer[30]);
-  voip_metric_.JBmax = ByteReader<uint16_t>::ReadBigEndian(&buffer[32]);
-  voip_metric_.JBabsMax = ByteReader<uint16_t>::ReadBigEndian(&buffer[34]);
-}
-
-void VoipMetric::Create(uint8_t* buffer) const {
-  const uint8_t kReserved = 0;
-  buffer[0] = kBlockType;
-  buffer[1] = kReserved;
-  ByteWriter<uint16_t>::WriteBigEndian(&buffer[2], kBlockLength);
-  ByteWriter<uint32_t>::WriteBigEndian(&buffer[4], ssrc_);
-  buffer[8] = voip_metric_.lossRate;
-  buffer[9] = voip_metric_.discardRate;
-  buffer[10] = voip_metric_.burstDensity;
-  buffer[11] = voip_metric_.gapDensity;
-  ByteWriter<uint16_t>::WriteBigEndian(&buffer[12], voip_metric_.burstDuration);
-  ByteWriter<uint16_t>::WriteBigEndian(&buffer[14], voip_metric_.gapDuration);
-  ByteWriter<uint16_t>::WriteBigEndian(&buffer[16],
-                                       voip_metric_.roundTripDelay);
-  ByteWriter<uint16_t>::WriteBigEndian(&buffer[18],
-                                       voip_metric_.endSystemDelay);
-  buffer[20] = voip_metric_.signalLevel;
-  buffer[21] = voip_metric_.noiseLevel;
-  buffer[22] = voip_metric_.RERL;
-  buffer[23] = voip_metric_.Gmin;
-  buffer[24] = voip_metric_.Rfactor;
-  buffer[25] = voip_metric_.extRfactor;
-  buffer[26] = voip_metric_.MOSLQ;
-  buffer[27] = voip_metric_.MOSCQ;
-  buffer[28] = voip_metric_.RXconfig;
-  buffer[29] = kReserved;
-  ByteWriter<uint16_t>::WriteBigEndian(&buffer[30], voip_metric_.JBnominal);
-  ByteWriter<uint16_t>::WriteBigEndian(&buffer[32], voip_metric_.JBmax);
-  ByteWriter<uint16_t>::WriteBigEndian(&buffer[34], voip_metric_.JBabsMax);
-}
-
-}  // namespace rtcp
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/rtcp_packet/voip_metric.h b/modules/rtp_rtcp/source/rtcp_packet/voip_metric.h
deleted file mode 100644
index 7409b4e..0000000
--- a/modules/rtp_rtcp/source/rtcp_packet/voip_metric.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- *  Copyright (c) 2015 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_RTP_RTCP_SOURCE_RTCP_PACKET_VOIP_METRIC_H_
-#define WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_PACKET_VOIP_METRIC_H_
-
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/rtc_base/basictypes.h"
-
-namespace webrtc {
-namespace rtcp {
-
-class VoipMetric {
- public:
-  static const uint8_t kBlockType = 7;
-  static const uint16_t kBlockLength = 8;
-  static const size_t kLength = 4 * (kBlockLength + 1);  // 36
-  VoipMetric();
-  VoipMetric(const VoipMetric&) = default;
-  ~VoipMetric() {}
-
-  VoipMetric& operator=(const VoipMetric&) = default;
-
-  void Parse(const uint8_t* buffer);
-
-  // Fills buffer with the VoipMetric.
-  // Consumes VoipMetric::kLength bytes.
-  void Create(uint8_t* buffer) const;
-
-  void SetMediaSsrc(uint32_t ssrc) { ssrc_ = ssrc; }
-  void SetVoipMetric(const RTCPVoIPMetric& voip_metric) {
-    voip_metric_ = voip_metric;
-  }
-
-  uint32_t ssrc() const { return ssrc_; }
-  const RTCPVoIPMetric& voip_metric() const { return voip_metric_; }
-
- private:
-  uint32_t ssrc_;
-  RTCPVoIPMetric voip_metric_;
-};
-
-}  // namespace rtcp
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_PACKET_VOIP_METRIC_H_
diff --git a/modules/rtp_rtcp/source/rtcp_packet/voip_metric_unittest.cc b/modules/rtp_rtcp/source/rtcp_packet/voip_metric_unittest.cc
deleted file mode 100644
index 803d41d..0000000
--- a/modules/rtp_rtcp/source/rtcp_packet/voip_metric_unittest.cc
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- *  Copyright (c) 2015 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/rtp_rtcp/source/rtcp_packet/voip_metric.h"
-
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-namespace rtcp {
-namespace {
-
-const uint32_t kRemoteSsrc = 0x23456789;
-const uint8_t kBlock[] = {0x07, 0x00, 0x00, 0x08, 0x23, 0x45, 0x67, 0x89,
-                          0x01, 0x02, 0x03, 0x04, 0x11, 0x12, 0x22, 0x23,
-                          0x33, 0x34, 0x44, 0x45, 0x05, 0x06, 0x07, 0x08,
-                          0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x00, 0x55, 0x56,
-                          0x66, 0x67, 0x77, 0x78};
-const size_t kBlockSizeBytes = sizeof(kBlock);
-static_assert(
-    kBlockSizeBytes == VoipMetric::kLength,
-    "Size of manually created Voip Metric block should match class constant");
-
-TEST(RtcpPacketVoipMetricTest, Create) {
-  uint8_t buffer[VoipMetric::kLength];
-  RTCPVoIPMetric metric;
-  metric.lossRate = 1;
-  metric.discardRate = 2;
-  metric.burstDensity = 3;
-  metric.gapDensity = 4;
-  metric.burstDuration = 0x1112;
-  metric.gapDuration = 0x2223;
-  metric.roundTripDelay = 0x3334;
-  metric.endSystemDelay = 0x4445;
-  metric.signalLevel = 5;
-  metric.noiseLevel = 6;
-  metric.RERL = 7;
-  metric.Gmin = 8;
-  metric.Rfactor = 9;
-  metric.extRfactor = 10;
-  metric.MOSLQ = 11;
-  metric.MOSCQ = 12;
-  metric.RXconfig = 13;
-  metric.JBnominal = 0x5556;
-  metric.JBmax = 0x6667;
-  metric.JBabsMax = 0x7778;
-  VoipMetric metric_block;
-  metric_block.SetMediaSsrc(kRemoteSsrc);
-  metric_block.SetVoipMetric(metric);
-
-  metric_block.Create(buffer);
-  EXPECT_EQ(0, memcmp(buffer, kBlock, kBlockSizeBytes));
-}
-
-TEST(RtcpPacketVoipMetricTest, Parse) {
-  VoipMetric read_metric;
-  read_metric.Parse(kBlock);
-
-  // Run checks on const object to ensure all accessors have const modifier.
-  const VoipMetric& parsed = read_metric;
-
-  EXPECT_EQ(kRemoteSsrc, parsed.ssrc());
-  EXPECT_EQ(1, parsed.voip_metric().lossRate);
-  EXPECT_EQ(2, parsed.voip_metric().discardRate);
-  EXPECT_EQ(3, parsed.voip_metric().burstDensity);
-  EXPECT_EQ(4, parsed.voip_metric().gapDensity);
-  EXPECT_EQ(0x1112, parsed.voip_metric().burstDuration);
-  EXPECT_EQ(0x2223, parsed.voip_metric().gapDuration);
-  EXPECT_EQ(0x3334, parsed.voip_metric().roundTripDelay);
-  EXPECT_EQ(0x4445, parsed.voip_metric().endSystemDelay);
-  EXPECT_EQ(5, parsed.voip_metric().signalLevel);
-  EXPECT_EQ(6, parsed.voip_metric().noiseLevel);
-  EXPECT_EQ(7, parsed.voip_metric().RERL);
-  EXPECT_EQ(8, parsed.voip_metric().Gmin);
-  EXPECT_EQ(9, parsed.voip_metric().Rfactor);
-  EXPECT_EQ(10, parsed.voip_metric().extRfactor);
-  EXPECT_EQ(11, parsed.voip_metric().MOSLQ);
-  EXPECT_EQ(12, parsed.voip_metric().MOSCQ);
-  EXPECT_EQ(13, parsed.voip_metric().RXconfig);
-  EXPECT_EQ(0x5556, parsed.voip_metric().JBnominal);
-  EXPECT_EQ(0x6667, parsed.voip_metric().JBmax);
-  EXPECT_EQ(0x7778, parsed.voip_metric().JBabsMax);
-}
-
-}  // namespace
-}  // namespace rtcp
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/rtcp_packet_unittest.cc b/modules/rtp_rtcp/source/rtcp_packet_unittest.cc
deleted file mode 100644
index f9544b3..0000000
--- a/modules/rtp_rtcp/source/rtcp_packet_unittest.cc
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- *  Copyright (c) 2014 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/rtp_rtcp/source/rtcp_packet.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/receiver_report.h"
-#include "webrtc/test/gmock.h"
-#include "webrtc/test/gtest.h"
-
-using webrtc::rtcp::ReceiverReport;
-using webrtc::rtcp::ReportBlock;
-
-namespace webrtc {
-
-const uint32_t kSenderSsrc = 0x12345678;
-
-TEST(RtcpPacketTest, BuildWithTooSmallBuffer) {
-  ReportBlock rb;
-  ReceiverReport rr;
-  rr.SetSenderSsrc(kSenderSsrc);
-  EXPECT_TRUE(rr.AddReportBlock(rb));
-
-  const size_t kRrLength = 8;
-  const size_t kReportBlockLength = 24;
-
-  // No packet.
-  class Verifier : public rtcp::RtcpPacket::PacketReadyCallback {
-    void OnPacketReady(uint8_t* data, size_t length) override {
-      ADD_FAILURE() << "Packet should not fit within max size.";
-    }
-  } verifier;
-  const size_t kBufferSize = kRrLength + kReportBlockLength - 1;
-  uint8_t buffer[kBufferSize];
-  EXPECT_FALSE(rr.BuildExternalBuffer(buffer, kBufferSize, &verifier));
-}
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/rtcp_receiver.cc b/modules/rtp_rtcp/source/rtcp_receiver.cc
deleted file mode 100644
index 8f498ac..0000000
--- a/modules/rtp_rtcp/source/rtcp_receiver.cc
+++ /dev/null
@@ -1,1049 +0,0 @@
-/*
- *  Copyright (c) 2012 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/rtp_rtcp/source/rtcp_receiver.h"
-
-#include <string.h>
-
-#include <limits>
-#include <map>
-#include <memory>
-#include <utility>
-#include <vector>
-
-#include "webrtc/common_types.h"
-#include "webrtc/common_video/include/video_bitrate_allocator.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/bye.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/common_header.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/compound_packet.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/extended_reports.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/fir.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/nack.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/pli.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/rapid_resync_request.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/receiver_report.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/remb.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/sdes.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/sender_report.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/tmmbn.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/tmmbr.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/transport_feedback.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_rtcp_config.h"
-#include "webrtc/modules/rtp_rtcp/source/time_util.h"
-#include "webrtc/modules/rtp_rtcp/source/tmmbr_help.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/trace_event.h"
-#include "webrtc/system_wrappers/include/ntp_time.h"
-
-namespace webrtc {
-namespace {
-
-using rtcp::CommonHeader;
-using rtcp::ReportBlock;
-
-// The number of RTCP time intervals needed to trigger a timeout.
-const int kRrTimeoutIntervals = 3;
-
-const int64_t kMaxWarningLogIntervalMs = 10000;
-const int64_t kRtcpMinFrameLengthMs = 17;
-
-}  // namespace
-
-struct RTCPReceiver::PacketInformation {
-  uint32_t packet_type_flags = 0;  // RTCPPacketTypeFlags bit field.
-
-  uint32_t remote_ssrc = 0;
-  std::vector<uint16_t> nack_sequence_numbers;
-  ReportBlockList report_blocks;
-  int64_t rtt_ms = 0;
-  uint32_t receiver_estimated_max_bitrate_bps = 0;
-  std::unique_ptr<rtcp::TransportFeedback> transport_feedback;
-  rtc::Optional<BitrateAllocation> target_bitrate_allocation;
-};
-
-// Structure for handing TMMBR and TMMBN rtcp messages (RFC5104, section 3.5.4).
-struct RTCPReceiver::TmmbrInformation {
-  struct TimedTmmbrItem {
-    rtcp::TmmbItem tmmbr_item;
-    int64_t last_updated_ms;
-  };
-
-  int64_t last_time_received_ms = 0;
-
-  bool ready_for_delete = false;
-
-  std::vector<rtcp::TmmbItem> tmmbn;
-  std::map<uint32_t, TimedTmmbrItem> tmmbr;
-};
-
-struct RTCPReceiver::ReportBlockWithRtt {
-  RTCPReportBlock report_block;
-
-  int64_t last_rtt_ms = 0;
-  int64_t min_rtt_ms = 0;
-  int64_t max_rtt_ms = 0;
-  int64_t sum_rtt_ms = 0;
-  size_t num_rtts = 0;
-};
-
-struct RTCPReceiver::LastFirStatus {
-  LastFirStatus(int64_t now_ms, uint8_t sequence_number)
-      : request_ms(now_ms), sequence_number(sequence_number) {}
-  int64_t request_ms;
-  uint8_t sequence_number;
-};
-
-RTCPReceiver::RTCPReceiver(
-    Clock* clock,
-    bool receiver_only,
-    RtcpPacketTypeCounterObserver* packet_type_counter_observer,
-    RtcpBandwidthObserver* rtcp_bandwidth_observer,
-    RtcpIntraFrameObserver* rtcp_intra_frame_observer,
-    TransportFeedbackObserver* transport_feedback_observer,
-    VideoBitrateAllocationObserver* bitrate_allocation_observer,
-    ModuleRtpRtcp* owner)
-    : clock_(clock),
-      receiver_only_(receiver_only),
-      rtp_rtcp_(owner),
-      rtcp_bandwidth_observer_(rtcp_bandwidth_observer),
-      rtcp_intra_frame_observer_(rtcp_intra_frame_observer),
-      transport_feedback_observer_(transport_feedback_observer),
-      bitrate_allocation_observer_(bitrate_allocation_observer),
-      main_ssrc_(0),
-      remote_ssrc_(0),
-      remote_sender_rtp_time_(0),
-      xr_rrtr_status_(false),
-      xr_rr_rtt_ms_(0),
-      oldest_tmmbr_info_ms_(0),
-      last_received_rr_ms_(0),
-      last_increased_sequence_number_ms_(0),
-      stats_callback_(nullptr),
-      packet_type_counter_observer_(packet_type_counter_observer),
-      num_skipped_packets_(0),
-      last_skipped_packets_warning_ms_(clock->TimeInMilliseconds()) {
-  RTC_DCHECK(owner);
-}
-
-RTCPReceiver::~RTCPReceiver() {}
-
-void RTCPReceiver::IncomingPacket(const uint8_t* packet, size_t packet_size) {
-  if (packet_size == 0) {
-    LOG(LS_WARNING) << "Incoming empty RTCP packet";
-    return;
-  }
-
-  PacketInformation packet_information;
-  if (!ParseCompoundPacket(packet, packet + packet_size, &packet_information))
-    return;
-  TriggerCallbacksFromRtcpPacket(packet_information);
-}
-
-int64_t RTCPReceiver::LastReceivedReceiverReport() const {
-  rtc::CritScope lock(&rtcp_receiver_lock_);
-  return last_received_rr_ms_;
-}
-
-void RTCPReceiver::SetRemoteSSRC(uint32_t ssrc) {
-  rtc::CritScope lock(&rtcp_receiver_lock_);
-  // New SSRC reset old reports.
-  last_received_sr_ntp_.Reset();
-  remote_ssrc_ = ssrc;
-}
-
-uint32_t RTCPReceiver::RemoteSSRC() const {
-  rtc::CritScope lock(&rtcp_receiver_lock_);
-  return remote_ssrc_;
-}
-
-void RTCPReceiver::SetSsrcs(uint32_t main_ssrc,
-                            const std::set<uint32_t>& registered_ssrcs) {
-  rtc::CritScope lock(&rtcp_receiver_lock_);
-  main_ssrc_ = main_ssrc;
-  registered_ssrcs_ = registered_ssrcs;
-}
-
-int32_t RTCPReceiver::RTT(uint32_t remote_ssrc,
-                          int64_t* last_rtt_ms,
-                          int64_t* avg_rtt_ms,
-                          int64_t* min_rtt_ms,
-                          int64_t* max_rtt_ms) const {
-  rtc::CritScope lock(&rtcp_receiver_lock_);
-
-  auto it = received_report_blocks_.find(main_ssrc_);
-  if (it == received_report_blocks_.end())
-    return -1;
-
-  auto it_info = it->second.find(remote_ssrc);
-  if (it_info == it->second.end())
-    return -1;
-
-  const ReportBlockWithRtt* report_block = &it_info->second;
-
-  if (report_block->num_rtts == 0)
-    return -1;
-
-  if (last_rtt_ms)
-    *last_rtt_ms = report_block->last_rtt_ms;
-
-  if (avg_rtt_ms)
-    *avg_rtt_ms = report_block->sum_rtt_ms / report_block->num_rtts;
-
-  if (min_rtt_ms)
-    *min_rtt_ms = report_block->min_rtt_ms;
-
-  if (max_rtt_ms)
-    *max_rtt_ms = report_block->max_rtt_ms;
-
-  return 0;
-}
-
-void RTCPReceiver::SetRtcpXrRrtrStatus(bool enable) {
-  rtc::CritScope lock(&rtcp_receiver_lock_);
-  xr_rrtr_status_ = enable;
-}
-
-bool RTCPReceiver::GetAndResetXrRrRtt(int64_t* rtt_ms) {
-  RTC_DCHECK(rtt_ms);
-  rtc::CritScope lock(&rtcp_receiver_lock_);
-  if (xr_rr_rtt_ms_ == 0) {
-    return false;
-  }
-  *rtt_ms = xr_rr_rtt_ms_;
-  xr_rr_rtt_ms_ = 0;
-  return true;
-}
-
-bool RTCPReceiver::NTP(uint32_t* received_ntp_secs,
-                       uint32_t* received_ntp_frac,
-                       uint32_t* rtcp_arrival_time_secs,
-                       uint32_t* rtcp_arrival_time_frac,
-                       uint32_t* rtcp_timestamp) const {
-  rtc::CritScope lock(&rtcp_receiver_lock_);
-  if (!last_received_sr_ntp_.Valid())
-    return false;
-
-  // NTP from incoming SenderReport.
-  if (received_ntp_secs)
-    *received_ntp_secs = remote_sender_ntp_time_.seconds();
-  if (received_ntp_frac)
-    *received_ntp_frac = remote_sender_ntp_time_.fractions();
-
-  // Rtp time from incoming SenderReport.
-  if (rtcp_timestamp)
-    *rtcp_timestamp = remote_sender_rtp_time_;
-
-  // Local NTP time when we received a RTCP packet with a send block.
-  if (rtcp_arrival_time_secs)
-    *rtcp_arrival_time_secs = last_received_sr_ntp_.seconds();
-  if (rtcp_arrival_time_frac)
-    *rtcp_arrival_time_frac = last_received_sr_ntp_.fractions();
-
-  return true;
-}
-
-bool RTCPReceiver::LastReceivedXrReferenceTimeInfo(
-    rtcp::ReceiveTimeInfo* info) const {
-  RTC_DCHECK(info);
-  rtc::CritScope lock(&rtcp_receiver_lock_);
-  if (!last_received_xr_ntp_.Valid())
-    return false;
-
-  info->ssrc = remote_time_info_.ssrc;
-  info->last_rr = remote_time_info_.last_rr;
-
-  // Get the delay since last received report (RFC 3611).
-  uint32_t receive_time_ntp = CompactNtp(last_received_xr_ntp_);
-  uint32_t now_ntp = CompactNtp(clock_->CurrentNtpTime());
-
-  info->delay_since_last_rr = now_ntp - receive_time_ntp;
-  return true;
-}
-
-// We can get multiple receive reports when we receive the report from a CE.
-int32_t RTCPReceiver::StatisticsReceived(
-    std::vector<RTCPReportBlock>* receive_blocks) const {
-  RTC_DCHECK(receive_blocks);
-  rtc::CritScope lock(&rtcp_receiver_lock_);
-  for (const auto& reports_per_receiver : received_report_blocks_)
-    for (const auto& report : reports_per_receiver.second)
-      receive_blocks->push_back(report.second.report_block);
-  return 0;
-}
-
-bool RTCPReceiver::ParseCompoundPacket(const uint8_t* packet_begin,
-                                       const uint8_t* packet_end,
-                                       PacketInformation* packet_information) {
-  rtc::CritScope lock(&rtcp_receiver_lock_);
-
-  CommonHeader rtcp_block;
-  for (const uint8_t* next_block = packet_begin; next_block != packet_end;
-       next_block = rtcp_block.NextPacket()) {
-    ptrdiff_t remaining_blocks_size = packet_end - next_block;
-    RTC_DCHECK_GT(remaining_blocks_size, 0);
-    if (!rtcp_block.Parse(next_block, remaining_blocks_size)) {
-      if (next_block == packet_begin) {
-        // Failed to parse 1st header, nothing was extracted from this packet.
-        LOG(LS_WARNING) << "Incoming invalid RTCP packet";
-        return false;
-      }
-      ++num_skipped_packets_;
-      break;
-    }
-
-    if (packet_type_counter_.first_packet_time_ms == -1)
-      packet_type_counter_.first_packet_time_ms = clock_->TimeInMilliseconds();
-
-    switch (rtcp_block.type()) {
-      case rtcp::SenderReport::kPacketType:
-        HandleSenderReport(rtcp_block, packet_information);
-        break;
-      case rtcp::ReceiverReport::kPacketType:
-        HandleReceiverReport(rtcp_block, packet_information);
-        break;
-      case rtcp::Sdes::kPacketType:
-        HandleSdes(rtcp_block, packet_information);
-        break;
-      case rtcp::ExtendedReports::kPacketType:
-        HandleXr(rtcp_block, packet_information);
-        break;
-      case rtcp::Bye::kPacketType:
-        HandleBye(rtcp_block);
-        break;
-      case rtcp::Rtpfb::kPacketType:
-        switch (rtcp_block.fmt()) {
-          case rtcp::Nack::kFeedbackMessageType:
-            HandleNack(rtcp_block, packet_information);
-            break;
-          case rtcp::Tmmbr::kFeedbackMessageType:
-            HandleTmmbr(rtcp_block, packet_information);
-            break;
-          case rtcp::Tmmbn::kFeedbackMessageType:
-            HandleTmmbn(rtcp_block, packet_information);
-            break;
-          case rtcp::RapidResyncRequest::kFeedbackMessageType:
-            HandleSrReq(rtcp_block, packet_information);
-            break;
-          case rtcp::TransportFeedback::kFeedbackMessageType:
-            HandleTransportFeedback(rtcp_block, packet_information);
-            break;
-          default:
-            ++num_skipped_packets_;
-            break;
-        }
-        break;
-      case rtcp::Psfb::kPacketType:
-        switch (rtcp_block.fmt()) {
-          case rtcp::Pli::kFeedbackMessageType:
-            HandlePli(rtcp_block, packet_information);
-            break;
-          case rtcp::Fir::kFeedbackMessageType:
-            HandleFir(rtcp_block, packet_information);
-            break;
-          case rtcp::Remb::kFeedbackMessageType:
-            HandlePsfbApp(rtcp_block, packet_information);
-            break;
-          default:
-            ++num_skipped_packets_;
-            break;
-        }
-        break;
-      default:
-        ++num_skipped_packets_;
-        break;
-    }
-  }
-
-  if (packet_type_counter_observer_) {
-    packet_type_counter_observer_->RtcpPacketTypesCounterUpdated(
-        main_ssrc_, packet_type_counter_);
-  }
-
-  int64_t now_ms = clock_->TimeInMilliseconds();
-  if (now_ms - last_skipped_packets_warning_ms_ >= kMaxWarningLogIntervalMs &&
-      num_skipped_packets_ > 0) {
-    last_skipped_packets_warning_ms_ = now_ms;
-    LOG(LS_WARNING) << num_skipped_packets_
-                    << " RTCP blocks were skipped due to being malformed or of "
-                       "unrecognized/unsupported type, during the past "
-                    << (kMaxWarningLogIntervalMs / 1000) << " second period.";
-  }
-
-  return true;
-}
-
-void RTCPReceiver::HandleSenderReport(const CommonHeader& rtcp_block,
-                                      PacketInformation* packet_information) {
-  rtcp::SenderReport sender_report;
-  if (!sender_report.Parse(rtcp_block)) {
-    ++num_skipped_packets_;
-    return;
-  }
-
-  const uint32_t remote_ssrc = sender_report.sender_ssrc();
-
-  packet_information->remote_ssrc = remote_ssrc;
-
-  UpdateTmmbrRemoteIsAlive(remote_ssrc);
-
-  TRACE_EVENT_INSTANT2(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), "SR",
-                       "remote_ssrc", remote_ssrc, "ssrc", main_ssrc_);
-
-  // Have I received RTP packets from this party?
-  if (remote_ssrc_ == remote_ssrc) {
-    // Only signal that we have received a SR when we accept one.
-    packet_information->packet_type_flags |= kRtcpSr;
-
-    remote_sender_ntp_time_ = sender_report.ntp();
-    remote_sender_rtp_time_ = sender_report.rtp_timestamp();
-    last_received_sr_ntp_ = clock_->CurrentNtpTime();
-  } else {
-    // We will only store the send report from one source, but
-    // we will store all the receive blocks.
-    packet_information->packet_type_flags |= kRtcpRr;
-  }
-
-  for (const rtcp::ReportBlock report_block : sender_report.report_blocks())
-    HandleReportBlock(report_block, packet_information, remote_ssrc);
-}
-
-void RTCPReceiver::HandleReceiverReport(const CommonHeader& rtcp_block,
-                                        PacketInformation* packet_information) {
-  rtcp::ReceiverReport receiver_report;
-  if (!receiver_report.Parse(rtcp_block)) {
-    ++num_skipped_packets_;
-    return;
-  }
-
-  last_received_rr_ms_ = clock_->TimeInMilliseconds();
-
-  const uint32_t remote_ssrc = receiver_report.sender_ssrc();
-
-  packet_information->remote_ssrc = remote_ssrc;
-
-  UpdateTmmbrRemoteIsAlive(remote_ssrc);
-
-  TRACE_EVENT_INSTANT2(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), "RR",
-                       "remote_ssrc", remote_ssrc, "ssrc", main_ssrc_);
-
-  packet_information->packet_type_flags |= kRtcpRr;
-
-  for (const ReportBlock& report_block : receiver_report.report_blocks())
-    HandleReportBlock(report_block, packet_information, remote_ssrc);
-}
-
-void RTCPReceiver::HandleReportBlock(const ReportBlock& report_block,
-                                     PacketInformation* packet_information,
-                                     uint32_t remote_ssrc) {
-  // This will be called once per report block in the RTCP packet.
-  // We filter out all report blocks that are not for us.
-  // Each packet has max 31 RR blocks.
-  //
-  // We can calc RTT if we send a send report and get a report block back.
-
-  // |report_block.source_ssrc()| is the SSRC identifier of the source to
-  // which the information in this reception report block pertains.
-
-  // Filter out all report blocks that are not for us.
-  if (registered_ssrcs_.count(report_block.source_ssrc()) == 0)
-    return;
-
-  ReportBlockWithRtt* report_block_info =
-      &received_report_blocks_[report_block.source_ssrc()][remote_ssrc];
-  report_block_info->report_block.sender_ssrc = remote_ssrc;
-  report_block_info->report_block.source_ssrc = report_block.source_ssrc();
-  report_block_info->report_block.fraction_lost = report_block.fraction_lost();
-  report_block_info->report_block.packets_lost = report_block.cumulative_lost();
-  if (report_block.extended_high_seq_num() >
-      report_block_info->report_block.extended_highest_sequence_number) {
-    // We have successfully delivered new RTP packets to the remote side after
-    // the last RR was sent from the remote side.
-    last_increased_sequence_number_ms_ = clock_->TimeInMilliseconds();
-  }
-  report_block_info->report_block.extended_highest_sequence_number =
-      report_block.extended_high_seq_num();
-  report_block_info->report_block.jitter = report_block.jitter();
-  report_block_info->report_block.delay_since_last_sender_report =
-      report_block.delay_since_last_sr();
-  report_block_info->report_block.last_sender_report_timestamp =
-      report_block.last_sr();
-
-  int64_t rtt_ms = 0;
-  uint32_t send_time_ntp = report_block.last_sr();
-  // RFC3550, section 6.4.1, LSR field discription states:
-  // If no SR has been received yet, the field is set to zero.
-  // Receiver rtp_rtcp module is not expected to calculate rtt using
-  // Sender Reports even if it accidentally can.
-  if (!receiver_only_ && send_time_ntp != 0) {
-    uint32_t delay_ntp = report_block.delay_since_last_sr();
-    // Local NTP time.
-    uint32_t receive_time_ntp = CompactNtp(clock_->CurrentNtpTime());
-
-    // RTT in 1/(2^16) seconds.
-    uint32_t rtt_ntp = receive_time_ntp - delay_ntp - send_time_ntp;
-    // Convert to 1/1000 seconds (milliseconds).
-    rtt_ms = CompactNtpRttToMs(rtt_ntp);
-    if (rtt_ms > report_block_info->max_rtt_ms)
-      report_block_info->max_rtt_ms = rtt_ms;
-
-    if (report_block_info->num_rtts == 0 ||
-        rtt_ms < report_block_info->min_rtt_ms)
-      report_block_info->min_rtt_ms = rtt_ms;
-
-    report_block_info->last_rtt_ms = rtt_ms;
-    report_block_info->sum_rtt_ms += rtt_ms;
-    ++report_block_info->num_rtts;
-  }
-
-  TRACE_COUNTER_ID1(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), "RR_RTT",
-                    report_block.source_ssrc(), rtt_ms);
-
-  packet_information->rtt_ms = rtt_ms;
-  packet_information->report_blocks.push_back(report_block_info->report_block);
-}
-
-RTCPReceiver::TmmbrInformation* RTCPReceiver::FindOrCreateTmmbrInfo(
-    uint32_t remote_ssrc) {
-  // Create or find receive information.
-  TmmbrInformation* tmmbr_info = &tmmbr_infos_[remote_ssrc];
-  // Update that this remote is alive.
-  tmmbr_info->last_time_received_ms = clock_->TimeInMilliseconds();
-  return tmmbr_info;
-}
-
-void RTCPReceiver::UpdateTmmbrRemoteIsAlive(uint32_t remote_ssrc) {
-  auto tmmbr_it = tmmbr_infos_.find(remote_ssrc);
-  if (tmmbr_it != tmmbr_infos_.end())
-    tmmbr_it->second.last_time_received_ms = clock_->TimeInMilliseconds();
-}
-
-RTCPReceiver::TmmbrInformation* RTCPReceiver::GetTmmbrInformation(
-    uint32_t remote_ssrc) {
-  auto it = tmmbr_infos_.find(remote_ssrc);
-  if (it == tmmbr_infos_.end())
-    return nullptr;
-  return &it->second;
-}
-
-bool RTCPReceiver::RtcpRrTimeout(int64_t rtcp_interval_ms) {
-  rtc::CritScope lock(&rtcp_receiver_lock_);
-  if (last_received_rr_ms_ == 0)
-    return false;
-
-  int64_t time_out_ms = kRrTimeoutIntervals * rtcp_interval_ms;
-  if (clock_->TimeInMilliseconds() > last_received_rr_ms_ + time_out_ms) {
-    // Reset the timer to only trigger one log.
-    last_received_rr_ms_ = 0;
-    return true;
-  }
-  return false;
-}
-
-bool RTCPReceiver::RtcpRrSequenceNumberTimeout(int64_t rtcp_interval_ms) {
-  rtc::CritScope lock(&rtcp_receiver_lock_);
-  if (last_increased_sequence_number_ms_ == 0)
-    return false;
-
-  int64_t time_out_ms = kRrTimeoutIntervals * rtcp_interval_ms;
-  if (clock_->TimeInMilliseconds() >
-      last_increased_sequence_number_ms_ + time_out_ms) {
-    // Reset the timer to only trigger one log.
-    last_increased_sequence_number_ms_ = 0;
-    return true;
-  }
-  return false;
-}
-
-bool RTCPReceiver::UpdateTmmbrTimers() {
-  rtc::CritScope lock(&rtcp_receiver_lock_);
-
-  int64_t now_ms = clock_->TimeInMilliseconds();
-  // Use audio define since we don't know what interval the remote peer use.
-  int64_t timeout_ms = now_ms - 5 * RTCP_INTERVAL_AUDIO_MS;
-
-  if (oldest_tmmbr_info_ms_ >= timeout_ms)
-    return false;
-
-  bool update_bounding_set = false;
-  oldest_tmmbr_info_ms_ = -1;
-  for (auto tmmbr_it = tmmbr_infos_.begin(); tmmbr_it != tmmbr_infos_.end();) {
-    TmmbrInformation* tmmbr_info = &tmmbr_it->second;
-    if (tmmbr_info->last_time_received_ms > 0) {
-      if (tmmbr_info->last_time_received_ms < timeout_ms) {
-        // No rtcp packet for the last 5 regular intervals, reset limitations.
-        tmmbr_info->tmmbr.clear();
-        // Prevent that we call this over and over again.
-        tmmbr_info->last_time_received_ms = 0;
-        // Send new TMMBN to all channels using the default codec.
-        update_bounding_set = true;
-      } else if (oldest_tmmbr_info_ms_ == -1 ||
-                 tmmbr_info->last_time_received_ms < oldest_tmmbr_info_ms_) {
-        oldest_tmmbr_info_ms_ = tmmbr_info->last_time_received_ms;
-      }
-      ++tmmbr_it;
-    } else if (tmmbr_info->ready_for_delete) {
-      // When we dont have a last_time_received_ms and the object is marked
-      // ready_for_delete it's removed from the map.
-      tmmbr_it = tmmbr_infos_.erase(tmmbr_it);
-    } else {
-      ++tmmbr_it;
-    }
-  }
-  return update_bounding_set;
-}
-
-std::vector<rtcp::TmmbItem> RTCPReceiver::BoundingSet(bool* tmmbr_owner) {
-  rtc::CritScope lock(&rtcp_receiver_lock_);
-  TmmbrInformation* tmmbr_info = GetTmmbrInformation(remote_ssrc_);
-  if (!tmmbr_info)
-    return std::vector<rtcp::TmmbItem>();
-
-  *tmmbr_owner = TMMBRHelp::IsOwner(tmmbr_info->tmmbn, main_ssrc_);
-  return tmmbr_info->tmmbn;
-}
-
-void RTCPReceiver::HandleSdes(const CommonHeader& rtcp_block,
-                              PacketInformation* packet_information) {
-  rtcp::Sdes sdes;
-  if (!sdes.Parse(rtcp_block)) {
-    ++num_skipped_packets_;
-    return;
-  }
-
-  for (const rtcp::Sdes::Chunk& chunk : sdes.chunks()) {
-    received_cnames_[chunk.ssrc] = chunk.cname;
-    {
-      rtc::CritScope lock(&feedbacks_lock_);
-      if (stats_callback_)
-        stats_callback_->CNameChanged(chunk.cname.c_str(), chunk.ssrc);
-    }
-  }
-  packet_information->packet_type_flags |= kRtcpSdes;
-}
-
-void RTCPReceiver::HandleNack(const CommonHeader& rtcp_block,
-                              PacketInformation* packet_information) {
-  rtcp::Nack nack;
-  if (!nack.Parse(rtcp_block)) {
-    ++num_skipped_packets_;
-    return;
-  }
-
-  if (receiver_only_ || main_ssrc_ != nack.media_ssrc())  // Not to us.
-    return;
-
-  packet_information->nack_sequence_numbers.insert(
-      packet_information->nack_sequence_numbers.end(),
-      nack.packet_ids().begin(), nack.packet_ids().end());
-  for (uint16_t packet_id : nack.packet_ids())
-    nack_stats_.ReportRequest(packet_id);
-
-  if (!nack.packet_ids().empty()) {
-    packet_information->packet_type_flags |= kRtcpNack;
-    ++packet_type_counter_.nack_packets;
-    packet_type_counter_.nack_requests = nack_stats_.requests();
-    packet_type_counter_.unique_nack_requests = nack_stats_.unique_requests();
-  }
-}
-
-void RTCPReceiver::HandleBye(const CommonHeader& rtcp_block) {
-  rtcp::Bye bye;
-  if (!bye.Parse(rtcp_block)) {
-    ++num_skipped_packets_;
-    return;
-  }
-
-  // Clear our lists.
-  for (auto& reports_per_receiver : received_report_blocks_)
-    reports_per_receiver.second.erase(bye.sender_ssrc());
-
-  TmmbrInformation* tmmbr_info = GetTmmbrInformation(bye.sender_ssrc());
-  if (tmmbr_info)
-    tmmbr_info->ready_for_delete = true;
-
-  last_fir_.erase(bye.sender_ssrc());
-  received_cnames_.erase(bye.sender_ssrc());
-  xr_rr_rtt_ms_ = 0;
-}
-
-void RTCPReceiver::HandleXr(const CommonHeader& rtcp_block,
-                            PacketInformation* packet_information) {
-  rtcp::ExtendedReports xr;
-  if (!xr.Parse(rtcp_block)) {
-    ++num_skipped_packets_;
-    return;
-  }
-
-  if (xr.rrtr())
-    HandleXrReceiveReferenceTime(xr.sender_ssrc(), *xr.rrtr());
-
-  for (const rtcp::ReceiveTimeInfo& time_info : xr.dlrr().sub_blocks())
-    HandleXrDlrrReportBlock(time_info);
-
-  if (xr.target_bitrate()) {
-    HandleXrTargetBitrate(xr.sender_ssrc(), *xr.target_bitrate(),
-                          packet_information);
-  }
-}
-
-void RTCPReceiver::HandleXrReceiveReferenceTime(uint32_t sender_ssrc,
-                                                const rtcp::Rrtr& rrtr) {
-  remote_time_info_.ssrc = sender_ssrc;
-  remote_time_info_.last_rr = CompactNtp(rrtr.ntp());
-  last_received_xr_ntp_ = clock_->CurrentNtpTime();
-}
-
-void RTCPReceiver::HandleXrDlrrReportBlock(const rtcp::ReceiveTimeInfo& rti) {
-  if (registered_ssrcs_.count(rti.ssrc) == 0)  // Not to us.
-    return;
-
-  // Caller should explicitly enable rtt calculation using extended reports.
-  if (!xr_rrtr_status_)
-    return;
-
-  // The send_time and delay_rr fields are in units of 1/2^16 sec.
-  uint32_t send_time_ntp = rti.last_rr;
-  // RFC3611, section 4.5, LRR field discription states:
-  // If no such block has been received, the field is set to zero.
-  if (send_time_ntp == 0)
-    return;
-
-  uint32_t delay_ntp = rti.delay_since_last_rr;
-  uint32_t now_ntp = CompactNtp(clock_->CurrentNtpTime());
-
-  uint32_t rtt_ntp = now_ntp - delay_ntp - send_time_ntp;
-  xr_rr_rtt_ms_ = CompactNtpRttToMs(rtt_ntp);
-}
-
-void RTCPReceiver::HandleXrTargetBitrate(
-    uint32_t ssrc,
-    const rtcp::TargetBitrate& target_bitrate,
-    PacketInformation* packet_information) {
-  if (ssrc != remote_ssrc_) {
-    return;  // Not for us.
-  }
-
-  BitrateAllocation bitrate_allocation;
-  for (const auto& item : target_bitrate.GetTargetBitrates()) {
-    if (item.spatial_layer >= kMaxSpatialLayers ||
-        item.temporal_layer >= kMaxTemporalStreams) {
-      LOG(LS_WARNING)
-          << "Invalid layer in XR target bitrate pack: spatial index "
-          << item.spatial_layer << ", temporal index " << item.temporal_layer
-          << ", dropping.";
-    } else {
-      bitrate_allocation.SetBitrate(item.spatial_layer, item.temporal_layer,
-                                    item.target_bitrate_kbps * 1000);
-    }
-  }
-  packet_information->target_bitrate_allocation.emplace(bitrate_allocation);
-}
-
-void RTCPReceiver::HandlePli(const CommonHeader& rtcp_block,
-                             PacketInformation* packet_information) {
-  rtcp::Pli pli;
-  if (!pli.Parse(rtcp_block)) {
-    ++num_skipped_packets_;
-    return;
-  }
-
-  if (main_ssrc_ == pli.media_ssrc()) {
-    TRACE_EVENT_INSTANT0(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), "PLI");
-
-    ++packet_type_counter_.pli_packets;
-    // Received a signal that we need to send a new key frame.
-    packet_information->packet_type_flags |= kRtcpPli;
-  }
-}
-
-void RTCPReceiver::HandleTmmbr(const CommonHeader& rtcp_block,
-                               PacketInformation* packet_information) {
-  rtcp::Tmmbr tmmbr;
-  if (!tmmbr.Parse(rtcp_block)) {
-    ++num_skipped_packets_;
-    return;
-  }
-
-  uint32_t sender_ssrc = tmmbr.sender_ssrc();
-  if (tmmbr.media_ssrc()) {
-    // media_ssrc() SHOULD be 0 if same as SenderSSRC.
-    // In relay mode this is a valid number.
-    sender_ssrc = tmmbr.media_ssrc();
-  }
-
-  for (const rtcp::TmmbItem& request : tmmbr.requests()) {
-    if (main_ssrc_ != request.ssrc() || request.bitrate_bps() == 0)
-      continue;
-
-    TmmbrInformation* tmmbr_info = FindOrCreateTmmbrInfo(tmmbr.sender_ssrc());
-    auto* entry = &tmmbr_info->tmmbr[sender_ssrc];
-    entry->tmmbr_item = rtcp::TmmbItem(sender_ssrc,
-                                       request.bitrate_bps(),
-                                       request.packet_overhead());
-    entry->last_updated_ms = clock_->TimeInMilliseconds();
-
-    packet_information->packet_type_flags |= kRtcpTmmbr;
-    break;
-  }
-}
-
-void RTCPReceiver::HandleTmmbn(const CommonHeader& rtcp_block,
-                               PacketInformation* packet_information) {
-  rtcp::Tmmbn tmmbn;
-  if (!tmmbn.Parse(rtcp_block)) {
-    ++num_skipped_packets_;
-    return;
-  }
-
-  TmmbrInformation* tmmbr_info = FindOrCreateTmmbrInfo(tmmbn.sender_ssrc());
-
-  packet_information->packet_type_flags |= kRtcpTmmbn;
-
-  tmmbr_info->tmmbn = tmmbn.items();
-}
-
-void RTCPReceiver::HandleSrReq(const CommonHeader& rtcp_block,
-                               PacketInformation* packet_information) {
-  rtcp::RapidResyncRequest sr_req;
-  if (!sr_req.Parse(rtcp_block)) {
-    ++num_skipped_packets_;
-    return;
-  }
-
-  packet_information->packet_type_flags |= kRtcpSrReq;
-}
-
-void RTCPReceiver::HandlePsfbApp(const CommonHeader& rtcp_block,
-                                 PacketInformation* packet_information) {
-  rtcp::Remb remb;
-  if (remb.Parse(rtcp_block)) {
-    packet_information->packet_type_flags |= kRtcpRemb;
-    packet_information->receiver_estimated_max_bitrate_bps = remb.bitrate_bps();
-    return;
-  }
-
-  ++num_skipped_packets_;
-}
-
-void RTCPReceiver::HandleFir(const CommonHeader& rtcp_block,
-                             PacketInformation* packet_information) {
-  rtcp::Fir fir;
-  if (!fir.Parse(rtcp_block)) {
-    ++num_skipped_packets_;
-    return;
-  }
-
-  for (const rtcp::Fir::Request& fir_request : fir.requests()) {
-    // Is it our sender that is requested to generate a new keyframe.
-    if (main_ssrc_ != fir_request.ssrc)
-      continue;
-
-    ++packet_type_counter_.fir_packets;
-
-    int64_t now_ms = clock_->TimeInMilliseconds();
-    auto inserted = last_fir_.insert(std::make_pair(
-        fir.sender_ssrc(), LastFirStatus(now_ms, fir_request.seq_nr)));
-    if (!inserted.second) {  // There was already an entry.
-      LastFirStatus* last_fir = &inserted.first->second;
-
-      // Check if we have reported this FIRSequenceNumber before.
-      if (fir_request.seq_nr == last_fir->sequence_number)
-        continue;
-
-      // Sanity: don't go crazy with the callbacks.
-      if (now_ms - last_fir->request_ms < kRtcpMinFrameLengthMs)
-        continue;
-
-      last_fir->request_ms = now_ms;
-      last_fir->sequence_number = fir_request.seq_nr;
-    }
-    // Received signal that we need to send a new key frame.
-    packet_information->packet_type_flags |= kRtcpFir;
-  }
-}
-
-void RTCPReceiver::HandleTransportFeedback(
-    const CommonHeader& rtcp_block,
-    PacketInformation* packet_information) {
-  std::unique_ptr<rtcp::TransportFeedback> transport_feedback(
-      new rtcp::TransportFeedback());
-  if (!transport_feedback->Parse(rtcp_block)) {
-    ++num_skipped_packets_;
-    return;
-  }
-
-  packet_information->packet_type_flags |= kRtcpTransportFeedback;
-  packet_information->transport_feedback = std::move(transport_feedback);
-}
-
-void RTCPReceiver::NotifyTmmbrUpdated() {
-  // Find bounding set.
-  std::vector<rtcp::TmmbItem> bounding =
-      TMMBRHelp::FindBoundingSet(TmmbrReceived());
-
-  if (!bounding.empty() && rtcp_bandwidth_observer_) {
-    // We have a new bandwidth estimate on this channel.
-    uint64_t bitrate_bps = TMMBRHelp::CalcMinBitrateBps(bounding);
-    if (bitrate_bps <= std::numeric_limits<uint32_t>::max())
-      rtcp_bandwidth_observer_->OnReceivedEstimatedBitrate(bitrate_bps);
-  }
-
-  // Send tmmbn to inform remote clients about the new bandwidth.
-  rtp_rtcp_->SetTmmbn(std::move(bounding));
-}
-
-void RTCPReceiver::RegisterRtcpStatisticsCallback(
-    RtcpStatisticsCallback* callback) {
-  rtc::CritScope cs(&feedbacks_lock_);
-  stats_callback_ = callback;
-}
-
-RtcpStatisticsCallback* RTCPReceiver::GetRtcpStatisticsCallback() {
-  rtc::CritScope cs(&feedbacks_lock_);
-  return stats_callback_;
-}
-
-// Holding no Critical section.
-void RTCPReceiver::TriggerCallbacksFromRtcpPacket(
-    const PacketInformation& packet_information) {
-  // Process TMMBR and REMB first to avoid multiple callbacks
-  // to OnNetworkChanged.
-  if (packet_information.packet_type_flags & kRtcpTmmbr) {
-    // Might trigger a OnReceivedBandwidthEstimateUpdate.
-    NotifyTmmbrUpdated();
-  }
-  uint32_t local_ssrc;
-  std::set<uint32_t> registered_ssrcs;
-  {
-    // We don't want to hold this critsect when triggering the callbacks below.
-    rtc::CritScope lock(&rtcp_receiver_lock_);
-    local_ssrc = main_ssrc_;
-    registered_ssrcs = registered_ssrcs_;
-  }
-  if (!receiver_only_ && (packet_information.packet_type_flags & kRtcpSrReq)) {
-    rtp_rtcp_->OnRequestSendReport();
-  }
-  if (!receiver_only_ && (packet_information.packet_type_flags & kRtcpNack)) {
-    if (!packet_information.nack_sequence_numbers.empty()) {
-      LOG(LS_VERBOSE) << "Incoming NACK length: "
-                      << packet_information.nack_sequence_numbers.size();
-      rtp_rtcp_->OnReceivedNack(packet_information.nack_sequence_numbers);
-    }
-  }
-
-  // We need feedback that we have received a report block(s) so that we
-  // can generate a new packet in a conference relay scenario, one received
-  // report can generate several RTCP packets, based on number relayed/mixed
-  // a send report block should go out to all receivers.
-  if (rtcp_intra_frame_observer_) {
-    RTC_DCHECK(!receiver_only_);
-    if ((packet_information.packet_type_flags & kRtcpPli) ||
-        (packet_information.packet_type_flags & kRtcpFir)) {
-      if (packet_information.packet_type_flags & kRtcpPli) {
-        LOG(LS_VERBOSE) << "Incoming PLI from SSRC "
-                        << packet_information.remote_ssrc;
-      } else {
-        LOG(LS_VERBOSE) << "Incoming FIR from SSRC "
-                        << packet_information.remote_ssrc;
-      }
-      rtcp_intra_frame_observer_->OnReceivedIntraFrameRequest(local_ssrc);
-    }
-  }
-  if (rtcp_bandwidth_observer_) {
-    RTC_DCHECK(!receiver_only_);
-    if (packet_information.packet_type_flags & kRtcpRemb) {
-      LOG(LS_VERBOSE) << "Incoming REMB: "
-                      << packet_information.receiver_estimated_max_bitrate_bps;
-      rtcp_bandwidth_observer_->OnReceivedEstimatedBitrate(
-          packet_information.receiver_estimated_max_bitrate_bps);
-    }
-    if ((packet_information.packet_type_flags & kRtcpSr) ||
-        (packet_information.packet_type_flags & kRtcpRr)) {
-      int64_t now_ms = clock_->TimeInMilliseconds();
-      rtcp_bandwidth_observer_->OnReceivedRtcpReceiverReport(
-          packet_information.report_blocks, packet_information.rtt_ms, now_ms);
-    }
-  }
-  if ((packet_information.packet_type_flags & kRtcpSr) ||
-      (packet_information.packet_type_flags & kRtcpRr)) {
-    rtp_rtcp_->OnReceivedRtcpReportBlocks(packet_information.report_blocks);
-  }
-
-  if (transport_feedback_observer_ &&
-      (packet_information.packet_type_flags & kRtcpTransportFeedback)) {
-    uint32_t media_source_ssrc =
-        packet_information.transport_feedback->media_ssrc();
-    if (media_source_ssrc == local_ssrc ||
-        registered_ssrcs.find(media_source_ssrc) != registered_ssrcs.end()) {
-      transport_feedback_observer_->OnTransportFeedback(
-          *packet_information.transport_feedback);
-    }
-  }
-
-  if (bitrate_allocation_observer_ &&
-      packet_information.target_bitrate_allocation) {
-    bitrate_allocation_observer_->OnBitrateAllocationUpdated(
-        *packet_information.target_bitrate_allocation);
-  }
-
-  if (!receiver_only_) {
-    rtc::CritScope cs(&feedbacks_lock_);
-    if (stats_callback_) {
-      for (const auto& report_block : packet_information.report_blocks) {
-        RtcpStatistics stats;
-        stats.packets_lost = report_block.packets_lost;
-        stats.extended_highest_sequence_number =
-            report_block.extended_highest_sequence_number;
-        stats.fraction_lost = report_block.fraction_lost;
-        stats.jitter = report_block.jitter;
-
-        stats_callback_->StatisticsUpdated(stats, report_block.source_ssrc);
-      }
-    }
-  }
-}
-
-int32_t RTCPReceiver::CNAME(uint32_t remoteSSRC,
-                            char cName[RTCP_CNAME_SIZE]) const {
-  RTC_DCHECK(cName);
-
-  rtc::CritScope lock(&rtcp_receiver_lock_);
-  auto received_cname_it = received_cnames_.find(remoteSSRC);
-  if (received_cname_it == received_cnames_.end())
-    return -1;
-
-  size_t length = received_cname_it->second.copy(cName, RTCP_CNAME_SIZE - 1);
-  cName[length] = 0;
-  return 0;
-}
-
-std::vector<rtcp::TmmbItem> RTCPReceiver::TmmbrReceived() {
-  rtc::CritScope lock(&rtcp_receiver_lock_);
-  std::vector<rtcp::TmmbItem> candidates;
-
-  int64_t now_ms = clock_->TimeInMilliseconds();
-  // Use audio define since we don't know what interval the remote peer use.
-  int64_t timeout_ms = now_ms - 5 * RTCP_INTERVAL_AUDIO_MS;
-
-  for (auto& kv : tmmbr_infos_) {
-    for (auto it = kv.second.tmmbr.begin(); it != kv.second.tmmbr.end();) {
-      if (it->second.last_updated_ms < timeout_ms) {
-        // Erase timeout entries.
-        it = kv.second.tmmbr.erase(it);
-      } else {
-        candidates.push_back(it->second.tmmbr_item);
-        ++it;
-      }
-    }
-  }
-  return candidates;
-}
-
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/rtcp_receiver.h b/modules/rtp_rtcp/source/rtcp_receiver.h
deleted file mode 100644
index c0e486a..0000000
--- a/modules/rtp_rtcp/source/rtcp_receiver.h
+++ /dev/null
@@ -1,266 +0,0 @@
-/*
- *  Copyright (c) 2012 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_RTP_RTCP_SOURCE_RTCP_RECEIVER_H_
-#define WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_RECEIVER_H_
-
-#include <map>
-#include <set>
-#include <string>
-#include <vector>
-
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_nack_stats.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/dlrr.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/thread_annotations.h"
-#include "webrtc/system_wrappers/include/ntp_time.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-class VideoBitrateAllocationObserver;
-namespace rtcp {
-class CommonHeader;
-class ReportBlock;
-class Rrtr;
-class TargetBitrate;
-class TmmbItem;
-}  // namespace rtcp
-
-class RTCPReceiver {
- public:
-  class ModuleRtpRtcp {
-   public:
-    virtual void SetTmmbn(std::vector<rtcp::TmmbItem> bounding_set) = 0;
-    virtual void OnRequestSendReport() = 0;
-    virtual void OnReceivedNack(
-        const std::vector<uint16_t>& nack_sequence_numbers) = 0;
-    virtual void OnReceivedRtcpReportBlocks(
-        const ReportBlockList& report_blocks) = 0;
-
-   protected:
-    virtual ~ModuleRtpRtcp() = default;
-  };
-
-  RTCPReceiver(Clock* clock,
-               bool receiver_only,
-               RtcpPacketTypeCounterObserver* packet_type_counter_observer,
-               RtcpBandwidthObserver* rtcp_bandwidth_observer,
-               RtcpIntraFrameObserver* rtcp_intra_frame_observer,
-               TransportFeedbackObserver* transport_feedback_observer,
-               VideoBitrateAllocationObserver* bitrate_allocation_observer,
-               ModuleRtpRtcp* owner);
-  virtual ~RTCPReceiver();
-
-  void IncomingPacket(const uint8_t* packet, size_t packet_size);
-
-  int64_t LastReceivedReceiverReport() const;
-
-  void SetSsrcs(uint32_t main_ssrc, const std::set<uint32_t>& registered_ssrcs);
-  void SetRemoteSSRC(uint32_t ssrc);
-  uint32_t RemoteSSRC() const;
-
-  // Get received cname.
-  int32_t CNAME(uint32_t remote_ssrc, char cname[RTCP_CNAME_SIZE]) const;
-
-  // Get received NTP.
-  bool NTP(uint32_t* received_ntp_secs,
-           uint32_t* received_ntp_frac,
-           uint32_t* rtcp_arrival_time_secs,
-           uint32_t* rtcp_arrival_time_frac,
-           uint32_t* rtcp_timestamp) const;
-
-  bool LastReceivedXrReferenceTimeInfo(rtcp::ReceiveTimeInfo* info) const;
-
-  // Get rtt.
-  int32_t RTT(uint32_t remote_ssrc,
-              int64_t* last_rtt_ms,
-              int64_t* avg_rtt_ms,
-              int64_t* min_rtt_ms,
-              int64_t* max_rtt_ms) const;
-
-  void SetRtcpXrRrtrStatus(bool enable);
-  bool GetAndResetXrRrRtt(int64_t* rtt_ms);
-
-  // Get statistics.
-  int32_t StatisticsReceived(std::vector<RTCPReportBlock>* receiveBlocks) const;
-
-  // Returns true if we haven't received an RTCP RR for several RTCP
-  // intervals, but only triggers true once.
-  bool RtcpRrTimeout(int64_t rtcp_interval_ms);
-
-  // Returns true if we haven't received an RTCP RR telling the receive side
-  // has not received RTP packets for too long, i.e. extended highest sequence
-  // number hasn't increased for several RTCP intervals. The function only
-  // returns true once until a new RR is received.
-  bool RtcpRrSequenceNumberTimeout(int64_t rtcp_interval_ms);
-
-  std::vector<rtcp::TmmbItem> TmmbrReceived();
-  // Return true if new bandwidth should be set.
-  bool UpdateTmmbrTimers();
-  std::vector<rtcp::TmmbItem> BoundingSet(bool* tmmbr_owner);
-  // Set new bandwidth and notify remote clients about it.
-  void NotifyTmmbrUpdated();
-
-  void RegisterRtcpStatisticsCallback(RtcpStatisticsCallback* callback);
-  RtcpStatisticsCallback* GetRtcpStatisticsCallback();
-
- private:
-  struct PacketInformation;
-  struct TmmbrInformation;
-  struct ReportBlockWithRtt;
-  struct LastFirStatus;
-  // RTCP report blocks mapped by remote SSRC.
-  using ReportBlockInfoMap = std::map<uint32_t, ReportBlockWithRtt>;
-  // RTCP report blocks map mapped by source SSRC.
-  using ReportBlockMap = std::map<uint32_t, ReportBlockInfoMap>;
-
-  bool ParseCompoundPacket(const uint8_t* packet_begin,
-                           const uint8_t* packet_end,
-                           PacketInformation* packet_information);
-
-  void TriggerCallbacksFromRtcpPacket(
-      const PacketInformation& packet_information);
-
-  TmmbrInformation* FindOrCreateTmmbrInfo(uint32_t remote_ssrc)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(rtcp_receiver_lock_);
-  // Update TmmbrInformation (if present) is alive.
-  void UpdateTmmbrRemoteIsAlive(uint32_t remote_ssrc)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(rtcp_receiver_lock_);
-  TmmbrInformation* GetTmmbrInformation(uint32_t remote_ssrc)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(rtcp_receiver_lock_);
-
-  void HandleSenderReport(const rtcp::CommonHeader& rtcp_block,
-                          PacketInformation* packet_information)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(rtcp_receiver_lock_);
-
-  void HandleReceiverReport(const rtcp::CommonHeader& rtcp_block,
-                            PacketInformation* packet_information)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(rtcp_receiver_lock_);
-
-  void HandleReportBlock(const rtcp::ReportBlock& report_block,
-                         PacketInformation* packet_information,
-                         uint32_t remote_ssrc)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(rtcp_receiver_lock_);
-
-  void HandleSdes(const rtcp::CommonHeader& rtcp_block,
-                  PacketInformation* packet_information)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(rtcp_receiver_lock_);
-
-  void HandleXr(const rtcp::CommonHeader& rtcp_block,
-                PacketInformation* packet_information)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(rtcp_receiver_lock_);
-
-  void HandleXrReceiveReferenceTime(uint32_t sender_ssrc,
-                                    const rtcp::Rrtr& rrtr)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(rtcp_receiver_lock_);
-
-  void HandleXrDlrrReportBlock(const rtcp::ReceiveTimeInfo& rti)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(rtcp_receiver_lock_);
-
-  void HandleXrTargetBitrate(uint32_t ssrc,
-                             const rtcp::TargetBitrate& target_bitrate,
-                             PacketInformation* packet_information)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(rtcp_receiver_lock_);
-
-  void HandleNack(const rtcp::CommonHeader& rtcp_block,
-                  PacketInformation* packet_information)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(rtcp_receiver_lock_);
-
-  void HandleBye(const rtcp::CommonHeader& rtcp_block)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(rtcp_receiver_lock_);
-
-  void HandlePli(const rtcp::CommonHeader& rtcp_block,
-                 PacketInformation* packet_information)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(rtcp_receiver_lock_);
-
-  void HandlePsfbApp(const rtcp::CommonHeader& rtcp_block,
-                     PacketInformation* packet_information)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(rtcp_receiver_lock_);
-
-  void HandleTmmbr(const rtcp::CommonHeader& rtcp_block,
-                   PacketInformation* packet_information)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(rtcp_receiver_lock_);
-
-  void HandleTmmbn(const rtcp::CommonHeader& rtcp_block,
-                   PacketInformation* packet_information)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(rtcp_receiver_lock_);
-
-  void HandleSrReq(const rtcp::CommonHeader& rtcp_block,
-                   PacketInformation* packet_information)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(rtcp_receiver_lock_);
-
-  void HandleFir(const rtcp::CommonHeader& rtcp_block,
-                 PacketInformation* packet_information)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(rtcp_receiver_lock_);
-
-  void HandleTransportFeedback(const rtcp::CommonHeader& rtcp_block,
-                               PacketInformation* packet_information)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(rtcp_receiver_lock_);
-
-  Clock* const clock_;
-  const bool receiver_only_;
-  ModuleRtpRtcp* const rtp_rtcp_;
-
-  rtc::CriticalSection feedbacks_lock_;
-  RtcpBandwidthObserver* const rtcp_bandwidth_observer_;
-  RtcpIntraFrameObserver* const rtcp_intra_frame_observer_;
-  TransportFeedbackObserver* const transport_feedback_observer_;
-  VideoBitrateAllocationObserver* const bitrate_allocation_observer_;
-
-  rtc::CriticalSection rtcp_receiver_lock_;
-  uint32_t main_ssrc_ RTC_GUARDED_BY(rtcp_receiver_lock_);
-  uint32_t remote_ssrc_ RTC_GUARDED_BY(rtcp_receiver_lock_);
-  std::set<uint32_t> registered_ssrcs_ RTC_GUARDED_BY(rtcp_receiver_lock_);
-
-  // Received sender report.
-  NtpTime remote_sender_ntp_time_ RTC_GUARDED_BY(rtcp_receiver_lock_);
-  uint32_t remote_sender_rtp_time_ RTC_GUARDED_BY(rtcp_receiver_lock_);
-  // When did we receive the last send report.
-  NtpTime last_received_sr_ntp_ RTC_GUARDED_BY(rtcp_receiver_lock_);
-
-  // Received XR receive time report.
-  rtcp::ReceiveTimeInfo remote_time_info_;
-  // Time when the report was received.
-  NtpTime last_received_xr_ntp_;
-  // Estimated rtt, zero when there is no valid estimate.
-  bool xr_rrtr_status_ RTC_GUARDED_BY(rtcp_receiver_lock_);
-  int64_t xr_rr_rtt_ms_;
-
-  int64_t oldest_tmmbr_info_ms_ RTC_GUARDED_BY(rtcp_receiver_lock_);
-  // Mapped by remote ssrc.
-  std::map<uint32_t, TmmbrInformation> tmmbr_infos_
-      RTC_GUARDED_BY(rtcp_receiver_lock_);
-
-  ReportBlockMap received_report_blocks_ RTC_GUARDED_BY(rtcp_receiver_lock_);
-  std::map<uint32_t, LastFirStatus> last_fir_
-      RTC_GUARDED_BY(rtcp_receiver_lock_);
-  std::map<uint32_t, std::string> received_cnames_
-      RTC_GUARDED_BY(rtcp_receiver_lock_);
-
-  // The last time we received an RTCP RR.
-  int64_t last_received_rr_ms_ RTC_GUARDED_BY(rtcp_receiver_lock_);
-
-  // The time we last received an RTCP RR telling we have successfully
-  // delivered RTP packet to the remote side.
-  int64_t last_increased_sequence_number_ms_;
-
-  RtcpStatisticsCallback* stats_callback_ RTC_GUARDED_BY(feedbacks_lock_);
-
-  RtcpPacketTypeCounterObserver* const packet_type_counter_observer_;
-  RtcpPacketTypeCounter packet_type_counter_;
-
-  RtcpNackStats nack_stats_;
-
-  size_t num_skipped_packets_;
-  int64_t last_skipped_packets_warning_ms_;
-};
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_RECEIVER_H_
diff --git a/modules/rtp_rtcp/source/rtcp_receiver_unittest.cc b/modules/rtp_rtcp/source/rtcp_receiver_unittest.cc
deleted file mode 100644
index 50585e2..0000000
--- a/modules/rtp_rtcp/source/rtcp_receiver_unittest.cc
+++ /dev/null
@@ -1,1260 +0,0 @@
-/*
- *  Copyright (c) 2012 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 <memory>
-
-#include "webrtc/api/array_view.h"
-#include "webrtc/common_types.h"
-#include "webrtc/common_video/include/video_bitrate_allocator.h"
-#include "webrtc/modules/rtp_rtcp/source/byte_io.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/app.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/bye.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/compound_packet.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/extended_jitter_report.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/extended_reports.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/fir.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/nack.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/pli.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/rapid_resync_request.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/receiver_report.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/remb.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/sdes.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/sender_report.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/tmmbr.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/transport_feedback.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_receiver.h"
-#include "webrtc/modules/rtp_rtcp/source/time_util.h"
-#include "webrtc/rtc_base/arraysize.h"
-#include "webrtc/rtc_base/random.h"
-#include "webrtc/system_wrappers/include/ntp_time.h"
-#include "webrtc/test/gmock.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-namespace {
-
-using ::testing::_;
-using ::testing::AllOf;
-using ::testing::ElementsAreArray;
-using ::testing::Field;
-using ::testing::IsEmpty;
-using ::testing::NiceMock;
-using ::testing::Property;
-using ::testing::SizeIs;
-using ::testing::StrEq;
-using ::testing::StrictMock;
-using ::testing::UnorderedElementsAre;
-using rtcp::ReceiveTimeInfo;
-
-class MockRtcpPacketTypeCounterObserver : public RtcpPacketTypeCounterObserver {
- public:
-  MOCK_METHOD2(RtcpPacketTypesCounterUpdated,
-               void(uint32_t, const RtcpPacketTypeCounter&));
-};
-
-class MockRtcpIntraFrameObserver : public RtcpIntraFrameObserver {
- public:
-  MOCK_METHOD1(OnReceivedIntraFrameRequest, void(uint32_t));
-};
-
-class MockRtcpCallbackImpl : public RtcpStatisticsCallback {
- public:
-  MOCK_METHOD2(StatisticsUpdated, void(const RtcpStatistics&, uint32_t));
-  MOCK_METHOD2(CNameChanged, void(const char*, uint32_t));
-};
-
-class MockTransportFeedbackObserver : public TransportFeedbackObserver {
- public:
-  MOCK_METHOD3(AddPacket, void(uint32_t, uint16_t, size_t));
-  MOCK_METHOD4(AddPacket,
-               void(uint32_t, uint16_t, size_t, const PacedPacketInfo&));
-  MOCK_METHOD1(OnTransportFeedback, void(const rtcp::TransportFeedback&));
-  MOCK_CONST_METHOD0(GetTransportFeedbackVector, std::vector<PacketFeedback>());
-};
-
-class MockRtcpBandwidthObserver : public RtcpBandwidthObserver {
- public:
-  MOCK_METHOD1(OnReceivedEstimatedBitrate, void(uint32_t));
-  MOCK_METHOD3(OnReceivedRtcpReceiverReport,
-               void(const ReportBlockList&, int64_t, int64_t));
-};
-
-class MockModuleRtpRtcp : public RTCPReceiver::ModuleRtpRtcp {
- public:
-  MOCK_METHOD1(SetTmmbn, void(std::vector<rtcp::TmmbItem>));
-  MOCK_METHOD0(OnRequestSendReport, void());
-  MOCK_METHOD1(OnReceivedNack, void(const std::vector<uint16_t>&));
-  MOCK_METHOD1(OnReceivedRtcpReportBlocks, void(const ReportBlockList&));
-};
-
-class MockVideoBitrateAllocationObserver
-    : public VideoBitrateAllocationObserver {
- public:
-  MOCK_METHOD1(OnBitrateAllocationUpdated,
-               void(const BitrateAllocation& allocation));
-};
-
-// SSRC of remote peer, that sends rtcp packet to the rtcp receiver under test.
-constexpr uint32_t kSenderSsrc = 0x10203;
-// SSRCs of local peer, that rtcp packet addressed to.
-constexpr uint32_t kReceiverMainSsrc = 0x123456;
-// RtcpReceiver can accept several ssrc, e.g. regular and rtx streams.
-constexpr uint32_t kReceiverExtraSsrc = 0x1234567;
-// SSRCs to ignore (i.e. not configured in RtcpReceiver).
-constexpr uint32_t kNotToUsSsrc = 0x654321;
-constexpr uint32_t kUnknownSenderSsrc = 0x54321;
-
-}  // namespace
-
-class RtcpReceiverTest : public ::testing::Test {
- protected:
-  RtcpReceiverTest()
-      : system_clock_(1335900000),
-        rtcp_receiver_(&system_clock_,
-                       false,
-                       &packet_type_counter_observer_,
-                       &bandwidth_observer_,
-                       &intra_frame_observer_,
-                       &transport_feedback_observer_,
-                       &bitrate_allocation_observer_,
-                       &rtp_rtcp_impl_) {}
-  void SetUp() {
-    std::set<uint32_t> ssrcs = {kReceiverMainSsrc, kReceiverExtraSsrc};
-    rtcp_receiver_.SetSsrcs(kReceiverMainSsrc, ssrcs);
-
-    rtcp_receiver_.SetRemoteSSRC(kSenderSsrc);
-  }
-
-  void InjectRtcpPacket(rtc::ArrayView<const uint8_t> raw) {
-    rtcp_receiver_.IncomingPacket(raw.data(), raw.size());
-  }
-
-  void InjectRtcpPacket(const rtcp::RtcpPacket& packet) {
-    rtc::Buffer raw = packet.Build();
-    rtcp_receiver_.IncomingPacket(raw.data(), raw.size());
-  }
-
-  SimulatedClock system_clock_;
-  // Callbacks to packet_type_counter_observer are frequent but most of the time
-  // are not interesting.
-  NiceMock<MockRtcpPacketTypeCounterObserver> packet_type_counter_observer_;
-  StrictMock<MockRtcpBandwidthObserver> bandwidth_observer_;
-  StrictMock<MockRtcpIntraFrameObserver> intra_frame_observer_;
-  StrictMock<MockTransportFeedbackObserver> transport_feedback_observer_;
-  StrictMock<MockVideoBitrateAllocationObserver> bitrate_allocation_observer_;
-  StrictMock<MockModuleRtpRtcp> rtp_rtcp_impl_;
-
-  RTCPReceiver rtcp_receiver_;
-};
-
-TEST_F(RtcpReceiverTest, BrokenPacketIsIgnored) {
-  const uint8_t bad_packet[] = {0, 0, 0, 0};
-  EXPECT_CALL(packet_type_counter_observer_,
-              RtcpPacketTypesCounterUpdated(_, _))
-      .Times(0);
-  InjectRtcpPacket(bad_packet);
-}
-
-TEST_F(RtcpReceiverTest, InvalidFeedbackPacketIsIgnored) {
-  // Too short feedback packet.
-  const uint8_t bad_packet[] = {0x81, rtcp::Rtpfb::kPacketType, 0, 0};
-
-  // TODO(danilchap): Add expectation RtcpPacketTypesCounterUpdated
-  // is not called once parser would be adjusted to avoid that callback on
-  // semi-valid packets.
-  InjectRtcpPacket(bad_packet);
-}
-
-TEST_F(RtcpReceiverTest, InjectSrPacket) {
-  EXPECT_FALSE(rtcp_receiver_.NTP(nullptr, nullptr, nullptr, nullptr, nullptr));
-
-  int64_t now = system_clock_.TimeInMilliseconds();
-  rtcp::SenderReport sr;
-  sr.SetSenderSsrc(kSenderSsrc);
-
-  EXPECT_CALL(rtp_rtcp_impl_, OnReceivedRtcpReportBlocks(IsEmpty()));
-  EXPECT_CALL(bandwidth_observer_,
-              OnReceivedRtcpReceiverReport(IsEmpty(), _, now));
-  InjectRtcpPacket(sr);
-
-  EXPECT_TRUE(rtcp_receiver_.NTP(nullptr, nullptr, nullptr, nullptr, nullptr));
-}
-
-TEST_F(RtcpReceiverTest, InjectSrPacketFromUnknownSender) {
-  int64_t now = system_clock_.TimeInMilliseconds();
-  rtcp::SenderReport sr;
-  sr.SetSenderSsrc(kUnknownSenderSsrc);
-
-  // The parser will handle report blocks in Sender Report from other than his
-  // expected peer.
-  EXPECT_CALL(rtp_rtcp_impl_, OnReceivedRtcpReportBlocks(_));
-  EXPECT_CALL(bandwidth_observer_, OnReceivedRtcpReceiverReport(_, _, now));
-  InjectRtcpPacket(sr);
-
-  // But will not flag that he's gotten sender information.
-  EXPECT_FALSE(rtcp_receiver_.NTP(nullptr, nullptr, nullptr, nullptr, nullptr));
-}
-
-TEST_F(RtcpReceiverTest, InjectSrPacketCalculatesRTT) {
-  Random r(0x0123456789abcdef);
-  const int64_t kRttMs = r.Rand(1, 9 * 3600 * 1000);
-  const uint32_t kDelayNtp = r.Rand(0, 0x7fffffff);
-  const int64_t kDelayMs = CompactNtpRttToMs(kDelayNtp);
-
-  int64_t rtt_ms = 0;
-  EXPECT_EQ(
-      -1, rtcp_receiver_.RTT(kSenderSsrc, &rtt_ms, nullptr, nullptr, nullptr));
-
-  uint32_t sent_ntp = CompactNtp(system_clock_.CurrentNtpTime());
-  system_clock_.AdvanceTimeMilliseconds(kRttMs + kDelayMs);
-
-  rtcp::SenderReport sr;
-  sr.SetSenderSsrc(kSenderSsrc);
-  rtcp::ReportBlock block;
-  block.SetMediaSsrc(kReceiverMainSsrc);
-  block.SetLastSr(sent_ntp);
-  block.SetDelayLastSr(kDelayNtp);
-  sr.AddReportBlock(block);
-
-  EXPECT_CALL(rtp_rtcp_impl_, OnReceivedRtcpReportBlocks(_));
-  EXPECT_CALL(bandwidth_observer_, OnReceivedRtcpReceiverReport(_, _, _));
-  InjectRtcpPacket(sr);
-
-  EXPECT_EQ(
-      0, rtcp_receiver_.RTT(kSenderSsrc, &rtt_ms, nullptr, nullptr, nullptr));
-  EXPECT_NEAR(kRttMs, rtt_ms, 1);
-}
-
-TEST_F(RtcpReceiverTest, InjectSrPacketCalculatesNegativeRTTAsOne) {
-  Random r(0x0123456789abcdef);
-  const int64_t kRttMs = r.Rand(-3600 * 1000, -1);
-  const uint32_t kDelayNtp = r.Rand(0, 0x7fffffff);
-  const int64_t kDelayMs = CompactNtpRttToMs(kDelayNtp);
-
-  int64_t rtt_ms = 0;
-  EXPECT_EQ(
-      -1, rtcp_receiver_.RTT(kSenderSsrc, &rtt_ms, nullptr, nullptr, nullptr));
-
-  uint32_t sent_ntp = CompactNtp(system_clock_.CurrentNtpTime());
-  system_clock_.AdvanceTimeMilliseconds(kRttMs + kDelayMs);
-
-  rtcp::SenderReport sr;
-  sr.SetSenderSsrc(kSenderSsrc);
-  rtcp::ReportBlock block;
-  block.SetMediaSsrc(kReceiverMainSsrc);
-  block.SetLastSr(sent_ntp);
-  block.SetDelayLastSr(kDelayNtp);
-  sr.AddReportBlock(block);
-
-  EXPECT_CALL(rtp_rtcp_impl_, OnReceivedRtcpReportBlocks(SizeIs(1)));
-  EXPECT_CALL(bandwidth_observer_,
-              OnReceivedRtcpReceiverReport(SizeIs(1), _, _));
-  InjectRtcpPacket(sr);
-
-  EXPECT_EQ(
-      0, rtcp_receiver_.RTT(kSenderSsrc, &rtt_ms, nullptr, nullptr, nullptr));
-  EXPECT_EQ(1, rtt_ms);
-}
-
-TEST_F(RtcpReceiverTest, InjectRrPacket) {
-  int64_t now = system_clock_.TimeInMilliseconds();
-  rtcp::ReceiverReport rr;
-  rr.SetSenderSsrc(kSenderSsrc);
-
-  EXPECT_CALL(rtp_rtcp_impl_, OnReceivedRtcpReportBlocks(IsEmpty()));
-  EXPECT_CALL(bandwidth_observer_,
-              OnReceivedRtcpReceiverReport(IsEmpty(), _, now));
-  InjectRtcpPacket(rr);
-
-  EXPECT_EQ(now, rtcp_receiver_.LastReceivedReceiverReport());
-  std::vector<RTCPReportBlock> report_blocks;
-  rtcp_receiver_.StatisticsReceived(&report_blocks);
-  EXPECT_TRUE(report_blocks.empty());
-}
-
-TEST_F(RtcpReceiverTest, InjectRrPacketWithReportBlockNotToUsIgnored) {
-  int64_t now = system_clock_.TimeInMilliseconds();
-  rtcp::ReportBlock rb;
-  rb.SetMediaSsrc(kNotToUsSsrc);
-  rtcp::ReceiverReport rr;
-  rr.SetSenderSsrc(kSenderSsrc);
-  rr.AddReportBlock(rb);
-
-  EXPECT_CALL(rtp_rtcp_impl_, OnReceivedRtcpReportBlocks(IsEmpty()));
-  EXPECT_CALL(bandwidth_observer_,
-              OnReceivedRtcpReceiverReport(IsEmpty(), _, now));
-  InjectRtcpPacket(rr);
-
-  EXPECT_EQ(now, rtcp_receiver_.LastReceivedReceiverReport());
-  std::vector<RTCPReportBlock> received_blocks;
-  rtcp_receiver_.StatisticsReceived(&received_blocks);
-  EXPECT_TRUE(received_blocks.empty());
-}
-
-TEST_F(RtcpReceiverTest, InjectRrPacketWithOneReportBlock) {
-  int64_t now = system_clock_.TimeInMilliseconds();
-
-  rtcp::ReportBlock rb;
-  rb.SetMediaSsrc(kReceiverMainSsrc);
-  rtcp::ReceiverReport rr;
-  rr.SetSenderSsrc(kSenderSsrc);
-  rr.AddReportBlock(rb);
-
-  EXPECT_CALL(rtp_rtcp_impl_, OnReceivedRtcpReportBlocks(SizeIs(1)));
-  EXPECT_CALL(bandwidth_observer_,
-              OnReceivedRtcpReceiverReport(SizeIs(1), _, now));
-  InjectRtcpPacket(rr);
-
-  EXPECT_EQ(now, rtcp_receiver_.LastReceivedReceiverReport());
-  std::vector<RTCPReportBlock> received_blocks;
-  rtcp_receiver_.StatisticsReceived(&received_blocks);
-  EXPECT_EQ(1u, received_blocks.size());
-}
-
-TEST_F(RtcpReceiverTest, InjectRrPacketWithTwoReportBlocks) {
-  const uint16_t kSequenceNumbers[] = {10, 12423};
-  const uint32_t kCumLost[] = {13, 555};
-  const uint8_t kFracLost[] = {20, 11};
-  int64_t now = system_clock_.TimeInMilliseconds();
-
-  rtcp::ReportBlock rb1;
-  rb1.SetMediaSsrc(kReceiverMainSsrc);
-  rb1.SetExtHighestSeqNum(kSequenceNumbers[0]);
-  rb1.SetFractionLost(10);
-
-  rtcp::ReportBlock rb2;
-  rb2.SetMediaSsrc(kReceiverExtraSsrc);
-  rb2.SetExtHighestSeqNum(kSequenceNumbers[1]);
-  rb2.SetFractionLost(0);
-
-  rtcp::ReceiverReport rr1;
-  rr1.SetSenderSsrc(kSenderSsrc);
-  rr1.AddReportBlock(rb1);
-  rr1.AddReportBlock(rb2);
-
-  EXPECT_CALL(rtp_rtcp_impl_, OnReceivedRtcpReportBlocks(SizeIs(2)));
-  EXPECT_CALL(bandwidth_observer_,
-              OnReceivedRtcpReceiverReport(SizeIs(2), _, now));
-  InjectRtcpPacket(rr1);
-
-  EXPECT_EQ(now, rtcp_receiver_.LastReceivedReceiverReport());
-  std::vector<RTCPReportBlock> received_blocks;
-  rtcp_receiver_.StatisticsReceived(&received_blocks);
-  EXPECT_THAT(received_blocks,
-              UnorderedElementsAre(Field(&RTCPReportBlock::fraction_lost, 0),
-                                   Field(&RTCPReportBlock::fraction_lost, 10)));
-
-  // Insert next receiver report with same ssrc but new values.
-  rtcp::ReportBlock rb3;
-  rb3.SetMediaSsrc(kReceiverMainSsrc);
-  rb3.SetExtHighestSeqNum(kSequenceNumbers[0]);
-  rb3.SetFractionLost(kFracLost[0]);
-  rb3.SetCumulativeLost(kCumLost[0]);
-
-  rtcp::ReportBlock rb4;
-  rb4.SetMediaSsrc(kReceiverExtraSsrc);
-  rb4.SetExtHighestSeqNum(kSequenceNumbers[1]);
-  rb4.SetFractionLost(kFracLost[1]);
-  rb4.SetCumulativeLost(kCumLost[1]);
-
-  rtcp::ReceiverReport rr2;
-  rr2.SetSenderSsrc(kSenderSsrc);
-  rr2.AddReportBlock(rb3);
-  rr2.AddReportBlock(rb4);
-
-  // Advance time to make 1st sent time and 2nd sent time different.
-  system_clock_.AdvanceTimeMilliseconds(500);
-  now = system_clock_.TimeInMilliseconds();
-
-  EXPECT_CALL(rtp_rtcp_impl_, OnReceivedRtcpReportBlocks(SizeIs(2)));
-  EXPECT_CALL(bandwidth_observer_,
-              OnReceivedRtcpReceiverReport(SizeIs(2), _, now));
-  InjectRtcpPacket(rr2);
-
-  received_blocks.clear();
-  rtcp_receiver_.StatisticsReceived(&received_blocks);
-  EXPECT_EQ(2u, received_blocks.size());
-  EXPECT_THAT(
-      received_blocks,
-      UnorderedElementsAre(
-          AllOf(Field(&RTCPReportBlock::source_ssrc, kReceiverMainSsrc),
-                Field(&RTCPReportBlock::fraction_lost, kFracLost[0]),
-                Field(&RTCPReportBlock::packets_lost, kCumLost[0]),
-                Field(&RTCPReportBlock::extended_highest_sequence_number,
-                      kSequenceNumbers[0])),
-          AllOf(Field(&RTCPReportBlock::source_ssrc, kReceiverExtraSsrc),
-                Field(&RTCPReportBlock::fraction_lost, kFracLost[1]),
-                Field(&RTCPReportBlock::packets_lost, kCumLost[1]),
-                Field(&RTCPReportBlock::extended_highest_sequence_number,
-                      kSequenceNumbers[1]))));
-}
-
-TEST_F(RtcpReceiverTest, InjectRrPacketsFromTwoRemoteSsrcs) {
-  const uint32_t kSenderSsrc2 = 0x20304;
-  const uint16_t kSequenceNumbers[] = {10, 12423};
-  const uint32_t kCumLost[] = {13, 555};
-  const uint8_t kFracLost[] = {20, 11};
-
-  rtcp::ReportBlock rb1;
-  rb1.SetMediaSsrc(kReceiverMainSsrc);
-  rb1.SetExtHighestSeqNum(kSequenceNumbers[0]);
-  rb1.SetFractionLost(kFracLost[0]);
-  rb1.SetCumulativeLost(kCumLost[0]);
-  rtcp::ReceiverReport rr1;
-  rr1.SetSenderSsrc(kSenderSsrc);
-  rr1.AddReportBlock(rb1);
-
-  int64_t now = system_clock_.TimeInMilliseconds();
-
-  EXPECT_CALL(rtp_rtcp_impl_, OnReceivedRtcpReportBlocks(SizeIs(1)));
-  EXPECT_CALL(bandwidth_observer_,
-              OnReceivedRtcpReceiverReport(SizeIs(1), _, now));
-  InjectRtcpPacket(rr1);
-
-  EXPECT_EQ(now, rtcp_receiver_.LastReceivedReceiverReport());
-
-  std::vector<RTCPReportBlock> received_blocks;
-  rtcp_receiver_.StatisticsReceived(&received_blocks);
-  EXPECT_EQ(1u, received_blocks.size());
-  EXPECT_EQ(kSenderSsrc, received_blocks[0].sender_ssrc);
-  EXPECT_EQ(kReceiverMainSsrc, received_blocks[0].source_ssrc);
-  EXPECT_EQ(kFracLost[0], received_blocks[0].fraction_lost);
-  EXPECT_EQ(kCumLost[0], received_blocks[0].packets_lost);
-  EXPECT_EQ(kSequenceNumbers[0],
-            received_blocks[0].extended_highest_sequence_number);
-
-  rtcp::ReportBlock rb2;
-  rb2.SetMediaSsrc(kReceiverMainSsrc);
-  rb2.SetExtHighestSeqNum(kSequenceNumbers[1]);
-  rb2.SetFractionLost(kFracLost[1]);
-  rb2.SetCumulativeLost(kCumLost[1]);
-  rtcp::ReceiverReport rr2;
-  rr2.SetSenderSsrc(kSenderSsrc2);
-  rr2.AddReportBlock(rb2);
-
-  EXPECT_CALL(rtp_rtcp_impl_, OnReceivedRtcpReportBlocks(SizeIs(1)));
-  EXPECT_CALL(bandwidth_observer_,
-              OnReceivedRtcpReceiverReport(SizeIs(1), _, now));
-  InjectRtcpPacket(rr2);
-
-  received_blocks.clear();
-  rtcp_receiver_.StatisticsReceived(&received_blocks);
-  ASSERT_EQ(2u, received_blocks.size());
-  EXPECT_THAT(
-      received_blocks,
-      UnorderedElementsAre(
-          AllOf(Field(&RTCPReportBlock::source_ssrc, kReceiverMainSsrc),
-                Field(&RTCPReportBlock::sender_ssrc, kSenderSsrc),
-                Field(&RTCPReportBlock::fraction_lost, kFracLost[0]),
-                Field(&RTCPReportBlock::packets_lost, kCumLost[0]),
-                Field(&RTCPReportBlock::extended_highest_sequence_number,
-                      kSequenceNumbers[0])),
-          AllOf(Field(&RTCPReportBlock::source_ssrc, kReceiverMainSsrc),
-                Field(&RTCPReportBlock::sender_ssrc, kSenderSsrc2),
-                Field(&RTCPReportBlock::fraction_lost, kFracLost[1]),
-                Field(&RTCPReportBlock::packets_lost, kCumLost[1]),
-                Field(&RTCPReportBlock::extended_highest_sequence_number,
-                      kSequenceNumbers[1]))));
-}
-
-TEST_F(RtcpReceiverTest, GetRtt) {
-  const uint32_t kSentCompactNtp = 0x1234;
-  const uint32_t kDelayCompactNtp = 0x222;
-  // No report block received.
-  EXPECT_EQ(
-      -1, rtcp_receiver_.RTT(kSenderSsrc, nullptr, nullptr, nullptr, nullptr));
-
-  rtcp::ReportBlock rb;
-  rb.SetMediaSsrc(kReceiverMainSsrc);
-  rb.SetLastSr(kSentCompactNtp);
-  rb.SetDelayLastSr(kDelayCompactNtp);
-
-  rtcp::ReceiverReport rr;
-  rr.SetSenderSsrc(kSenderSsrc);
-  rr.AddReportBlock(rb);
-  int64_t now = system_clock_.TimeInMilliseconds();
-
-  EXPECT_CALL(rtp_rtcp_impl_, OnReceivedRtcpReportBlocks(_));
-  EXPECT_CALL(bandwidth_observer_, OnReceivedRtcpReceiverReport(_, _, _));
-  InjectRtcpPacket(rr);
-
-  EXPECT_EQ(now, rtcp_receiver_.LastReceivedReceiverReport());
-  EXPECT_EQ(
-      0, rtcp_receiver_.RTT(kSenderSsrc, nullptr, nullptr, nullptr, nullptr));
-}
-
-// Ij packets are ignored.
-TEST_F(RtcpReceiverTest, InjectIjWithNoItem) {
-  rtcp::ExtendedJitterReport ij;
-  InjectRtcpPacket(ij);
-}
-
-// App packets are ignored.
-TEST_F(RtcpReceiverTest, InjectApp) {
-  rtcp::App app;
-  app.SetSubType(30);
-  app.SetName(0x17a177e);
-  const uint8_t kData[] = {'t', 'e', 's', 't', 'd', 'a', 't', 'a'};
-  app.SetData(kData, sizeof(kData));
-
-  InjectRtcpPacket(app);
-}
-
-TEST_F(RtcpReceiverTest, InjectSdesWithOneChunk) {
-  const char kCname[] = "alice@host";
-  MockRtcpCallbackImpl callback;
-  rtcp_receiver_.RegisterRtcpStatisticsCallback(&callback);
-  rtcp::Sdes sdes;
-  sdes.AddCName(kSenderSsrc, kCname);
-
-  EXPECT_CALL(callback, CNameChanged(StrEq(kCname), kSenderSsrc));
-  InjectRtcpPacket(sdes);
-
-  char cName[RTCP_CNAME_SIZE];
-  EXPECT_EQ(0, rtcp_receiver_.CNAME(kSenderSsrc, cName));
-  EXPECT_EQ(0, strncmp(cName, kCname, RTCP_CNAME_SIZE));
-}
-
-TEST_F(RtcpReceiverTest, InjectByePacket_RemovesCname) {
-  const char kCname[] = "alice@host";
-  rtcp::Sdes sdes;
-  sdes.AddCName(kSenderSsrc, kCname);
-
-  InjectRtcpPacket(sdes);
-
-  char cName[RTCP_CNAME_SIZE];
-  EXPECT_EQ(0, rtcp_receiver_.CNAME(kSenderSsrc, cName));
-
-  // Verify that BYE removes the CNAME.
-  rtcp::Bye bye;
-  bye.SetSenderSsrc(kSenderSsrc);
-
-  InjectRtcpPacket(bye);
-
-  EXPECT_EQ(-1, rtcp_receiver_.CNAME(kSenderSsrc, cName));
-}
-
-TEST_F(RtcpReceiverTest, InjectByePacket_RemovesReportBlocks) {
-  rtcp::ReportBlock rb1;
-  rb1.SetMediaSsrc(kReceiverMainSsrc);
-  rtcp::ReportBlock rb2;
-  rb2.SetMediaSsrc(kReceiverExtraSsrc);
-  rtcp::ReceiverReport rr;
-  rr.SetSenderSsrc(kSenderSsrc);
-  rr.AddReportBlock(rb1);
-  rr.AddReportBlock(rb2);
-
-  EXPECT_CALL(rtp_rtcp_impl_, OnReceivedRtcpReportBlocks(_));
-  EXPECT_CALL(bandwidth_observer_, OnReceivedRtcpReceiverReport(_, _, _));
-  InjectRtcpPacket(rr);
-
-  std::vector<RTCPReportBlock> received_blocks;
-  rtcp_receiver_.StatisticsReceived(&received_blocks);
-  EXPECT_EQ(2u, received_blocks.size());
-
-  // Verify that BYE removes the report blocks.
-  rtcp::Bye bye;
-  bye.SetSenderSsrc(kSenderSsrc);
-
-  InjectRtcpPacket(bye);
-
-  received_blocks.clear();
-  rtcp_receiver_.StatisticsReceived(&received_blocks);
-  EXPECT_TRUE(received_blocks.empty());
-
-  // Inject packet again.
-  EXPECT_CALL(rtp_rtcp_impl_, OnReceivedRtcpReportBlocks(_));
-  EXPECT_CALL(bandwidth_observer_, OnReceivedRtcpReceiverReport(_, _, _));
-  InjectRtcpPacket(rr);
-
-  received_blocks.clear();
-  rtcp_receiver_.StatisticsReceived(&received_blocks);
-  EXPECT_EQ(2u, received_blocks.size());
-}
-
-TEST_F(RtcpReceiverTest, InjectPliPacket) {
-  rtcp::Pli pli;
-  pli.SetMediaSsrc(kReceiverMainSsrc);
-
-  EXPECT_CALL(
-      packet_type_counter_observer_,
-      RtcpPacketTypesCounterUpdated(
-          kReceiverMainSsrc, Field(&RtcpPacketTypeCounter::pli_packets, 1)));
-  EXPECT_CALL(intra_frame_observer_,
-              OnReceivedIntraFrameRequest(kReceiverMainSsrc));
-  InjectRtcpPacket(pli);
-}
-
-TEST_F(RtcpReceiverTest, PliPacketNotToUsIgnored) {
-  rtcp::Pli pli;
-  pli.SetMediaSsrc(kNotToUsSsrc);
-
-  EXPECT_CALL(
-      packet_type_counter_observer_,
-      RtcpPacketTypesCounterUpdated(
-          kReceiverMainSsrc, Field(&RtcpPacketTypeCounter::pli_packets, 0)));
-  EXPECT_CALL(intra_frame_observer_, OnReceivedIntraFrameRequest(_)).Times(0);
-  InjectRtcpPacket(pli);
-}
-
-TEST_F(RtcpReceiverTest, InjectFirPacket) {
-  rtcp::Fir fir;
-  fir.AddRequestTo(kReceiverMainSsrc, 13);
-
-  EXPECT_CALL(
-      packet_type_counter_observer_,
-      RtcpPacketTypesCounterUpdated(
-          kReceiverMainSsrc, Field(&RtcpPacketTypeCounter::fir_packets, 1)));
-  EXPECT_CALL(intra_frame_observer_,
-              OnReceivedIntraFrameRequest(kReceiverMainSsrc));
-  InjectRtcpPacket(fir);
-}
-
-TEST_F(RtcpReceiverTest, FirPacketNotToUsIgnored) {
-  rtcp::Fir fir;
-  fir.AddRequestTo(kNotToUsSsrc, 13);
-
-  EXPECT_CALL(intra_frame_observer_, OnReceivedIntraFrameRequest(_)).Times(0);
-  InjectRtcpPacket(fir);
-}
-
-TEST_F(RtcpReceiverTest, ExtendedReportsPacketWithZeroReportBlocksIgnored) {
-  rtcp::ExtendedReports xr;
-  xr.SetSenderSsrc(kSenderSsrc);
-
-  InjectRtcpPacket(xr);
-}
-
-// VOiP reports are ignored.
-TEST_F(RtcpReceiverTest, InjectExtendedReportsVoipPacket) {
-  const uint8_t kLossRate = 123;
-  rtcp::VoipMetric voip_metric;
-  voip_metric.SetMediaSsrc(kReceiverMainSsrc);
-  RTCPVoIPMetric metric;
-  metric.lossRate = kLossRate;
-  voip_metric.SetVoipMetric(metric);
-  rtcp::ExtendedReports xr;
-  xr.SetSenderSsrc(kSenderSsrc);
-  xr.SetVoipMetric(voip_metric);
-
-  InjectRtcpPacket(xr);
-}
-
-TEST_F(RtcpReceiverTest, ExtendedReportsVoipPacketNotToUsIgnored) {
-  rtcp::VoipMetric voip_metric;
-  voip_metric.SetMediaSsrc(kNotToUsSsrc);
-  rtcp::ExtendedReports xr;
-  xr.SetSenderSsrc(kSenderSsrc);
-  xr.SetVoipMetric(voip_metric);
-
-  InjectRtcpPacket(xr);
-}
-
-TEST_F(RtcpReceiverTest, InjectExtendedReportsReceiverReferenceTimePacket) {
-  const NtpTime kNtp(0x10203, 0x40506);
-  rtcp::Rrtr rrtr;
-  rrtr.SetNtp(kNtp);
-  rtcp::ExtendedReports xr;
-  xr.SetSenderSsrc(kSenderSsrc);
-  xr.SetRrtr(rrtr);
-
-  ReceiveTimeInfo rrtime;
-  EXPECT_FALSE(rtcp_receiver_.LastReceivedXrReferenceTimeInfo(&rrtime));
-
-  InjectRtcpPacket(xr);
-
-  EXPECT_TRUE(rtcp_receiver_.LastReceivedXrReferenceTimeInfo(&rrtime));
-  EXPECT_EQ(rrtime.ssrc, kSenderSsrc);
-  EXPECT_EQ(rrtime.last_rr, CompactNtp(kNtp));
-  EXPECT_EQ(0U, rrtime.delay_since_last_rr);
-
-  system_clock_.AdvanceTimeMilliseconds(1500);
-  EXPECT_TRUE(rtcp_receiver_.LastReceivedXrReferenceTimeInfo(&rrtime));
-  EXPECT_NEAR(1500, CompactNtpRttToMs(rrtime.delay_since_last_rr), 1);
-}
-
-TEST_F(RtcpReceiverTest, ExtendedReportsDlrrPacketNotToUsIgnored) {
-  // Allow calculate rtt using dlrr/rrtr, simulating media receiver side.
-  rtcp_receiver_.SetRtcpXrRrtrStatus(true);
-
-  rtcp::ExtendedReports xr;
-  xr.SetSenderSsrc(kSenderSsrc);
-  xr.AddDlrrItem(ReceiveTimeInfo(kNotToUsSsrc, 0x12345, 0x67890));
-
-  InjectRtcpPacket(xr);
-
-  int64_t rtt_ms = 0;
-  EXPECT_FALSE(rtcp_receiver_.GetAndResetXrRrRtt(&rtt_ms));
-}
-
-TEST_F(RtcpReceiverTest, InjectExtendedReportsDlrrPacketWithSubBlock) {
-  const uint32_t kLastRR = 0x12345;
-  const uint32_t kDelay = 0x23456;
-  rtcp_receiver_.SetRtcpXrRrtrStatus(true);
-  int64_t rtt_ms = 0;
-  EXPECT_FALSE(rtcp_receiver_.GetAndResetXrRrRtt(&rtt_ms));
-
-  rtcp::ExtendedReports xr;
-  xr.SetSenderSsrc(kSenderSsrc);
-  xr.AddDlrrItem(ReceiveTimeInfo(kReceiverMainSsrc, kLastRR, kDelay));
-
-  InjectRtcpPacket(xr);
-
-  uint32_t compact_ntp_now = CompactNtp(system_clock_.CurrentNtpTime());
-  EXPECT_TRUE(rtcp_receiver_.GetAndResetXrRrRtt(&rtt_ms));
-  uint32_t rtt_ntp = compact_ntp_now - kDelay - kLastRR;
-  EXPECT_NEAR(CompactNtpRttToMs(rtt_ntp), rtt_ms, 1);
-}
-
-TEST_F(RtcpReceiverTest, InjectExtendedReportsDlrrPacketWithMultipleSubBlocks) {
-  const uint32_t kLastRR = 0x12345;
-  const uint32_t kDelay = 0x56789;
-  rtcp_receiver_.SetRtcpXrRrtrStatus(true);
-
-  rtcp::ExtendedReports xr;
-  xr.SetSenderSsrc(kSenderSsrc);
-  xr.AddDlrrItem(ReceiveTimeInfo(kReceiverMainSsrc, kLastRR, kDelay));
-  xr.AddDlrrItem(ReceiveTimeInfo(kReceiverMainSsrc + 1, 0x12345, 0x67890));
-  xr.AddDlrrItem(ReceiveTimeInfo(kReceiverMainSsrc + 2, 0x12345, 0x67890));
-
-  InjectRtcpPacket(xr);
-
-  uint32_t compact_ntp_now = CompactNtp(system_clock_.CurrentNtpTime());
-  int64_t rtt_ms = 0;
-  EXPECT_TRUE(rtcp_receiver_.GetAndResetXrRrRtt(&rtt_ms));
-  uint32_t rtt_ntp = compact_ntp_now - kDelay - kLastRR;
-  EXPECT_NEAR(CompactNtpRttToMs(rtt_ntp), rtt_ms, 1);
-}
-
-TEST_F(RtcpReceiverTest, InjectExtendedReportsPacketWithMultipleReportBlocks) {
-  rtcp_receiver_.SetRtcpXrRrtrStatus(true);
-
-  rtcp::Rrtr rrtr;
-  rtcp::VoipMetric metric;
-  metric.SetMediaSsrc(kReceiverMainSsrc);
-  rtcp::ExtendedReports xr;
-  xr.SetSenderSsrc(kSenderSsrc);
-  xr.SetRrtr(rrtr);
-  xr.AddDlrrItem(ReceiveTimeInfo(kReceiverMainSsrc, 0x12345, 0x67890));
-  xr.SetVoipMetric(metric);
-
-  InjectRtcpPacket(xr);
-
-  ReceiveTimeInfo rrtime;
-  EXPECT_TRUE(rtcp_receiver_.LastReceivedXrReferenceTimeInfo(&rrtime));
-  int64_t rtt_ms = 0;
-  EXPECT_TRUE(rtcp_receiver_.GetAndResetXrRrRtt(&rtt_ms));
-}
-
-TEST_F(RtcpReceiverTest, InjectExtendedReportsPacketWithUnknownReportBlock) {
-  rtcp_receiver_.SetRtcpXrRrtrStatus(true);
-
-  rtcp::Rrtr rrtr;
-  rtcp::VoipMetric metric;
-  metric.SetMediaSsrc(kReceiverMainSsrc);
-  rtcp::ExtendedReports xr;
-  xr.SetSenderSsrc(kSenderSsrc);
-  xr.SetRrtr(rrtr);
-  xr.AddDlrrItem(ReceiveTimeInfo(kReceiverMainSsrc, 0x12345, 0x67890));
-  xr.SetVoipMetric(metric);
-
-  rtc::Buffer packet = xr.Build();
-  // Modify the DLRR block to have an unsupported block type, from 5 to 6.
-  ASSERT_EQ(5, packet.data()[20]);
-  packet.data()[20] = 6;
-  InjectRtcpPacket(packet);
-
-  // Validate Rrtr was received and processed.
-  ReceiveTimeInfo rrtime;
-  EXPECT_TRUE(rtcp_receiver_.LastReceivedXrReferenceTimeInfo(&rrtime));
-  // Validate Dlrr report wasn't processed.
-  int64_t rtt_ms = 0;
-  EXPECT_FALSE(rtcp_receiver_.GetAndResetXrRrRtt(&rtt_ms));
-}
-
-TEST_F(RtcpReceiverTest, TestExtendedReportsRrRttInitiallyFalse) {
-  rtcp_receiver_.SetRtcpXrRrtrStatus(true);
-
-  int64_t rtt_ms;
-  EXPECT_FALSE(rtcp_receiver_.GetAndResetXrRrRtt(&rtt_ms));
-}
-
-TEST_F(RtcpReceiverTest, RttCalculatedAfterExtendedReportsDlrr) {
-  Random rand(0x0123456789abcdef);
-  const int64_t kRttMs = rand.Rand(1, 9 * 3600 * 1000);
-  const uint32_t kDelayNtp = rand.Rand(0, 0x7fffffff);
-  const int64_t kDelayMs = CompactNtpRttToMs(kDelayNtp);
-  rtcp_receiver_.SetRtcpXrRrtrStatus(true);
-  NtpTime now = system_clock_.CurrentNtpTime();
-  uint32_t sent_ntp = CompactNtp(now);
-  system_clock_.AdvanceTimeMilliseconds(kRttMs + kDelayMs);
-
-  rtcp::ExtendedReports xr;
-  xr.SetSenderSsrc(kSenderSsrc);
-  xr.AddDlrrItem(ReceiveTimeInfo(kReceiverMainSsrc, sent_ntp, kDelayNtp));
-
-  InjectRtcpPacket(xr);
-
-  int64_t rtt_ms = 0;
-  EXPECT_TRUE(rtcp_receiver_.GetAndResetXrRrRtt(&rtt_ms));
-  EXPECT_NEAR(kRttMs, rtt_ms, 1);
-}
-
-TEST_F(RtcpReceiverTest, XrDlrrCalculatesNegativeRttAsOne) {
-  Random rand(0x0123456789abcdef);
-  const int64_t kRttMs = rand.Rand(-3600 * 1000, -1);
-  const uint32_t kDelayNtp = rand.Rand(0, 0x7fffffff);
-  const int64_t kDelayMs = CompactNtpRttToMs(kDelayNtp);
-  NtpTime now = system_clock_.CurrentNtpTime();
-  uint32_t sent_ntp = CompactNtp(now);
-  system_clock_.AdvanceTimeMilliseconds(kRttMs + kDelayMs);
-  rtcp_receiver_.SetRtcpXrRrtrStatus(true);
-
-  rtcp::ExtendedReports xr;
-  xr.SetSenderSsrc(kSenderSsrc);
-  xr.AddDlrrItem(ReceiveTimeInfo(kReceiverMainSsrc, sent_ntp, kDelayNtp));
-
-  InjectRtcpPacket(xr);
-
-  int64_t rtt_ms = 0;
-  EXPECT_TRUE(rtcp_receiver_.GetAndResetXrRrRtt(&rtt_ms));
-  EXPECT_EQ(1, rtt_ms);
-}
-
-TEST_F(RtcpReceiverTest, LastReceivedXrReferenceTimeInfoInitiallyFalse) {
-  ReceiveTimeInfo info;
-  EXPECT_FALSE(rtcp_receiver_.LastReceivedXrReferenceTimeInfo(&info));
-}
-
-TEST_F(RtcpReceiverTest, GetLastReceivedExtendedReportsReferenceTimeInfo) {
-  const NtpTime kNtp(0x10203, 0x40506);
-  const uint32_t kNtpMid = CompactNtp(kNtp);
-
-  rtcp::Rrtr rrtr;
-  rrtr.SetNtp(kNtp);
-  rtcp::ExtendedReports xr;
-  xr.SetSenderSsrc(kSenderSsrc);
-  xr.SetRrtr(rrtr);
-
-  InjectRtcpPacket(xr);
-
-  ReceiveTimeInfo info;
-  EXPECT_TRUE(rtcp_receiver_.LastReceivedXrReferenceTimeInfo(&info));
-  EXPECT_EQ(kSenderSsrc, info.ssrc);
-  EXPECT_EQ(kNtpMid, info.last_rr);
-  EXPECT_EQ(0U, info.delay_since_last_rr);
-
-  system_clock_.AdvanceTimeMilliseconds(1000);
-  EXPECT_TRUE(rtcp_receiver_.LastReceivedXrReferenceTimeInfo(&info));
-  EXPECT_EQ(65536U, info.delay_since_last_rr);
-}
-
-TEST_F(RtcpReceiverTest, ReceiveReportTimeout) {
-  const int64_t kRtcpIntervalMs = 1000;
-  const uint16_t kSequenceNumber = 1234;
-  system_clock_.AdvanceTimeMilliseconds(3 * kRtcpIntervalMs);
-
-  // No RR received, shouldn't trigger a timeout.
-  EXPECT_FALSE(rtcp_receiver_.RtcpRrTimeout(kRtcpIntervalMs));
-  EXPECT_FALSE(rtcp_receiver_.RtcpRrSequenceNumberTimeout(kRtcpIntervalMs));
-
-  // Add a RR and advance the clock just enough to not trigger a timeout.
-  rtcp::ReportBlock rb1;
-  rb1.SetMediaSsrc(kReceiverMainSsrc);
-  rb1.SetExtHighestSeqNum(kSequenceNumber);
-  rtcp::ReceiverReport rr1;
-  rr1.SetSenderSsrc(kSenderSsrc);
-  rr1.AddReportBlock(rb1);
-
-  EXPECT_CALL(rtp_rtcp_impl_, OnReceivedRtcpReportBlocks(_));
-  EXPECT_CALL(bandwidth_observer_, OnReceivedRtcpReceiverReport(_, _, _));
-  InjectRtcpPacket(rr1);
-
-  system_clock_.AdvanceTimeMilliseconds(3 * kRtcpIntervalMs - 1);
-  EXPECT_FALSE(rtcp_receiver_.RtcpRrTimeout(kRtcpIntervalMs));
-  EXPECT_FALSE(rtcp_receiver_.RtcpRrSequenceNumberTimeout(kRtcpIntervalMs));
-
-  // Add a RR with the same extended max as the previous RR to trigger a
-  // sequence number timeout, but not a RR timeout.
-  EXPECT_CALL(rtp_rtcp_impl_, OnReceivedRtcpReportBlocks(_));
-  EXPECT_CALL(bandwidth_observer_, OnReceivedRtcpReceiverReport(_, _, _));
-  InjectRtcpPacket(rr1);
-
-  system_clock_.AdvanceTimeMilliseconds(2);
-  EXPECT_FALSE(rtcp_receiver_.RtcpRrTimeout(kRtcpIntervalMs));
-  EXPECT_TRUE(rtcp_receiver_.RtcpRrSequenceNumberTimeout(kRtcpIntervalMs));
-
-  // Advance clock enough to trigger an RR timeout too.
-  system_clock_.AdvanceTimeMilliseconds(3 * kRtcpIntervalMs);
-  EXPECT_TRUE(rtcp_receiver_.RtcpRrTimeout(kRtcpIntervalMs));
-
-  // We should only get one timeout even though we still haven't received a new
-  // RR.
-  EXPECT_FALSE(rtcp_receiver_.RtcpRrTimeout(kRtcpIntervalMs));
-  EXPECT_FALSE(rtcp_receiver_.RtcpRrSequenceNumberTimeout(kRtcpIntervalMs));
-
-  // Add a new RR with increase sequence number to reset timers.
-  rtcp::ReportBlock rb2;
-  rb2.SetMediaSsrc(kReceiverMainSsrc);
-  rb2.SetExtHighestSeqNum(kSequenceNumber + 1);
-  rtcp::ReceiverReport rr2;
-  rr2.SetSenderSsrc(kSenderSsrc);
-  rr2.AddReportBlock(rb2);
-
-  EXPECT_CALL(rtp_rtcp_impl_, OnReceivedRtcpReportBlocks(_));
-  EXPECT_CALL(bandwidth_observer_, OnReceivedRtcpReceiverReport(_, _, _));
-  InjectRtcpPacket(rr2);
-
-  EXPECT_FALSE(rtcp_receiver_.RtcpRrTimeout(kRtcpIntervalMs));
-  EXPECT_FALSE(rtcp_receiver_.RtcpRrSequenceNumberTimeout(kRtcpIntervalMs));
-
-  // Verify we can get a timeout again once we've received new RR.
-  system_clock_.AdvanceTimeMilliseconds(2 * kRtcpIntervalMs);
-  EXPECT_CALL(rtp_rtcp_impl_, OnReceivedRtcpReportBlocks(_));
-  EXPECT_CALL(bandwidth_observer_, OnReceivedRtcpReceiverReport(_, _, _));
-  InjectRtcpPacket(rr2);
-
-  system_clock_.AdvanceTimeMilliseconds(kRtcpIntervalMs + 1);
-  EXPECT_FALSE(rtcp_receiver_.RtcpRrTimeout(kRtcpIntervalMs));
-  EXPECT_TRUE(rtcp_receiver_.RtcpRrSequenceNumberTimeout(kRtcpIntervalMs));
-
-  system_clock_.AdvanceTimeMilliseconds(2 * kRtcpIntervalMs);
-  EXPECT_TRUE(rtcp_receiver_.RtcpRrTimeout(kRtcpIntervalMs));
-}
-
-TEST_F(RtcpReceiverTest, TmmbrReceivedWithNoIncomingPacket) {
-  EXPECT_EQ(0u, rtcp_receiver_.TmmbrReceived().size());
-}
-
-TEST_F(RtcpReceiverTest, TmmbrPacketAccepted) {
-  const uint32_t kBitrateBps = 30000;
-  rtcp::Tmmbr tmmbr;
-  tmmbr.SetSenderSsrc(kSenderSsrc);
-  tmmbr.AddTmmbr(rtcp::TmmbItem(kReceiverMainSsrc, kBitrateBps, 0));
-  rtcp::SenderReport sr;
-  sr.SetSenderSsrc(kSenderSsrc);
-  rtcp::CompoundPacket compound;
-  compound.Append(&sr);
-  compound.Append(&tmmbr);
-
-  EXPECT_CALL(rtp_rtcp_impl_, OnReceivedRtcpReportBlocks(_));
-  EXPECT_CALL(rtp_rtcp_impl_, SetTmmbn(SizeIs(1)));
-  EXPECT_CALL(bandwidth_observer_, OnReceivedRtcpReceiverReport(_, _, _));
-  EXPECT_CALL(bandwidth_observer_, OnReceivedEstimatedBitrate(kBitrateBps));
-  InjectRtcpPacket(compound);
-
-  std::vector<rtcp::TmmbItem> tmmbr_received = rtcp_receiver_.TmmbrReceived();
-  ASSERT_EQ(1u, tmmbr_received.size());
-  EXPECT_EQ(kBitrateBps, tmmbr_received[0].bitrate_bps());
-  EXPECT_EQ(kSenderSsrc, tmmbr_received[0].ssrc());
-}
-
-TEST_F(RtcpReceiverTest, TmmbrPacketNotForUsIgnored) {
-  const uint32_t kBitrateBps = 30000;
-  rtcp::Tmmbr tmmbr;
-  tmmbr.SetSenderSsrc(kSenderSsrc);
-  tmmbr.AddTmmbr(rtcp::TmmbItem(kNotToUsSsrc, kBitrateBps, 0));
-
-  rtcp::SenderReport sr;
-  sr.SetSenderSsrc(kSenderSsrc);
-  rtcp::CompoundPacket compound;
-  compound.Append(&sr);
-  compound.Append(&tmmbr);
-
-  EXPECT_CALL(rtp_rtcp_impl_, OnReceivedRtcpReportBlocks(_));
-  EXPECT_CALL(bandwidth_observer_, OnReceivedRtcpReceiverReport(_, _, _));
-  EXPECT_CALL(bandwidth_observer_, OnReceivedEstimatedBitrate(_)).Times(0);
-  InjectRtcpPacket(compound);
-
-  EXPECT_EQ(0u, rtcp_receiver_.TmmbrReceived().size());
-}
-
-TEST_F(RtcpReceiverTest, TmmbrPacketZeroRateIgnored) {
-  rtcp::Tmmbr tmmbr;
-  tmmbr.SetSenderSsrc(kSenderSsrc);
-  tmmbr.AddTmmbr(rtcp::TmmbItem(kReceiverMainSsrc, 0, 0));
-  rtcp::SenderReport sr;
-  sr.SetSenderSsrc(kSenderSsrc);
-  rtcp::CompoundPacket compound;
-  compound.Append(&sr);
-  compound.Append(&tmmbr);
-
-  EXPECT_CALL(rtp_rtcp_impl_, OnReceivedRtcpReportBlocks(_));
-  EXPECT_CALL(bandwidth_observer_, OnReceivedRtcpReceiverReport(_, _, _));
-  EXPECT_CALL(bandwidth_observer_, OnReceivedEstimatedBitrate(_)).Times(0);
-  InjectRtcpPacket(compound);
-
-  EXPECT_EQ(0u, rtcp_receiver_.TmmbrReceived().size());
-}
-
-TEST_F(RtcpReceiverTest, TmmbrThreeConstraintsTimeOut) {
-  // Inject 3 packets "from" kSenderSsrc, kSenderSsrc+1, kSenderSsrc+2.
-  // The times of arrival are starttime + 0, starttime + 5 and starttime + 10.
-  for (uint32_t ssrc = kSenderSsrc; ssrc < kSenderSsrc + 3; ++ssrc) {
-    rtcp::Tmmbr tmmbr;
-    tmmbr.SetSenderSsrc(ssrc);
-    tmmbr.AddTmmbr(rtcp::TmmbItem(kReceiverMainSsrc, 30000, 0));
-    rtcp::SenderReport sr;
-    sr.SetSenderSsrc(ssrc);
-    rtcp::CompoundPacket compound;
-    compound.Append(&sr);
-    compound.Append(&tmmbr);
-
-    EXPECT_CALL(rtp_rtcp_impl_, OnReceivedRtcpReportBlocks(_));
-    EXPECT_CALL(rtp_rtcp_impl_, SetTmmbn(_));
-    EXPECT_CALL(bandwidth_observer_, OnReceivedRtcpReceiverReport(_, _, _));
-    EXPECT_CALL(bandwidth_observer_, OnReceivedEstimatedBitrate(_));
-    InjectRtcpPacket(compound);
-
-    // 5 seconds between each packet.
-    system_clock_.AdvanceTimeMilliseconds(5000);
-  }
-  // It is now starttime + 15.
-  std::vector<rtcp::TmmbItem> candidate_set = rtcp_receiver_.TmmbrReceived();
-  ASSERT_EQ(3u, candidate_set.size());
-  EXPECT_EQ(30000U, candidate_set[0].bitrate_bps());
-
-  // We expect the timeout to be 25 seconds. Advance the clock by 12
-  // seconds, timing out the first packet.
-  system_clock_.AdvanceTimeMilliseconds(12000);
-  candidate_set = rtcp_receiver_.TmmbrReceived();
-  ASSERT_EQ(2u, candidate_set.size());
-  EXPECT_EQ(kSenderSsrc + 1, candidate_set[0].ssrc());
-}
-
-TEST_F(RtcpReceiverTest, Callbacks) {
-  MockRtcpCallbackImpl callback;
-  rtcp_receiver_.RegisterRtcpStatisticsCallback(&callback);
-
-  const uint8_t kFractionLoss = 3;
-  const uint32_t kCumulativeLoss = 7;
-  const uint32_t kJitter = 9;
-  const uint16_t kSequenceNumber = 1234;
-
-  // First packet, all numbers should just propagate.
-  rtcp::ReportBlock rb1;
-  rb1.SetMediaSsrc(kReceiverMainSsrc);
-  rb1.SetExtHighestSeqNum(kSequenceNumber);
-  rb1.SetFractionLost(kFractionLoss);
-  rb1.SetCumulativeLost(kCumulativeLoss);
-  rb1.SetJitter(kJitter);
-
-  rtcp::ReceiverReport rr1;
-  rr1.SetSenderSsrc(kSenderSsrc);
-  rr1.AddReportBlock(rb1);
-  EXPECT_CALL(callback,
-              StatisticsUpdated(
-                  AllOf(Field(&RtcpStatistics::fraction_lost, kFractionLoss),
-                        Field(&RtcpStatistics::packets_lost, kCumulativeLoss),
-                        Field(&RtcpStatistics::extended_highest_sequence_number,
-                              kSequenceNumber),
-                        Field(&RtcpStatistics::jitter, kJitter)),
-                  kReceiverMainSsrc));
-  EXPECT_CALL(rtp_rtcp_impl_, OnReceivedRtcpReportBlocks(_));
-  EXPECT_CALL(bandwidth_observer_, OnReceivedRtcpReceiverReport(_, _, _));
-  InjectRtcpPacket(rr1);
-
-  rtcp_receiver_.RegisterRtcpStatisticsCallback(nullptr);
-
-  // Add arbitrary numbers, callback should not be called.
-  rtcp::ReportBlock rb2;
-  rb2.SetMediaSsrc(kReceiverMainSsrc);
-  rb2.SetExtHighestSeqNum(kSequenceNumber + 1);
-  rb2.SetFractionLost(42);
-  rb2.SetCumulativeLost(137);
-  rb2.SetJitter(4711);
-
-  rtcp::ReceiverReport rr2;
-  rr2.SetSenderSsrc(kSenderSsrc);
-  rr2.AddReportBlock(rb2);
-
-  EXPECT_CALL(rtp_rtcp_impl_, OnReceivedRtcpReportBlocks(_));
-  EXPECT_CALL(bandwidth_observer_, OnReceivedRtcpReceiverReport(_, _, _));
-  EXPECT_CALL(callback, StatisticsUpdated(_, _)).Times(0);
-  InjectRtcpPacket(rr2);
-}
-
-TEST_F(RtcpReceiverTest, ReceivesTransportFeedback) {
-  rtcp::TransportFeedback packet;
-  packet.SetMediaSsrc(kReceiverMainSsrc);
-  packet.SetSenderSsrc(kSenderSsrc);
-  packet.SetBase(1, 1000);
-  packet.AddReceivedPacket(1, 1000);
-
-  EXPECT_CALL(
-      transport_feedback_observer_,
-      OnTransportFeedback(AllOf(
-          Property(&rtcp::TransportFeedback::media_ssrc, kReceiverMainSsrc),
-          Property(&rtcp::TransportFeedback::sender_ssrc, kSenderSsrc))));
-  InjectRtcpPacket(packet);
-}
-
-TEST_F(RtcpReceiverTest, ReceivesRemb) {
-  const uint32_t kBitrateBps = 500000;
-  rtcp::Remb remb;
-  remb.SetSenderSsrc(kSenderSsrc);
-  remb.SetBitrateBps(kBitrateBps);
-
-  EXPECT_CALL(bandwidth_observer_, OnReceivedEstimatedBitrate(kBitrateBps));
-  InjectRtcpPacket(remb);
-}
-
-TEST_F(RtcpReceiverTest, HandlesInvalidTransportFeedback) {
-  // Send a compound packet with a TransportFeedback followed by something else.
-  rtcp::TransportFeedback packet;
-  packet.SetMediaSsrc(kReceiverMainSsrc);
-  packet.SetSenderSsrc(kSenderSsrc);
-  packet.SetBase(1, 1000);
-  packet.AddReceivedPacket(1, 1000);
-
-  static uint32_t kBitrateBps = 50000;
-  rtcp::Remb remb;
-  remb.SetSenderSsrc(kSenderSsrc);
-  remb.SetBitrateBps(kBitrateBps);
-  rtcp::CompoundPacket compound;
-  compound.Append(&packet);
-  compound.Append(&remb);
-  rtc::Buffer built_packet = compound.Build();
-
-  // Modify the TransportFeedback packet so that it is invalid.
-  const size_t kStatusCountOffset = 14;
-  ByteWriter<uint16_t>::WriteBigEndian(
-      &built_packet.data()[kStatusCountOffset], 42);
-
-  // Stress no transport feedback is expected.
-  EXPECT_CALL(transport_feedback_observer_, OnTransportFeedback(_)).Times(0);
-  // But remb should be processed and cause a callback
-  EXPECT_CALL(bandwidth_observer_, OnReceivedEstimatedBitrate(kBitrateBps));
-  InjectRtcpPacket(built_packet);
-}
-
-TEST_F(RtcpReceiverTest, Nack) {
-  const uint16_t kNackList1[] = {1, 2, 3, 5};
-  const uint16_t kNackList23[] = {5, 7, 30, 40, 41, 58, 59, 61, 63};
-  const size_t kNackListLength2 = 4;
-  const size_t kNackListLength3 = arraysize(kNackList23) - kNackListLength2;
-  std::set<uint16_t> nack_set;
-  nack_set.insert(std::begin(kNackList1), std::end(kNackList1));
-  nack_set.insert(std::begin(kNackList23), std::end(kNackList23));
-
-  rtcp::Nack nack1;
-  nack1.SetSenderSsrc(kSenderSsrc);
-  nack1.SetMediaSsrc(kReceiverMainSsrc);
-  nack1.SetPacketIds(kNackList1, arraysize(kNackList1));
-
-  EXPECT_CALL(rtp_rtcp_impl_, OnReceivedNack(ElementsAreArray(kNackList1)));
-  EXPECT_CALL(packet_type_counter_observer_,
-              RtcpPacketTypesCounterUpdated(
-                  kReceiverMainSsrc,
-                  AllOf(Field(&RtcpPacketTypeCounter::nack_requests,
-                              arraysize(kNackList1)),
-                        Field(&RtcpPacketTypeCounter::unique_nack_requests,
-                              arraysize(kNackList1)))));
-  InjectRtcpPacket(nack1);
-
-  rtcp::Nack nack2;
-  nack2.SetSenderSsrc(kSenderSsrc);
-  nack2.SetMediaSsrc(kReceiverMainSsrc);
-  nack2.SetPacketIds(kNackList23, kNackListLength2);
-
-  rtcp::Nack nack3;
-  nack3.SetSenderSsrc(kSenderSsrc);
-  nack3.SetMediaSsrc(kReceiverMainSsrc);
-  nack3.SetPacketIds(kNackList23 + kNackListLength2, kNackListLength3);
-
-  rtcp::CompoundPacket two_nacks;
-  two_nacks.Append(&nack2);
-  two_nacks.Append(&nack3);
-
-  EXPECT_CALL(rtp_rtcp_impl_, OnReceivedNack(ElementsAreArray(kNackList23)));
-  EXPECT_CALL(packet_type_counter_observer_,
-              RtcpPacketTypesCounterUpdated(
-                  kReceiverMainSsrc,
-                  AllOf(Field(&RtcpPacketTypeCounter::nack_requests,
-                              arraysize(kNackList1) + arraysize(kNackList23)),
-                        Field(&RtcpPacketTypeCounter::unique_nack_requests,
-                              nack_set.size()))));
-  InjectRtcpPacket(two_nacks);
-}
-
-TEST_F(RtcpReceiverTest, NackNotForUsIgnored) {
-  const uint16_t kNackList1[] = {1, 2, 3, 5};
-  const size_t kNackListLength1 = std::end(kNackList1) - std::begin(kNackList1);
-
-  rtcp::Nack nack;
-  nack.SetSenderSsrc(kSenderSsrc);
-  nack.SetMediaSsrc(kNotToUsSsrc);
-  nack.SetPacketIds(kNackList1, kNackListLength1);
-
-  EXPECT_CALL(packet_type_counter_observer_,
-              RtcpPacketTypesCounterUpdated(
-                  _, Field(&RtcpPacketTypeCounter::nack_requests, 0)));
-  InjectRtcpPacket(nack);
-}
-
-TEST_F(RtcpReceiverTest, ForceSenderReport) {
-  rtcp::RapidResyncRequest rr;
-  rr.SetSenderSsrc(kSenderSsrc);
-  rr.SetMediaSsrc(kReceiverMainSsrc);
-
-  EXPECT_CALL(rtp_rtcp_impl_, OnRequestSendReport());
-  InjectRtcpPacket(rr);
-}
-
-TEST_F(RtcpReceiverTest, ReceivesTargetBitrate) {
-  BitrateAllocation expected_allocation;
-  expected_allocation.SetBitrate(0, 0, 10000);
-  expected_allocation.SetBitrate(0, 1, 20000);
-  expected_allocation.SetBitrate(1, 0, 40000);
-  expected_allocation.SetBitrate(1, 1, 80000);
-
-  rtcp::TargetBitrate bitrate;
-  bitrate.AddTargetBitrate(0, 0, expected_allocation.GetBitrate(0, 0) / 1000);
-  bitrate.AddTargetBitrate(0, 1, expected_allocation.GetBitrate(0, 1) / 1000);
-  bitrate.AddTargetBitrate(1, 0, expected_allocation.GetBitrate(1, 0) / 1000);
-  bitrate.AddTargetBitrate(1, 1, expected_allocation.GetBitrate(1, 1) / 1000);
-
-  rtcp::ExtendedReports xr;
-  xr.SetTargetBitrate(bitrate);
-
-  // Wrong sender ssrc, target bitrate should be discarded.
-  xr.SetSenderSsrc(kSenderSsrc + 1);
-  EXPECT_CALL(bitrate_allocation_observer_,
-              OnBitrateAllocationUpdated(expected_allocation))
-      .Times(0);
-  InjectRtcpPacket(xr);
-
-  // Set correct ssrc, callback should be called once.
-  xr.SetSenderSsrc(kSenderSsrc);
-  EXPECT_CALL(bitrate_allocation_observer_,
-              OnBitrateAllocationUpdated(expected_allocation));
-  InjectRtcpPacket(xr);
-}
-
-TEST_F(RtcpReceiverTest, HandlesIncorrectTargetBitrate) {
-  BitrateAllocation expected_allocation;
-  expected_allocation.SetBitrate(0, 0, 10000);
-
-  rtcp::TargetBitrate bitrate;
-  bitrate.AddTargetBitrate(0, 0, expected_allocation.GetBitrate(0, 0) / 1000);
-  bitrate.AddTargetBitrate(0, kMaxTemporalStreams, 20000);
-  bitrate.AddTargetBitrate(kMaxSpatialLayers, 0, 40000);
-
-  rtcp::ExtendedReports xr;
-  xr.SetTargetBitrate(bitrate);
-  xr.SetSenderSsrc(kSenderSsrc);
-
-  EXPECT_CALL(bitrate_allocation_observer_,
-              OnBitrateAllocationUpdated(expected_allocation));
-  InjectRtcpPacket(xr);
-}
-
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/rtcp_sender.cc b/modules/rtp_rtcp/source/rtcp_sender.cc
deleted file mode 100644
index be78a43..0000000
--- a/modules/rtp_rtcp/source/rtcp_sender.cc
+++ /dev/null
@@ -1,994 +0,0 @@
-/*
- *  Copyright (c) 2012 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/rtp_rtcp/source/rtcp_sender.h"
-
-#include <string.h>  // memcpy
-
-#include <utility>
-
-#include "webrtc/common_types.h"
-#include "webrtc/logging/rtc_event_log/rtc_event_log.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/app.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/bye.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/compound_packet.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/extended_reports.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/fir.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/nack.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/pli.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/receiver_report.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/remb.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/sdes.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/sender_report.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/tmmbn.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/tmmbr.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/transport_feedback.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_rtcp_impl.h"
-#include "webrtc/modules/rtp_rtcp/source/time_util.h"
-#include "webrtc/modules/rtp_rtcp/source/tmmbr_help.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/trace_event.h"
-
-namespace webrtc {
-
-namespace {
-const uint32_t kRtcpAnyExtendedReports =
-    kRtcpXrVoipMetric | kRtcpXrReceiverReferenceTime | kRtcpXrDlrrReportBlock |
-    kRtcpXrTargetBitrate;
-}  // namespace
-
-NACKStringBuilder::NACKStringBuilder()
-    : stream_(""), count_(0), prevNack_(0), consecutive_(false) {}
-
-NACKStringBuilder::~NACKStringBuilder() {}
-
-void NACKStringBuilder::PushNACK(uint16_t nack) {
-  if (count_ == 0) {
-    stream_ << nack;
-  } else if (nack == prevNack_ + 1) {
-    consecutive_ = true;
-  } else {
-    if (consecutive_) {
-      stream_ << "-" << prevNack_;
-      consecutive_ = false;
-    }
-    stream_ << "," << nack;
-  }
-  count_++;
-  prevNack_ = nack;
-}
-
-std::string NACKStringBuilder::GetResult() {
-  if (consecutive_) {
-    stream_ << "-" << prevNack_;
-    consecutive_ = false;
-  }
-  return stream_.str();
-}
-
-RTCPSender::FeedbackState::FeedbackState()
-    : packets_sent(0),
-      media_bytes_sent(0),
-      send_bitrate(0),
-      last_rr_ntp_secs(0),
-      last_rr_ntp_frac(0),
-      remote_sr(0),
-      has_last_xr_rr(false),
-      module(nullptr) {}
-
-class PacketContainer : public rtcp::CompoundPacket,
-                        public rtcp::RtcpPacket::PacketReadyCallback {
- public:
-  PacketContainer(Transport* transport, RtcEventLog* event_log)
-      : transport_(transport), event_log_(event_log), bytes_sent_(0) {}
-  virtual ~PacketContainer() {
-    for (RtcpPacket* packet : appended_packets_)
-      delete packet;
-  }
-
-  void OnPacketReady(uint8_t* data, size_t length) override {
-    if (transport_->SendRtcp(data, length)) {
-      bytes_sent_ += length;
-      if (event_log_) {
-        event_log_->LogRtcpPacket(kOutgoingPacket, data, length);
-      }
-    }
-  }
-
-  size_t SendPackets(size_t max_payload_length) {
-    RTC_DCHECK_LE(max_payload_length, IP_PACKET_SIZE);
-    uint8_t buffer[IP_PACKET_SIZE];
-    BuildExternalBuffer(buffer, max_payload_length, this);
-    return bytes_sent_;
-  }
-
- private:
-  Transport* transport_;
-  RtcEventLog* const event_log_;
-  size_t bytes_sent_;
-
-  RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(PacketContainer);
-};
-
-class RTCPSender::RtcpContext {
- public:
-  RtcpContext(const FeedbackState& feedback_state,
-              int32_t nack_size,
-              const uint16_t* nack_list,
-              NtpTime now)
-      : feedback_state_(feedback_state),
-        nack_size_(nack_size),
-        nack_list_(nack_list),
-        now_(now) {}
-
-  const FeedbackState& feedback_state_;
-  const int32_t nack_size_;
-  const uint16_t* nack_list_;
-  const NtpTime now_;
-};
-
-RTCPSender::RTCPSender(
-    bool audio,
-    Clock* clock,
-    ReceiveStatisticsProvider* receive_statistics,
-    RtcpPacketTypeCounterObserver* packet_type_counter_observer,
-    RtcEventLog* event_log,
-    Transport* outgoing_transport)
-    : audio_(audio),
-      clock_(clock),
-      random_(clock_->TimeInMicroseconds()),
-      method_(RtcpMode::kOff),
-      event_log_(event_log),
-      transport_(outgoing_transport),
-      using_nack_(false),
-      sending_(false),
-      remb_enabled_(false),
-      next_time_to_send_rtcp_(0),
-      timestamp_offset_(0),
-      last_rtp_timestamp_(0),
-      last_frame_capture_time_ms_(-1),
-      ssrc_(0),
-      remote_ssrc_(0),
-      receive_statistics_(receive_statistics),
-
-      sequence_number_fir_(0),
-
-      remb_bitrate_(0),
-
-      tmmbr_send_bps_(0),
-      packet_oh_send_(0),
-      max_packet_size_(IP_PACKET_SIZE - 28),  // IPv4 + UDP by default.
-
-      app_sub_type_(0),
-      app_name_(0),
-      app_data_(nullptr),
-      app_length_(0),
-
-      xr_send_receiver_reference_time_enabled_(false),
-      packet_type_counter_observer_(packet_type_counter_observer) {
-  RTC_DCHECK(transport_ != nullptr);
-
-  builders_[kRtcpSr] = &RTCPSender::BuildSR;
-  builders_[kRtcpRr] = &RTCPSender::BuildRR;
-  builders_[kRtcpSdes] = &RTCPSender::BuildSDES;
-  builders_[kRtcpPli] = &RTCPSender::BuildPLI;
-  builders_[kRtcpFir] = &RTCPSender::BuildFIR;
-  builders_[kRtcpRemb] = &RTCPSender::BuildREMB;
-  builders_[kRtcpBye] = &RTCPSender::BuildBYE;
-  builders_[kRtcpApp] = &RTCPSender::BuildAPP;
-  builders_[kRtcpTmmbr] = &RTCPSender::BuildTMMBR;
-  builders_[kRtcpTmmbn] = &RTCPSender::BuildTMMBN;
-  builders_[kRtcpNack] = &RTCPSender::BuildNACK;
-  builders_[kRtcpAnyExtendedReports] = &RTCPSender::BuildExtendedReports;
-}
-
-RTCPSender::~RTCPSender() {}
-
-RtcpMode RTCPSender::Status() const {
-  rtc::CritScope lock(&critical_section_rtcp_sender_);
-  return method_;
-}
-
-void RTCPSender::SetRTCPStatus(RtcpMode new_method) {
-  rtc::CritScope lock(&critical_section_rtcp_sender_);
-
-  if (method_ == RtcpMode::kOff && new_method != RtcpMode::kOff) {
-    // When switching on, reschedule the next packet
-    next_time_to_send_rtcp_ =
-      clock_->TimeInMilliseconds() +
-      (audio_ ? RTCP_INTERVAL_AUDIO_MS / 2 : RTCP_INTERVAL_VIDEO_MS / 2);
-  }
-  method_ = new_method;
-}
-
-bool RTCPSender::Sending() const {
-  rtc::CritScope lock(&critical_section_rtcp_sender_);
-  return sending_;
-}
-
-int32_t RTCPSender::SetSendingStatus(const FeedbackState& feedback_state,
-                                     bool sending) {
-  bool sendRTCPBye = false;
-  {
-    rtc::CritScope lock(&critical_section_rtcp_sender_);
-
-    if (method_ != RtcpMode::kOff) {
-      if (sending == false && sending_ == true) {
-        // Trigger RTCP bye
-        sendRTCPBye = true;
-      }
-    }
-    sending_ = sending;
-  }
-  if (sendRTCPBye)
-    return SendRTCP(feedback_state, kRtcpBye);
-  return 0;
-}
-
-bool RTCPSender::REMB() const {
-  rtc::CritScope lock(&critical_section_rtcp_sender_);
-  return remb_enabled_;
-}
-
-void RTCPSender::SetREMBStatus(bool enable) {
-  rtc::CritScope lock(&critical_section_rtcp_sender_);
-  remb_enabled_ = enable;
-  if (!enable) {
-    // Stop sending remb each report until it is reenabled and remb data set.
-    ConsumeFlag(kRtcpRemb, true);
-  }
-}
-
-void RTCPSender::SetREMBData(uint32_t bitrate,
-                             const std::vector<uint32_t>& ssrcs) {
-  rtc::CritScope lock(&critical_section_rtcp_sender_);
-  remb_bitrate_ = bitrate;
-  remb_ssrcs_ = ssrcs;
-
-  if (remb_enabled_)
-    SetFlag(kRtcpRemb, false);
-  // Send a REMB immediately if we have a new REMB. The frequency of REMBs is
-  // throttled by the caller.
-  next_time_to_send_rtcp_ = clock_->TimeInMilliseconds();
-}
-
-bool RTCPSender::TMMBR() const {
-  rtc::CritScope lock(&critical_section_rtcp_sender_);
-  return IsFlagPresent(RTCPPacketType::kRtcpTmmbr);
-}
-
-void RTCPSender::SetTMMBRStatus(bool enable) {
-  rtc::CritScope lock(&critical_section_rtcp_sender_);
-  if (enable) {
-    SetFlag(RTCPPacketType::kRtcpTmmbr, false);
-  } else {
-    ConsumeFlag(RTCPPacketType::kRtcpTmmbr, true);
-  }
-}
-
-void RTCPSender::SetMaxRtpPacketSize(size_t max_packet_size) {
-  rtc::CritScope lock(&critical_section_rtcp_sender_);
-  max_packet_size_ = max_packet_size;
-}
-
-void RTCPSender::SetTimestampOffset(uint32_t timestamp_offset) {
-  rtc::CritScope lock(&critical_section_rtcp_sender_);
-  timestamp_offset_ = timestamp_offset;
-}
-
-void RTCPSender::SetLastRtpTime(uint32_t rtp_timestamp,
-                                int64_t capture_time_ms) {
-  rtc::CritScope lock(&critical_section_rtcp_sender_);
-  last_rtp_timestamp_ = rtp_timestamp;
-  if (capture_time_ms < 0) {
-    // We don't currently get a capture time from VoiceEngine.
-    last_frame_capture_time_ms_ = clock_->TimeInMilliseconds();
-  } else {
-    last_frame_capture_time_ms_ = capture_time_ms;
-  }
-}
-
-uint32_t RTCPSender::SSRC() const {
-  rtc::CritScope lock(&critical_section_rtcp_sender_);
-  return ssrc_;
-}
-
-void RTCPSender::SetSSRC(uint32_t ssrc) {
-  rtc::CritScope lock(&critical_section_rtcp_sender_);
-
-  if (ssrc_ != 0) {
-    // not first SetSSRC, probably due to a collision
-    // schedule a new RTCP report
-    // make sure that we send a RTP packet
-    next_time_to_send_rtcp_ = clock_->TimeInMilliseconds() + 100;
-  }
-  ssrc_ = ssrc;
-}
-
-void RTCPSender::SetRemoteSSRC(uint32_t ssrc) {
-  rtc::CritScope lock(&critical_section_rtcp_sender_);
-  remote_ssrc_ = ssrc;
-}
-
-int32_t RTCPSender::SetCNAME(const char* c_name) {
-  if (!c_name)
-    return -1;
-
-  RTC_DCHECK_LT(strlen(c_name), RTCP_CNAME_SIZE);
-  rtc::CritScope lock(&critical_section_rtcp_sender_);
-  cname_ = c_name;
-  return 0;
-}
-
-int32_t RTCPSender::AddMixedCNAME(uint32_t SSRC, const char* c_name) {
-  RTC_DCHECK(c_name);
-  RTC_DCHECK_LT(strlen(c_name), RTCP_CNAME_SIZE);
-  rtc::CritScope lock(&critical_section_rtcp_sender_);
-  // One spot is reserved for ssrc_/cname_.
-  // TODO(danilchap): Add support for more than 30 contributes by sending
-  // several sdes packets.
-  if (csrc_cnames_.size() >= rtcp::Sdes::kMaxNumberOfChunks - 1)
-    return -1;
-
-  csrc_cnames_[SSRC] = c_name;
-  return 0;
-}
-
-int32_t RTCPSender::RemoveMixedCNAME(uint32_t SSRC) {
-  rtc::CritScope lock(&critical_section_rtcp_sender_);
-  auto it = csrc_cnames_.find(SSRC);
-
-  if (it == csrc_cnames_.end())
-    return -1;
-
-  csrc_cnames_.erase(it);
-  return 0;
-}
-
-bool RTCPSender::TimeToSendRTCPReport(bool sendKeyframeBeforeRTP) const {
-  /*
-      For audio we use a fix 5 sec interval
-
-      For video we use 1 sec interval fo a BW smaller than 360 kbit/s,
-          technicaly we break the max 5% RTCP BW for video below 10 kbit/s but
-          that should be extremely rare
-
-
-  From RFC 3550
-
-      MAX RTCP BW is 5% if the session BW
-          A send report is approximately 65 bytes inc CNAME
-          A receiver report is approximately 28 bytes
-
-      The RECOMMENDED value for the reduced minimum in seconds is 360
-        divided by the session bandwidth in kilobits/second.  This minimum
-        is smaller than 5 seconds for bandwidths greater than 72 kb/s.
-
-      If the participant has not yet sent an RTCP packet (the variable
-        initial is true), the constant Tmin is set to 2.5 seconds, else it
-        is set to 5 seconds.
-
-      The interval between RTCP packets is varied randomly over the
-        range [0.5,1.5] times the calculated interval to avoid unintended
-        synchronization of all participants
-
-      if we send
-      If the participant is a sender (we_sent true), the constant C is
-        set to the average RTCP packet size (avg_rtcp_size) divided by 25%
-        of the RTCP bandwidth (rtcp_bw), and the constant n is set to the
-        number of senders.
-
-      if we receive only
-        If we_sent is not true, the constant C is set
-        to the average RTCP packet size divided by 75% of the RTCP
-        bandwidth.  The constant n is set to the number of receivers
-        (members - senders).  If the number of senders is greater than
-        25%, senders and receivers are treated together.
-
-      reconsideration NOT required for peer-to-peer
-        "timer reconsideration" is
-        employed.  This algorithm implements a simple back-off mechanism
-        which causes users to hold back RTCP packet transmission if the
-        group sizes are increasing.
-
-        n = number of members
-        C = avg_size/(rtcpBW/4)
-
-     3. The deterministic calculated interval Td is set to max(Tmin, n*C).
-
-     4. The calculated interval T is set to a number uniformly distributed
-        between 0.5 and 1.5 times the deterministic calculated interval.
-
-     5. The resulting value of T is divided by e-3/2=1.21828 to compensate
-        for the fact that the timer reconsideration algorithm converges to
-        a value of the RTCP bandwidth below the intended average
-  */
-
-  int64_t now = clock_->TimeInMilliseconds();
-
-  rtc::CritScope lock(&critical_section_rtcp_sender_);
-
-  if (method_ == RtcpMode::kOff)
-    return false;
-
-  if (!audio_ && sendKeyframeBeforeRTP) {
-    // for video key-frames we want to send the RTCP before the large key-frame
-    // if we have a 100 ms margin
-    now += RTCP_SEND_BEFORE_KEY_FRAME_MS;
-  }
-
-  if (now >= next_time_to_send_rtcp_) {
-    return true;
-  } else if (now < 0x0000ffff &&
-             next_time_to_send_rtcp_ > 0xffff0000) {  // 65 sec margin
-    // wrap
-    return true;
-  }
-  return false;
-}
-
-std::unique_ptr<rtcp::RtcpPacket> RTCPSender::BuildSR(const RtcpContext& ctx) {
-  // Timestamp shouldn't be estimated before first media frame.
-  RTC_DCHECK_GE(last_frame_capture_time_ms_, 0);
-  // The timestamp of this RTCP packet should be estimated as the timestamp of
-  // the frame being captured at this moment. We are calculating that
-  // timestamp as the last frame's timestamp + the time since the last frame
-  // was captured.
-  uint32_t rtp_rate =
-      (audio_ ? kBogusRtpRateForAudioRtcp : kVideoPayloadTypeFrequency) / 1000;
-  uint32_t rtp_timestamp =
-      timestamp_offset_ + last_rtp_timestamp_ +
-      (clock_->TimeInMilliseconds() - last_frame_capture_time_ms_) * rtp_rate;
-
-  rtcp::SenderReport* report = new rtcp::SenderReport();
-  report->SetSenderSsrc(ssrc_);
-  report->SetNtp(ctx.now_);
-  report->SetRtpTimestamp(rtp_timestamp);
-  report->SetPacketCount(ctx.feedback_state_.packets_sent);
-  report->SetOctetCount(ctx.feedback_state_.media_bytes_sent);
-  report->SetReportBlocks(CreateReportBlocks(ctx.feedback_state_));
-
-  return std::unique_ptr<rtcp::RtcpPacket>(report);
-}
-
-std::unique_ptr<rtcp::RtcpPacket> RTCPSender::BuildSDES(
-    const RtcpContext& ctx) {
-  size_t length_cname = cname_.length();
-  RTC_CHECK_LT(length_cname, RTCP_CNAME_SIZE);
-
-  rtcp::Sdes* sdes = new rtcp::Sdes();
-  sdes->AddCName(ssrc_, cname_);
-
-  for (const auto& it : csrc_cnames_)
-    RTC_CHECK(sdes->AddCName(it.first, it.second));
-
-  return std::unique_ptr<rtcp::RtcpPacket>(sdes);
-}
-
-std::unique_ptr<rtcp::RtcpPacket> RTCPSender::BuildRR(const RtcpContext& ctx) {
-  rtcp::ReceiverReport* report = new rtcp::ReceiverReport();
-  report->SetSenderSsrc(ssrc_);
-  report->SetReportBlocks(CreateReportBlocks(ctx.feedback_state_));
-
-  return std::unique_ptr<rtcp::RtcpPacket>(report);
-}
-
-std::unique_ptr<rtcp::RtcpPacket> RTCPSender::BuildPLI(const RtcpContext& ctx) {
-  rtcp::Pli* pli = new rtcp::Pli();
-  pli->SetSenderSsrc(ssrc_);
-  pli->SetMediaSsrc(remote_ssrc_);
-
-  TRACE_EVENT_INSTANT0(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"),
-                       "RTCPSender::PLI");
-  ++packet_type_counter_.pli_packets;
-  TRACE_COUNTER_ID1(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), "RTCP_PLICount",
-                    ssrc_, packet_type_counter_.pli_packets);
-
-  return std::unique_ptr<rtcp::RtcpPacket>(pli);
-}
-
-std::unique_ptr<rtcp::RtcpPacket> RTCPSender::BuildFIR(const RtcpContext& ctx) {
-  ++sequence_number_fir_;
-
-  rtcp::Fir* fir = new rtcp::Fir();
-  fir->SetSenderSsrc(ssrc_);
-  fir->AddRequestTo(remote_ssrc_, sequence_number_fir_);
-
-  TRACE_EVENT_INSTANT0(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"),
-                       "RTCPSender::FIR");
-  ++packet_type_counter_.fir_packets;
-  TRACE_COUNTER_ID1(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), "RTCP_FIRCount",
-                    ssrc_, packet_type_counter_.fir_packets);
-
-  return std::unique_ptr<rtcp::RtcpPacket>(fir);
-}
-
-std::unique_ptr<rtcp::RtcpPacket> RTCPSender::BuildREMB(
-    const RtcpContext& ctx) {
-  rtcp::Remb* remb = new rtcp::Remb();
-  remb->SetSenderSsrc(ssrc_);
-  remb->SetBitrateBps(remb_bitrate_);
-  remb->SetSsrcs(remb_ssrcs_);
-
-  TRACE_EVENT_INSTANT0(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"),
-                       "RTCPSender::REMB");
-
-  return std::unique_ptr<rtcp::RtcpPacket>(remb);
-}
-
-void RTCPSender::SetTargetBitrate(unsigned int target_bitrate) {
-  rtc::CritScope lock(&critical_section_rtcp_sender_);
-  tmmbr_send_bps_ = target_bitrate;
-}
-
-std::unique_ptr<rtcp::RtcpPacket> RTCPSender::BuildTMMBR(
-    const RtcpContext& ctx) {
-  if (ctx.feedback_state_.module == nullptr)
-    return nullptr;
-  // Before sending the TMMBR check the received TMMBN, only an owner is
-  // allowed to raise the bitrate:
-  // * If the sender is an owner of the TMMBN -> send TMMBR
-  // * If not an owner but the TMMBR would enter the TMMBN -> send TMMBR
-
-  // get current bounding set from RTCP receiver
-  bool tmmbr_owner = false;
-
-  // holding critical_section_rtcp_sender_ while calling RTCPreceiver which
-  // will accuire criticalSectionRTCPReceiver_ is a potental deadlock but
-  // since RTCPreceiver is not doing the reverse we should be fine
-  std::vector<rtcp::TmmbItem> candidates =
-      ctx.feedback_state_.module->BoundingSet(&tmmbr_owner);
-
-  if (!candidates.empty()) {
-    for (const auto& candidate : candidates) {
-      if (candidate.bitrate_bps() == tmmbr_send_bps_ &&
-          candidate.packet_overhead() == packet_oh_send_) {
-        // Do not send the same tuple.
-        return nullptr;
-      }
-    }
-    if (!tmmbr_owner) {
-      // Use received bounding set as candidate set.
-      // Add current tuple.
-      candidates.emplace_back(ssrc_, tmmbr_send_bps_, packet_oh_send_);
-
-      // Find bounding set.
-      std::vector<rtcp::TmmbItem> bounding =
-          TMMBRHelp::FindBoundingSet(std::move(candidates));
-      tmmbr_owner = TMMBRHelp::IsOwner(bounding, ssrc_);
-      if (!tmmbr_owner) {
-        // Did not enter bounding set, no meaning to send this request.
-        return nullptr;
-      }
-    }
-  }
-
-  if (!tmmbr_send_bps_)
-    return nullptr;
-
-  rtcp::Tmmbr* tmmbr = new rtcp::Tmmbr();
-  tmmbr->SetSenderSsrc(ssrc_);
-  rtcp::TmmbItem request;
-  request.set_ssrc(remote_ssrc_);
-  request.set_bitrate_bps(tmmbr_send_bps_);
-  request.set_packet_overhead(packet_oh_send_);
-  tmmbr->AddTmmbr(request);
-
-  return std::unique_ptr<rtcp::RtcpPacket>(tmmbr);
-}
-
-std::unique_ptr<rtcp::RtcpPacket> RTCPSender::BuildTMMBN(
-    const RtcpContext& ctx) {
-  rtcp::Tmmbn* tmmbn = new rtcp::Tmmbn();
-  tmmbn->SetSenderSsrc(ssrc_);
-  for (const rtcp::TmmbItem& tmmbr : tmmbn_to_send_) {
-    if (tmmbr.bitrate_bps() > 0) {
-      tmmbn->AddTmmbr(tmmbr);
-    }
-  }
-
-  return std::unique_ptr<rtcp::RtcpPacket>(tmmbn);
-}
-
-std::unique_ptr<rtcp::RtcpPacket> RTCPSender::BuildAPP(const RtcpContext& ctx) {
-  rtcp::App* app = new rtcp::App();
-  app->SetSsrc(ssrc_);
-  app->SetSubType(app_sub_type_);
-  app->SetName(app_name_);
-  app->SetData(app_data_.get(), app_length_);
-
-  return std::unique_ptr<rtcp::RtcpPacket>(app);
-}
-
-std::unique_ptr<rtcp::RtcpPacket> RTCPSender::BuildNACK(
-    const RtcpContext& ctx) {
-  rtcp::Nack* nack = new rtcp::Nack();
-  nack->SetSenderSsrc(ssrc_);
-  nack->SetMediaSsrc(remote_ssrc_);
-  nack->SetPacketIds(ctx.nack_list_, ctx.nack_size_);
-
-  // Report stats.
-  NACKStringBuilder stringBuilder;
-  for (int idx = 0; idx < ctx.nack_size_; ++idx) {
-    stringBuilder.PushNACK(ctx.nack_list_[idx]);
-    nack_stats_.ReportRequest(ctx.nack_list_[idx]);
-  }
-  packet_type_counter_.nack_requests = nack_stats_.requests();
-  packet_type_counter_.unique_nack_requests = nack_stats_.unique_requests();
-
-  TRACE_EVENT_INSTANT1(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"),
-                       "RTCPSender::NACK", "nacks",
-                       TRACE_STR_COPY(stringBuilder.GetResult().c_str()));
-  ++packet_type_counter_.nack_packets;
-  TRACE_COUNTER_ID1(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), "RTCP_NACKCount",
-                    ssrc_, packet_type_counter_.nack_packets);
-
-  return std::unique_ptr<rtcp::RtcpPacket>(nack);
-}
-
-std::unique_ptr<rtcp::RtcpPacket> RTCPSender::BuildBYE(const RtcpContext& ctx) {
-  rtcp::Bye* bye = new rtcp::Bye();
-  bye->SetSenderSsrc(ssrc_);
-  bye->SetCsrcs(csrcs_);
-
-  return std::unique_ptr<rtcp::RtcpPacket>(bye);
-}
-
-std::unique_ptr<rtcp::RtcpPacket> RTCPSender::BuildExtendedReports(
-    const RtcpContext& ctx) {
-  std::unique_ptr<rtcp::ExtendedReports> xr(new rtcp::ExtendedReports());
-  xr->SetSenderSsrc(ssrc_);
-
-  if (!sending_ && xr_send_receiver_reference_time_enabled_) {
-    rtcp::Rrtr rrtr;
-    rrtr.SetNtp(ctx.now_);
-    xr->SetRrtr(rrtr);
-  }
-
-  if (ctx.feedback_state_.has_last_xr_rr) {
-    xr->AddDlrrItem(ctx.feedback_state_.last_xr_rr);
-  }
-
-  if (video_bitrate_allocation_) {
-    rtcp::TargetBitrate target_bitrate;
-
-    for (int sl = 0; sl < kMaxSpatialLayers; ++sl) {
-      for (int tl = 0; tl < kMaxTemporalStreams; ++tl) {
-        uint32_t layer_bitrate_bps =
-            video_bitrate_allocation_->GetBitrate(sl, tl);
-        if (layer_bitrate_bps > 0)
-          target_bitrate.AddTargetBitrate(sl, tl, layer_bitrate_bps / 1000);
-      }
-    }
-
-    xr->SetTargetBitrate(target_bitrate);
-    video_bitrate_allocation_.reset();
-  }
-
-  if (xr_voip_metric_) {
-    rtcp::VoipMetric voip;
-    voip.SetMediaSsrc(remote_ssrc_);
-    voip.SetVoipMetric(*xr_voip_metric_);
-    xr_voip_metric_.reset();
-
-    xr->SetVoipMetric(voip);
-  }
-
-  return std::move(xr);
-}
-
-int32_t RTCPSender::SendRTCP(const FeedbackState& feedback_state,
-                             RTCPPacketType packetType,
-                             int32_t nack_size,
-                             const uint16_t* nack_list) {
-  return SendCompoundRTCP(
-      feedback_state, std::set<RTCPPacketType>(&packetType, &packetType + 1),
-      nack_size, nack_list);
-}
-
-int32_t RTCPSender::SendCompoundRTCP(
-    const FeedbackState& feedback_state,
-    const std::set<RTCPPacketType>& packet_types,
-    int32_t nack_size,
-    const uint16_t* nack_list) {
-  PacketContainer container(transport_, event_log_);
-  size_t max_packet_size;
-
-  {
-    rtc::CritScope lock(&critical_section_rtcp_sender_);
-    if (method_ == RtcpMode::kOff) {
-      LOG(LS_WARNING) << "Can't send rtcp if it is disabled.";
-      return -1;
-    }
-    // Add all flags as volatile. Non volatile entries will not be overwritten.
-    // All new volatile flags added will be consumed by the end of this call.
-    SetFlags(packet_types, true);
-
-    // Prevent sending streams to send SR before any media has been sent.
-    const bool can_calculate_rtp_timestamp = (last_frame_capture_time_ms_ >= 0);
-    if (!can_calculate_rtp_timestamp) {
-      bool consumed_sr_flag = ConsumeFlag(kRtcpSr);
-      bool consumed_report_flag = sending_ && ConsumeFlag(kRtcpReport);
-      bool sender_report = consumed_report_flag || consumed_sr_flag;
-      if (sender_report && AllVolatileFlagsConsumed()) {
-        // This call was for Sender Report and nothing else.
-        return 0;
-      }
-      if (sending_ && method_ == RtcpMode::kCompound) {
-        // Not allowed to send any RTCP packet without sender report.
-        return -1;
-      }
-    }
-
-    if (packet_type_counter_.first_packet_time_ms == -1)
-      packet_type_counter_.first_packet_time_ms = clock_->TimeInMilliseconds();
-
-    // We need to send our NTP even if we haven't received any reports.
-    RtcpContext context(feedback_state, nack_size, nack_list,
-                        clock_->CurrentNtpTime());
-
-    PrepareReport(feedback_state);
-
-    std::unique_ptr<rtcp::RtcpPacket> packet_bye;
-
-    auto it = report_flags_.begin();
-    while (it != report_flags_.end()) {
-      auto builder_it = builders_.find(it->type);
-      RTC_DCHECK(builder_it != builders_.end())
-          << "Could not find builder for packet type " << it->type;
-      if (it->is_volatile) {
-        report_flags_.erase(it++);
-      } else {
-        ++it;
-      }
-
-      BuilderFunc func = builder_it->second;
-      std::unique_ptr<rtcp::RtcpPacket> packet = (this->*func)(context);
-      if (packet.get() == nullptr)
-        return -1;
-      // If there is a BYE, don't append now - save it and append it
-      // at the end later.
-      if (builder_it->first == kRtcpBye) {
-        packet_bye = std::move(packet);
-      } else {
-        container.Append(packet.release());
-      }
-    }
-
-    // Append the BYE now at the end
-    if (packet_bye) {
-      container.Append(packet_bye.release());
-    }
-
-    if (packet_type_counter_observer_ != nullptr) {
-      packet_type_counter_observer_->RtcpPacketTypesCounterUpdated(
-          remote_ssrc_, packet_type_counter_);
-    }
-
-    RTC_DCHECK(AllVolatileFlagsConsumed());
-    max_packet_size = max_packet_size_;
-  }
-
-  size_t bytes_sent = container.SendPackets(max_packet_size);
-  return bytes_sent == 0 ? -1 : 0;
-}
-
-void RTCPSender::PrepareReport(const FeedbackState& feedback_state) {
-  bool generate_report;
-  if (IsFlagPresent(kRtcpSr) || IsFlagPresent(kRtcpRr)) {
-    // Report type already explicitly set, don't automatically populate.
-    generate_report = true;
-    RTC_DCHECK(ConsumeFlag(kRtcpReport) == false);
-  } else {
-    generate_report =
-        (ConsumeFlag(kRtcpReport) && method_ == RtcpMode::kReducedSize) ||
-        method_ == RtcpMode::kCompound;
-    if (generate_report)
-      SetFlag(sending_ ? kRtcpSr : kRtcpRr, true);
-  }
-
-  if (IsFlagPresent(kRtcpSr) || (IsFlagPresent(kRtcpRr) && !cname_.empty()))
-    SetFlag(kRtcpSdes, true);
-
-  if (generate_report) {
-    if ((!sending_ && xr_send_receiver_reference_time_enabled_) ||
-        feedback_state.has_last_xr_rr || video_bitrate_allocation_) {
-      SetFlag(kRtcpAnyExtendedReports, true);
-    }
-
-    // generate next time to send an RTCP report
-    uint32_t minIntervalMs = RTCP_INTERVAL_AUDIO_MS;
-
-    if (!audio_) {
-      if (sending_) {
-        // Calculate bandwidth for video; 360 / send bandwidth in kbit/s.
-        uint32_t send_bitrate_kbit = feedback_state.send_bitrate / 1000;
-        if (send_bitrate_kbit != 0)
-          minIntervalMs = 360000 / send_bitrate_kbit;
-      }
-      if (minIntervalMs > RTCP_INTERVAL_VIDEO_MS)
-        minIntervalMs = RTCP_INTERVAL_VIDEO_MS;
-    }
-    // The interval between RTCP packets is varied randomly over the
-    // range [1/2,3/2] times the calculated interval.
-    uint32_t timeToNext =
-        random_.Rand(minIntervalMs * 1 / 2, minIntervalMs * 3 / 2);
-    next_time_to_send_rtcp_ = clock_->TimeInMilliseconds() + timeToNext;
-
-    // RtcpSender expected to be used for sending either just sender reports
-    // or just receiver reports.
-    RTC_DCHECK(!(IsFlagPresent(kRtcpSr) && IsFlagPresent(kRtcpRr)));
-  }
-}
-
-std::vector<rtcp::ReportBlock> RTCPSender::CreateReportBlocks(
-    const FeedbackState& feedback_state) {
-  std::vector<rtcp::ReportBlock> result;
-  if (!receive_statistics_)
-    return result;
-
-  // TODO(danilchap): Support sending more than |RTCP_MAX_REPORT_BLOCKS| per
-  // compound rtcp packet when single rtcp module is used for multiple media
-  // streams.
-  result = receive_statistics_->RtcpReportBlocks(RTCP_MAX_REPORT_BLOCKS);
-
-  if (!result.empty() && ((feedback_state.last_rr_ntp_secs != 0) ||
-                          (feedback_state.last_rr_ntp_frac != 0))) {
-    // Get our NTP as late as possible to avoid a race.
-    uint32_t now = CompactNtp(clock_->CurrentNtpTime());
-
-    uint32_t receive_time = feedback_state.last_rr_ntp_secs & 0x0000FFFF;
-    receive_time <<= 16;
-    receive_time += (feedback_state.last_rr_ntp_frac & 0xffff0000) >> 16;
-
-    uint32_t delay_since_last_sr = now - receive_time;
-    // TODO(danilchap): Instead of setting same value on all report blocks,
-    // set only when media_ssrc match sender ssrc of the sender report
-    // remote times were taken from.
-    for (auto& report_block : result) {
-      report_block.SetLastSr(feedback_state.remote_sr);
-      report_block.SetDelayLastSr(delay_since_last_sr);
-    }
-  }
-  return result;
-}
-
-void RTCPSender::SetCsrcs(const std::vector<uint32_t>& csrcs) {
-  RTC_DCHECK_LE(csrcs.size(), kRtpCsrcSize);
-  rtc::CritScope lock(&critical_section_rtcp_sender_);
-  csrcs_ = csrcs;
-}
-
-int32_t RTCPSender::SetApplicationSpecificData(uint8_t subType,
-                                               uint32_t name,
-                                               const uint8_t* data,
-                                               uint16_t length) {
-  if (length % 4 != 0) {
-    LOG(LS_ERROR) << "Failed to SetApplicationSpecificData.";
-    return -1;
-  }
-  rtc::CritScope lock(&critical_section_rtcp_sender_);
-
-  SetFlag(kRtcpApp, true);
-  app_sub_type_ = subType;
-  app_name_ = name;
-  app_data_.reset(new uint8_t[length]);
-  app_length_ = length;
-  memcpy(app_data_.get(), data, length);
-  return 0;
-}
-
-// TODO(sprang): Remove support for VoIP metrics? (Not used in receiver.)
-int32_t RTCPSender::SetRTCPVoIPMetrics(const RTCPVoIPMetric* VoIPMetric) {
-  rtc::CritScope lock(&critical_section_rtcp_sender_);
-  xr_voip_metric_.emplace(*VoIPMetric);
-
-  SetFlag(kRtcpAnyExtendedReports, true);
-  return 0;
-}
-
-void RTCPSender::SendRtcpXrReceiverReferenceTime(bool enable) {
-  rtc::CritScope lock(&critical_section_rtcp_sender_);
-  xr_send_receiver_reference_time_enabled_ = enable;
-}
-
-bool RTCPSender::RtcpXrReceiverReferenceTime() const {
-  rtc::CritScope lock(&critical_section_rtcp_sender_);
-  return xr_send_receiver_reference_time_enabled_;
-}
-
-void RTCPSender::SetTmmbn(std::vector<rtcp::TmmbItem> bounding_set) {
-  rtc::CritScope lock(&critical_section_rtcp_sender_);
-  tmmbn_to_send_ = std::move(bounding_set);
-  SetFlag(kRtcpTmmbn, true);
-}
-
-void RTCPSender::SetFlag(uint32_t type, bool is_volatile) {
-  if (type & kRtcpAnyExtendedReports) {
-    report_flags_.insert(ReportFlag(kRtcpAnyExtendedReports, is_volatile));
-  } else {
-    report_flags_.insert(ReportFlag(type, is_volatile));
-  }
-}
-
-void RTCPSender::SetFlags(const std::set<RTCPPacketType>& types,
-                          bool is_volatile) {
-  for (RTCPPacketType type : types)
-    SetFlag(type, is_volatile);
-}
-
-bool RTCPSender::IsFlagPresent(uint32_t type) const {
-  return report_flags_.find(ReportFlag(type, false)) != report_flags_.end();
-}
-
-bool RTCPSender::ConsumeFlag(uint32_t type, bool forced) {
-  auto it = report_flags_.find(ReportFlag(type, false));
-  if (it == report_flags_.end())
-    return false;
-  if (it->is_volatile || forced)
-    report_flags_.erase((it));
-  return true;
-}
-
-bool RTCPSender::AllVolatileFlagsConsumed() const {
-  for (const ReportFlag& flag : report_flags_) {
-    if (flag.is_volatile)
-      return false;
-  }
-  return true;
-}
-
-void RTCPSender::SetVideoBitrateAllocation(const BitrateAllocation& bitrate) {
-  rtc::CritScope lock(&critical_section_rtcp_sender_);
-  video_bitrate_allocation_.emplace(bitrate);
-  SetFlag(kRtcpAnyExtendedReports, true);
-}
-
-bool RTCPSender::SendFeedbackPacket(const rtcp::TransportFeedback& packet) {
-  class Sender : public rtcp::RtcpPacket::PacketReadyCallback {
-   public:
-    Sender(Transport* transport, RtcEventLog* event_log)
-        : transport_(transport), event_log_(event_log), send_failure_(false) {}
-
-    void OnPacketReady(uint8_t* data, size_t length) override {
-      if (transport_->SendRtcp(data, length)) {
-        if (event_log_) {
-          event_log_->LogRtcpPacket(kOutgoingPacket, data, length);
-        }
-      } else {
-        send_failure_ = true;
-      }
-    }
-
-    Transport* const transport_;
-    RtcEventLog* const event_log_;
-    bool send_failure_;
-    // TODO(terelius): We would like to
-    // RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(Sender);
-    // but we can't because of an incorrect warning (C4822) in MVS 2013.
-  } sender(transport_, event_log_);
-
-  size_t max_packet_size;
-  {
-    rtc::CritScope lock(&critical_section_rtcp_sender_);
-    if (method_ == RtcpMode::kOff)
-      return false;
-    max_packet_size = max_packet_size_;
-  }
-
-  RTC_DCHECK_LE(max_packet_size, IP_PACKET_SIZE);
-  uint8_t buffer[IP_PACKET_SIZE];
-  return packet.BuildExternalBuffer(buffer, max_packet_size, &sender) &&
-         !sender.send_failure_;
-}
-
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/rtcp_sender.h b/modules/rtp_rtcp/source/rtcp_sender.h
deleted file mode 100644
index d581a04..0000000
--- a/modules/rtp_rtcp/source/rtcp_sender.h
+++ /dev/null
@@ -1,292 +0,0 @@
-/*
- *  Copyright (c) 2012 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_RTP_RTCP_SOURCE_RTCP_SENDER_H_
-#define WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_SENDER_H_
-
-#include <map>
-#include <memory>
-#include <set>
-#include <sstream>
-#include <string>
-#include <vector>
-
-#include "webrtc/api/call/transport.h"
-#include "webrtc/api/optional.h"
-#include "webrtc/modules/remote_bitrate_estimator/include/bwe_defines.h"
-#include "webrtc/modules/remote_bitrate_estimator/include/remote_bitrate_estimator.h"
-#include "webrtc/modules/rtp_rtcp/include/receive_statistics.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_nack_stats.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/dlrr.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/report_block.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/tmmb_item.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/random.h"
-#include "webrtc/rtc_base/thread_annotations.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-class ModuleRtpRtcpImpl;
-class RtcEventLog;
-
-class NACKStringBuilder {
- public:
-  NACKStringBuilder();
-  ~NACKStringBuilder();
-
-  void PushNACK(uint16_t nack);
-  std::string GetResult();
-
- private:
-  std::ostringstream stream_;
-  int count_;
-  uint16_t prevNack_;
-  bool consecutive_;
-};
-
-class RTCPSender {
- public:
-  struct FeedbackState {
-    FeedbackState();
-
-    uint32_t packets_sent;
-    size_t media_bytes_sent;
-    uint32_t send_bitrate;
-
-    uint32_t last_rr_ntp_secs;
-    uint32_t last_rr_ntp_frac;
-    uint32_t remote_sr;
-
-    bool has_last_xr_rr;
-    rtcp::ReceiveTimeInfo last_xr_rr;
-
-    // Used when generating TMMBR.
-    ModuleRtpRtcpImpl* module;
-  };
-
-  RTCPSender(bool audio,
-             Clock* clock,
-             ReceiveStatisticsProvider* receive_statistics,
-             RtcpPacketTypeCounterObserver* packet_type_counter_observer,
-             RtcEventLog* event_log,
-             Transport* outgoing_transport);
-  virtual ~RTCPSender();
-
-  RtcpMode Status() const;
-  void SetRTCPStatus(RtcpMode method);
-
-  bool Sending() const;
-  int32_t SetSendingStatus(const FeedbackState& feedback_state,
-                           bool enabled);  // combine the functions
-
-  int32_t SetNackStatus(bool enable);
-
-  void SetTimestampOffset(uint32_t timestamp_offset);
-
-  void SetLastRtpTime(uint32_t rtp_timestamp, int64_t capture_time_ms);
-
-  uint32_t SSRC() const;
-
-  void SetSSRC(uint32_t ssrc);
-
-  void SetRemoteSSRC(uint32_t ssrc);
-
-  int32_t SetCNAME(const char* cName);
-
-  int32_t AddMixedCNAME(uint32_t SSRC, const char* c_name);
-
-  int32_t RemoveMixedCNAME(uint32_t SSRC);
-
-  bool TimeToSendRTCPReport(bool sendKeyframeBeforeRTP = false) const;
-
-  int32_t SendRTCP(const FeedbackState& feedback_state,
-                   RTCPPacketType packetType,
-                   int32_t nackSize = 0,
-                   const uint16_t* nackList = 0);
-
-  int32_t SendCompoundRTCP(const FeedbackState& feedback_state,
-                           const std::set<RTCPPacketType>& packetTypes,
-                           int32_t nackSize = 0,
-                           const uint16_t* nackList = 0);
-
-  bool REMB() const;
-
-  void SetREMBStatus(bool enable);
-
-  void SetREMBData(uint32_t bitrate, const std::vector<uint32_t>& ssrcs);
-
-  bool TMMBR() const;
-
-  void SetTMMBRStatus(bool enable);
-
-  void SetMaxRtpPacketSize(size_t max_packet_size);
-
-  void SetTmmbn(std::vector<rtcp::TmmbItem> bounding_set);
-
-  int32_t SetApplicationSpecificData(uint8_t subType,
-                                     uint32_t name,
-                                     const uint8_t* data,
-                                     uint16_t length);
-  int32_t SetRTCPVoIPMetrics(const RTCPVoIPMetric* VoIPMetric);
-
-  void SendRtcpXrReceiverReferenceTime(bool enable);
-
-  bool RtcpXrReceiverReferenceTime() const;
-
-  void SetCsrcs(const std::vector<uint32_t>& csrcs);
-
-  void SetTargetBitrate(unsigned int target_bitrate);
-  void SetVideoBitrateAllocation(const BitrateAllocation& bitrate);
-  bool SendFeedbackPacket(const rtcp::TransportFeedback& packet);
-
- private:
-  class RtcpContext;
-
-  // Determine which RTCP messages should be sent and setup flags.
-  void PrepareReport(const FeedbackState& feedback_state)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(critical_section_rtcp_sender_);
-
-  std::vector<rtcp::ReportBlock> CreateReportBlocks(
-      const FeedbackState& feedback_state)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(critical_section_rtcp_sender_);
-
-  std::unique_ptr<rtcp::RtcpPacket> BuildSR(const RtcpContext& context)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(critical_section_rtcp_sender_);
-  std::unique_ptr<rtcp::RtcpPacket> BuildRR(const RtcpContext& context)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(critical_section_rtcp_sender_);
-  std::unique_ptr<rtcp::RtcpPacket> BuildSDES(const RtcpContext& context)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(critical_section_rtcp_sender_);
-  std::unique_ptr<rtcp::RtcpPacket> BuildPLI(const RtcpContext& context)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(critical_section_rtcp_sender_);
-  std::unique_ptr<rtcp::RtcpPacket> BuildREMB(const RtcpContext& context)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(critical_section_rtcp_sender_);
-  std::unique_ptr<rtcp::RtcpPacket> BuildTMMBR(const RtcpContext& context)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(critical_section_rtcp_sender_);
-  std::unique_ptr<rtcp::RtcpPacket> BuildTMMBN(const RtcpContext& context)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(critical_section_rtcp_sender_);
-  std::unique_ptr<rtcp::RtcpPacket> BuildAPP(const RtcpContext& context)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(critical_section_rtcp_sender_);
-  std::unique_ptr<rtcp::RtcpPacket> BuildExtendedReports(
-      const RtcpContext& context)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(critical_section_rtcp_sender_);
-  std::unique_ptr<rtcp::RtcpPacket> BuildBYE(const RtcpContext& context)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(critical_section_rtcp_sender_);
-  std::unique_ptr<rtcp::RtcpPacket> BuildFIR(const RtcpContext& context)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(critical_section_rtcp_sender_);
-  std::unique_ptr<rtcp::RtcpPacket> BuildNACK(const RtcpContext& context)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(critical_section_rtcp_sender_);
-
- private:
-  const bool audio_;
-  Clock* const clock_;
-  Random random_ RTC_GUARDED_BY(critical_section_rtcp_sender_);
-  RtcpMode method_ RTC_GUARDED_BY(critical_section_rtcp_sender_);
-
-  RtcEventLog* const event_log_;
-  Transport* const transport_;
-
-  rtc::CriticalSection critical_section_rtcp_sender_;
-  bool using_nack_ RTC_GUARDED_BY(critical_section_rtcp_sender_);
-  bool sending_ RTC_GUARDED_BY(critical_section_rtcp_sender_);
-  bool remb_enabled_ RTC_GUARDED_BY(critical_section_rtcp_sender_);
-
-  int64_t next_time_to_send_rtcp_ RTC_GUARDED_BY(critical_section_rtcp_sender_);
-
-  uint32_t timestamp_offset_ RTC_GUARDED_BY(critical_section_rtcp_sender_);
-  uint32_t last_rtp_timestamp_ RTC_GUARDED_BY(critical_section_rtcp_sender_);
-  int64_t last_frame_capture_time_ms_
-      RTC_GUARDED_BY(critical_section_rtcp_sender_);
-  uint32_t ssrc_ RTC_GUARDED_BY(critical_section_rtcp_sender_);
-  // SSRC that we receive on our RTP channel
-  uint32_t remote_ssrc_ RTC_GUARDED_BY(critical_section_rtcp_sender_);
-  std::string cname_ RTC_GUARDED_BY(critical_section_rtcp_sender_);
-
-  ReceiveStatisticsProvider* receive_statistics_
-      RTC_GUARDED_BY(critical_section_rtcp_sender_);
-  std::map<uint32_t, std::string> csrc_cnames_
-      RTC_GUARDED_BY(critical_section_rtcp_sender_);
-
-  // send CSRCs
-  std::vector<uint32_t> csrcs_ RTC_GUARDED_BY(critical_section_rtcp_sender_);
-
-  // Full intra request
-  uint8_t sequence_number_fir_ RTC_GUARDED_BY(critical_section_rtcp_sender_);
-
-  // REMB
-  uint32_t remb_bitrate_ RTC_GUARDED_BY(critical_section_rtcp_sender_);
-  std::vector<uint32_t> remb_ssrcs_
-      RTC_GUARDED_BY(critical_section_rtcp_sender_);
-
-  std::vector<rtcp::TmmbItem> tmmbn_to_send_
-      RTC_GUARDED_BY(critical_section_rtcp_sender_);
-  uint32_t tmmbr_send_bps_ RTC_GUARDED_BY(critical_section_rtcp_sender_);
-  uint32_t packet_oh_send_ RTC_GUARDED_BY(critical_section_rtcp_sender_);
-  size_t max_packet_size_ RTC_GUARDED_BY(critical_section_rtcp_sender_);
-
-  // APP
-  uint8_t app_sub_type_ RTC_GUARDED_BY(critical_section_rtcp_sender_);
-  uint32_t app_name_ RTC_GUARDED_BY(critical_section_rtcp_sender_);
-  std::unique_ptr<uint8_t[]> app_data_
-      RTC_GUARDED_BY(critical_section_rtcp_sender_);
-  uint16_t app_length_ RTC_GUARDED_BY(critical_section_rtcp_sender_);
-
-  // True if sending of XR Receiver reference time report is enabled.
-  bool xr_send_receiver_reference_time_enabled_
-      RTC_GUARDED_BY(critical_section_rtcp_sender_);
-
-  // XR VoIP metric
-  rtc::Optional<RTCPVoIPMetric> xr_voip_metric_
-      RTC_GUARDED_BY(critical_section_rtcp_sender_);
-
-  RtcpPacketTypeCounterObserver* const packet_type_counter_observer_;
-  RtcpPacketTypeCounter packet_type_counter_
-      RTC_GUARDED_BY(critical_section_rtcp_sender_);
-
-  RtcpNackStats nack_stats_ RTC_GUARDED_BY(critical_section_rtcp_sender_);
-
-  rtc::Optional<BitrateAllocation> video_bitrate_allocation_
-      RTC_GUARDED_BY(critical_section_rtcp_sender_);
-
-  void SetFlag(uint32_t type, bool is_volatile)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(critical_section_rtcp_sender_);
-  void SetFlags(const std::set<RTCPPacketType>& types, bool is_volatile)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(critical_section_rtcp_sender_);
-  bool IsFlagPresent(uint32_t type) const
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(critical_section_rtcp_sender_);
-  bool ConsumeFlag(uint32_t type, bool forced = false)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(critical_section_rtcp_sender_);
-  bool AllVolatileFlagsConsumed() const
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(critical_section_rtcp_sender_);
-  struct ReportFlag {
-    ReportFlag(uint32_t type, bool is_volatile)
-        : type(type), is_volatile(is_volatile) {}
-    bool operator<(const ReportFlag& flag) const { return type < flag.type; }
-    bool operator==(const ReportFlag& flag) const { return type == flag.type; }
-    const uint32_t type;
-    const bool is_volatile;
-  };
-
-  std::set<ReportFlag> report_flags_
-      RTC_GUARDED_BY(critical_section_rtcp_sender_);
-
-  typedef std::unique_ptr<rtcp::RtcpPacket> (RTCPSender::*BuilderFunc)(
-      const RtcpContext&);
-  // Map from RTCPPacketType to builder.
-  std::map<uint32_t, BuilderFunc> builders_;
-
-  RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(RTCPSender);
-};
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_SENDER_H_
diff --git a/modules/rtp_rtcp/source/rtcp_sender_unittest.cc b/modules/rtp_rtcp/source/rtcp_sender_unittest.cc
deleted file mode 100644
index 223e06b..0000000
--- a/modules/rtp_rtcp/source/rtcp_sender_unittest.cc
+++ /dev/null
@@ -1,845 +0,0 @@
-/*
- *  Copyright (c) 2012 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 <memory>
-
-#include "webrtc/common_types.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/bye.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/common_header.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_sender.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_rtcp_impl.h"
-#include "webrtc/rtc_base/rate_limiter.h"
-#include "webrtc/test/gmock.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/mock_transport.h"
-#include "webrtc/test/rtcp_packet_parser.h"
-
-using ::testing::_;
-using ::testing::ElementsAre;
-using ::testing::Invoke;
-
-namespace webrtc {
-
-TEST(NACKStringBuilderTest, TestCase1) {
-  NACKStringBuilder builder;
-  builder.PushNACK(5);
-  builder.PushNACK(7);
-  builder.PushNACK(9);
-  builder.PushNACK(10);
-  builder.PushNACK(11);
-  builder.PushNACK(12);
-  builder.PushNACK(15);
-  builder.PushNACK(18);
-  builder.PushNACK(19);
-  EXPECT_EQ(std::string("5,7,9-12,15,18-19"), builder.GetResult());
-}
-
-TEST(NACKStringBuilderTest, TestCase2) {
-  NACKStringBuilder builder;
-  builder.PushNACK(5);
-  builder.PushNACK(6);
-  builder.PushNACK(7);
-  builder.PushNACK(9);
-  builder.PushNACK(10);
-  builder.PushNACK(11);
-  builder.PushNACK(12);
-  builder.PushNACK(15);
-  builder.PushNACK(18);
-  builder.PushNACK(19);
-  EXPECT_EQ(std::string("5-7,9-12,15,18-19"), builder.GetResult());
-}
-
-TEST(NACKStringBuilderTest, TestCase3) {
-  NACKStringBuilder builder;
-  builder.PushNACK(5);
-  builder.PushNACK(7);
-  builder.PushNACK(9);
-  builder.PushNACK(10);
-  builder.PushNACK(11);
-  builder.PushNACK(12);
-  builder.PushNACK(15);
-  builder.PushNACK(18);
-  builder.PushNACK(19);
-  builder.PushNACK(21);
-  EXPECT_EQ(std::string("5,7,9-12,15,18-19,21"), builder.GetResult());
-}
-
-TEST(NACKStringBuilderTest, TestCase4) {
-  NACKStringBuilder builder;
-  builder.PushNACK(5);
-  builder.PushNACK(7);
-  builder.PushNACK(8);
-  builder.PushNACK(9);
-  builder.PushNACK(10);
-  builder.PushNACK(11);
-  builder.PushNACK(12);
-  builder.PushNACK(15);
-  builder.PushNACK(18);
-  builder.PushNACK(19);
-  EXPECT_EQ(std::string("5,7-12,15,18-19"), builder.GetResult());
-}
-
-TEST(NACKStringBuilderTest, TestCase5) {
-  NACKStringBuilder builder;
-  builder.PushNACK(5);
-  builder.PushNACK(7);
-  builder.PushNACK(9);
-  builder.PushNACK(10);
-  builder.PushNACK(11);
-  builder.PushNACK(12);
-  builder.PushNACK(15);
-  builder.PushNACK(16);
-  builder.PushNACK(18);
-  builder.PushNACK(19);
-  EXPECT_EQ(std::string("5,7,9-12,15-16,18-19"), builder.GetResult());
-}
-
-TEST(NACKStringBuilderTest, TestCase6) {
-  NACKStringBuilder builder;
-  builder.PushNACK(5);
-  builder.PushNACK(7);
-  builder.PushNACK(9);
-  builder.PushNACK(10);
-  builder.PushNACK(11);
-  builder.PushNACK(12);
-  builder.PushNACK(15);
-  builder.PushNACK(16);
-  builder.PushNACK(17);
-  builder.PushNACK(18);
-  builder.PushNACK(19);
-  EXPECT_EQ(std::string("5,7,9-12,15-19"), builder.GetResult());
-}
-
-TEST(NACKStringBuilderTest, TestCase7) {
-  NACKStringBuilder builder;
-  builder.PushNACK(5);
-  builder.PushNACK(6);
-  builder.PushNACK(7);
-  builder.PushNACK(8);
-  builder.PushNACK(11);
-  builder.PushNACK(12);
-  builder.PushNACK(13);
-  builder.PushNACK(14);
-  builder.PushNACK(15);
-  EXPECT_EQ(std::string("5-8,11-15"), builder.GetResult());
-}
-
-TEST(NACKStringBuilderTest, TestCase8) {
-  NACKStringBuilder builder;
-  builder.PushNACK(5);
-  builder.PushNACK(7);
-  builder.PushNACK(9);
-  builder.PushNACK(11);
-  builder.PushNACK(15);
-  builder.PushNACK(17);
-  builder.PushNACK(19);
-  EXPECT_EQ(std::string("5,7,9,11,15,17,19"), builder.GetResult());
-}
-
-TEST(NACKStringBuilderTest, TestCase9) {
-  NACKStringBuilder builder;
-  builder.PushNACK(5);
-  builder.PushNACK(6);
-  builder.PushNACK(7);
-  builder.PushNACK(8);
-  builder.PushNACK(9);
-  builder.PushNACK(10);
-  builder.PushNACK(11);
-  builder.PushNACK(12);
-  EXPECT_EQ(std::string("5-12"), builder.GetResult());
-}
-
-TEST(NACKStringBuilderTest, TestCase10) {
-  NACKStringBuilder builder;
-  builder.PushNACK(5);
-  EXPECT_EQ(std::string("5"), builder.GetResult());
-}
-
-TEST(NACKStringBuilderTest, TestCase11) {
-  NACKStringBuilder builder;
-  EXPECT_EQ(std::string(""), builder.GetResult());
-}
-
-TEST(NACKStringBuilderTest, TestCase12) {
-  NACKStringBuilder builder;
-  builder.PushNACK(5);
-  builder.PushNACK(6);
-  EXPECT_EQ(std::string("5-6"), builder.GetResult());
-}
-
-TEST(NACKStringBuilderTest, TestCase13) {
-  NACKStringBuilder builder;
-  builder.PushNACK(5);
-  builder.PushNACK(6);
-  builder.PushNACK(9);
-  EXPECT_EQ(std::string("5-6,9"), builder.GetResult());
-}
-
-class RtcpPacketTypeCounterObserverImpl : public RtcpPacketTypeCounterObserver {
- public:
-  RtcpPacketTypeCounterObserverImpl() : ssrc_(0) {}
-  virtual ~RtcpPacketTypeCounterObserverImpl() {}
-  void RtcpPacketTypesCounterUpdated(
-      uint32_t ssrc,
-      const RtcpPacketTypeCounter& packet_counter) override {
-    ssrc_ = ssrc;
-    counter_ = packet_counter;
-  }
-  uint32_t ssrc_;
-  RtcpPacketTypeCounter counter_;
-};
-
-class TestTransport : public Transport,
-                      public RtpData {
- public:
-  TestTransport() {}
-
-  bool SendRtp(const uint8_t* /*data*/,
-               size_t /*len*/,
-               const PacketOptions& options) override {
-    return false;
-  }
-  bool SendRtcp(const uint8_t* data, size_t len) override {
-    parser_.Parse(data, len);
-    return true;
-  }
-  int OnReceivedPayloadData(const uint8_t* payload_data,
-                            size_t payload_size,
-                            const WebRtcRTPHeader* rtp_header) override {
-    return 0;
-  }
-  test::RtcpPacketParser parser_;
-};
-
-namespace {
-static const uint32_t kSenderSsrc = 0x11111111;
-static const uint32_t kRemoteSsrc = 0x22222222;
-static const uint32_t kStartRtpTimestamp = 0x34567;
-static const uint32_t kRtpTimestamp = 0x45678;
-}
-
-class RtcpSenderTest : public ::testing::Test {
- protected:
-  RtcpSenderTest()
-      : clock_(1335900000),
-        receive_statistics_(ReceiveStatistics::Create(&clock_)),
-        retransmission_rate_limiter_(&clock_, 1000) {
-    RtpRtcp::Configuration configuration;
-    configuration.audio = false;
-    configuration.clock = &clock_;
-    configuration.outgoing_transport = &test_transport_;
-    configuration.retransmission_rate_limiter = &retransmission_rate_limiter_;
-
-    rtp_rtcp_impl_.reset(new ModuleRtpRtcpImpl(configuration));
-    rtcp_sender_.reset(new RTCPSender(false, &clock_, receive_statistics_.get(),
-                                      nullptr, nullptr, &test_transport_));
-    rtcp_sender_->SetSSRC(kSenderSsrc);
-    rtcp_sender_->SetRemoteSSRC(kRemoteSsrc);
-    rtcp_sender_->SetTimestampOffset(kStartRtpTimestamp);
-    rtcp_sender_->SetLastRtpTime(kRtpTimestamp, clock_.TimeInMilliseconds());
-  }
-
-  void InsertIncomingPacket(uint32_t remote_ssrc, uint16_t seq_num) {
-    RTPHeader header;
-    header.ssrc = remote_ssrc;
-    header.sequenceNumber = seq_num;
-    header.timestamp = 12345;
-    header.headerLength = 12;
-    size_t kPacketLength = 100;
-    receive_statistics_->IncomingPacket(header, kPacketLength, false);
-  }
-
-  test::RtcpPacketParser* parser() { return &test_transport_.parser_; }
-
-  RTCPSender::FeedbackState feedback_state() {
-    return rtp_rtcp_impl_->GetFeedbackState();
-  }
-
-  SimulatedClock clock_;
-  TestTransport test_transport_;
-  std::unique_ptr<ReceiveStatistics> receive_statistics_;
-  std::unique_ptr<ModuleRtpRtcpImpl> rtp_rtcp_impl_;
-  std::unique_ptr<RTCPSender> rtcp_sender_;
-  RateLimiter retransmission_rate_limiter_;
-};
-
-TEST_F(RtcpSenderTest, SetRtcpStatus) {
-  EXPECT_EQ(RtcpMode::kOff, rtcp_sender_->Status());
-  rtcp_sender_->SetRTCPStatus(RtcpMode::kReducedSize);
-  EXPECT_EQ(RtcpMode::kReducedSize, rtcp_sender_->Status());
-}
-
-TEST_F(RtcpSenderTest, SetSendingStatus) {
-  EXPECT_FALSE(rtcp_sender_->Sending());
-  EXPECT_EQ(0, rtcp_sender_->SetSendingStatus(feedback_state(), true));
-  EXPECT_TRUE(rtcp_sender_->Sending());
-}
-
-TEST_F(RtcpSenderTest, NoPacketSentIfOff) {
-  rtcp_sender_->SetRTCPStatus(RtcpMode::kOff);
-  EXPECT_EQ(-1, rtcp_sender_->SendRTCP(feedback_state(), kRtcpSr));
-}
-
-TEST_F(RtcpSenderTest, SendSr) {
-  const uint32_t kPacketCount = 0x12345;
-  const uint32_t kOctetCount = 0x23456;
-  rtcp_sender_->SetRTCPStatus(RtcpMode::kReducedSize);
-  RTCPSender::FeedbackState feedback_state = rtp_rtcp_impl_->GetFeedbackState();
-  rtcp_sender_->SetSendingStatus(feedback_state, true);
-  feedback_state.packets_sent = kPacketCount;
-  feedback_state.media_bytes_sent = kOctetCount;
-  NtpTime ntp = clock_.CurrentNtpTime();
-  EXPECT_EQ(0, rtcp_sender_->SendRTCP(feedback_state, kRtcpSr));
-  EXPECT_EQ(1, parser()->sender_report()->num_packets());
-  EXPECT_EQ(kSenderSsrc, parser()->sender_report()->sender_ssrc());
-  EXPECT_EQ(ntp, parser()->sender_report()->ntp());
-  EXPECT_EQ(kPacketCount, parser()->sender_report()->sender_packet_count());
-  EXPECT_EQ(kOctetCount, parser()->sender_report()->sender_octet_count());
-  EXPECT_EQ(kStartRtpTimestamp + kRtpTimestamp,
-            parser()->sender_report()->rtp_timestamp());
-  EXPECT_EQ(0U, parser()->sender_report()->report_blocks().size());
-}
-
-TEST_F(RtcpSenderTest, DoNotSendSrBeforeRtp) {
-  rtcp_sender_.reset(new RTCPSender(false, &clock_, receive_statistics_.get(),
-                                    nullptr, nullptr, &test_transport_));
-  rtcp_sender_->SetSSRC(kSenderSsrc);
-  rtcp_sender_->SetRemoteSSRC(kRemoteSsrc);
-  rtcp_sender_->SetRTCPStatus(RtcpMode::kReducedSize);
-  rtcp_sender_->SetSendingStatus(feedback_state(), true);
-
-  // Sender Report shouldn't be send as an SR nor as a Report.
-  rtcp_sender_->SendRTCP(feedback_state(), kRtcpSr);
-  EXPECT_EQ(0, parser()->sender_report()->num_packets());
-  rtcp_sender_->SendRTCP(feedback_state(), kRtcpReport);
-  EXPECT_EQ(0, parser()->sender_report()->num_packets());
-  // Other packets (e.g. Pli) are allowed, even if useless.
-  EXPECT_EQ(0, rtcp_sender_->SendRTCP(feedback_state(), kRtcpPli));
-  EXPECT_EQ(1, parser()->pli()->num_packets());
-}
-
-TEST_F(RtcpSenderTest, DoNotSendCompundBeforeRtp) {
-  rtcp_sender_.reset(new RTCPSender(false, &clock_, receive_statistics_.get(),
-                                    nullptr, nullptr, &test_transport_));
-  rtcp_sender_->SetSSRC(kSenderSsrc);
-  rtcp_sender_->SetRemoteSSRC(kRemoteSsrc);
-  rtcp_sender_->SetRTCPStatus(RtcpMode::kCompound);
-  rtcp_sender_->SetSendingStatus(feedback_state(), true);
-
-  // In compound mode no packets are allowed (e.g. Pli) because compound mode
-  // should start with Sender Report.
-  EXPECT_EQ(-1, rtcp_sender_->SendRTCP(feedback_state(), kRtcpPli));
-  EXPECT_EQ(0, parser()->pli()->num_packets());
-}
-
-TEST_F(RtcpSenderTest, SendRr) {
-  rtcp_sender_->SetRTCPStatus(RtcpMode::kReducedSize);
-  EXPECT_EQ(0, rtcp_sender_->SendRTCP(feedback_state(), kRtcpRr));
-  EXPECT_EQ(1, parser()->receiver_report()->num_packets());
-  EXPECT_EQ(kSenderSsrc, parser()->receiver_report()->sender_ssrc());
-  EXPECT_EQ(0U, parser()->receiver_report()->report_blocks().size());
-}
-
-TEST_F(RtcpSenderTest, SendRrWithOneReportBlock) {
-  const uint16_t kSeqNum = 11111;
-  InsertIncomingPacket(kRemoteSsrc, kSeqNum);
-  rtcp_sender_->SetRTCPStatus(RtcpMode::kCompound);
-  EXPECT_EQ(0, rtcp_sender_->SendRTCP(feedback_state(), kRtcpRr));
-  EXPECT_EQ(1, parser()->receiver_report()->num_packets());
-  EXPECT_EQ(kSenderSsrc, parser()->receiver_report()->sender_ssrc());
-  ASSERT_EQ(1U, parser()->receiver_report()->report_blocks().size());
-  const rtcp::ReportBlock& rb = parser()->receiver_report()->report_blocks()[0];
-  EXPECT_EQ(kRemoteSsrc, rb.source_ssrc());
-  EXPECT_EQ(0U, rb.fraction_lost());
-  EXPECT_EQ(0U, rb.cumulative_lost());
-  EXPECT_EQ(kSeqNum, rb.extended_high_seq_num());
-}
-
-TEST_F(RtcpSenderTest, SendRrWithTwoReportBlocks) {
-  const uint16_t kSeqNum = 11111;
-  InsertIncomingPacket(kRemoteSsrc, kSeqNum);
-  InsertIncomingPacket(kRemoteSsrc + 1, kSeqNum + 1);
-  rtcp_sender_->SetRTCPStatus(RtcpMode::kCompound);
-  EXPECT_EQ(0, rtcp_sender_->SendRTCP(feedback_state(), kRtcpRr));
-  EXPECT_EQ(1, parser()->receiver_report()->num_packets());
-  EXPECT_EQ(kSenderSsrc, parser()->receiver_report()->sender_ssrc());
-  EXPECT_EQ(2U, parser()->receiver_report()->report_blocks().size());
-  EXPECT_EQ(kRemoteSsrc,
-            parser()->receiver_report()->report_blocks()[0].source_ssrc());
-  EXPECT_EQ(kRemoteSsrc + 1,
-            parser()->receiver_report()->report_blocks()[1].source_ssrc());
-}
-
-TEST_F(RtcpSenderTest, SendSdes) {
-  rtcp_sender_->SetRTCPStatus(RtcpMode::kReducedSize);
-  EXPECT_EQ(0, rtcp_sender_->SetCNAME("alice@host"));
-  EXPECT_EQ(0, rtcp_sender_->SendRTCP(feedback_state(), kRtcpSdes));
-  EXPECT_EQ(1, parser()->sdes()->num_packets());
-  EXPECT_EQ(1U, parser()->sdes()->chunks().size());
-  EXPECT_EQ(kSenderSsrc, parser()->sdes()->chunks()[0].ssrc);
-  EXPECT_EQ("alice@host", parser()->sdes()->chunks()[0].cname);
-}
-
-TEST_F(RtcpSenderTest, SendSdesWithMaxChunks) {
-  rtcp_sender_->SetRTCPStatus(RtcpMode::kReducedSize);
-  EXPECT_EQ(0, rtcp_sender_->SetCNAME("alice@host"));
-  const char cname[] = "smith@host";
-  for (size_t i = 0; i < 30; ++i) {
-    const uint32_t csrc = 0x1234 + i;
-    EXPECT_EQ(0, rtcp_sender_->AddMixedCNAME(csrc, cname));
-  }
-  EXPECT_EQ(0, rtcp_sender_->SendRTCP(feedback_state(), kRtcpSdes));
-  EXPECT_EQ(1, parser()->sdes()->num_packets());
-  EXPECT_EQ(31U, parser()->sdes()->chunks().size());
-}
-
-TEST_F(RtcpSenderTest, SdesIncludedInCompoundPacket) {
-  rtcp_sender_->SetRTCPStatus(RtcpMode::kCompound);
-  EXPECT_EQ(0, rtcp_sender_->SetCNAME("alice@host"));
-  EXPECT_EQ(0, rtcp_sender_->SendRTCP(feedback_state(), kRtcpReport));
-  EXPECT_EQ(1, parser()->receiver_report()->num_packets());
-  EXPECT_EQ(1, parser()->sdes()->num_packets());
-  EXPECT_EQ(1U, parser()->sdes()->chunks().size());
-}
-
-TEST_F(RtcpSenderTest, SendBye) {
-  rtcp_sender_->SetRTCPStatus(RtcpMode::kReducedSize);
-  EXPECT_EQ(0, rtcp_sender_->SendRTCP(feedback_state(), kRtcpBye));
-  EXPECT_EQ(1, parser()->bye()->num_packets());
-  EXPECT_EQ(kSenderSsrc, parser()->bye()->sender_ssrc());
-}
-
-TEST_F(RtcpSenderTest, StopSendingTriggersBye) {
-  rtcp_sender_->SetRTCPStatus(RtcpMode::kReducedSize);
-  EXPECT_EQ(0, rtcp_sender_->SetSendingStatus(feedback_state(), true));
-  EXPECT_EQ(0, rtcp_sender_->SetSendingStatus(feedback_state(), false));
-  EXPECT_EQ(1, parser()->bye()->num_packets());
-  EXPECT_EQ(kSenderSsrc, parser()->bye()->sender_ssrc());
-}
-
-TEST_F(RtcpSenderTest, SendApp) {
-  const uint8_t kSubType = 30;
-  uint32_t name = 'n' << 24;
-  name += 'a' << 16;
-  name += 'm' << 8;
-  name += 'e';
-  const uint8_t kData[] = {'t', 'e', 's', 't', 'd', 'a', 't', 'a'};
-  EXPECT_EQ(0, rtcp_sender_->SetApplicationSpecificData(kSubType, name, kData,
-                                                        sizeof(kData)));
-  rtcp_sender_->SetRTCPStatus(RtcpMode::kReducedSize);
-  EXPECT_EQ(0, rtcp_sender_->SendRTCP(feedback_state(), kRtcpApp));
-  EXPECT_EQ(1, parser()->app()->num_packets());
-  EXPECT_EQ(kSubType, parser()->app()->sub_type());
-  EXPECT_EQ(name, parser()->app()->name());
-  EXPECT_EQ(sizeof(kData), parser()->app()->data_size());
-  EXPECT_EQ(0, memcmp(kData, parser()->app()->data(), sizeof(kData)));
-}
-
-TEST_F(RtcpSenderTest, SendEmptyApp) {
-  const uint8_t kSubType = 30;
-  const uint32_t kName = 0x6E616D65;
-
-  EXPECT_EQ(
-      0, rtcp_sender_->SetApplicationSpecificData(kSubType, kName, nullptr, 0));
-
-  rtcp_sender_->SetRTCPStatus(RtcpMode::kReducedSize);
-  EXPECT_EQ(0, rtcp_sender_->SendRTCP(feedback_state(), kRtcpApp));
-  EXPECT_EQ(1, parser()->app()->num_packets());
-  EXPECT_EQ(kSubType, parser()->app()->sub_type());
-  EXPECT_EQ(kName, parser()->app()->name());
-  EXPECT_EQ(0U, parser()->app()->data_size());
-}
-
-TEST_F(RtcpSenderTest, SetInvalidApplicationSpecificData) {
-  const uint8_t kData[] = {'t', 'e', 's', 't', 'd', 'a', 't'};
-  const uint16_t kInvalidDataLength = sizeof(kData) / sizeof(kData[0]);
-  EXPECT_EQ(-1, rtcp_sender_->SetApplicationSpecificData(
-      0, 0, kData, kInvalidDataLength));  // Should by multiple of 4.
-}
-
-TEST_F(RtcpSenderTest, SendFir) {
-  rtcp_sender_->SetRTCPStatus(RtcpMode::kReducedSize);
-  EXPECT_EQ(0, rtcp_sender_->SendRTCP(feedback_state(), kRtcpFir));
-  EXPECT_EQ(1, parser()->fir()->num_packets());
-  EXPECT_EQ(kSenderSsrc, parser()->fir()->sender_ssrc());
-  EXPECT_EQ(1U, parser()->fir()->requests().size());
-  EXPECT_EQ(kRemoteSsrc, parser()->fir()->requests()[0].ssrc);
-  uint8_t seq = parser()->fir()->requests()[0].seq_nr;
-  EXPECT_EQ(0, rtcp_sender_->SendRTCP(feedback_state(), kRtcpFir));
-  EXPECT_EQ(2, parser()->fir()->num_packets());
-  EXPECT_EQ(seq + 1, parser()->fir()->requests()[0].seq_nr);
-}
-
-TEST_F(RtcpSenderTest, SendPli) {
-  rtcp_sender_->SetRTCPStatus(RtcpMode::kReducedSize);
-  EXPECT_EQ(0, rtcp_sender_->SendRTCP(feedback_state(), kRtcpPli));
-  EXPECT_EQ(1, parser()->pli()->num_packets());
-  EXPECT_EQ(kSenderSsrc, parser()->pli()->sender_ssrc());
-  EXPECT_EQ(kRemoteSsrc, parser()->pli()->media_ssrc());
-}
-
-TEST_F(RtcpSenderTest, SendNack) {
-  rtcp_sender_->SetRTCPStatus(RtcpMode::kReducedSize);
-  const uint16_t kList[] = {0, 1, 16};
-  const int32_t kListLength = sizeof(kList) / sizeof(kList[0]);
-  EXPECT_EQ(0, rtcp_sender_->SendRTCP(feedback_state(), kRtcpNack, kListLength,
-                                      kList));
-  EXPECT_EQ(1, parser()->nack()->num_packets());
-  EXPECT_EQ(kSenderSsrc, parser()->nack()->sender_ssrc());
-  EXPECT_EQ(kRemoteSsrc, parser()->nack()->media_ssrc());
-  EXPECT_THAT(parser()->nack()->packet_ids(), ElementsAre(0, 1, 16));
-}
-
-TEST_F(RtcpSenderTest, RembStatus) {
-  const uint64_t kBitrate = 261011;
-  const std::vector<uint32_t> kSsrcs = {kRemoteSsrc, kRemoteSsrc + 1};
-  rtcp_sender_->SetRTCPStatus(RtcpMode::kReducedSize);
-
-  EXPECT_FALSE(rtcp_sender_->REMB());
-  rtcp_sender_->SendRTCP(feedback_state(), kRtcpRr);
-  ASSERT_EQ(1, parser()->receiver_report()->num_packets());
-  EXPECT_EQ(0, parser()->remb()->num_packets());
-
-  rtcp_sender_->SetREMBStatus(true);
-  EXPECT_TRUE(rtcp_sender_->REMB());
-  rtcp_sender_->SetREMBData(kBitrate, kSsrcs);
-  rtcp_sender_->SendRTCP(feedback_state(), kRtcpRr);
-  ASSERT_EQ(2, parser()->receiver_report()->num_packets());
-  EXPECT_EQ(1, parser()->remb()->num_packets());
-
-  // Sending another report sends remb again, even if no new remb data was set.
-  rtcp_sender_->SendRTCP(feedback_state(), kRtcpRr);
-  ASSERT_EQ(3, parser()->receiver_report()->num_packets());
-  EXPECT_EQ(2, parser()->remb()->num_packets());
-
-  // Turn off remb. rtcp_sender no longer should send it.
-  rtcp_sender_->SetREMBStatus(false);
-  EXPECT_FALSE(rtcp_sender_->REMB());
-  rtcp_sender_->SendRTCP(feedback_state(), kRtcpRr);
-  ASSERT_EQ(4, parser()->receiver_report()->num_packets());
-  EXPECT_EQ(2, parser()->remb()->num_packets());
-}
-
-TEST_F(RtcpSenderTest, SendRemb) {
-  const uint64_t kBitrate = 261011;
-  std::vector<uint32_t> ssrcs;
-  ssrcs.push_back(kRemoteSsrc);
-  ssrcs.push_back(kRemoteSsrc + 1);
-  rtcp_sender_->SetRTCPStatus(RtcpMode::kReducedSize);
-  rtcp_sender_->SetREMBData(kBitrate, ssrcs);
-  EXPECT_EQ(0, rtcp_sender_->SendRTCP(feedback_state(), kRtcpRemb));
-  EXPECT_EQ(1, parser()->remb()->num_packets());
-  EXPECT_EQ(kSenderSsrc, parser()->remb()->sender_ssrc());
-  EXPECT_EQ(kBitrate, parser()->remb()->bitrate_bps());
-  EXPECT_THAT(parser()->remb()->ssrcs(),
-              ElementsAre(kRemoteSsrc, kRemoteSsrc + 1));
-}
-
-TEST_F(RtcpSenderTest, RembIncludedInCompoundPacketIfEnabled) {
-  const int kBitrate = 261011;
-  std::vector<uint32_t> ssrcs;
-  ssrcs.push_back(kRemoteSsrc);
-  rtcp_sender_->SetRTCPStatus(RtcpMode::kCompound);
-  rtcp_sender_->SetREMBStatus(true);
-  EXPECT_TRUE(rtcp_sender_->REMB());
-  rtcp_sender_->SetREMBData(kBitrate, ssrcs);
-  EXPECT_EQ(0, rtcp_sender_->SendRTCP(feedback_state(), kRtcpReport));
-  EXPECT_EQ(1, parser()->remb()->num_packets());
-  // REMB should be included in each compound packet.
-  EXPECT_EQ(0, rtcp_sender_->SendRTCP(feedback_state(), kRtcpReport));
-  EXPECT_EQ(2, parser()->remb()->num_packets());
-}
-
-TEST_F(RtcpSenderTest, RembNotIncludedInCompoundPacketIfNotEnabled) {
-  const int kBitrate = 261011;
-  std::vector<uint32_t> ssrcs;
-  ssrcs.push_back(kRemoteSsrc);
-  rtcp_sender_->SetRTCPStatus(RtcpMode::kCompound);
-  rtcp_sender_->SetREMBData(kBitrate, ssrcs);
-  EXPECT_FALSE(rtcp_sender_->REMB());
-  EXPECT_EQ(0, rtcp_sender_->SendRTCP(feedback_state(), kRtcpReport));
-  EXPECT_EQ(0, parser()->remb()->num_packets());
-}
-
-TEST_F(RtcpSenderTest, SendXrWithVoipMetric) {
-  rtcp_sender_->SetRTCPStatus(RtcpMode::kReducedSize);
-  RTCPVoIPMetric metric;
-  metric.lossRate = 1;
-  metric.discardRate = 2;
-  metric.burstDensity = 3;
-  metric.gapDensity = 4;
-  metric.burstDuration = 0x1111;
-  metric.gapDuration = 0x2222;
-  metric.roundTripDelay = 0x3333;
-  metric.endSystemDelay = 0x4444;
-  metric.signalLevel = 5;
-  metric.noiseLevel = 6;
-  metric.RERL = 7;
-  metric.Gmin = 8;
-  metric.Rfactor = 9;
-  metric.extRfactor = 10;
-  metric.MOSLQ = 11;
-  metric.MOSCQ = 12;
-  metric.RXconfig = 13;
-  metric.JBnominal = 0x5555;
-  metric.JBmax = 0x6666;
-  metric.JBabsMax = 0x7777;
-  EXPECT_EQ(0, rtcp_sender_->SetRTCPVoIPMetrics(&metric));
-  EXPECT_EQ(0, rtcp_sender_->SendRTCP(feedback_state(), kRtcpXrVoipMetric));
-  EXPECT_EQ(1, parser()->xr()->num_packets());
-  EXPECT_EQ(kSenderSsrc, parser()->xr()->sender_ssrc());
-  ASSERT_TRUE(parser()->xr()->voip_metric());
-  EXPECT_EQ(kRemoteSsrc, parser()->xr()->voip_metric()->ssrc());
-  const auto& parsed_metric = parser()->xr()->voip_metric()->voip_metric();
-  EXPECT_EQ(metric.lossRate, parsed_metric.lossRate);
-  EXPECT_EQ(metric.discardRate, parsed_metric.discardRate);
-  EXPECT_EQ(metric.burstDensity, parsed_metric.burstDensity);
-  EXPECT_EQ(metric.gapDensity, parsed_metric.gapDensity);
-  EXPECT_EQ(metric.burstDuration, parsed_metric.burstDuration);
-  EXPECT_EQ(metric.gapDuration, parsed_metric.gapDuration);
-  EXPECT_EQ(metric.roundTripDelay, parsed_metric.roundTripDelay);
-  EXPECT_EQ(metric.endSystemDelay, parsed_metric.endSystemDelay);
-  EXPECT_EQ(metric.signalLevel, parsed_metric.signalLevel);
-  EXPECT_EQ(metric.noiseLevel, parsed_metric.noiseLevel);
-  EXPECT_EQ(metric.RERL, parsed_metric.RERL);
-  EXPECT_EQ(metric.Gmin, parsed_metric.Gmin);
-  EXPECT_EQ(metric.Rfactor, parsed_metric.Rfactor);
-  EXPECT_EQ(metric.extRfactor, parsed_metric.extRfactor);
-  EXPECT_EQ(metric.MOSLQ, parsed_metric.MOSLQ);
-  EXPECT_EQ(metric.MOSCQ, parsed_metric.MOSCQ);
-  EXPECT_EQ(metric.RXconfig, parsed_metric.RXconfig);
-  EXPECT_EQ(metric.JBnominal, parsed_metric.JBnominal);
-  EXPECT_EQ(metric.JBmax, parsed_metric.JBmax);
-  EXPECT_EQ(metric.JBabsMax, parsed_metric.JBabsMax);
-}
-
-TEST_F(RtcpSenderTest, SendXrWithDlrr) {
-  rtcp_sender_->SetRTCPStatus(RtcpMode::kCompound);
-  RTCPSender::FeedbackState feedback_state = rtp_rtcp_impl_->GetFeedbackState();
-  feedback_state.has_last_xr_rr = true;
-  rtcp::ReceiveTimeInfo last_xr_rr;
-  last_xr_rr.ssrc = 0x11111111;
-  last_xr_rr.last_rr = 0x22222222;
-  last_xr_rr.delay_since_last_rr = 0x33333333;
-  feedback_state.last_xr_rr = last_xr_rr;
-  EXPECT_EQ(0, rtcp_sender_->SendRTCP(feedback_state, kRtcpReport));
-  EXPECT_EQ(1, parser()->xr()->num_packets());
-  EXPECT_EQ(kSenderSsrc, parser()->xr()->sender_ssrc());
-  EXPECT_EQ(1U, parser()->xr()->dlrr().sub_blocks().size());
-  EXPECT_EQ(last_xr_rr.ssrc, parser()->xr()->dlrr().sub_blocks()[0].ssrc);
-  EXPECT_EQ(last_xr_rr.last_rr, parser()->xr()->dlrr().sub_blocks()[0].last_rr);
-  EXPECT_EQ(last_xr_rr.delay_since_last_rr,
-            parser()->xr()->dlrr().sub_blocks()[0].delay_since_last_rr);
-}
-
-TEST_F(RtcpSenderTest, SendXrWithRrtr) {
-  rtcp_sender_->SetRTCPStatus(RtcpMode::kCompound);
-  EXPECT_EQ(0, rtcp_sender_->SetSendingStatus(feedback_state(), false));
-  rtcp_sender_->SendRtcpXrReceiverReferenceTime(true);
-  NtpTime ntp = clock_.CurrentNtpTime();
-  EXPECT_EQ(0, rtcp_sender_->SendRTCP(feedback_state(), kRtcpReport));
-  EXPECT_EQ(1, parser()->xr()->num_packets());
-  EXPECT_EQ(kSenderSsrc, parser()->xr()->sender_ssrc());
-  EXPECT_FALSE(parser()->xr()->dlrr());
-  EXPECT_FALSE(parser()->xr()->voip_metric());
-  ASSERT_TRUE(parser()->xr()->rrtr());
-  EXPECT_EQ(ntp, parser()->xr()->rrtr()->ntp());
-}
-
-TEST_F(RtcpSenderTest, TestNoXrRrtrSentIfSending) {
-  rtcp_sender_->SetRTCPStatus(RtcpMode::kCompound);
-  EXPECT_EQ(0, rtcp_sender_->SetSendingStatus(feedback_state(), true));
-  rtcp_sender_->SendRtcpXrReceiverReferenceTime(true);
-  EXPECT_EQ(0, rtcp_sender_->SendRTCP(feedback_state(), kRtcpReport));
-  EXPECT_EQ(0, parser()->xr()->num_packets());
-}
-
-TEST_F(RtcpSenderTest, TestNoXrRrtrSentIfNotEnabled) {
-  rtcp_sender_->SetRTCPStatus(RtcpMode::kCompound);
-  EXPECT_EQ(0, rtcp_sender_->SetSendingStatus(feedback_state(), false));
-  rtcp_sender_->SendRtcpXrReceiverReferenceTime(false);
-  EXPECT_EQ(0, rtcp_sender_->SendRTCP(feedback_state(), kRtcpReport));
-  EXPECT_EQ(0, parser()->xr()->num_packets());
-}
-
-TEST_F(RtcpSenderTest, TestRegisterRtcpPacketTypeObserver) {
-  RtcpPacketTypeCounterObserverImpl observer;
-  rtcp_sender_.reset(new RTCPSender(false, &clock_, receive_statistics_.get(),
-                                    &observer, nullptr, &test_transport_));
-  rtcp_sender_->SetRemoteSSRC(kRemoteSsrc);
-  rtcp_sender_->SetRTCPStatus(RtcpMode::kReducedSize);
-  EXPECT_EQ(0, rtcp_sender_->SendRTCP(feedback_state(), kRtcpPli));
-  EXPECT_EQ(1, parser()->pli()->num_packets());
-  EXPECT_EQ(kRemoteSsrc, observer.ssrc_);
-  EXPECT_EQ(1U, observer.counter_.pli_packets);
-  EXPECT_EQ(clock_.TimeInMilliseconds(),
-            observer.counter_.first_packet_time_ms);
-}
-
-TEST_F(RtcpSenderTest, SendTmmbr) {
-  const unsigned int kBitrateBps = 312000;
-  rtcp_sender_->SetRTCPStatus(RtcpMode::kReducedSize);
-  rtcp_sender_->SetTargetBitrate(kBitrateBps);
-  EXPECT_EQ(0, rtcp_sender_->SendRTCP(feedback_state(), kRtcpTmmbr));
-  EXPECT_EQ(1, parser()->tmmbr()->num_packets());
-  EXPECT_EQ(kSenderSsrc, parser()->tmmbr()->sender_ssrc());
-  EXPECT_EQ(1U, parser()->tmmbr()->requests().size());
-  EXPECT_EQ(kBitrateBps, parser()->tmmbr()->requests()[0].bitrate_bps());
-  // TODO(asapersson): tmmbr_item()->Overhead() looks broken, always zero.
-}
-
-TEST_F(RtcpSenderTest, TmmbrIncludedInCompoundPacketIfEnabled) {
-  const unsigned int kBitrateBps = 312000;
-  rtcp_sender_->SetRTCPStatus(RtcpMode::kCompound);
-  EXPECT_FALSE(rtcp_sender_->TMMBR());
-  rtcp_sender_->SetTMMBRStatus(true);
-  EXPECT_TRUE(rtcp_sender_->TMMBR());
-  rtcp_sender_->SetTargetBitrate(kBitrateBps);
-  EXPECT_EQ(0, rtcp_sender_->SendRTCP(feedback_state(), kRtcpReport));
-  EXPECT_EQ(1, parser()->tmmbr()->num_packets());
-  EXPECT_EQ(1U, parser()->tmmbr()->requests().size());
-  // TMMBR should be included in each compound packet.
-  EXPECT_EQ(0, rtcp_sender_->SendRTCP(feedback_state(), kRtcpReport));
-  EXPECT_EQ(2, parser()->tmmbr()->num_packets());
-
-  rtcp_sender_->SetTMMBRStatus(false);
-  EXPECT_FALSE(rtcp_sender_->TMMBR());
-}
-
-TEST_F(RtcpSenderTest, SendTmmbn) {
-  rtcp_sender_->SetRTCPStatus(RtcpMode::kCompound);
-  rtcp_sender_->SetSendingStatus(feedback_state(), true);
-  std::vector<rtcp::TmmbItem> bounding_set;
-  const uint32_t kBitrateBps = 32768000;
-  const uint32_t kPacketOh = 40;
-  const uint32_t kSourceSsrc = 12345;
-  const rtcp::TmmbItem tmmbn(kSourceSsrc, kBitrateBps, kPacketOh);
-  bounding_set.push_back(tmmbn);
-  rtcp_sender_->SetTmmbn(bounding_set);
-
-  EXPECT_EQ(0, rtcp_sender_->SendRTCP(feedback_state(), kRtcpSr));
-  EXPECT_EQ(1, parser()->sender_report()->num_packets());
-  EXPECT_EQ(1, parser()->tmmbn()->num_packets());
-  EXPECT_EQ(kSenderSsrc, parser()->tmmbn()->sender_ssrc());
-  EXPECT_EQ(1U, parser()->tmmbn()->items().size());
-  EXPECT_EQ(kBitrateBps, parser()->tmmbn()->items()[0].bitrate_bps());
-  EXPECT_EQ(kPacketOh, parser()->tmmbn()->items()[0].packet_overhead());
-  EXPECT_EQ(kSourceSsrc, parser()->tmmbn()->items()[0].ssrc());
-}
-
-// This test is written to verify actual behaviour. It does not seem
-// to make much sense to send an empty TMMBN, since there is no place
-// to put an actual limit here. It's just information that no limit
-// is set, which is kind of the starting assumption.
-// See http://code.google.com/p/webrtc/issues/detail?id=468 for one
-// situation where this caused confusion.
-TEST_F(RtcpSenderTest, SendsTmmbnIfSetAndEmpty) {
-  rtcp_sender_->SetRTCPStatus(RtcpMode::kCompound);
-  rtcp_sender_->SetSendingStatus(feedback_state(), true);
-  std::vector<rtcp::TmmbItem> bounding_set;
-  rtcp_sender_->SetTmmbn(bounding_set);
-  EXPECT_EQ(0, rtcp_sender_->SendRTCP(feedback_state(), kRtcpSr));
-  EXPECT_EQ(1, parser()->sender_report()->num_packets());
-  EXPECT_EQ(1, parser()->tmmbn()->num_packets());
-  EXPECT_EQ(kSenderSsrc, parser()->tmmbn()->sender_ssrc());
-  EXPECT_EQ(0U, parser()->tmmbn()->items().size());
-}
-
-TEST_F(RtcpSenderTest, SendCompoundPliRemb) {
-  const int kBitrate = 261011;
-  std::vector<uint32_t> ssrcs;
-  ssrcs.push_back(kRemoteSsrc);
-  rtcp_sender_->SetRTCPStatus(RtcpMode::kCompound);
-  rtcp_sender_->SetREMBData(kBitrate, ssrcs);
-  std::set<RTCPPacketType> packet_types;
-  packet_types.insert(kRtcpRemb);
-  packet_types.insert(kRtcpPli);
-  EXPECT_EQ(0, rtcp_sender_->SendCompoundRTCP(feedback_state(), packet_types));
-  EXPECT_EQ(1, parser()->remb()->num_packets());
-  EXPECT_EQ(1, parser()->pli()->num_packets());
-}
-
-
-// This test is written to verify that BYE is always the last packet
-// type in a RTCP compoud packet.  The rtcp_sender_ is recreated with
-// mock_transport, which is used to check for whether BYE at the end
-// of a RTCP compound packet.
-TEST_F(RtcpSenderTest, ByeMustBeLast) {
-  MockTransport mock_transport;
-  EXPECT_CALL(mock_transport, SendRtcp(_, _))
-    .WillOnce(Invoke([](const uint8_t* data, size_t len) {
-    const uint8_t* next_packet = data;
-    const uint8_t* const packet_end = data + len;
-    rtcp::CommonHeader packet;
-    while (next_packet < packet_end) {
-      EXPECT_TRUE(packet.Parse(next_packet, packet_end - next_packet));
-      next_packet = packet.NextPacket();
-      if (packet.type() == rtcp::Bye::kPacketType)  // Main test expectation.
-        EXPECT_EQ(0, packet_end - next_packet)
-            << "Bye packet should be last in a compound RTCP packet.";
-      if (next_packet == packet_end)  // Validate test was set correctly.
-        EXPECT_EQ(packet.type(), rtcp::Bye::kPacketType)
-            << "Last packet in this test expected to be Bye.";
-    }
-
-    return true;
-  }));
-
-  // Re-configure rtcp_sender_ with mock_transport_
-  rtcp_sender_.reset(new RTCPSender(false, &clock_, receive_statistics_.get(),
-                                    nullptr, nullptr, &mock_transport));
-  rtcp_sender_->SetSSRC(kSenderSsrc);
-  rtcp_sender_->SetRemoteSSRC(kRemoteSsrc);
-  rtcp_sender_->SetTimestampOffset(kStartRtpTimestamp);
-  rtcp_sender_->SetLastRtpTime(kRtpTimestamp, clock_.TimeInMilliseconds());
-
-  // Set up XR VoIP metric to be included with BYE
-  rtcp_sender_->SetRTCPStatus(RtcpMode::kCompound);
-  RTCPVoIPMetric metric;
-  EXPECT_EQ(0, rtcp_sender_->SetRTCPVoIPMetrics(&metric));
-  EXPECT_EQ(0, rtcp_sender_->SendRTCP(feedback_state(), kRtcpBye));
-}
-
-TEST_F(RtcpSenderTest, SendXrWithTargetBitrate) {
-  rtcp_sender_->SetRTCPStatus(RtcpMode::kCompound);
-  const size_t kNumSpatialLayers = 2;
-  const size_t kNumTemporalLayers = 2;
-  BitrateAllocation allocation;
-  for (size_t sl = 0; sl < kNumSpatialLayers; ++sl) {
-    uint32_t start_bitrate_bps = (sl + 1) * 100000;
-    for (size_t tl = 0; tl < kNumTemporalLayers; ++tl)
-      allocation.SetBitrate(sl, tl, start_bitrate_bps + (tl * 20000));
-  }
-  rtcp_sender_->SetVideoBitrateAllocation(allocation);
-
-  EXPECT_EQ(0, rtcp_sender_->SendRTCP(feedback_state(), kRtcpReport));
-  EXPECT_EQ(1, parser()->xr()->num_packets());
-  EXPECT_EQ(kSenderSsrc, parser()->xr()->sender_ssrc());
-  const rtc::Optional<rtcp::TargetBitrate>& target_bitrate =
-      parser()->xr()->target_bitrate();
-  ASSERT_TRUE(target_bitrate);
-  const std::vector<rtcp::TargetBitrate::BitrateItem>& bitrates =
-      target_bitrate->GetTargetBitrates();
-  EXPECT_EQ(kNumSpatialLayers * kNumTemporalLayers, bitrates.size());
-
-  for (size_t sl = 0; sl < kNumSpatialLayers; ++sl) {
-    uint32_t start_bitrate_bps = (sl + 1) * 100000;
-    for (size_t tl = 0; tl < kNumTemporalLayers; ++tl) {
-      size_t index = (sl * kNumSpatialLayers) + tl;
-      const rtcp::TargetBitrate::BitrateItem& item = bitrates[index];
-      EXPECT_EQ(sl, item.spatial_layer);
-      EXPECT_EQ(tl, item.temporal_layer);
-      EXPECT_EQ(start_bitrate_bps + (tl * 20000),
-                item.target_bitrate_kbps * 1000);
-    }
-  }
-}
-
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/rtp_fec_unittest.cc b/modules/rtp_rtcp/source/rtp_fec_unittest.cc
deleted file mode 100644
index 99f1669..0000000
--- a/modules/rtp_rtcp/source/rtp_fec_unittest.cc
+++ /dev/null
@@ -1,1035 +0,0 @@
-/*
- *  Copyright (c) 2012 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 <algorithm>
-#include <list>
-#include <memory>
-
-#include "webrtc/modules/rtp_rtcp/source/byte_io.h"
-#include "webrtc/modules/rtp_rtcp/source/fec_test_helper.h"
-#include "webrtc/modules/rtp_rtcp/source/flexfec_header_reader_writer.h"
-#include "webrtc/modules/rtp_rtcp/source/forward_error_correction.h"
-#include "webrtc/modules/rtp_rtcp/source/ulpfec_header_reader_writer.h"
-#include "webrtc/rtc_base/basictypes.h"
-#include "webrtc/rtc_base/random.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-namespace {
-
-// Transport header size in bytes. Assume UDP/IPv4 as a reasonable minimum.
-constexpr size_t kTransportOverhead = 28;
-
-constexpr uint32_t kMediaSsrc = 83542;
-constexpr uint32_t kFlexfecSsrc = 43245;
-
-// Deep copies |src| to |dst|, but only keeps every Nth packet.
-void DeepCopyEveryNthPacket(const ForwardErrorCorrection::PacketList& src,
-                            int n,
-                            ForwardErrorCorrection::PacketList* dst) {
-  RTC_DCHECK_GT(n, 0);
-  int i = 0;
-  for (const auto& packet : src) {
-    if (i % n == 0) {
-      dst->emplace_back(new ForwardErrorCorrection::Packet(*packet));
-    }
-    ++i;
-  }
-}
-
-}  // namespace
-
-using ::testing::Types;
-
-template <typename ForwardErrorCorrectionType>
-class RtpFecTest : public ::testing::Test {
- protected:
-  RtpFecTest()
-      : random_(0xabcdef123456),
-        media_packet_generator_(
-            kRtpHeaderSize,  // Minimum packet size.
-            IP_PACKET_SIZE - kRtpHeaderSize - kTransportOverhead -
-                fec_.MaxPacketOverhead(),  // Maximum packet size.
-            kMediaSsrc,
-            &random_) {}
-
-  // Construct |received_packets_|: a subset of the media and FEC packets.
-  //
-  // Media packet "i" is lost if media_loss_mask_[i] = 1, received if
-  // media_loss_mask_[i] = 0.
-  // FEC packet "i" is lost if fec_loss_mask_[i] = 1, received if
-  // fec_loss_mask_[i] = 0.
-  void NetworkReceivedPackets(int* media_loss_mask, int* fec_loss_mask);
-
-  // Add packet from |packet_list| to list of received packets, using the
-  // |loss_mask|.
-  // The |packet_list| may be a media packet list (is_fec = false), or a
-  // FEC packet list (is_fec = true).
-  template <typename T>
-  void ReceivedPackets(const T& packet_list, int* loss_mask, bool is_fec);
-
-  // Check for complete recovery after FEC decoding.
-  bool IsRecoveryComplete();
-
-  ForwardErrorCorrectionType fec_;
-
-  Random random_;
-  test::fec::MediaPacketGenerator media_packet_generator_;
-
-  ForwardErrorCorrection::PacketList media_packets_;
-  std::list<ForwardErrorCorrection::Packet*> generated_fec_packets_;
-  ForwardErrorCorrection::ReceivedPacketList received_packets_;
-  ForwardErrorCorrection::RecoveredPacketList recovered_packets_;
-
-  int media_loss_mask_[kUlpfecMaxMediaPackets];
-  int fec_loss_mask_[kUlpfecMaxMediaPackets];
-};
-
-template <typename ForwardErrorCorrectionType>
-void RtpFecTest<ForwardErrorCorrectionType>::NetworkReceivedPackets(
-    int* media_loss_mask,
-    int* fec_loss_mask) {
-  constexpr bool kFecPacket = true;
-  ReceivedPackets(media_packets_, media_loss_mask, !kFecPacket);
-  ReceivedPackets(generated_fec_packets_, fec_loss_mask, kFecPacket);
-}
-
-template <typename ForwardErrorCorrectionType>
-template <typename PacketListType>
-void RtpFecTest<ForwardErrorCorrectionType>::ReceivedPackets(
-    const PacketListType& packet_list,
-    int* loss_mask,
-    bool is_fec) {
-  uint16_t fec_seq_num = ForwardErrorCorrectionType::GetFirstFecSeqNum(
-      media_packet_generator_.GetNextSeqNum());
-  int packet_idx = 0;
-
-  for (const auto& packet : packet_list) {
-    if (loss_mask[packet_idx] == 0) {
-      std::unique_ptr<ForwardErrorCorrection::ReceivedPacket> received_packet(
-          new ForwardErrorCorrection::ReceivedPacket());
-      received_packet->pkt = new ForwardErrorCorrection::Packet();
-      received_packet->pkt->length = packet->length;
-      memcpy(received_packet->pkt->data, packet->data, packet->length);
-      received_packet->is_fec = is_fec;
-      if (!is_fec) {
-        received_packet->ssrc = kMediaSsrc;
-        // For media packets, the sequence number is obtained from the
-        // RTP header as written by MediaPacketGenerator::ConstructMediaPackets.
-        received_packet->seq_num =
-            ByteReader<uint16_t>::ReadBigEndian(&packet->data[2]);
-      } else {
-        received_packet->ssrc = ForwardErrorCorrectionType::kFecSsrc;
-        // For FEC packets, we simulate the sequence numbers differently
-        // depending on if ULPFEC or FlexFEC is used. See the definition of
-        // ForwardErrorCorrectionType::GetFirstFecSeqNum.
-        received_packet->seq_num = fec_seq_num;
-      }
-      received_packets_.push_back(std::move(received_packet));
-    }
-    packet_idx++;
-    // Sequence number of FEC packets are defined as increment by 1 from
-    // last media packet in frame.
-    if (is_fec)
-      fec_seq_num++;
-  }
-}
-
-template <typename ForwardErrorCorrectionType>
-bool RtpFecTest<ForwardErrorCorrectionType>::IsRecoveryComplete() {
-  // We must have equally many recovered packets as original packets.
-  if (recovered_packets_.size() != media_packets_.size()) {
-    return false;
-  }
-
-  // All recovered packets must be identical to the corresponding
-  // original packets.
-  auto cmp = [](
-      const std::unique_ptr<ForwardErrorCorrection::Packet>& media_packet,
-      const std::unique_ptr<ForwardErrorCorrection::RecoveredPacket>&
-          recovered_packet) {
-    if (media_packet->length != recovered_packet->pkt->length) {
-      return false;
-    }
-    if (memcmp(media_packet->data, recovered_packet->pkt->data,
-               media_packet->length) != 0) {
-      return false;
-    }
-    return true;
-  };
-  return std::equal(media_packets_.cbegin(), media_packets_.cend(),
-                    recovered_packets_.cbegin(), cmp);
-}
-
-// Define gTest typed test to loop over both ULPFEC and FlexFEC.
-// Since the tests now are parameterized, we need to access
-// member variables using |this|, thereby enforcing runtime
-// resolution.
-
-class FlexfecForwardErrorCorrection : public ForwardErrorCorrection {
- public:
-  static const uint32_t kFecSsrc = kFlexfecSsrc;
-
-  FlexfecForwardErrorCorrection()
-      : ForwardErrorCorrection(
-            std::unique_ptr<FecHeaderReader>(new FlexfecHeaderReader()),
-            std::unique_ptr<FecHeaderWriter>(new FlexfecHeaderWriter()),
-            kFecSsrc,
-            kMediaSsrc) {}
-
-  // For FlexFEC we let the FEC packet sequence numbers be independent of
-  // the media packet sequence numbers.
-  static uint16_t GetFirstFecSeqNum(uint16_t next_media_seq_num) {
-    Random random(0xbe110);
-    return random.Rand<uint16_t>();
-  }
-};
-
-class UlpfecForwardErrorCorrection : public ForwardErrorCorrection {
- public:
-  static const uint32_t kFecSsrc = kMediaSsrc;
-
-  UlpfecForwardErrorCorrection()
-      : ForwardErrorCorrection(
-            std::unique_ptr<FecHeaderReader>(new UlpfecHeaderReader()),
-            std::unique_ptr<FecHeaderWriter>(new UlpfecHeaderWriter()),
-            kFecSsrc,
-            kMediaSsrc) {}
-
-  // For ULPFEC we assume that the FEC packets are subsequent to the media
-  // packets in terms of sequence number.
-  static uint16_t GetFirstFecSeqNum(uint16_t next_media_seq_num) {
-    return next_media_seq_num;
-  }
-};
-
-using FecTypes =
-    Types<FlexfecForwardErrorCorrection, UlpfecForwardErrorCorrection>;
-TYPED_TEST_CASE(RtpFecTest, FecTypes);
-
-TYPED_TEST(RtpFecTest, FecRecoveryNoLoss) {
-  constexpr int kNumImportantPackets = 0;
-  constexpr bool kUseUnequalProtection = false;
-  constexpr int kNumMediaPackets = 4;
-  constexpr uint8_t kProtectionFactor = 60;
-
-  this->media_packets_ =
-      this->media_packet_generator_.ConstructMediaPackets(kNumMediaPackets);
-
-  EXPECT_EQ(
-      0, this->fec_.EncodeFec(this->media_packets_, kProtectionFactor,
-                              kNumImportantPackets, kUseUnequalProtection,
-                              kFecMaskBursty, &this->generated_fec_packets_));
-
-  // Expect 1 FEC packet.
-  EXPECT_EQ(1u, this->generated_fec_packets_.size());
-
-  // No packets lost.
-  memset(this->media_loss_mask_, 0, sizeof(this->media_loss_mask_));
-  memset(this->fec_loss_mask_, 0, sizeof(this->fec_loss_mask_));
-  this->NetworkReceivedPackets(this->media_loss_mask_, this->fec_loss_mask_);
-
-  EXPECT_EQ(0, this->fec_.DecodeFec(&this->received_packets_,
-                                    &this->recovered_packets_));
-
-  // No packets lost, expect complete recovery.
-  EXPECT_TRUE(this->IsRecoveryComplete());
-}
-
-TYPED_TEST(RtpFecTest, FecRecoveryWithLoss) {
-  constexpr int kNumImportantPackets = 0;
-  constexpr bool kUseUnequalProtection = false;
-  constexpr int kNumMediaPackets = 4;
-  constexpr uint8_t kProtectionFactor = 60;
-
-  this->media_packets_ =
-      this->media_packet_generator_.ConstructMediaPackets(kNumMediaPackets);
-
-  EXPECT_EQ(
-      0, this->fec_.EncodeFec(this->media_packets_, kProtectionFactor,
-                              kNumImportantPackets, kUseUnequalProtection,
-                              kFecMaskBursty, &this->generated_fec_packets_));
-
-  // Expect 1 FEC packet.
-  EXPECT_EQ(1u, this->generated_fec_packets_.size());
-
-  // 1 media packet lost
-  memset(this->media_loss_mask_, 0, sizeof(this->media_loss_mask_));
-  memset(this->fec_loss_mask_, 0, sizeof(this->fec_loss_mask_));
-  this->media_loss_mask_[3] = 1;
-  this->NetworkReceivedPackets(this->media_loss_mask_, this->fec_loss_mask_);
-
-  EXPECT_EQ(0, this->fec_.DecodeFec(&this->received_packets_,
-                                    &this->recovered_packets_));
-
-  // One packet lost, one FEC packet, expect complete recovery.
-  EXPECT_TRUE(this->IsRecoveryComplete());
-  this->recovered_packets_.clear();
-
-  // 2 media packets lost.
-  memset(this->media_loss_mask_, 0, sizeof(this->media_loss_mask_));
-  memset(this->fec_loss_mask_, 0, sizeof(this->fec_loss_mask_));
-  this->media_loss_mask_[1] = 1;
-  this->media_loss_mask_[3] = 1;
-  this->NetworkReceivedPackets(this->media_loss_mask_, this->fec_loss_mask_);
-
-  EXPECT_EQ(0, this->fec_.DecodeFec(&this->received_packets_,
-                                    &this->recovered_packets_));
-
-  // 2 packets lost, one FEC packet, cannot get complete recovery.
-  EXPECT_FALSE(this->IsRecoveryComplete());
-}
-
-// Verify that we don't use an old FEC packet for FEC decoding.
-TYPED_TEST(RtpFecTest, FecRecoveryWithSeqNumGapTwoFrames) {
-  constexpr int kNumImportantPackets = 0;
-  constexpr bool kUseUnequalProtection = false;
-  constexpr uint8_t kProtectionFactor = 20;
-
-  // Two frames: first frame (old) with two media packets and 1 FEC packet.
-  // Second frame (new) with 3 media packets, and no FEC packets.
-  //       ---Frame 1----                     ----Frame 2------
-  //  #0(media) #1(media) #2(FEC)     #65535(media) #0(media) #1(media).
-  // If we lose either packet 0 or 1 of second frame, FEC decoding should not
-  // try to decode using "old" FEC packet #2.
-
-  // Construct media packets for first frame, starting at sequence number 0.
-  this->media_packets_ =
-      this->media_packet_generator_.ConstructMediaPackets(2, 0);
-
-  EXPECT_EQ(
-      0, this->fec_.EncodeFec(this->media_packets_, kProtectionFactor,
-                              kNumImportantPackets, kUseUnequalProtection,
-                              kFecMaskBursty, &this->generated_fec_packets_));
-  // Expect 1 FEC packet.
-  EXPECT_EQ(1u, this->generated_fec_packets_.size());
-  // Add FEC packet (seq#2) of this first frame to received list (i.e., assume
-  // the two media packet were lost).
-  memset(this->fec_loss_mask_, 0, sizeof(this->fec_loss_mask_));
-  this->ReceivedPackets(this->generated_fec_packets_, this->fec_loss_mask_,
-                        true);
-
-  // Construct media packets for second frame, with sequence number wrap.
-  this->media_packets_ =
-      this->media_packet_generator_.ConstructMediaPackets(3, 65535);
-
-  // Expect 3 media packets for this frame.
-  EXPECT_EQ(3u, this->media_packets_.size());
-
-  // Second media packet lost (seq#0).
-  memset(this->media_loss_mask_, 0, sizeof(this->media_loss_mask_));
-  this->media_loss_mask_[1] = 1;
-  // Add packets #65535, and #1 to received list.
-  this->ReceivedPackets(this->media_packets_, this->media_loss_mask_, false);
-
-  EXPECT_EQ(0, this->fec_.DecodeFec(&this->received_packets_,
-                                    &this->recovered_packets_));
-
-  // Expect that no decoding is done to get missing packet (seq#0) of second
-  // frame, using old FEC packet (seq#2) from first (old) frame. So number of
-  // recovered packets is 2, and not equal to number of media packets (=3).
-  EXPECT_EQ(2u, this->recovered_packets_.size());
-  EXPECT_TRUE(this->recovered_packets_.size() != this->media_packets_.size());
-}
-
-// Verify we can still recover frame if sequence number wrap occurs within
-// the frame and FEC packet following wrap is received after media packets.
-TYPED_TEST(RtpFecTest, FecRecoveryWithSeqNumGapOneFrameRecovery) {
-  constexpr int kNumImportantPackets = 0;
-  constexpr bool kUseUnequalProtection = false;
-  constexpr uint8_t kProtectionFactor = 20;
-
-  // One frame, with sequence number wrap in media packets.
-  //         -----Frame 1----
-  //  #65534(media) #65535(media) #0(media) #1(FEC).
-  this->media_packets_ =
-      this->media_packet_generator_.ConstructMediaPackets(3, 65534);
-
-  EXPECT_EQ(
-      0, this->fec_.EncodeFec(this->media_packets_, kProtectionFactor,
-                              kNumImportantPackets, kUseUnequalProtection,
-                              kFecMaskBursty, &this->generated_fec_packets_));
-
-  // Expect 1 FEC packet.
-  EXPECT_EQ(1u, this->generated_fec_packets_.size());
-
-  // Lose one media packet (seq# 65535).
-  memset(this->media_loss_mask_, 0, sizeof(this->media_loss_mask_));
-  memset(this->fec_loss_mask_, 0, sizeof(this->fec_loss_mask_));
-  this->media_loss_mask_[1] = 1;
-  this->ReceivedPackets(this->media_packets_, this->media_loss_mask_, false);
-  // Add FEC packet to received list following the media packets.
-  this->ReceivedPackets(this->generated_fec_packets_, this->fec_loss_mask_,
-                        true);
-
-  EXPECT_EQ(0, this->fec_.DecodeFec(&this->received_packets_,
-                                    &this->recovered_packets_));
-
-  // Expect 3 media packets in recovered list, and complete recovery.
-  // Wrap-around won't remove FEC packet, as it follows the wrap.
-  EXPECT_EQ(3u, this->recovered_packets_.size());
-  EXPECT_TRUE(this->IsRecoveryComplete());
-}
-
-// Sequence number wrap occurs within the ULPFEC packets for the frame.
-// In this case we will discard ULPFEC packet and full recovery is not expected.
-// Same problem will occur if wrap is within media packets but ULPFEC packet is
-// received before the media packets. This may be improved if timing information
-// is used to detect old ULPFEC packets.
-// TODO(marpan): Update test if wrap-around handling changes in FEC decoding.
-using RtpFecTestUlpfecOnly = RtpFecTest<UlpfecForwardErrorCorrection>;
-TEST_F(RtpFecTestUlpfecOnly, FecRecoveryWithSeqNumGapOneFrameNoRecovery) {
-  constexpr int kNumImportantPackets = 0;
-  constexpr bool kUseUnequalProtection = false;
-  constexpr uint8_t kProtectionFactor = 200;
-
-  // 1 frame: 3 media packets and 2 FEC packets.
-  // Sequence number wrap in FEC packets.
-  //           -----Frame 1----
-  // #65532(media) #65533(media) #65534(media) #65535(FEC) #0(FEC).
-  this->media_packets_ =
-      this->media_packet_generator_.ConstructMediaPackets(3, 65532);
-
-  EXPECT_EQ(
-      0, this->fec_.EncodeFec(this->media_packets_, kProtectionFactor,
-                              kNumImportantPackets, kUseUnequalProtection,
-                              kFecMaskBursty, &this->generated_fec_packets_));
-
-  // Expect 2 FEC packets.
-  EXPECT_EQ(2u, this->generated_fec_packets_.size());
-
-  // Lose the last two media packets (seq# 65533, 65534).
-  memset(this->media_loss_mask_, 0, sizeof(this->media_loss_mask_));
-  memset(this->fec_loss_mask_, 0, sizeof(this->fec_loss_mask_));
-  this->media_loss_mask_[1] = 1;
-  this->media_loss_mask_[2] = 1;
-  this->ReceivedPackets(this->media_packets_, this->media_loss_mask_, false);
-  this->ReceivedPackets(this->generated_fec_packets_, this->fec_loss_mask_,
-                        true);
-
-  EXPECT_EQ(0, this->fec_.DecodeFec(&this->received_packets_,
-                                    &this->recovered_packets_));
-
-  // The two FEC packets are received and should allow for complete recovery,
-  // but because of the wrap the first FEC packet will be discarded, and only
-  // one media packet is recoverable. So expect 2 media packets on recovered
-  // list and no complete recovery.
-  EXPECT_EQ(2u, this->recovered_packets_.size());
-  EXPECT_TRUE(this->recovered_packets_.size() != this->media_packets_.size());
-  EXPECT_FALSE(this->IsRecoveryComplete());
-}
-
-// TODO(brandtr): This test mimics the one above, ensuring that the recovery
-// strategy of FlexFEC matches the recovery strategy of ULPFEC. Since FlexFEC
-// does not share the sequence number space with the media, however, having a
-// matching recovery strategy may be suboptimal. Study this further.
-using RtpFecTestFlexfecOnly = RtpFecTest<FlexfecForwardErrorCorrection>;
-TEST_F(RtpFecTestFlexfecOnly, FecRecoveryWithSeqNumGapOneFrameNoRecovery) {
-  constexpr int kNumImportantPackets = 0;
-  constexpr bool kUseUnequalProtection = false;
-  constexpr uint8_t kProtectionFactor = 200;
-
-  // 1 frame: 3 media packets and 2 FEC packets.
-  // Sequence number wrap in FEC packets.
-  //           -----Frame 1----
-  // #65532(media) #65533(media) #65534(media) #65535(FEC) #0(FEC).
-  this->media_packets_ =
-      this->media_packet_generator_.ConstructMediaPackets(3, 65532);
-
-  EXPECT_EQ(
-      0, this->fec_.EncodeFec(this->media_packets_, kProtectionFactor,
-                              kNumImportantPackets, kUseUnequalProtection,
-                              kFecMaskBursty, &this->generated_fec_packets_));
-
-  // Expect 2 FEC packets.
-  EXPECT_EQ(2u, this->generated_fec_packets_.size());
-
-  // Overwrite the sequence numbers generated by ConstructMediaPackets,
-  // to make sure that we do have a wrap.
-  auto it = this->generated_fec_packets_.begin();
-  ByteWriter<uint16_t>::WriteBigEndian(&(*it)->data[2], 65535);
-  ++it;
-  ByteWriter<uint16_t>::WriteBigEndian(&(*it)->data[2], 0);
-
-  // Lose the last two media packets (seq# 65533, 65534).
-  memset(this->media_loss_mask_, 0, sizeof(this->media_loss_mask_));
-  memset(this->fec_loss_mask_, 0, sizeof(this->fec_loss_mask_));
-  this->media_loss_mask_[1] = 1;
-  this->media_loss_mask_[2] = 1;
-  this->ReceivedPackets(this->media_packets_, this->media_loss_mask_, false);
-  this->ReceivedPackets(this->generated_fec_packets_, this->fec_loss_mask_,
-                        true);
-
-  EXPECT_EQ(0, this->fec_.DecodeFec(&this->received_packets_,
-                                    &this->recovered_packets_));
-
-  // The two FEC packets are received and should allow for complete recovery,
-  // but because of the wrap the first FEC packet will be discarded, and only
-  // one media packet is recoverable. So expect 2 media packets on recovered
-  // list and no complete recovery.
-  EXPECT_EQ(2u, this->recovered_packets_.size());
-  EXPECT_TRUE(this->recovered_packets_.size() != this->media_packets_.size());
-  EXPECT_FALSE(this->IsRecoveryComplete());
-}
-
-// Verify we can still recover frame if media packets are reordered.
-TYPED_TEST(RtpFecTest, FecRecoveryWithMediaOutOfOrder) {
-  constexpr int kNumImportantPackets = 0;
-  constexpr bool kUseUnequalProtection = false;
-  constexpr uint8_t kProtectionFactor = 20;
-
-  // One frame: 3 media packets, 1 FEC packet.
-  //         -----Frame 1----
-  //  #0(media) #1(media) #2(media) #3(FEC).
-  this->media_packets_ =
-      this->media_packet_generator_.ConstructMediaPackets(3, 0);
-
-  EXPECT_EQ(
-      0, this->fec_.EncodeFec(this->media_packets_, kProtectionFactor,
-                              kNumImportantPackets, kUseUnequalProtection,
-                              kFecMaskBursty, &this->generated_fec_packets_));
-
-  // Expect 1 FEC packet.
-  EXPECT_EQ(1u, this->generated_fec_packets_.size());
-
-  // Lose one media packet (seq# 1).
-  memset(this->media_loss_mask_, 0, sizeof(this->media_loss_mask_));
-  memset(this->fec_loss_mask_, 0, sizeof(this->fec_loss_mask_));
-  this->media_loss_mask_[1] = 1;
-  this->NetworkReceivedPackets(this->media_loss_mask_, this->fec_loss_mask_);
-
-  // Reorder received media packets.
-  auto it0 = this->received_packets_.begin();
-  auto it1 = this->received_packets_.begin();
-  it1++;
-  std::swap(*it0, *it1);
-
-  EXPECT_EQ(0, this->fec_.DecodeFec(&this->received_packets_,
-                                    &this->recovered_packets_));
-
-  // Expect 3 media packets in recovered list, and complete recovery.
-  EXPECT_EQ(3u, this->recovered_packets_.size());
-  EXPECT_TRUE(this->IsRecoveryComplete());
-}
-
-// Verify we can still recover frame if FEC is received before media packets.
-TYPED_TEST(RtpFecTest, FecRecoveryWithFecOutOfOrder) {
-  constexpr int kNumImportantPackets = 0;
-  constexpr bool kUseUnequalProtection = false;
-  constexpr uint8_t kProtectionFactor = 20;
-
-  // One frame: 3 media packets, 1 FEC packet.
-  //         -----Frame 1----
-  //  #0(media) #1(media) #2(media) #3(FEC).
-  this->media_packets_ =
-      this->media_packet_generator_.ConstructMediaPackets(3, 0);
-
-  EXPECT_EQ(
-      0, this->fec_.EncodeFec(this->media_packets_, kProtectionFactor,
-                              kNumImportantPackets, kUseUnequalProtection,
-                              kFecMaskBursty, &this->generated_fec_packets_));
-
-  // Expect 1 FEC packet.
-  EXPECT_EQ(1u, this->generated_fec_packets_.size());
-
-  // Lose one media packet (seq# 1).
-  memset(this->media_loss_mask_, 0, sizeof(this->media_loss_mask_));
-  memset(this->fec_loss_mask_, 0, sizeof(this->fec_loss_mask_));
-  this->media_loss_mask_[1] = 1;
-  // Add FEC packet to received list before the media packets.
-  this->ReceivedPackets(this->generated_fec_packets_, this->fec_loss_mask_,
-                        true);
-  // Add media packets to received list.
-  this->ReceivedPackets(this->media_packets_, this->media_loss_mask_, false);
-
-  EXPECT_EQ(0, this->fec_.DecodeFec(&this->received_packets_,
-                                    &this->recovered_packets_));
-
-  // Expect 3 media packets in recovered list, and complete recovery.
-  EXPECT_EQ(3u, this->recovered_packets_.size());
-  EXPECT_TRUE(this->IsRecoveryComplete());
-}
-
-// Test 50% protection with random mask type: Two cases are considered:
-// a 50% non-consecutive loss which can be fully recovered, and a 50%
-// consecutive loss which cannot be fully recovered.
-TYPED_TEST(RtpFecTest, FecRecoveryWithLoss50percRandomMask) {
-  constexpr int kNumImportantPackets = 0;
-  constexpr bool kUseUnequalProtection = false;
-  constexpr int kNumMediaPackets = 4;
-  constexpr uint8_t kProtectionFactor = 255;
-
-  // Packet Mask for (4,4,0) code, from random mask table.
-  // (kNumMediaPackets = 4; num_fec_packets = 4, kNumImportantPackets = 0)
-
-  //         media#0   media#1  media#2    media#3
-  // fec#0:    1          1        0          0
-  // fec#1:    1          0        1          0
-  // fec#2:    0          0        1          1
-  // fec#3:    0          1        0          1
-  //
-
-  this->media_packets_ =
-      this->media_packet_generator_.ConstructMediaPackets(kNumMediaPackets);
-
-  EXPECT_EQ(
-      0, this->fec_.EncodeFec(this->media_packets_, kProtectionFactor,
-                              kNumImportantPackets, kUseUnequalProtection,
-                              kFecMaskRandom, &this->generated_fec_packets_));
-
-  // Expect 4 FEC packets.
-  EXPECT_EQ(4u, this->generated_fec_packets_.size());
-
-  // 4 packets lost: 3 media packets (0, 2, 3), and one FEC packet (0) lost.
-  memset(this->media_loss_mask_, 0, sizeof(this->media_loss_mask_));
-  memset(this->fec_loss_mask_, 0, sizeof(this->fec_loss_mask_));
-  this->fec_loss_mask_[0] = 1;
-  this->media_loss_mask_[0] = 1;
-  this->media_loss_mask_[2] = 1;
-  this->media_loss_mask_[3] = 1;
-  this->NetworkReceivedPackets(this->media_loss_mask_, this->fec_loss_mask_);
-
-  EXPECT_EQ(0, this->fec_.DecodeFec(&this->received_packets_,
-                                    &this->recovered_packets_));
-
-  // With media packet#1 and FEC packets #1, #2, #3, expect complete recovery.
-  EXPECT_TRUE(this->IsRecoveryComplete());
-  this->recovered_packets_.clear();
-
-  // 4 consecutive packets lost: media packets 0, 1, 2, 3.
-  memset(this->media_loss_mask_, 0, sizeof(this->media_loss_mask_));
-  memset(this->fec_loss_mask_, 0, sizeof(this->fec_loss_mask_));
-  this->media_loss_mask_[0] = 1;
-  this->media_loss_mask_[1] = 1;
-  this->media_loss_mask_[2] = 1;
-  this->media_loss_mask_[3] = 1;
-  this->NetworkReceivedPackets(this->media_loss_mask_, this->fec_loss_mask_);
-
-  EXPECT_EQ(0, this->fec_.DecodeFec(&this->received_packets_,
-                                    &this->recovered_packets_));
-
-  // Cannot get complete recovery for this loss configuration with random mask.
-  EXPECT_FALSE(this->IsRecoveryComplete());
-}
-
-// Test 50% protection with bursty type: Three cases are considered:
-// two 50% consecutive losses which can be fully recovered, and one
-// non-consecutive which cannot be fully recovered.
-TYPED_TEST(RtpFecTest, FecRecoveryWithLoss50percBurstyMask) {
-  constexpr int kNumImportantPackets = 0;
-  constexpr bool kUseUnequalProtection = false;
-  constexpr int kNumMediaPackets = 4;
-  constexpr uint8_t kProtectionFactor = 255;
-
-  // Packet Mask for (4,4,0) code, from bursty mask table.
-  // (kNumMediaPackets = 4; num_fec_packets = 4, kNumImportantPackets = 0)
-
-  //         media#0   media#1  media#2    media#3
-  // fec#0:    1          0        0          0
-  // fec#1:    1          1        0          0
-  // fec#2:    0          1        1          0
-  // fec#3:    0          0        1          1
-  //
-
-  this->media_packets_ =
-      this->media_packet_generator_.ConstructMediaPackets(kNumMediaPackets);
-
-  EXPECT_EQ(
-      0, this->fec_.EncodeFec(this->media_packets_, kProtectionFactor,
-                              kNumImportantPackets, kUseUnequalProtection,
-                              kFecMaskBursty, &this->generated_fec_packets_));
-
-  // Expect 4 FEC packets.
-  EXPECT_EQ(4u, this->generated_fec_packets_.size());
-
-  // 4 consecutive packets lost: media packets 0,1,2,3.
-  memset(this->media_loss_mask_, 0, sizeof(this->media_loss_mask_));
-  memset(this->fec_loss_mask_, 0, sizeof(this->fec_loss_mask_));
-  this->media_loss_mask_[0] = 1;
-  this->media_loss_mask_[1] = 1;
-  this->media_loss_mask_[2] = 1;
-  this->media_loss_mask_[3] = 1;
-  this->NetworkReceivedPackets(this->media_loss_mask_, this->fec_loss_mask_);
-
-  EXPECT_EQ(0, this->fec_.DecodeFec(&this->received_packets_,
-                                    &this->recovered_packets_));
-
-  // Expect complete recovery for consecutive packet loss <= 50%.
-  EXPECT_TRUE(this->IsRecoveryComplete());
-  this->recovered_packets_.clear();
-
-  // 4 consecutive packets lost: media packets 1,2, 3, and FEC packet 0.
-  memset(this->media_loss_mask_, 0, sizeof(this->media_loss_mask_));
-  memset(this->fec_loss_mask_, 0, sizeof(this->fec_loss_mask_));
-  this->fec_loss_mask_[0] = 1;
-  this->media_loss_mask_[1] = 1;
-  this->media_loss_mask_[2] = 1;
-  this->media_loss_mask_[3] = 1;
-  this->NetworkReceivedPackets(this->media_loss_mask_, this->fec_loss_mask_);
-
-  EXPECT_EQ(0, this->fec_.DecodeFec(&this->received_packets_,
-                                    &this->recovered_packets_));
-
-  // Expect complete recovery for consecutive packet loss <= 50%.
-  EXPECT_TRUE(this->IsRecoveryComplete());
-  this->recovered_packets_.clear();
-
-  // 4 packets lost (non-consecutive loss): media packets 0, 3, and FEC# 0, 3.
-  memset(this->media_loss_mask_, 0, sizeof(this->media_loss_mask_));
-  memset(this->fec_loss_mask_, 0, sizeof(this->fec_loss_mask_));
-  this->fec_loss_mask_[0] = 1;
-  this->fec_loss_mask_[3] = 1;
-  this->media_loss_mask_[0] = 1;
-  this->media_loss_mask_[3] = 1;
-  this->NetworkReceivedPackets(this->media_loss_mask_, this->fec_loss_mask_);
-
-  EXPECT_EQ(0, this->fec_.DecodeFec(&this->received_packets_,
-                                    &this->recovered_packets_));
-
-  // Cannot get complete recovery for this loss configuration.
-  EXPECT_FALSE(this->IsRecoveryComplete());
-}
-
-TYPED_TEST(RtpFecTest, FecRecoveryNoLossUep) {
-  constexpr int kNumImportantPackets = 2;
-  constexpr bool kUseUnequalProtection = true;
-  constexpr int kNumMediaPackets = 4;
-  constexpr uint8_t kProtectionFactor = 60;
-
-  this->media_packets_ =
-      this->media_packet_generator_.ConstructMediaPackets(kNumMediaPackets);
-
-  EXPECT_EQ(
-      0, this->fec_.EncodeFec(this->media_packets_, kProtectionFactor,
-                              kNumImportantPackets, kUseUnequalProtection,
-                              kFecMaskBursty, &this->generated_fec_packets_));
-
-  // Expect 1 FEC packet.
-  EXPECT_EQ(1u, this->generated_fec_packets_.size());
-
-  // No packets lost.
-  memset(this->media_loss_mask_, 0, sizeof(this->media_loss_mask_));
-  memset(this->fec_loss_mask_, 0, sizeof(this->fec_loss_mask_));
-  this->NetworkReceivedPackets(this->media_loss_mask_, this->fec_loss_mask_);
-
-  EXPECT_EQ(0, this->fec_.DecodeFec(&this->received_packets_,
-                                    &this->recovered_packets_));
-
-  // No packets lost, expect complete recovery.
-  EXPECT_TRUE(this->IsRecoveryComplete());
-}
-
-TYPED_TEST(RtpFecTest, FecRecoveryWithLossUep) {
-  constexpr int kNumImportantPackets = 2;
-  constexpr bool kUseUnequalProtection = true;
-  constexpr int kNumMediaPackets = 4;
-  constexpr uint8_t kProtectionFactor = 60;
-
-  this->media_packets_ =
-      this->media_packet_generator_.ConstructMediaPackets(kNumMediaPackets);
-
-  EXPECT_EQ(
-      0, this->fec_.EncodeFec(this->media_packets_, kProtectionFactor,
-                              kNumImportantPackets, kUseUnequalProtection,
-                              kFecMaskBursty, &this->generated_fec_packets_));
-
-  // Expect 1 FEC packet.
-  EXPECT_EQ(1u, this->generated_fec_packets_.size());
-
-  // 1 media packet lost.
-  memset(this->media_loss_mask_, 0, sizeof(this->media_loss_mask_));
-  memset(this->fec_loss_mask_, 0, sizeof(this->fec_loss_mask_));
-  this->media_loss_mask_[3] = 1;
-  this->NetworkReceivedPackets(this->media_loss_mask_, this->fec_loss_mask_);
-
-  EXPECT_EQ(0, this->fec_.DecodeFec(&this->received_packets_,
-                                    &this->recovered_packets_));
-
-  // One packet lost, one FEC packet, expect complete recovery.
-  EXPECT_TRUE(this->IsRecoveryComplete());
-  this->recovered_packets_.clear();
-
-  // 2 media packets lost.
-  memset(this->media_loss_mask_, 0, sizeof(this->media_loss_mask_));
-  memset(this->fec_loss_mask_, 0, sizeof(this->fec_loss_mask_));
-  this->media_loss_mask_[1] = 1;
-  this->media_loss_mask_[3] = 1;
-  this->NetworkReceivedPackets(this->media_loss_mask_, this->fec_loss_mask_);
-
-  EXPECT_EQ(0, this->fec_.DecodeFec(&this->received_packets_,
-                                    &this->recovered_packets_));
-
-  // 2 packets lost, one FEC packet, cannot get complete recovery.
-  EXPECT_FALSE(this->IsRecoveryComplete());
-}
-
-// Test 50% protection with random mask type for UEP on.
-TYPED_TEST(RtpFecTest, FecRecoveryWithLoss50percUepRandomMask) {
-  constexpr int kNumImportantPackets = 1;
-  constexpr bool kUseUnequalProtection = true;
-  constexpr int kNumMediaPackets = 4;
-  constexpr uint8_t kProtectionFactor = 255;
-
-  // Packet Mask for (4,4,1) code, from random mask table.
-  // (kNumMediaPackets = 4; num_fec_packets = 4, kNumImportantPackets = 1)
-
-  //         media#0   media#1  media#2    media#3
-  // fec#0:    1          0        0          0
-  // fec#1:    1          1        0          0
-  // fec#2:    1          0        1          1
-  // fec#3:    0          1        1          0
-  //
-
-  this->media_packets_ =
-      this->media_packet_generator_.ConstructMediaPackets(kNumMediaPackets);
-
-  EXPECT_EQ(
-      0, this->fec_.EncodeFec(this->media_packets_, kProtectionFactor,
-                              kNumImportantPackets, kUseUnequalProtection,
-                              kFecMaskRandom, &this->generated_fec_packets_));
-
-  // Expect 4 FEC packets.
-  EXPECT_EQ(4u, this->generated_fec_packets_.size());
-
-  // 4 packets lost: 3 media packets and FEC packet#1 lost.
-  memset(this->media_loss_mask_, 0, sizeof(this->media_loss_mask_));
-  memset(this->fec_loss_mask_, 0, sizeof(this->fec_loss_mask_));
-  this->fec_loss_mask_[1] = 1;
-  this->media_loss_mask_[0] = 1;
-  this->media_loss_mask_[2] = 1;
-  this->media_loss_mask_[3] = 1;
-  this->NetworkReceivedPackets(this->media_loss_mask_, this->fec_loss_mask_);
-
-  EXPECT_EQ(0, this->fec_.DecodeFec(&this->received_packets_,
-                                    &this->recovered_packets_));
-
-  // With media packet#3 and FEC packets #0, #1, #3, expect complete recovery.
-  EXPECT_TRUE(this->IsRecoveryComplete());
-  this->recovered_packets_.clear();
-
-  // 5 packets lost: 4 media packets and one FEC packet#2 lost.
-  memset(this->media_loss_mask_, 0, sizeof(this->media_loss_mask_));
-  memset(this->fec_loss_mask_, 0, sizeof(this->fec_loss_mask_));
-  this->fec_loss_mask_[2] = 1;
-  this->media_loss_mask_[0] = 1;
-  this->media_loss_mask_[1] = 1;
-  this->media_loss_mask_[2] = 1;
-  this->media_loss_mask_[3] = 1;
-  this->NetworkReceivedPackets(this->media_loss_mask_, this->fec_loss_mask_);
-
-  EXPECT_EQ(0, this->fec_.DecodeFec(&this->received_packets_,
-                                    &this->recovered_packets_));
-
-  // Cannot get complete recovery for this loss configuration.
-  EXPECT_FALSE(this->IsRecoveryComplete());
-}
-
-TYPED_TEST(RtpFecTest, FecRecoveryNonConsecutivePackets) {
-  constexpr int kNumImportantPackets = 0;
-  constexpr bool kUseUnequalProtection = false;
-  constexpr int kNumMediaPackets = 5;
-  constexpr uint8_t kProtectionFactor = 60;
-
-  this->media_packets_ =
-      this->media_packet_generator_.ConstructMediaPackets(kNumMediaPackets);
-
-  // Create a new temporary packet list for generating FEC packets.
-  // This list should have every other packet removed.
-  ForwardErrorCorrection::PacketList protected_media_packets;
-  DeepCopyEveryNthPacket(this->media_packets_, 2, &protected_media_packets);
-
-  EXPECT_EQ(
-      0, this->fec_.EncodeFec(protected_media_packets, kProtectionFactor,
-                              kNumImportantPackets, kUseUnequalProtection,
-                              kFecMaskBursty, &this->generated_fec_packets_));
-
-  // Expect 1 FEC packet.
-  EXPECT_EQ(1u, this->generated_fec_packets_.size());
-
-  // 1 protected media packet lost
-  memset(this->media_loss_mask_, 0, sizeof(this->media_loss_mask_));
-  memset(this->fec_loss_mask_, 0, sizeof(this->fec_loss_mask_));
-  this->media_loss_mask_[2] = 1;
-  this->NetworkReceivedPackets(this->media_loss_mask_, this->fec_loss_mask_);
-
-  EXPECT_EQ(0, this->fec_.DecodeFec(&this->received_packets_,
-                                    &this->recovered_packets_));
-
-  // One packet lost, one FEC packet, expect complete recovery.
-  EXPECT_TRUE(this->IsRecoveryComplete());
-  this->recovered_packets_.clear();
-
-  // Unprotected packet lost.
-  memset(this->media_loss_mask_, 0, sizeof(this->media_loss_mask_));
-  memset(this->fec_loss_mask_, 0, sizeof(this->fec_loss_mask_));
-  this->media_loss_mask_[1] = 1;
-  this->NetworkReceivedPackets(this->media_loss_mask_, this->fec_loss_mask_);
-
-  EXPECT_EQ(0, this->fec_.DecodeFec(&this->received_packets_,
-                                    &this->recovered_packets_));
-
-  // Unprotected packet lost. Recovery not possible.
-  EXPECT_FALSE(this->IsRecoveryComplete());
-  this->recovered_packets_.clear();
-
-  // 2 media packets lost.
-  memset(this->media_loss_mask_, 0, sizeof(this->media_loss_mask_));
-  memset(this->fec_loss_mask_, 0, sizeof(this->fec_loss_mask_));
-  this->media_loss_mask_[0] = 1;
-  this->media_loss_mask_[2] = 1;
-  this->NetworkReceivedPackets(this->media_loss_mask_, this->fec_loss_mask_);
-
-  EXPECT_EQ(0, this->fec_.DecodeFec(&this->received_packets_,
-                                    &this->recovered_packets_));
-
-  // 2 protected packets lost, one FEC packet, cannot get complete recovery.
-  EXPECT_FALSE(this->IsRecoveryComplete());
-}
-
-TYPED_TEST(RtpFecTest, FecRecoveryNonConsecutivePacketsExtension) {
-  constexpr int kNumImportantPackets = 0;
-  constexpr bool kUseUnequalProtection = false;
-  constexpr int kNumMediaPackets = 21;
-  uint8_t kProtectionFactor = 127;
-
-  this->media_packets_ =
-      this->media_packet_generator_.ConstructMediaPackets(kNumMediaPackets);
-
-  // Create a new temporary packet list for generating FEC packets.
-  // This list should have every other packet removed.
-  ForwardErrorCorrection::PacketList protected_media_packets;
-  DeepCopyEveryNthPacket(this->media_packets_, 2, &protected_media_packets);
-
-  // Zero column insertion will have to extend the size of the packet
-  // mask since the number of actual packets are 21, while the number
-  // of protected packets are 11.
-  EXPECT_EQ(
-      0, this->fec_.EncodeFec(protected_media_packets, kProtectionFactor,
-                              kNumImportantPackets, kUseUnequalProtection,
-                              kFecMaskBursty, &this->generated_fec_packets_));
-
-  // Expect 5 FEC packet.
-  EXPECT_EQ(5u, this->generated_fec_packets_.size());
-
-  // Last protected media packet lost
-  memset(this->media_loss_mask_, 0, sizeof(this->media_loss_mask_));
-  memset(this->fec_loss_mask_, 0, sizeof(this->fec_loss_mask_));
-  this->media_loss_mask_[kNumMediaPackets - 1] = 1;
-  this->NetworkReceivedPackets(this->media_loss_mask_, this->fec_loss_mask_);
-
-  EXPECT_EQ(0, this->fec_.DecodeFec(&this->received_packets_,
-                                    &this->recovered_packets_));
-
-  // One packet lost, one FEC packet, expect complete recovery.
-  EXPECT_TRUE(this->IsRecoveryComplete());
-  this->recovered_packets_.clear();
-
-  // Last unprotected packet lost.
-  memset(this->media_loss_mask_, 0, sizeof(this->media_loss_mask_));
-  memset(this->fec_loss_mask_, 0, sizeof(this->fec_loss_mask_));
-  this->media_loss_mask_[kNumMediaPackets - 2] = 1;
-  this->NetworkReceivedPackets(this->media_loss_mask_, this->fec_loss_mask_);
-
-  EXPECT_EQ(0, this->fec_.DecodeFec(&this->received_packets_,
-                                    &this->recovered_packets_));
-
-  // Unprotected packet lost. Recovery not possible.
-  EXPECT_FALSE(this->IsRecoveryComplete());
-  this->recovered_packets_.clear();
-
-  // 6 media packets lost.
-  memset(this->media_loss_mask_, 0, sizeof(this->media_loss_mask_));
-  memset(this->fec_loss_mask_, 0, sizeof(this->fec_loss_mask_));
-  this->media_loss_mask_[kNumMediaPackets - 11] = 1;
-  this->media_loss_mask_[kNumMediaPackets - 9] = 1;
-  this->media_loss_mask_[kNumMediaPackets - 7] = 1;
-  this->media_loss_mask_[kNumMediaPackets - 5] = 1;
-  this->media_loss_mask_[kNumMediaPackets - 3] = 1;
-  this->media_loss_mask_[kNumMediaPackets - 1] = 1;
-  this->NetworkReceivedPackets(this->media_loss_mask_, this->fec_loss_mask_);
-
-  EXPECT_EQ(0, this->fec_.DecodeFec(&this->received_packets_,
-                                    &this->recovered_packets_));
-
-  // 5 protected packets lost, one FEC packet, cannot get complete recovery.
-  EXPECT_FALSE(this->IsRecoveryComplete());
-}
-
-TYPED_TEST(RtpFecTest, FecRecoveryNonConsecutivePacketsWrap) {
-  constexpr int kNumImportantPackets = 0;
-  constexpr bool kUseUnequalProtection = false;
-  constexpr int kNumMediaPackets = 21;
-  uint8_t kProtectionFactor = 127;
-
-  this->media_packets_ = this->media_packet_generator_.ConstructMediaPackets(
-      kNumMediaPackets, 0xFFFF - 5);
-
-  // Create a new temporary packet list for generating FEC packets.
-  // This list should have every other packet removed.
-  ForwardErrorCorrection::PacketList protected_media_packets;
-  DeepCopyEveryNthPacket(this->media_packets_, 2, &protected_media_packets);
-
-  // Zero column insertion will have to extend the size of the packet
-  // mask since the number of actual packets are 21, while the number
-  // of protected packets are 11.
-  EXPECT_EQ(
-      0, this->fec_.EncodeFec(protected_media_packets, kProtectionFactor,
-                              kNumImportantPackets, kUseUnequalProtection,
-                              kFecMaskBursty, &this->generated_fec_packets_));
-
-  // Expect 5 FEC packet.
-  EXPECT_EQ(5u, this->generated_fec_packets_.size());
-
-  // Last protected media packet lost
-  memset(this->media_loss_mask_, 0, sizeof(this->media_loss_mask_));
-  memset(this->fec_loss_mask_, 0, sizeof(this->fec_loss_mask_));
-  this->media_loss_mask_[kNumMediaPackets - 1] = 1;
-  this->NetworkReceivedPackets(this->media_loss_mask_, this->fec_loss_mask_);
-
-  EXPECT_EQ(0, this->fec_.DecodeFec(&this->received_packets_,
-                                    &this->recovered_packets_));
-
-  // One packet lost, one FEC packet, expect complete recovery.
-  EXPECT_TRUE(this->IsRecoveryComplete());
-  this->recovered_packets_.clear();
-
-  // Last unprotected packet lost.
-  memset(this->media_loss_mask_, 0, sizeof(this->media_loss_mask_));
-  memset(this->fec_loss_mask_, 0, sizeof(this->fec_loss_mask_));
-  this->media_loss_mask_[kNumMediaPackets - 2] = 1;
-  this->NetworkReceivedPackets(this->media_loss_mask_, this->fec_loss_mask_);
-
-  EXPECT_EQ(0, this->fec_.DecodeFec(&this->received_packets_,
-                                    &this->recovered_packets_));
-
-  // Unprotected packet lost. Recovery not possible.
-  EXPECT_FALSE(this->IsRecoveryComplete());
-  this->recovered_packets_.clear();
-
-  // 6 media packets lost.
-  memset(this->media_loss_mask_, 0, sizeof(this->media_loss_mask_));
-  memset(this->fec_loss_mask_, 0, sizeof(this->fec_loss_mask_));
-  this->media_loss_mask_[kNumMediaPackets - 11] = 1;
-  this->media_loss_mask_[kNumMediaPackets - 9] = 1;
-  this->media_loss_mask_[kNumMediaPackets - 7] = 1;
-  this->media_loss_mask_[kNumMediaPackets - 5] = 1;
-  this->media_loss_mask_[kNumMediaPackets - 3] = 1;
-  this->media_loss_mask_[kNumMediaPackets - 1] = 1;
-  this->NetworkReceivedPackets(this->media_loss_mask_, this->fec_loss_mask_);
-
-  EXPECT_EQ(0, this->fec_.DecodeFec(&this->received_packets_,
-                                    &this->recovered_packets_));
-
-  // 5 protected packets lost, one FEC packet, cannot get complete recovery.
-  EXPECT_FALSE(this->IsRecoveryComplete());
-}
-
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/rtp_format.cc b/modules/rtp_rtcp/source/rtp_format.cc
deleted file mode 100644
index 7f799bb..0000000
--- a/modules/rtp_rtcp/source/rtp_format.cc
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- *  Copyright (c) 2014 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/rtp_rtcp/source/rtp_format.h"
-
-#include <utility>
-
-#include "webrtc/modules/rtp_rtcp/source/rtp_format_h264.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_format_video_generic.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_format_vp8.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_format_vp9.h"
-
-namespace webrtc {
-RtpPacketizer* RtpPacketizer::Create(RtpVideoCodecTypes type,
-                                     size_t max_payload_len,
-                                     size_t last_packet_reduction_len,
-                                     const RTPVideoTypeHeader* rtp_type_header,
-                                     FrameType frame_type) {
-  switch (type) {
-    case kRtpVideoH264:
-      RTC_CHECK(rtp_type_header);
-      return new RtpPacketizerH264(max_payload_len, last_packet_reduction_len,
-                                   rtp_type_header->H264.packetization_mode);
-    case kRtpVideoVp8:
-      RTC_CHECK(rtp_type_header);
-      return new RtpPacketizerVp8(rtp_type_header->VP8, max_payload_len,
-                                  last_packet_reduction_len);
-    case kRtpVideoVp9:
-      RTC_CHECK(rtp_type_header);
-      return new RtpPacketizerVp9(rtp_type_header->VP9, max_payload_len,
-                                  last_packet_reduction_len);
-    case kRtpVideoGeneric:
-      return new RtpPacketizerGeneric(frame_type, max_payload_len,
-                                      last_packet_reduction_len);
-    case kRtpVideoNone:
-      RTC_NOTREACHED();
-  }
-  return nullptr;
-}
-
-RtpDepacketizer* RtpDepacketizer::Create(RtpVideoCodecTypes type) {
-  switch (type) {
-    case kRtpVideoH264:
-      return new RtpDepacketizerH264();
-    case kRtpVideoVp8:
-      return new RtpDepacketizerVp8();
-    case kRtpVideoVp9:
-      return new RtpDepacketizerVp9();
-    case kRtpVideoGeneric:
-      return new RtpDepacketizerGeneric();
-    case kRtpVideoNone:
-      assert(false);
-  }
-  return nullptr;
-}
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/rtp_format.h b/modules/rtp_rtcp/source/rtp_format.h
deleted file mode 100644
index 7b47921..0000000
--- a/modules/rtp_rtcp/source/rtp_format.h
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- *  Copyright (c) 2014 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_RTP_RTCP_SOURCE_RTP_FORMAT_H_
-#define WEBRTC_MODULES_RTP_RTCP_SOURCE_RTP_FORMAT_H_
-
-#include <string>
-
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace webrtc {
-class RtpPacketToSend;
-
-class RtpPacketizer {
- public:
-  static RtpPacketizer* Create(RtpVideoCodecTypes type,
-                               size_t max_payload_len,
-                               size_t last_packet_reduction_len,
-                               const RTPVideoTypeHeader* rtp_type_header,
-                               FrameType frame_type);
-
-  virtual ~RtpPacketizer() {}
-
-  // Returns total number of packets which would be produced by the packetizer.
-  virtual size_t SetPayloadData(
-      const uint8_t* payload_data,
-      size_t payload_size,
-      const RTPFragmentationHeader* fragmentation) = 0;
-
-  // Get the next payload with payload header.
-  // Write payload and set marker bit of the |packet|.
-  // Returns true on success, false otherwise.
-  virtual bool NextPacket(RtpPacketToSend* packet) = 0;
-
-  virtual std::string ToString() = 0;
-};
-
-// TODO(sprang): Update the depacketizer to return a std::unqie_ptr with a copy
-// of the parsed payload, rather than just a pointer into the incoming buffer.
-// This way we can move some parsing out from the jitter buffer into here, and
-// the jitter buffer can just store that pointer rather than doing a copy there.
-class RtpDepacketizer {
- public:
-  struct ParsedPayload {
-    const uint8_t* payload;
-    size_t payload_length;
-    FrameType frame_type;
-    RTPTypeHeader type;
-  };
-
-  static RtpDepacketizer* Create(RtpVideoCodecTypes type);
-
-  virtual ~RtpDepacketizer() {}
-
-  // Parses the RTP payload, parsed result will be saved in |parsed_payload|.
-  virtual bool Parse(ParsedPayload* parsed_payload,
-                     const uint8_t* payload_data,
-                     size_t payload_data_length) = 0;
-};
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_RTP_RTCP_SOURCE_RTP_FORMAT_H_
diff --git a/modules/rtp_rtcp/source/rtp_format_h264.cc b/modules/rtp_rtcp/source/rtp_format_h264.cc
deleted file mode 100644
index 5aa7e27..0000000
--- a/modules/rtp_rtcp/source/rtp_format_h264.cc
+++ /dev/null
@@ -1,668 +0,0 @@
-/*
- *  Copyright (c) 2014 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/rtp_rtcp/source/rtp_format_h264.h"
-
-#include <string.h>
-#include <memory>
-#include <utility>
-#include <vector>
-
-#include "webrtc/common_video/h264/h264_common.h"
-#include "webrtc/common_video/h264/pps_parser.h"
-#include "webrtc/common_video/h264/sps_parser.h"
-#include "webrtc/common_video/h264/sps_vui_rewriter.h"
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/modules/rtp_rtcp/source/byte_io.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_packet_to_send.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/system_wrappers/include/metrics.h"
-
-namespace webrtc {
-namespace {
-
-static const size_t kNalHeaderSize = 1;
-static const size_t kFuAHeaderSize = 2;
-static const size_t kLengthFieldSize = 2;
-static const size_t kStapAHeaderSize = kNalHeaderSize + kLengthFieldSize;
-
-static const char* kSpsValidHistogramName = "WebRTC.Video.H264.SpsValid";
-enum SpsValidEvent {
-  kReceivedSpsPocOk = 0,
-  kReceivedSpsVuiOk = 1,
-  kReceivedSpsRewritten = 2,
-  kReceivedSpsParseFailure = 3,
-  kSentSpsPocOk = 4,
-  kSentSpsVuiOk = 5,
-  kSentSpsRewritten = 6,
-  kSentSpsParseFailure = 7,
-  kSpsRewrittenMax = 8
-};
-
-// Bit masks for FU (A and B) indicators.
-enum NalDefs : uint8_t { kFBit = 0x80, kNriMask = 0x60, kTypeMask = 0x1F };
-
-// Bit masks for FU (A and B) headers.
-enum FuDefs : uint8_t { kSBit = 0x80, kEBit = 0x40, kRBit = 0x20 };
-
-// TODO(pbos): Avoid parsing this here as well as inside the jitter buffer.
-bool ParseStapAStartOffsets(const uint8_t* nalu_ptr,
-                            size_t length_remaining,
-                            std::vector<size_t>* offsets) {
-  size_t offset = 0;
-  while (length_remaining > 0) {
-    // Buffer doesn't contain room for additional nalu length.
-    if (length_remaining < sizeof(uint16_t))
-      return false;
-    uint16_t nalu_size = ByteReader<uint16_t>::ReadBigEndian(nalu_ptr);
-    nalu_ptr += sizeof(uint16_t);
-    length_remaining -= sizeof(uint16_t);
-    if (nalu_size > length_remaining)
-      return false;
-    nalu_ptr += nalu_size;
-    length_remaining -= nalu_size;
-
-    offsets->push_back(offset + kStapAHeaderSize);
-    offset += kLengthFieldSize + nalu_size;
-  }
-  return true;
-}
-
-}  // namespace
-
-RtpPacketizerH264::RtpPacketizerH264(size_t max_payload_len,
-                                     size_t last_packet_reduction_len,
-                                     H264PacketizationMode packetization_mode)
-    : max_payload_len_(max_payload_len),
-      last_packet_reduction_len_(last_packet_reduction_len),
-      num_packets_left_(0),
-      packetization_mode_(packetization_mode) {
-  // Guard against uninitialized memory in packetization_mode.
-  RTC_CHECK(packetization_mode == H264PacketizationMode::NonInterleaved ||
-            packetization_mode == H264PacketizationMode::SingleNalUnit);
-  RTC_CHECK_GT(max_payload_len, last_packet_reduction_len);
-}
-
-RtpPacketizerH264::~RtpPacketizerH264() {
-}
-
-RtpPacketizerH264::Fragment::Fragment(const uint8_t* buffer, size_t length)
-    : buffer(buffer), length(length) {}
-RtpPacketizerH264::Fragment::Fragment(const Fragment& fragment)
-    : buffer(fragment.buffer), length(fragment.length) {}
-
-size_t RtpPacketizerH264::SetPayloadData(
-    const uint8_t* payload_data,
-    size_t payload_size,
-    const RTPFragmentationHeader* fragmentation) {
-  RTC_DCHECK(packets_.empty());
-  RTC_DCHECK(input_fragments_.empty());
-  RTC_DCHECK(fragmentation);
-  for (int i = 0; i < fragmentation->fragmentationVectorSize; ++i) {
-    const uint8_t* buffer =
-        &payload_data[fragmentation->fragmentationOffset[i]];
-    size_t length = fragmentation->fragmentationLength[i];
-
-    bool updated_sps = false;
-    H264::NaluType nalu_type = H264::ParseNaluType(buffer[0]);
-    if (nalu_type == H264::NaluType::kSps) {
-      // Check if stream uses picture order count type 0, and if so rewrite it
-      // to enable faster decoding. Streams in that format incur additional
-      // delay because it allows decode order to differ from render order.
-      // The mechanism used is to rewrite (edit or add) the SPS's VUI to contain
-      // restrictions on the maximum number of reordered pictures. This reduces
-      // latency significantly, though it still adds about a frame of latency to
-      // decoding.
-      // Note that we do this rewriting both here (send side, in order to
-      // protect legacy receive clients) and below in
-      // RtpDepacketizerH264::ParseSingleNalu (receive side, in orderer to
-      // protect us from unknown or legacy send clients).
-
-      rtc::Optional<SpsParser::SpsState> sps;
-
-      std::unique_ptr<rtc::Buffer> output_buffer(new rtc::Buffer());
-      // Add the type header to the output buffer first, so that the rewriter
-      // can append modified payload on top of that.
-      output_buffer->AppendData(buffer[0]);
-      SpsVuiRewriter::ParseResult result = SpsVuiRewriter::ParseAndRewriteSps(
-          buffer + H264::kNaluTypeSize, length - H264::kNaluTypeSize, &sps,
-          output_buffer.get());
-
-      switch (result) {
-        case SpsVuiRewriter::ParseResult::kVuiRewritten:
-          input_fragments_.push_back(
-              Fragment(output_buffer->data(), output_buffer->size()));
-          input_fragments_.rbegin()->tmp_buffer = std::move(output_buffer);
-          updated_sps = true;
-          RTC_HISTOGRAM_ENUMERATION(kSpsValidHistogramName,
-                                    SpsValidEvent::kSentSpsRewritten,
-                                    SpsValidEvent::kSpsRewrittenMax);
-          break;
-        case SpsVuiRewriter::ParseResult::kPocOk:
-          RTC_HISTOGRAM_ENUMERATION(kSpsValidHistogramName,
-                                    SpsValidEvent::kSentSpsPocOk,
-                                    SpsValidEvent::kSpsRewrittenMax);
-          break;
-        case SpsVuiRewriter::ParseResult::kVuiOk:
-          RTC_HISTOGRAM_ENUMERATION(kSpsValidHistogramName,
-                                    SpsValidEvent::kSentSpsVuiOk,
-                                    SpsValidEvent::kSpsRewrittenMax);
-          break;
-        case SpsVuiRewriter::ParseResult::kFailure:
-          RTC_HISTOGRAM_ENUMERATION(kSpsValidHistogramName,
-                                    SpsValidEvent::kSentSpsParseFailure,
-                                    SpsValidEvent::kSpsRewrittenMax);
-          break;
-      }
-    }
-
-    if (!updated_sps)
-      input_fragments_.push_back(Fragment(buffer, length));
-  }
-  GeneratePackets();
-  return num_packets_left_;
-}
-
-void RtpPacketizerH264::GeneratePackets() {
-  for (size_t i = 0; i < input_fragments_.size();) {
-    switch (packetization_mode_) {
-      case H264PacketizationMode::SingleNalUnit:
-        PacketizeSingleNalu(i);
-        ++i;
-        break;
-      case H264PacketizationMode::NonInterleaved:
-        size_t fragment_len = input_fragments_[i].length;
-        if (i + 1 == input_fragments_.size()) {
-          // Pretend that last fragment is larger instead of making last packet
-          // smaller.
-          fragment_len += last_packet_reduction_len_;
-        }
-        if (fragment_len > max_payload_len_) {
-          PacketizeFuA(i);
-          ++i;
-        } else {
-          i = PacketizeStapA(i);
-        }
-        break;
-    }
-  }
-}
-
-void RtpPacketizerH264::PacketizeFuA(size_t fragment_index) {
-  // Fragment payload into packets (FU-A).
-  // Strip out the original header and leave room for the FU-A header.
-  const Fragment& fragment = input_fragments_[fragment_index];
-  bool is_last_fragment = fragment_index + 1 == input_fragments_.size();
-  size_t payload_left = fragment.length - kNalHeaderSize;
-  size_t offset = kNalHeaderSize;
-  size_t per_packet_capacity = max_payload_len_ - kFuAHeaderSize;
-
-  // Instead of making the last packet smaller we pretend that all packets are
-  // of the same size but we write additional virtual payload to the last
-  // packet.
-  size_t extra_len = is_last_fragment ? last_packet_reduction_len_ : 0;
-
-  // Integer divisions with rounding up. Minimal number of packets to fit all
-  // payload and virtual payload.
-  size_t num_packets = (payload_left + extra_len + (per_packet_capacity - 1)) /
-                       per_packet_capacity;
-  // Bytes per packet. Average rounded down.
-  size_t payload_per_packet = (payload_left + extra_len) / num_packets;
-  // We make several first packets to be 1 bytes smaller than the rest.
-  // i.e 14 bytes splitted in 4 packets would be 3+3+4+4.
-  size_t num_larger_packets = (payload_left + extra_len) % num_packets;
-
-  num_packets_left_ += num_packets;
-  while (payload_left > 0) {
-    // Increase payload per packet at the right time.
-    if (num_packets == num_larger_packets)
-      ++payload_per_packet;
-    size_t packet_length = payload_per_packet;
-    if (payload_left <= packet_length) {  // Last portion of the payload
-      packet_length = payload_left;
-      // One additional packet may be used for extensions in the last packet.
-      // Together with last payload packet there may be at most 2 of them.
-      RTC_DCHECK_LE(num_packets, 2);
-      if (num_packets == 2) {
-        // Whole payload fits in the first num_packets-1 packets but extra
-        // packet is used for virtual payload. Leave at least one byte of data
-        // for the last packet.
-        --packet_length;
-      }
-    }
-    RTC_CHECK_GT(packet_length, 0);
-    packets_.push(PacketUnit(Fragment(fragment.buffer + offset, packet_length),
-                             offset - kNalHeaderSize == 0,
-                             payload_left == packet_length, false,
-                             fragment.buffer[0]));
-    offset += packet_length;
-    payload_left -= packet_length;
-    --num_packets;
-  }
-  RTC_CHECK_EQ(0, payload_left);
-}
-
-size_t RtpPacketizerH264::PacketizeStapA(size_t fragment_index) {
-  // Aggregate fragments into one packet (STAP-A).
-  size_t payload_size_left = max_payload_len_;
-  int aggregated_fragments = 0;
-  size_t fragment_headers_length = 0;
-  const Fragment* fragment = &input_fragments_[fragment_index];
-  RTC_CHECK_GE(payload_size_left, fragment->length);
-  ++num_packets_left_;
-  while (payload_size_left >= fragment->length + fragment_headers_length &&
-         (fragment_index + 1 < input_fragments_.size() ||
-          payload_size_left >= fragment->length + fragment_headers_length +
-                                   last_packet_reduction_len_)) {
-    RTC_CHECK_GT(fragment->length, 0);
-    packets_.push(PacketUnit(*fragment, aggregated_fragments == 0, false, true,
-                             fragment->buffer[0]));
-    payload_size_left -= fragment->length;
-    payload_size_left -= fragment_headers_length;
-
-    fragment_headers_length = kLengthFieldSize;
-    // If we are going to try to aggregate more fragments into this packet
-    // we need to add the STAP-A NALU header and a length field for the first
-    // NALU of this packet.
-    if (aggregated_fragments == 0)
-      fragment_headers_length += kNalHeaderSize + kLengthFieldSize;
-    ++aggregated_fragments;
-
-    // Next fragment.
-    ++fragment_index;
-    if (fragment_index == input_fragments_.size())
-      break;
-    fragment = &input_fragments_[fragment_index];
-  }
-  RTC_CHECK_GT(aggregated_fragments, 0);
-  packets_.back().last_fragment = true;
-  return fragment_index;
-}
-
-void RtpPacketizerH264::PacketizeSingleNalu(size_t fragment_index) {
-  // Add a single NALU to the queue, no aggregation.
-  size_t payload_size_left = max_payload_len_;
-  if (fragment_index + 1 == input_fragments_.size())
-    payload_size_left -= last_packet_reduction_len_;
-  const Fragment* fragment = &input_fragments_[fragment_index];
-  RTC_CHECK_GE(payload_size_left, fragment->length)
-      << "Payload size left " << payload_size_left << ", fragment length "
-      << fragment->length << ", packetization mode " << packetization_mode_;
-  RTC_CHECK_GT(fragment->length, 0u);
-  packets_.push(PacketUnit(*fragment, true /* first */, true /* last */,
-                           false /* aggregated */, fragment->buffer[0]));
-  ++num_packets_left_;
-}
-
-bool RtpPacketizerH264::NextPacket(RtpPacketToSend* rtp_packet) {
-  RTC_DCHECK(rtp_packet);
-  if (packets_.empty()) {
-    return false;
-  }
-
-  PacketUnit packet = packets_.front();
-  if (packet.first_fragment && packet.last_fragment) {
-    // Single NAL unit packet.
-    size_t bytes_to_send = packet.source_fragment.length;
-    uint8_t* buffer = rtp_packet->AllocatePayload(bytes_to_send);
-    memcpy(buffer, packet.source_fragment.buffer, bytes_to_send);
-    packets_.pop();
-    input_fragments_.pop_front();
-  } else if (packet.aggregated) {
-    RTC_CHECK_EQ(H264PacketizationMode::NonInterleaved, packetization_mode_);
-    bool is_last_packet = num_packets_left_ == 1;
-    NextAggregatePacket(rtp_packet, is_last_packet);
-  } else {
-    RTC_CHECK_EQ(H264PacketizationMode::NonInterleaved, packetization_mode_);
-    NextFragmentPacket(rtp_packet);
-  }
-  RTC_DCHECK_LE(rtp_packet->payload_size(), max_payload_len_);
-  if (packets_.empty()) {
-    RTC_DCHECK_LE(rtp_packet->payload_size(),
-                  max_payload_len_ - last_packet_reduction_len_);
-  }
-  rtp_packet->SetMarker(packets_.empty());
-  --num_packets_left_;
-  return true;
-}
-
-void RtpPacketizerH264::NextAggregatePacket(RtpPacketToSend* rtp_packet,
-                                            bool last) {
-  uint8_t* buffer = rtp_packet->AllocatePayload(
-      last ? max_payload_len_ - last_packet_reduction_len_ : max_payload_len_);
-  RTC_DCHECK(buffer);
-  PacketUnit* packet = &packets_.front();
-  RTC_CHECK(packet->first_fragment);
-  // STAP-A NALU header.
-  buffer[0] = (packet->header & (kFBit | kNriMask)) | H264::NaluType::kStapA;
-  size_t index = kNalHeaderSize;
-  bool is_last_fragment = packet->last_fragment;
-  while (packet->aggregated) {
-    const Fragment& fragment = packet->source_fragment;
-    // Add NAL unit length field.
-    ByteWriter<uint16_t>::WriteBigEndian(&buffer[index], fragment.length);
-    index += kLengthFieldSize;
-    // Add NAL unit.
-    memcpy(&buffer[index], fragment.buffer, fragment.length);
-    index += fragment.length;
-    packets_.pop();
-    input_fragments_.pop_front();
-    if (is_last_fragment)
-      break;
-    packet = &packets_.front();
-    is_last_fragment = packet->last_fragment;
-  }
-  RTC_CHECK(is_last_fragment);
-  rtp_packet->SetPayloadSize(index);
-}
-
-void RtpPacketizerH264::NextFragmentPacket(RtpPacketToSend* rtp_packet) {
-  PacketUnit* packet = &packets_.front();
-  // NAL unit fragmented over multiple packets (FU-A).
-  // We do not send original NALU header, so it will be replaced by the
-  // FU indicator header of the first packet.
-  uint8_t fu_indicator =
-      (packet->header & (kFBit | kNriMask)) | H264::NaluType::kFuA;
-  uint8_t fu_header = 0;
-
-  // S | E | R | 5 bit type.
-  fu_header |= (packet->first_fragment ? kSBit : 0);
-  fu_header |= (packet->last_fragment ? kEBit : 0);
-  uint8_t type = packet->header & kTypeMask;
-  fu_header |= type;
-  const Fragment& fragment = packet->source_fragment;
-  uint8_t* buffer =
-      rtp_packet->AllocatePayload(kFuAHeaderSize + fragment.length);
-  buffer[0] = fu_indicator;
-  buffer[1] = fu_header;
-  memcpy(buffer + kFuAHeaderSize, fragment.buffer, fragment.length);
-  if (packet->last_fragment)
-    input_fragments_.pop_front();
-  packets_.pop();
-}
-
-std::string RtpPacketizerH264::ToString() {
-  return "RtpPacketizerH264";
-}
-
-RtpDepacketizerH264::RtpDepacketizerH264() : offset_(0), length_(0) {}
-RtpDepacketizerH264::~RtpDepacketizerH264() {}
-
-bool RtpDepacketizerH264::Parse(ParsedPayload* parsed_payload,
-                                const uint8_t* payload_data,
-                                size_t payload_data_length) {
-  RTC_CHECK(parsed_payload != nullptr);
-  if (payload_data_length == 0) {
-    LOG(LS_ERROR) << "Empty payload.";
-    return false;
-  }
-
-  offset_ = 0;
-  length_ = payload_data_length;
-  modified_buffer_.reset();
-
-  uint8_t nal_type = payload_data[0] & kTypeMask;
-  parsed_payload->type.Video.codecHeader.H264.nalus_length = 0;
-  if (nal_type == H264::NaluType::kFuA) {
-    // Fragmented NAL units (FU-A).
-    if (!ParseFuaNalu(parsed_payload, payload_data))
-      return false;
-  } else {
-    // We handle STAP-A and single NALU's the same way here. The jitter buffer
-    // will depacketize the STAP-A into NAL units later.
-    // TODO(sprang): Parse STAP-A offsets here and store in fragmentation vec.
-    if (!ProcessStapAOrSingleNalu(parsed_payload, payload_data))
-      return false;
-  }
-
-  const uint8_t* payload =
-      modified_buffer_ ? modified_buffer_->data() : payload_data;
-
-  parsed_payload->payload = payload + offset_;
-  parsed_payload->payload_length = length_;
-  return true;
-}
-
-bool RtpDepacketizerH264::ProcessStapAOrSingleNalu(
-    ParsedPayload* parsed_payload,
-    const uint8_t* payload_data) {
-  parsed_payload->type.Video.width = 0;
-  parsed_payload->type.Video.height = 0;
-  parsed_payload->type.Video.codec = kRtpVideoH264;
-  parsed_payload->type.Video.is_first_packet_in_frame = true;
-  RTPVideoHeaderH264* h264_header =
-      &parsed_payload->type.Video.codecHeader.H264;
-
-  const uint8_t* nalu_start = payload_data + kNalHeaderSize;
-  const size_t nalu_length = length_ - kNalHeaderSize;
-  uint8_t nal_type = payload_data[0] & kTypeMask;
-  std::vector<size_t> nalu_start_offsets;
-  if (nal_type == H264::NaluType::kStapA) {
-    // Skip the StapA header (StapA NAL type + length).
-    if (length_ <= kStapAHeaderSize) {
-      LOG(LS_ERROR) << "StapA header truncated.";
-      return false;
-    }
-
-    if (!ParseStapAStartOffsets(nalu_start, nalu_length, &nalu_start_offsets)) {
-      LOG(LS_ERROR) << "StapA packet with incorrect NALU packet lengths.";
-      return false;
-    }
-
-    h264_header->packetization_type = kH264StapA;
-    nal_type = payload_data[kStapAHeaderSize] & kTypeMask;
-  } else {
-    h264_header->packetization_type = kH264SingleNalu;
-    nalu_start_offsets.push_back(0);
-  }
-  h264_header->nalu_type = nal_type;
-  parsed_payload->frame_type = kVideoFrameDelta;
-
-  nalu_start_offsets.push_back(length_ + kLengthFieldSize);  // End offset.
-  for (size_t i = 0; i < nalu_start_offsets.size() - 1; ++i) {
-    size_t start_offset = nalu_start_offsets[i];
-    // End offset is actually start offset for next unit, excluding length field
-    // so remove that from this units length.
-    size_t end_offset = nalu_start_offsets[i + 1] - kLengthFieldSize;
-    if (end_offset - start_offset < H264::kNaluTypeSize) {
-      LOG(LS_ERROR) << "STAP-A packet too short";
-      return false;
-    }
-
-    NaluInfo nalu;
-    nalu.type = payload_data[start_offset] & kTypeMask;
-    nalu.sps_id = -1;
-    nalu.pps_id = -1;
-    start_offset += H264::kNaluTypeSize;
-
-    switch (nalu.type) {
-      case H264::NaluType::kSps: {
-        // Check if VUI is present in SPS and if it needs to be modified to
-        // avoid
-        // excessive decoder latency.
-
-        // Copy any previous data first (likely just the first header).
-        std::unique_ptr<rtc::Buffer> output_buffer(new rtc::Buffer());
-        if (start_offset)
-          output_buffer->AppendData(payload_data, start_offset);
-
-        rtc::Optional<SpsParser::SpsState> sps;
-
-        SpsVuiRewriter::ParseResult result = SpsVuiRewriter::ParseAndRewriteSps(
-            &payload_data[start_offset], end_offset - start_offset, &sps,
-            output_buffer.get());
-        switch (result) {
-          case SpsVuiRewriter::ParseResult::kVuiRewritten:
-            if (modified_buffer_) {
-              LOG(LS_WARNING)
-                  << "More than one H264 SPS NAL units needing "
-                     "rewriting found within a single STAP-A packet. "
-                     "Keeping the first and rewriting the last.";
-            }
-
-            // Rewrite length field to new SPS size.
-            if (h264_header->packetization_type == kH264StapA) {
-              size_t length_field_offset =
-                  start_offset - (H264::kNaluTypeSize + kLengthFieldSize);
-              // Stap-A Length includes payload data and type header.
-              size_t rewritten_size =
-                  output_buffer->size() - start_offset + H264::kNaluTypeSize;
-              ByteWriter<uint16_t>::WriteBigEndian(
-                  &(*output_buffer)[length_field_offset], rewritten_size);
-            }
-
-            // Append rest of packet.
-            output_buffer->AppendData(
-                &payload_data[end_offset],
-                nalu_length + kNalHeaderSize - end_offset);
-
-            modified_buffer_ = std::move(output_buffer);
-            length_ = modified_buffer_->size();
-
-            RTC_HISTOGRAM_ENUMERATION(kSpsValidHistogramName,
-                                      SpsValidEvent::kReceivedSpsRewritten,
-                                      SpsValidEvent::kSpsRewrittenMax);
-            break;
-          case SpsVuiRewriter::ParseResult::kPocOk:
-            RTC_HISTOGRAM_ENUMERATION(kSpsValidHistogramName,
-                                      SpsValidEvent::kReceivedSpsPocOk,
-                                      SpsValidEvent::kSpsRewrittenMax);
-            break;
-          case SpsVuiRewriter::ParseResult::kVuiOk:
-            RTC_HISTOGRAM_ENUMERATION(kSpsValidHistogramName,
-                                      SpsValidEvent::kReceivedSpsVuiOk,
-                                      SpsValidEvent::kSpsRewrittenMax);
-            break;
-          case SpsVuiRewriter::ParseResult::kFailure:
-            RTC_HISTOGRAM_ENUMERATION(kSpsValidHistogramName,
-                                      SpsValidEvent::kReceivedSpsParseFailure,
-                                      SpsValidEvent::kSpsRewrittenMax);
-            break;
-        }
-
-        if (sps) {
-          parsed_payload->type.Video.width = sps->width;
-          parsed_payload->type.Video.height = sps->height;
-          nalu.sps_id = sps->id;
-        } else {
-          LOG(LS_WARNING) << "Failed to parse SPS id from SPS slice.";
-        }
-        parsed_payload->frame_type = kVideoFrameKey;
-        break;
-      }
-      case H264::NaluType::kPps: {
-        uint32_t pps_id;
-        uint32_t sps_id;
-        if (PpsParser::ParsePpsIds(&payload_data[start_offset],
-                                    end_offset - start_offset, &pps_id,
-                                    &sps_id)) {
-          nalu.pps_id = pps_id;
-          nalu.sps_id = sps_id;
-        } else {
-          LOG(LS_WARNING)
-              << "Failed to parse PPS id and SPS id from PPS slice.";
-        }
-        break;
-      }
-      case H264::NaluType::kIdr:
-        parsed_payload->frame_type = kVideoFrameKey;
-        FALLTHROUGH();
-      case H264::NaluType::kSlice: {
-        rtc::Optional<uint32_t> pps_id = PpsParser::ParsePpsIdFromSlice(
-            &payload_data[start_offset], end_offset - start_offset);
-        if (pps_id) {
-          nalu.pps_id = *pps_id;
-        } else {
-          LOG(LS_WARNING) << "Failed to parse PPS id from slice of type: "
-                          << static_cast<int>(nalu.type);
-        }
-        break;
-      }
-      // Slices below don't contain SPS or PPS ids.
-      case H264::NaluType::kAud:
-      case H264::NaluType::kEndOfSequence:
-      case H264::NaluType::kEndOfStream:
-      case H264::NaluType::kFiller:
-      case H264::NaluType::kSei:
-        break;
-      case H264::NaluType::kStapA:
-      case H264::NaluType::kFuA:
-        LOG(LS_WARNING) << "Unexpected STAP-A or FU-A received.";
-        return false;
-    }
-    RTPVideoHeaderH264* h264 = &parsed_payload->type.Video.codecHeader.H264;
-    if (h264->nalus_length == kMaxNalusPerPacket) {
-      LOG(LS_WARNING)
-          << "Received packet containing more than " << kMaxNalusPerPacket
-          << " NAL units. Will not keep track sps and pps ids for all of them.";
-    } else {
-      h264->nalus[h264->nalus_length++] = nalu;
-    }
-  }
-
-  return true;
-}
-
-bool RtpDepacketizerH264::ParseFuaNalu(
-    RtpDepacketizer::ParsedPayload* parsed_payload,
-    const uint8_t* payload_data) {
-  if (length_ < kFuAHeaderSize) {
-    LOG(LS_ERROR) << "FU-A NAL units truncated.";
-    return false;
-  }
-  uint8_t fnri = payload_data[0] & (kFBit | kNriMask);
-  uint8_t original_nal_type = payload_data[1] & kTypeMask;
-  bool first_fragment = (payload_data[1] & kSBit) > 0;
-  NaluInfo nalu;
-  nalu.type = original_nal_type;
-  nalu.sps_id = -1;
-  nalu.pps_id = -1;
-  if (first_fragment) {
-    offset_ = 0;
-    length_ -= kNalHeaderSize;
-    rtc::Optional<uint32_t> pps_id = PpsParser::ParsePpsIdFromSlice(
-        payload_data + 2 * kNalHeaderSize, length_ - kNalHeaderSize);
-    if (pps_id) {
-      nalu.pps_id = *pps_id;
-    } else {
-      LOG(LS_WARNING) << "Failed to parse PPS from first fragment of FU-A NAL "
-                         "unit with original type: "
-                      << static_cast<int>(nalu.type);
-    }
-    uint8_t original_nal_header = fnri | original_nal_type;
-    modified_buffer_.reset(new rtc::Buffer());
-    modified_buffer_->AppendData(payload_data + kNalHeaderSize, length_);
-    (*modified_buffer_)[0] = original_nal_header;
-  } else {
-    offset_ = kFuAHeaderSize;
-    length_ -= kFuAHeaderSize;
-  }
-
-  if (original_nal_type == H264::NaluType::kIdr) {
-    parsed_payload->frame_type = kVideoFrameKey;
-  } else {
-    parsed_payload->frame_type = kVideoFrameDelta;
-  }
-  parsed_payload->type.Video.width = 0;
-  parsed_payload->type.Video.height = 0;
-  parsed_payload->type.Video.codec = kRtpVideoH264;
-  parsed_payload->type.Video.is_first_packet_in_frame = first_fragment;
-  RTPVideoHeaderH264* h264 = &parsed_payload->type.Video.codecHeader.H264;
-  h264->packetization_type = kH264FuA;
-  h264->nalu_type = original_nal_type;
-  if (first_fragment) {
-    h264->nalus[h264->nalus_length] = nalu;
-    h264->nalus_length = 1;
-  }
-  return true;
-}
-
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/rtp_format_h264.h b/modules/rtp_rtcp/source/rtp_format_h264.h
deleted file mode 100644
index efa9b97..0000000
--- a/modules/rtp_rtcp/source/rtp_format_h264.h
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- *  Copyright (c) 2014 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_RTP_RTCP_SOURCE_RTP_FORMAT_H264_H_
-#define WEBRTC_MODULES_RTP_RTCP_SOURCE_RTP_FORMAT_H264_H_
-
-#include <deque>
-#include <memory>
-#include <queue>
-#include <string>
-
-#include "webrtc/modules/rtp_rtcp/source/rtp_format.h"
-#include "webrtc/rtc_base/buffer.h"
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace webrtc {
-
-class RtpPacketizerH264 : public RtpPacketizer {
- public:
-  // Initialize with payload from encoder.
-  // The payload_data must be exactly one encoded H264 frame.
-  RtpPacketizerH264(size_t max_payload_len,
-                    size_t last_packet_reduction_len,
-                    H264PacketizationMode packetization_mode);
-
-  virtual ~RtpPacketizerH264();
-
-  size_t SetPayloadData(const uint8_t* payload_data,
-                        size_t payload_size,
-                        const RTPFragmentationHeader* fragmentation) override;
-
-  // Get the next payload with H264 payload header.
-  // Write payload and set marker bit of the |packet|.
-  // Returns true on success, false otherwise.
-  bool NextPacket(RtpPacketToSend* rtp_packet) override;
-
-  std::string ToString() override;
-
- private:
-  // Input fragments (NAL units), with an optionally owned temporary buffer,
-  // used in case the fragment gets modified.
-  struct Fragment {
-    Fragment(const uint8_t* buffer, size_t length);
-    explicit Fragment(const Fragment& fragment);
-    const uint8_t* buffer = nullptr;
-    size_t length = 0;
-    std::unique_ptr<rtc::Buffer> tmp_buffer;
-  };
-
-  // A packet unit (H264 packet), to be put into an RTP packet:
-  // If a NAL unit is too large for an RTP packet, this packet unit will
-  // represent a FU-A packet of a single fragment of the NAL unit.
-  // If a NAL unit is small enough to fit within a single RTP packet, this
-  // packet unit may represent a single NAL unit or a STAP-A packet, of which
-  // there may be multiple in a single RTP packet (if so, aggregated = true).
-  struct PacketUnit {
-    PacketUnit(const Fragment& source_fragment,
-               bool first_fragment,
-               bool last_fragment,
-               bool aggregated,
-               uint8_t header)
-        : source_fragment(source_fragment),
-          first_fragment(first_fragment),
-          last_fragment(last_fragment),
-          aggregated(aggregated),
-          header(header) {}
-
-    const Fragment source_fragment;
-    bool first_fragment;
-    bool last_fragment;
-    bool aggregated;
-    uint8_t header;
-  };
-
-  void GeneratePackets();
-  void PacketizeFuA(size_t fragment_index);
-  size_t PacketizeStapA(size_t fragment_index);
-  void PacketizeSingleNalu(size_t fragment_index);
-  void NextAggregatePacket(RtpPacketToSend* rtp_packet, bool last);
-  void NextFragmentPacket(RtpPacketToSend* rtp_packet);
-
-  const size_t max_payload_len_;
-  const size_t last_packet_reduction_len_;
-  size_t num_packets_left_;
-  const H264PacketizationMode packetization_mode_;
-  std::deque<Fragment> input_fragments_;
-  std::queue<PacketUnit> packets_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(RtpPacketizerH264);
-};
-
-// Depacketizer for H264.
-class RtpDepacketizerH264 : public RtpDepacketizer {
- public:
-  RtpDepacketizerH264();
-  virtual ~RtpDepacketizerH264();
-
-  bool Parse(ParsedPayload* parsed_payload,
-             const uint8_t* payload_data,
-             size_t payload_data_length) override;
-
- private:
-  bool ParseFuaNalu(RtpDepacketizer::ParsedPayload* parsed_payload,
-                    const uint8_t* payload_data);
-  bool ProcessStapAOrSingleNalu(RtpDepacketizer::ParsedPayload* parsed_payload,
-                                const uint8_t* payload_data);
-
-  size_t offset_;
-  size_t length_;
-  std::unique_ptr<rtc::Buffer> modified_buffer_;
-};
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_RTP_RTCP_SOURCE_RTP_FORMAT_H264_H_
diff --git a/modules/rtp_rtcp/source/rtp_format_h264_unittest.cc b/modules/rtp_rtcp/source/rtp_format_h264_unittest.cc
deleted file mode 100644
index 047b4a3..0000000
--- a/modules/rtp_rtcp/source/rtp_format_h264_unittest.cc
+++ /dev/null
@@ -1,946 +0,0 @@
-/*
- *  Copyright (c) 2014 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 <memory>
-#include <vector>
-
-#include "webrtc/api/array_view.h"
-#include "webrtc/common_video/h264/h264_common.h"
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/modules/rtp_rtcp/mocks/mock_rtp_rtcp.h"
-#include "webrtc/modules/rtp_rtcp/source/byte_io.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_format.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_packet_to_send.h"
-#include "webrtc/test/gmock.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-namespace {
-
-using ::testing::ElementsAreArray;
-
-constexpr RtpPacketToSend::ExtensionManager* kNoExtensions = nullptr;
-const size_t kMaxPayloadSize = 1200;
-const size_t kLengthFieldLength = 2;
-
-enum Nalu {
-  kSlice = 1,
-  kIdr = 5,
-  kSei = 6,
-  kSps = 7,
-  kPps = 8,
-  kStapA = 24,
-  kFuA = 28
-};
-
-static const size_t kNalHeaderSize = 1;
-static const size_t kFuAHeaderSize = 2;
-
-// Bit masks for FU (A and B) indicators.
-enum NalDefs { kFBit = 0x80, kNriMask = 0x60, kTypeMask = 0x1F };
-
-// Bit masks for FU (A and B) headers.
-enum FuDefs { kSBit = 0x80, kEBit = 0x40, kRBit = 0x20 };
-
-void CreateThreeFragments(RTPFragmentationHeader* fragmentation,
-                          size_t frameSize,
-                          size_t payloadOffset) {
-  fragmentation->VerifyAndAllocateFragmentationHeader(3);
-  fragmentation->fragmentationOffset[0] = 0;
-  fragmentation->fragmentationLength[0] = 2;
-  fragmentation->fragmentationOffset[1] = 2;
-  fragmentation->fragmentationLength[1] = 2;
-  fragmentation->fragmentationOffset[2] = 4;
-  fragmentation->fragmentationLength[2] =
-      kNalHeaderSize + frameSize - payloadOffset;
-}
-
-RtpPacketizer* CreateH264Packetizer(H264PacketizationMode mode,
-                                    size_t max_payload_size,
-                                    size_t last_packet_reduction) {
-  RTPVideoTypeHeader type_header;
-  type_header.H264.packetization_mode = mode;
-  return RtpPacketizer::Create(kRtpVideoH264, max_payload_size,
-                               last_packet_reduction, &type_header,
-                               kEmptyFrame);
-}
-
-void VerifyFua(size_t fua_index,
-               const uint8_t* expected_payload,
-               int offset,
-               rtc::ArrayView<const uint8_t> packet,
-               const std::vector<size_t>& expected_sizes) {
-  ASSERT_EQ(expected_sizes[fua_index] + kFuAHeaderSize, packet.size())
-      << "FUA index: " << fua_index;
-  const uint8_t kFuIndicator = 0x1C;  // F=0, NRI=0, Type=28.
-  EXPECT_EQ(kFuIndicator, packet[0]) << "FUA index: " << fua_index;
-  bool should_be_last_fua = (fua_index == expected_sizes.size() - 1);
-  uint8_t fu_header = 0;
-  if (fua_index == 0)
-    fu_header = 0x85;  // S=1, E=0, R=0, Type=5.
-  else if (should_be_last_fua)
-    fu_header = 0x45;  // S=0, E=1, R=0, Type=5.
-  else
-    fu_header = 0x05;  // S=0, E=0, R=0, Type=5.
-  EXPECT_EQ(fu_header, packet[1]) << "FUA index: " << fua_index;
-  std::vector<uint8_t> expected_packet_payload(
-      &expected_payload[offset],
-      &expected_payload[offset + expected_sizes[fua_index]]);
-  EXPECT_THAT(expected_packet_payload,
-              ElementsAreArray(&packet[2], expected_sizes[fua_index]))
-      << "FUA index: " << fua_index;
-}
-
-void TestFua(size_t frame_size,
-             size_t max_payload_size,
-             size_t last_packet_reduction,
-             const std::vector<size_t>& expected_sizes) {
-  std::unique_ptr<uint8_t[]> frame;
-  frame.reset(new uint8_t[frame_size]);
-  frame[0] = 0x05;  // F=0, NRI=0, Type=5.
-  for (size_t i = 0; i < frame_size - kNalHeaderSize; ++i) {
-    frame[i + kNalHeaderSize] = i;
-  }
-  RTPFragmentationHeader fragmentation;
-  fragmentation.VerifyAndAllocateFragmentationHeader(1);
-  fragmentation.fragmentationOffset[0] = 0;
-  fragmentation.fragmentationLength[0] = frame_size;
-  std::unique_ptr<RtpPacketizer> packetizer(
-      CreateH264Packetizer(H264PacketizationMode::NonInterleaved,
-                           max_payload_size, last_packet_reduction));
-  EXPECT_EQ(
-      expected_sizes.size(),
-      packetizer->SetPayloadData(frame.get(), frame_size, &fragmentation));
-
-  RtpPacketToSend packet(kNoExtensions);
-  ASSERT_LE(max_payload_size, packet.FreeCapacity());
-  size_t offset = kNalHeaderSize;
-  for (size_t i = 0; i < expected_sizes.size(); ++i) {
-    ASSERT_TRUE(packetizer->NextPacket(&packet));
-    VerifyFua(i, frame.get(), offset, packet.payload(), expected_sizes);
-    offset += expected_sizes[i];
-  }
-
-  EXPECT_FALSE(packetizer->NextPacket(&packet));
-}
-
-size_t GetExpectedNaluOffset(const RTPFragmentationHeader& fragmentation,
-                             size_t start_index,
-                             size_t nalu_index) {
-  assert(nalu_index < fragmentation.fragmentationVectorSize);
-  size_t expected_nalu_offset = kNalHeaderSize;  // STAP-A header.
-  for (size_t i = start_index; i < nalu_index; ++i) {
-    expected_nalu_offset +=
-        kLengthFieldLength + fragmentation.fragmentationLength[i];
-  }
-  return expected_nalu_offset;
-}
-
-void VerifyStapAPayload(const RTPFragmentationHeader& fragmentation,
-                        size_t first_stapa_index,
-                        size_t nalu_index,
-                        rtc::ArrayView<const uint8_t> frame,
-                        rtc::ArrayView<const uint8_t> packet) {
-  size_t expected_payload_offset =
-      GetExpectedNaluOffset(fragmentation, first_stapa_index, nalu_index) +
-      kLengthFieldLength;
-  size_t offset = fragmentation.fragmentationOffset[nalu_index];
-  const uint8_t* expected_payload = &frame[offset];
-  size_t expected_payload_length =
-      fragmentation.fragmentationLength[nalu_index];
-  ASSERT_LE(offset + expected_payload_length, frame.size());
-  ASSERT_LE(expected_payload_offset + expected_payload_length, packet.size());
-  std::vector<uint8_t> expected_payload_vector(
-      expected_payload, &expected_payload[expected_payload_length]);
-  EXPECT_THAT(expected_payload_vector,
-              ElementsAreArray(&packet[expected_payload_offset],
-                               expected_payload_length));
-}
-
-void VerifySingleNaluPayload(const RTPFragmentationHeader& fragmentation,
-                             size_t nalu_index,
-                             rtc::ArrayView<const uint8_t> frame,
-                             rtc::ArrayView<const uint8_t> packet) {
-  auto fragment = frame.subview(fragmentation.fragmentationOffset[nalu_index],
-                                fragmentation.fragmentationLength[nalu_index]);
-  EXPECT_THAT(packet, ElementsAreArray(fragment.begin(), fragment.end()));
-}
-}  // namespace
-
-// Tests that should work with both packetization mode 0 and
-// packetization mode 1.
-class RtpPacketizerH264ModeTest
-    : public ::testing::TestWithParam<H264PacketizationMode> {};
-
-TEST_P(RtpPacketizerH264ModeTest, TestSingleNalu) {
-  const uint8_t frame[2] = {0x05, 0xFF};  // F=0, NRI=0, Type=5.
-  RTPFragmentationHeader fragmentation;
-  fragmentation.VerifyAndAllocateFragmentationHeader(1);
-  fragmentation.fragmentationOffset[0] = 0;
-  fragmentation.fragmentationLength[0] = sizeof(frame);
-  std::unique_ptr<RtpPacketizer> packetizer(
-      CreateH264Packetizer(GetParam(), kMaxPayloadSize, 0));
-  ASSERT_EQ(1u,
-            packetizer->SetPayloadData(frame, sizeof(frame), &fragmentation));
-  RtpPacketToSend packet(kNoExtensions);
-  ASSERT_LE(kMaxPayloadSize, packet.FreeCapacity());
-  ASSERT_TRUE(packetizer->NextPacket(&packet));
-  EXPECT_EQ(2u, packet.payload_size());
-  VerifySingleNaluPayload(fragmentation, 0, frame, packet.payload());
-  EXPECT_FALSE(packetizer->NextPacket(&packet));
-}
-
-TEST_P(RtpPacketizerH264ModeTest, TestSingleNaluTwoPackets) {
-  const size_t kFrameSize = kMaxPayloadSize + 100;
-  uint8_t frame[kFrameSize] = {0};
-  for (size_t i = 0; i < kFrameSize; ++i)
-    frame[i] = i;
-  RTPFragmentationHeader fragmentation;
-  fragmentation.VerifyAndAllocateFragmentationHeader(2);
-  fragmentation.fragmentationOffset[0] = 0;
-  fragmentation.fragmentationLength[0] = kMaxPayloadSize;
-  fragmentation.fragmentationOffset[1] = kMaxPayloadSize;
-  fragmentation.fragmentationLength[1] = 100;
-  // Set NAL headers.
-  frame[fragmentation.fragmentationOffset[0]] = 0x01;
-  frame[fragmentation.fragmentationOffset[1]] = 0x01;
-
-  std::unique_ptr<RtpPacketizer> packetizer(
-      CreateH264Packetizer(GetParam(), kMaxPayloadSize, 0));
-  ASSERT_EQ(2u, packetizer->SetPayloadData(frame, kFrameSize, &fragmentation));
-
-  RtpPacketToSend packet(kNoExtensions);
-  ASSERT_TRUE(packetizer->NextPacket(&packet));
-  ASSERT_EQ(fragmentation.fragmentationOffset[1], packet.payload_size());
-  VerifySingleNaluPayload(fragmentation, 0, frame, packet.payload());
-
-  ASSERT_TRUE(packetizer->NextPacket(&packet));
-  ASSERT_EQ(fragmentation.fragmentationLength[1], packet.payload_size());
-  VerifySingleNaluPayload(fragmentation, 1, frame, packet.payload());
-
-  EXPECT_FALSE(packetizer->NextPacket(&packet));
-}
-
-INSTANTIATE_TEST_CASE_P(
-    PacketMode,
-    RtpPacketizerH264ModeTest,
-    ::testing::Values(H264PacketizationMode::SingleNalUnit,
-                      H264PacketizationMode::NonInterleaved));
-
-TEST(RtpPacketizerH264Test, TestStapA) {
-  const size_t kFrameSize =
-      kMaxPayloadSize - 3 * kLengthFieldLength - kNalHeaderSize;
-  uint8_t frame[kFrameSize] = {0x07, 0xFF,  // F=0, NRI=0, Type=7 (SPS).
-                               0x08, 0xFF,  // F=0, NRI=0, Type=8 (PPS).
-                               0x05};       // F=0, NRI=0, Type=5 (IDR).
-  const size_t kPayloadOffset = 5;
-  for (size_t i = 0; i < kFrameSize - kPayloadOffset; ++i)
-    frame[i + kPayloadOffset] = i;
-  RTPFragmentationHeader fragmentation;
-  CreateThreeFragments(&fragmentation, kFrameSize, kPayloadOffset);
-  std::unique_ptr<RtpPacketizer> packetizer(CreateH264Packetizer(
-      H264PacketizationMode::NonInterleaved, kMaxPayloadSize, 0));
-  ASSERT_EQ(1u, packetizer->SetPayloadData(frame, kFrameSize, &fragmentation));
-
-  RtpPacketToSend packet(kNoExtensions);
-  ASSERT_LE(kMaxPayloadSize, packet.FreeCapacity());
-  ASSERT_TRUE(packetizer->NextPacket(&packet));
-  size_t expected_packet_size =
-      kNalHeaderSize + 3 * kLengthFieldLength + kFrameSize;
-  ASSERT_EQ(expected_packet_size, packet.payload_size());
-
-  for (size_t i = 0; i < fragmentation.fragmentationVectorSize; ++i)
-    VerifyStapAPayload(fragmentation, 0, i, frame, packet.payload());
-
-  EXPECT_FALSE(packetizer->NextPacket(&packet));
-}
-
-TEST(RtpPacketizerH264Test, TestStapARespectsPacketReduction) {
-  const size_t kLastPacketReduction = 100;
-  const size_t kFrameSize = kMaxPayloadSize - 1 - kLastPacketReduction;
-  uint8_t frame[kFrameSize] = {0x07, 0xFF,  // F=0, NRI=0, Type=7.
-                               0x08, 0xFF,  // F=0, NRI=0, Type=8.
-                               0x05};       // F=0, NRI=0, Type=5.
-  const size_t kPayloadOffset = 5;
-  for (size_t i = 0; i < kFrameSize - kPayloadOffset; ++i)
-    frame[i + kPayloadOffset] = i;
-  RTPFragmentationHeader fragmentation;
-  fragmentation.VerifyAndAllocateFragmentationHeader(3);
-  fragmentation.fragmentationOffset[0] = 0;
-  fragmentation.fragmentationLength[0] = 2;
-  fragmentation.fragmentationOffset[1] = 2;
-  fragmentation.fragmentationLength[1] = 2;
-  fragmentation.fragmentationOffset[2] = 4;
-  fragmentation.fragmentationLength[2] =
-      kNalHeaderSize + kFrameSize - kPayloadOffset;
-  std::unique_ptr<RtpPacketizer> packetizer(
-      CreateH264Packetizer(H264PacketizationMode::NonInterleaved,
-                           kMaxPayloadSize, kLastPacketReduction));
-  ASSERT_EQ(2u, packetizer->SetPayloadData(frame, kFrameSize, &fragmentation));
-
-  RtpPacketToSend packet(kNoExtensions);
-  ASSERT_LE(kMaxPayloadSize, packet.FreeCapacity());
-  ASSERT_TRUE(packetizer->NextPacket(&packet));
-  size_t expected_packet_size = kNalHeaderSize;
-  for (size_t i = 0; i < 2; ++i) {
-    expected_packet_size +=
-        kLengthFieldLength + fragmentation.fragmentationLength[i];
-  }
-  ASSERT_EQ(expected_packet_size, packet.payload_size());
-  for (size_t i = 0; i < 2; ++i)
-    VerifyStapAPayload(fragmentation, 0, i, frame, packet.payload());
-
-  ASSERT_TRUE(packetizer->NextPacket(&packet));
-  expected_packet_size = fragmentation.fragmentationLength[2];
-  ASSERT_EQ(expected_packet_size, packet.payload_size());
-  VerifySingleNaluPayload(fragmentation, 2, frame, packet.payload());
-
-  EXPECT_FALSE(packetizer->NextPacket(&packet));
-}
-
-TEST(RtpPacketizerH264Test, TestSingleNalUnitModeHasNoStapA) {
-  // This is the same setup as for the TestStapA test.
-  const size_t kFrameSize =
-      kMaxPayloadSize - 3 * kLengthFieldLength - kNalHeaderSize;
-  uint8_t frame[kFrameSize] = {0x07, 0xFF,  // F=0, NRI=0, Type=7 (SPS).
-                               0x08, 0xFF,  // F=0, NRI=0, Type=8 (PPS).
-                               0x05};       // F=0, NRI=0, Type=5 (IDR).
-  const size_t kPayloadOffset = 5;
-  for (size_t i = 0; i < kFrameSize - kPayloadOffset; ++i)
-    frame[i + kPayloadOffset] = i;
-  RTPFragmentationHeader fragmentation;
-  CreateThreeFragments(&fragmentation, kFrameSize, kPayloadOffset);
-  std::unique_ptr<RtpPacketizer> packetizer(CreateH264Packetizer(
-      H264PacketizationMode::SingleNalUnit, kMaxPayloadSize, 0));
-  packetizer->SetPayloadData(frame, kFrameSize, &fragmentation);
-
-  RtpPacketToSend packet(kNoExtensions);
-  // The three fragments should be returned as three packets.
-  ASSERT_TRUE(packetizer->NextPacket(&packet));
-  ASSERT_TRUE(packetizer->NextPacket(&packet));
-  ASSERT_TRUE(packetizer->NextPacket(&packet));
-  EXPECT_FALSE(packetizer->NextPacket(&packet));
-}
-
-TEST(RtpPacketizerH264Test, TestTooSmallForStapAHeaders) {
-  const size_t kFrameSize = kMaxPayloadSize - 1;
-  uint8_t frame[kFrameSize] = {0x07, 0xFF,  // F=0, NRI=0, Type=7.
-                               0x08, 0xFF,  // F=0, NRI=0, Type=8.
-                               0x05};       // F=0, NRI=0, Type=5.
-  const size_t kPayloadOffset = 5;
-  for (size_t i = 0; i < kFrameSize - kPayloadOffset; ++i)
-    frame[i + kPayloadOffset] = i;
-  RTPFragmentationHeader fragmentation;
-  fragmentation.VerifyAndAllocateFragmentationHeader(3);
-  fragmentation.fragmentationOffset[0] = 0;
-  fragmentation.fragmentationLength[0] = 2;
-  fragmentation.fragmentationOffset[1] = 2;
-  fragmentation.fragmentationLength[1] = 2;
-  fragmentation.fragmentationOffset[2] = 4;
-  fragmentation.fragmentationLength[2] =
-      kNalHeaderSize + kFrameSize - kPayloadOffset;
-  std::unique_ptr<RtpPacketizer> packetizer(CreateH264Packetizer(
-      H264PacketizationMode::NonInterleaved, kMaxPayloadSize, 0));
-  ASSERT_EQ(2u, packetizer->SetPayloadData(frame, kFrameSize, &fragmentation));
-
-  RtpPacketToSend packet(kNoExtensions);
-  ASSERT_LE(kMaxPayloadSize, packet.FreeCapacity());
-  ASSERT_TRUE(packetizer->NextPacket(&packet));
-  size_t expected_packet_size = kNalHeaderSize;
-  for (size_t i = 0; i < 2; ++i) {
-    expected_packet_size +=
-        kLengthFieldLength + fragmentation.fragmentationLength[i];
-  }
-  ASSERT_EQ(expected_packet_size, packet.payload_size());
-  for (size_t i = 0; i < 2; ++i)
-    VerifyStapAPayload(fragmentation, 0, i, frame, packet.payload());
-
-  ASSERT_TRUE(packetizer->NextPacket(&packet));
-  expected_packet_size = fragmentation.fragmentationLength[2];
-  ASSERT_EQ(expected_packet_size, packet.payload_size());
-  VerifySingleNaluPayload(fragmentation, 2, frame, packet.payload());
-
-  EXPECT_FALSE(packetizer->NextPacket(&packet));
-}
-
-TEST(RtpPacketizerH264Test, TestMixedStapA_FUA) {
-  const size_t kFuaNaluSize = 2 * (kMaxPayloadSize - 100);
-  const size_t kStapANaluSize = 100;
-  RTPFragmentationHeader fragmentation;
-  fragmentation.VerifyAndAllocateFragmentationHeader(3);
-  fragmentation.fragmentationOffset[0] = 0;
-  fragmentation.fragmentationLength[0] = kFuaNaluSize;
-  fragmentation.fragmentationOffset[1] = kFuaNaluSize;
-  fragmentation.fragmentationLength[1] = kStapANaluSize;
-  fragmentation.fragmentationOffset[2] = kFuaNaluSize + kStapANaluSize;
-  fragmentation.fragmentationLength[2] = kStapANaluSize;
-  const size_t kFrameSize = kFuaNaluSize + 2 * kStapANaluSize;
-  uint8_t frame[kFrameSize];
-  size_t nalu_offset = 0;
-  for (size_t i = 0; i < fragmentation.fragmentationVectorSize; ++i) {
-    nalu_offset = fragmentation.fragmentationOffset[i];
-    frame[nalu_offset] = 0x05;  // F=0, NRI=0, Type=5.
-    for (size_t j = 1; j < fragmentation.fragmentationLength[i]; ++j) {
-      frame[nalu_offset + j] = i + j;
-    }
-  }
-  std::unique_ptr<RtpPacketizer> packetizer(CreateH264Packetizer(
-      H264PacketizationMode::NonInterleaved, kMaxPayloadSize, 0));
-  ASSERT_EQ(3u, packetizer->SetPayloadData(frame, kFrameSize, &fragmentation));
-
-  // First expecting two FU-A packets.
-  std::vector<size_t> fua_sizes;
-  fua_sizes.push_back(1099);
-  fua_sizes.push_back(1100);
-  RtpPacketToSend packet(kNoExtensions);
-  ASSERT_LE(kMaxPayloadSize, packet.FreeCapacity());
-  int fua_offset = kNalHeaderSize;
-  for (size_t i = 0; i < 2; ++i) {
-    ASSERT_TRUE(packetizer->NextPacket(&packet));
-    VerifyFua(i, frame, fua_offset, packet.payload(), fua_sizes);
-    fua_offset += fua_sizes[i];
-  }
-  // Then expecting one STAP-A packet with two nal units.
-  ASSERT_TRUE(packetizer->NextPacket(&packet));
-  size_t expected_packet_size =
-      kNalHeaderSize + 2 * kLengthFieldLength + 2 * kStapANaluSize;
-  ASSERT_EQ(expected_packet_size, packet.payload_size());
-  for (size_t i = 1; i < fragmentation.fragmentationVectorSize; ++i)
-    VerifyStapAPayload(fragmentation, 1, i, frame, packet.payload());
-
-  EXPECT_FALSE(packetizer->NextPacket(&packet));
-}
-
-TEST(RtpPacketizerH264Test, TestFUAOddSize) {
-  const size_t kExpectedPayloadSizes[2] = {600, 600};
-  TestFua(
-      kMaxPayloadSize + 1, kMaxPayloadSize, 0,
-      std::vector<size_t>(kExpectedPayloadSizes,
-                          kExpectedPayloadSizes +
-                              sizeof(kExpectedPayloadSizes) / sizeof(size_t)));
-}
-
-TEST(RtpPacketizerH264Test, TestFUAWithLastPacketReduction) {
-  const size_t kExpectedPayloadSizes[2] = {601, 597};
-  TestFua(
-      kMaxPayloadSize - 1, kMaxPayloadSize, 4,
-      std::vector<size_t>(kExpectedPayloadSizes,
-                          kExpectedPayloadSizes +
-                              sizeof(kExpectedPayloadSizes) / sizeof(size_t)));
-}
-
-TEST(RtpPacketizerH264Test, TestFUAEvenSize) {
-  const size_t kExpectedPayloadSizes[2] = {600, 601};
-  TestFua(
-      kMaxPayloadSize + 2, kMaxPayloadSize, 0,
-      std::vector<size_t>(kExpectedPayloadSizes,
-                          kExpectedPayloadSizes +
-                              sizeof(kExpectedPayloadSizes) / sizeof(size_t)));
-}
-
-TEST(RtpPacketizerH264Test, TestFUARounding) {
-  const size_t kExpectedPayloadSizes[8] = {1265, 1265, 1265, 1265,
-                                           1265, 1266, 1266, 1266};
-  TestFua(
-      10124, 1448, 0,
-      std::vector<size_t>(kExpectedPayloadSizes,
-                          kExpectedPayloadSizes +
-                              sizeof(kExpectedPayloadSizes) / sizeof(size_t)));
-}
-
-TEST(RtpPacketizerH264Test, TestFUABig) {
-  const size_t kExpectedPayloadSizes[10] = {1198, 1198, 1198, 1198, 1198,
-                                            1198, 1198, 1198, 1198, 1198};
-  // Generate 10 full sized packets, leave room for FU-A headers minus the NALU
-  // header.
-  TestFua(
-      10 * (kMaxPayloadSize - kFuAHeaderSize) + kNalHeaderSize, kMaxPayloadSize,
-      0,
-      std::vector<size_t>(kExpectedPayloadSizes,
-                          kExpectedPayloadSizes +
-                              sizeof(kExpectedPayloadSizes) / sizeof(size_t)));
-}
-
-#if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
-
-TEST(RtpPacketizerH264DeathTest, SendOverlongDataInPacketizationMode0) {
-  const size_t kFrameSize = kMaxPayloadSize + 1;
-  uint8_t frame[kFrameSize] = {0};
-  for (size_t i = 0; i < kFrameSize; ++i)
-    frame[i] = i;
-  RTPFragmentationHeader fragmentation;
-  fragmentation.VerifyAndAllocateFragmentationHeader(1);
-  fragmentation.fragmentationOffset[0] = 0;
-  fragmentation.fragmentationLength[0] = kFrameSize;
-  // Set NAL headers.
-  frame[fragmentation.fragmentationOffset[0]] = 0x01;
-
-  std::unique_ptr<RtpPacketizer> packetizer(CreateH264Packetizer(
-      H264PacketizationMode::SingleNalUnit, kMaxPayloadSize, 0));
-  EXPECT_DEATH(packetizer->SetPayloadData(frame, kFrameSize, &fragmentation),
-               "payload_size");
-}
-
-#endif  // RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
-
-namespace {
-const uint8_t kStartSequence[] = {0x00, 0x00, 0x00, 0x01};
-const uint8_t kOriginalSps[] = {kSps, 0x00, 0x00, 0x03, 0x03,
-                                0xF4, 0x05, 0x03, 0xC7, 0xC0};
-const uint8_t kRewrittenSps[] = {kSps, 0x00, 0x00, 0x03, 0x03, 0xF4, 0x05, 0x03,
-                                 0xC7, 0xE0, 0x1B, 0x41, 0x10, 0x8D, 0x00};
-const uint8_t kIdrOne[] = {kIdr, 0xFF, 0x00, 0x00, 0x04};
-const uint8_t kIdrTwo[] = {kIdr, 0xFF, 0x00, 0x11};
-}
-
-class RtpPacketizerH264TestSpsRewriting : public ::testing::Test {
- public:
-  void SetUp() override {
-    fragmentation_header_.VerifyAndAllocateFragmentationHeader(3);
-    fragmentation_header_.fragmentationVectorSize = 3;
-    in_buffer_.AppendData(kStartSequence);
-
-    fragmentation_header_.fragmentationOffset[0] = in_buffer_.size();
-    fragmentation_header_.fragmentationLength[0] = sizeof(kOriginalSps);
-    in_buffer_.AppendData(kOriginalSps);
-
-    fragmentation_header_.fragmentationOffset[1] = in_buffer_.size();
-    fragmentation_header_.fragmentationLength[1] = sizeof(kIdrOne);
-    in_buffer_.AppendData(kIdrOne);
-
-    fragmentation_header_.fragmentationOffset[2] = in_buffer_.size();
-    fragmentation_header_.fragmentationLength[2] = sizeof(kIdrTwo);
-    in_buffer_.AppendData(kIdrTwo);
-  }
-
- protected:
-  rtc::Buffer in_buffer_;
-  RTPFragmentationHeader fragmentation_header_;
-  std::unique_ptr<RtpPacketizer> packetizer_;
-};
-
-TEST_F(RtpPacketizerH264TestSpsRewriting, FuASps) {
-  const size_t kHeaderOverhead = kFuAHeaderSize + 1;
-
-  // Set size to fragment SPS into two FU-A packets.
-  packetizer_.reset(
-      CreateH264Packetizer(H264PacketizationMode::NonInterleaved,
-                           sizeof(kOriginalSps) - 2 + kHeaderOverhead, 0));
-
-  packetizer_->SetPayloadData(in_buffer_.data(), in_buffer_.size(),
-                              &fragmentation_header_);
-
-  RtpPacketToSend packet(kNoExtensions);
-  ASSERT_LE(sizeof(kOriginalSps) + kHeaderOverhead, packet.FreeCapacity());
-
-  EXPECT_TRUE(packetizer_->NextPacket(&packet));
-  size_t offset = H264::kNaluTypeSize;
-  size_t length = packet.payload_size() - kFuAHeaderSize;
-  EXPECT_THAT(packet.payload().subview(kFuAHeaderSize),
-              ElementsAreArray(&kRewrittenSps[offset], length));
-  offset += length;
-
-  EXPECT_TRUE(packetizer_->NextPacket(&packet));
-  length = packet.payload_size() - kFuAHeaderSize;
-  EXPECT_THAT(packet.payload().subview(kFuAHeaderSize),
-              ElementsAreArray(&kRewrittenSps[offset], length));
-  offset += length;
-
-  EXPECT_EQ(offset, sizeof(kRewrittenSps));
-}
-
-TEST_F(RtpPacketizerH264TestSpsRewriting, StapASps) {
-  const size_t kHeaderOverhead = kFuAHeaderSize + 1;
-  const size_t kExpectedTotalSize = H264::kNaluTypeSize +  // Stap-A type.
-                                    sizeof(kRewrittenSps) + sizeof(kIdrOne) +
-                                    sizeof(kIdrTwo) + (kLengthFieldLength * 3);
-
-  // Set size to include SPS and the rest of the packets in a Stap-A package.
-  packetizer_.reset(CreateH264Packetizer(H264PacketizationMode::NonInterleaved,
-                                         kExpectedTotalSize + kHeaderOverhead,
-                                         0));
-
-  packetizer_->SetPayloadData(in_buffer_.data(), in_buffer_.size(),
-                              &fragmentation_header_);
-
-  RtpPacketToSend packet(kNoExtensions);
-  ASSERT_LE(kExpectedTotalSize + kHeaderOverhead, packet.FreeCapacity());
-
-  EXPECT_TRUE(packetizer_->NextPacket(&packet));
-  EXPECT_EQ(kExpectedTotalSize, packet.payload_size());
-  EXPECT_THAT(packet.payload().subview(H264::kNaluTypeSize + kLengthFieldLength,
-                                       sizeof(kRewrittenSps)),
-              ElementsAreArray(kRewrittenSps));
-}
-
-class RtpDepacketizerH264Test : public ::testing::Test {
- protected:
-  RtpDepacketizerH264Test()
-      : depacketizer_(RtpDepacketizer::Create(kRtpVideoH264)) {}
-
-  void ExpectPacket(RtpDepacketizer::ParsedPayload* parsed_payload,
-                    const uint8_t* data,
-                    size_t length) {
-    ASSERT_TRUE(parsed_payload != NULL);
-    EXPECT_THAT(std::vector<uint8_t>(
-                    parsed_payload->payload,
-                    parsed_payload->payload + parsed_payload->payload_length),
-                ::testing::ElementsAreArray(data, length));
-  }
-
-  std::unique_ptr<RtpDepacketizer> depacketizer_;
-};
-
-TEST_F(RtpDepacketizerH264Test, TestSingleNalu) {
-  uint8_t packet[2] = {0x05, 0xFF};  // F=0, NRI=0, Type=5 (IDR).
-  RtpDepacketizer::ParsedPayload payload;
-
-  ASSERT_TRUE(depacketizer_->Parse(&payload, packet, sizeof(packet)));
-  ExpectPacket(&payload, packet, sizeof(packet));
-  EXPECT_EQ(kVideoFrameKey, payload.frame_type);
-  EXPECT_EQ(kRtpVideoH264, payload.type.Video.codec);
-  EXPECT_TRUE(payload.type.Video.is_first_packet_in_frame);
-  EXPECT_EQ(kH264SingleNalu,
-            payload.type.Video.codecHeader.H264.packetization_type);
-  EXPECT_EQ(kIdr, payload.type.Video.codecHeader.H264.nalu_type);
-}
-
-TEST_F(RtpDepacketizerH264Test, TestSingleNaluSpsWithResolution) {
-  uint8_t packet[] = {kSps, 0x7A, 0x00, 0x1F, 0xBC, 0xD9, 0x40, 0x50,
-                      0x05, 0xBA, 0x10, 0x00, 0x00, 0x03, 0x00, 0xC0,
-                      0x00, 0x00, 0x03, 0x2A, 0xE0, 0xF1, 0x83, 0x25};
-  RtpDepacketizer::ParsedPayload payload;
-
-  ASSERT_TRUE(depacketizer_->Parse(&payload, packet, sizeof(packet)));
-  ExpectPacket(&payload, packet, sizeof(packet));
-  EXPECT_EQ(kVideoFrameKey, payload.frame_type);
-  EXPECT_EQ(kRtpVideoH264, payload.type.Video.codec);
-  EXPECT_TRUE(payload.type.Video.is_first_packet_in_frame);
-  EXPECT_EQ(kH264SingleNalu,
-            payload.type.Video.codecHeader.H264.packetization_type);
-  EXPECT_EQ(1280u, payload.type.Video.width);
-  EXPECT_EQ(720u, payload.type.Video.height);
-}
-
-TEST_F(RtpDepacketizerH264Test, TestStapAKey) {
-  // clang-format off
-  const NaluInfo kExpectedNalus[] = { {H264::kSps, 0, -1},
-                                      {H264::kPps, 1, 2},
-                                      {H264::kIdr, -1, 0} };
-  uint8_t packet[] = {kStapA,  // F=0, NRI=0, Type=24.
-                      // Length, nal header, payload.
-                      0, 0x18, kExpectedNalus[0].type,
-                        0x7A, 0x00, 0x1F, 0xBC, 0xD9, 0x40, 0x50, 0x05, 0xBA,
-                        0x10, 0x00, 0x00, 0x03, 0x00, 0xC0, 0x00, 0x00, 0x03,
-                        0x2A, 0xE0, 0xF1, 0x83, 0x25,
-                      0, 0xD, kExpectedNalus[1].type,
-                        0x69, 0xFC, 0x0, 0x0, 0x3, 0x0, 0x7, 0xFF, 0xFF, 0xFF,
-                        0xF6, 0x40,
-                      0, 0xB, kExpectedNalus[2].type,
-                        0x85, 0xB8, 0x0, 0x4, 0x0, 0x0, 0x13, 0x93, 0x12, 0x0};
-  // clang-format on
-
-  RtpDepacketizer::ParsedPayload payload;
-  ASSERT_TRUE(depacketizer_->Parse(&payload, packet, sizeof(packet)));
-  ExpectPacket(&payload, packet, sizeof(packet));
-  EXPECT_EQ(kVideoFrameKey, payload.frame_type);
-  EXPECT_EQ(kRtpVideoH264, payload.type.Video.codec);
-  EXPECT_TRUE(payload.type.Video.is_first_packet_in_frame);
-  const RTPVideoHeaderH264& h264 = payload.type.Video.codecHeader.H264;
-  EXPECT_EQ(kH264StapA, h264.packetization_type);
-  // NALU type for aggregated packets is the type of the first packet only.
-  EXPECT_EQ(kSps, h264.nalu_type);
-  ASSERT_EQ(3u, h264.nalus_length);
-  for (size_t i = 0; i < h264.nalus_length; ++i) {
-    EXPECT_EQ(kExpectedNalus[i].type, h264.nalus[i].type)
-        << "Failed parsing nalu " << i;
-    EXPECT_EQ(kExpectedNalus[i].sps_id, h264.nalus[i].sps_id)
-        << "Failed parsing nalu " << i;
-    EXPECT_EQ(kExpectedNalus[i].pps_id, h264.nalus[i].pps_id)
-        << "Failed parsing nalu " << i;
-  }
-}
-
-TEST_F(RtpDepacketizerH264Test, TestStapANaluSpsWithResolution) {
-  uint8_t packet[] = {kStapA,  // F=0, NRI=0, Type=24.
-                      // Length (2 bytes), nal header, payload.
-                      0x00, 0x19, kSps, 0x7A, 0x00, 0x1F, 0xBC, 0xD9, 0x40,
-                      0x50, 0x05, 0xBA, 0x10, 0x00, 0x00, 0x03, 0x00, 0xC0,
-                      0x00, 0x00, 0x03, 0x2A, 0xE0, 0xF1, 0x83, 0x25, 0x80,
-                      0x00, 0x03, kIdr, 0xFF, 0x00, 0x00, 0x04, kIdr, 0xFF,
-                      0x00, 0x11};
-
-  RtpDepacketizer::ParsedPayload payload;
-
-  ASSERT_TRUE(depacketizer_->Parse(&payload, packet, sizeof(packet)));
-  ExpectPacket(&payload, packet, sizeof(packet));
-  EXPECT_EQ(kVideoFrameKey, payload.frame_type);
-  EXPECT_EQ(kRtpVideoH264, payload.type.Video.codec);
-  EXPECT_TRUE(payload.type.Video.is_first_packet_in_frame);
-  EXPECT_EQ(kH264StapA, payload.type.Video.codecHeader.H264.packetization_type);
-  EXPECT_EQ(1280u, payload.type.Video.width);
-  EXPECT_EQ(720u, payload.type.Video.height);
-}
-
-TEST_F(RtpDepacketizerH264Test, TestEmptyStapARejected) {
-  uint8_t lone_empty_packet[] = {kStapA, 0x00, 0x00};
-
-  uint8_t leading_empty_packet[] = {kStapA, 0x00, 0x00, 0x00, 0x04,
-                                    kIdr,   0xFF, 0x00, 0x11};
-
-  uint8_t middle_empty_packet[] = {kStapA, 0x00, 0x03, kIdr, 0xFF, 0x00, 0x00,
-                                   0x00,   0x00, 0x04, kIdr, 0xFF, 0x00, 0x11};
-
-  uint8_t trailing_empty_packet[] = {kStapA, 0x00, 0x03, kIdr,
-                                     0xFF,   0x00, 0x00, 0x00};
-
-  RtpDepacketizer::ParsedPayload payload;
-
-  EXPECT_FALSE(depacketizer_->Parse(&payload, lone_empty_packet,
-                                    sizeof(lone_empty_packet)));
-  EXPECT_FALSE(depacketizer_->Parse(&payload, leading_empty_packet,
-                                    sizeof(leading_empty_packet)));
-  EXPECT_FALSE(depacketizer_->Parse(&payload, middle_empty_packet,
-                                    sizeof(middle_empty_packet)));
-  EXPECT_FALSE(depacketizer_->Parse(&payload, trailing_empty_packet,
-                                    sizeof(trailing_empty_packet)));
-}
-
-TEST_F(RtpDepacketizerH264Test, DepacketizeWithRewriting) {
-  rtc::Buffer in_buffer;
-  rtc::Buffer out_buffer;
-
-  uint8_t kHeader[2] = {kStapA};
-  in_buffer.AppendData(kHeader, 1);
-  out_buffer.AppendData(kHeader, 1);
-
-  ByteWriter<uint16_t>::WriteBigEndian(kHeader, sizeof(kOriginalSps));
-  in_buffer.AppendData(kHeader, 2);
-  in_buffer.AppendData(kOriginalSps);
-  ByteWriter<uint16_t>::WriteBigEndian(kHeader, sizeof(kRewrittenSps));
-  out_buffer.AppendData(kHeader, 2);
-  out_buffer.AppendData(kRewrittenSps);
-
-  ByteWriter<uint16_t>::WriteBigEndian(kHeader, sizeof(kIdrOne));
-  in_buffer.AppendData(kHeader, 2);
-  in_buffer.AppendData(kIdrOne);
-  out_buffer.AppendData(kHeader, 2);
-  out_buffer.AppendData(kIdrOne);
-
-  ByteWriter<uint16_t>::WriteBigEndian(kHeader, sizeof(kIdrTwo));
-  in_buffer.AppendData(kHeader, 2);
-  in_buffer.AppendData(kIdrTwo);
-  out_buffer.AppendData(kHeader, 2);
-  out_buffer.AppendData(kIdrTwo);
-
-  RtpDepacketizer::ParsedPayload payload;
-  EXPECT_TRUE(
-      depacketizer_->Parse(&payload, in_buffer.data(), in_buffer.size()));
-
-  std::vector<uint8_t> expected_packet_payload(
-      out_buffer.data(), &out_buffer.data()[out_buffer.size()]);
-
-  EXPECT_THAT(
-      expected_packet_payload,
-      ::testing::ElementsAreArray(payload.payload, payload.payload_length));
-}
-
-TEST_F(RtpDepacketizerH264Test, DepacketizeWithDoubleRewriting) {
-  rtc::Buffer in_buffer;
-  rtc::Buffer out_buffer;
-
-  uint8_t kHeader[2] = {kStapA};
-  in_buffer.AppendData(kHeader, 1);
-  out_buffer.AppendData(kHeader, 1);
-
-  // First SPS will be kept...
-  ByteWriter<uint16_t>::WriteBigEndian(kHeader, sizeof(kOriginalSps));
-  in_buffer.AppendData(kHeader, 2);
-  in_buffer.AppendData(kOriginalSps);
-  out_buffer.AppendData(kHeader, 2);
-  out_buffer.AppendData(kOriginalSps);
-
-  // ...only the second one will be rewritten.
-  ByteWriter<uint16_t>::WriteBigEndian(kHeader, sizeof(kOriginalSps));
-  in_buffer.AppendData(kHeader, 2);
-  in_buffer.AppendData(kOriginalSps);
-  ByteWriter<uint16_t>::WriteBigEndian(kHeader, sizeof(kRewrittenSps));
-  out_buffer.AppendData(kHeader, 2);
-  out_buffer.AppendData(kRewrittenSps);
-
-  ByteWriter<uint16_t>::WriteBigEndian(kHeader, sizeof(kIdrOne));
-  in_buffer.AppendData(kHeader, 2);
-  in_buffer.AppendData(kIdrOne);
-  out_buffer.AppendData(kHeader, 2);
-  out_buffer.AppendData(kIdrOne);
-
-  ByteWriter<uint16_t>::WriteBigEndian(kHeader, sizeof(kIdrTwo));
-  in_buffer.AppendData(kHeader, 2);
-  in_buffer.AppendData(kIdrTwo);
-  out_buffer.AppendData(kHeader, 2);
-  out_buffer.AppendData(kIdrTwo);
-
-  RtpDepacketizer::ParsedPayload payload;
-  EXPECT_TRUE(
-      depacketizer_->Parse(&payload, in_buffer.data(), in_buffer.size()));
-
-  std::vector<uint8_t> expected_packet_payload(
-      out_buffer.data(), &out_buffer.data()[out_buffer.size()]);
-
-  EXPECT_THAT(
-      expected_packet_payload,
-      ::testing::ElementsAreArray(payload.payload, payload.payload_length));
-}
-
-TEST_F(RtpDepacketizerH264Test, TestStapADelta) {
-  uint8_t packet[16] = {kStapA,  // F=0, NRI=0, Type=24.
-                        // Length, nal header, payload.
-                        0,      0x02, kSlice, 0xFF,   0,    0x03, kSlice, 0xFF,
-                        0x00,   0,    0x04,   kSlice, 0xFF, 0x00, 0x11};
-  RtpDepacketizer::ParsedPayload payload;
-
-  ASSERT_TRUE(depacketizer_->Parse(&payload, packet, sizeof(packet)));
-  ExpectPacket(&payload, packet, sizeof(packet));
-  EXPECT_EQ(kVideoFrameDelta, payload.frame_type);
-  EXPECT_EQ(kRtpVideoH264, payload.type.Video.codec);
-  EXPECT_TRUE(payload.type.Video.is_first_packet_in_frame);
-  EXPECT_EQ(kH264StapA, payload.type.Video.codecHeader.H264.packetization_type);
-  // NALU type for aggregated packets is the type of the first packet only.
-  EXPECT_EQ(kSlice, payload.type.Video.codecHeader.H264.nalu_type);
-}
-
-TEST_F(RtpDepacketizerH264Test, TestFuA) {
-  // clang-format off
-  uint8_t packet1[] = {
-      kFuA,          // F=0, NRI=0, Type=28.
-      kSBit | kIdr,  // FU header.
-      0x85, 0xB8, 0x0, 0x4, 0x0, 0x0, 0x13, 0x93, 0x12, 0x0  // Payload.
-  };
-  // clang-format on
-  const uint8_t kExpected1[] = {kIdr, 0x85, 0xB8, 0x0,  0x4, 0x0,
-                                0x0,  0x13, 0x93, 0x12, 0x0};
-
-  uint8_t packet2[] = {
-      kFuA,  // F=0, NRI=0, Type=28.
-      kIdr,  // FU header.
-      0x02   // Payload.
-  };
-  const uint8_t kExpected2[] = {0x02};
-
-  uint8_t packet3[] = {
-      kFuA,          // F=0, NRI=0, Type=28.
-      kEBit | kIdr,  // FU header.
-      0x03           // Payload.
-  };
-  const uint8_t kExpected3[] = {0x03};
-
-  RtpDepacketizer::ParsedPayload payload;
-
-  // We expect that the first packet is one byte shorter since the FU-A header
-  // has been replaced by the original nal header.
-  ASSERT_TRUE(depacketizer_->Parse(&payload, packet1, sizeof(packet1)));
-  ExpectPacket(&payload, kExpected1, sizeof(kExpected1));
-  EXPECT_EQ(kVideoFrameKey, payload.frame_type);
-  EXPECT_EQ(kRtpVideoH264, payload.type.Video.codec);
-  EXPECT_TRUE(payload.type.Video.is_first_packet_in_frame);
-  const RTPVideoHeaderH264& h264 = payload.type.Video.codecHeader.H264;
-  EXPECT_EQ(kH264FuA, h264.packetization_type);
-  EXPECT_EQ(kIdr, h264.nalu_type);
-  ASSERT_EQ(1u, h264.nalus_length);
-  EXPECT_EQ(static_cast<H264::NaluType>(kIdr), h264.nalus[0].type);
-  EXPECT_EQ(-1, h264.nalus[0].sps_id);
-  EXPECT_EQ(0, h264.nalus[0].pps_id);
-
-  // Following packets will be 2 bytes shorter since they will only be appended
-  // onto the first packet.
-  payload = RtpDepacketizer::ParsedPayload();
-  ASSERT_TRUE(depacketizer_->Parse(&payload, packet2, sizeof(packet2)));
-  ExpectPacket(&payload, kExpected2, sizeof(kExpected2));
-  EXPECT_EQ(kVideoFrameKey, payload.frame_type);
-  EXPECT_EQ(kRtpVideoH264, payload.type.Video.codec);
-  EXPECT_FALSE(payload.type.Video.is_first_packet_in_frame);
-  {
-    const RTPVideoHeaderH264& h264 = payload.type.Video.codecHeader.H264;
-    EXPECT_EQ(kH264FuA, h264.packetization_type);
-    EXPECT_EQ(kIdr, h264.nalu_type);
-    // NALU info is only expected for the first FU-A packet.
-    EXPECT_EQ(0u, h264.nalus_length);
-  }
-
-  payload = RtpDepacketizer::ParsedPayload();
-  ASSERT_TRUE(depacketizer_->Parse(&payload, packet3, sizeof(packet3)));
-  ExpectPacket(&payload, kExpected3, sizeof(kExpected3));
-  EXPECT_EQ(kVideoFrameKey, payload.frame_type);
-  EXPECT_EQ(kRtpVideoH264, payload.type.Video.codec);
-  EXPECT_FALSE(payload.type.Video.is_first_packet_in_frame);
-  {
-    const RTPVideoHeaderH264& h264 = payload.type.Video.codecHeader.H264;
-    EXPECT_EQ(kH264FuA, h264.packetization_type);
-    EXPECT_EQ(kIdr, h264.nalu_type);
-    // NALU info is only expected for the first FU-A packet.
-    ASSERT_EQ(0u, h264.nalus_length);
-  }
-}
-
-TEST_F(RtpDepacketizerH264Test, TestEmptyPayload) {
-  // Using a wild pointer to crash on accesses from inside the depacketizer.
-  uint8_t* garbage_ptr = reinterpret_cast<uint8_t*>(0x4711);
-  RtpDepacketizer::ParsedPayload payload;
-  EXPECT_FALSE(depacketizer_->Parse(&payload, garbage_ptr, 0));
-}
-
-TEST_F(RtpDepacketizerH264Test, TestTruncatedFuaNalu) {
-  const uint8_t kPayload[] = {0x9c};
-  RtpDepacketizer::ParsedPayload payload;
-  EXPECT_FALSE(depacketizer_->Parse(&payload, kPayload, sizeof(kPayload)));
-}
-
-TEST_F(RtpDepacketizerH264Test, TestTruncatedSingleStapANalu) {
-  const uint8_t kPayload[] = {0xd8, 0x27};
-  RtpDepacketizer::ParsedPayload payload;
-  EXPECT_FALSE(depacketizer_->Parse(&payload, kPayload, sizeof(kPayload)));
-}
-
-TEST_F(RtpDepacketizerH264Test, TestStapAPacketWithTruncatedNalUnits) {
-  const uint8_t kPayload[] = { 0x58, 0xCB, 0xED, 0xDF};
-  RtpDepacketizer::ParsedPayload payload;
-  EXPECT_FALSE(depacketizer_->Parse(&payload, kPayload, sizeof(kPayload)));
-}
-
-TEST_F(RtpDepacketizerH264Test, TestTruncationJustAfterSingleStapANalu) {
-  const uint8_t kPayload[] = {0x38, 0x27, 0x27};
-  RtpDepacketizer::ParsedPayload payload;
-  EXPECT_FALSE(depacketizer_->Parse(&payload, kPayload, sizeof(kPayload)));
-}
-
-TEST_F(RtpDepacketizerH264Test, TestShortSpsPacket) {
-  const uint8_t kPayload[] = {0x27, 0x80, 0x00};
-  RtpDepacketizer::ParsedPayload payload;
-  EXPECT_TRUE(depacketizer_->Parse(&payload, kPayload, sizeof(kPayload)));
-}
-
-TEST_F(RtpDepacketizerH264Test, TestSeiPacket) {
-  const uint8_t kPayload[] = {
-      kSei,  // F=0, NRI=0, Type=6.
-      0x03, 0x03, 0x03, 0x03  // Payload.
-  };
-  RtpDepacketizer::ParsedPayload payload;
-  ASSERT_TRUE(depacketizer_->Parse(&payload, kPayload, sizeof(kPayload)));
-  const RTPVideoHeaderH264& h264 = payload.type.Video.codecHeader.H264;
-  EXPECT_EQ(kVideoFrameDelta, payload.frame_type);
-  EXPECT_EQ(kH264SingleNalu, h264.packetization_type);
-  EXPECT_EQ(kSei, h264.nalu_type);
-  ASSERT_EQ(1u, h264.nalus_length);
-  EXPECT_EQ(static_cast<H264::NaluType>(kSei), h264.nalus[0].type);
-  EXPECT_EQ(-1, h264.nalus[0].sps_id);
-  EXPECT_EQ(-1, h264.nalus[0].pps_id);
-}
-
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/rtp_format_video_generic.cc b/modules/rtp_rtcp/source/rtp_format_video_generic.cc
deleted file mode 100644
index ffb5f77..0000000
--- a/modules/rtp_rtcp/source/rtp_format_video_generic.cc
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- *  Copyright (c) 2014 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 <string>
-
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_format_video_generic.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_packet_to_send.h"
-#include "webrtc/rtc_base/logging.h"
-
-namespace webrtc {
-
-static const size_t kGenericHeaderLength = 1;
-
-RtpPacketizerGeneric::RtpPacketizerGeneric(FrameType frame_type,
-                                           size_t max_payload_len,
-                                           size_t last_packet_reduction_len)
-    : payload_data_(NULL),
-      payload_size_(0),
-      max_payload_len_(max_payload_len - kGenericHeaderLength),
-      last_packet_reduction_len_(last_packet_reduction_len),
-      frame_type_(frame_type),
-      num_packets_left_(0),
-      num_larger_packets_(0) {}
-
-RtpPacketizerGeneric::~RtpPacketizerGeneric() {
-}
-
-size_t RtpPacketizerGeneric::SetPayloadData(
-    const uint8_t* payload_data,
-    size_t payload_size,
-    const RTPFragmentationHeader* fragmentation) {
-  payload_data_ = payload_data;
-  payload_size_ = payload_size;
-
-  // Fragment packets such that they are almost the same size, even accounting
-  // for larger header in the last packet.
-  // Since we are given how much extra space is occupied by the longer header
-  // in the last packet, we can pretend that RTP headers are the same, but
-  // there's last_packet_reduction_len_ virtual payload, to be put at the end of
-  // the last packet.
-  //
-  size_t total_bytes = payload_size_ + last_packet_reduction_len_;
-
-  // Minimum needed number of packets to fit payload and virtual payload in the
-  // last packet.
-  num_packets_left_ = (total_bytes + max_payload_len_ - 1) / max_payload_len_;
-  // Given number of packets, calculate average size rounded down.
-  payload_len_per_packet_ = total_bytes / num_packets_left_;
-  // If we can't divide everything perfectly evenly, we put 1 extra byte in some
-  // last packets: 14 bytes in 4 packets would be split as 3+3+4+4.
-  num_larger_packets_ = total_bytes % num_packets_left_;
-  RTC_DCHECK_LE(payload_len_per_packet_, max_payload_len_);
-
-  generic_header_ = RtpFormatVideoGeneric::kFirstPacketBit;
-  if (frame_type_ == kVideoFrameKey) {
-    generic_header_ |= RtpFormatVideoGeneric::kKeyFrameBit;
-  }
-  return num_packets_left_;
-}
-
-bool RtpPacketizerGeneric::NextPacket(RtpPacketToSend* packet) {
-  RTC_DCHECK(packet);
-  if (num_packets_left_ == 0)
-    return false;
-  // Last larger_packets_ packets are 1 byte larger than previous packets.
-  // Increase per packet payload once needed.
-  if (num_packets_left_ == num_larger_packets_)
-    ++payload_len_per_packet_;
-  size_t next_packet_payload_len = payload_len_per_packet_;
-  if (payload_size_ <= next_packet_payload_len) {
-    // Whole payload fits into this packet.
-    next_packet_payload_len = payload_size_;
-    if (num_packets_left_ == 2) {
-      // This is the penultimate packet. Leave at least 1 payload byte for the
-      // last packet.
-      --next_packet_payload_len;
-      RTC_DCHECK_GT(next_packet_payload_len, 0);
-    }
-  }
-  RTC_DCHECK_LE(next_packet_payload_len, max_payload_len_);
-
-  uint8_t* out_ptr =
-      packet->AllocatePayload(kGenericHeaderLength + next_packet_payload_len);
-  // Put generic header in packet.
-  out_ptr[0] = generic_header_;
-  // Remove first-packet bit, following packets are intermediate.
-  generic_header_ &= ~RtpFormatVideoGeneric::kFirstPacketBit;
-
-  // Put payload in packet.
-  memcpy(out_ptr + kGenericHeaderLength, payload_data_,
-         next_packet_payload_len);
-  payload_data_ += next_packet_payload_len;
-  payload_size_ -= next_packet_payload_len;
-  --num_packets_left_;
-  // Packets left to produce and data left to split should end at the same time.
-  RTC_DCHECK_EQ(num_packets_left_ == 0, payload_size_ == 0);
-
-  packet->SetMarker(payload_size_ == 0);
-
-  return true;
-}
-
-std::string RtpPacketizerGeneric::ToString() {
-  return "RtpPacketizerGeneric";
-}
-
-bool RtpDepacketizerGeneric::Parse(ParsedPayload* parsed_payload,
-                                   const uint8_t* payload_data,
-                                   size_t payload_data_length) {
-  assert(parsed_payload != NULL);
-  if (payload_data_length == 0) {
-    LOG(LS_ERROR) << "Empty payload.";
-    return false;
-  }
-
-  uint8_t generic_header = *payload_data++;
-  --payload_data_length;
-
-  parsed_payload->frame_type =
-      ((generic_header & RtpFormatVideoGeneric::kKeyFrameBit) != 0)
-          ? kVideoFrameKey
-          : kVideoFrameDelta;
-  parsed_payload->type.Video.is_first_packet_in_frame =
-      (generic_header & RtpFormatVideoGeneric::kFirstPacketBit) != 0;
-  parsed_payload->type.Video.codec = kRtpVideoGeneric;
-  parsed_payload->type.Video.width = 0;
-  parsed_payload->type.Video.height = 0;
-
-  parsed_payload->payload = payload_data;
-  parsed_payload->payload_length = payload_data_length;
-  return true;
-}
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/rtp_format_video_generic.h b/modules/rtp_rtcp/source/rtp_format_video_generic.h
deleted file mode 100644
index 9fa3cce..0000000
--- a/modules/rtp_rtcp/source/rtp_format_video_generic.h
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- *  Copyright (c) 2013 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_RTP_RTCP_SOURCE_RTP_FORMAT_VIDEO_GENERIC_H_
-#define WEBRTC_MODULES_RTP_RTCP_SOURCE_RTP_FORMAT_VIDEO_GENERIC_H_
-
-#include <string>
-
-#include "webrtc/common_types.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_format.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-namespace RtpFormatVideoGeneric {
-static const uint8_t kKeyFrameBit = 0x01;
-static const uint8_t kFirstPacketBit = 0x02;
-}  // namespace RtpFormatVideoGeneric
-
-class RtpPacketizerGeneric : public RtpPacketizer {
- public:
-  // Initialize with payload from encoder.
-  // The payload_data must be exactly one encoded generic frame.
-  RtpPacketizerGeneric(FrameType frametype,
-                       size_t max_payload_len,
-                       size_t last_packet_reduction_len);
-
-  virtual ~RtpPacketizerGeneric();
-
-  // Returns total number of packets to be generated.
-  size_t SetPayloadData(const uint8_t* payload_data,
-                        size_t payload_size,
-                        const RTPFragmentationHeader* fragmentation) override;
-
-  // Get the next payload with generic payload header.
-  // Write payload and set marker bit of the |packet|.
-  // Returns true on success, false otherwise.
-  bool NextPacket(RtpPacketToSend* packet) override;
-
-  std::string ToString() override;
-
- private:
-  const uint8_t* payload_data_;
-  size_t payload_size_;
-  const size_t max_payload_len_;
-  const size_t last_packet_reduction_len_;
-  FrameType frame_type_;
-  size_t payload_len_per_packet_;
-  uint8_t generic_header_;
-  // Number of packets yet to be retrieved by NextPacket() call.
-  size_t num_packets_left_;
-  // Number of packets, which will be 1 byte more than the rest.
-  size_t num_larger_packets_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(RtpPacketizerGeneric);
-};
-
-// Depacketizer for generic codec.
-class RtpDepacketizerGeneric : public RtpDepacketizer {
- public:
-  virtual ~RtpDepacketizerGeneric() {}
-
-  bool Parse(ParsedPayload* parsed_payload,
-             const uint8_t* payload_data,
-             size_t payload_data_length) override;
-};
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_RTP_RTCP_SOURCE_RTP_FORMAT_VIDEO_GENERIC_H_
diff --git a/modules/rtp_rtcp/source/rtp_format_video_generic_unittest.cc b/modules/rtp_rtcp/source/rtp_format_video_generic_unittest.cc
deleted file mode 100644
index 78ee435..0000000
--- a/modules/rtp_rtcp/source/rtp_format_video_generic_unittest.cc
+++ /dev/null
@@ -1,192 +0,0 @@
-/*
- *  Copyright (c) 2017 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 <algorithm>
-#include <limits>
-#include <memory>
-#include <vector>
-
-#include "webrtc/api/array_view.h"
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/modules/rtp_rtcp/mocks/mock_rtp_rtcp.h"
-#include "webrtc/modules/rtp_rtcp/source/byte_io.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_format_video_generic.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_packet_to_send.h"
-#include "webrtc/test/gmock.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-namespace {
-
-using ::testing::Each;
-using ::testing::ElementsAreArray;
-using ::testing::Le;
-using ::testing::SizeIs;
-
-const size_t kMaxPayloadSize = 1200;
-
-uint8_t kTestPayload[kMaxPayloadSize];
-
-std::vector<size_t> NextPacketFillPayloadSizes(
-    RtpPacketizerGeneric* packetizer) {
-  RtpPacketToSend packet(nullptr);
-  std::vector<size_t> result;
-  while (packetizer->NextPacket(&packet)) {
-    result.push_back(packet.payload_size());
-  }
-  return result;
-}
-
-size_t GetEffectivePacketsSizeDifference(std::vector<size_t>* payload_sizes,
-                                         size_t last_packet_reduction_len) {
-  // Account for larger last packet header.
-  payload_sizes->back() += last_packet_reduction_len;
-  auto minmax =
-      std::minmax_element(payload_sizes->begin(), payload_sizes->end());
-  // MAX-MIN
-  size_t difference = *minmax.second - *minmax.first;
-  // Revert temporary changes.
-  payload_sizes->back() -= last_packet_reduction_len;
-  return difference;
-}
-
-}  // namespace
-
-TEST(RtpPacketizerVideoGeneric, AllPacketsMayBeEqual_RespectsMaxPayloadSize) {
-  const size_t kMaxPayloadLen = 6;
-  const size_t kLastPacketReductionLen = 2;
-  const size_t kPayloadSize = 13;
-  RtpPacketizerGeneric packetizer(kVideoFrameKey, kMaxPayloadLen,
-                                  kLastPacketReductionLen);
-  size_t num_packets =
-      packetizer.SetPayloadData(kTestPayload, kPayloadSize, nullptr);
-  std::vector<size_t> payload_sizes = NextPacketFillPayloadSizes(&packetizer);
-  EXPECT_THAT(payload_sizes, SizeIs(num_packets));
-
-  EXPECT_THAT(payload_sizes, Each(Le(kMaxPayloadLen)));
-}
-
-TEST(RtpPacketizerVideoGeneric,
-     AllPacketsMayBeEqual_RespectsLastPacketReductionLength) {
-  const size_t kMaxPayloadLen = 6;
-  const size_t kLastPacketReductionLen = 2;
-  const size_t kPayloadSize = 13;
-  RtpPacketizerGeneric packetizer(kVideoFrameKey, kMaxPayloadLen,
-                                  kLastPacketReductionLen);
-  size_t num_packets =
-      packetizer.SetPayloadData(kTestPayload, kPayloadSize, nullptr);
-  std::vector<size_t> payload_sizes = NextPacketFillPayloadSizes(&packetizer);
-  EXPECT_THAT(payload_sizes, SizeIs(num_packets));
-
-  EXPECT_LE(payload_sizes.back(), kMaxPayloadLen - kLastPacketReductionLen);
-}
-
-TEST(RtpPacketizerVideoGeneric,
-     AllPacketsMayBeEqual_MakesPacketsAlmostEqualInSize) {
-  const size_t kMaxPayloadLen = 6;
-  const size_t kLastPacketReductionLen = 2;
-  const size_t kPayloadSize = 13;
-  RtpPacketizerGeneric packetizer(kVideoFrameKey, kMaxPayloadLen,
-                                  kLastPacketReductionLen);
-  size_t num_packets =
-      packetizer.SetPayloadData(kTestPayload, kPayloadSize, nullptr);
-  std::vector<size_t> payload_sizes = NextPacketFillPayloadSizes(&packetizer);
-  EXPECT_THAT(payload_sizes, SizeIs(num_packets));
-
-  size_t sizes_difference = GetEffectivePacketsSizeDifference(
-      &payload_sizes, kLastPacketReductionLen);
-  EXPECT_LE(sizes_difference, 1u);
-}
-
-TEST(RtpPacketizerVideoGeneric,
-     AllPacketsMayBeEqual_GeneratesMinimumNumberOfPackets) {
-  const size_t kMaxPayloadLen = 6;
-  const size_t kLastPacketReductionLen = 3;
-  const size_t kPayloadSize = 13;
-  // Computed by hand. 3 packets would have capacity 3*(6-1)-3=12 (max length -
-  // generic header lengh for each packet minus last packet reduction).
-  // 4 packets is enough for kPayloadSize.
-  const size_t kMinNumPackets = 4;
-  RtpPacketizerGeneric packetizer(kVideoFrameKey, kMaxPayloadLen,
-                                  kLastPacketReductionLen);
-  size_t num_packets =
-      packetizer.SetPayloadData(kTestPayload, kPayloadSize, nullptr);
-  std::vector<size_t> payload_sizes = NextPacketFillPayloadSizes(&packetizer);
-  EXPECT_THAT(payload_sizes, SizeIs(num_packets));
-
-  EXPECT_EQ(num_packets, kMinNumPackets);
-}
-
-TEST(RtpPacketizerVideoGeneric, SomePacketsAreSmaller_RespectsMaxPayloadSize) {
-  const size_t kMaxPayloadLen = 8;
-  const size_t kLastPacketReductionLen = 5;
-  const size_t kPayloadSize = 28;
-  RtpPacketizerGeneric packetizer(kVideoFrameKey, kMaxPayloadLen,
-                                  kLastPacketReductionLen);
-  size_t num_packets =
-      packetizer.SetPayloadData(kTestPayload, kPayloadSize, nullptr);
-  std::vector<size_t> payload_sizes = NextPacketFillPayloadSizes(&packetizer);
-  EXPECT_THAT(payload_sizes, SizeIs(num_packets));
-
-  EXPECT_THAT(payload_sizes, Each(Le(kMaxPayloadLen)));
-}
-
-TEST(RtpPacketizerVideoGeneric,
-     SomePacketsAreSmaller_RespectsLastPacketReductionLength) {
-  const size_t kMaxPayloadLen = 8;
-  const size_t kLastPacketReductionLen = 5;
-  const size_t kPayloadSize = 28;
-  RtpPacketizerGeneric packetizer(kVideoFrameKey, kMaxPayloadLen,
-                                  kLastPacketReductionLen);
-  size_t num_packets =
-      packetizer.SetPayloadData(kTestPayload, kPayloadSize, nullptr);
-  std::vector<size_t> payload_sizes = NextPacketFillPayloadSizes(&packetizer);
-  EXPECT_THAT(payload_sizes, SizeIs(num_packets));
-
-  EXPECT_LE(payload_sizes.back(), kMaxPayloadLen - kLastPacketReductionLen);
-}
-
-TEST(RtpPacketizerVideoGeneric,
-     SomePacketsAreSmaller_MakesPacketsAlmostEqualInSize) {
-  const size_t kMaxPayloadLen = 8;
-  const size_t kLastPacketReductionLen = 5;
-  const size_t kPayloadSize = 28;
-  RtpPacketizerGeneric packetizer(kVideoFrameKey, kMaxPayloadLen,
-                                  kLastPacketReductionLen);
-  size_t num_packets =
-      packetizer.SetPayloadData(kTestPayload, kPayloadSize, nullptr);
-  std::vector<size_t> payload_sizes = NextPacketFillPayloadSizes(&packetizer);
-  EXPECT_THAT(payload_sizes, SizeIs(num_packets));
-
-  size_t sizes_difference = GetEffectivePacketsSizeDifference(
-      &payload_sizes, kLastPacketReductionLen);
-  EXPECT_LE(sizes_difference, 1u);
-}
-
-TEST(RtpPacketizerVideoGeneric,
-     SomePacketsAreSmaller_GeneratesMinimumNumberOfPackets) {
-  const size_t kMaxPayloadLen = 8;
-  const size_t kLastPacketReductionLen = 5;
-  const size_t kPayloadSize = 28;
-  // Computed by hand. 4 packets would have capacity 4*(8-1)-5=23 (max length -
-  // generic header lengh for each packet minus last packet reduction).
-  // 5 packets is enough for kPayloadSize.
-  const size_t kMinNumPackets = 5;
-  RtpPacketizerGeneric packetizer(kVideoFrameKey, kMaxPayloadLen,
-                                  kLastPacketReductionLen);
-  size_t num_packets =
-      packetizer.SetPayloadData(kTestPayload, kPayloadSize, nullptr);
-  std::vector<size_t> payload_sizes = NextPacketFillPayloadSizes(&packetizer);
-  EXPECT_THAT(payload_sizes, SizeIs(num_packets));
-
-  EXPECT_EQ(num_packets, kMinNumPackets);
-}
-
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/rtp_format_vp8.cc b/modules/rtp_rtcp/source/rtp_format_vp8.cc
deleted file mode 100644
index e56a977..0000000
--- a/modules/rtp_rtcp/source/rtp_format_vp8.cc
+++ /dev/null
@@ -1,685 +0,0 @@
-/*
- *  Copyright (c) 2011 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/rtp_rtcp/source/rtp_format_vp8.h"
-
-#include <assert.h>  // assert
-#include <string.h>  // memcpy
-
-#include <limits>
-#include <utility>
-#include <vector>
-
-#include "webrtc/modules/rtp_rtcp/source/rtp_packet_to_send.h"
-#include "webrtc/rtc_base/logging.h"
-
-namespace webrtc {
-namespace {
-int ParseVP8PictureID(RTPVideoHeaderVP8* vp8,
-                      const uint8_t** data,
-                      size_t* data_length,
-                      size_t* parsed_bytes) {
-  assert(vp8 != NULL);
-  if (*data_length == 0)
-    return -1;
-
-  vp8->pictureId = (**data & 0x7F);
-  if (**data & 0x80) {
-    (*data)++;
-    (*parsed_bytes)++;
-    if (--(*data_length) == 0)
-      return -1;
-    // PictureId is 15 bits
-    vp8->pictureId = (vp8->pictureId << 8) + **data;
-  }
-  (*data)++;
-  (*parsed_bytes)++;
-  (*data_length)--;
-  return 0;
-}
-
-int ParseVP8Tl0PicIdx(RTPVideoHeaderVP8* vp8,
-                      const uint8_t** data,
-                      size_t* data_length,
-                      size_t* parsed_bytes) {
-  assert(vp8 != NULL);
-  if (*data_length == 0)
-    return -1;
-
-  vp8->tl0PicIdx = **data;
-  (*data)++;
-  (*parsed_bytes)++;
-  (*data_length)--;
-  return 0;
-}
-
-int ParseVP8TIDAndKeyIdx(RTPVideoHeaderVP8* vp8,
-                         const uint8_t** data,
-                         size_t* data_length,
-                         size_t* parsed_bytes,
-                         bool has_tid,
-                         bool has_key_idx) {
-  assert(vp8 != NULL);
-  if (*data_length == 0)
-    return -1;
-
-  if (has_tid) {
-    vp8->temporalIdx = ((**data >> 6) & 0x03);
-    vp8->layerSync = (**data & 0x20) ? true : false;  // Y bit
-  }
-  if (has_key_idx) {
-    vp8->keyIdx = (**data & 0x1F);
-  }
-  (*data)++;
-  (*parsed_bytes)++;
-  (*data_length)--;
-  return 0;
-}
-
-int ParseVP8Extension(RTPVideoHeaderVP8* vp8,
-                      const uint8_t* data,
-                      size_t data_length) {
-  assert(vp8 != NULL);
-  assert(data_length > 0);
-  size_t parsed_bytes = 0;
-  // Optional X field is present.
-  bool has_picture_id = (*data & 0x80) ? true : false;   // I bit
-  bool has_tl0_pic_idx = (*data & 0x40) ? true : false;  // L bit
-  bool has_tid = (*data & 0x20) ? true : false;          // T bit
-  bool has_key_idx = (*data & 0x10) ? true : false;      // K bit
-
-  // Advance data and decrease remaining payload size.
-  data++;
-  parsed_bytes++;
-  data_length--;
-
-  if (has_picture_id) {
-    if (ParseVP8PictureID(vp8, &data, &data_length, &parsed_bytes) != 0) {
-      return -1;
-    }
-  }
-
-  if (has_tl0_pic_idx) {
-    if (ParseVP8Tl0PicIdx(vp8, &data, &data_length, &parsed_bytes) != 0) {
-      return -1;
-    }
-  }
-
-  if (has_tid || has_key_idx) {
-    if (ParseVP8TIDAndKeyIdx(
-            vp8, &data, &data_length, &parsed_bytes, has_tid, has_key_idx) !=
-        0) {
-      return -1;
-    }
-  }
-  return static_cast<int>(parsed_bytes);
-}
-
-int ParseVP8FrameSize(RtpDepacketizer::ParsedPayload* parsed_payload,
-                      const uint8_t* data,
-                      size_t data_length) {
-  assert(parsed_payload != NULL);
-  if (parsed_payload->frame_type != kVideoFrameKey) {
-    // Included in payload header for I-frames.
-    return 0;
-  }
-  if (data_length < 10) {
-    // For an I-frame we should always have the uncompressed VP8 header
-    // in the beginning of the partition.
-    return -1;
-  }
-  parsed_payload->type.Video.width = ((data[7] << 8) + data[6]) & 0x3FFF;
-  parsed_payload->type.Video.height = ((data[9] << 8) + data[8]) & 0x3FFF;
-  return 0;
-}
-}  // namespace
-
-RtpPacketizerVp8::RtpPacketizerVp8(const RTPVideoHeaderVP8& hdr_info,
-                                   size_t max_payload_len,
-                                   size_t last_packet_reduction_len,
-                                   VP8PacketizerMode mode)
-    : payload_data_(NULL),
-      payload_size_(0),
-      vp8_fixed_payload_descriptor_bytes_(1),
-      mode_(mode),
-      hdr_info_(hdr_info),
-      num_partitions_(0),
-      max_payload_len_(max_payload_len),
-      last_packet_reduction_len_(last_packet_reduction_len) {}
-
-RtpPacketizerVp8::RtpPacketizerVp8(const RTPVideoHeaderVP8& hdr_info,
-                                   size_t max_payload_len,
-                                   size_t last_packet_reduction_len)
-    : payload_data_(NULL),
-      payload_size_(0),
-      part_info_(),
-      vp8_fixed_payload_descriptor_bytes_(1),
-      mode_(kEqualSize),
-      hdr_info_(hdr_info),
-      num_partitions_(0),
-      max_payload_len_(max_payload_len),
-      last_packet_reduction_len_(last_packet_reduction_len) {}
-
-RtpPacketizerVp8::~RtpPacketizerVp8() {
-}
-
-size_t RtpPacketizerVp8::SetPayloadData(
-    const uint8_t* payload_data,
-    size_t payload_size,
-    const RTPFragmentationHeader* fragmentation) {
-  payload_data_ = payload_data;
-  payload_size_ = payload_size;
-  if (fragmentation) {
-    part_info_.CopyFrom(*fragmentation);
-    num_partitions_ = fragmentation->fragmentationVectorSize;
-  } else {
-    part_info_.VerifyAndAllocateFragmentationHeader(1);
-    part_info_.fragmentationLength[0] = payload_size;
-    part_info_.fragmentationOffset[0] = 0;
-    num_partitions_ = part_info_.fragmentationVectorSize;
-  }
-  if (GeneratePackets() < 0) {
-    return 0;
-  }
-  return packets_.size();
-}
-
-bool RtpPacketizerVp8::NextPacket(RtpPacketToSend* packet) {
-  RTC_DCHECK(packet);
-  if (packets_.empty()) {
-    return false;
-  }
-  InfoStruct packet_info = packets_.front();
-  packets_.pop();
-
-  uint8_t* buffer = packet->AllocatePayload(
-      packets_.empty() ? max_payload_len_ - last_packet_reduction_len_
-                       : max_payload_len_);
-  int bytes = WriteHeaderAndPayload(packet_info, buffer, max_payload_len_);
-  if (bytes < 0) {
-    return false;
-  }
-  packet->SetPayloadSize(bytes);
-  packet->SetMarker(packets_.empty());
-  return true;
-}
-
-std::string RtpPacketizerVp8::ToString() {
-  return "RtpPacketizerVp8";
-}
-
-int RtpPacketizerVp8::GeneratePackets() {
-  if (max_payload_len_ < vp8_fixed_payload_descriptor_bytes_ +
-                             PayloadDescriptorExtraLength() + 1 +
-                             last_packet_reduction_len_) {
-    // The provided payload length is not long enough for the payload
-    // descriptor and one payload byte in the last packet.
-    // Return an error.
-    return -1;
-  }
-
-  size_t per_packet_capacity =
-      max_payload_len_ -
-      (vp8_fixed_payload_descriptor_bytes_ + PayloadDescriptorExtraLength());
-
-  if (mode_ == kEqualSize) {
-    GeneratePacketsSplitPayloadBalanced(0, payload_size_, per_packet_capacity,
-                                        true, 0);
-    return 0;
-  }
-  size_t part_idx = 0;
-  while (part_idx < num_partitions_) {
-    size_t current_packet_capacity = per_packet_capacity;
-    bool last_partition = (part_idx + 1) == num_partitions_;
-    if (last_partition)
-      current_packet_capacity -= last_packet_reduction_len_;
-    // Check if the next partition fits in to single packet with some space
-    // left to aggregate some partitions together.
-    if (mode_ == kAggregate &&
-        part_info_.fragmentationLength[part_idx] < current_packet_capacity) {
-      part_idx =
-          GeneratePacketsAggregatePartitions(part_idx, per_packet_capacity);
-    } else {
-      GeneratePacketsSplitPayloadBalanced(
-          part_info_.fragmentationOffset[part_idx],
-          part_info_.fragmentationLength[part_idx], per_packet_capacity,
-          last_partition, part_idx);
-      ++part_idx;
-    }
-  }
-  return 0;
-}
-
-void RtpPacketizerVp8::GeneratePacketsSplitPayloadBalanced(size_t payload_start,
-                                                           size_t payload_len,
-                                                           size_t capacity,
-                                                           bool last_partition,
-                                                           size_t part_idx) {
-  // Last packet of the last partition is smaller. Pretend that it's the same
-  // size, but we must write more payload to it.
-  size_t total_bytes = payload_len;
-  if (last_partition)
-    total_bytes += last_packet_reduction_len_;
-  // Integer divisions with rounding up.
-  size_t num_packets_left = (total_bytes + capacity - 1) / capacity;
-  size_t bytes_per_packet = total_bytes / num_packets_left;
-  size_t num_larger_packets = total_bytes % num_packets_left;
-  size_t remaining_data = payload_len;
-  while (remaining_data > 0) {
-    // Last num_larger_packets are 1 byte wider than the rest. Increase
-    // per-packet payload size when needed.
-    if (num_packets_left == num_larger_packets)
-      ++bytes_per_packet;
-    size_t current_packet_bytes = bytes_per_packet;
-    if (current_packet_bytes > remaining_data) {
-      current_packet_bytes = remaining_data;
-    }
-    // This is not the last packet in the whole payload, but there's no data
-    // left for the last packet. Leave at least one byte for the last packet.
-    if (num_packets_left == 2 && current_packet_bytes == remaining_data &&
-        last_partition) {
-      --current_packet_bytes;
-    }
-    QueuePacket(payload_start + payload_len - remaining_data,
-                current_packet_bytes, part_idx, remaining_data == payload_len);
-    remaining_data -= current_packet_bytes;
-    --num_packets_left;
-  }
-}
-
-size_t RtpPacketizerVp8::GeneratePacketsAggregatePartitions(size_t part_idx,
-                                                            size_t capacity) {
-  // Bloat the last partition by the reduction of the last packet. As it always
-  // will be in the last packet we can pretend that the last packet is the same
-  // size as the rest of the packets. Done temporary to simplify calculations.
-  part_info_.fragmentationLength[num_partitions_ - 1] +=
-      last_packet_reduction_len_;
-  // Current partition should fit into the packet.
-  RTC_CHECK_LE(part_info_.fragmentationLength[part_idx], capacity);
-  // Find all partitions, shorter than capacity.
-  size_t end_part = part_idx + 1;
-  while (end_part < num_partitions_ &&
-         part_info_.fragmentationLength[end_part] <= capacity) {
-    ++end_part;
-  }
-  size_t total_partitions = end_part - part_idx;
-
-  // Aggregate partitions |part_idx|..|end_part-1| to blocks of size at most
-  // |capacity| minimizing the number of packets and then size of a largest
-  // block using dynamic programming. |scores[i]| stores best score in the form
-  // <number of packets, largest packet> for last i partitions. Maximum index is
-  // |total_partitions|, minimum index is 0, hence the length is
-  // |total_partitions|+1.
-
-  struct PartitionScore {
-    size_t num_packets = std::numeric_limits<size_t>::max();
-    size_t largest_packet_len = std::numeric_limits<size_t>::max();
-    // Compare num_packets first then largest_packet_len
-    bool operator <(const PartitionScore& other) const {
-      if (num_packets < other.num_packets) return true;
-      if (num_packets > other.num_packets) return false;
-      return largest_packet_len < other.largest_packet_len;
-    }
-  };
-
-  std::vector<PartitionScore> scores(total_partitions + 1);
-  // 0 partitions can be split into 0 packets with largest of size 0.
-  scores[0].num_packets = 0;
-  scores[0].largest_packet_len = 0;
-
-  // best_block_size[i] stores optimal number of partitions to be aggregated
-  // in the first packet if only last i partitions are considered.
-  std::vector<size_t> best_block_size(total_partitions + 1, 0);
-  // Calculate scores and best_block_size iteratively.
-  for (size_t partitions_left = 0; partitions_left < total_partitions;
-       ++partitions_left) {
-    // Here scores[paritions_left] is already calculated correctly. Update
-    // possible score for every possible new_paritions_left > partitions_left by
-    // aggregating all partitions in between into a single packet.
-    size_t current_payload_len = 0;
-    PartitionScore current_score = scores[partitions_left];
-    // Some next partitions are aggregated into one packet.
-    current_score.num_packets += 1;
-    // Calculate new score for last |new_partitions_left| partitions given
-    // best score for |partitions_left| partitions.
-    for (size_t new_partitions_left = partitions_left + 1;
-         new_partitions_left <= total_partitions; ++new_partitions_left) {
-      current_payload_len +=
-          part_info_.fragmentationLength[end_part - new_partitions_left];
-      if (current_payload_len > capacity)
-        break;
-      // Update maximum packet size.
-      if (current_payload_len > current_score.largest_packet_len)
-        current_score.largest_packet_len = current_payload_len;
-      // Score with less num_packets is better. If equal, minimum largest packet
-      // size is better.
-      if (current_score < scores[new_partitions_left]) {
-        scores[new_partitions_left] = current_score;
-        best_block_size[new_partitions_left] =
-            new_partitions_left - partitions_left;
-      }
-    }
-  }
-  // Undo temporary change.
-  part_info_.fragmentationLength[num_partitions_ - 1] -=
-      last_packet_reduction_len_;
-  // Restore answer given sizes of aggregated blocks in |best_block_size| for
-  // each possible left number of partitions.
-  size_t partitions_left = total_partitions;
-  while (partitions_left > 0) {
-    size_t cur_parts = best_block_size[partitions_left];
-    size_t first_partition = end_part - partitions_left;
-    size_t start_offset = part_info_.fragmentationOffset[first_partition];
-    size_t post_last_partition = first_partition + cur_parts;
-    size_t finish_offset =
-        (post_last_partition < num_partitions_)
-            ? part_info_.fragmentationOffset[post_last_partition]
-            : payload_size_;
-    size_t current_payload_len = finish_offset - start_offset;
-    QueuePacket(start_offset, current_payload_len, first_partition, true);
-    // Go to next packet.
-    partitions_left -= cur_parts;
-  }
-  return end_part;
-}
-
-void RtpPacketizerVp8::QueuePacket(size_t start_pos,
-                                   size_t packet_size,
-                                   size_t first_partition_in_packet,
-                                   bool start_on_new_fragment) {
-  // Write info to packet info struct and store in packet info queue.
-  InfoStruct packet_info;
-  packet_info.payload_start_pos = start_pos;
-  packet_info.size = packet_size;
-  packet_info.first_partition_ix = first_partition_in_packet;
-  packet_info.first_fragment = start_on_new_fragment;
-  packets_.push(packet_info);
-}
-
-int RtpPacketizerVp8::WriteHeaderAndPayload(const InfoStruct& packet_info,
-                                            uint8_t* buffer,
-                                            size_t buffer_length) const {
-  // Write the VP8 payload descriptor.
-  //       0
-  //       0 1 2 3 4 5 6 7 8
-  //      +-+-+-+-+-+-+-+-+-+
-  //      |X| |N|S| PART_ID |
-  //      +-+-+-+-+-+-+-+-+-+
-  // X:   |I|L|T|K|         | (mandatory if any of the below are used)
-  //      +-+-+-+-+-+-+-+-+-+
-  // I:   |PictureID (8/16b)| (optional)
-  //      +-+-+-+-+-+-+-+-+-+
-  // L:   |   TL0PIC_IDX    | (optional)
-  //      +-+-+-+-+-+-+-+-+-+
-  // T/K: |TID:Y|  KEYIDX   | (optional)
-  //      +-+-+-+-+-+-+-+-+-+
-
-  assert(packet_info.size > 0);
-  buffer[0] = 0;
-  if (XFieldPresent())
-    buffer[0] |= kXBit;
-  if (hdr_info_.nonReference)
-    buffer[0] |= kNBit;
-  if (packet_info.first_fragment)
-    buffer[0] |= kSBit;
-  buffer[0] |= (packet_info.first_partition_ix & kPartIdField);
-
-  const int extension_length = WriteExtensionFields(buffer, buffer_length);
-  if (extension_length < 0)
-    return -1;
-
-  memcpy(&buffer[vp8_fixed_payload_descriptor_bytes_ + extension_length],
-         &payload_data_[packet_info.payload_start_pos],
-         packet_info.size);
-
-  // Return total length of written data.
-  return packet_info.size + vp8_fixed_payload_descriptor_bytes_ +
-         extension_length;
-}
-
-int RtpPacketizerVp8::WriteExtensionFields(uint8_t* buffer,
-                                           size_t buffer_length) const {
-  size_t extension_length = 0;
-  if (XFieldPresent()) {
-    uint8_t* x_field = buffer + vp8_fixed_payload_descriptor_bytes_;
-    *x_field = 0;
-    extension_length = 1;  // One octet for the X field.
-    if (PictureIdPresent()) {
-      if (WritePictureIDFields(
-              x_field, buffer, buffer_length, &extension_length) < 0) {
-        return -1;
-      }
-    }
-    if (TL0PicIdxFieldPresent()) {
-      if (WriteTl0PicIdxFields(
-              x_field, buffer, buffer_length, &extension_length) < 0) {
-        return -1;
-      }
-    }
-    if (TIDFieldPresent() || KeyIdxFieldPresent()) {
-      if (WriteTIDAndKeyIdxFields(
-              x_field, buffer, buffer_length, &extension_length) < 0) {
-        return -1;
-      }
-    }
-    assert(extension_length == PayloadDescriptorExtraLength());
-  }
-  return static_cast<int>(extension_length);
-}
-
-int RtpPacketizerVp8::WritePictureIDFields(uint8_t* x_field,
-                                           uint8_t* buffer,
-                                           size_t buffer_length,
-                                           size_t* extension_length) const {
-  *x_field |= kIBit;
-  assert(buffer_length >=
-      vp8_fixed_payload_descriptor_bytes_ + *extension_length);
-  const int pic_id_length = WritePictureID(
-      buffer + vp8_fixed_payload_descriptor_bytes_ + *extension_length,
-      buffer_length - vp8_fixed_payload_descriptor_bytes_ - *extension_length);
-  if (pic_id_length < 0)
-    return -1;
-  *extension_length += pic_id_length;
-  return 0;
-}
-
-int RtpPacketizerVp8::WritePictureID(uint8_t* buffer,
-                                     size_t buffer_length) const {
-  const uint16_t pic_id = static_cast<uint16_t>(hdr_info_.pictureId);
-  size_t picture_id_len = PictureIdLength();
-  if (picture_id_len > buffer_length)
-    return -1;
-  if (picture_id_len == 2) {
-    buffer[0] = 0x80 | ((pic_id >> 8) & 0x7F);
-    buffer[1] = pic_id & 0xFF;
-  } else if (picture_id_len == 1) {
-    buffer[0] = pic_id & 0x7F;
-  }
-  return static_cast<int>(picture_id_len);
-}
-
-int RtpPacketizerVp8::WriteTl0PicIdxFields(uint8_t* x_field,
-                                           uint8_t* buffer,
-                                           size_t buffer_length,
-                                           size_t* extension_length) const {
-  if (buffer_length <
-      vp8_fixed_payload_descriptor_bytes_ + *extension_length + 1) {
-    return -1;
-  }
-  *x_field |= kLBit;
-  buffer[vp8_fixed_payload_descriptor_bytes_ + *extension_length] =
-      hdr_info_.tl0PicIdx;
-  ++*extension_length;
-  return 0;
-}
-
-int RtpPacketizerVp8::WriteTIDAndKeyIdxFields(uint8_t* x_field,
-                                              uint8_t* buffer,
-                                              size_t buffer_length,
-                                              size_t* extension_length) const {
-  if (buffer_length <
-      vp8_fixed_payload_descriptor_bytes_ + *extension_length + 1) {
-    return -1;
-  }
-  uint8_t* data_field =
-      &buffer[vp8_fixed_payload_descriptor_bytes_ + *extension_length];
-  *data_field = 0;
-  if (TIDFieldPresent()) {
-    *x_field |= kTBit;
-    assert(hdr_info_.temporalIdx <= 3);
-    *data_field |= hdr_info_.temporalIdx << 6;
-    *data_field |= hdr_info_.layerSync ? kYBit : 0;
-  }
-  if (KeyIdxFieldPresent()) {
-    *x_field |= kKBit;
-    *data_field |= (hdr_info_.keyIdx & kKeyIdxField);
-  }
-  ++*extension_length;
-  return 0;
-}
-
-size_t RtpPacketizerVp8::PayloadDescriptorExtraLength() const {
-  size_t length_bytes = PictureIdLength();
-  if (TL0PicIdxFieldPresent())
-    ++length_bytes;
-  if (TIDFieldPresent() || KeyIdxFieldPresent())
-    ++length_bytes;
-  if (length_bytes > 0)
-    ++length_bytes;  // Include the extension field.
-  return length_bytes;
-}
-
-size_t RtpPacketizerVp8::PictureIdLength() const {
-  if (hdr_info_.pictureId == kNoPictureId) {
-    return 0;
-  }
-  return 2;
-}
-
-bool RtpPacketizerVp8::XFieldPresent() const {
-  return (TIDFieldPresent() || TL0PicIdxFieldPresent() || PictureIdPresent() ||
-          KeyIdxFieldPresent());
-}
-
-bool RtpPacketizerVp8::TIDFieldPresent() const {
-  assert((hdr_info_.layerSync == false) ||
-         (hdr_info_.temporalIdx != kNoTemporalIdx));
-  return (hdr_info_.temporalIdx != kNoTemporalIdx);
-}
-
-bool RtpPacketizerVp8::KeyIdxFieldPresent() const {
-  return (hdr_info_.keyIdx != kNoKeyIdx);
-}
-
-bool RtpPacketizerVp8::TL0PicIdxFieldPresent() const {
-  return (hdr_info_.tl0PicIdx != kNoTl0PicIdx);
-}
-
-//
-// VP8 format:
-//
-// Payload descriptor
-//       0 1 2 3 4 5 6 7
-//      +-+-+-+-+-+-+-+-+
-//      |X|R|N|S|PartID | (REQUIRED)
-//      +-+-+-+-+-+-+-+-+
-// X:   |I|L|T|K|  RSV  | (OPTIONAL)
-//      +-+-+-+-+-+-+-+-+
-// I:   |   PictureID   | (OPTIONAL)
-//      +-+-+-+-+-+-+-+-+
-// L:   |   TL0PICIDX   | (OPTIONAL)
-//      +-+-+-+-+-+-+-+-+
-// T/K: |TID:Y| KEYIDX  | (OPTIONAL)
-//      +-+-+-+-+-+-+-+-+
-//
-// Payload header (considered part of the actual payload, sent to decoder)
-//       0 1 2 3 4 5 6 7
-//      +-+-+-+-+-+-+-+-+
-//      |Size0|H| VER |P|
-//      +-+-+-+-+-+-+-+-+
-//      |      ...      |
-//      +               +
-bool RtpDepacketizerVp8::Parse(ParsedPayload* parsed_payload,
-                               const uint8_t* payload_data,
-                               size_t payload_data_length) {
-  assert(parsed_payload != NULL);
-  if (payload_data_length == 0) {
-    LOG(LS_ERROR) << "Empty payload.";
-    return false;
-  }
-
-  // Parse mandatory first byte of payload descriptor.
-  bool extension = (*payload_data & 0x80) ? true : false;               // X bit
-  bool beginning_of_partition = (*payload_data & 0x10) ? true : false;  // S bit
-  int partition_id = (*payload_data & 0x0F);  // PartID field
-
-  parsed_payload->type.Video.width = 0;
-  parsed_payload->type.Video.height = 0;
-  parsed_payload->type.Video.is_first_packet_in_frame =
-      beginning_of_partition && (partition_id == 0);
-  parsed_payload->type.Video.simulcastIdx = 0;
-  parsed_payload->type.Video.codec = kRtpVideoVp8;
-  parsed_payload->type.Video.codecHeader.VP8.nonReference =
-      (*payload_data & 0x20) ? true : false;  // N bit
-  parsed_payload->type.Video.codecHeader.VP8.partitionId = partition_id;
-  parsed_payload->type.Video.codecHeader.VP8.beginningOfPartition =
-      beginning_of_partition;
-  parsed_payload->type.Video.codecHeader.VP8.pictureId = kNoPictureId;
-  parsed_payload->type.Video.codecHeader.VP8.tl0PicIdx = kNoTl0PicIdx;
-  parsed_payload->type.Video.codecHeader.VP8.temporalIdx = kNoTemporalIdx;
-  parsed_payload->type.Video.codecHeader.VP8.layerSync = false;
-  parsed_payload->type.Video.codecHeader.VP8.keyIdx = kNoKeyIdx;
-
-  if (partition_id > 8) {
-    // Weak check for corrupt payload_data: PartID MUST NOT be larger than 8.
-    return false;
-  }
-
-  // Advance payload_data and decrease remaining payload size.
-  payload_data++;
-  if (payload_data_length <= 1) {
-    LOG(LS_ERROR) << "Error parsing VP8 payload descriptor!";
-    return false;
-  }
-  payload_data_length--;
-
-  if (extension) {
-    const int parsed_bytes =
-        ParseVP8Extension(&parsed_payload->type.Video.codecHeader.VP8,
-                          payload_data,
-                          payload_data_length);
-    if (parsed_bytes < 0)
-      return false;
-    payload_data += parsed_bytes;
-    payload_data_length -= parsed_bytes;
-    if (payload_data_length == 0) {
-      LOG(LS_ERROR) << "Error parsing VP8 payload descriptor!";
-      return false;
-    }
-  }
-
-  // Read P bit from payload header (only at beginning of first partition).
-  if (beginning_of_partition && partition_id == 0) {
-    parsed_payload->frame_type =
-        (*payload_data & 0x01) ? kVideoFrameDelta : kVideoFrameKey;
-  } else {
-    parsed_payload->frame_type = kVideoFrameDelta;
-  }
-
-  if (ParseVP8FrameSize(parsed_payload, payload_data, payload_data_length) !=
-      0) {
-    return false;
-  }
-
-  parsed_payload->payload = payload_data;
-  parsed_payload->payload_length = payload_data_length;
-  return true;
-}
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/rtp_format_vp8.h b/modules/rtp_rtcp/source/rtp_format_vp8.h
deleted file mode 100644
index f8b7c2f..0000000
--- a/modules/rtp_rtcp/source/rtp_format_vp8.h
+++ /dev/null
@@ -1,200 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-/*
- * This file contains the declaration of the VP8 packetizer class.
- * A packetizer object is created for each encoded video frame. The
- * constructor is called with the payload data and size,
- * together with the fragmentation information and a packetizer mode
- * of choice. Alternatively, if no fragmentation info is available, the
- * second constructor can be used with only payload data and size; in that
- * case the mode kEqualSize is used.
- *
- * After creating the packetizer, the method NextPacket is called
- * repeatedly to get all packets for the frame. The method returns
- * false as long as there are more packets left to fetch.
- */
-
-#ifndef WEBRTC_MODULES_RTP_RTCP_SOURCE_RTP_FORMAT_VP8_H_
-#define WEBRTC_MODULES_RTP_RTCP_SOURCE_RTP_FORMAT_VP8_H_
-
-#include <queue>
-#include <string>
-#include <vector>
-
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_format.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-enum VP8PacketizerMode {
-  kStrict = 0,  // Split partitions if too large;
-                // never aggregate, balance size.
-  kAggregate,   // Split partitions if too large; aggregate whole partitions.
-  kEqualSize,   // Split entire payload without considering partition limits.
-                // This will produce equal size packets for the whole frame.
-  kNumModes,
-};
-
-// Packetizer for VP8.
-class RtpPacketizerVp8 : public RtpPacketizer {
- public:
-  // Initialize with payload from encoder and fragmentation info.
-  // The payload_data must be exactly one encoded VP8 frame.
-  RtpPacketizerVp8(const RTPVideoHeaderVP8& hdr_info,
-                   size_t max_payload_len,
-                   size_t last_packet_reduction_len,
-                   VP8PacketizerMode mode);
-
-  // Initialize without fragmentation info. Mode kEqualSize will be used.
-  // The payload_data must be exactly one encoded VP8 frame.
-  RtpPacketizerVp8(const RTPVideoHeaderVP8& hdr_info,
-                   size_t max_payload_len,
-                   size_t last_packet_reduction_len);
-
-  virtual ~RtpPacketizerVp8();
-
-  size_t SetPayloadData(const uint8_t* payload_data,
-                        size_t payload_size,
-                        const RTPFragmentationHeader* fragmentation) override;
-
-  // Get the next payload with VP8 payload header.
-  // Write payload and set marker bit of the |packet|.
-  // Returns true on success, false otherwise.
-  bool NextPacket(RtpPacketToSend* packet) override;
-
-  std::string ToString() override;
-
- private:
-  typedef struct {
-    size_t payload_start_pos;
-    size_t size;
-    bool first_fragment;
-    size_t first_partition_ix;
-  } InfoStruct;
-  typedef std::queue<InfoStruct> InfoQueue;
-
-  static const int kXBit = 0x80;
-  static const int kNBit = 0x20;
-  static const int kSBit = 0x10;
-  static const int kPartIdField = 0x0F;
-  static const int kKeyIdxField = 0x1F;
-  static const int kIBit = 0x80;
-  static const int kLBit = 0x40;
-  static const int kTBit = 0x20;
-  static const int kKBit = 0x10;
-  static const int kYBit = 0x20;
-
-  // Calculate all packet sizes and load to packet info queue.
-  int GeneratePackets();
-
-  // Splits given part of payload (one or more partitions)
-  // to packets with a given capacity. If |last_partition| flag is set then the
-  // last packet should be reduced by last_packet_reduction_len_.
-  void GeneratePacketsSplitPayloadBalanced(size_t payload_offset,
-                                           size_t payload_len,
-                                           size_t capacity,
-                                           bool last_partition,
-                                           size_t part_idx);
-
-  // Aggregates partitions starting at |part_idx| to packets of
-  // given |capacity|. Last packet, if containing last partition of the frame
-  // should be reduced by last_packet_reduction_len_.
-  // Returns the first unaggregated partition index.
-  size_t GeneratePacketsAggregatePartitions(size_t part_idx, size_t capacity);
-
-  // Insert packet into packet queue.
-  void QueuePacket(size_t start_pos,
-                   size_t packet_size,
-                   size_t first_partition_in_packet,
-                   bool start_on_new_fragment);
-
-  // Write the payload header and copy the payload to the buffer.
-  // The info in packet_info determines which part of the payload is written
-  // and what to write in the header fields.
-  int WriteHeaderAndPayload(const InfoStruct& packet_info,
-                            uint8_t* buffer,
-                            size_t buffer_length) const;
-
-  // Write the X field and the appropriate extension fields to buffer.
-  // The function returns the extension length (including X field), or -1
-  // on error.
-  int WriteExtensionFields(uint8_t* buffer, size_t buffer_length) const;
-
-  // Set the I bit in the x_field, and write PictureID to the appropriate
-  // position in buffer. The function returns 0 on success, -1 otherwise.
-  int WritePictureIDFields(uint8_t* x_field,
-                           uint8_t* buffer,
-                           size_t buffer_length,
-                           size_t* extension_length) const;
-
-  // Set the L bit in the x_field, and write Tl0PicIdx to the appropriate
-  // position in buffer. The function returns 0 on success, -1 otherwise.
-  int WriteTl0PicIdxFields(uint8_t* x_field,
-                           uint8_t* buffer,
-                           size_t buffer_length,
-                           size_t* extension_length) const;
-
-  // Set the T and K bits in the x_field, and write TID, Y and KeyIdx to the
-  // appropriate position in buffer. The function returns 0 on success,
-  // -1 otherwise.
-  int WriteTIDAndKeyIdxFields(uint8_t* x_field,
-                              uint8_t* buffer,
-                              size_t buffer_length,
-                              size_t* extension_length) const;
-
-  // Write the PictureID from codec_specific_info_ to buffer. One or two
-  // bytes are written, depending on magnitude of PictureID. The function
-  // returns the number of bytes written.
-  int WritePictureID(uint8_t* buffer, size_t buffer_length) const;
-
-  // Calculate and return length (octets) of the variable header fields in
-  // the next header (i.e., header length in addition to vp8_header_bytes_).
-  size_t PayloadDescriptorExtraLength() const;
-
-  // Calculate and return length (octets) of PictureID field in the next
-  // header. Can be 0, 1, or 2.
-  size_t PictureIdLength() const;
-
-  // Check whether each of the optional fields will be included in the header.
-  bool XFieldPresent() const;
-  bool TIDFieldPresent() const;
-  bool KeyIdxFieldPresent() const;
-  bool TL0PicIdxFieldPresent() const;
-  bool PictureIdPresent() const { return (PictureIdLength() > 0); }
-
-  const uint8_t* payload_data_;
-  size_t payload_size_;
-  RTPFragmentationHeader part_info_;
-  const size_t vp8_fixed_payload_descriptor_bytes_;  // Length of VP8 payload
-                                                     // descriptors' fixed part.
-  const VP8PacketizerMode mode_;
-  const RTPVideoHeaderVP8 hdr_info_;
-  size_t num_partitions_;
-  const size_t max_payload_len_;
-  const size_t last_packet_reduction_len_;
-  InfoQueue packets_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(RtpPacketizerVp8);
-};
-
-// Depacketizer for VP8.
-class RtpDepacketizerVp8 : public RtpDepacketizer {
- public:
-  virtual ~RtpDepacketizerVp8() {}
-
-  bool Parse(ParsedPayload* parsed_payload,
-             const uint8_t* payload_data,
-             size_t payload_data_length) override;
-};
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_RTP_RTCP_SOURCE_RTP_FORMAT_VP8_H_
diff --git a/modules/rtp_rtcp/source/rtp_format_vp8_test_helper.cc b/modules/rtp_rtcp/source/rtp_format_vp8_test_helper.cc
deleted file mode 100644
index 13d7dda..0000000
--- a/modules/rtp_rtcp/source/rtp_format_vp8_test_helper.cc
+++ /dev/null
@@ -1,243 +0,0 @@
-/*
- *  Copyright (c) 2012 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/rtp_rtcp/source/rtp_format_vp8_test_helper.h"
-
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-namespace test {
-
-constexpr RtpPacketToSend::ExtensionManager* kNoExtensions = nullptr;
-
-RtpFormatVp8TestHelper::RtpFormatVp8TestHelper(const RTPVideoHeaderVP8* hdr)
-    : packet_(kNoExtensions),
-      payload_data_(NULL),
-      data_ptr_(NULL),
-      fragmentation_(NULL),
-      hdr_info_(hdr),
-      payload_start_(0),
-      payload_size_(0),
-      sloppy_partitioning_(false),
-      inited_(false) {}
-
-RtpFormatVp8TestHelper::~RtpFormatVp8TestHelper() {
-  delete fragmentation_;
-  delete [] payload_data_;
-}
-
-bool RtpFormatVp8TestHelper::Init(const size_t* partition_sizes,
-                                  size_t num_partitions) {
-  if (inited_) return false;
-  fragmentation_ = new RTPFragmentationHeader;
-  fragmentation_->VerifyAndAllocateFragmentationHeader(num_partitions);
-  payload_size_ = 0;
-  // Calculate sum payload size.
-  for (size_t p = 0; p < num_partitions; ++p) {
-    payload_size_ += partition_sizes[p];
-  }
-  payload_data_ = new uint8_t[payload_size_];
-  size_t j = 0;
-  // Loop through the partitions again.
-  for (size_t p = 0; p < num_partitions; ++p) {
-    fragmentation_->fragmentationLength[p] = partition_sizes[p];
-    fragmentation_->fragmentationOffset[p] = j;
-    for (size_t i = 0; i < partition_sizes[p]; ++i) {
-      assert(j < payload_size_);
-      payload_data_[j++] = p;  // Set the payload value to the partition index.
-    }
-  }
-  data_ptr_ = payload_data_;
-  inited_ = true;
-  return true;
-}
-
-void RtpFormatVp8TestHelper::GetAllPacketsAndCheck(
-    RtpPacketizerVp8* packetizer,
-    const size_t* expected_sizes,
-    const int* expected_part,
-    const bool* expected_frag_start,
-    size_t expected_num_packets) {
-  ASSERT_TRUE(inited_);
-  for (size_t i = 0; i < expected_num_packets; ++i) {
-    std::ostringstream ss;
-    ss << "Checking packet " << i;
-    SCOPED_TRACE(ss.str());
-    EXPECT_TRUE(packetizer->NextPacket(&packet_));
-    CheckPacket(expected_sizes[i], i + 1 == expected_num_packets,
-                expected_frag_start[i]);
-  }
-}
-
-// Payload descriptor
-//       0 1 2 3 4 5 6 7
-//      +-+-+-+-+-+-+-+-+
-//      |X|R|N|S|PartID | (REQUIRED)
-//      +-+-+-+-+-+-+-+-+
-// X:   |I|L|T|K|  RSV  | (OPTIONAL)
-//      +-+-+-+-+-+-+-+-+
-// I:   |   PictureID   | (OPTIONAL)
-//      +-+-+-+-+-+-+-+-+
-// L:   |   TL0PICIDX   | (OPTIONAL)
-//      +-+-+-+-+-+-+-+-+
-// T/K: | TID | KEYIDX  | (OPTIONAL)
-//      +-+-+-+-+-+-+-+-+
-
-// First octet tests.
-#define EXPECT_BIT_EQ(x, n, a) EXPECT_EQ((((x) >> (n)) & 0x1), a)
-
-#define EXPECT_RSV_ZERO(x) EXPECT_EQ(((x) & 0xE0), 0)
-
-#define EXPECT_BIT_X_EQ(x, a) EXPECT_BIT_EQ(x, 7, a)
-
-#define EXPECT_BIT_N_EQ(x, a) EXPECT_BIT_EQ(x, 5, a)
-
-#define EXPECT_BIT_S_EQ(x, a) EXPECT_BIT_EQ(x, 4, a)
-
-#define EXPECT_PART_ID_EQ(x, a) EXPECT_EQ(((x) & 0x0F), a)
-
-// Extension fields tests
-#define EXPECT_BIT_I_EQ(x, a) EXPECT_BIT_EQ(x, 7, a)
-
-#define EXPECT_BIT_L_EQ(x, a) EXPECT_BIT_EQ(x, 6, a)
-
-#define EXPECT_BIT_T_EQ(x, a) EXPECT_BIT_EQ(x, 5, a)
-
-#define EXPECT_BIT_K_EQ(x, a) EXPECT_BIT_EQ(x, 4, a)
-
-#define EXPECT_TID_EQ(x, a) EXPECT_EQ((((x) & 0xC0) >> 6), a)
-
-#define EXPECT_BIT_Y_EQ(x, a) EXPECT_BIT_EQ(x, 5, a)
-
-#define EXPECT_KEYIDX_EQ(x, a) EXPECT_EQ(((x) & 0x1F), a)
-
-void RtpFormatVp8TestHelper::CheckHeader(bool frag_start) {
-  payload_start_ = 1;
-  rtc::ArrayView<const uint8_t> buffer = packet_.payload();
-  EXPECT_BIT_EQ(buffer[0], 6, 0);  // Check reserved bit.
-
-  if (hdr_info_->pictureId != kNoPictureId ||
-      hdr_info_->temporalIdx != kNoTemporalIdx ||
-      hdr_info_->tl0PicIdx != kNoTl0PicIdx ||
-      hdr_info_->keyIdx != kNoKeyIdx) {
-    EXPECT_BIT_X_EQ(buffer[0], 1);
-    ++payload_start_;
-    CheckPictureID();
-    CheckTl0PicIdx();
-    CheckTIDAndKeyIdx();
-  } else {
-    EXPECT_BIT_X_EQ(buffer[0], 0);
-  }
-
-  EXPECT_BIT_N_EQ(buffer[0], hdr_info_->nonReference ? 1 : 0);
-  EXPECT_BIT_S_EQ(buffer[0], frag_start ? 1 : 0);
-
-  // Check partition index.
-  if (!sloppy_partitioning_) {
-    // The test payload data is constructed such that the payload value is the
-    // same as the partition index.
-    EXPECT_EQ(buffer[0] & 0x0F, buffer[payload_start_]);
-  } else {
-    // Partition should be set to 0.
-    EXPECT_EQ(buffer[0] & 0x0F, 0);
-  }
-}
-
-// Verify that the I bit and the PictureID field are both set in accordance
-// with the information in hdr_info_->pictureId.
-void RtpFormatVp8TestHelper::CheckPictureID() {
-  auto buffer = packet_.payload();
-  if (hdr_info_->pictureId != kNoPictureId) {
-    EXPECT_BIT_I_EQ(buffer[1], 1);
-    EXPECT_BIT_EQ(buffer[payload_start_], 7, 1);
-    EXPECT_EQ(buffer[payload_start_] & 0x7F,
-              (hdr_info_->pictureId >> 8) & 0x7F);
-    EXPECT_EQ(buffer[payload_start_ + 1], hdr_info_->pictureId & 0xFF);
-    payload_start_ += 2;
-  } else {
-    EXPECT_BIT_I_EQ(buffer[1], 0);
-  }
-}
-
-// Verify that the L bit and the TL0PICIDX field are both set in accordance
-// with the information in hdr_info_->tl0PicIdx.
-void RtpFormatVp8TestHelper::CheckTl0PicIdx() {
-  auto buffer = packet_.payload();
-  if (hdr_info_->tl0PicIdx != kNoTl0PicIdx) {
-    EXPECT_BIT_L_EQ(buffer[1], 1);
-    EXPECT_EQ(buffer[payload_start_], hdr_info_->tl0PicIdx);
-    ++payload_start_;
-  } else {
-    EXPECT_BIT_L_EQ(buffer[1], 0);
-  }
-}
-
-// Verify that the T bit and the TL0PICIDX field, and the K bit and KEYIDX
-// field are all set in accordance with the information in
-// hdr_info_->temporalIdx and hdr_info_->keyIdx, respectively.
-void RtpFormatVp8TestHelper::CheckTIDAndKeyIdx() {
-  auto buffer = packet_.payload();
-  if (hdr_info_->temporalIdx == kNoTemporalIdx &&
-      hdr_info_->keyIdx == kNoKeyIdx) {
-    EXPECT_BIT_T_EQ(buffer[1], 0);
-    EXPECT_BIT_K_EQ(buffer[1], 0);
-    return;
-  }
-  if (hdr_info_->temporalIdx != kNoTemporalIdx) {
-    EXPECT_BIT_T_EQ(buffer[1], 1);
-    EXPECT_TID_EQ(buffer[payload_start_], hdr_info_->temporalIdx);
-    EXPECT_BIT_Y_EQ(buffer[payload_start_], hdr_info_->layerSync ? 1 : 0);
-  } else {
-    EXPECT_BIT_T_EQ(buffer[1], 0);
-    EXPECT_TID_EQ(buffer[payload_start_], 0);
-    EXPECT_BIT_Y_EQ(buffer[payload_start_], 0);
-  }
-  if (hdr_info_->keyIdx != kNoKeyIdx) {
-    EXPECT_BIT_K_EQ(buffer[1], 1);
-    EXPECT_KEYIDX_EQ(buffer[payload_start_], hdr_info_->keyIdx);
-  } else {
-    EXPECT_BIT_K_EQ(buffer[1], 0);
-    EXPECT_KEYIDX_EQ(buffer[payload_start_], 0);
-  }
-  ++payload_start_;
-}
-
-// Verify that the payload (i.e., after the headers) of the packet stored in
-// buffer_ is identical to the expected (as found in data_ptr_).
-void RtpFormatVp8TestHelper::CheckPayload() {
-  auto buffer = packet_.payload();
-  size_t payload_end = buffer.size();
-  for (size_t i = payload_start_; i < payload_end; ++i, ++data_ptr_)
-    EXPECT_EQ(buffer[i], *data_ptr_);
-}
-
-// Verify that the input variable "last" agrees with the position of data_ptr_.
-// If data_ptr_ has advanced payload_size_ bytes from the start (payload_data_)
-// we are at the end and last should be true. Otherwise, it should be false.
-void RtpFormatVp8TestHelper::CheckLast(bool last) const {
-  EXPECT_EQ(last, data_ptr_ == payload_data_ + payload_size_);
-}
-
-// Verify the contents of a packet. Check the length versus expected_bytes,
-// the header, payload, and "last" flag.
-void RtpFormatVp8TestHelper::CheckPacket(size_t expect_bytes,
-                                         bool last,
-                                         bool frag_start) {
-  EXPECT_EQ(expect_bytes, packet_.payload_size());
-  CheckHeader(frag_start);
-  CheckPayload();
-  CheckLast(last);
-}
-
-}  // namespace test
-
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/rtp_format_vp8_test_helper.h b/modules/rtp_rtcp/source/rtp_format_vp8_test_helper.h
deleted file mode 100644
index 4acccd2..0000000
--- a/modules/rtp_rtcp/source/rtp_format_vp8_test_helper.h
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-// This file contains the class RtpFormatVp8TestHelper. The class is
-// responsible for setting up a fake VP8 bitstream according to the
-// RTPVideoHeaderVP8 header, and partition information. After initialization,
-// an RTPFragmentationHeader is provided so that the tester can create a
-// packetizer. The packetizer can then be provided to this helper class, which
-// will then extract all packets and compare to the expected outcome.
-
-#ifndef WEBRTC_MODULES_RTP_RTCP_SOURCE_RTP_FORMAT_VP8_TEST_HELPER_H_
-#define WEBRTC_MODULES_RTP_RTCP_SOURCE_RTP_FORMAT_VP8_TEST_HELPER_H_
-
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_format_vp8.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_packet_to_send.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-namespace test {
-
-class RtpFormatVp8TestHelper {
- public:
-  explicit RtpFormatVp8TestHelper(const RTPVideoHeaderVP8* hdr);
-  ~RtpFormatVp8TestHelper();
-  bool Init(const size_t* partition_sizes, size_t num_partitions);
-  void GetAllPacketsAndCheck(RtpPacketizerVp8* packetizer,
-                             const size_t* expected_sizes,
-                             const int* expected_part,
-                             const bool* expected_frag_start,
-                             size_t expected_num_packets);
-
-  uint8_t* payload_data() const { return payload_data_; }
-  size_t payload_size() const { return payload_size_; }
-  RTPFragmentationHeader* fragmentation() const { return fragmentation_; }
-  size_t buffer_size() const {
-    static constexpr size_t kVp8PayloadDescriptorMaxSize = 6;
-    return payload_size_ + kVp8PayloadDescriptorMaxSize;
-  }
-  void set_sloppy_partitioning(bool value) { sloppy_partitioning_ = value; }
-
- private:
-  void CheckHeader(bool frag_start);
-  void CheckPictureID();
-  void CheckTl0PicIdx();
-  void CheckTIDAndKeyIdx();
-  void CheckPayload();
-  void CheckLast(bool last) const;
-  void CheckPacket(size_t expect_bytes, bool last, bool frag_start);
-
-  RtpPacketToSend packet_;
-  uint8_t* payload_data_;
-  uint8_t* data_ptr_;
-  RTPFragmentationHeader* fragmentation_;
-  const RTPVideoHeaderVP8* hdr_info_;
-  int payload_start_;
-  size_t payload_size_;
-  bool sloppy_partitioning_;
-  bool inited_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(RtpFormatVp8TestHelper);
-};
-
-}  // namespace test
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_RTP_RTCP_SOURCE_RTP_FORMAT_VP8_TEST_HELPER_H_
diff --git a/modules/rtp_rtcp/source/rtp_format_vp8_unittest.cc b/modules/rtp_rtcp/source/rtp_format_vp8_unittest.cc
deleted file mode 100644
index 3f6de76..0000000
--- a/modules/rtp_rtcp/source/rtp_format_vp8_unittest.cc
+++ /dev/null
@@ -1,731 +0,0 @@
-/*
- *  Copyright (c) 2012 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 <memory>
-
-#include "webrtc/modules/rtp_rtcp/source/rtp_format_vp8.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_format_vp8_test_helper.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_packet_to_send.h"
-#include "webrtc/test/gmock.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/typedefs.h"
-
-#define CHECK_ARRAY_SIZE(expected_size, array)                     \
-  static_assert(expected_size == sizeof(array) / sizeof(array[0]), \
-                "check array size");
-
-namespace webrtc {
-namespace {
-
-using ::testing::ElementsAreArray;
-using ::testing::make_tuple;
-
-constexpr RtpPacketToSend::ExtensionManager* kNoExtensions = nullptr;
-// Payload descriptor
-//       0 1 2 3 4 5 6 7
-//      +-+-+-+-+-+-+-+-+
-//      |X|R|N|S|PartID | (REQUIRED)
-//      +-+-+-+-+-+-+-+-+
-// X:   |I|L|T|K|  RSV  | (OPTIONAL)
-//      +-+-+-+-+-+-+-+-+
-// I:   |   PictureID   | (OPTIONAL)
-//      +-+-+-+-+-+-+-+-+
-// L:   |   TL0PICIDX   | (OPTIONAL)
-//      +-+-+-+-+-+-+-+-+
-// T/K: |TID:Y| KEYIDX  | (OPTIONAL)
-//      +-+-+-+-+-+-+-+-+
-//
-// Payload header
-//       0 1 2 3 4 5 6 7
-//      +-+-+-+-+-+-+-+-+
-//      |Size0|H| VER |P|
-//      +-+-+-+-+-+-+-+-+
-//      |     Size1     |
-//      +-+-+-+-+-+-+-+-+
-//      |     Size2     |
-//      +-+-+-+-+-+-+-+-+
-//      | Bytes 4..N of |
-//      | VP8 payload   |
-//      :               :
-//      +-+-+-+-+-+-+-+-+
-//      | OPTIONAL RTP  |
-//      | padding       |
-//      :               :
-//      +-+-+-+-+-+-+-+-+
-void VerifyBasicHeader(RTPTypeHeader* type, bool N, bool S, int part_id) {
-  ASSERT_TRUE(type != NULL);
-  EXPECT_EQ(N, type->Video.codecHeader.VP8.nonReference);
-  EXPECT_EQ(S, type->Video.codecHeader.VP8.beginningOfPartition);
-  EXPECT_EQ(part_id, type->Video.codecHeader.VP8.partitionId);
-}
-
-void VerifyExtensions(RTPTypeHeader* type,
-                      int16_t picture_id,   /* I */
-                      int16_t tl0_pic_idx,  /* L */
-                      uint8_t temporal_idx, /* T */
-                      int key_idx /* K */) {
-  ASSERT_TRUE(type != NULL);
-  EXPECT_EQ(picture_id, type->Video.codecHeader.VP8.pictureId);
-  EXPECT_EQ(tl0_pic_idx, type->Video.codecHeader.VP8.tl0PicIdx);
-  EXPECT_EQ(temporal_idx, type->Video.codecHeader.VP8.temporalIdx);
-  EXPECT_EQ(key_idx, type->Video.codecHeader.VP8.keyIdx);
-}
-}  // namespace
-
-class RtpPacketizerVp8Test : public ::testing::Test {
- protected:
-  RtpPacketizerVp8Test() : helper_(NULL) {}
-  virtual void TearDown() { delete helper_; }
-  bool Init(const size_t* partition_sizes, size_t num_partitions) {
-    hdr_info_.pictureId = kNoPictureId;
-    hdr_info_.nonReference = false;
-    hdr_info_.temporalIdx = kNoTemporalIdx;
-    hdr_info_.layerSync = false;
-    hdr_info_.tl0PicIdx = kNoTl0PicIdx;
-    hdr_info_.keyIdx = kNoKeyIdx;
-    if (helper_ != NULL)
-      return false;
-    helper_ = new test::RtpFormatVp8TestHelper(&hdr_info_);
-    return helper_->Init(partition_sizes, num_partitions);
-  }
-
-  RTPVideoHeaderVP8 hdr_info_;
-  test::RtpFormatVp8TestHelper* helper_;
-};
-
-TEST_F(RtpPacketizerVp8Test, TestStrictMode) {
-  const size_t kSizeVector[] = {10, 8, 27};
-  const size_t kNumPartitions = GTEST_ARRAY_SIZE_(kSizeVector);
-  ASSERT_TRUE(Init(kSizeVector, kNumPartitions));
-
-  hdr_info_.pictureId = 200;
-  const size_t kMaxPayloadSize = 13;
-  RtpPacketizerVp8 packetizer(hdr_info_, kMaxPayloadSize, 0, kStrict);
-  size_t num_packets = packetizer.SetPayloadData(helper_->payload_data(),
-                                                 helper_->payload_size(),
-                                                 helper_->fragmentation());
-
-  // The expected sizes are obtained by hand.
-  const size_t kExpectedSizes[] = {9, 9, 12, 13, 13, 13};
-  const int kExpectedPart[] = {0, 0, 1, 2, 2, 2};
-  const bool kExpectedFragStart[] = {true, false, true, true, false, false};
-  const size_t kExpectedNum = GTEST_ARRAY_SIZE_(kExpectedSizes);
-  CHECK_ARRAY_SIZE(kExpectedNum, kExpectedPart);
-  CHECK_ARRAY_SIZE(kExpectedNum, kExpectedFragStart);
-  ASSERT_EQ(num_packets, kExpectedNum);
-
-  helper_->GetAllPacketsAndCheck(&packetizer,
-                                 kExpectedSizes,
-                                 kExpectedPart,
-                                 kExpectedFragStart,
-                                 kExpectedNum);
-}
-
-// Verify that we get a minimal number of packets if the partition plus header
-// size fits exactly in the maximum packet size.
-TEST_F(RtpPacketizerVp8Test, TestStrictEqualTightPartitions) {
-  const size_t kSizeVector[] = {10, 10, 10};
-  const size_t kNumPartitions = GTEST_ARRAY_SIZE_(kSizeVector);
-  ASSERT_TRUE(Init(kSizeVector, kNumPartitions));
-
-  hdr_info_.pictureId = 200;
-  const int kMaxPayloadSize = 14;
-  RtpPacketizerVp8 packetizer(hdr_info_, kMaxPayloadSize, 0, kStrict);
-  size_t num_packets = packetizer.SetPayloadData(helper_->payload_data(),
-                                                 helper_->payload_size(),
-                                                 helper_->fragmentation());
-
-  // The expected sizes are obtained by hand.
-  const size_t kExpectedSizes[] = {14, 14, 14};
-  const int kExpectedPart[] = {0, 1, 2};
-  const bool kExpectedFragStart[] = {true, true, true};
-  const size_t kExpectedNum = GTEST_ARRAY_SIZE_(kExpectedSizes);
-  CHECK_ARRAY_SIZE(kExpectedNum, kExpectedPart);
-  CHECK_ARRAY_SIZE(kExpectedNum, kExpectedFragStart);
-  ASSERT_EQ(num_packets, kExpectedNum);
-
-  helper_->GetAllPacketsAndCheck(&packetizer, kExpectedSizes, kExpectedPart,
-                                 kExpectedFragStart, kExpectedNum);
-}
-
-TEST_F(RtpPacketizerVp8Test, TestAggregateMode) {
-  const size_t kSizeVector[] = {60, 10, 10};
-  const size_t kNumPartitions = GTEST_ARRAY_SIZE_(kSizeVector);
-  ASSERT_TRUE(Init(kSizeVector, kNumPartitions));
-
-  hdr_info_.pictureId = 20;
-  const size_t kMaxPayloadSize = 25;
-  RtpPacketizerVp8 packetizer(hdr_info_, kMaxPayloadSize, 0, kAggregate);
-  size_t num_packets = packetizer.SetPayloadData(helper_->payload_data(),
-                                                 helper_->payload_size(),
-                                                 helper_->fragmentation());
-
-  // The expected sizes are obtained by hand.
-  const size_t kExpectedSizes[] = {24, 24, 24, 24};
-  const int kExpectedPart[] = {0, 0, 0, 1};
-  const bool kExpectedFragStart[] = {true, false, false, true};
-  const size_t kExpectedNum = GTEST_ARRAY_SIZE_(kExpectedSizes);
-  CHECK_ARRAY_SIZE(kExpectedNum, kExpectedPart);
-  CHECK_ARRAY_SIZE(kExpectedNum, kExpectedFragStart);
-  ASSERT_EQ(num_packets, kExpectedNum);
-
-  helper_->GetAllPacketsAndCheck(&packetizer,
-                                 kExpectedSizes,
-                                 kExpectedPart,
-                                 kExpectedFragStart,
-                                 kExpectedNum);
-}
-
-TEST_F(RtpPacketizerVp8Test, TestAggregateModePacketReductionCauseExtraPacket) {
-  const size_t kSizeVector[] = {60, 10, 10};
-  const size_t kNumPartitions = GTEST_ARRAY_SIZE_(kSizeVector);
-  ASSERT_TRUE(Init(kSizeVector, kNumPartitions));
-
-  hdr_info_.pictureId = 20;
-  const size_t kMaxPayloadSize = 25;
-  const size_t kLastPacketReductionLen = 5;
-  RtpPacketizerVp8 packetizer(hdr_info_, kMaxPayloadSize,
-                              kLastPacketReductionLen, kAggregate);
-  size_t num_packets = packetizer.SetPayloadData(helper_->payload_data(),
-                                                 helper_->payload_size(),
-                                                 helper_->fragmentation());
-
-  // The expected sizes are obtained by hand.
-  const size_t kExpectedSizes[] = {24, 24, 24, 14, 14};
-  const int kExpectedPart[] = {0, 0, 0, 1, 2};
-  const bool kExpectedFragStart[] = {true, false, false, true, true};
-  const size_t kExpectedNum = GTEST_ARRAY_SIZE_(kExpectedSizes);
-  CHECK_ARRAY_SIZE(kExpectedNum, kExpectedPart);
-  CHECK_ARRAY_SIZE(kExpectedNum, kExpectedFragStart);
-  ASSERT_EQ(num_packets, kExpectedNum);
-
-  helper_->GetAllPacketsAndCheck(&packetizer, kExpectedSizes, kExpectedPart,
-                                 kExpectedFragStart, kExpectedNum);
-}
-
-TEST_F(RtpPacketizerVp8Test, TestAggregateModePacketReduction) {
-  const size_t kSizeVector[] = {60, 10, 10};
-  const size_t kNumPartitions = GTEST_ARRAY_SIZE_(kSizeVector);
-  ASSERT_TRUE(Init(kSizeVector, kNumPartitions));
-
-  hdr_info_.pictureId = 20;
-  const size_t kMaxPayloadSize = 25;
-  const size_t kLastPacketReductionLen = 1;
-  RtpPacketizerVp8 packetizer(hdr_info_, kMaxPayloadSize,
-                              kLastPacketReductionLen, kAggregate);
-  size_t num_packets = packetizer.SetPayloadData(helper_->payload_data(),
-                                                 helper_->payload_size(),
-                                                 helper_->fragmentation());
-
-  // The expected sizes are obtained by hand.
-  const size_t kExpectedSizes[] = {24, 24, 24, 24};
-  const int kExpectedPart[] = {0, 0, 0, 1};
-  const bool kExpectedFragStart[] = {true, false, false, true};
-  const size_t kExpectedNum = GTEST_ARRAY_SIZE_(kExpectedSizes);
-  CHECK_ARRAY_SIZE(kExpectedNum, kExpectedPart);
-  CHECK_ARRAY_SIZE(kExpectedNum, kExpectedFragStart);
-  ASSERT_EQ(num_packets, kExpectedNum);
-
-  helper_->GetAllPacketsAndCheck(&packetizer, kExpectedSizes, kExpectedPart,
-                                 kExpectedFragStart, kExpectedNum);
-}
-
-TEST_F(RtpPacketizerVp8Test, TestAggregateModeSmallPartitions) {
-  const size_t kSizeVector[] = {3, 4, 2, 5, 2, 4};
-  const size_t kNumPartitions = GTEST_ARRAY_SIZE_(kSizeVector);
-  ASSERT_TRUE(Init(kSizeVector, kNumPartitions));
-
-  hdr_info_.pictureId = 20;
-  const size_t kMaxPayloadSize = 13;
-  RtpPacketizerVp8 packetizer(hdr_info_, kMaxPayloadSize, 0, kAggregate);
-  size_t num_packets = packetizer.SetPayloadData(helper_->payload_data(),
-                                                 helper_->payload_size(),
-                                                 helper_->fragmentation());
-
-  // The expected sizes are obtained by hand.
-  const size_t kExpectedSizes[] = {11, 11, 10};
-  const int kExpectedPart[] = {0, 2, 4};
-  const bool kExpectedFragStart[] = {true, true, true};
-  const size_t kExpectedNum = GTEST_ARRAY_SIZE_(kExpectedSizes);
-  CHECK_ARRAY_SIZE(kExpectedNum, kExpectedPart);
-  CHECK_ARRAY_SIZE(kExpectedNum, kExpectedFragStart);
-  ASSERT_EQ(num_packets, kExpectedNum);
-
-  helper_->GetAllPacketsAndCheck(&packetizer, kExpectedSizes, kExpectedPart,
-                                 kExpectedFragStart, kExpectedNum);
-}
-
-TEST_F(RtpPacketizerVp8Test, TestAggregateModeManyPartitions1) {
-  const size_t kSizeVector[] = {1600, 200, 200, 200, 200, 200, 200, 200, 200};
-  const size_t kNumPartitions = GTEST_ARRAY_SIZE_(kSizeVector);
-  ASSERT_TRUE(Init(kSizeVector, kNumPartitions));
-
-  hdr_info_.pictureId = 20;
-  const size_t kMaxPayloadSize = 1000;
-  RtpPacketizerVp8 packetizer(hdr_info_, kMaxPayloadSize, 0, kAggregate);
-  size_t num_packets = packetizer.SetPayloadData(helper_->payload_data(),
-                                                 helper_->payload_size(),
-                                                 helper_->fragmentation());
-
-  // The expected sizes are obtained by hand.
-  const size_t kExpectedSizes[] = {804, 804, 804, 804};
-  const int kExpectedPart[] = {0, 0, 1, 5};
-  const bool kExpectedFragStart[] = {true, false, true, true};
-  const size_t kExpectedNum = GTEST_ARRAY_SIZE_(kExpectedSizes);
-  CHECK_ARRAY_SIZE(kExpectedNum, kExpectedPart);
-  CHECK_ARRAY_SIZE(kExpectedNum, kExpectedFragStart);
-  ASSERT_EQ(num_packets, kExpectedNum);
-
-  helper_->GetAllPacketsAndCheck(&packetizer,
-                                 kExpectedSizes,
-                                 kExpectedPart,
-                                 kExpectedFragStart,
-                                 kExpectedNum);
-}
-
-TEST_F(RtpPacketizerVp8Test, TestAggregateModeManyPartitions2) {
-  const size_t kSizeVector[] = {1599, 200, 200, 200, 1600, 200, 200, 200, 200};
-  const size_t kNumPartitions = GTEST_ARRAY_SIZE_(kSizeVector);
-  ASSERT_TRUE(Init(kSizeVector, kNumPartitions));
-
-  hdr_info_.pictureId = 20;
-  const size_t kMaxPayloadSize = 1000;
-  RtpPacketizerVp8 packetizer(hdr_info_, kMaxPayloadSize, 0, kAggregate);
-  size_t num_packets = packetizer.SetPayloadData(helper_->payload_data(),
-                                                 helper_->payload_size(),
-                                                 helper_->fragmentation());
-
-  // The expected sizes are obtained by hand.
-  const size_t kExpectedSizes[] = {803, 804, 604, 804, 804, 804};
-  const int kExpectedPart[] = {0, 0, 1, 4, 4, 5};
-  const bool kExpectedFragStart[] = {true, false, true, true, false, true};
-  const size_t kExpectedNum = GTEST_ARRAY_SIZE_(kExpectedSizes);
-  CHECK_ARRAY_SIZE(kExpectedNum, kExpectedPart);
-  CHECK_ARRAY_SIZE(kExpectedNum, kExpectedFragStart);
-  ASSERT_EQ(num_packets, kExpectedNum);
-
-  helper_->GetAllPacketsAndCheck(&packetizer,
-                                 kExpectedSizes,
-                                 kExpectedPart,
-                                 kExpectedFragStart,
-                                 kExpectedNum);
-}
-
-TEST_F(RtpPacketizerVp8Test, TestAggregateModeTwoLargePartitions) {
-  const size_t kSizeVector[] = {1654, 2268};
-  const size_t kNumPartitions = GTEST_ARRAY_SIZE_(kSizeVector);
-  ASSERT_TRUE(Init(kSizeVector, kNumPartitions));
-
-  hdr_info_.pictureId = 20;
-  const size_t kMaxPayloadSize = 1460;
-  RtpPacketizerVp8 packetizer(hdr_info_, kMaxPayloadSize, 0, kAggregate);
-  size_t num_packets = packetizer.SetPayloadData(helper_->payload_data(),
-                                                 helper_->payload_size(),
-                                                 helper_->fragmentation());
-
-  // The expected sizes are obtained by hand.
-  const size_t kExpectedSizes[] = {831, 831, 1138, 1138};
-  const int kExpectedPart[] = {0, 0, 1, 1};
-  const bool kExpectedFragStart[] = {true, false, true, false};
-  const size_t kExpectedNum = GTEST_ARRAY_SIZE_(kExpectedSizes);
-  CHECK_ARRAY_SIZE(kExpectedNum, kExpectedPart);
-  CHECK_ARRAY_SIZE(kExpectedNum, kExpectedFragStart);
-  ASSERT_EQ(num_packets, kExpectedNum);
-
-  helper_->GetAllPacketsAndCheck(&packetizer,
-                                 kExpectedSizes,
-                                 kExpectedPart,
-                                 kExpectedFragStart,
-                                 kExpectedNum);
-}
-
-// Verify that EqualSize mode is forced if fragmentation info is missing.
-TEST_F(RtpPacketizerVp8Test, TestEqualSizeModeFallback) {
-  const size_t kSizeVector[] = {10, 10, 10};
-  const size_t kNumPartitions = GTEST_ARRAY_SIZE_(kSizeVector);
-  ASSERT_TRUE(Init(kSizeVector, kNumPartitions));
-
-  hdr_info_.pictureId = 200;          // > 0x7F should produce 2-byte PictureID
-  const size_t kMaxPayloadSize = 12;  // Small enough to produce 4 packets.
-  RtpPacketizerVp8 packetizer(hdr_info_, kMaxPayloadSize, 0);
-  size_t num_packets = packetizer.SetPayloadData(
-      helper_->payload_data(), helper_->payload_size(), nullptr);
-
-  // Expecting three full packets, and one with the remainder.
-  const size_t kExpectedSizes[] = {11, 11, 12, 12};
-  const int kExpectedPart[] = {0, 0, 0, 0};  // Always 0 for equal size mode.
-  // Frag start only true for first packet in equal size mode.
-  const bool kExpectedFragStart[] = {true, false, false, false};
-  const size_t kExpectedNum = GTEST_ARRAY_SIZE_(kExpectedSizes);
-  CHECK_ARRAY_SIZE(kExpectedNum, kExpectedPart);
-  CHECK_ARRAY_SIZE(kExpectedNum, kExpectedFragStart);
-  ASSERT_EQ(num_packets, kExpectedNum);
-
-  helper_->set_sloppy_partitioning(true);
-  helper_->GetAllPacketsAndCheck(&packetizer,
-                                 kExpectedSizes,
-                                 kExpectedPart,
-                                 kExpectedFragStart,
-                                 kExpectedNum);
-}
-
-TEST_F(RtpPacketizerVp8Test, TestEqualSizeWithLastPacketReduction) {
-  const size_t kSizeVector[] = {30, 10, 3};
-  const size_t kNumPartitions = GTEST_ARRAY_SIZE_(kSizeVector);
-  ASSERT_TRUE(Init(kSizeVector, kNumPartitions));
-
-  hdr_info_.pictureId = 200;
-  const size_t kMaxPayloadSize = 15;  // Small enough to produce 5 packets.
-  const size_t kLastPacketReduction = 5;
-  RtpPacketizerVp8 packetizer(hdr_info_, kMaxPayloadSize, kLastPacketReduction);
-  size_t num_packets = packetizer.SetPayloadData(
-      helper_->payload_data(), helper_->payload_size(), nullptr);
-
-  // Calculated by hand. VP8 payload descriptors are 4 byte each. 5 packets is
-  // minimum possible to fit 43 payload bytes into packets with capacity of
-  // 15 - 4 = 11 and leave 5 free bytes in the last packet. All packets are
-  // almost equal in size, even last packet if counted with free space (which
-  // will be filled up the stack by extra long RTP header).
-  const size_t kExpectedSizes[] = {13, 13, 14, 14, 9};
-  const int kExpectedPart[] = {0, 0, 0, 0, 0};  // Always 0 for equal size mode.
-  // Frag start only true for first packet in equal size mode.
-  const bool kExpectedFragStart[] = {true, false, false, false, false};
-  const size_t kExpectedNum = GTEST_ARRAY_SIZE_(kExpectedSizes);
-  CHECK_ARRAY_SIZE(kExpectedNum, kExpectedPart);
-  CHECK_ARRAY_SIZE(kExpectedNum, kExpectedFragStart);
-  ASSERT_EQ(num_packets, kExpectedNum);
-
-  helper_->set_sloppy_partitioning(true);
-  helper_->GetAllPacketsAndCheck(&packetizer, kExpectedSizes, kExpectedPart,
-                                 kExpectedFragStart, kExpectedNum);
-}
-
-// Verify that non-reference bit is set. EqualSize mode fallback is expected.
-TEST_F(RtpPacketizerVp8Test, TestNonReferenceBit) {
-  const size_t kSizeVector[] = {10, 10, 10};
-  const size_t kNumPartitions = GTEST_ARRAY_SIZE_(kSizeVector);
-  ASSERT_TRUE(Init(kSizeVector, kNumPartitions));
-
-  hdr_info_.nonReference = true;
-  const size_t kMaxPayloadSize = 25;  // Small enough to produce two packets.
-  RtpPacketizerVp8 packetizer(hdr_info_, kMaxPayloadSize, 0);
-  size_t num_packets = packetizer.SetPayloadData(
-      helper_->payload_data(), helper_->payload_size(), nullptr);
-
-  // EqualSize mode => First packet full; other not.
-  const size_t kExpectedSizes[] = {16, 16};
-  const int kExpectedPart[] = {0, 0};  // Always 0 for equal size mode.
-  // Frag start only true for first packet in equal size mode.
-  const bool kExpectedFragStart[] = {true, false};
-  const size_t kExpectedNum = GTEST_ARRAY_SIZE_(kExpectedSizes);
-  CHECK_ARRAY_SIZE(kExpectedNum, kExpectedPart);
-  CHECK_ARRAY_SIZE(kExpectedNum, kExpectedFragStart);
-  ASSERT_EQ(num_packets, kExpectedNum);
-
-  helper_->set_sloppy_partitioning(true);
-  helper_->GetAllPacketsAndCheck(&packetizer,
-                                 kExpectedSizes,
-                                 kExpectedPart,
-                                 kExpectedFragStart,
-                                 kExpectedNum);
-}
-
-// Verify Tl0PicIdx and TID fields, and layerSync bit.
-TEST_F(RtpPacketizerVp8Test, TestTl0PicIdxAndTID) {
-  const size_t kSizeVector[] = {10, 10, 10};
-  const size_t kNumPartitions = GTEST_ARRAY_SIZE_(kSizeVector);
-  ASSERT_TRUE(Init(kSizeVector, kNumPartitions));
-
-  hdr_info_.tl0PicIdx = 117;
-  hdr_info_.temporalIdx = 2;
-  hdr_info_.layerSync = true;
-  // kMaxPayloadSize is only limited by allocated buffer size.
-  const size_t kMaxPayloadSize = helper_->buffer_size();
-  RtpPacketizerVp8 packetizer(hdr_info_, kMaxPayloadSize, 0, kAggregate);
-  size_t num_packets = packetizer.SetPayloadData(helper_->payload_data(),
-                                                 helper_->payload_size(),
-                                                 helper_->fragmentation());
-
-  // Expect one single packet of payload_size() + 4 bytes header.
-  const size_t kExpectedSizes[1] = {helper_->payload_size() + 4};
-  const int kExpectedPart[1] = {0};  // Packet starts with partition 0.
-  const bool kExpectedFragStart[1] = {true};
-  const size_t kExpectedNum = GTEST_ARRAY_SIZE_(kExpectedSizes);
-  CHECK_ARRAY_SIZE(kExpectedNum, kExpectedPart);
-  CHECK_ARRAY_SIZE(kExpectedNum, kExpectedFragStart);
-  ASSERT_EQ(num_packets, kExpectedNum);
-
-  helper_->GetAllPacketsAndCheck(&packetizer,
-                                 kExpectedSizes,
-                                 kExpectedPart,
-                                 kExpectedFragStart,
-                                 kExpectedNum);
-}
-
-// Verify KeyIdx field.
-TEST_F(RtpPacketizerVp8Test, TestKeyIdx) {
-  const size_t kSizeVector[] = {10, 10, 10};
-  const size_t kNumPartitions = GTEST_ARRAY_SIZE_(kSizeVector);
-  ASSERT_TRUE(Init(kSizeVector, kNumPartitions));
-
-  hdr_info_.keyIdx = 17;
-  // kMaxPayloadSize is only limited by allocated buffer size.
-  const size_t kMaxPayloadSize = helper_->buffer_size();
-  RtpPacketizerVp8 packetizer(hdr_info_, kMaxPayloadSize, 0, kAggregate);
-  size_t num_packets = packetizer.SetPayloadData(helper_->payload_data(),
-                                                 helper_->payload_size(),
-                                                 helper_->fragmentation());
-
-  // Expect one single packet of payload_size() + 3 bytes header.
-  const size_t kExpectedSizes[1] = {helper_->payload_size() + 3};
-  const int kExpectedPart[1] = {0};  // Packet starts with partition 0.
-  const bool kExpectedFragStart[1] = {true};
-  const size_t kExpectedNum = GTEST_ARRAY_SIZE_(kExpectedSizes);
-  CHECK_ARRAY_SIZE(kExpectedNum, kExpectedPart);
-  CHECK_ARRAY_SIZE(kExpectedNum, kExpectedFragStart);
-  ASSERT_EQ(num_packets, kExpectedNum);
-
-  helper_->GetAllPacketsAndCheck(&packetizer,
-                                 kExpectedSizes,
-                                 kExpectedPart,
-                                 kExpectedFragStart,
-                                 kExpectedNum);
-}
-
-// Verify TID field and KeyIdx field in combination.
-TEST_F(RtpPacketizerVp8Test, TestTIDAndKeyIdx) {
-  const size_t kSizeVector[] = {10, 10, 10};
-  const size_t kNumPartitions = GTEST_ARRAY_SIZE_(kSizeVector);
-  ASSERT_TRUE(Init(kSizeVector, kNumPartitions));
-
-  hdr_info_.temporalIdx = 1;
-  hdr_info_.keyIdx = 5;
-  // kMaxPayloadSize is only limited by allocated buffer size.
-  const size_t kMaxPayloadSize = helper_->buffer_size();
-  RtpPacketizerVp8 packetizer(hdr_info_, kMaxPayloadSize, 0, kAggregate);
-  size_t num_packets = packetizer.SetPayloadData(helper_->payload_data(),
-                                                 helper_->payload_size(),
-                                                 helper_->fragmentation());
-
-  // Expect one single packet of payload_size() + 3 bytes header.
-  const size_t kExpectedSizes[1] = {helper_->payload_size() + 3};
-  const int kExpectedPart[1] = {0};  // Packet starts with partition 0.
-  const bool kExpectedFragStart[1] = {true};
-  const size_t kExpectedNum = GTEST_ARRAY_SIZE_(kExpectedSizes);
-  CHECK_ARRAY_SIZE(kExpectedNum, kExpectedPart);
-  CHECK_ARRAY_SIZE(kExpectedNum, kExpectedFragStart);
-  ASSERT_EQ(num_packets, kExpectedNum);
-
-  helper_->GetAllPacketsAndCheck(&packetizer,
-                                 kExpectedSizes,
-                                 kExpectedPart,
-                                 kExpectedFragStart,
-                                 kExpectedNum);
-}
-
-class RtpDepacketizerVp8Test : public ::testing::Test {
- protected:
-  RtpDepacketizerVp8Test()
-      : depacketizer_(RtpDepacketizer::Create(kRtpVideoVp8)) {}
-
-  void ExpectPacket(RtpDepacketizer::ParsedPayload* parsed_payload,
-                    const uint8_t* data,
-                    size_t length) {
-    ASSERT_TRUE(parsed_payload != NULL);
-    EXPECT_THAT(std::vector<uint8_t>(
-                    parsed_payload->payload,
-                    parsed_payload->payload + parsed_payload->payload_length),
-                ::testing::ElementsAreArray(data, length));
-  }
-
-  std::unique_ptr<RtpDepacketizer> depacketizer_;
-};
-
-TEST_F(RtpDepacketizerVp8Test, BasicHeader) {
-  const uint8_t kHeaderLength = 1;
-  uint8_t packet[4] = {0};
-  packet[0] = 0x14;  // Binary 0001 0100; S = 1, PartID = 4.
-  packet[1] = 0x01;  // P frame.
-  RtpDepacketizer::ParsedPayload payload;
-
-  ASSERT_TRUE(depacketizer_->Parse(&payload, packet, sizeof(packet)));
-  ExpectPacket(
-      &payload, packet + kHeaderLength, sizeof(packet) - kHeaderLength);
-
-  EXPECT_EQ(kVideoFrameDelta, payload.frame_type);
-  EXPECT_EQ(kRtpVideoVp8, payload.type.Video.codec);
-  VerifyBasicHeader(&payload.type, 0, 1, 4);
-  VerifyExtensions(
-      &payload.type, kNoPictureId, kNoTl0PicIdx, kNoTemporalIdx, kNoKeyIdx);
-}
-
-TEST_F(RtpDepacketizerVp8Test, PictureID) {
-  const uint8_t kHeaderLength1 = 3;
-  const uint8_t kHeaderLength2 = 4;
-  const uint8_t kPictureId = 17;
-  uint8_t packet[10] = {0};
-  packet[0] = 0xA0;
-  packet[1] = 0x80;
-  packet[2] = kPictureId;
-  RtpDepacketizer::ParsedPayload payload;
-
-  ASSERT_TRUE(depacketizer_->Parse(&payload, packet, sizeof(packet)));
-  ExpectPacket(
-      &payload, packet + kHeaderLength1, sizeof(packet) - kHeaderLength1);
-  EXPECT_EQ(kVideoFrameDelta, payload.frame_type);
-  EXPECT_EQ(kRtpVideoVp8, payload.type.Video.codec);
-  VerifyBasicHeader(&payload.type, 1, 0, 0);
-  VerifyExtensions(
-      &payload.type, kPictureId, kNoTl0PicIdx, kNoTemporalIdx, kNoKeyIdx);
-
-  // Re-use packet, but change to long PictureID.
-  packet[2] = 0x80 | kPictureId;
-  packet[3] = kPictureId;
-
-  payload = RtpDepacketizer::ParsedPayload();
-  ASSERT_TRUE(depacketizer_->Parse(&payload, packet, sizeof(packet)));
-  ExpectPacket(
-      &payload, packet + kHeaderLength2, sizeof(packet) - kHeaderLength2);
-  VerifyBasicHeader(&payload.type, 1, 0, 0);
-  VerifyExtensions(&payload.type,
-                   (kPictureId << 8) + kPictureId,
-                   kNoTl0PicIdx,
-                   kNoTemporalIdx,
-                   kNoKeyIdx);
-}
-
-TEST_F(RtpDepacketizerVp8Test, Tl0PicIdx) {
-  const uint8_t kHeaderLength = 3;
-  const uint8_t kTl0PicIdx = 17;
-  uint8_t packet[13] = {0};
-  packet[0] = 0x90;
-  packet[1] = 0x40;
-  packet[2] = kTl0PicIdx;
-  RtpDepacketizer::ParsedPayload payload;
-
-  ASSERT_TRUE(depacketizer_->Parse(&payload, packet, sizeof(packet)));
-  ExpectPacket(
-      &payload, packet + kHeaderLength, sizeof(packet) - kHeaderLength);
-  EXPECT_EQ(kVideoFrameKey, payload.frame_type);
-  EXPECT_EQ(kRtpVideoVp8, payload.type.Video.codec);
-  VerifyBasicHeader(&payload.type, 0, 1, 0);
-  VerifyExtensions(
-      &payload.type, kNoPictureId, kTl0PicIdx, kNoTemporalIdx, kNoKeyIdx);
-}
-
-TEST_F(RtpDepacketizerVp8Test, TIDAndLayerSync) {
-  const uint8_t kHeaderLength = 3;
-  uint8_t packet[10] = {0};
-  packet[0] = 0x88;
-  packet[1] = 0x20;
-  packet[2] = 0x80;  // TID(2) + LayerSync(false)
-  RtpDepacketizer::ParsedPayload payload;
-
-  ASSERT_TRUE(depacketizer_->Parse(&payload, packet, sizeof(packet)));
-  ExpectPacket(
-      &payload, packet + kHeaderLength, sizeof(packet) - kHeaderLength);
-  EXPECT_EQ(kVideoFrameDelta, payload.frame_type);
-  EXPECT_EQ(kRtpVideoVp8, payload.type.Video.codec);
-  VerifyBasicHeader(&payload.type, 0, 0, 8);
-  VerifyExtensions(&payload.type, kNoPictureId, kNoTl0PicIdx, 2, kNoKeyIdx);
-  EXPECT_FALSE(payload.type.Video.codecHeader.VP8.layerSync);
-}
-
-TEST_F(RtpDepacketizerVp8Test, KeyIdx) {
-  const uint8_t kHeaderLength = 3;
-  const uint8_t kKeyIdx = 17;
-  uint8_t packet[10] = {0};
-  packet[0] = 0x88;
-  packet[1] = 0x10;  // K = 1.
-  packet[2] = kKeyIdx;
-  RtpDepacketizer::ParsedPayload payload;
-
-  ASSERT_TRUE(depacketizer_->Parse(&payload, packet, sizeof(packet)));
-  ExpectPacket(
-      &payload, packet + kHeaderLength, sizeof(packet) - kHeaderLength);
-  EXPECT_EQ(kVideoFrameDelta, payload.frame_type);
-  EXPECT_EQ(kRtpVideoVp8, payload.type.Video.codec);
-  VerifyBasicHeader(&payload.type, 0, 0, 8);
-  VerifyExtensions(
-      &payload.type, kNoPictureId, kNoTl0PicIdx, kNoTemporalIdx, kKeyIdx);
-}
-
-TEST_F(RtpDepacketizerVp8Test, MultipleExtensions) {
-  const uint8_t kHeaderLength = 6;
-  uint8_t packet[10] = {0};
-  packet[0] = 0x88;
-  packet[1] = 0x80 | 0x40 | 0x20 | 0x10;
-  packet[2] = 0x80 | 17;           // PictureID, high 7 bits.
-  packet[3] = 17;                  // PictureID, low 8 bits.
-  packet[4] = 42;                  // Tl0PicIdx.
-  packet[5] = 0x40 | 0x20 | 0x11;  // TID(1) + LayerSync(true) + KEYIDX(17).
-  RtpDepacketizer::ParsedPayload payload;
-
-  ASSERT_TRUE(depacketizer_->Parse(&payload, packet, sizeof(packet)));
-  ExpectPacket(
-      &payload, packet + kHeaderLength, sizeof(packet) - kHeaderLength);
-  EXPECT_EQ(kVideoFrameDelta, payload.frame_type);
-  EXPECT_EQ(kRtpVideoVp8, payload.type.Video.codec);
-  VerifyBasicHeader(&payload.type, 0, 0, 8);
-  VerifyExtensions(&payload.type, (17 << 8) + 17, 42, 1, 17);
-}
-
-TEST_F(RtpDepacketizerVp8Test, TooShortHeader) {
-  uint8_t packet[4] = {0};
-  packet[0] = 0x88;
-  packet[1] = 0x80 | 0x40 | 0x20 | 0x10;  // All extensions are enabled...
-  packet[2] = 0x80 | 17;  // ... but only 2 bytes PictureID is provided.
-  packet[3] = 17;         // PictureID, low 8 bits.
-  RtpDepacketizer::ParsedPayload payload;
-
-  EXPECT_FALSE(depacketizer_->Parse(&payload, packet, sizeof(packet)));
-}
-
-TEST_F(RtpDepacketizerVp8Test, TestWithPacketizer) {
-  const uint8_t kHeaderLength = 5;
-  uint8_t data[10] = {0};
-  RtpPacketToSend packet(kNoExtensions);
-  RTPVideoHeaderVP8 input_header;
-  input_header.nonReference = true;
-  input_header.pictureId = 300;
-  input_header.temporalIdx = 1;
-  input_header.layerSync = false;
-  input_header.tl0PicIdx = kNoTl0PicIdx;  // Disable.
-  input_header.keyIdx = 31;
-  RtpPacketizerVp8 packetizer(input_header, 20, 0);
-  EXPECT_EQ(packetizer.SetPayloadData(data, 10, NULL), 1u);
-  ASSERT_TRUE(packetizer.NextPacket(&packet));
-  EXPECT_TRUE(packet.Marker());
-
-  auto rtp_payload = packet.payload();
-  RtpDepacketizer::ParsedPayload payload;
-  ASSERT_TRUE(
-      depacketizer_->Parse(&payload, rtp_payload.data(), rtp_payload.size()));
-  auto vp8_payload = rtp_payload.subview(kHeaderLength);
-  ExpectPacket(&payload, vp8_payload.data(), vp8_payload.size());
-  EXPECT_EQ(kVideoFrameKey, payload.frame_type);
-  EXPECT_EQ(kRtpVideoVp8, payload.type.Video.codec);
-  VerifyBasicHeader(&payload.type, 1, 1, 0);
-  VerifyExtensions(&payload.type,
-                   input_header.pictureId,
-                   input_header.tl0PicIdx,
-                   input_header.temporalIdx,
-                   input_header.keyIdx);
-  EXPECT_EQ(payload.type.Video.codecHeader.VP8.layerSync,
-            input_header.layerSync);
-}
-
-TEST_F(RtpDepacketizerVp8Test, TestEmptyPayload) {
-  // Using a wild pointer to crash on accesses from inside the depacketizer.
-  uint8_t* garbage_ptr = reinterpret_cast<uint8_t*>(0x4711);
-  RtpDepacketizer::ParsedPayload payload;
-  EXPECT_FALSE(depacketizer_->Parse(&payload, garbage_ptr, 0));
-}
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/rtp_format_vp9.cc b/modules/rtp_rtcp/source/rtp_format_vp9.cc
deleted file mode 100644
index b08ec8b..0000000
--- a/modules/rtp_rtcp/source/rtp_format_vp9.cc
+++ /dev/null
@@ -1,765 +0,0 @@
-/*
- *  Copyright (c) 2015 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/rtp_rtcp/source/rtp_format_vp9.h"
-
-#include <assert.h>
-#include <string.h>
-
-#include <cmath>
-
-#include "webrtc/modules/rtp_rtcp/source/rtp_packet_to_send.h"
-#include "webrtc/rtc_base/bitbuffer.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-
-#define RETURN_FALSE_ON_ERROR(x) \
-  if (!(x)) {                    \
-    return false;                \
-  }
-
-namespace webrtc {
-namespace {
-// Length of VP9 payload descriptors' fixed part.
-const size_t kFixedPayloadDescriptorBytes = 1;
-
-const uint32_t kReservedBitValue0 = 0;
-
-uint8_t TemporalIdxField(const RTPVideoHeaderVP9& hdr, uint8_t def) {
-  return (hdr.temporal_idx == kNoTemporalIdx) ? def : hdr.temporal_idx;
-}
-
-uint8_t SpatialIdxField(const RTPVideoHeaderVP9& hdr, uint8_t def) {
-  return (hdr.spatial_idx == kNoSpatialIdx) ? def : hdr.spatial_idx;
-}
-
-int16_t Tl0PicIdxField(const RTPVideoHeaderVP9& hdr, uint8_t def) {
-  return (hdr.tl0_pic_idx == kNoTl0PicIdx) ? def : hdr.tl0_pic_idx;
-}
-
-// Picture ID:
-//
-//      +-+-+-+-+-+-+-+-+
-// I:   |M| PICTURE ID  |   M:0 => picture id is 7 bits.
-//      +-+-+-+-+-+-+-+-+   M:1 => picture id is 15 bits.
-// M:   | EXTENDED PID  |
-//      +-+-+-+-+-+-+-+-+
-//
-size_t PictureIdLength(const RTPVideoHeaderVP9& hdr) {
-  if (hdr.picture_id == kNoPictureId)
-    return 0;
-  return (hdr.max_picture_id == kMaxOneBytePictureId) ? 1 : 2;
-}
-
-bool PictureIdPresent(const RTPVideoHeaderVP9& hdr) {
-  return PictureIdLength(hdr) > 0;
-}
-
-// Layer indices:
-//
-// Flexible mode (F=1):     Non-flexible mode (F=0):
-//
-//      +-+-+-+-+-+-+-+-+   +-+-+-+-+-+-+-+-+
-// L:   |  T  |U|  S  |D|   |  T  |U|  S  |D|
-//      +-+-+-+-+-+-+-+-+   +-+-+-+-+-+-+-+-+
-//                          |   TL0PICIDX   |
-//                          +-+-+-+-+-+-+-+-+
-//
-size_t LayerInfoLength(const RTPVideoHeaderVP9& hdr) {
-  if (hdr.temporal_idx == kNoTemporalIdx &&
-      hdr.spatial_idx == kNoSpatialIdx) {
-    return 0;
-  }
-  return hdr.flexible_mode ? 1 : 2;
-}
-
-bool LayerInfoPresent(const RTPVideoHeaderVP9& hdr) {
-  return LayerInfoLength(hdr) > 0;
-}
-
-// Reference indices:
-//
-//      +-+-+-+-+-+-+-+-+                P=1,F=1: At least one reference index
-// P,F: | P_DIFF      |N|  up to 3 times          has to be specified.
-//      +-+-+-+-+-+-+-+-+                    N=1: An additional P_DIFF follows
-//                                                current P_DIFF.
-//
-size_t RefIndicesLength(const RTPVideoHeaderVP9& hdr) {
-  if (!hdr.inter_pic_predicted || !hdr.flexible_mode)
-    return 0;
-
-  RTC_DCHECK_GT(hdr.num_ref_pics, 0U);
-  RTC_DCHECK_LE(hdr.num_ref_pics, kMaxVp9RefPics);
-  return hdr.num_ref_pics;
-}
-
-// Scalability structure (SS).
-//
-//      +-+-+-+-+-+-+-+-+
-// V:   | N_S |Y|G|-|-|-|
-//      +-+-+-+-+-+-+-+-+              -|
-// Y:   |     WIDTH     | (OPTIONAL)    .
-//      +               +               .
-//      |               | (OPTIONAL)    .
-//      +-+-+-+-+-+-+-+-+               . N_S + 1 times
-//      |     HEIGHT    | (OPTIONAL)    .
-//      +               +               .
-//      |               | (OPTIONAL)    .
-//      +-+-+-+-+-+-+-+-+              -|
-// G:   |      N_G      | (OPTIONAL)
-//      +-+-+-+-+-+-+-+-+                           -|
-// N_G: |  T  |U| R |-|-| (OPTIONAL)                 .
-//      +-+-+-+-+-+-+-+-+              -|            . N_G times
-//      |    P_DIFF     | (OPTIONAL)    . R times    .
-//      +-+-+-+-+-+-+-+-+              -|           -|
-//
-size_t SsDataLength(const RTPVideoHeaderVP9& hdr) {
-  if (!hdr.ss_data_available)
-    return 0;
-
-  RTC_DCHECK_GT(hdr.num_spatial_layers, 0U);
-  RTC_DCHECK_LE(hdr.num_spatial_layers, kMaxVp9NumberOfSpatialLayers);
-  RTC_DCHECK_LE(hdr.gof.num_frames_in_gof, kMaxVp9FramesInGof);
-  size_t length = 1;                           // V
-  if (hdr.spatial_layer_resolution_present) {
-    length += 4 * hdr.num_spatial_layers;      // Y
-  }
-  if (hdr.gof.num_frames_in_gof > 0) {
-    ++length;                                  // G
-  }
-  // N_G
-  length += hdr.gof.num_frames_in_gof;  // T, U, R
-  for (size_t i = 0; i < hdr.gof.num_frames_in_gof; ++i) {
-    RTC_DCHECK_LE(hdr.gof.num_ref_pics[i], kMaxVp9RefPics);
-    length += hdr.gof.num_ref_pics[i];  // R times
-  }
-  return length;
-}
-
-size_t PayloadDescriptorLengthMinusSsData(const RTPVideoHeaderVP9& hdr) {
-  return kFixedPayloadDescriptorBytes + PictureIdLength(hdr) +
-         LayerInfoLength(hdr) + RefIndicesLength(hdr);
-}
-
-size_t PayloadDescriptorLength(const RTPVideoHeaderVP9& hdr) {
-  return PayloadDescriptorLengthMinusSsData(hdr) + SsDataLength(hdr);
-}
-
-void QueuePacket(size_t start_pos,
-                 size_t size,
-                 bool layer_begin,
-                 bool layer_end,
-                 RtpPacketizerVp9::PacketInfoQueue* packets) {
-  RtpPacketizerVp9::PacketInfo packet_info;
-  packet_info.payload_start_pos = start_pos;
-  packet_info.size = size;
-  packet_info.layer_begin = layer_begin;
-  packet_info.layer_end = layer_end;
-  packets->push(packet_info);
-}
-
-// Picture ID:
-//
-//      +-+-+-+-+-+-+-+-+
-// I:   |M| PICTURE ID  |   M:0 => picture id is 7 bits.
-//      +-+-+-+-+-+-+-+-+   M:1 => picture id is 15 bits.
-// M:   | EXTENDED PID  |
-//      +-+-+-+-+-+-+-+-+
-//
-bool WritePictureId(const RTPVideoHeaderVP9& vp9,
-                    rtc::BitBufferWriter* writer) {
-  bool m_bit = (PictureIdLength(vp9) == 2);
-  RETURN_FALSE_ON_ERROR(writer->WriteBits(m_bit ? 1 : 0, 1));
-  RETURN_FALSE_ON_ERROR(writer->WriteBits(vp9.picture_id, m_bit ? 15 : 7));
-  return true;
-}
-
-// Layer indices:
-//
-// Flexible mode (F=1):
-//
-//      +-+-+-+-+-+-+-+-+
-// L:   |  T  |U|  S  |D|
-//      +-+-+-+-+-+-+-+-+
-//
-bool WriteLayerInfoCommon(const RTPVideoHeaderVP9& vp9,
-                          rtc::BitBufferWriter* writer) {
-  RETURN_FALSE_ON_ERROR(writer->WriteBits(TemporalIdxField(vp9, 0), 3));
-  RETURN_FALSE_ON_ERROR(writer->WriteBits(vp9.temporal_up_switch ? 1 : 0, 1));
-  RETURN_FALSE_ON_ERROR(writer->WriteBits(SpatialIdxField(vp9, 0), 3));
-  RETURN_FALSE_ON_ERROR(writer->WriteBits(vp9.inter_layer_predicted ? 1: 0, 1));
-  return true;
-}
-
-// Non-flexible mode (F=0):
-//
-//      +-+-+-+-+-+-+-+-+
-// L:   |  T  |U|  S  |D|
-//      +-+-+-+-+-+-+-+-+
-//      |   TL0PICIDX   |
-//      +-+-+-+-+-+-+-+-+
-//
-bool WriteLayerInfoNonFlexibleMode(const RTPVideoHeaderVP9& vp9,
-                                   rtc::BitBufferWriter* writer) {
-  RETURN_FALSE_ON_ERROR(writer->WriteUInt8(Tl0PicIdxField(vp9, 0)));
-  return true;
-}
-
-bool WriteLayerInfo(const RTPVideoHeaderVP9& vp9,
-                    rtc::BitBufferWriter* writer) {
-  if (!WriteLayerInfoCommon(vp9, writer))
-    return false;
-
-  if (vp9.flexible_mode)
-    return true;
-
-  return WriteLayerInfoNonFlexibleMode(vp9, writer);
-}
-
-// Reference indices:
-//
-//      +-+-+-+-+-+-+-+-+                P=1,F=1: At least one reference index
-// P,F: | P_DIFF      |N|  up to 3 times          has to be specified.
-//      +-+-+-+-+-+-+-+-+                    N=1: An additional P_DIFF follows
-//                                                current P_DIFF.
-//
-bool WriteRefIndices(const RTPVideoHeaderVP9& vp9,
-                     rtc::BitBufferWriter* writer) {
-  if (!PictureIdPresent(vp9) ||
-      vp9.num_ref_pics == 0 || vp9.num_ref_pics > kMaxVp9RefPics) {
-    return false;
-  }
-  for (uint8_t i = 0; i < vp9.num_ref_pics; ++i) {
-    bool n_bit = !(i == vp9.num_ref_pics - 1);
-    RETURN_FALSE_ON_ERROR(writer->WriteBits(vp9.pid_diff[i], 7));
-    RETURN_FALSE_ON_ERROR(writer->WriteBits(n_bit ? 1 : 0, 1));
-  }
-  return true;
-}
-
-// Scalability structure (SS).
-//
-//      +-+-+-+-+-+-+-+-+
-// V:   | N_S |Y|G|-|-|-|
-//      +-+-+-+-+-+-+-+-+              -|
-// Y:   |     WIDTH     | (OPTIONAL)    .
-//      +               +               .
-//      |               | (OPTIONAL)    .
-//      +-+-+-+-+-+-+-+-+               . N_S + 1 times
-//      |     HEIGHT    | (OPTIONAL)    .
-//      +               +               .
-//      |               | (OPTIONAL)    .
-//      +-+-+-+-+-+-+-+-+              -|
-// G:   |      N_G      | (OPTIONAL)
-//      +-+-+-+-+-+-+-+-+                           -|
-// N_G: |  T  |U| R |-|-| (OPTIONAL)                 .
-//      +-+-+-+-+-+-+-+-+              -|            . N_G times
-//      |    P_DIFF     | (OPTIONAL)    . R times    .
-//      +-+-+-+-+-+-+-+-+              -|           -|
-//
-bool WriteSsData(const RTPVideoHeaderVP9& vp9, rtc::BitBufferWriter* writer) {
-  RTC_DCHECK_GT(vp9.num_spatial_layers, 0U);
-  RTC_DCHECK_LE(vp9.num_spatial_layers, kMaxVp9NumberOfSpatialLayers);
-  RTC_DCHECK_LE(vp9.gof.num_frames_in_gof, kMaxVp9FramesInGof);
-  bool g_bit = vp9.gof.num_frames_in_gof > 0;
-
-  RETURN_FALSE_ON_ERROR(writer->WriteBits(vp9.num_spatial_layers - 1, 3));
-  RETURN_FALSE_ON_ERROR(
-      writer->WriteBits(vp9.spatial_layer_resolution_present ? 1 : 0, 1));
-  RETURN_FALSE_ON_ERROR(writer->WriteBits(g_bit ? 1 : 0, 1));  // G
-  RETURN_FALSE_ON_ERROR(writer->WriteBits(kReservedBitValue0, 3));
-
-  if (vp9.spatial_layer_resolution_present) {
-    for (size_t i = 0; i < vp9.num_spatial_layers; ++i) {
-      RETURN_FALSE_ON_ERROR(writer->WriteUInt16(vp9.width[i]));
-      RETURN_FALSE_ON_ERROR(writer->WriteUInt16(vp9.height[i]));
-    }
-  }
-  if (g_bit) {
-    RETURN_FALSE_ON_ERROR(writer->WriteUInt8(vp9.gof.num_frames_in_gof));
-  }
-  for (size_t i = 0; i < vp9.gof.num_frames_in_gof; ++i) {
-    RETURN_FALSE_ON_ERROR(writer->WriteBits(vp9.gof.temporal_idx[i], 3));
-    RETURN_FALSE_ON_ERROR(
-        writer->WriteBits(vp9.gof.temporal_up_switch[i] ? 1 : 0, 1));
-    RETURN_FALSE_ON_ERROR(writer->WriteBits(vp9.gof.num_ref_pics[i], 2));
-    RETURN_FALSE_ON_ERROR(writer->WriteBits(kReservedBitValue0, 2));
-    for (uint8_t r = 0; r < vp9.gof.num_ref_pics[i]; ++r) {
-      RETURN_FALSE_ON_ERROR(writer->WriteUInt8(vp9.gof.pid_diff[i][r]));
-    }
-  }
-  return true;
-}
-
-// Picture ID:
-//
-//      +-+-+-+-+-+-+-+-+
-// I:   |M| PICTURE ID  |   M:0 => picture id is 7 bits.
-//      +-+-+-+-+-+-+-+-+   M:1 => picture id is 15 bits.
-// M:   | EXTENDED PID  |
-//      +-+-+-+-+-+-+-+-+
-//
-bool ParsePictureId(rtc::BitBuffer* parser, RTPVideoHeaderVP9* vp9) {
-  uint32_t picture_id;
-  uint32_t m_bit;
-  RETURN_FALSE_ON_ERROR(parser->ReadBits(&m_bit, 1));
-  if (m_bit) {
-    RETURN_FALSE_ON_ERROR(parser->ReadBits(&picture_id, 15));
-    vp9->max_picture_id = kMaxTwoBytePictureId;
-  } else {
-    RETURN_FALSE_ON_ERROR(parser->ReadBits(&picture_id, 7));
-    vp9->max_picture_id = kMaxOneBytePictureId;
-  }
-  vp9->picture_id = picture_id;
-  return true;
-}
-
-// Layer indices (flexible mode):
-//
-//      +-+-+-+-+-+-+-+-+
-// L:   |  T  |U|  S  |D|
-//      +-+-+-+-+-+-+-+-+
-//
-bool ParseLayerInfoCommon(rtc::BitBuffer* parser, RTPVideoHeaderVP9* vp9) {
-  uint32_t t, u_bit, s, d_bit;
-  RETURN_FALSE_ON_ERROR(parser->ReadBits(&t, 3));
-  RETURN_FALSE_ON_ERROR(parser->ReadBits(&u_bit, 1));
-  RETURN_FALSE_ON_ERROR(parser->ReadBits(&s, 3));
-  RETURN_FALSE_ON_ERROR(parser->ReadBits(&d_bit, 1));
-  vp9->temporal_idx = t;
-  vp9->temporal_up_switch = u_bit ? true : false;
-  vp9->spatial_idx = s;
-  vp9->inter_layer_predicted = d_bit ? true : false;
-  return true;
-}
-
-// Layer indices (non-flexible mode):
-//
-//      +-+-+-+-+-+-+-+-+
-// L:   |  T  |U|  S  |D|
-//      +-+-+-+-+-+-+-+-+
-//      |   TL0PICIDX   |
-//      +-+-+-+-+-+-+-+-+
-//
-bool ParseLayerInfoNonFlexibleMode(rtc::BitBuffer* parser,
-                                   RTPVideoHeaderVP9* vp9) {
-  uint8_t tl0picidx;
-  RETURN_FALSE_ON_ERROR(parser->ReadUInt8(&tl0picidx));
-  vp9->tl0_pic_idx = tl0picidx;
-  return true;
-}
-
-bool ParseLayerInfo(rtc::BitBuffer* parser, RTPVideoHeaderVP9* vp9) {
-  if (!ParseLayerInfoCommon(parser, vp9))
-    return false;
-
-  if (vp9->flexible_mode)
-    return true;
-
-  return ParseLayerInfoNonFlexibleMode(parser, vp9);
-}
-
-// Reference indices:
-//
-//      +-+-+-+-+-+-+-+-+                P=1,F=1: At least one reference index
-// P,F: | P_DIFF      |N|  up to 3 times          has to be specified.
-//      +-+-+-+-+-+-+-+-+                    N=1: An additional P_DIFF follows
-//                                                current P_DIFF.
-//
-bool ParseRefIndices(rtc::BitBuffer* parser, RTPVideoHeaderVP9* vp9) {
-  if (vp9->picture_id == kNoPictureId)
-    return false;
-
-  vp9->num_ref_pics = 0;
-  uint32_t n_bit;
-  do {
-    if (vp9->num_ref_pics == kMaxVp9RefPics)
-      return false;
-
-    uint32_t p_diff;
-    RETURN_FALSE_ON_ERROR(parser->ReadBits(&p_diff, 7));
-    RETURN_FALSE_ON_ERROR(parser->ReadBits(&n_bit, 1));
-
-    vp9->pid_diff[vp9->num_ref_pics] = p_diff;
-    uint32_t scaled_pid = vp9->picture_id;
-    if (p_diff > scaled_pid) {
-      // TODO(asapersson): Max should correspond to the picture id of last wrap.
-      scaled_pid += vp9->max_picture_id + 1;
-    }
-    vp9->ref_picture_id[vp9->num_ref_pics++] = scaled_pid - p_diff;
-  } while (n_bit);
-
-  return true;
-}
-
-// Scalability structure (SS).
-//
-//      +-+-+-+-+-+-+-+-+
-// V:   | N_S |Y|G|-|-|-|
-//      +-+-+-+-+-+-+-+-+              -|
-// Y:   |     WIDTH     | (OPTIONAL)    .
-//      +               +               .
-//      |               | (OPTIONAL)    .
-//      +-+-+-+-+-+-+-+-+               . N_S + 1 times
-//      |     HEIGHT    | (OPTIONAL)    .
-//      +               +               .
-//      |               | (OPTIONAL)    .
-//      +-+-+-+-+-+-+-+-+              -|
-// G:   |      N_G      | (OPTIONAL)
-//      +-+-+-+-+-+-+-+-+                           -|
-// N_G: |  T  |U| R |-|-| (OPTIONAL)                 .
-//      +-+-+-+-+-+-+-+-+              -|            . N_G times
-//      |    P_DIFF     | (OPTIONAL)    . R times    .
-//      +-+-+-+-+-+-+-+-+              -|           -|
-//
-bool ParseSsData(rtc::BitBuffer* parser, RTPVideoHeaderVP9* vp9) {
-  uint32_t n_s, y_bit, g_bit;
-  RETURN_FALSE_ON_ERROR(parser->ReadBits(&n_s, 3));
-  RETURN_FALSE_ON_ERROR(parser->ReadBits(&y_bit, 1));
-  RETURN_FALSE_ON_ERROR(parser->ReadBits(&g_bit, 1));
-  RETURN_FALSE_ON_ERROR(parser->ConsumeBits(3));
-  vp9->num_spatial_layers = n_s + 1;
-  vp9->spatial_layer_resolution_present = y_bit ? true : false;
-  vp9->gof.num_frames_in_gof = 0;
-
-  if (y_bit) {
-    for (size_t i = 0; i < vp9->num_spatial_layers; ++i) {
-      RETURN_FALSE_ON_ERROR(parser->ReadUInt16(&vp9->width[i]));
-      RETURN_FALSE_ON_ERROR(parser->ReadUInt16(&vp9->height[i]));
-    }
-  }
-  if (g_bit) {
-    uint8_t n_g;
-    RETURN_FALSE_ON_ERROR(parser->ReadUInt8(&n_g));
-    vp9->gof.num_frames_in_gof = n_g;
-  }
-  for (size_t i = 0; i < vp9->gof.num_frames_in_gof; ++i) {
-    uint32_t t, u_bit, r;
-    RETURN_FALSE_ON_ERROR(parser->ReadBits(&t, 3));
-    RETURN_FALSE_ON_ERROR(parser->ReadBits(&u_bit, 1));
-    RETURN_FALSE_ON_ERROR(parser->ReadBits(&r, 2));
-    RETURN_FALSE_ON_ERROR(parser->ConsumeBits(2));
-    vp9->gof.temporal_idx[i] = t;
-    vp9->gof.temporal_up_switch[i] = u_bit ? true : false;
-    vp9->gof.num_ref_pics[i] = r;
-
-    for (uint8_t p = 0; p < vp9->gof.num_ref_pics[i]; ++p) {
-      uint8_t p_diff;
-      RETURN_FALSE_ON_ERROR(parser->ReadUInt8(&p_diff));
-      vp9->gof.pid_diff[i][p] = p_diff;
-    }
-  }
-  return true;
-}
-}  // namespace
-
-RtpPacketizerVp9::RtpPacketizerVp9(const RTPVideoHeaderVP9& hdr,
-                                   size_t max_payload_length,
-                                   size_t last_packet_reduction_len)
-    : hdr_(hdr),
-      max_payload_length_(max_payload_length),
-      payload_(nullptr),
-      payload_size_(0),
-      last_packet_reduction_len_(last_packet_reduction_len) {}
-
-RtpPacketizerVp9::~RtpPacketizerVp9() {
-}
-
-std::string RtpPacketizerVp9::ToString() {
-  return "RtpPacketizerVp9";
-}
-
-size_t RtpPacketizerVp9::SetPayloadData(
-    const uint8_t* payload,
-    size_t payload_size,
-    const RTPFragmentationHeader* fragmentation) {
-  payload_ = payload;
-  payload_size_ = payload_size;
-  GeneratePackets();
-  return packets_.size();
-}
-
-// Splits payload in minimal number of roughly equal in size packets.
-void RtpPacketizerVp9::GeneratePackets() {
-  if (max_payload_length_ < PayloadDescriptorLength(hdr_) + 1) {
-    LOG(LS_ERROR) << "Payload header and one payload byte won't fit in the "
-                     "first packet.";
-    return;
-  }
-  if (max_payload_length_ < PayloadDescriptorLengthMinusSsData(hdr_) + 1 +
-                                last_packet_reduction_len_) {
-    LOG(LS_ERROR) << "Payload header and one payload byte won't fit in the last"
-                     " packet.";
-    return;
-  }
-  if (payload_size_ == 1 &&
-      max_payload_length_ <
-          PayloadDescriptorLength(hdr_) + 1 + last_packet_reduction_len_) {
-    LOG(LS_ERROR) << "Can't fit header and payload into single packet, but "
-                     "payload size is one: no way to generate packets with "
-                     "nonzero payload.";
-    return;
-  }
-
-  // Instead of making last packet smaller, we pretend that we must write
-  // additional data into it. We account for this virtual payload while
-  // calculating packets number and sizes. We also pretend that all packets
-  // headers are the same length and extra SS header data in the fits packet
-  // is also treated as a payload here.
-
-  size_t ss_data_len = SsDataLength(hdr_);
-  // Payload, virtual payload and SS hdr data in the first packet together.
-  size_t total_bytes = ss_data_len + payload_size_ + last_packet_reduction_len_;
-  // Now all packets will have the same lenght of vp9 headers.
-  size_t per_packet_capacity =
-      max_payload_length_ - PayloadDescriptorLengthMinusSsData(hdr_);
-  // Integer division rounding up.
-  size_t num_packets =
-      (total_bytes + per_packet_capacity - 1) / per_packet_capacity;
-  // Average rounded down.
-  size_t per_packet_bytes = total_bytes / num_packets;
-  // Several last packets are 1 byte larger than the rest.
-  // i.e. if 14 bytes were split between 4 packets, it would be 3+3+4+4.
-  size_t num_larger_packets = total_bytes % num_packets;
-  size_t bytes_processed = 0;
-  size_t num_packets_left = num_packets;
-  while (bytes_processed < payload_size_) {
-    if (num_packets_left == num_larger_packets)
-      ++per_packet_bytes;
-    size_t packet_bytes = per_packet_bytes;
-    // First packet also has SS hdr data.
-    if (bytes_processed == 0) {
-      // Must write at least one byte of the real payload to the packet.
-      if (packet_bytes > ss_data_len) {
-        packet_bytes -= ss_data_len;
-      } else {
-        packet_bytes = 1;
-      }
-    }
-    size_t rem_bytes = payload_size_ - bytes_processed;
-    if (packet_bytes >= rem_bytes) {
-      // All remaining payload fits into this packet.
-      packet_bytes = rem_bytes;
-      // If this is the penultimate packet, leave at least 1 byte of payload for
-      // the last packet.
-      if (num_packets_left == 2)
-        --packet_bytes;
-    }
-    QueuePacket(bytes_processed, packet_bytes, bytes_processed == 0,
-                rem_bytes == packet_bytes, &packets_);
-    --num_packets_left;
-    bytes_processed += packet_bytes;
-    // Last packet should be smaller
-    RTC_DCHECK(num_packets_left > 0 ||
-               per_packet_capacity >=
-                   packet_bytes + last_packet_reduction_len_);
-  }
-  RTC_CHECK_EQ(bytes_processed, payload_size_);
-}
-
-bool RtpPacketizerVp9::NextPacket(RtpPacketToSend* packet) {
-  RTC_DCHECK(packet);
-  if (packets_.empty()) {
-    return false;
-  }
-  PacketInfo packet_info = packets_.front();
-  packets_.pop();
-
-  if (!WriteHeaderAndPayload(packet_info, packet, packets_.empty())) {
-    return false;
-  }
-  packet->SetMarker(packets_.empty() &&
-                    (hdr_.spatial_idx == kNoSpatialIdx ||
-                     hdr_.spatial_idx == hdr_.num_spatial_layers - 1));
-  return true;
-}
-
-// VP9 format:
-//
-// Payload descriptor for F = 1 (flexible mode)
-//       0 1 2 3 4 5 6 7
-//      +-+-+-+-+-+-+-+-+
-//      |I|P|L|F|B|E|V|-| (REQUIRED)
-//      +-+-+-+-+-+-+-+-+
-// I:   |M| PICTURE ID  | (RECOMMENDED)
-//      +-+-+-+-+-+-+-+-+
-// M:   | EXTENDED PID  | (RECOMMENDED)
-//      +-+-+-+-+-+-+-+-+
-// L:   |  T  |U|  S  |D| (CONDITIONALLY RECOMMENDED)
-//      +-+-+-+-+-+-+-+-+                             -|
-// P,F: | P_DIFF      |N| (CONDITIONALLY RECOMMENDED)  . up to 3 times
-//      +-+-+-+-+-+-+-+-+                             -|
-// V:   | SS            |
-//      | ..            |
-//      +-+-+-+-+-+-+-+-+
-//
-// Payload descriptor for F = 0 (non-flexible mode)
-//       0 1 2 3 4 5 6 7
-//      +-+-+-+-+-+-+-+-+
-//      |I|P|L|F|B|E|V|-| (REQUIRED)
-//      +-+-+-+-+-+-+-+-+
-// I:   |M| PICTURE ID  | (RECOMMENDED)
-//      +-+-+-+-+-+-+-+-+
-// M:   | EXTENDED PID  | (RECOMMENDED)
-//      +-+-+-+-+-+-+-+-+
-// L:   |  T  |U|  S  |D| (CONDITIONALLY RECOMMENDED)
-//      +-+-+-+-+-+-+-+-+
-//      |   TL0PICIDX   | (CONDITIONALLY REQUIRED)
-//      +-+-+-+-+-+-+-+-+
-// V:   | SS            |
-//      | ..            |
-//      +-+-+-+-+-+-+-+-+
-
-bool RtpPacketizerVp9::WriteHeaderAndPayload(const PacketInfo& packet_info,
-                                             RtpPacketToSend* packet,
-                                             bool last) const {
-  uint8_t* buffer = packet->AllocatePayload(
-      last ? max_payload_length_ - last_packet_reduction_len_
-           : max_payload_length_);
-  RTC_DCHECK(buffer);
-  size_t header_length;
-  if (!WriteHeader(packet_info, buffer, &header_length))
-    return false;
-
-  // Copy payload data.
-  memcpy(&buffer[header_length],
-         &payload_[packet_info.payload_start_pos], packet_info.size);
-
-  packet->SetPayloadSize(header_length + packet_info.size);
-  return true;
-}
-
-bool RtpPacketizerVp9::WriteHeader(const PacketInfo& packet_info,
-                                   uint8_t* buffer,
-                                   size_t* header_length) const {
-  // Required payload descriptor byte.
-  bool i_bit = PictureIdPresent(hdr_);
-  bool p_bit = hdr_.inter_pic_predicted;
-  bool l_bit = LayerInfoPresent(hdr_);
-  bool f_bit = hdr_.flexible_mode;
-  bool b_bit = packet_info.layer_begin;
-  bool e_bit = packet_info.layer_end;
-  bool v_bit = hdr_.ss_data_available && b_bit;
-
-  rtc::BitBufferWriter writer(buffer, max_payload_length_);
-  RETURN_FALSE_ON_ERROR(writer.WriteBits(i_bit ? 1 : 0, 1));
-  RETURN_FALSE_ON_ERROR(writer.WriteBits(p_bit ? 1 : 0, 1));
-  RETURN_FALSE_ON_ERROR(writer.WriteBits(l_bit ? 1 : 0, 1));
-  RETURN_FALSE_ON_ERROR(writer.WriteBits(f_bit ? 1 : 0, 1));
-  RETURN_FALSE_ON_ERROR(writer.WriteBits(b_bit ? 1 : 0, 1));
-  RETURN_FALSE_ON_ERROR(writer.WriteBits(e_bit ? 1 : 0, 1));
-  RETURN_FALSE_ON_ERROR(writer.WriteBits(v_bit ? 1 : 0, 1));
-  RETURN_FALSE_ON_ERROR(writer.WriteBits(kReservedBitValue0, 1));
-
-  // Add fields that are present.
-  if (i_bit && !WritePictureId(hdr_, &writer)) {
-    LOG(LS_ERROR) << "Failed writing VP9 picture id.";
-    return false;
-  }
-  if (l_bit && !WriteLayerInfo(hdr_, &writer)) {
-    LOG(LS_ERROR) << "Failed writing VP9 layer info.";
-    return false;
-  }
-  if (p_bit && f_bit && !WriteRefIndices(hdr_, &writer)) {
-    LOG(LS_ERROR) << "Failed writing VP9 ref indices.";
-    return false;
-  }
-  if (v_bit && !WriteSsData(hdr_, &writer)) {
-    LOG(LS_ERROR) << "Failed writing VP9 SS data.";
-    return false;
-  }
-
-  size_t offset_bytes = 0;
-  size_t offset_bits = 0;
-  writer.GetCurrentOffset(&offset_bytes, &offset_bits);
-  assert(offset_bits == 0);
-
-  *header_length = offset_bytes;
-  return true;
-}
-
-bool RtpDepacketizerVp9::Parse(ParsedPayload* parsed_payload,
-                               const uint8_t* payload,
-                               size_t payload_length) {
-  assert(parsed_payload != nullptr);
-  if (payload_length == 0) {
-    LOG(LS_ERROR) << "Payload length is zero.";
-    return false;
-  }
-
-  // Parse mandatory first byte of payload descriptor.
-  rtc::BitBuffer parser(payload, payload_length);
-  uint32_t i_bit, p_bit, l_bit, f_bit, b_bit, e_bit, v_bit;
-  RETURN_FALSE_ON_ERROR(parser.ReadBits(&i_bit, 1));
-  RETURN_FALSE_ON_ERROR(parser.ReadBits(&p_bit, 1));
-  RETURN_FALSE_ON_ERROR(parser.ReadBits(&l_bit, 1));
-  RETURN_FALSE_ON_ERROR(parser.ReadBits(&f_bit, 1));
-  RETURN_FALSE_ON_ERROR(parser.ReadBits(&b_bit, 1));
-  RETURN_FALSE_ON_ERROR(parser.ReadBits(&e_bit, 1));
-  RETURN_FALSE_ON_ERROR(parser.ReadBits(&v_bit, 1));
-  RETURN_FALSE_ON_ERROR(parser.ConsumeBits(1));
-
-  // Parsed payload.
-  parsed_payload->type.Video.width = 0;
-  parsed_payload->type.Video.height = 0;
-  parsed_payload->type.Video.simulcastIdx = 0;
-  parsed_payload->type.Video.codec = kRtpVideoVp9;
-
-  parsed_payload->frame_type = p_bit ? kVideoFrameDelta : kVideoFrameKey;
-
-  RTPVideoHeaderVP9* vp9 = &parsed_payload->type.Video.codecHeader.VP9;
-  vp9->InitRTPVideoHeaderVP9();
-  vp9->inter_pic_predicted = p_bit ? true : false;
-  vp9->flexible_mode = f_bit ? true : false;
-  vp9->beginning_of_frame = b_bit ? true : false;
-  vp9->end_of_frame = e_bit ? true : false;
-  vp9->ss_data_available = v_bit ? true : false;
-  vp9->spatial_idx = 0;
-
-  // Parse fields that are present.
-  if (i_bit && !ParsePictureId(&parser, vp9)) {
-    LOG(LS_ERROR) << "Failed parsing VP9 picture id.";
-    return false;
-  }
-  if (l_bit && !ParseLayerInfo(&parser, vp9)) {
-    LOG(LS_ERROR) << "Failed parsing VP9 layer info.";
-    return false;
-  }
-  if (p_bit && f_bit && !ParseRefIndices(&parser, vp9)) {
-    LOG(LS_ERROR) << "Failed parsing VP9 ref indices.";
-    return false;
-  }
-  if (v_bit) {
-    if (!ParseSsData(&parser, vp9)) {
-      LOG(LS_ERROR) << "Failed parsing VP9 SS data.";
-      return false;
-    }
-    if (vp9->spatial_layer_resolution_present) {
-      // TODO(asapersson): Add support for spatial layers.
-      parsed_payload->type.Video.width = vp9->width[0];
-      parsed_payload->type.Video.height = vp9->height[0];
-    }
-  }
-  parsed_payload->type.Video.is_first_packet_in_frame =
-      b_bit && (!l_bit || !vp9->inter_layer_predicted);
-
-  uint64_t rem_bits = parser.RemainingBitCount();
-  assert(rem_bits % 8 == 0);
-  parsed_payload->payload_length = rem_bits / 8;
-  if (parsed_payload->payload_length == 0) {
-    LOG(LS_ERROR) << "Failed parsing VP9 payload data.";
-    return false;
-  }
-  parsed_payload->payload =
-      payload + payload_length - parsed_payload->payload_length;
-
-  return true;
-}
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/rtp_format_vp9.h b/modules/rtp_rtcp/source/rtp_format_vp9.h
deleted file mode 100644
index cf911a3..0000000
--- a/modules/rtp_rtcp/source/rtp_format_vp9.h
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- *  Copyright (c) 2015 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.
- */
-
-//
-// This file contains the declaration of the VP9 packetizer class.
-// A packetizer object is created for each encoded video frame. The
-// constructor is called with the payload data and size.
-//
-// After creating the packetizer, the method NextPacket is called
-// repeatedly to get all packets for the frame. The method returns
-// false as long as there are more packets left to fetch.
-//
-
-#ifndef WEBRTC_MODULES_RTP_RTCP_SOURCE_RTP_FORMAT_VP9_H_
-#define WEBRTC_MODULES_RTP_RTCP_SOURCE_RTP_FORMAT_VP9_H_
-
-#include <queue>
-#include <string>
-
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_format.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-class RtpPacketizerVp9 : public RtpPacketizer {
- public:
-  RtpPacketizerVp9(const RTPVideoHeaderVP9& hdr,
-                   size_t max_payload_length,
-                   size_t last_packet_reduction_len);
-
-  virtual ~RtpPacketizerVp9();
-
-  std::string ToString() override;
-
-  // The payload data must be one encoded VP9 layer frame.
-  size_t SetPayloadData(const uint8_t* payload,
-                        size_t payload_size,
-                        const RTPFragmentationHeader* fragmentation) override;
-
-  // Gets the next payload with VP9 payload header.
-  // Write payload and set marker bit of the |packet|.
-  // Returns true on success, false otherwise.
-  bool NextPacket(RtpPacketToSend* packet) override;
-
-  typedef struct {
-    size_t payload_start_pos;
-    size_t size;
-    bool layer_begin;
-    bool layer_end;
-  } PacketInfo;
-  typedef std::queue<PacketInfo> PacketInfoQueue;
-
- private:
-  // Calculates all packet sizes and loads info to packet queue.
-  void GeneratePackets();
-
-  // Writes the payload descriptor header and copies payload to the |buffer|.
-  // |packet_info| determines which part of the payload to write.
-  // |last| indicates if the packet is the last packet in the frame.
-  // Returns true on success, false otherwise.
-  bool WriteHeaderAndPayload(const PacketInfo& packet_info,
-                             RtpPacketToSend* packet,
-                             bool last) const;
-
-  // Writes payload descriptor header to |buffer|.
-  // Returns true on success, false otherwise.
-  bool WriteHeader(const PacketInfo& packet_info,
-                   uint8_t* buffer,
-                   size_t* header_length) const;
-
-  const RTPVideoHeaderVP9 hdr_;
-  const size_t max_payload_length_;  // The max length in bytes of one packet.
-  const uint8_t* payload_;           // The payload data to be packetized.
-  size_t payload_size_;              // The size in bytes of the payload data.
-  const size_t last_packet_reduction_len_;
-  PacketInfoQueue packets_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(RtpPacketizerVp9);
-};
-
-
-class RtpDepacketizerVp9 : public RtpDepacketizer {
- public:
-  virtual ~RtpDepacketizerVp9() {}
-
-  bool Parse(ParsedPayload* parsed_payload,
-             const uint8_t* payload,
-             size_t payload_length) override;
-};
-
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_RTP_RTCP_SOURCE_RTP_FORMAT_VP9_H_
diff --git a/modules/rtp_rtcp/source/rtp_format_vp9_unittest.cc b/modules/rtp_rtcp/source/rtp_format_vp9_unittest.cc
deleted file mode 100644
index 49ded07..0000000
--- a/modules/rtp_rtcp/source/rtp_format_vp9_unittest.cc
+++ /dev/null
@@ -1,811 +0,0 @@
-/*
- *  Copyright (c) 2015 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 <memory>
-#include <vector>
-
-#include "webrtc/modules/rtp_rtcp/source/rtp_format_vp9.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_packet_to_send.h"
-#include "webrtc/test/gmock.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-namespace {
-void VerifyHeader(const RTPVideoHeaderVP9& expected,
-                  const RTPVideoHeaderVP9& actual) {
-  EXPECT_EQ(expected.inter_layer_predicted, actual.inter_layer_predicted);
-  EXPECT_EQ(expected.inter_pic_predicted, actual.inter_pic_predicted);
-  EXPECT_EQ(expected.flexible_mode, actual.flexible_mode);
-  EXPECT_EQ(expected.beginning_of_frame, actual.beginning_of_frame);
-  EXPECT_EQ(expected.end_of_frame, actual.end_of_frame);
-  EXPECT_EQ(expected.ss_data_available, actual.ss_data_available);
-  EXPECT_EQ(expected.picture_id, actual.picture_id);
-  EXPECT_EQ(expected.max_picture_id, actual.max_picture_id);
-  EXPECT_EQ(expected.temporal_idx, actual.temporal_idx);
-  EXPECT_EQ(expected.spatial_idx == kNoSpatialIdx ? 0 : expected.spatial_idx,
-      actual.spatial_idx);
-  EXPECT_EQ(expected.gof_idx, actual.gof_idx);
-  EXPECT_EQ(expected.tl0_pic_idx, actual.tl0_pic_idx);
-  EXPECT_EQ(expected.temporal_up_switch, actual.temporal_up_switch);
-
-  EXPECT_EQ(expected.num_ref_pics, actual.num_ref_pics);
-  for (uint8_t i = 0; i < expected.num_ref_pics; ++i) {
-    EXPECT_EQ(expected.pid_diff[i], actual.pid_diff[i]);
-    EXPECT_EQ(expected.ref_picture_id[i], actual.ref_picture_id[i]);
-  }
-  if (expected.ss_data_available) {
-    EXPECT_EQ(expected.spatial_layer_resolution_present,
-              actual.spatial_layer_resolution_present);
-    EXPECT_EQ(expected.num_spatial_layers, actual.num_spatial_layers);
-    if (expected.spatial_layer_resolution_present) {
-      for (size_t i = 0; i < expected.num_spatial_layers; i++) {
-        EXPECT_EQ(expected.width[i], actual.width[i]);
-        EXPECT_EQ(expected.height[i], actual.height[i]);
-      }
-    }
-    EXPECT_EQ(expected.gof.num_frames_in_gof, actual.gof.num_frames_in_gof);
-    for (size_t i = 0; i < expected.gof.num_frames_in_gof; i++) {
-      EXPECT_EQ(expected.gof.temporal_up_switch[i],
-                actual.gof.temporal_up_switch[i]);
-      EXPECT_EQ(expected.gof.temporal_idx[i], actual.gof.temporal_idx[i]);
-      EXPECT_EQ(expected.gof.num_ref_pics[i], actual.gof.num_ref_pics[i]);
-      for (uint8_t j = 0; j < expected.gof.num_ref_pics[i]; j++) {
-        EXPECT_EQ(expected.gof.pid_diff[i][j], actual.gof.pid_diff[i][j]);
-      }
-    }
-  }
-}
-
-void VerifyPayload(const RtpDepacketizer::ParsedPayload& parsed,
-                   const uint8_t* payload,
-                   size_t payload_length) {
-  EXPECT_EQ(payload, parsed.payload);
-  EXPECT_EQ(payload_length, parsed.payload_length);
-  EXPECT_THAT(std::vector<uint8_t>(parsed.payload,
-                                   parsed.payload + parsed.payload_length),
-              ::testing::ElementsAreArray(payload, payload_length));
-}
-
-void ParseAndCheckPacket(const uint8_t* packet,
-                         const RTPVideoHeaderVP9& expected,
-                         size_t expected_hdr_length,
-                         size_t expected_length) {
-  std::unique_ptr<RtpDepacketizer> depacketizer(new RtpDepacketizerVp9());
-  RtpDepacketizer::ParsedPayload parsed;
-  ASSERT_TRUE(depacketizer->Parse(&parsed, packet, expected_length));
-  EXPECT_EQ(kRtpVideoVp9, parsed.type.Video.codec);
-  VerifyHeader(expected, parsed.type.Video.codecHeader.VP9);
-  const size_t kExpectedPayloadLength = expected_length - expected_hdr_length;
-  VerifyPayload(parsed, packet + expected_hdr_length, kExpectedPayloadLength);
-}
-}  // namespace
-
-// Payload descriptor for flexible mode
-//        0 1 2 3 4 5 6 7
-//        +-+-+-+-+-+-+-+-+
-//        |I|P|L|F|B|E|V|-| (REQUIRED)
-//        +-+-+-+-+-+-+-+-+
-//   I:   |M| PICTURE ID  | (RECOMMENDED)
-//        +-+-+-+-+-+-+-+-+
-//   M:   | EXTENDED PID  | (RECOMMENDED)
-//        +-+-+-+-+-+-+-+-+
-//   L:   |  T  |U|  S  |D| (CONDITIONALLY RECOMMENDED)
-//        +-+-+-+-+-+-+-+-+                             -|
-//   P,F: | P_DIFF      |N| (CONDITIONALLY RECOMMENDED)  . up to 3 times
-//        +-+-+-+-+-+-+-+-+                             -|
-//   V:   | SS            |
-//        | ..            |
-//        +-+-+-+-+-+-+-+-+
-//
-// Payload descriptor for non-flexible mode
-//        0 1 2 3 4 5 6 7
-//        +-+-+-+-+-+-+-+-+
-//        |I|P|L|F|B|E|V|-| (REQUIRED)
-//        +-+-+-+-+-+-+-+-+
-//   I:   |M| PICTURE ID  | (RECOMMENDED)
-//        +-+-+-+-+-+-+-+-+
-//   M:   | EXTENDED PID  | (RECOMMENDED)
-//        +-+-+-+-+-+-+-+-+
-//   L:   |  T  |U|  S  |D| (CONDITIONALLY RECOMMENDED)
-//        +-+-+-+-+-+-+-+-+
-//        |   TL0PICIDX   | (CONDITIONALLY REQUIRED)
-//        +-+-+-+-+-+-+-+-+
-//   V:   | SS            |
-//        | ..            |
-//        +-+-+-+-+-+-+-+-+
-
-class RtpPacketizerVp9Test : public ::testing::Test {
- protected:
-  static constexpr RtpPacketToSend::ExtensionManager* kNoExtensions = nullptr;
-  static constexpr size_t kMaxPacketSize = 1200;
-
-  RtpPacketizerVp9Test() : packet_(kNoExtensions, kMaxPacketSize) {}
-  virtual void SetUp() {
-    expected_.InitRTPVideoHeaderVP9();
-  }
-
-  RtpPacketToSend packet_;
-  std::unique_ptr<uint8_t[]> payload_;
-  size_t payload_size_;
-  size_t payload_pos_;
-  RTPVideoHeaderVP9 expected_;
-  std::unique_ptr<RtpPacketizerVp9> packetizer_;
-  size_t num_packets_;
-
-  void Init(size_t payload_size, size_t packet_size) {
-    payload_.reset(new uint8_t[payload_size]);
-    memset(payload_.get(), 7, payload_size);
-    payload_size_ = payload_size;
-    payload_pos_ = 0;
-    packetizer_.reset(new RtpPacketizerVp9(expected_, packet_size,
-                                           /*last_packet_reduction_len=*/0));
-    num_packets_ =
-        packetizer_->SetPayloadData(payload_.get(), payload_size_, nullptr);
-  }
-
-  void CheckPayload(const uint8_t* packet,
-                    size_t start_pos,
-                    size_t end_pos,
-                    bool last) {
-    for (size_t i = start_pos; i < end_pos; ++i) {
-      EXPECT_EQ(packet[i], payload_[payload_pos_++]);
-    }
-    EXPECT_EQ(last, payload_pos_ == payload_size_);
-  }
-
-  void CreateParseAndCheckPackets(const size_t* expected_hdr_sizes,
-                                  const size_t* expected_sizes,
-                                  size_t expected_num_packets) {
-    ASSERT_TRUE(packetizer_.get() != NULL);
-    if (expected_num_packets == 0) {
-      EXPECT_FALSE(packetizer_->NextPacket(&packet_));
-      return;
-    }
-    EXPECT_EQ(expected_num_packets, num_packets_);
-    for (size_t i = 0; i < expected_num_packets; ++i) {
-      EXPECT_TRUE(packetizer_->NextPacket(&packet_));
-      auto rtp_payload = packet_.payload();
-      EXPECT_EQ(expected_sizes[i], rtp_payload.size());
-      RTPVideoHeaderVP9 hdr = expected_;
-      hdr.beginning_of_frame = (i == 0);
-      hdr.end_of_frame = (i + 1) == expected_num_packets;
-      ParseAndCheckPacket(rtp_payload.data(), hdr, expected_hdr_sizes[i],
-                          rtp_payload.size());
-      CheckPayload(rtp_payload.data(), expected_hdr_sizes[i],
-                   rtp_payload.size(), (i + 1) == expected_num_packets);
-      expected_.ss_data_available = false;
-    }
-  }
-};
-
-TEST_F(RtpPacketizerVp9Test, TestEqualSizedMode_OnePacket) {
-  const size_t kFrameSize = 25;
-  const size_t kPacketSize = 26;
-  Init(kFrameSize, kPacketSize);
-
-  // One packet:
-  // I:0, P:0, L:0, F:0, B:1, E:1, V:0  (1hdr + 25 payload)
-  const size_t kExpectedHdrSizes[] = {1};
-  const size_t kExpectedSizes[] = {26};
-  const size_t kExpectedNum = GTEST_ARRAY_SIZE_(kExpectedSizes);
-  CreateParseAndCheckPackets(kExpectedHdrSizes, kExpectedSizes, kExpectedNum);
-}
-
-TEST_F(RtpPacketizerVp9Test, TestEqualSizedMode_TwoPackets) {
-  const size_t kFrameSize = 27;
-  const size_t kPacketSize = 27;
-  Init(kFrameSize, kPacketSize);
-
-  // Two packets:
-  // I:0, P:0, L:0, F:0, B:1, E:0, V:0  (1hdr + 14 payload)
-  // I:0, P:0, L:0, F:0, B:0, E:1, V:0  (1hdr + 13 payload)
-  const size_t kExpectedHdrSizes[] = {1, 1};
-  const size_t kExpectedSizes[] = {14, 15};
-  const size_t kExpectedNum = GTEST_ARRAY_SIZE_(kExpectedSizes);
-  CreateParseAndCheckPackets(kExpectedHdrSizes, kExpectedSizes, kExpectedNum);
-}
-
-TEST_F(RtpPacketizerVp9Test, TestTooShortBufferToFitPayload) {
-  const size_t kFrameSize = 1;
-  const size_t kPacketSize = 1;
-  Init(kFrameSize, kPacketSize);  // 1hdr + 1 payload
-
-  const size_t kExpectedNum = 0;
-  CreateParseAndCheckPackets(NULL, NULL, kExpectedNum);
-}
-
-TEST_F(RtpPacketizerVp9Test, TestOneBytePictureId) {
-  const size_t kFrameSize = 30;
-  const size_t kPacketSize = 12;
-
-  expected_.picture_id = kMaxOneBytePictureId;   // 2 byte payload descriptor
-  expected_.max_picture_id = kMaxOneBytePictureId;
-  Init(kFrameSize, kPacketSize);
-
-  // Three packets:
-  // I:1, P:0, L:0, F:0, B:1, E:0, V:0 (2hdr + 10 payload)
-  // I:1, P:0, L:0, F:0, B:0, E:0, V:0 (2hdr + 10 payload)
-  // I:1, P:0, L:0, F:0, B:0, E:1, V:0 (2hdr + 10 payload)
-  const size_t kExpectedHdrSizes[] = {2, 2, 2};
-  const size_t kExpectedSizes[] = {12, 12, 12};
-  const size_t kExpectedNum = GTEST_ARRAY_SIZE_(kExpectedSizes);
-  CreateParseAndCheckPackets(kExpectedHdrSizes, kExpectedSizes, kExpectedNum);
-}
-
-TEST_F(RtpPacketizerVp9Test, TestTwoBytePictureId) {
-  const size_t kFrameSize = 31;
-  const size_t kPacketSize = 13;
-
-  expected_.picture_id = kMaxTwoBytePictureId;  // 3 byte payload descriptor
-  Init(kFrameSize, kPacketSize);
-
-  // Four packets:
-  // I:1, P:0, L:0, F:0, B:1, E:0, V:0 (3hdr + 8 payload)
-  // I:1, P:0, L:0, F:0, B:0, E:0, V:0 (3hdr + 8 payload)
-  // I:1, P:0, L:0, F:0, B:0, E:0, V:0 (3hdr + 8 payload)
-  // I:1, P:0, L:0, F:0, B:0, E:1, V:0 (3hdr + 7 payload)
-  const size_t kExpectedHdrSizes[] = {3, 3, 3, 3};
-  const size_t kExpectedSizes[] = {10, 11, 11, 11};
-  const size_t kExpectedNum = GTEST_ARRAY_SIZE_(kExpectedSizes);
-  CreateParseAndCheckPackets(kExpectedHdrSizes, kExpectedSizes, kExpectedNum);
-}
-
-TEST_F(RtpPacketizerVp9Test, TestLayerInfoWithNonFlexibleMode) {
-  const size_t kFrameSize = 30;
-  const size_t kPacketSize = 25;
-
-  expected_.temporal_idx = 3;
-  expected_.temporal_up_switch = true;  // U
-  expected_.num_spatial_layers = 3;
-  expected_.spatial_idx = 2;
-  expected_.inter_layer_predicted = true;  // D
-  expected_.tl0_pic_idx = 117;
-  Init(kFrameSize, kPacketSize);
-
-  // Two packets:
-  //    | I:0, P:0, L:1, F:0, B:1, E:0, V:0 | (3hdr + 15 payload)
-  // L: | T:3, U:1, S:2, D:1 | TL0PICIDX:117 |
-  //    | I:0, P:0, L:1, F:0, B:0, E:1, V:0 | (3hdr + 15 payload)
-  // L: | T:3, U:1, S:2, D:1 | TL0PICIDX:117 |
-  const size_t kExpectedHdrSizes[] = {3, 3};
-  const size_t kExpectedSizes[] = {18, 18};
-  const size_t kExpectedNum = GTEST_ARRAY_SIZE_(kExpectedSizes);
-  CreateParseAndCheckPackets(kExpectedHdrSizes, kExpectedSizes, kExpectedNum);
-}
-
-TEST_F(RtpPacketizerVp9Test, TestLayerInfoWithFlexibleMode) {
-  const size_t kFrameSize = 21;
-  const size_t kPacketSize = 23;
-
-  expected_.flexible_mode = true;
-  expected_.temporal_idx = 3;
-  expected_.temporal_up_switch = true;  // U
-  expected_.num_spatial_layers = 3;
-  expected_.spatial_idx = 2;
-  expected_.inter_layer_predicted = false;  // D
-  Init(kFrameSize, kPacketSize);
-
-  // One packet:
-  // I:0, P:0, L:1, F:1, B:1, E:1, V:0 (2hdr + 21 payload)
-  // L:   T:3, U:1, S:2, D:0
-  const size_t kExpectedHdrSizes[] = {2};
-  const size_t kExpectedSizes[] = {23};
-  const size_t kExpectedNum = GTEST_ARRAY_SIZE_(kExpectedSizes);
-  CreateParseAndCheckPackets(kExpectedHdrSizes, kExpectedSizes, kExpectedNum);
-}
-
-TEST_F(RtpPacketizerVp9Test, TestRefIdx) {
-  const size_t kFrameSize = 16;
-  const size_t kPacketSize = 21;
-
-  expected_.inter_pic_predicted = true;  // P
-  expected_.flexible_mode = true;        // F
-  expected_.picture_id = 2;
-  expected_.max_picture_id = kMaxOneBytePictureId;
-
-  expected_.num_ref_pics = 3;
-  expected_.pid_diff[0] = 1;
-  expected_.pid_diff[1] = 3;
-  expected_.pid_diff[2] = 127;
-  expected_.ref_picture_id[0] = 1;    // 2 - 1 = 1
-  expected_.ref_picture_id[1] = 127;  // (kMaxPictureId + 1) + 2 - 3 = 127
-  expected_.ref_picture_id[2] = 3;    // (kMaxPictureId + 1) + 2 - 127 = 3
-  Init(kFrameSize, kPacketSize);
-
-  // Two packets:
-  // I:1, P:1, L:0, F:1, B:1, E:1, V:0 (5hdr + 16 payload)
-  // I:   2
-  // P,F: P_DIFF:1,   N:1
-  //      P_DIFF:3,   N:1
-  //      P_DIFF:127, N:0
-  const size_t kExpectedHdrSizes[] = {5};
-  const size_t kExpectedSizes[] = {21};
-  const size_t kExpectedNum = GTEST_ARRAY_SIZE_(kExpectedSizes);
-  CreateParseAndCheckPackets(kExpectedHdrSizes, kExpectedSizes, kExpectedNum);
-}
-
-TEST_F(RtpPacketizerVp9Test, TestRefIdxFailsWithoutPictureId) {
-  const size_t kFrameSize = 16;
-  const size_t kPacketSize = 21;
-
-  expected_.inter_pic_predicted = true;
-  expected_.flexible_mode = true;
-  expected_.num_ref_pics = 1;
-  expected_.pid_diff[0] = 3;
-  Init(kFrameSize, kPacketSize);
-
-  const size_t kExpectedNum = 0;
-  CreateParseAndCheckPackets(NULL, NULL, kExpectedNum);
-}
-
-TEST_F(RtpPacketizerVp9Test, TestSsDataWithoutSpatialResolutionPresent) {
-  const size_t kFrameSize = 21;
-  const size_t kPacketSize = 26;
-
-  expected_.ss_data_available = true;
-  expected_.num_spatial_layers = 1;
-  expected_.spatial_layer_resolution_present = false;
-  expected_.gof.num_frames_in_gof = 1;
-  expected_.gof.temporal_idx[0] = 0;
-  expected_.gof.temporal_up_switch[0] = true;
-  expected_.gof.num_ref_pics[0] = 1;
-  expected_.gof.pid_diff[0][0] = 4;
-  Init(kFrameSize, kPacketSize);
-
-  // One packet:
-  // I:0, P:0, L:0, F:0, B:1, E:1, V:1 (5hdr + 21 payload)
-  // N_S:0, Y:0, G:1
-  // N_G:1
-  // T:0, U:1, R:1 | P_DIFF[0][0]:4
-  const size_t kExpectedHdrSizes[] = {5};
-  const size_t kExpectedSizes[] = {26};
-  const size_t kExpectedNum = GTEST_ARRAY_SIZE_(kExpectedSizes);
-  CreateParseAndCheckPackets(kExpectedHdrSizes, kExpectedSizes, kExpectedNum);
-}
-
-TEST_F(RtpPacketizerVp9Test, TestSsDataWithoutGbitPresent) {
-  const size_t kFrameSize = 21;
-  const size_t kPacketSize = 23;
-
-  expected_.ss_data_available = true;
-  expected_.num_spatial_layers = 1;
-  expected_.spatial_layer_resolution_present = false;
-  expected_.gof.num_frames_in_gof = 0;
-  Init(kFrameSize, kPacketSize);
-
-  // One packet:
-  // I:0, P:0, L:0, F:0, B:1, E:1, V:1 (2hdr + 21 payload)
-  // N_S:0, Y:0, G:0
-  const size_t kExpectedHdrSizes[] = {2};
-  const size_t kExpectedSizes[] = {23};
-  const size_t kExpectedNum = GTEST_ARRAY_SIZE_(kExpectedSizes);
-  CreateParseAndCheckPackets(kExpectedHdrSizes, kExpectedSizes, kExpectedNum);
-}
-
-TEST_F(RtpPacketizerVp9Test, TestSsData) {
-  const size_t kFrameSize = 21;
-  const size_t kPacketSize = 40;
-
-  expected_.ss_data_available = true;
-  expected_.num_spatial_layers = 2;
-  expected_.spatial_layer_resolution_present = true;
-  expected_.width[0] = 640;
-  expected_.width[1] = 1280;
-  expected_.height[0] = 360;
-  expected_.height[1] = 720;
-  expected_.gof.num_frames_in_gof = 3;
-  expected_.gof.temporal_idx[0] = 0;
-  expected_.gof.temporal_idx[1] = 1;
-  expected_.gof.temporal_idx[2] = 2;
-  expected_.gof.temporal_up_switch[0] = true;
-  expected_.gof.temporal_up_switch[1] = true;
-  expected_.gof.temporal_up_switch[2] = false;
-  expected_.gof.num_ref_pics[0] = 0;
-  expected_.gof.num_ref_pics[1] = 3;
-  expected_.gof.num_ref_pics[2] = 2;
-  expected_.gof.pid_diff[1][0] = 5;
-  expected_.gof.pid_diff[1][1] = 6;
-  expected_.gof.pid_diff[1][2] = 7;
-  expected_.gof.pid_diff[2][0] = 8;
-  expected_.gof.pid_diff[2][1] = 9;
-  Init(kFrameSize, kPacketSize);
-
-  // One packet:
-  // I:0, P:0, L:0, F:0, B:1, E:1, V:1 (19hdr + 21 payload)
-  // N_S:1, Y:1, G:1
-  // WIDTH:640   // 2 bytes
-  // HEIGHT:360  // 2 bytes
-  // WIDTH:1280  // 2 bytes
-  // HEIGHT:720  // 2 bytes
-  // N_G:3
-  // T:0, U:1, R:0
-  // T:1, U:1, R:3 | P_DIFF[1][0]:5 | P_DIFF[1][1]:6 | P_DIFF[1][2]:7
-  // T:2, U:0, R:2 | P_DIFF[2][0]:8 | P_DIFF[2][0]:9
-  const size_t kExpectedHdrSizes[] = {19};
-  const size_t kExpectedSizes[] = {40};
-  const size_t kExpectedNum = GTEST_ARRAY_SIZE_(kExpectedSizes);
-  CreateParseAndCheckPackets(kExpectedHdrSizes, kExpectedSizes, kExpectedNum);
-}
-
-TEST_F(RtpPacketizerVp9Test, TestSsDataDoesNotFitInAveragePacket) {
-  const size_t kFrameSize = 24;
-  const size_t kPacketSize = 20;
-
-  expected_.ss_data_available = true;
-  expected_.num_spatial_layers = 2;
-  expected_.spatial_layer_resolution_present = true;
-  expected_.width[0] = 640;
-  expected_.width[1] = 1280;
-  expected_.height[0] = 360;
-  expected_.height[1] = 720;
-  expected_.gof.num_frames_in_gof = 3;
-  expected_.gof.temporal_idx[0] = 0;
-  expected_.gof.temporal_idx[1] = 1;
-  expected_.gof.temporal_idx[2] = 2;
-  expected_.gof.temporal_up_switch[0] = true;
-  expected_.gof.temporal_up_switch[1] = true;
-  expected_.gof.temporal_up_switch[2] = false;
-  expected_.gof.num_ref_pics[0] = 0;
-  expected_.gof.num_ref_pics[1] = 3;
-  expected_.gof.num_ref_pics[2] = 2;
-  expected_.gof.pid_diff[1][0] = 5;
-  expected_.gof.pid_diff[1][1] = 6;
-  expected_.gof.pid_diff[1][2] = 7;
-  expected_.gof.pid_diff[2][0] = 8;
-  expected_.gof.pid_diff[2][1] = 9;
-  Init(kFrameSize, kPacketSize);
-
-  // Three packets:
-  // I:0, P:0, L:0, F:0, B:1, E:1, V:1 (19hdr + 1 payload)
-  // N_S:1, Y:1, G:1
-  // WIDTH:640   // 2 bytes
-  // HEIGHT:360  // 2 bytes
-  // WIDTH:1280  // 2 bytes
-  // HEIGHT:720  // 2 bytes
-  // N_G:3
-  // T:0, U:1, R:0
-  // T:1, U:1, R:3 | P_DIFF[1][0]:5 | P_DIFF[1][1]:6 | P_DIFF[1][2]:7
-  // T:2, U:0, R:2 | P_DIFF[2][0]:8 | P_DIFF[2][0]:9
-  // Last two packets 1 bytes vp9 hdrs and the rest of payload 14 and 9 bytes.
-  const size_t kExpectedHdrSizes[] = {19, 1, 1};
-  const size_t kExpectedSizes[] = {20, 15, 10};
-  const size_t kExpectedNum = GTEST_ARRAY_SIZE_(kExpectedSizes);
-  CreateParseAndCheckPackets(kExpectedHdrSizes, kExpectedSizes, kExpectedNum);
-}
-
-TEST_F(RtpPacketizerVp9Test, TestOnlyHighestSpatialLayerSetMarker) {
-  const size_t kFrameSize = 10;
-  const size_t kPacketSize = 8;
-  const size_t kLastPacketReductionLen = 0;
-  const uint8_t kFrame[kFrameSize] = {7};
-  const RTPFragmentationHeader* kNoFragmentation = nullptr;
-
-  RTPVideoHeaderVP9 vp9_header;
-  vp9_header.InitRTPVideoHeaderVP9();
-  vp9_header.flexible_mode = true;
-  vp9_header.num_spatial_layers = 3;
-
-  RtpPacketToSend packet(kNoExtensions);
-
-  vp9_header.spatial_idx = 0;
-  RtpPacketizerVp9 packetizer0(vp9_header, kPacketSize,
-                               kLastPacketReductionLen);
-  packetizer0.SetPayloadData(kFrame, sizeof(kFrame), kNoFragmentation);
-  ASSERT_TRUE(packetizer0.NextPacket(&packet));
-  EXPECT_FALSE(packet.Marker());
-  ASSERT_TRUE(packetizer0.NextPacket(&packet));
-  EXPECT_FALSE(packet.Marker());
-
-  vp9_header.spatial_idx = 1;
-  RtpPacketizerVp9 packetizer1(vp9_header, kPacketSize,
-                               kLastPacketReductionLen);
-  packetizer1.SetPayloadData(kFrame, sizeof(kFrame), kNoFragmentation);
-  ASSERT_TRUE(packetizer1.NextPacket(&packet));
-  EXPECT_FALSE(packet.Marker());
-  ASSERT_TRUE(packetizer1.NextPacket(&packet));
-  EXPECT_FALSE(packet.Marker());
-
-  vp9_header.spatial_idx = 2;
-  RtpPacketizerVp9 packetizer2(vp9_header, kPacketSize,
-                               kLastPacketReductionLen);
-  packetizer2.SetPayloadData(kFrame, sizeof(kFrame), kNoFragmentation);
-  ASSERT_TRUE(packetizer2.NextPacket(&packet));
-  EXPECT_FALSE(packet.Marker());
-  ASSERT_TRUE(packetizer2.NextPacket(&packet));
-  EXPECT_TRUE(packet.Marker());
-}
-
-TEST_F(RtpPacketizerVp9Test, TestGeneratesMinimumNumberOfPackets) {
-  const size_t kFrameSize = 10;
-  const size_t kPacketSize = 8;
-  const size_t kLastPacketReductionLen = 0;
-  // Calculated by hand. One packet can contain
-  // |kPacketSize| - |kVp9MinDiscriptorSize| = 6 bytes of the frame payload,
-  // thus to fit 10 bytes two packets are required.
-  const size_t kMinNumberOfPackets = 2;
-  const uint8_t kFrame[kFrameSize] = {7};
-  const RTPFragmentationHeader* kNoFragmentation = nullptr;
-
-  RTPVideoHeaderVP9 vp9_header;
-  vp9_header.InitRTPVideoHeaderVP9();
-
-  RtpPacketToSend packet(kNoExtensions);
-
-  RtpPacketizerVp9 packetizer(vp9_header, kPacketSize, kLastPacketReductionLen);
-  EXPECT_EQ(kMinNumberOfPackets, packetizer.SetPayloadData(
-                                     kFrame, sizeof(kFrame), kNoFragmentation));
-  ASSERT_TRUE(packetizer.NextPacket(&packet));
-  EXPECT_FALSE(packet.Marker());
-  ASSERT_TRUE(packetizer.NextPacket(&packet));
-  EXPECT_TRUE(packet.Marker());
-}
-
-TEST_F(RtpPacketizerVp9Test, TestRespectsLastPacketReductionLen) {
-  const size_t kFrameSize = 10;
-  const size_t kPacketSize = 8;
-  const size_t kLastPacketReductionLen = 5;
-  // Calculated by hand. VP9 payload descriptor is 2 bytes. Like in the test
-  // above, 1 packet is not enough. 2 packets can contain
-  // 2*(|kPacketSize| - |kVp9MinDiscriptorSize|) - |kLastPacketReductionLen| = 7
-  // But three packets are enough, since they have capacity of 3*(8-2)-5=13
-  // bytes.
-  const size_t kMinNumberOfPackets = 3;
-  const uint8_t kFrame[kFrameSize] = {7};
-  const RTPFragmentationHeader* kNoFragmentation = nullptr;
-
-  RTPVideoHeaderVP9 vp9_header;
-  vp9_header.InitRTPVideoHeaderVP9();
-  vp9_header.flexible_mode = true;
-
-  RtpPacketToSend packet(kNoExtensions);
-
-  RtpPacketizerVp9 packetizer0(vp9_header, kPacketSize,
-                               kLastPacketReductionLen);
-  EXPECT_EQ(
-      packetizer0.SetPayloadData(kFrame, sizeof(kFrame), kNoFragmentation),
-      kMinNumberOfPackets);
-  ASSERT_TRUE(packetizer0.NextPacket(&packet));
-  EXPECT_FALSE(packet.Marker());
-  ASSERT_TRUE(packetizer0.NextPacket(&packet));
-  EXPECT_FALSE(packet.Marker());
-  ASSERT_TRUE(packetizer0.NextPacket(&packet));
-  EXPECT_TRUE(packet.Marker());
-}
-
-class RtpDepacketizerVp9Test : public ::testing::Test {
- protected:
-  RtpDepacketizerVp9Test()
-      : depacketizer_(new RtpDepacketizerVp9()) {}
-
-  virtual void SetUp() {
-    expected_.InitRTPVideoHeaderVP9();
-  }
-
-  RTPVideoHeaderVP9 expected_;
-  std::unique_ptr<RtpDepacketizer> depacketizer_;
-};
-
-TEST_F(RtpDepacketizerVp9Test, ParseBasicHeader) {
-  const uint8_t kHeaderLength = 1;
-  uint8_t packet[4] = {0};
-  packet[0] = 0x0C;  // I:0 P:0 L:0 F:0 B:1 E:1 V:0 R:0
-  expected_.beginning_of_frame = true;
-  expected_.end_of_frame = true;
-  ParseAndCheckPacket(packet, expected_, kHeaderLength, sizeof(packet));
-}
-
-TEST_F(RtpDepacketizerVp9Test, ParseOneBytePictureId) {
-  const uint8_t kHeaderLength = 2;
-  uint8_t packet[10] = {0};
-  packet[0] = 0x80;  // I:1 P:0 L:0 F:0 B:0 E:0 V:0 R:0
-  packet[1] = kMaxOneBytePictureId;
-
-  expected_.picture_id = kMaxOneBytePictureId;
-  expected_.max_picture_id = kMaxOneBytePictureId;
-  ParseAndCheckPacket(packet, expected_, kHeaderLength, sizeof(packet));
-}
-
-TEST_F(RtpDepacketizerVp9Test, ParseTwoBytePictureId) {
-  const uint8_t kHeaderLength = 3;
-  uint8_t packet[10] = {0};
-  packet[0] = 0x80;  // I:1 P:0 L:0 F:0 B:0 E:0 V:0 R:0
-  packet[1] = 0x80 | ((kMaxTwoBytePictureId >> 8) & 0x7F);
-  packet[2] = kMaxTwoBytePictureId & 0xFF;
-
-  expected_.picture_id = kMaxTwoBytePictureId;
-  expected_.max_picture_id = kMaxTwoBytePictureId;
-  ParseAndCheckPacket(packet, expected_, kHeaderLength, sizeof(packet));
-}
-
-TEST_F(RtpDepacketizerVp9Test, ParseLayerInfoWithNonFlexibleMode) {
-  const uint8_t kHeaderLength = 3;
-  const uint8_t kTemporalIdx = 2;
-  const uint8_t kUbit = 1;
-  const uint8_t kSpatialIdx = 1;
-  const uint8_t kDbit = 1;
-  const uint8_t kTl0PicIdx = 17;
-  uint8_t packet[13] = {0};
-  packet[0] = 0x20;  // I:0 P:0 L:1 F:0 B:0 E:0 V:0 R:0
-  packet[1] = (kTemporalIdx << 5) | (kUbit << 4) | (kSpatialIdx << 1) | kDbit;
-  packet[2] = kTl0PicIdx;
-
-  // T:2 U:1 S:1 D:1
-  // TL0PICIDX:17
-  expected_.temporal_idx = kTemporalIdx;
-  expected_.temporal_up_switch = kUbit ? true : false;
-  expected_.spatial_idx = kSpatialIdx;
-  expected_.inter_layer_predicted = kDbit ? true : false;
-  expected_.tl0_pic_idx = kTl0PicIdx;
-  ParseAndCheckPacket(packet, expected_, kHeaderLength, sizeof(packet));
-}
-
-TEST_F(RtpDepacketizerVp9Test, ParseLayerInfoWithFlexibleMode) {
-  const uint8_t kHeaderLength = 2;
-  const uint8_t kTemporalIdx = 2;
-  const uint8_t kUbit = 1;
-  const uint8_t kSpatialIdx = 0;
-  const uint8_t kDbit = 0;
-  uint8_t packet[13] = {0};
-  packet[0] = 0x38;  // I:0 P:0 L:1 F:1 B:1 E:0 V:0 R:0
-  packet[1] = (kTemporalIdx << 5) | (kUbit << 4) | (kSpatialIdx << 1) | kDbit;
-
-  // I:0 P:0 L:1 F:1 B:1 E:0 V:0
-  // L:   T:2 U:1 S:0 D:0
-  expected_.beginning_of_frame = true;
-  expected_.flexible_mode = true;
-  expected_.temporal_idx = kTemporalIdx;
-  expected_.temporal_up_switch = kUbit ? true : false;
-  expected_.spatial_idx = kSpatialIdx;
-  expected_.inter_layer_predicted = kDbit ? true : false;
-  ParseAndCheckPacket(packet, expected_, kHeaderLength, sizeof(packet));
-}
-
-TEST_F(RtpDepacketizerVp9Test, ParseRefIdx) {
-  const uint8_t kHeaderLength = 6;
-  const int16_t kPictureId = 17;
-  const uint8_t kPdiff1 = 17;
-  const uint8_t kPdiff2 = 18;
-  const uint8_t kPdiff3 = 127;
-  uint8_t packet[13] = {0};
-  packet[0] = 0xD8;  // I:1 P:1 L:0 F:1 B:1 E:0 V:0 R:0
-  packet[1] = 0x80 | ((kPictureId >> 8) & 0x7F);  // Two byte pictureID.
-  packet[2] = kPictureId;
-  packet[3] = (kPdiff1 << 1) | 1;  // P_DIFF N:1
-  packet[4] = (kPdiff2 << 1) | 1;  // P_DIFF N:1
-  packet[5] = (kPdiff3 << 1) | 0;  // P_DIFF N:0
-
-  // I:1 P:1 L:0 F:1 B:1 E:0 V:0
-  // I:    PICTURE ID:17
-  // I:
-  // P,F:  P_DIFF:17  N:1 => refPicId = 17 - 17 = 0
-  // P,F:  P_DIFF:18  N:1 => refPicId = (kMaxPictureId + 1) + 17 - 18 = 0x7FFF
-  // P,F:  P_DIFF:127 N:0 => refPicId = (kMaxPictureId + 1) + 17 - 127 = 32658
-  expected_.beginning_of_frame = true;
-  expected_.inter_pic_predicted = true;
-  expected_.flexible_mode = true;
-  expected_.picture_id = kPictureId;
-  expected_.num_ref_pics = 3;
-  expected_.pid_diff[0] = kPdiff1;
-  expected_.pid_diff[1] = kPdiff2;
-  expected_.pid_diff[2] = kPdiff3;
-  expected_.ref_picture_id[0] = 0;
-  expected_.ref_picture_id[1] = 0x7FFF;
-  expected_.ref_picture_id[2] = 32658;
-  ParseAndCheckPacket(packet, expected_, kHeaderLength, sizeof(packet));
-}
-
-TEST_F(RtpDepacketizerVp9Test, ParseRefIdxFailsWithNoPictureId) {
-  const uint8_t kPdiff = 3;
-  uint8_t packet[13] = {0};
-  packet[0] = 0x58;            // I:0 P:1 L:0 F:1 B:1 E:0 V:0 R:0
-  packet[1] = (kPdiff << 1);   // P,F:  P_DIFF:3 N:0
-
-  RtpDepacketizer::ParsedPayload parsed;
-  EXPECT_FALSE(depacketizer_->Parse(&parsed, packet, sizeof(packet)));
-}
-
-TEST_F(RtpDepacketizerVp9Test, ParseRefIdxFailsWithTooManyRefPics) {
-  const uint8_t kPdiff = 3;
-  uint8_t packet[13] = {0};
-  packet[0] = 0xD8;                  // I:1 P:1 L:0 F:1 B:1 E:0 V:0 R:0
-  packet[1] = kMaxOneBytePictureId;  // I:    PICTURE ID:127
-  packet[2] = (kPdiff << 1) | 1;     // P,F:  P_DIFF:3 N:1
-  packet[3] = (kPdiff << 1) | 1;     // P,F:  P_DIFF:3 N:1
-  packet[4] = (kPdiff << 1) | 1;     // P,F:  P_DIFF:3 N:1
-  packet[5] = (kPdiff << 1) | 0;     // P,F:  P_DIFF:3 N:0
-
-  RtpDepacketizer::ParsedPayload parsed;
-  EXPECT_FALSE(depacketizer_->Parse(&parsed, packet, sizeof(packet)));
-}
-
-TEST_F(RtpDepacketizerVp9Test, ParseSsData) {
-  const uint8_t kHeaderLength = 6;
-  const uint8_t kYbit = 0;
-  const size_t kNs = 2;
-  const size_t kNg = 2;
-  uint8_t packet[23] = {0};
-  packet[0] = 0x0A;  // I:0 P:0 L:0 F:0 B:1 E:0 V:1 R:0
-  packet[1] = ((kNs - 1) << 5) | (kYbit << 4) | (1 << 3);  // N_S Y G:1 -
-  packet[2] = kNg;                                         // N_G
-  packet[3] = (0 << 5) | (1 << 4) | (0 << 2) | 0;          // T:0 U:1 R:0 -
-  packet[4] = (2 << 5) | (0 << 4) | (1 << 2) | 0;          // T:2 U:0 R:1 -
-  packet[5] = 33;
-
-  expected_.beginning_of_frame = true;
-  expected_.ss_data_available = true;
-  expected_.num_spatial_layers = kNs;
-  expected_.spatial_layer_resolution_present = kYbit ? true : false;
-  expected_.gof.num_frames_in_gof = kNg;
-  expected_.gof.temporal_idx[0] = 0;
-  expected_.gof.temporal_idx[1] = 2;
-  expected_.gof.temporal_up_switch[0] = true;
-  expected_.gof.temporal_up_switch[1] = false;
-  expected_.gof.num_ref_pics[0] = 0;
-  expected_.gof.num_ref_pics[1] = 1;
-  expected_.gof.pid_diff[1][0] = 33;
-  ParseAndCheckPacket(packet, expected_, kHeaderLength, sizeof(packet));
-}
-
-TEST_F(RtpDepacketizerVp9Test, ParseFirstPacketInKeyFrame) {
-  uint8_t packet[2] = {0};
-  packet[0] = 0x08;  // I:0 P:0 L:0 F:0 B:1 E:0 V:0 R:0
-
-  RtpDepacketizer::ParsedPayload parsed;
-  ASSERT_TRUE(depacketizer_->Parse(&parsed, packet, sizeof(packet)));
-  EXPECT_EQ(kVideoFrameKey, parsed.frame_type);
-  EXPECT_TRUE(parsed.type.Video.is_first_packet_in_frame);
-}
-
-TEST_F(RtpDepacketizerVp9Test, ParseLastPacketInDeltaFrame) {
-  uint8_t packet[2] = {0};
-  packet[0] = 0x44;  // I:0 P:1 L:0 F:0 B:0 E:1 V:0 R:0
-
-  RtpDepacketizer::ParsedPayload parsed;
-  ASSERT_TRUE(depacketizer_->Parse(&parsed, packet, sizeof(packet)));
-  EXPECT_EQ(kVideoFrameDelta, parsed.frame_type);
-  EXPECT_FALSE(parsed.type.Video.is_first_packet_in_frame);
-}
-
-TEST_F(RtpDepacketizerVp9Test, ParseResolution) {
-  const uint16_t kWidth[2] = {640, 1280};
-  const uint16_t kHeight[2] = {360, 720};
-  uint8_t packet[20] = {0};
-  packet[0] = 0x0A;  // I:0 P:0 L:0 F:0 B:1 E:0 V:1 R:0
-  packet[1] = (1 << 5) | (1 << 4) | 0;  // N_S:1 Y:1 G:0
-  packet[2] = kWidth[0] >> 8;
-  packet[3] = kWidth[0] & 0xFF;
-  packet[4] = kHeight[0] >> 8;
-  packet[5] = kHeight[0] & 0xFF;
-  packet[6] = kWidth[1] >> 8;
-  packet[7] = kWidth[1] & 0xFF;
-  packet[8] = kHeight[1] >> 8;
-  packet[9] = kHeight[1] & 0xFF;
-
-  RtpDepacketizer::ParsedPayload parsed;
-  ASSERT_TRUE(depacketizer_->Parse(&parsed, packet, sizeof(packet)));
-  EXPECT_EQ(kWidth[0], parsed.type.Video.width);
-  EXPECT_EQ(kHeight[0], parsed.type.Video.height);
-}
-
-TEST_F(RtpDepacketizerVp9Test, ParseFailsForNoPayloadLength) {
-  uint8_t packet[1] = {0};
-  RtpDepacketizer::ParsedPayload parsed;
-  EXPECT_FALSE(depacketizer_->Parse(&parsed, packet, 0));
-}
-
-TEST_F(RtpDepacketizerVp9Test, ParseFailsForTooShortBufferToFitPayload) {
-  const uint8_t kHeaderLength = 1;
-  uint8_t packet[kHeaderLength] = {0};
-  RtpDepacketizer::ParsedPayload parsed;
-  EXPECT_FALSE(depacketizer_->Parse(&parsed, packet, sizeof(packet)));
-}
-
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/rtp_header_extension_map.cc b/modules/rtp_rtcp/source/rtp_header_extension_map.cc
deleted file mode 100644
index 6cdcc1f..0000000
--- a/modules/rtp_rtcp/source/rtp_header_extension_map.cc
+++ /dev/null
@@ -1,150 +0,0 @@
-/*
- *  Copyright (c) 2012 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/rtp_rtcp/include/rtp_header_extension_map.h"
-
-#include "webrtc/modules/rtp_rtcp/source/rtp_header_extensions.h"
-#include "webrtc/rtc_base/arraysize.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-
-namespace webrtc {
-namespace {
-
-struct ExtensionInfo {
-  RTPExtensionType type;
-  const char* uri;
-};
-
-template <typename Extension>
-constexpr ExtensionInfo CreateExtensionInfo() {
-  return {Extension::kId, Extension::kUri};
-}
-
-constexpr ExtensionInfo kExtensions[] = {
-    CreateExtensionInfo<TransmissionOffset>(),
-    CreateExtensionInfo<AudioLevel>(),
-    CreateExtensionInfo<AbsoluteSendTime>(),
-    CreateExtensionInfo<VideoOrientation>(),
-    CreateExtensionInfo<TransportSequenceNumber>(),
-    CreateExtensionInfo<PlayoutDelayLimits>(),
-    CreateExtensionInfo<VideoContentTypeExtension>(),
-    CreateExtensionInfo<VideoTimingExtension>(),
-    CreateExtensionInfo<RtpStreamId>(),
-    CreateExtensionInfo<RepairedRtpStreamId>(),
-    CreateExtensionInfo<RtpMid>(),
-};
-
-// Because of kRtpExtensionNone, NumberOfExtension is 1 bigger than the actual
-// number of known extensions.
-static_assert(arraysize(kExtensions) ==
-                  static_cast<int>(kRtpExtensionNumberOfExtensions) - 1,
-              "kExtensions expect to list all known extensions");
-
-}  // namespace
-
-constexpr RTPExtensionType RtpHeaderExtensionMap::kInvalidType;
-constexpr int RtpHeaderExtensionMap::kInvalidId;
-constexpr int RtpHeaderExtensionMap::kMinId;
-constexpr int RtpHeaderExtensionMap::kMaxId;
-
-RtpHeaderExtensionMap::RtpHeaderExtensionMap() {
-  for (auto& type : types_)
-    type = kInvalidType;
-  for (auto& id : ids_)
-    id = kInvalidId;
-}
-
-RtpHeaderExtensionMap::RtpHeaderExtensionMap(
-    rtc::ArrayView<const RtpExtension> extensions)
-    : RtpHeaderExtensionMap() {
-  for (const RtpExtension& extension : extensions)
-    RegisterByUri(extension.id, extension.uri);
-}
-
-bool RtpHeaderExtensionMap::RegisterByType(int id, RTPExtensionType type) {
-  for (const ExtensionInfo& extension : kExtensions)
-    if (type == extension.type)
-      return Register(id, extension.type, extension.uri);
-  RTC_NOTREACHED();
-  return false;
-}
-
-bool RtpHeaderExtensionMap::RegisterByUri(int id, const std::string& uri) {
-  for (const ExtensionInfo& extension : kExtensions)
-    if (uri == extension.uri)
-      return Register(id, extension.type, extension.uri);
-  LOG(LS_WARNING) << "Unknown extension uri:'" << uri
-                  << "', id: " << id << '.';
-  return false;
-}
-
-size_t RtpHeaderExtensionMap::GetTotalLengthInBytes(
-    rtc::ArrayView<const RtpExtensionSize> extensions) const {
-  // Header size of the extension block, see RFC3550 Section 5.3.1
-  static constexpr size_t kRtpOneByteHeaderLength = 4;
-  // Header size of each individual extension, see RFC5285 Section 4.2
-  static constexpr size_t kExtensionHeaderLength = 1;
-  size_t values_size = 0;
-  for (const RtpExtensionSize& extension : extensions) {
-    if (IsRegistered(extension.type))
-      values_size += extension.value_size + kExtensionHeaderLength;
-  }
-  if (values_size == 0)
-    return 0;
-  size_t size = kRtpOneByteHeaderLength + values_size;
-  // Round up to the nearest size that is a multiple of 4.
-  // Which is same as round down (size + 3).
-  return size + 3 - (size + 3) % 4;
-}
-
-int32_t RtpHeaderExtensionMap::Deregister(RTPExtensionType type) {
-  if (IsRegistered(type)) {
-    uint8_t id = GetId(type);
-    types_[id] = kInvalidType;
-    ids_[type] = kInvalidId;
-  }
-  return 0;
-}
-
-bool RtpHeaderExtensionMap::Register(int id,
-                                     RTPExtensionType type,
-                                     const char* uri) {
-  RTC_DCHECK_GT(type, kRtpExtensionNone);
-  RTC_DCHECK_LT(type, kRtpExtensionNumberOfExtensions);
-
-  if (id < kMinId || id > kMaxId) {
-    LOG(LS_WARNING) << "Failed to register extension uri:'" << uri
-                    << "' with invalid id:" << id << ".";
-    return false;
-  }
-
-  if (GetType(id) == type) {  // Same type/id pair already registered.
-    LOG(LS_VERBOSE) << "Reregistering extension uri:'" << uri
-                    << "', id:" << id;
-    return true;
-  }
-
-  if (GetType(id) != kInvalidType) {  // |id| used by another extension type.
-    LOG(LS_WARNING) << "Failed to register extension uri:'" << uri
-                    << "', id:" << id
-                    << ". Id already in use by extension type "
-                    << static_cast<int>(GetType(id));
-    return false;
-  }
-  RTC_DCHECK(!IsRegistered(type));
-
-  types_[id] = type;
-  // There is a run-time check above id fits into uint8_t.
-  ids_[type] = static_cast<uint8_t>(id);
-  return true;
-}
-
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/rtp_header_extension_map_unittest.cc b/modules/rtp_rtcp/source/rtp_header_extension_map_unittest.cc
deleted file mode 100644
index e5accb1..0000000
--- a/modules/rtp_rtcp/source/rtp_header_extension_map_unittest.cc
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- *  Copyright (c) 2012 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/rtp_rtcp/include/rtp_header_extension_map.h"
-
-#include <vector>
-
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_header_extensions.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-TEST(RtpHeaderExtensionTest, RegisterByType) {
-  RtpHeaderExtensionMap map;
-  EXPECT_FALSE(map.IsRegistered(TransmissionOffset::kId));
-
-  EXPECT_TRUE(map.RegisterByType(3, TransmissionOffset::kId));
-
-  EXPECT_TRUE(map.IsRegistered(TransmissionOffset::kId));
-  EXPECT_EQ(3, map.GetId(TransmissionOffset::kId));
-  EXPECT_EQ(TransmissionOffset::kId, map.GetType(3));
-}
-
-TEST(RtpHeaderExtensionTest, RegisterByUri) {
-  RtpHeaderExtensionMap map;
-
-  EXPECT_TRUE(map.RegisterByUri(3, TransmissionOffset::kUri));
-
-  EXPECT_TRUE(map.IsRegistered(TransmissionOffset::kId));
-  EXPECT_EQ(3, map.GetId(TransmissionOffset::kId));
-  EXPECT_EQ(TransmissionOffset::kId, map.GetType(3));
-}
-
-TEST(RtpHeaderExtensionTest, RegisterWithTrait) {
-  RtpHeaderExtensionMap map;
-
-  EXPECT_TRUE(map.Register<TransmissionOffset>(3));
-
-  EXPECT_TRUE(map.IsRegistered(TransmissionOffset::kId));
-  EXPECT_EQ(3, map.GetId(TransmissionOffset::kId));
-  EXPECT_EQ(TransmissionOffset::kId, map.GetType(3));
-}
-
-TEST(RtpHeaderExtensionTest, RegisterDuringContruction) {
-  const std::vector<RtpExtension> config = {{TransmissionOffset::kUri, 1},
-                                            {AbsoluteSendTime::kUri, 3}};
-  const RtpHeaderExtensionMap map(config);
-
-  EXPECT_EQ(1, map.GetId(TransmissionOffset::kId));
-  EXPECT_EQ(3, map.GetId(AbsoluteSendTime::kId));
-}
-
-TEST(RtpHeaderExtensionTest, RegisterIllegalArg) {
-  RtpHeaderExtensionMap map;
-  // Valid range for id: [1-14].
-  EXPECT_FALSE(map.Register<TransmissionOffset>(0));
-  EXPECT_FALSE(map.Register<TransmissionOffset>(15));
-}
-
-TEST(RtpHeaderExtensionTest, Idempotent) {
-  RtpHeaderExtensionMap map;
-
-  EXPECT_TRUE(map.Register<TransmissionOffset>(3));
-  EXPECT_TRUE(map.Register<TransmissionOffset>(3));
-
-  map.Deregister(TransmissionOffset::kId);
-  map.Deregister(TransmissionOffset::kId);
-}
-
-TEST(RtpHeaderExtensionTest, NonUniqueId) {
-  RtpHeaderExtensionMap map;
-  EXPECT_TRUE(map.Register<TransmissionOffset>(3));
-
-  EXPECT_FALSE(map.Register<AudioLevel>(3));
-  EXPECT_TRUE(map.Register<AudioLevel>(4));
-}
-
-TEST(RtpHeaderExtensionTest, GetTotalLength) {
-  RtpHeaderExtensionMap map;
-  constexpr RtpExtensionSize kExtensionSizes[] = {
-      {TransmissionOffset::kId, TransmissionOffset::kValueSizeBytes}};
-  EXPECT_EQ(0u, map.GetTotalLengthInBytes(kExtensionSizes));
-  EXPECT_TRUE(map.Register<TransmissionOffset>(3));
-  static constexpr size_t kRtpOneByteHeaderLength = 4;
-  EXPECT_EQ(kRtpOneByteHeaderLength + (TransmissionOffset::kValueSizeBytes + 1),
-            map.GetTotalLengthInBytes(kExtensionSizes));
-}
-
-TEST(RtpHeaderExtensionTest, GetType) {
-  RtpHeaderExtensionMap map;
-  EXPECT_EQ(RtpHeaderExtensionMap::kInvalidType, map.GetType(3));
-  EXPECT_TRUE(map.Register<TransmissionOffset>(3));
-
-  EXPECT_EQ(TransmissionOffset::kId, map.GetType(3));
-}
-
-TEST(RtpHeaderExtensionTest, GetId) {
-  RtpHeaderExtensionMap map;
-  EXPECT_EQ(RtpHeaderExtensionMap::kInvalidId,
-            map.GetId(TransmissionOffset::kId));
-  EXPECT_TRUE(map.Register<TransmissionOffset>(3));
-
-  EXPECT_EQ(3, map.GetId(TransmissionOffset::kId));
-}
-
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/rtp_header_extensions.cc b/modules/rtp_rtcp/source/rtp_header_extensions.cc
deleted file mode 100644
index d409d5a..0000000
--- a/modules/rtp_rtcp/source/rtp_header_extensions.cc
+++ /dev/null
@@ -1,383 +0,0 @@
-/*
- *  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/rtp_rtcp/source/rtp_header_extensions.h"
-
-#include "webrtc/modules/rtp_rtcp/include/rtp_cvo.h"
-#include "webrtc/modules/rtp_rtcp/source/byte_io.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-
-namespace webrtc {
-// Absolute send time in RTP streams.
-//
-// The absolute send time is signaled to the receiver in-band using the
-// general mechanism for RTP header extensions [RFC5285]. The payload
-// of this extension (the transmitted value) is a 24-bit unsigned integer
-// containing the sender's current time in seconds as a fixed point number
-// with 18 bits fractional part.
-//
-// The form of the absolute send time extension block:
-//
-//    0                   1                   2                   3
-//    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
-//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//   |  ID   | len=2 |              absolute send time               |
-//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-constexpr RTPExtensionType AbsoluteSendTime::kId;
-constexpr uint8_t AbsoluteSendTime::kValueSizeBytes;
-constexpr const char AbsoluteSendTime::kUri[];
-
-bool AbsoluteSendTime::Parse(rtc::ArrayView<const uint8_t> data,
-                             uint32_t* time_24bits) {
-  if (data.size() != 3)
-    return false;
-  *time_24bits = ByteReader<uint32_t, 3>::ReadBigEndian(data.data());
-  return true;
-}
-
-bool AbsoluteSendTime::Write(uint8_t* data, uint32_t time_24bits) {
-  RTC_DCHECK_LE(time_24bits, 0x00FFFFFF);
-  ByteWriter<uint32_t, 3>::WriteBigEndian(data, time_24bits);
-  return true;
-}
-
-// An RTP Header Extension for Client-to-Mixer Audio Level Indication
-//
-// https://datatracker.ietf.org/doc/draft-lennox-avt-rtp-audio-level-exthdr/
-//
-// The form of the audio level extension block:
-//
-//    0                   1
-//    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
-//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//   |  ID   | len=0 |V|   level     |
-//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//
-constexpr RTPExtensionType AudioLevel::kId;
-constexpr uint8_t AudioLevel::kValueSizeBytes;
-constexpr const char AudioLevel::kUri[];
-
-bool AudioLevel::Parse(rtc::ArrayView<const uint8_t> data,
-                       bool* voice_activity,
-                       uint8_t* audio_level) {
-  if (data.size() != 1)
-    return false;
-  *voice_activity = (data[0] & 0x80) != 0;
-  *audio_level = data[0] & 0x7F;
-  return true;
-}
-
-bool AudioLevel::Write(uint8_t* data,
-                       bool voice_activity,
-                       uint8_t audio_level) {
-  RTC_CHECK_LE(audio_level, 0x7f);
-  data[0] = (voice_activity ? 0x80 : 0x00) | audio_level;
-  return true;
-}
-
-// From RFC 5450: Transmission Time Offsets in RTP Streams.
-//
-// The transmission time is signaled to the receiver in-band using the
-// general mechanism for RTP header extensions [RFC5285]. The payload
-// of this extension (the transmitted value) is a 24-bit signed integer.
-// When added to the RTP timestamp of the packet, it represents the
-// "effective" RTP transmission time of the packet, on the RTP
-// timescale.
-//
-// The form of the transmission offset extension block:
-//
-//    0                   1                   2                   3
-//    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
-//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//   |  ID   | len=2 |              transmission offset              |
-//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-constexpr RTPExtensionType TransmissionOffset::kId;
-constexpr uint8_t TransmissionOffset::kValueSizeBytes;
-constexpr const char TransmissionOffset::kUri[];
-
-bool TransmissionOffset::Parse(rtc::ArrayView<const uint8_t> data,
-                               int32_t* rtp_time) {
-  if (data.size() != 3)
-    return false;
-  *rtp_time = ByteReader<int32_t, 3>::ReadBigEndian(data.data());
-  return true;
-}
-
-bool TransmissionOffset::Write(uint8_t* data, int32_t rtp_time) {
-  RTC_DCHECK_LE(rtp_time, 0x00ffffff);
-  ByteWriter<int32_t, 3>::WriteBigEndian(data, rtp_time);
-  return true;
-}
-
-//   0                   1                   2
-//   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3
-//  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//  |  ID   | L=1   |transport wide sequence number |
-//  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-constexpr RTPExtensionType TransportSequenceNumber::kId;
-constexpr uint8_t TransportSequenceNumber::kValueSizeBytes;
-constexpr const char TransportSequenceNumber::kUri[];
-
-bool TransportSequenceNumber::Parse(rtc::ArrayView<const uint8_t> data,
-                                    uint16_t* value) {
-  if (data.size() != 2)
-    return false;
-  *value = ByteReader<uint16_t>::ReadBigEndian(data.data());
-  return true;
-}
-
-bool TransportSequenceNumber::Write(uint8_t* data, uint16_t value) {
-  ByteWriter<uint16_t>::WriteBigEndian(data, value);
-  return true;
-}
-
-// Coordination of Video Orientation in RTP streams.
-//
-// Coordination of Video Orientation consists in signaling of the current
-// orientation of the image captured on the sender side to the receiver for
-// appropriate rendering and displaying.
-//
-//    0                   1
-//    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
-//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//   |  ID   | len=0 |0 0 0 0 C F R R|
-//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-constexpr RTPExtensionType VideoOrientation::kId;
-constexpr uint8_t VideoOrientation::kValueSizeBytes;
-constexpr const char VideoOrientation::kUri[];
-
-bool VideoOrientation::Parse(rtc::ArrayView<const uint8_t> data,
-                             VideoRotation* rotation) {
-  if (data.size() != 1)
-    return false;
-  *rotation = ConvertCVOByteToVideoRotation(data[0]);
-  return true;
-}
-
-bool VideoOrientation::Write(uint8_t* data, VideoRotation rotation) {
-  data[0] = ConvertVideoRotationToCVOByte(rotation);
-  return true;
-}
-
-bool VideoOrientation::Parse(rtc::ArrayView<const uint8_t> data,
-                             uint8_t* value) {
-  if (data.size() != 1)
-    return false;
-  *value = data[0];
-  return true;
-}
-
-bool VideoOrientation::Write(uint8_t* data, uint8_t value) {
-  data[0] = value;
-  return true;
-}
-
-//   0                   1                   2                   3
-//   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
-//  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//  |  ID   | len=2 |   MIN delay           |   MAX delay           |
-//  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-constexpr RTPExtensionType PlayoutDelayLimits::kId;
-constexpr uint8_t PlayoutDelayLimits::kValueSizeBytes;
-constexpr const char PlayoutDelayLimits::kUri[];
-
-bool PlayoutDelayLimits::Parse(rtc::ArrayView<const uint8_t> data,
-                               PlayoutDelay* playout_delay) {
-  RTC_DCHECK(playout_delay);
-  if (data.size() != 3)
-    return false;
-  uint32_t raw = ByteReader<uint32_t, 3>::ReadBigEndian(data.data());
-  uint16_t min_raw = (raw >> 12);
-  uint16_t max_raw = (raw & 0xfff);
-  if (min_raw > max_raw)
-    return false;
-  playout_delay->min_ms = min_raw * kGranularityMs;
-  playout_delay->max_ms = max_raw * kGranularityMs;
-  return true;
-}
-
-bool PlayoutDelayLimits::Write(uint8_t* data,
-                               const PlayoutDelay& playout_delay) {
-  RTC_DCHECK_LE(0, playout_delay.min_ms);
-  RTC_DCHECK_LE(playout_delay.min_ms, playout_delay.max_ms);
-  RTC_DCHECK_LE(playout_delay.max_ms, kMaxMs);
-  // Convert MS to value to be sent on extension header.
-  uint32_t min_delay = playout_delay.min_ms / kGranularityMs;
-  uint32_t max_delay = playout_delay.max_ms / kGranularityMs;
-  ByteWriter<uint32_t, 3>::WriteBigEndian(data, (min_delay << 12) | max_delay);
-  return true;
-}
-
-// Video Content Type.
-//
-// E.g. default video or screenshare.
-//
-//    0                   1
-//    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
-//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//   |  ID   | len=0 | Content type  |
-//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-constexpr RTPExtensionType VideoContentTypeExtension::kId;
-constexpr uint8_t VideoContentTypeExtension::kValueSizeBytes;
-constexpr const char VideoContentTypeExtension::kUri[];
-
-bool VideoContentTypeExtension::Parse(rtc::ArrayView<const uint8_t> data,
-                                      VideoContentType* content_type) {
-  if (data.size() == 1 &&
-      videocontenttypehelpers::IsValidContentType(data[0])) {
-    *content_type = static_cast<VideoContentType>(data[0]);
-    return true;
-  }
-  return false;
-}
-
-bool VideoContentTypeExtension::Write(uint8_t* data,
-                                      VideoContentType content_type) {
-  data[0] = static_cast<uint8_t>(content_type);
-  return true;
-}
-
-// Video Timing.
-// 6 timestamps in milliseconds counted from capture time stored in rtp header:
-// encode start/finish, packetization complete, pacer exit and reserved for
-// modification by the network modification. |flags| is a bitmask and has the
-// following allowed values:
-// 0 = Valid data, but no flags available (backwards compatibility)
-// 1 = Frame marked as timing frame due to cyclic timer.
-// 2 = Frame marked as timing frame due to size being outside limit.
-// 255 = Invalid. The whole timing frame extension should be ignored.
-//
-//    0                   1                   2                   3
-//    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2
-//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//   |  ID   | len=12|     flags     |     encode start ms delta       |
-//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//   |    encode finish ms delta     |   packetizer finish ms delta    |
-//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//   |     pacer exit ms delta       |   network timestamp ms delta    |
-//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//   |  network2 timestamp ms delta  |
-//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-
-constexpr RTPExtensionType VideoTimingExtension::kId;
-constexpr uint8_t VideoTimingExtension::kValueSizeBytes;
-constexpr const char VideoTimingExtension::kUri[];
-
-bool VideoTimingExtension::Parse(rtc::ArrayView<const uint8_t> data,
-                                 VideoSendTiming* timing) {
-  RTC_DCHECK(timing);
-  // TODO(sprang): Deprecate support for old wire format.
-  ptrdiff_t off = 0;
-  switch (data.size()) {
-    case kValueSizeBytes - 1:
-      timing->flags = 0;
-      off = 1;  // Old wire format without the flags field.
-      break;
-    case kValueSizeBytes:
-      timing->flags = ByteReader<uint8_t>::ReadBigEndian(data.data());
-      break;
-    default:
-      return false;
-  }
-
-  timing->encode_start_delta_ms = ByteReader<uint16_t>::ReadBigEndian(
-      data.data() + VideoSendTiming::kEncodeStartDeltaOffset - off);
-  timing->encode_finish_delta_ms = ByteReader<uint16_t>::ReadBigEndian(
-      data.data() + VideoSendTiming::kEncodeFinishDeltaOffset - off);
-  timing->packetization_finish_delta_ms = ByteReader<uint16_t>::ReadBigEndian(
-      data.data() + VideoSendTiming::kPacketizationFinishDeltaOffset - off);
-  timing->pacer_exit_delta_ms = ByteReader<uint16_t>::ReadBigEndian(
-      data.data() + VideoSendTiming::kPacerExitDeltaOffset - off);
-  timing->network_timstamp_delta_ms = ByteReader<uint16_t>::ReadBigEndian(
-      data.data() + VideoSendTiming::kNetworkTimestampDeltaOffset - off);
-  timing->network2_timstamp_delta_ms = ByteReader<uint16_t>::ReadBigEndian(
-      data.data() + VideoSendTiming::kNetwork2TimestampDeltaOffset - off);
-  return true;
-}
-
-bool VideoTimingExtension::Write(uint8_t* data, const VideoSendTiming& timing) {
-  ByteWriter<uint8_t>::WriteBigEndian(data + VideoSendTiming::kFlagsOffset,
-                                      timing.flags);
-  ByteWriter<uint16_t>::WriteBigEndian(
-      data + VideoSendTiming::kEncodeStartDeltaOffset,
-      timing.encode_start_delta_ms);
-  ByteWriter<uint16_t>::WriteBigEndian(
-      data + VideoSendTiming::kEncodeFinishDeltaOffset,
-      timing.encode_finish_delta_ms);
-  ByteWriter<uint16_t>::WriteBigEndian(
-      data + VideoSendTiming::kPacketizationFinishDeltaOffset,
-      timing.packetization_finish_delta_ms);
-  ByteWriter<uint16_t>::WriteBigEndian(
-      data + VideoSendTiming::kPacerExitDeltaOffset,
-      timing.pacer_exit_delta_ms);
-  ByteWriter<uint16_t>::WriteBigEndian(
-      data + VideoSendTiming::kNetworkTimestampDeltaOffset, 0);  // reserved
-  ByteWriter<uint16_t>::WriteBigEndian(
-      data + VideoSendTiming::kNetwork2TimestampDeltaOffset, 0);  // reserved
-  return true;
-}
-
-bool VideoTimingExtension::Write(uint8_t* data,
-                                 uint16_t time_delta_ms,
-                                 uint8_t offset) {
-  RTC_DCHECK_LT(offset, kValueSizeBytes - sizeof(uint16_t));
-  ByteWriter<uint16_t>::WriteBigEndian(data + offset, time_delta_ms);
-  return true;
-}
-
-bool BaseRtpStringExtension::Parse(rtc::ArrayView<const uint8_t> data,
-                                   StringRtpHeaderExtension* str) {
-  if (data.empty() || data[0] == 0)  // Valid string extension can't be empty.
-    return false;
-  str->Set(data);
-  RTC_DCHECK(!str->empty());
-  return true;
-}
-
-bool BaseRtpStringExtension::Write(uint8_t* data,
-                                   const StringRtpHeaderExtension& str) {
-  RTC_DCHECK_GE(str.size(), 1);
-  RTC_DCHECK_LE(str.size(), StringRtpHeaderExtension::kMaxSize);
-  memcpy(data, str.data(), str.size());
-  return true;
-}
-
-bool BaseRtpStringExtension::Parse(rtc::ArrayView<const uint8_t> data,
-                                   std::string* str) {
-  if (data.empty() || data[0] == 0)  // Valid string extension can't be empty.
-    return false;
-  const char* cstr = reinterpret_cast<const char*>(data.data());
-  // If there is a \0 character in the middle of the |data|, treat it as end
-  // of the string. Well-formed string extensions shouldn't contain it.
-  str->assign(cstr, strnlen(cstr, data.size()));
-  RTC_DCHECK(!str->empty());
-  return true;
-}
-
-bool BaseRtpStringExtension::Write(uint8_t* data, const std::string& str) {
-  RTC_DCHECK_GE(str.size(), 1);
-  RTC_DCHECK_LE(str.size(), StringRtpHeaderExtension::kMaxSize);
-  memcpy(data, str.data(), str.size());
-  return true;
-}
-
-// Constant declarations for string RTP header extension types.
-
-constexpr RTPExtensionType RtpStreamId::kId;
-constexpr const char RtpStreamId::kUri[];
-
-constexpr RTPExtensionType RepairedRtpStreamId::kId;
-constexpr const char RepairedRtpStreamId::kUri[];
-
-constexpr RTPExtensionType RtpMid::kId;
-constexpr const char RtpMid::kUri[];
-
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/rtp_header_extensions.h b/modules/rtp_rtcp/source/rtp_header_extensions.h
deleted file mode 100644
index 866dc28..0000000
--- a/modules/rtp_rtcp/source/rtp_header_extensions.h
+++ /dev/null
@@ -1,186 +0,0 @@
-/*
- *  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_RTP_RTCP_SOURCE_RTP_HEADER_EXTENSIONS_H_
-#define WEBRTC_MODULES_RTP_RTCP_SOURCE_RTP_HEADER_EXTENSIONS_H_
-
-#include <stdint.h>
-#include <string>
-
-#include "webrtc/api/array_view.h"
-#include "webrtc/api/video/video_content_type.h"
-#include "webrtc/api/video/video_rotation.h"
-#include "webrtc/api/video/video_timing.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
-
-namespace webrtc {
-
-class AbsoluteSendTime {
- public:
-  static constexpr RTPExtensionType kId = kRtpExtensionAbsoluteSendTime;
-  static constexpr uint8_t kValueSizeBytes = 3;
-  static constexpr const char kUri[] =
-      "http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time";
-
-  static bool Parse(rtc::ArrayView<const uint8_t> data, uint32_t* time_24bits);
-  static size_t ValueSize(uint32_t time_24bits) { return kValueSizeBytes; }
-  static bool Write(uint8_t* data, uint32_t time_24bits);
-
-  static constexpr uint32_t MsTo24Bits(int64_t time_ms) {
-    return static_cast<uint32_t>(((time_ms << 18) + 500) / 1000) & 0x00FFFFFF;
-  }
-};
-
-class AudioLevel {
- public:
-  static constexpr RTPExtensionType kId = kRtpExtensionAudioLevel;
-  static constexpr uint8_t kValueSizeBytes = 1;
-  static constexpr const char kUri[] =
-      "urn:ietf:params:rtp-hdrext:ssrc-audio-level";
-
-  static bool Parse(rtc::ArrayView<const uint8_t> data,
-                    bool* voice_activity,
-                    uint8_t* audio_level);
-  static size_t ValueSize(bool voice_activity, uint8_t audio_level) {
-    return kValueSizeBytes;
-  }
-  static bool Write(uint8_t* data, bool voice_activity, uint8_t audio_level);
-};
-
-class TransmissionOffset {
- public:
-  static constexpr RTPExtensionType kId = kRtpExtensionTransmissionTimeOffset;
-  static constexpr uint8_t kValueSizeBytes = 3;
-  static constexpr const char kUri[] = "urn:ietf:params:rtp-hdrext:toffset";
-
-  static bool Parse(rtc::ArrayView<const uint8_t> data, int32_t* rtp_time);
-  static size_t ValueSize(int32_t rtp_time) { return kValueSizeBytes; }
-  static bool Write(uint8_t* data, int32_t rtp_time);
-};
-
-class TransportSequenceNumber {
- public:
-  static constexpr RTPExtensionType kId = kRtpExtensionTransportSequenceNumber;
-  static constexpr uint8_t kValueSizeBytes = 2;
-  static constexpr const char kUri[] =
-      "http://www.ietf.org/id/"
-      "draft-holmer-rmcat-transport-wide-cc-extensions-01";
-  static bool Parse(rtc::ArrayView<const uint8_t> data, uint16_t* value);
-  static size_t ValueSize(uint16_t value) { return kValueSizeBytes; }
-  static bool Write(uint8_t* data, uint16_t value);
-};
-
-class VideoOrientation {
- public:
-  static constexpr RTPExtensionType kId = kRtpExtensionVideoRotation;
-  static constexpr uint8_t kValueSizeBytes = 1;
-  static constexpr const char kUri[] = "urn:3gpp:video-orientation";
-
-  static bool Parse(rtc::ArrayView<const uint8_t> data, VideoRotation* value);
-  static size_t ValueSize(VideoRotation) { return kValueSizeBytes; }
-  static bool Write(uint8_t* data, VideoRotation value);
-  static bool Parse(rtc::ArrayView<const uint8_t> data, uint8_t* value);
-  static size_t ValueSize(uint8_t value) { return kValueSizeBytes; }
-  static bool Write(uint8_t* data, uint8_t value);
-};
-
-class PlayoutDelayLimits {
- public:
-  static constexpr RTPExtensionType kId = kRtpExtensionPlayoutDelay;
-  static constexpr uint8_t kValueSizeBytes = 3;
-  static constexpr const char kUri[] =
-      "http://www.webrtc.org/experiments/rtp-hdrext/playout-delay";
-
-  // Playout delay in milliseconds. A playout delay limit (min or max)
-  // has 12 bits allocated. This allows a range of 0-4095 values which
-  // translates to a range of 0-40950 in milliseconds.
-  static constexpr int kGranularityMs = 10;
-  // Maximum playout delay value in milliseconds.
-  static constexpr int kMaxMs = 0xfff * kGranularityMs;  // 40950.
-
-  static bool Parse(rtc::ArrayView<const uint8_t> data,
-                    PlayoutDelay* playout_delay);
-  static size_t ValueSize(const PlayoutDelay&) {
-    return kValueSizeBytes;
-  }
-  static bool Write(uint8_t* data, const PlayoutDelay& playout_delay);
-};
-
-class VideoContentTypeExtension {
- public:
-  static constexpr RTPExtensionType kId = kRtpExtensionVideoContentType;
-  static constexpr uint8_t kValueSizeBytes = 1;
-  static constexpr const char kUri[] =
-      "http://www.webrtc.org/experiments/rtp-hdrext/video-content-type";
-
-  static bool Parse(rtc::ArrayView<const uint8_t> data,
-                    VideoContentType* content_type);
-  static size_t ValueSize(VideoContentType) {
-    return kValueSizeBytes;
-  }
-  static bool Write(uint8_t* data, VideoContentType content_type);
-};
-
-class VideoTimingExtension {
- public:
-  static constexpr RTPExtensionType kId = kRtpExtensionVideoTiming;
-  static constexpr uint8_t kValueSizeBytes = 13;
-  static constexpr const char kUri[] =
-      "http://www.webrtc.org/experiments/rtp-hdrext/video-timing";
-
-  static bool Parse(rtc::ArrayView<const uint8_t> data,
-                    VideoSendTiming* timing);
-  static size_t ValueSize(const VideoSendTiming&) { return kValueSizeBytes; }
-  static bool Write(uint8_t* data, const VideoSendTiming& timing);
-
-  static size_t ValueSize(uint16_t time_delta_ms, uint8_t idx) {
-    return kValueSizeBytes;
-  }
-  // Writes only single time delta to position idx.
-  static bool Write(uint8_t* data, uint16_t time_delta_ms, uint8_t idx);
-};
-
-// Base extension class for RTP header extensions which are strings.
-// Subclasses must defined kId and kUri static constexpr members.
-class BaseRtpStringExtension {
- public:
-  static bool Parse(rtc::ArrayView<const uint8_t> data,
-                    StringRtpHeaderExtension* str);
-  static size_t ValueSize(const StringRtpHeaderExtension& str) {
-    return str.size();
-  }
-  static bool Write(uint8_t* data, const StringRtpHeaderExtension& str);
-
-  static bool Parse(rtc::ArrayView<const uint8_t> data, std::string* str);
-  static size_t ValueSize(const std::string& str) { return str.size(); }
-  static bool Write(uint8_t* data, const std::string& str);
-};
-
-class RtpStreamId : public BaseRtpStringExtension {
- public:
-  static constexpr RTPExtensionType kId = kRtpExtensionRtpStreamId;
-  static constexpr const char kUri[] =
-      "urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id";
-};
-
-class RepairedRtpStreamId : public BaseRtpStringExtension {
- public:
-  static constexpr RTPExtensionType kId = kRtpExtensionRepairedRtpStreamId;
-  static constexpr const char kUri[] =
-      "urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id";
-};
-
-class RtpMid : public BaseRtpStringExtension {
- public:
-  static constexpr RTPExtensionType kId = kRtpExtensionMid;
-  static constexpr const char kUri[] = "urn:ietf:params:rtp-hdrext:sdes:mid";
-};
-
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_RTP_RTCP_SOURCE_RTP_HEADER_EXTENSIONS_H_
diff --git a/modules/rtp_rtcp/source/rtp_header_parser.cc b/modules/rtp_rtcp/source/rtp_header_parser.cc
deleted file mode 100644
index b791359..0000000
--- a/modules/rtp_rtcp/source/rtp_header_parser.cc
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- *  Copyright (c) 2013 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/rtp_rtcp/include/rtp_header_parser.h"
-
-#include "webrtc/modules/rtp_rtcp/include/rtp_header_extension_map.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_utility.h"
-#include "webrtc/rtc_base/criticalsection.h"
-
-namespace webrtc {
-
-class RtpHeaderParserImpl : public RtpHeaderParser {
- public:
-  RtpHeaderParserImpl();
-  virtual ~RtpHeaderParserImpl() {}
-
-  bool Parse(const uint8_t* packet,
-             size_t length,
-             RTPHeader* header) const override;
-
-  bool RegisterRtpHeaderExtension(RTPExtensionType type, uint8_t id) override;
-
-  bool DeregisterRtpHeaderExtension(RTPExtensionType type) override;
-
- private:
-  rtc::CriticalSection critical_section_;
-  RtpHeaderExtensionMap rtp_header_extension_map_
-      RTC_GUARDED_BY(critical_section_);
-};
-
-RtpHeaderParser* RtpHeaderParser::Create() {
-  return new RtpHeaderParserImpl;
-}
-
-RtpHeaderParserImpl::RtpHeaderParserImpl() {}
-
-bool RtpHeaderParser::IsRtcp(const uint8_t* packet, size_t length) {
-  RtpUtility::RtpHeaderParser rtp_parser(packet, length);
-  return rtp_parser.RTCP();
-}
-
-bool RtpHeaderParserImpl::Parse(const uint8_t* packet,
-                                size_t length,
-                                RTPHeader* header) const {
-  RtpUtility::RtpHeaderParser rtp_parser(packet, length);
-  memset(header, 0, sizeof(*header));
-
-  RtpHeaderExtensionMap map;
-  {
-    rtc::CritScope cs(&critical_section_);
-    map = rtp_header_extension_map_;
-  }
-
-  const bool valid_rtpheader = rtp_parser.Parse(header, &map);
-  if (!valid_rtpheader) {
-    return false;
-  }
-  return true;
-}
-
-bool RtpHeaderParserImpl::RegisterRtpHeaderExtension(RTPExtensionType type,
-                                                     uint8_t id) {
-  rtc::CritScope cs(&critical_section_);
-  return rtp_header_extension_map_.RegisterByType(id, type);
-}
-
-bool RtpHeaderParserImpl::DeregisterRtpHeaderExtension(RTPExtensionType type) {
-  rtc::CritScope cs(&critical_section_);
-  return rtp_header_extension_map_.Deregister(type) == 0;
-}
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/rtp_packet.cc b/modules/rtp_rtcp/source/rtp_packet.cc
deleted file mode 100644
index ceafca1..0000000
--- a/modules/rtp_rtcp/source/rtp_packet.cc
+++ /dev/null
@@ -1,552 +0,0 @@
-/*
- *  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/rtp_rtcp/source/rtp_packet.h"
-
-#include <cstring>
-#include <utility>
-
-#include "webrtc/common_types.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_header_extension_map.h"
-#include "webrtc/modules/rtp_rtcp/source/byte_io.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/random.h"
-#include "webrtc/rtc_base/safe_conversions.h"
-
-namespace webrtc {
-namespace {
-constexpr size_t kFixedHeaderSize = 12;
-constexpr uint8_t kRtpVersion = 2;
-constexpr uint16_t kOneByteExtensionId = 0xBEDE;
-constexpr size_t kOneByteHeaderSize = 1;
-constexpr size_t kDefaultPacketSize = 1500;
-}  // namespace
-
-constexpr int RtpPacket::kMaxExtensionHeaders;
-constexpr int RtpPacket::kMinExtensionId;
-constexpr int RtpPacket::kMaxExtensionId;
-
-//  0                   1                   2                   3
-//  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
-// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-// |V=2|P|X|  CC   |M|     PT      |       sequence number         |
-// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-// |                           timestamp                           |
-// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-// |           synchronization source (SSRC) identifier            |
-// +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
-// |            Contributing source (CSRC) identifiers             |
-// |                             ....                              |
-// +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
-// |One-byte eXtensions id = 0xbede|       length in 32bits        |
-// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-// |                          Extensions                           |
-// |                             ....                              |
-// +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
-// |                           Payload                             |
-// |             ....              :  padding...                   |
-// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-// |               padding         | Padding size  |
-// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-RtpPacket::RtpPacket() : RtpPacket(nullptr, kDefaultPacketSize) {}
-
-RtpPacket::RtpPacket(const ExtensionManager* extensions)
-    : RtpPacket(extensions, kDefaultPacketSize) {}
-
-RtpPacket::RtpPacket(const RtpPacket&) = default;
-
-RtpPacket::RtpPacket(const ExtensionManager* extensions, size_t capacity)
-    : buffer_(capacity) {
-  RTC_DCHECK_GE(capacity, kFixedHeaderSize);
-  Clear();
-  if (extensions) {
-    IdentifyExtensions(*extensions);
-  } else {
-    for (size_t i = 0; i < kMaxExtensionHeaders; ++i)
-      extension_entries_[i].type = ExtensionManager::kInvalidType;
-  }
-}
-
-RtpPacket::~RtpPacket() {}
-
-void RtpPacket::IdentifyExtensions(const ExtensionManager& extensions) {
-  for (int i = 0; i < kMaxExtensionHeaders; ++i)
-    extension_entries_[i].type = extensions.GetType(i + 1);
-}
-
-bool RtpPacket::Parse(const uint8_t* buffer, size_t buffer_size) {
-  if (!ParseBuffer(buffer, buffer_size)) {
-    Clear();
-    return false;
-  }
-  buffer_.SetData(buffer, buffer_size);
-  RTC_DCHECK_EQ(size(), buffer_size);
-  return true;
-}
-
-bool RtpPacket::Parse(rtc::ArrayView<const uint8_t> packet) {
-  return Parse(packet.data(), packet.size());
-}
-
-bool RtpPacket::Parse(rtc::CopyOnWriteBuffer buffer) {
-  if (!ParseBuffer(buffer.cdata(), buffer.size())) {
-    Clear();
-    return false;
-  }
-  size_t buffer_size = buffer.size();
-  buffer_ = std::move(buffer);
-  RTC_DCHECK_EQ(size(), buffer_size);
-  return true;
-}
-
-bool RtpPacket::Marker() const {
-  RTC_DCHECK_EQ(marker_, (data()[1] & 0x80) != 0);
-  return marker_;
-}
-
-uint8_t RtpPacket::PayloadType() const {
-  RTC_DCHECK_EQ(payload_type_, data()[1] & 0x7f);
-  return payload_type_;
-}
-
-uint16_t RtpPacket::SequenceNumber() const {
-  RTC_DCHECK_EQ(sequence_number_,
-                ByteReader<uint16_t>::ReadBigEndian(data() + 2));
-  return sequence_number_;
-}
-
-uint32_t RtpPacket::Timestamp() const {
-  RTC_DCHECK_EQ(timestamp_, ByteReader<uint32_t>::ReadBigEndian(data() + 4));
-  return timestamp_;
-}
-
-uint32_t RtpPacket::Ssrc() const {
-  RTC_DCHECK_EQ(ssrc_, ByteReader<uint32_t>::ReadBigEndian(data() + 8));
-  return ssrc_;
-}
-
-std::vector<uint32_t> RtpPacket::Csrcs() const {
-  size_t num_csrc = data()[0] & 0x0F;
-  RTC_DCHECK_GE(capacity(), kFixedHeaderSize + num_csrc * 4);
-  std::vector<uint32_t> csrcs(num_csrc);
-  for (size_t i = 0; i < num_csrc; ++i) {
-    csrcs[i] =
-        ByteReader<uint32_t>::ReadBigEndian(&data()[kFixedHeaderSize + i * 4]);
-  }
-  return csrcs;
-}
-
-size_t RtpPacket::headers_size() const {
-  return payload_offset_;
-}
-
-size_t RtpPacket::payload_size() const {
-  return payload_size_;
-}
-
-size_t RtpPacket::padding_size() const {
-  return padding_size_;
-}
-
-rtc::ArrayView<const uint8_t> RtpPacket::payload() const {
-  return rtc::MakeArrayView(data() + payload_offset_, payload_size_);
-}
-
-rtc::CopyOnWriteBuffer RtpPacket::Buffer() const {
-  return buffer_;
-}
-
-size_t RtpPacket::capacity() const {
-  return buffer_.capacity();
-}
-
-size_t RtpPacket::size() const {
-  size_t ret = payload_offset_ + payload_size_ + padding_size_;
-  RTC_DCHECK_EQ(buffer_.size(), ret);
-  return ret;
-}
-
-const uint8_t* RtpPacket::data() const {
-  return buffer_.cdata();
-}
-
-size_t RtpPacket::FreeCapacity() const {
-  return capacity() - size();
-}
-
-size_t RtpPacket::MaxPayloadSize() const {
-  return capacity() - payload_offset_;
-}
-
-void RtpPacket::CopyHeaderFrom(const RtpPacket& packet) {
-  RTC_DCHECK_GE(capacity(), packet.headers_size());
-
-  marker_ = packet.marker_;
-  payload_type_ = packet.payload_type_;
-  sequence_number_ = packet.sequence_number_;
-  timestamp_ = packet.timestamp_;
-  ssrc_ = packet.ssrc_;
-  payload_offset_ = packet.payload_offset_;
-  for (size_t i = 0; i < kMaxExtensionHeaders; ++i) {
-    extension_entries_[i] = packet.extension_entries_[i];
-  }
-  extensions_size_ = packet.extensions_size_;
-  buffer_.SetData(packet.data(), packet.headers_size());
-  // Reset payload and padding.
-  payload_size_ = 0;
-  padding_size_ = 0;
-}
-
-void RtpPacket::SetMarker(bool marker_bit) {
-  marker_ = marker_bit;
-  if (marker_) {
-    WriteAt(1, data()[1] | 0x80);
-  } else {
-    WriteAt(1, data()[1] & 0x7F);
-  }
-}
-
-void RtpPacket::SetPayloadType(uint8_t payload_type) {
-  RTC_DCHECK_LE(payload_type, 0x7Fu);
-  payload_type_ = payload_type;
-  WriteAt(1, (data()[1] & 0x80) | payload_type);
-}
-
-void RtpPacket::SetSequenceNumber(uint16_t seq_no) {
-  sequence_number_ = seq_no;
-  ByteWriter<uint16_t>::WriteBigEndian(WriteAt(2), seq_no);
-}
-
-void RtpPacket::SetTimestamp(uint32_t timestamp) {
-  timestamp_ = timestamp;
-  ByteWriter<uint32_t>::WriteBigEndian(WriteAt(4), timestamp);
-}
-
-void RtpPacket::SetSsrc(uint32_t ssrc) {
-  ssrc_ = ssrc;
-  ByteWriter<uint32_t>::WriteBigEndian(WriteAt(8), ssrc);
-}
-
-void RtpPacket::SetCsrcs(const std::vector<uint32_t>& csrcs) {
-  RTC_DCHECK_EQ(extensions_size_, 0);
-  RTC_DCHECK_EQ(payload_size_, 0);
-  RTC_DCHECK_EQ(padding_size_, 0);
-  RTC_DCHECK_LE(csrcs.size(), 0x0fu);
-  RTC_DCHECK_LE(kFixedHeaderSize + 4 * csrcs.size(), capacity());
-  payload_offset_ = kFixedHeaderSize + 4 * csrcs.size();
-  WriteAt(0, (data()[0] & 0xF0) | rtc::dchecked_cast<uint8_t>(csrcs.size()));
-  size_t offset = kFixedHeaderSize;
-  for (uint32_t csrc : csrcs) {
-    ByteWriter<uint32_t>::WriteBigEndian(WriteAt(offset), csrc);
-    offset += 4;
-  }
-  buffer_.SetSize(payload_offset_);
-}
-
-bool RtpPacket::HasRawExtension(int id) const {
-  if (id == ExtensionManager::kInvalidId)
-    return false;
-  RTC_DCHECK_GE(id, kMinExtensionId);
-  RTC_DCHECK_LE(id, kMaxExtensionId);
-  return extension_entries_[id - 1].offset != 0;
-}
-
-rtc::ArrayView<const uint8_t> RtpPacket::GetRawExtension(int id) const {
-  if (id == ExtensionManager::kInvalidId)
-    return nullptr;
-  RTC_DCHECK_GE(id, kMinExtensionId);
-  RTC_DCHECK_LE(id, kMaxExtensionId);
-  const ExtensionInfo& extension = extension_entries_[id - 1];
-  if (extension.offset == 0)
-    return nullptr;
-  return rtc::MakeArrayView(data() + extension.offset, extension.length);
-}
-
-bool RtpPacket::SetRawExtension(int id, rtc::ArrayView<const uint8_t> data) {
-  auto buffer = AllocateRawExtension(id, data.size());
-  if (buffer.empty())
-    return false;
-  RTC_DCHECK_EQ(buffer.size(), data.size());
-  memcpy(buffer.data(), data.data(), data.size());
-  return true;
-}
-
-rtc::ArrayView<uint8_t> RtpPacket::AllocateRawExtension(int id, size_t length) {
-  if (id == ExtensionManager::kInvalidId)
-    return nullptr;
-  RTC_DCHECK_GE(id, kMinExtensionId);
-  RTC_DCHECK_LE(id, kMaxExtensionId);
-  RTC_DCHECK_GE(length, 1);
-  RTC_DCHECK_LE(length, 16);
-
-  ExtensionInfo* extension_entry = &extension_entries_[id - 1];
-  if (extension_entry->offset != 0) {
-    // Extension already reserved. Check if same length is used.
-    if (extension_entry->length == length)
-      return rtc::MakeArrayView(WriteAt(extension_entry->offset), length);
-
-    LOG(LS_ERROR) << "Length mismatch for extension id " << id << " type "
-                  << static_cast<int>(extension_entry->type) << ": expected "
-                  << static_cast<int>(extension_entry->length) << ". received "
-                  << length;
-    return nullptr;
-  }
-  if (payload_size_ > 0) {
-    LOG(LS_ERROR) << "Can't add new extension id " << id
-                  << " after payload was set.";
-    return nullptr;
-  }
-  if (padding_size_ > 0) {
-    LOG(LS_ERROR) << "Can't add new extension id " << id
-                  << " after padding was set.";
-    return nullptr;
-  }
-
-  size_t num_csrc = data()[0] & 0x0F;
-  size_t extensions_offset = kFixedHeaderSize + (num_csrc * 4) + 4;
-  size_t new_extensions_size = extensions_size_ + kOneByteHeaderSize + length;
-  if (extensions_offset + new_extensions_size > capacity()) {
-    LOG(LS_ERROR)
-        << "Extension cannot be registered: Not enough space left in buffer.";
-    return nullptr;
-  }
-
-  // All checks passed, write down the extension headers.
-  if (extensions_size_ == 0) {
-    RTC_DCHECK_EQ(payload_offset_, kFixedHeaderSize + (num_csrc * 4));
-    WriteAt(0, data()[0] | 0x10);  // Set extension bit.
-    // Profile specific ID always set to OneByteExtensionHeader.
-    ByteWriter<uint16_t>::WriteBigEndian(WriteAt(extensions_offset - 4),
-                                         kOneByteExtensionId);
-  }
-
-  uint8_t one_byte_header = rtc::dchecked_cast<uint8_t>(id) << 4;
-  one_byte_header |= rtc::dchecked_cast<uint8_t>(length - 1);
-  WriteAt(extensions_offset + extensions_size_, one_byte_header);
-
-  extension_entry->offset = rtc::dchecked_cast<uint16_t>(
-      extensions_offset + extensions_size_ + kOneByteHeaderSize);
-  extension_entry->length = rtc::dchecked_cast<uint8_t>(length);
-  extensions_size_ = rtc::dchecked_cast<uint16_t>(new_extensions_size);
-
-  // Update header length field.
-  uint16_t extensions_words = (extensions_size_ + 3) / 4;  // Wrap up to 32bit.
-  ByteWriter<uint16_t>::WriteBigEndian(WriteAt(extensions_offset - 2),
-                                       extensions_words);
-  // Fill extension padding place with zeroes.
-  size_t extension_padding_size = 4 * extensions_words - extensions_size_;
-  memset(WriteAt(extensions_offset + extensions_size_), 0,
-         extension_padding_size);
-  payload_offset_ = extensions_offset + 4 * extensions_words;
-  buffer_.SetSize(payload_offset_);
-  return rtc::MakeArrayView(WriteAt(extension_entry->offset), length);
-}
-
-uint8_t* RtpPacket::AllocatePayload(size_t size_bytes) {
-  // Reset payload size to 0. If CopyOnWrite buffer_ was shared, this will cause
-  // reallocation and memcpy. Keeping just header reduces memcpy size.
-  SetPayloadSize(0);
-  return SetPayloadSize(size_bytes);
-}
-
-uint8_t* RtpPacket::SetPayloadSize(size_t size_bytes) {
-  RTC_DCHECK_EQ(padding_size_, 0);
-  if (payload_offset_ + size_bytes > capacity()) {
-    LOG(LS_WARNING) << "Cannot set payload, not enough space in buffer.";
-    return nullptr;
-  }
-  payload_size_ = size_bytes;
-  buffer_.SetSize(payload_offset_ + payload_size_);
-  return WriteAt(payload_offset_);
-}
-
-bool RtpPacket::SetPadding(uint8_t size_bytes, Random* random) {
-  RTC_DCHECK(random);
-  if (payload_offset_ + payload_size_ + size_bytes > capacity()) {
-    LOG(LS_WARNING) << "Cannot set padding size " << size_bytes << ", only "
-                    << (capacity() - payload_offset_ - payload_size_)
-                    << " bytes left in buffer.";
-    return false;
-  }
-  padding_size_ = size_bytes;
-  buffer_.SetSize(payload_offset_ + payload_size_ + padding_size_);
-  if (padding_size_ > 0) {
-    size_t padding_offset = payload_offset_ + payload_size_;
-    size_t padding_end = padding_offset + padding_size_;
-    for (size_t offset = padding_offset; offset < padding_end - 1; ++offset) {
-      WriteAt(offset, random->Rand<uint8_t>());
-    }
-    WriteAt(padding_end - 1, padding_size_);
-    WriteAt(0, data()[0] | 0x20);  // Set padding bit.
-  } else {
-    WriteAt(0, data()[0] & ~0x20);  // Clear padding bit.
-  }
-  return true;
-}
-
-void RtpPacket::Clear() {
-  marker_ = false;
-  payload_type_ = 0;
-  sequence_number_ = 0;
-  timestamp_ = 0;
-  ssrc_ = 0;
-  payload_offset_ = kFixedHeaderSize;
-  payload_size_ = 0;
-  padding_size_ = 0;
-  extensions_size_ = 0;
-  for (ExtensionInfo& location : extension_entries_) {
-    location.offset = 0;
-    location.length = 0;
-  }
-
-  memset(WriteAt(0), 0, kFixedHeaderSize);
-  buffer_.SetSize(kFixedHeaderSize);
-  WriteAt(0, kRtpVersion << 6);
-}
-
-bool RtpPacket::ParseBuffer(const uint8_t* buffer, size_t size) {
-  if (size < kFixedHeaderSize) {
-    return false;
-  }
-  const uint8_t version = buffer[0] >> 6;
-  if (version != kRtpVersion) {
-    return false;
-  }
-  const bool has_padding = (buffer[0] & 0x20) != 0;
-  const bool has_extension = (buffer[0] & 0x10) != 0;
-  const uint8_t number_of_crcs = buffer[0] & 0x0f;
-  marker_ = (buffer[1] & 0x80) != 0;
-  payload_type_ = buffer[1] & 0x7f;
-
-  sequence_number_ = ByteReader<uint16_t>::ReadBigEndian(&buffer[2]);
-  timestamp_ = ByteReader<uint32_t>::ReadBigEndian(&buffer[4]);
-  ssrc_ = ByteReader<uint32_t>::ReadBigEndian(&buffer[8]);
-  if (size < kFixedHeaderSize + number_of_crcs * 4) {
-    return false;
-  }
-  payload_offset_ = kFixedHeaderSize + number_of_crcs * 4;
-
-  if (has_padding) {
-    padding_size_ = buffer[size - 1];
-    if (padding_size_ == 0) {
-      LOG(LS_WARNING) << "Padding was set, but padding size is zero";
-      return false;
-    }
-  } else {
-    padding_size_ = 0;
-  }
-
-  extensions_size_ = 0;
-  for (ExtensionInfo& location : extension_entries_) {
-    location.offset = 0;
-    location.length = 0;
-  }
-  if (has_extension) {
-    /* RTP header extension, RFC 3550.
-     0                   1                   2                   3
-     0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
-    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-    |      defined by profile       |           length              |
-    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-    |                        header extension                       |
-    |                             ....                              |
-    */
-    size_t extension_offset = payload_offset_ + 4;
-    if (extension_offset > size) {
-      return false;
-    }
-    uint16_t profile =
-        ByteReader<uint16_t>::ReadBigEndian(&buffer[payload_offset_]);
-    size_t extensions_capacity =
-        ByteReader<uint16_t>::ReadBigEndian(&buffer[payload_offset_ + 2]);
-    extensions_capacity *= 4;
-    if (extension_offset + extensions_capacity > size) {
-      return false;
-    }
-    if (profile != kOneByteExtensionId) {
-      LOG(LS_WARNING) << "Unsupported rtp extension " << profile;
-    } else {
-      constexpr uint8_t kPaddingId = 0;
-      constexpr uint8_t kReservedId = 15;
-      while (extensions_size_ + kOneByteHeaderSize < extensions_capacity) {
-        int id = buffer[extension_offset + extensions_size_] >> 4;
-        if (id == kReservedId) {
-          break;
-        } else if (id == kPaddingId) {
-          extensions_size_++;
-          continue;
-        }
-        uint8_t length =
-            1 + (buffer[extension_offset + extensions_size_] & 0xf);
-        if (extensions_size_ + kOneByteHeaderSize + length >
-            extensions_capacity) {
-          LOG(LS_WARNING) << "Oversized rtp header extension.";
-          break;
-        }
-
-        size_t idx = id - 1;
-        if (extension_entries_[idx].length != 0) {
-          LOG(LS_VERBOSE) << "Duplicate rtp header extension id " << id
-                          << ". Overwriting.";
-        }
-
-        extensions_size_ += kOneByteHeaderSize;
-        extension_entries_[idx].offset =
-            rtc::dchecked_cast<uint16_t>(extension_offset + extensions_size_);
-        extension_entries_[idx].length = rtc::dchecked_cast<uint16_t>(length);
-        extensions_size_ += length;
-      }
-    }
-    payload_offset_ = extension_offset + extensions_capacity;
-  }
-
-  if (payload_offset_ + padding_size_ > size) {
-    return false;
-  }
-  payload_size_ = size - payload_offset_ - padding_size_;
-  return true;
-}
-
-rtc::ArrayView<const uint8_t> RtpPacket::FindExtension(
-    ExtensionType type) const {
-  for (const ExtensionInfo& extension : extension_entries_) {
-    if (extension.type == type) {
-      if (extension.length == 0) {
-        // Extension is registered but not set.
-        return nullptr;
-      }
-      return rtc::MakeArrayView(data() + extension.offset, extension.length);
-    }
-  }
-  return nullptr;
-}
-
-rtc::ArrayView<uint8_t> RtpPacket::AllocateExtension(ExtensionType type,
-                                                     size_t length) {
-  for (int i = 0; i < kMaxExtensionHeaders; ++i) {
-    if (extension_entries_[i].type == type) {
-      int extension_id = i + 1;
-      return AllocateRawExtension(extension_id, length);
-    }
-  }
-  // Extension not registered.
-  return nullptr;
-}
-
-uint8_t* RtpPacket::WriteAt(size_t offset) {
-  return buffer_.data() + offset;
-}
-
-void RtpPacket::WriteAt(size_t offset, uint8_t byte) {
-  buffer_.data()[offset] = byte;
-}
-
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/rtp_packet.h b/modules/rtp_rtcp/source/rtp_packet.h
deleted file mode 100644
index 4d6f2f7..0000000
--- a/modules/rtp_rtcp/source/rtp_packet.h
+++ /dev/null
@@ -1,199 +0,0 @@
-/*
- *  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_RTP_RTCP_SOURCE_RTP_PACKET_H_
-#define WEBRTC_MODULES_RTP_RTCP_SOURCE_RTP_PACKET_H_
-
-#include <vector>
-
-#include "webrtc/api/array_view.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
-#include "webrtc/rtc_base/basictypes.h"
-#include "webrtc/rtc_base/copyonwritebuffer.h"
-
-namespace webrtc {
-class RtpHeaderExtensionMap;
-class Random;
-
-class RtpPacket {
- public:
-  using ExtensionType = RTPExtensionType;
-  using ExtensionManager = RtpHeaderExtensionMap;
-  static constexpr int kMaxExtensionHeaders = 14;
-  static constexpr int kMinExtensionId = 1;
-  static constexpr int kMaxExtensionId = 14;
-
-  // |extensions| required for SetExtension/ReserveExtension functions during
-  // packet creating and used if available in Parse function.
-  // Adding and getting extensions will fail until |extensions| is
-  // provided via constructor or IdentifyExtensions function.
-  RtpPacket();
-  explicit RtpPacket(const ExtensionManager* extensions);
-  RtpPacket(const RtpPacket&);
-  RtpPacket(const ExtensionManager* extensions, size_t capacity);
-  ~RtpPacket();
-
-  RtpPacket& operator=(const RtpPacket&) = default;
-
-  // Parse and copy given buffer into Packet.
-  bool Parse(const uint8_t* buffer, size_t size);
-  bool Parse(rtc::ArrayView<const uint8_t> packet);
-
-  // Parse and move given buffer into Packet.
-  bool Parse(rtc::CopyOnWriteBuffer packet);
-
-  // Maps extensions id to their types.
-  void IdentifyExtensions(const ExtensionManager& extensions);
-
-  // Header.
-  bool Marker() const;
-  uint8_t PayloadType() const;
-  uint16_t SequenceNumber() const;
-  uint32_t Timestamp() const;
-  uint32_t Ssrc() const;
-  std::vector<uint32_t> Csrcs() const;
-
-  size_t headers_size() const;
-
-  // Payload.
-  size_t payload_size() const;
-  size_t padding_size() const;
-  rtc::ArrayView<const uint8_t> payload() const;
-
-  // Buffer.
-  rtc::CopyOnWriteBuffer Buffer() const;
-  size_t capacity() const;
-  size_t size() const;
-  const uint8_t* data() const;
-  size_t FreeCapacity() const;
-  size_t MaxPayloadSize() const;
-
-  // Reset fields and buffer.
-  void Clear();
-
-  // Header setters.
-  void CopyHeaderFrom(const RtpPacket& packet);
-  void SetMarker(bool marker_bit);
-  void SetPayloadType(uint8_t payload_type);
-  void SetSequenceNumber(uint16_t seq_no);
-  void SetTimestamp(uint32_t timestamp);
-  void SetSsrc(uint32_t ssrc);
-
-  // Writes csrc list. Assumes:
-  // a) There is enough room left in buffer.
-  // b) Extension headers, payload or padding data has not already been added.
-  void SetCsrcs(const std::vector<uint32_t>& csrcs);
-
-  // Header extensions.
-  template <typename Extension>
-  bool HasExtension() const;
-
-  template <typename Extension, typename... Values>
-  bool GetExtension(Values...) const;
-
-  template <typename Extension, typename... Values>
-  bool SetExtension(Values...);
-
-  template <typename Extension>
-  bool ReserveExtension();
-
-  // Following 4 helpers identify rtp header extension by |id| negotiated with
-  // remote peer and written in an rtp packet.
-  bool HasRawExtension(int id) const;
-
-  // Returns place where extension with |id| is stored.
-  // Returns empty arrayview if extension is not present.
-  rtc::ArrayView<const uint8_t> GetRawExtension(int id) const;
-
-  // Allocates and store header extension. Returns true on success.
-  bool SetRawExtension(int id, rtc::ArrayView<const uint8_t> data);
-
-  // Allocates and returns place to store rtp header extension.
-  // Returns empty arrayview on failure.
-  rtc::ArrayView<uint8_t> AllocateRawExtension(int id, size_t length);
-
-  // Reserve size_bytes for payload. Returns nullptr on failure.
-  uint8_t* SetPayloadSize(size_t size_bytes);
-  // Same as SetPayloadSize but doesn't guarantee to keep current payload.
-  uint8_t* AllocatePayload(size_t size_bytes);
-  bool SetPadding(uint8_t size_bytes, Random* random);
-
- private:
-  struct ExtensionInfo {
-    ExtensionType type;
-    uint16_t offset;
-    uint8_t length;
-  };
-
-  // Helper function for Parse. Fill header fields using data in given buffer,
-  // but does not touch packet own buffer, leaving packet in invalid state.
-  bool ParseBuffer(const uint8_t* buffer, size_t size);
-
-  // Find an extension |type|.
-  // Returns view of the raw extension or empty view on failure.
-  rtc::ArrayView<const uint8_t> FindExtension(ExtensionType type) const;
-
-  // Find or allocate an extension |type|. Returns view of size |length|
-  // to write raw extension to or an empty view on failure.
-  rtc::ArrayView<uint8_t> AllocateExtension(ExtensionType type, size_t length);
-
-  uint8_t* WriteAt(size_t offset);
-  void WriteAt(size_t offset, uint8_t byte);
-
-  // Header.
-  bool marker_;
-  uint8_t payload_type_;
-  uint8_t padding_size_;
-  uint16_t sequence_number_;
-  uint32_t timestamp_;
-  uint32_t ssrc_;
-  size_t payload_offset_;  // Match header size with csrcs and extensions.
-  size_t payload_size_;
-
-  ExtensionInfo extension_entries_[kMaxExtensionHeaders];
-  uint16_t extensions_size_ = 0;  // Unaligned.
-  rtc::CopyOnWriteBuffer buffer_;
-};
-
-template <typename Extension>
-bool RtpPacket::HasExtension() const {
-  return !FindExtension(Extension::kId).empty();
-}
-
-template <typename Extension, typename... Values>
-bool RtpPacket::GetExtension(Values... values) const {
-  auto raw = FindExtension(Extension::kId);
-  if (raw.empty())
-    return false;
-  return Extension::Parse(raw, values...);
-}
-
-template <typename Extension, typename... Values>
-bool RtpPacket::SetExtension(Values... values) {
-  const size_t value_size = Extension::ValueSize(values...);
-  if (value_size == 0 || value_size > 16)
-    return false;
-  auto buffer = AllocateExtension(Extension::kId, value_size);
-  if (buffer.empty())
-    return false;
-  return Extension::Write(buffer.data(), values...);
-}
-
-template <typename Extension>
-bool RtpPacket::ReserveExtension() {
-  auto buffer = AllocateExtension(Extension::kId, Extension::kValueSizeBytes);
-  if (buffer.empty())
-    return false;
-  memset(buffer.data(), 0, Extension::kValueSizeBytes);
-  return true;
-}
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_RTP_RTCP_SOURCE_RTP_PACKET_H_
diff --git a/modules/rtp_rtcp/source/rtp_packet_history.cc b/modules/rtp_rtcp/source/rtp_packet_history.cc
deleted file mode 100644
index 0dd80cb..0000000
--- a/modules/rtp_rtcp/source/rtp_packet_history.cc
+++ /dev/null
@@ -1,222 +0,0 @@
-/*
- *  Copyright (c) 2012 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/rtp_rtcp/source/rtp_packet_history.h"
-
-#include <algorithm>
-#include <limits>
-#include <utility>
-
-#include "webrtc/modules/rtp_rtcp/source/rtp_packet_to_send.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/system_wrappers/include/clock.h"
-
-namespace webrtc {
-namespace {
-constexpr size_t kMinPacketRequestBytes = 50;
-}  // namespace
-constexpr size_t RtpPacketHistory::kMaxCapacity;
-
-RtpPacketHistory::RtpPacketHistory(Clock* clock)
-    : clock_(clock), store_(false), prev_index_(0) {}
-
-RtpPacketHistory::~RtpPacketHistory() {}
-
-void RtpPacketHistory::SetStorePacketsStatus(bool enable,
-                                             uint16_t number_to_store) {
-  rtc::CritScope cs(&critsect_);
-  if (enable) {
-    if (store_) {
-      LOG(LS_WARNING) << "Purging packet history in order to re-set status.";
-      Free();
-    }
-    RTC_DCHECK(!store_);
-    Allocate(number_to_store);
-  } else {
-    Free();
-  }
-}
-
-void RtpPacketHistory::Allocate(size_t number_to_store) {
-  RTC_DCHECK_GT(number_to_store, 0);
-  RTC_DCHECK_LE(number_to_store, kMaxCapacity);
-  store_ = true;
-  stored_packets_.resize(number_to_store);
-}
-
-void RtpPacketHistory::Free() {
-  if (!store_) {
-    return;
-  }
-
-  stored_packets_.clear();
-
-  store_ = false;
-  prev_index_ = 0;
-}
-
-bool RtpPacketHistory::StorePackets() const {
-  rtc::CritScope cs(&critsect_);
-  return store_;
-}
-
-void RtpPacketHistory::PutRtpPacket(std::unique_ptr<RtpPacketToSend> packet,
-                                    StorageType type,
-                                    bool sent) {
-  RTC_DCHECK(packet);
-  rtc::CritScope cs(&critsect_);
-  if (!store_) {
-    return;
-  }
-
-  // If index we're about to overwrite contains a packet that has not
-  // yet been sent (probably pending in paced sender), we need to expand
-  // the buffer.
-  if (stored_packets_[prev_index_].packet &&
-      stored_packets_[prev_index_].send_time == 0) {
-    size_t current_size = static_cast<uint16_t>(stored_packets_.size());
-    if (current_size < kMaxCapacity) {
-      size_t expanded_size = std::max(current_size * 3 / 2, current_size + 1);
-      expanded_size = std::min(expanded_size, kMaxCapacity);
-      Allocate(expanded_size);
-      // Causes discontinuity, but that's OK-ish. FindSeqNum() will still work,
-      // but may be slower - at least until buffer has wrapped around once.
-      prev_index_ = current_size;
-    }
-  }
-
-  // Store packet.
-  if (packet->capture_time_ms() <= 0)
-    packet->set_capture_time_ms(clock_->TimeInMilliseconds());
-  stored_packets_[prev_index_].sequence_number = packet->SequenceNumber();
-  stored_packets_[prev_index_].send_time =
-      (sent ? clock_->TimeInMilliseconds() : 0);
-  stored_packets_[prev_index_].storage_type = type;
-  stored_packets_[prev_index_].has_been_retransmitted = false;
-  stored_packets_[prev_index_].packet = std::move(packet);
-
-  ++prev_index_;
-  if (prev_index_ >= stored_packets_.size()) {
-    prev_index_ = 0;
-  }
-}
-
-bool RtpPacketHistory::HasRtpPacket(uint16_t sequence_number) const {
-  rtc::CritScope cs(&critsect_);
-  if (!store_) {
-    return false;
-  }
-
-  int unused_index = 0;
-  return FindSeqNum(sequence_number, &unused_index);
-}
-
-std::unique_ptr<RtpPacketToSend> RtpPacketHistory::GetPacketAndSetSendTime(
-    uint16_t sequence_number,
-    int64_t min_elapsed_time_ms,
-    bool retransmit) {
-  rtc::CritScope cs(&critsect_);
-  if (!store_) {
-    return nullptr;
-  }
-
-  int index = 0;
-  if (!FindSeqNum(sequence_number, &index)) {
-    LOG(LS_WARNING) << "No match for getting seqNum " << sequence_number;
-    return nullptr;
-  }
-  RTC_DCHECK_EQ(sequence_number,
-                stored_packets_[index].packet->SequenceNumber());
-
-  // Verify elapsed time since last retrieve, but only for retransmissions and
-  // always send packet upon first retransmission request.
-  int64_t now = clock_->TimeInMilliseconds();
-  if (min_elapsed_time_ms > 0 && retransmit &&
-      stored_packets_[index].has_been_retransmitted &&
-      ((now - stored_packets_[index].send_time) < min_elapsed_time_ms)) {
-    return nullptr;
-  }
-
-  if (retransmit) {
-    if (stored_packets_[index].storage_type == kDontRetransmit) {
-      // No bytes copied since this packet shouldn't be retransmitted.
-      return nullptr;
-    }
-    stored_packets_[index].has_been_retransmitted = true;
-  }
-  stored_packets_[index].send_time = clock_->TimeInMilliseconds();
-  return GetPacket(index);
-}
-
-std::unique_ptr<RtpPacketToSend> RtpPacketHistory::GetPacket(int index) const {
-  const RtpPacketToSend& stored = *stored_packets_[index].packet;
-  return std::unique_ptr<RtpPacketToSend>(new RtpPacketToSend(stored));
-}
-
-std::unique_ptr<RtpPacketToSend> RtpPacketHistory::GetBestFittingPacket(
-    size_t packet_length) const {
-  rtc::CritScope cs(&critsect_);
-  if (!store_)
-    return nullptr;
-  int index = FindBestFittingPacket(packet_length);
-  if (index < 0)
-    return nullptr;
-  return GetPacket(index);
-}
-
-bool RtpPacketHistory::FindSeqNum(uint16_t sequence_number, int* index) const {
-  if (prev_index_ > 0) {
-    *index = prev_index_ - 1;
-  } else {
-    *index = stored_packets_.size() - 1;  // Wrap.
-  }
-  uint16_t temp_sequence_number = stored_packets_[*index].sequence_number;
-
-  int idx = *index - (temp_sequence_number - sequence_number);
-  if (idx >= 0 && idx < static_cast<int>(stored_packets_.size())) {
-    *index = idx;
-    temp_sequence_number = stored_packets_[*index].sequence_number;
-  }
-
-  if (temp_sequence_number != sequence_number) {
-    // We did not found a match, search all.
-    for (uint16_t m = 0; m < stored_packets_.size(); m++) {
-      if (stored_packets_[m].sequence_number == sequence_number) {
-        *index = m;
-        temp_sequence_number = stored_packets_[*index].sequence_number;
-        break;
-      }
-    }
-  }
-  return temp_sequence_number == sequence_number &&
-         stored_packets_[*index].packet;
-}
-
-int RtpPacketHistory::FindBestFittingPacket(size_t size) const {
-  if (size < kMinPacketRequestBytes || stored_packets_.empty())
-    return -1;
-  size_t min_diff = std::numeric_limits<size_t>::max();
-  int best_index = -1;  // Returned unchanged if we don't find anything.
-  for (size_t i = 0; i < stored_packets_.size(); ++i) {
-    if (!stored_packets_[i].packet)
-      continue;
-    size_t stored_size = stored_packets_[i].packet->size();
-    size_t diff =
-        (stored_size > size) ? (stored_size - size) : (size - stored_size);
-    if (diff < min_diff) {
-      min_diff = diff;
-      best_index = static_cast<int>(i);
-    }
-  }
-  return best_index;
-}
-
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/rtp_packet_history.h b/modules/rtp_rtcp/source/rtp_packet_history.h
deleted file mode 100644
index 9b12436..0000000
--- a/modules/rtp_rtcp/source/rtp_packet_history.h
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- *  Copyright (c) 2012 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_RTP_RTCP_SOURCE_RTP_PACKET_HISTORY_H_
-#define WEBRTC_MODULES_RTP_RTCP_SOURCE_RTP_PACKET_HISTORY_H_
-
-#include <memory>
-#include <vector>
-
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/thread_annotations.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-class Clock;
-class RtpPacketToSend;
-
-class RtpPacketHistory {
- public:
-  static constexpr size_t kMaxCapacity = 9600;
-  explicit RtpPacketHistory(Clock* clock);
-  ~RtpPacketHistory();
-
-  void SetStorePacketsStatus(bool enable, uint16_t number_to_store);
-  bool StorePackets() const;
-
-  void PutRtpPacket(std::unique_ptr<RtpPacketToSend> packet,
-                    StorageType type,
-                    bool sent);
-
-  // Gets stored RTP packet corresponding to the input |sequence number|.
-  // Returns nullptr if packet is not found.
-  // |min_elapsed_time_ms| is the minimum time that must have elapsed since
-  // the last time the packet was resent (parameter is ignored if set to zero).
-  // If the packet is found but the minimum time has not elapsed, returns
-  // nullptr.
-  std::unique_ptr<RtpPacketToSend> GetPacketAndSetSendTime(
-      uint16_t sequence_number,
-      int64_t min_elapsed_time_ms,
-      bool retransmit);
-
-  std::unique_ptr<RtpPacketToSend> GetBestFittingPacket(
-      size_t packet_size) const;
-
-  bool HasRtpPacket(uint16_t sequence_number) const;
-
- private:
-  struct StoredPacket {
-    uint16_t sequence_number = 0;
-    int64_t send_time = 0;
-    StorageType storage_type = kDontRetransmit;
-    bool has_been_retransmitted = false;
-
-    std::unique_ptr<RtpPacketToSend> packet;
-  };
-
-  std::unique_ptr<RtpPacketToSend> GetPacket(int index) const
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(critsect_);
-  void Allocate(size_t number_to_store) RTC_EXCLUSIVE_LOCKS_REQUIRED(critsect_);
-  void Free() RTC_EXCLUSIVE_LOCKS_REQUIRED(critsect_);
-  bool FindSeqNum(uint16_t sequence_number, int* index) const
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(critsect_);
-  int FindBestFittingPacket(size_t size) const
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(critsect_);
-
-  Clock* clock_;
-  rtc::CriticalSection critsect_;
-  bool store_ RTC_GUARDED_BY(critsect_);
-  uint32_t prev_index_ RTC_GUARDED_BY(critsect_);
-  std::vector<StoredPacket> stored_packets_ RTC_GUARDED_BY(critsect_);
-
-  RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(RtpPacketHistory);
-};
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_RTP_RTCP_SOURCE_RTP_PACKET_HISTORY_H_
diff --git a/modules/rtp_rtcp/source/rtp_packet_history_unittest.cc b/modules/rtp_rtcp/source/rtp_packet_history_unittest.cc
deleted file mode 100644
index 52ef81a..0000000
--- a/modules/rtp_rtcp/source/rtp_packet_history_unittest.cc
+++ /dev/null
@@ -1,223 +0,0 @@
-/*
- *  Copyright (c) 2012 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/rtp_rtcp/source/rtp_packet_history.h"
-
-#include <memory>
-#include <utility>
-
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_packet_to_send.h"
-#include "webrtc/system_wrappers/include/clock.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-class RtpPacketHistoryTest : public ::testing::Test {
- protected:
-  static constexpr uint16_t kSeqNum = 88;
-
-  RtpPacketHistoryTest() : fake_clock_(123456), hist_(&fake_clock_) {}
-
-  SimulatedClock fake_clock_;
-  RtpPacketHistory hist_;
-
-  std::unique_ptr<RtpPacketToSend> CreateRtpPacket(uint16_t seq_num) {
-    // Payload, ssrc, timestamp and extensions are irrelevant for this tests.
-    std::unique_ptr<RtpPacketToSend> packet(new RtpPacketToSend(nullptr));
-    packet->SetSequenceNumber(seq_num);
-    packet->set_capture_time_ms(fake_clock_.TimeInMilliseconds());
-    return packet;
-  }
-};
-
-TEST_F(RtpPacketHistoryTest, SetStoreStatus) {
-  EXPECT_FALSE(hist_.StorePackets());
-  hist_.SetStorePacketsStatus(true, 10);
-  EXPECT_TRUE(hist_.StorePackets());
-  hist_.SetStorePacketsStatus(false, 0);
-  EXPECT_FALSE(hist_.StorePackets());
-}
-
-TEST_F(RtpPacketHistoryTest, NoStoreStatus) {
-  EXPECT_FALSE(hist_.StorePackets());
-  std::unique_ptr<RtpPacketToSend> packet = CreateRtpPacket(kSeqNum);
-  hist_.PutRtpPacket(std::move(packet), kAllowRetransmission, false);
-  // Packet should not be stored.
-  EXPECT_FALSE(hist_.GetPacketAndSetSendTime(kSeqNum, 0, false));
-}
-
-TEST_F(RtpPacketHistoryTest, GetRtpPacket_NotStored) {
-  hist_.SetStorePacketsStatus(true, 10);
-  EXPECT_FALSE(hist_.GetPacketAndSetSendTime(0, 0, false));
-}
-
-TEST_F(RtpPacketHistoryTest, PutRtpPacket) {
-  hist_.SetStorePacketsStatus(true, 10);
-  std::unique_ptr<RtpPacketToSend> packet = CreateRtpPacket(kSeqNum);
-
-  EXPECT_FALSE(hist_.HasRtpPacket(kSeqNum));
-  hist_.PutRtpPacket(std::move(packet), kAllowRetransmission, false);
-  EXPECT_TRUE(hist_.HasRtpPacket(kSeqNum));
-}
-
-TEST_F(RtpPacketHistoryTest, GetRtpPacket) {
-  hist_.SetStorePacketsStatus(true, 10);
-  int64_t capture_time_ms = 1;
-  std::unique_ptr<RtpPacketToSend> packet = CreateRtpPacket(kSeqNum);
-  packet->set_capture_time_ms(capture_time_ms);
-  rtc::CopyOnWriteBuffer buffer = packet->Buffer();
-  hist_.PutRtpPacket(std::move(packet), kAllowRetransmission, false);
-
-  std::unique_ptr<RtpPacketToSend> packet_out =
-      hist_.GetPacketAndSetSendTime(kSeqNum, 0, false);
-  EXPECT_TRUE(packet_out);
-  EXPECT_EQ(buffer, packet_out->Buffer());
-  EXPECT_EQ(capture_time_ms, packet_out->capture_time_ms());
-}
-
-TEST_F(RtpPacketHistoryTest, NoCaptureTime) {
-  hist_.SetStorePacketsStatus(true, 10);
-  fake_clock_.AdvanceTimeMilliseconds(1);
-  int64_t capture_time_ms = fake_clock_.TimeInMilliseconds();
-  std::unique_ptr<RtpPacketToSend> packet = CreateRtpPacket(kSeqNum);
-  packet->set_capture_time_ms(-1);
-  rtc::CopyOnWriteBuffer buffer = packet->Buffer();
-  hist_.PutRtpPacket(std::move(packet), kAllowRetransmission, false);
-
-  std::unique_ptr<RtpPacketToSend> packet_out =
-      hist_.GetPacketAndSetSendTime(kSeqNum, 0, false);
-  EXPECT_TRUE(packet_out);
-  EXPECT_EQ(buffer, packet_out->Buffer());
-  EXPECT_EQ(capture_time_ms, packet_out->capture_time_ms());
-}
-
-TEST_F(RtpPacketHistoryTest, DontRetransmit) {
-  hist_.SetStorePacketsStatus(true, 10);
-  int64_t capture_time_ms = fake_clock_.TimeInMilliseconds();
-  std::unique_ptr<RtpPacketToSend> packet = CreateRtpPacket(kSeqNum);
-  rtc::CopyOnWriteBuffer buffer = packet->Buffer();
-  hist_.PutRtpPacket(std::move(packet), kDontRetransmit, false);
-
-  std::unique_ptr<RtpPacketToSend> packet_out;
-  packet_out = hist_.GetPacketAndSetSendTime(kSeqNum, 0, true);
-  EXPECT_FALSE(packet_out);
-
-  packet_out = hist_.GetPacketAndSetSendTime(kSeqNum, 0, false);
-  EXPECT_TRUE(packet_out);
-
-  EXPECT_EQ(buffer.size(), packet_out->size());
-  EXPECT_EQ(capture_time_ms, packet_out->capture_time_ms());
-}
-
-TEST_F(RtpPacketHistoryTest, MinResendTime) {
-  static const int64_t kMinRetransmitIntervalMs = 100;
-
-  hist_.SetStorePacketsStatus(true, 10);
-  int64_t capture_time_ms = fake_clock_.TimeInMilliseconds();
-  std::unique_ptr<RtpPacketToSend> packet = CreateRtpPacket(kSeqNum);
-  size_t len = packet->size();
-  hist_.PutRtpPacket(std::move(packet), kAllowRetransmission, false);
-
-  // First transmission: TimeToSendPacket() call from pacer.
-  EXPECT_TRUE(hist_.GetPacketAndSetSendTime(kSeqNum, 0, false));
-
-  fake_clock_.AdvanceTimeMilliseconds(kMinRetransmitIntervalMs);
-  // Time has elapsed.
-  std::unique_ptr<RtpPacketToSend> packet_out =
-      hist_.GetPacketAndSetSendTime(kSeqNum, kMinRetransmitIntervalMs, true);
-  EXPECT_TRUE(packet_out);
-  EXPECT_EQ(len, packet_out->size());
-  EXPECT_EQ(capture_time_ms, packet_out->capture_time_ms());
-
-  fake_clock_.AdvanceTimeMilliseconds(kMinRetransmitIntervalMs - 1);
-  // Time has not elapsed. Packet should be found, but no bytes copied.
-  EXPECT_TRUE(hist_.HasRtpPacket(kSeqNum));
-  EXPECT_FALSE(
-      hist_.GetPacketAndSetSendTime(kSeqNum, kMinRetransmitIntervalMs, true));
-}
-
-TEST_F(RtpPacketHistoryTest, EarlyFirstResend) {
-  static const int64_t kMinRetransmitIntervalMs = 100;
-
-  hist_.SetStorePacketsStatus(true, 10);
-  int64_t capture_time_ms = fake_clock_.TimeInMilliseconds();
-  std::unique_ptr<RtpPacketToSend> packet = CreateRtpPacket(kSeqNum);
-  rtc::CopyOnWriteBuffer buffer = packet->Buffer();
-  hist_.PutRtpPacket(std::move(packet), kAllowRetransmission, false);
-
-  // First transmission: TimeToSendPacket() call from pacer.
-  EXPECT_TRUE(hist_.GetPacketAndSetSendTime(kSeqNum, 0, false));
-
-  fake_clock_.AdvanceTimeMilliseconds(kMinRetransmitIntervalMs - 1);
-  // Time has not elapsed, but this is the first retransmission request so
-  // allow anyway.
-  std::unique_ptr<RtpPacketToSend> packet_out =
-      hist_.GetPacketAndSetSendTime(kSeqNum, kMinRetransmitIntervalMs, true);
-  EXPECT_TRUE(packet_out);
-  EXPECT_EQ(buffer, packet_out->Buffer());
-  EXPECT_EQ(capture_time_ms, packet_out->capture_time_ms());
-
-  fake_clock_.AdvanceTimeMilliseconds(kMinRetransmitIntervalMs - 1);
-  // Time has not elapsed. Packet should be found, but no bytes copied.
-  EXPECT_TRUE(hist_.HasRtpPacket(kSeqNum));
-  EXPECT_FALSE(
-      hist_.GetPacketAndSetSendTime(kSeqNum, kMinRetransmitIntervalMs, true));
-}
-
-TEST_F(RtpPacketHistoryTest, DynamicExpansion) {
-  hist_.SetStorePacketsStatus(true, 10);
-
-  // Add 4 packets, and then send them.
-  for (int i = 0; i < 4; ++i) {
-    std::unique_ptr<RtpPacketToSend> packet = CreateRtpPacket(kSeqNum + i);
-    hist_.PutRtpPacket(std::move(packet), kAllowRetransmission, false);
-  }
-  for (int i = 0; i < 4; ++i) {
-    EXPECT_TRUE(hist_.GetPacketAndSetSendTime(kSeqNum + i, 100, false));
-  }
-  fake_clock_.AdvanceTimeMilliseconds(33);
-
-  // Add 16 packets, and then send them. History should expand to make this
-  // work.
-  for (int i = 4; i < 20; ++i) {
-    std::unique_ptr<RtpPacketToSend> packet = CreateRtpPacket(kSeqNum + i);
-    hist_.PutRtpPacket(std::move(packet), kAllowRetransmission, false);
-  }
-  for (int i = 4; i < 20; ++i) {
-    EXPECT_TRUE(hist_.GetPacketAndSetSendTime(kSeqNum + i, 100, false));
-  }
-
-  fake_clock_.AdvanceTimeMilliseconds(100);
-
-  // Retransmit last 16 packets.
-  for (int i = 4; i < 20; ++i) {
-    EXPECT_TRUE(hist_.GetPacketAndSetSendTime(kSeqNum + i, 100, false));
-  }
-}
-
-TEST_F(RtpPacketHistoryTest, FullExpansion) {
-  static const int kSendSidePacketHistorySize = 600;
-  hist_.SetStorePacketsStatus(true, kSendSidePacketHistorySize);
-  for (size_t i = 0; i < RtpPacketHistory::kMaxCapacity + 1; ++i) {
-    std::unique_ptr<RtpPacketToSend> packet = CreateRtpPacket(kSeqNum + i);
-    hist_.PutRtpPacket(std::move(packet), kAllowRetransmission, false);
-  }
-
-  fake_clock_.AdvanceTimeMilliseconds(100);
-
-  // Retransmit all packets currently in buffer.
-  for (size_t i = 1; i < RtpPacketHistory::kMaxCapacity + 1; ++i) {
-    EXPECT_TRUE(hist_.GetPacketAndSetSendTime(kSeqNum + i, 100, false));
-  }
-}
-
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/rtp_packet_received.cc b/modules/rtp_rtcp/source/rtp_packet_received.cc
deleted file mode 100644
index 0d3fdd1..0000000
--- a/modules/rtp_rtcp/source/rtp_packet_received.cc
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- *  Copyright (c) 2017 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/rtp_rtcp/source/rtp_packet_received.h"
-
-#include <vector>
-
-#include "webrtc/modules/rtp_rtcp/source/rtp_header_extensions.h"
-#include "webrtc/rtc_base/safe_conversions.h"
-
-namespace webrtc {
-
-void RtpPacketReceived::GetHeader(RTPHeader* header) const {
-  header->markerBit = Marker();
-  header->payloadType = PayloadType();
-  header->sequenceNumber = SequenceNumber();
-  header->timestamp = Timestamp();
-  header->ssrc = Ssrc();
-  std::vector<uint32_t> csrcs = Csrcs();
-  header->numCSRCs = rtc::dchecked_cast<uint8_t>(csrcs.size());
-  for (size_t i = 0; i < csrcs.size(); ++i) {
-    header->arrOfCSRCs[i] = csrcs[i];
-  }
-  header->paddingLength = padding_size();
-  header->headerLength = headers_size();
-  header->payload_type_frequency = payload_type_frequency();
-  header->extension.hasTransmissionTimeOffset =
-      GetExtension<TransmissionOffset>(
-          &header->extension.transmissionTimeOffset);
-  header->extension.hasAbsoluteSendTime =
-      GetExtension<AbsoluteSendTime>(&header->extension.absoluteSendTime);
-  header->extension.hasTransportSequenceNumber =
-      GetExtension<TransportSequenceNumber>(
-          &header->extension.transportSequenceNumber);
-  header->extension.hasAudioLevel = GetExtension<AudioLevel>(
-      &header->extension.voiceActivity, &header->extension.audioLevel);
-  header->extension.hasVideoRotation =
-      GetExtension<VideoOrientation>(&header->extension.videoRotation);
-  header->extension.hasVideoContentType =
-      GetExtension<VideoContentTypeExtension>(
-          &header->extension.videoContentType);
-  header->extension.has_video_timing =
-      GetExtension<VideoTimingExtension>(&header->extension.video_timing);
-  GetExtension<RtpStreamId>(&header->extension.stream_id);
-  GetExtension<RepairedRtpStreamId>(&header->extension.repaired_stream_id);
-  GetExtension<RtpMid>(&header->extension.mid);
-  GetExtension<PlayoutDelayLimits>(&header->extension.playout_delay);
-}
-
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/rtp_packet_received.h b/modules/rtp_rtcp/source/rtp_packet_received.h
deleted file mode 100644
index 5b90cd0..0000000
--- a/modules/rtp_rtcp/source/rtp_packet_received.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- *  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_RTP_RTCP_SOURCE_RTP_PACKET_RECEIVED_H_
-#define WEBRTC_MODULES_RTP_RTCP_SOURCE_RTP_PACKET_RECEIVED_H_
-
-#include "webrtc/common_types.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_packet.h"
-#include "webrtc/system_wrappers/include/ntp_time.h"
-
-namespace webrtc {
-// Class to hold rtp packet with metadata for receiver side.
-class RtpPacketReceived : public RtpPacket {
- public:
-  RtpPacketReceived() = default;
-  explicit RtpPacketReceived(const ExtensionManager* extensions)
-      : RtpPacket(extensions) {}
-
-  // TODO(danilchap): Remove this function when all code update to use RtpPacket
-  // directly. Function is there just for easier backward compatibilty.
-  void GetHeader(RTPHeader* header) const;
-
-  // Time in local time base as close as it can to packet arrived on the
-  // network.
-  int64_t arrival_time_ms() const { return arrival_time_ms_; }
-  void set_arrival_time_ms(int64_t time) { arrival_time_ms_ = time; }
-
-  // Estimated from Timestamp() using rtcp Sender Reports.
-  NtpTime capture_ntp_time() const { return capture_time_; }
-  void set_capture_ntp_time(NtpTime time) { capture_time_ = time; }
-
-  // Flag if packet was recovered via RTX or FEC.
-  bool recovered() const { return recovered_; }
-  void set_recovered(bool value) { recovered_ = value; }
-
-  int payload_type_frequency() const { return payload_type_frequency_; }
-  void set_payload_type_frequency(int value) {
-    payload_type_frequency_ = value;
-  }
-
- private:
-  NtpTime capture_time_;
-  int64_t arrival_time_ms_ = 0;
-  int payload_type_frequency_ = 0;
-  bool recovered_ = false;
-};
-
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_RTP_RTCP_SOURCE_RTP_PACKET_RECEIVED_H_
diff --git a/modules/rtp_rtcp/source/rtp_packet_to_send.h b/modules/rtp_rtcp/source/rtp_packet_to_send.h
deleted file mode 100644
index 505d921..0000000
--- a/modules/rtp_rtcp/source/rtp_packet_to_send.h
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- *  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_RTP_RTCP_SOURCE_RTP_PACKET_TO_SEND_H_
-#define WEBRTC_MODULES_RTP_RTCP_SOURCE_RTP_PACKET_TO_SEND_H_
-
-#include "webrtc/modules/rtp_rtcp/source/rtp_header_extensions.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_packet.h"
-
-namespace webrtc {
-// Class to hold rtp packet with metadata for sender side.
-class RtpPacketToSend : public RtpPacket {
- public:
-  explicit RtpPacketToSend(const ExtensionManager* extensions)
-      : RtpPacket(extensions) {}
-  RtpPacketToSend(const RtpPacketToSend& packet) = default;
-  RtpPacketToSend(const ExtensionManager* extensions, size_t capacity)
-      : RtpPacket(extensions, capacity) {}
-
-  RtpPacketToSend& operator=(const RtpPacketToSend& packet) = default;
-
-  // Time in local time base as close as it can to frame capture time.
-  int64_t capture_time_ms() const { return capture_time_ms_; }
-
-  void set_capture_time_ms(int64_t time) { capture_time_ms_ = time; }
-
-  void set_packetization_finish_time_ms(int64_t time) {
-    SetExtension<VideoTimingExtension>(
-        VideoSendTiming::GetDeltaCappedMs(capture_time_ms_, time),
-        VideoSendTiming::kPacketizationFinishDeltaOffset);
-  }
-
-  void set_pacer_exit_time_ms(int64_t time) {
-    SetExtension<VideoTimingExtension>(
-        VideoSendTiming::GetDeltaCappedMs(capture_time_ms_, time),
-        VideoSendTiming::kPacerExitDeltaOffset);
-  }
-
-  void set_network_time_ms(int64_t time) {
-    SetExtension<VideoTimingExtension>(
-        VideoSendTiming::GetDeltaCappedMs(capture_time_ms_, time),
-        VideoSendTiming::kNetworkTimestampDeltaOffset);
-  }
-
-  void set_network2_time_ms(int64_t time) {
-    SetExtension<VideoTimingExtension>(
-        VideoSendTiming::GetDeltaCappedMs(capture_time_ms_, time),
-        VideoSendTiming::kNetwork2TimestampDeltaOffset);
-  }
-
- private:
-  int64_t capture_time_ms_ = 0;
-};
-
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_RTP_RTCP_SOURCE_RTP_PACKET_TO_SEND_H_
diff --git a/modules/rtp_rtcp/source/rtp_packet_unittest.cc b/modules/rtp_rtcp/source/rtp_packet_unittest.cc
deleted file mode 100644
index 776db53..0000000
--- a/modules/rtp_rtcp/source/rtp_packet_unittest.cc
+++ /dev/null
@@ -1,566 +0,0 @@
-/*
- *  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/rtp_rtcp/source/rtp_packet_received.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_packet_to_send.h"
-
-#include "webrtc/modules/rtp_rtcp/include/rtp_header_extension_map.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_header_extensions.h"
-#include "webrtc/rtc_base/random.h"
-#include "webrtc/test/gmock.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-namespace {
-using ::testing::ElementsAreArray;
-using ::testing::IsEmpty;
-using ::testing::make_tuple;
-
-constexpr int8_t kPayloadType = 100;
-constexpr uint32_t kSsrc = 0x12345678;
-constexpr uint16_t kSeqNum = 0x1234;
-constexpr uint8_t kSeqNumFirstByte = kSeqNum >> 8;
-constexpr uint8_t kSeqNumSecondByte = kSeqNum & 0xff;
-constexpr uint32_t kTimestamp = 0x65431278;
-constexpr uint8_t kTransmissionOffsetExtensionId = 1;
-constexpr uint8_t kAudioLevelExtensionId = 9;
-constexpr uint8_t kRtpStreamIdExtensionId = 0xa;
-constexpr uint8_t kRtpMidExtensionId = 0xb;
-constexpr uint8_t kVideoTimingExtensionId = 0xc;
-constexpr int32_t kTimeOffset = 0x56ce;
-constexpr bool kVoiceActive = true;
-constexpr uint8_t kAudioLevel = 0x5a;
-constexpr char kStreamId[] = "streamid";
-constexpr char kMid[] = "mid";
-constexpr size_t kMaxPaddingSize = 224u;
-// clang-format off
-constexpr uint8_t kMinimumPacket[] = {
-    0x80, kPayloadType, kSeqNumFirstByte, kSeqNumSecondByte,
-    0x65, 0x43, 0x12, 0x78,
-    0x12, 0x34, 0x56, 0x78};
-
-constexpr uint8_t kPacketWithTO[] = {
-    0x90, kPayloadType, kSeqNumFirstByte, kSeqNumSecondByte,
-    0x65, 0x43, 0x12, 0x78,
-    0x12, 0x34, 0x56, 0x78,
-    0xbe, 0xde, 0x00, 0x01,
-    0x12, 0x00, 0x56, 0xce};
-
-constexpr uint8_t kPacketWithTOAndAL[] = {
-    0x90, kPayloadType, kSeqNumFirstByte, kSeqNumSecondByte,
-    0x65, 0x43, 0x12, 0x78,
-    0x12, 0x34, 0x56, 0x78,
-    0xbe, 0xde, 0x00, 0x02,
-    0x12, 0x00, 0x56, 0xce,
-    0x90, 0x80|kAudioLevel, 0x00, 0x00};
-
-constexpr uint8_t kPacketWithRsid[] = {
-    0x90, kPayloadType, kSeqNumFirstByte, kSeqNumSecondByte,
-    0x65, 0x43, 0x12, 0x78,
-    0x12, 0x34, 0x56, 0x78,
-    0xbe, 0xde, 0x00, 0x03,
-    0xa7, 's',  't',  'r',
-    'e',  'a',  'm',  'i',
-    'd' , 0x00, 0x00, 0x00};
-
-constexpr uint8_t kPacketWithMid[] = {
-    0x90, kPayloadType, kSeqNumFirstByte, kSeqNumSecondByte,
-    0x65, 0x43, 0x12, 0x78,
-    0x12, 0x34, 0x56, 0x78,
-    0xbe, 0xde, 0x00, 0x01,
-    0xb2, 'm', 'i', 'd'};
-
-constexpr uint32_t kCsrcs[] = {0x34567890, 0x32435465};
-constexpr uint8_t kPayload[] = {'p', 'a', 'y', 'l', 'o', 'a', 'd'};
-constexpr uint8_t kPacketPaddingSize = 8;
-constexpr uint8_t kPacket[] = {
-    0xb2, kPayloadType, kSeqNumFirstByte, kSeqNumSecondByte,
-    0x65, 0x43, 0x12, 0x78,
-    0x12, 0x34, 0x56, 0x78,
-    0x34, 0x56, 0x78, 0x90,
-    0x32, 0x43, 0x54, 0x65,
-    0xbe, 0xde, 0x00, 0x01,
-    0x12, 0x00, 0x56, 0xce,
-    'p', 'a', 'y', 'l', 'o', 'a', 'd',
-    'p', 'a', 'd', 'd', 'i', 'n', 'g', kPacketPaddingSize};
-
-constexpr uint8_t kPacketWithInvalidExtension[] = {
-    0x90, kPayloadType, kSeqNumFirstByte, kSeqNumSecondByte,
-    0x65, 0x43, 0x12, 0x78,  // kTimestamp.
-    0x12, 0x34, 0x56, 0x78,  // kSSrc.
-    0xbe, 0xde, 0x00, 0x02,  // Extension block of size 2 x 32bit words.
-    (kTransmissionOffsetExtensionId << 4) | 6,  // (6+1)-byte extension, but
-           'e',  'x',  't',                     // Transmission Offset
-     'd',  'a',  't',  'a',                     // expected to be 3-bytes.
-     'p',  'a',  'y',  'l',  'o',  'a',  'd'};
-
-constexpr uint8_t kPacketWithLegacyTimingExtension[] = {
-    0x90, kPayloadType, kSeqNumFirstByte, kSeqNumSecondByte,
-    0x65, 0x43, 0x12, 0x78,  // kTimestamp.
-    0x12, 0x34, 0x56, 0x78,  // kSSrc.
-    0xbe, 0xde, 0x00, 0x04,    // Extension block of size 4 x 32bit words.
-    (kVideoTimingExtensionId << 4)
-      | VideoTimingExtension::kValueSizeBytes - 2,  // Old format without flags.
-          0x00, 0x01, 0x00,
-    0x02, 0x00, 0x03, 0x00,
-    0x04, 0x00, 0x00, 0x00,
-    0x00, 0x00, 0x00, 0x00};
-// clang-format on
-}  // namespace
-
-TEST(RtpPacketTest, CreateMinimum) {
-  RtpPacketToSend packet(nullptr);
-  packet.SetPayloadType(kPayloadType);
-  packet.SetSequenceNumber(kSeqNum);
-  packet.SetTimestamp(kTimestamp);
-  packet.SetSsrc(kSsrc);
-  EXPECT_THAT(kMinimumPacket, ElementsAreArray(packet.data(), packet.size()));
-}
-
-TEST(RtpPacketTest, CreateWithExtension) {
-  RtpPacketToSend::ExtensionManager extensions;
-  extensions.Register(kRtpExtensionTransmissionTimeOffset,
-                      kTransmissionOffsetExtensionId);
-  RtpPacketToSend packet(&extensions);
-  packet.SetPayloadType(kPayloadType);
-  packet.SetSequenceNumber(kSeqNum);
-  packet.SetTimestamp(kTimestamp);
-  packet.SetSsrc(kSsrc);
-  packet.SetExtension<TransmissionOffset>(kTimeOffset);
-  EXPECT_THAT(kPacketWithTO, ElementsAreArray(packet.data(), packet.size()));
-}
-
-TEST(RtpPacketTest, CreateWith2Extensions) {
-  RtpPacketToSend::ExtensionManager extensions;
-  extensions.Register(kRtpExtensionTransmissionTimeOffset,
-                      kTransmissionOffsetExtensionId);
-  extensions.Register(kRtpExtensionAudioLevel, kAudioLevelExtensionId);
-  RtpPacketToSend packet(&extensions);
-  packet.SetPayloadType(kPayloadType);
-  packet.SetSequenceNumber(kSeqNum);
-  packet.SetTimestamp(kTimestamp);
-  packet.SetSsrc(kSsrc);
-  packet.SetExtension<TransmissionOffset>(kTimeOffset);
-  packet.SetExtension<AudioLevel>(kVoiceActive, kAudioLevel);
-  EXPECT_THAT(kPacketWithTOAndAL,
-              ElementsAreArray(packet.data(), packet.size()));
-}
-
-TEST(RtpPacketTest, CreateWithDynamicSizedExtensions) {
-  RtpPacketToSend::ExtensionManager extensions;
-  extensions.Register<RtpStreamId>(kRtpStreamIdExtensionId);
-  RtpPacketToSend packet(&extensions);
-  packet.SetPayloadType(kPayloadType);
-  packet.SetSequenceNumber(kSeqNum);
-  packet.SetTimestamp(kTimestamp);
-  packet.SetSsrc(kSsrc);
-  packet.SetExtension<RtpStreamId>(kStreamId);
-  EXPECT_THAT(kPacketWithRsid, ElementsAreArray(packet.data(), packet.size()));
-}
-
-TEST(RtpPacketTest, TryToCreateWithEmptyRsid) {
-  RtpPacketToSend::ExtensionManager extensions;
-  extensions.Register<RtpStreamId>(kRtpStreamIdExtensionId);
-  RtpPacketToSend packet(&extensions);
-  EXPECT_FALSE(packet.SetExtension<RtpStreamId>(""));
-}
-
-TEST(RtpPacketTest, TryToCreateWithLongRsid) {
-  RtpPacketToSend::ExtensionManager extensions;
-  constexpr char kLongStreamId[] = "LoooooooooongRsid";
-  ASSERT_EQ(strlen(kLongStreamId), 17u);
-  extensions.Register<RtpStreamId>(kRtpStreamIdExtensionId);
-  RtpPacketToSend packet(&extensions);
-  EXPECT_FALSE(packet.SetExtension<RtpStreamId>(kLongStreamId));
-}
-
-TEST(RtpPacketTest, TryToCreateWithEmptyMid) {
-  RtpPacketToSend::ExtensionManager extensions;
-  extensions.Register<RtpMid>(kRtpMidExtensionId);
-  RtpPacketToSend packet(&extensions);
-  EXPECT_FALSE(packet.SetExtension<RtpMid>(""));
-}
-
-TEST(RtpPacketTest, TryToCreateWithLongMid) {
-  RtpPacketToSend::ExtensionManager extensions;
-  constexpr char kLongMid[] = "LoooooooooonogMid";
-  ASSERT_EQ(strlen(kLongMid), 17u);
-  extensions.Register<RtpMid>(kRtpMidExtensionId);
-  RtpPacketToSend packet(&extensions);
-  EXPECT_FALSE(packet.SetExtension<RtpMid>(kLongMid));
-}
-
-TEST(RtpPacketTest, CreateWithExtensionsWithoutManager) {
-  RtpPacketToSend packet(nullptr);
-  packet.SetPayloadType(kPayloadType);
-  packet.SetSequenceNumber(kSeqNum);
-  packet.SetTimestamp(kTimestamp);
-  packet.SetSsrc(kSsrc);
-
-  auto raw = packet.AllocateRawExtension(kTransmissionOffsetExtensionId,
-                                         TransmissionOffset::kValueSizeBytes);
-  EXPECT_EQ(raw.size(), TransmissionOffset::kValueSizeBytes);
-  TransmissionOffset::Write(raw.data(), kTimeOffset);
-
-  raw = packet.AllocateRawExtension(kAudioLevelExtensionId,
-                                    AudioLevel::kValueSizeBytes);
-  EXPECT_EQ(raw.size(), AudioLevel::kValueSizeBytes);
-  AudioLevel::Write(raw.data(), kVoiceActive, kAudioLevel);
-
-  EXPECT_THAT(kPacketWithTOAndAL,
-              ElementsAreArray(packet.data(), packet.size()));
-}
-
-TEST(RtpPacketTest, CreateWithMaxSizeHeaderExtension) {
-  const size_t kMaxExtensionSize = 16;
-  const int kId = 1;
-  const uint8_t kValue[16] = "123456789abcdef";
-
-  // Write packet with a custom extension.
-  RtpPacketToSend packet(nullptr);
-  packet.SetRawExtension(kId, kValue);
-  // Using different size for same id is not allowed.
-  EXPECT_TRUE(packet.AllocateRawExtension(kId, kMaxExtensionSize - 1).empty());
-
-  packet.SetPayloadSize(42);
-  // Rewriting allocated extension is allowed.
-  EXPECT_EQ(packet.AllocateRawExtension(kId, kMaxExtensionSize).size(),
-            kMaxExtensionSize);
-  // Adding another extension after payload is set is not allowed.
-  EXPECT_TRUE(packet.AllocateRawExtension(kId + 1, kMaxExtensionSize).empty());
-
-  // Read packet with the custom extension.
-  RtpPacketReceived parsed;
-  EXPECT_TRUE(parsed.Parse(packet.Buffer()));
-  auto read_raw = parsed.GetRawExtension(kId);
-  EXPECT_THAT(read_raw, ElementsAreArray(kValue, kMaxExtensionSize));
-}
-
-TEST(RtpPacketTest, SetReservedExtensionsAfterPayload) {
-  const size_t kPayloadSize = 4;
-  RtpPacketToSend::ExtensionManager extensions;
-  extensions.Register(kRtpExtensionTransmissionTimeOffset,
-                      kTransmissionOffsetExtensionId);
-  extensions.Register(kRtpExtensionAudioLevel, kAudioLevelExtensionId);
-  RtpPacketToSend packet(&extensions);
-
-  EXPECT_TRUE(packet.ReserveExtension<TransmissionOffset>());
-  packet.SetPayloadSize(kPayloadSize);
-  // Can't set extension after payload.
-  EXPECT_FALSE(packet.SetExtension<AudioLevel>(kVoiceActive, kAudioLevel));
-  // Unless reserved.
-  EXPECT_TRUE(packet.SetExtension<TransmissionOffset>(kTimeOffset));
-}
-
-TEST(RtpPacketTest, CreatePurePadding) {
-  const size_t kPaddingSize = kMaxPaddingSize - 1;
-  RtpPacketToSend packet(nullptr, 12 + kPaddingSize);
-  packet.SetPayloadType(kPayloadType);
-  packet.SetSequenceNumber(kSeqNum);
-  packet.SetTimestamp(kTimestamp);
-  packet.SetSsrc(kSsrc);
-  Random random(0x123456789);
-
-  EXPECT_LT(packet.size(), packet.capacity());
-  EXPECT_FALSE(packet.SetPadding(kPaddingSize + 1, &random));
-  EXPECT_TRUE(packet.SetPadding(kPaddingSize, &random));
-  EXPECT_EQ(packet.size(), packet.capacity());
-}
-
-TEST(RtpPacketTest, CreateUnalignedPadding) {
-  const size_t kPayloadSize = 3;  // Make padding start at unaligned address.
-  RtpPacketToSend packet(nullptr, 12 + kPayloadSize + kMaxPaddingSize);
-  packet.SetPayloadType(kPayloadType);
-  packet.SetSequenceNumber(kSeqNum);
-  packet.SetTimestamp(kTimestamp);
-  packet.SetSsrc(kSsrc);
-  packet.SetPayloadSize(kPayloadSize);
-  Random r(0x123456789);
-
-  EXPECT_LT(packet.size(), packet.capacity());
-  EXPECT_TRUE(packet.SetPadding(kMaxPaddingSize, &r));
-  EXPECT_EQ(packet.size(), packet.capacity());
-}
-
-TEST(RtpPacketTest, ParseMinimum) {
-  RtpPacketReceived packet;
-  EXPECT_TRUE(packet.Parse(kMinimumPacket, sizeof(kMinimumPacket)));
-  EXPECT_EQ(kPayloadType, packet.PayloadType());
-  EXPECT_EQ(kSeqNum, packet.SequenceNumber());
-  EXPECT_EQ(kTimestamp, packet.Timestamp());
-  EXPECT_EQ(kSsrc, packet.Ssrc());
-  EXPECT_EQ(0u, packet.padding_size());
-  EXPECT_EQ(0u, packet.payload_size());
-}
-
-TEST(RtpPacketTest, ParseBuffer) {
-  rtc::CopyOnWriteBuffer unparsed(kMinimumPacket);
-  const uint8_t* raw = unparsed.data();
-
-  RtpPacketReceived packet;
-  EXPECT_TRUE(packet.Parse(std::move(unparsed)));
-  EXPECT_EQ(raw, packet.data());  // Expect packet take the buffer without copy.
-  EXPECT_EQ(kSeqNum, packet.SequenceNumber());
-  EXPECT_EQ(kTimestamp, packet.Timestamp());
-  EXPECT_EQ(kSsrc, packet.Ssrc());
-  EXPECT_EQ(0u, packet.padding_size());
-  EXPECT_EQ(0u, packet.payload_size());
-}
-
-TEST(RtpPacketTest, ParseWithExtension) {
-  RtpPacketToSend::ExtensionManager extensions;
-  extensions.Register(kRtpExtensionTransmissionTimeOffset,
-                      kTransmissionOffsetExtensionId);
-
-  RtpPacketReceived packet(&extensions);
-  EXPECT_TRUE(packet.Parse(kPacketWithTO, sizeof(kPacketWithTO)));
-  EXPECT_EQ(kPayloadType, packet.PayloadType());
-  EXPECT_EQ(kSeqNum, packet.SequenceNumber());
-  EXPECT_EQ(kTimestamp, packet.Timestamp());
-  EXPECT_EQ(kSsrc, packet.Ssrc());
-  int32_t time_offset;
-  EXPECT_TRUE(packet.GetExtension<TransmissionOffset>(&time_offset));
-  EXPECT_EQ(kTimeOffset, time_offset);
-  EXPECT_EQ(0u, packet.payload_size());
-  EXPECT_EQ(0u, packet.padding_size());
-}
-
-TEST(RtpPacketTest, ParseWithInvalidSizedExtension) {
-  RtpPacketToSend::ExtensionManager extensions;
-  extensions.Register(kRtpExtensionTransmissionTimeOffset,
-                      kTransmissionOffsetExtensionId);
-
-  RtpPacketReceived packet(&extensions);
-  EXPECT_TRUE(packet.Parse(kPacketWithInvalidExtension,
-                           sizeof(kPacketWithInvalidExtension)));
-
-  // Extension should be ignored.
-  int32_t time_offset;
-  EXPECT_FALSE(packet.GetExtension<TransmissionOffset>(&time_offset));
-
-  // But shouldn't prevent reading payload.
-  EXPECT_THAT(packet.payload(), ElementsAreArray(kPayload));
-}
-
-TEST(RtpPacketTest, ParseWithOverSizedExtension) {
-  // clang-format off
-  const uint8_t bad_packet[] = {
-      0x90, kPayloadType, kSeqNumFirstByte, kSeqNumSecondByte,
-      0x65, 0x43, 0x12, 0x78,  // kTimestamp.
-      0x12, 0x34, 0x56, 0x78,  // kSsrc.
-      0xbe, 0xde, 0x00, 0x01,  // Extension of size 1x32bit word.
-      0x00,  // Add a byte of padding.
-            0x12,  // Extension id 1 size (2+1).
-                  0xda, 0x1a  // Only 2 bytes of extension payload.
-  };
-  // clang-format on
-  RtpPacketToSend::ExtensionManager extensions;
-  extensions.Register(TransmissionOffset::kId, 1);
-  RtpPacketReceived packet(&extensions);
-
-  // Parse should ignore bad extension and proceed.
-  EXPECT_TRUE(packet.Parse(bad_packet, sizeof(bad_packet)));
-  int32_t time_offset;
-  // But extracting extension should fail.
-  EXPECT_FALSE(packet.GetExtension<TransmissionOffset>(&time_offset));
-}
-
-TEST(RtpPacketTest, ParseWith2Extensions) {
-  RtpPacketToSend::ExtensionManager extensions;
-  extensions.Register(kRtpExtensionTransmissionTimeOffset,
-                      kTransmissionOffsetExtensionId);
-  extensions.Register(kRtpExtensionAudioLevel, kAudioLevelExtensionId);
-  RtpPacketReceived packet(&extensions);
-  EXPECT_TRUE(packet.Parse(kPacketWithTOAndAL, sizeof(kPacketWithTOAndAL)));
-  int32_t time_offset;
-  EXPECT_TRUE(packet.GetExtension<TransmissionOffset>(&time_offset));
-  EXPECT_EQ(kTimeOffset, time_offset);
-  bool voice_active;
-  uint8_t audio_level;
-  EXPECT_TRUE(packet.GetExtension<AudioLevel>(&voice_active, &audio_level));
-  EXPECT_EQ(kVoiceActive, voice_active);
-  EXPECT_EQ(kAudioLevel, audio_level);
-}
-
-TEST(RtpPacketTest, ParseWithAllFeatures) {
-  RtpPacketToSend::ExtensionManager extensions;
-  extensions.Register(kRtpExtensionTransmissionTimeOffset,
-                      kTransmissionOffsetExtensionId);
-  RtpPacketReceived packet(&extensions);
-  EXPECT_TRUE(packet.Parse(kPacket, sizeof(kPacket)));
-  EXPECT_EQ(kPayloadType, packet.PayloadType());
-  EXPECT_EQ(kSeqNum, packet.SequenceNumber());
-  EXPECT_EQ(kTimestamp, packet.Timestamp());
-  EXPECT_EQ(kSsrc, packet.Ssrc());
-  EXPECT_THAT(packet.Csrcs(), ElementsAreArray(kCsrcs));
-  EXPECT_THAT(packet.payload(), ElementsAreArray(kPayload));
-  EXPECT_EQ(kPacketPaddingSize, packet.padding_size());
-  int32_t time_offset;
-  EXPECT_TRUE(packet.GetExtension<TransmissionOffset>(&time_offset));
-}
-
-TEST(RtpPacketTest, ParseWithExtensionDelayed) {
-  RtpPacketReceived packet;
-  EXPECT_TRUE(packet.Parse(kPacketWithTO, sizeof(kPacketWithTO)));
-  EXPECT_EQ(kPayloadType, packet.PayloadType());
-  EXPECT_EQ(kSeqNum, packet.SequenceNumber());
-  EXPECT_EQ(kTimestamp, packet.Timestamp());
-  EXPECT_EQ(kSsrc, packet.Ssrc());
-
-  RtpPacketToSend::ExtensionManager extensions;
-  extensions.Register(kRtpExtensionTransmissionTimeOffset,
-                      kTransmissionOffsetExtensionId);
-
-  int32_t time_offset;
-  EXPECT_FALSE(packet.GetExtension<TransmissionOffset>(&time_offset));
-  packet.IdentifyExtensions(extensions);
-  EXPECT_TRUE(packet.GetExtension<TransmissionOffset>(&time_offset));
-  EXPECT_EQ(kTimeOffset, time_offset);
-  EXPECT_EQ(0u, packet.payload_size());
-  EXPECT_EQ(0u, packet.padding_size());
-}
-
-TEST(RtpPacketTest, ParseWithoutExtensionManager) {
-  RtpPacketReceived packet;
-  EXPECT_TRUE(packet.Parse(kPacketWithTO, sizeof(kPacketWithTO)));
-
-  EXPECT_FALSE(packet.HasRawExtension(kAudioLevelExtensionId));
-  EXPECT_TRUE(packet.GetRawExtension(kAudioLevelExtensionId).empty());
-
-  EXPECT_TRUE(packet.HasRawExtension(kTransmissionOffsetExtensionId));
-
-  int32_t time_offset = 0;
-  auto raw_extension = packet.GetRawExtension(kTransmissionOffsetExtensionId);
-  EXPECT_EQ(raw_extension.size(), TransmissionOffset::kValueSizeBytes);
-  EXPECT_TRUE(TransmissionOffset::Parse(raw_extension, &time_offset));
-
-  EXPECT_EQ(time_offset, kTimeOffset);
-}
-
-TEST(RtpPacketTest, ParseDynamicSizeExtension) {
-  // clang-format off
-  const uint8_t kPacket1[] = {
-    0x90, kPayloadType, kSeqNumFirstByte, kSeqNumSecondByte,
-    0x65, 0x43, 0x12, 0x78,  // Timestamp.
-    0x12, 0x34, 0x56, 0x78,  // Ssrc.
-    0xbe, 0xde, 0x00, 0x02,  // Extensions block of size 2x32bit words.
-    0x21, 'H', 'D',          // Extension with id = 2, size = (1+1).
-    0x12, 'r', 't', 'x',     // Extension with id = 1, size = (2+1).
-    0x00};  // Extension padding.
-  const uint8_t kPacket2[] = {
-    0x90, kPayloadType, kSeqNumFirstByte, kSeqNumSecondByte,
-    0x65, 0x43, 0x12, 0x78,  // Timestamp.
-    0x12, 0x34, 0x56, 0x79,  // Ssrc.
-    0xbe, 0xde, 0x00, 0x01,  // Extensions block of size 1x32bit words.
-    0x11, 'H', 'D',          // Extension with id = 1, size = (1+1).
-    0x00};  // Extension padding.
-  // clang-format on
-  RtpPacketReceived::ExtensionManager extensions;
-  extensions.Register<RtpStreamId>(1);
-  extensions.Register<RepairedRtpStreamId>(2);
-  RtpPacketReceived packet(&extensions);
-  ASSERT_TRUE(packet.Parse(kPacket1, sizeof(kPacket1)));
-
-  std::string rsid;
-  EXPECT_TRUE(packet.GetExtension<RtpStreamId>(&rsid));
-  EXPECT_EQ(rsid, "rtx");
-
-  std::string repaired_rsid;
-  EXPECT_TRUE(packet.GetExtension<RepairedRtpStreamId>(&repaired_rsid));
-  EXPECT_EQ(repaired_rsid, "HD");
-
-  // Parse another packet with RtpStreamId extension of different size.
-  ASSERT_TRUE(packet.Parse(kPacket2, sizeof(kPacket2)));
-  EXPECT_TRUE(packet.GetExtension<RtpStreamId>(&rsid));
-  EXPECT_EQ(rsid, "HD");
-  EXPECT_FALSE(packet.GetExtension<RepairedRtpStreamId>(&repaired_rsid));
-}
-
-TEST(RtpPacketTest, ParseWithMid) {
-  RtpPacketReceived::ExtensionManager extensions;
-  extensions.Register<RtpMid>(kRtpMidExtensionId);
-  RtpPacketReceived packet(&extensions);
-  ASSERT_TRUE(packet.Parse(kPacketWithMid, sizeof(kPacketWithMid)));
-
-  std::string mid;
-  EXPECT_TRUE(packet.GetExtension<RtpMid>(&mid));
-  EXPECT_EQ(mid, kMid);
-}
-
-TEST(RtpPacketTest, RawExtensionFunctionsAcceptZeroIdAndReturnFalse) {
-  RtpPacketReceived::ExtensionManager extensions;
-  RtpPacketReceived packet(&extensions);
-  // Use ExtensionManager to set kInvalidId to 0 to demonstrate natural way for
-  // using zero value as a parameter to Packet::*RawExtension functions.
-  const int kInvalidId = extensions.GetId(TransmissionOffset::kId);
-  ASSERT_EQ(kInvalidId, 0);
-
-  ASSERT_TRUE(packet.Parse(kPacket, sizeof(kPacket)));
-
-  EXPECT_FALSE(packet.HasRawExtension(kInvalidId));
-  EXPECT_THAT(packet.GetRawExtension(kInvalidId), IsEmpty());
-  const uint8_t kExtension[] = {'e', 'x', 't'};
-  EXPECT_FALSE(packet.SetRawExtension(kInvalidId, kExtension));
-  EXPECT_THAT(packet.AllocateRawExtension(kInvalidId, 3), IsEmpty());
-}
-
-TEST(RtpPacketTest, CreateAndParseTimingFrameExtension) {
-  // Create a packet with video frame timing extension populated.
-  RtpPacketToSend::ExtensionManager send_extensions;
-  send_extensions.Register(kRtpExtensionVideoTiming, kVideoTimingExtensionId);
-  RtpPacketToSend send_packet(&send_extensions);
-  send_packet.SetPayloadType(kPayloadType);
-  send_packet.SetSequenceNumber(kSeqNum);
-  send_packet.SetTimestamp(kTimestamp);
-  send_packet.SetSsrc(kSsrc);
-
-  VideoSendTiming timing;
-  timing.encode_start_delta_ms = 1;
-  timing.encode_finish_delta_ms = 2;
-  timing.packetization_finish_delta_ms = 3;
-  timing.pacer_exit_delta_ms = 4;
-  timing.flags =
-      TimingFrameFlags::kTriggeredByTimer + TimingFrameFlags::kTriggeredBySize;
-
-  send_packet.SetExtension<VideoTimingExtension>(timing);
-
-  // Serialize the packet and then parse it again.
-  RtpPacketReceived::ExtensionManager extensions;
-  extensions.Register<VideoTimingExtension>(kVideoTimingExtensionId);
-  RtpPacketReceived receive_packet(&extensions);
-  EXPECT_TRUE(receive_packet.Parse(send_packet.Buffer()));
-
-  VideoSendTiming receivied_timing;
-  EXPECT_TRUE(
-      receive_packet.GetExtension<VideoTimingExtension>(&receivied_timing));
-
-  // Only check first and last timestamp (covered by other tests) plus flags.
-  EXPECT_EQ(receivied_timing.encode_start_delta_ms,
-            timing.encode_start_delta_ms);
-  EXPECT_EQ(receivied_timing.pacer_exit_delta_ms, timing.pacer_exit_delta_ms);
-  EXPECT_EQ(receivied_timing.flags, timing.flags);
-}
-
-TEST(RtpPacketTest, ParseLegacyTimingFrameExtension) {
-  // Parse the modified packet.
-  RtpPacketReceived::ExtensionManager extensions;
-  extensions.Register<VideoTimingExtension>(kVideoTimingExtensionId);
-  RtpPacketReceived packet(&extensions);
-  EXPECT_TRUE(packet.Parse(kPacketWithLegacyTimingExtension,
-                           sizeof(kPacketWithLegacyTimingExtension)));
-  VideoSendTiming receivied_timing;
-  EXPECT_TRUE(packet.GetExtension<VideoTimingExtension>(&receivied_timing));
-
-  // Check first and last timestamp are still OK. Flags should now be 0.
-  EXPECT_EQ(receivied_timing.encode_start_delta_ms, 1);
-  EXPECT_EQ(receivied_timing.pacer_exit_delta_ms, 4);
-  EXPECT_EQ(receivied_timing.flags, 0);
-}
-
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/rtp_payload_registry.cc b/modules/rtp_rtcp/source/rtp_payload_registry.cc
deleted file mode 100644
index fe2bc80..0000000
--- a/modules/rtp_rtcp/source/rtp_payload_registry.cc
+++ /dev/null
@@ -1,371 +0,0 @@
-/*
- *  Copyright (c) 2013 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/rtp_rtcp/include/rtp_payload_registry.h"
-
-#include <algorithm>
-
-#include "webrtc/common_types.h"
-#include "webrtc/modules/audio_coding/codecs/audio_format_conversion.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/stringutils.h"
-
-namespace webrtc {
-
-namespace {
-
-bool PayloadIsCompatible(const RtpUtility::Payload& payload,
-                         const CodecInst& audio_codec) {
-  if (!payload.audio)
-    return false;
-  if (_stricmp(payload.name, audio_codec.plname) != 0)
-    return false;
-  const AudioPayload& audio_payload = payload.typeSpecific.Audio;
-  return audio_payload.frequency == static_cast<uint32_t>(audio_codec.plfreq) &&
-         audio_payload.channels == audio_codec.channels;
-}
-
-bool PayloadIsCompatible(const RtpUtility::Payload& payload,
-                         const VideoCodec& video_codec) {
-  if (payload.audio || _stricmp(payload.name, video_codec.plName) != 0)
-    return false;
-  // For H264, profiles must match as well.
-  if (video_codec.codecType == kVideoCodecH264) {
-    return video_codec.H264().profile ==
-           payload.typeSpecific.Video.h264_profile;
-  }
-  return true;
-}
-
-RtpUtility::Payload CreatePayloadType(const CodecInst& audio_codec) {
-  RtpUtility::Payload payload;
-  payload.name[RTP_PAYLOAD_NAME_SIZE - 1] = 0;
-  strncpy(payload.name, audio_codec.plname, RTP_PAYLOAD_NAME_SIZE - 1);
-  RTC_DCHECK_GE(audio_codec.plfreq, 1000);
-  payload.typeSpecific.Audio.frequency = audio_codec.plfreq;
-  payload.typeSpecific.Audio.channels = audio_codec.channels;
-  payload.typeSpecific.Audio.rate = 0;
-  payload.audio = true;
-  return payload;
-}
-
-RtpVideoCodecTypes ConvertToRtpVideoCodecType(VideoCodecType type) {
-  switch (type) {
-    case kVideoCodecVP8:
-      return kRtpVideoVp8;
-    case kVideoCodecVP9:
-      return kRtpVideoVp9;
-    case kVideoCodecH264:
-      return kRtpVideoH264;
-    case kVideoCodecRED:
-    case kVideoCodecULPFEC:
-      return kRtpVideoNone;
-    default:
-      return kRtpVideoGeneric;
-  }
-}
-
-RtpUtility::Payload CreatePayloadType(const VideoCodec& video_codec) {
-  RtpUtility::Payload payload;
-  payload.name[RTP_PAYLOAD_NAME_SIZE - 1] = 0;
-  strncpy(payload.name, video_codec.plName, RTP_PAYLOAD_NAME_SIZE - 1);
-  payload.typeSpecific.Video.videoCodecType =
-      ConvertToRtpVideoCodecType(video_codec.codecType);
-  if (video_codec.codecType == kVideoCodecH264)
-    payload.typeSpecific.Video.h264_profile = video_codec.H264().profile;
-  payload.audio = false;
-  return payload;
-}
-
-bool IsPayloadTypeValid(int8_t payload_type) {
-  assert(payload_type >= 0);
-
-  // Sanity check.
-  switch (payload_type) {
-    // Reserved payload types to avoid RTCP conflicts when marker bit is set.
-    case 64:        //  192 Full INTRA-frame request.
-    case 72:        //  200 Sender report.
-    case 73:        //  201 Receiver report.
-    case 74:        //  202 Source description.
-    case 75:        //  203 Goodbye.
-    case 76:        //  204 Application-defined.
-    case 77:        //  205 Transport layer FB message.
-    case 78:        //  206 Payload-specific FB message.
-    case 79:        //  207 Extended report.
-      LOG(LS_ERROR) << "Can't register invalid receiver payload type: "
-                    << payload_type;
-      return false;
-    default:
-      return true;
-  }
-}
-
-}  // namespace
-
-RTPPayloadRegistry::RTPPayloadRegistry()
-    : incoming_payload_type_(-1),
-      last_received_payload_type_(-1),
-      last_received_media_payload_type_(-1),
-      rtx_(false),
-      ssrc_rtx_(0) {}
-
-RTPPayloadRegistry::~RTPPayloadRegistry() = default;
-
-void RTPPayloadRegistry::SetAudioReceivePayloads(
-    std::map<int, SdpAudioFormat> codecs) {
-  rtc::CritScope cs(&crit_sect_);
-
-#if RTC_DCHECK_IS_ON
-  RTC_DCHECK(!used_for_video_);
-  used_for_audio_ = true;
-#endif
-
-  payload_type_map_.clear();
-  for (const auto& kv : codecs) {
-    const int& rtp_payload_type = kv.first;
-    const SdpAudioFormat& audio_format = kv.second;
-    const CodecInst ci = SdpToCodecInst(rtp_payload_type, audio_format);
-    RTC_DCHECK(IsPayloadTypeValid(rtp_payload_type));
-    payload_type_map_.insert(
-        std::make_pair(rtp_payload_type, CreatePayloadType(ci)));
-  }
-
-  // Clear the value of last received payload type since it might mean
-  // something else now.
-  last_received_payload_type_ = -1;
-  last_received_media_payload_type_ = -1;
-}
-
-int32_t RTPPayloadRegistry::RegisterReceivePayload(const CodecInst& audio_codec,
-                                                   bool* created_new_payload) {
-  rtc::CritScope cs(&crit_sect_);
-
-#if RTC_DCHECK_IS_ON
-  RTC_DCHECK(!used_for_video_);
-  used_for_audio_ = true;
-#endif
-
-  *created_new_payload = false;
-  if (!IsPayloadTypeValid(audio_codec.pltype))
-    return -1;
-
-  auto it = payload_type_map_.find(audio_codec.pltype);
-  if (it != payload_type_map_.end()) {
-    // We already use this payload type. Check if it's the same as we already
-    // have. If same, ignore sending an error.
-    if (PayloadIsCompatible(it->second, audio_codec)) {
-      it->second.typeSpecific.Audio.rate = 0;
-      return 0;
-    }
-    LOG(LS_ERROR) << "Payload type already registered: " << audio_codec.pltype;
-    return -1;
-  }
-
-  // Audio codecs must be unique.
-  DeregisterAudioCodecOrRedTypeRegardlessOfPayloadType(audio_codec);
-
-  payload_type_map_[audio_codec.pltype] = CreatePayloadType(audio_codec);
-  *created_new_payload = true;
-
-  // Successful set of payload type, clear the value of last received payload
-  // type since it might mean something else.
-  last_received_payload_type_ = -1;
-  last_received_media_payload_type_ = -1;
-  return 0;
-}
-
-int32_t RTPPayloadRegistry::RegisterReceivePayload(
-    const VideoCodec& video_codec) {
-  rtc::CritScope cs(&crit_sect_);
-
-#if RTC_DCHECK_IS_ON
-  RTC_DCHECK(!used_for_audio_);
-  used_for_video_ = true;
-#endif
-
-  if (!IsPayloadTypeValid(video_codec.plType))
-    return -1;
-
-  auto it = payload_type_map_.find(video_codec.plType);
-  if (it != payload_type_map_.end()) {
-    // We already use this payload type. Check if it's the same as we already
-    // have. If same, ignore sending an error.
-    if (PayloadIsCompatible(it->second, video_codec))
-      return 0;
-    LOG(LS_ERROR) << "Payload type already registered: "
-                  << static_cast<int>(video_codec.plType);
-    return -1;
-  }
-
-  payload_type_map_[video_codec.plType] = CreatePayloadType(video_codec);
-
-  // Successful set of payload type, clear the value of last received payload
-  // type since it might mean something else.
-  last_received_payload_type_ = -1;
-  last_received_media_payload_type_ = -1;
-  return 0;
-}
-
-int32_t RTPPayloadRegistry::DeRegisterReceivePayload(
-    const int8_t payload_type) {
-  rtc::CritScope cs(&crit_sect_);
-  payload_type_map_.erase(payload_type);
-  return 0;
-}
-
-// There can't be several codecs with the same rate, frequency and channels
-// for audio codecs, but there can for video.
-// Always called from within a critical section.
-void RTPPayloadRegistry::DeregisterAudioCodecOrRedTypeRegardlessOfPayloadType(
-    const CodecInst& audio_codec) {
-  for (auto iterator = payload_type_map_.begin();
-       iterator != payload_type_map_.end(); ++iterator) {
-    if (PayloadIsCompatible(iterator->second, audio_codec)) {
-      // Remove old setting.
-      payload_type_map_.erase(iterator);
-      break;
-    }
-  }
-}
-
-int32_t RTPPayloadRegistry::ReceivePayloadType(const CodecInst& audio_codec,
-                                               int8_t* payload_type) const {
-  assert(payload_type);
-  rtc::CritScope cs(&crit_sect_);
-
-  for (const auto& it : payload_type_map_) {
-    if (PayloadIsCompatible(it.second, audio_codec)) {
-      *payload_type = it.first;
-      return 0;
-    }
-  }
-  return -1;
-}
-
-int32_t RTPPayloadRegistry::ReceivePayloadType(const VideoCodec& video_codec,
-                                               int8_t* payload_type) const {
-  assert(payload_type);
-  rtc::CritScope cs(&crit_sect_);
-
-  for (const auto& it : payload_type_map_) {
-    if (PayloadIsCompatible(it.second, video_codec)) {
-      *payload_type = it.first;
-      return 0;
-    }
-  }
-  return -1;
-}
-
-bool RTPPayloadRegistry::RtxEnabled() const {
-  rtc::CritScope cs(&crit_sect_);
-  return rtx_;
-}
-
-bool RTPPayloadRegistry::IsRtxInternal(const RTPHeader& header) const {
-  return rtx_ && ssrc_rtx_ == header.ssrc;
-}
-
-void RTPPayloadRegistry::SetRtxSsrc(uint32_t ssrc) {
-  rtc::CritScope cs(&crit_sect_);
-  ssrc_rtx_ = ssrc;
-  rtx_ = true;
-}
-
-bool RTPPayloadRegistry::GetRtxSsrc(uint32_t* ssrc) const {
-  rtc::CritScope cs(&crit_sect_);
-  *ssrc = ssrc_rtx_;
-  return rtx_;
-}
-
-void RTPPayloadRegistry::SetRtxPayloadType(int payload_type,
-                                           int associated_payload_type) {
-  rtc::CritScope cs(&crit_sect_);
-  if (payload_type < 0) {
-    LOG(LS_ERROR) << "Invalid RTX payload type: " << payload_type;
-    return;
-  }
-
-  rtx_payload_type_map_[payload_type] = associated_payload_type;
-  rtx_ = true;
-}
-
-bool RTPPayloadRegistry::IsRed(const RTPHeader& header) const {
-  rtc::CritScope cs(&crit_sect_);
-  auto it = payload_type_map_.find(header.payloadType);
-  return it != payload_type_map_.end() && _stricmp(it->second.name, "red") == 0;
-}
-
-bool RTPPayloadRegistry::GetPayloadSpecifics(uint8_t payload_type,
-                                             PayloadUnion* payload) const {
-  rtc::CritScope cs(&crit_sect_);
-  auto it = payload_type_map_.find(payload_type);
-
-  // Check that this is a registered payload type.
-  if (it == payload_type_map_.end()) {
-    return false;
-  }
-  *payload = it->second.typeSpecific;
-  return true;
-}
-
-int RTPPayloadRegistry::GetPayloadTypeFrequency(
-    uint8_t payload_type) const {
-  const RtpUtility::Payload* payload = PayloadTypeToPayload(payload_type);
-  if (!payload) {
-    return -1;
-  }
-  rtc::CritScope cs(&crit_sect_);
-  return payload->audio ? payload->typeSpecific.Audio.frequency
-                        : kVideoPayloadTypeFrequency;
-}
-
-const RtpUtility::Payload* RTPPayloadRegistry::PayloadTypeToPayload(
-    uint8_t payload_type) const {
-  rtc::CritScope cs(&crit_sect_);
-
-  auto it = payload_type_map_.find(payload_type);
-
-  // Check that this is a registered payload type.
-  if (it == payload_type_map_.end()) {
-    return nullptr;
-  }
-
-  return &it->second;
-}
-
-void RTPPayloadRegistry::SetIncomingPayloadType(const RTPHeader& header) {
-  rtc::CritScope cs(&crit_sect_);
-  if (!IsRtxInternal(header))
-    incoming_payload_type_ = header.payloadType;
-}
-
-bool RTPPayloadRegistry::ReportMediaPayloadType(uint8_t media_payload_type) {
-  rtc::CritScope cs(&crit_sect_);
-  if (last_received_media_payload_type_ == media_payload_type) {
-    // Media type unchanged.
-    return true;
-  }
-  last_received_media_payload_type_ = media_payload_type;
-  return false;
-}
-
-// Returns -1 if a payload with name |payload_name| is not registered.
-int8_t RTPPayloadRegistry::GetPayloadTypeWithName(
-    const char* payload_name) const {
-  rtc::CritScope cs(&crit_sect_);
-  for (const auto& it : payload_type_map_) {
-    if (_stricmp(it.second.name, payload_name) == 0)
-      return it.first;
-  }
-  return -1;
-}
-
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/rtp_payload_registry_unittest.cc b/modules/rtp_rtcp/source/rtp_payload_registry_unittest.cc
deleted file mode 100644
index 6e17eb9..0000000
--- a/modules/rtp_rtcp/source/rtp_payload_registry_unittest.cc
+++ /dev/null
@@ -1,265 +0,0 @@
-/*
- *  Copyright (c) 2013 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 <memory>
-
-#include "webrtc/common_types.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_header_parser.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_payload_registry.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_utility.h"
-#include "webrtc/test/gmock.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-using ::testing::Eq;
-using ::testing::Return;
-using ::testing::StrEq;
-using ::testing::_;
-
-static const char* kTypicalPayloadName = "name";
-static const size_t kTypicalChannels = 1;
-static const uint32_t kTypicalFrequency = 44000;
-static const CodecInst kTypicalAudioCodec = {-1 /* pltype */, "name",
-                                             kTypicalFrequency, 0 /* pacsize */,
-                                             kTypicalChannels};
-
-TEST(RtpPayloadRegistryTest,
-     RegistersAndRemembersVideoPayloadsUntilDeregistered) {
-  RTPPayloadRegistry rtp_payload_registry;
-  const uint8_t payload_type = 97;
-  VideoCodec video_codec;
-  video_codec.codecType = kVideoCodecVP8;
-  strncpy(video_codec.plName, "VP8", RTP_PAYLOAD_NAME_SIZE);
-  video_codec.plType = payload_type;
-
-  EXPECT_EQ(0, rtp_payload_registry.RegisterReceivePayload(video_codec));
-
-  const RtpUtility::Payload* retrieved_payload =
-      rtp_payload_registry.PayloadTypeToPayload(payload_type);
-  EXPECT_TRUE(retrieved_payload);
-
-  // We should get back the corresponding payload that we registered.
-  EXPECT_STREQ("VP8", retrieved_payload->name);
-  EXPECT_FALSE(retrieved_payload->audio);
-  EXPECT_EQ(kRtpVideoVp8, retrieved_payload->typeSpecific.Video.videoCodecType);
-
-  // Now forget about it and verify it's gone.
-  EXPECT_EQ(0, rtp_payload_registry.DeRegisterReceivePayload(payload_type));
-  EXPECT_FALSE(rtp_payload_registry.PayloadTypeToPayload(payload_type));
-}
-
-TEST(RtpPayloadRegistryTest,
-     RegistersAndRemembersAudioPayloadsUntilDeregistered) {
-  RTPPayloadRegistry rtp_payload_registry;
-  uint8_t payload_type = 97;
-  bool new_payload_created = false;
-  CodecInst audio_codec = kTypicalAudioCodec;
-  audio_codec.pltype = payload_type;
-  EXPECT_EQ(0, rtp_payload_registry.RegisterReceivePayload(
-                   audio_codec, &new_payload_created));
-
-  EXPECT_TRUE(new_payload_created) << "A new payload WAS created.";
-
-  const RtpUtility::Payload* retrieved_payload =
-      rtp_payload_registry.PayloadTypeToPayload(payload_type);
-  EXPECT_TRUE(retrieved_payload);
-
-  // We should get back the corresponding payload that we registered.
-  EXPECT_STREQ(kTypicalPayloadName, retrieved_payload->name);
-  EXPECT_TRUE(retrieved_payload->audio);
-  EXPECT_EQ(kTypicalFrequency, retrieved_payload->typeSpecific.Audio.frequency);
-  EXPECT_EQ(kTypicalChannels, retrieved_payload->typeSpecific.Audio.channels);
-
-  // Now forget about it and verify it's gone.
-  EXPECT_EQ(0, rtp_payload_registry.DeRegisterReceivePayload(payload_type));
-  EXPECT_FALSE(rtp_payload_registry.PayloadTypeToPayload(payload_type));
-}
-
-TEST(RtpPayloadRegistryTest, AudioRedWorkProperly) {
-  const uint8_t kRedPayloadType = 127;
-  const int kRedSampleRate = 8000;
-  const size_t kRedChannels = 1;
-
-  RTPPayloadRegistry rtp_payload_registry;
-
-  bool new_payload_created = false;
-  CodecInst red_audio_codec;
-  strncpy(red_audio_codec.plname, "red", RTP_PAYLOAD_NAME_SIZE);
-  red_audio_codec.pltype = kRedPayloadType;
-  red_audio_codec.plfreq = kRedSampleRate;
-  red_audio_codec.channels = kRedChannels;
-  EXPECT_EQ(0, rtp_payload_registry.RegisterReceivePayload(
-                   red_audio_codec, &new_payload_created));
-  EXPECT_TRUE(new_payload_created);
-
-  EXPECT_EQ(kRedPayloadType, rtp_payload_registry.red_payload_type());
-
-  const RtpUtility::Payload* retrieved_payload =
-      rtp_payload_registry.PayloadTypeToPayload(kRedPayloadType);
-  EXPECT_TRUE(retrieved_payload);
-  EXPECT_TRUE(retrieved_payload->audio);
-  EXPECT_STRCASEEQ("red", retrieved_payload->name);
-
-  // Sample rate is correctly registered.
-  EXPECT_EQ(kRedSampleRate,
-            rtp_payload_registry.GetPayloadTypeFrequency(kRedPayloadType));
-}
-
-TEST(RtpPayloadRegistryTest,
-     DoesNotAcceptSamePayloadTypeTwiceExceptIfPayloadIsCompatible) {
-  uint8_t payload_type = 97;
-  RTPPayloadRegistry rtp_payload_registry;
-
-  bool ignored = false;
-  CodecInst audio_codec = kTypicalAudioCodec;
-  audio_codec.pltype = payload_type;
-  EXPECT_EQ(0,
-            rtp_payload_registry.RegisterReceivePayload(audio_codec, &ignored));
-
-  CodecInst audio_codec_2 = kTypicalAudioCodec;
-  audio_codec_2.pltype = payload_type;
-  // Make |audio_codec_2| incompatible with |audio_codec| by changing
-  // the frequency.
-  audio_codec_2.plfreq = kTypicalFrequency + 1;
-  EXPECT_EQ(
-      -1, rtp_payload_registry.RegisterReceivePayload(audio_codec_2, &ignored))
-      << "Adding incompatible codec with same payload type = bad.";
-
-  // Change payload type.
-  audio_codec_2.pltype = payload_type - 1;
-  EXPECT_EQ(
-      0, rtp_payload_registry.RegisterReceivePayload(audio_codec_2, &ignored))
-      << "With a different payload type is fine though.";
-
-  // Ensure both payloads are preserved.
-  const RtpUtility::Payload* retrieved_payload =
-      rtp_payload_registry.PayloadTypeToPayload(payload_type);
-  EXPECT_TRUE(retrieved_payload);
-  EXPECT_STREQ(kTypicalPayloadName, retrieved_payload->name);
-  EXPECT_TRUE(retrieved_payload->audio);
-  EXPECT_EQ(kTypicalFrequency, retrieved_payload->typeSpecific.Audio.frequency);
-  EXPECT_EQ(kTypicalChannels, retrieved_payload->typeSpecific.Audio.channels);
-
-  retrieved_payload =
-      rtp_payload_registry.PayloadTypeToPayload(payload_type - 1);
-  EXPECT_TRUE(retrieved_payload);
-  EXPECT_STREQ(kTypicalPayloadName, retrieved_payload->name);
-  EXPECT_TRUE(retrieved_payload->audio);
-  EXPECT_EQ(kTypicalFrequency + 1,
-            retrieved_payload->typeSpecific.Audio.frequency);
-  EXPECT_EQ(kTypicalChannels, retrieved_payload->typeSpecific.Audio.channels);
-
-  // Ok, update the rate for one of the codecs. If either the incoming rate or
-  // the stored rate is zero it's not really an error to register the same
-  // codec twice, and in that case roughly the following happens.
-  EXPECT_EQ(0,
-            rtp_payload_registry.RegisterReceivePayload(audio_codec, &ignored));
-}
-
-TEST(RtpPayloadRegistryTest,
-     RemovesCompatibleCodecsOnRegistryIfCodecsMustBeUnique) {
-  uint8_t payload_type = 97;
-  RTPPayloadRegistry rtp_payload_registry;
-
-  bool ignored = false;
-  CodecInst audio_codec = kTypicalAudioCodec;
-  audio_codec.pltype = payload_type;
-  EXPECT_EQ(0,
-            rtp_payload_registry.RegisterReceivePayload(audio_codec, &ignored));
-  CodecInst audio_codec_2 = kTypicalAudioCodec;
-  audio_codec_2.pltype = payload_type - 1;
-  EXPECT_EQ(
-      0, rtp_payload_registry.RegisterReceivePayload(audio_codec_2, &ignored));
-
-  EXPECT_FALSE(rtp_payload_registry.PayloadTypeToPayload(payload_type))
-      << "The first payload should be "
-         "deregistered because the only thing that differs is payload type.";
-  EXPECT_TRUE(rtp_payload_registry.PayloadTypeToPayload(payload_type - 1))
-      << "The second payload should still be registered though.";
-
-  // Now ensure non-compatible codecs aren't removed. Make |audio_codec_3|
-  // incompatible by changing the frequency.
-  CodecInst audio_codec_3 = kTypicalAudioCodec;
-  audio_codec_3.pltype = payload_type + 1;
-  audio_codec_3.plfreq = kTypicalFrequency + 1;
-  EXPECT_EQ(
-      0, rtp_payload_registry.RegisterReceivePayload(audio_codec_3, &ignored));
-
-  EXPECT_TRUE(rtp_payload_registry.PayloadTypeToPayload(payload_type - 1))
-      << "Not compatible; both payloads should be kept.";
-  EXPECT_TRUE(rtp_payload_registry.PayloadTypeToPayload(payload_type + 1))
-      << "Not compatible; both payloads should be kept.";
-}
-
-TEST(RtpPayloadRegistryTest,
-     LastReceivedCodecTypesAreResetWhenRegisteringNewPayloadTypes) {
-  RTPPayloadRegistry rtp_payload_registry;
-  rtp_payload_registry.set_last_received_payload_type(17);
-  EXPECT_EQ(17, rtp_payload_registry.last_received_payload_type());
-
-  bool media_type_unchanged = rtp_payload_registry.ReportMediaPayloadType(18);
-  EXPECT_FALSE(media_type_unchanged);
-  media_type_unchanged = rtp_payload_registry.ReportMediaPayloadType(18);
-  EXPECT_TRUE(media_type_unchanged);
-
-  bool ignored;
-  CodecInst audio_codec = kTypicalAudioCodec;
-  audio_codec.pltype = 34;
-  EXPECT_EQ(0,
-            rtp_payload_registry.RegisterReceivePayload(audio_codec, &ignored));
-
-  EXPECT_EQ(-1, rtp_payload_registry.last_received_payload_type());
-  media_type_unchanged = rtp_payload_registry.ReportMediaPayloadType(18);
-  EXPECT_FALSE(media_type_unchanged);
-}
-
-class ParameterizedRtpPayloadRegistryTest
-    : public ::testing::TestWithParam<int> {};
-
-TEST_P(ParameterizedRtpPayloadRegistryTest,
-       FailsToRegisterKnownPayloadsWeAreNotInterestedIn) {
-  RTPPayloadRegistry rtp_payload_registry;
-
-  bool ignored;
-  CodecInst audio_codec;
-  strncpy(audio_codec.plname, "whatever", RTP_PAYLOAD_NAME_SIZE);
-  audio_codec.pltype = GetParam();
-  audio_codec.plfreq = 1900;
-  audio_codec.channels = 1;
-  EXPECT_EQ(-1,
-            rtp_payload_registry.RegisterReceivePayload(audio_codec, &ignored));
-}
-
-INSTANTIATE_TEST_CASE_P(TestKnownBadPayloadTypes,
-                        ParameterizedRtpPayloadRegistryTest,
-                        testing::Values(64, 72, 73, 74, 75, 76, 77, 78, 79));
-
-class RtpPayloadRegistryGenericTest : public ::testing::TestWithParam<int> {};
-
-TEST_P(RtpPayloadRegistryGenericTest, RegisterGenericReceivePayloadType) {
-  RTPPayloadRegistry rtp_payload_registry;
-
-  bool ignored;
-  CodecInst audio_codec;
-  // Dummy values, except for payload_type.
-  strncpy(audio_codec.plname, "generic-codec", RTP_PAYLOAD_NAME_SIZE);
-  audio_codec.pltype = GetParam();
-  audio_codec.plfreq = 1900;
-  audio_codec.channels = 1;
-  EXPECT_EQ(0,
-            rtp_payload_registry.RegisterReceivePayload(audio_codec, &ignored));
-}
-
-INSTANTIATE_TEST_CASE_P(TestDynamicRange,
-                        RtpPayloadRegistryGenericTest,
-                        testing::Range(96, 127 + 1));
-
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/rtp_receiver_audio.cc b/modules/rtp_rtcp/source/rtp_receiver_audio.cc
deleted file mode 100644
index 4265ba5..0000000
--- a/modules/rtp_rtcp/source/rtp_receiver_audio.cc
+++ /dev/null
@@ -1,313 +0,0 @@
-/*
- *  Copyright (c) 2012 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/rtp_rtcp/source/rtp_receiver_audio.h"
-
-#include <assert.h>  // assert
-#include <math.h>   // pow()
-#include <string.h>  // memcpy()
-
-#include "webrtc/common_types.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/trace_event.h"
-
-namespace webrtc {
-RTPReceiverStrategy* RTPReceiverStrategy::CreateAudioStrategy(
-    RtpData* data_callback) {
-  return new RTPReceiverAudio(data_callback);
-}
-
-RTPReceiverAudio::RTPReceiverAudio(RtpData* data_callback)
-    : RTPReceiverStrategy(data_callback),
-      TelephoneEventHandler(),
-      telephone_event_forward_to_decoder_(false),
-      telephone_event_payload_type_(-1),
-      cng_nb_payload_type_(-1),
-      cng_wb_payload_type_(-1),
-      cng_swb_payload_type_(-1),
-      cng_fb_payload_type_(-1),
-      num_energy_(0),
-      current_remote_energy_() {
-  last_payload_.Audio.channels = 1;
-  memset(current_remote_energy_, 0, sizeof(current_remote_energy_));
-}
-
-// Outband TelephoneEvent(DTMF) detection
-void RTPReceiverAudio::SetTelephoneEventForwardToDecoder(
-    bool forward_to_decoder) {
-  rtc::CritScope lock(&crit_sect_);
-  telephone_event_forward_to_decoder_ = forward_to_decoder;
-}
-
-// Is forwarding of outband telephone events turned on/off?
-bool RTPReceiverAudio::TelephoneEventForwardToDecoder() const {
-  rtc::CritScope lock(&crit_sect_);
-  return telephone_event_forward_to_decoder_;
-}
-
-bool RTPReceiverAudio::TelephoneEventPayloadType(
-    int8_t payload_type) const {
-  rtc::CritScope lock(&crit_sect_);
-  return telephone_event_payload_type_ == payload_type;
-}
-
-bool RTPReceiverAudio::CNGPayloadType(int8_t payload_type) {
-  rtc::CritScope lock(&crit_sect_);
-  return payload_type == cng_nb_payload_type_ ||
-         payload_type == cng_wb_payload_type_ ||
-         payload_type == cng_swb_payload_type_ ||
-         payload_type == cng_fb_payload_type_;
-}
-
-bool RTPReceiverAudio::ShouldReportCsrcChanges(uint8_t payload_type) const {
-  // Don't do this for DTMF packets, otherwise it's fine.
-  return !TelephoneEventPayloadType(payload_type);
-}
-
-// -   Sample based or frame based codecs based on RFC 3551
-// -
-// -   NOTE! There is one error in the RFC, stating G.722 uses 8 bits/samples.
-// -   The correct rate is 4 bits/sample.
-// -
-// -   name of                              sampling              default
-// -   encoding  sample/frame  bits/sample      rate  ms/frame  ms/packet
-// -
-// -   Sample based audio codecs
-// -   DVI4      sample        4                var.                   20
-// -   G722      sample        4              16,000                   20
-// -   G726-40   sample        5               8,000                   20
-// -   G726-32   sample        4               8,000                   20
-// -   G726-24   sample        3               8,000                   20
-// -   G726-16   sample        2               8,000                   20
-// -   L8        sample        8                var.                   20
-// -   L16       sample        16               var.                   20
-// -   PCMA      sample        8                var.                   20
-// -   PCMU      sample        8                var.                   20
-// -
-// -   Frame based audio codecs
-// -   G723      frame         N/A             8,000        30         30
-// -   G728      frame         N/A             8,000       2.5         20
-// -   G729      frame         N/A             8,000        10         20
-// -   G729D     frame         N/A             8,000        10         20
-// -   G729E     frame         N/A             8,000        10         20
-// -   GSM       frame         N/A             8,000        20         20
-// -   GSM-EFR   frame         N/A             8,000        20         20
-// -   LPC       frame         N/A             8,000        20         20
-// -   MPA       frame         N/A              var.      var.
-// -
-// -   G7221     frame         N/A
-int32_t RTPReceiverAudio::OnNewPayloadTypeCreated(
-    const CodecInst& audio_codec) {
-  rtc::CritScope lock(&crit_sect_);
-
-  if (RtpUtility::StringCompare(audio_codec.plname, "telephone-event", 15)) {
-    telephone_event_payload_type_ = audio_codec.pltype;
-  }
-  if (RtpUtility::StringCompare(audio_codec.plname, "cn", 2)) {
-    // We support comfort noise at four different frequencies.
-    if (audio_codec.plfreq == 8000) {
-      cng_nb_payload_type_ = audio_codec.pltype;
-    } else if (audio_codec.plfreq == 16000) {
-      cng_wb_payload_type_ = audio_codec.pltype;
-    } else if (audio_codec.plfreq == 32000) {
-      cng_swb_payload_type_ = audio_codec.pltype;
-    } else if (audio_codec.plfreq == 48000) {
-      cng_fb_payload_type_ = audio_codec.pltype;
-    } else {
-      assert(false);
-      return -1;
-    }
-  }
-  return 0;
-}
-
-int32_t RTPReceiverAudio::ParseRtpPacket(WebRtcRTPHeader* rtp_header,
-                                         const PayloadUnion& specific_payload,
-                                         bool is_red,
-                                         const uint8_t* payload,
-                                         size_t payload_length,
-                                         int64_t timestamp_ms,
-                                         bool is_first_packet) {
-  TRACE_EVENT2(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), "Audio::ParseRtp",
-               "seqnum", rtp_header->header.sequenceNumber, "timestamp",
-               rtp_header->header.timestamp);
-  rtp_header->type.Audio.numEnergy = rtp_header->header.numCSRCs;
-  num_energy_ = rtp_header->type.Audio.numEnergy;
-  if (rtp_header->type.Audio.numEnergy > 0 &&
-      rtp_header->type.Audio.numEnergy <= kRtpCsrcSize) {
-    memcpy(current_remote_energy_,
-           rtp_header->type.Audio.arrOfEnergy,
-           rtp_header->type.Audio.numEnergy);
-  }
-
-  if (first_packet_received_()) {
-    LOG(LS_INFO) << "Received first audio RTP packet";
-  }
-
-  return ParseAudioCodecSpecific(rtp_header,
-                                 payload,
-                                 payload_length,
-                                 specific_payload.Audio,
-                                 is_red);
-}
-
-RTPAliveType RTPReceiverAudio::ProcessDeadOrAlive(
-    uint16_t last_payload_length) const {
-
-  // Our CNG is 9 bytes; if it's a likely CNG the receiver needs to check
-  // kRtpNoRtp against NetEq speech_type kOutputPLCtoCNG.
-  if (last_payload_length < 10) {  // our CNG is 9 bytes
-    return kRtpNoRtp;
-  } else {
-    return kRtpDead;
-  }
-}
-
-void RTPReceiverAudio::CheckPayloadChanged(int8_t payload_type,
-                                           PayloadUnion* /* specific_payload */,
-                                           bool* should_discard_changes) {
-  *should_discard_changes =
-      TelephoneEventPayloadType(payload_type) || CNGPayloadType(payload_type);
-}
-
-int RTPReceiverAudio::Energy(uint8_t array_of_energy[kRtpCsrcSize]) const {
-  rtc::CritScope cs(&crit_sect_);
-
-  assert(num_energy_ <= kRtpCsrcSize);
-
-  if (num_energy_ > 0) {
-    memcpy(array_of_energy, current_remote_energy_,
-           sizeof(uint8_t) * num_energy_);
-  }
-  return num_energy_;
-}
-
-int32_t RTPReceiverAudio::InvokeOnInitializeDecoder(
-    RtpFeedback* callback,
-    int8_t payload_type,
-    const char payload_name[RTP_PAYLOAD_NAME_SIZE],
-    const PayloadUnion& specific_payload) const {
-  if (-1 ==
-      callback->OnInitializeDecoder(
-          payload_type, payload_name, specific_payload.Audio.frequency,
-          specific_payload.Audio.channels, specific_payload.Audio.rate)) {
-    LOG(LS_ERROR) << "Failed to create decoder for payload type: "
-                  << payload_name << "/" << static_cast<int>(payload_type);
-    return -1;
-  }
-  return 0;
-}
-
-// We are not allowed to have any critsects when calling data_callback.
-int32_t RTPReceiverAudio::ParseAudioCodecSpecific(
-    WebRtcRTPHeader* rtp_header,
-    const uint8_t* payload_data,
-    size_t payload_length,
-    const AudioPayload& audio_specific,
-    bool is_red) {
-  RTC_DCHECK_GE(payload_length, rtp_header->header.paddingLength);
-  const size_t payload_data_length =
-      payload_length - rtp_header->header.paddingLength;
-  if (payload_data_length == 0) {
-    rtp_header->type.Audio.isCNG = false;
-    rtp_header->frameType = kEmptyFrame;
-    return data_callback_->OnReceivedPayloadData(nullptr, 0, rtp_header);
-  }
-
-  bool telephone_event_packet =
-      TelephoneEventPayloadType(rtp_header->header.payloadType);
-  if (telephone_event_packet) {
-    rtc::CritScope lock(&crit_sect_);
-
-    // RFC 4733 2.3
-    // 0                   1                   2                   3
-    // 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
-    // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-    // |     event     |E|R| volume    |          duration             |
-    // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-    //
-    if (payload_data_length % 4 != 0) {
-      return -1;
-    }
-    size_t number_of_events = payload_data_length / 4;
-
-    // sanity
-    if (number_of_events >= MAX_NUMBER_OF_PARALLEL_TELEPHONE_EVENTS) {
-      number_of_events = MAX_NUMBER_OF_PARALLEL_TELEPHONE_EVENTS;
-    }
-    for (size_t n = 0; n < number_of_events; ++n) {
-      RTC_DCHECK_GE(payload_data_length, (4 * n) + 2);
-      bool end = (payload_data[(4 * n) + 1] & 0x80) ? true : false;
-
-      std::set<uint8_t>::iterator event =
-          telephone_event_reported_.find(payload_data[4 * n]);
-
-      if (event != telephone_event_reported_.end()) {
-        // we have already seen this event
-        if (end) {
-          telephone_event_reported_.erase(payload_data[4 * n]);
-        }
-      } else {
-        if (end) {
-          // don't add if it's a end of a tone
-        } else {
-          telephone_event_reported_.insert(payload_data[4 * n]);
-        }
-      }
-    }
-
-    // RFC 4733 2.5.1.3 & 2.5.2.3 Long-Duration Events
-    // should not be a problem since we don't care about the duration
-
-    // RFC 4733 See 2.5.1.5. & 2.5.2.4.  Multiple Events in a Packet
-  }
-
-  {
-    rtc::CritScope lock(&crit_sect_);
-
-    // Check if this is a CNG packet, receiver might want to know
-    if (CNGPayloadType(rtp_header->header.payloadType)) {
-      rtp_header->type.Audio.isCNG = true;
-      rtp_header->frameType = kAudioFrameCN;
-    } else {
-      rtp_header->frameType = kAudioFrameSpeech;
-      rtp_header->type.Audio.isCNG = false;
-    }
-
-    // check if it's a DTMF event, hence something we can playout
-    if (telephone_event_packet) {
-      if (!telephone_event_forward_to_decoder_) {
-        // don't forward event to decoder
-        return 0;
-      }
-      std::set<uint8_t>::iterator first =
-          telephone_event_reported_.begin();
-      if (first != telephone_event_reported_.end() && *first > 15) {
-        // don't forward non DTMF events
-        return 0;
-      }
-    }
-  }
-  // TODO(holmer): Break this out to have RED parsing handled generically.
-  RTC_DCHECK_GT(payload_data_length, 0);
-  if (is_red && !(payload_data[0] & 0x80)) {
-    // we recive only one frame packed in a RED packet remove the RED wrapper
-    rtp_header->header.payloadType = payload_data[0];
-
-    // only one frame in the RED strip the one byte to help NetEq
-    return data_callback_->OnReceivedPayloadData(
-        payload_data + 1, payload_data_length - 1, rtp_header);
-  }
-
-  rtp_header->type.Audio.channel = audio_specific.channels;
-  return data_callback_->OnReceivedPayloadData(payload_data,
-                                               payload_data_length, rtp_header);
-}
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/rtp_receiver_audio.h b/modules/rtp_rtcp/source/rtp_receiver_audio.h
deleted file mode 100644
index fd8238a..0000000
--- a/modules/rtp_rtcp/source/rtp_receiver_audio.h
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- *  Copyright (c) 2012 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_RTP_RTCP_SOURCE_RTP_RECEIVER_AUDIO_H_
-#define WEBRTC_MODULES_RTP_RTCP_SOURCE_RTP_RECEIVER_AUDIO_H_
-
-#include <set>
-
-#include "webrtc/modules/rtp_rtcp/include/rtp_receiver.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_receiver_strategy.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_utility.h"
-#include "webrtc/rtc_base/onetimeevent.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-// Handles audio RTP packets. This class is thread-safe.
-class RTPReceiverAudio : public RTPReceiverStrategy,
-                         public TelephoneEventHandler {
- public:
-  explicit RTPReceiverAudio(RtpData* data_callback);
-  virtual ~RTPReceiverAudio() {}
-
-  // The following three methods implement the TelephoneEventHandler interface.
-  // Forward DTMFs to decoder for playout.
-  void SetTelephoneEventForwardToDecoder(bool forward_to_decoder) override;
-
-  // Is forwarding of outband telephone events turned on/off?
-  bool TelephoneEventForwardToDecoder() const override;
-
-  // Is TelephoneEvent configured with |payload_type|.
-  bool TelephoneEventPayloadType(const int8_t payload_type) const override;
-
-  TelephoneEventHandler* GetTelephoneEventHandler() override { return this; }
-
-  // Returns true if CNG is configured with |payload_type|.
-  bool CNGPayloadType(const int8_t payload_type);
-
-  int32_t ParseRtpPacket(WebRtcRTPHeader* rtp_header,
-                         const PayloadUnion& specific_payload,
-                         bool is_red,
-                         const uint8_t* packet,
-                         size_t payload_length,
-                         int64_t timestamp_ms,
-                         bool is_first_packet) override;
-
-  RTPAliveType ProcessDeadOrAlive(uint16_t last_payload_length) const override;
-
-  bool ShouldReportCsrcChanges(uint8_t payload_type) const override;
-
-  int32_t OnNewPayloadTypeCreated(const CodecInst& audio_codec) override;
-
-  int32_t InvokeOnInitializeDecoder(
-      RtpFeedback* callback,
-      int8_t payload_type,
-      const char payload_name[RTP_PAYLOAD_NAME_SIZE],
-      const PayloadUnion& specific_payload) const override;
-
-  // We need to look out for special payload types here and sometimes reset
-  // statistics. In addition we sometimes need to tweak the frequency.
-  void CheckPayloadChanged(int8_t payload_type,
-                           PayloadUnion* specific_payload,
-                           bool* should_discard_changes) override;
-
-  int Energy(uint8_t array_of_energy[kRtpCsrcSize]) const override;
-
- private:
-  int32_t ParseAudioCodecSpecific(WebRtcRTPHeader* rtp_header,
-                                  const uint8_t* payload_data,
-                                  size_t payload_length,
-                                  const AudioPayload& audio_specific,
-                                  bool is_red);
-
-  bool telephone_event_forward_to_decoder_;
-  int8_t telephone_event_payload_type_;
-  std::set<uint8_t> telephone_event_reported_;
-
-  int8_t cng_nb_payload_type_;
-  int8_t cng_wb_payload_type_;
-  int8_t cng_swb_payload_type_;
-  int8_t cng_fb_payload_type_;
-
-  uint8_t num_energy_;
-  uint8_t current_remote_energy_[kRtpCsrcSize];
-
-  ThreadUnsafeOneTimeEvent first_packet_received_;
-};
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_RTP_RTCP_SOURCE_RTP_RECEIVER_AUDIO_H_
diff --git a/modules/rtp_rtcp/source/rtp_receiver_impl.cc b/modules/rtp_rtcp/source/rtp_receiver_impl.cc
deleted file mode 100644
index ed0383f..0000000
--- a/modules/rtp_rtcp/source/rtp_receiver_impl.cc
+++ /dev/null
@@ -1,560 +0,0 @@
-/*
- *  Copyright (c) 2012 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/rtp_rtcp/source/rtp_receiver_impl.h"
-
-#include <assert.h>
-#include <math.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include <set>
-#include <vector>
-
-#include "webrtc/common_types.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_payload_registry.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_receiver_strategy.h"
-#include "webrtc/rtc_base/logging.h"
-
-namespace webrtc {
-
-using RtpUtility::Payload;
-
-// Only return the sources in the last 10 seconds.
-const int64_t kGetSourcesTimeoutMs = 10000;
-
-RtpReceiver* RtpReceiver::CreateVideoReceiver(
-    Clock* clock,
-    RtpData* incoming_payload_callback,
-    RtpFeedback* incoming_messages_callback,
-    RTPPayloadRegistry* rtp_payload_registry) {
-  RTC_DCHECK(incoming_payload_callback != nullptr);
-  if (!incoming_messages_callback)
-    incoming_messages_callback = NullObjectRtpFeedback();
-  return new RtpReceiverImpl(
-      clock, incoming_messages_callback, rtp_payload_registry,
-      RTPReceiverStrategy::CreateVideoStrategy(incoming_payload_callback));
-}
-
-RtpReceiver* RtpReceiver::CreateAudioReceiver(
-    Clock* clock,
-    RtpData* incoming_payload_callback,
-    RtpFeedback* incoming_messages_callback,
-    RTPPayloadRegistry* rtp_payload_registry) {
-  RTC_DCHECK(incoming_payload_callback != nullptr);
-  if (!incoming_messages_callback)
-    incoming_messages_callback = NullObjectRtpFeedback();
-  return new RtpReceiverImpl(
-      clock, incoming_messages_callback, rtp_payload_registry,
-      RTPReceiverStrategy::CreateAudioStrategy(incoming_payload_callback));
-}
-
-RtpReceiverImpl::RtpReceiverImpl(Clock* clock,
-                                 RtpFeedback* incoming_messages_callback,
-                                 RTPPayloadRegistry* rtp_payload_registry,
-                                 RTPReceiverStrategy* rtp_media_receiver)
-    : clock_(clock),
-      rtp_payload_registry_(rtp_payload_registry),
-      rtp_media_receiver_(rtp_media_receiver),
-      cb_rtp_feedback_(incoming_messages_callback),
-      last_receive_time_(0),
-      last_received_payload_length_(0),
-      ssrc_(0),
-      num_csrcs_(0),
-      current_remote_csrc_(),
-      last_received_timestamp_(0),
-      last_received_frame_time_ms_(-1),
-      last_received_sequence_number_(0) {
-  assert(incoming_messages_callback);
-
-  memset(current_remote_csrc_, 0, sizeof(current_remote_csrc_));
-}
-
-RtpReceiverImpl::~RtpReceiverImpl() {
-  for (int i = 0; i < num_csrcs_; ++i) {
-    cb_rtp_feedback_->OnIncomingCSRCChanged(current_remote_csrc_[i], false);
-  }
-}
-
-int32_t RtpReceiverImpl::RegisterReceivePayload(const CodecInst& audio_codec) {
-  rtc::CritScope lock(&critical_section_rtp_receiver_);
-
-  // TODO(phoglund): Try to streamline handling of the RED codec and some other
-  // cases which makes it necessary to keep track of whether we created a
-  // payload or not.
-  bool created_new_payload = false;
-  int32_t result = rtp_payload_registry_->RegisterReceivePayload(
-      audio_codec, &created_new_payload);
-  if (created_new_payload) {
-    if (rtp_media_receiver_->OnNewPayloadTypeCreated(audio_codec) != 0) {
-      LOG(LS_ERROR) << "Failed to register payload: " << audio_codec.plname
-                    << "/" << static_cast<int>(audio_codec.pltype);
-      return -1;
-    }
-  }
-  return result;
-}
-
-int32_t RtpReceiverImpl::RegisterReceivePayload(const VideoCodec& video_codec) {
-  rtc::CritScope lock(&critical_section_rtp_receiver_);
-  return rtp_payload_registry_->RegisterReceivePayload(video_codec);
-}
-
-int32_t RtpReceiverImpl::DeRegisterReceivePayload(
-    const int8_t payload_type) {
-  rtc::CritScope lock(&critical_section_rtp_receiver_);
-  return rtp_payload_registry_->DeRegisterReceivePayload(payload_type);
-}
-
-uint32_t RtpReceiverImpl::SSRC() const {
-  rtc::CritScope lock(&critical_section_rtp_receiver_);
-  return ssrc_;
-}
-
-// Get remote CSRC.
-int32_t RtpReceiverImpl::CSRCs(uint32_t array_of_csrcs[kRtpCsrcSize]) const {
-  rtc::CritScope lock(&critical_section_rtp_receiver_);
-
-  assert(num_csrcs_ <= kRtpCsrcSize);
-
-  if (num_csrcs_ > 0) {
-    memcpy(array_of_csrcs, current_remote_csrc_, sizeof(uint32_t)*num_csrcs_);
-  }
-  return num_csrcs_;
-}
-
-int32_t RtpReceiverImpl::Energy(
-    uint8_t array_of_energy[kRtpCsrcSize]) const {
-  return rtp_media_receiver_->Energy(array_of_energy);
-}
-
-bool RtpReceiverImpl::IncomingRtpPacket(
-  const RTPHeader& rtp_header,
-  const uint8_t* payload,
-  size_t payload_length,
-  PayloadUnion payload_specific,
-  bool in_order) {
-  // Trigger our callbacks.
-  CheckSSRCChanged(rtp_header);
-
-  int8_t first_payload_byte = payload_length > 0 ? payload[0] : 0;
-  bool is_red = false;
-
-  if (CheckPayloadChanged(rtp_header, first_payload_byte, &is_red,
-                          &payload_specific) == -1) {
-    if (payload_length == 0) {
-      // OK, keep-alive packet.
-      return true;
-    }
-    LOG(LS_WARNING) << "Receiving invalid payload type.";
-    return false;
-  }
-
-  WebRtcRTPHeader webrtc_rtp_header;
-  memset(&webrtc_rtp_header, 0, sizeof(webrtc_rtp_header));
-  webrtc_rtp_header.header = rtp_header;
-  CheckCSRC(webrtc_rtp_header);
-
-  auto audio_level =
-      rtp_header.extension.hasAudioLevel
-          ? rtc::Optional<uint8_t>(rtp_header.extension.audioLevel)
-          : rtc::Optional<uint8_t>();
-  UpdateSources(audio_level);
-
-  size_t payload_data_length = payload_length - rtp_header.paddingLength;
-
-  bool is_first_packet_in_frame = false;
-  {
-    rtc::CritScope lock(&critical_section_rtp_receiver_);
-    if (HaveReceivedFrame()) {
-      is_first_packet_in_frame =
-          last_received_sequence_number_ + 1 == rtp_header.sequenceNumber &&
-          last_received_timestamp_ != rtp_header.timestamp;
-    } else {
-      is_first_packet_in_frame = true;
-    }
-  }
-
-  int32_t ret_val = rtp_media_receiver_->ParseRtpPacket(
-      &webrtc_rtp_header, payload_specific, is_red, payload, payload_length,
-      clock_->TimeInMilliseconds(), is_first_packet_in_frame);
-
-  if (ret_val < 0) {
-    return false;
-  }
-
-  {
-    rtc::CritScope lock(&critical_section_rtp_receiver_);
-
-    last_receive_time_ = clock_->TimeInMilliseconds();
-    last_received_payload_length_ = payload_data_length;
-
-    if (in_order) {
-      if (last_received_timestamp_ != rtp_header.timestamp) {
-        last_received_timestamp_ = rtp_header.timestamp;
-        last_received_frame_time_ms_ = clock_->TimeInMilliseconds();
-      }
-      last_received_sequence_number_ = rtp_header.sequenceNumber;
-    }
-  }
-  return true;
-}
-
-TelephoneEventHandler* RtpReceiverImpl::GetTelephoneEventHandler() {
-  return rtp_media_receiver_->GetTelephoneEventHandler();
-}
-
-std::vector<RtpSource> RtpReceiverImpl::GetSources() const {
-  rtc::CritScope lock(&critical_section_rtp_receiver_);
-
-  int64_t now_ms = clock_->TimeInMilliseconds();
-  std::vector<RtpSource> sources;
-
-  RTC_DCHECK(std::is_sorted(ssrc_sources_.begin(), ssrc_sources_.end(),
-                            [](const RtpSource& lhs, const RtpSource& rhs) {
-                              return lhs.timestamp_ms() < rhs.timestamp_ms();
-                            }));
-  RTC_DCHECK(std::is_sorted(csrc_sources_.begin(), csrc_sources_.end(),
-                            [](const RtpSource& lhs, const RtpSource& rhs) {
-                              return lhs.timestamp_ms() < rhs.timestamp_ms();
-                            }));
-
-  std::set<uint32_t> selected_ssrcs;
-  for (auto rit = ssrc_sources_.rbegin(); rit != ssrc_sources_.rend(); ++rit) {
-    if ((now_ms - rit->timestamp_ms()) > kGetSourcesTimeoutMs) {
-      break;
-    }
-    if (selected_ssrcs.insert(rit->source_id()).second) {
-      sources.push_back(*rit);
-    }
-  }
-
-  for (auto rit = csrc_sources_.rbegin(); rit != csrc_sources_.rend(); ++rit) {
-    if ((now_ms - rit->timestamp_ms()) > kGetSourcesTimeoutMs) {
-      break;
-    }
-    sources.push_back(*rit);
-  }
-  return sources;
-}
-
-bool RtpReceiverImpl::Timestamp(uint32_t* timestamp) const {
-  rtc::CritScope lock(&critical_section_rtp_receiver_);
-  if (!HaveReceivedFrame())
-    return false;
-  *timestamp = last_received_timestamp_;
-  return true;
-}
-
-bool RtpReceiverImpl::LastReceivedTimeMs(int64_t* receive_time_ms) const {
-  rtc::CritScope lock(&critical_section_rtp_receiver_);
-  if (!HaveReceivedFrame())
-    return false;
-  *receive_time_ms = last_received_frame_time_ms_;
-  return true;
-}
-
-bool RtpReceiverImpl::HaveReceivedFrame() const {
-  return last_received_frame_time_ms_ >= 0;
-}
-
-// Implementation note: must not hold critsect when called.
-void RtpReceiverImpl::CheckSSRCChanged(const RTPHeader& rtp_header) {
-  bool new_ssrc = false;
-  bool re_initialize_decoder = false;
-  char payload_name[RTP_PAYLOAD_NAME_SIZE];
-  size_t channels = 1;
-  uint32_t rate = 0;
-
-  {
-    rtc::CritScope lock(&critical_section_rtp_receiver_);
-
-    int8_t last_received_payload_type =
-        rtp_payload_registry_->last_received_payload_type();
-    if (ssrc_ != rtp_header.ssrc ||
-        (last_received_payload_type == -1 && ssrc_ == 0)) {
-      // We need the payload_type_ to make the call if the remote SSRC is 0.
-      new_ssrc = true;
-
-      last_received_timestamp_ = 0;
-      last_received_sequence_number_ = 0;
-      last_received_frame_time_ms_ = -1;
-
-      // Do we have a SSRC? Then the stream is restarted.
-      if (ssrc_ != 0) {
-        // Do we have the same codec? Then re-initialize coder.
-        if (rtp_header.payloadType == last_received_payload_type) {
-          re_initialize_decoder = true;
-
-          const Payload* payload = rtp_payload_registry_->PayloadTypeToPayload(
-              rtp_header.payloadType);
-          if (!payload) {
-            return;
-          }
-          payload_name[RTP_PAYLOAD_NAME_SIZE - 1] = 0;
-          strncpy(payload_name, payload->name, RTP_PAYLOAD_NAME_SIZE - 1);
-          if (payload->audio) {
-            channels = payload->typeSpecific.Audio.channels;
-            rate = payload->typeSpecific.Audio.rate;
-          }
-        }
-      }
-      ssrc_ = rtp_header.ssrc;
-    }
-  }
-
-  if (new_ssrc) {
-    // We need to get this to our RTCP sender and receiver.
-    // We need to do this outside critical section.
-    cb_rtp_feedback_->OnIncomingSSRCChanged(rtp_header.ssrc);
-  }
-
-  if (re_initialize_decoder) {
-    if (-1 ==
-        cb_rtp_feedback_->OnInitializeDecoder(
-            rtp_header.payloadType, payload_name,
-            rtp_header.payload_type_frequency, channels, rate)) {
-      // New stream, same codec.
-      LOG(LS_ERROR) << "Failed to create decoder for payload type: "
-                    << static_cast<int>(rtp_header.payloadType);
-    }
-  }
-}
-
-// Implementation note: must not hold critsect when called.
-// TODO(phoglund): Move as much as possible of this code path into the media
-// specific receivers. Basically this method goes through a lot of trouble to
-// compute something which is only used by the media specific parts later. If
-// this code path moves we can get rid of some of the rtp_receiver ->
-// media_specific interface (such as CheckPayloadChange, possibly get/set
-// last known payload).
-int32_t RtpReceiverImpl::CheckPayloadChanged(const RTPHeader& rtp_header,
-                                             const int8_t first_payload_byte,
-                                             bool* is_red,
-                                             PayloadUnion* specific_payload) {
-  bool re_initialize_decoder = false;
-
-  char payload_name[RTP_PAYLOAD_NAME_SIZE];
-  int8_t payload_type = rtp_header.payloadType;
-
-  {
-    rtc::CritScope lock(&critical_section_rtp_receiver_);
-
-    int8_t last_received_payload_type =
-        rtp_payload_registry_->last_received_payload_type();
-    // TODO(holmer): Remove this code when RED parsing has been broken out from
-    // RtpReceiverAudio.
-    if (payload_type != last_received_payload_type) {
-      if (rtp_payload_registry_->red_payload_type() == payload_type) {
-        // Get the real codec payload type.
-        payload_type = first_payload_byte & 0x7f;
-        *is_red = true;
-
-        if (rtp_payload_registry_->red_payload_type() == payload_type) {
-          // Invalid payload type, traced by caller. If we proceeded here,
-          // this would be set as |_last_received_payload_type|, and we would no
-          // longer catch corrupt packets at this level.
-          return -1;
-        }
-
-        // When we receive RED we need to check the real payload type.
-        if (payload_type == last_received_payload_type) {
-          rtp_media_receiver_->GetLastMediaSpecificPayload(specific_payload);
-          return 0;
-        }
-      }
-      bool should_discard_changes = false;
-
-      rtp_media_receiver_->CheckPayloadChanged(
-        payload_type, specific_payload,
-        &should_discard_changes);
-
-      if (should_discard_changes) {
-        *is_red = false;
-        return 0;
-      }
-
-      const Payload* payload =
-          rtp_payload_registry_->PayloadTypeToPayload(payload_type);
-      if (!payload) {
-        // Not a registered payload type.
-        return -1;
-      }
-      payload_name[RTP_PAYLOAD_NAME_SIZE - 1] = 0;
-      strncpy(payload_name, payload->name, RTP_PAYLOAD_NAME_SIZE - 1);
-
-      rtp_payload_registry_->set_last_received_payload_type(payload_type);
-
-      re_initialize_decoder = true;
-
-      rtp_media_receiver_->SetLastMediaSpecificPayload(payload->typeSpecific);
-      rtp_media_receiver_->GetLastMediaSpecificPayload(specific_payload);
-
-      if (!payload->audio) {
-        bool media_type_unchanged =
-            rtp_payload_registry_->ReportMediaPayloadType(payload_type);
-        if (media_type_unchanged) {
-          // Only reset the decoder if the media codec type has changed.
-          re_initialize_decoder = false;
-        }
-      }
-    } else {
-      rtp_media_receiver_->GetLastMediaSpecificPayload(specific_payload);
-      *is_red = false;
-    }
-  }  // End critsect.
-
-  if (re_initialize_decoder) {
-    if (-1 ==
-        rtp_media_receiver_->InvokeOnInitializeDecoder(
-            cb_rtp_feedback_, payload_type, payload_name, *specific_payload)) {
-      return -1;  // Wrong payload type.
-    }
-  }
-  return 0;
-}
-
-// Implementation note: must not hold critsect when called.
-void RtpReceiverImpl::CheckCSRC(const WebRtcRTPHeader& rtp_header) {
-  int32_t num_csrcs_diff = 0;
-  uint32_t old_remote_csrc[kRtpCsrcSize];
-  uint8_t old_num_csrcs = 0;
-
-  {
-    rtc::CritScope lock(&critical_section_rtp_receiver_);
-
-    if (!rtp_media_receiver_->ShouldReportCsrcChanges(
-        rtp_header.header.payloadType)) {
-      return;
-    }
-    old_num_csrcs  = num_csrcs_;
-    if (old_num_csrcs > 0) {
-      // Make a copy of old.
-      memcpy(old_remote_csrc, current_remote_csrc_,
-             num_csrcs_ * sizeof(uint32_t));
-    }
-    const uint8_t num_csrcs = rtp_header.header.numCSRCs;
-    if ((num_csrcs > 0) && (num_csrcs <= kRtpCsrcSize)) {
-      // Copy new.
-      memcpy(current_remote_csrc_,
-             rtp_header.header.arrOfCSRCs,
-             num_csrcs * sizeof(uint32_t));
-    }
-    if (num_csrcs > 0 || old_num_csrcs > 0) {
-      num_csrcs_diff = num_csrcs - old_num_csrcs;
-      num_csrcs_ = num_csrcs;  // Update stored CSRCs.
-    } else {
-      // No change.
-      return;
-    }
-  }  // End critsect.
-
-  bool have_called_callback = false;
-  // Search for new CSRC in old array.
-  for (uint8_t i = 0; i < rtp_header.header.numCSRCs; ++i) {
-    const uint32_t csrc = rtp_header.header.arrOfCSRCs[i];
-
-    bool found_match = false;
-    for (uint8_t j = 0; j < old_num_csrcs; ++j) {
-      if (csrc == old_remote_csrc[j]) {  // old list
-        found_match = true;
-        break;
-      }
-    }
-    if (!found_match && csrc) {
-      // Didn't find it, report it as new.
-      have_called_callback = true;
-      cb_rtp_feedback_->OnIncomingCSRCChanged(csrc, true);
-    }
-  }
-  // Search for old CSRC in new array.
-  for (uint8_t i = 0; i < old_num_csrcs; ++i) {
-    const uint32_t csrc = old_remote_csrc[i];
-
-    bool found_match = false;
-    for (uint8_t j = 0; j < rtp_header.header.numCSRCs; ++j) {
-      if (csrc == rtp_header.header.arrOfCSRCs[j]) {
-        found_match = true;
-        break;
-      }
-    }
-    if (!found_match && csrc) {
-      // Did not find it, report as removed.
-      have_called_callback = true;
-      cb_rtp_feedback_->OnIncomingCSRCChanged(csrc, false);
-    }
-  }
-  if (!have_called_callback) {
-    // If the CSRC list contain non-unique entries we will end up here.
-    // Using CSRC 0 to signal this event, not interop safe, other
-    // implementations might have CSRC 0 as a valid value.
-    if (num_csrcs_diff > 0) {
-      cb_rtp_feedback_->OnIncomingCSRCChanged(0, true);
-    } else if (num_csrcs_diff < 0) {
-      cb_rtp_feedback_->OnIncomingCSRCChanged(0, false);
-    }
-  }
-}
-
-void RtpReceiverImpl::UpdateSources(
-    const rtc::Optional<uint8_t>& ssrc_audio_level) {
-  rtc::CritScope lock(&critical_section_rtp_receiver_);
-  int64_t now_ms = clock_->TimeInMilliseconds();
-
-  for (size_t i = 0; i < num_csrcs_; ++i) {
-    auto map_it = iterator_by_csrc_.find(current_remote_csrc_[i]);
-    if (map_it == iterator_by_csrc_.end()) {
-      // If it is a new CSRC, append a new object to the end of the list.
-      csrc_sources_.emplace_back(now_ms, current_remote_csrc_[i],
-                                 RtpSourceType::CSRC);
-    } else {
-      // If it is an existing CSRC, move the object to the end of the list.
-      map_it->second->update_timestamp_ms(now_ms);
-      csrc_sources_.splice(csrc_sources_.end(), csrc_sources_, map_it->second);
-    }
-    // Update the unordered_map.
-    iterator_by_csrc_[current_remote_csrc_[i]] = std::prev(csrc_sources_.end());
-  }
-
-  // If this is the first packet or the SSRC is changed, insert a new
-  // contributing source that uses the SSRC.
-  if (ssrc_sources_.empty() || ssrc_sources_.rbegin()->source_id() != ssrc_) {
-    ssrc_sources_.emplace_back(now_ms, ssrc_, RtpSourceType::SSRC);
-  } else {
-    ssrc_sources_.rbegin()->update_timestamp_ms(now_ms);
-  }
-
-  ssrc_sources_.back().set_audio_level(ssrc_audio_level);
-
-  RemoveOutdatedSources(now_ms);
-}
-
-void RtpReceiverImpl::RemoveOutdatedSources(int64_t now_ms) {
-  std::list<RtpSource>::iterator it;
-  for (it = csrc_sources_.begin(); it != csrc_sources_.end(); ++it) {
-    if ((now_ms - it->timestamp_ms()) <= kGetSourcesTimeoutMs) {
-      break;
-    }
-    iterator_by_csrc_.erase(it->source_id());
-  }
-  csrc_sources_.erase(csrc_sources_.begin(), it);
-
-  std::vector<RtpSource>::iterator vec_it;
-  for (vec_it = ssrc_sources_.begin(); vec_it != ssrc_sources_.end();
-       ++vec_it) {
-    if ((now_ms - vec_it->timestamp_ms()) <= kGetSourcesTimeoutMs) {
-      break;
-    }
-  }
-  ssrc_sources_.erase(ssrc_sources_.begin(), vec_it);
-}
-
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/rtp_receiver_impl.h b/modules/rtp_rtcp/source/rtp_receiver_impl.h
deleted file mode 100644
index 6d38cf7..0000000
--- a/modules/rtp_rtcp/source/rtp_receiver_impl.h
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- *  Copyright (c) 2013 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_RTP_RTCP_SOURCE_RTP_RECEIVER_IMPL_H_
-#define WEBRTC_MODULES_RTP_RTCP_SOURCE_RTP_RECEIVER_IMPL_H_
-
-#include <list>
-#include <memory>
-#include <unordered_map>
-#include <vector>
-
-#include "webrtc/modules/rtp_rtcp/include/rtp_receiver.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_receiver_strategy.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-class RtpReceiverImpl : public RtpReceiver {
- public:
-  // Callbacks passed in here may not be NULL (use Null Object callbacks if you
-  // want callbacks to do nothing). This class takes ownership of the media
-  // receiver but nothing else.
-  RtpReceiverImpl(Clock* clock,
-                  RtpFeedback* incoming_messages_callback,
-                  RTPPayloadRegistry* rtp_payload_registry,
-                  RTPReceiverStrategy* rtp_media_receiver);
-
-  virtual ~RtpReceiverImpl();
-
-  int32_t RegisterReceivePayload(const CodecInst& audio_codec) override;
-  int32_t RegisterReceivePayload(const VideoCodec& video_codec) override;
-
-  int32_t DeRegisterReceivePayload(const int8_t payload_type) override;
-
-  bool IncomingRtpPacket(const RTPHeader& rtp_header,
-                         const uint8_t* payload,
-                         size_t payload_length,
-                         PayloadUnion payload_specific,
-                         bool in_order) override;
-
-  // Returns the last received timestamp.
-  bool Timestamp(uint32_t* timestamp) const override;
-  bool LastReceivedTimeMs(int64_t* receive_time_ms) const override;
-
-  uint32_t SSRC() const override;
-
-  int32_t CSRCs(uint32_t array_of_csrc[kRtpCsrcSize]) const override;
-
-  int32_t Energy(uint8_t array_of_energy[kRtpCsrcSize]) const override;
-
-  TelephoneEventHandler* GetTelephoneEventHandler() override;
-
-  std::vector<RtpSource> GetSources() const override;
-
-  const std::vector<RtpSource>& ssrc_sources_for_testing() const {
-    return ssrc_sources_;
-  }
-
-  const std::list<RtpSource>& csrc_sources_for_testing() const {
-    return csrc_sources_;
-  }
-
- private:
-  bool HaveReceivedFrame() const;
-
-  void CheckSSRCChanged(const RTPHeader& rtp_header);
-  void CheckCSRC(const WebRtcRTPHeader& rtp_header);
-  int32_t CheckPayloadChanged(const RTPHeader& rtp_header,
-                              const int8_t first_payload_byte,
-                              bool* is_red,
-                              PayloadUnion* payload);
-
-  void UpdateSources(const rtc::Optional<uint8_t>& ssrc_audio_level);
-  void RemoveOutdatedSources(int64_t now_ms);
-
-  Clock* clock_;
-  RTPPayloadRegistry* rtp_payload_registry_;
-  std::unique_ptr<RTPReceiverStrategy> rtp_media_receiver_;
-
-  RtpFeedback* cb_rtp_feedback_;
-
-  rtc::CriticalSection critical_section_rtp_receiver_;
-  int64_t last_receive_time_;
-  size_t last_received_payload_length_;
-
-  // SSRCs.
-  uint32_t ssrc_;
-  uint8_t num_csrcs_;
-  uint32_t current_remote_csrc_[kRtpCsrcSize];
-
-  uint32_t last_received_timestamp_;
-  int64_t last_received_frame_time_ms_;
-  uint16_t last_received_sequence_number_;
-
-  std::unordered_map<uint32_t, std::list<RtpSource>::iterator>
-      iterator_by_csrc_;
-  // The RtpSource objects are sorted chronologically.
-  std::list<RtpSource> csrc_sources_;
-  std::vector<RtpSource> ssrc_sources_;
-};
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_RTP_RTCP_SOURCE_RTP_RECEIVER_IMPL_H_
diff --git a/modules/rtp_rtcp/source/rtp_receiver_strategy.cc b/modules/rtp_rtcp/source/rtp_receiver_strategy.cc
deleted file mode 100644
index 69d079f..0000000
--- a/modules/rtp_rtcp/source/rtp_receiver_strategy.cc
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- *  Copyright (c) 2012 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/rtp_rtcp/source/rtp_receiver_strategy.h"
-
-#include <stdlib.h>
-
-namespace webrtc {
-
-RTPReceiverStrategy::RTPReceiverStrategy(RtpData* data_callback)
-    : data_callback_(data_callback) {
-  memset(&last_payload_, 0, sizeof(last_payload_));
-}
-
-void RTPReceiverStrategy::GetLastMediaSpecificPayload(
-    PayloadUnion* payload) const {
-  rtc::CritScope cs(&crit_sect_);
-  memcpy(payload, &last_payload_, sizeof(*payload));
-}
-
-void RTPReceiverStrategy::SetLastMediaSpecificPayload(
-    const PayloadUnion& payload) {
-  rtc::CritScope cs(&crit_sect_);
-  memcpy(&last_payload_, &payload, sizeof(last_payload_));
-}
-
-void RTPReceiverStrategy::CheckPayloadChanged(int8_t payload_type,
-                                              PayloadUnion* specific_payload,
-                                              bool* should_discard_changes) {
-  // Default: Keep changes.
-  *should_discard_changes = false;
-}
-
-int RTPReceiverStrategy::Energy(uint8_t array_of_energy[kRtpCsrcSize]) const {
-  return -1;
-}
-
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/rtp_receiver_strategy.h b/modules/rtp_rtcp/source/rtp_receiver_strategy.h
deleted file mode 100644
index f909b85..0000000
--- a/modules/rtp_rtcp/source/rtp_receiver_strategy.h
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- *  Copyright (c) 2012 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_RTP_RTCP_SOURCE_RTP_RECEIVER_STRATEGY_H_
-#define WEBRTC_MODULES_RTP_RTCP_SOURCE_RTP_RECEIVER_STRATEGY_H_
-
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_utility.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-struct CodecInst;
-
-class TelephoneEventHandler;
-
-// This strategy deals with media-specific RTP packet processing.
-// This class is not thread-safe and must be protected by its caller.
-class RTPReceiverStrategy {
- public:
-  static RTPReceiverStrategy* CreateVideoStrategy(RtpData* data_callback);
-  static RTPReceiverStrategy* CreateAudioStrategy(RtpData* data_callback);
-
-  virtual ~RTPReceiverStrategy() {}
-
-  // Parses the RTP packet and calls the data callback with the payload data.
-  // Implementations are encouraged to use the provided packet buffer and RTP
-  // header as arguments to the callback; implementations are also allowed to
-  // make changes in the data as necessary. The specific_payload argument
-  // provides audio or video-specific data. The is_first_packet argument is true
-  // if this packet is either the first packet ever or the first in its frame.
-  virtual int32_t ParseRtpPacket(WebRtcRTPHeader* rtp_header,
-                                 const PayloadUnion& specific_payload,
-                                 bool is_red,
-                                 const uint8_t* payload,
-                                 size_t payload_length,
-                                 int64_t timestamp_ms,
-                                 bool is_first_packet) = 0;
-
-  virtual TelephoneEventHandler* GetTelephoneEventHandler() = 0;
-
-  // Computes the current dead-or-alive state.
-  virtual RTPAliveType ProcessDeadOrAlive(
-      uint16_t last_payload_length) const = 0;
-
-  // Returns true if we should report CSRC changes for this payload type.
-  // TODO(phoglund): should move out of here along with other payload stuff.
-  virtual bool ShouldReportCsrcChanges(uint8_t payload_type) const = 0;
-
-  // Notifies the strategy that we have created a new non-RED audio payload type
-  // in the payload registry.
-  virtual int32_t OnNewPayloadTypeCreated(const CodecInst& audio_codec) = 0;
-
-  // Invokes the OnInitializeDecoder callback in a media-specific way.
-  virtual int32_t InvokeOnInitializeDecoder(
-      RtpFeedback* callback,
-      int8_t payload_type,
-      const char payload_name[RTP_PAYLOAD_NAME_SIZE],
-      const PayloadUnion& specific_payload) const = 0;
-
-  // Checks if the payload type has changed, and returns whether we should
-  // reset statistics and/or discard this packet.
-  virtual void CheckPayloadChanged(int8_t payload_type,
-                                   PayloadUnion* specific_payload,
-                                   bool* should_discard_changes);
-
-  virtual int Energy(uint8_t array_of_energy[kRtpCsrcSize]) const;
-
-  // Stores / retrieves the last media specific payload for later reference.
-  void GetLastMediaSpecificPayload(PayloadUnion* payload) const;
-  void SetLastMediaSpecificPayload(const PayloadUnion& payload);
-
- protected:
-  // The data callback is where we should send received payload data.
-  // See ParseRtpPacket. This class does not claim ownership of the callback.
-  // Implementations must NOT hold any critical sections while calling the
-  // callback.
-  //
-  // Note: Implementations may call the callback for other reasons than calls
-  // to ParseRtpPacket, for instance if the implementation somehow recovers a
-  // packet.
-  explicit RTPReceiverStrategy(RtpData* data_callback);
-
-  rtc::CriticalSection crit_sect_;
-  PayloadUnion last_payload_;
-  RtpData* data_callback_;
-};
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_RTP_RTCP_SOURCE_RTP_RECEIVER_STRATEGY_H_
diff --git a/modules/rtp_rtcp/source/rtp_receiver_unittest.cc b/modules/rtp_rtcp/source/rtp_receiver_unittest.cc
deleted file mode 100644
index e20d2d5..0000000
--- a/modules/rtp_rtcp/source/rtp_receiver_unittest.cc
+++ /dev/null
@@ -1,342 +0,0 @@
-/*
- *  Copyright (c) 2017 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 <memory>
-
-#include "webrtc/common_types.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_header_parser.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_payload_registry.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_receiver.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
-#include "webrtc/modules/rtp_rtcp/mocks/mock_rtp_rtcp.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_receiver_impl.h"
-#include "webrtc/test/gmock.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-namespace {
-
-using ::testing::NiceMock;
-using ::testing::UnorderedElementsAre;
-
-const uint32_t kTestRate = 64000u;
-const uint8_t kTestPayload[] = {'t', 'e', 's', 't'};
-const uint8_t kPcmuPayloadType = 96;
-const int64_t kGetSourcesTimeoutMs = 10000;
-const uint32_t kSsrc1 = 123;
-const uint32_t kSsrc2 = 124;
-const uint32_t kCsrc1 = 111;
-const uint32_t kCsrc2 = 222;
-const bool kInOrder = true;
-
-static uint32_t rtp_timestamp(int64_t time_ms) {
-  return static_cast<uint32_t>(time_ms * kTestRate / 1000);
-}
-
-}  // namespace
-
-class RtpReceiverTest : public ::testing::Test {
- protected:
-  RtpReceiverTest()
-      : fake_clock_(123456),
-        rtp_receiver_(
-            RtpReceiver::CreateAudioReceiver(&fake_clock_,
-                                             &mock_rtp_data_,
-                                             nullptr,
-                                             &rtp_payload_registry_)) {
-    CodecInst voice_codec = {};
-    voice_codec.pltype = kPcmuPayloadType;
-    voice_codec.plfreq = 8000;
-    voice_codec.rate = kTestRate;
-    memcpy(voice_codec.plname, "PCMU", 5);
-    rtp_receiver_->RegisterReceivePayload(voice_codec);
-  }
-  ~RtpReceiverTest() {}
-
-  bool FindSourceByIdAndType(const std::vector<RtpSource>& sources,
-                             uint32_t source_id,
-                             RtpSourceType type,
-                             RtpSource* source) {
-    for (size_t i = 0; i < sources.size(); ++i) {
-      if (sources[i].source_id() == source_id &&
-          sources[i].source_type() == type) {
-        (*source) = sources[i];
-        return true;
-      }
-    }
-    return false;
-  }
-
-  SimulatedClock fake_clock_;
-  NiceMock<MockRtpData> mock_rtp_data_;
-  RTPPayloadRegistry rtp_payload_registry_;
-  std::unique_ptr<RtpReceiver> rtp_receiver_;
-};
-
-TEST_F(RtpReceiverTest, GetSources) {
-  int64_t now_ms = fake_clock_.TimeInMilliseconds();
-
-  RTPHeader header;
-  header.payloadType = kPcmuPayloadType;
-  header.ssrc = kSsrc1;
-  header.timestamp = rtp_timestamp(now_ms);
-  header.numCSRCs = 2;
-  header.arrOfCSRCs[0] = kCsrc1;
-  header.arrOfCSRCs[1] = kCsrc2;
-  PayloadUnion payload_specific = {AudioPayload()};
-
-  EXPECT_TRUE(rtp_receiver_->IncomingRtpPacket(
-      header, kTestPayload, sizeof(kTestPayload), payload_specific, !kInOrder));
-  auto sources = rtp_receiver_->GetSources();
-  // One SSRC source and two CSRC sources.
-  EXPECT_THAT(sources, UnorderedElementsAre(
-                           RtpSource(now_ms, kSsrc1, RtpSourceType::SSRC),
-                           RtpSource(now_ms, kCsrc1, RtpSourceType::CSRC),
-                           RtpSource(now_ms, kCsrc2, RtpSourceType::CSRC)));
-
-  // Advance the fake clock and the method is expected to return the
-  // contributing source object with same source id and updated timestamp.
-  fake_clock_.AdvanceTimeMilliseconds(1);
-  EXPECT_TRUE(rtp_receiver_->IncomingRtpPacket(
-      header, kTestPayload, sizeof(kTestPayload), payload_specific, !kInOrder));
-  sources = rtp_receiver_->GetSources();
-  now_ms = fake_clock_.TimeInMilliseconds();
-  EXPECT_THAT(sources, UnorderedElementsAre(
-                           RtpSource(now_ms, kSsrc1, RtpSourceType::SSRC),
-                           RtpSource(now_ms, kCsrc1, RtpSourceType::CSRC),
-                           RtpSource(now_ms, kCsrc2, RtpSourceType::CSRC)));
-
-  // Test the edge case that the sources are still there just before the
-  // timeout.
-  int64_t prev_time_ms = fake_clock_.TimeInMilliseconds();
-  fake_clock_.AdvanceTimeMilliseconds(kGetSourcesTimeoutMs);
-  sources = rtp_receiver_->GetSources();
-  EXPECT_THAT(sources,
-              UnorderedElementsAre(
-                  RtpSource(prev_time_ms, kSsrc1, RtpSourceType::SSRC),
-                  RtpSource(prev_time_ms, kCsrc1, RtpSourceType::CSRC),
-                  RtpSource(prev_time_ms, kCsrc2, RtpSourceType::CSRC)));
-
-  // Time out.
-  fake_clock_.AdvanceTimeMilliseconds(1);
-  sources = rtp_receiver_->GetSources();
-  // All the sources should be out of date.
-  ASSERT_EQ(0u, sources.size());
-}
-
-// Test the case that the SSRC is changed.
-TEST_F(RtpReceiverTest, GetSourcesChangeSSRC) {
-  int64_t prev_time_ms = -1;
-  int64_t now_ms = fake_clock_.TimeInMilliseconds();
-
-  RTPHeader header;
-  header.payloadType = kPcmuPayloadType;
-  header.ssrc = kSsrc1;
-  header.timestamp = rtp_timestamp(now_ms);
-  PayloadUnion payload_specific = {AudioPayload()};
-
-  EXPECT_TRUE(rtp_receiver_->IncomingRtpPacket(
-      header, kTestPayload, sizeof(kTestPayload), payload_specific, !kInOrder));
-  auto sources = rtp_receiver_->GetSources();
-  EXPECT_THAT(sources, UnorderedElementsAre(
-                           RtpSource(now_ms, kSsrc1, RtpSourceType::SSRC)));
-
-  // The SSRC is changed and the old SSRC is expected to be returned.
-  fake_clock_.AdvanceTimeMilliseconds(100);
-  prev_time_ms = now_ms;
-  now_ms = fake_clock_.TimeInMilliseconds();
-  header.ssrc = kSsrc2;
-  header.timestamp = rtp_timestamp(now_ms);
-  EXPECT_TRUE(rtp_receiver_->IncomingRtpPacket(
-      header, kTestPayload, sizeof(kTestPayload), payload_specific, !kInOrder));
-  sources = rtp_receiver_->GetSources();
-  EXPECT_THAT(sources, UnorderedElementsAre(
-                           RtpSource(prev_time_ms, kSsrc1, RtpSourceType::SSRC),
-                           RtpSource(now_ms, kSsrc2, RtpSourceType::SSRC)));
-
-  // The SSRC is changed again and happen to be changed back to 1. No
-  // duplication is expected.
-  fake_clock_.AdvanceTimeMilliseconds(100);
-  header.ssrc = kSsrc1;
-  header.timestamp = rtp_timestamp(now_ms);
-  prev_time_ms = now_ms;
-  now_ms = fake_clock_.TimeInMilliseconds();
-  EXPECT_TRUE(rtp_receiver_->IncomingRtpPacket(
-      header, kTestPayload, sizeof(kTestPayload), payload_specific, !kInOrder));
-  sources = rtp_receiver_->GetSources();
-  EXPECT_THAT(sources, UnorderedElementsAre(
-                           RtpSource(prev_time_ms, kSsrc2, RtpSourceType::SSRC),
-                           RtpSource(now_ms, kSsrc1, RtpSourceType::SSRC)));
-
-  // Old SSRC source timeout.
-  fake_clock_.AdvanceTimeMilliseconds(kGetSourcesTimeoutMs);
-  now_ms = fake_clock_.TimeInMilliseconds();
-  EXPECT_TRUE(rtp_receiver_->IncomingRtpPacket(
-      header, kTestPayload, sizeof(kTestPayload), payload_specific, !kInOrder));
-  sources = rtp_receiver_->GetSources();
-  EXPECT_THAT(sources, UnorderedElementsAre(
-                           RtpSource(now_ms, kSsrc1, RtpSourceType::SSRC)));
-}
-
-TEST_F(RtpReceiverTest, GetSourcesRemoveOutdatedSource) {
-  int64_t now_ms = fake_clock_.TimeInMilliseconds();
-
-  RTPHeader header;
-  header.payloadType = kPcmuPayloadType;
-  header.timestamp = rtp_timestamp(now_ms);
-  PayloadUnion payload_specific = {AudioPayload()};
-  header.numCSRCs = 1;
-  size_t kSourceListSize = 20;
-
-  for (size_t i = 0; i < kSourceListSize; ++i) {
-    header.ssrc = i;
-    header.arrOfCSRCs[0] = (i + 1);
-    EXPECT_TRUE(rtp_receiver_->IncomingRtpPacket(header, kTestPayload,
-                                                 sizeof(kTestPayload),
-                                                 payload_specific, !kInOrder));
-  }
-
-  RtpSource source(0, 0, RtpSourceType::SSRC);
-  auto sources = rtp_receiver_->GetSources();
-  // Expect |kSourceListSize| SSRC sources and |kSourceListSize| CSRC sources.
-  ASSERT_EQ(2 * kSourceListSize, sources.size());
-  for (size_t i = 0; i < kSourceListSize; ++i) {
-    // The SSRC source IDs are expected to be 19, 18, 17 ... 0
-    ASSERT_TRUE(
-        FindSourceByIdAndType(sources, i, RtpSourceType::SSRC, &source));
-    EXPECT_EQ(now_ms, source.timestamp_ms());
-
-    // The CSRC source IDs are expected to be 20, 19, 18 ... 1
-    ASSERT_TRUE(
-        FindSourceByIdAndType(sources, (i + 1), RtpSourceType::CSRC, &source));
-    EXPECT_EQ(now_ms, source.timestamp_ms());
-  }
-
-  fake_clock_.AdvanceTimeMilliseconds(kGetSourcesTimeoutMs);
-  for (size_t i = 0; i < kSourceListSize; ++i) {
-    // The SSRC source IDs are expected to be 19, 18, 17 ... 0
-    ASSERT_TRUE(
-        FindSourceByIdAndType(sources, i, RtpSourceType::SSRC, &source));
-    EXPECT_EQ(now_ms, source.timestamp_ms());
-
-    // The CSRC source IDs are expected to be 20, 19, 18 ... 1
-    ASSERT_TRUE(
-        FindSourceByIdAndType(sources, (i + 1), RtpSourceType::CSRC, &source));
-    EXPECT_EQ(now_ms, source.timestamp_ms());
-  }
-
-  // Timeout. All the existing objects are out of date and are expected to be
-  // removed.
-  fake_clock_.AdvanceTimeMilliseconds(1);
-  header.ssrc = kSsrc1;
-  header.arrOfCSRCs[0] = kCsrc1;
-  EXPECT_TRUE(rtp_receiver_->IncomingRtpPacket(
-      header, kTestPayload, sizeof(kTestPayload), payload_specific, !kInOrder));
-  auto rtp_receiver_impl = static_cast<RtpReceiverImpl*>(rtp_receiver_.get());
-  auto ssrc_sources = rtp_receiver_impl->ssrc_sources_for_testing();
-  ASSERT_EQ(1u, ssrc_sources.size());
-  EXPECT_EQ(kSsrc1, ssrc_sources.begin()->source_id());
-  EXPECT_EQ(RtpSourceType::SSRC, ssrc_sources.begin()->source_type());
-  EXPECT_EQ(fake_clock_.TimeInMilliseconds(),
-            ssrc_sources.begin()->timestamp_ms());
-
-  auto csrc_sources = rtp_receiver_impl->csrc_sources_for_testing();
-  ASSERT_EQ(1u, csrc_sources.size());
-  EXPECT_EQ(kCsrc1, csrc_sources.begin()->source_id());
-  EXPECT_EQ(RtpSourceType::CSRC, csrc_sources.begin()->source_type());
-  EXPECT_EQ(fake_clock_.TimeInMilliseconds(),
-            csrc_sources.begin()->timestamp_ms());
-}
-
-// The audio level from the RTPHeader extension should be stored in the
-// RtpSource with the matching SSRC.
-TEST_F(RtpReceiverTest, GetSourcesContainsAudioLevelExtension) {
-  RTPHeader header;
-  int64_t time1_ms = fake_clock_.TimeInMilliseconds();
-  header.payloadType = kPcmuPayloadType;
-  header.ssrc = kSsrc1;
-  header.timestamp = rtp_timestamp(time1_ms);
-  header.extension.hasAudioLevel = true;
-  header.extension.audioLevel = 10;
-  PayloadUnion payload_specific = {AudioPayload()};
-
-  EXPECT_TRUE(rtp_receiver_->IncomingRtpPacket(
-      header, kTestPayload, sizeof(kTestPayload), payload_specific, !kInOrder));
-  auto sources = rtp_receiver_->GetSources();
-  EXPECT_THAT(sources, UnorderedElementsAre(RtpSource(
-                           time1_ms, kSsrc1, RtpSourceType::SSRC, 10)));
-
-  // Receive a packet from a different SSRC with a different level and check
-  // that they are both remembered.
-  fake_clock_.AdvanceTimeMilliseconds(1);
-  int64_t time2_ms = fake_clock_.TimeInMilliseconds();
-  header.ssrc = kSsrc2;
-  header.timestamp = rtp_timestamp(time2_ms);
-  header.extension.hasAudioLevel = true;
-  header.extension.audioLevel = 20;
-
-  EXPECT_TRUE(rtp_receiver_->IncomingRtpPacket(
-      header, kTestPayload, sizeof(kTestPayload), payload_specific, !kInOrder));
-  sources = rtp_receiver_->GetSources();
-  EXPECT_THAT(sources,
-              UnorderedElementsAre(
-                  RtpSource(time1_ms, kSsrc1, RtpSourceType::SSRC, 10),
-                  RtpSource(time2_ms, kSsrc2, RtpSourceType::SSRC, 20)));
-
-  // Receive a packet from the first SSRC again and check that the level is
-  // updated.
-  fake_clock_.AdvanceTimeMilliseconds(1);
-  int64_t time3_ms = fake_clock_.TimeInMilliseconds();
-  header.ssrc = kSsrc1;
-  header.timestamp = rtp_timestamp(time3_ms);
-  header.extension.hasAudioLevel = true;
-  header.extension.audioLevel = 30;
-
-  EXPECT_TRUE(rtp_receiver_->IncomingRtpPacket(
-      header, kTestPayload, sizeof(kTestPayload), payload_specific, !kInOrder));
-  sources = rtp_receiver_->GetSources();
-  EXPECT_THAT(sources,
-              UnorderedElementsAre(
-                  RtpSource(time3_ms, kSsrc1, RtpSourceType::SSRC, 30),
-                  RtpSource(time2_ms, kSsrc2, RtpSourceType::SSRC, 20)));
-}
-
-TEST_F(RtpReceiverTest,
-       MissingAudioLevelHeaderExtensionClearsRtpSourceAudioLevel) {
-  RTPHeader header;
-  int64_t time1_ms = fake_clock_.TimeInMilliseconds();
-  header.payloadType = kPcmuPayloadType;
-  header.ssrc = kSsrc1;
-  header.timestamp = rtp_timestamp(time1_ms);
-  header.extension.hasAudioLevel = true;
-  header.extension.audioLevel = 10;
-  PayloadUnion payload_specific = {AudioPayload()};
-
-  EXPECT_TRUE(rtp_receiver_->IncomingRtpPacket(
-      header, kTestPayload, sizeof(kTestPayload), payload_specific, !kInOrder));
-  auto sources = rtp_receiver_->GetSources();
-  EXPECT_THAT(sources, UnorderedElementsAre(RtpSource(
-                           time1_ms, kSsrc1, RtpSourceType::SSRC, 10)));
-
-  // Receive a second packet without the audio level header extension and check
-  // that the audio level is cleared.
-  fake_clock_.AdvanceTimeMilliseconds(1);
-  int64_t time2_ms = fake_clock_.TimeInMilliseconds();
-  header.timestamp = rtp_timestamp(time2_ms);
-  header.extension.hasAudioLevel = false;
-
-  EXPECT_TRUE(rtp_receiver_->IncomingRtpPacket(
-      header, kTestPayload, sizeof(kTestPayload), payload_specific, !kInOrder));
-  sources = rtp_receiver_->GetSources();
-  EXPECT_THAT(sources, UnorderedElementsAre(
-                           RtpSource(time2_ms, kSsrc1, RtpSourceType::SSRC)));
-}
-
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/rtp_receiver_video.cc b/modules/rtp_rtcp/source/rtp_receiver_video.cc
deleted file mode 100644
index 106f056..0000000
--- a/modules/rtp_rtcp/source/rtp_receiver_video.cc
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
- *  Copyright (c) 2012 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/rtp_rtcp/source/rtp_receiver_video.h"
-
-#include <assert.h>
-#include <string.h>
-
-#include <memory>
-
-#include "webrtc/modules/rtp_rtcp/include/rtp_cvo.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_payload_registry.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_format.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_format_video_generic.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_utility.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/trace_event.h"
-
-namespace webrtc {
-
-RTPReceiverStrategy* RTPReceiverStrategy::CreateVideoStrategy(
-    RtpData* data_callback) {
-  return new RTPReceiverVideo(data_callback);
-}
-
-RTPReceiverVideo::RTPReceiverVideo(RtpData* data_callback)
-    : RTPReceiverStrategy(data_callback) {
-}
-
-RTPReceiverVideo::~RTPReceiverVideo() {
-}
-
-bool RTPReceiverVideo::ShouldReportCsrcChanges(uint8_t payload_type) const {
-  // Always do this for video packets.
-  return true;
-}
-
-int32_t RTPReceiverVideo::OnNewPayloadTypeCreated(
-    const CodecInst& audio_codec) {
-  RTC_NOTREACHED();
-  return 0;
-}
-
-int32_t RTPReceiverVideo::ParseRtpPacket(WebRtcRTPHeader* rtp_header,
-                                         const PayloadUnion& specific_payload,
-                                         bool is_red,
-                                         const uint8_t* payload,
-                                         size_t payload_length,
-                                         int64_t timestamp_ms,
-                                         bool is_first_packet) {
-  TRACE_EVENT2(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), "Video::ParseRtp",
-               "seqnum", rtp_header->header.sequenceNumber, "timestamp",
-               rtp_header->header.timestamp);
-  rtp_header->type.Video.codec = specific_payload.Video.videoCodecType;
-
-  RTC_DCHECK_GE(payload_length, rtp_header->header.paddingLength);
-  const size_t payload_data_length =
-      payload_length - rtp_header->header.paddingLength;
-
-  if (payload == NULL || payload_data_length == 0) {
-    return data_callback_->OnReceivedPayloadData(NULL, 0, rtp_header) == 0 ? 0
-                                                                           : -1;
-  }
-
-  if (first_packet_received_()) {
-    LOG(LS_INFO) << "Received first video RTP packet";
-  }
-
-  // We are not allowed to hold a critical section when calling below functions.
-  std::unique_ptr<RtpDepacketizer> depacketizer(
-      RtpDepacketizer::Create(rtp_header->type.Video.codec));
-  if (depacketizer.get() == NULL) {
-    LOG(LS_ERROR) << "Failed to create depacketizer.";
-    return -1;
-  }
-
-  rtp_header->type.Video.is_first_packet_in_frame = is_first_packet;
-  RtpDepacketizer::ParsedPayload parsed_payload;
-  if (!depacketizer->Parse(&parsed_payload, payload, payload_data_length))
-    return -1;
-
-  rtp_header->frameType = parsed_payload.frame_type;
-  rtp_header->type = parsed_payload.type;
-  rtp_header->type.Video.rotation = kVideoRotation_0;
-  rtp_header->type.Video.content_type = VideoContentType::UNSPECIFIED;
-  rtp_header->type.Video.video_timing.flags = TimingFrameFlags::kInvalid;
-
-  // Retrieve the video rotation information.
-  if (rtp_header->header.extension.hasVideoRotation) {
-    rtp_header->type.Video.rotation =
-        rtp_header->header.extension.videoRotation;
-  }
-
-  if (rtp_header->header.extension.hasVideoContentType) {
-    rtp_header->type.Video.content_type =
-        rtp_header->header.extension.videoContentType;
-  }
-
-  if (rtp_header->header.extension.has_video_timing) {
-    rtp_header->type.Video.video_timing =
-        rtp_header->header.extension.video_timing;
-  }
-
-  rtp_header->type.Video.playout_delay =
-      rtp_header->header.extension.playout_delay;
-
-  return data_callback_->OnReceivedPayloadData(parsed_payload.payload,
-                                               parsed_payload.payload_length,
-                                               rtp_header) == 0
-             ? 0
-             : -1;
-}
-
-RTPAliveType RTPReceiverVideo::ProcessDeadOrAlive(
-    uint16_t last_payload_length) const {
-  return kRtpDead;
-}
-
-int32_t RTPReceiverVideo::InvokeOnInitializeDecoder(
-    RtpFeedback* callback,
-    int8_t payload_type,
-    const char payload_name[RTP_PAYLOAD_NAME_SIZE],
-    const PayloadUnion& specific_payload) const {
-  // TODO(pbos): Remove as soon as audio can handle a changing payload type
-  // without this callback.
-  return 0;
-}
-
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/rtp_receiver_video.h b/modules/rtp_rtcp/source/rtp_receiver_video.h
deleted file mode 100644
index a243484..0000000
--- a/modules/rtp_rtcp/source/rtp_receiver_video.h
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- *  Copyright (c) 2012 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_RTP_RTCP_SOURCE_RTP_RECEIVER_VIDEO_H_
-#define WEBRTC_MODULES_RTP_RTCP_SOURCE_RTP_RECEIVER_VIDEO_H_
-
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_receiver_strategy.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_utility.h"
-#include "webrtc/rtc_base/onetimeevent.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-class RTPReceiverVideo : public RTPReceiverStrategy {
- public:
-  explicit RTPReceiverVideo(RtpData* data_callback);
-
-  virtual ~RTPReceiverVideo();
-
-  int32_t ParseRtpPacket(WebRtcRTPHeader* rtp_header,
-                         const PayloadUnion& specific_payload,
-                         bool is_red,
-                         const uint8_t* packet,
-                         size_t packet_length,
-                         int64_t timestamp,
-                         bool is_first_packet) override;
-
-  TelephoneEventHandler* GetTelephoneEventHandler() override { return NULL; }
-
-  RTPAliveType ProcessDeadOrAlive(uint16_t last_payload_length) const override;
-
-  bool ShouldReportCsrcChanges(uint8_t payload_type) const override;
-
-  int32_t OnNewPayloadTypeCreated(const CodecInst& audio_codec) override;
-
-  int32_t InvokeOnInitializeDecoder(
-      RtpFeedback* callback,
-      int8_t payload_type,
-      const char payload_name[RTP_PAYLOAD_NAME_SIZE],
-      const PayloadUnion& specific_payload) const override;
-
-  void SetPacketOverHead(uint16_t packet_over_head);
-
- private:
-  OneTimeEvent first_packet_received_;
-};
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_RTP_RTCP_SOURCE_RTP_RECEIVER_VIDEO_H_
diff --git a/modules/rtp_rtcp/source/rtp_rtcp_config.h b/modules/rtp_rtcp/source/rtp_rtcp_config.h
deleted file mode 100644
index 57f6655..0000000
--- a/modules/rtp_rtcp/source/rtp_rtcp_config.h
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- *  Copyright (c) 2012 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_RTP_RTCP_SOURCE_RTP_RTCP_CONFIG_H_
-#define WEBRTC_MODULES_RTP_RTCP_SOURCE_RTP_RTCP_CONFIG_H_
-
-// Configuration file for RTP utilities (RTPSender, RTPReceiver ...)
-namespace webrtc {
-enum { NACK_BYTECOUNT_SIZE = 60 };  // size of our NACK history
-// A sanity for the NACK list parsing at the send-side.
-enum { kSendSideNackListSizeSanity = 20000 };
-enum { kDefaultMaxReorderingThreshold = 50 };  // In sequence numbers.
-enum { kRtcpMaxNackFields = 253 };
-
-enum { RTCP_INTERVAL_VIDEO_MS = 1000 };
-enum { RTCP_INTERVAL_AUDIO_MS = 5000 };
-enum { RTCP_SEND_BEFORE_KEY_FRAME_MS = 100 };
-enum { RTCP_MAX_REPORT_BLOCKS = 31 };  // RFC 3550 page 37
-enum {
-  kRtcpAppCode_DATA_SIZE = 32 * 4
-};  // multiple of 4, this is not a limitation of the size
-enum { RTCP_NUMBER_OF_SR = 60 };
-
-enum { MAX_NUMBER_OF_TEMPORAL_ID = 8 };              // RFC
-enum { MAX_NUMBER_OF_DEPENDENCY_QUALITY_ID = 128 };  // RFC
-enum { MAX_NUMBER_OF_REMB_FEEDBACK_SSRCS = 255 };
-
-enum { BW_HISTORY_SIZE = 35 };
-
-#define MIN_AUDIO_BW_MANAGEMENT_BITRATE 6
-#define MIN_VIDEO_BW_MANAGEMENT_BITRATE 30
-
-enum { RTP_MAX_BURST_SLEEP_TIME = 500 };
-enum { RTP_AUDIO_LEVEL_UNIQUE_ID = 0xbede };
-enum { RTP_MAX_PACKETS_PER_FRAME = 512 };  // must be multiple of 32
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_RTP_RTCP_SOURCE_RTP_RTCP_CONFIG_H_
diff --git a/modules/rtp_rtcp/source/rtp_rtcp_impl.cc b/modules/rtp_rtcp/source/rtp_rtcp_impl.cc
deleted file mode 100644
index 7318ff4..0000000
--- a/modules/rtp_rtcp/source/rtp_rtcp_impl.cc
+++ /dev/null
@@ -1,931 +0,0 @@
-/*
- *  Copyright (c) 2012 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/rtp_rtcp/source/rtp_rtcp_impl.h"
-
-#include <string.h>
-
-#include <algorithm>
-#include <set>
-#include <string>
-
-#include "webrtc/api/rtpparameters.h"
-#include "webrtc/common_types.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-
-#ifdef _WIN32
-// Disable warning C4355: 'this' : used in base member initializer list.
-#pragma warning(disable : 4355)
-#endif
-
-namespace webrtc {
-namespace {
-const int64_t kRtpRtcpMaxIdleTimeProcessMs = 5;
-const int64_t kRtpRtcpRttProcessTimeMs = 1000;
-const int64_t kRtpRtcpBitrateProcessTimeMs = 10;
-const int64_t kDefaultExpectedRetransmissionTimeMs = 125;
-}  // namespace
-
-RTPExtensionType StringToRtpExtensionType(const std::string& extension) {
-  if (extension == RtpExtension::kTimestampOffsetUri)
-    return kRtpExtensionTransmissionTimeOffset;
-  if (extension == RtpExtension::kAudioLevelUri)
-    return kRtpExtensionAudioLevel;
-  if (extension == RtpExtension::kAbsSendTimeUri)
-    return kRtpExtensionAbsoluteSendTime;
-  if (extension == RtpExtension::kVideoRotationUri)
-    return kRtpExtensionVideoRotation;
-  if (extension == RtpExtension::kTransportSequenceNumberUri)
-    return kRtpExtensionTransportSequenceNumber;
-  if (extension == RtpExtension::kPlayoutDelayUri)
-    return kRtpExtensionPlayoutDelay;
-  if (extension == RtpExtension::kVideoContentTypeUri)
-    return kRtpExtensionVideoContentType;
-  if (extension == RtpExtension::kVideoTimingUri)
-    return kRtpExtensionVideoTiming;
-  RTC_NOTREACHED() << "Looking up unsupported RTP extension.";
-  return kRtpExtensionNone;
-}
-
-RtpRtcp::Configuration::Configuration() = default;
-
-RtpRtcp* RtpRtcp::CreateRtpRtcp(const RtpRtcp::Configuration& configuration) {
-  if (configuration.clock) {
-    return new ModuleRtpRtcpImpl(configuration);
-  } else {
-    // No clock implementation provided, use default clock.
-    RtpRtcp::Configuration configuration_copy;
-    memcpy(&configuration_copy, &configuration,
-           sizeof(RtpRtcp::Configuration));
-    configuration_copy.clock = Clock::GetRealTimeClock();
-    return new ModuleRtpRtcpImpl(configuration_copy);
-  }
-}
-
-// Deprecated.
-int32_t RtpRtcp::SetFecParameters(const FecProtectionParams* delta_params,
-                                  const FecProtectionParams* key_params) {
-  RTC_DCHECK(delta_params);
-  RTC_DCHECK(key_params);
-  return SetFecParameters(*delta_params, *key_params) ? 0 : -1;
-}
-
-ModuleRtpRtcpImpl::ModuleRtpRtcpImpl(const Configuration& configuration)
-    : rtcp_sender_(configuration.audio,
-                   configuration.clock,
-                   configuration.receive_statistics,
-                   configuration.rtcp_packet_type_counter_observer,
-                   configuration.event_log,
-                   configuration.outgoing_transport),
-      rtcp_receiver_(configuration.clock,
-                     configuration.receiver_only,
-                     configuration.rtcp_packet_type_counter_observer,
-                     configuration.bandwidth_callback,
-                     configuration.intra_frame_callback,
-                     configuration.transport_feedback_callback,
-                     configuration.bitrate_allocation_observer,
-                     this),
-      clock_(configuration.clock),
-      audio_(configuration.audio),
-      keepalive_config_(configuration.keepalive_config),
-      last_bitrate_process_time_(clock_->TimeInMilliseconds()),
-      last_rtt_process_time_(clock_->TimeInMilliseconds()),
-      next_process_time_(clock_->TimeInMilliseconds() +
-                         kRtpRtcpMaxIdleTimeProcessMs),
-      next_keepalive_time_(-1),
-      packet_overhead_(28),  // IPV4 UDP.
-      nack_last_time_sent_full_(0),
-      nack_last_time_sent_full_prev_(0),
-      nack_last_seq_number_sent_(0),
-      key_frame_req_method_(kKeyFrameReqPliRtcp),
-      remote_bitrate_(configuration.remote_bitrate_estimator),
-      rtt_stats_(configuration.rtt_stats),
-      rtt_ms_(0) {
-  if (!configuration.receiver_only) {
-    rtp_sender_.reset(new RTPSender(
-        configuration.audio,
-        configuration.clock,
-        configuration.outgoing_transport,
-        configuration.paced_sender,
-        configuration.flexfec_sender,
-        configuration.transport_sequence_number_allocator,
-        configuration.transport_feedback_callback,
-        configuration.send_bitrate_observer,
-        configuration.send_frame_count_observer,
-        configuration.send_side_delay_observer,
-        configuration.event_log,
-        configuration.send_packet_observer,
-        configuration.retransmission_rate_limiter,
-        configuration.overhead_observer));
-    // Make sure rtcp sender use same timestamp offset as rtp sender.
-    rtcp_sender_.SetTimestampOffset(rtp_sender_->TimestampOffset());
-
-    if (keepalive_config_.timeout_interval_ms != -1) {
-      next_keepalive_time_ =
-          clock_->TimeInMilliseconds() + keepalive_config_.timeout_interval_ms;
-    }
-  }
-
-  // Set default packet size limit.
-  // TODO(nisse): Kind-of duplicates
-  // webrtc::VideoSendStream::Config::Rtp::kDefaultMaxPacketSize.
-  const size_t kTcpOverIpv4HeaderSize = 40;
-  SetMaxRtpPacketSize(IP_PACKET_SIZE - kTcpOverIpv4HeaderSize);
-}
-
-// Returns the number of milliseconds until the module want a worker thread
-// to call Process.
-int64_t ModuleRtpRtcpImpl::TimeUntilNextProcess() {
-  return std::max<int64_t>(0,
-                           next_process_time_ - clock_->TimeInMilliseconds());
-}
-
-// Process any pending tasks such as timeouts (non time critical events).
-void ModuleRtpRtcpImpl::Process() {
-  const int64_t now = clock_->TimeInMilliseconds();
-  next_process_time_ = now + kRtpRtcpMaxIdleTimeProcessMs;
-
-  if (rtp_sender_) {
-    if (now >= last_bitrate_process_time_ + kRtpRtcpBitrateProcessTimeMs) {
-      rtp_sender_->ProcessBitrate();
-      last_bitrate_process_time_ = now;
-      next_process_time_ =
-          std::min(next_process_time_, now + kRtpRtcpBitrateProcessTimeMs);
-    }
-    if (keepalive_config_.timeout_interval_ms > 0 &&
-        now >= next_keepalive_time_) {
-      int64_t last_send_time_ms = rtp_sender_->LastTimestampTimeMs();
-      // If no packet has been sent, |last_send_time_ms| will be 0, and so the
-      // keep-alive will be triggered as expected.
-      if (now >= last_send_time_ms + keepalive_config_.timeout_interval_ms) {
-        rtp_sender_->SendKeepAlive(keepalive_config_.payload_type);
-        next_keepalive_time_ = now + keepalive_config_.timeout_interval_ms;
-      } else {
-        next_keepalive_time_ =
-            last_send_time_ms + keepalive_config_.timeout_interval_ms;
-      }
-      next_process_time_ = std::min(next_process_time_, next_keepalive_time_);
-    }
-  }
-
-  bool process_rtt = now >= last_rtt_process_time_ + kRtpRtcpRttProcessTimeMs;
-  if (rtcp_sender_.Sending()) {
-    // Process RTT if we have received a receiver report and we haven't
-    // processed RTT for at least |kRtpRtcpRttProcessTimeMs| milliseconds.
-    if (rtcp_receiver_.LastReceivedReceiverReport() >
-        last_rtt_process_time_ && process_rtt) {
-      std::vector<RTCPReportBlock> receive_blocks;
-      rtcp_receiver_.StatisticsReceived(&receive_blocks);
-      int64_t max_rtt = 0;
-      for (std::vector<RTCPReportBlock>::iterator it = receive_blocks.begin();
-           it != receive_blocks.end(); ++it) {
-        int64_t rtt = 0;
-        rtcp_receiver_.RTT(it->sender_ssrc, &rtt, NULL, NULL, NULL);
-        max_rtt = (rtt > max_rtt) ? rtt : max_rtt;
-      }
-      // Report the rtt.
-      if (rtt_stats_ && max_rtt != 0)
-        rtt_stats_->OnRttUpdate(max_rtt);
-    }
-
-    // Verify receiver reports are delivered and the reported sequence number
-    // is increasing.
-    int64_t rtcp_interval = RtcpReportInterval();
-    if (rtcp_receiver_.RtcpRrTimeout(rtcp_interval)) {
-      LOG_F(LS_WARNING) << "Timeout: No RTCP RR received.";
-    } else if (rtcp_receiver_.RtcpRrSequenceNumberTimeout(rtcp_interval)) {
-      LOG_F(LS_WARNING) <<
-          "Timeout: No increase in RTCP RR extended highest sequence number.";
-    }
-
-    if (remote_bitrate_ && rtcp_sender_.TMMBR()) {
-      unsigned int target_bitrate = 0;
-      std::vector<unsigned int> ssrcs;
-      if (remote_bitrate_->LatestEstimate(&ssrcs, &target_bitrate)) {
-        if (!ssrcs.empty()) {
-          target_bitrate = target_bitrate / ssrcs.size();
-        }
-        rtcp_sender_.SetTargetBitrate(target_bitrate);
-      }
-    }
-  } else {
-    // Report rtt from receiver.
-    if (process_rtt) {
-       int64_t rtt_ms;
-       if (rtt_stats_ && rtcp_receiver_.GetAndResetXrRrRtt(&rtt_ms)) {
-         rtt_stats_->OnRttUpdate(rtt_ms);
-       }
-    }
-  }
-
-  // Get processed rtt.
-  if (process_rtt) {
-    last_rtt_process_time_ = now;
-    next_process_time_ = std::min(
-        next_process_time_, last_rtt_process_time_ + kRtpRtcpRttProcessTimeMs);
-    if (rtt_stats_) {
-      // Make sure we have a valid RTT before setting.
-      int64_t last_rtt = rtt_stats_->LastProcessedRtt();
-      if (last_rtt >= 0)
-        set_rtt_ms(last_rtt);
-    }
-  }
-
-  if (rtcp_sender_.TimeToSendRTCPReport())
-    rtcp_sender_.SendRTCP(GetFeedbackState(), kRtcpReport);
-
-  if (TMMBR() && rtcp_receiver_.UpdateTmmbrTimers()) {
-    rtcp_receiver_.NotifyTmmbrUpdated();
-  }
-}
-
-void ModuleRtpRtcpImpl::SetRtxSendStatus(int mode) {
-  rtp_sender_->SetRtxStatus(mode);
-}
-
-int ModuleRtpRtcpImpl::RtxSendStatus() const {
-  return rtp_sender_ ? rtp_sender_->RtxStatus() : kRtxOff;
-}
-
-void ModuleRtpRtcpImpl::SetRtxSsrc(uint32_t ssrc) {
-  rtp_sender_->SetRtxSsrc(ssrc);
-}
-
-void ModuleRtpRtcpImpl::SetRtxSendPayloadType(int payload_type,
-                                              int associated_payload_type) {
-  rtp_sender_->SetRtxPayloadType(payload_type, associated_payload_type);
-}
-
-rtc::Optional<uint32_t> ModuleRtpRtcpImpl::FlexfecSsrc() const {
-  if (rtp_sender_)
-    return rtp_sender_->FlexfecSsrc();
-  return rtc::Optional<uint32_t>();
-}
-
-void ModuleRtpRtcpImpl::IncomingRtcpPacket(const uint8_t* rtcp_packet,
-                                           const size_t length) {
-  rtcp_receiver_.IncomingPacket(rtcp_packet, length);
-}
-
-int32_t ModuleRtpRtcpImpl::RegisterSendPayload(
-    const CodecInst& voice_codec) {
-  return rtp_sender_->RegisterPayload(
-      voice_codec.plname, voice_codec.pltype, voice_codec.plfreq,
-      voice_codec.channels, (voice_codec.rate < 0) ? 0 : voice_codec.rate);
-}
-
-int32_t ModuleRtpRtcpImpl::RegisterSendPayload(const VideoCodec& video_codec) {
-  return rtp_sender_->RegisterPayload(video_codec.plName, video_codec.plType,
-                                     90000, 0, 0);
-}
-
-void ModuleRtpRtcpImpl::RegisterVideoSendPayload(int payload_type,
-                                                 const char* payload_name) {
-  RTC_CHECK_EQ(
-      0, rtp_sender_->RegisterPayload(payload_name, payload_type, 90000, 0, 0));
-}
-
-int32_t ModuleRtpRtcpImpl::DeRegisterSendPayload(const int8_t payload_type) {
-  return rtp_sender_->DeRegisterSendPayload(payload_type);
-}
-
-uint32_t ModuleRtpRtcpImpl::StartTimestamp() const {
-  return rtp_sender_->TimestampOffset();
-}
-
-// Configure start timestamp, default is a random number.
-void ModuleRtpRtcpImpl::SetStartTimestamp(const uint32_t timestamp) {
-  rtcp_sender_.SetTimestampOffset(timestamp);
-  rtp_sender_->SetTimestampOffset(timestamp);
-}
-
-uint16_t ModuleRtpRtcpImpl::SequenceNumber() const {
-  return rtp_sender_->SequenceNumber();
-}
-
-// Set SequenceNumber, default is a random number.
-void ModuleRtpRtcpImpl::SetSequenceNumber(const uint16_t seq_num) {
-  rtp_sender_->SetSequenceNumber(seq_num);
-}
-
-void ModuleRtpRtcpImpl::SetRtpState(const RtpState& rtp_state) {
-  rtp_sender_->SetRtpState(rtp_state);
-  rtcp_sender_.SetTimestampOffset(rtp_state.start_timestamp);
-}
-
-void ModuleRtpRtcpImpl::SetRtxState(const RtpState& rtp_state) {
-  rtp_sender_->SetRtxRtpState(rtp_state);
-}
-
-RtpState ModuleRtpRtcpImpl::GetRtpState() const {
-  return rtp_sender_->GetRtpState();
-}
-
-RtpState ModuleRtpRtcpImpl::GetRtxState() const {
-  return rtp_sender_->GetRtxRtpState();
-}
-
-uint32_t ModuleRtpRtcpImpl::SSRC() const {
-  return rtcp_sender_.SSRC();
-}
-
-void ModuleRtpRtcpImpl::SetSSRC(const uint32_t ssrc) {
-  if (rtp_sender_) {
-    rtp_sender_->SetSSRC(ssrc);
-  }
-  rtcp_sender_.SetSSRC(ssrc);
-  SetRtcpReceiverSsrcs(ssrc);
-}
-
-void ModuleRtpRtcpImpl::SetCsrcs(const std::vector<uint32_t>& csrcs) {
-  rtcp_sender_.SetCsrcs(csrcs);
-  rtp_sender_->SetCsrcs(csrcs);
-}
-
-// TODO(pbos): Handle media and RTX streams separately (separate RTCP
-// feedbacks).
-RTCPSender::FeedbackState ModuleRtpRtcpImpl::GetFeedbackState() {
-  RTCPSender::FeedbackState state;
-  // This is called also when receiver_only is true. Hence below
-  // checks that rtp_sender_ exists.
-  if (rtp_sender_) {
-    StreamDataCounters rtp_stats;
-    StreamDataCounters rtx_stats;
-    rtp_sender_->GetDataCounters(&rtp_stats, &rtx_stats);
-    state.packets_sent = rtp_stats.transmitted.packets +
-                         rtx_stats.transmitted.packets;
-    state.media_bytes_sent = rtp_stats.transmitted.payload_bytes +
-                             rtx_stats.transmitted.payload_bytes;
-    state.send_bitrate = rtp_sender_->BitrateSent();
-  }
-  state.module = this;
-
-  LastReceivedNTP(&state.last_rr_ntp_secs,
-                  &state.last_rr_ntp_frac,
-                  &state.remote_sr);
-
-  state.has_last_xr_rr =
-      rtcp_receiver_.LastReceivedXrReferenceTimeInfo(&state.last_xr_rr);
-
-  return state;
-}
-
-// TODO(nisse): This method shouldn't be called for a receive-only
-// stream. Delete rtp_sender_ check as soon as all applications are
-// updated.
-int32_t ModuleRtpRtcpImpl::SetSendingStatus(const bool sending) {
-  if (rtcp_sender_.Sending() != sending) {
-    // Sends RTCP BYE when going from true to false
-    if (rtcp_sender_.SetSendingStatus(GetFeedbackState(), sending) != 0) {
-      LOG(LS_WARNING) << "Failed to send RTCP BYE";
-    }
-    if (sending && rtp_sender_) {
-      // Update Rtcp receiver config, to track Rtx config changes from
-      // the SetRtxStatus and SetRtxSsrc methods.
-      SetRtcpReceiverSsrcs(rtp_sender_->SSRC());
-    }
-  }
-  return 0;
-}
-
-bool ModuleRtpRtcpImpl::Sending() const {
-  return rtcp_sender_.Sending();
-}
-
-// TODO(nisse): This method shouldn't be called for a receive-only
-// stream. Delete rtp_sender_ check as soon as all applications are
-// updated.
-void ModuleRtpRtcpImpl::SetSendingMediaStatus(const bool sending) {
-  if (rtp_sender_) {
-    rtp_sender_->SetSendingMediaStatus(sending);
-  } else {
-    RTC_DCHECK(!sending);
-  }
-}
-
-bool ModuleRtpRtcpImpl::SendingMedia() const {
-  return rtp_sender_ ? rtp_sender_->SendingMedia() : false;
-}
-
-bool ModuleRtpRtcpImpl::SendOutgoingData(
-    FrameType frame_type,
-    int8_t payload_type,
-    uint32_t time_stamp,
-    int64_t capture_time_ms,
-    const uint8_t* payload_data,
-    size_t payload_size,
-    const RTPFragmentationHeader* fragmentation,
-    const RTPVideoHeader* rtp_video_header,
-    uint32_t* transport_frame_id_out) {
-  rtcp_sender_.SetLastRtpTime(time_stamp, capture_time_ms);
-  // Make sure an RTCP report isn't queued behind a key frame.
-  if (rtcp_sender_.TimeToSendRTCPReport(kVideoFrameKey == frame_type)) {
-      rtcp_sender_.SendRTCP(GetFeedbackState(), kRtcpReport);
-  }
-  int64_t expected_retransmission_time_ms = rtt_ms();
-  if (expected_retransmission_time_ms == 0) {
-    // No rtt available (|kRtpRtcpRttProcessTimeMs| not yet passed?), so try to
-    // poll avg_rtt_ms directly from rtcp receiver.
-    if (rtcp_receiver_.RTT(rtcp_receiver_.RemoteSSRC(), nullptr,
-                           &expected_retransmission_time_ms, nullptr,
-                           nullptr) == -1) {
-      expected_retransmission_time_ms = kDefaultExpectedRetransmissionTimeMs;
-    }
-  }
-  return rtp_sender_->SendOutgoingData(
-      frame_type, payload_type, time_stamp, capture_time_ms, payload_data,
-      payload_size, fragmentation, rtp_video_header, transport_frame_id_out,
-      expected_retransmission_time_ms);
-}
-
-bool ModuleRtpRtcpImpl::TimeToSendPacket(uint32_t ssrc,
-                                         uint16_t sequence_number,
-                                         int64_t capture_time_ms,
-                                         bool retransmission,
-                                         const PacedPacketInfo& pacing_info) {
-  return rtp_sender_->TimeToSendPacket(ssrc, sequence_number, capture_time_ms,
-                                      retransmission, pacing_info);
-}
-
-size_t ModuleRtpRtcpImpl::TimeToSendPadding(
-    size_t bytes,
-    const PacedPacketInfo& pacing_info) {
-  return rtp_sender_->TimeToSendPadding(bytes, pacing_info);
-}
-
-size_t ModuleRtpRtcpImpl::MaxRtpPacketSize() const {
-  return rtp_sender_->MaxRtpPacketSize();
-}
-
-void ModuleRtpRtcpImpl::SetMaxRtpPacketSize(size_t rtp_packet_size) {
-  RTC_DCHECK_LE(rtp_packet_size, IP_PACKET_SIZE)
-      << "rtp packet size too large: " << rtp_packet_size;
-  RTC_DCHECK_GT(rtp_packet_size, packet_overhead_)
-      << "rtp packet size too small: " << rtp_packet_size;
-
-  rtcp_sender_.SetMaxRtpPacketSize(rtp_packet_size);
-  if (rtp_sender_)
-    rtp_sender_->SetMaxRtpPacketSize(rtp_packet_size);
-}
-
-RtcpMode ModuleRtpRtcpImpl::RTCP() const {
-  return rtcp_sender_.Status();
-}
-
-// Configure RTCP status i.e on/off.
-void ModuleRtpRtcpImpl::SetRTCPStatus(const RtcpMode method) {
-  rtcp_sender_.SetRTCPStatus(method);
-}
-
-int32_t ModuleRtpRtcpImpl::SetCNAME(const char* c_name) {
-  return rtcp_sender_.SetCNAME(c_name);
-}
-
-int32_t ModuleRtpRtcpImpl::AddMixedCNAME(uint32_t ssrc, const char* c_name) {
-  return rtcp_sender_.AddMixedCNAME(ssrc, c_name);
-}
-
-int32_t ModuleRtpRtcpImpl::RemoveMixedCNAME(const uint32_t ssrc) {
-  return rtcp_sender_.RemoveMixedCNAME(ssrc);
-}
-
-int32_t ModuleRtpRtcpImpl::RemoteCNAME(
-    const uint32_t remote_ssrc,
-    char c_name[RTCP_CNAME_SIZE]) const {
-  return rtcp_receiver_.CNAME(remote_ssrc, c_name);
-}
-
-int32_t ModuleRtpRtcpImpl::RemoteNTP(
-    uint32_t* received_ntpsecs,
-    uint32_t* received_ntpfrac,
-    uint32_t* rtcp_arrival_time_secs,
-    uint32_t* rtcp_arrival_time_frac,
-    uint32_t* rtcp_timestamp) const {
-  return rtcp_receiver_.NTP(received_ntpsecs,
-                            received_ntpfrac,
-                            rtcp_arrival_time_secs,
-                            rtcp_arrival_time_frac,
-                            rtcp_timestamp)
-             ? 0
-             : -1;
-}
-
-// Get RoundTripTime.
-int32_t ModuleRtpRtcpImpl::RTT(const uint32_t remote_ssrc,
-                               int64_t* rtt,
-                               int64_t* avg_rtt,
-                               int64_t* min_rtt,
-                               int64_t* max_rtt) const {
-  int32_t ret = rtcp_receiver_.RTT(remote_ssrc, rtt, avg_rtt, min_rtt, max_rtt);
-  if (rtt && *rtt == 0) {
-    // Try to get RTT from RtcpRttStats class.
-    *rtt = rtt_ms();
-  }
-  return ret;
-}
-
-// Force a send of an RTCP packet.
-// Normal SR and RR are triggered via the process function.
-int32_t ModuleRtpRtcpImpl::SendRTCP(RTCPPacketType packet_type) {
-  return rtcp_sender_.SendRTCP(GetFeedbackState(), packet_type);
-}
-
-// Force a send of an RTCP packet.
-// Normal SR and RR are triggered via the process function.
-int32_t ModuleRtpRtcpImpl::SendCompoundRTCP(
-    const std::set<RTCPPacketType>& packet_types) {
-  return rtcp_sender_.SendCompoundRTCP(GetFeedbackState(), packet_types);
-}
-
-int32_t ModuleRtpRtcpImpl::SetRTCPApplicationSpecificData(
-    const uint8_t sub_type,
-    const uint32_t name,
-    const uint8_t* data,
-    const uint16_t length) {
-  return  rtcp_sender_.SetApplicationSpecificData(sub_type, name, data, length);
-}
-
-// (XR) VOIP metric.
-int32_t ModuleRtpRtcpImpl::SetRTCPVoIPMetrics(
-  const RTCPVoIPMetric* voip_metric) {
-  return  rtcp_sender_.SetRTCPVoIPMetrics(voip_metric);
-}
-
-void ModuleRtpRtcpImpl::SetRtcpXrRrtrStatus(bool enable) {
-  rtcp_receiver_.SetRtcpXrRrtrStatus(enable);
-  rtcp_sender_.SendRtcpXrReceiverReferenceTime(enable);
-}
-
-bool ModuleRtpRtcpImpl::RtcpXrRrtrStatus() const {
-  return rtcp_sender_.RtcpXrReceiverReferenceTime();
-}
-
-// TODO(asapersson): Replace this method with the one below.
-int32_t ModuleRtpRtcpImpl::DataCountersRTP(
-    size_t* bytes_sent,
-    uint32_t* packets_sent) const {
-  StreamDataCounters rtp_stats;
-  StreamDataCounters rtx_stats;
-  rtp_sender_->GetDataCounters(&rtp_stats, &rtx_stats);
-
-  if (bytes_sent) {
-    *bytes_sent = rtp_stats.transmitted.payload_bytes +
-                  rtp_stats.transmitted.padding_bytes +
-                  rtp_stats.transmitted.header_bytes +
-                  rtx_stats.transmitted.payload_bytes +
-                  rtx_stats.transmitted.padding_bytes +
-                  rtx_stats.transmitted.header_bytes;
-  }
-  if (packets_sent) {
-    *packets_sent = rtp_stats.transmitted.packets +
-                    rtx_stats.transmitted.packets;
-  }
-  return 0;
-}
-
-void ModuleRtpRtcpImpl::GetSendStreamDataCounters(
-    StreamDataCounters* rtp_counters,
-    StreamDataCounters* rtx_counters) const {
-  rtp_sender_->GetDataCounters(rtp_counters, rtx_counters);
-}
-
-void ModuleRtpRtcpImpl::GetRtpPacketLossStats(
-    bool outgoing,
-    uint32_t ssrc,
-    struct RtpPacketLossStats* loss_stats) const {
-  if (!loss_stats) return;
-  const PacketLossStats* stats_source = NULL;
-  if (outgoing) {
-    if (SSRC() == ssrc) {
-      stats_source = &send_loss_stats_;
-    }
-  } else {
-    if (rtcp_receiver_.RemoteSSRC() == ssrc) {
-      stats_source = &receive_loss_stats_;
-    }
-  }
-  if (stats_source) {
-    loss_stats->single_packet_loss_count =
-        stats_source->GetSingleLossCount();
-    loss_stats->multiple_packet_loss_event_count =
-        stats_source->GetMultipleLossEventCount();
-    loss_stats->multiple_packet_loss_packet_count =
-        stats_source->GetMultipleLossPacketCount();
-  }
-}
-
-// Received RTCP report.
-int32_t ModuleRtpRtcpImpl::RemoteRTCPStat(
-    std::vector<RTCPReportBlock>* receive_blocks) const {
-  return rtcp_receiver_.StatisticsReceived(receive_blocks);
-}
-
-// (REMB) Receiver Estimated Max Bitrate.
-bool ModuleRtpRtcpImpl::REMB() const {
-  return rtcp_sender_.REMB();
-}
-
-void ModuleRtpRtcpImpl::SetREMBStatus(const bool enable) {
-  rtcp_sender_.SetREMBStatus(enable);
-}
-
-void ModuleRtpRtcpImpl::SetREMBData(const uint32_t bitrate,
-                                    const std::vector<uint32_t>& ssrcs) {
-  rtcp_sender_.SetREMBData(bitrate, ssrcs);
-}
-
-int32_t ModuleRtpRtcpImpl::RegisterSendRtpHeaderExtension(
-    const RTPExtensionType type,
-    const uint8_t id) {
-  return rtp_sender_->RegisterRtpHeaderExtension(type, id);
-}
-
-int32_t ModuleRtpRtcpImpl::DeregisterSendRtpHeaderExtension(
-    const RTPExtensionType type) {
-  return rtp_sender_->DeregisterRtpHeaderExtension(type);
-}
-
-bool ModuleRtpRtcpImpl::HasBweExtensions() const {
-  return rtp_sender_->IsRtpHeaderExtensionRegistered(
-             kRtpExtensionTransportSequenceNumber) ||
-         rtp_sender_->IsRtpHeaderExtensionRegistered(
-             kRtpExtensionAbsoluteSendTime) ||
-         rtp_sender_->IsRtpHeaderExtensionRegistered(
-             kRtpExtensionTransmissionTimeOffset);
-}
-
-// (TMMBR) Temporary Max Media Bit Rate.
-bool ModuleRtpRtcpImpl::TMMBR() const {
-  return rtcp_sender_.TMMBR();
-}
-
-void ModuleRtpRtcpImpl::SetTMMBRStatus(const bool enable) {
-  rtcp_sender_.SetTMMBRStatus(enable);
-}
-
-void ModuleRtpRtcpImpl::SetTmmbn(std::vector<rtcp::TmmbItem> bounding_set) {
-  rtcp_sender_.SetTmmbn(std::move(bounding_set));
-}
-
-// Returns the currently configured retransmission mode.
-int ModuleRtpRtcpImpl::SelectiveRetransmissions() const {
-  return rtp_sender_->SelectiveRetransmissions();
-}
-
-// Enable or disable a retransmission mode, which decides which packets will
-// be retransmitted if NACKed.
-int ModuleRtpRtcpImpl::SetSelectiveRetransmissions(uint8_t settings) {
-  return rtp_sender_->SetSelectiveRetransmissions(settings);
-}
-
-// Send a Negative acknowledgment packet.
-int32_t ModuleRtpRtcpImpl::SendNACK(const uint16_t* nack_list,
-                                    const uint16_t size) {
-  for (int i = 0; i < size; ++i) {
-    receive_loss_stats_.AddLostPacket(nack_list[i]);
-  }
-  uint16_t nack_length = size;
-  uint16_t start_id = 0;
-  int64_t now = clock_->TimeInMilliseconds();
-  if (TimeToSendFullNackList(now)) {
-    nack_last_time_sent_full_ = now;
-    nack_last_time_sent_full_prev_ = now;
-  } else {
-    // Only send extended list.
-    if (nack_last_seq_number_sent_ == nack_list[size - 1]) {
-      // Last sequence number is the same, do not send list.
-      return 0;
-    }
-    // Send new sequence numbers.
-    for (int i = 0; i < size; ++i) {
-      if (nack_last_seq_number_sent_ == nack_list[i]) {
-        start_id = i + 1;
-        break;
-      }
-    }
-    nack_length = size - start_id;
-  }
-
-  // Our RTCP NACK implementation is limited to kRtcpMaxNackFields sequence
-  // numbers per RTCP packet.
-  if (nack_length > kRtcpMaxNackFields) {
-    nack_length = kRtcpMaxNackFields;
-  }
-  nack_last_seq_number_sent_ = nack_list[start_id + nack_length - 1];
-
-  return rtcp_sender_.SendRTCP(GetFeedbackState(), kRtcpNack, nack_length,
-                               &nack_list[start_id]);
-}
-
-void ModuleRtpRtcpImpl::SendNack(
-    const std::vector<uint16_t>& sequence_numbers) {
-  rtcp_sender_.SendRTCP(GetFeedbackState(), kRtcpNack, sequence_numbers.size(),
-                        sequence_numbers.data());
-}
-
-bool ModuleRtpRtcpImpl::TimeToSendFullNackList(int64_t now) const {
-  // Use RTT from RtcpRttStats class if provided.
-  int64_t rtt = rtt_ms();
-  if (rtt == 0) {
-    rtcp_receiver_.RTT(rtcp_receiver_.RemoteSSRC(), NULL, &rtt, NULL, NULL);
-  }
-
-  const int64_t kStartUpRttMs = 100;
-  int64_t wait_time = 5 + ((rtt * 3) >> 1);  // 5 + RTT * 1.5.
-  if (rtt == 0) {
-    wait_time = kStartUpRttMs;
-  }
-
-  // Send a full NACK list once within every |wait_time|.
-  if (rtt_stats_) {
-    return now - nack_last_time_sent_full_ > wait_time;
-  }
-  return now - nack_last_time_sent_full_prev_ > wait_time;
-}
-
-// Store the sent packets, needed to answer to Negative acknowledgment requests.
-void ModuleRtpRtcpImpl::SetStorePacketsStatus(const bool enable,
-                                              const uint16_t number_to_store) {
-  rtp_sender_->SetStorePacketsStatus(enable, number_to_store);
-}
-
-bool ModuleRtpRtcpImpl::StorePackets() const {
-  return rtp_sender_->StorePackets();
-}
-
-void ModuleRtpRtcpImpl::RegisterRtcpStatisticsCallback(
-    RtcpStatisticsCallback* callback) {
-  rtcp_receiver_.RegisterRtcpStatisticsCallback(callback);
-}
-
-RtcpStatisticsCallback* ModuleRtpRtcpImpl::GetRtcpStatisticsCallback() {
-  return rtcp_receiver_.GetRtcpStatisticsCallback();
-}
-
-bool ModuleRtpRtcpImpl::SendFeedbackPacket(
-    const rtcp::TransportFeedback& packet) {
-  return rtcp_sender_.SendFeedbackPacket(packet);
-}
-
-// Send a TelephoneEvent tone using RFC 2833 (4733).
-int32_t ModuleRtpRtcpImpl::SendTelephoneEventOutband(
-    const uint8_t key,
-    const uint16_t time_ms,
-    const uint8_t level) {
-  return rtp_sender_->SendTelephoneEvent(key, time_ms, level);
-}
-
-int32_t ModuleRtpRtcpImpl::SetAudioLevel(
-    const uint8_t level_d_bov) {
-  return rtp_sender_->SetAudioLevel(level_d_bov);
-}
-
-int32_t ModuleRtpRtcpImpl::SetKeyFrameRequestMethod(
-    const KeyFrameRequestMethod method) {
-  key_frame_req_method_ = method;
-  return 0;
-}
-
-int32_t ModuleRtpRtcpImpl::RequestKeyFrame() {
-  switch (key_frame_req_method_) {
-    case kKeyFrameReqPliRtcp:
-      return SendRTCP(kRtcpPli);
-    case kKeyFrameReqFirRtcp:
-      return SendRTCP(kRtcpFir);
-  }
-  return -1;
-}
-
-void ModuleRtpRtcpImpl::SetUlpfecConfig(int red_payload_type,
-                                        int ulpfec_payload_type) {
-  rtp_sender_->SetUlpfecConfig(red_payload_type, ulpfec_payload_type);
-}
-
-bool ModuleRtpRtcpImpl::SetFecParameters(
-    const FecProtectionParams& delta_params,
-    const FecProtectionParams& key_params) {
-  return rtp_sender_->SetFecParameters(delta_params, key_params);
-}
-
-void ModuleRtpRtcpImpl::SetRemoteSSRC(const uint32_t ssrc) {
-  // Inform about the incoming SSRC.
-  rtcp_sender_.SetRemoteSSRC(ssrc);
-  rtcp_receiver_.SetRemoteSSRC(ssrc);
-}
-
-void ModuleRtpRtcpImpl::BitrateSent(uint32_t* total_rate,
-                                    uint32_t* video_rate,
-                                    uint32_t* fec_rate,
-                                    uint32_t* nack_rate) const {
-  *total_rate = rtp_sender_->BitrateSent();
-  *video_rate = rtp_sender_->VideoBitrateSent();
-  *fec_rate = rtp_sender_->FecOverheadRate();
-  *nack_rate = rtp_sender_->NackOverheadRate();
-}
-
-void ModuleRtpRtcpImpl::OnRequestSendReport() {
-  SendRTCP(kRtcpSr);
-}
-
-void ModuleRtpRtcpImpl::OnReceivedNack(
-    const std::vector<uint16_t>& nack_sequence_numbers) {
-  if (!rtp_sender_)
-    return;
-
-  for (uint16_t nack_sequence_number : nack_sequence_numbers) {
-    send_loss_stats_.AddLostPacket(nack_sequence_number);
-  }
-  if (!rtp_sender_->StorePackets() ||
-      nack_sequence_numbers.size() == 0) {
-    return;
-  }
-  // Use RTT from RtcpRttStats class if provided.
-  int64_t rtt = rtt_ms();
-  if (rtt == 0) {
-    rtcp_receiver_.RTT(rtcp_receiver_.RemoteSSRC(), NULL, &rtt, NULL, NULL);
-  }
-  rtp_sender_->OnReceivedNack(nack_sequence_numbers, rtt);
-}
-
-void ModuleRtpRtcpImpl::OnReceivedRtcpReportBlocks(
-    const ReportBlockList& report_blocks) {
-  if (rtp_sender_)
-    rtp_sender_->OnReceivedRtcpReportBlocks(report_blocks);
-}
-
-bool ModuleRtpRtcpImpl::LastReceivedNTP(
-    uint32_t* rtcp_arrival_time_secs,  // When we got the last report.
-    uint32_t* rtcp_arrival_time_frac,
-    uint32_t* remote_sr) const {
-  // Remote SR: NTP inside the last received (mid 16 bits from sec and frac).
-  uint32_t ntp_secs = 0;
-  uint32_t ntp_frac = 0;
-
-  if (!rtcp_receiver_.NTP(&ntp_secs,
-                          &ntp_frac,
-                          rtcp_arrival_time_secs,
-                          rtcp_arrival_time_frac,
-                          NULL)) {
-    return false;
-  }
-  *remote_sr =
-      ((ntp_secs & 0x0000ffff) << 16) + ((ntp_frac & 0xffff0000) >> 16);
-  return true;
-}
-
-// Called from RTCPsender.
-std::vector<rtcp::TmmbItem> ModuleRtpRtcpImpl::BoundingSet(bool* tmmbr_owner) {
-  return rtcp_receiver_.BoundingSet(tmmbr_owner);
-}
-
-int64_t ModuleRtpRtcpImpl::RtcpReportInterval() {
-  if (audio_)
-    return RTCP_INTERVAL_AUDIO_MS;
-  else
-    return RTCP_INTERVAL_VIDEO_MS;
-}
-
-void ModuleRtpRtcpImpl::SetRtcpReceiverSsrcs(uint32_t main_ssrc) {
-  std::set<uint32_t> ssrcs;
-  ssrcs.insert(main_ssrc);
-  if (RtxSendStatus() != kRtxOff)
-    ssrcs.insert(rtp_sender_->RtxSsrc());
-  rtc::Optional<uint32_t> flexfec_ssrc = FlexfecSsrc();
-  if (flexfec_ssrc)
-    ssrcs.insert(*flexfec_ssrc);
-  rtcp_receiver_.SetSsrcs(main_ssrc, ssrcs);
-}
-
-void ModuleRtpRtcpImpl::set_rtt_ms(int64_t rtt_ms) {
-  rtc::CritScope cs(&critical_section_rtt_);
-  rtt_ms_ = rtt_ms;
-}
-
-int64_t ModuleRtpRtcpImpl::rtt_ms() const {
-  rtc::CritScope cs(&critical_section_rtt_);
-  return rtt_ms_;
-}
-
-void ModuleRtpRtcpImpl::RegisterSendChannelRtpStatisticsCallback(
-    StreamDataCountersCallback* callback) {
-  rtp_sender_->RegisterRtpStatisticsCallback(callback);
-}
-
-StreamDataCountersCallback*
-    ModuleRtpRtcpImpl::GetSendChannelRtpStatisticsCallback() const {
-  return rtp_sender_->GetRtpStatisticsCallback();
-}
-
-void ModuleRtpRtcpImpl::SetVideoBitrateAllocation(
-    const BitrateAllocation& bitrate) {
-  rtcp_sender_.SetVideoBitrateAllocation(bitrate);
-}
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/rtp_rtcp_impl.h b/modules/rtp_rtcp/source/rtp_rtcp_impl.h
deleted file mode 100644
index 70edc9d..0000000
--- a/modules/rtp_rtcp/source/rtp_rtcp_impl.h
+++ /dev/null
@@ -1,360 +0,0 @@
-/*
- *  Copyright (c) 2012 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_RTP_RTCP_SOURCE_RTP_RTCP_IMPL_H_
-#define WEBRTC_MODULES_RTP_RTCP_SOURCE_RTP_RTCP_IMPL_H_
-
-#include <memory>
-#include <set>
-#include <utility>
-#include <vector>
-
-#include "webrtc/api/optional.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
-#include "webrtc/modules/rtp_rtcp/source/packet_loss_stats.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_receiver.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_sender.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_sender.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/gtest_prod_util.h"
-
-namespace webrtc {
-
-class ModuleRtpRtcpImpl : public RtpRtcp, public RTCPReceiver::ModuleRtpRtcp {
- public:
-  explicit ModuleRtpRtcpImpl(const RtpRtcp::Configuration& configuration);
-
-  // Returns the number of milliseconds until the module want a worker thread to
-  // call Process.
-  int64_t TimeUntilNextProcess() override;
-
-  // Process any pending tasks such as timeouts.
-  void Process() override;
-
-  // Receiver part.
-
-  // Called when we receive an RTCP packet.
-  void IncomingRtcpPacket(const uint8_t* incoming_packet,
-                          size_t incoming_packet_length) override;
-
-  void SetRemoteSSRC(uint32_t ssrc) override;
-
-  // Sender part.
-
-  int32_t RegisterSendPayload(const CodecInst& voice_codec) override;
-
-  int32_t RegisterSendPayload(const VideoCodec& video_codec) override;
-
-  void RegisterVideoSendPayload(int payload_type,
-                                const char* payload_name) override;
-
-  int32_t DeRegisterSendPayload(int8_t payload_type) override;
-
-  // Register RTP header extension.
-  int32_t RegisterSendRtpHeaderExtension(RTPExtensionType type,
-                                         uint8_t id) override;
-
-  int32_t DeregisterSendRtpHeaderExtension(RTPExtensionType type) override;
-
-  bool HasBweExtensions() const override;
-
-  // Get start timestamp.
-  uint32_t StartTimestamp() const override;
-
-  // Configure start timestamp, default is a random number.
-  void SetStartTimestamp(uint32_t timestamp) override;
-
-  uint16_t SequenceNumber() const override;
-
-  // Set SequenceNumber, default is a random number.
-  void SetSequenceNumber(uint16_t seq) override;
-
-  void SetRtpState(const RtpState& rtp_state) override;
-  void SetRtxState(const RtpState& rtp_state) override;
-  RtpState GetRtpState() const override;
-  RtpState GetRtxState() const override;
-
-  uint32_t SSRC() const override;
-
-  // Configure SSRC, default is a random number.
-  void SetSSRC(uint32_t ssrc) override;
-
-  void SetCsrcs(const std::vector<uint32_t>& csrcs) override;
-
-  RTCPSender::FeedbackState GetFeedbackState();
-
-  void SetRtxSendStatus(int mode) override;
-  int RtxSendStatus() const override;
-
-  void SetRtxSsrc(uint32_t ssrc) override;
-
-  void SetRtxSendPayloadType(int payload_type,
-                             int associated_payload_type) override;
-
-  rtc::Optional<uint32_t> FlexfecSsrc() const override;
-
-  // Sends kRtcpByeCode when going from true to false.
-  int32_t SetSendingStatus(bool sending) override;
-
-  bool Sending() const override;
-
-  // Drops or relays media packets.
-  void SetSendingMediaStatus(bool sending) override;
-
-  bool SendingMedia() const override;
-
-  // Used by the codec module to deliver a video or audio frame for
-  // packetization.
-  bool SendOutgoingData(FrameType frame_type,
-                        int8_t payload_type,
-                        uint32_t time_stamp,
-                        int64_t capture_time_ms,
-                        const uint8_t* payload_data,
-                        size_t payload_size,
-                        const RTPFragmentationHeader* fragmentation,
-                        const RTPVideoHeader* rtp_video_header,
-                        uint32_t* transport_frame_id_out) override;
-
-  bool TimeToSendPacket(uint32_t ssrc,
-                        uint16_t sequence_number,
-                        int64_t capture_time_ms,
-                        bool retransmission,
-                        const PacedPacketInfo& pacing_info) override;
-
-  // Returns the number of padding bytes actually sent, which can be more or
-  // less than |bytes|.
-  size_t TimeToSendPadding(size_t bytes,
-                           const PacedPacketInfo& pacing_info) override;
-
-  // RTCP part.
-
-  // Get RTCP status.
-  RtcpMode RTCP() const override;
-
-  // Configure RTCP status i.e on/off.
-  void SetRTCPStatus(RtcpMode method) override;
-
-  // Set RTCP CName.
-  int32_t SetCNAME(const char* c_name) override;
-
-  // Get remote CName.
-  int32_t RemoteCNAME(uint32_t remote_ssrc,
-                      char c_name[RTCP_CNAME_SIZE]) const override;
-
-  // Get remote NTP.
-  int32_t RemoteNTP(uint32_t* received_ntp_secs,
-                    uint32_t* received_ntp_frac,
-                    uint32_t* rtcp_arrival_time_secs,
-                    uint32_t* rtcp_arrival_time_frac,
-                    uint32_t* rtcp_timestamp) const override;
-
-  int32_t AddMixedCNAME(uint32_t ssrc, const char* c_name) override;
-
-  int32_t RemoveMixedCNAME(uint32_t ssrc) override;
-
-  // Get RoundTripTime.
-  int32_t RTT(uint32_t remote_ssrc,
-              int64_t* rtt,
-              int64_t* avg_rtt,
-              int64_t* min_rtt,
-              int64_t* max_rtt) const override;
-
-  // Force a send of an RTCP packet.
-  // Normal SR and RR are triggered via the process function.
-  int32_t SendRTCP(RTCPPacketType rtcpPacketType) override;
-
-  int32_t SendCompoundRTCP(
-      const std::set<RTCPPacketType>& rtcpPacketTypes) override;
-
-  // Statistics of the amount of data sent and received.
-  int32_t DataCountersRTP(size_t* bytes_sent,
-                          uint32_t* packets_sent) const override;
-
-  void GetSendStreamDataCounters(
-      StreamDataCounters* rtp_counters,
-      StreamDataCounters* rtx_counters) const override;
-
-  void GetRtpPacketLossStats(
-      bool outgoing,
-      uint32_t ssrc,
-      struct RtpPacketLossStats* loss_stats) const override;
-
-  // Get received RTCP report, report block.
-  int32_t RemoteRTCPStat(
-      std::vector<RTCPReportBlock>* receive_blocks) const override;
-
-  // (REMB) Receiver Estimated Max Bitrate.
-  bool REMB() const override;
-
-  void SetREMBStatus(bool enable) override;
-
-  void SetREMBData(uint32_t bitrate,
-                   const std::vector<uint32_t>& ssrcs) override;
-
-  // (TMMBR) Temporary Max Media Bit Rate.
-  bool TMMBR() const override;
-
-  void SetTMMBRStatus(bool enable) override;
-
-  void SetTmmbn(std::vector<rtcp::TmmbItem> bounding_set) override;
-
-  size_t MaxRtpPacketSize() const override;
-
-  void SetMaxRtpPacketSize(size_t max_packet_size) override;
-
-  // (NACK) Negative acknowledgment part.
-
-  int SelectiveRetransmissions() const override;
-
-  int SetSelectiveRetransmissions(uint8_t settings) override;
-
-  // Send a Negative acknowledgment packet.
-  // TODO(philipel): Deprecate SendNACK and use SendNack instead.
-  int32_t SendNACK(const uint16_t* nack_list, uint16_t size) override;
-
-  void SendNack(const std::vector<uint16_t>& sequence_numbers) override;
-
-  // Store the sent packets, needed to answer to a negative acknowledgment
-  // requests.
-  void SetStorePacketsStatus(bool enable, uint16_t number_to_store) override;
-
-  bool StorePackets() const override;
-
-  // Called on receipt of RTCP report block from remote side.
-  void RegisterRtcpStatisticsCallback(
-      RtcpStatisticsCallback* callback) override;
-  RtcpStatisticsCallback* GetRtcpStatisticsCallback() override;
-
-  bool SendFeedbackPacket(const rtcp::TransportFeedback& packet) override;
-  // (APP) Application specific data.
-  int32_t SetRTCPApplicationSpecificData(uint8_t sub_type,
-                                         uint32_t name,
-                                         const uint8_t* data,
-                                         uint16_t length) override;
-
-  // (XR) VOIP metric.
-  int32_t SetRTCPVoIPMetrics(const RTCPVoIPMetric* VoIPMetric) override;
-
-  // (XR) Receiver reference time report.
-  void SetRtcpXrRrtrStatus(bool enable) override;
-
-  bool RtcpXrRrtrStatus() const override;
-
-  // Audio part.
-
-  // Send a TelephoneEvent tone using RFC 2833 (4733).
-  int32_t SendTelephoneEventOutband(uint8_t key,
-                                    uint16_t time_ms,
-                                    uint8_t level) override;
-
-  // Store the audio level in d_bov for header-extension-for-audio-level-
-  // indication.
-  int32_t SetAudioLevel(uint8_t level_d_bov) override;
-
-  // Video part.
-
-  // Set method for requesting a new key frame.
-  int32_t SetKeyFrameRequestMethod(KeyFrameRequestMethod method) override;
-
-  // Send a request for a keyframe.
-  int32_t RequestKeyFrame() override;
-
-  void SetUlpfecConfig(int red_payload_type, int ulpfec_payload_type) override;
-
-  bool SetFecParameters(const FecProtectionParams& delta_params,
-                        const FecProtectionParams& key_params) override;
-
-  bool LastReceivedNTP(uint32_t* NTPsecs,
-                       uint32_t* NTPfrac,
-                       uint32_t* remote_sr) const;
-
-  std::vector<rtcp::TmmbItem> BoundingSet(bool* tmmbr_owner);
-
-  void BitrateSent(uint32_t* total_rate,
-                   uint32_t* video_rate,
-                   uint32_t* fec_rate,
-                   uint32_t* nackRate) const override;
-
-  void RegisterSendChannelRtpStatisticsCallback(
-      StreamDataCountersCallback* callback) override;
-  StreamDataCountersCallback* GetSendChannelRtpStatisticsCallback()
-      const override;
-
-  void OnReceivedNack(
-      const std::vector<uint16_t>& nack_sequence_numbers) override;
-  void OnReceivedRtcpReportBlocks(
-      const ReportBlockList& report_blocks) override;
-  void OnRequestSendReport() override;
-
-  void SetVideoBitrateAllocation(const BitrateAllocation& bitrate) override;
-
- protected:
-  bool UpdateRTCPReceiveInformationTimers();
-
-  RTPSender* rtp_sender() { return rtp_sender_.get(); }
-  const RTPSender* rtp_sender() const { return rtp_sender_.get(); }
-
-  RTCPSender* rtcp_sender() { return &rtcp_sender_; }
-  const RTCPSender* rtcp_sender() const { return &rtcp_sender_; }
-
-  RTCPReceiver* rtcp_receiver() { return &rtcp_receiver_; }
-  const RTCPReceiver* rtcp_receiver() const { return &rtcp_receiver_; }
-
-  const Clock* clock() const { return clock_; }
-
- private:
-  FRIEND_TEST_ALL_PREFIXES(RtpRtcpImplTest, Rtt);
-  FRIEND_TEST_ALL_PREFIXES(RtpRtcpImplTest, RttForReceiverOnly);
-  int64_t RtcpReportInterval();
-  void SetRtcpReceiverSsrcs(uint32_t main_ssrc);
-
-  void set_rtt_ms(int64_t rtt_ms);
-  int64_t rtt_ms() const;
-
-  bool TimeToSendFullNackList(int64_t now) const;
-
-  std::unique_ptr<RTPSender> rtp_sender_;
-  RTCPSender rtcp_sender_;
-  RTCPReceiver rtcp_receiver_;
-
-  const Clock* const clock_;
-
-  const bool audio_;
-
-  const RtpKeepAliveConfig keepalive_config_;
-  int64_t last_bitrate_process_time_;
-  int64_t last_rtt_process_time_;
-  int64_t next_process_time_;
-  int64_t next_keepalive_time_;
-  uint16_t packet_overhead_;
-
-  // Send side
-  int64_t nack_last_time_sent_full_;
-  uint32_t nack_last_time_sent_full_prev_;
-  uint16_t nack_last_seq_number_sent_;
-
-  KeyFrameRequestMethod key_frame_req_method_;
-
-  RemoteBitrateEstimator* remote_bitrate_;
-
-  RtcpRttStats* rtt_stats_;
-
-  PacketLossStats send_loss_stats_;
-  PacketLossStats receive_loss_stats_;
-
-  // The processed RTT from RtcpRttStats.
-  rtc::CriticalSection critical_section_rtt_;
-  int64_t rtt_ms_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_RTP_RTCP_SOURCE_RTP_RTCP_IMPL_H_
diff --git a/modules/rtp_rtcp/source/rtp_rtcp_impl_unittest.cc b/modules/rtp_rtcp/source/rtp_rtcp_impl_unittest.cc
deleted file mode 100644
index aa9db2a..0000000
--- a/modules/rtp_rtcp/source/rtp_rtcp_impl_unittest.cc
+++ /dev/null
@@ -1,646 +0,0 @@
-/*
- *  Copyright (c) 2013 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 <map>
-#include <memory>
-#include <set>
-
-#include "webrtc/common_types.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_header_parser.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/nack.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_rtcp_impl.h"
-#include "webrtc/rtc_base/rate_limiter.h"
-#include "webrtc/test/gmock.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/rtcp_packet_parser.h"
-
-using ::testing::_;
-using ::testing::ElementsAre;
-using ::testing::NiceMock;
-using ::testing::Return;
-using ::testing::SaveArg;
-
-namespace webrtc {
-namespace {
-const uint32_t kSenderSsrc = 0x12345;
-const uint32_t kReceiverSsrc = 0x23456;
-const int64_t kOneWayNetworkDelayMs = 100;
-const uint8_t kBaseLayerTid = 0;
-const uint8_t kHigherLayerTid = 1;
-const uint16_t kSequenceNumber = 100;
-const int64_t kMaxRttMs = 1000;
-
-class RtcpRttStatsTestImpl : public RtcpRttStats {
- public:
-  RtcpRttStatsTestImpl() : rtt_ms_(0) {}
-  virtual ~RtcpRttStatsTestImpl() {}
-
-  void OnRttUpdate(int64_t rtt_ms) override { rtt_ms_ = rtt_ms; }
-  int64_t LastProcessedRtt() const override { return rtt_ms_; }
-  int64_t rtt_ms_;
-};
-
-class SendTransport : public Transport,
-                      public RtpData {
- public:
-  SendTransport()
-      : receiver_(nullptr),
-        clock_(nullptr),
-        delay_ms_(0),
-        rtp_packets_sent_(0),
-        keepalive_payload_type_(0),
-        num_keepalive_sent_(0) {}
-
-  void SetRtpRtcpModule(ModuleRtpRtcpImpl* receiver) {
-    receiver_ = receiver;
-  }
-  void SimulateNetworkDelay(int64_t delay_ms, SimulatedClock* clock) {
-    clock_ = clock;
-    delay_ms_ = delay_ms;
-  }
-  bool SendRtp(const uint8_t* data,
-               size_t len,
-               const PacketOptions& options) override {
-    RTPHeader header;
-    std::unique_ptr<RtpHeaderParser> parser(RtpHeaderParser::Create());
-    EXPECT_TRUE(parser->Parse(static_cast<const uint8_t*>(data), len, &header));
-    ++rtp_packets_sent_;
-    if (header.payloadType == keepalive_payload_type_)
-      ++num_keepalive_sent_;
-    last_rtp_header_ = header;
-    return true;
-  }
-  bool SendRtcp(const uint8_t* data, size_t len) override {
-    test::RtcpPacketParser parser;
-    parser.Parse(data, len);
-    last_nack_list_ = parser.nack()->packet_ids();
-
-    if (clock_) {
-      clock_->AdvanceTimeMilliseconds(delay_ms_);
-    }
-    EXPECT_TRUE(receiver_);
-    receiver_->IncomingRtcpPacket(data, len);
-    return true;
-  }
-  int32_t OnReceivedPayloadData(const uint8_t* payload_data,
-                                size_t payload_size,
-                                const WebRtcRTPHeader* rtp_header) override {
-    return 0;
-  }
-  void SetKeepalivePayloadType(uint8_t payload_type) {
-    keepalive_payload_type_ = payload_type;
-  }
-  size_t NumKeepaliveSent() { return num_keepalive_sent_; }
-  ModuleRtpRtcpImpl* receiver_;
-  SimulatedClock* clock_;
-  int64_t delay_ms_;
-  int rtp_packets_sent_;
-  RTPHeader last_rtp_header_;
-  std::vector<uint16_t> last_nack_list_;
-  uint8_t keepalive_payload_type_;
-  size_t num_keepalive_sent_;
-};
-
-class RtpRtcpModule : public RtcpPacketTypeCounterObserver {
- public:
-  explicit RtpRtcpModule(SimulatedClock* clock)
-      : receive_statistics_(ReceiveStatistics::Create(clock)),
-        remote_ssrc_(0),
-        retransmission_rate_limiter_(clock, kMaxRttMs),
-        clock_(clock) {
-    CreateModuleImpl();
-    transport_.SimulateNetworkDelay(kOneWayNetworkDelayMs, clock);
-  }
-
-  RtcpPacketTypeCounter packets_sent_;
-  RtcpPacketTypeCounter packets_received_;
-  std::unique_ptr<ReceiveStatistics> receive_statistics_;
-  SendTransport transport_;
-  RtcpRttStatsTestImpl rtt_stats_;
-  std::unique_ptr<ModuleRtpRtcpImpl> impl_;
-  uint32_t remote_ssrc_;
-  RateLimiter retransmission_rate_limiter_;
-  RtpKeepAliveConfig keepalive_config_;
-
-  void SetRemoteSsrc(uint32_t ssrc) {
-    remote_ssrc_ = ssrc;
-    impl_->SetRemoteSSRC(ssrc);
-  }
-
-  void RtcpPacketTypesCounterUpdated(
-      uint32_t ssrc,
-      const RtcpPacketTypeCounter& packet_counter) override {
-    counter_map_[ssrc] = packet_counter;
-  }
-
-  RtcpPacketTypeCounter RtcpSent() {
-    // RTCP counters for remote SSRC.
-    return counter_map_[remote_ssrc_];
-  }
-
-  RtcpPacketTypeCounter RtcpReceived() {
-    // Received RTCP stats for (own) local SSRC.
-    return counter_map_[impl_->SSRC()];
-  }
-  int RtpSent() {
-    return transport_.rtp_packets_sent_;
-  }
-  uint16_t LastRtpSequenceNumber() {
-    return transport_.last_rtp_header_.sequenceNumber;
-  }
-  std::vector<uint16_t> LastNackListSent() {
-    return transport_.last_nack_list_;
-  }
-  void SetKeepaliveConfigAndReset(const RtpKeepAliveConfig& config) {
-    keepalive_config_ = config;
-    // Need to create a new module impl, since it's configured at creation.
-    CreateModuleImpl();
-    transport_.SetKeepalivePayloadType(config.payload_type);
-  }
-
- private:
-  void CreateModuleImpl() {
-    RtpRtcp::Configuration config;
-    config.audio = false;
-    config.clock = clock_;
-    config.outgoing_transport = &transport_;
-    config.receive_statistics = receive_statistics_.get();
-    config.rtcp_packet_type_counter_observer = this;
-    config.rtt_stats = &rtt_stats_;
-    config.retransmission_rate_limiter = &retransmission_rate_limiter_;
-    config.keepalive_config = keepalive_config_;
-
-    impl_.reset(new ModuleRtpRtcpImpl(config));
-    impl_->SetRTCPStatus(RtcpMode::kCompound);
-  }
-
-  SimulatedClock* const clock_;
-  std::map<uint32_t, RtcpPacketTypeCounter> counter_map_;
-};
-}  // namespace
-
-class RtpRtcpImplTest : public ::testing::Test {
- protected:
-  RtpRtcpImplTest()
-      : clock_(133590000000000), sender_(&clock_), receiver_(&clock_) {}
-
-  void SetUp() override {
-    // Send module.
-    sender_.impl_->SetSSRC(kSenderSsrc);
-    EXPECT_EQ(0, sender_.impl_->SetSendingStatus(true));
-    sender_.impl_->SetSendingMediaStatus(true);
-    sender_.SetRemoteSsrc(kReceiverSsrc);
-    sender_.impl_->SetSequenceNumber(kSequenceNumber);
-    sender_.impl_->SetStorePacketsStatus(true, 100);
-
-    memset(&codec_, 0, sizeof(VideoCodec));
-    codec_.plType = 100;
-    strncpy(codec_.plName, "VP8", 3);
-    codec_.width = 320;
-    codec_.height = 180;
-    EXPECT_EQ(0, sender_.impl_->RegisterSendPayload(codec_));
-
-    // Receive module.
-    EXPECT_EQ(0, receiver_.impl_->SetSendingStatus(false));
-    receiver_.impl_->SetSendingMediaStatus(false);
-    receiver_.impl_->SetSSRC(kReceiverSsrc);
-    receiver_.SetRemoteSsrc(kSenderSsrc);
-    // Transport settings.
-    sender_.transport_.SetRtpRtcpModule(receiver_.impl_.get());
-    receiver_.transport_.SetRtpRtcpModule(sender_.impl_.get());
-  }
-
-  SimulatedClock clock_;
-  RtpRtcpModule sender_;
-  RtpRtcpModule receiver_;
-  VideoCodec codec_;
-
-  void SendFrame(const RtpRtcpModule* module, uint8_t tid) {
-    RTPVideoHeaderVP8 vp8_header = {};
-    vp8_header.temporalIdx = tid;
-    RTPVideoHeader rtp_video_header;
-    rtp_video_header.width = codec_.width;
-    rtp_video_header.height = codec_.height;
-    rtp_video_header.rotation = kVideoRotation_0;
-    rtp_video_header.content_type = VideoContentType::UNSPECIFIED;
-    rtp_video_header.playout_delay = {-1, -1};
-    rtp_video_header.is_first_packet_in_frame = true;
-    rtp_video_header.simulcastIdx = 0;
-    rtp_video_header.codec = kRtpVideoVp8;
-    rtp_video_header.codecHeader = {vp8_header};
-    rtp_video_header.video_timing = {0u, 0u, 0u, 0u, 0u, 0u, false};
-
-    const uint8_t payload[100] = {0};
-    EXPECT_EQ(true, module->impl_->SendOutgoingData(
-                     kVideoFrameKey, codec_.plType, 0, 0, payload,
-                     sizeof(payload), nullptr, &rtp_video_header, nullptr));
-  }
-
-  void IncomingRtcpNack(const RtpRtcpModule* module, uint16_t sequence_number) {
-    bool sender = module->impl_->SSRC() == kSenderSsrc;
-    rtcp::Nack nack;
-    uint16_t list[1];
-    list[0] = sequence_number;
-    const uint16_t kListLength = sizeof(list) / sizeof(list[0]);
-    nack.SetSenderSsrc(sender ? kReceiverSsrc : kSenderSsrc);
-    nack.SetMediaSsrc(sender ? kSenderSsrc : kReceiverSsrc);
-    nack.SetPacketIds(list, kListLength);
-    rtc::Buffer packet = nack.Build();
-    module->impl_->IncomingRtcpPacket(packet.data(), packet.size());
-  }
-};
-
-TEST_F(RtpRtcpImplTest, SetSelectiveRetransmissions_BaseLayer) {
-  sender_.impl_->SetSelectiveRetransmissions(kRetransmitBaseLayer);
-  EXPECT_EQ(kRetransmitBaseLayer, sender_.impl_->SelectiveRetransmissions());
-
-  // Send frames.
-  EXPECT_EQ(0, sender_.RtpSent());
-  SendFrame(&sender_, kBaseLayerTid);    // kSequenceNumber
-  SendFrame(&sender_, kHigherLayerTid);  // kSequenceNumber + 1
-  SendFrame(&sender_, kNoTemporalIdx);   // kSequenceNumber + 2
-  EXPECT_EQ(3, sender_.RtpSent());
-  EXPECT_EQ(kSequenceNumber + 2, sender_.LastRtpSequenceNumber());
-
-  // Min required delay until retransmit = 5 + RTT ms (RTT = 0).
-  clock_.AdvanceTimeMilliseconds(5);
-
-  // Frame with kBaseLayerTid re-sent.
-  IncomingRtcpNack(&sender_, kSequenceNumber);
-  EXPECT_EQ(4, sender_.RtpSent());
-  EXPECT_EQ(kSequenceNumber, sender_.LastRtpSequenceNumber());
-  // Frame with kHigherLayerTid not re-sent.
-  IncomingRtcpNack(&sender_, kSequenceNumber + 1);
-  EXPECT_EQ(4, sender_.RtpSent());
-  // Frame with kNoTemporalIdx re-sent.
-  IncomingRtcpNack(&sender_, kSequenceNumber + 2);
-  EXPECT_EQ(5, sender_.RtpSent());
-  EXPECT_EQ(kSequenceNumber + 2, sender_.LastRtpSequenceNumber());
-}
-
-TEST_F(RtpRtcpImplTest, SetSelectiveRetransmissions_HigherLayers) {
-  const uint8_t kSetting = kRetransmitBaseLayer + kRetransmitHigherLayers;
-  sender_.impl_->SetSelectiveRetransmissions(kSetting);
-  EXPECT_EQ(kSetting, sender_.impl_->SelectiveRetransmissions());
-
-  // Send frames.
-  EXPECT_EQ(0, sender_.RtpSent());
-  SendFrame(&sender_, kBaseLayerTid);    // kSequenceNumber
-  SendFrame(&sender_, kHigherLayerTid);  // kSequenceNumber + 1
-  SendFrame(&sender_, kNoTemporalIdx);   // kSequenceNumber + 2
-  EXPECT_EQ(3, sender_.RtpSent());
-  EXPECT_EQ(kSequenceNumber + 2, sender_.LastRtpSequenceNumber());
-
-  // Min required delay until retransmit = 5 + RTT ms (RTT = 0).
-  clock_.AdvanceTimeMilliseconds(5);
-
-  // Frame with kBaseLayerTid re-sent.
-  IncomingRtcpNack(&sender_, kSequenceNumber);
-  EXPECT_EQ(4, sender_.RtpSent());
-  EXPECT_EQ(kSequenceNumber, sender_.LastRtpSequenceNumber());
-  // Frame with kHigherLayerTid re-sent.
-  IncomingRtcpNack(&sender_, kSequenceNumber + 1);
-  EXPECT_EQ(5, sender_.RtpSent());
-  EXPECT_EQ(kSequenceNumber + 1, sender_.LastRtpSequenceNumber());
-  // Frame with kNoTemporalIdx re-sent.
-  IncomingRtcpNack(&sender_, kSequenceNumber + 2);
-  EXPECT_EQ(6, sender_.RtpSent());
-  EXPECT_EQ(kSequenceNumber + 2, sender_.LastRtpSequenceNumber());
-}
-
-TEST_F(RtpRtcpImplTest, Rtt) {
-  RTPHeader header;
-  header.timestamp = 1;
-  header.sequenceNumber = 123;
-  header.ssrc = kSenderSsrc;
-  header.headerLength = 12;
-  receiver_.receive_statistics_->IncomingPacket(header, 100, false);
-
-  // Send Frame before sending an SR.
-  SendFrame(&sender_, kBaseLayerTid);
-  // Sender module should send an SR.
-  EXPECT_EQ(0, sender_.impl_->SendRTCP(kRtcpReport));
-
-  // Receiver module should send a RR with a response to the last received SR.
-  clock_.AdvanceTimeMilliseconds(1000);
-  EXPECT_EQ(0, receiver_.impl_->SendRTCP(kRtcpReport));
-
-  // Verify RTT.
-  int64_t rtt;
-  int64_t avg_rtt;
-  int64_t min_rtt;
-  int64_t max_rtt;
-  EXPECT_EQ(0,
-      sender_.impl_->RTT(kReceiverSsrc, &rtt, &avg_rtt, &min_rtt, &max_rtt));
-  EXPECT_NEAR(2 * kOneWayNetworkDelayMs, rtt, 1);
-  EXPECT_NEAR(2 * kOneWayNetworkDelayMs, avg_rtt, 1);
-  EXPECT_NEAR(2 * kOneWayNetworkDelayMs, min_rtt, 1);
-  EXPECT_NEAR(2 * kOneWayNetworkDelayMs, max_rtt, 1);
-
-  // No RTT from other ssrc.
-  EXPECT_EQ(-1,
-      sender_.impl_->RTT(kReceiverSsrc+1, &rtt, &avg_rtt, &min_rtt, &max_rtt));
-
-  // Verify RTT from rtt_stats config.
-  EXPECT_EQ(0, sender_.rtt_stats_.LastProcessedRtt());
-  EXPECT_EQ(0, sender_.impl_->rtt_ms());
-  sender_.impl_->Process();
-  EXPECT_NEAR(2 * kOneWayNetworkDelayMs, sender_.rtt_stats_.LastProcessedRtt(),
-              1);
-  EXPECT_NEAR(2 * kOneWayNetworkDelayMs, sender_.impl_->rtt_ms(), 1);
-}
-
-TEST_F(RtpRtcpImplTest, SetRtcpXrRrtrStatus) {
-  EXPECT_FALSE(receiver_.impl_->RtcpXrRrtrStatus());
-  receiver_.impl_->SetRtcpXrRrtrStatus(true);
-  EXPECT_TRUE(receiver_.impl_->RtcpXrRrtrStatus());
-}
-
-TEST_F(RtpRtcpImplTest, RttForReceiverOnly) {
-  receiver_.impl_->SetRtcpXrRrtrStatus(true);
-
-  // Receiver module should send a Receiver time reference report (RTRR).
-  EXPECT_EQ(0, receiver_.impl_->SendRTCP(kRtcpReport));
-
-  // Sender module should send a response to the last received RTRR (DLRR).
-  clock_.AdvanceTimeMilliseconds(1000);
-  // Send Frame before sending a SR.
-  SendFrame(&sender_, kBaseLayerTid);
-  EXPECT_EQ(0, sender_.impl_->SendRTCP(kRtcpReport));
-
-  // Verify RTT.
-  EXPECT_EQ(0, receiver_.rtt_stats_.LastProcessedRtt());
-  EXPECT_EQ(0, receiver_.impl_->rtt_ms());
-  receiver_.impl_->Process();
-  EXPECT_NEAR(2 * kOneWayNetworkDelayMs,
-              receiver_.rtt_stats_.LastProcessedRtt(), 1);
-  EXPECT_NEAR(2 * kOneWayNetworkDelayMs, receiver_.impl_->rtt_ms(), 1);
-}
-
-TEST_F(RtpRtcpImplTest, NoSrBeforeMedia) {
-  // Ignore fake transport delays in this test.
-  sender_.transport_.SimulateNetworkDelay(0, &clock_);
-  receiver_.transport_.SimulateNetworkDelay(0, &clock_);
-
-  sender_.impl_->Process();
-  EXPECT_EQ(-1, sender_.RtcpSent().first_packet_time_ms);
-
-  // Verify no SR is sent before media has been sent, RR should still be sent
-  // from the receiving module though.
-  clock_.AdvanceTimeMilliseconds(2000);
-  int64_t current_time = clock_.TimeInMilliseconds();
-  sender_.impl_->Process();
-  receiver_.impl_->Process();
-  EXPECT_EQ(-1, sender_.RtcpSent().first_packet_time_ms);
-  EXPECT_EQ(receiver_.RtcpSent().first_packet_time_ms, current_time);
-
-  SendFrame(&sender_, kBaseLayerTid);
-  EXPECT_EQ(sender_.RtcpSent().first_packet_time_ms, current_time);
-}
-
-TEST_F(RtpRtcpImplTest, RtcpPacketTypeCounter_Nack) {
-  EXPECT_EQ(-1, receiver_.RtcpSent().first_packet_time_ms);
-  EXPECT_EQ(-1, sender_.RtcpReceived().first_packet_time_ms);
-  EXPECT_EQ(0U, sender_.RtcpReceived().nack_packets);
-  EXPECT_EQ(0U, receiver_.RtcpSent().nack_packets);
-
-  // Receive module sends a NACK.
-  const uint16_t kNackLength = 1;
-  uint16_t nack_list[kNackLength] = {123};
-  EXPECT_EQ(0, receiver_.impl_->SendNACK(nack_list, kNackLength));
-  EXPECT_EQ(1U, receiver_.RtcpSent().nack_packets);
-  EXPECT_GT(receiver_.RtcpSent().first_packet_time_ms, -1);
-
-  // Send module receives the NACK.
-  EXPECT_EQ(1U, sender_.RtcpReceived().nack_packets);
-  EXPECT_GT(sender_.RtcpReceived().first_packet_time_ms, -1);
-}
-
-TEST_F(RtpRtcpImplTest, RtcpPacketTypeCounter_FirAndPli) {
-  EXPECT_EQ(0U, sender_.RtcpReceived().fir_packets);
-  EXPECT_EQ(0U, receiver_.RtcpSent().fir_packets);
-  // Receive module sends a FIR.
-  EXPECT_EQ(0, receiver_.impl_->SendRTCP(kRtcpFir));
-  EXPECT_EQ(1U, receiver_.RtcpSent().fir_packets);
-  // Send module receives the FIR.
-  EXPECT_EQ(1U, sender_.RtcpReceived().fir_packets);
-
-  // Receive module sends a FIR and PLI.
-  std::set<RTCPPacketType> packet_types;
-  packet_types.insert(kRtcpFir);
-  packet_types.insert(kRtcpPli);
-  EXPECT_EQ(0, receiver_.impl_->SendCompoundRTCP(packet_types));
-  EXPECT_EQ(2U, receiver_.RtcpSent().fir_packets);
-  EXPECT_EQ(1U, receiver_.RtcpSent().pli_packets);
-  // Send module receives the FIR and PLI.
-  EXPECT_EQ(2U, sender_.RtcpReceived().fir_packets);
-  EXPECT_EQ(1U, sender_.RtcpReceived().pli_packets);
-}
-
-TEST_F(RtpRtcpImplTest, AddStreamDataCounters) {
-  StreamDataCounters rtp;
-  const int64_t kStartTimeMs = 1;
-  rtp.first_packet_time_ms = kStartTimeMs;
-  rtp.transmitted.packets = 1;
-  rtp.transmitted.payload_bytes = 1;
-  rtp.transmitted.header_bytes = 2;
-  rtp.transmitted.padding_bytes = 3;
-  EXPECT_EQ(rtp.transmitted.TotalBytes(), rtp.transmitted.payload_bytes +
-                                          rtp.transmitted.header_bytes +
-                                          rtp.transmitted.padding_bytes);
-
-  StreamDataCounters rtp2;
-  rtp2.first_packet_time_ms = -1;
-  rtp2.transmitted.packets = 10;
-  rtp2.transmitted.payload_bytes = 10;
-  rtp2.retransmitted.header_bytes = 4;
-  rtp2.retransmitted.payload_bytes = 5;
-  rtp2.retransmitted.padding_bytes = 6;
-  rtp2.retransmitted.packets = 7;
-  rtp2.fec.packets = 8;
-
-  StreamDataCounters sum = rtp;
-  sum.Add(rtp2);
-  EXPECT_EQ(kStartTimeMs, sum.first_packet_time_ms);
-  EXPECT_EQ(11U, sum.transmitted.packets);
-  EXPECT_EQ(11U, sum.transmitted.payload_bytes);
-  EXPECT_EQ(2U, sum.transmitted.header_bytes);
-  EXPECT_EQ(3U, sum.transmitted.padding_bytes);
-  EXPECT_EQ(4U, sum.retransmitted.header_bytes);
-  EXPECT_EQ(5U, sum.retransmitted.payload_bytes);
-  EXPECT_EQ(6U, sum.retransmitted.padding_bytes);
-  EXPECT_EQ(7U, sum.retransmitted.packets);
-  EXPECT_EQ(8U, sum.fec.packets);
-  EXPECT_EQ(sum.transmitted.TotalBytes(),
-            rtp.transmitted.TotalBytes() + rtp2.transmitted.TotalBytes());
-
-  StreamDataCounters rtp3;
-  rtp3.first_packet_time_ms = kStartTimeMs + 10;
-  sum.Add(rtp3);
-  EXPECT_EQ(kStartTimeMs, sum.first_packet_time_ms);  // Holds oldest time.
-}
-
-TEST_F(RtpRtcpImplTest, SendsInitialNackList) {
-  // Send module sends a NACK.
-  const uint16_t kNackLength = 1;
-  uint16_t nack_list[kNackLength] = {123};
-  EXPECT_EQ(0U, sender_.RtcpSent().nack_packets);
-  // Send Frame before sending a compound RTCP that starts with SR.
-  SendFrame(&sender_, kBaseLayerTid);
-  EXPECT_EQ(0, sender_.impl_->SendNACK(nack_list, kNackLength));
-  EXPECT_EQ(1U, sender_.RtcpSent().nack_packets);
-  EXPECT_THAT(sender_.LastNackListSent(), ElementsAre(123));
-}
-
-TEST_F(RtpRtcpImplTest, SendsExtendedNackList) {
-  // Send module sends a NACK.
-  const uint16_t kNackLength = 1;
-  uint16_t nack_list[kNackLength] = {123};
-  EXPECT_EQ(0U, sender_.RtcpSent().nack_packets);
-  // Send Frame before sending a compound RTCP that starts with SR.
-  SendFrame(&sender_, kBaseLayerTid);
-  EXPECT_EQ(0, sender_.impl_->SendNACK(nack_list, kNackLength));
-  EXPECT_EQ(1U, sender_.RtcpSent().nack_packets);
-  EXPECT_THAT(sender_.LastNackListSent(), ElementsAre(123));
-
-  // Same list not re-send.
-  EXPECT_EQ(0, sender_.impl_->SendNACK(nack_list, kNackLength));
-  EXPECT_EQ(1U, sender_.RtcpSent().nack_packets);
-  EXPECT_THAT(sender_.LastNackListSent(), ElementsAre(123));
-
-  // Only extended list sent.
-  const uint16_t kNackExtLength = 2;
-  uint16_t nack_list_ext[kNackExtLength] = {123, 124};
-  EXPECT_EQ(0, sender_.impl_->SendNACK(nack_list_ext, kNackExtLength));
-  EXPECT_EQ(2U, sender_.RtcpSent().nack_packets);
-  EXPECT_THAT(sender_.LastNackListSent(), ElementsAre(124));
-}
-
-TEST_F(RtpRtcpImplTest, ReSendsNackListAfterRttMs) {
-  sender_.transport_.SimulateNetworkDelay(0, &clock_);
-  // Send module sends a NACK.
-  const uint16_t kNackLength = 2;
-  uint16_t nack_list[kNackLength] = {123, 125};
-  EXPECT_EQ(0U, sender_.RtcpSent().nack_packets);
-  // Send Frame before sending a compound RTCP that starts with SR.
-  SendFrame(&sender_, kBaseLayerTid);
-  EXPECT_EQ(0, sender_.impl_->SendNACK(nack_list, kNackLength));
-  EXPECT_EQ(1U, sender_.RtcpSent().nack_packets);
-  EXPECT_THAT(sender_.LastNackListSent(), ElementsAre(123, 125));
-
-  // Same list not re-send, rtt interval has not passed.
-  const int kStartupRttMs = 100;
-  clock_.AdvanceTimeMilliseconds(kStartupRttMs);
-  EXPECT_EQ(0, sender_.impl_->SendNACK(nack_list, kNackLength));
-  EXPECT_EQ(1U, sender_.RtcpSent().nack_packets);
-
-  // Rtt interval passed, full list sent.
-  clock_.AdvanceTimeMilliseconds(1);
-  EXPECT_EQ(0, sender_.impl_->SendNACK(nack_list, kNackLength));
-  EXPECT_EQ(2U, sender_.RtcpSent().nack_packets);
-  EXPECT_THAT(sender_.LastNackListSent(), ElementsAre(123, 125));
-}
-
-TEST_F(RtpRtcpImplTest, UniqueNackRequests) {
-  receiver_.transport_.SimulateNetworkDelay(0, &clock_);
-  EXPECT_EQ(0U, receiver_.RtcpSent().nack_packets);
-  EXPECT_EQ(0U, receiver_.RtcpSent().nack_requests);
-  EXPECT_EQ(0U, receiver_.RtcpSent().unique_nack_requests);
-  EXPECT_EQ(0, receiver_.RtcpSent().UniqueNackRequestsInPercent());
-
-  // Receive module sends NACK request.
-  const uint16_t kNackLength = 4;
-  uint16_t nack_list[kNackLength] = {10, 11, 13, 18};
-  EXPECT_EQ(0, receiver_.impl_->SendNACK(nack_list, kNackLength));
-  EXPECT_EQ(1U, receiver_.RtcpSent().nack_packets);
-  EXPECT_EQ(4U, receiver_.RtcpSent().nack_requests);
-  EXPECT_EQ(4U, receiver_.RtcpSent().unique_nack_requests);
-  EXPECT_THAT(receiver_.LastNackListSent(), ElementsAre(10, 11, 13, 18));
-
-  // Send module receives the request.
-  EXPECT_EQ(1U, sender_.RtcpReceived().nack_packets);
-  EXPECT_EQ(4U, sender_.RtcpReceived().nack_requests);
-  EXPECT_EQ(4U, sender_.RtcpReceived().unique_nack_requests);
-  EXPECT_EQ(100, sender_.RtcpReceived().UniqueNackRequestsInPercent());
-
-  // Receive module sends new request with duplicated packets.
-  const int kStartupRttMs = 100;
-  clock_.AdvanceTimeMilliseconds(kStartupRttMs + 1);
-  const uint16_t kNackLength2 = 4;
-  uint16_t nack_list2[kNackLength2] = {11, 18, 20, 21};
-  EXPECT_EQ(0, receiver_.impl_->SendNACK(nack_list2, kNackLength2));
-  EXPECT_EQ(2U, receiver_.RtcpSent().nack_packets);
-  EXPECT_EQ(8U, receiver_.RtcpSent().nack_requests);
-  EXPECT_EQ(6U, receiver_.RtcpSent().unique_nack_requests);
-  EXPECT_THAT(receiver_.LastNackListSent(), ElementsAre(11, 18, 20, 21));
-
-  // Send module receives the request.
-  EXPECT_EQ(2U, sender_.RtcpReceived().nack_packets);
-  EXPECT_EQ(8U, sender_.RtcpReceived().nack_requests);
-  EXPECT_EQ(6U, sender_.RtcpReceived().unique_nack_requests);
-  EXPECT_EQ(75, sender_.RtcpReceived().UniqueNackRequestsInPercent());
-}
-
-TEST_F(RtpRtcpImplTest, SendsKeepaliveAfterTimout) {
-  const int kTimeoutMs = 1500;
-
-  RtpKeepAliveConfig config;
-  config.timeout_interval_ms = kTimeoutMs;
-
-  // Recreate sender impl with new configuration, and redo setup.
-  sender_.SetKeepaliveConfigAndReset(config);
-  SetUp();
-
-  // Initial process call.
-  sender_.impl_->Process();
-  EXPECT_EQ(0U, sender_.transport_.NumKeepaliveSent());
-
-  // After one time, a single keep-alive packet should be sent.
-  clock_.AdvanceTimeMilliseconds(kTimeoutMs);
-  sender_.impl_->Process();
-  EXPECT_EQ(1U, sender_.transport_.NumKeepaliveSent());
-
-  // Process for the same timestamp again, no new packet should be sent.
-  sender_.impl_->Process();
-  EXPECT_EQ(1U, sender_.transport_.NumKeepaliveSent());
-
-  // Move ahead to the last ms before a keep-alive is expected, no action.
-  clock_.AdvanceTimeMilliseconds(kTimeoutMs - 1);
-  sender_.impl_->Process();
-  EXPECT_EQ(1U, sender_.transport_.NumKeepaliveSent());
-
-  // Move the final ms, timeout relative last KA. Should create new keep-alive.
-  clock_.AdvanceTimeMilliseconds(1);
-  sender_.impl_->Process();
-  EXPECT_EQ(2U, sender_.transport_.NumKeepaliveSent());
-
-  // Move ahead to the last ms before Christmas.
-  clock_.AdvanceTimeMilliseconds(kTimeoutMs - 1);
-  sender_.impl_->Process();
-  EXPECT_EQ(2U, sender_.transport_.NumKeepaliveSent());
-
-  // Send actual payload data, no keep-alive expected.
-  SendFrame(&sender_, 0);
-  sender_.impl_->Process();
-  EXPECT_EQ(2U, sender_.transport_.NumKeepaliveSent());
-
-  // Move ahead as far as possible again, timeout now relative payload. No KA.
-  clock_.AdvanceTimeMilliseconds(kTimeoutMs - 1);
-  sender_.impl_->Process();
-  EXPECT_EQ(2U, sender_.transport_.NumKeepaliveSent());
-
-  // Timeout relative payload, send new keep-alive.
-  clock_.AdvanceTimeMilliseconds(1);
-  sender_.impl_->Process();
-  EXPECT_EQ(3U, sender_.transport_.NumKeepaliveSent());
-}
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/rtp_sender.cc b/modules/rtp_rtcp/source/rtp_sender.cc
deleted file mode 100644
index 6fd7600..0000000
--- a/modules/rtp_rtcp/source/rtp_sender.cc
+++ /dev/null
@@ -1,1315 +0,0 @@
-/*
- *  Copyright (c) 2012 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/rtp_rtcp/source/rtp_sender.h"
-
-#include <algorithm>
-#include <utility>
-
-#include "webrtc/logging/rtc_event_log/rtc_event_log.h"
-#include "webrtc/modules/remote_bitrate_estimator/test/bwe_test_logging.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_cvo.h"
-#include "webrtc/modules/rtp_rtcp/source/byte_io.h"
-#include "webrtc/modules/rtp_rtcp/source/playout_delay_oracle.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_header_extensions.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_packet_to_send.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_sender_audio.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_sender_video.h"
-#include "webrtc/modules/rtp_rtcp/source/time_util.h"
-#include "webrtc/rtc_base/arraysize.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/rate_limiter.h"
-#include "webrtc/rtc_base/safe_minmax.h"
-#include "webrtc/rtc_base/timeutils.h"
-#include "webrtc/rtc_base/trace_event.h"
-#include "webrtc/system_wrappers/include/field_trial.h"
-
-namespace webrtc {
-
-namespace {
-// Max in the RFC 3550 is 255 bytes, we limit it to be modulus 32 for SRTP.
-constexpr size_t kMaxPaddingLength = 224;
-constexpr size_t kMinAudioPaddingLength = 50;
-constexpr int kSendSideDelayWindowMs = 1000;
-constexpr size_t kRtpHeaderLength = 12;
-constexpr uint16_t kMaxInitRtpSeqNumber = 32767;  // 2^15 -1.
-constexpr uint32_t kTimestampTicksPerMs = 90;
-constexpr int kBitrateStatisticsWindowMs = 1000;
-
-constexpr size_t kMinFlexfecPacketsToStoreForPacing = 50;
-
-template <typename Extension>
-constexpr RtpExtensionSize CreateExtensionSize() {
-  return {Extension::kId, Extension::kValueSizeBytes};
-}
-
-// Size info for header extensions that might be used in padding or FEC packets.
-constexpr RtpExtensionSize kExtensionSizes[] = {
-    CreateExtensionSize<AbsoluteSendTime>(),
-    CreateExtensionSize<TransmissionOffset>(),
-    CreateExtensionSize<TransportSequenceNumber>(),
-    CreateExtensionSize<PlayoutDelayLimits>(),
-};
-
-const char* FrameTypeToString(FrameType frame_type) {
-  switch (frame_type) {
-    case kEmptyFrame:
-      return "empty";
-    case kAudioFrameSpeech: return "audio_speech";
-    case kAudioFrameCN: return "audio_cn";
-    case kVideoFrameKey: return "video_key";
-    case kVideoFrameDelta: return "video_delta";
-  }
-  return "";
-}
-
-void CountPacket(RtpPacketCounter* counter, const RtpPacketToSend& packet) {
-  ++counter->packets;
-  counter->header_bytes += packet.headers_size();
-  counter->padding_bytes += packet.padding_size();
-  counter->payload_bytes += packet.payload_size();
-}
-
-}  // namespace
-
-RTPSender::RTPSender(
-    bool audio,
-    Clock* clock,
-    Transport* transport,
-    RtpPacketSender* paced_sender,
-    FlexfecSender* flexfec_sender,
-    TransportSequenceNumberAllocator* sequence_number_allocator,
-    TransportFeedbackObserver* transport_feedback_observer,
-    BitrateStatisticsObserver* bitrate_callback,
-    FrameCountObserver* frame_count_observer,
-    SendSideDelayObserver* send_side_delay_observer,
-    RtcEventLog* event_log,
-    SendPacketObserver* send_packet_observer,
-    RateLimiter* retransmission_rate_limiter,
-    OverheadObserver* overhead_observer)
-    : clock_(clock),
-      // TODO(holmer): Remove this conversion?
-      clock_delta_ms_(clock_->TimeInMilliseconds() - rtc::TimeMillis()),
-      random_(clock_->TimeInMicroseconds()),
-      audio_configured_(audio),
-      audio_(audio ? new RTPSenderAudio(clock, this) : nullptr),
-      video_(audio ? nullptr : new RTPSenderVideo(clock, this, flexfec_sender)),
-      paced_sender_(paced_sender),
-      transport_sequence_number_allocator_(sequence_number_allocator),
-      transport_feedback_observer_(transport_feedback_observer),
-      last_capture_time_ms_sent_(0),
-      transport_(transport),
-      sending_media_(true),                   // Default to sending media.
-      max_packet_size_(IP_PACKET_SIZE - 28),  // Default is IP-v4/UDP.
-      payload_type_(-1),
-      payload_type_map_(),
-      rtp_header_extension_map_(),
-      packet_history_(clock),
-      flexfec_packet_history_(clock),
-      // Statistics
-      rtp_stats_callback_(nullptr),
-      total_bitrate_sent_(kBitrateStatisticsWindowMs,
-                          RateStatistics::kBpsScale),
-      nack_bitrate_sent_(kBitrateStatisticsWindowMs, RateStatistics::kBpsScale),
-      frame_count_observer_(frame_count_observer),
-      send_side_delay_observer_(send_side_delay_observer),
-      event_log_(event_log),
-      send_packet_observer_(send_packet_observer),
-      bitrate_callback_(bitrate_callback),
-      // RTP variables
-      remote_ssrc_(0),
-      sequence_number_forced_(false),
-      last_rtp_timestamp_(0),
-      capture_time_ms_(0),
-      last_timestamp_time_ms_(0),
-      media_has_been_sent_(false),
-      last_packet_marker_bit_(false),
-      csrcs_(),
-      rtx_(kRtxOff),
-      rtp_overhead_bytes_per_packet_(0),
-      retransmission_rate_limiter_(retransmission_rate_limiter),
-      overhead_observer_(overhead_observer),
-      send_side_bwe_with_overhead_(
-          webrtc::field_trial::IsEnabled("WebRTC-SendSideBwe-WithOverhead")) {
-  // This random initialization is not intended to be cryptographic strong.
-  timestamp_offset_ = random_.Rand<uint32_t>();
-  // Random start, 16 bits. Can't be 0.
-  sequence_number_rtx_ = random_.Rand(1, kMaxInitRtpSeqNumber);
-  sequence_number_ = random_.Rand(1, kMaxInitRtpSeqNumber);
-
-  // Store FlexFEC packets in the packet history data structure, so they can
-  // be found when paced.
-  if (flexfec_sender) {
-    flexfec_packet_history_.SetStorePacketsStatus(
-        true, kMinFlexfecPacketsToStoreForPacing);
-  }
-}
-
-RTPSender::~RTPSender() {
-  // TODO(tommi): Use a thread checker to ensure the object is created and
-  // deleted on the same thread.  At the moment this isn't possible due to
-  // voe::ChannelOwner in voice engine.  To reproduce, run:
-  // voe_auto_test --automated --gtest_filter=*MixManyChannelsForStressOpus
-
-  // TODO(tommi,holmer): We don't grab locks in the dtor before accessing member
-  // variables but we grab them in all other methods. (what's the design?)
-  // Start documenting what thread we're on in what method so that it's easier
-  // to understand performance attributes and possibly remove locks.
-  while (!payload_type_map_.empty()) {
-    std::map<int8_t, RtpUtility::Payload*>::iterator it =
-        payload_type_map_.begin();
-    delete it->second;
-    payload_type_map_.erase(it);
-  }
-}
-
-rtc::ArrayView<const RtpExtensionSize> RTPSender::FecExtensionSizes() {
-  return rtc::MakeArrayView(kExtensionSizes, arraysize(kExtensionSizes));
-}
-
-uint16_t RTPSender::ActualSendBitrateKbit() const {
-  rtc::CritScope cs(&statistics_crit_);
-  return static_cast<uint16_t>(
-      total_bitrate_sent_.Rate(clock_->TimeInMilliseconds()).value_or(0) /
-      1000);
-}
-
-uint32_t RTPSender::VideoBitrateSent() const {
-  if (video_) {
-    return video_->VideoBitrateSent();
-  }
-  return 0;
-}
-
-uint32_t RTPSender::FecOverheadRate() const {
-  if (video_) {
-    return video_->FecOverheadRate();
-  }
-  return 0;
-}
-
-uint32_t RTPSender::NackOverheadRate() const {
-  rtc::CritScope cs(&statistics_crit_);
-  return nack_bitrate_sent_.Rate(clock_->TimeInMilliseconds()).value_or(0);
-}
-
-int32_t RTPSender::RegisterRtpHeaderExtension(RTPExtensionType type,
-                                              uint8_t id) {
-  rtc::CritScope lock(&send_critsect_);
-  return rtp_header_extension_map_.RegisterByType(id, type) ? 0 : -1;
-}
-
-bool RTPSender::IsRtpHeaderExtensionRegistered(RTPExtensionType type) const {
-  rtc::CritScope lock(&send_critsect_);
-  return rtp_header_extension_map_.IsRegistered(type);
-}
-
-int32_t RTPSender::DeregisterRtpHeaderExtension(RTPExtensionType type) {
-  rtc::CritScope lock(&send_critsect_);
-  return rtp_header_extension_map_.Deregister(type);
-}
-
-int32_t RTPSender::RegisterPayload(
-    const char payload_name[RTP_PAYLOAD_NAME_SIZE],
-    int8_t payload_number,
-    uint32_t frequency,
-    size_t channels,
-    uint32_t rate) {
-  RTC_DCHECK_LT(strlen(payload_name), RTP_PAYLOAD_NAME_SIZE);
-  rtc::CritScope lock(&send_critsect_);
-
-  std::map<int8_t, RtpUtility::Payload*>::iterator it =
-      payload_type_map_.find(payload_number);
-
-  if (payload_type_map_.end() != it) {
-    // We already use this payload type.
-    RtpUtility::Payload* payload = it->second;
-    RTC_DCHECK(payload);
-
-    // Check if it's the same as we already have.
-    if (RtpUtility::StringCompare(
-            payload->name, payload_name, RTP_PAYLOAD_NAME_SIZE - 1)) {
-      if (audio_configured_ && payload->audio &&
-          payload->typeSpecific.Audio.frequency == frequency &&
-          (payload->typeSpecific.Audio.rate == rate ||
-           payload->typeSpecific.Audio.rate == 0 || rate == 0)) {
-        payload->typeSpecific.Audio.rate = rate;
-        // Ensure that we update the rate if new or old is zero.
-        return 0;
-      }
-      if (!audio_configured_ && !payload->audio) {
-        return 0;
-      }
-    }
-    return -1;
-  }
-  int32_t ret_val = 0;
-  RtpUtility::Payload* payload = nullptr;
-  if (audio_configured_) {
-    // TODO(mflodman): Change to CreateAudioPayload and make static.
-    ret_val = audio_->RegisterAudioPayload(payload_name, payload_number,
-                                           frequency, channels, rate, &payload);
-  } else {
-    payload = video_->CreateVideoPayload(payload_name, payload_number);
-  }
-  if (payload) {
-    payload_type_map_[payload_number] = payload;
-  }
-  return ret_val;
-}
-
-int32_t RTPSender::DeRegisterSendPayload(int8_t payload_type) {
-  rtc::CritScope lock(&send_critsect_);
-
-  std::map<int8_t, RtpUtility::Payload*>::iterator it =
-      payload_type_map_.find(payload_type);
-
-  if (payload_type_map_.end() == it) {
-    return -1;
-  }
-  RtpUtility::Payload* payload = it->second;
-  delete payload;
-  payload_type_map_.erase(it);
-  return 0;
-}
-
-// TODO(nisse): Delete this method, only used internally and by test code.
-void RTPSender::SetSendPayloadType(int8_t payload_type) {
-  rtc::CritScope lock(&send_critsect_);
-  payload_type_ = payload_type;
-}
-
-void RTPSender::SetMaxRtpPacketSize(size_t max_packet_size) {
-  RTC_DCHECK_GE(max_packet_size, 100);
-  RTC_DCHECK_LE(max_packet_size, IP_PACKET_SIZE);
-  rtc::CritScope lock(&send_critsect_);
-  max_packet_size_ = max_packet_size;
-}
-
-size_t RTPSender::MaxRtpPacketSize() const {
-  return max_packet_size_;
-}
-
-void RTPSender::SetRtxStatus(int mode) {
-  rtc::CritScope lock(&send_critsect_);
-  rtx_ = mode;
-}
-
-int RTPSender::RtxStatus() const {
-  rtc::CritScope lock(&send_critsect_);
-  return rtx_;
-}
-
-void RTPSender::SetRtxSsrc(uint32_t ssrc) {
-  rtc::CritScope lock(&send_critsect_);
-  ssrc_rtx_.emplace(ssrc);
-}
-
-uint32_t RTPSender::RtxSsrc() const {
-  rtc::CritScope lock(&send_critsect_);
-  RTC_DCHECK(ssrc_rtx_);
-  return *ssrc_rtx_;
-}
-
-void RTPSender::SetRtxPayloadType(int payload_type,
-                                  int associated_payload_type) {
-  rtc::CritScope lock(&send_critsect_);
-  RTC_DCHECK_LE(payload_type, 127);
-  RTC_DCHECK_LE(associated_payload_type, 127);
-  if (payload_type < 0) {
-    LOG(LS_ERROR) << "Invalid RTX payload type: " << payload_type << ".";
-    return;
-  }
-
-  rtx_payload_type_map_[associated_payload_type] = payload_type;
-}
-
-int32_t RTPSender::CheckPayloadType(int8_t payload_type,
-                                    RtpVideoCodecTypes* video_type) {
-  rtc::CritScope lock(&send_critsect_);
-
-  if (payload_type < 0) {
-    LOG(LS_ERROR) << "Invalid payload_type " << payload_type << ".";
-    return -1;
-  }
-  if (payload_type_ == payload_type) {
-    if (!audio_configured_) {
-      *video_type = video_->VideoCodecType();
-    }
-    return 0;
-  }
-  std::map<int8_t, RtpUtility::Payload*>::iterator it =
-      payload_type_map_.find(payload_type);
-  if (it == payload_type_map_.end()) {
-    LOG(LS_WARNING) << "Payload type " << static_cast<int>(payload_type)
-                    << " not registered.";
-    return -1;
-  }
-  SetSendPayloadType(payload_type);
-  RtpUtility::Payload* payload = it->second;
-  RTC_DCHECK(payload);
-  if (!payload->audio && !audio_configured_) {
-    video_->SetVideoCodecType(payload->typeSpecific.Video.videoCodecType);
-    *video_type = payload->typeSpecific.Video.videoCodecType;
-  }
-  return 0;
-}
-
-bool RTPSender::SendOutgoingData(FrameType frame_type,
-                                 int8_t payload_type,
-                                 uint32_t capture_timestamp,
-                                 int64_t capture_time_ms,
-                                 const uint8_t* payload_data,
-                                 size_t payload_size,
-                                 const RTPFragmentationHeader* fragmentation,
-                                 const RTPVideoHeader* rtp_header,
-                                 uint32_t* transport_frame_id_out,
-                                 int64_t expected_retransmission_time_ms) {
-  uint32_t ssrc;
-  uint16_t sequence_number;
-  uint32_t rtp_timestamp;
-  {
-    // Drop this packet if we're not sending media packets.
-    rtc::CritScope lock(&send_critsect_);
-    RTC_DCHECK(ssrc_);
-
-    ssrc = *ssrc_;
-    sequence_number = sequence_number_;
-    rtp_timestamp = timestamp_offset_ + capture_timestamp;
-    if (transport_frame_id_out)
-      *transport_frame_id_out = rtp_timestamp;
-    if (!sending_media_)
-      return true;
-  }
-  RtpVideoCodecTypes video_type = kRtpVideoGeneric;
-  if (CheckPayloadType(payload_type, &video_type) != 0) {
-    LOG(LS_ERROR) << "Don't send data with unknown payload type: "
-                  << static_cast<int>(payload_type) << ".";
-    return false;
-  }
-
-  switch (frame_type) {
-    case kAudioFrameSpeech:
-    case kAudioFrameCN:
-      RTC_CHECK(audio_configured_);
-      break;
-    case kVideoFrameKey:
-    case kVideoFrameDelta:
-      RTC_CHECK(!audio_configured_);
-      break;
-    case kEmptyFrame:
-      break;
-  }
-
-  bool result;
-  if (audio_configured_) {
-    TRACE_EVENT_ASYNC_STEP1("webrtc", "Audio", rtp_timestamp, "Send", "type",
-                            FrameTypeToString(frame_type));
-
-    result = audio_->SendAudio(frame_type, payload_type, rtp_timestamp,
-                               payload_data, payload_size, fragmentation);
-  } else {
-    TRACE_EVENT_ASYNC_STEP1("webrtc", "Video", capture_time_ms,
-                            "Send", "type", FrameTypeToString(frame_type));
-    if (frame_type == kEmptyFrame)
-      return true;
-
-    if (rtp_header) {
-      playout_delay_oracle_.UpdateRequest(ssrc, rtp_header->playout_delay,
-                                          sequence_number);
-    }
-
-    result = video_->SendVideo(video_type, frame_type, payload_type,
-                               rtp_timestamp, capture_time_ms, payload_data,
-                               payload_size, fragmentation, rtp_header,
-                               expected_retransmission_time_ms);
-  }
-
-  rtc::CritScope cs(&statistics_crit_);
-  // Note: This is currently only counting for video.
-  if (frame_type == kVideoFrameKey) {
-    ++frame_counts_.key_frames;
-  } else if (frame_type == kVideoFrameDelta) {
-    ++frame_counts_.delta_frames;
-  }
-  if (frame_count_observer_) {
-    frame_count_observer_->FrameCountUpdated(frame_counts_, ssrc);
-  }
-
-  return result;
-}
-
-size_t RTPSender::TrySendRedundantPayloads(size_t bytes_to_send,
-                                           const PacedPacketInfo& pacing_info) {
-  {
-    rtc::CritScope lock(&send_critsect_);
-    if (!sending_media_)
-      return 0;
-    if ((rtx_ & kRtxRedundantPayloads) == 0)
-      return 0;
-  }
-
-  int bytes_left = static_cast<int>(bytes_to_send);
-  while (bytes_left > 0) {
-    std::unique_ptr<RtpPacketToSend> packet =
-        packet_history_.GetBestFittingPacket(bytes_left);
-    if (!packet)
-      break;
-    size_t payload_size = packet->payload_size();
-    if (!PrepareAndSendPacket(std::move(packet), true, false, pacing_info))
-      break;
-    bytes_left -= payload_size;
-  }
-  return bytes_to_send - bytes_left;
-}
-
-size_t RTPSender::SendPadData(size_t bytes,
-                              const PacedPacketInfo& pacing_info) {
-  size_t padding_bytes_in_packet;
-  size_t max_payload_size = max_packet_size_ - RtpHeaderLength();
-
-  if (audio_configured_) {
-    // Allow smaller padding packets for audio.
-    padding_bytes_in_packet = rtc::SafeClamp<size_t>(
-        bytes, kMinAudioPaddingLength,
-        rtc::SafeMin(max_payload_size, kMaxPaddingLength));
-  } else {
-    // Always send full padding packets. This is accounted for by the
-    // RtpPacketSender, which will make sure we don't send too much padding even
-    // if a single packet is larger than requested.
-    // We do this to avoid frequently sending small packets on higher bitrates.
-    padding_bytes_in_packet =
-        rtc::SafeMin<size_t>(max_payload_size, kMaxPaddingLength);
-  }
-  size_t bytes_sent = 0;
-  while (bytes_sent < bytes) {
-    int64_t now_ms = clock_->TimeInMilliseconds();
-    uint32_t ssrc;
-    uint32_t timestamp;
-    int64_t capture_time_ms;
-    uint16_t sequence_number;
-    int payload_type;
-    bool over_rtx;
-    {
-      rtc::CritScope lock(&send_critsect_);
-      if (!sending_media_)
-        break;
-      timestamp = last_rtp_timestamp_;
-      capture_time_ms = capture_time_ms_;
-      if (rtx_ == kRtxOff) {
-        if (payload_type_ == -1)
-          break;
-        // Without RTX we can't send padding in the middle of frames.
-        // For audio marker bits doesn't mark the end of a frame and frames
-        // are usually a single packet, so for now we don't apply this rule
-        // for audio.
-        if (!audio_configured_ && !last_packet_marker_bit_) {
-          break;
-        }
-        if (!ssrc_) {
-          LOG(LS_ERROR)  << "SSRC unset.";
-          return 0;
-        }
-
-        RTC_DCHECK(ssrc_);
-        ssrc = *ssrc_;
-
-        sequence_number = sequence_number_;
-        ++sequence_number_;
-        payload_type = payload_type_;
-        over_rtx = false;
-      } else {
-        // Without abs-send-time or transport sequence number a media packet
-        // must be sent before padding so that the timestamps used for
-        // estimation are correct.
-        if (!media_has_been_sent_ &&
-            !(rtp_header_extension_map_.IsRegistered(AbsoluteSendTime::kId) ||
-              (rtp_header_extension_map_.IsRegistered(
-                   TransportSequenceNumber::kId) &&
-               transport_sequence_number_allocator_))) {
-          break;
-        }
-        // Only change change the timestamp of padding packets sent over RTX.
-        // Padding only packets over RTP has to be sent as part of a media
-        // frame (and therefore the same timestamp).
-        if (last_timestamp_time_ms_ > 0) {
-          timestamp +=
-              (now_ms - last_timestamp_time_ms_) * kTimestampTicksPerMs;
-          capture_time_ms += (now_ms - last_timestamp_time_ms_);
-        }
-        if (!ssrc_rtx_) {
-          LOG(LS_ERROR)  << "RTX SSRC unset.";
-          return 0;
-        }
-        RTC_DCHECK(ssrc_rtx_);
-        ssrc = *ssrc_rtx_;
-        sequence_number = sequence_number_rtx_;
-        ++sequence_number_rtx_;
-        payload_type = rtx_payload_type_map_.begin()->second;
-        over_rtx = true;
-      }
-    }
-
-    RtpPacketToSend padding_packet(&rtp_header_extension_map_);
-    padding_packet.SetPayloadType(payload_type);
-    padding_packet.SetMarker(false);
-    padding_packet.SetSequenceNumber(sequence_number);
-    padding_packet.SetTimestamp(timestamp);
-    padding_packet.SetSsrc(ssrc);
-
-    if (capture_time_ms > 0) {
-      padding_packet.SetExtension<TransmissionOffset>(
-          (now_ms - capture_time_ms) * kTimestampTicksPerMs);
-    }
-    padding_packet.SetExtension<AbsoluteSendTime>(
-        AbsoluteSendTime::MsTo24Bits(now_ms));
-    PacketOptions options;
-    bool has_transport_seq_num =
-        UpdateTransportSequenceNumber(&padding_packet, &options.packet_id);
-    padding_packet.SetPadding(padding_bytes_in_packet, &random_);
-
-    if (has_transport_seq_num) {
-      AddPacketToTransportFeedback(options.packet_id, padding_packet,
-                                   pacing_info);
-    }
-
-    if (!SendPacketToNetwork(padding_packet, options, pacing_info))
-      break;
-
-    bytes_sent += padding_bytes_in_packet;
-    UpdateRtpStats(padding_packet, over_rtx, false);
-  }
-
-  return bytes_sent;
-}
-
-void RTPSender::SetStorePacketsStatus(bool enable, uint16_t number_to_store) {
-  packet_history_.SetStorePacketsStatus(enable, number_to_store);
-}
-
-bool RTPSender::StorePackets() const {
-  return packet_history_.StorePackets();
-}
-
-int32_t RTPSender::ReSendPacket(uint16_t packet_id, int64_t min_resend_time) {
-  std::unique_ptr<RtpPacketToSend> packet =
-      packet_history_.GetPacketAndSetSendTime(packet_id, min_resend_time, true);
-  if (!packet) {
-    // Packet not found.
-    return 0;
-  }
-
-  // Check if we're overusing retransmission bitrate.
-  // TODO(sprang): Add histograms for nack success or failure reasons.
-  RTC_DCHECK(retransmission_rate_limiter_);
-  if (!retransmission_rate_limiter_->TryUseRate(packet->size()))
-    return -1;
-
-  if (paced_sender_) {
-    // Convert from TickTime to Clock since capture_time_ms is based on
-    // TickTime.
-    int64_t corrected_capture_tims_ms =
-        packet->capture_time_ms() + clock_delta_ms_;
-    paced_sender_->InsertPacket(RtpPacketSender::kNormalPriority,
-                                packet->Ssrc(), packet->SequenceNumber(),
-                                corrected_capture_tims_ms,
-                                packet->payload_size(), true);
-
-    return packet->size();
-  }
-  bool rtx = (RtxStatus() & kRtxRetransmitted) > 0;
-  int32_t packet_size = static_cast<int32_t>(packet->size());
-  if (!PrepareAndSendPacket(std::move(packet), rtx, true, PacedPacketInfo()))
-    return -1;
-  return packet_size;
-}
-
-bool RTPSender::SendPacketToNetwork(const RtpPacketToSend& packet,
-                                    const PacketOptions& options,
-                                    const PacedPacketInfo& pacing_info) {
-  int bytes_sent = -1;
-  if (transport_) {
-    UpdateRtpOverhead(packet);
-    bytes_sent = transport_->SendRtp(packet.data(), packet.size(), options)
-                     ? static_cast<int>(packet.size())
-                     : -1;
-    if (event_log_ && bytes_sent > 0) {
-      event_log_->LogRtpHeader(kOutgoingPacket, packet.data(), packet.size(),
-                               pacing_info.probe_cluster_id);
-    }
-  }
-  TRACE_EVENT_INSTANT2(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"),
-                       "RTPSender::SendPacketToNetwork", "size", packet.size(),
-                       "sent", bytes_sent);
-  // TODO(pwestin): Add a separate bitrate for sent bitrate after pacer.
-  if (bytes_sent <= 0) {
-    LOG(LS_WARNING) << "Transport failed to send packet.";
-    return false;
-  }
-  return true;
-}
-
-int RTPSender::SelectiveRetransmissions() const {
-  if (!video_)
-    return -1;
-  return video_->SelectiveRetransmissions();
-}
-
-int RTPSender::SetSelectiveRetransmissions(uint8_t settings) {
-  if (!video_)
-    return -1;
-  video_->SetSelectiveRetransmissions(settings);
-  return 0;
-}
-
-void RTPSender::OnReceivedNack(
-    const std::vector<uint16_t>& nack_sequence_numbers,
-    int64_t avg_rtt) {
-  TRACE_EVENT2(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"),
-               "RTPSender::OnReceivedNACK", "num_seqnum",
-               nack_sequence_numbers.size(), "avg_rtt", avg_rtt);
-  for (uint16_t seq_no : nack_sequence_numbers) {
-    const int32_t bytes_sent = ReSendPacket(seq_no, 5 + avg_rtt);
-    if (bytes_sent < 0) {
-      // Failed to send one Sequence number. Give up the rest in this nack.
-      LOG(LS_WARNING) << "Failed resending RTP packet " << seq_no
-                      << ", Discard rest of packets.";
-      break;
-    }
-  }
-}
-
-void RTPSender::OnReceivedRtcpReportBlocks(
-    const ReportBlockList& report_blocks) {
-  playout_delay_oracle_.OnReceivedRtcpReportBlocks(report_blocks);
-}
-
-// Called from pacer when we can send the packet.
-bool RTPSender::TimeToSendPacket(uint32_t ssrc,
-                                 uint16_t sequence_number,
-                                 int64_t capture_time_ms,
-                                 bool retransmission,
-                                 const PacedPacketInfo& pacing_info) {
-  if (!SendingMedia())
-    return true;
-
-  std::unique_ptr<RtpPacketToSend> packet;
-  if (ssrc == SSRC()) {
-    packet = packet_history_.GetPacketAndSetSendTime(sequence_number, 0,
-                                                     retransmission);
-  } else if (ssrc == FlexfecSsrc()) {
-    packet = flexfec_packet_history_.GetPacketAndSetSendTime(sequence_number, 0,
-                                                             retransmission);
-  }
-
-  if (!packet) {
-    // Packet cannot be found.
-    return true;
-  }
-
-  return PrepareAndSendPacket(
-      std::move(packet),
-      retransmission && (RtxStatus() & kRtxRetransmitted) > 0, retransmission,
-      pacing_info);
-}
-
-bool RTPSender::PrepareAndSendPacket(std::unique_ptr<RtpPacketToSend> packet,
-                                     bool send_over_rtx,
-                                     bool is_retransmit,
-                                     const PacedPacketInfo& pacing_info) {
-  RTC_DCHECK(packet);
-  int64_t capture_time_ms = packet->capture_time_ms();
-  RtpPacketToSend* packet_to_send = packet.get();
-
-  if (!is_retransmit && packet->Marker()) {
-    TRACE_EVENT_ASYNC_END0(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), "PacedSend",
-                           capture_time_ms);
-  }
-
-  TRACE_EVENT_INSTANT2(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"),
-                       "PrepareAndSendPacket", "timestamp", packet->Timestamp(),
-                       "seqnum", packet->SequenceNumber());
-
-  std::unique_ptr<RtpPacketToSend> packet_rtx;
-  if (send_over_rtx) {
-    packet_rtx = BuildRtxPacket(*packet);
-    if (!packet_rtx)
-      return false;
-    packet_to_send = packet_rtx.get();
-  }
-
-  // Bug webrtc:7859. While FEC is invoked from rtp_sender_video, and not after
-  // the pacer, these modifications of the header below are happening after the
-  // FEC protection packets are calculated. This will corrupt recovered packets
-  // at the same place. It's not an issue for extensions, which are present in
-  // all the packets (their content just may be incorrect on recovered packets).
-  // In case of VideoTimingExtension, since it's present not in every packet,
-  // data after rtp header may be corrupted if these packets are protected by
-  // the FEC.
-  int64_t now_ms = clock_->TimeInMilliseconds();
-  int64_t diff_ms = now_ms - capture_time_ms;
-  packet_to_send->SetExtension<TransmissionOffset>(kTimestampTicksPerMs *
-                                                   diff_ms);
-  packet_to_send->SetExtension<AbsoluteSendTime>(
-      AbsoluteSendTime::MsTo24Bits(now_ms));
-
-  if (packet_to_send->HasExtension<VideoTimingExtension>())
-    packet_to_send->set_pacer_exit_time_ms(now_ms);
-
-  PacketOptions options;
-  if (UpdateTransportSequenceNumber(packet_to_send, &options.packet_id)) {
-    AddPacketToTransportFeedback(options.packet_id, *packet_to_send,
-                                 pacing_info);
-  }
-
-  if (!is_retransmit && !send_over_rtx) {
-    UpdateDelayStatistics(packet->capture_time_ms(), now_ms);
-    UpdateOnSendPacket(options.packet_id, packet->capture_time_ms(),
-                       packet->Ssrc());
-  }
-
-  if (!SendPacketToNetwork(*packet_to_send, options, pacing_info))
-    return false;
-
-  {
-    rtc::CritScope lock(&send_critsect_);
-    media_has_been_sent_ = true;
-  }
-  UpdateRtpStats(*packet_to_send, send_over_rtx, is_retransmit);
-  return true;
-}
-
-void RTPSender::UpdateRtpStats(const RtpPacketToSend& packet,
-                               bool is_rtx,
-                               bool is_retransmit) {
-  int64_t now_ms = clock_->TimeInMilliseconds();
-
-  rtc::CritScope lock(&statistics_crit_);
-  StreamDataCounters* counters = is_rtx ? &rtx_rtp_stats_ : &rtp_stats_;
-
-  total_bitrate_sent_.Update(packet.size(), now_ms);
-
-  if (counters->first_packet_time_ms == -1)
-    counters->first_packet_time_ms = now_ms;
-
-  if (IsFecPacket(packet))
-    CountPacket(&counters->fec, packet);
-
-  if (is_retransmit) {
-    CountPacket(&counters->retransmitted, packet);
-    nack_bitrate_sent_.Update(packet.size(), now_ms);
-  }
-  CountPacket(&counters->transmitted, packet);
-
-  if (rtp_stats_callback_)
-    rtp_stats_callback_->DataCountersUpdated(*counters, packet.Ssrc());
-}
-
-bool RTPSender::IsFecPacket(const RtpPacketToSend& packet) const {
-  if (!video_)
-    return false;
-
-  // FlexFEC.
-  if (packet.Ssrc() == FlexfecSsrc())
-    return true;
-
-  // RED+ULPFEC.
-  int pt_red;
-  int pt_fec;
-  video_->GetUlpfecConfig(&pt_red, &pt_fec);
-  return static_cast<int>(packet.PayloadType()) == pt_red &&
-         static_cast<int>(packet.payload()[0]) == pt_fec;
-}
-
-size_t RTPSender::TimeToSendPadding(size_t bytes,
-                                    const PacedPacketInfo& pacing_info) {
-  if (bytes == 0)
-    return 0;
-  size_t bytes_sent = TrySendRedundantPayloads(bytes, pacing_info);
-  if (bytes_sent < bytes)
-    bytes_sent += SendPadData(bytes - bytes_sent, pacing_info);
-  return bytes_sent;
-}
-
-bool RTPSender::SendToNetwork(std::unique_ptr<RtpPacketToSend> packet,
-                              StorageType storage,
-                              RtpPacketSender::Priority priority) {
-  RTC_DCHECK(packet);
-  int64_t now_ms = clock_->TimeInMilliseconds();
-
-  // |capture_time_ms| <= 0 is considered invalid.
-  // TODO(holmer): This should be changed all over Video Engine so that negative
-  // time is consider invalid, while 0 is considered a valid time.
-  if (packet->capture_time_ms() > 0) {
-    packet->SetExtension<TransmissionOffset>(
-        kTimestampTicksPerMs * (now_ms - packet->capture_time_ms()));
-    if (packet->HasExtension<VideoTimingExtension>())
-      packet->set_pacer_exit_time_ms(now_ms);
-  }
-  packet->SetExtension<AbsoluteSendTime>(AbsoluteSendTime::MsTo24Bits(now_ms));
-
-  if (video_) {
-    BWE_TEST_LOGGING_PLOT_WITH_SSRC(1, "VideoTotBitrate_kbps", now_ms,
-                                    ActualSendBitrateKbit(), packet->Ssrc());
-    BWE_TEST_LOGGING_PLOT_WITH_SSRC(1, "VideoFecBitrate_kbps", now_ms,
-                                    FecOverheadRate() / 1000, packet->Ssrc());
-    BWE_TEST_LOGGING_PLOT_WITH_SSRC(1, "VideoNackBitrate_kbps", now_ms,
-                                    NackOverheadRate() / 1000, packet->Ssrc());
-  } else {
-    BWE_TEST_LOGGING_PLOT_WITH_SSRC(1, "AudioTotBitrate_kbps", now_ms,
-                                    ActualSendBitrateKbit(), packet->Ssrc());
-    BWE_TEST_LOGGING_PLOT_WITH_SSRC(1, "AudioNackBitrate_kbps", now_ms,
-                                    NackOverheadRate() / 1000, packet->Ssrc());
-  }
-
-  uint32_t ssrc = packet->Ssrc();
-  rtc::Optional<uint32_t> flexfec_ssrc = FlexfecSsrc();
-  if (paced_sender_) {
-    uint16_t seq_no = packet->SequenceNumber();
-    // Correct offset between implementations of millisecond time stamps in
-    // TickTime and Clock.
-    int64_t corrected_time_ms = packet->capture_time_ms() + clock_delta_ms_;
-    size_t payload_length = packet->payload_size();
-    if (ssrc == flexfec_ssrc) {
-      // Store FlexFEC packets in the history here, so they can be found
-      // when the pacer calls TimeToSendPacket.
-      flexfec_packet_history_.PutRtpPacket(std::move(packet), storage, false);
-    } else {
-      packet_history_.PutRtpPacket(std::move(packet), storage, false);
-    }
-
-    paced_sender_->InsertPacket(priority, ssrc, seq_no, corrected_time_ms,
-                                payload_length, false);
-    if (last_capture_time_ms_sent_ == 0 ||
-        corrected_time_ms > last_capture_time_ms_sent_) {
-      last_capture_time_ms_sent_ = corrected_time_ms;
-      TRACE_EVENT_ASYNC_BEGIN1(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"),
-                               "PacedSend", corrected_time_ms,
-                               "capture_time_ms", corrected_time_ms);
-    }
-    return true;
-  }
-
-  PacketOptions options;
-  if (UpdateTransportSequenceNumber(packet.get(), &options.packet_id)) {
-    AddPacketToTransportFeedback(options.packet_id, *packet.get(),
-                                 PacedPacketInfo());
-  }
-
-  UpdateDelayStatistics(packet->capture_time_ms(), now_ms);
-  UpdateOnSendPacket(options.packet_id, packet->capture_time_ms(),
-                     packet->Ssrc());
-
-  bool sent = SendPacketToNetwork(*packet, options, PacedPacketInfo());
-
-  if (sent) {
-    {
-      rtc::CritScope lock(&send_critsect_);
-      media_has_been_sent_ = true;
-    }
-    UpdateRtpStats(*packet, false, false);
-  }
-
-  // To support retransmissions, we store the media packet as sent in the
-  // packet history (even if send failed).
-  if (storage == kAllowRetransmission) {
-    // TODO(brandtr): Uncomment the DCHECK line below when |ssrc_| cannot
-    // change after the first packet has been sent. For more details, see
-    // https://bugs.chromium.org/p/webrtc/issues/detail?id=6887.
-    // RTC_DCHECK_EQ(ssrc, SSRC());
-    packet_history_.PutRtpPacket(std::move(packet), storage, true);
-  }
-
-  return sent;
-}
-
-void RTPSender::UpdateDelayStatistics(int64_t capture_time_ms, int64_t now_ms) {
-  if (!send_side_delay_observer_ || capture_time_ms <= 0)
-    return;
-
-  uint32_t ssrc;
-  int64_t avg_delay_ms = 0;
-  int max_delay_ms = 0;
-  {
-    rtc::CritScope lock(&send_critsect_);
-    if (!ssrc_)
-      return;
-    ssrc = *ssrc_;
-  }
-  {
-    rtc::CritScope cs(&statistics_crit_);
-    // TODO(holmer): Compute this iteratively instead.
-    send_delays_[now_ms] = now_ms - capture_time_ms;
-    send_delays_.erase(send_delays_.begin(),
-                       send_delays_.lower_bound(now_ms -
-                       kSendSideDelayWindowMs));
-    int num_delays = 0;
-    for (auto it = send_delays_.upper_bound(now_ms - kSendSideDelayWindowMs);
-         it != send_delays_.end(); ++it) {
-      max_delay_ms = std::max(max_delay_ms, it->second);
-      avg_delay_ms += it->second;
-      ++num_delays;
-    }
-    if (num_delays == 0)
-      return;
-    avg_delay_ms = (avg_delay_ms + num_delays / 2) / num_delays;
-  }
-  send_side_delay_observer_->SendSideDelayUpdated(
-      rtc::dchecked_cast<int>(avg_delay_ms), max_delay_ms, ssrc);
-}
-
-void RTPSender::UpdateOnSendPacket(int packet_id,
-                                   int64_t capture_time_ms,
-                                   uint32_t ssrc) {
-  if (!send_packet_observer_ || capture_time_ms <= 0 || packet_id == -1)
-    return;
-
-  send_packet_observer_->OnSendPacket(packet_id, capture_time_ms, ssrc);
-}
-
-void RTPSender::ProcessBitrate() {
-  if (!bitrate_callback_)
-    return;
-  int64_t now_ms = clock_->TimeInMilliseconds();
-  uint32_t ssrc;
-  {
-    rtc::CritScope lock(&send_critsect_);
-    if (!ssrc_)
-      return;
-    ssrc = *ssrc_;
-  }
-
-  rtc::CritScope lock(&statistics_crit_);
-  bitrate_callback_->Notify(total_bitrate_sent_.Rate(now_ms).value_or(0),
-                            nack_bitrate_sent_.Rate(now_ms).value_or(0), ssrc);
-}
-
-size_t RTPSender::RtpHeaderLength() const {
-  rtc::CritScope lock(&send_critsect_);
-  size_t rtp_header_length = kRtpHeaderLength;
-  rtp_header_length += sizeof(uint32_t) * csrcs_.size();
-  rtp_header_length +=
-      rtp_header_extension_map_.GetTotalLengthInBytes(kExtensionSizes);
-  return rtp_header_length;
-}
-
-uint16_t RTPSender::AllocateSequenceNumber(uint16_t packets_to_send) {
-  rtc::CritScope lock(&send_critsect_);
-  uint16_t first_allocated_sequence_number = sequence_number_;
-  sequence_number_ += packets_to_send;
-  return first_allocated_sequence_number;
-}
-
-void RTPSender::GetDataCounters(StreamDataCounters* rtp_stats,
-                                StreamDataCounters* rtx_stats) const {
-  rtc::CritScope lock(&statistics_crit_);
-  *rtp_stats = rtp_stats_;
-  *rtx_stats = rtx_rtp_stats_;
-}
-
-std::unique_ptr<RtpPacketToSend> RTPSender::AllocatePacket() const {
-  rtc::CritScope lock(&send_critsect_);
-  std::unique_ptr<RtpPacketToSend> packet(
-      new RtpPacketToSend(&rtp_header_extension_map_, max_packet_size_));
-  RTC_DCHECK(ssrc_);
-  packet->SetSsrc(*ssrc_);
-  packet->SetCsrcs(csrcs_);
-  // Reserve extensions, if registered, RtpSender set in SendToNetwork.
-  packet->ReserveExtension<AbsoluteSendTime>();
-  packet->ReserveExtension<TransmissionOffset>();
-  packet->ReserveExtension<TransportSequenceNumber>();
-  if (playout_delay_oracle_.send_playout_delay()) {
-    packet->SetExtension<PlayoutDelayLimits>(
-        playout_delay_oracle_.playout_delay());
-  }
-  return packet;
-}
-
-bool RTPSender::AssignSequenceNumber(RtpPacketToSend* packet) {
-  rtc::CritScope lock(&send_critsect_);
-  if (!sending_media_)
-    return false;
-  RTC_DCHECK(packet->Ssrc() == ssrc_);
-  packet->SetSequenceNumber(sequence_number_++);
-
-  // Remember marker bit to determine if padding can be inserted with
-  // sequence number following |packet|.
-  last_packet_marker_bit_ = packet->Marker();
-  // Save timestamps to generate timestamp field and extensions for the padding.
-  last_rtp_timestamp_ = packet->Timestamp();
-  last_timestamp_time_ms_ = clock_->TimeInMilliseconds();
-  capture_time_ms_ = packet->capture_time_ms();
-  return true;
-}
-
-bool RTPSender::UpdateTransportSequenceNumber(RtpPacketToSend* packet,
-                                              int* packet_id) const {
-  RTC_DCHECK(packet);
-  RTC_DCHECK(packet_id);
-  rtc::CritScope lock(&send_critsect_);
-  if (!rtp_header_extension_map_.IsRegistered(TransportSequenceNumber::kId))
-    return false;
-
-  if (!transport_sequence_number_allocator_)
-    return false;
-
-  *packet_id = transport_sequence_number_allocator_->AllocateSequenceNumber();
-
-  if (!packet->SetExtension<TransportSequenceNumber>(*packet_id))
-    return false;
-
-  return true;
-}
-
-void RTPSender::SetSendingMediaStatus(bool enabled) {
-  rtc::CritScope lock(&send_critsect_);
-  sending_media_ = enabled;
-}
-
-bool RTPSender::SendingMedia() const {
-  rtc::CritScope lock(&send_critsect_);
-  return sending_media_;
-}
-
-void RTPSender::SetTimestampOffset(uint32_t timestamp) {
-  rtc::CritScope lock(&send_critsect_);
-  timestamp_offset_ = timestamp;
-}
-
-uint32_t RTPSender::TimestampOffset() const {
-  rtc::CritScope lock(&send_critsect_);
-  return timestamp_offset_;
-}
-
-void RTPSender::SetSSRC(uint32_t ssrc) {
-  // This is configured via the API.
-  rtc::CritScope lock(&send_critsect_);
-
-  if (ssrc_ == ssrc) {
-    return;  // Since it's same ssrc, don't reset anything.
-  }
-  ssrc_.emplace(ssrc);
-  if (!sequence_number_forced_) {
-    sequence_number_ = random_.Rand(1, kMaxInitRtpSeqNumber);
-  }
-}
-
-uint32_t RTPSender::SSRC() const {
-  rtc::CritScope lock(&send_critsect_);
-  RTC_DCHECK(ssrc_);
-  return *ssrc_;
-}
-
-rtc::Optional<uint32_t> RTPSender::FlexfecSsrc() const {
-  if (video_) {
-    return video_->FlexfecSsrc();
-  }
-  return rtc::Optional<uint32_t>();
-}
-
-void RTPSender::SetCsrcs(const std::vector<uint32_t>& csrcs) {
-  RTC_DCHECK_LE(csrcs.size(), kRtpCsrcSize);
-  rtc::CritScope lock(&send_critsect_);
-  csrcs_ = csrcs;
-}
-
-void RTPSender::SetSequenceNumber(uint16_t seq) {
-  rtc::CritScope lock(&send_critsect_);
-  sequence_number_forced_ = true;
-  sequence_number_ = seq;
-}
-
-uint16_t RTPSender::SequenceNumber() const {
-  rtc::CritScope lock(&send_critsect_);
-  return sequence_number_;
-}
-
-// Audio.
-int32_t RTPSender::SendTelephoneEvent(uint8_t key,
-                                      uint16_t time_ms,
-                                      uint8_t level) {
-  if (!audio_configured_) {
-    return -1;
-  }
-  return audio_->SendTelephoneEvent(key, time_ms, level);
-}
-
-int32_t RTPSender::SetAudioLevel(uint8_t level_d_bov) {
-  return audio_->SetAudioLevel(level_d_bov);
-}
-
-RtpVideoCodecTypes RTPSender::VideoCodecType() const {
-  RTC_DCHECK(!audio_configured_) << "Sender is an audio stream!";
-  return video_->VideoCodecType();
-}
-
-void RTPSender::SetUlpfecConfig(int red_payload_type, int ulpfec_payload_type) {
-  RTC_DCHECK(!audio_configured_);
-  video_->SetUlpfecConfig(red_payload_type, ulpfec_payload_type);
-}
-
-bool RTPSender::SetFecParameters(const FecProtectionParams& delta_params,
-                                 const FecProtectionParams& key_params) {
-  if (audio_configured_) {
-    return false;
-  }
-  video_->SetFecParameters(delta_params, key_params);
-  return true;
-}
-
-std::unique_ptr<RtpPacketToSend> RTPSender::BuildRtxPacket(
-    const RtpPacketToSend& packet) {
-  // TODO(danilchap): Create rtx packet with extra capacity for SRTP
-  // when transport interface would be updated to take buffer class.
-  std::unique_ptr<RtpPacketToSend> rtx_packet(new RtpPacketToSend(
-      &rtp_header_extension_map_, packet.size() + kRtxHeaderSize));
-  // Add original RTP header.
-  rtx_packet->CopyHeaderFrom(packet);
-  {
-    rtc::CritScope lock(&send_critsect_);
-    if (!sending_media_)
-      return nullptr;
-
-    RTC_DCHECK(ssrc_rtx_);
-
-    // Replace payload type.
-    auto kv = rtx_payload_type_map_.find(packet.PayloadType());
-    if (kv == rtx_payload_type_map_.end())
-      return nullptr;
-    rtx_packet->SetPayloadType(kv->second);
-
-    // Replace sequence number.
-    rtx_packet->SetSequenceNumber(sequence_number_rtx_++);
-
-    // Replace SSRC.
-    rtx_packet->SetSsrc(*ssrc_rtx_);
-  }
-
-  uint8_t* rtx_payload =
-      rtx_packet->AllocatePayload(packet.payload_size() + kRtxHeaderSize);
-  RTC_DCHECK(rtx_payload);
-  // Add OSN (original sequence number).
-  ByteWriter<uint16_t>::WriteBigEndian(rtx_payload, packet.SequenceNumber());
-
-  // Add original payload data.
-  auto payload = packet.payload();
-  memcpy(rtx_payload + kRtxHeaderSize, payload.data(), payload.size());
-
-  return rtx_packet;
-}
-
-void RTPSender::RegisterRtpStatisticsCallback(
-    StreamDataCountersCallback* callback) {
-  rtc::CritScope cs(&statistics_crit_);
-  rtp_stats_callback_ = callback;
-}
-
-StreamDataCountersCallback* RTPSender::GetRtpStatisticsCallback() const {
-  rtc::CritScope cs(&statistics_crit_);
-  return rtp_stats_callback_;
-}
-
-uint32_t RTPSender::BitrateSent() const {
-  rtc::CritScope cs(&statistics_crit_);
-  return total_bitrate_sent_.Rate(clock_->TimeInMilliseconds()).value_or(0);
-}
-
-void RTPSender::SetRtpState(const RtpState& rtp_state) {
-  rtc::CritScope lock(&send_critsect_);
-  sequence_number_ = rtp_state.sequence_number;
-  sequence_number_forced_ = true;
-  timestamp_offset_ = rtp_state.start_timestamp;
-  last_rtp_timestamp_ = rtp_state.timestamp;
-  capture_time_ms_ = rtp_state.capture_time_ms;
-  last_timestamp_time_ms_ = rtp_state.last_timestamp_time_ms;
-  media_has_been_sent_ = rtp_state.media_has_been_sent;
-}
-
-RtpState RTPSender::GetRtpState() const {
-  rtc::CritScope lock(&send_critsect_);
-
-  RtpState state;
-  state.sequence_number = sequence_number_;
-  state.start_timestamp = timestamp_offset_;
-  state.timestamp = last_rtp_timestamp_;
-  state.capture_time_ms = capture_time_ms_;
-  state.last_timestamp_time_ms = last_timestamp_time_ms_;
-  state.media_has_been_sent = media_has_been_sent_;
-
-  return state;
-}
-
-void RTPSender::SetRtxRtpState(const RtpState& rtp_state) {
-  rtc::CritScope lock(&send_critsect_);
-  sequence_number_rtx_ = rtp_state.sequence_number;
-}
-
-RtpState RTPSender::GetRtxRtpState() const {
-  rtc::CritScope lock(&send_critsect_);
-
-  RtpState state;
-  state.sequence_number = sequence_number_rtx_;
-  state.start_timestamp = timestamp_offset_;
-
-  return state;
-}
-
-void RTPSender::AddPacketToTransportFeedback(
-    uint16_t packet_id,
-    const RtpPacketToSend& packet,
-    const PacedPacketInfo& pacing_info) {
-  size_t packet_size = packet.payload_size() + packet.padding_size();
-  if (send_side_bwe_with_overhead_) {
-    packet_size = packet.size();
-  }
-
-  if (transport_feedback_observer_) {
-    transport_feedback_observer_->AddPacket(SSRC(), packet_id, packet_size,
-                                            pacing_info);
-  }
-}
-
-void RTPSender::UpdateRtpOverhead(const RtpPacketToSend& packet) {
-  if (!overhead_observer_)
-    return;
-  size_t overhead_bytes_per_packet;
-  {
-    rtc::CritScope lock(&send_critsect_);
-    if (rtp_overhead_bytes_per_packet_ == packet.headers_size()) {
-      return;
-    }
-    rtp_overhead_bytes_per_packet_ = packet.headers_size();
-    overhead_bytes_per_packet = rtp_overhead_bytes_per_packet_;
-  }
-  overhead_observer_->OnOverheadChanged(overhead_bytes_per_packet);
-}
-
-int64_t RTPSender::LastTimestampTimeMs() const {
-  rtc::CritScope lock(&send_critsect_);
-  return last_timestamp_time_ms_;
-}
-
-void RTPSender::SendKeepAlive(uint8_t payload_type) {
-  std::unique_ptr<RtpPacketToSend> packet = AllocatePacket();
-  packet->SetPayloadType(payload_type);
-  // Set marker bit and timestamps in the same manner as plain padding packets.
-  packet->SetMarker(false);
-  {
-    rtc::CritScope lock(&send_critsect_);
-    packet->SetTimestamp(last_rtp_timestamp_);
-    packet->set_capture_time_ms(capture_time_ms_);
-  }
-  AssignSequenceNumber(packet.get());
-  SendToNetwork(std::move(packet), StorageType::kDontRetransmit,
-                RtpPacketSender::Priority::kLowPriority);
-}
-
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/rtp_sender.h b/modules/rtp_rtcp/source/rtp_sender.h
deleted file mode 100644
index 91ae865..0000000
--- a/modules/rtp_rtcp/source/rtp_sender.h
+++ /dev/null
@@ -1,337 +0,0 @@
-/*
- *  Copyright (c) 2012 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_RTP_RTCP_SOURCE_RTP_SENDER_H_
-#define WEBRTC_MODULES_RTP_RTCP_SOURCE_RTP_SENDER_H_
-
-#include <map>
-#include <memory>
-#include <utility>
-#include <vector>
-
-#include "webrtc/api/array_view.h"
-#include "webrtc/api/call/transport.h"
-#include "webrtc/api/optional.h"
-#include "webrtc/common_types.h"
-#include "webrtc/modules/rtp_rtcp/include/flexfec_sender.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_header_extension_map.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
-#include "webrtc/modules/rtp_rtcp/source/playout_delay_oracle.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_packet_history.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_rtcp_config.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_utility.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/deprecation.h"
-#include "webrtc/rtc_base/random.h"
-#include "webrtc/rtc_base/rate_statistics.h"
-#include "webrtc/rtc_base/thread_annotations.h"
-
-namespace webrtc {
-
-class OverheadObserver;
-class RateLimiter;
-class RtcEventLog;
-class RtpPacketToSend;
-class RTPSenderAudio;
-class RTPSenderVideo;
-
-class RTPSender {
- public:
-  RTPSender(bool audio,
-            Clock* clock,
-            Transport* transport,
-            RtpPacketSender* paced_sender,
-            // TODO(brandtr): Remove |flexfec_sender| when that is hooked up
-            // to PacedSender instead.
-            FlexfecSender* flexfec_sender,
-            TransportSequenceNumberAllocator* sequence_number_allocator,
-            TransportFeedbackObserver* transport_feedback_callback,
-            BitrateStatisticsObserver* bitrate_callback,
-            FrameCountObserver* frame_count_observer,
-            SendSideDelayObserver* send_side_delay_observer,
-            RtcEventLog* event_log,
-            SendPacketObserver* send_packet_observer,
-            RateLimiter* nack_rate_limiter,
-            OverheadObserver* overhead_observer);
-
-  ~RTPSender();
-
-  void ProcessBitrate();
-
-  uint16_t ActualSendBitrateKbit() const;
-
-  uint32_t VideoBitrateSent() const;
-  uint32_t FecOverheadRate() const;
-  uint32_t NackOverheadRate() const;
-
-  int32_t RegisterPayload(const char* payload_name,
-                          const int8_t payload_type,
-                          const uint32_t frequency,
-                          const size_t channels,
-                          const uint32_t rate);
-
-  int32_t DeRegisterSendPayload(const int8_t payload_type);
-
-  void SetSendPayloadType(int8_t payload_type);
-
-  void SetSendingMediaStatus(bool enabled);
-  bool SendingMedia() const;
-
-  void GetDataCounters(StreamDataCounters* rtp_stats,
-                       StreamDataCounters* rtx_stats) const;
-
-  uint32_t TimestampOffset() const;
-  void SetTimestampOffset(uint32_t timestamp);
-
-  void SetSSRC(uint32_t ssrc);
-
-  uint16_t SequenceNumber() const;
-  void SetSequenceNumber(uint16_t seq);
-
-  void SetCsrcs(const std::vector<uint32_t>& csrcs);
-
-  void SetMaxRtpPacketSize(size_t max_packet_size);
-
-  bool SendOutgoingData(FrameType frame_type,
-                        int8_t payload_type,
-                        uint32_t timestamp,
-                        int64_t capture_time_ms,
-                        const uint8_t* payload_data,
-                        size_t payload_size,
-                        const RTPFragmentationHeader* fragmentation,
-                        const RTPVideoHeader* rtp_header,
-                        uint32_t* transport_frame_id_out,
-                        int64_t expected_retransmission_time_ms);
-
-  // RTP header extension
-  int32_t RegisterRtpHeaderExtension(RTPExtensionType type, uint8_t id);
-  bool IsRtpHeaderExtensionRegistered(RTPExtensionType type) const;
-  int32_t DeregisterRtpHeaderExtension(RTPExtensionType type);
-
-  bool TimeToSendPacket(uint32_t ssrc,
-                        uint16_t sequence_number,
-                        int64_t capture_time_ms,
-                        bool retransmission,
-                        const PacedPacketInfo& pacing_info);
-  size_t TimeToSendPadding(size_t bytes, const PacedPacketInfo& pacing_info);
-
-  // NACK.
-  int SelectiveRetransmissions() const;
-  int SetSelectiveRetransmissions(uint8_t settings);
-  void OnReceivedNack(const std::vector<uint16_t>& nack_sequence_numbers,
-                      int64_t avg_rtt);
-
-  void SetStorePacketsStatus(bool enable, uint16_t number_to_store);
-
-  bool StorePackets() const;
-
-  int32_t ReSendPacket(uint16_t packet_id, int64_t min_resend_time = 0);
-
-  // Feedback to decide when to stop sending playout delay.
-  void OnReceivedRtcpReportBlocks(const ReportBlockList& report_blocks);
-
-  // RTX.
-  void SetRtxStatus(int mode);
-  int RtxStatus() const;
-
-  uint32_t RtxSsrc() const;
-  void SetRtxSsrc(uint32_t ssrc);
-
-  void SetRtxPayloadType(int payload_type, int associated_payload_type);
-
-  // Size info for header extensions used by FEC packets.
-  static rtc::ArrayView<const RtpExtensionSize> FecExtensionSizes();
-
-  // Create empty packet, fills ssrc, csrcs and reserve place for header
-  // extensions RtpSender updates before sending.
-  std::unique_ptr<RtpPacketToSend> AllocatePacket() const;
-  // Allocate sequence number for provided packet.
-  // Save packet's fields to generate padding that doesn't break media stream.
-  // Return false if sending was turned off.
-  bool AssignSequenceNumber(RtpPacketToSend* packet);
-
-  // Used for padding and FEC packets only.
-  size_t RtpHeaderLength() const;
-  uint16_t AllocateSequenceNumber(uint16_t packets_to_send);
-  // Including RTP headers.
-  size_t MaxRtpPacketSize() const;
-
-  uint32_t SSRC() const;
-
-  rtc::Optional<uint32_t> FlexfecSsrc() const;
-
-  bool SendToNetwork(std::unique_ptr<RtpPacketToSend> packet,
-                     StorageType storage,
-                     RtpPacketSender::Priority priority);
-
-  // Audio.
-
-  // Send a DTMF tone using RFC 2833 (4733).
-  int32_t SendTelephoneEvent(uint8_t key, uint16_t time_ms, uint8_t level);
-
-  // Store the audio level in d_bov for
-  // header-extension-for-audio-level-indication.
-  int32_t SetAudioLevel(uint8_t level_d_bov);
-
-  RtpVideoCodecTypes VideoCodecType() const;
-
-  uint32_t MaxConfiguredBitrateVideo() const;
-
-  // ULPFEC.
-  void SetUlpfecConfig(int red_payload_type, int ulpfec_payload_type);
-
-  bool SetFecParameters(const FecProtectionParams& delta_params,
-                        const FecProtectionParams& key_params);
-
-  // Called on update of RTP statistics.
-  void RegisterRtpStatisticsCallback(StreamDataCountersCallback* callback);
-  StreamDataCountersCallback* GetRtpStatisticsCallback() const;
-
-  uint32_t BitrateSent() const;
-
-  void SetRtpState(const RtpState& rtp_state);
-  RtpState GetRtpState() const;
-  void SetRtxRtpState(const RtpState& rtp_state);
-  RtpState GetRtxRtpState() const;
-
-  int64_t LastTimestampTimeMs() const;
-  void SendKeepAlive(uint8_t payload_type);
-
- protected:
-  int32_t CheckPayloadType(int8_t payload_type, RtpVideoCodecTypes* video_type);
-
- private:
-  // Maps capture time in milliseconds to send-side delay in milliseconds.
-  // Send-side delay is the difference between transmission time and capture
-  // time.
-  typedef std::map<int64_t, int> SendDelayMap;
-
-  size_t SendPadData(size_t bytes, const PacedPacketInfo& pacing_info);
-
-  bool PrepareAndSendPacket(std::unique_ptr<RtpPacketToSend> packet,
-                            bool send_over_rtx,
-                            bool is_retransmit,
-                            const PacedPacketInfo& pacing_info);
-
-  // Return the number of bytes sent.  Note that both of these functions may
-  // return a larger value that their argument.
-  size_t TrySendRedundantPayloads(size_t bytes,
-                                  const PacedPacketInfo& pacing_info);
-
-  std::unique_ptr<RtpPacketToSend> BuildRtxPacket(
-      const RtpPacketToSend& packet);
-
-  bool SendPacketToNetwork(const RtpPacketToSend& packet,
-                           const PacketOptions& options,
-                           const PacedPacketInfo& pacing_info);
-
-  void UpdateDelayStatistics(int64_t capture_time_ms, int64_t now_ms);
-  void UpdateOnSendPacket(int packet_id,
-                          int64_t capture_time_ms,
-                          uint32_t ssrc);
-
-  bool UpdateTransportSequenceNumber(RtpPacketToSend* packet,
-                                     int* packet_id) const;
-
-  void UpdateRtpStats(const RtpPacketToSend& packet,
-                      bool is_rtx,
-                      bool is_retransmit);
-  bool IsFecPacket(const RtpPacketToSend& packet) const;
-
-  void AddPacketToTransportFeedback(uint16_t packet_id,
-                                    const RtpPacketToSend& packet,
-                                    const PacedPacketInfo& pacing_info);
-
-  void UpdateRtpOverhead(const RtpPacketToSend& packet);
-
-  Clock* const clock_;
-  const int64_t clock_delta_ms_;
-  Random random_ RTC_GUARDED_BY(send_critsect_);
-
-  const bool audio_configured_;
-  const std::unique_ptr<RTPSenderAudio> audio_;
-  const std::unique_ptr<RTPSenderVideo> video_;
-
-  RtpPacketSender* const paced_sender_;
-  TransportSequenceNumberAllocator* const transport_sequence_number_allocator_;
-  TransportFeedbackObserver* const transport_feedback_observer_;
-  int64_t last_capture_time_ms_sent_;
-  rtc::CriticalSection send_critsect_;
-
-  Transport* transport_;
-  bool sending_media_ RTC_GUARDED_BY(send_critsect_);
-
-  size_t max_packet_size_;
-
-  int8_t payload_type_ RTC_GUARDED_BY(send_critsect_);
-  std::map<int8_t, RtpUtility::Payload*> payload_type_map_;
-
-  RtpHeaderExtensionMap rtp_header_extension_map_
-      RTC_GUARDED_BY(send_critsect_);
-
-  // Tracks the current request for playout delay limits from application
-  // and decides whether the current RTP frame should include the playout
-  // delay extension on header.
-  PlayoutDelayOracle playout_delay_oracle_;
-
-  RtpPacketHistory packet_history_;
-  // TODO(brandtr): Remove |flexfec_packet_history_| when the FlexfecSender
-  // is hooked up to the PacedSender.
-  RtpPacketHistory flexfec_packet_history_;
-
-  // Statistics
-  rtc::CriticalSection statistics_crit_;
-  SendDelayMap send_delays_ RTC_GUARDED_BY(statistics_crit_);
-  FrameCounts frame_counts_ RTC_GUARDED_BY(statistics_crit_);
-  StreamDataCounters rtp_stats_ RTC_GUARDED_BY(statistics_crit_);
-  StreamDataCounters rtx_rtp_stats_ RTC_GUARDED_BY(statistics_crit_);
-  StreamDataCountersCallback* rtp_stats_callback_
-      RTC_GUARDED_BY(statistics_crit_);
-  RateStatistics total_bitrate_sent_ RTC_GUARDED_BY(statistics_crit_);
-  RateStatistics nack_bitrate_sent_ RTC_GUARDED_BY(statistics_crit_);
-  FrameCountObserver* const frame_count_observer_;
-  SendSideDelayObserver* const send_side_delay_observer_;
-  RtcEventLog* const event_log_;
-  SendPacketObserver* const send_packet_observer_;
-  BitrateStatisticsObserver* const bitrate_callback_;
-
-  // RTP variables
-  uint32_t timestamp_offset_ RTC_GUARDED_BY(send_critsect_);
-  uint32_t remote_ssrc_ RTC_GUARDED_BY(send_critsect_);
-  bool sequence_number_forced_ RTC_GUARDED_BY(send_critsect_);
-  uint16_t sequence_number_ RTC_GUARDED_BY(send_critsect_);
-  uint16_t sequence_number_rtx_ RTC_GUARDED_BY(send_critsect_);
-  // Must be explicitly set by the application, use of rtc::Optional
-  // only to keep track of correct use.
-  rtc::Optional<uint32_t> ssrc_ RTC_GUARDED_BY(send_critsect_);
-  uint32_t last_rtp_timestamp_ RTC_GUARDED_BY(send_critsect_);
-  int64_t capture_time_ms_ RTC_GUARDED_BY(send_critsect_);
-  int64_t last_timestamp_time_ms_ RTC_GUARDED_BY(send_critsect_);
-  bool media_has_been_sent_ RTC_GUARDED_BY(send_critsect_);
-  bool last_packet_marker_bit_ RTC_GUARDED_BY(send_critsect_);
-  std::vector<uint32_t> csrcs_ RTC_GUARDED_BY(send_critsect_);
-  int rtx_ RTC_GUARDED_BY(send_critsect_);
-  rtc::Optional<uint32_t> ssrc_rtx_ RTC_GUARDED_BY(send_critsect_);
-  // Mapping rtx_payload_type_map_[associated] = rtx.
-  std::map<int8_t, int8_t> rtx_payload_type_map_ RTC_GUARDED_BY(send_critsect_);
-  size_t rtp_overhead_bytes_per_packet_ RTC_GUARDED_BY(send_critsect_);
-
-  RateLimiter* const retransmission_rate_limiter_;
-  OverheadObserver* overhead_observer_;
-
-  const bool send_side_bwe_with_overhead_;
-
-  RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(RTPSender);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_RTP_RTCP_SOURCE_RTP_SENDER_H_
diff --git a/modules/rtp_rtcp/source/rtp_sender_audio.cc b/modules/rtp_rtcp/source/rtp_sender_audio.cc
deleted file mode 100644
index 04c776c..0000000
--- a/modules/rtp_rtcp/source/rtp_sender_audio.cc
+++ /dev/null
@@ -1,349 +0,0 @@
-/*
- *  Copyright (c) 2012 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/rtp_rtcp/source/rtp_sender_audio.h"
-
-#include <string.h>
-
-#include <memory>
-#include <utility>
-
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
-#include "webrtc/modules/rtp_rtcp/source/byte_io.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_header_extensions.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_packet_to_send.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/timeutils.h"
-#include "webrtc/rtc_base/trace_event.h"
-
-namespace webrtc {
-
-RTPSenderAudio::RTPSenderAudio(Clock* clock, RTPSender* rtp_sender)
-    : clock_(clock),
-      rtp_sender_(rtp_sender) {}
-
-RTPSenderAudio::~RTPSenderAudio() {}
-
-int32_t RTPSenderAudio::RegisterAudioPayload(
-    const char payloadName[RTP_PAYLOAD_NAME_SIZE],
-    const int8_t payload_type,
-    const uint32_t frequency,
-    const size_t channels,
-    const uint32_t rate,
-    RtpUtility::Payload** payload) {
-  if (RtpUtility::StringCompare(payloadName, "cn", 2)) {
-    rtc::CritScope cs(&send_audio_critsect_);
-    //  we can have multiple CNG payload types
-    switch (frequency) {
-      case 8000:
-        cngnb_payload_type_ = payload_type;
-        break;
-      case 16000:
-        cngwb_payload_type_ = payload_type;
-        break;
-      case 32000:
-        cngswb_payload_type_ = payload_type;
-        break;
-      case 48000:
-        cngfb_payload_type_ = payload_type;
-        break;
-      default:
-        return -1;
-    }
-  } else if (RtpUtility::StringCompare(payloadName, "telephone-event", 15)) {
-    rtc::CritScope cs(&send_audio_critsect_);
-    // Don't add it to the list
-    // we dont want to allow send with a DTMF payloadtype
-    dtmf_payload_type_ = payload_type;
-    dtmf_payload_freq_ = frequency;
-    return 0;
-  }
-  *payload = new RtpUtility::Payload;
-  (*payload)->typeSpecific.Audio.frequency = frequency;
-  (*payload)->typeSpecific.Audio.channels = channels;
-  (*payload)->typeSpecific.Audio.rate = rate;
-  (*payload)->audio = true;
-  (*payload)->name[RTP_PAYLOAD_NAME_SIZE - 1] = '\0';
-  strncpy((*payload)->name, payloadName, RTP_PAYLOAD_NAME_SIZE - 1);
-  return 0;
-}
-
-bool RTPSenderAudio::MarkerBit(FrameType frame_type, int8_t payload_type) {
-  rtc::CritScope cs(&send_audio_critsect_);
-  // for audio true for first packet in a speech burst
-  bool marker_bit = false;
-  if (last_payload_type_ != payload_type) {
-    if (payload_type != -1 && (cngnb_payload_type_ == payload_type ||
-                               cngwb_payload_type_ == payload_type ||
-                               cngswb_payload_type_ == payload_type ||
-                               cngfb_payload_type_ == payload_type)) {
-      // Only set a marker bit when we change payload type to a non CNG
-      return false;
-    }
-
-    // payload_type differ
-    if (last_payload_type_ == -1) {
-      if (frame_type != kAudioFrameCN) {
-        // first packet and NOT CNG
-        return true;
-      } else {
-        // first packet and CNG
-        inband_vad_active_ = true;
-        return false;
-      }
-    }
-
-    // not first packet AND
-    // not CNG AND
-    // payload_type changed
-
-    // set a marker bit when we change payload type
-    marker_bit = true;
-  }
-
-  // For G.723 G.729, AMR etc we can have inband VAD
-  if (frame_type == kAudioFrameCN) {
-    inband_vad_active_ = true;
-  } else if (inband_vad_active_) {
-    inband_vad_active_ = false;
-    marker_bit = true;
-  }
-  return marker_bit;
-}
-
-bool RTPSenderAudio::SendAudio(FrameType frame_type,
-                               int8_t payload_type,
-                               uint32_t rtp_timestamp,
-                               const uint8_t* payload_data,
-                               size_t payload_size,
-                               const RTPFragmentationHeader* fragmentation) {
-  // From RFC 4733:
-  // A source has wide latitude as to how often it sends event updates. A
-  // natural interval is the spacing between non-event audio packets. [...]
-  // Alternatively, a source MAY decide to use a different spacing for event
-  // updates, with a value of 50 ms RECOMMENDED.
-  constexpr int kDtmfIntervalTimeMs = 50;
-  uint8_t audio_level_dbov = 0;
-  uint32_t dtmf_payload_freq = 0;
-  {
-    rtc::CritScope cs(&send_audio_critsect_);
-    audio_level_dbov = audio_level_dbov_;
-    dtmf_payload_freq = dtmf_payload_freq_;
-  }
-
-  // Check if we have pending DTMFs to send
-  if (!dtmf_event_is_on_ && dtmf_queue_.PendingDtmf()) {
-    if ((clock_->TimeInMilliseconds() - dtmf_time_last_sent_) >
-        kDtmfIntervalTimeMs) {
-      // New tone to play
-      dtmf_timestamp_ = rtp_timestamp;
-      if (dtmf_queue_.NextDtmf(&dtmf_current_event_)) {
-        dtmf_event_first_packet_sent_ = false;
-        dtmf_length_samples_ =
-            dtmf_current_event_.duration_ms * (dtmf_payload_freq / 1000);
-        dtmf_event_is_on_ = true;
-      }
-    }
-  }
-
-  // A source MAY send events and coded audio packets for the same time
-  // but we don't support it
-  if (dtmf_event_is_on_) {
-    if (frame_type == kEmptyFrame) {
-      // kEmptyFrame is used to drive the DTMF when in CN mode
-      // it can be triggered more frequently than we want to send the
-      // DTMF packets.
-      const unsigned int dtmf_interval_time_rtp =
-          dtmf_payload_freq * kDtmfIntervalTimeMs / 1000;
-      if ((rtp_timestamp - dtmf_timestamp_last_sent_) <
-          dtmf_interval_time_rtp) {
-        // not time to send yet
-        return true;
-      }
-    }
-    dtmf_timestamp_last_sent_ = rtp_timestamp;
-    uint32_t dtmf_duration_samples = rtp_timestamp - dtmf_timestamp_;
-    bool ended = false;
-    bool send = true;
-
-    if (dtmf_length_samples_ > dtmf_duration_samples) {
-      if (dtmf_duration_samples <= 0) {
-        // Skip send packet at start, since we shouldn't use duration 0
-        send = false;
-      }
-    } else {
-      ended = true;
-      dtmf_event_is_on_ = false;
-      dtmf_time_last_sent_ = clock_->TimeInMilliseconds();
-    }
-    if (send) {
-      if (dtmf_duration_samples > 0xffff) {
-        // RFC 4733 2.5.2.3 Long-Duration Events
-        SendTelephoneEventPacket(ended, dtmf_timestamp_,
-                                 static_cast<uint16_t>(0xffff), false);
-
-        // set new timestap for this segment
-        dtmf_timestamp_ = rtp_timestamp;
-        dtmf_duration_samples -= 0xffff;
-        dtmf_length_samples_ -= 0xffff;
-
-        return SendTelephoneEventPacket(ended, dtmf_timestamp_,
-            static_cast<uint16_t>(dtmf_duration_samples), false);
-      } else {
-        if (!SendTelephoneEventPacket(ended, dtmf_timestamp_,
-                                      dtmf_duration_samples,
-                                      !dtmf_event_first_packet_sent_)) {
-          return false;
-        }
-        dtmf_event_first_packet_sent_ = true;
-        return true;
-      }
-    }
-    return true;
-  }
-  if (payload_size == 0 || payload_data == NULL) {
-    if (frame_type == kEmptyFrame) {
-      // we don't send empty audio RTP packets
-      // no error since we use it to drive DTMF when we use VAD
-      return true;
-    }
-    return false;
-  }
-
-  std::unique_ptr<RtpPacketToSend> packet = rtp_sender_->AllocatePacket();
-  packet->SetMarker(MarkerBit(frame_type, payload_type));
-  packet->SetPayloadType(payload_type);
-  packet->SetTimestamp(rtp_timestamp);
-  packet->set_capture_time_ms(clock_->TimeInMilliseconds());
-  // Update audio level extension, if included.
-  packet->SetExtension<AudioLevel>(frame_type == kAudioFrameSpeech,
-                                   audio_level_dbov);
-
-  if (fragmentation && fragmentation->fragmentationVectorSize > 0) {
-    // Use the fragment info if we have one.
-    uint8_t* payload =
-        packet->AllocatePayload(1 + fragmentation->fragmentationLength[0]);
-    if (!payload)  // Too large payload buffer.
-      return false;
-    payload[0] = fragmentation->fragmentationPlType[0];
-    memcpy(payload + 1, payload_data + fragmentation->fragmentationOffset[0],
-           fragmentation->fragmentationLength[0]);
-  } else {
-    uint8_t* payload = packet->AllocatePayload(payload_size);
-    if (!payload)  // Too large payload buffer.
-      return false;
-    memcpy(payload, payload_data, payload_size);
-  }
-
-  if (!rtp_sender_->AssignSequenceNumber(packet.get()))
-    return false;
-
-  {
-    rtc::CritScope cs(&send_audio_critsect_);
-    last_payload_type_ = payload_type;
-  }
-  TRACE_EVENT_ASYNC_END2("webrtc", "Audio", rtp_timestamp, "timestamp",
-                         packet->Timestamp(), "seqnum",
-                         packet->SequenceNumber());
-  bool send_result = rtp_sender_->SendToNetwork(
-      std::move(packet), kAllowRetransmission, RtpPacketSender::kHighPriority);
-  if (first_packet_sent_()) {
-    LOG(LS_INFO) << "First audio RTP packet sent to pacer";
-  }
-  return send_result;
-}
-
-// Audio level magnitude and voice activity flag are set for each RTP packet
-int32_t RTPSenderAudio::SetAudioLevel(uint8_t level_dbov) {
-  if (level_dbov > 127) {
-    return -1;
-  }
-  rtc::CritScope cs(&send_audio_critsect_);
-  audio_level_dbov_ = level_dbov;
-  return 0;
-}
-
-// Send a TelephoneEvent tone using RFC 2833 (4733)
-int32_t RTPSenderAudio::SendTelephoneEvent(uint8_t key,
-                                           uint16_t time_ms,
-                                           uint8_t level) {
-  DtmfQueue::Event event;
-  {
-    rtc::CritScope lock(&send_audio_critsect_);
-    if (dtmf_payload_type_ < 0) {
-      // TelephoneEvent payloadtype not configured
-      return -1;
-    }
-    event.payload_type = dtmf_payload_type_;
-  }
-  event.key = key;
-  event.duration_ms = time_ms;
-  event.level = level;
-  return dtmf_queue_.AddDtmf(event) ? 0 : -1;
-}
-
-bool RTPSenderAudio::SendTelephoneEventPacket(bool ended,
-                                              uint32_t dtmf_timestamp,
-                                              uint16_t duration,
-                                              bool marker_bit) {
-  uint8_t send_count = 1;
-  bool result = true;
-
-  if (ended) {
-    // resend last packet in an event 3 times
-    send_count = 3;
-  }
-  do {
-    // Send DTMF data.
-    constexpr RtpPacketToSend::ExtensionManager* kNoExtensions = nullptr;
-    constexpr size_t kDtmfSize = 4;
-    std::unique_ptr<RtpPacketToSend> packet(
-        new RtpPacketToSend(kNoExtensions, kRtpHeaderSize + kDtmfSize));
-    packet->SetPayloadType(dtmf_current_event_.payload_type);
-    packet->SetMarker(marker_bit);
-    packet->SetSsrc(rtp_sender_->SSRC());
-    packet->SetTimestamp(dtmf_timestamp);
-    packet->set_capture_time_ms(clock_->TimeInMilliseconds());
-    if (!rtp_sender_->AssignSequenceNumber(packet.get()))
-      return false;
-
-    // Create DTMF data.
-    uint8_t* dtmfbuffer = packet->AllocatePayload(kDtmfSize);
-    RTC_DCHECK(dtmfbuffer);
-    /*    From RFC 2833:
-     0                   1                   2                   3
-     0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
-    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-    |     event     |E|R| volume    |          duration             |
-    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-    */
-    // R bit always cleared
-    uint8_t R = 0x00;
-    uint8_t volume = dtmf_current_event_.level;
-
-    // First packet un-ended
-    uint8_t E = ended ? 0x80 : 0x00;
-
-    // First byte is Event number, equals key number
-    dtmfbuffer[0] = dtmf_current_event_.key;
-    dtmfbuffer[1] = E | R | volume;
-    ByteWriter<uint16_t>::WriteBigEndian(dtmfbuffer + 2, duration);
-
-    TRACE_EVENT_INSTANT2(
-        TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), "Audio::SendTelephoneEvent",
-        "timestamp", packet->Timestamp(), "seqnum", packet->SequenceNumber());
-    result = rtp_sender_->SendToNetwork(std::move(packet), kAllowRetransmission,
-                                        RtpPacketSender::kHighPriority);
-    send_count--;
-  } while (send_count > 0 && result);
-
-  return result;
-}
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/rtp_sender_audio.h b/modules/rtp_rtcp/source/rtp_sender_audio.h
deleted file mode 100644
index 3a07080..0000000
--- a/modules/rtp_rtcp/source/rtp_sender_audio.h
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- *  Copyright (c) 2012 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_RTP_RTCP_SOURCE_RTP_SENDER_AUDIO_H_
-#define WEBRTC_MODULES_RTP_RTCP_SOURCE_RTP_SENDER_AUDIO_H_
-
-#include "webrtc/common_types.h"
-#include "webrtc/modules/rtp_rtcp/source/dtmf_queue.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_rtcp_config.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_sender.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_utility.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/onetimeevent.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-class RTPSenderAudio {
- public:
-  RTPSenderAudio(Clock* clock, RTPSender* rtp_sender);
-  ~RTPSenderAudio();
-
-  int32_t RegisterAudioPayload(const char payloadName[RTP_PAYLOAD_NAME_SIZE],
-                               int8_t payload_type,
-                               uint32_t frequency,
-                               size_t channels,
-                               uint32_t rate,
-                               RtpUtility::Payload** payload);
-
-  bool SendAudio(FrameType frame_type,
-                 int8_t payload_type,
-                 uint32_t capture_timestamp,
-                 const uint8_t* payload_data,
-                 size_t payload_size,
-                 const RTPFragmentationHeader* fragmentation);
-
-  // Store the audio level in dBov for
-  // header-extension-for-audio-level-indication.
-  // Valid range is [0,100]. Actual value is negative.
-  int32_t SetAudioLevel(uint8_t level_dbov);
-
-  // Send a DTMF tone using RFC 2833 (4733)
-  int32_t SendTelephoneEvent(uint8_t key, uint16_t time_ms, uint8_t level);
-
- protected:
-  bool SendTelephoneEventPacket(
-      bool ended,
-      uint32_t dtmf_timestamp,
-      uint16_t duration,
-      bool marker_bit);  // set on first packet in talk burst
-
-  bool MarkerBit(FrameType frame_type, int8_t payload_type);
-
- private:
-  Clock* const clock_ = nullptr;
-  RTPSender* const rtp_sender_ = nullptr;
-
-  rtc::CriticalSection send_audio_critsect_;
-
-  // DTMF.
-  bool dtmf_event_is_on_ = false;
-  bool dtmf_event_first_packet_sent_ = false;
-  int8_t dtmf_payload_type_ RTC_GUARDED_BY(send_audio_critsect_) = -1;
-  uint32_t dtmf_payload_freq_ RTC_GUARDED_BY(send_audio_critsect_) = 8000;
-  uint32_t dtmf_timestamp_ = 0;
-  uint32_t dtmf_length_samples_ = 0;
-  int64_t dtmf_time_last_sent_ = 0;
-  uint32_t dtmf_timestamp_last_sent_ = 0;
-  DtmfQueue::Event dtmf_current_event_;
-  DtmfQueue dtmf_queue_;
-
-  // VAD detection, used for marker bit.
-  bool inband_vad_active_ RTC_GUARDED_BY(send_audio_critsect_) = false;
-  int8_t cngnb_payload_type_ RTC_GUARDED_BY(send_audio_critsect_) = -1;
-  int8_t cngwb_payload_type_ RTC_GUARDED_BY(send_audio_critsect_) = -1;
-  int8_t cngswb_payload_type_ RTC_GUARDED_BY(send_audio_critsect_) = -1;
-  int8_t cngfb_payload_type_ RTC_GUARDED_BY(send_audio_critsect_) = -1;
-  int8_t last_payload_type_ RTC_GUARDED_BY(send_audio_critsect_) = -1;
-
-  // Audio level indication.
-  // (https://datatracker.ietf.org/doc/draft-lennox-avt-rtp-audio-level-exthdr/)
-  uint8_t audio_level_dbov_ RTC_GUARDED_BY(send_audio_critsect_) = 0;
-  OneTimeEvent first_packet_sent_;
-
-  RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(RTPSenderAudio);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_RTP_RTCP_SOURCE_RTP_SENDER_AUDIO_H_
diff --git a/modules/rtp_rtcp/source/rtp_sender_unittest.cc b/modules/rtp_rtcp/source/rtp_sender_unittest.cc
deleted file mode 100644
index 860f193..0000000
--- a/modules/rtp_rtcp/source/rtp_sender_unittest.cc
+++ /dev/null
@@ -1,2000 +0,0 @@
-/*
- *  Copyright (c) 2012 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 <memory>
-#include <vector>
-
-#include "webrtc/api/video/video_timing.h"
-#include "webrtc/logging/rtc_event_log/mock/mock_rtc_event_log.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_cvo.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_header_extension_map.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_header_parser.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/transport_feedback.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_format_video_generic.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_header_extensions.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_packet_received.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_packet_to_send.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_sender.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_sender_video.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_utility.h"
-#include "webrtc/rtc_base/arraysize.h"
-#include "webrtc/rtc_base/buffer.h"
-#include "webrtc/rtc_base/ptr_util.h"
-#include "webrtc/rtc_base/rate_limiter.h"
-#include "webrtc/test/field_trial.h"
-#include "webrtc/test/gmock.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/mock_transport.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-namespace {
-const int kTransmissionTimeOffsetExtensionId = 1;
-const int kAbsoluteSendTimeExtensionId = 14;
-const int kTransportSequenceNumberExtensionId = 13;
-const int kVideoTimingExtensionId = 12;
-const int kPayload = 100;
-const int kRtxPayload = 98;
-const uint32_t kTimestamp = 10;
-const uint16_t kSeqNum = 33;
-const uint32_t kSsrc = 725242;
-const int kMaxPacketLength = 1500;
-const uint8_t kAudioLevel = 0x5a;
-const uint16_t kTransportSequenceNumber = 0xaabbu;
-const uint8_t kAudioLevelExtensionId = 9;
-const int kAudioPayload = 103;
-const uint64_t kStartTime = 123456789;
-const size_t kMaxPaddingSize = 224u;
-const int kVideoRotationExtensionId = 5;
-const size_t kGenericHeaderLength = 1;
-const uint8_t kPayloadData[] = {47, 11, 32, 93, 89};
-const int64_t kDefaultExpectedRetransmissionTimeMs = 125;
-
-using ::testing::_;
-using ::testing::ElementsAreArray;
-using ::testing::Invoke;
-
-uint64_t ConvertMsToAbsSendTime(int64_t time_ms) {
-  return (((time_ms << 18) + 500) / 1000) & 0x00ffffff;
-}
-
-class LoopbackTransportTest : public webrtc::Transport {
- public:
-  LoopbackTransportTest() : total_bytes_sent_(0), last_packet_id_(-1) {
-    receivers_extensions_.Register(kRtpExtensionTransmissionTimeOffset,
-                                   kTransmissionTimeOffsetExtensionId);
-    receivers_extensions_.Register(kRtpExtensionAbsoluteSendTime,
-                                   kAbsoluteSendTimeExtensionId);
-    receivers_extensions_.Register(kRtpExtensionTransportSequenceNumber,
-                                   kTransportSequenceNumberExtensionId);
-    receivers_extensions_.Register(kRtpExtensionVideoRotation,
-                                   kVideoRotationExtensionId);
-    receivers_extensions_.Register(kRtpExtensionAudioLevel,
-                                   kAudioLevelExtensionId);
-    receivers_extensions_.Register(kRtpExtensionVideoTiming,
-                                   kVideoTimingExtensionId);
-  }
-
-  bool SendRtp(const uint8_t* data,
-               size_t len,
-               const PacketOptions& options) override {
-    last_packet_id_ = options.packet_id;
-    total_bytes_sent_ += len;
-    sent_packets_.push_back(RtpPacketReceived(&receivers_extensions_));
-    EXPECT_TRUE(sent_packets_.back().Parse(data, len));
-    return true;
-  }
-  bool SendRtcp(const uint8_t* data, size_t len) override { return false; }
-  const RtpPacketReceived& last_sent_packet() { return sent_packets_.back(); }
-  int packets_sent() { return sent_packets_.size(); }
-
-  size_t total_bytes_sent_;
-  int last_packet_id_;
-  std::vector<RtpPacketReceived> sent_packets_;
-
- private:
-  RtpHeaderExtensionMap receivers_extensions_;
-};
-
-}  // namespace
-
-class MockRtpPacketSender : public RtpPacketSender {
- public:
-  MockRtpPacketSender() {}
-  virtual ~MockRtpPacketSender() {}
-
-  MOCK_METHOD6(InsertPacket,
-               void(Priority priority,
-                    uint32_t ssrc,
-                    uint16_t sequence_number,
-                    int64_t capture_time_ms,
-                    size_t bytes,
-                    bool retransmission));
-};
-
-class MockTransportSequenceNumberAllocator
-    : public TransportSequenceNumberAllocator {
- public:
-  MOCK_METHOD0(AllocateSequenceNumber, uint16_t());
-};
-
-class MockSendPacketObserver : public SendPacketObserver {
- public:
-  MOCK_METHOD3(OnSendPacket, void(uint16_t, int64_t, uint32_t));
-};
-
-class MockTransportFeedbackObserver : public TransportFeedbackObserver {
- public:
-  MOCK_METHOD4(AddPacket,
-               void(uint32_t, uint16_t, size_t, const PacedPacketInfo&));
-  MOCK_METHOD1(OnTransportFeedback, void(const rtcp::TransportFeedback&));
-  MOCK_CONST_METHOD0(GetTransportFeedbackVector, std::vector<PacketFeedback>());
-};
-
-class MockOverheadObserver : public OverheadObserver {
- public:
-  MOCK_METHOD1(OnOverheadChanged, void(size_t overhead_bytes_per_packet));
-};
-
-class RtpSenderTest : public ::testing::TestWithParam<bool> {
- protected:
-  RtpSenderTest()
-      : fake_clock_(kStartTime),
-        mock_rtc_event_log_(),
-        mock_paced_sender_(),
-        retransmission_rate_limiter_(&fake_clock_, 1000),
-        rtp_sender_(),
-        payload_(kPayload),
-        transport_(),
-        kMarkerBit(true),
-        field_trials_(GetParam() ? "WebRTC-SendSideBwe-WithOverhead/Enabled/"
-                                 : "") {}
-
-  void SetUp() override { SetUpRtpSender(true); }
-
-  void SetUpRtpSender(bool pacer) {
-    rtp_sender_.reset(new RTPSender(
-        false, &fake_clock_, &transport_, pacer ? &mock_paced_sender_ : nullptr,
-        nullptr, &seq_num_allocator_, nullptr, nullptr, nullptr, nullptr,
-        &mock_rtc_event_log_, &send_packet_observer_,
-        &retransmission_rate_limiter_, nullptr));
-    rtp_sender_->SetSendPayloadType(kPayload);
-    rtp_sender_->SetSequenceNumber(kSeqNum);
-    rtp_sender_->SetTimestampOffset(0);
-    rtp_sender_->SetSSRC(kSsrc);
-  }
-
-  SimulatedClock fake_clock_;
-  testing::NiceMock<MockRtcEventLog> mock_rtc_event_log_;
-  MockRtpPacketSender mock_paced_sender_;
-  testing::StrictMock<MockTransportSequenceNumberAllocator> seq_num_allocator_;
-  testing::StrictMock<MockSendPacketObserver> send_packet_observer_;
-  testing::StrictMock<MockTransportFeedbackObserver> feedback_observer_;
-  RateLimiter retransmission_rate_limiter_;
-  std::unique_ptr<RTPSender> rtp_sender_;
-  int payload_;
-  LoopbackTransportTest transport_;
-  const bool kMarkerBit;
-  test::ScopedFieldTrials field_trials_;
-
-  void VerifyRTPHeaderCommon(const RTPHeader& rtp_header) {
-    VerifyRTPHeaderCommon(rtp_header, kMarkerBit, 0);
-  }
-
-  void VerifyRTPHeaderCommon(const RTPHeader& rtp_header, bool marker_bit) {
-    VerifyRTPHeaderCommon(rtp_header, marker_bit, 0);
-  }
-
-  void VerifyRTPHeaderCommon(const RTPHeader& rtp_header,
-                             bool marker_bit,
-                             uint8_t number_of_csrcs) {
-    EXPECT_EQ(marker_bit, rtp_header.markerBit);
-    EXPECT_EQ(payload_, rtp_header.payloadType);
-    EXPECT_EQ(kSeqNum, rtp_header.sequenceNumber);
-    EXPECT_EQ(kTimestamp, rtp_header.timestamp);
-    EXPECT_EQ(rtp_sender_->SSRC(), rtp_header.ssrc);
-    EXPECT_EQ(number_of_csrcs, rtp_header.numCSRCs);
-    EXPECT_EQ(0U, rtp_header.paddingLength);
-  }
-
-  std::unique_ptr<RtpPacketToSend> BuildRtpPacket(int payload_type,
-                                                  bool marker_bit,
-                                                  uint32_t timestamp,
-                                                  int64_t capture_time_ms) {
-    auto packet = rtp_sender_->AllocatePacket();
-    packet->SetPayloadType(payload_type);
-    packet->SetMarker(marker_bit);
-    packet->SetTimestamp(timestamp);
-    packet->set_capture_time_ms(capture_time_ms);
-    EXPECT_TRUE(rtp_sender_->AssignSequenceNumber(packet.get()));
-    return packet;
-  }
-
-  void SendPacket(int64_t capture_time_ms, int payload_length) {
-    uint32_t timestamp = capture_time_ms * 90;
-    auto packet =
-        BuildRtpPacket(kPayload, kMarkerBit, timestamp, capture_time_ms);
-    packet->AllocatePayload(payload_length);
-
-    // Packet should be stored in a send bucket.
-    EXPECT_TRUE(rtp_sender_->SendToNetwork(std::move(packet),
-                                           kAllowRetransmission,
-                                           RtpPacketSender::kNormalPriority));
-  }
-
-  void SendGenericPayload() {
-    const uint32_t kTimestamp = 1234;
-    const uint8_t kPayloadType = 127;
-    const int64_t kCaptureTimeMs = fake_clock_.TimeInMilliseconds();
-    char payload_name[RTP_PAYLOAD_NAME_SIZE] = "GENERIC";
-    EXPECT_EQ(0, rtp_sender_->RegisterPayload(payload_name, kPayloadType, 90000,
-                                              0, 1500));
-
-    EXPECT_TRUE(rtp_sender_->SendOutgoingData(
-        kVideoFrameKey, kPayloadType, kTimestamp, kCaptureTimeMs, kPayloadData,
-        sizeof(kPayloadData), nullptr, nullptr, nullptr,
-        kDefaultExpectedRetransmissionTimeMs));
-  }
-};
-
-// TODO(pbos): Move tests over from WithoutPacer to RtpSenderTest as this is our
-// default code path.
-class RtpSenderTestWithoutPacer : public RtpSenderTest {
- public:
-  void SetUp() override { SetUpRtpSender(false); }
-};
-
-class TestRtpSenderVideo : public RTPSenderVideo {
- public:
-  TestRtpSenderVideo(Clock* clock,
-                     RTPSender* rtp_sender,
-                     FlexfecSender* flexfec_sender)
-      : RTPSenderVideo(clock, rtp_sender, flexfec_sender) {}
-  ~TestRtpSenderVideo() override {}
-
-  StorageType GetStorageType(const RTPVideoHeader& header,
-                             int32_t retransmission_settings,
-                             int64_t expected_retransmission_time_ms) {
-    return RTPSenderVideo::GetStorageType(GetTemporalId(header),
-                                          retransmission_settings,
-                                          expected_retransmission_time_ms);
-  }
-};
-
-class RtpSenderVideoTest : public RtpSenderTest {
- protected:
-  void SetUp() override {
-    // TODO(pbos): Set up to use pacer.
-    SetUpRtpSender(false);
-    rtp_sender_video_.reset(
-        new TestRtpSenderVideo(&fake_clock_, rtp_sender_.get(), nullptr));
-  }
-  std::unique_ptr<TestRtpSenderVideo> rtp_sender_video_;
-};
-
-TEST_P(RtpSenderTestWithoutPacer, AllocatePacketSetCsrc) {
-  // Configure rtp_sender with csrc.
-  std::vector<uint32_t> csrcs;
-  csrcs.push_back(0x23456789);
-  rtp_sender_->SetCsrcs(csrcs);
-
-  auto packet = rtp_sender_->AllocatePacket();
-
-  ASSERT_TRUE(packet);
-  EXPECT_EQ(rtp_sender_->SSRC(), packet->Ssrc());
-  EXPECT_EQ(csrcs, packet->Csrcs());
-}
-
-TEST_P(RtpSenderTestWithoutPacer, AllocatePacketReserveExtensions) {
-  // Configure rtp_sender with extensions.
-  ASSERT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
-                   kRtpExtensionTransmissionTimeOffset,
-                   kTransmissionTimeOffsetExtensionId));
-  ASSERT_EQ(
-      0, rtp_sender_->RegisterRtpHeaderExtension(kRtpExtensionAbsoluteSendTime,
-                                                 kAbsoluteSendTimeExtensionId));
-  ASSERT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(kRtpExtensionAudioLevel,
-                                                       kAudioLevelExtensionId));
-  ASSERT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
-                   kRtpExtensionTransportSequenceNumber,
-                   kTransportSequenceNumberExtensionId));
-  ASSERT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
-                   kRtpExtensionVideoRotation, kVideoRotationExtensionId));
-
-  auto packet = rtp_sender_->AllocatePacket();
-
-  ASSERT_TRUE(packet);
-  // Preallocate BWE extensions RtpSender set itself.
-  EXPECT_TRUE(packet->HasExtension<TransmissionOffset>());
-  EXPECT_TRUE(packet->HasExtension<AbsoluteSendTime>());
-  EXPECT_TRUE(packet->HasExtension<TransportSequenceNumber>());
-  // Do not allocate media specific extensions.
-  EXPECT_FALSE(packet->HasExtension<AudioLevel>());
-  EXPECT_FALSE(packet->HasExtension<VideoOrientation>());
-}
-
-TEST_P(RtpSenderTestWithoutPacer, AssignSequenceNumberAdvanceSequenceNumber) {
-  auto packet = rtp_sender_->AllocatePacket();
-  ASSERT_TRUE(packet);
-  const uint16_t sequence_number = rtp_sender_->SequenceNumber();
-
-  EXPECT_TRUE(rtp_sender_->AssignSequenceNumber(packet.get()));
-
-  EXPECT_EQ(sequence_number, packet->SequenceNumber());
-  EXPECT_EQ(sequence_number + 1, rtp_sender_->SequenceNumber());
-}
-
-TEST_P(RtpSenderTestWithoutPacer, AssignSequenceNumberFailsOnNotSending) {
-  auto packet = rtp_sender_->AllocatePacket();
-  ASSERT_TRUE(packet);
-
-  rtp_sender_->SetSendingMediaStatus(false);
-  EXPECT_FALSE(rtp_sender_->AssignSequenceNumber(packet.get()));
-}
-
-TEST_P(RtpSenderTestWithoutPacer, AssignSequenceNumberMayAllowPadding) {
-  constexpr size_t kPaddingSize = 100;
-  auto packet = rtp_sender_->AllocatePacket();
-  ASSERT_TRUE(packet);
-
-  ASSERT_FALSE(rtp_sender_->TimeToSendPadding(kPaddingSize, PacedPacketInfo()));
-  packet->SetMarker(false);
-  ASSERT_TRUE(rtp_sender_->AssignSequenceNumber(packet.get()));
-  // Packet without marker bit doesn't allow padding.
-  EXPECT_FALSE(rtp_sender_->TimeToSendPadding(kPaddingSize, PacedPacketInfo()));
-
-  packet->SetMarker(true);
-  ASSERT_TRUE(rtp_sender_->AssignSequenceNumber(packet.get()));
-  // Packet with marker bit allows send padding.
-  EXPECT_TRUE(rtp_sender_->TimeToSendPadding(kPaddingSize, PacedPacketInfo()));
-}
-
-TEST_P(RtpSenderTestWithoutPacer, AssignSequenceNumberSetPaddingTimestamps) {
-  constexpr size_t kPaddingSize = 100;
-  auto packet = rtp_sender_->AllocatePacket();
-  ASSERT_TRUE(packet);
-  packet->SetMarker(true);
-  packet->SetTimestamp(kTimestamp);
-
-  ASSERT_TRUE(rtp_sender_->AssignSequenceNumber(packet.get()));
-  ASSERT_TRUE(rtp_sender_->TimeToSendPadding(kPaddingSize, PacedPacketInfo()));
-
-  ASSERT_EQ(1u, transport_.sent_packets_.size());
-  // Verify padding packet timestamp.
-  EXPECT_EQ(kTimestamp, transport_.last_sent_packet().Timestamp());
-}
-
-TEST_P(RtpSenderTestWithoutPacer,
-       TransportFeedbackObserverGetsCorrectByteCount) {
-  constexpr int kRtpOverheadBytesPerPacket = 12 + 8;
-  testing::NiceMock<MockOverheadObserver> mock_overhead_observer;
-  rtp_sender_.reset(new RTPSender(
-      false, &fake_clock_, &transport_, nullptr, nullptr, &seq_num_allocator_,
-      &feedback_observer_, nullptr, nullptr, nullptr, &mock_rtc_event_log_,
-      nullptr, &retransmission_rate_limiter_, &mock_overhead_observer));
-  rtp_sender_->SetSSRC(kSsrc);
-  EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
-                   kRtpExtensionTransportSequenceNumber,
-                   kTransportSequenceNumberExtensionId));
-  EXPECT_CALL(seq_num_allocator_, AllocateSequenceNumber())
-      .WillOnce(testing::Return(kTransportSequenceNumber));
-
-  const size_t expected_bytes =
-      GetParam() ? sizeof(kPayloadData) + kGenericHeaderLength +
-                       kRtpOverheadBytesPerPacket
-                 : sizeof(kPayloadData) + kGenericHeaderLength;
-
-  EXPECT_CALL(feedback_observer_,
-              AddPacket(rtp_sender_->SSRC(), kTransportSequenceNumber,
-                        expected_bytes, PacedPacketInfo()))
-      .Times(1);
-  EXPECT_CALL(mock_overhead_observer,
-              OnOverheadChanged(kRtpOverheadBytesPerPacket))
-      .Times(1);
-  SendGenericPayload();
-}
-
-TEST_P(RtpSenderTestWithoutPacer, SendsPacketsWithTransportSequenceNumber) {
-  rtp_sender_.reset(new RTPSender(
-      false, &fake_clock_, &transport_, nullptr, nullptr, &seq_num_allocator_,
-      &feedback_observer_, nullptr, nullptr, nullptr, &mock_rtc_event_log_,
-      &send_packet_observer_, &retransmission_rate_limiter_, nullptr));
-  rtp_sender_->SetSSRC(kSsrc);
-  EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
-                   kRtpExtensionTransportSequenceNumber,
-                   kTransportSequenceNumberExtensionId));
-
-  EXPECT_CALL(seq_num_allocator_, AllocateSequenceNumber())
-      .WillOnce(testing::Return(kTransportSequenceNumber));
-  EXPECT_CALL(send_packet_observer_,
-              OnSendPacket(kTransportSequenceNumber, _, _))
-      .Times(1);
-
-  EXPECT_CALL(feedback_observer_,
-              AddPacket(rtp_sender_->SSRC(), kTransportSequenceNumber, _,
-                        PacedPacketInfo()))
-      .Times(1);
-
-  SendGenericPayload();
-
-  const auto& packet = transport_.last_sent_packet();
-  uint16_t transport_seq_no;
-  ASSERT_TRUE(packet.GetExtension<TransportSequenceNumber>(&transport_seq_no));
-  EXPECT_EQ(kTransportSequenceNumber, transport_seq_no);
-  EXPECT_EQ(transport_.last_packet_id_, transport_seq_no);
-}
-
-TEST_P(RtpSenderTestWithoutPacer, NoAllocationIfNotRegistered) {
-  SendGenericPayload();
-}
-
-TEST_P(RtpSenderTestWithoutPacer, OnSendPacketUpdated) {
-  EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
-                   kRtpExtensionTransportSequenceNumber,
-                   kTransportSequenceNumberExtensionId));
-  EXPECT_CALL(seq_num_allocator_, AllocateSequenceNumber())
-      .WillOnce(testing::Return(kTransportSequenceNumber));
-  EXPECT_CALL(send_packet_observer_,
-              OnSendPacket(kTransportSequenceNumber, _, _))
-      .Times(1);
-
-  SendGenericPayload();
-}
-
-TEST_P(RtpSenderTest, SendsPacketsWithTransportSequenceNumber) {
-  rtp_sender_.reset(new RTPSender(
-      false, &fake_clock_, &transport_, &mock_paced_sender_, nullptr,
-      &seq_num_allocator_, &feedback_observer_, nullptr, nullptr, nullptr,
-      &mock_rtc_event_log_, &send_packet_observer_,
-      &retransmission_rate_limiter_, nullptr));
-  rtp_sender_->SetSequenceNumber(kSeqNum);
-  rtp_sender_->SetSSRC(kSsrc);
-  rtp_sender_->SetStorePacketsStatus(true, 10);
-  EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
-                   kRtpExtensionTransportSequenceNumber,
-                   kTransportSequenceNumberExtensionId));
-
-  EXPECT_CALL(mock_paced_sender_, InsertPacket(_, kSsrc, kSeqNum, _, _, _));
-  EXPECT_CALL(seq_num_allocator_, AllocateSequenceNumber())
-      .WillOnce(testing::Return(kTransportSequenceNumber));
-  EXPECT_CALL(send_packet_observer_,
-              OnSendPacket(kTransportSequenceNumber, _, _))
-      .Times(1);
-  EXPECT_CALL(feedback_observer_,
-              AddPacket(rtp_sender_->SSRC(), kTransportSequenceNumber, _,
-                        PacedPacketInfo()))
-      .Times(1);
-
-  SendGenericPayload();
-  rtp_sender_->TimeToSendPacket(kSsrc, kSeqNum,
-                                fake_clock_.TimeInMilliseconds(), false,
-                                PacedPacketInfo());
-
-  const auto& packet = transport_.last_sent_packet();
-  uint16_t transport_seq_no;
-  EXPECT_TRUE(packet.GetExtension<TransportSequenceNumber>(&transport_seq_no));
-  EXPECT_EQ(kTransportSequenceNumber, transport_seq_no);
-  EXPECT_EQ(transport_.last_packet_id_, transport_seq_no);
-}
-
-TEST_P(RtpSenderTestWithoutPacer, WritesTimestampToTimingExtension) {
-  rtp_sender_->SetStorePacketsStatus(true, 10);
-  EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
-                   kRtpExtensionVideoTiming, kVideoTimingExtensionId));
-  int64_t capture_time_ms = fake_clock_.TimeInMilliseconds();
-  auto packet = rtp_sender_->AllocatePacket();
-  packet->SetPayloadType(kPayload);
-  packet->SetMarker(true);
-  packet->SetTimestamp(kTimestamp);
-  packet->set_capture_time_ms(capture_time_ms);
-  const VideoSendTiming kVideoTiming = {0u, 0u, 0u, 0u, 0u, 0u, true};
-  packet->SetExtension<VideoTimingExtension>(kVideoTiming);
-  EXPECT_TRUE(rtp_sender_->AssignSequenceNumber(packet.get()));
-  size_t packet_size = packet->size();
-
-  const int kStoredTimeInMs = 100;
-  fake_clock_.AdvanceTimeMilliseconds(kStoredTimeInMs);
-
-  EXPECT_TRUE(rtp_sender_->SendToNetwork(std::move(packet),
-                                         kAllowRetransmission,
-                                         RtpPacketSender::kNormalPriority));
-  EXPECT_EQ(1, transport_.packets_sent());
-  EXPECT_EQ(packet_size, transport_.last_sent_packet().size());
-
-  VideoSendTiming video_timing;
-  EXPECT_TRUE(transport_.last_sent_packet().GetExtension<VideoTimingExtension>(
-      &video_timing));
-  EXPECT_EQ(kStoredTimeInMs, video_timing.pacer_exit_delta_ms);
-
-  fake_clock_.AdvanceTimeMilliseconds(kStoredTimeInMs);
-  rtp_sender_->TimeToSendPacket(kSsrc, kSeqNum, capture_time_ms, false,
-                                PacedPacketInfo());
-
-  EXPECT_EQ(2, transport_.packets_sent());
-  EXPECT_EQ(packet_size, transport_.last_sent_packet().size());
-
-  EXPECT_TRUE(transport_.last_sent_packet().GetExtension<VideoTimingExtension>(
-      &video_timing));
-  EXPECT_EQ(kStoredTimeInMs * 2, video_timing.pacer_exit_delta_ms);
-}
-
-TEST_P(RtpSenderTest, TrafficSmoothingWithExtensions) {
-  EXPECT_CALL(mock_paced_sender_, InsertPacket(RtpPacketSender::kNormalPriority,
-                                               kSsrc, kSeqNum, _, _, _));
-  EXPECT_CALL(mock_rtc_event_log_,
-              LogRtpHeader(PacketDirection::kOutgoingPacket, _, _, _));
-
-  rtp_sender_->SetStorePacketsStatus(true, 10);
-  EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
-                   kRtpExtensionTransmissionTimeOffset,
-                   kTransmissionTimeOffsetExtensionId));
-  EXPECT_EQ(
-      0, rtp_sender_->RegisterRtpHeaderExtension(kRtpExtensionAbsoluteSendTime,
-                                                 kAbsoluteSendTimeExtensionId));
-  int64_t capture_time_ms = fake_clock_.TimeInMilliseconds();
-  auto packet =
-      BuildRtpPacket(kPayload, kMarkerBit, kTimestamp, capture_time_ms);
-  size_t packet_size = packet->size();
-
-  // Packet should be stored in a send bucket.
-  EXPECT_TRUE(rtp_sender_->SendToNetwork(std::move(packet),
-                                         kAllowRetransmission,
-                                         RtpPacketSender::kNormalPriority));
-
-  EXPECT_EQ(0, transport_.packets_sent());
-
-  const int kStoredTimeInMs = 100;
-  fake_clock_.AdvanceTimeMilliseconds(kStoredTimeInMs);
-
-  rtp_sender_->TimeToSendPacket(kSsrc, kSeqNum, capture_time_ms, false,
-                                PacedPacketInfo());
-
-  // Process send bucket. Packet should now be sent.
-  EXPECT_EQ(1, transport_.packets_sent());
-  EXPECT_EQ(packet_size, transport_.last_sent_packet().size());
-
-  webrtc::RTPHeader rtp_header;
-  transport_.last_sent_packet().GetHeader(&rtp_header);
-
-  // Verify transmission time offset.
-  EXPECT_EQ(kStoredTimeInMs * 90, rtp_header.extension.transmissionTimeOffset);
-  uint64_t expected_send_time =
-      ConvertMsToAbsSendTime(fake_clock_.TimeInMilliseconds());
-  EXPECT_EQ(expected_send_time, rtp_header.extension.absoluteSendTime);
-}
-
-TEST_P(RtpSenderTest, TrafficSmoothingRetransmits) {
-  EXPECT_CALL(mock_paced_sender_, InsertPacket(RtpPacketSender::kNormalPriority,
-                                               kSsrc, kSeqNum, _, _, _));
-  EXPECT_CALL(mock_rtc_event_log_,
-              LogRtpHeader(PacketDirection::kOutgoingPacket, _, _, _));
-
-  rtp_sender_->SetStorePacketsStatus(true, 10);
-  EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
-                   kRtpExtensionTransmissionTimeOffset,
-                   kTransmissionTimeOffsetExtensionId));
-  EXPECT_EQ(
-      0, rtp_sender_->RegisterRtpHeaderExtension(kRtpExtensionAbsoluteSendTime,
-                                                 kAbsoluteSendTimeExtensionId));
-  int64_t capture_time_ms = fake_clock_.TimeInMilliseconds();
-  auto packet =
-      BuildRtpPacket(kPayload, kMarkerBit, kTimestamp, capture_time_ms);
-  size_t packet_size = packet->size();
-
-  // Packet should be stored in a send bucket.
-  EXPECT_TRUE(rtp_sender_->SendToNetwork(std::move(packet),
-                                         kAllowRetransmission,
-                                         RtpPacketSender::kNormalPriority));
-
-  EXPECT_EQ(0, transport_.packets_sent());
-
-  EXPECT_CALL(mock_paced_sender_, InsertPacket(RtpPacketSender::kNormalPriority,
-                                               kSsrc, kSeqNum, _, _, _));
-
-  const int kStoredTimeInMs = 100;
-  fake_clock_.AdvanceTimeMilliseconds(kStoredTimeInMs);
-
-  EXPECT_EQ(static_cast<int>(packet_size), rtp_sender_->ReSendPacket(kSeqNum));
-  EXPECT_EQ(0, transport_.packets_sent());
-
-  rtp_sender_->TimeToSendPacket(kSsrc, kSeqNum, capture_time_ms, false,
-                                PacedPacketInfo());
-
-  // Process send bucket. Packet should now be sent.
-  EXPECT_EQ(1, transport_.packets_sent());
-  EXPECT_EQ(packet_size, transport_.last_sent_packet().size());
-
-  webrtc::RTPHeader rtp_header;
-  transport_.last_sent_packet().GetHeader(&rtp_header);
-
-  // Verify transmission time offset.
-  EXPECT_EQ(kStoredTimeInMs * 90, rtp_header.extension.transmissionTimeOffset);
-  uint64_t expected_send_time =
-      ConvertMsToAbsSendTime(fake_clock_.TimeInMilliseconds());
-  EXPECT_EQ(expected_send_time, rtp_header.extension.absoluteSendTime);
-}
-
-// This test sends 1 regular video packet, then 4 padding packets, and then
-// 1 more regular packet.
-TEST_P(RtpSenderTest, SendPadding) {
-  // Make all (non-padding) packets go to send queue.
-  EXPECT_CALL(mock_paced_sender_, InsertPacket(RtpPacketSender::kNormalPriority,
-                                               kSsrc, kSeqNum, _, _, _));
-  EXPECT_CALL(mock_rtc_event_log_,
-              LogRtpHeader(PacketDirection::kOutgoingPacket, _, _, _))
-      .Times(1 + 4 + 1);
-
-  uint16_t seq_num = kSeqNum;
-  uint32_t timestamp = kTimestamp;
-  rtp_sender_->SetStorePacketsStatus(true, 10);
-  size_t rtp_header_len = kRtpHeaderSize;
-  EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
-                   kRtpExtensionTransmissionTimeOffset,
-                   kTransmissionTimeOffsetExtensionId));
-  rtp_header_len += 4;  // 4 bytes extension.
-  EXPECT_EQ(
-      0, rtp_sender_->RegisterRtpHeaderExtension(kRtpExtensionAbsoluteSendTime,
-                                                 kAbsoluteSendTimeExtensionId));
-  rtp_header_len += 4;  // 4 bytes extension.
-  rtp_header_len += 4;  // 4 extra bytes common to all extension headers.
-
-  webrtc::RTPHeader rtp_header;
-
-  int64_t capture_time_ms = fake_clock_.TimeInMilliseconds();
-  auto packet =
-      BuildRtpPacket(kPayload, kMarkerBit, timestamp, capture_time_ms);
-  const uint32_t media_packet_timestamp = timestamp;
-  size_t packet_size = packet->size();
-
-  // Packet should be stored in a send bucket.
-  EXPECT_TRUE(rtp_sender_->SendToNetwork(std::move(packet),
-                                         kAllowRetransmission,
-                                         RtpPacketSender::kNormalPriority));
-
-  int total_packets_sent = 0;
-  EXPECT_EQ(total_packets_sent, transport_.packets_sent());
-
-  const int kStoredTimeInMs = 100;
-  fake_clock_.AdvanceTimeMilliseconds(kStoredTimeInMs);
-  rtp_sender_->TimeToSendPacket(kSsrc, seq_num++, capture_time_ms, false,
-                                PacedPacketInfo());
-  // Packet should now be sent. This test doesn't verify the regular video
-  // packet, since it is tested in another test.
-  EXPECT_EQ(++total_packets_sent, transport_.packets_sent());
-  timestamp += 90 * kStoredTimeInMs;
-
-  // Send padding 4 times, waiting 50 ms between each.
-  for (int i = 0; i < 4; ++i) {
-    const int kPaddingPeriodMs = 50;
-    const size_t kPaddingBytes = 100;
-    const size_t kMaxPaddingLength = 224;  // Value taken from rtp_sender.cc.
-    // Padding will be forced to full packets.
-    EXPECT_EQ(kMaxPaddingLength,
-              rtp_sender_->TimeToSendPadding(kPaddingBytes, PacedPacketInfo()));
-
-    // Process send bucket. Padding should now be sent.
-    EXPECT_EQ(++total_packets_sent, transport_.packets_sent());
-    EXPECT_EQ(kMaxPaddingLength + rtp_header_len,
-              transport_.last_sent_packet().size());
-
-    transport_.last_sent_packet().GetHeader(&rtp_header);
-    EXPECT_EQ(kMaxPaddingLength, rtp_header.paddingLength);
-
-    // Verify sequence number and timestamp. The timestamp should be the same
-    // as the last media packet.
-    EXPECT_EQ(seq_num++, rtp_header.sequenceNumber);
-    EXPECT_EQ(media_packet_timestamp, rtp_header.timestamp);
-    // Verify transmission time offset.
-    int offset = timestamp - media_packet_timestamp;
-    EXPECT_EQ(offset, rtp_header.extension.transmissionTimeOffset);
-    uint64_t expected_send_time =
-        ConvertMsToAbsSendTime(fake_clock_.TimeInMilliseconds());
-    EXPECT_EQ(expected_send_time, rtp_header.extension.absoluteSendTime);
-    fake_clock_.AdvanceTimeMilliseconds(kPaddingPeriodMs);
-    timestamp += 90 * kPaddingPeriodMs;
-  }
-
-  // Send a regular video packet again.
-  capture_time_ms = fake_clock_.TimeInMilliseconds();
-  packet = BuildRtpPacket(kPayload, kMarkerBit, timestamp, capture_time_ms);
-  packet_size = packet->size();
-
-  EXPECT_CALL(mock_paced_sender_, InsertPacket(RtpPacketSender::kNormalPriority,
-                                               kSsrc, seq_num, _, _, _));
-
-  // Packet should be stored in a send bucket.
-  EXPECT_TRUE(rtp_sender_->SendToNetwork(std::move(packet),
-                                         kAllowRetransmission,
-                                         RtpPacketSender::kNormalPriority));
-
-  rtp_sender_->TimeToSendPacket(kSsrc, seq_num, capture_time_ms, false,
-                                PacedPacketInfo());
-  // Process send bucket.
-  EXPECT_EQ(++total_packets_sent, transport_.packets_sent());
-  EXPECT_EQ(packet_size, transport_.last_sent_packet().size());
-  transport_.last_sent_packet().GetHeader(&rtp_header);
-
-  // Verify sequence number and timestamp.
-  EXPECT_EQ(seq_num, rtp_header.sequenceNumber);
-  EXPECT_EQ(timestamp, rtp_header.timestamp);
-  // Verify transmission time offset. This packet is sent without delay.
-  EXPECT_EQ(0, rtp_header.extension.transmissionTimeOffset);
-  uint64_t expected_send_time =
-      ConvertMsToAbsSendTime(fake_clock_.TimeInMilliseconds());
-  EXPECT_EQ(expected_send_time, rtp_header.extension.absoluteSendTime);
-}
-
-TEST_P(RtpSenderTest, OnSendPacketUpdated) {
-  EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
-                   kRtpExtensionTransportSequenceNumber,
-                   kTransportSequenceNumberExtensionId));
-  rtp_sender_->SetStorePacketsStatus(true, 10);
-
-  EXPECT_CALL(send_packet_observer_,
-              OnSendPacket(kTransportSequenceNumber, _, _))
-      .Times(1);
-  EXPECT_CALL(seq_num_allocator_, AllocateSequenceNumber())
-      .WillOnce(testing::Return(kTransportSequenceNumber));
-  EXPECT_CALL(mock_paced_sender_, InsertPacket(_, kSsrc, kSeqNum, _, _, _))
-      .Times(1);
-
-  SendGenericPayload();  // Packet passed to pacer.
-  const bool kIsRetransmit = false;
-  rtp_sender_->TimeToSendPacket(kSsrc, kSeqNum,
-                                fake_clock_.TimeInMilliseconds(), kIsRetransmit,
-                                PacedPacketInfo());
-  EXPECT_EQ(1, transport_.packets_sent());
-}
-
-TEST_P(RtpSenderTest, OnSendPacketNotUpdatedForRetransmits) {
-  EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
-                   kRtpExtensionTransportSequenceNumber,
-                   kTransportSequenceNumberExtensionId));
-  rtp_sender_->SetStorePacketsStatus(true, 10);
-
-  EXPECT_CALL(send_packet_observer_, OnSendPacket(_, _, _)).Times(0);
-  EXPECT_CALL(seq_num_allocator_, AllocateSequenceNumber())
-      .WillOnce(testing::Return(kTransportSequenceNumber));
-  EXPECT_CALL(mock_paced_sender_, InsertPacket(_, kSsrc, kSeqNum, _, _, _))
-      .Times(1);
-
-  SendGenericPayload();  // Packet passed to pacer.
-  const bool kIsRetransmit = true;
-  rtp_sender_->TimeToSendPacket(kSsrc, kSeqNum,
-                                fake_clock_.TimeInMilliseconds(), kIsRetransmit,
-                                PacedPacketInfo());
-  EXPECT_EQ(1, transport_.packets_sent());
-}
-
-TEST_P(RtpSenderTest, OnSendPacketNotUpdatedWithoutSeqNumAllocator) {
-  rtp_sender_.reset(new RTPSender(
-      false, &fake_clock_, &transport_, &mock_paced_sender_, nullptr,
-      nullptr /* TransportSequenceNumberAllocator */, nullptr, nullptr, nullptr,
-      nullptr, nullptr, &send_packet_observer_, &retransmission_rate_limiter_,
-      nullptr));
-  rtp_sender_->SetSequenceNumber(kSeqNum);
-  rtp_sender_->SetSSRC(kSsrc);
-  EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
-                   kRtpExtensionTransportSequenceNumber,
-                   kTransportSequenceNumberExtensionId));
-  rtp_sender_->SetSequenceNumber(kSeqNum);
-  rtp_sender_->SetStorePacketsStatus(true, 10);
-
-  EXPECT_CALL(send_packet_observer_, OnSendPacket(_, _, _)).Times(0);
-  EXPECT_CALL(mock_paced_sender_, InsertPacket(_, kSsrc, kSeqNum, _, _, _))
-      .Times(1);
-
-  SendGenericPayload();  // Packet passed to pacer.
-  const bool kIsRetransmit = false;
-  rtp_sender_->TimeToSendPacket(kSsrc, kSeqNum,
-                                fake_clock_.TimeInMilliseconds(), kIsRetransmit,
-                                PacedPacketInfo());
-  EXPECT_EQ(1, transport_.packets_sent());
-}
-
-TEST_P(RtpSenderTest, SendRedundantPayloads) {
-  MockTransport transport;
-  rtp_sender_.reset(new RTPSender(
-      false, &fake_clock_, &transport, &mock_paced_sender_, nullptr, nullptr,
-      nullptr, nullptr, nullptr, nullptr, &mock_rtc_event_log_, nullptr,
-      &retransmission_rate_limiter_, nullptr));
-  rtp_sender_->SetSequenceNumber(kSeqNum);
-  rtp_sender_->SetSSRC(kSsrc);
-  rtp_sender_->SetRtxPayloadType(kRtxPayload, kPayload);
-
-  uint16_t seq_num = kSeqNum;
-  rtp_sender_->SetStorePacketsStatus(true, 10);
-  int32_t rtp_header_len = kRtpHeaderSize;
-  EXPECT_EQ(
-      0, rtp_sender_->RegisterRtpHeaderExtension(kRtpExtensionAbsoluteSendTime,
-                                                 kAbsoluteSendTimeExtensionId));
-  rtp_header_len += 4;  // 4 bytes extension.
-  rtp_header_len += 4;  // 4 extra bytes common to all extension headers.
-
-  rtp_sender_->SetRtxStatus(kRtxRetransmitted | kRtxRedundantPayloads);
-  rtp_sender_->SetRtxSsrc(1234);
-
-  const size_t kNumPayloadSizes = 10;
-  const size_t kPayloadSizes[kNumPayloadSizes] = {500, 550, 600, 650, 700,
-                                                  750, 800, 850, 900, 950};
-  // Expect all packets go through the pacer.
-  EXPECT_CALL(mock_paced_sender_,
-              InsertPacket(RtpPacketSender::kNormalPriority, kSsrc, _, _, _, _))
-      .Times(kNumPayloadSizes);
-  EXPECT_CALL(mock_rtc_event_log_,
-              LogRtpHeader(PacketDirection::kOutgoingPacket, _, _, _))
-      .Times(kNumPayloadSizes);
-
-  // Send 10 packets of increasing size.
-  for (size_t i = 0; i < kNumPayloadSizes; ++i) {
-    int64_t capture_time_ms = fake_clock_.TimeInMilliseconds();
-    EXPECT_CALL(transport, SendRtp(_, _, _)).WillOnce(testing::Return(true));
-    SendPacket(capture_time_ms, kPayloadSizes[i]);
-    rtp_sender_->TimeToSendPacket(kSsrc, seq_num++, capture_time_ms, false,
-                                  PacedPacketInfo());
-    fake_clock_.AdvanceTimeMilliseconds(33);
-  }
-
-  EXPECT_CALL(mock_rtc_event_log_,
-              LogRtpHeader(PacketDirection::kOutgoingPacket, _, _, _))
-      .Times(::testing::AtLeast(4));
-
-  // The amount of padding to send it too small to send a payload packet.
-  EXPECT_CALL(transport, SendRtp(_, kMaxPaddingSize + rtp_header_len, _))
-      .WillOnce(testing::Return(true));
-  EXPECT_EQ(kMaxPaddingSize,
-            rtp_sender_->TimeToSendPadding(49, PacedPacketInfo()));
-
-  EXPECT_CALL(transport,
-              SendRtp(_, kPayloadSizes[0] + rtp_header_len + kRtxHeaderSize, _))
-      .WillOnce(testing::Return(true));
-  EXPECT_EQ(kPayloadSizes[0],
-            rtp_sender_->TimeToSendPadding(500, PacedPacketInfo()));
-
-  EXPECT_CALL(transport, SendRtp(_, kPayloadSizes[kNumPayloadSizes - 1] +
-                                        rtp_header_len + kRtxHeaderSize,
-                                 _))
-      .WillOnce(testing::Return(true));
-  EXPECT_CALL(transport, SendRtp(_, kMaxPaddingSize + rtp_header_len, _))
-      .WillOnce(testing::Return(true));
-  EXPECT_EQ(kPayloadSizes[kNumPayloadSizes - 1] + kMaxPaddingSize,
-            rtp_sender_->TimeToSendPadding(999, PacedPacketInfo()));
-}
-
-TEST_P(RtpSenderTestWithoutPacer, SendGenericVideo) {
-  char payload_name[RTP_PAYLOAD_NAME_SIZE] = "GENERIC";
-  const uint8_t payload_type = 127;
-  ASSERT_EQ(0, rtp_sender_->RegisterPayload(payload_name, payload_type, 90000,
-                                            0, 1500));
-  uint8_t payload[] = {47, 11, 32, 93, 89};
-
-  // Send keyframe
-  ASSERT_TRUE(rtp_sender_->SendOutgoingData(
-      kVideoFrameKey, payload_type, 1234, 4321, payload, sizeof(payload),
-      nullptr, nullptr, nullptr, kDefaultExpectedRetransmissionTimeMs));
-
-  auto sent_payload = transport_.last_sent_packet().payload();
-  uint8_t generic_header = sent_payload[0];
-  EXPECT_TRUE(generic_header & RtpFormatVideoGeneric::kKeyFrameBit);
-  EXPECT_TRUE(generic_header & RtpFormatVideoGeneric::kFirstPacketBit);
-  EXPECT_THAT(sent_payload.subview(1), ElementsAreArray(payload));
-
-  // Send delta frame
-  payload[0] = 13;
-  payload[1] = 42;
-  payload[4] = 13;
-
-  ASSERT_TRUE(rtp_sender_->SendOutgoingData(
-      kVideoFrameDelta, payload_type, 1234, 4321, payload, sizeof(payload),
-      nullptr, nullptr, nullptr, kDefaultExpectedRetransmissionTimeMs));
-
-  sent_payload = transport_.last_sent_packet().payload();
-  generic_header = sent_payload[0];
-  EXPECT_FALSE(generic_header & RtpFormatVideoGeneric::kKeyFrameBit);
-  EXPECT_TRUE(generic_header & RtpFormatVideoGeneric::kFirstPacketBit);
-  EXPECT_THAT(sent_payload.subview(1), ElementsAreArray(payload));
-}
-
-TEST_P(RtpSenderTest, SendFlexfecPackets) {
-  constexpr int kMediaPayloadType = 127;
-  constexpr int kFlexfecPayloadType = 118;
-  constexpr uint32_t kMediaSsrc = 1234;
-  constexpr uint32_t kFlexfecSsrc = 5678;
-  const std::vector<RtpExtension> kNoRtpExtensions;
-  const std::vector<RtpExtensionSize> kNoRtpExtensionSizes;
-  FlexfecSender flexfec_sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc,
-                               kNoRtpExtensions, kNoRtpExtensionSizes,
-                               nullptr /* rtp_state */, &fake_clock_);
-
-  // Reset |rtp_sender_| to use FlexFEC.
-  rtp_sender_.reset(new RTPSender(
-      false, &fake_clock_, &transport_, &mock_paced_sender_, &flexfec_sender,
-      &seq_num_allocator_, nullptr, nullptr, nullptr, nullptr,
-      &mock_rtc_event_log_, &send_packet_observer_,
-      &retransmission_rate_limiter_, nullptr));
-  rtp_sender_->SetSSRC(kMediaSsrc);
-  rtp_sender_->SetSequenceNumber(kSeqNum);
-  rtp_sender_->SetSendPayloadType(kMediaPayloadType);
-  rtp_sender_->SetStorePacketsStatus(true, 10);
-
-  // Parameters selected to generate a single FEC packet per media packet.
-  FecProtectionParams params;
-  params.fec_rate = 15;
-  params.max_fec_frames = 1;
-  params.fec_mask_type = kFecMaskRandom;
-  rtp_sender_->SetFecParameters(params, params);
-
-  EXPECT_CALL(mock_paced_sender_,
-              InsertPacket(RtpPacketSender::kLowPriority, kMediaSsrc, kSeqNum,
-                           _, _, false));
-  uint16_t flexfec_seq_num;
-  EXPECT_CALL(mock_paced_sender_, InsertPacket(RtpPacketSender::kLowPriority,
-                                               kFlexfecSsrc, _, _, _, false))
-      .WillOnce(testing::SaveArg<2>(&flexfec_seq_num));
-  SendGenericPayload();
-  EXPECT_CALL(mock_rtc_event_log_,
-              LogRtpHeader(PacketDirection::kOutgoingPacket, _, _, _))
-      .Times(2);
-  EXPECT_TRUE(rtp_sender_->TimeToSendPacket(kMediaSsrc, kSeqNum,
-                                            fake_clock_.TimeInMilliseconds(),
-                                            false, PacedPacketInfo()));
-  EXPECT_TRUE(rtp_sender_->TimeToSendPacket(kFlexfecSsrc, flexfec_seq_num,
-                                            fake_clock_.TimeInMilliseconds(),
-                                            false, PacedPacketInfo()));
-  ASSERT_EQ(2, transport_.packets_sent());
-  const RtpPacketReceived& media_packet = transport_.sent_packets_[0];
-  EXPECT_EQ(kMediaPayloadType, media_packet.PayloadType());
-  EXPECT_EQ(kSeqNum, media_packet.SequenceNumber());
-  EXPECT_EQ(kMediaSsrc, media_packet.Ssrc());
-  const RtpPacketReceived& flexfec_packet = transport_.sent_packets_[1];
-  EXPECT_EQ(kFlexfecPayloadType, flexfec_packet.PayloadType());
-  EXPECT_EQ(flexfec_seq_num, flexfec_packet.SequenceNumber());
-  EXPECT_EQ(kFlexfecSsrc, flexfec_packet.Ssrc());
-}
-
-// TODO(ilnik): because of webrtc:7859. Once FEC moved below pacer, this test
-// should be removed.
-TEST_P(RtpSenderTest, NoFlexfecForTimingFrames) {
-  constexpr int kMediaPayloadType = 127;
-  constexpr int kFlexfecPayloadType = 118;
-  constexpr uint32_t kMediaSsrc = 1234;
-  constexpr uint32_t kFlexfecSsrc = 5678;
-  const std::vector<RtpExtension> kNoRtpExtensions;
-  const std::vector<RtpExtensionSize> kNoRtpExtensionSizes;
-
-  FlexfecSender flexfec_sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc,
-                               kNoRtpExtensions, kNoRtpExtensionSizes,
-                               nullptr /* rtp_state */, &fake_clock_);
-
-  // Reset |rtp_sender_| to use FlexFEC.
-  rtp_sender_.reset(new RTPSender(
-      false, &fake_clock_, &transport_, &mock_paced_sender_, &flexfec_sender,
-      &seq_num_allocator_, nullptr, nullptr, nullptr, nullptr,
-      &mock_rtc_event_log_, &send_packet_observer_,
-      &retransmission_rate_limiter_, nullptr));
-  rtp_sender_->SetSSRC(kMediaSsrc);
-  rtp_sender_->SetSequenceNumber(kSeqNum);
-  rtp_sender_->SetSendPayloadType(kMediaPayloadType);
-  rtp_sender_->SetStorePacketsStatus(true, 10);
-
-  // Need extension to be registered for timing frames to be sent.
-  ASSERT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
-                   kRtpExtensionVideoTiming, kVideoTimingExtensionId));
-
-  // Parameters selected to generate a single FEC packet per media packet.
-  FecProtectionParams params;
-  params.fec_rate = 15;
-  params.max_fec_frames = 1;
-  params.fec_mask_type = kFecMaskRandom;
-  rtp_sender_->SetFecParameters(params, params);
-
-  EXPECT_CALL(mock_paced_sender_,
-              InsertPacket(RtpPacketSender::kLowPriority, kMediaSsrc, kSeqNum,
-                           _, _, false));
-  EXPECT_CALL(mock_paced_sender_, InsertPacket(RtpPacketSender::kLowPriority,
-                                               kFlexfecSsrc, _, _, _, false))
-      .Times(0);  // Not called because packet should not be protected.
-
-  const uint32_t kTimestamp = 1234;
-  const uint8_t kPayloadType = 127;
-  const int64_t kCaptureTimeMs = fake_clock_.TimeInMilliseconds();
-  char payload_name[RTP_PAYLOAD_NAME_SIZE] = "GENERIC";
-  EXPECT_EQ(0, rtp_sender_->RegisterPayload(payload_name, kPayloadType, 90000,
-                                            0, 1500));
-  RTPVideoHeader video_header;
-  memset(&video_header, 0, sizeof(RTPVideoHeader));
-  video_header.video_timing.flags = TimingFrameFlags::kTriggeredByTimer;
-  EXPECT_TRUE(rtp_sender_->SendOutgoingData(
-      kVideoFrameKey, kPayloadType, kTimestamp, kCaptureTimeMs, kPayloadData,
-      sizeof(kPayloadData), nullptr, &video_header, nullptr,
-      kDefaultExpectedRetransmissionTimeMs));
-
-  EXPECT_CALL(mock_rtc_event_log_,
-              LogRtpHeader(PacketDirection::kOutgoingPacket, _, _, _))
-      .Times(1);
-  EXPECT_TRUE(rtp_sender_->TimeToSendPacket(kMediaSsrc, kSeqNum,
-                                            fake_clock_.TimeInMilliseconds(),
-                                            false, PacedPacketInfo()));
-  ASSERT_EQ(1, transport_.packets_sent());
-  const RtpPacketReceived& media_packet = transport_.sent_packets_[0];
-  EXPECT_EQ(kMediaPayloadType, media_packet.PayloadType());
-  EXPECT_EQ(kSeqNum, media_packet.SequenceNumber());
-  EXPECT_EQ(kMediaSsrc, media_packet.Ssrc());
-
-  // Now try to send not a timing frame.
-  uint16_t flexfec_seq_num;
-  EXPECT_CALL(mock_paced_sender_, InsertPacket(RtpPacketSender::kLowPriority,
-                                               kFlexfecSsrc, _, _, _, false))
-      .WillOnce(testing::SaveArg<2>(&flexfec_seq_num));
-  EXPECT_CALL(mock_paced_sender_,
-              InsertPacket(RtpPacketSender::kLowPriority, kMediaSsrc,
-                           kSeqNum + 1, _, _, false));
-  video_header.video_timing.flags = TimingFrameFlags::kInvalid;
-  EXPECT_TRUE(rtp_sender_->SendOutgoingData(
-      kVideoFrameKey, kPayloadType, kTimestamp + 1, kCaptureTimeMs + 1,
-      kPayloadData, sizeof(kPayloadData), nullptr, &video_header, nullptr,
-      kDefaultExpectedRetransmissionTimeMs));
-
-  EXPECT_CALL(mock_rtc_event_log_,
-              LogRtpHeader(PacketDirection::kOutgoingPacket, _, _, _))
-      .Times(2);
-  EXPECT_TRUE(rtp_sender_->TimeToSendPacket(kMediaSsrc, kSeqNum + 1,
-                                            fake_clock_.TimeInMilliseconds(),
-                                            false, PacedPacketInfo()));
-  EXPECT_TRUE(rtp_sender_->TimeToSendPacket(kFlexfecSsrc, flexfec_seq_num,
-                                            fake_clock_.TimeInMilliseconds(),
-                                            false, PacedPacketInfo()));
-  ASSERT_EQ(3, transport_.packets_sent());
-  const RtpPacketReceived& media_packet2 = transport_.sent_packets_[1];
-  EXPECT_EQ(kMediaPayloadType, media_packet2.PayloadType());
-  EXPECT_EQ(kSeqNum + 1, media_packet2.SequenceNumber());
-  EXPECT_EQ(kMediaSsrc, media_packet2.Ssrc());
-  const RtpPacketReceived& flexfec_packet = transport_.sent_packets_[2];
-  EXPECT_EQ(kFlexfecPayloadType, flexfec_packet.PayloadType());
-  EXPECT_EQ(flexfec_seq_num, flexfec_packet.SequenceNumber());
-  EXPECT_EQ(kFlexfecSsrc, flexfec_packet.Ssrc());
-}
-
-TEST_P(RtpSenderTestWithoutPacer, SendFlexfecPackets) {
-  constexpr int kMediaPayloadType = 127;
-  constexpr int kFlexfecPayloadType = 118;
-  constexpr uint32_t kMediaSsrc = 1234;
-  constexpr uint32_t kFlexfecSsrc = 5678;
-  const std::vector<RtpExtension> kNoRtpExtensions;
-  const std::vector<RtpExtensionSize> kNoRtpExtensionSizes;
-  FlexfecSender flexfec_sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc,
-                               kNoRtpExtensions, kNoRtpExtensionSizes,
-                               nullptr /* rtp_state */, &fake_clock_);
-
-  // Reset |rtp_sender_| to use FlexFEC.
-  rtp_sender_.reset(new RTPSender(false, &fake_clock_, &transport_, nullptr,
-                                  &flexfec_sender, &seq_num_allocator_, nullptr,
-                                  nullptr, nullptr, nullptr,
-                                  &mock_rtc_event_log_, &send_packet_observer_,
-                                  &retransmission_rate_limiter_, nullptr));
-  rtp_sender_->SetSSRC(kMediaSsrc);
-  rtp_sender_->SetSequenceNumber(kSeqNum);
-  rtp_sender_->SetSendPayloadType(kMediaPayloadType);
-
-  // Parameters selected to generate a single FEC packet per media packet.
-  FecProtectionParams params;
-  params.fec_rate = 15;
-  params.max_fec_frames = 1;
-  params.fec_mask_type = kFecMaskRandom;
-  rtp_sender_->SetFecParameters(params, params);
-
-  EXPECT_CALL(mock_rtc_event_log_,
-              LogRtpHeader(PacketDirection::kOutgoingPacket, _, _, _))
-      .Times(2);
-  SendGenericPayload();
-  ASSERT_EQ(2, transport_.packets_sent());
-  const RtpPacketReceived& media_packet = transport_.sent_packets_[0];
-  EXPECT_EQ(kMediaPayloadType, media_packet.PayloadType());
-  EXPECT_EQ(kMediaSsrc, media_packet.Ssrc());
-  const RtpPacketReceived& flexfec_packet = transport_.sent_packets_[1];
-  EXPECT_EQ(kFlexfecPayloadType, flexfec_packet.PayloadType());
-  EXPECT_EQ(kFlexfecSsrc, flexfec_packet.Ssrc());
-}
-
-TEST_P(RtpSenderTest, FecOverheadRate) {
-  constexpr int kMediaPayloadType = 127;
-  constexpr int kFlexfecPayloadType = 118;
-  constexpr uint32_t kMediaSsrc = 1234;
-  constexpr uint32_t kFlexfecSsrc = 5678;
-  const std::vector<RtpExtension> kNoRtpExtensions;
-  const std::vector<RtpExtensionSize> kNoRtpExtensionSizes;
-  FlexfecSender flexfec_sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc,
-                               kNoRtpExtensions, kNoRtpExtensionSizes,
-                               nullptr /* rtp_state */, &fake_clock_);
-
-  // Reset |rtp_sender_| to use FlexFEC.
-  rtp_sender_.reset(new RTPSender(
-      false, &fake_clock_, &transport_, &mock_paced_sender_, &flexfec_sender,
-      &seq_num_allocator_, nullptr, nullptr, nullptr, nullptr,
-      &mock_rtc_event_log_, &send_packet_observer_,
-      &retransmission_rate_limiter_, nullptr));
-  rtp_sender_->SetSSRC(kMediaSsrc);
-  rtp_sender_->SetSequenceNumber(kSeqNum);
-  rtp_sender_->SetSendPayloadType(kMediaPayloadType);
-
-  // Parameters selected to generate a single FEC packet per media packet.
-  FecProtectionParams params;
-  params.fec_rate = 15;
-  params.max_fec_frames = 1;
-  params.fec_mask_type = kFecMaskRandom;
-  rtp_sender_->SetFecParameters(params, params);
-
-  constexpr size_t kNumMediaPackets = 10;
-  constexpr size_t kNumFecPackets = kNumMediaPackets;
-  constexpr int64_t kTimeBetweenPacketsMs = 10;
-  EXPECT_CALL(mock_paced_sender_, InsertPacket(_, _, _, _, _, false))
-      .Times(kNumMediaPackets + kNumFecPackets);
-  for (size_t i = 0; i < kNumMediaPackets; ++i) {
-    SendGenericPayload();
-    fake_clock_.AdvanceTimeMilliseconds(kTimeBetweenPacketsMs);
-  }
-  constexpr size_t kRtpHeaderLength = 12;
-  constexpr size_t kFlexfecHeaderLength = 20;
-  constexpr size_t kGenericCodecHeaderLength = 1;
-  constexpr size_t kPayloadLength = sizeof(kPayloadData);
-  constexpr size_t kPacketLength = kRtpHeaderLength + kFlexfecHeaderLength +
-                                   kGenericCodecHeaderLength + kPayloadLength;
-  EXPECT_NEAR(kNumFecPackets * kPacketLength * 8 /
-                  (kNumFecPackets * kTimeBetweenPacketsMs / 1000.0f),
-              rtp_sender_->FecOverheadRate(), 500);
-}
-
-TEST_P(RtpSenderTest, FrameCountCallbacks) {
-  class TestCallback : public FrameCountObserver {
-   public:
-    TestCallback() : FrameCountObserver(), num_calls_(0), ssrc_(0) {}
-    virtual ~TestCallback() {}
-
-    void FrameCountUpdated(const FrameCounts& frame_counts,
-                           uint32_t ssrc) override {
-      ++num_calls_;
-      ssrc_ = ssrc;
-      frame_counts_ = frame_counts;
-    }
-
-    uint32_t num_calls_;
-    uint32_t ssrc_;
-    FrameCounts frame_counts_;
-  } callback;
-
-  rtp_sender_.reset(
-      new RTPSender(false, &fake_clock_, &transport_, &mock_paced_sender_,
-                    nullptr, nullptr, nullptr, nullptr, &callback, nullptr,
-                    nullptr, nullptr, &retransmission_rate_limiter_, nullptr));
-  rtp_sender_->SetSSRC(kSsrc);
-  char payload_name[RTP_PAYLOAD_NAME_SIZE] = "GENERIC";
-  const uint8_t payload_type = 127;
-  ASSERT_EQ(0, rtp_sender_->RegisterPayload(payload_name, payload_type, 90000,
-                                            0, 1500));
-  uint8_t payload[] = {47, 11, 32, 93, 89};
-  rtp_sender_->SetStorePacketsStatus(true, 1);
-  uint32_t ssrc = rtp_sender_->SSRC();
-
-  EXPECT_CALL(mock_paced_sender_, InsertPacket(_, _, _, _, _, _))
-      .Times(::testing::AtLeast(2));
-
-  ASSERT_TRUE(rtp_sender_->SendOutgoingData(
-      kVideoFrameKey, payload_type, 1234, 4321, payload, sizeof(payload),
-      nullptr, nullptr, nullptr, kDefaultExpectedRetransmissionTimeMs));
-
-  EXPECT_EQ(1U, callback.num_calls_);
-  EXPECT_EQ(ssrc, callback.ssrc_);
-  EXPECT_EQ(1, callback.frame_counts_.key_frames);
-  EXPECT_EQ(0, callback.frame_counts_.delta_frames);
-
-  ASSERT_TRUE(rtp_sender_->SendOutgoingData(
-      kVideoFrameDelta, payload_type, 1234, 4321, payload, sizeof(payload),
-      nullptr, nullptr, nullptr, kDefaultExpectedRetransmissionTimeMs));
-
-  EXPECT_EQ(2U, callback.num_calls_);
-  EXPECT_EQ(ssrc, callback.ssrc_);
-  EXPECT_EQ(1, callback.frame_counts_.key_frames);
-  EXPECT_EQ(1, callback.frame_counts_.delta_frames);
-
-  rtp_sender_.reset();
-}
-
-TEST_P(RtpSenderTest, BitrateCallbacks) {
-  class TestCallback : public BitrateStatisticsObserver {
-   public:
-    TestCallback()
-        : BitrateStatisticsObserver(),
-          num_calls_(0),
-          ssrc_(0),
-          total_bitrate_(0),
-          retransmit_bitrate_(0) {}
-    virtual ~TestCallback() {}
-
-    void Notify(uint32_t total_bitrate,
-                uint32_t retransmit_bitrate,
-                uint32_t ssrc) override {
-      ++num_calls_;
-      ssrc_ = ssrc;
-      total_bitrate_ = total_bitrate;
-      retransmit_bitrate_ = retransmit_bitrate;
-    }
-
-    uint32_t num_calls_;
-    uint32_t ssrc_;
-    uint32_t total_bitrate_;
-    uint32_t retransmit_bitrate_;
-  } callback;
-  rtp_sender_.reset(new RTPSender(false, &fake_clock_, &transport_, nullptr,
-                                  nullptr, nullptr, nullptr, &callback, nullptr,
-                                  nullptr, nullptr, nullptr,
-                                  &retransmission_rate_limiter_, nullptr));
-  rtp_sender_->SetSSRC(kSsrc);
-
-  // Simulate kNumPackets sent with kPacketInterval ms intervals, with the
-  // number of packets selected so that we fill (but don't overflow) the one
-  // second averaging window.
-  const uint32_t kWindowSizeMs = 1000;
-  const uint32_t kPacketInterval = 20;
-  const uint32_t kNumPackets =
-      (kWindowSizeMs - kPacketInterval) / kPacketInterval;
-  // Overhead = 12 bytes RTP header + 1 byte generic header.
-  const uint32_t kPacketOverhead = 13;
-
-  char payload_name[RTP_PAYLOAD_NAME_SIZE] = "GENERIC";
-  const uint8_t payload_type = 127;
-  ASSERT_EQ(0, rtp_sender_->RegisterPayload(payload_name, payload_type, 90000,
-                                            0, 1500));
-  uint8_t payload[] = {47, 11, 32, 93, 89};
-  rtp_sender_->SetStorePacketsStatus(true, 1);
-  uint32_t ssrc = rtp_sender_->SSRC();
-
-  // Initial process call so we get a new time window.
-  rtp_sender_->ProcessBitrate();
-
-  // Send a few frames.
-  for (uint32_t i = 0; i < kNumPackets; ++i) {
-    ASSERT_TRUE(rtp_sender_->SendOutgoingData(
-        kVideoFrameKey, payload_type, 1234, 4321, payload, sizeof(payload),
-        nullptr, nullptr, nullptr, kDefaultExpectedRetransmissionTimeMs));
-    fake_clock_.AdvanceTimeMilliseconds(kPacketInterval);
-  }
-
-  rtp_sender_->ProcessBitrate();
-
-  // We get one call for every stats updated, thus two calls since both the
-  // stream stats and the retransmit stats are updated once.
-  EXPECT_EQ(2u, callback.num_calls_);
-  EXPECT_EQ(ssrc, callback.ssrc_);
-  const uint32_t kTotalPacketSize = kPacketOverhead + sizeof(payload);
-  // Bitrate measured over delta between last and first timestamp, plus one.
-  const uint32_t kExpectedWindowMs = kNumPackets * kPacketInterval + 1;
-  const uint32_t kExpectedBitsAccumulated = kTotalPacketSize * kNumPackets * 8;
-  const uint32_t kExpectedRateBps =
-      (kExpectedBitsAccumulated * 1000 + (kExpectedWindowMs / 2)) /
-      kExpectedWindowMs;
-  EXPECT_EQ(kExpectedRateBps, callback.total_bitrate_);
-
-  rtp_sender_.reset();
-}
-
-class RtpSenderAudioTest : public RtpSenderTest {
- protected:
-  RtpSenderAudioTest() {}
-
-  void SetUp() override {
-    payload_ = kAudioPayload;
-    rtp_sender_.reset(new RTPSender(true, &fake_clock_, &transport_, nullptr,
-                                    nullptr, nullptr, nullptr, nullptr, nullptr,
-                                    nullptr, nullptr, nullptr,
-                                    &retransmission_rate_limiter_, nullptr));
-    rtp_sender_->SetSSRC(kSsrc);
-    rtp_sender_->SetSequenceNumber(kSeqNum);
-  }
-};
-
-TEST_P(RtpSenderTestWithoutPacer, StreamDataCountersCallbacks) {
-  class TestCallback : public StreamDataCountersCallback {
-   public:
-    TestCallback() : StreamDataCountersCallback(), ssrc_(0), counters_() {}
-    virtual ~TestCallback() {}
-
-    void DataCountersUpdated(const StreamDataCounters& counters,
-                             uint32_t ssrc) override {
-      ssrc_ = ssrc;
-      counters_ = counters;
-    }
-
-    uint32_t ssrc_;
-    StreamDataCounters counters_;
-
-    void MatchPacketCounter(const RtpPacketCounter& expected,
-                            const RtpPacketCounter& actual) {
-      EXPECT_EQ(expected.payload_bytes, actual.payload_bytes);
-      EXPECT_EQ(expected.header_bytes, actual.header_bytes);
-      EXPECT_EQ(expected.padding_bytes, actual.padding_bytes);
-      EXPECT_EQ(expected.packets, actual.packets);
-    }
-
-    void Matches(uint32_t ssrc, const StreamDataCounters& counters) {
-      EXPECT_EQ(ssrc, ssrc_);
-      MatchPacketCounter(counters.transmitted, counters_.transmitted);
-      MatchPacketCounter(counters.retransmitted, counters_.retransmitted);
-      EXPECT_EQ(counters.fec.packets, counters_.fec.packets);
-    }
-  } callback;
-
-  const uint8_t kRedPayloadType = 96;
-  const uint8_t kUlpfecPayloadType = 97;
-  char payload_name[RTP_PAYLOAD_NAME_SIZE] = "GENERIC";
-  const uint8_t payload_type = 127;
-  ASSERT_EQ(0, rtp_sender_->RegisterPayload(payload_name, payload_type, 90000,
-                                            0, 1500));
-  uint8_t payload[] = {47, 11, 32, 93, 89};
-  rtp_sender_->SetStorePacketsStatus(true, 1);
-  uint32_t ssrc = rtp_sender_->SSRC();
-
-  rtp_sender_->RegisterRtpStatisticsCallback(&callback);
-
-  // Send a frame.
-  ASSERT_TRUE(rtp_sender_->SendOutgoingData(
-      kVideoFrameKey, payload_type, 1234, 4321, payload, sizeof(payload),
-      nullptr, nullptr, nullptr, kDefaultExpectedRetransmissionTimeMs));
-  StreamDataCounters expected;
-  expected.transmitted.payload_bytes = 6;
-  expected.transmitted.header_bytes = 12;
-  expected.transmitted.padding_bytes = 0;
-  expected.transmitted.packets = 1;
-  expected.retransmitted.payload_bytes = 0;
-  expected.retransmitted.header_bytes = 0;
-  expected.retransmitted.padding_bytes = 0;
-  expected.retransmitted.packets = 0;
-  expected.fec.packets = 0;
-  callback.Matches(ssrc, expected);
-
-  // Retransmit a frame.
-  uint16_t seqno = rtp_sender_->SequenceNumber() - 1;
-  rtp_sender_->ReSendPacket(seqno, 0);
-  expected.transmitted.payload_bytes = 12;
-  expected.transmitted.header_bytes = 24;
-  expected.transmitted.packets = 2;
-  expected.retransmitted.payload_bytes = 6;
-  expected.retransmitted.header_bytes = 12;
-  expected.retransmitted.padding_bytes = 0;
-  expected.retransmitted.packets = 1;
-  callback.Matches(ssrc, expected);
-
-  // Send padding.
-  rtp_sender_->TimeToSendPadding(kMaxPaddingSize, PacedPacketInfo());
-  expected.transmitted.payload_bytes = 12;
-  expected.transmitted.header_bytes = 36;
-  expected.transmitted.padding_bytes = kMaxPaddingSize;
-  expected.transmitted.packets = 3;
-  callback.Matches(ssrc, expected);
-
-  // Send ULPFEC.
-  rtp_sender_->SetUlpfecConfig(kRedPayloadType, kUlpfecPayloadType);
-  FecProtectionParams fec_params;
-  fec_params.fec_mask_type = kFecMaskRandom;
-  fec_params.fec_rate = 1;
-  fec_params.max_fec_frames = 1;
-  rtp_sender_->SetFecParameters(fec_params, fec_params);
-  ASSERT_TRUE(rtp_sender_->SendOutgoingData(
-      kVideoFrameDelta, payload_type, 1234, 4321, payload, sizeof(payload),
-      nullptr, nullptr, nullptr, kDefaultExpectedRetransmissionTimeMs));
-  expected.transmitted.payload_bytes = 40;
-  expected.transmitted.header_bytes = 60;
-  expected.transmitted.packets = 5;
-  expected.fec.packets = 1;
-  callback.Matches(ssrc, expected);
-
-  rtp_sender_->RegisterRtpStatisticsCallback(nullptr);
-}
-
-TEST_P(RtpSenderAudioTest, SendAudio) {
-  char payload_name[RTP_PAYLOAD_NAME_SIZE] = "PAYLOAD_NAME";
-  const uint8_t payload_type = 127;
-  ASSERT_EQ(0, rtp_sender_->RegisterPayload(payload_name, payload_type, 48000,
-                                            0, 1500));
-  uint8_t payload[] = {47, 11, 32, 93, 89};
-
-  ASSERT_TRUE(rtp_sender_->SendOutgoingData(
-      kAudioFrameCN, payload_type, 1234, 4321, payload, sizeof(payload),
-      nullptr, nullptr, nullptr, kDefaultExpectedRetransmissionTimeMs));
-
-  auto sent_payload = transport_.last_sent_packet().payload();
-  EXPECT_THAT(sent_payload, ElementsAreArray(payload));
-}
-
-TEST_P(RtpSenderAudioTest, SendAudioWithAudioLevelExtension) {
-  EXPECT_EQ(0, rtp_sender_->SetAudioLevel(kAudioLevel));
-  EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(kRtpExtensionAudioLevel,
-                                                       kAudioLevelExtensionId));
-
-  char payload_name[RTP_PAYLOAD_NAME_SIZE] = "PAYLOAD_NAME";
-  const uint8_t payload_type = 127;
-  ASSERT_EQ(0, rtp_sender_->RegisterPayload(payload_name, payload_type, 48000,
-                                            0, 1500));
-  uint8_t payload[] = {47, 11, 32, 93, 89};
-
-  ASSERT_TRUE(rtp_sender_->SendOutgoingData(
-      kAudioFrameCN, payload_type, 1234, 4321, payload, sizeof(payload),
-      nullptr, nullptr, nullptr, kDefaultExpectedRetransmissionTimeMs));
-
-  auto sent_payload = transport_.last_sent_packet().payload();
-  EXPECT_THAT(sent_payload, ElementsAreArray(payload));
-  // Verify AudioLevel extension.
-  bool voice_activity;
-  uint8_t audio_level;
-  EXPECT_TRUE(transport_.last_sent_packet().GetExtension<AudioLevel>(
-      &voice_activity, &audio_level));
-  EXPECT_EQ(kAudioLevel, audio_level);
-  EXPECT_FALSE(voice_activity);
-}
-
-// As RFC4733, named telephone events are carried as part of the audio stream
-// and must use the same sequence number and timestamp base as the regular
-// audio channel.
-// This test checks the marker bit for the first packet and the consequent
-// packets of the same telephone event. Since it is specifically for DTMF
-// events, ignoring audio packets and sending kEmptyFrame instead of those.
-TEST_P(RtpSenderAudioTest, CheckMarkerBitForTelephoneEvents) {
-  const char* kDtmfPayloadName = "telephone-event";
-  const uint32_t kPayloadFrequency = 8000;
-  const uint8_t kPayloadType = 126;
-  ASSERT_EQ(0, rtp_sender_->RegisterPayload(kDtmfPayloadName, kPayloadType,
-                                            kPayloadFrequency, 0, 0));
-  // For Telephone events, payload is not added to the registered payload list,
-  // it will register only the payload used for audio stream.
-  // Registering the payload again for audio stream with different payload name.
-  const char* kPayloadName = "payload_name";
-  ASSERT_EQ(0, rtp_sender_->RegisterPayload(kPayloadName, kPayloadType,
-                                            kPayloadFrequency, 1, 0));
-  int64_t capture_time_ms = fake_clock_.TimeInMilliseconds();
-  // DTMF event key=9, duration=500 and attenuationdB=10
-  rtp_sender_->SendTelephoneEvent(9, 500, 10);
-  // During start, it takes the starting timestamp as last sent timestamp.
-  // The duration is calculated as the difference of current and last sent
-  // timestamp. So for first call it will skip since the duration is zero.
-  ASSERT_TRUE(rtp_sender_->SendOutgoingData(
-      kEmptyFrame, kPayloadType, capture_time_ms, 0, nullptr, 0, nullptr,
-      nullptr, nullptr, kDefaultExpectedRetransmissionTimeMs));
-  // DTMF Sample Length is (Frequency/1000) * Duration.
-  // So in this case, it is (8000/1000) * 500 = 4000.
-  // Sending it as two packets.
-  ASSERT_TRUE(rtp_sender_->SendOutgoingData(
-      kEmptyFrame, kPayloadType, capture_time_ms + 2000, 0, nullptr, 0, nullptr,
-      nullptr, nullptr, kDefaultExpectedRetransmissionTimeMs));
-
-  // Marker Bit should be set to 1 for first packet.
-  EXPECT_TRUE(transport_.last_sent_packet().Marker());
-
-  ASSERT_TRUE(rtp_sender_->SendOutgoingData(
-      kEmptyFrame, kPayloadType, capture_time_ms + 4000, 0, nullptr, 0, nullptr,
-      nullptr, nullptr, kDefaultExpectedRetransmissionTimeMs));
-  // Marker Bit should be set to 0 for rest of the packets.
-  EXPECT_FALSE(transport_.last_sent_packet().Marker());
-}
-
-TEST_P(RtpSenderTestWithoutPacer, BytesReportedCorrectly) {
-  const char* kPayloadName = "GENERIC";
-  const uint8_t kPayloadType = 127;
-  rtp_sender_->SetSSRC(1234);
-  rtp_sender_->SetRtxSsrc(4321);
-  rtp_sender_->SetRtxPayloadType(kPayloadType - 1, kPayloadType);
-  rtp_sender_->SetRtxStatus(kRtxRetransmitted | kRtxRedundantPayloads);
-
-  ASSERT_EQ(0, rtp_sender_->RegisterPayload(kPayloadName, kPayloadType, 90000,
-                                            0, 1500));
-  uint8_t payload[] = {47, 11, 32, 93, 89};
-
-  ASSERT_TRUE(rtp_sender_->SendOutgoingData(
-      kVideoFrameKey, kPayloadType, 1234, 4321, payload, sizeof(payload),
-      nullptr, nullptr, nullptr, kDefaultExpectedRetransmissionTimeMs));
-
-  // Will send 2 full-size padding packets.
-  rtp_sender_->TimeToSendPadding(1, PacedPacketInfo());
-  rtp_sender_->TimeToSendPadding(1, PacedPacketInfo());
-
-  StreamDataCounters rtp_stats;
-  StreamDataCounters rtx_stats;
-  rtp_sender_->GetDataCounters(&rtp_stats, &rtx_stats);
-
-  // Payload + 1-byte generic header.
-  EXPECT_GT(rtp_stats.first_packet_time_ms, -1);
-  EXPECT_EQ(rtp_stats.transmitted.payload_bytes, sizeof(payload) + 1);
-  EXPECT_EQ(rtp_stats.transmitted.header_bytes, 12u);
-  EXPECT_EQ(rtp_stats.transmitted.padding_bytes, 0u);
-  EXPECT_EQ(rtx_stats.transmitted.payload_bytes, 0u);
-  EXPECT_EQ(rtx_stats.transmitted.header_bytes, 24u);
-  EXPECT_EQ(rtx_stats.transmitted.padding_bytes, 2 * kMaxPaddingSize);
-
-  EXPECT_EQ(rtp_stats.transmitted.TotalBytes(),
-            rtp_stats.transmitted.payload_bytes +
-                rtp_stats.transmitted.header_bytes +
-                rtp_stats.transmitted.padding_bytes);
-  EXPECT_EQ(rtx_stats.transmitted.TotalBytes(),
-            rtx_stats.transmitted.payload_bytes +
-                rtx_stats.transmitted.header_bytes +
-                rtx_stats.transmitted.padding_bytes);
-
-  EXPECT_EQ(
-      transport_.total_bytes_sent_,
-      rtp_stats.transmitted.TotalBytes() + rtx_stats.transmitted.TotalBytes());
-}
-
-TEST_P(RtpSenderTestWithoutPacer, RespectsNackBitrateLimit) {
-  const int32_t kPacketSize = 1400;
-  const int32_t kNumPackets = 30;
-
-  retransmission_rate_limiter_.SetMaxRate(kPacketSize * kNumPackets * 8);
-
-  rtp_sender_->SetStorePacketsStatus(true, kNumPackets);
-  const uint16_t kStartSequenceNumber = rtp_sender_->SequenceNumber();
-  std::vector<uint16_t> sequence_numbers;
-  for (int32_t i = 0; i < kNumPackets; ++i) {
-    sequence_numbers.push_back(kStartSequenceNumber + i);
-    fake_clock_.AdvanceTimeMilliseconds(1);
-    SendPacket(fake_clock_.TimeInMilliseconds(), kPacketSize);
-  }
-  EXPECT_EQ(kNumPackets, transport_.packets_sent());
-
-  fake_clock_.AdvanceTimeMilliseconds(1000 - kNumPackets);
-
-  // Resending should work - brings the bandwidth up to the limit.
-  // NACK bitrate is capped to the same bitrate as the encoder, since the max
-  // protection overhead is 50% (see MediaOptimization::SetTargetRates).
-  rtp_sender_->OnReceivedNack(sequence_numbers, 0);
-  EXPECT_EQ(kNumPackets * 2, transport_.packets_sent());
-
-  // Must be at least 5ms in between retransmission attempts.
-  fake_clock_.AdvanceTimeMilliseconds(5);
-
-  // Resending should not work, bandwidth exceeded.
-  rtp_sender_->OnReceivedNack(sequence_numbers, 0);
-  EXPECT_EQ(kNumPackets * 2, transport_.packets_sent());
-}
-
-TEST_P(RtpSenderVideoTest, KeyFrameHasCVO) {
-  uint8_t kFrame[kMaxPacketLength];
-  EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
-                   kRtpExtensionVideoRotation, kVideoRotationExtensionId));
-
-  RTPVideoHeader hdr = {0};
-  hdr.rotation = kVideoRotation_0;
-  rtp_sender_video_->SendVideo(kRtpVideoGeneric, kVideoFrameKey, kPayload,
-                               kTimestamp, 0, kFrame, sizeof(kFrame), nullptr,
-                               &hdr, kDefaultExpectedRetransmissionTimeMs);
-
-  VideoRotation rotation;
-  EXPECT_TRUE(
-      transport_.last_sent_packet().GetExtension<VideoOrientation>(&rotation));
-  EXPECT_EQ(kVideoRotation_0, rotation);
-}
-
-TEST_P(RtpSenderVideoTest, TimingFrameHasPacketizationTimstampSet) {
-  uint8_t kFrame[kMaxPacketLength];
-  const int64_t kPacketizationTimeMs = 100;
-  const int64_t kEncodeStartDeltaMs = 10;
-  const int64_t kEncodeFinishDeltaMs = 50;
-  EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
-                   kRtpExtensionVideoTiming, kVideoTimingExtensionId));
-
-  const int64_t kCaptureTimestamp = fake_clock_.TimeInMilliseconds();
-
-  RTPVideoHeader hdr = {0};
-  hdr.video_timing.flags = TimingFrameFlags::kTriggeredByTimer;
-  hdr.video_timing.encode_start_delta_ms = kEncodeStartDeltaMs;
-  hdr.video_timing.encode_finish_delta_ms = kEncodeFinishDeltaMs;
-
-  fake_clock_.AdvanceTimeMilliseconds(kPacketizationTimeMs);
-  rtp_sender_video_->SendVideo(kRtpVideoGeneric, kVideoFrameKey, kPayload,
-                               kTimestamp, kCaptureTimestamp, kFrame,
-                               sizeof(kFrame), nullptr, &hdr,
-                               kDefaultExpectedRetransmissionTimeMs);
-  VideoSendTiming timing;
-  EXPECT_TRUE(transport_.last_sent_packet().GetExtension<VideoTimingExtension>(
-      &timing));
-  EXPECT_EQ(kPacketizationTimeMs, timing.packetization_finish_delta_ms);
-  EXPECT_EQ(kEncodeStartDeltaMs, timing.encode_start_delta_ms);
-  EXPECT_EQ(kEncodeFinishDeltaMs, timing.encode_finish_delta_ms);
-}
-
-TEST_P(RtpSenderVideoTest, DeltaFrameHasCVOWhenChanged) {
-  uint8_t kFrame[kMaxPacketLength];
-  EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
-                   kRtpExtensionVideoRotation, kVideoRotationExtensionId));
-
-  RTPVideoHeader hdr = {0};
-  hdr.rotation = kVideoRotation_90;
-  EXPECT_TRUE(rtp_sender_video_->SendVideo(
-      kRtpVideoGeneric, kVideoFrameKey, kPayload, kTimestamp, 0, kFrame,
-      sizeof(kFrame), nullptr, &hdr, kDefaultExpectedRetransmissionTimeMs));
-
-  hdr.rotation = kVideoRotation_0;
-  EXPECT_TRUE(rtp_sender_video_->SendVideo(
-      kRtpVideoGeneric, kVideoFrameDelta, kPayload, kTimestamp + 1, 0, kFrame,
-      sizeof(kFrame), nullptr, &hdr, kDefaultExpectedRetransmissionTimeMs));
-
-  VideoRotation rotation;
-  EXPECT_TRUE(
-      transport_.last_sent_packet().GetExtension<VideoOrientation>(&rotation));
-  EXPECT_EQ(kVideoRotation_0, rotation);
-}
-
-TEST_P(RtpSenderVideoTest, DeltaFrameHasCVOWhenNonZero) {
-  uint8_t kFrame[kMaxPacketLength];
-  EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(
-                   kRtpExtensionVideoRotation, kVideoRotationExtensionId));
-
-  RTPVideoHeader hdr = {0};
-  hdr.rotation = kVideoRotation_90;
-  EXPECT_TRUE(rtp_sender_video_->SendVideo(
-      kRtpVideoGeneric, kVideoFrameKey, kPayload, kTimestamp, 0, kFrame,
-      sizeof(kFrame), nullptr, &hdr, kDefaultExpectedRetransmissionTimeMs));
-
-  EXPECT_TRUE(rtp_sender_video_->SendVideo(
-      kRtpVideoGeneric, kVideoFrameDelta, kPayload, kTimestamp + 1, 0, kFrame,
-      sizeof(kFrame), nullptr, &hdr, kDefaultExpectedRetransmissionTimeMs));
-
-  VideoRotation rotation;
-  EXPECT_TRUE(
-      transport_.last_sent_packet().GetExtension<VideoOrientation>(&rotation));
-  EXPECT_EQ(kVideoRotation_90, rotation);
-}
-
-// Make sure rotation is parsed correctly when the Camera (C) and Flip (F) bits
-// are set in the CVO byte.
-TEST_P(RtpSenderVideoTest, SendVideoWithCameraAndFlipCVO) {
-  // Test extracting rotation when Camera (C) and Flip (F) bits are zero.
-  EXPECT_EQ(kVideoRotation_0, ConvertCVOByteToVideoRotation(0));
-  EXPECT_EQ(kVideoRotation_90, ConvertCVOByteToVideoRotation(1));
-  EXPECT_EQ(kVideoRotation_180, ConvertCVOByteToVideoRotation(2));
-  EXPECT_EQ(kVideoRotation_270, ConvertCVOByteToVideoRotation(3));
-  // Test extracting rotation when Camera (C) and Flip (F) bits are set.
-  const int flip_bit = 1 << 2;
-  const int camera_bit = 1 << 3;
-  EXPECT_EQ(kVideoRotation_0,
-            ConvertCVOByteToVideoRotation(flip_bit | camera_bit | 0));
-  EXPECT_EQ(kVideoRotation_90,
-            ConvertCVOByteToVideoRotation(flip_bit | camera_bit | 1));
-  EXPECT_EQ(kVideoRotation_180,
-            ConvertCVOByteToVideoRotation(flip_bit | camera_bit | 2));
-  EXPECT_EQ(kVideoRotation_270,
-            ConvertCVOByteToVideoRotation(flip_bit | camera_bit | 3));
-}
-
-TEST_P(RtpSenderVideoTest, RetransmissionTypesGeneric) {
-  RTPVideoHeader header;
-  header.codec = kRtpVideoGeneric;
-
-  EXPECT_EQ(kDontRetransmit,
-            rtp_sender_video_->GetStorageType(
-                header, kRetransmitOff, kDefaultExpectedRetransmissionTimeMs));
-  EXPECT_EQ(kAllowRetransmission, rtp_sender_video_->GetStorageType(
-                                      header, kRetransmitBaseLayer,
-                                      kDefaultExpectedRetransmissionTimeMs));
-  EXPECT_EQ(kAllowRetransmission, rtp_sender_video_->GetStorageType(
-                                      header, kRetransmitHigherLayers,
-                                      kDefaultExpectedRetransmissionTimeMs));
-  EXPECT_EQ(kAllowRetransmission,
-            rtp_sender_video_->GetStorageType(
-                header, kConditionallyRetransmitHigherLayers,
-                kDefaultExpectedRetransmissionTimeMs));
-  EXPECT_EQ(kAllowRetransmission, rtp_sender_video_->GetStorageType(
-                                      header, kRetransmitAllPackets,
-                                      kDefaultExpectedRetransmissionTimeMs));
-}
-
-TEST_P(RtpSenderVideoTest, RetransmissionTypesH264) {
-  RTPVideoHeader header;
-  header.codec = kRtpVideoH264;
-  header.codecHeader.H264.packetization_mode =
-      H264PacketizationMode::NonInterleaved;
-
-  EXPECT_EQ(kDontRetransmit,
-            rtp_sender_video_->GetStorageType(
-                header, kRetransmitOff, kDefaultExpectedRetransmissionTimeMs));
-  EXPECT_EQ(kAllowRetransmission, rtp_sender_video_->GetStorageType(
-                                      header, kRetransmitBaseLayer,
-                                      kDefaultExpectedRetransmissionTimeMs));
-  EXPECT_EQ(kAllowRetransmission, rtp_sender_video_->GetStorageType(
-                                      header, kRetransmitHigherLayers,
-                                      kDefaultExpectedRetransmissionTimeMs));
-  EXPECT_EQ(kAllowRetransmission,
-            rtp_sender_video_->GetStorageType(
-                header, kConditionallyRetransmitHigherLayers,
-                kDefaultExpectedRetransmissionTimeMs));
-  EXPECT_EQ(kAllowRetransmission, rtp_sender_video_->GetStorageType(
-                                      header, kRetransmitAllPackets,
-                                      kDefaultExpectedRetransmissionTimeMs));
-}
-
-TEST_P(RtpSenderVideoTest, RetransmissionTypesVP8BaseLayer) {
-  RTPVideoHeader header;
-  header.codec = kRtpVideoVp8;
-  header.codecHeader.VP8.temporalIdx = 0;
-
-  EXPECT_EQ(kDontRetransmit,
-            rtp_sender_video_->GetStorageType(
-                header, kRetransmitOff, kDefaultExpectedRetransmissionTimeMs));
-  EXPECT_EQ(kAllowRetransmission, rtp_sender_video_->GetStorageType(
-                                      header, kRetransmitBaseLayer,
-                                      kDefaultExpectedRetransmissionTimeMs));
-  EXPECT_EQ(kDontRetransmit, rtp_sender_video_->GetStorageType(
-                                 header, kRetransmitHigherLayers,
-                                 kDefaultExpectedRetransmissionTimeMs));
-  EXPECT_EQ(kAllowRetransmission,
-            rtp_sender_video_->GetStorageType(
-                header, kRetransmitHigherLayers | kRetransmitBaseLayer,
-                kDefaultExpectedRetransmissionTimeMs));
-  EXPECT_EQ(kDontRetransmit, rtp_sender_video_->GetStorageType(
-                                 header, kConditionallyRetransmitHigherLayers,
-                                 kDefaultExpectedRetransmissionTimeMs));
-  EXPECT_EQ(
-      kAllowRetransmission,
-      rtp_sender_video_->GetStorageType(
-          header, kRetransmitBaseLayer | kConditionallyRetransmitHigherLayers,
-          kDefaultExpectedRetransmissionTimeMs));
-  EXPECT_EQ(kAllowRetransmission, rtp_sender_video_->GetStorageType(
-                                      header, kRetransmitAllPackets,
-                                      kDefaultExpectedRetransmissionTimeMs));
-}
-
-TEST_P(RtpSenderVideoTest, RetransmissionTypesVP8HigherLayers) {
-  RTPVideoHeader header;
-  header.codec = kRtpVideoVp8;
-
-  for (int tid = 1; tid <= kMaxTemporalStreams; ++tid) {
-    header.codecHeader.VP8.temporalIdx = tid;
-
-    EXPECT_EQ(kDontRetransmit, rtp_sender_video_->GetStorageType(
-                                   header, kRetransmitOff,
-                                   kDefaultExpectedRetransmissionTimeMs));
-    EXPECT_EQ(kDontRetransmit, rtp_sender_video_->GetStorageType(
-                                   header, kRetransmitBaseLayer,
-                                   kDefaultExpectedRetransmissionTimeMs));
-    EXPECT_EQ(kAllowRetransmission, rtp_sender_video_->GetStorageType(
-                                        header, kRetransmitHigherLayers,
-                                        kDefaultExpectedRetransmissionTimeMs));
-    EXPECT_EQ(kAllowRetransmission,
-              rtp_sender_video_->GetStorageType(
-                  header, kRetransmitHigherLayers | kRetransmitBaseLayer,
-                  kDefaultExpectedRetransmissionTimeMs));
-    EXPECT_EQ(kAllowRetransmission, rtp_sender_video_->GetStorageType(
-                                        header, kRetransmitAllPackets,
-                                        kDefaultExpectedRetransmissionTimeMs));
-  }
-}
-
-TEST_P(RtpSenderVideoTest, RetransmissionTypesVP9) {
-  RTPVideoHeader header;
-  header.codec = kRtpVideoVp9;
-
-  for (int tid = 1; tid <= kMaxTemporalStreams; ++tid) {
-    header.codecHeader.VP9.temporal_idx = tid;
-
-    EXPECT_EQ(kDontRetransmit, rtp_sender_video_->GetStorageType(
-                                   header, kRetransmitOff,
-                                   kDefaultExpectedRetransmissionTimeMs));
-    EXPECT_EQ(kDontRetransmit, rtp_sender_video_->GetStorageType(
-                                   header, kRetransmitBaseLayer,
-                                   kDefaultExpectedRetransmissionTimeMs));
-    EXPECT_EQ(kAllowRetransmission, rtp_sender_video_->GetStorageType(
-                                        header, kRetransmitHigherLayers,
-                                        kDefaultExpectedRetransmissionTimeMs));
-    EXPECT_EQ(kAllowRetransmission,
-              rtp_sender_video_->GetStorageType(
-                  header, kRetransmitHigherLayers | kRetransmitBaseLayer,
-                  kDefaultExpectedRetransmissionTimeMs));
-    EXPECT_EQ(kAllowRetransmission, rtp_sender_video_->GetStorageType(
-                                        header, kRetransmitAllPackets,
-                                        kDefaultExpectedRetransmissionTimeMs));
-  }
-}
-
-TEST_P(RtpSenderVideoTest, ConditionalRetransmit) {
-  const int64_t kFrameIntervalMs = 33;
-  const int64_t kRttMs = (kFrameIntervalMs * 3) / 2;
-  const uint8_t kSettings =
-      kRetransmitBaseLayer | kConditionallyRetransmitHigherLayers;
-
-  // Insert VP8 frames for all temporal layers, but stop before the final index.
-  RTPVideoHeader header;
-  header.codec = kRtpVideoVp8;
-
-  // Fill averaging window to prevent rounding errors.
-  constexpr int kNumRepetitions =
-      (RTPSenderVideo::kTLRateWindowSizeMs + (kFrameIntervalMs / 2)) /
-      kFrameIntervalMs;
-  constexpr int kPattern[] = {0, 2, 1, 2};
-  for (size_t i = 0; i < arraysize(kPattern) * kNumRepetitions; ++i) {
-    header.codecHeader.VP8.temporalIdx = kPattern[i % arraysize(kPattern)];
-    rtp_sender_video_->GetStorageType(header, kSettings, kRttMs);
-    fake_clock_.AdvanceTimeMilliseconds(kFrameIntervalMs);
-  }
-
-  // Since we're at the start of the pattern, the next expected frame in TL0 is
-  // right now. We will wait at most one expected retransmission time before
-  // acknowledging that it did not arrive, which means this frame and the next
-  // will not be retransmitted.
-  header.codecHeader.VP8.temporalIdx = 1;
-  EXPECT_EQ(StorageType::kDontRetransmit,
-            rtp_sender_video_->GetStorageType(header, kSettings, kRttMs));
-  fake_clock_.AdvanceTimeMilliseconds(kFrameIntervalMs);
-  EXPECT_EQ(StorageType::kDontRetransmit,
-            rtp_sender_video_->GetStorageType(header, kSettings, kRttMs));
-  fake_clock_.AdvanceTimeMilliseconds(kFrameIntervalMs);
-
-  // The TL0 frame did not arrive. So allow retransmission.
-  EXPECT_EQ(StorageType::kAllowRetransmission,
-            rtp_sender_video_->GetStorageType(header, kSettings, kRttMs));
-  fake_clock_.AdvanceTimeMilliseconds(kFrameIntervalMs);
-
-  // Insert a frame for TL2. We just had frame in TL1, so the next one there is
-  // in three frames away. TL0 is still too far in the past. So, allow
-  // retransmission.
-  header.codecHeader.VP8.temporalIdx = 2;
-  EXPECT_EQ(StorageType::kAllowRetransmission,
-            rtp_sender_video_->GetStorageType(header, kSettings, kRttMs));
-  fake_clock_.AdvanceTimeMilliseconds(kFrameIntervalMs);
-
-  // Another TL2, next in TL1 is two frames away. Allow again.
-  EXPECT_EQ(StorageType::kAllowRetransmission,
-            rtp_sender_video_->GetStorageType(header, kSettings, kRttMs));
-  fake_clock_.AdvanceTimeMilliseconds(kFrameIntervalMs);
-
-  // Yet another TL2, next in TL1 is now only one frame away, so don't store
-  // for retransmission.
-  EXPECT_EQ(StorageType::kDontRetransmit,
-            rtp_sender_video_->GetStorageType(header, kSettings, kRttMs));
-}
-
-TEST_P(RtpSenderVideoTest, ConditionalRetransmitLimit) {
-  const int64_t kFrameIntervalMs = 200;
-  const int64_t kRttMs = (kFrameIntervalMs * 3) / 2;
-  const int32_t kSettings =
-      kRetransmitBaseLayer | kConditionallyRetransmitHigherLayers;
-
-  // Insert VP8 frames for all temporal layers, but stop before the final index.
-  RTPVideoHeader header;
-  header.codec = kRtpVideoVp8;
-
-  // Fill averaging window to prevent rounding errors.
-  constexpr int kNumRepetitions =
-      (RTPSenderVideo::kTLRateWindowSizeMs + (kFrameIntervalMs / 2)) /
-      kFrameIntervalMs;
-  constexpr int kPattern[] = {0, 2, 2, 2};
-  for (size_t i = 0; i < arraysize(kPattern) * kNumRepetitions; ++i) {
-    header.codecHeader.VP8.temporalIdx = kPattern[i % arraysize(kPattern)];
-
-    rtp_sender_video_->GetStorageType(header, kSettings, kRttMs);
-    fake_clock_.AdvanceTimeMilliseconds(kFrameIntervalMs);
-  }
-
-  // Since we're at the start of the pattern, the next expected frame will be
-  // right now in TL0. Put it in TL1 instead. Regular rules would dictate that
-  // we don't store for retransmission because we expect a frame in a lower
-  // layer, but that last frame in TL1 was a long time ago in absolute terms,
-  // so allow retransmission anyway.
-  header.codecHeader.VP8.temporalIdx = 1;
-  EXPECT_EQ(StorageType::kAllowRetransmission,
-            rtp_sender_video_->GetStorageType(header, kSettings, kRttMs));
-}
-
-TEST_P(RtpSenderTest, OnOverheadChanged) {
-  MockOverheadObserver mock_overhead_observer;
-  rtp_sender_.reset(
-      new RTPSender(false, &fake_clock_, &transport_, nullptr, nullptr, nullptr,
-                    nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
-                    &retransmission_rate_limiter_, &mock_overhead_observer));
-  rtp_sender_->SetSSRC(kSsrc);
-
-  // RTP overhead is 12B.
-  EXPECT_CALL(mock_overhead_observer, OnOverheadChanged(12)).Times(1);
-  SendGenericPayload();
-
-  rtp_sender_->RegisterRtpHeaderExtension(kRtpExtensionTransmissionTimeOffset,
-                                          kTransmissionTimeOffsetExtensionId);
-
-  // TransmissionTimeOffset extension has a size of 8B.
-  // 12B + 8B = 20B
-  EXPECT_CALL(mock_overhead_observer, OnOverheadChanged(20)).Times(1);
-  SendGenericPayload();
-}
-
-TEST_P(RtpSenderTest, DoesNotUpdateOverheadOnEqualSize) {
-  MockOverheadObserver mock_overhead_observer;
-  rtp_sender_.reset(
-      new RTPSender(false, &fake_clock_, &transport_, nullptr, nullptr, nullptr,
-                    nullptr, nullptr, nullptr, nullptr, nullptr, nullptr,
-                    &retransmission_rate_limiter_, &mock_overhead_observer));
-  rtp_sender_->SetSSRC(kSsrc);
-
-  EXPECT_CALL(mock_overhead_observer, OnOverheadChanged(_)).Times(1);
-  SendGenericPayload();
-  SendGenericPayload();
-}
-
-TEST_P(RtpSenderTest, SendAudioPadding) {
-  MockTransport transport;
-  const bool kEnableAudio = true;
-  rtp_sender_.reset(new RTPSender(
-      kEnableAudio, &fake_clock_, &transport, &mock_paced_sender_, nullptr,
-      nullptr, nullptr, nullptr, nullptr, nullptr, &mock_rtc_event_log_,
-      nullptr, &retransmission_rate_limiter_, nullptr));
-  rtp_sender_->SetSendPayloadType(kPayload);
-  rtp_sender_->SetSequenceNumber(kSeqNum);
-  rtp_sender_->SetTimestampOffset(0);
-  rtp_sender_->SetSSRC(kSsrc);
-
-  const size_t kPaddingSize = 59;
-  EXPECT_CALL(transport, SendRtp(_, kPaddingSize + kRtpHeaderSize, _))
-      .WillOnce(testing::Return(true));
-  EXPECT_EQ(kPaddingSize,
-            rtp_sender_->TimeToSendPadding(kPaddingSize, PacedPacketInfo()));
-
-  // Requested padding size is too small, will send a larger one.
-  const size_t kMinPaddingSize = 50;
-  EXPECT_CALL(transport, SendRtp(_, kMinPaddingSize + kRtpHeaderSize, _))
-      .WillOnce(testing::Return(true));
-  EXPECT_EQ(
-      kMinPaddingSize,
-      rtp_sender_->TimeToSendPadding(kMinPaddingSize - 5, PacedPacketInfo()));
-}
-
-TEST_P(RtpSenderTest, SendsKeepAlive) {
-  MockTransport transport;
-  rtp_sender_.reset(new RTPSender(false, &fake_clock_, &transport, nullptr,
-                                  nullptr, nullptr, nullptr, nullptr, nullptr,
-                                  nullptr, &mock_rtc_event_log_, nullptr,
-                                  &retransmission_rate_limiter_, nullptr));
-  rtp_sender_->SetSendPayloadType(kPayload);
-  rtp_sender_->SetSequenceNumber(kSeqNum);
-  rtp_sender_->SetTimestampOffset(0);
-  rtp_sender_->SetSSRC(kSsrc);
-
-  const uint8_t kKeepalivePayloadType = 20;
-  RTC_CHECK_NE(kKeepalivePayloadType, kPayload);
-
-  EXPECT_CALL(transport, SendRtp(_, _, _))
-      .WillOnce(
-          Invoke([&kKeepalivePayloadType](const uint8_t* packet, size_t len,
-                                          const PacketOptions& options) {
-            webrtc::RTPHeader rtp_header;
-            RtpUtility::RtpHeaderParser parser(packet, len);
-            EXPECT_TRUE(parser.Parse(&rtp_header, nullptr));
-            EXPECT_FALSE(rtp_header.markerBit);
-            EXPECT_EQ(0U, rtp_header.paddingLength);
-            EXPECT_EQ(kKeepalivePayloadType, rtp_header.payloadType);
-            EXPECT_EQ(kSeqNum, rtp_header.sequenceNumber);
-            EXPECT_EQ(kSsrc, rtp_header.ssrc);
-            EXPECT_EQ(0u, len - rtp_header.headerLength);
-            return true;
-          }));
-
-  rtp_sender_->SendKeepAlive(kKeepalivePayloadType);
-  EXPECT_EQ(kSeqNum + 1, rtp_sender_->SequenceNumber());
-}
-
-INSTANTIATE_TEST_CASE_P(WithAndWithoutOverhead,
-                        RtpSenderTest,
-                        ::testing::Bool());
-INSTANTIATE_TEST_CASE_P(WithAndWithoutOverhead,
-                        RtpSenderTestWithoutPacer,
-                        ::testing::Bool());
-INSTANTIATE_TEST_CASE_P(WithAndWithoutOverhead,
-                        RtpSenderVideoTest,
-                        ::testing::Bool());
-INSTANTIATE_TEST_CASE_P(WithAndWithoutOverhead,
-                        RtpSenderAudioTest,
-                        ::testing::Bool());
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/rtp_sender_video.cc b/modules/rtp_rtcp/source/rtp_sender_video.cc
deleted file mode 100644
index 4e46b78..0000000
--- a/modules/rtp_rtcp/source/rtp_sender_video.cc
+++ /dev/null
@@ -1,551 +0,0 @@
-/*
- *  Copyright (c) 2012 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/rtp_rtcp/source/rtp_sender_video.h"
-
-#include <stdlib.h>
-#include <string.h>
-
-#include <limits>
-#include <memory>
-#include <utility>
-#include <vector>
-
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
-#include "webrtc/modules/rtp_rtcp/source/byte_io.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_format_video_generic.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_format_vp8.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_format_vp9.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_header_extensions.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_packet_to_send.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/ptr_util.h"
-#include "webrtc/rtc_base/trace_event.h"
-
-namespace webrtc {
-
-namespace {
-constexpr size_t kRedForFecHeaderLength = 1;
-constexpr int64_t kMaxUnretransmittableFrameIntervalMs = 33 * 4;
-
-void BuildRedPayload(const RtpPacketToSend& media_packet,
-                     RtpPacketToSend* red_packet) {
-  uint8_t* red_payload = red_packet->AllocatePayload(
-      kRedForFecHeaderLength + media_packet.payload_size());
-  RTC_DCHECK(red_payload);
-  red_payload[0] = media_packet.PayloadType();
-
-  auto media_payload = media_packet.payload();
-  memcpy(&red_payload[kRedForFecHeaderLength], media_payload.data(),
-         media_payload.size());
-}
-}  // namespace
-
-RTPSenderVideo::RTPSenderVideo(Clock* clock,
-                               RTPSender* rtp_sender,
-                               FlexfecSender* flexfec_sender)
-    : rtp_sender_(rtp_sender),
-      clock_(clock),
-      video_type_(kRtpVideoGeneric),
-      retransmission_settings_(kRetransmitBaseLayer |
-                               kConditionallyRetransmitHigherLayers),
-      last_rotation_(kVideoRotation_0),
-      red_payload_type_(-1),
-      ulpfec_payload_type_(-1),
-      flexfec_sender_(flexfec_sender),
-      delta_fec_params_{0, 1, kFecMaskRandom},
-      key_fec_params_{0, 1, kFecMaskRandom},
-      fec_bitrate_(1000, RateStatistics::kBpsScale),
-      video_bitrate_(1000, RateStatistics::kBpsScale) {}
-
-RTPSenderVideo::~RTPSenderVideo() {}
-
-void RTPSenderVideo::SetVideoCodecType(RtpVideoCodecTypes video_type) {
-  video_type_ = video_type;
-}
-
-RtpVideoCodecTypes RTPSenderVideo::VideoCodecType() const {
-  return video_type_;
-}
-
-// Static.
-RtpUtility::Payload* RTPSenderVideo::CreateVideoPayload(
-    const char payload_name[RTP_PAYLOAD_NAME_SIZE],
-    int8_t payload_type) {
-  RtpVideoCodecTypes video_type = kRtpVideoGeneric;
-  if (RtpUtility::StringCompare(payload_name, "VP8", 3)) {
-    video_type = kRtpVideoVp8;
-  } else if (RtpUtility::StringCompare(payload_name, "VP9", 3)) {
-    video_type = kRtpVideoVp9;
-  } else if (RtpUtility::StringCompare(payload_name, "H264", 4)) {
-    video_type = kRtpVideoH264;
-  } else if (RtpUtility::StringCompare(payload_name, "I420", 4)) {
-    video_type = kRtpVideoGeneric;
-  } else {
-    video_type = kRtpVideoGeneric;
-  }
-  RtpUtility::Payload* payload = new RtpUtility::Payload();
-  payload->name[RTP_PAYLOAD_NAME_SIZE - 1] = 0;
-  strncpy(payload->name, payload_name, RTP_PAYLOAD_NAME_SIZE - 1);
-  payload->typeSpecific.Video.videoCodecType = video_type;
-  payload->audio = false;
-  return payload;
-}
-
-void RTPSenderVideo::SendVideoPacket(std::unique_ptr<RtpPacketToSend> packet,
-                                     StorageType storage) {
-  // Remember some values about the packet before sending it away.
-  size_t packet_size = packet->size();
-  uint16_t seq_num = packet->SequenceNumber();
-  uint32_t rtp_timestamp = packet->Timestamp();
-  if (!rtp_sender_->SendToNetwork(std::move(packet), storage,
-                                  RtpPacketSender::kLowPriority)) {
-    LOG(LS_WARNING) << "Failed to send video packet " << seq_num;
-    return;
-  }
-  rtc::CritScope cs(&stats_crit_);
-  video_bitrate_.Update(packet_size, clock_->TimeInMilliseconds());
-  TRACE_EVENT_INSTANT2(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"),
-                       "Video::PacketNormal", "timestamp", rtp_timestamp,
-                       "seqnum", seq_num);
-}
-
-void RTPSenderVideo::SendVideoPacketAsRedMaybeWithUlpfec(
-    std::unique_ptr<RtpPacketToSend> media_packet,
-    StorageType media_packet_storage,
-    bool protect_media_packet) {
-  uint32_t rtp_timestamp = media_packet->Timestamp();
-  uint16_t media_seq_num = media_packet->SequenceNumber();
-
-  std::unique_ptr<RtpPacketToSend> red_packet(
-      new RtpPacketToSend(*media_packet));
-  BuildRedPayload(*media_packet, red_packet.get());
-
-  std::vector<std::unique_ptr<RedPacket>> fec_packets;
-  StorageType fec_storage = kDontRetransmit;
-  {
-    // Only protect while creating RED and FEC packets, not when sending.
-    rtc::CritScope cs(&crit_);
-    red_packet->SetPayloadType(red_payload_type_);
-    if (ulpfec_enabled()) {
-      if (protect_media_packet) {
-        ulpfec_generator_.AddRtpPacketAndGenerateFec(
-            media_packet->data(), media_packet->payload_size(),
-            media_packet->headers_size());
-      }
-      uint16_t num_fec_packets = ulpfec_generator_.NumAvailableFecPackets();
-      if (num_fec_packets > 0) {
-        uint16_t first_fec_sequence_number =
-            rtp_sender_->AllocateSequenceNumber(num_fec_packets);
-        fec_packets = ulpfec_generator_.GetUlpfecPacketsAsRed(
-            red_payload_type_, ulpfec_payload_type_, first_fec_sequence_number,
-            media_packet->headers_size());
-        RTC_DCHECK_EQ(num_fec_packets, fec_packets.size());
-        if (retransmission_settings_ & kRetransmitFECPackets)
-          fec_storage = kAllowRetransmission;
-      }
-    }
-  }
-  // Send |red_packet| instead of |packet| for allocated sequence number.
-  size_t red_packet_size = red_packet->size();
-  if (rtp_sender_->SendToNetwork(std::move(red_packet), media_packet_storage,
-                                 RtpPacketSender::kLowPriority)) {
-    rtc::CritScope cs(&stats_crit_);
-    video_bitrate_.Update(red_packet_size, clock_->TimeInMilliseconds());
-    TRACE_EVENT_INSTANT2(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"),
-                         "Video::PacketRed", "timestamp", rtp_timestamp,
-                         "seqnum", media_seq_num);
-  } else {
-    LOG(LS_WARNING) << "Failed to send RED packet " << media_seq_num;
-  }
-  for (const auto& fec_packet : fec_packets) {
-    // TODO(danilchap): Make ulpfec_generator_ generate RtpPacketToSend to avoid
-    // reparsing them.
-    std::unique_ptr<RtpPacketToSend> rtp_packet(
-        new RtpPacketToSend(*media_packet));
-    RTC_CHECK(rtp_packet->Parse(fec_packet->data(), fec_packet->length()));
-    rtp_packet->set_capture_time_ms(media_packet->capture_time_ms());
-    uint16_t fec_sequence_number = rtp_packet->SequenceNumber();
-    if (rtp_sender_->SendToNetwork(std::move(rtp_packet), fec_storage,
-                                   RtpPacketSender::kLowPriority)) {
-      rtc::CritScope cs(&stats_crit_);
-      fec_bitrate_.Update(fec_packet->length(), clock_->TimeInMilliseconds());
-      TRACE_EVENT_INSTANT2(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"),
-                           "Video::PacketUlpfec", "timestamp", rtp_timestamp,
-                           "seqnum", fec_sequence_number);
-    } else {
-      LOG(LS_WARNING) << "Failed to send ULPFEC packet " << fec_sequence_number;
-    }
-  }
-}
-
-void RTPSenderVideo::SendVideoPacketWithFlexfec(
-    std::unique_ptr<RtpPacketToSend> media_packet,
-    StorageType media_packet_storage,
-    bool protect_media_packet) {
-  RTC_DCHECK(flexfec_sender_);
-
-  if (protect_media_packet)
-    flexfec_sender_->AddRtpPacketAndGenerateFec(*media_packet);
-
-  SendVideoPacket(std::move(media_packet), media_packet_storage);
-
-  if (flexfec_sender_->FecAvailable()) {
-    std::vector<std::unique_ptr<RtpPacketToSend>> fec_packets =
-        flexfec_sender_->GetFecPackets();
-    for (auto& fec_packet : fec_packets) {
-      size_t packet_length = fec_packet->size();
-      uint32_t timestamp = fec_packet->Timestamp();
-      uint16_t seq_num = fec_packet->SequenceNumber();
-      if (rtp_sender_->SendToNetwork(std::move(fec_packet), kDontRetransmit,
-                                     RtpPacketSender::kLowPriority)) {
-        rtc::CritScope cs(&stats_crit_);
-        fec_bitrate_.Update(packet_length, clock_->TimeInMilliseconds());
-        TRACE_EVENT_INSTANT2(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"),
-                             "Video::PacketFlexfec", "timestamp", timestamp,
-                             "seqnum", seq_num);
-      } else {
-        LOG(LS_WARNING) << "Failed to send FlexFEC packet " << seq_num;
-      }
-    }
-  }
-}
-
-void RTPSenderVideo::SetUlpfecConfig(int red_payload_type,
-                                     int ulpfec_payload_type) {
-  // Sanity check. Per the definition of UlpfecConfig (see config.h),
-  // a payload type of -1 means that the corresponding feature is
-  // turned off.
-  RTC_DCHECK_GE(red_payload_type, -1);
-  RTC_DCHECK_LE(red_payload_type, 127);
-  RTC_DCHECK_GE(ulpfec_payload_type, -1);
-  RTC_DCHECK_LE(ulpfec_payload_type, 127);
-
-  rtc::CritScope cs(&crit_);
-  red_payload_type_ = red_payload_type;
-  ulpfec_payload_type_ = ulpfec_payload_type;
-
-  // Must not enable ULPFEC without RED.
-  // TODO(brandtr): We currently support enabling RED without ULPFEC. Change
-  // this when we have removed the RED/RTX send-side workaround, so that we
-  // ensure that RED and ULPFEC are only enabled together.
-  RTC_DCHECK(red_enabled() || !ulpfec_enabled());
-
-  // Reset FEC parameters.
-  delta_fec_params_ = FecProtectionParams{0, 1, kFecMaskRandom};
-  key_fec_params_ = FecProtectionParams{0, 1, kFecMaskRandom};
-}
-
-void RTPSenderVideo::GetUlpfecConfig(int* red_payload_type,
-                                     int* ulpfec_payload_type) const {
-  rtc::CritScope cs(&crit_);
-  *red_payload_type = red_payload_type_;
-  *ulpfec_payload_type = ulpfec_payload_type_;
-}
-
-size_t RTPSenderVideo::CalculateFecPacketOverhead() const {
-  if (flexfec_enabled())
-    return flexfec_sender_->MaxPacketOverhead();
-
-  size_t overhead = 0;
-  if (red_enabled()) {
-    // The RED overhead is due to a small header.
-    overhead += kRedForFecHeaderLength;
-  }
-  if (ulpfec_enabled()) {
-    // For ULPFEC, the overhead is the FEC headers plus RED for FEC header
-    // (see above) plus anything in RTP header beyond the 12 bytes base header
-    // (CSRC list, extensions...)
-    // This reason for the header extensions to be included here is that
-    // from an FEC viewpoint, they are part of the payload to be protected.
-    // (The base RTP header is already protected by the FEC header.)
-    overhead += ulpfec_generator_.MaxPacketOverhead() +
-                (rtp_sender_->RtpHeaderLength() - kRtpHeaderSize);
-  }
-  return overhead;
-}
-
-void RTPSenderVideo::SetFecParameters(const FecProtectionParams& delta_params,
-                                      const FecProtectionParams& key_params) {
-  rtc::CritScope cs(&crit_);
-  delta_fec_params_ = delta_params;
-  key_fec_params_ = key_params;
-}
-
-rtc::Optional<uint32_t> RTPSenderVideo::FlexfecSsrc() const {
-  if (flexfec_sender_) {
-    return rtc::Optional<uint32_t>(flexfec_sender_->ssrc());
-  }
-  return rtc::Optional<uint32_t>();
-}
-
-bool RTPSenderVideo::SendVideo(RtpVideoCodecTypes video_type,
-                               FrameType frame_type,
-                               int8_t payload_type,
-                               uint32_t rtp_timestamp,
-                               int64_t capture_time_ms,
-                               const uint8_t* payload_data,
-                               size_t payload_size,
-                               const RTPFragmentationHeader* fragmentation,
-                               const RTPVideoHeader* video_header,
-                               int64_t expected_retransmission_time_ms) {
-  if (payload_size == 0)
-    return false;
-
-  // Create header that will be reused in all packets.
-  std::unique_ptr<RtpPacketToSend> rtp_header = rtp_sender_->AllocatePacket();
-  rtp_header->SetPayloadType(payload_type);
-  rtp_header->SetTimestamp(rtp_timestamp);
-  rtp_header->set_capture_time_ms(capture_time_ms);
-  auto last_packet = rtc::MakeUnique<RtpPacketToSend>(*rtp_header);
-
-  size_t fec_packet_overhead;
-  bool red_enabled;
-  int32_t retransmission_settings;
-  {
-    rtc::CritScope cs(&crit_);
-    // According to
-    // http://www.etsi.org/deliver/etsi_ts/126100_126199/126114/12.07.00_60/
-    // ts_126114v120700p.pdf Section 7.4.5:
-    // The MTSI client shall add the payload bytes as defined in this clause
-    // onto the last RTP packet in each group of packets which make up a key
-    // frame (I-frame or IDR frame in H.264 (AVC), or an IRAP picture in H.265
-    // (HEVC)). The MTSI client may also add the payload bytes onto the last RTP
-    // packet in each group of packets which make up another type of frame
-    // (e.g. a P-Frame) only if the current value is different from the previous
-    // value sent.
-    if (video_header) {
-      // Set rotation when key frame or when changed (to follow standard).
-      // Or when different from 0 (to follow current receiver implementation).
-      VideoRotation current_rotation = video_header->rotation;
-      if (frame_type == kVideoFrameKey || current_rotation != last_rotation_ ||
-          current_rotation != kVideoRotation_0)
-        last_packet->SetExtension<VideoOrientation>(current_rotation);
-      last_rotation_ = current_rotation;
-      // Report content type only for key frames.
-      if (frame_type == kVideoFrameKey &&
-          video_header->content_type != VideoContentType::UNSPECIFIED) {
-        last_packet->SetExtension<VideoContentTypeExtension>(
-            video_header->content_type);
-      }
-      if (video_header->video_timing.flags != TimingFrameFlags::kInvalid) {
-        last_packet->SetExtension<VideoTimingExtension>(
-            video_header->video_timing);
-      }
-    }
-
-    // FEC settings.
-    const FecProtectionParams& fec_params =
-        frame_type == kVideoFrameKey ? key_fec_params_ : delta_fec_params_;
-    if (flexfec_enabled())
-      flexfec_sender_->SetFecParameters(fec_params);
-    if (ulpfec_enabled())
-      ulpfec_generator_.SetFecParameters(fec_params);
-
-    fec_packet_overhead = CalculateFecPacketOverhead();
-    red_enabled = this->red_enabled();
-    retransmission_settings = retransmission_settings_;
-  }
-
-  size_t packet_capacity = rtp_sender_->MaxRtpPacketSize() -
-                           fec_packet_overhead -
-                           (rtp_sender_->RtxStatus() ? kRtxHeaderSize : 0);
-  RTC_DCHECK_LE(packet_capacity, rtp_header->capacity());
-  RTC_DCHECK_GT(packet_capacity, rtp_header->headers_size());
-  RTC_DCHECK_GT(packet_capacity, last_packet->headers_size());
-  size_t max_data_payload_length = packet_capacity - rtp_header->headers_size();
-  RTC_DCHECK_GE(last_packet->headers_size(), rtp_header->headers_size());
-  size_t last_packet_reduction_len =
-      last_packet->headers_size() - rtp_header->headers_size();
-
-  std::unique_ptr<RtpPacketizer> packetizer(RtpPacketizer::Create(
-      video_type, max_data_payload_length, last_packet_reduction_len,
-      video_header ? &(video_header->codecHeader) : nullptr, frame_type));
-
-  const uint8_t temporal_id =
-      video_header ? GetTemporalId(*video_header) : kNoTemporalIdx;
-  StorageType storage = GetStorageType(temporal_id, retransmission_settings,
-                                       expected_retransmission_time_ms);
-
-  // TODO(changbin): we currently don't support to configure the codec to
-  // output multiple partitions for VP8. Should remove below check after the
-  // issue is fixed.
-  const RTPFragmentationHeader* frag =
-      (video_type == kRtpVideoVp8) ? nullptr : fragmentation;
-  size_t num_packets =
-      packetizer->SetPayloadData(payload_data, payload_size, frag);
-
-  if (num_packets == 0)
-    return false;
-
-  bool first_frame = first_frame_sent_();
-  for (size_t i = 0; i < num_packets; ++i) {
-    bool last = (i + 1) == num_packets;
-    auto packet = last ? std::move(last_packet)
-                       : rtc::MakeUnique<RtpPacketToSend>(*rtp_header);
-    if (!packetizer->NextPacket(packet.get()))
-      return false;
-    RTC_DCHECK_LE(packet->payload_size(),
-                  last ? max_data_payload_length - last_packet_reduction_len
-                       : max_data_payload_length);
-    if (!rtp_sender_->AssignSequenceNumber(packet.get()))
-      return false;
-
-    // No FEC protection for upper temporal layers, if used.
-    bool protect_packet = temporal_id == 0 || temporal_id == kNoTemporalIdx;
-
-    // Put packetization finish timestamp into extension.
-    if (packet->HasExtension<VideoTimingExtension>()) {
-      packet->set_packetization_finish_time_ms(clock_->TimeInMilliseconds());
-      // TODO(ilnik): Due to webrtc:7859, packets with timing extensions are not
-      // protected by FEC. It reduces FEC efficiency a bit. When FEC is moved
-      // below the pacer, it can be re-enabled for these packets.
-      // NOTE: Any RTP stream processor in the network, modifying 'network'
-      // timestamps in the timing frames extension have to be an end-point for
-      // FEC, otherwise recovered by FEC packets will be corrupted.
-      protect_packet = false;
-    }
-
-    if (flexfec_enabled()) {
-      // TODO(brandtr): Remove the FlexFEC code path when FlexfecSender
-      // is wired up to PacedSender instead.
-      SendVideoPacketWithFlexfec(std::move(packet), storage, protect_packet);
-    } else if (red_enabled) {
-      SendVideoPacketAsRedMaybeWithUlpfec(std::move(packet), storage,
-                                          protect_packet);
-    } else {
-      SendVideoPacket(std::move(packet), storage);
-    }
-
-    if (first_frame) {
-      if (i == 0) {
-        LOG(LS_INFO)
-            << "Sent first RTP packet of the first video frame (pre-pacer)";
-      }
-      if (last) {
-        LOG(LS_INFO)
-            << "Sent last RTP packet of the first video frame (pre-pacer)";
-      }
-    }
-  }
-
-  TRACE_EVENT_ASYNC_END1("webrtc", "Video", capture_time_ms, "timestamp",
-                         rtp_timestamp);
-  return true;
-}
-
-uint32_t RTPSenderVideo::VideoBitrateSent() const {
-  rtc::CritScope cs(&stats_crit_);
-  return video_bitrate_.Rate(clock_->TimeInMilliseconds()).value_or(0);
-}
-
-uint32_t RTPSenderVideo::FecOverheadRate() const {
-  rtc::CritScope cs(&stats_crit_);
-  return fec_bitrate_.Rate(clock_->TimeInMilliseconds()).value_or(0);
-}
-
-int RTPSenderVideo::SelectiveRetransmissions() const {
-  rtc::CritScope cs(&crit_);
-  return retransmission_settings_;
-}
-
-void RTPSenderVideo::SetSelectiveRetransmissions(uint8_t settings) {
-  rtc::CritScope cs(&crit_);
-  retransmission_settings_ = settings;
-}
-
-StorageType RTPSenderVideo::GetStorageType(
-    uint8_t temporal_id,
-    int32_t retransmission_settings,
-    int64_t expected_retransmission_time_ms) {
-  if (retransmission_settings == kRetransmitOff)
-    return StorageType::kDontRetransmit;
-  if (retransmission_settings == kRetransmitAllPackets)
-    return StorageType::kAllowRetransmission;
-
-  rtc::CritScope cs(&stats_crit_);
-  // Media packet storage.
-  if ((retransmission_settings & kConditionallyRetransmitHigherLayers) &&
-      UpdateConditionalRetransmit(temporal_id,
-                                  expected_retransmission_time_ms)) {
-    retransmission_settings |= kRetransmitHigherLayers;
-  }
-
-  if (temporal_id == kNoTemporalIdx)
-    return kAllowRetransmission;
-
-  if ((retransmission_settings & kRetransmitBaseLayer) && temporal_id == 0)
-    return kAllowRetransmission;
-
-  if ((retransmission_settings & kRetransmitHigherLayers) && temporal_id > 0)
-    return kAllowRetransmission;
-
-  return kDontRetransmit;
-}
-
-uint8_t RTPSenderVideo::GetTemporalId(const RTPVideoHeader& header) {
-  switch (header.codec) {
-    case kRtpVideoVp8:
-      return header.codecHeader.VP8.temporalIdx;
-    case kRtpVideoVp9:
-      return header.codecHeader.VP9.temporal_idx;
-    default:
-      return kNoTemporalIdx;
-  }
-}
-
-bool RTPSenderVideo::UpdateConditionalRetransmit(
-    uint8_t temporal_id,
-    int64_t expected_retransmission_time_ms) {
-  int64_t now_ms = clock_->TimeInMilliseconds();
-  // Update stats for any temporal layer.
-  TemporalLayerStats* current_layer_stats =
-      &frame_stats_by_temporal_layer_[temporal_id];
-  current_layer_stats->frame_rate_fp1000s.Update(1, now_ms);
-  int64_t tl_frame_interval = now_ms - current_layer_stats->last_frame_time_ms;
-  current_layer_stats->last_frame_time_ms = now_ms;
-
-  // Conditional retransmit only applies to upper layers.
-  if (temporal_id != kNoTemporalIdx && temporal_id > 0) {
-    if (tl_frame_interval >= kMaxUnretransmittableFrameIntervalMs) {
-      // Too long since a retransmittable frame in this layer, enable NACK
-      // protection.
-      return true;
-    } else {
-      // Estimate when the next frame of any lower layer will be sent.
-      const int64_t kUndefined = std::numeric_limits<int64_t>::max();
-      int64_t expected_next_frame_time = kUndefined;
-      for (int i = temporal_id - 1; i >= 0; --i) {
-        TemporalLayerStats* stats = &frame_stats_by_temporal_layer_[i];
-        rtc::Optional<uint32_t> rate = stats->frame_rate_fp1000s.Rate(now_ms);
-        if (rate) {
-          int64_t tl_next = stats->last_frame_time_ms + 1000000 / *rate;
-          if (tl_next - now_ms > -expected_retransmission_time_ms &&
-              tl_next < expected_next_frame_time) {
-            expected_next_frame_time = tl_next;
-          }
-        }
-      }
-
-      if (expected_next_frame_time == kUndefined ||
-          expected_next_frame_time - now_ms > expected_retransmission_time_ms) {
-        // The next frame in a lower layer is expected at a later time (or
-        // unable to tell due to lack of data) than a retransmission is
-        // estimated to be able to arrive, so allow this packet to be nacked.
-        return true;
-      }
-    }
-  }
-
-  return false;
-}
-
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/rtp_sender_video.h b/modules/rtp_rtcp/source/rtp_sender_video.h
deleted file mode 100644
index fed35cd..0000000
--- a/modules/rtp_rtcp/source/rtp_sender_video.h
+++ /dev/null
@@ -1,167 +0,0 @@
-/*
- *  Copyright (c) 2012 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_RTP_RTCP_SOURCE_RTP_SENDER_VIDEO_H_
-#define WEBRTC_MODULES_RTP_RTCP_SOURCE_RTP_SENDER_VIDEO_H_
-
-#include <map>
-#include <memory>
-
-#include "webrtc/api/optional.h"
-#include "webrtc/common_types.h"
-#include "webrtc/modules/rtp_rtcp/include/flexfec_sender.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_rtcp_config.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_sender.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_utility.h"
-#include "webrtc/modules/rtp_rtcp/source/ulpfec_generator.h"
-#include "webrtc/modules/rtp_rtcp/source/video_codec_information.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/onetimeevent.h"
-#include "webrtc/rtc_base/rate_statistics.h"
-#include "webrtc/rtc_base/sequenced_task_checker.h"
-#include "webrtc/rtc_base/thread_annotations.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-class RtpPacketizer;
-class RtpPacketToSend;
-
-class RTPSenderVideo {
- public:
-  static constexpr int64_t kTLRateWindowSizeMs = 2500;
-
-  RTPSenderVideo(Clock* clock,
-                 RTPSender* rtpSender,
-                 FlexfecSender* flexfec_sender);
-  virtual ~RTPSenderVideo();
-
-  virtual RtpVideoCodecTypes VideoCodecType() const;
-
-  static RtpUtility::Payload* CreateVideoPayload(
-      const char payload_name[RTP_PAYLOAD_NAME_SIZE],
-      int8_t payload_type);
-
-  bool SendVideo(RtpVideoCodecTypes video_type,
-                 FrameType frame_type,
-                 int8_t payload_type,
-                 uint32_t capture_timestamp,
-                 int64_t capture_time_ms,
-                 const uint8_t* payload_data,
-                 size_t payload_size,
-                 const RTPFragmentationHeader* fragmentation,
-                 const RTPVideoHeader* video_header,
-                 int64_t expected_retransmission_time_ms);
-
-  void SetVideoCodecType(RtpVideoCodecTypes type);
-
-  // ULPFEC.
-  void SetUlpfecConfig(int red_payload_type, int ulpfec_payload_type);
-  void GetUlpfecConfig(int* red_payload_type, int* ulpfec_payload_type) const;
-
-  // FlexFEC/ULPFEC.
-  void SetFecParameters(const FecProtectionParams& delta_params,
-                        const FecProtectionParams& key_params);
-
-  // FlexFEC.
-  rtc::Optional<uint32_t> FlexfecSsrc() const;
-
-  uint32_t VideoBitrateSent() const;
-  uint32_t FecOverheadRate() const;
-
-  int SelectiveRetransmissions() const;
-  void SetSelectiveRetransmissions(uint8_t settings);
-
- protected:
-  static uint8_t GetTemporalId(const RTPVideoHeader& header);
-  StorageType GetStorageType(uint8_t temporal_id,
-                             int32_t retransmission_settings,
-                             int64_t expected_retransmission_time_ms);
-
- private:
-  struct TemporalLayerStats {
-    TemporalLayerStats()
-        : frame_rate_fp1000s(kTLRateWindowSizeMs, 1000 * 1000),
-          last_frame_time_ms(0) {}
-    // Frame rate, in frames per 1000 seconds. This essentially turns the fps
-    // value into a fixed point value with three decimals. Improves precision at
-    // low frame rates.
-    RateStatistics frame_rate_fp1000s;
-    int64_t last_frame_time_ms;
-  };
-
-  size_t CalculateFecPacketOverhead() const RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_);
-
-  void SendVideoPacket(std::unique_ptr<RtpPacketToSend> packet,
-                       StorageType storage);
-
-  void SendVideoPacketAsRedMaybeWithUlpfec(
-      std::unique_ptr<RtpPacketToSend> media_packet,
-      StorageType media_packet_storage,
-      bool protect_media_packet);
-
-  // TODO(brandtr): Remove the FlexFEC functions when FlexfecSender has been
-  // moved to PacedSender.
-  void SendVideoPacketWithFlexfec(std::unique_ptr<RtpPacketToSend> media_packet,
-                                  StorageType media_packet_storage,
-                                  bool protect_media_packet);
-
-  bool red_enabled() const RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_) {
-    return red_payload_type_ >= 0;
-  }
-
-  bool ulpfec_enabled() const RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_) {
-    return ulpfec_payload_type_ >= 0;
-  }
-
-  bool flexfec_enabled() const { return flexfec_sender_ != nullptr; }
-
-  bool UpdateConditionalRetransmit(uint8_t temporal_id,
-                                   int64_t expected_retransmission_time_ms)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(stats_crit_);
-
-  RTPSender* const rtp_sender_;
-  Clock* const clock_;
-
-  // Should never be held when calling out of this class.
-  rtc::CriticalSection crit_;
-
-  RtpVideoCodecTypes video_type_;
-  int32_t retransmission_settings_ RTC_GUARDED_BY(crit_);
-  VideoRotation last_rotation_ RTC_GUARDED_BY(crit_);
-
-  // RED/ULPFEC.
-  int red_payload_type_ RTC_GUARDED_BY(crit_);
-  int ulpfec_payload_type_ RTC_GUARDED_BY(crit_);
-  UlpfecGenerator ulpfec_generator_ RTC_GUARDED_BY(crit_);
-
-  // FlexFEC.
-  FlexfecSender* const flexfec_sender_;
-
-  // FEC parameters, applicable to either ULPFEC or FlexFEC.
-  FecProtectionParams delta_fec_params_ RTC_GUARDED_BY(crit_);
-  FecProtectionParams key_fec_params_ RTC_GUARDED_BY(crit_);
-
-  rtc::CriticalSection stats_crit_;
-  // Bitrate used for FEC payload, RED headers, RTP headers for FEC packets
-  // and any padding overhead.
-  RateStatistics fec_bitrate_ RTC_GUARDED_BY(stats_crit_);
-  // Bitrate used for video payload and RTP headers.
-  RateStatistics video_bitrate_ RTC_GUARDED_BY(stats_crit_);
-
-  std::map<int, TemporalLayerStats> frame_stats_by_temporal_layer_
-      RTC_GUARDED_BY(stats_crit_);
-
-  OneTimeEvent first_frame_sent_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_RTP_RTCP_SOURCE_RTP_SENDER_VIDEO_H_
diff --git a/modules/rtp_rtcp/source/rtp_utility.cc b/modules/rtp_rtcp/source/rtp_utility.cc
deleted file mode 100644
index fbcf731..0000000
--- a/modules/rtp_rtcp/source/rtp_utility.cc
+++ /dev/null
@@ -1,497 +0,0 @@
-/*
- *  Copyright (c) 2012 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/rtp_rtcp/source/rtp_utility.h"
-
-#include "webrtc/modules/rtp_rtcp/include/rtp_cvo.h"
-#include "webrtc/modules/rtp_rtcp/source/byte_io.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_header_extensions.h"
-#include "webrtc/rtc_base/logging.h"
-
-namespace webrtc {
-
-RtpFeedback* NullObjectRtpFeedback() {
-  static NullRtpFeedback null_rtp_feedback;
-  return &null_rtp_feedback;
-}
-
-namespace RtpUtility {
-
-enum {
-  kRtcpExpectedVersion = 2,
-  kRtcpMinHeaderLength = 4,
-  kRtcpMinParseLength = 8,
-
-  kRtpExpectedVersion = 2,
-  kRtpMinParseLength = 12
-};
-
-/*
- * Misc utility routines
- */
-
-#if defined(_WIN32)
-bool StringCompare(const char* str1, const char* str2,
-                   const uint32_t length) {
-  return _strnicmp(str1, str2, length) == 0;
-}
-#elif defined(WEBRTC_LINUX) || defined(WEBRTC_MAC)
-bool StringCompare(const char* str1, const char* str2,
-                   const uint32_t length) {
-  return strncasecmp(str1, str2, length) == 0;
-}
-#endif
-
-size_t Word32Align(size_t size) {
-  uint32_t remainder = size % 4;
-  if (remainder != 0)
-    return size + 4 - remainder;
-  return size;
-}
-
-RtpHeaderParser::RtpHeaderParser(const uint8_t* rtpData,
-                                 const size_t rtpDataLength)
-    : _ptrRTPDataBegin(rtpData),
-      _ptrRTPDataEnd(rtpData ? (rtpData + rtpDataLength) : NULL) {
-}
-
-RtpHeaderParser::~RtpHeaderParser() {
-}
-
-bool RtpHeaderParser::RTCP() const {
-  // 72 to 76 is reserved for RTP
-  // 77 to 79 is not reserver but  they are not assigned we will block them
-  // for RTCP 200 SR  == marker bit + 72
-  // for RTCP 204 APP == marker bit + 76
-  /*
-  *       RTCP
-  *
-  * FIR      full INTRA-frame request             192     [RFC2032]   supported
-  * NACK     negative acknowledgement             193     [RFC2032]
-  * IJ       Extended inter-arrival jitter report 195     [RFC-ietf-avt-rtp-toff
-  * set-07.txt] http://tools.ietf.org/html/draft-ietf-avt-rtp-toffset-07
-  * SR       sender report                        200     [RFC3551]   supported
-  * RR       receiver report                      201     [RFC3551]   supported
-  * SDES     source description                   202     [RFC3551]   supported
-  * BYE      goodbye                              203     [RFC3551]   supported
-  * APP      application-defined                  204     [RFC3551]   ignored
-  * RTPFB    Transport layer FB message           205     [RFC4585]   supported
-  * PSFB     Payload-specific FB message          206     [RFC4585]   supported
-  * XR       extended report                      207     [RFC3611]   supported
-  */
-
-  /* 205       RFC 5104
-   * FMT 1      NACK       supported
-   * FMT 2      reserved
-   * FMT 3      TMMBR      supported
-   * FMT 4      TMMBN      supported
-   */
-
-  /* 206      RFC 5104
-  * FMT 1:     Picture Loss Indication (PLI)                      supported
-  * FMT 2:     Slice Lost Indication (SLI)
-  * FMT 3:     Reference Picture Selection Indication (RPSI)
-  * FMT 4:     Full Intra Request (FIR) Command                   supported
-  * FMT 5:     Temporal-Spatial Trade-off Request (TSTR)
-  * FMT 6:     Temporal-Spatial Trade-off Notification (TSTN)
-  * FMT 7:     Video Back Channel Message (VBCM)
-  * FMT 15:    Application layer FB message
-  */
-
-  const ptrdiff_t length = _ptrRTPDataEnd - _ptrRTPDataBegin;
-  if (length < kRtcpMinHeaderLength) {
-    return false;
-  }
-
-  const uint8_t V = _ptrRTPDataBegin[0] >> 6;
-  if (V != kRtcpExpectedVersion) {
-    return false;
-  }
-
-  const uint8_t payloadType = _ptrRTPDataBegin[1];
-  switch (payloadType) {
-    case 192:
-      return true;
-    case 193:
-      // not supported
-      // pass through and check for a potential RTP packet
-      return false;
-    case 195:
-    case 200:
-    case 201:
-    case 202:
-    case 203:
-    case 204:
-    case 205:
-    case 206:
-    case 207:
-      return true;
-    default:
-      return false;
-  }
-}
-
-bool RtpHeaderParser::ParseRtcp(RTPHeader* header) const {
-  assert(header != NULL);
-
-  const ptrdiff_t length = _ptrRTPDataEnd - _ptrRTPDataBegin;
-  if (length < kRtcpMinParseLength) {
-    return false;
-  }
-
-  const uint8_t V = _ptrRTPDataBegin[0] >> 6;
-  if (V != kRtcpExpectedVersion) {
-    return false;
-  }
-
-  const uint8_t PT = _ptrRTPDataBegin[1];
-  const size_t len = (_ptrRTPDataBegin[2] << 8) + _ptrRTPDataBegin[3];
-  const uint8_t* ptr = &_ptrRTPDataBegin[4];
-
-  uint32_t SSRC = ByteReader<uint32_t>::ReadBigEndian(ptr);
-  ptr += 4;
-
-  header->payloadType  = PT;
-  header->ssrc         = SSRC;
-  header->headerLength = 4 + (len << 2);
-
-  return true;
-}
-
-bool RtpHeaderParser::Parse(RTPHeader* header,
-                            RtpHeaderExtensionMap* ptrExtensionMap) const {
-  const ptrdiff_t length = _ptrRTPDataEnd - _ptrRTPDataBegin;
-  if (length < kRtpMinParseLength) {
-    return false;
-  }
-
-  // Version
-  const uint8_t V  = _ptrRTPDataBegin[0] >> 6;
-  // Padding
-  const bool          P  = ((_ptrRTPDataBegin[0] & 0x20) == 0) ? false : true;
-  // eXtension
-  const bool          X  = ((_ptrRTPDataBegin[0] & 0x10) == 0) ? false : true;
-  const uint8_t CC = _ptrRTPDataBegin[0] & 0x0f;
-  const bool          M  = ((_ptrRTPDataBegin[1] & 0x80) == 0) ? false : true;
-
-  const uint8_t PT = _ptrRTPDataBegin[1] & 0x7f;
-
-  const uint16_t sequenceNumber = (_ptrRTPDataBegin[2] << 8) +
-      _ptrRTPDataBegin[3];
-
-  const uint8_t* ptr = &_ptrRTPDataBegin[4];
-
-  uint32_t RTPTimestamp = ByteReader<uint32_t>::ReadBigEndian(ptr);
-  ptr += 4;
-
-  uint32_t SSRC = ByteReader<uint32_t>::ReadBigEndian(ptr);
-  ptr += 4;
-
-  if (V != kRtpExpectedVersion) {
-    return false;
-  }
-
-  const size_t CSRCocts = CC * 4;
-
-  if ((ptr + CSRCocts) > _ptrRTPDataEnd) {
-    return false;
-  }
-
-  header->markerBit      = M;
-  header->payloadType    = PT;
-  header->sequenceNumber = sequenceNumber;
-  header->timestamp      = RTPTimestamp;
-  header->ssrc           = SSRC;
-  header->numCSRCs       = CC;
-  header->paddingLength  = P ? *(_ptrRTPDataEnd - 1) : 0;
-
-  for (uint8_t i = 0; i < CC; ++i) {
-    uint32_t CSRC = ByteReader<uint32_t>::ReadBigEndian(ptr);
-    ptr += 4;
-    header->arrOfCSRCs[i] = CSRC;
-  }
-
-  header->headerLength   = 12 + CSRCocts;
-
-  // If in effect, MAY be omitted for those packets for which the offset
-  // is zero.
-  header->extension.hasTransmissionTimeOffset = false;
-  header->extension.transmissionTimeOffset = 0;
-
-  // May not be present in packet.
-  header->extension.hasAbsoluteSendTime = false;
-  header->extension.absoluteSendTime = 0;
-
-  // May not be present in packet.
-  header->extension.hasAudioLevel = false;
-  header->extension.voiceActivity = false;
-  header->extension.audioLevel = 0;
-
-  // May not be present in packet.
-  header->extension.hasVideoRotation = false;
-  header->extension.videoRotation = kVideoRotation_0;
-
-  // May not be present in packet.
-  header->extension.playout_delay.min_ms = -1;
-  header->extension.playout_delay.max_ms = -1;
-
-  // May not be present in packet.
-  header->extension.hasVideoContentType = false;
-  header->extension.videoContentType = VideoContentType::UNSPECIFIED;
-
-  header->extension.has_video_timing = false;
-  header->extension.video_timing = {0u, 0u, 0u, 0u, 0u, 0u, false};
-
-  if (X) {
-    /* RTP header extension, RFC 3550.
-     0                   1                   2                   3
-     0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
-    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-    |      defined by profile       |           length              |
-    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-    |                        header extension                       |
-    |                             ....                              |
-    */
-    const ptrdiff_t remain = _ptrRTPDataEnd - ptr;
-    if (remain < 4) {
-      return false;
-    }
-
-    header->headerLength += 4;
-
-    uint16_t definedByProfile = ByteReader<uint16_t>::ReadBigEndian(ptr);
-    ptr += 2;
-
-    // in 32 bit words
-    size_t XLen = ByteReader<uint16_t>::ReadBigEndian(ptr);
-    ptr += 2;
-    XLen *= 4;  // in bytes
-
-    if (static_cast<size_t>(remain) < (4 + XLen)) {
-      return false;
-    }
-    static constexpr uint16_t kRtpOneByteHeaderExtensionId = 0xBEDE;
-    if (definedByProfile == kRtpOneByteHeaderExtensionId) {
-      const uint8_t* ptrRTPDataExtensionEnd = ptr + XLen;
-      ParseOneByteExtensionHeader(header,
-                                  ptrExtensionMap,
-                                  ptrRTPDataExtensionEnd,
-                                  ptr);
-    }
-    header->headerLength += XLen;
-  }
-  if (header->headerLength + header->paddingLength >
-      static_cast<size_t>(length))
-    return false;
-  return true;
-}
-
-void RtpHeaderParser::ParseOneByteExtensionHeader(
-    RTPHeader* header,
-    const RtpHeaderExtensionMap* ptrExtensionMap,
-    const uint8_t* ptrRTPDataExtensionEnd,
-    const uint8_t* ptr) const {
-  if (!ptrExtensionMap) {
-    return;
-  }
-
-  while (ptrRTPDataExtensionEnd - ptr > 0) {
-    //  0
-    //  0 1 2 3 4 5 6 7
-    // +-+-+-+-+-+-+-+-+
-    // |  ID   |  len  |
-    // +-+-+-+-+-+-+-+-+
-
-    // Note that 'len' is the header extension element length, which is the
-    // number of bytes - 1.
-    const int id = (*ptr & 0xf0) >> 4;
-    const int len = (*ptr & 0x0f);
-    ptr++;
-
-    if (id == 0) {
-      // Padding byte, skip ignoring len.
-      continue;
-    }
-
-    if (id == 15) {
-      LOG(LS_VERBOSE)
-          << "RTP extension header 15 encountered. Terminate parsing.";
-      return;
-    }
-
-    if (ptrRTPDataExtensionEnd - ptr < (len + 1)) {
-      LOG(LS_WARNING) << "Incorrect one-byte extension len: " << (len + 1)
-                      << ", bytes left in buffer: "
-                      << (ptrRTPDataExtensionEnd - ptr);
-      return;
-    }
-
-    RTPExtensionType type = ptrExtensionMap->GetType(id);
-    if (type == RtpHeaderExtensionMap::kInvalidType) {
-      // If we encounter an unknown extension, just skip over it.
-      LOG(LS_WARNING) << "Failed to find extension id: " << id;
-    } else {
-      switch (type) {
-        case kRtpExtensionTransmissionTimeOffset: {
-          if (len != 2) {
-            LOG(LS_WARNING) << "Incorrect transmission time offset len: "
-                            << len;
-            return;
-          }
-          //  0                   1                   2                   3
-          //  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
-          // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-          // |  ID   | len=2 |              transmission offset              |
-          // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-
-          header->extension.transmissionTimeOffset =
-              ByteReader<int32_t, 3>::ReadBigEndian(ptr);
-          header->extension.hasTransmissionTimeOffset = true;
-          break;
-        }
-        case kRtpExtensionAudioLevel: {
-          if (len != 0) {
-            LOG(LS_WARNING) << "Incorrect audio level len: " << len;
-            return;
-          }
-          //  0                   1
-          //  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
-          // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-          // |  ID   | len=0 |V|   level     |
-          // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-          //
-          header->extension.audioLevel = ptr[0] & 0x7f;
-          header->extension.voiceActivity = (ptr[0] & 0x80) != 0;
-          header->extension.hasAudioLevel = true;
-          break;
-        }
-        case kRtpExtensionAbsoluteSendTime: {
-          if (len != 2) {
-            LOG(LS_WARNING) << "Incorrect absolute send time len: " << len;
-            return;
-          }
-          //  0                   1                   2                   3
-          //  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
-          // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-          // |  ID   | len=2 |              absolute send time               |
-          // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-
-          header->extension.absoluteSendTime =
-              ByteReader<uint32_t, 3>::ReadBigEndian(ptr);
-          header->extension.hasAbsoluteSendTime = true;
-          break;
-        }
-        case kRtpExtensionVideoRotation: {
-          if (len != 0) {
-            LOG(LS_WARNING)
-                << "Incorrect coordination of video coordination len: " << len;
-            return;
-          }
-          //  0                   1
-          //  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
-          // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-          // |  ID   | len=0 |0 0 0 0 C F R R|
-          // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-          header->extension.hasVideoRotation = true;
-          header->extension.videoRotation =
-              ConvertCVOByteToVideoRotation(ptr[0]);
-          break;
-        }
-        case kRtpExtensionTransportSequenceNumber: {
-          if (len != 1) {
-            LOG(LS_WARNING) << "Incorrect transport sequence number len: "
-                            << len;
-            return;
-          }
-          //   0                   1                   2
-          //   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3
-          //  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-          //  |  ID   | L=1   |transport wide sequence number |
-          //  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-
-          uint16_t sequence_number = ptr[0] << 8;
-          sequence_number += ptr[1];
-          header->extension.transportSequenceNumber = sequence_number;
-          header->extension.hasTransportSequenceNumber = true;
-          break;
-        }
-        case kRtpExtensionPlayoutDelay: {
-          if (len != 2) {
-            LOG(LS_WARNING) << "Incorrect playout delay len: " << len;
-            return;
-          }
-          //   0                   1                   2                   3
-          //   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
-          //  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-          //  |  ID   | len=2 |   MIN delay           |   MAX delay           |
-          //  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-
-          int min_playout_delay = (ptr[0] << 4) | ((ptr[1] >> 4) & 0xf);
-          int max_playout_delay = ((ptr[1] & 0xf) << 8) | ptr[2];
-          header->extension.playout_delay.min_ms =
-              min_playout_delay * PlayoutDelayLimits::kGranularityMs;
-          header->extension.playout_delay.max_ms =
-              max_playout_delay * PlayoutDelayLimits::kGranularityMs;
-          break;
-        }
-        case kRtpExtensionVideoContentType: {
-          if (len != 0) {
-            LOG(LS_WARNING) << "Incorrect video content type len: " << len;
-            return;
-          }
-          //    0                   1
-          //    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
-          //   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-          //   |  ID   | len=0 | Content type  |
-          //   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-
-          if (videocontenttypehelpers::IsValidContentType(ptr[0])) {
-            header->extension.hasVideoContentType = true;
-            header->extension.videoContentType =
-                static_cast<VideoContentType>(ptr[0]);
-          }
-          break;
-        }
-        case kRtpExtensionVideoTiming: {
-          if (len != VideoTimingExtension::kValueSizeBytes - 1) {
-            LOG(LS_WARNING) << "Incorrect video timing len: " << len;
-            return;
-          }
-          header->extension.has_video_timing = true;
-          VideoTimingExtension::Parse(rtc::MakeArrayView(ptr, len + 1),
-                                      &header->extension.video_timing);
-          break;
-        }
-        case kRtpExtensionRtpStreamId: {
-          header->extension.stream_id.Set(rtc::MakeArrayView(ptr, len + 1));
-          break;
-        }
-        case kRtpExtensionRepairedRtpStreamId: {
-          header->extension.repaired_stream_id.Set(
-              rtc::MakeArrayView(ptr, len + 1));
-          break;
-        }
-        case kRtpExtensionMid: {
-          header->extension.mid.Set(rtc::MakeArrayView(ptr, len + 1));
-          break;
-        }
-        case kRtpExtensionNone:
-        case kRtpExtensionNumberOfExtensions: {
-          RTC_NOTREACHED() << "Invalid extension type: " << type;
-          return;
-        }
-      }
-    }
-    ptr += (len + 1);
-  }
-}
-
-}  // namespace RtpUtility
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/rtp_utility.h b/modules/rtp_rtcp/source/rtp_utility.h
deleted file mode 100644
index a1c2b67..0000000
--- a/modules/rtp_rtcp/source/rtp_utility.h
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- *  Copyright (c) 2012 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_RTP_RTCP_SOURCE_RTP_UTILITY_H_
-#define WEBRTC_MODULES_RTP_RTCP_SOURCE_RTP_UTILITY_H_
-
-#include <map>
-
-#include "webrtc/modules/rtp_rtcp/include/receive_statistics.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_header_extension_map.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_rtcp_config.h"
-#include "webrtc/rtc_base/deprecation.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-const uint8_t kRtpMarkerBitMask = 0x80;
-
-RtpFeedback* NullObjectRtpFeedback();
-
-namespace RtpUtility {
-
-struct Payload {
-  char name[RTP_PAYLOAD_NAME_SIZE];
-  bool audio;
-  PayloadUnion typeSpecific;
-};
-
-bool StringCompare(const char* str1, const char* str2, const uint32_t length);
-
-// Round up to the nearest size that is a multiple of 4.
-size_t Word32Align(size_t size);
-
-class RtpHeaderParser {
- public:
-  RtpHeaderParser(const uint8_t* rtpData, size_t rtpDataLength);
-  ~RtpHeaderParser();
-
-  bool RTCP() const;
-  bool ParseRtcp(RTPHeader* header) const;
-  bool Parse(RTPHeader* parsedPacket,
-             RtpHeaderExtensionMap* ptrExtensionMap = nullptr) const;
-
- private:
-  void ParseOneByteExtensionHeader(RTPHeader* parsedPacket,
-                                   const RtpHeaderExtensionMap* ptrExtensionMap,
-                                   const uint8_t* ptrRTPDataExtensionEnd,
-                                   const uint8_t* ptr) const;
-
-  const uint8_t* const _ptrRTPDataBegin;
-  const uint8_t* const _ptrRTPDataEnd;
-};
-}  // namespace RtpUtility
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_RTP_RTCP_SOURCE_RTP_UTILITY_H_
diff --git a/modules/rtp_rtcp/source/rtp_utility_unittest.cc b/modules/rtp_rtcp/source/rtp_utility_unittest.cc
deleted file mode 100644
index ebc452c..0000000
--- a/modules/rtp_rtcp/source/rtp_utility_unittest.cc
+++ /dev/null
@@ -1,272 +0,0 @@
-/*
- *  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/rtp_rtcp/source/rtp_utility.h"
-
-#include "webrtc/modules/rtp_rtcp/include/rtp_header_extension_map.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_header_extensions.h"
-#include "webrtc/test/gmock.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-namespace {
-
-using ::testing::ElementsAreArray;
-using ::testing::make_tuple;
-
-const int8_t kPayloadType = 100;
-const uint32_t kSsrc = 0x12345678;
-const uint16_t kSeqNum = 88;
-const uint32_t kTimestamp = 0x65431278;
-
-}  // namespace
-
-TEST(RtpHeaderParser, ParseMinimum) {
-  // clang-format off
-  const uint8_t kPacket[] = {
-    0x80, kPayloadType, 0x00, kSeqNum,
-    0x65, 0x43, 0x12, 0x78,   // kTimestamp.
-    0x12, 0x34, 0x56, 0x78};  // kSsrc.
-  // clang-format on
-  RtpUtility::RtpHeaderParser parser(kPacket, sizeof(kPacket));
-  RTPHeader header;
-
-  EXPECT_TRUE(parser.Parse(&header, nullptr));
-
-  EXPECT_EQ(kPayloadType, header.payloadType);
-  EXPECT_EQ(kSeqNum, header.sequenceNumber);
-  EXPECT_EQ(kTimestamp, header.timestamp);
-  EXPECT_EQ(kSsrc, header.ssrc);
-  EXPECT_EQ(0u, header.paddingLength);
-  EXPECT_EQ(sizeof(kPacket), header.headerLength);
-}
-
-TEST(RtpHeaderParser, ParseWithExtension) {
-  // clang-format off
-  const uint8_t kPacket[] = {
-    0x90, kPayloadType, 0x00, kSeqNum,
-    0x65, 0x43, 0x12, 0x78,  // kTimestamp.
-    0x12, 0x34, 0x56, 0x78,  // kSsrc.
-    0xbe, 0xde, 0x00, 0x01,  // Extension block of size 1 x 32bit words.
-    0x12, 0x01, 0x56, 0xce};
-  // clang-format on
-  RtpHeaderExtensionMap extensions;
-  extensions.Register<TransmissionOffset>(1);
-  RtpUtility::RtpHeaderParser parser(kPacket, sizeof(kPacket));
-  RTPHeader header;
-
-  EXPECT_TRUE(parser.Parse(&header, &extensions));
-
-  EXPECT_EQ(kPayloadType, header.payloadType);
-  EXPECT_EQ(kSeqNum, header.sequenceNumber);
-  EXPECT_EQ(kTimestamp, header.timestamp);
-  EXPECT_EQ(kSsrc, header.ssrc);
-
-  ASSERT_TRUE(header.extension.hasTransmissionTimeOffset);
-  EXPECT_EQ(0x156ce, header.extension.transmissionTimeOffset);
-}
-
-TEST(RtpHeaderParser, ParseWithInvalidSizedExtension) {
-  const size_t kPayloadSize = 7;
-  // clang-format off
-  const uint8_t kPacket[] = {
-      0x90, kPayloadType, 0x00, kSeqNum,
-      0x65, 0x43, 0x12, 0x78,  // kTimestamp.
-      0x12, 0x34, 0x56, 0x78,  // kSsrc.
-      0xbe, 0xde, 0x00, 0x02,  // Extension block of size 2 x 32bit words.
-      0x16,  // (6+1)-bytes, but Transmission Offset expected to be 3-bytes.
-             'e',  'x',  't',
-       'd',  'a',  't',  'a',
-       'p',  'a',  'y',  'l',  'o',  'a',  'd'
-  };
-  // clang-format on
-  RtpHeaderExtensionMap extensions;
-  extensions.Register<TransmissionOffset>(1);
-  RtpUtility::RtpHeaderParser parser(kPacket, sizeof(kPacket));
-  RTPHeader header;
-
-  EXPECT_TRUE(parser.Parse(&header, &extensions));
-
-  // Extension should be ignored.
-  EXPECT_FALSE(header.extension.hasTransmissionTimeOffset);
-  // But shouldn't prevent reading payload.
-  EXPECT_THAT(sizeof(kPacket) - kPayloadSize, header.headerLength);
-}
-
-TEST(RtpHeaderParser, ParseWithExtensionPadding) {
-  // clang-format off
-  const uint8_t kPacket[] = {
-      0x90, kPayloadType, 0x00, kSeqNum,
-      0x65, 0x43, 0x12, 0x78,  // kTimestamp.
-      0x12, 0x34, 0x56, 0x78,  // kSsrc.
-      0xbe, 0xde, 0x00, 0x02,  // Extension of size 1x32bit word.
-      0x02,  // A byte of (invalid) padding.
-      0x12, 0x1a, 0xda, 0x03,  // TransmissionOffset extension.
-      0x0f, 0x00, 0x03,  // More invalid padding bytes: id=0, but len > 0.
-  };
-  // clang-format on
-  RtpHeaderExtensionMap extensions;
-  extensions.Register<TransmissionOffset>(1);
-  RtpUtility::RtpHeaderParser parser(kPacket, sizeof(kPacket));
-  RTPHeader header;
-
-  EXPECT_TRUE(parser.Parse(&header, &extensions));
-
-  // Parse should skip padding and read extension.
-  EXPECT_TRUE(header.extension.hasTransmissionTimeOffset);
-  EXPECT_EQ(0x1ada03, header.extension.transmissionTimeOffset);
-  EXPECT_EQ(sizeof(kPacket), header.headerLength);
-}
-
-TEST(RtpHeaderParser, ParseWithOverSizedExtension) {
-  // clang-format off
-  const uint8_t kPacket[] = {
-      0x90, kPayloadType, 0x00, kSeqNum,
-      0x65, 0x43, 0x12, 0x78,  // kTimestamp.
-      0x12, 0x34, 0x56, 0x78,  // kSsrc.
-      0xbe, 0xde, 0x00, 0x01,  // Extension of size 1x32bit word.
-      0x00,  // Add a byte of padding.
-            0x12,  // Extension id 1 size (2+1).
-                  0xda, 0x1a  // Only 2 bytes of extension payload.
-  };
-  // clang-format on
-  RtpHeaderExtensionMap extensions;
-  extensions.Register<TransmissionOffset>(1);
-  RtpUtility::RtpHeaderParser parser(kPacket, sizeof(kPacket));
-  RTPHeader header;
-
-  EXPECT_TRUE(parser.Parse(&header, &extensions));
-
-  // Parse should ignore extension.
-  EXPECT_FALSE(header.extension.hasTransmissionTimeOffset);
-  EXPECT_EQ(sizeof(kPacket), header.headerLength);
-}
-
-TEST(RtpHeaderParser, ParseAll8Extensions) {
-  const uint8_t kAudioLevel = 0x5a;
-  // clang-format off
-  const uint8_t kPacket[] = {
-      0x90, kPayloadType, 0x00, kSeqNum,
-      0x65, 0x43, 0x12, 0x78,  // kTimestamp.
-      0x12, 0x34, 0x56, 0x78,  // kSsrc.
-      0xbe, 0xde, 0x00, 0x08,  // Extension of size 8x32bit words.
-      0x40, 0x80|kAudioLevel,  // AudioLevel.
-      0x22, 0x01, 0x56, 0xce,  // TransmissionOffset.
-      0x62, 0x12, 0x34, 0x56,  // AbsoluteSendTime.
-      0x81, 0xce, 0xab,        // TransportSequenceNumber.
-      0xa0, 0x03,              // VideoRotation.
-      0xb2, 0x12, 0x48, 0x76,  // PlayoutDelayLimits.
-      0xc2, 'r', 't', 'x',     // RtpStreamId
-      0xd5, 's', 't', 'r', 'e', 'a', 'm',  // RepairedRtpStreamId
-      0x00, 0x00,              // Padding to 32bit boundary.
-  };
-  // clang-format on
-  ASSERT_EQ(sizeof(kPacket) % 4, 0u);
-
-  RtpHeaderExtensionMap extensions;
-  extensions.Register<TransmissionOffset>(2);
-  extensions.Register<AudioLevel>(4);
-  extensions.Register<AbsoluteSendTime>(6);
-  extensions.Register<TransportSequenceNumber>(8);
-  extensions.Register<VideoOrientation>(0xa);
-  extensions.Register<PlayoutDelayLimits>(0xb);
-  extensions.Register<RtpStreamId>(0xc);
-  extensions.Register<RepairedRtpStreamId>(0xd);
-  RtpUtility::RtpHeaderParser parser(kPacket, sizeof(kPacket));
-  RTPHeader header;
-
-  EXPECT_TRUE(parser.Parse(&header, &extensions));
-
-  EXPECT_TRUE(header.extension.hasTransmissionTimeOffset);
-  EXPECT_EQ(0x156ce, header.extension.transmissionTimeOffset);
-
-  EXPECT_TRUE(header.extension.hasAudioLevel);
-  EXPECT_TRUE(header.extension.voiceActivity);
-  EXPECT_EQ(kAudioLevel, header.extension.audioLevel);
-
-  EXPECT_TRUE(header.extension.hasAbsoluteSendTime);
-  EXPECT_EQ(0x123456U, header.extension.absoluteSendTime);
-
-  EXPECT_TRUE(header.extension.hasTransportSequenceNumber);
-  EXPECT_EQ(0xceab, header.extension.transportSequenceNumber);
-
-  EXPECT_TRUE(header.extension.hasVideoRotation);
-  EXPECT_EQ(kVideoRotation_270, header.extension.videoRotation);
-
-  EXPECT_EQ(0x124 * PlayoutDelayLimits::kGranularityMs,
-            header.extension.playout_delay.min_ms);
-  EXPECT_EQ(0x876 * PlayoutDelayLimits::kGranularityMs,
-            header.extension.playout_delay.max_ms);
-  EXPECT_EQ(header.extension.stream_id, StreamId("rtx"));
-  EXPECT_EQ(header.extension.repaired_stream_id, StreamId("stream"));
-}
-
-TEST(RtpHeaderParser, ParseMalformedRsidExtensions) {
-  // clang-format off
-  const uint8_t kPacket[] = {
-      0x90, kPayloadType, 0x00, kSeqNum,
-      0x65, 0x43, 0x12, 0x78,  // kTimestamp.
-      0x12, 0x34, 0x56, 0x78,  // kSsrc.
-      0xbe, 0xde, 0x00, 0x03,  // Extension of size 3x32bit words.
-      0xc2, '\0', 't', 'x',    // empty RtpStreamId
-      0xd5, 's', 't', 'r', '\0', 'a', 'm',  // RepairedRtpStreamId
-      0x00,                    // Padding to 32bit boundary.
-  };
-  // clang-format on
-  ASSERT_EQ(sizeof(kPacket) % 4, 0u);
-
-  RtpHeaderExtensionMap extensions;
-  extensions.Register<RtpStreamId>(0xc);
-  extensions.Register<RepairedRtpStreamId>(0xd);
-  RtpUtility::RtpHeaderParser parser(kPacket, sizeof(kPacket));
-  RTPHeader header;
-
-  EXPECT_TRUE(parser.Parse(&header, &extensions));
-  EXPECT_TRUE(header.extension.stream_id.empty());
-  EXPECT_EQ(header.extension.repaired_stream_id, StreamId("str"));
-}
-
-TEST(RtpHeaderParser, ParseWithCsrcsExtensionAndPadding) {
-  const uint8_t kPacketPaddingSize = 8;
-  const uint32_t kCsrcs[] = {0x34567890, 0x32435465};
-  const size_t kPayloadSize = 7;
-  // clang-format off
-  const uint8_t kPacket[] = {
-    0xb2, kPayloadType, 0x00, kSeqNum,
-    0x65, 0x43, 0x12, 0x78,  // kTimestamp.
-    0x12, 0x34, 0x56, 0x78,  // kSsrc.
-    0x34, 0x56, 0x78, 0x90,  // kCsrcs[0].
-    0x32, 0x43, 0x54, 0x65,  // kCsrcs[1].
-    0xbe, 0xde, 0x00, 0x01,  // Extension.
-    0x12, 0x00, 0x56, 0xce,  // TransmissionTimeOffset with id = 1.
-    'p', 'a', 'y', 'l', 'o', 'a', 'd',
-    'p', 'a', 'd', 'd', 'i', 'n', 'g', kPacketPaddingSize};
-  // clang-format on
-  RtpHeaderExtensionMap extensions;
-  extensions.Register<TransmissionOffset>(1);
-  RtpUtility::RtpHeaderParser parser(kPacket, sizeof(kPacket));
-  RTPHeader header;
-
-  EXPECT_TRUE(parser.Parse(&header, &extensions));
-
-  EXPECT_EQ(kPayloadType, header.payloadType);
-  EXPECT_EQ(kSeqNum, header.sequenceNumber);
-  EXPECT_EQ(kTimestamp, header.timestamp);
-  EXPECT_EQ(kSsrc, header.ssrc);
-  EXPECT_THAT(make_tuple(header.arrOfCSRCs, header.numCSRCs),
-              ElementsAreArray(kCsrcs));
-  EXPECT_EQ(kPacketPaddingSize, header.paddingLength);
-  EXPECT_THAT(sizeof(kPacket) - kPayloadSize - kPacketPaddingSize,
-              header.headerLength);
-  EXPECT_TRUE(header.extension.hasTransmissionTimeOffset);
-  EXPECT_EQ(0x56ce, header.extension.transmissionTimeOffset);
-}
-
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/time_util.cc b/modules/rtp_rtcp/source/time_util.cc
deleted file mode 100644
index dedba4d..0000000
--- a/modules/rtp_rtcp/source/time_util.cc
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- *  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/rtp_rtcp/source/time_util.h"
-
-#include <algorithm>
-
-namespace webrtc {
-namespace {
-// TODO(danilchap): Make generic, optimize and move to base.
-inline int64_t DivideRoundToNearest(int64_t x, uint32_t y) {
-  // Caller ensure x is positive by converting unsigned value into it.
-  // So this Divide doesn't need to handle negative argument case.
-  return (x + y / 2) / y;
-}
-}  // namespace
-
-int64_t CompactNtpRttToMs(uint32_t compact_ntp_interval) {
-  // Interval to convert expected to be positive, e.g. rtt or delay.
-  // Because interval can be derived from non-monotonic ntp clock,
-  // it might become negative that is indistinguishable from very large values.
-  // Since very large rtt/delay are less likely than non-monotonic ntp clock,
-  // those values consider to be negative and convert to minimum value of 1ms.
-  if (compact_ntp_interval > 0x80000000)
-    return 1;
-  // Convert to 64bit value to avoid multiplication overflow.
-  int64_t value = static_cast<int64_t>(compact_ntp_interval);
-  // To convert to milliseconds need to divide by 2^16 to get seconds,
-  // then multiply by 1000 to get milliseconds. To avoid float operations,
-  // multiplication and division swapped.
-  int64_t ms = DivideRoundToNearest(value * 1000, 1 << 16);
-  // Rtt value 0 considered too good to be true and increases to 1.
-  return std::max<int64_t>(ms, 1);
-}
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/time_util.h b/modules/rtp_rtcp/source/time_util.h
deleted file mode 100644
index 69bbb0a..0000000
--- a/modules/rtp_rtcp/source/time_util.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- *  Copyright (c) 2015 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_RTP_RTCP_SOURCE_TIME_UTIL_H_
-#define WEBRTC_MODULES_RTP_RTCP_SOURCE_TIME_UTIL_H_
-
-#include <stdint.h>
-
-#include "webrtc/system_wrappers/include/ntp_time.h"
-
-namespace webrtc {
-
-// Converts NTP timestamp to RTP timestamp.
-inline uint32_t NtpToRtp(NtpTime ntp, uint32_t freq) {
-  uint32_t tmp = (static_cast<uint64_t>(ntp.fractions()) * freq) >> 32;
-  return ntp.seconds() * freq + tmp;
-}
-
-// Helper function for compact ntp representation:
-// RFC 3550, Section 4. Time Format.
-// Wallclock time is represented using the timestamp format of
-// the Network Time Protocol (NTP).
-// ...
-// In some fields where a more compact representation is
-// appropriate, only the middle 32 bits are used; that is, the low 16
-// bits of the integer part and the high 16 bits of the fractional part.
-inline uint32_t CompactNtp(NtpTime ntp) {
-  return (ntp.seconds() << 16) | (ntp.fractions() >> 16);
-}
-// Converts interval between compact ntp timestamps to milliseconds.
-// This interval can be up to ~9.1 hours (2^15 seconds).
-// Values close to 2^16 seconds consider negative and result in minimum rtt = 1.
-int64_t CompactNtpRttToMs(uint32_t compact_ntp_interval);
-
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_RTP_RTCP_SOURCE_TIME_UTIL_H_
diff --git a/modules/rtp_rtcp/source/time_util_unittest.cc b/modules/rtp_rtcp/source/time_util_unittest.cc
deleted file mode 100644
index 54733b3..0000000
--- a/modules/rtp_rtcp/source/time_util_unittest.cc
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- *  Copyright (c) 2015 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/rtp_rtcp/source/time_util.h"
-
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-TEST(TimeUtilTest, CompactNtp) {
-  const uint32_t kNtpSec = 0x12345678;
-  const uint32_t kNtpFrac = 0x23456789;
-  const NtpTime kNtp(kNtpSec, kNtpFrac);
-  const uint32_t kNtpMid = 0x56782345;
-  EXPECT_EQ(kNtpMid, CompactNtp(kNtp));
-}
-
-TEST(TimeUtilTest, CompactNtpRttToMs) {
-  const NtpTime ntp1(0x12345, 0x23456);
-  const NtpTime ntp2(0x12654, 0x64335);
-  int64_t ms_diff = ntp2.ToMs() - ntp1.ToMs();
-  uint32_t ntp_diff = CompactNtp(ntp2) - CompactNtp(ntp1);
-
-  int64_t ntp_to_ms_diff = CompactNtpRttToMs(ntp_diff);
-
-  EXPECT_NEAR(ms_diff, ntp_to_ms_diff, 1);
-}
-
-TEST(TimeUtilTest, CompactNtpRttToMsWithWrap) {
-  const NtpTime ntp1(0x1ffff, 0x23456);
-  const NtpTime ntp2(0x20000, 0x64335);
-  int64_t ms_diff = ntp2.ToMs() - ntp1.ToMs();
-
-  // While ntp2 > ntp1, there compact ntp presentation happen to be opposite.
-  // That shouldn't be a problem as long as unsigned arithmetic is used.
-  ASSERT_GT(ntp2.ToMs(), ntp1.ToMs());
-  ASSERT_LT(CompactNtp(ntp2), CompactNtp(ntp1));
-
-  uint32_t ntp_diff = CompactNtp(ntp2) - CompactNtp(ntp1);
-  int64_t ntp_to_ms_diff = CompactNtpRttToMs(ntp_diff);
-
-  EXPECT_NEAR(ms_diff, ntp_to_ms_diff, 1);
-}
-
-TEST(TimeUtilTest, CompactNtpRttToMsLarge) {
-  const NtpTime ntp1(0x10000, 0x00006);
-  const NtpTime ntp2(0x17fff, 0xffff5);
-  int64_t ms_diff = ntp2.ToMs() - ntp1.ToMs();
-  // Ntp difference close to 2^15 seconds should convert correctly too.
-  ASSERT_NEAR(ms_diff, ((1 << 15) - 1) * 1000, 1);
-  uint32_t ntp_diff = CompactNtp(ntp2) - CompactNtp(ntp1);
-  int64_t ntp_to_ms_diff = CompactNtpRttToMs(ntp_diff);
-
-  EXPECT_NEAR(ms_diff, ntp_to_ms_diff, 1);
-}
-
-TEST(TimeUtilTest, CompactNtpRttToMsNegative) {
-  const NtpTime ntp1(0x20000, 0x23456);
-  const NtpTime ntp2(0x1ffff, 0x64335);
-  int64_t ms_diff = ntp2.ToMs() - ntp1.ToMs();
-  ASSERT_GT(0, ms_diff);
-  // Ntp difference close to 2^16 seconds should be treated as negative.
-  uint32_t ntp_diff = CompactNtp(ntp2) - CompactNtp(ntp1);
-  int64_t ntp_to_ms_diff = CompactNtpRttToMs(ntp_diff);
-  EXPECT_EQ(1, ntp_to_ms_diff);
-}
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/tmmbr_help.cc b/modules/rtp_rtcp/source/tmmbr_help.cc
deleted file mode 100644
index 2390d06..0000000
--- a/modules/rtp_rtcp/source/tmmbr_help.cc
+++ /dev/null
@@ -1,182 +0,0 @@
-/*
- *  Copyright (c) 2012 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/rtp_rtcp/source/tmmbr_help.h"
-
-#include <algorithm>
-#include <limits>
-
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-std::vector<rtcp::TmmbItem> TMMBRHelp::FindBoundingSet(
-    std::vector<rtcp::TmmbItem> candidates) {
-  // Filter out candidates with 0 bitrate.
-  for (auto it = candidates.begin(); it != candidates.end();) {
-    if (!it->bitrate_bps())
-      it = candidates.erase(it);
-    else
-      ++it;
-  }
-
-  if (candidates.size() <= 1)
-    return candidates;
-
-  size_t num_candidates = candidates.size();
-
-  // 1. Sort by increasing packet overhead.
-  std::sort(candidates.begin(), candidates.end(),
-            [](const rtcp::TmmbItem& lhs, const rtcp::TmmbItem& rhs) {
-              return lhs.packet_overhead() < rhs.packet_overhead();
-            });
-
-  // 2. For tuples with same overhead, keep the one with the lowest bitrate.
-  for (auto it = candidates.begin(); it != candidates.end();) {
-    RTC_DCHECK(it->bitrate_bps());
-    auto current_min = it;
-    auto next_it = it + 1;
-    // Use fact candidates are sorted by overhead, so candidates with same
-    // overhead are adjusted.
-    while (next_it != candidates.end() &&
-           next_it->packet_overhead() == current_min->packet_overhead()) {
-      if (next_it->bitrate_bps() < current_min->bitrate_bps()) {
-        current_min->set_bitrate_bps(0);
-        current_min = next_it;
-      } else {
-        next_it->set_bitrate_bps(0);
-      }
-      ++next_it;
-      --num_candidates;
-    }
-    it = next_it;
-  }
-
-  // 3. Select and remove tuple with lowest bitrate.
-  // (If more than 1, choose the one with highest overhead).
-  auto min_bitrate_it = candidates.end();
-  for (auto it = candidates.begin(); it != candidates.end(); ++it) {
-    if (it->bitrate_bps()) {
-      min_bitrate_it = it;
-      break;
-    }
-  }
-
-  for (auto it = min_bitrate_it; it != candidates.end(); ++it) {
-    if (it->bitrate_bps() &&
-        it->bitrate_bps() <= min_bitrate_it->bitrate_bps()) {
-      // Get min bitrate.
-      min_bitrate_it = it;
-    }
-  }
-
-  std::vector<rtcp::TmmbItem> bounding_set;
-  bounding_set.reserve(num_candidates);
-  std::vector<float> intersection(num_candidates);
-  std::vector<float> max_packet_rate(num_candidates);
-
-  // First member of selected list.
-  bounding_set.push_back(*min_bitrate_it);
-  intersection[0] = 0;
-  // Calculate its maximum packet rate (where its line crosses x-axis).
-  uint16_t packet_overhead = bounding_set.back().packet_overhead();
-  if (packet_overhead == 0) {
-    // Avoid division by zero.
-    max_packet_rate[0] = std::numeric_limits<float>::max();
-  } else {
-    max_packet_rate[0] =
-        bounding_set.back().bitrate_bps() / static_cast<float>(packet_overhead);
-  }
-  // Remove from candidate list.
-  min_bitrate_it->set_bitrate_bps(0);
-  --num_candidates;
-
-  // 4. Discard from candidate list all tuple with lower overhead
-  // (next tuple must be steeper).
-  for (auto it = candidates.begin(); it != candidates.end(); ++it) {
-    if (it->bitrate_bps() &&
-        it->packet_overhead() < bounding_set.front().packet_overhead()) {
-      it->set_bitrate_bps(0);
-      --num_candidates;
-    }
-  }
-
-  bool get_new_candidate = true;
-  rtcp::TmmbItem cur_candidate;
-  while (num_candidates > 0) {
-    if (get_new_candidate) {
-      // 5. Remove first remaining tuple from candidate list.
-      for (auto it = candidates.begin(); it != candidates.end(); ++it) {
-        if (it->bitrate_bps()) {
-          cur_candidate = *it;
-          it->set_bitrate_bps(0);
-          break;
-        }
-      }
-    }
-
-    // 6. Calculate packet rate and intersection of the current
-    // line with line of last tuple in selected list.
-    RTC_DCHECK_NE(cur_candidate.packet_overhead(),
-                  bounding_set.back().packet_overhead());
-    float packet_rate = static_cast<float>(cur_candidate.bitrate_bps() -
-                                           bounding_set.back().bitrate_bps()) /
-                        (cur_candidate.packet_overhead() -
-                         bounding_set.back().packet_overhead());
-
-    // 7. If the packet rate is equal or lower than intersection of
-    //    last tuple in selected list,
-    //    remove last tuple in selected list & go back to step 6.
-    if (packet_rate <= intersection[bounding_set.size() - 1]) {
-      // Remove last tuple and goto step 6.
-      bounding_set.pop_back();
-      get_new_candidate = false;
-    } else {
-      // 8. If packet rate is lower than maximum packet rate of
-      // last tuple in selected list, add current tuple to selected
-      // list.
-      if (packet_rate < max_packet_rate[bounding_set.size() - 1]) {
-        bounding_set.push_back(cur_candidate);
-        intersection[bounding_set.size() - 1] = packet_rate;
-        uint16_t packet_overhead = bounding_set.back().packet_overhead();
-        RTC_DCHECK_NE(packet_overhead, 0);
-        max_packet_rate[bounding_set.size() - 1] =
-            bounding_set.back().bitrate_bps() /
-            static_cast<float>(packet_overhead);
-      }
-      --num_candidates;
-      get_new_candidate = true;
-    }
-
-    // 9. Go back to step 5 if any tuple remains in candidate list.
-  }
-  RTC_DCHECK(!bounding_set.empty());
-  return bounding_set;
-}
-
-bool TMMBRHelp::IsOwner(const std::vector<rtcp::TmmbItem>& bounding,
-                        uint32_t ssrc) {
-  for (const rtcp::TmmbItem& item : bounding) {
-    if (item.ssrc() == ssrc) {
-      return true;
-    }
-  }
-  return false;
-}
-
-uint64_t TMMBRHelp::CalcMinBitrateBps(
-    const std::vector<rtcp::TmmbItem>& candidates) {
-  RTC_DCHECK(!candidates.empty());
-  uint64_t min_bitrate_bps = std::numeric_limits<uint64_t>::max();
-  for (const rtcp::TmmbItem& item : candidates)
-    if (item.bitrate_bps() < min_bitrate_bps)
-      min_bitrate_bps = item.bitrate_bps();
-  return min_bitrate_bps;
-}
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/tmmbr_help.h b/modules/rtp_rtcp/source/tmmbr_help.h
deleted file mode 100644
index 9bd09c3..0000000
--- a/modules/rtp_rtcp/source/tmmbr_help.h
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- *  Copyright (c) 2012 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_RTP_RTCP_SOURCE_TMMBR_HELP_H_
-#define WEBRTC_MODULES_RTP_RTCP_SOURCE_TMMBR_HELP_H_
-
-#include <vector>
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/tmmb_item.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-class TMMBRHelp {
- public:
-  static std::vector<rtcp::TmmbItem> FindBoundingSet(
-      std::vector<rtcp::TmmbItem> candidates);
-
-  static bool IsOwner(const std::vector<rtcp::TmmbItem>& bounding,
-                      uint32_t ssrc);
-
-  static uint64_t CalcMinBitrateBps(
-      const std::vector<rtcp::TmmbItem>& candidates);
-};
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_RTP_RTCP_SOURCE_TMMBR_HELP_H_
diff --git a/modules/rtp_rtcp/source/ulpfec_generator.cc b/modules/rtp_rtcp/source/ulpfec_generator.cc
deleted file mode 100644
index fa7505e..0000000
--- a/modules/rtp_rtcp/source/ulpfec_generator.cc
+++ /dev/null
@@ -1,258 +0,0 @@
-/*
- *  Copyright (c) 2012 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/rtp_rtcp/source/ulpfec_generator.h"
-
-#include <memory>
-#include <utility>
-
-#include "webrtc/modules/rtp_rtcp/source/byte_io.h"
-#include "webrtc/modules/rtp_rtcp/source/forward_error_correction.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_utility.h"
-#include "webrtc/rtc_base/basictypes.h"
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-
-namespace {
-
-constexpr size_t kRedForFecHeaderLength = 1;
-
-// This controls the maximum amount of excess overhead (actual - target)
-// allowed in order to trigger EncodeFec(), before |params_.max_fec_frames|
-// is reached. Overhead here is defined as relative to number of media packets.
-constexpr int kMaxExcessOverhead = 50;  // Q8.
-
-// This is the minimum number of media packets required (above some protection
-// level) in order to trigger EncodeFec(), before |params_.max_fec_frames| is
-// reached.
-constexpr size_t kMinMediaPackets = 4;
-
-// Threshold on the received FEC protection level, above which we enforce at
-// least |kMinMediaPackets| packets for the FEC code. Below this
-// threshold |kMinMediaPackets| is set to default value of 1.
-//
-// The range is between 0 and 255, where 255 corresponds to 100% overhead
-// (relative to the number of protected media packets).
-constexpr uint8_t kHighProtectionThreshold = 80;
-
-// This threshold is used to adapt the |kMinMediaPackets| threshold, based
-// on the average number of packets per frame seen so far. When there are few
-// packets per frame (as given by this threshold), at least
-// |kMinMediaPackets| + 1 packets are sent to the FEC code.
-constexpr float kMinMediaPacketsAdaptationThreshold = 2.0f;
-
-// At construction time, we don't know the SSRC that is used for the generated
-// FEC packets, but we still need to give it to the ForwardErrorCorrection ctor
-// to be used in the decoding.
-// TODO(brandtr): Get rid of this awkwardness by splitting
-// ForwardErrorCorrection in two objects -- one encoder and one decoder.
-constexpr uint32_t kUnknownSsrc = 0;
-
-}  // namespace
-
-RedPacket::RedPacket(size_t length)
-    : data_(new uint8_t[length]), length_(length), header_length_(0) {}
-
-void RedPacket::CreateHeader(const uint8_t* rtp_header,
-                             size_t header_length,
-                             int red_payload_type,
-                             int payload_type) {
-  RTC_DCHECK_LE(header_length + kRedForFecHeaderLength, length_);
-  memcpy(data_.get(), rtp_header, header_length);
-  // Replace payload type.
-  data_[1] &= 0x80;
-  data_[1] += red_payload_type;
-  // Add RED header
-  // f-bit always 0
-  data_[header_length] = static_cast<uint8_t>(payload_type);
-  header_length_ = header_length + kRedForFecHeaderLength;
-}
-
-void RedPacket::SetSeqNum(int seq_num) {
-  RTC_DCHECK_GE(seq_num, 0);
-  RTC_DCHECK_LT(seq_num, 1 << 16);
-
-  ByteWriter<uint16_t>::WriteBigEndian(&data_[2], seq_num);
-}
-
-void RedPacket::AssignPayload(const uint8_t* payload, size_t length) {
-  RTC_DCHECK_LE(header_length_ + length, length_);
-  memcpy(data_.get() + header_length_, payload, length);
-}
-
-void RedPacket::ClearMarkerBit() {
-  data_[1] &= 0x7F;
-}
-
-uint8_t* RedPacket::data() const {
-  return data_.get();
-}
-
-size_t RedPacket::length() const {
-  return length_;
-}
-
-UlpfecGenerator::UlpfecGenerator()
-    : UlpfecGenerator(ForwardErrorCorrection::CreateUlpfec(kUnknownSsrc)) {}
-
-UlpfecGenerator::UlpfecGenerator(std::unique_ptr<ForwardErrorCorrection> fec)
-    : fec_(std::move(fec)),
-      num_protected_frames_(0),
-      min_num_media_packets_(1) {
-  memset(&params_, 0, sizeof(params_));
-  memset(&new_params_, 0, sizeof(new_params_));
-}
-
-UlpfecGenerator::~UlpfecGenerator() = default;
-
-std::unique_ptr<RedPacket> UlpfecGenerator::BuildRedPacket(
-    const uint8_t* data_buffer,
-    size_t payload_length,
-    size_t rtp_header_length,
-    int red_payload_type) {
-  std::unique_ptr<RedPacket> red_packet(new RedPacket(
-      payload_length + kRedForFecHeaderLength + rtp_header_length));
-  int payload_type = data_buffer[1] & 0x7f;
-  red_packet->CreateHeader(data_buffer, rtp_header_length, red_payload_type,
-                           payload_type);
-  red_packet->AssignPayload(data_buffer + rtp_header_length, payload_length);
-  return red_packet;
-}
-
-void UlpfecGenerator::SetFecParameters(const FecProtectionParams& params) {
-  RTC_DCHECK_GE(params.fec_rate, 0);
-  RTC_DCHECK_LE(params.fec_rate, 255);
-  // Store the new params and apply them for the next set of FEC packets being
-  // produced.
-  new_params_ = params;
-  if (params.fec_rate > kHighProtectionThreshold) {
-    min_num_media_packets_ = kMinMediaPackets;
-  } else {
-    min_num_media_packets_ = 1;
-  }
-}
-
-int UlpfecGenerator::AddRtpPacketAndGenerateFec(const uint8_t* data_buffer,
-                                                size_t payload_length,
-                                                size_t rtp_header_length) {
-  RTC_DCHECK(generated_fec_packets_.empty());
-  if (media_packets_.empty()) {
-    params_ = new_params_;
-  }
-  bool complete_frame = false;
-  const bool marker_bit = (data_buffer[1] & kRtpMarkerBitMask) ? true : false;
-  if (media_packets_.size() < kUlpfecMaxMediaPackets) {
-    // Our packet masks can only protect up to |kUlpfecMaxMediaPackets| packets.
-    std::unique_ptr<ForwardErrorCorrection::Packet> packet(
-        new ForwardErrorCorrection::Packet());
-    packet->length = payload_length + rtp_header_length;
-    memcpy(packet->data, data_buffer, packet->length);
-    media_packets_.push_back(std::move(packet));
-  }
-  if (marker_bit) {
-    ++num_protected_frames_;
-    complete_frame = true;
-  }
-  // Produce FEC over at most |params_.max_fec_frames| frames, or as soon as:
-  // (1) the excess overhead (actual overhead - requested/target overhead) is
-  // less than |kMaxExcessOverhead|, and
-  // (2) at least |min_num_media_packets_| media packets is reached.
-  if (complete_frame &&
-      (num_protected_frames_ == params_.max_fec_frames ||
-       (ExcessOverheadBelowMax() && MinimumMediaPacketsReached()))) {
-    // We are not using Unequal Protection feature of the parity erasure code.
-    constexpr int kNumImportantPackets = 0;
-    constexpr bool kUseUnequalProtection = false;
-    int ret = fec_->EncodeFec(media_packets_, params_.fec_rate,
-                              kNumImportantPackets, kUseUnequalProtection,
-                              params_.fec_mask_type, &generated_fec_packets_);
-    if (generated_fec_packets_.empty()) {
-      ResetState();
-    }
-    return ret;
-  }
-  return 0;
-}
-
-bool UlpfecGenerator::ExcessOverheadBelowMax() const {
-  return ((Overhead() - params_.fec_rate) < kMaxExcessOverhead);
-}
-
-bool UlpfecGenerator::MinimumMediaPacketsReached() const {
-  float average_num_packets_per_frame =
-      static_cast<float>(media_packets_.size()) / num_protected_frames_;
-  int num_media_packets = static_cast<int>(media_packets_.size());
-  if (average_num_packets_per_frame < kMinMediaPacketsAdaptationThreshold) {
-    return num_media_packets >= min_num_media_packets_;
-  } else {
-    // For larger rates (more packets/frame), increase the threshold.
-    // TODO(brandtr): Investigate what impact this adaptation has.
-    return num_media_packets >= min_num_media_packets_ + 1;
-  }
-}
-
-bool UlpfecGenerator::FecAvailable() const {
-  return !generated_fec_packets_.empty();
-}
-
-size_t UlpfecGenerator::NumAvailableFecPackets() const {
-  return generated_fec_packets_.size();
-}
-
-size_t UlpfecGenerator::MaxPacketOverhead() const {
-  return fec_->MaxPacketOverhead();
-}
-
-std::vector<std::unique_ptr<RedPacket>> UlpfecGenerator::GetUlpfecPacketsAsRed(
-    int red_payload_type,
-    int ulpfec_payload_type,
-    uint16_t first_seq_num,
-    size_t rtp_header_length) {
-  std::vector<std::unique_ptr<RedPacket>> red_packets;
-  red_packets.reserve(generated_fec_packets_.size());
-  RTC_DCHECK(!media_packets_.empty());
-  ForwardErrorCorrection::Packet* last_media_packet =
-      media_packets_.back().get();
-  uint16_t seq_num = first_seq_num;
-  for (const auto& fec_packet : generated_fec_packets_) {
-    // Wrap FEC packet (including FEC headers) in a RED packet. Since the
-    // FEC packets in |generated_fec_packets_| don't have RTP headers, we
-    // reuse the header from the last media packet.
-    std::unique_ptr<RedPacket> red_packet(new RedPacket(
-        fec_packet->length + kRedForFecHeaderLength + rtp_header_length));
-    red_packet->CreateHeader(last_media_packet->data, rtp_header_length,
-                             red_payload_type, ulpfec_payload_type);
-    red_packet->SetSeqNum(seq_num++);
-    red_packet->ClearMarkerBit();
-    red_packet->AssignPayload(fec_packet->data, fec_packet->length);
-    red_packets.push_back(std::move(red_packet));
-  }
-
-  ResetState();
-
-  return red_packets;
-}
-
-int UlpfecGenerator::Overhead() const {
-  RTC_DCHECK(!media_packets_.empty());
-  int num_fec_packets =
-      fec_->NumFecPackets(media_packets_.size(), params_.fec_rate);
-  // Return the overhead in Q8.
-  return (num_fec_packets << 8) / media_packets_.size();
-}
-
-void UlpfecGenerator::ResetState() {
-  media_packets_.clear();
-  generated_fec_packets_.clear();
-  num_protected_frames_ = 0;
-}
-
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/ulpfec_generator.h b/modules/rtp_rtcp/source/ulpfec_generator.h
deleted file mode 100644
index 52e03cd..0000000
--- a/modules/rtp_rtcp/source/ulpfec_generator.h
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- *  Copyright (c) 2012 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_RTP_RTCP_SOURCE_ULPFEC_GENERATOR_H_
-#define WEBRTC_MODULES_RTP_RTCP_SOURCE_ULPFEC_GENERATOR_H_
-
-#include <list>
-#include <memory>
-#include <vector>
-
-#include "webrtc/modules/rtp_rtcp/source/forward_error_correction.h"
-
-namespace webrtc {
-
-class FlexfecSender;
-
-class RedPacket {
- public:
-  explicit RedPacket(size_t length);
-
-  void CreateHeader(const uint8_t* rtp_header,
-                    size_t header_length,
-                    int red_payload_type,
-                    int payload_type);
-  void SetSeqNum(int seq_num);
-  void AssignPayload(const uint8_t* payload, size_t length);
-  void ClearMarkerBit();
-  uint8_t* data() const;
-  size_t length() const;
-
- private:
-  std::unique_ptr<uint8_t[]> data_;
-  size_t length_;
-  size_t header_length_;
-};
-
-class UlpfecGenerator {
-  friend class FlexfecSender;
-
- public:
-  UlpfecGenerator();
-  ~UlpfecGenerator();
-
-  static std::unique_ptr<RedPacket> BuildRedPacket(const uint8_t* data_buffer,
-                                                   size_t payload_length,
-                                                   size_t rtp_header_length,
-                                                   int red_payload_type);
-
-  void SetFecParameters(const FecProtectionParams& params);
-
-  // Adds a media packet to the internal buffer. When enough media packets
-  // have been added, the FEC packets are generated and stored internally.
-  // These FEC packets are then obtained by calling GetFecPacketsAsRed().
-  int AddRtpPacketAndGenerateFec(const uint8_t* data_buffer,
-                                 size_t payload_length,
-                                 size_t rtp_header_length);
-
-  // Returns true if there are generated FEC packets available.
-  bool FecAvailable() const;
-
-  size_t NumAvailableFecPackets() const;
-
-  // Returns the overhead, per packet, for FEC (and possibly RED).
-  size_t MaxPacketOverhead() const;
-
-  // Returns generated FEC packets with RED headers added.
-  std::vector<std::unique_ptr<RedPacket>> GetUlpfecPacketsAsRed(
-      int red_payload_type,
-      int ulpfec_payload_type,
-      uint16_t first_seq_num,
-      size_t rtp_header_length);
-
- private:
-  explicit UlpfecGenerator(std::unique_ptr<ForwardErrorCorrection> fec);
-
-  // Overhead is defined as relative to the number of media packets, and not
-  // relative to total number of packets. This definition is inherited from the
-  // protection factor produced by video_coding module and how the FEC
-  // generation is implemented.
-  int Overhead() const;
-
-  // Returns true if the excess overhead (actual - target) for the FEC is below
-  // the amount |kMaxExcessOverhead|. This effects the lower protection level
-  // cases and low number of media packets/frame. The target overhead is given
-  // by |params_.fec_rate|, and is only achievable in the limit of large number
-  // of media packets.
-  bool ExcessOverheadBelowMax() const;
-
-  // Returns true if the number of added media packets is at least
-  // |min_num_media_packets_|. This condition tries to capture the effect
-  // that, for the same amount of protection/overhead, longer codes
-  // (e.g. (2k,2m) vs (k,m)) are generally more effective at recovering losses.
-  bool MinimumMediaPacketsReached() const;
-
-  void ResetState();
-
-  std::unique_ptr<ForwardErrorCorrection> fec_;
-  ForwardErrorCorrection::PacketList media_packets_;
-  std::list<ForwardErrorCorrection::Packet*> generated_fec_packets_;
-  int num_protected_frames_;
-  int min_num_media_packets_;
-  FecProtectionParams params_;
-  FecProtectionParams new_params_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_RTP_RTCP_SOURCE_ULPFEC_GENERATOR_H_
diff --git a/modules/rtp_rtcp/source/ulpfec_generator_unittest.cc b/modules/rtp_rtcp/source/ulpfec_generator_unittest.cc
deleted file mode 100644
index 5d281aa..0000000
--- a/modules/rtp_rtcp/source/ulpfec_generator_unittest.cc
+++ /dev/null
@@ -1,204 +0,0 @@
-/*
- *  Copyright (c) 2012 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 <list>
-#include <memory>
-#include <utility>
-#include <vector>
-
-#include "webrtc/modules/rtp_rtcp/source/byte_io.h"
-#include "webrtc/modules/rtp_rtcp/source/fec_test_helper.h"
-#include "webrtc/modules/rtp_rtcp/source/forward_error_correction.h"
-#include "webrtc/modules/rtp_rtcp/source/ulpfec_generator.h"
-#include "webrtc/rtc_base/basictypes.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-namespace {
-using test::fec::AugmentedPacket;
-using test::fec::AugmentedPacketGenerator;
-
-constexpr int kFecPayloadType = 96;
-constexpr int kRedPayloadType = 97;
-constexpr uint32_t kMediaSsrc = 835424;
-}  // namespace
-
-void VerifyHeader(uint16_t seq_num,
-                  uint32_t timestamp,
-                  int red_payload_type,
-                  int fec_payload_type,
-                  RedPacket* packet,
-                  bool marker_bit) {
-  EXPECT_GT(packet->length(), kRtpHeaderSize);
-  EXPECT_TRUE(packet->data() != NULL);
-  uint8_t* data = packet->data();
-  // Marker bit not set.
-  EXPECT_EQ(marker_bit ? 0x80 : 0, data[1] & 0x80);
-  EXPECT_EQ(red_payload_type, data[1] & 0x7F);
-  EXPECT_EQ(seq_num, (data[2] << 8) + data[3]);
-  uint32_t parsed_timestamp =
-      (data[4] << 24) + (data[5] << 16) + (data[6] << 8) + data[7];
-  EXPECT_EQ(timestamp, parsed_timestamp);
-  EXPECT_EQ(static_cast<uint8_t>(fec_payload_type), data[kRtpHeaderSize]);
-}
-
-class UlpfecGeneratorTest : public ::testing::Test {
- protected:
-  UlpfecGeneratorTest() : packet_generator_(kMediaSsrc) {}
-
-  UlpfecGenerator ulpfec_generator_;
-  AugmentedPacketGenerator packet_generator_;
-};
-
-// Verifies bug found via fuzzing, where a gap in the packet sequence caused us
-// to move past the end of the current FEC packet mask byte without moving to
-// the next byte. That likely caused us to repeatedly read from the same byte,
-// and if that byte didn't protect packets we would generate empty FEC.
-TEST_F(UlpfecGeneratorTest, NoEmptyFecWithSeqNumGaps) {
-  struct Packet {
-    size_t header_size;
-    size_t payload_size;
-    uint16_t seq_num;
-    bool marker_bit;
-  };
-  std::vector<Packet> protected_packets;
-  protected_packets.push_back({15, 3, 41, 0});
-  protected_packets.push_back({14, 1, 43, 0});
-  protected_packets.push_back({19, 0, 48, 0});
-  protected_packets.push_back({19, 0, 50, 0});
-  protected_packets.push_back({14, 3, 51, 0});
-  protected_packets.push_back({13, 8, 52, 0});
-  protected_packets.push_back({19, 2, 53, 0});
-  protected_packets.push_back({12, 3, 54, 0});
-  protected_packets.push_back({21, 0, 55, 0});
-  protected_packets.push_back({13, 3, 57, 1});
-  FecProtectionParams params = {117, 3, kFecMaskBursty};
-  ulpfec_generator_.SetFecParameters(params);
-  uint8_t packet[28] = {0};
-  for (Packet p : protected_packets) {
-    if (p.marker_bit) {
-      packet[1] |= 0x80;
-    } else {
-      packet[1] &= ~0x80;
-    }
-    ByteWriter<uint16_t>::WriteBigEndian(&packet[2], p.seq_num);
-    ulpfec_generator_.AddRtpPacketAndGenerateFec(packet, p.payload_size,
-                                                 p.header_size);
-    size_t num_fec_packets = ulpfec_generator_.NumAvailableFecPackets();
-    if (num_fec_packets > 0) {
-      std::vector<std::unique_ptr<RedPacket>> fec_packets =
-          ulpfec_generator_.GetUlpfecPacketsAsRed(
-              kRedPayloadType, kFecPayloadType, 100, p.header_size);
-      EXPECT_EQ(num_fec_packets, fec_packets.size());
-    }
-  }
-}
-
-TEST_F(UlpfecGeneratorTest, OneFrameFec) {
-  // The number of media packets (|kNumPackets|), number of frames (one for
-  // this test), and the protection factor (|params->fec_rate|) are set to make
-  // sure the conditions for generating FEC are satisfied. This means:
-  // (1) protection factor is high enough so that actual overhead over 1 frame
-  // of packets is within |kMaxExcessOverhead|, and (2) the total number of
-  // media packets for 1 frame is at least |minimum_media_packets_fec_|.
-  constexpr size_t kNumPackets = 4;
-  FecProtectionParams params = {15, 3, kFecMaskRandom};
-  packet_generator_.NewFrame(kNumPackets);
-  ulpfec_generator_.SetFecParameters(params);  // Expecting one FEC packet.
-  uint32_t last_timestamp = 0;
-  for (size_t i = 0; i < kNumPackets; ++i) {
-    std::unique_ptr<AugmentedPacket> packet =
-        packet_generator_.NextPacket(i, 10);
-    EXPECT_EQ(0, ulpfec_generator_.AddRtpPacketAndGenerateFec(
-                     packet->data, packet->length, kRtpHeaderSize));
-    last_timestamp = packet->header.header.timestamp;
-  }
-  EXPECT_TRUE(ulpfec_generator_.FecAvailable());
-  uint16_t seq_num = packet_generator_.NextPacketSeqNum();
-  std::vector<std::unique_ptr<RedPacket>> red_packets =
-      ulpfec_generator_.GetUlpfecPacketsAsRed(kRedPayloadType, kFecPayloadType,
-                                              seq_num, kRtpHeaderSize);
-  EXPECT_FALSE(ulpfec_generator_.FecAvailable());
-  ASSERT_EQ(1u, red_packets.size());
-  VerifyHeader(seq_num, last_timestamp, kRedPayloadType, kFecPayloadType,
-               red_packets.front().get(), false);
-}
-
-TEST_F(UlpfecGeneratorTest, TwoFrameFec) {
-  // The number of media packets/frame (|kNumPackets|), the number of frames
-  // (|kNumFrames|), and the protection factor (|params->fec_rate|) are set to
-  // make sure the conditions for generating FEC are satisfied. This means:
-  // (1) protection factor is high enough so that actual overhead over
-  // |kNumFrames| is within |kMaxExcessOverhead|, and (2) the total number of
-  // media packets for |kNumFrames| frames is at least
-  // |minimum_media_packets_fec_|.
-  constexpr size_t kNumPackets = 2;
-  constexpr size_t kNumFrames = 2;
-
-  FecProtectionParams params = {15, 3, kFecMaskRandom};
-  ulpfec_generator_.SetFecParameters(params);  // Expecting one FEC packet.
-  uint32_t last_timestamp = 0;
-  for (size_t i = 0; i < kNumFrames; ++i) {
-    packet_generator_.NewFrame(kNumPackets);
-    for (size_t j = 0; j < kNumPackets; ++j) {
-      std::unique_ptr<AugmentedPacket> packet =
-          packet_generator_.NextPacket(i * kNumPackets + j, 10);
-      EXPECT_EQ(0, ulpfec_generator_.AddRtpPacketAndGenerateFec(
-                       packet->data, packet->length, kRtpHeaderSize));
-      last_timestamp = packet->header.header.timestamp;
-    }
-  }
-  EXPECT_TRUE(ulpfec_generator_.FecAvailable());
-  uint16_t seq_num = packet_generator_.NextPacketSeqNum();
-  std::vector<std::unique_ptr<RedPacket>> red_packets =
-      ulpfec_generator_.GetUlpfecPacketsAsRed(kRedPayloadType, kFecPayloadType,
-                                              seq_num, kRtpHeaderSize);
-  EXPECT_FALSE(ulpfec_generator_.FecAvailable());
-  ASSERT_EQ(1u, red_packets.size());
-  VerifyHeader(seq_num, last_timestamp, kRedPayloadType, kFecPayloadType,
-               red_packets.front().get(), false);
-}
-
-TEST_F(UlpfecGeneratorTest, BuildRedPacket) {
-  packet_generator_.NewFrame(1);
-  std::unique_ptr<AugmentedPacket> packet = packet_generator_.NextPacket(0, 10);
-  std::unique_ptr<RedPacket> red_packet = UlpfecGenerator::BuildRedPacket(
-      packet->data, packet->length - kRtpHeaderSize, kRtpHeaderSize,
-      kRedPayloadType);
-  EXPECT_EQ(packet->length + 1, red_packet->length());
-  VerifyHeader(packet->header.header.sequenceNumber,
-               packet->header.header.timestamp, kRedPayloadType,
-               packet->header.header.payloadType, red_packet.get(),
-               true);  // Marker bit set.
-  for (int i = 0; i < 10; ++i) {
-    EXPECT_EQ(i, red_packet->data()[kRtpHeaderSize + 1 + i]);
-  }
-}
-
-TEST_F(UlpfecGeneratorTest, BuildRedPacketWithEmptyPayload) {
-  constexpr size_t kNumFrames = 1;
-  constexpr size_t kPayloadLength = 0;
-  constexpr size_t kRedForFecHeaderLength = 1;
-
-  packet_generator_.NewFrame(kNumFrames);
-  std::unique_ptr<AugmentedPacket> packet(
-      packet_generator_.NextPacket(0, kPayloadLength));
-  std::unique_ptr<RedPacket> red_packet = UlpfecGenerator::BuildRedPacket(
-      packet->data, packet->length - kRtpHeaderSize, kRtpHeaderSize,
-      kRedPayloadType);
-  EXPECT_EQ(packet->length + kRedForFecHeaderLength, red_packet->length());
-  VerifyHeader(packet->header.header.sequenceNumber,
-               packet->header.header.timestamp, kRedPayloadType,
-               packet->header.header.payloadType, red_packet.get(),
-               true);  // Marker bit set.
-}
-
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/ulpfec_header_reader_writer.cc b/modules/rtp_rtcp/source/ulpfec_header_reader_writer.cc
deleted file mode 100644
index 3a6000a..0000000
--- a/modules/rtp_rtcp/source/ulpfec_header_reader_writer.cc
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- *  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/rtp_rtcp/source/ulpfec_header_reader_writer.h"
-
-#include <utility>
-
-#include "webrtc/modules/rtp_rtcp/source/byte_io.h"
-#include "webrtc/modules/rtp_rtcp/source/forward_error_correction_internal.h"
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-
-namespace {
-
-// Maximum number of media packets that can be protected in one batch.
-constexpr size_t kMaxMediaPackets = 48;
-
-// Maximum number of FEC packets stored inside ForwardErrorCorrection.
-constexpr size_t kMaxFecPackets = kMaxMediaPackets;
-
-// FEC Level 0 header size in bytes.
-constexpr size_t kFecLevel0HeaderSize = 10;
-
-// FEC Level 1 (ULP) header size in bytes (L bit is set).
-constexpr size_t kFecLevel1HeaderSizeLBitSet = 2 + kUlpfecPacketMaskSizeLBitSet;
-
-// FEC Level 1 (ULP) header size in bytes (L bit is cleared).
-constexpr size_t kFecLevel1HeaderSizeLBitClear =
-    2 + kUlpfecPacketMaskSizeLBitClear;
-
-constexpr size_t kPacketMaskOffset = kFecLevel0HeaderSize + 2;
-
-size_t UlpfecHeaderSize(size_t packet_mask_size) {
-  RTC_DCHECK_LE(packet_mask_size, kUlpfecPacketMaskSizeLBitSet);
-  if (packet_mask_size <= kUlpfecPacketMaskSizeLBitClear) {
-    return kFecLevel0HeaderSize + kFecLevel1HeaderSizeLBitClear;
-  } else {
-    return kFecLevel0HeaderSize + kFecLevel1HeaderSizeLBitSet;
-  }
-}
-
-}  // namespace
-
-UlpfecHeaderReader::UlpfecHeaderReader()
-    : FecHeaderReader(kMaxMediaPackets, kMaxFecPackets) {}
-
-UlpfecHeaderReader::~UlpfecHeaderReader() = default;
-
-bool UlpfecHeaderReader::ReadFecHeader(
-    ForwardErrorCorrection::ReceivedFecPacket* fec_packet) const {
-  bool l_bit = (fec_packet->pkt->data[0] & 0x40) != 0u;
-  size_t packet_mask_size =
-      l_bit ? kUlpfecPacketMaskSizeLBitSet : kUlpfecPacketMaskSizeLBitClear;
-  fec_packet->fec_header_size = UlpfecHeaderSize(packet_mask_size);
-  uint16_t seq_num_base =
-      ByteReader<uint16_t>::ReadBigEndian(&fec_packet->pkt->data[2]);
-  fec_packet->protected_ssrc = fec_packet->ssrc;  // Due to RED.
-  fec_packet->seq_num_base = seq_num_base;
-  fec_packet->packet_mask_offset = kPacketMaskOffset;
-  fec_packet->packet_mask_size = packet_mask_size;
-  fec_packet->protection_length =
-      ByteReader<uint16_t>::ReadBigEndian(&fec_packet->pkt->data[10]);
-
-  // Store length recovery field in temporary location in header.
-  // This makes the header "compatible" with the corresponding
-  // FlexFEC location of the length recovery field, thus simplifying
-  // the XORing operations.
-  memcpy(&fec_packet->pkt->data[2], &fec_packet->pkt->data[8], 2);
-
-  return true;
-}
-
-UlpfecHeaderWriter::UlpfecHeaderWriter()
-    : FecHeaderWriter(kMaxMediaPackets,
-                      kMaxFecPackets,
-                      kFecLevel0HeaderSize + kFecLevel1HeaderSizeLBitSet) {}
-
-UlpfecHeaderWriter::~UlpfecHeaderWriter() = default;
-
-// TODO(brandtr): Consider updating this implementation (which actually
-// returns a bound on the sequence number spread), if logic is added to
-// UlpfecHeaderWriter::FinalizeFecHeader to truncate packet masks which end
-// in a string of zeroes. (Similar to how it is done in the FlexFEC case.)
-size_t UlpfecHeaderWriter::MinPacketMaskSize(const uint8_t* packet_mask,
-                                             size_t packet_mask_size) const {
-  return packet_mask_size;
-}
-
-size_t UlpfecHeaderWriter::FecHeaderSize(size_t packet_mask_size) const {
-  return UlpfecHeaderSize(packet_mask_size);
-}
-
-void UlpfecHeaderWriter::FinalizeFecHeader(
-    uint32_t /* media_ssrc */,
-    uint16_t seq_num_base,
-    const uint8_t* packet_mask,
-    size_t packet_mask_size,
-    ForwardErrorCorrection::Packet* fec_packet) const {
-  // Set E bit to zero.
-  fec_packet->data[0] &= 0x7f;
-  // Set L bit based on packet mask size. (Note that the packet mask
-  // can only take on two discrete values.)
-  bool l_bit = (packet_mask_size == kUlpfecPacketMaskSizeLBitSet);
-  if (l_bit) {
-    fec_packet->data[0] |= 0x40;  // Set the L bit.
-  } else {
-    RTC_DCHECK_EQ(packet_mask_size, kUlpfecPacketMaskSizeLBitClear);
-    fec_packet->data[0] &= 0xbf;  // Clear the L bit.
-  }
-  // Copy length recovery field from temporary location.
-  memcpy(&fec_packet->data[8], &fec_packet->data[2], 2);
-  // Write sequence number base.
-  ByteWriter<uint16_t>::WriteBigEndian(&fec_packet->data[2], seq_num_base);
-  // Protection length is set to entire packet. (This is not
-  // required in general.)
-  const size_t fec_header_size = FecHeaderSize(packet_mask_size);
-  ByteWriter<uint16_t>::WriteBigEndian(&fec_packet->data[10],
-                                       fec_packet->length - fec_header_size);
-  // Copy the packet mask.
-  memcpy(&fec_packet->data[12], packet_mask, packet_mask_size);
-}
-
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/ulpfec_header_reader_writer.h b/modules/rtp_rtcp/source/ulpfec_header_reader_writer.h
deleted file mode 100644
index 2c1994d..0000000
--- a/modules/rtp_rtcp/source/ulpfec_header_reader_writer.h
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- *  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_RTP_RTCP_SOURCE_ULPFEC_HEADER_READER_WRITER_H_
-#define WEBRTC_MODULES_RTP_RTCP_SOURCE_ULPFEC_HEADER_READER_WRITER_H_
-
-#include "webrtc/modules/rtp_rtcp/source/forward_error_correction.h"
-#include "webrtc/rtc_base/basictypes.h"
-
-namespace webrtc {
-
-// FEC Level 0 Header, 10 bytes.
-//    0                   1                   2                   3
-//    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
-//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//   |E|L|P|X|  CC   |M| PT recovery |            SN base            |
-//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//   |                          TS recovery                          |
-//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//   |        length recovery        |
-//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//
-// FEC Level 1 Header, 4 bytes (L = 0) or 8 bytes (L = 1).
-//    0                   1                   2                   3
-//    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
-//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//   |       Protection Length       |             mask              |
-//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//   |              mask cont. (present only when L = 1)             |
-//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-class UlpfecHeaderReader : public FecHeaderReader {
- public:
-  UlpfecHeaderReader();
-  ~UlpfecHeaderReader() override;
-
-  bool ReadFecHeader(
-      ForwardErrorCorrection::ReceivedFecPacket* fec_packet) const override;
-};
-
-class UlpfecHeaderWriter : public FecHeaderWriter {
- public:
-  UlpfecHeaderWriter();
-  ~UlpfecHeaderWriter() override;
-
-  size_t MinPacketMaskSize(const uint8_t* packet_mask,
-                           size_t packet_mask_size) const override;
-
-  size_t FecHeaderSize(size_t packet_mask_row_size) const override;
-
-  void FinalizeFecHeader(
-      uint32_t media_ssrc,  // Unused by ULPFEC.
-      uint16_t seq_num_base,
-      const uint8_t* packet_mask,
-      size_t packet_mask_size,
-      ForwardErrorCorrection::Packet* fec_packet) const override;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_RTP_RTCP_SOURCE_ULPFEC_HEADER_READER_WRITER_H_
diff --git a/modules/rtp_rtcp/source/ulpfec_header_reader_writer_unittest.cc b/modules/rtp_rtcp/source/ulpfec_header_reader_writer_unittest.cc
deleted file mode 100644
index 8eebf38..0000000
--- a/modules/rtp_rtcp/source/ulpfec_header_reader_writer_unittest.cc
+++ /dev/null
@@ -1,244 +0,0 @@
-/*
- *  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 <string.h>
-
-#include <memory>
-#include <utility>
-
-#include "webrtc/modules/rtp_rtcp/source/byte_io.h"
-#include "webrtc/modules/rtp_rtcp/source/forward_error_correction.h"
-#include "webrtc/modules/rtp_rtcp/source/forward_error_correction_internal.h"
-#include "webrtc/modules/rtp_rtcp/source/ulpfec_header_reader_writer.h"
-#include "webrtc/rtc_base/basictypes.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/random.h"
-#include "webrtc/rtc_base/scoped_ref_ptr.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-namespace {
-
-using Packet = ForwardErrorCorrection::Packet;
-using ReceivedFecPacket = ForwardErrorCorrection::ReceivedFecPacket;
-
-constexpr uint32_t kMediaSsrc = 1254983;
-constexpr uint16_t kMediaStartSeqNum = 825;
-constexpr size_t kMediaPacketLength = 1234;
-
-constexpr size_t kUlpfecHeaderSizeLBitClear = 14;
-constexpr size_t kUlpfecHeaderSizeLBitSet = 18;
-constexpr size_t kUlpfecPacketMaskOffset = 12;
-
-std::unique_ptr<uint8_t[]> GeneratePacketMask(size_t packet_mask_size,
-                                              uint64_t seed) {
-  Random random(seed);
-  std::unique_ptr<uint8_t[]> packet_mask(new uint8_t[packet_mask_size]);
-  for (size_t i = 0; i < packet_mask_size; ++i) {
-    packet_mask[i] = random.Rand<uint8_t>();
-  }
-  return packet_mask;
-}
-
-std::unique_ptr<Packet> WriteHeader(const uint8_t* packet_mask,
-                                    size_t packet_mask_size) {
-  UlpfecHeaderWriter writer;
-  std::unique_ptr<Packet> written_packet(new Packet());
-  written_packet->length = kMediaPacketLength;
-  for (size_t i = 0; i < written_packet->length; ++i) {
-    written_packet->data[i] = i;  // Actual content doesn't matter.
-  }
-  writer.FinalizeFecHeader(kMediaSsrc, kMediaStartSeqNum, packet_mask,
-                           packet_mask_size, written_packet.get());
-  return written_packet;
-}
-
-std::unique_ptr<ReceivedFecPacket> ReadHeader(const Packet& written_packet) {
-  UlpfecHeaderReader reader;
-  std::unique_ptr<ReceivedFecPacket> read_packet(new ReceivedFecPacket());
-  read_packet->ssrc = kMediaSsrc;
-  read_packet->pkt = rtc::scoped_refptr<Packet>(new Packet());
-  memcpy(read_packet->pkt->data, written_packet.data, written_packet.length);
-  read_packet->pkt->length = written_packet.length;
-  EXPECT_TRUE(reader.ReadFecHeader(read_packet.get()));
-  return read_packet;
-}
-
-void VerifyHeaders(size_t expected_fec_header_size,
-                   const uint8_t* expected_packet_mask,
-                   size_t expected_packet_mask_size,
-                   const Packet& written_packet,
-                   const ReceivedFecPacket& read_packet) {
-  EXPECT_EQ(kMediaSsrc, read_packet.ssrc);
-  EXPECT_EQ(expected_fec_header_size, read_packet.fec_header_size);
-  EXPECT_EQ(kMediaSsrc, read_packet.protected_ssrc);
-  EXPECT_EQ(kMediaStartSeqNum, read_packet.seq_num_base);
-  EXPECT_EQ(kUlpfecPacketMaskOffset, read_packet.packet_mask_offset);
-  ASSERT_EQ(expected_packet_mask_size, read_packet.packet_mask_size);
-  EXPECT_EQ(written_packet.length - expected_fec_header_size,
-            read_packet.protection_length);
-  EXPECT_EQ(0, memcmp(expected_packet_mask,
-                      &read_packet.pkt->data[read_packet.packet_mask_offset],
-                      read_packet.packet_mask_size));
-  // Verify that the call to ReadFecHeader did not tamper with the payload.
-  EXPECT_EQ(0, memcmp(&written_packet.data[expected_fec_header_size],
-                      &read_packet.pkt->data[expected_fec_header_size],
-                      written_packet.length - expected_fec_header_size));
-}
-
-}  // namespace
-
-TEST(UlpfecHeaderReaderTest, ReadsSmallHeader) {
-  const uint8_t packet[] = {
-      0x00, 0x12, 0xab, 0xcd,  // L bit clear, "random" payload type and SN base
-      0x12, 0x34, 0x56, 0x78,  // "random" TS recovery
-      0xab, 0xcd, 0x11, 0x22,  // "random" length recovery and protection length
-      0x33, 0x44,              // "random" packet mask
-      0x00, 0x00, 0x00, 0x00   // payload
-  };
-  const size_t packet_length = sizeof(packet);
-  ReceivedFecPacket read_packet;
-  read_packet.pkt = rtc::scoped_refptr<Packet>(new Packet());
-  memcpy(read_packet.pkt->data, packet, packet_length);
-  read_packet.pkt->length = packet_length;
-
-  UlpfecHeaderReader reader;
-  EXPECT_TRUE(reader.ReadFecHeader(&read_packet));
-
-  EXPECT_EQ(14U, read_packet.fec_header_size);
-  EXPECT_EQ(0xabcdU, read_packet.seq_num_base);
-  EXPECT_EQ(12U, read_packet.packet_mask_offset);
-  EXPECT_EQ(2U, read_packet.packet_mask_size);
-  EXPECT_EQ(0x1122U, read_packet.protection_length);
-}
-
-TEST(UlpfecHeaderReaderTest, ReadsLargeHeader) {
-  const uint8_t packet[] = {
-      0x40, 0x12, 0xab, 0xcd,  // L bit set, "random" payload type and SN base
-      0x12, 0x34, 0x56, 0x78,  // "random" TS recovery
-      0xab, 0xcd, 0x11, 0x22,  // "random" length recovery and protection length
-      0x33, 0x44, 0x55, 0x66,  // "random" packet mask
-      0x77, 0x88,              //
-      0x00, 0x00, 0x00, 0x00   // payload
-  };
-  const size_t packet_length = sizeof(packet);
-  ReceivedFecPacket read_packet;
-  read_packet.pkt = rtc::scoped_refptr<Packet>(new Packet());
-  memcpy(read_packet.pkt->data, packet, packet_length);
-  read_packet.pkt->length = packet_length;
-
-  UlpfecHeaderReader reader;
-  EXPECT_TRUE(reader.ReadFecHeader(&read_packet));
-
-  EXPECT_EQ(18U, read_packet.fec_header_size);
-  EXPECT_EQ(0xabcdU, read_packet.seq_num_base);
-  EXPECT_EQ(12U, read_packet.packet_mask_offset);
-  EXPECT_EQ(6U, read_packet.packet_mask_size);
-  EXPECT_EQ(0x1122U, read_packet.protection_length);
-}
-
-TEST(UlpfecHeaderWriterTest, FinalizesSmallHeader) {
-  const size_t packet_mask_size = kUlpfecPacketMaskSizeLBitClear;
-  auto packet_mask = GeneratePacketMask(packet_mask_size, 0xabcd);
-  Packet written_packet;
-  written_packet.length = kMediaPacketLength;
-  for (size_t i = 0; i < written_packet.length; ++i) {
-    written_packet.data[i] = i;
-  }
-
-  UlpfecHeaderWriter writer;
-  writer.FinalizeFecHeader(kMediaSsrc, kMediaStartSeqNum, packet_mask.get(),
-                           packet_mask_size, &written_packet);
-
-  const uint8_t* packet = written_packet.data;
-  EXPECT_EQ(0x00, packet[0] & 0x80);  // E bit.
-  EXPECT_EQ(0x00, packet[0] & 0x40);  // L bit.
-  EXPECT_EQ(kMediaStartSeqNum, ByteReader<uint16_t>::ReadBigEndian(packet + 2));
-  EXPECT_EQ(
-      static_cast<uint16_t>(kMediaPacketLength - kUlpfecHeaderSizeLBitClear),
-      ByteReader<uint16_t>::ReadBigEndian(packet + 10));
-  EXPECT_EQ(0, memcmp(packet + kUlpfecPacketMaskOffset, packet_mask.get(),
-                      packet_mask_size));
-}
-
-TEST(UlpfecHeaderWriterTest, FinalizesLargeHeader) {
-  const size_t packet_mask_size = kUlpfecPacketMaskSizeLBitSet;
-  auto packet_mask = GeneratePacketMask(packet_mask_size, 0xabcd);
-  Packet written_packet;
-  written_packet.length = kMediaPacketLength;
-  for (size_t i = 0; i < written_packet.length; ++i) {
-    written_packet.data[i] = i;
-  }
-
-  UlpfecHeaderWriter writer;
-  writer.FinalizeFecHeader(kMediaSsrc, kMediaStartSeqNum, packet_mask.get(),
-                           packet_mask_size, &written_packet);
-
-  const uint8_t* packet = written_packet.data;
-  EXPECT_EQ(0x00, packet[0] & 0x80);  // E bit.
-  EXPECT_EQ(0x40, packet[0] & 0x40);  // L bit.
-  EXPECT_EQ(kMediaStartSeqNum, ByteReader<uint16_t>::ReadBigEndian(packet + 2));
-  EXPECT_EQ(
-      static_cast<uint16_t>(kMediaPacketLength - kUlpfecHeaderSizeLBitSet),
-      ByteReader<uint16_t>::ReadBigEndian(packet + 10));
-  EXPECT_EQ(0, memcmp(packet + kUlpfecPacketMaskOffset, packet_mask.get(),
-                      packet_mask_size));
-}
-
-TEST(UlpfecHeaderWriterTest, CalculateSmallHeaderSize) {
-  const size_t packet_mask_size = kUlpfecPacketMaskSizeLBitClear;
-  auto packet_mask = GeneratePacketMask(packet_mask_size, 0xabcd);
-
-  UlpfecHeaderWriter writer;
-  size_t min_packet_mask_size =
-      writer.MinPacketMaskSize(packet_mask.get(), packet_mask_size);
-
-  EXPECT_EQ(kUlpfecPacketMaskSizeLBitClear, min_packet_mask_size);
-  EXPECT_EQ(kUlpfecHeaderSizeLBitClear,
-            writer.FecHeaderSize(min_packet_mask_size));
-}
-
-TEST(UlpfecHeaderWriterTest, CalculateLargeHeaderSize) {
-  const size_t packet_mask_size = kUlpfecPacketMaskSizeLBitSet;
-  auto packet_mask = GeneratePacketMask(packet_mask_size, 0xabcd);
-
-  UlpfecHeaderWriter writer;
-  size_t min_packet_mask_size =
-      writer.MinPacketMaskSize(packet_mask.get(), packet_mask_size);
-
-  EXPECT_EQ(kUlpfecPacketMaskSizeLBitSet, min_packet_mask_size);
-  EXPECT_EQ(kUlpfecHeaderSizeLBitSet,
-            writer.FecHeaderSize(min_packet_mask_size));
-}
-
-TEST(UlpfecHeaderReaderWriterTest, WriteAndReadSmallHeader) {
-  const size_t packet_mask_size = kUlpfecPacketMaskSizeLBitClear;
-  auto packet_mask = GeneratePacketMask(packet_mask_size, 0xabcd);
-
-  auto written_packet = WriteHeader(packet_mask.get(), packet_mask_size);
-  auto read_packet = ReadHeader(*written_packet);
-
-  VerifyHeaders(kUlpfecHeaderSizeLBitClear, packet_mask.get(), packet_mask_size,
-                *written_packet, *read_packet);
-}
-
-TEST(UlpfecHeaderReaderWriterTest, WriteAndReadLargeHeader) {
-  const size_t packet_mask_size = kUlpfecPacketMaskSizeLBitSet;
-  auto packet_mask = GeneratePacketMask(packet_mask_size, 0xabcd);
-
-  auto written_packet = WriteHeader(packet_mask.get(), packet_mask_size);
-  auto read_packet = ReadHeader(*written_packet);
-
-  VerifyHeaders(kUlpfecHeaderSizeLBitSet, packet_mask.get(), packet_mask_size,
-                *written_packet, *read_packet);
-}
-
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/ulpfec_receiver_impl.cc b/modules/rtp_rtcp/source/ulpfec_receiver_impl.cc
deleted file mode 100644
index f3b0831..0000000
--- a/modules/rtp_rtcp/source/ulpfec_receiver_impl.cc
+++ /dev/null
@@ -1,256 +0,0 @@
-/*
- *  Copyright (c) 2012 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/rtp_rtcp/source/ulpfec_receiver_impl.h"
-
-#include <memory>
-#include <utility>
-
-#include "webrtc/modules/rtp_rtcp/source/byte_io.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_receiver_video.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/system_wrappers/include/clock.h"
-
-namespace webrtc {
-
-UlpfecReceiver* UlpfecReceiver::Create(uint32_t ssrc,
-                                       RecoveredPacketReceiver* callback) {
-  return new UlpfecReceiverImpl(ssrc, callback);
-}
-
-UlpfecReceiverImpl::UlpfecReceiverImpl(uint32_t ssrc,
-                                       RecoveredPacketReceiver* callback)
-    : ssrc_(ssrc),
-      recovered_packet_callback_(callback),
-      fec_(ForwardErrorCorrection::CreateUlpfec(ssrc_)) {}
-
-UlpfecReceiverImpl::~UlpfecReceiverImpl() {
-  received_packets_.clear();
-  fec_->ResetState(&recovered_packets_);
-}
-
-FecPacketCounter UlpfecReceiverImpl::GetPacketCounter() const {
-  rtc::CritScope cs(&crit_sect_);
-  return packet_counter_;
-}
-
-//     0                   1                    2                   3
-//     0 1 2 3 4 5 6 7 8 9 0 1 2 3  4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
-//    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//    |F|   block PT  |  timestamp offset         |   block length    |
-//    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//
-//
-// RFC 2198          RTP Payload for Redundant Audio Data    September 1997
-//
-//    The bits in the header are specified as follows:
-//
-//    F: 1 bit First bit in header indicates whether another header block
-//        follows.  If 1 further header blocks follow, if 0 this is the
-//        last header block.
-//        If 0 there is only 1 byte RED header
-//
-//    block PT: 7 bits RTP payload type for this block.
-//
-//    timestamp offset:  14 bits Unsigned offset of timestamp of this block
-//        relative to timestamp given in RTP header.  The use of an unsigned
-//        offset implies that redundant data must be sent after the primary
-//        data, and is hence a time to be subtracted from the current
-//        timestamp to determine the timestamp of the data for which this
-//        block is the redundancy.
-//
-//    block length:  10 bits Length in bytes of the corresponding data
-//        block excluding header.
-
-int32_t UlpfecReceiverImpl::AddReceivedRedPacket(
-    const RTPHeader& header,
-    const uint8_t* incoming_rtp_packet,
-    size_t packet_length,
-    uint8_t ulpfec_payload_type) {
-  if (header.ssrc != ssrc_) {
-    LOG(LS_WARNING)
-        << "Received RED packet with different SSRC than expected; dropping.";
-    return -1;
-  }
-
-  rtc::CritScope cs(&crit_sect_);
-
-  uint8_t red_header_length = 1;
-  size_t payload_data_length = packet_length - header.headerLength;
-
-  if (payload_data_length == 0) {
-    LOG(LS_WARNING) << "Corrupt/truncated FEC packet.";
-    return -1;
-  }
-
-  // Remove RED header of incoming packet and store as a virtual RTP packet.
-  std::unique_ptr<ForwardErrorCorrection::ReceivedPacket> received_packet(
-      new ForwardErrorCorrection::ReceivedPacket());
-  received_packet->pkt = new ForwardErrorCorrection::Packet();
-
-  // Get payload type from RED header and sequence number from RTP header.
-  uint8_t payload_type = incoming_rtp_packet[header.headerLength] & 0x7f;
-  received_packet->is_fec = payload_type == ulpfec_payload_type;
-  received_packet->ssrc = header.ssrc;
-  received_packet->seq_num = header.sequenceNumber;
-
-  uint16_t block_length = 0;
-  if (incoming_rtp_packet[header.headerLength] & 0x80) {
-    // f bit set in RED header, i.e. there are more than one RED header blocks.
-    red_header_length = 4;
-    if (payload_data_length < red_header_length + 1u) {
-      LOG(LS_WARNING) << "Corrupt/truncated FEC packet.";
-      return -1;
-    }
-
-    uint16_t timestamp_offset = incoming_rtp_packet[header.headerLength + 1]
-                                << 8;
-    timestamp_offset += incoming_rtp_packet[header.headerLength + 2];
-    timestamp_offset = timestamp_offset >> 2;
-    if (timestamp_offset != 0) {
-      LOG(LS_WARNING) << "Corrupt payload found.";
-      return -1;
-    }
-
-    block_length = (0x3 & incoming_rtp_packet[header.headerLength + 2]) << 8;
-    block_length += incoming_rtp_packet[header.headerLength + 3];
-
-    // Check next RED header block.
-    if (incoming_rtp_packet[header.headerLength + 4] & 0x80) {
-      LOG(LS_WARNING) << "More than 2 blocks in packet not supported.";
-      return -1;
-    }
-    // Check that the packet is long enough to contain data in the following
-    // block.
-    if (block_length > payload_data_length - (red_header_length + 1)) {
-      LOG(LS_WARNING) << "Block length longer than packet.";
-      return -1;
-    }
-  }
-  ++packet_counter_.num_packets;
-  if (packet_counter_.first_packet_time_ms == -1) {
-    packet_counter_.first_packet_time_ms =
-        Clock::GetRealTimeClock()->TimeInMilliseconds();
-  }
-
-  std::unique_ptr<ForwardErrorCorrection::ReceivedPacket>
-      second_received_packet;
-  if (block_length > 0) {
-    // Handle block length, split into two packets.
-    red_header_length = 5;
-
-    // Copy RTP header.
-    memcpy(received_packet->pkt->data, incoming_rtp_packet,
-           header.headerLength);
-
-    // Set payload type.
-    received_packet->pkt->data[1] &= 0x80;          // Reset RED payload type.
-    received_packet->pkt->data[1] += payload_type;  // Set media payload type.
-
-    // Copy payload data.
-    memcpy(received_packet->pkt->data + header.headerLength,
-           incoming_rtp_packet + header.headerLength + red_header_length,
-           block_length);
-    received_packet->pkt->length = block_length;
-
-    second_received_packet.reset(new ForwardErrorCorrection::ReceivedPacket);
-    second_received_packet->pkt = new ForwardErrorCorrection::Packet;
-
-    second_received_packet->is_fec = true;
-    second_received_packet->ssrc = header.ssrc;
-    second_received_packet->seq_num = header.sequenceNumber;
-    ++packet_counter_.num_fec_packets;
-
-    // Copy FEC payload data.
-    memcpy(second_received_packet->pkt->data,
-           incoming_rtp_packet + header.headerLength + red_header_length +
-               block_length,
-           payload_data_length - red_header_length - block_length);
-
-    second_received_packet->pkt->length =
-        payload_data_length - red_header_length - block_length;
-
-  } else if (received_packet->is_fec) {
-    ++packet_counter_.num_fec_packets;
-    // everything behind the RED header
-    memcpy(received_packet->pkt->data,
-           incoming_rtp_packet + header.headerLength + red_header_length,
-           payload_data_length - red_header_length);
-    received_packet->pkt->length = payload_data_length - red_header_length;
-    received_packet->ssrc =
-        ByteReader<uint32_t>::ReadBigEndian(&incoming_rtp_packet[8]);
-
-  } else {
-    // Copy RTP header.
-    memcpy(received_packet->pkt->data, incoming_rtp_packet,
-           header.headerLength);
-
-    // Set payload type.
-    received_packet->pkt->data[1] &= 0x80;          // Reset RED payload type.
-    received_packet->pkt->data[1] += payload_type;  // Set media payload type.
-
-    // Copy payload data.
-    memcpy(received_packet->pkt->data + header.headerLength,
-           incoming_rtp_packet + header.headerLength + red_header_length,
-           payload_data_length - red_header_length);
-    received_packet->pkt->length =
-        header.headerLength + payload_data_length - red_header_length;
-  }
-
-  if (received_packet->pkt->length == 0) {
-    return 0;
-  }
-
-  received_packets_.push_back(std::move(received_packet));
-  if (second_received_packet) {
-    received_packets_.push_back(std::move(second_received_packet));
-  }
-  return 0;
-}
-
-int32_t UlpfecReceiverImpl::ProcessReceivedFec() {
-  crit_sect_.Enter();
-  if (!received_packets_.empty()) {
-    // Send received media packet to VCM.
-    if (!received_packets_.front()->is_fec) {
-      ForwardErrorCorrection::Packet* packet = received_packets_.front()->pkt;
-      crit_sect_.Leave();
-      recovered_packet_callback_->OnRecoveredPacket(packet->data,
-                                                    packet->length);
-      crit_sect_.Enter();
-    }
-    if (fec_->DecodeFec(&received_packets_, &recovered_packets_) != 0) {
-      crit_sect_.Leave();
-      return -1;
-    }
-    RTC_DCHECK(received_packets_.empty());
-  }
-  // Send any recovered media packets to VCM.
-  for (const auto& recovered_packet : recovered_packets_) {
-    if (recovered_packet->returned) {
-      // Already sent to the VCM and the jitter buffer.
-      continue;
-    }
-    ForwardErrorCorrection::Packet* packet = recovered_packet->pkt;
-    ++packet_counter_.num_recovered_packets;
-    // Set this flag first; in case the recovered packet carries a RED
-    // header, OnRecoveredPacket will recurse back here.
-    recovered_packet->returned = true;
-    crit_sect_.Leave();
-    recovered_packet_callback_->OnRecoveredPacket(packet->data,
-                                                  packet->length);
-    crit_sect_.Enter();
-  }
-  crit_sect_.Leave();
-  return 0;
-}
-
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/ulpfec_receiver_impl.h b/modules/rtp_rtcp/source/ulpfec_receiver_impl.h
deleted file mode 100644
index e4f71ff..0000000
--- a/modules/rtp_rtcp/source/ulpfec_receiver_impl.h
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- *  Copyright (c) 2012 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_RTP_RTCP_SOURCE_ULPFEC_RECEIVER_IMPL_H_
-#define WEBRTC_MODULES_RTP_RTCP_SOURCE_ULPFEC_RECEIVER_IMPL_H_
-
-#include <memory>
-
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
-#include "webrtc/modules/rtp_rtcp/include/ulpfec_receiver.h"
-#include "webrtc/modules/rtp_rtcp/source/forward_error_correction.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-class UlpfecReceiverImpl : public UlpfecReceiver {
- public:
-  explicit UlpfecReceiverImpl(uint32_t ssrc, RecoveredPacketReceiver* callback);
-  virtual ~UlpfecReceiverImpl();
-
-  int32_t AddReceivedRedPacket(const RTPHeader& rtp_header,
-                               const uint8_t* incoming_rtp_packet,
-                               size_t packet_length,
-                               uint8_t ulpfec_payload_type) override;
-
-  int32_t ProcessReceivedFec() override;
-
-  FecPacketCounter GetPacketCounter() const override;
-
- private:
-  const uint32_t ssrc_;
-
-  rtc::CriticalSection crit_sect_;
-  RecoveredPacketReceiver* recovered_packet_callback_;
-  std::unique_ptr<ForwardErrorCorrection> fec_;
-  // TODO(holmer): In the current version |received_packets_| is never more
-  // than one packet, since we process FEC every time a new packet
-  // arrives. We should remove the list.
-  ForwardErrorCorrection::ReceivedPacketList received_packets_;
-  ForwardErrorCorrection::RecoveredPacketList recovered_packets_;
-  FecPacketCounter packet_counter_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_RTP_RTCP_SOURCE_ULPFEC_RECEIVER_IMPL_H_
diff --git a/modules/rtp_rtcp/source/ulpfec_receiver_unittest.cc b/modules/rtp_rtcp/source/ulpfec_receiver_unittest.cc
deleted file mode 100644
index 7a9c446..0000000
--- a/modules/rtp_rtcp/source/ulpfec_receiver_unittest.cc
+++ /dev/null
@@ -1,485 +0,0 @@
-/*
- *  Copyright (c) 2012 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 <string.h>
-
-#include <list>
-#include <memory>
-
-#include "webrtc/modules/rtp_rtcp/include/rtp_header_parser.h"
-#include "webrtc/modules/rtp_rtcp/include/ulpfec_receiver.h"
-#include "webrtc/modules/rtp_rtcp/mocks/mock_rtp_rtcp.h"
-#include "webrtc/modules/rtp_rtcp/mocks/mock_recovered_packet_receiver.h"
-#include "webrtc/modules/rtp_rtcp/source/byte_io.h"
-#include "webrtc/modules/rtp_rtcp/source/fec_test_helper.h"
-#include "webrtc/modules/rtp_rtcp/source/forward_error_correction.h"
-#include "webrtc/test/gmock.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-namespace {
-using ::testing::_;
-using ::testing::Args;
-using ::testing::ElementsAreArray;
-using ::testing::Return;
-
-using test::fec::AugmentedPacket;
-using Packet = ForwardErrorCorrection::Packet;
-using test::fec::UlpfecPacketGenerator;
-
-constexpr int kFecPayloadType = 96;
-constexpr uint32_t kMediaSsrc = 835424;
-
-class NullRecoveredPacketReceiver : public RecoveredPacketReceiver {
- public:
-  void OnRecoveredPacket(const uint8_t* packet, size_t length) override {}
-};
-
-}  // namespace
-
-class UlpfecReceiverTest : public ::testing::Test {
- protected:
-  UlpfecReceiverTest()
-      : fec_(ForwardErrorCorrection::CreateUlpfec(kMediaSsrc)),
-        receiver_fec_(
-            UlpfecReceiver::Create(kMediaSsrc, &recovered_packet_receiver_)),
-        packet_generator_(kMediaSsrc) {}
-
-  // Generates |num_fec_packets| FEC packets, given |media_packets|.
-  void EncodeFec(const ForwardErrorCorrection::PacketList& media_packets,
-                 size_t num_fec_packets,
-                 std::list<ForwardErrorCorrection::Packet*>* fec_packets);
-
-  // Generates |num_media_packets| corresponding to a single frame.
-  void PacketizeFrame(size_t num_media_packets,
-                      size_t frame_offset,
-                      std::list<AugmentedPacket*>* augmented_packets,
-                      ForwardErrorCorrection::PacketList* packets);
-
-  // Build a media packet using |packet_generator_| and add it
-  // to the receiver.
-  void BuildAndAddRedMediaPacket(AugmentedPacket* packet);
-
-  // Build a FEC packet using |packet_generator_| and add it
-  // to the receiver.
-  void BuildAndAddRedFecPacket(Packet* packet);
-
-  // Ensure that |recovered_packet_receiver_| will be called correctly
-  // and that the recovered packet will be identical to the lost packet.
-  void VerifyReconstructedMediaPacket(const AugmentedPacket& packet,
-                                      size_t times);
-
-  void InjectGarbagePacketLength(size_t fec_garbage_offset);
-
-  static void SurvivesMaliciousPacket(const uint8_t* data,
-                                      size_t length,
-                                      uint8_t ulpfec_payload_type);
-
-  MockRecoveredPacketReceiver recovered_packet_receiver_;
-  std::unique_ptr<ForwardErrorCorrection> fec_;
-  std::unique_ptr<UlpfecReceiver> receiver_fec_;
-  UlpfecPacketGenerator packet_generator_;
-};
-
-void UlpfecReceiverTest::EncodeFec(
-    const ForwardErrorCorrection::PacketList& media_packets,
-    size_t num_fec_packets,
-    std::list<ForwardErrorCorrection::Packet*>* fec_packets) {
-  const uint8_t protection_factor =
-      num_fec_packets * 255 / media_packets.size();
-  // Unequal protection is turned off, and the number of important
-  // packets is thus irrelevant.
-  constexpr int kNumImportantPackets = 0;
-  constexpr bool kUseUnequalProtection = false;
-  constexpr FecMaskType kFecMaskType = kFecMaskBursty;
-  EXPECT_EQ(
-      0, fec_->EncodeFec(media_packets, protection_factor, kNumImportantPackets,
-                         kUseUnequalProtection, kFecMaskType, fec_packets));
-  ASSERT_EQ(num_fec_packets, fec_packets->size());
-}
-
-void UlpfecReceiverTest::PacketizeFrame(
-    size_t num_media_packets,
-    size_t frame_offset,
-    std::list<AugmentedPacket*>* augmented_packets,
-    ForwardErrorCorrection::PacketList* packets) {
-  packet_generator_.NewFrame(num_media_packets);
-  for (size_t i = 0; i < num_media_packets; ++i) {
-    std::unique_ptr<AugmentedPacket> next_packet(
-        packet_generator_.NextPacket(frame_offset + i, kRtpHeaderSize + 10));
-    augmented_packets->push_back(next_packet.get());
-    packets->push_back(std::move(next_packet));
-  }
-}
-
-void UlpfecReceiverTest::BuildAndAddRedMediaPacket(AugmentedPacket* packet) {
-  std::unique_ptr<AugmentedPacket> red_packet(
-      packet_generator_.BuildMediaRedPacket(*packet));
-  EXPECT_EQ(0, receiver_fec_->AddReceivedRedPacket(
-                   red_packet->header.header, red_packet->data,
-                   red_packet->length, kFecPayloadType));
-}
-
-void UlpfecReceiverTest::BuildAndAddRedFecPacket(Packet* packet) {
-  std::unique_ptr<AugmentedPacket> red_packet(
-      packet_generator_.BuildUlpfecRedPacket(*packet));
-  EXPECT_EQ(0, receiver_fec_->AddReceivedRedPacket(
-                   red_packet->header.header, red_packet->data,
-                   red_packet->length, kFecPayloadType));
-}
-
-void UlpfecReceiverTest::VerifyReconstructedMediaPacket(
-    const AugmentedPacket& packet,
-    size_t times) {
-  // Verify that the content of the reconstructed packet is equal to the
-  // content of |packet|, and that the same content is received |times| number
-  // of times in a row.
-  EXPECT_CALL(recovered_packet_receiver_, OnRecoveredPacket(_, packet.length))
-      .With(Args<0, 1>(ElementsAreArray(packet.data, packet.length)))
-      .Times(times);
-}
-
-void UlpfecReceiverTest::InjectGarbagePacketLength(size_t fec_garbage_offset) {
-  EXPECT_CALL(recovered_packet_receiver_, OnRecoveredPacket(_, _));
-
-  const size_t kNumFecPackets = 1;
-  std::list<AugmentedPacket*> augmented_media_packets;
-  ForwardErrorCorrection::PacketList media_packets;
-  PacketizeFrame(2, 0, &augmented_media_packets, &media_packets);
-  std::list<ForwardErrorCorrection::Packet*> fec_packets;
-  EncodeFec(media_packets, kNumFecPackets, &fec_packets);
-  ByteWriter<uint16_t>::WriteBigEndian(
-      &fec_packets.front()->data[fec_garbage_offset], 0x4711);
-
-  // Inject first media packet, then first FEC packet, skipping the second media
-  // packet to cause a recovery from the FEC packet.
-  BuildAndAddRedMediaPacket(augmented_media_packets.front());
-  BuildAndAddRedFecPacket(fec_packets.front());
-  EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
-
-  FecPacketCounter counter = receiver_fec_->GetPacketCounter();
-  EXPECT_EQ(2U, counter.num_packets);
-  EXPECT_EQ(1U, counter.num_fec_packets);
-  EXPECT_EQ(0U, counter.num_recovered_packets);
-}
-
-void UlpfecReceiverTest::SurvivesMaliciousPacket(const uint8_t* data,
-                                                 size_t length,
-                                                 uint8_t ulpfec_payload_type) {
-  RTPHeader header;
-  std::unique_ptr<RtpHeaderParser> parser(RtpHeaderParser::Create());
-  ASSERT_TRUE(parser->Parse(data, length, &header));
-
-  NullRecoveredPacketReceiver null_callback;
-  std::unique_ptr<UlpfecReceiver> receiver_fec(
-      UlpfecReceiver::Create(kMediaSsrc, &null_callback));
-
-  receiver_fec->AddReceivedRedPacket(header, data, length, ulpfec_payload_type);
-}
-
-TEST_F(UlpfecReceiverTest, TwoMediaOneFec) {
-  constexpr size_t kNumFecPackets = 1u;
-  std::list<AugmentedPacket*> augmented_media_packets;
-  ForwardErrorCorrection::PacketList media_packets;
-  PacketizeFrame(2, 0, &augmented_media_packets, &media_packets);
-  std::list<ForwardErrorCorrection::Packet*> fec_packets;
-  EncodeFec(media_packets, kNumFecPackets, &fec_packets);
-
-  FecPacketCounter counter = receiver_fec_->GetPacketCounter();
-  EXPECT_EQ(0u, counter.num_packets);
-  EXPECT_EQ(-1, counter.first_packet_time_ms);
-
-  // Recovery
-  auto it = augmented_media_packets.begin();
-  BuildAndAddRedMediaPacket(*it);
-  VerifyReconstructedMediaPacket(**it, 1);
-  EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
-  counter = receiver_fec_->GetPacketCounter();
-  EXPECT_EQ(1u, counter.num_packets);
-  EXPECT_EQ(0u, counter.num_fec_packets);
-  EXPECT_EQ(0u, counter.num_recovered_packets);
-  const int64_t first_packet_time_ms = counter.first_packet_time_ms;
-  EXPECT_NE(-1, first_packet_time_ms);
-
-  // Drop one media packet.
-  auto fec_it = fec_packets.begin();
-  BuildAndAddRedFecPacket(*fec_it);
-  ++it;
-  VerifyReconstructedMediaPacket(**it, 1);
-  EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
-
-  counter = receiver_fec_->GetPacketCounter();
-  EXPECT_EQ(2u, counter.num_packets);
-  EXPECT_EQ(1u, counter.num_fec_packets);
-  EXPECT_EQ(1u, counter.num_recovered_packets);
-  EXPECT_EQ(first_packet_time_ms, counter.first_packet_time_ms);
-}
-
-TEST_F(UlpfecReceiverTest, InjectGarbageFecHeaderLengthRecovery) {
-  // Byte offset 8 is the 'length recovery' field of the FEC header.
-  InjectGarbagePacketLength(8);
-}
-
-TEST_F(UlpfecReceiverTest, InjectGarbageFecLevelHeaderProtectionLength) {
-  // Byte offset 10 is the 'protection length' field in the first FEC level
-  // header.
-  InjectGarbagePacketLength(10);
-}
-
-TEST_F(UlpfecReceiverTest, TwoMediaTwoFec) {
-  const size_t kNumFecPackets = 2;
-  std::list<AugmentedPacket*> augmented_media_packets;
-  ForwardErrorCorrection::PacketList media_packets;
-  PacketizeFrame(2, 0, &augmented_media_packets, &media_packets);
-  std::list<ForwardErrorCorrection::Packet*> fec_packets;
-  EncodeFec(media_packets, kNumFecPackets, &fec_packets);
-
-  // Recovery
-  // Drop both media packets.
-  auto it = augmented_media_packets.begin();
-  auto fec_it = fec_packets.begin();
-  BuildAndAddRedFecPacket(*fec_it);
-  VerifyReconstructedMediaPacket(**it, 1);
-  EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
-  ++fec_it;
-  BuildAndAddRedFecPacket(*fec_it);
-  ++it;
-  VerifyReconstructedMediaPacket(**it, 1);
-  EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
-}
-
-TEST_F(UlpfecReceiverTest, TwoFramesOneFec) {
-  const size_t kNumFecPackets = 1;
-  std::list<AugmentedPacket*> augmented_media_packets;
-  ForwardErrorCorrection::PacketList media_packets;
-  PacketizeFrame(1, 0, &augmented_media_packets, &media_packets);
-  PacketizeFrame(1, 1, &augmented_media_packets, &media_packets);
-  std::list<ForwardErrorCorrection::Packet*> fec_packets;
-  EncodeFec(media_packets, kNumFecPackets, &fec_packets);
-
-  // Recovery
-  auto it = augmented_media_packets.begin();
-  BuildAndAddRedMediaPacket(augmented_media_packets.front());
-  VerifyReconstructedMediaPacket(**it, 1);
-  EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
-  // Drop one media packet.
-  BuildAndAddRedFecPacket(fec_packets.front());
-  ++it;
-  VerifyReconstructedMediaPacket(**it, 1);
-  EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
-}
-
-TEST_F(UlpfecReceiverTest, OneCompleteOneUnrecoverableFrame) {
-  const size_t kNumFecPackets = 1;
-  std::list<AugmentedPacket*> augmented_media_packets;
-  ForwardErrorCorrection::PacketList media_packets;
-  PacketizeFrame(1, 0, &augmented_media_packets, &media_packets);
-  PacketizeFrame(2, 1, &augmented_media_packets, &media_packets);
-
-  std::list<ForwardErrorCorrection::Packet*> fec_packets;
-  EncodeFec(media_packets, kNumFecPackets, &fec_packets);
-
-  // Recovery
-  auto it = augmented_media_packets.begin();
-  BuildAndAddRedMediaPacket(*it);  // First frame: one packet.
-  VerifyReconstructedMediaPacket(**it, 1);
-  EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
-  ++it;
-  BuildAndAddRedMediaPacket(*it);  // First packet of second frame.
-  VerifyReconstructedMediaPacket(**it, 1);
-  EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
-}
-
-TEST_F(UlpfecReceiverTest, MaxFramesOneFec) {
-  const size_t kNumFecPackets = 1;
-  const size_t kNumMediaPackets = 48;
-  std::list<AugmentedPacket*> augmented_media_packets;
-  ForwardErrorCorrection::PacketList media_packets;
-  for (size_t i = 0; i < kNumMediaPackets; ++i) {
-    PacketizeFrame(1, i, &augmented_media_packets, &media_packets);
-  }
-  std::list<ForwardErrorCorrection::Packet*> fec_packets;
-  EncodeFec(media_packets, kNumFecPackets, &fec_packets);
-
-  // Recovery
-  auto it = augmented_media_packets.begin();
-  ++it;  // Drop first packet.
-  for (; it != augmented_media_packets.end(); ++it) {
-    BuildAndAddRedMediaPacket(*it);
-    VerifyReconstructedMediaPacket(**it, 1);
-    EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
-  }
-  BuildAndAddRedFecPacket(fec_packets.front());
-  it = augmented_media_packets.begin();
-  VerifyReconstructedMediaPacket(**it, 1);
-  EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
-}
-
-TEST_F(UlpfecReceiverTest, TooManyFrames) {
-  const size_t kNumFecPackets = 1;
-  const size_t kNumMediaPackets = 49;
-  std::list<AugmentedPacket*> augmented_media_packets;
-  ForwardErrorCorrection::PacketList media_packets;
-  for (size_t i = 0; i < kNumMediaPackets; ++i) {
-    PacketizeFrame(1, i, &augmented_media_packets, &media_packets);
-  }
-  std::list<ForwardErrorCorrection::Packet*> fec_packets;
-  EXPECT_EQ(-1, fec_->EncodeFec(media_packets,
-                                kNumFecPackets * 255 / kNumMediaPackets, 0,
-                                false, kFecMaskBursty, &fec_packets));
-}
-
-TEST_F(UlpfecReceiverTest, PacketNotDroppedTooEarly) {
-  // 1 frame with 2 media packets and one FEC packet. One media packet missing.
-  // Delay the FEC packet.
-  Packet* delayed_fec = nullptr;
-  const size_t kNumFecPacketsBatch1 = 1;
-  const size_t kNumMediaPacketsBatch1 = 2;
-  std::list<AugmentedPacket*> augmented_media_packets_batch1;
-  ForwardErrorCorrection::PacketList media_packets_batch1;
-  PacketizeFrame(kNumMediaPacketsBatch1, 0, &augmented_media_packets_batch1,
-                 &media_packets_batch1);
-  std::list<ForwardErrorCorrection::Packet*> fec_packets;
-  EncodeFec(media_packets_batch1, kNumFecPacketsBatch1, &fec_packets);
-
-  BuildAndAddRedMediaPacket(augmented_media_packets_batch1.front());
-  EXPECT_CALL(recovered_packet_receiver_, OnRecoveredPacket(_, _))
-      .Times(1);
-  EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
-  delayed_fec = fec_packets.front();
-
-  // Fill the FEC decoder. No packets should be dropped.
-  const size_t kNumMediaPacketsBatch2 = 46;
-  std::list<AugmentedPacket*> augmented_media_packets_batch2;
-  ForwardErrorCorrection::PacketList media_packets_batch2;
-  for (size_t i = 0; i < kNumMediaPacketsBatch2; ++i) {
-    PacketizeFrame(1, i, &augmented_media_packets_batch2,
-                   &media_packets_batch2);
-  }
-  for (auto it = augmented_media_packets_batch2.begin();
-       it != augmented_media_packets_batch2.end(); ++it) {
-    BuildAndAddRedMediaPacket(*it);
-    EXPECT_CALL(recovered_packet_receiver_, OnRecoveredPacket(_, _))
-        .Times(1);
-    EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
-  }
-
-  // Add the delayed FEC packet. One packet should be reconstructed.
-  BuildAndAddRedFecPacket(delayed_fec);
-  EXPECT_CALL(recovered_packet_receiver_, OnRecoveredPacket(_, _))
-      .Times(1);
-  EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
-}
-
-TEST_F(UlpfecReceiverTest, PacketDroppedWhenTooOld) {
-  // 1 frame with 2 media packets and one FEC packet. One media packet missing.
-  // Delay the FEC packet.
-  Packet* delayed_fec = nullptr;
-  const size_t kNumFecPacketsBatch1 = 1;
-  const size_t kNumMediaPacketsBatch1 = 2;
-  std::list<AugmentedPacket*> augmented_media_packets_batch1;
-  ForwardErrorCorrection::PacketList media_packets_batch1;
-  PacketizeFrame(kNumMediaPacketsBatch1, 0, &augmented_media_packets_batch1,
-                 &media_packets_batch1);
-  std::list<ForwardErrorCorrection::Packet*> fec_packets;
-  EncodeFec(media_packets_batch1, kNumFecPacketsBatch1, &fec_packets);
-
-  BuildAndAddRedMediaPacket(augmented_media_packets_batch1.front());
-  EXPECT_CALL(recovered_packet_receiver_, OnRecoveredPacket(_, _))
-      .Times(1);
-  EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
-  delayed_fec = fec_packets.front();
-
-  // Fill the FEC decoder and force the last packet to be dropped.
-  const size_t kNumMediaPacketsBatch2 = 48;
-  std::list<AugmentedPacket*> augmented_media_packets_batch2;
-  ForwardErrorCorrection::PacketList media_packets_batch2;
-  for (size_t i = 0; i < kNumMediaPacketsBatch2; ++i) {
-    PacketizeFrame(1, i, &augmented_media_packets_batch2,
-                   &media_packets_batch2);
-  }
-  for (auto it = augmented_media_packets_batch2.begin();
-       it != augmented_media_packets_batch2.end(); ++it) {
-    BuildAndAddRedMediaPacket(*it);
-    EXPECT_CALL(recovered_packet_receiver_, OnRecoveredPacket(_, _))
-        .Times(1);
-    EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
-  }
-
-  // Add the delayed FEC packet. No packet should be reconstructed since the
-  // first media packet of that frame has been dropped due to being too old.
-  BuildAndAddRedFecPacket(delayed_fec);
-  EXPECT_CALL(recovered_packet_receiver_, OnRecoveredPacket(_, _)).Times(0);
-  EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
-}
-
-TEST_F(UlpfecReceiverTest, OldFecPacketDropped) {
-  // 49 frames with 2 media packets and one FEC packet. All media packets
-  // missing.
-  const size_t kNumMediaPackets = 49 * 2;
-  std::list<AugmentedPacket*> augmented_media_packets;
-  ForwardErrorCorrection::PacketList media_packets;
-  for (size_t i = 0; i < kNumMediaPackets / 2; ++i) {
-    std::list<AugmentedPacket*> frame_augmented_media_packets;
-    ForwardErrorCorrection::PacketList frame_media_packets;
-    std::list<ForwardErrorCorrection::Packet*> fec_packets;
-    PacketizeFrame(2, 0, &frame_augmented_media_packets, &frame_media_packets);
-    EncodeFec(frame_media_packets, 1, &fec_packets);
-    for (auto it = fec_packets.begin(); it != fec_packets.end(); ++it) {
-      // Only FEC packets inserted. No packets recoverable at this time.
-      BuildAndAddRedFecPacket(*it);
-      EXPECT_CALL(recovered_packet_receiver_, OnRecoveredPacket(_, _)).Times(0);
-      EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
-    }
-    // Move unique_ptr's to media_packets for lifetime management.
-    media_packets.insert(media_packets.end(),
-                         std::make_move_iterator(frame_media_packets.begin()),
-                         std::make_move_iterator(frame_media_packets.end()));
-    augmented_media_packets.insert(augmented_media_packets.end(),
-                                   frame_augmented_media_packets.begin(),
-                                   frame_augmented_media_packets.end());
-  }
-  // Insert the oldest media packet. The corresponding FEC packet is too old
-  // and should have been dropped. Only the media packet we inserted will be
-  // returned.
-  BuildAndAddRedMediaPacket(augmented_media_packets.front());
-  EXPECT_CALL(recovered_packet_receiver_, OnRecoveredPacket(_, _))
-      .Times(1);
-  EXPECT_EQ(0, receiver_fec_->ProcessReceivedFec());
-}
-
-TEST_F(UlpfecReceiverTest, TruncatedPacketWithFBitSet) {
-  const uint8_t kTruncatedPacket[] = {0x80, 0x2a, 0x68, 0x71, 0x29, 0xa1, 0x27,
-                                      0x3a, 0x29, 0x12, 0x2a, 0x98, 0xe0, 0x29};
-
-  SurvivesMaliciousPacket(kTruncatedPacket, sizeof(kTruncatedPacket), 100);
-}
-
-TEST_F(UlpfecReceiverTest,
-       TruncatedPacketWithFBitSetEndingAfterFirstRedHeader) {
-  const uint8_t kPacket[] = {
-      0x89, 0x27, 0x3a, 0x83, 0x27, 0x3a, 0x3a, 0xf3, 0x67, 0xbe, 0x2a,
-      0xa9, 0x27, 0x54, 0x3a, 0x3a, 0x2a, 0x67, 0x3a, 0xf3, 0x67, 0xbe,
-      0x2a, 0x27, 0xe6, 0xf6, 0x03, 0x3e, 0x29, 0x27, 0x21, 0x27, 0x2a,
-      0x29, 0x21, 0x4b, 0x29, 0x3a, 0x28, 0x29, 0xbf, 0x29, 0x2a, 0x26,
-      0x29, 0xae, 0x27, 0xa6, 0xf6, 0x00, 0x03, 0x3e};
-  SurvivesMaliciousPacket(kPacket, sizeof(kPacket), 100);
-}
-
-TEST_F(UlpfecReceiverTest, TruncatedPacketWithoutDataPastFirstBlock) {
-  const uint8_t kPacket[] = {
-      0x82, 0x38, 0x92, 0x38, 0x92, 0x38, 0xde, 0x2a, 0x11, 0xc8, 0xa3, 0xc4,
-      0x82, 0x38, 0x2a, 0x21, 0x2a, 0x28, 0x92, 0x38, 0x92, 0x00, 0x00, 0x0a,
-      0x3a, 0xc8, 0xa3, 0x3a, 0x27, 0xc4, 0x2a, 0x21, 0x2a, 0x28};
-  SurvivesMaliciousPacket(kPacket, sizeof(kPacket), 100);
-}
-
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/source/video_codec_information.h b/modules/rtp_rtcp/source/video_codec_information.h
deleted file mode 100644
index 7b819d0..0000000
--- a/modules/rtp_rtcp/source/video_codec_information.h
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- *  Copyright (c) 2011 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_RTP_RTCP_SOURCE_VIDEO_CODEC_INFORMATION_H_
-#define WEBRTC_MODULES_RTP_RTCP_SOURCE_VIDEO_CODEC_INFORMATION_H_
-
-#include "webrtc/modules/rtp_rtcp/source/rtp_rtcp_config.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_utility.h"
-
-namespace webrtc {
-class VideoCodecInformation {
- public:
-  virtual void Reset() = 0;
-
-  virtual RtpVideoCodecTypes Type() = 0;
-  virtual ~VideoCodecInformation() {}
-};
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_RTP_RTCP_SOURCE_VIDEO_CODEC_INFORMATION_H_
diff --git a/modules/rtp_rtcp/test/testAPI/test_api.cc b/modules/rtp_rtcp/test/testAPI/test_api.cc
deleted file mode 100644
index fadf8f4..0000000
--- a/modules/rtp_rtcp/test/testAPI/test_api.cc
+++ /dev/null
@@ -1,163 +0,0 @@
-/*
- *  Copyright (c) 2012 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/rtp_rtcp/test/testAPI/test_api.h"
-
-#include <algorithm>
-#include <memory>
-#include <vector>
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/rate_limiter.h"
-#include "webrtc/test/null_transport.h"
-
-namespace webrtc {
-
-void LoopBackTransport::SetSendModule(RtpRtcp* rtp_rtcp_module,
-                                      RTPPayloadRegistry* payload_registry,
-                                      RtpReceiver* receiver,
-                                      ReceiveStatistics* receive_statistics) {
-  rtp_rtcp_module_ = rtp_rtcp_module;
-  rtp_payload_registry_ = payload_registry;
-  rtp_receiver_ = receiver;
-  receive_statistics_ = receive_statistics;
-}
-
-void LoopBackTransport::DropEveryNthPacket(int n) {
-  packet_loss_ = n;
-}
-
-bool LoopBackTransport::SendRtp(const uint8_t* data,
-                                size_t len,
-                                const PacketOptions& options) {
-  count_++;
-  if (packet_loss_ > 0) {
-    if ((count_ % packet_loss_) == 0) {
-      return true;
-    }
-  }
-  RTPHeader header;
-  std::unique_ptr<RtpHeaderParser> parser(RtpHeaderParser::Create());
-  if (!parser->Parse(data, len, &header)) {
-    return false;
-  }
-  PayloadUnion payload_specific;
-  if (!rtp_payload_registry_->GetPayloadSpecifics(header.payloadType,
-                                                  &payload_specific)) {
-    return false;
-  }
-  const uint8_t* payload = data + header.headerLength;
-  RTC_CHECK_GE(len, header.headerLength);
-  const size_t payload_length = len - header.headerLength;
-  receive_statistics_->IncomingPacket(header, len, false);
-  return rtp_receiver_->IncomingRtpPacket(header, payload, payload_length,
-                                          payload_specific, true);
-}
-
-bool LoopBackTransport::SendRtcp(const uint8_t* data, size_t len) {
-  rtp_rtcp_module_->IncomingRtcpPacket((const uint8_t*)data, len);
-  return true;
-}
-
-int32_t TestRtpReceiver::OnReceivedPayloadData(
-    const uint8_t* payload_data,
-    size_t payload_size,
-    const webrtc::WebRtcRTPHeader* rtp_header) {
-  EXPECT_LE(payload_size, sizeof(payload_data_));
-  memcpy(payload_data_, payload_data, payload_size);
-  memcpy(&rtp_header_, rtp_header, sizeof(rtp_header_));
-  payload_size_ = payload_size;
-  return 0;
-}
-
-class RtpRtcpAPITest : public ::testing::Test {
- protected:
-  RtpRtcpAPITest()
-      : fake_clock_(123456), retransmission_rate_limiter_(&fake_clock_, 1000) {
-    test_csrcs_.push_back(1234);
-    test_csrcs_.push_back(2345);
-    test_ssrc_ = 3456;
-    test_timestamp_ = 4567;
-    test_sequence_number_ = 2345;
-  }
-  ~RtpRtcpAPITest() {}
-
-  const uint32_t initial_ssrc = 8888;
-
-  void SetUp() override {
-    RtpRtcp::Configuration configuration;
-    configuration.audio = true;
-    configuration.clock = &fake_clock_;
-    configuration.outgoing_transport = &null_transport_;
-    configuration.retransmission_rate_limiter = &retransmission_rate_limiter_;
-    module_.reset(RtpRtcp::CreateRtpRtcp(configuration));
-    module_->SetSSRC(initial_ssrc);
-    rtp_payload_registry_.reset(new RTPPayloadRegistry());
-  }
-
-  std::unique_ptr<RTPPayloadRegistry> rtp_payload_registry_;
-  std::unique_ptr<RtpRtcp> module_;
-  uint32_t test_ssrc_;
-  uint32_t test_timestamp_;
-  uint16_t test_sequence_number_;
-  std::vector<uint32_t> test_csrcs_;
-  SimulatedClock fake_clock_;
-  test::NullTransport null_transport_;
-  RateLimiter retransmission_rate_limiter_;
-};
-
-TEST_F(RtpRtcpAPITest, Basic) {
-  module_->SetSequenceNumber(test_sequence_number_);
-  EXPECT_EQ(test_sequence_number_, module_->SequenceNumber());
-
-  module_->SetStartTimestamp(test_timestamp_);
-  EXPECT_EQ(test_timestamp_, module_->StartTimestamp());
-
-  EXPECT_FALSE(module_->Sending());
-  EXPECT_EQ(0, module_->SetSendingStatus(true));
-  EXPECT_TRUE(module_->Sending());
-}
-
-TEST_F(RtpRtcpAPITest, PacketSize) {
-  module_->SetMaxRtpPacketSize(1234);
-  EXPECT_EQ(1234u, module_->MaxRtpPacketSize());
-}
-
-TEST_F(RtpRtcpAPITest, SSRC) {
-  module_->SetSSRC(test_ssrc_);
-  EXPECT_EQ(test_ssrc_, module_->SSRC());
-}
-
-TEST_F(RtpRtcpAPITest, RTCP) {
-  EXPECT_EQ(RtcpMode::kOff, module_->RTCP());
-  module_->SetRTCPStatus(RtcpMode::kCompound);
-  EXPECT_EQ(RtcpMode::kCompound, module_->RTCP());
-
-  EXPECT_EQ(0, module_->SetCNAME("john.doe@test.test"));
-
-  EXPECT_FALSE(module_->TMMBR());
-  module_->SetTMMBRStatus(true);
-  EXPECT_TRUE(module_->TMMBR());
-  module_->SetTMMBRStatus(false);
-  EXPECT_FALSE(module_->TMMBR());
-}
-
-TEST_F(RtpRtcpAPITest, RtxSender) {
-  module_->SetRtxSendStatus(kRtxRetransmitted);
-  EXPECT_EQ(kRtxRetransmitted, module_->RtxSendStatus());
-
-  module_->SetRtxSendStatus(kRtxOff);
-  EXPECT_EQ(kRtxOff, module_->RtxSendStatus());
-
-  module_->SetRtxSendStatus(kRtxRetransmitted);
-  EXPECT_EQ(kRtxRetransmitted, module_->RtxSendStatus());
-}
-
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/test/testAPI/test_api.h b/modules/rtp_rtcp/test/testAPI/test_api.h
deleted file mode 100644
index b2a0361..0000000
--- a/modules/rtp_rtcp/test/testAPI/test_api.h
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- *  Copyright (c) 2012 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_RTP_RTCP_TEST_TESTAPI_TEST_API_H_
-#define WEBRTC_MODULES_RTP_RTCP_TEST_TESTAPI_TEST_API_H_
-
-#include "webrtc/api/call/transport.h"
-#include "webrtc/common_types.h"
-#include "webrtc/modules/rtp_rtcp/include/receive_statistics.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_header_parser.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_payload_registry.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_receiver.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-// This class sends all its packet straight to the provided RtpRtcp module.
-// with optional packet loss.
-class LoopBackTransport : public Transport {
- public:
-  LoopBackTransport()
-      : count_(0),
-        packet_loss_(0),
-        rtp_payload_registry_(NULL),
-        rtp_receiver_(NULL),
-        rtp_rtcp_module_(NULL) {}
-  void SetSendModule(RtpRtcp* rtp_rtcp_module,
-                     RTPPayloadRegistry* payload_registry,
-                     RtpReceiver* receiver,
-                     ReceiveStatistics* receive_statistics);
-  void DropEveryNthPacket(int n);
-  bool SendRtp(const uint8_t* data,
-               size_t len,
-               const PacketOptions& options) override;
-  bool SendRtcp(const uint8_t* data, size_t len) override;
-
- private:
-  int count_;
-  int packet_loss_;
-  ReceiveStatistics* receive_statistics_;
-  RTPPayloadRegistry* rtp_payload_registry_;
-  RtpReceiver* rtp_receiver_;
-  RtpRtcp* rtp_rtcp_module_;
-};
-
-class TestRtpReceiver : public RtpData {
- public:
-  int32_t OnReceivedPayloadData(
-      const uint8_t* payload_data,
-      size_t payload_size,
-      const webrtc::WebRtcRTPHeader* rtp_header) override;
-
-  const uint8_t* payload_data() const { return payload_data_; }
-  size_t payload_size() const { return payload_size_; }
-  webrtc::WebRtcRTPHeader rtp_header() const { return rtp_header_; }
-
- private:
-  uint8_t payload_data_[1500];
-  size_t payload_size_;
-  webrtc::WebRtcRTPHeader rtp_header_;
-};
-
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_RTP_RTCP_TEST_TESTAPI_TEST_API_H_
diff --git a/modules/rtp_rtcp/test/testAPI/test_api_audio.cc b/modules/rtp_rtcp/test/testAPI/test_api_audio.cc
deleted file mode 100644
index a9be072..0000000
--- a/modules/rtp_rtcp/test/testAPI/test_api_audio.cc
+++ /dev/null
@@ -1,287 +0,0 @@
-/*
- *  Copyright (c) 2012 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 <algorithm>
-#include <memory>
-#include <vector>
-
-#include "webrtc/common_types.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_receiver_audio.h"
-#include "webrtc/modules/rtp_rtcp/test/testAPI/test_api.h"
-#include "webrtc/rtc_base/rate_limiter.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-namespace {
-
-const uint32_t kTestRate = 64000u;
-const uint8_t kTestPayload[] = { 't', 'e', 's', 't' };
-const uint8_t kPcmuPayloadType = 96;
-const uint8_t kDtmfPayloadType = 97;
-
-struct CngCodecSpec {
-  int payload_type;
-  int clockrate_hz;
-};
-
-const CngCodecSpec kCngCodecs[] = {{13, 8000},
-                                   {103, 16000},
-                                   {104, 32000},
-                                   {105, 48000}};
-
-bool IsComfortNoisePayload(uint8_t payload_type) {
-  for (const auto& c : kCngCodecs) {
-    if (c.payload_type == payload_type)
-      return true;
-  }
-
-  return false;
-}
-
-class VerifyingAudioReceiver : public RtpData {
- public:
-  int32_t OnReceivedPayloadData(
-      const uint8_t* payloadData,
-      size_t payloadSize,
-      const webrtc::WebRtcRTPHeader* rtpHeader) override {
-    const uint8_t payload_type = rtpHeader->header.payloadType;
-    if (payload_type == kPcmuPayloadType || payload_type == kDtmfPayloadType) {
-      EXPECT_EQ(sizeof(kTestPayload), payloadSize);
-      // All our test vectors for PCMU and DTMF are equal to |kTestPayload|.
-      const size_t min_size = std::min(sizeof(kTestPayload), payloadSize);
-      EXPECT_EQ(0, memcmp(payloadData, kTestPayload, min_size));
-    } else if (IsComfortNoisePayload(payload_type)) {
-      // CNG types should be recognized properly.
-      EXPECT_EQ(kAudioFrameCN, rtpHeader->frameType);
-      EXPECT_TRUE(rtpHeader->type.Audio.isCNG);
-    }
-    return 0;
-  }
-};
-
-class RTPCallback : public NullRtpFeedback {
- public:
-  int32_t OnInitializeDecoder(int8_t payloadType,
-                              const char payloadName[RTP_PAYLOAD_NAME_SIZE],
-                              int frequency,
-                              size_t channels,
-                              uint32_t rate) override {
-    EXPECT_EQ(0u, rate) << "The rate should be zero";
-    return 0;
-  }
-};
-
-}  // namespace
-
-class RtpRtcpAudioTest : public ::testing::Test {
- protected:
-  RtpRtcpAudioTest()
-      : fake_clock(123456), retransmission_rate_limiter_(&fake_clock, 1000) {
-    test_CSRC[0] = 1234;
-    test_CSRC[2] = 2345;
-    test_ssrc = 3456;
-    test_timestamp = 4567;
-    test_sequence_number = 2345;
-  }
-  ~RtpRtcpAudioTest() {}
-
-  void SetUp() override {
-    receive_statistics1_.reset(ReceiveStatistics::Create(&fake_clock));
-    receive_statistics2_.reset(ReceiveStatistics::Create(&fake_clock));
-
-    rtp_payload_registry1_.reset(new RTPPayloadRegistry());
-    rtp_payload_registry2_.reset(new RTPPayloadRegistry());
-
-    RtpRtcp::Configuration configuration;
-    configuration.audio = true;
-    configuration.clock = &fake_clock;
-    configuration.receive_statistics = receive_statistics1_.get();
-    configuration.outgoing_transport = &transport1;
-    configuration.retransmission_rate_limiter = &retransmission_rate_limiter_;
-
-    module1.reset(RtpRtcp::CreateRtpRtcp(configuration));
-    rtp_receiver1_.reset(RtpReceiver::CreateAudioReceiver(
-        &fake_clock, &data_receiver1, &rtp_callback,
-        rtp_payload_registry1_.get()));
-
-    configuration.receive_statistics = receive_statistics2_.get();
-    configuration.outgoing_transport = &transport2;
-
-    module2.reset(RtpRtcp::CreateRtpRtcp(configuration));
-    rtp_receiver2_.reset(RtpReceiver::CreateAudioReceiver(
-        &fake_clock, &data_receiver2, &rtp_callback,
-        rtp_payload_registry2_.get()));
-
-    transport1.SetSendModule(module2.get(), rtp_payload_registry2_.get(),
-                             rtp_receiver2_.get(), receive_statistics2_.get());
-    transport2.SetSendModule(module1.get(), rtp_payload_registry1_.get(),
-                             rtp_receiver1_.get(), receive_statistics1_.get());
-  }
-
-  void RegisterPayload(const CodecInst& codec) {
-    EXPECT_EQ(0, module1->RegisterSendPayload(codec));
-    EXPECT_EQ(0, rtp_receiver1_->RegisterReceivePayload(codec));
-    EXPECT_EQ(0, module2->RegisterSendPayload(codec));
-    EXPECT_EQ(0, rtp_receiver2_->RegisterReceivePayload(codec));
-  }
-
-  VerifyingAudioReceiver data_receiver1;
-  VerifyingAudioReceiver data_receiver2;
-  RTPCallback rtp_callback;
-  std::unique_ptr<ReceiveStatistics> receive_statistics1_;
-  std::unique_ptr<ReceiveStatistics> receive_statistics2_;
-  std::unique_ptr<RTPPayloadRegistry> rtp_payload_registry1_;
-  std::unique_ptr<RTPPayloadRegistry> rtp_payload_registry2_;
-  std::unique_ptr<RtpReceiver> rtp_receiver1_;
-  std::unique_ptr<RtpReceiver> rtp_receiver2_;
-  std::unique_ptr<RtpRtcp> module1;
-  std::unique_ptr<RtpRtcp> module2;
-  LoopBackTransport transport1;
-  LoopBackTransport transport2;
-  uint32_t test_ssrc;
-  uint32_t test_timestamp;
-  uint16_t test_sequence_number;
-  uint32_t test_CSRC[webrtc::kRtpCsrcSize];
-  SimulatedClock fake_clock;
-  RateLimiter retransmission_rate_limiter_;
-};
-
-TEST_F(RtpRtcpAudioTest, Basic) {
-  module1->SetSSRC(test_ssrc);
-  module1->SetStartTimestamp(test_timestamp);
-
-  // Test detection at the end of a DTMF tone.
-  // EXPECT_EQ(0, module2->SetTelephoneEventForwardToDecoder(true));
-
-  EXPECT_EQ(0, module1->SetSendingStatus(true));
-
-  // Start basic RTP test.
-
-  // Send an empty RTP packet.
-  // Should fail since we have not registered the payload type.
-  EXPECT_FALSE(module1->SendOutgoingData(webrtc::kAudioFrameSpeech,
-                                         kPcmuPayloadType, 0, -1, nullptr, 0,
-                                         nullptr, nullptr, nullptr));
-
-  CodecInst voice_codec = {};
-  voice_codec.pltype = kPcmuPayloadType;
-  voice_codec.plfreq = 8000;
-  voice_codec.rate = kTestRate;
-  memcpy(voice_codec.plname, "PCMU", 5);
-  RegisterPayload(voice_codec);
-
-  EXPECT_TRUE(module1->SendOutgoingData(webrtc::kAudioFrameSpeech,
-                                        kPcmuPayloadType, 0, -1, kTestPayload,
-                                        4, nullptr, nullptr, nullptr));
-
-  EXPECT_EQ(test_ssrc, rtp_receiver2_->SSRC());
-  uint32_t timestamp;
-  EXPECT_TRUE(rtp_receiver2_->Timestamp(&timestamp));
-  EXPECT_EQ(test_timestamp, timestamp);
-}
-
-TEST_F(RtpRtcpAudioTest, DTMF) {
-  CodecInst voice_codec = {};
-  voice_codec.pltype = kPcmuPayloadType;
-  voice_codec.plfreq = 8000;
-  voice_codec.rate = kTestRate;
-  memcpy(voice_codec.plname, "PCMU", 5);
-  RegisterPayload(voice_codec);
-
-  module1->SetSSRC(test_ssrc);
-  module1->SetStartTimestamp(test_timestamp);
-  EXPECT_EQ(0, module1->SetSendingStatus(true));
-
-  // Prepare for DTMF.
-  voice_codec.pltype = kDtmfPayloadType;
-  voice_codec.plfreq = 8000;
-  memcpy(voice_codec.plname, "telephone-event", 16);
-
-  EXPECT_EQ(0, module1->RegisterSendPayload(voice_codec));
-  EXPECT_EQ(0, rtp_receiver2_->RegisterReceivePayload(voice_codec));
-
-  // Start DTMF test.
-  int timeStamp = 160;
-
-  // Send a DTMF tone using RFC 2833 (4733).
-  for (int i = 0; i < 16; i++) {
-    EXPECT_EQ(0, module1->SendTelephoneEventOutband(i, timeStamp, 10));
-  }
-  timeStamp += 160;  // Prepare for next packet.
-
-  // Send RTP packets for 16 tones a 160 ms  100ms
-  // pause between = 2560ms + 1600ms = 4160ms
-  for (; timeStamp <= 250 * 160; timeStamp += 160) {
-    EXPECT_TRUE(module1->SendOutgoingData(
-        webrtc::kAudioFrameSpeech, kPcmuPayloadType, timeStamp, -1,
-        kTestPayload, 4, nullptr, nullptr, nullptr));
-    fake_clock.AdvanceTimeMilliseconds(20);
-    module1->Process();
-  }
-  EXPECT_EQ(0, module1->SendTelephoneEventOutband(32, 9000, 10));
-
-  for (; timeStamp <= 740 * 160; timeStamp += 160) {
-    EXPECT_TRUE(module1->SendOutgoingData(
-        webrtc::kAudioFrameSpeech, kPcmuPayloadType, timeStamp, -1,
-        kTestPayload, 4, nullptr, nullptr, nullptr));
-    fake_clock.AdvanceTimeMilliseconds(20);
-    module1->Process();
-  }
-}
-
-TEST_F(RtpRtcpAudioTest, ComfortNoise) {
-  module1->SetSSRC(test_ssrc);
-  module1->SetStartTimestamp(test_timestamp);
-
-  EXPECT_EQ(0, module1->SetSendingStatus(true));
-
-  // Register PCMU and all four comfort noise codecs
-  CodecInst voice_codec = {};
-  voice_codec.pltype = kPcmuPayloadType;
-  voice_codec.plfreq = 8000;
-  voice_codec.rate = kTestRate;
-  memcpy(voice_codec.plname, "PCMU", 5);
-  RegisterPayload(voice_codec);
-
-  for (const auto& c : kCngCodecs) {
-    CodecInst cng_codec = {};
-    cng_codec.pltype = c.payload_type;
-    cng_codec.plfreq = c.clockrate_hz;
-    memcpy(cng_codec.plname, "CN", 3);
-    RegisterPayload(cng_codec);
-  }
-
-  // Transmit comfort noise packets interleaved by PCMU packets.
-  uint32_t in_timestamp = 0;
-  for (const auto& c : kCngCodecs) {
-    uint32_t timestamp;
-    EXPECT_TRUE(module1->SendOutgoingData(
-        webrtc::kAudioFrameSpeech, kPcmuPayloadType, in_timestamp, -1,
-        kTestPayload, 4, nullptr, nullptr, nullptr));
-
-    EXPECT_EQ(test_ssrc, rtp_receiver2_->SSRC());
-    EXPECT_TRUE(rtp_receiver2_->Timestamp(&timestamp));
-    EXPECT_EQ(test_timestamp + in_timestamp, timestamp);
-    in_timestamp += 10;
-
-    EXPECT_TRUE(module1->SendOutgoingData(webrtc::kAudioFrameCN, c.payload_type,
-                                          in_timestamp, -1, kTestPayload, 1,
-                                          nullptr, nullptr, nullptr));
-
-    EXPECT_EQ(test_ssrc, rtp_receiver2_->SSRC());
-    EXPECT_TRUE(rtp_receiver2_->Timestamp(&timestamp));
-    EXPECT_EQ(test_timestamp + in_timestamp, timestamp);
-    in_timestamp += 10;
-  }
-}
-
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/test/testAPI/test_api_rtcp.cc b/modules/rtp_rtcp/test/testAPI/test_api_rtcp.cc
deleted file mode 100644
index 3ce1af7..0000000
--- a/modules/rtp_rtcp/test/testAPI/test_api_rtcp.cc
+++ /dev/null
@@ -1,249 +0,0 @@
-/*
- *  Copyright (c) 2012 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 <algorithm>
-#include <memory>
-#include <vector>
-
-#include "webrtc/common_types.h"
-#include "webrtc/modules/rtp_rtcp/include/receive_statistics.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_receiver_audio.h"
-#include "webrtc/modules/rtp_rtcp/test/testAPI/test_api.h"
-#include "webrtc/rtc_base/rate_limiter.h"
-#include "webrtc/test/gmock.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-namespace {
-
-class RtcpCallback : public RtcpIntraFrameObserver {
- public:
-  void SetModule(RtpRtcp* module) {
-    _rtpRtcpModule = module;
-  }
-  virtual void OnRTCPPacketTimeout(const int32_t id) {
-  }
-  virtual void OnLipSyncUpdate(const int32_t id,
-                               const int32_t audioVideoOffset) {}
-  virtual void OnReceivedIntraFrameRequest(uint32_t ssrc) {}
-
- private:
-  RtpRtcp* _rtpRtcpModule;
-};
-
-class TestRtpFeedback : public NullRtpFeedback {
- public:
-  explicit TestRtpFeedback(RtpRtcp* rtp_rtcp) : rtp_rtcp_(rtp_rtcp) {}
-  virtual ~TestRtpFeedback() {}
-
-  void OnIncomingSSRCChanged(uint32_t ssrc) override {
-    rtp_rtcp_->SetRemoteSSRC(ssrc);
-  }
-
- private:
-  RtpRtcp* rtp_rtcp_;
-};
-
-class RtpRtcpRtcpTest : public ::testing::Test {
- protected:
-  RtpRtcpRtcpTest()
-      : fake_clock(123456), retransmission_rate_limiter_(&fake_clock, 1000) {
-    test_csrcs.push_back(1234);
-    test_csrcs.push_back(2345);
-    test_ssrc = 3456;
-    test_timestamp = 4567;
-    test_sequence_number = 2345;
-  }
-  ~RtpRtcpRtcpTest() {}
-
-  virtual void SetUp() {
-    receiver = new TestRtpReceiver();
-    transport1 = new LoopBackTransport();
-    transport2 = new LoopBackTransport();
-    myRTCPFeedback1 = new RtcpCallback();
-    myRTCPFeedback2 = new RtcpCallback();
-
-    receive_statistics1_.reset(ReceiveStatistics::Create(&fake_clock));
-    receive_statistics2_.reset(ReceiveStatistics::Create(&fake_clock));
-
-    RtpRtcp::Configuration configuration;
-    configuration.audio = true;
-    configuration.clock = &fake_clock;
-    configuration.receive_statistics = receive_statistics1_.get();
-    configuration.outgoing_transport = transport1;
-    configuration.intra_frame_callback = myRTCPFeedback1;
-    configuration.retransmission_rate_limiter = &retransmission_rate_limiter_;
-
-    rtp_payload_registry1_.reset(new RTPPayloadRegistry());
-    rtp_payload_registry2_.reset(new RTPPayloadRegistry());
-
-    module1 = RtpRtcp::CreateRtpRtcp(configuration);
-
-    rtp_feedback1_.reset(new TestRtpFeedback(module1));
-
-    rtp_receiver1_.reset(RtpReceiver::CreateAudioReceiver(
-        &fake_clock, receiver, rtp_feedback1_.get(),
-        rtp_payload_registry1_.get()));
-
-    configuration.receive_statistics = receive_statistics2_.get();
-    configuration.outgoing_transport = transport2;
-    configuration.intra_frame_callback = myRTCPFeedback2;
-
-    module2 = RtpRtcp::CreateRtpRtcp(configuration);
-
-    rtp_feedback2_.reset(new TestRtpFeedback(module2));
-
-    rtp_receiver2_.reset(RtpReceiver::CreateAudioReceiver(
-        &fake_clock, receiver, rtp_feedback2_.get(),
-        rtp_payload_registry2_.get()));
-
-    transport1->SetSendModule(module2, rtp_payload_registry2_.get(),
-                              rtp_receiver2_.get(), receive_statistics2_.get());
-    transport2->SetSendModule(module1, rtp_payload_registry1_.get(),
-                              rtp_receiver1_.get(), receive_statistics1_.get());
-    myRTCPFeedback1->SetModule(module1);
-    myRTCPFeedback2->SetModule(module2);
-
-    module1->SetRTCPStatus(RtcpMode::kCompound);
-    module2->SetRTCPStatus(RtcpMode::kCompound);
-
-    module2->SetSSRC(test_ssrc + 1);
-    module1->SetSSRC(test_ssrc);
-    module1->SetSequenceNumber(test_sequence_number);
-    module1->SetStartTimestamp(test_timestamp);
-
-    module1->SetCsrcs(test_csrcs);
-    EXPECT_EQ(0, module1->SetCNAME("john.doe@test.test"));
-
-    EXPECT_EQ(0, module1->SetSendingStatus(true));
-
-    CodecInst voice_codec;
-    voice_codec.pltype = 96;
-    voice_codec.plfreq = 8000;
-    voice_codec.rate = 64000;
-    memcpy(voice_codec.plname, "PCMU", 5);
-
-    EXPECT_EQ(0, module1->RegisterSendPayload(voice_codec));
-    EXPECT_EQ(0, rtp_receiver1_->RegisterReceivePayload(voice_codec));
-    EXPECT_EQ(0, module2->RegisterSendPayload(voice_codec));
-    EXPECT_EQ(0, rtp_receiver2_->RegisterReceivePayload(voice_codec));
-
-    // We need to send one RTP packet to get the RTCP packet to be accepted by
-    // the receiving module.
-    // send RTP packet with the data "testtest"
-    const uint8_t test[9] = "testtest";
-    EXPECT_EQ(true,
-              module1->SendOutgoingData(webrtc::kAudioFrameSpeech, 96, 0, -1,
-                                        test, 8, nullptr, nullptr, nullptr));
-  }
-
-  virtual void TearDown() {
-    delete module1;
-    delete module2;
-    delete myRTCPFeedback1;
-    delete myRTCPFeedback2;
-    delete transport1;
-    delete transport2;
-    delete receiver;
-  }
-
-  std::unique_ptr<TestRtpFeedback> rtp_feedback1_;
-  std::unique_ptr<TestRtpFeedback> rtp_feedback2_;
-  std::unique_ptr<ReceiveStatistics> receive_statistics1_;
-  std::unique_ptr<ReceiveStatistics> receive_statistics2_;
-  std::unique_ptr<RTPPayloadRegistry> rtp_payload_registry1_;
-  std::unique_ptr<RTPPayloadRegistry> rtp_payload_registry2_;
-  std::unique_ptr<RtpReceiver> rtp_receiver1_;
-  std::unique_ptr<RtpReceiver> rtp_receiver2_;
-  RtpRtcp* module1;
-  RtpRtcp* module2;
-  TestRtpReceiver* receiver;
-  LoopBackTransport* transport1;
-  LoopBackTransport* transport2;
-  RtcpCallback* myRTCPFeedback1;
-  RtcpCallback* myRTCPFeedback2;
-
-  uint32_t test_ssrc;
-  uint32_t test_timestamp;
-  uint16_t test_sequence_number;
-  std::vector<uint32_t> test_csrcs;
-  SimulatedClock fake_clock;
-  RateLimiter retransmission_rate_limiter_;
-};
-
-TEST_F(RtpRtcpRtcpTest, RTCP_CNAME) {
-  uint32_t testOfCSRC[webrtc::kRtpCsrcSize];
-  EXPECT_EQ(2, rtp_receiver2_->CSRCs(testOfCSRC));
-  EXPECT_EQ(test_csrcs[0], testOfCSRC[0]);
-  EXPECT_EQ(test_csrcs[1], testOfCSRC[1]);
-
-  // Set cname of mixed.
-  EXPECT_EQ(0, module1->AddMixedCNAME(test_csrcs[0], "john@192.168.0.1"));
-  EXPECT_EQ(0, module1->AddMixedCNAME(test_csrcs[1], "jane@192.168.0.2"));
-
-  EXPECT_EQ(-1, module1->RemoveMixedCNAME(test_csrcs[0] + 1));
-  EXPECT_EQ(0, module1->RemoveMixedCNAME(test_csrcs[1]));
-  EXPECT_EQ(0, module1->AddMixedCNAME(test_csrcs[1], "jane@192.168.0.2"));
-
-  // send RTCP packet, triggered by timer
-  fake_clock.AdvanceTimeMilliseconds(7500);
-  module1->Process();
-  fake_clock.AdvanceTimeMilliseconds(100);
-  module2->Process();
-
-  char cName[RTCP_CNAME_SIZE];
-  EXPECT_EQ(-1, module2->RemoteCNAME(rtp_receiver2_->SSRC() + 1, cName));
-
-  // Check multiple CNAME.
-  EXPECT_EQ(0, module2->RemoteCNAME(rtp_receiver2_->SSRC(), cName));
-  EXPECT_EQ(0, strncmp(cName, "john.doe@test.test", RTCP_CNAME_SIZE));
-
-  EXPECT_EQ(0, module2->RemoteCNAME(test_csrcs[0], cName));
-  EXPECT_EQ(0, strncmp(cName, "john@192.168.0.1", RTCP_CNAME_SIZE));
-
-  EXPECT_EQ(0, module2->RemoteCNAME(test_csrcs[1], cName));
-  EXPECT_EQ(0, strncmp(cName, "jane@192.168.0.2", RTCP_CNAME_SIZE));
-
-  EXPECT_EQ(0, module1->SetSendingStatus(false));
-
-  // Test that BYE clears the CNAME
-  EXPECT_EQ(-1, module2->RemoteCNAME(rtp_receiver2_->SSRC(), cName));
-}
-
-TEST_F(RtpRtcpRtcpTest, RemoteRTCPStatRemote) {
-  std::vector<RTCPReportBlock> report_blocks;
-
-  EXPECT_EQ(0, module1->RemoteRTCPStat(&report_blocks));
-  EXPECT_EQ(0u, report_blocks.size());
-
-  // send RTCP packet, triggered by timer
-  fake_clock.AdvanceTimeMilliseconds(7500);
-  module1->Process();
-  fake_clock.AdvanceTimeMilliseconds(100);
-  module2->Process();
-
-  EXPECT_EQ(0, module1->RemoteRTCPStat(&report_blocks));
-  ASSERT_EQ(1u, report_blocks.size());
-
-  // |test_ssrc+1| is the SSRC of module2 that send the report.
-  EXPECT_EQ(test_ssrc + 1, report_blocks[0].sender_ssrc);
-  EXPECT_EQ(test_ssrc, report_blocks[0].source_ssrc);
-
-  EXPECT_EQ(0u, report_blocks[0].packets_lost);
-  EXPECT_LT(0u, report_blocks[0].delay_since_last_sender_report);
-  EXPECT_EQ(test_sequence_number,
-            report_blocks[0].extended_highest_sequence_number);
-  EXPECT_EQ(0u, report_blocks[0].fraction_lost);
-}
-
-}  // namespace
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/test/testAPI/test_api_video.cc b/modules/rtp_rtcp/test/testAPI/test_api_video.cc
deleted file mode 100644
index e6b075f..0000000
--- a/modules/rtp_rtcp/test/testAPI/test_api_video.cc
+++ /dev/null
@@ -1,184 +0,0 @@
-/*
- *  Copyright (c) 2012 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 <stdlib.h>
-
-#include <algorithm>
-#include <memory>
-#include <vector>
-
-#include "webrtc/common_types.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_payload_registry.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
-#include "webrtc/modules/rtp_rtcp/source/byte_io.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_receiver_video.h"
-#include "webrtc/modules/rtp_rtcp/test/testAPI/test_api.h"
-#include "webrtc/rtc_base/rate_limiter.h"
-#include "webrtc/test/gtest.h"
-
-namespace {
-
-const unsigned char kPayloadType = 100;
-
-};
-
-namespace webrtc {
-
-class RtpRtcpVideoTest : public ::testing::Test {
- protected:
-  RtpRtcpVideoTest()
-      : test_ssrc_(3456),
-        test_timestamp_(4567),
-        test_sequence_number_(2345),
-        fake_clock(123456),
-        retransmission_rate_limiter_(&fake_clock, 1000) {}
-  ~RtpRtcpVideoTest() {}
-
-  virtual void SetUp() {
-    transport_ = new LoopBackTransport();
-    receiver_ = new TestRtpReceiver();
-    receive_statistics_.reset(ReceiveStatistics::Create(&fake_clock));
-    RtpRtcp::Configuration configuration;
-    configuration.audio = false;
-    configuration.clock = &fake_clock;
-    configuration.outgoing_transport = transport_;
-    configuration.retransmission_rate_limiter = &retransmission_rate_limiter_;
-
-    video_module_ = RtpRtcp::CreateRtpRtcp(configuration);
-    rtp_receiver_.reset(RtpReceiver::CreateVideoReceiver(
-        &fake_clock, receiver_, NULL, &rtp_payload_registry_));
-
-    video_module_->SetRTCPStatus(RtcpMode::kCompound);
-    video_module_->SetSSRC(test_ssrc_);
-    video_module_->SetStorePacketsStatus(true, 600);
-    EXPECT_EQ(0, video_module_->SetSendingStatus(true));
-
-    transport_->SetSendModule(video_module_, &rtp_payload_registry_,
-                              rtp_receiver_.get(), receive_statistics_.get());
-
-    VideoCodec video_codec;
-    memset(&video_codec, 0, sizeof(video_codec));
-    video_codec.plType = 123;
-    memcpy(video_codec.plName, "I420", 5);
-
-    EXPECT_EQ(0, video_module_->RegisterSendPayload(video_codec));
-    EXPECT_EQ(0, rtp_payload_registry_.RegisterReceivePayload(video_codec));
-
-    payload_data_length_ = sizeof(video_frame_);
-
-    for (size_t n = 0; n < payload_data_length_; n++) {
-      video_frame_[n] = n%10;
-    }
-  }
-
-  size_t BuildRTPheader(uint8_t* dataBuffer,
-                         uint32_t timestamp,
-                         uint32_t sequence_number) {
-    dataBuffer[0] = static_cast<uint8_t>(0x80);  // version 2
-    dataBuffer[1] = static_cast<uint8_t>(kPayloadType);
-    ByteWriter<uint16_t>::WriteBigEndian(dataBuffer + 2, sequence_number);
-    ByteWriter<uint32_t>::WriteBigEndian(dataBuffer + 4, timestamp);
-    ByteWriter<uint32_t>::WriteBigEndian(dataBuffer + 8, 0x1234);  // SSRC.
-    size_t rtpHeaderLength = 12;
-    return rtpHeaderLength;
-  }
-
-  size_t PaddingPacket(uint8_t* buffer,
-                       uint32_t timestamp,
-                       uint32_t sequence_number,
-                       size_t bytes) {
-    // Max in the RFC 3550 is 255 bytes, we limit it to be modulus 32 for SRTP.
-    size_t max_length = 224;
-
-    size_t padding_bytes_in_packet = max_length;
-    if (bytes < max_length) {
-      padding_bytes_in_packet = (bytes + 16) & 0xffe0;  // Keep our modulus 32.
-    }
-    // Correct seq num, timestamp and payload type.
-    size_t header_length = BuildRTPheader(buffer, timestamp, sequence_number);
-    buffer[0] |= 0x20;  // Set padding bit.
-    int32_t* data =
-        reinterpret_cast<int32_t*>(&(buffer[header_length]));
-
-    // Fill data buffer with random data.
-    for (size_t j = 0; j < (padding_bytes_in_packet >> 2); j++) {
-      data[j] = rand();  // NOLINT
-    }
-    // Set number of padding bytes in the last byte of the packet.
-    buffer[header_length + padding_bytes_in_packet - 1] =
-        padding_bytes_in_packet;
-    return padding_bytes_in_packet + header_length;
-  }
-
-  virtual void TearDown() {
-    delete video_module_;
-    delete transport_;
-    delete receiver_;
-  }
-
-  int test_id_;
-  std::unique_ptr<ReceiveStatistics> receive_statistics_;
-  RTPPayloadRegistry rtp_payload_registry_;
-  std::unique_ptr<RtpReceiver> rtp_receiver_;
-  RtpRtcp* video_module_;
-  LoopBackTransport* transport_;
-  TestRtpReceiver* receiver_;
-  uint32_t test_ssrc_;
-  uint32_t test_timestamp_;
-  uint16_t test_sequence_number_;
-  uint8_t  video_frame_[65000];
-  size_t payload_data_length_;
-  SimulatedClock fake_clock;
-  RateLimiter retransmission_rate_limiter_;
-};
-
-TEST_F(RtpRtcpVideoTest, BasicVideo) {
-  uint32_t timestamp = 3000;
-  EXPECT_TRUE(video_module_->SendOutgoingData(
-      kVideoFrameDelta, 123, timestamp, timestamp / 90, video_frame_,
-      payload_data_length_, nullptr, nullptr, nullptr));
-}
-
-TEST_F(RtpRtcpVideoTest, PaddingOnlyFrames) {
-  const size_t kPadSize = 255;
-  uint8_t padding_packet[kPadSize];
-  uint32_t seq_num = 0;
-  uint32_t timestamp = 3000;
-  VideoCodec codec;
-  codec.codecType = kVideoCodecVP8;
-  codec.plType = kPayloadType;
-  strncpy(codec.plName, "VP8", 4);
-  EXPECT_EQ(0, rtp_payload_registry_.RegisterReceivePayload(codec));
-  for (int frame_idx = 0; frame_idx < 10; ++frame_idx) {
-    for (int packet_idx = 0; packet_idx < 5; ++packet_idx) {
-      size_t packet_size = PaddingPacket(padding_packet, timestamp, seq_num,
-                                         kPadSize);
-      ++seq_num;
-      RTPHeader header;
-      std::unique_ptr<RtpHeaderParser> parser(RtpHeaderParser::Create());
-      EXPECT_TRUE(parser->Parse(padding_packet, packet_size, &header));
-      PayloadUnion payload_specific;
-      EXPECT_TRUE(rtp_payload_registry_.GetPayloadSpecifics(header.payloadType,
-                                                            &payload_specific));
-      const uint8_t* payload = padding_packet + header.headerLength;
-      const size_t payload_length = packet_size - header.headerLength;
-      EXPECT_TRUE(rtp_receiver_->IncomingRtpPacket(header, payload,
-                                                   payload_length,
-                                                   payload_specific, true));
-      EXPECT_EQ(0u, receiver_->payload_size());
-      EXPECT_EQ(payload_length, receiver_->rtp_header().header.paddingLength);
-    }
-    timestamp += 3000;
-    fake_clock.AdvanceTimeMilliseconds(33);
-  }
-}
-
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/test/testFec/average_residual_loss_xor_codes.h b/modules/rtp_rtcp/test/testFec/average_residual_loss_xor_codes.h
deleted file mode 100644
index 6c233bb..0000000
--- a/modules/rtp_rtcp/test/testFec/average_residual_loss_xor_codes.h
+++ /dev/null
@@ -1,191 +0,0 @@
-/*
- *  Copyright (c) 2012 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_RTP_RTCP_TEST_TESTFEC_AVERAGE_RESIDUAL_LOSS_XOR_CODES_H_
-#define WEBRTC_MODULES_RTP_RTCP_TEST_TESTFEC_AVERAGE_RESIDUAL_LOSS_XOR_CODES_H_
-
-namespace webrtc {
-
-// Maximum number of media packets allowed in this test. The burst mask types
-// are currently defined up to (kMaxMediaPacketsTest, kMaxMediaPacketsTest).
-const int kMaxMediaPacketsTest = 12;
-
-// Maximum number of FEC codes considered in this test.
-const int kNumberCodes = kMaxMediaPacketsTest * (kMaxMediaPacketsTest + 1) / 2;
-
-// For the random mask type: reference level for the maximum average residual
-// loss expected for each code size up to:
-// (kMaxMediaPacketsTest, kMaxMediaPacketsTest).
-const float kMaxResidualLossRandomMask[kNumberCodes] = {
-  0.009463f,
-  0.022436f,
-  0.007376f,
-  0.033895f,
-  0.012423f,
-  0.004644f,
-  0.043438f,
-  0.019937f,
-  0.008820f,
-  0.003438f,
-  0.051282f,
-  0.025795f,
-  0.012872f,
-  0.006458f,
-  0.003195f,
-  0.057728f,
-  0.032146f,
-  0.016708f,
-  0.009242f,
-  0.005054f,
-  0.003078f,
-  0.063050f,
-  0.037261f,
-  0.021767f,
-  0.012447f,
-  0.007099f,
-  0.003826f,
-  0.002504f,
-  0.067476f,
-  0.042348f,
-  0.026169f,
-  0.015695f,
-  0.009478f,
-  0.005887f,
-  0.003568f,
-  0.001689f,
-  0.071187f,
-  0.046575f,
-  0.031697f,
-  0.019797f,
-  0.012433f,
-  0.007027f,
-  0.004845f,
-  0.002777f,
-  0.001753f,
-  0.074326f,
-  0.050628f,
-  0.034978f,
-  0.021955f,
-  0.014821f,
-  0.009462f,
-  0.006393f,
-  0.004181f,
-  0.003105f,
-  0.001231f,
-  0.077008f,
-  0.054226f,
-  0.038407f,
-  0.026251f,
-  0.018634f,
-  0.011568f,
-  0.008130f,
-  0.004957f,
-  0.003334f,
-  0.002069f,
-  0.001304f,
-  0.079318f,
-  0.057180f,
-  0.041268f,
-  0.028842f,
-  0.020033f,
-  0.014061f,
-  0.009636f,
-  0.006411f,
-  0.004583f,
-  0.002817f,
-  0.001770f,
-  0.001258f
-};
-
-// For the bursty mask type: reference level for the maximum average residual
-// loss expected for each code size up to:
-// (kMaxMediaPacketsTestf, kMaxMediaPacketsTest).
-const float kMaxResidualLossBurstyMask[kNumberCodes] = {
-  0.033236f,
-  0.053344f,
-  0.026616f,
-  0.064129f,
-  0.036589f,
-  0.021892f,
-  0.071055f,
-  0.043890f,
-  0.028009f,
-  0.018524f,
-  0.075968f,
-  0.049828f,
-  0.033288f,
-  0.022791f,
-  0.016088f,
-  0.079672f,
-  0.054586f,
-  0.037872f,
-  0.026679f,
-  0.019326f,
-  0.014293f,
-  0.082582f,
-  0.058719f,
-  0.042045f,
-  0.030504f,
-  0.022391f,
-  0.016894f,
-  0.012946f,
-  0.084935f,
-  0.062169f,
-  0.045620f,
-  0.033713f,
-  0.025570f,
-  0.019439f,
-  0.015121f,
-  0.011920f,
-  0.086881f,
-  0.065267f,
-  0.048721f,
-  0.037613f,
-  0.028278f,
-  0.022152f,
-  0.017314f,
-  0.013791f,
-  0.011130f,
-  0.088516f,
-  0.067911f,
-  0.051709f,
-  0.040819f,
-  0.030777f,
-  0.024547f,
-  0.019689f,
-  0.015877f,
-  0.012773f,
-  0.010516f,
-  0.089909f,
-  0.070332f,
-  0.054402f,
-  0.043210f,
-  0.034096f,
-  0.026625f,
-  0.021823f,
-  0.017648f,
-  0.014649f,
-  0.011982f,
-  0.010035f,
-  0.091109f,
-  0.072428f,
-  0.056775f,
-  0.045418f,
-  0.036679f,
-  0.028599f,
-  0.023693f,
-  0.019966f,
-  0.016603f,
-  0.013690f,
-  0.011359f,
-  0.009657f
-};
-
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_RTP_RTCP_TEST_TESTFEC_AVERAGE_RESIDUAL_LOSS_XOR_CODES_H_
diff --git a/modules/rtp_rtcp/test/testFec/test_fec.cc b/modules/rtp_rtcp/test/testFec/test_fec.cc
deleted file mode 100644
index cc6512d..0000000
--- a/modules/rtp_rtcp/test/testFec/test_fec.cc
+++ /dev/null
@@ -1,475 +0,0 @@
-/*
- *  Copyright (c) 2012 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.
- */
-
-/*
- * Test application for core FEC algorithm. Calls encoding and decoding
- * functions in ForwardErrorCorrection directly.
- */
-
-#include <string.h>
-#include <time.h>
-
-#include <list>
-
-#include "webrtc/modules/rtp_rtcp/source/byte_io.h"
-#include "webrtc/modules/rtp_rtcp/source/forward_error_correction.h"
-#include "webrtc/modules/rtp_rtcp/source/forward_error_correction_internal.h"
-#include "webrtc/rtc_base/random.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/testsupport/fileutils.h"
-
-// #define VERBOSE_OUTPUT
-
-namespace webrtc {
-namespace fec_private_tables {
-extern const uint8_t** kPacketMaskBurstyTbl[12];
-}
-namespace test {
-using fec_private_tables::kPacketMaskBurstyTbl;
-
-void ReceivePackets(
-    ForwardErrorCorrection::ReceivedPacketList* to_decode_list,
-    ForwardErrorCorrection::ReceivedPacketList* received_packet_list,
-    size_t num_packets_to_decode,
-    float reorder_rate,
-    float duplicate_rate,
-    Random* random) {
-  RTC_DCHECK(to_decode_list->empty());
-  RTC_DCHECK_LE(num_packets_to_decode, received_packet_list->size());
-
-  for (size_t i = 0; i < num_packets_to_decode; i++) {
-    auto it = received_packet_list->begin();
-    // Reorder packets.
-    float random_variable = random->Rand<float>();
-    while (random_variable < reorder_rate) {
-      ++it;
-      if (it == received_packet_list->end()) {
-        --it;
-        break;
-      }
-      random_variable = random->Rand<float>();
-    }
-    to_decode_list->push_back(std::move(*it));
-    received_packet_list->erase(it);
-
-    // Duplicate packets.
-    ForwardErrorCorrection::ReceivedPacket* received_packet =
-        to_decode_list->back().get();
-    random_variable = random->Rand<float>();
-    while (random_variable < duplicate_rate) {
-      std::unique_ptr<ForwardErrorCorrection::ReceivedPacket> duplicate_packet(
-          new ForwardErrorCorrection::ReceivedPacket());
-      *duplicate_packet = *received_packet;
-      duplicate_packet->pkt = new ForwardErrorCorrection::Packet();
-      memcpy(duplicate_packet->pkt->data, received_packet->pkt->data,
-             received_packet->pkt->length);
-      duplicate_packet->pkt->length = received_packet->pkt->length;
-
-      to_decode_list->push_back(std::move(duplicate_packet));
-      random_variable = random->Rand<float>();
-    }
-  }
-}
-
-void RunTest(bool use_flexfec) {
-  // TODO(marpan): Split this function into subroutines/helper functions.
-  enum { kMaxNumberMediaPackets = 48 };
-  enum { kMaxNumberFecPackets = 48 };
-
-  const uint32_t kNumMaskBytesL0 = 2;
-  const uint32_t kNumMaskBytesL1 = 6;
-
-  // FOR UEP
-  const bool kUseUnequalProtection = true;
-
-  // FEC mask types.
-  const FecMaskType kMaskTypes[] = {kFecMaskRandom, kFecMaskBursty};
-  const int kNumFecMaskTypes = sizeof(kMaskTypes) / sizeof(*kMaskTypes);
-
-  // Maximum number of media packets allowed for the mask type.
-  const uint16_t kMaxMediaPackets[] = {
-      kMaxNumberMediaPackets,
-      sizeof(kPacketMaskBurstyTbl) / sizeof(*kPacketMaskBurstyTbl)};
-
-  ASSERT_EQ(12, kMaxMediaPackets[1]) << "Max media packets for bursty mode not "
-                                     << "equal to 12.";
-
-  ForwardErrorCorrection::PacketList media_packet_list;
-  std::list<ForwardErrorCorrection::Packet*> fec_packet_list;
-  ForwardErrorCorrection::ReceivedPacketList to_decode_list;
-  ForwardErrorCorrection::ReceivedPacketList received_packet_list;
-  ForwardErrorCorrection::RecoveredPacketList recovered_packet_list;
-  std::list<uint8_t*> fec_mask_list;
-
-  // Running over only two loss rates to limit execution time.
-  const float loss_rate[] = {0.05f, 0.01f};
-  const uint32_t loss_rate_size = sizeof(loss_rate) / sizeof(*loss_rate);
-  const float reorder_rate = 0.1f;
-  const float duplicate_rate = 0.1f;
-
-  uint8_t media_loss_mask[kMaxNumberMediaPackets];
-  uint8_t fec_loss_mask[kMaxNumberFecPackets];
-  uint8_t fec_packet_masks[kMaxNumberFecPackets][kMaxNumberMediaPackets];
-
-  // Seed the random number generator, storing the seed to file in order to
-  // reproduce past results.
-  const unsigned int random_seed = static_cast<unsigned int>(time(nullptr));
-  Random random(random_seed);
-  std::string filename = webrtc::test::OutputPath() + "randomSeedLog.txt";
-  FILE* random_seed_file = fopen(filename.c_str(), "a");
-  fprintf(random_seed_file, "%u\n", random_seed);
-  fclose(random_seed_file);
-  random_seed_file = nullptr;
-
-  uint16_t seq_num = 0;
-  uint32_t timestamp = random.Rand<uint32_t>();
-  const uint32_t media_ssrc = random.Rand(1u, 0xfffffffe);
-  uint32_t fec_ssrc;
-  uint16_t fec_seq_num_offset;
-  if (use_flexfec) {
-    fec_ssrc = random.Rand(1u, 0xfffffffe);
-    fec_seq_num_offset = random.Rand(0, 1 << 15);
-  } else {
-    fec_ssrc = media_ssrc;
-    fec_seq_num_offset = 0;
-  }
-
-  std::unique_ptr<ForwardErrorCorrection> fec;
-  if (use_flexfec) {
-    fec = ForwardErrorCorrection::CreateFlexfec(fec_ssrc, media_ssrc);
-  } else {
-    RTC_DCHECK_EQ(media_ssrc, fec_ssrc);
-    fec = ForwardErrorCorrection::CreateUlpfec(fec_ssrc);
-  }
-
-  // Loop over the mask types: random and bursty.
-  for (int mask_type_idx = 0; mask_type_idx < kNumFecMaskTypes;
-       ++mask_type_idx) {
-    for (uint32_t loss_rate_idx = 0; loss_rate_idx < loss_rate_size;
-         ++loss_rate_idx) {
-      printf("Loss rate: %.2f, Mask type %d \n", loss_rate[loss_rate_idx],
-             mask_type_idx);
-
-      const uint32_t packet_mask_max = kMaxMediaPackets[mask_type_idx];
-      std::unique_ptr<uint8_t[]> packet_mask(
-          new uint8_t[packet_mask_max * kNumMaskBytesL1]);
-
-      FecMaskType fec_mask_type = kMaskTypes[mask_type_idx];
-
-      for (uint32_t num_media_packets = 1; num_media_packets <= packet_mask_max;
-           num_media_packets++) {
-        internal::PacketMaskTable mask_table(fec_mask_type, num_media_packets);
-
-        for (uint32_t num_fec_packets = 1;
-             num_fec_packets <= num_media_packets &&
-             num_fec_packets <= packet_mask_max;
-             num_fec_packets++) {
-          // Loop over num_imp_packets: usually <= (0.3*num_media_packets).
-          // For this test we check up to ~ (num_media_packets / 4).
-          uint32_t max_num_imp_packets = num_media_packets / 4 + 1;
-          for (uint32_t num_imp_packets = 0;
-               num_imp_packets <= max_num_imp_packets &&
-               num_imp_packets <= packet_mask_max;
-               num_imp_packets++) {
-            uint8_t protection_factor =
-                static_cast<uint8_t>(num_fec_packets * 255 / num_media_packets);
-
-            const uint32_t mask_bytes_per_fec_packet =
-                (num_media_packets > 16) ? kNumMaskBytesL1 : kNumMaskBytesL0;
-
-            memset(packet_mask.get(), 0,
-                   num_media_packets * mask_bytes_per_fec_packet);
-
-            // Transfer packet masks from bit-mask to byte-mask.
-            internal::GeneratePacketMasks(num_media_packets, num_fec_packets,
-                                          num_imp_packets,
-                                          kUseUnequalProtection,
-                                          mask_table, packet_mask.get());
-
-#ifdef VERBOSE_OUTPUT
-            printf(
-                "%u media packets, %u FEC packets, %u num_imp_packets, "
-                "loss rate = %.2f \n",
-                num_media_packets, num_fec_packets, num_imp_packets,
-                loss_rate[loss_rate_idx]);
-            printf("Packet mask matrix \n");
-#endif
-
-            for (uint32_t i = 0; i < num_fec_packets; i++) {
-              for (uint32_t j = 0; j < num_media_packets; j++) {
-                const uint8_t byte_mask =
-                    packet_mask[i * mask_bytes_per_fec_packet + j / 8];
-                const uint32_t bit_position = (7 - j % 8);
-                fec_packet_masks[i][j] =
-                    (byte_mask & (1 << bit_position)) >> bit_position;
-#ifdef VERBOSE_OUTPUT
-                printf("%u ", fec_packet_masks[i][j]);
-#endif
-              }
-#ifdef VERBOSE_OUTPUT
-              printf("\n");
-#endif
-            }
-#ifdef VERBOSE_OUTPUT
-            printf("\n");
-#endif
-            // Check for all zero rows or columns: indicates incorrect mask.
-            uint32_t row_limit = num_media_packets;
-            for (uint32_t i = 0; i < num_fec_packets; ++i) {
-              uint32_t row_sum = 0;
-              for (uint32_t j = 0; j < row_limit; ++j) {
-                row_sum += fec_packet_masks[i][j];
-              }
-              ASSERT_NE(0u, row_sum) << "Row is all zero " << i;
-            }
-            for (uint32_t j = 0; j < row_limit; ++j) {
-              uint32_t column_sum = 0;
-              for (uint32_t i = 0; i < num_fec_packets; ++i) {
-                column_sum += fec_packet_masks[i][j];
-              }
-              ASSERT_NE(0u, column_sum) << "Column is all zero " << j;
-            }
-
-            // Construct media packets.
-            // Reset the sequence number here for each FEC code/mask tested
-            // below, to avoid sequence number wrap-around. In actual decoding,
-            // old FEC packets in list are dropped if sequence number wrap
-            // around is detected. This case is currently not handled below.
-            seq_num = 0;
-            for (uint32_t i = 0; i < num_media_packets; ++i) {
-              std::unique_ptr<ForwardErrorCorrection::Packet> media_packet(
-                  new ForwardErrorCorrection::Packet());
-              const uint32_t kMinPacketSize = 12;
-              const uint32_t kMaxPacketSize = static_cast<uint32_t>(
-                  IP_PACKET_SIZE - 12 - 28 - fec->MaxPacketOverhead());
-              media_packet->length = random.Rand(kMinPacketSize,
-                                                 kMaxPacketSize);
-
-              // Generate random values for the first 2 bytes.
-              media_packet->data[0] = random.Rand<uint8_t>();
-              media_packet->data[1] = random.Rand<uint8_t>();
-
-              // The first two bits are assumed to be 10 by the
-              // FEC encoder. In fact the FEC decoder will set the
-              // two first bits to 10 regardless of what they
-              // actually were. Set the first two bits to 10
-              // so that a memcmp can be performed for the
-              // whole restored packet.
-              media_packet->data[0] |= 0x80;
-              media_packet->data[0] &= 0xbf;
-
-              // FEC is applied to a whole frame.
-              // A frame is signaled by multiple packets without
-              // the marker bit set followed by the last packet of
-              // the frame for which the marker bit is set.
-              // Only push one (fake) frame to the FEC.
-              media_packet->data[1] &= 0x7f;
-
-              ByteWriter<uint16_t>::WriteBigEndian(&media_packet->data[2],
-                                                   seq_num);
-              ByteWriter<uint32_t>::WriteBigEndian(&media_packet->data[4],
-                                                   timestamp);
-              ByteWriter<uint32_t>::WriteBigEndian(&media_packet->data[8],
-                                                   media_ssrc);
-              // Generate random values for payload
-              for (size_t j = 12; j < media_packet->length; ++j) {
-                media_packet->data[j] = random.Rand<uint8_t>();
-              }
-              media_packet_list.push_back(std::move(media_packet));
-              seq_num++;
-            }
-            media_packet_list.back()->data[1] |= 0x80;
-
-            ASSERT_EQ(0, fec->EncodeFec(media_packet_list, protection_factor,
-                                        num_imp_packets, kUseUnequalProtection,
-                                        fec_mask_type, &fec_packet_list))
-                << "EncodeFec() failed";
-
-            ASSERT_EQ(num_fec_packets, fec_packet_list.size())
-                << "We requested " << num_fec_packets << " FEC packets, but "
-                << "EncodeFec() produced " << fec_packet_list.size();
-
-            memset(media_loss_mask, 0, sizeof(media_loss_mask));
-            uint32_t media_packet_idx = 0;
-            for (const auto& media_packet : media_packet_list) {
-              // We want a value between 0 and 1.
-              const float loss_random_variable = random.Rand<float>();
-
-              if (loss_random_variable >= loss_rate[loss_rate_idx]) {
-                media_loss_mask[media_packet_idx] = 1;
-                std::unique_ptr<ForwardErrorCorrection::ReceivedPacket>
-                    received_packet(
-                        new ForwardErrorCorrection::ReceivedPacket());
-                received_packet->pkt = new ForwardErrorCorrection::Packet();
-                received_packet->pkt->length = media_packet->length;
-                memcpy(received_packet->pkt->data, media_packet->data,
-                       media_packet->length);
-                received_packet->ssrc = media_ssrc;
-                received_packet->seq_num =
-                    ByteReader<uint16_t>::ReadBigEndian(&media_packet->data[2]);
-                received_packet->is_fec = false;
-                received_packet_list.push_back(std::move(received_packet));
-              }
-              media_packet_idx++;
-            }
-
-            memset(fec_loss_mask, 0, sizeof(fec_loss_mask));
-            uint32_t fec_packet_idx = 0;
-            for (auto* fec_packet : fec_packet_list) {
-              const float loss_random_variable = random.Rand<float>();
-              if (loss_random_variable >= loss_rate[loss_rate_idx]) {
-                fec_loss_mask[fec_packet_idx] = 1;
-                std::unique_ptr<ForwardErrorCorrection::ReceivedPacket>
-                    received_packet(
-                        new ForwardErrorCorrection::ReceivedPacket());
-                received_packet->pkt = new ForwardErrorCorrection::Packet();
-                received_packet->pkt->length = fec_packet->length;
-                memcpy(received_packet->pkt->data, fec_packet->data,
-                       fec_packet->length);
-                received_packet->seq_num = fec_seq_num_offset + seq_num;
-                received_packet->is_fec = true;
-                received_packet->ssrc = fec_ssrc;
-                received_packet_list.push_back(std::move(received_packet));
-
-                fec_mask_list.push_back(fec_packet_masks[fec_packet_idx]);
-              }
-              ++fec_packet_idx;
-              ++seq_num;
-            }
-
-#ifdef VERBOSE_OUTPUT
-            printf("Media loss mask:\n");
-            for (uint32_t i = 0; i < num_media_packets; i++) {
-              printf("%u ", media_loss_mask[i]);
-            }
-            printf("\n\n");
-
-            printf("FEC loss mask:\n");
-            for (uint32_t i = 0; i < num_fec_packets; i++) {
-              printf("%u ", fec_loss_mask[i]);
-            }
-            printf("\n\n");
-#endif
-
-            auto fec_mask_it = fec_mask_list.begin();
-            while (fec_mask_it != fec_mask_list.end()) {
-              uint32_t hamming_dist = 0;
-              uint32_t recovery_position = 0;
-              for (uint32_t i = 0; i < num_media_packets; i++) {
-                if (media_loss_mask[i] == 0 && (*fec_mask_it)[i] == 1) {
-                  recovery_position = i;
-                  ++hamming_dist;
-                }
-              }
-              auto item_to_delete = fec_mask_it;
-              ++fec_mask_it;
-
-              if (hamming_dist == 1) {
-                // Recovery possible. Restart search.
-                media_loss_mask[recovery_position] = 1;
-                fec_mask_it = fec_mask_list.begin();
-              } else if (hamming_dist == 0) {
-                // FEC packet cannot provide further recovery.
-                fec_mask_list.erase(item_to_delete);
-              }
-            }
-#ifdef VERBOSE_OUTPUT
-            printf("Recovery mask:\n");
-            for (uint32_t i = 0; i < num_media_packets; ++i) {
-              printf("%u ", media_loss_mask[i]);
-            }
-            printf("\n\n");
-#endif
-            // For error-checking frame completion.
-            bool fec_packet_received = false;
-            while (!received_packet_list.empty()) {
-              size_t num_packets_to_decode = random.Rand(
-                  1u, static_cast<uint32_t>(received_packet_list.size()));
-              ReceivePackets(&to_decode_list, &received_packet_list,
-                             num_packets_to_decode, reorder_rate,
-                             duplicate_rate, &random);
-
-              if (fec_packet_received == false) {
-                for (const auto& received_packet : to_decode_list) {
-                  if (received_packet->is_fec) {
-                    fec_packet_received = true;
-                  }
-                }
-              }
-              ASSERT_EQ(0,
-                        fec->DecodeFec(&to_decode_list, &recovered_packet_list))
-                  << "DecodeFec() failed";
-              ASSERT_TRUE(to_decode_list.empty())
-                  << "Received packet list is not empty.";
-            }
-            media_packet_idx = 0;
-            for (const auto& media_packet : media_packet_list) {
-              if (media_loss_mask[media_packet_idx] == 1) {
-                // Should have recovered this packet.
-                auto recovered_packet_list_it = recovered_packet_list.cbegin();
-
-                ASSERT_FALSE(recovered_packet_list_it ==
-                             recovered_packet_list.end())
-                    << "Insufficient number of recovered packets.";
-                ForwardErrorCorrection::RecoveredPacket* recovered_packet =
-                    recovered_packet_list_it->get();
-
-                ASSERT_EQ(recovered_packet->pkt->length, media_packet->length)
-                    << "Recovered packet length not identical to original "
-                    << "media packet";
-                ASSERT_EQ(0, memcmp(recovered_packet->pkt->data,
-                                    media_packet->data, media_packet->length))
-                    << "Recovered packet payload not identical to original "
-                    << "media packet";
-                recovered_packet_list.pop_front();
-              }
-              ++media_packet_idx;
-            }
-            fec->ResetState(&recovered_packet_list);
-            ASSERT_TRUE(recovered_packet_list.empty())
-                << "Excessive number of recovered packets.\t size is: "
-                << recovered_packet_list.size();
-            // -- Teardown --
-            media_packet_list.clear();
-
-            // Clear FEC packet list, so we don't pass in a non-empty
-            // list in the next call to DecodeFec().
-            fec_packet_list.clear();
-
-            // Delete received packets we didn't pass to DecodeFec(), due to
-            // early frame completion.
-            received_packet_list.clear();
-
-            while (!fec_mask_list.empty()) {
-              fec_mask_list.pop_front();
-            }
-            timestamp += 90000 / 30;
-          }  // loop over num_imp_packets
-        }    // loop over FecPackets
-      }      // loop over num_media_packets
-    }  // loop over loss rates
-  }    // loop over mask types
-
-  // Have DecodeFec clear the recovered packet list.
-  fec->ResetState(&recovered_packet_list);
-  ASSERT_TRUE(recovered_packet_list.empty())
-      << "Recovered packet list is not empty";
-}
-
-TEST(FecTest, UlpfecTest) {
-  RunTest(false);
-}
-
-TEST(FecTest, FlexfecTest) {
-  RunTest(true);
-}
-
-}  // namespace test
-}  // namespace webrtc
diff --git a/modules/rtp_rtcp/test/testFec/test_packet_masks_metrics.cc b/modules/rtp_rtcp/test/testFec/test_packet_masks_metrics.cc
deleted file mode 100644
index 7188e22..0000000
--- a/modules/rtp_rtcp/test/testFec/test_packet_masks_metrics.cc
+++ /dev/null
@@ -1,1081 +0,0 @@
-/*
- *  Copyright (c) 2012 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.
- */
-
-/*
- * The purpose of this test is to compute metrics to characterize the properties
- * and efficiency of the packets masks used in the generic XOR FEC code.
- *
- * The metrics measure the efficiency (recovery potential or residual loss) of
- * the FEC code, under various statistical loss models for the packet/symbol
- * loss events. Various constraints on the behavior of these metrics are
- * verified, and compared to the reference RS (Reed-Solomon) code. This serves
- * in some way as a basic check/benchmark for the packet masks.
- *
- * By an FEC code, we mean an erasure packet/symbol code, characterized by:
- * (1) The code size parameters (k,m), where k = number of source/media packets,
- * and m = number of FEC packets,
- * (2) The code type: XOR or RS.
- * In the case of XOR, the residual loss is determined via the set of packet
- * masks (generator matrix). In the case of RS, the residual loss is determined
- * directly from the MDS (maximum distance separable) property of RS.
- *
- * Currently two classes of packets masks are available (random type and bursty
- * type), so three codes are considered below: RS, XOR-random, and XOR-bursty.
- * The bursty class is defined up to k=12, so (k=12,m=12) is largest code size
- * considered in this test.
- *
- * The XOR codes are defined via the RFC 5109 and correspond to the class of
- * LDGM (low density generator matrix) codes, which is a subset of the LDPC
- * (low density parity check) codes. Future implementation will consider
- * extending our XOR codes to include LDPC codes, which explicitly include
- * protection of FEC packets.
- *
- * The type of packet/symbol loss models considered in this test are:
- * (1) Random loss: Bernoulli process, characterized by the average loss rate.
- * (2) Bursty loss: Markov chain (Gilbert-Elliot model), characterized by two
- * parameters: average loss rate and average burst length.
-*/
-
-#include <math.h>
-
-#include <memory>
-
-#include "webrtc/modules/rtp_rtcp/source/forward_error_correction_internal.h"
-#include "webrtc/modules/rtp_rtcp/test/testFec/average_residual_loss_xor_codes.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/testsupport/fileutils.h"
-
-namespace webrtc {
-
-// Maximum number of media packets allows for XOR (RFC 5109) code.
-enum { kMaxNumberMediaPackets = 48 };
-
-// Maximum number of media packets allowed for each mask type.
-const uint16_t kMaxMediaPackets[] = {kMaxNumberMediaPackets, 12};
-
-// Maximum gap size for characterizing the consecutiveness of the loss.
-const int kMaxGapSize = 2 * kMaxMediaPacketsTest;
-
-// Number of gap levels written to file/output.
-const int kGapSizeOutput = 5;
-
-// Maximum number of states for characterizing the residual loss distribution.
-const int kNumStatesDistribution = 2 * kMaxMediaPacketsTest * kMaxGapSize + 1;
-
-// The code type.
-enum CodeType {
-  xor_random_code,    // XOR with random mask type.
-  xor_bursty_code,    // XOR with bursty mask type.
-  rs_code             // Reed_solomon.
-};
-
-// The code size parameters.
-struct CodeSizeParams {
-  int num_media_packets;
-  int num_fec_packets;
-  // Protection level: num_fec_packets / (num_media_packets + num_fec_packets).
-  float protection_level;
-  // Number of loss configurations, for a given loss number and gap number.
-  // The gap number refers to the maximum gap/hole of a loss configuration
-  // (used to measure the "consecutiveness" of the loss).
-  int configuration_density[kNumStatesDistribution];
-};
-
-// The type of loss models.
-enum LossModelType {
-  kRandomLossModel,
-  kBurstyLossModel
-};
-
-struct LossModel {
-  LossModelType loss_type;
-  float average_loss_rate;
-  float average_burst_length;
-};
-
-// Average loss rates.
-const float kAverageLossRate[] = { 0.025f, 0.05f, 0.1f, 0.25f };
-
-// Average burst lengths. The case of |kAverageBurstLength = 1.0| refers to
-// the random model. Note that for the random (Bernoulli) model, the average
-// burst length is determined by the average loss rate, i.e.,
-// AverageBurstLength = 1 / (1 - AverageLossRate) for random model.
-const float kAverageBurstLength[] = { 1.0f, 2.0f, 4.0f };
-
-// Total number of loss models: For each burst length case, there are
-// a number of models corresponding to the loss rates.
-const int kNumLossModels =  (sizeof(kAverageBurstLength) /
-    sizeof(*kAverageBurstLength)) * (sizeof(kAverageLossRate) /
-        sizeof(*kAverageLossRate));
-
-// Thresholds on the average loss rate of the packet loss model, below which
-// certain properties of the codes are expected.
-float loss_rate_upper_threshold = 0.20f;
-float loss_rate_lower_threshold = 0.025f;
-
-// Set of thresholds on the expected average recovery rate, for each code type.
-// These are global thresholds for now; in future version we may condition them
-// on the code length/size and protection level.
-const float kRecoveryRateXorRandom[3] = { 0.94f, 0.50f, 0.19f };
-const float kRecoveryRateXorBursty[3] = { 0.90f, 0.54f, 0.22f };
-
-// Metrics for a given FEC code; each code is defined by the code type
-// (RS, XOR-random/bursty), and the code size parameters (k,m), where
-// k = num_media_packets, m = num_fec_packets.
-struct MetricsFecCode {
-  // The average and variance of the residual loss, as a function of the
-  // packet/symbol loss model. The average/variance is computed by averaging
-  // over all loss configurations wrt the loss probability given by the
-  // underlying loss model.
-  double average_residual_loss[kNumLossModels];
-  double variance_residual_loss[kNumLossModels];
-  // The residual loss, as a function of the loss number and the gap number of
-  // the loss configurations. The gap number refers to the maximum gap/hole of
-  // a loss configuration (used to measure the "consecutiveness" of the loss).
-  double residual_loss_per_loss_gap[kNumStatesDistribution];
-  // The recovery rate as a function of the loss number.
-  double recovery_rate_per_loss[2 * kMaxMediaPacketsTest + 1];
-};
-
-MetricsFecCode kMetricsXorRandom[kNumberCodes];
-MetricsFecCode kMetricsXorBursty[kNumberCodes];
-MetricsFecCode kMetricsReedSolomon[kNumberCodes];
-
-class FecPacketMaskMetricsTest : public ::testing::Test {
- protected:
-  FecPacketMaskMetricsTest() { }
-
-  int max_num_codes_;
-  LossModel loss_model_[kNumLossModels];
-  CodeSizeParams code_params_[kNumberCodes];
-
-  uint8_t fec_packet_masks_[kMaxNumberMediaPackets][kMaxNumberMediaPackets];
-  FILE* fp_mask_;
-
-  // Measure of the gap of the loss for configuration given by |state|.
-  // This is to measure degree of consecutiveness for the loss configuration.
-  // Useful if the packets are sent out in order of sequence numbers and there
-  // is little/no re-ordering during transmission.
-  int GapLoss(int tot_num_packets, uint8_t* state) {
-    int max_gap_loss = 0;
-    // Find the first loss.
-    int first_loss = 0;
-    for (int i = 0; i < tot_num_packets; i++) {
-      if (state[i] == 1) {
-        first_loss = i;
-        break;
-      }
-    }
-    int prev_loss = first_loss;
-    for (int i = first_loss + 1; i < tot_num_packets; i++) {
-      if (state[i] == 1) {  // Lost state.
-        int gap_loss = (i - prev_loss) - 1;
-        if (gap_loss > max_gap_loss) {
-          max_gap_loss = gap_loss;
-        }
-        prev_loss = i;
-      }
-    }
-    return max_gap_loss;
-  }
-
-  // Returns the number of recovered media packets for the XOR code, given the
-  // packet mask |fec_packet_masks_|, for the loss state/configuration given by
-  // |state|.
-  int RecoveredMediaPackets(int num_media_packets,
-                            int num_fec_packets,
-                            uint8_t* state) {
-    std::unique_ptr<uint8_t[]> state_tmp(
-        new uint8_t[num_media_packets + num_fec_packets]);
-    memcpy(state_tmp.get(), state, num_media_packets + num_fec_packets);
-    int num_recovered_packets = 0;
-    bool loop_again = true;
-    while (loop_again) {
-      loop_again = false;
-      bool recovered_new_packet = false;
-      // Check if we can recover anything: loop over all possible FEC packets.
-      for (int i = 0; i < num_fec_packets; i++) {
-        if (state_tmp[i + num_media_packets] == 0) {
-          // We have this FEC packet.
-          int num_packets_in_mask = 0;
-          int num_received_packets_in_mask = 0;
-          for (int j = 0; j < num_media_packets; j++) {
-            if (fec_packet_masks_[i][j] == 1) {
-              num_packets_in_mask++;
-              if (state_tmp[j] == 0) {
-                num_received_packets_in_mask++;
-              }
-            }
-          }
-          if ((num_packets_in_mask - 1) == num_received_packets_in_mask) {
-            // We can recover the missing media packet for this FEC packet.
-            num_recovered_packets++;
-            recovered_new_packet = true;
-            int jsel = -1;
-            int check_num_recovered = 0;
-            // Update the state with newly recovered media packet.
-            for (int j = 0; j < num_media_packets; j++) {
-              if (fec_packet_masks_[i][j] == 1 && state_tmp[j] == 1) {
-                // This is the lost media packet we will recover.
-                jsel = j;
-                check_num_recovered++;
-              }
-            }
-            // Check that we can only recover 1 packet.
-            assert(check_num_recovered == 1);
-            // Update the state with the newly recovered media packet.
-            state_tmp[jsel] = 0;
-          }
-        }
-      }  // Go to the next FEC packet in the loop.
-      // If we have recovered at least one new packet in this FEC loop,
-      // go through loop again, otherwise we leave loop.
-      if (recovered_new_packet) {
-        loop_again = true;
-      }
-    }
-    return num_recovered_packets;
-  }
-
-  // Compute the probability of occurence of the loss state/configuration,
-  // given by |state|, for all the loss models considered in this test.
-  void ComputeProbabilityWeight(double* prob_weight,
-                                uint8_t* state,
-                                int tot_num_packets) {
-    // Loop over the loss models.
-    for (int k = 0; k < kNumLossModels; k++) {
-      double loss_rate = static_cast<double>(
-          loss_model_[k].average_loss_rate);
-      double burst_length = static_cast<double>(
-          loss_model_[k].average_burst_length);
-      double result = 1.0;
-      if (loss_model_[k].loss_type == kRandomLossModel) {
-        for (int i = 0; i < tot_num_packets; i++) {
-          if (state[i] == 0) {
-            result *= (1.0 - loss_rate);
-          } else {
-            result *= loss_rate;
-          }
-        }
-      } else {  // Gilbert-Elliot model for burst model.
-        assert(loss_model_[k].loss_type == kBurstyLossModel);
-        // Transition probabilities: from previous to current state.
-        // Prob. of previous = lost --> current = received.
-        double prob10 = 1.0 / burst_length;
-        // Prob. of previous = lost --> currrent = lost.
-        double prob11 = 1.0 - prob10;
-        // Prob. of previous = received --> current = lost.
-        double prob01 = prob10 * (loss_rate / (1.0 - loss_rate));
-        // Prob. of previous = received --> current = received.
-        double prob00 = 1.0 - prob01;
-
-        // Use stationary probability for first state/packet.
-        if (state[0] == 0) {  // Received
-          result = (1.0 - loss_rate);
-        } else {   // Lost
-          result = loss_rate;
-        }
-
-        // Subsequent states: use transition probabilities.
-        for (int i = 1; i < tot_num_packets; i++) {
-          // Current state is received
-          if (state[i] == 0) {
-            if (state[i-1] == 0) {
-              result *= prob00;   // Previous received, current received.
-              } else {
-                result *= prob10;  // Previous lost, current received.
-              }
-          } else {  // Current state is lost
-            if (state[i-1] == 0) {
-              result *= prob01;  // Previous received, current lost.
-            } else {
-              result *= prob11;  // Previous lost, current lost.
-            }
-          }
-        }
-      }
-      prob_weight[k] = result;
-    }
-  }
-
-  void CopyMetrics(MetricsFecCode* metrics_output,
-                   MetricsFecCode metrics_input) {
-    memcpy(metrics_output->average_residual_loss,
-           metrics_input.average_residual_loss,
-           sizeof(double) * kNumLossModels);
-    memcpy(metrics_output->variance_residual_loss,
-           metrics_input.variance_residual_loss,
-           sizeof(double) * kNumLossModels);
-    memcpy(metrics_output->residual_loss_per_loss_gap,
-           metrics_input.residual_loss_per_loss_gap,
-           sizeof(double) * kNumStatesDistribution);
-    memcpy(metrics_output->recovery_rate_per_loss,
-           metrics_input.recovery_rate_per_loss,
-           sizeof(double) * 2 * kMaxMediaPacketsTest);
-  }
-
-  // Compute the residual loss per gap, by summing the
-  // |residual_loss_per_loss_gap| over all loss configurations up to loss number
-  // = |num_fec_packets|.
-  double ComputeResidualLossPerGap(MetricsFecCode metrics,
-                                   int gap_number,
-                                   int num_fec_packets,
-                                   int code_index) {
-    double residual_loss_gap = 0.0;
-    int tot_num_configs = 0;
-    for (int loss = 1; loss <= num_fec_packets; loss++) {
-      int index = gap_number * (2 * kMaxMediaPacketsTest) + loss;
-      residual_loss_gap += metrics.residual_loss_per_loss_gap[index];
-      tot_num_configs +=
-          code_params_[code_index].configuration_density[index];
-    }
-    // Normalize, to compare across code sizes.
-    if (tot_num_configs > 0) {
-      residual_loss_gap = residual_loss_gap /
-          static_cast<double>(tot_num_configs);
-    }
-    return residual_loss_gap;
-  }
-
-  // Compute the recovery rate per loss number, by summing the
-  // |residual_loss_per_loss_gap| over all gap configurations.
-  void ComputeRecoveryRatePerLoss(MetricsFecCode* metrics,
-                                  int num_media_packets,
-                                  int num_fec_packets,
-                                  int code_index) {
-    for (int loss = 1; loss <= num_media_packets + num_fec_packets; loss++) {
-      metrics->recovery_rate_per_loss[loss] = 0.0;
-      int tot_num_configs = 0;
-      double arl = 0.0;
-      for (int gap = 0; gap < kMaxGapSize; gap ++) {
-        int index = gap * (2 * kMaxMediaPacketsTest) + loss;
-        arl += metrics->residual_loss_per_loss_gap[index];
-        tot_num_configs +=
-            code_params_[code_index].configuration_density[index];
-      }
-      // Normalize, to compare across code sizes.
-      if (tot_num_configs > 0) {
-        arl = arl / static_cast<double>(tot_num_configs);
-      }
-      // Recovery rate for a given loss |loss| is 1 minus the scaled |arl|,
-      // where the scale factor is relative to code size/parameters.
-      double scaled_loss = static_cast<double>(loss * num_media_packets) /
-          static_cast<double>(num_media_packets + num_fec_packets);
-      metrics->recovery_rate_per_loss[loss] = 1.0 - arl / scaled_loss;
-    }
-  }
-
-  void SetMetricsZero(MetricsFecCode* metrics) {
-    memset(metrics->average_residual_loss, 0, sizeof(double) * kNumLossModels);
-    memset(metrics->variance_residual_loss, 0, sizeof(double) * kNumLossModels);
-    memset(metrics->residual_loss_per_loss_gap, 0,
-           sizeof(double) * kNumStatesDistribution);
-    memset(metrics->recovery_rate_per_loss, 0,
-           sizeof(double) * 2 * kMaxMediaPacketsTest + 1);
-  }
-
-  // Compute the metrics for an FEC code, given by the code type |code_type|
-  // (XOR-random/ bursty or RS), and by the code index |code_index|
-  // (which containes the code size parameters/protection length).
-  void ComputeMetricsForCode(CodeType code_type,
-                             int code_index) {
-    std::unique_ptr<double[]> prob_weight(new double[kNumLossModels]);
-    memset(prob_weight.get() , 0, sizeof(double) * kNumLossModels);
-    MetricsFecCode metrics_code;
-    SetMetricsZero(&metrics_code);
-
-    int num_media_packets = code_params_[code_index].num_media_packets;
-    int num_fec_packets = code_params_[code_index].num_fec_packets;
-    int tot_num_packets = num_media_packets + num_fec_packets;
-    std::unique_ptr<uint8_t[]> state(new uint8_t[tot_num_packets]);
-    memset(state.get() , 0, tot_num_packets);
-
-    int num_loss_configurations = static_cast<int>(pow(2.0f, tot_num_packets));
-    // Loop over all loss configurations for the symbol sequence of length
-    // |tot_num_packets|. In this version we process up to (k=12, m=12) codes,
-    // and get exact expressions for the residual loss.
-    // TODO(marpan): For larger codes, loop over some random sample of loss
-    // configurations, sampling driven by the underlying statistical loss model
-    // (importance sampling).
-
-    // The symbols/packets are arranged as a sequence of source/media packets
-    // followed by FEC packets. This is the sequence ordering used in the RTP.
-    // A configuration refers to a sequence of received/lost (0/1 bit) states
-    // for the string of packets/symbols. For example, for a (k=4,m=3) code
-    // (4 media packets, 3 FEC packets), with 2 losses (one media and one FEC),
-    // the loss configurations is:
-    // Media1   Media2   Media3   Media4   FEC1   FEC2   FEC3
-    //   0         0        1       0        0      1     0
-    for (int i = 1; i < num_loss_configurations; i++) {
-      // Counter for number of packets lost.
-      int num_packets_lost = 0;
-      // Counters for the number of media packets lost.
-      int num_media_packets_lost = 0;
-
-      // Map configuration number to a loss state.
-      for (int j = 0; j < tot_num_packets; j++) {
-        state[j] = 0;  // Received state.
-        int bit_value = i >> (tot_num_packets - j - 1) & 1;
-        if (bit_value == 1) {
-          state[j] = 1;  // Lost state.
-          num_packets_lost++;
-           if (j < num_media_packets) {
-             num_media_packets_lost++;
-           }
-        }
-      }  // Done with loop over total number of packets.
-      assert(num_media_packets_lost <= num_media_packets);
-      assert(num_packets_lost <= tot_num_packets && num_packets_lost > 0);
-      double residual_loss = 0.0;
-      // Only need to compute residual loss (number of recovered packets) for
-      // configurations that have at least one media packet lost.
-      if (num_media_packets_lost >= 1) {
-        // Compute the number of recovered packets.
-        int num_recovered_packets = 0;
-        if (code_type == xor_random_code || code_type == xor_bursty_code) {
-          num_recovered_packets = RecoveredMediaPackets(num_media_packets,
-                                                        num_fec_packets,
-                                                        state.get());
-        } else {
-          // For the RS code, we can either completely recover all the packets
-          // if the loss is less than or equal to the number of FEC packets,
-          // otherwise we can recover none of the missing packets. This is the
-          // all or nothing (MDS) property of the RS code.
-          if (num_packets_lost <= num_fec_packets) {
-            num_recovered_packets = num_media_packets_lost;
-          }
-        }
-        assert(num_recovered_packets <= num_media_packets);
-        // Compute the residual loss. We only care about recovering media/source
-        // packets, so residual loss is based on lost/recovered media packets.
-        residual_loss = static_cast<double>(num_media_packets_lost -
-                                            num_recovered_packets);
-        // Compute the probability weights for this configuration.
-        ComputeProbabilityWeight(prob_weight.get(),
-                                 state.get(),
-                                 tot_num_packets);
-        // Update the average and variance of the residual loss.
-        for (int k = 0; k < kNumLossModels; k++) {
-          metrics_code.average_residual_loss[k] += residual_loss *
-              prob_weight[k];
-          metrics_code.variance_residual_loss[k] += residual_loss *
-              residual_loss * prob_weight[k];
-        }
-      }  // Done with processing for num_media_packets_lost >= 1.
-      // Update the distribution statistics.
-      // Compute the gap of the loss (the "consecutiveness" of the loss).
-      int gap_loss = GapLoss(tot_num_packets, state.get());
-      assert(gap_loss < kMaxGapSize);
-      int index = gap_loss * (2 * kMaxMediaPacketsTest) + num_packets_lost;
-      assert(index < kNumStatesDistribution);
-      metrics_code.residual_loss_per_loss_gap[index] += residual_loss;
-      if (code_type == xor_random_code) {
-        // The configuration density is only a function of the code length and
-        // only needs to computed for the first |code_type| passed here.
-        code_params_[code_index].configuration_density[index]++;
-      }
-    }  // Done with loop over configurations.
-    // Normalize the average residual loss and compute/normalize the variance.
-    for (int k = 0; k < kNumLossModels; k++) {
-      // Normalize the average residual loss by the total number of packets
-      // |tot_num_packets| (i.e., the code length). For a code with no (zero)
-      // recovery, the average residual loss for that code would be reduced like
-      // ~|average_loss_rate| * |num_media_packets| / |tot_num_packets|. This is
-      // the expected reduction in the average residual loss just from adding
-      // FEC packets to the symbol sequence.
-      metrics_code.average_residual_loss[k] =
-          metrics_code.average_residual_loss[k] /
-          static_cast<double>(tot_num_packets);
-      metrics_code.variance_residual_loss[k] =
-               metrics_code.variance_residual_loss[k] /
-               static_cast<double>(num_media_packets * num_media_packets);
-      metrics_code.variance_residual_loss[k] =
-          metrics_code.variance_residual_loss[k] -
-          (metrics_code.average_residual_loss[k] *
-              metrics_code.average_residual_loss[k]);
-      assert(metrics_code.variance_residual_loss[k] >= 0.0);
-      assert(metrics_code.average_residual_loss[k] > 0.0);
-      metrics_code.variance_residual_loss[k] =
-          sqrt(metrics_code.variance_residual_loss[k]) /
-          metrics_code.average_residual_loss[k];
-    }
-
-    // Compute marginal distribution as a function of loss parameter.
-    ComputeRecoveryRatePerLoss(&metrics_code,
-                               num_media_packets,
-                               num_fec_packets,
-                               code_index);
-    if (code_type == rs_code) {
-      CopyMetrics(&kMetricsReedSolomon[code_index], metrics_code);
-    } else if (code_type == xor_random_code) {
-      CopyMetrics(&kMetricsXorRandom[code_index], metrics_code);
-    } else if (code_type == xor_bursty_code) {
-      CopyMetrics(&kMetricsXorBursty[code_index], metrics_code);
-    } else {
-      assert(false);
-    }
-  }
-
-  void WriteOutMetricsAllFecCodes()  {
-    std::string filename = test::OutputPath() + "data_metrics_all_codes";
-    FILE* fp = fopen(filename.c_str(), "wb");
-    // Loop through codes up to |kMaxMediaPacketsTest|.
-    int code_index = 0;
-    for (int num_media_packets = 1; num_media_packets <= kMaxMediaPacketsTest;
-        num_media_packets++) {
-      for (int num_fec_packets = 1; num_fec_packets <= num_media_packets;
-          num_fec_packets++) {
-        fprintf(fp, "FOR CODE: (%d, %d) \n", num_media_packets,
-                num_fec_packets);
-        for (int k = 0; k < kNumLossModels; k++) {
-          float loss_rate = loss_model_[k].average_loss_rate;
-          float burst_length = loss_model_[k].average_burst_length;
-          fprintf(fp, "Loss rate = %.2f, Burst length = %.2f:  %.4f  %.4f  %.4f"
-              " **** %.4f %.4f %.4f \n",
-              loss_rate,
-              burst_length,
-              100 * kMetricsReedSolomon[code_index].average_residual_loss[k],
-              100 * kMetricsXorRandom[code_index].average_residual_loss[k],
-              100 * kMetricsXorBursty[code_index].average_residual_loss[k],
-              kMetricsReedSolomon[code_index].variance_residual_loss[k],
-              kMetricsXorRandom[code_index].variance_residual_loss[k],
-              kMetricsXorBursty[code_index].variance_residual_loss[k]);
-        }
-        for (int gap = 0; gap < kGapSizeOutput; gap ++) {
-          double rs_residual_loss = ComputeResidualLossPerGap(
-              kMetricsReedSolomon[code_index],
-              gap,
-              num_fec_packets,
-              code_index);
-          double xor_random_residual_loss = ComputeResidualLossPerGap(
-              kMetricsXorRandom[code_index],
-              gap,
-              num_fec_packets,
-              code_index);
-          double xor_bursty_residual_loss = ComputeResidualLossPerGap(
-              kMetricsXorBursty[code_index],
-              gap,
-              num_fec_packets,
-              code_index);
-          fprintf(fp, "Residual loss as a function of gap "
-              "%d: %.4f %.4f %.4f \n",
-              gap,
-              rs_residual_loss,
-              xor_random_residual_loss,
-              xor_bursty_residual_loss);
-        }
-        fprintf(fp, "Recovery rate as a function of loss number \n");
-        for (int loss = 1; loss <= num_media_packets + num_fec_packets;
-                     loss ++) {
-          fprintf(fp, "For loss number %d: %.4f %.4f %.4f \n",
-                  loss,
-                  kMetricsReedSolomon[code_index].
-                  recovery_rate_per_loss[loss],
-                  kMetricsXorRandom[code_index].
-                  recovery_rate_per_loss[loss],
-                  kMetricsXorBursty[code_index].
-                  recovery_rate_per_loss[loss]);
-        }
-        fprintf(fp, "******************\n");
-        fprintf(fp, "\n");
-        code_index++;
-      }
-    }
-    fclose(fp);
-  }
-
-  void SetLossModels() {
-    int num_loss_rates = sizeof(kAverageLossRate) /
-        sizeof(*kAverageLossRate);
-    int num_burst_lengths = sizeof(kAverageBurstLength) /
-        sizeof(*kAverageBurstLength);
-    int num_loss_models = 0;
-    for (int k = 0; k < num_burst_lengths; k++) {
-      for (int k2 = 0; k2 < num_loss_rates; k2++) {
-        loss_model_[num_loss_models].average_loss_rate = kAverageLossRate[k2];
-        loss_model_[num_loss_models].average_burst_length =
-            kAverageBurstLength[k];
-        // First set of loss models are of random type.
-        if (k == 0) {
-          loss_model_[num_loss_models].loss_type = kRandomLossModel;
-        } else {
-          loss_model_[num_loss_models].loss_type = kBurstyLossModel;
-        }
-        num_loss_models++;
-      }
-    }
-    assert(num_loss_models == kNumLossModels);
-  }
-
-  void SetCodeParams() {
-    int code_index = 0;
-    for (int num_media_packets = 1; num_media_packets <= kMaxMediaPacketsTest;
-        num_media_packets++) {
-      for (int num_fec_packets = 1; num_fec_packets <= num_media_packets;
-          num_fec_packets++) {
-        code_params_[code_index].num_media_packets = num_media_packets;
-        code_params_[code_index].num_fec_packets = num_fec_packets;
-        code_params_[code_index].protection_level =
-            static_cast<float>(num_fec_packets) /
-            static_cast<float>(num_media_packets + num_fec_packets);
-        for (int k = 0; k < kNumStatesDistribution; k++) {
-          code_params_[code_index].configuration_density[k] = 0;
-        }
-        code_index++;
-      }
-    }
-    max_num_codes_ = code_index;
-  }
-
-  // Make some basic checks on the packet masks. Return -1 if any of these
-  // checks fail.
-  int RejectInvalidMasks(int num_media_packets, int num_fec_packets) {
-    // Make sure every FEC packet protects something.
-    for (int i = 0; i < num_fec_packets; i++) {
-      int row_degree = 0;
-      for (int j = 0; j < num_media_packets; j++) {
-        if (fec_packet_masks_[i][j] == 1) {
-          row_degree++;
-        }
-      }
-      if (row_degree == 0) {
-        printf("Invalid mask: FEC packet has empty mask (does not protect "
-            "anything) %d %d %d \n", i, num_media_packets, num_fec_packets);
-        return -1;
-      }
-    }
-    // Mask sure every media packet has some protection.
-    for (int j = 0; j < num_media_packets; j++) {
-      int column_degree = 0;
-      for (int i = 0; i < num_fec_packets; i++) {
-        if (fec_packet_masks_[i][j] == 1) {
-          column_degree++;
-        }
-      }
-      if (column_degree == 0) {
-        printf("Invalid mask: Media packet has no protection at all %d %d %d "
-            "\n", j, num_media_packets, num_fec_packets);
-        return -1;
-      }
-    }
-    // Make sure we do not have two identical FEC packets.
-    for (int i = 0; i < num_fec_packets; i++) {
-      for (int i2 = i + 1; i2 < num_fec_packets; i2++) {
-        int overlap = 0;
-        for (int j = 0; j < num_media_packets; j++) {
-          if (fec_packet_masks_[i][j] == fec_packet_masks_[i2][j]) {
-            overlap++;
-          }
-        }
-        if (overlap == num_media_packets) {
-          printf("Invalid mask: Two FEC packets are identical %d %d %d %d \n",
-                 i, i2, num_media_packets, num_fec_packets);
-          return -1;
-        }
-      }
-    }
-    // Avoid codes that have two media packets with full protection (all 1s in
-    // their corresponding columns). This would mean that if we lose those
-    // two packets, we can never recover them even if we receive all the other
-    // packets. Exclude the special cases of 1 or 2 FEC packets.
-    if (num_fec_packets > 2) {
-      for (int j = 0; j < num_media_packets; j++) {
-        for (int j2 = j + 1; j2 < num_media_packets; j2++) {
-          int degree = 0;
-          for (int i = 0; i < num_fec_packets; i++) {
-            if (fec_packet_masks_[i][j] == fec_packet_masks_[i][j2] &&
-                fec_packet_masks_[i][j] == 1) {
-              degree++;
-            }
-          }
-          if (degree == num_fec_packets) {
-            printf("Invalid mask: Two media packets are have full degree "
-                "%d %d %d %d \n", j, j2, num_media_packets, num_fec_packets);
-            return -1;
-          }
-        }
-      }
-    }
-    return 0;
-  }
-
-  void GetPacketMaskConvertToBitMask(uint8_t* packet_mask,
-                                     int num_media_packets,
-                                     int num_fec_packets,
-                                     int mask_bytes_fec_packet,
-                                     CodeType code_type) {
-    for (int i = 0; i < num_fec_packets; i++) {
-      for (int j = 0; j < num_media_packets; j++) {
-        const uint8_t byte_mask =
-            packet_mask[i * mask_bytes_fec_packet + j / 8];
-        const int bit_position = (7 - j % 8);
-        fec_packet_masks_[i][j] =
-            (byte_mask & (1 << bit_position)) >> bit_position;
-        fprintf(fp_mask_, "%d ", fec_packet_masks_[i][j]);
-      }
-      fprintf(fp_mask_, "\n");
-    }
-    fprintf(fp_mask_, "\n");
-  }
-
-  int ProcessXORPacketMasks(CodeType code_type,
-                          FecMaskType fec_mask_type) {
-    int code_index = 0;
-    // Maximum number of media packets allowed for the mask type.
-    const int packet_mask_max = kMaxMediaPackets[fec_mask_type];
-    std::unique_ptr<uint8_t[]> packet_mask(
-        new uint8_t[packet_mask_max * kUlpfecMaxPacketMaskSize]);
-    // Loop through codes up to |kMaxMediaPacketsTest|.
-    for (int num_media_packets = 1; num_media_packets <= kMaxMediaPacketsTest;
-        num_media_packets++) {
-      const int mask_bytes_fec_packet =
-          static_cast<int>(internal::PacketMaskSize(num_media_packets));
-      internal::PacketMaskTable mask_table(fec_mask_type, num_media_packets);
-      for (int num_fec_packets = 1; num_fec_packets <= num_media_packets;
-          num_fec_packets++) {
-        memset(packet_mask.get(), 0, num_media_packets * mask_bytes_fec_packet);
-        memcpy(packet_mask.get(),
-               mask_table.fec_packet_mask_table()[num_media_packets - 1]
-                                                 [num_fec_packets - 1],
-               num_fec_packets * mask_bytes_fec_packet);
-        // Convert to bit mask.
-        GetPacketMaskConvertToBitMask(packet_mask.get(), num_media_packets,
-                                      num_fec_packets, mask_bytes_fec_packet,
-                                      code_type);
-        if (RejectInvalidMasks(num_media_packets, num_fec_packets) < 0) {
-          return -1;
-        }
-        // Compute the metrics for this code/mask.
-        ComputeMetricsForCode(code_type,
-                              code_index);
-        code_index++;
-      }
-    }
-    assert(code_index == kNumberCodes);
-    return 0;
-  }
-
-  void ProcessRS(CodeType code_type) {
-    int code_index = 0;
-    for (int num_media_packets = 1; num_media_packets <= kMaxMediaPacketsTest;
-        num_media_packets++) {
-      for (int num_fec_packets = 1; num_fec_packets <= num_media_packets;
-          num_fec_packets++) {
-        // Compute the metrics for this code type.
-        ComputeMetricsForCode(code_type,
-                              code_index);
-        code_index++;
-      }
-    }
-  }
-
-  // Compute metrics for all code types and sizes.
-  void ComputeMetricsAllCodes() {
-    SetLossModels();
-    SetCodeParams();
-    // Get metrics for XOR code with packet masks of random type.
-    std::string filename = test::OutputPath() + "data_packet_masks";
-    fp_mask_ = fopen(filename.c_str(), "wb");
-    fprintf(fp_mask_, "MASK OF TYPE RANDOM: \n");
-    EXPECT_EQ(ProcessXORPacketMasks(xor_random_code, kFecMaskRandom), 0);
-    // Get metrics for XOR code with packet masks of bursty type.
-    fprintf(fp_mask_, "MASK OF TYPE BURSTY: \n");
-    EXPECT_EQ(ProcessXORPacketMasks(xor_bursty_code, kFecMaskBursty), 0);
-    fclose(fp_mask_);
-    // Get metrics for Reed-Solomon code.
-    ProcessRS(rs_code);
-  }
-};
-
-// Verify that the average residual loss, averaged over loss models
-// appropriate to each mask type, is below some maximum acceptable level. The
-// acceptable levels are read in from a file, and correspond to a current set
-// of packet masks. The levels for each code may be updated over time.
-TEST_F(FecPacketMaskMetricsTest, FecXorMaxResidualLoss) {
-  SetLossModels();
-  SetCodeParams();
-  ComputeMetricsAllCodes();
-  WriteOutMetricsAllFecCodes();
-  int num_loss_rates = sizeof(kAverageLossRate) /
-      sizeof(*kAverageLossRate);
-  int num_burst_lengths = sizeof(kAverageBurstLength) /
-      sizeof(*kAverageBurstLength);
-  for (int code_index = 0; code_index < max_num_codes_; code_index++) {
-    double sum_residual_loss_random_mask_random_loss = 0.0;
-    double sum_residual_loss_bursty_mask_bursty_loss = 0.0;
-    // Compute the sum residual loss across the models, for each mask type.
-    for (int k = 0; k < kNumLossModels; k++) {
-      if (loss_model_[k].loss_type == kRandomLossModel) {
-        sum_residual_loss_random_mask_random_loss +=
-            kMetricsXorRandom[code_index].average_residual_loss[k];
-      } else if (loss_model_[k].loss_type == kBurstyLossModel) {
-        sum_residual_loss_bursty_mask_bursty_loss +=
-            kMetricsXorBursty[code_index].average_residual_loss[k];
-      }
-    }
-    float average_residual_loss_random_mask_random_loss =
-        sum_residual_loss_random_mask_random_loss / num_loss_rates;
-    float average_residual_loss_bursty_mask_bursty_loss =
-        sum_residual_loss_bursty_mask_bursty_loss /
-        (num_loss_rates * (num_burst_lengths  - 1));
-    const float ref_random_mask = kMaxResidualLossRandomMask[code_index];
-    const float ref_bursty_mask = kMaxResidualLossBurstyMask[code_index];
-    EXPECT_LE(average_residual_loss_random_mask_random_loss, ref_random_mask);
-    EXPECT_LE(average_residual_loss_bursty_mask_bursty_loss, ref_bursty_mask);
-  }
-}
-
-// Verify the behavior of the XOR codes vs the RS codes.
-// For random loss model with average loss rates <= the code protection level,
-// the RS code (optimal MDS code) is more efficient than XOR codes.
-// However, for larger loss rates (above protection level) and/or bursty
-// loss models, the RS is not always more efficient than XOR (though in most
-// cases it still is).
-TEST_F(FecPacketMaskMetricsTest, FecXorVsRS) {
-  SetLossModels();
-  SetCodeParams();
-  for (int code_index = 0; code_index < max_num_codes_; code_index++) {
-    for (int k = 0; k < kNumLossModels; k++) {
-      float loss_rate = loss_model_[k].average_loss_rate;
-      float protection_level = code_params_[code_index].protection_level;
-      // Under these conditions we expect XOR to not be better than RS.
-       if (loss_model_[k].loss_type == kRandomLossModel &&
-           loss_rate <= protection_level) {
-        EXPECT_GE(kMetricsXorRandom[code_index].average_residual_loss[k],
-                  kMetricsReedSolomon[code_index].average_residual_loss[k]);
-        EXPECT_GE(kMetricsXorBursty[code_index].average_residual_loss[k],
-                  kMetricsReedSolomon[code_index].average_residual_loss[k]);
-       }
-       // TODO(marpan): There are some cases (for high loss rates and/or
-       // burst loss models) where XOR is better than RS. Is there some pattern
-       // we can identify and enforce as a constraint?
-    }
-  }
-}
-
-// Verify the trend (change) in the average residual loss, as a function of
-// loss rate, of the XOR code relative to the RS code.
-// The difference between XOR and RS should not get worse as we increase
-// the average loss rate.
-TEST_F(FecPacketMaskMetricsTest, FecTrendXorVsRsLossRate) {
-  SetLossModels();
-  SetCodeParams();
-  // TODO(marpan): Examine this further to see if the condition can be strictly
-  // satisfied (i.e., scale = 1.0) for all codes with different/better masks.
-  double scale = 0.90;
-  int num_loss_rates = sizeof(kAverageLossRate) /
-      sizeof(*kAverageLossRate);
-  int num_burst_lengths = sizeof(kAverageBurstLength) /
-      sizeof(*kAverageBurstLength);
-  for (int code_index = 0; code_index < max_num_codes_; code_index++) {
-    for (int i = 0; i < num_burst_lengths; i++) {
-      for (int j = 0; j < num_loss_rates - 1; j++) {
-        int k = num_loss_rates * i + j;
-        // For XOR random.
-        if (kMetricsXorRandom[code_index].average_residual_loss[k] >
-        kMetricsReedSolomon[code_index].average_residual_loss[k]) {
-          double diff_rs_xor_random_loss1 =
-              (kMetricsXorRandom[code_index].average_residual_loss[k] -
-               kMetricsReedSolomon[code_index].average_residual_loss[k]) /
-               kMetricsXorRandom[code_index].average_residual_loss[k];
-          double diff_rs_xor_random_loss2 =
-              (kMetricsXorRandom[code_index].average_residual_loss[k+1] -
-               kMetricsReedSolomon[code_index].average_residual_loss[k+1]) /
-               kMetricsXorRandom[code_index].average_residual_loss[k+1];
-          EXPECT_GE(diff_rs_xor_random_loss1, scale * diff_rs_xor_random_loss2);
-        }
-        // TODO(marpan): Investigate the cases for the bursty mask where
-        // this trend is not strictly satisfied.
-      }
-    }
-  }
-}
-
-// Verify the average residual loss behavior via the protection level and
-// the code length. The average residual loss for a given (k1,m1) code
-// should generally be higher than that of another code (k2,m2), which has
-// either of the two conditions satisfied:
-// 1) higher protection & code length at least as large: (k2+m2) >= (k1+m1),
-// 2) equal protection and larger code length: (k2+m2) > (k1+m1).
-// Currently does not hold for some cases of the XOR code with random mask.
-TEST_F(FecPacketMaskMetricsTest, FecBehaviorViaProtectionLevelAndLength) {
-  SetLossModels();
-  SetCodeParams();
-  for (int code_index1 = 0; code_index1 < max_num_codes_; code_index1++) {
-    float protection_level1 = code_params_[code_index1].protection_level;
-    int length1 = code_params_[code_index1].num_media_packets +
-        code_params_[code_index1].num_fec_packets;
-    for (int code_index2 = 0; code_index2 < max_num_codes_; code_index2++) {
-      float protection_level2 = code_params_[code_index2].protection_level;
-      int length2 = code_params_[code_index2].num_media_packets +
-          code_params_[code_index2].num_fec_packets;
-      // Codes with higher protection are more efficient, conditioned on the
-      // length of the code (higher protection but shorter length codes are
-      // generally not more efficient). For two codes with equal protection,
-      // the longer code is generally more efficient. For high loss rate
-      // models, this condition may be violated for some codes with equal or
-      // very close protection levels. High loss rate case is excluded below.
-      if ((protection_level2 > protection_level1 && length2 >= length1) ||
-          (protection_level2 == protection_level1 && length2 > length1)) {
-        for (int k = 0; k < kNumLossModels; k++) {
-          float loss_rate = loss_model_[k].average_loss_rate;
-          if (loss_rate < loss_rate_upper_threshold) {
-            EXPECT_LT(
-                kMetricsReedSolomon[code_index2].average_residual_loss[k],
-                kMetricsReedSolomon[code_index1].average_residual_loss[k]);
-            // TODO(marpan): There are some corner cases where this is not
-            // satisfied with the current packet masks. Look into updating
-            // these cases to see if this behavior should/can be satisfied,
-            // with overall lower residual loss for those XOR codes.
-            // EXPECT_LT(
-            //    kMetricsXorBursty[code_index2].average_residual_loss[k],
-            //    kMetricsXorBursty[code_index1].average_residual_loss[k]);
-            // EXPECT_LT(
-            //   kMetricsXorRandom[code_index2].average_residual_loss[k],
-            //   kMetricsXorRandom[code_index1].average_residual_loss[k]);
-          }
-        }
-      }
-    }
-  }
-}
-
-// Verify the beheavior of the variance of the XOR codes.
-// The partial recovery of the XOR versus the all or nothing behavior of the RS
-// code means that the variance of the residual loss for XOR should generally
-// not be worse than RS.
-TEST_F(FecPacketMaskMetricsTest, FecVarianceBehaviorXorVsRs) {
-  SetLossModels();
-  SetCodeParams();
-  // The condition is not strictly satisfied with the current masks,
-  // i.e., for some codes, the variance of XOR may be slightly higher than RS.
-  // TODO(marpan): Examine this further to see if the condition can be strictly
-  // satisfied (i.e., scale = 1.0) for all codes with different/better masks.
-  double scale = 0.95;
-  for (int code_index = 0; code_index < max_num_codes_; code_index++) {
-    for (int k = 0; k < kNumLossModels; k++) {
-      EXPECT_LE(scale *
-                kMetricsXorRandom[code_index].variance_residual_loss[k],
-                kMetricsReedSolomon[code_index].variance_residual_loss[k]);
-      EXPECT_LE(scale *
-                kMetricsXorBursty[code_index].variance_residual_loss[k],
-                kMetricsReedSolomon[code_index].variance_residual_loss[k]);
-    }
-  }
-}
-
-// For the bursty mask type, the residual loss must be strictly zero for all
-// consecutive losses (i.e, gap = 0) with number of losses <= num_fec_packets.
-// This is a design property of the bursty mask type.
-TEST_F(FecPacketMaskMetricsTest, FecXorBurstyPerfectRecoveryConsecutiveLoss) {
-  SetLossModels();
-  SetCodeParams();
-  for (int code_index = 0; code_index < max_num_codes_; code_index++) {
-    int num_fec_packets = code_params_[code_index].num_fec_packets;
-    for (int loss = 1; loss <= num_fec_packets; loss++) {
-      int index = loss;  // |gap| is zero.
-      EXPECT_EQ(kMetricsXorBursty[code_index].
-                residual_loss_per_loss_gap[index], 0.0);
-    }
-  }
-}
-
-// The XOR codes with random mask type are generally better than the ones with
-// bursty mask type, for random loss models at low loss rates.
-// The XOR codes with bursty mask types are generally better than the one with
-// random mask type, for bursty loss models and/or high loss rates.
-// TODO(marpan): Enable this test when some of the packet masks are updated.
-// Some isolated cases of the codes don't pass this currently.
-/*
-TEST_F(FecPacketMaskMetricsTest, FecXorRandomVsBursty) {
-  SetLossModels();
-  SetCodeParams();
-  for (int code_index = 0; code_index < max_num_codes_; code_index++) {
-    double sum_residual_loss_random_mask_random_loss = 0.0;
-    double sum_residual_loss_bursty_mask_random_loss = 0.0;
-    double sum_residual_loss_random_mask_bursty_loss = 0.0;
-    double sum_residual_loss_bursty_mask_bursty_loss = 0.0;
-    // Compute the sum residual loss across the models, for each mask type.
-    for (int k = 0; k < kNumLossModels; k++) {
-      float loss_rate = loss_model_[k].average_loss_rate;
-      if (loss_model_[k].loss_type == kRandomLossModel &&
-          loss_rate < loss_rate_upper_threshold) {
-        sum_residual_loss_random_mask_random_loss +=
-            kMetricsXorRandom[code_index].average_residual_loss[k];
-        sum_residual_loss_bursty_mask_random_loss +=
-            kMetricsXorBursty[code_index].average_residual_loss[k];
-      } else if (loss_model_[k].loss_type == kBurstyLossModel &&
-          loss_rate > loss_rate_lower_threshold) {
-        sum_residual_loss_random_mask_bursty_loss +=
-            kMetricsXorRandom[code_index].average_residual_loss[k];
-        sum_residual_loss_bursty_mask_bursty_loss +=
-            kMetricsXorBursty[code_index].average_residual_loss[k];
-      }
-    }
-    EXPECT_LE(sum_residual_loss_random_mask_random_loss,
-              sum_residual_loss_bursty_mask_random_loss);
-    EXPECT_LE(sum_residual_loss_bursty_mask_bursty_loss,
-              sum_residual_loss_random_mask_bursty_loss);
-  }
-}
-*/
-
-// Verify that the average recovery rate for each code is equal or above some
-// threshold, for certain loss number conditions.
-TEST_F(FecPacketMaskMetricsTest, FecRecoveryRateUnderLossConditions) {
-  SetLossModels();
-  SetCodeParams();
-  for (int code_index = 0; code_index < max_num_codes_; code_index++) {
-    int num_media_packets = code_params_[code_index].num_media_packets;
-    int num_fec_packets = code_params_[code_index].num_fec_packets;
-    // Perfect recovery (|recovery_rate_per_loss| == 1) is expected for
-    // |loss_number| = 1, for all codes.
-    int loss_number = 1;
-    EXPECT_EQ(kMetricsReedSolomon[code_index].
-              recovery_rate_per_loss[loss_number], 1.0);
-    EXPECT_EQ(kMetricsXorRandom[code_index].
-              recovery_rate_per_loss[loss_number], 1.0);
-    EXPECT_EQ(kMetricsXorBursty[code_index].
-              recovery_rate_per_loss[loss_number], 1.0);
-    // For |loss_number| = |num_fec_packets| / 2, we expect the following:
-    // Perfect recovery for RS, and recovery for XOR above the threshold.
-    loss_number = num_fec_packets / 2 > 0 ? num_fec_packets / 2 : 1;
-    EXPECT_EQ(kMetricsReedSolomon[code_index].
-              recovery_rate_per_loss[loss_number], 1.0);
-    EXPECT_GE(kMetricsXorRandom[code_index].
-              recovery_rate_per_loss[loss_number], kRecoveryRateXorRandom[0]);
-    EXPECT_GE(kMetricsXorBursty[code_index].
-              recovery_rate_per_loss[loss_number], kRecoveryRateXorBursty[0]);
-    // For |loss_number| = |num_fec_packets|, we expect the following:
-    // Perfect recovery for RS, and recovery for XOR above the threshold.
-    loss_number = num_fec_packets;
-    EXPECT_EQ(kMetricsReedSolomon[code_index].
-              recovery_rate_per_loss[loss_number], 1.0);
-    EXPECT_GE(kMetricsXorRandom[code_index].
-              recovery_rate_per_loss[loss_number], kRecoveryRateXorRandom[1]);
-    EXPECT_GE(kMetricsXorBursty[code_index].
-              recovery_rate_per_loss[loss_number], kRecoveryRateXorBursty[1]);
-    // For |loss_number| = |num_fec_packets| + 1, we expect the following:
-    // Zero recovery for RS, but non-zero recovery for XOR.
-    if (num_fec_packets > 1 && num_media_packets > 2) {
-      loss_number =  num_fec_packets + 1;
-      EXPECT_EQ(kMetricsReedSolomon[code_index].
-                recovery_rate_per_loss[loss_number], 0.0);
-      EXPECT_GE(kMetricsXorRandom[code_index].
-                recovery_rate_per_loss[loss_number],
-                kRecoveryRateXorRandom[2]);
-      EXPECT_GE(kMetricsXorBursty[code_index].
-                recovery_rate_per_loss[loss_number],
-                kRecoveryRateXorBursty[2]);
-    }
-  }
-}
-
-}  // namespace webrtc
diff --git a/modules/utility/BUILD.gn b/modules/utility/BUILD.gn
deleted file mode 100644
index 7d03707..0000000
--- a/modules/utility/BUILD.gn
+++ /dev/null
@@ -1,78 +0,0 @@
-# Copyright (c) 2014 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.
-
-import("../../webrtc.gni")
-
-rtc_static_library("utility") {
-  sources = [
-    "include/audio_frame_operations.h",
-    "include/helpers_android.h",
-    "include/jvm_android.h",
-    "include/process_thread.h",
-    "source/helpers_android.cc",
-    "source/jvm_android.cc",
-    "source/process_thread_impl.cc",
-    "source/process_thread_impl.h",
-  ]
-
-  if (!build_with_chromium && is_clang) {
-    # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-    suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-  }
-
-  if (is_ios) {
-    libs = [ "AVFoundation.framework" ]
-  }
-
-  deps = [
-    "..:module_api",
-    "../..:webrtc_common",
-    "../../audio/utility:audio_frame_operations",
-    "../../common_audio",
-    "../../rtc_base:rtc_base_approved",
-    "../../rtc_base:rtc_task_queue",
-    "../../system_wrappers",
-    "../media_file",
-  ]
-}
-
-rtc_source_set("mock_process_thread") {
-  testonly = true
-  sources = [
-    "include/mock/mock_process_thread.h",
-  ]
-  deps = [
-    ":utility",
-    "../../rtc_base:rtc_base_approved",
-    "../../test:test_support",
-  ]
-}
-
-if (rtc_include_tests) {
-  rtc_source_set("utility_unittests") {
-    testonly = true
-
-    # Skip restricting visibility on mobile platforms since the tests on those
-    # gets additional generated targets which would require many lines here to
-    # cover (which would be confusing to read and hard to maintain).
-    if (!is_android && !is_ios) {
-      visibility = [ "..:modules_unittests" ]
-    }
-    sources = [
-      "source/process_thread_impl_unittest.cc",
-    ]
-    deps = [
-      ":utility",
-      "..:module_api",
-      "../../rtc_base:rtc_base_approved",
-      "../../rtc_base:rtc_task_queue",
-      "../../test:test_support",
-      "//testing/gmock",
-    ]
-  }
-}
diff --git a/modules/utility/DEPS b/modules/utility/DEPS
deleted file mode 100644
index 7e57356..0000000
--- a/modules/utility/DEPS
+++ /dev/null
@@ -1,8 +0,0 @@
-include_rules = [
-  # TODO(aleloi): remove when clients update. See
-  # bugs.webrtc.org/6548.
-  "+webrtc/audio/utility/audio_frame_operations.h",
-  "+webrtc/common_audio",
-  "+webrtc/common_video",
-  "+webrtc/system_wrappers",
-]
diff --git a/modules/utility/OWNERS b/modules/utility/OWNERS
deleted file mode 100644
index debeaab..0000000
--- a/modules/utility/OWNERS
+++ /dev/null
@@ -1,6 +0,0 @@
-perkj@webrtc.org
-
-# These are for the common case of adding or renaming files. If you're doing
-# structural changes, please get a review from a reviewer in this file.
-per-file *.gn=*
-per-file *.gni=*
diff --git a/modules/utility/include/audio_frame_operations.h b/modules/utility/include/audio_frame_operations.h
deleted file mode 100644
index 4bf73df..0000000
--- a/modules/utility/include/audio_frame_operations.h
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- *  Copyright (c) 2012 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_UTILITY_INCLUDE_AUDIO_FRAME_OPERATIONS_H_
-#define WEBRTC_MODULES_UTILITY_INCLUDE_AUDIO_FRAME_OPERATIONS_H_
-// The contents of this file have moved to
-// //webrtc/audio/utility. This file is deprecated.
-
-// TODO(aleloi): Remove this file when clients have updated their
-// includes. See bugs.webrtc.org/6548.
-#include "webrtc/audio/utility/audio_frame_operations.h"
-
-#endif  // #ifndef WEBRTC_MODULES_UTILITY_INCLUDE_AUDIO_FRAME_OPERATIONS_H_
diff --git a/modules/utility/include/helpers_android.h b/modules/utility/include/helpers_android.h
deleted file mode 100644
index 2840ca9..0000000
--- a/modules/utility/include/helpers_android.h
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- *  Copyright (c) 2013 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_UTILITY_INCLUDE_HELPERS_ANDROID_H_
-#define WEBRTC_MODULES_UTILITY_INCLUDE_HELPERS_ANDROID_H_
-
-#include <jni.h>
-#include <string>
-
-// Abort the process if |jni| has a Java exception pending.
-// TODO(henrika): merge with CHECK_JNI_EXCEPTION() in jni_helpers.h.
-#define CHECK_EXCEPTION(jni)        \
-  RTC_CHECK(!jni->ExceptionCheck()) \
-      << (jni->ExceptionDescribe(), jni->ExceptionClear(), "")
-
-namespace webrtc {
-
-// Return a |JNIEnv*| usable on this thread or NULL if this thread is detached.
-JNIEnv* GetEnv(JavaVM* jvm);
-
-// Return a |jlong| that will correctly convert back to |ptr|.  This is needed
-// because the alternative (of silently passing a 32-bit pointer to a vararg
-// function expecting a 64-bit param) picks up garbage in the high 32 bits.
-jlong PointerTojlong(void* ptr);
-
-// JNIEnv-helper methods that wraps the API which uses the JNI interface
-// pointer (JNIEnv*). It allows us to RTC_CHECK success and that no Java
-// exception is thrown while calling the method.
-jmethodID GetMethodID(
-    JNIEnv* jni, jclass c, const char* name, const char* signature);
-
-jmethodID GetStaticMethodID(
-    JNIEnv* jni, jclass c, const char* name, const char* signature);
-
-jclass FindClass(JNIEnv* jni, const char* name);
-
-jobject NewGlobalRef(JNIEnv* jni, jobject o);
-
-void DeleteGlobalRef(JNIEnv* jni, jobject o);
-
-// Return thread ID as a string.
-std::string GetThreadId();
-
-// Return thread ID as string suitable for debug logging.
-std::string GetThreadInfo();
-
-// Attach thread to JVM if necessary and detach at scope end if originally
-// attached.
-class AttachThreadScoped {
- public:
-  explicit AttachThreadScoped(JavaVM* jvm);
-  ~AttachThreadScoped();
-  JNIEnv* env();
-
- private:
-  bool attached_;
-  JavaVM* jvm_;
-  JNIEnv* env_;
-};
-
-// Scoped holder for global Java refs.
-template<class T>  // T is jclass, jobject, jintArray, etc.
-class ScopedGlobalRef {
- public:
-  ScopedGlobalRef(JNIEnv* jni, T obj)
-      : jni_(jni), obj_(static_cast<T>(NewGlobalRef(jni, obj))) {}
-  ~ScopedGlobalRef() {
-    DeleteGlobalRef(jni_, obj_);
-  }
-  T operator*() const {
-    return obj_;
-  }
- private:
-  JNIEnv* jni_;
-  T obj_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_UTILITY_INCLUDE_HELPERS_ANDROID_H_
diff --git a/modules/utility/include/jvm_android.h b/modules/utility/include/jvm_android.h
deleted file mode 100644
index 95e31ee..0000000
--- a/modules/utility/include/jvm_android.h
+++ /dev/null
@@ -1,188 +0,0 @@
-/*
- *  Copyright (c) 2015 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_UTILITY_INCLUDE_JVM_ANDROID_H_
-#define WEBRTC_MODULES_UTILITY_INCLUDE_JVM_ANDROID_H_
-
-#include <jni.h>
-
-#include <memory>
-#include <string>
-
-#include "webrtc/modules/utility/include/helpers_android.h"
-#include "webrtc/rtc_base/thread_checker.h"
-
-namespace webrtc {
-
-// The JNI interface pointer (JNIEnv) is valid only in the current thread.
-// Should another thread need to access the Java VM, it must first call
-// AttachCurrentThread() to attach itself to the VM and obtain a JNI interface
-// pointer. The native thread remains attached to the VM until it calls
-// DetachCurrentThread() to detach.
-class AttachCurrentThreadIfNeeded {
- public:
-  AttachCurrentThreadIfNeeded();
-  ~AttachCurrentThreadIfNeeded();
-
- private:
-  rtc::ThreadChecker thread_checker_;
-  bool attached_;
-};
-
-// This class is created by the NativeRegistration class and is used to wrap
-// the actual Java object handle (jobject) on which we can call methods from
-// C++ in to Java. See example in JVM for more details.
-// TODO(henrika): extend support for type of function calls.
-class GlobalRef {
- public:
-  GlobalRef(JNIEnv* jni, jobject object);
-  ~GlobalRef();
-
-  jboolean CallBooleanMethod(jmethodID methodID, ...);
-  jint CallIntMethod(jmethodID methodID, ...);
-  void CallVoidMethod(jmethodID methodID, ...);
-
- private:
-  JNIEnv* const jni_;
-  const jobject j_object_;
-};
-
-// Wraps the jclass object on which we can call GetMethodId() functions to
-// query method IDs.
-class JavaClass {
- public:
-  JavaClass(JNIEnv* jni, jclass clazz) : jni_(jni), j_class_(clazz) {}
-  ~JavaClass() {}
-
-  jmethodID GetMethodId(const char* name, const char* signature);
-  jmethodID GetStaticMethodId(const char* name, const char* signature);
-  jobject CallStaticObjectMethod(jmethodID methodID, ...);
-  jint CallStaticIntMethod(jmethodID methodID, ...);
-
- protected:
-  JNIEnv* const jni_;
-  jclass const j_class_;
-};
-
-// Adds support of the NewObject factory method to the JavaClass class.
-// See example in JVM for more details on how to use it.
-class NativeRegistration : public JavaClass {
- public:
-  NativeRegistration(JNIEnv* jni, jclass clazz);
-  ~NativeRegistration();
-
-  std::unique_ptr<GlobalRef> NewObject(
-      const char* name, const char* signature, ...);
-
- private:
-  JNIEnv* const jni_;
-};
-
-// This class is created by the JVM class and is used to expose methods that
-// needs the JNI interface pointer but its main purpose is to create a
-// NativeRegistration object given name of a Java class and a list of native
-// methods. See example in JVM for more details.
-class JNIEnvironment {
- public:
-  explicit JNIEnvironment(JNIEnv* jni);
-  ~JNIEnvironment();
-
-  // Registers native methods with the Java class specified by |name|.
-  // Note that the class name must be one of the names in the static
-  // |loaded_classes| array defined in jvm_android.cc.
-  // This method must be called on the construction thread.
-  std::unique_ptr<NativeRegistration> RegisterNatives(
-      const char* name, const JNINativeMethod *methods, int num_methods);
-
-  // Converts from Java string to std::string.
-  // This method must be called on the construction thread.
-  std::string JavaToStdString(const jstring& j_string);
-
- private:
-  rtc::ThreadChecker thread_checker_;
-  JNIEnv* const jni_;
-};
-
-// Main class for working with Java from C++ using JNI in WebRTC.
-//
-// Example usage:
-//
-//   // At initialization (e.g. in JNI_OnLoad), call JVM::Initialize.
-//   JNIEnv* jni = ::base::android::AttachCurrentThread();
-//   JavaVM* jvm = NULL;
-//   jni->GetJavaVM(&jvm);
-//   webrtc::JVM::Initialize(jvm);
-//
-//   // Header (.h) file of example class called User.
-//   std::unique_ptr<JNIEnvironment> env;
-//   std::unique_ptr<NativeRegistration> reg;
-//   std::unique_ptr<GlobalRef> obj;
-//
-//   // Construction (in .cc file) of User class.
-//   User::User() {
-//     // Calling thread must be attached to the JVM.
-//     env = JVM::GetInstance()->environment();
-//     reg = env->RegisterNatives("org/webrtc/WebRtcTest", ,);
-//     obj = reg->NewObject("<init>", ,);
-//   }
-//
-//   // Each User method can now use |reg| and |obj| and call Java functions
-//   // in WebRtcTest.java, e.g. boolean init() {}.
-//   bool User::Foo() {
-//     jmethodID id = reg->GetMethodId("init", "()Z");
-//     return obj->CallBooleanMethod(id);
-//   }
-//
-//   // And finally, e.g. in JNI_OnUnLoad, call JVM::Uninitialize.
-//   JVM::Uninitialize();
-class JVM {
- public:
-  // Stores global handles to the Java VM interface.
-  // Should be called once on a thread that is attached to the JVM.
-  static void Initialize(JavaVM* jvm);
-  // Like the method above but also passes the context to the ContextUtils
-  // class. This method should be used by pure-C++ Android users that can't call
-  // ContextUtils.initialize directly.
-  static void Initialize(JavaVM* jvm, jobject context);
-  // Clears handles stored in Initialize(). Must be called on same thread as
-  // Initialize().
-  static void Uninitialize();
-  // Gives access to the global Java VM interface pointer, which then can be
-  // used to create a valid JNIEnvironment object or to get a JavaClass object.
-  static JVM* GetInstance();
-
-  // Creates a JNIEnvironment object.
-  // This method returns a NULL pointer if AttachCurrentThread() has not been
-  // called successfully. Use the AttachCurrentThreadIfNeeded class if needed.
-  std::unique_ptr<JNIEnvironment> environment();
-
-  // Returns a JavaClass object given class |name|.
-  // Note that the class name must be one of the names in the static
-  // |loaded_classes| array defined in jvm_android.cc.
-  // This method must be called on the construction thread.
-  JavaClass GetClass(const char* name);
-
-  // TODO(henrika): can we make these private?
-  JavaVM* jvm() const { return jvm_; }
-
- protected:
-  JVM(JavaVM* jvm);
-  ~JVM();
-
- private:
-  JNIEnv* jni() const { return GetEnv(jvm_); }
-
-  rtc::ThreadChecker thread_checker_;
-  JavaVM* const jvm_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_UTILITY_INCLUDE_JVM_ANDROID_H_
diff --git a/modules/utility/include/mock/mock_process_thread.h b/modules/utility/include/mock/mock_process_thread.h
deleted file mode 100644
index 27d1b10..0000000
--- a/modules/utility/include/mock/mock_process_thread.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- *  Copyright (c) 2014 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_UTILITY_INCLUDE_MOCK_MOCK_PROCESS_THREAD_H_
-#define WEBRTC_MODULES_UTILITY_INCLUDE_MOCK_MOCK_PROCESS_THREAD_H_
-
-#include <memory>
-
-#include "webrtc/modules/utility/include/process_thread.h"
-#include "webrtc/rtc_base/location.h"
-#include "webrtc/test/gmock.h"
-
-namespace webrtc {
-
-class MockProcessThread : public ProcessThread {
- public:
-  // TODO(nisse): Valid overrides commented out, because the gmock
-  // methods don't use any override declarations, and we want to avoid
-  // warnings from -Winconsistent-missing-override. See
-  // http://crbug.com/428099.
-  MOCK_METHOD0(Start, void());
-  MOCK_METHOD0(Stop, void());
-  MOCK_METHOD1(WakeUp, void(Module* module));
-  MOCK_METHOD1(PostTask, void(rtc::QueuedTask* task));
-  MOCK_METHOD2(RegisterModule, void(Module* module, const rtc::Location&));
-  MOCK_METHOD1(DeRegisterModule, void(Module* module));
-
-  // MOCK_METHOD1 gets confused with mocking this method, so we work around it
-  // by overriding the method from the interface and forwarding the call to a
-  // mocked, simpler method.
-  void PostTask(std::unique_ptr<rtc::QueuedTask> task) /*override*/ {
-    PostTask(task.get());
-  }
-};
-
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_UTILITY_INCLUDE_MOCK_MOCK_PROCESS_THREAD_H_
diff --git a/modules/utility/include/process_thread.h b/modules/utility/include/process_thread.h
deleted file mode 100644
index 6fa4e79..0000000
--- a/modules/utility/include/process_thread.h
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- *  Copyright (c) 2011 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_UTILITY_INCLUDE_PROCESS_THREAD_H_
-#define WEBRTC_MODULES_UTILITY_INCLUDE_PROCESS_THREAD_H_
-
-#include <memory>
-
-#include "webrtc/typedefs.h"
-
-#if defined(WEBRTC_WIN)
-// Due to a bug in the std::unique_ptr implementation that ships with MSVS,
-// we need the full definition of QueuedTask, on Windows.
-#include "webrtc/rtc_base/task_queue.h"
-#else
-namespace rtc {
-class QueuedTask;
-}
-#endif
-
-namespace rtc {
-class Location;
-}
-
-namespace webrtc {
-class Module;
-
-// TODO(tommi): ProcessThread probably doesn't need to be a virtual
-// interface.  There exists one override besides ProcessThreadImpl,
-// MockProcessThread, but when looking at how it is used, it seems
-// a nullptr might suffice (or simply an actual ProcessThread instance).
-class ProcessThread {
- public:
-  virtual ~ProcessThread();
-
-  static std::unique_ptr<ProcessThread> Create(const char* thread_name);
-
-  // Starts the worker thread.  Must be called from the construction thread.
-  virtual void Start() = 0;
-
-  // Stops the worker thread.  Must be called from the construction thread.
-  virtual void Stop() = 0;
-
-  // Wakes the thread up to give a module a chance to do processing right
-  // away.  This causes the worker thread to wake up and requery the specified
-  // module for when it should be called back. (Typically the module should
-  // return 0 from TimeUntilNextProcess on the worker thread at that point).
-  // Can be called on any thread.
-  virtual void WakeUp(Module* module) = 0;
-
-  // Queues a task object to run on the worker thread.  Ownership of the
-  // task object is transferred to the ProcessThread and the object will
-  // either be deleted after running on the worker thread, or on the
-  // construction thread of the ProcessThread instance, if the task did not
-  // get a chance to run (e.g. posting the task while shutting down or when
-  // the thread never runs).
-  virtual void PostTask(std::unique_ptr<rtc::QueuedTask> task) = 0;
-
-  // Adds a module that will start to receive callbacks on the worker thread.
-  // Can be called from any thread.
-  virtual void RegisterModule(Module* module, const rtc::Location& from) = 0;
-
-  // Removes a previously registered module.
-  // Can be called from any thread.
-  virtual void DeRegisterModule(Module* module) = 0;
-};
-
-}  // namespace webrtc
-
-#endif // WEBRTC_MODULES_UTILITY_INCLUDE_PROCESS_THREAD_H_
diff --git a/modules/utility/source/helpers_android.cc b/modules/utility/source/helpers_android.cc
deleted file mode 100644
index 59f4a69..0000000
--- a/modules/utility/source/helpers_android.cc
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- *  Copyright (c) 2013 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/utility/include/helpers_android.h"
-#include "webrtc/rtc_base/checks.h"
-
-#include <android/log.h>
-#include <assert.h>
-#include <pthread.h>
-#include <stddef.h>
-#include <unistd.h>
-
-#define TAG "HelpersAndroid"
-#define ALOGD(...) __android_log_print(ANDROID_LOG_DEBUG, TAG, __VA_ARGS__)
-
-namespace webrtc {
-
-JNIEnv* GetEnv(JavaVM* jvm) {
-  void* env = NULL;
-  jint status = jvm->GetEnv(&env, JNI_VERSION_1_6);
-  RTC_CHECK(((env != NULL) && (status == JNI_OK)) ||
-            ((env == NULL) && (status == JNI_EDETACHED)))
-      << "Unexpected GetEnv return: " << status << ":" << env;
-  return reinterpret_cast<JNIEnv*>(env);
-}
-
-// Return a |jlong| that will correctly convert back to |ptr|.  This is needed
-// because the alternative (of silently passing a 32-bit pointer to a vararg
-// function expecting a 64-bit param) picks up garbage in the high 32 bits.
-jlong PointerTojlong(void* ptr) {
-  static_assert(sizeof(intptr_t) <= sizeof(jlong),
-                "Time to rethink the use of jlongs");
-  // Going through intptr_t to be obvious about the definedness of the
-  // conversion from pointer to integral type.  intptr_t to jlong is a standard
-  // widening by the static_assert above.
-  jlong ret = reinterpret_cast<intptr_t>(ptr);
-  RTC_DCHECK(reinterpret_cast<void*>(ret) == ptr);
-  return ret;
-}
-
-jmethodID GetMethodID (
-    JNIEnv* jni, jclass c, const char* name, const char* signature) {
-  jmethodID m = jni->GetMethodID(c, name, signature);
-  CHECK_EXCEPTION(jni) << "Error during GetMethodID: " << name << ", "
-                       << signature;
-  RTC_CHECK(m) << name << ", " << signature;
-  return m;
-}
-
-jmethodID GetStaticMethodID (
-    JNIEnv* jni, jclass c, const char* name, const char* signature) {
-  jmethodID m = jni->GetStaticMethodID(c, name, signature);
-  CHECK_EXCEPTION(jni) << "Error during GetStaticMethodID: " << name << ", "
-                       << signature;
-  RTC_CHECK(m) << name << ", " << signature;
-  return m;
-}
-
-jclass FindClass(JNIEnv* jni, const char* name) {
-  jclass c = jni->FindClass(name);
-  CHECK_EXCEPTION(jni) << "Error during FindClass: " << name;
-  RTC_CHECK(c) << name;
-  return c;
-}
-
-jobject NewGlobalRef(JNIEnv* jni, jobject o) {
-  jobject ret = jni->NewGlobalRef(o);
-  CHECK_EXCEPTION(jni) << "Error during NewGlobalRef";
-  RTC_CHECK(ret);
-  return ret;
-}
-
-void DeleteGlobalRef(JNIEnv* jni, jobject o) {
-  jni->DeleteGlobalRef(o);
-  CHECK_EXCEPTION(jni) << "Error during DeleteGlobalRef";
-}
-
-std::string GetThreadId() {
-  char buf[21];  // Big enough to hold a kuint64max plus terminating NULL.
-  int thread_id = gettid();
-  RTC_CHECK_LT(snprintf(buf, sizeof(buf), "%i", thread_id),
-               static_cast<int>(sizeof(buf)))
-      << "Thread id is bigger than uint64??";
-  return std::string(buf);
-}
-
-std::string GetThreadInfo() {
-  return "@[tid=" + GetThreadId() + "]";
-}
-
-AttachThreadScoped::AttachThreadScoped(JavaVM* jvm)
-    : attached_(false), jvm_(jvm), env_(NULL) {
-  env_ = GetEnv(jvm);
-  if (!env_) {
-    // Adding debug log here so we can track down potential leaks and figure
-    // out why we sometimes see "Native thread exiting without having called
-    // DetachCurrentThread" in logcat outputs.
-    ALOGD("Attaching thread to JVM%s", GetThreadInfo().c_str());
-    jint res = jvm->AttachCurrentThread(&env_, NULL);
-    attached_ = (res == JNI_OK);
-    RTC_CHECK(attached_) << "AttachCurrentThread failed: " << res;
-  }
-}
-
-AttachThreadScoped::~AttachThreadScoped() {
-  if (attached_) {
-    ALOGD("Detaching thread from JVM%s", GetThreadInfo().c_str());
-    jint res = jvm_->DetachCurrentThread();
-    RTC_CHECK(res == JNI_OK) << "DetachCurrentThread failed: " << res;
-    RTC_CHECK(!GetEnv(jvm_));
-  }
-}
-
-JNIEnv* AttachThreadScoped::env() { return env_; }
-
-}  // namespace webrtc
diff --git a/modules/utility/source/jvm_android.cc b/modules/utility/source/jvm_android.cc
deleted file mode 100644
index b13eb89..0000000
--- a/modules/utility/source/jvm_android.cc
+++ /dev/null
@@ -1,284 +0,0 @@
-/*
- *  Copyright (c) 2015 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 <android/log.h>
-
-#include <memory>
-
-#include "webrtc/modules/utility/include/jvm_android.h"
-
-#include "webrtc/rtc_base/checks.h"
-
-#define TAG "JVM"
-#define ALOGD(...) __android_log_print(ANDROID_LOG_DEBUG, TAG, __VA_ARGS__)
-#define ALOGE(...) __android_log_print(ANDROID_LOG_ERROR, TAG, __VA_ARGS__)
-
-namespace webrtc {
-
-JVM* g_jvm;
-
-// TODO(henrika): add more clases here if needed.
-struct {
-  const char* name;
-  jclass clazz;
-} loaded_classes[] = {
-  {"org/webrtc/voiceengine/BuildInfo", nullptr},
-  {"org/webrtc/voiceengine/WebRtcAudioManager", nullptr},
-  {"org/webrtc/voiceengine/WebRtcAudioRecord", nullptr},
-  {"org/webrtc/voiceengine/WebRtcAudioTrack", nullptr},
-};
-
-// Android's FindClass() is trickier than usual because the app-specific
-// ClassLoader is not consulted when there is no app-specific frame on the
-// stack.  Consequently, we only look up all classes once in native WebRTC.
-// http://developer.android.com/training/articles/perf-jni.html#faq_FindClass
-void LoadClasses(JNIEnv* jni) {
-  ALOGD("LoadClasses");
-  for (auto& c : loaded_classes) {
-    jclass localRef = FindClass(jni, c.name);
-    ALOGD("name: %s", c.name);
-    CHECK_EXCEPTION(jni) << "Error during FindClass: " << c.name;
-    RTC_CHECK(localRef) << c.name;
-    jclass globalRef = reinterpret_cast<jclass>(jni->NewGlobalRef(localRef));
-    CHECK_EXCEPTION(jni) << "Error during NewGlobalRef: " << c.name;
-    RTC_CHECK(globalRef) << c.name;
-    c.clazz = globalRef;
-  }
-}
-
-void FreeClassReferences(JNIEnv* jni) {
-  for (auto& c : loaded_classes) {
-    jni->DeleteGlobalRef(c.clazz);
-    c.clazz = nullptr;
-  }
-}
-
-jclass LookUpClass(const char* name) {
-  for (auto& c : loaded_classes) {
-    if (strcmp(c.name, name) == 0)
-      return c.clazz;
-  }
-  RTC_CHECK(false) << "Unable to find class in lookup table";
-  return 0;
-}
-
-// AttachCurrentThreadIfNeeded implementation.
-AttachCurrentThreadIfNeeded::AttachCurrentThreadIfNeeded()
-    : attached_(false) {
-  ALOGD("AttachCurrentThreadIfNeeded::ctor%s", GetThreadInfo().c_str());
-  JavaVM* jvm = JVM::GetInstance()->jvm();
-  RTC_CHECK(jvm);
-  JNIEnv* jni = GetEnv(jvm);
-  if (!jni) {
-    ALOGD("Attaching thread to JVM");
-    JNIEnv* env = nullptr;
-    jint ret = jvm->AttachCurrentThread(&env, nullptr);
-    attached_ = (ret == JNI_OK);
-  }
-}
-
-AttachCurrentThreadIfNeeded::~AttachCurrentThreadIfNeeded() {
-  ALOGD("AttachCurrentThreadIfNeeded::dtor%s", GetThreadInfo().c_str());
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  if (attached_) {
-    ALOGD("Detaching thread from JVM");
-    jint res = JVM::GetInstance()->jvm()->DetachCurrentThread();
-    RTC_CHECK(res == JNI_OK) << "DetachCurrentThread failed: " << res;
-  }
-}
-
-// GlobalRef implementation.
-GlobalRef::GlobalRef(JNIEnv* jni, jobject object)
-    : jni_(jni), j_object_(NewGlobalRef(jni, object)) {
-  ALOGD("GlobalRef::ctor%s", GetThreadInfo().c_str());
-}
-
-GlobalRef::~GlobalRef() {
-  ALOGD("GlobalRef::dtor%s", GetThreadInfo().c_str());
-  DeleteGlobalRef(jni_, j_object_);
-}
-
-jboolean GlobalRef::CallBooleanMethod(jmethodID methodID, ...) {
-  va_list args;
-  va_start(args, methodID);
-  jboolean res = jni_->CallBooleanMethodV(j_object_, methodID, args);
-  CHECK_EXCEPTION(jni_) << "Error during CallBooleanMethod";
-  va_end(args);
-  return res;
-}
-
-jint GlobalRef::CallIntMethod(jmethodID methodID, ...) {
-  va_list args;
-  va_start(args, methodID);
-  jint res = jni_->CallIntMethodV(j_object_, methodID, args);
-  CHECK_EXCEPTION(jni_) << "Error during CallIntMethod";
-  va_end(args);
-  return res;
-}
-
-void GlobalRef::CallVoidMethod(jmethodID methodID, ...) {
-  va_list args;
-  va_start(args, methodID);
-  jni_->CallVoidMethodV(j_object_, methodID, args);
-  CHECK_EXCEPTION(jni_) << "Error during CallVoidMethod";
-  va_end(args);
-}
-
-// NativeRegistration implementation.
-NativeRegistration::NativeRegistration(JNIEnv* jni, jclass clazz)
-    : JavaClass(jni, clazz), jni_(jni) {
-  ALOGD("NativeRegistration::ctor%s", GetThreadInfo().c_str());
-}
-
-NativeRegistration::~NativeRegistration() {
-  ALOGD("NativeRegistration::dtor%s", GetThreadInfo().c_str());
-  jni_->UnregisterNatives(j_class_);
-  CHECK_EXCEPTION(jni_) << "Error during UnregisterNatives";
-}
-
-std::unique_ptr<GlobalRef> NativeRegistration::NewObject(
-    const char* name, const char* signature, ...) {
-  ALOGD("NativeRegistration::NewObject%s", GetThreadInfo().c_str());
-  va_list args;
-  va_start(args, signature);
-  jobject obj = jni_->NewObjectV(j_class_,
-                                 GetMethodID(jni_, j_class_, name, signature),
-                                 args);
-  CHECK_EXCEPTION(jni_) << "Error during NewObjectV";
-  va_end(args);
-  return std::unique_ptr<GlobalRef>(new GlobalRef(jni_, obj));
-}
-
-// JavaClass implementation.
-jmethodID JavaClass::GetMethodId(
-    const char* name, const char* signature) {
-  return GetMethodID(jni_, j_class_, name, signature);
-}
-
-jmethodID JavaClass::GetStaticMethodId(
-    const char* name, const char* signature) {
-  return GetStaticMethodID(jni_, j_class_, name, signature);
-}
-
-jobject JavaClass::CallStaticObjectMethod(jmethodID methodID, ...) {
-  va_list args;
-  va_start(args, methodID);
-  jobject res = jni_->CallStaticObjectMethodV(j_class_, methodID, args);
-  CHECK_EXCEPTION(jni_) << "Error during CallStaticObjectMethod";
-  return res;
-}
-
-jint JavaClass::CallStaticIntMethod(jmethodID methodID, ...) {
-  va_list args;
-  va_start(args, methodID);
-  jint res = jni_->CallStaticIntMethodV(j_class_, methodID, args);
-  CHECK_EXCEPTION(jni_) << "Error during CallStaticIntMethod";
-  return res;
-}
-
-// JNIEnvironment implementation.
-JNIEnvironment::JNIEnvironment(JNIEnv* jni) : jni_(jni) {
-  ALOGD("JNIEnvironment::ctor%s", GetThreadInfo().c_str());
-}
-
-JNIEnvironment::~JNIEnvironment() {
-  ALOGD("JNIEnvironment::dtor%s", GetThreadInfo().c_str());
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-}
-
-std::unique_ptr<NativeRegistration> JNIEnvironment::RegisterNatives(
-    const char* name, const JNINativeMethod *methods, int num_methods) {
-  ALOGD("JNIEnvironment::RegisterNatives(%s)", name);
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  jclass clazz = LookUpClass(name);
-  jni_->RegisterNatives(clazz, methods, num_methods);
-  CHECK_EXCEPTION(jni_) << "Error during RegisterNatives";
-  return std::unique_ptr<NativeRegistration>(
-      new NativeRegistration(jni_, clazz));
-}
-
-std::string JNIEnvironment::JavaToStdString(const jstring& j_string) {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  const char* jchars = jni_->GetStringUTFChars(j_string, nullptr);
-  CHECK_EXCEPTION(jni_);
-  const int size = jni_->GetStringUTFLength(j_string);
-  CHECK_EXCEPTION(jni_);
-  std::string ret(jchars, size);
-  jni_->ReleaseStringUTFChars(j_string, jchars);
-  CHECK_EXCEPTION(jni_);
-  return ret;
-}
-
-// static
-void JVM::Initialize(JavaVM* jvm) {
-  ALOGD("JVM::Initialize%s", GetThreadInfo().c_str());
-  RTC_CHECK(!g_jvm);
-  g_jvm = new JVM(jvm);
-}
-
-void JVM::Initialize(JavaVM* jvm, jobject context) {
-  Initialize(jvm);
-
-  // Pass in the context to the new ContextUtils class.
-  JNIEnv* jni = g_jvm->jni();
-  jclass context_utils = FindClass(jni, "org/webrtc/ContextUtils");
-  jmethodID initialize_method = jni->GetStaticMethodID(
-      context_utils, "initialize", "(Landroid/content/Context;)V");
-  jni->CallStaticVoidMethod(context_utils, initialize_method, context);
-}
-
-// static
-void JVM::Uninitialize() {
-  ALOGD("JVM::Uninitialize%s", GetThreadInfo().c_str());
-  RTC_DCHECK(g_jvm);
-  delete g_jvm;
-  g_jvm = nullptr;
-}
-
-// static
-JVM* JVM::GetInstance() {
-  RTC_DCHECK(g_jvm);
-  return g_jvm;
-}
-
-JVM::JVM(JavaVM* jvm) : jvm_(jvm) {
-  ALOGD("JVM::JVM%s", GetThreadInfo().c_str());
-  RTC_CHECK(jni()) << "AttachCurrentThread() must be called on this thread.";
-  LoadClasses(jni());
-}
-
-JVM::~JVM() {
-  ALOGD("JVM::~JVM%s", GetThreadInfo().c_str());
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  FreeClassReferences(jni());
-}
-
-std::unique_ptr<JNIEnvironment> JVM::environment() {
-  ALOGD("JVM::environment%s", GetThreadInfo().c_str());
-  // The JNIEnv is used for thread-local storage. For this reason, we cannot
-  // share a JNIEnv between threads. If a piece of code has no other way to get
-  // its JNIEnv, we should share the JavaVM, and use GetEnv to discover the
-  // thread's JNIEnv. (Assuming it has one, if not, use AttachCurrentThread).
-  // See // http://developer.android.com/training/articles/perf-jni.html.
-  JNIEnv* jni = GetEnv(jvm_);
-  if (!jni) {
-    ALOGE("AttachCurrentThread() has not been called on this thread.");
-    return std::unique_ptr<JNIEnvironment>();
-  }
-  return std::unique_ptr<JNIEnvironment>(new JNIEnvironment(jni));
-}
-
-JavaClass JVM::GetClass(const char* name) {
-  ALOGD("JVM::GetClass(%s)%s", name, GetThreadInfo().c_str());
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  return JavaClass(jni(), LookUpClass(name));
-}
-
-}  // namespace webrtc
diff --git a/modules/utility/source/process_thread_impl.cc b/modules/utility/source/process_thread_impl.cc
deleted file mode 100644
index b3057ec..0000000
--- a/modules/utility/source/process_thread_impl.cc
+++ /dev/null
@@ -1,224 +0,0 @@
-/*
- *  Copyright (c) 2012 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/utility/source/process_thread_impl.h"
-
-#include "webrtc/modules/include/module.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/task_queue.h"
-#include "webrtc/rtc_base/timeutils.h"
-#include "webrtc/rtc_base/trace_event.h"
-
-namespace webrtc {
-namespace {
-
-// We use this constant internally to signal that a module has requested
-// a callback right away.  When this is set, no call to TimeUntilNextProcess
-// should be made, but Process() should be called directly.
-const int64_t kCallProcessImmediately = -1;
-
-int64_t GetNextCallbackTime(Module* module, int64_t time_now) {
-  int64_t interval = module->TimeUntilNextProcess();
-  if (interval < 0) {
-    // Falling behind, we should call the callback now.
-    return time_now;
-  }
-  return time_now + interval;
-}
-}
-
-ProcessThread::~ProcessThread() {}
-
-// static
-std::unique_ptr<ProcessThread> ProcessThread::Create(
-    const char* thread_name) {
-  return std::unique_ptr<ProcessThread>(new ProcessThreadImpl(thread_name));
-}
-
-ProcessThreadImpl::ProcessThreadImpl(const char* thread_name)
-    : wake_up_(EventWrapper::Create()),
-      stop_(false),
-      thread_name_(thread_name) {}
-
-ProcessThreadImpl::~ProcessThreadImpl() {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  RTC_DCHECK(!thread_.get());
-  RTC_DCHECK(!stop_);
-
-  while (!queue_.empty()) {
-    delete queue_.front();
-    queue_.pop();
-  }
-}
-
-void ProcessThreadImpl::Start() {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  RTC_DCHECK(!thread_.get());
-  if (thread_.get())
-    return;
-
-  RTC_DCHECK(!stop_);
-
-  for (ModuleCallback& m : modules_)
-    m.module->ProcessThreadAttached(this);
-
-  thread_.reset(
-      new rtc::PlatformThread(&ProcessThreadImpl::Run, this, thread_name_));
-  thread_->Start();
-}
-
-void ProcessThreadImpl::Stop() {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  if(!thread_.get())
-    return;
-
-  {
-    rtc::CritScope lock(&lock_);
-    stop_ = true;
-  }
-
-  wake_up_->Set();
-
-  thread_->Stop();
-  stop_ = false;
-
-  thread_.reset();
-  for (ModuleCallback& m : modules_)
-    m.module->ProcessThreadAttached(nullptr);
-}
-
-void ProcessThreadImpl::WakeUp(Module* module) {
-  // Allowed to be called on any thread.
-  {
-    rtc::CritScope lock(&lock_);
-    for (ModuleCallback& m : modules_) {
-      if (m.module == module)
-        m.next_callback = kCallProcessImmediately;
-    }
-  }
-  wake_up_->Set();
-}
-
-void ProcessThreadImpl::PostTask(std::unique_ptr<rtc::QueuedTask> task) {
-  // Allowed to be called on any thread.
-  {
-    rtc::CritScope lock(&lock_);
-    queue_.push(task.release());
-  }
-  wake_up_->Set();
-}
-
-void ProcessThreadImpl::RegisterModule(Module* module,
-                                       const rtc::Location& from) {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  RTC_DCHECK(module) << from.ToString();
-
-#if RTC_DCHECK_IS_ON
-  {
-    // Catch programmer error.
-    rtc::CritScope lock(&lock_);
-    for (const ModuleCallback& mc : modules_) {
-      RTC_DCHECK(mc.module != module)
-          << "Already registered here: " << mc.location.ToString() << "\n"
-          << "Now attempting from here: " << from.ToString();
-    }
-  }
-#endif
-
-  // Now that we know the module isn't in the list, we'll call out to notify
-  // the module that it's attached to the worker thread.  We don't hold
-  // the lock while we make this call.
-  if (thread_.get())
-    module->ProcessThreadAttached(this);
-
-  {
-    rtc::CritScope lock(&lock_);
-    modules_.push_back(ModuleCallback(module, from));
-  }
-
-  // Wake the thread calling ProcessThreadImpl::Process() to update the
-  // waiting time. The waiting time for the just registered module may be
-  // shorter than all other registered modules.
-  wake_up_->Set();
-}
-
-void ProcessThreadImpl::DeRegisterModule(Module* module) {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  RTC_DCHECK(module);
-
-  {
-    rtc::CritScope lock(&lock_);
-    modules_.remove_if([&module](const ModuleCallback& m) {
-        return m.module == module;
-      });
-  }
-
-  // Notify the module that it's been detached.
-  module->ProcessThreadAttached(nullptr);
-}
-
-// static
-bool ProcessThreadImpl::Run(void* obj) {
-  return static_cast<ProcessThreadImpl*>(obj)->Process();
-}
-
-bool ProcessThreadImpl::Process() {
-  TRACE_EVENT1("webrtc", "ProcessThreadImpl", "name", thread_name_);
-  int64_t now = rtc::TimeMillis();
-  int64_t next_checkpoint = now + (1000 * 60);
-
-  {
-    rtc::CritScope lock(&lock_);
-    if (stop_)
-      return false;
-    for (ModuleCallback& m : modules_) {
-      // TODO(tommi): Would be good to measure the time TimeUntilNextProcess
-      // takes and dcheck if it takes too long (e.g. >=10ms).  Ideally this
-      // operation should not require taking a lock, so querying all modules
-      // should run in a matter of nanoseconds.
-      if (m.next_callback == 0)
-        m.next_callback = GetNextCallbackTime(m.module, now);
-
-      if (m.next_callback <= now ||
-          m.next_callback == kCallProcessImmediately) {
-        {
-          TRACE_EVENT2("webrtc", "ModuleProcess", "function",
-                       m.location.function_name(), "file",
-                       m.location.file_and_line());
-          m.module->Process();
-        }
-        // Use a new 'now' reference to calculate when the next callback
-        // should occur.  We'll continue to use 'now' above for the baseline
-        // of calculating how long we should wait, to reduce variance.
-        int64_t new_now = rtc::TimeMillis();
-        m.next_callback = GetNextCallbackTime(m.module, new_now);
-      }
-
-      if (m.next_callback < next_checkpoint)
-        next_checkpoint = m.next_callback;
-    }
-
-    while (!queue_.empty()) {
-      rtc::QueuedTask* task = queue_.front();
-      queue_.pop();
-      lock_.Leave();
-      task->Run();
-      delete task;
-      lock_.Enter();
-    }
-  }
-
-  int64_t time_to_wait = next_checkpoint - rtc::TimeMillis();
-  if (time_to_wait > 0)
-    wake_up_->Wait(static_cast<unsigned long>(time_to_wait));
-
-  return true;
-}
-}  // namespace webrtc
diff --git a/modules/utility/source/process_thread_impl.h b/modules/utility/source/process_thread_impl.h
deleted file mode 100644
index 4f4c65d..0000000
--- a/modules/utility/source/process_thread_impl.h
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- *  Copyright (c) 2011 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_UTILITY_SOURCE_PROCESS_THREAD_IMPL_H_
-#define WEBRTC_MODULES_UTILITY_SOURCE_PROCESS_THREAD_IMPL_H_
-
-#include <list>
-#include <memory>
-#include <queue>
-
-#include "webrtc/modules/utility/include/process_thread.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/location.h"
-#include "webrtc/rtc_base/platform_thread.h"
-#include "webrtc/rtc_base/thread_checker.h"
-#include "webrtc/system_wrappers/include/event_wrapper.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-class ProcessThreadImpl : public ProcessThread {
- public:
-  explicit ProcessThreadImpl(const char* thread_name);
-  ~ProcessThreadImpl() override;
-
-  void Start() override;
-  void Stop() override;
-
-  void WakeUp(Module* module) override;
-  void PostTask(std::unique_ptr<rtc::QueuedTask> task) override;
-
-  void RegisterModule(Module* module, const rtc::Location& from) override;
-  void DeRegisterModule(Module* module) override;
-
- protected:
-  static bool Run(void* obj);
-  bool Process();
-
- private:
-  struct ModuleCallback {
-    ModuleCallback() = delete;
-    ModuleCallback(ModuleCallback&& cb) = default;
-    ModuleCallback(const ModuleCallback& cb) = default;
-    ModuleCallback(Module* module, const rtc::Location& location)
-        : module(module), location(location) {}
-    bool operator==(const ModuleCallback& cb) const {
-      return cb.module == module;
-    }
-
-    Module* const module;
-    int64_t next_callback = 0;  // Absolute timestamp.
-    const rtc::Location location;
-
-   private:
-    ModuleCallback& operator=(ModuleCallback&);
-  };
-
-  typedef std::list<ModuleCallback> ModuleList;
-
-  // Warning: For some reason, if |lock_| comes immediately before |modules_|
-  // with the current class layout, we will  start to have mysterious crashes
-  // on Mac 10.9 debug.  I (Tommi) suspect we're hitting some obscure alignemnt
-  // issues, but I haven't figured out what they are, if there are alignment
-  // requirements for mutexes on Mac or if there's something else to it.
-  // So be careful with changing the layout.
-  rtc::CriticalSection lock_;  // Used to guard modules_, tasks_ and stop_.
-
-  rtc::ThreadChecker thread_checker_;
-  const std::unique_ptr<EventWrapper> wake_up_;
-  // TODO(pbos): Remove unique_ptr and stop recreating the thread.
-  std::unique_ptr<rtc::PlatformThread> thread_;
-
-  ModuleList modules_;
-  std::queue<rtc::QueuedTask*> queue_;
-  bool stop_;
-  const char* thread_name_;
-};
-
-}  // namespace webrtc
-
-#endif // WEBRTC_MODULES_UTILITY_SOURCE_PROCESS_THREAD_IMPL_H_
diff --git a/modules/utility/source/process_thread_impl_unittest.cc b/modules/utility/source/process_thread_impl_unittest.cc
deleted file mode 100644
index e594de0..0000000
--- a/modules/utility/source/process_thread_impl_unittest.cc
+++ /dev/null
@@ -1,321 +0,0 @@
-/*
- *  Copyright (c) 2012 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 <memory>
-#include <utility>
-
-#include "webrtc/modules/include/module.h"
-#include "webrtc/modules/utility/source/process_thread_impl.h"
-#include "webrtc/rtc_base/location.h"
-#include "webrtc/rtc_base/task_queue.h"
-#include "webrtc/rtc_base/timeutils.h"
-#include "webrtc/test/gmock.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-using ::testing::_;
-using ::testing::DoAll;
-using ::testing::InSequence;
-using ::testing::Invoke;
-using ::testing::Return;
-using ::testing::SetArgPointee;
-
-// The length of time, in milliseconds, to wait for an event to become signaled.
-// Set to a fairly large value as there is quite a bit of variation on some
-// Windows bots.
-static const int kEventWaitTimeout = 500;
-
-class MockModule : public Module {
- public:
-  MOCK_METHOD0(TimeUntilNextProcess, int64_t());
-  MOCK_METHOD0(Process, void());
-  MOCK_METHOD1(ProcessThreadAttached, void(ProcessThread*));
-};
-
-class RaiseEventTask : public rtc::QueuedTask {
- public:
-  RaiseEventTask(EventWrapper* event) : event_(event) {}
-  bool Run() override {
-    event_->Set();
-    return true;
-  }
-
- private:
-  EventWrapper* event_;
-};
-
-ACTION_P(SetEvent, event) {
-  event->Set();
-}
-
-ACTION_P(Increment, counter) {
-  ++(*counter);
-}
-
-ACTION_P(SetTimestamp, ptr) {
-  *ptr = rtc::TimeMillis();
-}
-
-TEST(ProcessThreadImpl, StartStop) {
-  ProcessThreadImpl thread("ProcessThread");
-  thread.Start();
-  thread.Stop();
-}
-
-TEST(ProcessThreadImpl, MultipleStartStop) {
-  ProcessThreadImpl thread("ProcessThread");
-  for (int i = 0; i < 5; ++i) {
-    thread.Start();
-    thread.Stop();
-  }
-}
-
-// Verifies that we get at least call back to Process() on the worker thread.
-TEST(ProcessThreadImpl, ProcessCall) {
-  ProcessThreadImpl thread("ProcessThread");
-  thread.Start();
-
-  std::unique_ptr<EventWrapper> event(EventWrapper::Create());
-
-  MockModule module;
-  EXPECT_CALL(module, TimeUntilNextProcess())
-      .WillOnce(Return(0))
-      .WillRepeatedly(Return(1));
-  EXPECT_CALL(module, Process())
-      .WillOnce(DoAll(SetEvent(event.get()), Return()))
-      .WillRepeatedly(Return());
-  EXPECT_CALL(module, ProcessThreadAttached(&thread)).Times(1);
-
-  thread.RegisterModule(&module, RTC_FROM_HERE);
-  EXPECT_EQ(kEventSignaled, event->Wait(kEventWaitTimeout));
-
-  EXPECT_CALL(module, ProcessThreadAttached(nullptr)).Times(1);
-  thread.Stop();
-}
-
-// Same as ProcessCall except the module is registered before the
-// call to Start().
-TEST(ProcessThreadImpl, ProcessCall2) {
-  ProcessThreadImpl thread("ProcessThread");
-  std::unique_ptr<EventWrapper> event(EventWrapper::Create());
-
-  MockModule module;
-  EXPECT_CALL(module, TimeUntilNextProcess())
-      .WillOnce(Return(0))
-      .WillRepeatedly(Return(1));
-  EXPECT_CALL(module, Process())
-      .WillOnce(DoAll(SetEvent(event.get()), Return()))
-      .WillRepeatedly(Return());
-
-  thread.RegisterModule(&module, RTC_FROM_HERE);
-
-  EXPECT_CALL(module, ProcessThreadAttached(&thread)).Times(1);
-  thread.Start();
-  EXPECT_EQ(kEventSignaled, event->Wait(kEventWaitTimeout));
-
-  EXPECT_CALL(module, ProcessThreadAttached(nullptr)).Times(1);
-  thread.Stop();
-}
-
-// Tests setting up a module for callbacks and then unregister that module.
-// After unregistration, we should not receive any further callbacks.
-TEST(ProcessThreadImpl, Deregister) {
-  ProcessThreadImpl thread("ProcessThread");
-  std::unique_ptr<EventWrapper> event(EventWrapper::Create());
-
-  int process_count = 0;
-  MockModule module;
-  EXPECT_CALL(module, TimeUntilNextProcess())
-      .WillOnce(Return(0))
-      .WillRepeatedly(Return(1));
-  EXPECT_CALL(module, Process())
-      .WillOnce(DoAll(SetEvent(event.get()),
-                      Increment(&process_count),
-                      Return()))
-      .WillRepeatedly(DoAll(Increment(&process_count), Return()));
-
-  thread.RegisterModule(&module, RTC_FROM_HERE);
-
-  EXPECT_CALL(module, ProcessThreadAttached(&thread)).Times(1);
-  thread.Start();
-
-  EXPECT_EQ(kEventSignaled, event->Wait(kEventWaitTimeout));
-
-  EXPECT_CALL(module, ProcessThreadAttached(nullptr)).Times(1);
-  thread.DeRegisterModule(&module);
-
-  EXPECT_GE(process_count, 1);
-  int count_after_deregister = process_count;
-
-  // We shouldn't get any more callbacks.
-  EXPECT_EQ(kEventTimeout, event->Wait(20));
-  EXPECT_EQ(count_after_deregister, process_count);
-  thread.Stop();
-}
-
-// Helper function for testing receiving a callback after a certain amount of
-// time.  There's some variance of timing built into it to reduce chance of
-// flakiness on bots.
-void ProcessCallAfterAFewMs(int64_t milliseconds) {
-  ProcessThreadImpl thread("ProcessThread");
-  thread.Start();
-
-  std::unique_ptr<EventWrapper> event(EventWrapper::Create());
-
-  MockModule module;
-  int64_t start_time = 0;
-  int64_t called_time = 0;
-  EXPECT_CALL(module, TimeUntilNextProcess())
-      .WillOnce(DoAll(SetTimestamp(&start_time),
-                      Return(milliseconds)))
-      .WillRepeatedly(Return(milliseconds));
-  EXPECT_CALL(module, Process())
-      .WillOnce(DoAll(SetTimestamp(&called_time),
-                      SetEvent(event.get()),
-                      Return()))
-      .WillRepeatedly(Return());
-
-  EXPECT_CALL(module, ProcessThreadAttached(&thread)).Times(1);
-  thread.RegisterModule(&module, RTC_FROM_HERE);
-
-  // Add a buffer of 50ms due to slowness of some trybots
-  // (e.g. win_drmemory_light)
-  EXPECT_EQ(kEventSignaled, event->Wait(milliseconds + 50));
-
-  EXPECT_CALL(module, ProcessThreadAttached(nullptr)).Times(1);
-  thread.Stop();
-
-  ASSERT_GT(start_time, 0);
-  ASSERT_GT(called_time, 0);
-  // Use >= instead of > since due to rounding and timer accuracy (or lack
-  // thereof), can make the test run in "0"ms time.
-  EXPECT_GE(called_time, start_time);
-  // Check for an acceptable range.
-  uint32_t diff = called_time - start_time;
-  EXPECT_GE(diff, milliseconds - 15);
-  EXPECT_LT(diff, milliseconds + 15);
-}
-
-// DISABLED for now since the virtual build bots are too slow :(
-// TODO(tommi): Fix.
-TEST(ProcessThreadImpl, DISABLED_ProcessCallAfter5ms) {
-  ProcessCallAfterAFewMs(5);
-}
-
-// DISABLED for now since the virtual build bots are too slow :(
-// TODO(tommi): Fix.
-TEST(ProcessThreadImpl, DISABLED_ProcessCallAfter50ms) {
-  ProcessCallAfterAFewMs(50);
-}
-
-// DISABLED for now since the virtual build bots are too slow :(
-// TODO(tommi): Fix.
-TEST(ProcessThreadImpl, DISABLED_ProcessCallAfter200ms) {
-  ProcessCallAfterAFewMs(200);
-}
-
-// Runs callbacks with the goal of getting up to 50 callbacks within a second
-// (on average 1 callback every 20ms).  On real hardware, we're usually pretty
-// close to that, but the test bots that run on virtual machines, will
-// typically be in the range 30-40 callbacks.
-// DISABLED for now since this can take up to 2 seconds to run on the slowest
-// build bots.
-// TODO(tommi): Fix.
-TEST(ProcessThreadImpl, DISABLED_Process50Times) {
-  ProcessThreadImpl thread("ProcessThread");
-  thread.Start();
-
-  std::unique_ptr<EventWrapper> event(EventWrapper::Create());
-
-  MockModule module;
-  int callback_count = 0;
-  // Ask for a callback after 20ms.
-  EXPECT_CALL(module, TimeUntilNextProcess())
-      .WillRepeatedly(Return(20));
-  EXPECT_CALL(module, Process())
-      .WillRepeatedly(DoAll(Increment(&callback_count),
-                            Return()));
-
-  EXPECT_CALL(module, ProcessThreadAttached(&thread)).Times(1);
-  thread.RegisterModule(&module, RTC_FROM_HERE);
-
-  EXPECT_EQ(kEventTimeout, event->Wait(1000));
-
-  EXPECT_CALL(module, ProcessThreadAttached(nullptr)).Times(1);
-  thread.Stop();
-
-  printf("Callback count: %i\n", callback_count);
-  // Check that we got called back up to 50 times.
-  // Some of the try bots run on slow virtual machines, so the lower bound
-  // is much more relaxed to avoid flakiness.
-  EXPECT_GE(callback_count, 25);
-  EXPECT_LE(callback_count, 50);
-}
-
-// Tests that we can wake up the worker thread to give us a callback right
-// away when we know the thread is sleeping.
-TEST(ProcessThreadImpl, WakeUp) {
-  ProcessThreadImpl thread("ProcessThread");
-  thread.Start();
-
-  std::unique_ptr<EventWrapper> started(EventWrapper::Create());
-  std::unique_ptr<EventWrapper> called(EventWrapper::Create());
-
-  MockModule module;
-  int64_t start_time;
-  int64_t called_time;
-
-  // Ask for a callback after 1000ms.
-  // TimeUntilNextProcess will be called twice.
-  // The first time we use it to get the thread into a waiting state.
-  // Then we  wake the thread and there should not be another call made to
-  // TimeUntilNextProcess before Process() is called.
-  // The second time TimeUntilNextProcess is then called, is after Process
-  // has been called and we don't expect any more calls.
-  EXPECT_CALL(module, TimeUntilNextProcess())
-      .WillOnce(DoAll(SetTimestamp(&start_time),
-                      SetEvent(started.get()),
-                      Return(1000)))
-      .WillOnce(Return(1000));
-  EXPECT_CALL(module, Process())
-      .WillOnce(
-          DoAll(SetTimestamp(&called_time), SetEvent(called.get()), Return()))
-      .WillRepeatedly(Return());
-
-  EXPECT_CALL(module, ProcessThreadAttached(&thread)).Times(1);
-  thread.RegisterModule(&module, RTC_FROM_HERE);
-
-  EXPECT_EQ(kEventSignaled, started->Wait(kEventWaitTimeout));
-  thread.WakeUp(&module);
-  EXPECT_EQ(kEventSignaled, called->Wait(kEventWaitTimeout));
-
-  EXPECT_CALL(module, ProcessThreadAttached(nullptr)).Times(1);
-  thread.Stop();
-
-  EXPECT_GE(called_time, start_time);
-  uint32_t diff = called_time - start_time;
-  // We should have been called back much quicker than 1sec.
-  EXPECT_LE(diff, 100u);
-}
-
-// Tests that we can post a task that gets run straight away on the worker
-// thread.
-TEST(ProcessThreadImpl, PostTask) {
-  ProcessThreadImpl thread("ProcessThread");
-  std::unique_ptr<EventWrapper> task_ran(EventWrapper::Create());
-  std::unique_ptr<RaiseEventTask> task(new RaiseEventTask(task_ran.get()));
-  thread.Start();
-  thread.PostTask(std::move(task));
-  EXPECT_EQ(kEventSignaled, task_ran->Wait(kEventWaitTimeout));
-  thread.Stop();
-}
-
-}  // namespace webrtc
diff --git a/modules/video_capture/BUILD.gn b/modules/video_capture/BUILD.gn
deleted file mode 100644
index 5176862..0000000
--- a/modules/video_capture/BUILD.gn
+++ /dev/null
@@ -1,219 +0,0 @@
-# Copyright (c) 2014 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.
-
-import("../../webrtc.gni")
-
-# Note this target is missing an implementation for the video capture.
-# Targets must link with either 'video_capture' or
-# 'video_capture_internal_impl' depending on whether they want to
-# use the internal capturer.
-rtc_static_library("video_capture_module") {
-  sources = [
-    "device_info_impl.cc",
-    "device_info_impl.h",
-    "video_capture.h",
-    "video_capture_config.h",
-    "video_capture_defines.h",
-    "video_capture_factory.cc",
-    "video_capture_factory.h",
-    "video_capture_impl.cc",
-    "video_capture_impl.h",
-  ]
-
-  deps = [
-    "..:module_api",
-    "../..:webrtc_common",
-    "../../common_video",
-    "../../rtc_base:rtc_base_approved",
-    "../../system_wrappers",
-  ]
-
-  if (!build_with_chromium && is_clang) {
-    # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-    suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-  }
-}
-
-rtc_static_library("video_capture") {
-  sources = [
-    "external/device_info_external.cc",
-    "external/video_capture_external.cc",
-  ]
-
-  deps = [
-    ":video_capture_module",
-    "../../rtc_base:rtc_base_approved",
-    "../../system_wrappers",
-  ]
-
-  if (!build_with_chromium && is_clang) {
-    # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-    suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-  }
-}
-
-if (!build_with_chromium) {
-  config("video_capture_internal_impl_config") {
-    if (is_ios || is_mac) {
-      libs = [
-        "AVFoundation.framework",
-        "CoreMedia.framework",
-        "CoreVideo.framework",
-      ]
-    }
-  }
-
-  config("video_capture_internal_impl_warnings_config") {
-    if (is_win && is_clang) {
-      cflags = [
-        "-Wno-comment",
-        "-Wno-ignored-attributes",
-
-        # See https://bugs.chromium.org/p/webrtc/issues/detail?id=6269
-        # for -Wno-ignored-qualifiers
-        "-Wno-ignored-qualifiers",
-        "-Wno-microsoft-extra-qualification",
-        "-Wno-missing-braces",
-        "-Wno-overloaded-virtual",
-        "-Wno-reorder",
-        "-Wno-writable-strings",
-      ]
-    }
-  }
-
-  if (is_ios || is_mac) {
-    rtc_source_set("video_capture_internal_impl_objc") {
-      visibility = [ ":video_capture_internal_impl" ]
-      configs += [ ":video_capture_internal_impl_warnings_config" ]
-
-      deps = [
-        ":video_capture_module",
-        "../../rtc_base:rtc_base_approved",
-        "../../system_wrappers",
-      ]
-
-      sources = [
-        "objc/device_info.h",
-        "objc/device_info.mm",
-        "objc/device_info_objc.h",
-        "objc/device_info_objc.mm",
-        "objc/rtc_video_capture_objc.h",
-        "objc/rtc_video_capture_objc.mm",
-        "objc/video_capture.h",
-        "objc/video_capture.mm",
-      ]
-
-      all_dependent_configs = [ ":video_capture_internal_impl_config" ]
-
-      if (!build_with_chromium && is_clang) {
-        # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-        suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-      }
-    }
-  }
-
-  rtc_source_set("video_capture_internal_impl") {
-    configs += [ ":video_capture_internal_impl_warnings_config" ]
-
-    deps = [
-      ":video_capture_module",
-      "../../rtc_base:rtc_base_approved",
-      "../../system_wrappers",
-    ]
-
-    if (is_linux) {
-      sources = [
-        "linux/device_info_linux.cc",
-        "linux/device_info_linux.h",
-        "linux/video_capture_linux.cc",
-        "linux/video_capture_linux.h",
-      ]
-      deps += [
-        "../..:webrtc_common",
-        "../../media:rtc_media_base",
-      ]
-    }
-    if (is_win) {
-      sources = [
-        "windows/device_info_ds.cc",
-        "windows/device_info_ds.h",
-        "windows/device_info_mf.cc",
-        "windows/device_info_mf.h",
-        "windows/help_functions_ds.cc",
-        "windows/help_functions_ds.h",
-        "windows/sink_filter_ds.cc",
-        "windows/sink_filter_ds.h",
-        "windows/video_capture_ds.cc",
-        "windows/video_capture_ds.h",
-        "windows/video_capture_factory_windows.cc",
-        "windows/video_capture_mf.cc",
-        "windows/video_capture_mf.h",
-      ]
-
-      libs = [ "Strmiids.lib" ]
-
-      deps += [ "//third_party/winsdk_samples" ]
-    }
-    if (is_ios || is_mac) {
-      deps += [ ":video_capture_internal_impl_objc" ]
-    }
-
-    all_dependent_configs = [ ":video_capture_internal_impl_config" ]
-
-    if (!build_with_chromium && is_clang) {
-      # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-    }
-  }
-
-  if (!is_android && rtc_include_tests) {
-    rtc_test("video_capture_tests") {
-      sources = [
-        "test/video_capture_unittest.cc",
-      ]
-
-      cflags = []
-      if (is_linux || is_mac) {
-        cflags += [ "-Wno-write-strings" ]
-      }
-
-      ldflags = []
-      if (is_linux || is_mac) {
-        ldflags += [
-          "-lpthread",
-          "-lm",
-        ]
-      }
-      if (is_linux) {
-        ldflags += [
-          "-lrt",
-          "-lXext",
-          "-lX11",
-        ]
-      }
-
-      deps = [
-        ":video_capture_internal_impl",
-        ":video_capture_module",
-        "../../common_video:common_video",
-        "../../rtc_base:rtc_base_approved",
-        "../../system_wrappers:system_wrappers",
-        "../../system_wrappers:system_wrappers_default",
-        "../../test:video_test_common",
-        "../utility",
-        "//testing/gtest",
-      ]
-      deps += [ "../../test:test_main" ]
-
-      if (!build_with_chromium && is_clang) {
-        # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-        suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-      }
-    }
-  }
-}
diff --git a/modules/video_capture/DEPS b/modules/video_capture/DEPS
deleted file mode 100644
index 86af6db..0000000
--- a/modules/video_capture/DEPS
+++ /dev/null
@@ -1,5 +0,0 @@
-include_rules = [
-  "+webrtc/common_video",
-  "+webrtc/media/base",
-  "+webrtc/system_wrappers",
-]
diff --git a/modules/video_capture/OWNERS b/modules/video_capture/OWNERS
deleted file mode 100644
index 32e7151..0000000
--- a/modules/video_capture/OWNERS
+++ /dev/null
@@ -1,10 +0,0 @@
-glaznev@webrtc.org
-mflodman@webrtc.org
-perkj@webrtc.org
-tkchin@webrtc.org
-
-
-# These are for the common case of adding or renaming files. If you're doing
-# structural changes, please get a review from a reviewer in this file.
-per-file *.gn=*
-per-file *.gni=*
diff --git a/modules/video_capture/device_info_impl.cc b/modules/video_capture/device_info_impl.cc
deleted file mode 100644
index d9e5879..0000000
--- a/modules/video_capture/device_info_impl.cc
+++ /dev/null
@@ -1,263 +0,0 @@
-/*
- *  Copyright (c) 2012 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 <assert.h>
-#include <stdlib.h>
-
-#include "webrtc/modules/video_capture/device_info_impl.h"
-#include "webrtc/modules/video_capture/video_capture_config.h"
-#include "webrtc/rtc_base/logging.h"
-
-#ifndef abs
-#define abs(a) (a>=0?a:-a)
-#endif
-
-namespace webrtc
-{
-namespace videocapturemodule
-{
-DeviceInfoImpl::DeviceInfoImpl()
-    : _apiLock(*RWLockWrapper::CreateRWLock()), _lastUsedDeviceName(NULL),
-      _lastUsedDeviceNameLength(0)
-{
-}
-
-DeviceInfoImpl::~DeviceInfoImpl(void)
-{
-    _apiLock.AcquireLockExclusive();
-    free(_lastUsedDeviceName);
-    _apiLock.ReleaseLockExclusive();
-
-    delete &_apiLock;
-}
-int32_t DeviceInfoImpl::NumberOfCapabilities(
-                                        const char* deviceUniqueIdUTF8)
-{
-
-    if (!deviceUniqueIdUTF8)
-        return -1;
-
-    _apiLock.AcquireLockShared();
-
-    if (_lastUsedDeviceNameLength == strlen((char*) deviceUniqueIdUTF8))
-    {
-        // Is it the same device that is asked for again.
-#if defined(WEBRTC_MAC) || defined(WEBRTC_LINUX)
-        if(strncasecmp((char*)_lastUsedDeviceName,
-                       (char*) deviceUniqueIdUTF8,
-                       _lastUsedDeviceNameLength)==0)
-#else
-        if (_strnicmp((char*) _lastUsedDeviceName,
-                      (char*) deviceUniqueIdUTF8,
-                      _lastUsedDeviceNameLength) == 0)
-#endif
-        {
-            //yes
-            _apiLock.ReleaseLockShared();
-            return static_cast<int32_t>(_captureCapabilities.size());
-        }
-    }
-    // Need to get exclusive rights to create the new capability map.
-    _apiLock.ReleaseLockShared();
-    WriteLockScoped cs2(_apiLock);
-
-    int32_t ret = CreateCapabilityMap(deviceUniqueIdUTF8);
-    return ret;
-}
-
-int32_t DeviceInfoImpl::GetCapability(const char* deviceUniqueIdUTF8,
-                                      const uint32_t deviceCapabilityNumber,
-                                      VideoCaptureCapability& capability)
-{
-    assert(deviceUniqueIdUTF8 != NULL);
-
-    ReadLockScoped cs(_apiLock);
-
-    if ((_lastUsedDeviceNameLength != strlen((char*) deviceUniqueIdUTF8))
-#if defined(WEBRTC_MAC) || defined(WEBRTC_LINUX)
-        || (strncasecmp((char*)_lastUsedDeviceName,
-                        (char*) deviceUniqueIdUTF8,
-                        _lastUsedDeviceNameLength)!=0))
-#else
-        || (_strnicmp((char*) _lastUsedDeviceName,
-                      (char*) deviceUniqueIdUTF8,
-                      _lastUsedDeviceNameLength) != 0))
-#endif
-
-    {
-        _apiLock.ReleaseLockShared();
-        _apiLock.AcquireLockExclusive();
-        if (-1 == CreateCapabilityMap(deviceUniqueIdUTF8))
-        {
-            _apiLock.ReleaseLockExclusive();
-            _apiLock.AcquireLockShared();
-            return -1;
-        }
-        _apiLock.ReleaseLockExclusive();
-        _apiLock.AcquireLockShared();
-    }
-
-    // Make sure the number is valid
-    if (deviceCapabilityNumber >= (unsigned int) _captureCapabilities.size())
-    {
-        LOG(LS_ERROR) << "Invalid deviceCapabilityNumber "
-                      << deviceCapabilityNumber << ">= number of capabilities ("
-                      << _captureCapabilities.size() << ").";
-        return -1;
-    }
-
-    capability = _captureCapabilities[deviceCapabilityNumber];
-    return 0;
-}
-
-int32_t DeviceInfoImpl::GetBestMatchedCapability(
-                                        const char*deviceUniqueIdUTF8,
-                                        const VideoCaptureCapability& requested,
-                                        VideoCaptureCapability& resulting)
-{
-
-
-    if (!deviceUniqueIdUTF8)
-        return -1;
-
-    ReadLockScoped cs(_apiLock);
-    if ((_lastUsedDeviceNameLength != strlen((char*) deviceUniqueIdUTF8))
-#if defined(WEBRTC_MAC) || defined(WEBRTC_LINUX)
-        || (strncasecmp((char*)_lastUsedDeviceName,
-                        (char*) deviceUniqueIdUTF8,
-                        _lastUsedDeviceNameLength)!=0))
-#else
-        || (_strnicmp((char*) _lastUsedDeviceName,
-                      (char*) deviceUniqueIdUTF8,
-                      _lastUsedDeviceNameLength) != 0))
-#endif
-    {
-        _apiLock.ReleaseLockShared();
-        _apiLock.AcquireLockExclusive();
-        if (-1 == CreateCapabilityMap(deviceUniqueIdUTF8))
-        {
-            return -1;
-        }
-        _apiLock.ReleaseLockExclusive();
-        _apiLock.AcquireLockShared();
-    }
-
-    int32_t bestformatIndex = -1;
-    int32_t bestWidth = 0;
-    int32_t bestHeight = 0;
-    int32_t bestFrameRate = 0;
-    VideoType bestVideoType = VideoType::kUnknown;
-
-    const int32_t numberOfCapabilies =
-        static_cast<int32_t>(_captureCapabilities.size());
-
-    for (int32_t tmp = 0; tmp < numberOfCapabilies; ++tmp) // Loop through all capabilities
-    {
-        VideoCaptureCapability& capability = _captureCapabilities[tmp];
-
-        const int32_t diffWidth = capability.width - requested.width;
-        const int32_t diffHeight = capability.height - requested.height;
-        const int32_t diffFrameRate = capability.maxFPS - requested.maxFPS;
-
-        const int32_t currentbestDiffWith = bestWidth - requested.width;
-        const int32_t currentbestDiffHeight = bestHeight - requested.height;
-        const int32_t currentbestDiffFrameRate = bestFrameRate - requested.maxFPS;
-
-        if ((diffHeight >= 0 && diffHeight <= abs(currentbestDiffHeight)) // Height better or equalt that previouse.
-            || (currentbestDiffHeight < 0 && diffHeight >= currentbestDiffHeight))
-        {
-
-            if (diffHeight == currentbestDiffHeight) // Found best height. Care about the width)
-            {
-                if ((diffWidth >= 0 && diffWidth <= abs(currentbestDiffWith)) // Width better or equal
-                    || (currentbestDiffWith < 0 && diffWidth >= currentbestDiffWith))
-                {
-                    if (diffWidth == currentbestDiffWith && diffHeight
-                        == currentbestDiffHeight) // Same size as previously
-                    {
-                        //Also check the best frame rate if the diff is the same as previouse
-                        if (((diffFrameRate >= 0 &&
-                              diffFrameRate <= currentbestDiffFrameRate) // Frame rate to high but better match than previouse and we have not selected IUV
-                            ||
-                            (currentbestDiffFrameRate < 0 &&
-                             diffFrameRate >= currentbestDiffFrameRate)) // Current frame rate is lower than requested. This is better.
-                        )
-                        {
-                            if ((currentbestDiffFrameRate == diffFrameRate) // Same frame rate as previous  or frame rate allready good enough
-                                || (currentbestDiffFrameRate >= 0))
-                            {
-                              if (bestVideoType != requested.videoType &&
-                                  requested.videoType != VideoType::kUnknown &&
-                                  (capability.videoType ==
-                                       requested.videoType ||
-                                   capability.videoType == VideoType::kI420 ||
-                                   capability.videoType == VideoType::kYUY2 ||
-                                   capability.videoType == VideoType::kYV12)) {
-                                bestVideoType = capability.videoType;
-                                bestformatIndex = tmp;
-                                }
-                                // If width height and frame rate is full filled we can use the camera for encoding if it is supported.
-                                if (capability.height == requested.height
-                                    && capability.width == requested.width
-                                    && capability.maxFPS >= requested.maxFPS)
-                                {
-                                  bestformatIndex = tmp;
-                                }
-                            }
-                            else // Better frame rate
-                            {
-                                bestWidth = capability.width;
-                                bestHeight = capability.height;
-                                bestFrameRate = capability.maxFPS;
-                                bestVideoType = capability.videoType;
-                                bestformatIndex = tmp;
-                            }
-                        }
-                    }
-                    else // Better width than previously
-                    {
-                        bestWidth = capability.width;
-                        bestHeight = capability.height;
-                        bestFrameRate = capability.maxFPS;
-                        bestVideoType = capability.videoType;
-                        bestformatIndex = tmp;
-                    }
-                }// else width no good
-            }
-            else // Better height
-            {
-                bestWidth = capability.width;
-                bestHeight = capability.height;
-                bestFrameRate = capability.maxFPS;
-                bestVideoType = capability.videoType;
-                bestformatIndex = tmp;
-            }
-        }// else height not good
-    }//end for
-
-    LOG(LS_VERBOSE) << "Best camera format: " << bestWidth << "x" << bestHeight
-                    << "@" << bestFrameRate
-                    << "fps, color format: " << static_cast<int>(bestVideoType);
-
-    // Copy the capability
-    if (bestformatIndex < 0)
-        return -1;
-    resulting = _captureCapabilities[bestformatIndex];
-    return bestformatIndex;
-}
-
-//Default implementation. This should be overridden by Mobile implementations.
-int32_t DeviceInfoImpl::GetOrientation(const char* deviceUniqueIdUTF8,
-                                       VideoRotation& orientation) {
-  orientation = kVideoRotation_0;
-    return -1;
-}
-}  // namespace videocapturemodule
-}  // namespace webrtc
diff --git a/modules/video_capture/device_info_impl.h b/modules/video_capture/device_info_impl.h
deleted file mode 100644
index 463e10d..0000000
--- a/modules/video_capture/device_info_impl.h
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- *  Copyright (c) 2012 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_VIDEO_CAPTURE_MAIN_SOURCE_DEVICE_INFO_IMPL_H_
-#define WEBRTC_MODULES_VIDEO_CAPTURE_MAIN_SOURCE_DEVICE_INFO_IMPL_H_
-
-#include <vector>
-
-#include "webrtc/modules/video_capture/video_capture.h"
-#include "webrtc/system_wrappers/include/rw_lock_wrapper.h"
-
-namespace webrtc
-{
-namespace videocapturemodule
-{
-class DeviceInfoImpl: public VideoCaptureModule::DeviceInfo
-{
-public:
-    DeviceInfoImpl();
-    virtual ~DeviceInfoImpl(void);
-    virtual int32_t NumberOfCapabilities(const char* deviceUniqueIdUTF8);
-    virtual int32_t GetCapability(
-        const char* deviceUniqueIdUTF8,
-        const uint32_t deviceCapabilityNumber,
-        VideoCaptureCapability& capability);
-
-    virtual int32_t GetBestMatchedCapability(
-        const char* deviceUniqueIdUTF8,
-        const VideoCaptureCapability& requested,
-        VideoCaptureCapability& resulting);
-    virtual int32_t GetOrientation(const char* deviceUniqueIdUTF8,
-                                   VideoRotation& orientation);
-
-protected:
-    /* Initialize this object*/
-
-    virtual int32_t Init()=0;
-    /*
-     * Fills the member variable _captureCapabilities with capabilities for the given device name.
-     */
-    virtual int32_t CreateCapabilityMap(const char* deviceUniqueIdUTF8)=0;
-
-protected:
-    // Data members
-    typedef std::vector<VideoCaptureCapability> VideoCaptureCapabilities;
-    VideoCaptureCapabilities _captureCapabilities;
-    RWLockWrapper& _apiLock;
-    char* _lastUsedDeviceName;
-    uint32_t _lastUsedDeviceNameLength;
-};
-}  // namespace videocapturemodule
-}  // namespace webrtc
-#endif // WEBRTC_MODULES_VIDEO_CAPTURE_MAIN_SOURCE_DEVICE_INFO_IMPL_H_
diff --git a/modules/video_capture/external/device_info_external.cc b/modules/video_capture/external/device_info_external.cc
deleted file mode 100644
index e54bd43..0000000
--- a/modules/video_capture/external/device_info_external.cc
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- *  Copyright (c) 2012 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/video_capture/device_info_impl.h"
-#include "webrtc/modules/video_capture/video_capture_impl.h"
-
-namespace webrtc {
-
-namespace videocapturemodule {
-
-class ExternalDeviceInfo : public DeviceInfoImpl {
- public:
-  ExternalDeviceInfo() {}
-  virtual ~ExternalDeviceInfo() {}
-  virtual uint32_t NumberOfDevices() { return 0; }
-  virtual int32_t DisplayCaptureSettingsDialogBox(
-      const char* /*deviceUniqueIdUTF8*/,
-      const char* /*dialogTitleUTF8*/,
-      void* /*parentWindow*/,
-      uint32_t /*positionX*/,
-      uint32_t /*positionY*/) { return -1; }
-  virtual int32_t GetDeviceName(
-      uint32_t deviceNumber,
-      char* deviceNameUTF8,
-      uint32_t deviceNameLength,
-      char* deviceUniqueIdUTF8,
-      uint32_t deviceUniqueIdUTF8Length,
-      char* productUniqueIdUTF8=0,
-      uint32_t productUniqueIdUTF8Length=0) {
-    return -1;
-  }
-  virtual int32_t CreateCapabilityMap(
-      const char* deviceUniqueIdUTF8) { return 0; }
-  virtual int32_t Init() { return 0; }
-};
-
-VideoCaptureModule::DeviceInfo* VideoCaptureImpl::CreateDeviceInfo() {
-  return new ExternalDeviceInfo();
-}
-
-}  // namespace videocapturemodule
-
-}  // namespace webrtc
diff --git a/modules/video_capture/external/video_capture_external.cc b/modules/video_capture/external/video_capture_external.cc
deleted file mode 100644
index e1f4a54..0000000
--- a/modules/video_capture/external/video_capture_external.cc
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- *  Copyright (c) 2012 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/video_capture/video_capture_impl.h"
-#include "webrtc/rtc_base/refcount.h"
-
-namespace webrtc {
-
-namespace videocapturemodule {
-
-rtc::scoped_refptr<VideoCaptureModule> VideoCaptureImpl::Create(
-    const char* deviceUniqueIdUTF8) {
-  return new rtc::RefCountedObject<VideoCaptureImpl>();
-}
-
-}  // namespace videocapturemodule
-
-}  // namespace webrtc
diff --git a/modules/video_capture/linux/device_info_linux.cc b/modules/video_capture/linux/device_info_linux.cc
deleted file mode 100644
index 9c8c051..0000000
--- a/modules/video_capture/linux/device_info_linux.cc
+++ /dev/null
@@ -1,321 +0,0 @@
-/*
- *  Copyright (c) 2012 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/video_capture/linux/device_info_linux.h"
-
-#include <errno.h>
-#include <fcntl.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <sys/ioctl.h>
-#include <sys/stat.h>
-#include <unistd.h>
-//v4l includes
-#include <linux/videodev2.h>
-
-#include "webrtc/rtc_base/logging.h"
-
-
-namespace webrtc
-{
-namespace videocapturemodule
-{
-VideoCaptureModule::DeviceInfo*
-VideoCaptureImpl::CreateDeviceInfo()
-{
-    return new videocapturemodule::DeviceInfoLinux();
-}
-
-DeviceInfoLinux::DeviceInfoLinux()
-    : DeviceInfoImpl()
-{
-}
-
-int32_t DeviceInfoLinux::Init()
-{
-    return 0;
-}
-
-DeviceInfoLinux::~DeviceInfoLinux()
-{
-}
-
-uint32_t DeviceInfoLinux::NumberOfDevices()
-{
-    LOG(LS_INFO) << __FUNCTION__;
-
-    uint32_t count = 0;
-    char device[20];
-    int fd = -1;
-
-    /* detect /dev/video [0-63]VideoCaptureModule entries */
-    for (int n = 0; n < 64; n++)
-    {
-        sprintf(device, "/dev/video%d", n);
-        if ((fd = open(device, O_RDONLY)) != -1)
-        {
-            close(fd);
-            count++;
-        }
-    }
-
-    return count;
-}
-
-int32_t DeviceInfoLinux::GetDeviceName(
-                                         uint32_t deviceNumber,
-                                         char* deviceNameUTF8,
-                                         uint32_t deviceNameLength,
-                                         char* deviceUniqueIdUTF8,
-                                         uint32_t deviceUniqueIdUTF8Length,
-                                         char* /*productUniqueIdUTF8*/,
-                                         uint32_t /*productUniqueIdUTF8Length*/)
-{
-    LOG(LS_INFO) << __FUNCTION__;
-
-    // Travel through /dev/video [0-63]
-    uint32_t count = 0;
-    char device[20];
-    int fd = -1;
-    bool found = false;
-    for (int n = 0; n < 64; n++)
-    {
-        sprintf(device, "/dev/video%d", n);
-        if ((fd = open(device, O_RDONLY)) != -1)
-        {
-            if (count == deviceNumber) {
-                // Found the device
-                found = true;
-                break;
-            } else {
-                close(fd);
-                count++;
-            }
-        }
-    }
-
-    if (!found)
-        return -1;
-
-    // query device capabilities
-    struct v4l2_capability cap;
-    if (ioctl(fd, VIDIOC_QUERYCAP, &cap) < 0)
-    {
-        LOG(LS_INFO) << "error in querying the device capability for device "
-                     << device << ". errno = " << errno;
-        close(fd);
-        return -1;
-    }
-
-    close(fd);
-
-    char cameraName[64];
-    memset(deviceNameUTF8, 0, deviceNameLength);
-    memcpy(cameraName, cap.card, sizeof(cap.card));
-
-    if (deviceNameLength >= strlen(cameraName))
-    {
-        memcpy(deviceNameUTF8, cameraName, strlen(cameraName));
-    }
-    else
-    {
-        LOG(LS_INFO) << "buffer passed is too small";
-        return -1;
-    }
-
-    if (cap.bus_info[0] != 0) // may not available in all drivers
-    {
-        // copy device id
-        if (deviceUniqueIdUTF8Length >= strlen((const char*) cap.bus_info))
-        {
-            memset(deviceUniqueIdUTF8, 0, deviceUniqueIdUTF8Length);
-            memcpy(deviceUniqueIdUTF8, cap.bus_info,
-                   strlen((const char*) cap.bus_info));
-        }
-        else
-        {
-            LOG(LS_INFO) << "buffer passed is too small";
-            return -1;
-        }
-    }
-
-    return 0;
-}
-
-int32_t DeviceInfoLinux::CreateCapabilityMap(
-                                        const char* deviceUniqueIdUTF8)
-{
-    int fd;
-    char device[32];
-    bool found = false;
-
-    const int32_t deviceUniqueIdUTF8Length =
-                            (int32_t) strlen((char*) deviceUniqueIdUTF8);
-    if (deviceUniqueIdUTF8Length > kVideoCaptureUniqueNameLength)
-    {
-        LOG(LS_INFO) << "Device name too long";
-        return -1;
-    }
-    LOG(LS_INFO) << "CreateCapabilityMap called for device "
-                 << deviceUniqueIdUTF8;
-
-    /* detect /dev/video [0-63] entries */
-    for (int n = 0; n < 64; ++n)
-    {
-        sprintf(device, "/dev/video%d", n);
-        fd = open(device, O_RDONLY);
-        if (fd == -1)
-          continue;
-
-        // query device capabilities
-        struct v4l2_capability cap;
-        if (ioctl(fd, VIDIOC_QUERYCAP, &cap) == 0)
-        {
-            if (cap.bus_info[0] != 0)
-            {
-                if (strncmp((const char*) cap.bus_info,
-                            (const char*) deviceUniqueIdUTF8,
-                            strlen((const char*) deviceUniqueIdUTF8)) == 0) //match with device id
-                {
-                    found = true;
-                    break; // fd matches with device unique id supplied
-                }
-            }
-            else //match for device name
-            {
-                if (IsDeviceNameMatches((const char*) cap.card,
-                                        (const char*) deviceUniqueIdUTF8))
-                {
-                    found = true;
-                    break;
-                }
-            }
-        }
-        close(fd); // close since this is not the matching device
-    }
-
-    if (!found)
-    {
-        LOG(LS_INFO) << "no matching device found";
-        return -1;
-    }
-
-    // now fd will point to the matching device
-    // reset old capability list.
-    _captureCapabilities.clear();
-
-    int size = FillCapabilities(fd);
-    close(fd);
-
-    // Store the new used device name
-    _lastUsedDeviceNameLength = deviceUniqueIdUTF8Length;
-    _lastUsedDeviceName = (char*) realloc(_lastUsedDeviceName,
-                                                   _lastUsedDeviceNameLength + 1);
-    memcpy(_lastUsedDeviceName, deviceUniqueIdUTF8, _lastUsedDeviceNameLength + 1);
-
-    LOG(LS_INFO) << "CreateCapabilityMap " << _captureCapabilities.size();
-
-    return size;
-}
-
-bool DeviceInfoLinux::IsDeviceNameMatches(const char* name,
-                                          const char* deviceUniqueIdUTF8)
-{
-    if (strncmp(deviceUniqueIdUTF8, name, strlen(name)) == 0)
-            return true;
-    return false;
-}
-
-int32_t DeviceInfoLinux::FillCapabilities(int fd)
-{
-
-    // set image format
-    struct v4l2_format video_fmt;
-    memset(&video_fmt, 0, sizeof(struct v4l2_format));
-
-    video_fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
-    video_fmt.fmt.pix.sizeimage = 0;
-
-    int totalFmts = 4;
-    unsigned int videoFormats[] = {
-        V4L2_PIX_FMT_MJPEG,
-        V4L2_PIX_FMT_YUV420,
-        V4L2_PIX_FMT_YUYV,
-        V4L2_PIX_FMT_UYVY };
-
-    int sizes = 13;
-    unsigned int size[][2] = { { 128, 96 }, { 160, 120 }, { 176, 144 },
-                               { 320, 240 }, { 352, 288 }, { 640, 480 },
-                               { 704, 576 }, { 800, 600 }, { 960, 720 },
-                               { 1280, 720 }, { 1024, 768 }, { 1440, 1080 },
-                               { 1920, 1080 } };
-
-    int index = 0;
-    for (int fmts = 0; fmts < totalFmts; fmts++)
-    {
-        for (int i = 0; i < sizes; i++)
-        {
-            video_fmt.fmt.pix.pixelformat = videoFormats[fmts];
-            video_fmt.fmt.pix.width = size[i][0];
-            video_fmt.fmt.pix.height = size[i][1];
-
-            if (ioctl(fd, VIDIOC_TRY_FMT, &video_fmt) >= 0)
-            {
-                if ((video_fmt.fmt.pix.width == size[i][0])
-                    && (video_fmt.fmt.pix.height == size[i][1]))
-                {
-                    VideoCaptureCapability cap;
-                    cap.width = video_fmt.fmt.pix.width;
-                    cap.height = video_fmt.fmt.pix.height;
-                    if (videoFormats[fmts] == V4L2_PIX_FMT_YUYV)
-                    {
-                      cap.videoType = VideoType::kYUY2;
-                    }
-                    else if (videoFormats[fmts] == V4L2_PIX_FMT_YUV420)
-                    {
-                      cap.videoType = VideoType::kI420;
-                    }
-                    else if (videoFormats[fmts] == V4L2_PIX_FMT_MJPEG)
-                    {
-                      cap.videoType = VideoType::kMJPEG;
-                    }
-                    else if (videoFormats[fmts] == V4L2_PIX_FMT_UYVY)
-                    {
-                      cap.videoType = VideoType::kUYVY;
-                    }
-
-                    // get fps of current camera mode
-                    // V4l2 does not have a stable method of knowing so we just guess.
-                    if (cap.width >= 800 &&
-                        cap.videoType != VideoType::kMJPEG) {
-                      cap.maxFPS = 15;
-                    }
-                    else
-                    {
-                        cap.maxFPS = 30;
-                    }
-
-                    _captureCapabilities.push_back(cap);
-                    index++;
-                    LOG(LS_VERBOSE) << "Camera capability, width:" << cap.width
-                                    << " height:" << cap.height << " type:"
-                                    << static_cast<int32_t>(cap.videoType)
-                                    << " fps:" << cap.maxFPS;
-                }
-            }
-        }
-    }
-
-    LOG(LS_INFO) << "CreateCapabilityMap " << _captureCapabilities.size();
-    return _captureCapabilities.size();
-}
-
-}  // namespace videocapturemodule
-}  // namespace webrtc
diff --git a/modules/video_capture/linux/device_info_linux.h b/modules/video_capture/linux/device_info_linux.h
deleted file mode 100644
index 80a8e77..0000000
--- a/modules/video_capture/linux/device_info_linux.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- *  Copyright (c) 2012 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_VIDEO_CAPTURE_MAIN_SOURCE_LINUX_DEVICE_INFO_LINUX_H_
-#define WEBRTC_MODULES_VIDEO_CAPTURE_MAIN_SOURCE_LINUX_DEVICE_INFO_LINUX_H_
-
-#include "webrtc/modules/video_capture/device_info_impl.h"
-#include "webrtc/modules/video_capture/video_capture_impl.h"
-
-namespace webrtc
-{
-namespace videocapturemodule
-{
-class DeviceInfoLinux: public DeviceInfoImpl
-{
-public:
-    DeviceInfoLinux();
-    virtual ~DeviceInfoLinux();
-    virtual uint32_t NumberOfDevices();
-    virtual int32_t GetDeviceName(
-        uint32_t deviceNumber,
-        char* deviceNameUTF8,
-        uint32_t deviceNameLength,
-        char* deviceUniqueIdUTF8,
-        uint32_t deviceUniqueIdUTF8Length,
-        char* productUniqueIdUTF8=0,
-        uint32_t productUniqueIdUTF8Length=0);
-    /*
-    * Fills the membervariable _captureCapabilities with capabilites for the given device name.
-    */
-    virtual int32_t CreateCapabilityMap (const char* deviceUniqueIdUTF8);
-    virtual int32_t DisplayCaptureSettingsDialogBox(
-        const char* /*deviceUniqueIdUTF8*/,
-        const char* /*dialogTitleUTF8*/,
-        void* /*parentWindow*/,
-        uint32_t /*positionX*/,
-        uint32_t /*positionY*/) { return -1;}
-    int32_t FillCapabilities(int fd);
-    int32_t Init();
-private:
-
-    bool IsDeviceNameMatches(const char* name, const char* deviceUniqueIdUTF8);
-};
-}  // namespace videocapturemodule
-}  // namespace webrtc
-#endif // WEBRTC_MODULES_VIDEO_CAPTURE_MAIN_SOURCE_LINUX_DEVICE_INFO_LINUX_H_
diff --git a/modules/video_capture/linux/video_capture_linux.cc b/modules/video_capture/linux/video_capture_linux.cc
deleted file mode 100644
index f9efc7b..0000000
--- a/modules/video_capture/linux/video_capture_linux.cc
+++ /dev/null
@@ -1,459 +0,0 @@
-/*
- *  Copyright (c) 2012 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/video_capture/linux/video_capture_linux.h"
-
-#include <errno.h>
-#include <fcntl.h>
-#include <linux/videodev2.h>
-#include <stdio.h>
-#include <string.h>
-#include <sys/ioctl.h>
-#include <sys/mman.h>
-#include <sys/stat.h>
-#include <unistd.h>
-
-#include <iostream>
-#include <new>
-
-#include "webrtc/media/base/videocommon.h"
-#include "webrtc/rtc_base/refcount.h"
-#include "webrtc/rtc_base/scoped_ref_ptr.h"
-#include "webrtc/rtc_base/logging.h"
-
-namespace webrtc {
-namespace videocapturemodule {
-rtc::scoped_refptr<VideoCaptureModule> VideoCaptureImpl::Create(
-    const char* deviceUniqueId) {
-    rtc::scoped_refptr<VideoCaptureModuleV4L2> implementation(
-        new rtc::RefCountedObject<VideoCaptureModuleV4L2>());
-
-    if (implementation->Init(deviceUniqueId) != 0)
-        return nullptr;
-
-    return implementation;
-}
-
-VideoCaptureModuleV4L2::VideoCaptureModuleV4L2()
-    : VideoCaptureImpl(),
-      _deviceId(-1),
-      _deviceFd(-1),
-      _buffersAllocatedByDevice(-1),
-      _currentWidth(-1),
-      _currentHeight(-1),
-      _currentFrameRate(-1),
-      _captureStarted(false),
-      _captureVideoType(VideoType::kI420),
-      _pool(NULL) {}
-
-int32_t VideoCaptureModuleV4L2::Init(const char* deviceUniqueIdUTF8)
-{
-    int len = strlen((const char*) deviceUniqueIdUTF8);
-    _deviceUniqueId = new (std::nothrow) char[len + 1];
-    if (_deviceUniqueId)
-    {
-        memcpy(_deviceUniqueId, deviceUniqueIdUTF8, len + 1);
-    }
-
-    int fd;
-    char device[32];
-    bool found = false;
-
-    /* detect /dev/video [0-63] entries */
-    int n;
-    for (n = 0; n < 64; n++)
-    {
-        sprintf(device, "/dev/video%d", n);
-        if ((fd = open(device, O_RDONLY)) != -1)
-        {
-            // query device capabilities
-            struct v4l2_capability cap;
-            if (ioctl(fd, VIDIOC_QUERYCAP, &cap) == 0)
-            {
-                if (cap.bus_info[0] != 0)
-                {
-                    if (strncmp((const char*) cap.bus_info,
-                                (const char*) deviceUniqueIdUTF8,
-                                strlen((const char*) deviceUniqueIdUTF8)) == 0) //match with device id
-                    {
-                        close(fd);
-                        found = true;
-                        break; // fd matches with device unique id supplied
-                    }
-                }
-            }
-            close(fd); // close since this is not the matching device
-        }
-    }
-    if (!found)
-    {
-        LOG(LS_INFO) << "no matching device found";
-        return -1;
-    }
-    _deviceId = n; //store the device id
-    return 0;
-}
-
-VideoCaptureModuleV4L2::~VideoCaptureModuleV4L2()
-{
-    StopCapture();
-    if (_deviceFd != -1)
-      close(_deviceFd);
-}
-
-int32_t VideoCaptureModuleV4L2::StartCapture(
-    const VideoCaptureCapability& capability)
-{
-    if (_captureStarted)
-    {
-      if (capability.width == _currentWidth &&
-          capability.height == _currentHeight &&
-          _captureVideoType == capability.videoType) {
-        return 0;
-        }
-        else
-        {
-            StopCapture();
-        }
-    }
-
-    rtc::CritScope cs(&_captureCritSect);
-    //first open /dev/video device
-    char device[20];
-    sprintf(device, "/dev/video%d", (int) _deviceId);
-
-    if ((_deviceFd = open(device, O_RDWR | O_NONBLOCK, 0)) < 0)
-    {
-        LOG(LS_INFO) << "error in opening " << device << " errono = " << errno;
-        return -1;
-    }
-
-    // Supported video formats in preferred order.
-    // If the requested resolution is larger than VGA, we prefer MJPEG. Go for
-    // I420 otherwise.
-    const int nFormats = 5;
-    unsigned int fmts[nFormats];
-    if (capability.width > 640 || capability.height > 480) {
-        fmts[0] = V4L2_PIX_FMT_MJPEG;
-        fmts[1] = V4L2_PIX_FMT_YUV420;
-        fmts[2] = V4L2_PIX_FMT_YUYV;
-        fmts[3] = V4L2_PIX_FMT_UYVY;
-        fmts[4] = V4L2_PIX_FMT_JPEG;
-    } else {
-        fmts[0] = V4L2_PIX_FMT_YUV420;
-        fmts[1] = V4L2_PIX_FMT_YUYV;
-        fmts[2] = V4L2_PIX_FMT_UYVY;
-        fmts[3] = V4L2_PIX_FMT_MJPEG;
-        fmts[4] = V4L2_PIX_FMT_JPEG;
-    }
-
-    // Enumerate image formats.
-    struct v4l2_fmtdesc fmt;
-    int fmtsIdx = nFormats;
-    memset(&fmt, 0, sizeof(fmt));
-    fmt.index = 0;
-    fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
-    LOG(LS_INFO) << "Video Capture enumerats supported image formats:";
-    while (ioctl(_deviceFd, VIDIOC_ENUM_FMT, &fmt) == 0) {
-        LOG(LS_INFO) << "  { pixelformat = "
-                     << cricket::GetFourccName(fmt.pixelformat)
-                     << ", description = '" << fmt.description << "' }";
-        // Match the preferred order.
-        for (int i = 0; i < nFormats; i++) {
-            if (fmt.pixelformat == fmts[i] && i < fmtsIdx)
-                fmtsIdx = i;
-        }
-        // Keep enumerating.
-        fmt.index++;
-    }
-
-    if (fmtsIdx == nFormats)
-    {
-        LOG(LS_INFO) << "no supporting video formats found";
-        return -1;
-    } else {
-        LOG(LS_INFO) << "We prefer format "
-                     << cricket::GetFourccName(fmts[fmtsIdx]);
-    }
-
-    struct v4l2_format video_fmt;
-    memset(&video_fmt, 0, sizeof(struct v4l2_format));
-    video_fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
-    video_fmt.fmt.pix.sizeimage = 0;
-    video_fmt.fmt.pix.width = capability.width;
-    video_fmt.fmt.pix.height = capability.height;
-    video_fmt.fmt.pix.pixelformat = fmts[fmtsIdx];
-
-    if (video_fmt.fmt.pix.pixelformat == V4L2_PIX_FMT_YUYV)
-      _captureVideoType = VideoType::kYUY2;
-    else if (video_fmt.fmt.pix.pixelformat == V4L2_PIX_FMT_YUV420)
-      _captureVideoType = VideoType::kI420;
-    else if (video_fmt.fmt.pix.pixelformat == V4L2_PIX_FMT_UYVY)
-      _captureVideoType = VideoType::kUYVY;
-    else if (video_fmt.fmt.pix.pixelformat == V4L2_PIX_FMT_MJPEG ||
-             video_fmt.fmt.pix.pixelformat == V4L2_PIX_FMT_JPEG)
-      _captureVideoType = VideoType::kMJPEG;
-
-    //set format and frame size now
-    if (ioctl(_deviceFd, VIDIOC_S_FMT, &video_fmt) < 0)
-    {
-        LOG(LS_INFO) << "error in VIDIOC_S_FMT, errno = " << errno;
-        return -1;
-    }
-
-    // initialize current width and height
-    _currentWidth = video_fmt.fmt.pix.width;
-    _currentHeight = video_fmt.fmt.pix.height;
-
-    // Trying to set frame rate, before check driver capability.
-    bool driver_framerate_support = true;
-    struct v4l2_streamparm streamparms;
-    memset(&streamparms, 0, sizeof(streamparms));
-    streamparms.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
-    if (ioctl(_deviceFd, VIDIOC_G_PARM, &streamparms) < 0) {
-        LOG(LS_INFO) << "error in VIDIOC_G_PARM errno = " << errno;
-        driver_framerate_support = false;
-      // continue
-    } else {
-      // check the capability flag is set to V4L2_CAP_TIMEPERFRAME.
-      if (streamparms.parm.capture.capability & V4L2_CAP_TIMEPERFRAME) {
-        // driver supports the feature. Set required framerate.
-        memset(&streamparms, 0, sizeof(streamparms));
-        streamparms.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
-        streamparms.parm.capture.timeperframe.numerator = 1;
-        streamparms.parm.capture.timeperframe.denominator = capability.maxFPS;
-        if (ioctl(_deviceFd, VIDIOC_S_PARM, &streamparms) < 0) {
-          LOG(LS_INFO) << "Failed to set the framerate. errno=" << errno;
-          driver_framerate_support = false;
-        } else {
-          _currentFrameRate = capability.maxFPS;
-        }
-      }
-    }
-    // If driver doesn't support framerate control, need to hardcode.
-    // Hardcoding the value based on the frame size.
-    if (!driver_framerate_support) {
-      if (_currentWidth >= 800 && _captureVideoType != VideoType::kMJPEG) {
-        _currentFrameRate = 15;
-      } else {
-        _currentFrameRate = 30;
-      }
-    }
-
-    if (!AllocateVideoBuffers())
-    {
-        LOG(LS_INFO) << "failed to allocate video capture buffers";
-        return -1;
-    }
-
-    //start capture thread;
-    if (!_captureThread)
-    {
-        _captureThread.reset(new rtc::PlatformThread(
-            VideoCaptureModuleV4L2::CaptureThread, this, "CaptureThread"));
-        _captureThread->Start();
-        _captureThread->SetPriority(rtc::kHighPriority);
-    }
-
-    // Needed to start UVC camera - from the uvcview application
-    enum v4l2_buf_type type;
-    type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
-    if (ioctl(_deviceFd, VIDIOC_STREAMON, &type) == -1)
-    {
-        LOG(LS_INFO) << "Failed to turn on stream";
-        return -1;
-    }
-
-    _captureStarted = true;
-    return 0;
-}
-
-int32_t VideoCaptureModuleV4L2::StopCapture()
-{
-    if (_captureThread) {
-        // Make sure the capture thread stop stop using the critsect.
-        _captureThread->Stop();
-        _captureThread.reset();
-    }
-
-    rtc::CritScope cs(&_captureCritSect);
-    if (_captureStarted)
-    {
-        _captureStarted = false;
-
-        DeAllocateVideoBuffers();
-        close(_deviceFd);
-        _deviceFd = -1;
-    }
-
-    return 0;
-}
-
-//critical section protected by the caller
-
-bool VideoCaptureModuleV4L2::AllocateVideoBuffers()
-{
-    struct v4l2_requestbuffers rbuffer;
-    memset(&rbuffer, 0, sizeof(v4l2_requestbuffers));
-
-    rbuffer.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
-    rbuffer.memory = V4L2_MEMORY_MMAP;
-    rbuffer.count = kNoOfV4L2Bufffers;
-
-    if (ioctl(_deviceFd, VIDIOC_REQBUFS, &rbuffer) < 0)
-    {
-        LOG(LS_INFO) << "Could not get buffers from device. errno = " << errno;
-        return false;
-    }
-
-    if (rbuffer.count > kNoOfV4L2Bufffers)
-        rbuffer.count = kNoOfV4L2Bufffers;
-
-    _buffersAllocatedByDevice = rbuffer.count;
-
-    //Map the buffers
-    _pool = new Buffer[rbuffer.count];
-
-    for (unsigned int i = 0; i < rbuffer.count; i++)
-    {
-        struct v4l2_buffer buffer;
-        memset(&buffer, 0, sizeof(v4l2_buffer));
-        buffer.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
-        buffer.memory = V4L2_MEMORY_MMAP;
-        buffer.index = i;
-
-        if (ioctl(_deviceFd, VIDIOC_QUERYBUF, &buffer) < 0)
-        {
-            return false;
-        }
-
-        _pool[i].start = mmap(NULL, buffer.length, PROT_READ | PROT_WRITE, MAP_SHARED,
-                              _deviceFd, buffer.m.offset);
-
-        if (MAP_FAILED == _pool[i].start)
-        {
-            for (unsigned int j = 0; j < i; j++)
-                munmap(_pool[j].start, _pool[j].length);
-            return false;
-        }
-
-        _pool[i].length = buffer.length;
-
-        if (ioctl(_deviceFd, VIDIOC_QBUF, &buffer) < 0)
-        {
-            return false;
-        }
-    }
-    return true;
-}
-
-bool VideoCaptureModuleV4L2::DeAllocateVideoBuffers()
-{
-    // unmap buffers
-    for (int i = 0; i < _buffersAllocatedByDevice; i++)
-        munmap(_pool[i].start, _pool[i].length);
-
-    delete[] _pool;
-
-    // turn off stream
-    enum v4l2_buf_type type;
-    type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
-    if (ioctl(_deviceFd, VIDIOC_STREAMOFF, &type) < 0)
-    {
-        LOG(LS_INFO) << "VIDIOC_STREAMOFF error. errno: " << errno;
-    }
-
-    return true;
-}
-
-bool VideoCaptureModuleV4L2::CaptureStarted()
-{
-    return _captureStarted;
-}
-
-bool VideoCaptureModuleV4L2::CaptureThread(void* obj)
-{
-    return static_cast<VideoCaptureModuleV4L2*> (obj)->CaptureProcess();
-}
-bool VideoCaptureModuleV4L2::CaptureProcess()
-{
-    int retVal = 0;
-    fd_set rSet;
-    struct timeval timeout;
-
-    rtc::CritScope cs(&_captureCritSect);
-
-    FD_ZERO(&rSet);
-    FD_SET(_deviceFd, &rSet);
-    timeout.tv_sec = 1;
-    timeout.tv_usec = 0;
-
-    retVal = select(_deviceFd + 1, &rSet, NULL, NULL, &timeout);
-    if (retVal < 0 && errno != EINTR) // continue if interrupted
-    {
-        // select failed
-        return false;
-    }
-    else if (retVal == 0)
-    {
-        // select timed out
-        return true;
-    }
-    else if (!FD_ISSET(_deviceFd, &rSet))
-    {
-        // not event on camera handle
-        return true;
-    }
-
-    if (_captureStarted)
-    {
-        struct v4l2_buffer buf;
-        memset(&buf, 0, sizeof(struct v4l2_buffer));
-        buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
-        buf.memory = V4L2_MEMORY_MMAP;
-        // dequeue a buffer - repeat until dequeued properly!
-        while (ioctl(_deviceFd, VIDIOC_DQBUF, &buf) < 0)
-        {
-            if (errno != EINTR)
-            {
-                LOG(LS_INFO) << "could not sync on a buffer on device "
-                             << strerror(errno);
-                return true;
-            }
-        }
-        VideoCaptureCapability frameInfo;
-        frameInfo.width = _currentWidth;
-        frameInfo.height = _currentHeight;
-        frameInfo.videoType = _captureVideoType;
-
-        // convert to to I420 if needed
-        IncomingFrame((unsigned char*) _pool[buf.index].start,
-                      buf.bytesused, frameInfo);
-        // enqueue the buffer again
-        if (ioctl(_deviceFd, VIDIOC_QBUF, &buf) == -1)
-        {
-            LOG(LS_INFO) << "Failed to enqueue capture buffer";
-        }
-    }
-    usleep(0);
-    return true;
-}
-
-int32_t VideoCaptureModuleV4L2::CaptureSettings(VideoCaptureCapability& settings)
-{
-    settings.width = _currentWidth;
-    settings.height = _currentHeight;
-    settings.maxFPS = _currentFrameRate;
-    settings.videoType = _captureVideoType;
-
-    return 0;
-}
-}  // namespace videocapturemodule
-}  // namespace webrtc
diff --git a/modules/video_capture/linux/video_capture_linux.h b/modules/video_capture/linux/video_capture_linux.h
deleted file mode 100644
index dc50059..0000000
--- a/modules/video_capture/linux/video_capture_linux.h
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- *  Copyright (c) 2012 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_VIDEO_CAPTURE_MAIN_SOURCE_LINUX_VIDEO_CAPTURE_LINUX_H_
-#define WEBRTC_MODULES_VIDEO_CAPTURE_MAIN_SOURCE_LINUX_VIDEO_CAPTURE_LINUX_H_
-
-#include <memory>
-
-#include "webrtc/common_types.h"
-#include "webrtc/modules/video_capture/video_capture_impl.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/platform_thread.h"
-
-namespace webrtc
-{
-namespace videocapturemodule
-{
-class VideoCaptureModuleV4L2: public VideoCaptureImpl
-{
-public:
-    VideoCaptureModuleV4L2();
-    virtual ~VideoCaptureModuleV4L2();
-    virtual int32_t Init(const char* deviceUniqueId);
-    virtual int32_t StartCapture(const VideoCaptureCapability& capability);
-    virtual int32_t StopCapture();
-    virtual bool CaptureStarted();
-    virtual int32_t CaptureSettings(VideoCaptureCapability& settings);
-
-private:
-    enum {kNoOfV4L2Bufffers=4};
-
-    static bool CaptureThread(void*);
-    bool CaptureProcess();
-    bool AllocateVideoBuffers();
-    bool DeAllocateVideoBuffers();
-
-    // TODO(pbos): Stop using unique_ptr and resetting the thread.
-    std::unique_ptr<rtc::PlatformThread> _captureThread;
-    rtc::CriticalSection _captureCritSect;
-
-    int32_t _deviceId;
-    int32_t _deviceFd;
-
-    int32_t _buffersAllocatedByDevice;
-    int32_t _currentWidth;
-    int32_t _currentHeight;
-    int32_t _currentFrameRate;
-    bool _captureStarted;
-    VideoType _captureVideoType;
-    struct Buffer
-    {
-        void *start;
-        size_t length;
-    };
-    Buffer *_pool;
-};
-}  // namespace videocapturemodule
-}  // namespace webrtc
-
-#endif // WEBRTC_MODULES_VIDEO_CAPTURE_MAIN_SOURCE_LINUX_VIDEO_CAPTURE_LINUX_H_
diff --git a/modules/video_capture/objc/device_info.h b/modules/video_capture/objc/device_info.h
deleted file mode 100644
index 67d5877..0000000
--- a/modules/video_capture/objc/device_info.h
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- *  Copyright (c) 2013 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_VIDEO_CAPTURE_OBJC_DEVICE_INFO_H_
-#define WEBRTC_MODULES_VIDEO_CAPTURE_OBJC_DEVICE_INFO_H_
-
-#include "webrtc/modules/video_capture/device_info_impl.h"
-
-#include <map>
-#include <string>
-
-namespace webrtc {
-namespace videocapturemodule {
-class DeviceInfoIos : public DeviceInfoImpl {
- public:
-  DeviceInfoIos();
-  virtual ~DeviceInfoIos();
-
-  // Implementation of DeviceInfoImpl.
-  int32_t Init() override;
-  uint32_t NumberOfDevices() override;
-  int32_t GetDeviceName(uint32_t deviceNumber,
-                        char* deviceNameUTF8,
-                        uint32_t deviceNameLength,
-                        char* deviceUniqueIdUTF8,
-                        uint32_t deviceUniqueIdUTF8Length,
-                        char* productUniqueIdUTF8 = 0,
-                        uint32_t productUniqueIdUTF8Length = 0) override;
-
-  int32_t NumberOfCapabilities(const char* deviceUniqueIdUTF8) override;
-
-  int32_t GetCapability(const char* deviceUniqueIdUTF8,
-                        const uint32_t deviceCapabilityNumber,
-                        VideoCaptureCapability& capability) override;
-
-  int32_t DisplayCaptureSettingsDialogBox(const char* deviceUniqueIdUTF8,
-                                          const char* dialogTitleUTF8,
-                                          void* parentWindow,
-                                          uint32_t positionX,
-                                          uint32_t positionY) override;
-
-  int32_t GetOrientation(const char* deviceUniqueIdUTF8,
-                         VideoRotation& orientation) override;
-
-  int32_t CreateCapabilityMap(const char* device_unique_id_utf8) override;
-
- private:
-  std::map<std::string, VideoCaptureCapabilities> _capabilitiesMap;
-};
-
-}  // namespace videocapturemodule
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_VIDEO_CAPTURE_OBJC_DEVICE_INFO_H_
diff --git a/modules/video_capture/objc/device_info.mm b/modules/video_capture/objc/device_info.mm
deleted file mode 100644
index 85733d1..0000000
--- a/modules/video_capture/objc/device_info.mm
+++ /dev/null
@@ -1,169 +0,0 @@
-/*
- *  Copyright (c) 2013 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.
- */
-
-#if !defined(__has_feature) || !__has_feature(objc_arc)
-#error "This file requires ARC support."
-#endif
-
-#include <AVFoundation/AVFoundation.h>
-
-#include <string>
-
-#include "webrtc/modules/video_capture/objc/device_info.h"
-#include "webrtc/modules/video_capture/objc/device_info_objc.h"
-#include "webrtc/modules/video_capture/video_capture_impl.h"
-#include "webrtc/rtc_base/logging.h"
-
-using namespace webrtc;
-using namespace videocapturemodule;
-
-static NSArray* camera_presets = @[
-  AVCaptureSessionPreset352x288, AVCaptureSessionPreset640x480,
-  AVCaptureSessionPreset1280x720
-];
-
-#define IOS_UNSUPPORTED()                                                 \
-  LOG(LS_ERROR) << __FUNCTION__ << " is not supported on the iOS platform."; \
-  return -1;
-
-VideoCaptureModule::DeviceInfo* VideoCaptureImpl::CreateDeviceInfo() {
-  return new DeviceInfoIos();
-}
-
-DeviceInfoIos::DeviceInfoIos() {
-  this->Init();
-}
-
-DeviceInfoIos::~DeviceInfoIos() {}
-
-int32_t DeviceInfoIos::Init() {
-  // Fill in all device capabilities.
-
-  int deviceCount = [DeviceInfoIosObjC captureDeviceCount];
-
-  for (int i = 0; i < deviceCount; i++) {
-    AVCaptureDevice* avDevice = [DeviceInfoIosObjC captureDeviceForIndex:i];
-    VideoCaptureCapabilities capabilityVector;
-
-    for (NSString* preset in camera_presets) {
-      BOOL support = [avDevice supportsAVCaptureSessionPreset:preset];
-      if (support) {
-        VideoCaptureCapability capability =
-            [DeviceInfoIosObjC capabilityForPreset:preset];
-        capabilityVector.push_back(capability);
-      }
-    }
-
-    char deviceNameUTF8[256];
-    char deviceId[256];
-    this->GetDeviceName(i, deviceNameUTF8, 256, deviceId, 256);
-    std::string deviceIdCopy(deviceId);
-    std::pair<std::string, VideoCaptureCapabilities> mapPair =
-        std::pair<std::string, VideoCaptureCapabilities>(deviceIdCopy,
-                                                         capabilityVector);
-    _capabilitiesMap.insert(mapPair);
-  }
-
-  return 0;
-}
-
-uint32_t DeviceInfoIos::NumberOfDevices() {
-  return [DeviceInfoIosObjC captureDeviceCount];
-}
-
-int32_t DeviceInfoIos::GetDeviceName(uint32_t deviceNumber,
-                                     char* deviceNameUTF8,
-                                     uint32_t deviceNameUTF8Length,
-                                     char* deviceUniqueIdUTF8,
-                                     uint32_t deviceUniqueIdUTF8Length,
-                                     char* productUniqueIdUTF8,
-                                     uint32_t productUniqueIdUTF8Length) {
-  NSString* deviceName = [DeviceInfoIosObjC deviceNameForIndex:deviceNumber];
-
-  NSString* deviceUniqueId =
-      [DeviceInfoIosObjC deviceUniqueIdForIndex:deviceNumber];
-
-  strncpy(deviceNameUTF8, [deviceName UTF8String], deviceNameUTF8Length);
-  deviceNameUTF8[deviceNameUTF8Length - 1] = '\0';
-
-  strncpy(deviceUniqueIdUTF8, deviceUniqueId.UTF8String, deviceUniqueIdUTF8Length);
-  deviceUniqueIdUTF8[deviceUniqueIdUTF8Length - 1] = '\0';
-
-  if (productUniqueIdUTF8) {
-    productUniqueIdUTF8[0] = '\0';
-  }
-
-  return 0;
-}
-
-int32_t DeviceInfoIos::NumberOfCapabilities(const char* deviceUniqueIdUTF8) {
-  int32_t numberOfCapabilities = 0;
-  std::string deviceUniqueId(deviceUniqueIdUTF8);
-  std::map<std::string, VideoCaptureCapabilities>::iterator it =
-      _capabilitiesMap.find(deviceUniqueId);
-
-  if (it != _capabilitiesMap.end()) {
-    numberOfCapabilities = it->second.size();
-  }
-  return numberOfCapabilities;
-}
-
-int32_t DeviceInfoIos::GetCapability(const char* deviceUniqueIdUTF8,
-                                     const uint32_t deviceCapabilityNumber,
-                                     VideoCaptureCapability& capability) {
-  std::string deviceUniqueId(deviceUniqueIdUTF8);
-  std::map<std::string, VideoCaptureCapabilities>::iterator it =
-      _capabilitiesMap.find(deviceUniqueId);
-
-  if (it != _capabilitiesMap.end()) {
-    VideoCaptureCapabilities deviceCapabilities = it->second;
-
-    if (deviceCapabilityNumber < deviceCapabilities.size()) {
-      VideoCaptureCapability cap;
-      cap = deviceCapabilities[deviceCapabilityNumber];
-      capability = cap;
-      return 0;
-    }
-  }
-
-  return -1;
-}
-
-int32_t DeviceInfoIos::DisplayCaptureSettingsDialogBox(
-    const char* deviceUniqueIdUTF8,
-    const char* dialogTitleUTF8,
-    void* parentWindow,
-    uint32_t positionX,
-    uint32_t positionY) {
-  IOS_UNSUPPORTED();
-}
-
-int32_t DeviceInfoIos::GetOrientation(const char* deviceUniqueIdUTF8,
-                                      VideoRotation& orientation) {
-  if (strcmp(deviceUniqueIdUTF8, "Front Camera") == 0) {
-    orientation = kVideoRotation_0;
-  } else {
-    orientation = kVideoRotation_90;
-  }
-  return orientation;
-}
-
-int32_t DeviceInfoIos::CreateCapabilityMap(const char* deviceUniqueIdUTF8) {
-  std::string deviceName(deviceUniqueIdUTF8);
-  std::map<std::string, std::vector<VideoCaptureCapability>>::iterator it =
-      _capabilitiesMap.find(deviceName);
-  VideoCaptureCapabilities deviceCapabilities;
-  if (it != _capabilitiesMap.end()) {
-    _captureCapabilities = it->second;
-    return 0;
-  }
-
-  return -1;
-}
diff --git a/modules/video_capture/objc/device_info_objc.h b/modules/video_capture/objc/device_info_objc.h
deleted file mode 100644
index b5db689..0000000
--- a/modules/video_capture/objc/device_info_objc.h
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- *  Copyright (c) 2013 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_VIDEO_CAPTURE_OBJC_DEVICE_INFO_OBJC_H_
-#define WEBRTC_MODULES_VIDEO_CAPTURE_OBJC_DEVICE_INFO_OBJC_H_
-
-#import <AVFoundation/AVFoundation.h>
-
-#include "webrtc/modules/video_capture/video_capture_defines.h"
-
-@interface DeviceInfoIosObjC : NSObject
-+ (int)captureDeviceCount;
-+ (AVCaptureDevice*)captureDeviceForIndex:(int)index;
-+ (AVCaptureDevice*)captureDeviceForUniqueId:(NSString*)uniqueId;
-+ (NSString*)deviceNameForIndex:(int)index;
-+ (NSString*)deviceUniqueIdForIndex:(int)index;
-+ (NSString*)deviceNameForUniqueId:(NSString*)uniqueId;
-+ (webrtc::VideoCaptureCapability)capabilityForPreset:(NSString*)preset;
-
-@end
-
-#endif  // WEBRTC_MODULES_VIDEO_CAPTURE_OBJC_DEVICE_INFO_OBJC_H_
diff --git a/modules/video_capture/objc/device_info_objc.mm b/modules/video_capture/objc/device_info_objc.mm
deleted file mode 100644
index 1db03a4..0000000
--- a/modules/video_capture/objc/device_info_objc.mm
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- *  Copyright (c) 2013 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.
- */
-
-#if !defined(__has_feature) || !__has_feature(objc_arc)
-#error "This file requires ARC support."
-#endif
-
-#import <AVFoundation/AVFoundation.h>
-
-#import "webrtc/modules/video_capture/objc/device_info_objc.h"
-#include "webrtc/modules/video_capture/video_capture_config.h"
-
-@implementation DeviceInfoIosObjC
-
-+ (int)captureDeviceCount {
-  return [[AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo] count];
-}
-
-+ (AVCaptureDevice*)captureDeviceForIndex:(int)index {
-  return [[AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo]
-      objectAtIndex:index];
-}
-
-+ (AVCaptureDevice*)captureDeviceForUniqueId:(NSString*)uniqueId {
-  for (AVCaptureDevice* device in
-       [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo]) {
-    if ([uniqueId isEqual:device.uniqueID]) {
-      return device;
-    }
-  }
-
-  return nil;
-}
-
-+ (NSString*)deviceNameForIndex:(int)index {
-  return [DeviceInfoIosObjC captureDeviceForIndex:index].localizedName;
-}
-
-+ (NSString*)deviceUniqueIdForIndex:(int)index {
-  return [DeviceInfoIosObjC captureDeviceForIndex:index].uniqueID;
-}
-
-+ (NSString*)deviceNameForUniqueId:(NSString*)uniqueId {
-  return [[AVCaptureDevice deviceWithUniqueID:uniqueId] localizedName];
-}
-
-+ (webrtc::VideoCaptureCapability)capabilityForPreset:(NSString*)preset {
-  webrtc::VideoCaptureCapability capability;
-
-  // TODO(tkchin): Maybe query AVCaptureDevice for supported formats, and
-  // then get the dimensions / frame rate from each supported format
-  if ([preset isEqualToString:AVCaptureSessionPreset352x288]) {
-    capability.width = 352;
-    capability.height = 288;
-    capability.maxFPS = 30;
-    capability.videoType = webrtc::VideoType::kNV12;
-    capability.interlaced = false;
-  } else if ([preset isEqualToString:AVCaptureSessionPreset640x480]) {
-    capability.width = 640;
-    capability.height = 480;
-    capability.maxFPS = 30;
-    capability.videoType = webrtc::VideoType::kNV12;
-    capability.interlaced = false;
-  } else if ([preset isEqualToString:AVCaptureSessionPreset1280x720]) {
-    capability.width = 1280;
-    capability.height = 720;
-    capability.maxFPS = 30;
-    capability.videoType = webrtc::VideoType::kNV12;
-    capability.interlaced = false;
-  }
-
-  return capability;
-}
-
-@end
diff --git a/modules/video_capture/objc/rtc_video_capture_objc.h b/modules/video_capture/objc/rtc_video_capture_objc.h
deleted file mode 100644
index 71f8d8e..0000000
--- a/modules/video_capture/objc/rtc_video_capture_objc.h
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- *  Copyright (c) 2013 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_VIDEO_CAPTURE_OBJC_RTC_VIDEO_CAPTURE_OBJC_H_
-#define WEBRTC_MODULES_VIDEO_CAPTURE_OBJC_RTC_VIDEO_CAPTURE_OBJC_H_
-
-#import <Foundation/Foundation.h>
-#ifdef WEBRTC_IOS
-#import <UIKit/UIKit.h>
-#endif
-
-#include "webrtc/modules/video_capture/objc/video_capture.h"
-
-// The following class listens to a notification with name:
-// 'StatusBarOrientationDidChange'.
-// This notification must be posted in order for the capturer to reflect the
-// orientation change in video w.r.t. the application orientation.
-@interface RTCVideoCaptureIosObjC
-    : NSObject<AVCaptureVideoDataOutputSampleBufferDelegate>
-
-@property webrtc::VideoRotation frameRotation;
-
-// custom initializer. Instance of VideoCaptureIos is needed
-// for callback purposes.
-// default init methods have been overridden to return nil.
-- (id)initWithOwner:(webrtc::videocapturemodule::VideoCaptureIos*)owner;
-- (BOOL)setCaptureDeviceByUniqueId:(NSString*)uniqueId;
-- (BOOL)startCaptureWithCapability:
-    (const webrtc::VideoCaptureCapability&)capability;
-- (BOOL)stopCapture;
-
-@end
-#endif  // WEBRTC_MODULES_VIDEO_CAPTURE_OBJC_RTC_VIDEO_CAPTURE_OBJC_H_
diff --git a/modules/video_capture/objc/rtc_video_capture_objc.mm b/modules/video_capture/objc/rtc_video_capture_objc.mm
deleted file mode 100644
index 0bd7a4a..0000000
--- a/modules/video_capture/objc/rtc_video_capture_objc.mm
+++ /dev/null
@@ -1,379 +0,0 @@
-/*
- *  Copyright (c) 2013 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.
- */
-
-#if !defined(__has_feature) || !__has_feature(objc_arc)
-#error "This file requires ARC support."
-#endif
-
-#import <AVFoundation/AVFoundation.h>
-#ifdef WEBRTC_IOS
-#import <UIKit/UIKit.h>
-#endif
-
-#import "webrtc/modules/video_capture/objc/device_info_objc.h"
-#import "webrtc/modules/video_capture/objc/rtc_video_capture_objc.h"
-
-#include "webrtc/rtc_base/logging.h"
-
-using namespace webrtc;
-using namespace webrtc::videocapturemodule;
-
-@interface RTCVideoCaptureIosObjC (hidden)
-- (int)changeCaptureInputWithName:(NSString*)captureDeviceName;
-@end
-
-@implementation RTCVideoCaptureIosObjC {
-  webrtc::videocapturemodule::VideoCaptureIos* _owner;
-  webrtc::VideoCaptureCapability _capability;
-  AVCaptureSession* _captureSession;
-  BOOL _orientationHasChanged;
-  AVCaptureConnection* _connection;
-  BOOL _captureChanging;  // Guarded by _captureChangingCondition.
-  NSCondition* _captureChangingCondition;
-}
-
-@synthesize frameRotation = _framRotation;
-
-- (id)initWithOwner:(VideoCaptureIos*)owner {
-  if (self == [super init]) {
-    _owner = owner;
-    _captureSession = [[AVCaptureSession alloc] init];
-#if defined(WEBRTC_IOS)
-    _captureSession.usesApplicationAudioSession = NO;
-#endif
-    _captureChanging = NO;
-    _captureChangingCondition = [[NSCondition alloc] init];
-
-    if (!_captureSession || !_captureChangingCondition) {
-      return nil;
-    }
-
-    // create and configure a new output (using callbacks)
-    AVCaptureVideoDataOutput* captureOutput =
-        [[AVCaptureVideoDataOutput alloc] init];
-    NSString* key = (NSString*)kCVPixelBufferPixelFormatTypeKey;
-
-    NSNumber* val = [NSNumber
-        numberWithUnsignedInt:kCVPixelFormatType_420YpCbCr8BiPlanarFullRange];
-    NSDictionary* videoSettings =
-        [NSDictionary dictionaryWithObject:val forKey:key];
-    captureOutput.videoSettings = videoSettings;
-
-    // add new output
-    if ([_captureSession canAddOutput:captureOutput]) {
-      [_captureSession addOutput:captureOutput];
-    } else {
-      LOG(LS_ERROR) << __FUNCTION__
-                    << ": Could not add output to AVCaptureSession";
-    }
-
-#ifdef WEBRTC_IOS
-    [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
-
-    NSNotificationCenter* notify = [NSNotificationCenter defaultCenter];
-    [notify addObserver:self
-               selector:@selector(onVideoError:)
-                   name:AVCaptureSessionRuntimeErrorNotification
-                 object:_captureSession];
-    [notify addObserver:self
-               selector:@selector(deviceOrientationDidChange:)
-                   name:UIDeviceOrientationDidChangeNotification
-                 object:nil];
-#endif
-  }
-
-  return self;
-}
-
-- (void)directOutputToSelf {
-  [[self currentOutput]
-      setSampleBufferDelegate:self
-                        queue:dispatch_get_global_queue(
-                                  DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)];
-}
-
-- (void)directOutputToNil {
-  [[self currentOutput] setSampleBufferDelegate:nil queue:NULL];
-}
-
-- (void)deviceOrientationDidChange:(NSNotification*)notification {
-  _orientationHasChanged = YES;
-  [self setRelativeVideoOrientation];
-}
-
-- (void)dealloc {
-  [[NSNotificationCenter defaultCenter] removeObserver:self];
-}
-
-- (BOOL)setCaptureDeviceByUniqueId:(NSString*)uniqueId {
-  [self waitForCaptureChangeToFinish];
-  // check to see if the camera is already set
-  if (_captureSession) {
-    NSArray* currentInputs = [NSArray arrayWithArray:[_captureSession inputs]];
-    if ([currentInputs count] > 0) {
-      AVCaptureDeviceInput* currentInput = [currentInputs objectAtIndex:0];
-      if ([uniqueId isEqualToString:[currentInput.device localizedName]]) {
-        return YES;
-      }
-    }
-  }
-
-  return [self changeCaptureInputByUniqueId:uniqueId];
-}
-
-- (BOOL)startCaptureWithCapability:(const VideoCaptureCapability&)capability {
-  [self waitForCaptureChangeToFinish];
-  if (!_captureSession) {
-    return NO;
-  }
-
-  // check limits of the resolution
-  if (capability.maxFPS < 0 || capability.maxFPS > 60) {
-    return NO;
-  }
-
-  if ([_captureSession canSetSessionPreset:AVCaptureSessionPreset1280x720]) {
-    if (capability.width > 1280 || capability.height > 720) {
-      return NO;
-    }
-  } else if ([_captureSession
-                 canSetSessionPreset:AVCaptureSessionPreset640x480]) {
-    if (capability.width > 640 || capability.height > 480) {
-      return NO;
-    }
-  } else if ([_captureSession
-                 canSetSessionPreset:AVCaptureSessionPreset352x288]) {
-    if (capability.width > 352 || capability.height > 288) {
-      return NO;
-    }
-  } else if (capability.width < 0 || capability.height < 0) {
-    return NO;
-  }
-
-  _capability = capability;
-
-  AVCaptureVideoDataOutput* currentOutput = [self currentOutput];
-  if (!currentOutput)
-    return NO;
-
-  [self directOutputToSelf];
-
-  _orientationHasChanged = NO;
-  _captureChanging = YES;
-  dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0),
-                 ^{
-                   [self startCaptureInBackgroundWithOutput:currentOutput];
-                 });
-  return YES;
-}
-
-- (AVCaptureVideoDataOutput*)currentOutput {
-  return [[_captureSession outputs] firstObject];
-}
-
-- (void)startCaptureInBackgroundWithOutput:
-    (AVCaptureVideoDataOutput*)currentOutput {
-  NSString* captureQuality =
-      [NSString stringWithString:AVCaptureSessionPresetLow];
-  if (_capability.width >= 1280 || _capability.height >= 720) {
-    captureQuality = [NSString stringWithString:AVCaptureSessionPreset1280x720];
-  } else if (_capability.width >= 640 || _capability.height >= 480) {
-    captureQuality = [NSString stringWithString:AVCaptureSessionPreset640x480];
-  } else if (_capability.width >= 352 || _capability.height >= 288) {
-    captureQuality = [NSString stringWithString:AVCaptureSessionPreset352x288];
-  }
-
-  // begin configuration for the AVCaptureSession
-  [_captureSession beginConfiguration];
-
-  // picture resolution
-  [_captureSession setSessionPreset:captureQuality];
-
-  _connection = [currentOutput connectionWithMediaType:AVMediaTypeVideo];
-  [self setRelativeVideoOrientation];
-
-  // finished configuring, commit settings to AVCaptureSession.
-  [_captureSession commitConfiguration];
-
-  [_captureSession startRunning];
-  [self signalCaptureChangeEnd];
-}
-
-- (void)setRelativeVideoOrientation {
-  if (!_connection.supportsVideoOrientation) {
-    return;
-  }
-#ifndef WEBRTC_IOS
-  _connection.videoOrientation = AVCaptureVideoOrientationLandscapeRight;
-  return;
-#else
-  switch ([UIDevice currentDevice].orientation) {
-    case UIDeviceOrientationPortrait:
-      _connection.videoOrientation = AVCaptureVideoOrientationPortrait;
-      break;
-    case UIDeviceOrientationPortraitUpsideDown:
-      _connection.videoOrientation =
-          AVCaptureVideoOrientationPortraitUpsideDown;
-      break;
-    case UIDeviceOrientationLandscapeLeft:
-      _connection.videoOrientation = AVCaptureVideoOrientationLandscapeRight;
-      break;
-    case UIDeviceOrientationLandscapeRight:
-      _connection.videoOrientation = AVCaptureVideoOrientationLandscapeLeft;
-      break;
-    case UIDeviceOrientationFaceUp:
-    case UIDeviceOrientationFaceDown:
-    case UIDeviceOrientationUnknown:
-      if (!_orientationHasChanged) {
-        _connection.videoOrientation = AVCaptureVideoOrientationPortrait;
-      }
-      break;
-  }
-#endif
-}
-
-- (void)onVideoError:(NSNotification*)notification {
-  NSLog(@"onVideoError: %@", notification);
-  // TODO(sjlee): make the specific error handling with this notification.
-  LOG(LS_ERROR) << __FUNCTION__ << ": [AVCaptureSession startRunning] error.";
-}
-
-- (BOOL)stopCapture {
-#ifdef WEBRTC_IOS
-  [[UIDevice currentDevice] endGeneratingDeviceOrientationNotifications];
-#endif
-  _orientationHasChanged = NO;
-  [self waitForCaptureChangeToFinish];
-  [self directOutputToNil];
-
-  if (!_captureSession) {
-    return NO;
-  }
-
-  _captureChanging = YES;
-  dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0),
-                 ^(void) {
-                   [self stopCaptureInBackground];
-                 });
-  return YES;
-}
-
-- (void)stopCaptureInBackground {
-  [_captureSession stopRunning];
-  [self signalCaptureChangeEnd];
-}
-
-- (BOOL)changeCaptureInputByUniqueId:(NSString*)uniqueId {
-  [self waitForCaptureChangeToFinish];
-  NSArray* currentInputs = [_captureSession inputs];
-  // remove current input
-  if ([currentInputs count] > 0) {
-    AVCaptureInput* currentInput =
-        (AVCaptureInput*)[currentInputs objectAtIndex:0];
-
-    [_captureSession removeInput:currentInput];
-  }
-
-  // Look for input device with the name requested (as our input param)
-  // get list of available capture devices
-  int captureDeviceCount = [DeviceInfoIosObjC captureDeviceCount];
-  if (captureDeviceCount <= 0) {
-    return NO;
-  }
-
-  AVCaptureDevice* captureDevice =
-      [DeviceInfoIosObjC captureDeviceForUniqueId:uniqueId];
-
-  if (!captureDevice) {
-    return NO;
-  }
-
-  // now create capture session input out of AVCaptureDevice
-  NSError* deviceError = nil;
-  AVCaptureDeviceInput* newCaptureInput =
-      [AVCaptureDeviceInput deviceInputWithDevice:captureDevice
-                                            error:&deviceError];
-
-  if (!newCaptureInput) {
-    const char* errorMessage = [[deviceError localizedDescription] UTF8String];
-
-    LOG(LS_ERROR) << __FUNCTION__ << ": deviceInputWithDevice error:"
-                  << errorMessage;
-
-    return NO;
-  }
-
-  // try to add our new capture device to the capture session
-  [_captureSession beginConfiguration];
-
-  BOOL addedCaptureInput = NO;
-  if ([_captureSession canAddInput:newCaptureInput]) {
-    [_captureSession addInput:newCaptureInput];
-    addedCaptureInput = YES;
-  } else {
-    addedCaptureInput = NO;
-  }
-
-  [_captureSession commitConfiguration];
-
-  return addedCaptureInput;
-}
-
-- (void)captureOutput:(AVCaptureOutput*)captureOutput
-    didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer
-           fromConnection:(AVCaptureConnection*)connection {
-  const int kFlags = 0;
-  CVImageBufferRef videoFrame = CMSampleBufferGetImageBuffer(sampleBuffer);
-
-  if (CVPixelBufferLockBaseAddress(videoFrame, kFlags) != kCVReturnSuccess) {
-    return;
-  }
-
-  const int kYPlaneIndex = 0;
-  const int kUVPlaneIndex = 1;
-
-  uint8_t* baseAddress =
-      (uint8_t*)CVPixelBufferGetBaseAddressOfPlane(videoFrame, kYPlaneIndex);
-  size_t yPlaneBytesPerRow =
-      CVPixelBufferGetBytesPerRowOfPlane(videoFrame, kYPlaneIndex);
-  size_t yPlaneHeight = CVPixelBufferGetHeightOfPlane(videoFrame, kYPlaneIndex);
-  size_t uvPlaneBytesPerRow =
-      CVPixelBufferGetBytesPerRowOfPlane(videoFrame, kUVPlaneIndex);
-  size_t uvPlaneHeight =
-      CVPixelBufferGetHeightOfPlane(videoFrame, kUVPlaneIndex);
-  size_t frameSize =
-      yPlaneBytesPerRow * yPlaneHeight + uvPlaneBytesPerRow * uvPlaneHeight;
-
-  VideoCaptureCapability tempCaptureCapability;
-  tempCaptureCapability.width = CVPixelBufferGetWidth(videoFrame);
-  tempCaptureCapability.height = CVPixelBufferGetHeight(videoFrame);
-  tempCaptureCapability.maxFPS = _capability.maxFPS;
-  tempCaptureCapability.videoType = VideoType::kNV12;
-
-  _owner->IncomingFrame(baseAddress, frameSize, tempCaptureCapability, 0);
-
-  CVPixelBufferUnlockBaseAddress(videoFrame, kFlags);
-}
-
-- (void)signalCaptureChangeEnd {
-  [_captureChangingCondition lock];
-  _captureChanging = NO;
-  [_captureChangingCondition signal];
-  [_captureChangingCondition unlock];
-}
-
-- (void)waitForCaptureChangeToFinish {
-  [_captureChangingCondition lock];
-  while (_captureChanging) {
-    [_captureChangingCondition wait];
-  }
-  [_captureChangingCondition unlock];
-}
-@end
diff --git a/modules/video_capture/objc/video_capture.h b/modules/video_capture/objc/video_capture.h
deleted file mode 100644
index 910455b..0000000
--- a/modules/video_capture/objc/video_capture.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- *  Copyright (c) 2013 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_VIDEO_CAPTURE_OBJC_VIDEO_CAPTURE_H_
-#define WEBRTC_MODULES_VIDEO_CAPTURE_OBJC_VIDEO_CAPTURE_H_
-
-#include "webrtc/modules/video_capture/video_capture_impl.h"
-#include "webrtc/rtc_base/scoped_ref_ptr.h"
-
-@class RTCVideoCaptureIosObjC;
-
-namespace webrtc {
-namespace videocapturemodule {
-class VideoCaptureIos : public VideoCaptureImpl {
- public:
-  VideoCaptureIos();
-  virtual ~VideoCaptureIos();
-
-  static rtc::scoped_refptr<VideoCaptureModule> Create(
-      const char* device_unique_id_utf8);
-
-  // Implementation of VideoCaptureImpl.
-  int32_t StartCapture(const VideoCaptureCapability& capability) override;
-  int32_t StopCapture() override;
-  bool CaptureStarted() override;
-  int32_t CaptureSettings(VideoCaptureCapability& settings) override;
-
- private:
-  RTCVideoCaptureIosObjC* capture_device_;
-  bool is_capturing_;
-  VideoCaptureCapability capability_;
-};
-
-}  // namespace videocapturemodule
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_VIDEO_CAPTURE_OBJC_VIDEO_CAPTURE_H_
diff --git a/modules/video_capture/objc/video_capture.mm b/modules/video_capture/objc/video_capture.mm
deleted file mode 100644
index ca5428e..0000000
--- a/modules/video_capture/objc/video_capture.mm
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- *  Copyright (c) 2013 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.
- */
-
-#if !defined(__has_feature) || !__has_feature(objc_arc)
-#error "This file requires ARC support."
-#endif
-
-#include "webrtc/modules/video_capture/objc/device_info_objc.h"
-#include "webrtc/modules/video_capture/objc/rtc_video_capture_objc.h"
-#include "webrtc/rtc_base/refcount.h"
-#include "webrtc/rtc_base/scoped_ref_ptr.h"
-
-using namespace webrtc;
-using namespace videocapturemodule;
-
-rtc::scoped_refptr<VideoCaptureModule> VideoCaptureImpl::Create(
-    const char* deviceUniqueIdUTF8) {
-  return VideoCaptureIos::Create(deviceUniqueIdUTF8);
-}
-
-VideoCaptureIos::VideoCaptureIos()
-    : is_capturing_(false) {
-  capability_.width = kDefaultWidth;
-  capability_.height = kDefaultHeight;
-  capability_.maxFPS = kDefaultFrameRate;
-  capture_device_ = nil;
-}
-
-VideoCaptureIos::~VideoCaptureIos() {
-  if (is_capturing_) {
-    [capture_device_ stopCapture];
-    capture_device_ = nil;
-  }
-}
-
-rtc::scoped_refptr<VideoCaptureModule> VideoCaptureIos::Create(
-    const char* deviceUniqueIdUTF8) {
-  if (!deviceUniqueIdUTF8[0]) {
-    return NULL;
-  }
-
-  rtc::scoped_refptr<VideoCaptureIos> capture_module(
-      new rtc::RefCountedObject<VideoCaptureIos>());
-
-  const int32_t name_length = strlen(deviceUniqueIdUTF8);
-  if (name_length > kVideoCaptureUniqueNameLength)
-    return nullptr;
-
-  capture_module->_deviceUniqueId = new char[name_length + 1];
-  strncpy(capture_module->_deviceUniqueId, deviceUniqueIdUTF8, name_length + 1);
-  capture_module->_deviceUniqueId[name_length] = '\0';
-
-  capture_module->capture_device_ =
-      [[RTCVideoCaptureIosObjC alloc] initWithOwner:capture_module];
-  if (!capture_module->capture_device_) {
-    return nullptr;
-  }
-
-  if (![capture_module->capture_device_
-          setCaptureDeviceByUniqueId:
-              [[NSString alloc] initWithCString:deviceUniqueIdUTF8
-                                       encoding:NSUTF8StringEncoding]]) {
-    return nullptr;
-  }
-  return capture_module;
-}
-
-int32_t VideoCaptureIos::StartCapture(
-    const VideoCaptureCapability& capability) {
-  capability_ = capability;
-
-  if (![capture_device_ startCaptureWithCapability:capability]) {
-    return -1;
-  }
-
-  is_capturing_ = true;
-
-  return 0;
-}
-
-int32_t VideoCaptureIos::StopCapture() {
-  if (![capture_device_ stopCapture]) {
-    return -1;
-  }
-
-  is_capturing_ = false;
-  return 0;
-}
-
-bool VideoCaptureIos::CaptureStarted() {
-  return is_capturing_;
-}
-
-int32_t VideoCaptureIos::CaptureSettings(VideoCaptureCapability& settings) {
-  settings = capability_;
-  settings.videoType = VideoType::kNV12;
-  return 0;
-}
diff --git a/modules/video_capture/test/video_capture_main_mac.mm b/modules/video_capture/test/video_capture_main_mac.mm
deleted file mode 100644
index 6d6d5c6..0000000
--- a/modules/video_capture/test/video_capture_main_mac.mm
+++ /dev/null
@@ -1,17 +0,0 @@
-/*
- *  Copyright (c) 2012 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/test/gtest.h"
-#include "webrtc/test/testsupport/mac/run_threaded_main_mac.h"
-
-int ImplementThisToRunYourTest(int argc, char** argv) {
-  testing::InitGoogleTest(&argc, argv);
-  return RUN_ALL_TESTS();
-}
diff --git a/modules/video_capture/test/video_capture_unittest.cc b/modules/video_capture/test/video_capture_unittest.cc
deleted file mode 100644
index a80039a..0000000
--- a/modules/video_capture/test/video_capture_unittest.cc
+++ /dev/null
@@ -1,421 +0,0 @@
-/*
- *  Copyright (c) 2012 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 <stdio.h>
-
-#include <map>
-#include <memory>
-#include <sstream>
-
-#include "webrtc/api/video/i420_buffer.h"
-#include "webrtc/api/video/video_frame.h"
-#include "webrtc/common_video/libyuv/include/webrtc_libyuv.h"
-#include "webrtc/modules/utility/include/process_thread.h"
-#include "webrtc/modules/video_capture/video_capture.h"
-#include "webrtc/modules/video_capture/video_capture_factory.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/scoped_ref_ptr.h"
-#include "webrtc/rtc_base/timeutils.h"
-#include "webrtc/system_wrappers/include/sleep.h"
-#include "webrtc/test/frame_utils.h"
-#include "webrtc/test/gtest.h"
-
-using webrtc::SleepMs;
-using webrtc::VideoCaptureCapability;
-using webrtc::VideoCaptureFactory;
-using webrtc::VideoCaptureModule;
-
-
-#define WAIT_(ex, timeout, res) \
-  do { \
-    res = (ex); \
-    int64_t start = rtc::TimeMillis(); \
-    while (!res && rtc::TimeMillis() < start + timeout) { \
-      SleepMs(5); \
-      res = (ex); \
-    } \
-  } while (0)
-
-#define EXPECT_TRUE_WAIT(ex, timeout) \
-  do { \
-    bool res; \
-    WAIT_(ex, timeout, res); \
-    if (!res) EXPECT_TRUE(ex); \
-  } while (0)
-
-
-static const int kTimeOut = 5000;
-static const int kTestHeight = 288;
-static const int kTestWidth = 352;
-static const int kTestFramerate = 30;
-
-class TestVideoCaptureCallback
-    : public rtc::VideoSinkInterface<webrtc::VideoFrame> {
- public:
-  TestVideoCaptureCallback() :
-        last_render_time_ms_(0),
-        incoming_frames_(0),
-        timing_warnings_(0),
-        rotate_frame_(webrtc::kVideoRotation_0) {}
-
-  ~TestVideoCaptureCallback() {
-    if (timing_warnings_ > 0)
-      printf("No of timing warnings %d\n", timing_warnings_);
-  }
-
-  void OnFrame(const webrtc::VideoFrame& videoFrame) override {
-    rtc::CritScope cs(&capture_cs_);
-    int height = videoFrame.height();
-    int width = videoFrame.width();
-#if defined(ANDROID) && ANDROID
-    // Android camera frames may be rotated depending on test device
-    // orientation.
-    EXPECT_TRUE(height == capability_.height || height == capability_.width);
-    EXPECT_TRUE(width == capability_.width || width == capability_.height);
-#else
-    EXPECT_EQ(height, capability_.height);
-    EXPECT_EQ(width, capability_.width);
-    EXPECT_EQ(rotate_frame_, videoFrame.rotation());
-#endif
-    // RenderTimstamp should be the time now.
-    EXPECT_TRUE(
-        videoFrame.render_time_ms() >= rtc::TimeMillis()-30 &&
-        videoFrame.render_time_ms() <= rtc::TimeMillis());
-
-    if ((videoFrame.render_time_ms() >
-            last_render_time_ms_ + (1000 * 1.1) / capability_.maxFPS &&
-            last_render_time_ms_ > 0) ||
-        (videoFrame.render_time_ms() <
-            last_render_time_ms_ + (1000 * 0.9) / capability_.maxFPS &&
-            last_render_time_ms_ > 0)) {
-      timing_warnings_++;
-    }
-
-    incoming_frames_++;
-    last_render_time_ms_ = videoFrame.render_time_ms();
-    last_frame_ = videoFrame.video_frame_buffer();
-  }
-
-  void SetExpectedCapability(VideoCaptureCapability capability) {
-    rtc::CritScope cs(&capture_cs_);
-    capability_= capability;
-    incoming_frames_ = 0;
-    last_render_time_ms_ = 0;
-  }
-  int incoming_frames() {
-    rtc::CritScope cs(&capture_cs_);
-    return incoming_frames_;
-  }
-
-  int timing_warnings() {
-    rtc::CritScope cs(&capture_cs_);
-    return timing_warnings_;
-  }
-  VideoCaptureCapability capability() {
-    rtc::CritScope cs(&capture_cs_);
-    return capability_;
-  }
-
-  bool CompareLastFrame(const webrtc::VideoFrame& frame) {
-    rtc::CritScope cs(&capture_cs_);
-    return webrtc::test::FrameBufsEqual(last_frame_,
-                                        frame.video_frame_buffer());
-  }
-
-  void SetExpectedCaptureRotation(webrtc::VideoRotation rotation) {
-    rtc::CritScope cs(&capture_cs_);
-    rotate_frame_ = rotation;
-  }
-
- private:
-  rtc::CriticalSection capture_cs_;
-  VideoCaptureCapability capability_;
-  int64_t last_render_time_ms_;
-  int incoming_frames_;
-  int timing_warnings_;
-  rtc::scoped_refptr<webrtc::VideoFrameBuffer> last_frame_;
-  webrtc::VideoRotation rotate_frame_;
-};
-
-class VideoCaptureTest : public testing::Test {
- public:
-  VideoCaptureTest() : number_of_devices_(0) {}
-
-  void SetUp() {
-    device_info_.reset(VideoCaptureFactory::CreateDeviceInfo());
-    assert(device_info_.get());
-    number_of_devices_ = device_info_->NumberOfDevices();
-    ASSERT_GT(number_of_devices_, 0u);
-  }
-
-  rtc::scoped_refptr<VideoCaptureModule> OpenVideoCaptureDevice(
-      unsigned int device,
-      rtc::VideoSinkInterface<webrtc::VideoFrame>* callback) {
-    char device_name[256];
-    char unique_name[256];
-
-    EXPECT_EQ(0, device_info_->GetDeviceName(
-        device, device_name, 256, unique_name, 256));
-
-    rtc::scoped_refptr<VideoCaptureModule> module(
-        VideoCaptureFactory::Create(unique_name));
-    if (module.get() == NULL)
-      return NULL;
-
-    EXPECT_FALSE(module->CaptureStarted());
-
-    module->RegisterCaptureDataCallback(callback);
-    return module;
-  }
-
-  void StartCapture(VideoCaptureModule* capture_module,
-                    VideoCaptureCapability capability) {
-    ASSERT_EQ(0, capture_module->StartCapture(capability));
-    EXPECT_TRUE(capture_module->CaptureStarted());
-
-    VideoCaptureCapability resulting_capability;
-    EXPECT_EQ(0, capture_module->CaptureSettings(resulting_capability));
-    EXPECT_EQ(capability.width, resulting_capability.width);
-    EXPECT_EQ(capability.height, resulting_capability.height);
-  }
-
-  std::unique_ptr<VideoCaptureModule::DeviceInfo> device_info_;
-  unsigned int number_of_devices_;
-};
-
-#ifdef WEBRTC_MAC
-// Currently fails on Mac 64-bit, see
-// https://bugs.chromium.org/p/webrtc/issues/detail?id=5406
-#define MAYBE_CreateDelete DISABLED_CreateDelete
-#else
-#define MAYBE_CreateDelete CreateDelete
-#endif
-TEST_F(VideoCaptureTest, MAYBE_CreateDelete) {
-  for (int i = 0; i < 5; ++i) {
-    int64_t start_time = rtc::TimeMillis();
-    TestVideoCaptureCallback capture_observer;
-    rtc::scoped_refptr<VideoCaptureModule> module(
-        OpenVideoCaptureDevice(0, &capture_observer));
-    ASSERT_TRUE(module.get() != NULL);
-
-    VideoCaptureCapability capability;
-#ifndef WEBRTC_MAC
-    device_info_->GetCapability(module->CurrentDeviceName(), 0, capability);
-#else
-    capability.width = kTestWidth;
-    capability.height = kTestHeight;
-    capability.maxFPS = kTestFramerate;
-    capability.videoType = webrtc::VideoType::kUnknown;
-#endif
-    capture_observer.SetExpectedCapability(capability);
-    ASSERT_NO_FATAL_FAILURE(StartCapture(module.get(), capability));
-
-    // Less than 4s to start the camera.
-    EXPECT_LE(rtc::TimeMillis() - start_time, 4000);
-
-    // Make sure 5 frames are captured.
-    EXPECT_TRUE_WAIT(capture_observer.incoming_frames() >= 5, kTimeOut);
-
-    int64_t stop_time = rtc::TimeMillis();
-    EXPECT_EQ(0, module->StopCapture());
-    EXPECT_FALSE(module->CaptureStarted());
-
-    // Less than 3s to stop the camera.
-    EXPECT_LE(rtc::TimeMillis() - stop_time, 3000);
-  }
-}
-
-#ifdef WEBRTC_MAC
-// Currently fails on Mac 64-bit, see
-// https://bugs.chromium.org/p/webrtc/issues/detail?id=5406
-#define MAYBE_Capabilities DISABLED_Capabilities
-#else
-#define MAYBE_Capabilities Capabilities
-#endif
-TEST_F(VideoCaptureTest, MAYBE_Capabilities) {
-#ifdef WEBRTC_MAC
-  printf("Video capture capabilities are not supported on Mac.\n");
-  return;
-#endif
-
-  TestVideoCaptureCallback capture_observer;
-
-  rtc::scoped_refptr<VideoCaptureModule> module(
-      OpenVideoCaptureDevice(0, &capture_observer));
-  ASSERT_TRUE(module.get() != NULL);
-
-  int number_of_capabilities = device_info_->NumberOfCapabilities(
-      module->CurrentDeviceName());
-  EXPECT_GT(number_of_capabilities, 0);
-  // Key is <width>x<height>, value is vector of maxFPS values at that
-  // resolution.
-  typedef std::map<std::string, std::vector<int> > FrameRatesByResolution;
-  FrameRatesByResolution frame_rates_by_resolution;
-  for (int i = 0; i < number_of_capabilities; ++i) {
-    VideoCaptureCapability capability;
-    EXPECT_EQ(0, device_info_->GetCapability(module->CurrentDeviceName(), i,
-                                             capability));
-    std::ostringstream resolutionStream;
-    resolutionStream << capability.width << "x" << capability.height;
-    resolutionStream.flush();
-    std::string resolution = resolutionStream.str();
-    frame_rates_by_resolution[resolution].push_back(capability.maxFPS);
-
-    // Since Android presents so many resolution/FPS combinations and the test
-    // runner imposes a timeout, we only actually start the capture and test
-    // that a frame was captured for 2 frame-rates at each resolution.
-    if (frame_rates_by_resolution[resolution].size() > 2)
-      continue;
-
-    capture_observer.SetExpectedCapability(capability);
-    ASSERT_NO_FATAL_FAILURE(StartCapture(module.get(), capability));
-    // Make sure at least one frame is captured.
-    EXPECT_TRUE_WAIT(capture_observer.incoming_frames() >= 1, kTimeOut);
-
-    EXPECT_EQ(0, module->StopCapture());
-  }
-
-#if defined(ANDROID) && ANDROID
-  // There's no reason for this to _necessarily_ be true, but in practice all
-  // Android devices this test runs on in fact do support multiple capture
-  // resolutions and multiple frame-rates per captured resolution, so we assert
-  // this fact here as a regression-test against the time that we only noticed a
-  // single frame-rate per resolution (bug 2974).  If this test starts being run
-  // on devices for which this is untrue (e.g. Nexus4) then the following should
-  // probably be wrapped in a base::android::BuildInfo::model()/device() check.
-  EXPECT_GT(frame_rates_by_resolution.size(), 1U);
-  for (FrameRatesByResolution::const_iterator it =
-           frame_rates_by_resolution.begin();
-       it != frame_rates_by_resolution.end();
-       ++it) {
-    EXPECT_GT(it->second.size(), 1U) << it->first;
-  }
-#endif  // ANDROID
-}
-
-// NOTE: flaky, crashes sometimes.
-// http://code.google.com/p/webrtc/issues/detail?id=777
-TEST_F(VideoCaptureTest, DISABLED_TestTwoCameras) {
-  if (number_of_devices_ < 2) {
-    printf("There are not two cameras available. Aborting test. \n");
-    return;
-  }
-
-  TestVideoCaptureCallback capture_observer1;
-  rtc::scoped_refptr<VideoCaptureModule> module1(
-      OpenVideoCaptureDevice(0, &capture_observer1));
-  ASSERT_TRUE(module1.get() != NULL);
-  VideoCaptureCapability capability1;
-#ifndef WEBRTC_MAC
-  device_info_->GetCapability(module1->CurrentDeviceName(), 0, capability1);
-#else
-  capability1.width = kTestWidth;
-  capability1.height = kTestHeight;
-  capability1.maxFPS = kTestFramerate;
-  capability1.videoType = webrtc::VideoType::kUnknown;
-#endif
-  capture_observer1.SetExpectedCapability(capability1);
-
-  TestVideoCaptureCallback capture_observer2;
-  rtc::scoped_refptr<VideoCaptureModule> module2(
-      OpenVideoCaptureDevice(1, &capture_observer2));
-  ASSERT_TRUE(module1.get() != NULL);
-
-
-  VideoCaptureCapability capability2;
-#ifndef WEBRTC_MAC
-  device_info_->GetCapability(module2->CurrentDeviceName(), 0, capability2);
-#else
-  capability2.width = kTestWidth;
-  capability2.height = kTestHeight;
-  capability2.maxFPS = kTestFramerate;
-  capability2.videoType = webrtc::VideoType::kUnknown;
-#endif
-  capture_observer2.SetExpectedCapability(capability2);
-
-  ASSERT_NO_FATAL_FAILURE(StartCapture(module1.get(), capability1));
-  ASSERT_NO_FATAL_FAILURE(StartCapture(module2.get(), capability2));
-  EXPECT_TRUE_WAIT(capture_observer1.incoming_frames() >= 5, kTimeOut);
-  EXPECT_TRUE_WAIT(capture_observer2.incoming_frames() >= 5, kTimeOut);
-  EXPECT_EQ(0, module2->StopCapture());
-  EXPECT_EQ(0, module1->StopCapture());
-}
-
-// Test class for testing external capture and capture feedback information
-// such as frame rate and picture alarm.
-class VideoCaptureExternalTest : public testing::Test {
- public:
-  void SetUp() {
-    capture_module_ = VideoCaptureFactory::Create(capture_input_interface_);
-
-    VideoCaptureCapability capability;
-    capability.width = kTestWidth;
-    capability.height = kTestHeight;
-    capability.videoType = webrtc::VideoType::kYV12;
-    capability.maxFPS = kTestFramerate;
-    capture_callback_.SetExpectedCapability(capability);
-
-    rtc::scoped_refptr<webrtc::I420Buffer> buffer =
-        webrtc::I420Buffer::Create(kTestWidth, kTestHeight);
-
-    memset(buffer->MutableDataY(), 127, buffer->height() * buffer->StrideY());
-    memset(buffer->MutableDataU(), 127,
-           buffer->ChromaHeight() * buffer->StrideU());
-    memset(buffer->MutableDataV(), 127,
-           buffer->ChromaHeight() * buffer->StrideV());
-    test_frame_.reset(
-        new webrtc::VideoFrame(buffer, 0, 0, webrtc::kVideoRotation_0));
-
-    SleepMs(1);  // Wait 1ms so that two tests can't have the same timestamp.
-
-    capture_module_->RegisterCaptureDataCallback(&capture_callback_);
-  }
-
-  void TearDown() {
-  }
-
-  webrtc::VideoCaptureExternal* capture_input_interface_;
-  rtc::scoped_refptr<VideoCaptureModule> capture_module_;
-  std::unique_ptr<webrtc::VideoFrame> test_frame_;
-  TestVideoCaptureCallback capture_callback_;
-};
-
-// Test input of external video frames.
-TEST_F(VideoCaptureExternalTest, TestExternalCapture) {
-  size_t length = webrtc::CalcBufferSize(
-      webrtc::VideoType::kI420, test_frame_->width(), test_frame_->height());
-  std::unique_ptr<uint8_t[]> test_buffer(new uint8_t[length]);
-  webrtc::ExtractBuffer(*test_frame_, length, test_buffer.get());
-  EXPECT_EQ(0, capture_input_interface_->IncomingFrame(test_buffer.get(),
-      length, capture_callback_.capability(), 0));
-  EXPECT_TRUE(capture_callback_.CompareLastFrame(*test_frame_));
-}
-
-TEST_F(VideoCaptureExternalTest, Rotation) {
-  EXPECT_EQ(0, capture_module_->SetCaptureRotation(webrtc::kVideoRotation_0));
-  size_t length = webrtc::CalcBufferSize(
-      webrtc::VideoType::kI420, test_frame_->width(), test_frame_->height());
-  std::unique_ptr<uint8_t[]> test_buffer(new uint8_t[length]);
-  webrtc::ExtractBuffer(*test_frame_, length, test_buffer.get());
-  EXPECT_EQ(0, capture_input_interface_->IncomingFrame(test_buffer.get(),
-    length, capture_callback_.capability(), 0));
-  EXPECT_EQ(0, capture_module_->SetCaptureRotation(webrtc::kVideoRotation_90));
-  capture_callback_.SetExpectedCaptureRotation(webrtc::kVideoRotation_90);
-  EXPECT_EQ(0, capture_input_interface_->IncomingFrame(test_buffer.get(),
-    length, capture_callback_.capability(), 0));
-  EXPECT_EQ(0, capture_module_->SetCaptureRotation(webrtc::kVideoRotation_180));
-  capture_callback_.SetExpectedCaptureRotation(webrtc::kVideoRotation_180);
-  EXPECT_EQ(0, capture_input_interface_->IncomingFrame(test_buffer.get(),
-    length, capture_callback_.capability(), 0));
-  EXPECT_EQ(0, capture_module_->SetCaptureRotation(webrtc::kVideoRotation_270));
-  capture_callback_.SetExpectedCaptureRotation(webrtc::kVideoRotation_270);
-  EXPECT_EQ(0, capture_input_interface_->IncomingFrame(test_buffer.get(),
-    length, capture_callback_.capability(), 0));
-}
diff --git a/modules/video_capture/video_capture.h b/modules/video_capture/video_capture.h
deleted file mode 100644
index 884953b..0000000
--- a/modules/video_capture/video_capture.h
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- *  Copyright (c) 2012 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_VIDEO_CAPTURE_VIDEO_CAPTURE_H_
-#define WEBRTC_MODULES_VIDEO_CAPTURE_VIDEO_CAPTURE_H_
-
-#include "webrtc/api/video/video_rotation.h"
-#include "webrtc/media/base/videosinkinterface.h"
-#include "webrtc/modules/include/module.h"
-#include "webrtc/modules/video_capture/video_capture_defines.h"
-
-namespace webrtc {
-
-class VideoCaptureModule: public rtc::RefCountInterface {
- public:
-  // Interface for receiving information about available camera devices.
-  class DeviceInfo {
-   public:
-    virtual uint32_t NumberOfDevices() = 0;
-
-    // Returns the available capture devices.
-    // deviceNumber   - Index of capture device.
-    // deviceNameUTF8 - Friendly name of the capture device.
-    // deviceUniqueIdUTF8 - Unique name of the capture device if it exist.
-    //                      Otherwise same as deviceNameUTF8.
-    // productUniqueIdUTF8 - Unique product id if it exist.
-    //                       Null terminated otherwise.
-    virtual int32_t GetDeviceName(
-        uint32_t deviceNumber,
-        char* deviceNameUTF8,
-        uint32_t deviceNameLength,
-        char* deviceUniqueIdUTF8,
-        uint32_t deviceUniqueIdUTF8Length,
-        char* productUniqueIdUTF8 = 0,
-        uint32_t productUniqueIdUTF8Length = 0) = 0;
-
-
-    // Returns the number of capabilities this device.
-    virtual int32_t NumberOfCapabilities(
-        const char* deviceUniqueIdUTF8) = 0;
-
-    // Gets the capabilities of the named device.
-    virtual int32_t GetCapability(
-        const char* deviceUniqueIdUTF8,
-        const uint32_t deviceCapabilityNumber,
-        VideoCaptureCapability& capability) = 0;
-
-    // Gets clockwise angle the captured frames should be rotated in order
-    // to be displayed correctly on a normally rotated display.
-    virtual int32_t GetOrientation(const char* deviceUniqueIdUTF8,
-                                   VideoRotation& orientation) = 0;
-
-    // Gets the capability that best matches the requested width, height and
-    // frame rate.
-    // Returns the deviceCapabilityNumber on success.
-    virtual int32_t GetBestMatchedCapability(
-        const char* deviceUniqueIdUTF8,
-        const VideoCaptureCapability& requested,
-        VideoCaptureCapability& resulting) = 0;
-
-     // Display OS /capture device specific settings dialog
-    virtual int32_t DisplayCaptureSettingsDialogBox(
-        const char* deviceUniqueIdUTF8,
-        const char* dialogTitleUTF8,
-        void* parentWindow,
-        uint32_t positionX,
-        uint32_t positionY) = 0;
-
-    virtual ~DeviceInfo() {}
-  };
-
-  //   Register capture data callback
-  virtual void RegisterCaptureDataCallback(
-      rtc::VideoSinkInterface<VideoFrame> *dataCallback) = 0;
-
-  //  Remove capture data callback
-  virtual void DeRegisterCaptureDataCallback() = 0;
-
-  // Start capture device
-  virtual int32_t StartCapture(
-      const VideoCaptureCapability& capability) = 0;
-
-  virtual int32_t StopCapture() = 0;
-
-  // Returns the name of the device used by this module.
-  virtual const char* CurrentDeviceName() const = 0;
-
-  // Returns true if the capture device is running
-  virtual bool CaptureStarted() = 0;
-
-  // Gets the current configuration.
-  virtual int32_t CaptureSettings(VideoCaptureCapability& settings) = 0;
-
-  // Set the rotation of the captured frames.
-  // If the rotation is set to the same as returned by
-  // DeviceInfo::GetOrientation the captured frames are
-  // displayed correctly if rendered.
-  virtual int32_t SetCaptureRotation(VideoRotation rotation) = 0;
-
-  // Tells the capture module whether to apply the pending rotation. By default,
-  // the rotation is applied and the generated frame is up right. When set to
-  // false, generated frames will carry the rotation information from
-  // SetCaptureRotation. Return value indicates whether this operation succeeds.
-  virtual bool SetApplyRotation(bool enable) = 0;
-
-  // Return whether the rotation is applied or left pending.
-  virtual bool GetApplyRotation() = 0;
-
-protected:
-  virtual ~VideoCaptureModule() {};
-};
-
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_VIDEO_CAPTURE_VIDEO_CAPTURE_H_
diff --git a/modules/video_capture/video_capture_config.h b/modules/video_capture/video_capture_config.h
deleted file mode 100644
index 829a6be..0000000
--- a/modules/video_capture/video_capture_config.h
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- *  Copyright (c) 2011 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_VIDEO_CAPTURE_MAIN_SOURCE_VIDEO_CAPTURE_CONFIG_H_
-#define WEBRTC_MODULES_VIDEO_CAPTURE_MAIN_SOURCE_VIDEO_CAPTURE_CONFIG_H_
-
-namespace webrtc
-{
-namespace videocapturemodule
-{
-enum {kDefaultWidth = 640};  // Start width
-enum {kDefaultHeight = 480}; // Start heigt
-enum {kDefaultFrameRate = 30}; // Start frame rate
-
-enum {kMaxFrameRate =60}; // Max allowed frame rate of the start image 
-
-enum {kDefaultCaptureDelay = 120}; 
-enum {kMaxCaptureDelay = 270}; // Max capture delay allowed in the precompiled capture delay values.  
-
-enum {kFrameRateCallbackInterval = 1000}; 
-enum {kFrameRateCountHistorySize = 90};
-enum {kFrameRateHistoryWindowMs = 2000};
-}  // namespace videocapturemodule
-}  // namespace webrtc
-
-#endif // WEBRTC_MODULES_VIDEO_CAPTURE_MAIN_SOURCE_VIDEO_CAPTURE_CONFIG_H_
diff --git a/modules/video_capture/video_capture_defines.h b/modules/video_capture/video_capture_defines.h
deleted file mode 100644
index ed81362..0000000
--- a/modules/video_capture/video_capture_defines.h
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- *  Copyright (c) 2012 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_VIDEO_CAPTURE_VIDEO_CAPTURE_DEFINES_H_
-#define WEBRTC_MODULES_VIDEO_CAPTURE_VIDEO_CAPTURE_DEFINES_H_
-
-#include "webrtc/api/video/video_frame.h"
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc
-{
-// Defines
-#ifndef NULL
-    #define NULL    0
-#endif
-
-enum {kVideoCaptureUniqueNameLength =1024}; //Max unique capture device name lenght
-enum {kVideoCaptureDeviceNameLength =256}; //Max capture device name lenght
-enum {kVideoCaptureProductIdLength =128}; //Max product id length
-
-struct VideoCaptureCapability
-{
-    int32_t width;
-    int32_t height;
-    int32_t maxFPS;
-    VideoType videoType;
-    bool interlaced;
-
-    VideoCaptureCapability()
-    {
-        width = 0;
-        height = 0;
-        maxFPS = 0;
-        videoType = VideoType::kUnknown;
-        interlaced = false;
-    }
-    ;
-    bool operator!=(const VideoCaptureCapability &other) const
-    {
-        if (width != other.width)
-            return true;
-        if (height != other.height)
-            return true;
-        if (maxFPS != other.maxFPS)
-            return true;
-        if (videoType != other.videoType)
-          return true;
-        if (interlaced != other.interlaced)
-            return true;
-        return false;
-    }
-    bool operator==(const VideoCaptureCapability &other) const
-    {
-        return !operator!=(other);
-    }
-};
-
-/* External Capture interface. Returned by Create
- and implemented by the capture module.
- */
-class VideoCaptureExternal
-{
-public:
-    // |capture_time| must be specified in the NTP time format in milliseconds.
-    virtual int32_t IncomingFrame(uint8_t* videoFrame,
-                                  size_t videoFrameLength,
-                                  const VideoCaptureCapability& frameInfo,
-                                  int64_t captureTime = 0) = 0;
-protected:
-    ~VideoCaptureExternal() {}
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_VIDEO_CAPTURE_VIDEO_CAPTURE_DEFINES_H_
diff --git a/modules/video_capture/video_capture_factory.cc b/modules/video_capture/video_capture_factory.cc
deleted file mode 100644
index ec016f8..0000000
--- a/modules/video_capture/video_capture_factory.cc
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- *  Copyright (c) 2012 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/video_capture/video_capture_factory.h"
-
-#include "webrtc/modules/video_capture/video_capture_impl.h"
-
-namespace webrtc {
-
-rtc::scoped_refptr<VideoCaptureModule> VideoCaptureFactory::Create(
-    const char* deviceUniqueIdUTF8) {
-#if defined(ANDROID)
-  return nullptr;
-#else
-  return videocapturemodule::VideoCaptureImpl::Create(deviceUniqueIdUTF8);
-#endif
-}
-
-rtc::scoped_refptr<VideoCaptureModule> VideoCaptureFactory::Create(
-    VideoCaptureExternal*& externalCapture) {
-  return videocapturemodule::VideoCaptureImpl::Create(externalCapture);
-}
-
-VideoCaptureModule::DeviceInfo* VideoCaptureFactory::CreateDeviceInfo() {
-#if defined(ANDROID)
-  return nullptr;
-#else
-  return videocapturemodule::VideoCaptureImpl::CreateDeviceInfo();
-#endif
-}
-
-}  // namespace webrtc
diff --git a/modules/video_capture/video_capture_factory.h b/modules/video_capture/video_capture_factory.h
deleted file mode 100644
index c219a2a..0000000
--- a/modules/video_capture/video_capture_factory.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- *  Copyright (c) 2012 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.
- */
-
-// This file contains interfaces used for creating the VideoCaptureModule
-// and DeviceInfo.
-
-#ifndef WEBRTC_MODULES_VIDEO_CAPTURE_VIDEO_CAPTURE_FACTORY_H_
-#define WEBRTC_MODULES_VIDEO_CAPTURE_VIDEO_CAPTURE_FACTORY_H_
-
-#include "webrtc/modules/video_capture/video_capture.h"
-
-namespace webrtc {
-
-class VideoCaptureFactory {
- public:
-  // Create a video capture module object
-  // id - unique identifier of this video capture module object.
-  // deviceUniqueIdUTF8 - name of the device.
-  //                      Available names can be found by using GetDeviceName
-  static rtc::scoped_refptr<VideoCaptureModule> Create(
-      const char* deviceUniqueIdUTF8);
-
-  // Create a video capture module object used for external capture.
-  // id - unique identifier of this video capture module object
-  // externalCapture - [out] interface to call when a new frame is captured.
-  static rtc::scoped_refptr<VideoCaptureModule> Create(
-      VideoCaptureExternal*& externalCapture);
-
-  static VideoCaptureModule::DeviceInfo* CreateDeviceInfo();
-
- private:
-  ~VideoCaptureFactory();
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_VIDEO_CAPTURE_VIDEO_CAPTURE_FACTORY_H_
diff --git a/modules/video_capture/video_capture_impl.cc b/modules/video_capture/video_capture_impl.cc
deleted file mode 100644
index d827ae6..0000000
--- a/modules/video_capture/video_capture_impl.cc
+++ /dev/null
@@ -1,237 +0,0 @@
-/*
- *  Copyright (c) 2012 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/video_capture/video_capture_impl.h"
-
-#include <stdlib.h>
-
-#include "webrtc/api/video/i420_buffer.h"
-#include "webrtc/common_video/libyuv/include/webrtc_libyuv.h"
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/modules/video_capture/video_capture_config.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/refcount.h"
-#include "webrtc/rtc_base/timeutils.h"
-#include "webrtc/rtc_base/trace_event.h"
-#include "webrtc/system_wrappers/include/clock.h"
-
-namespace webrtc {
-namespace videocapturemodule {
-rtc::scoped_refptr<VideoCaptureModule> VideoCaptureImpl::Create(
-    VideoCaptureExternal*& externalCapture) {
-  rtc::scoped_refptr<VideoCaptureImpl> implementation(
-      new rtc::RefCountedObject<VideoCaptureImpl>());
-  externalCapture = implementation.get();
-  return implementation;
-}
-
-const char* VideoCaptureImpl::CurrentDeviceName() const {
-  return _deviceUniqueId;
-}
-
-// static
-int32_t VideoCaptureImpl::RotationFromDegrees(int degrees,
-                                              VideoRotation* rotation) {
-  switch (degrees) {
-    case 0:
-      *rotation = kVideoRotation_0;
-      return 0;
-    case 90:
-      *rotation = kVideoRotation_90;
-      return 0;
-    case 180:
-      *rotation = kVideoRotation_180;
-      return 0;
-    case 270:
-      *rotation = kVideoRotation_270;
-      return 0;
-    default:
-      return -1;;
-  }
-}
-
-// static
-int32_t VideoCaptureImpl::RotationInDegrees(VideoRotation rotation,
-                                            int* degrees) {
-  switch (rotation) {
-    case kVideoRotation_0:
-      *degrees = 0;
-      return 0;
-    case kVideoRotation_90:
-      *degrees = 90;
-      return 0;
-    case kVideoRotation_180:
-      *degrees = 180;
-      return 0;
-    case kVideoRotation_270:
-      *degrees = 270;
-      return 0;
-  }
-  return -1;
-}
-
-VideoCaptureImpl::VideoCaptureImpl()
-    : _deviceUniqueId(NULL),
-      _requestedCapability(),
-      _lastProcessTimeNanos(rtc::TimeNanos()),
-      _lastFrameRateCallbackTimeNanos(rtc::TimeNanos()),
-      _dataCallBack(NULL),
-      _lastProcessFrameTimeNanos(rtc::TimeNanos()),
-      _rotateFrame(kVideoRotation_0),
-      apply_rotation_(false) {
-    _requestedCapability.width = kDefaultWidth;
-    _requestedCapability.height = kDefaultHeight;
-    _requestedCapability.maxFPS = 30;
-    _requestedCapability.videoType = VideoType::kI420;
-    memset(_incomingFrameTimesNanos, 0, sizeof(_incomingFrameTimesNanos));
-}
-
-VideoCaptureImpl::~VideoCaptureImpl()
-{
-    DeRegisterCaptureDataCallback();
-    if (_deviceUniqueId)
-        delete[] _deviceUniqueId;
-}
-
-void VideoCaptureImpl::RegisterCaptureDataCallback(
-    rtc::VideoSinkInterface<VideoFrame>* dataCallBack) {
-    rtc::CritScope cs(&_apiCs);
-    _dataCallBack = dataCallBack;
-}
-
-void VideoCaptureImpl::DeRegisterCaptureDataCallback() {
-    rtc::CritScope cs(&_apiCs);
-    _dataCallBack = NULL;
-}
-int32_t VideoCaptureImpl::DeliverCapturedFrame(VideoFrame& captureFrame) {
-  UpdateFrameCount();  // frame count used for local frame rate callback.
-
-  if (_dataCallBack) {
-    _dataCallBack->OnFrame(captureFrame);
-  }
-
-  return 0;
-}
-
-int32_t VideoCaptureImpl::IncomingFrame(
-    uint8_t* videoFrame,
-    size_t videoFrameLength,
-    const VideoCaptureCapability& frameInfo,
-    int64_t captureTime/*=0*/)
-{
-    rtc::CritScope cs(&_apiCs);
-
-    const int32_t width = frameInfo.width;
-    const int32_t height = frameInfo.height;
-
-    TRACE_EVENT1("webrtc", "VC::IncomingFrame", "capture_time", captureTime);
-
-    // Not encoded, convert to I420.
-    if (frameInfo.videoType != VideoType::kMJPEG &&
-        CalcBufferSize(frameInfo.videoType, width, abs(height)) !=
-            videoFrameLength) {
-      LOG(LS_ERROR) << "Wrong incoming frame length.";
-      return -1;
-    }
-
-    int stride_y = width;
-    int stride_uv = (width + 1) / 2;
-    int target_width = width;
-    int target_height = height;
-
-    // SetApplyRotation doesn't take any lock. Make a local copy here.
-    bool apply_rotation = apply_rotation_;
-
-    if (apply_rotation) {
-      // Rotating resolution when for 90/270 degree rotations.
-      if (_rotateFrame == kVideoRotation_90 ||
-          _rotateFrame == kVideoRotation_270) {
-        target_width = abs(height);
-        target_height = width;
-      }
-    }
-
-    // Setting absolute height (in case it was negative).
-    // In Windows, the image starts bottom left, instead of top left.
-    // Setting a negative source height, inverts the image (within LibYuv).
-
-    // TODO(nisse): Use a pool?
-    rtc::scoped_refptr<I420Buffer> buffer = I420Buffer::Create(
-        target_width, abs(target_height), stride_y, stride_uv, stride_uv);
-    const int conversionResult = ConvertToI420(
-        frameInfo.videoType, videoFrame, 0, 0,  // No cropping
-        width, height, videoFrameLength,
-        apply_rotation ? _rotateFrame : kVideoRotation_0, buffer.get());
-    if (conversionResult < 0) {
-      LOG(LS_ERROR) << "Failed to convert capture frame from type "
-                    << static_cast<int>(frameInfo.videoType) << "to I420.";
-      return -1;
-    }
-
-    VideoFrame captureFrame(buffer, 0, rtc::TimeMillis(),
-                            !apply_rotation ? _rotateFrame : kVideoRotation_0);
-    captureFrame.set_ntp_time_ms(captureTime);
-
-    DeliverCapturedFrame(captureFrame);
-
-    return 0;
-}
-
-int32_t VideoCaptureImpl::SetCaptureRotation(VideoRotation rotation) {
-  rtc::CritScope cs(&_apiCs);
-  _rotateFrame = rotation;
-  return 0;
-}
-
-bool VideoCaptureImpl::SetApplyRotation(bool enable) {
-  // We can't take any lock here as it'll cause deadlock with IncomingFrame.
-
-  // The effect of this is the last caller wins.
-  apply_rotation_ = enable;
-  return true;
-}
-
-void VideoCaptureImpl::UpdateFrameCount() {
-  if (_incomingFrameTimesNanos[0] / rtc::kNumNanosecsPerMicrosec == 0) {
-    // first no shift
-  } else {
-    // shift
-    for (int i = (kFrameRateCountHistorySize - 2); i >= 0; --i) {
-      _incomingFrameTimesNanos[i + 1] = _incomingFrameTimesNanos[i];
-    }
-  }
-  _incomingFrameTimesNanos[0] = rtc::TimeNanos();
-}
-
-uint32_t VideoCaptureImpl::CalculateFrameRate(int64_t now_ns) {
-  int32_t num = 0;
-  int32_t nrOfFrames = 0;
-  for (num = 1; num < (kFrameRateCountHistorySize - 1); ++num) {
-    if (_incomingFrameTimesNanos[num] <= 0 ||
-        (now_ns - _incomingFrameTimesNanos[num]) /
-                rtc::kNumNanosecsPerMillisec >
-            kFrameRateHistoryWindowMs) {  // don't use data older than 2sec
-      break;
-    } else {
-      nrOfFrames++;
-    }
-  }
-  if (num > 1) {
-    int64_t diff = (now_ns - _incomingFrameTimesNanos[num - 1]) /
-                   rtc::kNumNanosecsPerMillisec;
-    if (diff > 0) {
-      return uint32_t((nrOfFrames * 1000.0f / diff) + 0.5f);
-    }
-  }
-
-  return nrOfFrames;
-}
-}  // namespace videocapturemodule
-}  // namespace webrtc
diff --git a/modules/video_capture/video_capture_impl.h b/modules/video_capture/video_capture_impl.h
deleted file mode 100644
index 923397a..0000000
--- a/modules/video_capture/video_capture_impl.h
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- *  Copyright (c) 2012 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_VIDEO_CAPTURE_MAIN_SOURCE_VIDEO_CAPTURE_IMPL_H_
-#define WEBRTC_MODULES_VIDEO_CAPTURE_MAIN_SOURCE_VIDEO_CAPTURE_IMPL_H_
-
-/*
- * video_capture_impl.h
- */
-
-#include "webrtc/api/video/video_frame.h"
-#include "webrtc/common_video/libyuv/include/webrtc_libyuv.h"
-#include "webrtc/modules/video_capture/video_capture.h"
-#include "webrtc/modules/video_capture/video_capture_config.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/scoped_ref_ptr.h"
-
-namespace webrtc
-{
-
-namespace videocapturemodule {
-// Class definitions
-class VideoCaptureImpl: public VideoCaptureModule, public VideoCaptureExternal
-{
-public:
-
-    /*
-     *   Create a video capture module object
-     *
-     *   id              - unique identifier of this video capture module object
-     *   deviceUniqueIdUTF8 -  name of the device. Available names can be found by using GetDeviceName
-     */
-   static rtc::scoped_refptr<VideoCaptureModule> Create(
-       const char* deviceUniqueIdUTF8);
-
-    /*
-     *   Create a video capture module object used for external capture.
-     *
-     *   id              - unique identifier of this video capture module object
-     *   externalCapture - [out] interface to call when a new frame is captured.
-     */
-   static rtc::scoped_refptr<VideoCaptureModule> Create(
-       VideoCaptureExternal*& externalCapture);
-
-    static DeviceInfo* CreateDeviceInfo();
-
-    // Helpers for converting between (integral) degrees and
-    // VideoRotation values.  Return 0 on success.
-    static int32_t RotationFromDegrees(int degrees, VideoRotation* rotation);
-    static int32_t RotationInDegrees(VideoRotation rotation, int* degrees);
-
-    //Call backs
-    void RegisterCaptureDataCallback(
-        rtc::VideoSinkInterface<VideoFrame>* dataCallback) override;
-    void DeRegisterCaptureDataCallback() override;
-
-    int32_t SetCaptureRotation(VideoRotation rotation) override;
-    bool SetApplyRotation(bool enable) override;
-    bool GetApplyRotation() override {
-      return apply_rotation_;
-    }
-
-    const char* CurrentDeviceName() const override;
-
-    // Implement VideoCaptureExternal
-    // |capture_time| must be specified in NTP time format in milliseconds.
-    int32_t IncomingFrame(uint8_t* videoFrame,
-                          size_t videoFrameLength,
-                          const VideoCaptureCapability& frameInfo,
-                          int64_t captureTime = 0) override;
-
-    // Platform dependent
-    int32_t StartCapture(const VideoCaptureCapability& capability) override
-    {
-        _requestedCapability = capability;
-        return -1;
-    }
-    int32_t StopCapture() override { return -1; }
-    bool CaptureStarted() override {return false; }
-    int32_t CaptureSettings(VideoCaptureCapability& /*settings*/) override
-    { return -1; }
-
-protected:
-    VideoCaptureImpl();
-    virtual ~VideoCaptureImpl();
-    int32_t DeliverCapturedFrame(VideoFrame& captureFrame);
-
-    char* _deviceUniqueId; // current Device unique name;
-    rtc::CriticalSection _apiCs;
-    VideoCaptureCapability _requestedCapability; // Should be set by platform dependent code in StartCapture.
-private:
-    void UpdateFrameCount();
-    uint32_t CalculateFrameRate(int64_t now_ns);
-
-    // last time the module process function was called.
-    int64_t _lastProcessTimeNanos;
-    // last time the frame rate callback function was called.
-    int64_t _lastFrameRateCallbackTimeNanos;
-
-    rtc::VideoSinkInterface<VideoFrame>* _dataCallBack;
-
-    int64_t _lastProcessFrameTimeNanos;
-    // timestamp for local captured frames
-    int64_t _incomingFrameTimesNanos[kFrameRateCountHistorySize];
-    VideoRotation _rotateFrame;  // Set if the frame should be rotated by the
-                                 // capture module.
-
-    // Indicate whether rotation should be applied before delivered externally.
-    bool apply_rotation_;
-};
-}  // namespace videocapturemodule
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_VIDEO_CAPTURE_MAIN_SOURCE_VIDEO_CAPTURE_IMPL_H_
diff --git a/modules/video_capture/windows/device_info_ds.cc b/modules/video_capture/windows/device_info_ds.cc
deleted file mode 100644
index 22ff2fe..0000000
--- a/modules/video_capture/windows/device_info_ds.cc
+++ /dev/null
@@ -1,751 +0,0 @@
-/*
- *  Copyright (c) 2012 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/video_capture/windows/device_info_ds.h"
-
-#include <ios>  // std::hex
-
-#include "webrtc/modules/video_capture/video_capture_config.h"
-#include "webrtc/modules/video_capture/windows/help_functions_ds.h"
-#include "webrtc/rtc_base/logging.h"
-
-#include <Dvdmedia.h>
-#include <Streams.h>
-
-namespace webrtc
-{
-namespace videocapturemodule
-{
-
-// static
-DeviceInfoDS* DeviceInfoDS::Create()
-{
-    DeviceInfoDS* dsInfo = new DeviceInfoDS();
-    if (!dsInfo || dsInfo->Init() != 0)
-    {
-        delete dsInfo;
-        dsInfo = NULL;
-    }
-    return dsInfo;
-}
-
-DeviceInfoDS::DeviceInfoDS()
-    : _dsDevEnum(NULL), _dsMonikerDevEnum(NULL),
-      _CoUninitializeIsRequired(true)
-{
-    // 1) Initialize the COM library (make Windows load the DLLs).
-    //
-    // CoInitializeEx must be called at least once, and is usually called only once,
-    // for each thread that uses the COM library. Multiple calls to CoInitializeEx
-    // by the same thread are allowed as long as they pass the same concurrency flag,
-    // but subsequent valid calls return S_FALSE.
-    // To close the COM library gracefully on a thread, each successful call to
-    // CoInitializeEx, including any call that returns S_FALSE, must be balanced
-    // by a corresponding call to CoUninitialize.
-    //
-
-    /*Apartment-threading, while allowing for multiple threads of execution,
-     serializes all incoming calls by requiring that calls to methods of objects created by this thread always run on the same thread
-     the apartment/thread that created them. In addition, calls can arrive only at message-queue boundaries (i.e., only during a
-     PeekMessage, SendMessage, DispatchMessage, etc.). Because of this serialization, it is not typically necessary to write concurrency control into
-     the code for the object, other than to avoid calls to PeekMessage and SendMessage during processing that must not be interrupted by other method
-     invocations or calls to other objects in the same apartment/thread.*/
-
-    ///CoInitializeEx(NULL, COINIT_APARTMENTTHREADED ); //| COINIT_SPEED_OVER_MEMORY
-    HRESULT hr = CoInitializeEx(NULL, COINIT_MULTITHREADED); // Use COINIT_MULTITHREADED since Voice Engine uses COINIT_MULTITHREADED
-    if (FAILED(hr))
-    {
-        // Avoid calling CoUninitialize() since CoInitializeEx() failed.
-        _CoUninitializeIsRequired = FALSE;
-
-        if (hr == RPC_E_CHANGED_MODE)
-        {
-            // Calling thread has already initialized COM to be used in a single-threaded
-            // apartment (STA). We are then prevented from using STA.
-            // Details: hr = 0x80010106 <=> "Cannot change thread mode after it is set".
-            //
-            LOG(LS_INFO) << __FUNCTION__
-                         << ": CoInitializeEx(NULL, COINIT_APARTMENTTHREADED)"
-                         << " => RPC_E_CHANGED_MODE, error 0x" << std::hex
-                         << hr;
-        }
-    }
-}
-
-DeviceInfoDS::~DeviceInfoDS()
-{
-    RELEASE_AND_CLEAR(_dsMonikerDevEnum);
-    RELEASE_AND_CLEAR(_dsDevEnum);
-    if (_CoUninitializeIsRequired)
-    {
-        CoUninitialize();
-    }
-}
-
-int32_t DeviceInfoDS::Init()
-{
-    HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC,
-                                  IID_ICreateDevEnum, (void **) &_dsDevEnum);
-    if (hr != NOERROR)
-    {
-        LOG(LS_INFO) << "Failed to create CLSID_SystemDeviceEnum, error 0x"
-                     << std::hex << hr;
-        return -1;
-    }
-    return 0;
-}
-uint32_t DeviceInfoDS::NumberOfDevices()
-{
-    ReadLockScoped cs(_apiLock);
-    return GetDeviceInfo(0, 0, 0, 0, 0, 0, 0);
-}
-
-int32_t DeviceInfoDS::GetDeviceName(
-                                       uint32_t deviceNumber,
-                                       char* deviceNameUTF8,
-                                       uint32_t deviceNameLength,
-                                       char* deviceUniqueIdUTF8,
-                                       uint32_t deviceUniqueIdUTF8Length,
-                                       char* productUniqueIdUTF8,
-                                       uint32_t productUniqueIdUTF8Length)
-{
-    ReadLockScoped cs(_apiLock);
-    const int32_t result = GetDeviceInfo(deviceNumber, deviceNameUTF8,
-                                         deviceNameLength,
-                                         deviceUniqueIdUTF8,
-                                         deviceUniqueIdUTF8Length,
-                                         productUniqueIdUTF8,
-                                         productUniqueIdUTF8Length);
-    return result > (int32_t) deviceNumber ? 0 : -1;
-}
-
-int32_t DeviceInfoDS::GetDeviceInfo(
-                                       uint32_t deviceNumber,
-                                       char* deviceNameUTF8,
-                                       uint32_t deviceNameLength,
-                                       char* deviceUniqueIdUTF8,
-                                       uint32_t deviceUniqueIdUTF8Length,
-                                       char* productUniqueIdUTF8,
-                                       uint32_t productUniqueIdUTF8Length)
-
-{
-
-    // enumerate all video capture devices
-    RELEASE_AND_CLEAR(_dsMonikerDevEnum);
-    HRESULT hr =
-        _dsDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory,
-                                          &_dsMonikerDevEnum, 0);
-    if (hr != NOERROR)
-    {
-        LOG(LS_INFO) << "Failed to enumerate CLSID_SystemDeviceEnum, error 0x"
-                     << std::hex << hr << ". No webcam exist?";
-        return 0;
-    }
-
-    _dsMonikerDevEnum->Reset();
-    ULONG cFetched;
-    IMoniker *pM;
-    int index = 0;
-    while (S_OK == _dsMonikerDevEnum->Next(1, &pM, &cFetched))
-    {
-        IPropertyBag *pBag;
-        hr = pM->BindToStorage(0, 0, IID_IPropertyBag, (void **) &pBag);
-        if (S_OK == hr)
-        {
-            // Find the description or friendly name.
-            VARIANT varName;
-            VariantInit(&varName);
-            hr = pBag->Read(L"Description", &varName, 0);
-            if (FAILED(hr))
-            {
-                hr = pBag->Read(L"FriendlyName", &varName, 0);
-            }
-            if (SUCCEEDED(hr))
-            {
-                // ignore all VFW drivers
-                if ((wcsstr(varName.bstrVal, (L"(VFW)")) == NULL) &&
-                    (_wcsnicmp(varName.bstrVal, (L"Google Camera Adapter"),21)
-                        != 0))
-                {
-                    // Found a valid device.
-                    if (index == static_cast<int>(deviceNumber))
-                    {
-                        int convResult = 0;
-                        if (deviceNameLength > 0)
-                        {
-                            convResult = WideCharToMultiByte(CP_UTF8, 0,
-                                                             varName.bstrVal, -1,
-                                                             (char*) deviceNameUTF8,
-                                                             deviceNameLength, NULL,
-                                                             NULL);
-                            if (convResult == 0)
-                            {
-                                LOG(LS_INFO)
-                                    << "Failed to convert device name to UTF8, "
-                                    << "error = " << GetLastError();
-                                return -1;
-                            }
-                        }
-                        if (deviceUniqueIdUTF8Length > 0)
-                        {
-                            hr = pBag->Read(L"DevicePath", &varName, 0);
-                            if (FAILED(hr))
-                            {
-                                strncpy_s((char *) deviceUniqueIdUTF8,
-                                          deviceUniqueIdUTF8Length,
-                                          (char *) deviceNameUTF8, convResult);
-                                LOG(LS_INFO) << "Failed to get "
-                                             << "deviceUniqueIdUTF8 using "
-                                             << "deviceNameUTF8";
-                            }
-                            else
-                            {
-                                convResult = WideCharToMultiByte(
-                                                          CP_UTF8,
-                                                          0,
-                                                          varName.bstrVal,
-                                                          -1,
-                                                          (char*) deviceUniqueIdUTF8,
-                                                          deviceUniqueIdUTF8Length,
-                                                          NULL, NULL);
-                                if (convResult == 0)
-                                {
-                                    LOG(LS_INFO) << "Failed to convert device "
-                                                 << "name to UTF8, error = "
-                                                 << GetLastError();
-                                    return -1;
-                                }
-                                if (productUniqueIdUTF8
-                                    && productUniqueIdUTF8Length > 0)
-                                {
-                                    GetProductId(deviceUniqueIdUTF8,
-                                                 productUniqueIdUTF8,
-                                                 productUniqueIdUTF8Length);
-                                }
-                            }
-                        }
-
-                    }
-                    ++index; // increase the number of valid devices
-                }
-            }
-            VariantClear(&varName);
-            pBag->Release();
-            pM->Release();
-        }
-
-    }
-    if (deviceNameLength)
-    {
-        LOG(LS_INFO) << __FUNCTION__ << " " << deviceNameUTF8;
-    }
-    return index;
-}
-
-IBaseFilter * DeviceInfoDS::GetDeviceFilter(
-                                     const char* deviceUniqueIdUTF8,
-                                     char* productUniqueIdUTF8,
-                                     uint32_t productUniqueIdUTF8Length)
-{
-
-    const int32_t deviceUniqueIdUTF8Length =
-        (int32_t) strlen((char*) deviceUniqueIdUTF8); // UTF8 is also NULL terminated
-    if (deviceUniqueIdUTF8Length > kVideoCaptureUniqueNameLength)
-    {
-        LOG(LS_INFO) << "Device name too long";
-        return NULL;
-    }
-
-    // enumerate all video capture devices
-    RELEASE_AND_CLEAR(_dsMonikerDevEnum);
-    HRESULT hr = _dsDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory,
-                                                   &_dsMonikerDevEnum, 0);
-    if (hr != NOERROR)
-    {
-        LOG(LS_INFO) << "Failed to enumerate CLSID_SystemDeviceEnum, error 0x"
-                     << std::hex << hr << ". No webcam exist?";
-        return 0;
-    }
-    _dsMonikerDevEnum->Reset();
-    ULONG cFetched;
-    IMoniker *pM;
-
-    IBaseFilter *captureFilter = NULL;
-    bool deviceFound = false;
-    while (S_OK == _dsMonikerDevEnum->Next(1, &pM, &cFetched) && !deviceFound)
-    {
-        IPropertyBag *pBag;
-        hr = pM->BindToStorage(0, 0, IID_IPropertyBag, (void **) &pBag);
-        if (S_OK == hr)
-        {
-            // Find the description or friendly name.
-            VARIANT varName;
-            VariantInit(&varName);
-            if (deviceUniqueIdUTF8Length > 0)
-            {
-                hr = pBag->Read(L"DevicePath", &varName, 0);
-                if (FAILED(hr))
-                {
-                    hr = pBag->Read(L"Description", &varName, 0);
-                    if (FAILED(hr))
-                    {
-                        hr = pBag->Read(L"FriendlyName", &varName, 0);
-                    }
-                }
-                if (SUCCEEDED(hr))
-                {
-                    char tempDevicePathUTF8[256];
-                    tempDevicePathUTF8[0] = 0;
-                    WideCharToMultiByte(CP_UTF8, 0, varName.bstrVal, -1,
-                                        tempDevicePathUTF8,
-                                        sizeof(tempDevicePathUTF8), NULL,
-                                        NULL);
-                    if (strncmp(tempDevicePathUTF8,
-                                (const char*) deviceUniqueIdUTF8,
-                                deviceUniqueIdUTF8Length) == 0)
-                    {
-                        // We have found the requested device
-                        deviceFound = true;
-                        hr = pM->BindToObject(0, 0, IID_IBaseFilter,
-                                              (void**) &captureFilter);
-                        if FAILED(hr)
-                        {
-                            LOG(LS_ERROR) << "Failed to bind to the selected "
-                                          << "capture device " << hr;
-                        }
-
-                        if (productUniqueIdUTF8
-                            && productUniqueIdUTF8Length > 0) // Get the device name
-                        {
-
-                            GetProductId(deviceUniqueIdUTF8,
-                                         productUniqueIdUTF8,
-                                         productUniqueIdUTF8Length);
-                        }
-
-                    }
-                }
-            }
-            VariantClear(&varName);
-            pBag->Release();
-            pM->Release();
-        }
-    }
-    return captureFilter;
-}
-
-int32_t DeviceInfoDS::GetWindowsCapability(
-    const int32_t capabilityIndex,
-    VideoCaptureCapabilityWindows& windowsCapability) {
-  ReadLockScoped cs(_apiLock);
-
-  if (capabilityIndex < 0 || static_cast<size_t>(capabilityIndex) >=
-                                 _captureCapabilitiesWindows.size()) {
-    return -1;
-  }
-
-  windowsCapability = _captureCapabilitiesWindows[capabilityIndex];
-  return 0;
-}
-
-int32_t DeviceInfoDS::CreateCapabilityMap(
-                                         const char* deviceUniqueIdUTF8)
-
-{
-    // Reset old capability list
-    _captureCapabilities.clear();
-
-    const int32_t deviceUniqueIdUTF8Length =
-        (int32_t) strlen((char*) deviceUniqueIdUTF8);
-    if (deviceUniqueIdUTF8Length > kVideoCaptureUniqueNameLength)
-    {
-        LOG(LS_INFO) << "Device name too long";
-        return -1;
-    }
-    LOG(LS_INFO) << "CreateCapabilityMap called for device "
-                 << deviceUniqueIdUTF8;
-
-
-    char productId[kVideoCaptureProductIdLength];
-    IBaseFilter* captureDevice = DeviceInfoDS::GetDeviceFilter(
-                                               deviceUniqueIdUTF8,
-                                               productId,
-                                               kVideoCaptureProductIdLength);
-    if (!captureDevice)
-        return -1;
-    IPin* outputCapturePin = GetOutputPin(captureDevice, GUID_NULL);
-    if (!outputCapturePin)
-    {
-        LOG(LS_INFO) << "Failed to get capture device output pin";
-        RELEASE_AND_CLEAR(captureDevice);
-        return -1;
-    }
-    IAMExtDevice* extDevice = NULL;
-    HRESULT hr = captureDevice->QueryInterface(IID_IAMExtDevice,
-                                               (void **) &extDevice);
-    if (SUCCEEDED(hr) && extDevice)
-    {
-        LOG(LS_INFO) << "This is an external device";
-        extDevice->Release();
-    }
-
-    IAMStreamConfig* streamConfig = NULL;
-    hr = outputCapturePin->QueryInterface(IID_IAMStreamConfig,
-                                          (void**) &streamConfig);
-    if (FAILED(hr))
-    {
-        LOG(LS_INFO) << "Failed to get IID_IAMStreamConfig interface "
-                     <<"from capture device";
-        return -1;
-    }
-
-    // this  gets the FPS
-    IAMVideoControl* videoControlConfig = NULL;
-    HRESULT hrVC = captureDevice->QueryInterface(IID_IAMVideoControl,
-                                      (void**) &videoControlConfig);
-    if (FAILED(hrVC))
-    {
-        LOG(LS_INFO) << "IID_IAMVideoControl Interface NOT SUPPORTED";
-    }
-
-    AM_MEDIA_TYPE *pmt = NULL;
-    VIDEO_STREAM_CONFIG_CAPS caps;
-    int count, size;
-
-    hr = streamConfig->GetNumberOfCapabilities(&count, &size);
-    if (FAILED(hr))
-    {
-        LOG(LS_INFO) << "Failed to GetNumberOfCapabilities";
-        RELEASE_AND_CLEAR(videoControlConfig);
-        RELEASE_AND_CLEAR(streamConfig);
-        RELEASE_AND_CLEAR(outputCapturePin);
-        RELEASE_AND_CLEAR(captureDevice);
-        return -1;
-    }
-
-    // Check if the device support formattype == FORMAT_VideoInfo2 and FORMAT_VideoInfo.
-    // Prefer FORMAT_VideoInfo since some cameras (ZureCam) has been seen having problem with MJPEG and FORMAT_VideoInfo2
-    // Interlace flag is only supported in FORMAT_VideoInfo2
-    bool supportFORMAT_VideoInfo2 = false;
-    bool supportFORMAT_VideoInfo = false;
-    bool foundInterlacedFormat = false;
-    GUID preferedVideoFormat = FORMAT_VideoInfo;
-    for (int32_t tmp = 0; tmp < count; ++tmp)
-    {
-        hr = streamConfig->GetStreamCaps(tmp, &pmt,
-                                         reinterpret_cast<BYTE*> (&caps));
-        if (!FAILED(hr))
-        {
-            if (pmt->majortype == MEDIATYPE_Video
-                && pmt->formattype == FORMAT_VideoInfo2)
-            {
-                LOG(LS_INFO) << "Device support FORMAT_VideoInfo2";
-                supportFORMAT_VideoInfo2 = true;
-                VIDEOINFOHEADER2* h =
-                    reinterpret_cast<VIDEOINFOHEADER2*> (pmt->pbFormat);
-                assert(h);
-                foundInterlacedFormat |= h->dwInterlaceFlags
-                                        & (AMINTERLACE_IsInterlaced
-                                           | AMINTERLACE_DisplayModeBobOnly);
-            }
-            if (pmt->majortype == MEDIATYPE_Video
-                && pmt->formattype == FORMAT_VideoInfo)
-            {
-                LOG(LS_INFO) << "Device support FORMAT_VideoInfo2";
-                supportFORMAT_VideoInfo = true;
-            }
-        }
-    }
-    if (supportFORMAT_VideoInfo2)
-    {
-        if (supportFORMAT_VideoInfo && !foundInterlacedFormat)
-        {
-            preferedVideoFormat = FORMAT_VideoInfo;
-        }
-        else
-        {
-            preferedVideoFormat = FORMAT_VideoInfo2;
-        }
-    }
-
-    for (int32_t tmp = 0; tmp < count; ++tmp)
-    {
-        hr = streamConfig->GetStreamCaps(tmp, &pmt,
-                                         reinterpret_cast<BYTE*> (&caps));
-        if (FAILED(hr))
-        {
-            LOG(LS_INFO) << "Failed to GetStreamCaps";
-            RELEASE_AND_CLEAR(videoControlConfig);
-            RELEASE_AND_CLEAR(streamConfig);
-            RELEASE_AND_CLEAR(outputCapturePin);
-            RELEASE_AND_CLEAR(captureDevice);
-            return -1;
-        }
-
-        if (pmt->majortype == MEDIATYPE_Video
-            && pmt->formattype == preferedVideoFormat)
-        {
-
-            VideoCaptureCapabilityWindows capability;
-            int64_t avgTimePerFrame = 0;
-
-            if (pmt->formattype == FORMAT_VideoInfo)
-            {
-                VIDEOINFOHEADER* h =
-                    reinterpret_cast<VIDEOINFOHEADER*> (pmt->pbFormat);
-                assert(h);
-                capability.directShowCapabilityIndex = tmp;
-                capability.width = h->bmiHeader.biWidth;
-                capability.height = h->bmiHeader.biHeight;
-                avgTimePerFrame = h->AvgTimePerFrame;
-            }
-            if (pmt->formattype == FORMAT_VideoInfo2)
-            {
-                VIDEOINFOHEADER2* h =
-                    reinterpret_cast<VIDEOINFOHEADER2*> (pmt->pbFormat);
-                assert(h);
-                capability.directShowCapabilityIndex = tmp;
-                capability.width = h->bmiHeader.biWidth;
-                capability.height = h->bmiHeader.biHeight;
-                capability.interlaced = h->dwInterlaceFlags
-                                        & (AMINTERLACE_IsInterlaced
-                                           | AMINTERLACE_DisplayModeBobOnly);
-                avgTimePerFrame = h->AvgTimePerFrame;
-            }
-
-            if (hrVC == S_OK)
-            {
-                LONGLONG *frameDurationList;
-                LONGLONG maxFPS;
-                long listSize;
-                SIZE size;
-                size.cx = capability.width;
-                size.cy = capability.height;
-
-                // GetMaxAvailableFrameRate doesn't return max frame rate always
-                // eg: Logitech Notebook. This may be due to a bug in that API
-                // because GetFrameRateList array is reversed in the above camera. So
-                // a util method written. Can't assume the first value will return
-                // the max fps.
-                hrVC = videoControlConfig->GetFrameRateList(outputCapturePin,
-                                                            tmp, size,
-                                                            &listSize,
-                                                            &frameDurationList);
-
-                // On some odd cameras, you may get a 0 for duration.
-                // GetMaxOfFrameArray returns the lowest duration (highest FPS)
-                if (hrVC == S_OK && listSize > 0 &&
-                    0 != (maxFPS = GetMaxOfFrameArray(frameDurationList,
-                                                      listSize)))
-                {
-                    capability.maxFPS = static_cast<int> (10000000
-                                                           / maxFPS);
-                    capability.supportFrameRateControl = true;
-                }
-                else // use existing method
-                {
-                    LOG(LS_INFO) << "GetMaxAvailableFrameRate NOT SUPPORTED";
-                    if (avgTimePerFrame > 0)
-                        capability.maxFPS = static_cast<int> (10000000
-                                                               / avgTimePerFrame);
-                    else
-                        capability.maxFPS = 0;
-                }
-            }
-            else // use existing method in case IAMVideoControl is not supported
-            {
-                if (avgTimePerFrame > 0)
-                    capability.maxFPS = static_cast<int> (10000000
-                                                           / avgTimePerFrame);
-                else
-                    capability.maxFPS = 0;
-            }
-
-            // can't switch MEDIATYPE :~(
-            if (pmt->subtype == MEDIASUBTYPE_I420)
-            {
-              capability.videoType = VideoType::kI420;
-            }
-            else if (pmt->subtype == MEDIASUBTYPE_IYUV)
-            {
-              capability.videoType = VideoType::kIYUV;
-            }
-            else if (pmt->subtype == MEDIASUBTYPE_RGB24)
-            {
-              capability.videoType = VideoType::kRGB24;
-            }
-            else if (pmt->subtype == MEDIASUBTYPE_YUY2)
-            {
-              capability.videoType = VideoType::kYUY2;
-            }
-            else if (pmt->subtype == MEDIASUBTYPE_RGB565)
-            {
-              capability.videoType = VideoType::kRGB565;
-            }
-            else if (pmt->subtype == MEDIASUBTYPE_MJPG)
-            {
-              capability.videoType = VideoType::kMJPEG;
-            }
-            else if (pmt->subtype == MEDIASUBTYPE_dvsl
-                    || pmt->subtype == MEDIASUBTYPE_dvsd
-                    || pmt->subtype == MEDIASUBTYPE_dvhd) // If this is an external DV camera
-            {
-              capability.videoType =
-                  VideoType::kYUY2;  // MS DV filter seems to create this type
-            }
-            else if (pmt->subtype == MEDIASUBTYPE_UYVY) // Seen used by Declink capture cards
-            {
-              capability.videoType = VideoType::kUYVY;
-            }
-            else if (pmt->subtype == MEDIASUBTYPE_HDYC) // Seen used by Declink capture cards. Uses BT. 709 color. Not entiry correct to use UYVY. http://en.wikipedia.org/wiki/YCbCr
-            {
-                LOG(LS_INFO) << "Device support HDYC.";
-                capability.videoType = VideoType::kUYVY;
-            }
-            else
-            {
-                WCHAR strGuid[39];
-                StringFromGUID2(pmt->subtype, strGuid, 39);
-                LOG(LS_WARNING) << "Device support unknown media type "
-                                << strGuid << ", width " << capability.width
-                                << ", height " << capability.height;
-                continue;
-            }
-
-            _captureCapabilities.push_back(capability);
-            _captureCapabilitiesWindows.push_back(capability);
-            LOG(LS_INFO) << "Camera capability, width:" << capability.width
-                         << " height:" << capability.height << " type:"
-                         << static_cast<int>(capability.videoType) << " fps:"
-                         << capability.maxFPS;
-        }
-        DeleteMediaType(pmt);
-        pmt = NULL;
-    }
-    RELEASE_AND_CLEAR(streamConfig);
-    RELEASE_AND_CLEAR(videoControlConfig);
-    RELEASE_AND_CLEAR(outputCapturePin);
-    RELEASE_AND_CLEAR(captureDevice); // Release the capture device
-
-    // Store the new used device name
-    _lastUsedDeviceNameLength = deviceUniqueIdUTF8Length;
-    _lastUsedDeviceName = (char*) realloc(_lastUsedDeviceName,
-                                                   _lastUsedDeviceNameLength
-                                                       + 1);
-    memcpy(_lastUsedDeviceName, deviceUniqueIdUTF8, _lastUsedDeviceNameLength+ 1);
-    LOG(LS_INFO) << "CreateCapabilityMap " << _captureCapabilities.size();
-
-    return static_cast<int32_t>(_captureCapabilities.size());
-}
-
-/* Constructs a product ID from the Windows DevicePath. on a USB device the devicePath contains product id and vendor id.
- This seems to work for firewire as well
- /* Example of device path
- "\\?\usb#vid_0408&pid_2010&mi_00#7&258e7aaf&0&0000#{65e8773d-8f56-11d0-a3b9-00a0c9223196}\global"
- "\\?\avc#sony&dv-vcr&camcorder&dv#65b2d50301460008#{65e8773d-8f56-11d0-a3b9-00a0c9223196}\global"
- */
-void DeviceInfoDS::GetProductId(const char* devicePath,
-                                      char* productUniqueIdUTF8,
-                                      uint32_t productUniqueIdUTF8Length)
-{
-    *productUniqueIdUTF8 = '\0';
-    char* startPos = strstr((char*) devicePath, "\\\\?\\");
-    if (!startPos)
-    {
-        strncpy_s((char*) productUniqueIdUTF8, productUniqueIdUTF8Length, "", 1);
-        LOG(LS_INFO) << "Failed to get the product Id";
-        return;
-    }
-    startPos += 4;
-
-    char* pos = strchr(startPos, '&');
-    if (!pos || pos >= (char*) devicePath + strlen((char*) devicePath))
-    {
-        strncpy_s((char*) productUniqueIdUTF8, productUniqueIdUTF8Length, "", 1);
-        LOG(LS_INFO) << "Failed to get the product Id";
-        return;
-    }
-    // Find the second occurrence.
-    pos = strchr(pos + 1, '&');
-    uint32_t bytesToCopy = (uint32_t)(pos - startPos);
-    if (pos && (bytesToCopy <= productUniqueIdUTF8Length) && bytesToCopy
-        <= kVideoCaptureProductIdLength)
-    {
-        strncpy_s((char*) productUniqueIdUTF8, productUniqueIdUTF8Length,
-                  (char*) startPos, bytesToCopy);
-    }
-    else
-    {
-        strncpy_s((char*) productUniqueIdUTF8, productUniqueIdUTF8Length, "", 1);
-        LOG(LS_INFO) << "Failed to get the product Id";
-    }
-}
-
-int32_t DeviceInfoDS::DisplayCaptureSettingsDialogBox(
-                                         const char* deviceUniqueIdUTF8,
-                                         const char* dialogTitleUTF8,
-                                         void* parentWindow,
-                                         uint32_t positionX,
-                                         uint32_t positionY)
-{
-    ReadLockScoped cs(_apiLock);
-    HWND window = (HWND) parentWindow;
-
-    IBaseFilter* filter = GetDeviceFilter(deviceUniqueIdUTF8, NULL, 0);
-    if (!filter)
-        return -1;
-
-    ISpecifyPropertyPages* pPages = NULL;
-    CAUUID uuid;
-    HRESULT hr = S_OK;
-
-    hr = filter->QueryInterface(IID_ISpecifyPropertyPages, (LPVOID*) &pPages);
-    if (!SUCCEEDED(hr))
-    {
-        filter->Release();
-        return -1;
-    }
-    hr = pPages->GetPages(&uuid);
-    if (!SUCCEEDED(hr))
-    {
-        filter->Release();
-        return -1;
-    }
-
-    WCHAR tempDialogTitleWide[256];
-    tempDialogTitleWide[0] = 0;
-    int size = 255;
-
-    // UTF-8 to wide char
-    MultiByteToWideChar(CP_UTF8, 0, (char*) dialogTitleUTF8, -1,
-                        tempDialogTitleWide, size);
-
-    // Invoke a dialog box to display.
-
-    hr = OleCreatePropertyFrame(window, // You must create the parent window.
-                                positionX, // Horizontal position for the dialog box.
-                                positionY, // Vertical position for the dialog box.
-                                tempDialogTitleWide,// String used for the dialog box caption.
-                                1, // Number of pointers passed in pPlugin.
-                                (LPUNKNOWN*) &filter, // Pointer to the filter.
-                                uuid.cElems, // Number of property pages.
-                                uuid.pElems, // Array of property page CLSIDs.
-                                LOCALE_USER_DEFAULT, // Locale ID for the dialog box.
-                                0, NULL); // Reserved
-    // Release memory.
-    if (uuid.pElems)
-    {
-        CoTaskMemFree(uuid.pElems);
-    }
-    filter->Release();
-    return 0;
-}
-}  // namespace videocapturemodule
-}  // namespace webrtc
diff --git a/modules/video_capture/windows/device_info_ds.h b/modules/video_capture/windows/device_info_ds.h
deleted file mode 100644
index 0f71196..0000000
--- a/modules/video_capture/windows/device_info_ds.h
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- *  Copyright (c) 2012 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_VIDEO_CAPTURE_MAIN_SOURCE_WINDOWS_DEVICE_INFO_DS_H_
-#define WEBRTC_MODULES_VIDEO_CAPTURE_MAIN_SOURCE_WINDOWS_DEVICE_INFO_DS_H_
-
-#include "webrtc/modules/video_capture/device_info_impl.h"
-#include "webrtc/modules/video_capture/video_capture_impl.h"
-
-#include <Dshow.h>
-
-namespace webrtc
-{
-namespace videocapturemodule
-{
-struct VideoCaptureCapabilityWindows: public VideoCaptureCapability
-{
-    uint32_t directShowCapabilityIndex;
-    bool supportFrameRateControl;
-    VideoCaptureCapabilityWindows()
-    {
-        directShowCapabilityIndex = 0;
-        supportFrameRateControl = false;
-    }
-};
-
-class DeviceInfoDS: public DeviceInfoImpl
-{
-public:
-    // Factory function.
-    static DeviceInfoDS* Create();
-
-    DeviceInfoDS();
-    virtual ~DeviceInfoDS();
-
-    int32_t Init();
-    virtual uint32_t NumberOfDevices();
-
-    /*
-     * Returns the available capture devices.
-     */
-    virtual int32_t
-        GetDeviceName(uint32_t deviceNumber,
-                      char* deviceNameUTF8,
-                      uint32_t deviceNameLength,
-                      char* deviceUniqueIdUTF8,
-                      uint32_t deviceUniqueIdUTF8Length,
-                      char* productUniqueIdUTF8,
-                      uint32_t productUniqueIdUTF8Length);
-
-    /*
-     * Display OS /capture device specific settings dialog
-     */
-    virtual int32_t
-        DisplayCaptureSettingsDialogBox(
-                                        const char* deviceUniqueIdUTF8,
-                                        const char* dialogTitleUTF8,
-                                        void* parentWindow,
-                                        uint32_t positionX,
-                                        uint32_t positionY);
-
-    // Windows specific
-
-    /* Gets a capture device filter
-     The user of this API is responsible for releasing the filter when it not needed.
-     */
-    IBaseFilter * GetDeviceFilter(const char* deviceUniqueIdUTF8,
-                                  char* productUniqueIdUTF8 = NULL,
-                                  uint32_t productUniqueIdUTF8Length = 0);
-
-    int32_t
-        GetWindowsCapability(const int32_t capabilityIndex,
-                             VideoCaptureCapabilityWindows& windowsCapability);
-
-    static void GetProductId(const char* devicePath,
-                             char* productUniqueIdUTF8,
-                             uint32_t productUniqueIdUTF8Length);
-
-protected:
-    int32_t GetDeviceInfo(uint32_t deviceNumber,
-                          char* deviceNameUTF8,
-                          uint32_t deviceNameLength,
-                          char* deviceUniqueIdUTF8,
-                          uint32_t deviceUniqueIdUTF8Length,
-                          char* productUniqueIdUTF8,
-                          uint32_t productUniqueIdUTF8Length);
-
-    virtual int32_t
-        CreateCapabilityMap(const char* deviceUniqueIdUTF8);
-
-private:
-    ICreateDevEnum* _dsDevEnum;
-    IEnumMoniker* _dsMonikerDevEnum;
-    bool _CoUninitializeIsRequired;
-    std::vector<VideoCaptureCapabilityWindows> _captureCapabilitiesWindows;
-};
-}  // namespace videocapturemodule
-}  // namespace webrtc
-#endif // WEBRTC_MODULES_VIDEO_CAPTURE_MAIN_SOURCE_WINDOWS_DEVICE_INFO_DS_H_
diff --git a/modules/video_capture/windows/device_info_mf.cc b/modules/video_capture/windows/device_info_mf.cc
deleted file mode 100644
index de367aa..0000000
--- a/modules/video_capture/windows/device_info_mf.cc
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- *  Copyright (c) 2012 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/video_capture/windows/device_info_mf.h"
-
-namespace webrtc {
-namespace videocapturemodule {
-
-DeviceInfoMF::DeviceInfoMF() {
-}
-
-DeviceInfoMF::~DeviceInfoMF() {
-}
-
-int32_t DeviceInfoMF::Init() {
-  return -1;
-}
-
-uint32_t DeviceInfoMF::NumberOfDevices() {
-  return 0;
-}
-
-int32_t DeviceInfoMF::GetDeviceName(
-    uint32_t deviceNumber,
-    char* deviceNameUTF8,
-    uint32_t deviceNameLength,
-    char* deviceUniqueIdUTF8,
-    uint32_t deviceUniqueIdUTF8Length,
-    char* productUniqueIdUTF8,
-    uint32_t productUniqueIdUTF8Length) {
-  return -1;
-}
-
-int32_t DeviceInfoMF::DisplayCaptureSettingsDialogBox(
-    const char* deviceUniqueIdUTF8,
-    const char* dialogTitleUTF8,
-    void* parentWindow,
-    uint32_t positionX,
-    uint32_t positionY) {
-  return -1;
-}
-
-}  // namespace videocapturemodule
-}  // namespace webrtc
diff --git a/modules/video_capture/windows/device_info_mf.h b/modules/video_capture/windows/device_info_mf.h
deleted file mode 100644
index 7512277..0000000
--- a/modules/video_capture/windows/device_info_mf.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- *  Copyright (c) 2012 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_VIDEO_CAPTURE_WINDOWS_DEVICE_INFO_MF_H_
-#define WEBRTC_MODULES_VIDEO_CAPTURE_WINDOWS_DEVICE_INFO_MF_H_
-
-#include "webrtc/modules/video_capture/device_info_impl.h"
-
-namespace webrtc {
-namespace videocapturemodule {
-
-// Provides video capture device information using the Media Foundation API.
-class DeviceInfoMF : public DeviceInfoImpl {
- public:
-  DeviceInfoMF();
-  virtual ~DeviceInfoMF();
-
-  int32_t Init();
-  virtual uint32_t NumberOfDevices();
-
-  virtual int32_t GetDeviceName(uint32_t deviceNumber, char* deviceNameUTF8,
-                                uint32_t deviceNameLength,
-                                char* deviceUniqueIdUTF8,
-                                uint32_t deviceUniqueIdUTF8Length,
-                                char* productUniqueIdUTF8,
-                                uint32_t productUniqueIdUTF8Length);
-
-  virtual int32_t DisplayCaptureSettingsDialogBox(
-      const char* deviceUniqueIdUTF8, const char* dialogTitleUTF8,
-      void* parentWindow, uint32_t positionX, uint32_t positionY);
-};
-
-}  // namespace videocapturemodule
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_VIDEO_CAPTURE_WINDOWS_DEVICE_INFO_MF_H_
diff --git a/modules/video_capture/windows/help_functions_ds.cc b/modules/video_capture/windows/help_functions_ds.cc
deleted file mode 100644
index 057bffb..0000000
--- a/modules/video_capture/windows/help_functions_ds.cc
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- *  Copyright (c) 2012 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 <initguid.h>  // Must come before the help_functions_ds.h include so
-                       // that DEFINE_GUID() entries will be defined in this
-                       // object file.
-
-#include "webrtc/modules/video_capture/windows/help_functions_ds.h"
-
-#include <cguid.h>
-
-namespace webrtc
-{
-namespace videocapturemodule
-{
-// This returns minimum :), which will give max frame rate...
-LONGLONG GetMaxOfFrameArray(LONGLONG *maxFps, long size)
-{
-    LONGLONG maxFPS = maxFps[0];
-    for (int i = 0; i < size; i++)
-    {
-        if (maxFPS > maxFps[i])
-            maxFPS = maxFps[i];
-    }
-    return maxFPS;
-}
-
-IPin* GetInputPin(IBaseFilter* filter)
-{
-    HRESULT hr;
-    IPin* pin = NULL;
-    IEnumPins* pPinEnum = NULL;
-    filter->EnumPins(&pPinEnum);
-    if (pPinEnum == NULL)
-    {
-        return NULL;
-    }
-
-    // get first unconnected pin
-    hr = pPinEnum->Reset(); // set to first pin
-
-    while (S_OK == pPinEnum->Next(1, &pin, NULL))
-    {
-        PIN_DIRECTION pPinDir;
-        pin->QueryDirection(&pPinDir);
-        if (PINDIR_INPUT == pPinDir) // This is an input pin
-        {
-            IPin* tempPin = NULL;
-            if (S_OK != pin->ConnectedTo(&tempPin)) // The pint is not connected
-            {
-                pPinEnum->Release();
-                return pin;
-            }
-        }
-        pin->Release();
-    }
-    pPinEnum->Release();
-    return NULL;
-}
-
-IPin* GetOutputPin(IBaseFilter* filter, REFGUID Category)
-{
-    HRESULT hr;
-    IPin* pin = NULL;
-    IEnumPins* pPinEnum = NULL;
-    filter->EnumPins(&pPinEnum);
-    if (pPinEnum == NULL)
-    {
-        return NULL;
-    }
-    // get first unconnected pin
-    hr = pPinEnum->Reset(); // set to first pin
-    while (S_OK == pPinEnum->Next(1, &pin, NULL))
-    {
-        PIN_DIRECTION pPinDir;
-        pin->QueryDirection(&pPinDir);
-        if (PINDIR_OUTPUT == pPinDir) // This is an output pin
-        {
-            if (Category == GUID_NULL || PinMatchesCategory(pin, Category))
-            {
-                pPinEnum->Release();
-                return pin;
-            }
-        }
-        pin->Release();
-        pin = NULL;
-    }
-    pPinEnum->Release();
-    return NULL;
-}
-
-BOOL PinMatchesCategory(IPin *pPin, REFGUID Category)
-{
-    BOOL bFound = FALSE;
-    IKsPropertySet *pKs = NULL;
-    HRESULT hr = pPin->QueryInterface(IID_PPV_ARGS(&pKs));
-    if (SUCCEEDED(hr))
-    {
-        GUID PinCategory;
-        DWORD cbReturned;
-        hr = pKs->Get(AMPROPSETID_Pin, AMPROPERTY_PIN_CATEGORY, NULL, 0, &PinCategory,
-                      sizeof(GUID), &cbReturned);
-        if (SUCCEEDED(hr) && (cbReturned == sizeof(GUID)))
-        {
-            bFound = (PinCategory == Category);
-        }
-        pKs->Release();
-    }
-    return bFound;
-}
-}  // namespace videocapturemodule
-}  // namespace webrtc
diff --git a/modules/video_capture/windows/help_functions_ds.h b/modules/video_capture/windows/help_functions_ds.h
deleted file mode 100644
index d675f92..0000000
--- a/modules/video_capture/windows/help_functions_ds.h
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- *  Copyright (c) 2011 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_VIDEO_CAPTURE_MAIN_SOURCE_WINDOWS_HELP_FUNCTIONS_DS_H_
-#define WEBRTC_MODULES_VIDEO_CAPTURE_MAIN_SOURCE_WINDOWS_HELP_FUNCTIONS_DS_H_
-
-#include <dshow.h>
-
-DEFINE_GUID(MEDIASUBTYPE_I420, 0x30323449, 0x0000, 0x0010, 0x80, 0x00, 0x00,
-            0xAA, 0x00, 0x38, 0x9B, 0x71);
-DEFINE_GUID(MEDIASUBTYPE_HDYC, 0x43594448, 0x0000, 0x0010, 0x80, 0x00, 0x00,
-            0xAA, 0x00, 0x38, 0x9B, 0x71);
-
-#define RELEASE_AND_CLEAR(p) if (p) { (p) -> Release () ; (p) = NULL ; }
-
-namespace webrtc
-{
-namespace videocapturemodule
-{
-LONGLONG GetMaxOfFrameArray(LONGLONG *maxFps, long size);
-
-IPin* GetInputPin(IBaseFilter* filter);
-IPin* GetOutputPin(IBaseFilter* filter, REFGUID Category);
-BOOL PinMatchesCategory(IPin *pPin, REFGUID Category);
-
-}  // namespace videocapturemodule
-}  // namespace webrtc
-#endif // WEBRTC_MODULES_VIDEO_CAPTURE_MAIN_SOURCE_WINDOWS_HELP_FUNCTIONS_DS_H_
diff --git a/modules/video_capture/windows/sink_filter_ds.cc b/modules/video_capture/windows/sink_filter_ds.cc
deleted file mode 100644
index 58e1bfc..0000000
--- a/modules/video_capture/windows/sink_filter_ds.cc
+++ /dev/null
@@ -1,512 +0,0 @@
-/*
- *  Copyright (c) 2012 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/video_capture/windows/sink_filter_ds.h"
-
-#include <ios>  // std::hex
-
-#include "webrtc/modules/video_capture/windows/help_functions_ds.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/platform_thread.h"
-
-#include <Dvdmedia.h> // VIDEOINFOHEADER2
-#include <initguid.h>
-
-#define DELETE_RESET(p) { delete (p) ; (p) = NULL ;}
-
-DEFINE_GUID(CLSID_SINKFILTER, 0x88cdbbdc, 0xa73b, 0x4afa, 0xac, 0xbf, 0x15, 0xd5,
-            0xe2, 0xce, 0x12, 0xc3);
-
-namespace webrtc
-{
-namespace videocapturemodule
-{
-
-typedef struct tagTHREADNAME_INFO
-{
-   DWORD dwType;        // must be 0x1000
-   LPCSTR szName;       // pointer to name (in user addr space)
-   DWORD dwThreadID;    // thread ID (-1=caller thread)
-   DWORD dwFlags;       // reserved for future use, must be zero
-} THREADNAME_INFO;
-
-CaptureInputPin::CaptureInputPin (IN TCHAR * szName,
-                            IN CaptureSinkFilter* pFilter,
-                            IN CCritSec * pLock,
-                            OUT HRESULT * pHr,
-                            IN LPCWSTR pszName)
-    : CBaseInputPin (szName, pFilter, pLock, pHr, pszName),
-      _requestedCapability(),
-      _resultingCapability()
-{
-    _threadHandle = NULL;
-}
-
-CaptureInputPin::~CaptureInputPin()
-{
-}
-
-HRESULT
-CaptureInputPin::GetMediaType (IN int iPosition, OUT CMediaType * pmt)
-{
-    // reset the thread handle
-    _threadHandle = NULL;
-
-    if(iPosition < 0)
-    return E_INVALIDARG;
-
-    VIDEOINFOHEADER* pvi = (VIDEOINFOHEADER*) pmt->AllocFormatBuffer(
-                            sizeof(VIDEOINFOHEADER));
-    if(NULL == pvi)
-    {
-        LOG(LS_INFO) << "CheckMediaType VIDEOINFOHEADER is NULL. Returning.";
-        return(E_OUTOFMEMORY);
-    }
-
-    ZeroMemory(pvi, sizeof(VIDEOINFOHEADER));
-    pvi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
-    pvi->bmiHeader.biPlanes = 1;
-    pvi->bmiHeader.biClrImportant = 0;
-    pvi->bmiHeader.biClrUsed = 0;
-    if (_requestedCapability.maxFPS != 0) {
-        pvi->AvgTimePerFrame = 10000000/_requestedCapability.maxFPS;
-    }
-
-    SetRectEmpty(&(pvi->rcSource)); // we want the whole image area rendered.
-    SetRectEmpty(&(pvi->rcTarget)); // no particular destination rectangle
-
-    pmt->SetType(&MEDIATYPE_Video);
-    pmt->SetFormatType(&FORMAT_VideoInfo);
-    pmt->SetTemporalCompression(FALSE);
-
-    int32_t positionOffset=1;
-    switch (iPosition+positionOffset)
-    {
-        case 0:
-        {
-            pvi->bmiHeader.biCompression = MAKEFOURCC('I','4','2','0');
-            pvi->bmiHeader.biBitCount = 12; //bit per pixel
-            pvi->bmiHeader.biWidth = _requestedCapability.width;
-            pvi->bmiHeader.biHeight = _requestedCapability.height;
-            pvi->bmiHeader.biSizeImage = 3*_requestedCapability.height
-                                        *_requestedCapability.width/2;
-            pmt->SetSubtype(&MEDIASUBTYPE_I420);
-        }
-        break;
-        case 1:
-        {
-            pvi->bmiHeader.biCompression = MAKEFOURCC('Y','U','Y','2');;
-            pvi->bmiHeader.biBitCount = 16; //bit per pixel
-            pvi->bmiHeader.biWidth = _requestedCapability.width;
-            pvi->bmiHeader.biHeight = _requestedCapability.height;
-            pvi->bmiHeader.biSizeImage = 2*_requestedCapability.width
-                                        *_requestedCapability.height;
-            pmt->SetSubtype(&MEDIASUBTYPE_YUY2);
-        }
-        break;
-        case 2:
-        {
-            pvi->bmiHeader.biCompression = BI_RGB;
-            pvi->bmiHeader.biBitCount = 24; //bit per pixel
-            pvi->bmiHeader.biWidth = _requestedCapability.width;
-            pvi->bmiHeader.biHeight = _requestedCapability.height;
-            pvi->bmiHeader.biSizeImage = 3*_requestedCapability.height
-                                        *_requestedCapability.width;
-            pmt->SetSubtype(&MEDIASUBTYPE_RGB24);
-        }
-        break;
-        case 3:
-        {
-            pvi->bmiHeader.biCompression = MAKEFOURCC('U','Y','V','Y');
-            pvi->bmiHeader.biBitCount = 16; //bit per pixel
-            pvi->bmiHeader.biWidth = _requestedCapability.width;
-            pvi->bmiHeader.biHeight = _requestedCapability.height;
-            pvi->bmiHeader.biSizeImage = 2*_requestedCapability.height
-                                         *_requestedCapability.width;
-            pmt->SetSubtype(&MEDIASUBTYPE_UYVY);
-        }
-        break;
-        case 4:
-        {
-            pvi->bmiHeader.biCompression = MAKEFOURCC('M','J','P','G');
-            pvi->bmiHeader.biBitCount = 12; //bit per pixel
-            pvi->bmiHeader.biWidth = _requestedCapability.width;
-            pvi->bmiHeader.biHeight = _requestedCapability.height;
-            pvi->bmiHeader.biSizeImage = 3*_requestedCapability.height
-                                         *_requestedCapability.width/2;
-            pmt->SetSubtype(&MEDIASUBTYPE_MJPG);
-        }
-        break;
-        default :
-        return VFW_S_NO_MORE_ITEMS;
-    }
-    pmt->SetSampleSize(pvi->bmiHeader.biSizeImage);
-    LOG(LS_INFO) << "GetMediaType position " << iPosition << ", width "
-                 << _requestedCapability.width << ", height "
-                 << _requestedCapability.height << ", biCompression 0x"
-                 << std::hex << pvi->bmiHeader.biCompression;
-    return NOERROR;
-}
-
-HRESULT
-CaptureInputPin::CheckMediaType ( IN const CMediaType * pMediaType)
-{
-    // reset the thread handle
-    _threadHandle = NULL;
-
-    const GUID *type = pMediaType->Type();
-    if (*type != MEDIATYPE_Video)
-    return E_INVALIDARG;
-
-    const GUID *formatType = pMediaType->FormatType();
-
-    // Check for the subtypes we support
-    const GUID *SubType = pMediaType->Subtype();
-    if (SubType == NULL)
-    {
-        return E_INVALIDARG;
-    }
-
-    if(*formatType == FORMAT_VideoInfo)
-    {
-        VIDEOINFOHEADER *pvi = (VIDEOINFOHEADER *) pMediaType->Format();
-        if(pvi == NULL)
-        {
-            return E_INVALIDARG;
-        }
-
-        // Store the incoming width and height
-        _resultingCapability.width = pvi->bmiHeader.biWidth;
-
-        // Store the incoming height,
-        // for RGB24 we assume the frame to be upside down
-        if(*SubType == MEDIASUBTYPE_RGB24
-            && pvi->bmiHeader.biHeight > 0)
-        {
-           _resultingCapability.height = -(pvi->bmiHeader.biHeight);
-        }
-        else
-        {
-           _resultingCapability.height = abs(pvi->bmiHeader.biHeight);
-        }
-
-        LOG(LS_INFO) << "CheckMediaType width:" << pvi->bmiHeader.biWidth
-                     << " height:" << pvi->bmiHeader.biHeight
-                     << " Compression:0x" << std::hex
-                     << pvi->bmiHeader.biCompression;
-
-        if(*SubType == MEDIASUBTYPE_MJPG
-            && pvi->bmiHeader.biCompression == MAKEFOURCC('M','J','P','G'))
-        {
-          _resultingCapability.videoType = VideoType::kMJPEG;
-          return S_OK;  // This format is acceptable.
-        }
-        if(*SubType == MEDIASUBTYPE_I420
-            && pvi->bmiHeader.biCompression == MAKEFOURCC('I','4','2','0'))
-        {
-          _resultingCapability.videoType = VideoType::kI420;
-          return S_OK;  // This format is acceptable.
-        }
-        if(*SubType == MEDIASUBTYPE_YUY2
-            && pvi->bmiHeader.biCompression == MAKEFOURCC('Y','U','Y','2'))
-        {
-          _resultingCapability.videoType = VideoType::kYUY2;
-          ::Sleep(60);  // workaround for bad driver
-          return S_OK;  // This format is acceptable.
-        }
-        if(*SubType == MEDIASUBTYPE_UYVY
-            && pvi->bmiHeader.biCompression == MAKEFOURCC('U','Y','V','Y'))
-        {
-          _resultingCapability.videoType = VideoType::kUYVY;
-          return S_OK;  // This format is acceptable.
-        }
-
-        if(*SubType == MEDIASUBTYPE_HDYC)
-        {
-          _resultingCapability.videoType = VideoType::kUYVY;
-          return S_OK;  // This format is acceptable.
-        }
-        if(*SubType == MEDIASUBTYPE_RGB24
-            && pvi->bmiHeader.biCompression == BI_RGB)
-        {
-          _resultingCapability.videoType = VideoType::kRGB24;
-          return S_OK;  // This format is acceptable.
-        }
-    }
-    if(*formatType == FORMAT_VideoInfo2)
-    {
-        // VIDEOINFOHEADER2 that has dwInterlaceFlags
-        VIDEOINFOHEADER2 *pvi = (VIDEOINFOHEADER2 *) pMediaType->Format();
-
-        if(pvi == NULL)
-        {
-            return E_INVALIDARG;
-        }
-
-        LOG(LS_INFO) << "CheckMediaType width:" << pvi->bmiHeader.biWidth
-                     << " height:" << pvi->bmiHeader.biHeight
-                     << " Compression:0x" << std::hex
-                     << pvi->bmiHeader.biCompression;
-
-        _resultingCapability.width = pvi->bmiHeader.biWidth;
-
-        // Store the incoming height,
-        // for RGB24 we assume the frame to be upside down
-        if(*SubType == MEDIASUBTYPE_RGB24
-            && pvi->bmiHeader.biHeight > 0)
-        {
-           _resultingCapability.height = -(pvi->bmiHeader.biHeight);
-        }
-        else
-        {
-           _resultingCapability.height = abs(pvi->bmiHeader.biHeight);
-        }
-
-        if(*SubType == MEDIASUBTYPE_MJPG
-            && pvi->bmiHeader.biCompression == MAKEFOURCC('M','J','P','G'))
-        {
-          _resultingCapability.videoType = VideoType::kMJPEG;
-          return S_OK;  // This format is acceptable.
-        }
-        if(*SubType == MEDIASUBTYPE_I420
-            && pvi->bmiHeader.biCompression == MAKEFOURCC('I','4','2','0'))
-        {
-          _resultingCapability.videoType = VideoType::kI420;
-          return S_OK;  // This format is acceptable.
-        }
-        if(*SubType == MEDIASUBTYPE_YUY2
-            && pvi->bmiHeader.biCompression == MAKEFOURCC('Y','U','Y','2'))
-        {
-          _resultingCapability.videoType = VideoType::kYUY2;
-          return S_OK;  // This format is acceptable.
-        }
-        if(*SubType == MEDIASUBTYPE_UYVY
-            && pvi->bmiHeader.biCompression == MAKEFOURCC('U','Y','V','Y'))
-        {
-          _resultingCapability.videoType = VideoType::kUYVY;
-          return S_OK;  // This format is acceptable.
-        }
-
-        if(*SubType == MEDIASUBTYPE_HDYC)
-        {
-          _resultingCapability.videoType = VideoType::kUYVY;
-          return S_OK;  // This format is acceptable.
-        }
-        if(*SubType == MEDIASUBTYPE_RGB24
-            && pvi->bmiHeader.biCompression == BI_RGB)
-        {
-          _resultingCapability.videoType = VideoType::kRGB24;
-          return S_OK;  // This format is acceptable.
-        }
-    }
-    return E_INVALIDARG;
-}
-
-HRESULT
-CaptureInputPin::Receive ( IN IMediaSample * pIMediaSample )
-{
-    HRESULT hr = S_OK;
-
-    RTC_DCHECK(m_pFilter);
-    RTC_DCHECK(pIMediaSample);
-
-    // get the thread handle of the delivering thread inc its priority
-    if( _threadHandle == NULL)
-    {
-        HANDLE handle= GetCurrentThread();
-        SetThreadPriority(handle, THREAD_PRIORITY_HIGHEST);
-        _threadHandle = handle;
-
-        rtc::SetCurrentThreadName("webrtc_video_capture");
-    }
-
-    reinterpret_cast <CaptureSinkFilter *>(m_pFilter)->LockReceive();
-    hr = CBaseInputPin::Receive (pIMediaSample);
-
-    if (SUCCEEDED (hr))
-    {
-        const LONG length = pIMediaSample->GetActualDataLength();
-        RTC_DCHECK(length >= 0);
-
-        unsigned char* pBuffer = NULL;
-        if(S_OK != pIMediaSample->GetPointer(&pBuffer))
-        {
-            reinterpret_cast <CaptureSinkFilter *>(m_pFilter)->UnlockReceive();
-            return S_FALSE;
-        }
-
-        // NOTE: filter unlocked within Send call
-        reinterpret_cast <CaptureSinkFilter *> (m_pFilter)->ProcessCapturedFrame(
-            pBuffer, static_cast<size_t>(length), _resultingCapability);
-    }
-    else
-    {
-        reinterpret_cast <CaptureSinkFilter *>(m_pFilter)->UnlockReceive();
-    }
-
-    return hr;
-}
-
-// called under LockReceive
-HRESULT CaptureInputPin::SetMatchingMediaType(
-                                    const VideoCaptureCapability& capability)
-{
-
-    _requestedCapability = capability;
-    _resultingCapability = VideoCaptureCapability();
-    return S_OK;
-}
-//  ----------------------------------------------------------------------------
-CaptureSinkFilter::CaptureSinkFilter (IN TCHAR * tszName,
-                              IN LPUNKNOWN punk,
-                              OUT HRESULT * phr,
-                              VideoCaptureExternal& captureObserver)
-    : CBaseFilter(tszName,punk,& m_crtFilter,CLSID_SINKFILTER),
-      m_pInput(NULL),
-      _captureObserver(captureObserver)
-{
-    (* phr) = S_OK;
-    m_pInput = new CaptureInputPin(NAME ("VideoCaptureInputPin"),
-                                   this,
-                                   & m_crtFilter,
-                                   phr, L"VideoCapture");
-    if (m_pInput == NULL || FAILED (* phr))
-    {
-        (* phr) = FAILED (* phr) ? (* phr) : E_OUTOFMEMORY;
-        goto cleanup;
-    }
-    cleanup :
-    return;
-}
-
-CaptureSinkFilter::~CaptureSinkFilter()
-{
-    delete m_pInput;
-}
-
-int CaptureSinkFilter::GetPinCount()
-{
-    return 1;
-}
-
-CBasePin *
-CaptureSinkFilter::GetPin(IN int Index)
-{
-    CBasePin * pPin;
-    LockFilter ();
-    if (Index == 0)
-    {
-        pPin = m_pInput;
-    }
-    else
-    {
-        pPin = NULL;
-    }
-    UnlockFilter ();
-    return pPin;
-}
-
-STDMETHODIMP CaptureSinkFilter::Pause()
-{
-    LockReceive();
-    LockFilter();
-    if (m_State == State_Stopped)
-    {
-        //  change the state, THEN activate the input pin
-        m_State = State_Paused;
-        if (m_pInput && m_pInput->IsConnected())
-        {
-            m_pInput->Active();
-        }
-        if (m_pInput && !m_pInput->IsConnected())
-        {
-            m_State = State_Running;
-        }
-    }
-    else if (m_State == State_Running)
-    {
-        m_State = State_Paused;
-    }
-    UnlockFilter();
-    UnlockReceive();
-    return S_OK;
-}
-
-STDMETHODIMP CaptureSinkFilter::Stop()
-{
-    LockReceive();
-    LockFilter();
-
-    //  set the state
-    m_State = State_Stopped;
-
-    //  inactivate the pins
-    if (m_pInput)
-        m_pInput->Inactive();
-
-    UnlockFilter();
-    UnlockReceive();
-    return S_OK;
-}
-
-void CaptureSinkFilter::SetFilterGraph(IGraphBuilder* graph)
-{
-    LockFilter();
-    m_pGraph = graph;
-    UnlockFilter();
-}
-
-void CaptureSinkFilter::ProcessCapturedFrame(
-    unsigned char* pBuffer,
-    size_t length,
-    const VideoCaptureCapability& frameInfo)
-{
-    //  we have the receiver lock
-    if (m_State == State_Running)
-    {
-        _captureObserver.IncomingFrame(pBuffer, length, frameInfo);
-
-        // trying to hold it since it's only a memcpy
-        // IMPROVEMENT if this work move critsect
-        UnlockReceive();
-        return;
-    }
-    UnlockReceive();
-    return;
-}
-
-STDMETHODIMP CaptureSinkFilter::SetMatchingMediaType(
-                                        const VideoCaptureCapability& capability)
-{
-    LockReceive();
-    LockFilter();
-    HRESULT hr;
-    if (m_pInput)
-    {
-        hr = m_pInput->SetMatchingMediaType(capability);
-    }
-    else
-    {
-        hr = E_UNEXPECTED;
-    }
-    UnlockFilter();
-    UnlockReceive();
-    return hr;
-}
-
-STDMETHODIMP CaptureSinkFilter::GetClassID( OUT CLSID * pCLSID )
-{
-    (* pCLSID) = CLSID_SINKFILTER;
-    return S_OK;
-}
-
-}  // namespace videocapturemodule
-}  // namespace webrtc
diff --git a/modules/video_capture/windows/sink_filter_ds.h b/modules/video_capture/windows/sink_filter_ds.h
deleted file mode 100644
index f065f91..0000000
--- a/modules/video_capture/windows/sink_filter_ds.h
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- *  Copyright (c) 2011 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_VIDEO_CAPTURE_MAIN_SOURCE_WINDOWS_SINK_FILTER_DS_H_
-#define WEBRTC_MODULES_VIDEO_CAPTURE_MAIN_SOURCE_WINDOWS_SINK_FILTER_DS_H_
-
-#include <Streams.h> // Include base DS filter header files
-
-#include "webrtc/modules/video_capture/video_capture_defines.h"
-
-namespace webrtc
-{
-namespace videocapturemodule
-{
-//forward declaration
-
-class CaptureSinkFilter;
-/**
- *	input pin for camera input
- *
- */
-class CaptureInputPin: public CBaseInputPin
-{
-public:
-    VideoCaptureCapability _requestedCapability;
-    VideoCaptureCapability _resultingCapability;
-    HANDLE _threadHandle;
-
-    CaptureInputPin(IN TCHAR* szName,
-                    IN CaptureSinkFilter* pFilter,
-                    IN CCritSec * pLock,
-                    OUT HRESULT * pHr,
-                    IN LPCWSTR pszName);
-    virtual ~CaptureInputPin();
-
-    HRESULT GetMediaType (IN int iPos, OUT CMediaType * pmt);
-    HRESULT CheckMediaType (IN const CMediaType * pmt);
-    STDMETHODIMP Receive (IN IMediaSample *);
-    HRESULT SetMatchingMediaType(const VideoCaptureCapability& capability);
-};
-
-class CaptureSinkFilter: public CBaseFilter
-{
-
-public:
-    CaptureSinkFilter(IN TCHAR * tszName,
-                      IN LPUNKNOWN punk,
-                      OUT HRESULT * phr,
-                      VideoCaptureExternal& captureObserver);
-    virtual ~CaptureSinkFilter();
-
-    //  --------------------------------------------------------------------
-    //  class methods
-
-    void ProcessCapturedFrame(unsigned char* pBuffer, size_t length,
-                              const VideoCaptureCapability& frameInfo);
-    //  explicit receiver lock aquisition and release
-    void LockReceive()  { m_crtRecv.Lock();}
-    void UnlockReceive() {m_crtRecv.Unlock();}
-    //  explicit filter lock aquisition and release
-    void LockFilter() {m_crtFilter.Lock();}
-    void UnlockFilter() { m_crtFilter.Unlock(); }
-    void SetFilterGraph(IGraphBuilder* graph); // Used if EVR
-
-    //  --------------------------------------------------------------------
-    //  COM interfaces
-DECLARE_IUNKNOWN    ;
-    STDMETHODIMP SetMatchingMediaType(const VideoCaptureCapability& capability);
-
-    //  --------------------------------------------------------------------
-    //  CBaseFilter methods
-    int GetPinCount ();
-    CBasePin * GetPin ( IN int Index);
-    STDMETHODIMP Pause ();
-    STDMETHODIMP Stop ();
-    STDMETHODIMP GetClassID ( OUT CLSID * pCLSID);
-    //  --------------------------------------------------------------------
-    //  class factory calls this
-    static CUnknown * CreateInstance (IN LPUNKNOWN punk, OUT HRESULT * phr);
-private:
-    CCritSec m_crtFilter; //  filter lock
-    CCritSec m_crtRecv;  //  receiver lock; always acquire before filter lock
-    CaptureInputPin * m_pInput;
-    VideoCaptureExternal& _captureObserver;
-};
-}  // namespace videocapturemodule
-}  // namespace webrtc
-#endif // WEBRTC_MODULES_VIDEO_CAPTURE_MAIN_SOURCE_WINDOWS_SINK_FILTER_DS_H_
diff --git a/modules/video_capture/windows/video_capture_ds.cc b/modules/video_capture/windows/video_capture_ds.cc
deleted file mode 100644
index 46747ba..0000000
--- a/modules/video_capture/windows/video_capture_ds.cc
+++ /dev/null
@@ -1,392 +0,0 @@
-/*
- *  Copyright (c) 2012 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/video_capture/windows/video_capture_ds.h"
-
-#include "webrtc/modules/video_capture/video_capture_config.h"
-#include "webrtc/modules/video_capture/windows/help_functions_ds.h"
-#include "webrtc/modules/video_capture/windows/sink_filter_ds.h"
-#include "webrtc/rtc_base/logging.h"
-
-#include <Dvdmedia.h> // VIDEOINFOHEADER2
-
-namespace webrtc
-{
-namespace videocapturemodule
-{
-VideoCaptureDS::VideoCaptureDS()
-    : _captureFilter(NULL),
-      _graphBuilder(NULL), _mediaControl(NULL), _sinkFilter(NULL),
-      _inputSendPin(NULL), _outputCapturePin(NULL), _dvFilter(NULL),
-      _inputDvPin(NULL), _outputDvPin(NULL)
-{
-}
-
-VideoCaptureDS::~VideoCaptureDS()
-{
-    if (_mediaControl)
-    {
-        _mediaControl->Stop();
-    }
-    if (_graphBuilder)
-    {
-        if (_sinkFilter)
-            _graphBuilder->RemoveFilter(_sinkFilter);
-        if (_captureFilter)
-            _graphBuilder->RemoveFilter(_captureFilter);
-        if (_dvFilter)
-            _graphBuilder->RemoveFilter(_dvFilter);
-    }
-    RELEASE_AND_CLEAR(_inputSendPin);
-    RELEASE_AND_CLEAR(_outputCapturePin);
-
-    RELEASE_AND_CLEAR(_captureFilter); // release the capture device
-    RELEASE_AND_CLEAR(_sinkFilter);
-    RELEASE_AND_CLEAR(_dvFilter);
-
-    RELEASE_AND_CLEAR(_mediaControl);
-
-    RELEASE_AND_CLEAR(_inputDvPin);
-    RELEASE_AND_CLEAR(_outputDvPin);
-
-    RELEASE_AND_CLEAR(_graphBuilder);
-}
-
-int32_t VideoCaptureDS::Init(const char* deviceUniqueIdUTF8)
-{
-    const int32_t nameLength =
-        (int32_t) strlen((char*) deviceUniqueIdUTF8);
-    if (nameLength > kVideoCaptureUniqueNameLength)
-        return -1;
-
-    // Store the device name
-    _deviceUniqueId = new (std::nothrow) char[nameLength + 1];
-    memcpy(_deviceUniqueId, deviceUniqueIdUTF8, nameLength + 1);
-
-    if (_dsInfo.Init() != 0)
-        return -1;
-
-    _captureFilter = _dsInfo.GetDeviceFilter(deviceUniqueIdUTF8);
-    if (!_captureFilter)
-    {
-        LOG(LS_INFO) << "Failed to create capture filter.";
-        return -1;
-    }
-
-    // Get the interface for DirectShow's GraphBuilder
-    HRESULT hr = CoCreateInstance(CLSID_FilterGraph, NULL,
-                                  CLSCTX_INPROC_SERVER, IID_IGraphBuilder,
-                                  (void **) &_graphBuilder);
-    if (FAILED(hr))
-    {
-        LOG(LS_INFO) << "Failed to create graph builder.";
-        return -1;
-    }
-
-    hr = _graphBuilder->QueryInterface(IID_IMediaControl,
-                                       (void **) &_mediaControl);
-    if (FAILED(hr))
-    {
-        LOG(LS_INFO) << "Failed to create media control builder.";
-        return -1;
-    }
-    hr = _graphBuilder->AddFilter(_captureFilter, CAPTURE_FILTER_NAME);
-    if (FAILED(hr))
-    {
-        LOG(LS_INFO) << "Failed to add the capture device to the graph.";
-        return -1;
-    }
-
-    _outputCapturePin = GetOutputPin(_captureFilter, PIN_CATEGORY_CAPTURE);
-
-    // Create the sink filte used for receiving Captured frames.
-    _sinkFilter = new CaptureSinkFilter(SINK_FILTER_NAME, NULL, &hr,
-                                        *this);
-    if (hr != S_OK)
-    {
-        LOG(LS_INFO) << "Failed to create send filter";
-        return -1;
-    }
-    _sinkFilter->AddRef();
-
-    hr = _graphBuilder->AddFilter(_sinkFilter, SINK_FILTER_NAME);
-    if (FAILED(hr))
-    {
-        LOG(LS_INFO) << "Failed to add the send filter to the graph.";
-        return -1;
-    }
-    _inputSendPin = GetInputPin(_sinkFilter);
-
-    // Temporary connect here.
-    // This is done so that no one else can use the capture device.
-    if (SetCameraOutput(_requestedCapability) != 0)
-    {
-        return -1;
-    }
-    hr = _mediaControl->Pause();
-    if (FAILED(hr))
-    {
-        LOG(LS_INFO)
-            << "Failed to Pause the Capture device. Is it already occupied? "
-            << hr;
-        return -1;
-    }
-    LOG(LS_INFO) << "Capture device '" << deviceUniqueIdUTF8
-                 << "' initialized.";
-    return 0;
-}
-
-int32_t VideoCaptureDS::StartCapture(
-                                      const VideoCaptureCapability& capability)
-{
-    rtc::CritScope cs(&_apiCs);
-
-    if (capability != _requestedCapability)
-    {
-        DisconnectGraph();
-
-        if (SetCameraOutput(capability) != 0)
-        {
-            return -1;
-        }
-    }
-    HRESULT hr = _mediaControl->Run();
-    if (FAILED(hr))
-    {
-        LOG(LS_INFO) << "Failed to start the Capture device.";
-        return -1;
-    }
-    return 0;
-}
-
-int32_t VideoCaptureDS::StopCapture()
-{
-    rtc::CritScope cs(&_apiCs);
-
-    HRESULT hr = _mediaControl->Pause();
-    if (FAILED(hr))
-    {
-        LOG(LS_INFO) << "Failed to stop the capture graph. " << hr;
-        return -1;
-    }
-    return 0;
-}
-bool VideoCaptureDS::CaptureStarted()
-{
-    OAFilterState state = 0;
-    HRESULT hr = _mediaControl->GetState(1000, &state);
-    if (hr != S_OK && hr != VFW_S_CANT_CUE)
-    {
-        LOG(LS_INFO) << "Failed to get the CaptureStarted status";
-    }
-    LOG(LS_INFO) << "CaptureStarted " << state;
-    return state == State_Running;
-
-}
-int32_t VideoCaptureDS::CaptureSettings(
-                                             VideoCaptureCapability& settings)
-{
-    settings = _requestedCapability;
-    return 0;
-}
-
-int32_t VideoCaptureDS::SetCameraOutput(
-                             const VideoCaptureCapability& requestedCapability)
-{
-
-    // Get the best matching capability
-    VideoCaptureCapability capability;
-    int32_t capabilityIndex;
-
-    // Store the new requested size
-    _requestedCapability = requestedCapability;
-    // Match the requested capability with the supported.
-    if ((capabilityIndex = _dsInfo.GetBestMatchedCapability(_deviceUniqueId,
-                                                            _requestedCapability,
-                                                            capability)) < 0)
-    {
-        return -1;
-    }
-    //Reduce the frame rate if possible.
-    if (capability.maxFPS > requestedCapability.maxFPS)
-    {
-        capability.maxFPS = requestedCapability.maxFPS;
-    } else if (capability.maxFPS <= 0)
-    {
-        capability.maxFPS = 30;
-    }
-
-    // Convert it to the windows capability index since they are not nexessary
-    // the same
-    VideoCaptureCapabilityWindows windowsCapability;
-    if (_dsInfo.GetWindowsCapability(capabilityIndex, windowsCapability) != 0)
-    {
-        return -1;
-    }
-
-    IAMStreamConfig* streamConfig = NULL;
-    AM_MEDIA_TYPE *pmt = NULL;
-    VIDEO_STREAM_CONFIG_CAPS caps;
-
-    HRESULT hr = _outputCapturePin->QueryInterface(IID_IAMStreamConfig,
-                                                   (void**) &streamConfig);
-    if (hr)
-    {
-        LOG(LS_INFO) << "Can't get the Capture format settings.";
-        return -1;
-    }
-
-    //Get the windows capability from the capture device
-    bool isDVCamera = false;
-    hr = streamConfig->GetStreamCaps(
-                                    windowsCapability.directShowCapabilityIndex,
-                                    &pmt, reinterpret_cast<BYTE*> (&caps));
-    if (!FAILED(hr))
-    {
-        if (pmt->formattype == FORMAT_VideoInfo2)
-        {
-            VIDEOINFOHEADER2* h =
-                reinterpret_cast<VIDEOINFOHEADER2*> (pmt->pbFormat);
-            if (capability.maxFPS > 0
-                && windowsCapability.supportFrameRateControl)
-            {
-                h->AvgTimePerFrame = REFERENCE_TIME(10000000.0
-                                                    / capability.maxFPS);
-            }
-        }
-        else
-        {
-            VIDEOINFOHEADER* h = reinterpret_cast<VIDEOINFOHEADER*>
-                                (pmt->pbFormat);
-            if (capability.maxFPS > 0
-                && windowsCapability.supportFrameRateControl)
-            {
-                h->AvgTimePerFrame = REFERENCE_TIME(10000000.0
-                                                    / capability.maxFPS);
-            }
-
-        }
-
-        // Set the sink filter to request this capability
-        _sinkFilter->SetMatchingMediaType(capability);
-        //Order the capture device to use this capability
-        hr += streamConfig->SetFormat(pmt);
-
-        //Check if this is a DV camera and we need to add MS DV Filter
-        if (pmt->subtype == MEDIASUBTYPE_dvsl
-           || pmt->subtype == MEDIASUBTYPE_dvsd
-           || pmt->subtype == MEDIASUBTYPE_dvhd)
-            isDVCamera = true; // This is a DV camera. Use MS DV filter
-    }
-    RELEASE_AND_CLEAR(streamConfig);
-
-    if (FAILED(hr))
-    {
-        LOG(LS_INFO) << "Failed to set capture device output format";
-        return -1;
-    }
-
-    if (isDVCamera)
-    {
-        hr = ConnectDVCamera();
-    }
-    else
-    {
-        hr = _graphBuilder->ConnectDirect(_outputCapturePin, _inputSendPin,
-                                          NULL);
-    }
-    if (hr != S_OK)
-    {
-        LOG(LS_INFO) << "Failed to connect the Capture graph " << hr;
-        return -1;
-    }
-    return 0;
-}
-
-int32_t VideoCaptureDS::DisconnectGraph()
-{
-    HRESULT hr = _mediaControl->Stop();
-    hr += _graphBuilder->Disconnect(_outputCapturePin);
-    hr += _graphBuilder->Disconnect(_inputSendPin);
-
-    //if the DV camera filter exist
-    if (_dvFilter)
-    {
-        _graphBuilder->Disconnect(_inputDvPin);
-        _graphBuilder->Disconnect(_outputDvPin);
-    }
-    if (hr != S_OK)
-    {
-        LOG(LS_ERROR)
-            << "Failed to Stop the Capture device for reconfiguration "
-            << hr;
-        return -1;
-    }
-    return 0;
-}
-HRESULT VideoCaptureDS::ConnectDVCamera()
-{
-    HRESULT hr = S_OK;
-
-    if (!_dvFilter)
-    {
-        hr = CoCreateInstance(CLSID_DVVideoCodec, NULL, CLSCTX_INPROC,
-                              IID_IBaseFilter, (void **) &_dvFilter);
-        if (hr != S_OK)
-        {
-            LOG(LS_INFO) << "Failed to create the dv decoder: " << hr;
-            return hr;
-        }
-        hr = _graphBuilder->AddFilter(_dvFilter, L"VideoDecoderDV");
-        if (hr != S_OK)
-        {
-            LOG(LS_INFO) << "Failed to add the dv decoder to the graph: " << hr;
-            return hr;
-        }
-        _inputDvPin = GetInputPin(_dvFilter);
-        if (_inputDvPin == NULL)
-        {
-            LOG(LS_INFO) << "Failed to get input pin from DV decoder";
-            return -1;
-        }
-        _outputDvPin = GetOutputPin(_dvFilter, GUID_NULL);
-        if (_outputDvPin == NULL)
-        {
-            LOG(LS_INFO) << "Failed to get output pin from DV decoder";
-            return -1;
-        }
-    }
-    hr = _graphBuilder->ConnectDirect(_outputCapturePin, _inputDvPin, NULL);
-    if (hr != S_OK)
-    {
-        LOG(LS_INFO) << "Failed to connect capture device to the dv devoder: "
-                     << hr;
-        return hr;
-    }
-
-    hr = _graphBuilder->ConnectDirect(_outputDvPin, _inputSendPin, NULL);
-    if (hr != S_OK)
-    {
-        if (hr == HRESULT_FROM_WIN32(ERROR_TOO_MANY_OPEN_FILES))
-        {
-            LOG(LS_INFO) << "Failed to connect the capture device, busy";
-        }
-        else
-        {
-            LOG(LS_INFO)
-                << "Failed to connect capture device to the send graph: "
-                << hr;
-        }
-        return hr;
-    }
-    return hr;
-}
-}  // namespace videocapturemodule
-}  // namespace webrtc
diff --git a/modules/video_capture/windows/video_capture_ds.h b/modules/video_capture/windows/video_capture_ds.h
deleted file mode 100644
index 7e63e56..0000000
--- a/modules/video_capture/windows/video_capture_ds.h
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- *  Copyright (c) 2012 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_VIDEO_CAPTURE_MAIN_SOURCE_WINDOWS_VIDEO_CAPTURE_DS_H_
-#define WEBRTC_MODULES_VIDEO_CAPTURE_MAIN_SOURCE_WINDOWS_VIDEO_CAPTURE_DS_H_
-
-#include "webrtc/modules/video_capture/video_capture_impl.h"
-#include "webrtc/modules/video_capture/windows/device_info_ds.h"
-
-#define CAPTURE_FILTER_NAME L"VideoCaptureFilter"
-#define SINK_FILTER_NAME L"SinkFilter"
-
-namespace webrtc
-{
-namespace videocapturemodule
-{
-// Forward declaraion
-class CaptureSinkFilter;
-
-class VideoCaptureDS: public VideoCaptureImpl
-{
-public:
-    VideoCaptureDS();
-
-    virtual int32_t Init(const char* deviceUniqueIdUTF8);
-
-    /*************************************************************************
-     *
-     *   Start/Stop
-     *
-     *************************************************************************/
-    virtual int32_t
-        StartCapture(const VideoCaptureCapability& capability);
-    virtual int32_t StopCapture();
-
-    /**************************************************************************
-     *
-     *   Properties of the set device
-     *
-     **************************************************************************/
-
-    virtual bool CaptureStarted();
-    virtual int32_t CaptureSettings(VideoCaptureCapability& settings);
-
-protected:
-    virtual ~VideoCaptureDS();
-
-    // Help functions
-
-    int32_t
-        SetCameraOutput(const VideoCaptureCapability& requestedCapability);
-    int32_t DisconnectGraph();
-    HRESULT VideoCaptureDS::ConnectDVCamera();
-
-    DeviceInfoDS _dsInfo;
-
-    IBaseFilter* _captureFilter;
-    IGraphBuilder* _graphBuilder;
-    IMediaControl* _mediaControl;
-    CaptureSinkFilter* _sinkFilter;
-    IPin* _inputSendPin;
-    IPin* _outputCapturePin;
-
-    // Microsoft DV interface (external DV cameras)
-    IBaseFilter* _dvFilter;
-    IPin* _inputDvPin;
-    IPin* _outputDvPin;
-
-};
-}  // namespace videocapturemodule
-}  // namespace webrtc
-#endif // WEBRTC_MODULES_VIDEO_CAPTURE_MAIN_SOURCE_WINDOWS_VIDEO_CAPTURE_DS_H_
diff --git a/modules/video_capture/windows/video_capture_factory_windows.cc b/modules/video_capture/windows/video_capture_factory_windows.cc
deleted file mode 100644
index f53ea99..0000000
--- a/modules/video_capture/windows/video_capture_factory_windows.cc
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- *  Copyright (c) 2012 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/video_capture/windows/video_capture_ds.h"
-#include "webrtc/modules/video_capture/windows/video_capture_mf.h"
-#include "webrtc/rtc_base/refcount.h"
-#include "webrtc/rtc_base/scoped_ref_ptr.h"
-
-namespace webrtc {
-namespace videocapturemodule {
-
-// static
-VideoCaptureModule::DeviceInfo* VideoCaptureImpl::CreateDeviceInfo() {
-  // TODO(tommi): Use the Media Foundation version on Vista and up.
-  return DeviceInfoDS::Create();
-}
-
-rtc::scoped_refptr<VideoCaptureModule> VideoCaptureImpl::Create(
-    const char* device_id) {
-  if (device_id == nullptr)
-    return nullptr;
-
-  // TODO(tommi): Use Media Foundation implementation for Vista and up.
-  rtc::scoped_refptr<VideoCaptureDS> capture(
-      new rtc::RefCountedObject<VideoCaptureDS>());
-  if (capture->Init(device_id) != 0) {
-    return nullptr;
-  }
-
-  return capture;
-}
-
-}  // namespace videocapturemodule
-}  // namespace webrtc
diff --git a/modules/video_capture/windows/video_capture_mf.cc b/modules/video_capture/windows/video_capture_mf.cc
deleted file mode 100644
index cd3faf7..0000000
--- a/modules/video_capture/windows/video_capture_mf.cc
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- *  Copyright (c) 2012 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/video_capture/windows/video_capture_mf.h"
-
-namespace webrtc {
-namespace videocapturemodule {
-
-VideoCaptureMF::VideoCaptureMF() {}
-VideoCaptureMF::~VideoCaptureMF() {}
-
-int32_t VideoCaptureMF::Init(const char* device_id) {
-  return 0;
-}
-
-int32_t VideoCaptureMF::StartCapture(
-    const VideoCaptureCapability& capability) {
-  return -1;
-}
-
-int32_t VideoCaptureMF::StopCapture() {
-  return -1;
-}
-
-bool VideoCaptureMF::CaptureStarted() {
-  return false;
-}
-
-int32_t VideoCaptureMF::CaptureSettings(
-    VideoCaptureCapability& settings) {
-  return -1;
-}
-
-}  // namespace videocapturemodule
-}  // namespace webrtc
diff --git a/modules/video_capture/windows/video_capture_mf.h b/modules/video_capture/windows/video_capture_mf.h
deleted file mode 100644
index 5b58f89..0000000
--- a/modules/video_capture/windows/video_capture_mf.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- *  Copyright (c) 2012 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_VIDEO_CAPTURE_WINDOWS_VIDEO_CAPTURE_MF_H_
-#define WEBRTC_MODULES_VIDEO_CAPTURE_WINDOWS_VIDEO_CAPTURE_MF_H_
-
-#include "webrtc/modules/video_capture/video_capture_impl.h"
-
-namespace webrtc {
-namespace videocapturemodule {
-
-// VideoCapture implementation that uses the Media Foundation API on Windows.
-// This will replace the DirectShow based implementation on Vista and higher.
-// TODO(tommi): Finish implementing and switch out the DS in the factory method
-// for supported platforms.
-class VideoCaptureMF : public VideoCaptureImpl {
- public:
-  VideoCaptureMF();
-
-  int32_t Init(const char* device_id);
-
-  // Overrides from VideoCaptureImpl.
-  virtual int32_t StartCapture(const VideoCaptureCapability& capability);
-  virtual int32_t StopCapture();
-  virtual bool CaptureStarted();
-  virtual int32_t CaptureSettings(
-      VideoCaptureCapability& settings);  // NOLINT
-
- protected:
-  virtual ~VideoCaptureMF();
-};
-
-}  // namespace videocapturemodule
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_VIDEO_CAPTURE_WINDOWS_VIDEO_CAPTURE_MF_H_
diff --git a/modules/video_coding/BUILD.gn b/modules/video_coding/BUILD.gn
deleted file mode 100644
index 3d3a3af..0000000
--- a/modules/video_coding/BUILD.gn
+++ /dev/null
@@ -1,554 +0,0 @@
-# Copyright (c) 2014 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.
-
-import("../../webrtc.gni")
-
-rtc_static_library("video_coding") {
-  sources = [
-    "codec_database.cc",
-    "codec_database.h",
-    "codec_timer.cc",
-    "codec_timer.h",
-    "decoding_state.cc",
-    "decoding_state.h",
-    "encoded_frame.cc",
-    "encoded_frame.h",
-    "fec_rate_table.h",
-    "frame_buffer.cc",
-    "frame_buffer.h",
-    "frame_buffer2.cc",
-    "frame_buffer2.h",
-    "frame_object.cc",
-    "frame_object.h",
-    "generic_decoder.cc",
-    "generic_decoder.h",
-    "generic_encoder.cc",
-    "generic_encoder.h",
-    "h264_sprop_parameter_sets.cc",
-    "h264_sprop_parameter_sets.h",
-    "h264_sps_pps_tracker.cc",
-    "h264_sps_pps_tracker.h",
-    "histogram.cc",
-    "histogram.h",
-    "include/video_codec_initializer.h",
-    "include/video_coding.h",
-    "include/video_coding_defines.h",
-    "inter_frame_delay.cc",
-    "inter_frame_delay.h",
-    "internal_defines.h",
-    "jitter_buffer.cc",
-    "jitter_buffer.h",
-    "jitter_buffer_common.h",
-    "jitter_estimator.cc",
-    "jitter_estimator.h",
-    "media_opt_util.cc",
-    "media_opt_util.h",
-    "media_optimization.cc",
-    "media_optimization.h",
-    "nack_fec_tables.h",
-    "nack_module.cc",
-    "nack_module.h",
-    "packet.cc",
-    "packet.h",
-    "packet_buffer.cc",
-    "packet_buffer.h",
-    "protection_bitrate_calculator.cc",
-    "protection_bitrate_calculator.h",
-    "qp_parser.cc",
-    "qp_parser.h",
-    "receiver.cc",
-    "receiver.h",
-    "rtp_frame_reference_finder.cc",
-    "rtp_frame_reference_finder.h",
-    "rtt_filter.cc",
-    "rtt_filter.h",
-    "session_info.cc",
-    "session_info.h",
-    "timestamp_map.cc",
-    "timestamp_map.h",
-    "timing.cc",
-    "timing.h",
-    "video_codec_initializer.cc",
-    "video_coding_impl.cc",
-    "video_coding_impl.h",
-    "video_receiver.cc",
-    "video_sender.cc",
-  ]
-
-  # TODO(jschuh): Bug 1348: fix this warning.
-  configs += [ "//build/config/compiler:no_size_t_to_int_warning" ]
-
-  if (!build_with_chromium && is_clang) {
-    # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-    suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-  }
-
-  deps = [
-    ":video_coding_utility",
-    ":webrtc_h264",
-    ":webrtc_i420",
-    ":webrtc_vp8",
-    ":webrtc_vp9",
-    "..:module_api",
-    "../..:webrtc_common",
-    "../../api:optional",
-    "../../call:video_stream_api",
-    "../../common_video",
-    "../../rtc_base:rtc_base",
-    "../../rtc_base:rtc_base_approved",
-    "../../rtc_base:rtc_numerics",
-    "../../rtc_base:rtc_task_queue",
-    "../../rtc_base:sequenced_task_checker",
-    "../../system_wrappers",
-    "../pacing",
-    "../rtp_rtcp:rtp_rtcp",
-    "../utility:utility",
-  ]
-}
-
-rtc_static_library("video_coding_utility") {
-  sources = [
-    "utility/default_video_bitrate_allocator.cc",
-    "utility/default_video_bitrate_allocator.h",
-    "utility/frame_dropper.cc",
-    "utility/frame_dropper.h",
-    "utility/ivf_file_writer.cc",
-    "utility/ivf_file_writer.h",
-    "utility/moving_average.cc",
-    "utility/moving_average.h",
-    "utility/quality_scaler.cc",
-    "utility/quality_scaler.h",
-    "utility/vp8_header_parser.cc",
-    "utility/vp8_header_parser.h",
-    "utility/vp9_uncompressed_header_parser.cc",
-    "utility/vp9_uncompressed_header_parser.h",
-  ]
-
-  if (!build_with_chromium && is_clang) {
-    # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-    suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-  }
-
-  deps = [
-    "..:module_api",
-    "../..:webrtc_common",
-    "../../api:optional",
-    "../../api/video_codecs:video_codecs_api",
-    "../../common_video",
-    "../../modules/rtp_rtcp:rtp_rtcp",
-    "../../rtc_base:rtc_base_approved",
-    "../../rtc_base:rtc_numerics",
-    "../../rtc_base:rtc_task_queue",
-    "../../rtc_base:sequenced_task_checker",
-    "../../system_wrappers",
-  ]
-}
-
-rtc_static_library("webrtc_h264") {
-  sources = [
-    "codecs/h264/h264.cc",
-    "codecs/h264/include/h264.h",
-  ]
-
-  if (!build_with_chromium && is_clang) {
-    # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-    suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-  }
-
-  defines = []
-  deps = [
-    ":video_coding_utility",
-    "../../media:rtc_media_base",
-    "../../rtc_base:rtc_base_approved",
-    "../../system_wrappers",
-  ]
-
-  if (rtc_use_h264) {
-    defines += [ "WEBRTC_USE_H264" ]
-    if (rtc_initialize_ffmpeg) {
-      defines += [ "WEBRTC_INITIALIZE_FFMPEG" ]
-    }
-    sources += [
-      "codecs/h264/h264_decoder_impl.cc",
-      "codecs/h264/h264_decoder_impl.h",
-      "codecs/h264/h264_encoder_impl.cc",
-      "codecs/h264/h264_encoder_impl.h",
-    ]
-    deps += [
-      "../../common_video",
-      "../../media:rtc_media_base",
-      "//third_party/ffmpeg:ffmpeg",
-      "//third_party/openh264:encoder",
-    ]
-  }
-}
-
-rtc_static_library("webrtc_i420") {
-  sources = [
-    "codecs/i420/i420.cc",
-    "codecs/i420/include/i420.h",
-  ]
-
-  if (!build_with_chromium && is_clang) {
-    # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-    suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-  }
-
-  deps = [
-    "../..:webrtc_common",
-    "../../common_video:common_video",
-    "../../rtc_base:rtc_base_approved",
-    "../../system_wrappers",
-  ]
-}
-
-rtc_static_library("webrtc_vp8") {
-  sources = [
-    "codecs/vp8/default_temporal_layers.cc",
-    "codecs/vp8/default_temporal_layers.h",
-    "codecs/vp8/include/vp8.h",
-    "codecs/vp8/include/vp8_common_types.h",
-    "codecs/vp8/screenshare_layers.cc",
-    "codecs/vp8/screenshare_layers.h",
-    "codecs/vp8/simulcast_rate_allocator.cc",
-    "codecs/vp8/simulcast_rate_allocator.h",
-    "codecs/vp8/temporal_layers.h",
-    "codecs/vp8/vp8_impl.cc",
-    "codecs/vp8/vp8_impl.h",
-  ]
-
-  # TODO(jschuh): Bug 1348: fix this warning.
-  configs += [ "//build/config/compiler:no_size_t_to_int_warning" ]
-
-  if (!build_with_chromium && is_clang) {
-    # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-    suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-  }
-
-  deps = [
-    ":video_coding_utility",
-    "..:module_api",
-    "../..:webrtc_common",
-    "../../api:optional",
-    "../../api/video_codecs:video_codecs_api",
-    "../../common_video",
-    "../../rtc_base:rtc_base_approved",
-    "../../rtc_base:rtc_numerics",
-    "../../rtc_base:sequenced_task_checker",
-    "../../system_wrappers",
-  ]
-  if (rtc_build_libvpx) {
-    deps += [ rtc_libvpx_dir ]
-  }
-}
-
-rtc_static_library("webrtc_vp9") {
-  if (rtc_libvpx_build_vp9) {
-    sources = [
-      "codecs/vp9/include/vp9.h",
-      "codecs/vp9/screenshare_layers.cc",
-      "codecs/vp9/screenshare_layers.h",
-      "codecs/vp9/vp9_frame_buffer_pool.cc",
-      "codecs/vp9/vp9_frame_buffer_pool.h",
-      "codecs/vp9/vp9_impl.cc",
-      "codecs/vp9/vp9_impl.h",
-    ]
-  } else {
-    sources = [
-      "codecs/vp9/vp9_noop.cc",
-    ]
-  }
-
-  if (!build_with_chromium && is_clang) {
-    # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-    suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-  }
-
-  deps = [
-    ":video_coding_utility",
-    "..:module_api",
-    "../../common_video",
-    "../../rtc_base:rtc_base_approved",
-    "../../system_wrappers",
-  ]
-  if (rtc_build_libvpx) {
-    deps += [ rtc_libvpx_dir ]
-  }
-}
-
-if (rtc_include_tests) {
-  if (is_ios || is_mac) {
-    rtc_static_library("codec_test_objc") {
-      sources = [
-        "codecs/test/objc_codec_h264_test.h",
-        "codecs/test/objc_codec_h264_test.mm",
-      ]
-      deps = [
-        "../../api:video_frame_api",
-        "../../api/video_codecs:video_codecs_api",
-        "../../media:rtc_audio_video",
-        "../../modules:module_api",
-        "../../sdk:common_objc",
-        "../../sdk:peerconnection_objc",
-        "../../sdk:peerconnectionfactory_objc",
-        "../../sdk:videotoolbox_objc",
-        "../../sdk:videotracksource_objc",
-      ]
-
-      if (!build_with_chromium && is_clang) {
-        # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-        suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-      }
-    }
-  }
-
-  rtc_source_set("simulcast_test_utility") {
-    testonly = true
-    sources = [
-      "codecs/vp8/simulcast_test_utility.h",
-    ]
-
-    if (!build_with_chromium && is_clang) {
-      # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-    }
-
-    deps = [
-      ":video_coding",
-      ":webrtc_vp8",
-      "../../api:video_frame_api",
-      "../../common_video:common_video",
-      "../../rtc_base:rtc_base_approved",
-      "../../test:test_support",
-    ]
-  }
-
-  rtc_source_set("video_codecs_test_framework") {
-    testonly = true
-    sources = [
-      "codecs/test/mock/mock_packet_manipulator.h",
-      "codecs/test/packet_manipulator.cc",
-      "codecs/test/packet_manipulator.h",
-      "codecs/test/predictive_packet_manipulator.cc",
-      "codecs/test/predictive_packet_manipulator.h",
-      "codecs/test/stats.cc",
-      "codecs/test/stats.h",
-      "codecs/test/video_codec_test.cc",
-      "codecs/test/video_codec_test.h",
-      "codecs/test/videoprocessor.cc",
-      "codecs/test/videoprocessor.h",
-    ]
-
-    if (!build_with_chromium && is_clang) {
-      # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-    }
-
-    deps = [
-      ":video_coding",
-      ":video_coding_utility",
-      ":webrtc_vp8",
-      "../..:webrtc_common",
-      "../../api/video_codecs:video_codecs_api",
-      "../../common_video:common_video",
-      "../../rtc_base:rtc_base_approved",
-      "../../rtc_base:rtc_task_queue",
-      "../../rtc_base:sequenced_task_checker",
-      "../../system_wrappers:system_wrappers",
-      "../../test:test_support",
-      "../../test:video_test_common",
-      "../../test:video_test_support",
-    ]
-  }
-
-  video_coding_modules_tests_resources = [
-    "../../../resources/foreman_128x96.yuv",
-    "../../../resources/foreman_160x120.yuv",
-    "../../../resources/foreman_176x144.yuv",
-    "../../../resources/foreman_320x240.yuv",
-  ]
-
-  if (is_ios || is_mac) {
-    bundle_data("video_coding_modules_tests_resources_bundle_data") {
-      testonly = true
-      sources = video_coding_modules_tests_resources
-      outputs = [
-        "{{bundle_resources_dir}}/{{source_file_part}}",
-      ]
-    }
-  }
-
-  rtc_source_set("video_coding_modules_tests") {
-    testonly = true
-
-    # Skip restricting visibility on mobile platforms since the tests on those
-    # gets additional generated targets which would require many lines here to
-    # cover (which would be confusing to read and hard to maintain).
-    if (!is_android && !is_ios) {
-      visibility = [ "..:modules_tests" ]
-    }
-    sources = [
-      "codecs/h264/test/h264_impl_unittest.cc",
-      "codecs/test/videoprocessor_integrationtest.cc",
-      "codecs/test/videoprocessor_integrationtest.h",
-      "codecs/test/videoprocessor_integrationtest_libvpx.cc",
-      "codecs/test/videoprocessor_integrationtest_openh264.cc",
-      "codecs/test/videoprocessor_integrationtest_parameterized.cc",
-      "codecs/vp8/test/vp8_impl_unittest.cc",
-      "codecs/vp9/test/vp9_impl_unittest.cc",
-    ]
-
-    deps = [
-      ":video_codecs_test_framework",
-      ":video_coding",
-      ":video_coding_utility",
-      ":webrtc_h264",
-      ":webrtc_vp8",
-      ":webrtc_vp9",
-      "../..:webrtc_common",
-      "../../api:optional",
-      "../../api:video_frame_api",
-      "../../common_video",
-      "../../media:rtc_audio_video",
-      "../../rtc_base:rtc_base_approved",
-      "../../system_wrappers",
-      "../../test:field_trial",
-      "../../test:test_support",
-      "../../test:video_test_common",
-      "../../test:video_test_support",
-      "../video_capture",
-    ]
-
-    data = video_coding_modules_tests_resources
-
-    if (is_android) {
-      sources += [
-        "codecs/test/android_test_initializer.cc",
-        "codecs/test/android_test_initializer.h",
-        "codecs/test/videoprocessor_integrationtest_mediacodec.cc",
-      ]
-
-      deps += [
-        "../../sdk/android:libjingle_peerconnection_jni",
-        "//base",
-      ]
-    }
-
-    if (is_ios || is_mac) {
-      deps += [
-        ":codec_test_objc",
-        ":video_coding_modules_tests_resources_bundle_data",
-        "../../media:rtc_media_base",
-        "../../sdk:videotoolbox_objc",
-      ]
-    }
-
-    if (rtc_use_h264) {
-      defines = [ "WEBRTC_USE_H264" ]
-    }
-
-    if (!build_with_chromium && is_clang) {
-      # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-    }
-  }
-
-  rtc_source_set("video_coding_unittests") {
-    testonly = true
-
-    # Skip restricting visibility on mobile platforms since the tests on those
-    # gets additional generated targets which would require many lines here to
-    # cover (which would be confusing to read and hard to maintain).
-    if (!is_android && !is_ios) {
-      visibility = [ "..:modules_unittests" ]
-    }
-    sources = [
-      "codecs/test/packet_manipulator_unittest.cc",
-      "codecs/test/stats_unittest.cc",
-      "codecs/test/videoprocessor_unittest.cc",
-      "codecs/vp8/default_temporal_layers_unittest.cc",
-      "codecs/vp8/screenshare_layers_unittest.cc",
-      "codecs/vp8/simulcast_unittest.cc",
-      "decoding_state_unittest.cc",
-      "frame_buffer2_unittest.cc",
-      "generic_encoder_unittest.cc",
-      "h264_sprop_parameter_sets_unittest.cc",
-      "h264_sps_pps_tracker_unittest.cc",
-      "histogram_unittest.cc",
-      "include/mock/mock_vcm_callbacks.h",
-      "jitter_buffer_unittest.cc",
-      "jitter_estimator_tests.cc",
-      "nack_module_unittest.cc",
-      "protection_bitrate_calculator_unittest.cc",
-      "receiver_unittest.cc",
-      "rtp_frame_reference_finder_unittest.cc",
-      "sequence_number_util_unittest.cc",
-      "session_info_unittest.cc",
-      "test/stream_generator.cc",
-      "test/stream_generator.h",
-      "timing_unittest.cc",
-      "utility/default_video_bitrate_allocator_unittest.cc",
-      "utility/frame_dropper_unittest.cc",
-      "utility/ivf_file_writer_unittest.cc",
-      "utility/moving_average_unittest.cc",
-      "utility/quality_scaler_unittest.cc",
-      "utility/simulcast_rate_allocator_unittest.cc",
-      "video_codec_initializer_unittest.cc",
-      "video_packet_buffer_unittest.cc",
-      "video_receiver_unittest.cc",
-      "video_sender_unittest.cc",
-    ]
-    if (rtc_libvpx_build_vp9) {
-      sources += [ "codecs/vp9/vp9_screenshare_layers_unittest.cc" ]
-    }
-    if (rtc_use_h264) {
-      sources += [ "codecs/h264/h264_encoder_impl_unittest.cc" ]
-    }
-    deps = [
-      ":simulcast_test_utility",
-      ":video_codecs_test_framework",
-      ":video_coding",
-      ":video_coding_utility",
-      ":webrtc_h264",
-      ":webrtc_vp8",
-      ":webrtc_vp9",
-      "..:module_api",
-      "../..:webrtc_common",
-      "../../api:video_frame_api",
-      "../../api/video_codecs:video_codecs_api",
-      "../../common_video:common_video",
-      "../../rtc_base:rtc_base",
-      "../../rtc_base:rtc_base_approved",
-      "../../rtc_base:rtc_task_queue",
-      "../../system_wrappers:metrics_default",
-      "../../system_wrappers:system_wrappers",
-      "../../test:field_trial",
-      "../../test:test_support",
-      "../../test:video_test_common",
-      "../../test:video_test_support",
-      "../rtp_rtcp:rtp_rtcp",
-      "//testing/gmock",
-    ]
-    if (rtc_build_libvpx) {
-      deps += [ rtc_libvpx_dir ]
-    }
-    if (is_win) {
-      cflags = [
-        # TODO(kjellander): bugs.webrtc.org/261: Fix this warning.
-        "/wd4373",  # virtual function override.
-      ]
-    }
-
-    # TODO(jschuh): bugs.webrtc.org/1348: fix this warning.
-    configs += [ "//build/config/compiler:no_size_t_to_int_warning" ]
-    if (!build_with_chromium && is_clang) {
-      # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-    }
-  }
-}
diff --git a/modules/video_coding/DEPS b/modules/video_coding/DEPS
deleted file mode 100644
index 068c0ae..0000000
--- a/modules/video_coding/DEPS
+++ /dev/null
@@ -1,23 +0,0 @@
-include_rules = [
-  "+third_party/ffmpeg",
-  "+third_party/openh264",
-  "+vpx",
-  "+webrtc/call",
-  "+webrtc/common_video",
-  "+webrtc/system_wrappers",
-  "+webrtc/rtc_tools",
-]
-
-specific_include_rules = {
-  "android_test_initializer\.cc": [
-    "+base/android",
-    "+webrtc/sdk",
-  ],
-  "(.*test\.cc|.*test\.h|.*test\.mm)": [
-     "+webrtc/media/engine",
-     "+webrtc/sdk",
-  ],
-  ".*h264\.h": [
-    "+webrtc/media/base/codec.h"
-  ],
-}
diff --git a/modules/video_coding/OWNERS b/modules/video_coding/OWNERS
deleted file mode 100644
index 0ebe326..0000000
--- a/modules/video_coding/OWNERS
+++ /dev/null
@@ -1,10 +0,0 @@
-asapersson@webrtc.org
-brandtr@webrtc.org
-sprang@webrtc.org
-marpan@webrtc.org
-stefan@webrtc.org
-
-# These are for the common case of adding or renaming files. If you're doing
-# structural changes, please get a review from a reviewer in this file.
-per-file *.gn=*
-per-file *.gni=*
diff --git a/modules/video_coding/codec_database.cc b/modules/video_coding/codec_database.cc
deleted file mode 100644
index ffcdb67..0000000
--- a/modules/video_coding/codec_database.cc
+++ /dev/null
@@ -1,462 +0,0 @@
-/*
- *  Copyright (c) 2012 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/video_coding/codec_database.h"
-
-#include "webrtc/modules/video_coding/codecs/h264/include/h264.h"
-#include "webrtc/modules/video_coding/codecs/i420/include/i420.h"
-#include "webrtc/modules/video_coding/codecs/vp8/include/vp8.h"
-#include "webrtc/modules/video_coding/codecs/vp9/include/vp9.h"
-#include "webrtc/modules/video_coding/internal_defines.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-
-namespace {
-const size_t kDefaultPayloadSize = 1440;
-}
-
-namespace webrtc {
-
-// Create an internal Decoder given a codec type
-static std::unique_ptr<VCMGenericDecoder> CreateDecoder(VideoCodecType type) {
-  switch (type) {
-    case kVideoCodecVP8:
-      return std::unique_ptr<VCMGenericDecoder>(
-          new VCMGenericDecoder(VP8Decoder::Create()));
-    case kVideoCodecVP9:
-      return std::unique_ptr<VCMGenericDecoder>(
-          new VCMGenericDecoder(VP9Decoder::Create()));
-    case kVideoCodecI420:
-      return std::unique_ptr<VCMGenericDecoder>(
-          new VCMGenericDecoder(new I420Decoder()));
-    case kVideoCodecH264:
-      if (H264Decoder::IsSupported()) {
-        return std::unique_ptr<VCMGenericDecoder>(
-            new VCMGenericDecoder(H264Decoder::Create()));
-      }
-      break;
-    default:
-      break;
-  }
-  LOG(LS_WARNING) << "No internal decoder of this type exists.";
-  return std::unique_ptr<VCMGenericDecoder>();
-}
-
-VCMDecoderMapItem::VCMDecoderMapItem(VideoCodec* settings,
-                                     int number_of_cores,
-                                     bool require_key_frame)
-    : settings(settings),
-      number_of_cores(number_of_cores),
-      require_key_frame(require_key_frame) {
-  RTC_DCHECK_GE(number_of_cores, 0);
-}
-
-VCMExtDecoderMapItem::VCMExtDecoderMapItem(
-    VideoDecoder* external_decoder_instance,
-    uint8_t payload_type)
-    : payload_type(payload_type),
-      external_decoder_instance(external_decoder_instance) {}
-
-VCMCodecDataBase::VCMCodecDataBase(
-    VCMEncodedFrameCallback* encoded_frame_callback)
-    : number_of_cores_(0),
-      max_payload_size_(kDefaultPayloadSize),
-      periodic_key_frames_(false),
-      pending_encoder_reset_(true),
-      send_codec_(),
-      receive_codec_(),
-      encoder_payload_type_(0),
-      external_encoder_(nullptr),
-      internal_source_(false),
-      encoded_frame_callback_(encoded_frame_callback),
-      dec_map_(),
-      dec_external_map_() {}
-
-VCMCodecDataBase::~VCMCodecDataBase() {
-  DeleteEncoder();
-  ptr_decoder_.reset();
-  for (auto& kv : dec_map_)
-    delete kv.second;
-  for (auto& kv : dec_external_map_)
-    delete kv.second;
-}
-
-// Assuming only one registered encoder - since only one used, no need for more.
-bool VCMCodecDataBase::SetSendCodec(const VideoCodec* send_codec,
-                                    int number_of_cores,
-                                    size_t max_payload_size) {
-  RTC_DCHECK(send_codec);
-  if (max_payload_size == 0) {
-    max_payload_size = kDefaultPayloadSize;
-  }
-  RTC_DCHECK_GE(number_of_cores, 1);
-  RTC_DCHECK_GE(send_codec->plType, 1);
-  // Make sure the start bit rate is sane...
-  RTC_DCHECK_LE(send_codec->startBitrate, 1000000);
-  RTC_DCHECK(send_codec->codecType != kVideoCodecUnknown);
-  bool reset_required = pending_encoder_reset_;
-  if (number_of_cores_ != number_of_cores) {
-    number_of_cores_ = number_of_cores;
-    reset_required = true;
-  }
-  if (max_payload_size_ != max_payload_size) {
-    max_payload_size_ = max_payload_size;
-    reset_required = true;
-  }
-
-  VideoCodec new_send_codec;
-  memcpy(&new_send_codec, send_codec, sizeof(new_send_codec));
-
-  if (new_send_codec.maxBitrate == 0) {
-    // max is one bit per pixel
-    new_send_codec.maxBitrate = (static_cast<int>(send_codec->height) *
-                                 static_cast<int>(send_codec->width) *
-                                 static_cast<int>(send_codec->maxFramerate)) /
-                                1000;
-    if (send_codec->startBitrate > new_send_codec.maxBitrate) {
-      // But if the user tries to set a higher start bit rate we will
-      // increase the max accordingly.
-      new_send_codec.maxBitrate = send_codec->startBitrate;
-    }
-  }
-
-  if (new_send_codec.startBitrate > new_send_codec.maxBitrate)
-    new_send_codec.startBitrate = new_send_codec.maxBitrate;
-
-  if (!reset_required) {
-    reset_required = RequiresEncoderReset(new_send_codec);
-  }
-
-  memcpy(&send_codec_, &new_send_codec, sizeof(send_codec_));
-
-  if (!reset_required) {
-    return true;
-  }
-
-  // If encoder exists, will destroy it and create new one.
-  DeleteEncoder();
-  RTC_DCHECK_EQ(encoder_payload_type_, send_codec_.plType)
-      << "Encoder not registered for payload type " << send_codec_.plType;
-  ptr_encoder_.reset(new VCMGenericEncoder(
-      external_encoder_, encoded_frame_callback_, internal_source_));
-  encoded_frame_callback_->SetInternalSource(internal_source_);
-  if (ptr_encoder_->InitEncode(&send_codec_, number_of_cores_,
-                               max_payload_size_) < 0) {
-    LOG(LS_ERROR) << "Failed to initialize video encoder.";
-    DeleteEncoder();
-    return false;
-  }
-
-  // Intentionally don't check return value since the encoder registration
-  // shouldn't fail because the codec doesn't support changing the periodic key
-  // frame setting.
-  ptr_encoder_->SetPeriodicKeyFrames(periodic_key_frames_);
-
-  pending_encoder_reset_ = false;
-
-  return true;
-}
-
-bool VCMCodecDataBase::SendCodec(VideoCodec* current_send_codec) const {
-  if (!ptr_encoder_) {
-    return false;
-  }
-  memcpy(current_send_codec, &send_codec_, sizeof(VideoCodec));
-  return true;
-}
-
-VideoCodecType VCMCodecDataBase::SendCodec() const {
-  if (!ptr_encoder_) {
-    return kVideoCodecUnknown;
-  }
-  return send_codec_.codecType;
-}
-
-bool VCMCodecDataBase::DeregisterExternalEncoder(uint8_t payload_type,
-                                                 bool* was_send_codec) {
-  RTC_DCHECK(was_send_codec);
-  *was_send_codec = false;
-  if (encoder_payload_type_ != payload_type) {
-    return false;
-  }
-  if (send_codec_.plType == payload_type) {
-    // De-register as send codec if needed.
-    DeleteEncoder();
-    memset(&send_codec_, 0, sizeof(VideoCodec));
-    *was_send_codec = true;
-  }
-  encoder_payload_type_ = 0;
-  external_encoder_ = nullptr;
-  internal_source_ = false;
-  return true;
-}
-
-void VCMCodecDataBase::RegisterExternalEncoder(VideoEncoder* external_encoder,
-                                               uint8_t payload_type,
-                                               bool internal_source) {
-  // Since only one encoder can be used at a given time, only one external
-  // encoder can be registered/used.
-  external_encoder_ = external_encoder;
-  encoder_payload_type_ = payload_type;
-  internal_source_ = internal_source;
-  pending_encoder_reset_ = true;
-}
-
-bool VCMCodecDataBase::RequiresEncoderReset(const VideoCodec& new_send_codec) {
-  if (!ptr_encoder_)
-    return true;
-
-  // Does not check startBitrate or maxFramerate
-  if (new_send_codec.codecType != send_codec_.codecType ||
-      strcmp(new_send_codec.plName, send_codec_.plName) != 0 ||
-      new_send_codec.plType != send_codec_.plType ||
-      new_send_codec.width != send_codec_.width ||
-      new_send_codec.height != send_codec_.height ||
-      new_send_codec.maxBitrate != send_codec_.maxBitrate ||
-      new_send_codec.minBitrate != send_codec_.minBitrate ||
-      new_send_codec.qpMax != send_codec_.qpMax ||
-      new_send_codec.numberOfSimulcastStreams !=
-          send_codec_.numberOfSimulcastStreams ||
-      new_send_codec.mode != send_codec_.mode) {
-    return true;
-  }
-
-  switch (new_send_codec.codecType) {
-    case kVideoCodecVP8:
-      if (memcmp(&new_send_codec.VP8(), send_codec_.VP8(),
-                 sizeof(new_send_codec.VP8())) != 0) {
-        return true;
-      }
-      break;
-    case kVideoCodecVP9:
-      if (memcmp(&new_send_codec.VP9(), send_codec_.VP9(),
-                 sizeof(new_send_codec.VP9())) != 0) {
-        return true;
-      }
-      break;
-    case kVideoCodecH264:
-      if (memcmp(&new_send_codec.H264(), send_codec_.H264(),
-                 sizeof(new_send_codec.H264())) != 0) {
-        return true;
-      }
-      break;
-    case kVideoCodecGeneric:
-      break;
-    // Known codecs without payload-specifics
-    case kVideoCodecI420:
-    case kVideoCodecRED:
-    case kVideoCodecULPFEC:
-    case kVideoCodecFlexfec:
-      break;
-    // Unknown codec type, reset just to be sure.
-    case kVideoCodecUnknown:
-      return true;
-  }
-
-  if (new_send_codec.numberOfSimulcastStreams > 0) {
-    for (unsigned char i = 0; i < new_send_codec.numberOfSimulcastStreams;
-         ++i) {
-      if (memcmp(&new_send_codec.simulcastStream[i],
-                 &send_codec_.simulcastStream[i],
-                 sizeof(new_send_codec.simulcastStream[i])) != 0) {
-        return true;
-      }
-    }
-  }
-  return false;
-}
-
-VCMGenericEncoder* VCMCodecDataBase::GetEncoder() {
-  return ptr_encoder_.get();
-}
-
-bool VCMCodecDataBase::SetPeriodicKeyFrames(bool enable) {
-  periodic_key_frames_ = enable;
-  if (ptr_encoder_) {
-    return (ptr_encoder_->SetPeriodicKeyFrames(periodic_key_frames_) == 0);
-  }
-  return true;
-}
-
-bool VCMCodecDataBase::DeregisterExternalDecoder(uint8_t payload_type) {
-  ExternalDecoderMap::iterator it = dec_external_map_.find(payload_type);
-  if (it == dec_external_map_.end()) {
-    // Not found
-    return false;
-  }
-  // We can't use payload_type to check if the decoder is currently in use,
-  // because payload type may be out of date (e.g. before we decode the first
-  // frame after RegisterReceiveCodec)
-  if (ptr_decoder_ &&
-      ptr_decoder_->IsSameDecoder((*it).second->external_decoder_instance)) {
-    // Release it if it was registered and in use.
-    ptr_decoder_.reset();
-  }
-  DeregisterReceiveCodec(payload_type);
-  delete it->second;
-  dec_external_map_.erase(it);
-  return true;
-}
-
-// Add the external encoder object to the list of external decoders.
-// Won't be registered as a receive codec until RegisterReceiveCodec is called.
-void VCMCodecDataBase::RegisterExternalDecoder(VideoDecoder* external_decoder,
-                                               uint8_t payload_type) {
-  // Check if payload value already exists, if so  - erase old and insert new.
-  VCMExtDecoderMapItem* ext_decoder =
-      new VCMExtDecoderMapItem(external_decoder, payload_type);
-  DeregisterExternalDecoder(payload_type);
-  dec_external_map_[payload_type] = ext_decoder;
-}
-
-bool VCMCodecDataBase::DecoderRegistered() const {
-  return !dec_map_.empty();
-}
-
-bool VCMCodecDataBase::RegisterReceiveCodec(const VideoCodec* receive_codec,
-                                            int number_of_cores,
-                                            bool require_key_frame) {
-  if (number_of_cores < 0) {
-    return false;
-  }
-  // Check if payload value already exists, if so  - erase old and insert new.
-  DeregisterReceiveCodec(receive_codec->plType);
-  if (receive_codec->codecType == kVideoCodecUnknown) {
-    return false;
-  }
-  VideoCodec* new_receive_codec = new VideoCodec(*receive_codec);
-  dec_map_[receive_codec->plType] = new VCMDecoderMapItem(
-      new_receive_codec, number_of_cores, require_key_frame);
-  return true;
-}
-
-bool VCMCodecDataBase::DeregisterReceiveCodec(uint8_t payload_type) {
-  DecoderMap::iterator it = dec_map_.find(payload_type);
-  if (it == dec_map_.end()) {
-    return false;
-  }
-  delete it->second;
-  dec_map_.erase(it);
-  if (receive_codec_.plType == payload_type) {
-    // This codec is currently in use.
-    memset(&receive_codec_, 0, sizeof(VideoCodec));
-  }
-  return true;
-}
-
-VCMGenericDecoder* VCMCodecDataBase::GetDecoder(
-    const VCMEncodedFrame& frame,
-    VCMDecodedFrameCallback* decoded_frame_callback) {
-  RTC_DCHECK(decoded_frame_callback->UserReceiveCallback());
-  uint8_t payload_type = frame.PayloadType();
-  if (payload_type == receive_codec_.plType || payload_type == 0) {
-    return ptr_decoder_.get();
-  }
-  // Check for exisitng decoder, if exists - delete.
-  if (ptr_decoder_) {
-    ptr_decoder_.reset();
-    memset(&receive_codec_, 0, sizeof(VideoCodec));
-  }
-  ptr_decoder_ = CreateAndInitDecoder(frame, &receive_codec_);
-  if (!ptr_decoder_) {
-    return nullptr;
-  }
-  VCMReceiveCallback* callback = decoded_frame_callback->UserReceiveCallback();
-  callback->OnIncomingPayloadType(receive_codec_.plType);
-  if (ptr_decoder_->RegisterDecodeCompleteCallback(decoded_frame_callback) <
-      0) {
-    ptr_decoder_.reset();
-    memset(&receive_codec_, 0, sizeof(VideoCodec));
-    return nullptr;
-  }
-  return ptr_decoder_.get();
-}
-
-VCMGenericDecoder* VCMCodecDataBase::GetCurrentDecoder() {
-  return ptr_decoder_.get();
-}
-
-bool VCMCodecDataBase::PrefersLateDecoding() const {
-  return ptr_decoder_ ? ptr_decoder_->PrefersLateDecoding() : true;
-}
-
-bool VCMCodecDataBase::MatchesCurrentResolution(int width, int height) const {
-  return send_codec_.width == width && send_codec_.height == height;
-}
-
-std::unique_ptr<VCMGenericDecoder> VCMCodecDataBase::CreateAndInitDecoder(
-    const VCMEncodedFrame& frame,
-    VideoCodec* new_codec) const {
-  uint8_t payload_type = frame.PayloadType();
-  LOG(LS_INFO) << "Initializing decoder with payload type '"
-               << static_cast<int>(payload_type) << "'.";
-  RTC_DCHECK(new_codec);
-  const VCMDecoderMapItem* decoder_item = FindDecoderItem(payload_type);
-  if (!decoder_item) {
-    LOG(LS_ERROR) << "Can't find a decoder associated with payload type: "
-                  << static_cast<int>(payload_type);
-    return nullptr;
-  }
-  std::unique_ptr<VCMGenericDecoder> ptr_decoder;
-  const VCMExtDecoderMapItem* external_dec_item =
-      FindExternalDecoderItem(payload_type);
-  if (external_dec_item) {
-    // External codec.
-    ptr_decoder.reset(new VCMGenericDecoder(
-        external_dec_item->external_decoder_instance, true));
-  } else {
-    // Create decoder.
-    ptr_decoder = CreateDecoder(decoder_item->settings->codecType);
-  }
-  if (!ptr_decoder)
-    return nullptr;
-
-  // Copy over input resolutions to prevent codec reinitialization due to
-  // the first frame being of a different resolution than the database values.
-  // This is best effort, since there's no guarantee that width/height have been
-  // parsed yet (and may be zero).
-  if (frame.EncodedImage()._encodedWidth > 0 &&
-      frame.EncodedImage()._encodedHeight > 0) {
-    decoder_item->settings->width = frame.EncodedImage()._encodedWidth;
-    decoder_item->settings->height = frame.EncodedImage()._encodedHeight;
-  }
-  if (ptr_decoder->InitDecode(decoder_item->settings.get(),
-                              decoder_item->number_of_cores) < 0) {
-    return nullptr;
-  }
-  memcpy(new_codec, decoder_item->settings.get(), sizeof(VideoCodec));
-  return ptr_decoder;
-}
-
-void VCMCodecDataBase::DeleteEncoder() {
-  if (!ptr_encoder_)
-    return;
-  ptr_encoder_->Release();
-  ptr_encoder_.reset();
-}
-
-const VCMDecoderMapItem* VCMCodecDataBase::FindDecoderItem(
-    uint8_t payload_type) const {
-  DecoderMap::const_iterator it = dec_map_.find(payload_type);
-  if (it != dec_map_.end()) {
-    return (*it).second;
-  }
-  return nullptr;
-}
-
-const VCMExtDecoderMapItem* VCMCodecDataBase::FindExternalDecoderItem(
-    uint8_t payload_type) const {
-  ExternalDecoderMap::const_iterator it = dec_external_map_.find(payload_type);
-  if (it != dec_external_map_.end()) {
-    return (*it).second;
-  }
-  return nullptr;
-}
-}  // namespace webrtc
diff --git a/modules/video_coding/codec_database.h b/modules/video_coding/codec_database.h
deleted file mode 100644
index 4032558..0000000
--- a/modules/video_coding/codec_database.h
+++ /dev/null
@@ -1,153 +0,0 @@
-/*
- *  Copyright (c) 2012 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_VIDEO_CODING_CODEC_DATABASE_H_
-#define WEBRTC_MODULES_VIDEO_CODING_CODEC_DATABASE_H_
-
-#include <map>
-#include <memory>
-
-#include "webrtc/modules/video_coding/include/video_codec_interface.h"
-#include "webrtc/modules/video_coding/include/video_coding.h"
-#include "webrtc/modules/video_coding/generic_decoder.h"
-#include "webrtc/modules/video_coding/generic_encoder.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-struct VCMDecoderMapItem {
- public:
-  VCMDecoderMapItem(VideoCodec* settings,
-                    int number_of_cores,
-                    bool require_key_frame);
-
-  std::unique_ptr<VideoCodec> settings;
-  int number_of_cores;
-  bool require_key_frame;
-};
-
-struct VCMExtDecoderMapItem {
- public:
-  VCMExtDecoderMapItem(VideoDecoder* external_decoder_instance,
-                       uint8_t payload_type);
-
-  uint8_t payload_type;
-  VideoDecoder* external_decoder_instance;
-};
-
-class VCMCodecDataBase {
- public:
-  explicit VCMCodecDataBase(VCMEncodedFrameCallback* encoded_frame_callback);
-  ~VCMCodecDataBase();
-
-  // Sets the sender side codec and initiates the desired codec given the
-  // VideoCodec struct.
-  // Returns true if the codec was successfully registered, false otherwise.
-  bool SetSendCodec(const VideoCodec* send_codec,
-                    int number_of_cores,
-                    size_t max_payload_size);
-
-  // Gets the current send codec. Relevant for internal codecs only.
-  // Returns true if there is a send codec, false otherwise.
-  bool SendCodec(VideoCodec* current_send_codec) const;
-
-  // Gets current send side codec type. Relevant for internal codecs only.
-  // Returns kVideoCodecUnknown if there is no send codec.
-  VideoCodecType SendCodec() const;
-
-  // Registers and initializes an external encoder object.
-  // |internal_source| should be set to true if the codec has an internal
-  // video source and doesn't need the user to provide it with frames via
-  // the Encode() method.
-  void RegisterExternalEncoder(VideoEncoder* external_encoder,
-                               uint8_t payload_type,
-                               bool internal_source);
-
-  // Deregisters an external encoder. Returns true if the encoder was
-  // found and deregistered, false otherwise. |was_send_codec| is set to true
-  // if the external encoder was the send codec before being deregistered.
-  bool DeregisterExternalEncoder(uint8_t payload_type, bool* was_send_codec);
-
-  VCMGenericEncoder* GetEncoder();
-
-  bool SetPeriodicKeyFrames(bool enable);
-
-  // Deregisters an external decoder object specified by |payload_type|.
-  bool DeregisterExternalDecoder(uint8_t payload_type);
-
-  // Registers an external decoder object to the payload type |payload_type|.
-  void RegisterExternalDecoder(VideoDecoder* external_decoder,
-                               uint8_t payload_type);
-
-  bool DecoderRegistered() const;
-
-  bool RegisterReceiveCodec(const VideoCodec* receive_codec,
-                            int number_of_cores,
-                            bool require_key_frame);
-
-  bool DeregisterReceiveCodec(uint8_t payload_type);
-
-  // Returns a decoder specified by |payload_type|. The decoded frame callback
-  // of the encoder is set to |decoded_frame_callback|. If no such decoder
-  // already exists an instance will be created and initialized.
-  // NULL is returned if no encoder with the specified payload type was found
-  // and the function failed to create one.
-  VCMGenericDecoder* GetDecoder(
-      const VCMEncodedFrame& frame,
-      VCMDecodedFrameCallback* decoded_frame_callback);
-
-  // Returns the current decoder (i.e. the same value as was last returned from
-  // GetDecoder();
-  VCMGenericDecoder* GetCurrentDecoder();
-
-  // Returns true if the currently active decoder prefer to decode frames late.
-  // That means that frames must be decoded near the render times stamp.
-  bool PrefersLateDecoding() const;
-
-  bool MatchesCurrentResolution(int width, int height) const;
-
- private:
-  typedef std::map<uint8_t, VCMDecoderMapItem*> DecoderMap;
-  typedef std::map<uint8_t, VCMExtDecoderMapItem*> ExternalDecoderMap;
-
-  std::unique_ptr<VCMGenericDecoder> CreateAndInitDecoder(
-      const VCMEncodedFrame& frame,
-      VideoCodec* new_codec) const;
-
-  // Determines whether a new codec has to be created or not.
-  // Checks every setting apart from maxFramerate and startBitrate.
-  bool RequiresEncoderReset(const VideoCodec& send_codec);
-
-  void DeleteEncoder();
-
-  const VCMDecoderMapItem* FindDecoderItem(uint8_t payload_type) const;
-
-  const VCMExtDecoderMapItem* FindExternalDecoderItem(
-      uint8_t payload_type) const;
-
-  int number_of_cores_;
-  size_t max_payload_size_;
-  bool periodic_key_frames_;
-  bool pending_encoder_reset_;
-  VideoCodec send_codec_;
-  VideoCodec receive_codec_;
-  uint8_t encoder_payload_type_;
-  VideoEncoder* external_encoder_;
-  bool internal_source_;
-  VCMEncodedFrameCallback* const encoded_frame_callback_;
-  std::unique_ptr<VCMGenericEncoder> ptr_encoder_;
-  std::unique_ptr<VCMGenericDecoder> ptr_decoder_;
-  DecoderMap dec_map_;
-  ExternalDecoderMap dec_external_map_;
-};  // VCMCodecDataBase
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_VIDEO_CODING_CODEC_DATABASE_H_
diff --git a/modules/video_coding/codec_timer.cc b/modules/video_coding/codec_timer.cc
deleted file mode 100644
index 0fdf1a6..0000000
--- a/modules/video_coding/codec_timer.cc
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- *  Copyright (c) 2011 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/video_coding/codec_timer.h"
-
-namespace webrtc {
-
-namespace {
-
-// The first kIgnoredSampleCount samples will be ignored.
-const int kIgnoredSampleCount = 5;
-// Return the |kPercentile| value in RequiredDecodeTimeMs().
-const float kPercentile = 0.95f;
-// The window size in ms.
-const int64_t kTimeLimitMs = 10000;
-
-}  // anonymous namespace
-
-VCMCodecTimer::VCMCodecTimer()
-    : ignored_sample_count_(0), filter_(kPercentile) {}
-
-void VCMCodecTimer::AddTiming(int64_t decode_time_ms, int64_t now_ms) {
-  // Ignore the first |kIgnoredSampleCount| samples.
-  if (ignored_sample_count_ < kIgnoredSampleCount) {
-    ++ignored_sample_count_;
-    return;
-  }
-
-  // Insert new decode time value.
-  filter_.Insert(decode_time_ms);
-  history_.emplace(decode_time_ms, now_ms);
-
-  // Pop old decode time values.
-  while (!history_.empty() &&
-         now_ms - history_.front().sample_time_ms > kTimeLimitMs) {
-    filter_.Erase(history_.front().decode_time_ms);
-    history_.pop();
-  }
-}
-
-// Get the 95th percentile observed decode time within a time window.
-int64_t VCMCodecTimer::RequiredDecodeTimeMs() const {
-  return filter_.GetPercentileValue();
-}
-
-VCMCodecTimer::Sample::Sample(int64_t decode_time_ms, int64_t sample_time_ms)
-    : decode_time_ms(decode_time_ms), sample_time_ms(sample_time_ms) {}
-
-}  // namespace webrtc
diff --git a/modules/video_coding/codec_timer.h b/modules/video_coding/codec_timer.h
deleted file mode 100644
index 7736d71..0000000
--- a/modules/video_coding/codec_timer.h
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- *  Copyright (c) 2011 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_VIDEO_CODING_CODEC_TIMER_H_
-#define WEBRTC_MODULES_VIDEO_CODING_CODEC_TIMER_H_
-
-#include <queue>
-
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/rtc_base/numerics/percentile_filter.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-class VCMCodecTimer {
- public:
-  VCMCodecTimer();
-
-  // Add a new decode time to the filter.
-  void AddTiming(int64_t new_decode_time_ms, int64_t now_ms);
-
-  // Get the required decode time in ms. It is the 95th percentile observed
-  // decode time within a time window.
-  int64_t RequiredDecodeTimeMs() const;
-
- private:
-  struct Sample {
-    Sample(int64_t decode_time_ms, int64_t sample_time_ms);
-    int64_t decode_time_ms;
-    int64_t sample_time_ms;
-  };
-
-  // The number of samples ignored so far.
-  int ignored_sample_count_;
-  // Queue with history of latest decode time values.
-  std::queue<Sample> history_;
-  // |filter_| contains the same values as |history_|, but in a data structure
-  // that allows efficient retrieval of the percentile value.
-  PercentileFilter<int64_t> filter_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_VIDEO_CODING_CODEC_TIMER_H_
diff --git a/modules/video_coding/codecs/h264/OWNERS b/modules/video_coding/codecs/h264/OWNERS
deleted file mode 100644
index a79fd4a..0000000
--- a/modules/video_coding/codecs/h264/OWNERS
+++ /dev/null
@@ -1,2 +0,0 @@
-hbos@webrtc.org
-sprang@webrtc.org
diff --git a/modules/video_coding/codecs/h264/h264.cc b/modules/video_coding/codecs/h264/h264.cc
deleted file mode 100644
index aa9dbe5..0000000
--- a/modules/video_coding/codecs/h264/h264.cc
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- *  Copyright (c) 2015 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/video_coding/codecs/h264/include/h264.h"
-
-#if defined(WEBRTC_USE_H264)
-#include "webrtc/modules/video_coding/codecs/h264/h264_decoder_impl.h"
-#include "webrtc/modules/video_coding/codecs/h264/h264_encoder_impl.h"
-#endif
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-
-namespace webrtc {
-
-namespace {
-
-#if defined(WEBRTC_USE_H264)
-bool g_rtc_use_h264 = true;
-#endif
-
-}  // namespace
-
-void DisableRtcUseH264() {
-#if defined(WEBRTC_USE_H264)
-  g_rtc_use_h264 = false;
-#endif
-}
-
-// If any H.264 codec is supported (iOS HW or OpenH264/FFmpeg).
-bool IsH264CodecSupported() {
-#if defined(WEBRTC_USE_H264)
-  return g_rtc_use_h264;
-#else
-  return false;
-#endif
-}
-
-H264Encoder* H264Encoder::Create(const cricket::VideoCodec& codec) {
-  RTC_DCHECK(H264Encoder::IsSupported());
-#if defined(WEBRTC_USE_H264)
-  RTC_CHECK(g_rtc_use_h264);
-  LOG(LS_INFO) << "Creating H264EncoderImpl.";
-  return new H264EncoderImpl(codec);
-#else
-  RTC_NOTREACHED();
-  return nullptr;
-#endif
-}
-
-bool H264Encoder::IsSupported() {
-  return IsH264CodecSupported();
-}
-
-H264Decoder* H264Decoder::Create() {
-  RTC_DCHECK(H264Decoder::IsSupported());
-#if defined(WEBRTC_USE_H264)
-  RTC_CHECK(g_rtc_use_h264);
-  LOG(LS_INFO) << "Creating H264DecoderImpl.";
-  return new H264DecoderImpl();
-#else
-  RTC_NOTREACHED();
-  return nullptr;
-#endif
-}
-
-bool H264Decoder::IsSupported() {
-  return IsH264CodecSupported();
-}
-
-}  // namespace webrtc
diff --git a/modules/video_coding/codecs/h264/h264_decoder_impl.cc b/modules/video_coding/codecs/h264/h264_decoder_impl.cc
deleted file mode 100644
index b71347e..0000000
--- a/modules/video_coding/codecs/h264/h264_decoder_impl.cc
+++ /dev/null
@@ -1,426 +0,0 @@
-/*
- *  Copyright (c) 2015 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/video_coding/codecs/h264/h264_decoder_impl.h"
-
-#include <algorithm>
-#include <limits>
-
-extern "C" {
-#include "third_party/ffmpeg/libavcodec/avcodec.h"
-#include "third_party/ffmpeg/libavformat/avformat.h"
-#include "third_party/ffmpeg/libavutil/imgutils.h"
-}  // extern "C"
-
-#include "webrtc/api/video/i420_buffer.h"
-#include "webrtc/common_video/include/video_frame_buffer.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/keep_ref_until_done.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/system_wrappers/include/metrics.h"
-
-namespace webrtc {
-
-namespace {
-
-const AVPixelFormat kPixelFormat = AV_PIX_FMT_YUV420P;
-const size_t kYPlaneIndex = 0;
-const size_t kUPlaneIndex = 1;
-const size_t kVPlaneIndex = 2;
-
-// Used by histograms. Values of entries should not be changed.
-enum H264DecoderImplEvent {
-  kH264DecoderEventInit = 0,
-  kH264DecoderEventError = 1,
-  kH264DecoderEventMax = 16,
-};
-
-#if defined(WEBRTC_INITIALIZE_FFMPEG)
-
-rtc::CriticalSection ffmpeg_init_lock;
-bool ffmpeg_initialized = false;
-
-// Called by FFmpeg to do mutex operations if initialized using
-// |InitializeFFmpeg|. Disabling thread safety analysis because void** does not
-// play nicely with thread_annotations.h macros.
-int LockManagerOperation(void** lock,
-                         AVLockOp op) RTC_NO_THREAD_SAFETY_ANALYSIS {
-  switch (op) {
-    case AV_LOCK_CREATE:
-      *lock = new rtc::CriticalSection();
-      return 0;
-    case AV_LOCK_OBTAIN:
-      static_cast<rtc::CriticalSection*>(*lock)->Enter();
-      return 0;
-    case AV_LOCK_RELEASE:
-      static_cast<rtc::CriticalSection*>(*lock)->Leave();
-      return 0;
-    case AV_LOCK_DESTROY:
-      delete static_cast<rtc::CriticalSection*>(*lock);
-      *lock = nullptr;
-      return 0;
-  }
-  RTC_NOTREACHED() << "Unrecognized AVLockOp.";
-  return -1;
-}
-
-void InitializeFFmpeg() {
-  rtc::CritScope cs(&ffmpeg_init_lock);
-  if (!ffmpeg_initialized) {
-    if (av_lockmgr_register(LockManagerOperation) < 0) {
-      RTC_NOTREACHED() << "av_lockmgr_register failed.";
-      return;
-    }
-    av_register_all();
-    ffmpeg_initialized = true;
-  }
-}
-
-#endif  // defined(WEBRTC_INITIALIZE_FFMPEG)
-
-}  // namespace
-
-int H264DecoderImpl::AVGetBuffer2(
-    AVCodecContext* context, AVFrame* av_frame, int flags) {
-  // Set in |InitDecode|.
-  H264DecoderImpl* decoder = static_cast<H264DecoderImpl*>(context->opaque);
-  // DCHECK values set in |InitDecode|.
-  RTC_DCHECK(decoder);
-  RTC_DCHECK_EQ(context->pix_fmt, kPixelFormat);
-  // Necessary capability to be allowed to provide our own buffers.
-  RTC_DCHECK(context->codec->capabilities | AV_CODEC_CAP_DR1);
-
-  // |av_frame->width| and |av_frame->height| are set by FFmpeg. These are the
-  // actual image's dimensions and may be different from |context->width| and
-  // |context->coded_width| due to reordering.
-  int width = av_frame->width;
-  int height = av_frame->height;
-  // See |lowres|, if used the decoder scales the image by 1/2^(lowres). This
-  // has implications on which resolutions are valid, but we don't use it.
-  RTC_CHECK_EQ(context->lowres, 0);
-  // Adjust the |width| and |height| to values acceptable by the decoder.
-  // Without this, FFmpeg may overflow the buffer. If modified, |width| and/or
-  // |height| are larger than the actual image and the image has to be cropped
-  // (top-left corner) after decoding to avoid visible borders to the right and
-  // bottom of the actual image.
-  avcodec_align_dimensions(context, &width, &height);
-
-  RTC_CHECK_GE(width, 0);
-  RTC_CHECK_GE(height, 0);
-  int ret = av_image_check_size(static_cast<unsigned int>(width),
-                                static_cast<unsigned int>(height), 0, nullptr);
-  if (ret < 0) {
-    LOG(LS_ERROR) << "Invalid picture size " << width << "x" << height;
-    decoder->ReportError();
-    return ret;
-  }
-
-  // The video frame is stored in |frame_buffer|. |av_frame| is FFmpeg's version
-  // of a video frame and will be set up to reference |frame_buffer|'s data.
-
-  // FFmpeg expects the initial allocation to be zero-initialized according to
-  // http://crbug.com/390941. Our pool is set up to zero-initialize new buffers.
-  // TODO(nisse): Delete that feature from the video pool, instead add
-  // an explicit call to InitializeData here.
-  rtc::scoped_refptr<I420Buffer> frame_buffer =
-      decoder->pool_.CreateBuffer(width, height);
-
-  int y_size = width * height;
-  int uv_size = frame_buffer->ChromaWidth() * frame_buffer->ChromaHeight();
-  // DCHECK that we have a continuous buffer as is required.
-  RTC_DCHECK_EQ(frame_buffer->DataU(), frame_buffer->DataY() + y_size);
-  RTC_DCHECK_EQ(frame_buffer->DataV(), frame_buffer->DataU() + uv_size);
-  int total_size = y_size + 2 * uv_size;
-
-  av_frame->format = context->pix_fmt;
-  av_frame->reordered_opaque = context->reordered_opaque;
-
-  // Set |av_frame| members as required by FFmpeg.
-  av_frame->data[kYPlaneIndex] = frame_buffer->MutableDataY();
-  av_frame->linesize[kYPlaneIndex] = frame_buffer->StrideY();
-  av_frame->data[kUPlaneIndex] = frame_buffer->MutableDataU();
-  av_frame->linesize[kUPlaneIndex] = frame_buffer->StrideU();
-  av_frame->data[kVPlaneIndex] = frame_buffer->MutableDataV();
-  av_frame->linesize[kVPlaneIndex] = frame_buffer->StrideV();
-  RTC_DCHECK_EQ(av_frame->extended_data, av_frame->data);
-
-  // Create a VideoFrame object, to keep a reference to the buffer.
-  // TODO(nisse): The VideoFrame's timestamp and rotation info is not used.
-  // Refactor to do not use a VideoFrame object at all.
-  av_frame->buf[0] = av_buffer_create(
-      av_frame->data[kYPlaneIndex],
-      total_size,
-      AVFreeBuffer2,
-      static_cast<void*>(new VideoFrame(frame_buffer,
-                                        0 /* timestamp */,
-                                        0 /* render_time_ms */,
-                                        kVideoRotation_0)),
-      0);
-  RTC_CHECK(av_frame->buf[0]);
-  return 0;
-}
-
-void H264DecoderImpl::AVFreeBuffer2(void* opaque, uint8_t* data) {
-  // The buffer pool recycles the buffer used by |video_frame| when there are no
-  // more references to it. |video_frame| is a thin buffer holder and is not
-  // recycled.
-  VideoFrame* video_frame = static_cast<VideoFrame*>(opaque);
-  delete video_frame;
-}
-
-H264DecoderImpl::H264DecoderImpl() : pool_(true),
-                                     decoded_image_callback_(nullptr),
-                                     has_reported_init_(false),
-                                     has_reported_error_(false) {
-}
-
-H264DecoderImpl::~H264DecoderImpl() {
-  Release();
-}
-
-int32_t H264DecoderImpl::InitDecode(const VideoCodec* codec_settings,
-                                    int32_t number_of_cores) {
-  ReportInit();
-  if (codec_settings &&
-      codec_settings->codecType != kVideoCodecH264) {
-    ReportError();
-    return WEBRTC_VIDEO_CODEC_ERR_PARAMETER;
-  }
-
-  // FFmpeg must have been initialized (with |av_lockmgr_register| and
-  // |av_register_all|) before we proceed. |InitializeFFmpeg| does this, which
-  // makes sense for WebRTC standalone. In other cases, such as Chromium, FFmpeg
-  // is initialized externally and calling |InitializeFFmpeg| would be
-  // thread-unsafe and result in FFmpeg being initialized twice, which could
-  // break other FFmpeg usage. See the |rtc_initialize_ffmpeg| flag.
-#if defined(WEBRTC_INITIALIZE_FFMPEG)
-  // Make sure FFmpeg has been initialized. Subsequent |InitializeFFmpeg| calls
-  // do nothing.
-  InitializeFFmpeg();
-#endif
-
-  // Release necessary in case of re-initializing.
-  int32_t ret = Release();
-  if (ret != WEBRTC_VIDEO_CODEC_OK) {
-    ReportError();
-    return ret;
-  }
-  RTC_DCHECK(!av_context_);
-
-  // Initialize AVCodecContext.
-  av_context_.reset(avcodec_alloc_context3(nullptr));
-
-  av_context_->codec_type = AVMEDIA_TYPE_VIDEO;
-  av_context_->codec_id = AV_CODEC_ID_H264;
-  if (codec_settings) {
-    av_context_->coded_width = codec_settings->width;
-    av_context_->coded_height = codec_settings->height;
-  }
-  av_context_->pix_fmt = kPixelFormat;
-  av_context_->extradata = nullptr;
-  av_context_->extradata_size = 0;
-
-  // If this is ever increased, look at |av_context_->thread_safe_callbacks| and
-  // make it possible to disable the thread checker in the frame buffer pool.
-  av_context_->thread_count = 1;
-  av_context_->thread_type = FF_THREAD_SLICE;
-
-  // Function used by FFmpeg to get buffers to store decoded frames in.
-  av_context_->get_buffer2 = AVGetBuffer2;
-  // |get_buffer2| is called with the context, there |opaque| can be used to get
-  // a pointer |this|.
-  av_context_->opaque = this;
-  // Use ref counted frames (av_frame_unref).
-  av_context_->refcounted_frames = 1;  // true
-
-  AVCodec* codec = avcodec_find_decoder(av_context_->codec_id);
-  if (!codec) {
-    // This is an indication that FFmpeg has not been initialized or it has not
-    // been compiled/initialized with the correct set of codecs.
-    LOG(LS_ERROR) << "FFmpeg H.264 decoder not found.";
-    Release();
-    ReportError();
-    return WEBRTC_VIDEO_CODEC_ERROR;
-  }
-  int res = avcodec_open2(av_context_.get(), codec, nullptr);
-  if (res < 0) {
-    LOG(LS_ERROR) << "avcodec_open2 error: " << res;
-    Release();
-    ReportError();
-    return WEBRTC_VIDEO_CODEC_ERROR;
-  }
-
-  av_frame_.reset(av_frame_alloc());
-  return WEBRTC_VIDEO_CODEC_OK;
-}
-
-int32_t H264DecoderImpl::Release() {
-  av_context_.reset();
-  av_frame_.reset();
-  return WEBRTC_VIDEO_CODEC_OK;
-}
-
-int32_t H264DecoderImpl::RegisterDecodeCompleteCallback(
-    DecodedImageCallback* callback) {
-  decoded_image_callback_ = callback;
-  return WEBRTC_VIDEO_CODEC_OK;
-}
-
-int32_t H264DecoderImpl::Decode(const EncodedImage& input_image,
-                                bool /*missing_frames*/,
-                                const RTPFragmentationHeader* /*fragmentation*/,
-                                const CodecSpecificInfo* codec_specific_info,
-                                int64_t /*render_time_ms*/) {
-  if (!IsInitialized()) {
-    ReportError();
-    return WEBRTC_VIDEO_CODEC_UNINITIALIZED;
-  }
-  if (!decoded_image_callback_) {
-    LOG(LS_WARNING) << "InitDecode() has been called, but a callback function "
-        "has not been set with RegisterDecodeCompleteCallback()";
-    ReportError();
-    return WEBRTC_VIDEO_CODEC_UNINITIALIZED;
-  }
-  if (!input_image._buffer || !input_image._length) {
-    ReportError();
-    return WEBRTC_VIDEO_CODEC_ERR_PARAMETER;
-  }
-  if (codec_specific_info &&
-      codec_specific_info->codecType != kVideoCodecH264) {
-    ReportError();
-    return WEBRTC_VIDEO_CODEC_ERR_PARAMETER;
-  }
-
-  // FFmpeg requires padding due to some optimized bitstream readers reading 32
-  // or 64 bits at once and could read over the end. See avcodec_decode_video2.
-  RTC_CHECK_GE(input_image._size, input_image._length +
-                   EncodedImage::GetBufferPaddingBytes(kVideoCodecH264));
-  // "If the first 23 bits of the additional bytes are not 0, then damaged MPEG
-  // bitstreams could cause overread and segfault." See
-  // AV_INPUT_BUFFER_PADDING_SIZE. We'll zero the entire padding just in case.
-  memset(input_image._buffer + input_image._length,
-         0,
-         EncodedImage::GetBufferPaddingBytes(kVideoCodecH264));
-
-  AVPacket packet;
-  av_init_packet(&packet);
-  packet.data = input_image._buffer;
-  if (input_image._length >
-      static_cast<size_t>(std::numeric_limits<int>::max())) {
-    ReportError();
-    return WEBRTC_VIDEO_CODEC_ERROR;
-  }
-  packet.size = static_cast<int>(input_image._length);
-  av_context_->reordered_opaque = input_image.ntp_time_ms_ * 1000;  // ms -> μs
-
-  int frame_decoded = 0;
-  int result = avcodec_decode_video2(av_context_.get(),
-                                     av_frame_.get(),
-                                     &frame_decoded,
-                                     &packet);
-  if (result < 0) {
-    LOG(LS_ERROR) << "avcodec_decode_video2 error: " << result;
-    ReportError();
-    return WEBRTC_VIDEO_CODEC_ERROR;
-  }
-  // |result| is number of bytes used, which should be all of them.
-  if (result != packet.size) {
-    LOG(LS_ERROR) << "avcodec_decode_video2 consumed " << result << " bytes "
-        "when " << packet.size << " bytes were expected.";
-    ReportError();
-    return WEBRTC_VIDEO_CODEC_ERROR;
-  }
-
-  if (!frame_decoded) {
-    LOG(LS_WARNING) << "avcodec_decode_video2 successful but no frame was "
-        "decoded.";
-    return WEBRTC_VIDEO_CODEC_OK;
-  }
-
-  // Obtain the |video_frame| containing the decoded image.
-  VideoFrame* video_frame = static_cast<VideoFrame*>(
-      av_buffer_get_opaque(av_frame_->buf[0]));
-  RTC_DCHECK(video_frame);
-  rtc::scoped_refptr<webrtc::I420BufferInterface> i420_buffer =
-      video_frame->video_frame_buffer()->GetI420();
-  RTC_CHECK_EQ(av_frame_->data[kYPlaneIndex], i420_buffer->DataY());
-  RTC_CHECK_EQ(av_frame_->data[kUPlaneIndex], i420_buffer->DataU());
-  RTC_CHECK_EQ(av_frame_->data[kVPlaneIndex], i420_buffer->DataV());
-  video_frame->set_timestamp(input_image._timeStamp);
-
-  rtc::Optional<uint8_t> qp;
-  // TODO(sakal): Maybe it is possible to get QP directly from FFmpeg.
-  h264_bitstream_parser_.ParseBitstream(input_image._buffer,
-                                        input_image._length);
-  int qp_int;
-  if (h264_bitstream_parser_.GetLastSliceQp(&qp_int)) {
-    qp.emplace(qp_int);
-  }
-
-  // The decoded image may be larger than what is supposed to be visible, see
-  // |AVGetBuffer2|'s use of |avcodec_align_dimensions|. This crops the image
-  // without copying the underlying buffer.
-  if (av_frame_->width != i420_buffer->width() ||
-      av_frame_->height != i420_buffer->height()) {
-    rtc::scoped_refptr<VideoFrameBuffer> cropped_buf(
-        new rtc::RefCountedObject<WrappedI420Buffer>(
-            av_frame_->width, av_frame_->height,
-            i420_buffer->DataY(), i420_buffer->StrideY(),
-            i420_buffer->DataU(), i420_buffer->StrideU(),
-            i420_buffer->DataV(), i420_buffer->StrideV(),
-            rtc::KeepRefUntilDone(i420_buffer)));
-    VideoFrame cropped_frame(
-        cropped_buf, video_frame->timestamp(), video_frame->render_time_ms(),
-        video_frame->rotation());
-    // TODO(nisse): Timestamp and rotation are all zero here. Change decoder
-    // interface to pass a VideoFrameBuffer instead of a VideoFrame?
-    decoded_image_callback_->Decoded(cropped_frame, rtc::Optional<int32_t>(),
-                                     qp);
-  } else {
-    // Return decoded frame.
-    decoded_image_callback_->Decoded(*video_frame, rtc::Optional<int32_t>(),
-                                     qp);
-  }
-  // Stop referencing it, possibly freeing |video_frame|.
-  av_frame_unref(av_frame_.get());
-  video_frame = nullptr;
-
-  return WEBRTC_VIDEO_CODEC_OK;
-}
-
-const char* H264DecoderImpl::ImplementationName() const {
-  return "FFmpeg";
-}
-
-bool H264DecoderImpl::IsInitialized() const {
-  return av_context_ != nullptr;
-}
-
-void H264DecoderImpl::ReportInit() {
-  if (has_reported_init_)
-    return;
-  RTC_HISTOGRAM_ENUMERATION("WebRTC.Video.H264DecoderImpl.Event",
-                            kH264DecoderEventInit,
-                            kH264DecoderEventMax);
-  has_reported_init_ = true;
-}
-
-void H264DecoderImpl::ReportError() {
-  if (has_reported_error_)
-    return;
-  RTC_HISTOGRAM_ENUMERATION("WebRTC.Video.H264DecoderImpl.Event",
-                            kH264DecoderEventError,
-                            kH264DecoderEventMax);
-  has_reported_error_ = true;
-}
-
-}  // namespace webrtc
diff --git a/modules/video_coding/codecs/h264/h264_decoder_impl.h b/modules/video_coding/codecs/h264/h264_decoder_impl.h
deleted file mode 100644
index 44c2acb..0000000
--- a/modules/video_coding/codecs/h264/h264_decoder_impl.h
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- *  Copyright (c) 2015 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_VIDEO_CODING_CODECS_H264_H264_DECODER_IMPL_H_
-#define WEBRTC_MODULES_VIDEO_CODING_CODECS_H264_H264_DECODER_IMPL_H_
-
-#include <memory>
-
-#include "webrtc/modules/video_coding/codecs/h264/include/h264.h"
-
-extern "C" {
-#include "third_party/ffmpeg/libavcodec/avcodec.h"
-}  // extern "C"
-
-#include "webrtc/common_video/h264/h264_bitstream_parser.h"
-#include "webrtc/common_video/include/i420_buffer_pool.h"
-
-namespace webrtc {
-
-struct AVCodecContextDeleter {
-  void operator()(AVCodecContext* ptr) const { avcodec_free_context(&ptr); }
-};
-struct AVFrameDeleter {
-  void operator()(AVFrame* ptr) const { av_frame_free(&ptr); }
-};
-
-class H264DecoderImpl : public H264Decoder {
- public:
-  H264DecoderImpl();
-  ~H264DecoderImpl() override;
-
-  // If |codec_settings| is NULL it is ignored. If it is not NULL,
-  // |codec_settings->codecType| must be |kVideoCodecH264|.
-  int32_t InitDecode(const VideoCodec* codec_settings,
-                     int32_t number_of_cores) override;
-  int32_t Release() override;
-
-  int32_t RegisterDecodeCompleteCallback(
-      DecodedImageCallback* callback) override;
-
-  // |missing_frames|, |fragmentation| and |render_time_ms| are ignored.
-  int32_t Decode(const EncodedImage& input_image,
-                 bool /*missing_frames*/,
-                 const RTPFragmentationHeader* /*fragmentation*/,
-                 const CodecSpecificInfo* codec_specific_info = nullptr,
-                 int64_t render_time_ms = -1) override;
-
-  const char* ImplementationName() const override;
-
- private:
-  // Called by FFmpeg when it needs a frame buffer to store decoded frames in.
-  // The |VideoFrame| returned by FFmpeg at |Decode| originate from here. Their
-  // buffers are reference counted and freed by FFmpeg using |AVFreeBuffer2|.
-  static int AVGetBuffer2(
-      AVCodecContext* context, AVFrame* av_frame, int flags);
-  // Called by FFmpeg when it is done with a video frame, see |AVGetBuffer2|.
-  static void AVFreeBuffer2(void* opaque, uint8_t* data);
-
-  bool IsInitialized() const;
-
-  // Reports statistics with histograms.
-  void ReportInit();
-  void ReportError();
-
-  I420BufferPool pool_;
-  std::unique_ptr<AVCodecContext, AVCodecContextDeleter> av_context_;
-  std::unique_ptr<AVFrame, AVFrameDeleter> av_frame_;
-
-  DecodedImageCallback* decoded_image_callback_;
-
-  bool has_reported_init_;
-  bool has_reported_error_;
-
-  webrtc::H264BitstreamParser h264_bitstream_parser_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_VIDEO_CODING_CODECS_H264_H264_DECODER_IMPL_H_
diff --git a/modules/video_coding/codecs/h264/h264_encoder_impl.cc b/modules/video_coding/codecs/h264/h264_encoder_impl.cc
deleted file mode 100644
index f5a1910..0000000
--- a/modules/video_coding/codecs/h264/h264_encoder_impl.cc
+++ /dev/null
@@ -1,507 +0,0 @@
-/*
- *  Copyright (c) 2015 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/video_coding/codecs/h264/h264_encoder_impl.h"
-
-#include <limits>
-#include <string>
-
-#include "third_party/openh264/src/codec/api/svc/codec_api.h"
-#include "third_party/openh264/src/codec/api/svc/codec_app_def.h"
-#include "third_party/openh264/src/codec/api/svc/codec_def.h"
-#include "third_party/openh264/src/codec/api/svc/codec_ver.h"
-
-#include "webrtc/common_video/libyuv/include/webrtc_libyuv.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/timeutils.h"
-#include "webrtc/system_wrappers/include/metrics.h"
-
-namespace webrtc {
-
-namespace {
-
-const bool kOpenH264EncoderDetailedLogging = false;
-
-// Used by histograms. Values of entries should not be changed.
-enum H264EncoderImplEvent {
-  kH264EncoderEventInit = 0,
-  kH264EncoderEventError = 1,
-  kH264EncoderEventMax = 16,
-};
-
-int NumberOfThreads(int width, int height, int number_of_cores) {
-  // TODO(hbos): In Chromium, multiple threads do not work with sandbox on Mac,
-  // see crbug.com/583348. Until further investigated, only use one thread.
-//  if (width * height >= 1920 * 1080 && number_of_cores > 8) {
-//    return 8;  // 8 threads for 1080p on high perf machines.
-//  } else if (width * height > 1280 * 960 && number_of_cores >= 6) {
-//    return 3;  // 3 threads for 1080p.
-//  } else if (width * height > 640 * 480 && number_of_cores >= 3) {
-//    return 2;  // 2 threads for qHD/HD.
-//  } else {
-//    return 1;  // 1 thread for VGA or less.
-//  }
-// TODO(sprang): Also check sSliceArgument.uiSliceNum om GetEncoderPrams(),
-//               before enabling multithreading here.
-  return 1;
-}
-
-FrameType ConvertToVideoFrameType(EVideoFrameType type) {
-  switch (type) {
-    case videoFrameTypeIDR:
-      return kVideoFrameKey;
-    case videoFrameTypeSkip:
-    case videoFrameTypeI:
-    case videoFrameTypeP:
-    case videoFrameTypeIPMixed:
-      return kVideoFrameDelta;
-    case videoFrameTypeInvalid:
-      break;
-  }
-  RTC_NOTREACHED() << "Unexpected/invalid frame type: " << type;
-  return kEmptyFrame;
-}
-
-}  // namespace
-
-// Helper method used by H264EncoderImpl::Encode.
-// Copies the encoded bytes from |info| to |encoded_image| and updates the
-// fragmentation information of |frag_header|. The |encoded_image->_buffer| may
-// be deleted and reallocated if a bigger buffer is required.
-//
-// After OpenH264 encoding, the encoded bytes are stored in |info| spread out
-// over a number of layers and "NAL units". Each NAL unit is a fragment starting
-// with the four-byte start code {0,0,0,1}. All of this data (including the
-// start codes) is copied to the |encoded_image->_buffer| and the |frag_header|
-// is updated to point to each fragment, with offsets and lengths set as to
-// exclude the start codes.
-static void RtpFragmentize(EncodedImage* encoded_image,
-                           std::unique_ptr<uint8_t[]>* encoded_image_buffer,
-                           const VideoFrameBuffer& frame_buffer,
-                           SFrameBSInfo* info,
-                           RTPFragmentationHeader* frag_header) {
-  // Calculate minimum buffer size required to hold encoded data.
-  size_t required_size = 0;
-  size_t fragments_count = 0;
-  for (int layer = 0; layer < info->iLayerNum; ++layer) {
-    const SLayerBSInfo& layerInfo = info->sLayerInfo[layer];
-    for (int nal = 0; nal < layerInfo.iNalCount; ++nal, ++fragments_count) {
-      RTC_CHECK_GE(layerInfo.pNalLengthInByte[nal], 0);
-      // Ensure |required_size| will not overflow.
-      RTC_CHECK_LE(layerInfo.pNalLengthInByte[nal],
-                   std::numeric_limits<size_t>::max() - required_size);
-      required_size += layerInfo.pNalLengthInByte[nal];
-    }
-  }
-  if (encoded_image->_size < required_size) {
-    // Increase buffer size. Allocate enough to hold an unencoded image, this
-    // should be more than enough to hold any encoded data of future frames of
-    // the same size (avoiding possible future reallocation due to variations in
-    // required size).
-    encoded_image->_size = CalcBufferSize(
-        VideoType::kI420, frame_buffer.width(), frame_buffer.height());
-    if (encoded_image->_size < required_size) {
-      // Encoded data > unencoded data. Allocate required bytes.
-      LOG(LS_WARNING) << "Encoding produced more bytes than the original image "
-                      << "data! Original bytes: " << encoded_image->_size
-                      << ", encoded bytes: " << required_size << ".";
-      encoded_image->_size = required_size;
-    }
-    encoded_image->_buffer = new uint8_t[encoded_image->_size];
-    encoded_image_buffer->reset(encoded_image->_buffer);
-  }
-
-  // Iterate layers and NAL units, note each NAL unit as a fragment and copy
-  // the data to |encoded_image->_buffer|.
-  const uint8_t start_code[4] = {0, 0, 0, 1};
-  frag_header->VerifyAndAllocateFragmentationHeader(fragments_count);
-  size_t frag = 0;
-  encoded_image->_length = 0;
-  for (int layer = 0; layer < info->iLayerNum; ++layer) {
-    const SLayerBSInfo& layerInfo = info->sLayerInfo[layer];
-    // Iterate NAL units making up this layer, noting fragments.
-    size_t layer_len = 0;
-    for (int nal = 0; nal < layerInfo.iNalCount; ++nal, ++frag) {
-      // Because the sum of all layer lengths, |required_size|, fits in a
-      // |size_t|, we know that any indices in-between will not overflow.
-      RTC_DCHECK_GE(layerInfo.pNalLengthInByte[nal], 4);
-      RTC_DCHECK_EQ(layerInfo.pBsBuf[layer_len+0], start_code[0]);
-      RTC_DCHECK_EQ(layerInfo.pBsBuf[layer_len+1], start_code[1]);
-      RTC_DCHECK_EQ(layerInfo.pBsBuf[layer_len+2], start_code[2]);
-      RTC_DCHECK_EQ(layerInfo.pBsBuf[layer_len+3], start_code[3]);
-      frag_header->fragmentationOffset[frag] =
-          encoded_image->_length + layer_len + sizeof(start_code);
-      frag_header->fragmentationLength[frag] =
-          layerInfo.pNalLengthInByte[nal] - sizeof(start_code);
-      layer_len += layerInfo.pNalLengthInByte[nal];
-    }
-    // Copy the entire layer's data (including start codes).
-    memcpy(encoded_image->_buffer + encoded_image->_length,
-           layerInfo.pBsBuf,
-           layer_len);
-    encoded_image->_length += layer_len;
-  }
-}
-
-H264EncoderImpl::H264EncoderImpl(const cricket::VideoCodec& codec)
-    : openh264_encoder_(nullptr),
-      width_(0),
-      height_(0),
-      max_frame_rate_(0.0f),
-      target_bps_(0),
-      max_bps_(0),
-      mode_(kRealtimeVideo),
-      frame_dropping_on_(false),
-      key_frame_interval_(0),
-      packetization_mode_(H264PacketizationMode::SingleNalUnit),
-      max_payload_size_(0),
-      number_of_cores_(0),
-      encoded_image_callback_(nullptr),
-      has_reported_init_(false),
-      has_reported_error_(false) {
-  RTC_CHECK(cricket::CodecNamesEq(codec.name, cricket::kH264CodecName));
-  std::string packetization_mode_string;
-  if (codec.GetParam(cricket::kH264FmtpPacketizationMode,
-                     &packetization_mode_string) &&
-      packetization_mode_string == "1") {
-    packetization_mode_ = H264PacketizationMode::NonInterleaved;
-  }
-}
-
-H264EncoderImpl::~H264EncoderImpl() {
-  Release();
-}
-
-int32_t H264EncoderImpl::InitEncode(const VideoCodec* codec_settings,
-                                    int32_t number_of_cores,
-                                    size_t max_payload_size) {
-  ReportInit();
-  if (!codec_settings ||
-      codec_settings->codecType != kVideoCodecH264) {
-    ReportError();
-    return WEBRTC_VIDEO_CODEC_ERR_PARAMETER;
-  }
-  if (codec_settings->maxFramerate == 0) {
-    ReportError();
-    return WEBRTC_VIDEO_CODEC_ERR_PARAMETER;
-  }
-  if (codec_settings->width < 1 || codec_settings->height < 1) {
-    ReportError();
-    return WEBRTC_VIDEO_CODEC_ERR_PARAMETER;
-  }
-
-  int32_t release_ret = Release();
-  if (release_ret != WEBRTC_VIDEO_CODEC_OK) {
-    ReportError();
-    return release_ret;
-  }
-  RTC_DCHECK(!openh264_encoder_);
-
-  // Create encoder.
-  if (WelsCreateSVCEncoder(&openh264_encoder_) != 0) {
-    // Failed to create encoder.
-    LOG(LS_ERROR) << "Failed to create OpenH264 encoder";
-    RTC_DCHECK(!openh264_encoder_);
-    ReportError();
-    return WEBRTC_VIDEO_CODEC_ERROR;
-  }
-  RTC_DCHECK(openh264_encoder_);
-  if (kOpenH264EncoderDetailedLogging) {
-    int trace_level = WELS_LOG_DETAIL;
-    openh264_encoder_->SetOption(ENCODER_OPTION_TRACE_LEVEL,
-                                 &trace_level);
-  }
-  // else WELS_LOG_DEFAULT is used by default.
-
-  number_of_cores_ = number_of_cores;
-  // Set internal settings from codec_settings
-  width_ = codec_settings->width;
-  height_ = codec_settings->height;
-  max_frame_rate_ = static_cast<float>(codec_settings->maxFramerate);
-  mode_ = codec_settings->mode;
-  frame_dropping_on_ = codec_settings->H264().frameDroppingOn;
-  key_frame_interval_ = codec_settings->H264().keyFrameInterval;
-  max_payload_size_ = max_payload_size;
-
-  // Codec_settings uses kbits/second; encoder uses bits/second.
-  max_bps_ = codec_settings->maxBitrate * 1000;
-  if (codec_settings->targetBitrate == 0)
-    target_bps_ = codec_settings->startBitrate * 1000;
-  else
-    target_bps_ = codec_settings->targetBitrate * 1000;
-
-  SEncParamExt encoder_params = CreateEncoderParams();
-
-  // Initialize.
-  if (openh264_encoder_->InitializeExt(&encoder_params) != 0) {
-    LOG(LS_ERROR) << "Failed to initialize OpenH264 encoder";
-    Release();
-    ReportError();
-    return WEBRTC_VIDEO_CODEC_ERROR;
-  }
-  // TODO(pbos): Base init params on these values before submitting.
-  int video_format = EVideoFormatType::videoFormatI420;
-  openh264_encoder_->SetOption(ENCODER_OPTION_DATAFORMAT,
-                               &video_format);
-
-  // Initialize encoded image. Default buffer size: size of unencoded data.
-  encoded_image_._size = CalcBufferSize(VideoType::kI420, codec_settings->width,
-                                        codec_settings->height);
-  encoded_image_._buffer = new uint8_t[encoded_image_._size];
-  encoded_image_buffer_.reset(encoded_image_._buffer);
-  encoded_image_._completeFrame = true;
-  encoded_image_._encodedWidth = 0;
-  encoded_image_._encodedHeight = 0;
-  encoded_image_._length = 0;
-  return WEBRTC_VIDEO_CODEC_OK;
-}
-
-int32_t H264EncoderImpl::Release() {
-  if (openh264_encoder_) {
-    RTC_CHECK_EQ(0, openh264_encoder_->Uninitialize());
-    WelsDestroySVCEncoder(openh264_encoder_);
-    openh264_encoder_ = nullptr;
-  }
-  encoded_image_._buffer = nullptr;
-  encoded_image_buffer_.reset();
-  return WEBRTC_VIDEO_CODEC_OK;
-}
-
-int32_t H264EncoderImpl::RegisterEncodeCompleteCallback(
-    EncodedImageCallback* callback) {
-  encoded_image_callback_ = callback;
-  return WEBRTC_VIDEO_CODEC_OK;
-}
-
-int32_t H264EncoderImpl::SetRateAllocation(
-    const BitrateAllocation& bitrate_allocation,
-    uint32_t framerate) {
-  if (bitrate_allocation.get_sum_bps() <= 0 || framerate <= 0)
-    return WEBRTC_VIDEO_CODEC_ERR_PARAMETER;
-
-  target_bps_ = bitrate_allocation.get_sum_bps();
-  max_frame_rate_ = static_cast<float>(framerate);
-
-  SBitrateInfo target_bitrate;
-  memset(&target_bitrate, 0, sizeof(SBitrateInfo));
-  target_bitrate.iLayer = SPATIAL_LAYER_ALL,
-  target_bitrate.iBitrate = target_bps_;
-  openh264_encoder_->SetOption(ENCODER_OPTION_BITRATE,
-                               &target_bitrate);
-  openh264_encoder_->SetOption(ENCODER_OPTION_FRAME_RATE, &max_frame_rate_);
-  return WEBRTC_VIDEO_CODEC_OK;
-}
-
-int32_t H264EncoderImpl::Encode(const VideoFrame& input_frame,
-                                const CodecSpecificInfo* codec_specific_info,
-                                const std::vector<FrameType>* frame_types) {
-  if (!IsInitialized()) {
-    ReportError();
-    return WEBRTC_VIDEO_CODEC_UNINITIALIZED;
-  }
-  if (!encoded_image_callback_) {
-    LOG(LS_WARNING) << "InitEncode() has been called, but a callback function "
-                    << "has not been set with RegisterEncodeCompleteCallback()";
-    ReportError();
-    return WEBRTC_VIDEO_CODEC_UNINITIALIZED;
-  }
-
-  bool force_key_frame = false;
-  if (frame_types != nullptr) {
-    // We only support a single stream.
-    RTC_DCHECK_EQ(frame_types->size(), 1);
-    // Skip frame?
-    if ((*frame_types)[0] == kEmptyFrame) {
-      return WEBRTC_VIDEO_CODEC_OK;
-    }
-    // Force key frame?
-    force_key_frame = (*frame_types)[0] == kVideoFrameKey;
-  }
-  if (force_key_frame) {
-    // API doc says ForceIntraFrame(false) does nothing, but calling this
-    // function forces a key frame regardless of the |bIDR| argument's value.
-    // (If every frame is a key frame we get lag/delays.)
-    openh264_encoder_->ForceIntraFrame(true);
-  }
-  rtc::scoped_refptr<const I420BufferInterface> frame_buffer =
-      input_frame.video_frame_buffer()->ToI420();
-  // EncodeFrame input.
-  SSourcePicture picture;
-  memset(&picture, 0, sizeof(SSourcePicture));
-  picture.iPicWidth = frame_buffer->width();
-  picture.iPicHeight = frame_buffer->height();
-  picture.iColorFormat = EVideoFormatType::videoFormatI420;
-  picture.uiTimeStamp = input_frame.ntp_time_ms();
-  picture.iStride[0] = frame_buffer->StrideY();
-  picture.iStride[1] = frame_buffer->StrideU();
-  picture.iStride[2] = frame_buffer->StrideV();
-  picture.pData[0] = const_cast<uint8_t*>(frame_buffer->DataY());
-  picture.pData[1] = const_cast<uint8_t*>(frame_buffer->DataU());
-  picture.pData[2] = const_cast<uint8_t*>(frame_buffer->DataV());
-
-  // EncodeFrame output.
-  SFrameBSInfo info;
-  memset(&info, 0, sizeof(SFrameBSInfo));
-
-  // Encode!
-  int enc_ret = openh264_encoder_->EncodeFrame(&picture, &info);
-  if (enc_ret != 0) {
-    LOG(LS_ERROR) << "OpenH264 frame encoding failed, EncodeFrame returned "
-                  << enc_ret << ".";
-    ReportError();
-    return WEBRTC_VIDEO_CODEC_ERROR;
-  }
-
-  encoded_image_._encodedWidth = frame_buffer->width();
-  encoded_image_._encodedHeight = frame_buffer->height();
-  encoded_image_._timeStamp = input_frame.timestamp();
-  encoded_image_.ntp_time_ms_ = input_frame.ntp_time_ms();
-  encoded_image_.capture_time_ms_ = input_frame.render_time_ms();
-  encoded_image_.rotation_ = input_frame.rotation();
-  encoded_image_.content_type_ = (mode_ == kScreensharing)
-                                     ? VideoContentType::SCREENSHARE
-                                     : VideoContentType::UNSPECIFIED;
-  encoded_image_.timing_.flags = TimingFrameFlags::kInvalid;
-  encoded_image_._frameType = ConvertToVideoFrameType(info.eFrameType);
-
-  // Split encoded image up into fragments. This also updates |encoded_image_|.
-  RTPFragmentationHeader frag_header;
-  RtpFragmentize(&encoded_image_, &encoded_image_buffer_, *frame_buffer, &info,
-                 &frag_header);
-
-  // Encoder can skip frames to save bandwidth in which case
-  // |encoded_image_._length| == 0.
-  if (encoded_image_._length > 0) {
-    // Parse QP.
-    h264_bitstream_parser_.ParseBitstream(encoded_image_._buffer,
-                                          encoded_image_._length);
-    h264_bitstream_parser_.GetLastSliceQp(&encoded_image_.qp_);
-
-    // Deliver encoded image.
-    CodecSpecificInfo codec_specific;
-    codec_specific.codecType = kVideoCodecH264;
-    codec_specific.codecSpecific.H264.packetization_mode = packetization_mode_;
-    encoded_image_callback_->OnEncodedImage(encoded_image_, &codec_specific,
-                                            &frag_header);
-  }
-  return WEBRTC_VIDEO_CODEC_OK;
-}
-
-const char* H264EncoderImpl::ImplementationName() const {
-  return "OpenH264";
-}
-
-bool H264EncoderImpl::IsInitialized() const {
-  return openh264_encoder_ != nullptr;
-}
-
-// Initialization parameters.
-// There are two ways to initialize. There is SEncParamBase (cleared with
-// memset(&p, 0, sizeof(SEncParamBase)) used in Initialize, and SEncParamExt
-// which is a superset of SEncParamBase (cleared with GetDefaultParams) used
-// in InitializeExt.
-SEncParamExt H264EncoderImpl::CreateEncoderParams() const {
-  RTC_DCHECK(openh264_encoder_);
-  SEncParamExt encoder_params;
-  openh264_encoder_->GetDefaultParams(&encoder_params);
-  if (mode_ == kRealtimeVideo) {
-    encoder_params.iUsageType = CAMERA_VIDEO_REAL_TIME;
-  } else if (mode_ == kScreensharing) {
-    encoder_params.iUsageType = SCREEN_CONTENT_REAL_TIME;
-  } else {
-    RTC_NOTREACHED();
-  }
-  encoder_params.iPicWidth = width_;
-  encoder_params.iPicHeight = height_;
-  encoder_params.iTargetBitrate = target_bps_;
-  encoder_params.iMaxBitrate = max_bps_;
-  // Rate Control mode
-  encoder_params.iRCMode = RC_BITRATE_MODE;
-  encoder_params.fMaxFrameRate = max_frame_rate_;
-
-  // The following parameters are extension parameters (they're in SEncParamExt,
-  // not in SEncParamBase).
-  encoder_params.bEnableFrameSkip = frame_dropping_on_;
-  // |uiIntraPeriod|    - multiple of GOP size
-  // |keyFrameInterval| - number of frames
-  encoder_params.uiIntraPeriod = key_frame_interval_;
-  encoder_params.uiMaxNalSize = 0;
-  // Threading model: use auto.
-  //  0: auto (dynamic imp. internal encoder)
-  //  1: single thread (default value)
-  // >1: number of threads
-  encoder_params.iMultipleThreadIdc = NumberOfThreads(
-      encoder_params.iPicWidth, encoder_params.iPicHeight, number_of_cores_);
-  // The base spatial layer 0 is the only one we use.
-  encoder_params.sSpatialLayers[0].iVideoWidth = encoder_params.iPicWidth;
-  encoder_params.sSpatialLayers[0].iVideoHeight = encoder_params.iPicHeight;
-  encoder_params.sSpatialLayers[0].fFrameRate = encoder_params.fMaxFrameRate;
-  encoder_params.sSpatialLayers[0].iSpatialBitrate =
-      encoder_params.iTargetBitrate;
-  encoder_params.sSpatialLayers[0].iMaxSpatialBitrate =
-      encoder_params.iMaxBitrate;
-  LOG(INFO) << "OpenH264 version is " << OPENH264_MAJOR << "."
-            << OPENH264_MINOR;
-  switch (packetization_mode_) {
-    case H264PacketizationMode::SingleNalUnit:
-      // Limit the size of the packets produced.
-      encoder_params.sSpatialLayers[0].sSliceArgument.uiSliceNum = 1;
-      encoder_params.sSpatialLayers[0].sSliceArgument.uiSliceMode =
-          SM_SIZELIMITED_SLICE;
-      encoder_params.sSpatialLayers[0].sSliceArgument.uiSliceSizeConstraint =
-          static_cast<unsigned int>(max_payload_size_);
-      break;
-    case H264PacketizationMode::NonInterleaved:
-      // When uiSliceMode = SM_FIXEDSLCNUM_SLICE, uiSliceNum = 0 means auto
-      // design it with cpu core number.
-      // TODO(sprang): Set to 0 when we understand why the rate controller borks
-      //               when uiSliceNum > 1.
-      encoder_params.sSpatialLayers[0].sSliceArgument.uiSliceNum = 1;
-      encoder_params.sSpatialLayers[0].sSliceArgument.uiSliceMode =
-          SM_FIXEDSLCNUM_SLICE;
-      break;
-  }
-  return encoder_params;
-}
-
-void H264EncoderImpl::ReportInit() {
-  if (has_reported_init_)
-    return;
-  RTC_HISTOGRAM_ENUMERATION("WebRTC.Video.H264EncoderImpl.Event",
-                            kH264EncoderEventInit,
-                            kH264EncoderEventMax);
-  has_reported_init_ = true;
-}
-
-void H264EncoderImpl::ReportError() {
-  if (has_reported_error_)
-    return;
-  RTC_HISTOGRAM_ENUMERATION("WebRTC.Video.H264EncoderImpl.Event",
-                            kH264EncoderEventError,
-                            kH264EncoderEventMax);
-  has_reported_error_ = true;
-}
-
-int32_t H264EncoderImpl::SetChannelParameters(
-    uint32_t packet_loss, int64_t rtt) {
-  return WEBRTC_VIDEO_CODEC_OK;
-}
-
-int32_t H264EncoderImpl::SetPeriodicKeyFrames(bool enable) {
-  return WEBRTC_VIDEO_CODEC_OK;
-}
-
-VideoEncoder::ScalingSettings H264EncoderImpl::GetScalingSettings() const {
-  return VideoEncoder::ScalingSettings(true);
-}
-
-}  // namespace webrtc
diff --git a/modules/video_coding/codecs/h264/h264_encoder_impl.h b/modules/video_coding/codecs/h264/h264_encoder_impl.h
deleted file mode 100644
index a455259..0000000
--- a/modules/video_coding/codecs/h264/h264_encoder_impl.h
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- *  Copyright (c) 2015 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_VIDEO_CODING_CODECS_H264_H264_ENCODER_IMPL_H_
-#define WEBRTC_MODULES_VIDEO_CODING_CODECS_H264_H264_ENCODER_IMPL_H_
-
-#include <memory>
-#include <vector>
-
-#include "webrtc/common_video/h264/h264_bitstream_parser.h"
-#include "webrtc/modules/video_coding/codecs/h264/include/h264.h"
-#include "webrtc/modules/video_coding/utility/quality_scaler.h"
-
-#include "third_party/openh264/src/codec/api/svc/codec_app_def.h"
-
-class ISVCEncoder;
-
-namespace webrtc {
-
-class H264EncoderImpl : public H264Encoder {
- public:
-  explicit H264EncoderImpl(const cricket::VideoCodec& codec);
-  ~H264EncoderImpl() override;
-
-  // |max_payload_size| is ignored.
-  // The following members of |codec_settings| are used. The rest are ignored.
-  // - codecType (must be kVideoCodecH264)
-  // - targetBitrate
-  // - maxFramerate
-  // - width
-  // - height
-  int32_t InitEncode(const VideoCodec* codec_settings,
-                     int32_t number_of_cores,
-                     size_t max_payload_size) override;
-  int32_t Release() override;
-
-  int32_t RegisterEncodeCompleteCallback(
-      EncodedImageCallback* callback) override;
-  int32_t SetRateAllocation(const BitrateAllocation& bitrate_allocation,
-                            uint32_t framerate) override;
-
-  // The result of encoding - an EncodedImage and RTPFragmentationHeader - are
-  // passed to the encode complete callback.
-  int32_t Encode(const VideoFrame& frame,
-                 const CodecSpecificInfo* codec_specific_info,
-                 const std::vector<FrameType>* frame_types) override;
-
-  const char* ImplementationName() const override;
-
-  VideoEncoder::ScalingSettings GetScalingSettings() const override;
-
-  // Unsupported / Do nothing.
-  int32_t SetChannelParameters(uint32_t packet_loss, int64_t rtt) override;
-  int32_t SetPeriodicKeyFrames(bool enable) override;
-
-  // Exposed for testing.
-  H264PacketizationMode PacketizationModeForTesting() const {
-    return packetization_mode_;
-  }
-
- private:
-  bool IsInitialized() const;
-  SEncParamExt CreateEncoderParams() const;
-
-  webrtc::H264BitstreamParser h264_bitstream_parser_;
-  // Reports statistics with histograms.
-  void ReportInit();
-  void ReportError();
-
-  ISVCEncoder* openh264_encoder_;
-  // Settings that are used by this encoder.
-  int width_;
-  int height_;
-  float max_frame_rate_;
-  uint32_t target_bps_;
-  uint32_t max_bps_;
-  VideoCodecMode mode_;
-  // H.264 specifc parameters
-  bool frame_dropping_on_;
-  int key_frame_interval_;
-  H264PacketizationMode packetization_mode_;
-
-  size_t max_payload_size_;
-  int32_t number_of_cores_;
-
-  EncodedImage encoded_image_;
-  std::unique_ptr<uint8_t[]> encoded_image_buffer_;
-  EncodedImageCallback* encoded_image_callback_;
-
-  bool has_reported_init_;
-  bool has_reported_error_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_VIDEO_CODING_CODECS_H264_H264_ENCODER_IMPL_H_
diff --git a/modules/video_coding/codecs/h264/h264_encoder_impl_unittest.cc b/modules/video_coding/codecs/h264/h264_encoder_impl_unittest.cc
deleted file mode 100644
index 2d236cf..0000000
--- a/modules/video_coding/codecs/h264/h264_encoder_impl_unittest.cc
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- *  Copyright (c) 2015 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/video_coding/codecs/h264/h264_encoder_impl.h"
-
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-namespace {
-
-const int kMaxPayloadSize = 1024;
-const int kNumCores = 1;
-
-void SetDefaultSettings(VideoCodec* codec_settings) {
-  codec_settings->codecType = kVideoCodecH264;
-  codec_settings->maxFramerate = 60;
-  codec_settings->width = 640;
-  codec_settings->height = 480;
-  // If frame dropping is false, we get a warning that bitrate can't
-  // be controlled for RC_QUALITY_MODE; RC_BITRATE_MODE and RC_TIMESTAMP_MODE
-  codec_settings->H264()->frameDroppingOn = true;
-  codec_settings->targetBitrate = 2000;
-  codec_settings->maxBitrate = 4000;
-}
-
-TEST(H264EncoderImplTest, CanInitializeWithDefaultParameters) {
-  H264EncoderImpl encoder(cricket::VideoCodec("H264"));
-  VideoCodec codec_settings;
-  SetDefaultSettings(&codec_settings);
-  EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK,
-            encoder.InitEncode(&codec_settings, kNumCores, kMaxPayloadSize));
-  EXPECT_EQ(H264PacketizationMode::NonInterleaved,
-            encoder.PacketizationModeForTesting());
-}
-
-TEST(H264EncoderImplTest, CanInitializeWithNonInterleavedModeExplicitly) {
-  cricket::VideoCodec codec("H264");
-  codec.SetParam(cricket::kH264FmtpPacketizationMode, "1");
-  H264EncoderImpl encoder(codec);
-  VideoCodec codec_settings;
-  SetDefaultSettings(&codec_settings);
-  EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK,
-            encoder.InitEncode(&codec_settings, kNumCores, kMaxPayloadSize));
-  EXPECT_EQ(H264PacketizationMode::NonInterleaved,
-            encoder.PacketizationModeForTesting());
-}
-
-TEST(H264EncoderImplTest, CanInitializeWithSingleNalUnitModeExplicitly) {
-  cricket::VideoCodec codec("H264");
-  codec.SetParam(cricket::kH264FmtpPacketizationMode, "0");
-  H264EncoderImpl encoder(codec);
-  VideoCodec codec_settings;
-  SetDefaultSettings(&codec_settings);
-  EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK,
-            encoder.InitEncode(&codec_settings, kNumCores, kMaxPayloadSize));
-  EXPECT_EQ(H264PacketizationMode::SingleNalUnit,
-            encoder.PacketizationModeForTesting());
-}
-
-TEST(H264EncoderImplTest, CanInitializeWithRemovedParameter) {
-  cricket::VideoCodec codec("H264");
-  codec.RemoveParam(cricket::kH264FmtpPacketizationMode);
-  H264EncoderImpl encoder(codec);
-  VideoCodec codec_settings;
-  SetDefaultSettings(&codec_settings);
-  EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK,
-            encoder.InitEncode(&codec_settings, kNumCores, kMaxPayloadSize));
-  EXPECT_EQ(H264PacketizationMode::SingleNalUnit,
-            encoder.PacketizationModeForTesting());
-}
-
-}  // anonymous namespace
-
-}  // namespace webrtc
diff --git a/modules/video_coding/codecs/h264/include/h264.h b/modules/video_coding/codecs/h264/include/h264.h
deleted file mode 100644
index 2d92473..0000000
--- a/modules/video_coding/codecs/h264/include/h264.h
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- *  Copyright (c) 2015 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_VIDEO_CODING_CODECS_H264_INCLUDE_H264_H_
-#define WEBRTC_MODULES_VIDEO_CODING_CODECS_H264_INCLUDE_H264_H_
-
-#include "webrtc/media/base/codec.h"
-#include "webrtc/modules/video_coding/include/video_codec_interface.h"
-
-namespace webrtc {
-
-// Set to disable the H.264 encoder/decoder implementations that are provided if
-// |rtc_use_h264| build flag is true (if false, this function does nothing).
-// This function should only be called before or during WebRTC initialization
-// and is not thread-safe.
-void DisableRtcUseH264();
-
-class H264Encoder : public VideoEncoder {
- public:
-  static H264Encoder* Create(const cricket::VideoCodec& codec);
-  // If H.264 is supported (any implementation).
-  static bool IsSupported();
-
-  ~H264Encoder() override {}
-};
-
-class H264Decoder : public VideoDecoder {
- public:
-  static H264Decoder* Create();
-  static bool IsSupported();
-
-  ~H264Decoder() override {}
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_VIDEO_CODING_CODECS_H264_INCLUDE_H264_H_
diff --git a/modules/video_coding/codecs/h264/include/h264_globals.h b/modules/video_coding/codecs/h264/include/h264_globals.h
deleted file mode 100644
index 8f0d9fe..0000000
--- a/modules/video_coding/codecs/h264/include/h264_globals.h
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- *  Copyright (c) 2012 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.
- */
-
-// This file contains codec dependent definitions that are needed in
-// order to compile the WebRTC codebase, even if this codec is not used.
-
-#ifndef WEBRTC_MODULES_VIDEO_CODING_CODECS_H264_INCLUDE_H264_GLOBALS_H_
-#define WEBRTC_MODULES_VIDEO_CODING_CODECS_H264_INCLUDE_H264_GLOBALS_H_
-
-namespace webrtc {
-
-// The packetization types that we support: single, aggregated, and fragmented.
-enum H264PacketizationTypes {
-  kH264SingleNalu,  // This packet contains a single NAL unit.
-  kH264StapA,       // This packet contains STAP-A (single time
-                    // aggregation) packets. If this packet has an
-                    // associated NAL unit type, it'll be for the
-                    // first such aggregated packet.
-  kH264FuA,         // This packet contains a FU-A (fragmentation
-                    // unit) packet, meaning it is a part of a frame
-                    // that was too large to fit into a single packet.
-};
-
-// Packetization modes are defined in RFC 6184 section 6
-// Due to the structure containing this being initialized with zeroes
-// in some places, and mode 1 being default, mode 1 needs to have the value
-// zero. https://crbug.com/webrtc/6803
-enum class H264PacketizationMode {
-  NonInterleaved = 0,  // Mode 1 - STAP-A, FU-A is allowed
-  SingleNalUnit        // Mode 0 - only single NALU allowed
-};
-
-// This function is declared inline because it is not clear which
-// .cc file it should belong to.
-// TODO(hta): Refactor. https://bugs.webrtc.org/6842
-inline std::ostream& operator<<(std::ostream& stream,
-                                H264PacketizationMode mode) {
-  switch (mode) {
-    case H264PacketizationMode::NonInterleaved:
-      stream << "NonInterleaved";
-      break;
-    case H264PacketizationMode::SingleNalUnit:
-      stream << "SingleNalUnit";
-      break;
-  }
-  return stream;
-}
-
-struct NaluInfo {
-  uint8_t type;
-  int sps_id;
-  int pps_id;
-};
-
-const size_t kMaxNalusPerPacket = 10;
-
-struct RTPVideoHeaderH264 {
-  // The NAL unit type. If this is a header for a
-  // fragmented packet, it's the NAL unit type of
-  // the original data. If this is the header for an
-  // aggregated packet, it's the NAL unit type of
-  // the first NAL unit in the packet.
-  uint8_t nalu_type;
-  // The packetization type of this buffer - single, aggregated or fragmented.
-  H264PacketizationTypes packetization_type;
-  NaluInfo nalus[kMaxNalusPerPacket];
-  size_t nalus_length;
-  // The packetization mode of this transport. Packetization mode
-  // determines which packetization types are allowed when packetizing.
-  H264PacketizationMode packetization_mode;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_VIDEO_CODING_CODECS_H264_INCLUDE_H264_GLOBALS_H_
diff --git a/modules/video_coding/codecs/h264/test/h264_impl_unittest.cc b/modules/video_coding/codecs/h264/test/h264_impl_unittest.cc
deleted file mode 100644
index 806b5ac..0000000
--- a/modules/video_coding/codecs/h264/test/h264_impl_unittest.cc
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- *  Copyright (c) 2017 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/common_video/libyuv/include/webrtc_libyuv.h"
-#include "webrtc/modules/video_coding/codecs/h264/include/h264.h"
-#include "webrtc/modules/video_coding/codecs/test/video_codec_test.h"
-
-namespace webrtc {
-
-class TestH264Impl : public VideoCodecTest {
- protected:
-  VideoEncoder* CreateEncoder() override {
-    return H264Encoder::Create(cricket::VideoCodec(cricket::kH264CodecName));
-  }
-
-  VideoDecoder* CreateDecoder() override { return H264Decoder::Create(); }
-
-  VideoCodec codec_settings() override {
-    VideoCodec codec_inst;
-    codec_inst.codecType = webrtc::kVideoCodecH264;
-    // If frame dropping is false, we get a warning that bitrate can't
-    // be controlled for RC_QUALITY_MODE; RC_BITRATE_MODE and RC_TIMESTAMP_MODE
-    codec_inst.H264()->frameDroppingOn = true;
-    return codec_inst;
-  }
-};
-
-#ifdef WEBRTC_USE_H264
-#define MAYBE_EncodeDecode EncodeDecode
-#define MAYBE_DecodedQpEqualsEncodedQp DecodedQpEqualsEncodedQp
-#else
-#define MAYBE_EncodeDecode DISABLED_EncodeDecode
-#define MAYBE_DecodedQpEqualsEncodedQp DISABLED_DecodedQpEqualsEncodedQp
-#endif
-
-TEST_F(TestH264Impl, MAYBE_EncodeDecode) {
-  EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK,
-            encoder_->Encode(*input_frame_, nullptr, nullptr));
-  EncodedImage encoded_frame;
-  CodecSpecificInfo codec_specific_info;
-  ASSERT_TRUE(WaitForEncodedFrame(&encoded_frame, &codec_specific_info));
-  // First frame should be a key frame.
-  encoded_frame._frameType = kVideoFrameKey;
-  EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK,
-            decoder_->Decode(encoded_frame, false, nullptr));
-  std::unique_ptr<VideoFrame> decoded_frame;
-  rtc::Optional<uint8_t> decoded_qp;
-  ASSERT_TRUE(WaitForDecodedFrame(&decoded_frame, &decoded_qp));
-  ASSERT_TRUE(decoded_frame);
-  EXPECT_GT(I420PSNR(input_frame_.get(), decoded_frame.get()), 36);
-}
-
-TEST_F(TestH264Impl, MAYBE_DecodedQpEqualsEncodedQp) {
-  EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK,
-            encoder_->Encode(*input_frame_, nullptr, nullptr));
-  EncodedImage encoded_frame;
-  CodecSpecificInfo codec_specific_info;
-  ASSERT_TRUE(WaitForEncodedFrame(&encoded_frame, &codec_specific_info));
-  // First frame should be a key frame.
-  encoded_frame._frameType = kVideoFrameKey;
-  EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK,
-            decoder_->Decode(encoded_frame, false, nullptr));
-  std::unique_ptr<VideoFrame> decoded_frame;
-  rtc::Optional<uint8_t> decoded_qp;
-  ASSERT_TRUE(WaitForDecodedFrame(&decoded_frame, &decoded_qp));
-  ASSERT_TRUE(decoded_frame);
-  ASSERT_TRUE(decoded_qp);
-  EXPECT_EQ(encoded_frame.qp_, *decoded_qp);
-}
-
-}  // namespace webrtc
diff --git a/modules/video_coding/codecs/i420/i420.cc b/modules/video_coding/codecs/i420/i420.cc
deleted file mode 100644
index 4f62fae..0000000
--- a/modules/video_coding/codecs/i420/i420.cc
+++ /dev/null
@@ -1,240 +0,0 @@
-/*
- *  Copyright (c) 2012 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/video_coding/codecs/i420/include/i420.h"
-
-#include <limits>
-#include <string>
-
-#include "webrtc/api/video/i420_buffer.h"
-#include "webrtc/common_video/libyuv/include/webrtc_libyuv.h"
-
-namespace {
-const size_t kI420HeaderSize = 4;
-}
-
-namespace webrtc {
-
-I420Encoder::I420Encoder()
-    : _inited(false), _encodedImage(), _encodedCompleteCallback(NULL) {}
-
-I420Encoder::~I420Encoder() {
-  _inited = false;
-  delete[] _encodedImage._buffer;
-}
-
-int I420Encoder::Release() {
-  // Should allocate an encoded frame and then release it here, for that we
-  // actually need an init flag.
-  if (_encodedImage._buffer != NULL) {
-    delete[] _encodedImage._buffer;
-    _encodedImage._buffer = NULL;
-  }
-  _inited = false;
-  return WEBRTC_VIDEO_CODEC_OK;
-}
-
-int I420Encoder::InitEncode(const VideoCodec* codecSettings,
-                            int /*numberOfCores*/,
-                            size_t /*maxPayloadSize */) {
-  if (codecSettings == NULL) {
-    return WEBRTC_VIDEO_CODEC_ERR_PARAMETER;
-  }
-  if (codecSettings->width < 1 || codecSettings->height < 1) {
-    return WEBRTC_VIDEO_CODEC_ERR_PARAMETER;
-  }
-
-  // Allocating encoded memory.
-  if (_encodedImage._buffer != NULL) {
-    delete[] _encodedImage._buffer;
-    _encodedImage._buffer = NULL;
-    _encodedImage._size = 0;
-  }
-  const size_t newSize = CalcBufferSize(VideoType::kI420, codecSettings->width,
-                                        codecSettings->height) +
-                         kI420HeaderSize;
-  uint8_t* newBuffer = new uint8_t[newSize];
-  if (newBuffer == NULL) {
-    return WEBRTC_VIDEO_CODEC_MEMORY;
-  }
-  _encodedImage._size = newSize;
-  _encodedImage._buffer = newBuffer;
-
-  // If no memory allocation, no point to init.
-  _inited = true;
-  return WEBRTC_VIDEO_CODEC_OK;
-}
-
-int I420Encoder::Encode(const VideoFrame& inputImage,
-                        const CodecSpecificInfo* /*codecSpecificInfo*/,
-                        const std::vector<FrameType>* /*frame_types*/) {
-  if (!_inited) {
-    return WEBRTC_VIDEO_CODEC_UNINITIALIZED;
-  }
-  if (_encodedCompleteCallback == NULL) {
-    return WEBRTC_VIDEO_CODEC_UNINITIALIZED;
-  }
-
-  _encodedImage._frameType = kVideoFrameKey;
-  _encodedImage._timeStamp = inputImage.timestamp();
-  _encodedImage._encodedHeight = inputImage.height();
-  _encodedImage._encodedWidth = inputImage.width();
-
-  int width = inputImage.width();
-  if (width > std::numeric_limits<uint16_t>::max()) {
-    return WEBRTC_VIDEO_CODEC_ERR_SIZE;
-  }
-  int height = inputImage.height();
-  if (height > std::numeric_limits<uint16_t>::max()) {
-    return WEBRTC_VIDEO_CODEC_ERR_SIZE;
-  }
-
-  size_t req_length = CalcBufferSize(VideoType::kI420, inputImage.width(),
-                                     inputImage.height()) +
-                      kI420HeaderSize;
-  if (_encodedImage._size > req_length) {
-    // Reallocate buffer.
-    delete[] _encodedImage._buffer;
-
-    _encodedImage._buffer = new uint8_t[req_length];
-    _encodedImage._size = req_length;
-  }
-
-  uint8_t* buffer = _encodedImage._buffer;
-
-  buffer = InsertHeader(buffer, width, height);
-
-  int ret_length =
-      ExtractBuffer(inputImage, req_length - kI420HeaderSize, buffer);
-  if (ret_length < 0)
-    return WEBRTC_VIDEO_CODEC_MEMORY;
-  _encodedImage._length = ret_length + kI420HeaderSize;
-
-  _encodedCompleteCallback->OnEncodedImage(_encodedImage, nullptr, nullptr);
-
-  return WEBRTC_VIDEO_CODEC_OK;
-}
-
-uint8_t* I420Encoder::InsertHeader(uint8_t* buffer,
-                                   uint16_t width,
-                                   uint16_t height) {
-  *buffer++ = static_cast<uint8_t>(width >> 8);
-  *buffer++ = static_cast<uint8_t>(width & 0xFF);
-  *buffer++ = static_cast<uint8_t>(height >> 8);
-  *buffer++ = static_cast<uint8_t>(height & 0xFF);
-  return buffer;
-}
-
-int I420Encoder::RegisterEncodeCompleteCallback(
-    EncodedImageCallback* callback) {
-  _encodedCompleteCallback = callback;
-  return WEBRTC_VIDEO_CODEC_OK;
-}
-
-I420Decoder::I420Decoder()
-    : _width(0),
-      _height(0),
-      _inited(false),
-      _decodeCompleteCallback(NULL) {}
-
-I420Decoder::~I420Decoder() {
-  Release();
-}
-
-int I420Decoder::InitDecode(const VideoCodec* codecSettings,
-                            int /*numberOfCores */) {
-  if (codecSettings == NULL) {
-    return WEBRTC_VIDEO_CODEC_ERR_PARAMETER;
-  } else if (codecSettings->width < 1 || codecSettings->height < 1) {
-    return WEBRTC_VIDEO_CODEC_ERR_PARAMETER;
-  }
-  _width = codecSettings->width;
-  _height = codecSettings->height;
-  _inited = true;
-  return WEBRTC_VIDEO_CODEC_OK;
-}
-
-int I420Decoder::Decode(const EncodedImage& inputImage,
-                        bool /*missingFrames*/,
-                        const RTPFragmentationHeader* /*fragmentation*/,
-                        const CodecSpecificInfo* /*codecSpecificInfo*/,
-                        int64_t /*renderTimeMs*/) {
-  if (inputImage._buffer == NULL) {
-    return WEBRTC_VIDEO_CODEC_ERR_PARAMETER;
-  }
-  if (_decodeCompleteCallback == NULL) {
-    return WEBRTC_VIDEO_CODEC_UNINITIALIZED;
-  }
-  if (inputImage._length <= 0) {
-    return WEBRTC_VIDEO_CODEC_ERR_PARAMETER;
-  }
-  if (inputImage._completeFrame == false) {
-    return WEBRTC_VIDEO_CODEC_ERR_PARAMETER;
-  }
-  if (!_inited) {
-    return WEBRTC_VIDEO_CODEC_UNINITIALIZED;
-  }
-  if (inputImage._length < kI420HeaderSize) {
-    return WEBRTC_VIDEO_CODEC_ERROR;
-  }
-
-  const uint8_t* buffer = inputImage._buffer;
-  uint16_t width, height;
-
-  buffer = ExtractHeader(buffer, &width, &height);
-  _width = width;
-  _height = height;
-
-  // Verify that the available length is sufficient:
-  size_t req_length =
-      CalcBufferSize(VideoType::kI420, _width, _height) + kI420HeaderSize;
-
-  if (req_length > inputImage._length) {
-    return WEBRTC_VIDEO_CODEC_ERROR;
-  }
-  // Set decoded image parameters.
-  rtc::scoped_refptr<webrtc::I420Buffer> frame_buffer =
-      I420Buffer::Create(_width, _height);
-
-  // Converting from raw buffer I420Buffer.
-  int ret = ConvertToI420(VideoType::kI420, buffer, 0, 0, _width, _height, 0,
-                          kVideoRotation_0, frame_buffer.get());
-  if (ret < 0) {
-    return WEBRTC_VIDEO_CODEC_MEMORY;
-  }
-
-  VideoFrame decoded_image(frame_buffer, inputImage._timeStamp, 0,
-                           webrtc::kVideoRotation_0);
-  _decodeCompleteCallback->Decoded(decoded_image);
-  return WEBRTC_VIDEO_CODEC_OK;
-}
-
-const uint8_t* I420Decoder::ExtractHeader(const uint8_t* buffer,
-                                          uint16_t* width,
-                                          uint16_t* height) {
-  *width = static_cast<uint16_t>(*buffer++) << 8;
-  *width |= *buffer++;
-  *height = static_cast<uint16_t>(*buffer++) << 8;
-  *height |= *buffer++;
-
-  return buffer;
-}
-
-int I420Decoder::RegisterDecodeCompleteCallback(
-    DecodedImageCallback* callback) {
-  _decodeCompleteCallback = callback;
-  return WEBRTC_VIDEO_CODEC_OK;
-}
-
-int I420Decoder::Release() {
-  _inited = false;
-  return WEBRTC_VIDEO_CODEC_OK;
-}
-}  // namespace webrtc
diff --git a/modules/video_coding/codecs/i420/include/i420.h b/modules/video_coding/codecs/i420/include/i420.h
deleted file mode 100644
index 6c182d0..0000000
--- a/modules/video_coding/codecs/i420/include/i420.h
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- *  Copyright (c) 2012 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_VIDEO_CODING_CODECS_I420_INCLUDE_I420_H_
-#define WEBRTC_MODULES_VIDEO_CODING_CODECS_I420_INCLUDE_I420_H_
-
-#include <vector>
-
-#include "webrtc/modules/video_coding/include/video_codec_interface.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-class I420Encoder : public VideoEncoder {
- public:
-  I420Encoder();
-
-  virtual ~I420Encoder();
-
-  // Initialize the encoder with the information from the VideoCodec.
-  //
-  // Input:
-  //          - codecSettings     : Codec settings.
-  //          - numberOfCores     : Number of cores available for the encoder.
-  //          - maxPayloadSize    : The maximum size each payload is allowed
-  //                                to have. Usually MTU - overhead.
-  //
-  // Return value                 : WEBRTC_VIDEO_CODEC_OK if OK.
-  //                                <0 - Error
-  int InitEncode(const VideoCodec* codecSettings,
-                 int /*numberOfCores*/,
-                 size_t /*maxPayloadSize*/) override;
-
-  // "Encode" an I420 image (as a part of a video stream). The encoded image
-  // will be returned to the user via the encode complete callback.
-  //
-  // Input:
-  //          - inputImage        : Image to be encoded.
-  //          - codecSpecificInfo : Pointer to codec specific data.
-  //          - frameType         : Frame type to be sent (Key /Delta).
-  //
-  // Return value                 : WEBRTC_VIDEO_CODEC_OK if OK.
-  //                                <0 - Error
-  int Encode(const VideoFrame& inputImage,
-             const CodecSpecificInfo* /*codecSpecificInfo*/,
-             const std::vector<FrameType>* /*frame_types*/) override;
-
-  // Register an encode complete callback object.
-  //
-  // Input:
-  //          - callback         : Callback object which handles encoded images.
-  //
-  // Return value                : WEBRTC_VIDEO_CODEC_OK if OK, < 0 otherwise.
-  int RegisterEncodeCompleteCallback(EncodedImageCallback* callback) override;
-
-  // Free encoder memory.
-  //
-  // Return value                : WEBRTC_VIDEO_CODEC_OK if OK, < 0 otherwise.
-  int Release() override;
-
-  int SetChannelParameters(uint32_t /*packetLoss*/, int64_t /*rtt*/) override {
-    return WEBRTC_VIDEO_CODEC_OK;
-  }
-
- private:
-  static uint8_t* InsertHeader(uint8_t* buffer,
-                               uint16_t width,
-                               uint16_t height);
-
-  bool _inited;
-  EncodedImage _encodedImage;
-  EncodedImageCallback* _encodedCompleteCallback;
-};  // class I420Encoder
-
-class I420Decoder : public VideoDecoder {
- public:
-  I420Decoder();
-
-  virtual ~I420Decoder();
-
-  // Initialize the decoder.
-  // The user must notify the codec of width and height values.
-  //
-  // Return value         :  WEBRTC_VIDEO_CODEC_OK.
-  //                        <0 - Errors
-  int InitDecode(const VideoCodec* codecSettings,
-                 int /*numberOfCores*/) override;
-
-  // Decode encoded image (as a part of a video stream). The decoded image
-  // will be returned to the user through the decode complete callback.
-  //
-  // Input:
-  //          - inputImage        : Encoded image to be decoded
-  //          - missingFrames     : True if one or more frames have been lost
-  //                                since the previous decode call.
-  //          - codecSpecificInfo : pointer to specific codec data
-  //          - renderTimeMs      : Render time in Ms
-  //
-  // Return value                 : WEBRTC_VIDEO_CODEC_OK if OK
-  //                                 <0 - Error
-  int Decode(const EncodedImage& inputImage,
-             bool missingFrames,
-             const RTPFragmentationHeader* /*fragmentation*/,
-             const CodecSpecificInfo* /*codecSpecificInfo*/,
-             int64_t /*renderTimeMs*/) override;
-
-  // Register a decode complete callback object.
-  //
-  // Input:
-  //          - callback         : Callback object which handles decoded images.
-  //
-  // Return value                : WEBRTC_VIDEO_CODEC_OK if OK, < 0 otherwise.
-  int RegisterDecodeCompleteCallback(DecodedImageCallback* callback) override;
-
-  // Free decoder memory.
-  //
-  // Return value                : WEBRTC_VIDEO_CODEC_OK if OK.
-  //                                  <0 - Error
-  int Release() override;
-
- private:
-  static const uint8_t* ExtractHeader(const uint8_t* buffer,
-                                      uint16_t* width,
-                                      uint16_t* height);
-
-  int _width;
-  int _height;
-  bool _inited;
-  DecodedImageCallback* _decodeCompleteCallback;
-};  // class I420Decoder
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_VIDEO_CODING_CODECS_I420_INCLUDE_I420_H_
diff --git a/modules/video_coding/codecs/interface/common_constants.h b/modules/video_coding/codecs/interface/common_constants.h
deleted file mode 100644
index 8ed26c4..0000000
--- a/modules/video_coding/codecs/interface/common_constants.h
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- *  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.
- */
-
-// This file contains constants that are used by multiple global
-// codec definitions (modules/video_coding/codecs/*/include/*_globals.h)
-
-#ifndef WEBRTC_MODULES_VIDEO_CODING_CODECS_INTERFACE_COMMON_CONSTANTS_H_
-#define WEBRTC_MODULES_VIDEO_CODING_CODECS_INTERFACE_COMMON_CONSTANTS_H_
-
-namespace webrtc {
-
-const int16_t kNoPictureId = -1;
-const int16_t kNoTl0PicIdx = -1;
-const uint8_t kNoTemporalIdx = 0xFF;
-const int kNoKeyIdx = -1;
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_VIDEO_CODING_CODECS_INTERFACE_COMMON_CONSTANTS_H_
diff --git a/modules/video_coding/codecs/interface/mock/mock_video_codec_interface.h b/modules/video_coding/codecs/interface/mock/mock_video_codec_interface.h
deleted file mode 100644
index e58da79..0000000
--- a/modules/video_coding/codecs/interface/mock/mock_video_codec_interface.h
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- *  Copyright (c) 2012 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_VIDEO_CODING_CODECS_INTERFACE_MOCK_MOCK_VIDEO_CODEC_INTERFACE_H_
-#define WEBRTC_MODULES_VIDEO_CODING_CODECS_INTERFACE_MOCK_MOCK_VIDEO_CODEC_INTERFACE_H_
-
-#pragma message("WARNING: video_coding/codecs/interface is DEPRECATED; "
-    "use video_coding/include")
-#include <string>
-#include <vector>
-
-#include "webrtc/modules/video_coding/include/video_codec_interface.h"
-#include "webrtc/test/gmock.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-class MockEncodedImageCallback : public EncodedImageCallback {
- public:
-  MOCK_METHOD3(Encoded,
-               int32_t(const EncodedImage& encodedImage,
-                       const CodecSpecificInfo* codecSpecificInfo,
-                       const RTPFragmentationHeader* fragmentation));
-};
-
-class MockVideoEncoder : public VideoEncoder {
- public:
-  MOCK_CONST_METHOD2(Version, int32_t(int8_t* version, int32_t length));
-  MOCK_METHOD3(InitEncode,
-               int32_t(const VideoCodec* codecSettings,
-                       int32_t numberOfCores,
-                       size_t maxPayloadSize));
-  MOCK_METHOD3(Encode,
-               int32_t(const VideoFrame& inputImage,
-                       const CodecSpecificInfo* codecSpecificInfo,
-                       const std::vector<FrameType>* frame_types));
-  MOCK_METHOD1(RegisterEncodeCompleteCallback,
-               int32_t(EncodedImageCallback* callback));
-  MOCK_METHOD0(Release, int32_t());
-  MOCK_METHOD0(Reset, int32_t());
-  MOCK_METHOD2(SetChannelParameters, int32_t(uint32_t packetLoss, int64_t rtt));
-  MOCK_METHOD2(SetRates, int32_t(uint32_t newBitRate, uint32_t frameRate));
-  MOCK_METHOD1(SetPeriodicKeyFrames, int32_t(bool enable));
-};
-
-class MockDecodedImageCallback : public DecodedImageCallback {
- public:
-  MOCK_METHOD1(Decoded, int32_t(const VideoFrame& decodedImage));
-  MOCK_METHOD2(Decoded,
-               int32_t(const VideoFrame& decodedImage, int64_t decode_time_ms));
-  MOCK_METHOD1(ReceivedDecodedReferenceFrame,
-               int32_t(const uint64_t pictureId));
-  MOCK_METHOD1(ReceivedDecodedFrame, int32_t(const uint64_t pictureId));
-};
-
-class MockVideoDecoder : public VideoDecoder {
- public:
-  MOCK_METHOD2(InitDecode,
-               int32_t(const VideoCodec* codecSettings, int32_t numberOfCores));
-  MOCK_METHOD5(Decode,
-               int32_t(const EncodedImage& inputImage,
-                       bool missingFrames,
-                       const RTPFragmentationHeader* fragmentation,
-                       const CodecSpecificInfo* codecSpecificInfo,
-                       int64_t renderTimeMs));
-  MOCK_METHOD1(RegisterDecodeCompleteCallback,
-               int32_t(DecodedImageCallback* callback));
-  MOCK_METHOD0(Release, int32_t());
-  MOCK_METHOD0(Copy, VideoDecoder*());
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_VIDEO_CODING_CODECS_INTERFACE_MOCK_MOCK_VIDEO_CODEC_INTERFACE_H_
diff --git a/modules/video_coding/codecs/interface/video_codec_interface.h b/modules/video_coding/codecs/interface/video_codec_interface.h
deleted file mode 100644
index 2b9d054..0000000
--- a/modules/video_coding/codecs/interface/video_codec_interface.h
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- *  Copyright (c) 2012 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_VIDEO_CODING_CODECS_INTERFACE_VIDEO_CODEC_INTERFACE_H_
-#define WEBRTC_MODULES_VIDEO_CODING_CODECS_INTERFACE_VIDEO_CODEC_INTERFACE_H_
-
-#pragma message("WARNING: video_coding/codecs/interface is DEPRECATED; "
-    "use video_coding/include")
-
-#include "webrtc/modules/video_coding/include/video_codec_interface.h"
-
-#endif  // WEBRTC_MODULES_VIDEO_CODING_CODECS_INTERFACE_VIDEO_CODEC_INTERFACE_H_
diff --git a/modules/video_coding/codecs/interface/video_error_codes.h b/modules/video_coding/codecs/interface/video_error_codes.h
deleted file mode 100644
index ea8829d..0000000
--- a/modules/video_coding/codecs/interface/video_error_codes.h
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- *  Copyright (c) 2011 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_VIDEO_CODING_CODECS_INTERFACE_VIDEO_ERROR_CODES_H_
-#define WEBRTC_MODULES_VIDEO_CODING_CODECS_INTERFACE_VIDEO_ERROR_CODES_H_
-
-#pragma message("WARNING: video_coding/codecs/interface is DEPRECATED; "
-    "use video_coding/include")
-
-// NOTE: in sync with video_coding_module_defines.h
-
-// Define return values
-
-#define WEBRTC_VIDEO_CODEC_REQUEST_SLI 2
-#define WEBRTC_VIDEO_CODEC_NO_OUTPUT 1
-#define WEBRTC_VIDEO_CODEC_OK 0
-#define WEBRTC_VIDEO_CODEC_ERROR -1
-#define WEBRTC_VIDEO_CODEC_LEVEL_EXCEEDED -2
-#define WEBRTC_VIDEO_CODEC_MEMORY -3
-#define WEBRTC_VIDEO_CODEC_ERR_PARAMETER -4
-#define WEBRTC_VIDEO_CODEC_ERR_SIZE -5
-#define WEBRTC_VIDEO_CODEC_TIMEOUT -6
-#define WEBRTC_VIDEO_CODEC_UNINITIALIZED -7
-#define WEBRTC_VIDEO_CODEC_ERR_REQUEST_SLI -12
-#define WEBRTC_VIDEO_CODEC_FALLBACK_SOFTWARE -13
-#define WEBRTC_VIDEO_CODEC_TARGET_BITRATE_OVERSHOOT -14
-
-#endif  // WEBRTC_MODULES_VIDEO_CODING_CODECS_INTERFACE_VIDEO_ERROR_CODES_H_
diff --git a/modules/video_coding/codecs/test/android_test_initializer.cc b/modules/video_coding/codecs/test/android_test_initializer.cc
deleted file mode 100644
index 81942a1..0000000
--- a/modules/video_coding/codecs/test/android_test_initializer.cc
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- *  Copyright 2017 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 <pthread.h>
-
-#include "webrtc/modules/video_coding/codecs/test/android_test_initializer.h"
-#include "webrtc/rtc_base/ignore_wundef.h"
-#include "webrtc/sdk/android/src/jni/classreferenceholder.h"
-#include "webrtc/sdk/android/src/jni/jni_helpers.h"
-
-// Note: this dependency is dangerous since it reaches into Chromium's base.
-// There's a risk of e.g. macro clashes. This file may only be used in tests.
-// Since we use Chrome's build system for creating the gtest binary, this should
-// be fine.
-RTC_PUSH_IGNORING_WUNDEF()
-#include "base/android/jni_android.h"
-RTC_POP_IGNORING_WUNDEF()
-
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-
-namespace {
-
-static pthread_once_t g_initialize_once = PTHREAD_ONCE_INIT;
-
-// There can only be one JNI_OnLoad in each binary. So since this is a GTEST
-// C++ runner binary, we want to initialize the same global objects we normally
-// do if this had been a Java binary.
-void EnsureInitializedOnce() {
-  RTC_CHECK(::base::android::IsVMInitialized());
-  JNIEnv* jni = ::base::android::AttachCurrentThread();
-  JavaVM* jvm = NULL;
-  RTC_CHECK_EQ(0, jni->GetJavaVM(&jvm));
-
-  jint ret = jni::InitGlobalJniVariables(jvm);
-  RTC_DCHECK_GE(ret, 0);
-
-  jni::LoadGlobalClassReferenceHolder();
-}
-
-}  // namespace
-
-void InitializeAndroidObjects() {
-  RTC_CHECK_EQ(0, pthread_once(&g_initialize_once, &EnsureInitializedOnce));
-}
-
-}  // namespace webrtc
diff --git a/modules/video_coding/codecs/test/android_test_initializer.h b/modules/video_coding/codecs/test/android_test_initializer.h
deleted file mode 100644
index a4ec9d2..0000000
--- a/modules/video_coding/codecs/test/android_test_initializer.h
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- *  Copyright 2017 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_VIDEO_CODING_CODECS_TEST_ANDROID_TEST_INITIALIZER_H_
-#define WEBRTC_MODULES_VIDEO_CODING_CODECS_TEST_ANDROID_TEST_INITIALIZER_H_
-
-namespace webrtc {
-
-void InitializeAndroidObjects();
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_VIDEO_CODING_CODECS_TEST_ANDROID_TEST_INITIALIZER_H_
diff --git a/modules/video_coding/codecs/test/mock/mock_packet_manipulator.h b/modules/video_coding/codecs/test/mock/mock_packet_manipulator.h
deleted file mode 100644
index a086a88..0000000
--- a/modules/video_coding/codecs/test/mock/mock_packet_manipulator.h
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- *  Copyright (c) 2011 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_VIDEO_CODING_CODECS_TEST_MOCK_MOCK_PACKET_MANIPULATOR_H_
-#define WEBRTC_MODULES_VIDEO_CODING_CODECS_TEST_MOCK_MOCK_PACKET_MANIPULATOR_H_
-
-#include <string>
-
-#include "webrtc/modules/video_coding/codecs/test/packet_manipulator.h"
-#include "webrtc/test/gmock.h"
-#include "webrtc/typedefs.h"
-#include "webrtc/common_video/include/video_frame.h"
-
-namespace webrtc {
-namespace test {
-
-class MockPacketManipulator : public PacketManipulator {
- public:
-  MOCK_METHOD1(ManipulatePackets, int(webrtc::EncodedImage* encoded_image));
-};
-
-}  // namespace test
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_VIDEO_CODING_CODECS_TEST_MOCK_MOCK_PACKET_MANIPULATOR_H_
diff --git a/modules/video_coding/codecs/test/objc_codec_h264_test.h b/modules/video_coding/codecs/test/objc_codec_h264_test.h
deleted file mode 100644
index 0b82e92..0000000
--- a/modules/video_coding/codecs/test/objc_codec_h264_test.h
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- *  Copyright 2017 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_VIDEO_CODING_CODECS_TEST_OBJC_CODEC_H264_TEST_H_
-#define WEBRTC_MODULES_VIDEO_CODING_CODECS_TEST_OBJC_CODEC_H264_TEST_H_
-
-#include <memory>
-
-#include "webrtc/media/engine/webrtcvideodecoderfactory.h"
-#include "webrtc/media/engine/webrtcvideoencoderfactory.h"
-
-namespace webrtc {
-
-std::unique_ptr<cricket::WebRtcVideoEncoderFactory> CreateObjCEncoderFactory();
-std::unique_ptr<cricket::WebRtcVideoDecoderFactory> CreateObjCDecoderFactory();
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_VIDEO_CODING_CODECS_TEST_OBJC_CODEC_H264_TEST_H_
diff --git a/modules/video_coding/codecs/test/objc_codec_h264_test.mm b/modules/video_coding/codecs/test/objc_codec_h264_test.mm
deleted file mode 100644
index ceb661a..0000000
--- a/modules/video_coding/codecs/test/objc_codec_h264_test.mm
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- *  Copyright 2017 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/video_coding/codecs/test/objc_codec_h264_test.h"
-
-#import "WebRTC/RTCVideoCodecH264.h"
-#include "webrtc/sdk/objc/Framework/Classes/VideoToolbox/objc_video_decoder_factory.h"
-#include "webrtc/sdk/objc/Framework/Classes/VideoToolbox/objc_video_encoder_factory.h"
-
-namespace webrtc {
-
-std::unique_ptr<cricket::WebRtcVideoEncoderFactory> CreateObjCEncoderFactory() {
-  return std::unique_ptr<cricket::WebRtcVideoEncoderFactory>(
-      new ObjCVideoEncoderFactory([[RTCVideoEncoderFactoryH264 alloc] init]));
-}
-
-std::unique_ptr<cricket::WebRtcVideoDecoderFactory> CreateObjCDecoderFactory() {
-  return std::unique_ptr<cricket::WebRtcVideoDecoderFactory>(
-      new ObjCVideoDecoderFactory([[RTCVideoDecoderFactoryH264 alloc] init]));
-}
-
-}  // namespace webrtc
diff --git a/modules/video_coding/codecs/test/packet_manipulator.cc b/modules/video_coding/codecs/test/packet_manipulator.cc
deleted file mode 100644
index 37da9db..0000000
--- a/modules/video_coding/codecs/test/packet_manipulator.cc
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- *  Copyright (c) 2012 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/video_coding/codecs/test/packet_manipulator.h"
-
-#include <assert.h>
-#include <stdio.h>
-
-#include "webrtc/rtc_base/format_macros.h"
-
-namespace webrtc {
-namespace test {
-
-PacketManipulatorImpl::PacketManipulatorImpl(PacketReader* packet_reader,
-                                             const NetworkingConfig& config,
-                                             bool verbose)
-    : packet_reader_(packet_reader),
-      config_(config),
-      active_burst_packets_(0),
-      random_seed_(1),
-      verbose_(verbose) {
-  assert(packet_reader);
-}
-
-int PacketManipulatorImpl::ManipulatePackets(
-    webrtc::EncodedImage* encoded_image) {
-  int nbr_packets_dropped = 0;
-  // There's no need to build a copy of the image data since viewing an
-  // EncodedImage object, setting the length to a new lower value represents
-  // that everything is dropped after that position in the byte array.
-  // EncodedImage._size is the allocated bytes.
-  // EncodedImage._length is how many that are filled with data.
-  int new_length = 0;
-  packet_reader_->InitializeReading(encoded_image->_buffer,
-                                    encoded_image->_length,
-                                    config_.packet_size_in_bytes);
-  uint8_t* packet = NULL;
-  int nbr_bytes_to_read;
-  // keep track of if we've lost any packets, since then we shall loose
-  // the remains of the current frame:
-  bool packet_loss_has_occurred = false;
-  while ((nbr_bytes_to_read = packet_reader_->NextPacket(&packet)) > 0) {
-    // Check if we're currently in a packet loss burst that is not completed:
-    if (active_burst_packets_ > 0) {
-      active_burst_packets_--;
-      nbr_packets_dropped++;
-    } else if (RandomUniform() < config_.packet_loss_probability ||
-               packet_loss_has_occurred) {
-      packet_loss_has_occurred = true;
-      nbr_packets_dropped++;
-      if (config_.packet_loss_mode == kBurst) {
-        // Initiate a new burst
-        active_burst_packets_ = config_.packet_loss_burst_length - 1;
-      }
-    } else {
-      new_length += nbr_bytes_to_read;
-    }
-  }
-  encoded_image->_length = new_length;
-  if (nbr_packets_dropped > 0) {
-    // Must set completeFrame to false to inform the decoder about this:
-    encoded_image->_completeFrame = false;
-    if (verbose_) {
-      printf("Dropped %d packets for frame %d (frame length: %" PRIuS ")\n",
-             nbr_packets_dropped, encoded_image->_timeStamp,
-             encoded_image->_length);
-    }
-  }
-  return nbr_packets_dropped;
-}
-
-void PacketManipulatorImpl::InitializeRandomSeed(unsigned int seed) {
-  random_seed_ = seed;
-}
-
-inline double PacketManipulatorImpl::RandomUniform() {
-  // Use the previous result as new seed before each rand() call. Doing this
-  // it doesn't matter if other threads are calling rand() since we'll always
-  // get the same behavior as long as we're using a fixed initial seed.
-  critsect_.Enter();
-  srand(random_seed_);
-  random_seed_ = rand();  // NOLINT (rand_r instead of rand)
-  critsect_.Leave();
-  return (random_seed_ + 1.0) / (RAND_MAX + 1.0);
-}
-
-const char* PacketLossModeToStr(PacketLossMode e) {
-  switch (e) {
-    case kUniform:
-      return "Uniform";
-    case kBurst:
-      return "Burst";
-    default:
-      assert(false);
-      return "Unknown";
-  }
-}
-
-}  // namespace test
-}  // namespace webrtc
diff --git a/modules/video_coding/codecs/test/packet_manipulator.h b/modules/video_coding/codecs/test/packet_manipulator.h
deleted file mode 100644
index 0067fa9..0000000
--- a/modules/video_coding/codecs/test/packet_manipulator.h
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- *  Copyright (c) 2012 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_VIDEO_CODING_CODECS_TEST_PACKET_MANIPULATOR_H_
-#define WEBRTC_MODULES_VIDEO_CODING_CODECS_TEST_PACKET_MANIPULATOR_H_
-
-#include <stdlib.h>
-
-#include "webrtc/modules/video_coding/include/video_codec_interface.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/test/testsupport/packet_reader.h"
-
-namespace webrtc {
-namespace test {
-
-// Which mode the packet loss shall be performed according to.
-enum PacketLossMode {
-  // Drops packets with a configured probability independently for each packet
-  kUniform,
-  // Drops packets similar to uniform but when a packet is being dropped,
-  // the number of lost packets in a row is equal to the configured burst
-  // length.
-  kBurst
-};
-// Returns a string representation of the enum value.
-const char* PacketLossModeToStr(PacketLossMode e);
-
-// Contains configurations related to networking and simulation of
-// scenarios caused by network interference.
-struct NetworkingConfig {
-  NetworkingConfig()
-      : packet_size_in_bytes(1500),
-        max_payload_size_in_bytes(1440),
-        packet_loss_mode(kUniform),
-        packet_loss_probability(0.0),
-        packet_loss_burst_length(1) {}
-
-  // Packet size in bytes. Default: 1500 bytes.
-  size_t packet_size_in_bytes;
-
-  // Encoder specific setting of maximum size in bytes of each payload.
-  // Default: 1440 bytes.
-  size_t max_payload_size_in_bytes;
-
-  // Packet loss mode. Two different packet loss models are supported:
-  // uniform or burst. This setting has no effect unless
-  // packet_loss_probability is >0.
-  // Default: uniform.
-  PacketLossMode packet_loss_mode;
-
-  // Packet loss probability. A value between 0.0 and 1.0 that defines the
-  // probability of a packet being lost. 0.1 means 10% and so on.
-  // Default: 0 (no loss).
-  double packet_loss_probability;
-
-  // Packet loss burst length. Defines how many packets will be lost in a burst
-  // when a packet has been decided to be lost. Must be >=1. Default: 1.
-  int packet_loss_burst_length;
-};
-
-// Class for simulating packet loss on the encoded frame data.
-// When a packet loss has occurred in a frame, the remaining data in that
-// frame is lost (even if burst length is only a single packet).
-// TODO(kjellander): Support discarding only individual packets in the frame
-// when CL 172001 has been submitted. This also requires a correct
-// fragmentation header to be passed to the decoder.
-//
-// To get a repeatable packet drop pattern, re-initialize the random seed
-// using InitializeRandomSeed before each test run.
-class PacketManipulator {
- public:
-  virtual ~PacketManipulator() {}
-
-  // Manipulates the data of the encoded_image to simulate parts being lost
-  // during transport.
-  // If packets are dropped from frame data, the completedFrame field will be
-  // set to false.
-  // Returns the number of packets being dropped.
-  virtual int ManipulatePackets(webrtc::EncodedImage* encoded_image) = 0;
-};
-
-class PacketManipulatorImpl : public PacketManipulator {
- public:
-  PacketManipulatorImpl(PacketReader* packet_reader,
-                        const NetworkingConfig& config,
-                        bool verbose);
-  ~PacketManipulatorImpl() = default;
-  int ManipulatePackets(webrtc::EncodedImage* encoded_image) override;
-  virtual void InitializeRandomSeed(unsigned int seed);
-
- protected:
-  // Returns a uniformly distributed random value between 0.0 and 1.0
-  virtual double RandomUniform();
-
- private:
-  PacketReader* packet_reader_;
-  const NetworkingConfig& config_;
-  // Used to simulate a burst over several frames.
-  int active_burst_packets_;
-  rtc::CriticalSection critsect_;
-  unsigned int random_seed_;
-  bool verbose_;
-};
-
-}  // namespace test
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_VIDEO_CODING_CODECS_TEST_PACKET_MANIPULATOR_H_
diff --git a/modules/video_coding/codecs/test/packet_manipulator_unittest.cc b/modules/video_coding/codecs/test/packet_manipulator_unittest.cc
deleted file mode 100644
index 69598e2..0000000
--- a/modules/video_coding/codecs/test/packet_manipulator_unittest.cc
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- *  Copyright (c) 2012 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/video_coding/codecs/test/packet_manipulator.h"
-
-#include <queue>
-
-#include "webrtc/modules/video_coding/codecs/test/predictive_packet_manipulator.h"
-#include "webrtc/modules/video_coding/include/video_codec_interface.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/testsupport/unittest_utils.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-namespace test {
-
-const double kNeverDropProbability = 0.0;
-const double kAlwaysDropProbability = 1.0;
-const int kBurstLength = 1;
-
-class PacketManipulatorTest : public PacketRelatedTest {
- protected:
-  PacketReader packet_reader_;
-  EncodedImage image_;
-  NetworkingConfig drop_config_;
-  NetworkingConfig no_drop_config_;
-
-  PacketManipulatorTest() {
-    image_._buffer = packet_data_;
-    image_._length = kPacketDataLength;
-    image_._size = kPacketDataLength;
-
-    drop_config_.packet_size_in_bytes = kPacketSizeInBytes;
-    drop_config_.packet_loss_probability = kAlwaysDropProbability;
-    drop_config_.packet_loss_burst_length = kBurstLength;
-    drop_config_.packet_loss_mode = kUniform;
-
-    no_drop_config_.packet_size_in_bytes = kPacketSizeInBytes;
-    no_drop_config_.packet_loss_probability = kNeverDropProbability;
-    no_drop_config_.packet_loss_burst_length = kBurstLength;
-    no_drop_config_.packet_loss_mode = kUniform;
-  }
-
-  virtual ~PacketManipulatorTest() {}
-
-  void SetUp() { PacketRelatedTest::SetUp(); }
-
-  void TearDown() { PacketRelatedTest::TearDown(); }
-
-  void VerifyPacketLoss(int expected_nbr_packets_dropped,
-                        int actual_nbr_packets_dropped,
-                        size_t expected_packet_data_length,
-                        uint8_t* expected_packet_data,
-                        const EncodedImage& actual_image) {
-    EXPECT_EQ(expected_nbr_packets_dropped, actual_nbr_packets_dropped);
-    EXPECT_EQ(expected_packet_data_length, image_._length);
-    EXPECT_EQ(0, memcmp(expected_packet_data, actual_image._buffer,
-                        expected_packet_data_length));
-  }
-};
-
-TEST_F(PacketManipulatorTest, Constructor) {
-  PacketManipulatorImpl manipulator(&packet_reader_, no_drop_config_, false);
-}
-
-TEST_F(PacketManipulatorTest, DropNone) {
-  PacketManipulatorImpl manipulator(&packet_reader_, no_drop_config_, false);
-  int nbr_packets_dropped = manipulator.ManipulatePackets(&image_);
-  VerifyPacketLoss(0, nbr_packets_dropped, kPacketDataLength, packet_data_,
-                   image_);
-}
-
-TEST_F(PacketManipulatorTest, UniformDropNoneSmallFrame) {
-  size_t data_length = 400;  // smaller than the packet size
-  image_._length = data_length;
-  PacketManipulatorImpl manipulator(&packet_reader_, no_drop_config_, false);
-  int nbr_packets_dropped = manipulator.ManipulatePackets(&image_);
-
-  VerifyPacketLoss(0, nbr_packets_dropped, data_length, packet_data_, image_);
-}
-
-TEST_F(PacketManipulatorTest, UniformDropAll) {
-  PacketManipulatorImpl manipulator(&packet_reader_, drop_config_, false);
-  int nbr_packets_dropped = manipulator.ManipulatePackets(&image_);
-  VerifyPacketLoss(kPacketDataNumberOfPackets, nbr_packets_dropped, 0,
-                   packet_data_, image_);
-}
-
-// Use our customized test class to make the second packet being lost
-TEST_F(PacketManipulatorTest, UniformDropSinglePacket) {
-  drop_config_.packet_loss_probability = 0.5;
-  PredictivePacketManipulator manipulator(&packet_reader_, drop_config_);
-  manipulator.AddRandomResult(1.0);
-  manipulator.AddRandomResult(0.3);  // less than 0.5 will cause packet loss
-  manipulator.AddRandomResult(1.0);
-
-  // Execute the test target method:
-  int nbr_packets_dropped = manipulator.ManipulatePackets(&image_);
-
-  // Since we setup the predictive packet manipulator, it will throw away the
-  // second packet. The third packet is also lost because when we have lost one,
-  // the remains shall also be discarded (in the current implementation).
-  VerifyPacketLoss(2, nbr_packets_dropped, kPacketSizeInBytes, packet1_,
-                   image_);
-}
-
-// Use our customized test class to make the second packet being lost
-TEST_F(PacketManipulatorTest, BurstDropNinePackets) {
-  // Create a longer packet data structure (10 packets)
-  const int kNbrPackets = 10;
-  const size_t kDataLength = kPacketSizeInBytes * kNbrPackets;
-  uint8_t data[kDataLength];
-  uint8_t* data_pointer = data;
-  // Fill with 0s, 1s and so on to be able to easily verify which were dropped:
-  for (int i = 0; i < kNbrPackets; ++i) {
-    memset(data_pointer + i * kPacketSizeInBytes, i, kPacketSizeInBytes);
-  }
-  // Overwrite the defaults from the test fixture:
-  image_._buffer = data;
-  image_._length = kDataLength;
-  image_._size = kDataLength;
-
-  drop_config_.packet_loss_probability = 0.5;
-  drop_config_.packet_loss_burst_length = 5;
-  drop_config_.packet_loss_mode = kBurst;
-  PredictivePacketManipulator manipulator(&packet_reader_, drop_config_);
-  manipulator.AddRandomResult(1.0);
-  manipulator.AddRandomResult(0.3);  // less than 0.5 will cause packet loss
-  for (int i = 0; i < kNbrPackets - 2; ++i) {
-    manipulator.AddRandomResult(1.0);
-  }
-
-  // Execute the test target method:
-  int nbr_packets_dropped = manipulator.ManipulatePackets(&image_);
-
-  // Should discard every packet after the first one.
-  VerifyPacketLoss(9, nbr_packets_dropped, kPacketSizeInBytes, data, image_);
-}
-
-}  // namespace test
-}  // namespace webrtc
diff --git a/modules/video_coding/codecs/test/plot_webrtc_test_logs.py b/modules/video_coding/codecs/test/plot_webrtc_test_logs.py
deleted file mode 100755
index 0a8b094..0000000
--- a/modules/video_coding/codecs/test/plot_webrtc_test_logs.py
+++ /dev/null
@@ -1,452 +0,0 @@
-#  Copyright (c) 2017 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.
-
-"""Plots statistics from WebRTC integration test logs.
-
-Usage: $ python plot_webrtc_test_logs.py filename.txt
-"""
-
-import numpy
-import sys
-import re
-
-import matplotlib.pyplot as plt
-
-# Log events.
-EVENT_START = \
-  'RUN      ] CodecSettings/VideoProcessorIntegrationTestParameterized.'
-EVENT_END = 'OK ] CodecSettings/VideoProcessorIntegrationTestParameterized.'
-
-# Metrics to plot, tuple: (name to parse in file, label to use when plotting).
-BITRATE = ('Target bitrate', 'target bitrate (kbps)')
-WIDTH = ('Width', 'width')
-HEIGHT = ('Height', 'height')
-FILENAME = ('Filename', 'clip')
-CODEC_TYPE = ('Codec type', 'Codec')
-ENCODER_IMPLEMENTATION_NAME = ('Encoder implementation name', 'enc name')
-DECODER_IMPLEMENTATION_NAME = ('Decoder implementation name', 'dec name')
-CODEC_IMPLEMENTATION_NAME = ('Codec implementation name', 'codec name')
-CORES = ('# CPU cores used', 'CPU cores used')
-DENOISING = ('Denoising', 'denoising')
-RESILIENCE = ('Resilience', 'resilience')
-ERROR_CONCEALMENT = ('Error concealment', 'error concealment')
-QP = ('Average QP', 'avg QP')
-PSNR = ('PSNR avg', 'PSNR (dB)')
-SSIM = ('SSIM avg', 'SSIM')
-ENC_BITRATE = ('Encoded bitrate', 'encoded bitrate (kbps)')
-FRAMERATE = ('Frame rate', 'fps')
-NUM_FRAMES = ('# processed frames', 'num frames')
-NUM_DROPPED_FRAMES = ('# dropped frames', 'num dropped frames')
-NUM_FRAMES_TO_TARGET = ('# frames to convergence',
-                        'frames to reach target rate')
-ENCODE_TIME = ('Encoding time', 'encode time (us)')
-ENCODE_TIME_AVG = ('Encoding time', 'encode time (us) avg')
-DECODE_TIME = ('Decoding time', 'decode time (us)')
-DECODE_TIME_AVG = ('Decoding time', 'decode time (us) avg')
-FRAME_SIZE = ('Frame sizes', 'frame size (bytes)')
-FRAME_SIZE_AVG = ('Frame sizes', 'frame size (bytes) avg')
-AVG_KEY_FRAME_SIZE = ('Average key frame size', 'avg key frame size (bytes)')
-AVG_NON_KEY_FRAME_SIZE = ('Average non-key frame size',
-                          'avg non-key frame size (bytes)')
-
-# Settings.
-SETTINGS = [
-  WIDTH,
-  HEIGHT,
-  FILENAME,
-  NUM_FRAMES,
-  ENCODE_TIME,
-  DECODE_TIME,
-  FRAME_SIZE,
-]
-
-# Settings, options for x-axis.
-X_SETTINGS = [
-  CORES,
-  FRAMERATE,
-  DENOISING,
-  RESILIENCE,
-  ERROR_CONCEALMENT,
-  BITRATE,  # TODO(asapersson): Needs to be last.
-]
-
-# Settings, options for subplots.
-SUBPLOT_SETTINGS = [
-  CODEC_TYPE,
-  ENCODER_IMPLEMENTATION_NAME,
-  DECODER_IMPLEMENTATION_NAME,
-  CODEC_IMPLEMENTATION_NAME,
-] + X_SETTINGS
-
-# Results.
-RESULTS = [
-  PSNR,
-  SSIM,
-  ENC_BITRATE,
-  NUM_DROPPED_FRAMES,
-  NUM_FRAMES_TO_TARGET,
-  ENCODE_TIME_AVG,
-  DECODE_TIME_AVG,
-  QP,
-  AVG_KEY_FRAME_SIZE,
-  AVG_NON_KEY_FRAME_SIZE,
-]
-
-METRICS_TO_PARSE = SETTINGS + SUBPLOT_SETTINGS + RESULTS
-
-Y_METRICS = [res[1] for res in RESULTS]
-
-# Parameters for plotting.
-FIG_SIZE_SCALE_FACTOR_X = 1.6
-FIG_SIZE_SCALE_FACTOR_Y = 1.8
-GRID_COLOR = [0.45, 0.45, 0.45]
-
-
-def ParseSetting(filename, setting):
-  """Parses setting from file.
-
-  Args:
-    filename: The name of the file.
-    setting: Name of setting to parse (e.g. width).
-
-  Returns:
-    A list holding parsed settings, e.g. ['width: 128.0', 'width: 160.0'] """
-
-  settings = []
-
-  settings_file = open(filename)
-  while True:
-    line = settings_file.readline()
-    if not line:
-      break
-    if re.search(r'%s' % EVENT_START, line):
-      # Parse event.
-      parsed = {}
-      while True:
-        line = settings_file.readline()
-        if not line:
-          break
-        if re.search(r'%s' % EVENT_END, line):
-          # Add parsed setting to list.
-          if setting in parsed:
-            s = setting + ': ' + str(parsed[setting])
-            if s not in settings:
-              settings.append(s)
-          break
-
-        TryFindMetric(parsed, line, settings_file)
-
-  settings_file.close()
-  return settings
-
-
-def ParseMetrics(filename, setting1, setting2):
-  """Parses metrics from file.
-
-  Args:
-    filename: The name of the file.
-    setting1: First setting for sorting metrics (e.g. width).
-    setting2: Second setting for sorting metrics (e.g. CPU cores used).
-
-  Returns:
-    A dictionary holding parsed metrics.
-
-  For example:
-    metrics[key1][key2][measurement]
-
-  metrics = {
-  "width: 352": {
-    "CPU cores used: 1.0": {
-      "encode time (us)": [0.718005, 0.806925, 0.909726, 0.931835, 0.953642],
-      "PSNR (dB)": [25.546029, 29.465518, 34.723535, 36.428493, 38.686551],
-      "bitrate (kbps)": [50, 100, 300, 500, 1000]
-    },
-    "CPU cores used: 2.0": {
-      "encode time (us)": [0.718005, 0.806925, 0.909726, 0.931835, 0.953642],
-      "PSNR (dB)": [25.546029, 29.465518, 34.723535, 36.428493, 38.686551],
-      "bitrate (kbps)": [50, 100, 300, 500, 1000]
-    },
-  },
-  "width: 176": {
-    "CPU cores used: 1.0": {
-      "encode time (us)": [0.857897, 0.91608, 0.959173, 0.971116, 0.980961],
-      "PSNR (dB)": [30.243646, 33.375592, 37.574387, 39.42184, 41.437897],
-      "bitrate (kbps)": [50, 100, 300, 500, 1000]
-    },
-  }
-  } """
-
-  metrics = {}
-
-  # Parse events.
-  settings_file = open(filename)
-  while True:
-    line = settings_file.readline()
-    if not line:
-      break
-    if re.search(r'%s' % EVENT_START, line):
-      # Parse event.
-      parsed = {}
-      while True:
-        line = settings_file.readline()
-        if not line:
-          break
-        if re.search(r'%s' % EVENT_END, line):
-          # Add parsed values to metrics.
-          key1 = setting1 + ': ' + str(parsed[setting1])
-          key2 = setting2 + ': ' + str(parsed[setting2])
-          if key1 not in metrics:
-            metrics[key1] = {}
-          if key2 not in metrics[key1]:
-            metrics[key1][key2] = {}
-
-          for label in parsed:
-            if label not in metrics[key1][key2]:
-              metrics[key1][key2][label] = []
-            metrics[key1][key2][label].append(parsed[label])
-
-          break
-
-        TryFindMetric(parsed, line, settings_file)
-
-  settings_file.close()
-  return metrics
-
-
-def TryFindMetric(parsed, line, settings_file):
-  for metric in METRICS_TO_PARSE:
-    name = metric[0]
-    label = metric[1]
-    if re.search(r'%s' % name, line):
-      found, value = GetMetric(name, line)
-      if not found:
-        # TODO(asapersson): Change format.
-        # Try find min, max, average stats.
-        found, minimum = GetMetric("Min", settings_file.readline())
-        if not found:
-          return
-        found, maximum = GetMetric("Max", settings_file.readline())
-        if not found:
-          return
-        found, average = GetMetric("Average", settings_file.readline())
-        if not found:
-          return
-
-        parsed[label + ' min'] = minimum
-        parsed[label + ' max'] = maximum
-        parsed[label + ' avg'] = average
-
-      parsed[label] = value
-      return
-
-
-def GetMetric(name, string):
-  # Float (e.g. bitrate = 98.8253).
-  pattern = r'%s\s*[:=]\s*([+-]?\d+\.*\d*)' % name
-  m = re.search(r'%s' % pattern, string)
-  if m is not None:
-    return StringToFloat(m.group(1))
-
-  # Alphanumeric characters (e.g. codec type : VP8).
-  pattern = r'%s\s*[:=]\s*(\w+)' % name
-  m = re.search(r'%s' % pattern, string)
-  if m is not None:
-    return True, m.group(1)
-
-  return False, -1
-
-
-def StringToFloat(value):
-  try:
-    value = float(value)
-  except ValueError:
-    print "Not a float, skipped %s" % value
-    return False, -1
-
-  return True, value
-
-
-def Plot(y_metric, x_metric, metrics):
-  """Plots y_metric vs x_metric per key in metrics.
-
-  For example:
-    y_metric = 'PSNR (dB)'
-    x_metric = 'bitrate (kbps)'
-    metrics = {
-      "CPU cores used: 1.0": {
-        "PSNR (dB)": [25.546029, 29.465518, 34.723535, 36.428493, 38.686551],
-        "bitrate (kbps)": [50, 100, 300, 500, 1000]
-      },
-      "CPU cores used: 2.0": {
-        "PSNR (dB)": [25.546029, 29.465518, 34.723535, 36.428493, 38.686551],
-        "bitrate (kbps)": [50, 100, 300, 500, 1000]
-      },
-    }
-    """
-  for key in sorted(metrics):
-    data = metrics[key]
-    if y_metric not in data:
-      print "Failed to find metric: %s" % y_metric
-      continue
-
-    y = numpy.array(data[y_metric])
-    x = numpy.array(data[x_metric])
-    if len(y) != len(x):
-      print "Length mismatch for %s, %s" % (y, x)
-      continue
-
-    label = y_metric + ' - ' + str(key)
-
-    plt.plot(x, y, label=label, linewidth=1.5, marker='o', markersize=5,
-             markeredgewidth=0.0)
-
-
-def PlotFigure(settings, y_metrics, x_metric, metrics, title):
-  """Plots metrics in y_metrics list. One figure is plotted and each entry
-  in the list is plotted in a subplot (and sorted per settings).
-
-  For example:
-    settings = ['width: 128.0', 'width: 160.0']. Sort subplot per setting.
-    y_metrics = ['PSNR (dB)', 'PSNR (dB)']. Metric to plot per subplot.
-    x_metric = 'bitrate (kbps)'
-
-  """
-
-  plt.figure()
-  plt.suptitle(title, fontsize='large', fontweight='bold')
-  settings.sort()
-  rows = len(settings)
-  cols = 1
-  pos = 1
-  while pos <= rows:
-    plt.rc('grid', color=GRID_COLOR)
-    ax = plt.subplot(rows, cols, pos)
-    plt.grid()
-    plt.setp(ax.get_xticklabels(), visible=(pos == rows), fontsize='large')
-    plt.setp(ax.get_yticklabels(), fontsize='large')
-    setting = settings[pos - 1]
-    Plot(y_metrics[pos - 1], x_metric, metrics[setting])
-    if setting.startswith(WIDTH[1]):
-      plt.title(setting, fontsize='medium')
-    plt.legend(fontsize='large', loc='best')
-    pos += 1
-
-  plt.xlabel(x_metric, fontsize='large')
-  plt.subplots_adjust(left=0.06, right=0.98, bottom=0.05, top=0.94, hspace=0.08)
-
-
-def GetTitle(filename, setting):
-  title = ''
-  if setting != CODEC_IMPLEMENTATION_NAME[1] and setting != CODEC_TYPE[1]:
-    codec_types = ParseSetting(filename, CODEC_TYPE[1])
-    for i in range(0, len(codec_types)):
-      title += codec_types[i] + ', '
-
-  if setting != CORES[1]:
-    cores = ParseSetting(filename, CORES[1])
-    for i in range(0, len(cores)):
-      title += cores[i].split('.')[0] + ', '
-
-  if setting != FRAMERATE[1]:
-    framerate = ParseSetting(filename, FRAMERATE[1])
-    for i in range(0, len(framerate)):
-      title += framerate[i].split('.')[0] + ', '
-
-  if (setting != CODEC_IMPLEMENTATION_NAME[1] and
-      setting != ENCODER_IMPLEMENTATION_NAME[1]):
-    enc_names = ParseSetting(filename, ENCODER_IMPLEMENTATION_NAME[1])
-    for i in range(0, len(enc_names)):
-      title += enc_names[i] + ', '
-
-  if (setting != CODEC_IMPLEMENTATION_NAME[1] and
-      setting != DECODER_IMPLEMENTATION_NAME[1]):
-    dec_names = ParseSetting(filename, DECODER_IMPLEMENTATION_NAME[1])
-    for i in range(0, len(dec_names)):
-      title += dec_names[i] + ', '
-
-  filenames = ParseSetting(filename, FILENAME[1])
-  title += filenames[0].split('_')[0]
-
-  num_frames = ParseSetting(filename, NUM_FRAMES[1])
-  for i in range(0, len(num_frames)):
-    title += ' (' + num_frames[i].split('.')[0] + ')'
-
-  return title
-
-
-def ToString(input_list):
-  return ToStringWithoutMetric(input_list, ('', ''))
-
-
-def ToStringWithoutMetric(input_list, metric):
-  i = 1
-  output_str = ""
-  for m in input_list:
-    if m != metric:
-      output_str = output_str + ("%s. %s\n" % (i, m[1]))
-      i += 1
-  return output_str
-
-
-def GetIdx(text_list):
-  return int(raw_input(text_list)) - 1
-
-
-def main():
-  filename = sys.argv[1]
-
-  # Setup.
-  idx_metric = GetIdx("Choose metric:\n0. All\n%s" % ToString(RESULTS))
-  if idx_metric == -1:
-    # Plot all metrics. One subplot for each metric.
-    # Per subplot: metric vs bitrate (per resolution).
-    cores = ParseSetting(filename, CORES[1])
-    setting1 = CORES[1]
-    setting2 = WIDTH[1]
-    sub_keys = [cores[0]] * len(Y_METRICS)
-    y_metrics = Y_METRICS
-    x_metric = BITRATE[1]
-  else:
-    resolutions = ParseSetting(filename, WIDTH[1])
-    idx = GetIdx("Select metric for x-axis:\n%s" % ToString(X_SETTINGS))
-    if X_SETTINGS[idx] == BITRATE:
-      idx = GetIdx("Plot per:\n%s" % ToStringWithoutMetric(SUBPLOT_SETTINGS,
-                                                           BITRATE))
-      idx_setting = METRICS_TO_PARSE.index(SUBPLOT_SETTINGS[idx])
-      # Plot one metric. One subplot for each resolution.
-      # Per subplot: metric vs bitrate (per setting).
-      setting1 = WIDTH[1]
-      setting2 = METRICS_TO_PARSE[idx_setting][1]
-      sub_keys = resolutions
-      y_metrics = [RESULTS[idx_metric][1]] * len(sub_keys)
-      x_metric = BITRATE[1]
-    else:
-      # Plot one metric. One subplot for each resolution.
-      # Per subplot: metric vs setting (per bitrate).
-      setting1 = WIDTH[1]
-      setting2 = BITRATE[1]
-      sub_keys = resolutions
-      y_metrics = [RESULTS[idx_metric][1]] * len(sub_keys)
-      x_metric = X_SETTINGS[idx][1]
-
-  metrics = ParseMetrics(filename, setting1, setting2)
-
-  # Stretch fig size.
-  figsize = plt.rcParams["figure.figsize"]
-  figsize[0] *= FIG_SIZE_SCALE_FACTOR_X
-  figsize[1] *= FIG_SIZE_SCALE_FACTOR_Y
-  plt.rcParams["figure.figsize"] = figsize
-
-  PlotFigure(sub_keys, y_metrics, x_metric, metrics,
-             GetTitle(filename, setting2))
-
-  plt.show()
-
-
-if __name__ == '__main__':
-  main()
diff --git a/modules/video_coding/codecs/test/predictive_packet_manipulator.cc b/modules/video_coding/codecs/test/predictive_packet_manipulator.cc
deleted file mode 100644
index 9eba205..0000000
--- a/modules/video_coding/codecs/test/predictive_packet_manipulator.cc
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- *  Copyright (c) 2012 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/video_coding/codecs/test/predictive_packet_manipulator.h"
-
-#include <assert.h>
-#include <stdio.h>
-
-#include "webrtc/test/testsupport/packet_reader.h"
-
-namespace webrtc {
-namespace test {
-
-PredictivePacketManipulator::PredictivePacketManipulator(
-    PacketReader* packet_reader,
-    const NetworkingConfig& config)
-    : PacketManipulatorImpl(packet_reader, config, false) {}
-
-PredictivePacketManipulator::~PredictivePacketManipulator() {}
-
-void PredictivePacketManipulator::AddRandomResult(double result) {
-  assert(result >= 0.0 && result <= 1.0);
-  random_results_.push(result);
-}
-
-double PredictivePacketManipulator::RandomUniform() {
-  if (random_results_.size() == 0u) {
-    fprintf(stderr,
-            "No more stored results, please make sure AddRandomResult()"
-            "is called same amount of times you're going to invoke the "
-            "RandomUniform() function, i.e. once per packet.\n");
-    assert(false);
-  }
-  double result = random_results_.front();
-  random_results_.pop();
-  return result;
-}
-
-}  // namespace test
-}  // namespace webrtc
diff --git a/modules/video_coding/codecs/test/predictive_packet_manipulator.h b/modules/video_coding/codecs/test/predictive_packet_manipulator.h
deleted file mode 100644
index 45c7848..0000000
--- a/modules/video_coding/codecs/test/predictive_packet_manipulator.h
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- *  Copyright (c) 2012 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_VIDEO_CODING_CODECS_TEST_PREDICTIVE_PACKET_MANIPULATOR_H_
-#define WEBRTC_MODULES_VIDEO_CODING_CODECS_TEST_PREDICTIVE_PACKET_MANIPULATOR_H_
-
-#include <queue>
-
-#include "webrtc/modules/video_coding/codecs/test/packet_manipulator.h"
-#include "webrtc/test/testsupport/packet_reader.h"
-
-namespace webrtc {
-namespace test {
-
-// Predictive packet manipulator that allows for setup of the result of
-// the random invocations.
-class PredictivePacketManipulator : public PacketManipulatorImpl {
- public:
-  PredictivePacketManipulator(PacketReader* packet_reader,
-                              const NetworkingConfig& config);
-  virtual ~PredictivePacketManipulator();
-  // Adds a result. You must add at least the same number of results as the
-  // expected calls to the RandomUniform method. The results are added to a
-  // FIFO queue so they will be returned in the same order they were added.
-  // Result parameter must be 0.0 to 1.0.
-  void AddRandomResult(double result);
-
- protected:
-  // Returns a uniformly distributed random value between 0.0 and 1.0
-  double RandomUniform() override;
-
- private:
-  std::queue<double> random_results_;
-};
-
-}  // namespace test
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_VIDEO_CODING_CODECS_TEST_PREDICTIVE_PACKET_MANIPULATOR_H_
diff --git a/modules/video_coding/codecs/test/stats.cc b/modules/video_coding/codecs/test/stats.cc
deleted file mode 100644
index b2950ae..0000000
--- a/modules/video_coding/codecs/test/stats.cc
+++ /dev/null
@@ -1,180 +0,0 @@
-/*
- *  Copyright (c) 2012 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/video_coding/codecs/test/stats.h"
-
-#include <stdio.h>
-
-#include <algorithm>
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/format_macros.h"
-
-namespace webrtc {
-namespace test {
-
-namespace {
-
-bool LessForEncodeTime(const FrameStatistic& s1, const FrameStatistic& s2) {
-  RTC_DCHECK_NE(s1.frame_number, s2.frame_number);
-  return s1.encode_time_us < s2.encode_time_us;
-}
-
-bool LessForDecodeTime(const FrameStatistic& s1, const FrameStatistic& s2) {
-  RTC_DCHECK_NE(s1.frame_number, s2.frame_number);
-  return s1.decode_time_us < s2.decode_time_us;
-}
-
-bool LessForEncodedSize(const FrameStatistic& s1, const FrameStatistic& s2) {
-  RTC_DCHECK_NE(s1.frame_number, s2.frame_number);
-  return s1.encoded_frame_size_bytes < s2.encoded_frame_size_bytes;
-}
-
-bool LessForBitRate(const FrameStatistic& s1, const FrameStatistic& s2) {
-  RTC_DCHECK_NE(s1.frame_number, s2.frame_number);
-  return s1.bitrate_kbps < s2.bitrate_kbps;
-}
-
-}  // namespace
-
-FrameStatistic* Stats::AddFrame() {
-  // We don't expect more frames than what can be stored in an int.
-  stats_.emplace_back(static_cast<int>(stats_.size()));
-  return &stats_.back();
-}
-
-FrameStatistic* Stats::GetFrame(int frame_number) {
-  RTC_CHECK_GE(frame_number, 0);
-  RTC_CHECK_LT(frame_number, stats_.size());
-  return &stats_[frame_number];
-}
-
-size_t Stats::size() const {
-  return stats_.size();
-}
-
-void Stats::PrintSummary() const {
-  if (stats_.empty()) {
-    printf("No frame statistics have been logged yet.\n");
-    return;
-  }
-
-  // Calculate min, max, average and total encoding time.
-  int total_encoding_time_us = 0;
-  int total_decoding_time_us = 0;
-  size_t total_encoded_frame_size_bytes = 0;
-  size_t total_encoded_key_frame_size_bytes = 0;
-  size_t total_encoded_delta_frame_size_bytes = 0;
-  size_t num_key_frames = 0;
-  size_t num_delta_frames = 0;
-
-  for (const FrameStatistic& stat : stats_) {
-    total_encoding_time_us += stat.encode_time_us;
-    total_decoding_time_us += stat.decode_time_us;
-    total_encoded_frame_size_bytes += stat.encoded_frame_size_bytes;
-    if (stat.frame_type == webrtc::kVideoFrameKey) {
-      total_encoded_key_frame_size_bytes += stat.encoded_frame_size_bytes;
-      ++num_key_frames;
-    } else {
-      total_encoded_delta_frame_size_bytes += stat.encoded_frame_size_bytes;
-      ++num_delta_frames;
-    }
-  }
-
-  // Encoding stats.
-  printf("Encoding time:\n");
-  auto frame_it =
-      std::min_element(stats_.begin(), stats_.end(), LessForEncodeTime);
-  printf("  Min     : %7d us (frame %d)\n", frame_it->encode_time_us,
-         frame_it->frame_number);
-  frame_it = std::max_element(stats_.begin(), stats_.end(), LessForEncodeTime);
-  printf("  Max     : %7d us (frame %d)\n", frame_it->encode_time_us,
-         frame_it->frame_number);
-  printf("  Average : %7d us\n",
-         static_cast<int>(total_encoding_time_us / stats_.size()));
-
-  // Decoding stats.
-  printf("Decoding time:\n");
-  // Only consider successfully decoded frames (packet loss may cause failures).
-  std::vector<FrameStatistic> decoded_frames;
-  for (const FrameStatistic& stat : stats_) {
-    if (stat.decoding_successful) {
-      decoded_frames.push_back(stat);
-    }
-  }
-  if (decoded_frames.empty()) {
-    printf("No successfully decoded frames exist in this statistics.\n");
-  } else {
-    frame_it = std::min_element(decoded_frames.begin(), decoded_frames.end(),
-                                LessForDecodeTime);
-    printf("  Min     : %7d us (frame %d)\n", frame_it->decode_time_us,
-           frame_it->frame_number);
-    frame_it = std::max_element(decoded_frames.begin(), decoded_frames.end(),
-                                LessForDecodeTime);
-    printf("  Max     : %7d us (frame %d)\n", frame_it->decode_time_us,
-           frame_it->frame_number);
-    printf("  Average : %7d us\n",
-           static_cast<int>(total_decoding_time_us / decoded_frames.size()));
-    printf("  Failures: %d frames failed to decode.\n",
-           static_cast<int>(stats_.size() - decoded_frames.size()));
-  }
-
-  // Frame size stats.
-  printf("Frame sizes:\n");
-  frame_it = std::min_element(stats_.begin(), stats_.end(), LessForEncodedSize);
-  printf("  Min     : %7" PRIuS " bytes (frame %d)\n",
-         frame_it->encoded_frame_size_bytes, frame_it->frame_number);
-  frame_it = std::max_element(stats_.begin(), stats_.end(), LessForEncodedSize);
-  printf("  Max     : %7" PRIuS " bytes (frame %d)\n",
-         frame_it->encoded_frame_size_bytes, frame_it->frame_number);
-  printf("  Average : %7" PRIuS " bytes\n",
-         total_encoded_frame_size_bytes / stats_.size());
-  if (num_key_frames > 0) {
-    printf("  Average key frame size    : %7" PRIuS " bytes (%" PRIuS
-           " keyframes)\n",
-           total_encoded_key_frame_size_bytes / num_key_frames, num_key_frames);
-  }
-  if (num_delta_frames > 0) {
-    printf("  Average non-key frame size: %7" PRIuS " bytes (%" PRIuS
-           " frames)\n",
-           total_encoded_delta_frame_size_bytes / num_delta_frames,
-           num_delta_frames);
-  }
-
-  // Bitrate stats.
-  printf("Bitrates:\n");
-  frame_it = std::min_element(stats_.begin(), stats_.end(), LessForBitRate);
-  printf("  Min bitrate: %7d kbps (frame %d)\n", frame_it->bitrate_kbps,
-         frame_it->frame_number);
-  frame_it = std::max_element(stats_.begin(), stats_.end(), LessForBitRate);
-  printf("  Max bitrate: %7d kbps (frame %d)\n", frame_it->bitrate_kbps,
-         frame_it->frame_number);
-
-  printf("\n");
-  printf("Total encoding time  : %7d ms.\n", total_encoding_time_us / 1000);
-  printf("Total decoding time  : %7d ms.\n", total_decoding_time_us / 1000);
-  printf("Total processing time: %7d ms.\n",
-         (total_encoding_time_us + total_decoding_time_us) / 1000);
-
-  // QP stats.
-  int total_qp = 0;
-  int total_qp_count = 0;
-  for (const FrameStatistic& stat : stats_) {
-    if (stat.qp >= 0) {
-      total_qp += stat.qp;
-      ++total_qp_count;
-    }
-  }
-  int avg_qp = (total_qp_count > 0) ? (total_qp / total_qp_count) : -1;
-  printf("Average QP: %d\n", avg_qp);
-}
-
-}  // namespace test
-}  // namespace webrtc
diff --git a/modules/video_coding/codecs/test/stats.h b/modules/video_coding/codecs/test/stats.h
deleted file mode 100644
index a0bd112..0000000
--- a/modules/video_coding/codecs/test/stats.h
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- *  Copyright (c) 2011 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_VIDEO_CODING_CODECS_TEST_STATS_H_
-#define WEBRTC_MODULES_VIDEO_CODING_CODECS_TEST_STATS_H_
-
-#include <vector>
-
-#include "webrtc/common_types.h"
-
-namespace webrtc {
-namespace test {
-
-// Statistics for one processed frame.
-struct FrameStatistic {
-  explicit FrameStatistic(int frame_number) : frame_number(frame_number) {}
-  const int frame_number = 0;
-
-  // Encoding.
-  int64_t encode_start_ns = 0;
-  int encode_return_code = 0;
-  bool encoding_successful = false;
-  int encode_time_us = 0;
-  int bitrate_kbps = 0;
-  size_t encoded_frame_size_bytes = 0;
-  webrtc::FrameType frame_type = kVideoFrameDelta;
-
-  // Decoding.
-  int64_t decode_start_ns = 0;
-  int decode_return_code = 0;
-  bool decoding_successful = false;
-  int decode_time_us = 0;
-  int decoded_width = 0;
-  int decoded_height = 0;
-
-  // Quantization.
-  int qp = -1;
-
-  // How many packets were discarded of the encoded frame data (if any).
-  int packets_dropped = 0;
-  size_t total_packets = 0;
-  size_t manipulated_length = 0;
-};
-
-// Statistics for a sequence of processed frames. This class is not thread safe.
-class Stats {
- public:
-  Stats() = default;
-  ~Stats() = default;
-
-  // Creates a FrameStatistic for the next frame to be processed.
-  FrameStatistic* AddFrame();
-
-  // Returns the FrameStatistic corresponding to |frame_number|.
-  FrameStatistic* GetFrame(int frame_number);
-
-  size_t size() const;
-
-  // TODO(brandtr): Add output as CSV.
-  void PrintSummary() const;
-
- private:
-  std::vector<FrameStatistic> stats_;
-};
-
-}  // namespace test
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_VIDEO_CODING_CODECS_TEST_STATS_H_
diff --git a/modules/video_coding/codecs/test/stats_unittest.cc b/modules/video_coding/codecs/test/stats_unittest.cc
deleted file mode 100644
index 24fe265..0000000
--- a/modules/video_coding/codecs/test/stats_unittest.cc
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- *  Copyright (c) 2011 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/video_coding/codecs/test/stats.h"
-
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-namespace test {
-
-TEST(StatsTest, TestEmptyObject) {
-  Stats stats;
-  stats.PrintSummary();  // Should not crash.
-}
-
-TEST(StatsTest, AddSingleFrame) {
-  Stats stats;
-  FrameStatistic* frame_stat = stats.AddFrame();
-  EXPECT_EQ(0, frame_stat->frame_number);
-  EXPECT_EQ(1u, stats.size());
-}
-
-TEST(StatsTest, AddMultipleFrames) {
-  Stats stats;
-  const int kNumFrames = 1000;
-  for (int i = 0; i < kNumFrames; ++i) {
-    FrameStatistic* frame_stat = stats.AddFrame();
-    EXPECT_EQ(i, frame_stat->frame_number);
-  }
-  EXPECT_EQ(kNumFrames, static_cast<int>(stats.size()));
-
-  stats.PrintSummary();  // Should not crash.
-}
-
-}  // namespace test
-}  // namespace webrtc
diff --git a/modules/video_coding/codecs/test/video_codec_test.cc b/modules/video_coding/codecs/test/video_codec_test.cc
deleted file mode 100644
index 1a14750..0000000
--- a/modules/video_coding/codecs/test/video_codec_test.cc
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
- *  Copyright (c) 2017 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/video_coding/codecs/test/video_codec_test.h"
-
-#include "webrtc/api/video/i420_buffer.h"
-#include "webrtc/modules/video_coding/include/video_error_codes.h"
-#include "webrtc/test/frame_utils.h"
-#include "webrtc/test/testsupport/fileutils.h"
-
-static const int kEncodeTimeoutMs = 100;
-static const int kDecodeTimeoutMs = 25;
-// Set bitrate to get higher quality.
-static const int kStartBitrate = 300;
-static const int kTargetBitrate = 2000;
-static const int kMaxBitrate = 4000;
-static const int kWidth = 172;        // Width of the input image.
-static const int kHeight = 144;       // Height of the input image.
-static const int kMaxFramerate = 30;  // Arbitrary value.
-
-namespace webrtc {
-
-EncodedImageCallback::Result
-VideoCodecTest::FakeEncodeCompleteCallback::OnEncodedImage(
-    const EncodedImage& frame,
-    const CodecSpecificInfo* codec_specific_info,
-    const RTPFragmentationHeader* fragmentation) {
-  rtc::CritScope lock(&test_->encoded_frame_section_);
-  test_->encoded_frame_.emplace(frame);
-  RTC_DCHECK(codec_specific_info);
-  test_->codec_specific_info_.codecType = codec_specific_info->codecType;
-  // Skip |codec_name|, to avoid allocating.
-  test_->codec_specific_info_.codecSpecific =
-      codec_specific_info->codecSpecific;
-  test_->encoded_frame_event_.Set();
-  return Result(Result::OK);
-}
-
-void VideoCodecTest::FakeDecodeCompleteCallback::Decoded(
-    VideoFrame& frame,
-    rtc::Optional<int32_t> decode_time_ms,
-    rtc::Optional<uint8_t> qp) {
-  rtc::CritScope lock(&test_->decoded_frame_section_);
-  test_->decoded_frame_.emplace(frame);
-  test_->decoded_qp_ = qp;
-  test_->decoded_frame_event_.Set();
-}
-
-void VideoCodecTest::SetUp() {
-  // Using a QCIF image. Processing only one frame.
-  FILE* source_file_ =
-      fopen(test::ResourcePath("paris_qcif", "yuv").c_str(), "rb");
-  ASSERT_TRUE(source_file_ != NULL);
-  rtc::scoped_refptr<VideoFrameBuffer> video_frame_buffer(
-      test::ReadI420Buffer(kWidth, kHeight, source_file_));
-  input_frame_.reset(new VideoFrame(video_frame_buffer, kVideoRotation_0, 0));
-  fclose(source_file_);
-
-  encoder_.reset(CreateEncoder());
-  decoder_.reset(CreateDecoder());
-  encoder_->RegisterEncodeCompleteCallback(&encode_complete_callback_);
-  decoder_->RegisterDecodeCompleteCallback(&decode_complete_callback_);
-
-  InitCodecs();
-}
-
-bool VideoCodecTest::WaitForEncodedFrame(
-    EncodedImage* frame,
-    CodecSpecificInfo* codec_specific_info) {
-  bool ret = encoded_frame_event_.Wait(kEncodeTimeoutMs);
-  EXPECT_TRUE(ret) << "Timed out while waiting for an encoded frame.";
-  // This becomes unsafe if there are multiple threads waiting for frames.
-  rtc::CritScope lock(&encoded_frame_section_);
-  EXPECT_TRUE(encoded_frame_);
-  if (encoded_frame_) {
-    *frame = std::move(*encoded_frame_);
-    encoded_frame_.reset();
-    RTC_DCHECK(codec_specific_info);
-    codec_specific_info->codecType = codec_specific_info_.codecType;
-    codec_specific_info->codecSpecific = codec_specific_info_.codecSpecific;
-    return true;
-  } else {
-    return false;
-  }
-}
-
-bool VideoCodecTest::WaitForDecodedFrame(std::unique_ptr<VideoFrame>* frame,
-                                         rtc::Optional<uint8_t>* qp) {
-  bool ret = decoded_frame_event_.Wait(kDecodeTimeoutMs);
-  EXPECT_TRUE(ret) << "Timed out while waiting for a decoded frame.";
-  // This becomes unsafe if there are multiple threads waiting for frames.
-  rtc::CritScope lock(&decoded_frame_section_);
-  EXPECT_TRUE(decoded_frame_);
-  if (decoded_frame_) {
-    frame->reset(new VideoFrame(std::move(*decoded_frame_)));
-    *qp = decoded_qp_;
-    decoded_frame_.reset();
-    return true;
-  } else {
-    return false;
-  }
-}
-
-void VideoCodecTest::InitCodecs() {
-  codec_settings_ = codec_settings();
-  codec_settings_.startBitrate = kStartBitrate;
-  codec_settings_.targetBitrate = kTargetBitrate;
-  codec_settings_.maxBitrate = kMaxBitrate;
-  codec_settings_.maxFramerate = kMaxFramerate;
-  codec_settings_.width = kWidth;
-  codec_settings_.height = kHeight;
-  EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK,
-            encoder_->InitEncode(&codec_settings_, 1 /* number of cores */,
-                                 0 /* max payload size (unused) */));
-  EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK,
-            decoder_->InitDecode(&codec_settings_, 1 /* number of cores */));
-}
-
-}  // namespace webrtc
diff --git a/modules/video_coding/codecs/test/video_codec_test.h b/modules/video_coding/codecs/test/video_codec_test.h
deleted file mode 100644
index ed2c1a3..0000000
--- a/modules/video_coding/codecs/test/video_codec_test.h
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- *  Copyright (c) 2017 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_VIDEO_CODING_CODECS_TEST_VIDEO_CODEC_TEST_H_
-#define WEBRTC_MODULES_VIDEO_CODING_CODECS_TEST_VIDEO_CODEC_TEST_H_
-
-#include <memory>
-
-#include "webrtc/api/video_codecs/video_decoder.h"
-#include "webrtc/api/video_codecs/video_encoder.h"
-#include "webrtc/modules/video_coding/include/video_codec_interface.h"
-#include "webrtc/modules/video_coding/utility/vp8_header_parser.h"
-#include "webrtc/modules/video_coding/utility/vp9_uncompressed_header_parser.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/event.h"
-#include "webrtc/rtc_base/thread_annotations.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-class VideoCodecTest : public ::testing::Test {
- public:
-  VideoCodecTest()
-      : encode_complete_callback_(this),
-        decode_complete_callback_(this),
-        encoded_frame_event_(false /* manual reset */,
-                             false /* initially signaled */),
-        decoded_frame_event_(false /* manual reset */,
-                             false /* initially signaled */) {}
-
- protected:
-  class FakeEncodeCompleteCallback : public webrtc::EncodedImageCallback {
-   public:
-    explicit FakeEncodeCompleteCallback(VideoCodecTest* test) : test_(test) {}
-
-    Result OnEncodedImage(const EncodedImage& frame,
-                          const CodecSpecificInfo* codec_specific_info,
-                          const RTPFragmentationHeader* fragmentation);
-
-   private:
-    VideoCodecTest* const test_;
-  };
-
-  class FakeDecodeCompleteCallback : public webrtc::DecodedImageCallback {
-   public:
-    explicit FakeDecodeCompleteCallback(VideoCodecTest* test) : test_(test) {}
-
-    int32_t Decoded(VideoFrame& frame) override {
-      RTC_NOTREACHED();
-      return -1;
-    }
-    int32_t Decoded(VideoFrame& frame, int64_t decode_time_ms) override {
-      RTC_NOTREACHED();
-      return -1;
-    }
-    void Decoded(VideoFrame& frame,
-                 rtc::Optional<int32_t> decode_time_ms,
-                 rtc::Optional<uint8_t> qp) override;
-
-   private:
-    VideoCodecTest* const test_;
-  };
-
-  virtual VideoEncoder* CreateEncoder() = 0;
-  virtual VideoDecoder* CreateDecoder() = 0;
-  virtual VideoCodec codec_settings() = 0;
-
-  void SetUp() override;
-
-  bool WaitForEncodedFrame(EncodedImage* frame,
-                           CodecSpecificInfo* codec_specific_info);
-  bool WaitForDecodedFrame(std::unique_ptr<VideoFrame>* frame,
-                           rtc::Optional<uint8_t>* qp);
-
-  // Populated by InitCodecs().
-  VideoCodec codec_settings_;
-
-  std::unique_ptr<VideoFrame> input_frame_;
-
-  std::unique_ptr<VideoEncoder> encoder_;
-  std::unique_ptr<VideoDecoder> decoder_;
-
- private:
-  void InitCodecs();
-
-  FakeEncodeCompleteCallback encode_complete_callback_;
-  FakeDecodeCompleteCallback decode_complete_callback_;
-
-  rtc::Event encoded_frame_event_;
-  rtc::CriticalSection encoded_frame_section_;
-  rtc::Optional<EncodedImage> encoded_frame_
-      RTC_GUARDED_BY(encoded_frame_section_);
-  CodecSpecificInfo codec_specific_info_ RTC_GUARDED_BY(encoded_frame_section_);
-
-  rtc::Event decoded_frame_event_;
-  rtc::CriticalSection decoded_frame_section_;
-  rtc::Optional<VideoFrame> decoded_frame_
-      RTC_GUARDED_BY(decoded_frame_section_);
-  rtc::Optional<uint8_t> decoded_qp_ RTC_GUARDED_BY(decoded_frame_section_);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_VIDEO_CODING_CODECS_TEST_VIDEO_CODEC_TEST_H_
diff --git a/modules/video_coding/codecs/test/videoprocessor.cc b/modules/video_coding/codecs/test/videoprocessor.cc
deleted file mode 100644
index 0641a87..0000000
--- a/modules/video_coding/codecs/test/videoprocessor.cc
+++ /dev/null
@@ -1,486 +0,0 @@
-/*
- *  Copyright (c) 2012 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/video_coding/codecs/test/videoprocessor.h"
-
-#include <string.h>
-
-#include <limits>
-#include <memory>
-#include <utility>
-#include <vector>
-
-#include "webrtc/api/video/i420_buffer.h"
-#include "webrtc/common_types.h"
-#include "webrtc/modules/video_coding/codecs/vp8/simulcast_rate_allocator.h"
-#include "webrtc/modules/video_coding/include/video_codec_initializer.h"
-#include "webrtc/modules/video_coding/utility/default_video_bitrate_allocator.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/timeutils.h"
-#include "webrtc/system_wrappers/include/cpu_info.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-namespace test {
-
-namespace {
-
-const int kRtpClockRateHz = 90000;
-
-std::unique_ptr<VideoBitrateAllocator> CreateBitrateAllocator(
-    TestConfig* config) {
-  std::unique_ptr<TemporalLayersFactory> tl_factory;
-  if (config->codec_settings.codecType == VideoCodecType::kVideoCodecVP8) {
-    tl_factory.reset(new TemporalLayersFactory());
-    config->codec_settings.VP8()->tl_factory = tl_factory.get();
-  }
-  return std::unique_ptr<VideoBitrateAllocator>(
-      VideoCodecInitializer::CreateBitrateAllocator(config->codec_settings,
-                                                    std::move(tl_factory)));
-}
-
-void PrintCodecSettings(const VideoCodec& codec_settings) {
-  printf(" Codec settings:\n");
-  printf("  Codec type        : %s\n",
-         CodecTypeToPayloadString(codec_settings.codecType));
-  printf("  Start bitrate     : %d kbps\n", codec_settings.startBitrate);
-  printf("  Max bitrate       : %d kbps\n", codec_settings.maxBitrate);
-  printf("  Min bitrate       : %d kbps\n", codec_settings.minBitrate);
-  printf("  Width             : %d\n", codec_settings.width);
-  printf("  Height            : %d\n", codec_settings.height);
-  printf("  Max frame rate    : %d\n", codec_settings.maxFramerate);
-  printf("  QPmax             : %d\n", codec_settings.qpMax);
-  if (codec_settings.codecType == kVideoCodecVP8) {
-    printf("  Complexity        : %d\n", codec_settings.VP8().complexity);
-    printf("  Resilience        : %d\n", codec_settings.VP8().resilience);
-    printf("  # temporal layers : %d\n",
-           codec_settings.VP8().numberOfTemporalLayers);
-    printf("  Denoising         : %d\n", codec_settings.VP8().denoisingOn);
-    printf("  Error concealment : %d\n",
-           codec_settings.VP8().errorConcealmentOn);
-    printf("  Automatic resize  : %d\n",
-           codec_settings.VP8().automaticResizeOn);
-    printf("  Frame dropping    : %d\n", codec_settings.VP8().frameDroppingOn);
-    printf("  Key frame interval: %d\n", codec_settings.VP8().keyFrameInterval);
-  } else if (codec_settings.codecType == kVideoCodecVP9) {
-    printf("  Complexity        : %d\n", codec_settings.VP9().complexity);
-    printf("  Resilience        : %d\n", codec_settings.VP9().resilienceOn);
-    printf("  # temporal layers : %d\n",
-           codec_settings.VP9().numberOfTemporalLayers);
-    printf("  Denoising         : %d\n", codec_settings.VP9().denoisingOn);
-    printf("  Frame dropping    : %d\n", codec_settings.VP9().frameDroppingOn);
-    printf("  Key frame interval: %d\n", codec_settings.VP9().keyFrameInterval);
-    printf("  Adaptive QP mode  : %d\n", codec_settings.VP9().adaptiveQpMode);
-    printf("  Automatic resize  : %d\n",
-           codec_settings.VP9().automaticResizeOn);
-    printf("  # spatial layers  : %d\n",
-           codec_settings.VP9().numberOfSpatialLayers);
-    printf("  Flexible mode     : %d\n", codec_settings.VP9().flexibleMode);
-  } else if (codec_settings.codecType == kVideoCodecH264) {
-    printf("  Frame dropping    : %d\n", codec_settings.H264().frameDroppingOn);
-    printf("  Key frame interval: %d\n",
-           codec_settings.H264().keyFrameInterval);
-    printf("  Profile           : %d\n", codec_settings.H264().profile);
-  }
-}
-
-void VerifyQpParser(const EncodedImage& encoded_frame,
-                    const TestConfig& config) {
-  if (config.hw_encoder)
-    return;
-
-  int qp;
-  if (config.codec_settings.codecType == kVideoCodecVP8) {
-    ASSERT_TRUE(vp8::GetQp(encoded_frame._buffer, encoded_frame._length, &qp));
-  } else if (config.codec_settings.codecType == kVideoCodecVP9) {
-    ASSERT_TRUE(vp9::GetQp(encoded_frame._buffer, encoded_frame._length, &qp));
-  } else {
-    return;
-  }
-  EXPECT_EQ(encoded_frame.qp_, qp) << "Encoder QP != parsed bitstream QP.";
-}
-
-int GetElapsedTimeMicroseconds(int64_t start_ns, int64_t stop_ns) {
-  int64_t diff_us = (stop_ns - start_ns) / rtc::kNumNanosecsPerMicrosec;
-  RTC_DCHECK_GE(diff_us, std::numeric_limits<int>::min());
-  RTC_DCHECK_LE(diff_us, std::numeric_limits<int>::max());
-  return static_cast<int>(diff_us);
-}
-
-}  // namespace
-
-const char* ExcludeFrameTypesToStr(ExcludeFrameTypes e) {
-  switch (e) {
-    case kExcludeOnlyFirstKeyFrame:
-      return "ExcludeOnlyFirstKeyFrame";
-    case kExcludeAllKeyFrames:
-      return "ExcludeAllKeyFrames";
-    default:
-      RTC_NOTREACHED();
-      return "Unknown";
-  }
-}
-
-VideoProcessor::VideoProcessor(webrtc::VideoEncoder* encoder,
-                               webrtc::VideoDecoder* decoder,
-                               FrameReader* analysis_frame_reader,
-                               FrameWriter* analysis_frame_writer,
-                               PacketManipulator* packet_manipulator,
-                               const TestConfig& config,
-                               Stats* stats,
-                               IvfFileWriter* encoded_frame_writer,
-                               FrameWriter* decoded_frame_writer)
-    : initialized_(false),
-      config_(config),
-      encoder_(encoder),
-      decoder_(decoder),
-      bitrate_allocator_(CreateBitrateAllocator(&config_)),
-      encode_callback_(this),
-      decode_callback_(this),
-      packet_manipulator_(packet_manipulator),
-      analysis_frame_reader_(analysis_frame_reader),
-      analysis_frame_writer_(analysis_frame_writer),
-      encoded_frame_writer_(encoded_frame_writer),
-      decoded_frame_writer_(decoded_frame_writer),
-      last_inputed_frame_num_(-1),
-      last_encoded_frame_num_(-1),
-      last_decoded_frame_num_(-1),
-      first_key_frame_has_been_excluded_(false),
-      last_decoded_frame_buffer_(analysis_frame_reader->FrameLength()),
-      stats_(stats),
-      rate_update_index_(-1) {
-  RTC_DCHECK(encoder);
-  RTC_DCHECK(decoder);
-  RTC_DCHECK(packet_manipulator);
-  RTC_DCHECK(analysis_frame_reader);
-  RTC_DCHECK(analysis_frame_writer);
-  RTC_DCHECK(stats);
-}
-
-VideoProcessor::~VideoProcessor() = default;
-
-void VideoProcessor::Init() {
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&sequence_checker_);
-  RTC_DCHECK(!initialized_) << "VideoProcessor already initialized.";
-  initialized_ = true;
-
-  // Setup required callbacks for the encoder and decoder.
-  RTC_CHECK_EQ(encoder_->RegisterEncodeCompleteCallback(&encode_callback_),
-               WEBRTC_VIDEO_CODEC_OK)
-      << "Failed to register encode complete callback";
-  RTC_CHECK_EQ(decoder_->RegisterDecodeCompleteCallback(&decode_callback_),
-               WEBRTC_VIDEO_CODEC_OK)
-      << "Failed to register decode complete callback";
-
-  // Initialize the encoder and decoder.
-  uint32_t num_cores =
-      config_.use_single_core ? 1 : CpuInfo::DetectNumberOfCores();
-  RTC_CHECK_EQ(
-      encoder_->InitEncode(&config_.codec_settings, num_cores,
-                           config_.networking_config.max_payload_size_in_bytes),
-      WEBRTC_VIDEO_CODEC_OK)
-      << "Failed to initialize VideoEncoder";
-
-  RTC_CHECK_EQ(decoder_->InitDecode(&config_.codec_settings, num_cores),
-               WEBRTC_VIDEO_CODEC_OK)
-      << "Failed to initialize VideoDecoder";
-
-  if (config_.verbose) {
-    printf("Video Processor:\n");
-    printf(" Filename         : %s\n", config_.filename.c_str());
-    printf(" Total # of frames: %d\n",
-           analysis_frame_reader_->NumberOfFrames());
-    printf(" # CPU cores used : %d\n", num_cores);
-    const char* encoder_name = encoder_->ImplementationName();
-    printf(" Encoder implementation name: %s\n", encoder_name);
-    const char* decoder_name = decoder_->ImplementationName();
-    printf(" Decoder implementation name: %s\n", decoder_name);
-    if (strcmp(encoder_name, decoder_name) == 0) {
-      printf(" Codec implementation name  : %s_%s\n",
-             CodecTypeToPayloadString(config_.codec_settings.codecType),
-             encoder_->ImplementationName());
-    }
-    PrintCodecSettings(config_.codec_settings);
-    printf("\n");
-  }
-}
-
-void VideoProcessor::Release() {
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&sequence_checker_);
-
-  RTC_CHECK_EQ(encoder_->Release(), WEBRTC_VIDEO_CODEC_OK);
-  RTC_CHECK_EQ(decoder_->Release(), WEBRTC_VIDEO_CODEC_OK);
-
-  encoder_->RegisterEncodeCompleteCallback(nullptr);
-  decoder_->RegisterDecodeCompleteCallback(nullptr);
-
-  initialized_ = false;
-}
-
-void VideoProcessor::ProcessFrame() {
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&sequence_checker_);
-  RTC_DCHECK(initialized_) << "VideoProcessor not initialized.";
-  ++last_inputed_frame_num_;
-
-  // Get frame from file.
-  rtc::scoped_refptr<I420BufferInterface> buffer(
-      analysis_frame_reader_->ReadFrame());
-  RTC_CHECK(buffer) << "Tried to read too many frames from the file.";
-  // Use the frame number as the basis for timestamp to identify frames. Let the
-  // first timestamp be non-zero, to not make the IvfFileWriter believe that we
-  // want to use capture timestamps in the IVF files.
-  const uint32_t rtp_timestamp = (last_inputed_frame_num_ + 1) *
-                                 kRtpClockRateHz /
-                                 config_.codec_settings.maxFramerate;
-  rtp_timestamp_to_frame_num_[rtp_timestamp] = last_inputed_frame_num_;
-  const int64_t kNoRenderTime = 0;
-  VideoFrame source_frame(buffer, rtp_timestamp, kNoRenderTime,
-                          webrtc::kVideoRotation_0);
-
-  // Decide if we are going to force a keyframe.
-  std::vector<FrameType> frame_types(1, kVideoFrameDelta);
-  if (config_.keyframe_interval > 0 &&
-      last_inputed_frame_num_ % config_.keyframe_interval == 0) {
-    frame_types[0] = kVideoFrameKey;
-  }
-
-  // Create frame statistics object used for aggregation at end of test run.
-  FrameStatistic* frame_stat = stats_->AddFrame();
-
-  // For the highest measurement accuracy of the encode time, the start/stop
-  // time recordings should wrap the Encode call as tightly as possible.
-  frame_stat->encode_start_ns = rtc::TimeNanos();
-  frame_stat->encode_return_code =
-      encoder_->Encode(source_frame, nullptr, &frame_types);
-
-  if (frame_stat->encode_return_code != WEBRTC_VIDEO_CODEC_OK) {
-    LOG(LS_WARNING) << "Failed to encode frame " << last_inputed_frame_num_
-                    << ", return code: " << frame_stat->encode_return_code
-                    << ".";
-  }
-}
-
-void VideoProcessor::SetRates(int bitrate_kbps, int framerate_fps) {
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&sequence_checker_);
-  config_.codec_settings.maxFramerate = framerate_fps;
-  int set_rates_result = encoder_->SetRateAllocation(
-      bitrate_allocator_->GetAllocation(bitrate_kbps * 1000, framerate_fps),
-      framerate_fps);
-  RTC_DCHECK_GE(set_rates_result, 0)
-      << "Failed to update encoder with new rate " << bitrate_kbps << ".";
-  ++rate_update_index_;
-  num_dropped_frames_.push_back(0);
-  num_spatial_resizes_.push_back(0);
-}
-
-std::vector<int> VideoProcessor::NumberDroppedFramesPerRateUpdate() const {
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&sequence_checker_);
-  return num_dropped_frames_;
-}
-
-std::vector<int> VideoProcessor::NumberSpatialResizesPerRateUpdate() const {
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&sequence_checker_);
-  return num_spatial_resizes_;
-}
-
-void VideoProcessor::FrameEncoded(webrtc::VideoCodecType codec,
-                                  const EncodedImage& encoded_image) {
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&sequence_checker_);
-
-  // For the highest measurement accuracy of the encode time, the start/stop
-  // time recordings should wrap the Encode call as tightly as possible.
-  int64_t encode_stop_ns = rtc::TimeNanos();
-
-  // Take the opportunity to verify the QP bitstream parser.
-  VerifyQpParser(encoded_image, config_);
-
-  // Check for dropped frames.
-  const int frame_number =
-      rtp_timestamp_to_frame_num_[encoded_image._timeStamp];
-  bool last_frame_missing = false;
-  if (frame_number > 0) {
-    RTC_DCHECK_GE(last_encoded_frame_num_, 0);
-    int num_dropped_from_last_encode =
-        frame_number - last_encoded_frame_num_ - 1;
-    RTC_DCHECK_GE(num_dropped_from_last_encode, 0);
-    RTC_CHECK_GE(rate_update_index_, 0);
-    num_dropped_frames_[rate_update_index_] += num_dropped_from_last_encode;
-    if (num_dropped_from_last_encode > 0) {
-      // For dropped frames, we write out the last decoded frame to avoid
-      // getting out of sync for the computation of PSNR and SSIM.
-      for (int i = 0; i < num_dropped_from_last_encode; i++) {
-        RTC_DCHECK_EQ(last_decoded_frame_buffer_.size(),
-                      analysis_frame_writer_->FrameLength());
-        RTC_CHECK(analysis_frame_writer_->WriteFrame(
-            last_decoded_frame_buffer_.data()));
-        if (decoded_frame_writer_) {
-          RTC_DCHECK_EQ(last_decoded_frame_buffer_.size(),
-                        decoded_frame_writer_->FrameLength());
-          RTC_CHECK(decoded_frame_writer_->WriteFrame(
-              last_decoded_frame_buffer_.data()));
-        }
-      }
-    }
-    const FrameStatistic* last_encoded_frame_stat =
-        stats_->GetFrame(last_encoded_frame_num_);
-    last_frame_missing = (last_encoded_frame_stat->manipulated_length == 0);
-  }
-  // Ensure strict monotonicity.
-  RTC_CHECK_GT(frame_number, last_encoded_frame_num_);
-  last_encoded_frame_num_ = frame_number;
-
-  // Update frame statistics.
-  FrameStatistic* frame_stat = stats_->GetFrame(frame_number);
-  frame_stat->encode_time_us =
-      GetElapsedTimeMicroseconds(frame_stat->encode_start_ns, encode_stop_ns);
-  frame_stat->encoding_successful = true;
-  frame_stat->encoded_frame_size_bytes = encoded_image._length;
-  frame_stat->frame_type = encoded_image._frameType;
-  frame_stat->qp = encoded_image.qp_;
-  frame_stat->bitrate_kbps = static_cast<int>(
-      encoded_image._length * config_.codec_settings.maxFramerate * 8 / 1000);
-  frame_stat->total_packets =
-      encoded_image._length / config_.networking_config.packet_size_in_bytes +
-      1;
-
-  // Simulate packet loss.
-  bool exclude_this_frame = false;
-  if (encoded_image._frameType == kVideoFrameKey) {
-    // Only keyframes can be excluded.
-    switch (config_.exclude_frame_types) {
-      case kExcludeOnlyFirstKeyFrame:
-        if (!first_key_frame_has_been_excluded_) {
-          first_key_frame_has_been_excluded_ = true;
-          exclude_this_frame = true;
-        }
-        break;
-      case kExcludeAllKeyFrames:
-        exclude_this_frame = true;
-        break;
-      default:
-        RTC_NOTREACHED();
-    }
-  }
-
-  // Make a raw copy of the |encoded_image| buffer.
-  size_t copied_buffer_size = encoded_image._length +
-                              EncodedImage::GetBufferPaddingBytes(codec);
-  std::unique_ptr<uint8_t[]> copied_buffer(new uint8_t[copied_buffer_size]);
-  memcpy(copied_buffer.get(), encoded_image._buffer, encoded_image._length);
-  // The image to feed to the decoder.
-  EncodedImage copied_image;
-  memcpy(&copied_image, &encoded_image, sizeof(copied_image));
-  copied_image._size = copied_buffer_size;
-  copied_image._buffer = copied_buffer.get();
-
-  if (!exclude_this_frame) {
-    frame_stat->packets_dropped =
-        packet_manipulator_->ManipulatePackets(&copied_image);
-  }
-  frame_stat->manipulated_length = copied_image._length;
-
-  // For the highest measurement accuracy of the decode time, the start/stop
-  // time recordings should wrap the Decode call as tightly as possible.
-  frame_stat->decode_start_ns = rtc::TimeNanos();
-  frame_stat->decode_return_code =
-      decoder_->Decode(copied_image, last_frame_missing, nullptr);
-
-  if (frame_stat->decode_return_code != WEBRTC_VIDEO_CODEC_OK) {
-    // Write the last successful frame the output file to avoid getting it out
-    // of sync with the source file for SSIM and PSNR comparisons.
-    RTC_DCHECK_EQ(last_decoded_frame_buffer_.size(),
-                  analysis_frame_writer_->FrameLength());
-    RTC_CHECK(
-        analysis_frame_writer_->WriteFrame(last_decoded_frame_buffer_.data()));
-    if (decoded_frame_writer_) {
-      RTC_DCHECK_EQ(last_decoded_frame_buffer_.size(),
-                    decoded_frame_writer_->FrameLength());
-      RTC_CHECK(
-          decoded_frame_writer_->WriteFrame(last_decoded_frame_buffer_.data()));
-    }
-  }
-
-  if (encoded_frame_writer_) {
-    RTC_CHECK(encoded_frame_writer_->WriteFrame(encoded_image, codec));
-  }
-}
-
-void VideoProcessor::FrameDecoded(const VideoFrame& image) {
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&sequence_checker_);
-
-  // For the highest measurement accuracy of the decode time, the start/stop
-  // time recordings should wrap the Decode call as tightly as possible.
-  int64_t decode_stop_ns = rtc::TimeNanos();
-
-  // Update frame statistics.
-  const int frame_number = rtp_timestamp_to_frame_num_[image.timestamp()];
-  FrameStatistic* frame_stat = stats_->GetFrame(frame_number);
-  frame_stat->decoded_width = image.width();
-  frame_stat->decoded_height = image.height();
-  frame_stat->decode_time_us =
-      GetElapsedTimeMicroseconds(frame_stat->decode_start_ns, decode_stop_ns);
-  frame_stat->decoding_successful = true;
-
-  // Check if the codecs have resized the frame since previously decoded frame.
-  if (frame_number > 0) {
-    RTC_CHECK_GE(last_decoded_frame_num_, 0);
-    const FrameStatistic* last_decoded_frame_stat =
-        stats_->GetFrame(last_decoded_frame_num_);
-    if (static_cast<int>(image.width()) !=
-            last_decoded_frame_stat->decoded_width ||
-        static_cast<int>(image.height()) !=
-            last_decoded_frame_stat->decoded_height) {
-      RTC_CHECK_GE(rate_update_index_, 0);
-      ++num_spatial_resizes_[rate_update_index_];
-    }
-  }
-  // Ensure strict monotonicity.
-  RTC_CHECK_GT(frame_number, last_decoded_frame_num_);
-  last_decoded_frame_num_ = frame_number;
-
-  // Check if frame size is different from the original size, and if so,
-  // scale back to original size. This is needed for the PSNR and SSIM
-  // calculations.
-  size_t extracted_length;
-  rtc::Buffer extracted_buffer;
-  if (image.width() != config_.codec_settings.width ||
-      image.height() != config_.codec_settings.height) {
-    rtc::scoped_refptr<I420Buffer> scaled_buffer(I420Buffer::Create(
-        config_.codec_settings.width, config_.codec_settings.height));
-    // Should be the same aspect ratio, no cropping needed.
-    scaled_buffer->ScaleFrom(*image.video_frame_buffer()->ToI420());
-
-    size_t length = CalcBufferSize(VideoType::kI420, scaled_buffer->width(),
-                                   scaled_buffer->height());
-    extracted_buffer.SetSize(length);
-    extracted_length =
-        ExtractBuffer(scaled_buffer, length, extracted_buffer.data());
-  } else {
-    // No resize.
-    size_t length =
-        CalcBufferSize(VideoType::kI420, image.width(), image.height());
-    extracted_buffer.SetSize(length);
-    extracted_length = ExtractBuffer(image.video_frame_buffer()->ToI420(),
-                                     length, extracted_buffer.data());
-  }
-
-  RTC_DCHECK_EQ(extracted_length, analysis_frame_writer_->FrameLength());
-  RTC_CHECK(analysis_frame_writer_->WriteFrame(extracted_buffer.data()));
-  if (decoded_frame_writer_) {
-    RTC_DCHECK_EQ(extracted_length, decoded_frame_writer_->FrameLength());
-    RTC_CHECK(decoded_frame_writer_->WriteFrame(extracted_buffer.data()));
-  }
-
-  last_decoded_frame_buffer_ = std::move(extracted_buffer);
-}
-
-}  // namespace test
-}  // namespace webrtc
diff --git a/modules/video_coding/codecs/test/videoprocessor.h b/modules/video_coding/codecs/test/videoprocessor.h
deleted file mode 100644
index 295d012..0000000
--- a/modules/video_coding/codecs/test/videoprocessor.h
+++ /dev/null
@@ -1,313 +0,0 @@
-/*
- *  Copyright (c) 2012 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_VIDEO_CODING_CODECS_TEST_VIDEOPROCESSOR_H_
-#define WEBRTC_MODULES_VIDEO_CODING_CODECS_TEST_VIDEOPROCESSOR_H_
-
-#include <map>
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "webrtc/api/video/video_frame.h"
-#include "webrtc/common_video/libyuv/include/webrtc_libyuv.h"
-#include "webrtc/modules/video_coding/codecs/test/packet_manipulator.h"
-#include "webrtc/modules/video_coding/codecs/test/stats.h"
-#include "webrtc/modules/video_coding/include/video_codec_interface.h"
-#include "webrtc/modules/video_coding/utility/ivf_file_writer.h"
-#include "webrtc/modules/video_coding/utility/vp8_header_parser.h"
-#include "webrtc/modules/video_coding/utility/vp9_uncompressed_header_parser.h"
-#include "webrtc/rtc_base/buffer.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/sequenced_task_checker.h"
-#include "webrtc/rtc_base/task_queue.h"
-#include "webrtc/test/testsupport/frame_reader.h"
-#include "webrtc/test/testsupport/frame_writer.h"
-
-namespace webrtc {
-
-class VideoBitrateAllocator;
-
-namespace test {
-
-// Defines which frame types shall be excluded from packet loss and when.
-enum ExcludeFrameTypes {
-  // Will exclude the first keyframe in the video sequence from packet loss.
-  // Following keyframes will be targeted for packet loss.
-  kExcludeOnlyFirstKeyFrame,
-  // Exclude all keyframes from packet loss, no matter where in the video
-  // sequence they occur.
-  kExcludeAllKeyFrames
-};
-
-// Returns a string representation of the enum value.
-const char* ExcludeFrameTypesToStr(ExcludeFrameTypes e);
-
-// Test configuration for a test run.
-struct TestConfig {
-  // Plain name of YUV file to process without file extension.
-  std::string filename;
-
-  // File to process. This must be a video file in the YUV format.
-  std::string input_filename;
-
-  // File to write to during processing for the test. Will be a video file
-  // in the YUV format.
-  std::string output_filename;
-
-  // Configurations related to networking.
-  NetworkingConfig networking_config;
-
-  // Decides how the packet loss simulations shall exclude certain frames
-  // from packet loss.
-  ExcludeFrameTypes exclude_frame_types = kExcludeOnlyFirstKeyFrame;
-
-  // Force the encoder and decoder to use a single core for processing.
-  // Using a single core is necessary to get a deterministic behavior for the
-  // encoded frames - using multiple cores will produce different encoded frames
-  // since multiple cores are competing to consume the byte budget for each
-  // frame in parallel.
-  // If set to false, the maximum number of available cores will be used.
-  bool use_single_core = false;
-
-  // If > 0: forces the encoder to create a keyframe every Nth frame.
-  // Note that the encoder may create a keyframe in other locations in addition
-  // to this setting. Forcing key frames may also affect encoder planning
-  // optimizations in a negative way, since it will suddenly be forced to
-  // produce an expensive key frame.
-  int keyframe_interval = 0;
-
-  // The codec settings to use for the test (target bitrate, video size,
-  // framerate and so on). This struct should be filled in using the
-  // VideoCodingModule::Codec() method.
-  webrtc::VideoCodec codec_settings;
-
-  // If printing of information to stdout shall be performed during processing.
-  bool verbose = true;
-
-  // Should hardware accelerated codecs be used?
-  bool hw_encoder = false;
-  bool hw_decoder = false;
-
-  // Should the hardware codecs be wrapped in software fallbacks?
-  bool sw_fallback_encoder = false;
-  // TODO(brandtr): Add support for SW decoder fallbacks, when
-  // webrtc::VideoDecoder's can be wrapped in std::unique_ptr's.
-};
-
-// Handles encoding/decoding of video using the VideoEncoder/VideoDecoder
-// interfaces. This is done in a sequential manner in order to be able to
-// measure times properly.
-// The class processes a frame at the time for the configured input file.
-// It maintains state of where in the source input file the processing is at.
-//
-// Regarding packet loss: Note that keyframes are excluded (first or all
-// depending on the ExcludeFrameTypes setting). This is because if key frames
-// would be altered, all the following delta frames would be pretty much
-// worthless. VP8 has an error-resilience feature that makes it able to handle
-// packet loss in key non-first keyframes, which is why only the first is
-// excluded by default.
-// Packet loss in such important frames is handled on a higher level in the
-// Video Engine, where signaling would request a retransmit of the lost packets,
-// since they're so important.
-//
-// Note this class is not thread safe in any way and is meant for simple testing
-// purposes.
-class VideoProcessor {
- public:
-  VideoProcessor(webrtc::VideoEncoder* encoder,
-                 webrtc::VideoDecoder* decoder,
-                 FrameReader* analysis_frame_reader,
-                 FrameWriter* analysis_frame_writer,
-                 PacketManipulator* packet_manipulator,
-                 const TestConfig& config,
-                 Stats* stats,
-                 IvfFileWriter* encoded_frame_writer,
-                 FrameWriter* decoded_frame_writer);
-  ~VideoProcessor();
-
-  // Sets up callbacks and initializes the encoder and decoder.
-  void Init();
-
-  // Tears down callbacks and releases the encoder and decoder.
-  void Release();
-
-  // Reads a frame from the analysis frame reader and sends it to the encoder.
-  // When the encode callback is received, the encoded frame is sent to the
-  // decoder. The decoded frame is written to disk by the analysis frame writer.
-  // Objective video quality metrics can thus be calculated after the fact.
-  void ProcessFrame();
-
-  // Updates the encoder with target rates. Must be called at least once.
-  void SetRates(int bitrate_kbps, int framerate_fps);
-
-  // Returns the number of dropped frames.
-  std::vector<int> NumberDroppedFramesPerRateUpdate() const;
-
-  // Returns the number of spatial resizes.
-  std::vector<int> NumberSpatialResizesPerRateUpdate() const;
-
- private:
-  class VideoProcessorEncodeCompleteCallback
-      : public webrtc::EncodedImageCallback {
-   public:
-    explicit VideoProcessorEncodeCompleteCallback(
-        VideoProcessor* video_processor)
-        : video_processor_(video_processor),
-          task_queue_(rtc::TaskQueue::Current()) {}
-
-    Result OnEncodedImage(
-        const webrtc::EncodedImage& encoded_image,
-        const webrtc::CodecSpecificInfo* codec_specific_info,
-        const webrtc::RTPFragmentationHeader* fragmentation) override {
-      RTC_CHECK(codec_specific_info);
-
-      if (task_queue_ && !task_queue_->IsCurrent()) {
-        task_queue_->PostTask(
-            std::unique_ptr<rtc::QueuedTask>(new EncodeCallbackTask(
-                video_processor_, encoded_image, codec_specific_info)));
-        return Result(Result::OK, 0);
-      }
-
-      video_processor_->FrameEncoded(codec_specific_info->codecType,
-                                     encoded_image);
-      return Result(Result::OK, 0);
-    }
-
-   private:
-    class EncodeCallbackTask : public rtc::QueuedTask {
-     public:
-      EncodeCallbackTask(VideoProcessor* video_processor,
-                         const webrtc::EncodedImage& encoded_image,
-                         const webrtc::CodecSpecificInfo* codec_specific_info)
-          : video_processor_(video_processor),
-            buffer_(encoded_image._buffer, encoded_image._length),
-            encoded_image_(encoded_image),
-            codec_specific_info_(*codec_specific_info) {
-        encoded_image_._buffer = buffer_.data();
-      }
-
-      bool Run() override {
-        video_processor_->FrameEncoded(codec_specific_info_.codecType,
-                                       encoded_image_);
-        return true;
-      }
-
-     private:
-      VideoProcessor* const video_processor_;
-      rtc::Buffer buffer_;
-      webrtc::EncodedImage encoded_image_;
-      const webrtc::CodecSpecificInfo codec_specific_info_;
-    };
-
-    VideoProcessor* const video_processor_;
-    rtc::TaskQueue* const task_queue_;
-  };
-
-  class VideoProcessorDecodeCompleteCallback
-      : public webrtc::DecodedImageCallback {
-   public:
-    explicit VideoProcessorDecodeCompleteCallback(
-        VideoProcessor* video_processor)
-        : video_processor_(video_processor),
-          task_queue_(rtc::TaskQueue::Current()) {}
-
-    int32_t Decoded(webrtc::VideoFrame& image) override {
-      if (task_queue_ && !task_queue_->IsCurrent()) {
-        task_queue_->PostTask(
-            [this, image]() { video_processor_->FrameDecoded(image); });
-        return 0;
-      }
-      video_processor_->FrameDecoded(image);
-      return 0;
-    }
-
-    int32_t Decoded(webrtc::VideoFrame& image,
-                    int64_t decode_time_ms) override {
-      return Decoded(image);
-    }
-
-    void Decoded(webrtc::VideoFrame& image,
-                 rtc::Optional<int32_t> decode_time_ms,
-                 rtc::Optional<uint8_t> qp) override {
-      Decoded(image);
-    }
-
-   private:
-    VideoProcessor* const video_processor_;
-    rtc::TaskQueue* const task_queue_;
-  };
-
-  // Invoked by the callback adapter when a frame has completed encoding.
-  void FrameEncoded(webrtc::VideoCodecType codec,
-                    const webrtc::EncodedImage& encodedImage);
-
-  // Invoked by the callback adapter when a frame has completed decoding.
-  void FrameDecoded(const webrtc::VideoFrame& image);
-
-  bool initialized_ RTC_GUARDED_BY(sequence_checker_);
-  TestConfig config_ RTC_GUARDED_BY(sequence_checker_);
-
-  webrtc::VideoEncoder* const encoder_;
-  webrtc::VideoDecoder* const decoder_;
-  const std::unique_ptr<VideoBitrateAllocator> bitrate_allocator_;
-
-  // Adapters for the codec callbacks.
-  VideoProcessorEncodeCompleteCallback encode_callback_;
-  VideoProcessorDecodeCompleteCallback decode_callback_;
-
-  // Fake network.
-  PacketManipulator* const packet_manipulator_;
-
-  // These (mandatory) file manipulators are used for, e.g., objective PSNR and
-  // SSIM calculations at the end of a test run.
-  FrameReader* const analysis_frame_reader_;
-  FrameWriter* const analysis_frame_writer_;
-
-  // These (optional) file writers are used to persistently store the encoded
-  // and decoded bitstreams. The purpose is to give the experimenter an option
-  // to subjectively evaluate the quality of the processing. Each frame writer
-  // is enabled by being non-null.
-  IvfFileWriter* const encoded_frame_writer_;
-  FrameWriter* const decoded_frame_writer_;
-
-  // Keep track of inputed/encoded/decoded frames, so we can detect frame drops.
-  int last_inputed_frame_num_ RTC_GUARDED_BY(sequence_checker_);
-  int last_encoded_frame_num_ RTC_GUARDED_BY(sequence_checker_);
-  int last_decoded_frame_num_ RTC_GUARDED_BY(sequence_checker_);
-
-  // Store an RTP timestamp -> frame number map, since the timestamps are
-  // based off of the frame rate, which can change mid-test.
-  std::map<uint32_t, int> rtp_timestamp_to_frame_num_
-      RTC_GUARDED_BY(sequence_checker_);
-
-  // Keep track of if we have excluded the first key frame from packet loss.
-  bool first_key_frame_has_been_excluded_ RTC_GUARDED_BY(sequence_checker_);
-
-  // Keep track of the last successfully decoded frame, since we write that
-  // frame to disk when decoding fails.
-  rtc::Buffer last_decoded_frame_buffer_ RTC_GUARDED_BY(sequence_checker_);
-
-  // Statistics.
-  Stats* stats_;
-  std::vector<int> num_dropped_frames_ RTC_GUARDED_BY(sequence_checker_);
-  std::vector<int> num_spatial_resizes_ RTC_GUARDED_BY(sequence_checker_);
-  int rate_update_index_ RTC_GUARDED_BY(sequence_checker_);
-
-  rtc::SequencedTaskChecker sequence_checker_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(VideoProcessor);
-};
-
-}  // namespace test
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_VIDEO_CODING_CODECS_TEST_VIDEOPROCESSOR_H_
diff --git a/modules/video_coding/codecs/test/videoprocessor_integrationtest.cc b/modules/video_coding/codecs/test/videoprocessor_integrationtest.cc
deleted file mode 100644
index 508316b..0000000
--- a/modules/video_coding/codecs/test/videoprocessor_integrationtest.cc
+++ /dev/null
@@ -1,657 +0,0 @@
-/*
- *  Copyright (c) 2017 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/video_coding/codecs/test/videoprocessor_integrationtest.h"
-
-#include <utility>
-
-#if defined(WEBRTC_ANDROID)
-#include "webrtc/modules/video_coding/codecs/test/android_test_initializer.h"
-#include "webrtc/sdk/android/src/jni/androidmediadecoder_jni.h"
-#include "webrtc/sdk/android/src/jni/androidmediaencoder_jni.h"
-#elif defined(WEBRTC_IOS)
-#include "webrtc/modules/video_coding/codecs/test/objc_codec_h264_test.h"
-#endif
-
-#include "webrtc/media/engine/internaldecoderfactory.h"
-#include "webrtc/media/engine/internalencoderfactory.h"
-#include "webrtc/media/engine/videoencodersoftwarefallbackwrapper.h"
-#include "webrtc/modules/video_coding/codecs/vp8/include/vp8_common_types.h"
-#include "webrtc/modules/video_coding/include/video_codec_interface.h"
-#include "webrtc/modules/video_coding/include/video_coding.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/event.h"
-#include "webrtc/rtc_base/file.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/ptr_util.h"
-#include "webrtc/system_wrappers/include/sleep.h"
-#include "webrtc/test/testsupport/fileutils.h"
-#include "webrtc/test/testsupport/metrics/video_metrics.h"
-#include "webrtc/test/video_codec_settings.h"
-
-namespace webrtc {
-namespace test {
-
-namespace {
-
-const int kPercTargetvsActualMismatch = 20;
-const int kBaseKeyFrameInterval = 3000;
-
-// Parameters from VP8 wrapper, which control target size of key frames.
-const float kInitialBufferSize = 0.5f;
-const float kOptimalBufferSize = 0.6f;
-const float kScaleKeyFrameSize = 0.5f;
-
-void VerifyQuality(const QualityMetricsResult& psnr_result,
-                   const QualityMetricsResult& ssim_result,
-                   const QualityThresholds& quality_thresholds) {
-  EXPECT_GT(psnr_result.average, quality_thresholds.min_avg_psnr);
-  EXPECT_GT(psnr_result.min, quality_thresholds.min_min_psnr);
-  EXPECT_GT(ssim_result.average, quality_thresholds.min_avg_ssim);
-  EXPECT_GT(ssim_result.min, quality_thresholds.min_min_ssim);
-}
-
-int NumberOfTemporalLayers(const VideoCodec& codec_settings) {
-  if (codec_settings.codecType == kVideoCodecVP8) {
-    return codec_settings.VP8().numberOfTemporalLayers;
-  } else if (codec_settings.codecType == kVideoCodecVP9) {
-    return codec_settings.VP9().numberOfTemporalLayers;
-  } else {
-    return 1;
-  }
-}
-
-}  // namespace
-
-VideoProcessorIntegrationTest::VideoProcessorIntegrationTest() {
-#if defined(WEBRTC_ANDROID)
-  InitializeAndroidObjects();
-#endif
-}
-
-VideoProcessorIntegrationTest::~VideoProcessorIntegrationTest() = default;
-
-void VideoProcessorIntegrationTest::SetCodecSettings(TestConfig* config,
-                                                     VideoCodecType codec_type,
-                                                     int num_temporal_layers,
-                                                     bool error_concealment_on,
-                                                     bool denoising_on,
-                                                     bool frame_dropper_on,
-                                                     bool spatial_resize_on,
-                                                     bool resilience_on,
-                                                     int width,
-                                                     int height) {
-  webrtc::test::CodecSettings(codec_type, &config->codec_settings);
-
-  // TODO(brandtr): Move the setting of |width| and |height| to the tests, and
-  // DCHECK that they are set before initializing the codec instead.
-  config->codec_settings.width = width;
-  config->codec_settings.height = height;
-
-  switch (config->codec_settings.codecType) {
-    case kVideoCodecVP8:
-      config->codec_settings.VP8()->resilience =
-          resilience_on ? kResilientStream : kResilienceOff;
-      config->codec_settings.VP8()->numberOfTemporalLayers =
-          num_temporal_layers;
-      config->codec_settings.VP8()->denoisingOn = denoising_on;
-      config->codec_settings.VP8()->errorConcealmentOn = error_concealment_on;
-      config->codec_settings.VP8()->automaticResizeOn = spatial_resize_on;
-      config->codec_settings.VP8()->frameDroppingOn = frame_dropper_on;
-      config->codec_settings.VP8()->keyFrameInterval = kBaseKeyFrameInterval;
-      break;
-    case kVideoCodecVP9:
-      config->codec_settings.VP9()->resilienceOn = resilience_on;
-      config->codec_settings.VP9()->numberOfTemporalLayers =
-          num_temporal_layers;
-      config->codec_settings.VP9()->denoisingOn = denoising_on;
-      config->codec_settings.VP9()->frameDroppingOn = frame_dropper_on;
-      config->codec_settings.VP9()->keyFrameInterval = kBaseKeyFrameInterval;
-      config->codec_settings.VP9()->automaticResizeOn = spatial_resize_on;
-      break;
-    case kVideoCodecH264:
-      config->codec_settings.H264()->frameDroppingOn = frame_dropper_on;
-      config->codec_settings.H264()->keyFrameInterval = kBaseKeyFrameInterval;
-      break;
-    default:
-      RTC_NOTREACHED();
-      break;
-  }
-}
-
-void VideoProcessorIntegrationTest::SetRateProfile(
-    RateProfile* rate_profile,
-    int rate_update_index,
-    int bitrate_kbps,
-    int framerate_fps,
-    int frame_index_rate_update) {
-  rate_profile->target_bit_rate[rate_update_index] = bitrate_kbps;
-  rate_profile->input_frame_rate[rate_update_index] = framerate_fps;
-  rate_profile->frame_index_rate_update[rate_update_index] =
-      frame_index_rate_update;
-}
-
-void VideoProcessorIntegrationTest::AddRateControlThresholds(
-    int max_num_dropped_frames,
-    int max_key_frame_size_mismatch,
-    int max_delta_frame_size_mismatch,
-    int max_encoding_rate_mismatch,
-    int max_time_hit_target,
-    int num_spatial_resizes,
-    int num_key_frames,
-    std::vector<RateControlThresholds>* rc_thresholds) {
-  RTC_DCHECK(rc_thresholds);
-
-  rc_thresholds->emplace_back();
-  RateControlThresholds* rc_threshold = &rc_thresholds->back();
-  rc_threshold->max_num_dropped_frames = max_num_dropped_frames;
-  rc_threshold->max_key_frame_size_mismatch = max_key_frame_size_mismatch;
-  rc_threshold->max_delta_frame_size_mismatch = max_delta_frame_size_mismatch;
-  rc_threshold->max_encoding_rate_mismatch = max_encoding_rate_mismatch;
-  rc_threshold->max_time_hit_target = max_time_hit_target;
-  rc_threshold->num_spatial_resizes = num_spatial_resizes;
-  rc_threshold->num_key_frames = num_key_frames;
-}
-
-// Processes all frames in the clip and verifies the result.
-void VideoProcessorIntegrationTest::ProcessFramesAndMaybeVerify(
-    const RateProfile& rate_profile,
-    const std::vector<RateControlThresholds>* rc_thresholds,
-    const QualityThresholds* quality_thresholds,
-    const VisualizationParams* visualization_params) {
-  // The Android HW codec needs to be run on a task queue, so we simply always
-  // run the test on a task queue.
-  rtc::TaskQueue task_queue("VidProc TQ");
-  rtc::Event sync_event(false, false);
-
-  SetUpAndInitObjects(&task_queue, rate_profile.target_bit_rate[0],
-                      rate_profile.input_frame_rate[0], visualization_params);
-
-  // Set initial rates.
-  int rate_update_index = 0;
-  task_queue.PostTask([this, &rate_profile, rate_update_index] {
-    processor_->SetRates(rate_profile.target_bit_rate[rate_update_index],
-                         rate_profile.input_frame_rate[rate_update_index]);
-  });
-
-  // Process all frames.
-  int frame_number = 0;
-  const int num_frames = rate_profile.num_frames;
-  RTC_DCHECK_GE(num_frames, 1);
-  while (frame_number < num_frames) {
-    // In order to not overwhelm the OpenMAX buffers in the Android
-    // MediaCodec API, we roughly pace the frames here. The downside
-    // of this is that the encode run will be done in real-time.
-#if defined(WEBRTC_ANDROID)
-    if (config_.hw_encoder || config_.hw_decoder) {
-      SleepMs(rtc::kNumMillisecsPerSec /
-              rate_profile.input_frame_rate[rate_update_index]);
-    }
-#endif
-
-    task_queue.PostTask([this] { processor_->ProcessFrame(); });
-    ++frame_number;
-
-    if (frame_number ==
-        rate_profile.frame_index_rate_update[rate_update_index + 1]) {
-      ++rate_update_index;
-
-      task_queue.PostTask([this, &rate_profile, rate_update_index] {
-        processor_->SetRates(rate_profile.target_bit_rate[rate_update_index],
-                             rate_profile.input_frame_rate[rate_update_index]);
-      });
-    }
-  }
-
-  // Give the VideoProcessor pipeline some time to process the last frame,
-  // and then release the codecs.
-  if (config_.hw_encoder || config_.hw_decoder) {
-    SleepMs(1 * rtc::kNumMillisecsPerSec);
-  }
-  ReleaseAndCloseObjects(&task_queue);
-
-  // Calculate and print rate control statistics.
-  rate_update_index = 0;
-  frame_number = 0;
-  ResetRateControlMetrics(rate_update_index, rate_profile);
-  std::vector<int> num_dropped_frames;
-  std::vector<int> num_resize_actions;
-  sync_event.Reset();
-  task_queue.PostTask(
-      [this, &num_dropped_frames, &num_resize_actions, &sync_event]() {
-        num_dropped_frames = processor_->NumberDroppedFramesPerRateUpdate();
-        num_resize_actions = processor_->NumberSpatialResizesPerRateUpdate();
-        sync_event.Set();
-      });
-  sync_event.Wait(rtc::Event::kForever);
-  while (frame_number < num_frames) {
-    UpdateRateControlMetrics(frame_number);
-
-    ++frame_number;
-
-    if (frame_number ==
-        rate_profile.frame_index_rate_update[rate_update_index + 1]) {
-      PrintAndMaybeVerifyRateControlMetrics(rate_update_index, rc_thresholds,
-                                            num_dropped_frames,
-                                            num_resize_actions);
-      ++rate_update_index;
-      ResetRateControlMetrics(rate_update_index, rate_profile);
-    }
-  }
-  PrintAndMaybeVerifyRateControlMetrics(rate_update_index, rc_thresholds,
-                                        num_dropped_frames, num_resize_actions);
-
-  // Calculate and print other statistics.
-  EXPECT_EQ(num_frames, static_cast<int>(stats_.size()));
-  stats_.PrintSummary();
-
-  // Calculate and print image quality statistics.
-  // TODO(marpan): Should compute these quality metrics per SetRates update.
-  QualityMetricsResult psnr_result, ssim_result;
-  EXPECT_EQ(0, I420MetricsFromFiles(config_.input_filename.c_str(),
-                                    config_.output_filename.c_str(),
-                                    config_.codec_settings.width,
-                                    config_.codec_settings.height, &psnr_result,
-                                    &ssim_result));
-  if (quality_thresholds) {
-    VerifyQuality(psnr_result, ssim_result, *quality_thresholds);
-  }
-  printf("PSNR avg: %f, min: %f\nSSIM avg: %f, min: %f\n", psnr_result.average,
-         psnr_result.min, ssim_result.average, ssim_result.min);
-  printf("\n");
-
-  // Remove analysis file.
-  if (remove(config_.output_filename.c_str()) < 0) {
-    fprintf(stderr, "Failed to remove temporary file!\n");
-  }
-}
-
-void VideoProcessorIntegrationTest::CreateEncoderAndDecoder() {
-  std::unique_ptr<cricket::WebRtcVideoEncoderFactory> encoder_factory;
-  if (config_.hw_encoder) {
-#if defined(WEBRTC_ANDROID)
-    encoder_factory.reset(new jni::MediaCodecVideoEncoderFactory());
-#elif defined(WEBRTC_IOS)
-    EXPECT_EQ(kVideoCodecH264, config_.codec_settings.codecType)
-        << "iOS HW codecs only support H264.";
-    encoder_factory = CreateObjCEncoderFactory();
-#else
-    RTC_NOTREACHED() << "Only support HW encoder on Android and iOS.";
-#endif
-  } else {
-    encoder_factory.reset(new cricket::InternalEncoderFactory());
-  }
-
-  if (config_.hw_decoder) {
-#if defined(WEBRTC_ANDROID)
-    decoder_factory_.reset(new jni::MediaCodecVideoDecoderFactory());
-#elif defined(WEBRTC_IOS)
-    EXPECT_EQ(kVideoCodecH264, config_.codec_settings.codecType)
-        << "iOS HW codecs only support H264.";
-    decoder_factory_ = CreateObjCDecoderFactory();
-#else
-    RTC_NOTREACHED() << "Only support HW decoder on Android and iOS.";
-#endif
-  } else {
-    decoder_factory_.reset(new cricket::InternalDecoderFactory());
-  }
-
-  cricket::VideoCodec codec;
-  cricket::VideoDecoderParams decoder_params;  // Empty.
-  switch (config_.codec_settings.codecType) {
-    case kVideoCodecVP8:
-      codec = cricket::VideoCodec(cricket::kVp8CodecName);
-      encoder_.reset(encoder_factory->CreateVideoEncoder(codec));
-      decoder_ =
-          decoder_factory_->CreateVideoDecoderWithParams(codec, decoder_params);
-      break;
-    case kVideoCodecVP9:
-      codec = cricket::VideoCodec(cricket::kVp9CodecName);
-      encoder_.reset(encoder_factory->CreateVideoEncoder(codec));
-      decoder_ =
-          decoder_factory_->CreateVideoDecoderWithParams(codec, decoder_params);
-      break;
-    case kVideoCodecH264:
-      // TODO(brandtr): Generalize so that we support multiple profiles here.
-      codec = cricket::VideoCodec(cricket::kH264CodecName);
-      encoder_.reset(encoder_factory->CreateVideoEncoder(codec));
-      decoder_ =
-          decoder_factory_->CreateVideoDecoderWithParams(codec, decoder_params);
-      break;
-    default:
-      RTC_NOTREACHED();
-      break;
-  }
-
-  if (config_.sw_fallback_encoder) {
-    encoder_ = rtc::MakeUnique<VideoEncoderSoftwareFallbackWrapper>(
-        codec, std::move(encoder_));
-  }
-
-  EXPECT_TRUE(encoder_) << "Encoder not successfully created.";
-  EXPECT_TRUE(decoder_) << "Decoder not successfully created.";
-}
-
-void VideoProcessorIntegrationTest::DestroyEncoderAndDecoder() {
-  encoder_.reset();
-  decoder_factory_->DestroyVideoDecoder(decoder_);
-}
-
-void VideoProcessorIntegrationTest::SetUpAndInitObjects(
-    rtc::TaskQueue* task_queue,
-    const int initial_bitrate_kbps,
-    const int initial_framerate_fps,
-    const VisualizationParams* visualization_params) {
-  CreateEncoderAndDecoder();
-
-  // Create file objects for quality analysis.
-  analysis_frame_reader_.reset(new YuvFrameReaderImpl(
-      config_.input_filename, config_.codec_settings.width,
-      config_.codec_settings.height));
-  analysis_frame_writer_.reset(new YuvFrameWriterImpl(
-      config_.output_filename, config_.codec_settings.width,
-      config_.codec_settings.height));
-  EXPECT_TRUE(analysis_frame_reader_->Init());
-  EXPECT_TRUE(analysis_frame_writer_->Init());
-
-  if (visualization_params) {
-    const std::string codec_name =
-        CodecTypeToPayloadString(config_.codec_settings.codecType);
-    const std::string implementation_type = config_.hw_encoder ? "hw" : "sw";
-    // clang-format off
-    const std::string output_filename_base =
-        OutputPath() + config_.filename + "-" +
-        codec_name + "-" + implementation_type + "-" +
-        std::to_string(initial_bitrate_kbps);
-    // clang-format on
-    if (visualization_params->save_encoded_ivf) {
-      rtc::File post_encode_file =
-          rtc::File::Create(output_filename_base + ".ivf");
-      encoded_frame_writer_ =
-          IvfFileWriter::Wrap(std::move(post_encode_file), 0);
-    }
-    if (visualization_params->save_decoded_y4m) {
-      decoded_frame_writer_.reset(new Y4mFrameWriterImpl(
-          output_filename_base + ".y4m", config_.codec_settings.width,
-          config_.codec_settings.height, initial_framerate_fps));
-      EXPECT_TRUE(decoded_frame_writer_->Init());
-    }
-  }
-
-  packet_manipulator_.reset(new PacketManipulatorImpl(
-      &packet_reader_, config_.networking_config, config_.verbose));
-
-  config_.codec_settings.minBitrate = 0;
-  config_.codec_settings.startBitrate = initial_bitrate_kbps;
-  config_.codec_settings.maxFramerate = initial_framerate_fps;
-
-  rtc::Event sync_event(false, false);
-  task_queue->PostTask([this, &sync_event]() {
-    // TODO(brandtr): std::move |encoder_| and |decoder_| into the
-    // VideoProcessor when we are able to store |decoder_| in a
-    // std::unique_ptr. That is, when https://codereview.webrtc.org/3009973002
-    // has been relanded.
-    processor_ = rtc::MakeUnique<VideoProcessor>(
-        encoder_.get(), decoder_, analysis_frame_reader_.get(),
-        analysis_frame_writer_.get(), packet_manipulator_.get(), config_,
-        &stats_, encoded_frame_writer_.get(), decoded_frame_writer_.get());
-    processor_->Init();
-    sync_event.Set();
-  });
-  sync_event.Wait(rtc::Event::kForever);
-}
-
-void VideoProcessorIntegrationTest::ReleaseAndCloseObjects(
-    rtc::TaskQueue* task_queue) {
-  rtc::Event sync_event(false, false);
-  task_queue->PostTask([this, &sync_event]() {
-    processor_->Release();
-    sync_event.Set();
-  });
-  sync_event.Wait(rtc::Event::kForever);
-
-  // The VideoProcessor must be ::Release()'d before we destroy the codecs.
-  DestroyEncoderAndDecoder();
-
-  // Close the analysis files before we use them for SSIM/PSNR calculations.
-  analysis_frame_reader_->Close();
-  analysis_frame_writer_->Close();
-
-  // Close visualization files.
-  if (encoded_frame_writer_) {
-    EXPECT_TRUE(encoded_frame_writer_->Close());
-  }
-  if (decoded_frame_writer_) {
-    decoded_frame_writer_->Close();
-  }
-}
-
-// For every encoded frame, update the rate control metrics.
-void VideoProcessorIntegrationTest::UpdateRateControlMetrics(int frame_number) {
-  RTC_CHECK_GE(frame_number, 0);
-
-  const int tl_idx = TemporalLayerIndexForFrame(frame_number);
-  ++num_frames_per_update_[tl_idx];
-  ++num_frames_total_;
-
-  const FrameStatistic* frame_stat = stats_.GetFrame(frame_number);
-  FrameType frame_type = frame_stat->frame_type;
-  float encoded_size_kbits =
-      frame_stat->encoded_frame_size_bytes * 8.0f / 1000.0f;
-
-  // Update layer data.
-  // Update rate mismatch relative to per-frame bandwidth for delta frames.
-  if (frame_type == kVideoFrameDelta) {
-    // TODO(marpan): Should we count dropped (zero size) frames in mismatch?
-    sum_frame_size_mismatch_[tl_idx] +=
-        fabs(encoded_size_kbits - per_frame_bandwidth_[tl_idx]) /
-        per_frame_bandwidth_[tl_idx];
-  } else {
-    float target_size = (frame_number == 0) ? target_size_key_frame_initial_
-                                            : target_size_key_frame_;
-    sum_key_frame_size_mismatch_ +=
-        fabs(encoded_size_kbits - target_size) / target_size;
-    num_key_frames_ += 1;
-  }
-  sum_encoded_frame_size_[tl_idx] += encoded_size_kbits;
-  // Encoding bit rate per temporal layer: from the start of the update/run
-  // to the current frame.
-  encoding_bitrate_[tl_idx] = sum_encoded_frame_size_[tl_idx] *
-                              framerate_layer_[tl_idx] /
-                              num_frames_per_update_[tl_idx];
-  // Total encoding rate: from the start of the update/run to current frame.
-  sum_encoded_frame_size_total_ += encoded_size_kbits;
-  encoding_bitrate_total_ =
-      sum_encoded_frame_size_total_ * framerate_ / num_frames_total_;
-  perc_encoding_rate_mismatch_ =
-      100 * fabs(encoding_bitrate_total_ - bitrate_kbps_) / bitrate_kbps_;
-  if (perc_encoding_rate_mismatch_ < kPercTargetvsActualMismatch &&
-      !encoding_rate_within_target_) {
-    num_frames_to_hit_target_ = num_frames_total_;
-    encoding_rate_within_target_ = true;
-  }
-}
-
-// Verify expected behavior of rate control and print out data.
-void VideoProcessorIntegrationTest::PrintAndMaybeVerifyRateControlMetrics(
-    int rate_update_index,
-    const std::vector<RateControlThresholds>* rc_thresholds,
-    const std::vector<int>& num_dropped_frames,
-    const std::vector<int>& num_resize_actions) {
-  printf(
-      "Rate update #%d:\n"
-      " Target bitrate         : %d\n"
-      " Encoded bitrate        : %f\n"
-      " Frame rate             : %d\n",
-      rate_update_index, bitrate_kbps_, encoding_bitrate_total_, framerate_);
-  printf(
-      " # processed frames     : %d\n"
-      " # frames to convergence: %d\n"
-      " # dropped frames       : %d\n"
-      " # spatial resizes      : %d\n",
-      num_frames_total_, num_frames_to_hit_target_,
-      num_dropped_frames[rate_update_index],
-      num_resize_actions[rate_update_index]);
-
-  const RateControlThresholds* rc_threshold = nullptr;
-  if (rc_thresholds) {
-    rc_threshold = &(*rc_thresholds)[rate_update_index];
-
-    EXPECT_LE(perc_encoding_rate_mismatch_,
-              rc_threshold->max_encoding_rate_mismatch);
-  }
-  if (num_key_frames_ > 0) {
-    int perc_key_frame_size_mismatch =
-        100 * sum_key_frame_size_mismatch_ / num_key_frames_;
-    printf(
-        " # key frames           : %d\n"
-        " Key frame rate mismatch: %d\n",
-        num_key_frames_, perc_key_frame_size_mismatch);
-    if (rc_threshold) {
-      EXPECT_LE(perc_key_frame_size_mismatch,
-                rc_threshold->max_key_frame_size_mismatch);
-    }
-  }
-
-  const int num_temporal_layers =
-      NumberOfTemporalLayers(config_.codec_settings);
-  for (int i = 0; i < num_temporal_layers; i++) {
-    int perc_frame_size_mismatch =
-        100 * sum_frame_size_mismatch_[i] / num_frames_per_update_[i];
-    int perc_encoding_rate_mismatch =
-        100 * fabs(encoding_bitrate_[i] - bitrate_layer_[i]) /
-        bitrate_layer_[i];
-    printf(
-        " Temporal layer #%d:\n"
-        "  Target layer bitrate                : %f\n"
-        "  Layer frame rate                    : %f\n"
-        "  Layer per frame bandwidth           : %f\n"
-        "  Layer encoding bitrate              : %f\n"
-        "  Layer percent frame size mismatch   : %d\n"
-        "  Layer percent encoding rate mismatch: %d\n"
-        "  # frames processed per layer        : %d\n",
-        i, bitrate_layer_[i], framerate_layer_[i], per_frame_bandwidth_[i],
-        encoding_bitrate_[i], perc_frame_size_mismatch,
-        perc_encoding_rate_mismatch, num_frames_per_update_[i]);
-    if (rc_threshold) {
-      EXPECT_LE(perc_frame_size_mismatch,
-                rc_threshold->max_delta_frame_size_mismatch);
-      EXPECT_LE(perc_encoding_rate_mismatch,
-                rc_threshold->max_encoding_rate_mismatch);
-    }
-  }
-  printf("\n");
-
-  if (rc_threshold) {
-    EXPECT_LE(num_frames_to_hit_target_, rc_threshold->max_time_hit_target);
-    EXPECT_LE(num_dropped_frames[rate_update_index],
-              rc_threshold->max_num_dropped_frames);
-    EXPECT_EQ(rc_threshold->num_spatial_resizes,
-              num_resize_actions[rate_update_index]);
-    EXPECT_EQ(rc_threshold->num_key_frames, num_key_frames_);
-  }
-}
-
-// Temporal layer index corresponding to frame number, for up to 3 layers.
-int VideoProcessorIntegrationTest::TemporalLayerIndexForFrame(
-    int frame_number) const {
-  const int num_temporal_layers =
-      NumberOfTemporalLayers(config_.codec_settings);
-  int tl_idx = -1;
-  switch (num_temporal_layers) {
-    case 1:
-      tl_idx = 0;
-      break;
-    case 2:
-      // temporal layer 0:  0     2     4 ...
-      // temporal layer 1:     1     3
-      tl_idx = (frame_number % 2 == 0) ? 0 : 1;
-      break;
-    case 3:
-      // temporal layer 0:  0            4            8 ...
-      // temporal layer 1:        2            6
-      // temporal layer 2:     1      3     5      7
-      if (frame_number % 4 == 0) {
-        tl_idx = 0;
-      } else if ((frame_number + 2) % 4 == 0) {
-        tl_idx = 1;
-      } else if ((frame_number + 1) % 2 == 0) {
-        tl_idx = 2;
-      }
-      break;
-    default:
-      RTC_NOTREACHED();
-      break;
-  }
-  return tl_idx;
-}
-
-// Reset quantities before each encoder rate update.
-void VideoProcessorIntegrationTest::ResetRateControlMetrics(
-    int rate_update_index,
-    const RateProfile& rate_profile) {
-  // Set new rates.
-  bitrate_kbps_ = rate_profile.target_bit_rate[rate_update_index];
-  framerate_ = rate_profile.input_frame_rate[rate_update_index];
-  const int num_temporal_layers =
-      NumberOfTemporalLayers(config_.codec_settings);
-  RTC_DCHECK_LE(num_temporal_layers, kMaxNumTemporalLayers);
-  for (int i = 0; i < num_temporal_layers; i++) {
-    float bit_rate_ratio = kVp8LayerRateAlloction[num_temporal_layers - 1][i];
-    if (i > 0) {
-      float bit_rate_delta_ratio =
-          kVp8LayerRateAlloction[num_temporal_layers - 1][i] -
-          kVp8LayerRateAlloction[num_temporal_layers - 1][i - 1];
-      bitrate_layer_[i] = bitrate_kbps_ * bit_rate_delta_ratio;
-    } else {
-      bitrate_layer_[i] = bitrate_kbps_ * bit_rate_ratio;
-    }
-    framerate_layer_[i] =
-        framerate_ / static_cast<float>(1 << (num_temporal_layers - 1));
-  }
-  if (num_temporal_layers == 3) {
-    framerate_layer_[2] = framerate_ / 2.0f;
-  }
-  if (rate_update_index == 0) {
-    target_size_key_frame_initial_ =
-        0.5 * kInitialBufferSize * bitrate_layer_[0];
-  }
-
-  // Reset rate control metrics.
-  for (int i = 0; i < num_temporal_layers; i++) {
-    num_frames_per_update_[i] = 0;
-    sum_frame_size_mismatch_[i] = 0.0f;
-    sum_encoded_frame_size_[i] = 0.0f;
-    encoding_bitrate_[i] = 0.0f;
-    // Update layer per-frame-bandwidth.
-    per_frame_bandwidth_[i] = static_cast<float>(bitrate_layer_[i]) /
-                              static_cast<float>(framerate_layer_[i]);
-  }
-  // Set maximum size of key frames, following setting in the VP8 wrapper.
-  float max_key_size = kScaleKeyFrameSize * kOptimalBufferSize * framerate_;
-  // We don't know exact target size of the key frames (except for first one),
-  // but the minimum in libvpx is ~|3 * per_frame_bandwidth| and maximum is
-  // set by |max_key_size_ * per_frame_bandwidth|. Take middle point/average
-  // as reference for mismatch. Note key frames always correspond to base
-  // layer frame in this test.
-  target_size_key_frame_ = 0.5 * (3 + max_key_size) * per_frame_bandwidth_[0];
-  num_frames_total_ = 0;
-  sum_encoded_frame_size_total_ = 0.0f;
-  encoding_bitrate_total_ = 0.0f;
-  perc_encoding_rate_mismatch_ = 0.0f;
-  num_frames_to_hit_target_ =
-      rate_profile.frame_index_rate_update[rate_update_index + 1];
-  encoding_rate_within_target_ = false;
-  sum_key_frame_size_mismatch_ = 0.0;
-  num_key_frames_ = 0;
-}
-
-}  // namespace test
-}  // namespace webrtc
diff --git a/modules/video_coding/codecs/test/videoprocessor_integrationtest.h b/modules/video_coding/codecs/test/videoprocessor_integrationtest.h
deleted file mode 100644
index 0efb969..0000000
--- a/modules/video_coding/codecs/test/videoprocessor_integrationtest.h
+++ /dev/null
@@ -1,192 +0,0 @@
-/*
- *  Copyright (c) 2017 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_VIDEO_CODING_CODECS_TEST_VIDEOPROCESSOR_INTEGRATIONTEST_H_
-#define WEBRTC_MODULES_VIDEO_CODING_CODECS_TEST_VIDEOPROCESSOR_INTEGRATIONTEST_H_
-
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "webrtc/common_types.h"
-#include "webrtc/media/engine/webrtcvideodecoderfactory.h"
-#include "webrtc/media/engine/webrtcvideoencoderfactory.h"
-#include "webrtc/modules/video_coding/codecs/test/packet_manipulator.h"
-#include "webrtc/modules/video_coding/codecs/test/stats.h"
-#include "webrtc/modules/video_coding/codecs/test/videoprocessor.h"
-#include "webrtc/modules/video_coding/utility/ivf_file_writer.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/testsupport/frame_reader.h"
-#include "webrtc/test/testsupport/frame_writer.h"
-#include "webrtc/test/testsupport/packet_reader.h"
-
-namespace webrtc {
-namespace test {
-
-// The sequence of bit rate and frame rate changes for the encoder, the frame
-// number where the changes are made, and the total number of frames for the
-// test.
-struct RateProfile {
-  static const int kMaxNumRateUpdates = 3;
-
-  int target_bit_rate[kMaxNumRateUpdates];
-  int input_frame_rate[kMaxNumRateUpdates];
-  int frame_index_rate_update[kMaxNumRateUpdates + 1];
-  int num_frames;
-};
-
-// Thresholds for the rate control metrics. The rate mismatch thresholds are
-// defined as percentages. |max_time_hit_target| is defined as number of frames,
-// after a rate update is made to the encoder, for the encoder to reach within
-// |kPercTargetvsActualMismatch| of new target rate. The thresholds are defined
-// for each rate update sequence.
-struct RateControlThresholds {
-  int max_num_dropped_frames;
-  int max_key_frame_size_mismatch;
-  int max_delta_frame_size_mismatch;
-  int max_encoding_rate_mismatch;
-  int max_time_hit_target;
-  int num_spatial_resizes;
-  int num_key_frames;
-};
-
-// Thresholds for the quality metrics.
-struct QualityThresholds {
-  QualityThresholds(double min_avg_psnr,
-                    double min_min_psnr,
-                    double min_avg_ssim,
-                    double min_min_ssim)
-      : min_avg_psnr(min_avg_psnr),
-        min_min_psnr(min_min_psnr),
-        min_avg_ssim(min_avg_ssim),
-        min_min_ssim(min_min_ssim) {}
-  double min_avg_psnr;
-  double min_min_psnr;
-  double min_avg_ssim;
-  double min_min_ssim;
-};
-
-// Should video files be saved persistently to disk for post-run visualization?
-struct VisualizationParams {
-  bool save_encoded_ivf;
-  bool save_decoded_y4m;
-};
-
-// Integration test for video processor. Encodes+decodes a clip and
-// writes it to the output directory. After completion, quality metrics
-// (PSNR and SSIM) and rate control metrics are computed and compared to given
-// thresholds, to verify that the quality and encoder response is acceptable.
-// The rate control tests allow us to verify the behavior for changing bit rate,
-// changing frame rate, frame dropping/spatial resize, and temporal layers.
-// The thresholds for the rate control metrics are set to be fairly
-// conservative, so failure should only happen when some significant regression
-// or breakdown occurs.
-class VideoProcessorIntegrationTest : public testing::Test {
- protected:
-  VideoProcessorIntegrationTest();
-  ~VideoProcessorIntegrationTest() override;
-
-  static void SetCodecSettings(TestConfig* config,
-                               VideoCodecType codec_type,
-                               int num_temporal_layers,
-                               bool error_concealment_on,
-                               bool denoising_on,
-                               bool frame_dropper_on,
-                               bool spatial_resize_on,
-                               bool resilience_on,
-                               int width,
-                               int height);
-
-  static void SetRateProfile(RateProfile* rate_profile,
-                             int rate_update_index,
-                             int bitrate_kbps,
-                             int framerate_fps,
-                             int frame_index_rate_update);
-
-  static void AddRateControlThresholds(
-      int max_num_dropped_frames,
-      int max_key_frame_size_mismatch,
-      int max_delta_frame_size_mismatch,
-      int max_encoding_rate_mismatch,
-      int max_time_hit_target,
-      int num_spatial_resizes,
-      int num_key_frames,
-      std::vector<RateControlThresholds>* rc_thresholds);
-
-  void ProcessFramesAndMaybeVerify(
-      const RateProfile& rate_profile,
-      const std::vector<RateControlThresholds>* rc_thresholds,
-      const QualityThresholds* quality_thresholds,
-      const VisualizationParams* visualization_params);
-
-  // Config.
-  TestConfig config_;
-
- private:
-  static const int kMaxNumTemporalLayers = 3;
-
-  void CreateEncoderAndDecoder();
-  void DestroyEncoderAndDecoder();
-  void SetUpAndInitObjects(rtc::TaskQueue* task_queue,
-                           const int initial_bitrate_kbps,
-                           const int initial_framerate_fps,
-                           const VisualizationParams* visualization_params);
-  void ReleaseAndCloseObjects(rtc::TaskQueue* task_queue);
-  void UpdateRateControlMetrics(int frame_number);
-  void PrintAndMaybeVerifyRateControlMetrics(
-      int rate_update_index,
-      const std::vector<RateControlThresholds>* rc_thresholds,
-      const std::vector<int>& num_dropped_frames,
-      const std::vector<int>& num_resize_actions);
-  int TemporalLayerIndexForFrame(int frame_number) const;
-  void ResetRateControlMetrics(int rate_update_index,
-                               const RateProfile& rate_profile);
-
-  // Codecs.
-  std::unique_ptr<VideoEncoder> encoder_;
-  std::unique_ptr<cricket::WebRtcVideoDecoderFactory> decoder_factory_;
-  VideoDecoder* decoder_;
-
-  // Helper objects.
-  std::unique_ptr<FrameReader> analysis_frame_reader_;
-  std::unique_ptr<FrameWriter> analysis_frame_writer_;
-  std::unique_ptr<IvfFileWriter> encoded_frame_writer_;
-  std::unique_ptr<FrameWriter> decoded_frame_writer_;
-  PacketReader packet_reader_;
-  std::unique_ptr<PacketManipulator> packet_manipulator_;
-  Stats stats_;
-  std::unique_ptr<VideoProcessor> processor_;
-
-  // Quantities defined/updated for every encoder rate update.
-  int num_frames_per_update_[kMaxNumTemporalLayers];
-  float sum_frame_size_mismatch_[kMaxNumTemporalLayers];
-  float sum_encoded_frame_size_[kMaxNumTemporalLayers];
-  float encoding_bitrate_[kMaxNumTemporalLayers];
-  float per_frame_bandwidth_[kMaxNumTemporalLayers];
-  float bitrate_layer_[kMaxNumTemporalLayers];
-  float framerate_layer_[kMaxNumTemporalLayers];
-  int num_frames_total_;
-  float sum_encoded_frame_size_total_;
-  float encoding_bitrate_total_;
-  float perc_encoding_rate_mismatch_;
-  int num_frames_to_hit_target_;
-  bool encoding_rate_within_target_;
-  int bitrate_kbps_;
-  int framerate_;
-  float target_size_key_frame_initial_;
-  float target_size_key_frame_;
-  float sum_key_frame_size_mismatch_;
-  int num_key_frames_;
-};
-
-}  // namespace test
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_VIDEO_CODING_CODECS_TEST_VIDEOPROCESSOR_INTEGRATIONTEST_H_
diff --git a/modules/video_coding/codecs/test/videoprocessor_integrationtest_libvpx.cc b/modules/video_coding/codecs/test/videoprocessor_integrationtest_libvpx.cc
deleted file mode 100644
index 163c6f1..0000000
--- a/modules/video_coding/codecs/test/videoprocessor_integrationtest_libvpx.cc
+++ /dev/null
@@ -1,379 +0,0 @@
-/*
- *  Copyright (c) 2012 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/video_coding/codecs/test/videoprocessor_integrationtest.h"
-
-#include <vector>
-
-#include "webrtc/test/testsupport/fileutils.h"
-
-namespace webrtc {
-namespace test {
-
-namespace {
-
-// Codec settings.
-const bool kResilienceOn = true;
-const int kCifWidth = 352;
-const int kCifHeight = 288;
-#if !defined(WEBRTC_IOS)
-const int kNumFramesShort = 100;
-#endif
-const int kNumFramesLong = 300;
-
-const std::nullptr_t kNoVisualizationParams = nullptr;
-
-}  // namespace
-
-class VideoProcessorIntegrationTestLibvpx
-    : public VideoProcessorIntegrationTest {
- protected:
-  VideoProcessorIntegrationTestLibvpx() {
-    config_.filename = "foreman_cif";
-    config_.input_filename = ResourcePath(config_.filename, "yuv");
-    config_.output_filename =
-        TempFilename(OutputPath(), "videoprocessor_integrationtest_libvpx");
-    config_.networking_config.packet_loss_probability = 0.0;
-    // Only allow encoder/decoder to use single core, for predictability.
-    config_.use_single_core = true;
-    config_.verbose = false;
-    config_.hw_encoder = false;
-    config_.hw_decoder = false;
-  }
-};
-
-// Fails on iOS. See webrtc:4755.
-#if !defined(WEBRTC_IOS)
-
-#if !defined(RTC_DISABLE_VP9)
-// VP9: Run with no packet loss and fixed bitrate. Quality should be very high.
-// One key frame (first frame only) in sequence.
-TEST_F(VideoProcessorIntegrationTestLibvpx, Process0PercentPacketLossVP9) {
-  SetCodecSettings(&config_, kVideoCodecVP9, 1, false, false, true, false,
-                   kResilienceOn, kCifWidth, kCifHeight);
-
-  RateProfile rate_profile;
-  SetRateProfile(&rate_profile, 0, 500, 30, 0);
-  rate_profile.frame_index_rate_update[1] = kNumFramesShort + 1;
-  rate_profile.num_frames = kNumFramesShort;
-
-  std::vector<RateControlThresholds> rc_thresholds;
-  AddRateControlThresholds(0, 40, 20, 10, 20, 0, 1, &rc_thresholds);
-
-  QualityThresholds quality_thresholds(37.0, 36.0, 0.93, 0.92);
-
-  ProcessFramesAndMaybeVerify(rate_profile, &rc_thresholds, &quality_thresholds,
-                              kNoVisualizationParams);
-}
-
-// VP9: Run with 5% packet loss and fixed bitrate. Quality should be a bit
-// lower. One key frame (first frame only) in sequence.
-TEST_F(VideoProcessorIntegrationTestLibvpx, Process5PercentPacketLossVP9) {
-  config_.networking_config.packet_loss_probability = 0.05f;
-  SetCodecSettings(&config_, kVideoCodecVP9, 1, false, false, true, false,
-                   kResilienceOn, kCifWidth, kCifHeight);
-
-  RateProfile rate_profile;
-  SetRateProfile(&rate_profile, 0, 500, 30, 0);
-  rate_profile.frame_index_rate_update[1] = kNumFramesShort + 1;
-  rate_profile.num_frames = kNumFramesShort;
-
-  std::vector<RateControlThresholds> rc_thresholds;
-  AddRateControlThresholds(0, 40, 20, 10, 20, 0, 1, &rc_thresholds);
-
-  QualityThresholds quality_thresholds(17.0, 14.0, 0.45, 0.36);
-
-  ProcessFramesAndMaybeVerify(rate_profile, &rc_thresholds, &quality_thresholds,
-                              kNoVisualizationParams);
-}
-
-// VP9: Run with no packet loss, with varying bitrate (3 rate updates):
-// low to high to medium. Check that quality and encoder response to the new
-// target rate/per-frame bandwidth (for each rate update) is within limits.
-// One key frame (first frame only) in sequence.
-TEST_F(VideoProcessorIntegrationTestLibvpx, ProcessNoLossChangeBitRateVP9) {
-  SetCodecSettings(&config_, kVideoCodecVP9, 1, false, false, true, false,
-                   kResilienceOn, kCifWidth, kCifHeight);
-
-  RateProfile rate_profile;
-  SetRateProfile(&rate_profile, 0, 200, 30, 0);
-  SetRateProfile(&rate_profile, 1, 700, 30, 100);
-  SetRateProfile(&rate_profile, 2, 500, 30, 200);
-  rate_profile.frame_index_rate_update[3] = kNumFramesLong + 1;
-  rate_profile.num_frames = kNumFramesLong;
-
-  std::vector<RateControlThresholds> rc_thresholds;
-  AddRateControlThresholds(0, 30, 20, 20, 35, 0, 1, &rc_thresholds);
-  AddRateControlThresholds(2, 0, 20, 20, 60, 0, 0, &rc_thresholds);
-  AddRateControlThresholds(0, 0, 25, 20, 40, 0, 0, &rc_thresholds);
-
-  QualityThresholds quality_thresholds(35.5, 30.0, 0.90, 0.85);
-
-  ProcessFramesAndMaybeVerify(rate_profile, &rc_thresholds, &quality_thresholds,
-                              kNoVisualizationParams);
-}
-
-// VP9: Run with no packet loss, with an update (decrease) in frame rate.
-// Lower frame rate means higher per-frame-bandwidth, so easier to encode.
-// At the low bitrate in this test, this means better rate control after the
-// update(s) to lower frame rate. So expect less frame drops, and max values
-// for the rate control metrics can be lower. One key frame (first frame only).
-// Note: quality after update should be higher but we currently compute quality
-// metrics averaged over whole sequence run.
-TEST_F(VideoProcessorIntegrationTestLibvpx,
-       ProcessNoLossChangeFrameRateFrameDropVP9) {
-  SetCodecSettings(&config_, kVideoCodecVP9, 1, false, false, true, false,
-                   kResilienceOn, kCifWidth, kCifHeight);
-
-  RateProfile rate_profile;
-  SetRateProfile(&rate_profile, 0, 100, 24, 0);
-  SetRateProfile(&rate_profile, 1, 100, 15, 100);
-  SetRateProfile(&rate_profile, 2, 100, 10, 200);
-  rate_profile.frame_index_rate_update[3] = kNumFramesLong + 1;
-  rate_profile.num_frames = kNumFramesLong;
-
-  std::vector<RateControlThresholds> rc_thresholds;
-  AddRateControlThresholds(45, 50, 95, 15, 45, 0, 1, &rc_thresholds);
-  AddRateControlThresholds(20, 0, 50, 10, 30, 0, 0, &rc_thresholds);
-  AddRateControlThresholds(5, 0, 30, 5, 25, 0, 0, &rc_thresholds);
-
-  QualityThresholds quality_thresholds(31.5, 18.0, 0.80, 0.43);
-
-  ProcessFramesAndMaybeVerify(rate_profile, &rc_thresholds, &quality_thresholds,
-                              kNoVisualizationParams);
-}
-
-// VP9: Run with no packet loss and denoiser on. One key frame (first frame).
-TEST_F(VideoProcessorIntegrationTestLibvpx, ProcessNoLossDenoiserOnVP9) {
-  SetCodecSettings(&config_, kVideoCodecVP9, 1, false, true, true, false,
-                   kResilienceOn, kCifWidth, kCifHeight);
-
-  RateProfile rate_profile;
-  SetRateProfile(&rate_profile, 0, 500, 30, 0);
-  rate_profile.frame_index_rate_update[1] = kNumFramesShort + 1;
-  rate_profile.num_frames = kNumFramesShort;
-
-  std::vector<RateControlThresholds> rc_thresholds;
-  AddRateControlThresholds(0, 40, 20, 10, 20, 0, 1, &rc_thresholds);
-
-  QualityThresholds quality_thresholds(36.8, 35.8, 0.92, 0.91);
-
-  ProcessFramesAndMaybeVerify(rate_profile, &rc_thresholds, &quality_thresholds,
-                              kNoVisualizationParams);
-}
-
-// Run with no packet loss, at low bitrate.
-// spatial_resize is on, for this low bitrate expect one resize in sequence.
-// Resize happens on delta frame. Expect only one key frame (first frame).
-TEST_F(VideoProcessorIntegrationTestLibvpx,
-       DISABLED_ProcessNoLossSpatialResizeFrameDropVP9) {
-  SetCodecSettings(&config_, kVideoCodecVP9, 1, false, false, true, true,
-                   kResilienceOn, kCifWidth, kCifHeight);
-
-  RateProfile rate_profile;
-  SetRateProfile(&rate_profile, 0, 50, 30, 0);
-  rate_profile.frame_index_rate_update[1] = kNumFramesLong + 1;
-  rate_profile.num_frames = kNumFramesLong;
-
-  std::vector<RateControlThresholds> rc_thresholds;
-  AddRateControlThresholds(228, 70, 160, 15, 80, 1, 1, &rc_thresholds);
-
-  QualityThresholds quality_thresholds(24.0, 13.0, 0.65, 0.37);
-
-  ProcessFramesAndMaybeVerify(rate_profile, &rc_thresholds, &quality_thresholds,
-                              kNoVisualizationParams);
-}
-
-// TODO(marpan): Add temporal layer test for VP9, once changes are in
-// vp9 wrapper for this.
-
-#endif  // !defined(RTC_DISABLE_VP9)
-
-// VP8: Run with no packet loss and fixed bitrate. Quality should be very high.
-// One key frame (first frame only) in sequence. Setting |key_frame_interval|
-// to -1 below means no periodic key frames in test.
-TEST_F(VideoProcessorIntegrationTestLibvpx, ProcessZeroPacketLoss) {
-  SetCodecSettings(&config_, kVideoCodecVP8, 1, false, true, true, false,
-                   kResilienceOn, kCifWidth, kCifHeight);
-
-  RateProfile rate_profile;
-  SetRateProfile(&rate_profile, 0, 500, 30, 0);
-  rate_profile.frame_index_rate_update[1] = kNumFramesShort + 1;
-  rate_profile.num_frames = kNumFramesShort;
-
-  std::vector<RateControlThresholds> rc_thresholds;
-  AddRateControlThresholds(0, 40, 20, 10, 15, 0, 1, &rc_thresholds);
-
-  QualityThresholds quality_thresholds(34.95, 33.0, 0.90, 0.89);
-
-  ProcessFramesAndMaybeVerify(rate_profile, &rc_thresholds, &quality_thresholds,
-                              kNoVisualizationParams);
-}
-
-// VP8: Run with 5% packet loss and fixed bitrate. Quality should be a bit
-// lower. One key frame (first frame only) in sequence.
-TEST_F(VideoProcessorIntegrationTestLibvpx, Process5PercentPacketLoss) {
-  config_.networking_config.packet_loss_probability = 0.05f;
-  SetCodecSettings(&config_, kVideoCodecVP8, 1, false, true, true, false,
-                   kResilienceOn, kCifWidth, kCifHeight);
-
-  RateProfile rate_profile;
-  SetRateProfile(&rate_profile, 0, 500, 30, 0);
-  rate_profile.frame_index_rate_update[1] = kNumFramesShort + 1;
-  rate_profile.num_frames = kNumFramesShort;
-
-  std::vector<RateControlThresholds> rc_thresholds;
-  AddRateControlThresholds(0, 40, 20, 10, 15, 0, 1, &rc_thresholds);
-
-  QualityThresholds quality_thresholds(20.0, 16.0, 0.60, 0.40);
-
-  ProcessFramesAndMaybeVerify(rate_profile, &rc_thresholds, &quality_thresholds,
-                              kNoVisualizationParams);
-}
-
-// VP8: Run with 10% packet loss and fixed bitrate. Quality should be lower.
-// One key frame (first frame only) in sequence.
-TEST_F(VideoProcessorIntegrationTestLibvpx, Process10PercentPacketLoss) {
-  config_.networking_config.packet_loss_probability = 0.1f;
-  SetCodecSettings(&config_, kVideoCodecVP8, 1, false, true, true, false,
-                   kResilienceOn, kCifWidth, kCifHeight);
-
-  RateProfile rate_profile;
-  SetRateProfile(&rate_profile, 0, 500, 30, 0);
-  rate_profile.frame_index_rate_update[1] = kNumFramesShort + 1;
-  rate_profile.num_frames = kNumFramesShort;
-
-  std::vector<RateControlThresholds> rc_thresholds;
-  AddRateControlThresholds(0, 40, 20, 10, 15, 0, 1, &rc_thresholds);
-
-  QualityThresholds quality_thresholds(19.0, 16.0, 0.50, 0.35);
-
-  ProcessFramesAndMaybeVerify(rate_profile, &rc_thresholds, &quality_thresholds,
-                              kNoVisualizationParams);
-}
-
-#endif  // !defined(WEBRTC_IOS)
-
-// The tests below are currently disabled for Android. For ARM, the encoder
-// uses |cpu_speed| = 12, as opposed to default |cpu_speed| <= 6 for x86,
-// which leads to significantly different quality. The quality and rate control
-// settings in the tests below are defined for encoder speed setting
-// |cpu_speed| <= ~6. A number of settings would need to be significantly
-// modified for the |cpu_speed| = 12 case. For now, keep the tests below
-// disabled on Android. Some quality parameter in the above test has been
-// adjusted to also pass for |cpu_speed| <= 12.
-
-// VP8: Run with no packet loss, with varying bitrate (3 rate updates):
-// low to high to medium. Check that quality and encoder response to the new
-// target rate/per-frame bandwidth (for each rate update) is within limits.
-// One key frame (first frame only) in sequence.
-// Too slow to finish before timeout on iOS. See webrtc:4755.
-#if defined(WEBRTC_ANDROID) || defined(WEBRTC_IOS)
-#define MAYBE_ProcessNoLossChangeBitRateVP8 \
-  DISABLED_ProcessNoLossChangeBitRateVP8
-#else
-#define MAYBE_ProcessNoLossChangeBitRateVP8 ProcessNoLossChangeBitRateVP8
-#endif
-TEST_F(VideoProcessorIntegrationTestLibvpx,
-       MAYBE_ProcessNoLossChangeBitRateVP8) {
-  SetCodecSettings(&config_, kVideoCodecVP8, 1, false, true, true, false,
-                   kResilienceOn, kCifWidth, kCifHeight);
-
-  RateProfile rate_profile;
-  SetRateProfile(&rate_profile, 0, 200, 30, 0);
-  SetRateProfile(&rate_profile, 1, 800, 30, 100);
-  SetRateProfile(&rate_profile, 2, 500, 30, 200);
-  rate_profile.frame_index_rate_update[3] = kNumFramesLong + 1;
-  rate_profile.num_frames = kNumFramesLong;
-
-  std::vector<RateControlThresholds> rc_thresholds;
-  AddRateControlThresholds(0, 45, 20, 10, 15, 0, 1, &rc_thresholds);
-  AddRateControlThresholds(0, 0, 25, 20, 10, 0, 0, &rc_thresholds);
-  AddRateControlThresholds(0, 0, 25, 15, 10, 0, 0, &rc_thresholds);
-
-  QualityThresholds quality_thresholds(34.0, 32.0, 0.85, 0.80);
-
-  ProcessFramesAndMaybeVerify(rate_profile, &rc_thresholds, &quality_thresholds,
-                              kNoVisualizationParams);
-}
-
-// VP8: Run with no packet loss, with an update (decrease) in frame rate.
-// Lower frame rate means higher per-frame-bandwidth, so easier to encode.
-// At the bitrate in this test, this means better rate control after the
-// update(s) to lower frame rate. So expect less frame drops, and max values
-// for the rate control metrics can be lower. One key frame (first frame only).
-// Note: quality after update should be higher but we currently compute quality
-// metrics averaged over whole sequence run.
-// Too slow to finish before timeout on iOS. See webrtc:4755.
-#if defined(WEBRTC_ANDROID) || defined(WEBRTC_IOS)
-#define MAYBE_ProcessNoLossChangeFrameRateFrameDropVP8 \
-  DISABLED_ProcessNoLossChangeFrameRateFrameDropVP8
-#else
-#define MAYBE_ProcessNoLossChangeFrameRateFrameDropVP8 \
-  ProcessNoLossChangeFrameRateFrameDropVP8
-#endif
-TEST_F(VideoProcessorIntegrationTestLibvpx,
-       MAYBE_ProcessNoLossChangeFrameRateFrameDropVP8) {
-  SetCodecSettings(&config_, kVideoCodecVP8, 1, false, true, true, false,
-                   kResilienceOn, kCifWidth, kCifHeight);
-
-  RateProfile rate_profile;
-  SetRateProfile(&rate_profile, 0, 80, 24, 0);
-  SetRateProfile(&rate_profile, 1, 80, 15, 100);
-  SetRateProfile(&rate_profile, 2, 80, 10, 200);
-  rate_profile.frame_index_rate_update[3] = kNumFramesLong + 1;
-  rate_profile.num_frames = kNumFramesLong;
-
-  std::vector<RateControlThresholds> rc_thresholds;
-  AddRateControlThresholds(40, 20, 75, 15, 60, 0, 1, &rc_thresholds);
-  AddRateControlThresholds(10, 0, 25, 10, 35, 0, 0, &rc_thresholds);
-  AddRateControlThresholds(0, 0, 20, 10, 15, 0, 0, &rc_thresholds);
-
-  QualityThresholds quality_thresholds(31.0, 22.0, 0.80, 0.65);
-
-  ProcessFramesAndMaybeVerify(rate_profile, &rc_thresholds, &quality_thresholds,
-                              kNoVisualizationParams);
-}
-
-// VP8: Run with no packet loss, with 3 temporal layers, with a rate update in
-// the middle of the sequence. The max values for the frame size mismatch and
-// encoding rate mismatch are applied to each layer.
-// No dropped frames in this test, and internal spatial resizer is off.
-// One key frame (first frame only) in sequence, so no spatial resizing.
-// Too slow to finish before timeout on iOS. See webrtc:4755.
-#if defined(WEBRTC_ANDROID) || defined(WEBRTC_IOS)
-#define MAYBE_ProcessNoLossTemporalLayersVP8 \
-  DISABLED_ProcessNoLossTemporalLayersVP8
-#else
-#define MAYBE_ProcessNoLossTemporalLayersVP8 ProcessNoLossTemporalLayersVP8
-#endif
-TEST_F(VideoProcessorIntegrationTestLibvpx,
-       MAYBE_ProcessNoLossTemporalLayersVP8) {
-  SetCodecSettings(&config_, kVideoCodecVP8, 3, false, true, true, false,
-                   kResilienceOn, kCifWidth, kCifHeight);
-
-  RateProfile rate_profile;
-  SetRateProfile(&rate_profile, 0, 200, 30, 0);
-  SetRateProfile(&rate_profile, 1, 400, 30, 150);
-  rate_profile.frame_index_rate_update[2] = kNumFramesLong + 1;
-  rate_profile.num_frames = kNumFramesLong;
-
-  std::vector<RateControlThresholds> rc_thresholds;
-  AddRateControlThresholds(0, 20, 30, 10, 10, 0, 1, &rc_thresholds);
-  AddRateControlThresholds(0, 0, 30, 15, 10, 0, 0, &rc_thresholds);
-
-  QualityThresholds quality_thresholds(32.5, 30.0, 0.85, 0.80);
-
-  ProcessFramesAndMaybeVerify(rate_profile, &rc_thresholds, &quality_thresholds,
-                              kNoVisualizationParams);
-}
-
-}  // namespace test
-}  // namespace webrtc
diff --git a/modules/video_coding/codecs/test/videoprocessor_integrationtest_mediacodec.cc b/modules/video_coding/codecs/test/videoprocessor_integrationtest_mediacodec.cc
deleted file mode 100644
index 47734d7..0000000
--- a/modules/video_coding/codecs/test/videoprocessor_integrationtest_mediacodec.cc
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- *  Copyright (c) 2017 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/video_coding/codecs/test/videoprocessor_integrationtest.h"
-
-#include <vector>
-
-#include "webrtc/test/field_trial.h"
-#include "webrtc/test/testsupport/fileutils.h"
-
-namespace webrtc {
-namespace test {
-
-#if defined(WEBRTC_ANDROID)
-
-namespace {
-const int kForemanNumFrames = 300;
-const std::nullptr_t kNoVisualizationParams = nullptr;
-}  // namespace
-
-class VideoProcessorIntegrationTestMediaCodec
-    : public VideoProcessorIntegrationTest {
- protected:
-  VideoProcessorIntegrationTestMediaCodec() {
-    config_.filename = "foreman_cif";
-    config_.input_filename = ResourcePath(config_.filename, "yuv");
-    config_.output_filename =
-        TempFilename(OutputPath(), "videoprocessor_integrationtest_mediacodec");
-    config_.verbose = false;
-    config_.hw_encoder = true;
-    config_.hw_decoder = true;
-  }
-};
-
-TEST_F(VideoProcessorIntegrationTestMediaCodec, ForemanCif500kbpsVp8) {
-  SetCodecSettings(&config_, kVideoCodecVP8, 1, false, false, false, false,
-                   false, 352, 288);
-
-  RateProfile rate_profile;
-  SetRateProfile(&rate_profile, 0, 500, 30, 0);  // Start below |low_kbps|.
-  rate_profile.frame_index_rate_update[1] = kForemanNumFrames + 1;
-  rate_profile.num_frames = kForemanNumFrames;
-
-  // The thresholds below may have to be tweaked to let even poor MediaCodec
-  // implementations pass. If this test fails on the bots, disable it and
-  // ping brandtr@.
-  std::vector<RateControlThresholds> rc_thresholds;
-  AddRateControlThresholds(5, 95, 20, 10, 10, 0, 1, &rc_thresholds);
-
-  QualityThresholds quality_thresholds(30.0, 15.0, 0.90, 0.40);
-
-  ProcessFramesAndMaybeVerify(rate_profile, &rc_thresholds, &quality_thresholds,
-                              kNoVisualizationParams);
-}
-
-TEST_F(VideoProcessorIntegrationTestMediaCodec,
-       Foreman240p100kbpsVp8WithForcedSwFallback) {
-  ScopedFieldTrials override_field_trials(
-      "WebRTC-VP8-Forced-Fallback-Encoder/Enabled-150,175,10000,1/");
-
-  config_.filename = "foreman_320x240";
-  config_.input_filename = ResourcePath(config_.filename, "yuv");
-  config_.sw_fallback_encoder = true;
-  SetCodecSettings(&config_, kVideoCodecVP8, 1, false, false, false, false,
-                   false, 320, 240);
-
-  RateProfile rate_profile;
-  SetRateProfile(&rate_profile, 0, 100, 10, 0);    // Start below |low_kbps|.
-  SetRateProfile(&rate_profile, 1, 100, 10, 80);   // Fallback in this bucket.
-  SetRateProfile(&rate_profile, 2, 200, 10, 200);  // Switch back here.
-  rate_profile.frame_index_rate_update[3] = kForemanNumFrames + 1;
-  rate_profile.num_frames = kForemanNumFrames;
-
-  // The thresholds below may have to be tweaked to let even poor MediaCodec
-  // implementations pass. If this test fails on the bots, disable it and
-  // ping brandtr@.
-  std::vector<RateControlThresholds> rc_thresholds;
-  AddRateControlThresholds(0, 50, 75, 70, 10, 0, 1, &rc_thresholds);
-  AddRateControlThresholds(0, 50, 25, 12, 60, 0, 1, &rc_thresholds);
-  AddRateControlThresholds(0, 65, 15, 5, 5, 0, 1, &rc_thresholds);
-
-  QualityThresholds quality_thresholds(33.0, 30.0, 0.90, 0.85);
-
-  ProcessFramesAndMaybeVerify(rate_profile, &rc_thresholds, &quality_thresholds,
-                              kNoVisualizationParams);
-}
-
-#endif  // defined(WEBRTC_ANDROID)
-
-}  // namespace test
-}  // namespace webrtc
diff --git a/modules/video_coding/codecs/test/videoprocessor_integrationtest_openh264.cc b/modules/video_coding/codecs/test/videoprocessor_integrationtest_openh264.cc
deleted file mode 100644
index a5f8261..0000000
--- a/modules/video_coding/codecs/test/videoprocessor_integrationtest_openh264.cc
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- *  Copyright (c) 2017 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/video_coding/codecs/test/videoprocessor_integrationtest.h"
-
-#include <vector>
-
-#include "webrtc/test/testsupport/fileutils.h"
-
-namespace webrtc {
-namespace test {
-
-#if defined(WEBRTC_USE_H264)
-
-namespace {
-
-// Codec settings.
-const bool kResilienceOn = true;
-const int kCifWidth = 352;
-const int kCifHeight = 288;
-const int kNumFrames = 100;
-
-const std::nullptr_t kNoVisualizationParams = nullptr;
-
-}  // namespace
-
-class VideoProcessorIntegrationTestOpenH264
-    : public VideoProcessorIntegrationTest {
- protected:
-  VideoProcessorIntegrationTestOpenH264() {
-    config_.filename = "foreman_cif";
-    config_.input_filename = ResourcePath(config_.filename, "yuv");
-    config_.output_filename =
-        TempFilename(OutputPath(), "videoprocessor_integrationtest_libvpx");
-    config_.networking_config.packet_loss_probability = 0.0;
-    // Only allow encoder/decoder to use single core, for predictability.
-    config_.use_single_core = true;
-    config_.verbose = false;
-    config_.hw_encoder = false;
-    config_.hw_decoder = false;
-  }
-};
-
-// H264: Run with no packet loss and fixed bitrate. Quality should be very high.
-// Note(hbos): The PacketManipulatorImpl code used to simulate packet loss in
-// these unittests appears to drop "packets" in a way that is not compatible
-// with H264. Therefore ProcessXPercentPacketLossH264, X != 0, unittests have
-// not been added.
-TEST_F(VideoProcessorIntegrationTestOpenH264, Process0PercentPacketLossH264) {
-  SetCodecSettings(&config_, kVideoCodecH264, 1, false, false, true, false,
-                   kResilienceOn, kCifWidth, kCifHeight);
-
-  RateProfile rate_profile;
-  SetRateProfile(&rate_profile, 0, 500, 30, 0);
-  rate_profile.frame_index_rate_update[1] = kNumFrames + 1;
-  rate_profile.num_frames = kNumFrames;
-
-  std::vector<RateControlThresholds> rc_thresholds;
-  AddRateControlThresholds(2, 60, 20, 10, 20, 0, 1, &rc_thresholds);
-
-  QualityThresholds quality_thresholds(35.0, 25.0, 0.93, 0.70);
-
-  ProcessFramesAndMaybeVerify(rate_profile, &rc_thresholds, &quality_thresholds,
-                              kNoVisualizationParams);
-}
-
-#endif  // defined(WEBRTC_USE_H264)
-
-}  // namespace test
-}  // namespace webrtc
diff --git a/modules/video_coding/codecs/test/videoprocessor_integrationtest_parameterized.cc b/modules/video_coding/codecs/test/videoprocessor_integrationtest_parameterized.cc
deleted file mode 100644
index 1a15558..0000000
--- a/modules/video_coding/codecs/test/videoprocessor_integrationtest_parameterized.cc
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- *  Copyright (c) 2017 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/video_coding/codecs/test/videoprocessor_integrationtest.h"
-
-#include "webrtc/test/testsupport/fileutils.h"
-
-namespace webrtc {
-namespace test {
-
-namespace {
-
-// Loop variables.
-const int kBitrates[] = {500};
-const VideoCodecType kVideoCodecType[] = {kVideoCodecVP8};
-const bool kHwCodec[] = {false};
-
-// Codec settings.
-const bool kResilienceOn = false;
-const int kNumTemporalLayers = 1;
-const bool kDenoisingOn = false;
-const bool kErrorConcealmentOn = false;
-const bool kSpatialResizeOn = false;
-const bool kFrameDropperOn = false;
-
-// Test settings.
-const bool kUseSingleCore = false;
-const VisualizationParams kVisualizationParams = {
-    false,  // save_encoded_ivf
-    false,  // save_decoded_y4m
-};
-
-const int kNumFrames = 30;
-
-}  // namespace
-
-// Tests for plotting statistics from logs.
-class VideoProcessorIntegrationTestParameterized
-    : public VideoProcessorIntegrationTest,
-      public ::testing::WithParamInterface<
-          ::testing::tuple<int, VideoCodecType, bool>> {
- protected:
-  VideoProcessorIntegrationTestParameterized()
-      : bitrate_(::testing::get<0>(GetParam())),
-        codec_type_(::testing::get<1>(GetParam())),
-        hw_codec_(::testing::get<2>(GetParam())) {}
-  ~VideoProcessorIntegrationTestParameterized() override = default;
-
-  void RunTest(int width,
-               int height,
-               int framerate,
-               const std::string& filename) {
-    config_.filename = filename;
-    config_.input_filename = ResourcePath(filename, "yuv");
-    config_.output_filename =
-        TempFilename(OutputPath(), "plot_videoprocessor_integrationtest");
-    config_.use_single_core = kUseSingleCore;
-    config_.verbose = true;
-    config_.hw_encoder = hw_codec_;
-    config_.hw_decoder = hw_codec_;
-    SetCodecSettings(&config_, codec_type_, kNumTemporalLayers,
-                     kErrorConcealmentOn, kDenoisingOn, kFrameDropperOn,
-                     kSpatialResizeOn, kResilienceOn, width, height);
-
-    RateProfile rate_profile;
-    SetRateProfile(&rate_profile,
-                   0,  // update_index
-                   bitrate_, framerate,
-                   0);  // frame_index_rate_update
-    rate_profile.frame_index_rate_update[1] = kNumFrames + 1;
-    rate_profile.num_frames = kNumFrames;
-
-    ProcessFramesAndMaybeVerify(rate_profile, nullptr, nullptr,
-                                &kVisualizationParams);
-  }
-
-  const int bitrate_;
-  const VideoCodecType codec_type_;
-  const bool hw_codec_;
-};
-
-INSTANTIATE_TEST_CASE_P(CodecSettings,
-                        VideoProcessorIntegrationTestParameterized,
-                        ::testing::Combine(::testing::ValuesIn(kBitrates),
-                                           ::testing::ValuesIn(kVideoCodecType),
-                                           ::testing::ValuesIn(kHwCodec)));
-
-TEST_P(VideoProcessorIntegrationTestParameterized, Process_128x96_30fps) {
-  RunTest(128, 96, 30, "foreman_128x96");
-}
-
-TEST_P(VideoProcessorIntegrationTestParameterized, Process_160x120_30fps) {
-  RunTest(160, 120, 30, "foreman_160x120");
-}
-
-TEST_P(VideoProcessorIntegrationTestParameterized, Process_176x144_30fps) {
-  RunTest(176, 144, 30, "foreman_176x144");
-}
-
-TEST_P(VideoProcessorIntegrationTestParameterized, Process_320x240_30fps) {
-  RunTest(320, 240, 30, "foreman_320x240");
-}
-
-TEST_P(VideoProcessorIntegrationTestParameterized, Process_352x288_30fps) {
-  RunTest(352, 288, 30, "foreman_cif");
-}
-
-}  // namespace test
-}  // namespace webrtc
diff --git a/modules/video_coding/codecs/test/videoprocessor_unittest.cc b/modules/video_coding/codecs/test/videoprocessor_unittest.cc
deleted file mode 100644
index 9474760..0000000
--- a/modules/video_coding/codecs/test/videoprocessor_unittest.cc
+++ /dev/null
@@ -1,188 +0,0 @@
-/*
- *  Copyright (c) 2012 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 <memory>
-
-#include "webrtc/api/video/i420_buffer.h"
-#include "webrtc/common_types.h"
-#include "webrtc/modules/video_coding/codecs/test/mock/mock_packet_manipulator.h"
-#include "webrtc/modules/video_coding/codecs/test/videoprocessor.h"
-#include "webrtc/modules/video_coding/include/mock/mock_video_codec_interface.h"
-#include "webrtc/modules/video_coding/include/video_coding.h"
-#include "webrtc/rtc_base/ptr_util.h"
-#include "webrtc/test/gmock.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/testsupport/mock/mock_frame_reader.h"
-#include "webrtc/test/testsupport/mock/mock_frame_writer.h"
-#include "webrtc/test/testsupport/packet_reader.h"
-#include "webrtc/test/testsupport/unittest_utils.h"
-#include "webrtc/test/video_codec_settings.h"
-#include "webrtc/typedefs.h"
-
-using ::testing::_;
-using ::testing::AtLeast;
-using ::testing::ElementsAre;
-using ::testing::Property;
-using ::testing::Return;
-
-namespace webrtc {
-namespace test {
-
-namespace {
-
-const int kWidth = 352;
-const int kHeight = 288;
-const int kFrameSize = kWidth * kHeight * 3 / 2;  // I420.
-const int kNumFrames = 2;
-
-}  // namespace
-
-class VideoProcessorTest : public testing::Test {
- protected:
-  VideoProcessorTest() {
-    // Get a codec configuration struct and configure it.
-    webrtc::test::CodecSettings(kVideoCodecVP8, &config_.codec_settings);
-    config_.codec_settings.width = kWidth;
-    config_.codec_settings.height = kHeight;
-
-    EXPECT_CALL(frame_reader_mock_, NumberOfFrames())
-        .WillRepeatedly(Return(kNumFrames));
-    EXPECT_CALL(frame_reader_mock_, FrameLength())
-        .WillRepeatedly(Return(kFrameSize));
-    video_processor_ = rtc::MakeUnique<VideoProcessor>(
-        &encoder_mock_, &decoder_mock_, &frame_reader_mock_,
-        &frame_writer_mock_, &packet_manipulator_mock_, config_, &stats_,
-        nullptr /* encoded_frame_writer */, nullptr /* decoded_frame_writer */);
-  }
-
-  void ExpectInit() {
-    EXPECT_CALL(encoder_mock_, InitEncode(_, _, _)).Times(1);
-    EXPECT_CALL(encoder_mock_, RegisterEncodeCompleteCallback(_)).Times(1);
-    EXPECT_CALL(decoder_mock_, InitDecode(_, _)).Times(1);
-    EXPECT_CALL(decoder_mock_, RegisterDecodeCompleteCallback(_)).Times(1);
-  }
-
-  void ExpectRelease() {
-    EXPECT_CALL(encoder_mock_, Release()).Times(1);
-    EXPECT_CALL(encoder_mock_, RegisterEncodeCompleteCallback(_)).Times(1);
-    EXPECT_CALL(decoder_mock_, Release()).Times(1);
-    EXPECT_CALL(decoder_mock_, RegisterDecodeCompleteCallback(_)).Times(1);
-  }
-
-  TestConfig config_;
-
-  MockVideoEncoder encoder_mock_;
-  MockVideoDecoder decoder_mock_;
-  MockFrameReader frame_reader_mock_;
-  MockFrameWriter frame_writer_mock_;
-  MockPacketManipulator packet_manipulator_mock_;
-  Stats stats_;
-  std::unique_ptr<VideoProcessor> video_processor_;
-};
-
-TEST_F(VideoProcessorTest, InitRelease) {
-  ExpectInit();
-  video_processor_->Init();
-
-  ExpectRelease();
-  video_processor_->Release();
-}
-
-TEST_F(VideoProcessorTest, ProcessFrames_FixedFramerate) {
-  ExpectInit();
-  video_processor_->Init();
-
-  const int kBitrateKbps = 456;
-  const int kFramerateFps = 31;
-  video_processor_->SetRates(kBitrateKbps, kFramerateFps);
-
-  EXPECT_CALL(frame_reader_mock_, ReadFrame())
-      .WillRepeatedly(Return(I420Buffer::Create(kWidth, kHeight)));
-  EXPECT_CALL(
-      encoder_mock_,
-      Encode(Property(&VideoFrame::timestamp, 1 * 90000 / kFramerateFps), _, _))
-      .Times(1);
-  video_processor_->ProcessFrame();
-
-  EXPECT_CALL(
-      encoder_mock_,
-      Encode(Property(&VideoFrame::timestamp, 2 * 90000 / kFramerateFps), _, _))
-      .Times(1);
-  video_processor_->ProcessFrame();
-
-  ExpectRelease();
-  video_processor_->Release();
-}
-
-TEST_F(VideoProcessorTest, ProcessFrames_VariableFramerate) {
-  ExpectInit();
-  video_processor_->Init();
-
-  const int kBitrateKbps = 456;
-  const int kStartFramerateFps = 27;
-  video_processor_->SetRates(kBitrateKbps, kStartFramerateFps);
-
-  EXPECT_CALL(frame_reader_mock_, ReadFrame())
-      .WillRepeatedly(Return(I420Buffer::Create(kWidth, kHeight)));
-  EXPECT_CALL(encoder_mock_, Encode(Property(&VideoFrame::timestamp,
-                                             1 * 90000 / kStartFramerateFps),
-                                    _, _))
-      .Times(1);
-  video_processor_->ProcessFrame();
-
-  const int kNewFramerateFps = 13;
-  video_processor_->SetRates(kBitrateKbps, kNewFramerateFps);
-
-  EXPECT_CALL(encoder_mock_, Encode(Property(&VideoFrame::timestamp,
-                                             2 * 90000 / kNewFramerateFps),
-                                    _, _))
-      .Times(1);
-  video_processor_->ProcessFrame();
-
-  ExpectRelease();
-  video_processor_->Release();
-}
-
-TEST_F(VideoProcessorTest, SetRates) {
-  ExpectInit();
-  video_processor_->Init();
-
-  const int kBitrateKbps = 123;
-  const int kFramerateFps = 17;
-  EXPECT_CALL(encoder_mock_,
-              SetRateAllocation(
-                  Property(&BitrateAllocation::get_sum_kbps, kBitrateKbps),
-                  kFramerateFps))
-      .Times(1);
-  video_processor_->SetRates(kBitrateKbps, kFramerateFps);
-  EXPECT_THAT(video_processor_->NumberDroppedFramesPerRateUpdate(),
-              ElementsAre(0));
-  EXPECT_THAT(video_processor_->NumberSpatialResizesPerRateUpdate(),
-              ElementsAre(0));
-
-  const int kNewBitrateKbps = 456;
-  const int kNewFramerateFps = 34;
-  EXPECT_CALL(encoder_mock_,
-              SetRateAllocation(
-                  Property(&BitrateAllocation::get_sum_kbps, kNewBitrateKbps),
-                  kNewFramerateFps))
-      .Times(1);
-  video_processor_->SetRates(kNewBitrateKbps, kNewFramerateFps);
-  EXPECT_THAT(video_processor_->NumberDroppedFramesPerRateUpdate(),
-              ElementsAre(0, 0));
-  EXPECT_THAT(video_processor_->NumberSpatialResizesPerRateUpdate(),
-              ElementsAre(0, 0));
-
-  ExpectRelease();
-  video_processor_->Release();
-}
-
-}  // namespace test
-}  // namespace webrtc
diff --git a/modules/video_coding/codecs/vp8/default_temporal_layers.cc b/modules/video_coding/codecs/vp8/default_temporal_layers.cc
deleted file mode 100644
index 02c3f15..0000000
--- a/modules/video_coding/codecs/vp8/default_temporal_layers.cc
+++ /dev/null
@@ -1,431 +0,0 @@
-/* Copyright (c) 2013 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/video_coding/codecs/vp8/default_temporal_layers.h"
-
-#include <stdlib.h>
-#include <string.h>
-
-#include <algorithm>
-#include <vector>
-
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/modules/video_coding/codecs/vp8/include/vp8_common_types.h"
-#include "webrtc/modules/video_coding/include/video_codec_interface.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/system_wrappers/include/field_trial.h"
-
-#include "vpx/vpx_encoder.h"
-#include "vpx/vp8cx.h"
-
-namespace webrtc {
-
-TemporalLayers::FrameConfig::FrameConfig()
-    : FrameConfig(kNone, kNone, kNone, false) {}
-
-TemporalLayers::FrameConfig::FrameConfig(TemporalLayers::BufferFlags last,
-                                         TemporalLayers::BufferFlags golden,
-                                         TemporalLayers::BufferFlags arf)
-    : FrameConfig(last, golden, arf, false) {}
-
-TemporalLayers::FrameConfig::FrameConfig(TemporalLayers::BufferFlags last,
-                                         TemporalLayers::BufferFlags golden,
-                                         TemporalLayers::BufferFlags arf,
-                                         FreezeEntropy)
-    : FrameConfig(last, golden, arf, true) {}
-
-TemporalLayers::FrameConfig::FrameConfig(TemporalLayers::BufferFlags last,
-                                         TemporalLayers::BufferFlags golden,
-                                         TemporalLayers::BufferFlags arf,
-                                         bool freeze_entropy)
-    : drop_frame(last == TemporalLayers::kNone &&
-                 golden == TemporalLayers::kNone &&
-                 arf == TemporalLayers::kNone),
-      last_buffer_flags(last),
-      golden_buffer_flags(golden),
-      arf_buffer_flags(arf),
-      encoder_layer_id(0),
-      packetizer_temporal_idx(kNoTemporalIdx),
-      layer_sync(false),
-      freeze_entropy(freeze_entropy) {}
-
-namespace {
-
-std::vector<unsigned int> GetTemporalIds(size_t num_layers) {
-  switch (num_layers) {
-    case 1:
-      // Temporal layer structure (single layer):
-      // 0 0 0 0 ...
-      return {0};
-    case 2:
-      // Temporal layer structure:
-      //   1   1 ...
-      // 0   0   ...
-      return {0, 1};
-    case 3:
-      // Temporal layer structure:
-      //   2   2   2   2 ...
-      //     1       1   ...
-      // 0       0       ...
-      return {0, 2, 1, 2};
-    case 4:
-      // Temporal layer structure:
-      //   3   3   3   3   3   3   3   3 ...
-      //     2       2       2       2   ...
-      //         1               1       ...
-      // 0               0               ...
-      return {0, 3, 2, 3, 1, 3, 2, 3};
-    default:
-      RTC_NOTREACHED();
-      break;
-  }
-  RTC_NOTREACHED();
-  return {0};
-}
-
-std::vector<bool> GetTemporalLayerSync(size_t num_layers) {
-  switch (num_layers) {
-    case 1:
-      return {false};
-    case 2:
-      return {false, true, false, false, false, false, false, false};
-    case 3:
-      if (field_trial::IsEnabled("WebRTC-UseShortVP8TL3Pattern")) {
-        return {false, true, true, false};
-      } else {
-        return {false, true, true, false, false, false, false, false};
-      }
-    case 4:
-      return {false, true,  true,  false, true,  false, false, false,
-              false, false, false, false, false, false, false, false};
-    default:
-      break;
-  }
-  RTC_NOTREACHED() << num_layers;
-  return {};
-}
-
-std::vector<TemporalLayers::FrameConfig> GetTemporalPattern(size_t num_layers) {
-  // For indexing in the patterns described below (which temporal layers they
-  // belong to), see the diagram above.
-  // Layer sync is done similarly for all patterns (except single stream) and
-  // happens every 8 frames:
-  // TL1 layer syncs by periodically by only referencing TL0 ('last'), but still
-  // updating 'golden', so it can be used as a reference by future TL1 frames.
-  // TL2 layer syncs just before TL1 by only depending on TL0 (and not depending
-  // on TL1's buffer before TL1 has layer synced).
-  // TODO(pbos): Consider cyclically updating 'arf' (and 'golden' for 1TL) for
-  // the base layer in 1-3TL instead of 'last' periodically on long intervals,
-  // so that if scene changes occur (user walks between rooms or rotates webcam)
-  // the 'arf' (or 'golden' respectively) is not stuck on a no-longer relevant
-  // keyframe.
-  switch (num_layers) {
-    case 1:
-      // All frames reference all buffers and the 'last' buffer is updated.
-      return {TemporalLayers::FrameConfig(TemporalLayers::kReferenceAndUpdate,
-                                          TemporalLayers::kReference,
-                                          TemporalLayers::kReference)};
-    case 2:
-      // All layers can reference but not update the 'alt' buffer, this means
-      // that the 'alt' buffer reference is effectively the last keyframe.
-      // TL0 also references and updates the 'last' buffer.
-      // TL1 also references 'last' and references and updates 'golden'.
-      return {TemporalLayers::FrameConfig(TemporalLayers::kReferenceAndUpdate,
-                                          TemporalLayers::kNone,
-                                          TemporalLayers::kReference),
-              TemporalLayers::FrameConfig(TemporalLayers::kReference,
-                                          TemporalLayers::kUpdate,
-                                          TemporalLayers::kReference),
-              TemporalLayers::FrameConfig(TemporalLayers::kReferenceAndUpdate,
-                                          TemporalLayers::kNone,
-                                          TemporalLayers::kReference),
-              TemporalLayers::FrameConfig(TemporalLayers::kReference,
-                                          TemporalLayers::kReferenceAndUpdate,
-                                          TemporalLayers::kReference),
-              TemporalLayers::FrameConfig(TemporalLayers::kReferenceAndUpdate,
-                                          TemporalLayers::kNone,
-                                          TemporalLayers::kReference),
-              TemporalLayers::FrameConfig(TemporalLayers::kReference,
-                                          TemporalLayers::kReferenceAndUpdate,
-                                          TemporalLayers::kReference),
-              TemporalLayers::FrameConfig(TemporalLayers::kReferenceAndUpdate,
-                                          TemporalLayers::kNone,
-                                          TemporalLayers::kReference),
-              TemporalLayers::FrameConfig(
-                  TemporalLayers::kReference, TemporalLayers::kReference,
-                  TemporalLayers::kReference, TemporalLayers::kFreezeEntropy)};
-    case 3:
-      if (field_trial::IsEnabled("WebRTC-UseShortVP8TL3Pattern")) {
-        // This field trial is intended to check if it is worth using a shorter
-        // temporal pattern, trading some coding efficiency for less risk of
-        // dropped frames.
-        // The coding efficiency will decrease somewhat since the higher layer
-        // state is more volatile, but it will be offset slightly by updating
-        // the altref buffer with TL2 frames, instead of just referencing lower
-        // layers.
-        // If a frame is dropped in a higher layer, the jitter
-        // buffer on the receive side won't be able to decode any higher layer
-        // frame until the next sync frame. So we expect a noticeable decrease
-        // in frame drops on links with high packet loss.
-
-        // TL0 references and updates the 'last' buffer.
-        // TL1  references 'last' and references and updates 'golden'.
-        // TL2 references both 'last' & 'golden' and references and updates
-        // 'arf'.
-        return {TemporalLayers::FrameConfig(TemporalLayers::kReferenceAndUpdate,
-                                            TemporalLayers::kNone,
-                                            TemporalLayers::kNone),
-                TemporalLayers::FrameConfig(TemporalLayers::kReference,
-                                            TemporalLayers::kNone,
-                                            TemporalLayers::kUpdate),
-                TemporalLayers::FrameConfig(TemporalLayers::kReference,
-                                            TemporalLayers::kUpdate,
-                                            TemporalLayers::kNone),
-                TemporalLayers::FrameConfig(TemporalLayers::kReference,
-                                            TemporalLayers::kReference,
-                                            TemporalLayers::kReference,
-                                            TemporalLayers::kFreezeEntropy)};
-      } else {
-        // All layers can reference but not update the 'alt' buffer, this means
-        // that the 'alt' buffer reference is effectively the last keyframe.
-        // TL0 also references and updates the 'last' buffer.
-        // TL1 also references 'last' and references and updates 'golden'.
-        // TL2 references both 'last' and 'golden' but updates no buffer.
-        return {TemporalLayers::FrameConfig(TemporalLayers::kReferenceAndUpdate,
-                                            TemporalLayers::kNone,
-                                            TemporalLayers::kReference),
-                TemporalLayers::FrameConfig(
-                    TemporalLayers::kReference, TemporalLayers::kNone,
-                    TemporalLayers::kReference, TemporalLayers::kFreezeEntropy),
-                TemporalLayers::FrameConfig(TemporalLayers::kReference,
-                                            TemporalLayers::kUpdate,
-                                            TemporalLayers::kReference),
-                TemporalLayers::FrameConfig(
-                    TemporalLayers::kReference, TemporalLayers::kReference,
-                    TemporalLayers::kReference, TemporalLayers::kFreezeEntropy),
-                TemporalLayers::FrameConfig(TemporalLayers::kReferenceAndUpdate,
-                                            TemporalLayers::kNone,
-                                            TemporalLayers::kReference),
-                TemporalLayers::FrameConfig(
-                    TemporalLayers::kReference, TemporalLayers::kReference,
-                    TemporalLayers::kReference, TemporalLayers::kFreezeEntropy),
-                TemporalLayers::FrameConfig(TemporalLayers::kReference,
-                                            TemporalLayers::kReferenceAndUpdate,
-                                            TemporalLayers::kReference),
-                TemporalLayers::FrameConfig(TemporalLayers::kReference,
-                                            TemporalLayers::kReference,
-                                            TemporalLayers::kReference,
-                                            TemporalLayers::kFreezeEntropy)};
-      }
-    case 4:
-      // TL0 references and updates only the 'last' buffer.
-      // TL1 references 'last' and updates and references 'golden'.
-      // TL2 references 'last' and 'golden', and references and updates 'arf'.
-      // TL3 references all buffers but update none of them.
-      return {TemporalLayers::FrameConfig(TemporalLayers::kReferenceAndUpdate,
-                                          TemporalLayers::kNone,
-                                          TemporalLayers::kNone),
-              TemporalLayers::FrameConfig(
-                  TemporalLayers::kReference, TemporalLayers::kNone,
-                  TemporalLayers::kNone, TemporalLayers::kFreezeEntropy),
-              TemporalLayers::FrameConfig(TemporalLayers::kReference,
-                                          TemporalLayers::kNone,
-                                          TemporalLayers::kUpdate),
-              TemporalLayers::FrameConfig(
-                  TemporalLayers::kReference, TemporalLayers::kNone,
-                  TemporalLayers::kReference, TemporalLayers::kFreezeEntropy),
-              TemporalLayers::FrameConfig(TemporalLayers::kReference,
-                                          TemporalLayers::kUpdate,
-                                          TemporalLayers::kNone),
-              TemporalLayers::FrameConfig(
-                  TemporalLayers::kReference, TemporalLayers::kReference,
-                  TemporalLayers::kReference, TemporalLayers::kFreezeEntropy),
-              TemporalLayers::FrameConfig(TemporalLayers::kReference,
-                                          TemporalLayers::kReference,
-                                          TemporalLayers::kReferenceAndUpdate),
-              TemporalLayers::FrameConfig(
-                  TemporalLayers::kReference, TemporalLayers::kReference,
-                  TemporalLayers::kReference, TemporalLayers::kFreezeEntropy),
-              TemporalLayers::FrameConfig(TemporalLayers::kReferenceAndUpdate,
-                                          TemporalLayers::kNone,
-                                          TemporalLayers::kNone),
-              TemporalLayers::FrameConfig(
-                  TemporalLayers::kReference, TemporalLayers::kReference,
-                  TemporalLayers::kReference, TemporalLayers::kFreezeEntropy),
-              TemporalLayers::FrameConfig(TemporalLayers::kReference,
-                                          TemporalLayers::kReference,
-                                          TemporalLayers::kReferenceAndUpdate),
-              TemporalLayers::FrameConfig(
-                  TemporalLayers::kReference, TemporalLayers::kReference,
-                  TemporalLayers::kReference, TemporalLayers::kFreezeEntropy),
-              TemporalLayers::FrameConfig(TemporalLayers::kReference,
-                                          TemporalLayers::kReferenceAndUpdate,
-                                          TemporalLayers::kNone),
-              TemporalLayers::FrameConfig(
-                  TemporalLayers::kReference, TemporalLayers::kReference,
-                  TemporalLayers::kReference, TemporalLayers::kFreezeEntropy),
-              TemporalLayers::FrameConfig(TemporalLayers::kReference,
-                                          TemporalLayers::kReference,
-                                          TemporalLayers::kReferenceAndUpdate),
-              TemporalLayers::FrameConfig(
-                  TemporalLayers::kReference, TemporalLayers::kReference,
-                  TemporalLayers::kReference, TemporalLayers::kFreezeEntropy)};
-    default:
-      RTC_NOTREACHED();
-      break;
-  }
-  RTC_NOTREACHED();
-  return {TemporalLayers::FrameConfig(
-      TemporalLayers::kNone, TemporalLayers::kNone, TemporalLayers::kNone)};
-}
-
-// Temporary fix for forced SW fallback.
-// For VP8 SW codec, |TemporalLayers| is created and reported to
-// SimulcastRateAllocator::OnTemporalLayersCreated but not for VP8 HW.
-// Causes an issue when going from forced SW -> HW as |TemporalLayers| is not
-// deregistred when deleted by SW codec (tl factory might not exist, owned by
-// SimulcastRateAllocator).
-bool ExcludeOnTemporalLayersCreated(int num_temporal_layers) {
-  return webrtc::field_trial::IsEnabled("WebRTC-VP8-Forced-Fallback-Encoder") &&
-         num_temporal_layers == 1;
-}
-}  // namespace
-
-DefaultTemporalLayers::DefaultTemporalLayers(int number_of_temporal_layers,
-                                             uint8_t initial_tl0_pic_idx)
-    : num_layers_(std::max(1, number_of_temporal_layers)),
-      temporal_ids_(GetTemporalIds(num_layers_)),
-      temporal_layer_sync_(GetTemporalLayerSync(num_layers_)),
-      temporal_pattern_(GetTemporalPattern(num_layers_)),
-      tl0_pic_idx_(initial_tl0_pic_idx),
-      pattern_idx_(255),
-      last_base_layer_sync_(false) {
-  RTC_DCHECK_EQ(temporal_pattern_.size(), temporal_layer_sync_.size());
-  RTC_CHECK_GE(kMaxTemporalStreams, number_of_temporal_layers);
-  RTC_CHECK_GE(number_of_temporal_layers, 0);
-  RTC_CHECK_LE(number_of_temporal_layers, 4);
-  // pattern_idx_ wraps around temporal_pattern_.size, this is incorrect if
-  // temporal_ids_ are ever longer. If this is no longer correct it needs to
-  // wrap at max(temporal_ids_.size(), temporal_pattern_.size()).
-  RTC_DCHECK_LE(temporal_ids_.size(), temporal_pattern_.size());
-}
-
-uint8_t DefaultTemporalLayers::Tl0PicIdx() const {
-  return tl0_pic_idx_;
-}
-
-std::vector<uint32_t> DefaultTemporalLayers::OnRatesUpdated(
-    int bitrate_kbps,
-    int max_bitrate_kbps,
-    int framerate) {
-  std::vector<uint32_t> bitrates;
-  for (size_t i = 0; i < num_layers_; ++i) {
-    float layer_bitrate =
-        bitrate_kbps * kVp8LayerRateAlloction[num_layers_ - 1][i];
-    bitrates.push_back(static_cast<uint32_t>(layer_bitrate + 0.5));
-  }
-  new_bitrates_kbps_ = rtc::Optional<std::vector<uint32_t>>(bitrates);
-
-  // Allocation table is of aggregates, transform to individual rates.
-  uint32_t sum = 0;
-  for (size_t i = 0; i < num_layers_; ++i) {
-    uint32_t layer_bitrate = bitrates[i];
-    RTC_DCHECK_LE(sum, bitrates[i]);
-    bitrates[i] -= sum;
-    sum = layer_bitrate;
-
-    if (sum >= static_cast<uint32_t>(bitrate_kbps)) {
-      // Sum adds up; any subsequent layers will be 0.
-      bitrates.resize(i + 1);
-      break;
-    }
-  }
-
-  return bitrates;
-}
-
-bool DefaultTemporalLayers::UpdateConfiguration(vpx_codec_enc_cfg_t* cfg) {
-  if (!new_bitrates_kbps_)
-    return false;
-
-  for (size_t i = 0; i < num_layers_; ++i) {
-    cfg->ts_target_bitrate[i] = (*new_bitrates_kbps_)[i];
-    // ..., 4, 2, 1
-    cfg->ts_rate_decimator[i] = 1 << (num_layers_ - i - 1);
-  }
-
-  cfg->ts_number_layers = num_layers_;
-  cfg->ts_periodicity = temporal_ids_.size();
-  memcpy(cfg->ts_layer_id, &temporal_ids_[0],
-         sizeof(unsigned int) * temporal_ids_.size());
-
-  new_bitrates_kbps_ = rtc::Optional<std::vector<uint32_t>>();
-
-  return true;
-}
-
-TemporalLayers::FrameConfig DefaultTemporalLayers::UpdateLayerConfig(
-    uint32_t timestamp) {
-  RTC_DCHECK_GT(num_layers_, 0);
-  RTC_DCHECK_LT(0, temporal_pattern_.size());
-  pattern_idx_ = (pattern_idx_ + 1) % temporal_pattern_.size();
-  TemporalLayers::FrameConfig tl_config = temporal_pattern_[pattern_idx_];
-  tl_config.layer_sync =
-      temporal_layer_sync_[pattern_idx_ % temporal_layer_sync_.size()];
-  tl_config.encoder_layer_id = tl_config.packetizer_temporal_idx =
-      temporal_ids_[pattern_idx_ % temporal_ids_.size()];
-  return tl_config;
-}
-
-void DefaultTemporalLayers::PopulateCodecSpecific(
-    bool frame_is_keyframe,
-    const TemporalLayers::FrameConfig& tl_config,
-    CodecSpecificInfoVP8* vp8_info,
-    uint32_t timestamp) {
-  RTC_DCHECK_GT(num_layers_, 0);
-
-  if (num_layers_ == 1) {
-    vp8_info->temporalIdx = kNoTemporalIdx;
-    vp8_info->layerSync = false;
-    vp8_info->tl0PicIdx = kNoTl0PicIdx;
-  } else {
-    vp8_info->temporalIdx = tl_config.packetizer_temporal_idx;
-    vp8_info->layerSync = tl_config.layer_sync;
-    if (frame_is_keyframe) {
-      vp8_info->temporalIdx = 0;
-      vp8_info->layerSync = true;
-    }
-    if (last_base_layer_sync_ && vp8_info->temporalIdx != 0) {
-      // Regardless of pattern the frame after a base layer sync will always
-      // be a layer sync.
-      vp8_info->layerSync = true;
-    }
-    if (vp8_info->temporalIdx == 0)
-      tl0_pic_idx_++;
-    last_base_layer_sync_ = frame_is_keyframe;
-    vp8_info->tl0PicIdx = tl0_pic_idx_;
-  }
-}
-
-TemporalLayers* TemporalLayersFactory::Create(
-    int simulcast_id,
-    int temporal_layers,
-    uint8_t initial_tl0_pic_idx) const {
-  TemporalLayers* tl =
-      new DefaultTemporalLayers(temporal_layers, initial_tl0_pic_idx);
-  if (listener_ && !ExcludeOnTemporalLayersCreated(temporal_layers))
-    listener_->OnTemporalLayersCreated(simulcast_id, tl);
-  return tl;
-}
-
-void TemporalLayersFactory::SetListener(TemporalLayersListener* listener) {
-  listener_ = listener;
-}
-
-}  // namespace webrtc
diff --git a/modules/video_coding/codecs/vp8/default_temporal_layers.h b/modules/video_coding/codecs/vp8/default_temporal_layers.h
deleted file mode 100644
index 985874b..0000000
--- a/modules/video_coding/codecs/vp8/default_temporal_layers.h
+++ /dev/null
@@ -1,63 +0,0 @@
-/* Copyright (c) 2013 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.
-*/
-/*
-* This file defines classes for doing temporal layers with VP8.
-*/
-#ifndef WEBRTC_MODULES_VIDEO_CODING_CODECS_VP8_DEFAULT_TEMPORAL_LAYERS_H_
-#define WEBRTC_MODULES_VIDEO_CODING_CODECS_VP8_DEFAULT_TEMPORAL_LAYERS_H_
-
-#include <vector>
-
-#include "webrtc/modules/video_coding/codecs/vp8/temporal_layers.h"
-
-#include "webrtc/api/optional.h"
-
-namespace webrtc {
-
-class DefaultTemporalLayers : public TemporalLayers {
- public:
-  DefaultTemporalLayers(int number_of_temporal_layers,
-                        uint8_t initial_tl0_pic_idx);
-  virtual ~DefaultTemporalLayers() {}
-
-  // Returns the recommended VP8 encode flags needed. May refresh the decoder
-  // and/or update the reference buffers.
-  TemporalLayers::FrameConfig UpdateLayerConfig(uint32_t timestamp) override;
-
-  // Update state based on new bitrate target and incoming framerate.
-  // Returns the bitrate allocation for the active temporal layers.
-  std::vector<uint32_t> OnRatesUpdated(int bitrate_kbps,
-                                       int max_bitrate_kbps,
-                                       int framerate) override;
-
-  bool UpdateConfiguration(vpx_codec_enc_cfg_t* cfg) override;
-
-  void PopulateCodecSpecific(bool frame_is_keyframe,
-                             const TemporalLayers::FrameConfig& tl_config,
-                             CodecSpecificInfoVP8* vp8_info,
-                             uint32_t timestamp) override;
-
-  void FrameEncoded(unsigned int size, int qp) override {}
-
-  uint8_t Tl0PicIdx() const override;
-
- private:
-  const size_t num_layers_;
-  const std::vector<unsigned int> temporal_ids_;
-  const std::vector<bool> temporal_layer_sync_;
-  const std::vector<TemporalLayers::FrameConfig> temporal_pattern_;
-
-  uint8_t tl0_pic_idx_;
-  uint8_t pattern_idx_;
-  bool last_base_layer_sync_;
-  rtc::Optional<std::vector<uint32_t>> new_bitrates_kbps_;
-};
-
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_VIDEO_CODING_CODECS_VP8_DEFAULT_TEMPORAL_LAYERS_H_
diff --git a/modules/video_coding/codecs/vp8/default_temporal_layers_unittest.cc b/modules/video_coding/codecs/vp8/default_temporal_layers_unittest.cc
deleted file mode 100644
index 0075fd5..0000000
--- a/modules/video_coding/codecs/vp8/default_temporal_layers_unittest.cc
+++ /dev/null
@@ -1,398 +0,0 @@
-/*
- *  Copyright (c) 2011 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/video_coding/codecs/vp8/default_temporal_layers.h"
-#include "vpx/vp8cx.h"
-#include "vpx/vpx_encoder.h"
-#include "webrtc/modules/video_coding/codecs/vp8/vp8_impl.h"
-#include "webrtc/modules/video_coding/include/video_codec_interface.h"
-#include "webrtc/test/field_trial.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-namespace test {
-
-enum {
-  kTemporalUpdateLast = VP8_EFLAG_NO_UPD_GF | VP8_EFLAG_NO_UPD_ARF |
-                        VP8_EFLAG_NO_REF_GF | VP8_EFLAG_NO_REF_ARF,
-  kTemporalUpdateGoldenWithoutDependency =
-      VP8_EFLAG_NO_REF_GF | VP8_EFLAG_NO_REF_ARF | VP8_EFLAG_NO_UPD_ARF |
-      VP8_EFLAG_NO_UPD_LAST,
-  kTemporalUpdateGolden =
-      VP8_EFLAG_NO_REF_ARF | VP8_EFLAG_NO_UPD_ARF | VP8_EFLAG_NO_UPD_LAST,
-  kTemporalUpdateAltrefWithoutDependency =
-      VP8_EFLAG_NO_REF_ARF | VP8_EFLAG_NO_REF_GF | VP8_EFLAG_NO_UPD_GF |
-      VP8_EFLAG_NO_UPD_LAST,
-  kTemporalUpdateAltref = VP8_EFLAG_NO_UPD_GF | VP8_EFLAG_NO_UPD_LAST,
-  kTemporalUpdateNone = VP8_EFLAG_NO_UPD_GF | VP8_EFLAG_NO_UPD_ARF |
-                        VP8_EFLAG_NO_UPD_LAST | VP8_EFLAG_NO_UPD_ENTROPY,
-  kTemporalUpdateNoneNoRefAltRef =
-      VP8_EFLAG_NO_REF_ARF | VP8_EFLAG_NO_UPD_GF | VP8_EFLAG_NO_UPD_ARF |
-      VP8_EFLAG_NO_UPD_LAST | VP8_EFLAG_NO_UPD_ENTROPY,
-  kTemporalUpdateNoneNoRefGolden =
-      VP8_EFLAG_NO_REF_GF | VP8_EFLAG_NO_UPD_GF | VP8_EFLAG_NO_UPD_ARF |
-      VP8_EFLAG_NO_UPD_LAST | VP8_EFLAG_NO_UPD_ENTROPY,
-  kTemporalUpdateNoneNoRefGoldenAltRef =
-      VP8_EFLAG_NO_REF_GF | VP8_EFLAG_NO_UPD_GF | VP8_EFLAG_NO_REF_ARF |
-      VP8_EFLAG_NO_UPD_ARF | VP8_EFLAG_NO_UPD_LAST | VP8_EFLAG_NO_UPD_ENTROPY,
-  kTemporalUpdateGoldenWithoutDependencyRefAltRef =
-      VP8_EFLAG_NO_REF_GF | VP8_EFLAG_NO_UPD_ARF | VP8_EFLAG_NO_UPD_LAST,
-  kTemporalUpdateGoldenRefAltRef = VP8_EFLAG_NO_UPD_ARF | VP8_EFLAG_NO_UPD_LAST,
-  kTemporalUpdateLastRefAltRef =
-      VP8_EFLAG_NO_UPD_GF | VP8_EFLAG_NO_UPD_ARF | VP8_EFLAG_NO_REF_GF,
-  kTemporalUpdateLastAndGoldenRefAltRef =
-      VP8_EFLAG_NO_UPD_ARF | VP8_EFLAG_NO_REF_GF,
-};
-
-TEST(TemporalLayersTest, 2Layers) {
-  DefaultTemporalLayers tl(2, 0);
-  vpx_codec_enc_cfg_t cfg;
-  CodecSpecificInfoVP8 vp8_info;
-  tl.OnRatesUpdated(500, 500, 30);
-  tl.UpdateConfiguration(&cfg);
-
-  int expected_flags[16] = {
-      kTemporalUpdateLastRefAltRef,
-      kTemporalUpdateGoldenWithoutDependencyRefAltRef,
-      kTemporalUpdateLastRefAltRef,
-      kTemporalUpdateGoldenRefAltRef,
-      kTemporalUpdateLastRefAltRef,
-      kTemporalUpdateGoldenRefAltRef,
-      kTemporalUpdateLastRefAltRef,
-      kTemporalUpdateNone,
-      kTemporalUpdateLastRefAltRef,
-      kTemporalUpdateGoldenWithoutDependencyRefAltRef,
-      kTemporalUpdateLastRefAltRef,
-      kTemporalUpdateGoldenRefAltRef,
-      kTemporalUpdateLastRefAltRef,
-      kTemporalUpdateGoldenRefAltRef,
-      kTemporalUpdateLastRefAltRef,
-      kTemporalUpdateNone,
-  };
-  int expected_temporal_idx[16] = {0, 1, 0, 1, 0, 1, 0, 1,
-                                   0, 1, 0, 1, 0, 1, 0, 1};
-
-  bool expected_layer_sync[16] = {false, true,  false, false, false, false,
-                                  false, false, false, true,  false, false,
-                                  false, false, false, false};
-
-  uint32_t timestamp = 0;
-  for (int i = 0; i < 16; ++i) {
-    TemporalLayers::FrameConfig tl_config = tl.UpdateLayerConfig(timestamp);
-    EXPECT_EQ(expected_flags[i], VP8EncoderImpl::EncodeFlags(tl_config)) << i;
-    tl.PopulateCodecSpecific(false, tl_config, &vp8_info, 0);
-    EXPECT_EQ(expected_temporal_idx[i], vp8_info.temporalIdx);
-    EXPECT_EQ(expected_temporal_idx[i], tl_config.packetizer_temporal_idx);
-    EXPECT_EQ(expected_temporal_idx[i], tl_config.encoder_layer_id);
-    EXPECT_EQ(expected_layer_sync[i], vp8_info.layerSync);
-    EXPECT_EQ(expected_layer_sync[i], tl_config.layer_sync);
-    timestamp += 3000;
-  }
-}
-
-TEST(TemporalLayersTest, 3Layers) {
-  DefaultTemporalLayers tl(3, 0);
-  vpx_codec_enc_cfg_t cfg;
-  CodecSpecificInfoVP8 vp8_info;
-  tl.OnRatesUpdated(500, 500, 30);
-  tl.UpdateConfiguration(&cfg);
-
-  int expected_flags[16] = {
-      kTemporalUpdateLastRefAltRef,
-      kTemporalUpdateNoneNoRefGolden,
-      kTemporalUpdateGoldenWithoutDependencyRefAltRef,
-      kTemporalUpdateNone,
-      kTemporalUpdateLastRefAltRef,
-      kTemporalUpdateNone,
-      kTemporalUpdateGoldenRefAltRef,
-      kTemporalUpdateNone,
-      kTemporalUpdateLastRefAltRef,
-      kTemporalUpdateNoneNoRefGolden,
-      kTemporalUpdateGoldenWithoutDependencyRefAltRef,
-      kTemporalUpdateNone,
-      kTemporalUpdateLastRefAltRef,
-      kTemporalUpdateNone,
-      kTemporalUpdateGoldenRefAltRef,
-      kTemporalUpdateNone,
-  };
-  int expected_temporal_idx[16] = {0, 2, 1, 2, 0, 2, 1, 2,
-                                   0, 2, 1, 2, 0, 2, 1, 2};
-
-  bool expected_layer_sync[16] = {false, true,  true,  false, false, false,
-                                  false, false, false, true,  true,  false,
-                                  false, false, false, false};
-
-  unsigned int timestamp = 0;
-  for (int i = 0; i < 16; ++i) {
-    TemporalLayers::FrameConfig tl_config = tl.UpdateLayerConfig(timestamp);
-    EXPECT_EQ(expected_flags[i], VP8EncoderImpl::EncodeFlags(tl_config)) << i;
-    tl.PopulateCodecSpecific(false, tl_config, &vp8_info, 0);
-    EXPECT_EQ(expected_temporal_idx[i], vp8_info.temporalIdx);
-    EXPECT_EQ(expected_temporal_idx[i], tl_config.packetizer_temporal_idx);
-    EXPECT_EQ(expected_temporal_idx[i], tl_config.encoder_layer_id);
-    EXPECT_EQ(expected_layer_sync[i], vp8_info.layerSync);
-    EXPECT_EQ(expected_layer_sync[i], tl_config.layer_sync);
-    timestamp += 3000;
-  }
-}
-
-TEST(TemporalLayersTest, Alternative3Layers) {
-  ScopedFieldTrials field_trial("WebRTC-UseShortVP8TL3Pattern/Enabled/");
-  DefaultTemporalLayers tl(3, 0);
-  vpx_codec_enc_cfg_t cfg;
-  CodecSpecificInfoVP8 vp8_info;
-  tl.OnRatesUpdated(500, 500, 30);
-  tl.UpdateConfiguration(&cfg);
-
-  int expected_flags[8] = {kTemporalUpdateLast,
-                           kTemporalUpdateAltrefWithoutDependency,
-                           kTemporalUpdateGoldenWithoutDependency,
-                           kTemporalUpdateNone,
-                           kTemporalUpdateLast,
-                           kTemporalUpdateAltrefWithoutDependency,
-                           kTemporalUpdateGoldenWithoutDependency,
-                           kTemporalUpdateNone};
-  int expected_temporal_idx[8] = {0, 2, 1, 2, 0, 2, 1, 2};
-
-  bool expected_layer_sync[8] = {false, true, true, false,
-                                 false, true, true, false};
-
-  unsigned int timestamp = 0;
-  for (int i = 0; i < 8; ++i) {
-    TemporalLayers::FrameConfig tl_config = tl.UpdateLayerConfig(timestamp);
-    EXPECT_EQ(expected_flags[i], VP8EncoderImpl::EncodeFlags(tl_config)) << i;
-    tl.PopulateCodecSpecific(false, tl_config, &vp8_info, 0);
-    EXPECT_EQ(expected_temporal_idx[i], vp8_info.temporalIdx);
-    EXPECT_EQ(expected_temporal_idx[i], tl_config.packetizer_temporal_idx);
-    EXPECT_EQ(expected_temporal_idx[i], tl_config.encoder_layer_id);
-    EXPECT_EQ(expected_layer_sync[i], vp8_info.layerSync);
-    EXPECT_EQ(expected_layer_sync[i], tl_config.layer_sync);
-    timestamp += 3000;
-  }
-}
-
-TEST(TemporalLayersTest, 4Layers) {
-  DefaultTemporalLayers tl(4, 0);
-  vpx_codec_enc_cfg_t cfg;
-  CodecSpecificInfoVP8 vp8_info;
-  tl.OnRatesUpdated(500, 500, 30);
-  tl.UpdateConfiguration(&cfg);
-  int expected_flags[16] = {
-      kTemporalUpdateLast,
-      kTemporalUpdateNoneNoRefGoldenAltRef,
-      kTemporalUpdateAltrefWithoutDependency,
-      kTemporalUpdateNoneNoRefGolden,
-      kTemporalUpdateGoldenWithoutDependency,
-      kTemporalUpdateNone,
-      kTemporalUpdateAltref,
-      kTemporalUpdateNone,
-      kTemporalUpdateLast,
-      kTemporalUpdateNone,
-      kTemporalUpdateAltref,
-      kTemporalUpdateNone,
-      kTemporalUpdateGolden,
-      kTemporalUpdateNone,
-      kTemporalUpdateAltref,
-      kTemporalUpdateNone,
-  };
-  int expected_temporal_idx[16] = {0, 3, 2, 3, 1, 3, 2, 3,
-                                   0, 3, 2, 3, 1, 3, 2, 3};
-
-  bool expected_layer_sync[16] = {false, true,  true,  false, true,  false,
-                                  false, false, false, false, false, false,
-                                  false, false, false, false};
-
-  uint32_t timestamp = 0;
-  for (int i = 0; i < 16; ++i) {
-    TemporalLayers::FrameConfig tl_config = tl.UpdateLayerConfig(timestamp);
-    EXPECT_EQ(expected_flags[i], VP8EncoderImpl::EncodeFlags(tl_config)) << i;
-    tl.PopulateCodecSpecific(false, tl_config, &vp8_info, 0);
-    EXPECT_EQ(expected_temporal_idx[i], vp8_info.temporalIdx);
-    EXPECT_EQ(expected_temporal_idx[i], tl_config.packetizer_temporal_idx);
-    EXPECT_EQ(expected_temporal_idx[i], tl_config.encoder_layer_id);
-    EXPECT_EQ(expected_layer_sync[i], vp8_info.layerSync);
-    EXPECT_EQ(expected_layer_sync[i], tl_config.layer_sync);
-    timestamp += 3000;
-  }
-}
-
-TEST(TemporalLayersTest, KeyFrame) {
-  DefaultTemporalLayers tl(3, 0);
-  vpx_codec_enc_cfg_t cfg;
-  CodecSpecificInfoVP8 vp8_info;
-  tl.OnRatesUpdated(500, 500, 30);
-  tl.UpdateConfiguration(&cfg);
-
-  int expected_flags[8] = {
-      kTemporalUpdateLastRefAltRef,
-      kTemporalUpdateNoneNoRefGolden,
-      kTemporalUpdateGoldenWithoutDependencyRefAltRef,
-      kTemporalUpdateNone,
-      kTemporalUpdateLastRefAltRef,
-      kTemporalUpdateNone,
-      kTemporalUpdateGoldenRefAltRef,
-      kTemporalUpdateNone,
-  };
-  int expected_temporal_idx[8] = {0, 2, 1, 2, 0, 2, 1, 2};
-  bool expected_layer_sync[8] = {false, true,  true,  false,
-                                 false, false, false, false};
-
-  uint32_t timestamp = 0;
-  for (int i = 0; i < 7; ++i) {
-    TemporalLayers::FrameConfig tl_config = tl.UpdateLayerConfig(timestamp);
-    EXPECT_EQ(expected_flags[i], VP8EncoderImpl::EncodeFlags(tl_config)) << i;
-    tl.PopulateCodecSpecific(true, tl_config, &vp8_info, 0);
-    EXPECT_EQ(expected_temporal_idx[i], tl_config.packetizer_temporal_idx);
-    EXPECT_EQ(expected_temporal_idx[i], tl_config.encoder_layer_id);
-    EXPECT_EQ(0, vp8_info.temporalIdx)
-        << "Key frame should always be packetized as layer 0";
-    EXPECT_EQ(expected_layer_sync[i], tl_config.layer_sync);
-    EXPECT_TRUE(vp8_info.layerSync) << "Key frame should be marked layer sync.";
-    timestamp += 3000;
-  }
-  TemporalLayers::FrameConfig tl_config = tl.UpdateLayerConfig(timestamp);
-  EXPECT_EQ(expected_flags[7], VP8EncoderImpl::EncodeFlags(tl_config));
-  tl.PopulateCodecSpecific(false, tl_config, &vp8_info, 0);
-  EXPECT_NE(0, vp8_info.temporalIdx)
-      << "To test something useful, this frame should not use layer 0.";
-  EXPECT_EQ(expected_temporal_idx[7], vp8_info.temporalIdx)
-      << "Non-keyframe, should use frame temporal index.";
-  EXPECT_EQ(expected_temporal_idx[7], tl_config.packetizer_temporal_idx);
-  EXPECT_EQ(expected_temporal_idx[7], tl_config.encoder_layer_id);
-  EXPECT_FALSE(tl_config.layer_sync);
-  EXPECT_TRUE(vp8_info.layerSync) << "Frame after keyframe should always be "
-                                     "marked layer sync since it only depends "
-                                     "on the base layer.";
-}
-
-class TemporalLayersReferenceTest : public ::testing::TestWithParam<int> {
- public:
-  TemporalLayersReferenceTest()
-      : timestamp_(1),
-        last_sync_timestamp_(timestamp_),
-        tl0_reference_(nullptr) {}
-  virtual ~TemporalLayersReferenceTest() {}
-
- protected:
-  static const int kMaxPatternLength = 32;
-
-  struct BufferState {
-    BufferState() : BufferState(-1, 0, false) {}
-    BufferState(int temporal_idx, uint32_t timestamp, bool sync)
-        : temporal_idx(temporal_idx), timestamp(timestamp), sync(sync) {}
-    int temporal_idx;
-    uint32_t timestamp;
-    bool sync;
-  };
-
-  bool UpdateSyncRefState(const TemporalLayers::BufferFlags& flags,
-                          BufferState* buffer_state) {
-    if (flags & TemporalLayers::kReference) {
-      if (buffer_state->temporal_idx == -1)
-        return true;  // References key-frame.
-      if (buffer_state->temporal_idx == 0) {
-        // No more than one reference to TL0 frame.
-        EXPECT_EQ(nullptr, tl0_reference_);
-        tl0_reference_ = buffer_state;
-        return true;
-      }
-      return false;  // References higher layer.
-    }
-    return true;  // No reference, does not affect sync frame status.
-  }
-
-  void ValidateReference(const TemporalLayers::BufferFlags& flags,
-                         const BufferState& buffer_state,
-                         int temporal_layer) {
-    if (flags & TemporalLayers::kReference) {
-      if (temporal_layer > 0 && buffer_state.timestamp > 0) {
-        // Check that high layer reference does not go past last sync frame.
-        EXPECT_GE(buffer_state.timestamp, last_sync_timestamp_);
-      }
-      // No reference to buffer in higher layer.
-      EXPECT_LE(buffer_state.temporal_idx, temporal_layer);
-    }
-  }
-
-  uint32_t timestamp_ = 1;
-  uint32_t last_sync_timestamp_ = timestamp_;
-  BufferState* tl0_reference_;
-
-  BufferState last_state;
-  BufferState golden_state;
-  BufferState altref_state;
-};
-
-INSTANTIATE_TEST_CASE_P(DefaultTemporalLayersTest,
-                        TemporalLayersReferenceTest,
-                        ::testing::Range(1, kMaxTemporalStreams + 1));
-
-TEST_P(TemporalLayersReferenceTest, ValidFrameConfigs) {
-  const int num_layers = GetParam();
-  DefaultTemporalLayers tl(num_layers, 0);
-  vpx_codec_enc_cfg_t cfg;
-  tl.OnRatesUpdated(500, 500, 30);
-  tl.UpdateConfiguration(&cfg);
-
-  // Run through the pattern and store the frame dependencies, plus keep track
-  // of the buffer state; which buffers references which temporal layers (if
-  // (any). If a given buffer is never updated, it is legal to reference it
-  // even for sync frames. In order to be general, don't assume TL0 always
-  // updates |last|.
-  std::vector<TemporalLayers::FrameConfig> tl_configs(kMaxPatternLength);
-  for (int i = 0; i < kMaxPatternLength; ++i) {
-    TemporalLayers::FrameConfig tl_config = tl.UpdateLayerConfig(timestamp_++);
-    EXPECT_FALSE(tl_config.drop_frame);
-    tl_configs.push_back(tl_config);
-    int temporal_idx = tl_config.encoder_layer_id;
-    // For the default layers, always keep encoder and rtp layers in sync.
-    EXPECT_EQ(tl_config.packetizer_temporal_idx, temporal_idx);
-
-    // Determine if this frame is in a higher layer but references only TL0
-    // or untouched buffers, if so verify it is marked as a layer sync.
-    bool is_sync_frame = true;
-    tl0_reference_ = nullptr;
-    if (temporal_idx <= 0) {
-      is_sync_frame = false;  // TL0 by definition not a sync frame.
-    } else if (!UpdateSyncRefState(tl_config.last_buffer_flags, &last_state)) {
-      is_sync_frame = false;
-    } else if (!UpdateSyncRefState(tl_config.golden_buffer_flags,
-                                   &golden_state)) {
-      is_sync_frame = false;
-    } else if (!UpdateSyncRefState(tl_config.arf_buffer_flags, &altref_state)) {
-      is_sync_frame = false;
-    }
-    if (is_sync_frame) {
-      // Cache timestamp for last found sync frame, so that we can verify no
-      // references back past this frame.
-      ASSERT_TRUE(tl0_reference_);
-      last_sync_timestamp_ = tl0_reference_->timestamp;
-    }
-    EXPECT_EQ(tl_config.layer_sync, is_sync_frame);
-
-    // Validate no reference from lower to high temporal layer, or backwards
-    // past last reference frame.
-    ValidateReference(tl_config.last_buffer_flags, last_state, temporal_idx);
-    ValidateReference(tl_config.golden_buffer_flags, golden_state,
-                      temporal_idx);
-    ValidateReference(tl_config.arf_buffer_flags, altref_state, temporal_idx);
-
-    // Update the current layer state.
-    BufferState state = {temporal_idx, timestamp_, is_sync_frame};
-    if (tl_config.last_buffer_flags & TemporalLayers::kUpdate)
-      last_state = state;
-    if (tl_config.golden_buffer_flags & TemporalLayers::kUpdate)
-      golden_state = state;
-    if (tl_config.arf_buffer_flags & TemporalLayers::kUpdate)
-      altref_state = state;
-  }
-}
-}  // namespace test
-}  // namespace webrtc
diff --git a/modules/video_coding/codecs/vp8/include/vp8.h b/modules/video_coding/codecs/vp8/include/vp8.h
deleted file mode 100644
index dd35142..0000000
--- a/modules/video_coding/codecs/vp8/include/vp8.h
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- *  Copyright (c) 2012 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.
- *
- *  WEBRTC VP8 wrapper interface
- */
-
-#ifndef WEBRTC_MODULES_VIDEO_CODING_CODECS_VP8_INCLUDE_VP8_H_
-#define WEBRTC_MODULES_VIDEO_CODING_CODECS_VP8_INCLUDE_VP8_H_
-
-#include "webrtc/modules/video_coding/include/video_codec_interface.h"
-
-namespace webrtc {
-
-class VP8Encoder : public VideoEncoder {
- public:
-  static VP8Encoder* Create();
-
-  virtual ~VP8Encoder() {}
-};  // end of VP8Encoder class
-
-class VP8Decoder : public VideoDecoder {
- public:
-  static VP8Decoder* Create();
-
-  virtual ~VP8Decoder() {}
-};  // end of VP8Decoder class
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_VIDEO_CODING_CODECS_VP8_INCLUDE_VP8_H_
diff --git a/modules/video_coding/codecs/vp8/include/vp8_common_types.h b/modules/video_coding/codecs/vp8/include/vp8_common_types.h
deleted file mode 100644
index 67888f7..0000000
--- a/modules/video_coding/codecs/vp8/include/vp8_common_types.h
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- *  Copyright (c) 2011 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_VIDEO_CODING_CODECS_VP8_INCLUDE_VP8_COMMON_TYPES_H_
-#define WEBRTC_MODULES_VIDEO_CODING_CODECS_VP8_INCLUDE_VP8_COMMON_TYPES_H_
-
-#include "webrtc/common_types.h"
-
-namespace webrtc {
-
-// Ratio allocation between temporal streams:
-// Values as required for the VP8 codec (accumulating).
-static const float
-    kVp8LayerRateAlloction[kMaxSimulcastStreams][kMaxTemporalStreams] = {
-        {1.0f, 1.0f, 1.0f, 1.0f},  // 1 layer
-        {0.6f, 1.0f, 1.0f, 1.0f},  // 2 layers {60%, 40%}
-        {0.4f, 0.6f, 1.0f, 1.0f},  // 3 layers {40%, 20%, 40%}
-        {0.25f, 0.4f, 0.6f, 1.0f}  // 4 layers {25%, 15%, 20%, 40%}
-};
-
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_VIDEO_CODING_CODECS_VP8_INCLUDE_VP8_COMMON_TYPES_H_
diff --git a/modules/video_coding/codecs/vp8/include/vp8_globals.h b/modules/video_coding/codecs/vp8/include/vp8_globals.h
deleted file mode 100644
index 938e199..0000000
--- a/modules/video_coding/codecs/vp8/include/vp8_globals.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- *  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.
- */
-
-// This file contains codec dependent definitions that are needed in
-// order to compile the WebRTC codebase, even if this codec is not used.
-
-#ifndef WEBRTC_MODULES_VIDEO_CODING_CODECS_VP8_INCLUDE_VP8_GLOBALS_H_
-#define WEBRTC_MODULES_VIDEO_CODING_CODECS_VP8_INCLUDE_VP8_GLOBALS_H_
-
-#include "webrtc/modules/video_coding/codecs/interface/common_constants.h"
-
-namespace webrtc {
-
-struct RTPVideoHeaderVP8 {
-  void InitRTPVideoHeaderVP8() {
-    nonReference = false;
-    pictureId = kNoPictureId;
-    tl0PicIdx = kNoTl0PicIdx;
-    temporalIdx = kNoTemporalIdx;
-    layerSync = false;
-    keyIdx = kNoKeyIdx;
-    partitionId = 0;
-    beginningOfPartition = false;
-  }
-
-  bool nonReference;          // Frame is discardable.
-  int16_t pictureId;          // Picture ID index, 15 bits;
-                              // kNoPictureId if PictureID does not exist.
-  int16_t tl0PicIdx;          // TL0PIC_IDX, 8 bits;
-                              // kNoTl0PicIdx means no value provided.
-  uint8_t temporalIdx;        // Temporal layer index, or kNoTemporalIdx.
-  bool layerSync;             // This frame is a layer sync frame.
-                              // Disabled if temporalIdx == kNoTemporalIdx.
-  int keyIdx;                 // 5 bits; kNoKeyIdx means not used.
-  int partitionId;            // VP8 partition ID
-  bool beginningOfPartition;  // True if this packet is the first
-                              // in a VP8 partition. Otherwise false
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_VIDEO_CODING_CODECS_VP8_INCLUDE_VP8_GLOBALS_H_
diff --git a/modules/video_coding/codecs/vp8/screenshare_layers.cc b/modules/video_coding/codecs/vp8/screenshare_layers.cc
deleted file mode 100644
index d81447b..0000000
--- a/modules/video_coding/codecs/vp8/screenshare_layers.cc
+++ /dev/null
@@ -1,459 +0,0 @@
-/* Copyright (c) 2013 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/video_coding/codecs/vp8/screenshare_layers.h"
-
-#include <stdlib.h>
-
-#include <algorithm>
-
-#include "vpx/vp8cx.h"
-#include "vpx/vpx_encoder.h"
-#include "webrtc/modules/video_coding/include/video_codec_interface.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/system_wrappers/include/clock.h"
-#include "webrtc/system_wrappers/include/metrics.h"
-
-namespace webrtc {
-
-static const int kOneSecond90Khz = 90000;
-static const int kMinTimeBetweenSyncs = kOneSecond90Khz * 5;
-static const int kMaxTimeBetweenSyncs = kOneSecond90Khz * 10;
-static const int kQpDeltaThresholdForSync = 8;
-static const int kMinBitrateKbpsForQpBoost = 500;
-
-const double ScreenshareLayers::kMaxTL0FpsReduction = 2.5;
-const double ScreenshareLayers::kAcceptableTargetOvershoot = 2.0;
-
-constexpr int ScreenshareLayers::kMaxNumTemporalLayers;
-
-// Always emit a frame with certain interval, even if bitrate targets have
-// been exceeded. This prevents needless keyframe requests.
-const int ScreenshareLayers::kMaxFrameIntervalMs = 2750;
-
-webrtc::TemporalLayers* ScreenshareTemporalLayersFactory::Create(
-    int simulcast_id,
-    int num_temporal_layers,
-    uint8_t initial_tl0_pic_idx) const {
-  webrtc::TemporalLayers* tl;
-  if (simulcast_id == 0) {
-    tl = new webrtc::ScreenshareLayers(num_temporal_layers, rand(),
-                                       webrtc::Clock::GetRealTimeClock());
-  } else {
-    TemporalLayersFactory rt_tl_factory;
-    tl = rt_tl_factory.Create(simulcast_id, num_temporal_layers, rand());
-  }
-  if (listener_)
-    listener_->OnTemporalLayersCreated(simulcast_id, tl);
-  return tl;
-}
-
-ScreenshareLayers::ScreenshareLayers(int num_temporal_layers,
-                                     uint8_t initial_tl0_pic_idx,
-                                     Clock* clock)
-    : clock_(clock),
-      number_of_temporal_layers_(
-          std::min(kMaxNumTemporalLayers, num_temporal_layers)),
-      last_base_layer_sync_(false),
-      tl0_pic_idx_(initial_tl0_pic_idx),
-      active_layer_(-1),
-      last_timestamp_(-1),
-      last_sync_timestamp_(-1),
-      last_emitted_tl0_timestamp_(-1),
-      min_qp_(-1),
-      max_qp_(-1),
-      max_debt_bytes_(0),
-      encode_framerate_(1000.0f, 1000.0f),  // 1 second window, second scale.
-      bitrate_updated_(false) {
-  RTC_CHECK_GT(number_of_temporal_layers_, 0);
-  RTC_CHECK_LE(number_of_temporal_layers_, kMaxNumTemporalLayers);
-}
-
-ScreenshareLayers::~ScreenshareLayers() {
-  UpdateHistograms();
-}
-
-uint8_t ScreenshareLayers::Tl0PicIdx() const {
-  return tl0_pic_idx_;
-}
-
-TemporalLayers::FrameConfig ScreenshareLayers::UpdateLayerConfig(
-    uint32_t timestamp) {
-  if (number_of_temporal_layers_ <= 1) {
-    // No flags needed for 1 layer screenshare.
-    // TODO(pbos): Consider updating only last, and not all buffers.
-    TemporalLayers::FrameConfig tl_config(
-        kReferenceAndUpdate, kReferenceAndUpdate, kReferenceAndUpdate);
-    return tl_config;
-  }
-
-  const int64_t now_ms = clock_->TimeInMilliseconds();
-  if (target_framerate_.value_or(0) > 0 &&
-      encode_framerate_.Rate(now_ms).value_or(0) > *target_framerate_) {
-    // Max framerate exceeded, drop frame.
-    return TemporalLayers::FrameConfig(kNone, kNone, kNone);
-  }
-
-  if (stats_.first_frame_time_ms_ == -1)
-    stats_.first_frame_time_ms_ = now_ms;
-
-  int64_t unwrapped_timestamp = time_wrap_handler_.Unwrap(timestamp);
-  int64_t ts_diff;
-  if (last_timestamp_ == -1) {
-    ts_diff = kOneSecond90Khz / capture_framerate_.value_or(*target_framerate_);
-  } else {
-    ts_diff = unwrapped_timestamp - last_timestamp_;
-  }
-  // Make sure both frame droppers leak out bits.
-  layers_[0].UpdateDebt(ts_diff / 90);
-  layers_[1].UpdateDebt(ts_diff / 90);
-  last_timestamp_ = timestamp;
-
-  TemporalLayerState layer_state = TemporalLayerState::kDrop;
-
-  if (active_layer_ == -1 ||
-      layers_[active_layer_].state != TemporalLayer::State::kDropped) {
-    if (last_emitted_tl0_timestamp_ != -1 &&
-        (unwrapped_timestamp - last_emitted_tl0_timestamp_) / 90 >
-            kMaxFrameIntervalMs) {
-      // Too long time has passed since the last frame was emitted, cancel
-      // enough debt to allow a single frame.
-      layers_[0].debt_bytes_ = max_debt_bytes_ - 1;
-    }
-    if (layers_[0].debt_bytes_ > max_debt_bytes_) {
-      // Must drop TL0, encode TL1 instead.
-      if (layers_[1].debt_bytes_ > max_debt_bytes_) {
-        // Must drop both TL0 and TL1.
-        active_layer_ = -1;
-      } else {
-        active_layer_ = 1;
-      }
-    } else {
-      active_layer_ = 0;
-    }
-  }
-
-  switch (active_layer_) {
-    case 0:
-      layer_state = TemporalLayerState::kTl0;
-      last_emitted_tl0_timestamp_ = unwrapped_timestamp;
-      break;
-    case 1:
-      if (layers_[1].state != TemporalLayer::State::kDropped) {
-        if (TimeToSync(unwrapped_timestamp)) {
-          last_sync_timestamp_ = unwrapped_timestamp;
-          layer_state = TemporalLayerState::kTl1Sync;
-        } else {
-          layer_state = TemporalLayerState::kTl1;
-        }
-      } else {
-        layer_state = last_sync_timestamp_ == unwrapped_timestamp
-                          ? TemporalLayerState::kTl1Sync
-                          : TemporalLayerState::kTl1;
-      }
-      break;
-    case -1:
-      layer_state = TemporalLayerState::kDrop;
-      ++stats_.num_dropped_frames_;
-      break;
-    default:
-      RTC_NOTREACHED();
-  }
-
-  TemporalLayers::FrameConfig tl_config;
-  // TODO(pbos): Consider referencing but not updating the 'alt' buffer for all
-  // layers.
-  switch (layer_state) {
-    case TemporalLayerState::kDrop:
-      tl_config = TemporalLayers::FrameConfig(kNone, kNone, kNone);
-      break;
-    case TemporalLayerState::kTl0:
-      // TL0 only references and updates 'last'.
-      tl_config =
-          TemporalLayers::FrameConfig(kReferenceAndUpdate, kNone, kNone);
-      tl_config.packetizer_temporal_idx = 0;
-      break;
-    case TemporalLayerState::kTl1:
-      // TL1 references both 'last' and 'golden' but only updates 'golden'.
-      tl_config =
-          TemporalLayers::FrameConfig(kReference, kReferenceAndUpdate, kNone);
-      tl_config.packetizer_temporal_idx = 1;
-      break;
-    case TemporalLayerState::kTl1Sync:
-      // Predict from only TL0 to allow participants to switch to the high
-      // bitrate stream. Updates 'golden' so that TL1 can continue to refer to
-      // and update 'golden' from this point on.
-      tl_config = TemporalLayers::FrameConfig(kReference, kUpdate, kNone);
-      tl_config.packetizer_temporal_idx = 1;
-      break;
-  }
-
-  tl_config.layer_sync = layer_state == TemporalLayerState::kTl1Sync;
-  return tl_config;
-}
-
-std::vector<uint32_t> ScreenshareLayers::OnRatesUpdated(int bitrate_kbps,
-                                                        int max_bitrate_kbps,
-                                                        int framerate) {
-  RTC_DCHECK_GT(framerate, 0);
-  if (!target_framerate_) {
-    // First OnRatesUpdated() is called during construction, with the configured
-    // targets as parameters.
-    target_framerate_.emplace(framerate);
-    capture_framerate_ = target_framerate_;
-    bitrate_updated_ = true;
-  } else {
-    bitrate_updated_ =
-        bitrate_kbps != static_cast<int>(layers_[0].target_rate_kbps_) ||
-        max_bitrate_kbps != static_cast<int>(layers_[1].target_rate_kbps_) ||
-        (capture_framerate_ &&
-         framerate != static_cast<int>(*capture_framerate_));
-    if (framerate < 0) {
-      capture_framerate_.reset();
-    } else {
-      capture_framerate_.emplace(framerate);
-    }
-  }
-
-  layers_[0].target_rate_kbps_ = bitrate_kbps;
-  layers_[1].target_rate_kbps_ = max_bitrate_kbps;
-
-  std::vector<uint32_t> allocation;
-  allocation.push_back(bitrate_kbps);
-  if (max_bitrate_kbps > bitrate_kbps)
-    allocation.push_back(max_bitrate_kbps - bitrate_kbps);
-  return allocation;
-}
-
-void ScreenshareLayers::FrameEncoded(unsigned int size, int qp) {
-  if (size > 0)
-    encode_framerate_.Update(1, clock_->TimeInMilliseconds());
-
-  if (number_of_temporal_layers_ == 1)
-    return;
-
-  RTC_DCHECK_NE(-1, active_layer_);
-  if (size == 0) {
-    layers_[active_layer_].state = TemporalLayer::State::kDropped;
-    ++stats_.num_overshoots_;
-    return;
-  }
-
-  if (layers_[active_layer_].state == TemporalLayer::State::kDropped) {
-    layers_[active_layer_].state = TemporalLayer::State::kQualityBoost;
-  }
-
-  if (qp != -1)
-    layers_[active_layer_].last_qp = qp;
-
-  if (active_layer_ == 0) {
-    layers_[0].debt_bytes_ += size;
-    layers_[1].debt_bytes_ += size;
-    ++stats_.num_tl0_frames_;
-    stats_.tl0_target_bitrate_sum_ += layers_[0].target_rate_kbps_;
-    stats_.tl0_qp_sum_ += qp;
-  } else if (active_layer_ == 1) {
-    layers_[1].debt_bytes_ += size;
-    ++stats_.num_tl1_frames_;
-    stats_.tl1_target_bitrate_sum_ += layers_[1].target_rate_kbps_;
-    stats_.tl1_qp_sum_ += qp;
-  }
-}
-
-void ScreenshareLayers::PopulateCodecSpecific(
-    bool frame_is_keyframe,
-    const TemporalLayers::FrameConfig& tl_config,
-    CodecSpecificInfoVP8* vp8_info,
-    uint32_t timestamp) {
-  if (number_of_temporal_layers_ == 1) {
-    vp8_info->temporalIdx = kNoTemporalIdx;
-    vp8_info->layerSync = false;
-    vp8_info->tl0PicIdx = kNoTl0PicIdx;
-  } else {
-    int64_t unwrapped_timestamp = time_wrap_handler_.Unwrap(timestamp);
-    vp8_info->temporalIdx = tl_config.packetizer_temporal_idx;
-    vp8_info->layerSync = tl_config.layer_sync;
-    if (frame_is_keyframe) {
-      vp8_info->temporalIdx = 0;
-      last_sync_timestamp_ = unwrapped_timestamp;
-      vp8_info->layerSync = true;
-    } else if (last_base_layer_sync_ && vp8_info->temporalIdx != 0) {
-      // Regardless of pattern the frame after a base layer sync will always
-      // be a layer sync.
-      last_sync_timestamp_ = unwrapped_timestamp;
-      vp8_info->layerSync = true;
-    }
-    if (vp8_info->temporalIdx == 0) {
-      tl0_pic_idx_++;
-    }
-    last_base_layer_sync_ = frame_is_keyframe;
-    vp8_info->tl0PicIdx = tl0_pic_idx_;
-  }
-}
-
-bool ScreenshareLayers::TimeToSync(int64_t timestamp) const {
-  RTC_DCHECK_EQ(1, active_layer_);
-  RTC_DCHECK_NE(-1, layers_[0].last_qp);
-  if (layers_[1].last_qp == -1) {
-    // First frame in TL1 should only depend on TL0 since there are no
-    // previous frames in TL1.
-    return true;
-  }
-
-  RTC_DCHECK_NE(-1, last_sync_timestamp_);
-  int64_t timestamp_diff = timestamp - last_sync_timestamp_;
-  if (timestamp_diff > kMaxTimeBetweenSyncs) {
-    // After a certain time, force a sync frame.
-    return true;
-  } else if (timestamp_diff < kMinTimeBetweenSyncs) {
-    // If too soon from previous sync frame, don't issue a new one.
-    return false;
-  }
-  // Issue a sync frame if difference in quality between TL0 and TL1 isn't too
-  // large.
-  if (layers_[0].last_qp - layers_[1].last_qp < kQpDeltaThresholdForSync)
-    return true;
-  return false;
-}
-
-uint32_t ScreenshareLayers::GetCodecTargetBitrateKbps() const {
-  uint32_t target_bitrate_kbps = layers_[0].target_rate_kbps_;
-
-  if (number_of_temporal_layers_ > 1) {
-    // Calculate a codec target bitrate. This may be higher than TL0, gaining
-    // quality at the expense of frame rate at TL0. Constraints:
-    // - TL0 frame rate no less than framerate / kMaxTL0FpsReduction.
-    // - Target rate * kAcceptableTargetOvershoot should not exceed TL1 rate.
-    target_bitrate_kbps =
-        std::min(layers_[0].target_rate_kbps_ * kMaxTL0FpsReduction,
-                 layers_[1].target_rate_kbps_ / kAcceptableTargetOvershoot);
-  }
-
-  return std::max(layers_[0].target_rate_kbps_, target_bitrate_kbps);
-}
-
-bool ScreenshareLayers::UpdateConfiguration(vpx_codec_enc_cfg_t* cfg) {
-  bool cfg_updated = false;
-  uint32_t target_bitrate_kbps = GetCodecTargetBitrateKbps();
-  if (bitrate_updated_ || cfg->rc_target_bitrate != target_bitrate_kbps) {
-    cfg->rc_target_bitrate = target_bitrate_kbps;
-
-    // Don't reconfigure qp limits during quality boost frames.
-    if (active_layer_ == -1 ||
-        layers_[active_layer_].state != TemporalLayer::State::kQualityBoost) {
-      min_qp_ = cfg->rc_min_quantizer;
-      max_qp_ = cfg->rc_max_quantizer;
-      // After a dropped frame, a frame with max qp will be encoded and the
-      // quality will then ramp up from there. To boost the speed of recovery,
-      // encode the next frame with lower max qp, if there is sufficient
-      // bandwidth to do so without causing excessive delay.
-      // TL0 is the most important to improve since the errors in this layer
-      // will propagate to TL1.
-      // Currently, reduce max qp by 20% for TL0 and 15% for TL1.
-      if (layers_[1].target_rate_kbps_ >= kMinBitrateKbpsForQpBoost) {
-        layers_[0].enhanced_max_qp =
-            min_qp_ + (((max_qp_ - min_qp_) * 80) / 100);
-        layers_[1].enhanced_max_qp =
-            min_qp_ + (((max_qp_ - min_qp_) * 85) / 100);
-      } else {
-        layers_[0].enhanced_max_qp = -1;
-        layers_[1].enhanced_max_qp = -1;
-      }
-    }
-
-    if (capture_framerate_) {
-      int avg_frame_size =
-          (target_bitrate_kbps * 1000) / (8 * *capture_framerate_);
-      // Allow max debt to be the size of a single optimal frame.
-      // TODO(sprang): Determine if this needs to be adjusted by some factor.
-      // (Lower values may cause more frame drops, higher may lead to queuing
-      // delays.)
-      max_debt_bytes_ = avg_frame_size;
-    }
-
-    bitrate_updated_ = false;
-    cfg_updated = true;
-  }
-
-  // Don't try to update boosts state if not active yet.
-  if (active_layer_ == -1)
-    return cfg_updated;
-
-  if (max_qp_ == -1 || number_of_temporal_layers_ <= 1)
-    return cfg_updated;
-
-  // If layer is in the quality boost state (following a dropped frame), update
-  // the configuration with the adjusted (lower) qp and set the state back to
-  // normal.
-  unsigned int adjusted_max_qp;
-  if (layers_[active_layer_].state == TemporalLayer::State::kQualityBoost &&
-      layers_[active_layer_].enhanced_max_qp != -1) {
-    adjusted_max_qp = layers_[active_layer_].enhanced_max_qp;
-    layers_[active_layer_].state = TemporalLayer::State::kNormal;
-  } else {
-    adjusted_max_qp = max_qp_;  // Set the normal max qp.
-  }
-
-  if (adjusted_max_qp == cfg->rc_max_quantizer)
-    return cfg_updated;
-
-  cfg->rc_max_quantizer = adjusted_max_qp;
-  cfg_updated = true;
-
-  return cfg_updated;
-}
-
-void ScreenshareLayers::TemporalLayer::UpdateDebt(int64_t delta_ms) {
-  uint32_t debt_reduction_bytes = target_rate_kbps_ * delta_ms / 8;
-  if (debt_reduction_bytes >= debt_bytes_) {
-    debt_bytes_ = 0;
-  } else {
-    debt_bytes_ -= debt_reduction_bytes;
-  }
-}
-
-void ScreenshareLayers::UpdateHistograms() {
-  if (stats_.first_frame_time_ms_ == -1)
-    return;
-  int64_t duration_sec =
-      (clock_->TimeInMilliseconds() - stats_.first_frame_time_ms_ + 500) / 1000;
-  if (duration_sec >= metrics::kMinRunTimeInSeconds) {
-    RTC_HISTOGRAM_COUNTS_10000(
-        "WebRTC.Video.Screenshare.Layer0.FrameRate",
-        (stats_.num_tl0_frames_ + (duration_sec / 2)) / duration_sec);
-    RTC_HISTOGRAM_COUNTS_10000(
-        "WebRTC.Video.Screenshare.Layer1.FrameRate",
-        (stats_.num_tl1_frames_ + (duration_sec / 2)) / duration_sec);
-    int total_frames = stats_.num_tl0_frames_ + stats_.num_tl1_frames_;
-    RTC_HISTOGRAM_COUNTS_10000(
-        "WebRTC.Video.Screenshare.FramesPerDrop",
-        (stats_.num_dropped_frames_ == 0 ? 0 : total_frames /
-                                                   stats_.num_dropped_frames_));
-    RTC_HISTOGRAM_COUNTS_10000(
-        "WebRTC.Video.Screenshare.FramesPerOvershoot",
-        (stats_.num_overshoots_ == 0 ? 0
-                                     : total_frames / stats_.num_overshoots_));
-    if (stats_.num_tl0_frames_ > 0) {
-      RTC_HISTOGRAM_COUNTS_10000("WebRTC.Video.Screenshare.Layer0.Qp",
-                                 stats_.tl0_qp_sum_ / stats_.num_tl0_frames_);
-      RTC_HISTOGRAM_COUNTS_10000(
-          "WebRTC.Video.Screenshare.Layer0.TargetBitrate",
-          stats_.tl0_target_bitrate_sum_ / stats_.num_tl0_frames_);
-    }
-    if (stats_.num_tl1_frames_ > 0) {
-      RTC_HISTOGRAM_COUNTS_10000("WebRTC.Video.Screenshare.Layer1.Qp",
-                                 stats_.tl1_qp_sum_ / stats_.num_tl1_frames_);
-      RTC_HISTOGRAM_COUNTS_10000(
-          "WebRTC.Video.Screenshare.Layer1.TargetBitrate",
-          stats_.tl1_target_bitrate_sum_ / stats_.num_tl1_frames_);
-    }
-  }
-}
-
-}  // namespace webrtc
diff --git a/modules/video_coding/codecs/vp8/screenshare_layers.h b/modules/video_coding/codecs/vp8/screenshare_layers.h
deleted file mode 100644
index dcf6eab..0000000
--- a/modules/video_coding/codecs/vp8/screenshare_layers.h
+++ /dev/null
@@ -1,127 +0,0 @@
-/* Copyright (c) 2013 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_VIDEO_CODING_CODECS_VP8_SCREENSHARE_LAYERS_H_
-#define WEBRTC_MODULES_VIDEO_CODING_CODECS_VP8_SCREENSHARE_LAYERS_H_
-
-#include <vector>
-
-#include "webrtc/modules/video_coding/codecs/vp8/temporal_layers.h"
-#include "webrtc/modules/video_coding/utility/frame_dropper.h"
-#include "webrtc/rtc_base/rate_statistics.h"
-#include "webrtc/rtc_base/timeutils.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-struct CodecSpecificInfoVP8;
-class Clock;
-
-class ScreenshareLayers : public TemporalLayers {
- public:
-  static const double kMaxTL0FpsReduction;
-  static const double kAcceptableTargetOvershoot;
-  static const int kMaxFrameIntervalMs;
-
-  ScreenshareLayers(int num_temporal_layers,
-                    uint8_t initial_tl0_pic_idx,
-                    Clock* clock);
-  virtual ~ScreenshareLayers();
-
-  // Returns the recommended VP8 encode flags needed. May refresh the decoder
-  // and/or update the reference buffers.
-  TemporalLayers::FrameConfig UpdateLayerConfig(uint32_t timestamp) override;
-
-  // Update state based on new bitrate target and incoming framerate.
-  // Returns the bitrate allocation for the active temporal layers.
-  std::vector<uint32_t> OnRatesUpdated(int bitrate_kbps,
-                                       int max_bitrate_kbps,
-                                       int framerate) override;
-
-  // Update the encoder configuration with target bitrates or other parameters.
-  // Returns true iff the configuration was actually modified.
-  bool UpdateConfiguration(vpx_codec_enc_cfg_t* cfg) override;
-
-  void PopulateCodecSpecific(bool base_layer_sync,
-                             const TemporalLayers::FrameConfig& tl_config,
-                             CodecSpecificInfoVP8* vp8_info,
-                             uint32_t timestamp) override;
-
-  void FrameEncoded(unsigned int size, int qp) override;
-
-  uint8_t Tl0PicIdx() const override;
-
- private:
-  enum class TemporalLayerState : int { kDrop, kTl0, kTl1, kTl1Sync };
-
-  bool TimeToSync(int64_t timestamp) const;
-  uint32_t GetCodecTargetBitrateKbps() const;
-
-  Clock* const clock_;
-
-  int number_of_temporal_layers_;
-  bool last_base_layer_sync_;
-  uint8_t tl0_pic_idx_;
-  int active_layer_;
-  int64_t last_timestamp_;
-  int64_t last_sync_timestamp_;
-  int64_t last_emitted_tl0_timestamp_;
-  rtc::TimestampWrapAroundHandler time_wrap_handler_;
-  int min_qp_;
-  int max_qp_;
-  uint32_t max_debt_bytes_;
-
-  // Configured max framerate.
-  rtc::Optional<uint32_t> target_framerate_;
-  // Incoming framerate from capturer.
-  rtc::Optional<uint32_t> capture_framerate_;
-  // Tracks what framerate we actually encode, and drops frames on overshoot.
-  RateStatistics encode_framerate_;
-  bool bitrate_updated_;
-
-  static constexpr int kMaxNumTemporalLayers = 2;
-  struct TemporalLayer {
-    TemporalLayer()
-        : state(State::kNormal),
-          enhanced_max_qp(-1),
-          last_qp(-1),
-          debt_bytes_(0),
-          target_rate_kbps_(0) {}
-
-    enum class State {
-      kNormal,
-      kDropped,
-      kReencoded,
-      kQualityBoost,
-    } state;
-
-    int enhanced_max_qp;
-    int last_qp;
-    uint32_t debt_bytes_;
-    uint32_t target_rate_kbps_;
-
-    void UpdateDebt(int64_t delta_ms);
-  } layers_[kMaxNumTemporalLayers];
-
-  void UpdateHistograms();
-  // Data for histogram statistics.
-  struct Stats {
-    int64_t first_frame_time_ms_ = -1;
-    int64_t num_tl0_frames_ = 0;
-    int64_t num_tl1_frames_ = 0;
-    int64_t num_dropped_frames_ = 0;
-    int64_t num_overshoots_ = 0;
-    int64_t tl0_qp_sum_ = 0;
-    int64_t tl1_qp_sum_ = 0;
-    int64_t tl0_target_bitrate_sum_ = 0;
-    int64_t tl1_target_bitrate_sum_ = 0;
-  } stats_;
-};
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_VIDEO_CODING_CODECS_VP8_SCREENSHARE_LAYERS_H_
diff --git a/modules/video_coding/codecs/vp8/screenshare_layers_unittest.cc b/modules/video_coding/codecs/vp8/screenshare_layers_unittest.cc
deleted file mode 100644
index 8335bb9..0000000
--- a/modules/video_coding/codecs/vp8/screenshare_layers_unittest.cc
+++ /dev/null
@@ -1,607 +0,0 @@
-/*
- *  Copyright (c) 2013 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 <memory>
-#include <vector>
-
-#include "vpx/vp8cx.h"
-#include "vpx/vpx_encoder.h"
-#include "webrtc/modules/video_coding/codecs/vp8/screenshare_layers.h"
-#include "webrtc/modules/video_coding/codecs/vp8/vp8_impl.h"
-#include "webrtc/modules/video_coding/include/video_codec_interface.h"
-#include "webrtc/modules/video_coding/utility/mock/mock_frame_dropper.h"
-#include "webrtc/system_wrappers/include/clock.h"
-#include "webrtc/system_wrappers/include/metrics.h"
-#include "webrtc/system_wrappers/include/metrics_default.h"
-#include "webrtc/test/gtest.h"
-
-using ::testing::_;
-using ::testing::ElementsAre;
-using ::testing::NiceMock;
-using ::testing::Return;
-
-namespace webrtc {
-
-// 5 frames per second at 90 kHz.
-const uint32_t kTimestampDelta5Fps = 90000 / 5;
-const int kDefaultQp = 54;
-const int kDefaultTl0BitrateKbps = 200;
-const int kDefaultTl1BitrateKbps = 2000;
-const int kFrameRate = 5;
-const int kSyncPeriodSeconds = 5;
-const int kMaxSyncPeriodSeconds = 10;
-
-// Expected flags for corresponding temporal layers.
-const int kTl0Flags = VP8_EFLAG_NO_UPD_GF | VP8_EFLAG_NO_UPD_ARF |
-                      VP8_EFLAG_NO_REF_GF | VP8_EFLAG_NO_REF_ARF;
-const int kTl1Flags =
-    VP8_EFLAG_NO_REF_ARF | VP8_EFLAG_NO_UPD_ARF | VP8_EFLAG_NO_UPD_LAST;
-const int kTl1SyncFlags = VP8_EFLAG_NO_REF_ARF | VP8_EFLAG_NO_REF_GF |
-                          VP8_EFLAG_NO_UPD_ARF | VP8_EFLAG_NO_UPD_LAST;
-
-class ScreenshareLayerTest : public ::testing::Test {
- protected:
-  ScreenshareLayerTest()
-      : min_qp_(2),
-        max_qp_(kDefaultQp),
-        frame_size_(-1),
-        clock_(1),
-        timestamp_(90),
-        config_updated_(false) {}
-  virtual ~ScreenshareLayerTest() {}
-
-  void SetUp() override {
-    layers_.reset(new ScreenshareLayers(2, 0, &clock_));
-    cfg_ = ConfigureBitrates();
-  }
-
-  int EncodeFrame(bool base_sync) {
-    int flags = ConfigureFrame(base_sync);
-    if (flags != -1)
-      layers_->FrameEncoded(frame_size_, kDefaultQp);
-    return flags;
-  }
-
-  int ConfigureFrame(bool key_frame) {
-    tl_config_ = layers_->UpdateLayerConfig(timestamp_);
-    EXPECT_EQ(0, tl_config_.encoder_layer_id)
-        << "ScreenshareLayers always encodes using the bitrate allocator for "
-           "layer 0, but may reference different buffers and packetize "
-           "differently.";
-    if (tl_config_.drop_frame) {
-      return -1;
-    }
-    config_updated_ = layers_->UpdateConfiguration(&cfg_);
-    int flags = VP8EncoderImpl::EncodeFlags(tl_config_);
-    layers_->PopulateCodecSpecific(key_frame, tl_config_, &vp8_info_,
-                                   timestamp_);
-    EXPECT_NE(-1, frame_size_);
-    return flags;
-  }
-
-  int FrameSizeForBitrate(int bitrate_kbps) {
-    return ((bitrate_kbps * 1000) / 8) / kFrameRate;
-  }
-
-  vpx_codec_enc_cfg_t ConfigureBitrates() {
-    vpx_codec_enc_cfg_t vpx_cfg;
-    memset(&vpx_cfg, 0, sizeof(vpx_codec_enc_cfg_t));
-    vpx_cfg.rc_min_quantizer = min_qp_;
-    vpx_cfg.rc_max_quantizer = max_qp_;
-    EXPECT_THAT(layers_->OnRatesUpdated(kDefaultTl0BitrateKbps,
-                                        kDefaultTl1BitrateKbps, kFrameRate),
-                ElementsAre(kDefaultTl0BitrateKbps,
-                            kDefaultTl1BitrateKbps - kDefaultTl0BitrateKbps));
-    EXPECT_TRUE(layers_->UpdateConfiguration(&vpx_cfg));
-    frame_size_ = FrameSizeForBitrate(vpx_cfg.rc_target_bitrate);
-    return vpx_cfg;
-  }
-
-  void WithQpLimits(int min_qp, int max_qp) {
-    min_qp_ = min_qp;
-    max_qp_ = max_qp;
-  }
-
-  // Runs a few initial frames and makes sure we have seen frames on both
-  // temporal layers.
-  bool RunGracePeriod() {
-    bool got_tl0 = false;
-    bool got_tl1 = false;
-    for (int i = 0; i < 10; ++i) {
-      EXPECT_NE(-1, EncodeFrame(false));
-      timestamp_ += kTimestampDelta5Fps;
-      if (vp8_info_.temporalIdx == 0) {
-        got_tl0 = true;
-      } else {
-        got_tl1 = true;
-      }
-      if (got_tl0 && got_tl1)
-        return true;
-    }
-    return false;
-  }
-
-  // Adds frames until we get one in the specified temporal layer. The last
-  // FrameEncoded() call will be omitted and needs to be done by the caller.
-  // Returns the flags for the last frame.
-  int SkipUntilTl(int layer) {
-    return SkipUntilTlAndSync(layer, rtc::Optional<bool>());
-  }
-
-  // Same as SkipUntilTl, but also waits until the sync bit condition is met.
-  int SkipUntilTlAndSync(int layer, rtc::Optional<bool> sync) {
-    int flags = 0;
-    const int kMaxFramesToSkip =
-        1 + (sync.value_or(false) ? kMaxSyncPeriodSeconds : 1) * kFrameRate;
-    for (int i = 0; i < kMaxFramesToSkip; ++i) {
-      flags = ConfigureFrame(false);
-      timestamp_ += kTimestampDelta5Fps;
-      if (vp8_info_.temporalIdx != layer ||
-          (sync && *sync != vp8_info_.layerSync)) {
-        layers_->FrameEncoded(frame_size_, kDefaultQp);
-      } else {
-        // Found frame from sought after layer.
-        return flags;
-      }
-    }
-    ADD_FAILURE() << "Did not get a frame of TL" << layer << " in time.";
-    return -1;
-  }
-
-  int min_qp_;
-  int max_qp_;
-  int frame_size_;
-  SimulatedClock clock_;
-  std::unique_ptr<ScreenshareLayers> layers_;
-
-  uint32_t timestamp_;
-  TemporalLayers::FrameConfig tl_config_;
-  vpx_codec_enc_cfg_t cfg_;
-  bool config_updated_;
-  CodecSpecificInfoVP8 vp8_info_;
-};
-
-TEST_F(ScreenshareLayerTest, 1Layer) {
-  layers_.reset(new ScreenshareLayers(1, 0, &clock_));
-  ConfigureBitrates();
-  // One layer screenshare should not use the frame dropper as all frames will
-  // belong to the base layer.
-  const int kSingleLayerFlags = 0;
-  int flags = EncodeFrame(false);
-  timestamp_ += kTimestampDelta5Fps;
-  EXPECT_EQ(static_cast<uint8_t>(kNoTemporalIdx), vp8_info_.temporalIdx);
-  EXPECT_FALSE(vp8_info_.layerSync);
-  EXPECT_EQ(kNoTl0PicIdx, vp8_info_.tl0PicIdx);
-
-  flags = EncodeFrame(false);
-  EXPECT_EQ(kSingleLayerFlags, flags);
-  EXPECT_EQ(static_cast<uint8_t>(kNoTemporalIdx), vp8_info_.temporalIdx);
-  EXPECT_FALSE(vp8_info_.layerSync);
-  EXPECT_EQ(kNoTl0PicIdx, vp8_info_.tl0PicIdx);
-}
-
-TEST_F(ScreenshareLayerTest, 2LayersPeriodicSync) {
-  std::vector<int> sync_times;
-  const int kNumFrames = kSyncPeriodSeconds * kFrameRate * 2 - 1;
-  for (int i = 0; i < kNumFrames; ++i) {
-    EncodeFrame(false);
-    timestamp_ += kTimestampDelta5Fps;
-    if (vp8_info_.temporalIdx == 1 && vp8_info_.layerSync) {
-      sync_times.push_back(timestamp_);
-    }
-  }
-
-  ASSERT_EQ(2u, sync_times.size());
-  EXPECT_GE(sync_times[1] - sync_times[0], 90000 * kSyncPeriodSeconds);
-}
-
-TEST_F(ScreenshareLayerTest, 2LayersSyncAfterTimeout) {
-  std::vector<int> sync_times;
-  const int kNumFrames = kMaxSyncPeriodSeconds * kFrameRate * 2 - 1;
-  for (int i = 0; i < kNumFrames; ++i) {
-    tl_config_ = layers_->UpdateLayerConfig(timestamp_);
-    config_updated_ = layers_->UpdateConfiguration(&cfg_);
-    layers_->PopulateCodecSpecific(false, tl_config_, &vp8_info_, timestamp_);
-
-    // Simulate TL1 being at least 8 qp steps better.
-    if (vp8_info_.temporalIdx == 0) {
-      layers_->FrameEncoded(frame_size_, kDefaultQp);
-    } else {
-      layers_->FrameEncoded(frame_size_, kDefaultQp - 8);
-    }
-
-    if (vp8_info_.temporalIdx == 1 && vp8_info_.layerSync)
-      sync_times.push_back(timestamp_);
-
-    timestamp_ += kTimestampDelta5Fps;
-  }
-
-  ASSERT_EQ(2u, sync_times.size());
-  EXPECT_GE(sync_times[1] - sync_times[0], 90000 * kMaxSyncPeriodSeconds);
-}
-
-TEST_F(ScreenshareLayerTest, 2LayersSyncAfterSimilarQP) {
-  std::vector<int> sync_times;
-
-  const int kNumFrames = (kSyncPeriodSeconds +
-                          ((kMaxSyncPeriodSeconds - kSyncPeriodSeconds) / 2)) *
-                         kFrameRate;
-  for (int i = 0; i < kNumFrames; ++i) {
-    ConfigureFrame(false);
-
-    // Simulate TL1 being at least 8 qp steps better.
-    if (vp8_info_.temporalIdx == 0) {
-      layers_->FrameEncoded(frame_size_, kDefaultQp);
-    } else {
-      layers_->FrameEncoded(frame_size_, kDefaultQp - 8);
-    }
-
-    if (vp8_info_.temporalIdx == 1 && vp8_info_.layerSync)
-      sync_times.push_back(timestamp_);
-
-    timestamp_ += kTimestampDelta5Fps;
-  }
-
-  ASSERT_EQ(1u, sync_times.size());
-
-  bool bumped_tl0_quality = false;
-  for (int i = 0; i < 3; ++i) {
-    int flags = ConfigureFrame(false);
-    if (vp8_info_.temporalIdx == 0) {
-      // Bump TL0 to same quality as TL1.
-      layers_->FrameEncoded(frame_size_, kDefaultQp - 8);
-      bumped_tl0_quality = true;
-    } else {
-      layers_->FrameEncoded(frame_size_, kDefaultQp - 8);
-      if (bumped_tl0_quality) {
-        EXPECT_TRUE(vp8_info_.layerSync);
-        EXPECT_EQ(kTl1SyncFlags, flags);
-        return;
-      }
-    }
-    timestamp_ += kTimestampDelta5Fps;
-  }
-  ADD_FAILURE() << "No TL1 frame arrived within time limit.";
-}
-
-TEST_F(ScreenshareLayerTest, 2LayersToggling) {
-  EXPECT_TRUE(RunGracePeriod());
-
-  // Insert 50 frames. 2/5 should be TL0.
-  int tl0_frames = 0;
-  int tl1_frames = 0;
-  for (int i = 0; i < 50; ++i) {
-    EncodeFrame(false);
-    timestamp_ += kTimestampDelta5Fps;
-    switch (vp8_info_.temporalIdx) {
-      case 0:
-        ++tl0_frames;
-        break;
-      case 1:
-        ++tl1_frames;
-        break;
-      default:
-        abort();
-    }
-  }
-  EXPECT_EQ(20, tl0_frames);
-  EXPECT_EQ(30, tl1_frames);
-}
-
-TEST_F(ScreenshareLayerTest, AllFitsLayer0) {
-  frame_size_ = FrameSizeForBitrate(kDefaultTl0BitrateKbps);
-
-  // Insert 50 frames, small enough that all fits in TL0.
-  for (int i = 0; i < 50; ++i) {
-    int flags = EncodeFrame(false);
-    timestamp_ += kTimestampDelta5Fps;
-    EXPECT_EQ(kTl0Flags, flags);
-    EXPECT_EQ(0, vp8_info_.temporalIdx);
-  }
-}
-
-TEST_F(ScreenshareLayerTest, TooHighBitrate) {
-  frame_size_ = 2 * FrameSizeForBitrate(kDefaultTl1BitrateKbps);
-
-  // Insert 100 frames. Half should be dropped.
-  int tl0_frames = 0;
-  int tl1_frames = 0;
-  int dropped_frames = 0;
-  for (int i = 0; i < 100; ++i) {
-    int flags = EncodeFrame(false);
-    timestamp_ += kTimestampDelta5Fps;
-    if (flags == -1) {
-      ++dropped_frames;
-    } else {
-      switch (vp8_info_.temporalIdx) {
-        case 0:
-          ++tl0_frames;
-          break;
-        case 1:
-          ++tl1_frames;
-          break;
-        default:
-          ADD_FAILURE() << "Unexpected temporal id";
-      }
-    }
-  }
-
-  EXPECT_NEAR(50, tl0_frames + tl1_frames, 1);
-  EXPECT_NEAR(50, dropped_frames, 1);
-}
-
-TEST_F(ScreenshareLayerTest, TargetBitrateCappedByTL0) {
-  const int kTl0_kbps = 100;
-  const int kTl1_kbps = 1000;
-  layers_->OnRatesUpdated(kTl0_kbps, kTl1_kbps, 5);
-
-  EXPECT_THAT(layers_->OnRatesUpdated(kTl0_kbps, kTl1_kbps, 5),
-              ElementsAre(kTl0_kbps, kTl1_kbps - kTl0_kbps));
-  EXPECT_TRUE(layers_->UpdateConfiguration(&cfg_));
-
-  EXPECT_EQ(static_cast<unsigned int>(
-                ScreenshareLayers::kMaxTL0FpsReduction * kTl0_kbps + 0.5),
-            cfg_.rc_target_bitrate);
-}
-
-TEST_F(ScreenshareLayerTest, TargetBitrateCappedByTL1) {
-  const int kTl0_kbps = 100;
-  const int kTl1_kbps = 450;
-  EXPECT_THAT(layers_->OnRatesUpdated(kTl0_kbps, kTl1_kbps, 5),
-              ElementsAre(kTl0_kbps, kTl1_kbps - kTl0_kbps));
-  EXPECT_TRUE(layers_->UpdateConfiguration(&cfg_));
-
-  EXPECT_EQ(static_cast<unsigned int>(
-                kTl1_kbps / ScreenshareLayers::kAcceptableTargetOvershoot),
-            cfg_.rc_target_bitrate);
-}
-
-TEST_F(ScreenshareLayerTest, TargetBitrateBelowTL0) {
-  const int kTl0_kbps = 100;
-  const int kTl1_kbps = 100;
-  EXPECT_THAT(layers_->OnRatesUpdated(kTl0_kbps, kTl1_kbps, 5),
-              ElementsAre(kTl0_kbps));
-  EXPECT_TRUE(layers_->UpdateConfiguration(&cfg_));
-
-  EXPECT_EQ(static_cast<uint32_t>(kTl1_kbps), cfg_.rc_target_bitrate);
-}
-
-TEST_F(ScreenshareLayerTest, EncoderDrop) {
-  EXPECT_TRUE(RunGracePeriod());
-  SkipUntilTl(0);
-
-  // Size 0 indicates dropped frame.
-  layers_->FrameEncoded(0, kDefaultQp);
-
-  // Re-encode frame (so don't advance timestamp).
-  int flags = EncodeFrame(false);
-  timestamp_ += kTimestampDelta5Fps;
-  EXPECT_FALSE(config_updated_);
-  EXPECT_EQ(kTl0Flags, flags);
-
-  // Next frame should have boosted quality...
-  SkipUntilTl(0);
-  EXPECT_TRUE(config_updated_);
-  EXPECT_LT(cfg_.rc_max_quantizer, static_cast<unsigned int>(kDefaultQp));
-  layers_->FrameEncoded(frame_size_, kDefaultQp);
-  timestamp_ += kTimestampDelta5Fps;
-
-  // ...then back to standard setup.
-  SkipUntilTl(0);
-  layers_->FrameEncoded(frame_size_, kDefaultQp);
-  timestamp_ += kTimestampDelta5Fps;
-  EXPECT_EQ(cfg_.rc_max_quantizer, static_cast<unsigned int>(kDefaultQp));
-
-  // Next drop in TL1.
-  SkipUntilTl(1);
-  layers_->FrameEncoded(0, kDefaultQp);
-
-  // Re-encode frame (so don't advance timestamp).
-  flags = EncodeFrame(false);
-  timestamp_ += kTimestampDelta5Fps;
-  EXPECT_FALSE(config_updated_);
-  EXPECT_EQ(kTl1Flags, flags);
-
-  // Next frame should have boosted QP.
-  SkipUntilTl(1);
-  EXPECT_TRUE(config_updated_);
-  EXPECT_LT(cfg_.rc_max_quantizer, static_cast<unsigned int>(kDefaultQp));
-  layers_->FrameEncoded(frame_size_, kDefaultQp);
-  timestamp_ += kTimestampDelta5Fps;
-
-  // ...and back to normal.
-  SkipUntilTl(1);
-  EXPECT_EQ(cfg_.rc_max_quantizer, static_cast<unsigned int>(kDefaultQp));
-  layers_->FrameEncoded(frame_size_, kDefaultQp);
-  timestamp_ += kTimestampDelta5Fps;
-}
-
-TEST_F(ScreenshareLayerTest, RespectsMaxIntervalBetweenFrames) {
-  const int kLowBitrateKbps = 50;
-  const int kLargeFrameSizeBytes = 100000;
-  const uint32_t kStartTimestamp = 1234;
-
-  layers_->OnRatesUpdated(kLowBitrateKbps, kLowBitrateKbps, 5);
-  layers_->UpdateConfiguration(&cfg_);
-
-  EXPECT_EQ(kTl0Flags, VP8EncoderImpl::EncodeFlags(
-                           layers_->UpdateLayerConfig(kStartTimestamp)));
-  layers_->FrameEncoded(kLargeFrameSizeBytes, kDefaultQp);
-
-  const uint32_t kTwoSecondsLater =
-      kStartTimestamp + (ScreenshareLayers::kMaxFrameIntervalMs * 90);
-
-  // Sanity check, repayment time should exceed kMaxFrameIntervalMs.
-  ASSERT_GT(kStartTimestamp + 90 * (kLargeFrameSizeBytes * 8) / kLowBitrateKbps,
-            kStartTimestamp + (ScreenshareLayers::kMaxFrameIntervalMs * 90));
-
-  EXPECT_TRUE(layers_->UpdateLayerConfig(kTwoSecondsLater).drop_frame);
-  // More than two seconds has passed since last frame, one should be emitted
-  // even if bitrate target is then exceeded.
-  EXPECT_EQ(kTl0Flags, VP8EncoderImpl::EncodeFlags(
-                           layers_->UpdateLayerConfig(kTwoSecondsLater + 90)));
-}
-
-TEST_F(ScreenshareLayerTest, UpdatesHistograms) {
-  metrics::Reset();
-  bool trigger_drop = false;
-  bool dropped_frame = false;
-  bool overshoot = false;
-  const int kTl0Qp = 35;
-  const int kTl1Qp = 30;
-  for (int64_t timestamp = 0;
-       timestamp < kTimestampDelta5Fps * 5 * metrics::kMinRunTimeInSeconds;
-       timestamp += kTimestampDelta5Fps) {
-    tl_config_ = layers_->UpdateLayerConfig(timestamp);
-    if (tl_config_.drop_frame) {
-      dropped_frame = true;
-      continue;
-    }
-    int flags = VP8EncoderImpl::EncodeFlags(tl_config_);
-    if (flags != -1)
-      layers_->UpdateConfiguration(&cfg_);
-
-    if (timestamp >= kTimestampDelta5Fps * 5 && !overshoot && flags != -1) {
-      // Simulate one overshoot.
-      layers_->FrameEncoded(0, 0);
-      overshoot = true;
-      flags =
-          VP8EncoderImpl::EncodeFlags(layers_->UpdateLayerConfig(timestamp));
-    }
-
-    if (flags == kTl0Flags) {
-      if (timestamp >= kTimestampDelta5Fps * 20 && !trigger_drop) {
-        // Simulate a too large frame, to cause frame drop.
-        layers_->FrameEncoded(frame_size_ * 10, kTl0Qp);
-        trigger_drop = true;
-      } else {
-        layers_->FrameEncoded(frame_size_, kTl0Qp);
-      }
-    } else if (flags == kTl1Flags || flags == kTl1SyncFlags) {
-      layers_->FrameEncoded(frame_size_, kTl1Qp);
-    } else if (flags == -1) {
-      dropped_frame = true;
-    } else {
-      RTC_NOTREACHED() << "Unexpected flags";
-    }
-    clock_.AdvanceTimeMilliseconds(1000 / 5);
-  }
-
-  EXPECT_TRUE(overshoot);
-  EXPECT_TRUE(dropped_frame);
-
-  layers_.reset();  // Histograms are reported on destruction.
-
-  EXPECT_EQ(1,
-            metrics::NumSamples("WebRTC.Video.Screenshare.Layer0.FrameRate"));
-  EXPECT_EQ(1,
-            metrics::NumSamples("WebRTC.Video.Screenshare.Layer1.FrameRate"));
-  EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.Screenshare.FramesPerDrop"));
-  EXPECT_EQ(1,
-            metrics::NumSamples("WebRTC.Video.Screenshare.FramesPerOvershoot"));
-  EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.Screenshare.Layer0.Qp"));
-  EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.Screenshare.Layer1.Qp"));
-  EXPECT_EQ(
-      1, metrics::NumSamples("WebRTC.Video.Screenshare.Layer0.TargetBitrate"));
-  EXPECT_EQ(
-      1, metrics::NumSamples("WebRTC.Video.Screenshare.Layer1.TargetBitrate"));
-
-  EXPECT_GT(metrics::MinSample("WebRTC.Video.Screenshare.Layer0.FrameRate"), 1);
-  EXPECT_GT(metrics::MinSample("WebRTC.Video.Screenshare.Layer1.FrameRate"), 1);
-  EXPECT_GT(metrics::MinSample("WebRTC.Video.Screenshare.FramesPerDrop"), 1);
-  EXPECT_GT(metrics::MinSample("WebRTC.Video.Screenshare.FramesPerOvershoot"),
-            1);
-  EXPECT_EQ(1,
-            metrics::NumEvents("WebRTC.Video.Screenshare.Layer0.Qp", kTl0Qp));
-  EXPECT_EQ(1,
-            metrics::NumEvents("WebRTC.Video.Screenshare.Layer1.Qp", kTl1Qp));
-  EXPECT_EQ(1,
-            metrics::NumEvents("WebRTC.Video.Screenshare.Layer0.TargetBitrate",
-                               kDefaultTl0BitrateKbps));
-  EXPECT_EQ(1,
-            metrics::NumEvents("WebRTC.Video.Screenshare.Layer1.TargetBitrate",
-                               kDefaultTl1BitrateKbps));
-}
-
-TEST_F(ScreenshareLayerTest, AllowsUpdateConfigBeforeSetRates) {
-  layers_.reset(new ScreenshareLayers(2, 0, &clock_));
-  // New layer instance, OnRatesUpdated() never called.
-  // UpdateConfiguration() call should not cause crash.
-  layers_->UpdateConfiguration(&cfg_);
-}
-
-TEST_F(ScreenshareLayerTest, RespectsConfiguredFramerate) {
-  int64_t kTestSpanMs = 2000;
-  int64_t kFrameIntervalsMs = 1000 / kFrameRate;
-
-  uint32_t timestamp = 1234;
-  int num_input_frames = 0;
-  int num_discarded_frames = 0;
-
-  // Send at regular rate - no drops expected.
-  for (int64_t i = 0; i < kTestSpanMs; i += kFrameIntervalsMs) {
-    if (layers_->UpdateLayerConfig(timestamp).drop_frame) {
-      ++num_discarded_frames;
-    } else {
-      size_t frame_size_bytes = kDefaultTl0BitrateKbps * kFrameIntervalsMs / 8;
-      layers_->FrameEncoded(frame_size_bytes, kDefaultQp);
-    }
-    timestamp += kFrameIntervalsMs * 90;
-    clock_.AdvanceTimeMilliseconds(kFrameIntervalsMs);
-    ++num_input_frames;
-  }
-  EXPECT_EQ(0, num_discarded_frames);
-
-  // Send at twice the configured rate - drop every other frame.
-  num_input_frames = 0;
-  num_discarded_frames = 0;
-  for (int64_t i = 0; i < kTestSpanMs; i += kFrameIntervalsMs / 2) {
-    if (layers_->UpdateLayerConfig(timestamp).drop_frame) {
-      ++num_discarded_frames;
-    } else {
-      size_t frame_size_bytes = kDefaultTl0BitrateKbps * kFrameIntervalsMs / 8;
-      layers_->FrameEncoded(frame_size_bytes, kDefaultQp);
-    }
-    timestamp += kFrameIntervalsMs * 90 / 2;
-    clock_.AdvanceTimeMilliseconds(kFrameIntervalsMs / 2);
-    ++num_input_frames;
-  }
-
-  // Allow for some rounding errors in the measurements.
-  EXPECT_NEAR(num_discarded_frames, num_input_frames / 2, 2);
-}
-
-TEST_F(ScreenshareLayerTest, 2LayersSyncAtOvershootDrop) {
-  // Run grace period so we have existing frames in both TL0 and Tl1.
-  EXPECT_TRUE(RunGracePeriod());
-
-  // Move ahead until we have a sync frame in TL1.
-  EXPECT_EQ(kTl1SyncFlags, SkipUntilTlAndSync(1, rtc::Optional<bool>(true)));
-  ASSERT_TRUE(vp8_info_.layerSync);
-
-  // Simulate overshoot of this frame.
-  layers_->FrameEncoded(0, -1);
-
-  // Reencode, frame config, flags and codec specific info should remain the
-  // same as for the dropped frame.
-  timestamp_ -= kTimestampDelta5Fps;  // Undo last timestamp increment.
-  TemporalLayers::FrameConfig new_tl_config =
-      layers_->UpdateLayerConfig(timestamp_);
-  EXPECT_EQ(tl_config_, new_tl_config);
-
-  config_updated_ = layers_->UpdateConfiguration(&cfg_);
-  EXPECT_EQ(kTl1SyncFlags, VP8EncoderImpl::EncodeFlags(tl_config_));
-
-  CodecSpecificInfoVP8 new_vp8_info;
-  layers_->PopulateCodecSpecific(false, tl_config_, &new_vp8_info, timestamp_);
-  EXPECT_TRUE(new_vp8_info.layerSync);
-}
-
-}  // namespace webrtc
diff --git a/modules/video_coding/codecs/vp8/simulcast_rate_allocator.cc b/modules/video_coding/codecs/vp8/simulcast_rate_allocator.cc
deleted file mode 100644
index edd5c13..0000000
--- a/modules/video_coding/codecs/vp8/simulcast_rate_allocator.cc
+++ /dev/null
@@ -1,163 +0,0 @@
-/*
- *  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/video_coding/codecs/vp8/simulcast_rate_allocator.h"
-
-#include <algorithm>
-#include <memory>
-#include <vector>
-#include <utility>
-
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-
-SimulcastRateAllocator::SimulcastRateAllocator(
-    const VideoCodec& codec,
-    std::unique_ptr<TemporalLayersFactory> tl_factory)
-    : codec_(codec), tl_factory_(std::move(tl_factory)) {
-  if (tl_factory_.get())
-    tl_factory_->SetListener(this);
-}
-
-void SimulcastRateAllocator::OnTemporalLayersCreated(int simulcast_id,
-                                                     TemporalLayers* layers) {
-  RTC_DCHECK(temporal_layers_.find(simulcast_id) == temporal_layers_.end());
-  RTC_DCHECK(layers);
-  temporal_layers_[simulcast_id] = layers;
-}
-
-BitrateAllocation SimulcastRateAllocator::GetAllocation(
-    uint32_t total_bitrate_bps,
-    uint32_t framerate) {
-  uint32_t left_to_allocate = total_bitrate_bps;
-  if (codec_.maxBitrate && codec_.maxBitrate * 1000 < left_to_allocate)
-    left_to_allocate = codec_.maxBitrate * 1000;
-
-  BitrateAllocation allocated_bitrates_bps;
-  if (codec_.numberOfSimulcastStreams == 0) {
-    // No simulcast, just set the target as this has been capped already.
-    allocated_bitrates_bps.SetBitrate(
-        0, 0, std::max(codec_.minBitrate * 1000, left_to_allocate));
-  } else {
-    // Always allocate enough bitrate for the minimum bitrate of the first
-    // layer. Suspending below min bitrate is controlled outside the codec
-    // implementation and is not overridden by this.
-    left_to_allocate =
-        std::max(codec_.simulcastStream[0].minBitrate * 1000, left_to_allocate);
-
-    // Begin by allocating bitrate to simulcast streams, putting all bitrate in
-    // temporal layer 0. We'll then distribute this bitrate, across potential
-    // temporal layers, when stream allocation is done.
-
-    // Allocate up to the target bitrate for each simulcast layer.
-    size_t layer = 0;
-    for (; layer < codec_.numberOfSimulcastStreams; ++layer) {
-      const SimulcastStream& stream = codec_.simulcastStream[layer];
-      if (left_to_allocate < stream.minBitrate * 1000)
-        break;
-      uint32_t allocation =
-          std::min(left_to_allocate, stream.targetBitrate * 1000);
-      allocated_bitrates_bps.SetBitrate(layer, 0, allocation);
-      RTC_DCHECK_LE(allocation, left_to_allocate);
-      left_to_allocate -= allocation;
-    }
-
-    // Next, try allocate remaining bitrate, up to max bitrate, in top stream.
-    // TODO(sprang): Allocate up to max bitrate for all layers once we have a
-    //               better idea of possible performance implications.
-    if (left_to_allocate > 0) {
-      size_t active_layer = layer - 1;
-      const SimulcastStream& stream = codec_.simulcastStream[active_layer];
-      uint32_t bitrate_bps =
-          allocated_bitrates_bps.GetSpatialLayerSum(active_layer);
-      uint32_t allocation =
-          std::min(left_to_allocate, stream.maxBitrate * 1000 - bitrate_bps);
-      bitrate_bps += allocation;
-      RTC_DCHECK_LE(allocation, left_to_allocate);
-      left_to_allocate -= allocation;
-      allocated_bitrates_bps.SetBitrate(active_layer, 0, bitrate_bps);
-    }
-  }
-
-  const int num_spatial_streams =
-      std::max(1, static_cast<int>(codec_.numberOfSimulcastStreams));
-
-  // Finally, distribute the bitrate for the simulcast streams across the
-  // available temporal layers.
-  for (int simulcast_id = 0; simulcast_id < num_spatial_streams;
-       ++simulcast_id) {
-    auto tl_it = temporal_layers_.find(simulcast_id);
-    if (tl_it == temporal_layers_.end())
-      continue;  // TODO(sprang): If > 1 SS, assume default TL alloc?
-
-    uint32_t target_bitrate_kbps =
-        allocated_bitrates_bps.GetBitrate(simulcast_id, 0) / 1000;
-    const uint32_t expected_allocated_bitrate_kbps = target_bitrate_kbps;
-    RTC_DCHECK_EQ(
-        target_bitrate_kbps,
-        allocated_bitrates_bps.GetSpatialLayerSum(simulcast_id) / 1000);
-    const int num_temporal_streams = std::max<uint8_t>(
-        1, codec_.numberOfSimulcastStreams == 0
-               ? codec_.VP8().numberOfTemporalLayers
-               : codec_.simulcastStream[simulcast_id].numberOfTemporalLayers);
-
-    uint32_t max_bitrate_kbps;
-    // Legacy temporal-layered only screenshare, or simulcast screenshare
-    // with legacy mode for simulcast stream 0.
-    if (codec_.mode == kScreensharing && codec_.targetBitrate > 0 &&
-        ((num_spatial_streams == 1 && num_temporal_streams == 2) ||  // Legacy.
-         (num_spatial_streams > 1 && simulcast_id == 0))) {  // Simulcast.
-      // TODO(holmer): This is a "temporary" hack for screensharing, where we
-      // interpret the startBitrate as the encoder target bitrate. This is
-      // to allow for a different max bitrate, so if the codec can't meet
-      // the target we still allow it to overshoot up to the max before dropping
-      // frames. This hack should be improved.
-      int tl0_bitrate = std::min(codec_.targetBitrate, target_bitrate_kbps);
-      max_bitrate_kbps = std::min(codec_.maxBitrate, target_bitrate_kbps);
-      target_bitrate_kbps = tl0_bitrate;
-    } else if (num_spatial_streams == 1) {
-      max_bitrate_kbps = codec_.maxBitrate;
-    } else {
-      max_bitrate_kbps = codec_.simulcastStream[simulcast_id].maxBitrate;
-    }
-
-    std::vector<uint32_t> tl_allocation = tl_it->second->OnRatesUpdated(
-        target_bitrate_kbps, max_bitrate_kbps, framerate);
-    RTC_DCHECK_GT(tl_allocation.size(), 0);
-    RTC_DCHECK_LE(tl_allocation.size(), num_temporal_streams);
-
-    uint64_t tl_allocation_sum_kbps = 0;
-    for (size_t tl_index = 0; tl_index < tl_allocation.size(); ++tl_index) {
-      uint32_t layer_rate_kbps = tl_allocation[tl_index];
-      allocated_bitrates_bps.SetBitrate(simulcast_id, tl_index,
-                                        layer_rate_kbps * 1000);
-      tl_allocation_sum_kbps += layer_rate_kbps;
-    }
-    RTC_DCHECK_LE(tl_allocation_sum_kbps, expected_allocated_bitrate_kbps);
-  }
-
-  return allocated_bitrates_bps;
-}
-
-uint32_t SimulcastRateAllocator::GetPreferredBitrateBps(uint32_t framerate) {
-  // Create a temporary instance without temporal layers, as they may be
-  // stateful, and updating the bitrate to max here can cause side effects.
-  SimulcastRateAllocator temp_allocator(codec_, nullptr);
-  BitrateAllocation allocation =
-      temp_allocator.GetAllocation(codec_.maxBitrate * 1000, framerate);
-  return allocation.get_sum_bps();
-}
-
-const VideoCodec& webrtc::SimulcastRateAllocator::GetCodec() const {
-  return codec_;
-}
-
-}  // namespace webrtc
diff --git a/modules/video_coding/codecs/vp8/simulcast_rate_allocator.h b/modules/video_coding/codecs/vp8/simulcast_rate_allocator.h
deleted file mode 100644
index c6c2fb3..0000000
--- a/modules/video_coding/codecs/vp8/simulcast_rate_allocator.h
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- *  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_VIDEO_CODING_CODECS_VP8_SIMULCAST_RATE_ALLOCATOR_H_
-#define WEBRTC_MODULES_VIDEO_CODING_CODECS_VP8_SIMULCAST_RATE_ALLOCATOR_H_
-
-#include <stdint.h>
-
-#include <map>
-#include <memory>
-
-#include "webrtc/api/video_codecs/video_encoder.h"
-#include "webrtc/common_video/include/video_bitrate_allocator.h"
-#include "webrtc/modules/video_coding/codecs/vp8/temporal_layers.h"
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace webrtc {
-
-class SimulcastRateAllocator : public VideoBitrateAllocator,
-                               public TemporalLayersListener {
- public:
-  explicit SimulcastRateAllocator(
-      const VideoCodec& codec,
-      std::unique_ptr<TemporalLayersFactory> tl_factory);
-
-  void OnTemporalLayersCreated(int simulcast_id,
-                               TemporalLayers* layers) override;
-
-  BitrateAllocation GetAllocation(uint32_t total_bitrate_bps,
-                                  uint32_t framerate) override;
-  uint32_t GetPreferredBitrateBps(uint32_t framerate) override;
-  const VideoCodec& GetCodec() const;
-
- private:
-  const VideoCodec codec_;
-  std::map<uint32_t, TemporalLayers*> temporal_layers_;
-  std::unique_ptr<TemporalLayersFactory> tl_factory_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(SimulcastRateAllocator);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_VIDEO_CODING_CODECS_VP8_SIMULCAST_RATE_ALLOCATOR_H_
diff --git a/modules/video_coding/codecs/vp8/simulcast_test_utility.h b/modules/video_coding/codecs/vp8/simulcast_test_utility.h
deleted file mode 100644
index 7d1cabf..0000000
--- a/modules/video_coding/codecs/vp8/simulcast_test_utility.h
+++ /dev/null
@@ -1,755 +0,0 @@
-/*
- *  Copyright (c) 2014 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_VIDEO_CODING_CODECS_VP8_SIMULCAST_TEST_UTILITY_H_
-#define WEBRTC_MODULES_VIDEO_CODING_CODECS_VP8_SIMULCAST_TEST_UTILITY_H_
-
-#include <algorithm>
-#include <map>
-#include <memory>
-#include <vector>
-
-#include "webrtc/api/video/i420_buffer.h"
-#include "webrtc/api/video/video_frame.h"
-#include "webrtc/common_video/include/video_frame.h"
-#include "webrtc/common_video/libyuv/include/webrtc_libyuv.h"
-#include "webrtc/modules/video_coding/codecs/vp8/include/vp8.h"
-#include "webrtc/modules/video_coding/codecs/vp8/simulcast_rate_allocator.h"
-#include "webrtc/modules/video_coding/codecs/vp8/temporal_layers.h"
-#include "webrtc/modules/video_coding/include/mock/mock_video_codec_interface.h"
-#include "webrtc/modules/video_coding/include/video_coding_defines.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/test/gtest.h"
-
-using ::testing::_;
-using ::testing::AllOf;
-using ::testing::Field;
-using ::testing::Return;
-
-namespace webrtc {
-namespace testing {
-
-const int kDefaultWidth = 1280;
-const int kDefaultHeight = 720;
-const int kNumberOfSimulcastStreams = 3;
-const int kColorY = 66;
-const int kColorU = 22;
-const int kColorV = 33;
-const int kMaxBitrates[kNumberOfSimulcastStreams] = {150, 600, 1200};
-const int kMinBitrates[kNumberOfSimulcastStreams] = {50, 150, 600};
-const int kTargetBitrates[kNumberOfSimulcastStreams] = {100, 450, 1000};
-const int kDefaultTemporalLayerProfile[3] = {3, 3, 3};
-
-template <typename T>
-void SetExpectedValues3(T value0, T value1, T value2, T* expected_values) {
-  expected_values[0] = value0;
-  expected_values[1] = value1;
-  expected_values[2] = value2;
-}
-
-enum PlaneType {
-  kYPlane = 0,
-  kUPlane = 1,
-  kVPlane = 2,
-  kNumOfPlanes = 3,
-};
-
-class Vp8TestEncodedImageCallback : public EncodedImageCallback {
- public:
-  Vp8TestEncodedImageCallback() : picture_id_(-1) {
-    memset(temporal_layer_, -1, sizeof(temporal_layer_));
-    memset(layer_sync_, false, sizeof(layer_sync_));
-  }
-
-  ~Vp8TestEncodedImageCallback() {
-    delete[] encoded_key_frame_._buffer;
-    delete[] encoded_frame_._buffer;
-  }
-
-  virtual Result OnEncodedImage(const EncodedImage& encoded_image,
-                                const CodecSpecificInfo* codec_specific_info,
-                                const RTPFragmentationHeader* fragmentation) {
-    // Only store the base layer.
-    if (codec_specific_info->codecSpecific.VP8.simulcastIdx == 0) {
-      if (encoded_image._frameType == kVideoFrameKey) {
-        delete[] encoded_key_frame_._buffer;
-        encoded_key_frame_._buffer = new uint8_t[encoded_image._size];
-        encoded_key_frame_._size = encoded_image._size;
-        encoded_key_frame_._length = encoded_image._length;
-        encoded_key_frame_._frameType = kVideoFrameKey;
-        encoded_key_frame_._completeFrame = encoded_image._completeFrame;
-        memcpy(encoded_key_frame_._buffer, encoded_image._buffer,
-               encoded_image._length);
-      } else {
-        delete[] encoded_frame_._buffer;
-        encoded_frame_._buffer = new uint8_t[encoded_image._size];
-        encoded_frame_._size = encoded_image._size;
-        encoded_frame_._length = encoded_image._length;
-        memcpy(encoded_frame_._buffer, encoded_image._buffer,
-               encoded_image._length);
-      }
-    }
-    picture_id_ = codec_specific_info->codecSpecific.VP8.pictureId;
-    layer_sync_[codec_specific_info->codecSpecific.VP8.simulcastIdx] =
-        codec_specific_info->codecSpecific.VP8.layerSync;
-    temporal_layer_[codec_specific_info->codecSpecific.VP8.simulcastIdx] =
-        codec_specific_info->codecSpecific.VP8.temporalIdx;
-    return Result(Result::OK, encoded_image._timeStamp);
-  }
-  void GetLastEncodedFrameInfo(int* picture_id,
-                               int* temporal_layer,
-                               bool* layer_sync,
-                               int stream) {
-    *picture_id = picture_id_;
-    *temporal_layer = temporal_layer_[stream];
-    *layer_sync = layer_sync_[stream];
-  }
-  void GetLastEncodedKeyFrame(EncodedImage* encoded_key_frame) {
-    *encoded_key_frame = encoded_key_frame_;
-  }
-  void GetLastEncodedFrame(EncodedImage* encoded_frame) {
-    *encoded_frame = encoded_frame_;
-  }
-
- private:
-  EncodedImage encoded_key_frame_;
-  EncodedImage encoded_frame_;
-  int picture_id_;
-  int temporal_layer_[kNumberOfSimulcastStreams];
-  bool layer_sync_[kNumberOfSimulcastStreams];
-};
-
-class Vp8TestDecodedImageCallback : public DecodedImageCallback {
- public:
-  Vp8TestDecodedImageCallback() : decoded_frames_(0) {}
-  int32_t Decoded(VideoFrame& decoded_image) override {
-    rtc::scoped_refptr<I420BufferInterface> i420_buffer =
-        decoded_image.video_frame_buffer()->ToI420();
-    for (int i = 0; i < decoded_image.width(); ++i) {
-      EXPECT_NEAR(kColorY, i420_buffer->DataY()[i], 1);
-    }
-
-    // TODO(mikhal): Verify the difference between U,V and the original.
-    for (int i = 0; i < i420_buffer->ChromaWidth(); ++i) {
-      EXPECT_NEAR(kColorU, i420_buffer->DataU()[i], 4);
-      EXPECT_NEAR(kColorV, i420_buffer->DataV()[i], 4);
-    }
-    decoded_frames_++;
-    return 0;
-  }
-  int32_t Decoded(VideoFrame& decoded_image, int64_t decode_time_ms) override {
-    RTC_NOTREACHED();
-    return -1;
-  }
-  void Decoded(VideoFrame& decoded_image,
-               rtc::Optional<int32_t> decode_time_ms,
-               rtc::Optional<uint8_t> qp) override {
-    Decoded(decoded_image);
-  }
-  int DecodedFrames() { return decoded_frames_; }
-
- private:
-  int decoded_frames_;
-};
-
-class TestVp8Simulcast : public ::testing::Test {
- public:
-  static void SetPlane(uint8_t* data,
-                       uint8_t value,
-                       int width,
-                       int height,
-                       int stride) {
-    for (int i = 0; i < height; i++, data += stride) {
-      // Setting allocated area to zero - setting only image size to
-      // requested values - will make it easier to distinguish between image
-      // size and frame size (accounting for stride).
-      memset(data, value, width);
-      memset(data + width, 0, stride - width);
-    }
-  }
-
-  // Fills in an I420Buffer from |plane_colors|.
-  static void CreateImage(const rtc::scoped_refptr<I420Buffer>& buffer,
-                          int plane_colors[kNumOfPlanes]) {
-    SetPlane(buffer->MutableDataY(), plane_colors[0], buffer->width(),
-             buffer->height(), buffer->StrideY());
-
-    SetPlane(buffer->MutableDataU(), plane_colors[1], buffer->ChromaWidth(),
-             buffer->ChromaHeight(), buffer->StrideU());
-
-    SetPlane(buffer->MutableDataV(), plane_colors[2], buffer->ChromaWidth(),
-             buffer->ChromaHeight(), buffer->StrideV());
-  }
-
-  static void DefaultSettings(VideoCodec* settings,
-                              const int* temporal_layer_profile) {
-    RTC_CHECK(settings);
-    memset(settings, 0, sizeof(VideoCodec));
-    strncpy(settings->plName, "VP8", 4);
-    settings->codecType = kVideoCodecVP8;
-    // 96 to 127 dynamic payload types for video codecs
-    settings->plType = 120;
-    settings->startBitrate = 300;
-    settings->minBitrate = 30;
-    settings->maxBitrate = 0;
-    settings->maxFramerate = 30;
-    settings->width = kDefaultWidth;
-    settings->height = kDefaultHeight;
-    settings->numberOfSimulcastStreams = kNumberOfSimulcastStreams;
-    ASSERT_EQ(3, kNumberOfSimulcastStreams);
-    settings->timing_frame_thresholds = {kDefaultTimingFramesDelayMs,
-                                         kDefaultOutlierFrameSizePercent};
-    ConfigureStream(kDefaultWidth / 4, kDefaultHeight / 4, kMaxBitrates[0],
-                    kMinBitrates[0], kTargetBitrates[0],
-                    &settings->simulcastStream[0], temporal_layer_profile[0]);
-    ConfigureStream(kDefaultWidth / 2, kDefaultHeight / 2, kMaxBitrates[1],
-                    kMinBitrates[1], kTargetBitrates[1],
-                    &settings->simulcastStream[1], temporal_layer_profile[1]);
-    ConfigureStream(kDefaultWidth, kDefaultHeight, kMaxBitrates[2],
-                    kMinBitrates[2], kTargetBitrates[2],
-                    &settings->simulcastStream[2], temporal_layer_profile[2]);
-    settings->VP8()->resilience = kResilientStream;
-    settings->VP8()->denoisingOn = true;
-    settings->VP8()->errorConcealmentOn = false;
-    settings->VP8()->automaticResizeOn = false;
-    settings->VP8()->frameDroppingOn = true;
-    settings->VP8()->keyFrameInterval = 3000;
-  }
-
-  static void ConfigureStream(int width,
-                              int height,
-                              int max_bitrate,
-                              int min_bitrate,
-                              int target_bitrate,
-                              SimulcastStream* stream,
-                              int num_temporal_layers) {
-    assert(stream);
-    stream->width = width;
-    stream->height = height;
-    stream->maxBitrate = max_bitrate;
-    stream->minBitrate = min_bitrate;
-    stream->targetBitrate = target_bitrate;
-    stream->numberOfTemporalLayers = num_temporal_layers;
-    stream->qpMax = 45;
-  }
-
- protected:
-  virtual VP8Encoder* CreateEncoder() = 0;
-  virtual VP8Decoder* CreateDecoder() = 0;
-
-  void SetUp() override {
-    encoder_.reset(CreateEncoder());
-    decoder_.reset(CreateDecoder());
-    SetUpCodec(kDefaultTemporalLayerProfile);
-  }
-
-  void TearDown() override {
-    encoder_->Release();
-    decoder_->Release();
-    encoder_.reset();
-    decoder_.reset();
-  }
-
-  void SetUpCodec(const int* temporal_layer_profile) {
-    encoder_->RegisterEncodeCompleteCallback(&encoder_callback_);
-    decoder_->RegisterDecodeCompleteCallback(&decoder_callback_);
-    DefaultSettings(&settings_, temporal_layer_profile);
-    SetUpRateAllocator();
-    EXPECT_EQ(0, encoder_->InitEncode(&settings_, 1, 1200));
-    EXPECT_EQ(0, decoder_->InitDecode(&settings_, 1));
-    input_buffer_ = I420Buffer::Create(kDefaultWidth, kDefaultHeight);
-    input_buffer_->InitializeData();
-    input_frame_.reset(
-        new VideoFrame(input_buffer_, 0, 0, webrtc::kVideoRotation_0));
-  }
-
-  void SetUpRateAllocator() {
-    TemporalLayersFactory* tl_factory = new TemporalLayersFactory();
-    rate_allocator_.reset(new SimulcastRateAllocator(
-        settings_, std::unique_ptr<TemporalLayersFactory>(tl_factory)));
-    settings_.VP8()->tl_factory = tl_factory;
-  }
-
-  void SetRates(uint32_t bitrate_kbps, uint32_t fps) {
-    encoder_->SetRateAllocation(
-        rate_allocator_->GetAllocation(bitrate_kbps * 1000, fps), fps);
-  }
-
-  void ExpectStreams(FrameType frame_type, int expected_video_streams) {
-    ASSERT_GE(expected_video_streams, 0);
-    ASSERT_LE(expected_video_streams, kNumberOfSimulcastStreams);
-    if (expected_video_streams >= 1) {
-      EXPECT_CALL(
-          encoder_callback_,
-          OnEncodedImage(
-              AllOf(Field(&EncodedImage::_frameType, frame_type),
-                    Field(&EncodedImage::_encodedWidth, kDefaultWidth / 4),
-                    Field(&EncodedImage::_encodedHeight, kDefaultHeight / 4)),
-              _, _))
-          .Times(1)
-          .WillRepeatedly(Return(EncodedImageCallback::Result(
-              EncodedImageCallback::Result::OK, 0)));
-    }
-    if (expected_video_streams >= 2) {
-      EXPECT_CALL(
-          encoder_callback_,
-          OnEncodedImage(
-              AllOf(Field(&EncodedImage::_frameType, frame_type),
-                    Field(&EncodedImage::_encodedWidth, kDefaultWidth / 2),
-                    Field(&EncodedImage::_encodedHeight, kDefaultHeight / 2)),
-              _, _))
-          .Times(1)
-          .WillRepeatedly(Return(EncodedImageCallback::Result(
-              EncodedImageCallback::Result::OK, 0)));
-    }
-    if (expected_video_streams >= 3) {
-      EXPECT_CALL(
-          encoder_callback_,
-          OnEncodedImage(
-              AllOf(Field(&EncodedImage::_frameType, frame_type),
-                    Field(&EncodedImage::_encodedWidth, kDefaultWidth),
-                    Field(&EncodedImage::_encodedHeight, kDefaultHeight)),
-              _, _))
-          .Times(1)
-          .WillRepeatedly(Return(EncodedImageCallback::Result(
-              EncodedImageCallback::Result::OK, 0)));
-    }
-  }
-
-  void VerifyTemporalIdxAndSyncForAllSpatialLayers(
-      Vp8TestEncodedImageCallback* encoder_callback,
-      const int* expected_temporal_idx,
-      const bool* expected_layer_sync,
-      int num_spatial_layers) {
-    int picture_id = -1;
-    int temporal_layer = -1;
-    bool layer_sync = false;
-    for (int i = 0; i < num_spatial_layers; i++) {
-      encoder_callback->GetLastEncodedFrameInfo(&picture_id, &temporal_layer,
-                                                &layer_sync, i);
-      EXPECT_EQ(expected_temporal_idx[i], temporal_layer);
-      EXPECT_EQ(expected_layer_sync[i], layer_sync);
-    }
-  }
-
-  // We currently expect all active streams to generate a key frame even though
-  // a key frame was only requested for some of them.
-  void TestKeyFrameRequestsOnAllStreams() {
-    SetRates(kMaxBitrates[2], 30);  // To get all three streams.
-    std::vector<FrameType> frame_types(kNumberOfSimulcastStreams,
-                                       kVideoFrameDelta);
-    ExpectStreams(kVideoFrameKey, kNumberOfSimulcastStreams);
-    EXPECT_EQ(0, encoder_->Encode(*input_frame_, NULL, &frame_types));
-
-    ExpectStreams(kVideoFrameDelta, kNumberOfSimulcastStreams);
-    input_frame_->set_timestamp(input_frame_->timestamp() + 3000);
-    EXPECT_EQ(0, encoder_->Encode(*input_frame_, NULL, &frame_types));
-
-    frame_types[0] = kVideoFrameKey;
-    ExpectStreams(kVideoFrameKey, kNumberOfSimulcastStreams);
-    input_frame_->set_timestamp(input_frame_->timestamp() + 3000);
-    EXPECT_EQ(0, encoder_->Encode(*input_frame_, NULL, &frame_types));
-
-    std::fill(frame_types.begin(), frame_types.end(), kVideoFrameDelta);
-    frame_types[1] = kVideoFrameKey;
-    ExpectStreams(kVideoFrameKey, kNumberOfSimulcastStreams);
-    input_frame_->set_timestamp(input_frame_->timestamp() + 3000);
-    EXPECT_EQ(0, encoder_->Encode(*input_frame_, NULL, &frame_types));
-
-    std::fill(frame_types.begin(), frame_types.end(), kVideoFrameDelta);
-    frame_types[2] = kVideoFrameKey;
-    ExpectStreams(kVideoFrameKey, kNumberOfSimulcastStreams);
-    input_frame_->set_timestamp(input_frame_->timestamp() + 3000);
-    EXPECT_EQ(0, encoder_->Encode(*input_frame_, NULL, &frame_types));
-
-    std::fill(frame_types.begin(), frame_types.end(), kVideoFrameDelta);
-    ExpectStreams(kVideoFrameDelta, kNumberOfSimulcastStreams);
-    input_frame_->set_timestamp(input_frame_->timestamp() + 3000);
-    EXPECT_EQ(0, encoder_->Encode(*input_frame_, NULL, &frame_types));
-  }
-
-  void TestPaddingAllStreams() {
-    // We should always encode the base layer.
-    SetRates(kMinBitrates[0] - 1, 30);
-    std::vector<FrameType> frame_types(kNumberOfSimulcastStreams,
-                                       kVideoFrameDelta);
-    ExpectStreams(kVideoFrameKey, 1);
-    EXPECT_EQ(0, encoder_->Encode(*input_frame_, NULL, &frame_types));
-
-    ExpectStreams(kVideoFrameDelta, 1);
-    input_frame_->set_timestamp(input_frame_->timestamp() + 3000);
-    EXPECT_EQ(0, encoder_->Encode(*input_frame_, NULL, &frame_types));
-  }
-
-  void TestPaddingTwoStreams() {
-    // We have just enough to get only the first stream and padding for two.
-    SetRates(kMinBitrates[0], 30);
-    std::vector<FrameType> frame_types(kNumberOfSimulcastStreams,
-                                       kVideoFrameDelta);
-    ExpectStreams(kVideoFrameKey, 1);
-    EXPECT_EQ(0, encoder_->Encode(*input_frame_, NULL, &frame_types));
-
-    ExpectStreams(kVideoFrameDelta, 1);
-    input_frame_->set_timestamp(input_frame_->timestamp() + 3000);
-    EXPECT_EQ(0, encoder_->Encode(*input_frame_, NULL, &frame_types));
-  }
-
-  void TestPaddingTwoStreamsOneMaxedOut() {
-    // We are just below limit of sending second stream, so we should get
-    // the first stream maxed out (at |maxBitrate|), and padding for two.
-    SetRates(kTargetBitrates[0] + kMinBitrates[1] - 1, 30);
-    std::vector<FrameType> frame_types(kNumberOfSimulcastStreams,
-                                       kVideoFrameDelta);
-    ExpectStreams(kVideoFrameKey, 1);
-    EXPECT_EQ(0, encoder_->Encode(*input_frame_, NULL, &frame_types));
-
-    ExpectStreams(kVideoFrameDelta, 1);
-    input_frame_->set_timestamp(input_frame_->timestamp() + 3000);
-    EXPECT_EQ(0, encoder_->Encode(*input_frame_, NULL, &frame_types));
-  }
-
-  void TestPaddingOneStream() {
-    // We have just enough to send two streams, so padding for one stream.
-    SetRates(kTargetBitrates[0] + kMinBitrates[1], 30);
-    std::vector<FrameType> frame_types(kNumberOfSimulcastStreams,
-                                       kVideoFrameDelta);
-    ExpectStreams(kVideoFrameKey, 2);
-    EXPECT_EQ(0, encoder_->Encode(*input_frame_, NULL, &frame_types));
-
-    ExpectStreams(kVideoFrameDelta, 2);
-    input_frame_->set_timestamp(input_frame_->timestamp() + 3000);
-    EXPECT_EQ(0, encoder_->Encode(*input_frame_, NULL, &frame_types));
-  }
-
-  void TestPaddingOneStreamTwoMaxedOut() {
-    // We are just below limit of sending third stream, so we should get
-    // first stream's rate maxed out at |targetBitrate|, second at |maxBitrate|.
-    SetRates(kTargetBitrates[0] + kTargetBitrates[1] + kMinBitrates[2] - 1, 30);
-    std::vector<FrameType> frame_types(kNumberOfSimulcastStreams,
-                                       kVideoFrameDelta);
-    ExpectStreams(kVideoFrameKey, 2);
-    EXPECT_EQ(0, encoder_->Encode(*input_frame_, NULL, &frame_types));
-
-    ExpectStreams(kVideoFrameDelta, 2);
-    input_frame_->set_timestamp(input_frame_->timestamp() + 3000);
-    EXPECT_EQ(0, encoder_->Encode(*input_frame_, NULL, &frame_types));
-  }
-
-  void TestSendAllStreams() {
-    // We have just enough to send all streams.
-    SetRates(kTargetBitrates[0] + kTargetBitrates[1] + kMinBitrates[2], 30);
-    std::vector<FrameType> frame_types(kNumberOfSimulcastStreams,
-                                       kVideoFrameDelta);
-    ExpectStreams(kVideoFrameKey, 3);
-    EXPECT_EQ(0, encoder_->Encode(*input_frame_, NULL, &frame_types));
-
-    ExpectStreams(kVideoFrameDelta, 3);
-    input_frame_->set_timestamp(input_frame_->timestamp() + 3000);
-    EXPECT_EQ(0, encoder_->Encode(*input_frame_, NULL, &frame_types));
-  }
-
-  void TestDisablingStreams() {
-    // We should get three media streams.
-    SetRates(kMaxBitrates[0] + kMaxBitrates[1] + kMaxBitrates[2], 30);
-    std::vector<FrameType> frame_types(kNumberOfSimulcastStreams,
-                                       kVideoFrameDelta);
-    ExpectStreams(kVideoFrameKey, 3);
-    EXPECT_EQ(0, encoder_->Encode(*input_frame_, NULL, &frame_types));
-
-    ExpectStreams(kVideoFrameDelta, 3);
-    input_frame_->set_timestamp(input_frame_->timestamp() + 3000);
-    EXPECT_EQ(0, encoder_->Encode(*input_frame_, NULL, &frame_types));
-
-    // We should only get two streams and padding for one.
-    SetRates(kTargetBitrates[0] + kTargetBitrates[1] + kMinBitrates[2] / 2, 30);
-    ExpectStreams(kVideoFrameDelta, 2);
-    input_frame_->set_timestamp(input_frame_->timestamp() + 3000);
-    EXPECT_EQ(0, encoder_->Encode(*input_frame_, NULL, &frame_types));
-
-    // We should only get the first stream and padding for two.
-    SetRates(kTargetBitrates[0] + kMinBitrates[1] / 2, 30);
-    ExpectStreams(kVideoFrameDelta, 1);
-    input_frame_->set_timestamp(input_frame_->timestamp() + 3000);
-    EXPECT_EQ(0, encoder_->Encode(*input_frame_, NULL, &frame_types));
-
-    // We don't have enough bitrate for the thumbnail stream, but we should get
-    // it anyway with current configuration.
-    SetRates(kTargetBitrates[0] - 1, 30);
-    ExpectStreams(kVideoFrameDelta, 1);
-    input_frame_->set_timestamp(input_frame_->timestamp() + 3000);
-    EXPECT_EQ(0, encoder_->Encode(*input_frame_, NULL, &frame_types));
-
-    // We should only get two streams and padding for one.
-    SetRates(kTargetBitrates[0] + kTargetBitrates[1] + kMinBitrates[2] / 2, 30);
-    // We get a key frame because a new stream is being enabled.
-    ExpectStreams(kVideoFrameKey, 2);
-    input_frame_->set_timestamp(input_frame_->timestamp() + 3000);
-    EXPECT_EQ(0, encoder_->Encode(*input_frame_, NULL, &frame_types));
-
-    // We should get all three streams.
-    SetRates(kTargetBitrates[0] + kTargetBitrates[1] + kTargetBitrates[2], 30);
-    // We get a key frame because a new stream is being enabled.
-    ExpectStreams(kVideoFrameKey, 3);
-    input_frame_->set_timestamp(input_frame_->timestamp() + 3000);
-    EXPECT_EQ(0, encoder_->Encode(*input_frame_, NULL, &frame_types));
-  }
-
-  void SwitchingToOneStream(int width, int height) {
-    // Disable all streams except the last and set the bitrate of the last to
-    // 100 kbps. This verifies the way GTP switches to screenshare mode.
-    settings_.VP8()->numberOfTemporalLayers = 1;
-    settings_.maxBitrate = 100;
-    settings_.startBitrate = 100;
-    settings_.width = width;
-    settings_.height = height;
-    for (int i = 0; i < settings_.numberOfSimulcastStreams - 1; ++i) {
-      settings_.simulcastStream[i].maxBitrate = 0;
-      settings_.simulcastStream[i].width = settings_.width;
-      settings_.simulcastStream[i].height = settings_.height;
-    }
-    // Setting input image to new resolution.
-    input_buffer_ = I420Buffer::Create(settings_.width, settings_.height);
-    input_buffer_->InitializeData();
-
-    input_frame_.reset(
-        new VideoFrame(input_buffer_, 0, 0, webrtc::kVideoRotation_0));
-
-    // The for loop above did not set the bitrate of the highest layer.
-    settings_.simulcastStream[settings_.numberOfSimulcastStreams - 1]
-        .maxBitrate = 0;
-    // The highest layer has to correspond to the non-simulcast resolution.
-    settings_.simulcastStream[settings_.numberOfSimulcastStreams - 1].width =
-        settings_.width;
-    settings_.simulcastStream[settings_.numberOfSimulcastStreams - 1].height =
-        settings_.height;
-    SetUpRateAllocator();
-    EXPECT_EQ(0, encoder_->InitEncode(&settings_, 1, 1200));
-
-    // Encode one frame and verify.
-    SetRates(kMaxBitrates[0] + kMaxBitrates[1], 30);
-    std::vector<FrameType> frame_types(kNumberOfSimulcastStreams,
-                                       kVideoFrameDelta);
-    EXPECT_CALL(
-        encoder_callback_,
-        OnEncodedImage(AllOf(Field(&EncodedImage::_frameType, kVideoFrameKey),
-                             Field(&EncodedImage::_encodedWidth, width),
-                             Field(&EncodedImage::_encodedHeight, height)),
-                       _, _))
-        .Times(1)
-        .WillRepeatedly(Return(
-            EncodedImageCallback::Result(EncodedImageCallback::Result::OK, 0)));
-    EXPECT_EQ(0, encoder_->Encode(*input_frame_, NULL, &frame_types));
-
-    // Switch back.
-    DefaultSettings(&settings_, kDefaultTemporalLayerProfile);
-    // Start at the lowest bitrate for enabling base stream.
-    settings_.startBitrate = kMinBitrates[0];
-    SetUpRateAllocator();
-    EXPECT_EQ(0, encoder_->InitEncode(&settings_, 1, 1200));
-    SetRates(settings_.startBitrate, 30);
-    ExpectStreams(kVideoFrameKey, 1);
-    // Resize |input_frame_| to the new resolution.
-    input_buffer_ = I420Buffer::Create(settings_.width, settings_.height);
-    input_buffer_->InitializeData();
-    input_frame_.reset(
-        new VideoFrame(input_buffer_, 0, 0, webrtc::kVideoRotation_0));
-    EXPECT_EQ(0, encoder_->Encode(*input_frame_, NULL, &frame_types));
-  }
-
-  void TestSwitchingToOneStream() { SwitchingToOneStream(1024, 768); }
-
-  void TestSwitchingToOneOddStream() { SwitchingToOneStream(1023, 769); }
-
-  void TestSwitchingToOneSmallStream() { SwitchingToOneStream(4, 4); }
-
-  // Test the layer pattern and sync flag for various spatial-temporal patterns.
-  // 3-3-3 pattern: 3 temporal layers for all spatial streams, so same
-  // temporal_layer id and layer_sync is expected for all streams.
-  void TestSaptioTemporalLayers333PatternEncoder() {
-    Vp8TestEncodedImageCallback encoder_callback;
-    encoder_->RegisterEncodeCompleteCallback(&encoder_callback);
-    SetRates(kMaxBitrates[2], 30);  // To get all three streams.
-
-    int expected_temporal_idx[3] = {-1, -1, -1};
-    bool expected_layer_sync[3] = {false, false, false};
-
-    // First frame: #0.
-    EXPECT_EQ(0, encoder_->Encode(*input_frame_, NULL, NULL));
-    SetExpectedValues3<int>(0, 0, 0, expected_temporal_idx);
-    SetExpectedValues3<bool>(true, true, true, expected_layer_sync);
-    VerifyTemporalIdxAndSyncForAllSpatialLayers(
-        &encoder_callback, expected_temporal_idx, expected_layer_sync, 3);
-
-    // Next frame: #1.
-    input_frame_->set_timestamp(input_frame_->timestamp() + 3000);
-    EXPECT_EQ(0, encoder_->Encode(*input_frame_, NULL, NULL));
-    SetExpectedValues3<int>(2, 2, 2, expected_temporal_idx);
-    SetExpectedValues3<bool>(true, true, true, expected_layer_sync);
-    VerifyTemporalIdxAndSyncForAllSpatialLayers(
-        &encoder_callback, expected_temporal_idx, expected_layer_sync, 3);
-
-    // Next frame: #2.
-    input_frame_->set_timestamp(input_frame_->timestamp() + 3000);
-    EXPECT_EQ(0, encoder_->Encode(*input_frame_, NULL, NULL));
-    SetExpectedValues3<int>(1, 1, 1, expected_temporal_idx);
-    SetExpectedValues3<bool>(true, true, true, expected_layer_sync);
-    VerifyTemporalIdxAndSyncForAllSpatialLayers(
-        &encoder_callback, expected_temporal_idx, expected_layer_sync, 3);
-
-    // Next frame: #3.
-    input_frame_->set_timestamp(input_frame_->timestamp() + 3000);
-    EXPECT_EQ(0, encoder_->Encode(*input_frame_, NULL, NULL));
-    SetExpectedValues3<int>(2, 2, 2, expected_temporal_idx);
-    SetExpectedValues3<bool>(false, false, false, expected_layer_sync);
-    VerifyTemporalIdxAndSyncForAllSpatialLayers(
-        &encoder_callback, expected_temporal_idx, expected_layer_sync, 3);
-
-    // Next frame: #4.
-    input_frame_->set_timestamp(input_frame_->timestamp() + 3000);
-    EXPECT_EQ(0, encoder_->Encode(*input_frame_, NULL, NULL));
-    SetExpectedValues3<int>(0, 0, 0, expected_temporal_idx);
-    SetExpectedValues3<bool>(false, false, false, expected_layer_sync);
-    VerifyTemporalIdxAndSyncForAllSpatialLayers(
-        &encoder_callback, expected_temporal_idx, expected_layer_sync, 3);
-
-    // Next frame: #5.
-    input_frame_->set_timestamp(input_frame_->timestamp() + 3000);
-    EXPECT_EQ(0, encoder_->Encode(*input_frame_, NULL, NULL));
-    SetExpectedValues3<int>(2, 2, 2, expected_temporal_idx);
-    SetExpectedValues3<bool>(false, false, false, expected_layer_sync);
-    VerifyTemporalIdxAndSyncForAllSpatialLayers(
-        &encoder_callback, expected_temporal_idx, expected_layer_sync, 3);
-  }
-
-  // Test the layer pattern and sync flag for various spatial-temporal patterns.
-  // 3-2-1 pattern: 3 temporal layers for lowest resolution, 2 for middle, and
-  // 1 temporal layer for highest resolution.
-  // For this profile, we expect the temporal index pattern to be:
-  // 1st stream: 0, 2, 1, 2, ....
-  // 2nd stream: 0, 1, 0, 1, ...
-  // 3rd stream: -1, -1, -1, -1, ....
-  // Regarding the 3rd stream, note that a stream/encoder with 1 temporal layer
-  // should always have temporal layer idx set to kNoTemporalIdx = -1.
-  // Since CodecSpecificInfoVP8.temporalIdx is uint8_t, this will wrap to 255.
-  // TODO(marpan): Although this seems safe for now, we should fix this.
-  void TestSpatioTemporalLayers321PatternEncoder() {
-    int temporal_layer_profile[3] = {3, 2, 1};
-    SetUpCodec(temporal_layer_profile);
-    Vp8TestEncodedImageCallback encoder_callback;
-    encoder_->RegisterEncodeCompleteCallback(&encoder_callback);
-    SetRates(kMaxBitrates[2], 30);  // To get all three streams.
-
-    int expected_temporal_idx[3] = {-1, -1, -1};
-    bool expected_layer_sync[3] = {false, false, false};
-
-    // First frame: #0.
-    EXPECT_EQ(0, encoder_->Encode(*input_frame_, NULL, NULL));
-    SetExpectedValues3<int>(0, 0, 255, expected_temporal_idx);
-    SetExpectedValues3<bool>(true, true, false, expected_layer_sync);
-    VerifyTemporalIdxAndSyncForAllSpatialLayers(
-        &encoder_callback, expected_temporal_idx, expected_layer_sync, 3);
-
-    // Next frame: #1.
-    input_frame_->set_timestamp(input_frame_->timestamp() + 3000);
-    EXPECT_EQ(0, encoder_->Encode(*input_frame_, NULL, NULL));
-    SetExpectedValues3<int>(2, 1, 255, expected_temporal_idx);
-    SetExpectedValues3<bool>(true, true, false, expected_layer_sync);
-    VerifyTemporalIdxAndSyncForAllSpatialLayers(
-        &encoder_callback, expected_temporal_idx, expected_layer_sync, 3);
-
-    // Next frame: #2.
-    input_frame_->set_timestamp(input_frame_->timestamp() + 3000);
-    EXPECT_EQ(0, encoder_->Encode(*input_frame_, NULL, NULL));
-    SetExpectedValues3<int>(1, 0, 255, expected_temporal_idx);
-    SetExpectedValues3<bool>(true, false, false, expected_layer_sync);
-    VerifyTemporalIdxAndSyncForAllSpatialLayers(
-        &encoder_callback, expected_temporal_idx, expected_layer_sync, 3);
-
-    // Next frame: #3.
-    input_frame_->set_timestamp(input_frame_->timestamp() + 3000);
-    EXPECT_EQ(0, encoder_->Encode(*input_frame_, NULL, NULL));
-    SetExpectedValues3<int>(2, 1, 255, expected_temporal_idx);
-    SetExpectedValues3<bool>(false, false, false, expected_layer_sync);
-    VerifyTemporalIdxAndSyncForAllSpatialLayers(
-        &encoder_callback, expected_temporal_idx, expected_layer_sync, 3);
-
-    // Next frame: #4.
-    input_frame_->set_timestamp(input_frame_->timestamp() + 3000);
-    EXPECT_EQ(0, encoder_->Encode(*input_frame_, NULL, NULL));
-    SetExpectedValues3<int>(0, 0, 255, expected_temporal_idx);
-    SetExpectedValues3<bool>(false, false, false, expected_layer_sync);
-    VerifyTemporalIdxAndSyncForAllSpatialLayers(
-        &encoder_callback, expected_temporal_idx, expected_layer_sync, 3);
-
-    // Next frame: #5.
-    input_frame_->set_timestamp(input_frame_->timestamp() + 3000);
-    EXPECT_EQ(0, encoder_->Encode(*input_frame_, NULL, NULL));
-    SetExpectedValues3<int>(2, 1, 255, expected_temporal_idx);
-    SetExpectedValues3<bool>(false, false, false, expected_layer_sync);
-    VerifyTemporalIdxAndSyncForAllSpatialLayers(
-        &encoder_callback, expected_temporal_idx, expected_layer_sync, 3);
-  }
-
-  void TestStrideEncodeDecode() {
-    Vp8TestEncodedImageCallback encoder_callback;
-    Vp8TestDecodedImageCallback decoder_callback;
-    encoder_->RegisterEncodeCompleteCallback(&encoder_callback);
-    decoder_->RegisterDecodeCompleteCallback(&decoder_callback);
-
-    SetRates(kMaxBitrates[2], 30);  // To get all three streams.
-    // Setting two (possibly) problematic use cases for stride:
-    // 1. stride > width 2. stride_y != stride_uv/2
-    int stride_y = kDefaultWidth + 20;
-    int stride_uv = ((kDefaultWidth + 1) / 2) + 5;
-    input_buffer_ = I420Buffer::Create(kDefaultWidth, kDefaultHeight, stride_y,
-                                       stride_uv, stride_uv);
-    input_frame_.reset(
-        new VideoFrame(input_buffer_, 0, 0, webrtc::kVideoRotation_0));
-
-    // Set color.
-    int plane_offset[kNumOfPlanes];
-    plane_offset[kYPlane] = kColorY;
-    plane_offset[kUPlane] = kColorU;
-    plane_offset[kVPlane] = kColorV;
-    CreateImage(input_buffer_, plane_offset);
-
-    EXPECT_EQ(0, encoder_->Encode(*input_frame_, NULL, NULL));
-
-    // Change color.
-    plane_offset[kYPlane] += 1;
-    plane_offset[kUPlane] += 1;
-    plane_offset[kVPlane] += 1;
-    CreateImage(input_buffer_, plane_offset);
-    input_frame_->set_timestamp(input_frame_->timestamp() + 3000);
-    EXPECT_EQ(0, encoder_->Encode(*input_frame_, NULL, NULL));
-
-    EncodedImage encoded_frame;
-    // Only encoding one frame - so will be a key frame.
-    encoder_callback.GetLastEncodedKeyFrame(&encoded_frame);
-    EXPECT_EQ(0, decoder_->Decode(encoded_frame, false, NULL));
-    encoder_callback.GetLastEncodedFrame(&encoded_frame);
-    decoder_->Decode(encoded_frame, false, NULL);
-    EXPECT_EQ(2, decoder_callback.DecodedFrames());
-  }
-
-  std::unique_ptr<VP8Encoder> encoder_;
-  MockEncodedImageCallback encoder_callback_;
-  std::unique_ptr<VP8Decoder> decoder_;
-  MockDecodedImageCallback decoder_callback_;
-  VideoCodec settings_;
-  rtc::scoped_refptr<I420Buffer> input_buffer_;
-  std::unique_ptr<VideoFrame> input_frame_;
-  std::unique_ptr<SimulcastRateAllocator> rate_allocator_;
-};
-
-}  // namespace testing
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_VIDEO_CODING_CODECS_VP8_SIMULCAST_TEST_UTILITY_H_
diff --git a/modules/video_coding/codecs/vp8/simulcast_unittest.cc b/modules/video_coding/codecs/vp8/simulcast_unittest.cc
deleted file mode 100644
index 1120fe0..0000000
--- a/modules/video_coding/codecs/vp8/simulcast_unittest.cc
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- *  Copyright (c) 2014 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/video_coding/codecs/vp8/simulcast_test_utility.h"
-
-namespace webrtc {
-namespace testing {
-
-class TestVp8Impl : public TestVp8Simulcast {
- protected:
-  VP8Encoder* CreateEncoder() override { return VP8Encoder::Create(); }
-  VP8Decoder* CreateDecoder() override { return VP8Decoder::Create(); }
-};
-
-TEST_F(TestVp8Impl, TestKeyFrameRequestsOnAllStreams) {
-  TestVp8Simulcast::TestKeyFrameRequestsOnAllStreams();
-}
-
-TEST_F(TestVp8Impl, TestPaddingAllStreams) {
-  TestVp8Simulcast::TestPaddingAllStreams();
-}
-
-TEST_F(TestVp8Impl, TestPaddingTwoStreams) {
-  TestVp8Simulcast::TestPaddingTwoStreams();
-}
-
-TEST_F(TestVp8Impl, TestPaddingTwoStreamsOneMaxedOut) {
-  TestVp8Simulcast::TestPaddingTwoStreamsOneMaxedOut();
-}
-
-TEST_F(TestVp8Impl, TestPaddingOneStream) {
-  TestVp8Simulcast::TestPaddingOneStream();
-}
-
-TEST_F(TestVp8Impl, TestPaddingOneStreamTwoMaxedOut) {
-  TestVp8Simulcast::TestPaddingOneStreamTwoMaxedOut();
-}
-
-TEST_F(TestVp8Impl, TestSendAllStreams) {
-  TestVp8Simulcast::TestSendAllStreams();
-}
-
-TEST_F(TestVp8Impl, TestDisablingStreams) {
-  TestVp8Simulcast::TestDisablingStreams();
-}
-
-TEST_F(TestVp8Impl, TestSwitchingToOneStream) {
-  TestVp8Simulcast::TestSwitchingToOneStream();
-}
-
-TEST_F(TestVp8Impl, TestSwitchingToOneOddStream) {
-  TestVp8Simulcast::TestSwitchingToOneOddStream();
-}
-
-TEST_F(TestVp8Impl, TestSwitchingToOneSmallStream) {
-  TestVp8Simulcast::TestSwitchingToOneSmallStream();
-}
-
-TEST_F(TestVp8Impl, TestSaptioTemporalLayers333PatternEncoder) {
-  TestVp8Simulcast::TestSaptioTemporalLayers333PatternEncoder();
-}
-
-TEST_F(TestVp8Impl, TestSpatioTemporalLayers321PatternEncoder) {
-  TestVp8Simulcast::TestSpatioTemporalLayers321PatternEncoder();
-}
-
-TEST_F(TestVp8Impl, TestStrideEncodeDecode) {
-  TestVp8Simulcast::TestStrideEncodeDecode();
-}
-}  // namespace testing
-}  // namespace webrtc
diff --git a/modules/video_coding/codecs/vp8/temporal_layers.h b/modules/video_coding/codecs/vp8/temporal_layers.h
deleted file mode 100644
index 9c4dd57..0000000
--- a/modules/video_coding/codecs/vp8/temporal_layers.h
+++ /dev/null
@@ -1,151 +0,0 @@
-/* Copyright (c) 2011 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.
-*/
-/*
-* This file defines the interface for doing temporal layers with VP8.
-*/
-#ifndef WEBRTC_MODULES_VIDEO_CODING_CODECS_VP8_TEMPORAL_LAYERS_H_
-#define WEBRTC_MODULES_VIDEO_CODING_CODECS_VP8_TEMPORAL_LAYERS_H_
-
-#include <vector>
-
-#include "webrtc/typedefs.h"
-
-struct vpx_codec_enc_cfg;
-typedef struct vpx_codec_enc_cfg vpx_codec_enc_cfg_t;
-
-namespace webrtc {
-
-struct CodecSpecificInfoVP8;
-
-class TemporalLayers {
- public:
-  enum BufferFlags {
-    kNone = 0,
-    kReference = 1,
-    kUpdate = 2,
-    kReferenceAndUpdate = kReference | kUpdate,
-  };
-  enum FreezeEntropy { kFreezeEntropy };
-
-  struct FrameConfig {
-    FrameConfig();
-
-    FrameConfig(BufferFlags last, BufferFlags golden, BufferFlags arf);
-    FrameConfig(BufferFlags last,
-                BufferFlags golden,
-                BufferFlags arf,
-                FreezeEntropy);
-
-    bool drop_frame;
-    BufferFlags last_buffer_flags;
-    BufferFlags golden_buffer_flags;
-    BufferFlags arf_buffer_flags;
-
-    // The encoder layer ID is used to utilize the correct bitrate allocator
-    // inside the encoder. It does not control references nor determine which
-    // "actual" temporal layer this is. The packetizer temporal index determines
-    // which layer the encoded frame should be packetized into.
-    // Normally these are the same, but current temporal-layer strategies for
-    // screenshare use one bitrate allocator for all layers, but attempt to
-    // packetize / utilize references to split a stream into multiple layers,
-    // with different quantizer settings, to hit target bitrate.
-    // TODO(pbos): Screenshare layers are being reconsidered at the time of
-    // writing, we might be able to remove this distinction, and have a temporal
-    // layer imply both (the normal case).
-    int encoder_layer_id;
-    int packetizer_temporal_idx;
-
-    bool layer_sync;
-
-    bool freeze_entropy;
-
-    bool operator==(const FrameConfig& o) const {
-      return drop_frame == o.drop_frame &&
-             last_buffer_flags == o.last_buffer_flags &&
-             golden_buffer_flags == o.golden_buffer_flags &&
-             arf_buffer_flags == o.arf_buffer_flags &&
-             layer_sync == o.layer_sync && freeze_entropy == o.freeze_entropy &&
-             encoder_layer_id == o.encoder_layer_id &&
-             packetizer_temporal_idx == o.packetizer_temporal_idx;
-    }
-    bool operator!=(const FrameConfig& o) const { return !(*this == o); }
-
-   private:
-    FrameConfig(BufferFlags last,
-                BufferFlags golden,
-                BufferFlags arf,
-                bool freeze_entropy);
-  };
-
-  // Factory for TemporalLayer strategy. Default behavior is a fixed pattern
-  // of temporal layers. See default_temporal_layers.cc
-  virtual ~TemporalLayers() {}
-
-  // Returns the recommended VP8 encode flags needed. May refresh the decoder
-  // and/or update the reference buffers.
-  virtual FrameConfig UpdateLayerConfig(uint32_t timestamp) = 0;
-
-  // Update state based on new bitrate target and incoming framerate.
-  // Returns the bitrate allocation for the active temporal layers.
-  virtual std::vector<uint32_t> OnRatesUpdated(int bitrate_kbps,
-                                               int max_bitrate_kbps,
-                                               int framerate) = 0;
-
-  // Update the encoder configuration with target bitrates or other parameters.
-  // Returns true iff the configuration was actually modified.
-  virtual bool UpdateConfiguration(vpx_codec_enc_cfg_t* cfg) = 0;
-
-  virtual void PopulateCodecSpecific(
-      bool is_keyframe,
-      const TemporalLayers::FrameConfig& tl_config,
-      CodecSpecificInfoVP8* vp8_info,
-      uint32_t timestamp) = 0;
-
-  virtual void FrameEncoded(unsigned int size, int qp) = 0;
-
-  // Returns the current tl0_pic_idx, so it can be reused in future
-  // instantiations.
-  virtual uint8_t Tl0PicIdx() const = 0;
-};
-
-class TemporalLayersListener;
-class TemporalLayersFactory {
- public:
-  TemporalLayersFactory() : listener_(nullptr) {}
-  virtual ~TemporalLayersFactory() {}
-  virtual TemporalLayers* Create(int simulcast_id,
-                                 int temporal_layers,
-                                 uint8_t initial_tl0_pic_idx) const;
-  void SetListener(TemporalLayersListener* listener);
-
- protected:
-  TemporalLayersListener* listener_;
-};
-
-class ScreenshareTemporalLayersFactory : public webrtc::TemporalLayersFactory {
- public:
-  ScreenshareTemporalLayersFactory() {}
-  virtual ~ScreenshareTemporalLayersFactory() {}
-
-  webrtc::TemporalLayers* Create(int simulcast_id,
-                                 int num_temporal_layers,
-                                 uint8_t initial_tl0_pic_idx) const override;
-};
-
-class TemporalLayersListener {
- public:
-  TemporalLayersListener() {}
-  virtual ~TemporalLayersListener() {}
-
-  virtual void OnTemporalLayersCreated(int simulcast_id,
-                                       TemporalLayers* layers) = 0;
-};
-
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_VIDEO_CODING_CODECS_VP8_TEMPORAL_LAYERS_H_
diff --git a/modules/video_coding/codecs/vp8/test/vp8_impl_unittest.cc b/modules/video_coding/codecs/vp8/test/vp8_impl_unittest.cc
deleted file mode 100644
index 3eb04be..0000000
--- a/modules/video_coding/codecs/vp8/test/vp8_impl_unittest.cc
+++ /dev/null
@@ -1,467 +0,0 @@
-/*
- *  Copyright (c) 2012 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 <stdio.h>
-
-#include <memory>
-
-#include "webrtc/api/optional.h"
-#include "webrtc/api/video/i420_buffer.h"
-#include "webrtc/common_video/libyuv/include/webrtc_libyuv.h"
-#include "webrtc/modules/video_coding/codecs/test/video_codec_test.h"
-#include "webrtc/modules/video_coding/codecs/vp8/include/vp8.h"
-#include "webrtc/modules/video_coding/codecs/vp8/temporal_layers.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/timeutils.h"
-#include "webrtc/test/field_trial.h"
-#include "webrtc/test/frame_utils.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/testsupport/fileutils.h"
-#include "webrtc/test/video_codec_settings.h"
-
-namespace webrtc {
-
-namespace {
-constexpr uint32_t kInitialTimestampRtp = 123;
-constexpr int64_t kTestNtpTimeMs = 456;
-constexpr int64_t kInitialTimestampMs = 789;
-constexpr uint32_t kTimestampIncrement = 3000;
-constexpr int kNumCores = 1;
-constexpr size_t kMaxPayloadSize = 1440;
-constexpr int kMinPixelsPerFrame = 12345;
-constexpr int kDefaultMinPixelsPerFrame = 320 * 180;
-constexpr int kWidth = 172;
-constexpr int kHeight = 144;
-
-void Calc16ByteAlignedStride(int width, int* stride_y, int* stride_uv) {
-  *stride_y = 16 * ((width + 15) / 16);
-  *stride_uv = 16 * ((width + 31) / 32);
-}
-}  // namespace
-
-class EncodedImageCallbackTestImpl : public webrtc::EncodedImageCallback {
- public:
-  Result OnEncodedImage(const EncodedImage& encoded_frame,
-                        const CodecSpecificInfo* codec_specific_info,
-                        const RTPFragmentationHeader* fragmentation) override {
-    EXPECT_GT(encoded_frame._length, 0u);
-    VerifyQpParser(encoded_frame);
-
-    if (encoded_frame_._size != encoded_frame._size) {
-      delete[] encoded_frame_._buffer;
-      frame_buffer_.reset(new uint8_t[encoded_frame._size]);
-    }
-    RTC_DCHECK(frame_buffer_);
-    memcpy(frame_buffer_.get(), encoded_frame._buffer, encoded_frame._length);
-    encoded_frame_ = encoded_frame;
-    encoded_frame_._buffer = frame_buffer_.get();
-
-    // Skip |codec_name|, to avoid allocating.
-    EXPECT_STREQ("libvpx", codec_specific_info->codec_name);
-    EXPECT_EQ(kVideoCodecVP8, codec_specific_info->codecType);
-    EXPECT_EQ(0u, codec_specific_info->codecSpecific.VP8.simulcastIdx);
-    codec_specific_info_.codecType = codec_specific_info->codecType;
-    codec_specific_info_.codecSpecific = codec_specific_info->codecSpecific;
-    complete_ = true;
-    return Result(Result::OK, 0);
-  }
-
-  void VerifyQpParser(const EncodedImage& encoded_frame) const {
-    int qp;
-    ASSERT_TRUE(vp8::GetQp(encoded_frame._buffer, encoded_frame._length, &qp));
-    EXPECT_EQ(encoded_frame.qp_, qp) << "Encoder QP != parsed bitstream QP.";
-  }
-
-  bool EncodeComplete() {
-    if (complete_) {
-      complete_ = false;
-      return true;
-    }
-    return false;
-  }
-
-  EncodedImage encoded_frame_;
-  CodecSpecificInfo codec_specific_info_;
-  std::unique_ptr<uint8_t[]> frame_buffer_;
-  bool complete_ = false;
-};
-
-class DecodedImageCallbackTestImpl : public webrtc::DecodedImageCallback {
- public:
-  int32_t Decoded(VideoFrame& frame) override {
-    RTC_NOTREACHED();
-    return -1;
-  }
-  int32_t Decoded(VideoFrame& frame, int64_t decode_time_ms) override {
-    RTC_NOTREACHED();
-    return -1;
-  }
-  void Decoded(VideoFrame& frame,
-               rtc::Optional<int32_t> decode_time_ms,
-               rtc::Optional<uint8_t> qp) override {
-    EXPECT_GT(frame.width(), 0);
-    EXPECT_GT(frame.height(), 0);
-    EXPECT_TRUE(qp);
-    frame_ = rtc::Optional<VideoFrame>(frame);
-    qp_ = qp;
-    complete_ = true;
-  }
-
-  bool DecodeComplete() {
-    if (complete_) {
-      complete_ = false;
-      return true;
-    }
-    return false;
-  }
-
-  rtc::Optional<VideoFrame> frame_;
-  rtc::Optional<uint8_t> qp_;
-  bool complete_ = false;
-};
-
-class TestVp8Impl : public ::testing::Test {
- public:
-  TestVp8Impl() : TestVp8Impl("") {}
-  explicit TestVp8Impl(const std::string& field_trials)
-      : override_field_trials_(field_trials),
-        encoder_(VP8Encoder::Create()),
-        decoder_(VP8Decoder::Create()) {}
-  virtual ~TestVp8Impl() {}
-
- protected:
-  virtual void SetUp() {
-    encoder_->RegisterEncodeCompleteCallback(&encoded_cb_);
-    decoder_->RegisterDecodeCompleteCallback(&decoded_cb_);
-    SetupCodecSettings();
-    SetupInputFrame();
-  }
-
-  void SetupInputFrame() {
-    // Using a QCIF image (aligned stride (u,v planes) > width).
-    // Processing only one frame.
-    FILE* file = fopen(test::ResourcePath("paris_qcif", "yuv").c_str(), "rb");
-    ASSERT_TRUE(file != nullptr);
-    rtc::scoped_refptr<I420BufferInterface> compact_buffer(
-        test::ReadI420Buffer(kWidth, kHeight, file));
-    ASSERT_TRUE(compact_buffer);
-
-    // Setting aligned stride values.
-    int stride_uv;
-    int stride_y;
-    Calc16ByteAlignedStride(kWidth, &stride_y, &stride_uv);
-    EXPECT_EQ(stride_y, 176);
-    EXPECT_EQ(stride_uv, 96);
-    rtc::scoped_refptr<I420Buffer> stride_buffer(
-        I420Buffer::Create(kWidth, kHeight, stride_y, stride_uv, stride_uv));
-
-    // No scaling in our case, just a copy, to add stride to the image.
-    stride_buffer->ScaleFrom(*compact_buffer);
-
-    input_frame_.reset(new VideoFrame(stride_buffer, kInitialTimestampRtp,
-                                      kInitialTimestampMs, kVideoRotation_0));
-    fclose(file);
-  }
-
-  void SetupCodecSettings() {
-    webrtc::test::CodecSettings(kVideoCodecVP8, &codec_settings_);
-    codec_settings_.maxBitrate = 4000;
-    codec_settings_.width = kWidth;
-    codec_settings_.height = kHeight;
-    codec_settings_.VP8()->denoisingOn = true;
-    codec_settings_.VP8()->frameDroppingOn = false;
-    codec_settings_.VP8()->automaticResizeOn = false;
-    codec_settings_.VP8()->complexity = kComplexityNormal;
-    codec_settings_.VP8()->tl_factory = &tl_factory_;
-  }
-
-  void InitEncodeDecode() {
-    EXPECT_EQ(
-        WEBRTC_VIDEO_CODEC_OK,
-        encoder_->InitEncode(&codec_settings_, kNumCores, kMaxPayloadSize));
-    EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK,
-              decoder_->InitDecode(&codec_settings_, kNumCores));
-  }
-
-  void EncodeFrame() {
-    EXPECT_FALSE(encoded_cb_.EncodeComplete());
-    EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK,
-              encoder_->Encode(*input_frame_, nullptr, nullptr));
-    EXPECT_TRUE(encoded_cb_.EncodeComplete());
-  }
-
-  void ExpectFrameWith(int16_t picture_id,
-                       int tl0_pic_idx,
-                       uint8_t temporal_idx) {
-    EXPECT_EQ(picture_id % (1 << 15),
-              encoded_cb_.codec_specific_info_.codecSpecific.VP8.pictureId);
-    EXPECT_EQ(tl0_pic_idx % (1 << 8),
-              encoded_cb_.codec_specific_info_.codecSpecific.VP8.tl0PicIdx);
-    EXPECT_EQ(temporal_idx,
-              encoded_cb_.codec_specific_info_.codecSpecific.VP8.temporalIdx);
-  }
-
-  test::ScopedFieldTrials override_field_trials_;
-  EncodedImageCallbackTestImpl encoded_cb_;
-  DecodedImageCallbackTestImpl decoded_cb_;
-  std::unique_ptr<VideoFrame> input_frame_;
-  const std::unique_ptr<VideoEncoder> encoder_;
-  const std::unique_ptr<VideoDecoder> decoder_;
-  VideoCodec codec_settings_;
-  TemporalLayersFactory tl_factory_;
-};
-
-TEST_F(TestVp8Impl, SetRateAllocation) {
-  const int kBitrateBps = 300000;
-  BitrateAllocation bitrate_allocation;
-  bitrate_allocation.SetBitrate(0, 0, kBitrateBps);
-  EXPECT_EQ(WEBRTC_VIDEO_CODEC_UNINITIALIZED,
-            encoder_->SetRateAllocation(bitrate_allocation,
-                                        codec_settings_.maxFramerate));
-  InitEncodeDecode();
-  EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK,
-            encoder_->SetRateAllocation(bitrate_allocation,
-                                        codec_settings_.maxFramerate));
-}
-
-TEST_F(TestVp8Impl, EncodeFrameAndRelease) {
-  EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK, encoder_->Release());
-  EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK,
-            encoder_->InitEncode(&codec_settings_, kNumCores, kMaxPayloadSize));
-  EncodeFrame();
-  EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK, encoder_->Release());
-  EXPECT_EQ(WEBRTC_VIDEO_CODEC_UNINITIALIZED,
-            encoder_->Encode(*input_frame_, nullptr, nullptr));
-}
-
-TEST_F(TestVp8Impl, InitDecode) {
-  EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK, decoder_->Release());
-  EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK,
-            decoder_->InitDecode(&codec_settings_, kNumCores));
-}
-
-TEST_F(TestVp8Impl, OnEncodedImageReportsInfo) {
-  InitEncodeDecode();
-  EncodeFrame();
-  EXPECT_EQ(kInitialTimestampRtp, encoded_cb_.encoded_frame_._timeStamp);
-  EXPECT_EQ(kInitialTimestampMs, encoded_cb_.encoded_frame_.capture_time_ms_);
-  EXPECT_EQ(kWidth, static_cast<int>(encoded_cb_.encoded_frame_._encodedWidth));
-  EXPECT_EQ(kHeight,
-            static_cast<int>(encoded_cb_.encoded_frame_._encodedHeight));
-  EXPECT_EQ(-1,  // Disabled for single stream.
-            encoded_cb_.encoded_frame_.adapt_reason_.bw_resolutions_disabled);
-}
-
-// We only test the encoder here, since the decoded frame rotation is set based
-// on the CVO RTP header extension in VCMDecodedFrameCallback::Decoded.
-// TODO(brandtr): Consider passing through the rotation flag through the decoder
-// in the same way as done in the encoder.
-TEST_F(TestVp8Impl, EncodedRotationEqualsInputRotation) {
-  InitEncodeDecode();
-  input_frame_->set_rotation(kVideoRotation_0);
-  EncodeFrame();
-  EXPECT_EQ(kVideoRotation_0, encoded_cb_.encoded_frame_.rotation_);
-
-  input_frame_->set_rotation(kVideoRotation_90);
-  EncodeFrame();
-  EXPECT_EQ(kVideoRotation_90, encoded_cb_.encoded_frame_.rotation_);
-}
-
-TEST_F(TestVp8Impl, DecodedQpEqualsEncodedQp) {
-  InitEncodeDecode();
-  EncodeFrame();
-  // First frame should be a key frame.
-  encoded_cb_.encoded_frame_._frameType = kVideoFrameKey;
-  EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK,
-            decoder_->Decode(encoded_cb_.encoded_frame_, false, nullptr));
-  EXPECT_TRUE(decoded_cb_.DecodeComplete());
-  EXPECT_GT(I420PSNR(input_frame_.get(), &*decoded_cb_.frame_), 36);
-  EXPECT_EQ(encoded_cb_.encoded_frame_.qp_, *decoded_cb_.qp_);
-}
-
-#if defined(WEBRTC_ANDROID)
-#define MAYBE_AlignedStrideEncodeDecode DISABLED_AlignedStrideEncodeDecode
-#else
-#define MAYBE_AlignedStrideEncodeDecode AlignedStrideEncodeDecode
-#endif
-TEST_F(TestVp8Impl, MAYBE_AlignedStrideEncodeDecode) {
-  InitEncodeDecode();
-  EncodeFrame();
-  // First frame should be a key frame.
-  encoded_cb_.encoded_frame_._frameType = kVideoFrameKey;
-  encoded_cb_.encoded_frame_.ntp_time_ms_ = kTestNtpTimeMs;
-  EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK,
-            decoder_->Decode(encoded_cb_.encoded_frame_, false, nullptr));
-  EXPECT_TRUE(decoded_cb_.DecodeComplete());
-  // Compute PSNR on all planes (faster than SSIM).
-  EXPECT_GT(I420PSNR(input_frame_.get(), &*decoded_cb_.frame_), 36);
-  EXPECT_EQ(kInitialTimestampRtp, decoded_cb_.frame_->timestamp());
-  EXPECT_EQ(kTestNtpTimeMs, decoded_cb_.frame_->ntp_time_ms());
-}
-
-#if defined(WEBRTC_ANDROID)
-#define MAYBE_DecodeWithACompleteKeyFrame DISABLED_DecodeWithACompleteKeyFrame
-#else
-#define MAYBE_DecodeWithACompleteKeyFrame DecodeWithACompleteKeyFrame
-#endif
-TEST_F(TestVp8Impl, MAYBE_DecodeWithACompleteKeyFrame) {
-  InitEncodeDecode();
-  EncodeFrame();
-  // Setting complete to false -> should return an error.
-  encoded_cb_.encoded_frame_._completeFrame = false;
-  EXPECT_EQ(WEBRTC_VIDEO_CODEC_ERROR,
-            decoder_->Decode(encoded_cb_.encoded_frame_, false, nullptr));
-  // Setting complete back to true. Forcing a delta frame.
-  encoded_cb_.encoded_frame_._frameType = kVideoFrameDelta;
-  encoded_cb_.encoded_frame_._completeFrame = true;
-  EXPECT_EQ(WEBRTC_VIDEO_CODEC_ERROR,
-            decoder_->Decode(encoded_cb_.encoded_frame_, false, nullptr));
-  // Now setting a key frame.
-  encoded_cb_.encoded_frame_._frameType = kVideoFrameKey;
-  EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK,
-            decoder_->Decode(encoded_cb_.encoded_frame_, false, nullptr));
-  ASSERT_TRUE(decoded_cb_.frame_);
-  EXPECT_GT(I420PSNR(input_frame_.get(), &*decoded_cb_.frame_), 36);
-}
-
-TEST_F(TestVp8Impl, EncoderWith2TemporalLayersRetainsRtpStateAfterRelease) {
-  codec_settings_.VP8()->numberOfTemporalLayers = 2;
-  InitEncodeDecode();
-
-  // Temporal layer 0.
-  EncodeFrame();
-  EXPECT_EQ(0, encoded_cb_.codec_specific_info_.codecSpecific.VP8.temporalIdx);
-  int16_t picture_id =
-      encoded_cb_.codec_specific_info_.codecSpecific.VP8.pictureId;
-  int tl0_pic_idx =
-      encoded_cb_.codec_specific_info_.codecSpecific.VP8.tl0PicIdx;
-  // Temporal layer 1.
-  input_frame_->set_timestamp(input_frame_->timestamp() + kTimestampIncrement);
-  EncodeFrame();
-  ExpectFrameWith(picture_id + 1, tl0_pic_idx + 0, 1);
-  // Temporal layer 0.
-  input_frame_->set_timestamp(input_frame_->timestamp() + kTimestampIncrement);
-  EncodeFrame();
-  ExpectFrameWith(picture_id + 2, tl0_pic_idx + 1, 0);
-  // Temporal layer 1.
-  input_frame_->set_timestamp(input_frame_->timestamp() + kTimestampIncrement);
-  EncodeFrame();
-  ExpectFrameWith(picture_id + 3, tl0_pic_idx + 1, 1);
-
-  // Reinit.
-  EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK, encoder_->Release());
-  EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK,
-            encoder_->InitEncode(&codec_settings_, kNumCores, kMaxPayloadSize));
-
-  // Temporal layer 0.
-  input_frame_->set_timestamp(input_frame_->timestamp() + kTimestampIncrement);
-  EncodeFrame();
-  ExpectFrameWith(picture_id + 4, tl0_pic_idx + 2, 0);
-  // Temporal layer 1.
-  input_frame_->set_timestamp(input_frame_->timestamp() + kTimestampIncrement);
-  EncodeFrame();
-  ExpectFrameWith(picture_id + 5, tl0_pic_idx + 2, 1);
-  // Temporal layer 0.
-  input_frame_->set_timestamp(input_frame_->timestamp() + kTimestampIncrement);
-  EncodeFrame();
-  ExpectFrameWith(picture_id + 6, tl0_pic_idx + 3, 0);
-  // Temporal layer 1.
-  input_frame_->set_timestamp(input_frame_->timestamp() + kTimestampIncrement);
-  EncodeFrame();
-  ExpectFrameWith(picture_id + 7, tl0_pic_idx + 3, 1);
-}
-
-TEST_F(TestVp8Impl, EncoderWith3TemporalLayersRetainsRtpStateAfterRelease) {
-  codec_settings_.VP8()->numberOfTemporalLayers = 3;
-  InitEncodeDecode();
-
-  // Temporal layer 0.
-  EncodeFrame();
-  EXPECT_EQ(0, encoded_cb_.codec_specific_info_.codecSpecific.VP8.temporalIdx);
-  int16_t picture_id =
-      encoded_cb_.codec_specific_info_.codecSpecific.VP8.pictureId;
-  int tl0_pic_idx =
-      encoded_cb_.codec_specific_info_.codecSpecific.VP8.tl0PicIdx;
-  // Temporal layer 2.
-  input_frame_->set_timestamp(input_frame_->timestamp() + kTimestampIncrement);
-  EncodeFrame();
-  ExpectFrameWith(picture_id + 1, tl0_pic_idx + 0, 2);
-  // Temporal layer 1.
-  input_frame_->set_timestamp(input_frame_->timestamp() + kTimestampIncrement);
-  EncodeFrame();
-  ExpectFrameWith(picture_id + 2, tl0_pic_idx + 0, 1);
-  // Temporal layer 2.
-  input_frame_->set_timestamp(input_frame_->timestamp() + kTimestampIncrement);
-  EncodeFrame();
-  ExpectFrameWith(picture_id + 3, tl0_pic_idx + 0, 2);
-
-  // Reinit.
-  EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK, encoder_->Release());
-  EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK,
-            encoder_->InitEncode(&codec_settings_, kNumCores, kMaxPayloadSize));
-
-  // Temporal layer 0.
-  input_frame_->set_timestamp(input_frame_->timestamp() + kTimestampIncrement);
-  EncodeFrame();
-  ExpectFrameWith(picture_id + 4, tl0_pic_idx + 1, 0);
-  // Temporal layer 2.
-  input_frame_->set_timestamp(input_frame_->timestamp() + kTimestampIncrement);
-  EncodeFrame();
-  ExpectFrameWith(picture_id + 5, tl0_pic_idx + 1, 2);
-  // Temporal layer 1.
-  input_frame_->set_timestamp(input_frame_->timestamp() + kTimestampIncrement);
-  EncodeFrame();
-  ExpectFrameWith(picture_id + 6, tl0_pic_idx + 1, 1);
-  // Temporal layer 2.
-  input_frame_->set_timestamp(input_frame_->timestamp() + kTimestampIncrement);
-  EncodeFrame();
-  ExpectFrameWith(picture_id + 7, tl0_pic_idx + 1, 2);
-}
-
-TEST_F(TestVp8Impl, ScalingDisabledIfAutomaticResizeOff) {
-  codec_settings_.VP8()->frameDroppingOn = true;
-  codec_settings_.VP8()->automaticResizeOn = false;
-  EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK,
-            encoder_->InitEncode(&codec_settings_, kNumCores, kMaxPayloadSize));
-
-  VideoEncoder::ScalingSettings settings = encoder_->GetScalingSettings();
-  EXPECT_FALSE(settings.enabled);
-}
-
-TEST_F(TestVp8Impl, ScalingEnabledIfAutomaticResizeOn) {
-  codec_settings_.VP8()->frameDroppingOn = true;
-  codec_settings_.VP8()->automaticResizeOn = true;
-  EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK,
-            encoder_->InitEncode(&codec_settings_, kNumCores, kMaxPayloadSize));
-
-  VideoEncoder::ScalingSettings settings = encoder_->GetScalingSettings();
-  EXPECT_TRUE(settings.enabled);
-  EXPECT_EQ(kDefaultMinPixelsPerFrame, settings.min_pixels_per_frame);
-}
-
-class TestVp8ImplWithForcedFallbackEnabled : public TestVp8Impl {
- public:
-  TestVp8ImplWithForcedFallbackEnabled()
-      : TestVp8Impl("WebRTC-VP8-Forced-Fallback-Encoder/Enabled-1,2,3," +
-                    std::to_string(kMinPixelsPerFrame) + "/") {}
-};
-
-TEST_F(TestVp8ImplWithForcedFallbackEnabled, MinPixelsPerFrameConfigured) {
-  codec_settings_.VP8()->frameDroppingOn = true;
-  codec_settings_.VP8()->automaticResizeOn = true;
-  EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK,
-            encoder_->InitEncode(&codec_settings_, kNumCores, kMaxPayloadSize));
-
-  VideoEncoder::ScalingSettings settings = encoder_->GetScalingSettings();
-  EXPECT_TRUE(settings.enabled);
-  EXPECT_EQ(kMinPixelsPerFrame, settings.min_pixels_per_frame);
-}
-
-}  // namespace webrtc
diff --git a/modules/video_coding/codecs/vp8/vp8_impl.cc b/modules/video_coding/codecs/vp8/vp8_impl.cc
deleted file mode 100644
index 8d10594..0000000
--- a/modules/video_coding/codecs/vp8/vp8_impl.cc
+++ /dev/null
@@ -1,1270 +0,0 @@
-/*
- *  Copyright (c) 2012 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/video_coding/codecs/vp8/vp8_impl.h"
-
-#include <stdlib.h>
-#include <string.h>
-#include <time.h>
-#include <algorithm>
-#include <string>
-
-// NOTE(ajm): Path provided by gyp.
-#include "libyuv/scale.h"    // NOLINT
-#include "libyuv/convert.h"  // NOLINT
-
-#include "webrtc/common_types.h"
-#include "webrtc/common_video/libyuv/include/webrtc_libyuv.h"
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/modules/video_coding/codecs/vp8/include/vp8_common_types.h"
-#include "webrtc/modules/video_coding/codecs/vp8/screenshare_layers.h"
-#include "webrtc/modules/video_coding/codecs/vp8/simulcast_rate_allocator.h"
-#include "webrtc/modules/video_coding/codecs/vp8/temporal_layers.h"
-#include "webrtc/modules/video_coding/include/video_codec_interface.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/numerics/exp_filter.h"
-#include "webrtc/rtc_base/random.h"
-#include "webrtc/rtc_base/timeutils.h"
-#include "webrtc/rtc_base/trace_event.h"
-#include "webrtc/system_wrappers/include/clock.h"
-#include "webrtc/system_wrappers/include/field_trial.h"
-#include "webrtc/system_wrappers/include/metrics.h"
-
-namespace webrtc {
-namespace {
-
-const char kVp8PostProcArmFieldTrial[] = "WebRTC-VP8-Postproc-Config-Arm";
-const char kVp8GfBoostFieldTrial[] = "WebRTC-VP8-GfBoost";
-const char kVp8ForceFallbackEncoderFieldTrial[] =
-    "WebRTC-VP8-Forced-Fallback-Encoder";
-
-const int kTokenPartitions = VP8_ONE_TOKENPARTITION;
-enum { kVp8ErrorPropagationTh = 30 };
-enum { kVp832ByteAlign = 32 };
-
-// VP8 denoiser states.
-enum denoiserState {
-  kDenoiserOff,
-  kDenoiserOnYOnly,
-  kDenoiserOnYUV,
-  kDenoiserOnYUVAggressive,
-  // Adaptive mode defaults to kDenoiserOnYUV on key frame, but may switch
-  // to kDenoiserOnYUVAggressive based on a computed noise metric.
-  kDenoiserOnAdaptive
-};
-
-// Greatest common divisior
-int GCD(int a, int b) {
-  int c = a % b;
-  while (c != 0) {
-    a = b;
-    b = c;
-    c = a % b;
-  }
-  return b;
-}
-
-uint32_t SumStreamMaxBitrate(int streams, const VideoCodec& codec) {
-  uint32_t bitrate_sum = 0;
-  for (int i = 0; i < streams; ++i) {
-    bitrate_sum += codec.simulcastStream[i].maxBitrate;
-  }
-  return bitrate_sum;
-}
-
-int NumberOfStreams(const VideoCodec& codec) {
-  int streams =
-      codec.numberOfSimulcastStreams < 1 ? 1 : codec.numberOfSimulcastStreams;
-  uint32_t simulcast_max_bitrate = SumStreamMaxBitrate(streams, codec);
-  if (simulcast_max_bitrate == 0) {
-    streams = 1;
-  }
-  return streams;
-}
-
-bool ValidSimulcastResolutions(const VideoCodec& codec, int num_streams) {
-  if (codec.width != codec.simulcastStream[num_streams - 1].width ||
-      codec.height != codec.simulcastStream[num_streams - 1].height) {
-    return false;
-  }
-  for (int i = 0; i < num_streams; ++i) {
-    if (codec.width * codec.simulcastStream[i].height !=
-        codec.height * codec.simulcastStream[i].width) {
-      return false;
-    }
-  }
-  return true;
-}
-
-int NumStreamsDisabled(const std::vector<bool>& streams) {
-  int num_disabled = 0;
-  for (bool stream : streams) {
-    if (!stream)
-      ++num_disabled;
-  }
-  return num_disabled;
-}
-
-rtc::Optional<int> GetForcedFallbackMinPixelsFromFieldTrialGroup() {
-  if (!webrtc::field_trial::IsEnabled(kVp8ForceFallbackEncoderFieldTrial))
-    return rtc::Optional<int>();
-
-  std::string group =
-      webrtc::field_trial::FindFullName(kVp8ForceFallbackEncoderFieldTrial);
-  if (group.empty())
-    return rtc::Optional<int>();
-
-  int low_kbps;
-  int high_kbps;
-  int min_low_ms;
-  int min_pixels;
-  if (sscanf(group.c_str(), "Enabled-%d,%d,%d,%d", &low_kbps, &high_kbps,
-             &min_low_ms, &min_pixels) != 4) {
-    return rtc::Optional<int>();
-  }
-
-  if (min_low_ms <= 0 || min_pixels <= 0 || low_kbps <= 0 ||
-      high_kbps <= low_kbps) {
-    return rtc::Optional<int>();
-  }
-  return rtc::Optional<int>(min_pixels);
-}
-
-bool GetGfBoostPercentageFromFieldTrialGroup(int* boost_percentage) {
-  std::string group = webrtc::field_trial::FindFullName(kVp8GfBoostFieldTrial);
-  if (group.empty())
-    return false;
-
-  if (sscanf(group.c_str(), "Enabled-%d", boost_percentage) != 1)
-    return false;
-
-  if (*boost_percentage < 0 || *boost_percentage > 100)
-    return false;
-
-  return true;
-}
-
-void GetPostProcParamsFromFieldTrialGroup(
-    VP8DecoderImpl::DeblockParams* deblock_params) {
-  std::string group =
-      webrtc::field_trial::FindFullName(kVp8PostProcArmFieldTrial);
-  if (group.empty())
-    return;
-
-  VP8DecoderImpl::DeblockParams params;
-  if (sscanf(group.c_str(), "Enabled-%d,%d,%d", &params.max_level,
-             &params.min_qp, &params.degrade_qp) != 3)
-    return;
-
-  if (params.max_level < 0 || params.max_level > 16)
-    return;
-
-  if (params.min_qp < 0 || params.degrade_qp <= params.min_qp)
-    return;
-
-  *deblock_params = params;
-}
-
-}  // namespace
-
-VP8Encoder* VP8Encoder::Create() {
-  return new VP8EncoderImpl();
-}
-
-VP8Decoder* VP8Decoder::Create() {
-  return new VP8DecoderImpl();
-}
-
-vpx_enc_frame_flags_t VP8EncoderImpl::EncodeFlags(
-    const TemporalLayers::FrameConfig& references) {
-  RTC_DCHECK(!references.drop_frame);
-
-  vpx_enc_frame_flags_t flags = 0;
-
-  if ((references.last_buffer_flags & TemporalLayers::kReference) == 0)
-    flags |= VP8_EFLAG_NO_REF_LAST;
-  if ((references.last_buffer_flags & TemporalLayers::kUpdate) == 0)
-    flags |= VP8_EFLAG_NO_UPD_LAST;
-  if ((references.golden_buffer_flags & TemporalLayers::kReference) == 0)
-    flags |= VP8_EFLAG_NO_REF_GF;
-  if ((references.golden_buffer_flags & TemporalLayers::kUpdate) == 0)
-    flags |= VP8_EFLAG_NO_UPD_GF;
-  if ((references.arf_buffer_flags & TemporalLayers::kReference) == 0)
-    flags |= VP8_EFLAG_NO_REF_ARF;
-  if ((references.arf_buffer_flags & TemporalLayers::kUpdate) == 0)
-    flags |= VP8_EFLAG_NO_UPD_ARF;
-  if (references.freeze_entropy)
-    flags |= VP8_EFLAG_NO_UPD_ENTROPY;
-
-  return flags;
-}
-
-VP8EncoderImpl::VP8EncoderImpl()
-    : use_gf_boost_(webrtc::field_trial::IsEnabled(kVp8GfBoostFieldTrial)),
-      min_pixels_per_frame_(GetForcedFallbackMinPixelsFromFieldTrialGroup()),
-      encoded_complete_callback_(nullptr),
-      inited_(false),
-      timestamp_(0),
-      qp_max_(56),  // Setting for max quantizer.
-      cpu_speed_default_(-6),
-      number_of_cores_(0),
-      rc_max_intra_target_(0),
-      key_frame_request_(kMaxSimulcastStreams, false) {
-  Random random(rtc::TimeMicros());
-  picture_id_.reserve(kMaxSimulcastStreams);
-  for (int i = 0; i < kMaxSimulcastStreams; ++i) {
-    picture_id_.push_back(random.Rand<uint16_t>() & 0x7FFF);
-    tl0_pic_idx_.push_back(random.Rand<uint8_t>());
-  }
-  temporal_layers_.reserve(kMaxSimulcastStreams);
-  raw_images_.reserve(kMaxSimulcastStreams);
-  encoded_images_.reserve(kMaxSimulcastStreams);
-  send_stream_.reserve(kMaxSimulcastStreams);
-  cpu_speed_.assign(kMaxSimulcastStreams, cpu_speed_default_);
-  encoders_.reserve(kMaxSimulcastStreams);
-  configurations_.reserve(kMaxSimulcastStreams);
-  downsampling_factors_.reserve(kMaxSimulcastStreams);
-}
-
-VP8EncoderImpl::~VP8EncoderImpl() {
-  Release();
-}
-
-int VP8EncoderImpl::Release() {
-  int ret_val = WEBRTC_VIDEO_CODEC_OK;
-
-  while (!encoded_images_.empty()) {
-    EncodedImage& image = encoded_images_.back();
-    delete[] image._buffer;
-    encoded_images_.pop_back();
-  }
-  while (!encoders_.empty()) {
-    vpx_codec_ctx_t& encoder = encoders_.back();
-    if (vpx_codec_destroy(&encoder)) {
-      ret_val = WEBRTC_VIDEO_CODEC_MEMORY;
-    }
-    encoders_.pop_back();
-  }
-  configurations_.clear();
-  send_stream_.clear();
-  cpu_speed_.clear();
-  while (!raw_images_.empty()) {
-    vpx_img_free(&raw_images_.back());
-    raw_images_.pop_back();
-  }
-  for (size_t i = 0; i < temporal_layers_.size(); ++i) {
-    tl0_pic_idx_[i] = temporal_layers_[i]->Tl0PicIdx();
-  }
-  temporal_layers_.clear();
-  inited_ = false;
-  return ret_val;
-}
-
-int VP8EncoderImpl::SetRateAllocation(const BitrateAllocation& bitrate,
-                                      uint32_t new_framerate) {
-  if (!inited_)
-    return WEBRTC_VIDEO_CODEC_UNINITIALIZED;
-
-  if (encoders_[0].err)
-    return WEBRTC_VIDEO_CODEC_ERROR;
-
-  if (new_framerate < 1)
-    return WEBRTC_VIDEO_CODEC_ERR_PARAMETER;
-
-  if (bitrate.get_sum_bps() == 0) {
-    // Encoder paused, turn off all encoding.
-    const int num_streams = static_cast<size_t>(encoders_.size());
-    for (int i = 0; i < num_streams; ++i)
-      SetStreamState(false, i);
-    return WEBRTC_VIDEO_CODEC_OK;
-  }
-
-  // At this point, bitrate allocation should already match codec settings.
-  if (codec_.maxBitrate > 0)
-    RTC_DCHECK_LE(bitrate.get_sum_kbps(), codec_.maxBitrate);
-  RTC_DCHECK_GE(bitrate.get_sum_kbps(), codec_.minBitrate);
-  if (codec_.numberOfSimulcastStreams > 0)
-    RTC_DCHECK_GE(bitrate.get_sum_kbps(), codec_.simulcastStream[0].minBitrate);
-
-  codec_.maxFramerate = new_framerate;
-
-  if (encoders_.size() > 1) {
-    // If we have more than 1 stream, reduce the qp_max for the low resolution
-    // stream if frame rate is not too low. The trade-off with lower qp_max is
-    // possibly more dropped frames, so we only do this if the frame rate is
-    // above some threshold (base temporal layer is down to 1/4 for 3 layers).
-    // We may want to condition this on bitrate later.
-    if (new_framerate > 20) {
-      configurations_[encoders_.size() - 1].rc_max_quantizer = 45;
-    } else {
-      // Go back to default value set in InitEncode.
-      configurations_[encoders_.size() - 1].rc_max_quantizer = qp_max_;
-    }
-  }
-
-  size_t stream_idx = encoders_.size() - 1;
-  for (size_t i = 0; i < encoders_.size(); ++i, --stream_idx) {
-    unsigned int target_bitrate_kbps =
-        bitrate.GetSpatialLayerSum(stream_idx) / 1000;
-
-    bool send_stream = target_bitrate_kbps > 0;
-    if (send_stream || encoders_.size() > 1)
-      SetStreamState(send_stream, stream_idx);
-
-    configurations_[i].rc_target_bitrate = target_bitrate_kbps;
-    temporal_layers_[stream_idx]->UpdateConfiguration(&configurations_[i]);
-
-    if (vpx_codec_enc_config_set(&encoders_[i], &configurations_[i])) {
-      return WEBRTC_VIDEO_CODEC_ERROR;
-    }
-  }
-  return WEBRTC_VIDEO_CODEC_OK;
-}
-
-const char* VP8EncoderImpl::ImplementationName() const {
-  return "libvpx";
-}
-
-void VP8EncoderImpl::SetStreamState(bool send_stream,
-                                            int stream_idx) {
-  if (send_stream && !send_stream_[stream_idx]) {
-    // Need a key frame if we have not sent this stream before.
-    key_frame_request_[stream_idx] = true;
-  }
-  send_stream_[stream_idx] = send_stream;
-}
-
-void VP8EncoderImpl::SetupTemporalLayers(int num_streams,
-                                         int num_temporal_layers,
-                                         const VideoCodec& codec) {
-  RTC_DCHECK(codec.VP8().tl_factory != nullptr);
-  const TemporalLayersFactory* tl_factory = codec.VP8().tl_factory;
-  if (num_streams == 1) {
-    temporal_layers_.emplace_back(
-        tl_factory->Create(0, num_temporal_layers, tl0_pic_idx_[0]));
-  } else {
-    for (int i = 0; i < num_streams; ++i) {
-      RTC_CHECK_GT(num_temporal_layers, 0);
-      int layers = std::max(static_cast<uint8_t>(1),
-                            codec.simulcastStream[i].numberOfTemporalLayers);
-      temporal_layers_.emplace_back(
-          tl_factory->Create(i, layers, tl0_pic_idx_[i]));
-    }
-  }
-}
-
-int VP8EncoderImpl::InitEncode(const VideoCodec* inst,
-                               int number_of_cores,
-                               size_t /*maxPayloadSize */) {
-  if (inst == NULL) {
-    return WEBRTC_VIDEO_CODEC_ERR_PARAMETER;
-  }
-  if (inst->maxFramerate < 1) {
-    return WEBRTC_VIDEO_CODEC_ERR_PARAMETER;
-  }
-  // allow zero to represent an unspecified maxBitRate
-  if (inst->maxBitrate > 0 && inst->startBitrate > inst->maxBitrate) {
-    return WEBRTC_VIDEO_CODEC_ERR_PARAMETER;
-  }
-  if (inst->width <= 1 || inst->height <= 1) {
-    return WEBRTC_VIDEO_CODEC_ERR_PARAMETER;
-  }
-  if (number_of_cores < 1) {
-    return WEBRTC_VIDEO_CODEC_ERR_PARAMETER;
-  }
-  if (inst->VP8().automaticResizeOn && inst->numberOfSimulcastStreams > 1) {
-    return WEBRTC_VIDEO_CODEC_ERR_PARAMETER;
-  }
-  int retVal = Release();
-  if (retVal < 0) {
-    return retVal;
-  }
-
-  int number_of_streams = NumberOfStreams(*inst);
-  bool doing_simulcast = (number_of_streams > 1);
-
-  if (doing_simulcast && !ValidSimulcastResolutions(*inst, number_of_streams)) {
-    return WEBRTC_VIDEO_CODEC_ERR_PARAMETER;
-  }
-
-  int num_temporal_layers =
-      doing_simulcast ? inst->simulcastStream[0].numberOfTemporalLayers
-                      : inst->VP8().numberOfTemporalLayers;
-  RTC_DCHECK_GT(num_temporal_layers, 0);
-
-  SetupTemporalLayers(number_of_streams, num_temporal_layers, *inst);
-
-  number_of_cores_ = number_of_cores;
-  timestamp_ = 0;
-  codec_ = *inst;
-
-  // Code expects simulcastStream resolutions to be correct, make sure they are
-  // filled even when there are no simulcast layers.
-  if (codec_.numberOfSimulcastStreams == 0) {
-    codec_.simulcastStream[0].width = codec_.width;
-    codec_.simulcastStream[0].height = codec_.height;
-  }
-
-  encoded_images_.resize(number_of_streams);
-  encoders_.resize(number_of_streams);
-  configurations_.resize(number_of_streams);
-  downsampling_factors_.resize(number_of_streams);
-  raw_images_.resize(number_of_streams);
-  send_stream_.resize(number_of_streams);
-  send_stream_[0] = true;  // For non-simulcast case.
-  cpu_speed_.resize(number_of_streams);
-  std::fill(key_frame_request_.begin(), key_frame_request_.end(), false);
-
-  int idx = number_of_streams - 1;
-  for (int i = 0; i < (number_of_streams - 1); ++i, --idx) {
-    int gcd = GCD(inst->simulcastStream[idx].width,
-                  inst->simulcastStream[idx - 1].width);
-    downsampling_factors_[i].num = inst->simulcastStream[idx].width / gcd;
-    downsampling_factors_[i].den = inst->simulcastStream[idx - 1].width / gcd;
-    send_stream_[i] = false;
-  }
-  if (number_of_streams > 1) {
-    send_stream_[number_of_streams - 1] = false;
-    downsampling_factors_[number_of_streams - 1].num = 1;
-    downsampling_factors_[number_of_streams - 1].den = 1;
-  }
-  for (int i = 0; i < number_of_streams; ++i) {
-    // allocate memory for encoded image
-    if (encoded_images_[i]._buffer != NULL) {
-      delete[] encoded_images_[i]._buffer;
-    }
-    encoded_images_[i]._size =
-        CalcBufferSize(VideoType::kI420, codec_.width, codec_.height);
-    encoded_images_[i]._buffer = new uint8_t[encoded_images_[i]._size];
-    encoded_images_[i]._completeFrame = true;
-  }
-  // populate encoder configuration with default values
-  if (vpx_codec_enc_config_default(vpx_codec_vp8_cx(), &configurations_[0],
-                                   0)) {
-    return WEBRTC_VIDEO_CODEC_ERROR;
-  }
-  // setting the time base of the codec
-  configurations_[0].g_timebase.num = 1;
-  configurations_[0].g_timebase.den = 90000;
-  configurations_[0].g_lag_in_frames = 0;  // 0- no frame lagging
-
-  // Set the error resilience mode according to user settings.
-  switch (inst->VP8().resilience) {
-    case kResilienceOff:
-      configurations_[0].g_error_resilient = 0;
-      break;
-    case kResilientStream:
-      configurations_[0].g_error_resilient = VPX_ERROR_RESILIENT_DEFAULT;
-      break;
-    case kResilientFrames:
-      return WEBRTC_VIDEO_CODEC_ERR_PARAMETER;  // Not supported
-  }
-
-  // rate control settings
-  configurations_[0].rc_dropframe_thresh = inst->VP8().frameDroppingOn ? 30 : 0;
-  configurations_[0].rc_end_usage = VPX_CBR;
-  configurations_[0].g_pass = VPX_RC_ONE_PASS;
-  // Handle resizing outside of libvpx.
-  configurations_[0].rc_resize_allowed = 0;
-  configurations_[0].rc_min_quantizer = 2;
-  if (inst->qpMax >= configurations_[0].rc_min_quantizer) {
-    qp_max_ = inst->qpMax;
-  }
-  configurations_[0].rc_max_quantizer = qp_max_;
-  configurations_[0].rc_undershoot_pct = 100;
-  configurations_[0].rc_overshoot_pct = 15;
-  configurations_[0].rc_buf_initial_sz = 500;
-  configurations_[0].rc_buf_optimal_sz = 600;
-  configurations_[0].rc_buf_sz = 1000;
-
-  // Set the maximum target size of any key-frame.
-  rc_max_intra_target_ = MaxIntraTarget(configurations_[0].rc_buf_optimal_sz);
-
-  if (inst->VP8().keyFrameInterval > 0) {
-    configurations_[0].kf_mode = VPX_KF_AUTO;
-    configurations_[0].kf_max_dist = inst->VP8().keyFrameInterval;
-  } else {
-    configurations_[0].kf_mode = VPX_KF_DISABLED;
-  }
-
-  // Allow the user to set the complexity for the base stream.
-  switch (inst->VP8().complexity) {
-    case kComplexityHigh:
-      cpu_speed_[0] = -5;
-      break;
-    case kComplexityHigher:
-      cpu_speed_[0] = -4;
-      break;
-    case kComplexityMax:
-      cpu_speed_[0] = -3;
-      break;
-    default:
-      cpu_speed_[0] = -6;
-      break;
-  }
-  cpu_speed_default_ = cpu_speed_[0];
-  // Set encoding complexity (cpu_speed) based on resolution and/or platform.
-  cpu_speed_[0] = SetCpuSpeed(inst->width, inst->height);
-  for (int i = 1; i < number_of_streams; ++i) {
-    cpu_speed_[i] =
-        SetCpuSpeed(inst->simulcastStream[number_of_streams - 1 - i].width,
-                    inst->simulcastStream[number_of_streams - 1 - i].height);
-  }
-  configurations_[0].g_w = inst->width;
-  configurations_[0].g_h = inst->height;
-
-  // Determine number of threads based on the image size and #cores.
-  // TODO(fbarchard): Consider number of Simulcast layers.
-  configurations_[0].g_threads = NumberOfThreads(
-      configurations_[0].g_w, configurations_[0].g_h, number_of_cores);
-
-  // Creating a wrapper to the image - setting image data to NULL.
-  // Actual pointer will be set in encode. Setting align to 1, as it
-  // is meaningless (no memory allocation is done here).
-  vpx_img_wrap(&raw_images_[0], VPX_IMG_FMT_I420, inst->width, inst->height, 1,
-               NULL);
-
-  // Note the order we use is different from webm, we have lowest resolution
-  // at position 0 and they have highest resolution at position 0.
-  int stream_idx = encoders_.size() - 1;
-  SimulcastRateAllocator init_allocator(codec_, nullptr);
-  BitrateAllocation allocation = init_allocator.GetAllocation(
-      inst->startBitrate * 1000, inst->maxFramerate);
-  std::vector<uint32_t> stream_bitrates;
-  for (int i = 0; i == 0 || i < inst->numberOfSimulcastStreams; ++i) {
-    uint32_t bitrate = allocation.GetSpatialLayerSum(i) / 1000;
-    stream_bitrates.push_back(bitrate);
-  }
-
-  configurations_[0].rc_target_bitrate = stream_bitrates[stream_idx];
-  temporal_layers_[stream_idx]->OnRatesUpdated(
-      stream_bitrates[stream_idx], inst->maxBitrate, inst->maxFramerate);
-  temporal_layers_[stream_idx]->UpdateConfiguration(&configurations_[0]);
-  --stream_idx;
-  for (size_t i = 1; i < encoders_.size(); ++i, --stream_idx) {
-    memcpy(&configurations_[i], &configurations_[0],
-           sizeof(configurations_[0]));
-
-    configurations_[i].g_w = inst->simulcastStream[stream_idx].width;
-    configurations_[i].g_h = inst->simulcastStream[stream_idx].height;
-
-    // Use 1 thread for lower resolutions.
-    configurations_[i].g_threads = 1;
-
-    // Setting alignment to 32 - as that ensures at least 16 for all
-    // planes (32 for Y, 16 for U,V). Libvpx sets the requested stride for
-    // the y plane, but only half of it to the u and v planes.
-    vpx_img_alloc(&raw_images_[i], VPX_IMG_FMT_I420,
-                  inst->simulcastStream[stream_idx].width,
-                  inst->simulcastStream[stream_idx].height, kVp832ByteAlign);
-    SetStreamState(stream_bitrates[stream_idx] > 0, stream_idx);
-    configurations_[i].rc_target_bitrate = stream_bitrates[stream_idx];
-    temporal_layers_[stream_idx]->OnRatesUpdated(
-        stream_bitrates[stream_idx], inst->maxBitrate, inst->maxFramerate);
-    temporal_layers_[stream_idx]->UpdateConfiguration(&configurations_[i]);
-  }
-
-  return InitAndSetControlSettings();
-}
-
-int VP8EncoderImpl::SetCpuSpeed(int width, int height) {
-#if defined(WEBRTC_ARCH_ARM) || defined(WEBRTC_ARCH_ARM64) || defined(ANDROID)
-  // On mobile platform, use a lower speed setting for lower resolutions for
-  // CPUs with 4 or more cores.
-  RTC_DCHECK_GT(number_of_cores_, 0);
-  if (number_of_cores_ <= 3)
-    return -12;
-
-  if (width * height <= 352 * 288)
-    return -8;
-  else if (width * height <= 640 * 480)
-    return -10;
-  else
-    return -12;
-#else
-  // For non-ARM, increase encoding complexity (i.e., use lower speed setting)
-  // if resolution is below CIF. Otherwise, keep the default/user setting
-  // (|cpu_speed_default_|) set on InitEncode via VP8().complexity.
-  if (width * height < 352 * 288)
-    return (cpu_speed_default_ < -4) ? -4 : cpu_speed_default_;
-  else
-    return cpu_speed_default_;
-#endif
-}
-
-int VP8EncoderImpl::NumberOfThreads(int width, int height, int cpus) {
-#if defined(ANDROID)
-  if (width * height >= 320 * 180) {
-    if (cpus >= 4) {
-      // 3 threads for CPUs with 4 and more cores since most of times only 4
-      // cores will be active.
-      return 3;
-    } else if (cpus == 3 || cpus == 2) {
-      return 2;
-    } else {
-      return 1;
-    }
-  }
-  return 1;
-#else
-  if (width * height >= 1920 * 1080 && cpus > 8) {
-    return 8;  // 8 threads for 1080p on high perf machines.
-  } else if (width * height > 1280 * 960 && cpus >= 6) {
-    // 3 threads for 1080p.
-    return 3;
-  } else if (width * height > 640 * 480 && cpus >= 3) {
-    // 2 threads for qHD/HD.
-    return 2;
-  } else {
-    // 1 thread for VGA or less.
-    return 1;
-  }
-#endif
-}
-
-int VP8EncoderImpl::InitAndSetControlSettings() {
-  vpx_codec_flags_t flags = 0;
-  flags |= VPX_CODEC_USE_OUTPUT_PARTITION;
-
-  if (encoders_.size() > 1) {
-    int error = vpx_codec_enc_init_multi(&encoders_[0], vpx_codec_vp8_cx(),
-                                         &configurations_[0], encoders_.size(),
-                                         flags, &downsampling_factors_[0]);
-    if (error) {
-      return WEBRTC_VIDEO_CODEC_UNINITIALIZED;
-    }
-  } else {
-    if (vpx_codec_enc_init(&encoders_[0], vpx_codec_vp8_cx(),
-                           &configurations_[0], flags)) {
-      return WEBRTC_VIDEO_CODEC_UNINITIALIZED;
-    }
-  }
-  // Enable denoising for the highest resolution stream, and for
-  // the second highest resolution if we are doing more than 2
-  // spatial layers/streams.
-  // TODO(holmer): Investigate possibility of adding a libvpx API
-  // for getting the denoised frame from the encoder and using that
-  // when encoding lower resolution streams. Would it work with the
-  // multi-res encoding feature?
-  denoiserState denoiser_state = kDenoiserOnYOnly;
-#if defined(WEBRTC_ARCH_ARM) || defined(WEBRTC_ARCH_ARM64) || defined(ANDROID)
-  denoiser_state = kDenoiserOnYOnly;
-#else
-  denoiser_state = kDenoiserOnAdaptive;
-#endif
-  vpx_codec_control(&encoders_[0], VP8E_SET_NOISE_SENSITIVITY,
-                    codec_.VP8()->denoisingOn ? denoiser_state : kDenoiserOff);
-  if (encoders_.size() > 2) {
-    vpx_codec_control(
-        &encoders_[1], VP8E_SET_NOISE_SENSITIVITY,
-        codec_.VP8()->denoisingOn ? denoiser_state : kDenoiserOff);
-  }
-  for (size_t i = 0; i < encoders_.size(); ++i) {
-    // Allow more screen content to be detected as static.
-    vpx_codec_control(&(encoders_[i]), VP8E_SET_STATIC_THRESHOLD,
-                      codec_.mode == kScreensharing ? 300 : 1);
-    vpx_codec_control(&(encoders_[i]), VP8E_SET_CPUUSED, cpu_speed_[i]);
-    vpx_codec_control(&(encoders_[i]), VP8E_SET_TOKEN_PARTITIONS,
-                      static_cast<vp8e_token_partitions>(kTokenPartitions));
-    vpx_codec_control(&(encoders_[i]), VP8E_SET_MAX_INTRA_BITRATE_PCT,
-                      rc_max_intra_target_);
-    // VP8E_SET_SCREEN_CONTENT_MODE 2 = screen content with more aggressive
-    // rate control (drop frames on large target bitrate overshoot)
-    vpx_codec_control(&(encoders_[i]), VP8E_SET_SCREEN_CONTENT_MODE,
-                      codec_.mode == kScreensharing ? 2 : 0);
-    // Apply boost on golden frames (has only effect when resilience is off).
-    if (use_gf_boost_ && codec_.VP8()->resilience == kResilienceOff) {
-      int gf_boost_percent;
-      if (GetGfBoostPercentageFromFieldTrialGroup(&gf_boost_percent)) {
-        vpx_codec_control(&(encoders_[i]), VP8E_SET_GF_CBR_BOOST_PCT,
-                          gf_boost_percent);
-      }
-    }
-  }
-  inited_ = true;
-  return WEBRTC_VIDEO_CODEC_OK;
-}
-
-uint32_t VP8EncoderImpl::MaxIntraTarget(uint32_t optimalBuffersize) {
-  // Set max to the optimal buffer level (normalized by target BR),
-  // and scaled by a scalePar.
-  // Max target size = scalePar * optimalBufferSize * targetBR[Kbps].
-  // This values is presented in percentage of perFrameBw:
-  // perFrameBw = targetBR[Kbps] * 1000 / frameRate.
-  // The target in % is as follows:
-
-  float scalePar = 0.5;
-  uint32_t targetPct = optimalBuffersize * scalePar * codec_.maxFramerate / 10;
-
-  // Don't go below 3 times the per frame bandwidth.
-  const uint32_t minIntraTh = 300;
-  return (targetPct < minIntraTh) ? minIntraTh : targetPct;
-}
-
-int VP8EncoderImpl::Encode(const VideoFrame& frame,
-                           const CodecSpecificInfo* codec_specific_info,
-                           const std::vector<FrameType>* frame_types) {
-  RTC_DCHECK_EQ(frame.width(), codec_.width);
-  RTC_DCHECK_EQ(frame.height(), codec_.height);
-
-  if (!inited_)
-    return WEBRTC_VIDEO_CODEC_UNINITIALIZED;
-  if (encoded_complete_callback_ == NULL)
-    return WEBRTC_VIDEO_CODEC_UNINITIALIZED;
-
-  rtc::scoped_refptr<I420BufferInterface> input_image =
-      frame.video_frame_buffer()->ToI420();
-  // Since we are extracting raw pointers from |input_image| to
-  // |raw_images_[0]|, the resolution of these frames must match.
-  RTC_DCHECK_EQ(input_image->width(), raw_images_[0].d_w);
-  RTC_DCHECK_EQ(input_image->height(), raw_images_[0].d_h);
-
-  // Image in vpx_image_t format.
-  // Input image is const. VP8's raw image is not defined as const.
-  raw_images_[0].planes[VPX_PLANE_Y] =
-      const_cast<uint8_t*>(input_image->DataY());
-  raw_images_[0].planes[VPX_PLANE_U] =
-      const_cast<uint8_t*>(input_image->DataU());
-  raw_images_[0].planes[VPX_PLANE_V] =
-      const_cast<uint8_t*>(input_image->DataV());
-
-  raw_images_[0].stride[VPX_PLANE_Y] = input_image->StrideY();
-  raw_images_[0].stride[VPX_PLANE_U] = input_image->StrideU();
-  raw_images_[0].stride[VPX_PLANE_V] = input_image->StrideV();
-
-  for (size_t i = 1; i < encoders_.size(); ++i) {
-    // Scale the image down a number of times by downsampling factor
-    libyuv::I420Scale(
-        raw_images_[i - 1].planes[VPX_PLANE_Y],
-        raw_images_[i - 1].stride[VPX_PLANE_Y],
-        raw_images_[i - 1].planes[VPX_PLANE_U],
-        raw_images_[i - 1].stride[VPX_PLANE_U],
-        raw_images_[i - 1].planes[VPX_PLANE_V],
-        raw_images_[i - 1].stride[VPX_PLANE_V], raw_images_[i - 1].d_w,
-        raw_images_[i - 1].d_h, raw_images_[i].planes[VPX_PLANE_Y],
-        raw_images_[i].stride[VPX_PLANE_Y], raw_images_[i].planes[VPX_PLANE_U],
-        raw_images_[i].stride[VPX_PLANE_U], raw_images_[i].planes[VPX_PLANE_V],
-        raw_images_[i].stride[VPX_PLANE_V], raw_images_[i].d_w,
-        raw_images_[i].d_h, libyuv::kFilterBilinear);
-  }
-  vpx_enc_frame_flags_t flags[kMaxSimulcastStreams];
-  TemporalLayers::FrameConfig tl_configs[kMaxSimulcastStreams];
-  for (size_t i = 0; i < encoders_.size(); ++i) {
-    tl_configs[i] = temporal_layers_[i]->UpdateLayerConfig(frame.timestamp());
-
-    if (tl_configs[i].drop_frame) {
-      // Drop this frame.
-      return WEBRTC_VIDEO_CODEC_OK;
-    }
-    flags[i] = EncodeFlags(tl_configs[i]);
-  }
-  bool send_key_frame = false;
-  for (size_t i = 0; i < key_frame_request_.size() && i < send_stream_.size();
-       ++i) {
-    if (key_frame_request_[i] && send_stream_[i]) {
-      send_key_frame = true;
-      break;
-    }
-  }
-  if (!send_key_frame && frame_types) {
-    for (size_t i = 0; i < frame_types->size() && i < send_stream_.size();
-         ++i) {
-      if ((*frame_types)[i] == kVideoFrameKey && send_stream_[i]) {
-        send_key_frame = true;
-        break;
-      }
-    }
-  }
-  if (send_key_frame) {
-    // Adapt the size of the key frame when in screenshare with 1 temporal
-    // layer.
-    if (encoders_.size() == 1 && codec_.mode == kScreensharing &&
-        codec_.VP8()->numberOfTemporalLayers <= 1) {
-      const uint32_t forceKeyFrameIntraTh = 100;
-      vpx_codec_control(&(encoders_[0]), VP8E_SET_MAX_INTRA_BITRATE_PCT,
-                        forceKeyFrameIntraTh);
-    }
-    // Key frame request from caller.
-    // Will update both golden and alt-ref.
-    for (size_t i = 0; i < encoders_.size(); ++i) {
-      flags[i] = VPX_EFLAG_FORCE_KF;
-    }
-    std::fill(key_frame_request_.begin(), key_frame_request_.end(), false);
-  }
-
-  // Set the encoder frame flags and temporal layer_id for each spatial stream.
-  // Note that |temporal_layers_| are defined starting from lowest resolution at
-  // position 0 to highest resolution at position |encoders_.size() - 1|,
-  // whereas |encoder_| is from highest to lowest resolution.
-  size_t stream_idx = encoders_.size() - 1;
-  for (size_t i = 0; i < encoders_.size(); ++i, --stream_idx) {
-    // Allow the layers adapter to temporarily modify the configuration. This
-    // change isn't stored in configurations_ so change will be discarded at
-    // the next update.
-    vpx_codec_enc_cfg_t temp_config;
-    memcpy(&temp_config, &configurations_[i], sizeof(vpx_codec_enc_cfg_t));
-    if (temporal_layers_[stream_idx]->UpdateConfiguration(&temp_config)) {
-      if (vpx_codec_enc_config_set(&encoders_[i], &temp_config))
-        return WEBRTC_VIDEO_CODEC_ERROR;
-    }
-
-    vpx_codec_control(&encoders_[i], VP8E_SET_FRAME_FLAGS, flags[stream_idx]);
-    vpx_codec_control(&encoders_[i], VP8E_SET_TEMPORAL_LAYER_ID,
-                      tl_configs[i].encoder_layer_id);
-  }
-  // TODO(holmer): Ideally the duration should be the timestamp diff of this
-  // frame and the next frame to be encoded, which we don't have. Instead we
-  // would like to use the duration of the previous frame. Unfortunately the
-  // rate control seems to be off with that setup. Using the average input
-  // frame rate to calculate an average duration for now.
-  assert(codec_.maxFramerate > 0);
-  uint32_t duration = 90000 / codec_.maxFramerate;
-
-  int error = WEBRTC_VIDEO_CODEC_OK;
-  int num_tries = 0;
-  // If the first try returns WEBRTC_VIDEO_CODEC_TARGET_BITRATE_OVERSHOOT
-  // the frame must be reencoded with the same parameters again because
-  // target bitrate is exceeded and encoder state has been reset.
-  while (num_tries == 0 ||
-      (num_tries == 1 &&
-          error == WEBRTC_VIDEO_CODEC_TARGET_BITRATE_OVERSHOOT)) {
-    ++num_tries;
-    // Note we must pass 0 for |flags| field in encode call below since they are
-    // set above in |vpx_codec_control| function for each encoder/spatial layer.
-    error = vpx_codec_encode(&encoders_[0], &raw_images_[0], timestamp_,
-                                 duration, 0, VPX_DL_REALTIME);
-    // Reset specific intra frame thresholds, following the key frame.
-    if (send_key_frame) {
-      vpx_codec_control(&(encoders_[0]), VP8E_SET_MAX_INTRA_BITRATE_PCT,
-                        rc_max_intra_target_);
-    }
-    if (error)
-      return WEBRTC_VIDEO_CODEC_ERROR;
-    timestamp_ += duration;
-    // Examines frame timestamps only.
-    error = GetEncodedPartitions(tl_configs, frame);
-  }
-  return error;
-}
-
-void VP8EncoderImpl::PopulateCodecSpecific(
-    CodecSpecificInfo* codec_specific,
-    const TemporalLayers::FrameConfig& tl_config,
-    const vpx_codec_cx_pkt_t& pkt,
-    int stream_idx,
-    uint32_t timestamp) {
-  assert(codec_specific != NULL);
-  codec_specific->codecType = kVideoCodecVP8;
-  codec_specific->codec_name = ImplementationName();
-  CodecSpecificInfoVP8* vp8Info = &(codec_specific->codecSpecific.VP8);
-  vp8Info->pictureId = picture_id_[stream_idx];
-  vp8Info->simulcastIdx = stream_idx;
-  vp8Info->keyIdx = kNoKeyIdx;  // TODO(hlundin) populate this
-  vp8Info->nonReference = (pkt.data.frame.flags & VPX_FRAME_IS_DROPPABLE) != 0;
-  temporal_layers_[stream_idx]->PopulateCodecSpecific(
-      (pkt.data.frame.flags & VPX_FRAME_IS_KEY) != 0, tl_config, vp8Info,
-      timestamp);
-  // Prepare next.
-  picture_id_[stream_idx] = (picture_id_[stream_idx] + 1) & 0x7FFF;
-}
-
-int VP8EncoderImpl::GetEncodedPartitions(
-    const TemporalLayers::FrameConfig tl_configs[],
-    const VideoFrame& input_image) {
-  int bw_resolutions_disabled =
-      (encoders_.size() > 1) ? NumStreamsDisabled(send_stream_) : -1;
-
-  int stream_idx = static_cast<int>(encoders_.size()) - 1;
-  int result = WEBRTC_VIDEO_CODEC_OK;
-  for (size_t encoder_idx = 0; encoder_idx < encoders_.size();
-       ++encoder_idx, --stream_idx) {
-    vpx_codec_iter_t iter = NULL;
-    int part_idx = 0;
-    encoded_images_[encoder_idx]._length = 0;
-    encoded_images_[encoder_idx]._frameType = kVideoFrameDelta;
-    RTPFragmentationHeader frag_info;
-    // kTokenPartitions is number of bits used.
-    frag_info.VerifyAndAllocateFragmentationHeader((1 << kTokenPartitions) + 1);
-    CodecSpecificInfo codec_specific;
-    const vpx_codec_cx_pkt_t* pkt = NULL;
-    while ((pkt = vpx_codec_get_cx_data(&encoders_[encoder_idx], &iter)) !=
-           NULL) {
-      switch (pkt->kind) {
-        case VPX_CODEC_CX_FRAME_PKT: {
-          size_t length = encoded_images_[encoder_idx]._length;
-          if (pkt->data.frame.sz + length >
-              encoded_images_[encoder_idx]._size) {
-            uint8_t* buffer = new uint8_t[pkt->data.frame.sz + length];
-            memcpy(buffer, encoded_images_[encoder_idx]._buffer, length);
-            delete[] encoded_images_[encoder_idx]._buffer;
-            encoded_images_[encoder_idx]._buffer = buffer;
-            encoded_images_[encoder_idx]._size = pkt->data.frame.sz + length;
-          }
-          memcpy(&encoded_images_[encoder_idx]._buffer[length],
-                 pkt->data.frame.buf, pkt->data.frame.sz);
-          frag_info.fragmentationOffset[part_idx] = length;
-          frag_info.fragmentationLength[part_idx] = pkt->data.frame.sz;
-          frag_info.fragmentationPlType[part_idx] = 0;  // not known here
-          frag_info.fragmentationTimeDiff[part_idx] = 0;
-          encoded_images_[encoder_idx]._length += pkt->data.frame.sz;
-          assert(length <= encoded_images_[encoder_idx]._size);
-          ++part_idx;
-          break;
-        }
-        default:
-          break;
-      }
-      // End of frame
-      if ((pkt->data.frame.flags & VPX_FRAME_IS_FRAGMENT) == 0) {
-        // check if encoded frame is a key frame
-        if (pkt->data.frame.flags & VPX_FRAME_IS_KEY) {
-          encoded_images_[encoder_idx]._frameType = kVideoFrameKey;
-        }
-        PopulateCodecSpecific(&codec_specific, tl_configs[stream_idx], *pkt,
-                              stream_idx, input_image.timestamp());
-        break;
-      }
-    }
-    encoded_images_[encoder_idx]._timeStamp = input_image.timestamp();
-    encoded_images_[encoder_idx].capture_time_ms_ =
-        input_image.render_time_ms();
-    encoded_images_[encoder_idx].rotation_ = input_image.rotation();
-    encoded_images_[encoder_idx].content_type_ =
-        (codec_.mode == kScreensharing) ? VideoContentType::SCREENSHARE
-                                        : VideoContentType::UNSPECIFIED;
-    encoded_images_[encoder_idx].timing_.flags = TimingFrameFlags::kInvalid;
-
-    int qp = -1;
-    vpx_codec_control(&encoders_[encoder_idx], VP8E_GET_LAST_QUANTIZER_64, &qp);
-    temporal_layers_[stream_idx]->FrameEncoded(
-        encoded_images_[encoder_idx]._length, qp);
-    if (send_stream_[stream_idx]) {
-      if (encoded_images_[encoder_idx]._length > 0) {
-        TRACE_COUNTER_ID1("webrtc", "EncodedFrameSize", encoder_idx,
-                          encoded_images_[encoder_idx]._length);
-        encoded_images_[encoder_idx]._encodedHeight =
-            codec_.simulcastStream[stream_idx].height;
-        encoded_images_[encoder_idx]._encodedWidth =
-            codec_.simulcastStream[stream_idx].width;
-        // Report once per frame (lowest stream always sent).
-        encoded_images_[encoder_idx].adapt_reason_.bw_resolutions_disabled =
-            (stream_idx == 0) ? bw_resolutions_disabled : -1;
-        int qp_128 = -1;
-        vpx_codec_control(&encoders_[encoder_idx], VP8E_GET_LAST_QUANTIZER,
-                          &qp_128);
-        encoded_images_[encoder_idx].qp_ = qp_128;
-        encoded_complete_callback_->OnEncodedImage(encoded_images_[encoder_idx],
-                                                   &codec_specific, &frag_info);
-      } else if (codec_.mode == kScreensharing) {
-        result = WEBRTC_VIDEO_CODEC_TARGET_BITRATE_OVERSHOOT;
-      }
-    }
-  }
-  return result;
-}
-
-VideoEncoder::ScalingSettings VP8EncoderImpl::GetScalingSettings() const {
-  const bool enable_scaling = encoders_.size() == 1 &&
-                              configurations_[0].rc_dropframe_thresh > 0 &&
-                              codec_.VP8().automaticResizeOn;
-  if (enable_scaling && min_pixels_per_frame_) {
-    return VideoEncoder::ScalingSettings(enable_scaling,
-                                         *min_pixels_per_frame_);
-  }
-  return VideoEncoder::ScalingSettings(enable_scaling);
-}
-
-int VP8EncoderImpl::SetChannelParameters(uint32_t packetLoss, int64_t rtt) {
-  return WEBRTC_VIDEO_CODEC_OK;
-}
-
-int VP8EncoderImpl::RegisterEncodeCompleteCallback(
-    EncodedImageCallback* callback) {
-  encoded_complete_callback_ = callback;
-  return WEBRTC_VIDEO_CODEC_OK;
-}
-
-class VP8DecoderImpl::QpSmoother {
- public:
-  QpSmoother() : last_sample_ms_(rtc::TimeMillis()), smoother_(kAlpha) {}
-
-  int GetAvg() const {
-    float value = smoother_.filtered();
-    return (value == rtc::ExpFilter::kValueUndefined) ? 0
-                                                      : static_cast<int>(value);
-  }
-
-  void Add(float sample) {
-    int64_t now_ms = rtc::TimeMillis();
-    smoother_.Apply(static_cast<float>(now_ms - last_sample_ms_), sample);
-    last_sample_ms_ = now_ms;
-  }
-
-  void Reset() { smoother_.Reset(kAlpha); }
-
- private:
-  const float kAlpha = 0.95f;
-  int64_t last_sample_ms_;
-  rtc::ExpFilter smoother_;
-};
-
-VP8DecoderImpl::VP8DecoderImpl()
-    : use_postproc_arm_(
-          webrtc::field_trial::IsEnabled(kVp8PostProcArmFieldTrial)),
-      buffer_pool_(false, 300 /* max_number_of_buffers*/),
-      decode_complete_callback_(NULL),
-      inited_(false),
-      decoder_(NULL),
-      propagation_cnt_(-1),
-      last_frame_width_(0),
-      last_frame_height_(0),
-      key_frame_required_(true),
-      qp_smoother_(use_postproc_arm_ ? new QpSmoother() : nullptr) {
-  if (use_postproc_arm_)
-    GetPostProcParamsFromFieldTrialGroup(&deblock_);
-}
-
-VP8DecoderImpl::~VP8DecoderImpl() {
-  inited_ = true;  // in order to do the actual release
-  Release();
-}
-
-int VP8DecoderImpl::InitDecode(const VideoCodec* inst, int number_of_cores) {
-  int ret_val = Release();
-  if (ret_val < 0) {
-    return ret_val;
-  }
-  if (decoder_ == NULL) {
-    decoder_ = new vpx_codec_ctx_t;
-    memset(decoder_, 0, sizeof(*decoder_));
-  }
-  vpx_codec_dec_cfg_t cfg;
-  // Setting number of threads to a constant value (1)
-  cfg.threads = 1;
-  cfg.h = cfg.w = 0;  // set after decode
-
-#if defined(WEBRTC_ARCH_ARM) || defined(WEBRTC_ARCH_ARM64) || defined(ANDROID)
-  vpx_codec_flags_t flags = use_postproc_arm_ ? VPX_CODEC_USE_POSTPROC : 0;
-#else
-  vpx_codec_flags_t flags = VPX_CODEC_USE_POSTPROC;
-#endif
-
-  if (vpx_codec_dec_init(decoder_, vpx_codec_vp8_dx(), &cfg, flags)) {
-    delete decoder_;
-    decoder_ = nullptr;
-    return WEBRTC_VIDEO_CODEC_MEMORY;
-  }
-
-  propagation_cnt_ = -1;
-  inited_ = true;
-
-  // Always start with a complete key frame.
-  key_frame_required_ = true;
-  return WEBRTC_VIDEO_CODEC_OK;
-}
-
-int VP8DecoderImpl::Decode(const EncodedImage& input_image,
-                           bool missing_frames,
-                           const RTPFragmentationHeader* fragmentation,
-                           const CodecSpecificInfo* codec_specific_info,
-                           int64_t /*render_time_ms*/) {
-  if (!inited_) {
-    return WEBRTC_VIDEO_CODEC_UNINITIALIZED;
-  }
-  if (decode_complete_callback_ == NULL) {
-    return WEBRTC_VIDEO_CODEC_UNINITIALIZED;
-  }
-  if (input_image._buffer == NULL && input_image._length > 0) {
-    // Reset to avoid requesting key frames too often.
-    if (propagation_cnt_ > 0)
-      propagation_cnt_ = 0;
-    return WEBRTC_VIDEO_CODEC_ERR_PARAMETER;
-  }
-
-// Post process configurations.
-#if defined(WEBRTC_ARCH_ARM) || defined(WEBRTC_ARCH_ARM64) || defined(ANDROID)
-  if (use_postproc_arm_) {
-    vp8_postproc_cfg_t ppcfg;
-    ppcfg.post_proc_flag = VP8_MFQE;
-    // For low resolutions, use stronger deblocking filter.
-    int last_width_x_height = last_frame_width_ * last_frame_height_;
-    if (last_width_x_height > 0 && last_width_x_height <= 320 * 240) {
-      // Enable the deblock and demacroblocker based on qp thresholds.
-      RTC_DCHECK(qp_smoother_);
-      int qp = qp_smoother_->GetAvg();
-      if (qp > deblock_.min_qp) {
-        int level = deblock_.max_level;
-        if (qp < deblock_.degrade_qp) {
-          // Use lower level.
-          level = deblock_.max_level * (qp - deblock_.min_qp) /
-                  (deblock_.degrade_qp - deblock_.min_qp);
-        }
-        // Deblocking level only affects VP8_DEMACROBLOCK.
-        ppcfg.deblocking_level = std::max(level, 1);
-        ppcfg.post_proc_flag |= VP8_DEBLOCK | VP8_DEMACROBLOCK;
-      }
-    }
-    vpx_codec_control(decoder_, VP8_SET_POSTPROC, &ppcfg);
-  }
-#else
-  vp8_postproc_cfg_t ppcfg;
-  // MFQE enabled to reduce key frame popping.
-  ppcfg.post_proc_flag = VP8_MFQE | VP8_DEBLOCK;
-  // For VGA resolutions and lower, enable the demacroblocker postproc.
-  if (last_frame_width_ * last_frame_height_ <= 640 * 360) {
-    ppcfg.post_proc_flag |= VP8_DEMACROBLOCK;
-  }
-  // Strength of deblocking filter. Valid range:[0,16]
-  ppcfg.deblocking_level = 3;
-  vpx_codec_control(decoder_, VP8_SET_POSTPROC, &ppcfg);
-#endif
-
-  // Always start with a complete key frame.
-  if (key_frame_required_) {
-    if (input_image._frameType != kVideoFrameKey)
-      return WEBRTC_VIDEO_CODEC_ERROR;
-    // We have a key frame - is it complete?
-    if (input_image._completeFrame) {
-      key_frame_required_ = false;
-    } else {
-      return WEBRTC_VIDEO_CODEC_ERROR;
-    }
-  }
-  // Restrict error propagation using key frame requests.
-  // Reset on a key frame refresh.
-  if (input_image._frameType == kVideoFrameKey && input_image._completeFrame) {
-    propagation_cnt_ = -1;
-    // Start count on first loss.
-  } else if ((!input_image._completeFrame || missing_frames) &&
-             propagation_cnt_ == -1) {
-    propagation_cnt_ = 0;
-  }
-  if (propagation_cnt_ >= 0) {
-    propagation_cnt_++;
-  }
-
-  vpx_codec_iter_t iter = NULL;
-  vpx_image_t* img;
-  int ret;
-
-  // Check for missing frames.
-  if (missing_frames) {
-    // Call decoder with zero data length to signal missing frames.
-    if (vpx_codec_decode(decoder_, NULL, 0, 0, VPX_DL_REALTIME)) {
-      // Reset to avoid requesting key frames too often.
-      if (propagation_cnt_ > 0)
-        propagation_cnt_ = 0;
-      return WEBRTC_VIDEO_CODEC_ERROR;
-    }
-    img = vpx_codec_get_frame(decoder_, &iter);
-    iter = NULL;
-  }
-
-  uint8_t* buffer = input_image._buffer;
-  if (input_image._length == 0) {
-    buffer = NULL;  // Triggers full frame concealment.
-  }
-  if (vpx_codec_decode(decoder_, buffer, input_image._length, 0,
-                       VPX_DL_REALTIME)) {
-    // Reset to avoid requesting key frames too often.
-    if (propagation_cnt_ > 0) {
-      propagation_cnt_ = 0;
-    }
-    return WEBRTC_VIDEO_CODEC_ERROR;
-  }
-
-  img = vpx_codec_get_frame(decoder_, &iter);
-  int qp;
-  vpx_codec_err_t vpx_ret =
-      vpx_codec_control(decoder_, VPXD_GET_LAST_QUANTIZER, &qp);
-  RTC_DCHECK_EQ(vpx_ret, VPX_CODEC_OK);
-  ret = ReturnFrame(img, input_image._timeStamp, input_image.ntp_time_ms_, qp);
-  if (ret != 0) {
-    // Reset to avoid requesting key frames too often.
-    if (ret < 0 && propagation_cnt_ > 0)
-      propagation_cnt_ = 0;
-    return ret;
-  }
-  // Check Vs. threshold
-  if (propagation_cnt_ > kVp8ErrorPropagationTh) {
-    // Reset to avoid requesting key frames too often.
-    propagation_cnt_ = 0;
-    return WEBRTC_VIDEO_CODEC_ERROR;
-  }
-  return WEBRTC_VIDEO_CODEC_OK;
-}
-
-int VP8DecoderImpl::ReturnFrame(const vpx_image_t* img,
-                                uint32_t timestamp,
-                                int64_t ntp_time_ms,
-                                int qp) {
-  if (img == NULL) {
-    // Decoder OK and NULL image => No show frame
-    return WEBRTC_VIDEO_CODEC_NO_OUTPUT;
-  }
-  if (qp_smoother_) {
-    if (last_frame_width_ != static_cast<int>(img->d_w) ||
-        last_frame_height_ != static_cast<int>(img->d_h)) {
-      qp_smoother_->Reset();
-    }
-    qp_smoother_->Add(qp);
-  }
-  last_frame_width_ = img->d_w;
-  last_frame_height_ = img->d_h;
-  // Allocate memory for decoded image.
-  rtc::scoped_refptr<I420Buffer> buffer =
-      buffer_pool_.CreateBuffer(img->d_w, img->d_h);
-  if (!buffer.get()) {
-    // Pool has too many pending frames.
-    RTC_HISTOGRAM_BOOLEAN("WebRTC.Video.VP8DecoderImpl.TooManyPendingFrames",
-                          1);
-    return WEBRTC_VIDEO_CODEC_NO_OUTPUT;
-  }
-
-  libyuv::I420Copy(img->planes[VPX_PLANE_Y], img->stride[VPX_PLANE_Y],
-                   img->planes[VPX_PLANE_U], img->stride[VPX_PLANE_U],
-                   img->planes[VPX_PLANE_V], img->stride[VPX_PLANE_V],
-                   buffer->MutableDataY(), buffer->StrideY(),
-                   buffer->MutableDataU(), buffer->StrideU(),
-                   buffer->MutableDataV(), buffer->StrideV(),
-                   img->d_w, img->d_h);
-
-  VideoFrame decoded_image(buffer, timestamp, 0, kVideoRotation_0);
-  decoded_image.set_ntp_time_ms(ntp_time_ms);
-  decode_complete_callback_->Decoded(decoded_image, rtc::Optional<int32_t>(),
-                                     rtc::Optional<uint8_t>(qp));
-
-  return WEBRTC_VIDEO_CODEC_OK;
-}
-
-int VP8DecoderImpl::RegisterDecodeCompleteCallback(
-    DecodedImageCallback* callback) {
-  decode_complete_callback_ = callback;
-  return WEBRTC_VIDEO_CODEC_OK;
-}
-
-int VP8DecoderImpl::Release() {
-  if (decoder_ != NULL) {
-    if (vpx_codec_destroy(decoder_)) {
-      return WEBRTC_VIDEO_CODEC_MEMORY;
-    }
-    delete decoder_;
-    decoder_ = NULL;
-  }
-  buffer_pool_.Release();
-  inited_ = false;
-  return WEBRTC_VIDEO_CODEC_OK;
-}
-
-const char* VP8DecoderImpl::ImplementationName() const {
-  return "libvpx";
-}
-
-}  // namespace webrtc
diff --git a/modules/video_coding/codecs/vp8/vp8_impl.h b/modules/video_coding/codecs/vp8/vp8_impl.h
deleted file mode 100644
index 30a4a1a..0000000
--- a/modules/video_coding/codecs/vp8/vp8_impl.h
+++ /dev/null
@@ -1,167 +0,0 @@
-/*
- *  Copyright (c) 2012 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.
- *
- * WEBRTC VP8 wrapper interface
- */
-
-#ifndef WEBRTC_MODULES_VIDEO_CODING_CODECS_VP8_VP8_IMPL_H_
-#define WEBRTC_MODULES_VIDEO_CODING_CODECS_VP8_VP8_IMPL_H_
-
-#include <memory>
-#include <vector>
-
-// NOTE: This include order must remain to avoid compile errors, even though
-//       it breaks the style guide.
-#include "vpx/vpx_encoder.h"
-#include "vpx/vpx_decoder.h"
-#include "vpx/vp8cx.h"
-#include "vpx/vp8dx.h"
-
-#include "webrtc/api/video/video_frame.h"
-#include "webrtc/common_video/include/i420_buffer_pool.h"
-#include "webrtc/common_video/include/video_frame.h"
-#include "webrtc/modules/video_coding/codecs/vp8/include/vp8.h"
-#include "webrtc/modules/video_coding/codecs/vp8/temporal_layers.h"
-#include "webrtc/modules/video_coding/include/video_codec_interface.h"
-#include "webrtc/modules/video_coding/utility/quality_scaler.h"
-
-namespace webrtc {
-
-class TemporalLayers;
-
-class VP8EncoderImpl : public VP8Encoder {
- public:
-  VP8EncoderImpl();
-
-  virtual ~VP8EncoderImpl();
-
-  int Release() override;
-
-  int InitEncode(const VideoCodec* codec_settings,
-                 int number_of_cores,
-                 size_t max_payload_size) override;
-
-  int Encode(const VideoFrame& input_image,
-             const CodecSpecificInfo* codec_specific_info,
-             const std::vector<FrameType>* frame_types) override;
-
-  int RegisterEncodeCompleteCallback(EncodedImageCallback* callback) override;
-
-  int SetChannelParameters(uint32_t packet_loss, int64_t rtt) override;
-
-  int SetRateAllocation(const BitrateAllocation& bitrate,
-                        uint32_t new_framerate) override;
-
-  ScalingSettings GetScalingSettings() const override;
-
-  const char* ImplementationName() const override;
-
-  static vpx_enc_frame_flags_t EncodeFlags(
-      const TemporalLayers::FrameConfig& references);
-
- private:
-  void SetupTemporalLayers(int num_streams,
-                           int num_temporal_layers,
-                           const VideoCodec& codec);
-
-  // Set the cpu_speed setting for encoder based on resolution and/or platform.
-  int SetCpuSpeed(int width, int height);
-
-  // Determine number of encoder threads to use.
-  int NumberOfThreads(int width, int height, int number_of_cores);
-
-  // Call encoder initialize function and set control settings.
-  int InitAndSetControlSettings();
-
-  void PopulateCodecSpecific(CodecSpecificInfo* codec_specific,
-                             const TemporalLayers::FrameConfig& tl_config,
-                             const vpx_codec_cx_pkt& pkt,
-                             int stream_idx,
-                             uint32_t timestamp);
-
-  int GetEncodedPartitions(const TemporalLayers::FrameConfig tl_configs[],
-                           const VideoFrame& input_image);
-
-  // Set the stream state for stream |stream_idx|.
-  void SetStreamState(bool send_stream, int stream_idx);
-
-  uint32_t MaxIntraTarget(uint32_t optimal_buffer_size);
-
-  const bool use_gf_boost_;
-  const rtc::Optional<int> min_pixels_per_frame_;
-
-  EncodedImageCallback* encoded_complete_callback_;
-  VideoCodec codec_;
-  bool inited_;
-  int64_t timestamp_;
-  int qp_max_;
-  int cpu_speed_default_;
-  int number_of_cores_;
-  uint32_t rc_max_intra_target_;
-  std::vector<std::unique_ptr<TemporalLayers>> temporal_layers_;
-  std::vector<uint16_t> picture_id_;
-  std::vector<uint8_t> tl0_pic_idx_;
-  std::vector<bool> key_frame_request_;
-  std::vector<bool> send_stream_;
-  std::vector<int> cpu_speed_;
-  std::vector<vpx_image_t> raw_images_;
-  std::vector<EncodedImage> encoded_images_;
-  std::vector<vpx_codec_ctx_t> encoders_;
-  std::vector<vpx_codec_enc_cfg_t> configurations_;
-  std::vector<vpx_rational_t> downsampling_factors_;
-};
-
-class VP8DecoderImpl : public VP8Decoder {
- public:
-  VP8DecoderImpl();
-
-  virtual ~VP8DecoderImpl();
-
-  int InitDecode(const VideoCodec* inst, int number_of_cores) override;
-
-  int Decode(const EncodedImage& input_image,
-             bool missing_frames,
-             const RTPFragmentationHeader* fragmentation,
-             const CodecSpecificInfo* codec_specific_info,
-             int64_t /*render_time_ms*/) override;
-
-  int RegisterDecodeCompleteCallback(DecodedImageCallback* callback) override;
-  int Release() override;
-
-  const char* ImplementationName() const override;
-
-  struct DeblockParams {
-    int max_level = 6;   // Deblocking strength: [0, 16].
-    int degrade_qp = 1;  // If QP value is below, start lowering |max_level|.
-    int min_qp = 0;      // If QP value is below, turn off deblocking.
-  };
-
- private:
-  class QpSmoother;
-  int ReturnFrame(const vpx_image_t* img,
-                  uint32_t timeStamp,
-                  int64_t ntp_time_ms,
-                  int qp);
-
-  const bool use_postproc_arm_;
-
-  I420BufferPool buffer_pool_;
-  DecodedImageCallback* decode_complete_callback_;
-  bool inited_;
-  vpx_codec_ctx_t* decoder_;
-  int propagation_cnt_;
-  int last_frame_width_;
-  int last_frame_height_;
-  bool key_frame_required_;
-  DeblockParams deblock_;
-  const std::unique_ptr<QpSmoother> qp_smoother_;
-};
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_VIDEO_CODING_CODECS_VP8_VP8_IMPL_H_
diff --git a/modules/video_coding/codecs/vp9/include/vp9.h b/modules/video_coding/codecs/vp9/include/vp9.h
deleted file mode 100644
index 3b726a0..0000000
--- a/modules/video_coding/codecs/vp9/include/vp9.h
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- *  Copyright (c) 2014 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_VIDEO_CODING_CODECS_VP9_INCLUDE_VP9_H_
-#define WEBRTC_MODULES_VIDEO_CODING_CODECS_VP9_INCLUDE_VP9_H_
-
-#include "webrtc/modules/video_coding/include/video_codec_interface.h"
-
-namespace webrtc {
-
-class VP9Encoder : public VideoEncoder {
- public:
-  static bool IsSupported();
-  static VP9Encoder* Create();
-
-  virtual ~VP9Encoder() {}
-};
-
-class VP9Decoder : public VideoDecoder {
- public:
-  static bool IsSupported();
-  static VP9Decoder* Create();
-
-  virtual ~VP9Decoder() {}
-};
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_VIDEO_CODING_CODECS_VP9_INCLUDE_VP9_H_
diff --git a/modules/video_coding/codecs/vp9/include/vp9_globals.h b/modules/video_coding/codecs/vp9/include/vp9_globals.h
deleted file mode 100644
index f429bda..0000000
--- a/modules/video_coding/codecs/vp9/include/vp9_globals.h
+++ /dev/null
@@ -1,210 +0,0 @@
-/*
- *  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.
- */
-
-// This file contains codec dependent definitions that are needed in
-// order to compile the WebRTC codebase, even if this codec is not used.
-
-#ifndef WEBRTC_MODULES_VIDEO_CODING_CODECS_VP9_INCLUDE_VP9_GLOBALS_H_
-#define WEBRTC_MODULES_VIDEO_CODING_CODECS_VP9_INCLUDE_VP9_GLOBALS_H_
-
-#include "webrtc/modules/video_coding/codecs/interface/common_constants.h"
-
-namespace webrtc {
-
-const int16_t kMaxOneBytePictureId = 0x7F;    // 7 bits
-const int16_t kMaxTwoBytePictureId = 0x7FFF;  // 15 bits
-const uint8_t kNoSpatialIdx = 0xFF;
-const uint8_t kNoGofIdx = 0xFF;
-const uint8_t kNumVp9Buffers = 8;
-const size_t kMaxVp9RefPics = 3;
-const size_t kMaxVp9FramesInGof = 0xFF;  // 8 bits
-const size_t kMaxVp9NumberOfSpatialLayers = 8;
-
-enum TemporalStructureMode {
-  kTemporalStructureMode1,  // 1 temporal layer structure - i.e., IPPP...
-  kTemporalStructureMode2,  // 2 temporal layers 01...
-  kTemporalStructureMode3,  // 3 temporal layers 0212...
-  kTemporalStructureMode4   // 3 temporal layers 02120212...
-};
-
-struct GofInfoVP9 {
-  void SetGofInfoVP9(TemporalStructureMode tm) {
-    switch (tm) {
-      case kTemporalStructureMode1:
-        num_frames_in_gof = 1;
-        temporal_idx[0] = 0;
-        temporal_up_switch[0] = false;
-        num_ref_pics[0] = 1;
-        pid_diff[0][0] = 1;
-        break;
-      case kTemporalStructureMode2:
-        num_frames_in_gof = 2;
-        temporal_idx[0] = 0;
-        temporal_up_switch[0] = false;
-        num_ref_pics[0] = 1;
-        pid_diff[0][0] = 2;
-
-        temporal_idx[1] = 1;
-        temporal_up_switch[1] = true;
-        num_ref_pics[1] = 1;
-        pid_diff[1][0] = 1;
-        break;
-      case kTemporalStructureMode3:
-        num_frames_in_gof = 4;
-        temporal_idx[0] = 0;
-        temporal_up_switch[0] = false;
-        num_ref_pics[0] = 1;
-        pid_diff[0][0] = 4;
-
-        temporal_idx[1] = 2;
-        temporal_up_switch[1] = true;
-        num_ref_pics[1] = 1;
-        pid_diff[1][0] = 1;
-
-        temporal_idx[2] = 1;
-        temporal_up_switch[2] = true;
-        num_ref_pics[2] = 1;
-        pid_diff[2][0] = 2;
-
-        temporal_idx[3] = 2;
-        temporal_up_switch[3] = false;
-        num_ref_pics[3] = 2;
-        pid_diff[3][0] = 1;
-        pid_diff[3][1] = 2;
-        break;
-      case kTemporalStructureMode4:
-        num_frames_in_gof = 8;
-        temporal_idx[0] = 0;
-        temporal_up_switch[0] = false;
-        num_ref_pics[0] = 1;
-        pid_diff[0][0] = 4;
-
-        temporal_idx[1] = 2;
-        temporal_up_switch[1] = true;
-        num_ref_pics[1] = 1;
-        pid_diff[1][0] = 1;
-
-        temporal_idx[2] = 1;
-        temporal_up_switch[2] = true;
-        num_ref_pics[2] = 1;
-        pid_diff[2][0] = 2;
-
-        temporal_idx[3] = 2;
-        temporal_up_switch[3] = false;
-        num_ref_pics[3] = 2;
-        pid_diff[3][0] = 1;
-        pid_diff[3][1] = 2;
-
-        temporal_idx[4] = 0;
-        temporal_up_switch[0] = false;
-        num_ref_pics[4] = 1;
-        pid_diff[4][0] = 4;
-
-        temporal_idx[5] = 2;
-        temporal_up_switch[1] = false;
-        num_ref_pics[5] = 2;
-        pid_diff[5][0] = 1;
-        pid_diff[5][1] = 2;
-
-        temporal_idx[6] = 1;
-        temporal_up_switch[2] = false;
-        num_ref_pics[6] = 2;
-        pid_diff[6][0] = 2;
-        pid_diff[6][1] = 4;
-
-        temporal_idx[7] = 2;
-        temporal_up_switch[3] = false;
-        num_ref_pics[7] = 2;
-        pid_diff[7][0] = 1;
-        pid_diff[7][1] = 2;
-        break;
-      default:
-        assert(false);
-    }
-  }
-
-  void CopyGofInfoVP9(const GofInfoVP9& src) {
-    num_frames_in_gof = src.num_frames_in_gof;
-    for (size_t i = 0; i < num_frames_in_gof; ++i) {
-      temporal_idx[i] = src.temporal_idx[i];
-      temporal_up_switch[i] = src.temporal_up_switch[i];
-      num_ref_pics[i] = src.num_ref_pics[i];
-      for (uint8_t r = 0; r < num_ref_pics[i]; ++r) {
-        pid_diff[i][r] = src.pid_diff[i][r];
-      }
-    }
-  }
-
-  size_t num_frames_in_gof;
-  uint8_t temporal_idx[kMaxVp9FramesInGof];
-  bool temporal_up_switch[kMaxVp9FramesInGof];
-  uint8_t num_ref_pics[kMaxVp9FramesInGof];
-  uint8_t pid_diff[kMaxVp9FramesInGof][kMaxVp9RefPics];
-  uint16_t pid_start;
-};
-
-struct RTPVideoHeaderVP9 {
-  void InitRTPVideoHeaderVP9() {
-    inter_pic_predicted = false;
-    flexible_mode = false;
-    beginning_of_frame = false;
-    end_of_frame = false;
-    ss_data_available = false;
-    picture_id = kNoPictureId;
-    max_picture_id = kMaxTwoBytePictureId;
-    tl0_pic_idx = kNoTl0PicIdx;
-    temporal_idx = kNoTemporalIdx;
-    spatial_idx = kNoSpatialIdx;
-    temporal_up_switch = false;
-    inter_layer_predicted = false;
-    gof_idx = kNoGofIdx;
-    num_ref_pics = 0;
-    num_spatial_layers = 1;
-  }
-
-  bool inter_pic_predicted;  // This layer frame is dependent on previously
-                             // coded frame(s).
-  bool flexible_mode;        // This frame is in flexible mode.
-  bool beginning_of_frame;   // True if this packet is the first in a VP9 layer
-                             // frame.
-  bool end_of_frame;  // True if this packet is the last in a VP9 layer frame.
-  bool ss_data_available;   // True if SS data is available in this payload
-                            // descriptor.
-  int16_t picture_id;       // PictureID index, 15 bits;
-                            // kNoPictureId if PictureID does not exist.
-  int16_t max_picture_id;   // Maximum picture ID index; either 0x7F or 0x7FFF;
-  int16_t tl0_pic_idx;      // TL0PIC_IDX, 8 bits;
-                            // kNoTl0PicIdx means no value provided.
-  uint8_t temporal_idx;     // Temporal layer index, or kNoTemporalIdx.
-  uint8_t spatial_idx;      // Spatial layer index, or kNoSpatialIdx.
-  bool temporal_up_switch;  // True if upswitch to higher frame rate is possible
-                            // starting from this frame.
-  bool inter_layer_predicted;  // Frame is dependent on directly lower spatial
-                               // layer frame.
-
-  uint8_t gof_idx;  // Index to predefined temporal frame info in SS data.
-
-  uint8_t num_ref_pics;  // Number of reference pictures used by this layer
-                         // frame.
-  uint8_t pid_diff[kMaxVp9RefPics];  // P_DIFF signaled to derive the PictureID
-                                     // of the reference pictures.
-  int16_t ref_picture_id[kMaxVp9RefPics];  // PictureID of reference pictures.
-
-  // SS data.
-  size_t num_spatial_layers;  // Always populated.
-  bool spatial_layer_resolution_present;
-  uint16_t width[kMaxVp9NumberOfSpatialLayers];
-  uint16_t height[kMaxVp9NumberOfSpatialLayers];
-  GofInfoVP9 gof;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_VIDEO_CODING_CODECS_VP9_INCLUDE_VP9_GLOBALS_H_
diff --git a/modules/video_coding/codecs/vp9/screenshare_layers.cc b/modules/video_coding/codecs/vp9/screenshare_layers.cc
deleted file mode 100644
index 461b357..0000000
--- a/modules/video_coding/codecs/vp9/screenshare_layers.cc
+++ /dev/null
@@ -1,93 +0,0 @@
-/* Copyright (c) 2015 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/video_coding/codecs/vp9/screenshare_layers.h"
-#include <algorithm>
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-
-ScreenshareLayersVP9::ScreenshareLayersVP9(uint8_t num_layers)
-    : num_layers_(num_layers),
-      start_layer_(0),
-      last_timestamp_(0),
-      timestamp_initialized_(false) {
-  RTC_DCHECK_GT(num_layers, 0);
-  RTC_DCHECK_LE(num_layers, kMaxVp9NumberOfSpatialLayers);
-  memset(bits_used_, 0, sizeof(bits_used_));
-  memset(threshold_kbps_, 0, sizeof(threshold_kbps_));
-}
-
-uint8_t ScreenshareLayersVP9::GetStartLayer() const {
-  return start_layer_;
-}
-
-void ScreenshareLayersVP9::ConfigureBitrate(int threshold_kbps,
-                                            uint8_t layer_id) {
-  // The upper layer is always the layer we spill frames
-  // to when the bitrate becomes to high, therefore setting
-  // a max limit is not allowed. The top layer bitrate is
-  // never used either so configuring it makes no difference.
-  RTC_DCHECK_LT(layer_id, num_layers_ - 1);
-  threshold_kbps_[layer_id] = threshold_kbps;
-}
-
-void ScreenshareLayersVP9::LayerFrameEncoded(unsigned int size_bytes,
-                                             uint8_t layer_id) {
-  RTC_DCHECK_LT(layer_id, num_layers_);
-  bits_used_[layer_id] += size_bytes * 8;
-}
-
-VP9EncoderImpl::SuperFrameRefSettings
-ScreenshareLayersVP9::GetSuperFrameSettings(uint32_t timestamp,
-                                            bool is_keyframe) {
-  VP9EncoderImpl::SuperFrameRefSettings settings;
-  if (!timestamp_initialized_) {
-    last_timestamp_ = timestamp;
-    timestamp_initialized_ = true;
-  }
-  float time_diff = (timestamp - last_timestamp_) / 90.f;
-  float total_bits_used = 0;
-  float total_threshold_kbps = 0;
-  start_layer_ = 0;
-
-  // Up to (num_layers - 1) because we only have
-  // (num_layers - 1) thresholds to check.
-  for (int layer_id = 0; layer_id < num_layers_ - 1; ++layer_id) {
-    bits_used_[layer_id] = std::max(
-        0.f, bits_used_[layer_id] - time_diff * threshold_kbps_[layer_id]);
-    total_bits_used += bits_used_[layer_id];
-    total_threshold_kbps += threshold_kbps_[layer_id];
-
-    // If this is a keyframe then there should be no
-    // references to any previous frames.
-    if (!is_keyframe) {
-      settings.layer[layer_id].ref_buf1 = layer_id;
-      if (total_bits_used > total_threshold_kbps * 1000)
-        start_layer_ = layer_id + 1;
-    }
-
-    settings.layer[layer_id].upd_buf = layer_id;
-  }
-  // Since the above loop does not iterate over the last layer
-  // the reference of the last layer has to be set after the loop,
-  // and if this is a keyframe there should be no references to
-  // any previous frames.
-  if (!is_keyframe)
-    settings.layer[num_layers_ - 1].ref_buf1 = num_layers_ - 1;
-
-  settings.layer[num_layers_ - 1].upd_buf = num_layers_ - 1;
-  settings.is_keyframe = is_keyframe;
-  settings.start_layer = start_layer_;
-  settings.stop_layer = num_layers_ - 1;
-  last_timestamp_ = timestamp;
-  return settings;
-}
-
-}  // namespace webrtc
diff --git a/modules/video_coding/codecs/vp9/screenshare_layers.h b/modules/video_coding/codecs/vp9/screenshare_layers.h
deleted file mode 100644
index 5a901ae..0000000
--- a/modules/video_coding/codecs/vp9/screenshare_layers.h
+++ /dev/null
@@ -1,66 +0,0 @@
-/* Copyright (c) 2015 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_VIDEO_CODING_CODECS_VP9_SCREENSHARE_LAYERS_H_
-#define WEBRTC_MODULES_VIDEO_CODING_CODECS_VP9_SCREENSHARE_LAYERS_H_
-
-#include "webrtc/modules/video_coding/codecs/vp9/vp9_impl.h"
-
-namespace webrtc {
-
-class ScreenshareLayersVP9 {
- public:
-  explicit ScreenshareLayersVP9(uint8_t num_layers);
-
-  // The target bitrate for layer with id layer_id.
-  void ConfigureBitrate(int threshold_kbps, uint8_t layer_id);
-
-  // The current start layer.
-  uint8_t GetStartLayer() const;
-
-  // Update the layer with the size of the layer frame.
-  void LayerFrameEncoded(unsigned int size_bytes, uint8_t layer_id);
-
-  // Get the layer settings for the next superframe.
-  //
-  // In short, each time the GetSuperFrameSettings is called the
-  // bitrate of every layer is calculated and if the cummulative
-  // bitrate exceeds the configured cummulative bitrates
-  // (ConfigureBitrate to configure) up to and including that
-  // layer then the resulting encoding settings for the
-  // superframe will only encode layers above that layer.
-  VP9EncoderImpl::SuperFrameRefSettings GetSuperFrameSettings(
-      uint32_t timestamp,
-      bool is_keyframe);
-
- private:
-  // How many layers that are used.
-  uint8_t num_layers_;
-
-  // The index of the first layer to encode.
-  uint8_t start_layer_;
-
-  // Cummulative target kbps for the different layers.
-  float threshold_kbps_[kMaxVp9NumberOfSpatialLayers - 1];
-
-  // How many bits that has been used for a certain layer. Increased in
-  // FrameEncoded() by the size of the encoded frame and decreased in
-  // GetSuperFrameSettings() depending on the time between frames.
-  float bits_used_[kMaxVp9NumberOfSpatialLayers];
-
-  // Timestamp of last frame.
-  uint32_t last_timestamp_;
-
-  // If the last_timestamp_ has been set.
-  bool timestamp_initialized_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_VIDEO_CODING_CODECS_VP9_SCREENSHARE_LAYERS_H_
diff --git a/modules/video_coding/codecs/vp9/test/vp9_impl_unittest.cc b/modules/video_coding/codecs/vp9/test/vp9_impl_unittest.cc
deleted file mode 100644
index 50de7fd..0000000
--- a/modules/video_coding/codecs/vp9/test/vp9_impl_unittest.cc
+++ /dev/null
@@ -1,201 +0,0 @@
-/*
- *  Copyright (c) 2017 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/common_video/libyuv/include/webrtc_libyuv.h"
-#include "webrtc/modules/video_coding/codecs/vp9/include/vp9.h"
-#include "webrtc/modules/video_coding/codecs/test/video_codec_test.h"
-
-namespace webrtc {
-
-namespace {
-constexpr uint32_t kTimestampIncrementPerFrame = 3000;
-}  // namespace
-
-class TestVp9Impl : public VideoCodecTest {
- protected:
-  VideoEncoder* CreateEncoder() override { return VP9Encoder::Create(); }
-
-  VideoDecoder* CreateDecoder() override { return VP9Decoder::Create(); }
-
-  VideoCodec codec_settings() override {
-    VideoCodec codec_settings;
-    codec_settings.codecType = webrtc::kVideoCodecVP9;
-    codec_settings.VP9()->numberOfTemporalLayers = 1;
-    codec_settings.VP9()->numberOfSpatialLayers = 1;
-    return codec_settings;
-  }
-
-  void ExpectFrameWith(int16_t picture_id,
-                       int tl0_pic_idx,
-                       uint8_t temporal_idx) {
-    EncodedImage encoded_frame;
-    CodecSpecificInfo codec_specific_info;
-    ASSERT_TRUE(WaitForEncodedFrame(&encoded_frame, &codec_specific_info));
-    EXPECT_EQ(picture_id, codec_specific_info.codecSpecific.VP9.picture_id);
-    EXPECT_EQ(tl0_pic_idx, codec_specific_info.codecSpecific.VP9.tl0_pic_idx);
-    EXPECT_EQ(temporal_idx, codec_specific_info.codecSpecific.VP9.temporal_idx);
-  }
-};
-
-// Disabled on ios as flake, see https://crbug.com/webrtc/7057
-#if defined(WEBRTC_IOS)
-TEST_F(TestVp9Impl, DISABLED_EncodeDecode) {
-#else
-TEST_F(TestVp9Impl, EncodeDecode) {
-#endif
-  EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK,
-            encoder_->Encode(*input_frame_, nullptr, nullptr));
-  EncodedImage encoded_frame;
-  CodecSpecificInfo codec_specific_info;
-  ASSERT_TRUE(WaitForEncodedFrame(&encoded_frame, &codec_specific_info));
-  // First frame should be a key frame.
-  encoded_frame._frameType = kVideoFrameKey;
-  EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK,
-            decoder_->Decode(encoded_frame, false, nullptr));
-  std::unique_ptr<VideoFrame> decoded_frame;
-  rtc::Optional<uint8_t> decoded_qp;
-  ASSERT_TRUE(WaitForDecodedFrame(&decoded_frame, &decoded_qp));
-  ASSERT_TRUE(decoded_frame);
-  EXPECT_GT(I420PSNR(input_frame_.get(), decoded_frame.get()), 36);
-}
-
-// We only test the encoder here, since the decoded frame rotation is set based
-// on the CVO RTP header extension in VCMDecodedFrameCallback::Decoded.
-// TODO(brandtr): Consider passing through the rotation flag through the decoder
-// in the same way as done in the encoder.
-TEST_F(TestVp9Impl, EncodedRotationEqualsInputRotation) {
-  input_frame_->set_rotation(kVideoRotation_0);
-  EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK,
-            encoder_->Encode(*input_frame_, nullptr, nullptr));
-  EncodedImage encoded_frame;
-  CodecSpecificInfo codec_specific_info;
-  ASSERT_TRUE(WaitForEncodedFrame(&encoded_frame, &codec_specific_info));
-  EXPECT_EQ(kVideoRotation_0, encoded_frame.rotation_);
-
-  input_frame_->set_rotation(kVideoRotation_90);
-  EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK,
-            encoder_->Encode(*input_frame_, nullptr, nullptr));
-  ASSERT_TRUE(WaitForEncodedFrame(&encoded_frame, &codec_specific_info));
-  EXPECT_EQ(kVideoRotation_90, encoded_frame.rotation_);
-}
-
-TEST_F(TestVp9Impl, DecodedQpEqualsEncodedQp) {
-  EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK,
-            encoder_->Encode(*input_frame_, nullptr, nullptr));
-  EncodedImage encoded_frame;
-  CodecSpecificInfo codec_specific_info;
-  ASSERT_TRUE(WaitForEncodedFrame(&encoded_frame, &codec_specific_info));
-  // First frame should be a key frame.
-  encoded_frame._frameType = kVideoFrameKey;
-  EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK,
-            decoder_->Decode(encoded_frame, false, nullptr));
-  std::unique_ptr<VideoFrame> decoded_frame;
-  rtc::Optional<uint8_t> decoded_qp;
-  ASSERT_TRUE(WaitForDecodedFrame(&decoded_frame, &decoded_qp));
-  ASSERT_TRUE(decoded_frame);
-  ASSERT_TRUE(decoded_qp);
-  EXPECT_EQ(encoded_frame.qp_, *decoded_qp);
-}
-
-TEST_F(TestVp9Impl, ParserQpEqualsEncodedQp) {
-  EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK,
-            encoder_->Encode(*input_frame_, nullptr, nullptr));
-  EncodedImage encoded_frame;
-  CodecSpecificInfo codec_specific_info;
-  ASSERT_TRUE(WaitForEncodedFrame(&encoded_frame, &codec_specific_info));
-
-  int qp = 0;
-  ASSERT_TRUE(vp9::GetQp(encoded_frame._buffer, encoded_frame._length, &qp));
-
-  EXPECT_EQ(encoded_frame.qp_, qp);
-}
-
-TEST_F(TestVp9Impl, EncoderRetainsRtpStateAfterRelease) {
-  // Override default settings.
-  codec_settings_.VP9()->numberOfTemporalLayers = 2;
-  // Tl0PidIdx is only used in non-flexible mode.
-  codec_settings_.VP9()->flexibleMode = false;
-  EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK,
-            encoder_->InitEncode(&codec_settings_, 1 /* number of cores */,
-                                 0 /* max payload size (unused) */));
-
-  // Temporal layer 0.
-  EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK,
-            encoder_->Encode(*input_frame_, nullptr, nullptr));
-  EncodedImage encoded_frame;
-  CodecSpecificInfo codec_specific_info;
-  ASSERT_TRUE(WaitForEncodedFrame(&encoded_frame, &codec_specific_info));
-  int16_t picture_id = codec_specific_info.codecSpecific.VP9.picture_id;
-  int tl0_pic_idx = codec_specific_info.codecSpecific.VP9.tl0_pic_idx;
-  EXPECT_EQ(0, codec_specific_info.codecSpecific.VP9.temporal_idx);
-
-  // Temporal layer 1.
-  input_frame_->set_timestamp(input_frame_->timestamp() +
-                              kTimestampIncrementPerFrame);
-  EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK,
-            encoder_->Encode(*input_frame_, nullptr, nullptr));
-  ExpectFrameWith((picture_id + 1) % (1 << 15), tl0_pic_idx, 1);
-
-  // Temporal layer 0.
-  input_frame_->set_timestamp(input_frame_->timestamp() +
-                              kTimestampIncrementPerFrame);
-  EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK,
-            encoder_->Encode(*input_frame_, nullptr, nullptr));
-  ExpectFrameWith((picture_id + 2) % (1 << 15), (tl0_pic_idx + 1) % (1 << 8),
-                  0);
-
-  // Temporal layer 1.
-  input_frame_->set_timestamp(input_frame_->timestamp() +
-                              kTimestampIncrementPerFrame);
-  EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK,
-            encoder_->Encode(*input_frame_, nullptr, nullptr));
-  ExpectFrameWith((picture_id + 3) % (1 << 15), (tl0_pic_idx + 1) % (1 << 8),
-                  1);
-
-  // Reinit.
-  EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK, encoder_->Release());
-  EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK,
-            encoder_->InitEncode(&codec_settings_, 1 /* number of cores */,
-                                 0 /* max payload size (unused) */));
-
-  // Temporal layer 0.
-  input_frame_->set_timestamp(input_frame_->timestamp() +
-                              kTimestampIncrementPerFrame);
-  EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK,
-            encoder_->Encode(*input_frame_, nullptr, nullptr));
-  ExpectFrameWith((picture_id + 4) % (1 << 15), (tl0_pic_idx + 2) % (1 << 8),
-                  0);
-
-  // Temporal layer 1.
-  input_frame_->set_timestamp(input_frame_->timestamp() +
-                              kTimestampIncrementPerFrame);
-  EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK,
-            encoder_->Encode(*input_frame_, nullptr, nullptr));
-  ExpectFrameWith((picture_id + 5) % (1 << 15), (tl0_pic_idx + 2) % (1 << 8),
-                  1);
-
-  // Temporal layer 0.
-  input_frame_->set_timestamp(input_frame_->timestamp() +
-                              kTimestampIncrementPerFrame);
-  EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK,
-            encoder_->Encode(*input_frame_, nullptr, nullptr));
-  ExpectFrameWith((picture_id + 6) % (1 << 15), (tl0_pic_idx + 3) % (1 << 8),
-                  0);
-
-  // Temporal layer 1.
-  input_frame_->set_timestamp(input_frame_->timestamp() +
-                              kTimestampIncrementPerFrame);
-  EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK,
-            encoder_->Encode(*input_frame_, nullptr, nullptr));
-  ExpectFrameWith((picture_id + 7) % (1 << 15), (tl0_pic_idx + 3) % (1 << 8),
-                  1);
-}
-
-}  // namespace webrtc
diff --git a/modules/video_coding/codecs/vp9/vp9_frame_buffer_pool.cc b/modules/video_coding/codecs/vp9/vp9_frame_buffer_pool.cc
deleted file mode 100644
index ff821b9..0000000
--- a/modules/video_coding/codecs/vp9/vp9_frame_buffer_pool.cc
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- *  Copyright (c) 2015 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/video_coding/codecs/vp9/vp9_frame_buffer_pool.h"
-
-#include "vpx/vpx_codec.h"
-#include "vpx/vpx_decoder.h"
-#include "vpx/vpx_frame_buffer.h"
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-
-namespace webrtc {
-
-uint8_t* Vp9FrameBufferPool::Vp9FrameBuffer::GetData() {
-  return data_.data<uint8_t>();
-}
-
-size_t Vp9FrameBufferPool::Vp9FrameBuffer::GetDataSize() const {
-  return data_.size();
-}
-
-void Vp9FrameBufferPool::Vp9FrameBuffer::SetSize(size_t size) {
-  data_.SetSize(size);
-}
-
-bool Vp9FrameBufferPool::InitializeVpxUsePool(
-    vpx_codec_ctx* vpx_codec_context) {
-  RTC_DCHECK(vpx_codec_context);
-  // Tell libvpx to use this pool.
-  if (vpx_codec_set_frame_buffer_functions(
-          // In which context to use these callback functions.
-          vpx_codec_context,
-          // Called by libvpx when it needs another frame buffer.
-          &Vp9FrameBufferPool::VpxGetFrameBuffer,
-          // Called by libvpx when it no longer uses a frame buffer.
-          &Vp9FrameBufferPool::VpxReleaseFrameBuffer,
-          // |this| will be passed as |user_priv| to VpxGetFrameBuffer.
-          this)) {
-    // Failed to configure libvpx to use Vp9FrameBufferPool.
-    return false;
-  }
-  return true;
-}
-
-rtc::scoped_refptr<Vp9FrameBufferPool::Vp9FrameBuffer>
-Vp9FrameBufferPool::GetFrameBuffer(size_t min_size) {
-  RTC_DCHECK_GT(min_size, 0);
-  rtc::scoped_refptr<Vp9FrameBuffer> available_buffer = nullptr;
-  {
-    rtc::CritScope cs(&buffers_lock_);
-    // Do we have a buffer we can recycle?
-    for (const auto& buffer : allocated_buffers_) {
-      if (buffer->HasOneRef()) {
-        available_buffer = buffer;
-        break;
-      }
-    }
-    // Otherwise create one.
-    if (available_buffer == nullptr) {
-      available_buffer = new rtc::RefCountedObject<Vp9FrameBuffer>();
-      allocated_buffers_.push_back(available_buffer);
-      if (allocated_buffers_.size() > max_num_buffers_) {
-        LOG(LS_WARNING)
-            << allocated_buffers_.size() << " Vp9FrameBuffers have been "
-            << "allocated by a Vp9FrameBufferPool (exceeding what is "
-            << "considered reasonable, " << max_num_buffers_ << ").";
-
-        // TODO(phoglund): this limit is being hit in tests since Oct 5 2016.
-        // See https://bugs.chromium.org/p/webrtc/issues/detail?id=6484.
-        // RTC_NOTREACHED();
-      }
-    }
-  }
-
-  available_buffer->SetSize(min_size);
-  return available_buffer;
-}
-
-int Vp9FrameBufferPool::GetNumBuffersInUse() const {
-  int num_buffers_in_use = 0;
-  rtc::CritScope cs(&buffers_lock_);
-  for (const auto& buffer : allocated_buffers_) {
-    if (!buffer->HasOneRef())
-      ++num_buffers_in_use;
-  }
-  return num_buffers_in_use;
-}
-
-void Vp9FrameBufferPool::ClearPool() {
-  rtc::CritScope cs(&buffers_lock_);
-  allocated_buffers_.clear();
-}
-
-// static
-int32_t Vp9FrameBufferPool::VpxGetFrameBuffer(void* user_priv,
-                                              size_t min_size,
-                                              vpx_codec_frame_buffer* fb) {
-  RTC_DCHECK(user_priv);
-  RTC_DCHECK(fb);
-  Vp9FrameBufferPool* pool = static_cast<Vp9FrameBufferPool*>(user_priv);
-
-  rtc::scoped_refptr<Vp9FrameBuffer> buffer = pool->GetFrameBuffer(min_size);
-  fb->data = buffer->GetData();
-  fb->size = buffer->GetDataSize();
-  // Store Vp9FrameBuffer* in |priv| for use in VpxReleaseFrameBuffer.
-  // This also makes vpx_codec_get_frame return images with their |fb_priv| set
-  // to |buffer| which is important for external reference counting.
-  // Release from refptr so that the buffer's |ref_count_| remains 1 when
-  // |buffer| goes out of scope.
-  fb->priv = static_cast<void*>(buffer.release());
-  return 0;
-}
-
-// static
-int32_t Vp9FrameBufferPool::VpxReleaseFrameBuffer(void* user_priv,
-                                                  vpx_codec_frame_buffer* fb) {
-  RTC_DCHECK(user_priv);
-  RTC_DCHECK(fb);
-  Vp9FrameBuffer* buffer = static_cast<Vp9FrameBuffer*>(fb->priv);
-  if (buffer != nullptr) {
-    buffer->Release();
-    // When libvpx fails to decode and you continue to try to decode (and fail)
-    // libvpx can for some reason try to release the same buffer multiple times.
-    // Setting |priv| to null protects against trying to Release multiple times.
-    fb->priv = nullptr;
-  }
-  return 0;
-}
-
-}  // namespace webrtc
diff --git a/modules/video_coding/codecs/vp9/vp9_frame_buffer_pool.h b/modules/video_coding/codecs/vp9/vp9_frame_buffer_pool.h
deleted file mode 100644
index d75f674..0000000
--- a/modules/video_coding/codecs/vp9/vp9_frame_buffer_pool.h
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- *  Copyright (c) 2015 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_VIDEO_CODING_CODECS_VP9_VP9_FRAME_BUFFER_POOL_H_
-#define WEBRTC_MODULES_VIDEO_CODING_CODECS_VP9_VP9_FRAME_BUFFER_POOL_H_
-
-#include <vector>
-
-#include "webrtc/rtc_base/basictypes.h"
-#include "webrtc/rtc_base/buffer.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/refcount.h"
-#include "webrtc/rtc_base/scoped_ref_ptr.h"
-
-struct vpx_codec_ctx;
-struct vpx_codec_frame_buffer;
-
-namespace webrtc {
-
-// This memory pool is used to serve buffers to libvpx for decoding purposes in
-// VP9, which is set up in InitializeVPXUsePool. After the initialization any
-// time libvpx wants to decode a frame it will use buffers provided and released
-// through VpxGetFrameBuffer and VpxReleaseFrameBuffer.
-// The benefit of owning the pool that libvpx relies on for decoding is that the
-// decoded frames returned by libvpx (from vpx_codec_get_frame) use parts of our
-// buffers for the decoded image data. By retaining ownership of this buffer
-// using scoped_refptr, the image buffer can be reused by VideoFrames and no
-// frame copy has to occur during decoding and frame delivery.
-//
-// Pseudo example usage case:
-//    Vp9FrameBufferPool pool;
-//    pool.InitializeVpxUsePool(decoder_ctx);
-//    ...
-//
-//    // During decoding, libvpx will get and release buffers from the pool.
-//    vpx_codec_decode(decoder_ctx, ...);
-//
-//    vpx_image_t* img = vpx_codec_get_frame(decoder_ctx, &iter);
-//    // Important to use scoped_refptr to protect it against being recycled by
-//    // the pool.
-//    scoped_refptr<Vp9FrameBuffer> img_buffer = (Vp9FrameBuffer*)img->fb_priv;
-//    ...
-//
-//    // Destroying the codec will make libvpx release any buffers it was using.
-//    vpx_codec_destroy(decoder_ctx);
-class Vp9FrameBufferPool {
- public:
-  class Vp9FrameBuffer : public rtc::RefCountInterface {
-   public:
-    uint8_t* GetData();
-    size_t GetDataSize() const;
-    void SetSize(size_t size);
-
-    virtual bool HasOneRef() const = 0;
-
-   private:
-    // Data as an easily resizable buffer.
-    rtc::Buffer data_;
-  };
-
-  // Configures libvpx to, in the specified context, use this memory pool for
-  // buffers used to decompress frames. This is only supported for VP9.
-  bool InitializeVpxUsePool(vpx_codec_ctx* vpx_codec_context);
-
-  // Gets a frame buffer of at least |min_size|, recycling an available one or
-  // creating a new one. When no longer referenced from the outside the buffer
-  // becomes recyclable.
-  rtc::scoped_refptr<Vp9FrameBuffer> GetFrameBuffer(size_t min_size);
-  // Gets the number of buffers currently in use (not ready to be recycled).
-  int GetNumBuffersInUse() const;
-  // Releases allocated buffers, deleting available buffers. Buffers in use are
-  // not deleted until they are no longer referenced.
-  void ClearPool();
-
-  // InitializeVpxUsePool configures libvpx to call this function when it needs
-  // a new frame buffer. Parameters:
-  // |user_priv| Private data passed to libvpx, InitializeVpxUsePool sets it up
-  //             to be a pointer to the pool.
-  // |min_size|  Minimum size needed by libvpx (to decompress a frame).
-  // |fb|        Pointer to the libvpx frame buffer object, this is updated to
-  //             use the pool's buffer.
-  // Returns 0 on success. Returns < 0 on failure.
-  static int32_t VpxGetFrameBuffer(void* user_priv,
-                                   size_t min_size,
-                                   vpx_codec_frame_buffer* fb);
-
-  // InitializeVpxUsePool configures libvpx to call this function when it has
-  // finished using one of the pool's frame buffer. Parameters:
-  // |user_priv| Private data passed to libvpx, InitializeVpxUsePool sets it up
-  //             to be a pointer to the pool.
-  // |fb|        Pointer to the libvpx frame buffer object, its |priv| will be
-  //             a pointer to one of the pool's Vp9FrameBuffer.
-  static int32_t VpxReleaseFrameBuffer(void* user_priv,
-                                       vpx_codec_frame_buffer* fb);
-
- private:
-  // Protects |allocated_buffers_|.
-  rtc::CriticalSection buffers_lock_;
-  // All buffers, in use or ready to be recycled.
-  std::vector<rtc::scoped_refptr<Vp9FrameBuffer>> allocated_buffers_
-      RTC_GUARDED_BY(buffers_lock_);
-  // If more buffers than this are allocated we print warnings and crash if in
-  // debug mode. VP9 is defined to have 8 reference buffers, of which 3 can be
-  // referenced by any frame, see
-  // https://tools.ietf.org/html/draft-grange-vp9-bitstream-00#section-2.2.2.
-  // Assuming VP9 holds on to at most 8 buffers, any more buffers than that
-  // would have to be by application code. Decoded frames should not be
-  // referenced for longer than necessary. If we allow ~60 additional buffers
-  // then the application has ~1 second to e.g. render each frame of a 60 fps
-  // video.
-  static const size_t max_num_buffers_ = 68;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_VIDEO_CODING_CODECS_VP9_VP9_FRAME_BUFFER_POOL_H_
diff --git a/modules/video_coding/codecs/vp9/vp9_impl.cc b/modules/video_coding/codecs/vp9/vp9_impl.cc
deleted file mode 100644
index dc8bba2..0000000
--- a/modules/video_coding/codecs/vp9/vp9_impl.cc
+++ /dev/null
@@ -1,1018 +0,0 @@
-/*
- *  Copyright (c) 2014 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/video_coding/codecs/vp9/vp9_impl.h"
-
-#include <stdlib.h>
-#include <string.h>
-#include <time.h>
-#include <vector>
-
-#include "vpx/vpx_encoder.h"
-#include "vpx/vpx_decoder.h"
-#include "vpx/vp8cx.h"
-#include "vpx/vp8dx.h"
-
-#include "webrtc/common_video/include/video_frame_buffer.h"
-#include "webrtc/common_video/libyuv/include/webrtc_libyuv.h"
-#include "webrtc/modules/video_coding/codecs/vp9/screenshare_layers.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/keep_ref_until_done.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/random.h"
-#include "webrtc/rtc_base/timeutils.h"
-#include "webrtc/rtc_base/trace_event.h"
-
-namespace webrtc {
-
-// Only positive speeds, range for real-time coding currently is: 5 - 8.
-// Lower means slower/better quality, higher means fastest/lower quality.
-int GetCpuSpeed(int width, int height) {
-#if defined(WEBRTC_ARCH_ARM) || defined(WEBRTC_ARCH_ARM64) || defined(ANDROID)
-  return 8;
-#else
-  // For smaller resolutions, use lower speed setting (get some coding gain at
-  // the cost of increased encoding complexity).
-  if (width * height <= 352 * 288)
-    return 5;
-  else
-    return 7;
-#endif
-}
-
-bool VP9Encoder::IsSupported() {
-  return true;
-}
-
-VP9Encoder* VP9Encoder::Create() {
-  return new VP9EncoderImpl();
-}
-
-void VP9EncoderImpl::EncoderOutputCodedPacketCallback(vpx_codec_cx_pkt* pkt,
-                                                      void* user_data) {
-  VP9EncoderImpl* enc = static_cast<VP9EncoderImpl*>(user_data);
-  enc->GetEncodedLayerFrame(pkt);
-}
-
-VP9EncoderImpl::VP9EncoderImpl()
-    : encoded_image_(),
-      encoded_complete_callback_(nullptr),
-      inited_(false),
-      timestamp_(0),
-      cpu_speed_(3),
-      rc_max_intra_target_(0),
-      encoder_(nullptr),
-      config_(nullptr),
-      raw_(nullptr),
-      input_image_(nullptr),
-      frames_since_kf_(0),
-      num_temporal_layers_(0),
-      num_spatial_layers_(0),
-      is_flexible_mode_(false),
-      frames_encoded_(0),
-      // Use two spatial when screensharing with flexible mode.
-      spatial_layer_(new ScreenshareLayersVP9(2)) {
-  memset(&codec_, 0, sizeof(codec_));
-  memset(&svc_params_, 0, sizeof(vpx_svc_extra_cfg_t));
-
-  Random random(rtc::TimeMicros());
-  picture_id_ = random.Rand<uint16_t>() & 0x7FFF;
-  tl0_pic_idx_ = random.Rand<uint8_t>();
-}
-
-VP9EncoderImpl::~VP9EncoderImpl() {
-  Release();
-}
-
-int VP9EncoderImpl::Release() {
-  if (encoded_image_._buffer != nullptr) {
-    delete[] encoded_image_._buffer;
-    encoded_image_._buffer = nullptr;
-  }
-  if (encoder_ != nullptr) {
-    if (vpx_codec_destroy(encoder_)) {
-      return WEBRTC_VIDEO_CODEC_MEMORY;
-    }
-    delete encoder_;
-    encoder_ = nullptr;
-  }
-  if (config_ != nullptr) {
-    delete config_;
-    config_ = nullptr;
-  }
-  if (raw_ != nullptr) {
-    vpx_img_free(raw_);
-    raw_ = nullptr;
-  }
-  inited_ = false;
-  return WEBRTC_VIDEO_CODEC_OK;
-}
-
-bool VP9EncoderImpl::ExplicitlyConfiguredSpatialLayers() const {
-  // We check target_bitrate_bps of the 0th layer to see if the spatial layers
-  // (i.e. bitrates) were explicitly configured.
-  return num_spatial_layers_ > 1 &&
-         codec_.spatialLayers[0].target_bitrate_bps > 0;
-}
-
-bool VP9EncoderImpl::SetSvcRates() {
-  uint8_t i = 0;
-
-  if (ExplicitlyConfiguredSpatialLayers()) {
-    if (num_temporal_layers_ > 1) {
-      LOG(LS_ERROR) << "Multiple temporal layers when manually specifying "
-                       "spatial layers not implemented yet!";
-      return false;
-    }
-    int total_bitrate_bps = 0;
-    for (i = 0; i < num_spatial_layers_; ++i)
-      total_bitrate_bps += codec_.spatialLayers[i].target_bitrate_bps;
-    // If total bitrate differs now from what has been specified at the
-    // beginning, update the bitrates in the same ratio as before.
-    for (i = 0; i < num_spatial_layers_; ++i) {
-      config_->ss_target_bitrate[i] = config_->layer_target_bitrate[i] =
-          static_cast<int>(static_cast<int64_t>(config_->rc_target_bitrate) *
-                           codec_.spatialLayers[i].target_bitrate_bps /
-                           total_bitrate_bps);
-    }
-  } else {
-    float rate_ratio[VPX_MAX_LAYERS] = {0};
-    float total = 0;
-
-    for (i = 0; i < num_spatial_layers_; ++i) {
-      if (svc_params_.scaling_factor_num[i] <= 0 ||
-          svc_params_.scaling_factor_den[i] <= 0) {
-        LOG(LS_ERROR) << "Scaling factors not specified!";
-        return false;
-      }
-      rate_ratio[i] =
-          static_cast<float>(svc_params_.scaling_factor_num[i]) /
-          svc_params_.scaling_factor_den[i];
-      total += rate_ratio[i];
-    }
-
-    for (i = 0; i < num_spatial_layers_; ++i) {
-      config_->ss_target_bitrate[i] = static_cast<unsigned int>(
-          config_->rc_target_bitrate * rate_ratio[i] / total);
-      if (num_temporal_layers_ == 1) {
-        config_->layer_target_bitrate[i] = config_->ss_target_bitrate[i];
-      } else if (num_temporal_layers_ == 2) {
-        config_->layer_target_bitrate[i * num_temporal_layers_] =
-            config_->ss_target_bitrate[i] * 2 / 3;
-        config_->layer_target_bitrate[i * num_temporal_layers_ + 1] =
-            config_->ss_target_bitrate[i];
-      } else if (num_temporal_layers_ == 3) {
-        config_->layer_target_bitrate[i * num_temporal_layers_] =
-            config_->ss_target_bitrate[i] / 2;
-        config_->layer_target_bitrate[i * num_temporal_layers_ + 1] =
-            config_->layer_target_bitrate[i * num_temporal_layers_] +
-            (config_->ss_target_bitrate[i] / 4);
-        config_->layer_target_bitrate[i * num_temporal_layers_ + 2] =
-            config_->ss_target_bitrate[i];
-      } else {
-        LOG(LS_ERROR) << "Unsupported number of temporal layers: "
-                      << num_temporal_layers_;
-        return false;
-      }
-    }
-  }
-
-  // For now, temporal layers only supported when having one spatial layer.
-  if (num_spatial_layers_ == 1) {
-    for (i = 0; i < num_temporal_layers_; ++i) {
-      config_->ts_target_bitrate[i] = config_->layer_target_bitrate[i];
-    }
-  }
-
-  return true;
-}
-
-int VP9EncoderImpl::SetRateAllocation(
-    const BitrateAllocation& bitrate_allocation,
-    uint32_t frame_rate) {
-  if (!inited_) {
-    return WEBRTC_VIDEO_CODEC_UNINITIALIZED;
-  }
-  if (encoder_->err) {
-    return WEBRTC_VIDEO_CODEC_ERROR;
-  }
-  if (frame_rate < 1) {
-    return WEBRTC_VIDEO_CODEC_ERR_PARAMETER;
-  }
-  // Update bit rate
-  if (codec_.maxBitrate > 0 &&
-      bitrate_allocation.get_sum_kbps() > codec_.maxBitrate) {
-    return WEBRTC_VIDEO_CODEC_ERR_PARAMETER;
-  }
-
-  // TODO(sprang): Actually use BitrateAllocation layer info.
-  config_->rc_target_bitrate = bitrate_allocation.get_sum_kbps();
-  codec_.maxFramerate = frame_rate;
-  spatial_layer_->ConfigureBitrate(bitrate_allocation.get_sum_kbps(), 0);
-
-  if (!SetSvcRates()) {
-    return WEBRTC_VIDEO_CODEC_ERR_PARAMETER;
-  }
-
-  // Update encoder context
-  if (vpx_codec_enc_config_set(encoder_, config_)) {
-    return WEBRTC_VIDEO_CODEC_ERROR;
-  }
-  return WEBRTC_VIDEO_CODEC_OK;
-}
-
-int VP9EncoderImpl::InitEncode(const VideoCodec* inst,
-                               int number_of_cores,
-                               size_t /*max_payload_size*/) {
-  if (inst == nullptr) {
-    return WEBRTC_VIDEO_CODEC_ERR_PARAMETER;
-  }
-  if (inst->maxFramerate < 1) {
-    return WEBRTC_VIDEO_CODEC_ERR_PARAMETER;
-  }
-  // Allow zero to represent an unspecified maxBitRate
-  if (inst->maxBitrate > 0 && inst->startBitrate > inst->maxBitrate) {
-    return WEBRTC_VIDEO_CODEC_ERR_PARAMETER;
-  }
-  if (inst->width < 1 || inst->height < 1) {
-    return WEBRTC_VIDEO_CODEC_ERR_PARAMETER;
-  }
-  if (number_of_cores < 1) {
-    return WEBRTC_VIDEO_CODEC_ERR_PARAMETER;
-  }
-  if (inst->VP9().numberOfTemporalLayers > 3) {
-    return WEBRTC_VIDEO_CODEC_ERR_PARAMETER;
-  }
-  // libvpx probably does not support more than 3 spatial layers.
-  if (inst->VP9().numberOfSpatialLayers > 3) {
-    return WEBRTC_VIDEO_CODEC_ERR_PARAMETER;
-  }
-
-  int ret_val = Release();
-  if (ret_val < 0) {
-    return ret_val;
-  }
-  if (encoder_ == nullptr) {
-    encoder_ = new vpx_codec_ctx_t;
-  }
-  if (config_ == nullptr) {
-    config_ = new vpx_codec_enc_cfg_t;
-  }
-  timestamp_ = 0;
-  if (&codec_ != inst) {
-    codec_ = *inst;
-  }
-
-  num_spatial_layers_ = inst->VP9().numberOfSpatialLayers;
-  num_temporal_layers_ = inst->VP9().numberOfTemporalLayers;
-  if (num_temporal_layers_ == 0)
-    num_temporal_layers_ = 1;
-
-  // Allocate memory for encoded image
-  if (encoded_image_._buffer != nullptr) {
-    delete[] encoded_image_._buffer;
-  }
-  encoded_image_._size =
-      CalcBufferSize(VideoType::kI420, codec_.width, codec_.height);
-  encoded_image_._buffer = new uint8_t[encoded_image_._size];
-  encoded_image_._completeFrame = true;
-  // Creating a wrapper to the image - setting image data to nullptr. Actual
-  // pointer will be set in encode. Setting align to 1, as it is meaningless
-  // (actual memory is not allocated).
-  raw_ = vpx_img_wrap(nullptr, VPX_IMG_FMT_I420, codec_.width, codec_.height, 1,
-                      nullptr);
-  // Populate encoder configuration with default values.
-  if (vpx_codec_enc_config_default(vpx_codec_vp9_cx(), config_, 0)) {
-    return WEBRTC_VIDEO_CODEC_ERROR;
-  }
-  config_->g_w = codec_.width;
-  config_->g_h = codec_.height;
-  config_->rc_target_bitrate = inst->startBitrate;  // in kbit/s
-  config_->g_error_resilient = inst->VP9().resilienceOn ? 1 : 0;
-  // Setting the time base of the codec.
-  config_->g_timebase.num = 1;
-  config_->g_timebase.den = 90000;
-  config_->g_lag_in_frames = 0;  // 0- no frame lagging
-  config_->g_threads = 1;
-  // Rate control settings.
-  config_->rc_dropframe_thresh = inst->VP9().frameDroppingOn ? 30 : 0;
-  config_->rc_end_usage = VPX_CBR;
-  config_->g_pass = VPX_RC_ONE_PASS;
-  config_->rc_min_quantizer = 2;
-  config_->rc_max_quantizer = 52;
-  config_->rc_undershoot_pct = 50;
-  config_->rc_overshoot_pct = 50;
-  config_->rc_buf_initial_sz = 500;
-  config_->rc_buf_optimal_sz = 600;
-  config_->rc_buf_sz = 1000;
-  // Set the maximum target size of any key-frame.
-  rc_max_intra_target_ = MaxIntraTarget(config_->rc_buf_optimal_sz);
-  if (inst->VP9().keyFrameInterval > 0) {
-    config_->kf_mode = VPX_KF_AUTO;
-    config_->kf_max_dist = inst->VP9().keyFrameInterval;
-    // Needs to be set (in svc mode) to get correct periodic key frame interval
-    // (will have no effect in non-svc).
-    config_->kf_min_dist = config_->kf_max_dist;
-  } else {
-    config_->kf_mode = VPX_KF_DISABLED;
-  }
-  config_->rc_resize_allowed = inst->VP9().automaticResizeOn ? 1 : 0;
-  // Determine number of threads based on the image size and #cores.
-  config_->g_threads =
-      NumberOfThreads(config_->g_w, config_->g_h, number_of_cores);
-
-  cpu_speed_ = GetCpuSpeed(config_->g_w, config_->g_h);
-
-  // TODO(asapersson): Check configuration of temporal switch up and increase
-  // pattern length.
-  is_flexible_mode_ = inst->VP9().flexibleMode;
-  if (is_flexible_mode_) {
-    config_->temporal_layering_mode = VP9E_TEMPORAL_LAYERING_MODE_BYPASS;
-    config_->ts_number_layers = num_temporal_layers_;
-    if (codec_.mode == kScreensharing)
-      spatial_layer_->ConfigureBitrate(inst->startBitrate, 0);
-  } else if (num_temporal_layers_ == 1) {
-    gof_.SetGofInfoVP9(kTemporalStructureMode1);
-    config_->temporal_layering_mode = VP9E_TEMPORAL_LAYERING_MODE_NOLAYERING;
-    config_->ts_number_layers = 1;
-    config_->ts_rate_decimator[0] = 1;
-    config_->ts_periodicity = 1;
-    config_->ts_layer_id[0] = 0;
-  } else if (num_temporal_layers_ == 2) {
-    gof_.SetGofInfoVP9(kTemporalStructureMode2);
-    config_->temporal_layering_mode = VP9E_TEMPORAL_LAYERING_MODE_0101;
-    config_->ts_number_layers = 2;
-    config_->ts_rate_decimator[0] = 2;
-    config_->ts_rate_decimator[1] = 1;
-    config_->ts_periodicity = 2;
-    config_->ts_layer_id[0] = 0;
-    config_->ts_layer_id[1] = 1;
-  } else if (num_temporal_layers_ == 3) {
-    gof_.SetGofInfoVP9(kTemporalStructureMode3);
-    config_->temporal_layering_mode = VP9E_TEMPORAL_LAYERING_MODE_0212;
-    config_->ts_number_layers = 3;
-    config_->ts_rate_decimator[0] = 4;
-    config_->ts_rate_decimator[1] = 2;
-    config_->ts_rate_decimator[2] = 1;
-    config_->ts_periodicity = 4;
-    config_->ts_layer_id[0] = 0;
-    config_->ts_layer_id[1] = 2;
-    config_->ts_layer_id[2] = 1;
-    config_->ts_layer_id[3] = 2;
-  } else {
-    return WEBRTC_VIDEO_CODEC_ERR_PARAMETER;
-  }
-
-  return InitAndSetControlSettings(inst);
-}
-
-int VP9EncoderImpl::NumberOfThreads(int width,
-                                    int height,
-                                    int number_of_cores) {
-  // Keep the number of encoder threads equal to the possible number of column
-  // tiles, which is (1, 2, 4, 8). See comments below for VP9E_SET_TILE_COLUMNS.
-  if (width * height >= 1280 * 720 && number_of_cores > 4) {
-    return 4;
-  } else if (width * height >= 640 * 360 && number_of_cores > 2) {
-    return 2;
-  } else {
-    // 1 thread less than VGA.
-    return 1;
-  }
-}
-
-int VP9EncoderImpl::InitAndSetControlSettings(const VideoCodec* inst) {
-  // Set QP-min/max per spatial and temporal layer.
-  int tot_num_layers = num_spatial_layers_ * num_temporal_layers_;
-  for (int i = 0; i < tot_num_layers; ++i) {
-    svc_params_.max_quantizers[i] = config_->rc_max_quantizer;
-    svc_params_.min_quantizers[i] = config_->rc_min_quantizer;
-  }
-  config_->ss_number_layers = num_spatial_layers_;
-  if (ExplicitlyConfiguredSpatialLayers()) {
-    for (int i = 0; i < num_spatial_layers_; ++i) {
-      const auto& layer = codec_.spatialLayers[i];
-      svc_params_.scaling_factor_num[i] = layer.scaling_factor_num;
-      svc_params_.scaling_factor_den[i] = layer.scaling_factor_den;
-    }
-  } else {
-    int scaling_factor_num = 256;
-    for (int i = num_spatial_layers_ - 1; i >= 0; --i) {
-      // 1:2 scaling in each dimension.
-      svc_params_.scaling_factor_num[i] = scaling_factor_num;
-      svc_params_.scaling_factor_den[i] = 256;
-      if (codec_.mode != kScreensharing)
-        scaling_factor_num /= 2;
-    }
-  }
-
-  if (!SetSvcRates()) {
-    return WEBRTC_VIDEO_CODEC_ERR_PARAMETER;
-  }
-
-  if (vpx_codec_enc_init(encoder_, vpx_codec_vp9_cx(), config_, 0)) {
-    return WEBRTC_VIDEO_CODEC_UNINITIALIZED;
-  }
-  vpx_codec_control(encoder_, VP8E_SET_CPUUSED, cpu_speed_);
-  vpx_codec_control(encoder_, VP8E_SET_MAX_INTRA_BITRATE_PCT,
-                    rc_max_intra_target_);
-  vpx_codec_control(encoder_, VP9E_SET_AQ_MODE,
-                    inst->VP9().adaptiveQpMode ? 3 : 0);
-
-  vpx_codec_control(encoder_, VP9E_SET_FRAME_PARALLEL_DECODING, 0);
-  vpx_codec_control(
-      encoder_, VP9E_SET_SVC,
-      (num_temporal_layers_ > 1 || num_spatial_layers_ > 1) ? 1 : 0);
-  if (num_temporal_layers_ > 1 || num_spatial_layers_ > 1) {
-    vpx_codec_control(encoder_, VP9E_SET_SVC_PARAMETERS,
-                      &svc_params_);
-  }
-  // Register callback for getting each spatial layer.
-  vpx_codec_priv_output_cx_pkt_cb_pair_t cbp = {
-      VP9EncoderImpl::EncoderOutputCodedPacketCallback,
-      reinterpret_cast<void*>(this)};
-  vpx_codec_control(encoder_, VP9E_REGISTER_CX_CALLBACK,
-                    reinterpret_cast<void*>(&cbp));
-
-  // Control function to set the number of column tiles in encoding a frame, in
-  // log2 unit: e.g., 0 = 1 tile column, 1 = 2 tile columns, 2 = 4 tile columns.
-  // The number tile columns will be capped by the encoder based on image size
-  // (minimum width of tile column is 256 pixels, maximum is 4096).
-  vpx_codec_control(encoder_, VP9E_SET_TILE_COLUMNS, (config_->g_threads >> 1));
-
-  // Turn on row-based multithreading.
-  vpx_codec_control(encoder_, VP9E_SET_ROW_MT, 1);
-
-#if !defined(WEBRTC_ARCH_ARM) && !defined(WEBRTC_ARCH_ARM64) && \
-  !defined(ANDROID)
-  // Do not enable the denoiser on ARM since optimization is pending.
-  // Denoiser is on by default on other platforms.
-  vpx_codec_control(encoder_, VP9E_SET_NOISE_SENSITIVITY,
-                    inst->VP9().denoisingOn ? 1 : 0);
-#endif
-
-  if (codec_.mode == kScreensharing) {
-    // Adjust internal parameters to screen content.
-    vpx_codec_control(encoder_, VP9E_SET_TUNE_CONTENT, 1);
-  }
-  // Enable encoder skip of static/low content blocks.
-  vpx_codec_control(encoder_, VP8E_SET_STATIC_THRESHOLD, 1);
-  inited_ = true;
-  return WEBRTC_VIDEO_CODEC_OK;
-}
-
-uint32_t VP9EncoderImpl::MaxIntraTarget(uint32_t optimal_buffer_size) {
-  // Set max to the optimal buffer level (normalized by target BR),
-  // and scaled by a scale_par.
-  // Max target size = scale_par * optimal_buffer_size * targetBR[Kbps].
-  // This value is presented in percentage of perFrameBw:
-  // perFrameBw = targetBR[Kbps] * 1000 / framerate.
-  // The target in % is as follows:
-  float scale_par = 0.5;
-  uint32_t target_pct =
-      optimal_buffer_size * scale_par * codec_.maxFramerate / 10;
-  // Don't go below 3 times the per frame bandwidth.
-  const uint32_t min_intra_size = 300;
-  return (target_pct < min_intra_size) ? min_intra_size : target_pct;
-}
-
-int VP9EncoderImpl::Encode(const VideoFrame& input_image,
-                           const CodecSpecificInfo* codec_specific_info,
-                           const std::vector<FrameType>* frame_types) {
-  if (!inited_) {
-    return WEBRTC_VIDEO_CODEC_UNINITIALIZED;
-  }
-  if (encoded_complete_callback_ == nullptr) {
-    return WEBRTC_VIDEO_CODEC_UNINITIALIZED;
-  }
-  FrameType frame_type = kVideoFrameDelta;
-  // We only support one stream at the moment.
-  if (frame_types && frame_types->size() > 0) {
-    frame_type = (*frame_types)[0];
-  }
-  RTC_DCHECK_EQ(input_image.width(), raw_->d_w);
-  RTC_DCHECK_EQ(input_image.height(), raw_->d_h);
-
-  // Set input image for use in the callback.
-  // This was necessary since you need some information from input_image.
-  // You can save only the necessary information (such as timestamp) instead of
-  // doing this.
-  input_image_ = &input_image;
-
-  rtc::scoped_refptr<I420BufferInterface> i420_buffer =
-      input_image.video_frame_buffer()->ToI420();
-  // Image in vpx_image_t format.
-  // Input image is const. VPX's raw image is not defined as const.
-  raw_->planes[VPX_PLANE_Y] = const_cast<uint8_t*>(i420_buffer->DataY());
-  raw_->planes[VPX_PLANE_U] = const_cast<uint8_t*>(i420_buffer->DataU());
-  raw_->planes[VPX_PLANE_V] = const_cast<uint8_t*>(i420_buffer->DataV());
-  raw_->stride[VPX_PLANE_Y] = i420_buffer->StrideY();
-  raw_->stride[VPX_PLANE_U] = i420_buffer->StrideU();
-  raw_->stride[VPX_PLANE_V] = i420_buffer->StrideV();
-
-  vpx_enc_frame_flags_t flags = 0;
-  bool send_keyframe = (frame_type == kVideoFrameKey);
-  if (send_keyframe) {
-    // Key frame request from caller.
-    flags = VPX_EFLAG_FORCE_KF;
-  }
-
-  if (is_flexible_mode_) {
-    SuperFrameRefSettings settings;
-
-    // These structs are copied when calling vpx_codec_control,
-    // therefore it is ok for them to go out of scope.
-    vpx_svc_ref_frame_config enc_layer_conf;
-    vpx_svc_layer_id layer_id;
-
-    if (codec_.mode == kRealtimeVideo) {
-      // Real time video not yet implemented in flexible mode.
-      RTC_NOTREACHED();
-    } else {
-      settings = spatial_layer_->GetSuperFrameSettings(input_image.timestamp(),
-                                                       send_keyframe);
-    }
-    enc_layer_conf = GenerateRefsAndFlags(settings);
-    layer_id.temporal_layer_id = 0;
-    layer_id.spatial_layer_id = settings.start_layer;
-    vpx_codec_control(encoder_, VP9E_SET_SVC_LAYER_ID, &layer_id);
-    vpx_codec_control(encoder_, VP9E_SET_SVC_REF_FRAME_CONFIG, &enc_layer_conf);
-  }
-
-  RTC_CHECK_GT(codec_.maxFramerate, 0);
-  uint32_t duration = 90000 / codec_.maxFramerate;
-  if (vpx_codec_encode(encoder_, raw_, timestamp_, duration, flags,
-                       VPX_DL_REALTIME)) {
-    return WEBRTC_VIDEO_CODEC_ERROR;
-  }
-  timestamp_ += duration;
-
-  return WEBRTC_VIDEO_CODEC_OK;
-}
-
-void VP9EncoderImpl::PopulateCodecSpecific(CodecSpecificInfo* codec_specific,
-                                           const vpx_codec_cx_pkt& pkt,
-                                           uint32_t timestamp) {
-  RTC_CHECK(codec_specific != nullptr);
-  codec_specific->codecType = kVideoCodecVP9;
-  codec_specific->codec_name = ImplementationName();
-  CodecSpecificInfoVP9* vp9_info = &(codec_specific->codecSpecific.VP9);
-  // TODO(asapersson): Set correct value.
-  vp9_info->inter_pic_predicted =
-      (pkt.data.frame.flags & VPX_FRAME_IS_KEY) ? false : true;
-  vp9_info->flexible_mode = codec_.VP9()->flexibleMode;
-  vp9_info->ss_data_available =
-      ((pkt.data.frame.flags & VPX_FRAME_IS_KEY) && !codec_.VP9()->flexibleMode)
-          ? true
-          : false;
-
-  vpx_svc_layer_id_t layer_id = {0};
-  vpx_codec_control(encoder_, VP9E_GET_SVC_LAYER_ID, &layer_id);
-
-  RTC_CHECK_GT(num_temporal_layers_, 0);
-  RTC_CHECK_GT(num_spatial_layers_, 0);
-  if (num_temporal_layers_ == 1) {
-    RTC_CHECK_EQ(layer_id.temporal_layer_id, 0);
-    vp9_info->temporal_idx = kNoTemporalIdx;
-  } else {
-    vp9_info->temporal_idx = layer_id.temporal_layer_id;
-  }
-  if (num_spatial_layers_ == 1) {
-    RTC_CHECK_EQ(layer_id.spatial_layer_id, 0);
-    vp9_info->spatial_idx = kNoSpatialIdx;
-  } else {
-    vp9_info->spatial_idx = layer_id.spatial_layer_id;
-  }
-  if (layer_id.spatial_layer_id != 0) {
-    vp9_info->ss_data_available = false;
-  }
-
-  // TODO(asapersson): this info has to be obtained from the encoder.
-  vp9_info->temporal_up_switch = false;
-
-  bool is_first_frame = false;
-  if (is_flexible_mode_) {
-    is_first_frame =
-        layer_id.spatial_layer_id == spatial_layer_->GetStartLayer();
-  } else {
-    is_first_frame = layer_id.spatial_layer_id == 0;
-  }
-
-  if (is_first_frame) {
-    picture_id_ = (picture_id_ + 1) & 0x7FFF;
-    // TODO(asapersson): this info has to be obtained from the encoder.
-    vp9_info->inter_layer_predicted = false;
-    ++frames_since_kf_;
-  } else {
-    // TODO(asapersson): this info has to be obtained from the encoder.
-    vp9_info->inter_layer_predicted = true;
-  }
-
-  if (pkt.data.frame.flags & VPX_FRAME_IS_KEY) {
-    frames_since_kf_ = 0;
-  }
-
-  vp9_info->picture_id = picture_id_;
-
-  if (!vp9_info->flexible_mode) {
-    if (layer_id.temporal_layer_id == 0 && layer_id.spatial_layer_id == 0) {
-      tl0_pic_idx_++;
-    }
-    vp9_info->tl0_pic_idx = tl0_pic_idx_;
-  }
-
-  // Always populate this, so that the packetizer can properly set the marker
-  // bit.
-  vp9_info->num_spatial_layers = num_spatial_layers_;
-
-  vp9_info->num_ref_pics = 0;
-  if (vp9_info->flexible_mode) {
-    vp9_info->gof_idx = kNoGofIdx;
-    vp9_info->num_ref_pics = num_ref_pics_[layer_id.spatial_layer_id];
-    for (int i = 0; i < num_ref_pics_[layer_id.spatial_layer_id]; ++i) {
-      vp9_info->p_diff[i] = p_diff_[layer_id.spatial_layer_id][i];
-    }
-  } else {
-    vp9_info->gof_idx =
-        static_cast<uint8_t>(frames_since_kf_ % gof_.num_frames_in_gof);
-    vp9_info->temporal_up_switch = gof_.temporal_up_switch[vp9_info->gof_idx];
-  }
-
-  if (vp9_info->ss_data_available) {
-    vp9_info->spatial_layer_resolution_present = true;
-    for (size_t i = 0; i < vp9_info->num_spatial_layers; ++i) {
-      vp9_info->width[i] = codec_.width *
-                           svc_params_.scaling_factor_num[i] /
-                           svc_params_.scaling_factor_den[i];
-      vp9_info->height[i] = codec_.height *
-                            svc_params_.scaling_factor_num[i] /
-                            svc_params_.scaling_factor_den[i];
-    }
-    if (!vp9_info->flexible_mode) {
-      vp9_info->gof.CopyGofInfoVP9(gof_);
-    }
-  }
-}
-
-int VP9EncoderImpl::GetEncodedLayerFrame(const vpx_codec_cx_pkt* pkt) {
-  RTC_DCHECK_EQ(pkt->kind, VPX_CODEC_CX_FRAME_PKT);
-
-  if (pkt->data.frame.sz > encoded_image_._size) {
-    delete[] encoded_image_._buffer;
-    encoded_image_._size = pkt->data.frame.sz;
-    encoded_image_._buffer = new uint8_t[encoded_image_._size];
-  }
-  memcpy(encoded_image_._buffer, pkt->data.frame.buf, pkt->data.frame.sz);
-  encoded_image_._length = pkt->data.frame.sz;
-
-  // No data partitioning in VP9, so 1 partition only.
-  int part_idx = 0;
-  RTPFragmentationHeader frag_info;
-  frag_info.VerifyAndAllocateFragmentationHeader(1);
-  frag_info.fragmentationOffset[part_idx] = 0;
-  frag_info.fragmentationLength[part_idx] = pkt->data.frame.sz;
-  frag_info.fragmentationPlType[part_idx] = 0;
-  frag_info.fragmentationTimeDiff[part_idx] = 0;
-
-  vpx_svc_layer_id_t layer_id = {0};
-  vpx_codec_control(encoder_, VP9E_GET_SVC_LAYER_ID, &layer_id);
-  if (is_flexible_mode_ && codec_.mode == kScreensharing)
-    spatial_layer_->LayerFrameEncoded(
-        static_cast<unsigned int>(encoded_image_._length),
-        layer_id.spatial_layer_id);
-
-  // End of frame.
-  // Check if encoded frame is a key frame.
-  encoded_image_._frameType = kVideoFrameDelta;
-  if (pkt->data.frame.flags & VPX_FRAME_IS_KEY) {
-    encoded_image_._frameType = kVideoFrameKey;
-  }
-  RTC_DCHECK_LE(encoded_image_._length, encoded_image_._size);
-
-  CodecSpecificInfo codec_specific;
-  PopulateCodecSpecific(&codec_specific, *pkt, input_image_->timestamp());
-
-  if (encoded_image_._length > 0) {
-    TRACE_COUNTER1("webrtc", "EncodedFrameSize", encoded_image_._length);
-    encoded_image_._timeStamp = input_image_->timestamp();
-    encoded_image_.capture_time_ms_ = input_image_->render_time_ms();
-    encoded_image_.rotation_ = input_image_->rotation();
-    encoded_image_.content_type_ = (codec_.mode == kScreensharing)
-                                       ? VideoContentType::SCREENSHARE
-                                       : VideoContentType::UNSPECIFIED;
-    encoded_image_._encodedHeight = raw_->d_h;
-    encoded_image_._encodedWidth = raw_->d_w;
-    encoded_image_.timing_.flags = TimingFrameFlags::kInvalid;
-    int qp = -1;
-    vpx_codec_control(encoder_, VP8E_GET_LAST_QUANTIZER, &qp);
-    encoded_image_.qp_ = qp;
-
-    encoded_complete_callback_->OnEncodedImage(encoded_image_, &codec_specific,
-                                               &frag_info);
-  }
-  return WEBRTC_VIDEO_CODEC_OK;
-}
-
-vpx_svc_ref_frame_config VP9EncoderImpl::GenerateRefsAndFlags(
-    const SuperFrameRefSettings& settings) {
-  static const vpx_enc_frame_flags_t kAllFlags =
-      VP8_EFLAG_NO_REF_ARF | VP8_EFLAG_NO_REF_GF | VP8_EFLAG_NO_REF_LAST |
-      VP8_EFLAG_NO_UPD_LAST | VP8_EFLAG_NO_UPD_ARF | VP8_EFLAG_NO_UPD_GF;
-  vpx_svc_ref_frame_config sf_conf = {};
-  if (settings.is_keyframe) {
-    // Used later on to make sure we don't make any invalid references.
-    memset(buffer_updated_at_frame_, -1, sizeof(buffer_updated_at_frame_));
-    for (int layer = settings.start_layer; layer <= settings.stop_layer;
-         ++layer) {
-      num_ref_pics_[layer] = 0;
-      buffer_updated_at_frame_[settings.layer[layer].upd_buf] = frames_encoded_;
-      // When encoding a keyframe only the alt_fb_idx is used
-      // to specify which layer ends up in which buffer.
-      sf_conf.alt_fb_idx[layer] = settings.layer[layer].upd_buf;
-    }
-  } else {
-    for (int layer_idx = settings.start_layer; layer_idx <= settings.stop_layer;
-         ++layer_idx) {
-      vpx_enc_frame_flags_t layer_flags = kAllFlags;
-      num_ref_pics_[layer_idx] = 0;
-      int8_t refs[3] = {settings.layer[layer_idx].ref_buf1,
-                        settings.layer[layer_idx].ref_buf2,
-                        settings.layer[layer_idx].ref_buf3};
-
-      for (unsigned int ref_idx = 0; ref_idx < kMaxVp9RefPics; ++ref_idx) {
-        if (refs[ref_idx] == -1)
-          continue;
-
-        RTC_DCHECK_GE(refs[ref_idx], 0);
-        RTC_DCHECK_LE(refs[ref_idx], 7);
-        // Easier to remove flags from all flags rather than having to
-        // build the flags from 0.
-        switch (num_ref_pics_[layer_idx]) {
-          case 0: {
-            sf_conf.lst_fb_idx[layer_idx] = refs[ref_idx];
-            layer_flags &= ~VP8_EFLAG_NO_REF_LAST;
-            break;
-          }
-          case 1: {
-            sf_conf.gld_fb_idx[layer_idx] = refs[ref_idx];
-            layer_flags &= ~VP8_EFLAG_NO_REF_GF;
-            break;
-          }
-          case 2: {
-            sf_conf.alt_fb_idx[layer_idx] = refs[ref_idx];
-            layer_flags &= ~VP8_EFLAG_NO_REF_ARF;
-            break;
-          }
-        }
-        // Make sure we don't reference a buffer that hasn't been
-        // used at all or hasn't been used since a keyframe.
-        RTC_DCHECK_NE(buffer_updated_at_frame_[refs[ref_idx]], -1);
-
-        p_diff_[layer_idx][num_ref_pics_[layer_idx]] =
-            frames_encoded_ - buffer_updated_at_frame_[refs[ref_idx]];
-        num_ref_pics_[layer_idx]++;
-      }
-
-      bool upd_buf_same_as_a_ref = false;
-      if (settings.layer[layer_idx].upd_buf != -1) {
-        for (unsigned int ref_idx = 0; ref_idx < kMaxVp9RefPics; ++ref_idx) {
-          if (settings.layer[layer_idx].upd_buf == refs[ref_idx]) {
-            switch (ref_idx) {
-              case 0: {
-                layer_flags &= ~VP8_EFLAG_NO_UPD_LAST;
-                break;
-              }
-              case 1: {
-                layer_flags &= ~VP8_EFLAG_NO_UPD_GF;
-                break;
-              }
-              case 2: {
-                layer_flags &= ~VP8_EFLAG_NO_UPD_ARF;
-                break;
-              }
-            }
-            upd_buf_same_as_a_ref = true;
-            break;
-          }
-        }
-        if (!upd_buf_same_as_a_ref) {
-          // If we have three references and a buffer is specified to be
-          // updated, then that buffer must be the same as one of the
-          // three references.
-          RTC_CHECK_LT(num_ref_pics_[layer_idx], kMaxVp9RefPics);
-
-          sf_conf.alt_fb_idx[layer_idx] = settings.layer[layer_idx].upd_buf;
-          layer_flags ^= VP8_EFLAG_NO_UPD_ARF;
-        }
-
-        int updated_buffer = settings.layer[layer_idx].upd_buf;
-        buffer_updated_at_frame_[updated_buffer] = frames_encoded_;
-        sf_conf.frame_flags[layer_idx] = layer_flags;
-      }
-    }
-  }
-  ++frames_encoded_;
-  return sf_conf;
-}
-
-int VP9EncoderImpl::SetChannelParameters(uint32_t packet_loss, int64_t rtt) {
-  return WEBRTC_VIDEO_CODEC_OK;
-}
-
-int VP9EncoderImpl::RegisterEncodeCompleteCallback(
-    EncodedImageCallback* callback) {
-  encoded_complete_callback_ = callback;
-  return WEBRTC_VIDEO_CODEC_OK;
-}
-
-const char* VP9EncoderImpl::ImplementationName() const {
-  return "libvpx";
-}
-
-bool VP9Decoder::IsSupported() {
-  return true;
-}
-
-VP9Decoder* VP9Decoder::Create() {
-  return new VP9DecoderImpl();
-}
-
-VP9DecoderImpl::VP9DecoderImpl()
-    : decode_complete_callback_(nullptr),
-      inited_(false),
-      decoder_(nullptr),
-      key_frame_required_(true) {
-  memset(&codec_, 0, sizeof(codec_));
-}
-
-VP9DecoderImpl::~VP9DecoderImpl() {
-  inited_ = true;  // in order to do the actual release
-  Release();
-  int num_buffers_in_use = frame_buffer_pool_.GetNumBuffersInUse();
-  if (num_buffers_in_use > 0) {
-    // The frame buffers are reference counted and frames are exposed after
-    // decoding. There may be valid usage cases where previous frames are still
-    // referenced after ~VP9DecoderImpl that is not a leak.
-    LOG(LS_INFO) << num_buffers_in_use << " Vp9FrameBuffers are still "
-                 << "referenced during ~VP9DecoderImpl.";
-  }
-}
-
-int VP9DecoderImpl::InitDecode(const VideoCodec* inst, int number_of_cores) {
-  if (inst == nullptr) {
-    return WEBRTC_VIDEO_CODEC_ERR_PARAMETER;
-  }
-  int ret_val = Release();
-  if (ret_val < 0) {
-    return ret_val;
-  }
-  if (decoder_ == nullptr) {
-    decoder_ = new vpx_codec_ctx_t;
-  }
-  vpx_codec_dec_cfg_t cfg;
-  // Setting number of threads to a constant value (1)
-  cfg.threads = 1;
-  cfg.h = cfg.w = 0;  // set after decode
-  vpx_codec_flags_t flags = 0;
-  if (vpx_codec_dec_init(decoder_, vpx_codec_vp9_dx(), &cfg, flags)) {
-    return WEBRTC_VIDEO_CODEC_MEMORY;
-  }
-  if (&codec_ != inst) {
-    // Save VideoCodec instance for later; mainly for duplicating the decoder.
-    codec_ = *inst;
-  }
-
-  if (!frame_buffer_pool_.InitializeVpxUsePool(decoder_)) {
-    return WEBRTC_VIDEO_CODEC_MEMORY;
-  }
-
-  inited_ = true;
-  // Always start with a complete key frame.
-  key_frame_required_ = true;
-  return WEBRTC_VIDEO_CODEC_OK;
-}
-
-int VP9DecoderImpl::Decode(const EncodedImage& input_image,
-                           bool missing_frames,
-                           const RTPFragmentationHeader* fragmentation,
-                           const CodecSpecificInfo* codec_specific_info,
-                           int64_t /*render_time_ms*/) {
-  if (!inited_) {
-    return WEBRTC_VIDEO_CODEC_UNINITIALIZED;
-  }
-  if (decode_complete_callback_ == nullptr) {
-    return WEBRTC_VIDEO_CODEC_UNINITIALIZED;
-  }
-  // Always start with a complete key frame.
-  if (key_frame_required_) {
-    if (input_image._frameType != kVideoFrameKey)
-      return WEBRTC_VIDEO_CODEC_ERROR;
-    // We have a key frame - is it complete?
-    if (input_image._completeFrame) {
-      key_frame_required_ = false;
-    } else {
-      return WEBRTC_VIDEO_CODEC_ERROR;
-    }
-  }
-  vpx_codec_iter_t iter = nullptr;
-  vpx_image_t* img;
-  uint8_t* buffer = input_image._buffer;
-  if (input_image._length == 0) {
-    buffer = nullptr;  // Triggers full frame concealment.
-  }
-  // During decode libvpx may get and release buffers from |frame_buffer_pool_|.
-  // In practice libvpx keeps a few (~3-4) buffers alive at a time.
-  if (vpx_codec_decode(decoder_, buffer,
-                       static_cast<unsigned int>(input_image._length), 0,
-                       VPX_DL_REALTIME)) {
-    return WEBRTC_VIDEO_CODEC_ERROR;
-  }
-  // |img->fb_priv| contains the image data, a reference counted Vp9FrameBuffer.
-  // It may be released by libvpx during future vpx_codec_decode or
-  // vpx_codec_destroy calls.
-  img = vpx_codec_get_frame(decoder_, &iter);
-  int qp;
-  vpx_codec_err_t vpx_ret =
-      vpx_codec_control(decoder_, VPXD_GET_LAST_QUANTIZER, &qp);
-  RTC_DCHECK_EQ(vpx_ret, VPX_CODEC_OK);
-  int ret =
-      ReturnFrame(img, input_image._timeStamp, input_image.ntp_time_ms_, qp);
-  if (ret != 0) {
-    return ret;
-  }
-  return WEBRTC_VIDEO_CODEC_OK;
-}
-
-int VP9DecoderImpl::ReturnFrame(const vpx_image_t* img,
-                                uint32_t timestamp,
-                                int64_t ntp_time_ms,
-                                int qp) {
-  if (img == nullptr) {
-    // Decoder OK and nullptr image => No show frame.
-    return WEBRTC_VIDEO_CODEC_NO_OUTPUT;
-  }
-
-  // This buffer contains all of |img|'s image data, a reference counted
-  // Vp9FrameBuffer. (libvpx is done with the buffers after a few
-  // vpx_codec_decode calls or vpx_codec_destroy).
-  Vp9FrameBufferPool::Vp9FrameBuffer* img_buffer =
-      static_cast<Vp9FrameBufferPool::Vp9FrameBuffer*>(img->fb_priv);
-  // The buffer can be used directly by the VideoFrame (without copy) by
-  // using a WrappedI420Buffer.
-  rtc::scoped_refptr<WrappedI420Buffer> img_wrapped_buffer(
-      new rtc::RefCountedObject<webrtc::WrappedI420Buffer>(
-          img->d_w, img->d_h, img->planes[VPX_PLANE_Y],
-          img->stride[VPX_PLANE_Y], img->planes[VPX_PLANE_U],
-          img->stride[VPX_PLANE_U], img->planes[VPX_PLANE_V],
-          img->stride[VPX_PLANE_V],
-          // WrappedI420Buffer's mechanism for allowing the release of its frame
-          // buffer is through a callback function. This is where we should
-          // release |img_buffer|.
-          rtc::KeepRefUntilDone(img_buffer)));
-
-  VideoFrame decoded_image(img_wrapped_buffer, timestamp,
-                           0 /* render_time_ms */, webrtc::kVideoRotation_0);
-  decoded_image.set_ntp_time_ms(ntp_time_ms);
-
-  decode_complete_callback_->Decoded(decoded_image, rtc::Optional<int32_t>(),
-                                     rtc::Optional<uint8_t>(qp));
-  return WEBRTC_VIDEO_CODEC_OK;
-}
-
-int VP9DecoderImpl::RegisterDecodeCompleteCallback(
-    DecodedImageCallback* callback) {
-  decode_complete_callback_ = callback;
-  return WEBRTC_VIDEO_CODEC_OK;
-}
-
-int VP9DecoderImpl::Release() {
-  if (decoder_ != nullptr) {
-    // When a codec is destroyed libvpx will release any buffers of
-    // |frame_buffer_pool_| it is currently using.
-    if (vpx_codec_destroy(decoder_)) {
-      return WEBRTC_VIDEO_CODEC_MEMORY;
-    }
-    delete decoder_;
-    decoder_ = nullptr;
-  }
-  // Releases buffers from the pool. Any buffers not in use are deleted. Buffers
-  // still referenced externally are deleted once fully released, not returning
-  // to the pool.
-  frame_buffer_pool_.ClearPool();
-  inited_ = false;
-  return WEBRTC_VIDEO_CODEC_OK;
-}
-
-const char* VP9DecoderImpl::ImplementationName() const {
-  return "libvpx";
-}
-
-}  // namespace webrtc
diff --git a/modules/video_coding/codecs/vp9/vp9_impl.h b/modules/video_coding/codecs/vp9/vp9_impl.h
deleted file mode 100644
index 7555ccb..0000000
--- a/modules/video_coding/codecs/vp9/vp9_impl.h
+++ /dev/null
@@ -1,172 +0,0 @@
-/*
- *  Copyright (c) 2014 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_VIDEO_CODING_CODECS_VP9_VP9_IMPL_H_
-#define WEBRTC_MODULES_VIDEO_CODING_CODECS_VP9_VP9_IMPL_H_
-
-#include <memory>
-#include <vector>
-
-#include "webrtc/modules/video_coding/codecs/vp9/include/vp9.h"
-#include "webrtc/modules/video_coding/codecs/vp9/vp9_frame_buffer_pool.h"
-
-#include "vpx/vp8cx.h"
-#include "vpx/vpx_decoder.h"
-#include "vpx/vpx_encoder.h"
-
-namespace webrtc {
-
-class ScreenshareLayersVP9;
-
-class VP9EncoderImpl : public VP9Encoder {
- public:
-  VP9EncoderImpl();
-
-  virtual ~VP9EncoderImpl();
-
-  int Release() override;
-
-  int InitEncode(const VideoCodec* codec_settings,
-                 int number_of_cores,
-                 size_t max_payload_size) override;
-
-  int Encode(const VideoFrame& input_image,
-             const CodecSpecificInfo* codec_specific_info,
-             const std::vector<FrameType>* frame_types) override;
-
-  int RegisterEncodeCompleteCallback(EncodedImageCallback* callback) override;
-
-  int SetChannelParameters(uint32_t packet_loss, int64_t rtt) override;
-
-  int SetRateAllocation(const BitrateAllocation& bitrate_allocation,
-                        uint32_t frame_rate) override;
-
-  const char* ImplementationName() const override;
-
-  struct LayerFrameRefSettings {
-    int8_t upd_buf = -1;   // -1 - no update,    0..7 - update buffer 0..7
-    int8_t ref_buf1 = -1;  // -1 - no reference, 0..7 - reference buffer 0..7
-    int8_t ref_buf2 = -1;  // -1 - no reference, 0..7 - reference buffer 0..7
-    int8_t ref_buf3 = -1;  // -1 - no reference, 0..7 - reference buffer 0..7
-  };
-
-  struct SuperFrameRefSettings {
-    LayerFrameRefSettings layer[kMaxVp9NumberOfSpatialLayers];
-    uint8_t start_layer = 0;  // The first spatial layer to be encoded.
-    uint8_t stop_layer = 0;   // The last spatial layer to be encoded.
-    bool is_keyframe = false;
-  };
-
- private:
-  // Determine number of encoder threads to use.
-  int NumberOfThreads(int width, int height, int number_of_cores);
-
-  // Call encoder initialize function and set control settings.
-  int InitAndSetControlSettings(const VideoCodec* inst);
-
-  void PopulateCodecSpecific(CodecSpecificInfo* codec_specific,
-                             const vpx_codec_cx_pkt& pkt,
-                             uint32_t timestamp);
-
-  bool ExplicitlyConfiguredSpatialLayers() const;
-  bool SetSvcRates();
-
-  // Used for flexible mode to set the flags and buffer references used
-  // by the encoder. Also calculates the references used by the RTP
-  // packetizer.
-  //
-  // Has to be called for every frame (keyframes included) to update the
-  // state used to calculate references.
-  vpx_svc_ref_frame_config GenerateRefsAndFlags(
-      const SuperFrameRefSettings& settings);
-
-  virtual int GetEncodedLayerFrame(const vpx_codec_cx_pkt* pkt);
-
-  // Callback function for outputting packets per spatial layer.
-  static void EncoderOutputCodedPacketCallback(vpx_codec_cx_pkt* pkt,
-                                               void* user_data);
-
-  // Determine maximum target for Intra frames
-  //
-  // Input:
-  //    - optimal_buffer_size : Optimal buffer size
-  // Return Value             : Max target size for Intra frames represented as
-  //                            percentage of the per frame bandwidth
-  uint32_t MaxIntraTarget(uint32_t optimal_buffer_size);
-
-  EncodedImage encoded_image_;
-  EncodedImageCallback* encoded_complete_callback_;
-  VideoCodec codec_;
-  bool inited_;
-  int64_t timestamp_;
-  int cpu_speed_;
-  uint32_t rc_max_intra_target_;
-  vpx_codec_ctx_t* encoder_;
-  vpx_codec_enc_cfg_t* config_;
-  vpx_image_t* raw_;
-  vpx_svc_extra_cfg_t svc_params_;
-  const VideoFrame* input_image_;
-  GofInfoVP9 gof_;       // Contains each frame's temporal information for
-                         // non-flexible mode.
-  size_t frames_since_kf_;
-  uint8_t num_temporal_layers_;
-  uint8_t num_spatial_layers_;
-
-  // Used for flexible mode.
-  bool is_flexible_mode_;
-  int64_t buffer_updated_at_frame_[kNumVp9Buffers];
-  int64_t frames_encoded_;
-  uint8_t num_ref_pics_[kMaxVp9NumberOfSpatialLayers];
-  uint8_t p_diff_[kMaxVp9NumberOfSpatialLayers][kMaxVp9RefPics];
-  std::unique_ptr<ScreenshareLayersVP9> spatial_layer_;
-
-  // RTP state.
-  uint16_t picture_id_;
-  uint8_t tl0_pic_idx_;  // Only used in non-flexible mode.
-};
-
-class VP9DecoderImpl : public VP9Decoder {
- public:
-  VP9DecoderImpl();
-
-  virtual ~VP9DecoderImpl();
-
-  int InitDecode(const VideoCodec* inst, int number_of_cores) override;
-
-  int Decode(const EncodedImage& input_image,
-             bool missing_frames,
-             const RTPFragmentationHeader* fragmentation,
-             const CodecSpecificInfo* codec_specific_info,
-             int64_t /*render_time_ms*/) override;
-
-  int RegisterDecodeCompleteCallback(DecodedImageCallback* callback) override;
-
-  int Release() override;
-
-  const char* ImplementationName() const override;
-
- private:
-  int ReturnFrame(const vpx_image_t* img,
-                  uint32_t timestamp,
-                  int64_t ntp_time_ms,
-                  int qp);
-
-  // Memory pool used to share buffers between libvpx and webrtc.
-  Vp9FrameBufferPool frame_buffer_pool_;
-  DecodedImageCallback* decode_complete_callback_;
-  bool inited_;
-  vpx_codec_ctx_t* decoder_;
-  VideoCodec codec_;
-  bool key_frame_required_;
-};
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_VIDEO_CODING_CODECS_VP9_VP9_IMPL_H_
diff --git a/modules/video_coding/codecs/vp9/vp9_noop.cc b/modules/video_coding/codecs/vp9/vp9_noop.cc
deleted file mode 100644
index 7566a50..0000000
--- a/modules/video_coding/codecs/vp9/vp9_noop.cc
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- *  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.
- *
- */
-
-#if !defined(RTC_DISABLE_VP9)
-#error
-#endif  // !defined(RTC_DISABLE_VP9)
-
-#include "webrtc/modules/video_coding/codecs/vp9/include/vp9.h"
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-
-bool VP9Encoder::IsSupported() {
-  return false;
-}
-
-VP9Encoder* VP9Encoder::Create() {
-  RTC_NOTREACHED();
-  return nullptr;
-}
-
-bool VP9Decoder::IsSupported() {
-  return false;
-}
-
-VP9Decoder* VP9Decoder::Create() {
-  RTC_NOTREACHED();
-  return nullptr;
-}
-
-}  // namespace webrtc
diff --git a/modules/video_coding/codecs/vp9/vp9_screenshare_layers_unittest.cc b/modules/video_coding/codecs/vp9/vp9_screenshare_layers_unittest.cc
deleted file mode 100644
index c8205b2..0000000
--- a/modules/video_coding/codecs/vp9/vp9_screenshare_layers_unittest.cc
+++ /dev/null
@@ -1,324 +0,0 @@
-/*
- *  Copyright (c) 2015 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 <limits>
-#include <memory>
-
-#include "vpx/vp8cx.h"
-#include "webrtc/modules/video_coding/codecs/vp9/screenshare_layers.h"
-#include "webrtc/modules/video_coding/codecs/vp9/vp9_impl.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/system_wrappers/include/clock.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-typedef VP9EncoderImpl::SuperFrameRefSettings Settings;
-
-const uint32_t kTickFrequency = 90000;
-
-class ScreenshareLayerTestVP9 : public ::testing::Test {
- protected:
-  ScreenshareLayerTestVP9() : clock_(0) {}
-  virtual ~ScreenshareLayerTestVP9() {}
-
-  void InitScreenshareLayers(int layers) {
-    layers_.reset(new ScreenshareLayersVP9(layers));
-  }
-
-  void ConfigureBitrateForLayer(int kbps, uint8_t layer_id) {
-    layers_->ConfigureBitrate(kbps, layer_id);
-  }
-
-  void AdvanceTime(int64_t milliseconds) {
-    clock_.AdvanceTimeMilliseconds(milliseconds);
-  }
-
-  void AddKilobitsToLayer(int kilobits, uint8_t layer_id) {
-    layers_->LayerFrameEncoded(kilobits * 1000 / 8, layer_id);
-  }
-
-  void EqualRefsForLayer(const Settings& actual, uint8_t layer_id) {
-    EXPECT_EQ(expected_.layer[layer_id].upd_buf,
-              actual.layer[layer_id].upd_buf);
-    EXPECT_EQ(expected_.layer[layer_id].ref_buf1,
-              actual.layer[layer_id].ref_buf1);
-    EXPECT_EQ(expected_.layer[layer_id].ref_buf2,
-              actual.layer[layer_id].ref_buf2);
-    EXPECT_EQ(expected_.layer[layer_id].ref_buf3,
-              actual.layer[layer_id].ref_buf3);
-  }
-
-  void EqualRefs(const Settings& actual) {
-    for (unsigned int layer_id = 0; layer_id < kMaxVp9NumberOfSpatialLayers;
-         ++layer_id) {
-      EqualRefsForLayer(actual, layer_id);
-    }
-  }
-
-  void EqualStartStopKeyframe(const Settings& actual) {
-    EXPECT_EQ(expected_.start_layer, actual.start_layer);
-    EXPECT_EQ(expected_.stop_layer, actual.stop_layer);
-    EXPECT_EQ(expected_.is_keyframe, actual.is_keyframe);
-  }
-
-  // Check that the settings returned by GetSuperFrameSettings() is
-  // equal to the expected_ settings.
-  void EqualToExpected() {
-    uint32_t frame_timestamp_ =
-        clock_.TimeInMilliseconds() * (kTickFrequency / 1000);
-    Settings actual =
-        layers_->GetSuperFrameSettings(frame_timestamp_, expected_.is_keyframe);
-    EqualRefs(actual);
-    EqualStartStopKeyframe(actual);
-  }
-
-  Settings expected_;
-  SimulatedClock clock_;
-  std::unique_ptr<ScreenshareLayersVP9> layers_;
-};
-
-TEST_F(ScreenshareLayerTestVP9, NoRefsOnKeyFrame) {
-  const int kNumLayers = kMaxVp9NumberOfSpatialLayers;
-  InitScreenshareLayers(kNumLayers);
-  expected_.start_layer = 0;
-  expected_.stop_layer = kNumLayers - 1;
-
-  for (int l = 0; l < kNumLayers; ++l) {
-    expected_.layer[l].upd_buf = l;
-  }
-  expected_.is_keyframe = true;
-  EqualToExpected();
-
-  for (int l = 0; l < kNumLayers; ++l) {
-    expected_.layer[l].ref_buf1 = l;
-  }
-  expected_.is_keyframe = false;
-  EqualToExpected();
-}
-
-// Test if it is possible to send at a high bitrate (over the threshold)
-// after a longer period of low bitrate. This should not be possible.
-TEST_F(ScreenshareLayerTestVP9, DontAccumelateAvailableBitsOverTime) {
-  InitScreenshareLayers(2);
-  ConfigureBitrateForLayer(100, 0);
-
-  expected_.layer[0].upd_buf = 0;
-  expected_.layer[0].ref_buf1 = 0;
-  expected_.layer[1].upd_buf = 1;
-  expected_.layer[1].ref_buf1 = 1;
-  expected_.start_layer = 0;
-  expected_.stop_layer = 1;
-
-  // Send 10 frames at a low bitrate (50 kbps)
-  for (int i = 0; i < 10; ++i) {
-    AdvanceTime(200);
-    EqualToExpected();
-    AddKilobitsToLayer(10, 0);
-  }
-
-  AdvanceTime(200);
-  EqualToExpected();
-  AddKilobitsToLayer(301, 0);
-
-  // Send 10 frames at a high bitrate (200 kbps)
-  expected_.start_layer = 1;
-  for (int i = 0; i < 10; ++i) {
-    AdvanceTime(200);
-    EqualToExpected();
-    AddKilobitsToLayer(40, 1);
-  }
-}
-
-// Test if used bits are accumelated over layers, as they should;
-TEST_F(ScreenshareLayerTestVP9, AccumelateUsedBitsOverLayers) {
-  const int kNumLayers = kMaxVp9NumberOfSpatialLayers;
-  InitScreenshareLayers(kNumLayers);
-  for (int l = 0; l < kNumLayers - 1; ++l)
-    ConfigureBitrateForLayer(100, l);
-  for (int l = 0; l < kNumLayers; ++l) {
-    expected_.layer[l].upd_buf = l;
-    expected_.layer[l].ref_buf1 = l;
-  }
-
-  expected_.start_layer = 0;
-  expected_.stop_layer = kNumLayers - 1;
-  EqualToExpected();
-
-  for (int layer = 0; layer < kNumLayers - 1; ++layer) {
-    expected_.start_layer = layer;
-    EqualToExpected();
-    AddKilobitsToLayer(101, layer);
-  }
-}
-
-// General testing of the bitrate controller.
-TEST_F(ScreenshareLayerTestVP9, 2LayerBitrate) {
-  InitScreenshareLayers(2);
-  ConfigureBitrateForLayer(100, 0);
-
-  expected_.layer[0].upd_buf = 0;
-  expected_.layer[1].upd_buf = 1;
-  expected_.layer[0].ref_buf1 = -1;
-  expected_.layer[1].ref_buf1 = -1;
-  expected_.start_layer = 0;
-  expected_.stop_layer = 1;
-
-  expected_.is_keyframe = true;
-  EqualToExpected();
-  AddKilobitsToLayer(100, 0);
-
-  expected_.layer[0].ref_buf1 = 0;
-  expected_.layer[1].ref_buf1 = 1;
-  expected_.is_keyframe = false;
-  AdvanceTime(199);
-  EqualToExpected();
-  AddKilobitsToLayer(100, 0);
-
-  expected_.start_layer = 1;
-  for (int frame = 0; frame < 3; ++frame) {
-    AdvanceTime(200);
-    EqualToExpected();
-    AddKilobitsToLayer(100, 1);
-  }
-
-  // Just before enough bits become available for L0 @0.999 seconds.
-  AdvanceTime(199);
-  EqualToExpected();
-  AddKilobitsToLayer(100, 1);
-
-  // Just after enough bits become available for L0 @1.0001 seconds.
-  expected_.start_layer = 0;
-  AdvanceTime(2);
-  EqualToExpected();
-  AddKilobitsToLayer(100, 0);
-
-  // Keyframes always encode all layers, even if it is over budget.
-  expected_.layer[0].ref_buf1 = -1;
-  expected_.layer[1].ref_buf1 = -1;
-  expected_.is_keyframe = true;
-  AdvanceTime(499);
-  EqualToExpected();
-  expected_.layer[0].ref_buf1 = 0;
-  expected_.layer[1].ref_buf1 = 1;
-  expected_.start_layer = 1;
-  expected_.is_keyframe = false;
-  EqualToExpected();
-  AddKilobitsToLayer(100, 0);
-
-  // 400 kb in L0 --> @3 second mark to fall below the threshold..
-  // just before @2.999 seconds.
-  expected_.is_keyframe = false;
-  AdvanceTime(1499);
-  EqualToExpected();
-  AddKilobitsToLayer(100, 1);
-
-  // just after @3.001 seconds.
-  expected_.start_layer = 0;
-  AdvanceTime(2);
-  EqualToExpected();
-  AddKilobitsToLayer(100, 0);
-}
-
-// General testing of the bitrate controller.
-TEST_F(ScreenshareLayerTestVP9, 3LayerBitrate) {
-  InitScreenshareLayers(3);
-  ConfigureBitrateForLayer(100, 0);
-  ConfigureBitrateForLayer(100, 1);
-
-  for (int l = 0; l < 3; ++l) {
-    expected_.layer[l].upd_buf = l;
-    expected_.layer[l].ref_buf1 = l;
-  }
-  expected_.start_layer = 0;
-  expected_.stop_layer = 2;
-
-  EqualToExpected();
-  AddKilobitsToLayer(105, 0);
-  AddKilobitsToLayer(30, 1);
-
-  AdvanceTime(199);
-  EqualToExpected();
-  AddKilobitsToLayer(105, 0);
-  AddKilobitsToLayer(30, 1);
-
-  expected_.start_layer = 1;
-  AdvanceTime(200);
-  EqualToExpected();
-  AddKilobitsToLayer(130, 1);
-
-  expected_.start_layer = 2;
-  AdvanceTime(200);
-  EqualToExpected();
-
-  // 400 kb in L1 --> @1.0 second mark to fall below threshold.
-  // 210 kb in L0 --> @1.1 second mark to fall below threshold.
-  // Just before L1 @0.999 seconds.
-  AdvanceTime(399);
-  EqualToExpected();
-
-  // Just after L1 @1.001 seconds.
-  expected_.start_layer = 1;
-  AdvanceTime(2);
-  EqualToExpected();
-
-  // Just before L0 @1.099 seconds.
-  AdvanceTime(99);
-  EqualToExpected();
-
-  // Just after L0 @1.101 seconds.
-  expected_.start_layer = 0;
-  AdvanceTime(2);
-  EqualToExpected();
-
-  // @1.1 seconds
-  AdvanceTime(99);
-  EqualToExpected();
-  AddKilobitsToLayer(200, 1);
-
-  expected_.is_keyframe = true;
-  for (int l = 0; l < 3; ++l)
-    expected_.layer[l].ref_buf1 = -1;
-  AdvanceTime(200);
-  EqualToExpected();
-
-  expected_.is_keyframe = false;
-  expected_.start_layer = 2;
-  for (int l = 0; l < 3; ++l)
-    expected_.layer[l].ref_buf1 = l;
-  AdvanceTime(200);
-  EqualToExpected();
-}
-
-// Test that the bitrate calculations are
-// correct when the timestamp wrap.
-TEST_F(ScreenshareLayerTestVP9, TimestampWrap) {
-  InitScreenshareLayers(2);
-  ConfigureBitrateForLayer(100, 0);
-
-  expected_.layer[0].upd_buf = 0;
-  expected_.layer[0].ref_buf1 = 0;
-  expected_.layer[1].upd_buf = 1;
-  expected_.layer[1].ref_buf1 = 1;
-  expected_.start_layer = 0;
-  expected_.stop_layer = 1;
-
-  // Advance time to just before the timestamp wraps.
-  AdvanceTime(std::numeric_limits<uint32_t>::max() / (kTickFrequency / 1000));
-  EqualToExpected();
-  AddKilobitsToLayer(200, 0);
-
-  // Wrap
-  expected_.start_layer = 1;
-  AdvanceTime(1);
-  EqualToExpected();
-}
-
-}  // namespace webrtc
diff --git a/modules/video_coding/decoding_state.cc b/modules/video_coding/decoding_state.cc
deleted file mode 100644
index f57250e..0000000
--- a/modules/video_coding/decoding_state.cc
+++ /dev/null
@@ -1,366 +0,0 @@
-/*
- *  Copyright (c) 2011 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/video_coding/decoding_state.h"
-
-#include "webrtc/common_video/h264/h264_common.h"
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/modules/video_coding/frame_buffer.h"
-#include "webrtc/modules/video_coding/jitter_buffer_common.h"
-#include "webrtc/modules/video_coding/packet.h"
-#include "webrtc/rtc_base/logging.h"
-
-namespace webrtc {
-
-VCMDecodingState::VCMDecodingState()
-    : sequence_num_(0),
-      time_stamp_(0),
-      picture_id_(kNoPictureId),
-      temporal_id_(kNoTemporalIdx),
-      tl0_pic_id_(kNoTl0PicIdx),
-      full_sync_(true),
-      in_initial_state_(true) {
-  memset(frame_decoded_, 0, sizeof(frame_decoded_));
-}
-
-VCMDecodingState::~VCMDecodingState() {}
-
-void VCMDecodingState::Reset() {
-  // TODO(mikhal): Verify - not always would want to reset the sync
-  sequence_num_ = 0;
-  time_stamp_ = 0;
-  picture_id_ = kNoPictureId;
-  temporal_id_ = kNoTemporalIdx;
-  tl0_pic_id_ = kNoTl0PicIdx;
-  full_sync_ = true;
-  in_initial_state_ = true;
-  memset(frame_decoded_, 0, sizeof(frame_decoded_));
-  received_sps_.clear();
-  received_pps_.clear();
-}
-
-uint32_t VCMDecodingState::time_stamp() const {
-  return time_stamp_;
-}
-
-uint16_t VCMDecodingState::sequence_num() const {
-  return sequence_num_;
-}
-
-bool VCMDecodingState::IsOldFrame(const VCMFrameBuffer* frame) const {
-  assert(frame != NULL);
-  if (in_initial_state_)
-    return false;
-  return !IsNewerTimestamp(frame->TimeStamp(), time_stamp_);
-}
-
-bool VCMDecodingState::IsOldPacket(const VCMPacket* packet) const {
-  assert(packet != NULL);
-  if (in_initial_state_)
-    return false;
-  return !IsNewerTimestamp(packet->timestamp, time_stamp_);
-}
-
-void VCMDecodingState::SetState(const VCMFrameBuffer* frame) {
-  assert(frame != NULL && frame->GetHighSeqNum() >= 0);
-  if (!UsingFlexibleMode(frame))
-    UpdateSyncState(frame);
-  sequence_num_ = static_cast<uint16_t>(frame->GetHighSeqNum());
-  time_stamp_ = frame->TimeStamp();
-  picture_id_ = frame->PictureId();
-  temporal_id_ = frame->TemporalId();
-  tl0_pic_id_ = frame->Tl0PicId();
-
-  for (const NaluInfo& nalu : frame->GetNaluInfos()) {
-    if (nalu.type == H264::NaluType::kPps) {
-      if (nalu.pps_id < 0) {
-        LOG(LS_WARNING) << "Received pps without pps id.";
-      } else if (nalu.sps_id < 0) {
-        LOG(LS_WARNING) << "Received pps without sps id.";
-      } else {
-        received_pps_[nalu.pps_id] = nalu.sps_id;
-      }
-    } else if (nalu.type == H264::NaluType::kSps) {
-      if (nalu.sps_id < 0) {
-        LOG(LS_WARNING) << "Received sps without sps id.";
-      } else {
-        received_sps_.insert(nalu.sps_id);
-      }
-    }
-  }
-
-  if (UsingFlexibleMode(frame)) {
-    uint16_t frame_index = picture_id_ % kFrameDecodedLength;
-    if (in_initial_state_) {
-      frame_decoded_cleared_to_ = frame_index;
-    } else if (frame->FrameType() == kVideoFrameKey) {
-      memset(frame_decoded_, 0, sizeof(frame_decoded_));
-      frame_decoded_cleared_to_ = frame_index;
-    } else {
-      if (AheadOfFramesDecodedClearedTo(frame_index)) {
-        while (frame_decoded_cleared_to_ != frame_index) {
-          frame_decoded_cleared_to_ =
-              (frame_decoded_cleared_to_ + 1) % kFrameDecodedLength;
-          frame_decoded_[frame_decoded_cleared_to_] = false;
-        }
-      }
-    }
-    frame_decoded_[frame_index] = true;
-  }
-
-  in_initial_state_ = false;
-}
-
-void VCMDecodingState::CopyFrom(const VCMDecodingState& state) {
-  sequence_num_ = state.sequence_num_;
-  time_stamp_ = state.time_stamp_;
-  picture_id_ = state.picture_id_;
-  temporal_id_ = state.temporal_id_;
-  tl0_pic_id_ = state.tl0_pic_id_;
-  full_sync_ = state.full_sync_;
-  in_initial_state_ = state.in_initial_state_;
-  frame_decoded_cleared_to_ = state.frame_decoded_cleared_to_;
-  memcpy(frame_decoded_, state.frame_decoded_, sizeof(frame_decoded_));
-  received_sps_ = state.received_sps_;
-  received_pps_ = state.received_pps_;
-}
-
-bool VCMDecodingState::UpdateEmptyFrame(const VCMFrameBuffer* frame) {
-  bool empty_packet = frame->GetHighSeqNum() == frame->GetLowSeqNum();
-  if (in_initial_state_ && empty_packet) {
-    // Drop empty packets as long as we are in the initial state.
-    return true;
-  }
-  if ((empty_packet && ContinuousSeqNum(frame->GetHighSeqNum())) ||
-      ContinuousFrame(frame)) {
-    // Continuous empty packets or continuous frames can be dropped if we
-    // advance the sequence number.
-    sequence_num_ = frame->GetHighSeqNum();
-    time_stamp_ = frame->TimeStamp();
-    return true;
-  }
-  return false;
-}
-
-void VCMDecodingState::UpdateOldPacket(const VCMPacket* packet) {
-  assert(packet != NULL);
-  if (packet->timestamp == time_stamp_) {
-    // Late packet belonging to the last decoded frame - make sure we update the
-    // last decoded sequence number.
-    sequence_num_ = LatestSequenceNumber(packet->seqNum, sequence_num_);
-  }
-}
-
-void VCMDecodingState::SetSeqNum(uint16_t new_seq_num) {
-  sequence_num_ = new_seq_num;
-}
-
-bool VCMDecodingState::in_initial_state() const {
-  return in_initial_state_;
-}
-
-bool VCMDecodingState::full_sync() const {
-  return full_sync_;
-}
-
-void VCMDecodingState::UpdateSyncState(const VCMFrameBuffer* frame) {
-  if (in_initial_state_)
-    return;
-  if (frame->TemporalId() == kNoTemporalIdx ||
-      frame->Tl0PicId() == kNoTl0PicIdx) {
-    full_sync_ = true;
-  } else if (frame->FrameType() == kVideoFrameKey || frame->LayerSync()) {
-    full_sync_ = true;
-  } else if (full_sync_) {
-    // Verify that we are still in sync.
-    // Sync will be broken if continuity is true for layers but not for the
-    // other methods (PictureId and SeqNum).
-    if (UsingPictureId(frame)) {
-      // First check for a valid tl0PicId.
-      if (frame->Tl0PicId() - tl0_pic_id_ > 1) {
-        full_sync_ = false;
-      } else {
-        full_sync_ = ContinuousPictureId(frame->PictureId());
-      }
-    } else {
-      full_sync_ =
-          ContinuousSeqNum(static_cast<uint16_t>(frame->GetLowSeqNum()));
-    }
-  }
-}
-
-bool VCMDecodingState::ContinuousFrame(const VCMFrameBuffer* frame) const {
-  // Check continuity based on the following hierarchy:
-  // - Temporal layers (stop here if out of sync).
-  // - Picture Id when available.
-  // - Sequence numbers.
-  // Return true when in initial state.
-  // Note that when a method is not applicable it will return false.
-  assert(frame != NULL);
-  // A key frame is always considered continuous as it doesn't refer to any
-  // frames and therefore won't introduce any errors even if prior frames are
-  // missing.
-  if (frame->FrameType() == kVideoFrameKey &&
-      HaveSpsAndPps(frame->GetNaluInfos())) {
-    return true;
-  }
-  // When in the initial state we always require a key frame to start decoding.
-  if (in_initial_state_)
-    return false;
-  if (ContinuousLayer(frame->TemporalId(), frame->Tl0PicId()))
-    return true;
-  // tl0picId is either not used, or should remain unchanged.
-  if (frame->Tl0PicId() != tl0_pic_id_)
-    return false;
-  // Base layers are not continuous or temporal layers are inactive.
-  // In the presence of temporal layers, check for Picture ID/sequence number
-  // continuity if sync can be restored by this frame.
-  if (!full_sync_ && !frame->LayerSync())
-    return false;
-  if (UsingPictureId(frame)) {
-    if (UsingFlexibleMode(frame)) {
-      return ContinuousFrameRefs(frame);
-    } else {
-      return ContinuousPictureId(frame->PictureId());
-    }
-  } else {
-    return ContinuousSeqNum(static_cast<uint16_t>(frame->GetLowSeqNum())) &&
-           HaveSpsAndPps(frame->GetNaluInfos());
-  }
-}
-
-bool VCMDecodingState::ContinuousPictureId(int picture_id) const {
-  int next_picture_id = picture_id_ + 1;
-  if (picture_id < picture_id_) {
-    // Wrap
-    if (picture_id_ >= 0x80) {
-      // 15 bits used for picture id
-      return ((next_picture_id & 0x7FFF) == picture_id);
-    } else {
-      // 7 bits used for picture id
-      return ((next_picture_id & 0x7F) == picture_id);
-    }
-  }
-  // No wrap
-  return (next_picture_id == picture_id);
-}
-
-bool VCMDecodingState::ContinuousSeqNum(uint16_t seq_num) const {
-  return seq_num == static_cast<uint16_t>(sequence_num_ + 1);
-}
-
-bool VCMDecodingState::ContinuousLayer(int temporal_id, int tl0_pic_id) const {
-  // First, check if applicable.
-  if (temporal_id == kNoTemporalIdx || tl0_pic_id == kNoTl0PicIdx)
-    return false;
-  // If this is the first frame to use temporal layers, make sure we start
-  // from base.
-  else if (tl0_pic_id_ == kNoTl0PicIdx && temporal_id_ == kNoTemporalIdx &&
-           temporal_id == 0)
-    return true;
-
-  // Current implementation: Look for base layer continuity.
-  if (temporal_id != 0)
-    return false;
-  return (static_cast<uint8_t>(tl0_pic_id_ + 1) == tl0_pic_id);
-}
-
-bool VCMDecodingState::ContinuousFrameRefs(const VCMFrameBuffer* frame) const {
-  uint8_t num_refs = frame->CodecSpecific()->codecSpecific.VP9.num_ref_pics;
-  for (uint8_t r = 0; r < num_refs; ++r) {
-    uint16_t frame_ref = frame->PictureId() -
-                         frame->CodecSpecific()->codecSpecific.VP9.p_diff[r];
-    uint16_t frame_index = frame_ref % kFrameDecodedLength;
-    if (AheadOfFramesDecodedClearedTo(frame_index) ||
-        !frame_decoded_[frame_index]) {
-      return false;
-    }
-  }
-  return true;
-}
-
-bool VCMDecodingState::UsingPictureId(const VCMFrameBuffer* frame) const {
-  return (frame->PictureId() != kNoPictureId && picture_id_ != kNoPictureId);
-}
-
-bool VCMDecodingState::UsingFlexibleMode(const VCMFrameBuffer* frame) const {
-  bool is_flexible_mode =
-      frame->CodecSpecific()->codecType == kVideoCodecVP9 &&
-      frame->CodecSpecific()->codecSpecific.VP9.flexible_mode;
-  if (is_flexible_mode && frame->PictureId() == kNoPictureId) {
-    LOG(LS_WARNING) << "Frame is marked as using flexible mode but no"
-                    << "picture id is set.";
-    return false;
-  }
-  return is_flexible_mode;
-}
-
-// TODO(philipel): change how check work, this check practially
-// limits the max p_diff to 64.
-bool VCMDecodingState::AheadOfFramesDecodedClearedTo(uint16_t index) const {
-  // No way of knowing for sure if we are actually ahead of
-  // frame_decoded_cleared_to_. We just make the assumption
-  // that we are not trying to reference back to a very old
-  // index, but instead are referencing a newer index.
-  uint16_t diff =
-      index > frame_decoded_cleared_to_
-          ? kFrameDecodedLength - (index - frame_decoded_cleared_to_)
-          : frame_decoded_cleared_to_ - index;
-  return diff > kFrameDecodedLength / 2;
-}
-
-bool VCMDecodingState::HaveSpsAndPps(const std::vector<NaluInfo>& nalus) const {
-  std::set<int> new_sps;
-  std::map<int, int> new_pps;
-  for (const NaluInfo& nalu : nalus) {
-    // Check if this nalu actually contains sps/pps information or dependencies.
-    if (nalu.sps_id == -1 && nalu.pps_id == -1)
-      continue;
-    switch (nalu.type) {
-      case H264::NaluType::kPps:
-        if (nalu.pps_id < 0) {
-          LOG(LS_WARNING) << "Received pps without pps id.";
-        } else if (nalu.sps_id < 0) {
-          LOG(LS_WARNING) << "Received pps without sps id.";
-        } else {
-          new_pps[nalu.pps_id] = nalu.sps_id;
-        }
-        break;
-      case H264::NaluType::kSps:
-        if (nalu.sps_id < 0) {
-          LOG(LS_WARNING) << "Received sps without sps id.";
-        } else {
-          new_sps.insert(nalu.sps_id);
-        }
-        break;
-      default: {
-        int needed_sps = -1;
-        auto pps_it = new_pps.find(nalu.pps_id);
-        if (pps_it != new_pps.end()) {
-          needed_sps = pps_it->second;
-        } else {
-          auto pps_it2 = received_pps_.find(nalu.pps_id);
-          if (pps_it2 == received_pps_.end()) {
-            return false;
-          }
-          needed_sps = pps_it2->second;
-        }
-        if (new_sps.find(needed_sps) == new_sps.end() &&
-            received_sps_.find(needed_sps) == received_sps_.end()) {
-          return false;
-        }
-        break;
-      }
-    }
-  }
-  return true;
-}
-
-}  // namespace webrtc
diff --git a/modules/video_coding/decoding_state.h b/modules/video_coding/decoding_state.h
deleted file mode 100644
index c734080..0000000
--- a/modules/video_coding/decoding_state.h
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- *  Copyright (c) 2011 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_VIDEO_CODING_DECODING_STATE_H_
-#define WEBRTC_MODULES_VIDEO_CODING_DECODING_STATE_H_
-
-#include <map>
-#include <set>
-#include <vector>
-
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-// Forward declarations
-struct NaluInfo;
-class VCMFrameBuffer;
-class VCMPacket;
-
-class VCMDecodingState {
- public:
-  // The max number of bits used to reference back
-  // to a previous frame when using flexible mode.
-  static const uint16_t kNumRefBits = 7;
-  static const uint16_t kFrameDecodedLength = 1 << kNumRefBits;
-
-  VCMDecodingState();
-  ~VCMDecodingState();
-  // Check for old frame
-  bool IsOldFrame(const VCMFrameBuffer* frame) const;
-  // Check for old packet
-  bool IsOldPacket(const VCMPacket* packet) const;
-  // Check for frame continuity based on current decoded state. Use best method
-  // possible, i.e. temporal info, picture ID or sequence number.
-  bool ContinuousFrame(const VCMFrameBuffer* frame) const;
-  void SetState(const VCMFrameBuffer* frame);
-  void CopyFrom(const VCMDecodingState& state);
-  bool UpdateEmptyFrame(const VCMFrameBuffer* frame);
-  // Update the sequence number if the timestamp matches current state and the
-  // sequence number is higher than the current one. This accounts for packets
-  // arriving late.
-  void UpdateOldPacket(const VCMPacket* packet);
-  void SetSeqNum(uint16_t new_seq_num);
-  void Reset();
-  uint32_t time_stamp() const;
-  uint16_t sequence_num() const;
-  // Return true if at initial state.
-  bool in_initial_state() const;
-  // Return true when sync is on - decode all layers.
-  bool full_sync() const;
-
- private:
-  void UpdateSyncState(const VCMFrameBuffer* frame);
-  // Designated continuity functions
-  bool ContinuousPictureId(int picture_id) const;
-  bool ContinuousSeqNum(uint16_t seq_num) const;
-  bool ContinuousLayer(int temporal_id, int tl0_pic_id) const;
-  bool ContinuousFrameRefs(const VCMFrameBuffer* frame) const;
-  bool UsingPictureId(const VCMFrameBuffer* frame) const;
-  bool UsingFlexibleMode(const VCMFrameBuffer* frame) const;
-  bool AheadOfFramesDecodedClearedTo(uint16_t index) const;
-  bool HaveSpsAndPps(const std::vector<NaluInfo>& nalus) const;
-
-  // Keep state of last decoded frame.
-  // TODO(mikhal/stefan): create designated classes to handle these types.
-  uint16_t sequence_num_;
-  uint32_t time_stamp_;
-  int picture_id_;
-  int temporal_id_;
-  int tl0_pic_id_;
-  bool full_sync_;  // Sync flag when temporal layers are used.
-  bool in_initial_state_;
-
-  // Used to check references in flexible mode.
-  bool frame_decoded_[kFrameDecodedLength];
-  uint16_t frame_decoded_cleared_to_;
-  std::set<int> received_sps_;
-  std::map<int, int> received_pps_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_VIDEO_CODING_DECODING_STATE_H_
diff --git a/modules/video_coding/decoding_state_unittest.cc b/modules/video_coding/decoding_state_unittest.cc
deleted file mode 100644
index 1edd1e3..0000000
--- a/modules/video_coding/decoding_state_unittest.cc
+++ /dev/null
@@ -1,699 +0,0 @@
-/*
- *  Copyright (c) 2011 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 <string.h>
-
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/modules/video_coding/decoding_state.h"
-#include "webrtc/modules/video_coding/frame_buffer.h"
-#include "webrtc/modules/video_coding/jitter_buffer_common.h"
-#include "webrtc/modules/video_coding/packet.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-TEST(TestDecodingState, Sanity) {
-  VCMDecodingState dec_state;
-  dec_state.Reset();
-  EXPECT_TRUE(dec_state.in_initial_state());
-  EXPECT_TRUE(dec_state.full_sync());
-}
-
-TEST(TestDecodingState, FrameContinuity) {
-  VCMDecodingState dec_state;
-  // Check that makes decision based on correct method.
-  VCMFrameBuffer frame;
-  VCMFrameBuffer frame_key;
-  VCMPacket packet;
-  packet.is_first_packet_in_frame = true;
-  packet.timestamp = 1;
-  packet.seqNum = 0xffff;
-  packet.frameType = kVideoFrameDelta;
-  packet.video_header.codec = kRtpVideoVp8;
-  packet.video_header.codecHeader.VP8.pictureId = 0x007F;
-  FrameData frame_data;
-  frame_data.rtt_ms = 0;
-  frame_data.rolling_average_packets_per_frame = -1;
-  EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data));
-  // Always start with a key frame.
-  dec_state.Reset();
-  EXPECT_FALSE(dec_state.ContinuousFrame(&frame));
-  packet.frameType = kVideoFrameKey;
-  EXPECT_LE(0, frame_key.InsertPacket(packet, 0, kNoErrors, frame_data));
-  EXPECT_TRUE(dec_state.ContinuousFrame(&frame_key));
-  dec_state.SetState(&frame);
-  frame.Reset();
-  packet.frameType = kVideoFrameDelta;
-  // Use pictureId
-  packet.is_first_packet_in_frame = false;
-  packet.video_header.codecHeader.VP8.pictureId = 0x0002;
-  EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data));
-  EXPECT_FALSE(dec_state.ContinuousFrame(&frame));
-  frame.Reset();
-  packet.video_header.codecHeader.VP8.pictureId = 0;
-  packet.seqNum = 10;
-  EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data));
-  EXPECT_TRUE(dec_state.ContinuousFrame(&frame));
-
-  // Use sequence numbers.
-  packet.video_header.codecHeader.VP8.pictureId = kNoPictureId;
-  frame.Reset();
-  packet.seqNum = dec_state.sequence_num() - 1u;
-  EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data));
-  EXPECT_FALSE(dec_state.ContinuousFrame(&frame));
-  frame.Reset();
-  packet.seqNum = dec_state.sequence_num() + 1u;
-  EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data));
-  // Insert another packet to this frame
-  packet.seqNum++;
-  EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data));
-  // Verify wrap.
-  EXPECT_LE(dec_state.sequence_num(), 0xffff);
-  EXPECT_TRUE(dec_state.ContinuousFrame(&frame));
-  dec_state.SetState(&frame);
-
-  // Insert packet with temporal info.
-  dec_state.Reset();
-  frame.Reset();
-  packet.video_header.codecHeader.VP8.tl0PicIdx = 0;
-  packet.video_header.codecHeader.VP8.temporalIdx = 0;
-  packet.video_header.codecHeader.VP8.pictureId = 0;
-  packet.seqNum = 1;
-  packet.timestamp = 1;
-  EXPECT_TRUE(dec_state.full_sync());
-  EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data));
-  dec_state.SetState(&frame);
-  EXPECT_TRUE(dec_state.full_sync());
-  frame.Reset();
-  // 1 layer up - still good.
-  packet.video_header.codecHeader.VP8.tl0PicIdx = 0;
-  packet.video_header.codecHeader.VP8.temporalIdx = 1;
-  packet.video_header.codecHeader.VP8.pictureId = 1;
-  packet.seqNum = 2;
-  packet.timestamp = 2;
-  EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data));
-  EXPECT_TRUE(dec_state.ContinuousFrame(&frame));
-  dec_state.SetState(&frame);
-  EXPECT_TRUE(dec_state.full_sync());
-  frame.Reset();
-  // Lost non-base layer packet => should update sync parameter.
-  packet.video_header.codecHeader.VP8.tl0PicIdx = 0;
-  packet.video_header.codecHeader.VP8.temporalIdx = 3;
-  packet.video_header.codecHeader.VP8.pictureId = 3;
-  packet.seqNum = 4;
-  packet.timestamp = 4;
-  EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data));
-  EXPECT_FALSE(dec_state.ContinuousFrame(&frame));
-  // Now insert the next non-base layer (belonging to a next tl0PicId).
-  frame.Reset();
-  packet.video_header.codecHeader.VP8.tl0PicIdx = 1;
-  packet.video_header.codecHeader.VP8.temporalIdx = 2;
-  packet.video_header.codecHeader.VP8.pictureId = 4;
-  packet.seqNum = 5;
-  packet.timestamp = 5;
-  EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data));
-  // Checking continuity and not updating the state - this should not trigger
-  // an update of sync state.
-  EXPECT_FALSE(dec_state.ContinuousFrame(&frame));
-  EXPECT_TRUE(dec_state.full_sync());
-  // Next base layer (dropped interim non-base layers) - should update sync.
-  frame.Reset();
-  packet.video_header.codecHeader.VP8.tl0PicIdx = 1;
-  packet.video_header.codecHeader.VP8.temporalIdx = 0;
-  packet.video_header.codecHeader.VP8.pictureId = 5;
-  packet.seqNum = 6;
-  packet.timestamp = 6;
-  EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data));
-  EXPECT_TRUE(dec_state.ContinuousFrame(&frame));
-  dec_state.SetState(&frame);
-  EXPECT_FALSE(dec_state.full_sync());
-
-  // Check wrap for temporal layers.
-  frame.Reset();
-  packet.video_header.codecHeader.VP8.tl0PicIdx = 0x00FF;
-  packet.video_header.codecHeader.VP8.temporalIdx = 0;
-  packet.video_header.codecHeader.VP8.pictureId = 6;
-  packet.seqNum = 7;
-  packet.timestamp = 7;
-  EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data));
-  dec_state.SetState(&frame);
-  EXPECT_FALSE(dec_state.full_sync());
-  frame.Reset();
-  packet.video_header.codecHeader.VP8.tl0PicIdx = 0x0000;
-  packet.video_header.codecHeader.VP8.temporalIdx = 0;
-  packet.video_header.codecHeader.VP8.pictureId = 7;
-  packet.seqNum = 8;
-  packet.timestamp = 8;
-  EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data));
-  EXPECT_TRUE(dec_state.ContinuousFrame(&frame));
-  // The current frame is not continuous
-  dec_state.SetState(&frame);
-  EXPECT_FALSE(dec_state.ContinuousFrame(&frame));
-}
-
-TEST(TestDecodingState, UpdateOldPacket) {
-  VCMDecodingState dec_state;
-  // Update only if zero size and newer than previous.
-  // Should only update if the timeStamp match.
-  VCMFrameBuffer frame;
-  VCMPacket packet;
-  packet.timestamp = 1;
-  packet.seqNum = 1;
-  packet.frameType = kVideoFrameDelta;
-  FrameData frame_data;
-  frame_data.rtt_ms = 0;
-  frame_data.rolling_average_packets_per_frame = -1;
-  EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data));
-  dec_state.SetState(&frame);
-  EXPECT_EQ(dec_state.sequence_num(), 1);
-  // Insert an empty packet that does not belong to the same frame.
-  // => Sequence num should be the same.
-  packet.timestamp = 2;
-  dec_state.UpdateOldPacket(&packet);
-  EXPECT_EQ(dec_state.sequence_num(), 1);
-  // Now insert empty packet belonging to the same frame.
-  packet.timestamp = 1;
-  packet.seqNum = 2;
-  packet.frameType = kEmptyFrame;
-  packet.sizeBytes = 0;
-  dec_state.UpdateOldPacket(&packet);
-  EXPECT_EQ(dec_state.sequence_num(), 2);
-  // Now insert delta packet belonging to the same frame.
-  packet.timestamp = 1;
-  packet.seqNum = 3;
-  packet.frameType = kVideoFrameDelta;
-  packet.sizeBytes = 1400;
-  dec_state.UpdateOldPacket(&packet);
-  EXPECT_EQ(dec_state.sequence_num(), 3);
-  // Insert a packet belonging to an older timestamp - should not update the
-  // sequence number.
-  packet.timestamp = 0;
-  packet.seqNum = 4;
-  packet.frameType = kEmptyFrame;
-  packet.sizeBytes = 0;
-  dec_state.UpdateOldPacket(&packet);
-  EXPECT_EQ(dec_state.sequence_num(), 3);
-}
-
-TEST(TestDecodingState, MultiLayerBehavior) {
-  // Identify sync/non-sync when more than one layer.
-  VCMDecodingState dec_state;
-  // Identify packets belonging to old frames/packets.
-  // Set state for current frames.
-  // tl0PicIdx 0, temporal id 0.
-  VCMFrameBuffer frame;
-  VCMPacket packet;
-  packet.frameType = kVideoFrameDelta;
-  packet.video_header.codec = kRtpVideoVp8;
-  packet.timestamp = 0;
-  packet.seqNum = 0;
-  packet.video_header.codecHeader.VP8.tl0PicIdx = 0;
-  packet.video_header.codecHeader.VP8.temporalIdx = 0;
-  packet.video_header.codecHeader.VP8.pictureId = 0;
-  FrameData frame_data;
-  frame_data.rtt_ms = 0;
-  frame_data.rolling_average_packets_per_frame = -1;
-  EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data));
-  dec_state.SetState(&frame);
-  // tl0PicIdx 0, temporal id 1.
-  frame.Reset();
-  packet.timestamp = 1;
-  packet.seqNum = 1;
-  packet.video_header.codecHeader.VP8.tl0PicIdx = 0;
-  packet.video_header.codecHeader.VP8.temporalIdx = 1;
-  packet.video_header.codecHeader.VP8.pictureId = 1;
-  EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data));
-  EXPECT_TRUE(dec_state.ContinuousFrame(&frame));
-  dec_state.SetState(&frame);
-  EXPECT_TRUE(dec_state.full_sync());
-  // Lost tl0PicIdx 0, temporal id 2.
-  // Insert tl0PicIdx 0, temporal id 3.
-  frame.Reset();
-  packet.timestamp = 3;
-  packet.seqNum = 3;
-  packet.video_header.codecHeader.VP8.tl0PicIdx = 0;
-  packet.video_header.codecHeader.VP8.temporalIdx = 3;
-  packet.video_header.codecHeader.VP8.pictureId = 3;
-  EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data));
-  EXPECT_FALSE(dec_state.ContinuousFrame(&frame));
-  dec_state.SetState(&frame);
-  EXPECT_FALSE(dec_state.full_sync());
-  // Insert next base layer
-  frame.Reset();
-  packet.timestamp = 4;
-  packet.seqNum = 4;
-  packet.video_header.codecHeader.VP8.tl0PicIdx = 1;
-  packet.video_header.codecHeader.VP8.temporalIdx = 0;
-  packet.video_header.codecHeader.VP8.pictureId = 4;
-  EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data));
-  EXPECT_TRUE(dec_state.ContinuousFrame(&frame));
-  dec_state.SetState(&frame);
-  EXPECT_FALSE(dec_state.full_sync());
-  // Insert key frame - should update sync value.
-  // A key frame is always a base layer.
-  frame.Reset();
-  packet.frameType = kVideoFrameKey;
-  packet.is_first_packet_in_frame = 1;
-  packet.timestamp = 5;
-  packet.seqNum = 5;
-  packet.video_header.codecHeader.VP8.tl0PicIdx = 2;
-  packet.video_header.codecHeader.VP8.temporalIdx = 0;
-  packet.video_header.codecHeader.VP8.pictureId = 5;
-  EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data));
-  EXPECT_TRUE(dec_state.ContinuousFrame(&frame));
-  dec_state.SetState(&frame);
-  EXPECT_TRUE(dec_state.full_sync());
-  // After sync, a continuous PictureId is required
-  // (continuous base layer is not enough )
-  frame.Reset();
-  packet.frameType = kVideoFrameDelta;
-  packet.timestamp = 6;
-  packet.seqNum = 6;
-  packet.video_header.codecHeader.VP8.tl0PicIdx = 3;
-  packet.video_header.codecHeader.VP8.temporalIdx = 0;
-  packet.video_header.codecHeader.VP8.pictureId = 6;
-  EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data));
-  EXPECT_TRUE(dec_state.ContinuousFrame(&frame));
-  EXPECT_TRUE(dec_state.full_sync());
-  frame.Reset();
-  packet.frameType = kVideoFrameDelta;
-  packet.is_first_packet_in_frame = 1;
-  packet.timestamp = 8;
-  packet.seqNum = 8;
-  packet.video_header.codecHeader.VP8.tl0PicIdx = 4;
-  packet.video_header.codecHeader.VP8.temporalIdx = 0;
-  packet.video_header.codecHeader.VP8.pictureId = 8;
-  EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data));
-  EXPECT_FALSE(dec_state.ContinuousFrame(&frame));
-  EXPECT_TRUE(dec_state.full_sync());
-  dec_state.SetState(&frame);
-  EXPECT_FALSE(dec_state.full_sync());
-
-  // Insert a non-ref frame - should update sync value.
-  frame.Reset();
-  packet.frameType = kVideoFrameDelta;
-  packet.is_first_packet_in_frame = 1;
-  packet.timestamp = 9;
-  packet.seqNum = 9;
-  packet.video_header.codecHeader.VP8.tl0PicIdx = 4;
-  packet.video_header.codecHeader.VP8.temporalIdx = 2;
-  packet.video_header.codecHeader.VP8.pictureId = 9;
-  packet.video_header.codecHeader.VP8.layerSync = true;
-  EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data));
-  dec_state.SetState(&frame);
-  EXPECT_TRUE(dec_state.full_sync());
-
-  // The following test will verify the sync flag behavior after a loss.
-  // Create the following pattern:
-  // Update base layer, lose packet 1 (sync flag on, layer 2), insert packet 3
-  // (sync flag on, layer 2) check continuity and sync flag after inserting
-  // packet 2 (sync flag on, layer 1).
-  // Base layer.
-  frame.Reset();
-  dec_state.Reset();
-  packet.frameType = kVideoFrameDelta;
-  packet.is_first_packet_in_frame = 1;
-  packet.markerBit = 1;
-  packet.timestamp = 0;
-  packet.seqNum = 0;
-  packet.video_header.codecHeader.VP8.tl0PicIdx = 0;
-  packet.video_header.codecHeader.VP8.temporalIdx = 0;
-  packet.video_header.codecHeader.VP8.pictureId = 0;
-  packet.video_header.codecHeader.VP8.layerSync = false;
-  EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data));
-  dec_state.SetState(&frame);
-  EXPECT_TRUE(dec_state.full_sync());
-  // Layer 2 - 2 packets (insert one, lose one).
-  frame.Reset();
-  packet.frameType = kVideoFrameDelta;
-  packet.is_first_packet_in_frame = 1;
-  packet.markerBit = 0;
-  packet.timestamp = 1;
-  packet.seqNum = 1;
-  packet.video_header.codecHeader.VP8.tl0PicIdx = 0;
-  packet.video_header.codecHeader.VP8.temporalIdx = 2;
-  packet.video_header.codecHeader.VP8.pictureId = 1;
-  packet.video_header.codecHeader.VP8.layerSync = true;
-  EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data));
-  EXPECT_TRUE(dec_state.ContinuousFrame(&frame));
-  // Layer 1
-  frame.Reset();
-  packet.frameType = kVideoFrameDelta;
-  packet.is_first_packet_in_frame = 1;
-  packet.markerBit = 1;
-  packet.timestamp = 2;
-  packet.seqNum = 3;
-  packet.video_header.codecHeader.VP8.tl0PicIdx = 0;
-  packet.video_header.codecHeader.VP8.temporalIdx = 1;
-  packet.video_header.codecHeader.VP8.pictureId = 2;
-  packet.video_header.codecHeader.VP8.layerSync = true;
-  EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data));
-  EXPECT_FALSE(dec_state.ContinuousFrame(&frame));
-  EXPECT_TRUE(dec_state.full_sync());
-}
-
-TEST(TestDecodingState, DiscontinuousPicIdContinuousSeqNum) {
-  VCMDecodingState dec_state;
-  VCMFrameBuffer frame;
-  VCMPacket packet;
-  frame.Reset();
-  packet.frameType = kVideoFrameKey;
-  packet.video_header.codec = kRtpVideoVp8;
-  packet.timestamp = 0;
-  packet.seqNum = 0;
-  packet.video_header.codecHeader.VP8.tl0PicIdx = 0;
-  packet.video_header.codecHeader.VP8.temporalIdx = 0;
-  packet.video_header.codecHeader.VP8.pictureId = 0;
-  FrameData frame_data;
-  frame_data.rtt_ms = 0;
-  frame_data.rolling_average_packets_per_frame = -1;
-  EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data));
-  dec_state.SetState(&frame);
-  EXPECT_TRUE(dec_state.full_sync());
-
-  // Continuous sequence number but discontinuous picture id. This implies a
-  // a loss and we have to fall back to only decoding the base layer.
-  frame.Reset();
-  packet.frameType = kVideoFrameDelta;
-  packet.timestamp += 3000;
-  ++packet.seqNum;
-  packet.video_header.codecHeader.VP8.temporalIdx = 1;
-  packet.video_header.codecHeader.VP8.pictureId = 2;
-  EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data));
-  EXPECT_FALSE(dec_state.ContinuousFrame(&frame));
-  dec_state.SetState(&frame);
-  EXPECT_FALSE(dec_state.full_sync());
-}
-
-TEST(TestDecodingState, OldInput) {
-  VCMDecodingState dec_state;
-  // Identify packets belonging to old frames/packets.
-  // Set state for current frames.
-  VCMFrameBuffer frame;
-  VCMPacket packet;
-  packet.timestamp = 10;
-  packet.seqNum = 1;
-  FrameData frame_data;
-  frame_data.rtt_ms = 0;
-  frame_data.rolling_average_packets_per_frame = -1;
-  EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data));
-  dec_state.SetState(&frame);
-  packet.timestamp = 9;
-  EXPECT_TRUE(dec_state.IsOldPacket(&packet));
-  // Check for old frame
-  frame.Reset();
-  frame.InsertPacket(packet, 0, kNoErrors, frame_data);
-  EXPECT_TRUE(dec_state.IsOldFrame(&frame));
-}
-
-TEST(TestDecodingState, PictureIdRepeat) {
-  VCMDecodingState dec_state;
-  VCMFrameBuffer frame;
-  VCMPacket packet;
-  packet.frameType = kVideoFrameDelta;
-  packet.video_header.codec = kRtpVideoVp8;
-  packet.timestamp = 0;
-  packet.seqNum = 0;
-  packet.video_header.codecHeader.VP8.tl0PicIdx = 0;
-  packet.video_header.codecHeader.VP8.temporalIdx = 0;
-  packet.video_header.codecHeader.VP8.pictureId = 0;
-  FrameData frame_data;
-  frame_data.rtt_ms = 0;
-  frame_data.rolling_average_packets_per_frame = -1;
-  EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data));
-  dec_state.SetState(&frame);
-  // tl0PicIdx 0, temporal id 1.
-  frame.Reset();
-  ++packet.timestamp;
-  ++packet.seqNum;
-  packet.video_header.codecHeader.VP8.temporalIdx++;
-  packet.video_header.codecHeader.VP8.pictureId++;
-  EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data));
-  EXPECT_TRUE(dec_state.ContinuousFrame(&frame));
-  frame.Reset();
-  // Testing only gap in tl0PicIdx when tl0PicIdx in continuous.
-  packet.video_header.codecHeader.VP8.tl0PicIdx += 3;
-  packet.video_header.codecHeader.VP8.temporalIdx++;
-  packet.video_header.codecHeader.VP8.tl0PicIdx = 1;
-  EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data));
-  EXPECT_FALSE(dec_state.ContinuousFrame(&frame));
-}
-
-TEST(TestDecodingState, FrameContinuityFlexibleModeKeyFrame) {
-  VCMDecodingState dec_state;
-  VCMFrameBuffer frame;
-  VCMPacket packet;
-  packet.is_first_packet_in_frame = true;
-  packet.timestamp = 1;
-  packet.seqNum = 0xffff;
-  uint8_t data[] = "I need a data pointer for this test!";
-  packet.sizeBytes = sizeof(data);
-  packet.dataPtr = data;
-  packet.video_header.codec = kRtpVideoVp9;
-
-  RTPVideoHeaderVP9& vp9_hdr = packet.video_header.codecHeader.VP9;
-  vp9_hdr.picture_id = 10;
-  vp9_hdr.flexible_mode = true;
-
-  FrameData frame_data;
-  frame_data.rtt_ms = 0;
-  frame_data.rolling_average_packets_per_frame = -1;
-
-  // Key frame as first frame
-  packet.frameType = kVideoFrameKey;
-  EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data));
-  EXPECT_TRUE(dec_state.ContinuousFrame(&frame));
-  dec_state.SetState(&frame);
-
-  // Key frame again
-  vp9_hdr.picture_id = 11;
-  frame.Reset();
-  EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data));
-  EXPECT_TRUE(dec_state.ContinuousFrame(&frame));
-  dec_state.SetState(&frame);
-
-  // Ref to 11, continuous
-  frame.Reset();
-  packet.frameType = kVideoFrameDelta;
-  vp9_hdr.picture_id = 12;
-  vp9_hdr.num_ref_pics = 1;
-  vp9_hdr.pid_diff[0] = 1;
-  EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data));
-  EXPECT_TRUE(dec_state.ContinuousFrame(&frame));
-}
-
-TEST(TestDecodingState, FrameContinuityFlexibleModeOutOfOrderFrames) {
-  VCMDecodingState dec_state;
-  VCMFrameBuffer frame;
-  VCMPacket packet;
-  packet.is_first_packet_in_frame = true;
-  packet.timestamp = 1;
-  packet.seqNum = 0xffff;
-  uint8_t data[] = "I need a data pointer for this test!";
-  packet.sizeBytes = sizeof(data);
-  packet.dataPtr = data;
-  packet.video_header.codec = kRtpVideoVp9;
-
-  RTPVideoHeaderVP9& vp9_hdr = packet.video_header.codecHeader.VP9;
-  vp9_hdr.picture_id = 10;
-  vp9_hdr.flexible_mode = true;
-
-  FrameData frame_data;
-  frame_data.rtt_ms = 0;
-  frame_data.rolling_average_packets_per_frame = -1;
-
-  // Key frame as first frame
-  packet.frameType = kVideoFrameKey;
-  EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data));
-  EXPECT_TRUE(dec_state.ContinuousFrame(&frame));
-  dec_state.SetState(&frame);
-
-  // Ref to 10, continuous
-  frame.Reset();
-  packet.frameType = kVideoFrameDelta;
-  vp9_hdr.picture_id = 15;
-  vp9_hdr.num_ref_pics = 1;
-  vp9_hdr.pid_diff[0] = 5;
-  EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data));
-  EXPECT_TRUE(dec_state.ContinuousFrame(&frame));
-  dec_state.SetState(&frame);
-
-  // Out of order, last id 15, this id 12, ref to 10, continuous
-  frame.Reset();
-  vp9_hdr.picture_id = 12;
-  vp9_hdr.pid_diff[0] = 2;
-  EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data));
-  EXPECT_TRUE(dec_state.ContinuousFrame(&frame));
-  dec_state.SetState(&frame);
-
-  // Ref 10, 12, 15, continuous
-  frame.Reset();
-  vp9_hdr.picture_id = 20;
-  vp9_hdr.num_ref_pics = 3;
-  vp9_hdr.pid_diff[0] = 10;
-  vp9_hdr.pid_diff[1] = 8;
-  vp9_hdr.pid_diff[2] = 5;
-  EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data));
-  EXPECT_TRUE(dec_state.ContinuousFrame(&frame));
-}
-
-TEST(TestDecodingState, FrameContinuityFlexibleModeGeneral) {
-  VCMDecodingState dec_state;
-  VCMFrameBuffer frame;
-  VCMPacket packet;
-  packet.is_first_packet_in_frame = true;
-  packet.timestamp = 1;
-  packet.seqNum = 0xffff;
-  uint8_t data[] = "I need a data pointer for this test!";
-  packet.sizeBytes = sizeof(data);
-  packet.dataPtr = data;
-  packet.video_header.codec = kRtpVideoVp9;
-
-  RTPVideoHeaderVP9& vp9_hdr = packet.video_header.codecHeader.VP9;
-  vp9_hdr.picture_id = 10;
-  vp9_hdr.flexible_mode = true;
-
-  FrameData frame_data;
-  frame_data.rtt_ms = 0;
-  frame_data.rolling_average_packets_per_frame = -1;
-
-  // Key frame as first frame
-  packet.frameType = kVideoFrameKey;
-  EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data));
-  EXPECT_TRUE(dec_state.ContinuousFrame(&frame));
-
-  // Delta frame as first frame
-  frame.Reset();
-  packet.frameType = kVideoFrameDelta;
-  EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data));
-  EXPECT_FALSE(dec_state.ContinuousFrame(&frame));
-
-  // Key frame then delta frame
-  frame.Reset();
-  packet.frameType = kVideoFrameKey;
-  EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data));
-  dec_state.SetState(&frame);
-  frame.Reset();
-  packet.frameType = kVideoFrameDelta;
-  vp9_hdr.num_ref_pics = 1;
-  vp9_hdr.picture_id = 15;
-  vp9_hdr.pid_diff[0] = 5;
-  EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data));
-  EXPECT_TRUE(dec_state.ContinuousFrame(&frame));
-  dec_state.SetState(&frame);
-
-  // Ref to 11, not continuous
-  frame.Reset();
-  vp9_hdr.picture_id = 16;
-  EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data));
-  EXPECT_FALSE(dec_state.ContinuousFrame(&frame));
-
-  // Ref to 15, continuous
-  frame.Reset();
-  vp9_hdr.picture_id = 16;
-  vp9_hdr.pid_diff[0] = 1;
-  EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data));
-  EXPECT_TRUE(dec_state.ContinuousFrame(&frame));
-  dec_state.SetState(&frame);
-
-  // Ref to 11 and 15, not continuous
-  frame.Reset();
-  vp9_hdr.picture_id = 20;
-  vp9_hdr.num_ref_pics = 2;
-  vp9_hdr.pid_diff[0] = 9;
-  vp9_hdr.pid_diff[1] = 5;
-  EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data));
-  EXPECT_FALSE(dec_state.ContinuousFrame(&frame));
-
-  // Ref to 10, 15 and 16, continuous
-  frame.Reset();
-  vp9_hdr.picture_id = 22;
-  vp9_hdr.num_ref_pics = 3;
-  vp9_hdr.pid_diff[0] = 12;
-  vp9_hdr.pid_diff[1] = 7;
-  vp9_hdr.pid_diff[2] = 6;
-  EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data));
-  EXPECT_TRUE(dec_state.ContinuousFrame(&frame));
-  dec_state.SetState(&frame);
-
-  // Key Frame, continuous
-  frame.Reset();
-  packet.frameType = kVideoFrameKey;
-  vp9_hdr.picture_id = VCMDecodingState::kFrameDecodedLength - 2;
-  vp9_hdr.num_ref_pics = 0;
-  EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data));
-  EXPECT_TRUE(dec_state.ContinuousFrame(&frame));
-  dec_state.SetState(&frame);
-
-  // Frame at last index, ref to KF, continuous
-  frame.Reset();
-  packet.frameType = kVideoFrameDelta;
-  vp9_hdr.picture_id = VCMDecodingState::kFrameDecodedLength - 1;
-  vp9_hdr.num_ref_pics = 1;
-  vp9_hdr.pid_diff[0] = 1;
-  EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data));
-  EXPECT_TRUE(dec_state.ContinuousFrame(&frame));
-  dec_state.SetState(&frame);
-
-  // Frame after wrapping buffer length, ref to last index, continuous
-  frame.Reset();
-  vp9_hdr.picture_id = 0;
-  vp9_hdr.num_ref_pics = 1;
-  vp9_hdr.pid_diff[0] = 1;
-  EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data));
-  EXPECT_TRUE(dec_state.ContinuousFrame(&frame));
-  dec_state.SetState(&frame);
-
-  // Frame after wrapping start frame, ref to 0, continuous
-  frame.Reset();
-  vp9_hdr.picture_id = 20;
-  vp9_hdr.num_ref_pics = 1;
-  vp9_hdr.pid_diff[0] = 20;
-  EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data));
-  EXPECT_TRUE(dec_state.ContinuousFrame(&frame));
-  dec_state.SetState(&frame);
-
-  // Frame after wrapping start frame, ref to 10, not continuous
-  frame.Reset();
-  vp9_hdr.picture_id = 23;
-  vp9_hdr.num_ref_pics = 1;
-  vp9_hdr.pid_diff[0] = 13;
-  EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data));
-  EXPECT_FALSE(dec_state.ContinuousFrame(&frame));
-
-  // Key frame, continuous
-  frame.Reset();
-  packet.frameType = kVideoFrameKey;
-  vp9_hdr.picture_id = 25;
-  vp9_hdr.num_ref_pics = 0;
-  EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data));
-  EXPECT_TRUE(dec_state.ContinuousFrame(&frame));
-  dec_state.SetState(&frame);
-
-  // Ref to KF, continuous
-  frame.Reset();
-  packet.frameType = kVideoFrameDelta;
-  vp9_hdr.picture_id = 26;
-  vp9_hdr.num_ref_pics = 1;
-  vp9_hdr.pid_diff[0] = 1;
-  EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data));
-  EXPECT_TRUE(dec_state.ContinuousFrame(&frame));
-  dec_state.SetState(&frame);
-
-  // Ref to frame previous to KF, not continuous
-  frame.Reset();
-  vp9_hdr.picture_id = 30;
-  vp9_hdr.num_ref_pics = 1;
-  vp9_hdr.pid_diff[0] = 30;
-  EXPECT_LE(0, frame.InsertPacket(packet, 0, kNoErrors, frame_data));
-  EXPECT_FALSE(dec_state.ContinuousFrame(&frame));
-}
-
-}  // namespace webrtc
diff --git a/modules/video_coding/encoded_frame.cc b/modules/video_coding/encoded_frame.cc
deleted file mode 100644
index bd407c7..0000000
--- a/modules/video_coding/encoded_frame.cc
+++ /dev/null
@@ -1,218 +0,0 @@
-/*
- *  Copyright (c) 2012 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/video_coding/include/video_coding_defines.h"
-#include "webrtc/modules/video_coding/encoded_frame.h"
-#include "webrtc/modules/video_coding/generic_encoder.h"
-#include "webrtc/modules/video_coding/jitter_buffer_common.h"
-
-namespace webrtc {
-
-VCMEncodedFrame::VCMEncodedFrame()
-    : webrtc::EncodedImage(),
-      _renderTimeMs(-1),
-      _payloadType(0),
-      _missingFrame(false),
-      _codec(kVideoCodecUnknown),
-      _rotation_set(false) {
-  _codecSpecificInfo.codecType = kVideoCodecUnknown;
-}
-
-VCMEncodedFrame::VCMEncodedFrame(const webrtc::EncodedImage& rhs)
-    : webrtc::EncodedImage(rhs),
-      _renderTimeMs(-1),
-      _payloadType(0),
-      _missingFrame(false),
-      _codec(kVideoCodecUnknown),
-      _rotation_set(false) {
-  _codecSpecificInfo.codecType = kVideoCodecUnknown;
-  _buffer = NULL;
-  _size = 0;
-  _length = 0;
-  if (rhs._buffer != NULL) {
-    VerifyAndAllocate(rhs._length +
-                      EncodedImage::GetBufferPaddingBytes(_codec));
-    memcpy(_buffer, rhs._buffer, rhs._length);
-  }
-}
-
-VCMEncodedFrame::VCMEncodedFrame(const VCMEncodedFrame& rhs)
-    : webrtc::EncodedImage(rhs),
-      _renderTimeMs(rhs._renderTimeMs),
-      _payloadType(rhs._payloadType),
-      _missingFrame(rhs._missingFrame),
-      _codecSpecificInfo(rhs._codecSpecificInfo),
-      _codec(rhs._codec),
-      _rotation_set(rhs._rotation_set) {
-  _buffer = NULL;
-  _size = 0;
-  _length = 0;
-  if (rhs._buffer != NULL) {
-    VerifyAndAllocate(rhs._length +
-                      EncodedImage::GetBufferPaddingBytes(_codec));
-    memcpy(_buffer, rhs._buffer, rhs._length);
-    _length = rhs._length;
-  }
-}
-
-VCMEncodedFrame::~VCMEncodedFrame() {
-  Free();
-}
-
-void VCMEncodedFrame::Free() {
-  Reset();
-  if (_buffer != NULL) {
-    delete[] _buffer;
-    _buffer = NULL;
-  }
-}
-
-void VCMEncodedFrame::Reset() {
-  _renderTimeMs = -1;
-  _timeStamp = 0;
-  _payloadType = 0;
-  _frameType = kVideoFrameDelta;
-  _encodedWidth = 0;
-  _encodedHeight = 0;
-  _completeFrame = false;
-  _missingFrame = false;
-  _length = 0;
-  _codecSpecificInfo.codecType = kVideoCodecUnknown;
-  _codec = kVideoCodecUnknown;
-  rotation_ = kVideoRotation_0;
-  content_type_ = VideoContentType::UNSPECIFIED;
-  timing_.flags = TimingFrameFlags::kInvalid;
-  _rotation_set = false;
-}
-
-void VCMEncodedFrame::CopyCodecSpecific(const RTPVideoHeader* header) {
-  if (header) {
-    switch (header->codec) {
-      case kRtpVideoVp8: {
-        if (_codecSpecificInfo.codecType != kVideoCodecVP8) {
-          // This is the first packet for this frame.
-          _codecSpecificInfo.codecSpecific.VP8.pictureId = -1;
-          _codecSpecificInfo.codecSpecific.VP8.temporalIdx = 0;
-          _codecSpecificInfo.codecSpecific.VP8.layerSync = false;
-          _codecSpecificInfo.codecSpecific.VP8.keyIdx = -1;
-          _codecSpecificInfo.codecType = kVideoCodecVP8;
-        }
-        _codecSpecificInfo.codecSpecific.VP8.nonReference =
-            header->codecHeader.VP8.nonReference;
-        if (header->codecHeader.VP8.pictureId != kNoPictureId) {
-          _codecSpecificInfo.codecSpecific.VP8.pictureId =
-              header->codecHeader.VP8.pictureId;
-        }
-        if (header->codecHeader.VP8.temporalIdx != kNoTemporalIdx) {
-          _codecSpecificInfo.codecSpecific.VP8.temporalIdx =
-              header->codecHeader.VP8.temporalIdx;
-          _codecSpecificInfo.codecSpecific.VP8.layerSync =
-              header->codecHeader.VP8.layerSync;
-        }
-        if (header->codecHeader.VP8.keyIdx != kNoKeyIdx) {
-          _codecSpecificInfo.codecSpecific.VP8.keyIdx =
-              header->codecHeader.VP8.keyIdx;
-        }
-        break;
-      }
-      case kRtpVideoVp9: {
-        if (_codecSpecificInfo.codecType != kVideoCodecVP9) {
-          // This is the first packet for this frame.
-          _codecSpecificInfo.codecSpecific.VP9.picture_id = -1;
-          _codecSpecificInfo.codecSpecific.VP9.temporal_idx = 0;
-          _codecSpecificInfo.codecSpecific.VP9.spatial_idx = 0;
-          _codecSpecificInfo.codecSpecific.VP9.gof_idx = 0;
-          _codecSpecificInfo.codecSpecific.VP9.inter_layer_predicted = false;
-          _codecSpecificInfo.codecSpecific.VP9.tl0_pic_idx = -1;
-          _codecSpecificInfo.codecType = kVideoCodecVP9;
-        }
-        _codecSpecificInfo.codecSpecific.VP9.inter_pic_predicted =
-            header->codecHeader.VP9.inter_pic_predicted;
-        _codecSpecificInfo.codecSpecific.VP9.flexible_mode =
-            header->codecHeader.VP9.flexible_mode;
-        _codecSpecificInfo.codecSpecific.VP9.num_ref_pics =
-            header->codecHeader.VP9.num_ref_pics;
-        for (uint8_t r = 0; r < header->codecHeader.VP9.num_ref_pics; ++r) {
-          _codecSpecificInfo.codecSpecific.VP9.p_diff[r] =
-              header->codecHeader.VP9.pid_diff[r];
-        }
-        _codecSpecificInfo.codecSpecific.VP9.ss_data_available =
-            header->codecHeader.VP9.ss_data_available;
-        if (header->codecHeader.VP9.picture_id != kNoPictureId) {
-          _codecSpecificInfo.codecSpecific.VP9.picture_id =
-              header->codecHeader.VP9.picture_id;
-        }
-        if (header->codecHeader.VP9.tl0_pic_idx != kNoTl0PicIdx) {
-          _codecSpecificInfo.codecSpecific.VP9.tl0_pic_idx =
-              header->codecHeader.VP9.tl0_pic_idx;
-        }
-        if (header->codecHeader.VP9.temporal_idx != kNoTemporalIdx) {
-          _codecSpecificInfo.codecSpecific.VP9.temporal_idx =
-              header->codecHeader.VP9.temporal_idx;
-          _codecSpecificInfo.codecSpecific.VP9.temporal_up_switch =
-              header->codecHeader.VP9.temporal_up_switch;
-        }
-        if (header->codecHeader.VP9.spatial_idx != kNoSpatialIdx) {
-          _codecSpecificInfo.codecSpecific.VP9.spatial_idx =
-              header->codecHeader.VP9.spatial_idx;
-          _codecSpecificInfo.codecSpecific.VP9.inter_layer_predicted =
-              header->codecHeader.VP9.inter_layer_predicted;
-        }
-        if (header->codecHeader.VP9.gof_idx != kNoGofIdx) {
-          _codecSpecificInfo.codecSpecific.VP9.gof_idx =
-              header->codecHeader.VP9.gof_idx;
-        }
-        if (header->codecHeader.VP9.ss_data_available) {
-          _codecSpecificInfo.codecSpecific.VP9.num_spatial_layers =
-              header->codecHeader.VP9.num_spatial_layers;
-          _codecSpecificInfo.codecSpecific.VP9
-              .spatial_layer_resolution_present =
-              header->codecHeader.VP9.spatial_layer_resolution_present;
-          if (header->codecHeader.VP9.spatial_layer_resolution_present) {
-            for (size_t i = 0; i < header->codecHeader.VP9.num_spatial_layers;
-                 ++i) {
-              _codecSpecificInfo.codecSpecific.VP9.width[i] =
-                  header->codecHeader.VP9.width[i];
-              _codecSpecificInfo.codecSpecific.VP9.height[i] =
-                  header->codecHeader.VP9.height[i];
-            }
-          }
-          _codecSpecificInfo.codecSpecific.VP9.gof.CopyGofInfoVP9(
-              header->codecHeader.VP9.gof);
-        }
-        break;
-      }
-      case kRtpVideoH264: {
-        _codecSpecificInfo.codecType = kVideoCodecH264;
-        break;
-      }
-      default: {
-        _codecSpecificInfo.codecType = kVideoCodecUnknown;
-        break;
-      }
-    }
-  }
-}
-
-void VCMEncodedFrame::VerifyAndAllocate(size_t minimumSize) {
-  if (minimumSize > _size) {
-    // create buffer of sufficient size
-    uint8_t* newBuffer = new uint8_t[minimumSize];
-    if (_buffer) {
-      // copy old data
-      memcpy(newBuffer, _buffer, _size);
-      delete[] _buffer;
-    }
-    _buffer = newBuffer;
-    _size = minimumSize;
-  }
-}
-
-}  // namespace webrtc
diff --git a/modules/video_coding/encoded_frame.h b/modules/video_coding/encoded_frame.h
deleted file mode 100644
index 7956485..0000000
--- a/modules/video_coding/encoded_frame.h
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- *  Copyright (c) 2011 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_VIDEO_CODING_ENCODED_FRAME_H_
-#define WEBRTC_MODULES_VIDEO_CODING_ENCODED_FRAME_H_
-
-#include <vector>
-
-#include "webrtc/common_types.h"
-#include "webrtc/common_video/include/video_frame.h"
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/modules/video_coding/include/video_codec_interface.h"
-#include "webrtc/modules/video_coding/include/video_coding_defines.h"
-
-namespace webrtc {
-
-class VCMEncodedFrame : protected EncodedImage {
- public:
-  VCMEncodedFrame();
-  explicit VCMEncodedFrame(const webrtc::EncodedImage& rhs);
-  VCMEncodedFrame(const VCMEncodedFrame& rhs);
-
-  ~VCMEncodedFrame();
-  /**
-  *   Delete VideoFrame and resets members to zero
-  */
-  void Free();
-  /**
-  *   Set render time in milliseconds
-  */
-  void SetRenderTime(const int64_t renderTimeMs) {
-    _renderTimeMs = renderTimeMs;
-  }
-
-  /**
-  *   Set the encoded frame size
-  */
-  void SetEncodedSize(uint32_t width, uint32_t height) {
-    _encodedWidth = width;
-    _encodedHeight = height;
-  }
-
-  void SetPlayoutDelay(PlayoutDelay playout_delay) {
-    playout_delay_ = playout_delay;
-  }
-
-  /**
-  *   Get the encoded image
-  */
-  const webrtc::EncodedImage& EncodedImage() const {
-    return static_cast<const webrtc::EncodedImage&>(*this);
-  }
-  /**
-  *   Get pointer to frame buffer
-  */
-  const uint8_t* Buffer() const { return _buffer; }
-  /**
-  *   Get frame length
-  */
-  size_t Length() const { return _length; }
-  /**
-  *   Get frame timestamp (90kHz)
-  */
-  uint32_t TimeStamp() const { return _timeStamp; }
-  /**
-  *   Get render time in milliseconds
-  */
-  int64_t RenderTimeMs() const { return _renderTimeMs; }
-  /**
-  *   Get frame type
-  */
-  webrtc::FrameType FrameType() const { return _frameType; }
-  /**
-  *   Get frame rotation
-  */
-  VideoRotation rotation() const { return rotation_; }
-  /**
-   *  Get video content type
-   */
-  VideoContentType contentType() const { return content_type_; }
-  /**
-   * Get video timing
-   */
-  EncodedImage::Timing video_timing() const { return timing_; }
-  /**
-   *   True if this frame is complete, false otherwise
-   */
-  bool Complete() const { return _completeFrame; }
-  /**
-  *   True if there's a frame missing before this frame
-  */
-  bool MissingFrame() const { return _missingFrame; }
-  /**
-  *   Payload type of the encoded payload
-  */
-  uint8_t PayloadType() const { return _payloadType; }
-  /**
-  *   Get codec specific info.
-  *   The returned pointer is only valid as long as the VCMEncodedFrame
-  *   is valid. Also, VCMEncodedFrame owns the pointer and will delete
-  *   the object.
-  */
-  const CodecSpecificInfo* CodecSpecific() const { return &_codecSpecificInfo; }
-
- protected:
-  /**
-  * Verifies that current allocated buffer size is larger than or equal to the
-  * input size.
-  * If the current buffer size is smaller, a new allocation is made and the old
-  * buffer data
-  * is copied to the new buffer.
-  * Buffer size is updated to minimumSize.
-  */
-  void VerifyAndAllocate(size_t minimumSize);
-
-  void Reset();
-
-  void CopyCodecSpecific(const RTPVideoHeader* header);
-
-  int64_t _renderTimeMs;
-  uint8_t _payloadType;
-  bool _missingFrame;
-  CodecSpecificInfo _codecSpecificInfo;
-  webrtc::VideoCodecType _codec;
-
-  // Video rotation is only set along with the last packet for each frame
-  // (same as marker bit). This |_rotation_set| is only for debugging purpose
-  // to ensure we don't set it twice for a frame.
-  bool _rotation_set;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_VIDEO_CODING_ENCODED_FRAME_H_
diff --git a/modules/video_coding/fec_rate_table.h b/modules/video_coding/fec_rate_table.h
deleted file mode 100644
index 18f10e0..0000000
--- a/modules/video_coding/fec_rate_table.h
+++ /dev/null
@@ -1,461 +0,0 @@
-/*
- *  Copyright (c) 2011 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_VIDEO_CODING_FEC_RATE_TABLE_H_
-#define WEBRTC_MODULES_VIDEO_CODING_FEC_RATE_TABLE_H_
-
-// This is a private header for media_opt_util.cc.
-// It should not be included by other files.
-
-namespace webrtc {
-
-// Table for Protection factor (code rate) of delta frames, for the XOR FEC.
-// Input is the packet loss and an effective rate (bits/frame).
-// Output is array kFecRateTable[k], where k = rate_i*129 + loss_j;
-// loss_j = 0,1,..128, and rate_i varies over some range.
-// TODO(brandtr): Consider replacing this big static table with a closed-form
-// expression instead.
-static const int kFecRateTableSize = 6450;
-static const unsigned char kFecRateTable[kFecRateTableSize] = {
-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-    0,   0,   0,   11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,  11,
-    11,  11,  11,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,
-    39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,
-    39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,  39,
-    39,  39,  39,  39,  39,  39,  51,  51,  51,  51,  51,  51,  51,  51,  51,
-    51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,  51,
-    51,  51,  51,  51,  51,  51,  51,  51,  51,  0,   0,   0,   0,   0,   0,
-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   8,   8,   8,
-    8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   8,   30,  30,  30,
-    30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  30,  56,  56,  56,
-    56,  56,  56,  56,  65,  65,  65,  65,  65,  65,  65,  65,  65,  65,  65,
-    65,  65,  65,  65,  65,  65,  65,  65,  65,  65,  65,  65,  65,  65,  65,
-    65,  65,  65,  65,  65,  65,  65,  65,  65,  65,  65,  65,  65,  65,  65,
-    87,  87,  87,  87,  87,  87,  87,  87,  87,  87,  87,  87,  87,  87,  87,
-    87,  87,  87,  87,  87,  87,  87,  87,  87,  78,  78,  78,  78,  78,  78,
-    78,  78,  78,  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
-    0,   0,   0,   6,   6,   6,   23,  23,  23,  23,  23,  23,  23,  23,  23,
-    23,  23,  23,  23,  23,  23,  44,  44,  44,  44,  44,  44,  50,  50,  50,
-    50,  50,  50,  50,  50,  50,  68,  68,  68,  68,  68,  68,  68,  85,  85,
-    85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,
-    85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,  85,
-    85,  85,  85,  85,  85,  85,  85,  85,  85,  105, 105, 105, 105, 105, 105,
-    105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105,
-    105, 105, 105, 88,  88,  88,  88,  88,  88,  88,  88,  88,  0,   0,   0,
-    0,   0,   0,   0,   0,   0,   5,   5,   5,   5,   5,   5,   19,  19,  19,
-    36,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,  41,
-    55,  55,  55,  55,  55,  55,  69,  69,  69,  69,  69,  69,  69,  69,  69,
-    75,  75,  80,  80,  80,  80,  80,  97,  97,  97,  97,  97,  97,  97,  97,
-    97,  97,  102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102,
-    102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102,
-    102, 102, 102, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116,
-    116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 100, 100, 100,
-    100, 100, 100, 100, 100, 100, 0,   0,   0,   0,   0,   0,   0,   0,   4,
-    16,  16,  16,  16,  16,  16,  30,  35,  35,  47,  58,  58,  58,  58,  58,
-    58,  58,  58,  58,  58,  58,  58,  58,  58,  63,  63,  63,  63,  63,  63,
-    77,  77,  77,  77,  77,  77,  77,  82,  82,  82,  82,  94,  94,  94,  94,
-    94,  105, 105, 105, 105, 110, 110, 110, 110, 110, 110, 122, 122, 122, 122,
-    122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-    122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 115, 115, 115, 115, 115, 115, 115, 115, 115,
-    0,   0,   0,   0,   0,   0,   0,   4,   14,  27,  27,  27,  27,  27,  31,
-    41,  52,  52,  56,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,  69,
-    69,  69,  69,  69,  69,  69,  69,  69,  69,  79,  79,  79,  79,  83,  83,
-    83,  94,  94,  94,  94,  106, 106, 106, 106, 106, 115, 115, 115, 115, 125,
-    125, 125, 125, 125, 125, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 0,   0,   0,   0,   3,   3,
-    3,   17,  28,  38,  38,  38,  38,  38,  47,  51,  63,  63,  63,  72,  72,
-    72,  72,  72,  72,  72,  76,  76,  76,  76,  80,  80,  80,  80,  80,  80,
-    80,  80,  80,  84,  84,  84,  84,  93,  93,  93,  105, 105, 105, 105, 114,
-    114, 114, 114, 114, 124, 124, 124, 124, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 0,   0,   0,   0,   12,  12,  12,  35,  43,  47,  47,  47,
-    47,  47,  58,  58,  66,  66,  66,  70,  70,  70,  70,  70,  73,  73,  82,
-    82,  82,  86,  94,  94,  94,  94,  94,  94,  94,  94,  94,  94,  94,  94,
-    94,  105, 105, 105, 114, 114, 114, 114, 117, 117, 117, 117, 117, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 0,   0,   0,
-    0,   24,  24,  24,  49,  53,  53,  53,  53,  53,  53,  61,  61,  64,  64,
-    64,  64,  70,  70,  70,  70,  78,  78,  88,  88,  88,  96,  106, 106, 106,
-    106, 106, 106, 106, 106, 106, 106, 112, 112, 112, 120, 120, 120, 124, 124,
-    124, 124, 124, 124, 124, 124, 124, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 0,   0,   0,   5,   36,  36,  36,  55,  55,
-    55,  55,  55,  55,  55,  58,  58,  58,  58,  58,  64,  78,  78,  78,  78,
-    87,  87,  94,  94,  94,  103, 110, 110, 110, 110, 110, 110, 110, 110, 116,
-    116, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    0,   0,   0,   18,  43,  43,  43,  53,  53,  53,  53,  53,  53,  53,  53,
-    58,  58,  58,  58,  71,  87,  87,  87,  87,  94,  94,  97,  97,  97,  109,
-    111, 111, 111, 111, 111, 111, 111, 111, 125, 125, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 0,   0,   0,   31,  46,  46,
-    46,  48,  48,  48,  48,  48,  48,  48,  48,  66,  66,  66,  66,  80,  93,
-    93,  93,  93,  95,  95,  95,  95,  100, 115, 115, 115, 115, 115, 115, 115,
-    115, 115, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 0,   0,   4,   40,  45,  45,  45,  45,  45,  45,  45,  45,
-    49,  49,  49,  74,  74,  74,  74,  86,  90,  90,  90,  90,  95,  95,  95,
-    95,  106, 120, 120, 120, 120, 120, 120, 120, 120, 120, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 0,   0,   14,
-    42,  42,  42,  42,  42,  42,  42,  42,  46,  56,  56,  56,  80,  80,  80,
-    80,  84,  84,  84,  84,  88,  99,  99,  99,  99,  111, 122, 122, 122, 122,
-    122, 122, 122, 122, 122, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 0,   0,   26,  40,  40,  40,  40,  40,  40,
-    40,  40,  54,  66,  66,  66,  80,  80,  80,  80,  80,  80,  80,  84,  94,
-    106, 106, 106, 106, 116, 120, 120, 120, 120, 120, 120, 120, 120, 124, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    0,   3,   34,  38,  38,  38,  38,  38,  42,  42,  42,  63,  72,  72,  76,
-    80,  80,  80,  80,  80,  80,  80,  89,  101, 114, 114, 114, 114, 118, 118,
-    118, 118, 118, 118, 118, 118, 118, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 0,   12,  36,  36,  36,  36,
-    36,  36,  49,  49,  49,  69,  73,  76,  86,  86,  86,  86,  86,  86,  86,
-    86,  97,  109, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
-    122, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 0,   22,  34,  34,  34,  34,  38,  38,  57,  57,  57,  69,
-    73,  82,  92,  92,  92,  92,  92,  92,  96,  96,  104, 117, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 0,   29,  33,
-    33,  33,  33,  44,  44,  62,  62,  62,  69,  77,  87,  95,  95,  95,  95,
-    95,  95,  107, 107, 110, 120, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 0,   31,  31,  31,  31,  31,  51,  51,  62,
-    65,  65,  73,  83,  91,  94,  94,  94,  94,  97,  97,  114, 114, 114, 122,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    0,   29,  29,  29,  29,  29,  56,  56,  59,  70,  70,  79,  86,  89,  89,
-    89,  89,  89,  100, 100, 116, 116, 116, 122, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 0,   28,  28,  28,  28,  28,
-    57,  57,  57,  76,  76,  83,  86,  86,  86,  86,  86,  89,  104, 104, 114,
-    114, 114, 124, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 0,   27,  27,  27,  27,  30,  55,  55,  55,  80,  80,  83,
-    86,  86,  86,  86,  86,  93,  108, 108, 111, 111, 111, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 0,   26,  26,
-    26,  26,  36,  53,  53,  53,  80,  80,  80,  90,  90,  90,  90,  90,  98,
-    107, 107, 107, 107, 107, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 0,   26,  26,  26,  28,  42,  52,  54,  54,
-    78,  78,  78,  95,  95,  95,  97,  97,  104, 106, 106, 106, 106, 106, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    0,   24,  24,  24,  33,  47,  49,  58,  58,  74,  74,  74,  97,  97,  97,
-    106, 106, 108, 108, 108, 108, 108, 108, 124, 124, 124, 124, 124, 124, 124,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 0,   24,  24,  24,  39,  48,
-    50,  63,  63,  72,  74,  74,  96,  96,  96,  109, 111, 111, 111, 111, 111,
-    111, 111, 119, 119, 122, 122, 122, 122, 122, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 0,   23,  23,  23,  43,  46,  54,  66,  66,  69,  77,  77,
-    92,  92,  92,  105, 113, 113, 113, 113, 113, 113, 113, 115, 117, 123, 123,
-    123, 123, 123, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 0,   22,  22,
-    22,  44,  44,  59,  67,  67,  67,  81,  81,  89,  89,  89,  97,  112, 112,
-    112, 112, 112, 112, 112, 112, 119, 126, 126, 126, 126, 126, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 0,   21,  21,  24,  43,  45,  63,  65,  65,
-    67,  85,  85,  87,  87,  87,  91,  109, 109, 109, 111, 111, 111, 111, 111,
-    123, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    0,   21,  21,  28,  42,  50,  63,  63,  66,  71,  85,  85,  85,  85,  87,
-    92,  106, 106, 108, 114, 114, 114, 114, 114, 125, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 0,   20,  20,  34,  41,  54,
-    62,  62,  69,  75,  82,  82,  82,  82,  92,  98,  105, 105, 110, 117, 117,
-    117, 117, 117, 124, 124, 126, 126, 126, 126, 126, 126, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 0,   20,  20,  38,  40,  58,  60,  60,  73,  78,  80,  80,
-    80,  80,  100, 105, 107, 107, 113, 118, 118, 118, 118, 118, 120, 120, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 0,   19,  21,
-    38,  40,  58,  58,  60,  75,  77,  77,  77,  81,  81,  107, 109, 109, 109,
-    114, 116, 116, 116, 116, 116, 116, 116, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 0,   18,  25,  37,  44,  56,  56,  63,  75,
-    75,  75,  75,  88,  88,  111, 111, 111, 111, 112, 112, 112, 112, 112, 112,
-    112, 114, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    0,   18,  30,  36,  48,  55,  55,  67,  73,  73,  73,  73,  97,  97,  110,
-    110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 116, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 0,   18,  34,  36,  52,  55,
-    55,  70,  72,  73,  73,  73,  102, 104, 108, 108, 108, 108, 109, 109, 109,
-    109, 109, 109, 109, 119, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 0,   17,  35,  35,  52,  59,  59,  70,  70,  76,  76,  76,
-    99,  105, 105, 105, 105, 105, 111, 111, 111, 111, 111, 111, 111, 121, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 0,   17,  34,
-    36,  51,  61,  62,  70,  70,  80,  80,  80,  93,  103, 103, 103, 103, 103,
-    112, 112, 112, 112, 112, 116, 118, 124, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 0,   16,  33,  39,  50,  59,  65,  72,  72,
-    82,  82,  82,  91,  100, 100, 100, 100, 100, 109, 109, 109, 109, 109, 121,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    0,   16,  32,  43,  48,  54,  66,  75,  75,  81,  83,  83,  92,  97,  97,
-    97,  99,  99,  105, 105, 105, 105, 105, 123, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 0,   15,  31,  46,  47,  49,
-    69,  77,  77,  81,  85,  85,  93,  95,  95,  95,  100, 100, 102, 102, 102,
-    102, 102, 120, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 0,   15,  30,  46,  48,  48,  70,  75,  79,  82,  87,  87,
-    92,  94,  94,  94,  103, 103, 103, 103, 103, 104, 104, 115, 120, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 0,   15,  30,
-    45,  50,  50,  68,  70,  80,  85,  89,  89,  90,  95,  95,  95,  104, 104,
-    104, 104, 104, 109, 109, 112, 114, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 0,   14,  29,  44,  54,  54,  64,  64,  83,
-    87,  88,  88,  88,  98,  98,  98,  103, 103, 103, 103, 103, 113, 113, 113,
-    113, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    0,   14,  29,  43,  56,  56,  61,  61,  84,  85,  88,  88,  88,  100, 100,
-    100, 102, 102, 102, 102, 102, 113, 116, 116, 116, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 0,   14,  28,  42,  57,  57,
-    62,  62,  80,  80,  91,  91,  91,  100, 100, 100, 100, 100, 100, 100, 100,
-    109, 119, 119, 119, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 0,   14,  28,  42,  56,  56,  65,  66,  76,  76,  92,  92,
-    92,  97,  97,  97,  101, 101, 101, 101, 101, 106, 121, 121, 121, 126, 126,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 0,   13,  27,
-    41,  55,  55,  67,  72,  74,  74,  90,  90,  90,  91,  91,  91,  105, 105,
-    105, 105, 105, 107, 122, 122, 122, 123, 123, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 0,   13,  27,  40,  54,  54,  67,  76,  76,
-    76,  85,  85,  85,  85,  85,  85,  112, 112, 112, 112, 112, 112, 121, 121,
-    121, 121, 121, 126, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-    127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127,
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_VIDEO_CODING_FEC_RATE_TABLE_H_
diff --git a/modules/video_coding/frame_buffer.cc b/modules/video_coding/frame_buffer.cc
deleted file mode 100644
index 41c7fc8..0000000
--- a/modules/video_coding/frame_buffer.cc
+++ /dev/null
@@ -1,303 +0,0 @@
-/*
- *  Copyright (c) 2012 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/video_coding/frame_buffer.h"
-
-#include <assert.h>
-#include <string.h>
-
-#include "webrtc/modules/video_coding/packet.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/trace_event.h"
-
-namespace webrtc {
-
-VCMFrameBuffer::VCMFrameBuffer()
-    : _state(kStateEmpty), _nackCount(0), _latestPacketTimeMs(-1) {}
-
-VCMFrameBuffer::~VCMFrameBuffer() {}
-
-VCMFrameBuffer::VCMFrameBuffer(const VCMFrameBuffer& rhs)
-    : VCMEncodedFrame(rhs),
-      _state(rhs._state),
-      _sessionInfo(),
-      _nackCount(rhs._nackCount),
-      _latestPacketTimeMs(rhs._latestPacketTimeMs) {
-  _sessionInfo = rhs._sessionInfo;
-  _sessionInfo.UpdateDataPointers(rhs._buffer, _buffer);
-}
-
-webrtc::FrameType VCMFrameBuffer::FrameType() const {
-  return _sessionInfo.FrameType();
-}
-
-int32_t VCMFrameBuffer::GetLowSeqNum() const {
-  return _sessionInfo.LowSequenceNumber();
-}
-
-int32_t VCMFrameBuffer::GetHighSeqNum() const {
-  return _sessionInfo.HighSequenceNumber();
-}
-
-int VCMFrameBuffer::PictureId() const {
-  return _sessionInfo.PictureId();
-}
-
-int VCMFrameBuffer::TemporalId() const {
-  return _sessionInfo.TemporalId();
-}
-
-bool VCMFrameBuffer::LayerSync() const {
-  return _sessionInfo.LayerSync();
-}
-
-int VCMFrameBuffer::Tl0PicId() const {
-  return _sessionInfo.Tl0PicId();
-}
-
-bool VCMFrameBuffer::NonReference() const {
-  return _sessionInfo.NonReference();
-}
-
-std::vector<NaluInfo> VCMFrameBuffer::GetNaluInfos() const {
-  return _sessionInfo.GetNaluInfos();
-}
-
-void VCMFrameBuffer::SetGofInfo(const GofInfoVP9& gof_info, size_t idx) {
-  TRACE_EVENT0("webrtc", "VCMFrameBuffer::SetGofInfo");
-  _sessionInfo.SetGofInfo(gof_info, idx);
-  // TODO(asapersson): Consider adding hdr->VP9.ref_picture_id for testing.
-  _codecSpecificInfo.codecSpecific.VP9.temporal_idx =
-      gof_info.temporal_idx[idx];
-  _codecSpecificInfo.codecSpecific.VP9.temporal_up_switch =
-      gof_info.temporal_up_switch[idx];
-}
-
-bool VCMFrameBuffer::IsSessionComplete() const {
-  TRACE_EVENT0("webrtc", "VCMFrameBuffer::IsSessionComplete");
-  return _sessionInfo.complete();
-}
-
-// Insert packet
-VCMFrameBufferEnum VCMFrameBuffer::InsertPacket(
-    const VCMPacket& packet,
-    int64_t timeInMs,
-    VCMDecodeErrorMode decode_error_mode,
-    const FrameData& frame_data) {
-  TRACE_EVENT0("webrtc", "VCMFrameBuffer::InsertPacket");
-  assert(!(NULL == packet.dataPtr && packet.sizeBytes > 0));
-  if (packet.dataPtr != NULL) {
-    _payloadType = packet.payloadType;
-  }
-
-  if (kStateEmpty == _state) {
-    // First packet (empty and/or media) inserted into this frame.
-    // store some info and set some initial values.
-    _timeStamp = packet.timestamp;
-    // We only take the ntp timestamp of the first packet of a frame.
-    ntp_time_ms_ = packet.ntp_time_ms_;
-    _codec = packet.codec;
-    if (packet.frameType != kEmptyFrame) {
-      // first media packet
-      SetState(kStateIncomplete);
-    }
-  }
-
-  uint32_t requiredSizeBytes =
-      Length() + packet.sizeBytes +
-      (packet.insertStartCode ? kH264StartCodeLengthBytes : 0) +
-      EncodedImage::GetBufferPaddingBytes(packet.codec);
-  if (requiredSizeBytes >= _size) {
-    const uint8_t* prevBuffer = _buffer;
-    const uint32_t increments =
-        requiredSizeBytes / kBufferIncStepSizeBytes +
-        (requiredSizeBytes % kBufferIncStepSizeBytes > 0);
-    const uint32_t newSize = _size + increments * kBufferIncStepSizeBytes;
-    if (newSize > kMaxJBFrameSizeBytes) {
-      LOG(LS_ERROR) << "Failed to insert packet due to frame being too "
-                       "big.";
-      return kSizeError;
-    }
-    VerifyAndAllocate(newSize);
-    _sessionInfo.UpdateDataPointers(prevBuffer, _buffer);
-  }
-
-  if (packet.width > 0 && packet.height > 0) {
-    _encodedWidth = packet.width;
-    _encodedHeight = packet.height;
-  }
-
-  // Don't copy payload specific data for empty packets (e.g padding packets).
-  if (packet.sizeBytes > 0)
-    CopyCodecSpecific(&packet.video_header);
-
-  int retVal =
-      _sessionInfo.InsertPacket(packet, _buffer, decode_error_mode, frame_data);
-  if (retVal == -1) {
-    return kSizeError;
-  } else if (retVal == -2) {
-    return kDuplicatePacket;
-  } else if (retVal == -3) {
-    return kOutOfBoundsPacket;
-  }
-  // update length
-  _length = Length() + static_cast<uint32_t>(retVal);
-
-  _latestPacketTimeMs = timeInMs;
-
-  // http://www.etsi.org/deliver/etsi_ts/126100_126199/126114/12.07.00_60/
-  // ts_126114v120700p.pdf Section 7.4.5.
-  // The MTSI client shall add the payload bytes as defined in this clause
-  // onto the last RTP packet in each group of packets which make up a key
-  // frame (I-frame or IDR frame in H.264 (AVC), or an IRAP picture in H.265
-  // (HEVC)).
-  if (packet.markerBit) {
-    RTC_DCHECK(!_rotation_set);
-    rotation_ = packet.video_header.rotation;
-    _rotation_set = true;
-    content_type_ = packet.video_header.content_type;
-    if (packet.video_header.video_timing.flags != TimingFrameFlags::kInvalid) {
-      timing_.encode_start_ms =
-          ntp_time_ms_ + packet.video_header.video_timing.encode_start_delta_ms;
-      timing_.encode_finish_ms =
-          ntp_time_ms_ +
-          packet.video_header.video_timing.encode_finish_delta_ms;
-      timing_.packetization_finish_ms =
-          ntp_time_ms_ +
-          packet.video_header.video_timing.packetization_finish_delta_ms;
-      timing_.pacer_exit_ms =
-          ntp_time_ms_ + packet.video_header.video_timing.pacer_exit_delta_ms;
-      timing_.network_timestamp_ms =
-          ntp_time_ms_ +
-          packet.video_header.video_timing.network_timstamp_delta_ms;
-      timing_.network2_timestamp_ms =
-          ntp_time_ms_ +
-          packet.video_header.video_timing.network2_timstamp_delta_ms;
-    }
-    timing_.flags = packet.video_header.video_timing.flags;
-  }
-
-  if (packet.is_first_packet_in_frame) {
-    playout_delay_ = packet.video_header.playout_delay;
-  }
-
-  if (_sessionInfo.complete()) {
-    SetState(kStateComplete);
-    return kCompleteSession;
-  } else if (_sessionInfo.decodable()) {
-    SetState(kStateDecodable);
-    return kDecodableSession;
-  }
-  return kIncomplete;
-}
-
-int64_t VCMFrameBuffer::LatestPacketTimeMs() const {
-  TRACE_EVENT0("webrtc", "VCMFrameBuffer::LatestPacketTimeMs");
-  return _latestPacketTimeMs;
-}
-
-void VCMFrameBuffer::IncrementNackCount() {
-  TRACE_EVENT0("webrtc", "VCMFrameBuffer::IncrementNackCount");
-  _nackCount++;
-}
-
-int16_t VCMFrameBuffer::GetNackCount() const {
-  TRACE_EVENT0("webrtc", "VCMFrameBuffer::GetNackCount");
-  return _nackCount;
-}
-
-bool VCMFrameBuffer::HaveFirstPacket() const {
-  TRACE_EVENT0("webrtc", "VCMFrameBuffer::HaveFirstPacket");
-  return _sessionInfo.HaveFirstPacket();
-}
-
-bool VCMFrameBuffer::HaveLastPacket() const {
-  TRACE_EVENT0("webrtc", "VCMFrameBuffer::HaveLastPacket");
-  return _sessionInfo.HaveLastPacket();
-}
-
-int VCMFrameBuffer::NumPackets() const {
-  TRACE_EVENT0("webrtc", "VCMFrameBuffer::NumPackets");
-  return _sessionInfo.NumPackets();
-}
-
-void VCMFrameBuffer::Reset() {
-  TRACE_EVENT0("webrtc", "VCMFrameBuffer::Reset");
-  _length = 0;
-  _timeStamp = 0;
-  _sessionInfo.Reset();
-  _payloadType = 0;
-  _nackCount = 0;
-  _latestPacketTimeMs = -1;
-  _state = kStateEmpty;
-  VCMEncodedFrame::Reset();
-}
-
-// Set state of frame
-void VCMFrameBuffer::SetState(VCMFrameBufferStateEnum state) {
-  TRACE_EVENT0("webrtc", "VCMFrameBuffer::SetState");
-  if (_state == state) {
-    return;
-  }
-  switch (state) {
-    case kStateIncomplete:
-      // we can go to this state from state kStateEmpty
-      assert(_state == kStateEmpty);
-
-      // Do nothing, we received a packet
-      break;
-
-    case kStateComplete:
-      assert(_state == kStateEmpty || _state == kStateIncomplete ||
-             _state == kStateDecodable);
-
-      break;
-
-    case kStateEmpty:
-      // Should only be set to empty through Reset().
-      assert(false);
-      break;
-
-    case kStateDecodable:
-      assert(_state == kStateEmpty || _state == kStateIncomplete);
-      break;
-  }
-  _state = state;
-}
-
-// Get current state of frame
-VCMFrameBufferStateEnum VCMFrameBuffer::GetState() const {
-  return _state;
-}
-
-// Get current state of frame
-VCMFrameBufferStateEnum VCMFrameBuffer::GetState(uint32_t& timeStamp) const {
-  TRACE_EVENT0("webrtc", "VCMFrameBuffer::GetState");
-  timeStamp = TimeStamp();
-  return GetState();
-}
-
-bool VCMFrameBuffer::IsRetransmitted() const {
-  return _sessionInfo.session_nack();
-}
-
-void VCMFrameBuffer::PrepareForDecode(bool continuous) {
-  TRACE_EVENT0("webrtc", "VCMFrameBuffer::PrepareForDecode");
-  size_t bytes_removed = _sessionInfo.MakeDecodable();
-  _length -= bytes_removed;
-  // Transfer frame information to EncodedFrame and create any codec
-  // specific information.
-  _frameType = _sessionInfo.FrameType();
-  _completeFrame = _sessionInfo.complete();
-  _missingFrame = !continuous;
-}
-
-}  // namespace webrtc
diff --git a/modules/video_coding/frame_buffer.h b/modules/video_coding/frame_buffer.h
deleted file mode 100644
index 95c5985..0000000
--- a/modules/video_coding/frame_buffer.h
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- *  Copyright (c) 2012 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_VIDEO_CODING_FRAME_BUFFER_H_
-#define WEBRTC_MODULES_VIDEO_CODING_FRAME_BUFFER_H_
-
-#include <vector>
-
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/modules/video_coding/include/video_coding.h"
-#include "webrtc/modules/video_coding/encoded_frame.h"
-#include "webrtc/modules/video_coding/jitter_buffer_common.h"
-#include "webrtc/modules/video_coding/session_info.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-class VCMFrameBuffer : public VCMEncodedFrame {
- public:
-  VCMFrameBuffer();
-  virtual ~VCMFrameBuffer();
-
-  VCMFrameBuffer(const VCMFrameBuffer& rhs);
-
-  virtual void Reset();
-
-  VCMFrameBufferEnum InsertPacket(const VCMPacket& packet,
-                                  int64_t timeInMs,
-                                  VCMDecodeErrorMode decode_error_mode,
-                                  const FrameData& frame_data);
-
-  // State
-  // Get current state of frame
-  VCMFrameBufferStateEnum GetState() const;
-  // Get current state and timestamp of frame
-  VCMFrameBufferStateEnum GetState(uint32_t& timeStamp) const;
-  void PrepareForDecode(bool continuous);
-
-  bool IsRetransmitted() const;
-  bool IsSessionComplete() const;
-  bool HaveFirstPacket() const;
-  bool HaveLastPacket() const;
-  int NumPackets() const;
-  // Makes sure the session contain a decodable stream.
-  void MakeSessionDecodable();
-
-  // Sequence numbers
-  // Get lowest packet sequence number in frame
-  int32_t GetLowSeqNum() const;
-  // Get highest packet sequence number in frame
-  int32_t GetHighSeqNum() const;
-
-  int PictureId() const;
-  int TemporalId() const;
-  bool LayerSync() const;
-  int Tl0PicId() const;
-  bool NonReference() const;
-
-  std::vector<NaluInfo> GetNaluInfos() const;
-
-  void SetGofInfo(const GofInfoVP9& gof_info, size_t idx);
-
-  // Increments a counter to keep track of the number of packets of this frame
-  // which were NACKed before they arrived.
-  void IncrementNackCount();
-  // Returns the number of packets of this frame which were NACKed before they
-  // arrived.
-  int16_t GetNackCount() const;
-
-  int64_t LatestPacketTimeMs() const;
-
-  webrtc::FrameType FrameType() const;
-  void SetPreviousFrameLoss();
-
-  // The number of packets discarded because the decoder can't make use of them.
-  int NotDecodablePackets() const;
-
- private:
-  void SetState(VCMFrameBufferStateEnum state);  // Set state of frame
-
-  VCMFrameBufferStateEnum _state;  // Current state of the frame
-  VCMSessionInfo _sessionInfo;
-  uint16_t _nackCount;
-  int64_t _latestPacketTimeMs;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_VIDEO_CODING_FRAME_BUFFER_H_
diff --git a/modules/video_coding/frame_buffer2.cc b/modules/video_coding/frame_buffer2.cc
deleted file mode 100644
index 5b81c5f..0000000
--- a/modules/video_coding/frame_buffer2.cc
+++ /dev/null
@@ -1,573 +0,0 @@
-/*
- *  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/video_coding/frame_buffer2.h"
-
-#include <algorithm>
-#include <cstring>
-#include <queue>
-
-#include "webrtc/modules/video_coding/include/video_coding_defines.h"
-#include "webrtc/modules/video_coding/jitter_estimator.h"
-#include "webrtc/modules/video_coding/timing.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/trace_event.h"
-#include "webrtc/system_wrappers/include/clock.h"
-#include "webrtc/system_wrappers/include/metrics.h"
-
-namespace webrtc {
-namespace video_coding {
-
-namespace {
-// Max number of frames the buffer will hold.
-constexpr int kMaxFramesBuffered = 600;
-
-// Max number of decoded frame info that will be saved.
-constexpr int kMaxFramesHistory = 50;
-
-constexpr int64_t kLogNonDecodedIntervalMs = 5000;
-}  // namespace
-
-FrameBuffer::FrameBuffer(Clock* clock,
-                         VCMJitterEstimator* jitter_estimator,
-                         VCMTiming* timing,
-                         VCMReceiveStatisticsCallback* stats_callback)
-    : clock_(clock),
-      new_continuous_frame_event_(false, false),
-      jitter_estimator_(jitter_estimator),
-      timing_(timing),
-      inter_frame_delay_(clock_->TimeInMilliseconds()),
-      last_decoded_frame_timestamp_(0),
-      last_decoded_frame_it_(frames_.end()),
-      last_continuous_frame_it_(frames_.end()),
-      num_frames_history_(0),
-      num_frames_buffered_(0),
-      stopped_(false),
-      protection_mode_(kProtectionNack),
-      stats_callback_(stats_callback),
-      last_log_non_decoded_ms_(-kLogNonDecodedIntervalMs) {}
-
-FrameBuffer::~FrameBuffer() {}
-
-FrameBuffer::ReturnReason FrameBuffer::NextFrame(
-    int64_t max_wait_time_ms,
-    std::unique_ptr<FrameObject>* frame_out,
-    bool keyframe_required) {
-  TRACE_EVENT0("webrtc", "FrameBuffer::NextFrame");
-  int64_t latest_return_time_ms =
-      clock_->TimeInMilliseconds() + max_wait_time_ms;
-  int64_t wait_ms = max_wait_time_ms;
-  int64_t now_ms = 0;
-
-  do {
-    now_ms = clock_->TimeInMilliseconds();
-    {
-      rtc::CritScope lock(&crit_);
-      new_continuous_frame_event_.Reset();
-      if (stopped_)
-        return kStopped;
-
-      wait_ms = max_wait_time_ms;
-
-      // Need to hold |crit_| in order to use |frames_|, therefore we
-      // set it here in the loop instead of outside the loop in order to not
-      // acquire the lock unnecesserily.
-      next_frame_it_ = frames_.end();
-
-      // |frame_it| points to the first frame after the
-      // |last_decoded_frame_it_|.
-      auto frame_it = frames_.end();
-      if (last_decoded_frame_it_ == frames_.end()) {
-        frame_it = frames_.begin();
-      } else {
-        frame_it = last_decoded_frame_it_;
-        ++frame_it;
-      }
-
-      // |continuous_end_it| points to the first frame after the
-      // |last_continuous_frame_it_|.
-      auto continuous_end_it = last_continuous_frame_it_;
-      if (continuous_end_it != frames_.end())
-        ++continuous_end_it;
-
-      for (; frame_it != continuous_end_it && frame_it != frames_.end();
-           ++frame_it) {
-        if (!frame_it->second.continuous ||
-            frame_it->second.num_missing_decodable > 0) {
-          continue;
-        }
-
-        FrameObject* frame = frame_it->second.frame.get();
-
-        if (keyframe_required && !frame->is_keyframe())
-          continue;
-
-        next_frame_it_ = frame_it;
-        if (frame->RenderTime() == -1)
-          frame->SetRenderTime(timing_->RenderTimeMs(frame->timestamp, now_ms));
-        wait_ms = timing_->MaxWaitingTime(frame->RenderTime(), now_ms);
-
-        // This will cause the frame buffer to prefer high framerate rather
-        // than high resolution in the case of the decoder not decoding fast
-        // enough and the stream has multiple spatial and temporal layers.
-        if (wait_ms == 0)
-          continue;
-
-        break;
-      }
-    }  // rtc::Critscope lock(&crit_);
-
-    wait_ms = std::min<int64_t>(wait_ms, latest_return_time_ms - now_ms);
-    wait_ms = std::max<int64_t>(wait_ms, 0);
-  } while (new_continuous_frame_event_.Wait(wait_ms));
-
-  {
-    rtc::CritScope lock(&crit_);
-    now_ms = clock_->TimeInMilliseconds();
-    if (next_frame_it_ != frames_.end()) {
-      std::unique_ptr<FrameObject> frame =
-          std::move(next_frame_it_->second.frame);
-
-      if (!frame->delayed_by_retransmission()) {
-        int64_t frame_delay;
-
-        if (inter_frame_delay_.CalculateDelay(frame->timestamp, &frame_delay,
-                                              frame->ReceivedTime())) {
-          jitter_estimator_->UpdateEstimate(frame_delay, frame->size());
-        }
-
-        float rtt_mult = protection_mode_ == kProtectionNackFEC ? 0.0 : 1.0;
-        timing_->SetJitterDelay(jitter_estimator_->GetJitterEstimate(rtt_mult));
-        timing_->UpdateCurrentDelay(frame->RenderTime(), now_ms);
-      }
-
-      // Gracefully handle bad RTP timestamps and render time issues.
-      if (HasBadRenderTiming(*frame, now_ms)) {
-        jitter_estimator_->Reset();
-        timing_->Reset();
-        frame->SetRenderTime(timing_->RenderTimeMs(frame->timestamp, now_ms));
-      }
-
-      UpdateJitterDelay();
-      UpdateTimingFrameInfo();
-      PropagateDecodability(next_frame_it_->second);
-
-      // Sanity check for RTP timestamp monotonicity.
-      if (last_decoded_frame_it_ != frames_.end()) {
-        const FrameKey& last_decoded_frame_key = last_decoded_frame_it_->first;
-        const FrameKey& frame_key = next_frame_it_->first;
-
-        const bool frame_is_higher_spatial_layer_of_last_decoded_frame =
-            last_decoded_frame_timestamp_ == frame->timestamp &&
-            last_decoded_frame_key.picture_id == frame_key.picture_id &&
-            last_decoded_frame_key.spatial_layer < frame_key.spatial_layer;
-
-        if (AheadOrAt(last_decoded_frame_timestamp_, frame->timestamp) &&
-            !frame_is_higher_spatial_layer_of_last_decoded_frame) {
-          // TODO(brandtr): Consider clearing the entire buffer when we hit
-          // these conditions.
-          LOG(LS_WARNING) << "Frame with (timestamp:picture_id:spatial_id) ("
-                          << frame->timestamp << ":" << frame->picture_id << ":"
-                          << static_cast<int>(frame->spatial_layer) << ")"
-                          << " sent to decoder after frame with"
-                          << " (timestamp:picture_id:spatial_id) ("
-                          << last_decoded_frame_timestamp_ << ":"
-                          << last_decoded_frame_key.picture_id << ":"
-                          << static_cast<int>(
-                                 last_decoded_frame_key.spatial_layer)
-                          << ").";
-        }
-      }
-
-      AdvanceLastDecodedFrame(next_frame_it_);
-      last_decoded_frame_timestamp_ = frame->timestamp;
-      *frame_out = std::move(frame);
-      return kFrameFound;
-    }
-  }
-
-  if (latest_return_time_ms - now_ms > 0) {
-    // If |next_frame_it_ == frames_.end()| and there is still time left, it
-    // means that the frame buffer was cleared as the thread in this function
-    // was waiting to acquire |crit_| in order to return. Wait for the
-    // remaining time and then return.
-    return NextFrame(latest_return_time_ms - now_ms, frame_out);
-  }
-
-  return kTimeout;
-}
-
-bool FrameBuffer::HasBadRenderTiming(const FrameObject& frame, int64_t now_ms) {
-  // Assume that render timing errors are due to changes in the video stream.
-  int64_t render_time_ms = frame.RenderTimeMs();
-  const int64_t kMaxVideoDelayMs = 10000;
-  if (render_time_ms < 0) {
-    return true;
-  }
-  if (std::abs(render_time_ms - now_ms) > kMaxVideoDelayMs) {
-    int frame_delay = static_cast<int>(std::abs(render_time_ms - now_ms));
-    LOG(LS_WARNING) << "A frame about to be decoded is out of the configured "
-                    << "delay bounds (" << frame_delay << " > "
-                    << kMaxVideoDelayMs
-                    << "). Resetting the video jitter buffer.";
-    return true;
-  }
-  if (static_cast<int>(timing_->TargetVideoDelay()) > kMaxVideoDelayMs) {
-    LOG(LS_WARNING) << "The video target delay has grown larger than "
-                    << kMaxVideoDelayMs << " ms.";
-    return true;
-  }
-  return false;
-}
-
-void FrameBuffer::SetProtectionMode(VCMVideoProtection mode) {
-  TRACE_EVENT0("webrtc", "FrameBuffer::SetProtectionMode");
-  rtc::CritScope lock(&crit_);
-  protection_mode_ = mode;
-}
-
-void FrameBuffer::Start() {
-  TRACE_EVENT0("webrtc", "FrameBuffer::Start");
-  rtc::CritScope lock(&crit_);
-  stopped_ = false;
-}
-
-void FrameBuffer::Stop() {
-  TRACE_EVENT0("webrtc", "FrameBuffer::Stop");
-  rtc::CritScope lock(&crit_);
-  stopped_ = true;
-  new_continuous_frame_event_.Set();
-}
-
-bool FrameBuffer::ValidReferences(const FrameObject& frame) const {
-  if (frame.picture_id < 0)
-    return false;
-
-  for (size_t i = 0; i < frame.num_references; ++i) {
-    if (frame.references[i] < 0 || frame.references[i] >= frame.picture_id)
-      return false;
-
-    for (size_t j = i + 1; j < frame.num_references; ++j) {
-      if (frame.references[i] == frame.references[j])
-        return false;
-    }
-  }
-
-  if (frame.inter_layer_predicted && frame.spatial_layer == 0)
-    return false;
-
-  return true;
-}
-
-void FrameBuffer::UpdatePlayoutDelays(const FrameObject& frame) {
-  TRACE_EVENT0("webrtc", "FrameBuffer::UpdatePlayoutDelays");
-  PlayoutDelay playout_delay = frame.EncodedImage().playout_delay_;
-  if (playout_delay.min_ms >= 0)
-    timing_->set_min_playout_delay(playout_delay.min_ms);
-
-  if (playout_delay.max_ms >= 0)
-    timing_->set_max_playout_delay(playout_delay.max_ms);
-}
-
-int FrameBuffer::InsertFrame(std::unique_ptr<FrameObject> frame) {
-  TRACE_EVENT0("webrtc", "FrameBuffer::InsertFrame");
-  RTC_DCHECK(frame);
-  if (stats_callback_)
-    stats_callback_->OnCompleteFrame(frame->is_keyframe(), frame->size(),
-                                     frame->contentType());
-  FrameKey key(frame->picture_id, frame->spatial_layer);
-
-  rtc::CritScope lock(&crit_);
-
-  int last_continuous_picture_id =
-      last_continuous_frame_it_ == frames_.end()
-          ? -1
-          : last_continuous_frame_it_->first.picture_id;
-
-  if (!ValidReferences(*frame)) {
-    LOG(LS_WARNING) << "Frame with (picture_id:spatial_id) (" << key.picture_id
-                    << ":" << static_cast<int>(key.spatial_layer)
-                    << ") has invalid frame references, dropping frame.";
-    return last_continuous_picture_id;
-  }
-
-  if (num_frames_buffered_ >= kMaxFramesBuffered) {
-    LOG(LS_WARNING) << "Frame with (picture_id:spatial_id) (" << key.picture_id
-                    << ":" << static_cast<int>(key.spatial_layer)
-                    << ") could not be inserted due to the frame "
-                    << "buffer being full, dropping frame.";
-    return last_continuous_picture_id;
-  }
-
-  if (last_decoded_frame_it_ != frames_.end() &&
-      key <= last_decoded_frame_it_->first) {
-    if (AheadOf(frame->timestamp, last_decoded_frame_timestamp_) &&
-        frame->is_keyframe()) {
-      // If this frame has a newer timestamp but an earlier picture id then we
-      // assume there has been a jump in the picture id due to some encoder
-      // reconfiguration or some other reason. Even though this is not according
-      // to spec we can still continue to decode from this frame if it is a
-      // keyframe.
-      LOG(LS_WARNING) << "A jump in picture id was detected, clearing buffer.";
-      ClearFramesAndHistory();
-      last_continuous_picture_id = -1;
-    } else {
-      LOG(LS_WARNING) << "Frame with (picture_id:spatial_id) ("
-                      << key.picture_id << ":"
-                      << static_cast<int>(key.spatial_layer)
-                      << ") inserted after frame ("
-                      << last_decoded_frame_it_->first.picture_id << ":"
-                      << static_cast<int>(
-                             last_decoded_frame_it_->first.spatial_layer)
-                      << ") was handed off for decoding, dropping frame.";
-      return last_continuous_picture_id;
-    }
-  }
-
-  // Test if inserting this frame would cause the order of the frames to become
-  // ambiguous (covering more than half the interval of 2^16). This can happen
-  // when the picture id make large jumps mid stream.
-  if (!frames_.empty() &&
-      key < frames_.begin()->first &&
-      frames_.rbegin()->first < key) {
-    LOG(LS_WARNING) << "A jump in picture id was detected, clearing buffer.";
-    ClearFramesAndHistory();
-    last_continuous_picture_id = -1;
-  }
-
-  auto info = frames_.insert(std::make_pair(key, FrameInfo())).first;
-
-  if (info->second.frame) {
-    LOG(LS_WARNING) << "Frame with (picture_id:spatial_id) (" << key.picture_id
-                    << ":" << static_cast<int>(key.spatial_layer)
-                    << ") already inserted, dropping frame.";
-    return last_continuous_picture_id;
-  }
-
-  if (!UpdateFrameInfoWithIncomingFrame(*frame, info))
-    return last_continuous_picture_id;
-  UpdatePlayoutDelays(*frame);
-  info->second.frame = std::move(frame);
-  ++num_frames_buffered_;
-
-  if (info->second.num_missing_continuous == 0) {
-    info->second.continuous = true;
-    PropagateContinuity(info);
-    last_continuous_picture_id = last_continuous_frame_it_->first.picture_id;
-
-    // Since we now have new continuous frames there might be a better frame
-    // to return from NextFrame. Signal that thread so that it again can choose
-    // which frame to return.
-    new_continuous_frame_event_.Set();
-  }
-
-  return last_continuous_picture_id;
-}
-
-void FrameBuffer::PropagateContinuity(FrameMap::iterator start) {
-  TRACE_EVENT0("webrtc", "FrameBuffer::PropagateContinuity");
-  RTC_DCHECK(start->second.continuous);
-  if (last_continuous_frame_it_ == frames_.end())
-    last_continuous_frame_it_ = start;
-
-  std::queue<FrameMap::iterator> continuous_frames;
-  continuous_frames.push(start);
-
-  // A simple BFS to traverse continuous frames.
-  while (!continuous_frames.empty()) {
-    auto frame = continuous_frames.front();
-    continuous_frames.pop();
-
-    if (last_continuous_frame_it_->first < frame->first)
-      last_continuous_frame_it_ = frame;
-
-    // Loop through all dependent frames, and if that frame no longer has
-    // any unfulfilled dependencies then that frame is continuous as well.
-    for (size_t d = 0; d < frame->second.num_dependent_frames; ++d) {
-      auto frame_ref = frames_.find(frame->second.dependent_frames[d]);
-      RTC_DCHECK(frame_ref != frames_.end());
-
-      // TODO(philipel): Look into why we've seen this happen.
-      if (frame_ref != frames_.end()) {
-        --frame_ref->second.num_missing_continuous;
-        if (frame_ref->second.num_missing_continuous == 0) {
-          frame_ref->second.continuous = true;
-          continuous_frames.push(frame_ref);
-        }
-      }
-    }
-  }
-}
-
-void FrameBuffer::PropagateDecodability(const FrameInfo& info) {
-  TRACE_EVENT0("webrtc", "FrameBuffer::PropagateDecodability");
-  RTC_CHECK(info.num_dependent_frames < FrameInfo::kMaxNumDependentFrames);
-  for (size_t d = 0; d < info.num_dependent_frames; ++d) {
-    auto ref_info = frames_.find(info.dependent_frames[d]);
-    RTC_DCHECK(ref_info != frames_.end());
-    // TODO(philipel): Look into why we've seen this happen.
-    if (ref_info != frames_.end()) {
-      RTC_DCHECK_GT(ref_info->second.num_missing_decodable, 0U);
-      --ref_info->second.num_missing_decodable;
-    }
-  }
-}
-
-void FrameBuffer::AdvanceLastDecodedFrame(FrameMap::iterator decoded) {
-  TRACE_EVENT0("webrtc", "FrameBuffer::AdvanceLastDecodedFrame");
-  if (last_decoded_frame_it_ == frames_.end()) {
-    last_decoded_frame_it_ = frames_.begin();
-  } else {
-    RTC_DCHECK(last_decoded_frame_it_->first < decoded->first);
-    ++last_decoded_frame_it_;
-  }
-  --num_frames_buffered_;
-  ++num_frames_history_;
-
-  // First, delete non-decoded frames from the history.
-  while (last_decoded_frame_it_ != decoded) {
-    if (last_decoded_frame_it_->second.frame)
-      --num_frames_buffered_;
-    last_decoded_frame_it_ = frames_.erase(last_decoded_frame_it_);
-  }
-
-  // Then remove old history if we have too much history saved.
-  if (num_frames_history_ > kMaxFramesHistory) {
-    frames_.erase(frames_.begin());
-    --num_frames_history_;
-  }
-}
-
-bool FrameBuffer::UpdateFrameInfoWithIncomingFrame(const FrameObject& frame,
-                                                   FrameMap::iterator info) {
-  TRACE_EVENT0("webrtc", "FrameBuffer::UpdateFrameInfoWithIncomingFrame");
-  FrameKey key(frame.picture_id, frame.spatial_layer);
-  info->second.num_missing_continuous = frame.num_references;
-  info->second.num_missing_decodable = frame.num_references;
-
-  RTC_DCHECK(last_decoded_frame_it_ == frames_.end() ||
-             last_decoded_frame_it_->first < info->first);
-
-  // Check how many dependencies that have already been fulfilled.
-  for (size_t i = 0; i < frame.num_references; ++i) {
-    FrameKey ref_key(frame.references[i], frame.spatial_layer);
-    auto ref_info = frames_.find(ref_key);
-
-    // Does |frame| depend on a frame earlier than the last decoded frame?
-    if (last_decoded_frame_it_ != frames_.end() &&
-        ref_key <= last_decoded_frame_it_->first) {
-      if (ref_info == frames_.end()) {
-        int64_t now_ms = clock_->TimeInMilliseconds();
-        if (last_log_non_decoded_ms_ + kLogNonDecodedIntervalMs < now_ms) {
-          LOG(LS_WARNING)
-              << "Frame with (picture_id:spatial_id) (" << key.picture_id << ":"
-              << static_cast<int>(key.spatial_layer)
-              << ") depends on a non-decoded frame more previous than"
-              << " the last decoded frame, dropping frame.";
-          last_log_non_decoded_ms_ = now_ms;
-        }
-        return false;
-      }
-
-      --info->second.num_missing_continuous;
-      --info->second.num_missing_decodable;
-    } else {
-      if (ref_info == frames_.end())
-        ref_info = frames_.insert(std::make_pair(ref_key, FrameInfo())).first;
-
-      if (ref_info->second.continuous)
-        --info->second.num_missing_continuous;
-
-      // Add backwards reference so |frame| can be updated when new
-      // frames are inserted or decoded.
-      ref_info->second.dependent_frames[ref_info->second.num_dependent_frames] =
-          key;
-      RTC_DCHECK_LT(ref_info->second.num_dependent_frames,
-                    (FrameInfo::kMaxNumDependentFrames - 1));
-      // TODO(philipel): Look into why this could happen and handle
-      // appropriately.
-      if (ref_info->second.num_dependent_frames <
-          (FrameInfo::kMaxNumDependentFrames - 1)) {
-        ++ref_info->second.num_dependent_frames;
-      }
-    }
-    RTC_DCHECK_LE(ref_info->second.num_missing_continuous,
-                  ref_info->second.num_missing_decodable);
-  }
-
-  // Check if we have the lower spatial layer frame.
-  if (frame.inter_layer_predicted) {
-    ++info->second.num_missing_continuous;
-    ++info->second.num_missing_decodable;
-
-    FrameKey ref_key(frame.picture_id, frame.spatial_layer - 1);
-    // Gets or create the FrameInfo for the referenced frame.
-    auto ref_info = frames_.insert(std::make_pair(ref_key, FrameInfo())).first;
-    if (ref_info->second.continuous)
-      --info->second.num_missing_continuous;
-
-    if (ref_info == last_decoded_frame_it_) {
-      --info->second.num_missing_decodable;
-    } else {
-      ref_info->second.dependent_frames[ref_info->second.num_dependent_frames] =
-          key;
-      ++ref_info->second.num_dependent_frames;
-    }
-    RTC_DCHECK_LE(ref_info->second.num_missing_continuous,
-                  ref_info->second.num_missing_decodable);
-  }
-
-  RTC_DCHECK_LE(info->second.num_missing_continuous,
-                info->second.num_missing_decodable);
-
-  return true;
-}
-
-void FrameBuffer::UpdateJitterDelay() {
-  TRACE_EVENT0("webrtc", "FrameBuffer::UpdateJitterDelay");
-  if (!stats_callback_)
-    return;
-
-  int decode_ms;
-  int max_decode_ms;
-  int current_delay_ms;
-  int target_delay_ms;
-  int jitter_buffer_ms;
-  int min_playout_delay_ms;
-  int render_delay_ms;
-  if (timing_->GetTimings(&decode_ms, &max_decode_ms, &current_delay_ms,
-                          &target_delay_ms, &jitter_buffer_ms,
-                          &min_playout_delay_ms, &render_delay_ms)) {
-    stats_callback_->OnFrameBufferTimingsUpdated(
-        decode_ms, max_decode_ms, current_delay_ms, target_delay_ms,
-        jitter_buffer_ms, min_playout_delay_ms, render_delay_ms);
-  }
-}
-
-void FrameBuffer::UpdateTimingFrameInfo() {
-  TRACE_EVENT0("webrtc", "FrameBuffer::UpdateTimingFrameInfo");
-  rtc::Optional<TimingFrameInfo> info = timing_->GetTimingFrameInfo();
-  if (info)
-    stats_callback_->OnTimingFrameInfoUpdated(*info);
-}
-
-void FrameBuffer::ClearFramesAndHistory() {
-  TRACE_EVENT0("webrtc", "FrameBuffer::ClearFramesAndHistory");
-  frames_.clear();
-  last_decoded_frame_it_ = frames_.end();
-  last_continuous_frame_it_ = frames_.end();
-  next_frame_it_ = frames_.end();
-  num_frames_history_ = 0;
-  num_frames_buffered_ = 0;
-}
-
-}  // namespace video_coding
-}  // namespace webrtc
diff --git a/modules/video_coding/frame_buffer2.h b/modules/video_coding/frame_buffer2.h
deleted file mode 100644
index 77fe485..0000000
--- a/modules/video_coding/frame_buffer2.h
+++ /dev/null
@@ -1,189 +0,0 @@
-/*
- *  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_VIDEO_CODING_FRAME_BUFFER2_H_
-#define WEBRTC_MODULES_VIDEO_CODING_FRAME_BUFFER2_H_
-
-#include <array>
-#include <map>
-#include <memory>
-#include <utility>
-
-#include "webrtc/modules/video_coding/frame_object.h"
-#include "webrtc/modules/video_coding/include/video_coding_defines.h"
-#include "webrtc/modules/video_coding/inter_frame_delay.h"
-#include "webrtc/modules/video_coding/sequence_number_util.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/event.h"
-#include "webrtc/rtc_base/thread_annotations.h"
-
-namespace webrtc {
-
-class Clock;
-class VCMReceiveStatisticsCallback;
-class VCMJitterEstimator;
-class VCMTiming;
-
-namespace video_coding {
-
-class FrameBuffer {
- public:
-  enum ReturnReason { kFrameFound, kTimeout, kStopped };
-
-  FrameBuffer(Clock* clock,
-              VCMJitterEstimator* jitter_estimator,
-              VCMTiming* timing,
-              VCMReceiveStatisticsCallback* stats_proxy);
-
-  virtual ~FrameBuffer();
-
-  // Insert a frame into the frame buffer. Returns the picture id
-  // of the last continuous frame or -1 if there is no continuous frame.
-  int InsertFrame(std::unique_ptr<FrameObject> frame);
-
-  // Get the next frame for decoding. Will return at latest after
-  // |max_wait_time_ms|.
-  //  - If a frame is available within |max_wait_time_ms| it will return
-  //    kFrameFound and set |frame_out| to the resulting frame.
-  //  - If no frame is available after |max_wait_time_ms| it will return
-  //    kTimeout.
-  //  - If the FrameBuffer is stopped then it will return kStopped.
-  ReturnReason NextFrame(int64_t max_wait_time_ms,
-                         std::unique_ptr<FrameObject>* frame_out,
-                         bool keyframe_required = false);
-
-  // Tells the FrameBuffer which protection mode that is in use. Affects
-  // the frame timing.
-  // TODO(philipel): Remove this when new timing calculations has been
-  //                 implemented.
-  void SetProtectionMode(VCMVideoProtection mode);
-
-  // Start the frame buffer, has no effect if the frame buffer is started.
-  // The frame buffer is started upon construction.
-  void Start();
-
-  // Stop the frame buffer, causing any sleeping thread in NextFrame to
-  // return immediately.
-  void Stop();
-
- private:
-  struct FrameKey {
-    FrameKey() : picture_id(-1), spatial_layer(0) {}
-    FrameKey(int64_t picture_id, uint8_t spatial_layer)
-        : picture_id(picture_id), spatial_layer(spatial_layer) {}
-
-    bool operator<(const FrameKey& rhs) const {
-      if (picture_id == rhs.picture_id)
-        return spatial_layer < rhs.spatial_layer;
-      return picture_id < rhs.picture_id;
-    }
-
-    bool operator<=(const FrameKey& rhs) const { return !(rhs < *this); }
-
-    int64_t picture_id;
-    uint8_t spatial_layer;
-  };
-
-  struct FrameInfo {
-    // The maximum number of frames that can depend on this frame.
-    static constexpr size_t kMaxNumDependentFrames = 8;
-
-    // Which other frames that have direct unfulfilled dependencies
-    // on this frame.
-    // TODO(philipel): Add simple modify/access functions to prevent adding too
-    // many |dependent_frames|.
-    FrameKey dependent_frames[kMaxNumDependentFrames];
-    size_t num_dependent_frames = 0;
-
-    // A frame is continiuous if it has all its referenced/indirectly
-    // referenced frames.
-    //
-    // How many unfulfilled frames this frame have until it becomes continuous.
-    size_t num_missing_continuous = 0;
-
-    // A frame is decodable if all its referenced frames have been decoded.
-    //
-    // How many unfulfilled frames this frame have until it becomes decodable.
-    size_t num_missing_decodable = 0;
-
-    // If this frame is continuous or not.
-    bool continuous = false;
-
-    // The actual FrameObject.
-    std::unique_ptr<FrameObject> frame;
-  };
-
-  using FrameMap = std::map<FrameKey, FrameInfo>;
-
-  // Check that the references of |frame| are valid.
-  bool ValidReferences(const FrameObject& frame) const;
-
-  // Updates the minimal and maximal playout delays
-  // depending on the frame.
-  void UpdatePlayoutDelays(const FrameObject& frame)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_);
-
-  // Update all directly dependent and indirectly dependent frames and mark
-  // them as continuous if all their references has been fulfilled.
-  void PropagateContinuity(FrameMap::iterator start)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_);
-
-  // Marks the frame as decoded and updates all directly dependent frames.
-  void PropagateDecodability(const FrameInfo& info)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_);
-
-  // Advances |last_decoded_frame_it_| to |decoded| and removes old
-  // frame info.
-  void AdvanceLastDecodedFrame(FrameMap::iterator decoded)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_);
-
-  // Update the corresponding FrameInfo of |frame| and all FrameInfos that
-  // |frame| references.
-  // Return false if |frame| will never be decodable, true otherwise.
-  bool UpdateFrameInfoWithIncomingFrame(const FrameObject& frame,
-                                        FrameMap::iterator info)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_);
-
-  void UpdateJitterDelay() RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_);
-
-  void UpdateTimingFrameInfo() RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_);
-
-  void ClearFramesAndHistory() RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_);
-
-  bool HasBadRenderTiming(const FrameObject& frame, int64_t now_ms)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_);
-
-  FrameMap frames_ RTC_GUARDED_BY(crit_);
-
-  rtc::CriticalSection crit_;
-  Clock* const clock_;
-  rtc::Event new_continuous_frame_event_;
-  VCMJitterEstimator* const jitter_estimator_ RTC_GUARDED_BY(crit_);
-  VCMTiming* const timing_ RTC_GUARDED_BY(crit_);
-  VCMInterFrameDelay inter_frame_delay_ RTC_GUARDED_BY(crit_);
-  uint32_t last_decoded_frame_timestamp_ RTC_GUARDED_BY(crit_);
-  FrameMap::iterator last_decoded_frame_it_ RTC_GUARDED_BY(crit_);
-  FrameMap::iterator last_continuous_frame_it_ RTC_GUARDED_BY(crit_);
-  FrameMap::iterator next_frame_it_ RTC_GUARDED_BY(crit_);
-  int num_frames_history_ RTC_GUARDED_BY(crit_);
-  int num_frames_buffered_ RTC_GUARDED_BY(crit_);
-  bool stopped_ RTC_GUARDED_BY(crit_);
-  VCMVideoProtection protection_mode_ RTC_GUARDED_BY(crit_);
-  VCMReceiveStatisticsCallback* const stats_callback_;
-  int64_t last_log_non_decoded_ms_ RTC_GUARDED_BY(crit_);
-
-  RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(FrameBuffer);
-};
-
-}  // namespace video_coding
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_VIDEO_CODING_FRAME_BUFFER2_H_
diff --git a/modules/video_coding/frame_buffer2_unittest.cc b/modules/video_coding/frame_buffer2_unittest.cc
deleted file mode 100644
index 1ae38c6..0000000
--- a/modules/video_coding/frame_buffer2_unittest.cc
+++ /dev/null
@@ -1,563 +0,0 @@
-/*
- *  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/video_coding/frame_buffer2.h"
-
-#include <algorithm>
-#include <cstring>
-#include <limits>
-#include <vector>
-
-#include "webrtc/modules/video_coding/frame_object.h"
-#include "webrtc/modules/video_coding/jitter_estimator.h"
-#include "webrtc/modules/video_coding/sequence_number_util.h"
-#include "webrtc/modules/video_coding/timing.h"
-#include "webrtc/rtc_base/platform_thread.h"
-#include "webrtc/rtc_base/random.h"
-#include "webrtc/system_wrappers/include/clock.h"
-#include "webrtc/test/gmock.h"
-#include "webrtc/test/gtest.h"
-
-using testing::_;
-using testing::Return;
-
-namespace webrtc {
-namespace video_coding {
-
-class VCMTimingFake : public VCMTiming {
- public:
-  explicit VCMTimingFake(Clock* clock) : VCMTiming(clock) {}
-
-  int64_t RenderTimeMs(uint32_t frame_timestamp,
-                       int64_t now_ms) const override {
-    if (last_ms_ == -1) {
-      last_ms_ = now_ms + kDelayMs;
-      last_timestamp_ = frame_timestamp;
-    }
-
-    uint32_t diff = MinDiff(frame_timestamp, last_timestamp_);
-    if (AheadOf(frame_timestamp, last_timestamp_))
-      last_ms_ += diff / 90;
-    else
-      last_ms_ -= diff / 90;
-
-    last_timestamp_ = frame_timestamp;
-    return last_ms_;
-  }
-
-  uint32_t MaxWaitingTime(int64_t render_time_ms,
-                          int64_t now_ms) const override {
-    return std::max<int>(0, render_time_ms - now_ms - kDecodeTime);
-  }
-
-  bool GetTimings(int* decode_ms,
-                  int* max_decode_ms,
-                  int* current_delay_ms,
-                  int* target_delay_ms,
-                  int* jitter_buffer_ms,
-                  int* min_playout_delay_ms,
-                  int* render_delay_ms) const override {
-    return true;
-  }
-
- private:
-  static constexpr int kDelayMs = 50;
-  static constexpr int kDecodeTime = kDelayMs / 2;
-  mutable uint32_t last_timestamp_ = 0;
-  mutable int64_t last_ms_ = -1;
-};
-
-class VCMJitterEstimatorMock : public VCMJitterEstimator {
- public:
-  explicit VCMJitterEstimatorMock(Clock* clock) : VCMJitterEstimator(clock) {}
-
-  MOCK_METHOD1(UpdateRtt, void(int64_t rttMs));
-  MOCK_METHOD3(UpdateEstimate,
-               void(int64_t frameDelayMs,
-                    uint32_t frameSizeBytes,
-                    bool incompleteFrame));
-  MOCK_METHOD1(GetJitterEstimate, int(double rttMultiplier));
-};
-
-class FrameObjectFake : public FrameObject {
- public:
-  bool GetBitstream(uint8_t* destination) const override { return true; }
-
-  uint32_t Timestamp() const override { return timestamp; }
-
-  int64_t ReceivedTime() const override { return 0; }
-
-  int64_t RenderTime() const override { return _renderTimeMs; }
-
-  // In EncodedImage |_length| is used to descibe its size and |_size| to
-  // describe its capacity.
-  void SetSize(int size) { _length = size; }
-};
-
-class VCMReceiveStatisticsCallbackMock : public VCMReceiveStatisticsCallback {
- public:
-  MOCK_METHOD2(OnReceiveRatesUpdated,
-               void(uint32_t bitRate, uint32_t frameRate));
-  MOCK_METHOD3(OnCompleteFrame,
-               void(bool is_keyframe,
-                    size_t size_bytes,
-                    VideoContentType content_type));
-  MOCK_METHOD1(OnDiscardedPacketsUpdated, void(int discarded_packets));
-  MOCK_METHOD1(OnFrameCountsUpdated, void(const FrameCounts& frame_counts));
-  MOCK_METHOD7(OnFrameBufferTimingsUpdated,
-               void(int decode_ms,
-                    int max_decode_ms,
-                    int current_delay_ms,
-                    int target_delay_ms,
-                    int jitter_buffer_ms,
-                    int min_playout_delay_ms,
-                    int render_delay_ms));
-  MOCK_METHOD1(OnTimingFrameInfoUpdated, void(const TimingFrameInfo& info));
-};
-
-class TestFrameBuffer2 : public ::testing::Test {
- protected:
-  static constexpr int kMaxReferences = 5;
-  static constexpr int kFps1 = 1000;
-  static constexpr int kFps10 = kFps1 / 10;
-  static constexpr int kFps20 = kFps1 / 20;
-
-  TestFrameBuffer2()
-      : clock_(0),
-        timing_(&clock_),
-        jitter_estimator_(&clock_),
-        buffer_(&clock_, &jitter_estimator_, &timing_, &stats_callback_),
-        rand_(0x34678213),
-        tear_down_(false),
-        extract_thread_(&ExtractLoop, this, "Extract Thread"),
-        trigger_extract_event_(false, false),
-        crit_acquired_event_(false, false) {}
-
-  void SetUp() override { extract_thread_.Start(); }
-
-  void TearDown() override {
-    tear_down_ = true;
-    trigger_extract_event_.Set();
-    extract_thread_.Stop();
-  }
-
-  template <typename... T>
-  int InsertFrame(uint16_t picture_id,
-                  uint8_t spatial_layer,
-                  int64_t ts_ms,
-                  bool inter_layer_predicted,
-                  T... refs) {
-    static_assert(sizeof...(refs) <= kMaxReferences,
-                  "To many references specified for FrameObject.");
-    std::array<uint16_t, sizeof...(refs)> references = {
-        {rtc::checked_cast<uint16_t>(refs)...}};
-
-    std::unique_ptr<FrameObjectFake> frame(new FrameObjectFake());
-    frame->picture_id = picture_id;
-    frame->spatial_layer = spatial_layer;
-    frame->timestamp = ts_ms * 90;
-    frame->num_references = references.size();
-    frame->inter_layer_predicted = inter_layer_predicted;
-    for (size_t r = 0; r < references.size(); ++r)
-      frame->references[r] = references[r];
-
-    return buffer_.InsertFrame(std::move(frame));
-  }
-
-  void ExtractFrame(int64_t max_wait_time = 0, bool keyframe_required = false) {
-    crit_.Enter();
-    if (max_wait_time == 0) {
-      std::unique_ptr<FrameObject> frame;
-      FrameBuffer::ReturnReason res =
-          buffer_.NextFrame(0, &frame, keyframe_required);
-      if (res != FrameBuffer::ReturnReason::kStopped)
-        frames_.emplace_back(std::move(frame));
-      crit_.Leave();
-    } else {
-      max_wait_time_ = max_wait_time;
-      trigger_extract_event_.Set();
-      crit_.Leave();
-      // Make sure |crit_| is aquired by |extract_thread_| before returning.
-      crit_acquired_event_.Wait(rtc::Event::kForever);
-    }
-  }
-
-  void CheckFrame(size_t index, int picture_id, int spatial_layer) {
-    rtc::CritScope lock(&crit_);
-    ASSERT_LT(index, frames_.size());
-    ASSERT_TRUE(frames_[index]);
-    ASSERT_EQ(picture_id, frames_[index]->picture_id);
-    ASSERT_EQ(spatial_layer, frames_[index]->spatial_layer);
-  }
-
-  void CheckNoFrame(size_t index) {
-    rtc::CritScope lock(&crit_);
-    ASSERT_LT(index, frames_.size());
-    ASSERT_FALSE(frames_[index]);
-  }
-
-  static void ExtractLoop(void* obj) {
-    TestFrameBuffer2* tfb = static_cast<TestFrameBuffer2*>(obj);
-    while (true) {
-      tfb->trigger_extract_event_.Wait(rtc::Event::kForever);
-      {
-        rtc::CritScope lock(&tfb->crit_);
-        tfb->crit_acquired_event_.Set();
-        if (tfb->tear_down_)
-          return;
-
-        std::unique_ptr<FrameObject> frame;
-        FrameBuffer::ReturnReason res =
-            tfb->buffer_.NextFrame(tfb->max_wait_time_, &frame);
-        if (res != FrameBuffer::ReturnReason::kStopped)
-          tfb->frames_.emplace_back(std::move(frame));
-      }
-    }
-  }
-
-  uint32_t Rand() { return rand_.Rand<uint32_t>(); }
-
-  SimulatedClock clock_;
-  VCMTimingFake timing_;
-  ::testing::NiceMock<VCMJitterEstimatorMock> jitter_estimator_;
-  FrameBuffer buffer_;
-  std::vector<std::unique_ptr<FrameObject>> frames_;
-  Random rand_;
-  ::testing::NiceMock<VCMReceiveStatisticsCallbackMock> stats_callback_;
-
-  int64_t max_wait_time_;
-  bool tear_down_;
-  rtc::PlatformThread extract_thread_;
-  rtc::Event trigger_extract_event_;
-  rtc::Event crit_acquired_event_;
-  rtc::CriticalSection crit_;
-};
-
-// Following tests are timing dependent. Either the timeouts have to
-// be increased by a large margin, which would slow down all trybots,
-// or we disable them for the very slow ones, like we do here.
-#if !defined(ADDRESS_SANITIZER) && !defined(MEMORY_SANITIZER)
-TEST_F(TestFrameBuffer2, WaitForFrame) {
-  uint16_t pid = Rand();
-  uint32_t ts = Rand();
-
-  ExtractFrame(50);
-  InsertFrame(pid, 0, ts, false);
-  CheckFrame(0, pid, 0);
-}
-
-TEST_F(TestFrameBuffer2, OneSuperFrame) {
-  uint16_t pid = Rand();
-  uint32_t ts = Rand();
-
-  InsertFrame(pid, 0, ts, false);
-  ExtractFrame();
-  InsertFrame(pid, 1, ts, true);
-  ExtractFrame();
-
-  CheckFrame(0, pid, 0);
-  CheckFrame(1, pid, 1);
-}
-
-TEST_F(TestFrameBuffer2, SetPlayoutDelay) {
-  const PlayoutDelay kPlayoutDelayMs = {123, 321};
-  std::unique_ptr<FrameObjectFake> test_frame(new FrameObjectFake());
-  test_frame->SetPlayoutDelay(kPlayoutDelayMs);
-  buffer_.InsertFrame(std::move(test_frame));
-  EXPECT_EQ(kPlayoutDelayMs.min_ms, timing_.min_playout_delay());
-  EXPECT_EQ(kPlayoutDelayMs.max_ms, timing_.max_playout_delay());
-}
-
-// Flaky test, see bugs.webrtc.org/7068.
-TEST_F(TestFrameBuffer2, DISABLED_OneUnorderedSuperFrame) {
-  uint16_t pid = Rand();
-  uint32_t ts = Rand();
-
-  ExtractFrame(50);
-  InsertFrame(pid, 1, ts, true);
-  InsertFrame(pid, 0, ts, false);
-  ExtractFrame();
-
-  CheckFrame(0, pid, 0);
-  CheckFrame(1, pid, 1);
-}
-
-TEST_F(TestFrameBuffer2, DISABLED_OneLayerStreamReordered) {
-  uint16_t pid = Rand();
-  uint32_t ts = Rand();
-
-  InsertFrame(pid, 0, ts, false);
-  ExtractFrame();
-  CheckFrame(0, pid, 0);
-  for (int i = 1; i < 10; i += 2) {
-    ExtractFrame(50);
-    InsertFrame(pid + i + 1, 0, ts + (i + 1) * kFps10, false, pid + i);
-    clock_.AdvanceTimeMilliseconds(kFps10);
-    InsertFrame(pid + i, 0, ts + i * kFps10, false, pid + i - 1);
-    clock_.AdvanceTimeMilliseconds(kFps10);
-    ExtractFrame();
-    CheckFrame(i, pid + i, 0);
-    CheckFrame(i + 1, pid + i + 1, 0);
-  }
-}
-#endif  // Timing dependent tests.
-
-TEST_F(TestFrameBuffer2, ExtractFromEmptyBuffer) {
-  ExtractFrame();
-  CheckNoFrame(0);
-}
-
-TEST_F(TestFrameBuffer2, MissingFrame) {
-  uint16_t pid = Rand();
-  uint32_t ts = Rand();
-
-  InsertFrame(pid, 0, ts, false);
-  InsertFrame(pid + 2, 0, ts, false, pid);
-  InsertFrame(pid + 3, 0, ts, false, pid + 1, pid + 2);
-  ExtractFrame();
-  ExtractFrame();
-  ExtractFrame();
-
-  CheckFrame(0, pid, 0);
-  CheckFrame(1, pid + 2, 0);
-  CheckNoFrame(2);
-}
-
-TEST_F(TestFrameBuffer2, OneLayerStream) {
-  uint16_t pid = Rand();
-  uint32_t ts = Rand();
-
-  InsertFrame(pid, 0, ts, false);
-  ExtractFrame();
-  CheckFrame(0, pid, 0);
-  for (int i = 1; i < 10; ++i) {
-    InsertFrame(pid + i, 0, ts + i * kFps10, false, pid + i - 1);
-    ExtractFrame();
-    clock_.AdvanceTimeMilliseconds(kFps10);
-    CheckFrame(i, pid + i, 0);
-  }
-}
-
-TEST_F(TestFrameBuffer2, DropTemporalLayerSlowDecoder) {
-  uint16_t pid = Rand();
-  uint32_t ts = Rand();
-
-  InsertFrame(pid, 0, ts, false);
-  InsertFrame(pid + 1, 0, ts + kFps20, false, pid);
-  for (int i = 2; i < 10; i += 2) {
-    uint32_t ts_tl0 = ts + i / 2 * kFps10;
-    InsertFrame(pid + i, 0, ts_tl0, false, pid + i - 2);
-    InsertFrame(pid + i + 1, 0, ts_tl0 + kFps20, false, pid + i, pid + i - 1);
-  }
-
-  for (int i = 0; i < 10; ++i) {
-    ExtractFrame();
-    clock_.AdvanceTimeMilliseconds(60);
-  }
-
-  CheckFrame(0, pid, 0);
-  CheckFrame(1, pid + 1, 0);
-  CheckFrame(2, pid + 2, 0);
-  CheckFrame(3, pid + 4, 0);
-  CheckFrame(4, pid + 6, 0);
-  CheckFrame(5, pid + 8, 0);
-  CheckNoFrame(6);
-  CheckNoFrame(7);
-  CheckNoFrame(8);
-  CheckNoFrame(9);
-}
-
-TEST_F(TestFrameBuffer2, DropSpatialLayerSlowDecoder) {
-  uint16_t pid = Rand();
-  uint32_t ts = Rand();
-
-  InsertFrame(pid, 0, ts, false);
-  InsertFrame(pid, 1, ts, false);
-  for (int i = 1; i < 6; ++i) {
-    uint32_t ts_tl0 = ts + i * kFps10;
-    InsertFrame(pid + i, 0, ts_tl0, false, pid + i - 1);
-    InsertFrame(pid + i, 1, ts_tl0, false, pid + i - 1);
-  }
-
-  ExtractFrame();
-  ExtractFrame();
-  clock_.AdvanceTimeMilliseconds(55);
-  for (int i = 2; i < 12; ++i) {
-    ExtractFrame();
-    clock_.AdvanceTimeMilliseconds(55);
-  }
-
-  CheckFrame(0, pid, 0);
-  CheckFrame(1, pid, 1);
-  CheckFrame(2, pid + 1, 0);
-  CheckFrame(3, pid + 1, 1);
-  CheckFrame(4, pid + 2, 0);
-  CheckFrame(5, pid + 2, 1);
-  CheckFrame(6, pid + 3, 0);
-  CheckFrame(7, pid + 4, 0);
-  CheckFrame(8, pid + 5, 0);
-  CheckNoFrame(9);
-  CheckNoFrame(10);
-  CheckNoFrame(11);
-}
-
-TEST_F(TestFrameBuffer2, InsertLateFrame) {
-  uint16_t pid = Rand();
-  uint32_t ts = Rand();
-
-  InsertFrame(pid, 0, ts, false);
-  ExtractFrame();
-  InsertFrame(pid + 2, 0, ts, false);
-  ExtractFrame();
-  InsertFrame(pid + 1, 0, ts, false, pid);
-  ExtractFrame();
-
-  CheckFrame(0, pid, 0);
-  CheckFrame(1, pid + 2, 0);
-  CheckNoFrame(2);
-}
-
-TEST_F(TestFrameBuffer2, ProtectionMode) {
-  uint16_t pid = Rand();
-  uint32_t ts = Rand();
-
-  EXPECT_CALL(jitter_estimator_, GetJitterEstimate(1.0));
-  InsertFrame(pid, 0, ts, false);
-  ExtractFrame();
-
-  buffer_.SetProtectionMode(kProtectionNackFEC);
-  EXPECT_CALL(jitter_estimator_, GetJitterEstimate(0.0));
-  InsertFrame(pid + 1, 0, ts, false);
-  ExtractFrame();
-}
-
-TEST_F(TestFrameBuffer2, NoContinuousFrame) {
-  uint16_t pid = Rand();
-  uint32_t ts = Rand();
-
-  EXPECT_EQ(-1, InsertFrame(pid + 1, 0, ts, false, pid));
-}
-
-TEST_F(TestFrameBuffer2, LastContinuousFrameSingleLayer) {
-  uint16_t pid = Rand();
-  uint32_t ts = Rand();
-
-  EXPECT_EQ(pid, InsertFrame(pid, 0, ts, false));
-  EXPECT_EQ(pid, InsertFrame(pid + 2, 0, ts, false, pid + 1));
-  EXPECT_EQ(pid + 2, InsertFrame(pid + 1, 0, ts, false, pid));
-  EXPECT_EQ(pid + 2, InsertFrame(pid + 4, 0, ts, false, pid + 3));
-  EXPECT_EQ(pid + 5, InsertFrame(pid + 5, 0, ts, false));
-}
-
-TEST_F(TestFrameBuffer2, LastContinuousFrameTwoLayers) {
-  uint16_t pid = Rand();
-  uint32_t ts = Rand();
-
-  EXPECT_EQ(pid, InsertFrame(pid, 0, ts, false));
-  EXPECT_EQ(pid, InsertFrame(pid, 1, ts, true));
-  EXPECT_EQ(pid, InsertFrame(pid + 1, 1, ts, true, pid));
-  EXPECT_EQ(pid, InsertFrame(pid + 2, 0, ts, false, pid + 1));
-  EXPECT_EQ(pid, InsertFrame(pid + 2, 1, ts, true, pid + 1));
-  EXPECT_EQ(pid, InsertFrame(pid + 3, 0, ts, false, pid + 2));
-  EXPECT_EQ(pid + 3, InsertFrame(pid + 1, 0, ts, false, pid));
-  EXPECT_EQ(pid + 3, InsertFrame(pid + 3, 1, ts, true, pid + 2));
-}
-
-TEST_F(TestFrameBuffer2, PictureIdJumpBack) {
-  uint16_t pid = Rand();
-  uint32_t ts = Rand();
-
-  EXPECT_EQ(pid, InsertFrame(pid, 0, ts, false));
-  EXPECT_EQ(pid + 1, InsertFrame(pid + 1, 0, ts + 1, false, pid));
-  ExtractFrame();
-  CheckFrame(0, pid, 0);
-
-  // Jump back in pid but increase ts.
-  EXPECT_EQ(pid - 1, InsertFrame(pid - 1, 0, ts + 2, false));
-  ExtractFrame();
-  ExtractFrame();
-  CheckFrame(1, pid - 1, 0);
-  CheckNoFrame(2);
-}
-
-TEST_F(TestFrameBuffer2, StatsCallback) {
-  uint16_t pid = Rand();
-  uint32_t ts = Rand();
-  const int kFrameSize = 5000;
-
-  EXPECT_CALL(stats_callback_,
-              OnCompleteFrame(true, kFrameSize, VideoContentType::UNSPECIFIED));
-  EXPECT_CALL(stats_callback_,
-              OnFrameBufferTimingsUpdated(_, _, _, _, _, _, _));
-
-  {
-    std::unique_ptr<FrameObjectFake> frame(new FrameObjectFake());
-    frame->SetSize(kFrameSize);
-    frame->picture_id = pid;
-    frame->spatial_layer = 0;
-    frame->timestamp = ts;
-    frame->num_references = 0;
-    frame->inter_layer_predicted = false;
-
-    EXPECT_EQ(buffer_.InsertFrame(std::move(frame)), pid);
-  }
-
-  ExtractFrame();
-  CheckFrame(0, pid, 0);
-}
-
-TEST_F(TestFrameBuffer2, ForwardJumps) {
-  EXPECT_EQ(5453, InsertFrame(5453, 0, 1, false));
-  ExtractFrame();
-  EXPECT_EQ(5454, InsertFrame(5454, 0, 1, false, 5453));
-  ExtractFrame();
-  EXPECT_EQ(15670, InsertFrame(15670, 0, 1, false));
-  ExtractFrame();
-  EXPECT_EQ(29804, InsertFrame(29804, 0, 1, false));
-  ExtractFrame();
-  EXPECT_EQ(29805, InsertFrame(29805, 0, 1, false, 29804));
-  ExtractFrame();
-  EXPECT_EQ(29806, InsertFrame(29806, 0, 1, false, 29805));
-  ExtractFrame();
-  EXPECT_EQ(33819, InsertFrame(33819, 0, 1, false));
-  ExtractFrame();
-  EXPECT_EQ(41248, InsertFrame(41248, 0, 1, false));
-  ExtractFrame();
-}
-
-TEST_F(TestFrameBuffer2, DuplicateFrames) {
-  EXPECT_EQ(22256, InsertFrame(22256, 0, 1, false));
-  ExtractFrame();
-  EXPECT_EQ(22256, InsertFrame(22256, 0, 1, false));
-}
-
-// TODO(philipel): implement more unittests related to invalid references.
-TEST_F(TestFrameBuffer2, InvalidReferences) {
-  EXPECT_EQ(-1, InsertFrame(0, 0, 1000, false, 2));
-  EXPECT_EQ(1, InsertFrame(1, 0, 2000, false));
-  ExtractFrame();
-  EXPECT_EQ(2, InsertFrame(2, 0, 3000, false, 1));
-}
-
-TEST_F(TestFrameBuffer2, KeyframeRequired) {
-  EXPECT_EQ(1, InsertFrame(1, 0, 1000, false));
-  EXPECT_EQ(2, InsertFrame(2, 0, 2000, false, 1));
-  EXPECT_EQ(3, InsertFrame(3, 0, 3000, false));
-  ExtractFrame();
-  ExtractFrame(0, true);
-  ExtractFrame();
-
-  CheckFrame(0, 1, 0);
-  CheckFrame(1, 3, 0);
-  CheckNoFrame(2);
-}
-
-}  // namespace video_coding
-}  // namespace webrtc
diff --git a/modules/video_coding/frame_object.cc b/modules/video_coding/frame_object.cc
deleted file mode 100644
index 86bcffb..0000000
--- a/modules/video_coding/frame_object.cc
+++ /dev/null
@@ -1,199 +0,0 @@
-/*
- *  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/video_coding/frame_object.h"
-#include "webrtc/common_video/h264/h264_common.h"
-#include "webrtc/modules/video_coding/packet_buffer.h"
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-namespace video_coding {
-
-FrameObject::FrameObject()
-    : picture_id(0),
-      spatial_layer(0),
-      timestamp(0),
-      num_references(0),
-      inter_layer_predicted(false) {}
-
-RtpFrameObject::RtpFrameObject(PacketBuffer* packet_buffer,
-                               uint16_t first_seq_num,
-                               uint16_t last_seq_num,
-                               size_t frame_size,
-                               int times_nacked,
-                               int64_t received_time)
-    : packet_buffer_(packet_buffer),
-      first_seq_num_(first_seq_num),
-      last_seq_num_(last_seq_num),
-      timestamp_(0),
-      received_time_(received_time),
-      times_nacked_(times_nacked) {
-  VCMPacket* first_packet = packet_buffer_->GetPacket(first_seq_num);
-  RTC_CHECK(first_packet);
-
-  // RtpFrameObject members
-  frame_type_ = first_packet->frameType;
-  codec_type_ = first_packet->codec;
-
-  // TODO(philipel): Remove when encoded image is replaced by FrameObject.
-  // VCMEncodedFrame members
-  CopyCodecSpecific(&first_packet->video_header);
-  _completeFrame = true;
-  _payloadType = first_packet->payloadType;
-  _timeStamp = first_packet->timestamp;
-  ntp_time_ms_ = first_packet->ntp_time_ms_;
-
-  // Setting frame's playout delays to the same values
-  // as of the first packet's.
-  SetPlayoutDelay(first_packet->video_header.playout_delay);
-
-  // Since FFmpeg use an optimized bitstream reader that reads in chunks of
-  // 32/64 bits we have to add at least that much padding to the buffer
-  // to make sure the decoder doesn't read out of bounds.
-  // NOTE! EncodedImage::_size is the size of the buffer (think capacity of
-  //       an std::vector) and EncodedImage::_length is the actual size of
-  //       the bitstream (think size of an std::vector).
-  if (codec_type_ == kVideoCodecH264)
-    _size = frame_size + EncodedImage::kBufferPaddingBytesH264;
-  else
-    _size = frame_size;
-
-  _buffer = new uint8_t[_size];
-  _length = frame_size;
-
-  // For H264 frames we can't determine the frame type by just looking at the
-  // first packet. Instead we consider the frame to be a keyframe if it
-  // contains an IDR NALU.
-  if (codec_type_ == kVideoCodecH264) {
-    _frameType = kVideoFrameDelta;
-    frame_type_ = kVideoFrameDelta;
-    for (uint16_t seq_num = first_seq_num;
-         seq_num != static_cast<uint16_t>(last_seq_num + 1) &&
-         _frameType == kVideoFrameDelta;
-         ++seq_num) {
-      VCMPacket* packet = packet_buffer_->GetPacket(seq_num);
-      RTC_CHECK(packet);
-      const RTPVideoHeaderH264& header = packet->video_header.codecHeader.H264;
-      for (size_t i = 0; i < header.nalus_length; ++i) {
-        if (header.nalus[i].type == H264::NaluType::kIdr) {
-          _frameType = kVideoFrameKey;
-          frame_type_ = kVideoFrameKey;
-          break;
-        }
-      }
-    }
-  } else {
-    _frameType = first_packet->frameType;
-    frame_type_ = first_packet->frameType;
-  }
-
-  bool bitstream_copied = GetBitstream(_buffer);
-  RTC_DCHECK(bitstream_copied);
-  _encodedWidth = first_packet->width;
-  _encodedHeight = first_packet->height;
-
-  // FrameObject members
-  timestamp = first_packet->timestamp;
-
-  VCMPacket* last_packet = packet_buffer_->GetPacket(last_seq_num);
-  RTC_CHECK(last_packet);
-  RTC_CHECK(last_packet->markerBit);
-  // http://www.etsi.org/deliver/etsi_ts/126100_126199/126114/12.07.00_60/
-  // ts_126114v120700p.pdf Section 7.4.5.
-  // The MTSI client shall add the payload bytes as defined in this clause
-  // onto the last RTP packet in each group of packets which make up a key
-  // frame (I-frame or IDR frame in H.264 (AVC), or an IRAP picture in H.265
-  // (HEVC)).
-  rotation_ = last_packet->video_header.rotation;
-  _rotation_set = true;
-  content_type_ = last_packet->video_header.content_type;
-  if (last_packet->video_header.video_timing.flags !=
-      TimingFrameFlags::kInvalid) {
-    // ntp_time_ms_ may be -1 if not estimated yet. This is not a problem,
-    // as this will be dealt with at the time of reporting.
-    timing_.encode_start_ms =
-        ntp_time_ms_ +
-        last_packet->video_header.video_timing.encode_start_delta_ms;
-    timing_.encode_finish_ms =
-        ntp_time_ms_ +
-        last_packet->video_header.video_timing.encode_finish_delta_ms;
-    timing_.packetization_finish_ms =
-        ntp_time_ms_ +
-        last_packet->video_header.video_timing.packetization_finish_delta_ms;
-    timing_.pacer_exit_ms =
-        ntp_time_ms_ +
-        last_packet->video_header.video_timing.pacer_exit_delta_ms;
-    timing_.network_timestamp_ms =
-        ntp_time_ms_ +
-        last_packet->video_header.video_timing.network_timstamp_delta_ms;
-    timing_.network2_timestamp_ms =
-        ntp_time_ms_ +
-        last_packet->video_header.video_timing.network2_timstamp_delta_ms;
-
-    timing_.receive_start_ms = first_packet->receive_time_ms;
-    timing_.receive_finish_ms = last_packet->receive_time_ms;
-  }
-  timing_.flags = last_packet->video_header.video_timing.flags;
-}
-
-RtpFrameObject::~RtpFrameObject() {
-  packet_buffer_->ReturnFrame(this);
-}
-
-uint16_t RtpFrameObject::first_seq_num() const {
-  return first_seq_num_;
-}
-
-uint16_t RtpFrameObject::last_seq_num() const {
-  return last_seq_num_;
-}
-
-int RtpFrameObject::times_nacked() const {
-  return times_nacked_;
-}
-
-FrameType RtpFrameObject::frame_type() const {
-  return frame_type_;
-}
-
-VideoCodecType RtpFrameObject::codec_type() const {
-  return codec_type_;
-}
-
-bool RtpFrameObject::GetBitstream(uint8_t* destination) const {
-  return packet_buffer_->GetBitstream(*this, destination);
-}
-
-uint32_t RtpFrameObject::Timestamp() const {
-  return timestamp_;
-}
-
-int64_t RtpFrameObject::ReceivedTime() const {
-  return received_time_;
-}
-
-int64_t RtpFrameObject::RenderTime() const {
-  return _renderTimeMs;
-}
-
-bool RtpFrameObject::delayed_by_retransmission() const {
-  return times_nacked() > 0;
-}
-
-rtc::Optional<RTPVideoTypeHeader> RtpFrameObject::GetCodecHeader() const {
-  rtc::CritScope lock(&packet_buffer_->crit_);
-  VCMPacket* packet = packet_buffer_->GetPacket(first_seq_num_);
-  if (!packet)
-    return rtc::Optional<RTPVideoTypeHeader>();
-  return rtc::Optional<RTPVideoTypeHeader>(packet->video_header.codecHeader);
-}
-
-}  // namespace video_coding
-}  // namespace webrtc
diff --git a/modules/video_coding/frame_object.h b/modules/video_coding/frame_object.h
deleted file mode 100644
index 69ab6f0..0000000
--- a/modules/video_coding/frame_object.h
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- *  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_VIDEO_CODING_FRAME_OBJECT_H_
-#define WEBRTC_MODULES_VIDEO_CODING_FRAME_OBJECT_H_
-
-#include "webrtc/api/optional.h"
-#include "webrtc/common_types.h"
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/modules/video_coding/encoded_frame.h"
-
-namespace webrtc {
-namespace video_coding {
-
-class FrameObject : public webrtc::VCMEncodedFrame {
- public:
-  static const uint8_t kMaxFrameReferences = 5;
-
-  FrameObject();
-  virtual ~FrameObject() {}
-
-  virtual bool GetBitstream(uint8_t* destination) const = 0;
-
-  // The capture timestamp of this frame.
-  virtual uint32_t Timestamp() const = 0;
-
-  // When this frame was received.
-  virtual int64_t ReceivedTime() const = 0;
-
-  // When this frame should be rendered.
-  virtual int64_t RenderTime() const = 0;
-
-  // This information is currently needed by the timing calculation class.
-  // TODO(philipel): Remove this function when a new timing class has
-  //                 been implemented.
-  virtual bool delayed_by_retransmission() const { return 0; }
-
-  size_t size() const { return _length; }
-
-  bool is_keyframe() const { return num_references == 0; }
-
-  // The tuple (|picture_id|, |spatial_layer|) uniquely identifies a frame
-  // object. For codec types that don't necessarily have picture ids they
-  // have to be constructed from the header data relevant to that codec.
-  int64_t picture_id;
-  uint8_t spatial_layer;
-  uint32_t timestamp;
-
-  // TODO(philipel): Add simple modify/access functions to prevent adding too
-  // many |references|.
-  size_t num_references;
-  int64_t references[kMaxFrameReferences];
-  bool inter_layer_predicted;
-};
-
-class PacketBuffer;
-
-class RtpFrameObject : public FrameObject {
- public:
-  RtpFrameObject(PacketBuffer* packet_buffer,
-                 uint16_t first_seq_num,
-                 uint16_t last_seq_num,
-                 size_t frame_size,
-                 int times_nacked,
-                 int64_t received_time);
-
-  ~RtpFrameObject();
-  uint16_t first_seq_num() const;
-  uint16_t last_seq_num() const;
-  int times_nacked() const;
-  enum FrameType frame_type() const;
-  VideoCodecType codec_type() const;
-  bool GetBitstream(uint8_t* destination) const override;
-  uint32_t Timestamp() const override;
-  int64_t ReceivedTime() const override;
-  int64_t RenderTime() const override;
-  bool delayed_by_retransmission() const override;
-  rtc::Optional<RTPVideoTypeHeader> GetCodecHeader() const;
-
- private:
-  rtc::scoped_refptr<PacketBuffer> packet_buffer_;
-  enum FrameType frame_type_;
-  VideoCodecType codec_type_;
-  uint16_t first_seq_num_;
-  uint16_t last_seq_num_;
-  uint32_t timestamp_;
-  int64_t received_time_;
-
-  // Equal to times nacked of the packet with the highet times nacked
-  // belonging to this frame.
-  int times_nacked_;
-};
-
-}  // namespace video_coding
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_VIDEO_CODING_FRAME_OBJECT_H_
diff --git a/modules/video_coding/generic_decoder.cc b/modules/video_coding/generic_decoder.cc
deleted file mode 100644
index 3b2a620..0000000
--- a/modules/video_coding/generic_decoder.cc
+++ /dev/null
@@ -1,259 +0,0 @@
-/*
- *  Copyright (c) 2012 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/video_coding/generic_decoder.h"
-
-#include <algorithm>
-
-#include "webrtc/modules/video_coding/include/video_coding.h"
-#include "webrtc/modules/video_coding/internal_defines.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/timeutils.h"
-#include "webrtc/rtc_base/trace_event.h"
-#include "webrtc/system_wrappers/include/clock.h"
-
-namespace webrtc {
-
-VCMDecodedFrameCallback::VCMDecodedFrameCallback(VCMTiming* timing,
-                                                 Clock* clock)
-    : _clock(clock),
-      _timing(timing),
-      _timestampMap(kDecoderFrameMemoryLength),
-      _lastReceivedPictureID(0) {
-  ntp_offset_ =
-      _clock->CurrentNtpInMilliseconds() - _clock->TimeInMilliseconds();
-}
-
-VCMDecodedFrameCallback::~VCMDecodedFrameCallback() {
-}
-
-void VCMDecodedFrameCallback::SetUserReceiveCallback(
-    VCMReceiveCallback* receiveCallback) {
-  RTC_DCHECK(construction_thread_.CalledOnValidThread());
-  RTC_DCHECK((!_receiveCallback && receiveCallback) ||
-             (_receiveCallback && !receiveCallback));
-  _receiveCallback = receiveCallback;
-}
-
-VCMReceiveCallback* VCMDecodedFrameCallback::UserReceiveCallback() {
-  // Called on the decode thread via VCMCodecDataBase::GetDecoder.
-  // The callback must always have been set before this happens.
-  RTC_DCHECK(_receiveCallback);
-  return _receiveCallback;
-}
-
-int32_t VCMDecodedFrameCallback::Decoded(VideoFrame& decodedImage) {
-  return Decoded(decodedImage, -1);
-}
-
-int32_t VCMDecodedFrameCallback::Decoded(VideoFrame& decodedImage,
-                                         int64_t decode_time_ms) {
-  Decoded(decodedImage,
-          decode_time_ms >= 0 ? rtc::Optional<int32_t>(decode_time_ms)
-                              : rtc::Optional<int32_t>(),
-          rtc::Optional<uint8_t>());
-  return WEBRTC_VIDEO_CODEC_OK;
-}
-
-void VCMDecodedFrameCallback::Decoded(VideoFrame& decodedImage,
-                                      rtc::Optional<int32_t> decode_time_ms,
-                                      rtc::Optional<uint8_t> qp) {
-  RTC_DCHECK(_receiveCallback) << "Callback must not be null at this point";
-  TRACE_EVENT_INSTANT1("webrtc", "VCMDecodedFrameCallback::Decoded",
-                       "timestamp", decodedImage.timestamp());
-  // TODO(holmer): We should improve this so that we can handle multiple
-  // callbacks from one call to Decode().
-  VCMFrameInformation* frameInfo;
-  {
-    rtc::CritScope cs(&lock_);
-    frameInfo = _timestampMap.Pop(decodedImage.timestamp());
-  }
-
-  if (frameInfo == NULL) {
-    LOG(LS_WARNING) << "Too many frames backed up in the decoder, dropping "
-                       "this one.";
-    return;
-  }
-
-  const int64_t now_ms = _clock->TimeInMilliseconds();
-  if (!decode_time_ms) {
-    decode_time_ms =
-        rtc::Optional<int32_t>(now_ms - frameInfo->decodeStartTimeMs);
-  }
-  _timing->StopDecodeTimer(decodedImage.timestamp(), *decode_time_ms, now_ms,
-                           frameInfo->renderTimeMs);
-
-  // Report timing information.
-  if (frameInfo->timing.flags != TimingFrameFlags::kInvalid) {
-    int64_t capture_time_ms = decodedImage.ntp_time_ms() - ntp_offset_;
-    // Convert remote timestamps to local time from ntp timestamps.
-    frameInfo->timing.encode_start_ms -= ntp_offset_;
-    frameInfo->timing.encode_finish_ms -= ntp_offset_;
-    frameInfo->timing.packetization_finish_ms -= ntp_offset_;
-    frameInfo->timing.pacer_exit_ms -= ntp_offset_;
-    frameInfo->timing.network_timestamp_ms -= ntp_offset_;
-    frameInfo->timing.network2_timestamp_ms -= ntp_offset_;
-
-    int64_t sender_delta_ms = 0;
-    if (decodedImage.ntp_time_ms() < 0) {
-      // Sender clock is not estimated yet. Make sure that sender times are all
-      // negative to indicate that. Yet they still should be relatively correct.
-      sender_delta_ms =
-          std::max({capture_time_ms, frameInfo->timing.encode_start_ms,
-                    frameInfo->timing.encode_finish_ms,
-                    frameInfo->timing.packetization_finish_ms,
-                    frameInfo->timing.pacer_exit_ms,
-                    frameInfo->timing.network_timestamp_ms,
-                    frameInfo->timing.network2_timestamp_ms}) +
-          1;
-    }
-
-    TimingFrameInfo timing_frame_info;
-
-    timing_frame_info.capture_time_ms = capture_time_ms - sender_delta_ms;
-    timing_frame_info.encode_start_ms =
-        frameInfo->timing.encode_start_ms - sender_delta_ms;
-    timing_frame_info.encode_finish_ms =
-        frameInfo->timing.encode_finish_ms - sender_delta_ms;
-    timing_frame_info.packetization_finish_ms =
-        frameInfo->timing.packetization_finish_ms - sender_delta_ms;
-    timing_frame_info.pacer_exit_ms =
-        frameInfo->timing.pacer_exit_ms - sender_delta_ms;
-    timing_frame_info.network_timestamp_ms =
-        frameInfo->timing.network_timestamp_ms - sender_delta_ms;
-    timing_frame_info.network2_timestamp_ms =
-        frameInfo->timing.network2_timestamp_ms - sender_delta_ms;
-    timing_frame_info.receive_start_ms = frameInfo->timing.receive_start_ms;
-    timing_frame_info.receive_finish_ms = frameInfo->timing.receive_finish_ms;
-    timing_frame_info.decode_start_ms = frameInfo->decodeStartTimeMs;
-    timing_frame_info.decode_finish_ms = now_ms;
-    timing_frame_info.render_time_ms = frameInfo->renderTimeMs;
-    timing_frame_info.rtp_timestamp = decodedImage.timestamp();
-    timing_frame_info.flags = frameInfo->timing.flags;
-
-    _timing->SetTimingFrameInfo(timing_frame_info);
-  }
-
-  decodedImage.set_timestamp_us(
-      frameInfo->renderTimeMs * rtc::kNumMicrosecsPerMillisec);
-  decodedImage.set_rotation(frameInfo->rotation);
-  _receiveCallback->FrameToRender(decodedImage, qp, frameInfo->content_type);
-}
-
-int32_t VCMDecodedFrameCallback::ReceivedDecodedReferenceFrame(
-    const uint64_t pictureId) {
-  return _receiveCallback->ReceivedDecodedReferenceFrame(pictureId);
-}
-
-int32_t VCMDecodedFrameCallback::ReceivedDecodedFrame(
-    const uint64_t pictureId) {
-  _lastReceivedPictureID = pictureId;
-  return 0;
-}
-
-uint64_t VCMDecodedFrameCallback::LastReceivedPictureID() const {
-  return _lastReceivedPictureID;
-}
-
-void VCMDecodedFrameCallback::OnDecoderImplementationName(
-    const char* implementation_name) {
-  _receiveCallback->OnDecoderImplementationName(implementation_name);
-}
-
-void VCMDecodedFrameCallback::Map(uint32_t timestamp,
-                                  VCMFrameInformation* frameInfo) {
-  rtc::CritScope cs(&lock_);
-  _timestampMap.Add(timestamp, frameInfo);
-}
-
-int32_t VCMDecodedFrameCallback::Pop(uint32_t timestamp) {
-  rtc::CritScope cs(&lock_);
-  if (_timestampMap.Pop(timestamp) == NULL) {
-    return VCM_GENERAL_ERROR;
-  }
-  return VCM_OK;
-}
-
-VCMGenericDecoder::VCMGenericDecoder(VideoDecoder* decoder, bool isExternal)
-    : _callback(NULL),
-      _frameInfos(),
-      _nextFrameInfoIdx(0),
-      decoder_(decoder),
-      _codecType(kVideoCodecUnknown),
-      _isExternal(isExternal),
-      _last_keyframe_content_type(VideoContentType::UNSPECIFIED) {
-  RTC_DCHECK(decoder_);
-}
-
-VCMGenericDecoder::~VCMGenericDecoder() {
-  decoder_->Release();
-  if (_isExternal)
-    decoder_.release();
-  RTC_DCHECK(_isExternal || decoder_);
-}
-
-int32_t VCMGenericDecoder::InitDecode(const VideoCodec* settings,
-                                      int32_t numberOfCores) {
-  TRACE_EVENT0("webrtc", "VCMGenericDecoder::InitDecode");
-  _codecType = settings->codecType;
-
-  return decoder_->InitDecode(settings, numberOfCores);
-}
-
-int32_t VCMGenericDecoder::Decode(const VCMEncodedFrame& frame, int64_t nowMs) {
-    TRACE_EVENT1("webrtc", "VCMGenericDecoder::Decode", "timestamp",
-                 frame.EncodedImage()._timeStamp);
-    _frameInfos[_nextFrameInfoIdx].decodeStartTimeMs = nowMs;
-    _frameInfos[_nextFrameInfoIdx].renderTimeMs = frame.RenderTimeMs();
-    _frameInfos[_nextFrameInfoIdx].rotation = frame.rotation();
-    _frameInfos[_nextFrameInfoIdx].timing = frame.video_timing();
-    // Set correctly only for key frames. Thus, use latest key frame
-    // content type. If the corresponding key frame was lost, decode will fail
-    // and content type will be ignored.
-    if (frame.FrameType() == kVideoFrameKey) {
-      _frameInfos[_nextFrameInfoIdx].content_type = frame.contentType();
-      _last_keyframe_content_type = frame.contentType();
-    } else {
-      _frameInfos[_nextFrameInfoIdx].content_type = _last_keyframe_content_type;
-    }
-    _callback->Map(frame.TimeStamp(), &_frameInfos[_nextFrameInfoIdx]);
-
-    _nextFrameInfoIdx = (_nextFrameInfoIdx + 1) % kDecoderFrameMemoryLength;
-    const RTPFragmentationHeader dummy_header;
-    int32_t ret = decoder_->Decode(frame.EncodedImage(), frame.MissingFrame(),
-                                   &dummy_header,
-                                   frame.CodecSpecific(), frame.RenderTimeMs());
-
-    _callback->OnDecoderImplementationName(decoder_->ImplementationName());
-    if (ret < WEBRTC_VIDEO_CODEC_OK) {
-        LOG(LS_WARNING) << "Failed to decode frame with timestamp "
-                        << frame.TimeStamp() << ", error code: " << ret;
-        _callback->Pop(frame.TimeStamp());
-        return ret;
-    } else if (ret == WEBRTC_VIDEO_CODEC_NO_OUTPUT ||
-               ret == WEBRTC_VIDEO_CODEC_REQUEST_SLI) {
-        // No output
-        _callback->Pop(frame.TimeStamp());
-    }
-    return ret;
-}
-
-int32_t VCMGenericDecoder::RegisterDecodeCompleteCallback(
-    VCMDecodedFrameCallback* callback) {
-  _callback = callback;
-  return decoder_->RegisterDecodeCompleteCallback(callback);
-}
-
-bool VCMGenericDecoder::PrefersLateDecoding() const {
-  return decoder_->PrefersLateDecoding();
-}
-
-}  // namespace webrtc
diff --git a/modules/video_coding/generic_decoder.h b/modules/video_coding/generic_decoder.h
deleted file mode 100644
index c8122da..0000000
--- a/modules/video_coding/generic_decoder.h
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- *  Copyright (c) 2012 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_VIDEO_CODING_GENERIC_DECODER_H_
-#define WEBRTC_MODULES_VIDEO_CODING_GENERIC_DECODER_H_
-
-#include <memory>
-
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/modules/video_coding/encoded_frame.h"
-#include "webrtc/modules/video_coding/include/video_codec_interface.h"
-#include "webrtc/modules/video_coding/timestamp_map.h"
-#include "webrtc/modules/video_coding/timing.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/thread_checker.h"
-
-namespace webrtc {
-
-class VCMReceiveCallback;
-
-enum { kDecoderFrameMemoryLength = 10 };
-
-struct VCMFrameInformation {
-  int64_t renderTimeMs;
-  int64_t decodeStartTimeMs;
-  void* userData;
-  VideoRotation rotation;
-  VideoContentType content_type;
-  EncodedImage::Timing timing;
-};
-
-class VCMDecodedFrameCallback : public DecodedImageCallback {
- public:
-  VCMDecodedFrameCallback(VCMTiming* timing, Clock* clock);
-  ~VCMDecodedFrameCallback() override;
-  void SetUserReceiveCallback(VCMReceiveCallback* receiveCallback);
-  VCMReceiveCallback* UserReceiveCallback();
-
-  int32_t Decoded(VideoFrame& decodedImage) override;
-  int32_t Decoded(VideoFrame& decodedImage, int64_t decode_time_ms) override;
-  void Decoded(VideoFrame& decodedImage,
-               rtc::Optional<int32_t> decode_time_ms,
-               rtc::Optional<uint8_t> qp) override;
-  int32_t ReceivedDecodedReferenceFrame(const uint64_t pictureId) override;
-  int32_t ReceivedDecodedFrame(const uint64_t pictureId) override;
-
-  uint64_t LastReceivedPictureID() const;
-  void OnDecoderImplementationName(const char* implementation_name);
-
-  void Map(uint32_t timestamp, VCMFrameInformation* frameInfo);
-  int32_t Pop(uint32_t timestamp);
-
- private:
-  rtc::ThreadChecker construction_thread_;
-  // Protect |_timestampMap|.
-  Clock* const _clock;
-  // This callback must be set before the decoder thread starts running
-  // and must only be unset when external threads (e.g decoder thread)
-  // have been stopped. Due to that, the variable should regarded as const
-  // while there are more than one threads involved, it must be set
-  // from the same thread, and therfore a lock is not required to access it.
-  VCMReceiveCallback* _receiveCallback = nullptr;
-  VCMTiming* _timing;
-  rtc::CriticalSection lock_;
-  VCMTimestampMap _timestampMap RTC_GUARDED_BY(lock_);
-  uint64_t _lastReceivedPictureID;
-  int64_t ntp_offset_;
-};
-
-class VCMGenericDecoder {
- public:
-  explicit VCMGenericDecoder(VideoDecoder* decoder, bool isExternal = false);
-  ~VCMGenericDecoder();
-
-  /**
-  * Initialize the decoder with the information from the VideoCodec
-  */
-  int32_t InitDecode(const VideoCodec* settings, int32_t numberOfCores);
-
-  /**
-  * Decode to a raw I420 frame,
-  *
-  * inputVideoBuffer reference to encoded video frame
-  */
-  int32_t Decode(const VCMEncodedFrame& inputFrame, int64_t nowMs);
-
-  /**
-  * Set decode callback. Deregistering while decoding is illegal.
-  */
-  int32_t RegisterDecodeCompleteCallback(VCMDecodedFrameCallback* callback);
-
-  bool External() const;
-  bool PrefersLateDecoding() const;
-  bool IsSameDecoder(VideoDecoder* decoder) const {
-    return decoder_.get() == decoder;
-  }
-
- private:
-  VCMDecodedFrameCallback* _callback;
-  VCMFrameInformation _frameInfos[kDecoderFrameMemoryLength];
-  uint32_t _nextFrameInfoIdx;
-  std::unique_ptr<VideoDecoder> decoder_;
-  VideoCodecType _codecType;
-  const bool _isExternal;
-  VideoContentType _last_keyframe_content_type;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_VIDEO_CODING_GENERIC_DECODER_H_
diff --git a/modules/video_coding/generic_encoder.cc b/modules/video_coding/generic_encoder.cc
deleted file mode 100644
index 142c885..0000000
--- a/modules/video_coding/generic_encoder.cc
+++ /dev/null
@@ -1,345 +0,0 @@
-/*
-*  Copyright (c) 2012 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/video_coding/generic_encoder.h"
-
-#include <vector>
-
-#include "webrtc/api/optional.h"
-#include "webrtc/api/video/i420_buffer.h"
-#include "webrtc/modules/pacing/alr_detector.h"
-#include "webrtc/modules/video_coding/encoded_frame.h"
-#include "webrtc/modules/video_coding/media_optimization.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/timeutils.h"
-#include "webrtc/rtc_base/trace_event.h"
-#include "webrtc/system_wrappers/include/field_trial.h"
-
-namespace webrtc {
-
-VCMGenericEncoder::VCMGenericEncoder(
-    VideoEncoder* encoder,
-    VCMEncodedFrameCallback* encoded_frame_callback,
-    bool internal_source)
-    : encoder_(encoder),
-      vcm_encoded_frame_callback_(encoded_frame_callback),
-      internal_source_(internal_source),
-      encoder_params_({BitrateAllocation(), 0, 0, 0}),
-      streams_or_svc_num_(0) {}
-
-VCMGenericEncoder::~VCMGenericEncoder() {}
-
-int32_t VCMGenericEncoder::Release() {
-  RTC_DCHECK_RUNS_SERIALIZED(&race_checker_);
-  TRACE_EVENT0("webrtc", "VCMGenericEncoder::Release");
-  return encoder_->Release();
-}
-
-int32_t VCMGenericEncoder::InitEncode(const VideoCodec* settings,
-                                      int32_t number_of_cores,
-                                      size_t max_payload_size) {
-  RTC_DCHECK_RUNS_SERIALIZED(&race_checker_);
-  TRACE_EVENT0("webrtc", "VCMGenericEncoder::InitEncode");
-  streams_or_svc_num_ = settings->numberOfSimulcastStreams;
-  if (settings->codecType == kVideoCodecVP9) {
-    streams_or_svc_num_ = settings->VP9().numberOfSpatialLayers;
-  }
-  if (streams_or_svc_num_ == 0)
-    streams_or_svc_num_ = 1;
-
-  vcm_encoded_frame_callback_->SetTimingFramesThresholds(
-      settings->timing_frame_thresholds);
-  vcm_encoded_frame_callback_->OnFrameRateChanged(settings->maxFramerate);
-
-  if (encoder_->InitEncode(settings, number_of_cores, max_payload_size) != 0) {
-    LOG(LS_ERROR) << "Failed to initialize the encoder associated with "
-                     "payload name: "
-                  << settings->plName;
-    return -1;
-  }
-  encoder_->RegisterEncodeCompleteCallback(vcm_encoded_frame_callback_);
-  return 0;
-}
-
-int32_t VCMGenericEncoder::Encode(const VideoFrame& frame,
-                                  const CodecSpecificInfo* codec_specific,
-                                  const std::vector<FrameType>& frame_types) {
-  RTC_DCHECK_RUNS_SERIALIZED(&race_checker_);
-  TRACE_EVENT1("webrtc", "VCMGenericEncoder::Encode", "timestamp",
-               frame.timestamp());
-
-  for (FrameType frame_type : frame_types)
-    RTC_DCHECK(frame_type == kVideoFrameKey || frame_type == kVideoFrameDelta);
-
-  for (size_t i = 0; i < streams_or_svc_num_; ++i)
-    vcm_encoded_frame_callback_->OnEncodeStarted(frame.render_time_ms(), i);
-
-  return encoder_->Encode(frame, codec_specific, &frame_types);
-}
-
-void VCMGenericEncoder::SetEncoderParameters(const EncoderParameters& params) {
-  RTC_DCHECK_RUNS_SERIALIZED(&race_checker_);
-  bool channel_parameters_have_changed;
-  bool rates_have_changed;
-  {
-    rtc::CritScope lock(&params_lock_);
-    channel_parameters_have_changed =
-        params.loss_rate != encoder_params_.loss_rate ||
-        params.rtt != encoder_params_.rtt;
-    rates_have_changed =
-        params.target_bitrate != encoder_params_.target_bitrate ||
-        params.input_frame_rate != encoder_params_.input_frame_rate;
-    encoder_params_ = params;
-  }
-  if (channel_parameters_have_changed) {
-    int res = encoder_->SetChannelParameters(params.loss_rate, params.rtt);
-    if (res != 0) {
-      LOG(LS_WARNING) << "Error set encoder parameters (loss = "
-                      << params.loss_rate << ", rtt = " << params.rtt
-                      << "): " << res;
-    }
-  }
-  if (rates_have_changed) {
-    int res = encoder_->SetRateAllocation(params.target_bitrate,
-                                          params.input_frame_rate);
-    if (res != 0) {
-      LOG(LS_WARNING) << "Error set encoder rate (total bitrate bps = "
-                      << params.target_bitrate.get_sum_bps()
-                      << ", framerate = " << params.input_frame_rate
-                      << "): " << res;
-    }
-    vcm_encoded_frame_callback_->OnFrameRateChanged(params.input_frame_rate);
-    for (size_t i = 0; i < streams_or_svc_num_; ++i) {
-      size_t layer_bitrate_bytes_per_sec =
-          params.target_bitrate.GetSpatialLayerSum(i) / 8;
-      // VP9 rate control is not yet moved out of VP9Impl. Due to that rates
-      // are not split among spatial layers.
-      if (layer_bitrate_bytes_per_sec == 0)
-        layer_bitrate_bytes_per_sec = params.target_bitrate.get_sum_bps() / 8;
-      vcm_encoded_frame_callback_->OnTargetBitrateChanged(
-          layer_bitrate_bytes_per_sec, i);
-    }
-  }
-}
-
-EncoderParameters VCMGenericEncoder::GetEncoderParameters() const {
-  rtc::CritScope lock(&params_lock_);
-  return encoder_params_;
-}
-
-int32_t VCMGenericEncoder::SetPeriodicKeyFrames(bool enable) {
-  RTC_DCHECK_RUNS_SERIALIZED(&race_checker_);
-  return encoder_->SetPeriodicKeyFrames(enable);
-}
-
-int32_t VCMGenericEncoder::RequestFrame(
-    const std::vector<FrameType>& frame_types) {
-  RTC_DCHECK_RUNS_SERIALIZED(&race_checker_);
-
-  for (size_t i = 0; i < streams_or_svc_num_; ++i)
-    vcm_encoded_frame_callback_->OnEncodeStarted(0, i);
-  // TODO(nisse): Used only with internal source. Delete as soon as
-  // that feature is removed. The only implementation I've been able
-  // to find ignores what's in the frame. With one exception: It seems
-  // a few test cases, e.g.,
-  // VideoSendStreamTest.VideoSendStreamStopSetEncoderRateToZero, set
-  // internal_source to true and use FakeEncoder. And the latter will
-  // happily encode this 1x1 frame and pass it on down the pipeline.
-  return encoder_->Encode(VideoFrame(I420Buffer::Create(1, 1),
-                                     kVideoRotation_0, 0),
-                          NULL, &frame_types);
-  return 0;
-}
-
-bool VCMGenericEncoder::InternalSource() const {
-  return internal_source_;
-}
-
-bool VCMGenericEncoder::SupportsNativeHandle() const {
-  RTC_DCHECK_RUNS_SERIALIZED(&race_checker_);
-  return encoder_->SupportsNativeHandle();
-}
-
-VCMEncodedFrameCallback::VCMEncodedFrameCallback(
-    EncodedImageCallback* post_encode_callback,
-    media_optimization::MediaOptimization* media_opt)
-    : internal_source_(false),
-      post_encode_callback_(post_encode_callback),
-      media_opt_(media_opt),
-      framerate_(1),
-      last_timing_frame_time_ms_(-1),
-      timing_frames_thresholds_({-1, 0}) {
-  rtc::Optional<AlrDetector::AlrExperimentSettings> experiment_settings =
-      AlrDetector::ParseAlrSettingsFromFieldTrial(
-          AlrDetector::kStrictPacingAndProbingExperimentName);
-  if (experiment_settings) {
-    experiment_groups_[0] = experiment_settings->group_id + 1;
-  } else {
-    experiment_groups_[0] = 0;
-  }
-  experiment_settings = AlrDetector::ParseAlrSettingsFromFieldTrial(
-      AlrDetector::kScreenshareProbingBweExperimentName);
-  if (experiment_settings) {
-    experiment_groups_[1] = experiment_settings->group_id + 1;
-  } else {
-    experiment_groups_[1] = 0;
-  }
-}
-
-VCMEncodedFrameCallback::~VCMEncodedFrameCallback() {}
-
-void VCMEncodedFrameCallback::OnTargetBitrateChanged(
-    size_t bitrate_bytes_per_second,
-    size_t simulcast_svc_idx) {
-  rtc::CritScope crit(&timing_params_lock_);
-  if (timing_frames_info_.size() < simulcast_svc_idx + 1)
-    timing_frames_info_.resize(simulcast_svc_idx + 1);
-  timing_frames_info_[simulcast_svc_idx].target_bitrate_bytes_per_sec =
-      bitrate_bytes_per_second;
-}
-
-void VCMEncodedFrameCallback::OnFrameRateChanged(size_t framerate) {
-  rtc::CritScope crit(&timing_params_lock_);
-  framerate_ = framerate;
-}
-
-void VCMEncodedFrameCallback::OnEncodeStarted(int64_t capture_time_ms,
-                                              size_t simulcast_svc_idx) {
-  rtc::CritScope crit(&timing_params_lock_);
-  if (timing_frames_info_.size() < simulcast_svc_idx + 1)
-    timing_frames_info_.resize(simulcast_svc_idx + 1);
-  timing_frames_info_[simulcast_svc_idx].encode_start_time_ms[capture_time_ms] =
-      rtc::TimeMillis();
-}
-
-EncodedImageCallback::Result VCMEncodedFrameCallback::OnEncodedImage(
-    const EncodedImage& encoded_image,
-    const CodecSpecificInfo* codec_specific,
-    const RTPFragmentationHeader* fragmentation_header) {
-  TRACE_EVENT_INSTANT1("webrtc", "VCMEncodedFrameCallback::Encoded",
-                       "timestamp", encoded_image._timeStamp);
-  size_t simulcast_svc_idx = 0;
-  if (codec_specific->codecType == kVideoCodecVP9) {
-    if (codec_specific->codecSpecific.VP9.num_spatial_layers > 1)
-      simulcast_svc_idx = codec_specific->codecSpecific.VP9.spatial_idx;
-  } else if (codec_specific->codecType == kVideoCodecVP8) {
-    simulcast_svc_idx = codec_specific->codecSpecific.VP8.simulcastIdx;
-  } else if (codec_specific->codecType == kVideoCodecGeneric) {
-    simulcast_svc_idx = codec_specific->codecSpecific.generic.simulcast_idx;
-  } else if (codec_specific->codecType == kVideoCodecH264) {
-    // TODO(ilnik): When h264 simulcast is landed, extract simulcast idx here.
-  }
-
-  rtc::Optional<size_t> outlier_frame_size;
-  rtc::Optional<int64_t> encode_start_ms;
-  size_t num_simulcast_svc_streams = 1;
-  uint8_t timing_flags = TimingFrameFlags::kInvalid;
-  {
-    rtc::CritScope crit(&timing_params_lock_);
-
-    // Encoders with internal sources do not call OnEncodeStarted and
-    // OnFrameRateChanged. |timing_frames_info_| may be not filled here.
-    num_simulcast_svc_streams = timing_frames_info_.size();
-    if (simulcast_svc_idx < num_simulcast_svc_streams) {
-      auto encode_start_map =
-          &timing_frames_info_[simulcast_svc_idx].encode_start_time_ms;
-      auto it = encode_start_map->find(encoded_image.capture_time_ms_);
-      if (it != encode_start_map->end()) {
-        encode_start_ms.emplace(it->second);
-        // Assuming all encoders do not reorder frames within single stream,
-        // there may be some dropped frames with smaller timestamps. These
-        // should be purged.
-        encode_start_map->erase(encode_start_map->begin(), it);
-        encode_start_map->erase(it);
-      } else {
-        // Encoder is with internal source: free our records of any frames just
-        // in case to free memory.
-        encode_start_map->clear();
-      }
-
-      size_t target_bitrate =
-          timing_frames_info_[simulcast_svc_idx].target_bitrate_bytes_per_sec;
-      if (framerate_ > 0 && target_bitrate > 0) {
-        // framerate and target bitrate were reported by encoder.
-        size_t average_frame_size = target_bitrate / framerate_;
-        outlier_frame_size.emplace(
-            average_frame_size *
-            timing_frames_thresholds_.outlier_ratio_percent / 100);
-      }
-    }
-
-    // Check if it's time to send a timing frame.
-    int64_t timing_frame_delay_ms =
-        encoded_image.capture_time_ms_ - last_timing_frame_time_ms_;
-    // Trigger threshold if it's a first frame, too long passed since the last
-    // timing frame, or we already sent timing frame on a different simulcast
-    // stream with the same capture time.
-    if (last_timing_frame_time_ms_ == -1 ||
-        timing_frame_delay_ms >= timing_frames_thresholds_.delay_ms ||
-        timing_frame_delay_ms == 0) {
-      timing_flags = TimingFrameFlags::kTriggeredByTimer;
-      last_timing_frame_time_ms_ = encoded_image.capture_time_ms_;
-    }
-
-    // Outliers trigger timing frames, but do not affect scheduled timing
-    // frames.
-    if (outlier_frame_size && encoded_image._length >= *outlier_frame_size) {
-      if (timing_flags == TimingFrameFlags::kInvalid)
-        timing_flags = 0;
-      timing_flags |= TimingFrameFlags::kTriggeredBySize;
-    }
-  }
-
-  // If encode start is not available that means that encoder uses internal
-  // source. In that case capture timestamp may be from a different clock with a
-  // drift relative to rtc::TimeMillis(). We can't use it for Timing frames,
-  // because to being sent in the network capture time required to be less than
-  // all the other timestamps.
-  if (timing_flags != TimingFrameFlags::kInvalid && encode_start_ms) {
-    encoded_image.SetEncodeTime(*encode_start_ms, rtc::TimeMillis());
-    encoded_image.timing_.flags = timing_flags;
-  } else {
-    encoded_image.timing_.flags = TimingFrameFlags::kInvalid;
-  }
-
-  // Piggyback ALR experiment group id and simulcast id into the content type.
-  uint8_t experiment_id =
-      experiment_groups_[videocontenttypehelpers::IsScreenshare(
-          encoded_image.content_type_)];
-
-  // TODO(ilnik): This will force content type extension to be present even
-  // for realtime video. At the expense of miniscule overhead we will get
-  // sliced receive statistics.
-  RTC_CHECK(videocontenttypehelpers::SetExperimentId(
-      &encoded_image.content_type_, experiment_id));
-  // We count simulcast streams from 1 on the wire. That's why we set simulcast
-  // id in content type to +1 of that is actual simulcast index. This is because
-  // value 0 on the wire is reserved for 'no simulcast stream specified'.
-  RTC_CHECK(videocontenttypehelpers::SetSimulcastId(
-      &encoded_image.content_type_,
-      static_cast<uint8_t>(simulcast_svc_idx + 1)));
-
-  Result result = post_encode_callback_->OnEncodedImage(
-      encoded_image, codec_specific, fragmentation_header);
-  if (result.error != Result::OK)
-    return result;
-
-  if (media_opt_) {
-    media_opt_->UpdateWithEncodedData(encoded_image);
-    if (internal_source_) {
-      // Signal to encoder to drop next frame.
-      result.drop_next_frame = media_opt_->DropFrame();
-    }
-  }
-  return result;
-}
-
-}  // namespace webrtc
diff --git a/modules/video_coding/generic_encoder.h b/modules/video_coding/generic_encoder.h
deleted file mode 100644
index 050d60d..0000000
--- a/modules/video_coding/generic_encoder.h
+++ /dev/null
@@ -1,130 +0,0 @@
-/*
- *  Copyright (c) 2012 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_VIDEO_CODING_GENERIC_ENCODER_H_
-#define WEBRTC_MODULES_VIDEO_CODING_GENERIC_ENCODER_H_
-
-#include <stdio.h>
-#include <map>
-#include <vector>
-
-#include "webrtc/modules/video_coding/include/video_codec_interface.h"
-#include "webrtc/modules/video_coding/include/video_coding_defines.h"
-
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/race_checker.h"
-
-namespace webrtc {
-
-namespace media_optimization {
-class MediaOptimization;
-}  // namespace media_optimization
-
-struct EncoderParameters {
-  BitrateAllocation target_bitrate;
-  uint8_t loss_rate;
-  int64_t rtt;
-  uint32_t input_frame_rate;
-};
-
-class VCMEncodedFrameCallback : public EncodedImageCallback {
- public:
-  VCMEncodedFrameCallback(EncodedImageCallback* post_encode_callback,
-                          media_optimization::MediaOptimization* media_opt);
-  virtual ~VCMEncodedFrameCallback();
-
-  // Implements EncodedImageCallback.
-  EncodedImageCallback::Result OnEncodedImage(
-      const EncodedImage& encoded_image,
-      const CodecSpecificInfo* codec_specific_info,
-      const RTPFragmentationHeader* fragmentation) override;
-
-  void SetInternalSource(bool internal_source) {
-    internal_source_ = internal_source;
-  }
-
-  // Timing frames configuration methods. These 4 should be called before
-  // |OnEncodedImage| at least once.
-  void OnTargetBitrateChanged(size_t bitrate_bytes_per_sec,
-                              size_t simulcast_svc_idx);
-
-  void OnFrameRateChanged(size_t framerate);
-
-  void OnEncodeStarted(int64_t capture_time_ms, size_t simulcast_svc_idx);
-
-  void SetTimingFramesThresholds(
-      const VideoCodec::TimingFrameTriggerThresholds& thresholds) {
-    rtc::CritScope crit(&timing_params_lock_);
-    timing_frames_thresholds_ = thresholds;
-  }
-
- private:
-  rtc::CriticalSection timing_params_lock_;
-  bool internal_source_;
-  EncodedImageCallback* const post_encode_callback_;
-  media_optimization::MediaOptimization* const media_opt_;
-
-  struct TimingFramesLayerInfo {
-    size_t target_bitrate_bytes_per_sec = 0;
-    std::map<int64_t, int64_t> encode_start_time_ms;
-  };
-  // Separate instance for each simulcast stream or spatial layer.
-  std::vector<TimingFramesLayerInfo> timing_frames_info_
-      RTC_GUARDED_BY(timing_params_lock_);
-  size_t framerate_ RTC_GUARDED_BY(timing_params_lock_);
-  int64_t last_timing_frame_time_ms_ RTC_GUARDED_BY(timing_params_lock_);
-  VideoCodec::TimingFrameTriggerThresholds timing_frames_thresholds_
-      RTC_GUARDED_BY(timing_params_lock_);
-
-  // Experiment groups parsed from field trials for realtime video ([0]) and
-  // screenshare ([1]). 0 means no group specified. Positive values are
-  // experiment group numbers incremented by 1.
-  uint8_t experiment_groups_[2];
-};
-
-class VCMGenericEncoder {
-  friend class VCMCodecDataBase;
-
- public:
-  VCMGenericEncoder(VideoEncoder* encoder,
-                    VCMEncodedFrameCallback* encoded_frame_callback,
-                    bool internal_source);
-  ~VCMGenericEncoder();
-  int32_t Release();
-  int32_t InitEncode(const VideoCodec* settings,
-                     int32_t number_of_cores,
-                     size_t max_payload_size);
-  int32_t Encode(const VideoFrame& frame,
-                 const CodecSpecificInfo* codec_specific,
-                 const std::vector<FrameType>& frame_types);
-
-  void SetEncoderParameters(const EncoderParameters& params);
-  EncoderParameters GetEncoderParameters() const;
-
-  int32_t SetPeriodicKeyFrames(bool enable);
-  int32_t RequestFrame(const std::vector<FrameType>& frame_types);
-  bool InternalSource() const;
-  void OnDroppedFrame();
-  bool SupportsNativeHandle() const;
-
- private:
-  rtc::RaceChecker race_checker_;
-
-  VideoEncoder* const encoder_ RTC_GUARDED_BY(race_checker_);
-  VCMEncodedFrameCallback* const vcm_encoded_frame_callback_;
-  const bool internal_source_;
-  rtc::CriticalSection params_lock_;
-  EncoderParameters encoder_params_ RTC_GUARDED_BY(params_lock_);
-  size_t streams_or_svc_num_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_VIDEO_CODING_GENERIC_ENCODER_H_
diff --git a/modules/video_coding/generic_encoder_unittest.cc b/modules/video_coding/generic_encoder_unittest.cc
deleted file mode 100644
index 2a5aeff..0000000
--- a/modules/video_coding/generic_encoder_unittest.cc
+++ /dev/null
@@ -1,194 +0,0 @@
-/*
- *  Copyright (c) 2017 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 <vector>
-
-#include "webrtc/modules/video_coding/encoded_frame.h"
-#include "webrtc/modules/video_coding/generic_encoder.h"
-#include "webrtc/modules/video_coding/include/video_coding_defines.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-namespace test {
-namespace {
-inline size_t FrameSize(const size_t& min_frame_size,
-                        const size_t& max_frame_size,
-                        const int& s,
-                        const int& i) {
-  return min_frame_size + (s + 1) * i % (max_frame_size - min_frame_size);
-}
-
-class FakeEncodedImageCallback : public EncodedImageCallback {
- public:
-  FakeEncodedImageCallback() : last_frame_was_timing_(false) {}
-  Result OnEncodedImage(const EncodedImage& encoded_image,
-                        const CodecSpecificInfo* codec_specific_info,
-                        const RTPFragmentationHeader* fragmentation) override {
-    last_frame_was_timing_ =
-        encoded_image.timing_.flags != TimingFrameFlags::kInvalid;
-    return Result(Result::OK);
-  };
-
-  bool WasTimingFrame() { return last_frame_was_timing_; }
-
- private:
-  bool last_frame_was_timing_;
-};
-
-enum class FrameType {
-  kNormal,
-  kTiming,
-  kDropped,
-};
-
-// Emulates |num_frames| on |num_streams| frames with capture timestamps
-// increased by 1 from 0. Size of each frame is between
-// |min_frame_size| and |max_frame_size|, outliers are counted relatevely to
-// |average_frame_sizes[]| for each stream.
-std::vector<std::vector<FrameType>> GetTimingFrames(
-    const int64_t delay_ms,
-    const size_t min_frame_size,
-    const size_t max_frame_size,
-    std::vector<size_t> average_frame_sizes,
-    const int num_streams,
-    const int num_frames) {
-  FakeEncodedImageCallback sink;
-  VCMEncodedFrameCallback callback(&sink, nullptr);
-  const size_t kFramerate = 30;
-  callback.SetTimingFramesThresholds(
-      {delay_ms, kDefaultOutlierFrameSizePercent});
-  callback.OnFrameRateChanged(kFramerate);
-  int s, i;
-  std::vector<std::vector<FrameType>> result(num_streams);
-  for (s = 0; s < num_streams; ++s)
-    callback.OnTargetBitrateChanged(average_frame_sizes[s] * kFramerate, s);
-  int64_t current_timestamp = 0;
-  for (i = 0; i < num_frames; ++i) {
-    current_timestamp += 1;
-    for (s = 0; s < num_streams; ++s) {
-      // every (5+s)-th frame is dropped on s-th stream by design.
-      bool dropped = i % (5 + s) == 0;
-
-      EncodedImage image;
-      CodecSpecificInfo codec_specific;
-      image._length = FrameSize(min_frame_size, max_frame_size, s, i);
-      image.capture_time_ms_ = current_timestamp;
-      codec_specific.codecType = kVideoCodecGeneric;
-      codec_specific.codecSpecific.generic.simulcast_idx = s;
-      callback.OnEncodeStarted(current_timestamp, s);
-      if (dropped) {
-        result[s].push_back(FrameType::kDropped);
-        continue;
-      }
-      callback.OnEncodedImage(image, &codec_specific, nullptr);
-      if (sink.WasTimingFrame()) {
-        result[s].push_back(FrameType::kTiming);
-      } else {
-        result[s].push_back(FrameType::kNormal);
-      }
-    }
-  }
-  return result;
-}
-}  // namespace
-
-TEST(TestVCMEncodedFrameCallback, MarksTimingFramesPeriodicallyTogether) {
-  const int64_t kDelayMs = 29;
-  const size_t kMinFrameSize = 10;
-  const size_t kMaxFrameSize = 20;
-  const int kNumFrames = 1000;
-  const int kNumStreams = 3;
-  // No outliers as 1000 is larger than anything from range [10,20].
-  const std::vector<size_t> kAverageSize = {1000, 1000, 1000};
-  auto frames = GetTimingFrames(kDelayMs, kMinFrameSize, kMaxFrameSize,
-                                kAverageSize, kNumStreams, kNumFrames);
-  // Timing frames should be tirggered every delayMs.
-  // As no outliers are expected, frames on all streams have to be
-  // marked together.
-  int last_timing_frame = -1;
-  for (int i = 0; i < kNumFrames; ++i) {
-    int num_normal = 0;
-    int num_timing = 0;
-    int num_dropped = 0;
-    for (int s = 0; s < kNumStreams; ++s) {
-      if (frames[s][i] == FrameType::kTiming) {
-        ++num_timing;
-      } else if (frames[s][i] == FrameType::kNormal) {
-        ++num_normal;
-      } else {
-        ++num_dropped;
-      }
-    }
-    // Can't have both normal and timing frames at the same timstamp.
-    EXPECT_TRUE(num_timing == 0 || num_normal == 0);
-    if (num_dropped < kNumStreams) {
-      if (last_timing_frame == -1 || i >= last_timing_frame + kDelayMs) {
-        // If didn't have timing frames for a period, current sent frame has to
-        // be one. No normal frames should be sent.
-        EXPECT_EQ(num_normal, 0);
-      } else {
-        // No unneeded timing frames should be sent.
-        EXPECT_EQ(num_timing, 0);
-      }
-    }
-    if (num_timing > 0)
-      last_timing_frame = i;
-  }
-}
-
-TEST(TestVCMEncodedFrameCallback, MarksOutliers) {
-  const int64_t kDelayMs = 29;
-  const size_t kMinFrameSize = 2495;
-  const size_t kMaxFrameSize = 2505;
-  const int kNumFrames = 1000;
-  const int kNumStreams = 3;
-  // Possible outliers as 1000 lies in range [995, 1005].
-  const std::vector<size_t> kAverageSize = {998, 1000, 1004};
-  auto frames = GetTimingFrames(kDelayMs, kMinFrameSize, kMaxFrameSize,
-                                kAverageSize, kNumStreams, kNumFrames);
-  // All outliers should be marked.
-  for (int i = 0; i < kNumFrames; ++i) {
-    for (int s = 0; s < kNumStreams; ++s) {
-      if (FrameSize(kMinFrameSize, kMaxFrameSize, s, i) >=
-          kAverageSize[s] * kDefaultOutlierFrameSizePercent / 100) {
-        // Too big frame. May be dropped or timing, but not normal.
-        EXPECT_NE(frames[s][i], FrameType::kNormal);
-      }
-    }
-  }
-}
-
-TEST(TestVCMEncodedFrameCallback, NoTimingFrameIfNoEncodeStartTime) {
-  EncodedImage image;
-  CodecSpecificInfo codec_specific;
-  int64_t timestamp = 1;
-  image._length = 500;
-  image.capture_time_ms_ = timestamp;
-  codec_specific.codecType = kVideoCodecGeneric;
-  codec_specific.codecSpecific.generic.simulcast_idx = 0;
-  FakeEncodedImageCallback sink;
-  VCMEncodedFrameCallback callback(&sink, nullptr);
-  VideoCodec::TimingFrameTriggerThresholds thresholds;
-  thresholds.delay_ms = 1;  // Make all frames timing frames.
-  callback.SetTimingFramesThresholds(thresholds);
-
-  // Verify a single frame works with encode start time set.
-  callback.OnEncodeStarted(timestamp, 0);
-  callback.OnEncodedImage(image, &codec_specific, nullptr);
-  EXPECT_TRUE(sink.WasTimingFrame());
-
-  // New frame, now skip OnEncodeStarted. Should not result in timing frame.
-  image.capture_time_ms_ = ++timestamp;
-  callback.OnEncodedImage(image, &codec_specific, nullptr);
-  EXPECT_FALSE(sink.WasTimingFrame());
-}
-
-}  // namespace test
-}  // namespace webrtc
diff --git a/modules/video_coding/h264_sprop_parameter_sets.cc b/modules/video_coding/h264_sprop_parameter_sets.cc
deleted file mode 100644
index c545103..0000000
--- a/modules/video_coding/h264_sprop_parameter_sets.cc
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- *  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/video_coding/h264_sprop_parameter_sets.h"
-
-#include <string>
-#include <vector>
-
-#include "webrtc/rtc_base/base64.h"
-#include "webrtc/rtc_base/basictypes.h"
-#include "webrtc/rtc_base/logging.h"
-
-namespace {
-
-bool DecodeAndConvert(const std::string& base64, std::vector<uint8_t>* binary) {
-  return rtc::Base64::DecodeFromArray(base64.data(), base64.size(),
-                                      rtc::Base64::DO_STRICT, binary, nullptr);
-}
-}  // namespace
-
-namespace webrtc {
-
-bool H264SpropParameterSets::DecodeSprop(const std::string& sprop) {
-  size_t separator_pos = sprop.find(',');
-  LOG(LS_INFO) << "Parsing sprop \"" << sprop << "\"";
-  if ((separator_pos <= 0) || (separator_pos >= sprop.length() - 1)) {
-    LOG(LS_WARNING) << "Invalid seperator position " << separator_pos << " *"
-                    << sprop << "*";
-    return false;
-  }
-  std::string sps_str = sprop.substr(0, separator_pos);
-  std::string pps_str = sprop.substr(separator_pos + 1, std::string::npos);
-  if (!DecodeAndConvert(sps_str, &sps_)) {
-    LOG(LS_WARNING) << "Failed to decode sprop/sps *" << sprop << "*";
-    return false;
-  }
-  if (!DecodeAndConvert(pps_str, &pps_)) {
-    LOG(LS_WARNING) << "Failed to decode sprop/pps *" << sprop << "*";
-    return false;
-  }
-  return true;
-}
-
-}  // namespace webrtc
diff --git a/modules/video_coding/h264_sprop_parameter_sets.h b/modules/video_coding/h264_sprop_parameter_sets.h
deleted file mode 100644
index 714a29e..0000000
--- a/modules/video_coding/h264_sprop_parameter_sets.h
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- *  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_VIDEO_CODING_H264_SPROP_PARAMETER_SETS_H_
-#define WEBRTC_MODULES_VIDEO_CODING_H264_SPROP_PARAMETER_SETS_H_
-
-#include <string>
-#include <vector>
-
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace webrtc {
-
-class H264SpropParameterSets {
- public:
-  H264SpropParameterSets() {}
-  bool DecodeSprop(const std::string& sprop);
-  const std::vector<uint8_t>& sps_nalu() { return sps_; }
-  const std::vector<uint8_t>& pps_nalu() { return pps_; }
-
- private:
-  std::vector<uint8_t> sps_;
-  std::vector<uint8_t> pps_;
-  RTC_DISALLOW_COPY_AND_ASSIGN(H264SpropParameterSets);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_VIDEO_CODING_H264_SPROP_PARAMETER_SETS_H_
diff --git a/modules/video_coding/h264_sprop_parameter_sets_unittest.cc b/modules/video_coding/h264_sprop_parameter_sets_unittest.cc
deleted file mode 100644
index 6455670..0000000
--- a/modules/video_coding/h264_sprop_parameter_sets_unittest.cc
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- *  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/video_coding/h264_sprop_parameter_sets.h"
-
-#include <stdint.h>
-
-#include <vector>
-
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-class H264SpropParameterSetsTest : public testing::Test {
- public:
-  H264SpropParameterSets h264_sprop;
-};
-
-TEST_F(H264SpropParameterSetsTest, Base64DecodeSprop) {
-  // Example sprop string from https://tools.ietf.org/html/rfc3984 .
-  EXPECT_TRUE(h264_sprop.DecodeSprop("Z0IACpZTBYmI,aMljiA=="));
-  static const std::vector<uint8_t> raw_sps{0x67, 0x42, 0x00, 0x0A, 0x96,
-                                            0x53, 0x05, 0x89, 0x88};
-  static const std::vector<uint8_t> raw_pps{0x68, 0xC9, 0x63, 0x88};
-  EXPECT_EQ(raw_sps, h264_sprop.sps_nalu());
-  EXPECT_EQ(raw_pps, h264_sprop.pps_nalu());
-}
-
-TEST_F(H264SpropParameterSetsTest, InvalidData) {
-  EXPECT_FALSE(h264_sprop.DecodeSprop(","));
-  EXPECT_FALSE(h264_sprop.DecodeSprop(""));
-  EXPECT_FALSE(h264_sprop.DecodeSprop(",iA=="));
-  EXPECT_FALSE(h264_sprop.DecodeSprop("iA==,"));
-  EXPECT_TRUE(h264_sprop.DecodeSprop("iA==,iA=="));
-  EXPECT_FALSE(h264_sprop.DecodeSprop("--,--"));
-  EXPECT_FALSE(h264_sprop.DecodeSprop(",,"));
-  EXPECT_FALSE(h264_sprop.DecodeSprop("iA=="));
-}
-
-}  // namespace webrtc
diff --git a/modules/video_coding/h264_sps_pps_tracker.cc b/modules/video_coding/h264_sps_pps_tracker.cc
deleted file mode 100644
index 40284c7..0000000
--- a/modules/video_coding/h264_sps_pps_tracker.cc
+++ /dev/null
@@ -1,244 +0,0 @@
-/*
- *  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/video_coding/h264_sps_pps_tracker.h"
-
-#include <string>
-#include <utility>
-
-#include "webrtc/common_video/h264/h264_common.h"
-#include "webrtc/common_video/h264/pps_parser.h"
-#include "webrtc/common_video/h264/sps_parser.h"
-#include "webrtc/modules/video_coding/frame_object.h"
-#include "webrtc/modules/video_coding/packet_buffer.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-
-namespace webrtc {
-namespace video_coding {
-
-namespace {
-const uint8_t start_code_h264[] = {0, 0, 0, 1};
-}  // namespace
-
-H264SpsPpsTracker::PacketAction H264SpsPpsTracker::CopyAndFixBitstream(
-    VCMPacket* packet) {
-  RTC_DCHECK(packet->codec == kVideoCodecH264);
-
-  const uint8_t* data = packet->dataPtr;
-  const size_t data_size = packet->sizeBytes;
-  const RTPVideoHeader& video_header = packet->video_header;
-  const RTPVideoHeaderH264& codec_header = video_header.codecHeader.H264;
-
-  bool append_sps_pps = false;
-  auto sps = sps_data_.end();
-  auto pps = pps_data_.end();
-
-  for (size_t i = 0; i < codec_header.nalus_length; ++i) {
-    const NaluInfo& nalu = codec_header.nalus[i];
-    switch (nalu.type) {
-      case H264::NaluType::kSps: {
-        sps_data_[nalu.sps_id].width = packet->width;
-        sps_data_[nalu.sps_id].height = packet->height;
-        break;
-      }
-      case H264::NaluType::kPps: {
-        pps_data_[nalu.pps_id].sps_id = nalu.sps_id;
-        break;
-      }
-      case H264::NaluType::kIdr: {
-        // If this is the first packet of an IDR, make sure we have the required
-        // SPS/PPS and also calculate how much extra space we need in the buffer
-        // to prepend the SPS/PPS to the bitstream with start codes.
-        if (video_header.is_first_packet_in_frame) {
-          if (nalu.pps_id == -1) {
-            LOG(LS_WARNING) << "No PPS id in IDR nalu.";
-            return kRequestKeyframe;
-          }
-
-          pps = pps_data_.find(nalu.pps_id);
-          if (pps == pps_data_.end()) {
-            LOG(LS_WARNING) << "No PPS with id << " << nalu.pps_id
-                            << " received";
-            return kRequestKeyframe;
-          }
-
-          sps = sps_data_.find(pps->second.sps_id);
-          if (sps == sps_data_.end()) {
-            LOG(LS_WARNING)
-                << "No SPS with id << " << pps->second.sps_id << " received";
-            return kRequestKeyframe;
-          }
-
-          // Since the first packet of every keyframe should have its width and
-          // height set we set it here in the case of it being supplied out of
-          // band.
-          packet->width = sps->second.width;
-          packet->height = sps->second.height;
-
-          // If the SPS/PPS was supplied out of band then we will have saved
-          // the actual bitstream in |data|.
-          if (sps->second.data && pps->second.data) {
-            RTC_DCHECK_GT(sps->second.size, 0);
-            RTC_DCHECK_GT(pps->second.size, 0);
-            append_sps_pps = true;
-          }
-        }
-        break;
-      }
-      default:
-        break;
-    }
-  }
-
-  RTC_CHECK(!append_sps_pps ||
-            (sps != sps_data_.end() && pps != pps_data_.end()));
-
-  // Calculate how much space we need for the rest of the bitstream.
-  size_t required_size = 0;
-
-  if (append_sps_pps) {
-    required_size += sps->second.size + sizeof(start_code_h264);
-    required_size += pps->second.size + sizeof(start_code_h264);
-  }
-
-  if (codec_header.packetization_type == kH264StapA) {
-    const uint8_t* nalu_ptr = data + 1;
-    while (nalu_ptr < data + data_size) {
-      RTC_DCHECK(video_header.is_first_packet_in_frame);
-      required_size += sizeof(start_code_h264);
-
-      // The first two bytes describe the length of a segment.
-      uint16_t segment_length = nalu_ptr[0] << 8 | nalu_ptr[1];
-      nalu_ptr += 2;
-
-      required_size += segment_length;
-      nalu_ptr += segment_length;
-    }
-  } else {
-    if (video_header.is_first_packet_in_frame)
-      required_size += sizeof(start_code_h264);
-    required_size += data_size;
-  }
-
-  // Then we copy to the new buffer.
-  uint8_t* buffer = new uint8_t[required_size];
-  uint8_t* insert_at = buffer;
-
-  if (append_sps_pps) {
-    // Insert SPS.
-    memcpy(insert_at, start_code_h264, sizeof(start_code_h264));
-    insert_at += sizeof(start_code_h264);
-    memcpy(insert_at, sps->second.data.get(), sps->second.size);
-    insert_at += sps->second.size;
-
-    // Insert PPS.
-    memcpy(insert_at, start_code_h264, sizeof(start_code_h264));
-    insert_at += sizeof(start_code_h264);
-    memcpy(insert_at, pps->second.data.get(), pps->second.size);
-    insert_at += pps->second.size;
-  }
-
-  // Copy the rest of the bitstream and insert start codes.
-  if (codec_header.packetization_type == kH264StapA) {
-    const uint8_t* nalu_ptr = data + 1;
-    while (nalu_ptr < data + data_size) {
-      memcpy(insert_at, start_code_h264, sizeof(start_code_h264));
-      insert_at += sizeof(start_code_h264);
-
-      // The first two bytes describe the length of a segment.
-      uint16_t segment_length = nalu_ptr[0] << 8 | nalu_ptr[1];
-      nalu_ptr += 2;
-
-      size_t copy_end = nalu_ptr - data + segment_length;
-      if (copy_end > data_size) {
-        delete[] buffer;
-        return kDrop;
-      }
-
-      memcpy(insert_at, nalu_ptr, segment_length);
-      insert_at += segment_length;
-      nalu_ptr += segment_length;
-    }
-  } else {
-    if (video_header.is_first_packet_in_frame) {
-      memcpy(insert_at, start_code_h264, sizeof(start_code_h264));
-      insert_at += sizeof(start_code_h264);
-    }
-    memcpy(insert_at, data, data_size);
-  }
-
-  packet->dataPtr = buffer;
-  packet->sizeBytes = required_size;
-  return kInsert;
-}
-
-void H264SpsPpsTracker::InsertSpsPpsNalus(const std::vector<uint8_t>& sps,
-                                          const std::vector<uint8_t>& pps) {
-  constexpr size_t kNaluHeaderOffset = 1;
-  if (sps.size() < kNaluHeaderOffset) {
-    LOG(LS_WARNING) << "SPS size  " << sps.size() << " is smaller than "
-                    << kNaluHeaderOffset;
-    return;
-  }
-  if ((sps[0] & 0x1f) != H264::NaluType::kSps) {
-    LOG(LS_WARNING) << "SPS Nalu header missing";
-    return;
-  }
-  if (pps.size() < kNaluHeaderOffset) {
-    LOG(LS_WARNING) << "PPS size  " << pps.size() << " is smaller than "
-                    << kNaluHeaderOffset;
-    return;
-  }
-  if ((pps[0] & 0x1f) != H264::NaluType::kPps) {
-    LOG(LS_WARNING) << "SPS Nalu header missing";
-    return;
-  }
-  rtc::Optional<SpsParser::SpsState> parsed_sps = SpsParser::ParseSps(
-      sps.data() + kNaluHeaderOffset, sps.size() - kNaluHeaderOffset);
-  rtc::Optional<PpsParser::PpsState> parsed_pps = PpsParser::ParsePps(
-      pps.data() + kNaluHeaderOffset, pps.size() - kNaluHeaderOffset);
-
-  if (!parsed_sps) {
-    LOG(LS_WARNING) << "Failed to parse SPS.";
-  }
-
-  if (!parsed_pps) {
-    LOG(LS_WARNING) << "Failed to parse PPS.";
-  }
-
-  if (!parsed_pps || !parsed_sps) {
-    return;
-  }
-
-  SpsInfo sps_info;
-  sps_info.size = sps.size();
-  sps_info.width = parsed_sps->width;
-  sps_info.height = parsed_sps->height;
-  uint8_t* sps_data = new uint8_t[sps_info.size];
-  memcpy(sps_data, sps.data(), sps_info.size);
-  sps_info.data.reset(sps_data);
-  sps_data_[parsed_sps->id] = std::move(sps_info);
-
-  PpsInfo pps_info;
-  pps_info.size = pps.size();
-  pps_info.sps_id = parsed_pps->sps_id;
-  uint8_t* pps_data = new uint8_t[pps_info.size];
-  memcpy(pps_data, pps.data(), pps_info.size);
-  pps_info.data.reset(pps_data);
-  pps_data_[parsed_pps->id] = std::move(pps_info);
-
-  LOG(LS_INFO) << "Inserted SPS id " << parsed_sps->id << " and PPS id "
-               << parsed_pps->id << " (referencing SPS " << parsed_pps->sps_id
-               << ")";
-}
-
-}  // namespace video_coding
-}  // namespace webrtc
diff --git a/modules/video_coding/h264_sps_pps_tracker.h b/modules/video_coding/h264_sps_pps_tracker.h
deleted file mode 100644
index 7f8bc04..0000000
--- a/modules/video_coding/h264_sps_pps_tracker.h
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- *  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_VIDEO_CODING_H264_SPS_PPS_TRACKER_H_
-#define WEBRTC_MODULES_VIDEO_CODING_H264_SPS_PPS_TRACKER_H_
-
-#include <cstdint>
-#include <map>
-#include <memory>
-#include <vector>
-
-#include "webrtc/modules/include/module_common_types.h"
-
-namespace webrtc {
-
-class VCMPacket;
-
-namespace video_coding {
-
-class H264SpsPpsTracker {
- public:
-  enum PacketAction { kInsert, kDrop, kRequestKeyframe };
-
-  PacketAction CopyAndFixBitstream(VCMPacket* packet);
-
-  void InsertSpsPpsNalus(const std::vector<uint8_t>& sps,
-                         const std::vector<uint8_t>& pps);
-
- private:
-  struct PpsInfo {
-    int sps_id = -1;
-    size_t size = 0;
-    std::unique_ptr<uint8_t[]> data;
-  };
-
-  struct SpsInfo {
-    size_t size = 0;
-    int width = -1;
-    int height = -1;
-    std::unique_ptr<uint8_t[]> data;
-  };
-
-  std::map<uint32_t, PpsInfo> pps_data_;
-  std::map<uint32_t, SpsInfo> sps_data_;
-};
-
-}  // namespace video_coding
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_VIDEO_CODING_H264_SPS_PPS_TRACKER_H_
diff --git a/modules/video_coding/h264_sps_pps_tracker_unittest.cc b/modules/video_coding/h264_sps_pps_tracker_unittest.cc
deleted file mode 100644
index 0aa1351..0000000
--- a/modules/video_coding/h264_sps_pps_tracker_unittest.cc
+++ /dev/null
@@ -1,350 +0,0 @@
-/*
- *  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/video_coding/h264_sps_pps_tracker.h"
-
-#include <vector>
-
-#include "webrtc/modules/video_coding/packet.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/common_video/h264/h264_common.h"
-
-namespace webrtc {
-namespace video_coding {
-
-namespace {
-const uint8_t start_code[] = {0, 0, 0, 1};
-}  // namespace
-
-class TestH264SpsPpsTracker : public ::testing::Test {
- public:
-  VCMPacket GetDefaultPacket() {
-    VCMPacket packet;
-    packet.codec = kVideoCodecH264;
-    packet.video_header.codecHeader.H264.nalus_length = 0;
-    packet.video_header.is_first_packet_in_frame = false;
-    packet.video_header.codecHeader.H264.packetization_type = kH264SingleNalu;
-
-    return packet;
-  }
-
-  void AddSps(VCMPacket* packet, uint8_t sps_id, std::vector<uint8_t>* data) {
-    NaluInfo info;
-    info.type = H264::NaluType::kSps;
-    info.sps_id = sps_id;
-    info.pps_id = -1;
-    data->push_back(H264::NaluType::kSps);
-    data->push_back(sps_id);  // The sps data, just a single byte.
-
-    packet->video_header.codecHeader.H264
-        .nalus[packet->video_header.codecHeader.H264.nalus_length++] = info;
-  }
-
-  void AddPps(VCMPacket* packet,
-              uint8_t sps_id,
-              uint8_t pps_id,
-              std::vector<uint8_t>* data) {
-    NaluInfo info;
-    info.type = H264::NaluType::kPps;
-    info.sps_id = sps_id;
-    info.pps_id = pps_id;
-    data->push_back(H264::NaluType::kPps);
-    data->push_back(pps_id);  // The pps data, just a single byte.
-
-    packet->video_header.codecHeader.H264
-        .nalus[packet->video_header.codecHeader.H264.nalus_length++] = info;
-  }
-
-  void AddIdr(VCMPacket* packet, int pps_id) {
-    NaluInfo info;
-    info.type = H264::NaluType::kIdr;
-    info.sps_id = -1;
-    info.pps_id = pps_id;
-
-    packet->video_header.codecHeader.H264
-        .nalus[packet->video_header.codecHeader.H264.nalus_length++] = info;
-  }
-
- protected:
-  H264SpsPpsTracker tracker_;
-};
-
-TEST_F(TestH264SpsPpsTracker, NoNalus) {
-  uint8_t data[] = {1, 2, 3};
-  VCMPacket packet = GetDefaultPacket();
-  packet.video_header.codecHeader.H264.packetization_type = kH264FuA;
-  packet.dataPtr = data;
-  packet.sizeBytes = sizeof(data);
-
-  EXPECT_EQ(H264SpsPpsTracker::kInsert, tracker_.CopyAndFixBitstream(&packet));
-  EXPECT_EQ(memcmp(packet.dataPtr, data, sizeof(data)), 0);
-  delete[] packet.dataPtr;
-}
-
-TEST_F(TestH264SpsPpsTracker, FuAFirstPacket) {
-  uint8_t data[] = {1, 2, 3};
-  VCMPacket packet = GetDefaultPacket();
-  packet.video_header.codecHeader.H264.packetization_type = kH264FuA;
-  packet.video_header.is_first_packet_in_frame = true;
-  packet.dataPtr = data;
-  packet.sizeBytes = sizeof(data);
-
-  EXPECT_EQ(H264SpsPpsTracker::kInsert, tracker_.CopyAndFixBitstream(&packet));
-  std::vector<uint8_t> expected;
-  expected.insert(expected.end(), start_code, start_code + sizeof(start_code));
-  expected.insert(expected.end(), {1, 2, 3});
-  EXPECT_EQ(memcmp(packet.dataPtr, expected.data(), expected.size()), 0);
-  delete[] packet.dataPtr;
-}
-
-TEST_F(TestH264SpsPpsTracker, StapAIncorrectSegmentLength) {
-  uint8_t data[] = {0, 0, 2, 0};
-  VCMPacket packet = GetDefaultPacket();
-  packet.video_header.codecHeader.H264.packetization_type = kH264StapA;
-  packet.video_header.is_first_packet_in_frame = true;
-  packet.dataPtr = data;
-  packet.sizeBytes = sizeof(data);
-
-  EXPECT_EQ(H264SpsPpsTracker::kDrop, tracker_.CopyAndFixBitstream(&packet));
-}
-
-TEST_F(TestH264SpsPpsTracker, NoNalusFirstPacket) {
-  uint8_t data[] = {1, 2, 3};
-  VCMPacket packet = GetDefaultPacket();
-  packet.video_header.is_first_packet_in_frame = true;
-  packet.dataPtr = data;
-  packet.sizeBytes = sizeof(data);
-
-  EXPECT_EQ(H264SpsPpsTracker::kInsert, tracker_.CopyAndFixBitstream(&packet));
-  std::vector<uint8_t> expected;
-  expected.insert(expected.end(), start_code, start_code + sizeof(start_code));
-  expected.insert(expected.end(), {1, 2, 3});
-  EXPECT_EQ(memcmp(packet.dataPtr, expected.data(), expected.size()), 0);
-  delete[] packet.dataPtr;
-}
-
-TEST_F(TestH264SpsPpsTracker, IdrNoSpsPpsInserted) {
-  std::vector<uint8_t> data = {1, 2, 3};
-  VCMPacket packet = GetDefaultPacket();
-  packet.video_header.codecHeader.H264.packetization_type = kH264FuA;
-
-  AddIdr(&packet, 0);
-  packet.dataPtr = data.data();
-  packet.sizeBytes = data.size();
-
-  EXPECT_EQ(H264SpsPpsTracker::kInsert, tracker_.CopyAndFixBitstream(&packet));
-  EXPECT_EQ(memcmp(packet.dataPtr, data.data(), data.size()), 0);
-  delete[] packet.dataPtr;
-}
-
-TEST_F(TestH264SpsPpsTracker, IdrFirstPacketNoSpsPpsInserted) {
-  std::vector<uint8_t> data = {1, 2, 3};
-  VCMPacket packet = GetDefaultPacket();
-  packet.video_header.is_first_packet_in_frame = true;
-
-  AddIdr(&packet, 0);
-  packet.dataPtr = data.data();
-  packet.sizeBytes = data.size();
-
-  EXPECT_EQ(H264SpsPpsTracker::kRequestKeyframe,
-            tracker_.CopyAndFixBitstream(&packet));
-}
-
-TEST_F(TestH264SpsPpsTracker, IdrFirstPacketNoPpsInserted) {
-  std::vector<uint8_t> data = {1, 2, 3};
-  VCMPacket packet = GetDefaultPacket();
-  packet.video_header.is_first_packet_in_frame = true;
-
-  AddSps(&packet, 0, &data);
-  AddIdr(&packet, 0);
-  packet.dataPtr = data.data();
-  packet.sizeBytes = data.size();
-
-  EXPECT_EQ(H264SpsPpsTracker::kRequestKeyframe,
-            tracker_.CopyAndFixBitstream(&packet));
-}
-
-TEST_F(TestH264SpsPpsTracker, IdrFirstPacketNoSpsInserted) {
-  std::vector<uint8_t> data = {1, 2, 3};
-  VCMPacket packet = GetDefaultPacket();
-  packet.video_header.is_first_packet_in_frame = true;
-
-  AddPps(&packet, 0, 0, &data);
-  AddIdr(&packet, 0);
-  packet.dataPtr = data.data();
-  packet.sizeBytes = data.size();
-
-  EXPECT_EQ(H264SpsPpsTracker::kRequestKeyframe,
-            tracker_.CopyAndFixBitstream(&packet));
-}
-
-TEST_F(TestH264SpsPpsTracker, SpsPpsPacketThenIdrFirstPacket) {
-  std::vector<uint8_t> data;
-  VCMPacket sps_pps_packet = GetDefaultPacket();
-
-  // Insert SPS/PPS
-  AddSps(&sps_pps_packet, 0, &data);
-  AddPps(&sps_pps_packet, 0, 1, &data);
-  sps_pps_packet.dataPtr = data.data();
-  sps_pps_packet.sizeBytes = data.size();
-  EXPECT_EQ(H264SpsPpsTracker::kInsert,
-            tracker_.CopyAndFixBitstream(&sps_pps_packet));
-  delete[] sps_pps_packet.dataPtr;
-  data.clear();
-
-  // Insert first packet of the IDR
-  VCMPacket idr_packet = GetDefaultPacket();
-  idr_packet.video_header.is_first_packet_in_frame = true;
-  AddIdr(&idr_packet, 1);
-  data.insert(data.end(), {1, 2, 3});
-  idr_packet.dataPtr = data.data();
-  idr_packet.sizeBytes = data.size();
-  EXPECT_EQ(H264SpsPpsTracker::kInsert,
-            tracker_.CopyAndFixBitstream(&idr_packet));
-
-  std::vector<uint8_t> expected;
-  expected.insert(expected.end(), start_code, start_code + sizeof(start_code));
-  expected.insert(expected.end(), {1, 2, 3});
-  EXPECT_EQ(memcmp(idr_packet.dataPtr, expected.data(), expected.size()), 0);
-  delete[] idr_packet.dataPtr;
-}
-
-TEST_F(TestH264SpsPpsTracker, SpsPpsIdrInStapA) {
-  std::vector<uint8_t> data;
-  VCMPacket packet = GetDefaultPacket();
-  packet.video_header.codecHeader.H264.packetization_type = kH264StapA;
-  packet.video_header.is_first_packet_in_frame = true;  // Always true for StapA
-
-  data.insert(data.end(), {0});     // First byte is ignored
-  data.insert(data.end(), {0, 2});  // Length of segment
-  AddSps(&packet, 13, &data);
-  data.insert(data.end(), {0, 2});  // Length of segment
-  AddPps(&packet, 13, 27, &data);
-  data.insert(data.end(), {0, 5});  // Length of segment
-  AddIdr(&packet, 27);
-  data.insert(data.end(), {1, 2, 3, 2, 1});
-
-  packet.dataPtr = data.data();
-  packet.sizeBytes = data.size();
-  EXPECT_EQ(H264SpsPpsTracker::kInsert, tracker_.CopyAndFixBitstream(&packet));
-
-  std::vector<uint8_t> expected;
-  expected.insert(expected.end(), start_code, start_code + sizeof(start_code));
-  expected.insert(expected.end(), {H264::NaluType::kSps, 13});
-  expected.insert(expected.end(), start_code, start_code + sizeof(start_code));
-  expected.insert(expected.end(), {H264::NaluType::kPps, 27});
-  expected.insert(expected.end(), start_code, start_code + sizeof(start_code));
-  expected.insert(expected.end(), {1, 2, 3, 2, 1});
-
-  EXPECT_EQ(memcmp(packet.dataPtr, expected.data(), expected.size()), 0);
-  delete[] packet.dataPtr;
-}
-
-TEST_F(TestH264SpsPpsTracker, SpsPpsOutOfBand) {
-  constexpr uint8_t kData[] = {1, 2, 3};
-
-  // Generated by "ffmpeg -r 30 -f avfoundation -i "default" out.h264" on macos.
-  // width: 320, height: 240
-  const std::vector<uint8_t> sps(
-      {0x67, 0x7a, 0x00, 0x0d, 0xbc, 0xd9, 0x41, 0x41, 0xfa, 0x10, 0x00, 0x00,
-       0x03, 0x00, 0x10, 0x00, 0x00, 0x03, 0x03, 0xc0, 0xf1, 0x42, 0x99, 0x60});
-  const std::vector<uint8_t> pps({0x68, 0xeb, 0xe3, 0xcb, 0x22, 0xc0});
-  tracker_.InsertSpsPpsNalus(sps, pps);
-
-  // Insert first packet of the IDR.
-  VCMPacket idr_packet = GetDefaultPacket();
-  idr_packet.video_header.is_first_packet_in_frame = true;
-  AddIdr(&idr_packet, 0);
-  idr_packet.dataPtr = kData;
-  idr_packet.sizeBytes = sizeof(kData);
-  EXPECT_EQ(H264SpsPpsTracker::kInsert,
-            tracker_.CopyAndFixBitstream(&idr_packet));
-  EXPECT_EQ(320, idr_packet.width);
-  EXPECT_EQ(240, idr_packet.height);
-  if (idr_packet.dataPtr != kData) {
-    // In case CopyAndFixBitStream() prepends SPS/PPS nalus to the packet, it
-    // uses new uint8_t[] to allocate memory. Caller of CopyAndFixBitStream()
-    // needs to take care of freeing the memory.
-    delete[] idr_packet.dataPtr;
-  }
-}
-
-TEST_F(TestH264SpsPpsTracker, SpsPpsOutOfBandWrongNaluHeader) {
-  constexpr uint8_t kData[] = {1, 2, 3};
-
-  // Generated by "ffmpeg -r 30 -f avfoundation -i "default" out.h264" on macos.
-  // Nalu headers manupilated afterwards.
-  const std::vector<uint8_t> sps(
-      {0xff, 0x7a, 0x00, 0x0d, 0xbc, 0xd9, 0x41, 0x41, 0xfa, 0x10, 0x00, 0x00,
-       0x03, 0x00, 0x10, 0x00, 0x00, 0x03, 0x03, 0xc0, 0xf1, 0x42, 0x99, 0x60});
-  const std::vector<uint8_t> pps({0xff, 0xeb, 0xe3, 0xcb, 0x22, 0xc0});
-  tracker_.InsertSpsPpsNalus(sps, pps);
-
-  // Insert first packet of the IDR.
-  VCMPacket idr_packet = GetDefaultPacket();
-  idr_packet.video_header.is_first_packet_in_frame = true;
-  AddIdr(&idr_packet, 0);
-  idr_packet.dataPtr = kData;
-  idr_packet.sizeBytes = sizeof(kData);
-  EXPECT_EQ(H264SpsPpsTracker::kRequestKeyframe,
-            tracker_.CopyAndFixBitstream(&idr_packet));
-}
-
-TEST_F(TestH264SpsPpsTracker, SpsPpsOutOfBandIncompleteNalu) {
-  constexpr uint8_t kData[] = {1, 2, 3};
-
-  // Generated by "ffmpeg -r 30 -f avfoundation -i "default" out.h264" on macos.
-  // Nalus damaged afterwards.
-  const std::vector<uint8_t> sps({0x67, 0x7a, 0x00, 0x0d, 0xbc, 0xd9});
-  const std::vector<uint8_t> pps({0x68, 0xeb, 0xe3, 0xcb, 0x22, 0xc0});
-  tracker_.InsertSpsPpsNalus(sps, pps);
-
-  // Insert first packet of the IDR.
-  VCMPacket idr_packet = GetDefaultPacket();
-  idr_packet.video_header.is_first_packet_in_frame = true;
-  AddIdr(&idr_packet, 0);
-  idr_packet.dataPtr = kData;
-  idr_packet.sizeBytes = sizeof(kData);
-  EXPECT_EQ(H264SpsPpsTracker::kRequestKeyframe,
-            tracker_.CopyAndFixBitstream(&idr_packet));
-}
-
-TEST_F(TestH264SpsPpsTracker, SaveRestoreWidthHeight) {
-  std::vector<uint8_t> data;
-
-  // Insert an SPS/PPS packet with width/height and make sure
-  // that information is set on the first IDR packet.
-  VCMPacket sps_pps_packet = GetDefaultPacket();
-  AddSps(&sps_pps_packet, 0, &data);
-  AddPps(&sps_pps_packet, 0, 1, &data);
-  sps_pps_packet.dataPtr = data.data();
-  sps_pps_packet.sizeBytes = data.size();
-  sps_pps_packet.width = 320;
-  sps_pps_packet.height = 240;
-  EXPECT_EQ(H264SpsPpsTracker::kInsert,
-            tracker_.CopyAndFixBitstream(&sps_pps_packet));
-  delete[] sps_pps_packet.dataPtr;
-
-  VCMPacket idr_packet = GetDefaultPacket();
-  idr_packet.video_header.is_first_packet_in_frame = true;
-  AddIdr(&idr_packet, 1);
-  data.insert(data.end(), {1, 2, 3});
-  idr_packet.dataPtr = data.data();
-  idr_packet.sizeBytes = data.size();
-  EXPECT_EQ(H264SpsPpsTracker::kInsert,
-            tracker_.CopyAndFixBitstream(&idr_packet));
-
-  EXPECT_EQ(320, idr_packet.width);
-  EXPECT_EQ(240, idr_packet.height);
-  delete[] idr_packet.dataPtr;
-}
-
-}  // namespace video_coding
-}  // namespace webrtc
diff --git a/modules/video_coding/histogram.cc b/modules/video_coding/histogram.cc
deleted file mode 100644
index f862faf..0000000
--- a/modules/video_coding/histogram.cc
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- *  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/video_coding/histogram.h"
-
-#include <algorithm>
-
-#include "webrtc/modules/video_coding/sequence_number_util.h"
-
-namespace webrtc {
-namespace video_coding {
-Histogram::Histogram(size_t num_buckets, size_t max_num_values) {
-  RTC_DCHECK_GT(num_buckets, 0);
-  RTC_DCHECK_GT(max_num_values, 0);
-  buckets_.resize(num_buckets);
-  values_.reserve(max_num_values);
-  index_ = 0;
-}
-
-void Histogram::Add(size_t value) {
-  value = std::min<size_t>(value, buckets_.size() - 1);
-  if (index_ < values_.size()) {
-    --buckets_[values_[index_]];
-    RTC_DCHECK_LT(values_[index_], buckets_.size());
-    values_[index_] = value;
-  } else {
-    values_.emplace_back(value);
-  }
-
-  ++buckets_[value];
-  index_ = (index_ + 1) % values_.capacity();
-}
-
-size_t Histogram::InverseCdf(float probability) const {
-  RTC_DCHECK_GE(probability, 0.f);
-  RTC_DCHECK_LE(probability, 1.f);
-  RTC_DCHECK_GT(values_.size(), 0ul);
-
-  size_t bucket = 0;
-  float accumulated_probability = 0;
-  while (accumulated_probability < probability && bucket < buckets_.size()) {
-    accumulated_probability +=
-        static_cast<float>(buckets_[bucket]) / values_.size();
-    ++bucket;
-  }
-  return bucket;
-}
-
-size_t Histogram::NumValues() const {
-  return values_.size();
-}
-
-}  // namespace video_coding
-}  // namespace webrtc
diff --git a/modules/video_coding/histogram.h b/modules/video_coding/histogram.h
deleted file mode 100644
index 7a99a1c..0000000
--- a/modules/video_coding/histogram.h
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- *  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_VIDEO_CODING_HISTOGRAM_H_
-#define WEBRTC_MODULES_VIDEO_CODING_HISTOGRAM_H_
-
-#include <cstddef>
-#include <vector>
-
-namespace webrtc {
-namespace video_coding {
-class Histogram {
- public:
-  // A discrete histogram where every bucket with range [0, num_buckets).
-  // Values greater or equal to num_buckets will be placed in the last bucket.
-  Histogram(size_t num_buckets, size_t max_num_values);
-
-  // Add a value to the histogram. If there already is max_num_values in the
-  // histogram then the oldest value will be replaced with the new value.
-  void Add(size_t value);
-
-  // Calculates how many buckets have to be summed in order to accumulate at
-  // least the given probability.
-  size_t InverseCdf(float probability) const;
-
-  // How many values that make up this histogram.
-  size_t NumValues() const;
-
- private:
-  // A circular buffer that holds the values that make up the histogram.
-  std::vector<size_t> values_;
-  std::vector<size_t> buckets_;
-  size_t index_;
-};
-
-}  // namespace video_coding
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_VIDEO_CODING_HISTOGRAM_H_
diff --git a/modules/video_coding/histogram_unittest.cc b/modules/video_coding/histogram_unittest.cc
deleted file mode 100644
index 953f7db..0000000
--- a/modules/video_coding/histogram_unittest.cc
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- *  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/video_coding/histogram.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-namespace video_coding {
-
-class TestHistogram : public ::testing::Test {
- protected:
-  TestHistogram() : histogram_(5, 10) {}
-  Histogram histogram_;
-};
-
-TEST_F(TestHistogram, NumValues) {
-  EXPECT_EQ(0ul, histogram_.NumValues());
-  histogram_.Add(0);
-  EXPECT_EQ(1ul, histogram_.NumValues());
-}
-
-TEST_F(TestHistogram, InverseCdf) {
-  histogram_.Add(0);
-  histogram_.Add(1);
-  histogram_.Add(2);
-  histogram_.Add(3);
-  histogram_.Add(4);
-  EXPECT_EQ(5ul, histogram_.NumValues());
-  EXPECT_EQ(1ul, histogram_.InverseCdf(0.2f));
-  EXPECT_EQ(2ul, histogram_.InverseCdf(0.2000001f));
-  EXPECT_EQ(4ul, histogram_.InverseCdf(0.8f));
-
-  histogram_.Add(0);
-  EXPECT_EQ(6ul, histogram_.NumValues());
-  EXPECT_EQ(1ul, histogram_.InverseCdf(0.2f));
-  EXPECT_EQ(1ul, histogram_.InverseCdf(0.2000001f));
-}
-
-TEST_F(TestHistogram, ReplaceOldValues) {
-  histogram_.Add(0);
-  histogram_.Add(0);
-  histogram_.Add(0);
-  histogram_.Add(0);
-  histogram_.Add(0);
-  histogram_.Add(1);
-  histogram_.Add(1);
-  histogram_.Add(1);
-  histogram_.Add(1);
-  histogram_.Add(1);
-  EXPECT_EQ(10ul, histogram_.NumValues());
-  EXPECT_EQ(1ul, histogram_.InverseCdf(0.5f));
-  EXPECT_EQ(2ul, histogram_.InverseCdf(0.5000001f));
-
-  histogram_.Add(4);
-  histogram_.Add(4);
-  histogram_.Add(4);
-  histogram_.Add(4);
-  EXPECT_EQ(10ul, histogram_.NumValues());
-  EXPECT_EQ(1ul, histogram_.InverseCdf(0.1f));
-  EXPECT_EQ(2ul, histogram_.InverseCdf(0.5f));
-
-  histogram_.Add(20);
-  EXPECT_EQ(10ul, histogram_.NumValues());
-  EXPECT_EQ(2ul, histogram_.InverseCdf(0.5f));
-  EXPECT_EQ(5ul, histogram_.InverseCdf(0.5000001f));
-}
-
-}  // namespace video_coding
-}  // namespace webrtc
diff --git a/modules/video_coding/include/mock/mock_vcm_callbacks.h b/modules/video_coding/include/mock/mock_vcm_callbacks.h
deleted file mode 100644
index 21b154f..0000000
--- a/modules/video_coding/include/mock/mock_vcm_callbacks.h
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- *  Copyright (c) 2012 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_VIDEO_CODING_INCLUDE_MOCK_MOCK_VCM_CALLBACKS_H_
-#define WEBRTC_MODULES_VIDEO_CODING_INCLUDE_MOCK_MOCK_VCM_CALLBACKS_H_
-
-#include "webrtc/modules/video_coding/include/video_coding_defines.h"
-#include "webrtc/test/gmock.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-class MockVCMFrameTypeCallback : public VCMFrameTypeCallback {
- public:
-  MOCK_METHOD0(RequestKeyFrame, int32_t());
-};
-
-class MockPacketRequestCallback : public VCMPacketRequestCallback {
- public:
-  MOCK_METHOD2(ResendPackets,
-               int32_t(const uint16_t* sequenceNumbers, uint16_t length));
-};
-
-class MockVCMReceiveCallback : public VCMReceiveCallback {
- public:
-  MockVCMReceiveCallback() {}
-  virtual ~MockVCMReceiveCallback() {}
-
-  MOCK_METHOD3(FrameToRender,
-               int32_t(VideoFrame&, rtc::Optional<uint8_t>, VideoContentType));
-  MOCK_METHOD1(ReceivedDecodedReferenceFrame, int32_t(const uint64_t));
-  MOCK_METHOD1(OnIncomingPayloadType, void(int));
-  MOCK_METHOD1(OnDecoderImplementationName, void(const char*));
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_VIDEO_CODING_INCLUDE_MOCK_MOCK_VCM_CALLBACKS_H_
diff --git a/modules/video_coding/include/mock/mock_video_codec_interface.h b/modules/video_coding/include/mock/mock_video_codec_interface.h
deleted file mode 100644
index bbf3098..0000000
--- a/modules/video_coding/include/mock/mock_video_codec_interface.h
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- *  Copyright (c) 2012 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_VIDEO_CODING_INCLUDE_MOCK_MOCK_VIDEO_CODEC_INTERFACE_H_
-#define WEBRTC_MODULES_VIDEO_CODING_INCLUDE_MOCK_MOCK_VIDEO_CODEC_INTERFACE_H_
-
-#include <string>
-#include <vector>
-
-#include "webrtc/modules/video_coding/include/video_codec_interface.h"
-#include "webrtc/test/gmock.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-class MockEncodedImageCallback : public EncodedImageCallback {
- public:
-  MOCK_METHOD3(OnEncodedImage,
-               Result(const EncodedImage& encodedImage,
-                      const CodecSpecificInfo* codecSpecificInfo,
-                      const RTPFragmentationHeader* fragmentation));
-};
-
-class MockVideoEncoder : public VideoEncoder {
- public:
-  MOCK_CONST_METHOD2(Version, int32_t(int8_t* version, int32_t length));
-  MOCK_METHOD3(InitEncode,
-               int32_t(const VideoCodec* codecSettings,
-                       int32_t numberOfCores,
-                       size_t maxPayloadSize));
-  MOCK_METHOD3(Encode,
-               int32_t(const VideoFrame& inputImage,
-                       const CodecSpecificInfo* codecSpecificInfo,
-                       const std::vector<FrameType>* frame_types));
-  MOCK_METHOD1(RegisterEncodeCompleteCallback,
-               int32_t(EncodedImageCallback* callback));
-  MOCK_METHOD0(Release, int32_t());
-  MOCK_METHOD0(Reset, int32_t());
-  MOCK_METHOD2(SetChannelParameters, int32_t(uint32_t packetLoss, int64_t rtt));
-  MOCK_METHOD2(SetRates, int32_t(uint32_t newBitRate, uint32_t frameRate));
-  MOCK_METHOD2(SetRateAllocation,
-               int32_t(const BitrateAllocation& newBitRate,
-                       uint32_t frameRate));
-  MOCK_METHOD1(SetPeriodicKeyFrames, int32_t(bool enable));
-};
-
-class MockDecodedImageCallback : public DecodedImageCallback {
- public:
-  MOCK_METHOD1(Decoded, int32_t(VideoFrame& decodedImage));  // NOLINT
-  MOCK_METHOD2(Decoded,
-               int32_t(VideoFrame& decodedImage,  // NOLINT
-                       int64_t decode_time_ms));
-  MOCK_METHOD3(Decoded,
-               void(VideoFrame& decodedImage,  // NOLINT
-                    rtc::Optional<int32_t> decode_time_ms,
-                    rtc::Optional<uint8_t> qp));
-  MOCK_METHOD1(ReceivedDecodedReferenceFrame,
-               int32_t(const uint64_t pictureId));
-  MOCK_METHOD1(ReceivedDecodedFrame, int32_t(const uint64_t pictureId));
-};
-
-class MockVideoDecoder : public VideoDecoder {
- public:
-  MOCK_METHOD2(InitDecode,
-               int32_t(const VideoCodec* codecSettings, int32_t numberOfCores));
-  MOCK_METHOD5(Decode,
-               int32_t(const EncodedImage& inputImage,
-                       bool missingFrames,
-                       const RTPFragmentationHeader* fragmentation,
-                       const CodecSpecificInfo* codecSpecificInfo,
-                       int64_t renderTimeMs));
-  MOCK_METHOD1(RegisterDecodeCompleteCallback,
-               int32_t(DecodedImageCallback* callback));
-  MOCK_METHOD0(Release, int32_t());
-  MOCK_METHOD0(Copy, VideoDecoder*());
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_VIDEO_CODING_INCLUDE_MOCK_MOCK_VIDEO_CODEC_INTERFACE_H_
diff --git a/modules/video_coding/include/video_codec_initializer.h b/modules/video_coding/include/video_codec_initializer.h
deleted file mode 100644
index ef3ff9c..0000000
--- a/modules/video_coding/include/video_codec_initializer.h
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- *  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_VIDEO_CODING_INCLUDE_VIDEO_CODEC_INITIALIZER_H_
-#define WEBRTC_MODULES_VIDEO_CODING_INCLUDE_VIDEO_CODEC_INITIALIZER_H_
-
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "webrtc/call/video_send_stream.h"
-
-namespace webrtc {
-
-class TemporalLayersFactory;
-class VideoBitrateAllocator;
-class VideoCodec;
-class VideoEncoderConfig;
-
-class VideoCodecInitializer {
- public:
-  // Takes an EncoderSettings, a VideoEncoderConfig and the VideoStream
-  // configuration and translated them into the old school VideoCodec type.
-  // It also creates a VideoBitrateAllocator instance, suitable for the codec
-  // type used. For instance, VP8 will create an allocator than can handle
-  // simulcast and temporal layering.
-  // GetBitrateAllocator is called implicitly from here, no need to call again.
-  static bool SetupCodec(
-      const VideoEncoderConfig& config,
-      const VideoSendStream::Config::EncoderSettings settings,
-      const std::vector<VideoStream>& streams,
-      bool nack_enabled,
-      VideoCodec* codec,
-      std::unique_ptr<VideoBitrateAllocator>* bitrate_allocator);
-
-  // Create a bitrate allocator for the specified codec. |tl_factory| is
-  // optional, if it is populated, ownership of that instance will be
-  // transferred to the VideoBitrateAllocator instance.
-  static std::unique_ptr<VideoBitrateAllocator> CreateBitrateAllocator(
-      const VideoCodec& codec,
-      std::unique_ptr<TemporalLayersFactory> tl_factory);
-
- private:
-  static VideoCodec VideoEncoderConfigToVideoCodec(
-      const VideoEncoderConfig& config,
-      const std::vector<VideoStream>& streams,
-      const std::string& payload_name,
-      int payload_type,
-      bool nack_enabled);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_VIDEO_CODING_INCLUDE_VIDEO_CODEC_INITIALIZER_H_
diff --git a/modules/video_coding/include/video_codec_interface.h b/modules/video_coding/include/video_codec_interface.h
deleted file mode 100644
index 0bef7da..0000000
--- a/modules/video_coding/include/video_codec_interface.h
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- *  Copyright (c) 2012 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_VIDEO_CODING_INCLUDE_VIDEO_CODEC_INTERFACE_H_
-#define WEBRTC_MODULES_VIDEO_CODING_INCLUDE_VIDEO_CODEC_INTERFACE_H_
-
-#include <vector>
-
-#include "webrtc/api/video/video_frame.h"
-#include "webrtc/api/video_codecs/video_decoder.h"
-#include "webrtc/api/video_codecs/video_encoder.h"
-#include "webrtc/common_types.h"
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/modules/video_coding/include/video_error_codes.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-class RTPFragmentationHeader;  // forward declaration
-
-// Note: if any pointers are added to this struct, it must be fitted
-// with a copy-constructor. See below.
-struct CodecSpecificInfoVP8 {
-  int16_t pictureId;  // Negative value to skip pictureId.
-  bool nonReference;
-  uint8_t simulcastIdx;
-  uint8_t temporalIdx;
-  bool layerSync;
-  int tl0PicIdx;  // Negative value to skip tl0PicIdx.
-  int8_t keyIdx;  // Negative value to skip keyIdx.
-};
-
-struct CodecSpecificInfoVP9 {
-  int16_t picture_id;  // Negative value to skip pictureId.
-
-  bool inter_pic_predicted;  // This layer frame is dependent on previously
-                             // coded frame(s).
-  bool flexible_mode;
-  bool ss_data_available;
-
-  int tl0_pic_idx;  // Negative value to skip tl0PicIdx.
-  uint8_t temporal_idx;
-  uint8_t spatial_idx;
-  bool temporal_up_switch;
-  bool inter_layer_predicted;  // Frame is dependent on directly lower spatial
-                               // layer frame.
-  uint8_t gof_idx;
-
-  // SS data.
-  size_t num_spatial_layers;  // Always populated.
-  bool spatial_layer_resolution_present;
-  uint16_t width[kMaxVp9NumberOfSpatialLayers];
-  uint16_t height[kMaxVp9NumberOfSpatialLayers];
-  GofInfoVP9 gof;
-
-  // Frame reference data.
-  uint8_t num_ref_pics;
-  uint8_t p_diff[kMaxVp9RefPics];
-};
-
-struct CodecSpecificInfoGeneric {
-  uint8_t simulcast_idx;
-};
-
-struct CodecSpecificInfoH264 {
-  H264PacketizationMode packetization_mode;
-};
-
-union CodecSpecificInfoUnion {
-  CodecSpecificInfoGeneric generic;
-  CodecSpecificInfoVP8 VP8;
-  CodecSpecificInfoVP9 VP9;
-  CodecSpecificInfoH264 H264;
-};
-
-// Note: if any pointers are added to this struct or its sub-structs, it
-// must be fitted with a copy-constructor. This is because it is copied
-// in the copy-constructor of VCMEncodedFrame.
-struct CodecSpecificInfo {
-  CodecSpecificInfo() : codecType(kVideoCodecUnknown), codec_name(nullptr) {}
-  VideoCodecType codecType;
-  const char* codec_name;
-  CodecSpecificInfoUnion codecSpecific;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_VIDEO_CODING_INCLUDE_VIDEO_CODEC_INTERFACE_H_
diff --git a/modules/video_coding/include/video_coding.h b/modules/video_coding/include/video_coding.h
deleted file mode 100644
index 93220a2..0000000
--- a/modules/video_coding/include/video_coding.h
+++ /dev/null
@@ -1,421 +0,0 @@
-/*
- *  Copyright (c) 2012 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_VIDEO_CODING_INCLUDE_VIDEO_CODING_H_
-#define WEBRTC_MODULES_VIDEO_CODING_INCLUDE_VIDEO_CODING_H_
-
-#if defined(WEBRTC_WIN)
-// This is a workaround on Windows due to the fact that some Windows
-// headers define CreateEvent as a macro to either CreateEventW or CreateEventA.
-// This can cause problems since we use that name as well and could
-// declare them as one thing here whereas in another place a windows header
-// may have been included and then implementing CreateEvent() causes compilation
-// errors.  So for consistency, we include the main windows header here.
-#include <windows.h>
-#endif
-
-#include "webrtc/api/video/video_frame.h"
-#include "webrtc/modules/include/module.h"
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/modules/video_coding/include/video_coding_defines.h"
-#include "webrtc/system_wrappers/include/event_wrapper.h"
-
-namespace webrtc {
-
-class Clock;
-class EncodedImageCallback;
-// TODO(pbos): Remove VCMQMSettingsCallback completely. This might be done by
-// removing the VCM and use VideoSender/VideoReceiver as a public interface
-// directly.
-class VCMQMSettingsCallback;
-class VideoBitrateAllocator;
-class VideoEncoder;
-class VideoDecoder;
-struct CodecSpecificInfo;
-
-class EventFactory {
- public:
-  virtual ~EventFactory() {}
-
-  virtual EventWrapper* CreateEvent() = 0;
-};
-
-class EventFactoryImpl : public EventFactory {
- public:
-  virtual ~EventFactoryImpl() {}
-
-  virtual EventWrapper* CreateEvent() { return EventWrapper::Create(); }
-};
-
-// Used to indicate which decode with errors mode should be used.
-enum VCMDecodeErrorMode {
-  kNoErrors,         // Never decode with errors. Video will freeze
-                     // if nack is disabled.
-  kSelectiveErrors,  // Frames that are determined decodable in
-                     // VCMSessionInfo may be decoded with missing
-                     // packets. As not all incomplete frames will be
-                     // decodable, video will freeze if nack is disabled.
-  kWithErrors        // Release frames as needed. Errors may be
-                     // introduced as some encoded frames may not be
-                     // complete.
-};
-
-class VideoCodingModule : public Module {
- public:
-  enum SenderNackMode { kNackNone, kNackAll, kNackSelective };
-
-  // DEPRECATED.
-  static VideoCodingModule* Create(Clock* clock, EventFactory* event_factory);
-
-  /*
-  *   Sender
-  */
-
-  // Registers a codec to be used for encoding. Calling this
-  // API multiple times overwrites any previously registered codecs.
-  //
-  // NOTE: Must be called on the thread that constructed the VCM instance.
-  //
-  // Input:
-  //      - sendCodec      : Settings for the codec to be registered.
-  //      - numberOfCores  : The number of cores the codec is allowed
-  //                         to use.
-  //      - maxPayloadSize : The maximum size each payload is allowed
-  //                                to have. Usually MTU - overhead.
-  //
-  // Return value      : VCM_OK, on success.
-  //                     < 0,    on error.
-  virtual int32_t RegisterSendCodec(const VideoCodec* sendCodec,
-                                    uint32_t numberOfCores,
-                                    uint32_t maxPayloadSize) = 0;
-
-  // Register an external encoder object. This can not be used together with
-  // external decoder callbacks.
-  //
-  // Input:
-  //      - externalEncoder : Encoder object to be used for encoding frames
-  //      inserted
-  //                          with the AddVideoFrame API.
-  //      - payloadType     : The payload type bound which this encoder is bound
-  //      to.
-  //
-  // Return value      : VCM_OK, on success.
-  //                     < 0,    on error.
-  // TODO(pbos): Remove return type when unused elsewhere.
-  virtual int32_t RegisterExternalEncoder(VideoEncoder* externalEncoder,
-                                          uint8_t payloadType,
-                                          bool internalSource = false) = 0;
-
-  // API to get currently configured encoder target bitrate in bits/s.
-  //
-  // Return value      : 0,   on success.
-  //                     < 0, on error.
-  virtual int Bitrate(unsigned int* bitrate) const = 0;
-
-  // API to get currently configured encoder target frame rate.
-  //
-  // Return value      : 0,   on success.
-  //                     < 0, on error.
-  virtual int FrameRate(unsigned int* framerate) const = 0;
-
-  // Sets the parameters describing the send channel. These parameters are
-  // inputs to the
-  // Media Optimization inside the VCM and also specifies the target bit rate
-  // for the
-  // encoder. Bit rate used by NACK should already be compensated for by the
-  // user.
-  //
-  // Input:
-  //      - target_bitrate        : The target bitrate for VCM in bits/s.
-  //      - lossRate              : Fractions of lost packets the past second.
-  //                                (loss rate in percent = 100 * packetLoss /
-  //                                255)
-  //      - rtt                   : Current round-trip time in ms.
-  //
-  // Return value      : VCM_OK, on success.
-  //                     < 0,         on error.
-  virtual int32_t SetChannelParameters(uint32_t target_bitrate,
-                                       uint8_t lossRate,
-                                       int64_t rtt) = 0;
-
-  // Sets the parameters describing the receive channel. These parameters are
-  // inputs to the
-  // Media Optimization inside the VCM.
-  //
-  // Input:
-  //      - rtt                   : Current round-trip time in ms.
-  //                                with the most amount available bandwidth in
-  //                                a conference
-  //                                scenario
-  //
-  // Return value      : VCM_OK, on success.
-  //                     < 0,    on error.
-  virtual int32_t SetReceiveChannelParameters(int64_t rtt) = 0;
-
-  // Deprecated: This method currently does not have any effect.
-  // Register a video protection callback which will be called to deliver
-  // the requested FEC rate and NACK status (on/off).
-  // TODO(perkj): Remove once no projects use it.
-  virtual int32_t RegisterProtectionCallback(
-      VCMProtectionCallback* protection) = 0;
-
-  // Enable or disable a video protection method.
-  //
-  // Input:
-  //      - videoProtection  : The method to enable or disable.
-  //      - enable           : True if the method should be enabled, false if
-  //                           it should be disabled.
-  //
-  // Return value      : VCM_OK, on success.
-  //                     < 0,    on error.
-  virtual int32_t SetVideoProtection(VCMVideoProtection videoProtection,
-                                     bool enable) = 0;
-
-  // Add one raw video frame to the encoder. This function does all the
-  // necessary
-  // processing, then decides what frame type to encode, or if the frame should
-  // be
-  // dropped. If the frame should be encoded it passes the frame to the encoder
-  // before it returns.
-  //
-  // Input:
-  //      - videoFrame        : Video frame to encode.
-  //      - codecSpecificInfo : Extra codec information, e.g., pre-parsed
-  //      in-band signaling.
-  //
-  // Return value      : VCM_OK, on success.
-  //                     < 0,    on error.
-  virtual int32_t AddVideoFrame(
-      const VideoFrame& videoFrame,
-      const CodecSpecificInfo* codecSpecificInfo = NULL) = 0;
-
-  // Next frame encoded should be an intra frame (keyframe).
-  //
-  // Return value      : VCM_OK, on success.
-  //                     < 0,    on error.
-  virtual int32_t IntraFrameRequest(size_t stream_index) = 0;
-
-  // Frame Dropper enable. Can be used to disable the frame dropping when the
-  // encoder
-  // over-uses its bit rate. This API is designed to be used when the encoded
-  // frames
-  // are supposed to be stored to an AVI file, or when the I420 codec is used
-  // and the
-  // target bit rate shouldn't affect the frame rate.
-  //
-  // Input:
-  //      - enable            : True to enable the setting, false to disable it.
-  //
-  // Return value      : VCM_OK, on success.
-  //                     < 0,    on error.
-  virtual int32_t EnableFrameDropper(bool enable) = 0;
-
-  /*
-  *   Receiver
-  */
-
-  // Register possible receive codecs, can be called multiple times for
-  // different codecs.
-  // The module will automatically switch between registered codecs depending on
-  // the
-  // payload type of incoming frames. The actual decoder will be created when
-  // needed.
-  //
-  // Input:
-  //      - receiveCodec      : Settings for the codec to be registered.
-  //      - numberOfCores     : Number of CPU cores that the decoder is allowed
-  //      to use.
-  //      - requireKeyFrame   : Set this to true if you don't want any delta
-  //      frames
-  //                            to be decoded until the first key frame has been
-  //                            decoded.
-  //
-  // Return value      : VCM_OK, on success.
-  //                     < 0,    on error.
-  virtual int32_t RegisterReceiveCodec(const VideoCodec* receiveCodec,
-                                       int32_t numberOfCores,
-                                       bool requireKeyFrame = false) = 0;
-
-  // Register an externally defined decoder/renderer object. Can be a decoder
-  // only or a
-  // decoder coupled with a renderer. Note that RegisterReceiveCodec must be
-  // called to
-  // be used for decoding incoming streams.
-  //
-  // Input:
-  //      - externalDecoder        : The external decoder/renderer object.
-  //      - payloadType            : The payload type which this decoder should
-  //      be
-  //                                 registered to.
-  //
-  virtual void RegisterExternalDecoder(VideoDecoder* externalDecoder,
-                                       uint8_t payloadType) = 0;
-
-  // Register a receive callback. Will be called whenever there is a new frame
-  // ready
-  // for rendering.
-  //
-  // Input:
-  //      - receiveCallback        : The callback object to be used by the
-  //      module when a
-  //                                 frame is ready for rendering.
-  //                                 De-register with a NULL pointer.
-  //
-  // Return value      : VCM_OK, on success.
-  //                     < 0,    on error.
-  virtual int32_t RegisterReceiveCallback(
-      VCMReceiveCallback* receiveCallback) = 0;
-
-  // Register a receive statistics callback which will be called to deliver
-  // information
-  // about the video stream received by the receiving side of the VCM, for
-  // instance the
-  // average frame rate and bit rate.
-  //
-  // Input:
-  //      - receiveStats  : The callback object to register.
-  //
-  // Return value      : VCM_OK, on success.
-  //                     < 0,    on error.
-  virtual int32_t RegisterReceiveStatisticsCallback(
-      VCMReceiveStatisticsCallback* receiveStats) = 0;
-
-  // Register a frame type request callback. This callback will be called when
-  // the
-  // module needs to request specific frame types from the send side.
-  //
-  // Input:
-  //      - frameTypeCallback      : The callback object to be used by the
-  //      module when
-  //                                 requesting a specific type of frame from
-  //                                 the send side.
-  //                                 De-register with a NULL pointer.
-  //
-  // Return value      : VCM_OK, on success.
-  //                     < 0,    on error.
-  virtual int32_t RegisterFrameTypeCallback(
-      VCMFrameTypeCallback* frameTypeCallback) = 0;
-
-  // Registers a callback which is called whenever the receive side of the VCM
-  // encounters holes in the packet sequence and needs packets to be
-  // retransmitted.
-  //
-  // Input:
-  //              - callback      : The callback to be registered in the VCM.
-  //
-  // Return value     : VCM_OK,     on success.
-  //                    <0,         on error.
-  virtual int32_t RegisterPacketRequestCallback(
-      VCMPacketRequestCallback* callback) = 0;
-
-  // Waits for the next frame in the jitter buffer to become complete
-  // (waits no longer than maxWaitTimeMs), then passes it to the decoder for
-  // decoding.
-  // Should be called as often as possible to get the most out of the decoder.
-  //
-  // Return value      : VCM_OK, on success.
-  //                     < 0,    on error.
-  virtual int32_t Decode(uint16_t maxWaitTimeMs = 200) = 0;
-
-  // Insert a parsed packet into the receiver side of the module. Will be placed
-  // in the
-  // jitter buffer waiting for the frame to become complete. Returns as soon as
-  // the packet
-  // has been placed in the jitter buffer.
-  //
-  // Input:
-  //      - incomingPayload      : Payload of the packet.
-  //      - payloadLength        : Length of the payload.
-  //      - rtpInfo              : The parsed header.
-  //
-  // Return value      : VCM_OK, on success.
-  //                     < 0,    on error.
-  virtual int32_t IncomingPacket(const uint8_t* incomingPayload,
-                                 size_t payloadLength,
-                                 const WebRtcRTPHeader& rtpInfo) = 0;
-
-  // Minimum playout delay (Used for lip-sync). This is the minimum delay
-  // required
-  // to sync with audio. Not included in  VideoCodingModule::Delay()
-  // Defaults to 0 ms.
-  //
-  // Input:
-  //      - minPlayoutDelayMs   : Additional delay in ms.
-  //
-  // Return value      : VCM_OK, on success.
-  //                     < 0,    on error.
-  virtual int32_t SetMinimumPlayoutDelay(uint32_t minPlayoutDelayMs) = 0;
-
-  // Set the time required by the renderer to render a frame.
-  //
-  // Input:
-  //      - timeMS        : The time in ms required by the renderer to render a
-  //      frame.
-  //
-  // Return value      : VCM_OK, on success.
-  //                     < 0,    on error.
-  virtual int32_t SetRenderDelay(uint32_t timeMS) = 0;
-
-  // The total delay desired by the VCM. Can be less than the minimum
-  // delay set with SetMinimumPlayoutDelay.
-  //
-  // Return value      : Total delay in ms, on success.
-  //                     < 0,               on error.
-  virtual int32_t Delay() const = 0;
-
-  // Robustness APIs
-
-  // DEPRECATED.
-  // Set the receiver robustness mode. The mode decides how the receiver
-  // responds to losses in the stream. The type of counter-measure is selected
-  // through the robustnessMode parameter. The errorMode parameter decides if it
-  // is allowed to display frames corrupted by losses. Note that not all
-  // combinations of the two parameters are feasible. An error will be
-  // returned for invalid combinations.
-  // Input:
-  //      - robustnessMode : selected robustness mode.
-  //      - errorMode      : selected error mode.
-  //
-  // Return value      : VCM_OK, on success;
-  //                     < 0, on error.
-  enum ReceiverRobustness { kNone, kHardNack };
-  virtual int SetReceiverRobustnessMode(ReceiverRobustness robustnessMode,
-                                        VCMDecodeErrorMode errorMode) = 0;
-
-  // Set the decode error mode. The mode decides which errors (if any) are
-  // allowed in decodable frames. Note that setting decode_error_mode to
-  // anything other than kWithErrors without enabling nack will cause
-  // long-term freezes (resulting from frequent key frame requests) if
-  // packet loss occurs.
-  virtual void SetDecodeErrorMode(VCMDecodeErrorMode decode_error_mode) = 0;
-
-  // Sets the maximum number of sequence numbers that we are allowed to NACK
-  // and the oldest sequence number that we will consider to NACK. If a
-  // sequence number older than |max_packet_age_to_nack| is missing
-  // a key frame will be requested. A key frame will also be requested if the
-  // time of incomplete or non-continuous frames in the jitter buffer is above
-  // |max_incomplete_time_ms|.
-  virtual void SetNackSettings(size_t max_nack_list_size,
-                               int max_packet_age_to_nack,
-                               int max_incomplete_time_ms) = 0;
-
-  // Setting a desired delay to the VCM receiver. Video rendering will be
-  // delayed by at least desired_delay_ms.
-  virtual int SetMinReceiverDelay(int desired_delay_ms) = 0;
-
-  virtual void RegisterPostEncodeImageCallback(
-      EncodedImageCallback* post_encode_callback) = 0;
-  // Releases pending decode calls, permitting faster thread shutdown.
-  virtual void TriggerDecoderShutdown() = 0;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_VIDEO_CODING_INCLUDE_VIDEO_CODING_H_
diff --git a/modules/video_coding/include/video_coding_defines.h b/modules/video_coding/include/video_coding_defines.h
deleted file mode 100644
index 499aba7..0000000
--- a/modules/video_coding/include/video_coding_defines.h
+++ /dev/null
@@ -1,176 +0,0 @@
-/*
- *  Copyright (c) 2012 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_VIDEO_CODING_INCLUDE_VIDEO_CODING_DEFINES_H_
-#define WEBRTC_MODULES_VIDEO_CODING_INCLUDE_VIDEO_CODING_DEFINES_H_
-
-#include <string>
-#include <vector>
-
-#include "webrtc/api/video/video_frame.h"
-// For EncodedImage
-#include "webrtc/common_video/include/video_frame.h"
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-// Error codes
-#define VCM_FRAME_NOT_READY 3
-#define VCM_MISSING_CALLBACK 1
-#define VCM_OK 0
-#define VCM_GENERAL_ERROR -1
-#define VCM_LEVEL_EXCEEDED -2
-#define VCM_MEMORY -3
-#define VCM_PARAMETER_ERROR -4
-#define VCM_UNKNOWN_PAYLOAD -5
-#define VCM_CODEC_ERROR -6
-#define VCM_UNINITIALIZED -7
-#define VCM_NO_CODEC_REGISTERED -8
-#define VCM_JITTER_BUFFER_ERROR -9
-#define VCM_OLD_PACKET_ERROR -10
-#define VCM_NO_FRAME_DECODED -11
-#define VCM_NOT_IMPLEMENTED -20
-
-enum {
-  // Timing frames settings. Timing frames are sent every
-  // |kDefaultTimingFramesDelayMs|, or if the frame is at least
-  // |kDefaultOutliserFrameSizePercent| in size of average frame.
-  kDefaultTimingFramesDelayMs = 200,
-  kDefaultOutlierFrameSizePercent = 250,
-};
-
-enum VCMVideoProtection {
-  kProtectionNone,
-  kProtectionNack,
-  kProtectionFEC,
-  kProtectionNackFEC,
-};
-
-enum VCMTemporalDecimation {
-  kBitrateOverUseDecimation,
-};
-
-struct VCMFrameCount {
-  uint32_t numKeyFrames;
-  uint32_t numDeltaFrames;
-};
-
-// Callback class used for passing decoded frames which are ready to be
-// rendered.
-class VCMReceiveCallback {
- public:
-  virtual int32_t FrameToRender(VideoFrame& videoFrame,  // NOLINT
-                                rtc::Optional<uint8_t> qp,
-                                VideoContentType content_type) = 0;
-
-  virtual int32_t ReceivedDecodedReferenceFrame(const uint64_t pictureId) {
-    return -1;
-  }
-  // Called when the current receive codec changes.
-  virtual void OnIncomingPayloadType(int payload_type) {}
-  virtual void OnDecoderImplementationName(const char* implementation_name) {}
-
- protected:
-  virtual ~VCMReceiveCallback() {}
-};
-
-// Callback class used for informing the user of the bit rate and frame rate,
-// and the name of the encoder.
-class VCMSendStatisticsCallback {
- public:
-  virtual void SendStatistics(uint32_t bitRate, uint32_t frameRate) = 0;
-
- protected:
-  virtual ~VCMSendStatisticsCallback() {}
-};
-
-// Callback class used for informing the user of the incoming bit rate and frame
-// rate.
-class VCMReceiveStatisticsCallback {
- public:
-  virtual void OnReceiveRatesUpdated(uint32_t bitRate, uint32_t frameRate) = 0;
-  virtual void OnCompleteFrame(bool is_keyframe,
-                               size_t size_bytes,
-                               VideoContentType content_type) = 0;
-  virtual void OnDiscardedPacketsUpdated(int discarded_packets) = 0;
-  virtual void OnFrameCountsUpdated(const FrameCounts& frame_counts) = 0;
-  virtual void OnFrameBufferTimingsUpdated(int decode_ms,
-                                           int max_decode_ms,
-                                           int current_delay_ms,
-                                           int target_delay_ms,
-                                           int jitter_buffer_ms,
-                                           int min_playout_delay_ms,
-                                           int render_delay_ms) = 0;
-
-  virtual void OnTimingFrameInfoUpdated(const TimingFrameInfo& info) = 0;
-
- protected:
-  virtual ~VCMReceiveStatisticsCallback() {}
-};
-
-// Callback class used for telling the user about how to configure the FEC,
-// and the rates sent the last second is returned to the VCM.
-class VCMProtectionCallback {
- public:
-  virtual int ProtectionRequest(const FecProtectionParams* delta_params,
-                                const FecProtectionParams* key_params,
-                                uint32_t* sent_video_rate_bps,
-                                uint32_t* sent_nack_rate_bps,
-                                uint32_t* sent_fec_rate_bps) = 0;
-
- protected:
-  virtual ~VCMProtectionCallback() {}
-};
-
-// Callback class used for telling the user about what frame type needed to
-// continue decoding.
-// Typically a key frame when the stream has been corrupted in some way.
-class VCMFrameTypeCallback {
- public:
-  virtual int32_t RequestKeyFrame() = 0;
-
- protected:
-  virtual ~VCMFrameTypeCallback() {}
-};
-
-// Callback class used for telling the user about which packet sequence numbers
-// are currently
-// missing and need to be resent.
-// TODO(philipel): Deprecate VCMPacketRequestCallback
-//                 and use NackSender instead.
-class VCMPacketRequestCallback {
- public:
-  virtual int32_t ResendPackets(const uint16_t* sequenceNumbers,
-                                uint16_t length) = 0;
-
- protected:
-  virtual ~VCMPacketRequestCallback() {}
-};
-
-class NackSender {
- public:
-  virtual void SendNack(const std::vector<uint16_t>& sequence_numbers) = 0;
-
- protected:
-  virtual ~NackSender() {}
-};
-
-class KeyFrameRequestSender {
- public:
-  virtual void RequestKeyFrame() = 0;
-
- protected:
-  virtual ~KeyFrameRequestSender() {}
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_VIDEO_CODING_INCLUDE_VIDEO_CODING_DEFINES_H_
diff --git a/modules/video_coding/include/video_error_codes.h b/modules/video_coding/include/video_error_codes.h
deleted file mode 100644
index 360aa87..0000000
--- a/modules/video_coding/include/video_error_codes.h
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- *  Copyright (c) 2011 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_VIDEO_CODING_INCLUDE_VIDEO_ERROR_CODES_H_
-#define WEBRTC_MODULES_VIDEO_CODING_INCLUDE_VIDEO_ERROR_CODES_H_
-
-// NOTE: in sync with video_coding_module_defines.h
-
-// Define return values
-
-#define WEBRTC_VIDEO_CODEC_REQUEST_SLI 2
-#define WEBRTC_VIDEO_CODEC_NO_OUTPUT 1
-#define WEBRTC_VIDEO_CODEC_OK 0
-#define WEBRTC_VIDEO_CODEC_ERROR -1
-#define WEBRTC_VIDEO_CODEC_LEVEL_EXCEEDED -2
-#define WEBRTC_VIDEO_CODEC_MEMORY -3
-#define WEBRTC_VIDEO_CODEC_ERR_PARAMETER -4
-#define WEBRTC_VIDEO_CODEC_ERR_SIZE -5
-#define WEBRTC_VIDEO_CODEC_TIMEOUT -6
-#define WEBRTC_VIDEO_CODEC_UNINITIALIZED -7
-#define WEBRTC_VIDEO_CODEC_ERR_REQUEST_SLI -12
-#define WEBRTC_VIDEO_CODEC_FALLBACK_SOFTWARE -13
-#define WEBRTC_VIDEO_CODEC_TARGET_BITRATE_OVERSHOOT -14
-
-#endif  // WEBRTC_MODULES_VIDEO_CODING_INCLUDE_VIDEO_ERROR_CODES_H_
diff --git a/modules/video_coding/inter_frame_delay.cc b/modules/video_coding/inter_frame_delay.cc
deleted file mode 100644
index fb3b54d..0000000
--- a/modules/video_coding/inter_frame_delay.cc
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- *  Copyright (c) 2011 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/video_coding/inter_frame_delay.h"
-
-namespace webrtc {
-
-VCMInterFrameDelay::VCMInterFrameDelay(int64_t currentWallClock) {
-  Reset(currentWallClock);
-}
-
-// Resets the delay estimate
-void VCMInterFrameDelay::Reset(int64_t currentWallClock) {
-  _zeroWallClock = currentWallClock;
-  _wrapArounds = 0;
-  _prevWallClock = 0;
-  _prevTimestamp = 0;
-  _dTS = 0;
-}
-
-// Calculates the delay of a frame with the given timestamp.
-// This method is called when the frame is complete.
-bool VCMInterFrameDelay::CalculateDelay(uint32_t timestamp,
-                                        int64_t* delay,
-                                        int64_t currentWallClock) {
-  if (_prevWallClock == 0) {
-    // First set of data, initialization, wait for next frame
-    _prevWallClock = currentWallClock;
-    _prevTimestamp = timestamp;
-    *delay = 0;
-    return true;
-  }
-
-  int32_t prevWrapArounds = _wrapArounds;
-  CheckForWrapArounds(timestamp);
-
-  // This will be -1 for backward wrap arounds and +1 for forward wrap arounds
-  int32_t wrapAroundsSincePrev = _wrapArounds - prevWrapArounds;
-
-  // Account for reordering in jitter variance estimate in the future?
-  // Note that this also captures incomplete frames which are grabbed
-  // for decoding after a later frame has been complete, i.e. real
-  // packet losses.
-  if ((wrapAroundsSincePrev == 0 && timestamp < _prevTimestamp) ||
-      wrapAroundsSincePrev < 0) {
-    *delay = 0;
-    return false;
-  }
-
-  // Compute the compensated timestamp difference and convert it to ms and
-  // round it to closest integer.
-  _dTS = static_cast<int64_t>(
-      (timestamp + wrapAroundsSincePrev * (static_cast<int64_t>(1) << 32) -
-       _prevTimestamp) /
-          90.0 +
-      0.5);
-
-  // frameDelay is the difference of dT and dTS -- i.e. the difference of
-  // the wall clock time difference and the timestamp difference between
-  // two following frames.
-  *delay = static_cast<int64_t>(currentWallClock - _prevWallClock - _dTS);
-
-  _prevTimestamp = timestamp;
-  _prevWallClock = currentWallClock;
-
-  return true;
-}
-
-// Returns the current difference between incoming timestamps
-uint32_t VCMInterFrameDelay::CurrentTimeStampDiffMs() const {
-  if (_dTS < 0) {
-    return 0;
-  }
-  return static_cast<uint32_t>(_dTS);
-}
-
-// Investigates if the timestamp clock has overflowed since the last timestamp
-// and
-// keeps track of the number of wrap arounds since reset.
-void VCMInterFrameDelay::CheckForWrapArounds(uint32_t timestamp) {
-  if (timestamp < _prevTimestamp) {
-    // This difference will probably be less than -2^31 if we have had a wrap
-    // around
-    // (e.g. timestamp = 1, _previousTimestamp = 2^32 - 1). Since it is cast to
-    // a Word32,
-    // it should be positive.
-    if (static_cast<int32_t>(timestamp - _prevTimestamp) > 0) {
-      // Forward wrap around
-      _wrapArounds++;
-    }
-    // This difference will probably be less than -2^31 if we have had a
-    // backward
-    // wrap around.
-    // Since it is cast to a Word32, it should be positive.
-  } else if (static_cast<int32_t>(_prevTimestamp - timestamp) > 0) {
-    // Backward wrap around
-    _wrapArounds--;
-  }
-}
-}  // namespace webrtc
diff --git a/modules/video_coding/inter_frame_delay.h b/modules/video_coding/inter_frame_delay.h
deleted file mode 100644
index 94b7390..0000000
--- a/modules/video_coding/inter_frame_delay.h
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- *  Copyright (c) 2011 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_VIDEO_CODING_INTER_FRAME_DELAY_H_
-#define WEBRTC_MODULES_VIDEO_CODING_INTER_FRAME_DELAY_H_
-
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-class VCMInterFrameDelay {
- public:
-  explicit VCMInterFrameDelay(int64_t currentWallClock);
-
-  // Resets the estimate. Zeros are given as parameters.
-  void Reset(int64_t currentWallClock);
-
-  // Calculates the delay of a frame with the given timestamp.
-  // This method is called when the frame is complete.
-  //
-  // Input:
-  //          - timestamp         : RTP timestamp of a received frame
-  //          - *delay            : Pointer to memory where the result should be
-  //          stored
-  //          - currentWallClock  : The current time in milliseconds.
-  //                                Should be -1 for normal operation, only used
-  //                                for testing.
-  // Return value                 : true if OK, false when reordered timestamps
-  bool CalculateDelay(uint32_t timestamp,
-                      int64_t* delay,
-                      int64_t currentWallClock);
-
-  // Returns the current difference between incoming timestamps
-  //
-  // Return value                 : Wrap-around compensated difference between
-  // incoming
-  //                                timestamps.
-  uint32_t CurrentTimeStampDiffMs() const;
-
- private:
-  // Controls if the RTP timestamp counter has had a wrap around
-  // between the current and the previously received frame.
-  //
-  // Input:
-  //          - timestmap         : RTP timestamp of the current frame.
-  void CheckForWrapArounds(uint32_t timestamp);
-
-  int64_t _zeroWallClock;  // Local timestamp of the first video packet received
-  int32_t _wrapArounds;    // Number of wrapArounds detected
-  // The previous timestamp passed to the delay estimate
-  uint32_t _prevTimestamp;
-  // The previous wall clock timestamp used by the delay estimate
-  int64_t _prevWallClock;
-  // Wrap-around compensated difference between incoming timestamps
-  int64_t _dTS;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_VIDEO_CODING_INTER_FRAME_DELAY_H_
diff --git a/modules/video_coding/internal_defines.h b/modules/video_coding/internal_defines.h
deleted file mode 100644
index e225726..0000000
--- a/modules/video_coding/internal_defines.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- *  Copyright (c) 2011 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_VIDEO_CODING_INTERNAL_DEFINES_H_
-#define WEBRTC_MODULES_VIDEO_CODING_INTERNAL_DEFINES_H_
-
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-#define MASK_32_BITS(x) (0xFFFFFFFF & (x))
-
-inline uint32_t MaskWord64ToUWord32(int64_t w64) {
-  return static_cast<uint32_t>(MASK_32_BITS(w64));
-}
-
-#define VCM_MAX(a, b) (((a) > (b)) ? (a) : (b))
-#define VCM_MIN(a, b) (((a) < (b)) ? (a) : (b))
-
-#define VCM_DEFAULT_CODEC_WIDTH 352
-#define VCM_DEFAULT_CODEC_HEIGHT 288
-#define VCM_DEFAULT_FRAME_RATE 30
-#define VCM_MIN_BITRATE 30
-#define VCM_FLUSH_INDICATOR 4
-
-#define VCM_NO_RECEIVER_ID 0
-
-inline int32_t VCMId(const int32_t vcmId, const int32_t receiverId = 0) {
-  return static_cast<int32_t>((vcmId << 16) + receiverId);
-}
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_VIDEO_CODING_INTERNAL_DEFINES_H_
diff --git a/modules/video_coding/jitter_buffer.cc b/modules/video_coding/jitter_buffer.cc
deleted file mode 100644
index a556080..0000000
--- a/modules/video_coding/jitter_buffer.cc
+++ /dev/null
@@ -1,1307 +0,0 @@
-/*
- *  Copyright (c) 2012 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/video_coding/jitter_buffer.h"
-
-#include <assert.h>
-
-#include <algorithm>
-#include <limits>
-#include <utility>
-
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
-#include "webrtc/modules/video_coding/frame_buffer.h"
-#include "webrtc/modules/video_coding/include/video_coding.h"
-#include "webrtc/modules/video_coding/inter_frame_delay.h"
-#include "webrtc/modules/video_coding/internal_defines.h"
-#include "webrtc/modules/video_coding/jitter_buffer_common.h"
-#include "webrtc/modules/video_coding/jitter_estimator.h"
-#include "webrtc/modules/video_coding/packet.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/trace_event.h"
-#include "webrtc/system_wrappers/include/clock.h"
-#include "webrtc/system_wrappers/include/event_wrapper.h"
-#include "webrtc/system_wrappers/include/field_trial.h"
-#include "webrtc/system_wrappers/include/metrics.h"
-
-namespace webrtc {
-// Interval for updating SS data.
-static const uint32_t kSsCleanupIntervalSec = 60;
-
-// Use this rtt if no value has been reported.
-static const int64_t kDefaultRtt = 200;
-
-// Request a keyframe if no continuous frame has been received for this
-// number of milliseconds and NACKs are disabled.
-static const int64_t kMaxDiscontinuousFramesTime = 1000;
-
-typedef std::pair<uint32_t, VCMFrameBuffer*> FrameListPair;
-
-bool IsKeyFrame(FrameListPair pair) {
-  return pair.second->FrameType() == kVideoFrameKey;
-}
-
-bool HasNonEmptyState(FrameListPair pair) {
-  return pair.second->GetState() != kStateEmpty;
-}
-
-void FrameList::InsertFrame(VCMFrameBuffer* frame) {
-  insert(rbegin().base(), FrameListPair(frame->TimeStamp(), frame));
-}
-
-VCMFrameBuffer* FrameList::PopFrame(uint32_t timestamp) {
-  FrameList::iterator it = find(timestamp);
-  if (it == end())
-    return NULL;
-  VCMFrameBuffer* frame = it->second;
-  erase(it);
-  return frame;
-}
-
-VCMFrameBuffer* FrameList::Front() const {
-  return begin()->second;
-}
-
-VCMFrameBuffer* FrameList::Back() const {
-  return rbegin()->second;
-}
-
-int FrameList::RecycleFramesUntilKeyFrame(FrameList::iterator* key_frame_it,
-                                          UnorderedFrameList* free_frames) {
-  int drop_count = 0;
-  FrameList::iterator it = begin();
-  while (!empty()) {
-    // Throw at least one frame.
-    it->second->Reset();
-    free_frames->push_back(it->second);
-    erase(it++);
-    ++drop_count;
-    if (it != end() && it->second->FrameType() == kVideoFrameKey) {
-      *key_frame_it = it;
-      return drop_count;
-    }
-  }
-  *key_frame_it = end();
-  return drop_count;
-}
-
-void FrameList::CleanUpOldOrEmptyFrames(VCMDecodingState* decoding_state,
-                                        UnorderedFrameList* free_frames) {
-  while (!empty()) {
-    VCMFrameBuffer* oldest_frame = Front();
-    bool remove_frame = false;
-    if (oldest_frame->GetState() == kStateEmpty && size() > 1) {
-      // This frame is empty, try to update the last decoded state and drop it
-      // if successful.
-      remove_frame = decoding_state->UpdateEmptyFrame(oldest_frame);
-    } else {
-      remove_frame = decoding_state->IsOldFrame(oldest_frame);
-    }
-    if (!remove_frame) {
-      break;
-    }
-    free_frames->push_back(oldest_frame);
-    TRACE_EVENT_INSTANT1("webrtc", "JB::OldOrEmptyFrameDropped", "timestamp",
-                         oldest_frame->TimeStamp());
-    erase(begin());
-  }
-}
-
-void FrameList::Reset(UnorderedFrameList* free_frames) {
-  while (!empty()) {
-    begin()->second->Reset();
-    free_frames->push_back(begin()->second);
-    erase(begin());
-  }
-}
-
-bool Vp9SsMap::Insert(const VCMPacket& packet) {
-  if (!packet.video_header.codecHeader.VP9.ss_data_available)
-    return false;
-
-  ss_map_[packet.timestamp] = packet.video_header.codecHeader.VP9.gof;
-  return true;
-}
-
-void Vp9SsMap::Reset() {
-  ss_map_.clear();
-}
-
-bool Vp9SsMap::Find(uint32_t timestamp, SsMap::iterator* it_out) {
-  bool found = false;
-  for (SsMap::iterator it = ss_map_.begin(); it != ss_map_.end(); ++it) {
-    if (it->first == timestamp || IsNewerTimestamp(timestamp, it->first)) {
-      *it_out = it;
-      found = true;
-    }
-  }
-  return found;
-}
-
-void Vp9SsMap::RemoveOld(uint32_t timestamp) {
-  if (!TimeForCleanup(timestamp))
-    return;
-
-  SsMap::iterator it;
-  if (!Find(timestamp, &it))
-    return;
-
-  ss_map_.erase(ss_map_.begin(), it);
-  AdvanceFront(timestamp);
-}
-
-bool Vp9SsMap::TimeForCleanup(uint32_t timestamp) const {
-  if (ss_map_.empty() || !IsNewerTimestamp(timestamp, ss_map_.begin()->first))
-    return false;
-
-  uint32_t diff = timestamp - ss_map_.begin()->first;
-  return diff / kVideoPayloadTypeFrequency >= kSsCleanupIntervalSec;
-}
-
-void Vp9SsMap::AdvanceFront(uint32_t timestamp) {
-  RTC_DCHECK(!ss_map_.empty());
-  GofInfoVP9 gof = ss_map_.begin()->second;
-  ss_map_.erase(ss_map_.begin());
-  ss_map_[timestamp] = gof;
-}
-
-// TODO(asapersson): Update according to updates in RTP payload profile.
-bool Vp9SsMap::UpdatePacket(VCMPacket* packet) {
-  uint8_t gof_idx = packet->video_header.codecHeader.VP9.gof_idx;
-  if (gof_idx == kNoGofIdx)
-    return false;  // No update needed.
-
-  SsMap::iterator it;
-  if (!Find(packet->timestamp, &it))
-    return false;  // Corresponding SS not yet received.
-
-  if (gof_idx >= it->second.num_frames_in_gof)
-    return false;  // Assume corresponding SS not yet received.
-
-  RTPVideoHeaderVP9* vp9 = &packet->video_header.codecHeader.VP9;
-  vp9->temporal_idx = it->second.temporal_idx[gof_idx];
-  vp9->temporal_up_switch = it->second.temporal_up_switch[gof_idx];
-
-  // TODO(asapersson): Set vp9.ref_picture_id[i] and add usage.
-  vp9->num_ref_pics = it->second.num_ref_pics[gof_idx];
-  for (uint8_t i = 0; i < it->second.num_ref_pics[gof_idx]; ++i) {
-    vp9->pid_diff[i] = it->second.pid_diff[gof_idx][i];
-  }
-  return true;
-}
-
-void Vp9SsMap::UpdateFrames(FrameList* frames) {
-  for (const auto& frame_it : *frames) {
-    uint8_t gof_idx =
-        frame_it.second->CodecSpecific()->codecSpecific.VP9.gof_idx;
-    if (gof_idx == kNoGofIdx) {
-      continue;
-    }
-    SsMap::iterator ss_it;
-    if (Find(frame_it.second->TimeStamp(), &ss_it)) {
-      if (gof_idx >= ss_it->second.num_frames_in_gof) {
-        continue;  // Assume corresponding SS not yet received.
-      }
-      frame_it.second->SetGofInfo(ss_it->second, gof_idx);
-    }
-  }
-}
-
-VCMJitterBuffer::VCMJitterBuffer(Clock* clock,
-                                 std::unique_ptr<EventWrapper> event,
-                                 NackSender* nack_sender,
-                                 KeyFrameRequestSender* keyframe_request_sender)
-    : clock_(clock),
-      running_(false),
-      frame_event_(std::move(event)),
-      max_number_of_frames_(kStartNumberOfFrames),
-      free_frames_(),
-      decodable_frames_(),
-      incomplete_frames_(),
-      last_decoded_state_(),
-      first_packet_since_reset_(true),
-      stats_callback_(nullptr),
-      incoming_frame_rate_(0),
-      incoming_frame_count_(0),
-      time_last_incoming_frame_count_(0),
-      incoming_bit_count_(0),
-      incoming_bit_rate_(0),
-      num_consecutive_old_packets_(0),
-      num_packets_(0),
-      num_duplicated_packets_(0),
-      num_discarded_packets_(0),
-      time_first_packet_ms_(0),
-      jitter_estimate_(clock),
-      inter_frame_delay_(clock_->TimeInMilliseconds()),
-      rtt_ms_(kDefaultRtt),
-      nack_mode_(kNoNack),
-      low_rtt_nack_threshold_ms_(-1),
-      high_rtt_nack_threshold_ms_(-1),
-      missing_sequence_numbers_(SequenceNumberLessThan()),
-      latest_received_sequence_number_(0),
-      max_nack_list_size_(0),
-      max_packet_age_to_nack_(0),
-      max_incomplete_time_ms_(0),
-      decode_error_mode_(kNoErrors),
-      average_packets_per_frame_(0.0f),
-      frame_counter_(0) {
-  for (int i = 0; i < kStartNumberOfFrames; i++)
-    free_frames_.push_back(new VCMFrameBuffer());
-}
-
-VCMJitterBuffer::~VCMJitterBuffer() {
-  Stop();
-  for (UnorderedFrameList::iterator it = free_frames_.begin();
-       it != free_frames_.end(); ++it) {
-    delete *it;
-  }
-  for (FrameList::iterator it = incomplete_frames_.begin();
-       it != incomplete_frames_.end(); ++it) {
-    delete it->second;
-  }
-  for (FrameList::iterator it = decodable_frames_.begin();
-       it != decodable_frames_.end(); ++it) {
-    delete it->second;
-  }
-}
-
-void VCMJitterBuffer::UpdateHistograms() {
-  if (num_packets_ <= 0 || !running_) {
-    return;
-  }
-  int64_t elapsed_sec =
-      (clock_->TimeInMilliseconds() - time_first_packet_ms_) / 1000;
-  if (elapsed_sec < metrics::kMinRunTimeInSeconds) {
-    return;
-  }
-
-  RTC_HISTOGRAM_PERCENTAGE("WebRTC.Video.DiscardedPacketsInPercent",
-                           num_discarded_packets_ * 100 / num_packets_);
-  RTC_HISTOGRAM_PERCENTAGE("WebRTC.Video.DuplicatedPacketsInPercent",
-                           num_duplicated_packets_ * 100 / num_packets_);
-
-  int total_frames =
-      receive_statistics_.key_frames + receive_statistics_.delta_frames;
-  if (total_frames > 0) {
-    RTC_HISTOGRAM_COUNTS_100(
-        "WebRTC.Video.CompleteFramesReceivedPerSecond",
-        static_cast<int>((total_frames / elapsed_sec) + 0.5f));
-    RTC_HISTOGRAM_COUNTS_1000(
-        "WebRTC.Video.KeyFramesReceivedInPermille",
-        static_cast<int>(
-            (receive_statistics_.key_frames * 1000.0f / total_frames) + 0.5f));
-  }
-}
-
-void VCMJitterBuffer::Start() {
-  rtc::CritScope cs(&crit_sect_);
-  running_ = true;
-  incoming_frame_count_ = 0;
-  incoming_frame_rate_ = 0;
-  incoming_bit_count_ = 0;
-  incoming_bit_rate_ = 0;
-  time_last_incoming_frame_count_ = clock_->TimeInMilliseconds();
-  receive_statistics_ = FrameCounts();
-
-  num_consecutive_old_packets_ = 0;
-  num_packets_ = 0;
-  num_duplicated_packets_ = 0;
-  num_discarded_packets_ = 0;
-  time_first_packet_ms_ = 0;
-
-  // Start in a non-signaled state.
-  waiting_for_completion_.frame_size = 0;
-  waiting_for_completion_.timestamp = 0;
-  waiting_for_completion_.latest_packet_time = -1;
-  first_packet_since_reset_ = true;
-  rtt_ms_ = kDefaultRtt;
-  last_decoded_state_.Reset();
-
-  decodable_frames_.Reset(&free_frames_);
-  incomplete_frames_.Reset(&free_frames_);
-}
-
-void VCMJitterBuffer::Stop() {
-  rtc::CritScope cs(&crit_sect_);
-  UpdateHistograms();
-  running_ = false;
-  last_decoded_state_.Reset();
-
-  // Make sure we wake up any threads waiting on these events.
-  frame_event_->Set();
-}
-
-bool VCMJitterBuffer::Running() const {
-  rtc::CritScope cs(&crit_sect_);
-  return running_;
-}
-
-void VCMJitterBuffer::Flush() {
-  rtc::CritScope cs(&crit_sect_);
-  decodable_frames_.Reset(&free_frames_);
-  incomplete_frames_.Reset(&free_frames_);
-  last_decoded_state_.Reset();  // TODO(mikhal): sync reset.
-  num_consecutive_old_packets_ = 0;
-  // Also reset the jitter and delay estimates
-  jitter_estimate_.Reset();
-  inter_frame_delay_.Reset(clock_->TimeInMilliseconds());
-  waiting_for_completion_.frame_size = 0;
-  waiting_for_completion_.timestamp = 0;
-  waiting_for_completion_.latest_packet_time = -1;
-  first_packet_since_reset_ = true;
-  missing_sequence_numbers_.clear();
-}
-
-// Get received key and delta frames
-FrameCounts VCMJitterBuffer::FrameStatistics() const {
-  rtc::CritScope cs(&crit_sect_);
-  return receive_statistics_;
-}
-
-int VCMJitterBuffer::num_packets() const {
-  rtc::CritScope cs(&crit_sect_);
-  return num_packets_;
-}
-
-int VCMJitterBuffer::num_duplicated_packets() const {
-  rtc::CritScope cs(&crit_sect_);
-  return num_duplicated_packets_;
-}
-
-int VCMJitterBuffer::num_discarded_packets() const {
-  rtc::CritScope cs(&crit_sect_);
-  return num_discarded_packets_;
-}
-
-// Calculate framerate and bitrate.
-void VCMJitterBuffer::IncomingRateStatistics(unsigned int* framerate,
-                                             unsigned int* bitrate) {
-  assert(framerate);
-  assert(bitrate);
-  rtc::CritScope cs(&crit_sect_);
-  const int64_t now = clock_->TimeInMilliseconds();
-  int64_t diff = now - time_last_incoming_frame_count_;
-  if (diff < 1000 && incoming_frame_rate_ > 0 && incoming_bit_rate_ > 0) {
-    // Make sure we report something even though less than
-    // 1 second has passed since last update.
-    *framerate = incoming_frame_rate_;
-    *bitrate = incoming_bit_rate_;
-  } else if (incoming_frame_count_ != 0) {
-    // We have received frame(s) since last call to this function
-
-    // Prepare calculations
-    if (diff <= 0) {
-      diff = 1;
-    }
-    // we add 0.5f for rounding
-    float rate = 0.5f + ((incoming_frame_count_ * 1000.0f) / diff);
-    if (rate < 1.0f) {
-      rate = 1.0f;
-    }
-
-    // Calculate frame rate
-    // Let r be rate.
-    // r(0) = 1000*framecount/delta_time.
-    // (I.e. frames per second since last calculation.)
-    // frame_rate = r(0)/2 + r(-1)/2
-    // (I.e. fr/s average this and the previous calculation.)
-    *framerate = (incoming_frame_rate_ + static_cast<unsigned int>(rate)) / 2;
-    incoming_frame_rate_ = static_cast<unsigned int>(rate);
-
-    // Calculate bit rate
-    if (incoming_bit_count_ == 0) {
-      *bitrate = 0;
-    } else {
-      *bitrate =
-          10 * ((100 * incoming_bit_count_) / static_cast<unsigned int>(diff));
-    }
-    incoming_bit_rate_ = *bitrate;
-
-    // Reset count
-    incoming_frame_count_ = 0;
-    incoming_bit_count_ = 0;
-    time_last_incoming_frame_count_ = now;
-
-  } else {
-    // No frames since last call
-    time_last_incoming_frame_count_ = clock_->TimeInMilliseconds();
-    *framerate = 0;
-    *bitrate = 0;
-    incoming_frame_rate_ = 0;
-    incoming_bit_rate_ = 0;
-  }
-}
-
-// Returns immediately or a |max_wait_time_ms| ms event hang waiting for a
-// complete frame, |max_wait_time_ms| decided by caller.
-VCMEncodedFrame* VCMJitterBuffer::NextCompleteFrame(uint32_t max_wait_time_ms) {
-  crit_sect_.Enter();
-  if (!running_) {
-    crit_sect_.Leave();
-    return nullptr;
-  }
-  CleanUpOldOrEmptyFrames();
-
-  if (decodable_frames_.empty() ||
-      decodable_frames_.Front()->GetState() != kStateComplete) {
-    const int64_t end_wait_time_ms =
-        clock_->TimeInMilliseconds() + max_wait_time_ms;
-    int64_t wait_time_ms = max_wait_time_ms;
-    while (wait_time_ms > 0) {
-      crit_sect_.Leave();
-      const EventTypeWrapper ret =
-          frame_event_->Wait(static_cast<uint32_t>(wait_time_ms));
-      crit_sect_.Enter();
-      if (ret == kEventSignaled) {
-        // Are we shutting down the jitter buffer?
-        if (!running_) {
-          crit_sect_.Leave();
-          return nullptr;
-        }
-        // Finding oldest frame ready for decoder.
-        CleanUpOldOrEmptyFrames();
-        if (decodable_frames_.empty() ||
-            decodable_frames_.Front()->GetState() != kStateComplete) {
-          wait_time_ms = end_wait_time_ms - clock_->TimeInMilliseconds();
-        } else {
-          break;
-        }
-      } else {
-        break;
-      }
-    }
-  }
-  if (decodable_frames_.empty() ||
-      decodable_frames_.Front()->GetState() != kStateComplete) {
-    crit_sect_.Leave();
-    return nullptr;
-  }
-  VCMEncodedFrame* encoded_frame = decodable_frames_.Front();
-  crit_sect_.Leave();
-  return encoded_frame;
-}
-
-bool VCMJitterBuffer::NextMaybeIncompleteTimestamp(uint32_t* timestamp) {
-  rtc::CritScope cs(&crit_sect_);
-  if (!running_) {
-    return false;
-  }
-  if (decode_error_mode_ == kNoErrors) {
-    // No point to continue, as we are not decoding with errors.
-    return false;
-  }
-
-  CleanUpOldOrEmptyFrames();
-
-  VCMFrameBuffer* oldest_frame;
-  if (decodable_frames_.empty()) {
-    if (nack_mode_ != kNoNack || incomplete_frames_.size() <= 1) {
-      return false;
-    }
-    oldest_frame = incomplete_frames_.Front();
-    // Frame will only be removed from buffer if it is complete (or decodable).
-    if (oldest_frame->GetState() < kStateComplete) {
-      return false;
-    }
-  } else {
-    oldest_frame = decodable_frames_.Front();
-    // If we have exactly one frame in the buffer, release it only if it is
-    // complete. We know decodable_frames_ is  not empty due to the previous
-    // check.
-    if (decodable_frames_.size() == 1 && incomplete_frames_.empty() &&
-        oldest_frame->GetState() != kStateComplete) {
-      return false;
-    }
-  }
-
-  *timestamp = oldest_frame->TimeStamp();
-  return true;
-}
-
-VCMEncodedFrame* VCMJitterBuffer::ExtractAndSetDecode(uint32_t timestamp) {
-  rtc::CritScope cs(&crit_sect_);
-  if (!running_) {
-    return NULL;
-  }
-  // Extract the frame with the desired timestamp.
-  VCMFrameBuffer* frame = decodable_frames_.PopFrame(timestamp);
-  bool continuous = true;
-  if (!frame) {
-    frame = incomplete_frames_.PopFrame(timestamp);
-    if (frame)
-      continuous = last_decoded_state_.ContinuousFrame(frame);
-    else
-      return NULL;
-  }
-  TRACE_EVENT_ASYNC_STEP0("webrtc", "Video", timestamp, "Extract");
-  // Frame pulled out from jitter buffer, update the jitter estimate.
-  const bool retransmitted = (frame->GetNackCount() > 0);
-  if (retransmitted) {
-    if (WaitForRetransmissions())
-      jitter_estimate_.FrameNacked();
-  } else if (frame->Length() > 0) {
-    // Ignore retransmitted and empty frames.
-    if (waiting_for_completion_.latest_packet_time >= 0) {
-      UpdateJitterEstimate(waiting_for_completion_, true);
-    }
-    if (frame->GetState() == kStateComplete) {
-      UpdateJitterEstimate(*frame, false);
-    } else {
-      // Wait for this one to get complete.
-      waiting_for_completion_.frame_size = frame->Length();
-      waiting_for_completion_.latest_packet_time = frame->LatestPacketTimeMs();
-      waiting_for_completion_.timestamp = frame->TimeStamp();
-    }
-  }
-
-  // The state must be changed to decoding before cleaning up zero sized
-  // frames to avoid empty frames being cleaned up and then given to the
-  // decoder. Propagates the missing_frame bit.
-  frame->PrepareForDecode(continuous);
-
-  // We have a frame - update the last decoded state and nack list.
-  last_decoded_state_.SetState(frame);
-  DropPacketsFromNackList(last_decoded_state_.sequence_num());
-
-  if ((*frame).IsSessionComplete())
-    UpdateAveragePacketsPerFrame(frame->NumPackets());
-
-  return frame;
-}
-
-// Release frame when done with decoding. Should never be used to release
-// frames from within the jitter buffer.
-void VCMJitterBuffer::ReleaseFrame(VCMEncodedFrame* frame) {
-  RTC_CHECK(frame != nullptr);
-  rtc::CritScope cs(&crit_sect_);
-  VCMFrameBuffer* frame_buffer = static_cast<VCMFrameBuffer*>(frame);
-  RecycleFrameBuffer(frame_buffer);
-}
-
-// Gets frame to use for this timestamp. If no match, get empty frame.
-VCMFrameBufferEnum VCMJitterBuffer::GetFrame(const VCMPacket& packet,
-                                             VCMFrameBuffer** frame,
-                                             FrameList** frame_list) {
-  *frame = incomplete_frames_.PopFrame(packet.timestamp);
-  if (*frame != NULL) {
-    *frame_list = &incomplete_frames_;
-    return kNoError;
-  }
-  *frame = decodable_frames_.PopFrame(packet.timestamp);
-  if (*frame != NULL) {
-    *frame_list = &decodable_frames_;
-    return kNoError;
-  }
-
-  *frame_list = NULL;
-  // No match, return empty frame.
-  *frame = GetEmptyFrame();
-  if (*frame == NULL) {
-    // No free frame! Try to reclaim some...
-    LOG(LS_WARNING) << "Unable to get empty frame; Recycling.";
-    bool found_key_frame = RecycleFramesUntilKeyFrame();
-    *frame = GetEmptyFrame();
-    RTC_CHECK(*frame);
-    if (!found_key_frame) {
-      RecycleFrameBuffer(*frame);
-      return kFlushIndicator;
-    }
-  }
-  (*frame)->Reset();
-  return kNoError;
-}
-
-int64_t VCMJitterBuffer::LastPacketTime(const VCMEncodedFrame* frame,
-                                        bool* retransmitted) const {
-  assert(retransmitted);
-  rtc::CritScope cs(&crit_sect_);
-  const VCMFrameBuffer* frame_buffer =
-      static_cast<const VCMFrameBuffer*>(frame);
-  *retransmitted = (frame_buffer->GetNackCount() > 0);
-  return frame_buffer->LatestPacketTimeMs();
-}
-
-VCMFrameBufferEnum VCMJitterBuffer::InsertPacket(const VCMPacket& packet,
-                                                 bool* retransmitted) {
-  rtc::CritScope cs(&crit_sect_);
-
-  ++num_packets_;
-  if (num_packets_ == 1) {
-    time_first_packet_ms_ = clock_->TimeInMilliseconds();
-  }
-  // Does this packet belong to an old frame?
-  if (last_decoded_state_.IsOldPacket(&packet)) {
-    // Account only for media packets.
-    if (packet.sizeBytes > 0) {
-      num_discarded_packets_++;
-      num_consecutive_old_packets_++;
-      if (stats_callback_ != NULL)
-        stats_callback_->OnDiscardedPacketsUpdated(num_discarded_packets_);
-    }
-    // Update last decoded sequence number if the packet arrived late and
-    // belongs to a frame with a timestamp equal to the last decoded
-    // timestamp.
-    last_decoded_state_.UpdateOldPacket(&packet);
-    DropPacketsFromNackList(last_decoded_state_.sequence_num());
-
-    // Also see if this old packet made more incomplete frames continuous.
-    FindAndInsertContinuousFramesWithState(last_decoded_state_);
-
-    if (num_consecutive_old_packets_ > kMaxConsecutiveOldPackets) {
-      LOG(LS_WARNING)
-          << num_consecutive_old_packets_
-          << " consecutive old packets received. Flushing the jitter buffer.";
-      Flush();
-      return kFlushIndicator;
-    }
-    return kOldPacket;
-  }
-
-  num_consecutive_old_packets_ = 0;
-
-  VCMFrameBuffer* frame;
-  FrameList* frame_list;
-  const VCMFrameBufferEnum error = GetFrame(packet, &frame, &frame_list);
-  if (error != kNoError)
-    return error;
-
-  int64_t now_ms = clock_->TimeInMilliseconds();
-  // We are keeping track of the first and latest seq numbers, and
-  // the number of wraps to be able to calculate how many packets we expect.
-  if (first_packet_since_reset_) {
-    // Now it's time to start estimating jitter
-    // reset the delay estimate.
-    inter_frame_delay_.Reset(now_ms);
-  }
-
-  // Empty packets may bias the jitter estimate (lacking size component),
-  // therefore don't let empty packet trigger the following updates:
-  if (packet.frameType != kEmptyFrame) {
-    if (waiting_for_completion_.timestamp == packet.timestamp) {
-      // This can get bad if we have a lot of duplicate packets,
-      // we will then count some packet multiple times.
-      waiting_for_completion_.frame_size += packet.sizeBytes;
-      waiting_for_completion_.latest_packet_time = now_ms;
-    } else if (waiting_for_completion_.latest_packet_time >= 0 &&
-               waiting_for_completion_.latest_packet_time + 2000 <= now_ms) {
-      // A packet should never be more than two seconds late
-      UpdateJitterEstimate(waiting_for_completion_, true);
-      waiting_for_completion_.latest_packet_time = -1;
-      waiting_for_completion_.frame_size = 0;
-      waiting_for_completion_.timestamp = 0;
-    }
-  }
-
-  VCMFrameBufferStateEnum previous_state = frame->GetState();
-  // Insert packet.
-  FrameData frame_data;
-  frame_data.rtt_ms = rtt_ms_;
-  frame_data.rolling_average_packets_per_frame = average_packets_per_frame_;
-  VCMFrameBufferEnum buffer_state =
-      frame->InsertPacket(packet, now_ms, decode_error_mode_, frame_data);
-
-  if (previous_state != kStateComplete) {
-    TRACE_EVENT_ASYNC_BEGIN1("webrtc", "Video", frame->TimeStamp(), "timestamp",
-                             frame->TimeStamp());
-  }
-
-  if (buffer_state > 0) {
-    incoming_bit_count_ += packet.sizeBytes << 3;
-    if (first_packet_since_reset_) {
-      latest_received_sequence_number_ = packet.seqNum;
-      first_packet_since_reset_ = false;
-    } else {
-      if (IsPacketRetransmitted(packet)) {
-        frame->IncrementNackCount();
-      }
-      if (!UpdateNackList(packet.seqNum) &&
-          packet.frameType != kVideoFrameKey) {
-        buffer_state = kFlushIndicator;
-      }
-
-      latest_received_sequence_number_ =
-          LatestSequenceNumber(latest_received_sequence_number_, packet.seqNum);
-    }
-  }
-
-  // Is the frame already in the decodable list?
-  bool continuous = IsContinuous(*frame);
-  switch (buffer_state) {
-    case kGeneralError:
-    case kTimeStampError:
-    case kSizeError: {
-      RecycleFrameBuffer(frame);
-      break;
-    }
-    case kCompleteSession: {
-      if (previous_state != kStateDecodable &&
-          previous_state != kStateComplete) {
-        CountFrame(*frame);
-        if (continuous) {
-          // Signal that we have a complete session.
-          frame_event_->Set();
-        }
-      }
-      FALLTHROUGH();
-    }
-    // Note: There is no break here - continuing to kDecodableSession.
-    case kDecodableSession: {
-      *retransmitted = (frame->GetNackCount() > 0);
-      if (continuous) {
-        decodable_frames_.InsertFrame(frame);
-        FindAndInsertContinuousFrames(*frame);
-      } else {
-        incomplete_frames_.InsertFrame(frame);
-        // If NACKs are enabled, keyframes are triggered by |GetNackList|.
-        if (nack_mode_ == kNoNack &&
-            NonContinuousOrIncompleteDuration() >
-                90 * kMaxDiscontinuousFramesTime) {
-          return kFlushIndicator;
-        }
-      }
-      break;
-    }
-    case kIncomplete: {
-      if (frame->GetState() == kStateEmpty &&
-          last_decoded_state_.UpdateEmptyFrame(frame)) {
-        RecycleFrameBuffer(frame);
-        return kNoError;
-      } else {
-        incomplete_frames_.InsertFrame(frame);
-        // If NACKs are enabled, keyframes are triggered by |GetNackList|.
-        if (nack_mode_ == kNoNack &&
-            NonContinuousOrIncompleteDuration() >
-                90 * kMaxDiscontinuousFramesTime) {
-          return kFlushIndicator;
-        }
-      }
-      break;
-    }
-    case kNoError:
-    case kOutOfBoundsPacket:
-    case kDuplicatePacket: {
-      // Put back the frame where it came from.
-      if (frame_list != NULL) {
-        frame_list->InsertFrame(frame);
-      } else {
-        RecycleFrameBuffer(frame);
-      }
-      ++num_duplicated_packets_;
-      break;
-    }
-    case kFlushIndicator:
-      RecycleFrameBuffer(frame);
-      return kFlushIndicator;
-    default:
-      assert(false);
-  }
-  return buffer_state;
-}
-
-bool VCMJitterBuffer::IsContinuousInState(
-    const VCMFrameBuffer& frame,
-    const VCMDecodingState& decoding_state) const {
-  // Is this frame (complete or decodable) and continuous?
-  // kStateDecodable will never be set when decode_error_mode_ is false
-  // as SessionInfo determines this state based on the error mode (and frame
-  // completeness).
-  return (frame.GetState() == kStateComplete ||
-          frame.GetState() == kStateDecodable) &&
-         decoding_state.ContinuousFrame(&frame);
-}
-
-bool VCMJitterBuffer::IsContinuous(const VCMFrameBuffer& frame) const {
-  if (IsContinuousInState(frame, last_decoded_state_)) {
-    return true;
-  }
-  VCMDecodingState decoding_state;
-  decoding_state.CopyFrom(last_decoded_state_);
-  for (FrameList::const_iterator it = decodable_frames_.begin();
-       it != decodable_frames_.end(); ++it) {
-    VCMFrameBuffer* decodable_frame = it->second;
-    if (IsNewerTimestamp(decodable_frame->TimeStamp(), frame.TimeStamp())) {
-      break;
-    }
-    decoding_state.SetState(decodable_frame);
-    if (IsContinuousInState(frame, decoding_state)) {
-      return true;
-    }
-  }
-  return false;
-}
-
-void VCMJitterBuffer::FindAndInsertContinuousFrames(
-    const VCMFrameBuffer& new_frame) {
-  VCMDecodingState decoding_state;
-  decoding_state.CopyFrom(last_decoded_state_);
-  decoding_state.SetState(&new_frame);
-  FindAndInsertContinuousFramesWithState(decoding_state);
-}
-
-void VCMJitterBuffer::FindAndInsertContinuousFramesWithState(
-    const VCMDecodingState& original_decoded_state) {
-  // Copy original_decoded_state so we can move the state forward with each
-  // decodable frame we find.
-  VCMDecodingState decoding_state;
-  decoding_state.CopyFrom(original_decoded_state);
-
-  // When temporal layers are available, we search for a complete or decodable
-  // frame until we hit one of the following:
-  // 1. Continuous base or sync layer.
-  // 2. The end of the list was reached.
-  for (FrameList::iterator it = incomplete_frames_.begin();
-       it != incomplete_frames_.end();) {
-    VCMFrameBuffer* frame = it->second;
-    if (IsNewerTimestamp(original_decoded_state.time_stamp(),
-                         frame->TimeStamp())) {
-      ++it;
-      continue;
-    }
-    if (IsContinuousInState(*frame, decoding_state)) {
-      decodable_frames_.InsertFrame(frame);
-      incomplete_frames_.erase(it++);
-      decoding_state.SetState(frame);
-    } else if (frame->TemporalId() <= 0) {
-      break;
-    } else {
-      ++it;
-    }
-  }
-}
-
-uint32_t VCMJitterBuffer::EstimatedJitterMs() {
-  rtc::CritScope cs(&crit_sect_);
-  // Compute RTT multiplier for estimation.
-  // low_rtt_nackThresholdMs_ == -1 means no FEC.
-  double rtt_mult = 1.0f;
-  if (low_rtt_nack_threshold_ms_ >= 0 &&
-      rtt_ms_ >= low_rtt_nack_threshold_ms_) {
-    // For RTTs above low_rtt_nack_threshold_ms_ we don't apply extra delay
-    // when waiting for retransmissions.
-    rtt_mult = 0.0f;
-  }
-  return jitter_estimate_.GetJitterEstimate(rtt_mult);
-}
-
-void VCMJitterBuffer::UpdateRtt(int64_t rtt_ms) {
-  rtc::CritScope cs(&crit_sect_);
-  rtt_ms_ = rtt_ms;
-  jitter_estimate_.UpdateRtt(rtt_ms);
-  if (!WaitForRetransmissions())
-    jitter_estimate_.ResetNackCount();
-}
-
-void VCMJitterBuffer::SetNackMode(VCMNackMode mode,
-                                  int64_t low_rtt_nack_threshold_ms,
-                                  int64_t high_rtt_nack_threshold_ms) {
-  rtc::CritScope cs(&crit_sect_);
-  nack_mode_ = mode;
-  if (mode == kNoNack) {
-    missing_sequence_numbers_.clear();
-  }
-  assert(low_rtt_nack_threshold_ms >= -1 && high_rtt_nack_threshold_ms >= -1);
-  assert(high_rtt_nack_threshold_ms == -1 ||
-         low_rtt_nack_threshold_ms <= high_rtt_nack_threshold_ms);
-  assert(low_rtt_nack_threshold_ms > -1 || high_rtt_nack_threshold_ms == -1);
-  low_rtt_nack_threshold_ms_ = low_rtt_nack_threshold_ms;
-  high_rtt_nack_threshold_ms_ = high_rtt_nack_threshold_ms;
-  // Don't set a high start rtt if high_rtt_nack_threshold_ms_ is used, to not
-  // disable NACK in |kNack| mode.
-  if (rtt_ms_ == kDefaultRtt && high_rtt_nack_threshold_ms_ != -1) {
-    rtt_ms_ = 0;
-  }
-  if (!WaitForRetransmissions()) {
-    jitter_estimate_.ResetNackCount();
-  }
-}
-
-void VCMJitterBuffer::SetNackSettings(size_t max_nack_list_size,
-                                      int max_packet_age_to_nack,
-                                      int max_incomplete_time_ms) {
-  rtc::CritScope cs(&crit_sect_);
-  assert(max_packet_age_to_nack >= 0);
-  assert(max_incomplete_time_ms_ >= 0);
-  max_nack_list_size_ = max_nack_list_size;
-  max_packet_age_to_nack_ = max_packet_age_to_nack;
-  max_incomplete_time_ms_ = max_incomplete_time_ms;
-}
-
-VCMNackMode VCMJitterBuffer::nack_mode() const {
-  rtc::CritScope cs(&crit_sect_);
-  return nack_mode_;
-}
-
-int VCMJitterBuffer::NonContinuousOrIncompleteDuration() {
-  if (incomplete_frames_.empty()) {
-    return 0;
-  }
-  uint32_t start_timestamp = incomplete_frames_.Front()->TimeStamp();
-  if (!decodable_frames_.empty()) {
-    start_timestamp = decodable_frames_.Back()->TimeStamp();
-  }
-  return incomplete_frames_.Back()->TimeStamp() - start_timestamp;
-}
-
-uint16_t VCMJitterBuffer::EstimatedLowSequenceNumber(
-    const VCMFrameBuffer& frame) const {
-  assert(frame.GetLowSeqNum() >= 0);
-  if (frame.HaveFirstPacket())
-    return frame.GetLowSeqNum();
-
-  // This estimate is not accurate if more than one packet with lower sequence
-  // number is lost.
-  return frame.GetLowSeqNum() - 1;
-}
-
-std::vector<uint16_t> VCMJitterBuffer::GetNackList(bool* request_key_frame) {
-  rtc::CritScope cs(&crit_sect_);
-  *request_key_frame = false;
-  if (nack_mode_ == kNoNack) {
-    return std::vector<uint16_t>();
-  }
-  if (last_decoded_state_.in_initial_state()) {
-    VCMFrameBuffer* next_frame = NextFrame();
-    const bool first_frame_is_key = next_frame &&
-                                    next_frame->FrameType() == kVideoFrameKey &&
-                                    next_frame->HaveFirstPacket();
-    if (!first_frame_is_key) {
-      bool have_non_empty_frame =
-          decodable_frames_.end() != find_if(decodable_frames_.begin(),
-                                             decodable_frames_.end(),
-                                             HasNonEmptyState);
-      if (!have_non_empty_frame) {
-        have_non_empty_frame =
-            incomplete_frames_.end() != find_if(incomplete_frames_.begin(),
-                                                incomplete_frames_.end(),
-                                                HasNonEmptyState);
-      }
-      bool found_key_frame = RecycleFramesUntilKeyFrame();
-      if (!found_key_frame) {
-        *request_key_frame = have_non_empty_frame;
-        return std::vector<uint16_t>();
-      }
-    }
-  }
-  if (TooLargeNackList()) {
-    *request_key_frame = !HandleTooLargeNackList();
-  }
-  if (max_incomplete_time_ms_ > 0) {
-    int non_continuous_incomplete_duration =
-        NonContinuousOrIncompleteDuration();
-    if (non_continuous_incomplete_duration > 90 * max_incomplete_time_ms_) {
-      LOG_F(LS_WARNING) << "Too long non-decodable duration: "
-                        << non_continuous_incomplete_duration << " > "
-                        << 90 * max_incomplete_time_ms_;
-      FrameList::reverse_iterator rit = find_if(
-          incomplete_frames_.rbegin(), incomplete_frames_.rend(), IsKeyFrame);
-      if (rit == incomplete_frames_.rend()) {
-        // Request a key frame if we don't have one already.
-        *request_key_frame = true;
-        return std::vector<uint16_t>();
-      } else {
-        // Skip to the last key frame. If it's incomplete we will start
-        // NACKing it.
-        // Note that the estimated low sequence number is correct for VP8
-        // streams because only the first packet of a key frame is marked.
-        last_decoded_state_.Reset();
-        DropPacketsFromNackList(EstimatedLowSequenceNumber(*rit->second));
-      }
-    }
-  }
-  std::vector<uint16_t> nack_list(missing_sequence_numbers_.begin(),
-                                  missing_sequence_numbers_.end());
-  return nack_list;
-}
-
-void VCMJitterBuffer::SetDecodeErrorMode(VCMDecodeErrorMode error_mode) {
-  rtc::CritScope cs(&crit_sect_);
-  decode_error_mode_ = error_mode;
-}
-
-VCMFrameBuffer* VCMJitterBuffer::NextFrame() const {
-  if (!decodable_frames_.empty())
-    return decodable_frames_.Front();
-  if (!incomplete_frames_.empty())
-    return incomplete_frames_.Front();
-  return NULL;
-}
-
-bool VCMJitterBuffer::UpdateNackList(uint16_t sequence_number) {
-  if (nack_mode_ == kNoNack) {
-    return true;
-  }
-  // Make sure we don't add packets which are already too old to be decoded.
-  if (!last_decoded_state_.in_initial_state()) {
-    latest_received_sequence_number_ = LatestSequenceNumber(
-        latest_received_sequence_number_, last_decoded_state_.sequence_num());
-  }
-  if (IsNewerSequenceNumber(sequence_number,
-                            latest_received_sequence_number_)) {
-    // Push any missing sequence numbers to the NACK list.
-    for (uint16_t i = latest_received_sequence_number_ + 1;
-         IsNewerSequenceNumber(sequence_number, i); ++i) {
-      missing_sequence_numbers_.insert(missing_sequence_numbers_.end(), i);
-      TRACE_EVENT_INSTANT1(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), "AddNack",
-                           "seqnum", i);
-    }
-    if (TooLargeNackList() && !HandleTooLargeNackList()) {
-      LOG(LS_WARNING) << "Requesting key frame due to too large NACK list.";
-      return false;
-    }
-    if (MissingTooOldPacket(sequence_number) &&
-        !HandleTooOldPackets(sequence_number)) {
-      LOG(LS_WARNING) << "Requesting key frame due to missing too old packets";
-      return false;
-    }
-  } else {
-    missing_sequence_numbers_.erase(sequence_number);
-    TRACE_EVENT_INSTANT1(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), "RemoveNack",
-                         "seqnum", sequence_number);
-  }
-  return true;
-}
-
-bool VCMJitterBuffer::TooLargeNackList() const {
-  return missing_sequence_numbers_.size() > max_nack_list_size_;
-}
-
-bool VCMJitterBuffer::HandleTooLargeNackList() {
-  // Recycle frames until the NACK list is small enough. It is likely cheaper to
-  // request a key frame than to retransmit this many missing packets.
-  LOG_F(LS_WARNING) << "NACK list has grown too large: "
-                    << missing_sequence_numbers_.size() << " > "
-                    << max_nack_list_size_;
-  bool key_frame_found = false;
-  while (TooLargeNackList()) {
-    key_frame_found = RecycleFramesUntilKeyFrame();
-  }
-  return key_frame_found;
-}
-
-bool VCMJitterBuffer::MissingTooOldPacket(
-    uint16_t latest_sequence_number) const {
-  if (missing_sequence_numbers_.empty()) {
-    return false;
-  }
-  const uint16_t age_of_oldest_missing_packet =
-      latest_sequence_number - *missing_sequence_numbers_.begin();
-  // Recycle frames if the NACK list contains too old sequence numbers as
-  // the packets may have already been dropped by the sender.
-  return age_of_oldest_missing_packet > max_packet_age_to_nack_;
-}
-
-bool VCMJitterBuffer::HandleTooOldPackets(uint16_t latest_sequence_number) {
-  bool key_frame_found = false;
-  const uint16_t age_of_oldest_missing_packet =
-      latest_sequence_number - *missing_sequence_numbers_.begin();
-  LOG_F(LS_WARNING) << "NACK list contains too old sequence numbers: "
-                    << age_of_oldest_missing_packet << " > "
-                    << max_packet_age_to_nack_;
-  while (MissingTooOldPacket(latest_sequence_number)) {
-    key_frame_found = RecycleFramesUntilKeyFrame();
-  }
-  return key_frame_found;
-}
-
-void VCMJitterBuffer::DropPacketsFromNackList(
-    uint16_t last_decoded_sequence_number) {
-  // Erase all sequence numbers from the NACK list which we won't need any
-  // longer.
-  missing_sequence_numbers_.erase(
-      missing_sequence_numbers_.begin(),
-      missing_sequence_numbers_.upper_bound(last_decoded_sequence_number));
-}
-
-void VCMJitterBuffer::RegisterStatsCallback(
-    VCMReceiveStatisticsCallback* callback) {
-  rtc::CritScope cs(&crit_sect_);
-  stats_callback_ = callback;
-}
-
-VCMFrameBuffer* VCMJitterBuffer::GetEmptyFrame() {
-  if (free_frames_.empty()) {
-    if (!TryToIncreaseJitterBufferSize()) {
-      return NULL;
-    }
-  }
-  VCMFrameBuffer* frame = free_frames_.front();
-  free_frames_.pop_front();
-  return frame;
-}
-
-bool VCMJitterBuffer::TryToIncreaseJitterBufferSize() {
-  if (max_number_of_frames_ >= kMaxNumberOfFrames)
-    return false;
-  free_frames_.push_back(new VCMFrameBuffer());
-  ++max_number_of_frames_;
-  TRACE_COUNTER1("webrtc", "JBMaxFrames", max_number_of_frames_);
-  return true;
-}
-
-// Recycle oldest frames up to a key frame, used if jitter buffer is completely
-// full.
-bool VCMJitterBuffer::RecycleFramesUntilKeyFrame() {
-  // First release incomplete frames, and only release decodable frames if there
-  // are no incomplete ones.
-  FrameList::iterator key_frame_it;
-  bool key_frame_found = false;
-  int dropped_frames = 0;
-  dropped_frames += incomplete_frames_.RecycleFramesUntilKeyFrame(
-      &key_frame_it, &free_frames_);
-  key_frame_found = key_frame_it != incomplete_frames_.end();
-  if (dropped_frames == 0) {
-    dropped_frames += decodable_frames_.RecycleFramesUntilKeyFrame(
-        &key_frame_it, &free_frames_);
-    key_frame_found = key_frame_it != decodable_frames_.end();
-  }
-  TRACE_EVENT_INSTANT0("webrtc", "JB::RecycleFramesUntilKeyFrame");
-  if (key_frame_found) {
-    LOG(LS_INFO) << "Found key frame while dropping frames.";
-    // Reset last decoded state to make sure the next frame decoded is a key
-    // frame, and start NACKing from here.
-    last_decoded_state_.Reset();
-    DropPacketsFromNackList(EstimatedLowSequenceNumber(*key_frame_it->second));
-  } else if (decodable_frames_.empty()) {
-    // All frames dropped. Reset the decoding state and clear missing sequence
-    // numbers as we're starting fresh.
-    last_decoded_state_.Reset();
-    missing_sequence_numbers_.clear();
-  }
-  return key_frame_found;
-}
-
-// Must be called under the critical section |crit_sect_|.
-void VCMJitterBuffer::CountFrame(const VCMFrameBuffer& frame) {
-  incoming_frame_count_++;
-
-  if (frame.FrameType() == kVideoFrameKey) {
-    TRACE_EVENT_ASYNC_STEP0("webrtc", "Video", frame.TimeStamp(),
-                            "KeyComplete");
-  } else {
-    TRACE_EVENT_ASYNC_STEP0("webrtc", "Video", frame.TimeStamp(),
-                            "DeltaComplete");
-  }
-
-  // Update receive statistics. We count all layers, thus when you use layers
-  // adding all key and delta frames might differ from frame count.
-  if (frame.IsSessionComplete()) {
-    if (frame.FrameType() == kVideoFrameKey) {
-      ++receive_statistics_.key_frames;
-      if (receive_statistics_.key_frames == 1) {
-        LOG(LS_INFO) << "Received first complete key frame";
-      }
-    } else {
-      ++receive_statistics_.delta_frames;
-    }
-
-    if (stats_callback_ != NULL)
-      stats_callback_->OnFrameCountsUpdated(receive_statistics_);
-  }
-}
-
-void VCMJitterBuffer::UpdateAveragePacketsPerFrame(int current_number_packets) {
-  if (frame_counter_ > kFastConvergeThreshold) {
-    average_packets_per_frame_ =
-        average_packets_per_frame_ * (1 - kNormalConvergeMultiplier) +
-        current_number_packets * kNormalConvergeMultiplier;
-  } else if (frame_counter_ > 0) {
-    average_packets_per_frame_ =
-        average_packets_per_frame_ * (1 - kFastConvergeMultiplier) +
-        current_number_packets * kFastConvergeMultiplier;
-    frame_counter_++;
-  } else {
-    average_packets_per_frame_ = current_number_packets;
-    frame_counter_++;
-  }
-}
-
-// Must be called under the critical section |crit_sect_|.
-void VCMJitterBuffer::CleanUpOldOrEmptyFrames() {
-  decodable_frames_.CleanUpOldOrEmptyFrames(&last_decoded_state_,
-                                            &free_frames_);
-  incomplete_frames_.CleanUpOldOrEmptyFrames(&last_decoded_state_,
-                                             &free_frames_);
-  if (!last_decoded_state_.in_initial_state()) {
-    DropPacketsFromNackList(last_decoded_state_.sequence_num());
-  }
-}
-
-// Must be called from within |crit_sect_|.
-bool VCMJitterBuffer::IsPacketRetransmitted(const VCMPacket& packet) const {
-  return missing_sequence_numbers_.find(packet.seqNum) !=
-         missing_sequence_numbers_.end();
-}
-
-// Must be called under the critical section |crit_sect_|. Should never be
-// called with retransmitted frames, they must be filtered out before this
-// function is called.
-void VCMJitterBuffer::UpdateJitterEstimate(const VCMJitterSample& sample,
-                                           bool incomplete_frame) {
-  if (sample.latest_packet_time == -1) {
-    return;
-  }
-  UpdateJitterEstimate(sample.latest_packet_time, sample.timestamp,
-                       sample.frame_size, incomplete_frame);
-}
-
-// Must be called under the critical section crit_sect_. Should never be
-// called with retransmitted frames, they must be filtered out before this
-// function is called.
-void VCMJitterBuffer::UpdateJitterEstimate(const VCMFrameBuffer& frame,
-                                           bool incomplete_frame) {
-  if (frame.LatestPacketTimeMs() == -1) {
-    return;
-  }
-  // No retransmitted frames should be a part of the jitter
-  // estimate.
-  UpdateJitterEstimate(frame.LatestPacketTimeMs(), frame.TimeStamp(),
-                       frame.Length(), incomplete_frame);
-}
-
-// Must be called under the critical section |crit_sect_|. Should never be
-// called with retransmitted frames, they must be filtered out before this
-// function is called.
-void VCMJitterBuffer::UpdateJitterEstimate(int64_t latest_packet_time_ms,
-                                           uint32_t timestamp,
-                                           unsigned int frame_size,
-                                           bool incomplete_frame) {
-  if (latest_packet_time_ms == -1) {
-    return;
-  }
-  int64_t frame_delay;
-  bool not_reordered = inter_frame_delay_.CalculateDelay(
-      timestamp, &frame_delay, latest_packet_time_ms);
-  // Filter out frames which have been reordered in time by the network
-  if (not_reordered) {
-    // Update the jitter estimate with the new samples
-    jitter_estimate_.UpdateEstimate(frame_delay, frame_size, incomplete_frame);
-  }
-}
-
-bool VCMJitterBuffer::WaitForRetransmissions() {
-  if (nack_mode_ == kNoNack) {
-    // NACK disabled -> don't wait for retransmissions.
-    return false;
-  }
-  // Evaluate if the RTT is higher than |high_rtt_nack_threshold_ms_|, and in
-  // that case we don't wait for retransmissions.
-  if (high_rtt_nack_threshold_ms_ >= 0 &&
-      rtt_ms_ >= high_rtt_nack_threshold_ms_) {
-    return false;
-  }
-  return true;
-}
-
-void VCMJitterBuffer::RecycleFrameBuffer(VCMFrameBuffer* frame) {
-  frame->Reset();
-  free_frames_.push_back(frame);
-}
-
-}  // namespace webrtc
diff --git a/modules/video_coding/jitter_buffer.h b/modules/video_coding/jitter_buffer.h
deleted file mode 100644
index 04fc0cd..0000000
--- a/modules/video_coding/jitter_buffer.h
+++ /dev/null
@@ -1,381 +0,0 @@
-/*
- *  Copyright (c) 2012 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_VIDEO_CODING_JITTER_BUFFER_H_
-#define WEBRTC_MODULES_VIDEO_CODING_JITTER_BUFFER_H_
-
-#include <list>
-#include <map>
-#include <memory>
-#include <set>
-#include <vector>
-
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/modules/utility/include/process_thread.h"
-#include "webrtc/modules/video_coding/decoding_state.h"
-#include "webrtc/modules/video_coding/include/video_coding.h"
-#include "webrtc/modules/video_coding/include/video_coding_defines.h"
-#include "webrtc/modules/video_coding/inter_frame_delay.h"
-#include "webrtc/modules/video_coding/jitter_buffer_common.h"
-#include "webrtc/modules/video_coding/jitter_estimator.h"
-#include "webrtc/modules/video_coding/nack_module.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/thread_annotations.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-enum VCMNackMode { kNack, kNoNack };
-
-// forward declarations
-class Clock;
-class EventFactory;
-class EventWrapper;
-class VCMFrameBuffer;
-class VCMPacket;
-class VCMEncodedFrame;
-
-typedef std::list<VCMFrameBuffer*> UnorderedFrameList;
-
-struct VCMJitterSample {
-  VCMJitterSample() : timestamp(0), frame_size(0), latest_packet_time(-1) {}
-  uint32_t timestamp;
-  uint32_t frame_size;
-  int64_t latest_packet_time;
-};
-
-class TimestampLessThan {
- public:
-  bool operator()(uint32_t timestamp1, uint32_t timestamp2) const {
-    return IsNewerTimestamp(timestamp2, timestamp1);
-  }
-};
-
-class FrameList
-    : public std::map<uint32_t, VCMFrameBuffer*, TimestampLessThan> {
- public:
-  void InsertFrame(VCMFrameBuffer* frame);
-  VCMFrameBuffer* PopFrame(uint32_t timestamp);
-  VCMFrameBuffer* Front() const;
-  VCMFrameBuffer* Back() const;
-  int RecycleFramesUntilKeyFrame(FrameList::iterator* key_frame_it,
-                                 UnorderedFrameList* free_frames);
-  void CleanUpOldOrEmptyFrames(VCMDecodingState* decoding_state,
-                               UnorderedFrameList* free_frames);
-  void Reset(UnorderedFrameList* free_frames);
-};
-
-class Vp9SsMap {
- public:
-  typedef std::map<uint32_t, GofInfoVP9, TimestampLessThan> SsMap;
-  bool Insert(const VCMPacket& packet);
-  void Reset();
-
-  // Removes SS data that are older than |timestamp|.
-  // The |timestamp| should be an old timestamp, i.e. packets with older
-  // timestamps should no longer be inserted.
-  void RemoveOld(uint32_t timestamp);
-
-  bool UpdatePacket(VCMPacket* packet);
-  void UpdateFrames(FrameList* frames);
-
-  // Public for testing.
-  // Returns an iterator to the corresponding SS data for the input |timestamp|.
-  bool Find(uint32_t timestamp, SsMap::iterator* it);
-
- private:
-  // These two functions are called by RemoveOld.
-  // Checks if it is time to do a clean up (done each kSsCleanupIntervalSec).
-  bool TimeForCleanup(uint32_t timestamp) const;
-
-  // Advances the oldest SS data to handle timestamp wrap in cases where SS data
-  // are received very seldom (e.g. only once in beginning, second when
-  // IsNewerTimestamp is not true).
-  void AdvanceFront(uint32_t timestamp);
-
-  SsMap ss_map_;
-};
-
-class VCMJitterBuffer {
- public:
-  VCMJitterBuffer(Clock* clock,
-                  std::unique_ptr<EventWrapper> event,
-                  NackSender* nack_sender = nullptr,
-                  KeyFrameRequestSender* keyframe_request_sender = nullptr);
-
-  ~VCMJitterBuffer();
-
-  // Initializes and starts jitter buffer.
-  void Start();
-
-  // Signals all internal events and stops the jitter buffer.
-  void Stop();
-
-  // Returns true if the jitter buffer is running.
-  bool Running() const;
-
-  // Empty the jitter buffer of all its data.
-  void Flush();
-
-  // Get the number of received frames, by type, since the jitter buffer
-  // was started.
-  FrameCounts FrameStatistics() const;
-
-  // Gets number of packets received.
-  int num_packets() const;
-
-  // Gets number of duplicated packets received.
-  int num_duplicated_packets() const;
-
-  // Gets number of packets discarded by the jitter buffer.
-  int num_discarded_packets() const;
-
-  // Statistics, Calculate frame and bit rates.
-  void IncomingRateStatistics(unsigned int* framerate, unsigned int* bitrate);
-
-  // Wait |max_wait_time_ms| for a complete frame to arrive.
-  // If found, a pointer to the frame is returned. Returns nullptr otherwise.
-  VCMEncodedFrame* NextCompleteFrame(uint32_t max_wait_time_ms);
-
-  // Locates a frame for decoding (even an incomplete) without delay.
-  // The function returns true once such a frame is found, its corresponding
-  // timestamp is returned. Otherwise, returns false.
-  bool NextMaybeIncompleteTimestamp(uint32_t* timestamp);
-
-  // Extract frame corresponding to input timestamp.
-  // Frame will be set to a decoding state.
-  VCMEncodedFrame* ExtractAndSetDecode(uint32_t timestamp);
-
-  // Releases a frame returned from the jitter buffer, should be called when
-  // done with decoding.
-  void ReleaseFrame(VCMEncodedFrame* frame);
-
-  // Returns the time in ms when the latest packet was inserted into the frame.
-  // Retransmitted is set to true if any of the packets belonging to the frame
-  // has been retransmitted.
-  int64_t LastPacketTime(const VCMEncodedFrame* frame,
-                         bool* retransmitted) const;
-
-  // Inserts a packet into a frame returned from GetFrame().
-  // If the return value is <= 0, |frame| is invalidated and the pointer must
-  // be dropped after this function returns.
-  VCMFrameBufferEnum InsertPacket(const VCMPacket& packet, bool* retransmitted);
-
-  // Returns the estimated jitter in milliseconds.
-  uint32_t EstimatedJitterMs();
-
-  // Updates the round-trip time estimate.
-  void UpdateRtt(int64_t rtt_ms);
-
-  // Set the NACK mode. |high_rtt_nack_threshold_ms| is an RTT threshold in ms
-  // above which NACK will be disabled if the NACK mode is |kNack|, -1 meaning
-  // that NACK is always enabled in the |kNack| mode.
-  // |low_rtt_nack_threshold_ms| is an RTT threshold in ms below which we expect
-  // to rely on NACK only, and therefore are using larger buffers to have time
-  // to wait for retransmissions.
-  void SetNackMode(VCMNackMode mode,
-                   int64_t low_rtt_nack_threshold_ms,
-                   int64_t high_rtt_nack_threshold_ms);
-
-  void SetNackSettings(size_t max_nack_list_size,
-                       int max_packet_age_to_nack,
-                       int max_incomplete_time_ms);
-
-  // Returns the current NACK mode.
-  VCMNackMode nack_mode() const;
-
-  // Returns a list of the sequence numbers currently missing.
-  std::vector<uint16_t> GetNackList(bool* request_key_frame);
-
-  // Set decode error mode - Should not be changed in the middle of the
-  // session. Changes will not influence frames already in the buffer.
-  void SetDecodeErrorMode(VCMDecodeErrorMode error_mode);
-  VCMDecodeErrorMode decode_error_mode() const { return decode_error_mode_; }
-
-  void RegisterStatsCallback(VCMReceiveStatisticsCallback* callback);
-
- private:
-  class SequenceNumberLessThan {
-   public:
-    bool operator()(const uint16_t& sequence_number1,
-                    const uint16_t& sequence_number2) const {
-      return IsNewerSequenceNumber(sequence_number2, sequence_number1);
-    }
-  };
-  typedef std::set<uint16_t, SequenceNumberLessThan> SequenceNumberSet;
-
-  // Gets the frame assigned to the timestamp of the packet. May recycle
-  // existing frames if no free frames are available. Returns an error code if
-  // failing, or kNoError on success. |frame_list| contains which list the
-  // packet was in, or NULL if it was not in a FrameList (a new frame).
-  VCMFrameBufferEnum GetFrame(const VCMPacket& packet,
-                              VCMFrameBuffer** frame,
-                              FrameList** frame_list)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_sect_);
-
-  // Returns true if |frame| is continuous in |decoding_state|, not taking
-  // decodable frames into account.
-  bool IsContinuousInState(const VCMFrameBuffer& frame,
-                           const VCMDecodingState& decoding_state) const
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_sect_);
-  // Returns true if |frame| is continuous in the |last_decoded_state_|, taking
-  // all decodable frames into account.
-  bool IsContinuous(const VCMFrameBuffer& frame) const
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_sect_);
-  // Looks for frames in |incomplete_frames_| which are continuous in the
-  // provided |decoded_state|. Starts the search from the timestamp of
-  // |decoded_state|.
-  void FindAndInsertContinuousFramesWithState(
-      const VCMDecodingState& decoded_state)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_sect_);
-  // Looks for frames in |incomplete_frames_| which are continuous in
-  // |last_decoded_state_| taking all decodable frames into account. Starts
-  // the search from |new_frame|.
-  void FindAndInsertContinuousFrames(const VCMFrameBuffer& new_frame)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_sect_);
-  VCMFrameBuffer* NextFrame() const RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_sect_);
-  // Returns true if the NACK list was updated to cover sequence numbers up to
-  // |sequence_number|. If false a key frame is needed to get into a state where
-  // we can continue decoding.
-  bool UpdateNackList(uint16_t sequence_number)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_sect_);
-  bool TooLargeNackList() const;
-  // Returns true if the NACK list was reduced without problem. If false a key
-  // frame is needed to get into a state where we can continue decoding.
-  bool HandleTooLargeNackList() RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_sect_);
-  bool MissingTooOldPacket(uint16_t latest_sequence_number) const
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_sect_);
-  // Returns true if the too old packets was successfully removed from the NACK
-  // list. If false, a key frame is needed to get into a state where we can
-  // continue decoding.
-  bool HandleTooOldPackets(uint16_t latest_sequence_number)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_sect_);
-  // Drops all packets in the NACK list up until |last_decoded_sequence_number|.
-  void DropPacketsFromNackList(uint16_t last_decoded_sequence_number);
-
-  // Gets an empty frame, creating a new frame if necessary (i.e. increases
-  // jitter buffer size).
-  VCMFrameBuffer* GetEmptyFrame() RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_sect_);
-
-  // Attempts to increase the size of the jitter buffer. Returns true on
-  // success, false otherwise.
-  bool TryToIncreaseJitterBufferSize() RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_sect_);
-
-  // Recycles oldest frames until a key frame is found. Used if jitter buffer is
-  // completely full. Returns true if a key frame was found.
-  bool RecycleFramesUntilKeyFrame() RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_sect_);
-
-  // Updates the frame statistics.
-  // Counts only complete frames, so decodable incomplete frames will not be
-  // counted.
-  void CountFrame(const VCMFrameBuffer& frame)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_sect_);
-
-  // Update rolling average of packets per frame.
-  void UpdateAveragePacketsPerFrame(int current_number_packets_);
-
-  // Cleans the frame list in the JB from old/empty frames.
-  // Should only be called prior to actual use.
-  void CleanUpOldOrEmptyFrames() RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_sect_);
-
-  // Returns true if |packet| is likely to have been retransmitted.
-  bool IsPacketRetransmitted(const VCMPacket& packet) const;
-
-  // The following three functions update the jitter estimate with the
-  // payload size, receive time and RTP timestamp of a frame.
-  void UpdateJitterEstimate(const VCMJitterSample& sample,
-                            bool incomplete_frame);
-  void UpdateJitterEstimate(const VCMFrameBuffer& frame, bool incomplete_frame);
-  void UpdateJitterEstimate(int64_t latest_packet_time_ms,
-                            uint32_t timestamp,
-                            unsigned int frame_size,
-                            bool incomplete_frame);
-
-  // Returns true if we should wait for retransmissions, false otherwise.
-  bool WaitForRetransmissions();
-
-  int NonContinuousOrIncompleteDuration()
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_sect_);
-
-  uint16_t EstimatedLowSequenceNumber(const VCMFrameBuffer& frame) const;
-
-  void UpdateHistograms() RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_sect_);
-
-  // Reset frame buffer and return it to free_frames_.
-  void RecycleFrameBuffer(VCMFrameBuffer* frame)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_sect_);
-
-  Clock* clock_;
-  // If we are running (have started) or not.
-  bool running_;
-  rtc::CriticalSection crit_sect_;
-  // Event to signal when we have a frame ready for decoder.
-  std::unique_ptr<EventWrapper> frame_event_;
-  // Number of allocated frames.
-  int max_number_of_frames_;
-  UnorderedFrameList free_frames_ RTC_GUARDED_BY(crit_sect_);
-  FrameList decodable_frames_ RTC_GUARDED_BY(crit_sect_);
-  FrameList incomplete_frames_ RTC_GUARDED_BY(crit_sect_);
-  VCMDecodingState last_decoded_state_ RTC_GUARDED_BY(crit_sect_);
-  bool first_packet_since_reset_;
-
-  // Statistics.
-  VCMReceiveStatisticsCallback* stats_callback_ RTC_GUARDED_BY(crit_sect_);
-  // Frame counts for each type (key, delta, ...)
-  FrameCounts receive_statistics_;
-  // Latest calculated frame rates of incoming stream.
-  unsigned int incoming_frame_rate_;
-  unsigned int incoming_frame_count_;
-  int64_t time_last_incoming_frame_count_;
-  unsigned int incoming_bit_count_;
-  unsigned int incoming_bit_rate_;
-  // Number of packets in a row that have been too old.
-  int num_consecutive_old_packets_;
-  // Number of packets received.
-  int num_packets_ RTC_GUARDED_BY(crit_sect_);
-  // Number of duplicated packets received.
-  int num_duplicated_packets_ RTC_GUARDED_BY(crit_sect_);
-  // Number of packets discarded by the jitter buffer.
-  int num_discarded_packets_ RTC_GUARDED_BY(crit_sect_);
-  // Time when first packet is received.
-  int64_t time_first_packet_ms_ RTC_GUARDED_BY(crit_sect_);
-
-  // Jitter estimation.
-  // Filter for estimating jitter.
-  VCMJitterEstimator jitter_estimate_;
-  // Calculates network delays used for jitter calculations.
-  VCMInterFrameDelay inter_frame_delay_;
-  VCMJitterSample waiting_for_completion_;
-  int64_t rtt_ms_;
-
-  // NACK and retransmissions.
-  VCMNackMode nack_mode_;
-  int64_t low_rtt_nack_threshold_ms_;
-  int64_t high_rtt_nack_threshold_ms_;
-  // Holds the internal NACK list (the missing sequence numbers).
-  SequenceNumberSet missing_sequence_numbers_;
-  uint16_t latest_received_sequence_number_;
-  size_t max_nack_list_size_;
-  int max_packet_age_to_nack_;  // Measured in sequence numbers.
-  int max_incomplete_time_ms_;
-
-  VCMDecodeErrorMode decode_error_mode_;
-  // Estimated rolling average of packets per frame
-  float average_packets_per_frame_;
-  // average_packets_per_frame converges fast if we have fewer than this many
-  // frames.
-  int frame_counter_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(VCMJitterBuffer);
-};
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_VIDEO_CODING_JITTER_BUFFER_H_
diff --git a/modules/video_coding/jitter_buffer_common.h b/modules/video_coding/jitter_buffer_common.h
deleted file mode 100644
index 65356f1..0000000
--- a/modules/video_coding/jitter_buffer_common.h
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- *  Copyright (c) 2011 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_VIDEO_CODING_JITTER_BUFFER_COMMON_H_
-#define WEBRTC_MODULES_VIDEO_CODING_JITTER_BUFFER_COMMON_H_
-
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-// Used to estimate rolling average of packets per frame.
-static const float kFastConvergeMultiplier = 0.4f;
-static const float kNormalConvergeMultiplier = 0.2f;
-
-enum { kMaxNumberOfFrames = 300 };
-enum { kStartNumberOfFrames = 6 };
-enum { kMaxVideoDelayMs = 10000 };
-enum { kPacketsPerFrameMultiplier = 5 };
-enum { kFastConvergeThreshold = 5 };
-
-enum VCMJitterBufferEnum {
-  kMaxConsecutiveOldFrames = 60,
-  kMaxConsecutiveOldPackets = 300,
-  // TODO(sprang): Reduce this limit once codecs don't sometimes wildly
-  // overshoot bitrate target.
-  kMaxPacketsInSession = 1400,      // Allows ~2MB frames.
-  kBufferIncStepSizeBytes = 30000,  // >20 packets.
-  kMaxJBFrameSizeBytes = 4000000    // sanity don't go above 4Mbyte.
-};
-
-enum VCMFrameBufferEnum {
-  kOutOfBoundsPacket = -7,
-  kNotInitialized = -6,
-  kOldPacket = -5,
-  kGeneralError = -4,
-  kFlushIndicator = -3,  // Indicator that a flush has occurred.
-  kTimeStampError = -2,
-  kSizeError = -1,
-  kNoError = 0,
-  kIncomplete = 1,        // Frame incomplete.
-  kCompleteSession = 3,   // at least one layer in the frame complete.
-  kDecodableSession = 4,  // Frame incomplete, but ready to be decoded
-  kDuplicatePacket = 5    // We're receiving a duplicate packet.
-};
-
-enum VCMFrameBufferStateEnum {
-  kStateEmpty,       // frame popped by the RTP receiver
-  kStateIncomplete,  // frame that have one or more packet(s) stored
-  kStateComplete,    // frame that have all packets
-  kStateDecodable    // Hybrid mode - frame can be decoded
-};
-
-enum { kH264StartCodeLengthBytes = 4 };
-
-// Used to indicate if a received packet contain a complete NALU (or equivalent)
-enum VCMNaluCompleteness {
-  kNaluUnset = 0,     // Packet has not been filled.
-  kNaluComplete = 1,  // Packet can be decoded as is.
-  kNaluStart,         // Packet contain beginning of NALU
-  kNaluIncomplete,    // Packet is not beginning or end of NALU
-  kNaluEnd,           // Packet is the end of a NALU
-};
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_VIDEO_CODING_JITTER_BUFFER_COMMON_H_
diff --git a/modules/video_coding/jitter_buffer_unittest.cc b/modules/video_coding/jitter_buffer_unittest.cc
deleted file mode 100644
index bc5201a..0000000
--- a/modules/video_coding/jitter_buffer_unittest.cc
+++ /dev/null
@@ -1,2722 +0,0 @@
-/*
- *  Copyright (c) 2011 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 <string>
-
-#include <list>
-#include <memory>
-#include <vector>
-
-#include "webrtc/common_video/h264/h264_common.h"
-#include "webrtc/modules/video_coding/frame_buffer.h"
-#include "webrtc/modules/video_coding/jitter_buffer.h"
-#include "webrtc/modules/video_coding/media_opt_util.h"
-#include "webrtc/modules/video_coding/packet.h"
-#include "webrtc/modules/video_coding/test/stream_generator.h"
-#include "webrtc/modules/video_coding/test/test_util.h"
-#include "webrtc/rtc_base/location.h"
-#include "webrtc/system_wrappers/include/clock.h"
-#include "webrtc/system_wrappers/include/field_trial.h"
-#include "webrtc/system_wrappers/include/metrics.h"
-#include "webrtc/system_wrappers/include/metrics_default.h"
-#include "webrtc/test/field_trial.h"
-#include "webrtc/test/gmock.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-namespace {
-const uint32_t kProcessIntervalSec = 60;
-}  // namespace
-
-class Vp9SsMapTest : public ::testing::Test {
- protected:
-  Vp9SsMapTest() : packet_() {}
-
-  virtual void SetUp() {
-    packet_.is_first_packet_in_frame = true;
-    packet_.dataPtr = data_;
-    packet_.sizeBytes = 1400;
-    packet_.seqNum = 1234;
-    packet_.timestamp = 1;
-    packet_.markerBit = true;
-    packet_.frameType = kVideoFrameKey;
-    packet_.codec = kVideoCodecVP9;
-    packet_.video_header.codec = kRtpVideoVp9;
-    packet_.video_header.codecHeader.VP9.flexible_mode = false;
-    packet_.video_header.codecHeader.VP9.gof_idx = 0;
-    packet_.video_header.codecHeader.VP9.temporal_idx = kNoTemporalIdx;
-    packet_.video_header.codecHeader.VP9.temporal_up_switch = false;
-    packet_.video_header.codecHeader.VP9.ss_data_available = true;
-    packet_.video_header.codecHeader.VP9.gof.SetGofInfoVP9(
-        kTemporalStructureMode3);  // kTemporalStructureMode3: 0-2-1-2..
-  }
-
-  Vp9SsMap map_;
-  uint8_t data_[1500];
-  VCMPacket packet_;
-};
-
-TEST_F(Vp9SsMapTest, Insert) {
-  EXPECT_TRUE(map_.Insert(packet_));
-}
-
-TEST_F(Vp9SsMapTest, Insert_NoSsData) {
-  packet_.video_header.codecHeader.VP9.ss_data_available = false;
-  EXPECT_FALSE(map_.Insert(packet_));
-}
-
-TEST_F(Vp9SsMapTest, Find) {
-  EXPECT_TRUE(map_.Insert(packet_));
-  Vp9SsMap::SsMap::iterator it;
-  EXPECT_TRUE(map_.Find(packet_.timestamp, &it));
-  EXPECT_EQ(packet_.timestamp, it->first);
-}
-
-TEST_F(Vp9SsMapTest, Find_WithWrap) {
-  const uint32_t kSsTimestamp1 = 0xFFFFFFFF;
-  const uint32_t kSsTimestamp2 = 100;
-  packet_.timestamp = kSsTimestamp1;
-  EXPECT_TRUE(map_.Insert(packet_));
-  packet_.timestamp = kSsTimestamp2;
-  EXPECT_TRUE(map_.Insert(packet_));
-  Vp9SsMap::SsMap::iterator it;
-  EXPECT_FALSE(map_.Find(kSsTimestamp1 - 1, &it));
-  EXPECT_TRUE(map_.Find(kSsTimestamp1, &it));
-  EXPECT_EQ(kSsTimestamp1, it->first);
-  EXPECT_TRUE(map_.Find(0, &it));
-  EXPECT_EQ(kSsTimestamp1, it->first);
-  EXPECT_TRUE(map_.Find(kSsTimestamp2 - 1, &it));
-  EXPECT_EQ(kSsTimestamp1, it->first);
-  EXPECT_TRUE(map_.Find(kSsTimestamp2, &it));
-  EXPECT_EQ(kSsTimestamp2, it->first);
-  EXPECT_TRUE(map_.Find(kSsTimestamp2 + 1, &it));
-  EXPECT_EQ(kSsTimestamp2, it->first);
-}
-
-TEST_F(Vp9SsMapTest, Reset) {
-  EXPECT_TRUE(map_.Insert(packet_));
-  Vp9SsMap::SsMap::iterator it;
-  EXPECT_TRUE(map_.Find(packet_.timestamp, &it));
-  EXPECT_EQ(packet_.timestamp, it->first);
-
-  map_.Reset();
-  EXPECT_FALSE(map_.Find(packet_.timestamp, &it));
-}
-
-TEST_F(Vp9SsMapTest, RemoveOld) {
-  Vp9SsMap::SsMap::iterator it;
-  const uint32_t kSsTimestamp1 = 10000;
-  packet_.timestamp = kSsTimestamp1;
-  EXPECT_TRUE(map_.Insert(packet_));
-
-  const uint32_t kTimestamp = kSsTimestamp1 + kProcessIntervalSec * 90000;
-  map_.RemoveOld(kTimestamp - 1);              // Interval not passed.
-  EXPECT_TRUE(map_.Find(kSsTimestamp1, &it));  // Should not been removed.
-
-  map_.RemoveOld(kTimestamp);
-  EXPECT_FALSE(map_.Find(kSsTimestamp1, &it));
-  EXPECT_TRUE(map_.Find(kTimestamp, &it));
-  EXPECT_EQ(kTimestamp, it->first);
-}
-
-TEST_F(Vp9SsMapTest, RemoveOld_WithWrap) {
-  Vp9SsMap::SsMap::iterator it;
-  const uint32_t kSsTimestamp1 = 0xFFFFFFFF - kProcessIntervalSec * 90000;
-  const uint32_t kSsTimestamp2 = 10;
-  const uint32_t kSsTimestamp3 = 1000;
-  packet_.timestamp = kSsTimestamp1;
-  EXPECT_TRUE(map_.Insert(packet_));
-  packet_.timestamp = kSsTimestamp2;
-  EXPECT_TRUE(map_.Insert(packet_));
-  packet_.timestamp = kSsTimestamp3;
-  EXPECT_TRUE(map_.Insert(packet_));
-
-  map_.RemoveOld(kSsTimestamp3);
-  EXPECT_FALSE(map_.Find(kSsTimestamp1, &it));
-  EXPECT_FALSE(map_.Find(kSsTimestamp2, &it));
-  EXPECT_TRUE(map_.Find(kSsTimestamp3, &it));
-}
-
-TEST_F(Vp9SsMapTest, UpdatePacket_NoSsData) {
-  packet_.video_header.codecHeader.VP9.gof_idx = 0;
-  EXPECT_FALSE(map_.UpdatePacket(&packet_));
-}
-
-TEST_F(Vp9SsMapTest, UpdatePacket_NoGofIdx) {
-  EXPECT_TRUE(map_.Insert(packet_));
-  packet_.video_header.codecHeader.VP9.gof_idx = kNoGofIdx;
-  EXPECT_FALSE(map_.UpdatePacket(&packet_));
-}
-
-TEST_F(Vp9SsMapTest, UpdatePacket_InvalidGofIdx) {
-  EXPECT_TRUE(map_.Insert(packet_));
-  packet_.video_header.codecHeader.VP9.gof_idx = 4;
-  EXPECT_FALSE(map_.UpdatePacket(&packet_));
-}
-
-TEST_F(Vp9SsMapTest, UpdatePacket) {
-  EXPECT_TRUE(map_.Insert(packet_));  // kTemporalStructureMode3: 0-2-1-2..
-
-  packet_.video_header.codecHeader.VP9.gof_idx = 0;
-  EXPECT_TRUE(map_.UpdatePacket(&packet_));
-  EXPECT_EQ(0, packet_.video_header.codecHeader.VP9.temporal_idx);
-  EXPECT_FALSE(packet_.video_header.codecHeader.VP9.temporal_up_switch);
-  EXPECT_EQ(1U, packet_.video_header.codecHeader.VP9.num_ref_pics);
-  EXPECT_EQ(4, packet_.video_header.codecHeader.VP9.pid_diff[0]);
-
-  packet_.video_header.codecHeader.VP9.gof_idx = 1;
-  EXPECT_TRUE(map_.UpdatePacket(&packet_));
-  EXPECT_EQ(2, packet_.video_header.codecHeader.VP9.temporal_idx);
-  EXPECT_TRUE(packet_.video_header.codecHeader.VP9.temporal_up_switch);
-  EXPECT_EQ(1U, packet_.video_header.codecHeader.VP9.num_ref_pics);
-  EXPECT_EQ(1, packet_.video_header.codecHeader.VP9.pid_diff[0]);
-
-  packet_.video_header.codecHeader.VP9.gof_idx = 2;
-  EXPECT_TRUE(map_.UpdatePacket(&packet_));
-  EXPECT_EQ(1, packet_.video_header.codecHeader.VP9.temporal_idx);
-  EXPECT_TRUE(packet_.video_header.codecHeader.VP9.temporal_up_switch);
-  EXPECT_EQ(1U, packet_.video_header.codecHeader.VP9.num_ref_pics);
-  EXPECT_EQ(2, packet_.video_header.codecHeader.VP9.pid_diff[0]);
-
-  packet_.video_header.codecHeader.VP9.gof_idx = 3;
-  EXPECT_TRUE(map_.UpdatePacket(&packet_));
-  EXPECT_EQ(2, packet_.video_header.codecHeader.VP9.temporal_idx);
-  EXPECT_FALSE(packet_.video_header.codecHeader.VP9.temporal_up_switch);
-  EXPECT_EQ(2U, packet_.video_header.codecHeader.VP9.num_ref_pics);
-  EXPECT_EQ(1, packet_.video_header.codecHeader.VP9.pid_diff[0]);
-  EXPECT_EQ(2, packet_.video_header.codecHeader.VP9.pid_diff[1]);
-}
-
-class ProcessThreadMock : public ProcessThread {
- public:
-  MOCK_METHOD0(Start, void());
-  MOCK_METHOD0(Stop, void());
-  MOCK_METHOD1(WakeUp, void(Module* module));
-  MOCK_METHOD2(RegisterModule, void(Module* module, const rtc::Location&));
-  MOCK_METHOD1(DeRegisterModule, void(Module* module));
-  void PostTask(std::unique_ptr<rtc::QueuedTask> task) /*override*/ {}
-};
-
-class TestBasicJitterBuffer : public ::testing::TestWithParam<std::string>,
-                              public NackSender,
-                              public KeyFrameRequestSender {
- public:
-  void SendNack(const std::vector<uint16_t>& sequence_numbers) override {
-    nack_sent_.insert(nack_sent_.end(), sequence_numbers.begin(),
-                      sequence_numbers.end());
-  }
-
-  void RequestKeyFrame() override { ++keyframe_requests_; }
-
-  ::testing::NiceMock<ProcessThreadMock> process_thread_mock_;
-  std::vector<uint16_t> nack_sent_;
-  int keyframe_requests_;
-
- protected:
-  TestBasicJitterBuffer() {}
-  void SetUp() override {
-    clock_.reset(new SimulatedClock(0));
-    jitter_buffer_.reset(new VCMJitterBuffer(
-        clock_.get(),
-        std::unique_ptr<EventWrapper>(event_factory_.CreateEvent()),
-        this,
-        this));
-    jitter_buffer_->Start();
-    seq_num_ = 1234;
-    timestamp_ = 0;
-    size_ = 1400;
-    // Data vector -  0, 0, 0x80, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0x80, 3....
-    data_[0] = 0;
-    data_[1] = 0;
-    data_[2] = 0x80;
-    int count = 3;
-    for (unsigned int i = 3; i < sizeof(data_) - 3; ++i) {
-      data_[i] = count;
-      count++;
-      if (count == 10) {
-        data_[i + 1] = 0;
-        data_[i + 2] = 0;
-        data_[i + 3] = 0x80;
-        count = 3;
-        i += 3;
-      }
-    }
-    WebRtcRTPHeader rtpHeader;
-    memset(&rtpHeader, 0, sizeof(rtpHeader));
-    rtpHeader.header.sequenceNumber = seq_num_;
-    rtpHeader.header.timestamp = timestamp_;
-    rtpHeader.header.markerBit = true;
-    rtpHeader.frameType = kVideoFrameDelta;
-    packet_.reset(new VCMPacket(data_, size_, rtpHeader));
-  }
-
-  VCMEncodedFrame* DecodeCompleteFrame() {
-    VCMEncodedFrame* found_frame = jitter_buffer_->NextCompleteFrame(10);
-    if (!found_frame)
-      return nullptr;
-    return jitter_buffer_->ExtractAndSetDecode(found_frame->TimeStamp());
-  }
-
-  VCMEncodedFrame* DecodeIncompleteFrame() {
-    uint32_t timestamp = 0;
-    bool found_frame = jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp);
-    if (!found_frame)
-      return NULL;
-    VCMEncodedFrame* frame = jitter_buffer_->ExtractAndSetDecode(timestamp);
-    return frame;
-  }
-
-  void CheckOutFrame(VCMEncodedFrame* frame_out,
-                     unsigned int size,
-                     bool startCode) {
-    ASSERT_TRUE(frame_out);
-
-    const uint8_t* outData = frame_out->Buffer();
-    unsigned int i = 0;
-
-    if (startCode) {
-      EXPECT_EQ(0, outData[0]);
-      EXPECT_EQ(0, outData[1]);
-      EXPECT_EQ(0, outData[2]);
-      EXPECT_EQ(1, outData[3]);
-      i += 4;
-    }
-
-    EXPECT_EQ(size, frame_out->Length());
-    int count = 3;
-    for (; i < size; i++) {
-      if (outData[i] == 0 && outData[i + 1] == 0 && outData[i + 2] == 0x80) {
-        i += 2;
-      } else if (startCode && outData[i] == 0 && outData[i + 1] == 0) {
-        EXPECT_EQ(0, outData[0]);
-        EXPECT_EQ(0, outData[1]);
-        EXPECT_EQ(0, outData[2]);
-        EXPECT_EQ(1, outData[3]);
-        i += 3;
-      } else {
-        EXPECT_EQ(count, outData[i]);
-        count++;
-        if (count == 10) {
-          count = 3;
-        }
-      }
-    }
-  }
-
-  uint16_t seq_num_;
-  uint32_t timestamp_;
-  int size_;
-  uint8_t data_[1500];
-  std::unique_ptr<VCMPacket> packet_;
-  std::unique_ptr<SimulatedClock> clock_;
-  NullEventFactory event_factory_;
-  std::unique_ptr<VCMJitterBuffer> jitter_buffer_;
-};
-
-class TestRunningJitterBuffer : public ::testing::TestWithParam<std::string>,
-                                public NackSender,
-                                public KeyFrameRequestSender {
- public:
-  void SendNack(const std::vector<uint16_t>& sequence_numbers) {
-    nack_sent_.insert(nack_sent_.end(), sequence_numbers.begin(),
-                      sequence_numbers.end());
-  }
-
-  void RequestKeyFrame() { ++keyframe_requests_; }
-
-  ::testing::NiceMock<ProcessThreadMock> process_thread_mock_;
-  std::vector<uint16_t> nack_sent_;
-  int keyframe_requests_;
-
- protected:
-  enum { kDataBufferSize = 10 };
-
-  virtual void SetUp() {
-    clock_.reset(new SimulatedClock(0));
-    max_nack_list_size_ = 150;
-    oldest_packet_to_nack_ = 250;
-    jitter_buffer_ = new VCMJitterBuffer(
-        clock_.get(),
-        std::unique_ptr<EventWrapper>(event_factory_.CreateEvent()),
-        this, this);
-    stream_generator_ = new StreamGenerator(0, clock_->TimeInMilliseconds());
-    jitter_buffer_->Start();
-    jitter_buffer_->SetNackSettings(max_nack_list_size_, oldest_packet_to_nack_,
-                                    0);
-    memset(data_buffer_, 0, kDataBufferSize);
-  }
-
-  virtual void TearDown() {
-    jitter_buffer_->Stop();
-    delete stream_generator_;
-    delete jitter_buffer_;
-  }
-
-  VCMFrameBufferEnum InsertPacketAndPop(int index) {
-    VCMPacket packet;
-    packet.dataPtr = data_buffer_;
-    bool packet_available = stream_generator_->PopPacket(&packet, index);
-    EXPECT_TRUE(packet_available);
-    if (!packet_available)
-      return kGeneralError;  // Return here to avoid crashes below.
-    bool retransmitted = false;
-    return jitter_buffer_->InsertPacket(packet, &retransmitted);
-  }
-
-  VCMFrameBufferEnum InsertPacket(int index) {
-    VCMPacket packet;
-    packet.dataPtr = data_buffer_;
-    bool packet_available = stream_generator_->GetPacket(&packet, index);
-    EXPECT_TRUE(packet_available);
-    if (!packet_available)
-      return kGeneralError;  // Return here to avoid crashes below.
-    bool retransmitted = false;
-    return jitter_buffer_->InsertPacket(packet, &retransmitted);
-  }
-
-  VCMFrameBufferEnum InsertFrame(FrameType frame_type) {
-    stream_generator_->GenerateFrame(
-        frame_type, (frame_type != kEmptyFrame) ? 1 : 0,
-        (frame_type == kEmptyFrame) ? 1 : 0, clock_->TimeInMilliseconds());
-    VCMFrameBufferEnum ret = InsertPacketAndPop(0);
-    clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
-    return ret;
-  }
-
-  VCMFrameBufferEnum InsertFrames(int num_frames, FrameType frame_type) {
-    VCMFrameBufferEnum ret_for_all = kNoError;
-    for (int i = 0; i < num_frames; ++i) {
-      VCMFrameBufferEnum ret = InsertFrame(frame_type);
-      if (ret < kNoError) {
-        ret_for_all = ret;
-      } else if (ret_for_all >= kNoError) {
-        ret_for_all = ret;
-      }
-    }
-    return ret_for_all;
-  }
-
-  void DropFrame(int num_packets) {
-    stream_generator_->GenerateFrame(kVideoFrameDelta, num_packets, 0,
-                                     clock_->TimeInMilliseconds());
-    for (int i = 0; i < num_packets; ++i)
-      stream_generator_->DropLastPacket();
-    clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
-  }
-
-  bool DecodeCompleteFrame() {
-    VCMEncodedFrame* found_frame = jitter_buffer_->NextCompleteFrame(0);
-    if (!found_frame)
-      return false;
-
-    VCMEncodedFrame* frame =
-        jitter_buffer_->ExtractAndSetDecode(found_frame->TimeStamp());
-    bool ret = (frame != NULL);
-    jitter_buffer_->ReleaseFrame(frame);
-    return ret;
-  }
-
-  bool DecodeIncompleteFrame() {
-    uint32_t timestamp = 0;
-    bool found_frame = jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp);
-    if (!found_frame)
-      return false;
-    VCMEncodedFrame* frame = jitter_buffer_->ExtractAndSetDecode(timestamp);
-    bool ret = (frame != NULL);
-    jitter_buffer_->ReleaseFrame(frame);
-    return ret;
-  }
-
-  VCMJitterBuffer* jitter_buffer_;
-  StreamGenerator* stream_generator_;
-  std::unique_ptr<SimulatedClock> clock_;
-  NullEventFactory event_factory_;
-  size_t max_nack_list_size_;
-  int oldest_packet_to_nack_;
-  uint8_t data_buffer_[kDataBufferSize];
-};
-
-class TestJitterBufferNack : public TestRunningJitterBuffer {
- protected:
-  TestJitterBufferNack() {}
-  virtual void SetUp() {
-    TestRunningJitterBuffer::SetUp();
-    jitter_buffer_->SetNackMode(kNack, -1, -1);
-  }
-
-  virtual void TearDown() { TestRunningJitterBuffer::TearDown(); }
-};
-
-TEST_F(TestBasicJitterBuffer, StopRunning) {
-  jitter_buffer_->Stop();
-  EXPECT_TRUE(NULL == DecodeCompleteFrame());
-  EXPECT_TRUE(NULL == DecodeIncompleteFrame());
-  jitter_buffer_->Start();
-  // Allow selective errors.
-  jitter_buffer_->SetDecodeErrorMode(kSelectiveErrors);
-
-  // No packets inserted.
-  EXPECT_TRUE(NULL == DecodeCompleteFrame());
-  EXPECT_TRUE(NULL == DecodeIncompleteFrame());
-
-  // Allow decoding with errors.
-  jitter_buffer_->SetDecodeErrorMode(kWithErrors);
-
-  // No packets inserted.
-  EXPECT_TRUE(NULL == DecodeCompleteFrame());
-  EXPECT_TRUE(NULL == DecodeIncompleteFrame());
-}
-
-TEST_F(TestBasicJitterBuffer, SinglePacketFrame) {
-  // Always start with a complete key frame when not allowing errors.
-  jitter_buffer_->SetDecodeErrorMode(kNoErrors);
-  packet_->frameType = kVideoFrameKey;
-  packet_->is_first_packet_in_frame = true;
-  packet_->markerBit = true;
-  packet_->timestamp += 123 * 90;
-
-  // Insert the packet to the jitter buffer and get a frame.
-  bool retransmitted = false;
-  EXPECT_EQ(kCompleteSession,
-            jitter_buffer_->InsertPacket(*packet_, &retransmitted));
-  VCMEncodedFrame* frame_out = DecodeCompleteFrame();
-  CheckOutFrame(frame_out, size_, false);
-  EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
-  jitter_buffer_->ReleaseFrame(frame_out);
-}
-
-TEST_F(TestBasicJitterBuffer, VerifyHistogramStats) {
-  metrics::Reset();
-  // Always start with a complete key frame when not allowing errors.
-  jitter_buffer_->SetDecodeErrorMode(kNoErrors);
-  packet_->frameType = kVideoFrameKey;
-  packet_->is_first_packet_in_frame = true;
-  packet_->markerBit = true;
-  packet_->timestamp += 123 * 90;
-
-  // Insert single packet frame to the jitter buffer and get a frame.
-  bool retransmitted = false;
-  EXPECT_EQ(kCompleteSession,
-            jitter_buffer_->InsertPacket(*packet_, &retransmitted));
-  VCMEncodedFrame* frame_out = DecodeCompleteFrame();
-  CheckOutFrame(frame_out, size_, false);
-  EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
-  jitter_buffer_->ReleaseFrame(frame_out);
-
-  // Verify that histograms are updated when the jitter buffer is stopped.
-  clock_->AdvanceTimeMilliseconds(metrics::kMinRunTimeInSeconds * 1000);
-  jitter_buffer_->Stop();
-  EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.DiscardedPacketsInPercent", 0));
-  EXPECT_EQ(1,
-            metrics::NumEvents("WebRTC.Video.DuplicatedPacketsInPercent", 0));
-  EXPECT_EQ(
-      1, metrics::NumSamples("WebRTC.Video.CompleteFramesReceivedPerSecond"));
-  EXPECT_EQ(
-      1, metrics::NumEvents("WebRTC.Video.KeyFramesReceivedInPermille", 1000));
-
-  // Verify that histograms are not updated if stop is called again.
-  jitter_buffer_->Stop();
-  EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.DiscardedPacketsInPercent"));
-  EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.DuplicatedPacketsInPercent"));
-  EXPECT_EQ(
-      1, metrics::NumSamples("WebRTC.Video.CompleteFramesReceivedPerSecond"));
-  EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.KeyFramesReceivedInPermille"));
-}
-
-TEST_F(TestBasicJitterBuffer, DualPacketFrame) {
-  packet_->frameType = kVideoFrameKey;
-  packet_->is_first_packet_in_frame = true;
-  packet_->markerBit = false;
-
-  bool retransmitted = false;
-  EXPECT_EQ(kIncomplete,
-            jitter_buffer_->InsertPacket(*packet_, &retransmitted));
-  VCMEncodedFrame* frame_out = DecodeCompleteFrame();
-  // Should not be complete.
-  EXPECT_TRUE(frame_out == NULL);
-
-  ++seq_num_;
-  packet_->is_first_packet_in_frame = false;
-  packet_->markerBit = true;
-  packet_->seqNum = seq_num_;
-
-  EXPECT_EQ(kCompleteSession,
-            jitter_buffer_->InsertPacket(*packet_, &retransmitted));
-
-  frame_out = DecodeCompleteFrame();
-  CheckOutFrame(frame_out, 2 * size_, false);
-
-  EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
-  jitter_buffer_->ReleaseFrame(frame_out);
-}
-
-TEST_F(TestBasicJitterBuffer, 100PacketKeyFrame) {
-  packet_->frameType = kVideoFrameKey;
-  packet_->is_first_packet_in_frame = true;
-  packet_->markerBit = false;
-
-  bool retransmitted = false;
-  EXPECT_EQ(kIncomplete,
-            jitter_buffer_->InsertPacket(*packet_, &retransmitted));
-
-  VCMEncodedFrame* frame_out = DecodeCompleteFrame();
-
-  // Frame should not be complete.
-  EXPECT_TRUE(frame_out == NULL);
-
-  // Insert 98 frames.
-  int loop = 0;
-  do {
-    seq_num_++;
-    packet_->is_first_packet_in_frame = false;
-    packet_->markerBit = false;
-    packet_->seqNum = seq_num_;
-
-    EXPECT_EQ(kIncomplete,
-              jitter_buffer_->InsertPacket(*packet_, &retransmitted));
-    loop++;
-  } while (loop < 98);
-
-  // Insert last packet.
-  ++seq_num_;
-  packet_->is_first_packet_in_frame = false;
-  packet_->markerBit = true;
-  packet_->seqNum = seq_num_;
-
-  EXPECT_EQ(kCompleteSession,
-            jitter_buffer_->InsertPacket(*packet_, &retransmitted));
-
-  frame_out = DecodeCompleteFrame();
-
-  CheckOutFrame(frame_out, 100 * size_, false);
-  EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
-  jitter_buffer_->ReleaseFrame(frame_out);
-}
-
-TEST_F(TestBasicJitterBuffer, 100PacketDeltaFrame) {
-  // Always start with a complete key frame.
-  packet_->frameType = kVideoFrameKey;
-  packet_->is_first_packet_in_frame = true;
-  packet_->markerBit = true;
-
-  bool retransmitted = false;
-  EXPECT_EQ(kCompleteSession,
-            jitter_buffer_->InsertPacket(*packet_, &retransmitted));
-  VCMEncodedFrame* frame_out = DecodeCompleteFrame();
-  EXPECT_FALSE(frame_out == NULL);
-  jitter_buffer_->ReleaseFrame(frame_out);
-
-  ++seq_num_;
-  packet_->seqNum = seq_num_;
-  packet_->markerBit = false;
-  packet_->frameType = kVideoFrameDelta;
-  packet_->timestamp += 33 * 90;
-
-  EXPECT_EQ(kIncomplete,
-            jitter_buffer_->InsertPacket(*packet_, &retransmitted));
-
-  frame_out = DecodeCompleteFrame();
-
-  // Frame should not be complete.
-  EXPECT_TRUE(frame_out == NULL);
-
-  packet_->is_first_packet_in_frame = false;
-  // Insert 98 frames.
-  int loop = 0;
-  do {
-    ++seq_num_;
-    packet_->seqNum = seq_num_;
-
-    // Insert a packet into a frame.
-    EXPECT_EQ(kIncomplete,
-              jitter_buffer_->InsertPacket(*packet_, &retransmitted));
-    loop++;
-  } while (loop < 98);
-
-  // Insert the last packet.
-  ++seq_num_;
-  packet_->is_first_packet_in_frame = false;
-  packet_->markerBit = true;
-  packet_->seqNum = seq_num_;
-
-  EXPECT_EQ(kCompleteSession,
-            jitter_buffer_->InsertPacket(*packet_, &retransmitted));
-
-  frame_out = DecodeCompleteFrame();
-
-  CheckOutFrame(frame_out, 100 * size_, false);
-  EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
-  jitter_buffer_->ReleaseFrame(frame_out);
-}
-
-TEST_F(TestBasicJitterBuffer, PacketReorderingReverseOrder) {
-  // Insert the "first" packet last.
-  seq_num_ += 100;
-  packet_->frameType = kVideoFrameKey;
-  packet_->is_first_packet_in_frame = false;
-  packet_->markerBit = true;
-  packet_->seqNum = seq_num_;
-  packet_->timestamp = timestamp_;
-
-  bool retransmitted = false;
-  EXPECT_EQ(kIncomplete,
-            jitter_buffer_->InsertPacket(*packet_, &retransmitted));
-
-  VCMEncodedFrame* frame_out = DecodeCompleteFrame();
-
-  EXPECT_TRUE(frame_out == NULL);
-
-  // Insert 98 packets.
-  int loop = 0;
-  do {
-    seq_num_--;
-    packet_->is_first_packet_in_frame = false;
-    packet_->markerBit = false;
-    packet_->seqNum = seq_num_;
-
-    EXPECT_EQ(kIncomplete,
-              jitter_buffer_->InsertPacket(*packet_, &retransmitted));
-    loop++;
-  } while (loop < 98);
-
-  // Insert the last packet.
-  seq_num_--;
-  packet_->is_first_packet_in_frame = true;
-  packet_->markerBit = false;
-  packet_->seqNum = seq_num_;
-
-  EXPECT_EQ(kCompleteSession,
-            jitter_buffer_->InsertPacket(*packet_, &retransmitted));
-
-  frame_out = DecodeCompleteFrame();
-
-  CheckOutFrame(frame_out, 100 * size_, false);
-
-  EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
-  jitter_buffer_->ReleaseFrame(frame_out);
-}
-
-TEST_F(TestBasicJitterBuffer, FrameReordering2Frames2PacketsEach) {
-  packet_->frameType = kVideoFrameDelta;
-  packet_->is_first_packet_in_frame = true;
-  packet_->markerBit = false;
-
-  bool retransmitted = false;
-  EXPECT_EQ(kIncomplete,
-            jitter_buffer_->InsertPacket(*packet_, &retransmitted));
-
-  VCMEncodedFrame* frame_out = DecodeCompleteFrame();
-
-  EXPECT_TRUE(frame_out == NULL);
-
-  seq_num_++;
-  packet_->is_first_packet_in_frame = false;
-  packet_->markerBit = true;
-  packet_->seqNum = seq_num_;
-
-  EXPECT_EQ(kCompleteSession,
-            jitter_buffer_->InsertPacket(*packet_, &retransmitted));
-
-  // check that we fail to get frame since seqnum is not continuous
-  frame_out = DecodeCompleteFrame();
-  EXPECT_TRUE(frame_out == NULL);
-
-  seq_num_ -= 3;
-  timestamp_ -= 33 * 90;
-  packet_->frameType = kVideoFrameKey;
-  packet_->is_first_packet_in_frame = true;
-  packet_->markerBit = false;
-  packet_->seqNum = seq_num_;
-  packet_->timestamp = timestamp_;
-
-  EXPECT_EQ(kIncomplete,
-            jitter_buffer_->InsertPacket(*packet_, &retransmitted));
-
-  frame_out = DecodeCompleteFrame();
-
-  // It should not be complete.
-  EXPECT_TRUE(frame_out == NULL);
-
-  seq_num_++;
-  packet_->is_first_packet_in_frame = false;
-  packet_->markerBit = true;
-  packet_->seqNum = seq_num_;
-
-  EXPECT_EQ(kCompleteSession,
-            jitter_buffer_->InsertPacket(*packet_, &retransmitted));
-
-  frame_out = DecodeCompleteFrame();
-  CheckOutFrame(frame_out, 2 * size_, false);
-  EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
-  jitter_buffer_->ReleaseFrame(frame_out);
-
-  frame_out = DecodeCompleteFrame();
-  CheckOutFrame(frame_out, 2 * size_, false);
-  EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
-  jitter_buffer_->ReleaseFrame(frame_out);
-}
-
-TEST_F(TestBasicJitterBuffer, TestReorderingWithPadding) {
-  packet_->frameType = kVideoFrameKey;
-  packet_->is_first_packet_in_frame = true;
-  packet_->markerBit = true;
-
-  // Send in an initial good packet/frame (Frame A) to start things off.
-  bool retransmitted = false;
-  EXPECT_EQ(kCompleteSession,
-            jitter_buffer_->InsertPacket(*packet_, &retransmitted));
-  VCMEncodedFrame* frame_out = DecodeCompleteFrame();
-  EXPECT_TRUE(frame_out != NULL);
-  jitter_buffer_->ReleaseFrame(frame_out);
-
-  // Now send in a complete delta frame (Frame C), but with a sequence number
-  // gap. No pic index either, so no temporal scalability cheating :)
-  packet_->frameType = kVideoFrameDelta;
-  // Leave a gap of 2 sequence numbers and two frames.
-  packet_->seqNum = seq_num_ + 3;
-  packet_->timestamp = timestamp_ + (66 * 90);
-  // Still isFirst = marker = true.
-  // Session should be complete (frame is complete), but there's nothing to
-  // decode yet.
-  EXPECT_EQ(kCompleteSession,
-            jitter_buffer_->InsertPacket(*packet_, &retransmitted));
-  frame_out = DecodeCompleteFrame();
-  EXPECT_TRUE(frame_out == NULL);
-
-  // Now send in a complete delta frame (Frame B) that is continuous from A, but
-  // doesn't fill the full gap to C. The rest of the gap is going to be padding.
-  packet_->seqNum = seq_num_ + 1;
-  packet_->timestamp = timestamp_ + (33 * 90);
-  // Still isFirst = marker = true.
-  EXPECT_EQ(kCompleteSession,
-            jitter_buffer_->InsertPacket(*packet_, &retransmitted));
-  frame_out = DecodeCompleteFrame();
-  EXPECT_TRUE(frame_out != NULL);
-  jitter_buffer_->ReleaseFrame(frame_out);
-
-  // But Frame C isn't continuous yet.
-  frame_out = DecodeCompleteFrame();
-  EXPECT_TRUE(frame_out == NULL);
-
-  // Add in the padding. These are empty packets (data length is 0) with no
-  // marker bit and matching the timestamp of Frame B.
-  WebRtcRTPHeader rtpHeader;
-  memset(&rtpHeader, 0, sizeof(rtpHeader));
-  rtpHeader.header.sequenceNumber = seq_num_ + 2;
-  rtpHeader.header.timestamp = timestamp_ + (33 * 90);
-  rtpHeader.header.markerBit = false;
-  VCMPacket empty_packet(data_, 0, rtpHeader);
-  EXPECT_EQ(kOldPacket,
-            jitter_buffer_->InsertPacket(empty_packet, &retransmitted));
-  empty_packet.seqNum += 1;
-  EXPECT_EQ(kOldPacket,
-            jitter_buffer_->InsertPacket(empty_packet, &retransmitted));
-
-  // But now Frame C should be ready!
-  frame_out = DecodeCompleteFrame();
-  EXPECT_TRUE(frame_out != NULL);
-  jitter_buffer_->ReleaseFrame(frame_out);
-}
-
-TEST_F(TestBasicJitterBuffer, DuplicatePackets) {
-  packet_->frameType = kVideoFrameKey;
-  packet_->is_first_packet_in_frame = true;
-  packet_->markerBit = false;
-  packet_->seqNum = seq_num_;
-  packet_->timestamp = timestamp_;
-  EXPECT_EQ(0, jitter_buffer_->num_packets());
-  EXPECT_EQ(0, jitter_buffer_->num_duplicated_packets());
-
-  bool retransmitted = false;
-  EXPECT_EQ(kIncomplete,
-            jitter_buffer_->InsertPacket(*packet_, &retransmitted));
-
-  VCMEncodedFrame* frame_out = DecodeCompleteFrame();
-
-  EXPECT_TRUE(frame_out == NULL);
-  EXPECT_EQ(1, jitter_buffer_->num_packets());
-  EXPECT_EQ(0, jitter_buffer_->num_duplicated_packets());
-
-  // Insert a packet into a frame.
-  EXPECT_EQ(kDuplicatePacket,
-            jitter_buffer_->InsertPacket(*packet_, &retransmitted));
-  EXPECT_EQ(2, jitter_buffer_->num_packets());
-  EXPECT_EQ(1, jitter_buffer_->num_duplicated_packets());
-
-  seq_num_++;
-  packet_->seqNum = seq_num_;
-  packet_->markerBit = true;
-  packet_->is_first_packet_in_frame = false;
-
-  EXPECT_EQ(kCompleteSession,
-            jitter_buffer_->InsertPacket(*packet_, &retransmitted));
-
-  frame_out = DecodeCompleteFrame();
-  ASSERT_TRUE(frame_out != NULL);
-  CheckOutFrame(frame_out, 2 * size_, false);
-
-  EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
-  EXPECT_EQ(3, jitter_buffer_->num_packets());
-  EXPECT_EQ(1, jitter_buffer_->num_duplicated_packets());
-  jitter_buffer_->ReleaseFrame(frame_out);
-}
-
-TEST_F(TestBasicJitterBuffer, DuplicatePreviousDeltaFramePacket) {
-  packet_->frameType = kVideoFrameKey;
-  packet_->is_first_packet_in_frame = true;
-  packet_->markerBit = true;
-  packet_->seqNum = seq_num_;
-  packet_->timestamp = timestamp_;
-  jitter_buffer_->SetDecodeErrorMode(kNoErrors);
-  EXPECT_EQ(0, jitter_buffer_->num_packets());
-  EXPECT_EQ(0, jitter_buffer_->num_duplicated_packets());
-
-  bool retransmitted = false;
-  // Insert first complete frame.
-  EXPECT_EQ(kCompleteSession,
-            jitter_buffer_->InsertPacket(*packet_, &retransmitted));
-
-  VCMEncodedFrame* frame_out = DecodeCompleteFrame();
-  ASSERT_TRUE(frame_out != NULL);
-  CheckOutFrame(frame_out, size_, false);
-  EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
-  jitter_buffer_->ReleaseFrame(frame_out);
-
-  // Insert 3 delta frames.
-  for (uint16_t i = 1; i <= 3; ++i) {
-    packet_->seqNum = seq_num_ + i;
-    packet_->timestamp = timestamp_ + (i * 33) * 90;
-    packet_->frameType = kVideoFrameDelta;
-    EXPECT_EQ(kCompleteSession,
-              jitter_buffer_->InsertPacket(*packet_, &retransmitted));
-    EXPECT_EQ(i + 1, jitter_buffer_->num_packets());
-    EXPECT_EQ(0, jitter_buffer_->num_duplicated_packets());
-  }
-
-  // Retransmit second delta frame.
-  packet_->seqNum = seq_num_ + 2;
-  packet_->timestamp = timestamp_ + 66 * 90;
-
-  EXPECT_EQ(kDuplicatePacket,
-            jitter_buffer_->InsertPacket(*packet_, &retransmitted));
-
-  EXPECT_EQ(5, jitter_buffer_->num_packets());
-  EXPECT_EQ(1, jitter_buffer_->num_duplicated_packets());
-
-  // Should be able to decode 3 delta frames, key frame already decoded.
-  for (size_t i = 0; i < 3; ++i) {
-    frame_out = DecodeCompleteFrame();
-    ASSERT_TRUE(frame_out != NULL);
-    CheckOutFrame(frame_out, size_, false);
-    EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
-    jitter_buffer_->ReleaseFrame(frame_out);
-  }
-}
-
-TEST_F(TestBasicJitterBuffer, TestSkipForwardVp9) {
-  // Verify that JB skips forward to next base layer frame.
-  //  -------------------------------------------------
-  // | 65485 | 65486 | 65487 | 65488 | 65489 | ...
-  // | pid:5 | pid:6 | pid:7 | pid:8 | pid:9 | ...
-  // | tid:0 | tid:2 | tid:1 | tid:2 | tid:0 | ...
-  // |  ss   |   x   |   x   |   x   |       |
-  //  -------------------------------------------------
-  // |<----------tl0idx:200--------->|<---tl0idx:201---
-
-  bool re = false;
-  packet_->codec = kVideoCodecVP9;
-  packet_->video_header.codec = kRtpVideoVp9;
-  packet_->is_first_packet_in_frame = true;
-  packet_->markerBit = true;
-  packet_->video_header.codecHeader.VP9.flexible_mode = false;
-  packet_->video_header.codecHeader.VP9.spatial_idx = 0;
-  packet_->video_header.codecHeader.VP9.beginning_of_frame = true;
-  packet_->video_header.codecHeader.VP9.end_of_frame = true;
-  packet_->video_header.codecHeader.VP9.temporal_up_switch = false;
-
-  packet_->seqNum = 65485;
-  packet_->timestamp = 1000;
-  packet_->frameType = kVideoFrameKey;
-  packet_->video_header.codecHeader.VP9.picture_id = 5;
-  packet_->video_header.codecHeader.VP9.tl0_pic_idx = 200;
-  packet_->video_header.codecHeader.VP9.temporal_idx = 0;
-  packet_->video_header.codecHeader.VP9.ss_data_available = true;
-  packet_->video_header.codecHeader.VP9.gof.SetGofInfoVP9(
-      kTemporalStructureMode3);  // kTemporalStructureMode3: 0-2-1-2..
-  EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
-
-  // Insert next temporal layer 0.
-  packet_->seqNum = 65489;
-  packet_->timestamp = 13000;
-  packet_->frameType = kVideoFrameDelta;
-  packet_->video_header.codecHeader.VP9.picture_id = 9;
-  packet_->video_header.codecHeader.VP9.tl0_pic_idx = 201;
-  packet_->video_header.codecHeader.VP9.temporal_idx = 0;
-  packet_->video_header.codecHeader.VP9.ss_data_available = false;
-  EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
-
-  VCMEncodedFrame* frame_out = DecodeCompleteFrame();
-  EXPECT_EQ(1000U, frame_out->TimeStamp());
-  EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
-  jitter_buffer_->ReleaseFrame(frame_out);
-
-  frame_out = DecodeCompleteFrame();
-  EXPECT_EQ(13000U, frame_out->TimeStamp());
-  EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
-  jitter_buffer_->ReleaseFrame(frame_out);
-}
-
-TEST_F(TestBasicJitterBuffer, ReorderedVp9SsData_3TlLayers) {
-  // Verify that frames are updated with SS data when SS packet is reordered.
-  //  --------------------------------
-  // | 65486 | 65487 | 65485 |...
-  // | pid:6 | pid:7 | pid:5 |...
-  // | tid:2 | tid:1 | tid:0 |...
-  // |       |       |  ss   |
-  //  --------------------------------
-  // |<--------tl0idx:200--------->|
-
-  bool re = false;
-  packet_->codec = kVideoCodecVP9;
-  packet_->video_header.codec = kRtpVideoVp9;
-  packet_->is_first_packet_in_frame = true;
-  packet_->markerBit = true;
-  packet_->video_header.codecHeader.VP9.flexible_mode = false;
-  packet_->video_header.codecHeader.VP9.spatial_idx = 0;
-  packet_->video_header.codecHeader.VP9.beginning_of_frame = true;
-  packet_->video_header.codecHeader.VP9.end_of_frame = true;
-  packet_->video_header.codecHeader.VP9.tl0_pic_idx = 200;
-
-  packet_->seqNum = 65486;
-  packet_->timestamp = 6000;
-  packet_->frameType = kVideoFrameDelta;
-  packet_->video_header.codecHeader.VP9.picture_id = 6;
-  packet_->video_header.codecHeader.VP9.temporal_idx = 2;
-  packet_->video_header.codecHeader.VP9.temporal_up_switch = true;
-  EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
-
-  packet_->seqNum = 65487;
-  packet_->timestamp = 9000;
-  packet_->frameType = kVideoFrameDelta;
-  packet_->video_header.codecHeader.VP9.picture_id = 7;
-  packet_->video_header.codecHeader.VP9.temporal_idx = 1;
-  packet_->video_header.codecHeader.VP9.temporal_up_switch = true;
-  EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
-
-  // Insert first frame with SS data.
-  packet_->seqNum = 65485;
-  packet_->timestamp = 3000;
-  packet_->frameType = kVideoFrameKey;
-  packet_->width = 352;
-  packet_->height = 288;
-  packet_->video_header.codecHeader.VP9.picture_id = 5;
-  packet_->video_header.codecHeader.VP9.temporal_idx = 0;
-  packet_->video_header.codecHeader.VP9.temporal_up_switch = false;
-  packet_->video_header.codecHeader.VP9.ss_data_available = true;
-  packet_->video_header.codecHeader.VP9.gof.SetGofInfoVP9(
-      kTemporalStructureMode3);  // kTemporalStructureMode3: 0-2-1-2..
-  EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
-
-  VCMEncodedFrame* frame_out = DecodeCompleteFrame();
-  EXPECT_EQ(3000U, frame_out->TimeStamp());
-  EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
-  EXPECT_EQ(0, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
-  EXPECT_FALSE(
-      frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
-  jitter_buffer_->ReleaseFrame(frame_out);
-
-  frame_out = DecodeCompleteFrame();
-  EXPECT_EQ(6000U, frame_out->TimeStamp());
-  EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
-  EXPECT_EQ(2, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
-  EXPECT_TRUE(frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
-  jitter_buffer_->ReleaseFrame(frame_out);
-
-  frame_out = DecodeCompleteFrame();
-  EXPECT_EQ(9000U, frame_out->TimeStamp());
-  EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
-  EXPECT_EQ(1, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
-  EXPECT_TRUE(frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
-  jitter_buffer_->ReleaseFrame(frame_out);
-}
-
-TEST_F(TestBasicJitterBuffer, ReorderedVp9SsData_2Tl2SLayers) {
-  // Verify that frames are updated with SS data when SS packet is reordered.
-  //  -----------------------------------------
-  // | 65486  | 65487  | 65485  | 65484  |...
-  // | pid:6  | pid:6  | pid:5  | pid:5  |...
-  // | tid:1  | tid:1  | tid:0  | tid:0  |...
-  // | sid:0  | sid:1  | sid:1  | sid:0  |...
-  // | t:6000 | t:6000 | t:3000 | t:3000 |
-  // |        |        |        |  ss    |
-  //  -----------------------------------------
-  // |<-----------tl0idx:200------------>|
-
-  bool re = false;
-  packet_->codec = kVideoCodecVP9;
-  packet_->video_header.codec = kRtpVideoVp9;
-  packet_->video_header.codecHeader.VP9.flexible_mode = false;
-  packet_->video_header.codecHeader.VP9.beginning_of_frame = true;
-  packet_->video_header.codecHeader.VP9.end_of_frame = true;
-  packet_->video_header.codecHeader.VP9.tl0_pic_idx = 200;
-
-  packet_->is_first_packet_in_frame = true;
-  packet_->markerBit = false;
-  packet_->seqNum = 65486;
-  packet_->timestamp = 6000;
-  packet_->frameType = kVideoFrameDelta;
-  packet_->video_header.codecHeader.VP9.spatial_idx = 0;
-  packet_->video_header.codecHeader.VP9.picture_id = 6;
-  packet_->video_header.codecHeader.VP9.temporal_idx = 1;
-  packet_->video_header.codecHeader.VP9.temporal_up_switch = true;
-  EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(*packet_, &re));
-
-  packet_->is_first_packet_in_frame = false;
-  packet_->markerBit = true;
-  packet_->seqNum = 65487;
-  packet_->frameType = kVideoFrameDelta;
-  packet_->video_header.codecHeader.VP9.spatial_idx = 1;
-  packet_->video_header.codecHeader.VP9.picture_id = 6;
-  packet_->video_header.codecHeader.VP9.temporal_idx = 1;
-  packet_->video_header.codecHeader.VP9.temporal_up_switch = true;
-  EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
-
-  packet_->is_first_packet_in_frame = false;
-  packet_->markerBit = true;
-  packet_->seqNum = 65485;
-  packet_->timestamp = 3000;
-  packet_->frameType = kVideoFrameKey;
-  packet_->video_header.codecHeader.VP9.spatial_idx = 1;
-  packet_->video_header.codecHeader.VP9.picture_id = 5;
-  packet_->video_header.codecHeader.VP9.temporal_idx = 0;
-  packet_->video_header.codecHeader.VP9.temporal_up_switch = false;
-  EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(*packet_, &re));
-
-  // Insert first frame with SS data.
-  packet_->is_first_packet_in_frame = true;
-  packet_->markerBit = false;
-  packet_->seqNum = 65484;
-  packet_->frameType = kVideoFrameKey;
-  packet_->width = 352;
-  packet_->height = 288;
-  packet_->video_header.codecHeader.VP9.spatial_idx = 0;
-  packet_->video_header.codecHeader.VP9.picture_id = 5;
-  packet_->video_header.codecHeader.VP9.temporal_idx = 0;
-  packet_->video_header.codecHeader.VP9.temporal_up_switch = false;
-  packet_->video_header.codecHeader.VP9.ss_data_available = true;
-  packet_->video_header.codecHeader.VP9.gof.SetGofInfoVP9(
-      kTemporalStructureMode2);  // kTemporalStructureMode3: 0-1-0-1..
-  EXPECT_EQ(kCompleteSession, jitter_buffer_->InsertPacket(*packet_, &re));
-
-  VCMEncodedFrame* frame_out = DecodeCompleteFrame();
-  EXPECT_EQ(3000U, frame_out->TimeStamp());
-  EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
-  EXPECT_EQ(0, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
-  EXPECT_FALSE(
-      frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
-  jitter_buffer_->ReleaseFrame(frame_out);
-
-  frame_out = DecodeCompleteFrame();
-  EXPECT_EQ(6000U, frame_out->TimeStamp());
-  EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
-  EXPECT_EQ(1, frame_out->CodecSpecific()->codecSpecific.VP9.temporal_idx);
-  EXPECT_TRUE(frame_out->CodecSpecific()->codecSpecific.VP9.temporal_up_switch);
-  jitter_buffer_->ReleaseFrame(frame_out);
-}
-
-TEST_F(TestBasicJitterBuffer, H264InsertStartCode) {
-  packet_->frameType = kVideoFrameKey;
-  packet_->is_first_packet_in_frame = true;
-  packet_->markerBit = false;
-  packet_->seqNum = seq_num_;
-  packet_->timestamp = timestamp_;
-  packet_->insertStartCode = true;
-
-  bool retransmitted = false;
-  EXPECT_EQ(kIncomplete,
-            jitter_buffer_->InsertPacket(*packet_, &retransmitted));
-
-  VCMEncodedFrame* frame_out = DecodeCompleteFrame();
-
-  // Frame should not be complete.
-  EXPECT_TRUE(frame_out == NULL);
-
-  seq_num_++;
-  packet_->is_first_packet_in_frame = false;
-  packet_->markerBit = true;
-  packet_->seqNum = seq_num_;
-
-  EXPECT_EQ(kCompleteSession,
-            jitter_buffer_->InsertPacket(*packet_, &retransmitted));
-
-  frame_out = DecodeCompleteFrame();
-  CheckOutFrame(frame_out, size_ * 2 + 4 * 2, true);
-  EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
-  jitter_buffer_->ReleaseFrame(frame_out);
-}
-
-TEST_F(TestBasicJitterBuffer, SpsAndPpsHandling) {
-  jitter_buffer_->SetDecodeErrorMode(kNoErrors);
-
-  packet_->timestamp = timestamp_;
-  packet_->frameType = kVideoFrameKey;
-  packet_->is_first_packet_in_frame = true;
-  packet_->markerBit = true;
-  packet_->codec = kVideoCodecH264;
-  packet_->video_header.codec = kRtpVideoH264;
-  packet_->video_header.codecHeader.H264.nalu_type = H264::NaluType::kIdr;
-  packet_->video_header.codecHeader.H264.nalus[0].type = H264::NaluType::kIdr;
-  packet_->video_header.codecHeader.H264.nalus[0].sps_id = -1;
-  packet_->video_header.codecHeader.H264.nalus[0].pps_id = 0;
-  packet_->video_header.codecHeader.H264.nalus_length = 1;
-  bool retransmitted = false;
-  EXPECT_EQ(kCompleteSession,
-            jitter_buffer_->InsertPacket(*packet_, &retransmitted));
-  // Not decodable since sps and pps are missing.
-  EXPECT_EQ(nullptr, DecodeCompleteFrame());
-
-  timestamp_ += 3000;
-  packet_->timestamp = timestamp_;
-  ++seq_num_;
-  packet_->seqNum = seq_num_;
-  packet_->frameType = kVideoFrameKey;
-  packet_->is_first_packet_in_frame = true;
-  packet_->markerBit = false;
-  packet_->codec = kVideoCodecH264;
-  packet_->video_header.codec = kRtpVideoH264;
-  packet_->video_header.codecHeader.H264.nalu_type = H264::NaluType::kStapA;
-  packet_->video_header.codecHeader.H264.nalus[0].type = H264::NaluType::kSps;
-  packet_->video_header.codecHeader.H264.nalus[0].sps_id = 0;
-  packet_->video_header.codecHeader.H264.nalus[0].pps_id = -1;
-  packet_->video_header.codecHeader.H264.nalus[1].type = H264::NaluType::kPps;
-  packet_->video_header.codecHeader.H264.nalus[1].sps_id = 0;
-  packet_->video_header.codecHeader.H264.nalus[1].pps_id = 0;
-  packet_->video_header.codecHeader.H264.nalus_length = 2;
-  // Not complete since the marker bit hasn't been received.
-  EXPECT_EQ(kIncomplete,
-            jitter_buffer_->InsertPacket(*packet_, &retransmitted));
-
-  ++seq_num_;
-  packet_->seqNum = seq_num_;
-  packet_->frameType = kVideoFrameKey;
-  packet_->is_first_packet_in_frame = false;
-  packet_->markerBit = true;
-  packet_->codec = kVideoCodecH264;
-  packet_->video_header.codec = kRtpVideoH264;
-  packet_->video_header.codecHeader.H264.nalu_type = H264::NaluType::kIdr;
-  packet_->video_header.codecHeader.H264.nalus[0].type = H264::NaluType::kIdr;
-  packet_->video_header.codecHeader.H264.nalus[0].sps_id = -1;
-  packet_->video_header.codecHeader.H264.nalus[0].pps_id = 0;
-  packet_->video_header.codecHeader.H264.nalus_length = 1;
-  // Complete and decodable since the pps and sps are received in the first
-  // packet of this frame.
-  EXPECT_EQ(kCompleteSession,
-            jitter_buffer_->InsertPacket(*packet_, &retransmitted));
-  VCMEncodedFrame* frame_out = DecodeCompleteFrame();
-  ASSERT_NE(nullptr, frame_out);
-  jitter_buffer_->ReleaseFrame(frame_out);
-
-  timestamp_ += 3000;
-  packet_->timestamp = timestamp_;
-  ++seq_num_;
-  packet_->seqNum = seq_num_;
-  packet_->frameType = kVideoFrameDelta;
-  packet_->is_first_packet_in_frame = true;
-  packet_->markerBit = true;
-  packet_->codec = kVideoCodecH264;
-  packet_->video_header.codec = kRtpVideoH264;
-  packet_->video_header.codecHeader.H264.nalu_type = H264::NaluType::kSlice;
-  packet_->video_header.codecHeader.H264.nalus[0].type = H264::NaluType::kSlice;
-  packet_->video_header.codecHeader.H264.nalus[0].sps_id = -1;
-  packet_->video_header.codecHeader.H264.nalus[0].pps_id = 0;
-  packet_->video_header.codecHeader.H264.nalus_length = 1;
-  // Complete and decodable since sps, pps and key frame has been received.
-  EXPECT_EQ(kCompleteSession,
-            jitter_buffer_->InsertPacket(*packet_, &retransmitted));
-  frame_out = DecodeCompleteFrame();
-  ASSERT_NE(nullptr, frame_out);
-  jitter_buffer_->ReleaseFrame(frame_out);
-}
-
-// Test threshold conditions of decodable state.
-TEST_F(TestBasicJitterBuffer, PacketLossWithSelectiveErrorsThresholdCheck) {
-  jitter_buffer_->SetDecodeErrorMode(kSelectiveErrors);
-  // Always start with a key frame. Use 10 packets to test Decodable State
-  // boundaries.
-  packet_->frameType = kVideoFrameKey;
-  packet_->is_first_packet_in_frame = true;
-  packet_->markerBit = false;
-  packet_->seqNum = seq_num_;
-  packet_->timestamp = timestamp_;
-
-  bool retransmitted = false;
-  EXPECT_EQ(kIncomplete,
-            jitter_buffer_->InsertPacket(*packet_, &retransmitted));
-  uint32_t timestamp = 0;
-  EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
-  EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
-
-  packet_->is_first_packet_in_frame = false;
-  for (int i = 1; i < 9; ++i) {
-    packet_->seqNum++;
-    EXPECT_EQ(kIncomplete,
-              jitter_buffer_->InsertPacket(*packet_, &retransmitted));
-    EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
-    EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
-  }
-
-  // last packet
-  packet_->markerBit = true;
-  packet_->seqNum++;
-
-  EXPECT_EQ(kCompleteSession,
-            jitter_buffer_->InsertPacket(*packet_, &retransmitted));
-  VCMEncodedFrame* frame_out = DecodeCompleteFrame();
-  CheckOutFrame(frame_out, 10 * size_, false);
-  EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
-  jitter_buffer_->ReleaseFrame(frame_out);
-
-  // An incomplete frame can only be decoded once a subsequent frame has begun
-  // to arrive. Insert packet in distant frame for this purpose.
-  packet_->frameType = kVideoFrameDelta;
-  packet_->is_first_packet_in_frame = true;
-  packet_->markerBit = false;
-  packet_->seqNum += 100;
-  packet_->timestamp += 33 * 90 * 8;
-
-  EXPECT_EQ(kDecodableSession,
-            jitter_buffer_->InsertPacket(*packet_, &retransmitted));
-  EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
-  EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
-
-  // Insert second frame
-  packet_->seqNum -= 99;
-  packet_->timestamp -= 33 * 90 * 7;
-
-  EXPECT_EQ(kDecodableSession,
-            jitter_buffer_->InsertPacket(*packet_, &retransmitted));
-  EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
-  EXPECT_TRUE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
-
-  packet_->is_first_packet_in_frame = false;
-  for (int i = 1; i < 8; ++i) {
-    packet_->seqNum++;
-    EXPECT_EQ(kDecodableSession,
-              jitter_buffer_->InsertPacket(*packet_, &retransmitted));
-    EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
-    EXPECT_TRUE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
-  }
-
-  packet_->seqNum++;
-  EXPECT_EQ(kDecodableSession,
-            jitter_buffer_->InsertPacket(*packet_, &retransmitted));
-  EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
-  EXPECT_TRUE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
-
-  frame_out = DecodeIncompleteFrame();
-  ASSERT_FALSE(NULL == frame_out);
-  CheckOutFrame(frame_out, 9 * size_, false);
-  EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
-  jitter_buffer_->ReleaseFrame(frame_out);
-
-  packet_->markerBit = true;
-  packet_->seqNum++;
-  EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
-}
-
-// Make sure first packet is present before a frame can be decoded.
-TEST_F(TestBasicJitterBuffer, PacketLossWithSelectiveErrorsIncompleteKey) {
-  jitter_buffer_->SetDecodeErrorMode(kSelectiveErrors);
-  // Always start with a key frame.
-  packet_->frameType = kVideoFrameKey;
-  packet_->is_first_packet_in_frame = true;
-  packet_->markerBit = true;
-  packet_->seqNum = seq_num_;
-  packet_->timestamp = timestamp_;
-
-  bool retransmitted = false;
-  EXPECT_EQ(kCompleteSession,
-            jitter_buffer_->InsertPacket(*packet_, &retransmitted));
-  VCMEncodedFrame* frame_out = DecodeCompleteFrame();
-  CheckOutFrame(frame_out, size_, false);
-  EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
-  jitter_buffer_->ReleaseFrame(frame_out);
-
-  // An incomplete frame can only be decoded once a subsequent frame has begun
-  // to arrive. Insert packet in distant frame for this purpose.
-  packet_->frameType = kVideoFrameDelta;
-  packet_->is_first_packet_in_frame = false;
-  packet_->markerBit = false;
-  packet_->seqNum += 100;
-  packet_->timestamp += 33 * 90 * 8;
-  EXPECT_EQ(kIncomplete,
-            jitter_buffer_->InsertPacket(*packet_, &retransmitted));
-  uint32_t timestamp;
-  EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
-  EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
-
-  // Insert second frame - an incomplete key frame.
-  packet_->frameType = kVideoFrameKey;
-  packet_->is_first_packet_in_frame = true;
-  packet_->seqNum -= 99;
-  packet_->timestamp -= 33 * 90 * 7;
-
-  EXPECT_EQ(kIncomplete,
-            jitter_buffer_->InsertPacket(*packet_, &retransmitted));
-  EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
-  EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
-
-  // Insert a few more packets. Make sure we're waiting for the key frame to be
-  // complete.
-  packet_->is_first_packet_in_frame = false;
-  for (int i = 1; i < 5; ++i) {
-    packet_->seqNum++;
-    EXPECT_EQ(kIncomplete,
-              jitter_buffer_->InsertPacket(*packet_, &retransmitted));
-    EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
-    EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
-  }
-
-  // Complete key frame.
-  packet_->markerBit = true;
-  packet_->seqNum++;
-  EXPECT_EQ(kCompleteSession,
-            jitter_buffer_->InsertPacket(*packet_, &retransmitted));
-  frame_out = DecodeCompleteFrame();
-  CheckOutFrame(frame_out, 6 * size_, false);
-  EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
-  jitter_buffer_->ReleaseFrame(frame_out);
-}
-
-// Make sure first packet is present before a frame can be decoded.
-TEST_F(TestBasicJitterBuffer, PacketLossWithSelectiveErrorsMissingFirstPacket) {
-  jitter_buffer_->SetDecodeErrorMode(kSelectiveErrors);
-  // Always start with a key frame.
-  packet_->frameType = kVideoFrameKey;
-  packet_->is_first_packet_in_frame = true;
-  packet_->markerBit = true;
-  packet_->seqNum = seq_num_;
-  packet_->timestamp = timestamp_;
-
-  bool retransmitted = false;
-  EXPECT_EQ(kCompleteSession,
-            jitter_buffer_->InsertPacket(*packet_, &retransmitted));
-  VCMEncodedFrame* frame_out = DecodeCompleteFrame();
-  CheckOutFrame(frame_out, size_, false);
-  EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
-  jitter_buffer_->ReleaseFrame(frame_out);
-
-  // An incomplete frame can only be decoded once a subsequent frame has begun
-  // to arrive. Insert packet in distant frame for this purpose.
-  packet_->frameType = kVideoFrameDelta;
-  packet_->is_first_packet_in_frame = false;
-  packet_->markerBit = false;
-  packet_->seqNum += 100;
-  packet_->timestamp += 33 * 90 * 8;
-  EXPECT_EQ(kIncomplete,
-            jitter_buffer_->InsertPacket(*packet_, &retransmitted));
-  uint32_t timestamp;
-  EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
-  EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
-
-  // Insert second frame with the first packet missing. Make sure we're waiting
-  // for the key frame to be complete.
-  packet_->seqNum -= 98;
-  packet_->timestamp -= 33 * 90 * 7;
-
-  EXPECT_EQ(kIncomplete,
-            jitter_buffer_->InsertPacket(*packet_, &retransmitted));
-  EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
-  EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
-
-  for (int i = 0; i < 5; ++i) {
-    packet_->seqNum++;
-    EXPECT_EQ(kIncomplete,
-              jitter_buffer_->InsertPacket(*packet_, &retransmitted));
-    EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
-    EXPECT_FALSE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
-  }
-
-  // Add first packet. Frame should now be decodable, but incomplete.
-  packet_->is_first_packet_in_frame = true;
-  packet_->seqNum -= 6;
-  EXPECT_EQ(kDecodableSession,
-            jitter_buffer_->InsertPacket(*packet_, &retransmitted));
-  EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
-  EXPECT_TRUE(jitter_buffer_->NextMaybeIncompleteTimestamp(&timestamp));
-
-  frame_out = DecodeIncompleteFrame();
-  CheckOutFrame(frame_out, 7 * size_, false);
-  EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
-  jitter_buffer_->ReleaseFrame(frame_out);
-}
-
-TEST_F(TestBasicJitterBuffer, DiscontinuousStreamWhenDecodingWithErrors) {
-  // Will use one packet per frame.
-  jitter_buffer_->SetDecodeErrorMode(kWithErrors);
-  packet_->frameType = kVideoFrameKey;
-  packet_->is_first_packet_in_frame = true;
-  packet_->markerBit = true;
-  packet_->seqNum = seq_num_;
-  packet_->timestamp = timestamp_;
-  bool retransmitted = false;
-  EXPECT_EQ(kCompleteSession,
-            jitter_buffer_->InsertPacket(*packet_, &retransmitted));
-  uint32_t next_timestamp;
-  VCMEncodedFrame* frame = jitter_buffer_->NextCompleteFrame(0);
-  EXPECT_NE(frame, nullptr);
-  EXPECT_EQ(packet_->timestamp, frame->TimeStamp());
-  frame = jitter_buffer_->ExtractAndSetDecode(frame->TimeStamp());
-  EXPECT_TRUE(frame != NULL);
-  jitter_buffer_->ReleaseFrame(frame);
-
-  // Drop a complete frame.
-  timestamp_ += 2 * 33 * 90;
-  seq_num_ += 2;
-  packet_->frameType = kVideoFrameDelta;
-  packet_->is_first_packet_in_frame = true;
-  packet_->markerBit = false;
-  packet_->seqNum = seq_num_;
-  packet_->timestamp = timestamp_;
-  EXPECT_EQ(kDecodableSession,
-            jitter_buffer_->InsertPacket(*packet_, &retransmitted));
-  // Insert a packet (so the previous one will be released).
-  timestamp_ += 33 * 90;
-  seq_num_ += 2;
-  packet_->frameType = kVideoFrameDelta;
-  packet_->is_first_packet_in_frame = true;
-  packet_->markerBit = false;
-  packet_->seqNum = seq_num_;
-  packet_->timestamp = timestamp_;
-  EXPECT_EQ(kDecodableSession,
-            jitter_buffer_->InsertPacket(*packet_, &retransmitted));
-  EXPECT_EQ(jitter_buffer_->NextCompleteFrame(0), nullptr);
-  EXPECT_TRUE(jitter_buffer_->NextMaybeIncompleteTimestamp(&next_timestamp));
-  EXPECT_EQ(packet_->timestamp - 33 * 90, next_timestamp);
-}
-
-TEST_F(TestBasicJitterBuffer, PacketLoss) {
-  // Verify missing packets statistics and not decodable packets statistics.
-  // Insert 10 frames consisting of 4 packets and remove one from all of them.
-  // The last packet is an empty (non-media) packet.
-
-  // Select a start seqNum which triggers a difficult wrap situation
-  // The JB will only output (incomplete)frames if the next one has started
-  // to arrive. Start by inserting one frame (key).
-  jitter_buffer_->SetDecodeErrorMode(kWithErrors);
-  seq_num_ = 0xffff - 4;
-  seq_num_++;
-  packet_->frameType = kVideoFrameKey;
-  packet_->is_first_packet_in_frame = true;
-  packet_->markerBit = false;
-  packet_->seqNum = seq_num_;
-  packet_->timestamp = timestamp_;
-  packet_->completeNALU = kNaluStart;
-
-  bool retransmitted = false;
-  EXPECT_EQ(kDecodableSession,
-            jitter_buffer_->InsertPacket(*packet_, &retransmitted));
-  for (int i = 0; i < 11; ++i) {
-    webrtc::FrameType frametype = kVideoFrameDelta;
-    seq_num_++;
-    timestamp_ += 33 * 90;
-    packet_->frameType = frametype;
-    packet_->is_first_packet_in_frame = true;
-    packet_->markerBit = false;
-    packet_->seqNum = seq_num_;
-    packet_->timestamp = timestamp_;
-    packet_->completeNALU = kNaluStart;
-
-    EXPECT_EQ(kDecodableSession,
-              jitter_buffer_->InsertPacket(*packet_, &retransmitted));
-
-    VCMEncodedFrame* frame_out = DecodeCompleteFrame();
-
-    // Should not be complete.
-    EXPECT_TRUE(frame_out == NULL);
-
-    seq_num_ += 2;
-    packet_->is_first_packet_in_frame = false;
-    packet_->markerBit = true;
-    packet_->seqNum = seq_num_;
-    packet_->completeNALU = kNaluEnd;
-
-    EXPECT_EQ(jitter_buffer_->InsertPacket(*packet_, &retransmitted),
-              kDecodableSession);
-
-    // Insert an empty (non-media) packet.
-    seq_num_++;
-    packet_->is_first_packet_in_frame = false;
-    packet_->markerBit = false;
-    packet_->seqNum = seq_num_;
-    packet_->completeNALU = kNaluEnd;
-    packet_->frameType = kEmptyFrame;
-
-    EXPECT_EQ(jitter_buffer_->InsertPacket(*packet_, &retransmitted),
-              kDecodableSession);
-    frame_out = DecodeIncompleteFrame();
-
-    // One of the packets has been discarded by the jitter buffer.
-    // Last frame can't be extracted yet.
-    if (i < 10) {
-      CheckOutFrame(frame_out, size_, false);
-
-      if (i == 0) {
-        EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
-      } else {
-        EXPECT_EQ(frametype, frame_out->FrameType());
-      }
-      EXPECT_FALSE(frame_out->Complete());
-      EXPECT_FALSE(frame_out->MissingFrame());
-    }
-
-    jitter_buffer_->ReleaseFrame(frame_out);
-  }
-
-  // Insert 3 old packets and verify that we have 3 discarded packets
-  // Match value to actual latest timestamp decoded.
-  timestamp_ -= 33 * 90;
-  packet_->timestamp = timestamp_ - 1000;
-
-  EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
-
-  packet_->timestamp = timestamp_ - 500;
-
-  EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
-
-  packet_->timestamp = timestamp_ - 100;
-
-  EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
-
-  EXPECT_EQ(3, jitter_buffer_->num_discarded_packets());
-
-  jitter_buffer_->Flush();
-
-  // This statistic shouldn't be reset by a flush.
-  EXPECT_EQ(3, jitter_buffer_->num_discarded_packets());
-}
-
-TEST_F(TestBasicJitterBuffer, DeltaFrame100PacketsWithSeqNumWrap) {
-  seq_num_ = 0xfff0;
-  packet_->frameType = kVideoFrameKey;
-  packet_->is_first_packet_in_frame = true;
-  packet_->markerBit = false;
-  packet_->seqNum = seq_num_;
-  packet_->timestamp = timestamp_;
-
-  bool retransmitted = false;
-  EXPECT_EQ(kIncomplete,
-            jitter_buffer_->InsertPacket(*packet_, &retransmitted));
-
-  VCMEncodedFrame* frame_out = DecodeCompleteFrame();
-
-  EXPECT_TRUE(frame_out == NULL);
-
-  int loop = 0;
-  do {
-    seq_num_++;
-    packet_->is_first_packet_in_frame = false;
-    packet_->markerBit = false;
-    packet_->seqNum = seq_num_;
-
-    EXPECT_EQ(kIncomplete,
-              jitter_buffer_->InsertPacket(*packet_, &retransmitted));
-
-    frame_out = DecodeCompleteFrame();
-
-    EXPECT_TRUE(frame_out == NULL);
-
-    loop++;
-  } while (loop < 98);
-
-  seq_num_++;
-  packet_->is_first_packet_in_frame = false;
-  packet_->markerBit = true;
-  packet_->seqNum = seq_num_;
-
-  EXPECT_EQ(kCompleteSession,
-            jitter_buffer_->InsertPacket(*packet_, &retransmitted));
-
-  frame_out = DecodeCompleteFrame();
-
-  CheckOutFrame(frame_out, 100 * size_, false);
-
-  EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
-  jitter_buffer_->ReleaseFrame(frame_out);
-}
-
-TEST_F(TestBasicJitterBuffer, PacketReorderingReverseWithNegSeqNumWrap) {
-  // Insert "first" packet last seqnum.
-  seq_num_ = 10;
-  packet_->frameType = kVideoFrameKey;
-  packet_->is_first_packet_in_frame = false;
-  packet_->markerBit = true;
-  packet_->seqNum = seq_num_;
-
-  bool retransmitted = false;
-  EXPECT_EQ(kIncomplete,
-            jitter_buffer_->InsertPacket(*packet_, &retransmitted));
-  VCMEncodedFrame* frame_out = DecodeCompleteFrame();
-
-  // Should not be complete.
-  EXPECT_TRUE(frame_out == NULL);
-
-  // Insert 98 frames.
-  int loop = 0;
-  do {
-    seq_num_--;
-    packet_->is_first_packet_in_frame = false;
-    packet_->markerBit = false;
-    packet_->seqNum = seq_num_;
-
-    EXPECT_EQ(kIncomplete,
-              jitter_buffer_->InsertPacket(*packet_, &retransmitted));
-
-    frame_out = DecodeCompleteFrame();
-
-    EXPECT_TRUE(frame_out == NULL);
-
-    loop++;
-  } while (loop < 98);
-
-  // Insert last packet.
-  seq_num_--;
-  packet_->is_first_packet_in_frame = true;
-  packet_->markerBit = false;
-  packet_->seqNum = seq_num_;
-
-  EXPECT_EQ(kCompleteSession,
-            jitter_buffer_->InsertPacket(*packet_, &retransmitted));
-
-  frame_out = DecodeCompleteFrame();
-  CheckOutFrame(frame_out, 100 * size_, false);
-  EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
-  jitter_buffer_->ReleaseFrame(frame_out);
-}
-
-TEST_F(TestBasicJitterBuffer, TestInsertOldFrame) {
-  //   -------      -------
-  //  |   2   |    |   1   |
-  //   -------      -------
-  //  t = 3000     t = 2000
-  seq_num_ = 2;
-  timestamp_ = 3000;
-  packet_->frameType = kVideoFrameKey;
-  packet_->is_first_packet_in_frame = true;
-  packet_->markerBit = true;
-  packet_->timestamp = timestamp_;
-  packet_->seqNum = seq_num_;
-
-  bool retransmitted = false;
-  EXPECT_EQ(kCompleteSession,
-            jitter_buffer_->InsertPacket(*packet_, &retransmitted));
-
-  VCMEncodedFrame* frame_out = DecodeCompleteFrame();
-  EXPECT_EQ(3000u, frame_out->TimeStamp());
-  CheckOutFrame(frame_out, size_, false);
-  EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
-  jitter_buffer_->ReleaseFrame(frame_out);
-
-  seq_num_--;
-  timestamp_ = 2000;
-  packet_->frameType = kVideoFrameDelta;
-  packet_->is_first_packet_in_frame = true;
-  packet_->markerBit = true;
-  packet_->seqNum = seq_num_;
-  packet_->timestamp = timestamp_;
-
-  EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
-}
-
-TEST_F(TestBasicJitterBuffer, TestInsertOldFrameWithSeqNumWrap) {
-  //   -------      -------
-  //  |   2   |    |   1   |
-  //   -------      -------
-  //  t = 3000     t = 0xffffff00
-
-  seq_num_ = 2;
-  timestamp_ = 3000;
-  packet_->frameType = kVideoFrameKey;
-  packet_->is_first_packet_in_frame = true;
-  packet_->markerBit = true;
-  packet_->seqNum = seq_num_;
-  packet_->timestamp = timestamp_;
-
-  bool retransmitted = false;
-  EXPECT_EQ(kCompleteSession,
-            jitter_buffer_->InsertPacket(*packet_, &retransmitted));
-
-  VCMEncodedFrame* frame_out = DecodeCompleteFrame();
-  EXPECT_EQ(timestamp_, frame_out->TimeStamp());
-
-  CheckOutFrame(frame_out, size_, false);
-
-  EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
-
-  jitter_buffer_->ReleaseFrame(frame_out);
-
-  seq_num_--;
-  timestamp_ = 0xffffff00;
-  packet_->frameType = kVideoFrameDelta;
-  packet_->is_first_packet_in_frame = true;
-  packet_->markerBit = true;
-  packet_->seqNum = seq_num_;
-  packet_->timestamp = timestamp_;
-
-  // This timestamp is old.
-  EXPECT_EQ(kOldPacket, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
-}
-
-TEST_F(TestBasicJitterBuffer, TimestampWrap) {
-  //  ---------------     ---------------
-  // |   1   |   2   |   |   3   |   4   |
-  //  ---------------     ---------------
-  //  t = 0xffffff00        t = 33*90
-
-  timestamp_ = 0xffffff00;
-  packet_->frameType = kVideoFrameKey;
-  packet_->is_first_packet_in_frame = true;
-  packet_->markerBit = false;
-  packet_->seqNum = seq_num_;
-  packet_->timestamp = timestamp_;
-
-  bool retransmitted = false;
-  EXPECT_EQ(kIncomplete,
-            jitter_buffer_->InsertPacket(*packet_, &retransmitted));
-
-  VCMEncodedFrame* frame_out = DecodeCompleteFrame();
-  EXPECT_TRUE(frame_out == NULL);
-
-  seq_num_++;
-  packet_->is_first_packet_in_frame = false;
-  packet_->markerBit = true;
-  packet_->seqNum = seq_num_;
-
-  EXPECT_EQ(kCompleteSession,
-            jitter_buffer_->InsertPacket(*packet_, &retransmitted));
-
-  frame_out = DecodeCompleteFrame();
-  CheckOutFrame(frame_out, 2 * size_, false);
-  jitter_buffer_->ReleaseFrame(frame_out);
-
-  seq_num_++;
-  timestamp_ += 33 * 90;
-  packet_->frameType = kVideoFrameDelta;
-  packet_->is_first_packet_in_frame = true;
-  packet_->markerBit = false;
-  packet_->seqNum = seq_num_;
-  packet_->timestamp = timestamp_;
-
-  EXPECT_EQ(kIncomplete,
-            jitter_buffer_->InsertPacket(*packet_, &retransmitted));
-
-  frame_out = DecodeCompleteFrame();
-  EXPECT_TRUE(frame_out == NULL);
-
-  seq_num_++;
-  packet_->is_first_packet_in_frame = false;
-  packet_->markerBit = true;
-  packet_->seqNum = seq_num_;
-
-  EXPECT_EQ(kCompleteSession,
-            jitter_buffer_->InsertPacket(*packet_, &retransmitted));
-
-  frame_out = DecodeCompleteFrame();
-  CheckOutFrame(frame_out, 2 * size_, false);
-  EXPECT_EQ(kVideoFrameDelta, frame_out->FrameType());
-  jitter_buffer_->ReleaseFrame(frame_out);
-}
-
-TEST_F(TestBasicJitterBuffer, 2FrameWithTimestampWrap) {
-  //   -------          -------
-  //  |   1   |        |   2   |
-  //   -------          -------
-  // t = 0xffffff00    t = 2700
-
-  timestamp_ = 0xffffff00;
-  packet_->frameType = kVideoFrameKey;
-  packet_->is_first_packet_in_frame = true;
-  packet_->markerBit = true;
-  packet_->timestamp = timestamp_;
-
-  bool retransmitted = false;
-  // Insert first frame (session will be complete).
-  EXPECT_EQ(kCompleteSession,
-            jitter_buffer_->InsertPacket(*packet_, &retransmitted));
-
-  // Insert next frame.
-  seq_num_++;
-  timestamp_ = 2700;
-  packet_->frameType = kVideoFrameDelta;
-  packet_->is_first_packet_in_frame = true;
-  packet_->markerBit = true;
-  packet_->seqNum = seq_num_;
-  packet_->timestamp = timestamp_;
-
-  EXPECT_EQ(kCompleteSession,
-            jitter_buffer_->InsertPacket(*packet_, &retransmitted));
-
-  VCMEncodedFrame* frame_out = DecodeCompleteFrame();
-  EXPECT_EQ(0xffffff00, frame_out->TimeStamp());
-  CheckOutFrame(frame_out, size_, false);
-  EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
-  jitter_buffer_->ReleaseFrame(frame_out);
-
-  VCMEncodedFrame* frame_out2 = DecodeCompleteFrame();
-  EXPECT_EQ(2700u, frame_out2->TimeStamp());
-  CheckOutFrame(frame_out2, size_, false);
-  EXPECT_EQ(kVideoFrameDelta, frame_out2->FrameType());
-  jitter_buffer_->ReleaseFrame(frame_out2);
-}
-
-TEST_F(TestBasicJitterBuffer, Insert2FramesReOrderedWithTimestampWrap) {
-  //   -------          -------
-  //  |   2   |        |   1   |
-  //   -------          -------
-  //  t = 2700        t = 0xffffff00
-
-  seq_num_ = 2;
-  timestamp_ = 2700;
-  packet_->frameType = kVideoFrameDelta;
-  packet_->is_first_packet_in_frame = true;
-  packet_->markerBit = true;
-  packet_->seqNum = seq_num_;
-  packet_->timestamp = timestamp_;
-
-  bool retransmitted = false;
-  EXPECT_EQ(kCompleteSession,
-            jitter_buffer_->InsertPacket(*packet_, &retransmitted));
-
-  // Insert second frame
-  seq_num_--;
-  timestamp_ = 0xffffff00;
-  packet_->frameType = kVideoFrameKey;
-  packet_->is_first_packet_in_frame = true;
-  packet_->markerBit = true;
-  packet_->seqNum = seq_num_;
-  packet_->timestamp = timestamp_;
-
-  EXPECT_EQ(kCompleteSession,
-            jitter_buffer_->InsertPacket(*packet_, &retransmitted));
-
-  VCMEncodedFrame* frame_out = DecodeCompleteFrame();
-  EXPECT_EQ(0xffffff00, frame_out->TimeStamp());
-  CheckOutFrame(frame_out, size_, false);
-  EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
-  jitter_buffer_->ReleaseFrame(frame_out);
-
-  VCMEncodedFrame* frame_out2 = DecodeCompleteFrame();
-  EXPECT_EQ(2700u, frame_out2->TimeStamp());
-  CheckOutFrame(frame_out2, size_, false);
-  EXPECT_EQ(kVideoFrameDelta, frame_out2->FrameType());
-  jitter_buffer_->ReleaseFrame(frame_out2);
-}
-
-TEST_F(TestBasicJitterBuffer, DeltaFrameWithMoreThanMaxNumberOfPackets) {
-  int loop = 0;
-  bool firstPacket = true;
-  bool retransmitted = false;
-  // Insert kMaxPacketsInJitterBuffer into frame.
-  do {
-    seq_num_++;
-    packet_->is_first_packet_in_frame = false;
-    packet_->markerBit = false;
-    packet_->seqNum = seq_num_;
-
-    if (firstPacket) {
-      EXPECT_EQ(kIncomplete,
-                jitter_buffer_->InsertPacket(*packet_, &retransmitted));
-      firstPacket = false;
-    } else {
-      EXPECT_EQ(kIncomplete,
-                jitter_buffer_->InsertPacket(*packet_, &retransmitted));
-    }
-
-    loop++;
-  } while (loop < kMaxPacketsInSession);
-
-  // Max number of packets inserted.
-  // Insert one more packet.
-  seq_num_++;
-  packet_->is_first_packet_in_frame = false;
-  packet_->markerBit = true;
-  packet_->seqNum = seq_num_;
-
-  // Insert the packet -> frame recycled.
-  EXPECT_EQ(kSizeError, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
-  EXPECT_TRUE(NULL == DecodeCompleteFrame());
-}
-
-TEST_F(TestBasicJitterBuffer, ExceedNumOfFrameWithSeqNumWrap) {
-  // TEST fill JB with more than max number of frame (50 delta frames +
-  // 51 key frames) with wrap in seq_num_
-  //
-  //  --------------------------------------------------------------
-  // | 65485 | 65486 | 65487 | .... | 65535 | 0 | 1 | 2 | .....| 50 |
-  //  --------------------------------------------------------------
-  // |<-----------delta frames------------->|<------key frames----->|
-
-  // Make sure the jitter doesn't request a keyframe after too much non-
-  // decodable frames.
-  jitter_buffer_->SetNackMode(kNack, -1, -1);
-  jitter_buffer_->SetNackSettings(kMaxNumberOfFrames, kMaxNumberOfFrames, 0);
-
-  int loop = 0;
-  seq_num_ = 65485;
-  uint32_t first_key_frame_timestamp = 0;
-  bool retransmitted = false;
-  // Insert MAX_NUMBER_OF_FRAMES frames.
-  do {
-    timestamp_ += 33 * 90;
-    seq_num_++;
-    packet_->is_first_packet_in_frame = true;
-    packet_->markerBit = true;
-    packet_->seqNum = seq_num_;
-    packet_->timestamp = timestamp_;
-
-    if (loop == 50) {
-      first_key_frame_timestamp = packet_->timestamp;
-      packet_->frameType = kVideoFrameKey;
-    }
-
-    // Insert frame.
-    EXPECT_EQ(kCompleteSession,
-              jitter_buffer_->InsertPacket(*packet_, &retransmitted));
-
-    loop++;
-  } while (loop < kMaxNumberOfFrames);
-
-  // Max number of frames inserted.
-
-  // Insert one more frame.
-  timestamp_ += 33 * 90;
-  seq_num_++;
-  packet_->is_first_packet_in_frame = true;
-  packet_->markerBit = true;
-  packet_->seqNum = seq_num_;
-  packet_->timestamp = timestamp_;
-
-  // Now, no free frame - frames will be recycled until first key frame.
-  EXPECT_EQ(kFlushIndicator,
-            jitter_buffer_->InsertPacket(*packet_, &retransmitted));
-
-  VCMEncodedFrame* frame_out = DecodeCompleteFrame();
-  EXPECT_EQ(first_key_frame_timestamp, frame_out->TimeStamp());
-  CheckOutFrame(frame_out, size_, false);
-  EXPECT_EQ(kVideoFrameKey, frame_out->FrameType());
-  jitter_buffer_->ReleaseFrame(frame_out);
-}
-
-TEST_F(TestBasicJitterBuffer, EmptyLastFrame) {
-  jitter_buffer_->SetDecodeErrorMode(kWithErrors);
-  seq_num_ = 3;
-  // Insert one empty packet per frame, should never return the last timestamp
-  // inserted. Only return empty frames in the presence of subsequent frames.
-  int maxSize = 1000;
-  bool retransmitted = false;
-  for (int i = 0; i < maxSize + 10; i++) {
-    timestamp_ += 33 * 90;
-    seq_num_++;
-    packet_->is_first_packet_in_frame = false;
-    packet_->markerBit = false;
-    packet_->seqNum = seq_num_;
-    packet_->timestamp = timestamp_;
-    packet_->frameType = kEmptyFrame;
-
-    EXPECT_EQ(kNoError, jitter_buffer_->InsertPacket(*packet_, &retransmitted));
-    VCMEncodedFrame* testFrame = DecodeIncompleteFrame();
-    // Timestamp should never be the last TS inserted.
-    if (testFrame != NULL) {
-      EXPECT_TRUE(testFrame->TimeStamp() < timestamp_);
-      jitter_buffer_->ReleaseFrame(testFrame);
-    }
-  }
-}
-
-TEST_F(TestBasicJitterBuffer, H264IncompleteNalu) {
-  jitter_buffer_->SetNackMode(kNoNack, -1, -1);
-  jitter_buffer_->SetDecodeErrorMode(kWithErrors);
-  ++seq_num_;
-  timestamp_ += 33 * 90;
-  int insertedLength = 0;
-  packet_->seqNum = seq_num_;
-  packet_->timestamp = timestamp_;
-  packet_->frameType = kVideoFrameKey;
-  packet_->is_first_packet_in_frame = true;
-  packet_->completeNALU = kNaluStart;
-  packet_->markerBit = false;
-  bool retransmitted = false;
-
-  EXPECT_EQ(kDecodableSession,
-            jitter_buffer_->InsertPacket(*packet_, &retransmitted));
-
-  seq_num_ += 2;  // Skip one packet.
-  packet_->seqNum = seq_num_;
-  packet_->frameType = kVideoFrameKey;
-  packet_->is_first_packet_in_frame = false;
-  packet_->completeNALU = kNaluIncomplete;
-  packet_->markerBit = false;
-
-  EXPECT_EQ(kDecodableSession,
-            jitter_buffer_->InsertPacket(*packet_, &retransmitted));
-
-  seq_num_++;
-  packet_->seqNum = seq_num_;
-  packet_->frameType = kVideoFrameKey;
-  packet_->is_first_packet_in_frame = false;
-  packet_->completeNALU = kNaluEnd;
-  packet_->markerBit = false;
-
-  EXPECT_EQ(kDecodableSession,
-            jitter_buffer_->InsertPacket(*packet_, &retransmitted));
-
-  seq_num_++;
-  packet_->seqNum = seq_num_;
-  packet_->completeNALU = kNaluComplete;
-  packet_->markerBit = true;  // Last packet.
-  EXPECT_EQ(kDecodableSession,
-            jitter_buffer_->InsertPacket(*packet_, &retransmitted));
-  // The JB will only output (incomplete) frames if a packet belonging to a
-  // subsequent frame was already inserted. Insert one packet of a subsequent
-  // frame. place high timestamp so the JB would always have a next frame
-  // (otherwise, for every inserted frame we need to take care of the next
-  // frame as well).
-  packet_->seqNum = 1;
-  packet_->timestamp = timestamp_ + 33 * 90 * 10;
-  packet_->frameType = kVideoFrameDelta;
-  packet_->is_first_packet_in_frame = false;
-  packet_->completeNALU = kNaluStart;
-  packet_->markerBit = false;
-
-  EXPECT_EQ(kDecodableSession,
-            jitter_buffer_->InsertPacket(*packet_, &retransmitted));
-
-  VCMEncodedFrame* frame_out = DecodeIncompleteFrame();
-
-  // We can decode everything from a NALU until a packet has been lost.
-  // Thus we can decode the first packet of the first NALU and the second NALU
-  // which consists of one packet.
-  CheckOutFrame(frame_out, packet_->sizeBytes * 2, false);
-  jitter_buffer_->ReleaseFrame(frame_out);
-
-  // Test reordered start frame + 1 lost.
-  seq_num_ += 2;  // Re-order 1 frame.
-  timestamp_ += 33 * 90;
-  insertedLength = 0;
-
-  packet_->seqNum = seq_num_;
-  packet_->timestamp = timestamp_;
-  packet_->frameType = kVideoFrameKey;
-  packet_->is_first_packet_in_frame = false;
-  packet_->completeNALU = kNaluEnd;
-  packet_->markerBit = false;
-  EXPECT_EQ(kDecodableSession,
-            jitter_buffer_->InsertPacket(*packet_, &retransmitted));
-  insertedLength += packet_->sizeBytes;  // This packet should be decoded.
-  seq_num_--;
-  packet_->seqNum = seq_num_;
-  packet_->timestamp = timestamp_;
-  packet_->frameType = kVideoFrameKey;
-  packet_->is_first_packet_in_frame = true;
-  packet_->completeNALU = kNaluStart;
-  packet_->markerBit = false;
-
-  EXPECT_EQ(kDecodableSession,
-            jitter_buffer_->InsertPacket(*packet_, &retransmitted));
-  insertedLength += packet_->sizeBytes;  // This packet should be decoded.
-
-  seq_num_ += 3;  // One packet drop.
-  packet_->seqNum = seq_num_;
-  packet_->timestamp = timestamp_;
-  packet_->frameType = kVideoFrameKey;
-  packet_->is_first_packet_in_frame = false;
-  packet_->completeNALU = kNaluComplete;
-  packet_->markerBit = false;
-  EXPECT_EQ(kDecodableSession,
-            jitter_buffer_->InsertPacket(*packet_, &retransmitted));
-  insertedLength += packet_->sizeBytes;  // This packet should be decoded.
-  seq_num_++;
-  packet_->seqNum = seq_num_;
-  packet_->timestamp = timestamp_;
-  packet_->frameType = kVideoFrameKey;
-  packet_->is_first_packet_in_frame = false;
-  packet_->completeNALU = kNaluStart;
-  packet_->markerBit = false;
-  EXPECT_EQ(kDecodableSession,
-            jitter_buffer_->InsertPacket(*packet_, &retransmitted));
-  // This packet should be decoded since it's the beginning of a NAL.
-  insertedLength += packet_->sizeBytes;
-
-  seq_num_ += 2;
-  packet_->seqNum = seq_num_;
-  packet_->timestamp = timestamp_;
-  packet_->frameType = kVideoFrameKey;
-  packet_->is_first_packet_in_frame = false;
-  packet_->completeNALU = kNaluEnd;
-  packet_->markerBit = true;
-  EXPECT_EQ(kDecodableSession,
-            jitter_buffer_->InsertPacket(*packet_, &retransmitted));
-  // This packet should not be decoded because it is an incomplete NAL if it
-  // is the last.
-  frame_out = DecodeIncompleteFrame();
-  // Only last NALU is complete.
-  CheckOutFrame(frame_out, insertedLength, false);
-  jitter_buffer_->ReleaseFrame(frame_out);
-
-  // Test to insert empty packet.
-  seq_num_++;
-  timestamp_ += 33 * 90;
-  WebRtcRTPHeader rtpHeader;
-  memset(&rtpHeader, 0, sizeof(rtpHeader));
-  VCMPacket emptypacket(data_, 0, rtpHeader);
-  emptypacket.seqNum = seq_num_;
-  emptypacket.timestamp = timestamp_;
-  emptypacket.frameType = kVideoFrameKey;
-  emptypacket.is_first_packet_in_frame = true;
-  emptypacket.completeNALU = kNaluComplete;
-  emptypacket.markerBit = true;
-  EXPECT_EQ(kCompleteSession,
-            jitter_buffer_->InsertPacket(emptypacket, &retransmitted));
-  // This packet should not be decoded because it is an incomplete NAL if it
-  // is the last.
-
-  // Will be sent to the decoder, as a packet belonging to a subsequent frame
-  // has arrived.
-  frame_out = DecodeIncompleteFrame();
-  EXPECT_TRUE(frame_out != NULL);
-  jitter_buffer_->ReleaseFrame(frame_out);
-
-  // Test that a frame can include an empty packet.
-  seq_num_++;
-  timestamp_ += 33 * 90;
-
-  packet_->seqNum = seq_num_;
-  packet_->timestamp = timestamp_;
-  packet_->frameType = kVideoFrameKey;
-  packet_->is_first_packet_in_frame = true;
-  packet_->completeNALU = kNaluComplete;
-  packet_->markerBit = false;
-
-  EXPECT_EQ(kDecodableSession,
-            jitter_buffer_->InsertPacket(*packet_, &retransmitted));
-
-  seq_num_++;
-  emptypacket.seqNum = seq_num_;
-  emptypacket.timestamp = timestamp_;
-  emptypacket.frameType = kVideoFrameKey;
-  emptypacket.is_first_packet_in_frame = true;
-  emptypacket.completeNALU = kNaluComplete;
-  emptypacket.markerBit = true;
-  EXPECT_EQ(kCompleteSession,
-            jitter_buffer_->InsertPacket(emptypacket, &retransmitted));
-
-  frame_out = DecodeCompleteFrame();
-  // Only last NALU is complete
-  CheckOutFrame(frame_out, packet_->sizeBytes, false);
-  jitter_buffer_->ReleaseFrame(frame_out);
-}
-
-TEST_F(TestBasicJitterBuffer, NextFrameWhenIncomplete) {
-  // Test that a we cannot get incomplete frames from the JB if we haven't
-  // received the marker bit, unless we have received a packet from a later
-  // timestamp.
-  jitter_buffer_->SetDecodeErrorMode(kWithErrors);
-  // Start with a complete key frame - insert and decode.
-  packet_->frameType = kVideoFrameKey;
-  packet_->is_first_packet_in_frame = true;
-  packet_->markerBit = true;
-  bool retransmitted = false;
-
-  EXPECT_EQ(kCompleteSession,
-            jitter_buffer_->InsertPacket(*packet_, &retransmitted));
-  VCMEncodedFrame* frame_out = DecodeCompleteFrame();
-  EXPECT_TRUE(frame_out != NULL);
-  jitter_buffer_->ReleaseFrame(frame_out);
-
-  packet_->seqNum += 2;
-  packet_->timestamp += 33 * 90;
-  packet_->frameType = kVideoFrameDelta;
-  packet_->is_first_packet_in_frame = false;
-  packet_->markerBit = false;
-
-  EXPECT_EQ(kDecodableSession,
-            jitter_buffer_->InsertPacket(*packet_, &retransmitted));
-
-  frame_out = DecodeIncompleteFrame();
-  EXPECT_TRUE(frame_out == NULL);
-
-  packet_->seqNum += 2;
-  packet_->timestamp += 33 * 90;
-  packet_->is_first_packet_in_frame = true;
-
-  EXPECT_EQ(kDecodableSession,
-            jitter_buffer_->InsertPacket(*packet_, &retransmitted));
-
-  frame_out = DecodeIncompleteFrame();
-  CheckOutFrame(frame_out, packet_->sizeBytes, false);
-  jitter_buffer_->ReleaseFrame(frame_out);
-}
-
-TEST_F(TestRunningJitterBuffer, Full) {
-  // Make sure the jitter doesn't request a keyframe after too much non-
-  // decodable frames.
-  jitter_buffer_->SetNackMode(kNack, -1, -1);
-  jitter_buffer_->SetNackSettings(kMaxNumberOfFrames, kMaxNumberOfFrames, 0);
-  // Insert a key frame and decode it.
-  EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
-  EXPECT_TRUE(DecodeCompleteFrame());
-  DropFrame(1);
-  // Fill the jitter buffer.
-  EXPECT_GE(InsertFrames(kMaxNumberOfFrames, kVideoFrameDelta), kNoError);
-  // Make sure we can't decode these frames.
-  EXPECT_FALSE(DecodeCompleteFrame());
-  // This frame will make the jitter buffer recycle frames until a key frame.
-  // Since none is found it will have to wait until the next key frame before
-  // decoding.
-  EXPECT_EQ(kFlushIndicator, InsertFrame(kVideoFrameDelta));
-  EXPECT_FALSE(DecodeCompleteFrame());
-}
-
-TEST_F(TestRunningJitterBuffer, EmptyPackets) {
-  // Make sure a frame can get complete even though empty packets are missing.
-  stream_generator_->GenerateFrame(kVideoFrameKey, 3, 3,
-                                   clock_->TimeInMilliseconds());
-  bool request_key_frame = false;
-  // Insert empty packet.
-  EXPECT_EQ(kNoError, InsertPacketAndPop(4));
-  EXPECT_FALSE(request_key_frame);
-  // Insert 3 media packets.
-  EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
-  EXPECT_FALSE(request_key_frame);
-  EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
-  EXPECT_FALSE(request_key_frame);
-  EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
-  EXPECT_FALSE(request_key_frame);
-  // Insert empty packet.
-  EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
-  EXPECT_FALSE(request_key_frame);
-}
-
-TEST_F(TestRunningJitterBuffer, StatisticsTest) {
-  FrameCounts frame_stats(jitter_buffer_->FrameStatistics());
-  EXPECT_EQ(0, frame_stats.delta_frames);
-  EXPECT_EQ(0, frame_stats.key_frames);
-
-  uint32_t framerate = 0;
-  uint32_t bitrate = 0;
-  jitter_buffer_->IncomingRateStatistics(&framerate, &bitrate);
-  EXPECT_EQ(0u, framerate);
-  EXPECT_EQ(0u, bitrate);
-
-  // Insert a couple of key and delta frames.
-  InsertFrame(kVideoFrameKey);
-  InsertFrame(kVideoFrameDelta);
-  InsertFrame(kVideoFrameDelta);
-  InsertFrame(kVideoFrameKey);
-  InsertFrame(kVideoFrameDelta);
-  // Decode some of them to make sure the statistics doesn't depend on frames
-  // being decoded.
-  EXPECT_TRUE(DecodeCompleteFrame());
-  EXPECT_TRUE(DecodeCompleteFrame());
-  frame_stats = jitter_buffer_->FrameStatistics();
-  EXPECT_EQ(3, frame_stats.delta_frames);
-  EXPECT_EQ(2, frame_stats.key_frames);
-
-  // Insert 20 more frames to get estimates of bitrate and framerate over
-  // 1 second.
-  for (int i = 0; i < 20; ++i) {
-    InsertFrame(kVideoFrameDelta);
-  }
-  jitter_buffer_->IncomingRateStatistics(&framerate, &bitrate);
-  // TODO(holmer): The current implementation returns the average of the last
-  // two framerate calculations, which is why it takes two calls to reach the
-  // actual framerate. This should be fixed.
-  EXPECT_EQ(kDefaultFrameRate / 2u, framerate);
-  EXPECT_EQ(kDefaultBitrateKbps, bitrate);
-  // Insert 25 more frames to get estimates of bitrate and framerate over
-  // 2 seconds.
-  for (int i = 0; i < 25; ++i) {
-    InsertFrame(kVideoFrameDelta);
-  }
-  jitter_buffer_->IncomingRateStatistics(&framerate, &bitrate);
-  EXPECT_EQ(kDefaultFrameRate, framerate);
-  EXPECT_EQ(kDefaultBitrateKbps, bitrate);
-}
-
-TEST_F(TestRunningJitterBuffer, SkipToKeyFrame) {
-  // Insert delta frames.
-  EXPECT_GE(InsertFrames(5, kVideoFrameDelta), kNoError);
-  // Can't decode without a key frame.
-  EXPECT_FALSE(DecodeCompleteFrame());
-  InsertFrame(kVideoFrameKey);
-  // Skip to the next key frame.
-  EXPECT_TRUE(DecodeCompleteFrame());
-}
-
-TEST_F(TestRunningJitterBuffer, DontSkipToKeyFrameIfDecodable) {
-  InsertFrame(kVideoFrameKey);
-  EXPECT_TRUE(DecodeCompleteFrame());
-  const int kNumDeltaFrames = 5;
-  EXPECT_GE(InsertFrames(kNumDeltaFrames, kVideoFrameDelta), kNoError);
-  InsertFrame(kVideoFrameKey);
-  for (int i = 0; i < kNumDeltaFrames + 1; ++i) {
-    EXPECT_TRUE(DecodeCompleteFrame());
-  }
-}
-
-TEST_F(TestRunningJitterBuffer, KeyDeltaKeyDelta) {
-  InsertFrame(kVideoFrameKey);
-  EXPECT_TRUE(DecodeCompleteFrame());
-  const int kNumDeltaFrames = 5;
-  EXPECT_GE(InsertFrames(kNumDeltaFrames, kVideoFrameDelta), kNoError);
-  InsertFrame(kVideoFrameKey);
-  EXPECT_GE(InsertFrames(kNumDeltaFrames, kVideoFrameDelta), kNoError);
-  InsertFrame(kVideoFrameKey);
-  for (int i = 0; i < 2 * (kNumDeltaFrames + 1); ++i) {
-    EXPECT_TRUE(DecodeCompleteFrame());
-  }
-}
-
-TEST_F(TestRunningJitterBuffer, TwoPacketsNonContinuous) {
-  InsertFrame(kVideoFrameKey);
-  EXPECT_TRUE(DecodeCompleteFrame());
-  stream_generator_->GenerateFrame(kVideoFrameDelta, 1, 0,
-                                   clock_->TimeInMilliseconds());
-  clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
-  stream_generator_->GenerateFrame(kVideoFrameDelta, 2, 0,
-                                   clock_->TimeInMilliseconds());
-  EXPECT_EQ(kIncomplete, InsertPacketAndPop(1));
-  EXPECT_EQ(kCompleteSession, InsertPacketAndPop(1));
-  EXPECT_FALSE(DecodeCompleteFrame());
-  EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
-  EXPECT_TRUE(DecodeCompleteFrame());
-  EXPECT_TRUE(DecodeCompleteFrame());
-}
-
-TEST_F(TestJitterBufferNack, EmptyPackets) {
-  // Make sure empty packets doesn't clog the jitter buffer.
-  jitter_buffer_->SetNackMode(kNack, media_optimization::kLowRttNackMs, -1);
-  EXPECT_GE(InsertFrames(kMaxNumberOfFrames, kEmptyFrame), kNoError);
-  InsertFrame(kVideoFrameKey);
-  EXPECT_TRUE(DecodeCompleteFrame());
-}
-
-TEST_F(TestJitterBufferNack, NackTooOldPackets) {
-  // Insert a key frame and decode it.
-  EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
-  EXPECT_TRUE(DecodeCompleteFrame());
-
-  // Drop one frame and insert |kNackHistoryLength| to trigger NACKing a too
-  // old packet.
-  DropFrame(1);
-  // Insert a frame which should trigger a recycle until the next key frame.
-  EXPECT_EQ(kFlushIndicator,
-            InsertFrames(oldest_packet_to_nack_ + 1, kVideoFrameDelta));
-  EXPECT_FALSE(DecodeCompleteFrame());
-
-  bool request_key_frame = false;
-  std::vector<uint16_t> nack_list =
-      jitter_buffer_->GetNackList(&request_key_frame);
-  // No key frame will be requested since the jitter buffer is empty.
-  EXPECT_FALSE(request_key_frame);
-  EXPECT_EQ(0u, nack_list.size());
-
-  EXPECT_GE(InsertFrame(kVideoFrameDelta), kNoError);
-  // Waiting for a key frame.
-  EXPECT_FALSE(DecodeCompleteFrame());
-  EXPECT_FALSE(DecodeIncompleteFrame());
-
-  // The next complete continuous frame isn't a key frame, but we're waiting
-  // for one.
-  EXPECT_FALSE(DecodeCompleteFrame());
-  EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
-  // Skipping ahead to the key frame.
-  EXPECT_TRUE(DecodeCompleteFrame());
-}
-
-TEST_F(TestJitterBufferNack, NackLargeJitterBuffer) {
-  // Insert a key frame and decode it.
-  EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
-  EXPECT_TRUE(DecodeCompleteFrame());
-
-  // Insert a frame which should trigger a recycle until the next key frame.
-  EXPECT_GE(InsertFrames(oldest_packet_to_nack_, kVideoFrameDelta), kNoError);
-
-  bool request_key_frame = false;
-  std::vector<uint16_t> nack_list =
-      jitter_buffer_->GetNackList(&request_key_frame);
-  // Verify that the jitter buffer does not request a key frame.
-  EXPECT_FALSE(request_key_frame);
-  // Verify that no packets are NACKed.
-  EXPECT_EQ(0u, nack_list.size());
-  // Verify that we can decode the next frame.
-  EXPECT_TRUE(DecodeCompleteFrame());
-}
-
-TEST_F(TestJitterBufferNack, NackListFull) {
-  // Insert a key frame and decode it.
-  EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
-  EXPECT_TRUE(DecodeCompleteFrame());
-
-  // Generate and drop |kNackHistoryLength| packets to fill the NACK list.
-  DropFrame(max_nack_list_size_ + 1);
-  // Insert a frame which should trigger a recycle until the next key frame.
-  EXPECT_EQ(kFlushIndicator, InsertFrame(kVideoFrameDelta));
-  EXPECT_FALSE(DecodeCompleteFrame());
-
-  bool request_key_frame = false;
-  jitter_buffer_->GetNackList(&request_key_frame);
-  // The jitter buffer is empty, so we won't request key frames until we get a
-  // packet.
-  EXPECT_FALSE(request_key_frame);
-
-  EXPECT_GE(InsertFrame(kVideoFrameDelta), kNoError);
-  // Now we have a packet in the jitter buffer, a key frame will be requested
-  // since it's not a key frame.
-  jitter_buffer_->GetNackList(&request_key_frame);
-  // The jitter buffer is empty, so we won't request key frames until we get a
-  // packet.
-  EXPECT_TRUE(request_key_frame);
-  // The next complete continuous frame isn't a key frame, but we're waiting
-  // for one.
-  EXPECT_FALSE(DecodeCompleteFrame());
-  EXPECT_FALSE(DecodeIncompleteFrame());
-  EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
-  // Skipping ahead to the key frame.
-  EXPECT_TRUE(DecodeCompleteFrame());
-}
-
-TEST_F(TestJitterBufferNack, NoNackListReturnedBeforeFirstDecode) {
-  DropFrame(10);
-  // Insert a frame and try to generate a NACK list. Shouldn't get one.
-  EXPECT_GE(InsertFrame(kVideoFrameDelta), kNoError);
-  bool request_key_frame = false;
-  std::vector<uint16_t> nack_list =
-      jitter_buffer_->GetNackList(&request_key_frame);
-  // No list generated, and a key frame request is signaled.
-  EXPECT_EQ(0u, nack_list.size());
-  EXPECT_TRUE(request_key_frame);
-}
-
-TEST_F(TestJitterBufferNack, NackListBuiltBeforeFirstDecode) {
-  stream_generator_->Init(0, clock_->TimeInMilliseconds());
-  InsertFrame(kVideoFrameKey);
-  stream_generator_->GenerateFrame(kVideoFrameDelta, 2, 0,
-                                   clock_->TimeInMilliseconds());
-  stream_generator_->NextPacket(NULL);  // Drop packet.
-  EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
-  EXPECT_TRUE(DecodeCompleteFrame());
-  bool extended = false;
-  std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
-  EXPECT_EQ(1u, nack_list.size());
-}
-
-TEST_F(TestJitterBufferNack, VerifyRetransmittedFlag) {
-  stream_generator_->Init(0, clock_->TimeInMilliseconds());
-  stream_generator_->GenerateFrame(kVideoFrameKey, 3, 0,
-                                   clock_->TimeInMilliseconds());
-  VCMPacket packet;
-  stream_generator_->PopPacket(&packet, 0);
-  bool retransmitted = false;
-  EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(packet, &retransmitted));
-  EXPECT_FALSE(retransmitted);
-  // Drop second packet.
-  stream_generator_->PopPacket(&packet, 1);
-  EXPECT_EQ(kIncomplete, jitter_buffer_->InsertPacket(packet, &retransmitted));
-  EXPECT_FALSE(retransmitted);
-  EXPECT_FALSE(DecodeCompleteFrame());
-  bool extended = false;
-  std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
-  uint16_t seq_num;
-  EXPECT_EQ(1u, nack_list.size());
-  seq_num = nack_list[0];
-  stream_generator_->PopPacket(&packet, 0);
-  EXPECT_EQ(packet.seqNum, seq_num);
-  EXPECT_EQ(kCompleteSession,
-            jitter_buffer_->InsertPacket(packet, &retransmitted));
-  EXPECT_TRUE(retransmitted);
-  EXPECT_TRUE(DecodeCompleteFrame());
-}
-
-TEST_F(TestJitterBufferNack, UseNackToRecoverFirstKeyFrame) {
-  stream_generator_->Init(0, clock_->TimeInMilliseconds());
-  stream_generator_->GenerateFrame(kVideoFrameKey, 3, 0,
-                                   clock_->TimeInMilliseconds());
-  EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
-  // Drop second packet.
-  EXPECT_EQ(kIncomplete, InsertPacketAndPop(1));
-  EXPECT_FALSE(DecodeCompleteFrame());
-  bool extended = false;
-  std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
-  uint16_t seq_num;
-  ASSERT_EQ(1u, nack_list.size());
-  seq_num = nack_list[0];
-  VCMPacket packet;
-  stream_generator_->GetPacket(&packet, 0);
-  EXPECT_EQ(packet.seqNum, seq_num);
-}
-
-TEST_F(TestJitterBufferNack, UseNackToRecoverFirstKeyFrameSecondInQueue) {
-  VCMPacket packet;
-  stream_generator_->Init(0, clock_->TimeInMilliseconds());
-  // First frame is delta.
-  stream_generator_->GenerateFrame(kVideoFrameDelta, 3, 0,
-                                   clock_->TimeInMilliseconds());
-  EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
-  // Drop second packet in frame.
-  ASSERT_TRUE(stream_generator_->PopPacket(&packet, 0));
-  EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
-  // Second frame is key.
-  stream_generator_->GenerateFrame(kVideoFrameKey, 3, 0,
-                                   clock_->TimeInMilliseconds() + 10);
-  EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
-  // Drop second packet in frame.
-  EXPECT_EQ(kIncomplete, InsertPacketAndPop(1));
-  EXPECT_FALSE(DecodeCompleteFrame());
-  bool extended = false;
-  std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
-  uint16_t seq_num;
-  ASSERT_EQ(1u, nack_list.size());
-  seq_num = nack_list[0];
-  stream_generator_->GetPacket(&packet, 0);
-  EXPECT_EQ(packet.seqNum, seq_num);
-}
-
-TEST_F(TestJitterBufferNack, NormalOperation) {
-  EXPECT_EQ(kNack, jitter_buffer_->nack_mode());
-  jitter_buffer_->SetDecodeErrorMode(kWithErrors);
-
-  EXPECT_GE(InsertFrame(kVideoFrameKey), kNoError);
-  EXPECT_TRUE(DecodeIncompleteFrame());
-
-  //  ----------------------------------------------------------------
-  // | 1 | 2 | .. | 8 | 9 | x | 11 | 12 | .. | 19 | x | 21 | .. | 100 |
-  //  ----------------------------------------------------------------
-  stream_generator_->GenerateFrame(kVideoFrameKey, 100, 0,
-                                   clock_->TimeInMilliseconds());
-  clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
-  EXPECT_EQ(kDecodableSession, InsertPacketAndPop(0));
-  // Verify that the frame is incomplete.
-  EXPECT_FALSE(DecodeCompleteFrame());
-  while (stream_generator_->PacketsRemaining() > 1) {
-    if (stream_generator_->NextSequenceNumber() % 10 != 0) {
-      EXPECT_EQ(kDecodableSession, InsertPacketAndPop(0));
-    } else {
-      stream_generator_->NextPacket(NULL);  // Drop packet
-    }
-  }
-  EXPECT_EQ(kDecodableSession, InsertPacketAndPop(0));
-  EXPECT_EQ(0, stream_generator_->PacketsRemaining());
-  EXPECT_FALSE(DecodeCompleteFrame());
-  EXPECT_FALSE(DecodeIncompleteFrame());
-  bool request_key_frame = false;
-
-  // Verify the NACK list.
-  std::vector<uint16_t> nack_list =
-      jitter_buffer_->GetNackList(&request_key_frame);
-  const size_t kExpectedNackSize = 9;
-  ASSERT_EQ(kExpectedNackSize, nack_list.size());
-  for (size_t i = 0; i < nack_list.size(); ++i)
-    EXPECT_EQ((1 + i) * 10, nack_list[i]);
-}
-
-TEST_F(TestJitterBufferNack, NormalOperationWrap) {
-  bool request_key_frame = false;
-  //  -------   ------------------------------------------------------------
-  // | 65532 | | 65533 | 65534 | 65535 | x | 1 | .. | 9 | x | 11 |.....| 96 |
-  //  -------   ------------------------------------------------------------
-  stream_generator_->Init(65532, clock_->TimeInMilliseconds());
-  InsertFrame(kVideoFrameKey);
-  EXPECT_FALSE(request_key_frame);
-  EXPECT_TRUE(DecodeCompleteFrame());
-  stream_generator_->GenerateFrame(kVideoFrameDelta, 100, 0,
-                                   clock_->TimeInMilliseconds());
-  EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
-  while (stream_generator_->PacketsRemaining() > 1) {
-    if (stream_generator_->NextSequenceNumber() % 10 != 0) {
-      EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
-      EXPECT_FALSE(request_key_frame);
-    } else {
-      stream_generator_->NextPacket(NULL);  // Drop packet
-    }
-  }
-  EXPECT_EQ(kIncomplete, InsertPacketAndPop(0));
-  EXPECT_FALSE(request_key_frame);
-  EXPECT_EQ(0, stream_generator_->PacketsRemaining());
-  EXPECT_FALSE(DecodeCompleteFrame());
-  EXPECT_FALSE(DecodeCompleteFrame());
-  bool extended = false;
-  std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
-  // Verify the NACK list.
-  const size_t kExpectedNackSize = 10;
-  ASSERT_EQ(kExpectedNackSize, nack_list.size());
-  for (size_t i = 0; i < nack_list.size(); ++i)
-    EXPECT_EQ(i * 10, nack_list[i]);
-}
-
-TEST_F(TestJitterBufferNack, NormalOperationWrap2) {
-  bool request_key_frame = false;
-  //  -----------------------------------
-  // | 65532 | 65533 | 65534 | x | 0 | 1 |
-  //  -----------------------------------
-  stream_generator_->Init(65532, clock_->TimeInMilliseconds());
-  InsertFrame(kVideoFrameKey);
-  EXPECT_FALSE(request_key_frame);
-  EXPECT_TRUE(DecodeCompleteFrame());
-  stream_generator_->GenerateFrame(kVideoFrameDelta, 1, 0,
-                                   clock_->TimeInMilliseconds());
-  clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
-  for (int i = 0; i < 5; ++i) {
-    if (stream_generator_->NextSequenceNumber() != 65535) {
-      EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
-      EXPECT_FALSE(request_key_frame);
-    } else {
-      stream_generator_->NextPacket(NULL);  // Drop packet
-    }
-    stream_generator_->GenerateFrame(kVideoFrameDelta, 1, 0,
-                                     clock_->TimeInMilliseconds());
-    clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
-  }
-  EXPECT_EQ(kCompleteSession, InsertPacketAndPop(0));
-  EXPECT_FALSE(request_key_frame);
-  bool extended = false;
-  std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
-  // Verify the NACK list.
-  ASSERT_EQ(1u, nack_list.size());
-  EXPECT_EQ(65535, nack_list[0]);
-}
-
-TEST_F(TestJitterBufferNack, ResetByFutureKeyFrameDoesntError) {
-  stream_generator_->Init(0, clock_->TimeInMilliseconds());
-  InsertFrame(kVideoFrameKey);
-  EXPECT_TRUE(DecodeCompleteFrame());
-  bool extended = false;
-  std::vector<uint16_t> nack_list = jitter_buffer_->GetNackList(&extended);
-  EXPECT_EQ(0u, nack_list.size());
-
-  // Far-into-the-future video frame, could be caused by resetting the encoder
-  // or otherwise restarting. This should not fail when error when the packet is
-  // a keyframe, even if all of the nack list needs to be flushed.
-  stream_generator_->Init(10000, clock_->TimeInMilliseconds());
-  clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
-  InsertFrame(kVideoFrameKey);
-  EXPECT_TRUE(DecodeCompleteFrame());
-  nack_list = jitter_buffer_->GetNackList(&extended);
-  EXPECT_EQ(0u, nack_list.size());
-
-  // Stream should be decodable from this point.
-  clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
-  InsertFrame(kVideoFrameDelta);
-  EXPECT_TRUE(DecodeCompleteFrame());
-  nack_list = jitter_buffer_->GetNackList(&extended);
-  EXPECT_EQ(0u, nack_list.size());
-}
-}  // namespace webrtc
diff --git a/modules/video_coding/jitter_estimator.cc b/modules/video_coding/jitter_estimator.cc
deleted file mode 100644
index b92ed67..0000000
--- a/modules/video_coding/jitter_estimator.cc
+++ /dev/null
@@ -1,443 +0,0 @@
-/*
- *  Copyright (c) 2011 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/video_coding/jitter_estimator.h"
-
-#include <assert.h>
-#include <math.h>
-#include <stdlib.h>
-#include <string.h>
-#include <string>
-
-#include "webrtc/modules/video_coding/internal_defines.h"
-#include "webrtc/modules/video_coding/rtt_filter.h"
-#include "webrtc/system_wrappers/include/clock.h"
-#include "webrtc/system_wrappers/include/field_trial.h"
-
-namespace webrtc {
-
-enum { kStartupDelaySamples = 30 };
-enum { kFsAccuStartupSamples = 5 };
-enum { kMaxFramerateEstimate = 200 };
-
-VCMJitterEstimator::VCMJitterEstimator(const Clock* clock,
-                                       int32_t vcmId,
-                                       int32_t receiverId)
-    : _vcmId(vcmId),
-      _receiverId(receiverId),
-      _phi(0.97),
-      _psi(0.9999),
-      _alphaCountMax(400),
-      _thetaLow(0.000001),
-      _nackLimit(3),
-      _numStdDevDelayOutlier(15),
-      _numStdDevFrameSizeOutlier(3),
-      _noiseStdDevs(2.33),       // ~Less than 1% chance
-                                 // (look up in normal distribution table)...
-      _noiseStdDevOffset(30.0),  // ...of getting 30 ms freezes
-      _rttFilter(),
-      fps_counter_(30),  // TODO(sprang): Use an estimator with limit based on
-                         // time, rather than number of samples.
-      low_rate_experiment_(kInit),
-      clock_(clock) {
-  Reset();
-}
-
-VCMJitterEstimator::~VCMJitterEstimator() {}
-
-VCMJitterEstimator& VCMJitterEstimator::operator=(
-    const VCMJitterEstimator& rhs) {
-  if (this != &rhs) {
-    memcpy(_thetaCov, rhs._thetaCov, sizeof(_thetaCov));
-    memcpy(_Qcov, rhs._Qcov, sizeof(_Qcov));
-
-    _vcmId = rhs._vcmId;
-    _receiverId = rhs._receiverId;
-    _avgFrameSize = rhs._avgFrameSize;
-    _varFrameSize = rhs._varFrameSize;
-    _maxFrameSize = rhs._maxFrameSize;
-    _fsSum = rhs._fsSum;
-    _fsCount = rhs._fsCount;
-    _lastUpdateT = rhs._lastUpdateT;
-    _prevEstimate = rhs._prevEstimate;
-    _prevFrameSize = rhs._prevFrameSize;
-    _avgNoise = rhs._avgNoise;
-    _alphaCount = rhs._alphaCount;
-    _filterJitterEstimate = rhs._filterJitterEstimate;
-    _startupCount = rhs._startupCount;
-    _latestNackTimestamp = rhs._latestNackTimestamp;
-    _nackCount = rhs._nackCount;
-    _rttFilter = rhs._rttFilter;
-  }
-  return *this;
-}
-
-// Resets the JitterEstimate
-void VCMJitterEstimator::Reset() {
-  _theta[0] = 1 / (512e3 / 8);
-  _theta[1] = 0;
-  _varNoise = 4.0;
-
-  _thetaCov[0][0] = 1e-4;
-  _thetaCov[1][1] = 1e2;
-  _thetaCov[0][1] = _thetaCov[1][0] = 0;
-  _Qcov[0][0] = 2.5e-10;
-  _Qcov[1][1] = 1e-10;
-  _Qcov[0][1] = _Qcov[1][0] = 0;
-  _avgFrameSize = 500;
-  _maxFrameSize = 500;
-  _varFrameSize = 100;
-  _lastUpdateT = -1;
-  _prevEstimate = -1.0;
-  _prevFrameSize = 0;
-  _avgNoise = 0.0;
-  _alphaCount = 1;
-  _filterJitterEstimate = 0.0;
-  _latestNackTimestamp = 0;
-  _nackCount = 0;
-  _fsSum = 0;
-  _fsCount = 0;
-  _startupCount = 0;
-  _rttFilter.Reset();
-  fps_counter_.Reset();
-}
-
-void VCMJitterEstimator::ResetNackCount() {
-  _nackCount = 0;
-}
-
-// Updates the estimates with the new measurements
-void VCMJitterEstimator::UpdateEstimate(int64_t frameDelayMS,
-                                        uint32_t frameSizeBytes,
-                                        bool incompleteFrame /* = false */) {
-  if (frameSizeBytes == 0) {
-    return;
-  }
-  int deltaFS = frameSizeBytes - _prevFrameSize;
-  if (_fsCount < kFsAccuStartupSamples) {
-    _fsSum += frameSizeBytes;
-    _fsCount++;
-  } else if (_fsCount == kFsAccuStartupSamples) {
-    // Give the frame size filter
-    _avgFrameSize = static_cast<double>(_fsSum) / static_cast<double>(_fsCount);
-    _fsCount++;
-  }
-  if (!incompleteFrame || frameSizeBytes > _avgFrameSize) {
-    double avgFrameSize = _phi * _avgFrameSize + (1 - _phi) * frameSizeBytes;
-    if (frameSizeBytes < _avgFrameSize + 2 * sqrt(_varFrameSize)) {
-      // Only update the average frame size if this sample wasn't a
-      // key frame
-      _avgFrameSize = avgFrameSize;
-    }
-    // Update the variance anyway since we want to capture cases where we only
-    // get
-    // key frames.
-    _varFrameSize = VCM_MAX(_phi * _varFrameSize +
-                                (1 - _phi) * (frameSizeBytes - avgFrameSize) *
-                                    (frameSizeBytes - avgFrameSize),
-                            1.0);
-  }
-
-  // Update max frameSize estimate
-  _maxFrameSize =
-      VCM_MAX(_psi * _maxFrameSize, static_cast<double>(frameSizeBytes));
-
-  if (_prevFrameSize == 0) {
-    _prevFrameSize = frameSizeBytes;
-    return;
-  }
-  _prevFrameSize = frameSizeBytes;
-
-  // Only update the Kalman filter if the sample is not considered
-  // an extreme outlier. Even if it is an extreme outlier from a
-  // delay point of view, if the frame size also is large the
-  // deviation is probably due to an incorrect line slope.
-  double deviation = DeviationFromExpectedDelay(frameDelayMS, deltaFS);
-
-  if (fabs(deviation) < _numStdDevDelayOutlier * sqrt(_varNoise) ||
-      frameSizeBytes >
-          _avgFrameSize + _numStdDevFrameSizeOutlier * sqrt(_varFrameSize)) {
-    // Update the variance of the deviation from the
-    // line given by the Kalman filter
-    EstimateRandomJitter(deviation, incompleteFrame);
-    // Prevent updating with frames which have been congested by a large
-    // frame, and therefore arrives almost at the same time as that frame.
-    // This can occur when we receive a large frame (key frame) which
-    // has been delayed. The next frame is of normal size (delta frame),
-    // and thus deltaFS will be << 0. This removes all frame samples
-    // which arrives after a key frame.
-    if ((!incompleteFrame || deviation >= 0.0) &&
-        static_cast<double>(deltaFS) > -0.25 * _maxFrameSize) {
-      // Update the Kalman filter with the new data
-      KalmanEstimateChannel(frameDelayMS, deltaFS);
-    }
-  } else {
-    int nStdDev =
-        (deviation >= 0) ? _numStdDevDelayOutlier : -_numStdDevDelayOutlier;
-    EstimateRandomJitter(nStdDev * sqrt(_varNoise), incompleteFrame);
-  }
-  // Post process the total estimated jitter
-  if (_startupCount >= kStartupDelaySamples) {
-    PostProcessEstimate();
-  } else {
-    _startupCount++;
-  }
-}
-
-// Updates the nack/packet ratio
-void VCMJitterEstimator::FrameNacked() {
-  // Wait until _nackLimit retransmissions has been received,
-  // then always add ~1 RTT delay.
-  // TODO(holmer): Should we ever remove the additional delay if the
-  // the packet losses seem to have stopped? We could for instance scale
-  // the number of RTTs to add with the amount of retransmissions in a given
-  // time interval, or similar.
-  if (_nackCount < _nackLimit) {
-    _nackCount++;
-  }
-}
-
-// Updates Kalman estimate of the channel
-// The caller is expected to sanity check the inputs.
-void VCMJitterEstimator::KalmanEstimateChannel(int64_t frameDelayMS,
-                                               int32_t deltaFSBytes) {
-  double Mh[2];
-  double hMh_sigma;
-  double kalmanGain[2];
-  double measureRes;
-  double t00, t01;
-
-  // Kalman filtering
-
-  // Prediction
-  // M = M + Q
-  _thetaCov[0][0] += _Qcov[0][0];
-  _thetaCov[0][1] += _Qcov[0][1];
-  _thetaCov[1][0] += _Qcov[1][0];
-  _thetaCov[1][1] += _Qcov[1][1];
-
-  // Kalman gain
-  // K = M*h'/(sigma2n + h*M*h') = M*h'/(1 + h*M*h')
-  // h = [dFS 1]
-  // Mh = M*h'
-  // hMh_sigma = h*M*h' + R
-  Mh[0] = _thetaCov[0][0] * deltaFSBytes + _thetaCov[0][1];
-  Mh[1] = _thetaCov[1][0] * deltaFSBytes + _thetaCov[1][1];
-  // sigma weights measurements with a small deltaFS as noisy and
-  // measurements with large deltaFS as good
-  if (_maxFrameSize < 1.0) {
-    return;
-  }
-  double sigma = (300.0 * exp(-fabs(static_cast<double>(deltaFSBytes)) /
-                              (1e0 * _maxFrameSize)) +
-                  1) *
-                 sqrt(_varNoise);
-  if (sigma < 1.0) {
-    sigma = 1.0;
-  }
-  hMh_sigma = deltaFSBytes * Mh[0] + Mh[1] + sigma;
-  if ((hMh_sigma < 1e-9 && hMh_sigma >= 0) ||
-      (hMh_sigma > -1e-9 && hMh_sigma <= 0)) {
-    assert(false);
-    return;
-  }
-  kalmanGain[0] = Mh[0] / hMh_sigma;
-  kalmanGain[1] = Mh[1] / hMh_sigma;
-
-  // Correction
-  // theta = theta + K*(dT - h*theta)
-  measureRes = frameDelayMS - (deltaFSBytes * _theta[0] + _theta[1]);
-  _theta[0] += kalmanGain[0] * measureRes;
-  _theta[1] += kalmanGain[1] * measureRes;
-
-  if (_theta[0] < _thetaLow) {
-    _theta[0] = _thetaLow;
-  }
-
-  // M = (I - K*h)*M
-  t00 = _thetaCov[0][0];
-  t01 = _thetaCov[0][1];
-  _thetaCov[0][0] = (1 - kalmanGain[0] * deltaFSBytes) * t00 -
-                    kalmanGain[0] * _thetaCov[1][0];
-  _thetaCov[0][1] = (1 - kalmanGain[0] * deltaFSBytes) * t01 -
-                    kalmanGain[0] * _thetaCov[1][1];
-  _thetaCov[1][0] = _thetaCov[1][0] * (1 - kalmanGain[1]) -
-                    kalmanGain[1] * deltaFSBytes * t00;
-  _thetaCov[1][1] = _thetaCov[1][1] * (1 - kalmanGain[1]) -
-                    kalmanGain[1] * deltaFSBytes * t01;
-
-  // Covariance matrix, must be positive semi-definite
-  assert(_thetaCov[0][0] + _thetaCov[1][1] >= 0 &&
-         _thetaCov[0][0] * _thetaCov[1][1] -
-                 _thetaCov[0][1] * _thetaCov[1][0] >=
-             0 &&
-         _thetaCov[0][0] >= 0);
-}
-
-// Calculate difference in delay between a sample and the
-// expected delay estimated by the Kalman filter
-double VCMJitterEstimator::DeviationFromExpectedDelay(
-    int64_t frameDelayMS,
-    int32_t deltaFSBytes) const {
-  return frameDelayMS - (_theta[0] * deltaFSBytes + _theta[1]);
-}
-
-// Estimates the random jitter by calculating the variance of the
-// sample distance from the line given by theta.
-void VCMJitterEstimator::EstimateRandomJitter(double d_dT,
-                                              bool incompleteFrame) {
-  uint64_t now = clock_->TimeInMicroseconds();
-  if (_lastUpdateT != -1) {
-    fps_counter_.AddSample(now - _lastUpdateT);
-  }
-  _lastUpdateT = now;
-
-  if (_alphaCount == 0) {
-    assert(false);
-    return;
-  }
-  double alpha =
-      static_cast<double>(_alphaCount - 1) / static_cast<double>(_alphaCount);
-  _alphaCount++;
-  if (_alphaCount > _alphaCountMax)
-    _alphaCount = _alphaCountMax;
-
-  if (LowRateExperimentEnabled()) {
-    // In order to avoid a low frame rate stream to react slower to changes,
-    // scale the alpha weight relative a 30 fps stream.
-    double fps = GetFrameRate();
-    if (fps > 0.0) {
-      double rate_scale = 30.0 / fps;
-      // At startup, there can be a lot of noise in the fps estimate.
-      // Interpolate rate_scale linearly, from 1.0 at sample #1, to 30.0 / fps
-      // at sample #kStartupDelaySamples.
-      if (_alphaCount < kStartupDelaySamples) {
-        rate_scale =
-            (_alphaCount * rate_scale + (kStartupDelaySamples - _alphaCount)) /
-            kStartupDelaySamples;
-      }
-      alpha = pow(alpha, rate_scale);
-    }
-  }
-
-  double avgNoise = alpha * _avgNoise + (1 - alpha) * d_dT;
-  double varNoise =
-      alpha * _varNoise + (1 - alpha) * (d_dT - _avgNoise) * (d_dT - _avgNoise);
-  if (!incompleteFrame || varNoise > _varNoise) {
-    _avgNoise = avgNoise;
-    _varNoise = varNoise;
-  }
-  if (_varNoise < 1.0) {
-    // The variance should never be zero, since we might get
-    // stuck and consider all samples as outliers.
-    _varNoise = 1.0;
-  }
-}
-
-double VCMJitterEstimator::NoiseThreshold() const {
-  double noiseThreshold = _noiseStdDevs * sqrt(_varNoise) - _noiseStdDevOffset;
-  if (noiseThreshold < 1.0) {
-    noiseThreshold = 1.0;
-  }
-  return noiseThreshold;
-}
-
-// Calculates the current jitter estimate from the filtered estimates
-double VCMJitterEstimator::CalculateEstimate() {
-  double ret = _theta[0] * (_maxFrameSize - _avgFrameSize) + NoiseThreshold();
-
-  // A very low estimate (or negative) is neglected
-  if (ret < 1.0) {
-    if (_prevEstimate <= 0.01) {
-      ret = 1.0;
-    } else {
-      ret = _prevEstimate;
-    }
-  }
-  if (ret > 10000.0) {  // Sanity
-    ret = 10000.0;
-  }
-  _prevEstimate = ret;
-  return ret;
-}
-
-void VCMJitterEstimator::PostProcessEstimate() {
-  _filterJitterEstimate = CalculateEstimate();
-}
-
-void VCMJitterEstimator::UpdateRtt(int64_t rttMs) {
-  _rttFilter.Update(rttMs);
-}
-
-void VCMJitterEstimator::UpdateMaxFrameSize(uint32_t frameSizeBytes) {
-  if (_maxFrameSize < frameSizeBytes) {
-    _maxFrameSize = frameSizeBytes;
-  }
-}
-
-// Returns the current filtered estimate if available,
-// otherwise tries to calculate an estimate.
-int VCMJitterEstimator::GetJitterEstimate(double rttMultiplier) {
-  double jitterMS = CalculateEstimate() + OPERATING_SYSTEM_JITTER;
-  if (_filterJitterEstimate > jitterMS)
-    jitterMS = _filterJitterEstimate;
-  if (_nackCount >= _nackLimit)
-    jitterMS += _rttFilter.RttMs() * rttMultiplier;
-
-  if (LowRateExperimentEnabled()) {
-    static const double kJitterScaleLowThreshold = 5.0;
-    static const double kJitterScaleHighThreshold = 10.0;
-    double fps = GetFrameRate();
-    // Ignore jitter for very low fps streams.
-    if (fps < kJitterScaleLowThreshold) {
-      if (fps == 0.0) {
-        return jitterMS;
-      }
-      return 0;
-    }
-
-    // Semi-low frame rate; scale by factor linearly interpolated from 0.0 at
-    // kJitterScaleLowThreshold to 1.0 at kJitterScaleHighThreshold.
-    if (fps < kJitterScaleHighThreshold) {
-      jitterMS =
-          (1.0 / (kJitterScaleHighThreshold - kJitterScaleLowThreshold)) *
-          (fps - kJitterScaleLowThreshold) * jitterMS;
-    }
-  }
-
-  return static_cast<uint32_t>(jitterMS + 0.5);
-}
-
-bool VCMJitterEstimator::LowRateExperimentEnabled() {
-  if (low_rate_experiment_ == kInit) {
-    std::string group =
-        webrtc::field_trial::FindFullName("WebRTC-ReducedJitterDelay");
-    if (group == "Disabled") {
-      low_rate_experiment_ = kDisabled;
-    } else {
-      low_rate_experiment_ = kEnabled;
-    }
-  }
-  return low_rate_experiment_ == kEnabled ? true : false;
-}
-
-double VCMJitterEstimator::GetFrameRate() const {
-  if (fps_counter_.ComputeMean() == 0.0)
-    return 0;
-
-  double fps = 1000000.0 / fps_counter_.ComputeMean();
-  // Sanity check.
-  assert(fps >= 0.0);
-  if (fps > kMaxFramerateEstimate) {
-    fps = kMaxFramerateEstimate;
-  }
-  return fps;
-}
-}  // namespace webrtc
diff --git a/modules/video_coding/jitter_estimator.h b/modules/video_coding/jitter_estimator.h
deleted file mode 100644
index c50c34e..0000000
--- a/modules/video_coding/jitter_estimator.h
+++ /dev/null
@@ -1,170 +0,0 @@
-/*
- *  Copyright (c) 2011 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_VIDEO_CODING_JITTER_ESTIMATOR_H_
-#define WEBRTC_MODULES_VIDEO_CODING_JITTER_ESTIMATOR_H_
-
-#include "webrtc/modules/video_coding/rtt_filter.h"
-#include "webrtc/rtc_base/rollingaccumulator.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-class Clock;
-
-class VCMJitterEstimator {
- public:
-  VCMJitterEstimator(const Clock* clock,
-                     int32_t vcmId = 0,
-                     int32_t receiverId = 0);
-  virtual ~VCMJitterEstimator();
-  VCMJitterEstimator& operator=(const VCMJitterEstimator& rhs);
-
-  // Resets the estimate to the initial state
-  void Reset();
-  void ResetNackCount();
-
-  // Updates the jitter estimate with the new data.
-  //
-  // Input:
-  //          - frameDelay      : Delay-delta calculated by UTILDelayEstimate in
-  //          milliseconds
-  //          - frameSize       : Frame size of the current frame.
-  //          - incompleteFrame : Flags if the frame is used to update the
-  //          estimate before it
-  //                              was complete. Default is false.
-  void UpdateEstimate(int64_t frameDelayMS,
-                      uint32_t frameSizeBytes,
-                      bool incompleteFrame = false);
-
-  // Returns the current jitter estimate in milliseconds and adds
-  // also adds an RTT dependent term in cases of retransmission.
-  //  Input:
-  //          - rttMultiplier  : RTT param multiplier (when applicable).
-  //
-  // Return value                   : Jitter estimate in milliseconds
-  virtual int GetJitterEstimate(double rttMultiplier);
-
-  // Updates the nack counter.
-  void FrameNacked();
-
-  // Updates the RTT filter.
-  //
-  // Input:
-  //          - rttMs               : RTT in ms
-  void UpdateRtt(int64_t rttMs);
-
-  void UpdateMaxFrameSize(uint32_t frameSizeBytes);
-
-  // A constant describing the delay from the jitter buffer
-  // to the delay on the receiving side which is not accounted
-  // for by the jitter buffer nor the decoding delay estimate.
-  static const uint32_t OPERATING_SYSTEM_JITTER = 10;
-
- protected:
-  // These are protected for better testing possibilities
-  double _theta[2];  // Estimated line parameters (slope, offset)
-  double _varNoise;  // Variance of the time-deviation from the line
-
-  virtual bool LowRateExperimentEnabled();
-
- private:
-  // Updates the Kalman filter for the line describing
-  // the frame size dependent jitter.
-  //
-  // Input:
-  //          - frameDelayMS    : Delay-delta calculated by UTILDelayEstimate in
-  //          milliseconds
-  //          - deltaFSBytes    : Frame size delta, i.e.
-  //                            : frame size at time T minus frame size at time
-  //                            T-1
-  void KalmanEstimateChannel(int64_t frameDelayMS, int32_t deltaFSBytes);
-
-  // Updates the random jitter estimate, i.e. the variance
-  // of the time deviations from the line given by the Kalman filter.
-  //
-  // Input:
-  //          - d_dT              : The deviation from the kalman estimate
-  //          - incompleteFrame   : True if the frame used to update the
-  //          estimate
-  //                                with was incomplete
-  void EstimateRandomJitter(double d_dT, bool incompleteFrame);
-
-  double NoiseThreshold() const;
-
-  // Calculates the current jitter estimate.
-  //
-  // Return value                 : The current jitter estimate in milliseconds
-  double CalculateEstimate();
-
-  // Post process the calculated estimate
-  void PostProcessEstimate();
-
-  // Calculates the difference in delay between a sample and the
-  // expected delay estimated by the Kalman filter.
-  //
-  // Input:
-  //          - frameDelayMS    : Delay-delta calculated by UTILDelayEstimate in
-  //          milliseconds
-  //          - deltaFS         : Frame size delta, i.e. frame size at time
-  //                              T minus frame size at time T-1
-  //
-  // Return value                 : The difference in milliseconds
-  double DeviationFromExpectedDelay(int64_t frameDelayMS,
-                                    int32_t deltaFSBytes) const;
-
-  double GetFrameRate() const;
-
-  // Constants, filter parameters
-  int32_t _vcmId;
-  int32_t _receiverId;
-  const double _phi;
-  const double _psi;
-  const uint32_t _alphaCountMax;
-  const double _thetaLow;
-  const uint32_t _nackLimit;
-  const int32_t _numStdDevDelayOutlier;
-  const int32_t _numStdDevFrameSizeOutlier;
-  const double _noiseStdDevs;
-  const double _noiseStdDevOffset;
-
-  double _thetaCov[2][2];  // Estimate covariance
-  double _Qcov[2][2];      // Process noise covariance
-  double _avgFrameSize;    // Average frame size
-  double _varFrameSize;    // Frame size variance
-  double _maxFrameSize;    // Largest frame size received (descending
-                           // with a factor _psi)
-  uint32_t _fsSum;
-  uint32_t _fsCount;
-
-  int64_t _lastUpdateT;
-  double _prevEstimate;     // The previously returned jitter estimate
-  uint32_t _prevFrameSize;  // Frame size of the previous frame
-  double _avgNoise;         // Average of the random jitter
-  uint32_t _alphaCount;
-  double _filterJitterEstimate;  // The filtered sum of jitter estimates
-
-  uint32_t _startupCount;
-
-  int64_t
-      _latestNackTimestamp;  // Timestamp in ms when the latest nack was seen
-  uint32_t _nackCount;       // Keeps track of the number of nacks received,
-                             // but never goes above _nackLimit
-  VCMRttFilter _rttFilter;
-
-  rtc::RollingAccumulator<uint64_t> fps_counter_;
-  enum ExperimentFlag { kInit, kEnabled, kDisabled };
-  ExperimentFlag low_rate_experiment_;
-  const Clock* clock_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_VIDEO_CODING_JITTER_ESTIMATOR_H_
diff --git a/modules/video_coding/jitter_estimator_tests.cc b/modules/video_coding/jitter_estimator_tests.cc
deleted file mode 100644
index 04480a7..0000000
--- a/modules/video_coding/jitter_estimator_tests.cc
+++ /dev/null
@@ -1,161 +0,0 @@
-/*  Copyright (c) 2014 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/video_coding/jitter_estimator.h"
-
-#include "webrtc/system_wrappers/include/clock.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-class TestEstimator : public VCMJitterEstimator {
- public:
-  explicit TestEstimator(bool exp_enabled)
-      : VCMJitterEstimator(&fake_clock_, 0, 0),
-        fake_clock_(0),
-        exp_enabled_(exp_enabled) {}
-
-  virtual bool LowRateExperimentEnabled() { return exp_enabled_; }
-
-  void AdvanceClock(int64_t microseconds) {
-    fake_clock_.AdvanceTimeMicroseconds(microseconds);
-  }
-
- private:
-  SimulatedClock fake_clock_;
-  const bool exp_enabled_;
-};
-
-class TestVCMJitterEstimator : public ::testing::Test {
- protected:
-  TestVCMJitterEstimator()
-      : regular_estimator_(false), low_rate_estimator_(true) {}
-
-  virtual void SetUp() { regular_estimator_.Reset(); }
-
-  TestEstimator regular_estimator_;
-  TestEstimator low_rate_estimator_;
-};
-
-// Generates some simple test data in the form of a sawtooth wave.
-class ValueGenerator {
- public:
-  explicit ValueGenerator(int32_t amplitude)
-      : amplitude_(amplitude), counter_(0) {}
-  virtual ~ValueGenerator() {}
-
-  int64_t Delay() { return ((counter_ % 11) - 5) * amplitude_; }
-
-  uint32_t FrameSize() { return 1000 + Delay(); }
-
-  void Advance() { ++counter_; }
-
- private:
-  const int32_t amplitude_;
-  int64_t counter_;
-};
-
-// 5 fps, disable jitter delay altogether.
-TEST_F(TestVCMJitterEstimator, TestLowRate) {
-  ValueGenerator gen(10);
-  uint64_t time_delta = 1000000 / 5;
-  for (int i = 0; i < 60; ++i) {
-    regular_estimator_.UpdateEstimate(gen.Delay(), gen.FrameSize());
-    regular_estimator_.AdvanceClock(time_delta);
-    low_rate_estimator_.UpdateEstimate(gen.Delay(), gen.FrameSize());
-    low_rate_estimator_.AdvanceClock(time_delta);
-    EXPECT_GT(regular_estimator_.GetJitterEstimate(0), 0);
-    if (i > 2)
-      EXPECT_EQ(low_rate_estimator_.GetJitterEstimate(0), 0);
-    gen.Advance();
-  }
-}
-
-// 8 fps, steady state estimate should be in interpolated interval between 0
-// and value of previous method.
-TEST_F(TestVCMJitterEstimator, TestMidRate) {
-  ValueGenerator gen(10);
-  uint64_t time_delta = 1000000 / 8;
-  for (int i = 0; i < 60; ++i) {
-    regular_estimator_.UpdateEstimate(gen.Delay(), gen.FrameSize());
-    regular_estimator_.AdvanceClock(time_delta);
-    low_rate_estimator_.UpdateEstimate(gen.Delay(), gen.FrameSize());
-    low_rate_estimator_.AdvanceClock(time_delta);
-    EXPECT_GT(regular_estimator_.GetJitterEstimate(0), 0);
-    EXPECT_GT(low_rate_estimator_.GetJitterEstimate(0), 0);
-    EXPECT_GE(regular_estimator_.GetJitterEstimate(0),
-              low_rate_estimator_.GetJitterEstimate(0));
-    gen.Advance();
-  }
-}
-
-// 30 fps, steady state estimate should be same as previous method.
-TEST_F(TestVCMJitterEstimator, TestHighRate) {
-  ValueGenerator gen(10);
-  uint64_t time_delta = 1000000 / 30;
-  for (int i = 0; i < 60; ++i) {
-    regular_estimator_.UpdateEstimate(gen.Delay(), gen.FrameSize());
-    regular_estimator_.AdvanceClock(time_delta);
-    low_rate_estimator_.UpdateEstimate(gen.Delay(), gen.FrameSize());
-    low_rate_estimator_.AdvanceClock(time_delta);
-    EXPECT_EQ(regular_estimator_.GetJitterEstimate(0),
-              low_rate_estimator_.GetJitterEstimate(0));
-    gen.Advance();
-  }
-}
-
-// 10 fps, high jitter then low jitter. Low rate estimator should converge
-// faster to low noise estimate.
-TEST_F(TestVCMJitterEstimator, TestConvergence) {
-  // Reach a steady state with high noise.
-  ValueGenerator gen(50);
-  uint64_t time_delta = 1000000 / 10;
-  for (int i = 0; i < 100; ++i) {
-    regular_estimator_.UpdateEstimate(gen.Delay(), gen.FrameSize());
-    regular_estimator_.AdvanceClock(time_delta * 2);
-    low_rate_estimator_.UpdateEstimate(gen.Delay(), gen.FrameSize());
-    low_rate_estimator_.AdvanceClock(time_delta * 2);
-    gen.Advance();
-  }
-
-  int threshold = regular_estimator_.GetJitterEstimate(0) / 2;
-
-  // New generator with zero noise.
-  ValueGenerator low_gen(0);
-  int regular_iterations = 0;
-  int low_rate_iterations = 0;
-  for (int i = 0; i < 500; ++i) {
-    if (regular_iterations == 0) {
-      regular_estimator_.UpdateEstimate(low_gen.Delay(), low_gen.FrameSize());
-      regular_estimator_.AdvanceClock(time_delta);
-      if (regular_estimator_.GetJitterEstimate(0) < threshold) {
-        regular_iterations = i;
-      }
-    }
-
-    if (low_rate_iterations == 0) {
-      low_rate_estimator_.UpdateEstimate(low_gen.Delay(), low_gen.FrameSize());
-      low_rate_estimator_.AdvanceClock(time_delta);
-      if (low_rate_estimator_.GetJitterEstimate(0) < threshold) {
-        low_rate_iterations = i;
-      }
-    }
-
-    if (regular_iterations != 0 && low_rate_iterations != 0) {
-      break;
-    }
-
-    gen.Advance();
-  }
-
-  EXPECT_NE(regular_iterations, 0);
-  EXPECT_NE(low_rate_iterations, 0);
-  EXPECT_LE(low_rate_iterations, regular_iterations);
-}
-}  // namespace webrtc
diff --git a/modules/video_coding/media_opt_util.cc b/modules/video_coding/media_opt_util.cc
deleted file mode 100644
index 3edd054..0000000
--- a/modules/video_coding/media_opt_util.cc
+++ /dev/null
@@ -1,660 +0,0 @@
-/*
- *  Copyright (c) 2012 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/video_coding/media_opt_util.h"
-
-#include <float.h>
-#include <limits.h>
-#include <math.h>
-
-#include <algorithm>
-#include <limits>
-
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/modules/video_coding/codecs/vp8/include/vp8_common_types.h"
-#include "webrtc/modules/video_coding/include/video_coding_defines.h"
-#include "webrtc/modules/video_coding/fec_rate_table.h"
-#include "webrtc/modules/video_coding/nack_fec_tables.h"
-
-namespace webrtc {
-// Max value of loss rates in off-line model
-static const int kPacketLossMax = 129;
-
-namespace media_optimization {
-
-VCMProtectionMethod::VCMProtectionMethod()
-    : _effectivePacketLoss(0),
-      _protectionFactorK(0),
-      _protectionFactorD(0),
-      _scaleProtKey(2.0f),
-      _maxPayloadSize(1460),
-      _corrFecCost(1.0),
-      _type(kNone) {}
-
-VCMProtectionMethod::~VCMProtectionMethod() {}
-
-VCMNackFecMethod::VCMNackFecMethod(int64_t lowRttNackThresholdMs,
-                                   int64_t highRttNackThresholdMs)
-    : VCMFecMethod(),
-      _lowRttNackMs(lowRttNackThresholdMs),
-      _highRttNackMs(highRttNackThresholdMs),
-      _maxFramesFec(1) {
-  assert(lowRttNackThresholdMs >= -1 && highRttNackThresholdMs >= -1);
-  assert(highRttNackThresholdMs == -1 ||
-         lowRttNackThresholdMs <= highRttNackThresholdMs);
-  assert(lowRttNackThresholdMs > -1 || highRttNackThresholdMs == -1);
-  _type = kNackFec;
-}
-
-VCMNackFecMethod::~VCMNackFecMethod() {
-  //
-}
-bool VCMNackFecMethod::ProtectionFactor(
-    const VCMProtectionParameters* parameters) {
-  // Hybrid Nack FEC has three operational modes:
-  // 1. Low RTT (below kLowRttNackMs) - Nack only: Set FEC rate
-  //    (_protectionFactorD) to zero. -1 means no FEC.
-  // 2. High RTT (above _highRttNackMs) - FEC Only: Keep FEC factors.
-  //    -1 means always allow NACK.
-  // 3. Medium RTT values - Hybrid mode: We will only nack the
-  //    residual following the decoding of the FEC (refer to JB logic). FEC
-  //    delta protection factor will be adjusted based on the RTT.
-
-  // Otherwise: we count on FEC; if the RTT is below a threshold, then we
-  // nack the residual, based on a decision made in the JB.
-
-  // Compute the protection factors
-  VCMFecMethod::ProtectionFactor(parameters);
-  if (_lowRttNackMs == -1 || parameters->rtt < _lowRttNackMs) {
-    _protectionFactorD = 0;
-    VCMFecMethod::UpdateProtectionFactorD(_protectionFactorD);
-
-    // When in Hybrid mode (RTT range), adjust FEC rates based on the
-    // RTT (NACK effectiveness) - adjustment factor is in the range [0,1].
-  } else if (_highRttNackMs == -1 || parameters->rtt < _highRttNackMs) {
-    // TODO(mikhal): Disabling adjustment temporarily.
-    // uint16_t rttIndex = (uint16_t) parameters->rtt;
-    float adjustRtt = 1.0f;  // (float)VCMNackFecTable[rttIndex] / 100.0f;
-
-    // Adjust FEC with NACK on (for delta frame only)
-    // table depends on RTT relative to rttMax (NACK Threshold)
-    _protectionFactorD = static_cast<uint8_t>(
-        adjustRtt * static_cast<float>(_protectionFactorD));
-    // update FEC rates after applying adjustment
-    VCMFecMethod::UpdateProtectionFactorD(_protectionFactorD);
-  }
-
-  return true;
-}
-
-int VCMNackFecMethod::ComputeMaxFramesFec(
-    const VCMProtectionParameters* parameters) {
-  if (parameters->numLayers > 2) {
-    // For more than 2 temporal layers we will only have FEC on the base layer,
-    // and the base layers will be pretty far apart. Therefore we force one
-    // frame FEC.
-    return 1;
-  }
-  // We set the max number of frames to base the FEC on so that on average
-  // we will have complete frames in one RTT. Note that this is an upper
-  // bound, and that the actual number of frames used for FEC is decided by the
-  // RTP module based on the actual number of packets and the protection factor.
-  float base_layer_framerate =
-      parameters->frameRate /
-      static_cast<float>(1 << (parameters->numLayers - 1));
-  int max_frames_fec = std::max(
-      static_cast<int>(2.0f * base_layer_framerate * parameters->rtt / 1000.0f +
-                       0.5f),
-      1);
-  // |kUpperLimitFramesFec| is the upper limit on how many frames we
-  // allow any FEC to be based on.
-  if (max_frames_fec > kUpperLimitFramesFec) {
-    max_frames_fec = kUpperLimitFramesFec;
-  }
-  return max_frames_fec;
-}
-
-int VCMNackFecMethod::MaxFramesFec() const {
-  return _maxFramesFec;
-}
-
-bool VCMNackFecMethod::BitRateTooLowForFec(
-    const VCMProtectionParameters* parameters) {
-  // Bitrate below which we turn off FEC, regardless of reported packet loss.
-  // The condition should depend on resolution and content. For now, use
-  // threshold on bytes per frame, with some effect for the frame size.
-  // The condition for turning off FEC is also based on other factors,
-  // such as |_numLayers|, |_maxFramesFec|, and |_rtt|.
-  int estimate_bytes_per_frame = 1000 * BitsPerFrame(parameters) / 8;
-  int max_bytes_per_frame = kMaxBytesPerFrameForFec;
-  int num_pixels = parameters->codecWidth * parameters->codecHeight;
-  if (num_pixels <= 352 * 288) {
-    max_bytes_per_frame = kMaxBytesPerFrameForFecLow;
-  } else if (num_pixels > 640 * 480) {
-    max_bytes_per_frame = kMaxBytesPerFrameForFecHigh;
-  }
-  // TODO(marpan): add condition based on maximum frames used for FEC,
-  // and expand condition based on frame size.
-  // Max round trip time threshold in ms.
-  const int64_t kMaxRttTurnOffFec = 200;
-  if (estimate_bytes_per_frame < max_bytes_per_frame &&
-      parameters->numLayers < 3 && parameters->rtt < kMaxRttTurnOffFec) {
-    return true;
-  }
-  return false;
-}
-
-bool VCMNackFecMethod::EffectivePacketLoss(
-    const VCMProtectionParameters* parameters) {
-  // Set the effective packet loss for encoder (based on FEC code).
-  // Compute the effective packet loss and residual packet loss due to FEC.
-  VCMFecMethod::EffectivePacketLoss(parameters);
-  return true;
-}
-
-bool VCMNackFecMethod::UpdateParameters(
-    const VCMProtectionParameters* parameters) {
-  ProtectionFactor(parameters);
-  EffectivePacketLoss(parameters);
-  _maxFramesFec = ComputeMaxFramesFec(parameters);
-  if (BitRateTooLowForFec(parameters)) {
-    _protectionFactorK = 0;
-    _protectionFactorD = 0;
-  }
-
-  // Protection/fec rates obtained above are defined relative to total number
-  // of packets (total rate: source + fec) FEC in RTP module assumes
-  // protection factor is defined relative to source number of packets so we
-  // should convert the factor to reduce mismatch between mediaOpt's rate and
-  // the actual one
-  _protectionFactorK = VCMFecMethod::ConvertFECRate(_protectionFactorK);
-  _protectionFactorD = VCMFecMethod::ConvertFECRate(_protectionFactorD);
-
-  return true;
-}
-
-VCMNackMethod::VCMNackMethod() : VCMProtectionMethod() {
-  _type = kNack;
-}
-
-VCMNackMethod::~VCMNackMethod() {
-  //
-}
-
-bool VCMNackMethod::EffectivePacketLoss(
-    const VCMProtectionParameters* parameter) {
-  // Effective Packet Loss, NA in current version.
-  _effectivePacketLoss = 0;
-  return true;
-}
-
-bool VCMNackMethod::UpdateParameters(
-    const VCMProtectionParameters* parameters) {
-  // Compute the effective packet loss
-  EffectivePacketLoss(parameters);
-
-  // nackCost  = (bitRate - nackCost) * (lossPr)
-  return true;
-}
-
-VCMFecMethod::VCMFecMethod() : VCMProtectionMethod() {
-  _type = kFec;
-}
-VCMFecMethod::~VCMFecMethod() {
-  //
-}
-
-uint8_t VCMFecMethod::BoostCodeRateKey(uint8_t packetFrameDelta,
-                                       uint8_t packetFrameKey) const {
-  uint8_t boostRateKey = 2;
-  // Default: ratio scales the FEC protection up for I frames
-  uint8_t ratio = 1;
-
-  if (packetFrameDelta > 0) {
-    ratio = (int8_t)(packetFrameKey / packetFrameDelta);
-  }
-  ratio = VCM_MAX(boostRateKey, ratio);
-
-  return ratio;
-}
-
-uint8_t VCMFecMethod::ConvertFECRate(uint8_t codeRateRTP) const {
-  return static_cast<uint8_t>(VCM_MIN(
-      255,
-      (0.5 + 255.0 * codeRateRTP / static_cast<float>(255 - codeRateRTP))));
-}
-
-// Update FEC with protectionFactorD
-void VCMFecMethod::UpdateProtectionFactorD(uint8_t protectionFactorD) {
-  _protectionFactorD = protectionFactorD;
-}
-
-// Update FEC with protectionFactorK
-void VCMFecMethod::UpdateProtectionFactorK(uint8_t protectionFactorK) {
-  _protectionFactorK = protectionFactorK;
-}
-
-bool VCMFecMethod::ProtectionFactor(const VCMProtectionParameters* parameters) {
-  // FEC PROTECTION SETTINGS: varies with packet loss and bitrate
-
-  // No protection if (filtered) packetLoss is 0
-  uint8_t packetLoss = static_cast<uint8_t>(255 * parameters->lossPr);
-  if (packetLoss == 0) {
-    _protectionFactorK = 0;
-    _protectionFactorD = 0;
-    return true;
-  }
-
-  // Parameters for FEC setting:
-  // first partition size, thresholds, table pars, spatial resoln fac.
-
-  // First partition protection: ~ 20%
-  uint8_t firstPartitionProt = static_cast<uint8_t>(255 * 0.20);
-
-  // Minimum protection level needed to generate one FEC packet for one
-  // source packet/frame (in RTP sender)
-  uint8_t minProtLevelFec = 85;
-
-  // Threshold on packetLoss and bitRrate/frameRate (=average #packets),
-  // above which we allocate protection to cover at least first partition.
-  uint8_t lossThr = 0;
-  uint8_t packetNumThr = 1;
-
-  // Parameters for range of rate index of table.
-  const uint8_t ratePar1 = 5;
-  const uint8_t ratePar2 = 49;
-
-  // Spatial resolution size, relative to a reference size.
-  float spatialSizeToRef =
-      static_cast<float>(parameters->codecWidth * parameters->codecHeight) /
-      (static_cast<float>(704 * 576));
-  // resolnFac: This parameter will generally increase/decrease the FEC rate
-  // (for fixed bitRate and packetLoss) based on system size.
-  // Use a smaller exponent (< 1) to control/soften system size effect.
-  const float resolnFac = 1.0 / powf(spatialSizeToRef, 0.3f);
-
-  const int bitRatePerFrame = BitsPerFrame(parameters);
-
-  // Average number of packets per frame (source and fec):
-  const uint8_t avgTotPackets = static_cast<uint8_t>(
-      std::min(static_cast<float>(std::numeric_limits<uint8_t>::max()),
-               1.5f +
-                   static_cast<float>(bitRatePerFrame) * 1000.0f /
-                       static_cast<float>(8.0 * _maxPayloadSize)));
-
-  // FEC rate parameters: for P and I frame
-  uint8_t codeRateDelta = 0;
-  uint8_t codeRateKey = 0;
-
-  // Get index for table: the FEC protection depends on an effective rate.
-  // The range on the rate index corresponds to rates (bps)
-  // from ~200k to ~8000k, for 30fps
-  const uint16_t effRateFecTable =
-      static_cast<uint16_t>(resolnFac * bitRatePerFrame);
-  uint8_t rateIndexTable = static_cast<uint8_t>(
-      VCM_MAX(VCM_MIN((effRateFecTable - ratePar1) / ratePar1, ratePar2), 0));
-
-  // Restrict packet loss range to 50:
-  // current tables defined only up to 50%
-  if (packetLoss >= kPacketLossMax) {
-    packetLoss = kPacketLossMax - 1;
-  }
-  uint16_t indexTable = rateIndexTable * kPacketLossMax + packetLoss;
-
-  // Check on table index
-  RTC_DCHECK_LT(indexTable, kFecRateTableSize);
-
-  // Protection factor for P frame
-  codeRateDelta = kFecRateTable[indexTable];
-
-  if (packetLoss > lossThr && avgTotPackets > packetNumThr) {
-    // Set a minimum based on first partition size.
-    if (codeRateDelta < firstPartitionProt) {
-      codeRateDelta = firstPartitionProt;
-    }
-  }
-
-  // Check limit on amount of protection for P frame; 50% is max.
-  if (codeRateDelta >= kPacketLossMax) {
-    codeRateDelta = kPacketLossMax - 1;
-  }
-
-  // For Key frame:
-  // Effectively at a higher rate, so we scale/boost the rate
-  // The boost factor may depend on several factors: ratio of packet
-  // number of I to P frames, how much protection placed on P frames, etc.
-  const uint8_t packetFrameDelta =
-      static_cast<uint8_t>(0.5 + parameters->packetsPerFrame);
-  const uint8_t packetFrameKey =
-      static_cast<uint8_t>(0.5 + parameters->packetsPerFrameKey);
-  const uint8_t boostKey = BoostCodeRateKey(packetFrameDelta, packetFrameKey);
-
-  rateIndexTable = static_cast<uint8_t>(VCM_MAX(
-      VCM_MIN(1 + (boostKey * effRateFecTable - ratePar1) / ratePar1, ratePar2),
-      0));
-  uint16_t indexTableKey = rateIndexTable * kPacketLossMax + packetLoss;
-
-  indexTableKey = VCM_MIN(indexTableKey, kFecRateTableSize);
-
-  // Check on table index
-  assert(indexTableKey < kFecRateTableSize);
-
-  // Protection factor for I frame
-  codeRateKey = kFecRateTable[indexTableKey];
-
-  // Boosting for Key frame.
-  int boostKeyProt = _scaleProtKey * codeRateDelta;
-  if (boostKeyProt >= kPacketLossMax) {
-    boostKeyProt = kPacketLossMax - 1;
-  }
-
-  // Make sure I frame protection is at least larger than P frame protection,
-  // and at least as high as filtered packet loss.
-  codeRateKey = static_cast<uint8_t>(
-      VCM_MAX(packetLoss, VCM_MAX(boostKeyProt, codeRateKey)));
-
-  // Check limit on amount of protection for I frame: 50% is max.
-  if (codeRateKey >= kPacketLossMax) {
-    codeRateKey = kPacketLossMax - 1;
-  }
-
-  _protectionFactorK = codeRateKey;
-  _protectionFactorD = codeRateDelta;
-
-  // Generally there is a rate mis-match between the FEC cost estimated
-  // in mediaOpt and the actual FEC cost sent out in RTP module.
-  // This is more significant at low rates (small # of source packets), where
-  // the granularity of the FEC decreases. In this case, non-zero protection
-  // in mediaOpt may generate 0 FEC packets in RTP sender (since actual #FEC
-  // is based on rounding off protectionFactor on actual source packet number).
-  // The correction factor (_corrFecCost) attempts to corrects this, at least
-  // for cases of low rates (small #packets) and low protection levels.
-
-  float numPacketsFl = 1.0f + (static_cast<float>(bitRatePerFrame) * 1000.0 /
-                                   static_cast<float>(8.0 * _maxPayloadSize) +
-                               0.5);
-
-  const float estNumFecGen =
-      0.5f + static_cast<float>(_protectionFactorD * numPacketsFl / 255.0f);
-
-  // We reduce cost factor (which will reduce overhead for FEC and
-  // hybrid method) and not the protectionFactor.
-  _corrFecCost = 1.0f;
-  if (estNumFecGen < 1.1f && _protectionFactorD < minProtLevelFec) {
-    _corrFecCost = 0.5f;
-  }
-  if (estNumFecGen < 0.9f && _protectionFactorD < minProtLevelFec) {
-    _corrFecCost = 0.0f;
-  }
-
-  // DONE WITH FEC PROTECTION SETTINGS
-  return true;
-}
-
-int VCMFecMethod::BitsPerFrame(const VCMProtectionParameters* parameters) {
-  // When temporal layers are available FEC will only be applied on the base
-  // layer.
-  const float bitRateRatio =
-      kVp8LayerRateAlloction[parameters->numLayers - 1][0];
-  float frameRateRatio = powf(1 / 2.0, parameters->numLayers - 1);
-  float bitRate = parameters->bitRate * bitRateRatio;
-  float frameRate = parameters->frameRate * frameRateRatio;
-
-  // TODO(mikhal): Update factor following testing.
-  float adjustmentFactor = 1;
-
-  if (frameRate < 1.0f)
-    frameRate = 1.0f;
-  // Average bits per frame (units of kbits)
-  return static_cast<int>(adjustmentFactor * bitRate / frameRate);
-}
-
-bool VCMFecMethod::EffectivePacketLoss(
-    const VCMProtectionParameters* parameters) {
-  // Effective packet loss to encoder is based on RPL (residual packet loss)
-  // this is a soft setting based on degree of FEC protection
-  // RPL = received/input packet loss - average_FEC_recovery
-  // note: received/input packet loss may be filtered based on FilteredLoss
-
-  // Effective Packet Loss, NA in current version.
-  _effectivePacketLoss = 0;
-
-  return true;
-}
-
-bool VCMFecMethod::UpdateParameters(const VCMProtectionParameters* parameters) {
-  // Compute the protection factor
-  ProtectionFactor(parameters);
-
-  // Compute the effective packet loss
-  EffectivePacketLoss(parameters);
-
-  // Protection/fec rates obtained above is defined relative to total number
-  // of packets (total rate: source+fec) FEC in RTP module assumes protection
-  // factor is defined relative to source number of packets so we should
-  // convert the factor to reduce mismatch between mediaOpt suggested rate and
-  // the actual rate
-  _protectionFactorK = ConvertFECRate(_protectionFactorK);
-  _protectionFactorD = ConvertFECRate(_protectionFactorD);
-
-  return true;
-}
-VCMLossProtectionLogic::VCMLossProtectionLogic(int64_t nowMs)
-    : _currentParameters(),
-      _rtt(0),
-      _lossPr(0.0f),
-      _bitRate(0.0f),
-      _frameRate(0.0f),
-      _keyFrameSize(0.0f),
-      _fecRateKey(0),
-      _fecRateDelta(0),
-      _lastPrUpdateT(0),
-      _lossPr255(0.9999f),
-      _lossPrHistory(),
-      _shortMaxLossPr255(0),
-      _packetsPerFrame(0.9999f),
-      _packetsPerFrameKey(0.9999f),
-      _codecWidth(0),
-      _codecHeight(0),
-      _numLayers(1) {
-  Reset(nowMs);
-}
-
-VCMLossProtectionLogic::~VCMLossProtectionLogic() {
-  Release();
-}
-
-void VCMLossProtectionLogic::SetMethod(
-    enum VCMProtectionMethodEnum newMethodType) {
-  if (_selectedMethod && _selectedMethod->Type() == newMethodType)
-    return;
-
-  switch (newMethodType) {
-    case kNack:
-      _selectedMethod.reset(new VCMNackMethod());
-      break;
-    case kFec:
-      _selectedMethod.reset(new VCMFecMethod());
-      break;
-    case kNackFec:
-      _selectedMethod.reset(new VCMNackFecMethod(kLowRttNackMs, -1));
-      break;
-    case kNone:
-      _selectedMethod.reset();
-      break;
-  }
-  UpdateMethod();
-}
-
-void VCMLossProtectionLogic::UpdateRtt(int64_t rtt) {
-  _rtt = rtt;
-}
-
-void VCMLossProtectionLogic::UpdateMaxLossHistory(uint8_t lossPr255,
-                                                  int64_t now) {
-  if (_lossPrHistory[0].timeMs >= 0 &&
-      now - _lossPrHistory[0].timeMs < kLossPrShortFilterWinMs) {
-    if (lossPr255 > _shortMaxLossPr255) {
-      _shortMaxLossPr255 = lossPr255;
-    }
-  } else {
-    // Only add a new value to the history once a second
-    if (_lossPrHistory[0].timeMs == -1) {
-      // First, no shift
-      _shortMaxLossPr255 = lossPr255;
-    } else {
-      // Shift
-      for (int32_t i = (kLossPrHistorySize - 2); i >= 0; i--) {
-        _lossPrHistory[i + 1].lossPr255 = _lossPrHistory[i].lossPr255;
-        _lossPrHistory[i + 1].timeMs = _lossPrHistory[i].timeMs;
-      }
-    }
-    if (_shortMaxLossPr255 == 0) {
-      _shortMaxLossPr255 = lossPr255;
-    }
-
-    _lossPrHistory[0].lossPr255 = _shortMaxLossPr255;
-    _lossPrHistory[0].timeMs = now;
-    _shortMaxLossPr255 = 0;
-  }
-}
-
-uint8_t VCMLossProtectionLogic::MaxFilteredLossPr(int64_t nowMs) const {
-  uint8_t maxFound = _shortMaxLossPr255;
-  if (_lossPrHistory[0].timeMs == -1) {
-    return maxFound;
-  }
-  for (int32_t i = 0; i < kLossPrHistorySize; i++) {
-    if (_lossPrHistory[i].timeMs == -1) {
-      break;
-    }
-    if (nowMs - _lossPrHistory[i].timeMs >
-        kLossPrHistorySize * kLossPrShortFilterWinMs) {
-      // This sample (and all samples after this) is too old
-      break;
-    }
-    if (_lossPrHistory[i].lossPr255 > maxFound) {
-      // This sample is the largest one this far into the history
-      maxFound = _lossPrHistory[i].lossPr255;
-    }
-  }
-  return maxFound;
-}
-
-uint8_t VCMLossProtectionLogic::FilteredLoss(int64_t nowMs,
-                                             FilterPacketLossMode filter_mode,
-                                             uint8_t lossPr255) {
-  // Update the max window filter.
-  UpdateMaxLossHistory(lossPr255, nowMs);
-
-  // Update the recursive average filter.
-  _lossPr255.Apply(static_cast<float>(nowMs - _lastPrUpdateT),
-                   static_cast<float>(lossPr255));
-  _lastPrUpdateT = nowMs;
-
-  // Filtered loss: default is received loss (no filtering).
-  uint8_t filtered_loss = lossPr255;
-
-  switch (filter_mode) {
-    case kNoFilter:
-      break;
-    case kAvgFilter:
-      filtered_loss = static_cast<uint8_t>(_lossPr255.filtered() + 0.5);
-      break;
-    case kMaxFilter:
-      filtered_loss = MaxFilteredLossPr(nowMs);
-      break;
-  }
-
-  return filtered_loss;
-}
-
-void VCMLossProtectionLogic::UpdateFilteredLossPr(uint8_t packetLossEnc) {
-  _lossPr = static_cast<float>(packetLossEnc) / 255.0;
-}
-
-void VCMLossProtectionLogic::UpdateBitRate(float bitRate) {
-  _bitRate = bitRate;
-}
-
-void VCMLossProtectionLogic::UpdatePacketsPerFrame(float nPackets,
-                                                   int64_t nowMs) {
-  _packetsPerFrame.Apply(static_cast<float>(nowMs - _lastPacketPerFrameUpdateT),
-                         nPackets);
-  _lastPacketPerFrameUpdateT = nowMs;
-}
-
-void VCMLossProtectionLogic::UpdatePacketsPerFrameKey(float nPackets,
-                                                      int64_t nowMs) {
-  _packetsPerFrameKey.Apply(
-      static_cast<float>(nowMs - _lastPacketPerFrameUpdateTKey), nPackets);
-  _lastPacketPerFrameUpdateTKey = nowMs;
-}
-
-void VCMLossProtectionLogic::UpdateKeyFrameSize(float keyFrameSize) {
-  _keyFrameSize = keyFrameSize;
-}
-
-void VCMLossProtectionLogic::UpdateFrameSize(size_t width, size_t height) {
-  _codecWidth = width;
-  _codecHeight = height;
-}
-
-void VCMLossProtectionLogic::UpdateNumLayers(int numLayers) {
-  _numLayers = (numLayers == 0) ? 1 : numLayers;
-}
-
-bool VCMLossProtectionLogic::UpdateMethod() {
-  if (!_selectedMethod)
-    return false;
-  _currentParameters.rtt = _rtt;
-  _currentParameters.lossPr = _lossPr;
-  _currentParameters.bitRate = _bitRate;
-  _currentParameters.frameRate = _frameRate;  // rename actual frame rate?
-  _currentParameters.keyFrameSize = _keyFrameSize;
-  _currentParameters.fecRateDelta = _fecRateDelta;
-  _currentParameters.fecRateKey = _fecRateKey;
-  _currentParameters.packetsPerFrame = _packetsPerFrame.filtered();
-  _currentParameters.packetsPerFrameKey = _packetsPerFrameKey.filtered();
-  _currentParameters.codecWidth = _codecWidth;
-  _currentParameters.codecHeight = _codecHeight;
-  _currentParameters.numLayers = _numLayers;
-  return _selectedMethod->UpdateParameters(&_currentParameters);
-}
-
-VCMProtectionMethod* VCMLossProtectionLogic::SelectedMethod() const {
-  return _selectedMethod.get();
-}
-
-VCMProtectionMethodEnum VCMLossProtectionLogic::SelectedType() const {
-  return _selectedMethod ? _selectedMethod->Type() : kNone;
-}
-
-void VCMLossProtectionLogic::Reset(int64_t nowMs) {
-  _lastPrUpdateT = nowMs;
-  _lastPacketPerFrameUpdateT = nowMs;
-  _lastPacketPerFrameUpdateTKey = nowMs;
-  _lossPr255.Reset(0.9999f);
-  _packetsPerFrame.Reset(0.9999f);
-  _fecRateDelta = _fecRateKey = 0;
-  for (int32_t i = 0; i < kLossPrHistorySize; i++) {
-    _lossPrHistory[i].lossPr255 = 0;
-    _lossPrHistory[i].timeMs = -1;
-  }
-  _shortMaxLossPr255 = 0;
-  Release();
-}
-
-void VCMLossProtectionLogic::Release() {
-  _selectedMethod.reset();
-}
-
-}  // namespace media_optimization
-}  // namespace webrtc
diff --git a/modules/video_coding/media_opt_util.h b/modules/video_coding/media_opt_util.h
deleted file mode 100644
index 7b4c4d1..0000000
--- a/modules/video_coding/media_opt_util.h
+++ /dev/null
@@ -1,360 +0,0 @@
-/*
- *  Copyright (c) 2012 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_VIDEO_CODING_MEDIA_OPT_UTIL_H_
-#define WEBRTC_MODULES_VIDEO_CODING_MEDIA_OPT_UTIL_H_
-
-#include <math.h>
-#include <stdlib.h>
-
-#include <memory>
-
-#include "webrtc/modules/video_coding/internal_defines.h"
-#include "webrtc/rtc_base/numerics/exp_filter.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-namespace media_optimization {
-
-// Number of time periods used for (max) window filter for packet loss
-// TODO(marpan): set reasonable window size for filtered packet loss,
-// adjustment should be based on logged/real data of loss stats/correlation.
-enum { kLossPrHistorySize = 10 };
-
-// 1000 ms, total filter length is (kLossPrHistorySize * 1000) ms
-enum { kLossPrShortFilterWinMs = 1000 };
-
-// The type of filter used on the received packet loss reports.
-enum FilterPacketLossMode {
-  kNoFilter,   // No filtering on received loss.
-  kAvgFilter,  // Recursive average filter.
-  kMaxFilter   // Max-window filter, over the time interval of:
-               // (kLossPrHistorySize * kLossPrShortFilterWinMs) ms.
-};
-
-// Thresholds for hybrid NACK/FEC
-// common to media optimization and the jitter buffer.
-const int64_t kLowRttNackMs = 20;
-
-// If the RTT is higher than this an extra RTT wont be added to to the jitter
-// buffer delay.
-const int kMaxRttDelayThreshold = 500;
-
-struct VCMProtectionParameters {
-  VCMProtectionParameters()
-      : rtt(0),
-        lossPr(0.0f),
-        bitRate(0.0f),
-        packetsPerFrame(0.0f),
-        packetsPerFrameKey(0.0f),
-        frameRate(0.0f),
-        keyFrameSize(0.0f),
-        fecRateDelta(0),
-        fecRateKey(0),
-        codecWidth(0),
-        codecHeight(0),
-        numLayers(1) {}
-
-  int64_t rtt;
-  float lossPr;
-  float bitRate;
-  float packetsPerFrame;
-  float packetsPerFrameKey;
-  float frameRate;
-  float keyFrameSize;
-  uint8_t fecRateDelta;
-  uint8_t fecRateKey;
-  uint16_t codecWidth;
-  uint16_t codecHeight;
-  int numLayers;
-};
-
-/******************************/
-/* VCMProtectionMethod class  */
-/******************************/
-
-enum VCMProtectionMethodEnum { kNack, kFec, kNackFec, kNone };
-
-class VCMLossProbabilitySample {
- public:
-  VCMLossProbabilitySample() : lossPr255(0), timeMs(-1) {}
-
-  uint8_t lossPr255;
-  int64_t timeMs;
-};
-
-class VCMProtectionMethod {
- public:
-  VCMProtectionMethod();
-  virtual ~VCMProtectionMethod();
-
-  // Updates the efficiency of the method using the parameters provided
-  //
-  // Input:
-  //         - parameters         : Parameters used to calculate efficiency
-  //
-  // Return value                 : True if this method is recommended in
-  //                                the given conditions.
-  virtual bool UpdateParameters(const VCMProtectionParameters* parameters) = 0;
-
-  // Returns the protection type
-  //
-  // Return value                 : The protection type
-  enum VCMProtectionMethodEnum Type() const { return _type; }
-
-  // Returns the effective packet loss for ER, required by this protection
-  // method
-  //
-  // Return value                 : Required effective packet loss
-  virtual uint8_t RequiredPacketLossER() { return _effectivePacketLoss; }
-
-  // Extracts the FEC protection factor for Key frame, required by this
-  // protection method
-  //
-  // Return value                 : Required protectionFactor for Key frame
-  virtual uint8_t RequiredProtectionFactorK() { return _protectionFactorK; }
-
-  // Extracts the FEC protection factor for Delta frame, required by this
-  // protection method
-  //
-  // Return value                 : Required protectionFactor for delta frame
-  virtual uint8_t RequiredProtectionFactorD() { return _protectionFactorD; }
-
-  // Extracts whether the FEC Unequal protection (UEP) is used for Key frame.
-  //
-  // Return value                 : Required Unequal protection on/off state.
-  virtual bool RequiredUepProtectionK() { return _useUepProtectionK; }
-
-  // Extracts whether the the FEC Unequal protection (UEP) is used for Delta
-  // frame.
-  //
-  // Return value                 : Required Unequal protection on/off state.
-  virtual bool RequiredUepProtectionD() { return _useUepProtectionD; }
-
-  virtual int MaxFramesFec() const { return 1; }
-
- protected:
-  uint8_t _effectivePacketLoss;
-  uint8_t _protectionFactorK;
-  uint8_t _protectionFactorD;
-  // Estimation of residual loss after the FEC
-  float _scaleProtKey;
-  int32_t _maxPayloadSize;
-
-  bool _useUepProtectionK;
-  bool _useUepProtectionD;
-  float _corrFecCost;
-  enum VCMProtectionMethodEnum _type;
-};
-
-class VCMNackMethod : public VCMProtectionMethod {
- public:
-  VCMNackMethod();
-  virtual ~VCMNackMethod();
-  virtual bool UpdateParameters(const VCMProtectionParameters* parameters);
-  // Get the effective packet loss
-  bool EffectivePacketLoss(const VCMProtectionParameters* parameter);
-};
-
-class VCMFecMethod : public VCMProtectionMethod {
- public:
-  VCMFecMethod();
-  virtual ~VCMFecMethod();
-  virtual bool UpdateParameters(const VCMProtectionParameters* parameters);
-  // Get the effective packet loss for ER
-  bool EffectivePacketLoss(const VCMProtectionParameters* parameters);
-  // Get the FEC protection factors
-  bool ProtectionFactor(const VCMProtectionParameters* parameters);
-  // Get the boost for key frame protection
-  uint8_t BoostCodeRateKey(uint8_t packetFrameDelta,
-                           uint8_t packetFrameKey) const;
-  // Convert the rates: defined relative to total# packets or source# packets
-  uint8_t ConvertFECRate(uint8_t codeRate) const;
-  // Get the average effective recovery from FEC: for random loss model
-  float AvgRecoveryFEC(const VCMProtectionParameters* parameters) const;
-  // Update FEC with protectionFactorD
-  void UpdateProtectionFactorD(uint8_t protectionFactorD);
-  // Update FEC with protectionFactorK
-  void UpdateProtectionFactorK(uint8_t protectionFactorK);
-  // Compute the bits per frame. Account for temporal layers when applicable.
-  int BitsPerFrame(const VCMProtectionParameters* parameters);
-
- protected:
-  enum { kUpperLimitFramesFec = 6 };
-  // Thresholds values for the bytes/frame and round trip time, below which we
-  // may turn off FEC, depending on |_numLayers| and |_maxFramesFec|.
-  // Max bytes/frame for VGA, corresponds to ~140k at 25fps.
-  enum { kMaxBytesPerFrameForFec = 700 };
-  // Max bytes/frame for CIF and lower: corresponds to ~80k at 25fps.
-  enum { kMaxBytesPerFrameForFecLow = 400 };
-  // Max bytes/frame for frame size larger than VGA, ~200k at 25fps.
-  enum { kMaxBytesPerFrameForFecHigh = 1000 };
-};
-
-class VCMNackFecMethod : public VCMFecMethod {
- public:
-  VCMNackFecMethod(int64_t lowRttNackThresholdMs,
-                   int64_t highRttNackThresholdMs);
-  virtual ~VCMNackFecMethod();
-  virtual bool UpdateParameters(const VCMProtectionParameters* parameters);
-  // Get the effective packet loss for ER
-  bool EffectivePacketLoss(const VCMProtectionParameters* parameters);
-  // Get the protection factors
-  bool ProtectionFactor(const VCMProtectionParameters* parameters);
-  // Get the max number of frames the FEC is allowed to be based on.
-  int MaxFramesFec() const;
-  // Turn off the FEC based on low bitrate and other factors.
-  bool BitRateTooLowForFec(const VCMProtectionParameters* parameters);
-
- private:
-  int ComputeMaxFramesFec(const VCMProtectionParameters* parameters);
-
-  int64_t _lowRttNackMs;
-  int64_t _highRttNackMs;
-  int _maxFramesFec;
-};
-
-class VCMLossProtectionLogic {
- public:
-  explicit VCMLossProtectionLogic(int64_t nowMs);
-  ~VCMLossProtectionLogic();
-
-  // Set the protection method to be used
-  //
-  // Input:
-  //        - newMethodType    : New requested protection method type. If one
-  //                           is already set, it will be deleted and replaced
-  void SetMethod(VCMProtectionMethodEnum newMethodType);
-
-  // Update the round-trip time
-  //
-  // Input:
-  //          - rtt           : Round-trip time in seconds.
-  void UpdateRtt(int64_t rtt);
-
-  // Update the filtered packet loss.
-  //
-  // Input:
-  //          - packetLossEnc :  The reported packet loss filtered
-  //                             (max window or average)
-  void UpdateFilteredLossPr(uint8_t packetLossEnc);
-
-  // Update the current target bit rate.
-  //
-  // Input:
-  //          - bitRate          : The current target bit rate in kbits/s
-  void UpdateBitRate(float bitRate);
-
-  // Update the number of packets per frame estimate, for delta frames
-  //
-  // Input:
-  //          - nPackets         : Number of packets in the latest sent frame.
-  void UpdatePacketsPerFrame(float nPackets, int64_t nowMs);
-
-  // Update the number of packets per frame estimate, for key frames
-  //
-  // Input:
-  //          - nPackets         : umber of packets in the latest sent frame.
-  void UpdatePacketsPerFrameKey(float nPackets, int64_t nowMs);
-
-  // Update the keyFrameSize estimate
-  //
-  // Input:
-  //          - keyFrameSize     : The size of the latest sent key frame.
-  void UpdateKeyFrameSize(float keyFrameSize);
-
-  // Update the frame rate
-  //
-  // Input:
-  //          - frameRate        : The current target frame rate.
-  void UpdateFrameRate(float frameRate) { _frameRate = frameRate; }
-
-  // Update the frame size
-  //
-  // Input:
-  //          - width        : The codec frame width.
-  //          - height       : The codec frame height.
-  void UpdateFrameSize(size_t width, size_t height);
-
-  // Update the number of active layers
-  //
-  // Input:
-  //          - numLayers    : Number of layers used.
-  void UpdateNumLayers(int numLayers);
-
-  // The amount of packet loss to cover for with FEC.
-  //
-  // Input:
-  //          - fecRateKey      : Packet loss to cover for with FEC when
-  //                              sending key frames.
-  //          - fecRateDelta    : Packet loss to cover for with FEC when
-  //                              sending delta frames.
-  void UpdateFECRates(uint8_t fecRateKey, uint8_t fecRateDelta) {
-    _fecRateKey = fecRateKey;
-    _fecRateDelta = fecRateDelta;
-  }
-
-  // Update the protection methods with the current VCMProtectionParameters
-  // and set the requested protection settings.
-  // Return value     : Returns true on update
-  bool UpdateMethod();
-
-  // Returns the method currently selected.
-  //
-  // Return value                 : The protection method currently selected.
-  VCMProtectionMethod* SelectedMethod() const;
-
-  // Return the protection type of the currently selected method
-  VCMProtectionMethodEnum SelectedType() const;
-
-  // Updates the filtered loss for the average and max window packet loss,
-  // and returns the filtered loss probability in the interval [0, 255].
-  // The returned filtered loss value depends on the parameter |filter_mode|.
-  // The input parameter |lossPr255| is the received packet loss.
-
-  // Return value                 : The filtered loss probability
-  uint8_t FilteredLoss(int64_t nowMs,
-                       FilterPacketLossMode filter_mode,
-                       uint8_t lossPr255);
-
-  void Reset(int64_t nowMs);
-
-  void Release();
-
- private:
-  // Sets the available loss protection methods.
-  void UpdateMaxLossHistory(uint8_t lossPr255, int64_t now);
-  uint8_t MaxFilteredLossPr(int64_t nowMs) const;
-  std::unique_ptr<VCMProtectionMethod> _selectedMethod;
-  VCMProtectionParameters _currentParameters;
-  int64_t _rtt;
-  float _lossPr;
-  float _bitRate;
-  float _frameRate;
-  float _keyFrameSize;
-  uint8_t _fecRateKey;
-  uint8_t _fecRateDelta;
-  int64_t _lastPrUpdateT;
-  int64_t _lastPacketPerFrameUpdateT;
-  int64_t _lastPacketPerFrameUpdateTKey;
-  rtc::ExpFilter _lossPr255;
-  VCMLossProbabilitySample _lossPrHistory[kLossPrHistorySize];
-  uint8_t _shortMaxLossPr255;
-  rtc::ExpFilter _packetsPerFrame;
-  rtc::ExpFilter _packetsPerFrameKey;
-  size_t _codecWidth;
-  size_t _codecHeight;
-  int _numLayers;
-};
-
-}  // namespace media_optimization
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_VIDEO_CODING_MEDIA_OPT_UTIL_H_
diff --git a/modules/video_coding/media_optimization.cc b/modules/video_coding/media_optimization.cc
deleted file mode 100644
index d73fdfe..0000000
--- a/modules/video_coding/media_optimization.cc
+++ /dev/null
@@ -1,243 +0,0 @@
-/*
- *  Copyright (c) 2012 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/video_coding/media_optimization.h"
-
-#include <limits>
-
-#include "webrtc/modules/video_coding/utility/frame_dropper.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/system_wrappers/include/clock.h"
-
-namespace webrtc {
-namespace media_optimization {
-const int kMsPerSec = 1000;
-const int kBitsPerByte = 8;
-
-struct MediaOptimization::EncodedFrameSample {
-  EncodedFrameSample(size_t size_bytes,
-                     uint32_t timestamp,
-                     int64_t time_complete_ms)
-      : size_bytes(size_bytes),
-        timestamp(timestamp),
-        time_complete_ms(time_complete_ms) {}
-
-  size_t size_bytes;
-  uint32_t timestamp;
-  int64_t time_complete_ms;
-};
-
-MediaOptimization::MediaOptimization(Clock* clock)
-    : clock_(clock),
-      max_bit_rate_(0),
-      user_frame_rate_(0),
-      frame_dropper_(new FrameDropper),
-      video_target_bitrate_(0),
-      incoming_frame_rate_(0),
-      encoded_frame_samples_(),
-      avg_sent_framerate_(0) {
-  memset(incoming_frame_times_, -1, sizeof(incoming_frame_times_));
-}
-
-MediaOptimization::~MediaOptimization(void) {
-}
-
-void MediaOptimization::Reset() {
-  rtc::CritScope lock(&crit_sect_);
-  SetEncodingDataInternal(0, 0, 0);
-  memset(incoming_frame_times_, -1, sizeof(incoming_frame_times_));
-  incoming_frame_rate_ = 0.0;
-  frame_dropper_->Reset();
-  frame_dropper_->SetRates(0, 0);
-  video_target_bitrate_ = 0;
-  user_frame_rate_ = 0;
-  encoded_frame_samples_.clear();
-}
-
-void MediaOptimization::SetEncodingData(int32_t max_bit_rate,
-                                        uint32_t target_bitrate,
-                                        uint32_t frame_rate) {
-  rtc::CritScope lock(&crit_sect_);
-  SetEncodingDataInternal(max_bit_rate, frame_rate, target_bitrate);
-}
-
-void MediaOptimization::SetEncodingDataInternal(int32_t max_bit_rate,
-                                                uint32_t frame_rate,
-                                                uint32_t target_bitrate) {
-  // Everything codec specific should be reset here since this means the codec
-  // has changed.
-  max_bit_rate_ = max_bit_rate;
-  video_target_bitrate_ = target_bitrate;
-  float target_bitrate_kbps = static_cast<float>(target_bitrate) / 1000.0f;
-  frame_dropper_->Reset();
-  frame_dropper_->SetRates(target_bitrate_kbps, static_cast<float>(frame_rate));
-  user_frame_rate_ = static_cast<float>(frame_rate);
-}
-
-uint32_t MediaOptimization::SetTargetRates(uint32_t target_bitrate) {
-  rtc::CritScope lock(&crit_sect_);
-
-  video_target_bitrate_ = target_bitrate;
-
-  // Cap target video bitrate to codec maximum.
-  if (max_bit_rate_ > 0 && video_target_bitrate_ > max_bit_rate_) {
-    video_target_bitrate_ = max_bit_rate_;
-  }
-
-  // Update encoding rates following protection settings.
-  float target_video_bitrate_kbps =
-      static_cast<float>(video_target_bitrate_) / 1000.0f;
-  float framerate = incoming_frame_rate_;
-  if (framerate == 0.0) {
-    // No framerate estimate available, use configured max framerate instead.
-    framerate = user_frame_rate_;
-  }
-
-  frame_dropper_->SetRates(target_video_bitrate_kbps, framerate);
-
-  return video_target_bitrate_;
-}
-
-uint32_t MediaOptimization::InputFrameRate() {
-  rtc::CritScope lock(&crit_sect_);
-  return InputFrameRateInternal();
-}
-
-uint32_t MediaOptimization::InputFrameRateInternal() {
-  ProcessIncomingFrameRate(clock_->TimeInMilliseconds());
-  uint32_t framerate = static_cast<uint32_t>(std::min<float>(
-      std::numeric_limits<uint32_t>::max(), incoming_frame_rate_ + 0.5f));
-  return framerate;
-}
-
-uint32_t MediaOptimization::SentFrameRate() {
-  rtc::CritScope lock(&crit_sect_);
-  return SentFrameRateInternal();
-}
-
-uint32_t MediaOptimization::SentFrameRateInternal() {
-  PurgeOldFrameSamples(clock_->TimeInMilliseconds() - kBitrateAverageWinMs);
-  UpdateSentFramerate();
-  return avg_sent_framerate_;
-}
-
-uint32_t MediaOptimization::SentBitRate() {
-  rtc::CritScope lock(&crit_sect_);
-  PurgeOldFrameSamples(clock_->TimeInMilliseconds() - kBitrateAverageWinMs);
-  size_t sent_bytes = 0;
-  for (auto& frame_sample : encoded_frame_samples_) {
-    sent_bytes += frame_sample.size_bytes;
-  }
-  return sent_bytes * kBitsPerByte * kMsPerSec / kBitrateAverageWinMs;
-}
-
-int32_t MediaOptimization::UpdateWithEncodedData(
-    const EncodedImage& encoded_image) {
-  size_t encoded_length = encoded_image._length;
-  uint32_t timestamp = encoded_image._timeStamp;
-  rtc::CritScope lock(&crit_sect_);
-  const int64_t now_ms = clock_->TimeInMilliseconds();
-  PurgeOldFrameSamples(now_ms - kBitrateAverageWinMs);
-  if (encoded_frame_samples_.size() > 0 &&
-      encoded_frame_samples_.back().timestamp == timestamp) {
-    // Frames having the same timestamp are generated from the same input
-    // frame. We don't want to double count them, but only increment the
-    // size_bytes.
-    encoded_frame_samples_.back().size_bytes += encoded_length;
-    encoded_frame_samples_.back().time_complete_ms = now_ms;
-  } else {
-    encoded_frame_samples_.push_back(
-        EncodedFrameSample(encoded_length, timestamp, now_ms));
-  }
-  UpdateSentFramerate();
-  if (encoded_length > 0) {
-    const bool delta_frame = encoded_image._frameType != kVideoFrameKey;
-    frame_dropper_->Fill(encoded_length, delta_frame);
-  }
-
-  return VCM_OK;
-}
-
-void MediaOptimization::EnableFrameDropper(bool enable) {
-  rtc::CritScope lock(&crit_sect_);
-  frame_dropper_->Enable(enable);
-}
-
-bool MediaOptimization::DropFrame() {
-  rtc::CritScope lock(&crit_sect_);
-  UpdateIncomingFrameRate();
-  // Leak appropriate number of bytes.
-  frame_dropper_->Leak((uint32_t)(InputFrameRateInternal() + 0.5f));
-  return frame_dropper_->DropFrame();
-}
-
-void MediaOptimization::UpdateIncomingFrameRate() {
-  int64_t now = clock_->TimeInMilliseconds();
-  if (incoming_frame_times_[0] == 0) {
-    // No shifting if this is the first time.
-  } else {
-    // Shift all times one step.
-    for (int32_t i = (kFrameCountHistorySize - 2); i >= 0; i--) {
-      incoming_frame_times_[i + 1] = incoming_frame_times_[i];
-    }
-  }
-  incoming_frame_times_[0] = now;
-  ProcessIncomingFrameRate(now);
-}
-
-void MediaOptimization::PurgeOldFrameSamples(int64_t threshold_ms) {
-  while (!encoded_frame_samples_.empty()) {
-    if (encoded_frame_samples_.front().time_complete_ms < threshold_ms) {
-      encoded_frame_samples_.pop_front();
-    } else {
-      break;
-    }
-  }
-}
-
-void MediaOptimization::UpdateSentFramerate() {
-  if (encoded_frame_samples_.size() <= 1) {
-    avg_sent_framerate_ = encoded_frame_samples_.size();
-    return;
-  }
-  int denom = encoded_frame_samples_.back().timestamp -
-              encoded_frame_samples_.front().timestamp;
-  if (denom > 0) {
-    avg_sent_framerate_ =
-        (90000 * (encoded_frame_samples_.size() - 1) + denom / 2) / denom;
-  } else {
-    avg_sent_framerate_ = encoded_frame_samples_.size();
-  }
-}
-
-// Allowing VCM to keep track of incoming frame rate.
-void MediaOptimization::ProcessIncomingFrameRate(int64_t now) {
-  int32_t num = 0;
-  int32_t nr_of_frames = 0;
-  for (num = 1; num < (kFrameCountHistorySize - 1); ++num) {
-    if (incoming_frame_times_[num] <= 0 ||
-        // Don't use data older than 2 s.
-        now - incoming_frame_times_[num] > kFrameHistoryWinMs) {
-      break;
-    } else {
-      nr_of_frames++;
-    }
-  }
-  if (num > 1) {
-    const int64_t diff =
-        incoming_frame_times_[0] - incoming_frame_times_[num - 1];
-    incoming_frame_rate_ = 0.0;  // No frame rate estimate available.
-    if (diff > 0) {
-      incoming_frame_rate_ = nr_of_frames * 1000.0f / static_cast<float>(diff);
-    }
-  }
-}
-}  // namespace media_optimization
-}  // namespace webrtc
diff --git a/modules/video_coding/media_optimization.h b/modules/video_coding/media_optimization.h
deleted file mode 100644
index bbd018e..0000000
--- a/modules/video_coding/media_optimization.h
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- *  Copyright (c) 2012 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_VIDEO_CODING_MEDIA_OPTIMIZATION_H_
-#define WEBRTC_MODULES_VIDEO_CODING_MEDIA_OPTIMIZATION_H_
-
-#include <list>
-#include <memory>
-
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/modules/video_coding/include/video_coding.h"
-#include "webrtc/modules/video_coding/media_opt_util.h"
-#include "webrtc/rtc_base/criticalsection.h"
-
-namespace webrtc {
-
-class Clock;
-class FrameDropper;
-class VCMContentMetricsProcessing;
-
-namespace media_optimization {
-
-class MediaOptimization {
- public:
-  explicit MediaOptimization(Clock* clock);
-  ~MediaOptimization();
-
-  // TODO(andresp): Can Reset and SetEncodingData be done at construction time
-  // only?
-  void Reset();
-
-  // Informs media optimization of initial encoding state.
-  // TODO(perkj): Deprecate SetEncodingData once its not used for stats in
-  // VieEncoder.
-  void SetEncodingData(int32_t max_bit_rate,
-                       uint32_t bit_rate,
-                       uint32_t frame_rate);
-
-  // Sets target rates for the encoder given the channel parameters.
-  // Input: |target bitrate| - the encoder target bitrate in bits/s.
-  uint32_t SetTargetRates(uint32_t target_bitrate);
-
-  void EnableFrameDropper(bool enable);
-  bool DropFrame();
-
-  // Informs Media Optimization of encoded output.
-  // TODO(perkj): Deprecate SetEncodingData once its not used for stats in
-  // VieEncoder.
-  int32_t UpdateWithEncodedData(const EncodedImage& encoded_image);
-
-  // InputFrameRate 0 = no frame rate estimate available.
-  uint32_t InputFrameRate();
-  uint32_t SentFrameRate();
-  uint32_t SentBitRate();
-
- private:
-  enum { kFrameCountHistorySize = 90 };
-  enum { kFrameHistoryWinMs = 2000 };
-  enum { kBitrateAverageWinMs = 1000 };
-
-  struct EncodedFrameSample;
-  typedef std::list<EncodedFrameSample> FrameSampleList;
-
-  void UpdateIncomingFrameRate() RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_sect_);
-  void PurgeOldFrameSamples(int64_t threshold_ms)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_sect_);
-  void UpdateSentFramerate() RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_sect_);
-
-  void ProcessIncomingFrameRate(int64_t now)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_sect_);
-
-  // Checks conditions for suspending the video. The method compares
-  // |video_target_bitrate_| with the threshold values for suspension, and
-  // changes the state of |video_suspended_| accordingly.
-  void CheckSuspendConditions() RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_sect_);
-
-  void SetEncodingDataInternal(int32_t max_bit_rate,
-                               uint32_t frame_rate,
-                               uint32_t bit_rate)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_sect_);
-
-  uint32_t InputFrameRateInternal() RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_sect_);
-
-  uint32_t SentFrameRateInternal() RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_sect_);
-
-  // Protect all members.
-  rtc::CriticalSection crit_sect_;
-
-  Clock* clock_ RTC_GUARDED_BY(crit_sect_);
-  int32_t max_bit_rate_ RTC_GUARDED_BY(crit_sect_);
-  float user_frame_rate_ RTC_GUARDED_BY(crit_sect_);
-  std::unique_ptr<FrameDropper> frame_dropper_ RTC_GUARDED_BY(crit_sect_);
-  int video_target_bitrate_ RTC_GUARDED_BY(crit_sect_);
-  float incoming_frame_rate_ RTC_GUARDED_BY(crit_sect_);
-  int64_t incoming_frame_times_[kFrameCountHistorySize] RTC_GUARDED_BY(
-      crit_sect_);
-  std::list<EncodedFrameSample> encoded_frame_samples_
-      RTC_GUARDED_BY(crit_sect_);
-  uint32_t avg_sent_framerate_ RTC_GUARDED_BY(crit_sect_);
-};
-}  // namespace media_optimization
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_VIDEO_CODING_MEDIA_OPTIMIZATION_H_
diff --git a/modules/video_coding/nack_fec_tables.h b/modules/video_coding/nack_fec_tables.h
deleted file mode 100644
index f9f5ad9..0000000
--- a/modules/video_coding/nack_fec_tables.h
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- *  Copyright (c) 2011 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_VIDEO_CODING_NACK_FEC_TABLES_H_
-#define WEBRTC_MODULES_VIDEO_CODING_NACK_FEC_TABLES_H_
-
-namespace webrtc {
-
-// Table for adjusting FEC rate for NACK/FEC protection method
-// Table values are built as a sigmoid function, ranging from 0 to 100, based on
-// the HybridNackTH values defined in media_opt_util.h.
-const uint16_t VCMNackFecTable[100] = {
-    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   1,   1,   1,
-    1,   2,   2,   2,   3,   3,   4,   5,   6,   7,   9,   10,  12,  15,  18,
-    21,  24,  28,  32,  37,  41,  46,  51,  56,  61,  66,  70,  74,  78,  81,
-    84,  86,  89,  90,  92,  93,  95,  95,  96,  97,  97,  98,  98,  99,  99,
-    99,  99,  99,  99,  100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
-    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
-    100, 100, 100, 100, 100, 100, 100, 100, 100, 100,
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_VIDEO_CODING_NACK_FEC_TABLES_H_
diff --git a/modules/video_coding/nack_module.cc b/modules/video_coding/nack_module.cc
deleted file mode 100644
index e3808c2..0000000
--- a/modules/video_coding/nack_module.cc
+++ /dev/null
@@ -1,265 +0,0 @@
-/*
- *  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 <algorithm>
-#include <limits>
-
-#include "webrtc/modules/video_coding/nack_module.h"
-
-#include "webrtc/modules/utility/include/process_thread.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-
-namespace webrtc {
-
-namespace {
-const int kMaxPacketAge = 10000;
-const int kMaxNackPackets = 1000;
-const int kDefaultRttMs = 100;
-const int kMaxNackRetries = 10;
-const int kProcessFrequency = 50;
-const int kProcessIntervalMs = 1000 / kProcessFrequency;
-const int kMaxReorderedPackets = 128;
-const int kNumReorderingBuckets = 10;
-}  // namespace
-
-NackModule::NackInfo::NackInfo()
-    : seq_num(0), send_at_seq_num(0), sent_at_time(-1), retries(0) {}
-
-NackModule::NackInfo::NackInfo(uint16_t seq_num, uint16_t send_at_seq_num)
-    : seq_num(seq_num),
-      send_at_seq_num(send_at_seq_num),
-      sent_at_time(-1),
-      retries(0) {}
-
-NackModule::NackModule(Clock* clock,
-                       NackSender* nack_sender,
-                       KeyFrameRequestSender* keyframe_request_sender)
-    : clock_(clock),
-      nack_sender_(nack_sender),
-      keyframe_request_sender_(keyframe_request_sender),
-      reordering_histogram_(kNumReorderingBuckets, kMaxReorderedPackets),
-      initialized_(false),
-      rtt_ms_(kDefaultRttMs),
-      newest_seq_num_(0),
-      next_process_time_ms_(-1) {
-  RTC_DCHECK(clock_);
-  RTC_DCHECK(nack_sender_);
-  RTC_DCHECK(keyframe_request_sender_);
-}
-
-int NackModule::OnReceivedPacket(const VCMPacket& packet) {
-  rtc::CritScope lock(&crit_);
-  uint16_t seq_num = packet.seqNum;
-  // TODO(philipel): When the packet includes information whether it is
-  //                 retransmitted or not, use that value instead. For
-  //                 now set it to true, which will cause the reordering
-  //                 statistics to never be updated.
-  bool is_retransmitted = true;
-  bool is_keyframe =
-      packet.is_first_packet_in_frame && packet.frameType == kVideoFrameKey;
-
-  if (!initialized_) {
-    newest_seq_num_ = seq_num;
-    if (is_keyframe)
-      keyframe_list_.insert(seq_num);
-    initialized_ = true;
-    return 0;
-  }
-
-  // Since the |newest_seq_num_| is a packet we have actually received we know
-  // that packet has never been Nacked.
-  if (seq_num == newest_seq_num_)
-    return 0;
-
-  if (AheadOf(newest_seq_num_, seq_num)) {
-    // An out of order packet has been received.
-    auto nack_list_it = nack_list_.find(seq_num);
-    int nacks_sent_for_packet = 0;
-    if (nack_list_it != nack_list_.end()) {
-      nacks_sent_for_packet = nack_list_it->second.retries;
-      nack_list_.erase(nack_list_it);
-    }
-    if (!is_retransmitted)
-      UpdateReorderingStatistics(seq_num);
-    return nacks_sent_for_packet;
-  }
-  AddPacketsToNack(newest_seq_num_ + 1, seq_num);
-  newest_seq_num_ = seq_num;
-
-  // Keep track of new keyframes.
-  if (is_keyframe)
-    keyframe_list_.insert(seq_num);
-
-  // And remove old ones so we don't accumulate keyframes.
-  auto it = keyframe_list_.lower_bound(seq_num - kMaxPacketAge);
-  if (it != keyframe_list_.begin())
-    keyframe_list_.erase(keyframe_list_.begin(), it);
-
-  // Are there any nacks that are waiting for this seq_num.
-  std::vector<uint16_t> nack_batch = GetNackBatch(kSeqNumOnly);
-  if (!nack_batch.empty())
-    nack_sender_->SendNack(nack_batch);
-
-  return 0;
-}
-
-void NackModule::ClearUpTo(uint16_t seq_num) {
-  rtc::CritScope lock(&crit_);
-  nack_list_.erase(nack_list_.begin(), nack_list_.lower_bound(seq_num));
-  keyframe_list_.erase(keyframe_list_.begin(),
-                       keyframe_list_.lower_bound(seq_num));
-}
-
-void NackModule::UpdateRtt(int64_t rtt_ms) {
-  rtc::CritScope lock(&crit_);
-  rtt_ms_ = rtt_ms;
-}
-
-void NackModule::Clear() {
-  rtc::CritScope lock(&crit_);
-  nack_list_.clear();
-  keyframe_list_.clear();
-}
-
-int64_t NackModule::TimeUntilNextProcess() {
-  return std::max<int64_t>(next_process_time_ms_ - clock_->TimeInMilliseconds(),
-                           0);
-}
-
-void NackModule::Process() {
-  if (nack_sender_) {
-    std::vector<uint16_t> nack_batch;
-    {
-      rtc::CritScope lock(&crit_);
-      nack_batch = GetNackBatch(kTimeOnly);
-    }
-
-    if (!nack_batch.empty())
-      nack_sender_->SendNack(nack_batch);
-  }
-
-  // Update the next_process_time_ms_ in intervals to achieve
-  // the targeted frequency over time. Also add multiple intervals
-  // in case of a skip in time as to not make uneccessary
-  // calls to Process in order to catch up.
-  int64_t now_ms = clock_->TimeInMilliseconds();
-  if (next_process_time_ms_ == -1) {
-    next_process_time_ms_ = now_ms + kProcessIntervalMs;
-  } else {
-    next_process_time_ms_ = next_process_time_ms_ + kProcessIntervalMs +
-                            (now_ms - next_process_time_ms_) /
-                                kProcessIntervalMs * kProcessIntervalMs;
-  }
-}
-
-bool NackModule::RemovePacketsUntilKeyFrame() {
-  while (!keyframe_list_.empty()) {
-    auto it = nack_list_.lower_bound(*keyframe_list_.begin());
-
-    if (it != nack_list_.begin()) {
-      // We have found a keyframe that actually is newer than at least one
-      // packet in the nack list.
-      RTC_DCHECK(it != nack_list_.end());
-      nack_list_.erase(nack_list_.begin(), it);
-      return true;
-    }
-
-    // If this keyframe is so old it does not remove any packets from the list,
-    // remove it from the list of keyframes and try the next keyframe.
-    keyframe_list_.erase(keyframe_list_.begin());
-  }
-  return false;
-}
-
-void NackModule::AddPacketsToNack(uint16_t seq_num_start,
-                                  uint16_t seq_num_end) {
-  // Remove old packets.
-  auto it = nack_list_.lower_bound(seq_num_end - kMaxPacketAge);
-  nack_list_.erase(nack_list_.begin(), it);
-
-  // If the nack list is too large, remove packets from the nack list until
-  // the latest first packet of a keyframe. If the list is still too large,
-  // clear it and request a keyframe.
-  uint16_t num_new_nacks = ForwardDiff(seq_num_start, seq_num_end);
-  if (nack_list_.size() + num_new_nacks > kMaxNackPackets) {
-    while (RemovePacketsUntilKeyFrame() &&
-           nack_list_.size() + num_new_nacks > kMaxNackPackets) {
-    }
-
-    if (nack_list_.size() + num_new_nacks > kMaxNackPackets) {
-      nack_list_.clear();
-      LOG(LS_WARNING) << "NACK list full, clearing NACK"
-                         " list and requesting keyframe.";
-      keyframe_request_sender_->RequestKeyFrame();
-      return;
-    }
-  }
-
-  for (uint16_t seq_num = seq_num_start; seq_num != seq_num_end; ++seq_num) {
-    NackInfo nack_info(seq_num, seq_num + WaitNumberOfPackets(0.5));
-    RTC_DCHECK(nack_list_.find(seq_num) == nack_list_.end());
-    nack_list_[seq_num] = nack_info;
-  }
-}
-
-std::vector<uint16_t> NackModule::GetNackBatch(NackFilterOptions options) {
-  bool consider_seq_num = options != kTimeOnly;
-  bool consider_timestamp = options != kSeqNumOnly;
-  int64_t now_ms = clock_->TimeInMilliseconds();
-  std::vector<uint16_t> nack_batch;
-  auto it = nack_list_.begin();
-  while (it != nack_list_.end()) {
-    if (consider_seq_num && it->second.sent_at_time == -1 &&
-        AheadOrAt(newest_seq_num_, it->second.send_at_seq_num)) {
-      nack_batch.emplace_back(it->second.seq_num);
-      ++it->second.retries;
-      it->second.sent_at_time = now_ms;
-      if (it->second.retries >= kMaxNackRetries) {
-        LOG(LS_WARNING) << "Sequence number " << it->second.seq_num
-                        << " removed from NACK list due to max retries.";
-        it = nack_list_.erase(it);
-      } else {
-        ++it;
-      }
-      continue;
-    }
-
-    if (consider_timestamp && it->second.sent_at_time + rtt_ms_ <= now_ms) {
-      nack_batch.emplace_back(it->second.seq_num);
-      ++it->second.retries;
-      it->second.sent_at_time = now_ms;
-      if (it->second.retries >= kMaxNackRetries) {
-        LOG(LS_WARNING) << "Sequence number " << it->second.seq_num
-                        << " removed from NACK list due to max retries.";
-        it = nack_list_.erase(it);
-      } else {
-        ++it;
-      }
-      continue;
-    }
-    ++it;
-  }
-  return nack_batch;
-}
-
-void NackModule::UpdateReorderingStatistics(uint16_t seq_num) {
-  RTC_DCHECK(AheadOf(newest_seq_num_, seq_num));
-  uint16_t diff = ReverseDiff(newest_seq_num_, seq_num);
-  reordering_histogram_.Add(diff);
-}
-
-int NackModule::WaitNumberOfPackets(float probability) const {
-  if (reordering_histogram_.NumValues() == 0)
-    return 0;
-  return reordering_histogram_.InverseCdf(probability);
-}
-
-}  // namespace webrtc
diff --git a/modules/video_coding/nack_module.h b/modules/video_coding/nack_module.h
deleted file mode 100644
index df04a6b..0000000
--- a/modules/video_coding/nack_module.h
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- *  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_VIDEO_CODING_NACK_MODULE_H_
-#define WEBRTC_MODULES_VIDEO_CODING_NACK_MODULE_H_
-
-#include <map>
-#include <vector>
-#include <set>
-
-#include "webrtc/modules/include/module.h"
-#include "webrtc/modules/video_coding/histogram.h"
-#include "webrtc/modules/video_coding/include/video_coding_defines.h"
-#include "webrtc/modules/video_coding/packet.h"
-#include "webrtc/modules/video_coding/sequence_number_util.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/thread_annotations.h"
-#include "webrtc/system_wrappers/include/clock.h"
-
-namespace webrtc {
-
-class NackModule : public Module {
- public:
-  NackModule(Clock* clock,
-             NackSender* nack_sender,
-             KeyFrameRequestSender* keyframe_request_sender);
-
-  int OnReceivedPacket(const VCMPacket& packet);
-  void ClearUpTo(uint16_t seq_num);
-  void UpdateRtt(int64_t rtt_ms);
-  void Clear();
-
-  // Module implementation
-  int64_t TimeUntilNextProcess() override;
-  void Process() override;
-
- private:
-  // Which fields to consider when deciding which packet to nack in
-  // GetNackBatch.
-  enum NackFilterOptions { kSeqNumOnly, kTimeOnly, kSeqNumAndTime };
-
-  // This class holds the sequence number of the packet that is in the nack list
-  // as well as the meta data about when it should be nacked and how many times
-  // we have tried to nack this packet.
-  struct NackInfo {
-    NackInfo();
-    NackInfo(uint16_t seq_num, uint16_t send_at_seq_num);
-
-    uint16_t seq_num;
-    uint16_t send_at_seq_num;
-    int64_t sent_at_time;
-    int retries;
-  };
-  void AddPacketsToNack(uint16_t seq_num_start, uint16_t seq_num_end)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_);
-
-  // Removes packets from the nack list until the next keyframe. Returns true
-  // if packets were removed.
-  bool RemovePacketsUntilKeyFrame() RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_);
-  std::vector<uint16_t> GetNackBatch(NackFilterOptions options)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_);
-
-  // Update the reordering distribution.
-  void UpdateReorderingStatistics(uint16_t seq_num)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_);
-
-  // Returns how many packets we have to wait in order to receive the packet
-  // with probability |probabilty| or higher.
-  int WaitNumberOfPackets(float probability) const
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_);
-
-  rtc::CriticalSection crit_;
-  Clock* const clock_;
-  NackSender* const nack_sender_;
-  KeyFrameRequestSender* const keyframe_request_sender_;
-
-  // TODO(philipel): Some of the variables below are consistently used on a
-  // known thread (e.g. see |initialized_|). Those probably do not need
-  // synchronized access.
-  std::map<uint16_t, NackInfo, DescendingSeqNumComp<uint16_t>> nack_list_
-      RTC_GUARDED_BY(crit_);
-  std::set<uint16_t, DescendingSeqNumComp<uint16_t>> keyframe_list_
-      RTC_GUARDED_BY(crit_);
-  video_coding::Histogram reordering_histogram_ RTC_GUARDED_BY(crit_);
-  bool initialized_ RTC_GUARDED_BY(crit_);
-  int64_t rtt_ms_ RTC_GUARDED_BY(crit_);
-  uint16_t newest_seq_num_ RTC_GUARDED_BY(crit_);
-
-  // Only touched on the process thread.
-  int64_t next_process_time_ms_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_VIDEO_CODING_NACK_MODULE_H_
diff --git a/modules/video_coding/nack_module_unittest.cc b/modules/video_coding/nack_module_unittest.cc
deleted file mode 100644
index bb581fe..0000000
--- a/modules/video_coding/nack_module_unittest.cc
+++ /dev/null
@@ -1,317 +0,0 @@
-/*
- *  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 <cstring>
-#include <memory>
-
-#include "webrtc/modules/video_coding/include/video_coding_defines.h"
-#include "webrtc/modules/video_coding/nack_module.h"
-#include "webrtc/system_wrappers/include/clock.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-class TestNackModule : public ::testing::Test,
-                       public NackSender,
-                       public KeyFrameRequestSender {
- protected:
-  TestNackModule()
-      : clock_(new SimulatedClock(0)),
-        nack_module_(clock_.get(), this, this),
-        keyframes_requested_(0) {}
-
-  void SendNack(const std::vector<uint16_t>& sequence_numbers) override {
-    sent_nacks_.insert(sent_nacks_.end(), sequence_numbers.begin(),
-                       sequence_numbers.end());
-  }
-
-  void RequestKeyFrame() override { ++keyframes_requested_; }
-
-  std::unique_ptr<SimulatedClock> clock_;
-  NackModule nack_module_;
-  std::vector<uint16_t> sent_nacks_;
-  int keyframes_requested_;
-};
-
-TEST_F(TestNackModule, NackOnePacket) {
-  VCMPacket packet;
-  packet.seqNum = 1;
-  nack_module_.OnReceivedPacket(packet);
-  packet.seqNum = 3;
-  nack_module_.OnReceivedPacket(packet);
-  EXPECT_EQ(1u, sent_nacks_.size());
-  EXPECT_EQ(2, sent_nacks_[0]);
-}
-
-TEST_F(TestNackModule, WrappingSeqNum) {
-  VCMPacket packet;
-  packet.seqNum = 0xfffe;
-  nack_module_.OnReceivedPacket(packet);
-  packet.seqNum = 1;
-  nack_module_.OnReceivedPacket(packet);
-  EXPECT_EQ(2u, sent_nacks_.size());
-  EXPECT_EQ(0xffff, sent_nacks_[0]);
-  EXPECT_EQ(0, sent_nacks_[1]);
-}
-
-TEST_F(TestNackModule, WrappingSeqNumClearToKeyframe) {
-  VCMPacket packet;
-  packet.seqNum = 0xfffe;
-  nack_module_.OnReceivedPacket(packet);
-  packet.seqNum = 1;
-  nack_module_.OnReceivedPacket(packet);
-  EXPECT_EQ(2u, sent_nacks_.size());
-  EXPECT_EQ(0xffff, sent_nacks_[0]);
-  EXPECT_EQ(0, sent_nacks_[1]);
-
-  sent_nacks_.clear();
-  packet.frameType = kVideoFrameKey;
-  packet.is_first_packet_in_frame = true;
-  packet.seqNum = 2;
-  nack_module_.OnReceivedPacket(packet);
-  EXPECT_EQ(0u, sent_nacks_.size());
-
-  packet.seqNum = 501;
-  nack_module_.OnReceivedPacket(packet);
-  EXPECT_EQ(498u, sent_nacks_.size());
-  for (int seq_num = 3; seq_num < 501; ++seq_num)
-    EXPECT_EQ(seq_num, sent_nacks_[seq_num - 3]);
-
-  sent_nacks_.clear();
-  packet.frameType = kVideoFrameDelta;
-  packet.seqNum = 1001;
-  nack_module_.OnReceivedPacket(packet);
-  EXPECT_EQ(499u, sent_nacks_.size());
-  for (int seq_num = 502; seq_num < 1001; ++seq_num)
-    EXPECT_EQ(seq_num, sent_nacks_[seq_num - 502]);
-
-  sent_nacks_.clear();
-  clock_->AdvanceTimeMilliseconds(100);
-  nack_module_.Process();
-  EXPECT_EQ(999u, sent_nacks_.size());
-  EXPECT_EQ(0xffff, sent_nacks_[0]);
-  EXPECT_EQ(0, sent_nacks_[1]);
-  for (int seq_num = 3; seq_num < 501; ++seq_num)
-    EXPECT_EQ(seq_num, sent_nacks_[seq_num - 1]);
-  for (int seq_num = 502; seq_num < 1001; ++seq_num)
-    EXPECT_EQ(seq_num, sent_nacks_[seq_num - 2]);
-
-  // Adding packet 1004 will cause the nack list to reach it's max limit.
-  // It will then clear all nacks up to the next keyframe (seq num 2),
-  // thus removing 0xffff and 0 from the nack list.
-  sent_nacks_.clear();
-  packet.seqNum = 1004;
-  nack_module_.OnReceivedPacket(packet);
-  EXPECT_EQ(2u, sent_nacks_.size());
-  EXPECT_EQ(1002, sent_nacks_[0]);
-  EXPECT_EQ(1003, sent_nacks_[1]);
-
-  sent_nacks_.clear();
-  clock_->AdvanceTimeMilliseconds(100);
-  nack_module_.Process();
-  EXPECT_EQ(999u, sent_nacks_.size());
-  for (int seq_num = 3; seq_num < 501; ++seq_num)
-    EXPECT_EQ(seq_num, sent_nacks_[seq_num - 3]);
-  for (int seq_num = 502; seq_num < 1001; ++seq_num)
-    EXPECT_EQ(seq_num, sent_nacks_[seq_num - 4]);
-
-  // Adding packet 1007 will cause the nack module to overflow again, thus
-  // clearing everything up to 501 which is the next keyframe.
-  packet.seqNum = 1007;
-  nack_module_.OnReceivedPacket(packet);
-  sent_nacks_.clear();
-  clock_->AdvanceTimeMilliseconds(100);
-  nack_module_.Process();
-  EXPECT_EQ(503u, sent_nacks_.size());
-  for (int seq_num = 502; seq_num < 1001; ++seq_num)
-    EXPECT_EQ(seq_num, sent_nacks_[seq_num - 502]);
-  EXPECT_EQ(1005, sent_nacks_[501]);
-  EXPECT_EQ(1006, sent_nacks_[502]);
-}
-
-TEST_F(TestNackModule, DontBurstOnTimeSkip) {
-  nack_module_.Process();
-  clock_->AdvanceTimeMilliseconds(20);
-  EXPECT_EQ(0, nack_module_.TimeUntilNextProcess());
-  nack_module_.Process();
-
-  clock_->AdvanceTimeMilliseconds(100);
-  EXPECT_EQ(0, nack_module_.TimeUntilNextProcess());
-  nack_module_.Process();
-  EXPECT_EQ(20, nack_module_.TimeUntilNextProcess());
-
-  clock_->AdvanceTimeMilliseconds(19);
-  EXPECT_EQ(1, nack_module_.TimeUntilNextProcess());
-  clock_->AdvanceTimeMilliseconds(2);
-  nack_module_.Process();
-  EXPECT_EQ(19, nack_module_.TimeUntilNextProcess());
-
-  clock_->AdvanceTimeMilliseconds(19);
-  EXPECT_EQ(0, nack_module_.TimeUntilNextProcess());
-  nack_module_.Process();
-
-  clock_->AdvanceTimeMilliseconds(21);
-  EXPECT_EQ(0, nack_module_.TimeUntilNextProcess());
-  nack_module_.Process();
-  EXPECT_EQ(19, nack_module_.TimeUntilNextProcess());
-}
-
-TEST_F(TestNackModule, ResendNack) {
-  VCMPacket packet;
-  packet.seqNum = 1;
-  nack_module_.OnReceivedPacket(packet);
-  packet.seqNum = 3;
-  nack_module_.OnReceivedPacket(packet);
-  EXPECT_EQ(1u, sent_nacks_.size());
-  EXPECT_EQ(2, sent_nacks_[0]);
-
-  // Default RTT is 100
-  clock_->AdvanceTimeMilliseconds(99);
-  nack_module_.Process();
-  EXPECT_EQ(1u, sent_nacks_.size());
-
-  clock_->AdvanceTimeMilliseconds(1);
-  nack_module_.Process();
-  EXPECT_EQ(2u, sent_nacks_.size());
-
-  nack_module_.UpdateRtt(50);
-  clock_->AdvanceTimeMilliseconds(100);
-  nack_module_.Process();
-  EXPECT_EQ(3u, sent_nacks_.size());
-
-  clock_->AdvanceTimeMilliseconds(50);
-  nack_module_.Process();
-  EXPECT_EQ(4u, sent_nacks_.size());
-
-  packet.seqNum = 2;
-  nack_module_.OnReceivedPacket(packet);
-  clock_->AdvanceTimeMilliseconds(50);
-  nack_module_.Process();
-  EXPECT_EQ(4u, sent_nacks_.size());
-}
-
-TEST_F(TestNackModule, ResendPacketMaxRetries) {
-  VCMPacket packet;
-  packet.seqNum = 1;
-  nack_module_.OnReceivedPacket(packet);
-  packet.seqNum = 3;
-  nack_module_.OnReceivedPacket(packet);
-  EXPECT_EQ(1u, sent_nacks_.size());
-  EXPECT_EQ(2, sent_nacks_[0]);
-
-  for (size_t retries = 1; retries < 10; ++retries) {
-    clock_->AdvanceTimeMilliseconds(100);
-    nack_module_.Process();
-    EXPECT_EQ(retries + 1, sent_nacks_.size());
-  }
-
-  clock_->AdvanceTimeMilliseconds(100);
-  nack_module_.Process();
-  EXPECT_EQ(10u, sent_nacks_.size());
-}
-
-TEST_F(TestNackModule, TooLargeNackList) {
-  VCMPacket packet;
-  packet.seqNum = 0;
-  nack_module_.OnReceivedPacket(packet);
-  packet.seqNum = 1001;
-  nack_module_.OnReceivedPacket(packet);
-  EXPECT_EQ(1000u, sent_nacks_.size());
-  EXPECT_EQ(0, keyframes_requested_);
-  packet.seqNum = 1003;
-  nack_module_.OnReceivedPacket(packet);
-  EXPECT_EQ(1000u, sent_nacks_.size());
-  EXPECT_EQ(1, keyframes_requested_);
-  packet.seqNum = 1004;
-  nack_module_.OnReceivedPacket(packet);
-  EXPECT_EQ(1000u, sent_nacks_.size());
-  EXPECT_EQ(1, keyframes_requested_);
-}
-
-TEST_F(TestNackModule, TooLargeNackListWithKeyFrame) {
-  VCMPacket packet;
-  packet.seqNum = 0;
-  nack_module_.OnReceivedPacket(packet);
-  packet.seqNum = 1;
-  packet.is_first_packet_in_frame = true;
-  packet.frameType = kVideoFrameKey;
-  nack_module_.OnReceivedPacket(packet);
-  packet.seqNum = 1001;
-  packet.is_first_packet_in_frame = false;
-  packet.frameType = kVideoFrameKey;
-  nack_module_.OnReceivedPacket(packet);
-  EXPECT_EQ(999u, sent_nacks_.size());
-  EXPECT_EQ(0, keyframes_requested_);
-  packet.seqNum = 1003;
-  nack_module_.OnReceivedPacket(packet);
-  EXPECT_EQ(1000u, sent_nacks_.size());
-  EXPECT_EQ(0, keyframes_requested_);
-  packet.seqNum = 1005;
-  nack_module_.OnReceivedPacket(packet);
-  EXPECT_EQ(1000u, sent_nacks_.size());
-  EXPECT_EQ(1, keyframes_requested_);
-}
-
-TEST_F(TestNackModule, ClearUpTo) {
-  VCMPacket packet;
-  packet.seqNum = 0;
-  nack_module_.OnReceivedPacket(packet);
-  packet.seqNum = 100;
-  nack_module_.OnReceivedPacket(packet);
-  EXPECT_EQ(99u, sent_nacks_.size());
-
-  sent_nacks_.clear();
-  clock_->AdvanceTimeMilliseconds(100);
-  nack_module_.ClearUpTo(50);
-  nack_module_.Process();
-  EXPECT_EQ(50u, sent_nacks_.size());
-  EXPECT_EQ(50, sent_nacks_[0]);
-}
-
-TEST_F(TestNackModule, ClearUpToWrap) {
-  VCMPacket packet;
-  packet.seqNum = 0xfff0;
-  nack_module_.OnReceivedPacket(packet);
-  packet.seqNum = 0xf;
-  nack_module_.OnReceivedPacket(packet);
-  EXPECT_EQ(30u, sent_nacks_.size());
-
-  sent_nacks_.clear();
-  clock_->AdvanceTimeMilliseconds(100);
-  nack_module_.ClearUpTo(0);
-  nack_module_.Process();
-  EXPECT_EQ(15u, sent_nacks_.size());
-  EXPECT_EQ(0, sent_nacks_[0]);
-}
-
-TEST_F(TestNackModule, PacketNackCount) {
-  VCMPacket packet;
-  packet.seqNum = 0;
-  EXPECT_EQ(0, nack_module_.OnReceivedPacket(packet));
-  packet.seqNum = 2;
-  EXPECT_EQ(0, nack_module_.OnReceivedPacket(packet));
-  packet.seqNum = 1;
-  EXPECT_EQ(1, nack_module_.OnReceivedPacket(packet));
-
-  sent_nacks_.clear();
-  nack_module_.UpdateRtt(100);
-  packet.seqNum = 5;
-  EXPECT_EQ(0, nack_module_.OnReceivedPacket(packet));
-  clock_->AdvanceTimeMilliseconds(100);
-  nack_module_.Process();
-  clock_->AdvanceTimeMilliseconds(100);
-  nack_module_.Process();
-  packet.seqNum = 3;
-  EXPECT_EQ(3, nack_module_.OnReceivedPacket(packet));
-  packet.seqNum = 4;
-  EXPECT_EQ(3, nack_module_.OnReceivedPacket(packet));
-  EXPECT_EQ(0, nack_module_.OnReceivedPacket(packet));
-}
-
-}  // namespace webrtc
diff --git a/modules/video_coding/packet.cc b/modules/video_coding/packet.cc
deleted file mode 100644
index 7bc4d94..0000000
--- a/modules/video_coding/packet.cc
+++ /dev/null
@@ -1,145 +0,0 @@
-/*
- *  Copyright (c) 2011 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/video_coding/packet.h"
-
-#include <assert.h>
-
-#include "webrtc/modules/include/module_common_types.h"
-
-namespace webrtc {
-
-VCMPacket::VCMPacket()
-    : payloadType(0),
-      timestamp(0),
-      ntp_time_ms_(0),
-      seqNum(0),
-      dataPtr(NULL),
-      sizeBytes(0),
-      markerBit(false),
-      timesNacked(-1),
-      frameType(kEmptyFrame),
-      codec(kVideoCodecUnknown),
-      is_first_packet_in_frame(false),
-      completeNALU(kNaluUnset),
-      insertStartCode(false),
-      width(0),
-      height(0),
-      video_header(),
-      receive_time_ms(0) {
-  video_header.playout_delay = {-1, -1};
-}
-
-VCMPacket::VCMPacket(const uint8_t* ptr,
-                     const size_t size,
-                     const WebRtcRTPHeader& rtpHeader)
-    : payloadType(rtpHeader.header.payloadType),
-      timestamp(rtpHeader.header.timestamp),
-      ntp_time_ms_(rtpHeader.ntp_time_ms),
-      seqNum(rtpHeader.header.sequenceNumber),
-      dataPtr(ptr),
-      sizeBytes(size),
-      markerBit(rtpHeader.header.markerBit),
-      timesNacked(-1),
-      frameType(rtpHeader.frameType),
-      codec(kVideoCodecUnknown),
-      is_first_packet_in_frame(rtpHeader.type.Video.is_first_packet_in_frame),
-      completeNALU(kNaluComplete),
-      insertStartCode(false),
-      width(rtpHeader.type.Video.width),
-      height(rtpHeader.type.Video.height),
-      video_header(rtpHeader.type.Video) {
-  CopyCodecSpecifics(rtpHeader.type.Video);
-
-  if (markerBit) {
-    video_header.rotation = rtpHeader.type.Video.rotation;
-  }
-  // Playout decisions are made entirely based on first packet in a frame.
-  if (is_first_packet_in_frame) {
-    video_header.playout_delay = rtpHeader.type.Video.playout_delay;
-  } else {
-    video_header.playout_delay = {-1, -1};
-  }
-}
-
-void VCMPacket::Reset() {
-  payloadType = 0;
-  timestamp = 0;
-  ntp_time_ms_ = 0;
-  seqNum = 0;
-  dataPtr = NULL;
-  sizeBytes = 0;
-  markerBit = false;
-  timesNacked = -1;
-  frameType = kEmptyFrame;
-  codec = kVideoCodecUnknown;
-  is_first_packet_in_frame = false;
-  completeNALU = kNaluUnset;
-  insertStartCode = false;
-  width = 0;
-  height = 0;
-  memset(&video_header, 0, sizeof(RTPVideoHeader));
-}
-
-void VCMPacket::CopyCodecSpecifics(const RTPVideoHeader& videoHeader) {
-  switch (videoHeader.codec) {
-    case kRtpVideoVp8:
-      // Handle all packets within a frame as depending on the previous packet
-      // TODO(holmer): This should be changed to make fragments independent
-      // when the VP8 RTP receiver supports fragments.
-      if (is_first_packet_in_frame && markerBit)
-        completeNALU = kNaluComplete;
-      else if (is_first_packet_in_frame)
-        completeNALU = kNaluStart;
-      else if (markerBit)
-        completeNALU = kNaluEnd;
-      else
-        completeNALU = kNaluIncomplete;
-
-      codec = kVideoCodecVP8;
-      return;
-    case kRtpVideoVp9:
-      if (is_first_packet_in_frame && markerBit)
-        completeNALU = kNaluComplete;
-      else if (is_first_packet_in_frame)
-        completeNALU = kNaluStart;
-      else if (markerBit)
-        completeNALU = kNaluEnd;
-      else
-        completeNALU = kNaluIncomplete;
-
-      codec = kVideoCodecVP9;
-      return;
-    case kRtpVideoH264:
-      is_first_packet_in_frame = videoHeader.is_first_packet_in_frame;
-      if (is_first_packet_in_frame)
-        insertStartCode = true;
-
-      if (is_first_packet_in_frame && markerBit) {
-        completeNALU = kNaluComplete;
-      } else if (is_first_packet_in_frame) {
-        completeNALU = kNaluStart;
-      } else if (markerBit) {
-        completeNALU = kNaluEnd;
-      } else {
-        completeNALU = kNaluIncomplete;
-      }
-      codec = kVideoCodecH264;
-      return;
-    case kRtpVideoGeneric:
-      codec = kVideoCodecGeneric;
-      return;
-    case kRtpVideoNone:
-      codec = kVideoCodecUnknown;
-      return;
-  }
-}
-
-}  // namespace webrtc
diff --git a/modules/video_coding/packet.h b/modules/video_coding/packet.h
deleted file mode 100644
index f31c513..0000000
--- a/modules/video_coding/packet.h
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- *  Copyright (c) 2011 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_VIDEO_CODING_PACKET_H_
-#define WEBRTC_MODULES_VIDEO_CODING_PACKET_H_
-
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/modules/video_coding/jitter_buffer_common.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-class VCMPacket {
- public:
-  VCMPacket();
-  VCMPacket(const uint8_t* ptr,
-            const size_t size,
-            const WebRtcRTPHeader& rtpHeader);
-
-  void Reset();
-
-  uint8_t payloadType;
-  uint32_t timestamp;
-  // NTP time of the capture time in local timebase in milliseconds.
-  int64_t ntp_time_ms_;
-  uint16_t seqNum;
-  const uint8_t* dataPtr;
-  size_t sizeBytes;
-  bool markerBit;
-  int timesNacked;
-
-  FrameType frameType;
-  VideoCodecType codec;
-
-  bool is_first_packet_in_frame;
-  VCMNaluCompleteness completeNALU;  // Default is kNaluIncomplete.
-  bool insertStartCode;  // True if a start code should be inserted before this
-                         // packet.
-  int width;
-  int height;
-  RTPVideoHeader video_header;
-
-  int64_t receive_time_ms;
-
- protected:
-  void CopyCodecSpecifics(const RTPVideoHeader& videoHeader);
-};
-
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_VIDEO_CODING_PACKET_H_
diff --git a/modules/video_coding/packet_buffer.cc b/modules/video_coding/packet_buffer.cc
deleted file mode 100644
index 4859a85..0000000
--- a/modules/video_coding/packet_buffer.cc
+++ /dev/null
@@ -1,442 +0,0 @@
-/*
- *  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/video_coding/packet_buffer.h"
-
-#include <algorithm>
-#include <limits>
-#include <utility>
-
-#include "webrtc/common_video/h264/h264_common.h"
-#include "webrtc/modules/video_coding/frame_object.h"
-#include "webrtc/rtc_base/atomicops.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/system_wrappers/include/clock.h"
-
-namespace webrtc {
-namespace video_coding {
-
-rtc::scoped_refptr<PacketBuffer> PacketBuffer::Create(
-    Clock* clock,
-    size_t start_buffer_size,
-    size_t max_buffer_size,
-    OnReceivedFrameCallback* received_frame_callback) {
-  return rtc::scoped_refptr<PacketBuffer>(new PacketBuffer(
-      clock, start_buffer_size, max_buffer_size, received_frame_callback));
-}
-
-PacketBuffer::PacketBuffer(Clock* clock,
-                           size_t start_buffer_size,
-                           size_t max_buffer_size,
-                           OnReceivedFrameCallback* received_frame_callback)
-    : clock_(clock),
-      size_(start_buffer_size),
-      max_size_(max_buffer_size),
-      first_seq_num_(0),
-      first_packet_received_(false),
-      is_cleared_to_first_seq_num_(false),
-      data_buffer_(start_buffer_size),
-      sequence_buffer_(start_buffer_size),
-      received_frame_callback_(received_frame_callback) {
-  RTC_DCHECK_LE(start_buffer_size, max_buffer_size);
-  // Buffer size must always be a power of 2.
-  RTC_DCHECK((start_buffer_size & (start_buffer_size - 1)) == 0);
-  RTC_DCHECK((max_buffer_size & (max_buffer_size - 1)) == 0);
-}
-
-PacketBuffer::~PacketBuffer() {
-  Clear();
-}
-
-bool PacketBuffer::InsertPacket(VCMPacket* packet) {
-  std::vector<std::unique_ptr<RtpFrameObject>> found_frames;
-  {
-    rtc::CritScope lock(&crit_);
-
-    uint16_t seq_num = packet->seqNum;
-    size_t index = seq_num % size_;
-
-    if (!first_packet_received_) {
-      first_seq_num_ = seq_num;
-      first_packet_received_ = true;
-    } else if (AheadOf(first_seq_num_, seq_num)) {
-      // If we have explicitly cleared past this packet then it's old,
-      // don't insert it.
-      if (is_cleared_to_first_seq_num_) {
-        delete[] packet->dataPtr;
-        packet->dataPtr = nullptr;
-        return false;
-      }
-
-      first_seq_num_ = seq_num;
-    }
-
-    if (sequence_buffer_[index].used) {
-      // Duplicate packet, just delete the payload.
-      if (data_buffer_[index].seqNum == packet->seqNum) {
-        delete[] packet->dataPtr;
-        packet->dataPtr = nullptr;
-        return true;
-      }
-
-      // The packet buffer is full, try to expand the buffer.
-      while (ExpandBufferSize() && sequence_buffer_[seq_num % size_].used) {
-      }
-      index = seq_num % size_;
-
-      // Packet buffer is still full.
-      if (sequence_buffer_[index].used) {
-        delete[] packet->dataPtr;
-        packet->dataPtr = nullptr;
-        return false;
-      }
-    }
-
-    sequence_buffer_[index].frame_begin = packet->is_first_packet_in_frame;
-    sequence_buffer_[index].frame_end = packet->markerBit;
-    sequence_buffer_[index].seq_num = packet->seqNum;
-    sequence_buffer_[index].continuous = false;
-    sequence_buffer_[index].frame_created = false;
-    sequence_buffer_[index].used = true;
-    data_buffer_[index] = *packet;
-    packet->dataPtr = nullptr;
-
-    UpdateMissingPackets(packet->seqNum);
-
-    int64_t now_ms = clock_->TimeInMilliseconds();
-    last_received_packet_ms_ = rtc::Optional<int64_t>(now_ms);
-    if (packet->frameType == kVideoFrameKey)
-      last_received_keyframe_packet_ms_ = rtc::Optional<int64_t>(now_ms);
-
-    found_frames = FindFrames(seq_num);
-  }
-
-  for (std::unique_ptr<RtpFrameObject>& frame : found_frames)
-    received_frame_callback_->OnReceivedFrame(std::move(frame));
-
-  return true;
-}
-
-void PacketBuffer::ClearTo(uint16_t seq_num) {
-  rtc::CritScope lock(&crit_);
-  // We have already cleared past this sequence number, no need to do anything.
-  if (is_cleared_to_first_seq_num_ &&
-      AheadOf<uint16_t>(first_seq_num_, seq_num)) {
-    return;
-  }
-
-  // If the packet buffer was cleared between a frame was created and returned.
-  if (!first_packet_received_)
-    return;
-
-  // Avoid iterating over the buffer more than once by capping the number of
-  // iterations to the |size_| of the buffer.
-  ++seq_num;
-  size_t diff = ForwardDiff<uint16_t>(first_seq_num_, seq_num);
-  size_t iterations = std::min(diff, size_);
-  for (size_t i = 0; i < iterations; ++i) {
-    size_t index = first_seq_num_ % size_;
-    RTC_DCHECK_EQ(data_buffer_[index].seqNum, sequence_buffer_[index].seq_num);
-    if (AheadOf<uint16_t>(seq_num, sequence_buffer_[index].seq_num)) {
-      delete[] data_buffer_[index].dataPtr;
-      data_buffer_[index].dataPtr = nullptr;
-      sequence_buffer_[index].used = false;
-    }
-    ++first_seq_num_;
-  }
-
-  // If |diff| is larger than |iterations| it means that we don't increment
-  // |first_seq_num_| until we reach |seq_num|, so we set it here.
-  first_seq_num_ = seq_num;
-
-  is_cleared_to_first_seq_num_ = true;
-  missing_packets_.erase(missing_packets_.begin(),
-                         missing_packets_.upper_bound(seq_num));
-}
-
-void PacketBuffer::Clear() {
-  rtc::CritScope lock(&crit_);
-  for (size_t i = 0; i < size_; ++i) {
-    delete[] data_buffer_[i].dataPtr;
-    data_buffer_[i].dataPtr = nullptr;
-    sequence_buffer_[i].used = false;
-  }
-
-  first_packet_received_ = false;
-  is_cleared_to_first_seq_num_ = false;
-  last_received_packet_ms_.reset();
-  last_received_keyframe_packet_ms_.reset();
-  newest_inserted_seq_num_.reset();
-  missing_packets_.clear();
-}
-
-void PacketBuffer::PaddingReceived(uint16_t seq_num) {
-  std::vector<std::unique_ptr<RtpFrameObject>> found_frames;
-  {
-    rtc::CritScope lock(&crit_);
-    UpdateMissingPackets(seq_num);
-    found_frames = FindFrames(static_cast<uint16_t>(seq_num + 1));
-  }
-
-  for (std::unique_ptr<RtpFrameObject>& frame : found_frames)
-    received_frame_callback_->OnReceivedFrame(std::move(frame));
-}
-
-rtc::Optional<int64_t> PacketBuffer::LastReceivedPacketMs() const {
-  rtc::CritScope lock(&crit_);
-  return last_received_packet_ms_;
-}
-
-rtc::Optional<int64_t> PacketBuffer::LastReceivedKeyframePacketMs() const {
-  rtc::CritScope lock(&crit_);
-  return last_received_keyframe_packet_ms_;
-}
-
-bool PacketBuffer::ExpandBufferSize() {
-  if (size_ == max_size_) {
-    LOG(LS_WARNING) << "PacketBuffer is already at max size (" << max_size_
-                    << "), failed to increase size. Clearing PacketBuffer.";
-    Clear();
-    return false;
-  }
-
-  size_t new_size = std::min(max_size_, 2 * size_);
-  std::vector<VCMPacket> new_data_buffer(new_size);
-  std::vector<ContinuityInfo> new_sequence_buffer(new_size);
-  for (size_t i = 0; i < size_; ++i) {
-    if (sequence_buffer_[i].used) {
-      size_t index = sequence_buffer_[i].seq_num % new_size;
-      new_sequence_buffer[index] = sequence_buffer_[i];
-      new_data_buffer[index] = data_buffer_[i];
-    }
-  }
-  size_ = new_size;
-  sequence_buffer_ = std::move(new_sequence_buffer);
-  data_buffer_ = std::move(new_data_buffer);
-  LOG(LS_INFO) << "PacketBuffer size expanded to " << new_size;
-  return true;
-}
-
-bool PacketBuffer::PotentialNewFrame(uint16_t seq_num) const {
-  size_t index = seq_num % size_;
-  int prev_index = index > 0 ? index - 1 : size_ - 1;
-
-  if (!sequence_buffer_[index].used)
-    return false;
-  if (sequence_buffer_[index].seq_num != seq_num)
-    return false;
-  if (sequence_buffer_[index].frame_created)
-    return false;
-  if (sequence_buffer_[index].frame_begin)
-    return true;
-  if (!sequence_buffer_[prev_index].used)
-    return false;
-  if (sequence_buffer_[prev_index].frame_created)
-    return false;
-  if (sequence_buffer_[prev_index].seq_num !=
-      static_cast<uint16_t>(sequence_buffer_[index].seq_num - 1)) {
-    return false;
-  }
-  if (sequence_buffer_[prev_index].continuous)
-    return true;
-
-  return false;
-}
-
-std::vector<std::unique_ptr<RtpFrameObject>> PacketBuffer::FindFrames(
-    uint16_t seq_num) {
-  std::vector<std::unique_ptr<RtpFrameObject>> found_frames;
-  for (size_t i = 0; i < size_ && PotentialNewFrame(seq_num); ++i) {
-    size_t index = seq_num % size_;
-    sequence_buffer_[index].continuous = true;
-
-    // If all packets of the frame is continuous, find the first packet of the
-    // frame and create an RtpFrameObject.
-    if (sequence_buffer_[index].frame_end) {
-      size_t frame_size = 0;
-      int max_nack_count = -1;
-      uint16_t start_seq_num = seq_num;
-
-      // Find the start index by searching backward until the packet with
-      // the |frame_begin| flag is set.
-      int start_index = index;
-      size_t tested_packets = 0;
-
-      bool is_h264 = data_buffer_[start_index].codec == kVideoCodecH264;
-      bool is_h264_keyframe = false;
-      int64_t frame_timestamp = data_buffer_[start_index].timestamp;
-
-      while (true) {
-        ++tested_packets;
-        frame_size += data_buffer_[start_index].sizeBytes;
-        max_nack_count =
-            std::max(max_nack_count, data_buffer_[start_index].timesNacked);
-        sequence_buffer_[start_index].frame_created = true;
-
-        if (!is_h264 && sequence_buffer_[start_index].frame_begin)
-          break;
-
-        if (is_h264 && !is_h264_keyframe) {
-          const RTPVideoHeaderH264& header =
-              data_buffer_[start_index].video_header.codecHeader.H264;
-          for (size_t i = 0; i < header.nalus_length; ++i) {
-            if (header.nalus[i].type == H264::NaluType::kIdr) {
-              is_h264_keyframe = true;
-              break;
-            }
-          }
-        }
-
-        if (tested_packets == size_)
-          break;
-
-        start_index = start_index > 0 ? start_index - 1 : size_ - 1;
-
-        // In the case of H264 we don't have a frame_begin bit (yes,
-        // |frame_begin| might be set to true but that is a lie). So instead
-        // we traverese backwards as long as we have a previous packet and
-        // the timestamp of that packet is the same as this one. This may cause
-        // the PacketBuffer to hand out incomplete frames.
-        // See: https://bugs.chromium.org/p/webrtc/issues/detail?id=7106
-        if (is_h264 &&
-            (!sequence_buffer_[start_index].used ||
-             data_buffer_[start_index].timestamp != frame_timestamp)) {
-          break;
-        }
-
-        --start_seq_num;
-      }
-
-      // If this is H264 but not a keyframe, make sure there are no gaps in the
-      // packet sequence numbers up until this point.
-      if (is_h264 && !is_h264_keyframe &&
-          missing_packets_.upper_bound(start_seq_num) !=
-              missing_packets_.begin()) {
-        uint16_t stop_index = (index + 1) % size_;
-        while (start_index != stop_index) {
-          sequence_buffer_[start_index].frame_created = false;
-          start_index = (start_index + 1) % size_;
-        }
-
-        return found_frames;
-      }
-
-      missing_packets_.erase(missing_packets_.begin(),
-                             missing_packets_.upper_bound(seq_num));
-
-      found_frames.emplace_back(
-          new RtpFrameObject(this, start_seq_num, seq_num, frame_size,
-                             max_nack_count, clock_->TimeInMilliseconds()));
-    }
-    ++seq_num;
-  }
-  return found_frames;
-}
-
-void PacketBuffer::ReturnFrame(RtpFrameObject* frame) {
-  rtc::CritScope lock(&crit_);
-  size_t index = frame->first_seq_num() % size_;
-  size_t end = (frame->last_seq_num() + 1) % size_;
-  uint16_t seq_num = frame->first_seq_num();
-  while (index != end) {
-    if (sequence_buffer_[index].seq_num == seq_num) {
-      delete[] data_buffer_[index].dataPtr;
-      data_buffer_[index].dataPtr = nullptr;
-      sequence_buffer_[index].used = false;
-    }
-
-    index = (index + 1) % size_;
-    ++seq_num;
-  }
-}
-
-bool PacketBuffer::GetBitstream(const RtpFrameObject& frame,
-                                uint8_t* destination) {
-  rtc::CritScope lock(&crit_);
-
-  size_t index = frame.first_seq_num() % size_;
-  size_t end = (frame.last_seq_num() + 1) % size_;
-  uint16_t seq_num = frame.first_seq_num();
-  uint8_t* destination_end = destination + frame.size();
-
-  do {
-    if (!sequence_buffer_[index].used ||
-        sequence_buffer_[index].seq_num != seq_num) {
-      return false;
-    }
-
-    RTC_DCHECK_EQ(data_buffer_[index].seqNum, sequence_buffer_[index].seq_num);
-    size_t length = data_buffer_[index].sizeBytes;
-    if (destination + length > destination_end) {
-      LOG(LS_WARNING) << "Frame (" << frame.picture_id << ":"
-                      << static_cast<int>(frame.spatial_layer) << ")"
-                      << " bitstream buffer is not large enough.";
-      return false;
-    }
-
-    const uint8_t* source = data_buffer_[index].dataPtr;
-    memcpy(destination, source, length);
-    destination += length;
-    index = (index + 1) % size_;
-    ++seq_num;
-  } while (index != end);
-
-  return true;
-}
-
-VCMPacket* PacketBuffer::GetPacket(uint16_t seq_num) {
-  size_t index = seq_num % size_;
-  if (!sequence_buffer_[index].used ||
-      seq_num != sequence_buffer_[index].seq_num) {
-    return nullptr;
-  }
-  return &data_buffer_[index];
-}
-
-int PacketBuffer::AddRef() const {
-  return rtc::AtomicOps::Increment(&ref_count_);
-}
-
-int PacketBuffer::Release() const {
-  int count = rtc::AtomicOps::Decrement(&ref_count_);
-  if (!count) {
-    delete this;
-  }
-  return count;
-}
-
-void PacketBuffer::UpdateMissingPackets(uint16_t seq_num) {
-  if (!newest_inserted_seq_num_)
-    newest_inserted_seq_num_ = rtc::Optional<uint16_t>(seq_num);
-
-  const int kMaxPaddingAge = 1000;
-  if (AheadOf(seq_num, *newest_inserted_seq_num_)) {
-    uint16_t old_seq_num = seq_num - kMaxPaddingAge;
-    auto erase_to = missing_packets_.lower_bound(old_seq_num);
-    missing_packets_.erase(missing_packets_.begin(), erase_to);
-
-    // Guard against inserting a large amount of missing packets if there is a
-    // jump in the sequence number.
-    if (AheadOf(old_seq_num, *newest_inserted_seq_num_))
-      *newest_inserted_seq_num_ = old_seq_num;
-
-    ++*newest_inserted_seq_num_;
-    while (AheadOf(seq_num, *newest_inserted_seq_num_)) {
-      missing_packets_.insert(*newest_inserted_seq_num_);
-      ++*newest_inserted_seq_num_;
-    }
-  } else {
-    missing_packets_.erase(seq_num);
-  }
-}
-
-}  // namespace video_coding
-}  // namespace webrtc
diff --git a/modules/video_coding/packet_buffer.h b/modules/video_coding/packet_buffer.h
deleted file mode 100644
index 56e2363..0000000
--- a/modules/video_coding/packet_buffer.h
+++ /dev/null
@@ -1,169 +0,0 @@
-/*
- *  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_VIDEO_CODING_PACKET_BUFFER_H_
-#define WEBRTC_MODULES_VIDEO_CODING_PACKET_BUFFER_H_
-
-#include <memory>
-#include <set>
-#include <vector>
-
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/modules/video_coding/packet.h"
-#include "webrtc/modules/video_coding/rtp_frame_reference_finder.h"
-#include "webrtc/modules/video_coding/sequence_number_util.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/scoped_ref_ptr.h"
-#include "webrtc/rtc_base/thread_annotations.h"
-
-namespace webrtc {
-
-class Clock;
-
-namespace video_coding {
-
-class FrameObject;
-class RtpFrameObject;
-
-// A received frame is a frame which has received all its packets.
-class OnReceivedFrameCallback {
- public:
-  virtual ~OnReceivedFrameCallback() {}
-  virtual void OnReceivedFrame(std::unique_ptr<RtpFrameObject> frame) = 0;
-};
-
-class PacketBuffer {
- public:
-  static rtc::scoped_refptr<PacketBuffer> Create(
-      Clock* clock,
-      size_t start_buffer_size,
-      size_t max_buffer_size,
-      OnReceivedFrameCallback* frame_callback);
-
-  virtual ~PacketBuffer();
-
-  // Returns true if |packet| is inserted into the packet buffer, false
-  // otherwise. The PacketBuffer will always take ownership of the
-  // |packet.dataPtr| when this function is called. Made virtual for testing.
-  virtual bool InsertPacket(VCMPacket* packet);
-  void ClearTo(uint16_t seq_num);
-  void Clear();
-  void PaddingReceived(uint16_t seq_num);
-
-  // Timestamp (not RTP timestamp) of the last received packet/keyframe packet.
-  rtc::Optional<int64_t> LastReceivedPacketMs() const;
-  rtc::Optional<int64_t> LastReceivedKeyframePacketMs() const;
-
-  int AddRef() const;
-  int Release() const;
-
- protected:
-  // Both |start_buffer_size| and |max_buffer_size| must be a power of 2.
-  PacketBuffer(Clock* clock,
-               size_t start_buffer_size,
-               size_t max_buffer_size,
-               OnReceivedFrameCallback* frame_callback);
-
- private:
-  friend RtpFrameObject;
-  // Since we want the packet buffer to be as packet type agnostic
-  // as possible we extract only the information needed in order
-  // to determine whether a sequence of packets is continuous or not.
-  struct ContinuityInfo {
-    // The sequence number of the packet.
-    uint16_t seq_num = 0;
-
-    // If this is the first packet of the frame.
-    bool frame_begin = false;
-
-    // If this is the last packet of the frame.
-    bool frame_end = false;
-
-    // If this slot is currently used.
-    bool used = false;
-
-    // If all its previous packets have been inserted into the packet buffer.
-    bool continuous = false;
-
-    // If this packet has been used to create a frame already.
-    bool frame_created = false;
-  };
-
-  Clock* const clock_;
-
-  // Tries to expand the buffer.
-  bool ExpandBufferSize() RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_);
-
-  // Test if all previous packets has arrived for the given sequence number.
-  bool PotentialNewFrame(uint16_t seq_num) const
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_);
-
-  // Test if all packets of a frame has arrived, and if so, creates a frame.
-  // Returns a vector of received frames.
-  std::vector<std::unique_ptr<RtpFrameObject>> FindFrames(uint16_t seq_num)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_);
-
-  // Copy the bitstream for |frame| to |destination|.
-  // Virtual for testing.
-  virtual bool GetBitstream(const RtpFrameObject& frame, uint8_t* destination);
-
-  // Get the packet with sequence number |seq_num|.
-  // Virtual for testing.
-  virtual VCMPacket* GetPacket(uint16_t seq_num)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_);
-
-  // Mark all slots used by |frame| as not used.
-  // Virtual for testing.
-  virtual void ReturnFrame(RtpFrameObject* frame);
-
-  void UpdateMissingPackets(uint16_t seq_num)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_);
-
-  rtc::CriticalSection crit_;
-
-  // Buffer size_ and max_size_ must always be a power of two.
-  size_t size_ RTC_GUARDED_BY(crit_);
-  const size_t max_size_;
-
-  // The fist sequence number currently in the buffer.
-  uint16_t first_seq_num_ RTC_GUARDED_BY(crit_);
-
-  // If the packet buffer has received its first packet.
-  bool first_packet_received_ RTC_GUARDED_BY(crit_);
-
-  // If the buffer is cleared to |first_seq_num_|.
-  bool is_cleared_to_first_seq_num_ RTC_GUARDED_BY(crit_);
-
-  // Buffer that holds the inserted packets.
-  std::vector<VCMPacket> data_buffer_ RTC_GUARDED_BY(crit_);
-
-  // Buffer that holds the information about which slot that is currently in use
-  // and information needed to determine the continuity between packets.
-  std::vector<ContinuityInfo> sequence_buffer_ RTC_GUARDED_BY(crit_);
-
-  // Called when a received frame is found.
-  OnReceivedFrameCallback* const received_frame_callback_;
-
-  // Timestamp (not RTP timestamp) of the last received packet/keyframe packet.
-  rtc::Optional<int64_t> last_received_packet_ms_ RTC_GUARDED_BY(crit_);
-  rtc::Optional<int64_t> last_received_keyframe_packet_ms_
-      RTC_GUARDED_BY(crit_);
-
-  rtc::Optional<uint16_t> newest_inserted_seq_num_ RTC_GUARDED_BY(crit_);
-  std::set<uint16_t, DescendingSeqNumComp<uint16_t>> missing_packets_
-      RTC_GUARDED_BY(crit_);
-
-  mutable volatile int ref_count_ = 0;
-};
-
-}  // namespace video_coding
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_VIDEO_CODING_PACKET_BUFFER_H_
diff --git a/modules/video_coding/protection_bitrate_calculator.cc b/modules/video_coding/protection_bitrate_calculator.cc
deleted file mode 100644
index 411ed1a..0000000
--- a/modules/video_coding/protection_bitrate_calculator.cc
+++ /dev/null
@@ -1,191 +0,0 @@
-/*
- *  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/video_coding/protection_bitrate_calculator.h"
-
-namespace webrtc {
-
-using rtc::CritScope;
-
-struct ProtectionBitrateCalculator::EncodedFrameSample {
-  EncodedFrameSample(size_t size_bytes,
-                     uint32_t timestamp,
-                     int64_t time_complete_ms)
-      : size_bytes(size_bytes),
-        timestamp(timestamp),
-        time_complete_ms(time_complete_ms) {}
-  size_t size_bytes;
-  uint32_t timestamp;
-  int64_t time_complete_ms;
-};
-
-ProtectionBitrateCalculator::ProtectionBitrateCalculator(
-    Clock* clock,
-    VCMProtectionCallback* protection_callback)
-    : clock_(clock),
-      protection_callback_(protection_callback),
-      loss_prot_logic_(new media_optimization::VCMLossProtectionLogic(
-          clock_->TimeInMilliseconds())),
-      max_payload_size_(1460) {}
-
-ProtectionBitrateCalculator::~ProtectionBitrateCalculator(void) {
-  loss_prot_logic_->Release();
-}
-
-void ProtectionBitrateCalculator::SetEncodingData(size_t width,
-                                                  size_t height,
-                                                  size_t num_temporal_layers,
-                                                  size_t max_payload_size) {
-  CritScope lock(&crit_sect_);
-  loss_prot_logic_->UpdateFrameSize(width, height);
-  loss_prot_logic_->UpdateNumLayers(num_temporal_layers);
-  max_payload_size_ = max_payload_size;
-}
-
-uint32_t ProtectionBitrateCalculator::SetTargetRates(
-    uint32_t estimated_bitrate_bps,
-    int actual_framerate_fps,
-    uint8_t fraction_lost,
-    int64_t round_trip_time_ms) {
-  float target_bitrate_kbps =
-      static_cast<float>(estimated_bitrate_bps) / 1000.0f;
-  // Sanity check.
-  if (actual_framerate_fps < 1.0) {
-    actual_framerate_fps = 1.0;
-  }
-
-  FecProtectionParams delta_fec_params;
-  FecProtectionParams key_fec_params;
-  {
-    CritScope lock(&crit_sect_);
-
-    loss_prot_logic_->UpdateBitRate(target_bitrate_kbps);
-    loss_prot_logic_->UpdateRtt(round_trip_time_ms);
-
-    // Update frame rate for the loss protection logic class: frame rate should
-    // be the actual/sent rate.
-    loss_prot_logic_->UpdateFrameRate(actual_framerate_fps);
-
-    // Returns the filtered packet loss, used for the protection setting.
-    // The filtered loss may be the received loss (no filter), or some
-    // filtered value (average or max window filter).
-    // Use max window filter for now.
-    media_optimization::FilterPacketLossMode filter_mode =
-        media_optimization::kMaxFilter;
-    uint8_t packet_loss_enc = loss_prot_logic_->FilteredLoss(
-        clock_->TimeInMilliseconds(), filter_mode, fraction_lost);
-
-    // For now use the filtered loss for computing the robustness settings.
-    loss_prot_logic_->UpdateFilteredLossPr(packet_loss_enc);
-
-    if (loss_prot_logic_->SelectedType() == media_optimization::kNone) {
-      return estimated_bitrate_bps;
-    }
-
-    // Update method will compute the robustness settings for the given
-    // protection method and the overhead cost
-    // the protection method is set by the user via SetVideoProtection.
-    loss_prot_logic_->UpdateMethod();
-
-    // Get the bit cost of protection method, based on the amount of
-    // overhead data actually transmitted (including headers) the last
-    // second.
-
-    // Get the FEC code rate for Key frames (set to 0 when NA).
-    key_fec_params.fec_rate =
-        loss_prot_logic_->SelectedMethod()->RequiredProtectionFactorK();
-
-    // Get the FEC code rate for Delta frames (set to 0 when NA).
-    delta_fec_params.fec_rate =
-        loss_prot_logic_->SelectedMethod()->RequiredProtectionFactorD();
-
-    // The RTP module currently requires the same |max_fec_frames| for both
-    // key and delta frames.
-    delta_fec_params.max_fec_frames =
-        loss_prot_logic_->SelectedMethod()->MaxFramesFec();
-    key_fec_params.max_fec_frames =
-        loss_prot_logic_->SelectedMethod()->MaxFramesFec();
-  }
-
-  // Set the FEC packet mask type. |kFecMaskBursty| is more effective for
-  // consecutive losses and little/no packet re-ordering. As we currently
-  // do not have feedback data on the degree of correlated losses and packet
-  // re-ordering, we keep default setting to |kFecMaskRandom| for now.
-  delta_fec_params.fec_mask_type = kFecMaskRandom;
-  key_fec_params.fec_mask_type = kFecMaskRandom;
-
-  // Update protection callback with protection settings.
-  uint32_t sent_video_rate_bps = 0;
-  uint32_t sent_nack_rate_bps = 0;
-  uint32_t sent_fec_rate_bps = 0;
-  // Rate cost of the protection methods.
-  float protection_overhead_rate = 0.0f;
-
-  // TODO(Marco): Pass FEC protection values per layer.
-  protection_callback_->ProtectionRequest(
-      &delta_fec_params, &key_fec_params, &sent_video_rate_bps,
-      &sent_nack_rate_bps, &sent_fec_rate_bps);
-
-  uint32_t sent_total_rate_bps =
-      sent_video_rate_bps + sent_nack_rate_bps + sent_fec_rate_bps;
-  // Estimate the overhead costs of the next second as staying the same
-  // wrt the source bitrate.
-  if (sent_total_rate_bps > 0) {
-    protection_overhead_rate =
-        static_cast<float>(sent_nack_rate_bps + sent_fec_rate_bps) /
-        sent_total_rate_bps;
-  }
-  // Cap the overhead estimate to 50%.
-  if (protection_overhead_rate > 0.5)
-    protection_overhead_rate = 0.5;
-
-  // Source coding rate: total rate - protection overhead.
-  return estimated_bitrate_bps * (1.0 - protection_overhead_rate);
-}
-
-void ProtectionBitrateCalculator::SetProtectionMethod(bool enable_fec,
-                                                      bool enable_nack) {
-  media_optimization::VCMProtectionMethodEnum method(media_optimization::kNone);
-  if (enable_fec && enable_nack) {
-    method = media_optimization::kNackFec;
-  } else if (enable_nack) {
-    method = media_optimization::kNack;
-  } else if (enable_fec) {
-    method = media_optimization::kFec;
-  }
-  CritScope lock(&crit_sect_);
-  loss_prot_logic_->SetMethod(method);
-}
-
-void ProtectionBitrateCalculator::UpdateWithEncodedData(
-    const EncodedImage& encoded_image) {
-  const size_t encoded_length = encoded_image._length;
-  CritScope lock(&crit_sect_);
-  if (encoded_length > 0) {
-    const bool delta_frame = encoded_image._frameType != kVideoFrameKey;
-
-    if (max_payload_size_ > 0 && encoded_length > 0) {
-      const float min_packets_per_frame =
-          encoded_length / static_cast<float>(max_payload_size_);
-      if (delta_frame) {
-        loss_prot_logic_->UpdatePacketsPerFrame(min_packets_per_frame,
-                                                clock_->TimeInMilliseconds());
-      } else {
-        loss_prot_logic_->UpdatePacketsPerFrameKey(
-            min_packets_per_frame, clock_->TimeInMilliseconds());
-      }
-    }
-    if (!delta_frame && encoded_length > 0) {
-      loss_prot_logic_->UpdateKeyFrameSize(static_cast<float>(encoded_length));
-    }
-  }
-}
-
-}  // namespace webrtc
diff --git a/modules/video_coding/protection_bitrate_calculator.h b/modules/video_coding/protection_bitrate_calculator.h
deleted file mode 100644
index d649695..0000000
--- a/modules/video_coding/protection_bitrate_calculator.h
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- *  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_VIDEO_CODING_PROTECTION_BITRATE_CALCULATOR_H_
-#define WEBRTC_MODULES_VIDEO_CODING_PROTECTION_BITRATE_CALCULATOR_H_
-
-#include <list>
-#include <memory>
-
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/modules/video_coding/include/video_coding.h"
-#include "webrtc/modules/video_coding/media_opt_util.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/system_wrappers/include/clock.h"
-
-namespace webrtc {
-
-// ProtectionBitrateCalculator calculates how much of the allocated network
-// capacity that can be used by an encoder and how much that
-// is needed for redundant packets such as FEC and NACK. It uses an
-// implementation of |VCMProtectionCallback| to set new FEC parameters and get
-// the bitrate currently used for FEC and NACK.
-// Usage:
-// Setup by calling SetProtectionMethod and SetEncodingData.
-// For each encoded image, call UpdateWithEncodedData.
-// Each time the bandwidth estimate change, call SetTargetRates. SetTargetRates
-// will return the bitrate that can be used by an encoder.
-// A lock is used to protect internal states, so methods can be called on an
-// arbitrary thread.
-class ProtectionBitrateCalculator {
- public:
-  ProtectionBitrateCalculator(Clock* clock,
-                              VCMProtectionCallback* protection_callback);
-  ~ProtectionBitrateCalculator();
-
-  void SetProtectionMethod(bool enable_fec, bool enable_nack);
-
-  // Informs media optimization of initial encoding state.
-  void SetEncodingData(size_t width,
-                       size_t height,
-                       size_t num_temporal_layers,
-                       size_t max_payload_size);
-
-  // Returns target rate for the encoder given the channel parameters.
-  // Inputs:  estimated_bitrate_bps - the estimated network bitrate in bits/s.
-  //          actual_framerate - encoder frame rate.
-  //          fraction_lost - packet loss rate in % in the network.
-  //          round_trip_time_ms - round trip time in milliseconds.
-  uint32_t SetTargetRates(uint32_t estimated_bitrate_bps,
-                          int actual_framerate,
-                          uint8_t fraction_lost,
-                          int64_t round_trip_time_ms);
-  // Informs of encoded output.
-  void UpdateWithEncodedData(const EncodedImage& encoded_image);
-
- private:
-  struct EncodedFrameSample;
-  enum { kBitrateAverageWinMs = 1000 };
-
-  Clock* const clock_;
-  VCMProtectionCallback* const protection_callback_;
-
-  rtc::CriticalSection crit_sect_;
-  std::unique_ptr<media_optimization::VCMLossProtectionLogic> loss_prot_logic_
-      RTC_GUARDED_BY(crit_sect_);
-  size_t max_payload_size_ RTC_GUARDED_BY(crit_sect_);
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(ProtectionBitrateCalculator);
-};
-
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_VIDEO_CODING_PROTECTION_BITRATE_CALCULATOR_H_
diff --git a/modules/video_coding/protection_bitrate_calculator_unittest.cc b/modules/video_coding/protection_bitrate_calculator_unittest.cc
deleted file mode 100644
index 718929c..0000000
--- a/modules/video_coding/protection_bitrate_calculator_unittest.cc
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- *  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/video_coding/protection_bitrate_calculator.h"
-#include "webrtc/system_wrappers/include/clock.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-static const int kCodecBitrateBps = 100000;
-
-class ProtectionBitrateCalculatorTest : public ::testing::Test {
- protected:
-  enum {
-    kSampleRate = 90000  // RTP timestamps per second.
-  };
-
-  class ProtectionCallback : public VCMProtectionCallback {
-   public:
-    int ProtectionRequest(const FecProtectionParams* delta_params,
-                          const FecProtectionParams* key_params,
-                          uint32_t* sent_video_rate_bps,
-                          uint32_t* sent_nack_rate_bps,
-                          uint32_t* sent_fec_rate_bps) override {
-      *sent_video_rate_bps = kCodecBitrateBps;
-      *sent_nack_rate_bps = nack_rate_bps_;
-      *sent_fec_rate_bps = fec_rate_bps_;
-      return 0;
-    }
-
-    uint32_t fec_rate_bps_ = 0;
-    uint32_t nack_rate_bps_ = 0;
-  };
-
-  // Note: simulated clock starts at 1 seconds, since parts of webrtc use 0 as
-  // a special case (e.g. frame rate in media optimization).
-  ProtectionBitrateCalculatorTest()
-      : clock_(1000), media_opt_(&clock_, &protection_callback_) {}
-
-  SimulatedClock clock_;
-  ProtectionCallback protection_callback_;
-  ProtectionBitrateCalculator media_opt_;
-};
-
-TEST_F(ProtectionBitrateCalculatorTest, ProtectsUsingFecBitrate) {
-  static const uint32_t kMaxBitrateBps = 130000;
-
-  media_opt_.SetProtectionMethod(true /*enable_fec*/, false /* enable_nack */);
-  media_opt_.SetEncodingData(640, 480, 1, 1000);
-
-  // Using 10% of codec bitrate for FEC.
-  protection_callback_.fec_rate_bps_ = kCodecBitrateBps / 10;
-  uint32_t target_bitrate = media_opt_.SetTargetRates(kMaxBitrateBps, 30, 0, 0);
-
-  EXPECT_GT(target_bitrate, 0u);
-  EXPECT_GT(kMaxBitrateBps, target_bitrate);
-
-  // Using as much for codec bitrate as fec rate, new target rate should share
-  // both equally, but only be half of max (since that ceiling should be hit).
-  protection_callback_.fec_rate_bps_ = kCodecBitrateBps;
-  target_bitrate = media_opt_.SetTargetRates(kMaxBitrateBps, 30, 128, 100);
-  EXPECT_EQ(kMaxBitrateBps / 2, target_bitrate);
-}
-
-TEST_F(ProtectionBitrateCalculatorTest, ProtectsUsingNackBitrate) {
-  static const uint32_t kMaxBitrateBps = 130000;
-
-  media_opt_.SetProtectionMethod(false /*enable_fec*/, true /* enable_nack */);
-  media_opt_.SetEncodingData(640, 480, 1, 1000);
-
-  uint32_t target_bitrate = media_opt_.SetTargetRates(kMaxBitrateBps, 30, 0, 0);
-
-  EXPECT_EQ(kMaxBitrateBps, target_bitrate);
-
-  // Using as much for codec bitrate as nack rate, new target rate should share
-  // both equally, but only be half of max (since that ceiling should be hit).
-  protection_callback_.nack_rate_bps_ = kMaxBitrateBps;
-  target_bitrate = media_opt_.SetTargetRates(kMaxBitrateBps, 30, 128, 100);
-  EXPECT_EQ(kMaxBitrateBps / 2, target_bitrate);
-}
-
-TEST_F(ProtectionBitrateCalculatorTest, NoProtection) {
-  static const uint32_t kMaxBitrateBps = 130000;
-
-  media_opt_.SetProtectionMethod(false /*enable_fec*/, false /* enable_nack */);
-  media_opt_.SetEncodingData(640, 480, 1, 1000);
-
-  uint32_t target_bitrate =
-      media_opt_.SetTargetRates(kMaxBitrateBps, 30, 128, 100);
-  EXPECT_EQ(kMaxBitrateBps, target_bitrate);
-}
-
-}  // namespace webrtc
diff --git a/modules/video_coding/qp_parser.cc b/modules/video_coding/qp_parser.cc
deleted file mode 100644
index 26b46f1..0000000
--- a/modules/video_coding/qp_parser.cc
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- *  Copyright (c) 2015 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/video_coding/qp_parser.h"
-
-#include "webrtc/common_types.h"
-#include "webrtc/modules/video_coding/utility/vp8_header_parser.h"
-#include "webrtc/modules/video_coding/utility/vp9_uncompressed_header_parser.h"
-
-namespace webrtc {
-
-bool QpParser::GetQp(const VCMEncodedFrame& frame, int* qp) {
-  switch (frame.CodecSpecific()->codecType) {
-    case kVideoCodecVP8:
-      // QP range: [0, 127].
-      return vp8::GetQp(frame.Buffer(), frame.Length(), qp);
-    case kVideoCodecVP9:
-      // QP range: [0, 255].
-      return vp9::GetQp(frame.Buffer(), frame.Length(), qp);
-    default:
-      return false;
-  }
-}
-
-}  // namespace webrtc
diff --git a/modules/video_coding/qp_parser.h b/modules/video_coding/qp_parser.h
deleted file mode 100644
index c41bf57..0000000
--- a/modules/video_coding/qp_parser.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- *  Copyright (c) 2015 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_VIDEO_CODING_QP_PARSER_H_
-#define WEBRTC_MODULES_VIDEO_CODING_QP_PARSER_H_
-
-#include "webrtc/modules/video_coding/encoded_frame.h"
-
-namespace webrtc {
-
-class QpParser {
- public:
-  QpParser() {}
-  ~QpParser() {}
-
-  // Parses an encoded |frame| and extracts the |qp|.
-  // Returns true on success, false otherwise.
-  bool GetQp(const VCMEncodedFrame& frame, int* qp);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_VIDEO_CODING_QP_PARSER_H_
diff --git a/modules/video_coding/receiver.cc b/modules/video_coding/receiver.cc
deleted file mode 100644
index 0c559e0..0000000
--- a/modules/video_coding/receiver.cc
+++ /dev/null
@@ -1,289 +0,0 @@
-/*
- *  Copyright (c) 2012 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/video_coding/receiver.h"
-
-#include <assert.h>
-
-#include <cstdlib>
-#include <utility>
-#include <vector>
-
-#include "webrtc/modules/video_coding/encoded_frame.h"
-#include "webrtc/modules/video_coding/internal_defines.h"
-#include "webrtc/modules/video_coding/media_opt_util.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/trace_event.h"
-#include "webrtc/system_wrappers/include/clock.h"
-
-namespace webrtc {
-
-enum { kMaxReceiverDelayMs = 10000 };
-
-VCMReceiver::VCMReceiver(VCMTiming* timing,
-                         Clock* clock,
-                         EventFactory* event_factory)
-    : VCMReceiver::VCMReceiver(timing,
-                               clock,
-                               event_factory,
-                               nullptr,  // NackSender
-                               nullptr)  // KeyframeRequestSender
-{}
-
-VCMReceiver::VCMReceiver(VCMTiming* timing,
-                         Clock* clock,
-                         EventFactory* event_factory,
-                         NackSender* nack_sender,
-                         KeyFrameRequestSender* keyframe_request_sender)
-    : VCMReceiver(
-          timing,
-          clock,
-          std::unique_ptr<EventWrapper>(event_factory
-                                            ? event_factory->CreateEvent()
-                                            : EventWrapper::Create()),
-          std::unique_ptr<EventWrapper>(event_factory
-                                            ? event_factory->CreateEvent()
-                                            : EventWrapper::Create()),
-          nack_sender,
-          keyframe_request_sender) {}
-
-VCMReceiver::VCMReceiver(VCMTiming* timing,
-                         Clock* clock,
-                         std::unique_ptr<EventWrapper> receiver_event,
-                         std::unique_ptr<EventWrapper> jitter_buffer_event)
-    : VCMReceiver::VCMReceiver(timing,
-                               clock,
-                               std::move(receiver_event),
-                               std::move(jitter_buffer_event),
-                               nullptr,  // NackSender
-                               nullptr)  // KeyframeRequestSender
-{}
-
-VCMReceiver::VCMReceiver(VCMTiming* timing,
-                         Clock* clock,
-                         std::unique_ptr<EventWrapper> receiver_event,
-                         std::unique_ptr<EventWrapper> jitter_buffer_event,
-                         NackSender* nack_sender,
-                         KeyFrameRequestSender* keyframe_request_sender)
-    : clock_(clock),
-      jitter_buffer_(clock_,
-                     std::move(jitter_buffer_event),
-                     nack_sender,
-                     keyframe_request_sender),
-      timing_(timing),
-      render_wait_event_(std::move(receiver_event)),
-      max_video_delay_ms_(kMaxVideoDelayMs) {
-  Reset();
-}
-
-VCMReceiver::~VCMReceiver() {
-  render_wait_event_->Set();
-}
-
-void VCMReceiver::Reset() {
-  rtc::CritScope cs(&crit_sect_);
-  if (!jitter_buffer_.Running()) {
-    jitter_buffer_.Start();
-  } else {
-    jitter_buffer_.Flush();
-  }
-}
-
-void VCMReceiver::UpdateRtt(int64_t rtt) {
-  jitter_buffer_.UpdateRtt(rtt);
-}
-
-int32_t VCMReceiver::InsertPacket(const VCMPacket& packet) {
-  // Insert the packet into the jitter buffer. The packet can either be empty or
-  // contain media at this point.
-  bool retransmitted = false;
-  const VCMFrameBufferEnum ret =
-      jitter_buffer_.InsertPacket(packet, &retransmitted);
-  if (ret == kOldPacket) {
-    return VCM_OK;
-  } else if (ret == kFlushIndicator) {
-    return VCM_FLUSH_INDICATOR;
-  } else if (ret < 0) {
-    return VCM_JITTER_BUFFER_ERROR;
-  }
-  if (ret == kCompleteSession && !retransmitted) {
-    // We don't want to include timestamps which have suffered from
-    // retransmission here, since we compensate with extra retransmission
-    // delay within the jitter estimate.
-    timing_->IncomingTimestamp(packet.timestamp, clock_->TimeInMilliseconds());
-  }
-  return VCM_OK;
-}
-
-void VCMReceiver::TriggerDecoderShutdown() {
-  jitter_buffer_.Stop();
-  render_wait_event_->Set();
-}
-
-VCMEncodedFrame* VCMReceiver::FrameForDecoding(uint16_t max_wait_time_ms,
-                                               bool prefer_late_decoding) {
-  const int64_t start_time_ms = clock_->TimeInMilliseconds();
-  uint32_t frame_timestamp = 0;
-  int min_playout_delay_ms = -1;
-  int max_playout_delay_ms = -1;
-  int64_t render_time_ms = 0;
-  // Exhaust wait time to get a complete frame for decoding.
-  VCMEncodedFrame* found_frame =
-      jitter_buffer_.NextCompleteFrame(max_wait_time_ms);
-
-  if (found_frame) {
-    frame_timestamp = found_frame->TimeStamp();
-    min_playout_delay_ms = found_frame->EncodedImage().playout_delay_.min_ms;
-    max_playout_delay_ms = found_frame->EncodedImage().playout_delay_.max_ms;
-  } else {
-    if (!jitter_buffer_.NextMaybeIncompleteTimestamp(&frame_timestamp))
-      return nullptr;
-  }
-
-  if (min_playout_delay_ms >= 0)
-    timing_->set_min_playout_delay(min_playout_delay_ms);
-
-  if (max_playout_delay_ms >= 0)
-    timing_->set_max_playout_delay(max_playout_delay_ms);
-
-  // We have a frame - Set timing and render timestamp.
-  timing_->SetJitterDelay(jitter_buffer_.EstimatedJitterMs());
-  const int64_t now_ms = clock_->TimeInMilliseconds();
-  timing_->UpdateCurrentDelay(frame_timestamp);
-  render_time_ms = timing_->RenderTimeMs(frame_timestamp, now_ms);
-  // Check render timing.
-  bool timing_error = false;
-  // Assume that render timing errors are due to changes in the video stream.
-  if (render_time_ms < 0) {
-    timing_error = true;
-  } else if (std::abs(render_time_ms - now_ms) > max_video_delay_ms_) {
-    int frame_delay = static_cast<int>(std::abs(render_time_ms - now_ms));
-    LOG(LS_WARNING) << "A frame about to be decoded is out of the configured "
-                    << "delay bounds (" << frame_delay << " > "
-                    << max_video_delay_ms_
-                    << "). Resetting the video jitter buffer.";
-    timing_error = true;
-  } else if (static_cast<int>(timing_->TargetVideoDelay()) >
-             max_video_delay_ms_) {
-    LOG(LS_WARNING) << "The video target delay has grown larger than "
-                    << max_video_delay_ms_ << " ms. Resetting jitter buffer.";
-    timing_error = true;
-  }
-
-  if (timing_error) {
-    // Timing error => reset timing and flush the jitter buffer.
-    jitter_buffer_.Flush();
-    timing_->Reset();
-    return NULL;
-  }
-
-  if (prefer_late_decoding) {
-    // Decode frame as close as possible to the render timestamp.
-    const int32_t available_wait_time =
-        max_wait_time_ms -
-        static_cast<int32_t>(clock_->TimeInMilliseconds() - start_time_ms);
-    uint16_t new_max_wait_time =
-        static_cast<uint16_t>(VCM_MAX(available_wait_time, 0));
-    uint32_t wait_time_ms =
-        timing_->MaxWaitingTime(render_time_ms, clock_->TimeInMilliseconds());
-    if (new_max_wait_time < wait_time_ms) {
-      // We're not allowed to wait until the frame is supposed to be rendered,
-      // waiting as long as we're allowed to avoid busy looping, and then return
-      // NULL. Next call to this function might return the frame.
-      render_wait_event_->Wait(new_max_wait_time);
-      return NULL;
-    }
-    // Wait until it's time to render.
-    render_wait_event_->Wait(wait_time_ms);
-  }
-
-  // Extract the frame from the jitter buffer and set the render time.
-  VCMEncodedFrame* frame = jitter_buffer_.ExtractAndSetDecode(frame_timestamp);
-  if (frame == NULL) {
-    return NULL;
-  }
-  frame->SetRenderTime(render_time_ms);
-  TRACE_EVENT_ASYNC_STEP1("webrtc", "Video", frame->TimeStamp(), "SetRenderTS",
-                          "render_time", frame->RenderTimeMs());
-  if (!frame->Complete()) {
-    // Update stats for incomplete frames.
-    bool retransmitted = false;
-    const int64_t last_packet_time_ms =
-        jitter_buffer_.LastPacketTime(frame, &retransmitted);
-    if (last_packet_time_ms >= 0 && !retransmitted) {
-      // We don't want to include timestamps which have suffered from
-      // retransmission here, since we compensate with extra retransmission
-      // delay within the jitter estimate.
-      timing_->IncomingTimestamp(frame_timestamp, last_packet_time_ms);
-    }
-  }
-  return frame;
-}
-
-void VCMReceiver::ReleaseFrame(VCMEncodedFrame* frame) {
-  jitter_buffer_.ReleaseFrame(frame);
-}
-
-void VCMReceiver::ReceiveStatistics(uint32_t* bitrate, uint32_t* framerate) {
-  assert(bitrate);
-  assert(framerate);
-  jitter_buffer_.IncomingRateStatistics(framerate, bitrate);
-}
-
-void VCMReceiver::SetNackMode(VCMNackMode nackMode,
-                              int64_t low_rtt_nack_threshold_ms,
-                              int64_t high_rtt_nack_threshold_ms) {
-  rtc::CritScope cs(&crit_sect_);
-  // Default to always having NACK enabled in hybrid mode.
-  jitter_buffer_.SetNackMode(nackMode, low_rtt_nack_threshold_ms,
-                             high_rtt_nack_threshold_ms);
-}
-
-void VCMReceiver::SetNackSettings(size_t max_nack_list_size,
-                                  int max_packet_age_to_nack,
-                                  int max_incomplete_time_ms) {
-  jitter_buffer_.SetNackSettings(max_nack_list_size, max_packet_age_to_nack,
-                                 max_incomplete_time_ms);
-}
-
-VCMNackMode VCMReceiver::NackMode() const {
-  rtc::CritScope cs(&crit_sect_);
-  return jitter_buffer_.nack_mode();
-}
-
-std::vector<uint16_t> VCMReceiver::NackList(bool* request_key_frame) {
-  return jitter_buffer_.GetNackList(request_key_frame);
-}
-
-void VCMReceiver::SetDecodeErrorMode(VCMDecodeErrorMode decode_error_mode) {
-  jitter_buffer_.SetDecodeErrorMode(decode_error_mode);
-}
-
-VCMDecodeErrorMode VCMReceiver::DecodeErrorMode() const {
-  return jitter_buffer_.decode_error_mode();
-}
-
-int VCMReceiver::SetMinReceiverDelay(int desired_delay_ms) {
-  rtc::CritScope cs(&crit_sect_);
-  if (desired_delay_ms < 0 || desired_delay_ms > kMaxReceiverDelayMs) {
-    return -1;
-  }
-  max_video_delay_ms_ = desired_delay_ms + kMaxVideoDelayMs;
-  // Initializing timing to the desired delay.
-  timing_->set_min_playout_delay(desired_delay_ms);
-  return 0;
-}
-
-void VCMReceiver::RegisterStatsCallback(
-    VCMReceiveStatisticsCallback* callback) {
-  jitter_buffer_.RegisterStatsCallback(callback);
-}
-
-}  // namespace webrtc
diff --git a/modules/video_coding/receiver.h b/modules/video_coding/receiver.h
deleted file mode 100644
index 4ef253f..0000000
--- a/modules/video_coding/receiver.h
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- *  Copyright (c) 2011 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_VIDEO_CODING_RECEIVER_H_
-#define WEBRTC_MODULES_VIDEO_CODING_RECEIVER_H_
-
-#include <memory>
-#include <vector>
-
-#include "webrtc/modules/video_coding/include/video_coding.h"
-#include "webrtc/modules/video_coding/include/video_coding_defines.h"
-#include "webrtc/modules/video_coding/jitter_buffer.h"
-#include "webrtc/modules/video_coding/packet.h"
-#include "webrtc/modules/video_coding/timing.h"
-#include "webrtc/rtc_base/criticalsection.h"
-
-namespace webrtc {
-
-class Clock;
-class VCMEncodedFrame;
-
-class VCMReceiver {
- public:
-  // Constructor for current interface, will be removed when the
-  // new jitter buffer is in place.
-  VCMReceiver(VCMTiming* timing, Clock* clock, EventFactory* event_factory);
-
-  // Create method for the new jitter buffer.
-  VCMReceiver(VCMTiming* timing,
-              Clock* clock,
-              EventFactory* event_factory,
-              NackSender* nack_sender,
-              KeyFrameRequestSender* keyframe_request_sender);
-
-  // Using this constructor, you can specify a different event factory for the
-  // jitter buffer. Useful for unit tests when you want to simulate incoming
-  // packets, in which case the jitter buffer's wait event is different from
-  // that of VCMReceiver itself.
-  //
-  // Constructor for current interface, will be removed when the
-  // new jitter buffer is in place.
-  VCMReceiver(VCMTiming* timing,
-              Clock* clock,
-              std::unique_ptr<EventWrapper> receiver_event,
-              std::unique_ptr<EventWrapper> jitter_buffer_event);
-
-  // Create method for the new jitter buffer.
-  VCMReceiver(VCMTiming* timing,
-              Clock* clock,
-              std::unique_ptr<EventWrapper> receiver_event,
-              std::unique_ptr<EventWrapper> jitter_buffer_event,
-              NackSender* nack_sender,
-              KeyFrameRequestSender* keyframe_request_sender);
-
-  ~VCMReceiver();
-
-  void Reset();
-  void UpdateRtt(int64_t rtt);
-  int32_t InsertPacket(const VCMPacket& packet);
-  VCMEncodedFrame* FrameForDecoding(uint16_t max_wait_time_ms,
-                                    bool prefer_late_decoding);
-  void ReleaseFrame(VCMEncodedFrame* frame);
-  void ReceiveStatistics(uint32_t* bitrate, uint32_t* framerate);
-
-  // NACK.
-  void SetNackMode(VCMNackMode nackMode,
-                   int64_t low_rtt_nack_threshold_ms,
-                   int64_t high_rtt_nack_threshold_ms);
-  void SetNackSettings(size_t max_nack_list_size,
-                       int max_packet_age_to_nack,
-                       int max_incomplete_time_ms);
-  VCMNackMode NackMode() const;
-  std::vector<uint16_t> NackList(bool* request_key_frame);
-
-  // Receiver video delay.
-  int SetMinReceiverDelay(int desired_delay_ms);
-
-  // Decoding with errors.
-  void SetDecodeErrorMode(VCMDecodeErrorMode decode_error_mode);
-  VCMDecodeErrorMode DecodeErrorMode() const;
-
-  void RegisterStatsCallback(VCMReceiveStatisticsCallback* callback);
-
-  void TriggerDecoderShutdown();
-
- private:
-  rtc::CriticalSection crit_sect_;
-  Clock* const clock_;
-  VCMJitterBuffer jitter_buffer_;
-  VCMTiming* timing_;
-  std::unique_ptr<EventWrapper> render_wait_event_;
-  int max_video_delay_ms_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_VIDEO_CODING_RECEIVER_H_
diff --git a/modules/video_coding/receiver_unittest.cc b/modules/video_coding/receiver_unittest.cc
deleted file mode 100644
index 83fdff2..0000000
--- a/modules/video_coding/receiver_unittest.cc
+++ /dev/null
@@ -1,507 +0,0 @@
-/*  Copyright (c) 2013 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 <string.h>
-
-#include <list>
-#include <memory>
-#include <queue>
-#include <vector>
-
-#include "webrtc/modules/video_coding/encoded_frame.h"
-#include "webrtc/modules/video_coding/packet.h"
-#include "webrtc/modules/video_coding/receiver.h"
-#include "webrtc/modules/video_coding/test/stream_generator.h"
-#include "webrtc/modules/video_coding/test/test_util.h"
-#include "webrtc/modules/video_coding/timing.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/system_wrappers/include/clock.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-class TestVCMReceiver : public ::testing::Test {
- protected:
-  TestVCMReceiver()
-      : clock_(new SimulatedClock(0)),
-        timing_(clock_.get()),
-        receiver_(&timing_, clock_.get(), &event_factory_) {
-    stream_generator_.reset(
-        new StreamGenerator(0, clock_->TimeInMilliseconds()));
-  }
-
-  virtual void SetUp() { receiver_.Reset(); }
-
-  int32_t InsertPacket(int index) {
-    VCMPacket packet;
-    bool packet_available = stream_generator_->GetPacket(&packet, index);
-    EXPECT_TRUE(packet_available);
-    if (!packet_available)
-      return kGeneralError;  // Return here to avoid crashes below.
-    return receiver_.InsertPacket(packet);
-  }
-
-  int32_t InsertPacketAndPop(int index) {
-    VCMPacket packet;
-    bool packet_available = stream_generator_->PopPacket(&packet, index);
-    EXPECT_TRUE(packet_available);
-    if (!packet_available)
-      return kGeneralError;  // Return here to avoid crashes below.
-    return receiver_.InsertPacket(packet);
-  }
-
-  int32_t InsertFrame(FrameType frame_type, bool complete) {
-    int num_of_packets = complete ? 1 : 2;
-    stream_generator_->GenerateFrame(
-        frame_type, (frame_type != kEmptyFrame) ? num_of_packets : 0,
-        (frame_type == kEmptyFrame) ? 1 : 0, clock_->TimeInMilliseconds());
-    int32_t ret = InsertPacketAndPop(0);
-    if (!complete) {
-      // Drop the second packet.
-      VCMPacket packet;
-      stream_generator_->PopPacket(&packet, 0);
-    }
-    clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
-    return ret;
-  }
-
-  bool DecodeNextFrame() {
-    VCMEncodedFrame* frame = receiver_.FrameForDecoding(0, false);
-    if (!frame)
-      return false;
-    receiver_.ReleaseFrame(frame);
-    return true;
-  }
-
-  std::unique_ptr<SimulatedClock> clock_;
-  VCMTiming timing_;
-  NullEventFactory event_factory_;
-  VCMReceiver receiver_;
-  std::unique_ptr<StreamGenerator> stream_generator_;
-};
-
-TEST_F(TestVCMReceiver, NonDecodableDuration_Empty) {
-  // Enable NACK and with no RTT thresholds for disabling retransmission delay.
-  receiver_.SetNackMode(kNack, -1, -1);
-  const size_t kMaxNackListSize = 1000;
-  const int kMaxPacketAgeToNack = 1000;
-  const int kMaxNonDecodableDuration = 500;
-  const int kMinDelayMs = 500;
-  receiver_.SetNackSettings(kMaxNackListSize, kMaxPacketAgeToNack,
-                            kMaxNonDecodableDuration);
-  EXPECT_GE(InsertFrame(kVideoFrameKey, true), kNoError);
-  // Advance time until it's time to decode the key frame.
-  clock_->AdvanceTimeMilliseconds(kMinDelayMs);
-  EXPECT_TRUE(DecodeNextFrame());
-  bool request_key_frame = false;
-  std::vector<uint16_t> nack_list = receiver_.NackList(&request_key_frame);
-  EXPECT_FALSE(request_key_frame);
-}
-
-TEST_F(TestVCMReceiver, NonDecodableDuration_NoKeyFrame) {
-  // Enable NACK and with no RTT thresholds for disabling retransmission delay.
-  receiver_.SetNackMode(kNack, -1, -1);
-  const size_t kMaxNackListSize = 1000;
-  const int kMaxPacketAgeToNack = 1000;
-  const int kMaxNonDecodableDuration = 500;
-  receiver_.SetNackSettings(kMaxNackListSize, kMaxPacketAgeToNack,
-                            kMaxNonDecodableDuration);
-  const int kNumFrames = kDefaultFrameRate * kMaxNonDecodableDuration / 1000;
-  for (int i = 0; i < kNumFrames; ++i) {
-    EXPECT_GE(InsertFrame(kVideoFrameDelta, true), kNoError);
-  }
-  bool request_key_frame = false;
-  std::vector<uint16_t> nack_list = receiver_.NackList(&request_key_frame);
-  EXPECT_TRUE(request_key_frame);
-}
-
-TEST_F(TestVCMReceiver, NonDecodableDuration_OneIncomplete) {
-  // Enable NACK and with no RTT thresholds for disabling retransmission delay.
-  receiver_.SetNackMode(kNack, -1, -1);
-  const size_t kMaxNackListSize = 1000;
-  const int kMaxPacketAgeToNack = 1000;
-  const int kMaxNonDecodableDuration = 500;
-  const int kMaxNonDecodableDurationFrames =
-      (kDefaultFrameRate * kMaxNonDecodableDuration + 500) / 1000;
-  const int kMinDelayMs = 500;
-  receiver_.SetNackSettings(kMaxNackListSize, kMaxPacketAgeToNack,
-                            kMaxNonDecodableDuration);
-  receiver_.SetMinReceiverDelay(kMinDelayMs);
-  int64_t key_frame_inserted = clock_->TimeInMilliseconds();
-  EXPECT_GE(InsertFrame(kVideoFrameKey, true), kNoError);
-  // Insert an incomplete frame.
-  EXPECT_GE(InsertFrame(kVideoFrameDelta, false), kNoError);
-  // Insert enough frames to have too long non-decodable sequence.
-  for (int i = 0; i < kMaxNonDecodableDurationFrames; ++i) {
-    EXPECT_GE(InsertFrame(kVideoFrameDelta, true), kNoError);
-  }
-  // Advance time until it's time to decode the key frame.
-  clock_->AdvanceTimeMilliseconds(kMinDelayMs - clock_->TimeInMilliseconds() -
-                                  key_frame_inserted);
-  EXPECT_TRUE(DecodeNextFrame());
-  // Make sure we get a key frame request.
-  bool request_key_frame = false;
-  std::vector<uint16_t> nack_list = receiver_.NackList(&request_key_frame);
-  EXPECT_TRUE(request_key_frame);
-}
-
-TEST_F(TestVCMReceiver, NonDecodableDuration_NoTrigger) {
-  // Enable NACK and with no RTT thresholds for disabling retransmission delay.
-  receiver_.SetNackMode(kNack, -1, -1);
-  const size_t kMaxNackListSize = 1000;
-  const int kMaxPacketAgeToNack = 1000;
-  const int kMaxNonDecodableDuration = 500;
-  const int kMaxNonDecodableDurationFrames =
-      (kDefaultFrameRate * kMaxNonDecodableDuration + 500) / 1000;
-  const int kMinDelayMs = 500;
-  receiver_.SetNackSettings(kMaxNackListSize, kMaxPacketAgeToNack,
-                            kMaxNonDecodableDuration);
-  receiver_.SetMinReceiverDelay(kMinDelayMs);
-  int64_t key_frame_inserted = clock_->TimeInMilliseconds();
-  EXPECT_GE(InsertFrame(kVideoFrameKey, true), kNoError);
-  // Insert an incomplete frame.
-  EXPECT_GE(InsertFrame(kVideoFrameDelta, false), kNoError);
-  // Insert all but one frame to not trigger a key frame request due to
-  // too long duration of non-decodable frames.
-  for (int i = 0; i < kMaxNonDecodableDurationFrames - 1; ++i) {
-    EXPECT_GE(InsertFrame(kVideoFrameDelta, true), kNoError);
-  }
-  // Advance time until it's time to decode the key frame.
-  clock_->AdvanceTimeMilliseconds(kMinDelayMs - clock_->TimeInMilliseconds() -
-                                  key_frame_inserted);
-  EXPECT_TRUE(DecodeNextFrame());
-  // Make sure we don't get a key frame request since we haven't generated
-  // enough frames.
-  bool request_key_frame = false;
-  std::vector<uint16_t> nack_list = receiver_.NackList(&request_key_frame);
-  EXPECT_FALSE(request_key_frame);
-}
-
-TEST_F(TestVCMReceiver, NonDecodableDuration_NoTrigger2) {
-  // Enable NACK and with no RTT thresholds for disabling retransmission delay.
-  receiver_.SetNackMode(kNack, -1, -1);
-  const size_t kMaxNackListSize = 1000;
-  const int kMaxPacketAgeToNack = 1000;
-  const int kMaxNonDecodableDuration = 500;
-  const int kMaxNonDecodableDurationFrames =
-      (kDefaultFrameRate * kMaxNonDecodableDuration + 500) / 1000;
-  const int kMinDelayMs = 500;
-  receiver_.SetNackSettings(kMaxNackListSize, kMaxPacketAgeToNack,
-                            kMaxNonDecodableDuration);
-  receiver_.SetMinReceiverDelay(kMinDelayMs);
-  int64_t key_frame_inserted = clock_->TimeInMilliseconds();
-  EXPECT_GE(InsertFrame(kVideoFrameKey, true), kNoError);
-  // Insert enough frames to have too long non-decodable sequence, except that
-  // we don't have any losses.
-  for (int i = 0; i < kMaxNonDecodableDurationFrames; ++i) {
-    EXPECT_GE(InsertFrame(kVideoFrameDelta, true), kNoError);
-  }
-  // Insert an incomplete frame.
-  EXPECT_GE(InsertFrame(kVideoFrameDelta, false), kNoError);
-  // Advance time until it's time to decode the key frame.
-  clock_->AdvanceTimeMilliseconds(kMinDelayMs - clock_->TimeInMilliseconds() -
-                                  key_frame_inserted);
-  EXPECT_TRUE(DecodeNextFrame());
-  // Make sure we don't get a key frame request since the non-decodable duration
-  // is only one frame.
-  bool request_key_frame = false;
-  std::vector<uint16_t> nack_list = receiver_.NackList(&request_key_frame);
-  EXPECT_FALSE(request_key_frame);
-}
-
-TEST_F(TestVCMReceiver, NonDecodableDuration_KeyFrameAfterIncompleteFrames) {
-  // Enable NACK and with no RTT thresholds for disabling retransmission delay.
-  receiver_.SetNackMode(kNack, -1, -1);
-  const size_t kMaxNackListSize = 1000;
-  const int kMaxPacketAgeToNack = 1000;
-  const int kMaxNonDecodableDuration = 500;
-  const int kMaxNonDecodableDurationFrames =
-      (kDefaultFrameRate * kMaxNonDecodableDuration + 500) / 1000;
-  const int kMinDelayMs = 500;
-  receiver_.SetNackSettings(kMaxNackListSize, kMaxPacketAgeToNack,
-                            kMaxNonDecodableDuration);
-  receiver_.SetMinReceiverDelay(kMinDelayMs);
-  int64_t key_frame_inserted = clock_->TimeInMilliseconds();
-  EXPECT_GE(InsertFrame(kVideoFrameKey, true), kNoError);
-  // Insert an incomplete frame.
-  EXPECT_GE(InsertFrame(kVideoFrameDelta, false), kNoError);
-  // Insert enough frames to have too long non-decodable sequence.
-  for (int i = 0; i < kMaxNonDecodableDurationFrames; ++i) {
-    EXPECT_GE(InsertFrame(kVideoFrameDelta, true), kNoError);
-  }
-  EXPECT_GE(InsertFrame(kVideoFrameKey, true), kNoError);
-  // Advance time until it's time to decode the key frame.
-  clock_->AdvanceTimeMilliseconds(kMinDelayMs - clock_->TimeInMilliseconds() -
-                                  key_frame_inserted);
-  EXPECT_TRUE(DecodeNextFrame());
-  // Make sure we don't get a key frame request since we have a key frame
-  // in the list.
-  bool request_key_frame = false;
-  std::vector<uint16_t> nack_list = receiver_.NackList(&request_key_frame);
-  EXPECT_FALSE(request_key_frame);
-}
-
-// A simulated clock, when time elapses, will insert frames into the jitter
-// buffer, based on initial settings.
-class SimulatedClockWithFrames : public SimulatedClock {
- public:
-  SimulatedClockWithFrames(StreamGenerator* stream_generator,
-                           VCMReceiver* receiver)
-      : SimulatedClock(0),
-        stream_generator_(stream_generator),
-        receiver_(receiver) {}
-  virtual ~SimulatedClockWithFrames() {}
-
-  // If |stop_on_frame| is true and next frame arrives between now and
-  // now+|milliseconds|, the clock will be advanced to the arrival time of next
-  // frame.
-  // Otherwise, the clock will be advanced by |milliseconds|.
-  //
-  // For both cases, a frame will be inserted into the jitter buffer at the
-  // instant when the clock time is timestamps_.front().arrive_time.
-  //
-  // Return true if some frame arrives between now and now+|milliseconds|.
-  bool AdvanceTimeMilliseconds(int64_t milliseconds, bool stop_on_frame) {
-    return AdvanceTimeMicroseconds(milliseconds * 1000, stop_on_frame);
-  }
-
-  bool AdvanceTimeMicroseconds(int64_t microseconds, bool stop_on_frame) {
-    int64_t start_time = TimeInMicroseconds();
-    int64_t end_time = start_time + microseconds;
-    bool frame_injected = false;
-    while (!timestamps_.empty() &&
-           timestamps_.front().arrive_time <= end_time) {
-      RTC_DCHECK(timestamps_.front().arrive_time >= start_time);
-
-      SimulatedClock::AdvanceTimeMicroseconds(timestamps_.front().arrive_time -
-                                              TimeInMicroseconds());
-      GenerateAndInsertFrame((timestamps_.front().render_time + 500) / 1000);
-      timestamps_.pop();
-      frame_injected = true;
-
-      if (stop_on_frame)
-        return frame_injected;
-    }
-
-    if (TimeInMicroseconds() < end_time) {
-      SimulatedClock::AdvanceTimeMicroseconds(end_time - TimeInMicroseconds());
-    }
-    return frame_injected;
-  }
-
-  // Input timestamps are in unit Milliseconds.
-  // And |arrive_timestamps| must be positive and in increasing order.
-  // |arrive_timestamps| determine when we are going to insert frames into the
-  // jitter buffer.
-  // |render_timestamps| are the timestamps on the frame.
-  void SetFrames(const int64_t* arrive_timestamps,
-                 const int64_t* render_timestamps,
-                 size_t size) {
-    int64_t previous_arrive_timestamp = 0;
-    for (size_t i = 0; i < size; i++) {
-      RTC_CHECK(arrive_timestamps[i] >= previous_arrive_timestamp);
-      timestamps_.push(TimestampPair(arrive_timestamps[i] * 1000,
-                                     render_timestamps[i] * 1000));
-      previous_arrive_timestamp = arrive_timestamps[i];
-    }
-  }
-
- private:
-  struct TimestampPair {
-    TimestampPair(int64_t arrive_timestamp, int64_t render_timestamp)
-        : arrive_time(arrive_timestamp), render_time(render_timestamp) {}
-
-    int64_t arrive_time;
-    int64_t render_time;
-  };
-
-  void GenerateAndInsertFrame(int64_t render_timestamp_ms) {
-    VCMPacket packet;
-    stream_generator_->GenerateFrame(FrameType::kVideoFrameKey,
-                                     1,  // media packets
-                                     0,  // empty packets
-                                     render_timestamp_ms);
-
-    bool packet_available = stream_generator_->PopPacket(&packet, 0);
-    EXPECT_TRUE(packet_available);
-    if (!packet_available)
-      return;  // Return here to avoid crashes below.
-    receiver_->InsertPacket(packet);
-  }
-
-  std::queue<TimestampPair> timestamps_;
-  StreamGenerator* stream_generator_;
-  VCMReceiver* receiver_;
-};
-
-// Use a SimulatedClockWithFrames
-// Wait call will do either of these:
-// 1. If |stop_on_frame| is true, the clock will be turned to the exact instant
-// that the first frame comes and the frame will be inserted into the jitter
-// buffer, or the clock will be turned to now + |max_time| if no frame comes in
-// the window.
-// 2. If |stop_on_frame| is false, the clock will be turn to now + |max_time|,
-// and all the frames arriving between now and now + |max_time| will be
-// inserted into the jitter buffer.
-//
-// This is used to simulate the JitterBuffer getting packets from internet as
-// time elapses.
-
-class FrameInjectEvent : public EventWrapper {
- public:
-  FrameInjectEvent(SimulatedClockWithFrames* clock, bool stop_on_frame)
-      : clock_(clock), stop_on_frame_(stop_on_frame) {}
-
-  bool Set() override { return true; }
-
-  EventTypeWrapper Wait(unsigned long max_time) override {  // NOLINT
-    if (clock_->AdvanceTimeMilliseconds(max_time, stop_on_frame_) &&
-        stop_on_frame_) {
-      return EventTypeWrapper::kEventSignaled;
-    } else {
-      return EventTypeWrapper::kEventTimeout;
-    }
-  }
-
- private:
-  SimulatedClockWithFrames* clock_;
-  bool stop_on_frame_;
-};
-
-class VCMReceiverTimingTest : public ::testing::Test {
- protected:
-  VCMReceiverTimingTest()
-
-      : clock_(&stream_generator_, &receiver_),
-        stream_generator_(0, clock_.TimeInMilliseconds()),
-        timing_(&clock_),
-        receiver_(
-            &timing_,
-            &clock_,
-            std::unique_ptr<EventWrapper>(new FrameInjectEvent(&clock_, false)),
-            std::unique_ptr<EventWrapper>(
-                new FrameInjectEvent(&clock_, true))) {}
-
-  virtual void SetUp() { receiver_.Reset(); }
-
-  SimulatedClockWithFrames clock_;
-  StreamGenerator stream_generator_;
-  VCMTiming timing_;
-  VCMReceiver receiver_;
-};
-
-// Test whether VCMReceiver::FrameForDecoding handles parameter
-// |max_wait_time_ms| correctly:
-// 1. The function execution should never take more than |max_wait_time_ms|.
-// 2. If the function exit before now + |max_wait_time_ms|, a frame must be
-//    returned.
-TEST_F(VCMReceiverTimingTest, FrameForDecoding) {
-  const size_t kNumFrames = 100;
-  const int kFramePeriod = 40;
-  int64_t arrive_timestamps[kNumFrames];
-  int64_t render_timestamps[kNumFrames];
-
-  // Construct test samples.
-  // render_timestamps are the timestamps stored in the Frame;
-  // arrive_timestamps controls when the Frame packet got received.
-  for (size_t i = 0; i < kNumFrames; i++) {
-    // Preset frame rate to 25Hz.
-    // But we add a reasonable deviation to arrive_timestamps to mimic Internet
-    // fluctuation.
-    arrive_timestamps[i] =
-        (i + 1) * kFramePeriod + (i % 10) * ((i % 2) ? 1 : -1);
-    render_timestamps[i] = (i + 1) * kFramePeriod;
-  }
-
-  clock_.SetFrames(arrive_timestamps, render_timestamps, kNumFrames);
-
-  // Record how many frames we finally get out of the receiver.
-  size_t num_frames_return = 0;
-
-  const int64_t kMaxWaitTime = 30;
-
-  // Ideally, we should get all frames that we input in InitializeFrames.
-  // In the case that FrameForDecoding kills frames by error, we rely on the
-  // build bot to kill the test.
-  while (num_frames_return < kNumFrames) {
-    int64_t start_time = clock_.TimeInMilliseconds();
-    VCMEncodedFrame* frame = receiver_.FrameForDecoding(kMaxWaitTime, false);
-    int64_t end_time = clock_.TimeInMilliseconds();
-
-    // In any case the FrameForDecoding should not wait longer than
-    // max_wait_time.
-    // In the case that we did not get a frame, it should have been waiting for
-    // exactly max_wait_time. (By the testing samples we constructed above, we
-    // are sure there is no timing error, so the only case it returns with NULL
-    // is that it runs out of time.)
-    if (frame) {
-      receiver_.ReleaseFrame(frame);
-      ++num_frames_return;
-      EXPECT_GE(kMaxWaitTime, end_time - start_time);
-    } else {
-      EXPECT_EQ(kMaxWaitTime, end_time - start_time);
-    }
-  }
-}
-
-// Test whether VCMReceiver::FrameForDecoding handles parameter
-// |prefer_late_decoding| and |max_wait_time_ms| correctly:
-// 1. The function execution should never take more than |max_wait_time_ms|.
-// 2. If the function exit before now + |max_wait_time_ms|, a frame must be
-//    returned and the end time must be equal to the render timestamp - delay
-//    for decoding and rendering.
-TEST_F(VCMReceiverTimingTest, FrameForDecodingPreferLateDecoding) {
-  const size_t kNumFrames = 100;
-  const int kFramePeriod = 40;
-
-  int64_t arrive_timestamps[kNumFrames];
-  int64_t render_timestamps[kNumFrames];
-
-  int render_delay_ms;
-  int max_decode_ms;
-  int dummy;
-  timing_.GetTimings(&dummy, &max_decode_ms, &dummy, &dummy, &dummy, &dummy,
-                     &render_delay_ms);
-
-  // Construct test samples.
-  // render_timestamps are the timestamps stored in the Frame;
-  // arrive_timestamps controls when the Frame packet got received.
-  for (size_t i = 0; i < kNumFrames; i++) {
-    // Preset frame rate to 25Hz.
-    // But we add a reasonable deviation to arrive_timestamps to mimic Internet
-    // fluctuation.
-    arrive_timestamps[i] =
-        (i + 1) * kFramePeriod + (i % 10) * ((i % 2) ? 1 : -1);
-    render_timestamps[i] = (i + 1) * kFramePeriod;
-  }
-
-  clock_.SetFrames(arrive_timestamps, render_timestamps, kNumFrames);
-
-  // Record how many frames we finally get out of the receiver.
-  size_t num_frames_return = 0;
-  const int64_t kMaxWaitTime = 30;
-  bool prefer_late_decoding = true;
-  while (num_frames_return < kNumFrames) {
-    int64_t start_time = clock_.TimeInMilliseconds();
-
-    VCMEncodedFrame* frame =
-        receiver_.FrameForDecoding(kMaxWaitTime, prefer_late_decoding);
-    int64_t end_time = clock_.TimeInMilliseconds();
-    if (frame) {
-      EXPECT_EQ(frame->RenderTimeMs() - max_decode_ms - render_delay_ms,
-                end_time);
-      receiver_.ReleaseFrame(frame);
-      ++num_frames_return;
-    } else {
-      EXPECT_EQ(kMaxWaitTime, end_time - start_time);
-    }
-  }
-}
-
-}  // namespace webrtc
diff --git a/modules/video_coding/rtp_frame_reference_finder.cc b/modules/video_coding/rtp_frame_reference_finder.cc
deleted file mode 100644
index e167e15..0000000
--- a/modules/video_coding/rtp_frame_reference_finder.cc
+++ /dev/null
@@ -1,599 +0,0 @@
-/*
- *  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/video_coding/rtp_frame_reference_finder.h"
-
-#include <algorithm>
-#include <limits>
-
-#include "webrtc/modules/video_coding/frame_object.h"
-#include "webrtc/modules/video_coding/packet_buffer.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-
-namespace webrtc {
-namespace video_coding {
-
-RtpFrameReferenceFinder::RtpFrameReferenceFinder(
-    OnCompleteFrameCallback* frame_callback)
-    : last_picture_id_(-1),
-      last_unwrap_(-1),
-      current_ss_idx_(0),
-      cleared_to_seq_num_(-1),
-      frame_callback_(frame_callback) {}
-
-void RtpFrameReferenceFinder::ManageFrame(
-    std::unique_ptr<RtpFrameObject> frame) {
-  rtc::CritScope lock(&crit_);
-
-  // If we have cleared past this frame, drop it.
-  if (cleared_to_seq_num_ != -1 &&
-      AheadOf<uint16_t>(cleared_to_seq_num_, frame->first_seq_num())) {
-    return;
-  }
-
-  FrameDecision decision = ManageFrameInternal(frame.get());
-
-  switch (decision) {
-    case kStash:
-      if (stashed_frames_.size() > kMaxStashedFrames)
-        stashed_frames_.pop_back();
-      stashed_frames_.push_front(std::move(frame));
-      break;
-    case kHandOff:
-      frame_callback_->OnCompleteFrame(std::move(frame));
-      RetryStashedFrames();
-      break;
-    case kDrop:
-      break;
-  }
-}
-
-void RtpFrameReferenceFinder::RetryStashedFrames() {
-  bool complete_frame = false;
-  do {
-    complete_frame = false;
-    for (auto frame_it = stashed_frames_.begin();
-         frame_it != stashed_frames_.end();) {
-      FrameDecision decision = ManageFrameInternal(frame_it->get());
-
-      switch (decision) {
-        case kStash:
-          ++frame_it;
-          break;
-        case kHandOff:
-          complete_frame = true;
-          frame_callback_->OnCompleteFrame(std::move(*frame_it));
-          FALLTHROUGH();
-        case kDrop:
-          frame_it = stashed_frames_.erase(frame_it);
-      }
-    }
-  } while (complete_frame);
-}
-
-RtpFrameReferenceFinder::FrameDecision
-RtpFrameReferenceFinder::ManageFrameInternal(RtpFrameObject* frame) {
-  switch (frame->codec_type()) {
-    case kVideoCodecFlexfec:
-    case kVideoCodecULPFEC:
-    case kVideoCodecRED:
-      RTC_NOTREACHED();
-      break;
-    case kVideoCodecVP8:
-      return ManageFrameVp8(frame);
-    case kVideoCodecVP9:
-      return ManageFrameVp9(frame);
-    // Since the EndToEndTests use kVicdeoCodecUnknow we treat it the same as
-    // kVideoCodecGeneric.
-    // TODO(philipel): Take a look at the EndToEndTests and see if maybe they
-    //                 should be changed to use kVideoCodecGeneric instead.
-    case kVideoCodecUnknown:
-    case kVideoCodecH264:
-    case kVideoCodecI420:
-    case kVideoCodecGeneric:
-      return ManageFrameGeneric(frame, kNoPictureId);
-  }
-
-  // If not all code paths return a value it makes the win compiler sad.
-  RTC_NOTREACHED();
-  return kDrop;
-}
-
-void RtpFrameReferenceFinder::PaddingReceived(uint16_t seq_num) {
-  rtc::CritScope lock(&crit_);
-  auto clean_padding_to =
-      stashed_padding_.lower_bound(seq_num - kMaxPaddingAge);
-  stashed_padding_.erase(stashed_padding_.begin(), clean_padding_to);
-  stashed_padding_.insert(seq_num);
-  UpdateLastPictureIdWithPadding(seq_num);
-  RetryStashedFrames();
-}
-
-void RtpFrameReferenceFinder::ClearTo(uint16_t seq_num) {
-  rtc::CritScope lock(&crit_);
-  cleared_to_seq_num_ = seq_num;
-
-  auto it = stashed_frames_.begin();
-  while (it != stashed_frames_.end()) {
-    if (AheadOf<uint16_t>(cleared_to_seq_num_, (*it)->first_seq_num())) {
-      it = stashed_frames_.erase(it);
-    } else {
-      ++it;
-    }
-  }
-}
-
-void RtpFrameReferenceFinder::UpdateLastPictureIdWithPadding(uint16_t seq_num) {
-  auto gop_seq_num_it = last_seq_num_gop_.upper_bound(seq_num);
-
-  // If this padding packet "belongs" to a group of pictures that we don't track
-  // anymore, do nothing.
-  if (gop_seq_num_it == last_seq_num_gop_.begin())
-    return;
-  --gop_seq_num_it;
-
-  // Calculate the next contiuous sequence number and search for it in
-  // the padding packets we have stashed.
-  uint16_t next_seq_num_with_padding = gop_seq_num_it->second.second + 1;
-  auto padding_seq_num_it =
-      stashed_padding_.lower_bound(next_seq_num_with_padding);
-
-  // While there still are padding packets and those padding packets are
-  // continuous, then advance the "last-picture-id-with-padding" and remove
-  // the stashed padding packet.
-  while (padding_seq_num_it != stashed_padding_.end() &&
-         *padding_seq_num_it == next_seq_num_with_padding) {
-    gop_seq_num_it->second.second = next_seq_num_with_padding;
-    ++next_seq_num_with_padding;
-    padding_seq_num_it = stashed_padding_.erase(padding_seq_num_it);
-  }
-
-  // In the case where the stream has been continuous without any new keyframes
-  // for a while there is a risk that new frames will appear to be older than
-  // the keyframe they belong to due to wrapping sequence number. In order
-  // to prevent this we advance the picture id of the keyframe every so often.
-  if (ForwardDiff(gop_seq_num_it->first, seq_num) > 10000) {
-    RTC_DCHECK_EQ(1ul, last_seq_num_gop_.size());
-    last_seq_num_gop_[seq_num] = gop_seq_num_it->second;
-    last_seq_num_gop_.erase(gop_seq_num_it);
-  }
-}
-
-RtpFrameReferenceFinder::FrameDecision
-RtpFrameReferenceFinder::ManageFrameGeneric(RtpFrameObject* frame,
-                                            int picture_id) {
-  // If |picture_id| is specified then we use that to set the frame references,
-  // otherwise we use sequence number.
-  if (picture_id != kNoPictureId) {
-    if (last_unwrap_ == -1)
-      last_unwrap_ = picture_id;
-
-    frame->picture_id = unwrapper_.Unwrap(picture_id);
-    frame->num_references = frame->frame_type() == kVideoFrameKey ? 0 : 1;
-    frame->references[0] = frame->picture_id - 1;
-    return kHandOff;
-  }
-
-  if (frame->frame_type() == kVideoFrameKey) {
-    last_seq_num_gop_.insert(std::make_pair(
-        frame->last_seq_num(),
-        std::make_pair(frame->last_seq_num(), frame->last_seq_num())));
-  }
-
-  // We have received a frame but not yet a keyframe, stash this frame.
-  if (last_seq_num_gop_.empty())
-    return kStash;
-
-  // Clean up info for old keyframes but make sure to keep info
-  // for the last keyframe.
-  auto clean_to = last_seq_num_gop_.lower_bound(frame->last_seq_num() - 100);
-  for (auto it = last_seq_num_gop_.begin();
-       it != clean_to && last_seq_num_gop_.size() > 1;) {
-    it = last_seq_num_gop_.erase(it);
-  }
-
-  // Find the last sequence number of the last frame for the keyframe
-  // that this frame indirectly references.
-  auto seq_num_it = last_seq_num_gop_.upper_bound(frame->last_seq_num());
-  if (seq_num_it == last_seq_num_gop_.begin()) {
-    LOG(LS_WARNING) << "Generic frame with packet range ["
-                    << frame->first_seq_num() << ", " << frame->last_seq_num()
-                    << "] has no GoP, dropping frame.";
-    return kDrop;
-  }
-  seq_num_it--;
-
-  // Make sure the packet sequence numbers are continuous, otherwise stash
-  // this frame.
-  uint16_t last_picture_id_gop = seq_num_it->second.first;
-  uint16_t last_picture_id_with_padding_gop = seq_num_it->second.second;
-  if (frame->frame_type() == kVideoFrameDelta) {
-    uint16_t prev_seq_num = frame->first_seq_num() - 1;
-
-    if (prev_seq_num != last_picture_id_with_padding_gop)
-      return kStash;
-  }
-
-  RTC_DCHECK(AheadOrAt(frame->last_seq_num(), seq_num_it->first));
-
-  // Since keyframes can cause reordering we can't simply assign the
-  // picture id according to some incrementing counter.
-  frame->picture_id = frame->last_seq_num();
-  frame->num_references = frame->frame_type() == kVideoFrameDelta;
-  frame->references[0] = generic_unwrapper_.Unwrap(last_picture_id_gop);
-  if (AheadOf<uint16_t>(frame->picture_id, last_picture_id_gop)) {
-    seq_num_it->second.first = frame->picture_id;
-    seq_num_it->second.second = frame->picture_id;
-  }
-
-  last_picture_id_ = frame->picture_id;
-  UpdateLastPictureIdWithPadding(frame->picture_id);
-  frame->picture_id = generic_unwrapper_.Unwrap(frame->picture_id);
-  return kHandOff;
-}
-
-RtpFrameReferenceFinder::FrameDecision RtpFrameReferenceFinder::ManageFrameVp8(
-    RtpFrameObject* frame) {
-  rtc::Optional<RTPVideoTypeHeader> rtp_codec_header = frame->GetCodecHeader();
-  if (!rtp_codec_header) {
-    LOG(LS_WARNING) << "Failed to get codec header from frame, dropping frame.";
-    return kDrop;
-  }
-
-  const RTPVideoHeaderVP8& codec_header = rtp_codec_header->VP8;
-
-  if (codec_header.pictureId == kNoPictureId ||
-      codec_header.temporalIdx == kNoTemporalIdx ||
-      codec_header.tl0PicIdx == kNoTl0PicIdx) {
-    return ManageFrameGeneric(std::move(frame), codec_header.pictureId);
-  }
-
-  frame->picture_id = codec_header.pictureId % kPicIdLength;
-
-  if (last_unwrap_ == -1)
-    last_unwrap_ = codec_header.pictureId;
-
-  if (last_picture_id_ == -1)
-    last_picture_id_ = frame->picture_id;
-
-  // Find if there has been a gap in fully received frames and save the picture
-  // id of those frames in |not_yet_received_frames_|.
-  if (AheadOf<uint16_t, kPicIdLength>(frame->picture_id, last_picture_id_)) {
-    do {
-      last_picture_id_ = Add<kPicIdLength>(last_picture_id_, 1);
-      not_yet_received_frames_.insert(last_picture_id_);
-    } while (last_picture_id_ != frame->picture_id);
-  }
-
-  // Clean up info for base layers that are too old.
-  uint8_t old_tl0_pic_idx = codec_header.tl0PicIdx - kMaxLayerInfo;
-  auto clean_layer_info_to = layer_info_.lower_bound(old_tl0_pic_idx);
-  layer_info_.erase(layer_info_.begin(), clean_layer_info_to);
-
-  // Clean up info about not yet received frames that are too old.
-  uint16_t old_picture_id =
-      Subtract<kPicIdLength>(frame->picture_id, kMaxNotYetReceivedFrames);
-  auto clean_frames_to = not_yet_received_frames_.lower_bound(old_picture_id);
-  not_yet_received_frames_.erase(not_yet_received_frames_.begin(),
-                                 clean_frames_to);
-
-  if (frame->frame_type() == kVideoFrameKey) {
-    frame->num_references = 0;
-    layer_info_[codec_header.tl0PicIdx].fill(-1);
-    UpdateLayerInfoVp8(frame);
-    return kHandOff;
-  }
-
-  auto layer_info_it = layer_info_.find(codec_header.temporalIdx == 0
-                                            ? codec_header.tl0PicIdx - 1
-                                            : codec_header.tl0PicIdx);
-
-  // If we don't have the base layer frame yet, stash this frame.
-  if (layer_info_it == layer_info_.end())
-    return kStash;
-
-  // A non keyframe base layer frame has been received, copy the layer info
-  // from the previous base layer frame and set a reference to the previous
-  // base layer frame.
-  if (codec_header.temporalIdx == 0) {
-    layer_info_it =
-        layer_info_
-            .insert(make_pair(codec_header.tl0PicIdx, layer_info_it->second))
-            .first;
-    frame->num_references = 1;
-    frame->references[0] = layer_info_it->second[0];
-    UpdateLayerInfoVp8(frame);
-    return kHandOff;
-  }
-
-  // Layer sync frame, this frame only references its base layer frame.
-  if (codec_header.layerSync) {
-    frame->num_references = 1;
-    frame->references[0] = layer_info_it->second[0];
-
-    UpdateLayerInfoVp8(frame);
-    return kHandOff;
-  }
-
-  // Find all references for this frame.
-  frame->num_references = 0;
-  for (uint8_t layer = 0; layer <= codec_header.temporalIdx; ++layer) {
-    // If we have not yet received a previous frame on this temporal layer,
-    // stash this frame.
-    if (layer_info_it->second[layer] == -1)
-      return kStash;
-
-    // If the last frame on this layer is ahead of this frame it means that
-    // a layer sync frame has been received after this frame for the same
-    // base layer frame, drop this frame.
-    if (AheadOf<uint16_t, kPicIdLength>(layer_info_it->second[layer],
-                                        frame->picture_id)) {
-      return kDrop;
-    }
-
-    // If we have not yet received a frame between this frame and the referenced
-    // frame then we have to wait for that frame to be completed first.
-    auto not_received_frame_it =
-        not_yet_received_frames_.upper_bound(layer_info_it->second[layer]);
-    if (not_received_frame_it != not_yet_received_frames_.end() &&
-        AheadOf<uint16_t, kPicIdLength>(frame->picture_id,
-                                        *not_received_frame_it)) {
-      return kStash;
-    }
-
-    if (!(AheadOf<uint16_t, kPicIdLength>(frame->picture_id,
-                                          layer_info_it->second[layer]))) {
-      LOG(LS_WARNING) << "Frame with picture id " << frame->picture_id
-                      << " and packet range [" << frame->first_seq_num() << ", "
-                      << frame->last_seq_num() << "] already received, "
-                      << " dropping frame.";
-      return kDrop;
-    }
-
-    ++frame->num_references;
-    frame->references[layer] = layer_info_it->second[layer];
-  }
-
-  UpdateLayerInfoVp8(frame);
-  return kHandOff;
-}
-
-void RtpFrameReferenceFinder::UpdateLayerInfoVp8(RtpFrameObject* frame) {
-  rtc::Optional<RTPVideoTypeHeader> rtp_codec_header = frame->GetCodecHeader();
-  RTC_DCHECK(rtp_codec_header);
-  const RTPVideoHeaderVP8& codec_header = rtp_codec_header->VP8;
-  uint8_t tl0_pic_idx = codec_header.tl0PicIdx;
-  uint8_t temporal_index = codec_header.temporalIdx;
-  auto layer_info_it = layer_info_.find(tl0_pic_idx);
-
-  // Update this layer info and newer.
-  while (layer_info_it != layer_info_.end()) {
-    if (layer_info_it->second[temporal_index] != -1 &&
-        AheadOf<uint16_t, kPicIdLength>(layer_info_it->second[temporal_index],
-                                        frame->picture_id)) {
-      // The frame was not newer, then no subsequent layer info have to be
-      // update.
-      break;
-    }
-
-    layer_info_it->second[codec_header.temporalIdx] = frame->picture_id;
-    ++tl0_pic_idx;
-    layer_info_it = layer_info_.find(tl0_pic_idx);
-  }
-  not_yet_received_frames_.erase(frame->picture_id);
-
-  UnwrapPictureIds(frame);
-}
-
-RtpFrameReferenceFinder::FrameDecision RtpFrameReferenceFinder::ManageFrameVp9(
-    RtpFrameObject* frame) {
-  rtc::Optional<RTPVideoTypeHeader> rtp_codec_header = frame->GetCodecHeader();
-  if (!rtp_codec_header) {
-    LOG(LS_WARNING) << "Failed to get codec header from frame, dropping frame.";
-    return kDrop;
-  }
-
-  const RTPVideoHeaderVP9& codec_header = rtp_codec_header->VP9;
-
-  if (codec_header.picture_id == kNoPictureId ||
-      codec_header.temporal_idx == kNoTemporalIdx) {
-    return ManageFrameGeneric(std::move(frame), codec_header.picture_id);
-  }
-
-  frame->spatial_layer = codec_header.spatial_idx;
-  frame->inter_layer_predicted = codec_header.inter_layer_predicted;
-  frame->picture_id = codec_header.picture_id % kPicIdLength;
-
-  if (last_unwrap_ == -1)
-    last_unwrap_ = codec_header.picture_id;
-
-  if (last_picture_id_ == -1)
-    last_picture_id_ = frame->picture_id;
-
-  if (codec_header.flexible_mode) {
-    frame->num_references = codec_header.num_ref_pics;
-    for (size_t i = 0; i < frame->num_references; ++i) {
-      frame->references[i] =
-          Subtract<1 << 16>(frame->picture_id, codec_header.pid_diff[i]);
-    }
-
-    UnwrapPictureIds(frame);
-    return kHandOff;
-  }
-
-  if (codec_header.ss_data_available) {
-    // Scalability structures can only be sent with tl0 frames.
-    if (codec_header.temporal_idx != 0) {
-      LOG(LS_WARNING) << "Received scalability structure on a non base layer"
-                         " frame. Scalability structure ignored.";
-    } else {
-      current_ss_idx_ = Add<kMaxGofSaved>(current_ss_idx_, 1);
-      scalability_structures_[current_ss_idx_] = codec_header.gof;
-      scalability_structures_[current_ss_idx_].pid_start = frame->picture_id;
-
-      GofInfo info(&scalability_structures_[current_ss_idx_],
-                   frame->picture_id);
-      gof_info_.insert(std::make_pair(codec_header.tl0_pic_idx, info));
-    }
-  }
-
-  // Clean up info for base layers that are too old.
-  uint8_t old_tl0_pic_idx = codec_header.tl0_pic_idx - kMaxGofSaved;
-  auto clean_gof_info_to = gof_info_.lower_bound(old_tl0_pic_idx);
-  gof_info_.erase(gof_info_.begin(), clean_gof_info_to);
-
-  if (frame->frame_type() == kVideoFrameKey) {
-    // When using GOF all keyframes must include the scalability structure.
-    if (!codec_header.ss_data_available)
-      LOG(LS_WARNING) << "Received keyframe without scalability structure";
-
-    frame->num_references = 0;
-    GofInfo info = gof_info_.find(codec_header.tl0_pic_idx)->second;
-    FrameReceivedVp9(frame->picture_id, &info);
-    UnwrapPictureIds(frame);
-    return kHandOff;
-  }
-
-  auto gof_info_it = gof_info_.find(
-      (codec_header.temporal_idx == 0 && !codec_header.ss_data_available)
-          ? codec_header.tl0_pic_idx - 1
-          : codec_header.tl0_pic_idx);
-
-  // Gof info for this frame is not available yet, stash this frame.
-  if (gof_info_it == gof_info_.end())
-    return kStash;
-
-  GofInfo* info = &gof_info_it->second;
-  FrameReceivedVp9(frame->picture_id, info);
-
-  // Make sure we don't miss any frame that could potentially have the
-  // up switch flag set.
-  if (MissingRequiredFrameVp9(frame->picture_id, *info))
-    return kStash;
-
-  if (codec_header.temporal_up_switch) {
-    auto pid_tidx =
-        std::make_pair(frame->picture_id, codec_header.temporal_idx);
-    up_switch_.insert(pid_tidx);
-  }
-
-  // If this is a base layer frame that contains a scalability structure
-  // then gof info has already been inserted earlier, so we only want to
-  // insert if we haven't done so already.
-  if (codec_header.temporal_idx == 0 && !codec_header.ss_data_available) {
-    GofInfo new_info(info->gof, frame->picture_id);
-    gof_info_.insert(std::make_pair(codec_header.tl0_pic_idx, new_info));
-  }
-
-  // Clean out old info about up switch frames.
-  uint16_t old_picture_id = Subtract<kPicIdLength>(frame->picture_id, 50);
-  auto up_switch_erase_to = up_switch_.lower_bound(old_picture_id);
-  up_switch_.erase(up_switch_.begin(), up_switch_erase_to);
-
-  size_t diff = ForwardDiff<uint16_t, kPicIdLength>(info->gof->pid_start,
-                                                    frame->picture_id);
-  size_t gof_idx = diff % info->gof->num_frames_in_gof;
-
-  // Populate references according to the scalability structure.
-  frame->num_references = info->gof->num_ref_pics[gof_idx];
-  for (size_t i = 0; i < frame->num_references; ++i) {
-    frame->references[i] = Subtract<kPicIdLength>(
-        frame->picture_id, info->gof->pid_diff[gof_idx][i]);
-
-    // If this is a reference to a frame earlier than the last up switch point,
-    // then ignore this reference.
-    if (UpSwitchInIntervalVp9(frame->picture_id, codec_header.temporal_idx,
-                              frame->references[i])) {
-      --frame->num_references;
-    }
-  }
-
-  UnwrapPictureIds(frame);
-  return kHandOff;
-}
-
-bool RtpFrameReferenceFinder::MissingRequiredFrameVp9(uint16_t picture_id,
-                                                      const GofInfo& info) {
-  size_t diff =
-      ForwardDiff<uint16_t, kPicIdLength>(info.gof->pid_start, picture_id);
-  size_t gof_idx = diff % info.gof->num_frames_in_gof;
-  size_t temporal_idx = info.gof->temporal_idx[gof_idx];
-
-  // For every reference this frame has, check if there is a frame missing in
-  // the interval (|ref_pid|, |picture_id|) in any of the lower temporal
-  // layers. If so, we are missing a required frame.
-  uint8_t num_references = info.gof->num_ref_pics[gof_idx];
-  for (size_t i = 0; i < num_references; ++i) {
-    uint16_t ref_pid =
-        Subtract<kPicIdLength>(picture_id, info.gof->pid_diff[gof_idx][i]);
-    for (size_t l = 0; l < temporal_idx; ++l) {
-      auto missing_frame_it = missing_frames_for_layer_[l].lower_bound(ref_pid);
-      if (missing_frame_it != missing_frames_for_layer_[l].end() &&
-          AheadOf<uint16_t, kPicIdLength>(picture_id, *missing_frame_it)) {
-        return true;
-      }
-    }
-  }
-  return false;
-}
-
-void RtpFrameReferenceFinder::FrameReceivedVp9(uint16_t picture_id,
-                                               GofInfo* info) {
-  int last_picture_id = info->last_picture_id;
-
-  // If there is a gap, find which temporal layer the missing frames
-  // belong to and add the frame as missing for that temporal layer.
-  // Otherwise, remove this frame from the set of missing frames.
-  if (AheadOf<uint16_t, kPicIdLength>(picture_id, last_picture_id)) {
-    size_t diff = ForwardDiff<uint16_t, kPicIdLength>(info->gof->pid_start,
-                                                      last_picture_id);
-    size_t gof_idx = diff % info->gof->num_frames_in_gof;
-
-    last_picture_id = Add<kPicIdLength>(last_picture_id, 1);
-    while (last_picture_id != picture_id) {
-      ++gof_idx;
-      RTC_DCHECK_NE(0ul, gof_idx % info->gof->num_frames_in_gof);
-      size_t temporal_idx = info->gof->temporal_idx[gof_idx];
-      missing_frames_for_layer_[temporal_idx].insert(last_picture_id);
-      last_picture_id = Add<kPicIdLength>(last_picture_id, 1);
-    }
-    info->last_picture_id = last_picture_id;
-  } else {
-    size_t diff =
-        ForwardDiff<uint16_t, kPicIdLength>(info->gof->pid_start, picture_id);
-    size_t gof_idx = diff % info->gof->num_frames_in_gof;
-    size_t temporal_idx = info->gof->temporal_idx[gof_idx];
-    missing_frames_for_layer_[temporal_idx].erase(picture_id);
-  }
-}
-
-bool RtpFrameReferenceFinder::UpSwitchInIntervalVp9(uint16_t picture_id,
-                                                    uint8_t temporal_idx,
-                                                    uint16_t pid_ref) {
-  for (auto up_switch_it = up_switch_.upper_bound(pid_ref);
-       up_switch_it != up_switch_.end() &&
-       AheadOf<uint16_t, kPicIdLength>(picture_id, up_switch_it->first);
-       ++up_switch_it) {
-    if (up_switch_it->second < temporal_idx)
-      return true;
-  }
-
-  return false;
-}
-
-void RtpFrameReferenceFinder::UnwrapPictureIds(RtpFrameObject* frame) {
-  for (size_t i = 0; i < frame->num_references; ++i)
-    frame->references[i] = unwrapper_.Unwrap(frame->references[i]);
-  frame->picture_id = unwrapper_.Unwrap(frame->picture_id);
-}
-
-}  // namespace video_coding
-}  // namespace webrtc
diff --git a/modules/video_coding/rtp_frame_reference_finder.h b/modules/video_coding/rtp_frame_reference_finder.h
deleted file mode 100644
index f309a5e..0000000
--- a/modules/video_coding/rtp_frame_reference_finder.h
+++ /dev/null
@@ -1,230 +0,0 @@
-/*
- *  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_VIDEO_CODING_RTP_FRAME_REFERENCE_FINDER_H_
-#define WEBRTC_MODULES_VIDEO_CODING_RTP_FRAME_REFERENCE_FINDER_H_
-
-#include <array>
-#include <map>
-#include <memory>
-#include <deque>
-#include <set>
-#include <utility>
-
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/modules/video_coding/sequence_number_util.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/thread_annotations.h"
-
-namespace webrtc {
-namespace video_coding {
-
-class FrameObject;
-class RtpFrameObject;
-
-// A complete frame is a frame which has received all its packets and all its
-// references are known.
-class OnCompleteFrameCallback {
- public:
-  virtual ~OnCompleteFrameCallback() {}
-  virtual void OnCompleteFrame(std::unique_ptr<FrameObject> frame) = 0;
-};
-
-class RtpFrameReferenceFinder {
- public:
-  explicit RtpFrameReferenceFinder(OnCompleteFrameCallback* frame_callback);
-
-  // Manage this frame until:
-  //  - We have all information needed to determine its references, after
-  //    which |frame_callback_| is called with the completed frame, or
-  //  - We have too many stashed frames (determined by |kMaxStashedFrames|)
-  //    so we drop this frame, or
-  //  - It gets cleared by ClearTo, which also means we drop it.
-  void ManageFrame(std::unique_ptr<RtpFrameObject> frame);
-
-  // Notifies that padding has been received, which the reference finder
-  // might need to calculate the references of a frame.
-  void PaddingReceived(uint16_t seq_num);
-
-  // Clear all stashed frames that include packets older than |seq_num|.
-  void ClearTo(uint16_t seq_num);
-
- private:
-  static const uint16_t kPicIdLength = 1 << 15;
-  static const uint8_t kMaxTemporalLayers = 5;
-  static const int kMaxLayerInfo = 50;
-  static const int kMaxStashedFrames = 50;
-  static const int kMaxNotYetReceivedFrames = 100;
-  static const int kMaxGofSaved = 50;
-  static const int kMaxPaddingAge = 100;
-
-  enum FrameDecision { kStash, kHandOff, kDrop };
-
-  struct GofInfo {
-    GofInfo(GofInfoVP9* gof, uint16_t last_picture_id)
-        : gof(gof), last_picture_id(last_picture_id) {}
-    GofInfoVP9* gof;
-    uint16_t last_picture_id;
-  };
-
-  rtc::CriticalSection crit_;
-
-  // Find the relevant group of pictures and update its "last-picture-id-with
-  // padding" sequence number.
-  void UpdateLastPictureIdWithPadding(uint16_t seq_num)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_);
-
-  // Retry stashed frames until no more complete frames are found.
-  void RetryStashedFrames() RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_);
-
-  FrameDecision ManageFrameInternal(RtpFrameObject* frame)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_);
-
-  // Find references for generic frames. If |picture_id| is unspecified
-  // then packet sequence numbers will be used to determine the references
-  // of the frames.
-  FrameDecision ManageFrameGeneric(RtpFrameObject* frame, int picture_id)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_);
-
-  // Find references for Vp8 frames
-  FrameDecision ManageFrameVp8(RtpFrameObject* frame)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_);
-
-  // Updates necessary layer info state used to determine frame references for
-  // Vp8.
-  void UpdateLayerInfoVp8(RtpFrameObject* frame)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_);
-
-  // Find references for Vp9 frames
-  FrameDecision ManageFrameVp9(RtpFrameObject* frame)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_);
-
-  // Check if we are missing a frame necessary to determine the references
-  // for this frame.
-  bool MissingRequiredFrameVp9(uint16_t picture_id, const GofInfo& info)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_);
-
-  // Updates which frames that have been received. If there is a gap,
-  // missing frames will be added to |missing_frames_for_layer_| or
-  // if this is an already missing frame then it will be removed.
-  void FrameReceivedVp9(uint16_t picture_id, GofInfo* info)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_);
-
-  // Check if there is a frame with the up-switch flag set in the interval
-  // (|pid_ref|, |picture_id|) with temporal layer smaller than |temporal_idx|.
-  bool UpSwitchInIntervalVp9(uint16_t picture_id,
-                             uint8_t temporal_idx,
-                             uint16_t pid_ref)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_);
-
-  // Unwrap |frame|s picture id and its references to 16 bits.
-  void UnwrapPictureIds(RtpFrameObject* frame)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_);
-
-  // Returns true if the frame is old and should be dropped.
-  // TODO(philipel): Remove when VP9 PID/TL0 does not jump mid-stream (should be
-  //                 around M59).
-  bool Vp9PidTl0Fix(const RtpFrameObject& frame,
-                    int16_t* picture_id,
-                    int16_t* tl0_pic_idx) RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_);
-
-  // TODO(philipel): Remove when VP9 PID/TL0 does not jump mid-stream (should be
-  //                 around M59).
-  bool DetectVp9PicIdJump(int fixed_pid,
-                          int fixed_tl0,
-                          uint32_t timestamp) const
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_);
-
-  // TODO(philipel): Remove when VP9 PID/TL0 does not jump mid-stream (should be
-  //                 around M59).
-  bool DetectVp9Tl0PicIdxJump(int fixed_tl0, uint32_t timestamp) const
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_);
-
-  // For every group of pictures, hold two sequence numbers. The first being
-  // the sequence number of the last packet of the last completed frame, and
-  // the second being the sequence number of the last packet of the last
-  // completed frame advanced by any potential continuous packets of padding.
-  std::map<uint16_t,
-           std::pair<uint16_t, uint16_t>,
-           DescendingSeqNumComp<uint16_t>>
-      last_seq_num_gop_ RTC_GUARDED_BY(crit_);
-
-  // Save the last picture id in order to detect when there is a gap in frames
-  // that have not yet been fully received.
-  int last_picture_id_ RTC_GUARDED_BY(crit_);
-
-  // Padding packets that have been received but that are not yet continuous
-  // with any group of pictures.
-  std::set<uint16_t, DescendingSeqNumComp<uint16_t>> stashed_padding_
-      RTC_GUARDED_BY(crit_);
-
-  // The last unwrapped picture id. Used to unwrap the picture id from a length
-  // of |kPicIdLength| to 16 bits.
-  int last_unwrap_ RTC_GUARDED_BY(crit_);
-
-  // Frames earlier than the last received frame that have not yet been
-  // fully received.
-  std::set<uint16_t, DescendingSeqNumComp<uint16_t, kPicIdLength>>
-      not_yet_received_frames_ RTC_GUARDED_BY(crit_);
-
-  // Frames that have been fully received but didn't have all the information
-  // needed to determine their references.
-  std::deque<std::unique_ptr<RtpFrameObject>> stashed_frames_
-      RTC_GUARDED_BY(crit_);
-
-  // Holds the information about the last completed frame for a given temporal
-  // layer given a Tl0 picture index.
-  std::map<uint8_t,
-           std::array<int16_t, kMaxTemporalLayers>,
-           DescendingSeqNumComp<uint8_t>>
-      layer_info_ RTC_GUARDED_BY(crit_);
-
-  // Where the current scalability structure is in the
-  // |scalability_structures_| array.
-  uint8_t current_ss_idx_;
-
-  // Holds received scalability structures.
-  std::array<GofInfoVP9, kMaxGofSaved> scalability_structures_
-      RTC_GUARDED_BY(crit_);
-
-  // Holds the the Gof information for a given TL0 picture index.
-  std::map<uint8_t, GofInfo, DescendingSeqNumComp<uint8_t>> gof_info_
-      RTC_GUARDED_BY(crit_);
-
-  // Keep track of which picture id and which temporal layer that had the
-  // up switch flag set.
-  std::map<uint16_t, uint8_t, DescendingSeqNumComp<uint16_t, kPicIdLength>>
-      up_switch_ RTC_GUARDED_BY(crit_);
-
-  // For every temporal layer, keep a set of which frames that are missing.
-  std::array<std::set<uint16_t, DescendingSeqNumComp<uint16_t, kPicIdLength>>,
-             kMaxTemporalLayers>
-      missing_frames_for_layer_ RTC_GUARDED_BY(crit_);
-
-  // How far frames have been cleared by sequence number. A frame will be
-  // cleared if it contains a packet with a sequence number older than
-  // |cleared_to_seq_num_|.
-  int cleared_to_seq_num_ RTC_GUARDED_BY(crit_);
-
-  OnCompleteFrameCallback* frame_callback_;
-
-  // Unwrapper used to unwrap generic RTP streams. In a generic stream we derive
-  // a picture id from the packet sequence number.
-  SeqNumUnwrapper<uint16_t> generic_unwrapper_ RTC_GUARDED_BY(crit_);
-
-  // Unwrapper used to unwrap VP8/VP9 streams which have their picture id
-  // specified.
-  SeqNumUnwrapper<uint16_t, kPicIdLength> unwrapper_ RTC_GUARDED_BY(crit_);
-};
-
-}  // namespace video_coding
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_VIDEO_CODING_RTP_FRAME_REFERENCE_FINDER_H_
diff --git a/modules/video_coding/rtp_frame_reference_finder_unittest.cc b/modules/video_coding/rtp_frame_reference_finder_unittest.cc
deleted file mode 100644
index a40a727..0000000
--- a/modules/video_coding/rtp_frame_reference_finder_unittest.cc
+++ /dev/null
@@ -1,1317 +0,0 @@
-/*
- *  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 <cstring>
-#include <limits>
-#include <map>
-#include <set>
-#include <utility>
-
-#include "webrtc/modules/video_coding/frame_object.h"
-#include "webrtc/modules/video_coding/packet_buffer.h"
-#include "webrtc/rtc_base/random.h"
-#include "webrtc/rtc_base/refcount.h"
-#include "webrtc/system_wrappers/include/clock.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-namespace video_coding {
-
-class FakePacketBuffer : public PacketBuffer {
- public:
-  FakePacketBuffer() : PacketBuffer(nullptr, 0, 0, nullptr) {}
-
-  VCMPacket* GetPacket(uint16_t seq_num) override {
-    auto packet_it = packets_.find(seq_num);
-    return packet_it == packets_.end() ? nullptr : &packet_it->second;
-  }
-
-  bool InsertPacket(VCMPacket* packet) override {
-    packets_[packet->seqNum] = *packet;
-    return true;
-  }
-
-  bool GetBitstream(const RtpFrameObject& frame,
-                    uint8_t* destination) override {
-    return true;
-  }
-
-  void ReturnFrame(RtpFrameObject* frame) override {
-    packets_.erase(frame->first_seq_num());
-  }
-
- private:
-  std::map<uint16_t, VCMPacket> packets_;
-};
-
-class TestRtpFrameReferenceFinder : public ::testing::Test,
-                                    public OnCompleteFrameCallback {
- protected:
-  static constexpr uint64_t kUnwrappedSequenceStart = 1000000000000000000UL;
-
-  TestRtpFrameReferenceFinder()
-      : rand_(0x8739211),
-        ref_packet_buffer_(new FakePacketBuffer()),
-        reference_finder_(new RtpFrameReferenceFinder(this)),
-        frames_from_callback_(FrameComp()) {}
-
-  uint16_t Rand() { return rand_.Rand<uint16_t>(); }
-
-  void OnCompleteFrame(std::unique_ptr<FrameObject> frame) override {
-    int64_t pid = frame->picture_id;
-    uint16_t sidx = frame->spatial_layer;
-    auto frame_it = frames_from_callback_.find(std::make_pair(pid, sidx));
-    if (frame_it != frames_from_callback_.end()) {
-      ADD_FAILURE() << "Already received frame with (pid:sidx): (" << pid << ":"
-                    << sidx << ")";
-      return;
-    }
-
-    frames_from_callback_.insert(
-        std::make_pair(std::make_pair(pid, sidx), std::move(frame)));
-  }
-
-  void InsertGeneric(uint16_t seq_num_start,
-                     uint16_t seq_num_end,
-                     bool keyframe) {
-    VCMPacket packet;
-    packet.codec = kVideoCodecGeneric;
-    packet.seqNum = seq_num_start;
-    packet.frameType = keyframe ? kVideoFrameKey : kVideoFrameDelta;
-    ref_packet_buffer_->InsertPacket(&packet);
-
-    packet.seqNum = seq_num_end;
-    packet.markerBit = true;
-    ref_packet_buffer_->InsertPacket(&packet);
-
-    std::unique_ptr<RtpFrameObject> frame(new RtpFrameObject(
-        ref_packet_buffer_, seq_num_start, seq_num_end, 0, 0, 0));
-    reference_finder_->ManageFrame(std::move(frame));
-  }
-
-  void InsertVp8(uint16_t seq_num_start,
-                 uint16_t seq_num_end,
-                 bool keyframe,
-                 int32_t pid = kNoPictureId,
-                 uint8_t tid = kNoTemporalIdx,
-                 int32_t tl0 = kNoTl0PicIdx,
-                 bool sync = false) {
-    VCMPacket packet;
-    packet.codec = kVideoCodecVP8;
-    packet.seqNum = seq_num_start;
-    packet.markerBit = (seq_num_start == seq_num_end);
-    packet.frameType = keyframe ? kVideoFrameKey : kVideoFrameDelta;
-    packet.video_header.codecHeader.VP8.pictureId = pid % (1 << 15);
-    packet.video_header.codecHeader.VP8.temporalIdx = tid;
-    packet.video_header.codecHeader.VP8.tl0PicIdx = tl0;
-    packet.video_header.codecHeader.VP8.layerSync = sync;
-    ref_packet_buffer_->InsertPacket(&packet);
-
-    if (seq_num_start != seq_num_end) {
-      packet.seqNum = seq_num_end;
-      packet.markerBit = true;
-      ref_packet_buffer_->InsertPacket(&packet);
-    }
-
-    std::unique_ptr<RtpFrameObject> frame(new RtpFrameObject(
-        ref_packet_buffer_, seq_num_start, seq_num_end, 0, 0, 0));
-    reference_finder_->ManageFrame(std::move(frame));
-  }
-
-  void InsertVp9Gof(uint16_t seq_num_start,
-                    uint16_t seq_num_end,
-                    bool keyframe,
-                    int32_t pid = kNoPictureId,
-                    uint8_t sid = kNoSpatialIdx,
-                    uint8_t tid = kNoTemporalIdx,
-                    int32_t tl0 = kNoTl0PicIdx,
-                    bool up_switch = false,
-                    GofInfoVP9* ss = nullptr) {
-    VCMPacket packet;
-    packet.timestamp = pid;
-    packet.codec = kVideoCodecVP9;
-    packet.seqNum = seq_num_start;
-    packet.markerBit = (seq_num_start == seq_num_end);
-    packet.frameType = keyframe ? kVideoFrameKey : kVideoFrameDelta;
-    packet.video_header.codecHeader.VP9.flexible_mode = false;
-    packet.video_header.codecHeader.VP9.picture_id = pid % (1 << 15);
-    packet.video_header.codecHeader.VP9.temporal_idx = tid;
-    packet.video_header.codecHeader.VP9.spatial_idx = sid;
-    packet.video_header.codecHeader.VP9.tl0_pic_idx = tl0;
-    packet.video_header.codecHeader.VP9.temporal_up_switch = up_switch;
-    if (ss != nullptr) {
-      packet.video_header.codecHeader.VP9.ss_data_available = true;
-      packet.video_header.codecHeader.VP9.gof = *ss;
-    }
-    ref_packet_buffer_->InsertPacket(&packet);
-
-    if (seq_num_start != seq_num_end) {
-      packet.markerBit = true;
-      packet.video_header.codecHeader.VP9.ss_data_available = false;
-      packet.seqNum = seq_num_end;
-      ref_packet_buffer_->InsertPacket(&packet);
-    }
-
-    std::unique_ptr<RtpFrameObject> frame(new RtpFrameObject(
-        ref_packet_buffer_, seq_num_start, seq_num_end, 0, 0, 0));
-    reference_finder_->ManageFrame(std::move(frame));
-  }
-
-  void InsertVp9Flex(uint16_t seq_num_start,
-                     uint16_t seq_num_end,
-                     bool keyframe,
-                     int32_t pid = kNoPictureId,
-                     uint8_t sid = kNoSpatialIdx,
-                     uint8_t tid = kNoTemporalIdx,
-                     int32_t tl0 = kNoTl0PicIdx,
-                     bool inter = false,
-                     std::vector<uint8_t> refs = std::vector<uint8_t>()) {
-    VCMPacket packet;
-    packet.timestamp = pid;
-    packet.codec = kVideoCodecVP9;
-    packet.seqNum = seq_num_start;
-    packet.markerBit = (seq_num_start == seq_num_end);
-    packet.frameType = keyframe ? kVideoFrameKey : kVideoFrameDelta;
-    packet.video_header.codecHeader.VP9.inter_layer_predicted = inter;
-    packet.video_header.codecHeader.VP9.flexible_mode = true;
-    packet.video_header.codecHeader.VP9.picture_id = pid % (1 << 15);
-    packet.video_header.codecHeader.VP9.temporal_idx = tid;
-    packet.video_header.codecHeader.VP9.spatial_idx = sid;
-    packet.video_header.codecHeader.VP9.tl0_pic_idx = tl0;
-    packet.video_header.codecHeader.VP9.num_ref_pics = refs.size();
-    for (size_t i = 0; i < refs.size(); ++i)
-      packet.video_header.codecHeader.VP9.pid_diff[i] = refs[i];
-    ref_packet_buffer_->InsertPacket(&packet);
-
-    if (seq_num_start != seq_num_end) {
-      packet.seqNum = seq_num_end;
-      packet.markerBit = true;
-      ref_packet_buffer_->InsertPacket(&packet);
-    }
-
-    std::unique_ptr<RtpFrameObject> frame(new RtpFrameObject(
-        ref_packet_buffer_, seq_num_start, seq_num_end, 0, 0, 0));
-    reference_finder_->ManageFrame(std::move(frame));
-  }
-
-  // Check if a frame with picture id |pid| and spatial index |sidx| has been
-  // delivered from the packet buffer, and if so, if it has the references
-  // specified by |refs|.
-  template <typename... T>
-  void CheckReferences(int64_t picture_id_offset,
-                       uint16_t sidx,
-                       T... refs) const {
-    int64_t pid = kUnwrappedSequenceStart + picture_id_offset;
-    auto frame_it = frames_from_callback_.find(std::make_pair(pid, sidx));
-    if (frame_it == frames_from_callback_.end()) {
-      ADD_FAILURE() << "Could not find frame with (pid:sidx): (" << pid << ":"
-                    << sidx << ")";
-      return;
-    }
-
-    std::set<int64_t> actual_refs;
-    for (uint8_t r = 0; r < frame_it->second->num_references; ++r)
-      actual_refs.insert(frame_it->second->references[r]);
-
-    std::set<int64_t> expected_refs;
-    RefsToSet(&expected_refs, refs...);
-
-    ASSERT_EQ(expected_refs, actual_refs);
-  }
-
-  template <typename... T>
-  void CheckReferencesGeneric(int64_t pid, T... refs) const {
-    CheckReferences(pid, 0, refs...);
-  }
-
-  template <typename... T>
-  void CheckReferencesVp8(int64_t pid, T... refs) const {
-    CheckReferences(pid, 0, refs...);
-  }
-
-  template <typename... T>
-  void CheckReferencesVp9(int64_t pid, uint8_t sidx, T... refs) const {
-    CheckReferences(pid, sidx, refs...);
-  }
-
-  template <typename... T>
-  void RefsToSet(std::set<int64_t>* m, int64_t ref, T... refs) const {
-    m->insert(ref + kUnwrappedSequenceStart);
-    RefsToSet(m, refs...);
-  }
-
-  void RefsToSet(std::set<int64_t>* m) const {}
-
-  Random rand_;
-  rtc::scoped_refptr<FakePacketBuffer> ref_packet_buffer_;
-  std::unique_ptr<RtpFrameReferenceFinder> reference_finder_;
-  struct FrameComp {
-    bool operator()(const std::pair<int64_t, uint8_t> f1,
-                    const std::pair<int64_t, uint8_t> f2) const {
-      if (f1.first == f2.first)
-        return f1.second < f2.second;
-      return f1.first < f2.first;
-    }
-  };
-  std::map<std::pair<int64_t, uint8_t>, std::unique_ptr<FrameObject>, FrameComp>
-      frames_from_callback_;
-};
-
-TEST_F(TestRtpFrameReferenceFinder, PaddingPackets) {
-  uint16_t sn = Rand();
-
-  InsertGeneric(sn, sn, true);
-  InsertGeneric(sn + 2, sn + 2, false);
-  EXPECT_EQ(1UL, frames_from_callback_.size());
-  reference_finder_->PaddingReceived(sn + 1);
-  EXPECT_EQ(2UL, frames_from_callback_.size());
-}
-
-TEST_F(TestRtpFrameReferenceFinder, PaddingPacketsReordered) {
-  uint16_t sn = Rand();
-
-  InsertGeneric(sn, sn, true);
-  reference_finder_->PaddingReceived(sn + 1);
-  reference_finder_->PaddingReceived(sn + 4);
-  InsertGeneric(sn + 2, sn + 3, false);
-
-  EXPECT_EQ(2UL, frames_from_callback_.size());
-  CheckReferencesGeneric(0);
-  CheckReferencesGeneric(3, 0);
-}
-
-TEST_F(TestRtpFrameReferenceFinder, PaddingPacketsReorderedMultipleKeyframes) {
-  uint16_t sn = Rand();
-
-  InsertGeneric(sn, sn, true);
-  reference_finder_->PaddingReceived(sn + 1);
-  reference_finder_->PaddingReceived(sn + 4);
-  InsertGeneric(sn + 2, sn + 3, false);
-  InsertGeneric(sn + 5, sn + 5, true);
-  reference_finder_->PaddingReceived(sn + 6);
-  reference_finder_->PaddingReceived(sn + 9);
-  InsertGeneric(sn + 7, sn + 8, false);
-
-  EXPECT_EQ(4UL, frames_from_callback_.size());
-}
-
-TEST_F(TestRtpFrameReferenceFinder, AdvanceSavedKeyframe) {
-  uint16_t sn = Rand();
-
-  InsertGeneric(sn, sn, true);
-  InsertGeneric(sn + 1, sn + 1, true);
-  InsertGeneric(sn + 2, sn + 10000, false);
-  InsertGeneric(sn + 10001, sn + 20000, false);
-  InsertGeneric(sn + 20001, sn + 30000, false);
-  InsertGeneric(sn + 30001, sn + 40000, false);
-
-  EXPECT_EQ(6UL, frames_from_callback_.size());
-}
-
-TEST_F(TestRtpFrameReferenceFinder, ClearTo) {
-  uint16_t sn = Rand();
-
-  InsertGeneric(sn, sn + 1, true);
-  InsertGeneric(sn + 4, sn + 5, false);  // stashed
-  EXPECT_EQ(1UL, frames_from_callback_.size());
-
-  InsertGeneric(sn + 6, sn + 7, true);  // keyframe
-  EXPECT_EQ(2UL, frames_from_callback_.size());
-  reference_finder_->ClearTo(sn + 7);
-
-  InsertGeneric(sn + 8, sn + 9, false);  // first frame after keyframe.
-  EXPECT_EQ(3UL, frames_from_callback_.size());
-
-  InsertGeneric(sn + 2, sn + 3, false);  // late, cleared past this frame.
-  EXPECT_EQ(3UL, frames_from_callback_.size());
-}
-
-TEST_F(TestRtpFrameReferenceFinder, Vp8NoPictureId) {
-  uint16_t sn = Rand();
-
-  InsertVp8(sn, sn + 2, true);
-  ASSERT_EQ(1UL, frames_from_callback_.size());
-
-  InsertVp8(sn + 3, sn + 4, false);
-  ASSERT_EQ(2UL, frames_from_callback_.size());
-
-  InsertVp8(sn + 5, sn + 8, false);
-  ASSERT_EQ(3UL, frames_from_callback_.size());
-
-  InsertVp8(sn + 9, sn + 9, false);
-  ASSERT_EQ(4UL, frames_from_callback_.size());
-
-  InsertVp8(sn + 10, sn + 11, false);
-  ASSERT_EQ(5UL, frames_from_callback_.size());
-
-  InsertVp8(sn + 12, sn + 12, true);
-  ASSERT_EQ(6UL, frames_from_callback_.size());
-
-  InsertVp8(sn + 13, sn + 17, false);
-  ASSERT_EQ(7UL, frames_from_callback_.size());
-
-  InsertVp8(sn + 18, sn + 18, false);
-  ASSERT_EQ(8UL, frames_from_callback_.size());
-
-  InsertVp8(sn + 19, sn + 20, false);
-  ASSERT_EQ(9UL, frames_from_callback_.size());
-
-  InsertVp8(sn + 21, sn + 21, false);
-
-  ASSERT_EQ(10UL, frames_from_callback_.size());
-  CheckReferencesVp8(0);
-  CheckReferencesVp8(2, 0);
-  CheckReferencesVp8(6, 2);
-  CheckReferencesVp8(7, 6);
-  CheckReferencesVp8(9, 7);
-  CheckReferencesVp8(10);
-  CheckReferencesVp8(15, 10);
-  CheckReferencesVp8(16, 15);
-  CheckReferencesVp8(18, 16);
-  CheckReferencesVp8(19, 18);
-}
-
-TEST_F(TestRtpFrameReferenceFinder, Vp8NoPictureIdReordered) {
-  uint16_t sn = 0xfffa;
-
-  InsertVp8(sn, sn + 2, true);
-  InsertVp8(sn + 3, sn + 4, false);
-  InsertVp8(sn + 5, sn + 8, false);
-  InsertVp8(sn + 9, sn + 9, false);
-  InsertVp8(sn + 10, sn + 11, false);
-  InsertVp8(sn + 12, sn + 12, true);
-  InsertVp8(sn + 13, sn + 17, false);
-  InsertVp8(sn + 18, sn + 18, false);
-  InsertVp8(sn + 19, sn + 20, false);
-  InsertVp8(sn + 21, sn + 21, false);
-
-  ASSERT_EQ(10UL, frames_from_callback_.size());
-  CheckReferencesVp8(0);
-  CheckReferencesVp8(2, 0);
-  CheckReferencesVp8(6, 2);
-  CheckReferencesVp8(7, 6);
-  CheckReferencesVp8(9, 7);
-  CheckReferencesVp8(10);
-  CheckReferencesVp8(15, 10);
-  CheckReferencesVp8(16, 15);
-  CheckReferencesVp8(18, 16);
-  CheckReferencesVp8(19, 18);
-}
-
-TEST_F(TestRtpFrameReferenceFinder, Vp8KeyFrameReferences) {
-  uint16_t sn = Rand();
-  InsertVp8(sn, sn, true);
-
-  ASSERT_EQ(1UL, frames_from_callback_.size());
-  CheckReferencesVp8(0);
-}
-
-// Test with 1 temporal layer.
-TEST_F(TestRtpFrameReferenceFinder, Vp8TemporalLayers_0) {
-  uint16_t pid = Rand();
-  uint16_t sn = Rand();
-
-  InsertVp8(sn, sn, true, pid, 0, 1);
-  InsertVp8(sn + 1, sn + 1, false, pid + 1, 0, 2);
-  InsertVp8(sn + 2, sn + 2, false, pid + 2, 0, 3);
-  InsertVp8(sn + 3, sn + 3, false, pid + 3, 0, 4);
-
-  ASSERT_EQ(4UL, frames_from_callback_.size());
-  CheckReferencesVp8(0);
-  CheckReferencesVp8(1, 0);
-  CheckReferencesVp8(2, 1);
-  CheckReferencesVp8(3, 2);
-}
-
-TEST_F(TestRtpFrameReferenceFinder, Vp8DuplicateTl1Frames) {
-  uint16_t pid = Rand();
-  uint16_t sn = Rand();
-
-  InsertVp8(sn, sn, true, pid, 0, 0);
-  InsertVp8(sn + 1, sn + 1, false, pid + 1, 1, 0, true);
-  InsertVp8(sn + 2, sn + 2, false, pid + 2, 0, 1);
-  InsertVp8(sn + 3, sn + 3, false, pid + 3, 1, 1);
-  InsertVp8(sn + 3, sn + 3, false, pid + 3, 1, 1);
-  InsertVp8(sn + 4, sn + 4, false, pid + 4, 0, 2);
-  InsertVp8(sn + 5, sn + 5, false, pid + 5, 1, 2);
-
-  ASSERT_EQ(6UL, frames_from_callback_.size());
-  CheckReferencesVp8(0);
-  CheckReferencesVp8(1, 0);
-  CheckReferencesVp8(2, 0);
-  CheckReferencesVp8(3, 1, 2);
-  CheckReferencesVp8(4, 2);
-  CheckReferencesVp8(5, 3, 4);
-}
-
-// Test with 1 temporal layer.
-TEST_F(TestRtpFrameReferenceFinder, Vp8TemporalLayersReordering_0) {
-  uint16_t pid = Rand();
-  uint16_t sn = Rand();
-
-  InsertVp8(sn, sn, true, pid, 0, 1);
-  InsertVp8(sn + 1, sn + 1, false, pid + 1, 0, 2);
-  InsertVp8(sn + 3, sn + 3, false, pid + 3, 0, 4);
-  InsertVp8(sn + 2, sn + 2, false, pid + 2, 0, 3);
-  InsertVp8(sn + 5, sn + 5, false, pid + 5, 0, 6);
-  InsertVp8(sn + 6, sn + 6, false, pid + 6, 0, 7);
-  InsertVp8(sn + 4, sn + 4, false, pid + 4, 0, 5);
-
-  ASSERT_EQ(7UL, frames_from_callback_.size());
-  CheckReferencesVp8(0);
-  CheckReferencesVp8(1, 0);
-  CheckReferencesVp8(2, 1);
-  CheckReferencesVp8(3, 2);
-  CheckReferencesVp8(4, 3);
-  CheckReferencesVp8(5, 4);
-  CheckReferencesVp8(6, 5);
-}
-
-// Test with 2 temporal layers in a 01 pattern.
-TEST_F(TestRtpFrameReferenceFinder, Vp8TemporalLayers_01) {
-  uint16_t pid = Rand();
-  uint16_t sn = Rand();
-
-  InsertVp8(sn, sn, true, pid, 0, 255);
-  InsertVp8(sn + 1, sn + 1, false, pid + 1, 1, 255, true);
-  InsertVp8(sn + 2, sn + 2, false, pid + 2, 0, 0);
-  InsertVp8(sn + 3, sn + 3, false, pid + 3, 1, 0);
-
-  ASSERT_EQ(4UL, frames_from_callback_.size());
-  CheckReferencesVp8(0);
-  CheckReferencesVp8(1, 0);
-  CheckReferencesVp8(2, 0);
-  CheckReferencesVp8(3, 1, 2);
-}
-
-// Test with 2 temporal layers in a 01 pattern.
-TEST_F(TestRtpFrameReferenceFinder, Vp8TemporalLayersReordering_01) {
-  uint16_t pid = Rand();
-  uint16_t sn = Rand();
-
-  InsertVp8(sn + 1, sn + 1, false, pid + 1, 1, 255, true);
-  InsertVp8(sn, sn, true, pid, 0, 255);
-  InsertVp8(sn + 3, sn + 3, false, pid + 3, 1, 0);
-  InsertVp8(sn + 5, sn + 5, false, pid + 5, 1, 1);
-  InsertVp8(sn + 2, sn + 2, false, pid + 2, 0, 0);
-  InsertVp8(sn + 4, sn + 4, false, pid + 4, 0, 1);
-  InsertVp8(sn + 6, sn + 6, false, pid + 6, 0, 2);
-  InsertVp8(sn + 7, sn + 7, false, pid + 7, 1, 2);
-
-  ASSERT_EQ(8UL, frames_from_callback_.size());
-  CheckReferencesVp8(0);
-  CheckReferencesVp8(1, 0);
-  CheckReferencesVp8(2, 0);
-  CheckReferencesVp8(3, 1, 2);
-  CheckReferencesVp8(4, 2);
-  CheckReferencesVp8(5, 3, 4);
-  CheckReferencesVp8(6, 4);
-  CheckReferencesVp8(7, 5, 6);
-}
-
-// Test with 3 temporal layers in a 0212 pattern.
-TEST_F(TestRtpFrameReferenceFinder, Vp8TemporalLayers_0212) {
-  uint16_t pid = Rand();
-  uint16_t sn = Rand();
-
-  InsertVp8(sn, sn, true, pid, 0, 55);
-  InsertVp8(sn + 1, sn + 1, false, pid + 1, 2, 55, true);
-  InsertVp8(sn + 2, sn + 2, false, pid + 2, 1, 55, true);
-  InsertVp8(sn + 3, sn + 3, false, pid + 3, 2, 55);
-  InsertVp8(sn + 4, sn + 4, false, pid + 4, 0, 56);
-  InsertVp8(sn + 5, sn + 5, false, pid + 5, 2, 56);
-  InsertVp8(sn + 6, sn + 6, false, pid + 6, 1, 56);
-  InsertVp8(sn + 7, sn + 7, false, pid + 7, 2, 56);
-  InsertVp8(sn + 8, sn + 8, false, pid + 8, 0, 57);
-  InsertVp8(sn + 9, sn + 9, false, pid + 9, 2, 57, true);
-  InsertVp8(sn + 10, sn + 10, false, pid + 10, 1, 57, true);
-  InsertVp8(sn + 11, sn + 11, false, pid + 11, 2, 57);
-
-  ASSERT_EQ(12UL, frames_from_callback_.size());
-  CheckReferencesVp8(0);
-  CheckReferencesVp8(1, 0);
-  CheckReferencesVp8(2, 0);
-  CheckReferencesVp8(3, 0, 1, 2);
-  CheckReferencesVp8(4, 0);
-  CheckReferencesVp8(5, 2, 3, 4);
-  CheckReferencesVp8(6, 2, 4);
-  CheckReferencesVp8(7, 4, 5, 6);
-  CheckReferencesVp8(8, 4);
-  CheckReferencesVp8(9, 8);
-  CheckReferencesVp8(10, 8);
-  CheckReferencesVp8(11, 8, 9, 10);
-}
-
-// Test with 3 temporal layers in a 0212 pattern.
-TEST_F(TestRtpFrameReferenceFinder, Vp8TemporalLayersMissingFrame_0212) {
-  uint16_t pid = Rand();
-  uint16_t sn = Rand();
-
-  InsertVp8(sn, sn, true, pid, 0, 55, false);
-  InsertVp8(sn + 2, sn + 2, false, pid + 2, 1, 55, true);
-  InsertVp8(sn + 3, sn + 3, false, pid + 3, 2, 55, false);
-
-  ASSERT_EQ(2UL, frames_from_callback_.size());
-  CheckReferencesVp8(0);
-  CheckReferencesVp8(2, 0);
-}
-
-// Test with 3 temporal layers in a 0212 pattern.
-TEST_F(TestRtpFrameReferenceFinder, Vp8TemporalLayersReordering_0212) {
-  uint16_t pid = 126;
-  uint16_t sn = Rand();
-
-  InsertVp8(sn + 1, sn + 1, false, pid + 1, 2, 55, true);
-  InsertVp8(sn, sn, true, pid, 0, 55, false);
-  InsertVp8(sn + 2, sn + 2, false, pid + 2, 1, 55, true);
-  InsertVp8(sn + 4, sn + 4, false, pid + 4, 0, 56, false);
-  InsertVp8(sn + 5, sn + 5, false, pid + 5, 2, 56, false);
-  InsertVp8(sn + 3, sn + 3, false, pid + 3, 2, 55, false);
-  InsertVp8(sn + 7, sn + 7, false, pid + 7, 2, 56, false);
-  InsertVp8(sn + 9, sn + 9, false, pid + 9, 2, 57, true);
-  InsertVp8(sn + 6, sn + 6, false, pid + 6, 1, 56, false);
-  InsertVp8(sn + 8, sn + 8, false, pid + 8, 0, 57, false);
-  InsertVp8(sn + 11, sn + 11, false, pid + 11, 2, 57, false);
-  InsertVp8(sn + 10, sn + 10, false, pid + 10, 1, 57, true);
-
-  ASSERT_EQ(12UL, frames_from_callback_.size());
-  CheckReferencesVp8(0);
-  CheckReferencesVp8(1, 0);
-  CheckReferencesVp8(2, 0);
-  CheckReferencesVp8(3, 0, 1, 2);
-  CheckReferencesVp8(4, 0);
-  CheckReferencesVp8(5, 2, 3, 4);
-  CheckReferencesVp8(6, 2, 4);
-  CheckReferencesVp8(7, 4, 5, 6);
-  CheckReferencesVp8(8, 4);
-  CheckReferencesVp8(9, 8);
-  CheckReferencesVp8(10, 8);
-  CheckReferencesVp8(11, 8, 9, 10);
-}
-
-TEST_F(TestRtpFrameReferenceFinder, Vp8InsertManyFrames_0212) {
-  uint16_t pid = Rand();
-  uint16_t sn = Rand();
-
-  const int keyframes_to_insert = 50;
-  const int frames_per_keyframe = 120;  // Should be a multiple of 4.
-  int64_t offset = 0;
-  uint8_t tl0 = 128;
-
-  for (int k = 0; k < keyframes_to_insert; ++k) {
-    InsertVp8(sn, sn, true, pid, 0, tl0, false);
-    InsertVp8(sn + 1, sn + 1, false, pid + 1, 2, tl0, true);
-    InsertVp8(sn + 2, sn + 2, false, pid + 2, 1, tl0, true);
-    InsertVp8(sn + 3, sn + 3, false, pid + 3, 2, tl0, false);
-    CheckReferencesVp8(offset);
-    CheckReferencesVp8(offset + 1, offset);
-    CheckReferencesVp8(offset + 2, offset);
-    CheckReferencesVp8(offset + 3, offset, offset + 1, offset + 2);
-    frames_from_callback_.clear();
-    ++tl0;
-
-    for (int f = 4; f < frames_per_keyframe; f += 4) {
-      uint16_t sf = sn + f;
-      uint16_t pidf = pid + f;
-      int64_t offsetf = offset + f;
-
-      InsertVp8(sf, sf, false, pidf, 0, tl0, false);
-      InsertVp8(sf + 1, sf + 1, false, pidf + 1, 2, tl0, false);
-      InsertVp8(sf + 2, sf + 2, false, pidf + 2, 1, tl0, false);
-      InsertVp8(sf + 3, sf + 3, false, pidf + 3, 2, tl0, false);
-      CheckReferencesVp8(offsetf, offsetf - 4);
-      CheckReferencesVp8(offsetf + 1, offsetf, offsetf - 1, offsetf - 2);
-      CheckReferencesVp8(offsetf + 2, offsetf, offsetf - 2);
-      CheckReferencesVp8(offsetf + 3, offsetf, offsetf + 1, offsetf + 2);
-      frames_from_callback_.clear();
-      ++tl0;
-    }
-
-    offset += frames_per_keyframe;
-    pid += frames_per_keyframe;
-    sn += frames_per_keyframe;
-  }
-}
-
-TEST_F(TestRtpFrameReferenceFinder, Vp8LayerSync) {
-  uint16_t pid = Rand();
-  uint16_t sn = Rand();
-
-  InsertVp8(sn, sn, true, pid, 0, 0, false);
-  InsertVp8(sn + 1, sn + 1, false, pid + 1, 1, 0, true);
-  InsertVp8(sn + 2, sn + 2, false, pid + 2, 0, 1, false);
-  ASSERT_EQ(3UL, frames_from_callback_.size());
-
-  InsertVp8(sn + 4, sn + 4, false, pid + 4, 0, 2, false);
-  InsertVp8(sn + 5, sn + 5, false, pid + 5, 1, 2, true);
-  InsertVp8(sn + 6, sn + 6, false, pid + 6, 0, 3, false);
-  InsertVp8(sn + 7, sn + 7, false, pid + 7, 1, 3, false);
-
-  ASSERT_EQ(7UL, frames_from_callback_.size());
-  CheckReferencesVp8(0);
-  CheckReferencesVp8(1, 0);
-  CheckReferencesVp8(2, 0);
-  CheckReferencesVp8(4, 2);
-  CheckReferencesVp8(5, 4);
-  CheckReferencesVp8(6, 4);
-  CheckReferencesVp8(7, 6, 5);
-}
-
-TEST_F(TestRtpFrameReferenceFinder, Vp8Tl1SyncFrameAfterTl1Frame) {
-  InsertVp8(1000, 1000, true, 1, 0, 247, true);
-  InsertVp8(1001, 1001, false, 3, 0, 248, false);
-  InsertVp8(1002, 1002, false, 4, 1, 248, false);  // Will be dropped
-  InsertVp8(1003, 1003, false, 5, 1, 248, true);   // due to this frame.
-
-  ASSERT_EQ(3UL, frames_from_callback_.size());
-  CheckReferencesVp8(0);
-  CheckReferencesVp8(2, 0);
-  CheckReferencesVp8(4, 2);
-}
-
-TEST_F(TestRtpFrameReferenceFinder, Vp8DetectMissingFrame_0212) {
-  InsertVp8(1, 1, true, 1, 0, 1, false);
-  InsertVp8(2, 2, false, 2, 2, 1, true);
-  InsertVp8(3, 3, false, 3, 1, 1, true);
-  InsertVp8(4, 4, false, 4, 2, 1, false);
-
-  InsertVp8(6, 6, false, 6, 2, 2, false);
-  InsertVp8(7, 7, false, 7, 1, 2, false);
-  InsertVp8(8, 8, false, 8, 2, 2, false);
-  ASSERT_EQ(4UL, frames_from_callback_.size());
-
-  InsertVp8(5, 5, false, 5, 0, 2, false);
-  ASSERT_EQ(8UL, frames_from_callback_.size());
-
-  CheckReferencesVp8(0);
-  CheckReferencesVp8(1, 0);
-  CheckReferencesVp8(2, 0);
-  CheckReferencesVp8(3, 2, 1, 0);
-
-  CheckReferencesVp8(4, 0);
-  CheckReferencesVp8(5, 4, 3, 2);
-  CheckReferencesVp8(6, 4, 2);
-  CheckReferencesVp8(7, 6, 5, 4);
-}
-
-TEST_F(TestRtpFrameReferenceFinder, Vp9GofInsertOneFrame) {
-  uint16_t pid = Rand();
-  uint16_t sn = Rand();
-  GofInfoVP9 ss;
-  ss.SetGofInfoVP9(kTemporalStructureMode1);
-
-  InsertVp9Gof(sn, sn, true, pid, 0, 0, 0, false, &ss);
-
-  CheckReferencesVp9(0, 0);
-}
-
-TEST_F(TestRtpFrameReferenceFinder, Vp9NoPictureIdReordered) {
-  uint16_t sn = 0xfffa;
-
-  InsertVp9Gof(sn, sn + 2, true);
-  InsertVp9Gof(sn + 3, sn + 4, false);
-  InsertVp9Gof(sn + 9, sn + 9, false);
-  InsertVp9Gof(sn + 5, sn + 8, false);
-  InsertVp9Gof(sn + 12, sn + 12, true);
-  InsertVp9Gof(sn + 10, sn + 11, false);
-  InsertVp9Gof(sn + 13, sn + 17, false);
-  InsertVp9Gof(sn + 19, sn + 20, false);
-  InsertVp9Gof(sn + 21, sn + 21, false);
-  InsertVp9Gof(sn + 18, sn + 18, false);
-
-  ASSERT_EQ(10UL, frames_from_callback_.size());
-  CheckReferencesVp9(0, 0);
-  CheckReferencesVp9(2, 0, 0);
-  CheckReferencesVp9(6, 0, 2);
-  CheckReferencesVp9(7, 0, 6);
-  CheckReferencesVp9(9, 0, 7);
-  CheckReferencesVp9(10, 0);
-  CheckReferencesVp9(15, 0, 10);
-  CheckReferencesVp9(16, 0, 15);
-  CheckReferencesVp9(18, 0, 16);
-  CheckReferencesVp9(19, 0, 18);
-}
-
-TEST_F(TestRtpFrameReferenceFinder, Vp9GofTemporalLayers_0) {
-  uint16_t pid = Rand();
-  uint16_t sn = Rand();
-  GofInfoVP9 ss;
-  ss.SetGofInfoVP9(kTemporalStructureMode1);  // Only 1 spatial layer.
-
-  InsertVp9Gof(sn, sn, true, pid, 0, 0, 0, false, &ss);
-  InsertVp9Gof(sn + 1, sn + 1, false, pid + 1, 0, 0, 1, false);
-  InsertVp9Gof(sn + 2, sn + 2, false, pid + 2, 0, 0, 2, false);
-  InsertVp9Gof(sn + 3, sn + 3, false, pid + 3, 0, 0, 3, false);
-  InsertVp9Gof(sn + 4, sn + 4, false, pid + 4, 0, 0, 4, false);
-  InsertVp9Gof(sn + 5, sn + 5, false, pid + 5, 0, 0, 5, false);
-  InsertVp9Gof(sn + 6, sn + 6, false, pid + 6, 0, 0, 6, false);
-  InsertVp9Gof(sn + 7, sn + 7, false, pid + 7, 0, 0, 7, false);
-  InsertVp9Gof(sn + 8, sn + 8, false, pid + 8, 0, 0, 8, false);
-  InsertVp9Gof(sn + 9, sn + 9, false, pid + 9, 0, 0, 9, false);
-  InsertVp9Gof(sn + 10, sn + 10, false, pid + 10, 0, 0, 10, false);
-  InsertVp9Gof(sn + 11, sn + 11, false, pid + 11, 0, 0, 11, false);
-  InsertVp9Gof(sn + 12, sn + 12, false, pid + 12, 0, 0, 12, false);
-  InsertVp9Gof(sn + 13, sn + 13, false, pid + 13, 0, 0, 13, false);
-  InsertVp9Gof(sn + 14, sn + 14, false, pid + 14, 0, 0, 14, false);
-  InsertVp9Gof(sn + 15, sn + 15, false, pid + 15, 0, 0, 15, false);
-  InsertVp9Gof(sn + 16, sn + 16, false, pid + 16, 0, 0, 16, false);
-  InsertVp9Gof(sn + 17, sn + 17, false, pid + 17, 0, 0, 17, false);
-  InsertVp9Gof(sn + 18, sn + 18, false, pid + 18, 0, 0, 18, false);
-  InsertVp9Gof(sn + 19, sn + 19, false, pid + 19, 0, 0, 19, false);
-
-  ASSERT_EQ(20UL, frames_from_callback_.size());
-  CheckReferencesVp9(0, 0);
-  CheckReferencesVp9(1, 0, 0);
-  CheckReferencesVp9(2, 0, 1);
-  CheckReferencesVp9(3, 0, 2);
-  CheckReferencesVp9(4, 0, 3);
-  CheckReferencesVp9(5, 0, 4);
-  CheckReferencesVp9(6, 0, 5);
-  CheckReferencesVp9(7, 0, 6);
-  CheckReferencesVp9(8, 0, 7);
-  CheckReferencesVp9(9, 0, 8);
-  CheckReferencesVp9(10, 0, 9);
-  CheckReferencesVp9(11, 0, 10);
-  CheckReferencesVp9(12, 0, 11);
-  CheckReferencesVp9(13, 0, 12);
-  CheckReferencesVp9(14, 0, 13);
-  CheckReferencesVp9(15, 0, 14);
-  CheckReferencesVp9(16, 0, 15);
-  CheckReferencesVp9(17, 0, 16);
-  CheckReferencesVp9(18, 0, 17);
-  CheckReferencesVp9(19, 0, 18);
-}
-
-TEST_F(TestRtpFrameReferenceFinder, Vp9GofTemporalLayersReordered_0) {
-  uint16_t pid = Rand();
-  uint16_t sn = Rand();
-  GofInfoVP9 ss;
-  ss.SetGofInfoVP9(kTemporalStructureMode1);  // Only 1 spatial layer.
-
-  InsertVp9Gof(sn + 2, sn + 2, false, pid + 2, 0, 0, 2, false);
-  InsertVp9Gof(sn + 1, sn + 1, false, pid + 1, 0, 0, 1, false);
-  InsertVp9Gof(sn, sn, true, pid, 0, 0, 0, false, &ss);
-  InsertVp9Gof(sn + 4, sn + 4, false, pid + 4, 0, 0, 4, false);
-  InsertVp9Gof(sn + 3, sn + 3, false, pid + 3, 0, 0, 3, false);
-  InsertVp9Gof(sn + 5, sn + 5, false, pid + 5, 0, 0, 5, false);
-  InsertVp9Gof(sn + 7, sn + 7, false, pid + 7, 0, 0, 7, false);
-  InsertVp9Gof(sn + 6, sn + 6, false, pid + 6, 0, 0, 6, false);
-  InsertVp9Gof(sn + 8, sn + 8, false, pid + 8, 0, 0, 8, false);
-  InsertVp9Gof(sn + 10, sn + 10, false, pid + 10, 0, 0, 10, false);
-  InsertVp9Gof(sn + 13, sn + 13, false, pid + 13, 0, 0, 13, false);
-  InsertVp9Gof(sn + 11, sn + 11, false, pid + 11, 0, 0, 11, false);
-  InsertVp9Gof(sn + 9, sn + 9, false, pid + 9, 0, 0, 9, false);
-  InsertVp9Gof(sn + 16, sn + 16, false, pid + 16, 0, 0, 16, false);
-  InsertVp9Gof(sn + 14, sn + 14, false, pid + 14, 0, 0, 14, false);
-  InsertVp9Gof(sn + 15, sn + 15, false, pid + 15, 0, 0, 15, false);
-  InsertVp9Gof(sn + 12, sn + 12, false, pid + 12, 0, 0, 12, false);
-  InsertVp9Gof(sn + 17, sn + 17, false, pid + 17, 0, 0, 17, false);
-  InsertVp9Gof(sn + 19, sn + 19, false, pid + 19, 0, 0, 19, false);
-  InsertVp9Gof(sn + 18, sn + 18, false, pid + 18, 0, 0, 18, false);
-
-  ASSERT_EQ(20UL, frames_from_callback_.size());
-  CheckReferencesVp9(0, 0);
-  CheckReferencesVp9(1, 0, 0);
-  CheckReferencesVp9(2, 0, 1);
-  CheckReferencesVp9(3, 0, 2);
-  CheckReferencesVp9(4, 0, 3);
-  CheckReferencesVp9(5, 0, 4);
-  CheckReferencesVp9(6, 0, 5);
-  CheckReferencesVp9(7, 0, 6);
-  CheckReferencesVp9(8, 0, 7);
-  CheckReferencesVp9(9, 0, 8);
-  CheckReferencesVp9(10, 0, 9);
-  CheckReferencesVp9(11, 0, 10);
-  CheckReferencesVp9(12, 0, 11);
-  CheckReferencesVp9(13, 0, 12);
-  CheckReferencesVp9(14, 0, 13);
-  CheckReferencesVp9(15, 0, 14);
-  CheckReferencesVp9(16, 0, 15);
-  CheckReferencesVp9(17, 0, 16);
-  CheckReferencesVp9(18, 0, 17);
-  CheckReferencesVp9(19, 0, 18);
-}
-
-TEST_F(TestRtpFrameReferenceFinder, Vp9GofSkipFramesTemporalLayers_01) {
-  uint16_t pid = Rand();
-  uint16_t sn = Rand();
-  GofInfoVP9 ss;
-  ss.SetGofInfoVP9(kTemporalStructureMode2);  // 0101 pattern
-
-  InsertVp9Gof(sn, sn, true, pid, 0, 0, 0, false, &ss);
-  InsertVp9Gof(sn + 1, sn + 1, false, pid + 1, 0, 1, 0, false);
-  // Skip GOF with tl0 1
-  InsertVp9Gof(sn + 4, sn + 4, true, pid + 4, 0, 0, 2, false, &ss);
-  InsertVp9Gof(sn + 5, sn + 5, false, pid + 5, 0, 1, 2, false);
-  // Skip GOF with tl0 3
-  // Skip GOF with tl0 4
-  InsertVp9Gof(sn + 10, sn + 10, false, pid + 10, 0, 0, 5, false, &ss);
-  InsertVp9Gof(sn + 11, sn + 11, false, pid + 11, 0, 1, 5, false);
-
-  ASSERT_EQ(6UL, frames_from_callback_.size());
-  CheckReferencesVp9(0, 0);
-  CheckReferencesVp9(1, 0, 0);
-  CheckReferencesVp9(4, 0);
-  CheckReferencesVp9(5, 0, 4);
-  CheckReferencesVp9(10, 0, 8);
-  CheckReferencesVp9(11, 0, 10);
-}
-
-TEST_F(TestRtpFrameReferenceFinder, Vp9GofSkipFramesTemporalLayers_0212) {
-  uint16_t pid = Rand();
-  uint16_t sn = Rand();
-  GofInfoVP9 ss;
-  ss.SetGofInfoVP9(kTemporalStructureMode3);  // 02120212 pattern
-
-  InsertVp9Gof(sn, sn, true, pid, 0, 0, 0, false, &ss);
-  InsertVp9Gof(sn + 1, sn + 1, false, pid + 1, 0, 2, 0, false);
-  InsertVp9Gof(sn + 2, sn + 2, false, pid + 2, 0, 1, 0, false);
-  InsertVp9Gof(sn + 3, sn + 3, false, pid + 3, 0, 2, 0, false);
-
-  ASSERT_EQ(4UL, frames_from_callback_.size());
-  CheckReferencesVp9(0, 0);
-  CheckReferencesVp9(1, 0, 0);
-  CheckReferencesVp9(2, 0, 0);
-  CheckReferencesVp9(3, 0, 1, 2);
-
-  // Skip frames with tl0 = 1
-
-  InsertVp9Gof(sn + 8, sn + 8, true, pid + 8, 0, 0, 2, false, &ss);
-  InsertVp9Gof(sn + 9, sn + 9, false, pid + 9, 0, 2, 2, false);
-  InsertVp9Gof(sn + 10, sn + 10, false, pid + 10, 0, 1, 2, false);
-  InsertVp9Gof(sn + 11, sn + 11, false, pid + 11, 0, 2, 2, false);
-
-  ASSERT_EQ(8UL, frames_from_callback_.size());
-  CheckReferencesVp9(8, 0);
-  CheckReferencesVp9(9, 0, 8);
-  CheckReferencesVp9(10, 0, 8);
-  CheckReferencesVp9(11, 0, 9, 10);
-
-  // Now insert frames with tl0 = 1
-  InsertVp9Gof(sn + 4, sn + 4, true, pid + 4, 0, 0, 1, false, &ss);
-  InsertVp9Gof(sn + 7, sn + 7, false, pid + 7, 0, 2, 1, false);
-
-  ASSERT_EQ(9UL, frames_from_callback_.size());
-  CheckReferencesVp9(4, 0);
-
-  // Rest of frames belonging to tl0 = 1
-  InsertVp9Gof(sn + 5, sn + 5, false, pid + 5, 0, 2, 1, false);
-  InsertVp9Gof(sn + 6, sn + 6, false, pid + 6, 0, 1, 1, true);  // up-switch
-
-  ASSERT_EQ(12UL, frames_from_callback_.size());
-  CheckReferencesVp9(5, 0, 4);
-  CheckReferencesVp9(6, 0, 4);
-  CheckReferencesVp9(7, 0, 6);
-}
-
-TEST_F(TestRtpFrameReferenceFinder, Vp9GofTemporalLayers_01) {
-  uint16_t pid = Rand();
-  uint16_t sn = Rand();
-  GofInfoVP9 ss;
-  ss.SetGofInfoVP9(kTemporalStructureMode2);  // 0101 pattern
-
-  InsertVp9Gof(sn, sn, true, pid, 0, 0, 0, false, &ss);
-  InsertVp9Gof(sn + 1, sn + 1, false, pid + 1, 0, 1, 0, false);
-  InsertVp9Gof(sn + 2, sn + 2, false, pid + 2, 0, 0, 1, false);
-  InsertVp9Gof(sn + 3, sn + 3, false, pid + 3, 0, 1, 1, false);
-  InsertVp9Gof(sn + 4, sn + 4, false, pid + 4, 0, 0, 2, false);
-  InsertVp9Gof(sn + 5, sn + 5, false, pid + 5, 0, 1, 2, false);
-  InsertVp9Gof(sn + 6, sn + 6, false, pid + 6, 0, 0, 3, false);
-  InsertVp9Gof(sn + 7, sn + 7, false, pid + 7, 0, 1, 3, false);
-  InsertVp9Gof(sn + 8, sn + 8, false, pid + 8, 0, 0, 4, false);
-  InsertVp9Gof(sn + 9, sn + 9, false, pid + 9, 0, 1, 4, false);
-  InsertVp9Gof(sn + 10, sn + 10, false, pid + 10, 0, 0, 5, false);
-  InsertVp9Gof(sn + 11, sn + 11, false, pid + 11, 0, 1, 5, false);
-  InsertVp9Gof(sn + 12, sn + 12, false, pid + 12, 0, 0, 6, false);
-  InsertVp9Gof(sn + 13, sn + 13, false, pid + 13, 0, 1, 6, false);
-  InsertVp9Gof(sn + 14, sn + 14, false, pid + 14, 0, 0, 7, false);
-  InsertVp9Gof(sn + 15, sn + 15, false, pid + 15, 0, 1, 7, false);
-  InsertVp9Gof(sn + 16, sn + 16, false, pid + 16, 0, 0, 8, false);
-  InsertVp9Gof(sn + 17, sn + 17, false, pid + 17, 0, 1, 8, false);
-  InsertVp9Gof(sn + 18, sn + 18, false, pid + 18, 0, 0, 9, false);
-  InsertVp9Gof(sn + 19, sn + 19, false, pid + 19, 0, 1, 9, false);
-
-  ASSERT_EQ(20UL, frames_from_callback_.size());
-  CheckReferencesVp9(0, 0);
-  CheckReferencesVp9(1, 0, 0);
-  CheckReferencesVp9(2, 0, 0);
-  CheckReferencesVp9(3, 0, 2);
-  CheckReferencesVp9(4, 0, 2);
-  CheckReferencesVp9(5, 0, 4);
-  CheckReferencesVp9(6, 0, 4);
-  CheckReferencesVp9(7, 0, 6);
-  CheckReferencesVp9(8, 0, 6);
-  CheckReferencesVp9(9, 0, 8);
-  CheckReferencesVp9(10, 0, 8);
-  CheckReferencesVp9(11, 0, 10);
-  CheckReferencesVp9(12, 0, 10);
-  CheckReferencesVp9(13, 0, 12);
-  CheckReferencesVp9(14, 0, 12);
-  CheckReferencesVp9(15, 0, 14);
-  CheckReferencesVp9(16, 0, 14);
-  CheckReferencesVp9(17, 0, 16);
-  CheckReferencesVp9(18, 0, 16);
-  CheckReferencesVp9(19, 0, 18);
-}
-
-TEST_F(TestRtpFrameReferenceFinder, Vp9GofTemporalLayersReordered_01) {
-  uint16_t pid = Rand();
-  uint16_t sn = Rand();
-  GofInfoVP9 ss;
-  ss.SetGofInfoVP9(kTemporalStructureMode2);  // 01 pattern
-
-  InsertVp9Gof(sn + 1, sn + 1, false, pid + 1, 0, 1, 0, false);
-  InsertVp9Gof(sn, sn, true, pid, 0, 0, 0, false, &ss);
-  InsertVp9Gof(sn + 2, sn + 2, false, pid + 2, 0, 0, 1, false);
-  InsertVp9Gof(sn + 4, sn + 4, false, pid + 4, 0, 0, 2, false);
-  InsertVp9Gof(sn + 3, sn + 3, false, pid + 3, 0, 1, 1, false);
-  InsertVp9Gof(sn + 5, sn + 5, false, pid + 5, 0, 1, 2, false);
-  InsertVp9Gof(sn + 7, sn + 7, false, pid + 7, 0, 1, 3, false);
-  InsertVp9Gof(sn + 6, sn + 6, false, pid + 6, 0, 0, 3, false);
-  InsertVp9Gof(sn + 10, sn + 10, false, pid + 10, 0, 0, 5, false);
-  InsertVp9Gof(sn + 8, sn + 8, false, pid + 8, 0, 0, 4, false);
-  InsertVp9Gof(sn + 9, sn + 9, false, pid + 9, 0, 1, 4, false);
-  InsertVp9Gof(sn + 11, sn + 11, false, pid + 11, 0, 1, 5, false);
-  InsertVp9Gof(sn + 13, sn + 13, false, pid + 13, 0, 1, 6, false);
-  InsertVp9Gof(sn + 16, sn + 16, false, pid + 16, 0, 0, 8, false);
-  InsertVp9Gof(sn + 12, sn + 12, false, pid + 12, 0, 0, 6, false);
-  InsertVp9Gof(sn + 14, sn + 14, false, pid + 14, 0, 0, 7, false);
-  InsertVp9Gof(sn + 17, sn + 17, false, pid + 17, 0, 1, 8, false);
-  InsertVp9Gof(sn + 19, sn + 19, false, pid + 19, 0, 1, 9, false);
-  InsertVp9Gof(sn + 15, sn + 15, false, pid + 15, 0, 1, 7, false);
-  InsertVp9Gof(sn + 18, sn + 18, false, pid + 18, 0, 0, 9, false);
-
-  ASSERT_EQ(20UL, frames_from_callback_.size());
-  CheckReferencesVp9(0, 0);
-  CheckReferencesVp9(1, 0, 0);
-  CheckReferencesVp9(2, 0, 0);
-  CheckReferencesVp9(3, 0, 2);
-  CheckReferencesVp9(4, 0, 2);
-  CheckReferencesVp9(5, 0, 4);
-  CheckReferencesVp9(6, 0, 4);
-  CheckReferencesVp9(7, 0, 6);
-  CheckReferencesVp9(8, 0, 6);
-  CheckReferencesVp9(9, 0, 8);
-  CheckReferencesVp9(10, 0, 8);
-  CheckReferencesVp9(11, 0, 10);
-  CheckReferencesVp9(12, 0, 10);
-  CheckReferencesVp9(13, 0, 12);
-  CheckReferencesVp9(14, 0, 12);
-  CheckReferencesVp9(15, 0, 14);
-  CheckReferencesVp9(16, 0, 14);
-  CheckReferencesVp9(17, 0, 16);
-  CheckReferencesVp9(18, 0, 16);
-  CheckReferencesVp9(19, 0, 18);
-}
-
-TEST_F(TestRtpFrameReferenceFinder, Vp9GofTemporalLayers_0212) {
-  uint16_t pid = Rand();
-  uint16_t sn = Rand();
-  GofInfoVP9 ss;
-  ss.SetGofInfoVP9(kTemporalStructureMode3);  // 0212 pattern
-
-  InsertVp9Gof(sn, sn, true, pid, 0, 0, 0, false, &ss);
-  InsertVp9Gof(sn + 1, sn + 1, false, pid + 1, 0, 2, 0, false);
-  InsertVp9Gof(sn + 2, sn + 2, false, pid + 2, 0, 1, 0, false);
-  InsertVp9Gof(sn + 3, sn + 3, false, pid + 3, 0, 2, 0, false);
-  InsertVp9Gof(sn + 4, sn + 4, false, pid + 4, 0, 0, 1, false);
-  InsertVp9Gof(sn + 5, sn + 5, false, pid + 5, 0, 2, 1, false);
-  InsertVp9Gof(sn + 6, sn + 6, false, pid + 6, 0, 1, 1, false);
-  InsertVp9Gof(sn + 7, sn + 7, false, pid + 7, 0, 2, 1, false);
-  InsertVp9Gof(sn + 8, sn + 8, false, pid + 8, 0, 0, 2, false);
-  InsertVp9Gof(sn + 9, sn + 9, false, pid + 9, 0, 2, 2, false);
-  InsertVp9Gof(sn + 10, sn + 10, false, pid + 10, 0, 1, 2, false);
-  InsertVp9Gof(sn + 11, sn + 11, false, pid + 11, 0, 2, 2, false);
-  InsertVp9Gof(sn + 12, sn + 12, false, pid + 12, 0, 0, 3, false);
-  InsertVp9Gof(sn + 13, sn + 13, false, pid + 13, 0, 2, 3, false);
-  InsertVp9Gof(sn + 14, sn + 14, false, pid + 14, 0, 1, 3, false);
-  InsertVp9Gof(sn + 15, sn + 15, false, pid + 15, 0, 2, 3, false);
-  InsertVp9Gof(sn + 16, sn + 16, false, pid + 16, 0, 0, 4, false);
-  InsertVp9Gof(sn + 17, sn + 17, false, pid + 17, 0, 2, 4, false);
-  InsertVp9Gof(sn + 18, sn + 18, false, pid + 18, 0, 1, 4, false);
-  InsertVp9Gof(sn + 19, sn + 19, false, pid + 19, 0, 2, 4, false);
-
-  ASSERT_EQ(20UL, frames_from_callback_.size());
-  CheckReferencesVp9(0, 0);
-  CheckReferencesVp9(1, 0, 0);
-  CheckReferencesVp9(2, 0, 0);
-  CheckReferencesVp9(3, 0, 1, 2);
-  CheckReferencesVp9(4, 0, 0);
-  CheckReferencesVp9(5, 0, 4);
-  CheckReferencesVp9(6, 0, 4);
-  CheckReferencesVp9(7, 0, 5, 6);
-  CheckReferencesVp9(8, 0, 4);
-  CheckReferencesVp9(9, 0, 8);
-  CheckReferencesVp9(10, 0, 8);
-  CheckReferencesVp9(11, 0, 9, 10);
-  CheckReferencesVp9(12, 0, 8);
-  CheckReferencesVp9(13, 0, 12);
-  CheckReferencesVp9(14, 0, 12);
-  CheckReferencesVp9(15, 0, 13, 14);
-  CheckReferencesVp9(16, 0, 12);
-  CheckReferencesVp9(17, 0, 16);
-  CheckReferencesVp9(18, 0, 16);
-  CheckReferencesVp9(19, 0, 17, 18);
-}
-
-TEST_F(TestRtpFrameReferenceFinder, Vp9GofTemporalLayersReordered_0212) {
-  uint16_t pid = Rand();
-  uint16_t sn = Rand();
-  GofInfoVP9 ss;
-  ss.SetGofInfoVP9(kTemporalStructureMode3);  // 0212 pattern
-
-  InsertVp9Gof(sn + 2, sn + 2, false, pid + 2, 0, 1, 0, false);
-  InsertVp9Gof(sn + 1, sn + 1, false, pid + 1, 0, 2, 0, false);
-  InsertVp9Gof(sn, sn, true, pid, 0, 0, 0, false, &ss);
-  InsertVp9Gof(sn + 3, sn + 3, false, pid + 3, 0, 2, 0, false);
-  InsertVp9Gof(sn + 6, sn + 6, false, pid + 6, 0, 1, 1, false);
-  InsertVp9Gof(sn + 5, sn + 5, false, pid + 5, 0, 2, 1, false);
-  InsertVp9Gof(sn + 4, sn + 4, false, pid + 4, 0, 0, 1, false);
-  InsertVp9Gof(sn + 9, sn + 9, false, pid + 9, 0, 2, 2, false);
-  InsertVp9Gof(sn + 7, sn + 7, false, pid + 7, 0, 2, 1, false);
-  InsertVp9Gof(sn + 8, sn + 8, false, pid + 8, 0, 0, 2, false);
-  InsertVp9Gof(sn + 11, sn + 11, false, pid + 11, 0, 2, 2, false);
-  InsertVp9Gof(sn + 10, sn + 10, false, pid + 10, 0, 1, 2, false);
-  InsertVp9Gof(sn + 13, sn + 13, false, pid + 13, 0, 2, 3, false);
-  InsertVp9Gof(sn + 12, sn + 12, false, pid + 12, 0, 0, 3, false);
-  InsertVp9Gof(sn + 14, sn + 14, false, pid + 14, 0, 1, 3, false);
-  InsertVp9Gof(sn + 16, sn + 16, false, pid + 16, 0, 0, 4, false);
-  InsertVp9Gof(sn + 15, sn + 15, false, pid + 15, 0, 2, 3, false);
-  InsertVp9Gof(sn + 17, sn + 17, false, pid + 17, 0, 2, 4, false);
-  InsertVp9Gof(sn + 19, sn + 19, false, pid + 19, 0, 2, 4, false);
-  InsertVp9Gof(sn + 18, sn + 18, false, pid + 18, 0, 1, 4, false);
-
-  ASSERT_EQ(20UL, frames_from_callback_.size());
-  CheckReferencesVp9(0, 0);
-  CheckReferencesVp9(1, 0, 0);
-  CheckReferencesVp9(2, 0, 0);
-  CheckReferencesVp9(3, 0, 1, 2);
-  CheckReferencesVp9(4, 0, 0);
-  CheckReferencesVp9(5, 0, 4);
-  CheckReferencesVp9(6, 0, 4);
-  CheckReferencesVp9(7, 0, 5, 6);
-  CheckReferencesVp9(8, 0, 4);
-  CheckReferencesVp9(9, 0, 8);
-  CheckReferencesVp9(10, 0, 8);
-  CheckReferencesVp9(11, 0, 9, 10);
-  CheckReferencesVp9(12, 0, 8);
-  CheckReferencesVp9(13, 0, 12);
-  CheckReferencesVp9(14, 0, 12);
-  CheckReferencesVp9(15, 0, 13, 14);
-  CheckReferencesVp9(16, 0, 12);
-  CheckReferencesVp9(17, 0, 16);
-  CheckReferencesVp9(18, 0, 16);
-  CheckReferencesVp9(19, 0, 17, 18);
-}
-
-TEST_F(TestRtpFrameReferenceFinder, Vp9GofTemporalLayersUpSwitch_02120212) {
-  uint16_t pid = Rand();
-  uint16_t sn = Rand();
-  GofInfoVP9 ss;
-  ss.SetGofInfoVP9(kTemporalStructureMode4);  // 02120212 pattern
-
-  InsertVp9Gof(sn, sn, true, pid, 0, 0, 0, false, &ss);
-  InsertVp9Gof(sn + 1, sn + 1, false, pid + 1, 0, 2, 0, false);
-  InsertVp9Gof(sn + 2, sn + 2, false, pid + 2, 0, 1, 0, false);
-  InsertVp9Gof(sn + 3, sn + 3, false, pid + 3, 0, 2, 0, false);
-  InsertVp9Gof(sn + 4, sn + 4, false, pid + 4, 0, 0, 1, false);
-  InsertVp9Gof(sn + 5, sn + 5, false, pid + 5, 0, 2, 1, false);
-  InsertVp9Gof(sn + 6, sn + 6, false, pid + 6, 0, 1, 1, true);
-  InsertVp9Gof(sn + 7, sn + 7, false, pid + 7, 0, 2, 1, false);
-  InsertVp9Gof(sn + 8, sn + 8, false, pid + 8, 0, 0, 2, true);
-  InsertVp9Gof(sn + 9, sn + 9, false, pid + 9, 0, 2, 2, false);
-  InsertVp9Gof(sn + 10, sn + 10, false, pid + 10, 0, 1, 2, false);
-  InsertVp9Gof(sn + 11, sn + 11, false, pid + 11, 0, 2, 2, true);
-  InsertVp9Gof(sn + 12, sn + 12, false, pid + 12, 0, 0, 3, false);
-  InsertVp9Gof(sn + 13, sn + 13, false, pid + 13, 0, 2, 3, false);
-  InsertVp9Gof(sn + 14, sn + 14, false, pid + 14, 0, 1, 3, false);
-  InsertVp9Gof(sn + 15, sn + 15, false, pid + 15, 0, 2, 3, false);
-
-  ASSERT_EQ(16UL, frames_from_callback_.size());
-  CheckReferencesVp9(0, 0);
-  CheckReferencesVp9(1, 0, 0);
-  CheckReferencesVp9(2, 0, 0);
-  CheckReferencesVp9(3, 0, 1, 2);
-  CheckReferencesVp9(4, 0, 0);
-  CheckReferencesVp9(5, 0, 3, 4);
-  CheckReferencesVp9(6, 0, 2, 4);
-  CheckReferencesVp9(7, 0, 6);
-  CheckReferencesVp9(8, 0, 4);
-  CheckReferencesVp9(9, 0, 8);
-  CheckReferencesVp9(10, 0, 8);
-  CheckReferencesVp9(11, 0, 9, 10);
-  CheckReferencesVp9(12, 0, 8);
-  CheckReferencesVp9(13, 0, 11, 12);
-  CheckReferencesVp9(14, 0, 10, 12);
-  CheckReferencesVp9(15, 0, 13, 14);
-}
-
-TEST_F(TestRtpFrameReferenceFinder,
-       Vp9GofTemporalLayersUpSwitchReordered_02120212) {
-  uint16_t pid = Rand();
-  uint16_t sn = Rand();
-  GofInfoVP9 ss;
-  ss.SetGofInfoVP9(kTemporalStructureMode4);  // 02120212 pattern
-
-  InsertVp9Gof(sn + 1, sn + 1, false, pid + 1, 0, 2, 0, false);
-  InsertVp9Gof(sn, sn, true, pid, 0, 0, 0, false, &ss);
-  InsertVp9Gof(sn + 4, sn + 4, false, pid + 4, 0, 0, 1, false);
-  InsertVp9Gof(sn + 2, sn + 2, false, pid + 2, 0, 1, 0, false);
-  InsertVp9Gof(sn + 5, sn + 5, false, pid + 5, 0, 2, 1, false);
-  InsertVp9Gof(sn + 3, sn + 3, false, pid + 3, 0, 2, 0, false);
-  InsertVp9Gof(sn + 7, sn + 7, false, pid + 7, 0, 2, 1, false);
-  InsertVp9Gof(sn + 9, sn + 9, false, pid + 9, 0, 2, 2, false);
-  InsertVp9Gof(sn + 6, sn + 6, false, pid + 6, 0, 1, 1, true);
-  InsertVp9Gof(sn + 12, sn + 12, false, pid + 12, 0, 0, 3, false);
-  InsertVp9Gof(sn + 10, sn + 10, false, pid + 10, 0, 1, 2, false);
-  InsertVp9Gof(sn + 8, sn + 8, false, pid + 8, 0, 0, 2, true);
-  InsertVp9Gof(sn + 11, sn + 11, false, pid + 11, 0, 2, 2, true);
-  InsertVp9Gof(sn + 13, sn + 13, false, pid + 13, 0, 2, 3, false);
-  InsertVp9Gof(sn + 15, sn + 15, false, pid + 15, 0, 2, 3, false);
-  InsertVp9Gof(sn + 14, sn + 14, false, pid + 14, 0, 1, 3, false);
-
-  ASSERT_EQ(16UL, frames_from_callback_.size());
-  CheckReferencesVp9(0, 0);
-  CheckReferencesVp9(1, 0, 0);
-  CheckReferencesVp9(2, 0, 0);
-  CheckReferencesVp9(3, 0, 1, 2);
-  CheckReferencesVp9(4, 0, 0);
-  CheckReferencesVp9(5, 0, 3, 4);
-  CheckReferencesVp9(6, 0, 2, 4);
-  CheckReferencesVp9(7, 0, 6);
-  CheckReferencesVp9(8, 0, 4);
-  CheckReferencesVp9(9, 0, 8);
-  CheckReferencesVp9(10, 0, 8);
-  CheckReferencesVp9(11, 0, 9, 10);
-  CheckReferencesVp9(12, 0, 8);
-  CheckReferencesVp9(13, 0, 11, 12);
-  CheckReferencesVp9(14, 0, 10, 12);
-  CheckReferencesVp9(15, 0, 13, 14);
-}
-
-TEST_F(TestRtpFrameReferenceFinder, Vp9GofTemporalLayersReordered_01_0212) {
-  uint16_t pid = Rand();
-  uint16_t sn = Rand();
-  GofInfoVP9 ss;
-  ss.SetGofInfoVP9(kTemporalStructureMode2);  // 01 pattern
-
-  InsertVp9Gof(sn + 1, sn + 1, false, pid + 1, 0, 1, 0, false);
-  InsertVp9Gof(sn, sn, true, pid, 0, 0, 0, false, &ss);
-  InsertVp9Gof(sn + 3, sn + 3, false, pid + 3, 0, 1, 1, false);
-  InsertVp9Gof(sn + 6, sn + 6, false, pid + 6, 0, 1, 2, false);
-  ss.SetGofInfoVP9(kTemporalStructureMode3);  // 0212 pattern
-  InsertVp9Gof(sn + 4, sn + 4, false, pid + 4, 0, 0, 2, false, &ss);
-  InsertVp9Gof(sn + 2, sn + 2, false, pid + 2, 0, 0, 1, false);
-  InsertVp9Gof(sn + 5, sn + 5, false, pid + 5, 0, 2, 2, false);
-  InsertVp9Gof(sn + 8, sn + 8, false, pid + 8, 0, 0, 3, false);
-  InsertVp9Gof(sn + 10, sn + 10, false, pid + 10, 0, 1, 3, false);
-  InsertVp9Gof(sn + 7, sn + 7, false, pid + 7, 0, 2, 2, false);
-  InsertVp9Gof(sn + 11, sn + 11, false, pid + 11, 0, 2, 3, false);
-  InsertVp9Gof(sn + 9, sn + 9, false, pid + 9, 0, 2, 3, false);
-
-  ASSERT_EQ(12UL, frames_from_callback_.size());
-  CheckReferencesVp9(0, 0);
-  CheckReferencesVp9(1, 0, 0);
-  CheckReferencesVp9(2, 0, 0);
-  CheckReferencesVp9(3, 0, 2);
-  CheckReferencesVp9(4, 0, 0);
-  CheckReferencesVp9(5, 0, 4);
-  CheckReferencesVp9(6, 0, 4);
-  CheckReferencesVp9(7, 0, 5, 6);
-  CheckReferencesVp9(8, 0, 4);
-  CheckReferencesVp9(9, 0, 8);
-  CheckReferencesVp9(10, 0, 8);
-  CheckReferencesVp9(11, 0, 9, 10);
-}
-
-TEST_F(TestRtpFrameReferenceFinder, Vp9FlexibleModeOneFrame) {
-  uint16_t pid = Rand();
-  uint16_t sn = Rand();
-
-  InsertVp9Flex(sn, sn, true, pid, 0, 0, 0, false);
-
-  ASSERT_EQ(1UL, frames_from_callback_.size());
-  CheckReferencesVp9(0, 0);
-}
-
-TEST_F(TestRtpFrameReferenceFinder, Vp9FlexibleModeTwoSpatialLayers) {
-  uint16_t pid = Rand();
-  uint16_t sn = Rand();
-
-  InsertVp9Flex(sn, sn, true, pid, 0, 0, 0, false);
-  InsertVp9Flex(sn + 1, sn + 1, true, pid, 1, 0, 0, true);
-  InsertVp9Flex(sn + 2, sn + 2, false, pid + 1, 1, 0, 0, false, {1});
-  InsertVp9Flex(sn + 3, sn + 3, false, pid + 2, 0, 0, 1, false, {2});
-  InsertVp9Flex(sn + 4, sn + 4, false, pid + 2, 1, 0, 1, false, {1});
-  InsertVp9Flex(sn + 5, sn + 5, false, pid + 3, 1, 0, 1, false, {1});
-  InsertVp9Flex(sn + 6, sn + 6, false, pid + 4, 0, 0, 2, false, {2});
-  InsertVp9Flex(sn + 7, sn + 7, false, pid + 4, 1, 0, 2, false, {1});
-  InsertVp9Flex(sn + 8, sn + 8, false, pid + 5, 1, 0, 2, false, {1});
-  InsertVp9Flex(sn + 9, sn + 9, false, pid + 6, 0, 0, 3, false, {2});
-  InsertVp9Flex(sn + 10, sn + 10, false, pid + 6, 1, 0, 3, false, {1});
-  InsertVp9Flex(sn + 11, sn + 11, false, pid + 7, 1, 0, 3, false, {1});
-  InsertVp9Flex(sn + 12, sn + 12, false, pid + 8, 0, 0, 4, false, {2});
-  InsertVp9Flex(sn + 13, sn + 13, false, pid + 8, 1, 0, 4, false, {1});
-
-  ASSERT_EQ(14UL, frames_from_callback_.size());
-  CheckReferencesVp9(0, 0);
-  CheckReferencesVp9(0, 1);
-  CheckReferencesVp9(1, 1, 0);
-  CheckReferencesVp9(2, 0, 0);
-  CheckReferencesVp9(2, 1, 1);
-  CheckReferencesVp9(3, 1, 2);
-  CheckReferencesVp9(4, 0, 2);
-  CheckReferencesVp9(4, 1, 3);
-  CheckReferencesVp9(5, 1, 4);
-  CheckReferencesVp9(6, 0, 4);
-  CheckReferencesVp9(6, 1, 5);
-  CheckReferencesVp9(7, 1, 6);
-  CheckReferencesVp9(8, 0, 6);
-  CheckReferencesVp9(8, 1, 7);
-}
-
-TEST_F(TestRtpFrameReferenceFinder, Vp9FlexibleModeTwoSpatialLayersReordered) {
-  uint16_t pid = Rand();
-  uint16_t sn = Rand();
-
-  InsertVp9Flex(sn + 1, sn + 1, true, pid, 1, 0, 0, true);
-  InsertVp9Flex(sn + 2, sn + 2, false, pid + 1, 1, 0, 0, false, {1});
-  InsertVp9Flex(sn, sn, true, pid, 0, 0, 0, false);
-  InsertVp9Flex(sn + 4, sn + 4, false, pid + 2, 1, 0, 1, false, {1});
-  InsertVp9Flex(sn + 5, sn + 5, false, pid + 3, 1, 0, 1, false, {1});
-  InsertVp9Flex(sn + 3, sn + 3, false, pid + 2, 0, 0, 1, false, {2});
-  InsertVp9Flex(sn + 7, sn + 7, false, pid + 4, 1, 0, 2, false, {1});
-  InsertVp9Flex(sn + 6, sn + 6, false, pid + 4, 0, 0, 2, false, {2});
-  InsertVp9Flex(sn + 8, sn + 8, false, pid + 5, 1, 0, 2, false, {1});
-  InsertVp9Flex(sn + 9, sn + 9, false, pid + 6, 0, 0, 3, false, {2});
-  InsertVp9Flex(sn + 11, sn + 11, false, pid + 7, 1, 0, 3, false, {1});
-  InsertVp9Flex(sn + 10, sn + 10, false, pid + 6, 1, 0, 3, false, {1});
-  InsertVp9Flex(sn + 13, sn + 13, false, pid + 8, 1, 0, 4, false, {1});
-  InsertVp9Flex(sn + 12, sn + 12, false, pid + 8, 0, 0, 4, false, {2});
-
-  ASSERT_EQ(14UL, frames_from_callback_.size());
-  CheckReferencesVp9(0, 0);
-  CheckReferencesVp9(0, 1);
-  CheckReferencesVp9(1, 1, 0);
-  CheckReferencesVp9(2, 0, 0);
-  CheckReferencesVp9(2, 1, 1);
-  CheckReferencesVp9(3, 1, 2);
-  CheckReferencesVp9(4, 0, 2);
-  CheckReferencesVp9(4, 1, 3);
-  CheckReferencesVp9(5, 1, 4);
-  CheckReferencesVp9(6, 0, 4);
-  CheckReferencesVp9(6, 1, 5);
-  CheckReferencesVp9(7, 1, 6);
-  CheckReferencesVp9(8, 0, 6);
-  CheckReferencesVp9(8, 1, 7);
-}
-
-}  // namespace video_coding
-}  // namespace webrtc
diff --git a/modules/video_coding/rtt_filter.cc b/modules/video_coding/rtt_filter.cc
deleted file mode 100644
index 742f70f..0000000
--- a/modules/video_coding/rtt_filter.cc
+++ /dev/null
@@ -1,165 +0,0 @@
-/*
- *  Copyright (c) 2011 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/video_coding/rtt_filter.h"
-
-#include <math.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "webrtc/modules/video_coding/internal_defines.h"
-
-namespace webrtc {
-
-VCMRttFilter::VCMRttFilter()
-    : _filtFactMax(35),
-      _jumpStdDevs(2.5),
-      _driftStdDevs(3.5),
-      _detectThreshold(kMaxDriftJumpCount) {
-  Reset();
-}
-
-VCMRttFilter& VCMRttFilter::operator=(const VCMRttFilter& rhs) {
-  if (this != &rhs) {
-    _gotNonZeroUpdate = rhs._gotNonZeroUpdate;
-    _avgRtt = rhs._avgRtt;
-    _varRtt = rhs._varRtt;
-    _maxRtt = rhs._maxRtt;
-    _filtFactCount = rhs._filtFactCount;
-    _jumpCount = rhs._jumpCount;
-    _driftCount = rhs._driftCount;
-    memcpy(_jumpBuf, rhs._jumpBuf, sizeof(_jumpBuf));
-    memcpy(_driftBuf, rhs._driftBuf, sizeof(_driftBuf));
-  }
-  return *this;
-}
-
-void VCMRttFilter::Reset() {
-  _gotNonZeroUpdate = false;
-  _avgRtt = 0;
-  _varRtt = 0;
-  _maxRtt = 0;
-  _filtFactCount = 1;
-  _jumpCount = 0;
-  _driftCount = 0;
-  memset(_jumpBuf, 0, kMaxDriftJumpCount);
-  memset(_driftBuf, 0, kMaxDriftJumpCount);
-}
-
-void VCMRttFilter::Update(int64_t rttMs) {
-  if (!_gotNonZeroUpdate) {
-    if (rttMs == 0) {
-      return;
-    }
-    _gotNonZeroUpdate = true;
-  }
-
-  // Sanity check
-  if (rttMs > 3000) {
-    rttMs = 3000;
-  }
-
-  double filtFactor = 0;
-  if (_filtFactCount > 1) {
-    filtFactor = static_cast<double>(_filtFactCount - 1) / _filtFactCount;
-  }
-  _filtFactCount++;
-  if (_filtFactCount > _filtFactMax) {
-    // This prevents filtFactor from going above
-    // (_filtFactMax - 1) / _filtFactMax,
-    // e.g., _filtFactMax = 50 => filtFactor = 49/50 = 0.98
-    _filtFactCount = _filtFactMax;
-  }
-  double oldAvg = _avgRtt;
-  double oldVar = _varRtt;
-  _avgRtt = filtFactor * _avgRtt + (1 - filtFactor) * rttMs;
-  _varRtt = filtFactor * _varRtt +
-            (1 - filtFactor) * (rttMs - _avgRtt) * (rttMs - _avgRtt);
-  _maxRtt = VCM_MAX(rttMs, _maxRtt);
-  if (!JumpDetection(rttMs) || !DriftDetection(rttMs)) {
-    // In some cases we don't want to update the statistics
-    _avgRtt = oldAvg;
-    _varRtt = oldVar;
-  }
-}
-
-bool VCMRttFilter::JumpDetection(int64_t rttMs) {
-  double diffFromAvg = _avgRtt - rttMs;
-  if (fabs(diffFromAvg) > _jumpStdDevs * sqrt(_varRtt)) {
-    int diffSign = (diffFromAvg >= 0) ? 1 : -1;
-    int jumpCountSign = (_jumpCount >= 0) ? 1 : -1;
-    if (diffSign != jumpCountSign) {
-      // Since the signs differ the samples currently
-      // in the buffer is useless as they represent a
-      // jump in a different direction.
-      _jumpCount = 0;
-    }
-    if (abs(_jumpCount) < kMaxDriftJumpCount) {
-      // Update the buffer used for the short time
-      // statistics.
-      // The sign of the diff is used for updating the counter since
-      // we want to use the same buffer for keeping track of when
-      // the RTT jumps down and up.
-      _jumpBuf[abs(_jumpCount)] = rttMs;
-      _jumpCount += diffSign;
-    }
-    if (abs(_jumpCount) >= _detectThreshold) {
-      // Detected an RTT jump
-      ShortRttFilter(_jumpBuf, abs(_jumpCount));
-      _filtFactCount = _detectThreshold + 1;
-      _jumpCount = 0;
-    } else {
-      return false;
-    }
-  } else {
-    _jumpCount = 0;
-  }
-  return true;
-}
-
-bool VCMRttFilter::DriftDetection(int64_t rttMs) {
-  if (_maxRtt - _avgRtt > _driftStdDevs * sqrt(_varRtt)) {
-    if (_driftCount < kMaxDriftJumpCount) {
-      // Update the buffer used for the short time
-      // statistics.
-      _driftBuf[_driftCount] = rttMs;
-      _driftCount++;
-    }
-    if (_driftCount >= _detectThreshold) {
-      // Detected an RTT drift
-      ShortRttFilter(_driftBuf, _driftCount);
-      _filtFactCount = _detectThreshold + 1;
-      _driftCount = 0;
-    }
-  } else {
-    _driftCount = 0;
-  }
-  return true;
-}
-
-void VCMRttFilter::ShortRttFilter(int64_t* buf, uint32_t length) {
-  if (length == 0) {
-    return;
-  }
-  _maxRtt = 0;
-  _avgRtt = 0;
-  for (uint32_t i = 0; i < length; i++) {
-    if (buf[i] > _maxRtt) {
-      _maxRtt = buf[i];
-    }
-    _avgRtt += buf[i];
-  }
-  _avgRtt = _avgRtt / static_cast<double>(length);
-}
-
-int64_t VCMRttFilter::RttMs() const {
-  return static_cast<int64_t>(_maxRtt + 0.5);
-}
-}  // namespace webrtc
diff --git a/modules/video_coding/rtt_filter.h b/modules/video_coding/rtt_filter.h
deleted file mode 100644
index f5de532..0000000
--- a/modules/video_coding/rtt_filter.h
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- *  Copyright (c) 2011 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_VIDEO_CODING_RTT_FILTER_H_
-#define WEBRTC_MODULES_VIDEO_CODING_RTT_FILTER_H_
-
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-class VCMRttFilter {
- public:
-  VCMRttFilter();
-
-  VCMRttFilter& operator=(const VCMRttFilter& rhs);
-
-  // Resets the filter.
-  void Reset();
-  // Updates the filter with a new sample.
-  void Update(int64_t rttMs);
-  // A getter function for the current RTT level in ms.
-  int64_t RttMs() const;
-
- private:
-  // The size of the drift and jump memory buffers
-  // and thus also the detection threshold for these
-  // detectors in number of samples.
-  enum { kMaxDriftJumpCount = 5 };
-  // Detects RTT jumps by comparing the difference between
-  // samples and average to the standard deviation.
-  // Returns true if the long time statistics should be updated
-  // and false otherwise
-  bool JumpDetection(int64_t rttMs);
-  // Detects RTT drifts by comparing the difference between
-  // max and average to the standard deviation.
-  // Returns true if the long time statistics should be updated
-  // and false otherwise
-  bool DriftDetection(int64_t rttMs);
-  // Computes the short time average and maximum of the vector buf.
-  void ShortRttFilter(int64_t* buf, uint32_t length);
-
-  bool _gotNonZeroUpdate;
-  double _avgRtt;
-  double _varRtt;
-  int64_t _maxRtt;
-  uint32_t _filtFactCount;
-  const uint32_t _filtFactMax;
-  const double _jumpStdDevs;
-  const double _driftStdDevs;
-  int32_t _jumpCount;
-  int32_t _driftCount;
-  const int32_t _detectThreshold;
-  int64_t _jumpBuf[kMaxDriftJumpCount];
-  int64_t _driftBuf[kMaxDriftJumpCount];
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_VIDEO_CODING_RTT_FILTER_H_
diff --git a/modules/video_coding/sequence_number_util.h b/modules/video_coding/sequence_number_util.h
deleted file mode 100644
index 053f9d0..0000000
--- a/modules/video_coding/sequence_number_util.h
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- *  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_VIDEO_CODING_SEQUENCE_NUMBER_UTIL_H_
-#define WEBRTC_MODULES_VIDEO_CODING_SEQUENCE_NUMBER_UTIL_H_
-
-#include <limits>
-#include <type_traits>
-
-#include "webrtc/api/optional.h"
-#include "webrtc/rtc_base/mod_ops.h"
-#include "webrtc/rtc_base/safe_compare.h"
-
-namespace webrtc {
-
-// Test if the sequence number |a| is ahead or at sequence number |b|.
-//
-// If |M| is an even number and the two sequence numbers are at max distance
-// from each other, then the sequence number with the highest value is
-// considered to be ahead.
-template <typename T, T M>
-inline typename std::enable_if<(M > 0), bool>::type AheadOrAt(T a, T b) {
-  static_assert(std::is_unsigned<T>::value,
-                "Type must be an unsigned integer.");
-  const T maxDist = M / 2;
-  if (!(M & 1) && MinDiff<T, M>(a, b) == maxDist)
-    return b < a;
-  return ForwardDiff<T, M>(b, a) <= maxDist;
-}
-
-template <typename T, T M>
-inline typename std::enable_if<(M == 0), bool>::type AheadOrAt(T a, T b) {
-  static_assert(std::is_unsigned<T>::value,
-                "Type must be an unsigned integer.");
-  const T maxDist = std::numeric_limits<T>::max() / 2 + T(1);
-  if (a - b == maxDist)
-    return b < a;
-  return ForwardDiff(b, a) < maxDist;
-}
-
-template <typename T>
-inline bool AheadOrAt(T a, T b) {
-  return AheadOrAt<T, 0>(a, b);
-}
-
-// Test if the sequence number |a| is ahead of sequence number |b|.
-//
-// If |M| is an even number and the two sequence numbers are at max distance
-// from each other, then the sequence number with the highest value is
-// considered to be ahead.
-template <typename T, T M = 0>
-inline bool AheadOf(T a, T b) {
-  static_assert(std::is_unsigned<T>::value,
-                "Type must be an unsigned integer.");
-  return a != b && AheadOrAt<T, M>(a, b);
-}
-
-// Comparator used to compare sequence numbers in a continuous fashion.
-//
-// WARNING! If used to sort sequence numbers of length M then the interval
-//          covered by the sequence numbers may not be larger than floor(M/2).
-template <typename T, T M = 0>
-struct AscendingSeqNumComp {
-  bool operator()(T a, T b) const { return AheadOf<T, M>(a, b); }
-};
-
-// Comparator used to compare sequence numbers in a continuous fashion.
-//
-// WARNING! If used to sort sequence numbers of length M then the interval
-//          covered by the sequence numbers may not be larger than floor(M/2).
-template <typename T, T M = 0>
-struct DescendingSeqNumComp {
-  bool operator()(T a, T b) const { return AheadOf<T, M>(b, a); }
-};
-
-// A sequencer number unwrapper where the start value of the unwrapped sequence
-// can be set. The unwrapped value is not allowed to wrap.
-template <typename T, T M = 0>
-class SeqNumUnwrapper {
-  // Use '<' instead of rtc::SafeLt to avoid crbug.com/753488
-  static_assert(
-      std::is_unsigned<T>::value &&
-          std::numeric_limits<T>::max() < std::numeric_limits<uint64_t>::max(),
-      "Type unwrapped must be an unsigned integer smaller than uint64_t.");
-
- public:
-  // We want a default value that is close to 2^62 for a two reasons. Firstly,
-  // we can unwrap wrapping numbers in either direction, and secondly, the
-  // unwrapped numbers can be stored in either int64_t or uint64_t. We also want
-  // the default value to be human readable, which makes a power of 10 suitable.
-  static constexpr uint64_t kDefaultStartValue = 1000000000000000000UL;
-
-  SeqNumUnwrapper() : last_unwrapped_(kDefaultStartValue) {}
-  explicit SeqNumUnwrapper(uint64_t start_at) : last_unwrapped_(start_at) {}
-
-  uint64_t Unwrap(T value) {
-    if (!last_value_)
-      last_value_.emplace(value);
-
-    uint64_t unwrapped = 0;
-    if (AheadOrAt<T, M>(value, *last_value_)) {
-      unwrapped = last_unwrapped_ + ForwardDiff<T, M>(*last_value_, value);
-      RTC_CHECK_GE(unwrapped, last_unwrapped_);
-    } else {
-      unwrapped = last_unwrapped_ - ReverseDiff<T, M>(*last_value_, value);
-      RTC_CHECK_LT(unwrapped, last_unwrapped_);
-    }
-
-    *last_value_ = value;
-    last_unwrapped_ = unwrapped;
-    return last_unwrapped_;
-  }
-
- private:
-  uint64_t last_unwrapped_;
-  rtc::Optional<T> last_value_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_VIDEO_CODING_SEQUENCE_NUMBER_UTIL_H_
diff --git a/modules/video_coding/sequence_number_util_unittest.cc b/modules/video_coding/sequence_number_util_unittest.cc
deleted file mode 100644
index 8555fc2..0000000
--- a/modules/video_coding/sequence_number_util_unittest.cc
+++ /dev/null
@@ -1,320 +0,0 @@
-/*
- *  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 <set>
-
-#include "webrtc/modules/video_coding/sequence_number_util.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-class TestSeqNumUtil : public ::testing::Test {
- protected:
-  // Can't use std::numeric_limits<unsigned long>::max() since
-  // MSVC doesn't support constexpr.
-  static const unsigned long ulmax = ~0ul;  // NOLINT
-};
-
-TEST_F(TestSeqNumUtil, AheadOrAt) {
-  uint8_t x = 0;
-  uint8_t y = 0;
-  ASSERT_TRUE(AheadOrAt(x, y));
-  ++x;
-  ASSERT_TRUE(AheadOrAt(x, y));
-  ASSERT_FALSE(AheadOrAt(y, x));
-  for (int i = 0; i < 256; ++i) {
-    ASSERT_TRUE(AheadOrAt(x, y));
-    ++x;
-    ++y;
-  }
-
-  x = 128;
-  y = 0;
-  ASSERT_TRUE(AheadOrAt(x, y));
-  ASSERT_FALSE(AheadOrAt(y, x));
-
-  x = 129;
-  ASSERT_FALSE(AheadOrAt(x, y));
-  ASSERT_TRUE(AheadOrAt(y, x));
-  ASSERT_TRUE(AheadOrAt<uint16_t>(x, y));
-  ASSERT_FALSE(AheadOrAt<uint16_t>(y, x));
-}
-
-TEST_F(TestSeqNumUtil, AheadOrAtWithDivisor) {
-  ASSERT_TRUE((AheadOrAt<uint8_t, 11>(5, 0)));
-  ASSERT_FALSE((AheadOrAt<uint8_t, 11>(6, 0)));
-  ASSERT_FALSE((AheadOrAt<uint8_t, 11>(0, 5)));
-  ASSERT_TRUE((AheadOrAt<uint8_t, 11>(0, 6)));
-
-  ASSERT_TRUE((AheadOrAt<uint8_t, 10>(5, 0)));
-  ASSERT_FALSE((AheadOrAt<uint8_t, 10>(6, 0)));
-  ASSERT_FALSE((AheadOrAt<uint8_t, 10>(0, 5)));
-  ASSERT_TRUE((AheadOrAt<uint8_t, 10>(0, 6)));
-
-  const uint8_t D = 211;
-  uint8_t x = 0;
-  for (int i = 0; i < D; ++i) {
-    uint8_t next_x = Add<D>(x, 1);
-    ASSERT_TRUE((AheadOrAt<uint8_t, D>(i, i)));
-    ASSERT_TRUE((AheadOrAt<uint8_t, D>(next_x, i)));
-    ASSERT_FALSE((AheadOrAt<uint8_t, D>(i, next_x)));
-    x = next_x;
-  }
-}
-
-TEST_F(TestSeqNumUtil, AheadOf) {
-  uint8_t x = 0;
-  uint8_t y = 0;
-  ASSERT_FALSE(AheadOf(x, y));
-  ++x;
-  ASSERT_TRUE(AheadOf(x, y));
-  ASSERT_FALSE(AheadOf(y, x));
-  for (int i = 0; i < 256; ++i) {
-    ASSERT_TRUE(AheadOf(x, y));
-    ++x;
-    ++y;
-  }
-
-  x = 128;
-  y = 0;
-  for (int i = 0; i < 128; ++i) {
-    ASSERT_TRUE(AheadOf(x, y));
-    ASSERT_FALSE(AheadOf(y, x));
-    x++;
-    y++;
-  }
-
-  for (int i = 0; i < 128; ++i) {
-    ASSERT_FALSE(AheadOf(x, y));
-    ASSERT_TRUE(AheadOf(y, x));
-    x++;
-    y++;
-  }
-
-  x = 129;
-  y = 0;
-  ASSERT_FALSE(AheadOf(x, y));
-  ASSERT_TRUE(AheadOf(y, x));
-  ASSERT_TRUE(AheadOf<uint16_t>(x, y));
-  ASSERT_FALSE(AheadOf<uint16_t>(y, x));
-}
-
-TEST_F(TestSeqNumUtil, AheadOfWithDivisor) {
-  ASSERT_TRUE((AheadOf<uint8_t, 11>(5, 0)));
-  ASSERT_FALSE((AheadOf<uint8_t, 11>(6, 0)));
-  ASSERT_FALSE((AheadOf<uint8_t, 11>(0, 5)));
-  ASSERT_TRUE((AheadOf<uint8_t, 11>(0, 6)));
-
-  ASSERT_TRUE((AheadOf<uint8_t, 10>(5, 0)));
-  ASSERT_FALSE((AheadOf<uint8_t, 10>(6, 0)));
-  ASSERT_FALSE((AheadOf<uint8_t, 10>(0, 5)));
-  ASSERT_TRUE((AheadOf<uint8_t, 10>(0, 6)));
-
-  const uint8_t D = 211;
-  uint8_t x = 0;
-  for (int i = 0; i < D; ++i) {
-    uint8_t next_x = Add<D>(x, 1);
-    ASSERT_FALSE((AheadOf<uint8_t, D>(i, i)));
-    ASSERT_TRUE((AheadOf<uint8_t, D>(next_x, i)));
-    ASSERT_FALSE((AheadOf<uint8_t, D>(i, next_x)));
-    x = next_x;
-  }
-}
-
-TEST_F(TestSeqNumUtil, ForwardDiffWithDivisor) {
-  const uint8_t kDivisor = 211;
-
-  for (uint8_t i = 0; i < kDivisor - 1; ++i) {
-    ASSERT_EQ(0, (ForwardDiff<uint8_t, kDivisor>(i, i)));
-    ASSERT_EQ(1, (ForwardDiff<uint8_t, kDivisor>(i, i + 1)));
-    ASSERT_EQ(kDivisor - 1, (ForwardDiff<uint8_t, kDivisor>(i + 1, i)));
-  }
-
-  for (uint8_t i = 1; i < kDivisor; ++i) {
-    ASSERT_EQ(i, (ForwardDiff<uint8_t, kDivisor>(0, i)));
-    ASSERT_EQ(kDivisor - i, (ForwardDiff<uint8_t, kDivisor>(i, 0)));
-  }
-}
-
-TEST_F(TestSeqNumUtil, ReverseDiffWithDivisor) {
-  const uint8_t kDivisor = 241;
-
-  for (uint8_t i = 0; i < kDivisor - 1; ++i) {
-    ASSERT_EQ(0, (ReverseDiff<uint8_t, kDivisor>(i, i)));
-    ASSERT_EQ(kDivisor - 1, (ReverseDiff<uint8_t, kDivisor>(i, i + 1)));
-    ASSERT_EQ(1, (ReverseDiff<uint8_t, kDivisor>(i + 1, i)));
-  }
-
-  for (uint8_t i = 1; i < kDivisor; ++i) {
-    ASSERT_EQ(kDivisor - i, (ReverseDiff<uint8_t, kDivisor>(0, i)));
-    ASSERT_EQ(i, (ReverseDiff<uint8_t, kDivisor>(i, 0)));
-  }
-}
-
-TEST_F(TestSeqNumUtil, SeqNumComparator) {
-  std::set<uint8_t, AscendingSeqNumComp<uint8_t>> seq_nums_asc;
-  std::set<uint8_t, DescendingSeqNumComp<uint8_t>> seq_nums_desc;
-
-  uint8_t x = 0;
-  for (int i = 0; i < 128; ++i) {
-    seq_nums_asc.insert(x);
-    seq_nums_desc.insert(x);
-    ASSERT_EQ(x, *seq_nums_asc.begin());
-    ASSERT_EQ(x, *seq_nums_desc.rbegin());
-    ++x;
-  }
-
-  seq_nums_asc.clear();
-  seq_nums_desc.clear();
-  x = 199;
-  for (int i = 0; i < 128; ++i) {
-    seq_nums_asc.insert(x);
-    seq_nums_desc.insert(x);
-    ASSERT_EQ(x, *seq_nums_asc.begin());
-    ASSERT_EQ(x, *seq_nums_desc.rbegin());
-    ++x;
-  }
-}
-
-TEST_F(TestSeqNumUtil, SeqNumComparatorWithDivisor) {
-  const uint8_t D = 223;
-
-  std::set<uint8_t, AscendingSeqNumComp<uint8_t, D>> seq_nums_asc;
-  std::set<uint8_t, DescendingSeqNumComp<uint8_t, D>> seq_nums_desc;
-
-  uint8_t x = 0;
-  for (int i = 0; i < D / 2; ++i) {
-    seq_nums_asc.insert(x);
-    seq_nums_desc.insert(x);
-    ASSERT_EQ(x, *seq_nums_asc.begin());
-    ASSERT_EQ(x, *seq_nums_desc.rbegin());
-    x = Add<D>(x, 1);
-  }
-
-  seq_nums_asc.clear();
-  seq_nums_desc.clear();
-  x = 200;
-  for (int i = 0; i < D / 2; ++i) {
-    seq_nums_asc.insert(x);
-    seq_nums_desc.insert(x);
-    ASSERT_EQ(x, *seq_nums_asc.begin());
-    ASSERT_EQ(x, *seq_nums_desc.rbegin());
-    x = Add<D>(x, 1);
-  }
-}
-
-#if GTEST_HAS_DEATH_TEST
-#if !defined(WEBRTC_ANDROID)
-TEST(SeqNumUnwrapper, NoBackWardWrap) {
-  SeqNumUnwrapper<uint8_t> unwrapper(0);
-  EXPECT_EQ(0U, unwrapper.Unwrap(0));
-
-  // The unwrapped sequence is not allowed to wrap, if that happens the
-  // SeqNumUnwrapper should have been constructed with a higher start value.
-  EXPECT_DEATH(unwrapper.Unwrap(255), "");
-}
-
-TEST(SeqNumUnwrapper, NoForwardWrap) {
-  SeqNumUnwrapper<uint32_t> unwrapper(std::numeric_limits<uint64_t>::max());
-  EXPECT_EQ(std::numeric_limits<uint64_t>::max(), unwrapper.Unwrap(0));
-
-  // The unwrapped sequence is not allowed to wrap, if that happens the
-  // SeqNumUnwrapper should have been constructed with a lower start value.
-  EXPECT_DEATH(unwrapper.Unwrap(1), "");
-}
-#endif
-#endif
-
-TEST(SeqNumUnwrapper, ForwardWrap) {
-  SeqNumUnwrapper<uint8_t> unwrapper(0);
-  EXPECT_EQ(0U, unwrapper.Unwrap(255));
-  EXPECT_EQ(1U, unwrapper.Unwrap(0));
-}
-
-TEST(SeqNumUnwrapper, ForwardWrapWithDivisor) {
-  SeqNumUnwrapper<uint8_t, 33> unwrapper(0);
-  EXPECT_EQ(0U, unwrapper.Unwrap(30));
-  EXPECT_EQ(6U, unwrapper.Unwrap(3));
-}
-
-TEST(SeqNumUnwrapper, BackWardWrap) {
-  SeqNumUnwrapper<uint8_t> unwrapper(10);
-  EXPECT_EQ(10U, unwrapper.Unwrap(0));
-  EXPECT_EQ(8U, unwrapper.Unwrap(254));
-}
-
-TEST(SeqNumUnwrapper, BackWardWrapWithDivisor) {
-  SeqNumUnwrapper<uint8_t, 33> unwrapper(10);
-  EXPECT_EQ(10U, unwrapper.Unwrap(0));
-  EXPECT_EQ(8U, unwrapper.Unwrap(31));
-}
-
-TEST(SeqNumUnwrapper, Unwrap) {
-  SeqNumUnwrapper<uint16_t> unwrapper(0);
-  const uint16_t kMax = std::numeric_limits<uint16_t>::max();
-  const uint16_t kMaxDist = kMax / 2 + 1;
-
-  EXPECT_EQ(0U, unwrapper.Unwrap(0));
-  EXPECT_EQ(kMaxDist, unwrapper.Unwrap(kMaxDist));
-  EXPECT_EQ(0U, unwrapper.Unwrap(0));
-
-  EXPECT_EQ(kMaxDist, unwrapper.Unwrap(kMaxDist));
-  EXPECT_EQ(kMax, unwrapper.Unwrap(kMax));
-  EXPECT_EQ(kMax + 1U, unwrapper.Unwrap(0));
-  EXPECT_EQ(kMax, unwrapper.Unwrap(kMax));
-  EXPECT_EQ(kMaxDist, unwrapper.Unwrap(kMaxDist));
-  EXPECT_EQ(0U, unwrapper.Unwrap(0));
-}
-
-TEST(SeqNumUnwrapper, UnwrapOddDivisor) {
-  SeqNumUnwrapper<uint8_t, 11> unwrapper(10);
-
-  EXPECT_EQ(10U, unwrapper.Unwrap(10));
-  EXPECT_EQ(11U, unwrapper.Unwrap(0));
-  EXPECT_EQ(16U, unwrapper.Unwrap(5));
-  EXPECT_EQ(21U, unwrapper.Unwrap(10));
-  EXPECT_EQ(22U, unwrapper.Unwrap(0));
-  EXPECT_EQ(17U, unwrapper.Unwrap(6));
-  EXPECT_EQ(12U, unwrapper.Unwrap(1));
-  EXPECT_EQ(7U, unwrapper.Unwrap(7));
-  EXPECT_EQ(2U, unwrapper.Unwrap(2));
-  EXPECT_EQ(0U, unwrapper.Unwrap(0));
-}
-
-TEST(SeqNumUnwrapper, ManyForwardWraps) {
-  const int kLargeNumber = 4711;
-  const int kMaxStep = kLargeNumber / 2;
-  const int kNumWraps = 100;
-  SeqNumUnwrapper<uint16_t, kLargeNumber> unwrapper;
-
-  uint16_t next_unwrap = 0;
-  uint64_t expected = decltype(unwrapper)::kDefaultStartValue;
-  for (int i = 0; i < kNumWraps * 2 + 1; ++i) {
-    EXPECT_EQ(expected, unwrapper.Unwrap(next_unwrap));
-    expected += kMaxStep;
-    next_unwrap = (next_unwrap + kMaxStep) % kLargeNumber;
-  }
-}
-
-TEST(SeqNumUnwrapper, ManyBackwardWraps) {
-  const int kLargeNumber = 4711;
-  const int kMaxStep = kLargeNumber / 2;
-  const int kNumWraps = 100;
-  SeqNumUnwrapper<uint16_t, kLargeNumber> unwrapper(kLargeNumber * kNumWraps);
-
-  uint16_t next_unwrap = 0;
-  uint64_t expected = kLargeNumber * kNumWraps;
-  for (uint16_t i = 0; i < kNumWraps * 2 + 1; ++i) {
-    EXPECT_EQ(expected, unwrapper.Unwrap(next_unwrap));
-    expected -= kMaxStep;
-    next_unwrap = (next_unwrap + kMaxStep + 1) % kLargeNumber;
-  }
-}
-
-}  // namespace webrtc
diff --git a/modules/video_coding/session_info.cc b/modules/video_coding/session_info.cc
deleted file mode 100644
index 08e0f7b..0000000
--- a/modules/video_coding/session_info.cc
+++ /dev/null
@@ -1,527 +0,0 @@
-/*
- *  Copyright (c) 2012 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/video_coding/session_info.h"
-
-#include "webrtc/modules/video_coding/packet.h"
-#include "webrtc/rtc_base/logging.h"
-
-namespace webrtc {
-
-namespace {
-
-uint16_t BufferToUWord16(const uint8_t* dataBuffer) {
-  return (dataBuffer[0] << 8) | dataBuffer[1];
-}
-
-}  // namespace
-
-VCMSessionInfo::VCMSessionInfo()
-    : session_nack_(false),
-      complete_(false),
-      decodable_(false),
-      frame_type_(kVideoFrameDelta),
-      packets_(),
-      empty_seq_num_low_(-1),
-      empty_seq_num_high_(-1),
-      first_packet_seq_num_(-1),
-      last_packet_seq_num_(-1) {}
-
-void VCMSessionInfo::UpdateDataPointers(const uint8_t* old_base_ptr,
-                                        const uint8_t* new_base_ptr) {
-  for (PacketIterator it = packets_.begin(); it != packets_.end(); ++it)
-    if ((*it).dataPtr != NULL) {
-      assert(old_base_ptr != NULL && new_base_ptr != NULL);
-      (*it).dataPtr = new_base_ptr + ((*it).dataPtr - old_base_ptr);
-    }
-}
-
-int VCMSessionInfo::LowSequenceNumber() const {
-  if (packets_.empty())
-    return empty_seq_num_low_;
-  return packets_.front().seqNum;
-}
-
-int VCMSessionInfo::HighSequenceNumber() const {
-  if (packets_.empty())
-    return empty_seq_num_high_;
-  if (empty_seq_num_high_ == -1)
-    return packets_.back().seqNum;
-  return LatestSequenceNumber(packets_.back().seqNum, empty_seq_num_high_);
-}
-
-int VCMSessionInfo::PictureId() const {
-  if (packets_.empty())
-    return kNoPictureId;
-  if (packets_.front().video_header.codec == kRtpVideoVp8) {
-    return packets_.front().video_header.codecHeader.VP8.pictureId;
-  } else if (packets_.front().video_header.codec == kRtpVideoVp9) {
-    return packets_.front().video_header.codecHeader.VP9.picture_id;
-  } else {
-    return kNoPictureId;
-  }
-}
-
-int VCMSessionInfo::TemporalId() const {
-  if (packets_.empty())
-    return kNoTemporalIdx;
-  if (packets_.front().video_header.codec == kRtpVideoVp8) {
-    return packets_.front().video_header.codecHeader.VP8.temporalIdx;
-  } else if (packets_.front().video_header.codec == kRtpVideoVp9) {
-    return packets_.front().video_header.codecHeader.VP9.temporal_idx;
-  } else {
-    return kNoTemporalIdx;
-  }
-}
-
-bool VCMSessionInfo::LayerSync() const {
-  if (packets_.empty())
-    return false;
-  if (packets_.front().video_header.codec == kRtpVideoVp8) {
-    return packets_.front().video_header.codecHeader.VP8.layerSync;
-  } else if (packets_.front().video_header.codec == kRtpVideoVp9) {
-    return packets_.front().video_header.codecHeader.VP9.temporal_up_switch;
-  } else {
-    return false;
-  }
-}
-
-int VCMSessionInfo::Tl0PicId() const {
-  if (packets_.empty())
-    return kNoTl0PicIdx;
-  if (packets_.front().video_header.codec == kRtpVideoVp8) {
-    return packets_.front().video_header.codecHeader.VP8.tl0PicIdx;
-  } else if (packets_.front().video_header.codec == kRtpVideoVp9) {
-    return packets_.front().video_header.codecHeader.VP9.tl0_pic_idx;
-  } else {
-    return kNoTl0PicIdx;
-  }
-}
-
-bool VCMSessionInfo::NonReference() const {
-  if (packets_.empty() || packets_.front().video_header.codec != kRtpVideoVp8)
-    return false;
-  return packets_.front().video_header.codecHeader.VP8.nonReference;
-}
-
-std::vector<NaluInfo> VCMSessionInfo::GetNaluInfos() const {
-  if (packets_.empty() || packets_.front().video_header.codec != kRtpVideoH264)
-    return std::vector<NaluInfo>();
-  std::vector<NaluInfo> nalu_infos;
-  for (const VCMPacket& packet : packets_) {
-    for (size_t i = 0; i < packet.video_header.codecHeader.H264.nalus_length;
-         ++i) {
-      nalu_infos.push_back(packet.video_header.codecHeader.H264.nalus[i]);
-    }
-  }
-  return nalu_infos;
-}
-
-void VCMSessionInfo::SetGofInfo(const GofInfoVP9& gof_info, size_t idx) {
-  if (packets_.empty() || packets_.front().video_header.codec != kRtpVideoVp9 ||
-      packets_.front().video_header.codecHeader.VP9.flexible_mode) {
-    return;
-  }
-  packets_.front().video_header.codecHeader.VP9.temporal_idx =
-      gof_info.temporal_idx[idx];
-  packets_.front().video_header.codecHeader.VP9.temporal_up_switch =
-      gof_info.temporal_up_switch[idx];
-  packets_.front().video_header.codecHeader.VP9.num_ref_pics =
-      gof_info.num_ref_pics[idx];
-  for (uint8_t i = 0; i < gof_info.num_ref_pics[idx]; ++i) {
-    packets_.front().video_header.codecHeader.VP9.pid_diff[i] =
-        gof_info.pid_diff[idx][i];
-  }
-}
-
-void VCMSessionInfo::Reset() {
-  session_nack_ = false;
-  complete_ = false;
-  decodable_ = false;
-  frame_type_ = kVideoFrameDelta;
-  packets_.clear();
-  empty_seq_num_low_ = -1;
-  empty_seq_num_high_ = -1;
-  first_packet_seq_num_ = -1;
-  last_packet_seq_num_ = -1;
-}
-
-size_t VCMSessionInfo::SessionLength() const {
-  size_t length = 0;
-  for (PacketIteratorConst it = packets_.begin(); it != packets_.end(); ++it)
-    length += (*it).sizeBytes;
-  return length;
-}
-
-int VCMSessionInfo::NumPackets() const {
-  return packets_.size();
-}
-
-size_t VCMSessionInfo::InsertBuffer(uint8_t* frame_buffer,
-                                    PacketIterator packet_it) {
-  VCMPacket& packet = *packet_it;
-  PacketIterator it;
-
-  // Calculate the offset into the frame buffer for this packet.
-  size_t offset = 0;
-  for (it = packets_.begin(); it != packet_it; ++it)
-    offset += (*it).sizeBytes;
-
-  // Set the data pointer to pointing to the start of this packet in the
-  // frame buffer.
-  const uint8_t* packet_buffer = packet.dataPtr;
-  packet.dataPtr = frame_buffer + offset;
-
-  // We handle H.264 STAP-A packets in a special way as we need to remove the
-  // two length bytes between each NAL unit, and potentially add start codes.
-  // TODO(pbos): Remove H264 parsing from this step and use a fragmentation
-  // header supplied by the H264 depacketizer.
-  const size_t kH264NALHeaderLengthInBytes = 1;
-  const size_t kLengthFieldLength = 2;
-  if (packet.video_header.codec == kRtpVideoH264 &&
-      packet.video_header.codecHeader.H264.packetization_type == kH264StapA) {
-    size_t required_length = 0;
-    const uint8_t* nalu_ptr = packet_buffer + kH264NALHeaderLengthInBytes;
-    while (nalu_ptr < packet_buffer + packet.sizeBytes) {
-      size_t length = BufferToUWord16(nalu_ptr);
-      required_length +=
-          length + (packet.insertStartCode ? kH264StartCodeLengthBytes : 0);
-      nalu_ptr += kLengthFieldLength + length;
-    }
-    ShiftSubsequentPackets(packet_it, required_length);
-    nalu_ptr = packet_buffer + kH264NALHeaderLengthInBytes;
-    uint8_t* frame_buffer_ptr = frame_buffer + offset;
-    while (nalu_ptr < packet_buffer + packet.sizeBytes) {
-      size_t length = BufferToUWord16(nalu_ptr);
-      nalu_ptr += kLengthFieldLength;
-      frame_buffer_ptr += Insert(nalu_ptr, length, packet.insertStartCode,
-                                 const_cast<uint8_t*>(frame_buffer_ptr));
-      nalu_ptr += length;
-    }
-    packet.sizeBytes = required_length;
-    return packet.sizeBytes;
-  }
-  ShiftSubsequentPackets(
-      packet_it, packet.sizeBytes +
-                     (packet.insertStartCode ? kH264StartCodeLengthBytes : 0));
-
-  packet.sizeBytes =
-      Insert(packet_buffer, packet.sizeBytes, packet.insertStartCode,
-             const_cast<uint8_t*>(packet.dataPtr));
-  return packet.sizeBytes;
-}
-
-size_t VCMSessionInfo::Insert(const uint8_t* buffer,
-                              size_t length,
-                              bool insert_start_code,
-                              uint8_t* frame_buffer) {
-  if (insert_start_code) {
-    const unsigned char startCode[] = {0, 0, 0, 1};
-    memcpy(frame_buffer, startCode, kH264StartCodeLengthBytes);
-  }
-  memcpy(frame_buffer + (insert_start_code ? kH264StartCodeLengthBytes : 0),
-         buffer, length);
-  length += (insert_start_code ? kH264StartCodeLengthBytes : 0);
-
-  return length;
-}
-
-void VCMSessionInfo::ShiftSubsequentPackets(PacketIterator it,
-                                            int steps_to_shift) {
-  ++it;
-  if (it == packets_.end())
-    return;
-  uint8_t* first_packet_ptr = const_cast<uint8_t*>((*it).dataPtr);
-  int shift_length = 0;
-  // Calculate the total move length and move the data pointers in advance.
-  for (; it != packets_.end(); ++it) {
-    shift_length += (*it).sizeBytes;
-    if ((*it).dataPtr != NULL)
-      (*it).dataPtr += steps_to_shift;
-  }
-  memmove(first_packet_ptr + steps_to_shift, first_packet_ptr, shift_length);
-}
-
-void VCMSessionInfo::UpdateCompleteSession() {
-  if (HaveFirstPacket() && HaveLastPacket()) {
-    // Do we have all the packets in this session?
-    bool complete_session = true;
-    PacketIterator it = packets_.begin();
-    PacketIterator prev_it = it;
-    ++it;
-    for (; it != packets_.end(); ++it) {
-      if (!InSequence(it, prev_it)) {
-        complete_session = false;
-        break;
-      }
-      prev_it = it;
-    }
-    complete_ = complete_session;
-  }
-}
-
-void VCMSessionInfo::UpdateDecodableSession(const FrameData& frame_data) {
-  // Irrelevant if session is already complete or decodable
-  if (complete_ || decodable_)
-    return;
-  // TODO(agalusza): Account for bursty loss.
-  // TODO(agalusza): Refine these values to better approximate optimal ones.
-  // Do not decode frames if the RTT is lower than this.
-  const int64_t kRttThreshold = 100;
-  // Do not decode frames if the number of packets is between these two
-  // thresholds.
-  const float kLowPacketPercentageThreshold = 0.2f;
-  const float kHighPacketPercentageThreshold = 0.8f;
-  if (frame_data.rtt_ms < kRttThreshold || frame_type_ == kVideoFrameKey ||
-      !HaveFirstPacket() ||
-      (NumPackets() <= kHighPacketPercentageThreshold *
-                           frame_data.rolling_average_packets_per_frame &&
-       NumPackets() > kLowPacketPercentageThreshold *
-                          frame_data.rolling_average_packets_per_frame))
-    return;
-
-  decodable_ = true;
-}
-
-bool VCMSessionInfo::complete() const {
-  return complete_;
-}
-
-bool VCMSessionInfo::decodable() const {
-  return decodable_;
-}
-
-// Find the end of the NAL unit which the packet pointed to by |packet_it|
-// belongs to. Returns an iterator to the last packet of the frame if the end
-// of the NAL unit wasn't found.
-VCMSessionInfo::PacketIterator VCMSessionInfo::FindNaluEnd(
-    PacketIterator packet_it) const {
-  if ((*packet_it).completeNALU == kNaluEnd ||
-      (*packet_it).completeNALU == kNaluComplete) {
-    return packet_it;
-  }
-  // Find the end of the NAL unit.
-  for (; packet_it != packets_.end(); ++packet_it) {
-    if (((*packet_it).completeNALU == kNaluComplete &&
-         (*packet_it).sizeBytes > 0) ||
-        // Found next NALU.
-        (*packet_it).completeNALU == kNaluStart)
-      return --packet_it;
-    if ((*packet_it).completeNALU == kNaluEnd)
-      return packet_it;
-  }
-  // The end wasn't found.
-  return --packet_it;
-}
-
-size_t VCMSessionInfo::DeletePacketData(PacketIterator start,
-                                        PacketIterator end) {
-  size_t bytes_to_delete = 0;  // The number of bytes to delete.
-  PacketIterator packet_after_end = end;
-  ++packet_after_end;
-
-  // Get the number of bytes to delete.
-  // Clear the size of these packets.
-  for (PacketIterator it = start; it != packet_after_end; ++it) {
-    bytes_to_delete += (*it).sizeBytes;
-    (*it).sizeBytes = 0;
-    (*it).dataPtr = NULL;
-  }
-  if (bytes_to_delete > 0)
-    ShiftSubsequentPackets(end, -static_cast<int>(bytes_to_delete));
-  return bytes_to_delete;
-}
-
-VCMSessionInfo::PacketIterator VCMSessionInfo::FindNextPartitionBeginning(
-    PacketIterator it) const {
-  while (it != packets_.end()) {
-    if ((*it).video_header.codecHeader.VP8.beginningOfPartition) {
-      return it;
-    }
-    ++it;
-  }
-  return it;
-}
-
-VCMSessionInfo::PacketIterator VCMSessionInfo::FindPartitionEnd(
-    PacketIterator it) const {
-  assert((*it).codec == kVideoCodecVP8);
-  PacketIterator prev_it = it;
-  const int partition_id = (*it).video_header.codecHeader.VP8.partitionId;
-  while (it != packets_.end()) {
-    bool beginning = (*it).video_header.codecHeader.VP8.beginningOfPartition;
-    int current_partition_id = (*it).video_header.codecHeader.VP8.partitionId;
-    bool packet_loss_found = (!beginning && !InSequence(it, prev_it));
-    if (packet_loss_found ||
-        (beginning && current_partition_id != partition_id)) {
-      // Missing packet, the previous packet was the last in sequence.
-      return prev_it;
-    }
-    prev_it = it;
-    ++it;
-  }
-  return prev_it;
-}
-
-bool VCMSessionInfo::InSequence(const PacketIterator& packet_it,
-                                const PacketIterator& prev_packet_it) {
-  // If the two iterators are pointing to the same packet they are considered
-  // to be in sequence.
-  return (packet_it == prev_packet_it ||
-          (static_cast<uint16_t>((*prev_packet_it).seqNum + 1) ==
-           (*packet_it).seqNum));
-}
-
-size_t VCMSessionInfo::MakeDecodable() {
-  size_t return_length = 0;
-  if (packets_.empty()) {
-    return 0;
-  }
-  PacketIterator it = packets_.begin();
-  // Make sure we remove the first NAL unit if it's not decodable.
-  if ((*it).completeNALU == kNaluIncomplete || (*it).completeNALU == kNaluEnd) {
-    PacketIterator nalu_end = FindNaluEnd(it);
-    return_length += DeletePacketData(it, nalu_end);
-    it = nalu_end;
-  }
-  PacketIterator prev_it = it;
-  // Take care of the rest of the NAL units.
-  for (; it != packets_.end(); ++it) {
-    bool start_of_nalu = ((*it).completeNALU == kNaluStart ||
-                          (*it).completeNALU == kNaluComplete);
-    if (!start_of_nalu && !InSequence(it, prev_it)) {
-      // Found a sequence number gap due to packet loss.
-      PacketIterator nalu_end = FindNaluEnd(it);
-      return_length += DeletePacketData(it, nalu_end);
-      it = nalu_end;
-    }
-    prev_it = it;
-  }
-  return return_length;
-}
-
-void VCMSessionInfo::SetNotDecodableIfIncomplete() {
-  // We don't need to check for completeness first because the two are
-  // orthogonal. If complete_ is true, decodable_ is irrelevant.
-  decodable_ = false;
-}
-
-bool VCMSessionInfo::HaveFirstPacket() const {
-  return !packets_.empty() && (first_packet_seq_num_ != -1);
-}
-
-bool VCMSessionInfo::HaveLastPacket() const {
-  return !packets_.empty() && (last_packet_seq_num_ != -1);
-}
-
-bool VCMSessionInfo::session_nack() const {
-  return session_nack_;
-}
-
-int VCMSessionInfo::InsertPacket(const VCMPacket& packet,
-                                 uint8_t* frame_buffer,
-                                 VCMDecodeErrorMode decode_error_mode,
-                                 const FrameData& frame_data) {
-  if (packet.frameType == kEmptyFrame) {
-    // Update sequence number of an empty packet.
-    // Only media packets are inserted into the packet list.
-    InformOfEmptyPacket(packet.seqNum);
-    return 0;
-  }
-
-  if (packets_.size() == kMaxPacketsInSession) {
-    LOG(LS_ERROR) << "Max number of packets per frame has been reached.";
-    return -1;
-  }
-
-  // Find the position of this packet in the packet list in sequence number
-  // order and insert it. Loop over the list in reverse order.
-  ReversePacketIterator rit = packets_.rbegin();
-  for (; rit != packets_.rend(); ++rit)
-    if (LatestSequenceNumber(packet.seqNum, (*rit).seqNum) == packet.seqNum)
-      break;
-
-  // Check for duplicate packets.
-  if (rit != packets_.rend() && (*rit).seqNum == packet.seqNum &&
-      (*rit).sizeBytes > 0)
-    return -2;
-
-  if (packet.codec == kVideoCodecH264) {
-    frame_type_ = packet.frameType;
-    if (packet.is_first_packet_in_frame &&
-        (first_packet_seq_num_ == -1 ||
-         IsNewerSequenceNumber(first_packet_seq_num_, packet.seqNum))) {
-      first_packet_seq_num_ = packet.seqNum;
-    }
-    if (packet.markerBit &&
-        (last_packet_seq_num_ == -1 ||
-         IsNewerSequenceNumber(packet.seqNum, last_packet_seq_num_))) {
-      last_packet_seq_num_ = packet.seqNum;
-    }
-  } else {
-    // Only insert media packets between first and last packets (when
-    // available).
-    // Placing check here, as to properly account for duplicate packets.
-    // Check if this is first packet (only valid for some codecs)
-    // Should only be set for one packet per session.
-    if (packet.is_first_packet_in_frame && first_packet_seq_num_ == -1) {
-      // The first packet in a frame signals the frame type.
-      frame_type_ = packet.frameType;
-      // Store the sequence number for the first packet.
-      first_packet_seq_num_ = static_cast<int>(packet.seqNum);
-    } else if (first_packet_seq_num_ != -1 &&
-               IsNewerSequenceNumber(first_packet_seq_num_, packet.seqNum)) {
-      LOG(LS_WARNING) << "Received packet with a sequence number which is out "
-                         "of frame boundaries";
-      return -3;
-    } else if (frame_type_ == kEmptyFrame && packet.frameType != kEmptyFrame) {
-      // Update the frame type with the type of the first media packet.
-      // TODO(mikhal): Can this trigger?
-      frame_type_ = packet.frameType;
-    }
-
-    // Track the marker bit, should only be set for one packet per session.
-    if (packet.markerBit && last_packet_seq_num_ == -1) {
-      last_packet_seq_num_ = static_cast<int>(packet.seqNum);
-    } else if (last_packet_seq_num_ != -1 &&
-               IsNewerSequenceNumber(packet.seqNum, last_packet_seq_num_)) {
-      LOG(LS_WARNING) << "Received packet with a sequence number which is out "
-                         "of frame boundaries";
-      return -3;
-    }
-  }
-
-  // The insert operation invalidates the iterator |rit|.
-  PacketIterator packet_list_it = packets_.insert(rit.base(), packet);
-
-  size_t returnLength = InsertBuffer(frame_buffer, packet_list_it);
-  UpdateCompleteSession();
-  if (decode_error_mode == kWithErrors)
-    decodable_ = true;
-  else if (decode_error_mode == kSelectiveErrors)
-    UpdateDecodableSession(frame_data);
-  return static_cast<int>(returnLength);
-}
-
-void VCMSessionInfo::InformOfEmptyPacket(uint16_t seq_num) {
-  // Empty packets may be FEC or filler packets. They are sequential and
-  // follow the data packets, therefore, we should only keep track of the high
-  // and low sequence numbers and may assume that the packets in between are
-  // empty packets belonging to the same frame (timestamp).
-  if (empty_seq_num_high_ == -1)
-    empty_seq_num_high_ = seq_num;
-  else
-    empty_seq_num_high_ = LatestSequenceNumber(seq_num, empty_seq_num_high_);
-  if (empty_seq_num_low_ == -1 ||
-      IsNewerSequenceNumber(empty_seq_num_low_, seq_num))
-    empty_seq_num_low_ = seq_num;
-}
-
-}  // namespace webrtc
diff --git a/modules/video_coding/session_info.h b/modules/video_coding/session_info.h
deleted file mode 100644
index a4eb405..0000000
--- a/modules/video_coding/session_info.h
+++ /dev/null
@@ -1,166 +0,0 @@
-/*
- *  Copyright (c) 2011 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_VIDEO_CODING_SESSION_INFO_H_
-#define WEBRTC_MODULES_VIDEO_CODING_SESSION_INFO_H_
-
-#include <list>
-#include <vector>
-
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/modules/video_coding/include/video_coding.h"
-#include "webrtc/modules/video_coding/packet.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-// Used to pass data from jitter buffer to session info.
-// This data is then used in determining whether a frame is decodable.
-struct FrameData {
-  int64_t rtt_ms;
-  float rolling_average_packets_per_frame;
-};
-
-class VCMSessionInfo {
- public:
-  VCMSessionInfo();
-
-  void UpdateDataPointers(const uint8_t* old_base_ptr,
-                          const uint8_t* new_base_ptr);
-  // NACK - Building the NACK lists.
-  // Build hard NACK list: Zero out all entries in list up to and including
-  // _lowSeqNum.
-  int BuildHardNackList(int* seq_num_list,
-                        int seq_num_list_length,
-                        int nack_seq_nums_index);
-
-  // Build soft NACK list:  Zero out only a subset of the packets, discard
-  // empty packets.
-  int BuildSoftNackList(int* seq_num_list,
-                        int seq_num_list_length,
-                        int nack_seq_nums_index,
-                        int rtt_ms);
-  void Reset();
-  int InsertPacket(const VCMPacket& packet,
-                   uint8_t* frame_buffer,
-                   VCMDecodeErrorMode enable_decodable_state,
-                   const FrameData& frame_data);
-  bool complete() const;
-  bool decodable() const;
-
-  // Makes the frame decodable. I.e., only contain decodable NALUs. All
-  // non-decodable NALUs will be deleted and packets will be moved to in
-  // memory to remove any empty space.
-  // Returns the number of bytes deleted from the session.
-  size_t MakeDecodable();
-
-  // Sets decodable_ to false.
-  // Used by the dual decoder. After the mode is changed to kNoErrors from
-  // kWithErrors or kSelective errors, any states that have been marked
-  // decodable and are not complete are marked as non-decodable.
-  void SetNotDecodableIfIncomplete();
-
-  size_t SessionLength() const;
-  int NumPackets() const;
-  bool HaveFirstPacket() const;
-  bool HaveLastPacket() const;
-  bool session_nack() const;
-  webrtc::FrameType FrameType() const { return frame_type_; }
-  int LowSequenceNumber() const;
-
-  // Returns highest sequence number, media or empty.
-  int HighSequenceNumber() const;
-  int PictureId() const;
-  int TemporalId() const;
-  bool LayerSync() const;
-  int Tl0PicId() const;
-  bool NonReference() const;
-
-  std::vector<NaluInfo> GetNaluInfos() const;
-
-  void SetGofInfo(const GofInfoVP9& gof_info, size_t idx);
-
-  // The number of packets discarded because the decoder can't make use of
-  // them.
-  int packets_not_decodable() const;
-
- private:
-  enum { kMaxVP8Partitions = 9 };
-
-  typedef std::list<VCMPacket> PacketList;
-  typedef PacketList::iterator PacketIterator;
-  typedef PacketList::const_iterator PacketIteratorConst;
-  typedef PacketList::reverse_iterator ReversePacketIterator;
-
-  void InformOfEmptyPacket(uint16_t seq_num);
-
-  // Finds the packet of the beginning of the next VP8 partition. If
-  // none is found the returned iterator points to |packets_.end()|.
-  // |it| is expected to point to the last packet of the previous partition,
-  // or to the first packet of the frame. |packets_skipped| is incremented
-  // for each packet found which doesn't have the beginning bit set.
-  PacketIterator FindNextPartitionBeginning(PacketIterator it) const;
-
-  // Returns an iterator pointing to the last packet of the partition pointed to
-  // by |it|.
-  PacketIterator FindPartitionEnd(PacketIterator it) const;
-  static bool InSequence(const PacketIterator& it,
-                         const PacketIterator& prev_it);
-  size_t InsertBuffer(uint8_t* frame_buffer, PacketIterator packetIterator);
-  size_t Insert(const uint8_t* buffer,
-                size_t length,
-                bool insert_start_code,
-                uint8_t* frame_buffer);
-  void ShiftSubsequentPackets(PacketIterator it, int steps_to_shift);
-  PacketIterator FindNaluEnd(PacketIterator packet_iter) const;
-  // Deletes the data of all packets between |start| and |end|, inclusively.
-  // Note that this function doesn't delete the actual packets.
-  size_t DeletePacketData(PacketIterator start, PacketIterator end);
-  void UpdateCompleteSession();
-
-  // When enabled, determine if session is decodable, i.e. incomplete but
-  // would be sent to the decoder.
-  // Note: definition assumes random loss.
-  // A frame is defined to be decodable when:
-  //  Round trip time is higher than threshold
-  //  It is not a key frame
-  //  It has the first packet: In VP8 the first packet contains all or part of
-  //    the first partition, which consists of the most relevant information for
-  //    decoding.
-  //  Either more than the upper threshold of the average number of packets per
-  //        frame is present
-  //      or less than the lower threshold of the average number of packets per
-  //        frame is present: suggests a small frame. Such a frame is unlikely
-  //        to contain many motion vectors, so having the first packet will
-  //        likely suffice. Once we have more than the lower threshold of the
-  //        frame, we know that the frame is medium or large-sized.
-  void UpdateDecodableSession(const FrameData& frame_data);
-
-  // If this session has been NACKed by the jitter buffer.
-  bool session_nack_;
-  bool complete_;
-  bool decodable_;
-  webrtc::FrameType frame_type_;
-  // Packets in this frame.
-  PacketList packets_;
-  int empty_seq_num_low_;
-  int empty_seq_num_high_;
-
-  // The following two variables correspond to the first and last media packets
-  // in a session defined by the first packet flag and the marker bit.
-  // They are not necessarily equal to the front and back packets, as packets
-  // may enter out of order.
-  // TODO(mikhal): Refactor the list to use a map.
-  int first_packet_seq_num_;
-  int last_packet_seq_num_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_VIDEO_CODING_SESSION_INFO_H_
diff --git a/modules/video_coding/session_info_unittest.cc b/modules/video_coding/session_info_unittest.cc
deleted file mode 100644
index 6705a78..0000000
--- a/modules/video_coding/session_info_unittest.cc
+++ /dev/null
@@ -1,560 +0,0 @@
-/*
- *  Copyright (c) 2012 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 <string.h>
-
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/modules/video_coding/packet.h"
-#include "webrtc/modules/video_coding/session_info.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-class TestSessionInfo : public ::testing::Test {
- protected:
-  virtual void SetUp() {
-    memset(packet_buffer_, 0, sizeof(packet_buffer_));
-    memset(frame_buffer_, 0, sizeof(frame_buffer_));
-    session_.Reset();
-    packet_.Reset();
-    packet_.frameType = kVideoFrameDelta;
-    packet_.sizeBytes = packet_buffer_size();
-    packet_.dataPtr = packet_buffer_;
-    packet_.seqNum = 0;
-    packet_.timestamp = 0;
-    frame_data.rtt_ms = 0;
-    frame_data.rolling_average_packets_per_frame = -1;
-  }
-
-  void FillPacket(uint8_t start_value) {
-    for (size_t i = 0; i < packet_buffer_size(); ++i)
-      packet_buffer_[i] = start_value + i;
-  }
-
-  void VerifyPacket(uint8_t* start_ptr, uint8_t start_value) {
-    for (size_t j = 0; j < packet_buffer_size(); ++j) {
-      ASSERT_EQ(start_value + j, start_ptr[j]);
-    }
-  }
-
-  size_t packet_buffer_size() const {
-    return sizeof(packet_buffer_) / sizeof(packet_buffer_[0]);
-  }
-  size_t frame_buffer_size() const {
-    return sizeof(frame_buffer_) / sizeof(frame_buffer_[0]);
-  }
-
-  enum { kPacketBufferSize = 10 };
-
-  uint8_t packet_buffer_[kPacketBufferSize];
-  uint8_t frame_buffer_[10 * kPacketBufferSize];
-
-  VCMSessionInfo session_;
-  VCMPacket packet_;
-  FrameData frame_data;
-};
-
-class TestNalUnits : public TestSessionInfo {
- protected:
-  virtual void SetUp() {
-    TestSessionInfo::SetUp();
-    packet_.codec = kVideoCodecVP8;
-  }
-
-  bool VerifyNalu(int offset, int packets_expected, int start_value) {
-    EXPECT_GE(session_.SessionLength(),
-              packets_expected * packet_buffer_size());
-    for (int i = 0; i < packets_expected; ++i) {
-      int packet_index = (offset + i) * packet_buffer_size();
-      VerifyPacket(frame_buffer_ + packet_index, start_value + i);
-    }
-    return true;
-  }
-};
-
-class TestNackList : public TestSessionInfo {
- protected:
-  static const size_t kMaxSeqNumListLength = 30;
-
-  virtual void SetUp() {
-    TestSessionInfo::SetUp();
-    seq_num_list_length_ = 0;
-    memset(seq_num_list_, 0, sizeof(seq_num_list_));
-  }
-
-  void BuildSeqNumList(uint16_t low, uint16_t high) {
-    size_t i = 0;
-    while (low != high + 1) {
-      EXPECT_LT(i, kMaxSeqNumListLength);
-      if (i >= kMaxSeqNumListLength) {
-        seq_num_list_length_ = kMaxSeqNumListLength;
-        return;
-      }
-      seq_num_list_[i] = low;
-      low++;
-      i++;
-    }
-    seq_num_list_length_ = i;
-  }
-
-  void VerifyAll(int value) {
-    for (int i = 0; i < seq_num_list_length_; ++i)
-      EXPECT_EQ(seq_num_list_[i], value);
-  }
-
-  int seq_num_list_[kMaxSeqNumListLength];
-  int seq_num_list_length_;
-};
-
-TEST_F(TestSessionInfo, TestSimpleAPIs) {
-  packet_.is_first_packet_in_frame = true;
-  packet_.seqNum = 0xFFFE;
-  packet_.sizeBytes = packet_buffer_size();
-  packet_.frameType = kVideoFrameKey;
-  FillPacket(0);
-  EXPECT_EQ(packet_buffer_size(),
-            static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
-                                                      kNoErrors, frame_data)));
-  EXPECT_FALSE(session_.HaveLastPacket());
-  EXPECT_EQ(kVideoFrameKey, session_.FrameType());
-
-  packet_.is_first_packet_in_frame = false;
-  packet_.markerBit = true;
-  packet_.seqNum += 1;
-  EXPECT_EQ(packet_buffer_size(),
-            static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
-                                                      kNoErrors, frame_data)));
-  EXPECT_TRUE(session_.HaveLastPacket());
-  EXPECT_EQ(packet_.seqNum, session_.HighSequenceNumber());
-  EXPECT_EQ(0xFFFE, session_.LowSequenceNumber());
-
-  // Insert empty packet which will be the new high sequence number.
-  // To make things more difficult we will make sure to have a wrap here.
-  packet_.is_first_packet_in_frame = false;
-  packet_.markerBit = true;
-  packet_.seqNum = 2;
-  packet_.sizeBytes = 0;
-  packet_.frameType = kEmptyFrame;
-  EXPECT_EQ(
-      0, session_.InsertPacket(packet_, frame_buffer_, kNoErrors, frame_data));
-  EXPECT_EQ(packet_.seqNum, session_.HighSequenceNumber());
-}
-
-TEST_F(TestSessionInfo, NormalOperation) {
-  packet_.seqNum = 0xFFFF;
-  packet_.is_first_packet_in_frame = true;
-  packet_.markerBit = false;
-  FillPacket(0);
-  EXPECT_EQ(packet_buffer_size(),
-            static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
-                                                      kNoErrors, frame_data)));
-
-  packet_.is_first_packet_in_frame = false;
-  for (int i = 1; i < 9; ++i) {
-    packet_.seqNum += 1;
-    FillPacket(i);
-    ASSERT_EQ(packet_buffer_size(),
-              static_cast<size_t>(session_.InsertPacket(
-                  packet_, frame_buffer_, kNoErrors, frame_data)));
-  }
-
-  packet_.seqNum += 1;
-  packet_.markerBit = true;
-  FillPacket(9);
-  EXPECT_EQ(packet_buffer_size(),
-            static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
-                                                      kNoErrors, frame_data)));
-
-  EXPECT_EQ(10 * packet_buffer_size(), session_.SessionLength());
-  for (int i = 0; i < 10; ++i) {
-    SCOPED_TRACE("Calling VerifyPacket");
-    VerifyPacket(frame_buffer_ + i * packet_buffer_size(), i);
-  }
-}
-
-TEST_F(TestSessionInfo, ErrorsEqualDecodableState) {
-  packet_.seqNum = 0xFFFF;
-  packet_.is_first_packet_in_frame = false;
-  packet_.markerBit = false;
-  FillPacket(3);
-  EXPECT_EQ(packet_buffer_size(),
-            static_cast<size_t>(session_.InsertPacket(
-                packet_, frame_buffer_, kWithErrors, frame_data)));
-  EXPECT_TRUE(session_.decodable());
-}
-
-TEST_F(TestSessionInfo, SelectiveDecodableState) {
-  packet_.seqNum = 0xFFFF;
-  packet_.is_first_packet_in_frame = false;
-  packet_.markerBit = false;
-  FillPacket(1);
-  frame_data.rolling_average_packets_per_frame = 11;
-  frame_data.rtt_ms = 150;
-  EXPECT_EQ(packet_buffer_size(),
-            static_cast<size_t>(session_.InsertPacket(
-                packet_, frame_buffer_, kSelectiveErrors, frame_data)));
-  EXPECT_FALSE(session_.decodable());
-
-  packet_.seqNum -= 1;
-  FillPacket(0);
-  packet_.is_first_packet_in_frame = true;
-  EXPECT_EQ(packet_buffer_size(),
-            static_cast<size_t>(session_.InsertPacket(
-                packet_, frame_buffer_, kSelectiveErrors, frame_data)));
-  EXPECT_TRUE(session_.decodable());
-
-  packet_.is_first_packet_in_frame = false;
-  packet_.seqNum += 1;
-  for (int i = 2; i < 8; ++i) {
-    packet_.seqNum += 1;
-    FillPacket(i);
-    EXPECT_EQ(packet_buffer_size(),
-              static_cast<size_t>(session_.InsertPacket(
-                  packet_, frame_buffer_, kSelectiveErrors, frame_data)));
-    EXPECT_TRUE(session_.decodable());
-  }
-
-  packet_.seqNum += 1;
-  FillPacket(8);
-  EXPECT_EQ(packet_buffer_size(),
-            static_cast<size_t>(session_.InsertPacket(
-                packet_, frame_buffer_, kSelectiveErrors, frame_data)));
-  EXPECT_TRUE(session_.decodable());
-}
-
-TEST_F(TestSessionInfo, OutOfBoundsPackets1PacketFrame) {
-  packet_.seqNum = 0x0001;
-  packet_.is_first_packet_in_frame = true;
-  packet_.markerBit = true;
-  FillPacket(1);
-  EXPECT_EQ(packet_buffer_size(),
-            static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
-                                                      kNoErrors, frame_data)));
-
-  packet_.seqNum = 0x0004;
-  packet_.is_first_packet_in_frame = true;
-  packet_.markerBit = true;
-  FillPacket(1);
-  EXPECT_EQ(
-      -3, session_.InsertPacket(packet_, frame_buffer_, kNoErrors, frame_data));
-  packet_.seqNum = 0x0000;
-  packet_.is_first_packet_in_frame = false;
-  packet_.markerBit = false;
-  FillPacket(1);
-  EXPECT_EQ(
-      -3, session_.InsertPacket(packet_, frame_buffer_, kNoErrors, frame_data));
-}
-
-TEST_F(TestSessionInfo, SetMarkerBitOnce) {
-  packet_.seqNum = 0x0005;
-  packet_.is_first_packet_in_frame = false;
-  packet_.markerBit = true;
-  FillPacket(1);
-  EXPECT_EQ(packet_buffer_size(),
-            static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
-                                                      kNoErrors, frame_data)));
-  ++packet_.seqNum;
-  packet_.is_first_packet_in_frame = true;
-  packet_.markerBit = true;
-  FillPacket(1);
-  EXPECT_EQ(
-      -3, session_.InsertPacket(packet_, frame_buffer_, kNoErrors, frame_data));
-}
-
-TEST_F(TestSessionInfo, OutOfBoundsPacketsBase) {
-  // Allow packets in the range 5-6.
-  packet_.seqNum = 0x0005;
-  packet_.is_first_packet_in_frame = true;
-  packet_.markerBit = false;
-  FillPacket(1);
-  EXPECT_EQ(packet_buffer_size(),
-            static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
-                                                      kNoErrors, frame_data)));
-  // Insert an older packet with a first packet set.
-  packet_.seqNum = 0x0004;
-  packet_.is_first_packet_in_frame = true;
-  packet_.markerBit = true;
-  FillPacket(1);
-  EXPECT_EQ(
-      -3, session_.InsertPacket(packet_, frame_buffer_, kNoErrors, frame_data));
-  packet_.seqNum = 0x0006;
-  packet_.is_first_packet_in_frame = true;
-  packet_.markerBit = true;
-  FillPacket(1);
-  EXPECT_EQ(packet_buffer_size(),
-            static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
-                                                      kNoErrors, frame_data)));
-  packet_.seqNum = 0x0008;
-  packet_.is_first_packet_in_frame = false;
-  packet_.markerBit = true;
-  FillPacket(1);
-  EXPECT_EQ(
-      -3, session_.InsertPacket(packet_, frame_buffer_, kNoErrors, frame_data));
-}
-
-TEST_F(TestSessionInfo, OutOfBoundsPacketsWrap) {
-  packet_.seqNum = 0xFFFE;
-  packet_.is_first_packet_in_frame = true;
-  packet_.markerBit = false;
-  FillPacket(1);
-  EXPECT_EQ(packet_buffer_size(),
-            static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
-                                                      kNoErrors, frame_data)));
-
-  packet_.seqNum = 0x0004;
-  packet_.is_first_packet_in_frame = false;
-  packet_.markerBit = true;
-  FillPacket(1);
-  EXPECT_EQ(packet_buffer_size(),
-            static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
-                                                      kNoErrors, frame_data)));
-  packet_.seqNum = 0x0002;
-  packet_.is_first_packet_in_frame = false;
-  packet_.markerBit = false;
-  FillPacket(1);
-  ASSERT_EQ(packet_buffer_size(),
-            static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
-                                                      kNoErrors, frame_data)));
-  packet_.seqNum = 0xFFF0;
-  packet_.is_first_packet_in_frame = false;
-  packet_.markerBit = false;
-  FillPacket(1);
-  EXPECT_EQ(
-      -3, session_.InsertPacket(packet_, frame_buffer_, kNoErrors, frame_data));
-  packet_.seqNum = 0x0006;
-  packet_.is_first_packet_in_frame = false;
-  packet_.markerBit = false;
-  FillPacket(1);
-  EXPECT_EQ(
-      -3, session_.InsertPacket(packet_, frame_buffer_, kNoErrors, frame_data));
-}
-
-TEST_F(TestSessionInfo, OutOfBoundsOutOfOrder) {
-  // Insert out of bound regular packets, and then the first and last packet.
-  // Verify that correct bounds are maintained.
-  packet_.seqNum = 0x0003;
-  packet_.is_first_packet_in_frame = false;
-  packet_.markerBit = false;
-  FillPacket(1);
-  EXPECT_EQ(packet_buffer_size(),
-            static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
-                                                      kNoErrors, frame_data)));
-  // Insert an older packet with a first packet set.
-  packet_.seqNum = 0x0005;
-  packet_.is_first_packet_in_frame = true;
-  packet_.markerBit = false;
-  FillPacket(1);
-  EXPECT_EQ(packet_buffer_size(),
-            static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
-                                                      kNoErrors, frame_data)));
-  packet_.seqNum = 0x0004;
-  packet_.is_first_packet_in_frame = false;
-  packet_.markerBit = false;
-  FillPacket(1);
-  EXPECT_EQ(
-      -3, session_.InsertPacket(packet_, frame_buffer_, kNoErrors, frame_data));
-  packet_.seqNum = 0x0010;
-  packet_.is_first_packet_in_frame = false;
-  packet_.markerBit = false;
-  FillPacket(1);
-  EXPECT_EQ(packet_buffer_size(),
-            static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
-                                                      kNoErrors, frame_data)));
-  packet_.seqNum = 0x0008;
-  packet_.is_first_packet_in_frame = false;
-  packet_.markerBit = true;
-  FillPacket(1);
-  EXPECT_EQ(packet_buffer_size(),
-            static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
-                                                      kNoErrors, frame_data)));
-
-  packet_.seqNum = 0x0009;
-  packet_.is_first_packet_in_frame = false;
-  packet_.markerBit = false;
-  FillPacket(1);
-  EXPECT_EQ(
-      -3, session_.InsertPacket(packet_, frame_buffer_, kNoErrors, frame_data));
-}
-
-TEST_F(TestNalUnits, OnlyReceivedEmptyPacket) {
-  packet_.is_first_packet_in_frame = false;
-  packet_.completeNALU = kNaluComplete;
-  packet_.frameType = kEmptyFrame;
-  packet_.sizeBytes = 0;
-  packet_.seqNum = 0;
-  packet_.markerBit = false;
-  EXPECT_EQ(
-      0, session_.InsertPacket(packet_, frame_buffer_, kNoErrors, frame_data));
-
-  EXPECT_EQ(0U, session_.MakeDecodable());
-  EXPECT_EQ(0U, session_.SessionLength());
-}
-
-TEST_F(TestNalUnits, OneIsolatedNaluLoss) {
-  packet_.is_first_packet_in_frame = true;
-  packet_.completeNALU = kNaluComplete;
-  packet_.seqNum = 0;
-  packet_.markerBit = false;
-  FillPacket(0);
-  EXPECT_EQ(packet_buffer_size(),
-            static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
-                                                      kNoErrors, frame_data)));
-
-  packet_.is_first_packet_in_frame = false;
-  packet_.completeNALU = kNaluComplete;
-  packet_.seqNum += 2;
-  packet_.markerBit = true;
-  FillPacket(2);
-  EXPECT_EQ(packet_buffer_size(),
-            static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
-                                                      kNoErrors, frame_data)));
-
-  EXPECT_EQ(0U, session_.MakeDecodable());
-  EXPECT_EQ(2 * packet_buffer_size(), session_.SessionLength());
-  SCOPED_TRACE("Calling VerifyNalu");
-  EXPECT_TRUE(VerifyNalu(0, 1, 0));
-  SCOPED_TRACE("Calling VerifyNalu");
-  EXPECT_TRUE(VerifyNalu(1, 1, 2));
-}
-
-TEST_F(TestNalUnits, LossInMiddleOfNalu) {
-  packet_.is_first_packet_in_frame = true;
-  packet_.completeNALU = kNaluComplete;
-  packet_.seqNum = 0;
-  packet_.markerBit = false;
-  FillPacket(0);
-  EXPECT_EQ(packet_buffer_size(),
-            static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
-                                                      kNoErrors, frame_data)));
-
-  packet_.is_first_packet_in_frame = false;
-  packet_.completeNALU = kNaluEnd;
-  packet_.seqNum += 2;
-  packet_.markerBit = true;
-  FillPacket(2);
-  EXPECT_EQ(packet_buffer_size(),
-            static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
-                                                      kNoErrors, frame_data)));
-
-  EXPECT_EQ(packet_buffer_size(), session_.MakeDecodable());
-  EXPECT_EQ(packet_buffer_size(), session_.SessionLength());
-  SCOPED_TRACE("Calling VerifyNalu");
-  EXPECT_TRUE(VerifyNalu(0, 1, 0));
-}
-
-TEST_F(TestNalUnits, StartAndEndOfLastNalUnitLost) {
-  packet_.is_first_packet_in_frame = true;
-  packet_.completeNALU = kNaluComplete;
-  packet_.seqNum = 0;
-  packet_.markerBit = false;
-  FillPacket(0);
-  EXPECT_EQ(packet_buffer_size(),
-            static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
-                                                      kNoErrors, frame_data)));
-
-  packet_.is_first_packet_in_frame = false;
-  packet_.completeNALU = kNaluIncomplete;
-  packet_.seqNum += 2;
-  packet_.markerBit = false;
-  FillPacket(1);
-  EXPECT_EQ(packet_buffer_size(),
-            static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
-                                                      kNoErrors, frame_data)));
-
-  EXPECT_EQ(packet_buffer_size(), session_.MakeDecodable());
-  EXPECT_EQ(packet_buffer_size(), session_.SessionLength());
-  SCOPED_TRACE("Calling VerifyNalu");
-  EXPECT_TRUE(VerifyNalu(0, 1, 0));
-}
-
-TEST_F(TestNalUnits, ReorderWrapNoLoss) {
-  packet_.seqNum = 0xFFFF;
-  packet_.is_first_packet_in_frame = false;
-  packet_.completeNALU = kNaluIncomplete;
-  packet_.seqNum += 1;
-  packet_.markerBit = false;
-  FillPacket(1);
-  EXPECT_EQ(packet_buffer_size(),
-            static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
-                                                      kNoErrors, frame_data)));
-
-  packet_.is_first_packet_in_frame = true;
-  packet_.completeNALU = kNaluComplete;
-  packet_.seqNum -= 1;
-  packet_.markerBit = false;
-  FillPacket(0);
-  EXPECT_EQ(packet_buffer_size(),
-            static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
-                                                      kNoErrors, frame_data)));
-
-  packet_.is_first_packet_in_frame = false;
-  packet_.completeNALU = kNaluEnd;
-  packet_.seqNum += 2;
-  packet_.markerBit = true;
-  FillPacket(2);
-  EXPECT_EQ(packet_buffer_size(),
-            static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
-                                                      kNoErrors, frame_data)));
-
-  EXPECT_EQ(0U, session_.MakeDecodable());
-  EXPECT_EQ(3 * packet_buffer_size(), session_.SessionLength());
-  SCOPED_TRACE("Calling VerifyNalu");
-  EXPECT_TRUE(VerifyNalu(0, 1, 0));
-}
-
-TEST_F(TestNalUnits, WrapLosses) {
-  packet_.seqNum = 0xFFFF;
-  packet_.is_first_packet_in_frame = false;
-  packet_.completeNALU = kNaluIncomplete;
-  packet_.markerBit = false;
-  FillPacket(1);
-  EXPECT_EQ(packet_buffer_size(),
-            static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
-                                                      kNoErrors, frame_data)));
-
-  packet_.is_first_packet_in_frame = false;
-  packet_.completeNALU = kNaluEnd;
-  packet_.seqNum += 2;
-  packet_.markerBit = true;
-  FillPacket(2);
-  EXPECT_EQ(packet_buffer_size(),
-            static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
-                                                      kNoErrors, frame_data)));
-
-  EXPECT_EQ(2 * packet_buffer_size(), session_.MakeDecodable());
-  EXPECT_EQ(0U, session_.SessionLength());
-}
-
-TEST_F(TestNalUnits, ReorderWrapLosses) {
-  packet_.seqNum = 0xFFFF;
-
-  packet_.is_first_packet_in_frame = false;
-  packet_.completeNALU = kNaluEnd;
-  packet_.seqNum += 2;
-  packet_.markerBit = true;
-  FillPacket(2);
-  EXPECT_EQ(packet_buffer_size(),
-            static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
-                                                      kNoErrors, frame_data)));
-
-  packet_.seqNum -= 2;
-  packet_.is_first_packet_in_frame = false;
-  packet_.completeNALU = kNaluIncomplete;
-  packet_.markerBit = false;
-  FillPacket(1);
-  EXPECT_EQ(packet_buffer_size(),
-            static_cast<size_t>(session_.InsertPacket(packet_, frame_buffer_,
-                                                      kNoErrors, frame_data)));
-
-  EXPECT_EQ(2 * packet_buffer_size(), session_.MakeDecodable());
-  EXPECT_EQ(0U, session_.SessionLength());
-}
-
-}  // namespace webrtc
diff --git a/modules/video_coding/test/stream_generator.cc b/modules/video_coding/test/stream_generator.cc
deleted file mode 100644
index ad95dc0..0000000
--- a/modules/video_coding/test/stream_generator.cc
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- *  Copyright (c) 2013 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/video_coding/test/stream_generator.h"
-
-#include <string.h>
-
-#include <list>
-
-#include "webrtc/modules/video_coding/packet.h"
-#include "webrtc/system_wrappers/include/clock.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-StreamGenerator::StreamGenerator(uint16_t start_seq_num, int64_t current_time)
-    : packets_(), sequence_number_(start_seq_num), start_time_(current_time) {}
-
-void StreamGenerator::Init(uint16_t start_seq_num, int64_t current_time) {
-  packets_.clear();
-  sequence_number_ = start_seq_num;
-  start_time_ = current_time;
-  memset(packet_buffer_, 0, sizeof(packet_buffer_));
-}
-
-void StreamGenerator::GenerateFrame(FrameType type,
-                                    int num_media_packets,
-                                    int num_empty_packets,
-                                    int64_t time_ms) {
-  uint32_t timestamp = 90 * (time_ms - start_time_);
-  for (int i = 0; i < num_media_packets; ++i) {
-    const int packet_size =
-        (kFrameSize + num_media_packets / 2) / num_media_packets;
-    bool marker_bit = (i == num_media_packets - 1);
-    packets_.push_back(GeneratePacket(sequence_number_, timestamp, packet_size,
-                                      (i == 0), marker_bit, type));
-    ++sequence_number_;
-  }
-  for (int i = 0; i < num_empty_packets; ++i) {
-    packets_.push_back(GeneratePacket(sequence_number_, timestamp, 0, false,
-                                      false, kEmptyFrame));
-    ++sequence_number_;
-  }
-}
-
-VCMPacket StreamGenerator::GeneratePacket(uint16_t sequence_number,
-                                          uint32_t timestamp,
-                                          unsigned int size,
-                                          bool first_packet,
-                                          bool marker_bit,
-                                          FrameType type) {
-  EXPECT_LT(size, kMaxPacketSize);
-  VCMPacket packet;
-  packet.seqNum = sequence_number;
-  packet.timestamp = timestamp;
-  packet.frameType = type;
-  packet.is_first_packet_in_frame = first_packet;
-  packet.markerBit = marker_bit;
-  packet.sizeBytes = size;
-  packet.dataPtr = packet_buffer_;
-  if (packet.is_first_packet_in_frame)
-    packet.completeNALU = kNaluStart;
-  else if (packet.markerBit)
-    packet.completeNALU = kNaluEnd;
-  else
-    packet.completeNALU = kNaluIncomplete;
-  return packet;
-}
-
-bool StreamGenerator::PopPacket(VCMPacket* packet, int index) {
-  std::list<VCMPacket>::iterator it = GetPacketIterator(index);
-  if (it == packets_.end())
-    return false;
-  if (packet)
-    *packet = (*it);
-  packets_.erase(it);
-  return true;
-}
-
-bool StreamGenerator::GetPacket(VCMPacket* packet, int index) {
-  std::list<VCMPacket>::iterator it = GetPacketIterator(index);
-  if (it == packets_.end())
-    return false;
-  if (packet)
-    *packet = (*it);
-  return true;
-}
-
-bool StreamGenerator::NextPacket(VCMPacket* packet) {
-  if (packets_.empty())
-    return false;
-  if (packet != NULL)
-    *packet = packets_.front();
-  packets_.pop_front();
-  return true;
-}
-
-void StreamGenerator::DropLastPacket() {
-  packets_.pop_back();
-}
-
-uint16_t StreamGenerator::NextSequenceNumber() const {
-  if (packets_.empty())
-    return sequence_number_;
-  return packets_.front().seqNum;
-}
-
-int StreamGenerator::PacketsRemaining() const {
-  return packets_.size();
-}
-
-std::list<VCMPacket>::iterator StreamGenerator::GetPacketIterator(int index) {
-  std::list<VCMPacket>::iterator it = packets_.begin();
-  for (int i = 0; i < index; ++i) {
-    ++it;
-    if (it == packets_.end())
-      break;
-  }
-  return it;
-}
-
-}  // namespace webrtc
diff --git a/modules/video_coding/test/stream_generator.h b/modules/video_coding/test/stream_generator.h
deleted file mode 100644
index eded9f4..0000000
--- a/modules/video_coding/test/stream_generator.h
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- *  Copyright (c) 2013 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_VIDEO_CODING_TEST_STREAM_GENERATOR_H_
-#define WEBRTC_MODULES_VIDEO_CODING_TEST_STREAM_GENERATOR_H_
-
-#include <list>
-
-#include "webrtc/modules/video_coding/packet.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-const unsigned int kDefaultBitrateKbps = 1000;
-const unsigned int kDefaultFrameRate = 25;
-const unsigned int kMaxPacketSize = 1500;
-const unsigned int kFrameSize =
-    (kDefaultBitrateKbps + kDefaultFrameRate * 4) / (kDefaultFrameRate * 8);
-const int kDefaultFramePeriodMs = 1000 / kDefaultFrameRate;
-
-class StreamGenerator {
- public:
-  StreamGenerator(uint16_t start_seq_num, int64_t current_time);
-  void Init(uint16_t start_seq_num, int64_t current_time);
-
-  // |time_ms| denotes the timestamp you want to put on the frame, and the unit
-  // is millisecond. GenerateFrame will translate |time_ms| into a 90kHz
-  // timestamp and put it on the frame.
-  void GenerateFrame(FrameType type,
-                     int num_media_packets,
-                     int num_empty_packets,
-                     int64_t time_ms);
-
-  bool PopPacket(VCMPacket* packet, int index);
-  void DropLastPacket();
-
-  bool GetPacket(VCMPacket* packet, int index);
-
-  bool NextPacket(VCMPacket* packet);
-
-  uint16_t NextSequenceNumber() const;
-
-  int PacketsRemaining() const;
-
- private:
-  VCMPacket GeneratePacket(uint16_t sequence_number,
-                           uint32_t timestamp,
-                           unsigned int size,
-                           bool first_packet,
-                           bool marker_bit,
-                           FrameType type);
-
-  std::list<VCMPacket>::iterator GetPacketIterator(int index);
-
-  std::list<VCMPacket> packets_;
-  uint16_t sequence_number_;
-  int64_t start_time_;
-  uint8_t packet_buffer_[kMaxPacketSize];
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(StreamGenerator);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_VIDEO_CODING_TEST_STREAM_GENERATOR_H_
diff --git a/modules/video_coding/test/test_util.h b/modules/video_coding/test/test_util.h
deleted file mode 100644
index 8424533..0000000
--- a/modules/video_coding/test/test_util.h
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- *  Copyright (c) 2012 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_VIDEO_CODING_TEST_TEST_UTIL_H_
-#define WEBRTC_MODULES_VIDEO_CODING_TEST_TEST_UTIL_H_
-
-#include "webrtc/system_wrappers/include/event_wrapper.h"
-
-class NullEventFactory : public webrtc::EventFactory {
- public:
-  virtual ~NullEventFactory() {}
-
-  webrtc::EventWrapper* CreateEvent() override { return new NullEvent; }
- private:
-  // Private class to avoid more dependencies on it in tests.
-  class NullEvent : public webrtc::EventWrapper {
-   public:
-    ~NullEvent() override {}
-    bool Set() override { return true; }
-    webrtc::EventTypeWrapper Wait(unsigned long max_time) override {  // NOLINT
-      return webrtc::kEventTimeout;
-    }
-  };
-};
-
-#endif  // WEBRTC_MODULES_VIDEO_CODING_TEST_TEST_UTIL_H_
diff --git a/modules/video_coding/timestamp_map.cc b/modules/video_coding/timestamp_map.cc
deleted file mode 100644
index 97d2777..0000000
--- a/modules/video_coding/timestamp_map.cc
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- *  Copyright (c) 2011 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 <assert.h>
-#include <stdlib.h>
-
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/modules/video_coding/timestamp_map.h"
-
-namespace webrtc {
-
-VCMTimestampMap::VCMTimestampMap(size_t capacity)
-    : ring_buffer_(new TimestampDataTuple[capacity]),
-      capacity_(capacity),
-      next_add_idx_(0),
-      next_pop_idx_(0) {}
-
-VCMTimestampMap::~VCMTimestampMap() {}
-
-void VCMTimestampMap::Add(uint32_t timestamp, VCMFrameInformation* data) {
-  ring_buffer_[next_add_idx_].timestamp = timestamp;
-  ring_buffer_[next_add_idx_].data = data;
-  next_add_idx_ = (next_add_idx_ + 1) % capacity_;
-
-  if (next_add_idx_ == next_pop_idx_) {
-    // Circular list full; forget oldest entry.
-    next_pop_idx_ = (next_pop_idx_ + 1) % capacity_;
-  }
-}
-
-VCMFrameInformation* VCMTimestampMap::Pop(uint32_t timestamp) {
-  while (!IsEmpty()) {
-    if (ring_buffer_[next_pop_idx_].timestamp == timestamp) {
-      // Found start time for this timestamp.
-      VCMFrameInformation* data = ring_buffer_[next_pop_idx_].data;
-      ring_buffer_[next_pop_idx_].data = nullptr;
-      next_pop_idx_ = (next_pop_idx_ + 1) % capacity_;
-      return data;
-    } else if (IsNewerTimestamp(ring_buffer_[next_pop_idx_].timestamp,
-                                timestamp)) {
-      // The timestamp we are looking for is not in the list.
-      return nullptr;
-    }
-
-    // Not in this position, check next (and forget this position).
-    next_pop_idx_ = (next_pop_idx_ + 1) % capacity_;
-  }
-
-  // Could not find matching timestamp in list.
-  return nullptr;
-}
-
-bool VCMTimestampMap::IsEmpty() const {
-  return (next_add_idx_ == next_pop_idx_);
-}
-}  // namespace webrtc
diff --git a/modules/video_coding/timestamp_map.h b/modules/video_coding/timestamp_map.h
deleted file mode 100644
index 8ec9029..0000000
--- a/modules/video_coding/timestamp_map.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- *  Copyright (c) 2011 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_VIDEO_CODING_TIMESTAMP_MAP_H_
-#define WEBRTC_MODULES_VIDEO_CODING_TIMESTAMP_MAP_H_
-
-#include <memory>
-
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-struct VCMFrameInformation;
-
-class VCMTimestampMap {
- public:
-  explicit VCMTimestampMap(size_t capacity);
-  ~VCMTimestampMap();
-
-  // Empty the map.
-  void Reset();
-
-  void Add(uint32_t timestamp, VCMFrameInformation* data);
-  VCMFrameInformation* Pop(uint32_t timestamp);
-
- private:
-  struct TimestampDataTuple {
-    uint32_t timestamp;
-    VCMFrameInformation* data;
-  };
-  bool IsEmpty() const;
-
-  std::unique_ptr<TimestampDataTuple[]> ring_buffer_;
-  const size_t capacity_;
-  size_t next_add_idx_;
-  size_t next_pop_idx_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_VIDEO_CODING_TIMESTAMP_MAP_H_
diff --git a/modules/video_coding/timing.cc b/modules/video_coding/timing.cc
deleted file mode 100644
index 340f2c1..0000000
--- a/modules/video_coding/timing.cc
+++ /dev/null
@@ -1,318 +0,0 @@
-/*
- *  Copyright (c) 2011 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/video_coding/timing.h"
-
-#include <algorithm>
-
-#include "webrtc/modules/video_coding/internal_defines.h"
-#include "webrtc/modules/video_coding/jitter_buffer_common.h"
-#include "webrtc/system_wrappers/include/clock.h"
-#include "webrtc/system_wrappers/include/metrics.h"
-#include "webrtc/system_wrappers/include/timestamp_extrapolator.h"
-
-namespace webrtc {
-
-VCMTiming::VCMTiming(Clock* clock, VCMTiming* master_timing)
-    : clock_(clock),
-      master_(false),
-      ts_extrapolator_(),
-      codec_timer_(new VCMCodecTimer()),
-      render_delay_ms_(kDefaultRenderDelayMs),
-      min_playout_delay_ms_(0),
-      max_playout_delay_ms_(10000),
-      jitter_delay_ms_(0),
-      current_delay_ms_(0),
-      last_decode_ms_(0),
-      prev_frame_timestamp_(0),
-      timing_frame_info_(),
-      num_decoded_frames_(0),
-      num_delayed_decoded_frames_(0),
-      first_decoded_frame_ms_(-1),
-      sum_missed_render_deadline_ms_(0) {
-  if (master_timing == NULL) {
-    master_ = true;
-    ts_extrapolator_ = new TimestampExtrapolator(clock_->TimeInMilliseconds());
-  } else {
-    ts_extrapolator_ = master_timing->ts_extrapolator_;
-  }
-}
-
-VCMTiming::~VCMTiming() {
-  UpdateHistograms();
-  if (master_) {
-    delete ts_extrapolator_;
-  }
-}
-
-void VCMTiming::UpdateHistograms() const {
-  rtc::CritScope cs(&crit_sect_);
-  if (num_decoded_frames_ == 0) {
-    return;
-  }
-  int64_t elapsed_sec =
-      (clock_->TimeInMilliseconds() - first_decoded_frame_ms_) / 1000;
-  if (elapsed_sec < metrics::kMinRunTimeInSeconds) {
-    return;
-  }
-  RTC_HISTOGRAM_COUNTS_100(
-      "WebRTC.Video.DecodedFramesPerSecond",
-      static_cast<int>((num_decoded_frames_ / elapsed_sec) + 0.5f));
-  RTC_HISTOGRAM_PERCENTAGE(
-      "WebRTC.Video.DelayedFramesToRenderer",
-      num_delayed_decoded_frames_ * 100 / num_decoded_frames_);
-  if (num_delayed_decoded_frames_ > 0) {
-    RTC_HISTOGRAM_COUNTS_1000(
-        "WebRTC.Video.DelayedFramesToRenderer_AvgDelayInMs",
-        sum_missed_render_deadline_ms_ / num_delayed_decoded_frames_);
-  }
-}
-
-void VCMTiming::Reset() {
-  rtc::CritScope cs(&crit_sect_);
-  ts_extrapolator_->Reset(clock_->TimeInMilliseconds());
-  codec_timer_.reset(new VCMCodecTimer());
-  render_delay_ms_ = kDefaultRenderDelayMs;
-  min_playout_delay_ms_ = 0;
-  jitter_delay_ms_ = 0;
-  current_delay_ms_ = 0;
-  prev_frame_timestamp_ = 0;
-}
-
-void VCMTiming::ResetDecodeTime() {
-  rtc::CritScope cs(&crit_sect_);
-  codec_timer_.reset(new VCMCodecTimer());
-}
-
-void VCMTiming::set_render_delay(int render_delay_ms) {
-  rtc::CritScope cs(&crit_sect_);
-  render_delay_ms_ = render_delay_ms;
-}
-
-void VCMTiming::set_min_playout_delay(int min_playout_delay_ms) {
-  rtc::CritScope cs(&crit_sect_);
-  min_playout_delay_ms_ = min_playout_delay_ms;
-}
-
-int VCMTiming::min_playout_delay() {
-  rtc::CritScope cs(&crit_sect_);
-  return min_playout_delay_ms_;
-}
-
-void VCMTiming::set_max_playout_delay(int max_playout_delay_ms) {
-  rtc::CritScope cs(&crit_sect_);
-  max_playout_delay_ms_ = max_playout_delay_ms;
-}
-
-int VCMTiming::max_playout_delay() {
-  rtc::CritScope cs(&crit_sect_);
-  return max_playout_delay_ms_;
-}
-
-void VCMTiming::SetJitterDelay(int jitter_delay_ms) {
-  rtc::CritScope cs(&crit_sect_);
-  if (jitter_delay_ms != jitter_delay_ms_) {
-    jitter_delay_ms_ = jitter_delay_ms;
-    // When in initial state, set current delay to minimum delay.
-    if (current_delay_ms_ == 0) {
-      current_delay_ms_ = jitter_delay_ms_;
-    }
-  }
-}
-
-void VCMTiming::UpdateCurrentDelay(uint32_t frame_timestamp) {
-  rtc::CritScope cs(&crit_sect_);
-  int target_delay_ms = TargetDelayInternal();
-
-  if (current_delay_ms_ == 0) {
-    // Not initialized, set current delay to target.
-    current_delay_ms_ = target_delay_ms;
-  } else if (target_delay_ms != current_delay_ms_) {
-    int64_t delay_diff_ms =
-        static_cast<int64_t>(target_delay_ms) - current_delay_ms_;
-    // Never change the delay with more than 100 ms every second. If we're
-    // changing the delay in too large steps we will get noticeable freezes. By
-    // limiting the change we can increase the delay in smaller steps, which
-    // will be experienced as the video is played in slow motion. When lowering
-    // the delay the video will be played at a faster pace.
-    int64_t max_change_ms = 0;
-    if (frame_timestamp < 0x0000ffff && prev_frame_timestamp_ > 0xffff0000) {
-      // wrap
-      max_change_ms = kDelayMaxChangeMsPerS *
-                      (frame_timestamp + (static_cast<int64_t>(1) << 32) -
-                       prev_frame_timestamp_) /
-                      90000;
-    } else {
-      max_change_ms = kDelayMaxChangeMsPerS *
-                      (frame_timestamp - prev_frame_timestamp_) / 90000;
-    }
-
-    if (max_change_ms <= 0) {
-      // Any changes less than 1 ms are truncated and
-      // will be postponed. Negative change will be due
-      // to reordering and should be ignored.
-      return;
-    }
-    delay_diff_ms = std::max(delay_diff_ms, -max_change_ms);
-    delay_diff_ms = std::min(delay_diff_ms, max_change_ms);
-
-    current_delay_ms_ = current_delay_ms_ + delay_diff_ms;
-  }
-  prev_frame_timestamp_ = frame_timestamp;
-}
-
-void VCMTiming::UpdateCurrentDelay(int64_t render_time_ms,
-                                   int64_t actual_decode_time_ms) {
-  rtc::CritScope cs(&crit_sect_);
-  uint32_t target_delay_ms = TargetDelayInternal();
-  int64_t delayed_ms =
-      actual_decode_time_ms -
-      (render_time_ms - RequiredDecodeTimeMs() - render_delay_ms_);
-  if (delayed_ms < 0) {
-    return;
-  }
-  if (current_delay_ms_ + delayed_ms <= target_delay_ms) {
-    current_delay_ms_ += delayed_ms;
-  } else {
-    current_delay_ms_ = target_delay_ms;
-  }
-}
-
-int32_t VCMTiming::StopDecodeTimer(uint32_t time_stamp,
-                                   int32_t decode_time_ms,
-                                   int64_t now_ms,
-                                   int64_t render_time_ms) {
-  rtc::CritScope cs(&crit_sect_);
-  codec_timer_->AddTiming(decode_time_ms, now_ms);
-  assert(decode_time_ms >= 0);
-  last_decode_ms_ = decode_time_ms;
-
-  // Update stats.
-  ++num_decoded_frames_;
-  if (num_decoded_frames_ == 1) {
-    first_decoded_frame_ms_ = now_ms;
-  }
-  int time_until_rendering_ms = render_time_ms - render_delay_ms_ - now_ms;
-  if (time_until_rendering_ms < 0) {
-    sum_missed_render_deadline_ms_ += -time_until_rendering_ms;
-    ++num_delayed_decoded_frames_;
-  }
-  return 0;
-}
-
-void VCMTiming::IncomingTimestamp(uint32_t time_stamp, int64_t now_ms) {
-  rtc::CritScope cs(&crit_sect_);
-  ts_extrapolator_->Update(now_ms, time_stamp);
-}
-
-int64_t VCMTiming::RenderTimeMs(uint32_t frame_timestamp,
-                                int64_t now_ms) const {
-  rtc::CritScope cs(&crit_sect_);
-  const int64_t render_time_ms = RenderTimeMsInternal(frame_timestamp, now_ms);
-  return render_time_ms;
-}
-
-int64_t VCMTiming::RenderTimeMsInternal(uint32_t frame_timestamp,
-                                        int64_t now_ms) const {
-  int64_t estimated_complete_time_ms =
-      ts_extrapolator_->ExtrapolateLocalTime(frame_timestamp);
-  if (estimated_complete_time_ms == -1) {
-    estimated_complete_time_ms = now_ms;
-  }
-
-  if (min_playout_delay_ms_ == 0 && max_playout_delay_ms_ == 0) {
-    // Render as soon as possible
-    return now_ms;
-  }
-
-  // Make sure the actual delay stays in the range of |min_playout_delay_ms_|
-  // and |max_playout_delay_ms_|.
-  int actual_delay = std::max(current_delay_ms_, min_playout_delay_ms_);
-  actual_delay = std::min(actual_delay, max_playout_delay_ms_);
-  return estimated_complete_time_ms + actual_delay;
-}
-
-// Must be called from inside a critical section.
-int VCMTiming::RequiredDecodeTimeMs() const {
-  const int decode_time_ms = codec_timer_->RequiredDecodeTimeMs();
-  assert(decode_time_ms >= 0);
-  return decode_time_ms;
-}
-
-uint32_t VCMTiming::MaxWaitingTime(int64_t render_time_ms,
-                                   int64_t now_ms) const {
-  rtc::CritScope cs(&crit_sect_);
-
-  const int64_t max_wait_time_ms =
-      render_time_ms - now_ms - RequiredDecodeTimeMs() - render_delay_ms_;
-
-  if (max_wait_time_ms < 0) {
-    return 0;
-  }
-  return static_cast<uint32_t>(max_wait_time_ms);
-}
-
-bool VCMTiming::EnoughTimeToDecode(
-    uint32_t available_processing_time_ms) const {
-  rtc::CritScope cs(&crit_sect_);
-  int64_t required_decode_time_ms = RequiredDecodeTimeMs();
-  if (required_decode_time_ms < 0) {
-    // Haven't decoded any frames yet, try decoding one to get an estimate
-    // of the decode time.
-    return true;
-  } else if (required_decode_time_ms == 0) {
-    // Decode time is less than 1, set to 1 for now since
-    // we don't have any better precision. Count ticks later?
-    required_decode_time_ms = 1;
-  }
-  return static_cast<int64_t>(available_processing_time_ms) -
-             required_decode_time_ms >
-         0;
-}
-
-int VCMTiming::TargetVideoDelay() const {
-  rtc::CritScope cs(&crit_sect_);
-  return TargetDelayInternal();
-}
-
-int VCMTiming::TargetDelayInternal() const {
-  return std::max(min_playout_delay_ms_,
-                  jitter_delay_ms_ + RequiredDecodeTimeMs() + render_delay_ms_);
-}
-
-bool VCMTiming::GetTimings(int* decode_ms,
-                           int* max_decode_ms,
-                           int* current_delay_ms,
-                           int* target_delay_ms,
-                           int* jitter_buffer_ms,
-                           int* min_playout_delay_ms,
-                           int* render_delay_ms) const {
-  rtc::CritScope cs(&crit_sect_);
-  *decode_ms = last_decode_ms_;
-  *max_decode_ms = RequiredDecodeTimeMs();
-  *current_delay_ms = current_delay_ms_;
-  *target_delay_ms = TargetDelayInternal();
-  *jitter_buffer_ms = jitter_delay_ms_;
-  *min_playout_delay_ms = min_playout_delay_ms_;
-  *render_delay_ms = render_delay_ms_;
-  return (num_decoded_frames_ > 0);
-}
-
-void VCMTiming::SetTimingFrameInfo(const TimingFrameInfo& info) {
-  rtc::CritScope cs(&crit_sect_);
-  timing_frame_info_.emplace(info);
-}
-
-rtc::Optional<TimingFrameInfo> VCMTiming::GetTimingFrameInfo() {
-  rtc::CritScope cs(&crit_sect_);
-  return timing_frame_info_;
-}
-
-}  // namespace webrtc
diff --git a/modules/video_coding/timing.h b/modules/video_coding/timing.h
deleted file mode 100644
index bbbb65f..0000000
--- a/modules/video_coding/timing.h
+++ /dev/null
@@ -1,147 +0,0 @@
-/*
- *  Copyright (c) 2011 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_VIDEO_CODING_TIMING_H_
-#define WEBRTC_MODULES_VIDEO_CODING_TIMING_H_
-
-#include <memory>
-
-#include "webrtc/modules/video_coding/codec_timer.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/thread_annotations.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-class Clock;
-class TimestampExtrapolator;
-
-class VCMTiming {
- public:
-  // The primary timing component should be passed
-  // if this is the dual timing component.
-  explicit VCMTiming(Clock* clock, VCMTiming* master_timing = NULL);
-  virtual ~VCMTiming();
-
-  // Resets the timing to the initial state.
-  void Reset();
-  void ResetDecodeTime();
-
-  // Set the amount of time needed to render an image. Defaults to 10 ms.
-  void set_render_delay(int render_delay_ms);
-
-  // Set the minimum time the video must be delayed on the receiver to
-  // get the desired jitter buffer level.
-  void SetJitterDelay(int required_delay_ms);
-
-  // Set the minimum playout delay from capture to render in ms.
-  void set_min_playout_delay(int min_playout_delay_ms);
-
-  // Returns the minimum playout delay from capture to render in ms.
-  int min_playout_delay();
-
-  // Set the maximum playout delay from capture to render in ms.
-  void set_max_playout_delay(int max_playout_delay_ms);
-
-  // Returns the maximum playout delay from capture to render in ms.
-  int max_playout_delay();
-
-  // Increases or decreases the current delay to get closer to the target delay.
-  // Calculates how long it has been since the previous call to this function,
-  // and increases/decreases the delay in proportion to the time difference.
-  void UpdateCurrentDelay(uint32_t frame_timestamp);
-
-  // Increases or decreases the current delay to get closer to the target delay.
-  // Given the actual decode time in ms and the render time in ms for a frame,
-  // this function calculates how late the frame is and increases the delay
-  // accordingly.
-  void UpdateCurrentDelay(int64_t render_time_ms,
-                          int64_t actual_decode_time_ms);
-
-  // Stops the decoder timer, should be called when the decoder returns a frame
-  // or when the decoded frame callback is called.
-  int32_t StopDecodeTimer(uint32_t time_stamp,
-                          int32_t decode_time_ms,
-                          int64_t now_ms,
-                          int64_t render_time_ms);
-
-  // Used to report that a frame is passed to decoding. Updates the timestamp
-  // filter which is used to map between timestamps and receiver system time.
-  void IncomingTimestamp(uint32_t time_stamp, int64_t last_packet_time_ms);
-  // Returns the receiver system time when the frame with timestamp
-  // frame_timestamp should be rendered, assuming that the system time currently
-  // is now_ms.
-  virtual int64_t RenderTimeMs(uint32_t frame_timestamp, int64_t now_ms) const;
-
-  // Returns the maximum time in ms that we can wait for a frame to become
-  // complete before we must pass it to the decoder.
-  virtual uint32_t MaxWaitingTime(int64_t render_time_ms, int64_t now_ms) const;
-
-  // Returns the current target delay which is required delay + decode time +
-  // render delay.
-  int TargetVideoDelay() const;
-
-  // Calculates whether or not there is enough time to decode a frame given a
-  // certain amount of processing time.
-  bool EnoughTimeToDecode(uint32_t available_processing_time_ms) const;
-
-  // Return current timing information. Returns true if the first frame has been
-  // decoded, false otherwise.
-  virtual bool GetTimings(int* decode_ms,
-                          int* max_decode_ms,
-                          int* current_delay_ms,
-                          int* target_delay_ms,
-                          int* jitter_buffer_ms,
-                          int* min_playout_delay_ms,
-                          int* render_delay_ms) const;
-
-  void SetTimingFrameInfo(const TimingFrameInfo& info);
-  rtc::Optional<TimingFrameInfo> GetTimingFrameInfo();
-
-  enum { kDefaultRenderDelayMs = 10 };
-  enum { kDelayMaxChangeMsPerS = 100 };
-
- protected:
-  int RequiredDecodeTimeMs() const RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_sect_);
-  int64_t RenderTimeMsInternal(uint32_t frame_timestamp, int64_t now_ms) const
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_sect_);
-  int TargetDelayInternal() const RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_sect_);
-
- private:
-  void UpdateHistograms() const;
-
-  rtc::CriticalSection crit_sect_;
-  Clock* const clock_;
-  bool master_ RTC_GUARDED_BY(crit_sect_);
-  TimestampExtrapolator* ts_extrapolator_ RTC_GUARDED_BY(crit_sect_);
-  std::unique_ptr<VCMCodecTimer> codec_timer_ RTC_GUARDED_BY(crit_sect_);
-  int render_delay_ms_ RTC_GUARDED_BY(crit_sect_);
-  // Best-effort playout delay range for frames from capture to render.
-  // The receiver tries to keep the delay between |min_playout_delay_ms_|
-  // and |max_playout_delay_ms_| taking the network jitter into account.
-  // A special case is where min_playout_delay_ms_ = max_playout_delay_ms_ = 0,
-  // in which case the receiver tries to play the frames as they arrive.
-  int min_playout_delay_ms_ RTC_GUARDED_BY(crit_sect_);
-  int max_playout_delay_ms_ RTC_GUARDED_BY(crit_sect_);
-  int jitter_delay_ms_ RTC_GUARDED_BY(crit_sect_);
-  int current_delay_ms_ RTC_GUARDED_BY(crit_sect_);
-  int last_decode_ms_ RTC_GUARDED_BY(crit_sect_);
-  uint32_t prev_frame_timestamp_ RTC_GUARDED_BY(crit_sect_);
-  rtc::Optional<TimingFrameInfo> timing_frame_info_ RTC_GUARDED_BY(crit_sect_);
-
-  // Statistics.
-  size_t num_decoded_frames_ RTC_GUARDED_BY(crit_sect_);
-  size_t num_delayed_decoded_frames_ RTC_GUARDED_BY(crit_sect_);
-  int64_t first_decoded_frame_ms_ RTC_GUARDED_BY(crit_sect_);
-  uint64_t sum_missed_render_deadline_ms_ RTC_GUARDED_BY(crit_sect_);
-};
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_VIDEO_CODING_TIMING_H_
diff --git a/modules/video_coding/timing_unittest.cc b/modules/video_coding/timing_unittest.cc
deleted file mode 100644
index 602bd77..0000000
--- a/modules/video_coding/timing_unittest.cc
+++ /dev/null
@@ -1,146 +0,0 @@
-/*
- *  Copyright (c) 2011 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 <math.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-#include "webrtc/modules/video_coding/include/video_coding.h"
-#include "webrtc/modules/video_coding/internal_defines.h"
-#include "webrtc/modules/video_coding/timing.h"
-#include "webrtc/system_wrappers/include/clock.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/testsupport/fileutils.h"
-
-namespace webrtc {
-
-TEST(ReceiverTiming, Tests) {
-  SimulatedClock clock(0);
-  VCMTiming timing(&clock);
-  uint32_t waitTime = 0;
-  uint32_t jitterDelayMs = 0;
-  uint32_t requiredDecodeTimeMs = 0;
-  uint32_t timeStamp = 0;
-
-  timing.Reset();
-
-  timing.UpdateCurrentDelay(timeStamp);
-
-  timing.Reset();
-
-  timing.IncomingTimestamp(timeStamp, clock.TimeInMilliseconds());
-  jitterDelayMs = 20;
-  timing.SetJitterDelay(jitterDelayMs);
-  timing.UpdateCurrentDelay(timeStamp);
-  timing.set_render_delay(0);
-  waitTime = timing.MaxWaitingTime(
-      timing.RenderTimeMs(timeStamp, clock.TimeInMilliseconds()),
-      clock.TimeInMilliseconds());
-  // First update initializes the render time. Since we have no decode delay
-  // we get waitTime = renderTime - now - renderDelay = jitter.
-  EXPECT_EQ(jitterDelayMs, waitTime);
-
-  jitterDelayMs += VCMTiming::kDelayMaxChangeMsPerS + 10;
-  timeStamp += 90000;
-  clock.AdvanceTimeMilliseconds(1000);
-  timing.SetJitterDelay(jitterDelayMs);
-  timing.UpdateCurrentDelay(timeStamp);
-  waitTime = timing.MaxWaitingTime(
-      timing.RenderTimeMs(timeStamp, clock.TimeInMilliseconds()),
-      clock.TimeInMilliseconds());
-  // Since we gradually increase the delay we only get 100 ms every second.
-  EXPECT_EQ(jitterDelayMs - 10, waitTime);
-
-  timeStamp += 90000;
-  clock.AdvanceTimeMilliseconds(1000);
-  timing.UpdateCurrentDelay(timeStamp);
-  waitTime = timing.MaxWaitingTime(
-      timing.RenderTimeMs(timeStamp, clock.TimeInMilliseconds()),
-      clock.TimeInMilliseconds());
-  EXPECT_EQ(waitTime, jitterDelayMs);
-
-  // 300 incoming frames without jitter, verify that this gives the exact wait
-  // time.
-  for (int i = 0; i < 300; i++) {
-    clock.AdvanceTimeMilliseconds(1000 / 25);
-    timeStamp += 90000 / 25;
-    timing.IncomingTimestamp(timeStamp, clock.TimeInMilliseconds());
-  }
-  timing.UpdateCurrentDelay(timeStamp);
-  waitTime = timing.MaxWaitingTime(
-      timing.RenderTimeMs(timeStamp, clock.TimeInMilliseconds()),
-      clock.TimeInMilliseconds());
-  EXPECT_EQ(waitTime, jitterDelayMs);
-
-  // Add decode time estimates.
-  for (int i = 0; i < 10; i++) {
-    int64_t startTimeMs = clock.TimeInMilliseconds();
-    clock.AdvanceTimeMilliseconds(10);
-    timing.StopDecodeTimer(
-        timeStamp, clock.TimeInMilliseconds() - startTimeMs,
-        clock.TimeInMilliseconds(),
-        timing.RenderTimeMs(timeStamp, clock.TimeInMilliseconds()));
-    timeStamp += 90000 / 25;
-    clock.AdvanceTimeMilliseconds(1000 / 25 - 10);
-    timing.IncomingTimestamp(timeStamp, clock.TimeInMilliseconds());
-  }
-  requiredDecodeTimeMs = 10;
-  timing.SetJitterDelay(jitterDelayMs);
-  clock.AdvanceTimeMilliseconds(1000);
-  timeStamp += 90000;
-  timing.UpdateCurrentDelay(timeStamp);
-  waitTime = timing.MaxWaitingTime(
-      timing.RenderTimeMs(timeStamp, clock.TimeInMilliseconds()),
-      clock.TimeInMilliseconds());
-  EXPECT_EQ(waitTime, jitterDelayMs);
-
-  int minTotalDelayMs = 200;
-  timing.set_min_playout_delay(minTotalDelayMs);
-  clock.AdvanceTimeMilliseconds(5000);
-  timeStamp += 5 * 90000;
-  timing.UpdateCurrentDelay(timeStamp);
-  const int kRenderDelayMs = 10;
-  timing.set_render_delay(kRenderDelayMs);
-  waitTime = timing.MaxWaitingTime(
-      timing.RenderTimeMs(timeStamp, clock.TimeInMilliseconds()),
-      clock.TimeInMilliseconds());
-  // We should at least have minTotalDelayMs - decodeTime (10) - renderTime
-  // (10) to wait.
-  EXPECT_EQ(waitTime, minTotalDelayMs - requiredDecodeTimeMs - kRenderDelayMs);
-  // The total video delay should be equal to the min total delay.
-  EXPECT_EQ(minTotalDelayMs, timing.TargetVideoDelay());
-
-  // Reset playout delay.
-  timing.set_min_playout_delay(0);
-  clock.AdvanceTimeMilliseconds(5000);
-  timeStamp += 5 * 90000;
-  timing.UpdateCurrentDelay(timeStamp);
-}
-
-TEST(ReceiverTiming, WrapAround) {
-  const int kFramerate = 25;
-  SimulatedClock clock(0);
-  VCMTiming timing(&clock);
-  // Provoke a wrap-around. The forth frame will have wrapped at 25 fps.
-  uint32_t timestamp = 0xFFFFFFFFu - 3 * 90000 / kFramerate;
-  for (int i = 0; i < 4; ++i) {
-    timing.IncomingTimestamp(timestamp, clock.TimeInMilliseconds());
-    clock.AdvanceTimeMilliseconds(1000 / kFramerate);
-    timestamp += 90000 / kFramerate;
-    int64_t render_time =
-        timing.RenderTimeMs(0xFFFFFFFFu, clock.TimeInMilliseconds());
-    EXPECT_EQ(3 * 1000 / kFramerate, render_time);
-    render_time = timing.RenderTimeMs(89u,  // One second later in 90 kHz.
-                                      clock.TimeInMilliseconds());
-    EXPECT_EQ(3 * 1000 / kFramerate + 1, render_time);
-  }
-}
-
-}  // namespace webrtc
diff --git a/modules/video_coding/utility/default_video_bitrate_allocator.cc b/modules/video_coding/utility/default_video_bitrate_allocator.cc
deleted file mode 100644
index a914e8a..0000000
--- a/modules/video_coding/utility/default_video_bitrate_allocator.cc
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- *  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/video_coding/utility/default_video_bitrate_allocator.h"
-
-#include <stdint.h>
-
-namespace webrtc {
-
-DefaultVideoBitrateAllocator::DefaultVideoBitrateAllocator(
-    const VideoCodec& codec)
-    : codec_(codec) {}
-
-DefaultVideoBitrateAllocator::~DefaultVideoBitrateAllocator() {}
-
-BitrateAllocation DefaultVideoBitrateAllocator::GetAllocation(
-    uint32_t total_bitrate_bps,
-    uint32_t framerate) {
-  BitrateAllocation allocation;
-  if (total_bitrate_bps == 0)
-    return allocation;
-
-  if (total_bitrate_bps < codec_.minBitrate * 1000) {
-    allocation.SetBitrate(0, 0, codec_.minBitrate * 1000);
-  } else if (codec_.maxBitrate > 0 &&
-             total_bitrate_bps > codec_.maxBitrate * 1000) {
-    allocation.SetBitrate(0, 0, codec_.maxBitrate * 1000);
-  } else {
-    allocation.SetBitrate(0, 0, total_bitrate_bps);
-  }
-  return allocation;
-}
-
-uint32_t DefaultVideoBitrateAllocator::GetPreferredBitrateBps(
-    uint32_t framerate) {
-  return GetAllocation(codec_.maxBitrate * 1000, framerate).get_sum_bps();
-}
-
-}  // namespace webrtc
diff --git a/modules/video_coding/utility/default_video_bitrate_allocator.h b/modules/video_coding/utility/default_video_bitrate_allocator.h
deleted file mode 100644
index f254e8d..0000000
--- a/modules/video_coding/utility/default_video_bitrate_allocator.h
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- *  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_VIDEO_CODING_UTILITY_DEFAULT_VIDEO_BITRATE_ALLOCATOR_H_
-#define WEBRTC_MODULES_VIDEO_CODING_UTILITY_DEFAULT_VIDEO_BITRATE_ALLOCATOR_H_
-
-#include "webrtc/common_video/include/video_bitrate_allocator.h"
-
-namespace webrtc {
-
-class DefaultVideoBitrateAllocator : public VideoBitrateAllocator {
- public:
-  explicit DefaultVideoBitrateAllocator(const VideoCodec& codec);
-  ~DefaultVideoBitrateAllocator() override;
-
-  BitrateAllocation GetAllocation(uint32_t total_bitrate,
-                                  uint32_t framerate) override;
-  uint32_t GetPreferredBitrateBps(uint32_t framerate) override;
-
- private:
-  const VideoCodec codec_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_VIDEO_CODING_UTILITY_DEFAULT_VIDEO_BITRATE_ALLOCATOR_H_
diff --git a/modules/video_coding/utility/default_video_bitrate_allocator_unittest.cc b/modules/video_coding/utility/default_video_bitrate_allocator_unittest.cc
deleted file mode 100644
index df56433..0000000
--- a/modules/video_coding/utility/default_video_bitrate_allocator_unittest.cc
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- *  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 <limits>
-#include <memory>
-
-#include "webrtc/modules/video_coding/utility/default_video_bitrate_allocator.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-namespace {
-uint32_t kMaxBitrateBps = 1000000;
-uint32_t kMinBitrateBps = 50000;
-uint32_t kMaxFramerate = 30;
-}  // namespace
-
-class DefaultVideoBitrateAllocatorTest : public ::testing::Test {
- public:
-  DefaultVideoBitrateAllocatorTest() {}
-  virtual ~DefaultVideoBitrateAllocatorTest() {}
-
-  void SetUp() override {
-    codec_.codecType = kVideoCodecVP8;
-    codec_.minBitrate = kMinBitrateBps / 1000;
-    codec_.maxBitrate = kMaxBitrateBps / 1000;
-    codec_.targetBitrate = (kMinBitrateBps + kMaxBitrateBps) / 2000;
-    codec_.maxFramerate = kMaxFramerate;
-    allocator_.reset(new DefaultVideoBitrateAllocator(codec_));
-  }
-
- protected:
-  VideoCodec codec_;
-  std::unique_ptr<DefaultVideoBitrateAllocator> allocator_;
-};
-
-TEST_F(DefaultVideoBitrateAllocatorTest, ZeroIsOff) {
-  BitrateAllocation allocation = allocator_->GetAllocation(0, kMaxFramerate);
-  EXPECT_EQ(0u, allocation.get_sum_bps());
-}
-
-TEST_F(DefaultVideoBitrateAllocatorTest, CapsToMin) {
-  BitrateAllocation allocation = allocator_->GetAllocation(1, kMaxFramerate);
-  EXPECT_EQ(kMinBitrateBps, allocation.get_sum_bps());
-
-  allocation = allocator_->GetAllocation(kMinBitrateBps - 1, kMaxFramerate);
-  EXPECT_EQ(kMinBitrateBps, allocation.get_sum_bps());
-
-  allocation = allocator_->GetAllocation(kMinBitrateBps, kMaxFramerate);
-  EXPECT_EQ(kMinBitrateBps, allocation.get_sum_bps());
-}
-
-TEST_F(DefaultVideoBitrateAllocatorTest, CapsToMax) {
-  BitrateAllocation allocation =
-      allocator_->GetAllocation(kMaxBitrateBps, kMaxFramerate);
-  EXPECT_EQ(kMaxBitrateBps, allocation.get_sum_bps());
-
-  allocation = allocator_->GetAllocation(kMaxBitrateBps + 1, kMaxFramerate);
-  EXPECT_EQ(kMaxBitrateBps, allocation.get_sum_bps());
-
-  allocation = allocator_->GetAllocation(std::numeric_limits<uint32_t>::max(),
-                                         kMaxFramerate);
-  EXPECT_EQ(kMaxBitrateBps, allocation.get_sum_bps());
-}
-
-TEST_F(DefaultVideoBitrateAllocatorTest, GoodInBetween) {
-  BitrateAllocation allocation =
-      allocator_->GetAllocation(kMinBitrateBps + 1, kMaxFramerate);
-  EXPECT_EQ(kMinBitrateBps + 1, allocation.get_sum_bps());
-
-  allocation = allocator_->GetAllocation(kMaxBitrateBps - 1, kMaxFramerate);
-  EXPECT_EQ(kMaxBitrateBps - 1, allocation.get_sum_bps());
-}
-}  // namespace webrtc
diff --git a/modules/video_coding/utility/frame_dropper.cc b/modules/video_coding/utility/frame_dropper.cc
deleted file mode 100644
index 73d6410..0000000
--- a/modules/video_coding/utility/frame_dropper.cc
+++ /dev/null
@@ -1,279 +0,0 @@
-/*
- *  Copyright (c) 2011 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/video_coding/utility/frame_dropper.h"
-
-#include <algorithm>
-
-#include "webrtc/rtc_base/logging.h"
-
-namespace webrtc {
-
-namespace {
-
-const float kDefaultFrameSizeAlpha = 0.9f;
-const float kDefaultKeyFrameRatioAlpha = 0.99f;
-// 1 key frame every 10th second in 30 fps.
-const float kDefaultKeyFrameRatioValue = 1 / 300.0f;
-
-const float kDefaultDropRatioAlpha = 0.9f;
-const float kDefaultDropRatioValue = 0.96f;
-// Maximum duration over which frames are continuously dropped.
-const float kDefaultMaxDropDurationSecs = 4.0f;
-
-// Default target bitrate.
-// TODO(isheriff): Should this be higher to avoid dropping too many packets when
-// the bandwidth is unknown at the start ?
-const float kDefaultTargetBitrateKbps = 300.0f;
-const float kDefaultIncomingFrameRate = 30;
-const float kLeakyBucketSizeSeconds = 0.5f;
-
-// A delta frame that is bigger than |kLargeDeltaFactor| times the average
-// delta frame is a large frame that is spread out for accumulation.
-const int kLargeDeltaFactor = 3;
-
-// Cap on the frame size accumulator to prevent excessive drops.
-const float kAccumulatorCapBufferSizeSecs = 3.0f;
-}  // namespace
-
-FrameDropper::FrameDropper()
-    : key_frame_ratio_(kDefaultKeyFrameRatioAlpha),
-      delta_frame_size_avg_kbits_(kDefaultFrameSizeAlpha),
-      drop_ratio_(kDefaultDropRatioAlpha, kDefaultDropRatioValue),
-      enabled_(true),
-      max_drop_duration_secs_(kDefaultMaxDropDurationSecs) {
-  Reset();
-}
-
-FrameDropper::FrameDropper(float max_drop_duration_secs)
-    : key_frame_ratio_(kDefaultKeyFrameRatioAlpha),
-      delta_frame_size_avg_kbits_(kDefaultFrameSizeAlpha),
-      drop_ratio_(kDefaultDropRatioAlpha, kDefaultDropRatioValue),
-      enabled_(true),
-      max_drop_duration_secs_(max_drop_duration_secs) {
-  Reset();
-}
-
-void FrameDropper::Reset() {
-  key_frame_ratio_.Reset(kDefaultKeyFrameRatioAlpha);
-  key_frame_ratio_.Apply(1.0f, kDefaultKeyFrameRatioValue);
-  delta_frame_size_avg_kbits_.Reset(kDefaultFrameSizeAlpha);
-
-  accumulator_ = 0.0f;
-  accumulator_max_ = kDefaultTargetBitrateKbps / 2;
-  target_bitrate_ = kDefaultTargetBitrateKbps;
-  incoming_frame_rate_ = kDefaultIncomingFrameRate;
-
-  large_frame_accumulation_count_ = 0;
-  large_frame_accumulation_chunk_size_ = 0;
-  large_frame_accumulation_spread_ = 0.5 * kDefaultIncomingFrameRate;
-
-  drop_next_ = false;
-  drop_ratio_.Reset(0.9f);
-  drop_ratio_.Apply(0.0f, 0.0f);
-  drop_count_ = 0;
-  was_below_max_ = true;
-}
-
-void FrameDropper::Enable(bool enable) {
-  enabled_ = enable;
-}
-
-void FrameDropper::Fill(size_t framesize_bytes, bool delta_frame) {
-  if (!enabled_) {
-    return;
-  }
-  float framesize_kbits = 8.0f * static_cast<float>(framesize_bytes) / 1000.0f;
-  if (!delta_frame) {
-    key_frame_ratio_.Apply(1.0, 1.0);
-    // Do not spread if we are already doing it (or we risk dropping bits that
-    // need accumulation). Given we compute the key
-    // frame ratio and spread based on that, this should not normally happen.
-    if (large_frame_accumulation_count_ == 0) {
-      if (key_frame_ratio_.filtered() > 1e-5 &&
-          1 / key_frame_ratio_.filtered() < large_frame_accumulation_spread_) {
-        large_frame_accumulation_count_ =
-            static_cast<int32_t>(1 / key_frame_ratio_.filtered() + 0.5);
-      } else {
-        large_frame_accumulation_count_ =
-            static_cast<int32_t>(large_frame_accumulation_spread_ + 0.5);
-      }
-      large_frame_accumulation_chunk_size_ =
-          framesize_kbits / large_frame_accumulation_count_;
-      framesize_kbits = 0;
-    }
-  } else {
-    // Identify if it is an unusually large delta frame and spread accumulation
-    // if that is the case.
-    if (delta_frame_size_avg_kbits_.filtered() != -1 &&
-        (framesize_kbits >
-         kLargeDeltaFactor * delta_frame_size_avg_kbits_.filtered()) &&
-        large_frame_accumulation_count_ == 0) {
-      large_frame_accumulation_count_ =
-          static_cast<int32_t>(large_frame_accumulation_spread_ + 0.5);
-      large_frame_accumulation_chunk_size_ =
-          framesize_kbits / large_frame_accumulation_count_;
-      framesize_kbits = 0;
-    } else {
-      delta_frame_size_avg_kbits_.Apply(1, framesize_kbits);
-    }
-    key_frame_ratio_.Apply(1.0, 0.0);
-  }
-  // Change the level of the accumulator (bucket)
-  accumulator_ += framesize_kbits;
-  CapAccumulator();
-}
-
-void FrameDropper::Leak(uint32_t input_framerate) {
-  if (!enabled_) {
-    return;
-  }
-  if (input_framerate < 1) {
-    return;
-  }
-  if (target_bitrate_ < 0.0f) {
-    return;
-  }
-  // Add lower bound for large frame accumulation spread.
-  large_frame_accumulation_spread_ = std::max(0.5 * input_framerate, 5.0);
-  // Expected bits per frame based on current input frame rate.
-  float expected_bits_per_frame = target_bitrate_ / input_framerate;
-  if (large_frame_accumulation_count_ > 0) {
-    expected_bits_per_frame -= large_frame_accumulation_chunk_size_;
-    --large_frame_accumulation_count_;
-  }
-  accumulator_ -= expected_bits_per_frame;
-  if (accumulator_ < 0.0f) {
-    accumulator_ = 0.0f;
-  }
-  UpdateRatio();
-}
-
-void FrameDropper::UpdateRatio() {
-  if (accumulator_ > 1.3f * accumulator_max_) {
-    // Too far above accumulator max, react faster
-    drop_ratio_.UpdateBase(0.8f);
-  } else {
-    // Go back to normal reaction
-    drop_ratio_.UpdateBase(0.9f);
-  }
-  if (accumulator_ > accumulator_max_) {
-    // We are above accumulator max, and should ideally
-    // drop a frame. Increase the dropRatio and drop
-    // the frame later.
-    if (was_below_max_) {
-      drop_next_ = true;
-    }
-    drop_ratio_.Apply(1.0f, 1.0f);
-    drop_ratio_.UpdateBase(0.9f);
-  } else {
-    drop_ratio_.Apply(1.0f, 0.0f);
-  }
-  was_below_max_ = accumulator_ < accumulator_max_;
-}
-
-// This function signals when to drop frames to the caller. It makes use of the
-// dropRatio
-// to smooth out the drops over time.
-bool FrameDropper::DropFrame() {
-  if (!enabled_) {
-    return false;
-  }
-  if (drop_next_) {
-    drop_next_ = false;
-    drop_count_ = 0;
-  }
-
-  if (drop_ratio_.filtered() >= 0.5f) {  // Drops per keep
-    // limit is the number of frames we should drop between each kept frame
-    // to keep our drop ratio. limit is positive in this case.
-    float denom = 1.0f - drop_ratio_.filtered();
-    if (denom < 1e-5) {
-      denom = 1e-5f;
-    }
-    int32_t limit = static_cast<int32_t>(1.0f / denom - 1.0f + 0.5f);
-    // Put a bound on the max amount of dropped frames between each kept
-    // frame, in terms of frame rate and window size (secs).
-    int max_limit =
-        static_cast<int>(incoming_frame_rate_ * max_drop_duration_secs_);
-    if (limit > max_limit) {
-      limit = max_limit;
-    }
-    if (drop_count_ < 0) {
-      // Reset the drop_count_ since it was negative and should be positive.
-      drop_count_ = -drop_count_;
-    }
-    if (drop_count_ < limit) {
-      // As long we are below the limit we should drop frames.
-      drop_count_++;
-      return true;
-    } else {
-      // Only when we reset drop_count_ a frame should be kept.
-      drop_count_ = 0;
-      return false;
-    }
-  } else if (drop_ratio_.filtered() > 0.0f &&
-             drop_ratio_.filtered() < 0.5f) {  // Keeps per drop
-    // limit is the number of frames we should keep between each drop
-    // in order to keep the drop ratio. limit is negative in this case,
-    // and the drop_count_ is also negative.
-    float denom = drop_ratio_.filtered();
-    if (denom < 1e-5) {
-      denom = 1e-5f;
-    }
-    int32_t limit = -static_cast<int32_t>(1.0f / denom - 1.0f + 0.5f);
-    if (drop_count_ > 0) {
-      // Reset the drop_count_ since we have a positive
-      // drop_count_, and it should be negative.
-      drop_count_ = -drop_count_;
-    }
-    if (drop_count_ > limit) {
-      if (drop_count_ == 0) {
-        // Drop frames when we reset drop_count_.
-        drop_count_--;
-        return true;
-      } else {
-        // Keep frames as long as we haven't reached limit.
-        drop_count_--;
-        return false;
-      }
-    } else {
-      drop_count_ = 0;
-      return false;
-    }
-  }
-  drop_count_ = 0;
-  return false;
-}
-
-void FrameDropper::SetRates(float bitrate, float incoming_frame_rate) {
-  // Bit rate of -1 means infinite bandwidth.
-  accumulator_max_ = bitrate * kLeakyBucketSizeSeconds;
-  if (target_bitrate_ > 0.0f && bitrate < target_bitrate_ &&
-      accumulator_ > accumulator_max_) {
-    // Rescale the accumulator level if the accumulator max decreases
-    accumulator_ = bitrate / target_bitrate_ * accumulator_;
-  }
-  target_bitrate_ = bitrate;
-  CapAccumulator();
-  incoming_frame_rate_ = incoming_frame_rate;
-}
-
-// Put a cap on the accumulator, i.e., don't let it grow beyond some level.
-// This is a temporary fix for screencasting where very large frames from
-// encoder will cause very slow response (too many frame drops).
-// TODO(isheriff): Remove this now that large delta frames are also spread out ?
-void FrameDropper::CapAccumulator() {
-  float max_accumulator = target_bitrate_ * kAccumulatorCapBufferSizeSecs;
-  if (accumulator_ > max_accumulator) {
-    accumulator_ = max_accumulator;
-  }
-}
-}  // namespace webrtc
diff --git a/modules/video_coding/utility/frame_dropper.h b/modules/video_coding/utility/frame_dropper.h
deleted file mode 100644
index bf31f39..0000000
--- a/modules/video_coding/utility/frame_dropper.h
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- *  Copyright (c) 2011 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_VIDEO_CODING_UTILITY_FRAME_DROPPER_H_
-#define WEBRTC_MODULES_VIDEO_CODING_UTILITY_FRAME_DROPPER_H_
-
-#include <cstddef>
-
-#include "webrtc/rtc_base/numerics/exp_filter.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-// The Frame Dropper implements a variant of the leaky bucket algorithm
-// for keeping track of when to drop frames to avoid bit rate
-// over use when the encoder can't keep its bit rate.
-class FrameDropper {
- public:
-  FrameDropper();
-  explicit FrameDropper(float max_time_drops);
-  virtual ~FrameDropper() {}
-
-  // Resets the FrameDropper to its initial state.
-  // This means that the frameRateWeight is set to its
-  // default value as well.
-  virtual void Reset();
-
-  virtual void Enable(bool enable);
-  // Answers the question if it's time to drop a frame
-  // if we want to reach a given frame rate. Must be
-  // called for every frame.
-  //
-  // Return value     : True if we should drop the current frame
-  virtual bool DropFrame();
-  // Updates the FrameDropper with the size of the latest encoded
-  // frame. The FrameDropper calculates a new drop ratio (can be
-  // seen as the probability to drop a frame) and updates its
-  // internal statistics.
-  //
-  // Input:
-  //          - frameSizeBytes    : The size of the latest frame
-  //                                returned from the encoder.
-  //          - deltaFrame        : True if the encoder returned
-  //                                a key frame.
-  virtual void Fill(size_t frameSizeBytes, bool deltaFrame);
-
-  virtual void Leak(uint32_t inputFrameRate);
-
-  // Sets the target bit rate and the frame rate produced by
-  // the camera.
-  //
-  // Input:
-  //          - bitRate       : The target bit rate
-  virtual void SetRates(float bitRate, float incoming_frame_rate);
-
- private:
-  void UpdateRatio();
-  void CapAccumulator();
-
-  rtc::ExpFilter key_frame_ratio_;
-  rtc::ExpFilter delta_frame_size_avg_kbits_;
-
-  // Key frames and large delta frames are not immediately accumulated in the
-  // bucket since they can immediately overflow the bucket leading to large
-  // drops on the following packets that may be much smaller. Instead these
-  // large frames are accumulated over several frames when the bucket leaks.
-
-  // |large_frame_accumulation_spread_| represents the number of frames over
-  // which a large frame is accumulated.
-  float large_frame_accumulation_spread_;
-  // |large_frame_accumulation_count_| represents the number of frames left
-  // to finish accumulating a large frame.
-  int large_frame_accumulation_count_;
-  // |large_frame_accumulation_chunk_size_| represents the size of a single
-  // chunk for large frame accumulation.
-  float large_frame_accumulation_chunk_size_;
-
-  float accumulator_;
-  float accumulator_max_;
-  float target_bitrate_;
-  bool drop_next_;
-  rtc::ExpFilter drop_ratio_;
-  int drop_count_;
-  float incoming_frame_rate_;
-  bool was_below_max_;
-  bool enabled_;
-  const float max_drop_duration_secs_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_VIDEO_CODING_UTILITY_FRAME_DROPPER_H_
diff --git a/modules/video_coding/utility/frame_dropper_unittest.cc b/modules/video_coding/utility/frame_dropper_unittest.cc
deleted file mode 100644
index c33ed85..0000000
--- a/modules/video_coding/utility/frame_dropper_unittest.cc
+++ /dev/null
@@ -1,161 +0,0 @@
-/*
- *  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/video_coding/utility/frame_dropper.h"
-
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-namespace {
-
-const float kTargetBitRateKbps = 300;
-const float kIncomingFrameRate = 30;
-const size_t kFrameSizeBytes = 1250;
-
-const size_t kLargeFrameSizeBytes = 25000;
-
-const bool kIncludeKeyFrame = true;
-const bool kDoNotIncludeKeyFrame = false;
-
-}  // namespace
-
-class FrameDropperTest : public ::testing::Test {
- protected:
-  void SetUp() override {
-    frame_dropper_.SetRates(kTargetBitRateKbps, kIncomingFrameRate);
-  }
-
-  void OverflowLeakyBucket() {
-    // Overflow bucket in frame dropper.
-    for (int i = 0; i < kIncomingFrameRate; ++i) {
-      frame_dropper_.Fill(kFrameSizeBytes, true);
-    }
-    frame_dropper_.Leak(kIncomingFrameRate);
-  }
-
-  void ValidateNoDropsAtTargetBitrate(int large_frame_size_bytes,
-                                      int large_frame_rate,
-                                      bool is_large_frame_delta) {
-    // Smaller frame size is computed to meet |kTargetBitRateKbps|.
-    int small_frame_size_bytes =
-        kFrameSizeBytes -
-        (large_frame_size_bytes * large_frame_rate) / kIncomingFrameRate;
-
-    for (int i = 1; i <= 5 * large_frame_rate; ++i) {
-      // Large frame. First frame is always a key frame.
-      frame_dropper_.Fill(large_frame_size_bytes,
-                          (i == 1) ? false : is_large_frame_delta);
-      frame_dropper_.Leak(kIncomingFrameRate);
-      EXPECT_FALSE(frame_dropper_.DropFrame());
-
-      // Smaller frames.
-      for (int j = 1; j < kIncomingFrameRate / large_frame_rate; ++j) {
-        frame_dropper_.Fill(small_frame_size_bytes, true);
-        frame_dropper_.Leak(kIncomingFrameRate);
-        EXPECT_FALSE(frame_dropper_.DropFrame());
-      }
-    }
-  }
-
-  void ValidateThroughputMatchesTargetBitrate(int bitrate_kbps,
-                                              bool include_keyframe) {
-    int delta_frame_size;
-    int total_bytes = 0;
-
-    if (include_keyframe) {
-      delta_frame_size = ((1000.0 / 8 * bitrate_kbps) - kLargeFrameSizeBytes) /
-                         (kIncomingFrameRate - 1);
-    } else {
-      delta_frame_size = bitrate_kbps * 1000.0 / (8 * kIncomingFrameRate);
-    }
-    const int kNumIterations = 1000;
-    for (int i = 1; i <= kNumIterations; ++i) {
-      int j = 0;
-      if (include_keyframe) {
-        if (!frame_dropper_.DropFrame()) {
-          frame_dropper_.Fill(kLargeFrameSizeBytes, false);
-          total_bytes += kLargeFrameSizeBytes;
-        }
-        frame_dropper_.Leak(kIncomingFrameRate);
-        j++;
-      }
-      for (; j < kIncomingFrameRate; ++j) {
-        if (!frame_dropper_.DropFrame()) {
-          frame_dropper_.Fill(delta_frame_size, true);
-          total_bytes += delta_frame_size;
-        }
-        frame_dropper_.Leak(kIncomingFrameRate);
-      }
-    }
-    float throughput_kbps = total_bytes * 8.0 / (1000 * kNumIterations);
-    float deviation_from_target =
-        (throughput_kbps - kTargetBitRateKbps) * 100.0 / kTargetBitRateKbps;
-    if (deviation_from_target < 0) {
-      deviation_from_target = -deviation_from_target;
-    }
-
-    // Variation is < 0.1%
-    EXPECT_LE(deviation_from_target, 0.1);
-  }
-
-  FrameDropper frame_dropper_;
-};
-
-TEST_F(FrameDropperTest, NoDropsWhenDisabled) {
-  frame_dropper_.Enable(false);
-  OverflowLeakyBucket();
-  EXPECT_FALSE(frame_dropper_.DropFrame());
-}
-
-TEST_F(FrameDropperTest, DropsByDefaultWhenBucketOverflows) {
-  OverflowLeakyBucket();
-  EXPECT_TRUE(frame_dropper_.DropFrame());
-}
-
-TEST_F(FrameDropperTest, NoDropsWhenFillRateMatchesLeakRate) {
-  for (int i = 0; i < 5 * kIncomingFrameRate; ++i) {
-    frame_dropper_.Fill(kFrameSizeBytes, true);
-    frame_dropper_.Leak(kIncomingFrameRate);
-    EXPECT_FALSE(frame_dropper_.DropFrame());
-  }
-}
-
-TEST_F(FrameDropperTest, LargeKeyFrames) {
-  ValidateNoDropsAtTargetBitrate(kLargeFrameSizeBytes, 1, false);
-  frame_dropper_.Reset();
-  ValidateNoDropsAtTargetBitrate(kLargeFrameSizeBytes / 2, 2, false);
-  frame_dropper_.Reset();
-  ValidateNoDropsAtTargetBitrate(kLargeFrameSizeBytes / 4, 4, false);
-  frame_dropper_.Reset();
-  ValidateNoDropsAtTargetBitrate(kLargeFrameSizeBytes / 8, 8, false);
-}
-
-TEST_F(FrameDropperTest, LargeDeltaFrames) {
-  ValidateNoDropsAtTargetBitrate(kLargeFrameSizeBytes, 1, true);
-  frame_dropper_.Reset();
-  ValidateNoDropsAtTargetBitrate(kLargeFrameSizeBytes / 2, 2, true);
-  frame_dropper_.Reset();
-  ValidateNoDropsAtTargetBitrate(kLargeFrameSizeBytes / 4, 4, true);
-  frame_dropper_.Reset();
-  ValidateNoDropsAtTargetBitrate(kLargeFrameSizeBytes / 8, 8, true);
-}
-
-TEST_F(FrameDropperTest, TrafficVolumeAboveAvailableBandwidth) {
-  ValidateThroughputMatchesTargetBitrate(700, kIncludeKeyFrame);
-  ValidateThroughputMatchesTargetBitrate(700, kDoNotIncludeKeyFrame);
-  ValidateThroughputMatchesTargetBitrate(600, kIncludeKeyFrame);
-  ValidateThroughputMatchesTargetBitrate(600, kDoNotIncludeKeyFrame);
-  ValidateThroughputMatchesTargetBitrate(500, kIncludeKeyFrame);
-  ValidateThroughputMatchesTargetBitrate(500, kDoNotIncludeKeyFrame);
-}
-
-}  // namespace webrtc
diff --git a/modules/video_coding/utility/ivf_file_writer.cc b/modules/video_coding/utility/ivf_file_writer.cc
deleted file mode 100644
index 78e956a..0000000
--- a/modules/video_coding/utility/ivf_file_writer.cc
+++ /dev/null
@@ -1,200 +0,0 @@
-/*
- *  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/video_coding/utility/ivf_file_writer.h"
-
-#include <string>
-#include <utility>
-
-#include "webrtc/modules/rtp_rtcp/source/byte_io.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-
-// TODO(palmkvist): make logging more informative in the absence of a file name
-// (or get one)
-
-namespace webrtc {
-
-const size_t kIvfHeaderSize = 32;
-
-IvfFileWriter::IvfFileWriter(rtc::File file, size_t byte_limit)
-    : codec_type_(kVideoCodecUnknown),
-      bytes_written_(0),
-      byte_limit_(byte_limit),
-      num_frames_(0),
-      width_(0),
-      height_(0),
-      last_timestamp_(-1),
-      using_capture_timestamps_(false),
-      file_(std::move(file)) {
-  RTC_DCHECK(byte_limit == 0 || kIvfHeaderSize <= byte_limit)
-      << "The byte_limit is too low, not even the header will fit.";
-}
-
-IvfFileWriter::~IvfFileWriter() {
-  Close();
-}
-
-std::unique_ptr<IvfFileWriter> IvfFileWriter::Wrap(rtc::File file,
-                                                   size_t byte_limit) {
-  return std::unique_ptr<IvfFileWriter>(
-      new IvfFileWriter(std::move(file), byte_limit));
-}
-
-bool IvfFileWriter::WriteHeader() {
-  if (!file_.Seek(0)) {
-    LOG(LS_WARNING) << "Unable to rewind ivf output file.";
-    return false;
-  }
-
-  uint8_t ivf_header[kIvfHeaderSize] = {0};
-  ivf_header[0] = 'D';
-  ivf_header[1] = 'K';
-  ivf_header[2] = 'I';
-  ivf_header[3] = 'F';
-  ByteWriter<uint16_t>::WriteLittleEndian(&ivf_header[4], 0);   // Version.
-  ByteWriter<uint16_t>::WriteLittleEndian(&ivf_header[6], 32);  // Header size.
-
-  switch (codec_type_) {
-    case kVideoCodecVP8:
-      ivf_header[8] = 'V';
-      ivf_header[9] = 'P';
-      ivf_header[10] = '8';
-      ivf_header[11] = '0';
-      break;
-    case kVideoCodecVP9:
-      ivf_header[8] = 'V';
-      ivf_header[9] = 'P';
-      ivf_header[10] = '9';
-      ivf_header[11] = '0';
-      break;
-    case kVideoCodecH264:
-      ivf_header[8] = 'H';
-      ivf_header[9] = '2';
-      ivf_header[10] = '6';
-      ivf_header[11] = '4';
-      break;
-    default:
-      LOG(LS_ERROR) << "Unknown CODEC type: " << codec_type_;
-      return false;
-  }
-
-  ByteWriter<uint16_t>::WriteLittleEndian(&ivf_header[12], width_);
-  ByteWriter<uint16_t>::WriteLittleEndian(&ivf_header[14], height_);
-  // Render timestamps are in ms (1/1000 scale), while RTP timestamps use a
-  // 90kHz clock.
-  ByteWriter<uint32_t>::WriteLittleEndian(
-      &ivf_header[16], using_capture_timestamps_ ? 1000 : 90000);
-  ByteWriter<uint32_t>::WriteLittleEndian(&ivf_header[20], 1);
-  ByteWriter<uint32_t>::WriteLittleEndian(&ivf_header[24],
-                                          static_cast<uint32_t>(num_frames_));
-  ByteWriter<uint32_t>::WriteLittleEndian(&ivf_header[28], 0);  // Reserved.
-
-  if (file_.Write(ivf_header, kIvfHeaderSize) < kIvfHeaderSize) {
-    LOG(LS_ERROR) << "Unable to write IVF header for ivf output file.";
-    return false;
-  }
-
-  if (bytes_written_ < kIvfHeaderSize) {
-    bytes_written_ = kIvfHeaderSize;
-  }
-
-  return true;
-}
-
-bool IvfFileWriter::InitFromFirstFrame(const EncodedImage& encoded_image,
-                                       VideoCodecType codec_type) {
-  width_ = encoded_image._encodedWidth;
-  height_ = encoded_image._encodedHeight;
-  RTC_CHECK_GT(width_, 0);
-  RTC_CHECK_GT(height_, 0);
-  using_capture_timestamps_ = encoded_image._timeStamp == 0;
-
-  codec_type_ = codec_type;
-
-  if (!WriteHeader())
-    return false;
-
-  const char* codec_name =
-      CodecTypeToPayloadString(codec_type_);
-  LOG(LS_WARNING) << "Created IVF file for codec data of type " << codec_name
-                  << " at resolution " << width_ << " x " << height_
-                  << ", using " << (using_capture_timestamps_ ? "1" : "90")
-                  << "kHz clock resolution.";
-  return true;
-}
-
-bool IvfFileWriter::WriteFrame(const EncodedImage& encoded_image,
-                               VideoCodecType codec_type) {
-  if (!file_.IsOpen())
-    return false;
-
-  if (num_frames_ == 0 && !InitFromFirstFrame(encoded_image, codec_type))
-    return false;
-  RTC_DCHECK_EQ(codec_type_, codec_type);
-
-  if ((encoded_image._encodedWidth > 0 || encoded_image._encodedHeight > 0) &&
-      (encoded_image._encodedHeight != height_ ||
-       encoded_image._encodedWidth != width_)) {
-    LOG(LS_WARNING)
-        << "Incomig frame has diffferent resolution then previous: (" << width_
-        << "x" << height_ << ") -> (" << encoded_image._encodedWidth << "x"
-        << encoded_image._encodedHeight << ")";
-  }
-
-  int64_t timestamp = using_capture_timestamps_
-                          ? encoded_image.capture_time_ms_
-                          : wrap_handler_.Unwrap(encoded_image._timeStamp);
-  if (last_timestamp_ != -1 && timestamp <= last_timestamp_) {
-    LOG(LS_WARNING) << "Timestamp no increasing: " << last_timestamp_ << " -> "
-                    << timestamp;
-  }
-  last_timestamp_ = timestamp;
-
-  const size_t kFrameHeaderSize = 12;
-  if (byte_limit_ != 0 &&
-      bytes_written_ + kFrameHeaderSize + encoded_image._length > byte_limit_) {
-    LOG(LS_WARNING) << "Closing IVF file due to reaching size limit: "
-                    << byte_limit_ << " bytes.";
-    Close();
-    return false;
-  }
-  uint8_t frame_header[kFrameHeaderSize] = {};
-  ByteWriter<uint32_t>::WriteLittleEndian(
-      &frame_header[0], static_cast<uint32_t>(encoded_image._length));
-  ByteWriter<uint64_t>::WriteLittleEndian(&frame_header[4], timestamp);
-  if (file_.Write(frame_header, kFrameHeaderSize) < kFrameHeaderSize ||
-      file_.Write(encoded_image._buffer, encoded_image._length) <
-          encoded_image._length) {
-    LOG(LS_ERROR) << "Unable to write frame to file.";
-    return false;
-  }
-
-  bytes_written_ += kFrameHeaderSize + encoded_image._length;
-
-  ++num_frames_;
-  return true;
-}
-
-bool IvfFileWriter::Close() {
-  if (!file_.IsOpen())
-    return false;
-
-  if (num_frames_ == 0) {
-    file_.Close();
-    return true;
-  }
-
-  bool ret = WriteHeader();
-  file_.Close();
-  return ret;
-}
-
-}  // namespace webrtc
diff --git a/modules/video_coding/utility/ivf_file_writer.h b/modules/video_coding/utility/ivf_file_writer.h
deleted file mode 100644
index 07a8581..0000000
--- a/modules/video_coding/utility/ivf_file_writer.h
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- *  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_VIDEO_CODING_UTILITY_IVF_FILE_WRITER_H_
-#define WEBRTC_MODULES_VIDEO_CODING_UTILITY_IVF_FILE_WRITER_H_
-
-#include <memory>
-#include <string>
-
-#include "webrtc/common_video/include/video_frame.h"
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/file.h"
-#include "webrtc/rtc_base/timeutils.h"
-
-namespace webrtc {
-
-class IvfFileWriter {
- public:
-  // Takes ownership of the file, which will be closed either through
-  // Close or ~IvfFileWriter. If writing a frame would take the file above the
-  // |byte_limit| the file will be closed, the write (and all future writes)
-  // will fail. A |byte_limit| of 0 is equivalent to no limit.
-  static std::unique_ptr<IvfFileWriter> Wrap(rtc::File file, size_t byte_limit);
-  ~IvfFileWriter();
-
-  bool WriteFrame(const EncodedImage& encoded_image, VideoCodecType codec_type);
-  bool Close();
-
- private:
-  explicit IvfFileWriter(rtc::File file, size_t byte_limit);
-
-  bool WriteHeader();
-  bool InitFromFirstFrame(const EncodedImage& encoded_image,
-                          VideoCodecType codec_type);
-
-  VideoCodecType codec_type_;
-  size_t bytes_written_;
-  size_t byte_limit_;
-  size_t num_frames_;
-  uint16_t width_;
-  uint16_t height_;
-  int64_t last_timestamp_;
-  bool using_capture_timestamps_;
-  rtc::TimestampWrapAroundHandler wrap_handler_;
-  rtc::File file_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(IvfFileWriter);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_VIDEO_CODING_UTILITY_IVF_FILE_WRITER_H_
diff --git a/modules/video_coding/utility/ivf_file_writer_unittest.cc b/modules/video_coding/utility/ivf_file_writer_unittest.cc
deleted file mode 100644
index b7a9b41..0000000
--- a/modules/video_coding/utility/ivf_file_writer_unittest.cc
+++ /dev/null
@@ -1,183 +0,0 @@
-/*
- *  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/video_coding/utility/ivf_file_writer.h"
-
-#include <memory>
-
-#include "webrtc/modules/rtp_rtcp/source/byte_io.h"
-#include "webrtc/rtc_base/helpers.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/thread.h"
-#include "webrtc/rtc_base/timeutils.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/testsupport/fileutils.h"
-
-namespace webrtc {
-
-namespace {
-static const int kHeaderSize = 32;
-static const int kFrameHeaderSize = 12;
-static uint8_t dummy_payload[4] = {0, 1, 2, 3};
-}  // namespace
-
-class IvfFileWriterTest : public ::testing::Test {
- protected:
-  void SetUp() override {
-    file_name_ =
-        webrtc::test::TempFilename(webrtc::test::OutputPath(), "test_file");
-  }
-  void TearDown() override { rtc::RemoveFile(file_name_); }
-
-  bool WriteDummyTestFrames(VideoCodecType codec_type,
-                            int width,
-                            int height,
-                            int num_frames,
-                            bool use_capture_tims_ms) {
-    EncodedImage frame;
-    frame._buffer = dummy_payload;
-    frame._encodedWidth = width;
-    frame._encodedHeight = height;
-    for (int i = 1; i <= num_frames; ++i) {
-      frame._length = i % sizeof(dummy_payload);
-      if (use_capture_tims_ms) {
-        frame.capture_time_ms_ = i;
-      } else {
-        frame._timeStamp = i;
-      }
-      if (!file_writer_->WriteFrame(frame, codec_type))
-        return false;
-    }
-    return true;
-  }
-
-  void VerifyIvfHeader(rtc::File* file,
-                       const uint8_t fourcc[4],
-                       int width,
-                       int height,
-                       uint32_t num_frames,
-                       bool use_capture_tims_ms) {
-    ASSERT_TRUE(file->IsOpen());
-    uint8_t data[kHeaderSize];
-    ASSERT_EQ(static_cast<size_t>(kHeaderSize), file->Read(data, kHeaderSize));
-
-    uint8_t dkif[4] = {'D', 'K', 'I', 'F'};
-    EXPECT_EQ(0, memcmp(dkif, data, 4));
-    EXPECT_EQ(0u, ByteReader<uint16_t>::ReadLittleEndian(&data[4]));
-    EXPECT_EQ(32u, ByteReader<uint16_t>::ReadLittleEndian(&data[6]));
-    EXPECT_EQ(0, memcmp(fourcc, &data[8], 4));
-    EXPECT_EQ(width, ByteReader<uint16_t>::ReadLittleEndian(&data[12]));
-    EXPECT_EQ(height, ByteReader<uint16_t>::ReadLittleEndian(&data[14]));
-    EXPECT_EQ(use_capture_tims_ms ? 1000u : 90000u,
-              ByteReader<uint32_t>::ReadLittleEndian(&data[16]));
-    EXPECT_EQ(1u, ByteReader<uint32_t>::ReadLittleEndian(&data[20]));
-    EXPECT_EQ(num_frames, ByteReader<uint32_t>::ReadLittleEndian(&data[24]));
-    EXPECT_EQ(0u, ByteReader<uint32_t>::ReadLittleEndian(&data[28]));
-  }
-
-  void VerifyDummyTestFrames(rtc::File* file, uint32_t num_frames) {
-    const int kMaxFrameSize = 4;
-    for (uint32_t i = 1; i <= num_frames; ++i) {
-      uint8_t frame_header[kFrameHeaderSize];
-      ASSERT_EQ(static_cast<unsigned int>(kFrameHeaderSize),
-                file->Read(frame_header, kFrameHeaderSize));
-      uint32_t frame_length =
-          ByteReader<uint32_t>::ReadLittleEndian(&frame_header[0]);
-      EXPECT_EQ(i % 4, frame_length);
-      uint64_t timestamp =
-          ByteReader<uint64_t>::ReadLittleEndian(&frame_header[4]);
-      EXPECT_EQ(i, timestamp);
-
-      uint8_t data[kMaxFrameSize] = {};
-      ASSERT_EQ(frame_length,
-                static_cast<uint32_t>(file->Read(data, frame_length)));
-      EXPECT_EQ(0, memcmp(data, dummy_payload, frame_length));
-    }
-  }
-
-  void RunBasicFileStructureTest(VideoCodecType codec_type,
-                                 const uint8_t fourcc[4],
-                                 bool use_capture_tims_ms) {
-    file_writer_ = IvfFileWriter::Wrap(rtc::File::Open(file_name_), 0);
-    ASSERT_TRUE(file_writer_.get());
-    const int kWidth = 320;
-    const int kHeight = 240;
-    const int kNumFrames = 257;
-    ASSERT_TRUE(WriteDummyTestFrames(codec_type, kWidth, kHeight, kNumFrames,
-                                     use_capture_tims_ms));
-    EXPECT_TRUE(file_writer_->Close());
-
-    rtc::File out_file = rtc::File::Open(file_name_);
-    VerifyIvfHeader(&out_file, fourcc, kWidth, kHeight, kNumFrames,
-                    use_capture_tims_ms);
-    VerifyDummyTestFrames(&out_file, kNumFrames);
-
-    out_file.Close();
-  }
-
-  std::string file_name_;
-  std::unique_ptr<IvfFileWriter> file_writer_;
-};
-
-TEST_F(IvfFileWriterTest, WritesBasicVP8FileNtpTimestamp) {
-  const uint8_t fourcc[4] = {'V', 'P', '8', '0'};
-  RunBasicFileStructureTest(kVideoCodecVP8, fourcc, false);
-}
-
-TEST_F(IvfFileWriterTest, WritesBasicVP8FileMsTimestamp) {
-  const uint8_t fourcc[4] = {'V', 'P', '8', '0'};
-  RunBasicFileStructureTest(kVideoCodecVP8, fourcc, true);
-}
-
-TEST_F(IvfFileWriterTest, WritesBasicVP9FileNtpTimestamp) {
-  const uint8_t fourcc[4] = {'V', 'P', '9', '0'};
-  RunBasicFileStructureTest(kVideoCodecVP9, fourcc, false);
-}
-
-TEST_F(IvfFileWriterTest, WritesBasicVP9FileMsTimestamp) {
-  const uint8_t fourcc[4] = {'V', 'P', '9', '0'};
-  RunBasicFileStructureTest(kVideoCodecVP9, fourcc, true);
-}
-
-TEST_F(IvfFileWriterTest, WritesBasicH264FileNtpTimestamp) {
-  const uint8_t fourcc[4] = {'H', '2', '6', '4'};
-  RunBasicFileStructureTest(kVideoCodecH264, fourcc, false);
-}
-
-TEST_F(IvfFileWriterTest, WritesBasicH264FileMsTimestamp) {
-  const uint8_t fourcc[4] = {'H', '2', '6', '4'};
-  RunBasicFileStructureTest(kVideoCodecH264, fourcc, true);
-}
-
-TEST_F(IvfFileWriterTest, ClosesWhenReachesLimit) {
-  const uint8_t fourcc[4] = {'V', 'P', '8', '0'};
-  const int kWidth = 320;
-  const int kHeight = 240;
-  const int kNumFramesToWrite = 2;
-  const int kNumFramesToFit = 1;
-
-  file_writer_ = IvfFileWriter::Wrap(
-      rtc::File::Open(file_name_),
-      kHeaderSize +
-          kNumFramesToFit * (kFrameHeaderSize + sizeof(dummy_payload)));
-  ASSERT_TRUE(file_writer_.get());
-
-  ASSERT_FALSE(WriteDummyTestFrames(kVideoCodecVP8, kWidth, kHeight,
-                                    kNumFramesToWrite, true));
-  ASSERT_FALSE(file_writer_->Close());
-
-  rtc::File out_file = rtc::File::Open(file_name_);
-  VerifyIvfHeader(&out_file, fourcc, kWidth, kHeight, kNumFramesToFit, true);
-  VerifyDummyTestFrames(&out_file, kNumFramesToFit);
-
-  out_file.Close();
-}
-
-}  // namespace webrtc
diff --git a/modules/video_coding/utility/mock/mock_frame_dropper.h b/modules/video_coding/utility/mock/mock_frame_dropper.h
deleted file mode 100644
index c5521b8..0000000
--- a/modules/video_coding/utility/mock/mock_frame_dropper.h
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- *  Copyright (c) 2013 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_VIDEO_CODING_UTILITY_MOCK_MOCK_FRAME_DROPPER_H_
-#define WEBRTC_MODULES_VIDEO_CODING_UTILITY_MOCK_MOCK_FRAME_DROPPER_H_
-
-#include <string>
-
-#include "webrtc/modules/video_coding/utility/frame_dropper.h"
-#include "webrtc/test/gmock.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-class MockFrameDropper : public FrameDropper {
- public:
-  MOCK_METHOD0(Reset, void());
-  MOCK_METHOD1(Enable, void(bool enable));
-  MOCK_METHOD0(DropFrame, bool());
-  MOCK_METHOD2(Fill, void(size_t frameSizeBytes, bool deltaFrame));
-  MOCK_METHOD1(Leak, void(uint32_t inputFrameRate));
-  MOCK_METHOD2(SetRates, void(float bitRate, float incoming_frame_rate));
-  MOCK_CONST_METHOD1(ActualFrameRate, float(uint32_t inputFrameRate));
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_VIDEO_CODING_UTILITY_MOCK_MOCK_FRAME_DROPPER_H_
diff --git a/modules/video_coding/utility/moving_average.cc b/modules/video_coding/utility/moving_average.cc
deleted file mode 100644
index 34e7bb6..0000000
--- a/modules/video_coding/utility/moving_average.cc
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- *  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/video_coding/utility/moving_average.h"
-
-#include <algorithm>
-
-namespace webrtc {
-
-MovingAverage::MovingAverage(size_t s) : sum_history_(s + 1, 0) {}
-
-void MovingAverage::AddSample(int sample) {
-  count_++;
-  sum_ += sample;
-  sum_history_[count_ % sum_history_.size()] = sum_;
-}
-
-rtc::Optional<int> MovingAverage::GetAverage() const {
-  return GetAverage(size());
-}
-
-rtc::Optional<int> MovingAverage::GetAverage(size_t num_samples) const {
-  if (num_samples > size() || num_samples == 0)
-    return rtc::Optional<int>();
-  int sum = sum_ - sum_history_[(count_ - num_samples) % sum_history_.size()];
-  return rtc::Optional<int>(sum / static_cast<int>(num_samples));
-}
-
-void MovingAverage::Reset() {
-  count_ = 0;
-  sum_ = 0;
-  std::fill(sum_history_.begin(), sum_history_.end(), 0);
-}
-
-size_t MovingAverage::size() const {
-  return std::min(count_, sum_history_.size() - 1);
-}
-
-}  // namespace webrtc
diff --git a/modules/video_coding/utility/moving_average.h b/modules/video_coding/utility/moving_average.h
deleted file mode 100644
index 0f2c4cc..0000000
--- a/modules/video_coding/utility/moving_average.h
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- *  Copyright (c) 2015 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_VIDEO_CODING_UTILITY_MOVING_AVERAGE_H_
-#define WEBRTC_MODULES_VIDEO_CODING_UTILITY_MOVING_AVERAGE_H_
-
-#include <vector>
-
-#include "webrtc/api/optional.h"
-
-namespace webrtc {
-class MovingAverage {
- public:
-  explicit MovingAverage(size_t s);
-  void AddSample(int sample);
-  rtc::Optional<int> GetAverage() const;
-  rtc::Optional<int> GetAverage(size_t num_samples) const;
-  void Reset();
-  size_t size() const;
-
- private:
-  size_t count_ = 0;
-  int sum_ = 0;
-  std::vector<int> sum_history_;
-};
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_VIDEO_CODING_UTILITY_MOVING_AVERAGE_H_
diff --git a/modules/video_coding/utility/moving_average_unittest.cc b/modules/video_coding/utility/moving_average_unittest.cc
deleted file mode 100644
index 77c3adf..0000000
--- a/modules/video_coding/utility/moving_average_unittest.cc
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- *  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/video_coding/utility/moving_average.h"
-
-#include "webrtc/test/gtest.h"
-
-TEST(MovingAverageTest, EmptyAverage) {
-  webrtc::MovingAverage moving_average(1);
-  EXPECT_EQ(0u, moving_average.size());
-  EXPECT_FALSE(moving_average.GetAverage(0));
-}
-
-// Test single value.
-TEST(MovingAverageTest, OneElement) {
-  webrtc::MovingAverage moving_average(1);
-  moving_average.AddSample(3);
-  EXPECT_EQ(1u, moving_average.size());
-  EXPECT_EQ(3, *moving_average.GetAverage());
-  EXPECT_EQ(3, *moving_average.GetAverage(1));
-  EXPECT_FALSE(moving_average.GetAverage(2));
-}
-
-TEST(MovingAverageTest, GetAverage) {
-  webrtc::MovingAverage moving_average(1024);
-  moving_average.AddSample(1);
-  moving_average.AddSample(1);
-  moving_average.AddSample(3);
-  moving_average.AddSample(3);
-  EXPECT_EQ(*moving_average.GetAverage(4), 2);
-  EXPECT_EQ(*moving_average.GetAverage(2), 3);
-  EXPECT_FALSE(moving_average.GetAverage(0));
-}
-
-TEST(MovingAverageTest, Reset) {
-  webrtc::MovingAverage moving_average(5);
-  moving_average.AddSample(1);
-  EXPECT_EQ(1, *moving_average.GetAverage(1));
-  moving_average.Reset();
-  EXPECT_FALSE(moving_average.GetAverage(1));
-  EXPECT_FALSE(moving_average.GetAverage(6));
-}
-
-TEST(MovingAverageTest, ManySamples) {
-  webrtc::MovingAverage moving_average(10);
-  for (int i = 1; i < 11; i++) {
-    moving_average.AddSample(i);
-  }
-  EXPECT_EQ(*moving_average.GetAverage(), 5);
-  moving_average.Reset();
-  for (int i = 1; i < 2001; i++) {
-    moving_average.AddSample(i);
-  }
-  EXPECT_EQ(*moving_average.GetAverage(), 1995);
-}
diff --git a/modules/video_coding/utility/quality_scaler.cc b/modules/video_coding/utility/quality_scaler.cc
deleted file mode 100644
index 760ebd7..0000000
--- a/modules/video_coding/utility/quality_scaler.cc
+++ /dev/null
@@ -1,205 +0,0 @@
-/*
- *  Copyright (c) 2014 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/video_coding/utility/quality_scaler.h"
-
-#include <math.h>
-
-#include <algorithm>
-#include <memory>
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/task_queue.h"
-
-// TODO(kthelgason): Some versions of Android have issues with log2.
-// See https://code.google.com/p/android/issues/detail?id=212634 for details
-#if defined(WEBRTC_ANDROID)
-#define log2(x) (log(x) / log(2))
-#endif
-
-namespace webrtc {
-
-namespace {
-// Threshold constant used until first downscale (to permit fast rampup).
-static const int kMeasureMs = 2000;
-static const float kSamplePeriodScaleFactor = 2.5;
-static const int kFramedropPercentThreshold = 60;
-// QP scaling threshold defaults:
-static const int kLowH264QpThreshold = 24;
-static const int kHighH264QpThreshold = 37;
-// QP is obtained from VP8-bitstream for HW, so the QP corresponds to the
-// bitstream range of [0, 127] and not the user-level range of [0,63].
-static const int kLowVp8QpThreshold = 29;
-static const int kHighVp8QpThreshold = 95;
-// QP is obtained from VP9-bitstream for HW, so the QP corresponds to the
-// bitstream range of [0, 255] and not the user-level range of [0,63].
-// Current VP9 settings are mapped from VP8 thresholds above.
-static const int kLowVp9QpThreshold = 96;
-static const int kHighVp9QpThreshold = 185;
-static const int kMinFramesNeededToScale = 2 * 30;
-
-static VideoEncoder::QpThresholds CodecTypeToDefaultThresholds(
-    VideoCodecType codec_type) {
-  int low = -1;
-  int high = -1;
-  switch (codec_type) {
-    case kVideoCodecH264:
-      low = kLowH264QpThreshold;
-      high = kHighH264QpThreshold;
-      break;
-    case kVideoCodecVP8:
-      low = kLowVp8QpThreshold;
-      high = kHighVp8QpThreshold;
-      break;
-    case kVideoCodecVP9:
-      low = kLowVp9QpThreshold;
-      high = kHighVp9QpThreshold;
-      break;
-    default:
-      RTC_NOTREACHED() << "Invalid codec type for QualityScaler.";
-  }
-  return VideoEncoder::QpThresholds(low, high);
-}
-}  // namespace
-
-class QualityScaler::CheckQPTask : public rtc::QueuedTask {
- public:
-  explicit CheckQPTask(QualityScaler* scaler) : scaler_(scaler) {
-    LOG(LS_INFO) << "Created CheckQPTask. Scheduling on queue...";
-    rtc::TaskQueue::Current()->PostDelayedTask(
-        std::unique_ptr<rtc::QueuedTask>(this), scaler_->GetSamplingPeriodMs());
-  }
-  void Stop() {
-    RTC_DCHECK_CALLED_SEQUENTIALLY(&task_checker_);
-    LOG(LS_INFO) << "Stopping QP Check task.";
-    stop_ = true;
-  }
-
- private:
-  bool Run() override {
-    RTC_DCHECK_CALLED_SEQUENTIALLY(&task_checker_);
-    if (stop_)
-      return true;  // TaskQueue will free this task.
-    scaler_->CheckQP();
-    rtc::TaskQueue::Current()->PostDelayedTask(
-        std::unique_ptr<rtc::QueuedTask>(this), scaler_->GetSamplingPeriodMs());
-    return false;  // Retain the task in order to reuse it.
-  }
-
-  QualityScaler* const scaler_;
-  bool stop_ = false;
-  rtc::SequencedTaskChecker task_checker_;
-};
-
-QualityScaler::QualityScaler(AdaptationObserverInterface* observer,
-                             VideoCodecType codec_type)
-    : QualityScaler(observer, CodecTypeToDefaultThresholds(codec_type)) {}
-
-QualityScaler::QualityScaler(AdaptationObserverInterface* observer,
-                             VideoEncoder::QpThresholds thresholds)
-    : QualityScaler(observer, thresholds, kMeasureMs) {}
-
-// Protected ctor, should not be called directly.
-QualityScaler::QualityScaler(AdaptationObserverInterface* observer,
-                             VideoEncoder::QpThresholds thresholds,
-                             int64_t sampling_period)
-    : check_qp_task_(nullptr),
-      observer_(observer),
-      sampling_period_ms_(sampling_period),
-      fast_rampup_(true),
-      // Arbitrarily choose size based on 30 fps for 5 seconds.
-      average_qp_(5 * 30),
-      framedrop_percent_(5 * 30),
-      thresholds_(thresholds) {
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&task_checker_);
-  RTC_DCHECK(observer_ != nullptr);
-  check_qp_task_ = new CheckQPTask(this);
-  LOG(LS_INFO) << "QP thresholds: low: " << thresholds_.low
-               << ", high: " << thresholds_.high;
-}
-
-QualityScaler::~QualityScaler() {
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&task_checker_);
-  check_qp_task_->Stop();
-}
-
-int64_t QualityScaler::GetSamplingPeriodMs() const {
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&task_checker_);
-  return fast_rampup_ ? sampling_period_ms_
-                      : (sampling_period_ms_ * kSamplePeriodScaleFactor);
-}
-
-void QualityScaler::ReportDroppedFrame() {
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&task_checker_);
-  framedrop_percent_.AddSample(100);
-}
-
-void QualityScaler::ReportQP(int qp) {
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&task_checker_);
-  framedrop_percent_.AddSample(0);
-  average_qp_.AddSample(qp);
-}
-
-void QualityScaler::CheckQP() {
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&task_checker_);
-  // Should be set through InitEncode -> Should be set by now.
-  RTC_DCHECK_GE(thresholds_.low, 0);
-
-  // If we have not observed at least this many frames we can't
-  // make a good scaling decision.
-  if (framedrop_percent_.size() < kMinFramesNeededToScale)
-    return;
-
-  // Check if we should scale down due to high frame drop.
-  const rtc::Optional<int> drop_rate = framedrop_percent_.GetAverage();
-  if (drop_rate && *drop_rate >= kFramedropPercentThreshold) {
-    ReportQPHigh();
-    return;
-  }
-
-  // Check if we should scale up or down based on QP.
-  const rtc::Optional<int> avg_qp = average_qp_.GetAverage();
-  if (avg_qp) {
-    LOG(LS_INFO) << "Checking average QP " << *avg_qp;
-    if (*avg_qp > thresholds_.high) {
-      ReportQPHigh();
-      return;
-    }
-    if (*avg_qp <= thresholds_.low) {
-      // QP has been low. We want to try a higher resolution.
-      ReportQPLow();
-      return;
-    }
-  }
-}
-
-void QualityScaler::ReportQPLow() {
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&task_checker_);
-  ClearSamples();
-  observer_->AdaptUp(AdaptationObserverInterface::AdaptReason::kQuality);
-}
-
-void QualityScaler::ReportQPHigh() {
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&task_checker_);
-  ClearSamples();
-  observer_->AdaptDown(AdaptationObserverInterface::AdaptReason::kQuality);
-  // If we've scaled down, wait longer before scaling up again.
-  if (fast_rampup_) {
-    fast_rampup_ = false;
-  }
-}
-
-void QualityScaler::ClearSamples() {
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&task_checker_);
-  framedrop_percent_.Reset();
-  average_qp_.Reset();
-}
-}  // namespace webrtc
diff --git a/modules/video_coding/utility/quality_scaler.h b/modules/video_coding/utility/quality_scaler.h
deleted file mode 100644
index abe6d72..0000000
--- a/modules/video_coding/utility/quality_scaler.h
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- *  Copyright (c) 2014 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_VIDEO_CODING_UTILITY_QUALITY_SCALER_H_
-#define WEBRTC_MODULES_VIDEO_CODING_UTILITY_QUALITY_SCALER_H_
-
-#include <utility>
-
-#include "webrtc/api/optional.h"
-#include "webrtc/api/video_codecs/video_encoder.h"
-#include "webrtc/common_types.h"
-#include "webrtc/modules/video_coding/utility/moving_average.h"
-#include "webrtc/rtc_base/sequenced_task_checker.h"
-
-namespace webrtc {
-
-// An interface for signaling requests to limit or increase the resolution or
-// framerate of the captured video stream.
-class AdaptationObserverInterface {
- public:
-  // Indicates if the adaptation is due to overuse of the CPU resources, or if
-  // the quality of the encoded frames have dropped too low.
-  enum AdaptReason : size_t { kQuality = 0, kCpu = 1 };
-  static const size_t kScaleReasonSize = 2;
-  // Called to signal that we can handle larger or more frequent frames.
-  virtual void AdaptUp(AdaptReason reason) = 0;
-  // Called to signal that the source should reduce the resolution or framerate.
-  virtual void AdaptDown(AdaptReason reason) = 0;
-
- protected:
-  virtual ~AdaptationObserverInterface() {}
-};
-
-// QualityScaler runs asynchronously and monitors QP values of encoded frames.
-// It holds a reference to a ScalingObserverInterface implementation to signal
-// an intent to scale up or down.
-class QualityScaler {
- public:
-  // Construct a QualityScaler with a given |observer|.
-  // This starts the quality scaler periodically checking what the average QP
-  // has been recently.
-  QualityScaler(AdaptationObserverInterface* observer,
-                VideoCodecType codec_type);
-  // If specific thresholds are desired these can be supplied as |thresholds|.
-  QualityScaler(AdaptationObserverInterface* observer,
-                VideoEncoder::QpThresholds thresholds);
-  virtual ~QualityScaler();
-  // Should be called each time the encoder drops a frame
-  void ReportDroppedFrame();
-  // Inform the QualityScaler of the last seen QP.
-  void ReportQP(int qp);
-
-  // The following members declared protected for testing purposes
- protected:
-  QualityScaler(AdaptationObserverInterface* observer,
-                VideoEncoder::QpThresholds thresholds,
-                int64_t sampling_period);
-
- private:
-  class CheckQPTask;
-  void CheckQP();
-  void ClearSamples();
-  void ReportQPLow();
-  void ReportQPHigh();
-  int64_t GetSamplingPeriodMs() const;
-
-  CheckQPTask* check_qp_task_ RTC_GUARDED_BY(&task_checker_);
-  AdaptationObserverInterface* const observer_ RTC_GUARDED_BY(&task_checker_);
-  rtc::SequencedTaskChecker task_checker_;
-
-  const int64_t sampling_period_ms_;
-  bool fast_rampup_ RTC_GUARDED_BY(&task_checker_);
-  MovingAverage average_qp_ RTC_GUARDED_BY(&task_checker_);
-  MovingAverage framedrop_percent_ RTC_GUARDED_BY(&task_checker_);
-
-  VideoEncoder::QpThresholds thresholds_ RTC_GUARDED_BY(&task_checker_);
-};
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_VIDEO_CODING_UTILITY_QUALITY_SCALER_H_
diff --git a/modules/video_coding/utility/quality_scaler_unittest.cc b/modules/video_coding/utility/quality_scaler_unittest.cc
deleted file mode 100644
index 37a986c..0000000
--- a/modules/video_coding/utility/quality_scaler_unittest.cc
+++ /dev/null
@@ -1,202 +0,0 @@
-/*
- *  Copyright (c) 2014 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/video_coding/utility/quality_scaler.h"
-
-#include <memory>
-
-#include "webrtc/rtc_base/event.h"
-#include "webrtc/rtc_base/task_queue.h"
-#include "webrtc/test/gmock.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-namespace {
-static const int kFramerate = 30;
-static const int kLowQp = 15;
-static const int kLowQpThreshold = 18;
-static const int kHighQp = 40;
-static const size_t kDefaultTimeoutMs = 150;
-}  // namespace
-
-#define DO_SYNC(q, block) do {    \
-  rtc::Event event(false, false); \
-  q->PostTask([this, &event] {    \
-    block;                        \
-    event.Set();                  \
-  });                             \
-  RTC_CHECK(event.Wait(1000));    \
-  } while (0)
-
-
-class MockAdaptationObserver : public AdaptationObserverInterface {
- public:
-  MockAdaptationObserver() : event(false, false) {}
-  virtual ~MockAdaptationObserver() {}
-
-  void AdaptUp(AdaptReason r) override {
-    adapt_up_events_++;
-    event.Set();
-  }
-  void AdaptDown(AdaptReason r) override {
-    adapt_down_events_++;
-    event.Set();
-  }
-
-  rtc::Event event;
-  int adapt_up_events_ = 0;
-  int adapt_down_events_ = 0;
-};
-
-// Pass a lower sampling period to speed up the tests.
-class QualityScalerUnderTest : public QualityScaler {
- public:
-  explicit QualityScalerUnderTest(AdaptationObserverInterface* observer,
-                                  VideoEncoder::QpThresholds thresholds)
-      : QualityScaler(observer, thresholds, 5) {}
-};
-
-class QualityScalerTest : public ::testing::Test {
- protected:
-  enum ScaleDirection {
-    kKeepScaleAtHighQp,
-    kScaleDown,
-    kScaleDownAboveHighQp,
-    kScaleUp
-  };
-
-  QualityScalerTest()
-      : q_(new rtc::TaskQueue("QualityScalerTestQueue")),
-        observer_(new MockAdaptationObserver()) {
-    DO_SYNC(q_, {
-      qs_ = std::unique_ptr<QualityScaler>(new QualityScalerUnderTest(
-          observer_.get(),
-          VideoEncoder::QpThresholds(kLowQpThreshold, kHighQp)));});
-  }
-
-  ~QualityScalerTest() {
-    DO_SYNC(q_, {qs_.reset(nullptr);});
-  }
-
-  void TriggerScale(ScaleDirection scale_direction) {
-    for (int i = 0; i < kFramerate * 5; ++i) {
-      switch (scale_direction) {
-        case kScaleUp:
-          qs_->ReportQP(kLowQp);
-          break;
-        case kScaleDown:
-          qs_->ReportDroppedFrame();
-          break;
-        case kKeepScaleAtHighQp:
-          qs_->ReportQP(kHighQp);
-          break;
-        case kScaleDownAboveHighQp:
-          qs_->ReportQP(kHighQp + 1);
-          break;
-      }
-    }
-  }
-
-  std::unique_ptr<rtc::TaskQueue> q_;
-  std::unique_ptr<QualityScaler> qs_;
-  std::unique_ptr<MockAdaptationObserver> observer_;
-};
-
-TEST_F(QualityScalerTest, DownscalesAfterContinuousFramedrop) {
-  DO_SYNC(q_, { TriggerScale(kScaleDown); });
-  EXPECT_TRUE(observer_->event.Wait(kDefaultTimeoutMs));
-  EXPECT_EQ(1, observer_->adapt_down_events_);
-}
-
-TEST_F(QualityScalerTest, KeepsScaleAtHighQp) {
-  DO_SYNC(q_, { TriggerScale(kKeepScaleAtHighQp); });
-  EXPECT_FALSE(observer_->event.Wait(kDefaultTimeoutMs));
-  EXPECT_EQ(0, observer_->adapt_down_events_);
-  EXPECT_EQ(0, observer_->adapt_up_events_);
-}
-
-TEST_F(QualityScalerTest, DownscalesAboveHighQp) {
-  DO_SYNC(q_, { TriggerScale(kScaleDownAboveHighQp); });
-  EXPECT_TRUE(observer_->event.Wait(kDefaultTimeoutMs));
-  EXPECT_EQ(1, observer_->adapt_down_events_);
-  EXPECT_EQ(0, observer_->adapt_up_events_);
-}
-
-TEST_F(QualityScalerTest, DownscalesAfterTwoThirdsFramedrop) {
-  DO_SYNC(q_, {
-    for (int i = 0; i < kFramerate * 5; ++i) {
-      qs_->ReportDroppedFrame();
-      qs_->ReportDroppedFrame();
-      qs_->ReportQP(kHighQp);
-    }
-  });
-  EXPECT_TRUE(observer_->event.Wait(kDefaultTimeoutMs));
-  EXPECT_EQ(1, observer_->adapt_down_events_);
-  EXPECT_EQ(0, observer_->adapt_up_events_);
-}
-
-TEST_F(QualityScalerTest, DoesNotDownscaleOnNormalQp) {
-  DO_SYNC(q_, { TriggerScale(kScaleDownAboveHighQp); });
-  EXPECT_TRUE(observer_->event.Wait(kDefaultTimeoutMs));
-  EXPECT_EQ(1, observer_->adapt_down_events_);
-  EXPECT_EQ(0, observer_->adapt_up_events_);
-}
-
-TEST_F(QualityScalerTest, DoesNotDownscaleAfterHalfFramedrop) {
-  DO_SYNC(q_, {
-    for (int i = 0; i < kFramerate * 5; ++i) {
-      qs_->ReportDroppedFrame();
-      qs_->ReportQP(kHighQp);
-    }
-  });
-  EXPECT_FALSE(observer_->event.Wait(kDefaultTimeoutMs));
-  EXPECT_EQ(0, observer_->adapt_down_events_);
-  EXPECT_EQ(0, observer_->adapt_up_events_);
-}
-
-TEST_F(QualityScalerTest, UpscalesAfterLowQp) {
-  DO_SYNC(q_, { TriggerScale(kScaleUp); });
-  EXPECT_TRUE(observer_->event.Wait(kDefaultTimeoutMs));
-  EXPECT_EQ(0, observer_->adapt_down_events_);
-  EXPECT_EQ(1, observer_->adapt_up_events_);
-}
-
-TEST_F(QualityScalerTest, ScalesDownAndBackUp) {
-  DO_SYNC(q_, { TriggerScale(kScaleDown); });
-  EXPECT_TRUE(observer_->event.Wait(kDefaultTimeoutMs));
-  EXPECT_EQ(1, observer_->adapt_down_events_);
-  EXPECT_EQ(0, observer_->adapt_up_events_);
-  DO_SYNC(q_, { TriggerScale(kScaleUp); });
-  EXPECT_TRUE(observer_->event.Wait(kDefaultTimeoutMs));
-  EXPECT_EQ(1, observer_->adapt_down_events_);
-  EXPECT_EQ(1, observer_->adapt_up_events_);
-}
-
-TEST_F(QualityScalerTest, DoesNotScaleUntilEnoughFramesObserved) {
-  DO_SYNC(q_, {
-      // Send 30 frames. This should not be enough to make a decision.
-      for (int i = 0; i < kFramerate; ++i) {
-        qs_->ReportQP(kLowQp);
-      }
-    });
-  EXPECT_FALSE(observer_->event.Wait(kDefaultTimeoutMs));
-  DO_SYNC(q_, {
-      // Send 30 more. This should result in an adapt request as
-      // enough frames have now been observed.
-      for (int i = 0; i < kFramerate; ++i) {
-        qs_->ReportQP(kLowQp);
-      }
-    });
-  EXPECT_TRUE(observer_->event.Wait(kDefaultTimeoutMs));
-  EXPECT_EQ(0, observer_->adapt_down_events_);
-  EXPECT_EQ(1, observer_->adapt_up_events_);
-}
-}  // namespace webrtc
-#undef DO_SYNC
diff --git a/modules/video_coding/utility/simulcast_rate_allocator_unittest.cc b/modules/video_coding/utility/simulcast_rate_allocator_unittest.cc
deleted file mode 100644
index e0aac10..0000000
--- a/modules/video_coding/utility/simulcast_rate_allocator_unittest.cc
+++ /dev/null
@@ -1,376 +0,0 @@
-/*
- *  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/video_coding/codecs/vp8/simulcast_rate_allocator.h"
-
-#include <limits>
-#include <memory>
-#include <utility>
-#include <vector>
-
-#include "webrtc/test/gmock.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-namespace {
-using ::testing::_;
-
-constexpr uint32_t kMinBitrateKbps = 50;
-constexpr uint32_t kTargetBitrateKbps = 100;
-constexpr uint32_t kMaxBitrateKbps = 1000;
-constexpr uint32_t kFramerateFps = 5;
-
-class MockTemporalLayers : public TemporalLayers {
- public:
-  MOCK_METHOD1(UpdateLayerConfig, TemporalLayers::FrameConfig(uint32_t));
-  MOCK_METHOD3(OnRatesUpdated, std::vector<uint32_t>(int, int, int));
-  MOCK_METHOD1(UpdateConfiguration, bool(vpx_codec_enc_cfg_t*));
-  MOCK_METHOD4(PopulateCodecSpecific,
-               void(bool,
-                    const TemporalLayers::FrameConfig&,
-                    CodecSpecificInfoVP8*,
-                    uint32_t));
-  MOCK_METHOD2(FrameEncoded, void(unsigned int, int));
-  MOCK_CONST_METHOD0(Tl0PicIdx, uint8_t());
-  MOCK_CONST_METHOD1(GetTemporalLayerId,
-                     int(const TemporalLayers::FrameConfig&));
-};
-}  // namespace
-
-class SimulcastRateAllocatorTest : public ::testing::TestWithParam<bool> {
- public:
-  SimulcastRateAllocatorTest() {
-    memset(&codec_, 0, sizeof(VideoCodec));
-    codec_.minBitrate = kMinBitrateKbps;
-    codec_.targetBitrate = kTargetBitrateKbps;
-    codec_.maxBitrate = kMaxBitrateKbps;
-    CreateAllocator();
-  }
-  virtual ~SimulcastRateAllocatorTest() {}
-
-  template <size_t S>
-  void ExpectEqual(uint32_t (&expected)[S],
-                   const std::vector<uint32_t>& actual) {
-    EXPECT_EQ(S, actual.size());
-    for (size_t i = 0; i < S; ++i)
-      EXPECT_EQ(expected[i], actual[i]) << "Mismatch at index " << i;
-  }
-
-  template <size_t S>
-  void ExpectEqual(uint32_t (&expected)[S], const BitrateAllocation& actual) {
-    // EXPECT_EQ(S, actual.size());
-    uint32_t sum = 0;
-    for (size_t i = 0; i < S; ++i) {
-      uint32_t layer_bitrate = actual.GetSpatialLayerSum(i);
-      EXPECT_EQ(expected[i] * 1000U, layer_bitrate) << "Mismatch at index "
-                                                    << i;
-      sum += layer_bitrate;
-    }
-    EXPECT_EQ(sum, actual.get_sum_bps());
-  }
-
-  void CreateAllocator() {
-    std::unique_ptr<TemporalLayersFactory> tl_factory(GetTlFactory());
-    codec_.VP8()->tl_factory = tl_factory.get();
-    allocator_.reset(new SimulcastRateAllocator(codec_, std::move(tl_factory)));
-
-    // Simulate InitEncode().
-    tl_factories_.clear();
-    if (codec_.numberOfSimulcastStreams == 0) {
-      tl_factories_.push_back(
-          std::unique_ptr<TemporalLayers>(codec_.VP8()->tl_factory->Create(
-              0, codec_.VP8()->numberOfTemporalLayers, 0)));
-    } else {
-      for (uint32_t i = 0; i < codec_.numberOfSimulcastStreams; ++i) {
-        tl_factories_.push_back(
-            std::unique_ptr<TemporalLayers>(codec_.VP8()->tl_factory->Create(
-                i, codec_.simulcastStream[i].numberOfTemporalLayers, 0)));
-      }
-    }
-  }
-
-  virtual std::unique_ptr<TemporalLayersFactory> GetTlFactory() {
-    return std::unique_ptr<TemporalLayersFactory>(new TemporalLayersFactory());
-  }
-
-  BitrateAllocation GetAllocation(uint32_t target_bitrate) {
-    return allocator_->GetAllocation(target_bitrate * 1000U, kDefaultFrameRate);
-  }
-
- protected:
-  static const int kDefaultFrameRate = 30;
-  VideoCodec codec_;
-  std::unique_ptr<SimulcastRateAllocator> allocator_;
-  std::vector<std::unique_ptr<TemporalLayers>> tl_factories_;
-};
-
-TEST_F(SimulcastRateAllocatorTest, NoSimulcastBelowMin) {
-  uint32_t expected[] = {codec_.minBitrate};
-  ExpectEqual(expected, GetAllocation(codec_.minBitrate - 1));
-  ExpectEqual(expected, GetAllocation(1));
-  ExpectEqual(expected, GetAllocation(0));
-}
-
-TEST_F(SimulcastRateAllocatorTest, NoSimulcastAboveMax) {
-  uint32_t expected[] = {codec_.maxBitrate};
-  ExpectEqual(expected, GetAllocation(codec_.maxBitrate + 1));
-  ExpectEqual(expected, GetAllocation(std::numeric_limits<uint32_t>::max()));
-}
-
-TEST_F(SimulcastRateAllocatorTest, NoSimulcastNoMax) {
-  const uint32_t kMax = BitrateAllocation::kMaxBitrateBps / 1000;
-  codec_.maxBitrate = 0;
-  CreateAllocator();
-
-  uint32_t expected[] = {kMax};
-  ExpectEqual(expected, GetAllocation(kMax));
-}
-
-TEST_F(SimulcastRateAllocatorTest, NoSimulcastWithinLimits) {
-  for (uint32_t bitrate = codec_.minBitrate; bitrate <= codec_.maxBitrate;
-       ++bitrate) {
-    uint32_t expected[] = {bitrate};
-    ExpectEqual(expected, GetAllocation(bitrate));
-  }
-}
-
-TEST_F(SimulcastRateAllocatorTest, SingleSimulcastBelowMin) {
-  // With simulcast, use the min bitrate from the ss spec instead of the global.
-  codec_.numberOfSimulcastStreams = 1;
-  const uint32_t kMin = codec_.minBitrate - 10;
-  codec_.simulcastStream[0].minBitrate = kMin;
-  codec_.simulcastStream[0].targetBitrate = kTargetBitrateKbps;
-  CreateAllocator();
-
-  uint32_t expected[] = {kMin};
-  ExpectEqual(expected, GetAllocation(kMin - 1));
-  ExpectEqual(expected, GetAllocation(1));
-  ExpectEqual(expected, GetAllocation(0));
-}
-
-TEST_F(SimulcastRateAllocatorTest, SingleSimulcastAboveMax) {
-  codec_.numberOfSimulcastStreams = 1;
-  codec_.simulcastStream[0].minBitrate = kMinBitrateKbps;
-  const uint32_t kMax = codec_.simulcastStream[0].maxBitrate + 1000;
-  codec_.simulcastStream[0].maxBitrate = kMax;
-  CreateAllocator();
-
-  uint32_t expected[] = {kMax};
-  ExpectEqual(expected, GetAllocation(kMax));
-  ExpectEqual(expected, GetAllocation(kMax + 1));
-  ExpectEqual(expected, GetAllocation(std::numeric_limits<uint32_t>::max()));
-}
-
-TEST_F(SimulcastRateAllocatorTest, SingleSimulcastWithinLimits) {
-  codec_.numberOfSimulcastStreams = 1;
-  codec_.simulcastStream[0].minBitrate = kMinBitrateKbps;
-  codec_.simulcastStream[0].targetBitrate = kTargetBitrateKbps;
-  codec_.simulcastStream[0].maxBitrate = kMaxBitrateKbps;
-  CreateAllocator();
-
-  for (uint32_t bitrate = kMinBitrateKbps; bitrate <= kMaxBitrateKbps;
-       ++bitrate) {
-    uint32_t expected[] = {bitrate};
-    ExpectEqual(expected, GetAllocation(bitrate));
-  }
-}
-
-TEST_F(SimulcastRateAllocatorTest, OneToThreeStreams) {
-  codec_.numberOfSimulcastStreams = 3;
-  codec_.maxBitrate = 0;
-  codec_.simulcastStream[0].minBitrate = 10;
-  codec_.simulcastStream[0].targetBitrate = 100;
-  codec_.simulcastStream[0].maxBitrate = 500;
-  codec_.simulcastStream[1].minBitrate = 50;
-  codec_.simulcastStream[1].targetBitrate = 500;
-  codec_.simulcastStream[1].maxBitrate = 1000;
-  codec_.simulcastStream[2].minBitrate = 2000;
-  codec_.simulcastStream[2].targetBitrate = 3000;
-  codec_.simulcastStream[2].maxBitrate = 4000;
-  CreateAllocator();
-
-  {
-    // Single stream, min bitrate.
-    const uint32_t bitrate = codec_.simulcastStream[0].minBitrate;
-    uint32_t expected[] = {bitrate, 0, 0};
-    ExpectEqual(expected, GetAllocation(bitrate));
-  }
-
-  {
-    // Single stream at target bitrate.
-    const uint32_t bitrate = codec_.simulcastStream[0].targetBitrate;
-    uint32_t expected[] = {bitrate, 0, 0};
-    ExpectEqual(expected, GetAllocation(bitrate));
-  }
-
-  {
-    // Bitrate above target for first stream, but below min for the next one.
-    const uint32_t bitrate = codec_.simulcastStream[0].targetBitrate +
-                             codec_.simulcastStream[1].minBitrate - 1;
-    uint32_t expected[] = {bitrate, 0, 0};
-    ExpectEqual(expected, GetAllocation(bitrate));
-  }
-
-  {
-    // Just enough for two streams.
-    const uint32_t bitrate = codec_.simulcastStream[0].targetBitrate +
-                             codec_.simulcastStream[1].minBitrate;
-    uint32_t expected[] = {codec_.simulcastStream[0].targetBitrate,
-                           codec_.simulcastStream[1].minBitrate, 0};
-    ExpectEqual(expected, GetAllocation(bitrate));
-  }
-
-  {
-    // Second stream maxed out, but not enough for third.
-    const uint32_t bitrate = codec_.simulcastStream[0].targetBitrate +
-                             codec_.simulcastStream[1].maxBitrate;
-    uint32_t expected[] = {codec_.simulcastStream[0].targetBitrate,
-                           codec_.simulcastStream[1].maxBitrate, 0};
-    ExpectEqual(expected, GetAllocation(bitrate));
-  }
-
-  {
-    // First two streams maxed out, but not enough for third. Nowhere to put
-    // remaining bits.
-    const uint32_t bitrate = codec_.simulcastStream[0].maxBitrate +
-                             codec_.simulcastStream[1].maxBitrate + 499;
-    uint32_t expected[] = {codec_.simulcastStream[0].targetBitrate,
-                           codec_.simulcastStream[1].maxBitrate, 0};
-    ExpectEqual(expected, GetAllocation(bitrate));
-  }
-
-  {
-    // Just enough for all three streams.
-    const uint32_t bitrate = codec_.simulcastStream[0].targetBitrate +
-                             codec_.simulcastStream[1].targetBitrate +
-                             codec_.simulcastStream[2].minBitrate;
-    uint32_t expected[] = {codec_.simulcastStream[0].targetBitrate,
-                           codec_.simulcastStream[1].targetBitrate,
-                           codec_.simulcastStream[2].minBitrate};
-    ExpectEqual(expected, GetAllocation(bitrate));
-  }
-
-  {
-    // Third maxed out.
-    const uint32_t bitrate = codec_.simulcastStream[0].targetBitrate +
-                             codec_.simulcastStream[1].targetBitrate +
-                             codec_.simulcastStream[2].maxBitrate;
-    uint32_t expected[] = {codec_.simulcastStream[0].targetBitrate,
-                           codec_.simulcastStream[1].targetBitrate,
-                           codec_.simulcastStream[2].maxBitrate};
-    ExpectEqual(expected, GetAllocation(bitrate));
-  }
-}
-
-TEST_F(SimulcastRateAllocatorTest, GetPreferredBitrateBps) {
-  MockTemporalLayers mock_layers;
-  allocator_.reset(new SimulcastRateAllocator(codec_, nullptr));
-  allocator_->OnTemporalLayersCreated(0, &mock_layers);
-  EXPECT_CALL(mock_layers, OnRatesUpdated(_, _, _)).Times(0);
-  EXPECT_EQ(codec_.maxBitrate * 1000,
-            allocator_->GetPreferredBitrateBps(codec_.maxFramerate));
-}
-
-TEST_F(SimulcastRateAllocatorTest, GetPreferredBitrateSimulcast) {
-  codec_.numberOfSimulcastStreams = 3;
-  codec_.maxBitrate = 999999;
-  codec_.simulcastStream[0].minBitrate = 10;
-  codec_.simulcastStream[0].targetBitrate = 100;
-
-  codec_.simulcastStream[0].maxBitrate = 500;
-  codec_.simulcastStream[1].minBitrate = 50;
-  codec_.simulcastStream[1].targetBitrate = 500;
-  codec_.simulcastStream[1].maxBitrate = 1000;
-
-  codec_.simulcastStream[2].minBitrate = 2000;
-  codec_.simulcastStream[2].targetBitrate = 3000;
-  codec_.simulcastStream[2].maxBitrate = 4000;
-  CreateAllocator();
-
-  uint32_t preferred_bitrate_kbps;
-  preferred_bitrate_kbps = codec_.simulcastStream[0].targetBitrate;
-  preferred_bitrate_kbps += codec_.simulcastStream[1].targetBitrate;
-  preferred_bitrate_kbps += codec_.simulcastStream[2].maxBitrate;
-
-  EXPECT_EQ(preferred_bitrate_kbps * 1000,
-            allocator_->GetPreferredBitrateBps(codec_.maxFramerate));
-}
-
-class ScreenshareRateAllocationTest : public SimulcastRateAllocatorTest {
- public:
-  void SetupConferenceScreenshare(bool use_simulcast) {
-    codec_.mode = VideoCodecMode::kScreensharing;
-    codec_.minBitrate = kMinBitrateKbps;
-    codec_.maxBitrate = kMaxBitrateKbps;
-    if (use_simulcast) {
-      codec_.numberOfSimulcastStreams = 1;
-      codec_.simulcastStream[0].minBitrate = kMinBitrateKbps;
-      codec_.simulcastStream[0].targetBitrate = kTargetBitrateKbps;
-      codec_.simulcastStream[0].maxBitrate = kMaxBitrateKbps;
-      codec_.simulcastStream[0].numberOfTemporalLayers = 2;
-    } else {
-      codec_.numberOfSimulcastStreams = 0;
-      codec_.targetBitrate = kTargetBitrateKbps;
-      codec_.VP8()->numberOfTemporalLayers = 2;
-    }
-  }
-
-  std::unique_ptr<TemporalLayersFactory> GetTlFactory() override {
-    return std::unique_ptr<TemporalLayersFactory>(
-        new ScreenshareTemporalLayersFactory());
-  }
-};
-
-INSTANTIATE_TEST_CASE_P(ScreenshareTest,
-                        ScreenshareRateAllocationTest,
-                        ::testing::Bool());
-
-TEST_P(ScreenshareRateAllocationTest, BitrateBelowTl0) {
-  SetupConferenceScreenshare(GetParam());
-  CreateAllocator();
-
-  BitrateAllocation allocation =
-      allocator_->GetAllocation(kTargetBitrateKbps * 1000, kFramerateFps);
-
-  // All allocation should go in TL0.
-  EXPECT_EQ(kTargetBitrateKbps, allocation.get_sum_kbps());
-  EXPECT_EQ(kTargetBitrateKbps, allocation.GetBitrate(0, 0) / 1000);
-}
-
-TEST_P(ScreenshareRateAllocationTest, BitrateAboveTl0) {
-  SetupConferenceScreenshare(GetParam());
-  CreateAllocator();
-
-  uint32_t target_bitrate_kbps = (kTargetBitrateKbps + kMaxBitrateKbps) / 2;
-  BitrateAllocation allocation =
-      allocator_->GetAllocation(target_bitrate_kbps * 1000, kFramerateFps);
-
-  // Fill TL0, then put the rest in TL1.
-  EXPECT_EQ(target_bitrate_kbps, allocation.get_sum_kbps());
-  EXPECT_EQ(kTargetBitrateKbps, allocation.GetBitrate(0, 0) / 1000);
-  EXPECT_EQ(target_bitrate_kbps - kTargetBitrateKbps,
-            allocation.GetBitrate(0, 1) / 1000);
-}
-
-TEST_P(ScreenshareRateAllocationTest, BitrateAboveTl1) {
-  SetupConferenceScreenshare(GetParam());
-  CreateAllocator();
-
-  BitrateAllocation allocation =
-      allocator_->GetAllocation(kMaxBitrateKbps * 2000, kFramerateFps);
-
-  // Fill both TL0 and TL1, but no more.
-  EXPECT_EQ(kMaxBitrateKbps, allocation.get_sum_kbps());
-  EXPECT_EQ(kTargetBitrateKbps, allocation.GetBitrate(0, 0) / 1000);
-  EXPECT_EQ(kMaxBitrateKbps - kTargetBitrateKbps,
-            allocation.GetBitrate(0, 1) / 1000);
-}
-
-}  // namespace webrtc
diff --git a/modules/video_coding/utility/vp8_header_parser.cc b/modules/video_coding/utility/vp8_header_parser.cc
deleted file mode 100644
index 78ae69c..0000000
--- a/modules/video_coding/utility/vp8_header_parser.cc
+++ /dev/null
@@ -1,205 +0,0 @@
-/*
- *  Copyright (c) 2015 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/video_coding/utility/vp8_header_parser.h"
-
-#include "webrtc/rtc_base/logging.h"
-
-namespace webrtc {
-
-namespace vp8 {
-namespace {
-const size_t kCommonPayloadHeaderLength = 3;
-const size_t kKeyPayloadHeaderLength = 10;
-}  // namespace
-
-static uint32_t BSwap32(uint32_t x) {
-  return (x >> 24) | ((x >> 8) & 0xff00) | ((x << 8) & 0xff0000) | (x << 24);
-}
-
-static void VP8LoadFinalBytes(VP8BitReader* const br) {
-  // Only read 8bits at a time.
-  if (br->buf_ < br->buf_end_) {
-    br->bits_ += 8;
-    br->value_ = static_cast<uint32_t>(*br->buf_++) | (br->value_ << 8);
-  } else if (!br->eof_) {
-    br->value_ <<= 8;
-    br->bits_ += 8;
-    br->eof_ = 1;
-  }
-}
-
-static void VP8LoadNewBytes(VP8BitReader* const br) {
-  int BITS = 24;
-  // Read 'BITS' bits at a time.
-  if (br->buf_ + sizeof(uint32_t) <= br->buf_end_) {
-    uint32_t bits;
-    const uint32_t in_bits = *(const uint32_t*)(br->buf_);
-    br->buf_ += BITS >> 3;
-#if defined(WEBRTC_ARCH_BIG_ENDIAN)
-    bits = static_cast<uint32_t>(in_bits);
-    if (BITS != 8 * sizeof(uint32_t))
-      bits >>= (8 * sizeof(uint32_t) - BITS);
-#else
-    bits = BSwap32(in_bits);
-    bits >>= 32 - BITS;
-#endif
-    br->value_ = bits | (br->value_ << BITS);
-    br->bits_ += BITS;
-  } else {
-    VP8LoadFinalBytes(br);
-  }
-}
-
-static void VP8InitBitReader(VP8BitReader* const br,
-                             const uint8_t* const start,
-                             const uint8_t* const end) {
-  br->range_ = 255 - 1;
-  br->buf_ = start;
-  br->buf_end_ = end;
-  br->value_ = 0;
-  br->bits_ = -8;  // To load the very first 8bits.
-  br->eof_ = 0;
-  VP8LoadNewBytes(br);
-}
-
-// Read a bit with proba 'prob'.
-static int VP8GetBit(VP8BitReader* const br, int prob) {
-  uint8_t range = br->range_;
-  if (br->bits_ < 0) {
-    VP8LoadNewBytes(br);
-    if (br->eof_)
-      return 0;
-  }
-  const int pos = br->bits_;
-  const uint8_t split = (range * prob) >> 8;
-  const uint8_t value = static_cast<uint8_t>(br->value_ >> pos);
-  int bit;
-  if (value > split) {
-    range -= split + 1;
-    br->value_ -= static_cast<uint32_t>(split + 1) << pos;
-    bit = 1;
-  } else {
-    range = split;
-    bit = 0;
-  }
-  if (range <= static_cast<uint8_t>(0x7e)) {
-    const int shift = kVP8Log2Range[range];
-    range = kVP8NewRange[range];
-    br->bits_ -= shift;
-  }
-  br->range_ = range;
-  return bit;
-}
-
-static uint32_t VP8GetValue(VP8BitReader* const br, int bits) {
-  uint32_t v = 0;
-  while (bits-- > 0) {
-    v |= VP8GetBit(br, 0x80) << bits;
-  }
-  return v;
-}
-
-static uint32_t VP8Get(VP8BitReader* const br) {
-  return VP8GetValue(br, 1);
-}
-
-static int32_t VP8GetSignedValue(VP8BitReader* const br, int bits) {
-  const int value = VP8GetValue(br, bits);
-  return VP8Get(br) ? -value : value;
-}
-
-static void ParseSegmentHeader(VP8BitReader* br) {
-  int use_segment = VP8Get(br);
-  if (use_segment) {
-    int update_map = VP8Get(br);
-    if (VP8Get(br)) {
-      int s;
-      VP8Get(br);
-      for (s = 0; s < NUM_MB_SEGMENTS; ++s) {
-        VP8Get(br) ? VP8GetSignedValue(br, 7) : 0;
-      }
-      for (s = 0; s < NUM_MB_SEGMENTS; ++s) {
-        VP8Get(br) ? VP8GetSignedValue(br, 6) : 0;
-      }
-    }
-    if (update_map) {
-      int s;
-      for (s = 0; s < MB_FEATURE_TREE_PROBS; ++s) {
-        VP8Get(br) ? VP8GetValue(br, 8) : 255;
-      }
-    }
-  }
-}
-
-static void ParseFilterHeader(VP8BitReader* br) {
-  VP8Get(br);
-  VP8GetValue(br, 6);
-  VP8GetValue(br, 3);
-  int use_lf_delta = VP8Get(br);
-  if (use_lf_delta) {
-    if (VP8Get(br)) {
-      int i;
-      for (i = 0; i < NUM_REF_LF_DELTAS; ++i) {
-        if (VP8Get(br)) {
-          VP8GetSignedValue(br, 6);
-        }
-      }
-      for (i = 0; i < NUM_MODE_LF_DELTAS; ++i) {
-        if (VP8Get(br)) {
-          VP8GetSignedValue(br, 6);
-        }
-      }
-    }
-  }
-}
-
-bool GetQp(const uint8_t* buf, size_t length, int* qp) {
-  if (length < kCommonPayloadHeaderLength) {
-    LOG(LS_WARNING) << "Failed to get QP, invalid length.";
-    return false;
-  }
-  VP8BitReader br;
-  const uint32_t bits = buf[0] | (buf[1] << 8) | (buf[2] << 16);
-  int key_frame = !(bits & 1);
-  // Size of first partition in bytes.
-  uint32_t partition_length = (bits >> 5);
-  size_t header_length = kCommonPayloadHeaderLength;
-  if (key_frame) {
-    header_length = kKeyPayloadHeaderLength;
-  }
-  if (header_length + partition_length > length) {
-    LOG(LS_WARNING) << "Failed to get QP, invalid length: " << length;
-    return false;
-  }
-  buf += header_length;
-
-  VP8InitBitReader(&br, buf, buf + partition_length);
-  if (key_frame) {
-    // Color space and pixel type.
-    VP8Get(&br);
-    VP8Get(&br);
-  }
-  ParseSegmentHeader(&br);
-  ParseFilterHeader(&br);
-  // Number of coefficient data partitions.
-  VP8GetValue(&br, 2);
-  // Base QP.
-  const int base_q0 = VP8GetValue(&br, 7);
-  if (br.eof_ == 1) {
-    LOG(LS_WARNING) << "Failed to get QP, end of file reached.";
-    return false;
-  }
-  *qp = base_q0;
-  return true;
-}
-
-}  // namespace vp8
-
-}  // namespace webrtc
diff --git a/modules/video_coding/utility/vp8_header_parser.h b/modules/video_coding/utility/vp8_header_parser.h
deleted file mode 100644
index b0c684c..0000000
--- a/modules/video_coding/utility/vp8_header_parser.h
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- *  Copyright (c) 2015 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_VIDEO_CODING_UTILITY_VP8_HEADER_PARSER_H_
-#define WEBRTC_MODULES_VIDEO_CODING_UTILITY_VP8_HEADER_PARSER_H_
-
-#include <stdint.h>
-#include <stdio.h>
-
-namespace webrtc {
-
-namespace vp8 {
-
-enum {
-  MB_FEATURE_TREE_PROBS = 3,
-  NUM_MB_SEGMENTS = 4,
-  NUM_REF_LF_DELTAS = 4,
-  NUM_MODE_LF_DELTAS = 4,
-};
-
-typedef struct VP8BitReader VP8BitReader;
-struct VP8BitReader {
-  // Boolean decoder.
-  uint32_t value_;  // Current value.
-  uint32_t range_;  // Current range minus 1. In [127, 254] interval.
-  int bits_;        // Number of valid bits left.
-  // Read buffer.
-  const uint8_t* buf_;      // Next byte to be read.
-  const uint8_t* buf_end_;  // End of read buffer.
-  int eof_;                 // True if input is exhausted.
-};
-
-const uint8_t kVP8Log2Range[128] = {
-    7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3,
-    3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0};
-
-// range = ((range - 1) << kVP8Log2Range[range]) + 1
-const uint8_t kVP8NewRange[128] = {
-    127, 127, 191, 127, 159, 191, 223, 127, 143, 159, 175, 191, 207, 223, 239,
-    127, 135, 143, 151, 159, 167, 175, 183, 191, 199, 207, 215, 223, 231, 239,
-    247, 127, 131, 135, 139, 143, 147, 151, 155, 159, 163, 167, 171, 175, 179,
-    183, 187, 191, 195, 199, 203, 207, 211, 215, 219, 223, 227, 231, 235, 239,
-    243, 247, 251, 127, 129, 131, 133, 135, 137, 139, 141, 143, 145, 147, 149,
-    151, 153, 155, 157, 159, 161, 163, 165, 167, 169, 171, 173, 175, 177, 179,
-    181, 183, 185, 187, 189, 191, 193, 195, 197, 199, 201, 203, 205, 207, 209,
-    211, 213, 215, 217, 219, 221, 223, 225, 227, 229, 231, 233, 235, 237, 239,
-    241, 243, 245, 247, 249, 251, 253, 127};
-
-// Gets the QP, QP range: [0, 127].
-// Returns true on success, false otherwise.
-bool GetQp(const uint8_t* buf, size_t length, int* qp);
-
-}  // namespace vp8
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_VIDEO_CODING_UTILITY_VP8_HEADER_PARSER_H_
diff --git a/modules/video_coding/utility/vp9_uncompressed_header_parser.cc b/modules/video_coding/utility/vp9_uncompressed_header_parser.cc
deleted file mode 100644
index 301ed34..0000000
--- a/modules/video_coding/utility/vp9_uncompressed_header_parser.cc
+++ /dev/null
@@ -1,272 +0,0 @@
-/*
- *  Copyright (c) 2017 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/video_coding/utility/vp9_uncompressed_header_parser.h"
-
-#include "webrtc/rtc_base/bitbuffer.h"
-#include "webrtc/rtc_base/logging.h"
-
-namespace webrtc {
-
-#define RETURN_FALSE_IF_ERROR(x) \
-  if (!(x)) {                    \
-    return false;                \
-  }
-
-namespace vp9 {
-namespace {
-const size_t kVp9NumRefsPerFrame = 3;
-const size_t kVp9MaxRefLFDeltas = 4;
-const size_t kVp9MaxModeLFDeltas = 2;
-
-bool Vp9ReadProfile(rtc::BitBuffer* br, uint8_t* profile) {
-  uint32_t high_bit;
-  uint32_t low_bit;
-  RETURN_FALSE_IF_ERROR(br->ReadBits(&low_bit, 1));
-  RETURN_FALSE_IF_ERROR(br->ReadBits(&high_bit, 1));
-  *profile = (high_bit << 1) + low_bit;
-  if (*profile > 2) {
-    uint32_t reserved_bit;
-    RETURN_FALSE_IF_ERROR(br->ReadBits(&reserved_bit, 1));
-    if (reserved_bit) {
-      LOG(LS_WARNING) << "Failed to get QP. Unsupported bitstream profile.";
-      return false;
-    }
-  }
-  return true;
-}
-
-bool Vp9ReadSyncCode(rtc::BitBuffer* br) {
-  uint32_t sync_code;
-  RETURN_FALSE_IF_ERROR(br->ReadBits(&sync_code, 24));
-  if (sync_code != 0x498342) {
-    LOG(LS_WARNING) << "Failed to get QP. Invalid sync code.";
-    return false;
-  }
-  return true;
-}
-
-bool Vp9ReadColorConfig(rtc::BitBuffer* br, uint8_t profile) {
-  if (profile == 2 || profile == 3) {
-    // Bitdepth.
-    RETURN_FALSE_IF_ERROR(br->ConsumeBits(1));
-  }
-  uint32_t color_space;
-  RETURN_FALSE_IF_ERROR(br->ReadBits(&color_space, 3));
-
-  // SRGB is 7.
-  if (color_space != 7) {
-    // YUV range flag.
-    RETURN_FALSE_IF_ERROR(br->ConsumeBits(1));
-    if (profile == 1 || profile == 3) {
-      // 1 bit: subsampling x.
-      // 1 bit: subsampling y.
-      RETURN_FALSE_IF_ERROR(br->ConsumeBits(2));
-      uint32_t reserved_bit;
-      RETURN_FALSE_IF_ERROR(br->ReadBits(&reserved_bit, 1));
-      if (reserved_bit) {
-        LOG(LS_WARNING) << "Failed to get QP. Reserved bit set.";
-        return false;
-      }
-    }
-  } else {
-    if (profile == 1 || profile == 3) {
-      uint32_t reserved_bit;
-      RETURN_FALSE_IF_ERROR(br->ReadBits(&reserved_bit, 1));
-      if (reserved_bit) {
-        LOG(LS_WARNING) << "Failed to get QP. Reserved bit set.";
-        return false;
-      }
-    } else {
-      LOG(LS_WARNING) << "Failed to get QP. 4:4:4 color not supported in "
-                         "profile 0 or 2.";
-      return false;
-    }
-  }
-
-  return true;
-}
-
-bool Vp9ReadFrameSize(rtc::BitBuffer* br) {
-  // 2 bytes: frame width.
-  // 2 bytes: frame height.
-  return br->ConsumeBytes(4);
-}
-
-bool Vp9ReadRenderSize(rtc::BitBuffer* br) {
-  uint32_t bit;
-  RETURN_FALSE_IF_ERROR(br->ReadBits(&bit, 1));
-  if (bit) {
-    // 2 bytes: render width.
-    // 2 bytes: render height.
-    RETURN_FALSE_IF_ERROR(br->ConsumeBytes(4));
-  }
-  return true;
-}
-
-bool Vp9ReadFrameSizeFromRefs(rtc::BitBuffer* br) {
-  uint32_t found_ref = 0;
-  for (size_t i = 0; i < kVp9NumRefsPerFrame; i++) {
-    // Size in refs.
-    RETURN_FALSE_IF_ERROR(br->ReadBits(&found_ref, 1));
-    if (found_ref)
-      break;
-  }
-
-  if (!found_ref) {
-    if (!Vp9ReadFrameSize(br)) {
-      return false;
-    }
-  }
-  return Vp9ReadRenderSize(br);
-}
-
-bool Vp9ReadInterpolationFilter(rtc::BitBuffer* br) {
-  uint32_t bit;
-  RETURN_FALSE_IF_ERROR(br->ReadBits(&bit, 1));
-  if (bit)
-    return true;
-
-  return br->ConsumeBits(2);
-}
-
-bool Vp9ReadLoopfilter(rtc::BitBuffer* br) {
-  // 6 bits: filter level.
-  // 3 bits: sharpness level.
-  RETURN_FALSE_IF_ERROR(br->ConsumeBits(9));
-
-  uint32_t mode_ref_delta_enabled;
-  RETURN_FALSE_IF_ERROR(br->ReadBits(&mode_ref_delta_enabled, 1));
-  if (mode_ref_delta_enabled) {
-    uint32_t mode_ref_delta_update;
-    RETURN_FALSE_IF_ERROR(br->ReadBits(&mode_ref_delta_update, 1));
-    if (mode_ref_delta_update) {
-      uint32_t bit;
-      for (size_t i = 0; i < kVp9MaxRefLFDeltas; i++) {
-        RETURN_FALSE_IF_ERROR(br->ReadBits(&bit, 1));
-        if (bit) {
-          RETURN_FALSE_IF_ERROR(br->ConsumeBits(7));
-        }
-      }
-      for (size_t i = 0; i < kVp9MaxModeLFDeltas; i++) {
-        RETURN_FALSE_IF_ERROR(br->ReadBits(&bit, 1));
-        if (bit) {
-          RETURN_FALSE_IF_ERROR(br->ConsumeBits(7));
-        }
-      }
-    }
-  }
-  return true;
-}
-}  // namespace
-
-bool GetQp(const uint8_t* buf, size_t length, int* qp) {
-  rtc::BitBuffer br(buf, length);
-
-  // Frame marker.
-  uint32_t frame_marker;
-  RETURN_FALSE_IF_ERROR(br.ReadBits(&frame_marker, 2));
-  if (frame_marker != 0x2) {
-    LOG(LS_WARNING) << "Failed to get QP. Frame marker should be 2.";
-    return false;
-  }
-
-  // Profile.
-  uint8_t profile;
-  if (!Vp9ReadProfile(&br, &profile))
-    return false;
-
-  // Show existing frame.
-  uint32_t show_existing_frame;
-  RETURN_FALSE_IF_ERROR(br.ReadBits(&show_existing_frame, 1));
-  if (show_existing_frame)
-    return false;
-
-  // Frame type: KEY_FRAME(0), INTER_FRAME(1).
-  uint32_t frame_type;
-  uint32_t show_frame;
-  uint32_t error_resilient;
-  RETURN_FALSE_IF_ERROR(br.ReadBits(&frame_type, 1));
-  RETURN_FALSE_IF_ERROR(br.ReadBits(&show_frame, 1));
-  RETURN_FALSE_IF_ERROR(br.ReadBits(&error_resilient, 1));
-
-  if (!frame_type) {
-    if (!Vp9ReadSyncCode(&br))
-      return false;
-    if (!Vp9ReadColorConfig(&br, profile))
-      return false;
-    if (!Vp9ReadFrameSize(&br))
-      return false;
-    if (!Vp9ReadRenderSize(&br))
-      return false;
-
-  } else {
-    uint32_t intra_only = 0;
-    if (!show_frame)
-      RETURN_FALSE_IF_ERROR(br.ReadBits(&intra_only, 1));
-    if (!error_resilient)
-      RETURN_FALSE_IF_ERROR(br.ConsumeBits(2));  // Reset frame context.
-
-    if (intra_only) {
-      if (!Vp9ReadSyncCode(&br))
-        return false;
-
-      if (profile > 0) {
-        if (!Vp9ReadColorConfig(&br, profile))
-          return false;
-      }
-      // Refresh frame flags.
-      RETURN_FALSE_IF_ERROR(br.ConsumeBits(8));
-      if (!Vp9ReadFrameSize(&br))
-        return false;
-      if (!Vp9ReadRenderSize(&br))
-        return false;
-    } else {
-      // Refresh frame flags.
-      RETURN_FALSE_IF_ERROR(br.ConsumeBits(8));
-
-      for (size_t i = 0; i < kVp9NumRefsPerFrame; i++) {
-        // 3 bits: Ref frame index.
-        // 1 bit: Ref frame sign biases.
-        RETURN_FALSE_IF_ERROR(br.ConsumeBits(4));
-      }
-
-      if (!Vp9ReadFrameSizeFromRefs(&br))
-        return false;
-
-      // Allow high precision mv.
-      RETURN_FALSE_IF_ERROR(br.ConsumeBits(1));
-      // Interpolation filter.
-      if (!Vp9ReadInterpolationFilter(&br))
-        return false;
-    }
-  }
-
-  if (!error_resilient) {
-    // 1 bit: Refresh frame context.
-    // 1 bit: Frame parallel decoding mode.
-    RETURN_FALSE_IF_ERROR(br.ConsumeBits(2));
-  }
-
-  // Frame context index.
-  RETURN_FALSE_IF_ERROR(br.ConsumeBits(2));
-
-  if (!Vp9ReadLoopfilter(&br))
-    return false;
-
-  // Base QP.
-  uint8_t base_q0;
-  RETURN_FALSE_IF_ERROR(br.ReadUInt8(&base_q0));
-  *qp = base_q0;
-  return true;
-}
-
-}  // namespace vp9
-
-}  // namespace webrtc
diff --git a/modules/video_coding/utility/vp9_uncompressed_header_parser.h b/modules/video_coding/utility/vp9_uncompressed_header_parser.h
deleted file mode 100644
index f529a66..0000000
--- a/modules/video_coding/utility/vp9_uncompressed_header_parser.h
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- *  Copyright (c) 2017 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_VIDEO_CODING_UTILITY_VP9_UNCOMPRESSED_HEADER_PARSER_H_
-#define WEBRTC_MODULES_VIDEO_CODING_UTILITY_VP9_UNCOMPRESSED_HEADER_PARSER_H_
-
-#include <stddef.h>
-#include <stdint.h>
-
-namespace webrtc {
-
-namespace vp9 {
-
-// Gets the QP, QP range: [0, 255].
-// Returns true on success, false otherwise.
-bool GetQp(const uint8_t* buf, size_t length, int* qp);
-
-}  // namespace vp9
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_VIDEO_CODING_UTILITY_VP9_UNCOMPRESSED_HEADER_PARSER_H_
diff --git a/modules/video_coding/video_codec_initializer.cc b/modules/video_coding/video_codec_initializer.cc
deleted file mode 100644
index d274bf1..0000000
--- a/modules/video_coding/video_codec_initializer.cc
+++ /dev/null
@@ -1,244 +0,0 @@
-/*
- *  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/video_coding/include/video_codec_initializer.h"
-
-#include "webrtc/common_types.h"
-#include "webrtc/common_video/include/video_bitrate_allocator.h"
-#include "webrtc/modules/video_coding/codecs/vp8/screenshare_layers.h"
-#include "webrtc/modules/video_coding/codecs/vp8/simulcast_rate_allocator.h"
-#include "webrtc/modules/video_coding/codecs/vp8/temporal_layers.h"
-#include "webrtc/modules/video_coding/include/video_coding_defines.h"
-#include "webrtc/modules/video_coding/utility/default_video_bitrate_allocator.h"
-#include "webrtc/rtc_base/basictypes.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/system_wrappers/include/clock.h"
-
-namespace webrtc {
-namespace {
-bool TemporalLayersConfigured(const std::vector<VideoStream>& streams) {
-  for (const VideoStream& stream : streams) {
-    if (stream.temporal_layer_thresholds_bps.size() > 0)
-      return true;
-  }
-  return false;
-}
-}  // namespace
-
-bool VideoCodecInitializer::SetupCodec(
-    const VideoEncoderConfig& config,
-    const VideoSendStream::Config::EncoderSettings settings,
-    const std::vector<VideoStream>& streams,
-    bool nack_enabled,
-    VideoCodec* codec,
-    std::unique_ptr<VideoBitrateAllocator>* bitrate_allocator) {
-  *codec =
-      VideoEncoderConfigToVideoCodec(config, streams, settings.payload_name,
-                                     settings.payload_type, nack_enabled);
-
-  std::unique_ptr<TemporalLayersFactory> tl_factory;
-  switch (codec->codecType) {
-    case kVideoCodecVP8: {
-      if (!codec->VP8()->tl_factory) {
-        if (codec->mode == kScreensharing &&
-            (codec->numberOfSimulcastStreams > 1 ||
-             (codec->numberOfSimulcastStreams == 1 &&
-              codec->VP8()->numberOfTemporalLayers == 2))) {
-          // Conference mode temporal layering for screen content.
-          tl_factory.reset(new ScreenshareTemporalLayersFactory());
-        } else {
-          // Standard video temporal layers.
-          tl_factory.reset(new TemporalLayersFactory());
-        }
-        codec->VP8()->tl_factory = tl_factory.get();
-      }
-      break;
-    }
-    default: {
-      // TODO(sprang): Warn, once we have specific allocators for all supported
-      //               codec types.
-      break;
-    }
-  }
-  *bitrate_allocator = CreateBitrateAllocator(*codec, std::move(tl_factory));
-
-  return true;
-}
-
-std::unique_ptr<VideoBitrateAllocator>
-VideoCodecInitializer::CreateBitrateAllocator(
-    const VideoCodec& codec,
-    std::unique_ptr<TemporalLayersFactory> tl_factory) {
-  std::unique_ptr<VideoBitrateAllocator> rate_allocator;
-
-  switch (codec.codecType) {
-    case kVideoCodecVP8: {
-      // Set up default VP8 temporal layer factory, if not provided.
-      rate_allocator.reset(
-          new SimulcastRateAllocator(codec, std::move(tl_factory)));
-    } break;
-    default:
-      rate_allocator.reset(new DefaultVideoBitrateAllocator(codec));
-  }
-
-  return rate_allocator;
-}
-
-// TODO(sprang): Split this up and separate the codec specific parts.
-VideoCodec VideoCodecInitializer::VideoEncoderConfigToVideoCodec(
-    const VideoEncoderConfig& config,
-    const std::vector<VideoStream>& streams,
-    const std::string& payload_name,
-    int payload_type,
-    bool nack_enabled) {
-  static const int kEncoderMinBitrateKbps = 30;
-  RTC_DCHECK(!streams.empty());
-  RTC_DCHECK_GE(config.min_transmit_bitrate_bps, 0);
-
-  VideoCodec video_codec;
-  memset(&video_codec, 0, sizeof(video_codec));
-  video_codec.codecType = PayloadStringToCodecType(payload_name);
-
-  switch (config.content_type) {
-    case VideoEncoderConfig::ContentType::kRealtimeVideo:
-      video_codec.mode = kRealtimeVideo;
-      break;
-    case VideoEncoderConfig::ContentType::kScreen:
-      video_codec.mode = kScreensharing;
-      if (!streams.empty() &&
-          streams[0].temporal_layer_thresholds_bps.size() == 1) {
-        video_codec.targetBitrate =
-            streams[0].temporal_layer_thresholds_bps[0] / 1000;
-      }
-      break;
-  }
-
-  if (config.encoder_specific_settings)
-    config.encoder_specific_settings->FillEncoderSpecificSettings(&video_codec);
-
-  switch (video_codec.codecType) {
-    case kVideoCodecVP8: {
-      if (!config.encoder_specific_settings)
-        *video_codec.VP8() = VideoEncoder::GetDefaultVp8Settings();
-      video_codec.VP8()->numberOfTemporalLayers = static_cast<unsigned char>(
-          streams.back().temporal_layer_thresholds_bps.size() + 1);
-
-      if (nack_enabled && !TemporalLayersConfigured(streams)) {
-        LOG(LS_INFO) << "No temporal layers and nack enabled -> resilience off";
-        video_codec.VP8()->resilience = kResilienceOff;
-      }
-      break;
-    }
-    case kVideoCodecVP9: {
-      if (!config.encoder_specific_settings)
-        *video_codec.VP9() = VideoEncoder::GetDefaultVp9Settings();
-      if (video_codec.mode == kScreensharing &&
-          config.encoder_specific_settings) {
-        video_codec.VP9()->flexibleMode = true;
-        // For now VP9 screensharing use 1 temporal and 2 spatial layers.
-        RTC_DCHECK_EQ(1, video_codec.VP9()->numberOfTemporalLayers);
-        RTC_DCHECK_EQ(2, video_codec.VP9()->numberOfSpatialLayers);
-      }
-      video_codec.VP9()->numberOfTemporalLayers = static_cast<unsigned char>(
-          streams.back().temporal_layer_thresholds_bps.size() + 1);
-
-      if (nack_enabled && !TemporalLayersConfigured(streams) &&
-          video_codec.VP9()->numberOfSpatialLayers == 1) {
-        LOG(LS_INFO) << "No temporal or spatial layers and nack enabled -> "
-                     << "resilience off";
-        video_codec.VP9()->resilienceOn = false;
-      }
-      break;
-    }
-    case kVideoCodecH264: {
-      if (!config.encoder_specific_settings)
-        *video_codec.H264() = VideoEncoder::GetDefaultH264Settings();
-      break;
-    }
-    default:
-      // TODO(pbos): Support encoder_settings codec-agnostically.
-      RTC_DCHECK(!config.encoder_specific_settings)
-          << "Encoder-specific settings for codec type not wired up.";
-      break;
-  }
-
-  strncpy(video_codec.plName, payload_name.c_str(), kPayloadNameSize - 1);
-  video_codec.plName[kPayloadNameSize - 1] = '\0';
-  video_codec.plType = payload_type;
-  video_codec.numberOfSimulcastStreams =
-      static_cast<unsigned char>(streams.size());
-  video_codec.minBitrate = streams[0].min_bitrate_bps / 1000;
-  if (video_codec.minBitrate < kEncoderMinBitrateKbps)
-    video_codec.minBitrate = kEncoderMinBitrateKbps;
-  video_codec.timing_frame_thresholds = {kDefaultTimingFramesDelayMs,
-                                         kDefaultOutlierFrameSizePercent};
-  RTC_DCHECK_LE(streams.size(), kMaxSimulcastStreams);
-  if (video_codec.codecType == kVideoCodecVP9) {
-    // If the vector is empty, bitrates will be configured automatically.
-    RTC_DCHECK(config.spatial_layers.empty() ||
-               config.spatial_layers.size() ==
-                   video_codec.VP9()->numberOfSpatialLayers);
-    RTC_DCHECK_LE(video_codec.VP9()->numberOfSpatialLayers,
-                  kMaxSimulcastStreams);
-    for (size_t i = 0; i < config.spatial_layers.size(); ++i)
-      video_codec.spatialLayers[i] = config.spatial_layers[i];
-  }
-  for (size_t i = 0; i < streams.size(); ++i) {
-    SimulcastStream* sim_stream = &video_codec.simulcastStream[i];
-    RTC_DCHECK_GT(streams[i].width, 0);
-    RTC_DCHECK_GT(streams[i].height, 0);
-    RTC_DCHECK_GT(streams[i].max_framerate, 0);
-    // Different framerates not supported per stream at the moment, unless it's
-    // screenshare where there is an exception and a simulcast encoder adapter,
-    // which supports different framerates, is used instead.
-    if (config.content_type != VideoEncoderConfig::ContentType::kScreen) {
-      RTC_DCHECK_EQ(streams[i].max_framerate, streams[0].max_framerate);
-    }
-    RTC_DCHECK_GE(streams[i].min_bitrate_bps, 0);
-    RTC_DCHECK_GE(streams[i].target_bitrate_bps, streams[i].min_bitrate_bps);
-    RTC_DCHECK_GE(streams[i].max_bitrate_bps, streams[i].target_bitrate_bps);
-    RTC_DCHECK_GE(streams[i].max_qp, 0);
-
-    sim_stream->width = static_cast<uint16_t>(streams[i].width);
-    sim_stream->height = static_cast<uint16_t>(streams[i].height);
-    sim_stream->minBitrate = streams[i].min_bitrate_bps / 1000;
-    sim_stream->targetBitrate = streams[i].target_bitrate_bps / 1000;
-    sim_stream->maxBitrate = streams[i].max_bitrate_bps / 1000;
-    sim_stream->qpMax = streams[i].max_qp;
-    sim_stream->numberOfTemporalLayers = static_cast<unsigned char>(
-        streams[i].temporal_layer_thresholds_bps.size() + 1);
-
-    video_codec.width =
-        std::max(video_codec.width, static_cast<uint16_t>(streams[i].width));
-    video_codec.height =
-        std::max(video_codec.height, static_cast<uint16_t>(streams[i].height));
-    video_codec.minBitrate =
-        std::min(static_cast<uint16_t>(video_codec.minBitrate),
-                 static_cast<uint16_t>(streams[i].min_bitrate_bps / 1000));
-    video_codec.maxBitrate += streams[i].max_bitrate_bps / 1000;
-    video_codec.qpMax = std::max(video_codec.qpMax,
-                                 static_cast<unsigned int>(streams[i].max_qp));
-  }
-
-  if (video_codec.maxBitrate == 0) {
-    // Unset max bitrate -> cap to one bit per pixel.
-    video_codec.maxBitrate =
-        (video_codec.width * video_codec.height * video_codec.maxFramerate) /
-        1000;
-  }
-  if (video_codec.maxBitrate < kEncoderMinBitrateKbps)
-    video_codec.maxBitrate = kEncoderMinBitrateKbps;
-
-  RTC_DCHECK_GT(streams[0].max_framerate, 0);
-  video_codec.maxFramerate = streams[0].max_framerate;
-  return video_codec;
-}
-
-}  // namespace webrtc
diff --git a/modules/video_coding/video_codec_initializer_unittest.cc b/modules/video_coding/video_codec_initializer_unittest.cc
deleted file mode 100644
index cd269f4..0000000
--- a/modules/video_coding/video_codec_initializer_unittest.cc
+++ /dev/null
@@ -1,217 +0,0 @@
-/*
- *  Copyright (c) 2017 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/api/video_codecs/video_encoder.h"
-#include "webrtc/common_video/include/video_bitrate_allocator.h"
-#include "webrtc/common_types.h"
-#include "webrtc/modules/video_coding/codecs/vp8/temporal_layers.h"
-#include "webrtc/modules/video_coding/include/video_codec_initializer.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-namespace {
-static const char* kVp8PayloadName = "VP8";
-static const int kVp8PayloadType = 100;
-static const int kDefaultWidth = 1280;
-static const int kDefaultHeight = 720;
-static const int kDefaultFrameRate = 30;
-static const uint32_t kDefaultMinBitrateBps = 60000;
-static const uint32_t kDefaultTargetBitrateBps = 2000000;
-static const uint32_t kDefaultMaxBitrateBps = 2000000;
-static const uint32_t kDefaultMinTransmitBitrateBps = 400000;
-static const int kDefaultMaxQp = 48;
-static const uint32_t kScreenshareTl0BitrateBps = 100000;
-static const uint32_t kScreenshareCodecTargetBitrateBps = 200000;
-static const uint32_t kScreenshareDefaultFramerate = 5;
-// Bitrates for the temporal layers of the higher screenshare simulcast stream.
-static const uint32_t kHighScreenshareTl0Bps = 800000;
-static const uint32_t kHighScreenshareTl1Bps = 1200000;
-}  // namespace
-
-/*
- *   static bool SetupCodec(
-      const VideoEncoderConfig& config,
-      const VideoSendStream::Config::EncoderSettings settings,
-      const std::vector<VideoStream>& streams,
-      bool nack_enabled,
-      VideoCodec* codec,
-      std::unique_ptr<VideoBitrateAllocator>* bitrate_allocator);
-
-  // Create a bitrate allocator for the specified codec. |tl_factory| is
-  // optional, if it is populated, ownership of that instance will be
-  // transferred to the VideoBitrateAllocator instance.
-  static std::unique_ptr<VideoBitrateAllocator> CreateBitrateAllocator(
-      const VideoCodec& codec,
-      std::unique_ptr<TemporalLayersFactory> tl_factory);
- */
-
-// TODO(sprang): Extend coverage to handle the rest of the codec initializer.
-class VideoCodecInitializerTest : public ::testing::Test {
- public:
-  VideoCodecInitializerTest() : nack_enabled_(false) {}
-  virtual ~VideoCodecInitializerTest() {}
-
- protected:
-  void SetUpFor(VideoCodecType type,
-                int num_spatial_streams,
-                int num_temporal_streams,
-                bool screenshare) {
-    config_ = VideoEncoderConfig();
-    if (screenshare) {
-      config_.min_transmit_bitrate_bps = kDefaultMinTransmitBitrateBps;
-      config_.content_type = VideoEncoderConfig::ContentType::kScreen;
-    }
-
-    if (type == VideoCodecType::kVideoCodecVP8) {
-      config_.number_of_streams = num_spatial_streams;
-      VideoCodecVP8 vp8_settings = VideoEncoder::GetDefaultVp8Settings();
-      vp8_settings.numberOfTemporalLayers = num_temporal_streams;
-      config_.encoder_specific_settings = new rtc::RefCountedObject<
-          webrtc::VideoEncoderConfig::Vp8EncoderSpecificSettings>(vp8_settings);
-      settings_.payload_name = kVp8PayloadName;
-      settings_.payload_type = kVp8PayloadType;
-    } else {
-      ADD_FAILURE() << "Unexpected codec type: " << type;
-    }
-  }
-
-  bool InitializeCodec() {
-    codec_out_ = VideoCodec();
-    bitrate_allocator_out_.reset();
-    temporal_layers_.clear();
-    if (!VideoCodecInitializer::SetupCodec(config_, settings_, streams_,
-                                           nack_enabled_, &codec_out_,
-                                           &bitrate_allocator_out_)) {
-      return false;
-    }
-
-    // Make sure temporal layers instances have been created.
-    if (codec_out_.codecType == VideoCodecType::kVideoCodecVP8) {
-      if (!codec_out_.VP8()->tl_factory)
-        return false;
-
-      for (int i = 0; i < codec_out_.numberOfSimulcastStreams; ++i) {
-        temporal_layers_.emplace_back(codec_out_.VP8()->tl_factory->Create(
-            i, streams_[i].temporal_layer_thresholds_bps.size() + 1, 0));
-      }
-    }
-    return true;
-  }
-
-  VideoStream DefaultStream() {
-    VideoStream stream;
-    stream.width = kDefaultWidth;
-    stream.height = kDefaultHeight;
-    stream.max_framerate = kDefaultFrameRate;
-    stream.min_bitrate_bps = kDefaultMinBitrateBps;
-    stream.target_bitrate_bps = kDefaultTargetBitrateBps;
-    stream.max_bitrate_bps = kDefaultMaxBitrateBps;
-    stream.max_qp = kDefaultMaxQp;
-    return stream;
-  }
-
-  VideoStream DefaultScreenshareStream() {
-    VideoStream stream = DefaultStream();
-    stream.min_bitrate_bps = 30000;
-    stream.target_bitrate_bps = kScreenshareTl0BitrateBps;
-    stream.max_bitrate_bps = 1000000;
-    stream.max_framerate = kScreenshareDefaultFramerate;
-    stream.temporal_layer_thresholds_bps.push_back(kScreenshareTl0BitrateBps);
-    return stream;
-  }
-
-  // Input settings.
-  VideoEncoderConfig config_;
-  VideoSendStream::Config::EncoderSettings settings_;
-  std::vector<VideoStream> streams_;
-  bool nack_enabled_;
-
-  // Output.
-  VideoCodec codec_out_;
-  std::unique_ptr<VideoBitrateAllocator> bitrate_allocator_out_;
-  std::vector<std::unique_ptr<TemporalLayers>> temporal_layers_;
-};
-
-TEST_F(VideoCodecInitializerTest, SingleStreamVp8Screenshare) {
-  SetUpFor(VideoCodecType::kVideoCodecVP8, 1, 1, true);
-  streams_.push_back(DefaultStream());
-  EXPECT_TRUE(InitializeCodec());
-
-  BitrateAllocation bitrate_allocation = bitrate_allocator_out_->GetAllocation(
-      kDefaultTargetBitrateBps, kDefaultFrameRate);
-  EXPECT_EQ(1u, codec_out_.numberOfSimulcastStreams);
-  EXPECT_EQ(1u, codec_out_.VP8()->numberOfTemporalLayers);
-  EXPECT_EQ(kDefaultTargetBitrateBps, bitrate_allocation.get_sum_bps());
-}
-
-TEST_F(VideoCodecInitializerTest, TemporalLayeredVp8Screenshare) {
-  SetUpFor(VideoCodecType::kVideoCodecVP8, 1, 2, true);
-  streams_.push_back(DefaultScreenshareStream());
-  EXPECT_TRUE(InitializeCodec());
-
-  EXPECT_EQ(1u, codec_out_.numberOfSimulcastStreams);
-  EXPECT_EQ(2u, codec_out_.VP8()->numberOfTemporalLayers);
-  BitrateAllocation bitrate_allocation = bitrate_allocator_out_->GetAllocation(
-      kScreenshareCodecTargetBitrateBps, kScreenshareDefaultFramerate);
-  EXPECT_EQ(kScreenshareCodecTargetBitrateBps,
-            bitrate_allocation.get_sum_bps());
-  EXPECT_EQ(kScreenshareTl0BitrateBps, bitrate_allocation.GetBitrate(0, 0));
-}
-
-TEST_F(VideoCodecInitializerTest, SimlucastVp8Screenshare) {
-  SetUpFor(VideoCodecType::kVideoCodecVP8, 2, 1, true);
-  streams_.push_back(DefaultScreenshareStream());
-  VideoStream video_stream = DefaultStream();
-  video_stream.max_framerate = kScreenshareDefaultFramerate;
-  streams_.push_back(video_stream);
-  EXPECT_TRUE(InitializeCodec());
-
-  EXPECT_EQ(2u, codec_out_.numberOfSimulcastStreams);
-  EXPECT_EQ(1u, codec_out_.VP8()->numberOfTemporalLayers);
-  const uint32_t max_bitrate_bps =
-      streams_[0].target_bitrate_bps + streams_[1].max_bitrate_bps;
-  BitrateAllocation bitrate_allocation = bitrate_allocator_out_->GetAllocation(
-      max_bitrate_bps, kScreenshareDefaultFramerate);
-  EXPECT_EQ(max_bitrate_bps, bitrate_allocation.get_sum_bps());
-  EXPECT_EQ(static_cast<uint32_t>(streams_[0].target_bitrate_bps),
-            bitrate_allocation.GetSpatialLayerSum(0));
-  EXPECT_EQ(static_cast<uint32_t>(streams_[1].max_bitrate_bps),
-            bitrate_allocation.GetSpatialLayerSum(1));
-}
-
-TEST_F(VideoCodecInitializerTest, HighFpsSimlucastVp8Screenshare) {
-  // Two simulcast streams, the lower one using legacy settings (two temporal
-  // streams, 5fps), the higher one using 3 temporal streams and 30fps.
-  SetUpFor(VideoCodecType::kVideoCodecVP8, 2, 3, true);
-  streams_.push_back(DefaultScreenshareStream());
-  VideoStream video_stream = DefaultStream();
-  video_stream.temporal_layer_thresholds_bps.push_back(kHighScreenshareTl0Bps);
-  video_stream.temporal_layer_thresholds_bps.push_back(kHighScreenshareTl1Bps);
-  streams_.push_back(video_stream);
-  EXPECT_TRUE(InitializeCodec());
-
-  EXPECT_EQ(2u, codec_out_.numberOfSimulcastStreams);
-  EXPECT_EQ(3u, codec_out_.VP8()->numberOfTemporalLayers);
-  const uint32_t max_bitrate_bps =
-      streams_[0].target_bitrate_bps + streams_[1].max_bitrate_bps;
-  BitrateAllocation bitrate_allocation =
-      bitrate_allocator_out_->GetAllocation(max_bitrate_bps, kDefaultFrameRate);
-  EXPECT_EQ(max_bitrate_bps, bitrate_allocation.get_sum_bps());
-  EXPECT_EQ(static_cast<uint32_t>(streams_[0].target_bitrate_bps),
-            bitrate_allocation.GetSpatialLayerSum(0));
-  EXPECT_EQ(static_cast<uint32_t>(streams_[1].max_bitrate_bps),
-            bitrate_allocation.GetSpatialLayerSum(1));
-  EXPECT_EQ(kHighScreenshareTl0Bps, bitrate_allocation.GetBitrate(1, 0));
-  EXPECT_EQ(kHighScreenshareTl1Bps - kHighScreenshareTl0Bps,
-            bitrate_allocation.GetBitrate(1, 1));
-}
-
-}  // namespace webrtc
diff --git a/modules/video_coding/video_coding_impl.cc b/modules/video_coding/video_coding_impl.cc
deleted file mode 100644
index 7551214..0000000
--- a/modules/video_coding/video_coding_impl.cc
+++ /dev/null
@@ -1,283 +0,0 @@
-/*
- *  Copyright (c) 2012 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/video_coding/video_coding_impl.h"
-
-#include <algorithm>
-#include <utility>
-
-#include "webrtc/common_types.h"
-#include "webrtc/common_video/include/video_bitrate_allocator.h"
-#include "webrtc/common_video/libyuv/include/webrtc_libyuv.h"
-#include "webrtc/modules/video_coding/codecs/vp8/temporal_layers.h"
-#include "webrtc/modules/video_coding/encoded_frame.h"
-#include "webrtc/modules/video_coding/include/video_codec_initializer.h"
-#include "webrtc/modules/video_coding/include/video_codec_interface.h"
-#include "webrtc/modules/video_coding/jitter_buffer.h"
-#include "webrtc/modules/video_coding/packet.h"
-#include "webrtc/modules/video_coding/timing.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/thread_checker.h"
-#include "webrtc/system_wrappers/include/clock.h"
-
-namespace webrtc {
-namespace vcm {
-
-int64_t VCMProcessTimer::Period() const {
-  return _periodMs;
-}
-
-int64_t VCMProcessTimer::TimeUntilProcess() const {
-  const int64_t time_since_process = _clock->TimeInMilliseconds() - _latestMs;
-  const int64_t time_until_process = _periodMs - time_since_process;
-  return std::max<int64_t>(time_until_process, 0);
-}
-
-void VCMProcessTimer::Processed() {
-  _latestMs = _clock->TimeInMilliseconds();
-}
-}  // namespace vcm
-
-namespace {
-// This wrapper provides a way to modify the callback without the need to expose
-// a register method all the way down to the function calling it.
-class EncodedImageCallbackWrapper : public EncodedImageCallback {
- public:
-  EncodedImageCallbackWrapper() : callback_(nullptr) {}
-
-  virtual ~EncodedImageCallbackWrapper() {}
-
-  void Register(EncodedImageCallback* callback) {
-    rtc::CritScope lock(&cs_);
-    callback_ = callback;
-  }
-
-  virtual Result OnEncodedImage(const EncodedImage& encoded_image,
-                                const CodecSpecificInfo* codec_specific_info,
-                                const RTPFragmentationHeader* fragmentation) {
-    rtc::CritScope lock(&cs_);
-    if (callback_) {
-      return callback_->OnEncodedImage(encoded_image, codec_specific_info,
-                                       fragmentation);
-    }
-    return Result(Result::ERROR_SEND_FAILED);
-  }
-
- private:
-  rtc::CriticalSection cs_;
-  EncodedImageCallback* callback_ RTC_GUARDED_BY(cs_);
-};
-
-class VideoCodingModuleImpl : public VideoCodingModule {
- public:
-  VideoCodingModuleImpl(Clock* clock,
-                        EventFactory* event_factory,
-                        NackSender* nack_sender,
-                        KeyFrameRequestSender* keyframe_request_sender,
-                        EncodedImageCallback* pre_decode_image_callback)
-      : VideoCodingModule(),
-        sender_(clock, &post_encode_callback_, nullptr),
-        timing_(new VCMTiming(clock)),
-        receiver_(clock,
-                  event_factory,
-                  pre_decode_image_callback,
-                  timing_.get(),
-                  nack_sender,
-                  keyframe_request_sender) {}
-
-  virtual ~VideoCodingModuleImpl() {}
-
-  int64_t TimeUntilNextProcess() override {
-    int64_t sender_time = sender_.TimeUntilNextProcess();
-    int64_t receiver_time = receiver_.TimeUntilNextProcess();
-    RTC_DCHECK_GE(sender_time, 0);
-    RTC_DCHECK_GE(receiver_time, 0);
-    return VCM_MIN(sender_time, receiver_time);
-  }
-
-  void Process() override {
-    sender_.Process();
-    receiver_.Process();
-  }
-
-  int32_t RegisterSendCodec(const VideoCodec* sendCodec,
-                            uint32_t numberOfCores,
-                            uint32_t maxPayloadSize) override {
-    if (sendCodec != nullptr && sendCodec->codecType == kVideoCodecVP8) {
-      // Set up a rate allocator and temporal layers factory for this vp8
-      // instance. The codec impl will have a raw pointer to the TL factory,
-      // and will call it when initializing. Since this can happen
-      // asynchronously keep the instance alive until destruction or until a
-      // new send codec is registered.
-      VideoCodec vp8_codec = *sendCodec;
-      std::unique_ptr<TemporalLayersFactory> tl_factory(
-          new TemporalLayersFactory());
-      vp8_codec.VP8()->tl_factory = tl_factory.get();
-      rate_allocator_ = VideoCodecInitializer::CreateBitrateAllocator(
-          vp8_codec, std::move(tl_factory));
-      return sender_.RegisterSendCodec(&vp8_codec, numberOfCores,
-                                       maxPayloadSize);
-    }
-    return sender_.RegisterSendCodec(sendCodec, numberOfCores, maxPayloadSize);
-  }
-
-  int32_t RegisterExternalEncoder(VideoEncoder* externalEncoder,
-                                  uint8_t payloadType,
-                                  bool internalSource) override {
-    sender_.RegisterExternalEncoder(externalEncoder, payloadType,
-                                    internalSource);
-    return 0;
-  }
-
-  int Bitrate(unsigned int* bitrate) const override {
-    return sender_.Bitrate(bitrate);
-  }
-
-  int FrameRate(unsigned int* framerate) const override {
-    return sender_.FrameRate(framerate);
-  }
-
-  int32_t SetChannelParameters(uint32_t target_bitrate,  // bits/s.
-                               uint8_t lossRate,
-                               int64_t rtt) override {
-    return sender_.SetChannelParameters(target_bitrate, lossRate, rtt,
-                                        rate_allocator_.get(), nullptr);
-  }
-
-  int32_t RegisterProtectionCallback(
-      VCMProtectionCallback* protection) override {
-    return sender_.RegisterProtectionCallback(protection);
-  }
-
-  int32_t SetVideoProtection(VCMVideoProtection videoProtection,
-                             bool enable) override {
-    // TODO(pbos): Remove enable from receive-side protection modes as well.
-    return receiver_.SetVideoProtection(videoProtection, enable);
-  }
-
-  int32_t AddVideoFrame(const VideoFrame& videoFrame,
-                        const CodecSpecificInfo* codecSpecificInfo) override {
-    return sender_.AddVideoFrame(videoFrame, codecSpecificInfo);
-  }
-
-  int32_t IntraFrameRequest(size_t stream_index) override {
-    return sender_.IntraFrameRequest(stream_index);
-  }
-
-  int32_t EnableFrameDropper(bool enable) override {
-    return sender_.EnableFrameDropper(enable);
-  }
-
-  int32_t RegisterReceiveCodec(const VideoCodec* receiveCodec,
-                               int32_t numberOfCores,
-                               bool requireKeyFrame) override {
-    return receiver_.RegisterReceiveCodec(receiveCodec, numberOfCores,
-                                          requireKeyFrame);
-  }
-
-  void RegisterExternalDecoder(VideoDecoder* externalDecoder,
-                               uint8_t payloadType) override {
-    receiver_.RegisterExternalDecoder(externalDecoder, payloadType);
-  }
-
-  int32_t RegisterReceiveCallback(
-      VCMReceiveCallback* receiveCallback) override {
-    RTC_DCHECK(construction_thread_.CalledOnValidThread());
-    return receiver_.RegisterReceiveCallback(receiveCallback);
-  }
-
-  int32_t RegisterReceiveStatisticsCallback(
-      VCMReceiveStatisticsCallback* receiveStats) override {
-    return receiver_.RegisterReceiveStatisticsCallback(receiveStats);
-  }
-
-  int32_t RegisterFrameTypeCallback(
-      VCMFrameTypeCallback* frameTypeCallback) override {
-    return receiver_.RegisterFrameTypeCallback(frameTypeCallback);
-  }
-
-  int32_t RegisterPacketRequestCallback(
-      VCMPacketRequestCallback* callback) override {
-    RTC_DCHECK(construction_thread_.CalledOnValidThread());
-    return receiver_.RegisterPacketRequestCallback(callback);
-  }
-
-  int32_t Decode(uint16_t maxWaitTimeMs) override {
-    return receiver_.Decode(maxWaitTimeMs);
-  }
-
-  int32_t IncomingPacket(const uint8_t* incomingPayload,
-                         size_t payloadLength,
-                         const WebRtcRTPHeader& rtpInfo) override {
-    return receiver_.IncomingPacket(incomingPayload, payloadLength, rtpInfo);
-  }
-
-  int32_t SetMinimumPlayoutDelay(uint32_t minPlayoutDelayMs) override {
-    return receiver_.SetMinimumPlayoutDelay(minPlayoutDelayMs);
-  }
-
-  int32_t SetRenderDelay(uint32_t timeMS) override {
-    return receiver_.SetRenderDelay(timeMS);
-  }
-
-  int32_t Delay() const override { return receiver_.Delay(); }
-
-  int SetReceiverRobustnessMode(ReceiverRobustness robustnessMode,
-                                VCMDecodeErrorMode errorMode) override {
-    return receiver_.SetReceiverRobustnessMode(robustnessMode, errorMode);
-  }
-
-  void SetNackSettings(size_t max_nack_list_size,
-                       int max_packet_age_to_nack,
-                       int max_incomplete_time_ms) override {
-    return receiver_.SetNackSettings(max_nack_list_size, max_packet_age_to_nack,
-                                     max_incomplete_time_ms);
-  }
-
-  void SetDecodeErrorMode(VCMDecodeErrorMode decode_error_mode) override {
-    return receiver_.SetDecodeErrorMode(decode_error_mode);
-  }
-
-  int SetMinReceiverDelay(int desired_delay_ms) override {
-    return receiver_.SetMinReceiverDelay(desired_delay_ms);
-  }
-
-  int32_t SetReceiveChannelParameters(int64_t rtt) override {
-    return receiver_.SetReceiveChannelParameters(rtt);
-  }
-
-  void RegisterPostEncodeImageCallback(
-      EncodedImageCallback* observer) override {
-    post_encode_callback_.Register(observer);
-  }
-
-  void TriggerDecoderShutdown() override { receiver_.TriggerDecoderShutdown(); }
-
- private:
-  rtc::ThreadChecker construction_thread_;
-  EncodedImageCallbackWrapper post_encode_callback_;
-  vcm::VideoSender sender_;
-  std::unique_ptr<VideoBitrateAllocator> rate_allocator_;
-  std::unique_ptr<VCMTiming> timing_;
-  vcm::VideoReceiver receiver_;
-};
-}  // namespace
-
-// DEPRECATED.  Create method for current interface, will be removed when the
-// new jitter buffer is in place.
-VideoCodingModule* VideoCodingModule::Create(Clock* clock,
-                                             EventFactory* event_factory) {
-  RTC_DCHECK(clock);
-  RTC_DCHECK(event_factory);
-  return new VideoCodingModuleImpl(clock, event_factory, nullptr, nullptr,
-                                   nullptr);
-}
-
-}  // namespace webrtc
diff --git a/modules/video_coding/video_coding_impl.h b/modules/video_coding/video_coding_impl.h
deleted file mode 100644
index 3f4d6ab..0000000
--- a/modules/video_coding/video_coding_impl.h
+++ /dev/null
@@ -1,237 +0,0 @@
-/*
- *  Copyright (c) 2012 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_VIDEO_CODING_VIDEO_CODING_IMPL_H_
-#define WEBRTC_MODULES_VIDEO_CODING_VIDEO_CODING_IMPL_H_
-
-#include "webrtc/modules/video_coding/include/video_coding.h"
-
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "webrtc/common_video/include/frame_callback.h"
-#include "webrtc/modules/video_coding/codec_database.h"
-#include "webrtc/modules/video_coding/frame_buffer.h"
-#include "webrtc/modules/video_coding/generic_decoder.h"
-#include "webrtc/modules/video_coding/generic_encoder.h"
-#include "webrtc/modules/video_coding/jitter_buffer.h"
-#include "webrtc/modules/video_coding/media_optimization.h"
-#include "webrtc/modules/video_coding/qp_parser.h"
-#include "webrtc/modules/video_coding/receiver.h"
-#include "webrtc/modules/video_coding/timing.h"
-#include "webrtc/rtc_base/onetimeevent.h"
-#include "webrtc/rtc_base/sequenced_task_checker.h"
-#include "webrtc/rtc_base/thread_annotations.h"
-#include "webrtc/rtc_base/thread_checker.h"
-#include "webrtc/system_wrappers/include/clock.h"
-
-namespace webrtc {
-
-class VideoBitrateAllocator;
-class VideoBitrateAllocationObserver;
-
-namespace vcm {
-
-class VCMProcessTimer {
- public:
-  static const int64_t kDefaultProcessIntervalMs = 1000;
-
-  VCMProcessTimer(int64_t periodMs, Clock* clock)
-      : _clock(clock),
-        _periodMs(periodMs),
-        _latestMs(_clock->TimeInMilliseconds()) {}
-  int64_t Period() const;
-  int64_t TimeUntilProcess() const;
-  void Processed();
-
- private:
-  Clock* _clock;
-  int64_t _periodMs;
-  int64_t _latestMs;
-};
-
-class VideoSender : public Module {
- public:
-  typedef VideoCodingModule::SenderNackMode SenderNackMode;
-
-  VideoSender(Clock* clock,
-              EncodedImageCallback* post_encode_callback,
-              VCMSendStatisticsCallback* send_stats_callback);
-
-  ~VideoSender();
-
-  // Register the send codec to be used.
-  // This method must be called on the construction thread.
-  int32_t RegisterSendCodec(const VideoCodec* sendCodec,
-                            uint32_t numberOfCores,
-                            uint32_t maxPayloadSize);
-
-  void RegisterExternalEncoder(VideoEncoder* externalEncoder,
-                               uint8_t payloadType,
-                               bool internalSource);
-
-  int Bitrate(unsigned int* bitrate) const;
-  int FrameRate(unsigned int* framerate) const;
-
-  // Update the channel parameters based on new rates and rtt. This will also
-  // cause an immediate call to VideoEncoder::SetRateAllocation().
-  int32_t SetChannelParameters(
-      uint32_t target_bitrate_bps,
-      uint8_t loss_rate,
-      int64_t rtt,
-      VideoBitrateAllocator* bitrate_allocator,
-      VideoBitrateAllocationObserver* bitrate_updated_callback);
-
-  // Updates the channel parameters with a new bitrate allocation, but using the
-  // current targit_bitrate, loss rate and rtt. That is, the distribution or
-  // caps may be updated to a change to a new VideoCodec or allocation mode.
-  // The new parameters will be stored as pending EncoderParameters, and the
-  // encoder will only be updated on the next frame.
-  void UpdateChannelParemeters(
-      VideoBitrateAllocator* bitrate_allocator,
-      VideoBitrateAllocationObserver* bitrate_updated_callback);
-
-  // Deprecated:
-  // TODO(perkj): Remove once no projects use it.
-  int32_t RegisterProtectionCallback(VCMProtectionCallback* protection);
-
-  int32_t AddVideoFrame(const VideoFrame& videoFrame,
-                        const CodecSpecificInfo* codecSpecificInfo);
-
-  int32_t IntraFrameRequest(size_t stream_index);
-  int32_t EnableFrameDropper(bool enable);
-
-  int64_t TimeUntilNextProcess() override;
-  void Process() override;
-
- private:
-  EncoderParameters UpdateEncoderParameters(
-      const EncoderParameters& params,
-      VideoBitrateAllocator* bitrate_allocator,
-      uint32_t target_bitrate_bps);
-  void SetEncoderParameters(EncoderParameters params, bool has_internal_source)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(encoder_crit_);
-
-  Clock* const clock_;
-
-  rtc::CriticalSection encoder_crit_;
-  VCMGenericEncoder* _encoder;
-  media_optimization::MediaOptimization _mediaOpt;
-  VCMEncodedFrameCallback _encodedFrameCallback RTC_GUARDED_BY(encoder_crit_);
-  EncodedImageCallback* const post_encode_callback_;
-  VCMSendStatisticsCallback* const send_stats_callback_;
-  VCMCodecDataBase _codecDataBase RTC_GUARDED_BY(encoder_crit_);
-  bool frame_dropper_enabled_ RTC_GUARDED_BY(encoder_crit_);
-  VCMProcessTimer _sendStatsTimer;
-
-  // Must be accessed on the construction thread of VideoSender.
-  VideoCodec current_codec_;
-  rtc::SequencedTaskChecker sequenced_checker_;
-
-  rtc::CriticalSection params_crit_;
-  EncoderParameters encoder_params_ RTC_GUARDED_BY(params_crit_);
-  bool encoder_has_internal_source_ RTC_GUARDED_BY(params_crit_);
-  std::vector<FrameType> next_frame_types_ RTC_GUARDED_BY(params_crit_);
-};
-
-class VideoReceiver : public Module {
- public:
-  VideoReceiver(Clock* clock,
-                EventFactory* event_factory,
-                EncodedImageCallback* pre_decode_image_callback,
-                VCMTiming* timing,
-                NackSender* nack_sender = nullptr,
-                KeyFrameRequestSender* keyframe_request_sender = nullptr);
-  ~VideoReceiver();
-
-  int32_t RegisterReceiveCodec(const VideoCodec* receiveCodec,
-                               int32_t numberOfCores,
-                               bool requireKeyFrame);
-
-  void RegisterExternalDecoder(VideoDecoder* externalDecoder,
-                               uint8_t payloadType);
-  int32_t RegisterReceiveCallback(VCMReceiveCallback* receiveCallback);
-  int32_t RegisterReceiveStatisticsCallback(
-      VCMReceiveStatisticsCallback* receiveStats);
-  int32_t RegisterFrameTypeCallback(VCMFrameTypeCallback* frameTypeCallback);
-  int32_t RegisterPacketRequestCallback(VCMPacketRequestCallback* callback);
-
-  int32_t Decode(uint16_t maxWaitTimeMs);
-
-  int32_t Decode(const webrtc::VCMEncodedFrame* frame);
-
-  // Called on the decoder thread when thread is exiting.
-  void DecodingStopped();
-
-  int32_t IncomingPacket(const uint8_t* incomingPayload,
-                         size_t payloadLength,
-                         const WebRtcRTPHeader& rtpInfo);
-  int32_t SetMinimumPlayoutDelay(uint32_t minPlayoutDelayMs);
-  int32_t SetRenderDelay(uint32_t timeMS);
-  int32_t Delay() const;
-
-  // DEPRECATED.
-  int SetReceiverRobustnessMode(
-      VideoCodingModule::ReceiverRobustness robustnessMode,
-      VCMDecodeErrorMode errorMode);
-
-  void SetNackSettings(size_t max_nack_list_size,
-                       int max_packet_age_to_nack,
-                       int max_incomplete_time_ms);
-
-  void SetDecodeErrorMode(VCMDecodeErrorMode decode_error_mode);
-  int SetMinReceiverDelay(int desired_delay_ms);
-
-  int32_t SetReceiveChannelParameters(int64_t rtt);
-  int32_t SetVideoProtection(VCMVideoProtection videoProtection, bool enable);
-
-  int64_t TimeUntilNextProcess() override;
-  void Process() override;
-
-  void TriggerDecoderShutdown();
-
- protected:
-  int32_t Decode(const webrtc::VCMEncodedFrame& frame)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(receive_crit_);
-  int32_t RequestKeyFrame();
-
- private:
-  rtc::ThreadChecker construction_thread_;
-  Clock* const clock_;
-  rtc::CriticalSection process_crit_;
-  rtc::CriticalSection receive_crit_;
-  VCMTiming* _timing;
-  VCMReceiver _receiver;
-  VCMDecodedFrameCallback _decodedFrameCallback;
-  VCMFrameTypeCallback* _frameTypeCallback RTC_GUARDED_BY(process_crit_);
-  VCMReceiveStatisticsCallback* _receiveStatsCallback
-      RTC_GUARDED_BY(process_crit_);
-  VCMPacketRequestCallback* _packetRequestCallback
-      RTC_GUARDED_BY(process_crit_);
-
-  VCMFrameBuffer _frameFromFile;
-  bool _scheduleKeyRequest RTC_GUARDED_BY(process_crit_);
-  bool drop_frames_until_keyframe_ RTC_GUARDED_BY(process_crit_);
-  size_t max_nack_list_size_ RTC_GUARDED_BY(process_crit_);
-
-  VCMCodecDataBase _codecDataBase RTC_GUARDED_BY(receive_crit_);
-  EncodedImageCallback* pre_decode_image_callback_;
-
-  VCMProcessTimer _receiveStatsTimer;
-  VCMProcessTimer _retransmissionTimer;
-  VCMProcessTimer _keyRequestTimer;
-  QpParser qp_parser_;
-  ThreadUnsafeOneTimeEvent first_frame_received_;
-};
-
-}  // namespace vcm
-}  // namespace webrtc
-#endif  // WEBRTC_MODULES_VIDEO_CODING_VIDEO_CODING_IMPL_H_
diff --git a/modules/video_coding/video_packet_buffer_unittest.cc b/modules/video_coding/video_packet_buffer_unittest.cc
deleted file mode 100644
index ec377e9..0000000
--- a/modules/video_coding/video_packet_buffer_unittest.cc
+++ /dev/null
@@ -1,696 +0,0 @@
-/*
- *  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 <cstring>
-#include <map>
-#include <set>
-#include <utility>
-
-#include "webrtc/common_video/h264/h264_common.h"
-#include "webrtc/modules/video_coding/frame_object.h"
-#include "webrtc/modules/video_coding/packet_buffer.h"
-#include "webrtc/rtc_base/random.h"
-#include "webrtc/system_wrappers/include/clock.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-namespace video_coding {
-
-class TestPacketBuffer : public ::testing::Test,
-                         public OnReceivedFrameCallback {
- protected:
-  TestPacketBuffer()
-      : rand_(0x7732213),
-        clock_(new SimulatedClock(0)),
-        packet_buffer_(
-            PacketBuffer::Create(clock_.get(), kStartSize, kMaxSize, this)) {}
-
-  uint16_t Rand() { return rand_.Rand<uint16_t>(); }
-
-  void OnReceivedFrame(std::unique_ptr<RtpFrameObject> frame) override {
-    uint16_t first_seq_num = frame->first_seq_num();
-    if (frames_from_callback_.find(first_seq_num) !=
-        frames_from_callback_.end()) {
-      ADD_FAILURE() << "Already received frame with first sequence number "
-                    << first_seq_num << ".";
-      return;
-    }
-
-    frames_from_callback_.insert(
-        std::make_pair(frame->first_seq_num(), std::move(frame)));
-  }
-
-  enum IsKeyFrame { kKeyFrame, kDeltaFrame };
-  enum IsFirst { kFirst, kNotFirst };
-  enum IsLast { kLast, kNotLast };
-
-  bool Insert(uint16_t seq_num,           // packet sequence number
-              IsKeyFrame keyframe,        // is keyframe
-              IsFirst first,              // is first packet of frame
-              IsLast last,                // is last packet of frame
-              int data_size = 0,          // size of data
-              uint8_t* data = nullptr) {  // data pointer
-    VCMPacket packet;
-    packet.codec = kVideoCodecGeneric;
-    packet.seqNum = seq_num;
-    packet.frameType =
-        keyframe == kKeyFrame ? kVideoFrameKey : kVideoFrameDelta;
-    packet.is_first_packet_in_frame = first == kFirst;
-    packet.markerBit = last == kLast;
-    packet.sizeBytes = data_size;
-    packet.dataPtr = data;
-
-    return packet_buffer_->InsertPacket(&packet);
-  }
-
-  bool InsertH264(uint16_t seq_num,           // packet sequence number
-                  IsKeyFrame keyframe,        // is keyframe
-                  IsFirst first,              // is first packet of frame
-                  IsLast last,                // is last packet of frame
-                  uint32_t timestamp,         // rtp timestamp
-                  int data_size = 0,          // size of data
-                  uint8_t* data = nullptr) {  // data pointer
-    VCMPacket packet;
-    packet.codec = kVideoCodecH264;
-    packet.seqNum = seq_num;
-    packet.timestamp = timestamp;
-    packet.video_header.codecHeader.H264.nalus[0].type = H264::NaluType::kIdr;
-    packet.video_header.codecHeader.H264.nalus_length = keyframe == kKeyFrame;
-    packet.is_first_packet_in_frame = first == kFirst;
-    packet.markerBit = last == kLast;
-    packet.sizeBytes = data_size;
-    packet.dataPtr = data;
-
-    return packet_buffer_->InsertPacket(&packet);
-  }
-
-  void CheckFrame(uint16_t first_seq_num) {
-    auto frame_it = frames_from_callback_.find(first_seq_num);
-    ASSERT_FALSE(frame_it == frames_from_callback_.end())
-        << "Could not find frame with first sequence number " << first_seq_num
-        << ".";
-  }
-
-  static constexpr int kStartSize = 16;
-  static constexpr int kMaxSize = 64;
-
-  Random rand_;
-  std::unique_ptr<SimulatedClock> clock_;
-  rtc::scoped_refptr<PacketBuffer> packet_buffer_;
-  std::map<uint16_t, std::unique_ptr<RtpFrameObject>> frames_from_callback_;
-};
-
-TEST_F(TestPacketBuffer, InsertOnePacket) {
-  const uint16_t seq_num = Rand();
-  EXPECT_TRUE(Insert(seq_num, kKeyFrame, kFirst, kLast));
-}
-
-TEST_F(TestPacketBuffer, InsertMultiplePackets) {
-  const uint16_t seq_num = Rand();
-  EXPECT_TRUE(Insert(seq_num, kKeyFrame, kFirst, kLast));
-  EXPECT_TRUE(Insert(seq_num + 1, kKeyFrame, kFirst, kLast));
-  EXPECT_TRUE(Insert(seq_num + 2, kKeyFrame, kFirst, kLast));
-  EXPECT_TRUE(Insert(seq_num + 3, kKeyFrame, kFirst, kLast));
-}
-
-TEST_F(TestPacketBuffer, InsertDuplicatePacket) {
-  const uint16_t seq_num = Rand();
-  EXPECT_TRUE(Insert(seq_num, kKeyFrame, kFirst, kLast));
-  EXPECT_TRUE(Insert(seq_num, kKeyFrame, kFirst, kLast));
-}
-
-TEST_F(TestPacketBuffer, SeqNumWrapOneFrame) {
-  EXPECT_TRUE(Insert(0xFFFF, kKeyFrame, kFirst, kNotLast));
-  EXPECT_TRUE(Insert(0x0, kKeyFrame, kNotFirst, kLast));
-
-  CheckFrame(0xFFFF);
-}
-
-TEST_F(TestPacketBuffer, SeqNumWrapTwoFrames) {
-  EXPECT_TRUE(Insert(0xFFFF, kKeyFrame, kFirst, kLast));
-  EXPECT_TRUE(Insert(0x0, kKeyFrame, kFirst, kLast));
-
-  CheckFrame(0xFFFF);
-  CheckFrame(0x0);
-}
-
-TEST_F(TestPacketBuffer, InsertOldPackets) {
-  const uint16_t seq_num = Rand();
-
-  EXPECT_TRUE(Insert(seq_num, kKeyFrame, kFirst, kNotLast));
-  EXPECT_TRUE(Insert(seq_num + 2, kDeltaFrame, kFirst, kLast));
-  EXPECT_TRUE(Insert(seq_num + 1, kKeyFrame, kNotFirst, kLast));
-  ASSERT_EQ(2UL, frames_from_callback_.size());
-
-  frames_from_callback_.erase(seq_num + 2);
-  EXPECT_TRUE(Insert(seq_num, kKeyFrame, kFirst, kNotLast));
-  ASSERT_EQ(1UL, frames_from_callback_.size());
-
-  frames_from_callback_.erase(frames_from_callback_.find(seq_num));
-  ASSERT_TRUE(Insert(seq_num, kKeyFrame, kFirst, kNotLast));
-  EXPECT_TRUE(Insert(seq_num + 2, kDeltaFrame, kFirst, kLast));
-
-  packet_buffer_->ClearTo(seq_num + 2);
-  EXPECT_FALSE(Insert(seq_num + 2, kDeltaFrame, kFirst, kLast));
-  EXPECT_TRUE(Insert(seq_num + 3, kDeltaFrame, kFirst, kLast));
-  ASSERT_EQ(2UL, frames_from_callback_.size());
-}
-
-TEST_F(TestPacketBuffer, NackCount) {
-  const uint16_t seq_num = Rand();
-
-  VCMPacket packet;
-  packet.codec = kVideoCodecGeneric;
-  packet.seqNum = seq_num;
-  packet.frameType = kVideoFrameKey;
-  packet.is_first_packet_in_frame = true;
-  packet.markerBit = false;
-  packet.timesNacked = 0;
-
-  packet_buffer_->InsertPacket(&packet);
-
-  packet.seqNum++;
-  packet.is_first_packet_in_frame = false;
-  packet.timesNacked = 1;
-  packet_buffer_->InsertPacket(&packet);
-
-  packet.seqNum++;
-  packet.timesNacked = 3;
-  packet_buffer_->InsertPacket(&packet);
-
-  packet.seqNum++;
-  packet.markerBit = true;
-  packet.timesNacked = 1;
-  packet_buffer_->InsertPacket(&packet);
-
-  ASSERT_EQ(1UL, frames_from_callback_.size());
-  RtpFrameObject* frame = frames_from_callback_.begin()->second.get();
-  EXPECT_EQ(3, frame->times_nacked());
-}
-
-TEST_F(TestPacketBuffer, FrameSize) {
-  const uint16_t seq_num = Rand();
-  uint8_t* data1 = new uint8_t[5]();
-  uint8_t* data2 = new uint8_t[5]();
-  uint8_t* data3 = new uint8_t[5]();
-  uint8_t* data4 = new uint8_t[5]();
-
-  EXPECT_TRUE(Insert(seq_num, kKeyFrame, kFirst, kNotLast, 5, data1));
-  EXPECT_TRUE(Insert(seq_num + 1, kKeyFrame, kNotFirst, kNotLast, 5, data2));
-  EXPECT_TRUE(Insert(seq_num + 2, kKeyFrame, kNotFirst, kNotLast, 5, data3));
-  EXPECT_TRUE(Insert(seq_num + 3, kKeyFrame, kNotFirst, kLast, 5, data4));
-
-  ASSERT_EQ(1UL, frames_from_callback_.size());
-  EXPECT_EQ(20UL, frames_from_callback_.begin()->second->size());
-}
-
-TEST_F(TestPacketBuffer, ExpandBuffer) {
-  const uint16_t seq_num = Rand();
-
-  for (int i = 0; i < kStartSize + 1; ++i) {
-    EXPECT_TRUE(Insert(seq_num + i, kKeyFrame, kFirst, kLast));
-  }
-}
-
-TEST_F(TestPacketBuffer, SingleFrameExpandsBuffer) {
-  const uint16_t seq_num = Rand();
-
-  EXPECT_TRUE(Insert(seq_num, kKeyFrame, kFirst, kNotLast));
-  for (int i = 1; i < kStartSize; ++i)
-    EXPECT_TRUE(Insert(seq_num + i, kKeyFrame, kNotFirst, kNotLast));
-  EXPECT_TRUE(Insert(seq_num + kStartSize, kKeyFrame, kNotFirst, kLast));
-
-  ASSERT_EQ(1UL, frames_from_callback_.size());
-  CheckFrame(seq_num);
-}
-
-TEST_F(TestPacketBuffer, ExpandBufferOverflow) {
-  const uint16_t seq_num = Rand();
-
-  for (int i = 0; i < kMaxSize; ++i)
-    EXPECT_TRUE(Insert(seq_num + i, kKeyFrame, kFirst, kLast));
-  EXPECT_TRUE(Insert(seq_num + kMaxSize + 1, kKeyFrame, kFirst, kLast));
-}
-
-TEST_F(TestPacketBuffer, OnePacketOneFrame) {
-  const uint16_t seq_num = Rand();
-  EXPECT_TRUE(Insert(seq_num, kKeyFrame, kFirst, kLast));
-  ASSERT_EQ(1UL, frames_from_callback_.size());
-  CheckFrame(seq_num);
-}
-
-TEST_F(TestPacketBuffer, TwoPacketsTwoFrames) {
-  const uint16_t seq_num = Rand();
-
-  EXPECT_TRUE(Insert(seq_num, kKeyFrame, kFirst, kLast));
-  EXPECT_TRUE(Insert(seq_num + 1, kKeyFrame, kFirst, kLast));
-
-  EXPECT_EQ(2UL, frames_from_callback_.size());
-  CheckFrame(seq_num);
-  CheckFrame(seq_num + 1);
-}
-
-TEST_F(TestPacketBuffer, TwoPacketsOneFrames) {
-  const uint16_t seq_num = Rand();
-
-  EXPECT_TRUE(Insert(seq_num, kKeyFrame, kFirst, kNotLast));
-  EXPECT_TRUE(Insert(seq_num + 1, kKeyFrame, kNotFirst, kLast));
-
-  EXPECT_EQ(1UL, frames_from_callback_.size());
-  CheckFrame(seq_num);
-}
-
-TEST_F(TestPacketBuffer, ThreePacketReorderingOneFrame) {
-  const uint16_t seq_num = Rand();
-
-  EXPECT_TRUE(Insert(seq_num, kKeyFrame, kFirst, kNotLast));
-  EXPECT_TRUE(Insert(seq_num + 2, kKeyFrame, kNotFirst, kLast));
-  EXPECT_TRUE(Insert(seq_num + 1, kKeyFrame, kNotFirst, kNotLast));
-
-  EXPECT_EQ(1UL, frames_from_callback_.size());
-  CheckFrame(seq_num);
-}
-
-TEST_F(TestPacketBuffer, Frames) {
-  const uint16_t seq_num = Rand();
-
-  EXPECT_TRUE(Insert(seq_num, kKeyFrame, kFirst, kLast));
-  EXPECT_TRUE(Insert(seq_num + 1, kDeltaFrame, kFirst, kLast));
-  EXPECT_TRUE(Insert(seq_num + 2, kDeltaFrame, kFirst, kLast));
-  EXPECT_TRUE(Insert(seq_num + 3, kDeltaFrame, kFirst, kLast));
-
-  ASSERT_EQ(4UL, frames_from_callback_.size());
-  CheckFrame(seq_num);
-  CheckFrame(seq_num + 1);
-  CheckFrame(seq_num + 2);
-  CheckFrame(seq_num + 3);
-}
-
-TEST_F(TestPacketBuffer, ClearSinglePacket) {
-  const uint16_t seq_num = Rand();
-
-  for (int i = 0; i < kMaxSize; ++i)
-    EXPECT_TRUE(Insert(seq_num + i, kDeltaFrame, kFirst, kLast));
-
-  packet_buffer_->ClearTo(seq_num);
-  EXPECT_TRUE(Insert(seq_num + kMaxSize, kDeltaFrame, kFirst, kLast));
-}
-
-TEST_F(TestPacketBuffer, ClearFullBuffer) {
-  for (int i = 0; i < kMaxSize; ++i)
-    EXPECT_TRUE(Insert(i, kDeltaFrame, kFirst, kLast));
-
-  packet_buffer_->ClearTo(kMaxSize - 1);
-
-  for (int i = kMaxSize; i < 2 * kMaxSize; ++i)
-    EXPECT_TRUE(Insert(i, kDeltaFrame, kFirst, kLast));
-}
-
-TEST_F(TestPacketBuffer, DontClearNewerPacket) {
-  EXPECT_TRUE(Insert(0, kKeyFrame, kFirst, kLast));
-  packet_buffer_->ClearTo(0);
-  EXPECT_TRUE(Insert(2 * kStartSize, kKeyFrame, kFirst, kLast));
-  EXPECT_TRUE(Insert(3 * kStartSize + 1, kKeyFrame, kFirst, kNotLast));
-  packet_buffer_->ClearTo(2 * kStartSize);
-  EXPECT_TRUE(Insert(3 * kStartSize + 2, kKeyFrame, kNotFirst, kLast));
-
-  ASSERT_EQ(3UL, frames_from_callback_.size());
-  CheckFrame(0);
-  CheckFrame(2 * kStartSize);
-  CheckFrame(3 * kStartSize + 1);
-}
-
-TEST_F(TestPacketBuffer, OneIncompleteFrame) {
-  const uint16_t seq_num = Rand();
-
-  EXPECT_TRUE(Insert(seq_num, kDeltaFrame, kFirst, kNotLast));
-  EXPECT_TRUE(Insert(seq_num + 1, kDeltaFrame, kNotFirst, kLast));
-  EXPECT_TRUE(Insert(seq_num - 1, kDeltaFrame, kNotFirst, kLast));
-
-  ASSERT_EQ(1UL, frames_from_callback_.size());
-  CheckFrame(seq_num);
-}
-
-TEST_F(TestPacketBuffer, TwoIncompleteFramesFullBuffer) {
-  const uint16_t seq_num = Rand();
-
-  for (int i = 1; i < kMaxSize - 1; ++i)
-    EXPECT_TRUE(Insert(seq_num + i, kDeltaFrame, kNotFirst, kNotLast));
-  EXPECT_TRUE(Insert(seq_num, kDeltaFrame, kFirst, kNotLast));
-  EXPECT_TRUE(Insert(seq_num - 1, kDeltaFrame, kNotFirst, kLast));
-
-  ASSERT_EQ(0UL, frames_from_callback_.size());
-}
-
-TEST_F(TestPacketBuffer, FramesReordered) {
-  const uint16_t seq_num = Rand();
-
-  EXPECT_TRUE(Insert(seq_num + 1, kDeltaFrame, kFirst, kLast));
-  EXPECT_TRUE(Insert(seq_num, kKeyFrame, kFirst, kLast));
-  EXPECT_TRUE(Insert(seq_num + 3, kDeltaFrame, kFirst, kLast));
-  EXPECT_TRUE(Insert(seq_num + 2, kDeltaFrame, kFirst, kLast));
-
-  ASSERT_EQ(4UL, frames_from_callback_.size());
-  CheckFrame(seq_num);
-  CheckFrame(seq_num + 1);
-  CheckFrame(seq_num + 2);
-  CheckFrame(seq_num + 3);
-}
-
-TEST_F(TestPacketBuffer, GetBitstream) {
-  // "many bitstream, such data" with null termination.
-  uint8_t many_data[] = {0x6d, 0x61, 0x6e, 0x79, 0x20};
-  uint8_t bitstream_data[] = {0x62, 0x69, 0x74, 0x73, 0x74, 0x72,
-                              0x65, 0x61, 0x6d, 0x2c, 0x20};
-  uint8_t such_data[] = {0x73, 0x75, 0x63, 0x68, 0x20};
-  uint8_t data_data[] = {0x64, 0x61, 0x74, 0x61, 0x0};
-
-  uint8_t* many = new uint8_t[sizeof(many_data)];
-  uint8_t* bitstream = new uint8_t[sizeof(bitstream_data)];
-  uint8_t* such = new uint8_t[sizeof(such_data)];
-  uint8_t* data = new uint8_t[sizeof(data_data)];
-
-  memcpy(many, many_data, sizeof(many_data));
-  memcpy(bitstream, bitstream_data, sizeof(bitstream_data));
-  memcpy(such, such_data, sizeof(such_data));
-  memcpy(data, data_data, sizeof(data_data));
-
-  uint8_t result[sizeof(many_data) + sizeof(bitstream_data) +
-                 sizeof(such_data) + sizeof(data_data)];
-
-  const uint16_t seq_num = Rand();
-
-  EXPECT_TRUE(
-      Insert(seq_num, kKeyFrame, kFirst, kNotLast, sizeof(many_data), many));
-  EXPECT_TRUE(Insert(seq_num + 1, kDeltaFrame, kNotFirst, kNotLast,
-                     sizeof(bitstream_data), bitstream));
-  EXPECT_TRUE(Insert(seq_num + 2, kDeltaFrame, kNotFirst, kNotLast,
-                     sizeof(such_data), such));
-  EXPECT_TRUE(Insert(seq_num + 3, kDeltaFrame, kNotFirst, kLast,
-                     sizeof(data_data), data));
-
-  ASSERT_EQ(1UL, frames_from_callback_.size());
-  CheckFrame(seq_num);
-  EXPECT_EQ(frames_from_callback_[seq_num]->size(), sizeof(result));
-  EXPECT_TRUE(frames_from_callback_[seq_num]->GetBitstream(result));
-  EXPECT_EQ(memcmp(result, "many bitstream, such data", sizeof(result)), 0);
-}
-
-TEST_F(TestPacketBuffer, GetBitstreamOneFrameOnePacket) {
-  uint8_t bitstream_data[] = "All the bitstream data for this frame!";
-  uint8_t result[sizeof(bitstream_data)];
-  uint8_t* data = new uint8_t[sizeof(bitstream_data)];
-  memcpy(data, bitstream_data, sizeof(bitstream_data));
-
-  EXPECT_TRUE(
-      Insert(0, kKeyFrame, kFirst, kLast, sizeof(bitstream_data), data));
-
-  ASSERT_EQ(1UL, frames_from_callback_.size());
-  CheckFrame(0);
-  EXPECT_EQ(frames_from_callback_[0]->size(), sizeof(bitstream_data));
-  EXPECT_TRUE(frames_from_callback_[0]->GetBitstream(result));
-  EXPECT_EQ(memcmp(result, data, sizeof(bitstream_data)), 0);
-}
-
-TEST_F(TestPacketBuffer, GetBitstreamOneFrameFullBuffer) {
-  uint8_t* data_arr[kStartSize];
-  uint8_t expected[kStartSize];
-  uint8_t result[kStartSize];
-
-  for (uint8_t i = 0; i < kStartSize; ++i) {
-    data_arr[i] = new uint8_t[1];
-    data_arr[i][0] = i;
-    expected[i] = i;
-  }
-
-  EXPECT_TRUE(Insert(0, kKeyFrame, kFirst, kNotLast, 1, data_arr[0]));
-  for (uint8_t i = 1; i < kStartSize - 1; ++i)
-    EXPECT_TRUE(Insert(i, kKeyFrame, kNotFirst, kNotLast, 1, data_arr[i]));
-  EXPECT_TRUE(Insert(kStartSize - 1, kKeyFrame, kNotFirst, kLast, 1,
-                     data_arr[kStartSize - 1]));
-
-  ASSERT_EQ(1UL, frames_from_callback_.size());
-  CheckFrame(0);
-  EXPECT_EQ(frames_from_callback_[0]->size(), static_cast<size_t>(kStartSize));
-  EXPECT_TRUE(frames_from_callback_[0]->GetBitstream(result));
-  EXPECT_EQ(memcmp(result, expected, kStartSize), 0);
-}
-
-TEST_F(TestPacketBuffer, GetBitstreamOneFrameFullBufferH264) {
-  uint8_t* data_arr[kStartSize];
-  uint8_t expected[kStartSize];
-  uint8_t result[kStartSize];
-
-  for (uint8_t i = 0; i < kStartSize; ++i) {
-    data_arr[i] = new uint8_t[1];
-    data_arr[i][0] = i;
-    expected[i] = i;
-  }
-
-  EXPECT_TRUE(InsertH264(0, kKeyFrame, kFirst, kNotLast, 1, 1, data_arr[0]));
-  for (uint8_t i = 1; i < kStartSize - 1; ++i) {
-    EXPECT_TRUE(
-        InsertH264(i, kKeyFrame, kNotFirst, kNotLast, 1, 1, data_arr[i]));
-  }
-  EXPECT_TRUE(InsertH264(kStartSize - 1, kKeyFrame, kNotFirst, kLast, 1, 1,
-                         data_arr[kStartSize - 1]));
-
-  ASSERT_EQ(1UL, frames_from_callback_.size());
-  CheckFrame(0);
-  EXPECT_EQ(frames_from_callback_[0]->size(), static_cast<size_t>(kStartSize));
-  EXPECT_TRUE(frames_from_callback_[0]->GetBitstream(result));
-  EXPECT_EQ(memcmp(result, expected, kStartSize), 0);
-}
-
-TEST_F(TestPacketBuffer, GetBitstreamH264BufferPadding) {
-  uint16_t seq_num = Rand();
-  uint8_t data_data[] = "some plain old data";
-  uint8_t* data = new uint8_t[sizeof(data_data)];
-  memcpy(data, data_data, sizeof(data_data));
-
-  // EncodedImage::kBufferPaddingBytesH264 is unknown at compile time.
-  std::unique_ptr<uint8_t[]> result(
-      new uint8_t[sizeof(data_data) + EncodedImage::kBufferPaddingBytesH264]);
-
-  VCMPacket packet;
-  packet.video_header.codecHeader.H264.nalus_length = 1;
-  packet.video_header.codecHeader.H264.nalus[0].type = H264::NaluType::kIdr;
-  packet.seqNum = seq_num;
-  packet.codec = kVideoCodecH264;
-  packet.insertStartCode = true;
-  packet.video_header.codecHeader.H264.packetization_type = kH264SingleNalu;
-  packet.dataPtr = data;
-  packet.sizeBytes = sizeof(data_data);
-  packet.is_first_packet_in_frame = true;
-  packet.markerBit = true;
-  packet_buffer_->InsertPacket(&packet);
-
-  ASSERT_EQ(1UL, frames_from_callback_.size());
-  EXPECT_EQ(frames_from_callback_[seq_num]->EncodedImage()._length,
-            sizeof(data_data));
-  EXPECT_EQ(frames_from_callback_[seq_num]->EncodedImage()._size,
-            sizeof(data_data) + EncodedImage::kBufferPaddingBytesH264);
-  EXPECT_TRUE(frames_from_callback_[seq_num]->GetBitstream(result.get()));
-  EXPECT_EQ(memcmp(result.get(), data, sizeof(data_data)), 0);
-}
-
-TEST_F(TestPacketBuffer, FreeSlotsOnFrameDestruction) {
-  const uint16_t seq_num = Rand();
-
-  EXPECT_TRUE(Insert(seq_num, kKeyFrame, kFirst, kNotLast));
-  EXPECT_TRUE(Insert(seq_num + 1, kDeltaFrame, kNotFirst, kNotLast));
-  EXPECT_TRUE(Insert(seq_num + 2, kDeltaFrame, kNotFirst, kLast));
-  EXPECT_EQ(1UL, frames_from_callback_.size());
-  CheckFrame(seq_num);
-
-  frames_from_callback_.clear();
-
-  // Insert frame that fills the whole buffer.
-  EXPECT_TRUE(Insert(seq_num + 3, kKeyFrame, kFirst, kNotLast));
-  for (int i = 0; i < kMaxSize - 2; ++i)
-    EXPECT_TRUE(Insert(seq_num + i + 4, kDeltaFrame, kNotFirst, kNotLast));
-  EXPECT_TRUE(Insert(seq_num + kMaxSize + 2, kKeyFrame, kNotFirst, kLast));
-  EXPECT_EQ(1UL, frames_from_callback_.size());
-  CheckFrame(seq_num + 3);
-}
-
-TEST_F(TestPacketBuffer, Clear) {
-  const uint16_t seq_num = Rand();
-
-  EXPECT_TRUE(Insert(seq_num, kKeyFrame, kFirst, kNotLast));
-  EXPECT_TRUE(Insert(seq_num + 1, kDeltaFrame, kNotFirst, kNotLast));
-  EXPECT_TRUE(Insert(seq_num + 2, kDeltaFrame, kNotFirst, kLast));
-  EXPECT_EQ(1UL, frames_from_callback_.size());
-  CheckFrame(seq_num);
-
-  packet_buffer_->Clear();
-
-  EXPECT_TRUE(Insert(seq_num + kStartSize, kKeyFrame, kFirst, kNotLast));
-  EXPECT_TRUE(
-      Insert(seq_num + kStartSize + 1, kDeltaFrame, kNotFirst, kNotLast));
-  EXPECT_TRUE(Insert(seq_num + kStartSize + 2, kDeltaFrame, kNotFirst, kLast));
-  EXPECT_EQ(2UL, frames_from_callback_.size());
-  CheckFrame(seq_num + kStartSize);
-}
-
-TEST_F(TestPacketBuffer, InvalidateFrameByClearing) {
-  const uint16_t seq_num = Rand();
-
-  EXPECT_TRUE(Insert(seq_num, kKeyFrame, kFirst, kLast));
-  ASSERT_EQ(1UL, frames_from_callback_.size());
-
-  packet_buffer_->Clear();
-  EXPECT_FALSE(frames_from_callback_.begin()->second->GetBitstream(nullptr));
-}
-
-TEST_F(TestPacketBuffer, FramesAfterClear) {
-  Insert(9025, kDeltaFrame, kFirst, kLast);
-  Insert(9024, kKeyFrame, kFirst, kLast);
-  packet_buffer_->ClearTo(9025);
-  Insert(9057, kDeltaFrame, kFirst, kLast);
-  Insert(9026, kDeltaFrame, kFirst, kLast);
-
-  CheckFrame(9024);
-  CheckFrame(9025);
-  CheckFrame(9026);
-  CheckFrame(9057);
-}
-
-TEST_F(TestPacketBuffer, DontLeakPayloadData) {
-  // NOTE! Any eventual leak is suppose to be detected by valgrind
-  //       or any other similar tool.
-  uint8_t* data1 = new uint8_t[5];
-  uint8_t* data2 = new uint8_t[5];
-  uint8_t* data3 = new uint8_t[5];
-  uint8_t* data4 = new uint8_t[5];
-
-  // Expected to free data1 upon PacketBuffer destruction.
-  EXPECT_TRUE(Insert(2, kKeyFrame, kFirst, kNotLast, 5, data1));
-
-  // Expect to free data2 upon insertion.
-  EXPECT_TRUE(Insert(2, kKeyFrame, kFirst, kNotLast, 5, data2));
-
-  // Expect to free data3 upon insertion (old packet).
-  packet_buffer_->ClearTo(1);
-  EXPECT_FALSE(Insert(1, kKeyFrame, kFirst, kNotLast, 5, data3));
-
-  // Expect to free data4 upon insertion (packet buffer is full).
-  EXPECT_TRUE(Insert(2 + kMaxSize, kKeyFrame, kFirst, kNotLast, 5, data4));
-}
-
-TEST_F(TestPacketBuffer, ContinuousSeqNumDoubleMarkerBit) {
-  Insert(2, kKeyFrame, kNotFirst, kNotLast);
-  Insert(1, kKeyFrame, kFirst, kLast);
-  frames_from_callback_.clear();
-  Insert(3, kKeyFrame, kNotFirst, kLast);
-
-  EXPECT_EQ(0UL, frames_from_callback_.size());
-}
-
-TEST_F(TestPacketBuffer, PacketTimestamps) {
-  rtc::Optional<int64_t> packet_ms;
-  rtc::Optional<int64_t> packet_keyframe_ms;
-
-  packet_ms = packet_buffer_->LastReceivedPacketMs();
-  packet_keyframe_ms = packet_buffer_->LastReceivedKeyframePacketMs();
-  EXPECT_FALSE(packet_ms);
-  EXPECT_FALSE(packet_keyframe_ms);
-
-  int64_t keyframe_ms = clock_->TimeInMilliseconds();
-  EXPECT_TRUE(Insert(100, kKeyFrame, kFirst, kLast));
-  packet_ms = packet_buffer_->LastReceivedPacketMs();
-  packet_keyframe_ms = packet_buffer_->LastReceivedKeyframePacketMs();
-  EXPECT_TRUE(packet_ms);
-  EXPECT_TRUE(packet_keyframe_ms);
-  EXPECT_EQ(keyframe_ms, *packet_ms);
-  EXPECT_EQ(keyframe_ms, *packet_keyframe_ms);
-
-  clock_->AdvanceTimeMilliseconds(100);
-  int64_t delta_ms = clock_->TimeInMilliseconds();
-  EXPECT_TRUE(Insert(101, kDeltaFrame, kFirst, kLast));
-  packet_ms = packet_buffer_->LastReceivedPacketMs();
-  packet_keyframe_ms = packet_buffer_->LastReceivedKeyframePacketMs();
-  EXPECT_TRUE(packet_ms);
-  EXPECT_TRUE(packet_keyframe_ms);
-  EXPECT_EQ(delta_ms, *packet_ms);
-  EXPECT_EQ(keyframe_ms, *packet_keyframe_ms);
-
-  packet_buffer_->Clear();
-  packet_ms = packet_buffer_->LastReceivedPacketMs();
-  packet_keyframe_ms = packet_buffer_->LastReceivedKeyframePacketMs();
-  EXPECT_FALSE(packet_ms);
-  EXPECT_FALSE(packet_keyframe_ms);
-}
-
-TEST_F(TestPacketBuffer, OneFrameFillBufferH264) {
-  InsertH264(0, kKeyFrame, kFirst, kNotLast, 1000);
-  for (int i = 1; i < kStartSize - 1; ++i)
-    InsertH264(i, kKeyFrame, kNotFirst, kNotLast, 1000);
-  InsertH264(kStartSize - 1, kKeyFrame, kNotFirst, kLast, 1000);
-
-  EXPECT_EQ(1UL, frames_from_callback_.size());
-  CheckFrame(0);
-}
-
-TEST_F(TestPacketBuffer, CreateFramesAfterFilledBufferH264) {
-  InsertH264(kStartSize - 2, kKeyFrame, kFirst, kLast, 0);
-  ASSERT_EQ(1UL, frames_from_callback_.size());
-  frames_from_callback_.clear();
-
-  InsertH264(kStartSize, kDeltaFrame, kFirst, kNotLast, 2000);
-  for (int i = 1; i < kStartSize; ++i)
-    InsertH264(kStartSize + i, kDeltaFrame, kNotFirst, kNotLast, 2000);
-  InsertH264(kStartSize + kStartSize, kDeltaFrame, kNotFirst, kLast, 2000);
-  ASSERT_EQ(0UL, frames_from_callback_.size());
-
-  InsertH264(kStartSize - 1, kKeyFrame, kFirst, kLast, 1000);
-  ASSERT_EQ(2UL, frames_from_callback_.size());
-  CheckFrame(kStartSize - 1);
-  CheckFrame(kStartSize);
-}
-
-TEST_F(TestPacketBuffer, OneFrameMaxSeqNumH264) {
-  InsertH264(65534, kKeyFrame, kFirst, kNotLast, 1000);
-  InsertH264(65535, kKeyFrame, kNotFirst, kLast, 1000);
-
-  EXPECT_EQ(1UL, frames_from_callback_.size());
-  CheckFrame(65534);
-}
-
-TEST_F(TestPacketBuffer, ClearMissingPacketsOnKeyframeH264) {
-  InsertH264(0, kKeyFrame, kFirst, kLast, 1000);
-  InsertH264(2, kKeyFrame, kFirst, kLast, 3000);
-  InsertH264(3, kDeltaFrame, kFirst, kNotLast, 4000);
-  InsertH264(4, kDeltaFrame, kNotFirst, kLast, 4000);
-
-  ASSERT_EQ(3UL, frames_from_callback_.size());
-
-  InsertH264(kStartSize + 1, kKeyFrame, kFirst, kLast, 18000);
-
-  ASSERT_EQ(4UL, frames_from_callback_.size());
-  CheckFrame(0);
-  CheckFrame(2);
-  CheckFrame(3);
-  CheckFrame(kStartSize + 1);
-}
-
-TEST_F(TestPacketBuffer, FindFramesOnPaddingH264) {
-  InsertH264(0, kKeyFrame, kFirst, kLast, 1000);
-  InsertH264(2, kDeltaFrame, kFirst, kLast, 1000);
-
-  ASSERT_EQ(1UL, frames_from_callback_.size());
-  packet_buffer_->PaddingReceived(1);
-  ASSERT_EQ(2UL, frames_from_callback_.size());
-  CheckFrame(0);
-  CheckFrame(2);
-}
-
-}  // namespace video_coding
-}  // namespace webrtc
diff --git a/modules/video_coding/video_receiver.cc b/modules/video_coding/video_receiver.cc
deleted file mode 100644
index de6764f..0000000
--- a/modules/video_coding/video_receiver.cc
+++ /dev/null
@@ -1,440 +0,0 @@
-/*
- *  Copyright (c) 2013 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/common_types.h"
-#include "webrtc/common_video/libyuv/include/webrtc_libyuv.h"
-#include "webrtc/modules/video_coding/encoded_frame.h"
-#include "webrtc/modules/video_coding/include/video_codec_interface.h"
-#include "webrtc/modules/video_coding/jitter_buffer.h"
-#include "webrtc/modules/video_coding/packet.h"
-#include "webrtc/modules/video_coding/video_coding_impl.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/trace_event.h"
-#include "webrtc/system_wrappers/include/clock.h"
-
-namespace webrtc {
-namespace vcm {
-
-VideoReceiver::VideoReceiver(Clock* clock,
-                             EventFactory* event_factory,
-                             EncodedImageCallback* pre_decode_image_callback,
-                             VCMTiming* timing,
-                             NackSender* nack_sender,
-                             KeyFrameRequestSender* keyframe_request_sender)
-    : clock_(clock),
-      _timing(timing),
-      _receiver(_timing,
-                clock_,
-                event_factory,
-                nack_sender,
-                keyframe_request_sender),
-      _decodedFrameCallback(_timing, clock_),
-      _frameTypeCallback(nullptr),
-      _receiveStatsCallback(nullptr),
-      _packetRequestCallback(nullptr),
-      _frameFromFile(),
-      _scheduleKeyRequest(false),
-      drop_frames_until_keyframe_(false),
-      max_nack_list_size_(0),
-      _codecDataBase(nullptr),
-      pre_decode_image_callback_(pre_decode_image_callback),
-      _receiveStatsTimer(1000, clock_),
-      _retransmissionTimer(10, clock_),
-      _keyRequestTimer(500, clock_) {}
-
-VideoReceiver::~VideoReceiver() {}
-
-void VideoReceiver::Process() {
-  // Receive-side statistics
-
-  // TODO(philipel): Remove this if block when we know what to do with
-  //                 ReceiveStatisticsProxy::QualitySample.
-  if (_receiveStatsTimer.TimeUntilProcess() == 0) {
-    _receiveStatsTimer.Processed();
-    rtc::CritScope cs(&process_crit_);
-    if (_receiveStatsCallback != nullptr) {
-      _receiveStatsCallback->OnReceiveRatesUpdated(0, 0);
-    }
-  }
-
-  // Key frame requests
-  if (_keyRequestTimer.TimeUntilProcess() == 0) {
-    _keyRequestTimer.Processed();
-    bool request_key_frame = false;
-    {
-      rtc::CritScope cs(&process_crit_);
-      request_key_frame = _scheduleKeyRequest && _frameTypeCallback != nullptr;
-    }
-    if (request_key_frame)
-      RequestKeyFrame();
-  }
-
-  // Packet retransmission requests
-  // TODO(holmer): Add API for changing Process interval and make sure it's
-  // disabled when NACK is off.
-  if (_retransmissionTimer.TimeUntilProcess() == 0) {
-    _retransmissionTimer.Processed();
-    bool callback_registered = false;
-    uint16_t length;
-    {
-      rtc::CritScope cs(&process_crit_);
-      length = max_nack_list_size_;
-      callback_registered = _packetRequestCallback != nullptr;
-    }
-    if (callback_registered && length > 0) {
-      // Collect sequence numbers from the default receiver.
-      bool request_key_frame = false;
-      std::vector<uint16_t> nackList = _receiver.NackList(&request_key_frame);
-      int32_t ret = VCM_OK;
-      if (request_key_frame) {
-        ret = RequestKeyFrame();
-      }
-      if (ret == VCM_OK && !nackList.empty()) {
-        rtc::CritScope cs(&process_crit_);
-        if (_packetRequestCallback != nullptr) {
-          _packetRequestCallback->ResendPackets(&nackList[0], nackList.size());
-        }
-      }
-    }
-  }
-}
-
-int64_t VideoReceiver::TimeUntilNextProcess() {
-  int64_t timeUntilNextProcess = _receiveStatsTimer.TimeUntilProcess();
-  if (_receiver.NackMode() != kNoNack) {
-    // We need a Process call more often if we are relying on
-    // retransmissions
-    timeUntilNextProcess =
-        VCM_MIN(timeUntilNextProcess, _retransmissionTimer.TimeUntilProcess());
-  }
-  timeUntilNextProcess =
-      VCM_MIN(timeUntilNextProcess, _keyRequestTimer.TimeUntilProcess());
-
-  return timeUntilNextProcess;
-}
-
-int32_t VideoReceiver::SetReceiveChannelParameters(int64_t rtt) {
-  rtc::CritScope cs(&receive_crit_);
-  _receiver.UpdateRtt(rtt);
-  return 0;
-}
-
-// Enable or disable a video protection method.
-// Note: This API should be deprecated, as it does not offer a distinction
-// between the protection method and decoding with or without errors.
-int32_t VideoReceiver::SetVideoProtection(VCMVideoProtection videoProtection,
-                                          bool enable) {
-  // By default, do not decode with errors.
-  _receiver.SetDecodeErrorMode(kNoErrors);
-  switch (videoProtection) {
-    case kProtectionNack: {
-      RTC_DCHECK(enable);
-      _receiver.SetNackMode(kNack, -1, -1);
-      break;
-    }
-
-    case kProtectionNackFEC: {
-      rtc::CritScope cs(&receive_crit_);
-      RTC_DCHECK(enable);
-      _receiver.SetNackMode(kNack,
-                            media_optimization::kLowRttNackMs,
-                            media_optimization::kMaxRttDelayThreshold);
-      _receiver.SetDecodeErrorMode(kNoErrors);
-      break;
-    }
-    case kProtectionFEC:
-    case kProtectionNone:
-      // No receiver-side protection.
-      RTC_DCHECK(enable);
-      _receiver.SetNackMode(kNoNack, -1, -1);
-      _receiver.SetDecodeErrorMode(kWithErrors);
-      break;
-  }
-  return VCM_OK;
-}
-
-// Register a receive callback. Will be called whenever there is a new frame
-// ready for rendering.
-int32_t VideoReceiver::RegisterReceiveCallback(
-    VCMReceiveCallback* receiveCallback) {
-  RTC_DCHECK(construction_thread_.CalledOnValidThread());
-  // TODO(tommi): Callback may be null, but only after the decoder thread has
-  // been stopped. Use the signal we now get that tells us when the decoder
-  // thread isn't running, to DCHECK that the method is never called while it
-  // is. Once we're confident, we can remove the lock.
-  rtc::CritScope cs(&receive_crit_);
-  _decodedFrameCallback.SetUserReceiveCallback(receiveCallback);
-  return VCM_OK;
-}
-
-int32_t VideoReceiver::RegisterReceiveStatisticsCallback(
-    VCMReceiveStatisticsCallback* receiveStats) {
-  RTC_DCHECK(construction_thread_.CalledOnValidThread());
-  rtc::CritScope cs(&process_crit_);
-  _receiver.RegisterStatsCallback(receiveStats);
-  _receiveStatsCallback = receiveStats;
-  return VCM_OK;
-}
-
-// Register an externally defined decoder object.
-void VideoReceiver::RegisterExternalDecoder(VideoDecoder* externalDecoder,
-                                            uint8_t payloadType) {
-  RTC_DCHECK(construction_thread_.CalledOnValidThread());
-  // TODO(tommi): This method must be called when the decoder thread is not
-  // running.  Do we need a lock in that case?
-  rtc::CritScope cs(&receive_crit_);
-  if (externalDecoder == nullptr) {
-    RTC_CHECK(_codecDataBase.DeregisterExternalDecoder(payloadType));
-    return;
-  }
-  _codecDataBase.RegisterExternalDecoder(externalDecoder, payloadType);
-}
-
-// Register a frame type request callback.
-int32_t VideoReceiver::RegisterFrameTypeCallback(
-    VCMFrameTypeCallback* frameTypeCallback) {
-  rtc::CritScope cs(&process_crit_);
-  _frameTypeCallback = frameTypeCallback;
-  return VCM_OK;
-}
-
-int32_t VideoReceiver::RegisterPacketRequestCallback(
-    VCMPacketRequestCallback* callback) {
-  rtc::CritScope cs(&process_crit_);
-  _packetRequestCallback = callback;
-  return VCM_OK;
-}
-
-void VideoReceiver::TriggerDecoderShutdown() {
-  RTC_DCHECK(construction_thread_.CalledOnValidThread());
-  _receiver.TriggerDecoderShutdown();
-}
-
-// Decode next frame, blocking.
-// Should be called as often as possible to get the most out of the decoder.
-int32_t VideoReceiver::Decode(uint16_t maxWaitTimeMs) {
-  bool prefer_late_decoding = false;
-  {
-    // TODO(tommi): Chances are that this lock isn't required.
-    rtc::CritScope cs(&receive_crit_);
-    prefer_late_decoding = _codecDataBase.PrefersLateDecoding();
-  }
-
-  VCMEncodedFrame* frame =
-      _receiver.FrameForDecoding(maxWaitTimeMs, prefer_late_decoding);
-
-  if (!frame)
-    return VCM_FRAME_NOT_READY;
-
-  {
-    rtc::CritScope cs(&process_crit_);
-    if (drop_frames_until_keyframe_) {
-      // Still getting delta frames, schedule another keyframe request as if
-      // decode failed.
-      if (frame->FrameType() != kVideoFrameKey) {
-        _scheduleKeyRequest = true;
-        _receiver.ReleaseFrame(frame);
-        return VCM_FRAME_NOT_READY;
-      }
-      drop_frames_until_keyframe_ = false;
-    }
-  }
-
-  if (pre_decode_image_callback_) {
-    EncodedImage encoded_image(frame->EncodedImage());
-    int qp = -1;
-    if (qp_parser_.GetQp(*frame, &qp)) {
-      encoded_image.qp_ = qp;
-    }
-    pre_decode_image_callback_->OnEncodedImage(encoded_image,
-                                               frame->CodecSpecific(), nullptr);
-  }
-
-  rtc::CritScope cs(&receive_crit_);
-  // If this frame was too late, we should adjust the delay accordingly
-  _timing->UpdateCurrentDelay(frame->RenderTimeMs(),
-                              clock_->TimeInMilliseconds());
-
-  if (first_frame_received_()) {
-    LOG(LS_INFO) << "Received first "
-                 << (frame->Complete() ? "complete" : "incomplete")
-                 << " decodable video frame";
-  }
-
-  const int32_t ret = Decode(*frame);
-  _receiver.ReleaseFrame(frame);
-  return ret;
-}
-
-// Used for the new jitter buffer.
-// TODO(philipel): Clean up among the Decode functions as we replace
-//                 VCMEncodedFrame with FrameObject.
-int32_t VideoReceiver::Decode(const webrtc::VCMEncodedFrame* frame) {
-  rtc::CritScope lock(&receive_crit_);
-  if (pre_decode_image_callback_) {
-    EncodedImage encoded_image(frame->EncodedImage());
-    int qp = -1;
-    if (qp_parser_.GetQp(*frame, &qp)) {
-      encoded_image.qp_ = qp;
-    }
-    pre_decode_image_callback_->OnEncodedImage(encoded_image,
-                                               frame->CodecSpecific(), nullptr);
-  }
-  return Decode(*frame);
-}
-
-void VideoReceiver::DecodingStopped() {
-  // No further calls to Decode() will be made after this point.
-  // TODO(tommi): Make use of this to clarify and check threading model.
-}
-
-int32_t VideoReceiver::RequestKeyFrame() {
-  TRACE_EVENT0("webrtc", "RequestKeyFrame");
-  rtc::CritScope cs(&process_crit_);
-  if (_frameTypeCallback != nullptr) {
-    const int32_t ret = _frameTypeCallback->RequestKeyFrame();
-    if (ret < 0) {
-      return ret;
-    }
-    _scheduleKeyRequest = false;
-  } else {
-    return VCM_MISSING_CALLBACK;
-  }
-  return VCM_OK;
-}
-
-// Must be called from inside the receive side critical section.
-int32_t VideoReceiver::Decode(const VCMEncodedFrame& frame) {
-  TRACE_EVENT0("webrtc", "VideoReceiver::Decode");
-  // Change decoder if payload type has changed
-  VCMGenericDecoder* decoder =
-      _codecDataBase.GetDecoder(frame, &_decodedFrameCallback);
-  if (decoder == nullptr) {
-    return VCM_NO_CODEC_REGISTERED;
-  }
-  return decoder->Decode(frame, clock_->TimeInMilliseconds());
-}
-
-// Register possible receive codecs, can be called multiple times
-int32_t VideoReceiver::RegisterReceiveCodec(const VideoCodec* receiveCodec,
-                                            int32_t numberOfCores,
-                                            bool requireKeyFrame) {
-  RTC_DCHECK(construction_thread_.CalledOnValidThread());
-  // TODO(tommi): This method must only be called when the decoder thread
-  // is not running. Do we need a lock? If not, it looks like we might not need
-  // a lock at all for |_codecDataBase|.
-  rtc::CritScope cs(&receive_crit_);
-  if (receiveCodec == nullptr) {
-    return VCM_PARAMETER_ERROR;
-  }
-  if (!_codecDataBase.RegisterReceiveCodec(receiveCodec, numberOfCores,
-                                           requireKeyFrame)) {
-    return -1;
-  }
-  return 0;
-}
-
-// Incoming packet from network parsed and ready for decode, non blocking.
-int32_t VideoReceiver::IncomingPacket(const uint8_t* incomingPayload,
-                                      size_t payloadLength,
-                                      const WebRtcRTPHeader& rtpInfo) {
-  if (rtpInfo.frameType == kVideoFrameKey) {
-    TRACE_EVENT1("webrtc", "VCM::PacketKeyFrame", "seqnum",
-                 rtpInfo.header.sequenceNumber);
-  }
-  if (incomingPayload == nullptr) {
-    // The jitter buffer doesn't handle non-zero payload lengths for packets
-    // without payload.
-    // TODO(holmer): We should fix this in the jitter buffer.
-    payloadLength = 0;
-  }
-  const VCMPacket packet(incomingPayload, payloadLength, rtpInfo);
-  int32_t ret = _receiver.InsertPacket(packet);
-
-  // TODO(holmer): Investigate if this somehow should use the key frame
-  // request scheduling to throttle the requests.
-  if (ret == VCM_FLUSH_INDICATOR) {
-    {
-      rtc::CritScope cs(&process_crit_);
-      drop_frames_until_keyframe_ = true;
-    }
-    RequestKeyFrame();
-  } else if (ret < 0) {
-    return ret;
-  }
-  return VCM_OK;
-}
-
-// Minimum playout delay (used for lip-sync). This is the minimum delay required
-// to sync with audio. Not included in  VideoCodingModule::Delay()
-// Defaults to 0 ms.
-int32_t VideoReceiver::SetMinimumPlayoutDelay(uint32_t minPlayoutDelayMs) {
-  _timing->set_min_playout_delay(minPlayoutDelayMs);
-  return VCM_OK;
-}
-
-// The estimated delay caused by rendering, defaults to
-// kDefaultRenderDelayMs = 10 ms
-int32_t VideoReceiver::SetRenderDelay(uint32_t timeMS) {
-  _timing->set_render_delay(timeMS);
-  return VCM_OK;
-}
-
-// Current video delay
-int32_t VideoReceiver::Delay() const {
-  return _timing->TargetVideoDelay();
-}
-
-int VideoReceiver::SetReceiverRobustnessMode(
-    VideoCodingModule::ReceiverRobustness robustnessMode,
-    VCMDecodeErrorMode decode_error_mode) {
-  RTC_DCHECK(construction_thread_.CalledOnValidThread());
-  // TODO(tommi): This method must only be called when the decoder thread
-  // is not running and we don't need to hold this lock.
-  rtc::CritScope cs(&receive_crit_);
-  switch (robustnessMode) {
-    case VideoCodingModule::kNone:
-      _receiver.SetNackMode(kNoNack, -1, -1);
-      break;
-    case VideoCodingModule::kHardNack:
-      // Always wait for retransmissions (except when decoding with errors).
-      _receiver.SetNackMode(kNack, -1, -1);
-      break;
-    default:
-      RTC_NOTREACHED();
-      return VCM_PARAMETER_ERROR;
-  }
-  _receiver.SetDecodeErrorMode(decode_error_mode);
-  return VCM_OK;
-}
-
-void VideoReceiver::SetDecodeErrorMode(VCMDecodeErrorMode decode_error_mode) {
-  rtc::CritScope cs(&receive_crit_);
-  _receiver.SetDecodeErrorMode(decode_error_mode);
-}
-
-void VideoReceiver::SetNackSettings(size_t max_nack_list_size,
-                                    int max_packet_age_to_nack,
-                                    int max_incomplete_time_ms) {
-  if (max_nack_list_size != 0) {
-    rtc::CritScope cs(&process_crit_);
-    max_nack_list_size_ = max_nack_list_size;
-  }
-  _receiver.SetNackSettings(max_nack_list_size, max_packet_age_to_nack,
-                            max_incomplete_time_ms);
-}
-
-int VideoReceiver::SetMinReceiverDelay(int desired_delay_ms) {
-  return _receiver.SetMinReceiverDelay(desired_delay_ms);
-}
-
-}  // namespace vcm
-}  // namespace webrtc
diff --git a/modules/video_coding/video_receiver_unittest.cc b/modules/video_coding/video_receiver_unittest.cc
deleted file mode 100644
index 48ecdc2..0000000
--- a/modules/video_coding/video_receiver_unittest.cc
+++ /dev/null
@@ -1,223 +0,0 @@
-/*
- *  Copyright (c) 2013 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 <memory>
-#include <vector>
-
-#include "webrtc/modules/video_coding/include/mock/mock_vcm_callbacks.h"
-#include "webrtc/modules/video_coding/include/mock/mock_video_codec_interface.h"
-#include "webrtc/modules/video_coding/include/video_coding.h"
-#include "webrtc/modules/video_coding/test/test_util.h"
-#include "webrtc/modules/video_coding/timing.h"
-#include "webrtc/modules/video_coding/video_coding_impl.h"
-#include "webrtc/system_wrappers/include/clock.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/video_codec_settings.h"
-
-using ::testing::_;
-using ::testing::AnyNumber;
-using ::testing::NiceMock;
-
-namespace webrtc {
-namespace vcm {
-namespace {
-
-class TestVideoReceiver : public ::testing::Test {
- protected:
-  static const int kUnusedPayloadType = 10;
-
-  TestVideoReceiver() : clock_(0) {}
-
-  virtual void SetUp() {
-    timing_.reset(new VCMTiming(&clock_));
-    receiver_.reset(
-        new VideoReceiver(&clock_, &event_factory_, nullptr, timing_.get()));
-    receiver_->RegisterExternalDecoder(&decoder_, kUnusedPayloadType);
-    const size_t kMaxNackListSize = 250;
-    const int kMaxPacketAgeToNack = 450;
-    receiver_->SetNackSettings(kMaxNackListSize, kMaxPacketAgeToNack, 0);
-
-    webrtc::test::CodecSettings(kVideoCodecVP8, &settings_);
-    settings_.plType = kUnusedPayloadType;  // Use the mocked encoder.
-    EXPECT_EQ(0, receiver_->RegisterReceiveCodec(&settings_, 1, true));
-
-    // Since we call Decode, we need to provide a valid receive callback.
-    // However, for the purposes of these tests, we ignore the callbacks.
-    EXPECT_CALL(receive_callback_, OnIncomingPayloadType(_)).Times(AnyNumber());
-    EXPECT_CALL(receive_callback_, OnDecoderImplementationName(_))
-        .Times(AnyNumber());
-    receiver_->RegisterReceiveCallback(&receive_callback_);
-  }
-
-  void InsertAndVerifyPaddingFrame(const uint8_t* payload,
-                                   WebRtcRTPHeader* header) {
-    ASSERT_TRUE(header != NULL);
-    for (int j = 0; j < 5; ++j) {
-      // Padding only packets are passed to the VCM with payload size 0.
-      EXPECT_EQ(0, receiver_->IncomingPacket(payload, 0, *header));
-      ++header->header.sequenceNumber;
-    }
-    receiver_->Process();
-    EXPECT_CALL(decoder_, Decode(_, _, _, _, _)).Times(0);
-    EXPECT_EQ(VCM_FRAME_NOT_READY, receiver_->Decode(100));
-  }
-
-  void InsertAndVerifyDecodableFrame(const uint8_t* payload,
-                                     size_t length,
-                                     WebRtcRTPHeader* header) {
-    ASSERT_TRUE(header != NULL);
-    EXPECT_EQ(0, receiver_->IncomingPacket(payload, length, *header));
-    ++header->header.sequenceNumber;
-    EXPECT_CALL(packet_request_callback_, ResendPackets(_, _)).Times(0);
-    receiver_->Process();;
-    EXPECT_CALL(decoder_, Decode(_, _, _, _, _)).Times(1);
-    EXPECT_EQ(0, receiver_->Decode(100));
-  }
-
-  SimulatedClock clock_;
-  NullEventFactory event_factory_;
-  VideoCodec settings_;
-  NiceMock<MockVideoDecoder> decoder_;
-  NiceMock<MockPacketRequestCallback> packet_request_callback_;
-
-  std::unique_ptr<VCMTiming> timing_;
-  MockVCMReceiveCallback receive_callback_;
-  std::unique_ptr<VideoReceiver> receiver_;
-};
-
-TEST_F(TestVideoReceiver, PaddingOnlyFrames) {
-  EXPECT_EQ(0, receiver_->SetVideoProtection(kProtectionNack, true));
-  EXPECT_EQ(
-      0, receiver_->RegisterPacketRequestCallback(&packet_request_callback_));
-  const size_t kPaddingSize = 220;
-  const uint8_t payload[kPaddingSize] = {0};
-  WebRtcRTPHeader header;
-  memset(&header, 0, sizeof(header));
-  header.frameType = kEmptyFrame;
-  header.header.markerBit = false;
-  header.header.paddingLength = kPaddingSize;
-  header.header.payloadType = kUnusedPayloadType;
-  header.header.ssrc = 1;
-  header.header.headerLength = 12;
-  header.type.Video.codec = kRtpVideoVp8;
-  for (int i = 0; i < 10; ++i) {
-    EXPECT_CALL(packet_request_callback_, ResendPackets(_, _)).Times(0);
-    InsertAndVerifyPaddingFrame(payload, &header);
-    clock_.AdvanceTimeMilliseconds(33);
-    header.header.timestamp += 3000;
-  }
-}
-
-TEST_F(TestVideoReceiver, PaddingOnlyFramesWithLosses) {
-  EXPECT_EQ(0, receiver_->SetVideoProtection(kProtectionNack, true));
-  EXPECT_EQ(
-      0, receiver_->RegisterPacketRequestCallback(&packet_request_callback_));
-  const size_t kFrameSize = 1200;
-  const size_t kPaddingSize = 220;
-  const uint8_t payload[kFrameSize] = {0};
-  WebRtcRTPHeader header;
-  memset(&header, 0, sizeof(header));
-  header.frameType = kEmptyFrame;
-  header.header.markerBit = false;
-  header.header.paddingLength = kPaddingSize;
-  header.header.payloadType = kUnusedPayloadType;
-  header.header.ssrc = 1;
-  header.header.headerLength = 12;
-  header.type.Video.codec = kRtpVideoVp8;
-  // Insert one video frame to get one frame decoded.
-  header.frameType = kVideoFrameKey;
-  header.type.Video.is_first_packet_in_frame = true;
-  header.header.markerBit = true;
-  InsertAndVerifyDecodableFrame(payload, kFrameSize, &header);
-  clock_.AdvanceTimeMilliseconds(33);
-  header.header.timestamp += 3000;
-
-  header.frameType = kEmptyFrame;
-  header.type.Video.is_first_packet_in_frame = false;
-  header.header.markerBit = false;
-  // Insert padding frames.
-  for (int i = 0; i < 10; ++i) {
-    // Lose one packet from the 6th frame.
-    if (i == 5) {
-      ++header.header.sequenceNumber;
-    }
-    // Lose the 4th frame.
-    if (i == 3) {
-      header.header.sequenceNumber += 5;
-    } else {
-      if (i > 3 && i < 5) {
-        EXPECT_CALL(packet_request_callback_, ResendPackets(_, 5)).Times(1);
-      } else if (i >= 5) {
-        EXPECT_CALL(packet_request_callback_, ResendPackets(_, 6)).Times(1);
-      } else {
-        EXPECT_CALL(packet_request_callback_, ResendPackets(_, _)).Times(0);
-      }
-      InsertAndVerifyPaddingFrame(payload, &header);
-    }
-    clock_.AdvanceTimeMilliseconds(33);
-    header.header.timestamp += 3000;
-  }
-}
-
-TEST_F(TestVideoReceiver, PaddingOnlyAndVideo) {
-  EXPECT_EQ(0, receiver_->SetVideoProtection(kProtectionNack, true));
-  EXPECT_EQ(
-      0, receiver_->RegisterPacketRequestCallback(&packet_request_callback_));
-  const size_t kFrameSize = 1200;
-  const size_t kPaddingSize = 220;
-  const uint8_t payload[kFrameSize] = {0};
-  WebRtcRTPHeader header;
-  memset(&header, 0, sizeof(header));
-  header.frameType = kEmptyFrame;
-  header.type.Video.is_first_packet_in_frame = false;
-  header.header.markerBit = false;
-  header.header.paddingLength = kPaddingSize;
-  header.header.payloadType = kUnusedPayloadType;
-  header.header.ssrc = 1;
-  header.header.headerLength = 12;
-  header.type.Video.codec = kRtpVideoVp8;
-  header.type.Video.codecHeader.VP8.pictureId = -1;
-  header.type.Video.codecHeader.VP8.tl0PicIdx = -1;
-  for (int i = 0; i < 3; ++i) {
-    // Insert 2 video frames.
-    for (int j = 0; j < 2; ++j) {
-      if (i == 0 && j == 0)  // First frame should be a key frame.
-        header.frameType = kVideoFrameKey;
-      else
-        header.frameType = kVideoFrameDelta;
-      header.type.Video.is_first_packet_in_frame = true;
-      header.header.markerBit = true;
-      InsertAndVerifyDecodableFrame(payload, kFrameSize, &header);
-      clock_.AdvanceTimeMilliseconds(33);
-      header.header.timestamp += 3000;
-    }
-
-    // Insert 2 padding only frames.
-    header.frameType = kEmptyFrame;
-    header.type.Video.is_first_packet_in_frame = false;
-    header.header.markerBit = false;
-    for (int j = 0; j < 2; ++j) {
-      // InsertAndVerifyPaddingFrame(payload, &header);
-      clock_.AdvanceTimeMilliseconds(33);
-      header.header.timestamp += 3000;
-    }
-  }
-}
-
-TEST_F(TestVideoReceiver, ReceiverDelay) {
-  EXPECT_EQ(0, receiver_->SetMinReceiverDelay(0));
-  EXPECT_EQ(0, receiver_->SetMinReceiverDelay(5000));
-  EXPECT_EQ(-1, receiver_->SetMinReceiverDelay(-100));
-  EXPECT_EQ(-1, receiver_->SetMinReceiverDelay(10010));
-}
-
-}  // namespace
-}  // namespace vcm
-}  // namespace webrtc
diff --git a/modules/video_coding/video_sender.cc b/modules/video_coding/video_sender.cc
deleted file mode 100644
index f60b687..0000000
--- a/modules/video_coding/video_sender.cc
+++ /dev/null
@@ -1,415 +0,0 @@
-/*
- *  Copyright (c) 2013 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 <algorithm>  // std::max
-
-#include "webrtc/common_types.h"
-#include "webrtc/common_video/include/video_bitrate_allocator.h"
-#include "webrtc/common_video/libyuv/include/webrtc_libyuv.h"
-#include "webrtc/modules/video_coding/codecs/vp8/temporal_layers.h"
-#include "webrtc/modules/video_coding/encoded_frame.h"
-#include "webrtc/modules/video_coding/include/video_codec_interface.h"
-#include "webrtc/modules/video_coding/utility/default_video_bitrate_allocator.h"
-#include "webrtc/modules/video_coding/utility/quality_scaler.h"
-#include "webrtc/modules/video_coding/video_coding_impl.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/system_wrappers/include/clock.h"
-
-namespace webrtc {
-namespace vcm {
-
-VideoSender::VideoSender(Clock* clock,
-                         EncodedImageCallback* post_encode_callback,
-                         VCMSendStatisticsCallback* send_stats_callback)
-    : clock_(clock),
-      _encoder(nullptr),
-      _mediaOpt(clock_),
-      _encodedFrameCallback(post_encode_callback, &_mediaOpt),
-      post_encode_callback_(post_encode_callback),
-      send_stats_callback_(send_stats_callback),
-      _codecDataBase(&_encodedFrameCallback),
-      frame_dropper_enabled_(true),
-      _sendStatsTimer(VCMProcessTimer::kDefaultProcessIntervalMs, clock_),
-      current_codec_(),
-      encoder_params_({BitrateAllocation(), 0, 0, 0}),
-      encoder_has_internal_source_(false),
-      next_frame_types_(1, kVideoFrameDelta) {
-  _mediaOpt.Reset();
-  // Allow VideoSender to be created on one thread but used on another, post
-  // construction. This is currently how this class is being used by at least
-  // one external project (diffractor).
-  sequenced_checker_.Detach();
-}
-
-VideoSender::~VideoSender() {}
-
-void VideoSender::Process() {
-  if (_sendStatsTimer.TimeUntilProcess() == 0) {
-    // |_sendStatsTimer.Processed()| must be called. Otherwise
-    // VideoSender::Process() will be called in an infinite loop.
-    _sendStatsTimer.Processed();
-    if (send_stats_callback_) {
-      uint32_t bitRate = _mediaOpt.SentBitRate();
-      uint32_t frameRate = _mediaOpt.SentFrameRate();
-      send_stats_callback_->SendStatistics(bitRate, frameRate);
-    }
-  }
-}
-
-int64_t VideoSender::TimeUntilNextProcess() {
-  return _sendStatsTimer.TimeUntilProcess();
-}
-
-// Register the send codec to be used.
-int32_t VideoSender::RegisterSendCodec(const VideoCodec* sendCodec,
-                                       uint32_t numberOfCores,
-                                       uint32_t maxPayloadSize) {
-  RTC_DCHECK(sequenced_checker_.CalledSequentially());
-  rtc::CritScope lock(&encoder_crit_);
-  if (sendCodec == nullptr) {
-    return VCM_PARAMETER_ERROR;
-  }
-
-  bool ret =
-      _codecDataBase.SetSendCodec(sendCodec, numberOfCores, maxPayloadSize);
-
-  // Update encoder regardless of result to make sure that we're not holding on
-  // to a deleted instance.
-  _encoder = _codecDataBase.GetEncoder();
-  // Cache the current codec here so they can be fetched from this thread
-  // without requiring the _sendCritSect lock.
-  current_codec_ = *sendCodec;
-
-  if (!ret) {
-    LOG(LS_ERROR) << "Failed to initialize set encoder with payload name '"
-                  << sendCodec->plName << "'.";
-    return VCM_CODEC_ERROR;
-  }
-
-  // SetSendCodec succeeded, _encoder should be set.
-  RTC_DCHECK(_encoder);
-
-  int numLayers;
-  if (sendCodec->codecType == kVideoCodecVP8) {
-    numLayers = sendCodec->VP8().numberOfTemporalLayers;
-  } else if (sendCodec->codecType == kVideoCodecVP9) {
-    numLayers = sendCodec->VP9().numberOfTemporalLayers;
-  } else if (sendCodec->codecType == kVideoCodecGeneric &&
-             sendCodec->numberOfSimulcastStreams > 0) {
-    // This is mainly for unit testing, disabling frame dropping.
-    // TODO(sprang): Add a better way to disable frame dropping.
-    numLayers = sendCodec->simulcastStream[0].numberOfTemporalLayers;
-  } else {
-    numLayers = 1;
-  }
-
-  // If we have screensharing and we have layers, we disable frame dropper.
-  bool disable_frame_dropper =
-      numLayers > 1 && sendCodec->mode == kScreensharing;
-  if (disable_frame_dropper) {
-    _mediaOpt.EnableFrameDropper(false);
-  } else if (frame_dropper_enabled_) {
-    _mediaOpt.EnableFrameDropper(true);
-  }
-
-  {
-    rtc::CritScope cs(&params_crit_);
-    next_frame_types_.clear();
-    next_frame_types_.resize(VCM_MAX(sendCodec->numberOfSimulcastStreams, 1),
-                             kVideoFrameKey);
-    // Cache InternalSource() to have this available from IntraFrameRequest()
-    // without having to acquire encoder_crit_ (avoid blocking on encoder use).
-    encoder_has_internal_source_ = _encoder->InternalSource();
-  }
-
-  LOG(LS_VERBOSE) << " max bitrate " << sendCodec->maxBitrate
-                  << " start bitrate " << sendCodec->startBitrate
-                  << " max frame rate " << sendCodec->maxFramerate
-                  << " max payload size " << maxPayloadSize;
-  _mediaOpt.SetEncodingData(sendCodec->maxBitrate * 1000,
-                            sendCodec->startBitrate * 1000,
-                            sendCodec->maxFramerate);
-  return VCM_OK;
-}
-
-// Register an external decoder object.
-// This can not be used together with external decoder callbacks.
-void VideoSender::RegisterExternalEncoder(VideoEncoder* externalEncoder,
-                                          uint8_t payloadType,
-                                          bool internalSource /*= false*/) {
-  RTC_DCHECK(sequenced_checker_.CalledSequentially());
-
-  rtc::CritScope lock(&encoder_crit_);
-
-  if (externalEncoder == nullptr) {
-    bool wasSendCodec = false;
-    RTC_CHECK(
-        _codecDataBase.DeregisterExternalEncoder(payloadType, &wasSendCodec));
-    if (wasSendCodec) {
-      // Make sure the VCM doesn't use the de-registered codec
-      rtc::CritScope params_lock(&params_crit_);
-      _encoder = nullptr;
-      encoder_has_internal_source_ = false;
-    }
-    return;
-  }
-  _codecDataBase.RegisterExternalEncoder(externalEncoder, payloadType,
-                                         internalSource);
-}
-
-// Get encode bitrate
-int VideoSender::Bitrate(unsigned int* bitrate) const {
-  RTC_DCHECK(sequenced_checker_.CalledSequentially());
-  // Since we're running on the thread that's the only thread known to modify
-  // the value of _encoder, we don't need to grab the lock here.
-
-  if (!_encoder)
-    return VCM_UNINITIALIZED;
-  *bitrate = _encoder->GetEncoderParameters().target_bitrate.get_sum_bps();
-  return 0;
-}
-
-// Get encode frame rate
-int VideoSender::FrameRate(unsigned int* framerate) const {
-  RTC_DCHECK(sequenced_checker_.CalledSequentially());
-  // Since we're running on the thread that's the only thread known to modify
-  // the value of _encoder, we don't need to grab the lock here.
-
-  if (!_encoder)
-    return VCM_UNINITIALIZED;
-
-  *framerate = _encoder->GetEncoderParameters().input_frame_rate;
-  return 0;
-}
-
-EncoderParameters VideoSender::UpdateEncoderParameters(
-    const EncoderParameters& params,
-    VideoBitrateAllocator* bitrate_allocator,
-    uint32_t target_bitrate_bps) {
-  uint32_t video_target_rate_bps = _mediaOpt.SetTargetRates(target_bitrate_bps);
-  uint32_t input_frame_rate = _mediaOpt.InputFrameRate();
-  if (input_frame_rate == 0)
-    input_frame_rate = current_codec_.maxFramerate;
-
-  BitrateAllocation bitrate_allocation;
-  // Only call allocators if bitrate > 0 (ie, not suspended), otherwise they
-  // might cap the bitrate to the min bitrate configured.
-  if (target_bitrate_bps > 0) {
-    if (bitrate_allocator) {
-      bitrate_allocation = bitrate_allocator->GetAllocation(
-          video_target_rate_bps, input_frame_rate);
-    } else {
-      DefaultVideoBitrateAllocator default_allocator(current_codec_);
-      bitrate_allocation = default_allocator.GetAllocation(
-          video_target_rate_bps, input_frame_rate);
-    }
-  }
-  EncoderParameters new_encoder_params = {bitrate_allocation, params.loss_rate,
-                                          params.rtt, input_frame_rate};
-  return new_encoder_params;
-}
-
-void VideoSender::UpdateChannelParemeters(
-    VideoBitrateAllocator* bitrate_allocator,
-    VideoBitrateAllocationObserver* bitrate_updated_callback) {
-  BitrateAllocation target_rate;
-  {
-    rtc::CritScope cs(&params_crit_);
-    encoder_params_ =
-        UpdateEncoderParameters(encoder_params_, bitrate_allocator,
-                                encoder_params_.target_bitrate.get_sum_bps());
-    target_rate = encoder_params_.target_bitrate;
-  }
-  if (bitrate_updated_callback && target_rate.get_sum_bps() > 0)
-    bitrate_updated_callback->OnBitrateAllocationUpdated(target_rate);
-}
-
-int32_t VideoSender::SetChannelParameters(
-    uint32_t target_bitrate_bps,
-    uint8_t loss_rate,
-    int64_t rtt,
-    VideoBitrateAllocator* bitrate_allocator,
-    VideoBitrateAllocationObserver* bitrate_updated_callback) {
-  EncoderParameters encoder_params;
-  encoder_params.loss_rate = loss_rate;
-  encoder_params.rtt = rtt;
-  encoder_params = UpdateEncoderParameters(encoder_params, bitrate_allocator,
-                                           target_bitrate_bps);
-  if (bitrate_updated_callback && target_bitrate_bps > 0) {
-    bitrate_updated_callback->OnBitrateAllocationUpdated(
-        encoder_params.target_bitrate);
-  }
-
-  bool encoder_has_internal_source;
-  {
-    rtc::CritScope cs(&params_crit_);
-    encoder_params_ = encoder_params;
-    encoder_has_internal_source = encoder_has_internal_source_;
-  }
-
-  // For encoders with internal sources, we need to tell the encoder directly,
-  // instead of waiting for an AddVideoFrame that will never come (internal
-  // source encoders don't get input frames).
-  if (encoder_has_internal_source) {
-    rtc::CritScope cs(&encoder_crit_);
-    if (_encoder) {
-      SetEncoderParameters(encoder_params, encoder_has_internal_source);
-    }
-  }
-
-  return VCM_OK;
-}
-
-void VideoSender::SetEncoderParameters(EncoderParameters params,
-                                       bool has_internal_source) {
-  // |target_bitrate == 0 | means that the network is down or the send pacer is
-  // full. We currently only report this if the encoder has an internal source.
-  // If the encoder does not have an internal source, higher levels are expected
-  // to not call AddVideoFrame. We do this since its unclear how current
-  // encoder implementations behave when given a zero target bitrate.
-  // TODO(perkj): Make sure all known encoder implementations handle zero
-  // target bitrate and remove this check.
-  if (!has_internal_source && params.target_bitrate.get_sum_bps() == 0)
-    return;
-
-  if (params.input_frame_rate == 0) {
-    // No frame rate estimate available, use default.
-    params.input_frame_rate = current_codec_.maxFramerate;
-  }
-  if (_encoder != nullptr)
-    _encoder->SetEncoderParameters(params);
-}
-
-// Deprecated:
-// TODO(perkj): Remove once no projects call this method. It currently do
-// nothing.
-int32_t VideoSender::RegisterProtectionCallback(
-    VCMProtectionCallback* protection_callback) {
-  // Deprecated:
-  // TODO(perkj): Remove once no projects call this method. It currently do
-  // nothing.
-  return VCM_OK;
-}
-
-// Add one raw video frame to the encoder, blocking.
-int32_t VideoSender::AddVideoFrame(const VideoFrame& videoFrame,
-                                   const CodecSpecificInfo* codecSpecificInfo) {
-  EncoderParameters encoder_params;
-  std::vector<FrameType> next_frame_types;
-  bool encoder_has_internal_source = false;
-  {
-    rtc::CritScope lock(&params_crit_);
-    encoder_params = encoder_params_;
-    next_frame_types = next_frame_types_;
-    encoder_has_internal_source = encoder_has_internal_source_;
-  }
-  rtc::CritScope lock(&encoder_crit_);
-  if (_encoder == nullptr)
-    return VCM_UNINITIALIZED;
-  SetEncoderParameters(encoder_params, encoder_has_internal_source);
-  if (_mediaOpt.DropFrame()) {
-    LOG(LS_VERBOSE) << "Drop Frame "
-                    << "target bitrate "
-                    << encoder_params.target_bitrate.get_sum_bps()
-                    << " loss rate " << encoder_params.loss_rate << " rtt "
-                    << encoder_params.rtt << " input frame rate "
-                    << encoder_params.input_frame_rate;
-    post_encode_callback_->OnDroppedFrame();
-    return VCM_OK;
-  }
-  // TODO(pbos): Make sure setting send codec is synchronized with video
-  // processing so frame size always matches.
-  if (!_codecDataBase.MatchesCurrentResolution(videoFrame.width(),
-                                               videoFrame.height())) {
-    LOG(LS_ERROR) << "Incoming frame doesn't match set resolution. Dropping.";
-    return VCM_PARAMETER_ERROR;
-  }
-  VideoFrame converted_frame = videoFrame;
-  const VideoFrameBuffer::Type buffer_type =
-      converted_frame.video_frame_buffer()->type();
-  const bool is_buffer_type_supported =
-      buffer_type == VideoFrameBuffer::Type::kI420 ||
-      (buffer_type == VideoFrameBuffer::Type::kNative &&
-       _encoder->SupportsNativeHandle());
-  if (!is_buffer_type_supported) {
-    // This module only supports software encoding.
-    // TODO(pbos): Offload conversion from the encoder thread.
-    rtc::scoped_refptr<I420BufferInterface> converted_buffer(
-        converted_frame.video_frame_buffer()->ToI420());
-
-    if (!converted_buffer) {
-      LOG(LS_ERROR) << "Frame conversion failed, dropping frame.";
-      return VCM_PARAMETER_ERROR;
-    }
-    converted_frame = VideoFrame(converted_buffer,
-                                 converted_frame.timestamp(),
-                                 converted_frame.render_time_ms(),
-                                 converted_frame.rotation());
-  }
-  int32_t ret =
-      _encoder->Encode(converted_frame, codecSpecificInfo, next_frame_types);
-  if (ret < 0) {
-    LOG(LS_ERROR) << "Failed to encode frame. Error code: " << ret;
-    return ret;
-  }
-
-  {
-    rtc::CritScope lock(&params_crit_);
-    // Change all keyframe requests to encode delta frames the next time.
-    for (size_t i = 0; i < next_frame_types_.size(); ++i) {
-      // Check for equality (same requested as before encoding) to not
-      // accidentally drop a keyframe request while encoding.
-      if (next_frame_types[i] == next_frame_types_[i])
-        next_frame_types_[i] = kVideoFrameDelta;
-    }
-  }
-  return VCM_OK;
-}
-
-int32_t VideoSender::IntraFrameRequest(size_t stream_index) {
-  {
-    rtc::CritScope lock(&params_crit_);
-    if (stream_index >= next_frame_types_.size()) {
-      return -1;
-    }
-    next_frame_types_[stream_index] = kVideoFrameKey;
-    if (!encoder_has_internal_source_)
-      return VCM_OK;
-  }
-  // TODO(pbos): Remove when InternalSource() is gone. Both locks have to be
-  // held here for internal consistency, since _encoder could be removed while
-  // not holding encoder_crit_. Checks have to be performed again since
-  // params_crit_ was dropped to not cause lock-order inversions with
-  // encoder_crit_.
-  rtc::CritScope lock(&encoder_crit_);
-  rtc::CritScope params_lock(&params_crit_);
-  if (stream_index >= next_frame_types_.size())
-    return -1;
-  if (_encoder != nullptr && _encoder->InternalSource()) {
-    // Try to request the frame if we have an external encoder with
-    // internal source since AddVideoFrame never will be called.
-    if (_encoder->RequestFrame(next_frame_types_) == WEBRTC_VIDEO_CODEC_OK) {
-      // Try to remove just-performed keyframe request, if stream still exists.
-      next_frame_types_[stream_index] = kVideoFrameDelta;
-    }
-  }
-  return VCM_OK;
-}
-
-int32_t VideoSender::EnableFrameDropper(bool enable) {
-  rtc::CritScope lock(&encoder_crit_);
-  frame_dropper_enabled_ = enable;
-  _mediaOpt.EnableFrameDropper(enable);
-  return VCM_OK;
-}
-}  // namespace vcm
-}  // namespace webrtc
diff --git a/modules/video_coding/video_sender_unittest.cc b/modules/video_coding/video_sender_unittest.cc
deleted file mode 100644
index 7faaf15..0000000
--- a/modules/video_coding/video_sender_unittest.cc
+++ /dev/null
@@ -1,493 +0,0 @@
-/*
- *  Copyright (c) 2013 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 <memory>
-#include <vector>
-
-#include "webrtc/api/video/i420_buffer.h"
-#include "webrtc/modules/video_coding/codecs/vp8/include/vp8.h"
-#include "webrtc/modules/video_coding/codecs/vp8/include/vp8_common_types.h"
-#include "webrtc/modules/video_coding/codecs/vp8/simulcast_rate_allocator.h"
-#include "webrtc/modules/video_coding/codecs/vp8/temporal_layers.h"
-#include "webrtc/modules/video_coding/include/mock/mock_vcm_callbacks.h"
-#include "webrtc/modules/video_coding/include/mock/mock_video_codec_interface.h"
-#include "webrtc/modules/video_coding/include/video_coding.h"
-#include "webrtc/modules/video_coding/video_coding_impl.h"
-#include "webrtc/modules/video_coding/utility/default_video_bitrate_allocator.h"
-#include "webrtc/system_wrappers/include/clock.h"
-#include "webrtc/test/frame_generator.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/testsupport/fileutils.h"
-#include "webrtc/test/video_codec_settings.h"
-
-using ::testing::_;
-using ::testing::AllOf;
-using ::testing::ElementsAre;
-using ::testing::ElementsAreArray;
-using ::testing::Field;
-using ::testing::NiceMock;
-using ::testing::Pointee;
-using ::testing::Return;
-using ::testing::FloatEq;
-using std::vector;
-using webrtc::test::FrameGenerator;
-
-namespace webrtc {
-namespace vcm {
-namespace {
-static const int kDefaultHeight = 720;
-static const int kDefaultWidth = 1280;
-static const int kMaxNumberOfTemporalLayers = 3;
-static const int kNumberOfLayers = 3;
-static const int kNumberOfStreams = 3;
-static const int kUnusedPayloadType = 10;
-
-struct Vp8StreamInfo {
-  float framerate_fps[kMaxNumberOfTemporalLayers];
-  int bitrate_kbps[kMaxNumberOfTemporalLayers];
-};
-
-MATCHER_P(MatchesVp8StreamInfo, expected, "") {
-  bool res = true;
-  for (int tl = 0; tl < kMaxNumberOfTemporalLayers; ++tl) {
-    if (fabs(expected.framerate_fps[tl] - arg.framerate_fps[tl]) > 0.5) {
-      *result_listener << " framerate_fps[" << tl
-                       << "] = " << arg.framerate_fps[tl] << " (expected "
-                       << expected.framerate_fps[tl] << ") ";
-      res = false;
-    }
-    if (abs(expected.bitrate_kbps[tl] - arg.bitrate_kbps[tl]) > 10) {
-      *result_listener << " bitrate_kbps[" << tl
-                       << "] = " << arg.bitrate_kbps[tl] << " (expected "
-                       << expected.bitrate_kbps[tl] << ") ";
-      res = false;
-    }
-  }
-  return res;
-}
-
-class EmptyFrameGenerator : public FrameGenerator {
- public:
-  EmptyFrameGenerator(int width, int height) : width_(width), height_(height) {}
-  VideoFrame* NextFrame() override {
-    frame_.reset(new VideoFrame(I420Buffer::Create(width_, height_),
-                                webrtc::kVideoRotation_0, 0));
-    return frame_.get();
-  }
-
- private:
-  const int width_;
-  const int height_;
-  std::unique_ptr<VideoFrame> frame_;
-};
-
-class EncodedImageCallbackImpl : public EncodedImageCallback {
- public:
-  explicit EncodedImageCallbackImpl(Clock* clock)
-      : clock_(clock), start_time_ms_(clock_->TimeInMilliseconds()) {}
-
-  virtual ~EncodedImageCallbackImpl() {}
-
-  Result OnEncodedImage(const EncodedImage& encoded_image,
-                        const CodecSpecificInfo* codec_specific_info,
-                        const RTPFragmentationHeader* fragmentation) override {
-    assert(codec_specific_info);
-    frame_data_.push_back(
-        FrameData(encoded_image._length, *codec_specific_info));
-    return Result(Result::OK, encoded_image._timeStamp);
-  }
-
-  void Reset() {
-    frame_data_.clear();
-    start_time_ms_ = clock_->TimeInMilliseconds();
-  }
-
-  float FramerateFpsWithinTemporalLayer(int temporal_layer) {
-    return CountFramesWithinTemporalLayer(temporal_layer) *
-           (1000.0 / interval_ms());
-  }
-
-  float BitrateKbpsWithinTemporalLayer(int temporal_layer) {
-    return SumPayloadBytesWithinTemporalLayer(temporal_layer) * 8.0 /
-           interval_ms();
-  }
-
-  Vp8StreamInfo CalculateVp8StreamInfo() {
-    Vp8StreamInfo info;
-    for (int tl = 0; tl < 3; ++tl) {
-      info.framerate_fps[tl] = FramerateFpsWithinTemporalLayer(tl);
-      info.bitrate_kbps[tl] = BitrateKbpsWithinTemporalLayer(tl);
-    }
-    return info;
-  }
-
- private:
-  struct FrameData {
-    FrameData() : payload_size(0) {}
-
-    FrameData(size_t payload_size, const CodecSpecificInfo& codec_specific_info)
-        : payload_size(payload_size),
-          codec_specific_info(codec_specific_info) {}
-
-    size_t payload_size;
-    CodecSpecificInfo codec_specific_info;
-  };
-
-  int64_t interval_ms() {
-    int64_t diff = (clock_->TimeInMilliseconds() - start_time_ms_);
-    EXPECT_GT(diff, 0);
-    return diff;
-  }
-
-  int CountFramesWithinTemporalLayer(int temporal_layer) {
-    int frames = 0;
-    for (size_t i = 0; i < frame_data_.size(); ++i) {
-      EXPECT_EQ(kVideoCodecVP8, frame_data_[i].codec_specific_info.codecType);
-      const uint8_t temporal_idx =
-          frame_data_[i].codec_specific_info.codecSpecific.VP8.temporalIdx;
-      if (temporal_idx <= temporal_layer || temporal_idx == kNoTemporalIdx)
-        frames++;
-    }
-    return frames;
-  }
-
-  size_t SumPayloadBytesWithinTemporalLayer(int temporal_layer) {
-    size_t payload_size = 0;
-    for (size_t i = 0; i < frame_data_.size(); ++i) {
-      EXPECT_EQ(kVideoCodecVP8, frame_data_[i].codec_specific_info.codecType);
-      const uint8_t temporal_idx =
-          frame_data_[i].codec_specific_info.codecSpecific.VP8.temporalIdx;
-      if (temporal_idx <= temporal_layer || temporal_idx == kNoTemporalIdx)
-        payload_size += frame_data_[i].payload_size;
-    }
-    return payload_size;
-  }
-
-  Clock* clock_;
-  int64_t start_time_ms_;
-  vector<FrameData> frame_data_;
-};
-
-class TestVideoSender : public ::testing::Test {
- protected:
-  // Note: simulated clock starts at 1 seconds, since parts of webrtc use 0 as
-  // a special case (e.g. frame rate in media optimization).
-  TestVideoSender() : clock_(1000), encoded_frame_callback_(&clock_) {}
-
-  void SetUp() override {
-    sender_.reset(new VideoSender(&clock_, &encoded_frame_callback_, nullptr));
-  }
-
-  void AddFrame() {
-    assert(generator_.get());
-    sender_->AddVideoFrame(*generator_->NextFrame(), NULL);
-  }
-
-  SimulatedClock clock_;
-  EncodedImageCallbackImpl encoded_frame_callback_;
-  // Used by subclassing tests, need to outlive sender_.
-  std::unique_ptr<VideoEncoder> encoder_;
-  std::unique_ptr<VideoSender> sender_;
-  std::unique_ptr<FrameGenerator> generator_;
-};
-
-class TestVideoSenderWithMockEncoder : public TestVideoSender {
- public:
-  TestVideoSenderWithMockEncoder() {}
-  ~TestVideoSenderWithMockEncoder() override {}
-
- protected:
-  void SetUp() override {
-    TestVideoSender::SetUp();
-    sender_->RegisterExternalEncoder(&encoder_, kUnusedPayloadType, false);
-    webrtc::test::CodecSettings(kVideoCodecVP8, &settings_);
-    settings_.numberOfSimulcastStreams = kNumberOfStreams;
-    ConfigureStream(kDefaultWidth / 4, kDefaultHeight / 4, 100,
-                    &settings_.simulcastStream[0]);
-    ConfigureStream(kDefaultWidth / 2, kDefaultHeight / 2, 500,
-                    &settings_.simulcastStream[1]);
-    ConfigureStream(kDefaultWidth, kDefaultHeight, 1200,
-                    &settings_.simulcastStream[2]);
-    settings_.plType = kUnusedPayloadType;  // Use the mocked encoder.
-    generator_.reset(
-        new EmptyFrameGenerator(settings_.width, settings_.height));
-    EXPECT_EQ(0, sender_->RegisterSendCodec(&settings_, 1, 1200));
-    rate_allocator_.reset(new DefaultVideoBitrateAllocator(settings_));
-  }
-
-  void TearDown() override { sender_.reset(); }
-
-  void ExpectIntraRequest(int stream) {
-    ExpectEncodeWithFrameTypes(stream, false);
-  }
-
-  void ExpectInitialKeyFrames() {
-    ExpectEncodeWithFrameTypes(-1, true);
-  }
-
-  void ExpectEncodeWithFrameTypes(int intra_request_stream, bool first_frame) {
-    if (intra_request_stream == -1) {
-      // No intra request expected, keyframes on first frame.
-      FrameType frame_type = first_frame ? kVideoFrameKey : kVideoFrameDelta;
-      EXPECT_CALL(encoder_,
-                  Encode(_, _, Pointee(ElementsAre(frame_type, frame_type,
-                                                   frame_type))))
-          .Times(1)
-          .WillRepeatedly(Return(0));
-      return;
-    }
-    ASSERT_FALSE(first_frame);
-    ASSERT_GE(intra_request_stream, 0);
-    ASSERT_LT(intra_request_stream, kNumberOfStreams);
-    std::vector<FrameType> frame_types(kNumberOfStreams, kVideoFrameDelta);
-    frame_types[intra_request_stream] = kVideoFrameKey;
-    EXPECT_CALL(encoder_,
-                Encode(_, _, Pointee(ElementsAreArray(&frame_types[0],
-                                                      frame_types.size()))))
-        .Times(1)
-        .WillRepeatedly(Return(0));
-  }
-
-  static void ConfigureStream(int width,
-                              int height,
-                              int max_bitrate,
-                              SimulcastStream* stream) {
-    assert(stream);
-    stream->width = width;
-    stream->height = height;
-    stream->maxBitrate = max_bitrate;
-    stream->numberOfTemporalLayers = kNumberOfLayers;
-    stream->qpMax = 45;
-  }
-
-  VideoCodec settings_;
-  NiceMock<MockVideoEncoder> encoder_;
-  std::unique_ptr<DefaultVideoBitrateAllocator> rate_allocator_;
-};
-
-TEST_F(TestVideoSenderWithMockEncoder, TestIntraRequests) {
-  // Initial request should be all keyframes.
-  ExpectInitialKeyFrames();
-  AddFrame();
-  EXPECT_EQ(0, sender_->IntraFrameRequest(0));
-  ExpectIntraRequest(0);
-  AddFrame();
-  ExpectIntraRequest(-1);
-  AddFrame();
-
-  EXPECT_EQ(0, sender_->IntraFrameRequest(1));
-  ExpectIntraRequest(1);
-  AddFrame();
-  ExpectIntraRequest(-1);
-  AddFrame();
-
-  EXPECT_EQ(0, sender_->IntraFrameRequest(2));
-  ExpectIntraRequest(2);
-  AddFrame();
-  ExpectIntraRequest(-1);
-  AddFrame();
-
-  EXPECT_EQ(-1, sender_->IntraFrameRequest(3));
-  ExpectIntraRequest(-1);
-  AddFrame();
-}
-
-TEST_F(TestVideoSenderWithMockEncoder, TestSetRate) {
-  // Let actual fps be half of max, so it can be distinguished from default.
-  const uint32_t kActualFrameRate = settings_.maxFramerate / 2;
-  const int64_t kFrameIntervalMs = 1000 / kActualFrameRate;
-  const uint32_t new_bitrate_kbps = settings_.startBitrate + 300;
-
-  // Initial frame rate is taken from config, as we have no data yet.
-  BitrateAllocation new_rate_allocation = rate_allocator_->GetAllocation(
-      new_bitrate_kbps * 1000, settings_.maxFramerate);
-  EXPECT_CALL(encoder_,
-              SetRateAllocation(new_rate_allocation, settings_.maxFramerate))
-      .Times(1)
-      .WillOnce(Return(0));
-  sender_->SetChannelParameters(new_bitrate_kbps * 1000, 0, 200,
-                                rate_allocator_.get(), nullptr);
-  AddFrame();
-  clock_.AdvanceTimeMilliseconds(kFrameIntervalMs);
-
-  // Expect no call to encoder_.SetRates if the new bitrate is zero.
-  EXPECT_CALL(encoder_, SetRateAllocation(_, _)).Times(0);
-  sender_->SetChannelParameters(0, 0, 200, rate_allocator_.get(), nullptr);
-  AddFrame();
-}
-
-TEST_F(TestVideoSenderWithMockEncoder, TestIntraRequestsInternalCapture) {
-  // De-register current external encoder.
-  sender_->RegisterExternalEncoder(nullptr, kUnusedPayloadType, false);
-  // Register encoder with internal capture.
-  sender_->RegisterExternalEncoder(&encoder_, kUnusedPayloadType, true);
-  EXPECT_EQ(0, sender_->RegisterSendCodec(&settings_, 1, 1200));
-  // Initial request should be all keyframes.
-  ExpectInitialKeyFrames();
-  AddFrame();
-  ExpectIntraRequest(0);
-  EXPECT_EQ(0, sender_->IntraFrameRequest(0));
-  ExpectIntraRequest(1);
-  EXPECT_EQ(0, sender_->IntraFrameRequest(1));
-  ExpectIntraRequest(2);
-  EXPECT_EQ(0, sender_->IntraFrameRequest(2));
-  // No requests expected since these indices are out of bounds.
-  EXPECT_EQ(-1, sender_->IntraFrameRequest(3));
-}
-
-TEST_F(TestVideoSenderWithMockEncoder, TestEncoderParametersForInternalSource) {
-  // De-register current external encoder.
-  sender_->RegisterExternalEncoder(nullptr, kUnusedPayloadType, false);
-  // Register encoder with internal capture.
-  sender_->RegisterExternalEncoder(&encoder_, kUnusedPayloadType, true);
-  EXPECT_EQ(0, sender_->RegisterSendCodec(&settings_, 1, 1200));
-  // Update encoder bitrate parameters. We expect that to immediately call
-  // SetRates on the encoder without waiting for AddFrame processing.
-  const uint32_t new_bitrate_kbps = settings_.startBitrate + 300;
-  BitrateAllocation new_rate_allocation = rate_allocator_->GetAllocation(
-      new_bitrate_kbps * 1000, settings_.maxFramerate);
-  EXPECT_CALL(encoder_, SetRateAllocation(new_rate_allocation, _))
-      .Times(1)
-      .WillOnce(Return(0));
-  sender_->SetChannelParameters(new_bitrate_kbps * 1000, 0, 200,
-                                rate_allocator_.get(), nullptr);
-}
-
-TEST_F(TestVideoSenderWithMockEncoder,
-       NoRedundantSetChannelParameterOrSetRatesCalls) {
-  const uint8_t kLossRate = 4;
-  const uint8_t kRtt = 200;
-  const int64_t kRateStatsWindowMs = 2000;
-  const uint32_t kInputFps = 20;
-  int64_t start_time = clock_.TimeInMilliseconds();
-  // Expect initial call to SetChannelParameters. Rates are initialized through
-  // InitEncode and expects no additional call before the framerate (or bitrate)
-  // updates.
-  EXPECT_CALL(encoder_, SetChannelParameters(kLossRate, kRtt))
-      .Times(1)
-      .WillOnce(Return(0));
-  sender_->SetChannelParameters(settings_.startBitrate * 1000, kLossRate, kRtt,
-                                rate_allocator_.get(), nullptr);
-  while (clock_.TimeInMilliseconds() < start_time + kRateStatsWindowMs) {
-    AddFrame();
-    clock_.AdvanceTimeMilliseconds(1000 / kInputFps);
-  }
-
-  // Call to SetChannelParameters with changed bitrate should call encoder
-  // SetRates but not encoder SetChannelParameters (that are unchanged).
-  uint32_t new_bitrate_bps = 2 * settings_.startBitrate * 1000;
-  BitrateAllocation new_rate_allocation =
-      rate_allocator_->GetAllocation(new_bitrate_bps, kInputFps);
-  EXPECT_CALL(encoder_, SetRateAllocation(new_rate_allocation, kInputFps))
-      .Times(1)
-      .WillOnce(Return(0));
-  sender_->SetChannelParameters(new_bitrate_bps, kLossRate, kRtt,
-                                rate_allocator_.get(), nullptr);
-  AddFrame();
-}
-
-class TestVideoSenderWithVp8 : public TestVideoSender {
- public:
-  TestVideoSenderWithVp8()
-      : codec_bitrate_kbps_(300), available_bitrate_kbps_(1000) {}
-
-  void SetUp() override {
-    TestVideoSender::SetUp();
-
-    const char* input_video = "foreman_cif";
-    const int width = 352;
-    const int height = 288;
-    generator_ = FrameGenerator::CreateFromYuvFile(
-        std::vector<std::string>(1, test::ResourcePath(input_video, "yuv")),
-        width, height, 1);
-
-    codec_ = MakeVp8VideoCodec(width, height, 3);
-    codec_.minBitrate = 10;
-    codec_.startBitrate = codec_bitrate_kbps_;
-    codec_.maxBitrate = codec_bitrate_kbps_;
-
-    TemporalLayersFactory* tl_factory = new TemporalLayersFactory();
-    rate_allocator_.reset(new SimulcastRateAllocator(
-        codec_, std::unique_ptr<TemporalLayersFactory>(tl_factory)));
-    codec_.VP8()->tl_factory = tl_factory;
-
-    encoder_.reset(VP8Encoder::Create());
-    sender_->RegisterExternalEncoder(encoder_.get(), codec_.plType, false);
-    EXPECT_EQ(0, sender_->RegisterSendCodec(&codec_, 1, 1200));
-  }
-
-  static VideoCodec MakeVp8VideoCodec(int width,
-                                      int height,
-                                      int temporal_layers) {
-    VideoCodec codec;
-    webrtc::test::CodecSettings(kVideoCodecVP8, &codec);
-    codec.width = width;
-    codec.height = height;
-    codec.VP8()->numberOfTemporalLayers = temporal_layers;
-    return codec;
-  }
-
-  void InsertFrames(float framerate, float seconds) {
-    for (int i = 0; i < seconds * framerate; ++i) {
-      clock_.AdvanceTimeMilliseconds(1000.0f / framerate);
-      AddFrame();
-      // SetChannelParameters needs to be called frequently to propagate
-      // framerate from the media optimization into the encoder.
-      // Note: SetChannelParameters fails if less than 2 frames are in the
-      // buffer since it will fail to calculate the framerate.
-      if (i != 0) {
-        EXPECT_EQ(VCM_OK, sender_->SetChannelParameters(
-                              available_bitrate_kbps_ * 1000, 0, 200,
-                              rate_allocator_.get(), nullptr));
-      }
-    }
-  }
-
-  Vp8StreamInfo SimulateWithFramerate(float framerate) {
-    const float short_simulation_interval = 5.0;
-    const float long_simulation_interval = 10.0;
-    // It appears that this 5 seconds simulation is needed to allow
-    // bitrate and framerate to stabilize.
-    InsertFrames(framerate, short_simulation_interval);
-    encoded_frame_callback_.Reset();
-
-    InsertFrames(framerate, long_simulation_interval);
-    return encoded_frame_callback_.CalculateVp8StreamInfo();
-  }
-
- protected:
-  VideoCodec codec_;
-  int codec_bitrate_kbps_;
-  int available_bitrate_kbps_;
-  std::unique_ptr<SimulcastRateAllocator> rate_allocator_;
-};
-
-#if defined(WEBRTC_ANDROID) || defined(WEBRTC_IOS)
-#define MAYBE_FixedTemporalLayersStrategy DISABLED_FixedTemporalLayersStrategy
-#else
-#define MAYBE_FixedTemporalLayersStrategy FixedTemporalLayersStrategy
-#endif
-TEST_F(TestVideoSenderWithVp8, MAYBE_FixedTemporalLayersStrategy) {
-  const int low_b = codec_bitrate_kbps_ * kVp8LayerRateAlloction[2][0];
-  const int mid_b = codec_bitrate_kbps_ * kVp8LayerRateAlloction[2][1];
-  const int high_b = codec_bitrate_kbps_ * kVp8LayerRateAlloction[2][2];
-  {
-    Vp8StreamInfo expected = {{7.5, 15.0, 30.0}, {low_b, mid_b, high_b}};
-    EXPECT_THAT(SimulateWithFramerate(30.0), MatchesVp8StreamInfo(expected));
-  }
-  {
-    Vp8StreamInfo expected = {{3.75, 7.5, 15.0}, {low_b, mid_b, high_b}};
-    EXPECT_THAT(SimulateWithFramerate(15.0), MatchesVp8StreamInfo(expected));
-  }
-}
-
-}  // namespace
-}  // namespace vcm
-}  // namespace webrtc
diff --git a/modules/video_processing/BUILD.gn b/modules/video_processing/BUILD.gn
deleted file mode 100644
index efe5458..0000000
--- a/modules/video_processing/BUILD.gn
+++ /dev/null
@@ -1,126 +0,0 @@
-# Copyright (c) 2014 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.
-
-import("//build/config/arm.gni")
-import("../../webrtc.gni")
-
-build_video_processing_sse2 = current_cpu == "x86" || current_cpu == "x64"
-
-rtc_static_library("video_processing") {
-  sources = [
-    "util/denoiser_filter.cc",
-    "util/denoiser_filter_c.cc",
-    "util/denoiser_filter_c.h",
-    "util/noise_estimation.cc",
-    "util/noise_estimation.h",
-    "util/skin_detection.cc",
-    "util/skin_detection.h",
-    "video_denoiser.cc",
-    "video_denoiser.h",
-  ]
-
-  deps = [
-    ":denoiser_filter",
-    "..:module_api",
-    "../../common_audio",
-    "../../common_video",
-    "../../modules/utility",
-    "../../rtc_base:rtc_base_approved",
-    "../../system_wrappers",
-  ]
-  if (build_video_processing_sse2) {
-    deps += [ ":video_processing_sse2" ]
-  }
-  if (rtc_build_with_neon) {
-    deps += [ ":video_processing_neon" ]
-  }
-
-  if (!build_with_chromium && is_clang) {
-    # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-    suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-  }
-}
-
-rtc_source_set("denoiser_filter") {
-  # Target that only exists to avoid cyclic depdency errors for the SSE2 and
-  # Neon implementations below.
-  sources = [
-    "util/denoiser_filter.h",
-  ]
-  deps = [
-    "..:module_api",
-  ]
-}
-
-if (build_video_processing_sse2) {
-  rtc_static_library("video_processing_sse2") {
-    sources = [
-      "util/denoiser_filter_sse2.cc",
-      "util/denoiser_filter_sse2.h",
-    ]
-
-    deps = [
-      ":denoiser_filter",
-      "../../rtc_base:rtc_base_approved",
-      "../../system_wrappers",
-    ]
-
-    if (!build_with_chromium && is_clang) {
-      # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-    }
-
-    if (is_posix) {
-      cflags = [ "-msse2" ]
-    }
-  }
-}
-
-if (rtc_build_with_neon) {
-  rtc_static_library("video_processing_neon") {
-    sources = [
-      "util/denoiser_filter_neon.cc",
-      "util/denoiser_filter_neon.h",
-    ]
-
-    deps = [
-      ":denoiser_filter",
-    ]
-
-    if (current_cpu != "arm64") {
-      suppressed_configs += [ "//build/config/compiler:compiler_arm_fpu" ]
-      cflags = [ "-mfpu=neon" ]
-    }
-  }
-}
-
-if (rtc_include_tests) {
-  rtc_source_set("video_processing_unittests") {
-    testonly = true
-
-    # Skip restricting visibility on mobile platforms since the tests on those
-    # gets additional generated targets which would require many lines here to
-    # cover (which would be confusing to read and hard to maintain).
-    if (!is_android && !is_ios) {
-      visibility = [ "..:modules_unittests" ]
-    }
-    sources = [
-      "test/denoiser_test.cc",
-    ]
-    deps = [
-      ":video_processing",
-      "../../common_video:common_video",
-      "../../test:test_support",
-      "../../test:video_test_common",
-    ]
-    if (!build_with_chromium && is_clang) {
-      # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-    }
-  }
-}
diff --git a/modules/video_processing/DEPS b/modules/video_processing/DEPS
deleted file mode 100644
index a0dd9c3..0000000
--- a/modules/video_processing/DEPS
+++ /dev/null
@@ -1,5 +0,0 @@
-include_rules = [
-  "+webrtc/common_audio",
-  "+webrtc/common_video",
-  "+webrtc/system_wrappers",
-]
diff --git a/modules/video_processing/OWNERS b/modules/video_processing/OWNERS
deleted file mode 100644
index fb23261..0000000
--- a/modules/video_processing/OWNERS
+++ /dev/null
@@ -1,7 +0,0 @@
-stefan@webrtc.org
-marpan@webrtc.org
-
-# These are for the common case of adding or renaming files. If you're doing
-# structural changes, please get a review from a reviewer in this file.
-per-file *.gn=*
-per-file *.gni=*
diff --git a/modules/video_processing/test/denoiser_test.cc b/modules/video_processing/test/denoiser_test.cc
deleted file mode 100644
index b27e5fc..0000000
--- a/modules/video_processing/test/denoiser_test.cc
+++ /dev/null
@@ -1,161 +0,0 @@
-/*
- *  Copyright (c) 2015 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 <string.h>
-
-#include <memory>
-
-#include "webrtc/common_video/include/i420_buffer_pool.h"
-#include "webrtc/modules/video_processing/video_denoiser.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/frame_utils.h"
-#include "webrtc/test/testsupport/fileutils.h"
-
-namespace webrtc {
-
-TEST(VideoDenoiserTest, CopyMem) {
-  std::unique_ptr<DenoiserFilter> df_c(DenoiserFilter::Create(false, nullptr));
-  std::unique_ptr<DenoiserFilter> df_sse_neon(
-      DenoiserFilter::Create(true, nullptr));
-  uint8_t src[16 * 16], dst[16 * 16];
-  for (int i = 0; i < 16; ++i) {
-    for (int j = 0; j < 16; ++j) {
-      src[i * 16 + j] = i * 16 + j;
-    }
-  }
-
-  memset(dst, 0, 16 * 16);
-  df_c->CopyMem16x16(src, 16, dst, 16);
-  EXPECT_EQ(0, memcmp(src, dst, 16 * 16));
-
-  memset(dst, 0, 16 * 16);
-  df_sse_neon->CopyMem16x16(src, 16, dst, 16);
-  EXPECT_EQ(0, memcmp(src, dst, 16 * 16));
-}
-
-TEST(VideoDenoiserTest, Variance) {
-  std::unique_ptr<DenoiserFilter> df_c(DenoiserFilter::Create(false, nullptr));
-  std::unique_ptr<DenoiserFilter> df_sse_neon(
-      DenoiserFilter::Create(true, nullptr));
-  uint8_t src[16 * 16], dst[16 * 16];
-  uint32_t sum = 0, sse = 0, var;
-  for (int i = 0; i < 16; ++i) {
-    for (int j = 0; j < 16; ++j) {
-      src[i * 16 + j] = i * 16 + j;
-    }
-  }
-  // Compute the 16x8 variance of the 16x16 block.
-  for (int i = 0; i < 8; ++i) {
-    for (int j = 0; j < 16; ++j) {
-      sum += (i * 32 + j);
-      sse += (i * 32 + j) * (i * 32 + j);
-    }
-  }
-  var = sse - ((sum * sum) >> 7);
-  memset(dst, 0, 16 * 16);
-  EXPECT_EQ(var, df_c->Variance16x8(src, 16, dst, 16, &sse));
-  EXPECT_EQ(var, df_sse_neon->Variance16x8(src, 16, dst, 16, &sse));
-}
-
-TEST(VideoDenoiserTest, MbDenoise) {
-  std::unique_ptr<DenoiserFilter> df_c(DenoiserFilter::Create(false, nullptr));
-  std::unique_ptr<DenoiserFilter> df_sse_neon(
-      DenoiserFilter::Create(true, nullptr));
-  uint8_t running_src[16 * 16], src[16 * 16];
-  uint8_t dst[16 * 16], dst_sse_neon[16 * 16];
-
-  // Test case: |diff| <= |3 + shift_inc1|
-  for (int i = 0; i < 16; ++i) {
-    for (int j = 0; j < 16; ++j) {
-      running_src[i * 16 + j] = i * 11 + j;
-      src[i * 16 + j] = i * 11 + j + 2;
-    }
-  }
-  memset(dst, 0, 16 * 16);
-  df_c->MbDenoise(running_src, 16, dst, 16, src, 16, 0, 1);
-  memset(dst_sse_neon, 0, 16 * 16);
-  df_sse_neon->MbDenoise(running_src, 16, dst_sse_neon, 16, src, 16, 0, 1);
-  EXPECT_EQ(0, memcmp(dst, dst_sse_neon, 16 * 16));
-
-  // Test case: |diff| >= |4 + shift_inc1|
-  for (int i = 0; i < 16; ++i) {
-    for (int j = 0; j < 16; ++j) {
-      running_src[i * 16 + j] = i * 11 + j;
-      src[i * 16 + j] = i * 11 + j + 5;
-    }
-  }
-  memset(dst, 0, 16 * 16);
-  df_c->MbDenoise(running_src, 16, dst, 16, src, 16, 0, 1);
-  memset(dst_sse_neon, 0, 16 * 16);
-  df_sse_neon->MbDenoise(running_src, 16, dst_sse_neon, 16, src, 16, 0, 1);
-  EXPECT_EQ(0, memcmp(dst, dst_sse_neon, 16 * 16));
-
-  // Test case: |diff| >= 8
-  for (int i = 0; i < 16; ++i) {
-    for (int j = 0; j < 16; ++j) {
-      running_src[i * 16 + j] = i * 11 + j;
-      src[i * 16 + j] = i * 11 + j + 8;
-    }
-  }
-  memset(dst, 0, 16 * 16);
-  df_c->MbDenoise(running_src, 16, dst, 16, src, 16, 0, 1);
-  memset(dst_sse_neon, 0, 16 * 16);
-  df_sse_neon->MbDenoise(running_src, 16, dst_sse_neon, 16, src, 16, 0, 1);
-  EXPECT_EQ(0, memcmp(dst, dst_sse_neon, 16 * 16));
-
-  // Test case: |diff| > 15
-  for (int i = 0; i < 16; ++i) {
-    for (int j = 0; j < 16; ++j) {
-      running_src[i * 16 + j] = i * 11 + j;
-      src[i * 16 + j] = i * 11 + j + 16;
-    }
-  }
-  memset(dst, 0, 16 * 16);
-  DenoiserDecision decision =
-      df_c->MbDenoise(running_src, 16, dst, 16, src, 16, 0, 1);
-  EXPECT_EQ(COPY_BLOCK, decision);
-  decision = df_sse_neon->MbDenoise(running_src, 16, dst, 16, src, 16, 0, 1);
-  EXPECT_EQ(COPY_BLOCK, decision);
-}
-
-TEST(VideoDenoiserTest, Denoiser) {
-  const int kWidth = 352;
-  const int kHeight = 288;
-
-  const std::string video_file =
-      webrtc::test::ResourcePath("foreman_cif", "yuv");
-  FILE* source_file = fopen(video_file.c_str(), "rb");
-  ASSERT_TRUE(source_file != nullptr)
-      << "Cannot open source file: " << video_file;
-
-  // Create pure C denoiser.
-  VideoDenoiser denoiser_c(false);
-  // Create SSE or NEON denoiser.
-  VideoDenoiser denoiser_sse_neon(true);
-
-  for (;;) {
-    rtc::scoped_refptr<I420BufferInterface> video_frame_buffer(
-        test::ReadI420Buffer(kWidth, kHeight, source_file));
-    if (!video_frame_buffer)
-      break;
-
-    rtc::scoped_refptr<I420BufferInterface> denoised_frame_c(
-        denoiser_c.DenoiseFrame(video_frame_buffer, false));
-    rtc::scoped_refptr<I420BufferInterface> denoised_frame_sse_neon(
-        denoiser_sse_neon.DenoiseFrame(video_frame_buffer, false));
-
-    // Denoising results should be the same for C and SSE/NEON denoiser.
-    ASSERT_TRUE(
-        test::FrameBufsEqual(denoised_frame_c, denoised_frame_sse_neon));
-  }
-  ASSERT_NE(0, feof(source_file)) << "Error reading source file";
-}
-
-}  // namespace webrtc
diff --git a/modules/video_processing/util/denoiser_filter.cc b/modules/video_processing/util/denoiser_filter.cc
deleted file mode 100644
index d088dda..0000000
--- a/modules/video_processing/util/denoiser_filter.cc
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- *  Copyright (c) 2015 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/video_processing/util/denoiser_filter.h"
-#include "webrtc/modules/video_processing/util/denoiser_filter_c.h"
-#include "webrtc/modules/video_processing/util/denoiser_filter_neon.h"
-#include "webrtc/modules/video_processing/util/denoiser_filter_sse2.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/system_wrappers/include/cpu_features_wrapper.h"
-
-namespace webrtc {
-
-const int kMotionMagnitudeThreshold = 8 * 3;
-const int kSumDiffThreshold = 96;
-const int kSumDiffThresholdHigh = 448;
-
-std::unique_ptr<DenoiserFilter> DenoiserFilter::Create(
-    bool runtime_cpu_detection,
-    CpuType* cpu_type) {
-  std::unique_ptr<DenoiserFilter> filter;
-
-  if (cpu_type != nullptr)
-    *cpu_type = CPU_NOT_NEON;
-  if (runtime_cpu_detection) {
-// If we know the minimum architecture at compile time, avoid CPU detection.
-#if defined(WEBRTC_ARCH_X86_FAMILY)
-#if defined(__SSE2__)
-    filter.reset(new DenoiserFilterSSE2());
-#else
-    // x86 CPU detection required.
-    if (WebRtc_GetCPUInfo(kSSE2)) {
-      filter.reset(new DenoiserFilterSSE2());
-    } else {
-      filter.reset(new DenoiserFilterC());
-    }
-#endif
-#elif defined(WEBRTC_HAS_NEON)
-    filter.reset(new DenoiserFilterNEON());
-    if (cpu_type != nullptr)
-      *cpu_type = CPU_NEON;
-#else
-    filter.reset(new DenoiserFilterC());
-#endif
-  } else {
-    filter.reset(new DenoiserFilterC());
-  }
-
-  RTC_DCHECK(filter.get() != nullptr);
-  return filter;
-}
-
-}  // namespace webrtc
diff --git a/modules/video_processing/util/denoiser_filter.h b/modules/video_processing/util/denoiser_filter.h
deleted file mode 100644
index 2fdcca0..0000000
--- a/modules/video_processing/util/denoiser_filter.h
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- *  Copyright (c) 2015 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_VIDEO_PROCESSING_UTIL_DENOISER_FILTER_H_
-#define WEBRTC_MODULES_VIDEO_PROCESSING_UTIL_DENOISER_FILTER_H_
-
-#include <climits>
-#include <memory>
-
-#include "webrtc/modules/include/module_common_types.h"
-
-namespace webrtc {
-
-extern const int kMotionMagnitudeThreshold;
-extern const int kSumDiffThreshold;
-extern const int kSumDiffThresholdHigh;
-
-enum DenoiserDecision { COPY_BLOCK, FILTER_BLOCK };
-enum CpuType { CPU_NEON, CPU_NOT_NEON };
-
-class DenoiserFilter {
- public:
-  static std::unique_ptr<DenoiserFilter> Create(bool runtime_cpu_detection,
-                                                CpuType* cpu_type);
-
-  virtual ~DenoiserFilter() {}
-
-  virtual void CopyMem16x16(const uint8_t* src,
-                            int src_stride,
-                            uint8_t* dst,
-                            int dst_stride) = 0;
-  virtual uint32_t Variance16x8(const uint8_t* a,
-                                int a_stride,
-                                const uint8_t* b,
-                                int b_stride,
-                                unsigned int* sse) = 0;
-  virtual DenoiserDecision MbDenoise(const uint8_t* mc_running_avg_y,
-                                     int mc_avg_y_stride,
-                                     uint8_t* running_avg_y,
-                                     int avg_y_stride,
-                                     const uint8_t* sig,
-                                     int sig_stride,
-                                     uint8_t motion_magnitude,
-                                     int increase_denoising) = 0;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_VIDEO_PROCESSING_UTIL_DENOISER_FILTER_H_
diff --git a/modules/video_processing/util/denoiser_filter_c.cc b/modules/video_processing/util/denoiser_filter_c.cc
deleted file mode 100644
index 8f42121..0000000
--- a/modules/video_processing/util/denoiser_filter_c.cc
+++ /dev/null
@@ -1,136 +0,0 @@
-/*
- *  Copyright (c) 2015 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 <stdlib.h>
-
-#include "webrtc/modules/video_processing/util/denoiser_filter_c.h"
-
-namespace webrtc {
-
-void DenoiserFilterC::CopyMem16x16(const uint8_t* src,
-                                   int src_stride,
-                                   uint8_t* dst,
-                                   int dst_stride) {
-  for (int i = 0; i < 16; i++) {
-    memcpy(dst, src, 16);
-    src += src_stride;
-    dst += dst_stride;
-  }
-}
-
-uint32_t DenoiserFilterC::Variance16x8(const uint8_t* a,
-                                       int a_stride,
-                                       const uint8_t* b,
-                                       int b_stride,
-                                       uint32_t* sse) {
-  int sum = 0;
-  *sse = 0;
-  a_stride <<= 1;
-  b_stride <<= 1;
-
-  for (int i = 0; i < 8; i++) {
-    for (int j = 0; j < 16; j++) {
-      const int diff = a[j] - b[j];
-      sum += diff;
-      *sse += diff * diff;
-    }
-
-    a += a_stride;
-    b += b_stride;
-  }
-  return *sse - ((static_cast<int64_t>(sum) * sum) >> 7);
-}
-
-DenoiserDecision DenoiserFilterC::MbDenoise(const uint8_t* mc_running_avg_y,
-                                            int mc_avg_y_stride,
-                                            uint8_t* running_avg_y,
-                                            int avg_y_stride,
-                                            const uint8_t* sig,
-                                            int sig_stride,
-                                            uint8_t motion_magnitude,
-                                            int increase_denoising) {
-  int sum_diff_thresh = 0;
-  int sum_diff = 0;
-  int adj_val[3] = {3, 4, 6};
-  int shift_inc1 = 0;
-  int shift_inc2 = 1;
-  int col_sum[16] = {0};
-  if (motion_magnitude <= kMotionMagnitudeThreshold) {
-    if (increase_denoising) {
-      shift_inc1 = 1;
-      shift_inc2 = 2;
-    }
-    adj_val[0] += shift_inc2;
-    adj_val[1] += shift_inc2;
-    adj_val[2] += shift_inc2;
-  }
-
-  for (int r = 0; r < 16; ++r) {
-    for (int c = 0; c < 16; ++c) {
-      int diff = 0;
-      int adjustment = 0;
-      int absdiff = 0;
-
-      diff = mc_running_avg_y[c] - sig[c];
-      absdiff = abs(diff);
-
-      // When |diff| <= |3 + shift_inc1|, use pixel value from
-      // last denoised raw.
-      if (absdiff <= 3 + shift_inc1) {
-        running_avg_y[c] = mc_running_avg_y[c];
-        col_sum[c] += diff;
-      } else {
-        if (absdiff >= 4 + shift_inc1 && absdiff <= 7)
-          adjustment = adj_val[0];
-        else if (absdiff >= 8 && absdiff <= 15)
-          adjustment = adj_val[1];
-        else
-          adjustment = adj_val[2];
-
-        if (diff > 0) {
-          if ((sig[c] + adjustment) > 255)
-            running_avg_y[c] = 255;
-          else
-            running_avg_y[c] = sig[c] + adjustment;
-
-          col_sum[c] += adjustment;
-        } else {
-          if ((sig[c] - adjustment) < 0)
-            running_avg_y[c] = 0;
-          else
-            running_avg_y[c] = sig[c] - adjustment;
-
-          col_sum[c] -= adjustment;
-        }
-      }
-    }
-
-    // Update pointers for next iteration.
-    sig += sig_stride;
-    mc_running_avg_y += mc_avg_y_stride;
-    running_avg_y += avg_y_stride;
-  }
-
-  for (int c = 0; c < 16; ++c) {
-    if (col_sum[c] >= 128) {
-      col_sum[c] = 127;
-    }
-    sum_diff += col_sum[c];
-  }
-
-  sum_diff_thresh =
-      increase_denoising ? kSumDiffThresholdHigh : kSumDiffThreshold;
-  if (abs(sum_diff) > sum_diff_thresh)
-    return COPY_BLOCK;
-
-  return FILTER_BLOCK;
-}
-
-}  // namespace webrtc
diff --git a/modules/video_processing/util/denoiser_filter_c.h b/modules/video_processing/util/denoiser_filter_c.h
deleted file mode 100644
index 859c6f4..0000000
--- a/modules/video_processing/util/denoiser_filter_c.h
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- *  Copyright (c) 2015 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_VIDEO_PROCESSING_UTIL_DENOISER_FILTER_C_H_
-#define WEBRTC_MODULES_VIDEO_PROCESSING_UTIL_DENOISER_FILTER_C_H_
-
-#include "webrtc/modules/video_processing/util/denoiser_filter.h"
-
-namespace webrtc {
-
-class DenoiserFilterC : public DenoiserFilter {
- public:
-  DenoiserFilterC() {}
-  void CopyMem16x16(const uint8_t* src,
-                    int src_stride,
-                    uint8_t* dst,
-                    int dst_stride) override;
-  uint32_t Variance16x8(const uint8_t* a,
-                        int a_stride,
-                        const uint8_t* b,
-                        int b_stride,
-                        unsigned int* sse) override;
-  DenoiserDecision MbDenoise(const uint8_t* mc_running_avg_y,
-                             int mc_avg_y_stride,
-                             uint8_t* running_avg_y,
-                             int avg_y_stride,
-                             const uint8_t* sig,
-                             int sig_stride,
-                             uint8_t motion_magnitude,
-                             int increase_denoising) override;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_VIDEO_PROCESSING_UTIL_DENOISER_FILTER_C_H_
diff --git a/modules/video_processing/util/denoiser_filter_neon.cc b/modules/video_processing/util/denoiser_filter_neon.cc
deleted file mode 100644
index b9e6b8c..0000000
--- a/modules/video_processing/util/denoiser_filter_neon.cc
+++ /dev/null
@@ -1,195 +0,0 @@
-/*
- *  Copyright (c) 2015 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 <arm_neon.h>
-
-#include "webrtc/modules/video_processing/util/denoiser_filter_neon.h"
-
-namespace webrtc {
-
-const int kSumDiffThresholdHighNeon = 600;
-
-static int HorizontalAddS16x8(const int16x8_t v_16x8) {
-  const int32x4_t a = vpaddlq_s16(v_16x8);
-  const int64x2_t b = vpaddlq_s32(a);
-  const int32x2_t c = vadd_s32(vreinterpret_s32_s64(vget_low_s64(b)),
-                               vreinterpret_s32_s64(vget_high_s64(b)));
-  return vget_lane_s32(c, 0);
-}
-
-static int HorizontalAddS32x4(const int32x4_t v_32x4) {
-  const int64x2_t b = vpaddlq_s32(v_32x4);
-  const int32x2_t c = vadd_s32(vreinterpret_s32_s64(vget_low_s64(b)),
-                               vreinterpret_s32_s64(vget_high_s64(b)));
-  return vget_lane_s32(c, 0);
-}
-
-static void VarianceNeonW8(const uint8_t* a,
-                           int a_stride,
-                           const uint8_t* b,
-                           int b_stride,
-                           int w,
-                           int h,
-                           uint32_t* sse,
-                           int64_t* sum) {
-  int16x8_t v_sum = vdupq_n_s16(0);
-  int32x4_t v_sse_lo = vdupq_n_s32(0);
-  int32x4_t v_sse_hi = vdupq_n_s32(0);
-
-  for (int i = 0; i < h; ++i) {
-    for (int j = 0; j < w; j += 8) {
-      const uint8x8_t v_a = vld1_u8(&a[j]);
-      const uint8x8_t v_b = vld1_u8(&b[j]);
-      const uint16x8_t v_diff = vsubl_u8(v_a, v_b);
-      const int16x8_t sv_diff = vreinterpretq_s16_u16(v_diff);
-      v_sum = vaddq_s16(v_sum, sv_diff);
-      v_sse_lo =
-          vmlal_s16(v_sse_lo, vget_low_s16(sv_diff), vget_low_s16(sv_diff));
-      v_sse_hi =
-          vmlal_s16(v_sse_hi, vget_high_s16(sv_diff), vget_high_s16(sv_diff));
-    }
-    a += a_stride;
-    b += b_stride;
-  }
-
-  *sum = HorizontalAddS16x8(v_sum);
-  *sse =
-      static_cast<uint32_t>(HorizontalAddS32x4(vaddq_s32(v_sse_lo, v_sse_hi)));
-}
-
-void DenoiserFilterNEON::CopyMem16x16(const uint8_t* src,
-                                      int src_stride,
-                                      uint8_t* dst,
-                                      int dst_stride) {
-  uint8x16_t qtmp;
-  for (int r = 0; r < 16; r++) {
-    qtmp = vld1q_u8(src);
-    vst1q_u8(dst, qtmp);
-    src += src_stride;
-    dst += dst_stride;
-  }
-}
-
-uint32_t DenoiserFilterNEON::Variance16x8(const uint8_t* a,
-                                          int a_stride,
-                                          const uint8_t* b,
-                                          int b_stride,
-                                          uint32_t* sse) {
-  int64_t sum = 0;
-  VarianceNeonW8(a, a_stride << 1, b, b_stride << 1, 16, 8, sse, &sum);
-  return *sse - ((sum * sum) >> 7);
-}
-
-DenoiserDecision DenoiserFilterNEON::MbDenoise(const uint8_t* mc_running_avg_y,
-                                               int mc_running_avg_y_stride,
-                                               uint8_t* running_avg_y,
-                                               int running_avg_y_stride,
-                                               const uint8_t* sig,
-                                               int sig_stride,
-                                               uint8_t motion_magnitude,
-                                               int increase_denoising) {
-  // If motion_magnitude is small, making the denoiser more aggressive by
-  // increasing the adjustment for each level, level1 adjustment is
-  // increased, the deltas stay the same.
-  int shift_inc =
-      (increase_denoising && motion_magnitude <= kMotionMagnitudeThreshold) ? 1
-                                                                            : 0;
-  int sum_diff_thresh = 0;
-  const uint8x16_t v_level1_adjustment = vmovq_n_u8(
-      (motion_magnitude <= kMotionMagnitudeThreshold) ? 4 + shift_inc : 3);
-  const uint8x16_t v_delta_level_1_and_2 = vdupq_n_u8(1);
-  const uint8x16_t v_delta_level_2_and_3 = vdupq_n_u8(2);
-  const uint8x16_t v_level1_threshold = vmovq_n_u8(4 + shift_inc);
-  const uint8x16_t v_level2_threshold = vdupq_n_u8(8);
-  const uint8x16_t v_level3_threshold = vdupq_n_u8(16);
-  int64x2_t v_sum_diff_total = vdupq_n_s64(0);
-
-  // Go over lines.
-  for (int r = 0; r < 16; ++r) {
-    // Load inputs.
-    const uint8x16_t v_sig = vld1q_u8(sig);
-    const uint8x16_t v_mc_running_avg_y = vld1q_u8(mc_running_avg_y);
-
-    // Calculate absolute difference and sign masks.
-    const uint8x16_t v_abs_diff = vabdq_u8(v_sig, v_mc_running_avg_y);
-    const uint8x16_t v_diff_pos_mask = vcltq_u8(v_sig, v_mc_running_avg_y);
-    const uint8x16_t v_diff_neg_mask = vcgtq_u8(v_sig, v_mc_running_avg_y);
-
-    // Figure out which level that put us in.
-    const uint8x16_t v_level1_mask = vcleq_u8(v_level1_threshold, v_abs_diff);
-    const uint8x16_t v_level2_mask = vcleq_u8(v_level2_threshold, v_abs_diff);
-    const uint8x16_t v_level3_mask = vcleq_u8(v_level3_threshold, v_abs_diff);
-
-    // Calculate absolute adjustments for level 1, 2 and 3.
-    const uint8x16_t v_level2_adjustment =
-        vandq_u8(v_level2_mask, v_delta_level_1_and_2);
-    const uint8x16_t v_level3_adjustment =
-        vandq_u8(v_level3_mask, v_delta_level_2_and_3);
-    const uint8x16_t v_level1and2_adjustment =
-        vaddq_u8(v_level1_adjustment, v_level2_adjustment);
-    const uint8x16_t v_level1and2and3_adjustment =
-        vaddq_u8(v_level1and2_adjustment, v_level3_adjustment);
-
-    // Figure adjustment absolute value by selecting between the absolute
-    // difference if in level0 or the value for level 1, 2 and 3.
-    const uint8x16_t v_abs_adjustment =
-        vbslq_u8(v_level1_mask, v_level1and2and3_adjustment, v_abs_diff);
-
-    // Calculate positive and negative adjustments. Apply them to the signal
-    // and accumulate them. Adjustments are less than eight and the maximum
-    // sum of them (7 * 16) can fit in a signed char.
-    const uint8x16_t v_pos_adjustment =
-        vandq_u8(v_diff_pos_mask, v_abs_adjustment);
-    const uint8x16_t v_neg_adjustment =
-        vandq_u8(v_diff_neg_mask, v_abs_adjustment);
-
-    uint8x16_t v_running_avg_y = vqaddq_u8(v_sig, v_pos_adjustment);
-    v_running_avg_y = vqsubq_u8(v_running_avg_y, v_neg_adjustment);
-
-    // Store results.
-    vst1q_u8(running_avg_y, v_running_avg_y);
-
-    // Sum all the accumulators to have the sum of all pixel differences
-    // for this macroblock.
-    {
-      const int8x16_t v_sum_diff =
-          vqsubq_s8(vreinterpretq_s8_u8(v_pos_adjustment),
-                    vreinterpretq_s8_u8(v_neg_adjustment));
-      const int16x8_t fe_dc_ba_98_76_54_32_10 = vpaddlq_s8(v_sum_diff);
-      const int32x4_t fedc_ba98_7654_3210 =
-          vpaddlq_s16(fe_dc_ba_98_76_54_32_10);
-      const int64x2_t fedcba98_76543210 = vpaddlq_s32(fedc_ba98_7654_3210);
-
-      v_sum_diff_total = vqaddq_s64(v_sum_diff_total, fedcba98_76543210);
-    }
-
-    // Update pointers for next iteration.
-    sig += sig_stride;
-    mc_running_avg_y += mc_running_avg_y_stride;
-    running_avg_y += running_avg_y_stride;
-  }
-
-  // Too much adjustments => copy block.
-  int64x1_t x = vqadd_s64(vget_high_s64(v_sum_diff_total),
-                          vget_low_s64(v_sum_diff_total));
-  int sum_diff = vget_lane_s32(vabs_s32(vreinterpret_s32_s64(x)), 0);
-  sum_diff_thresh =
-      increase_denoising ? kSumDiffThresholdHighNeon : kSumDiffThreshold;
-  if (sum_diff > sum_diff_thresh)
-    return COPY_BLOCK;
-
-  // Tell above level that block was filtered.
-  running_avg_y -= running_avg_y_stride * 16;
-  sig -= sig_stride * 16;
-
-  return FILTER_BLOCK;
-}
-
-}  // namespace webrtc
diff --git a/modules/video_processing/util/denoiser_filter_neon.h b/modules/video_processing/util/denoiser_filter_neon.h
deleted file mode 100644
index 076cb79..0000000
--- a/modules/video_processing/util/denoiser_filter_neon.h
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- *  Copyright (c) 2015 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_VIDEO_PROCESSING_UTIL_DENOISER_FILTER_NEON_H_
-#define WEBRTC_MODULES_VIDEO_PROCESSING_UTIL_DENOISER_FILTER_NEON_H_
-
-#include "webrtc/modules/video_processing/util/denoiser_filter.h"
-
-namespace webrtc {
-
-class DenoiserFilterNEON : public DenoiserFilter {
- public:
-  DenoiserFilterNEON() {}
-  void CopyMem16x16(const uint8_t* src,
-                    int src_stride,
-                    uint8_t* dst,
-                    int dst_stride) override;
-  uint32_t Variance16x8(const uint8_t* a,
-                        int a_stride,
-                        const uint8_t* b,
-                        int b_stride,
-                        unsigned int* sse) override;
-  DenoiserDecision MbDenoise(const uint8_t* mc_running_avg_y,
-                             int mc_avg_y_stride,
-                             uint8_t* running_avg_y,
-                             int avg_y_stride,
-                             const uint8_t* sig,
-                             int sig_stride,
-                             uint8_t motion_magnitude,
-                             int increase_denoising) override;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_VIDEO_PROCESSING_UTIL_DENOISER_FILTER_NEON_H_
diff --git a/modules/video_processing/util/denoiser_filter_sse2.cc b/modules/video_processing/util/denoiser_filter_sse2.cc
deleted file mode 100644
index 2e59e36..0000000
--- a/modules/video_processing/util/denoiser_filter_sse2.cc
+++ /dev/null
@@ -1,209 +0,0 @@
-/*
- *  Copyright (c) 2015 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 <emmintrin.h>
-#include "webrtc/modules/video_processing/util/denoiser_filter_sse2.h"
-
-namespace webrtc {
-
-static void Get8x8varSse2(const uint8_t* src,
-                          int src_stride,
-                          const uint8_t* ref,
-                          int ref_stride,
-                          unsigned int* sse,
-                          int* sum) {
-  const __m128i zero = _mm_setzero_si128();
-  __m128i vsum = _mm_setzero_si128();
-  __m128i vsse = _mm_setzero_si128();
-
-  for (int i = 0; i < 8; i += 2) {
-    const __m128i src0 = _mm_unpacklo_epi8(
-        _mm_loadl_epi64((const __m128i*)(src + i * src_stride)), zero);
-    const __m128i ref0 = _mm_unpacklo_epi8(
-        _mm_loadl_epi64((const __m128i*)(ref + i * ref_stride)), zero);
-    const __m128i diff0 = _mm_sub_epi16(src0, ref0);
-
-    const __m128i src1 = _mm_unpacklo_epi8(
-        _mm_loadl_epi64((const __m128i*)(src + (i + 1) * src_stride)), zero);
-    const __m128i ref1 = _mm_unpacklo_epi8(
-        _mm_loadl_epi64((const __m128i*)(ref + (i + 1) * ref_stride)), zero);
-    const __m128i diff1 = _mm_sub_epi16(src1, ref1);
-
-    vsum = _mm_add_epi16(vsum, diff0);
-    vsum = _mm_add_epi16(vsum, diff1);
-    vsse = _mm_add_epi32(vsse, _mm_madd_epi16(diff0, diff0));
-    vsse = _mm_add_epi32(vsse, _mm_madd_epi16(diff1, diff1));
-  }
-
-  // sum
-  vsum = _mm_add_epi16(vsum, _mm_srli_si128(vsum, 8));
-  vsum = _mm_add_epi16(vsum, _mm_srli_si128(vsum, 4));
-  vsum = _mm_add_epi16(vsum, _mm_srli_si128(vsum, 2));
-  *sum = static_cast<int16_t>(_mm_extract_epi16(vsum, 0));
-
-  // sse
-  vsse = _mm_add_epi32(vsse, _mm_srli_si128(vsse, 8));
-  vsse = _mm_add_epi32(vsse, _mm_srli_si128(vsse, 4));
-  *sse = _mm_cvtsi128_si32(vsse);
-}
-
-static void VarianceSSE2(const unsigned char* src,
-                         int src_stride,
-                         const unsigned char* ref,
-                         int ref_stride,
-                         int w,
-                         int h,
-                         uint32_t* sse,
-                         int64_t* sum,
-                         int block_size) {
-  *sse = 0;
-  *sum = 0;
-
-  for (int i = 0; i < h; i += block_size) {
-    for (int j = 0; j < w; j += block_size) {
-      uint32_t sse0 = 0;
-      int32_t sum0 = 0;
-
-      Get8x8varSse2(src + src_stride * i + j, src_stride,
-                    ref + ref_stride * i + j, ref_stride, &sse0, &sum0);
-      *sse += sse0;
-      *sum += sum0;
-    }
-  }
-}
-
-// Compute the sum of all pixel differences of this MB.
-static uint32_t AbsSumDiff16x1(__m128i acc_diff) {
-  const __m128i k_1 = _mm_set1_epi16(1);
-  const __m128i acc_diff_lo =
-      _mm_srai_epi16(_mm_unpacklo_epi8(acc_diff, acc_diff), 8);
-  const __m128i acc_diff_hi =
-      _mm_srai_epi16(_mm_unpackhi_epi8(acc_diff, acc_diff), 8);
-  const __m128i acc_diff_16 = _mm_add_epi16(acc_diff_lo, acc_diff_hi);
-  const __m128i hg_fe_dc_ba = _mm_madd_epi16(acc_diff_16, k_1);
-  const __m128i hgfe_dcba =
-      _mm_add_epi32(hg_fe_dc_ba, _mm_srli_si128(hg_fe_dc_ba, 8));
-  const __m128i hgfedcba =
-      _mm_add_epi32(hgfe_dcba, _mm_srli_si128(hgfe_dcba, 4));
-  unsigned int sum_diff = abs(_mm_cvtsi128_si32(hgfedcba));
-
-  return sum_diff;
-}
-
-// TODO(jackychen): Optimize this function using SSE2.
-void DenoiserFilterSSE2::CopyMem16x16(const uint8_t* src,
-                                      int src_stride,
-                                      uint8_t* dst,
-                                      int dst_stride) {
-  for (int i = 0; i < 16; i++) {
-    memcpy(dst, src, 16);
-    src += src_stride;
-    dst += dst_stride;
-  }
-}
-
-uint32_t DenoiserFilterSSE2::Variance16x8(const uint8_t* src,
-                                          int src_stride,
-                                          const uint8_t* ref,
-                                          int ref_stride,
-                                          uint32_t* sse) {
-  int64_t sum = 0;
-  VarianceSSE2(src, src_stride << 1, ref, ref_stride << 1, 16, 8, sse, &sum, 8);
-  return *sse - ((sum * sum) >> 7);
-}
-
-DenoiserDecision DenoiserFilterSSE2::MbDenoise(const uint8_t* mc_running_avg_y,
-                                               int mc_avg_y_stride,
-                                               uint8_t* running_avg_y,
-                                               int avg_y_stride,
-                                               const uint8_t* sig,
-                                               int sig_stride,
-                                               uint8_t motion_magnitude,
-                                               int increase_denoising) {
-  DenoiserDecision decision = FILTER_BLOCK;
-  unsigned int sum_diff_thresh = 0;
-  int shift_inc =
-      (increase_denoising && motion_magnitude <= kMotionMagnitudeThreshold) ? 1
-                                                                            : 0;
-  __m128i acc_diff = _mm_setzero_si128();
-  const __m128i k_0 = _mm_setzero_si128();
-  const __m128i k_4 = _mm_set1_epi8(4 + shift_inc);
-  const __m128i k_8 = _mm_set1_epi8(8);
-  const __m128i k_16 = _mm_set1_epi8(16);
-  // Modify each level's adjustment according to motion_magnitude.
-  const __m128i l3 = _mm_set1_epi8(
-      (motion_magnitude <= kMotionMagnitudeThreshold) ? 7 + shift_inc : 6);
-  // Difference between level 3 and level 2 is 2.
-  const __m128i l32 = _mm_set1_epi8(2);
-  // Difference between level 2 and level 1 is 1.
-  const __m128i l21 = _mm_set1_epi8(1);
-
-  for (int r = 0; r < 16; ++r) {
-    // Calculate differences.
-    const __m128i v_sig =
-        _mm_loadu_si128(reinterpret_cast<const __m128i*>(&sig[0]));
-    const __m128i v_mc_running_avg_y =
-        _mm_loadu_si128(reinterpret_cast<const __m128i*>(&mc_running_avg_y[0]));
-    __m128i v_running_avg_y;
-    const __m128i pdiff = _mm_subs_epu8(v_mc_running_avg_y, v_sig);
-    const __m128i ndiff = _mm_subs_epu8(v_sig, v_mc_running_avg_y);
-    // Obtain the sign. FF if diff is negative.
-    const __m128i diff_sign = _mm_cmpeq_epi8(pdiff, k_0);
-    // Clamp absolute difference to 16 to be used to get mask. Doing this
-    // allows us to use _mm_cmpgt_epi8, which operates on signed byte.
-    const __m128i clamped_absdiff =
-        _mm_min_epu8(_mm_or_si128(pdiff, ndiff), k_16);
-    // Get masks for l2 l1 and l0 adjustments.
-    const __m128i mask2 = _mm_cmpgt_epi8(k_16, clamped_absdiff);
-    const __m128i mask1 = _mm_cmpgt_epi8(k_8, clamped_absdiff);
-    const __m128i mask0 = _mm_cmpgt_epi8(k_4, clamped_absdiff);
-    // Get adjustments for l2, l1, and l0.
-    __m128i adj2 = _mm_and_si128(mask2, l32);
-    const __m128i adj1 = _mm_and_si128(mask1, l21);
-    const __m128i adj0 = _mm_and_si128(mask0, clamped_absdiff);
-    __m128i adj, padj, nadj;
-
-    // Combine the adjustments and get absolute adjustments.
-    adj2 = _mm_add_epi8(adj2, adj1);
-    adj = _mm_sub_epi8(l3, adj2);
-    adj = _mm_andnot_si128(mask0, adj);
-    adj = _mm_or_si128(adj, adj0);
-
-    // Restore the sign and get positive and negative adjustments.
-    padj = _mm_andnot_si128(diff_sign, adj);
-    nadj = _mm_and_si128(diff_sign, adj);
-
-    // Calculate filtered value.
-    v_running_avg_y = _mm_adds_epu8(v_sig, padj);
-    v_running_avg_y = _mm_subs_epu8(v_running_avg_y, nadj);
-    _mm_storeu_si128(reinterpret_cast<__m128i*>(running_avg_y),
-                     v_running_avg_y);
-
-    // Adjustments <=7, and each element in acc_diff can fit in signed
-    // char.
-    acc_diff = _mm_adds_epi8(acc_diff, padj);
-    acc_diff = _mm_subs_epi8(acc_diff, nadj);
-
-    // Update pointers for next iteration.
-    sig += sig_stride;
-    mc_running_avg_y += mc_avg_y_stride;
-    running_avg_y += avg_y_stride;
-  }
-
-  // Compute the sum of all pixel differences of this MB.
-  unsigned int abs_sum_diff = AbsSumDiff16x1(acc_diff);
-  sum_diff_thresh =
-      increase_denoising ? kSumDiffThresholdHigh : kSumDiffThreshold;
-  if (abs_sum_diff > sum_diff_thresh)
-    decision = COPY_BLOCK;
-  return decision;
-}
-
-}  // namespace webrtc
diff --git a/modules/video_processing/util/denoiser_filter_sse2.h b/modules/video_processing/util/denoiser_filter_sse2.h
deleted file mode 100644
index 5b2d957..0000000
--- a/modules/video_processing/util/denoiser_filter_sse2.h
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- *  Copyright (c) 2015 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_VIDEO_PROCESSING_UTIL_DENOISER_FILTER_SSE2_H_
-#define WEBRTC_MODULES_VIDEO_PROCESSING_UTIL_DENOISER_FILTER_SSE2_H_
-
-#include "webrtc/modules/video_processing/util/denoiser_filter.h"
-
-namespace webrtc {
-
-class DenoiserFilterSSE2 : public DenoiserFilter {
- public:
-  DenoiserFilterSSE2() {}
-  void CopyMem16x16(const uint8_t* src,
-                    int src_stride,
-                    uint8_t* dst,
-                    int dst_stride) override;
-  uint32_t Variance16x8(const uint8_t* a,
-                        int a_stride,
-                        const uint8_t* b,
-                        int b_stride,
-                        unsigned int* sse) override;
-  DenoiserDecision MbDenoise(const uint8_t* mc_running_avg_y,
-                             int mc_avg_y_stride,
-                             uint8_t* running_avg_y,
-                             int avg_y_stride,
-                             const uint8_t* sig,
-                             int sig_stride,
-                             uint8_t motion_magnitude,
-                             int increase_denoising) override;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_VIDEO_PROCESSING_UTIL_DENOISER_FILTER_SSE2_H_
diff --git a/modules/video_processing/util/noise_estimation.cc b/modules/video_processing/util/noise_estimation.cc
deleted file mode 100644
index 3b0d59e..0000000
--- a/modules/video_processing/util/noise_estimation.cc
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- *  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/video_processing/util/noise_estimation.h"
-#if DISPLAYNEON
-#include <android/log.h>
-#endif
-
-namespace webrtc {
-
-void NoiseEstimation::Init(int width, int height, CpuType cpu_type) {
-  int mb_cols = width >> 4;
-  int mb_rows = height >> 4;
-  consec_low_var_.reset(new uint32_t[mb_cols * mb_rows]());
-  width_ = width;
-  height_ = height;
-  mb_cols_ = width_ >> 4;
-  mb_rows_ = height_ >> 4;
-  cpu_type_ = cpu_type;
-}
-
-void NoiseEstimation::GetNoise(int mb_index, uint32_t var, uint32_t luma) {
-  consec_low_var_[mb_index]++;
-  num_static_block_++;
-  if (consec_low_var_[mb_index] >= kConsecLowVarFrame &&
-      (luma >> 6) < kAverageLumaMax && (luma >> 6) > kAverageLumaMin) {
-    // Normalized var by the average luma value, this gives more weight to
-    // darker blocks.
-    int nor_var = var / (luma >> 10);
-    noise_var_ +=
-        nor_var > kBlockSelectionVarMax ? kBlockSelectionVarMax : nor_var;
-    num_noisy_block_++;
-  }
-}
-
-void NoiseEstimation::ResetConsecLowVar(int mb_index) {
-  consec_low_var_[mb_index] = 0;
-}
-
-void NoiseEstimation::UpdateNoiseLevel() {
-  // TODO(jackychen): Tune a threshold for numb_noisy_block > T to make the
-  // condition more reasonable.
-  // No enough samples implies the motion of the camera or too many moving
-  // objects in the frame.
-  if (num_static_block_ <
-          (0.65 * mb_cols_ * mb_rows_ / NOISE_SUBSAMPLE_INTERVAL) ||
-      !num_noisy_block_) {
-#if DISPLAY
-    printf("Not enough samples. %d \n", num_static_block_);
-#elif DISPLAYNEON
-    __android_log_print(ANDROID_LOG_DEBUG, "DISPLAY",
-                        "Not enough samples. %d \n", num_static_block_);
-#endif
-    noise_var_ = 0;
-    noise_var_accum_ = 0;
-    num_noisy_block_ = 0;
-    num_static_block_ = 0;
-    return;
-  } else {
-#if DISPLAY
-    printf("%d %d fraction = %.3f\n", num_static_block_,
-           mb_cols_ * mb_rows_ / NOISE_SUBSAMPLE_INTERVAL,
-           percent_static_block_);
-#elif DISPLAYNEON
-    __android_log_print(ANDROID_LOG_DEBUG, "DISPLAY", "%d %d fraction = %.3f\n",
-                        num_static_block_,
-                        mb_cols_ * mb_rows_ / NOISE_SUBSAMPLE_INTERVAL,
-                        percent_static_block_);
-#endif
-    // Normalized by the number of noisy blocks.
-    noise_var_ /= num_noisy_block_;
-    // Get the percentage of static blocks.
-    percent_static_block_ = static_cast<double>(num_static_block_) /
-                            (mb_cols_ * mb_rows_ / NOISE_SUBSAMPLE_INTERVAL);
-    num_noisy_block_ = 0;
-    num_static_block_ = 0;
-  }
-  // For the first frame just update the value with current noise_var_,
-  // otherwise, use the averaging window.
-  if (noise_var_accum_ == 0) {
-    noise_var_accum_ = noise_var_;
-  } else {
-    noise_var_accum_ = (noise_var_accum_ * 15 + noise_var_) / 16;
-  }
-#if DISPLAY
-  printf("noise_var_accum_ = %.1f, noise_var_ = %d.\n", noise_var_accum_,
-         noise_var_);
-#elif DISPLAYNEON
-  __android_log_print(ANDROID_LOG_DEBUG, "DISPLAY",
-                      "noise_var_accum_ = %.1f, noise_var_ = %d.\n",
-                      noise_var_accum_, noise_var_);
-#endif
-  // Reset noise_var_ for the next frame.
-  noise_var_ = 0;
-}
-
-uint8_t NoiseEstimation::GetNoiseLevel() {
-  int noise_thr = cpu_type_ ? kNoiseThreshold : kNoiseThresholdNeon;
-  UpdateNoiseLevel();
-  if (noise_var_accum_ > noise_thr) {
-    return 1;
-  }
-  return 0;
-}
-
-}  // namespace webrtc
diff --git a/modules/video_processing/util/noise_estimation.h b/modules/video_processing/util/noise_estimation.h
deleted file mode 100644
index f414a47..0000000
--- a/modules/video_processing/util/noise_estimation.h
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- *  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_VIDEO_PROCESSING_UTIL_NOISE_ESTIMATION_H_
-#define WEBRTC_MODULES_VIDEO_PROCESSING_UTIL_NOISE_ESTIMATION_H_
-
-#include <memory>
-
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/modules/video_processing/util/denoiser_filter.h"
-
-namespace webrtc {
-
-#define DISPLAY 0      // Rectangle diagnostics
-#define DISPLAYNEON 0  // Rectangle diagnostics on NEON
-
-const int kNoiseThreshold = 150;
-const int kNoiseThresholdNeon = 70;
-const int kConsecLowVarFrame = 6;
-const int kAverageLumaMin = 20;
-const int kAverageLumaMax = 220;
-const int kBlockSelectionVarMax = kNoiseThreshold << 1;
-
-// TODO(jackychen): To test different sampling strategy.
-// Collect noise data every NOISE_SUBSAMPLE_INTERVAL blocks.
-#define NOISE_SUBSAMPLE_INTERVAL 41
-
-class NoiseEstimation {
- public:
-  void Init(int width, int height, CpuType cpu_type);
-  // Collect noise data from one qualified block.
-  void GetNoise(int mb_index, uint32_t var, uint32_t luma);
-  // Reset the counter for consecutive low-var blocks.
-  void ResetConsecLowVar(int mb_index);
-  // Update noise level for current frame.
-  void UpdateNoiseLevel();
-  // 0: low noise, 1: high noise
-  uint8_t GetNoiseLevel();
-
- private:
-  int width_;
-  int height_;
-  int mb_rows_;
-  int mb_cols_;
-  int num_noisy_block_;
-  int num_static_block_;
-  CpuType cpu_type_;
-  uint32_t noise_var_;
-  double noise_var_accum_;
-  double percent_static_block_;
-  std::unique_ptr<uint32_t[]> consec_low_var_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_VIDEO_PROCESSING_UTIL_NOISE_ESTIMATION_H_
diff --git a/modules/video_processing/util/skin_detection.cc b/modules/video_processing/util/skin_detection.cc
deleted file mode 100644
index ac9a81f..0000000
--- a/modules/video_processing/util/skin_detection.cc
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- *  Copyright (c) 2015 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 <limits.h>
-#include <math.h>
-
-#include "webrtc/modules/video_processing/util/skin_detection.h"
-
-namespace webrtc {
-
-// Fixed-point skin color model parameters.
-static const int skin_mean[5][2] = {
-    {7463, 9614}, {6400, 10240}, {7040, 10240}, {8320, 9280}, {6800, 9614}};
-static const int skin_inv_cov[4] = {4107, 1663, 1663, 2157};  // q16
-static const int skin_threshold[6] = {1570636, 1400000, 800000, 800000, 800000,
-    800000};  // q18
-
-// Thresholds on luminance.
-static const int y_low = 40;
-static const int y_high = 220;
-
-// Evaluates the Mahalanobis distance measure for the input CbCr values.
-static int EvaluateSkinColorDifference(int cb, int cr, int idx) {
-  const int cb_q6 = cb << 6;
-  const int cr_q6 = cr << 6;
-  const int cb_diff_q12 =
-      (cb_q6 - skin_mean[idx][0]) * (cb_q6 - skin_mean[idx][0]);
-  const int cbcr_diff_q12 =
-      (cb_q6 - skin_mean[idx][0]) * (cr_q6 - skin_mean[idx][1]);
-  const int cr_diff_q12 =
-      (cr_q6 - skin_mean[idx][1]) * (cr_q6 - skin_mean[idx][1]);
-  const int cb_diff_q2 = (cb_diff_q12 + (1 << 9)) >> 10;
-  const int cbcr_diff_q2 = (cbcr_diff_q12 + (1 << 9)) >> 10;
-  const int cr_diff_q2 = (cr_diff_q12 + (1 << 9)) >> 10;
-  const int skin_diff = skin_inv_cov[0] * cb_diff_q2 +
-      skin_inv_cov[1] * cbcr_diff_q2 +
-      skin_inv_cov[2] * cbcr_diff_q2 +
-      skin_inv_cov[3] * cr_diff_q2;
-  return skin_diff;
-}
-
-static int SkinPixel(const uint8_t y, const uint8_t cb, const uint8_t cr) {
-  if (y < y_low || y > y_high) {
-    return 0;
-  } else {
-    if (MODEL_MODE == 0) {
-      return (EvaluateSkinColorDifference(cb, cr, 0) < skin_threshold[0]);
-    } else {
-      // Exit on grey.
-      if (cb == 128 && cr == 128)
-        return 0;
-      // Exit on very strong cb.
-      if (cb > 150 && cr < 110)
-        return 0;
-      // Exit on (another) low luminance threshold if either color is high.
-      if (y < 50 && (cb > 140 || cr > 140))
-        return 0;
-      for (int i = 0; i < 5; i++) {
-        int diff = EvaluateSkinColorDifference(cb, cr, i);
-        if (diff < skin_threshold[i + 1]) {
-          return 1;
-        } else if (diff > (skin_threshold[i + 1] << 3)) {
-          // Exit if difference is much large than the threshold.
-          return 0;
-        }
-      }
-      return 0;
-    }
-  }
-}
-
-bool MbHasSkinColor(const uint8_t* y_src,
-                    const uint8_t* u_src,
-                    const uint8_t* v_src,
-                    const int stride_y,
-                    const int stride_u,
-                    const int stride_v,
-                    const int mb_row,
-                    const int mb_col) {
-  const uint8_t* y = y_src + ((mb_row << 4) + 8) * stride_y + (mb_col << 4) + 8;
-  const uint8_t* u = u_src + ((mb_row << 3) + 4) * stride_u + (mb_col << 3) + 4;
-  const uint8_t* v = v_src + ((mb_row << 3) + 4) * stride_v + (mb_col << 3) + 4;
-  // Use 2x2 average of center pixel to compute skin area.
-  uint8_t y_avg = (*y + *(y + 1) + *(y + stride_y) + *(y + stride_y + 1)) >> 2;
-  uint8_t u_avg = (*u + *(u + 1) + *(u + stride_u) + *(u + stride_u + 1)) >> 2;
-  uint8_t v_avg = (*v + *(v + 1) + *(v + stride_v) + *(v + stride_v + 1)) >> 2;
-  return SkinPixel(y_avg, u_avg, v_avg) == 1;
-}
-
-}  // namespace webrtc
diff --git a/modules/video_processing/util/skin_detection.h b/modules/video_processing/util/skin_detection.h
deleted file mode 100755
index f925d33..0000000
--- a/modules/video_processing/util/skin_detection.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- *  Copyright (c) 2015 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_VIDEO_PROCESSING_UTIL_SKIN_DETECTION_H_
-#define WEBRTC_MODULES_VIDEO_PROCESSING_UTIL_SKIN_DETECTION_H_
-
-namespace webrtc {
-
-#define MODEL_MODE 0
-
-typedef unsigned char uint8_t;
-bool MbHasSkinColor(const uint8_t* y_src,
-                    const uint8_t* u_src,
-                    const uint8_t* v_src,
-                    const int stride_y,
-                    const int stride_u,
-                    const int stride_v,
-                    const int mb_row,
-                    const int mb_col);
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_VIDEO_PROCESSING_UTIL_SKIN_DETECTION_H_
diff --git a/modules/video_processing/video_denoiser.cc b/modules/video_processing/video_denoiser.cc
deleted file mode 100644
index a926bf4..0000000
--- a/modules/video_processing/video_denoiser.cc
+++ /dev/null
@@ -1,345 +0,0 @@
-/*
- *  Copyright (c) 2015 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/common_video/libyuv/include/webrtc_libyuv.h"
-#include "webrtc/modules/video_processing/video_denoiser.h"
-#include "libyuv/planar_functions.h"
-
-namespace webrtc {
-
-#if DISPLAY || DISPLAYNEON
-static void CopyMem8x8(const uint8_t* src,
-                       int src_stride,
-                       uint8_t* dst,
-                       int dst_stride) {
-  for (int i = 0; i < 8; i++) {
-    memcpy(dst, src, 8);
-    src += src_stride;
-    dst += dst_stride;
-  }
-}
-
-static void ShowRect(const std::unique_ptr<DenoiserFilter>& filter,
-                     const std::unique_ptr<uint8_t[]>& d_status,
-                     const std::unique_ptr<uint8_t[]>& moving_edge_red,
-                     const std::unique_ptr<uint8_t[]>& x_density,
-                     const std::unique_ptr<uint8_t[]>& y_density,
-                     const uint8_t* u_src, int stride_u_src,
-                     const uint8_t* v_src, int stride_v_src,
-                     uint8_t* u_dst, int stride_u_dst,
-                     uint8_t* v_dst, int stride_v_dst,
-                     int mb_rows_,
-                     int mb_cols_) {
-  for (int mb_row = 0; mb_row < mb_rows_; ++mb_row) {
-    for (int mb_col = 0; mb_col < mb_cols_; ++mb_col) {
-      int mb_index = mb_row * mb_cols_ + mb_col;
-      const uint8_t* mb_src_u =
-          u_src + (mb_row << 3) * stride_u_src + (mb_col << 3);
-      const uint8_t* mb_src_v =
-          v_src + (mb_row << 3) * stride_v_src + (mb_col << 3);
-      uint8_t* mb_dst_u = u_dst + (mb_row << 3) * stride_u_dst + (mb_col << 3);
-      uint8_t* mb_dst_v = v_dst + (mb_row << 3) * stride_v_dst + (mb_col << 3);
-      uint8_t uv_tmp[8 * 8];
-      memset(uv_tmp, 200, 8 * 8);
-      if (d_status[mb_index] == 1) {
-        // Paint to red.
-        CopyMem8x8(mb_src_u, stride_u_src, mb_dst_u, stride_u_dst);
-        CopyMem8x8(uv_tmp, 8, mb_dst_v, stride_v_dst);
-      } else if (moving_edge_red[mb_row * mb_cols_ + mb_col] &&
-                 x_density[mb_col] * y_density[mb_row]) {
-        // Paint to blue.
-        CopyMem8x8(uv_tmp, 8, mb_dst_u, stride_u_dst);
-        CopyMem8x8(mb_src_v, stride_v_src, mb_dst_v, stride_v_dst);
-      } else {
-        CopyMem8x8(mb_src_u, stride_u_src, mb_dst_u, stride_u_dst);
-        CopyMem8x8(mb_src_v, stride_v_src, mb_dst_v, stride_v_dst);
-      }
-    }
-  }
-}
-#endif
-
-VideoDenoiser::VideoDenoiser(bool runtime_cpu_detection)
-    : width_(0),
-      height_(0),
-      filter_(DenoiserFilter::Create(runtime_cpu_detection, &cpu_type_)),
-      ne_(new NoiseEstimation()) {}
-
-void VideoDenoiser::DenoiserReset(
-    rtc::scoped_refptr<I420BufferInterface> frame) {
-  width_ = frame->width();
-  height_ = frame->height();
-  mb_cols_ = width_ >> 4;
-  mb_rows_ = height_ >> 4;
-
-  // Init noise estimator and allocate buffers.
-  ne_->Init(width_, height_, cpu_type_);
-  moving_edge_.reset(new uint8_t[mb_cols_ * mb_rows_]);
-  mb_filter_decision_.reset(new DenoiserDecision[mb_cols_ * mb_rows_]);
-  x_density_.reset(new uint8_t[mb_cols_]);
-  y_density_.reset(new uint8_t[mb_rows_]);
-  moving_object_.reset(new uint8_t[mb_cols_ * mb_rows_]);
-}
-
-int VideoDenoiser::PositionCheck(int mb_row, int mb_col, int noise_level) {
-  if (noise_level == 0)
-    return 1;
-  if ((mb_row <= (mb_rows_ >> 4)) || (mb_col <= (mb_cols_ >> 4)) ||
-      (mb_col >= (15 * mb_cols_ >> 4)))
-    return 3;
-  else if ((mb_row <= (mb_rows_ >> 3)) || (mb_col <= (mb_cols_ >> 3)) ||
-           (mb_col >= (7 * mb_cols_ >> 3)))
-    return 2;
-  else
-    return 1;
-}
-
-void VideoDenoiser::ReduceFalseDetection(
-    const std::unique_ptr<uint8_t[]>& d_status,
-    std::unique_ptr<uint8_t[]>* moving_edge_red,
-    int noise_level) {
-  // From up left corner.
-  int mb_col_stop = mb_cols_ - 1;
-  for (int mb_row = 0; mb_row <= mb_rows_ - 1; ++mb_row) {
-    for (int mb_col = 0; mb_col <= mb_col_stop; ++mb_col) {
-      if (d_status[mb_row * mb_cols_ + mb_col]) {
-        mb_col_stop = mb_col - 1;
-        break;
-      }
-      (*moving_edge_red)[mb_row * mb_cols_ + mb_col] = 0;
-    }
-  }
-  // From bottom left corner.
-  mb_col_stop = mb_cols_ - 1;
-  for (int mb_row = mb_rows_ - 1; mb_row >= 0; --mb_row) {
-    for (int mb_col = 0; mb_col <= mb_col_stop; ++mb_col) {
-      if (d_status[mb_row * mb_cols_ + mb_col]) {
-        mb_col_stop = mb_col - 1;
-        break;
-      }
-      (*moving_edge_red)[mb_row * mb_cols_ + mb_col] = 0;
-    }
-  }
-  // From up right corner.
-  mb_col_stop = 0;
-  for (int mb_row = 0; mb_row <= mb_rows_ - 1; ++mb_row) {
-    for (int mb_col = mb_cols_ - 1; mb_col >= mb_col_stop; --mb_col) {
-      if (d_status[mb_row * mb_cols_ + mb_col]) {
-        mb_col_stop = mb_col + 1;
-        break;
-      }
-      (*moving_edge_red)[mb_row * mb_cols_ + mb_col] = 0;
-    }
-  }
-  // From bottom right corner.
-  mb_col_stop = 0;
-  for (int mb_row = mb_rows_ - 1; mb_row >= 0; --mb_row) {
-    for (int mb_col = mb_cols_ - 1; mb_col >= mb_col_stop; --mb_col) {
-      if (d_status[mb_row * mb_cols_ + mb_col]) {
-        mb_col_stop = mb_col + 1;
-        break;
-      }
-      (*moving_edge_red)[mb_row * mb_cols_ + mb_col] = 0;
-    }
-  }
-}
-
-bool VideoDenoiser::IsTrailingBlock(const std::unique_ptr<uint8_t[]>& d_status,
-                                    int mb_row,
-                                    int mb_col) {
-  bool ret = false;
-  int mb_index = mb_row * mb_cols_ + mb_col;
-  if (!mb_row || !mb_col || mb_row == mb_rows_ - 1 || mb_col == mb_cols_ - 1)
-    ret = false;
-  else
-    ret = d_status[mb_index + 1] || d_status[mb_index - 1] ||
-          d_status[mb_index + mb_cols_] || d_status[mb_index - mb_cols_];
-  return ret;
-}
-
-void VideoDenoiser::CopySrcOnMOB(const uint8_t* y_src,
-                                 int stride_src,
-                                 uint8_t* y_dst,
-                                 int stride_dst) {
-  // Loop over to copy src block if the block is marked as moving object block
-  // or if the block may cause trailing artifacts.
-  for (int mb_row = 0; mb_row < mb_rows_; ++mb_row) {
-    const int mb_index_base = mb_row * mb_cols_;
-    const uint8_t* mb_src_base = y_src + (mb_row << 4) * stride_src;
-    uint8_t* mb_dst_base = y_dst + (mb_row << 4) * stride_dst;
-    for (int mb_col = 0; mb_col < mb_cols_; ++mb_col) {
-      const int mb_index = mb_index_base + mb_col;
-      const uint32_t offset_col = mb_col << 4;
-      const uint8_t* mb_src = mb_src_base + offset_col;
-      uint8_t* mb_dst = mb_dst_base + offset_col;
-      // Check if the block is a moving object block or may cause a trailing
-      // artifacts.
-      if (mb_filter_decision_[mb_index] != FILTER_BLOCK ||
-          IsTrailingBlock(moving_edge_, mb_row, mb_col) ||
-          (x_density_[mb_col] * y_density_[mb_row] &&
-           moving_object_[mb_row * mb_cols_ + mb_col])) {
-        // Copy y source.
-        filter_->CopyMem16x16(mb_src, stride_src, mb_dst, stride_dst);
-      }
-    }
-  }
-}
-
-void VideoDenoiser::CopyLumaOnMargin(const uint8_t* y_src,
-                                     int stride_src,
-                                     uint8_t* y_dst,
-                                     int stride_dst) {
-  int height_margin = height_ - (mb_rows_ << 4);
-  if (height_margin > 0) {
-    const uint8_t* margin_y_src = y_src + (mb_rows_ << 4) * stride_src;
-    uint8_t* margin_y_dst = y_dst + (mb_rows_ << 4) * stride_dst;
-    libyuv::CopyPlane(margin_y_src, stride_src, margin_y_dst, stride_dst,
-                      width_, height_margin);
-  }
-  int width_margin = width_ - (mb_cols_ << 4);
-  if (width_margin > 0) {
-    const uint8_t* margin_y_src = y_src + (mb_cols_ << 4);
-    uint8_t* margin_y_dst = y_dst + (mb_cols_ << 4);
-    libyuv::CopyPlane(margin_y_src, stride_src, margin_y_dst, stride_dst,
-                      width_ - (mb_cols_ << 4), mb_rows_ << 4);
-  }
-}
-
-rtc::scoped_refptr<I420BufferInterface> VideoDenoiser::DenoiseFrame(
-    rtc::scoped_refptr<I420BufferInterface> frame,
-    bool noise_estimation_enabled) {
-  // If previous width and height are different from current frame's, need to
-  // reallocate the buffers and no denoising for the current frame.
-  if (!prev_buffer_ || width_ != frame->width() || height_ != frame->height()) {
-    DenoiserReset(frame);
-    prev_buffer_ = frame;
-    return frame;
-  }
-
-  // Set buffer pointers.
-  const uint8_t* y_src = frame->DataY();
-  int stride_y_src = frame->StrideY();
-  rtc::scoped_refptr<I420Buffer> dst =
-      buffer_pool_.CreateBuffer(width_, height_);
-
-  uint8_t* y_dst = dst->MutableDataY();
-  int stride_y_dst = dst->StrideY();
-
-  const uint8_t* y_dst_prev = prev_buffer_->DataY();
-  int stride_prev = prev_buffer_->StrideY();
-
-  memset(x_density_.get(), 0, mb_cols_);
-  memset(y_density_.get(), 0, mb_rows_);
-  memset(moving_object_.get(), 1, mb_cols_ * mb_rows_);
-
-  uint8_t noise_level = noise_estimation_enabled ? ne_->GetNoiseLevel() : 0;
-  int thr_var_base = 16 * 16 * 2;
-  // Loop over blocks to accumulate/extract noise level and update x/y_density
-  // factors for moving object detection.
-  for (int mb_row = 0; mb_row < mb_rows_; ++mb_row) {
-    const int mb_index_base = mb_row * mb_cols_;
-    const uint8_t* mb_src_base = y_src + (mb_row << 4) * stride_y_src;
-    uint8_t* mb_dst_base = y_dst + (mb_row << 4) * stride_y_dst;
-    const uint8_t* mb_dst_prev_base = y_dst_prev + (mb_row << 4) * stride_prev;
-    for (int mb_col = 0; mb_col < mb_cols_; ++mb_col) {
-      const int mb_index = mb_index_base + mb_col;
-      const bool ne_enable = (mb_index % NOISE_SUBSAMPLE_INTERVAL == 0);
-      const int pos_factor = PositionCheck(mb_row, mb_col, noise_level);
-      const uint32_t thr_var_adp = thr_var_base * pos_factor;
-      const uint32_t offset_col = mb_col << 4;
-      const uint8_t* mb_src = mb_src_base + offset_col;
-      uint8_t* mb_dst = mb_dst_base + offset_col;
-      const uint8_t* mb_dst_prev = mb_dst_prev_base + offset_col;
-
-      // TODO(jackychen): Need SSE2/NEON opt.
-      int luma = 0;
-      if (ne_enable) {
-        for (int i = 4; i < 12; ++i) {
-          for (int j = 4; j < 12; ++j) {
-            luma += mb_src[i * stride_y_src + j];
-          }
-        }
-      }
-
-      // Get the filtered block and filter_decision.
-      mb_filter_decision_[mb_index] =
-          filter_->MbDenoise(mb_dst_prev, stride_prev, mb_dst, stride_y_dst,
-                             mb_src, stride_y_src, 0, noise_level);
-
-      // If filter decision is FILTER_BLOCK, no need to check moving edge.
-      // It is unlikely for a moving edge block to be filtered in current
-      // setting.
-      if (mb_filter_decision_[mb_index] == FILTER_BLOCK) {
-        uint32_t sse_t = 0;
-        if (ne_enable) {
-          // The variance used in noise estimation is based on the src block in
-          // time t (mb_src) and filtered block in time t-1 (mb_dist_prev).
-          uint32_t noise_var = filter_->Variance16x8(
-              mb_dst_prev, stride_y_dst, mb_src, stride_y_src, &sse_t);
-          ne_->GetNoise(mb_index, noise_var, luma);
-        }
-        moving_edge_[mb_index] = 0;  // Not a moving edge block.
-      } else {
-        uint32_t sse_t = 0;
-        // The variance used in MOD is based on the filtered blocks in time
-        // T (mb_dst) and T-1 (mb_dst_prev).
-        uint32_t noise_var = filter_->Variance16x8(
-            mb_dst_prev, stride_prev, mb_dst, stride_y_dst, &sse_t);
-        if (noise_var > thr_var_adp) {  // Moving edge checking.
-          if (ne_enable) {
-            ne_->ResetConsecLowVar(mb_index);
-          }
-          moving_edge_[mb_index] = 1;  // Mark as moving edge block.
-          x_density_[mb_col] += (pos_factor < 3);
-          y_density_[mb_row] += (pos_factor < 3);
-        } else {
-          moving_edge_[mb_index] = 0;
-          if (ne_enable) {
-            // The variance used in noise estimation is based on the src block
-            // in time t (mb_src) and filtered block in time t-1 (mb_dist_prev).
-            uint32_t noise_var = filter_->Variance16x8(
-                mb_dst_prev, stride_prev, mb_src, stride_y_src, &sse_t);
-            ne_->GetNoise(mb_index, noise_var, luma);
-          }
-        }
-      }
-    }  // End of for loop
-  }    // End of for loop
-
-  ReduceFalseDetection(moving_edge_, &moving_object_, noise_level);
-
-  CopySrcOnMOB(y_src, stride_y_src, y_dst, stride_y_dst);
-
-  // When frame width/height not divisible by 16, copy the margin to
-  // denoised_frame.
-  if ((mb_rows_ << 4) != height_ || (mb_cols_ << 4) != width_)
-    CopyLumaOnMargin(y_src, stride_y_src, y_dst, stride_y_dst);
-
-  // Copy u/v planes.
-  libyuv::CopyPlane(frame->DataU(), frame->StrideU(),
-                    dst->MutableDataU(), dst->StrideU(),
-                    (width_ + 1) >> 1, (height_ + 1) >> 1);
-  libyuv::CopyPlane(frame->DataV(), frame->StrideV(),
-                    dst->MutableDataV(), dst->StrideV(),
-                    (width_ + 1) >> 1, (height_ + 1) >> 1);
-
-#if DISPLAY || DISPLAYNEON
-  // Show rectangular region
-  ShowRect(filter_, moving_edge_, moving_object_, x_density_, y_density_,
-           frame->DataU(), frame->StrideU(), frame->DataV(), frame->StrideV(),
-           dst->MutableDataU(), dst->StrideU(),
-           dst->MutableDataV(), dst->StrideV(),
-           mb_rows_, mb_cols_);
-#endif
-  prev_buffer_ = dst;
-  return dst;
-}
-
-}  // namespace webrtc
diff --git a/modules/video_processing/video_denoiser.h b/modules/video_processing/video_denoiser.h
deleted file mode 100644
index e8cd22d..0000000
--- a/modules/video_processing/video_denoiser.h
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- *  Copyright (c) 2015 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_VIDEO_PROCESSING_VIDEO_DENOISER_H_
-#define WEBRTC_MODULES_VIDEO_PROCESSING_VIDEO_DENOISER_H_
-
-#include <memory>
-
-#include "webrtc/common_video/include/i420_buffer_pool.h"
-#include "webrtc/modules/video_processing/util/denoiser_filter.h"
-#include "webrtc/modules/video_processing/util/noise_estimation.h"
-#include "webrtc/modules/video_processing/util/skin_detection.h"
-
-namespace webrtc {
-
-class VideoDenoiser {
- public:
-  explicit VideoDenoiser(bool runtime_cpu_detection);
-
-  rtc::scoped_refptr<I420BufferInterface> DenoiseFrame(
-      rtc::scoped_refptr<I420BufferInterface> frame,
-      bool noise_estimation_enabled);
-
- private:
-  void DenoiserReset(rtc::scoped_refptr<I420BufferInterface> frame);
-
-  // Check the mb position, return 1: close to the frame center (between 1/8
-  // and 7/8 of width/height), 3: close to the border (out of 1/16 and 15/16
-  // of width/height), 2: in between.
-  int PositionCheck(int mb_row, int mb_col, int noise_level);
-
-  // To reduce false detection in moving object detection (MOD).
-  void ReduceFalseDetection(const std::unique_ptr<uint8_t[]>& d_status,
-                            std::unique_ptr<uint8_t[]>* d_status_red,
-                            int noise_level);
-
-  // Return whether a block might cause trailing artifact by checking if one of
-  // its neighbor blocks is a moving edge block.
-  bool IsTrailingBlock(const std::unique_ptr<uint8_t[]>& d_status,
-                       int mb_row,
-                       int mb_col);
-
-  // Copy input blocks to dst buffer on moving object blocks (MOB).
-  void CopySrcOnMOB(const uint8_t* y_src,
-                    int stride_src,
-                    uint8_t* y_dst,
-                    int stride_dst);
-
-  // Copy luma margin blocks when frame width/height not divisible by 16.
-  void CopyLumaOnMargin(const uint8_t* y_src,
-                        int stride_src,
-                        uint8_t* y_dst,
-                        int stride_dst);
-
-  int width_;
-  int height_;
-  int mb_rows_;
-  int mb_cols_;
-  CpuType cpu_type_;
-  std::unique_ptr<DenoiserFilter> filter_;
-  std::unique_ptr<NoiseEstimation> ne_;
-  // 1 for moving edge block, 0 for static block.
-  std::unique_ptr<uint8_t[]> moving_edge_;
-  // 1 for moving object block, 0 for static block.
-  std::unique_ptr<uint8_t[]> moving_object_;
-  // x_density_ and y_density_ are used in MOD process.
-  std::unique_ptr<uint8_t[]> x_density_;
-  std::unique_ptr<uint8_t[]> y_density_;
-  // Save the return values by MbDenoise for each block.
-  std::unique_ptr<DenoiserDecision[]> mb_filter_decision_;
-  I420BufferPool buffer_pool_;
-  rtc::scoped_refptr<I420BufferInterface> prev_buffer_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_MODULES_VIDEO_PROCESSING_VIDEO_DENOISER_H_
diff --git a/ortc/BUILD.gn b/ortc/BUILD.gn
deleted file mode 100644
index 485771c..0000000
--- a/ortc/BUILD.gn
+++ /dev/null
@@ -1,101 +0,0 @@
-# Copyright (c) 2017 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.
-
-import("../webrtc.gni")
-if (is_android) {
-  import("//build/config/android/config.gni")
-  import("//build/config/android/rules.gni")
-}
-
-rtc_static_library("ortc") {
-  defines = []
-  sources = [
-    "ortcfactory.cc",
-    "ortcfactory.h",
-    "ortcrtpreceiveradapter.cc",
-    "ortcrtpreceiveradapter.h",
-    "ortcrtpsenderadapter.cc",
-    "ortcrtpsenderadapter.h",
-    "rtpparametersconversion.cc",
-    "rtpparametersconversion.h",
-    "rtptransportadapter.cc",
-    "rtptransportadapter.h",
-    "rtptransportcontrolleradapter.cc",
-    "rtptransportcontrolleradapter.h",
-  ]
-
-  # TODO(deadbeef): Create a separate target for the common things ORTC and
-  # PeerConnection code shares, so that ortc can depend on that instead of
-  # libjingle_peerconnection.
-  deps = [
-    "../api:optional",
-    "../api/audio_codecs:builtin_audio_decoder_factory",
-    "../api/audio_codecs:builtin_audio_encoder_factory",
-    "../call:call_interfaces",
-    "../call:rtp_sender",
-    "../logging:rtc_event_log_api",
-    "../media:rtc_media",
-    "../media:rtc_media_base",
-    "../modules/audio_processing:audio_processing",
-    "../p2p:rtc_p2p",
-    "../pc:libjingle_peerconnection",
-    "../pc:rtc_pc",
-    "../rtc_base:rtc_base",
-    "../rtc_base:rtc_base_approved",
-  ]
-
-  public_deps = [
-    "../api:ortc_api",
-  ]
-
-  if (!build_with_chromium && is_clang) {
-    # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-    suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-  }
-}
-
-if (rtc_include_tests) {
-  rtc_test("ortc_unittests") {
-    testonly = true
-
-    sources = [
-      "ortcfactory_integrationtest.cc",
-      "ortcfactory_unittest.cc",
-      "ortcrtpreceiver_unittest.cc",
-      "ortcrtpsender_unittest.cc",
-      "rtpparametersconversion_unittest.cc",
-      "rtptransport_unittest.cc",
-      "rtptransportcontroller_unittest.cc",
-      "srtptransport_unittest.cc",
-      "testrtpparameters.cc",
-      "testrtpparameters.h",
-    ]
-
-    deps = [
-      ":ortc",
-      "../media:rtc_media_tests_utils",
-      "../p2p:p2p_test_utils",
-      "../p2p:rtc_p2p",
-      "../pc:pc_test_utils",
-      "../rtc_base:rtc_base",
-      "../rtc_base:rtc_base_approved",
-      "../rtc_base:rtc_base_tests_main",
-      "../rtc_base:rtc_base_tests_utils",
-      "../system_wrappers:metrics_default",
-    ]
-
-    if (!build_with_chromium && is_clang) {
-      # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-    }
-
-    if (is_android) {
-      deps += [ "//testing/android/native_test:native_test_support" ]
-    }
-  }
-}
diff --git a/ortc/DEPS b/ortc/DEPS
deleted file mode 100644
index b72aa6b..0000000
--- a/ortc/DEPS
+++ /dev/null
@@ -1,17 +0,0 @@
-include_rules = [
-  "+webrtc/api",
-  "+webrtc/call",
-  "+webrtc/logging/rtc_event_log",
-  "+webrtc/media",
-  "+webrtc/modules/audio_coding",
-  "+webrtc/modules/audio_processing",
-  "+webrtc/p2p",
-  "+webrtc/pc",
-
-  "+webrtc/modules/rtp_rtcp",
-  "+webrtc/system_wrappers",
-
-  "+webrtc/modules/audio_device",
-  "+webrtc/modules/video_coding",
-  "+webrtc/modules/video_render",
-]
diff --git a/ortc/OWNERS b/ortc/OWNERS
deleted file mode 100644
index d51c5e4..0000000
--- a/ortc/OWNERS
+++ /dev/null
@@ -1,6 +0,0 @@
-deadbeef@webrtc.org
-
-# These are for the common case of adding or renaming files. If you're doing
-# structural changes, please get a review from a reviewer in this file.
-per-file *.gn=*
-per-file *.gni=*
diff --git a/ortc/ortcfactory.cc b/ortc/ortcfactory.cc
deleted file mode 100644
index d8b117b..0000000
--- a/ortc/ortcfactory.cc
+++ /dev/null
@@ -1,554 +0,0 @@
-/*
- *  Copyright 2017 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/ortc/ortcfactory.h"
-
-#include <sstream>
-#include <utility>  // For std::move.
-#include <vector>
-
-#include "webrtc/api/audio_codecs/builtin_audio_decoder_factory.h"
-#include "webrtc/api/audio_codecs/builtin_audio_encoder_factory.h"
-#include "webrtc/api/mediastreamtrackproxy.h"
-#include "webrtc/api/proxy.h"
-#include "webrtc/api/rtcerror.h"
-#include "webrtc/api/videosourceproxy.h"
-#include "webrtc/logging/rtc_event_log/rtc_event_log.h"
-#include "webrtc/media/base/mediaconstants.h"
-#include "webrtc/modules/audio_processing/include/audio_processing.h"
-#include "webrtc/ortc/ortcrtpreceiveradapter.h"
-#include "webrtc/ortc/ortcrtpsenderadapter.h"
-#include "webrtc/ortc/rtpparametersconversion.h"
-#include "webrtc/ortc/rtptransportadapter.h"
-#include "webrtc/ortc/rtptransportcontrolleradapter.h"
-#include "webrtc/p2p/base/basicpacketsocketfactory.h"
-#include "webrtc/p2p/base/udptransport.h"
-#include "webrtc/pc/audiotrack.h"
-#include "webrtc/pc/channelmanager.h"
-#include "webrtc/pc/localaudiosource.h"
-#include "webrtc/pc/videocapturertracksource.h"
-#include "webrtc/pc/videotrack.h"
-#include "webrtc/rtc_base/asyncpacketsocket.h"
-#include "webrtc/rtc_base/bind.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/helpers.h"
-#include "webrtc/rtc_base/logging.h"
-
-namespace {
-
-const int kDefaultRtcpCnameLength = 16;
-
-// Asserts that all of the built-in capabilities can be converted to
-// RtpCapabilities. If they can't, something's wrong (for example, maybe a new
-// feedback mechanism is supported, but an enum value wasn't added to
-// rtpparameters.h).
-template <typename C>
-webrtc::RtpCapabilities ToRtpCapabilitiesWithAsserts(
-    const std::vector<C>& cricket_codecs,
-    const cricket::RtpHeaderExtensions& cricket_extensions) {
-  webrtc::RtpCapabilities capabilities =
-      webrtc::ToRtpCapabilities(cricket_codecs, cricket_extensions);
-  RTC_DCHECK_EQ(capabilities.codecs.size(), cricket_codecs.size());
-  for (size_t i = 0; i < capabilities.codecs.size(); ++i) {
-    RTC_DCHECK_EQ(capabilities.codecs[i].rtcp_feedback.size(),
-                  cricket_codecs[i].feedback_params.params().size());
-  }
-  RTC_DCHECK_EQ(capabilities.header_extensions.size(),
-                cricket_extensions.size());
-  return capabilities;
-}
-
-}  // namespace
-
-namespace webrtc {
-
-// Note that this proxy class uses the network thread as the "worker" thread.
-BEGIN_OWNED_PROXY_MAP(OrtcFactory)
-PROXY_SIGNALING_THREAD_DESTRUCTOR()
-PROXY_METHOD0(RTCErrorOr<std::unique_ptr<RtpTransportControllerInterface>>,
-              CreateRtpTransportController)
-PROXY_METHOD4(RTCErrorOr<std::unique_ptr<RtpTransportInterface>>,
-              CreateRtpTransport,
-              const RtpTransportParameters&,
-              PacketTransportInterface*,
-              PacketTransportInterface*,
-              RtpTransportControllerInterface*)
-
-PROXY_METHOD4(RTCErrorOr<std::unique_ptr<SrtpTransportInterface>>,
-              CreateSrtpTransport,
-              const RtpTransportParameters&,
-              PacketTransportInterface*,
-              PacketTransportInterface*,
-              RtpTransportControllerInterface*)
-
-PROXY_CONSTMETHOD1(RtpCapabilities,
-                   GetRtpSenderCapabilities,
-                   cricket::MediaType)
-PROXY_METHOD2(RTCErrorOr<std::unique_ptr<OrtcRtpSenderInterface>>,
-              CreateRtpSender,
-              rtc::scoped_refptr<MediaStreamTrackInterface>,
-              RtpTransportInterface*)
-PROXY_METHOD2(RTCErrorOr<std::unique_ptr<OrtcRtpSenderInterface>>,
-              CreateRtpSender,
-              cricket::MediaType,
-              RtpTransportInterface*)
-PROXY_CONSTMETHOD1(RtpCapabilities,
-                   GetRtpReceiverCapabilities,
-                   cricket::MediaType)
-PROXY_METHOD2(RTCErrorOr<std::unique_ptr<OrtcRtpReceiverInterface>>,
-              CreateRtpReceiver,
-              cricket::MediaType,
-              RtpTransportInterface*)
-PROXY_WORKER_METHOD3(RTCErrorOr<std::unique_ptr<UdpTransportInterface>>,
-                     CreateUdpTransport,
-                     int,
-                     uint16_t,
-                     uint16_t)
-PROXY_METHOD1(rtc::scoped_refptr<AudioSourceInterface>,
-              CreateAudioSource,
-              const cricket::AudioOptions&)
-PROXY_METHOD2(rtc::scoped_refptr<VideoTrackSourceInterface>,
-              CreateVideoSource,
-              std::unique_ptr<cricket::VideoCapturer>,
-              const MediaConstraintsInterface*)
-PROXY_METHOD2(rtc::scoped_refptr<VideoTrackInterface>,
-              CreateVideoTrack,
-              const std::string&,
-              VideoTrackSourceInterface*)
-PROXY_METHOD2(rtc::scoped_refptr<AudioTrackInterface>,
-              CreateAudioTrack,
-              const std::string&,
-              AudioSourceInterface*)
-END_PROXY_MAP()
-
-// static
-RTCErrorOr<std::unique_ptr<OrtcFactoryInterface>> OrtcFactory::Create(
-    rtc::Thread* network_thread,
-    rtc::Thread* signaling_thread,
-    rtc::NetworkManager* network_manager,
-    rtc::PacketSocketFactory* socket_factory,
-    AudioDeviceModule* adm,
-    std::unique_ptr<cricket::MediaEngineInterface> media_engine) {
-  // Hop to signaling thread if needed.
-  if (signaling_thread && !signaling_thread->IsCurrent()) {
-    return signaling_thread
-        ->Invoke<RTCErrorOr<std::unique_ptr<OrtcFactoryInterface>>>(
-            RTC_FROM_HERE,
-            rtc::Bind(&OrtcFactory::Create_s, network_thread, signaling_thread,
-                      network_manager, socket_factory, adm,
-                      media_engine.release()));
-  }
-  return Create_s(network_thread, signaling_thread, network_manager,
-                  socket_factory, adm, media_engine.release());
-}
-
-RTCErrorOr<std::unique_ptr<OrtcFactoryInterface>> OrtcFactoryInterface::Create(
-    rtc::Thread* network_thread,
-    rtc::Thread* signaling_thread,
-    rtc::NetworkManager* network_manager,
-    rtc::PacketSocketFactory* socket_factory,
-    AudioDeviceModule* adm) {
-  return OrtcFactory::Create(network_thread, signaling_thread, network_manager,
-                             socket_factory, adm, nullptr);
-}
-
-OrtcFactory::OrtcFactory(rtc::Thread* network_thread,
-                         rtc::Thread* signaling_thread,
-                         rtc::NetworkManager* network_manager,
-                         rtc::PacketSocketFactory* socket_factory,
-                         AudioDeviceModule* adm)
-    : network_thread_(network_thread),
-      signaling_thread_(signaling_thread),
-      network_manager_(network_manager),
-      socket_factory_(socket_factory),
-      adm_(adm),
-      null_event_log_(RtcEventLog::CreateNull()),
-      audio_encoder_factory_(CreateBuiltinAudioEncoderFactory()),
-      audio_decoder_factory_(CreateBuiltinAudioDecoderFactory()) {
-  if (!rtc::CreateRandomString(kDefaultRtcpCnameLength, &default_cname_)) {
-    LOG(LS_ERROR) << "Failed to generate CNAME?";
-    RTC_NOTREACHED();
-  }
-  if (!network_thread_) {
-    owned_network_thread_ = rtc::Thread::CreateWithSocketServer();
-    owned_network_thread_->Start();
-    network_thread_ = owned_network_thread_.get();
-  }
-
-  // The worker thread is created internally because it's an implementation
-  // detail, and consumers of the API don't need to really know about it.
-  worker_thread_ = rtc::Thread::Create();
-  worker_thread_->Start();
-
-  if (signaling_thread_) {
-    RTC_DCHECK_RUN_ON(signaling_thread_);
-  } else {
-    signaling_thread_ = rtc::Thread::Current();
-    if (!signaling_thread_) {
-      // If this thread isn't already wrapped by an rtc::Thread, create a
-      // wrapper and own it in this class.
-      signaling_thread_ = rtc::ThreadManager::Instance()->WrapCurrentThread();
-      wraps_signaling_thread_ = true;
-    }
-  }
-  if (!network_manager_) {
-    owned_network_manager_.reset(new rtc::BasicNetworkManager());
-    network_manager_ = owned_network_manager_.get();
-  }
-  if (!socket_factory_) {
-    owned_socket_factory_.reset(
-        new rtc::BasicPacketSocketFactory(network_thread_));
-    socket_factory_ = owned_socket_factory_.get();
-  }
-}
-
-OrtcFactory::~OrtcFactory() {
-  RTC_DCHECK_RUN_ON(signaling_thread_);
-  if (wraps_signaling_thread_) {
-    rtc::ThreadManager::Instance()->UnwrapCurrentThread();
-  }
-}
-
-RTCErrorOr<std::unique_ptr<RtpTransportControllerInterface>>
-OrtcFactory::CreateRtpTransportController() {
-  RTC_DCHECK_RUN_ON(signaling_thread_);
-  return RtpTransportControllerAdapter::CreateProxied(
-      cricket::MediaConfig(), channel_manager_.get(), null_event_log_.get(),
-      signaling_thread_, worker_thread_.get());
-}
-
-RTCErrorOr<std::unique_ptr<RtpTransportInterface>>
-OrtcFactory::CreateRtpTransport(
-    const RtpTransportParameters& parameters,
-    PacketTransportInterface* rtp,
-    PacketTransportInterface* rtcp,
-    RtpTransportControllerInterface* transport_controller) {
-  RTC_DCHECK_RUN_ON(signaling_thread_);
-  RtpTransportParameters copied_parameters = parameters;
-  if (copied_parameters.rtcp.cname.empty()) {
-    copied_parameters.rtcp.cname = default_cname_;
-  }
-  if (transport_controller) {
-    return transport_controller->GetInternal()->CreateProxiedRtpTransport(
-        copied_parameters, rtp, rtcp);
-  } else {
-    // If |transport_controller| is null, create one automatically, which the
-    // returned RtpTransport will own.
-    auto controller_result = CreateRtpTransportController();
-    if (!controller_result.ok()) {
-      return controller_result.MoveError();
-    }
-    auto controller = controller_result.MoveValue();
-    auto transport_result =
-        controller->GetInternal()->CreateProxiedRtpTransport(copied_parameters,
-                                                             rtp, rtcp);
-    // If RtpTransport was successfully created, transfer ownership of
-    // |rtp_transport_controller|. Otherwise it will go out of scope and be
-    // deleted automatically.
-    if (transport_result.ok()) {
-      transport_result.value()
-          ->GetInternal()
-          ->TakeOwnershipOfRtpTransportController(std::move(controller));
-    }
-    return transport_result;
-  }
-}
-
-RTCErrorOr<std::unique_ptr<SrtpTransportInterface>>
-OrtcFactory::CreateSrtpTransport(
-    const RtpTransportParameters& parameters,
-    PacketTransportInterface* rtp,
-    PacketTransportInterface* rtcp,
-    RtpTransportControllerInterface* transport_controller) {
-  RTC_DCHECK_RUN_ON(signaling_thread_);
-  RtpTransportParameters copied_parameters = parameters;
-  if (copied_parameters.rtcp.cname.empty()) {
-    copied_parameters.rtcp.cname = default_cname_;
-  }
-  if (transport_controller) {
-    return transport_controller->GetInternal()->CreateProxiedSrtpTransport(
-        copied_parameters, rtp, rtcp);
-  } else {
-    // If |transport_controller| is null, create one automatically, which the
-    // returned SrtpTransport will own.
-    auto controller_result = CreateRtpTransportController();
-    if (!controller_result.ok()) {
-      return controller_result.MoveError();
-    }
-    auto controller = controller_result.MoveValue();
-    auto transport_result =
-        controller->GetInternal()->CreateProxiedSrtpTransport(copied_parameters,
-                                                              rtp, rtcp);
-    // If SrtpTransport was successfully created, transfer ownership of
-    // |rtp_transport_controller|. Otherwise it will go out of scope and be
-    // deleted automatically.
-    if (transport_result.ok()) {
-      transport_result.value()
-          ->GetInternal()
-          ->TakeOwnershipOfRtpTransportController(std::move(controller));
-    }
-    return transport_result;
-  }
-}
-
-RtpCapabilities OrtcFactory::GetRtpSenderCapabilities(
-    cricket::MediaType kind) const {
-  RTC_DCHECK_RUN_ON(signaling_thread_);
-  switch (kind) {
-    case cricket::MEDIA_TYPE_AUDIO: {
-      cricket::AudioCodecs cricket_codecs;
-      cricket::RtpHeaderExtensions cricket_extensions;
-      channel_manager_->GetSupportedAudioSendCodecs(&cricket_codecs);
-      channel_manager_->GetSupportedAudioRtpHeaderExtensions(
-          &cricket_extensions);
-      return ToRtpCapabilitiesWithAsserts(cricket_codecs, cricket_extensions);
-    }
-    case cricket::MEDIA_TYPE_VIDEO: {
-      cricket::VideoCodecs cricket_codecs;
-      cricket::RtpHeaderExtensions cricket_extensions;
-      channel_manager_->GetSupportedVideoCodecs(&cricket_codecs);
-      channel_manager_->GetSupportedVideoRtpHeaderExtensions(
-          &cricket_extensions);
-      return ToRtpCapabilitiesWithAsserts(cricket_codecs, cricket_extensions);
-    }
-    case cricket::MEDIA_TYPE_DATA:
-      return RtpCapabilities();
-  }
-  // Not reached; avoids compile warning.
-  FATAL();
-}
-
-RTCErrorOr<std::unique_ptr<OrtcRtpSenderInterface>>
-OrtcFactory::CreateRtpSender(
-    rtc::scoped_refptr<MediaStreamTrackInterface> track,
-    RtpTransportInterface* transport) {
-  RTC_DCHECK_RUN_ON(signaling_thread_);
-  if (!track) {
-    LOG_AND_RETURN_ERROR(RTCErrorType::INVALID_PARAMETER,
-                         "Cannot pass null track into CreateRtpSender.");
-  }
-  auto result =
-      CreateRtpSender(cricket::MediaTypeFromString(track->kind()), transport);
-  if (!result.ok()) {
-    return result;
-  }
-  auto err = result.value()->SetTrack(track);
-  if (!err.ok()) {
-    return std::move(err);
-  }
-  return result;
-}
-
-RTCErrorOr<std::unique_ptr<OrtcRtpSenderInterface>>
-OrtcFactory::CreateRtpSender(cricket::MediaType kind,
-                             RtpTransportInterface* transport) {
-  RTC_DCHECK_RUN_ON(signaling_thread_);
-  if (kind == cricket::MEDIA_TYPE_DATA) {
-    LOG_AND_RETURN_ERROR(RTCErrorType::INVALID_PARAMETER,
-                         "Cannot create data RtpSender.");
-  }
-  if (!transport) {
-    LOG_AND_RETURN_ERROR(RTCErrorType::INVALID_PARAMETER,
-                         "Cannot pass null transport into CreateRtpSender.");
-  }
-  return transport->GetInternal()
-      ->rtp_transport_controller()
-      ->CreateProxiedRtpSender(kind, transport);
-}
-
-RtpCapabilities OrtcFactory::GetRtpReceiverCapabilities(
-    cricket::MediaType kind) const {
-  RTC_DCHECK_RUN_ON(signaling_thread_);
-  switch (kind) {
-    case cricket::MEDIA_TYPE_AUDIO: {
-      cricket::AudioCodecs cricket_codecs;
-      cricket::RtpHeaderExtensions cricket_extensions;
-      channel_manager_->GetSupportedAudioReceiveCodecs(&cricket_codecs);
-      channel_manager_->GetSupportedAudioRtpHeaderExtensions(
-          &cricket_extensions);
-      return ToRtpCapabilitiesWithAsserts(cricket_codecs, cricket_extensions);
-    }
-    case cricket::MEDIA_TYPE_VIDEO: {
-      cricket::VideoCodecs cricket_codecs;
-      cricket::RtpHeaderExtensions cricket_extensions;
-      channel_manager_->GetSupportedVideoCodecs(&cricket_codecs);
-      channel_manager_->GetSupportedVideoRtpHeaderExtensions(
-          &cricket_extensions);
-      return ToRtpCapabilitiesWithAsserts(cricket_codecs, cricket_extensions);
-    }
-    case cricket::MEDIA_TYPE_DATA:
-      return RtpCapabilities();
-  }
-  // Not reached; avoids compile warning.
-  FATAL();
-}
-
-RTCErrorOr<std::unique_ptr<OrtcRtpReceiverInterface>>
-OrtcFactory::CreateRtpReceiver(cricket::MediaType kind,
-                               RtpTransportInterface* transport) {
-  RTC_DCHECK_RUN_ON(signaling_thread_);
-  if (kind == cricket::MEDIA_TYPE_DATA) {
-    LOG_AND_RETURN_ERROR(RTCErrorType::INVALID_PARAMETER,
-                         "Cannot create data RtpReceiver.");
-  }
-  if (!transport) {
-    LOG_AND_RETURN_ERROR(RTCErrorType::INVALID_PARAMETER,
-                         "Cannot pass null transport into CreateRtpReceiver.");
-  }
-  return transport->GetInternal()
-      ->rtp_transport_controller()
-      ->CreateProxiedRtpReceiver(kind, transport);
-}
-
-// UdpTransport expects all methods to be called on one thread, which needs to
-// be the network thread, since that's where its socket can safely be used. So
-// return a proxy to the created UdpTransport.
-BEGIN_OWNED_PROXY_MAP(UdpTransport)
-PROXY_WORKER_THREAD_DESTRUCTOR()
-PROXY_WORKER_CONSTMETHOD0(rtc::SocketAddress, GetLocalAddress)
-PROXY_WORKER_METHOD1(bool, SetRemoteAddress, const rtc::SocketAddress&)
-PROXY_WORKER_CONSTMETHOD0(rtc::SocketAddress, GetRemoteAddress)
-protected:
-rtc::PacketTransportInternal* GetInternal() override {
-  return internal();
-}
-END_PROXY_MAP()
-
-RTCErrorOr<std::unique_ptr<UdpTransportInterface>>
-OrtcFactory::CreateUdpTransport(int family,
-                                uint16_t min_port,
-                                uint16_t max_port) {
-  RTC_DCHECK_RUN_ON(network_thread_);
-  if (family != AF_INET && family != AF_INET6) {
-    LOG_AND_RETURN_ERROR(RTCErrorType::INVALID_PARAMETER,
-                         "Address family must be AF_INET or AF_INET6.");
-  }
-  if (min_port > max_port) {
-    LOG_AND_RETURN_ERROR(RTCErrorType::INVALID_RANGE,
-                         "Port range invalid; minimum port must be less than "
-                         "or equal to max port.");
-  }
-  std::unique_ptr<rtc::AsyncPacketSocket> socket(
-      socket_factory_->CreateUdpSocket(
-          rtc::SocketAddress(rtc::GetAnyIP(family), 0), min_port, max_port));
-  if (!socket) {
-    // Only log at warning level, because this method may be called with
-    // specific port ranges to determine if a port is available, expecting the
-    // possibility of an error.
-    LOG_AND_RETURN_ERROR_EX(RTCErrorType::RESOURCE_EXHAUSTED,
-                            "Local socket allocation failure.", LS_WARNING);
-  }
-  LOG(LS_INFO) << "Created UDP socket with address "
-               << socket->GetLocalAddress().ToSensitiveString() << ".";
-  // Make a unique debug name (for logging/diagnostics only).
-  std::ostringstream oss;
-  static int udp_id = 0;
-  oss << "udp" << udp_id++;
-  return UdpTransportProxyWithInternal<cricket::UdpTransport>::Create(
-      signaling_thread_, network_thread_,
-      std::unique_ptr<cricket::UdpTransport>(
-          new cricket::UdpTransport(oss.str(), std::move(socket))));
-}
-
-rtc::scoped_refptr<AudioSourceInterface> OrtcFactory::CreateAudioSource(
-    const cricket::AudioOptions& options) {
-  RTC_DCHECK_RUN_ON(signaling_thread_);
-  return rtc::scoped_refptr<LocalAudioSource>(
-      LocalAudioSource::Create(&options));
-}
-
-rtc::scoped_refptr<VideoTrackSourceInterface> OrtcFactory::CreateVideoSource(
-    std::unique_ptr<cricket::VideoCapturer> capturer,
-    const MediaConstraintsInterface* constraints) {
-  RTC_DCHECK_RUN_ON(signaling_thread_);
-  rtc::scoped_refptr<VideoTrackSourceInterface> source(
-      VideoCapturerTrackSource::Create(
-          worker_thread_.get(), std::move(capturer), constraints, false));
-  return VideoTrackSourceProxy::Create(signaling_thread_, worker_thread_.get(),
-                                       source);
-}
-
-rtc::scoped_refptr<VideoTrackInterface> OrtcFactory::CreateVideoTrack(
-    const std::string& id,
-    VideoTrackSourceInterface* source) {
-  RTC_DCHECK_RUN_ON(signaling_thread_);
-  rtc::scoped_refptr<VideoTrackInterface> track(
-      VideoTrack::Create(id, source, worker_thread_.get()));
-  return VideoTrackProxy::Create(signaling_thread_, worker_thread_.get(),
-                                 track);
-}
-
-rtc::scoped_refptr<AudioTrackInterface> OrtcFactory::CreateAudioTrack(
-    const std::string& id,
-    AudioSourceInterface* source) {
-  RTC_DCHECK_RUN_ON(signaling_thread_);
-  rtc::scoped_refptr<AudioTrackInterface> track(AudioTrack::Create(id, source));
-  return AudioTrackProxy::Create(signaling_thread_, track);
-}
-
-// static
-RTCErrorOr<std::unique_ptr<OrtcFactoryInterface>> OrtcFactory::Create_s(
-    rtc::Thread* network_thread,
-    rtc::Thread* signaling_thread,
-    rtc::NetworkManager* network_manager,
-    rtc::PacketSocketFactory* socket_factory,
-    AudioDeviceModule* adm,
-    cricket::MediaEngineInterface* media_engine) {
-  // Add the unique_ptr wrapper back.
-  std::unique_ptr<cricket::MediaEngineInterface> owned_media_engine(
-      media_engine);
-  std::unique_ptr<OrtcFactory> new_factory(new OrtcFactory(
-      network_thread, signaling_thread, network_manager, socket_factory, adm));
-  RTCError err = new_factory->Initialize(std::move(owned_media_engine));
-  if (!err.ok()) {
-    return std::move(err);
-  }
-  // Return a proxy so that any calls on the returned object (including
-  // destructor) happen on the signaling thread.
-  rtc::Thread* signaling = new_factory->signaling_thread();
-  rtc::Thread* network = new_factory->network_thread();
-  return OrtcFactoryProxy::Create(signaling, network, std::move(new_factory));
-}
-
-RTCError OrtcFactory::Initialize(
-    std::unique_ptr<cricket::MediaEngineInterface> media_engine) {
-  RTC_DCHECK_RUN_ON(signaling_thread_);
-  // TODO(deadbeef): Get rid of requirement to hop to worker thread here.
-  if (!media_engine) {
-    media_engine =
-        worker_thread_->Invoke<std::unique_ptr<cricket::MediaEngineInterface>>(
-            RTC_FROM_HERE, rtc::Bind(&OrtcFactory::CreateMediaEngine_w, this));
-  }
-
-  channel_manager_.reset(new cricket::ChannelManager(
-      std::move(media_engine), worker_thread_.get(), network_thread_));
-  channel_manager_->SetVideoRtxEnabled(true);
-  if (!channel_manager_->Init()) {
-    LOG_AND_RETURN_ERROR(RTCErrorType::INTERNAL_ERROR,
-                         "Failed to initialize ChannelManager.");
-  }
-  return RTCError::OK();
-}
-
-std::unique_ptr<cricket::MediaEngineInterface>
-OrtcFactory::CreateMediaEngine_w() {
-  RTC_DCHECK_RUN_ON(worker_thread_.get());
-  // The null arguments are optional factories that could be passed into the
-  // OrtcFactory, but aren't yet.
-  //
-  // Note that |adm_| may be null, in which case the platform-specific default
-  // AudioDeviceModule will be used.
-  return std::unique_ptr<cricket::MediaEngineInterface>(
-      cricket::WebRtcMediaEngineFactory::Create(
-          adm_, audio_encoder_factory_, audio_decoder_factory_, nullptr,
-          nullptr, nullptr, webrtc::AudioProcessing::Create()));
-}
-
-}  // namespace webrtc
diff --git a/ortc/ortcfactory.h b/ortc/ortcfactory.h
deleted file mode 100644
index f93cb63..0000000
--- a/ortc/ortcfactory.h
+++ /dev/null
@@ -1,154 +0,0 @@
-/*
- *  Copyright 2017 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_ORTC_ORTCFACTORY_H_
-#define WEBRTC_ORTC_ORTCFACTORY_H_
-
-#include <memory>
-#include <string>
-
-#include "webrtc/api/ortc/ortcfactoryinterface.h"
-#include "webrtc/media/base/mediaengine.h"
-#include "webrtc/media/engine/webrtcmediaengine.h"
-#include "webrtc/pc/channelmanager.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/scoped_ref_ptr.h"
-
-namespace webrtc {
-
-// Implementation of OrtcFactoryInterface.
-//
-// See ortcfactoryinterface.h for documentation.
-class OrtcFactory : public OrtcFactoryInterface {
- public:
-  ~OrtcFactory() override;
-
-  // Internal-only Create method that allows passing in a fake media engine,
-  // for testing.
-  static RTCErrorOr<std::unique_ptr<OrtcFactoryInterface>> Create(
-      rtc::Thread* network_thread,
-      rtc::Thread* signaling_thread,
-      rtc::NetworkManager* network_manager,
-      rtc::PacketSocketFactory* socket_factory,
-      AudioDeviceModule* adm,
-      std::unique_ptr<cricket::MediaEngineInterface> media_engine);
-
-  RTCErrorOr<std::unique_ptr<RtpTransportControllerInterface>>
-  CreateRtpTransportController() override;
-
-  RTCErrorOr<std::unique_ptr<RtpTransportInterface>> CreateRtpTransport(
-      const RtpTransportParameters& parameters,
-      PacketTransportInterface* rtp,
-      PacketTransportInterface* rtcp,
-      RtpTransportControllerInterface* transport_controller) override;
-
-  RTCErrorOr<std::unique_ptr<SrtpTransportInterface>> CreateSrtpTransport(
-      const RtpTransportParameters& parameters,
-      PacketTransportInterface* rtp,
-      PacketTransportInterface* rtcp,
-      RtpTransportControllerInterface* transport_controller) override;
-
-  RtpCapabilities GetRtpSenderCapabilities(
-      cricket::MediaType kind) const override;
-
-  RTCErrorOr<std::unique_ptr<OrtcRtpSenderInterface>> CreateRtpSender(
-      rtc::scoped_refptr<MediaStreamTrackInterface> track,
-      RtpTransportInterface* transport) override;
-
-  RTCErrorOr<std::unique_ptr<OrtcRtpSenderInterface>> CreateRtpSender(
-      cricket::MediaType kind,
-      RtpTransportInterface* transport) override;
-
-  RtpCapabilities GetRtpReceiverCapabilities(
-      cricket::MediaType kind) const override;
-
-  RTCErrorOr<std::unique_ptr<OrtcRtpReceiverInterface>> CreateRtpReceiver(
-      cricket::MediaType kind,
-      RtpTransportInterface* transport) override;
-
-  RTCErrorOr<std::unique_ptr<UdpTransportInterface>>
-  CreateUdpTransport(int family, uint16_t min_port, uint16_t max_port) override;
-
-  rtc::scoped_refptr<AudioSourceInterface> CreateAudioSource(
-      const cricket::AudioOptions& options) override;
-
-  rtc::scoped_refptr<VideoTrackSourceInterface> CreateVideoSource(
-      std::unique_ptr<cricket::VideoCapturer> capturer,
-      const MediaConstraintsInterface* constraints) override;
-
-  rtc::scoped_refptr<VideoTrackInterface> CreateVideoTrack(
-      const std::string& id,
-      VideoTrackSourceInterface* source) override;
-
-  rtc::scoped_refptr<AudioTrackInterface> CreateAudioTrack(
-      const std::string& id,
-      AudioSourceInterface* source) override;
-
-  rtc::Thread* network_thread() { return network_thread_; }
-  rtc::Thread* worker_thread() { return worker_thread_.get(); }
-  rtc::Thread* signaling_thread() { return signaling_thread_; }
-
- private:
-  // Should only be called by OrtcFactoryInterface::Create.
-  OrtcFactory(rtc::Thread* network_thread,
-              rtc::Thread* signaling_thread,
-              rtc::NetworkManager* network_manager,
-              rtc::PacketSocketFactory* socket_factory,
-              AudioDeviceModule* adm);
-
-  RTCErrorOr<std::unique_ptr<RtpTransportControllerInterface>>
-  CreateRtpTransportController(const RtpTransportParameters& parameters);
-
-  // Thread::Invoke doesn't support move-only arguments, so we need to remove
-  // the unique_ptr wrapper from media_engine. TODO(deadbeef): Fix this.
-  static RTCErrorOr<std::unique_ptr<OrtcFactoryInterface>> Create_s(
-      rtc::Thread* network_thread,
-      rtc::Thread* signaling_thread,
-      rtc::NetworkManager* network_manager,
-      rtc::PacketSocketFactory* socket_factory,
-      AudioDeviceModule* adm,
-      cricket::MediaEngineInterface* media_engine);
-
-  // Performs initialization that can fail. Called by factory method after
-  // construction, and if it fails, no object is returned.
-  RTCError Initialize(
-      std::unique_ptr<cricket::MediaEngineInterface> media_engine);
-  std::unique_ptr<cricket::MediaEngineInterface> CreateMediaEngine_w();
-
-  // Threads and networking objects.
-  rtc::Thread* network_thread_;
-  rtc::Thread* signaling_thread_;
-  rtc::NetworkManager* network_manager_;
-  rtc::PacketSocketFactory* socket_factory_;
-  AudioDeviceModule* adm_;
-  // If we created/own the objects above, these will be non-null and thus will
-  // be released automatically upon destruction.
-  std::unique_ptr<rtc::Thread> owned_network_thread_;
-  bool wraps_signaling_thread_ = false;
-  std::unique_ptr<rtc::NetworkManager> owned_network_manager_;
-  std::unique_ptr<rtc::PacketSocketFactory> owned_socket_factory_;
-  // We always own the worker thread.
-  std::unique_ptr<rtc::Thread> worker_thread_;
-  // Media-releated objects.
-  std::unique_ptr<RtcEventLog> null_event_log_;
-  rtc::scoped_refptr<AudioEncoderFactory> audio_encoder_factory_;
-  rtc::scoped_refptr<AudioDecoderFactory> audio_decoder_factory_;
-  std::unique_ptr<cricket::ChannelManager> channel_manager_;
-  // Default CNAME to use for RtpTransports if none is passed in.
-  std::string default_cname_;
-
-  friend class OrtcFactoryInterface;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(OrtcFactory);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_ORTC_ORTCFACTORY_H_
diff --git a/ortc/ortcfactory_integrationtest.cc b/ortc/ortcfactory_integrationtest.cc
deleted file mode 100644
index 513e972..0000000
--- a/ortc/ortcfactory_integrationtest.cc
+++ /dev/null
@@ -1,691 +0,0 @@
-/*
- *  Copyright 2017 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 <memory>
-#include <utility>  // For std::pair, std::move.
-
-#include "webrtc/api/ortc/ortcfactoryinterface.h"
-#include "webrtc/ortc/testrtpparameters.h"
-#include "webrtc/p2p/base/udptransport.h"
-#include "webrtc/pc/test/fakeaudiocapturemodule.h"
-#include "webrtc/pc/test/fakeperiodicvideocapturer.h"
-#include "webrtc/pc/test/fakevideotrackrenderer.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/fakenetwork.h"
-#include "webrtc/rtc_base/gunit.h"
-#include "webrtc/rtc_base/virtualsocketserver.h"
-
-namespace {
-
-const int kDefaultTimeout = 10000;    // 10 seconds.
-const int kReceivingDuration = 1000;  // 1 second.
-// Default number of audio/video frames to wait for before considering a test a
-// success.
-const int kDefaultNumFrames = 3;
-const rtc::IPAddress kIPv4LocalHostAddress =
-    rtc::IPAddress(0x7F000001);  // 127.0.0.1
-
-static const char kTestKeyParams1[] =
-    "inline:WVNfX19zZW1jdGwgKskgewkyMjA7fQp9CnVubGVz";
-static const char kTestKeyParams2[] =
-    "inline:PS1uQCVeeCFCanVmcjkpaywjNWhcYD0mXXtxaVBR";
-static const char kTestKeyParams3[] =
-    "inline:WVNfX19zZW1jdGwgKskgewkyMjA7fQp9CnVubGVa";
-static const char kTestKeyParams4[] =
-    "inline:WVNfX19zZW1jdGwgKskgewkyMjA7fQp9CnVubGVb";
-static const cricket::CryptoParams kTestCryptoParams1(1,
-                                                      "AES_CM_128_HMAC_SHA1_80",
-                                                      kTestKeyParams1,
-                                                      "");
-static const cricket::CryptoParams kTestCryptoParams2(1,
-                                                      "AES_CM_128_HMAC_SHA1_80",
-                                                      kTestKeyParams2,
-                                                      "");
-static const cricket::CryptoParams kTestCryptoParams3(1,
-                                                      "AES_CM_128_HMAC_SHA1_80",
-                                                      kTestKeyParams3,
-                                                      "");
-static const cricket::CryptoParams kTestCryptoParams4(1,
-                                                      "AES_CM_128_HMAC_SHA1_80",
-                                                      kTestKeyParams4,
-                                                      "");
-}  // namespace
-
-namespace webrtc {
-
-// Used to test that things work end-to-end when using the default
-// implementations of threads/etc. provided by OrtcFactory, with the exception
-// of using a virtual network.
-//
-// By default, the virtual network manager doesn't enumerate any networks, but
-// sockets can still be created in this state.
-class OrtcFactoryIntegrationTest : public testing::Test {
- public:
-  OrtcFactoryIntegrationTest()
-      : network_thread_(&virtual_socket_server_),
-        fake_audio_capture_module1_(FakeAudioCaptureModule::Create()),
-        fake_audio_capture_module2_(FakeAudioCaptureModule::Create()) {
-    // Sockets are bound to the ANY address, so this is needed to tell the
-    // virtual network which address to use in this case.
-    virtual_socket_server_.SetDefaultRoute(kIPv4LocalHostAddress);
-    network_thread_.Start();
-    // Need to create after network thread is started.
-    ortc_factory1_ = OrtcFactoryInterface::Create(
-                         &network_thread_, nullptr, &fake_network_manager_,
-                         nullptr, fake_audio_capture_module1_)
-                         .MoveValue();
-    ortc_factory2_ = OrtcFactoryInterface::Create(
-                         &network_thread_, nullptr, &fake_network_manager_,
-                         nullptr, fake_audio_capture_module2_)
-                         .MoveValue();
-  }
-
- protected:
-  typedef std::pair<std::unique_ptr<UdpTransportInterface>,
-                    std::unique_ptr<UdpTransportInterface>>
-      UdpTransportPair;
-  typedef std::pair<std::unique_ptr<RtpTransportInterface>,
-                    std::unique_ptr<RtpTransportInterface>>
-      RtpTransportPair;
-  typedef std::pair<std::unique_ptr<SrtpTransportInterface>,
-                    std::unique_ptr<SrtpTransportInterface>>
-      SrtpTransportPair;
-  typedef std::pair<std::unique_ptr<RtpTransportControllerInterface>,
-                    std::unique_ptr<RtpTransportControllerInterface>>
-      RtpTransportControllerPair;
-
-  // Helper function that creates one UDP transport each for |ortc_factory1_|
-  // and |ortc_factory2_|, and connects them.
-  UdpTransportPair CreateAndConnectUdpTransportPair() {
-    auto transport1 = ortc_factory1_->CreateUdpTransport(AF_INET).MoveValue();
-    auto transport2 = ortc_factory2_->CreateUdpTransport(AF_INET).MoveValue();
-    transport1->SetRemoteAddress(
-        rtc::SocketAddress(virtual_socket_server_.GetDefaultRoute(AF_INET),
-                           transport2->GetLocalAddress().port()));
-    transport2->SetRemoteAddress(
-        rtc::SocketAddress(virtual_socket_server_.GetDefaultRoute(AF_INET),
-                           transport1->GetLocalAddress().port()));
-    return {std::move(transport1), std::move(transport2)};
-  }
-
-  // Creates one transport controller each for |ortc_factory1_| and
-  // |ortc_factory2_|.
-  RtpTransportControllerPair CreateRtpTransportControllerPair() {
-    return {ortc_factory1_->CreateRtpTransportController().MoveValue(),
-            ortc_factory2_->CreateRtpTransportController().MoveValue()};
-  }
-
-  // Helper function that creates a pair of RtpTransports between
-  // |ortc_factory1_| and |ortc_factory2_|. Expected to be called with the
-  // result of CreateAndConnectUdpTransportPair. |rtcp_udp_transports| can be
-  // empty if RTCP muxing is used. |transport_controllers| can be empty if
-  // these transports are being created using a default transport controller.
-  RtpTransportPair CreateRtpTransportPair(
-      const RtpTransportParameters& parameters,
-      const UdpTransportPair& rtp_udp_transports,
-      const UdpTransportPair& rtcp_udp_transports,
-      const RtpTransportControllerPair& transport_controllers) {
-    auto transport_result1 = ortc_factory1_->CreateRtpTransport(
-        parameters, rtp_udp_transports.first.get(),
-        rtcp_udp_transports.first.get(), transport_controllers.first.get());
-    auto transport_result2 = ortc_factory2_->CreateRtpTransport(
-        parameters, rtp_udp_transports.second.get(),
-        rtcp_udp_transports.second.get(), transport_controllers.second.get());
-    return {transport_result1.MoveValue(), transport_result2.MoveValue()};
-  }
-
-  SrtpTransportPair CreateSrtpTransportPair(
-      const RtpTransportParameters& parameters,
-      const UdpTransportPair& rtp_udp_transports,
-      const UdpTransportPair& rtcp_udp_transports,
-      const RtpTransportControllerPair& transport_controllers) {
-    auto transport_result1 = ortc_factory1_->CreateSrtpTransport(
-        parameters, rtp_udp_transports.first.get(),
-        rtcp_udp_transports.first.get(), transport_controllers.first.get());
-    auto transport_result2 = ortc_factory2_->CreateSrtpTransport(
-        parameters, rtp_udp_transports.second.get(),
-        rtcp_udp_transports.second.get(), transport_controllers.second.get());
-    return {transport_result1.MoveValue(), transport_result2.MoveValue()};
-  }
-
-  // For convenience when |rtcp_udp_transports| and |transport_controllers|
-  // aren't needed.
-  RtpTransportPair CreateRtpTransportPair(
-      const RtpTransportParameters& parameters,
-      const UdpTransportPair& rtp_udp_transports) {
-    return CreateRtpTransportPair(parameters, rtp_udp_transports,
-                                  UdpTransportPair(),
-                                  RtpTransportControllerPair());
-  }
-
-  SrtpTransportPair CreateSrtpTransportPairAndSetKeys(
-      const RtpTransportParameters& parameters,
-      const UdpTransportPair& rtp_udp_transports) {
-    SrtpTransportPair srtp_transports = CreateSrtpTransportPair(
-        parameters, rtp_udp_transports, UdpTransportPair(),
-        RtpTransportControllerPair());
-    EXPECT_TRUE(srtp_transports.first->SetSrtpSendKey(kTestCryptoParams1).ok());
-    EXPECT_TRUE(
-        srtp_transports.first->SetSrtpReceiveKey(kTestCryptoParams2).ok());
-    EXPECT_TRUE(
-        srtp_transports.second->SetSrtpSendKey(kTestCryptoParams2).ok());
-    EXPECT_TRUE(
-        srtp_transports.second->SetSrtpReceiveKey(kTestCryptoParams1).ok());
-    return srtp_transports;
-  }
-
-  SrtpTransportPair CreateSrtpTransportPairAndSetMismatchingKeys(
-      const RtpTransportParameters& parameters,
-      const UdpTransportPair& rtp_udp_transports) {
-    SrtpTransportPair srtp_transports = CreateSrtpTransportPair(
-        parameters, rtp_udp_transports, UdpTransportPair(),
-        RtpTransportControllerPair());
-    EXPECT_TRUE(srtp_transports.first->SetSrtpSendKey(kTestCryptoParams1).ok());
-    EXPECT_TRUE(
-        srtp_transports.first->SetSrtpReceiveKey(kTestCryptoParams2).ok());
-    EXPECT_TRUE(
-        srtp_transports.second->SetSrtpSendKey(kTestCryptoParams1).ok());
-    EXPECT_TRUE(
-        srtp_transports.second->SetSrtpReceiveKey(kTestCryptoParams2).ok());
-    return srtp_transports;
-  }
-
-  // Ends up using fake audio capture module, which was passed into OrtcFactory
-  // on creation.
-  rtc::scoped_refptr<webrtc::AudioTrackInterface> CreateLocalAudioTrack(
-      const std::string& id,
-      OrtcFactoryInterface* ortc_factory) {
-    // Disable echo cancellation to make test more efficient.
-    cricket::AudioOptions options;
-    options.echo_cancellation.emplace(true);
-    rtc::scoped_refptr<webrtc::AudioSourceInterface> source =
-        ortc_factory->CreateAudioSource(options);
-    return ortc_factory->CreateAudioTrack(id, source);
-  }
-
-  // Stores created capturer in |fake_video_capturers_|.
-  rtc::scoped_refptr<webrtc::VideoTrackInterface>
-  CreateLocalVideoTrackAndFakeCapturer(const std::string& id,
-                                       OrtcFactoryInterface* ortc_factory) {
-    cricket::FakeVideoCapturer* fake_capturer =
-        new webrtc::FakePeriodicVideoCapturer();
-    fake_video_capturers_.push_back(fake_capturer);
-    rtc::scoped_refptr<webrtc::VideoTrackSourceInterface> source =
-        ortc_factory->CreateVideoSource(
-            std::unique_ptr<cricket::VideoCapturer>(fake_capturer));
-    return rtc::scoped_refptr<webrtc::VideoTrackInterface>(
-        ortc_factory->CreateVideoTrack(id, source));
-  }
-
-  // Helper function used to test two way RTP senders and receivers with basic
-  // configurations.
-  // If |expect_success| is true, waits for kDefaultTimeout for
-  // kDefaultNumFrames frames to be received by all RtpReceivers.
-  // If |expect_success| is false, simply waits for |kReceivingDuration|, and
-  // stores the number of received frames in |received_audio_frame1_| etc.
-  void BasicTwoWayRtpSendersAndReceiversTest(RtpTransportPair srtp_transports,
-                                             bool expect_success) {
-    received_audio_frames1_ = 0;
-    received_audio_frames2_ = 0;
-    rendered_video_frames1_ = 0;
-    rendered_video_frames2_ = 0;
-    // Create all the senders and receivers (four per endpoint).
-    auto audio_sender_result1 = ortc_factory1_->CreateRtpSender(
-        cricket::MEDIA_TYPE_AUDIO, srtp_transports.first.get());
-    auto video_sender_result1 = ortc_factory1_->CreateRtpSender(
-        cricket::MEDIA_TYPE_VIDEO, srtp_transports.first.get());
-    auto audio_receiver_result1 = ortc_factory1_->CreateRtpReceiver(
-        cricket::MEDIA_TYPE_AUDIO, srtp_transports.first.get());
-    auto video_receiver_result1 = ortc_factory1_->CreateRtpReceiver(
-        cricket::MEDIA_TYPE_VIDEO, srtp_transports.first.get());
-    ASSERT_TRUE(audio_sender_result1.ok());
-    ASSERT_TRUE(video_sender_result1.ok());
-    ASSERT_TRUE(audio_receiver_result1.ok());
-    ASSERT_TRUE(video_receiver_result1.ok());
-    auto audio_sender1 = audio_sender_result1.MoveValue();
-    auto video_sender1 = video_sender_result1.MoveValue();
-    auto audio_receiver1 = audio_receiver_result1.MoveValue();
-    auto video_receiver1 = video_receiver_result1.MoveValue();
-
-    auto audio_sender_result2 = ortc_factory2_->CreateRtpSender(
-        cricket::MEDIA_TYPE_AUDIO, srtp_transports.second.get());
-    auto video_sender_result2 = ortc_factory2_->CreateRtpSender(
-        cricket::MEDIA_TYPE_VIDEO, srtp_transports.second.get());
-    auto audio_receiver_result2 = ortc_factory2_->CreateRtpReceiver(
-        cricket::MEDIA_TYPE_AUDIO, srtp_transports.second.get());
-    auto video_receiver_result2 = ortc_factory2_->CreateRtpReceiver(
-        cricket::MEDIA_TYPE_VIDEO, srtp_transports.second.get());
-    ASSERT_TRUE(audio_sender_result2.ok());
-    ASSERT_TRUE(video_sender_result2.ok());
-    ASSERT_TRUE(audio_receiver_result2.ok());
-    ASSERT_TRUE(video_receiver_result2.ok());
-    auto audio_sender2 = audio_sender_result2.MoveValue();
-    auto video_sender2 = video_sender_result2.MoveValue();
-    auto audio_receiver2 = audio_receiver_result2.MoveValue();
-    auto video_receiver2 = video_receiver_result2.MoveValue();
-
-    // Add fake tracks.
-    RTCError error = audio_sender1->SetTrack(
-        CreateLocalAudioTrack("audio", ortc_factory1_.get()));
-    EXPECT_TRUE(error.ok());
-    error = video_sender1->SetTrack(
-        CreateLocalVideoTrackAndFakeCapturer("video", ortc_factory1_.get()));
-    EXPECT_TRUE(error.ok());
-    error = audio_sender2->SetTrack(
-        CreateLocalAudioTrack("audio", ortc_factory2_.get()));
-    EXPECT_TRUE(error.ok());
-    error = video_sender2->SetTrack(
-        CreateLocalVideoTrackAndFakeCapturer("video", ortc_factory2_.get()));
-    EXPECT_TRUE(error.ok());
-
-    // "sent_X_parameters1" are the parameters that endpoint 1 sends with and
-    // endpoint 2 receives with.
-    RtpParameters sent_opus_parameters1 =
-        MakeMinimalOpusParametersWithSsrc(0xdeadbeef);
-    RtpParameters sent_vp8_parameters1 =
-        MakeMinimalVp8ParametersWithSsrc(0xbaadfeed);
-    RtpParameters sent_opus_parameters2 =
-        MakeMinimalOpusParametersWithSsrc(0x13333337);
-    RtpParameters sent_vp8_parameters2 =
-        MakeMinimalVp8ParametersWithSsrc(0x12345678);
-
-    // Configure the senders' and receivers' parameters.
-    EXPECT_TRUE(audio_receiver1->Receive(sent_opus_parameters2).ok());
-    EXPECT_TRUE(video_receiver1->Receive(sent_vp8_parameters2).ok());
-    EXPECT_TRUE(audio_receiver2->Receive(sent_opus_parameters1).ok());
-    EXPECT_TRUE(video_receiver2->Receive(sent_vp8_parameters1).ok());
-    EXPECT_TRUE(audio_sender1->Send(sent_opus_parameters1).ok());
-    EXPECT_TRUE(video_sender1->Send(sent_vp8_parameters1).ok());
-    EXPECT_TRUE(audio_sender2->Send(sent_opus_parameters2).ok());
-    EXPECT_TRUE(video_sender2->Send(sent_vp8_parameters2).ok());
-
-    FakeVideoTrackRenderer fake_video_renderer1(
-        static_cast<VideoTrackInterface*>(video_receiver1->GetTrack().get()));
-    FakeVideoTrackRenderer fake_video_renderer2(
-        static_cast<VideoTrackInterface*>(video_receiver2->GetTrack().get()));
-
-    if (expect_success) {
-      EXPECT_TRUE_WAIT(
-          fake_audio_capture_module1_->frames_received() > kDefaultNumFrames &&
-              fake_video_renderer1.num_rendered_frames() > kDefaultNumFrames &&
-              fake_audio_capture_module2_->frames_received() >
-                  kDefaultNumFrames &&
-              fake_video_renderer2.num_rendered_frames() > kDefaultNumFrames,
-          kDefaultTimeout) << "Audio capture module 1 received "
-                           << fake_audio_capture_module1_->frames_received()
-                           << " frames, Video renderer 1 rendered "
-                           << fake_video_renderer1.num_rendered_frames()
-                           << " frames, Audio capture module 2 received "
-                           << fake_audio_capture_module2_->frames_received()
-                           << " frames, Video renderer 2 rendered "
-                           << fake_video_renderer2.num_rendered_frames()
-                           << " frames.";
-    } else {
-      WAIT(false, kReceivingDuration);
-      rendered_video_frames1_ = fake_video_renderer1.num_rendered_frames();
-      rendered_video_frames2_ = fake_video_renderer2.num_rendered_frames();
-      received_audio_frames1_ = fake_audio_capture_module1_->frames_received();
-      received_audio_frames2_ = fake_audio_capture_module2_->frames_received();
-    }
-  }
-
-  rtc::VirtualSocketServer virtual_socket_server_;
-  rtc::Thread network_thread_;
-  rtc::FakeNetworkManager fake_network_manager_;
-  rtc::scoped_refptr<FakeAudioCaptureModule> fake_audio_capture_module1_;
-  rtc::scoped_refptr<FakeAudioCaptureModule> fake_audio_capture_module2_;
-  std::unique_ptr<OrtcFactoryInterface> ortc_factory1_;
-  std::unique_ptr<OrtcFactoryInterface> ortc_factory2_;
-  // Actually owned by video tracks.
-  std::vector<cricket::FakeVideoCapturer*> fake_video_capturers_;
-  int received_audio_frames1_ = 0;
-  int received_audio_frames2_ = 0;
-  int rendered_video_frames1_ = 0;
-  int rendered_video_frames2_ = 0;
-};
-
-// Disable for TSan v2, see
-// https://bugs.chromium.org/p/webrtc/issues/detail?id=7366 for details.
-#if !defined(THREAD_SANITIZER)
-
-// Very basic end-to-end test with a single pair of audio RTP sender and
-// receiver.
-//
-// Uses muxed RTCP, and minimal parameters with a hard-coded config that's
-// known to work.
-TEST_F(OrtcFactoryIntegrationTest, BasicOneWayAudioRtpSenderAndReceiver) {
-  auto udp_transports = CreateAndConnectUdpTransportPair();
-  auto rtp_transports =
-      CreateRtpTransportPair(MakeRtcpMuxParameters(), udp_transports);
-
-  auto sender_result = ortc_factory1_->CreateRtpSender(
-      cricket::MEDIA_TYPE_AUDIO, rtp_transports.first.get());
-  auto receiver_result = ortc_factory2_->CreateRtpReceiver(
-      cricket::MEDIA_TYPE_AUDIO, rtp_transports.second.get());
-  ASSERT_TRUE(sender_result.ok());
-  ASSERT_TRUE(receiver_result.ok());
-  auto sender = sender_result.MoveValue();
-  auto receiver = receiver_result.MoveValue();
-
-  RTCError error =
-      sender->SetTrack(CreateLocalAudioTrack("audio", ortc_factory1_.get()));
-  EXPECT_TRUE(error.ok());
-
-  RtpParameters opus_parameters = MakeMinimalOpusParameters();
-  EXPECT_TRUE(receiver->Receive(opus_parameters).ok());
-  EXPECT_TRUE(sender->Send(opus_parameters).ok());
-  // Sender and receiver are connected and configured; audio frames should be
-  // able to flow at this point.
-  EXPECT_TRUE_WAIT(
-      fake_audio_capture_module2_->frames_received() > kDefaultNumFrames,
-      kDefaultTimeout);
-}
-
-// Very basic end-to-end test with a single pair of video RTP sender and
-// receiver.
-//
-// Uses muxed RTCP, and minimal parameters with a hard-coded config that's
-// known to work.
-TEST_F(OrtcFactoryIntegrationTest, BasicOneWayVideoRtpSenderAndReceiver) {
-  auto udp_transports = CreateAndConnectUdpTransportPair();
-  auto rtp_transports =
-      CreateRtpTransportPair(MakeRtcpMuxParameters(), udp_transports);
-
-  auto sender_result = ortc_factory1_->CreateRtpSender(
-      cricket::MEDIA_TYPE_VIDEO, rtp_transports.first.get());
-  auto receiver_result = ortc_factory2_->CreateRtpReceiver(
-      cricket::MEDIA_TYPE_VIDEO, rtp_transports.second.get());
-  ASSERT_TRUE(sender_result.ok());
-  ASSERT_TRUE(receiver_result.ok());
-  auto sender = sender_result.MoveValue();
-  auto receiver = receiver_result.MoveValue();
-
-  RTCError error = sender->SetTrack(
-      CreateLocalVideoTrackAndFakeCapturer("video", ortc_factory1_.get()));
-  EXPECT_TRUE(error.ok());
-
-  RtpParameters vp8_parameters = MakeMinimalVp8Parameters();
-  EXPECT_TRUE(receiver->Receive(vp8_parameters).ok());
-  EXPECT_TRUE(sender->Send(vp8_parameters).ok());
-  FakeVideoTrackRenderer fake_renderer(
-      static_cast<VideoTrackInterface*>(receiver->GetTrack().get()));
-  // Sender and receiver are connected and configured; video frames should be
-  // able to flow at this point.
-  EXPECT_TRUE_WAIT(fake_renderer.num_rendered_frames() > kDefaultNumFrames,
-                   kDefaultTimeout);
-}
-
-// Test that if the track is changed while sending, the sender seamlessly
-// transitions to sending it and frames are received end-to-end.
-//
-// Only doing this for video, since given that audio is sourced from a single
-// fake audio capture module, the audio track is just a dummy object.
-// TODO(deadbeef): Change this when possible.
-TEST_F(OrtcFactoryIntegrationTest, SetTrackWhileSending) {
-  auto udp_transports = CreateAndConnectUdpTransportPair();
-  auto rtp_transports =
-      CreateRtpTransportPair(MakeRtcpMuxParameters(), udp_transports);
-
-  auto sender_result = ortc_factory1_->CreateRtpSender(
-      cricket::MEDIA_TYPE_VIDEO, rtp_transports.first.get());
-  auto receiver_result = ortc_factory2_->CreateRtpReceiver(
-      cricket::MEDIA_TYPE_VIDEO, rtp_transports.second.get());
-  ASSERT_TRUE(sender_result.ok());
-  ASSERT_TRUE(receiver_result.ok());
-  auto sender = sender_result.MoveValue();
-  auto receiver = receiver_result.MoveValue();
-
-  RTCError error = sender->SetTrack(
-      CreateLocalVideoTrackAndFakeCapturer("video_1", ortc_factory1_.get()));
-  EXPECT_TRUE(error.ok());
-  RtpParameters vp8_parameters = MakeMinimalVp8Parameters();
-  EXPECT_TRUE(receiver->Receive(vp8_parameters).ok());
-  EXPECT_TRUE(sender->Send(vp8_parameters).ok());
-  FakeVideoTrackRenderer fake_renderer(
-      static_cast<VideoTrackInterface*>(receiver->GetTrack().get()));
-  // Expect for some initial number of frames to be received.
-  EXPECT_TRUE_WAIT(fake_renderer.num_rendered_frames() > kDefaultNumFrames,
-                   kDefaultTimeout);
-  // Stop the old capturer, set a new track, and verify new frames are received
-  // from the new track. Stopping the old capturer ensures that we aren't
-  // actually still getting frames from it.
-  fake_video_capturers_[0]->Stop();
-  int prev_num_frames = fake_renderer.num_rendered_frames();
-  error = sender->SetTrack(
-      CreateLocalVideoTrackAndFakeCapturer("video_2", ortc_factory1_.get()));
-  EXPECT_TRUE(error.ok());
-  EXPECT_TRUE_WAIT(
-      fake_renderer.num_rendered_frames() > kDefaultNumFrames + prev_num_frames,
-      kDefaultTimeout);
-}
-
-// End-to-end test with two pairs of RTP senders and receivers, for audio and
-// video.
-//
-// Uses muxed RTCP, and minimal parameters with hard-coded configs that are
-// known to work.
-TEST_F(OrtcFactoryIntegrationTest,
-       BasicTwoWayAudioVideoRtpSendersAndReceivers) {
-  auto udp_transports = CreateAndConnectUdpTransportPair();
-  auto rtp_transports =
-      CreateRtpTransportPair(MakeRtcpMuxParameters(), udp_transports);
-  bool expect_success = true;
-  BasicTwoWayRtpSendersAndReceiversTest(std::move(rtp_transports),
-                                        expect_success);
-}
-
-#if !(defined(WEBRTC_IOS) && defined(WEBRTC_ARCH_64_BITS) && !defined(NDEBUG))
-TEST_F(OrtcFactoryIntegrationTest,
-       BasicTwoWayAudioVideoSrtpSendersAndReceivers) {
-  auto udp_transports = CreateAndConnectUdpTransportPair();
-  auto srtp_transports = CreateSrtpTransportPairAndSetKeys(
-      MakeRtcpMuxParameters(), udp_transports);
-  bool expect_success = true;
-  BasicTwoWayRtpSendersAndReceiversTest(std::move(srtp_transports),
-                                        expect_success);
-}
-#endif
-
-// Tests that the packets cannot be decoded if the keys are mismatched.
-TEST_F(OrtcFactoryIntegrationTest, SrtpSendersAndReceiversWithMismatchingKeys) {
-  auto udp_transports = CreateAndConnectUdpTransportPair();
-  auto srtp_transports = CreateSrtpTransportPairAndSetMismatchingKeys(
-      MakeRtcpMuxParameters(), udp_transports);
-  bool expect_success = false;
-  BasicTwoWayRtpSendersAndReceiversTest(std::move(srtp_transports),
-                                        expect_success);
-  // No frames are expected to be decoded.
-  EXPECT_TRUE(received_audio_frames1_ == 0 && received_audio_frames2_ == 0 &&
-              rendered_video_frames1_ == 0 && rendered_video_frames2_ == 0);
-}
-
-// Tests that the frames cannot be decoded if only one side uses SRTP.
-TEST_F(OrtcFactoryIntegrationTest, OneSideSrtpSenderAndReceiver) {
-  auto rtcp_parameters = MakeRtcpMuxParameters();
-  auto udp_transports = CreateAndConnectUdpTransportPair();
-  auto rtcp_udp_transports = UdpTransportPair();
-  auto transport_controllers = RtpTransportControllerPair();
-  auto transport_result1 = ortc_factory1_->CreateRtpTransport(
-      rtcp_parameters, udp_transports.first.get(),
-      rtcp_udp_transports.first.get(), transport_controllers.first.get());
-  auto transport_result2 = ortc_factory2_->CreateSrtpTransport(
-      rtcp_parameters, udp_transports.second.get(),
-      rtcp_udp_transports.second.get(), transport_controllers.second.get());
-
-  auto rtp_transport = transport_result1.MoveValue();
-  auto srtp_transport = transport_result2.MoveValue();
-  EXPECT_TRUE(srtp_transport->SetSrtpSendKey(kTestCryptoParams1).ok());
-  EXPECT_TRUE(srtp_transport->SetSrtpReceiveKey(kTestCryptoParams2).ok());
-  bool expect_success = false;
-  BasicTwoWayRtpSendersAndReceiversTest(
-      {std::move(rtp_transport), std::move(srtp_transport)}, expect_success);
-
-  // The SRTP side is not expected to decode any audio or video frames.
-  // The RTP side is not expected to decode any video frames while it is
-  // possible that the encrypted audio frames can be accidentally decoded which
-  // is why received_audio_frames1_ is not validated.
-  EXPECT_TRUE(received_audio_frames2_ == 0 && rendered_video_frames1_ == 0 &&
-              rendered_video_frames2_ == 0);
-}
-
-// End-to-end test with two pairs of RTP senders and receivers, for audio and
-// video. Unlike the test above, this attempts to make the parameters as
-// complex as possible. The senders and receivers use the SRTP transport with
-// different keys.
-//
-// Uses non-muxed RTCP, with separate audio/video transports, and a full set of
-// parameters, as would normally be used in a PeerConnection.
-//
-// TODO(deadbeef): Update this test as more audio/video features become
-// supported.
-TEST_F(OrtcFactoryIntegrationTest,
-       FullTwoWayAudioVideoSrtpSendersAndReceivers) {
-  // We want four pairs of UDP transports for this test, for audio/video and
-  // RTP/RTCP.
-  auto audio_rtp_udp_transports = CreateAndConnectUdpTransportPair();
-  auto audio_rtcp_udp_transports = CreateAndConnectUdpTransportPair();
-  auto video_rtp_udp_transports = CreateAndConnectUdpTransportPair();
-  auto video_rtcp_udp_transports = CreateAndConnectUdpTransportPair();
-
-  // Since we have multiple RTP transports on each side, we need an RTP
-  // transport controller.
-  auto transport_controllers = CreateRtpTransportControllerPair();
-
-  RtpTransportParameters audio_rtp_transport_parameters;
-  audio_rtp_transport_parameters.rtcp.mux = false;
-  auto audio_srtp_transports = CreateSrtpTransportPair(
-      audio_rtp_transport_parameters, audio_rtp_udp_transports,
-      audio_rtcp_udp_transports, transport_controllers);
-
-  RtpTransportParameters video_rtp_transport_parameters;
-  video_rtp_transport_parameters.rtcp.mux = false;
-  video_rtp_transport_parameters.rtcp.reduced_size = true;
-  auto video_srtp_transports = CreateSrtpTransportPair(
-      video_rtp_transport_parameters, video_rtp_udp_transports,
-      video_rtcp_udp_transports, transport_controllers);
-
-  // Set keys for SRTP transports.
-  audio_srtp_transports.first->SetSrtpSendKey(kTestCryptoParams1);
-  audio_srtp_transports.first->SetSrtpReceiveKey(kTestCryptoParams2);
-  video_srtp_transports.first->SetSrtpSendKey(kTestCryptoParams3);
-  video_srtp_transports.first->SetSrtpReceiveKey(kTestCryptoParams4);
-
-  audio_srtp_transports.second->SetSrtpSendKey(kTestCryptoParams2);
-  audio_srtp_transports.second->SetSrtpReceiveKey(kTestCryptoParams1);
-  video_srtp_transports.second->SetSrtpSendKey(kTestCryptoParams4);
-  video_srtp_transports.second->SetSrtpReceiveKey(kTestCryptoParams3);
-
-  // Create all the senders and receivers (four per endpoint).
-  auto audio_sender_result1 = ortc_factory1_->CreateRtpSender(
-      cricket::MEDIA_TYPE_AUDIO, audio_srtp_transports.first.get());
-  auto video_sender_result1 = ortc_factory1_->CreateRtpSender(
-      cricket::MEDIA_TYPE_VIDEO, video_srtp_transports.first.get());
-  auto audio_receiver_result1 = ortc_factory1_->CreateRtpReceiver(
-      cricket::MEDIA_TYPE_AUDIO, audio_srtp_transports.first.get());
-  auto video_receiver_result1 = ortc_factory1_->CreateRtpReceiver(
-      cricket::MEDIA_TYPE_VIDEO, video_srtp_transports.first.get());
-  ASSERT_TRUE(audio_sender_result1.ok());
-  ASSERT_TRUE(video_sender_result1.ok());
-  ASSERT_TRUE(audio_receiver_result1.ok());
-  ASSERT_TRUE(video_receiver_result1.ok());
-  auto audio_sender1 = audio_sender_result1.MoveValue();
-  auto video_sender1 = video_sender_result1.MoveValue();
-  auto audio_receiver1 = audio_receiver_result1.MoveValue();
-  auto video_receiver1 = video_receiver_result1.MoveValue();
-
-  auto audio_sender_result2 = ortc_factory2_->CreateRtpSender(
-      cricket::MEDIA_TYPE_AUDIO, audio_srtp_transports.second.get());
-  auto video_sender_result2 = ortc_factory2_->CreateRtpSender(
-      cricket::MEDIA_TYPE_VIDEO, video_srtp_transports.second.get());
-  auto audio_receiver_result2 = ortc_factory2_->CreateRtpReceiver(
-      cricket::MEDIA_TYPE_AUDIO, audio_srtp_transports.second.get());
-  auto video_receiver_result2 = ortc_factory2_->CreateRtpReceiver(
-      cricket::MEDIA_TYPE_VIDEO, video_srtp_transports.second.get());
-  ASSERT_TRUE(audio_sender_result2.ok());
-  ASSERT_TRUE(video_sender_result2.ok());
-  ASSERT_TRUE(audio_receiver_result2.ok());
-  ASSERT_TRUE(video_receiver_result2.ok());
-  auto audio_sender2 = audio_sender_result2.MoveValue();
-  auto video_sender2 = video_sender_result2.MoveValue();
-  auto audio_receiver2 = audio_receiver_result2.MoveValue();
-  auto video_receiver2 = video_receiver_result2.MoveValue();
-
-  RTCError error = audio_sender1->SetTrack(
-      CreateLocalAudioTrack("audio", ortc_factory1_.get()));
-  EXPECT_TRUE(error.ok());
-  error = video_sender1->SetTrack(
-      CreateLocalVideoTrackAndFakeCapturer("video", ortc_factory1_.get()));
-  EXPECT_TRUE(error.ok());
-  error = audio_sender2->SetTrack(
-      CreateLocalAudioTrack("audio", ortc_factory2_.get()));
-  EXPECT_TRUE(error.ok());
-  error = video_sender2->SetTrack(
-      CreateLocalVideoTrackAndFakeCapturer("video", ortc_factory2_.get()));
-  EXPECT_TRUE(error.ok());
-
-  // Use different codecs in different directions for extra challenge.
-  RtpParameters opus_send_parameters = MakeFullOpusParameters();
-  RtpParameters isac_send_parameters = MakeFullIsacParameters();
-  RtpParameters vp8_send_parameters = MakeFullVp8Parameters();
-  RtpParameters vp9_send_parameters = MakeFullVp9Parameters();
-
-  // Remove "payload_type" from receive parameters. Receiver will need to
-  // discern the payload type from packets received.
-  RtpParameters opus_receive_parameters = opus_send_parameters;
-  RtpParameters isac_receive_parameters = isac_send_parameters;
-  RtpParameters vp8_receive_parameters = vp8_send_parameters;
-  RtpParameters vp9_receive_parameters = vp9_send_parameters;
-  opus_receive_parameters.encodings[0].codec_payload_type.reset();
-  isac_receive_parameters.encodings[0].codec_payload_type.reset();
-  vp8_receive_parameters.encodings[0].codec_payload_type.reset();
-  vp9_receive_parameters.encodings[0].codec_payload_type.reset();
-
-  // Configure the senders' and receivers' parameters.
-  //
-  // Note: Intentionally, the top codec in the receive parameters does not
-  // match the codec sent by the other side. If "Receive" is called with a list
-  // of codecs, the receiver should be prepared to receive any of them, not
-  // just the one on top.
-  EXPECT_TRUE(audio_receiver1->Receive(opus_receive_parameters).ok());
-  EXPECT_TRUE(video_receiver1->Receive(vp8_receive_parameters).ok());
-  EXPECT_TRUE(audio_receiver2->Receive(isac_receive_parameters).ok());
-  EXPECT_TRUE(video_receiver2->Receive(vp9_receive_parameters).ok());
-  EXPECT_TRUE(audio_sender1->Send(opus_send_parameters).ok());
-  EXPECT_TRUE(video_sender1->Send(vp8_send_parameters).ok());
-  EXPECT_TRUE(audio_sender2->Send(isac_send_parameters).ok());
-  EXPECT_TRUE(video_sender2->Send(vp9_send_parameters).ok());
-
-  FakeVideoTrackRenderer fake_video_renderer1(
-      static_cast<VideoTrackInterface*>(video_receiver1->GetTrack().get()));
-  FakeVideoTrackRenderer fake_video_renderer2(
-      static_cast<VideoTrackInterface*>(video_receiver2->GetTrack().get()));
-
-  // Senders and receivers are connected and configured; audio and video frames
-  // should be able to flow at this point.
-  EXPECT_TRUE_WAIT(
-      fake_audio_capture_module1_->frames_received() > kDefaultNumFrames &&
-          fake_video_renderer1.num_rendered_frames() > kDefaultNumFrames &&
-          fake_audio_capture_module2_->frames_received() > kDefaultNumFrames &&
-          fake_video_renderer2.num_rendered_frames() > kDefaultNumFrames,
-      kDefaultTimeout);
-}
-
-// TODO(deadbeef): End-to-end test for multiple senders/receivers of the same
-// media type, once that's supported. Currently, it is not because the
-// BaseChannel model relies on there being a single VoiceChannel and
-// VideoChannel, and these only support a single set of codecs/etc. per
-// send/receive direction.
-
-// TODO(deadbeef): End-to-end test for simulcast, once that's supported by this
-// API.
-
-#endif  // if !defined(THREAD_SANITIZER)
-
-}  // namespace webrtc
diff --git a/ortc/ortcfactory_unittest.cc b/ortc/ortcfactory_unittest.cc
deleted file mode 100644
index ba8dfe9..0000000
--- a/ortc/ortcfactory_unittest.cc
+++ /dev/null
@@ -1,246 +0,0 @@
-/*
- *  Copyright 2017 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 <memory>
-
-#include "webrtc/media/base/fakemediaengine.h"
-#include "webrtc/ortc/ortcfactory.h"
-#include "webrtc/ortc/testrtpparameters.h"
-#include "webrtc/p2p/base/fakepackettransport.h"
-#include "webrtc/rtc_base/fakenetwork.h"
-#include "webrtc/rtc_base/gunit.h"
-#include "webrtc/rtc_base/virtualsocketserver.h"
-
-namespace webrtc {
-
-// This test uses a virtual network and fake media engine, in order to test the
-// OrtcFactory at only an API level. Any end-to-end test should go in
-// ortcfactory_integrationtest.cc instead.
-class OrtcFactoryTest : public testing::Test {
- public:
-  OrtcFactoryTest()
-      : thread_(&virtual_socket_server_),
-        fake_packet_transport_("fake transport") {
-    ortc_factory_ =
-        OrtcFactory::Create(&thread_, nullptr, &fake_network_manager_, nullptr,
-                            nullptr,
-                            std::unique_ptr<cricket::MediaEngineInterface>(
-                                new cricket::FakeMediaEngine()))
-            .MoveValue();
-  }
-
- protected:
-  // Uses a single pre-made FakePacketTransport, so shouldn't be called twice in
-  // the same test.
-  std::unique_ptr<RtpTransportInterface>
-  CreateRtpTransportWithFakePacketTransport() {
-    return ortc_factory_
-        ->CreateRtpTransport(MakeRtcpMuxParameters(), &fake_packet_transport_,
-                             nullptr, nullptr)
-        .MoveValue();
-  }
-
-  rtc::VirtualSocketServer virtual_socket_server_;
-  rtc::AutoSocketServerThread thread_;
-  rtc::FakeNetworkManager fake_network_manager_;
-  rtc::FakePacketTransport fake_packet_transport_;
-  std::unique_ptr<OrtcFactoryInterface> ortc_factory_;
-};
-
-TEST_F(OrtcFactoryTest, CanCreateMultipleRtpTransportControllers) {
-  auto controller_result1 = ortc_factory_->CreateRtpTransportController();
-  EXPECT_TRUE(controller_result1.ok());
-  auto controller_result2 = ortc_factory_->CreateRtpTransportController();
-  EXPECT_TRUE(controller_result1.ok());
-}
-
-// Simple test for the successful cases of CreateRtpTransport.
-TEST_F(OrtcFactoryTest, CreateRtpTransportWithAndWithoutMux) {
-  rtc::FakePacketTransport rtp("rtp");
-  rtc::FakePacketTransport rtcp("rtcp");
-  // With muxed RTCP.
-  RtpTransportParameters parameters = MakeRtcpMuxParameters();
-  auto result =
-      ortc_factory_->CreateRtpTransport(parameters, &rtp, nullptr, nullptr);
-  EXPECT_TRUE(result.ok());
-  result.MoveValue().reset();
-  // With non-muxed RTCP.
-  parameters.rtcp.mux = false;
-  result = ortc_factory_->CreateRtpTransport(parameters, &rtp, &rtcp, nullptr);
-  EXPECT_TRUE(result.ok());
-}
-
-// Simple test for the successful cases of CreateSrtpTransport.
-TEST_F(OrtcFactoryTest, CreateSrtpTransport) {
-  rtc::FakePacketTransport rtp("rtp");
-  rtc::FakePacketTransport rtcp("rtcp");
-  // With muxed RTCP.
-  RtpTransportParameters parameters = MakeRtcpMuxParameters();
-  auto result =
-      ortc_factory_->CreateSrtpTransport(parameters, &rtp, nullptr, nullptr);
-  EXPECT_TRUE(result.ok());
-  result.MoveValue().reset();
-  // With non-muxed RTCP.
-  parameters.rtcp.mux = false;
-  result = ortc_factory_->CreateSrtpTransport(parameters, &rtp, &rtcp, nullptr);
-  EXPECT_TRUE(result.ok());
-}
-
-// If no CNAME is provided, one should be generated and returned by
-// GetRtpParameters.
-TEST_F(OrtcFactoryTest, CreateRtpTransportGeneratesCname) {
-  rtc::FakePacketTransport rtp("rtp");
-  auto result = ortc_factory_->CreateRtpTransport(MakeRtcpMuxParameters(), &rtp,
-                                                  nullptr, nullptr);
-  ASSERT_TRUE(result.ok());
-  EXPECT_FALSE(result.value()->GetParameters().rtcp.cname.empty());
-}
-
-// Extension of the above test; multiple transports created by the same factory
-// should use the same generated CNAME.
-TEST_F(OrtcFactoryTest, MultipleRtpTransportsUseSameGeneratedCname) {
-  rtc::FakePacketTransport packet_transport1("1");
-  rtc::FakePacketTransport packet_transport2("2");
-  RtpTransportParameters parameters = MakeRtcpMuxParameters();
-  // Sanity check.
-  ASSERT_TRUE(parameters.rtcp.cname.empty());
-  auto result = ortc_factory_->CreateRtpTransport(
-      parameters, &packet_transport1, nullptr, nullptr);
-  ASSERT_TRUE(result.ok());
-  auto rtp_transport1 = result.MoveValue();
-  result = ortc_factory_->CreateRtpTransport(parameters, &packet_transport2,
-                                             nullptr, nullptr);
-  ASSERT_TRUE(result.ok());
-  auto rtp_transport2 = result.MoveValue();
-  RtcpParameters params1 = rtp_transport1->GetParameters().rtcp;
-  RtcpParameters params2 = rtp_transport2->GetParameters().rtcp;
-  EXPECT_FALSE(params1.cname.empty());
-  EXPECT_EQ(params1.cname, params2.cname);
-}
-
-TEST_F(OrtcFactoryTest, CreateRtpTransportWithNoPacketTransport) {
-  auto result = ortc_factory_->CreateRtpTransport(MakeRtcpMuxParameters(),
-                                                  nullptr, nullptr, nullptr);
-  EXPECT_EQ(RTCErrorType::INVALID_PARAMETER, result.error().type());
-}
-
-// If the |mux| member of the RtcpParameters is false, both an RTP and RTCP
-// packet transport are needed.
-TEST_F(OrtcFactoryTest, CreateRtpTransportWithMissingRtcpTransport) {
-  rtc::FakePacketTransport rtp("rtp");
-  RtpTransportParameters parameters;
-  parameters.rtcp.mux = false;
-  auto result =
-      ortc_factory_->CreateRtpTransport(parameters, &rtp, nullptr, nullptr);
-  EXPECT_EQ(RTCErrorType::INVALID_PARAMETER, result.error().type());
-}
-
-// If the |mux| member of the RtcpParameters is true, only an RTP packet
-// transport is necessary. So, passing in an RTCP transport is most likely
-// an accident, and thus should be treated as an error.
-TEST_F(OrtcFactoryTest, CreateRtpTransportWithExtraneousRtcpTransport) {
-  rtc::FakePacketTransport rtp("rtp");
-  rtc::FakePacketTransport rtcp("rtcp");
-  auto result = ortc_factory_->CreateRtpTransport(MakeRtcpMuxParameters(), &rtp,
-                                                  &rtcp, nullptr);
-  EXPECT_EQ(RTCErrorType::INVALID_PARAMETER, result.error().type());
-}
-
-// Basic test that CreateUdpTransport works with AF_INET and AF_INET6.
-TEST_F(OrtcFactoryTest, CreateUdpTransport) {
-  auto result = ortc_factory_->CreateUdpTransport(AF_INET);
-  EXPECT_TRUE(result.ok());
-  result = ortc_factory_->CreateUdpTransport(AF_INET6);
-  EXPECT_TRUE(result.ok());
-}
-
-// Test CreateUdpPort with the |min_port| and |max_port| arguments.
-TEST_F(OrtcFactoryTest, CreateUdpTransportWithPortRange) {
-  auto socket_result1 = ortc_factory_->CreateUdpTransport(AF_INET, 2000, 2002);
-  ASSERT_TRUE(socket_result1.ok());
-  EXPECT_EQ(2000, socket_result1.value()->GetLocalAddress().port());
-  auto socket_result2 = ortc_factory_->CreateUdpTransport(AF_INET, 2000, 2002);
-  ASSERT_TRUE(socket_result2.ok());
-  EXPECT_EQ(2001, socket_result2.value()->GetLocalAddress().port());
-  auto socket_result3 = ortc_factory_->CreateUdpTransport(AF_INET, 2000, 2002);
-  ASSERT_TRUE(socket_result3.ok());
-  EXPECT_EQ(2002, socket_result3.value()->GetLocalAddress().port());
-
-  // All sockets in the range have been exhausted, so the next call should
-  // fail.
-  auto failed_result = ortc_factory_->CreateUdpTransport(AF_INET, 2000, 2002);
-  EXPECT_EQ(RTCErrorType::RESOURCE_EXHAUSTED, failed_result.error().type());
-
-  // If one socket is destroyed, that port should be freed up again.
-  socket_result2.MoveValue().reset();
-  auto socket_result4 = ortc_factory_->CreateUdpTransport(AF_INET, 2000, 2002);
-  ASSERT_TRUE(socket_result4.ok());
-  EXPECT_EQ(2001, socket_result4.value()->GetLocalAddress().port());
-}
-
-// Basic test that CreateUdpTransport works with AF_INET and AF_INET6.
-TEST_F(OrtcFactoryTest, CreateUdpTransportWithInvalidAddressFamily) {
-  auto result = ortc_factory_->CreateUdpTransport(12345);
-  EXPECT_EQ(RTCErrorType::INVALID_PARAMETER, result.error().type());
-}
-
-TEST_F(OrtcFactoryTest, CreateUdpTransportWithInvalidPortRange) {
-  auto result = ortc_factory_->CreateUdpTransport(AF_INET, 3000, 2000);
-  EXPECT_EQ(RTCErrorType::INVALID_RANGE, result.error().type());
-}
-
-// Just sanity check that each "GetCapabilities" method returns some codecs.
-TEST_F(OrtcFactoryTest, GetSenderAndReceiverCapabilities) {
-  RtpCapabilities audio_send_caps =
-      ortc_factory_->GetRtpSenderCapabilities(cricket::MEDIA_TYPE_AUDIO);
-  EXPECT_GT(audio_send_caps.codecs.size(), 0u);
-  RtpCapabilities video_send_caps =
-      ortc_factory_->GetRtpSenderCapabilities(cricket::MEDIA_TYPE_VIDEO);
-  EXPECT_GT(video_send_caps.codecs.size(), 0u);
-  RtpCapabilities audio_receive_caps =
-      ortc_factory_->GetRtpReceiverCapabilities(cricket::MEDIA_TYPE_AUDIO);
-  EXPECT_GT(audio_receive_caps.codecs.size(), 0u);
-  RtpCapabilities video_receive_caps =
-      ortc_factory_->GetRtpReceiverCapabilities(cricket::MEDIA_TYPE_VIDEO);
-  EXPECT_GT(video_receive_caps.codecs.size(), 0u);
-}
-
-// Calling CreateRtpSender with a null track should fail, since that makes it
-// impossible to know whether to create an audio or video sender. The
-// application should be using the method that takes a cricket::MediaType
-// instead.
-TEST_F(OrtcFactoryTest, CreateSenderWithNullTrack) {
-  auto rtp_transport = CreateRtpTransportWithFakePacketTransport();
-  auto result = ortc_factory_->CreateRtpSender(nullptr, rtp_transport.get());
-  EXPECT_EQ(RTCErrorType::INVALID_PARAMETER, result.error().type());
-}
-
-// Calling CreateRtpSender or CreateRtpReceiver with MEDIA_TYPE_DATA should
-// fail.
-TEST_F(OrtcFactoryTest, CreateSenderOrReceieverWithInvalidKind) {
-  auto rtp_transport = CreateRtpTransportWithFakePacketTransport();
-  auto sender_result = ortc_factory_->CreateRtpSender(cricket::MEDIA_TYPE_DATA,
-                                                      rtp_transport.get());
-  EXPECT_EQ(RTCErrorType::INVALID_PARAMETER, sender_result.error().type());
-  auto receiver_result = ortc_factory_->CreateRtpReceiver(
-      cricket::MEDIA_TYPE_DATA, rtp_transport.get());
-  EXPECT_EQ(RTCErrorType::INVALID_PARAMETER, receiver_result.error().type());
-}
-
-TEST_F(OrtcFactoryTest, CreateSendersOrReceieversWithNullTransport) {
-  auto sender_result =
-      ortc_factory_->CreateRtpSender(cricket::MEDIA_TYPE_AUDIO, nullptr);
-  EXPECT_EQ(RTCErrorType::INVALID_PARAMETER, sender_result.error().type());
-  auto receiver_result =
-      ortc_factory_->CreateRtpReceiver(cricket::MEDIA_TYPE_AUDIO, nullptr);
-  EXPECT_EQ(RTCErrorType::INVALID_PARAMETER, receiver_result.error().type());
-}
-
-}  // namespace webrtc
diff --git a/ortc/ortcrtpreceiver_unittest.cc b/ortc/ortcrtpreceiver_unittest.cc
deleted file mode 100644
index 0e2b722..0000000
--- a/ortc/ortcrtpreceiver_unittest.cc
+++ /dev/null
@@ -1,547 +0,0 @@
-/*
- *  Copyright 2017 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 <memory>
-
-#include "webrtc/media/base/fakemediaengine.h"
-#include "webrtc/ortc/ortcfactory.h"
-#include "webrtc/ortc/testrtpparameters.h"
-#include "webrtc/p2p/base/fakepackettransport.h"
-#include "webrtc/pc/test/fakevideotracksource.h"
-#include "webrtc/rtc_base/gunit.h"
-
-namespace webrtc {
-
-// This test uses an individual RtpReceiver using only the public interface,
-// and verifies that it behaves as designed at an API level. Also tests that
-// parameters are applied to the audio/video engines as expected. Network and
-// media interfaces are faked to isolate what's being tested.
-//
-// This test shouldn't result any any actual media being sent. That sort of
-// test should go in ortcfactory_integrationtest.cc.
-class OrtcRtpReceiverTest : public testing::Test {
- public:
-  OrtcRtpReceiverTest() : fake_packet_transport_("fake") {
-    fake_media_engine_ = new cricket::FakeMediaEngine();
-    // Note: This doesn't need to use fake network classes, since we already
-    // use FakePacketTransport.
-    auto ortc_factory_result = OrtcFactory::Create(
-        nullptr, nullptr, nullptr, nullptr, nullptr,
-        std::unique_ptr<cricket::MediaEngineInterface>(fake_media_engine_));
-    ortc_factory_ = ortc_factory_result.MoveValue();
-    RtpTransportParameters parameters;
-    parameters.rtcp.mux = true;
-    auto rtp_transport_result = ortc_factory_->CreateRtpTransport(
-        parameters, &fake_packet_transport_, nullptr, nullptr);
-    rtp_transport_ = rtp_transport_result.MoveValue();
-  }
-
- protected:
-  // Owned by |ortc_factory_|.
-  cricket::FakeMediaEngine* fake_media_engine_;
-  rtc::FakePacketTransport fake_packet_transport_;
-  std::unique_ptr<OrtcFactoryInterface> ortc_factory_;
-  std::unique_ptr<RtpTransportInterface> rtp_transport_;
-};
-
-// See ortcrtpreceiverinterface.h for the current expectations of what GetTrack
-// will return after calls to Receive.
-// TODO(deadbeef): Replace this test when the non-standard behavior is fixed
-// and GetTrack starts returning the same track for the lifetime of the
-// receiver.
-TEST_F(OrtcRtpReceiverTest, GetTrack) {
-  auto receiver_result = ortc_factory_->CreateRtpReceiver(
-      cricket::MEDIA_TYPE_VIDEO, rtp_transport_.get());
-  ASSERT_TRUE(receiver_result.ok());
-  auto receiver = receiver_result.MoveValue();
-
-  // Track initially expected to be null.
-  EXPECT_EQ(nullptr, receiver_result.value().get());
-
-  EXPECT_TRUE(receiver->Receive(MakeMinimalVp8ParametersWithNoSsrc()).ok());
-  auto initial_track = receiver->GetTrack();
-  EXPECT_NE(nullptr, initial_track);
-
-  // Codec changing but SSRC (or lack thereof) isn't; shouldn't create new track
-  EXPECT_TRUE(receiver->Receive(MakeMinimalVp9ParametersWithNoSsrc()).ok());
-  EXPECT_EQ(initial_track, receiver->GetTrack());
-
-  // Explicitly set SSRC and expect a different track.
-  EXPECT_TRUE(
-      receiver->Receive(MakeMinimalVp9ParametersWithSsrc(0xdeadbeef)).ok());
-  auto next_track = receiver->GetTrack();
-  EXPECT_NE(next_track, initial_track);
-
-  // Deactivating the encoding shouldn't change the track.
-  RtpParameters inactive_encoding =
-      MakeMinimalVp9ParametersWithSsrc(0xdeadbeef);
-  inactive_encoding.encodings[0].active = false;
-  EXPECT_TRUE(receiver->Receive(inactive_encoding).ok());
-  EXPECT_EQ(next_track, receiver->GetTrack());
-
-  // Removing all encodings *is* expected to clear the track.
-  RtpParameters no_encodings = MakeMinimalVp9ParametersWithSsrc(0xdeadbeef);
-  no_encodings.encodings.clear();
-  EXPECT_TRUE(receiver->Receive(no_encodings).ok());
-  EXPECT_EQ(nullptr, receiver->GetTrack());
-}
-
-// Currently SetTransport isn't supported. When it is, replace this test with a
-// test/tests for it.
-TEST_F(OrtcRtpReceiverTest, SetTransportFails) {
-  rtc::FakePacketTransport fake_packet_transport("another_transport");
-  RtpTransportParameters parameters;
-  parameters.rtcp.mux = true;
-  auto rtp_transport_result = ortc_factory_->CreateRtpTransport(
-      parameters, &fake_packet_transport, nullptr, nullptr);
-  auto rtp_transport = rtp_transport_result.MoveValue();
-
-  auto receiver_result = ortc_factory_->CreateRtpReceiver(
-      cricket::MEDIA_TYPE_AUDIO, rtp_transport_.get());
-  auto receiver = receiver_result.MoveValue();
-  EXPECT_EQ(RTCErrorType::UNSUPPORTED_OPERATION,
-            receiver->SetTransport(rtp_transport.get()).type());
-}
-
-TEST_F(OrtcRtpReceiverTest, GetTransport) {
-  auto result = ortc_factory_->CreateRtpReceiver(cricket::MEDIA_TYPE_AUDIO,
-                                                 rtp_transport_.get());
-  EXPECT_EQ(rtp_transport_.get(), result.value()->GetTransport());
-}
-
-// Test that "Receive" causes the expected parameters to be applied to the media
-// engine level, for an audio receiver.
-TEST_F(OrtcRtpReceiverTest, ReceiveAppliesAudioParametersToMediaEngine) {
-  auto audio_receiver_result = ortc_factory_->CreateRtpReceiver(
-      cricket::MEDIA_TYPE_AUDIO, rtp_transport_.get());
-  auto audio_receiver = audio_receiver_result.MoveValue();
-
-  // First, create parameters with all the bells and whistles.
-  RtpParameters parameters;
-
-  RtpCodecParameters opus_codec;
-  opus_codec.name = "opus";
-  opus_codec.kind = cricket::MEDIA_TYPE_AUDIO;
-  opus_codec.payload_type = 120;
-  opus_codec.clock_rate.emplace(48000);
-  opus_codec.num_channels.emplace(2);
-  opus_codec.parameters["minptime"] = "10";
-  opus_codec.rtcp_feedback.emplace_back(RtcpFeedbackType::TRANSPORT_CC);
-  parameters.codecs.push_back(std::move(opus_codec));
-
-  // Add two codecs, expecting the first to be used.
-  // TODO(deadbeef): Once "codec_payload_type" is supported, use it to select a
-  // codec that's not at the top of the list.
-  RtpCodecParameters isac_codec;
-  isac_codec.name = "ISAC";
-  isac_codec.kind = cricket::MEDIA_TYPE_AUDIO;
-  isac_codec.payload_type = 110;
-  isac_codec.clock_rate.emplace(16000);
-  parameters.codecs.push_back(std::move(isac_codec));
-
-  RtpEncodingParameters encoding;
-  encoding.ssrc.emplace(0xdeadbeef);
-  parameters.encodings.push_back(std::move(encoding));
-
-  parameters.header_extensions.emplace_back(
-      "urn:ietf:params:rtp-hdrext:ssrc-audio-level", 3);
-
-  EXPECT_TRUE(audio_receiver->Receive(parameters).ok());
-
-  // Now verify that the parameters were applied to the fake media engine layer
-  // that exists below BaseChannel.
-  cricket::FakeVoiceMediaChannel* fake_voice_channel =
-      fake_media_engine_->GetVoiceChannel(0);
-  ASSERT_NE(nullptr, fake_voice_channel);
-  EXPECT_TRUE(fake_voice_channel->playout());
-
-  // Verify codec parameters.
-  ASSERT_GT(fake_voice_channel->recv_codecs().size(), 0u);
-  const cricket::AudioCodec& top_codec = fake_voice_channel->recv_codecs()[0];
-  EXPECT_EQ("opus", top_codec.name);
-  EXPECT_EQ(120, top_codec.id);
-  EXPECT_EQ(48000, top_codec.clockrate);
-  EXPECT_EQ(2u, top_codec.channels);
-  ASSERT_NE(top_codec.params.end(), top_codec.params.find("minptime"));
-  EXPECT_EQ("10", top_codec.params.at("minptime"));
-
-  // Verify encoding parameters.
-  ASSERT_EQ(1u, fake_voice_channel->recv_streams().size());
-  const cricket::StreamParams& recv_stream =
-      fake_voice_channel->recv_streams()[0];
-  EXPECT_EQ(1u, recv_stream.ssrcs.size());
-  EXPECT_EQ(0xdeadbeef, recv_stream.first_ssrc());
-
-  // Verify header extensions.
-  ASSERT_EQ(1u, fake_voice_channel->recv_extensions().size());
-  const RtpExtension& extension = fake_voice_channel->recv_extensions()[0];
-  EXPECT_EQ("urn:ietf:params:rtp-hdrext:ssrc-audio-level", extension.uri);
-  EXPECT_EQ(3, extension.id);
-}
-
-// Test that "Receive" causes the expected parameters to be applied to the media
-// engine level, for a video receiver.
-TEST_F(OrtcRtpReceiverTest, ReceiveAppliesVideoParametersToMediaEngine) {
-  auto video_receiver_result = ortc_factory_->CreateRtpReceiver(
-      cricket::MEDIA_TYPE_VIDEO, rtp_transport_.get());
-  auto video_receiver = video_receiver_result.MoveValue();
-
-  // First, create parameters with all the bells and whistles.
-  RtpParameters parameters;
-
-  RtpCodecParameters vp8_codec;
-  vp8_codec.name = "VP8";
-  vp8_codec.kind = cricket::MEDIA_TYPE_VIDEO;
-  vp8_codec.payload_type = 99;
-  // Try a couple types of feedback params. "Generic NACK" is a bit of a
-  // special case, so test it here.
-  vp8_codec.rtcp_feedback.emplace_back(RtcpFeedbackType::CCM,
-                                       RtcpFeedbackMessageType::FIR);
-  vp8_codec.rtcp_feedback.emplace_back(RtcpFeedbackType::NACK,
-                                       RtcpFeedbackMessageType::GENERIC_NACK);
-  parameters.codecs.push_back(std::move(vp8_codec));
-
-  RtpCodecParameters vp8_rtx_codec;
-  vp8_rtx_codec.name = "rtx";
-  vp8_rtx_codec.kind = cricket::MEDIA_TYPE_VIDEO;
-  vp8_rtx_codec.payload_type = 100;
-  vp8_rtx_codec.parameters["apt"] = "99";
-  parameters.codecs.push_back(std::move(vp8_rtx_codec));
-
-  // Add two codecs, expecting the first to be used.
-  // TODO(deadbeef): Once "codec_payload_type" is supported, use it to select a
-  // codec that's not at the top of the list.
-  RtpCodecParameters vp9_codec;
-  vp9_codec.name = "VP9";
-  vp9_codec.kind = cricket::MEDIA_TYPE_VIDEO;
-  vp9_codec.payload_type = 102;
-  parameters.codecs.push_back(std::move(vp9_codec));
-
-  RtpCodecParameters vp9_rtx_codec;
-  vp9_rtx_codec.name = "rtx";
-  vp9_rtx_codec.kind = cricket::MEDIA_TYPE_VIDEO;
-  vp9_rtx_codec.payload_type = 103;
-  vp9_rtx_codec.parameters["apt"] = "102";
-  parameters.codecs.push_back(std::move(vp9_rtx_codec));
-
-  RtpEncodingParameters encoding;
-  encoding.ssrc.emplace(0xdeadbeef);
-  encoding.rtx.emplace(0xbaadfeed);
-  parameters.encodings.push_back(std::move(encoding));
-
-  parameters.header_extensions.emplace_back("urn:3gpp:video-orientation", 4);
-  parameters.header_extensions.emplace_back(
-      "http://www.webrtc.org/experiments/rtp-hdrext/playout-delay", 6);
-
-  EXPECT_TRUE(video_receiver->Receive(parameters).ok());
-
-  // Now verify that the parameters were applied to the fake media engine layer
-  // that exists below BaseChannel.
-  cricket::FakeVideoMediaChannel* fake_video_channel =
-      fake_media_engine_->GetVideoChannel(0);
-  ASSERT_NE(nullptr, fake_video_channel);
-
-  // Verify codec parameters.
-  ASSERT_GE(fake_video_channel->recv_codecs().size(), 2u);
-  const cricket::VideoCodec& top_codec = fake_video_channel->recv_codecs()[0];
-  EXPECT_EQ("VP8", top_codec.name);
-  EXPECT_EQ(99, top_codec.id);
-  EXPECT_TRUE(top_codec.feedback_params.Has({"ccm", "fir"}));
-  EXPECT_TRUE(top_codec.feedback_params.Has(cricket::FeedbackParam("nack")));
-
-  const cricket::VideoCodec& rtx_codec = fake_video_channel->recv_codecs()[1];
-  EXPECT_EQ("rtx", rtx_codec.name);
-  EXPECT_EQ(100, rtx_codec.id);
-  ASSERT_NE(rtx_codec.params.end(), rtx_codec.params.find("apt"));
-  EXPECT_EQ("99", rtx_codec.params.at("apt"));
-
-  // Verify encoding parameters.
-  ASSERT_EQ(1u, fake_video_channel->recv_streams().size());
-  const cricket::StreamParams& recv_stream =
-      fake_video_channel->recv_streams()[0];
-  EXPECT_EQ(2u, recv_stream.ssrcs.size());
-  EXPECT_EQ(0xdeadbeef, recv_stream.first_ssrc());
-  uint32_t rtx_ssrc = 0u;
-  EXPECT_TRUE(recv_stream.GetFidSsrc(recv_stream.first_ssrc(), &rtx_ssrc));
-  EXPECT_EQ(0xbaadfeed, rtx_ssrc);
-
-  // Verify header extensions.
-  ASSERT_EQ(2u, fake_video_channel->recv_extensions().size());
-  const RtpExtension& extension1 = fake_video_channel->recv_extensions()[0];
-  EXPECT_EQ("urn:3gpp:video-orientation", extension1.uri);
-  EXPECT_EQ(4, extension1.id);
-  const RtpExtension& extension2 = fake_video_channel->recv_extensions()[1];
-  EXPECT_EQ("http://www.webrtc.org/experiments/rtp-hdrext/playout-delay",
-            extension2.uri);
-  EXPECT_EQ(6, extension2.id);
-}
-
-// Test changing both the receive codec and SSRC at the same time, and verify
-// that the new parameters are applied to the media engine level.
-TEST_F(OrtcRtpReceiverTest, CallingReceiveTwiceChangesParameters) {
-  auto audio_receiver_result = ortc_factory_->CreateRtpReceiver(
-      cricket::MEDIA_TYPE_AUDIO, rtp_transport_.get());
-  auto audio_receiver = audio_receiver_result.MoveValue();
-  RTCError error =
-      audio_receiver->Receive(MakeMinimalOpusParametersWithSsrc(0x11111111));
-  EXPECT_TRUE(error.ok());
-  error =
-      audio_receiver->Receive(MakeMinimalIsacParametersWithSsrc(0x22222222));
-  EXPECT_TRUE(error.ok());
-
-  cricket::FakeVoiceMediaChannel* fake_voice_channel =
-      fake_media_engine_->GetVoiceChannel(0);
-  ASSERT_NE(nullptr, fake_voice_channel);
-  ASSERT_GT(fake_voice_channel->recv_codecs().size(), 0u);
-  EXPECT_EQ("ISAC", fake_voice_channel->recv_codecs()[0].name);
-  ASSERT_EQ(1u, fake_voice_channel->recv_streams().size());
-  EXPECT_EQ(0x22222222u, fake_voice_channel->recv_streams()[0].first_ssrc());
-
-  auto video_receiver_result = ortc_factory_->CreateRtpReceiver(
-      cricket::MEDIA_TYPE_VIDEO, rtp_transport_.get());
-  auto video_receiver = video_receiver_result.MoveValue();
-  error = video_receiver->Receive(MakeMinimalVp8ParametersWithSsrc(0x33333333));
-  EXPECT_TRUE(error.ok());
-  error = video_receiver->Receive(MakeMinimalVp9ParametersWithSsrc(0x44444444));
-  EXPECT_TRUE(error.ok());
-
-  cricket::FakeVideoMediaChannel* fake_video_channel =
-      fake_media_engine_->GetVideoChannel(0);
-  ASSERT_NE(nullptr, fake_video_channel);
-  ASSERT_GT(fake_video_channel->recv_codecs().size(), 0u);
-  EXPECT_EQ("VP9", fake_video_channel->recv_codecs()[0].name);
-  ASSERT_EQ(1u, fake_video_channel->recv_streams().size());
-  EXPECT_EQ(0x44444444u, fake_video_channel->recv_streams()[0].first_ssrc());
-}
-
-// Ensure that if the |active| flag of RtpEncodingParameters is set to false,
-// playout stops at the media engine level. Note that this is only applicable
-// to audio (at least currently).
-TEST_F(OrtcRtpReceiverTest, DeactivatingEncodingStopsPlayout) {
-  auto audio_receiver_result = ortc_factory_->CreateRtpReceiver(
-      cricket::MEDIA_TYPE_AUDIO, rtp_transport_.get());
-  auto audio_receiver = audio_receiver_result.MoveValue();
-  RtpParameters parameters = MakeMinimalOpusParameters();
-  EXPECT_TRUE(audio_receiver->Receive(parameters).ok());
-
-  // Expect "playout" flag to initially be true.
-  cricket::FakeVoiceMediaChannel* fake_voice_channel =
-      fake_media_engine_->GetVoiceChannel(0);
-  ASSERT_NE(nullptr, fake_voice_channel);
-  EXPECT_TRUE(fake_voice_channel->playout());
-
-  // Deactivate encoding and expect it to change to false.
-  parameters.encodings[0].active = false;
-  EXPECT_TRUE(audio_receiver->Receive(parameters).ok());
-  EXPECT_FALSE(fake_voice_channel->playout());
-}
-
-// Ensure that calling Receive with an empty list of encodings causes receive
-// streams at the media engine level to be cleared.
-TEST_F(OrtcRtpReceiverTest,
-       CallingReceiveWithEmptyEncodingsClearsReceiveStreams) {
-  auto audio_receiver_result = ortc_factory_->CreateRtpReceiver(
-      cricket::MEDIA_TYPE_AUDIO, rtp_transport_.get());
-  auto audio_receiver = audio_receiver_result.MoveValue();
-  RtpParameters parameters = MakeMinimalOpusParameters();
-  EXPECT_TRUE(audio_receiver->Receive(parameters).ok());
-  parameters.encodings.clear();
-  EXPECT_TRUE(audio_receiver->Receive(parameters).ok());
-
-  cricket::FakeVoiceMediaChannel* fake_voice_channel =
-      fake_media_engine_->GetVoiceChannel(0);
-  ASSERT_NE(nullptr, fake_voice_channel);
-  EXPECT_TRUE(fake_voice_channel->recv_streams().empty());
-
-  auto video_receiver_result = ortc_factory_->CreateRtpReceiver(
-      cricket::MEDIA_TYPE_VIDEO, rtp_transport_.get());
-  auto video_receiver = video_receiver_result.MoveValue();
-  parameters = MakeMinimalVp8Parameters();
-  EXPECT_TRUE(video_receiver->Receive(parameters).ok());
-  parameters.encodings.clear();
-  EXPECT_TRUE(video_receiver->Receive(parameters).ok());
-
-  cricket::FakeVideoMediaChannel* fake_video_channel =
-      fake_media_engine_->GetVideoChannel(0);
-  ASSERT_NE(nullptr, fake_video_channel);
-  EXPECT_TRUE(fake_video_channel->recv_streams().empty());
-}
-
-// These errors should be covered by rtpparametersconversion_unittest.cc, but
-// we should at least test that those errors are propogated from calls to
-// Receive, with a few examples.
-TEST_F(OrtcRtpReceiverTest, ReceiveReturnsErrorOnInvalidParameters) {
-  auto result = ortc_factory_->CreateRtpReceiver(cricket::MEDIA_TYPE_AUDIO,
-                                                 rtp_transport_.get());
-  auto receiver = result.MoveValue();
-  // CCM feedback missing message type.
-  RtpParameters invalid_feedback = MakeMinimalOpusParameters();
-  invalid_feedback.codecs[0].rtcp_feedback.emplace_back(RtcpFeedbackType::CCM);
-  EXPECT_EQ(RTCErrorType::INVALID_PARAMETER,
-            receiver->Receive(invalid_feedback).type());
-  // Payload type greater than 127.
-  RtpParameters invalid_pt = MakeMinimalOpusParameters();
-  invalid_pt.codecs[0].payload_type = 128;
-  EXPECT_EQ(RTCErrorType::INVALID_RANGE, receiver->Receive(invalid_pt).type());
-  // Duplicate header extension IDs.
-  RtpParameters duplicate_ids = MakeMinimalOpusParameters();
-  duplicate_ids.header_extensions.emplace_back("foo", 5);
-  duplicate_ids.header_extensions.emplace_back("bar", 5);
-  EXPECT_EQ(RTCErrorType::INVALID_PARAMETER,
-            receiver->Receive(duplicate_ids).type());
-}
-
-// Two receivers using the same transport shouldn't be able to use the same
-// payload type to refer to different codecs, same header extension IDs to
-// refer to different extensions, or same SSRC.
-TEST_F(OrtcRtpReceiverTest, ReceiveReturnsErrorOnIdConflicts) {
-  auto audio_receiver_result = ortc_factory_->CreateRtpReceiver(
-      cricket::MEDIA_TYPE_AUDIO, rtp_transport_.get());
-  auto video_receiver_result = ortc_factory_->CreateRtpReceiver(
-      cricket::MEDIA_TYPE_VIDEO, rtp_transport_.get());
-  auto audio_receiver = audio_receiver_result.MoveValue();
-  auto video_receiver = video_receiver_result.MoveValue();
-
-  // First test payload type conflict.
-  RtpParameters audio_parameters = MakeMinimalOpusParameters();
-  RtpParameters video_parameters = MakeMinimalVp8Parameters();
-  audio_parameters.codecs[0].payload_type = 100;
-  video_parameters.codecs[0].payload_type = 100;
-  EXPECT_TRUE(audio_receiver->Receive(audio_parameters).ok());
-  EXPECT_EQ(RTCErrorType::INVALID_PARAMETER,
-            video_receiver->Receive(video_parameters).type());
-
-  // Test header extension ID conflict.
-  video_parameters.codecs[0].payload_type = 110;
-  audio_parameters.header_extensions.emplace_back("foo", 4);
-  video_parameters.header_extensions.emplace_back("bar", 4);
-  EXPECT_TRUE(audio_receiver->Receive(audio_parameters).ok());
-  EXPECT_EQ(RTCErrorType::INVALID_PARAMETER,
-            video_receiver->Receive(video_parameters).type());
-
-  // Test SSRC conflict. Have an RTX SSRC that conflicts with a primary SSRC
-  // for extra challenge.
-  video_parameters.header_extensions[0].uri = "foo";
-  audio_parameters.encodings[0].ssrc.emplace(0xabbaabba);
-  audio_parameters.encodings[0].rtx.emplace(0xdeadbeef);
-  video_parameters.encodings[0].ssrc.emplace(0xdeadbeef);
-  EXPECT_TRUE(audio_receiver->Receive(audio_parameters).ok());
-  EXPECT_EQ(RTCErrorType::INVALID_PARAMETER,
-            video_receiver->Receive(video_parameters).type());
-
-  // Sanity check that parameters can be set if the conflicts are all resolved.
-  video_parameters.encodings[0].ssrc.emplace(0xbaadf00d);
-  EXPECT_TRUE(video_receiver->Receive(video_parameters).ok());
-}
-
-// Ensure that deleting a receiver causes receive streams at the media engine
-// level to be cleared.
-TEST_F(OrtcRtpReceiverTest, DeletingReceiverClearsReceiveStreams) {
-  auto audio_receiver_result = ortc_factory_->CreateRtpReceiver(
-      cricket::MEDIA_TYPE_AUDIO, rtp_transport_.get());
-  auto audio_receiver = audio_receiver_result.MoveValue();
-  EXPECT_TRUE(audio_receiver->Receive(MakeMinimalOpusParameters()).ok());
-
-  // Also create an audio sender, to prevent the voice channel from being
-  // completely deleted.
-  auto audio_sender_result = ortc_factory_->CreateRtpSender(
-      cricket::MEDIA_TYPE_AUDIO, rtp_transport_.get());
-  auto audio_sender = audio_sender_result.MoveValue();
-  EXPECT_TRUE(audio_sender->Send(MakeMinimalOpusParameters()).ok());
-
-  audio_receiver.reset(nullptr);
-  cricket::FakeVoiceMediaChannel* fake_voice_channel =
-      fake_media_engine_->GetVoiceChannel(0);
-  ASSERT_NE(nullptr, fake_voice_channel);
-  EXPECT_TRUE(fake_voice_channel->recv_streams().empty());
-
-  auto video_receiver_result = ortc_factory_->CreateRtpReceiver(
-      cricket::MEDIA_TYPE_VIDEO, rtp_transport_.get());
-  auto video_receiver = video_receiver_result.MoveValue();
-  EXPECT_TRUE(video_receiver->Receive(MakeMinimalVp8Parameters()).ok());
-
-  // Also create an video sender, to prevent the video channel from being
-  // completely deleted.
-  auto video_sender_result = ortc_factory_->CreateRtpSender(
-      cricket::MEDIA_TYPE_VIDEO, rtp_transport_.get());
-  auto video_sender = video_sender_result.MoveValue();
-  EXPECT_TRUE(video_sender->Send(MakeMinimalVp8Parameters()).ok());
-
-  video_receiver.reset(nullptr);
-  cricket::FakeVideoMediaChannel* fake_video_channel =
-      fake_media_engine_->GetVideoChannel(0);
-  ASSERT_NE(nullptr, fake_video_channel);
-  EXPECT_TRUE(fake_video_channel->recv_streams().empty());
-}
-
-// If Receive hasn't been called, GetParameters should return empty parameters.
-TEST_F(OrtcRtpReceiverTest, GetDefaultParameters) {
-  auto result = ortc_factory_->CreateRtpReceiver(cricket::MEDIA_TYPE_AUDIO,
-                                                 rtp_transport_.get());
-  EXPECT_EQ(RtpParameters(), result.value()->GetParameters());
-  result = ortc_factory_->CreateRtpReceiver(cricket::MEDIA_TYPE_VIDEO,
-                                            rtp_transport_.get());
-  EXPECT_EQ(RtpParameters(), result.value()->GetParameters());
-}
-
-// Test that GetParameters returns the last parameters passed into Receive,
-// along with the implementation-default values filled in where they were left
-// unset.
-TEST_F(OrtcRtpReceiverTest,
-       GetParametersReturnsLastSetParametersWithDefaultsFilled) {
-  auto audio_receiver_result = ortc_factory_->CreateRtpReceiver(
-      cricket::MEDIA_TYPE_AUDIO, rtp_transport_.get());
-  auto audio_receiver = audio_receiver_result.MoveValue();
-
-  RtpParameters opus_parameters = MakeMinimalOpusParameters();
-  EXPECT_TRUE(audio_receiver->Receive(opus_parameters).ok());
-  EXPECT_EQ(opus_parameters, audio_receiver->GetParameters());
-
-  RtpParameters isac_parameters = MakeMinimalIsacParameters();
-  // Sanity check that num_channels actually is left unset.
-  ASSERT_FALSE(isac_parameters.codecs[0].num_channels);
-  EXPECT_TRUE(audio_receiver->Receive(isac_parameters).ok());
-  // Should be filled with a default "num channels" of 1.
-  // TODO(deadbeef): This should actually default to 2 for some codecs. Update
-  // this test once that's implemented.
-  isac_parameters.codecs[0].num_channels.emplace(1);
-  EXPECT_EQ(isac_parameters, audio_receiver->GetParameters());
-
-  auto video_receiver_result = ortc_factory_->CreateRtpReceiver(
-      cricket::MEDIA_TYPE_VIDEO, rtp_transport_.get());
-  auto video_receiver = video_receiver_result.MoveValue();
-
-  RtpParameters vp8_parameters = MakeMinimalVp8Parameters();
-  // Sanity check that clock_rate actually is left unset.
-  EXPECT_TRUE(video_receiver->Receive(vp8_parameters).ok());
-  // Should be filled with a default clock rate of 90000.
-  vp8_parameters.codecs[0].clock_rate.emplace(90000);
-  EXPECT_EQ(vp8_parameters, video_receiver->GetParameters());
-
-  RtpParameters vp9_parameters = MakeMinimalVp9Parameters();
-  // Sanity check that clock_rate actually is left unset.
-  EXPECT_TRUE(video_receiver->Receive(vp9_parameters).ok());
-  // Should be filled with a default clock rate of 90000.
-  vp9_parameters.codecs[0].clock_rate.emplace(90000);
-  EXPECT_EQ(vp9_parameters, video_receiver->GetParameters());
-}
-
-TEST_F(OrtcRtpReceiverTest, GetKind) {
-  auto audio_receiver_result = ortc_factory_->CreateRtpReceiver(
-      cricket::MEDIA_TYPE_AUDIO, rtp_transport_.get());
-  auto video_receiver_result = ortc_factory_->CreateRtpReceiver(
-      cricket::MEDIA_TYPE_VIDEO, rtp_transport_.get());
-  auto audio_receiver = audio_receiver_result.MoveValue();
-  auto video_receiver = video_receiver_result.MoveValue();
-  EXPECT_EQ(cricket::MEDIA_TYPE_AUDIO, audio_receiver->GetKind());
-  EXPECT_EQ(cricket::MEDIA_TYPE_VIDEO, video_receiver->GetKind());
-}
-
-}  // namespace webrtc
diff --git a/ortc/ortcrtpreceiveradapter.cc b/ortc/ortcrtpreceiveradapter.cc
deleted file mode 100644
index 4e8c89b..0000000
--- a/ortc/ortcrtpreceiveradapter.cc
+++ /dev/null
@@ -1,168 +0,0 @@
-/*
- *  Copyright 2017 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/ortc/ortcrtpreceiveradapter.h"
-
-#include <utility>
-
-#include "webrtc/media/base/mediaconstants.h"
-#include "webrtc/ortc/rtptransportadapter.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/helpers.h"  // For "CreateRandomX".
-
-namespace {
-
-void FillAudioReceiverParameters(webrtc::RtpParameters* parameters) {
-  for (webrtc::RtpCodecParameters& codec : parameters->codecs) {
-    if (!codec.num_channels) {
-      codec.num_channels = rtc::Optional<int>(1);
-    }
-  }
-}
-
-void FillVideoReceiverParameters(webrtc::RtpParameters* parameters) {
-  for (webrtc::RtpCodecParameters& codec : parameters->codecs) {
-    if (!codec.clock_rate) {
-      codec.clock_rate = rtc::Optional<int>(cricket::kVideoCodecClockrate);
-    }
-  }
-}
-
-}  // namespace
-
-namespace webrtc {
-
-BEGIN_OWNED_PROXY_MAP(OrtcRtpReceiver)
-PROXY_SIGNALING_THREAD_DESTRUCTOR()
-PROXY_CONSTMETHOD0(rtc::scoped_refptr<MediaStreamTrackInterface>, GetTrack)
-PROXY_METHOD1(RTCError, SetTransport, RtpTransportInterface*)
-PROXY_CONSTMETHOD0(RtpTransportInterface*, GetTransport)
-PROXY_METHOD1(RTCError, Receive, const RtpParameters&)
-PROXY_CONSTMETHOD0(RtpParameters, GetParameters)
-PROXY_CONSTMETHOD0(cricket::MediaType, GetKind)
-END_PROXY_MAP()
-
-// static
-std::unique_ptr<OrtcRtpReceiverInterface> OrtcRtpReceiverAdapter::CreateProxy(
-    std::unique_ptr<OrtcRtpReceiverAdapter> wrapped_receiver) {
-  RTC_DCHECK(wrapped_receiver);
-  rtc::Thread* signaling =
-      wrapped_receiver->rtp_transport_controller_->signaling_thread();
-  rtc::Thread* worker =
-      wrapped_receiver->rtp_transport_controller_->worker_thread();
-  return OrtcRtpReceiverProxy::Create(signaling, worker,
-                                      std::move(wrapped_receiver));
-}
-
-OrtcRtpReceiverAdapter::~OrtcRtpReceiverAdapter() {
-  internal_receiver_ = nullptr;
-  SignalDestroyed();
-}
-
-rtc::scoped_refptr<MediaStreamTrackInterface> OrtcRtpReceiverAdapter::GetTrack()
-    const {
-  return internal_receiver_ ? internal_receiver_->track() : nullptr;
-}
-
-RTCError OrtcRtpReceiverAdapter::SetTransport(
-    RtpTransportInterface* transport) {
-  LOG_AND_RETURN_ERROR(
-      RTCErrorType::UNSUPPORTED_OPERATION,
-      "Changing the transport of an RtpReceiver is not yet supported.");
-}
-
-RtpTransportInterface* OrtcRtpReceiverAdapter::GetTransport() const {
-  return transport_;
-}
-
-RTCError OrtcRtpReceiverAdapter::Receive(const RtpParameters& parameters) {
-  RtpParameters filled_parameters = parameters;
-  RTCError err;
-  switch (kind_) {
-    case cricket::MEDIA_TYPE_AUDIO:
-      FillAudioReceiverParameters(&filled_parameters);
-      err = rtp_transport_controller_->ValidateAndApplyAudioReceiverParameters(
-          filled_parameters);
-      if (!err.ok()) {
-        return err;
-      }
-      break;
-    case cricket::MEDIA_TYPE_VIDEO:
-      FillVideoReceiverParameters(&filled_parameters);
-      err = rtp_transport_controller_->ValidateAndApplyVideoReceiverParameters(
-          filled_parameters);
-      if (!err.ok()) {
-        return err;
-      }
-      break;
-    case cricket::MEDIA_TYPE_DATA:
-      RTC_NOTREACHED();
-      return webrtc::RTCError(webrtc::RTCErrorType::INTERNAL_ERROR);
-  }
-  last_applied_parameters_ = filled_parameters;
-
-  // Now that parameters were applied, can create (or recreate) the internal
-  // receiver.
-  //
-  // This is analogous to a PeerConnection creating a receiver after
-  // SetRemoteDescription is successful.
-  MaybeRecreateInternalReceiver();
-  return RTCError::OK();
-}
-
-RtpParameters OrtcRtpReceiverAdapter::GetParameters() const {
-  return last_applied_parameters_;
-}
-
-cricket::MediaType OrtcRtpReceiverAdapter::GetKind() const {
-  return kind_;
-}
-
-OrtcRtpReceiverAdapter::OrtcRtpReceiverAdapter(
-    cricket::MediaType kind,
-    RtpTransportInterface* transport,
-    RtpTransportControllerAdapter* rtp_transport_controller)
-    : kind_(kind),
-      transport_(transport),
-      rtp_transport_controller_(rtp_transport_controller) {}
-
-void OrtcRtpReceiverAdapter::MaybeRecreateInternalReceiver() {
-  if (last_applied_parameters_.encodings.empty()) {
-    internal_receiver_ = nullptr;
-    return;
-  }
-  // An SSRC of 0 is valid; this is used to identify "the default SSRC" (which
-  // is the first one seen by the underlying media engine).
-  uint32_t ssrc = 0;
-  if (last_applied_parameters_.encodings[0].ssrc) {
-    ssrc = *last_applied_parameters_.encodings[0].ssrc;
-  }
-  if (internal_receiver_ && ssrc == internal_receiver_->ssrc()) {
-    // SSRC not changing; nothing to do.
-    return;
-  }
-  internal_receiver_ = nullptr;
-  switch (kind_) {
-    case cricket::MEDIA_TYPE_AUDIO:
-      internal_receiver_ =
-          new AudioRtpReceiver(rtc::CreateRandomUuid(), ssrc,
-                               rtp_transport_controller_->voice_channel());
-      break;
-    case cricket::MEDIA_TYPE_VIDEO:
-      internal_receiver_ = new VideoRtpReceiver(
-          rtc::CreateRandomUuid(), rtp_transport_controller_->worker_thread(),
-          ssrc, rtp_transport_controller_->video_channel());
-      break;
-    case cricket::MEDIA_TYPE_DATA:
-      RTC_NOTREACHED();
-  }
-}
-
-}  // namespace webrtc
diff --git a/ortc/ortcrtpreceiveradapter.h b/ortc/ortcrtpreceiveradapter.h
deleted file mode 100644
index 2fb793f..0000000
--- a/ortc/ortcrtpreceiveradapter.h
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- *  Copyright 2017 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_ORTC_ORTCRTPRECEIVERADAPTER_H_
-#define WEBRTC_ORTC_ORTCRTPRECEIVERADAPTER_H_
-
-#include <memory>
-
-#include "webrtc/api/ortc/ortcrtpreceiverinterface.h"
-#include "webrtc/api/rtcerror.h"
-#include "webrtc/api/rtpparameters.h"
-#include "webrtc/ortc/rtptransportcontrolleradapter.h"
-#include "webrtc/pc/rtpreceiver.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/sigslot.h"
-#include "webrtc/rtc_base/thread.h"
-
-namespace webrtc {
-
-// Implementation of OrtcRtpReceiverInterface that works with
-// RtpTransportAdapter, and wraps a VideoRtpReceiver/AudioRtpReceiver that's
-// normally used with the PeerConnection.
-//
-// TODO(deadbeef): When BaseChannel is split apart into separate
-// "RtpReceiver"/"RtpTransceiver"/"RtpReceiver"/"RtpReceiver" objects, this
-// adapter object can be removed.
-class OrtcRtpReceiverAdapter : public OrtcRtpReceiverInterface {
- public:
-  // Wraps |wrapped_receiver| in a proxy that will safely call methods on the
-  // correct thread.
-  static std::unique_ptr<OrtcRtpReceiverInterface> CreateProxy(
-      std::unique_ptr<OrtcRtpReceiverAdapter> wrapped_receiver);
-
-  // Should only be called by RtpTransportControllerAdapter.
-  OrtcRtpReceiverAdapter(
-      cricket::MediaType kind,
-      RtpTransportInterface* transport,
-      RtpTransportControllerAdapter* rtp_transport_controller);
-  ~OrtcRtpReceiverAdapter() override;
-
-  // OrtcRtpReceiverInterface implementation.
-  rtc::scoped_refptr<MediaStreamTrackInterface> GetTrack() const override;
-
-  RTCError SetTransport(RtpTransportInterface* transport) override;
-  RtpTransportInterface* GetTransport() const override;
-
-  RTCError Receive(const RtpParameters& parameters) override;
-  RtpParameters GetParameters() const override;
-
-  cricket::MediaType GetKind() const override;
-
-  // Used so that the RtpTransportControllerAdapter knows when it can
-  // deallocate resources allocated for this object.
-  sigslot::signal0<> SignalDestroyed;
-
- private:
-  void MaybeRecreateInternalReceiver();
-
-  cricket::MediaType kind_;
-  RtpTransportInterface* transport_;
-  RtpTransportControllerAdapter* rtp_transport_controller_;
-  // Scoped refptr due to ref-counted interface, but we should be the only
-  // reference holder.
-  rtc::scoped_refptr<RtpReceiverInternal> internal_receiver_;
-  RtpParameters last_applied_parameters_;
-
-  RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(OrtcRtpReceiverAdapter);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_ORTC_ORTCRTPRECEIVERADAPTER_H_
diff --git a/ortc/ortcrtpsender_unittest.cc b/ortc/ortcrtpsender_unittest.cc
deleted file mode 100644
index a94ed76..0000000
--- a/ortc/ortcrtpsender_unittest.cc
+++ /dev/null
@@ -1,667 +0,0 @@
-/*
- *  Copyright 2017 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 <memory>
-
-#include "webrtc/media/base/fakemediaengine.h"
-#include "webrtc/ortc/ortcfactory.h"
-#include "webrtc/ortc/testrtpparameters.h"
-#include "webrtc/p2p/base/fakepackettransport.h"
-#include "webrtc/pc/test/fakevideotracksource.h"
-#include "webrtc/rtc_base/gunit.h"
-
-namespace webrtc {
-
-// This test uses an individual RtpSender using only the public interface, and
-// verifies that its behaves as designed at an API level. Also tests that
-// parameters are applied to the audio/video engines as expected. Network and
-// media interfaces are faked to isolate what's being tested.
-//
-// This test shouldn't result any any actual media being sent. That sort of
-// test should go in ortcfactory_integrationtest.cc.
-class OrtcRtpSenderTest : public testing::Test {
- public:
-  OrtcRtpSenderTest() : fake_packet_transport_("fake") {
-    // Need to set the fake packet transport to writable, in order to test that
-    // the "send" flag is applied to the media engine based on the encoding
-    // |active| flag.
-    fake_packet_transport_.SetWritable(true);
-    fake_media_engine_ = new cricket::FakeMediaEngine();
-    // Note: This doesn't need to use fake network classes, since we already
-    // use FakePacketTransport.
-    auto ortc_factory_result = OrtcFactory::Create(
-        nullptr, nullptr, nullptr, nullptr, nullptr,
-        std::unique_ptr<cricket::MediaEngineInterface>(fake_media_engine_));
-    ortc_factory_ = ortc_factory_result.MoveValue();
-    RtpTransportParameters parameters;
-    parameters.rtcp.mux = true;
-    auto rtp_transport_result = ortc_factory_->CreateRtpTransport(
-        parameters, &fake_packet_transport_, nullptr, nullptr);
-    rtp_transport_ = rtp_transport_result.MoveValue();
-  }
-
- protected:
-  rtc::scoped_refptr<AudioTrackInterface> CreateAudioTrack(
-      const std::string& id) {
-    return ortc_factory_->CreateAudioTrack(id, nullptr);
-  }
-
-  rtc::scoped_refptr<VideoTrackInterface> CreateVideoTrack(
-      const std::string& id) {
-    return rtc::scoped_refptr<webrtc::VideoTrackInterface>(
-        ortc_factory_->CreateVideoTrack(id, FakeVideoTrackSource::Create()));
-  }
-
-  // Owned by |ortc_factory_|.
-  cricket::FakeMediaEngine* fake_media_engine_;
-  rtc::FakePacketTransport fake_packet_transport_;
-  std::unique_ptr<OrtcFactoryInterface> ortc_factory_;
-  std::unique_ptr<RtpTransportInterface> rtp_transport_;
-};
-
-TEST_F(OrtcRtpSenderTest, GetAndSetTrack) {
-  // Test GetTrack with a sender constructed with a track.
-  auto audio_track = CreateAudioTrack("audio");
-  auto audio_sender_result =
-      ortc_factory_->CreateRtpSender(audio_track, rtp_transport_.get());
-  auto audio_sender = audio_sender_result.MoveValue();
-  EXPECT_EQ(audio_track, audio_sender->GetTrack());
-
-  // Test GetTrack after SetTrack.
-  auto video_sender_result = ortc_factory_->CreateRtpSender(
-      cricket::MEDIA_TYPE_VIDEO, rtp_transport_.get());
-  auto video_sender = video_sender_result.MoveValue();
-  auto video_track = CreateVideoTrack("video1");
-  EXPECT_TRUE(video_sender->SetTrack(video_track).ok());
-  EXPECT_EQ(video_track, video_sender->GetTrack());
-  video_track = CreateVideoTrack("video2");
-  EXPECT_TRUE(video_sender->SetTrack(video_track).ok());
-  EXPECT_EQ(video_track, video_sender->GetTrack());
-}
-
-// Test that track can be set when previously unset, even after Send has been
-// called.
-TEST_F(OrtcRtpSenderTest, SetTrackWhileSending) {
-  auto audio_sender_result = ortc_factory_->CreateRtpSender(
-      cricket::MEDIA_TYPE_AUDIO, rtp_transport_.get());
-  auto audio_sender = audio_sender_result.MoveValue();
-  EXPECT_TRUE(audio_sender->Send(MakeMinimalOpusParameters()).ok());
-  EXPECT_TRUE(audio_sender->SetTrack(CreateAudioTrack("audio")).ok());
-
-  auto video_sender_result = ortc_factory_->CreateRtpSender(
-      cricket::MEDIA_TYPE_VIDEO, rtp_transport_.get());
-  auto video_sender = video_sender_result.MoveValue();
-  EXPECT_TRUE(video_sender->Send(MakeMinimalVp8Parameters()).ok());
-  EXPECT_TRUE(video_sender->SetTrack(CreateVideoTrack("video")).ok());
-}
-
-// Test that track can be changed mid-sending. Differs from the above test in
-// that the track is set and being changed, rather than unset and being set for
-// the first time.
-TEST_F(OrtcRtpSenderTest, ChangeTrackWhileSending) {
-  auto audio_sender_result = ortc_factory_->CreateRtpSender(
-      CreateAudioTrack("audio1"), rtp_transport_.get());
-  auto audio_sender = audio_sender_result.MoveValue();
-  EXPECT_TRUE(audio_sender->Send(MakeMinimalOpusParameters()).ok());
-  EXPECT_TRUE(audio_sender->SetTrack(CreateAudioTrack("audio2")).ok());
-
-  auto video_sender_result = ortc_factory_->CreateRtpSender(
-      CreateVideoTrack("video1"), rtp_transport_.get());
-  auto video_sender = video_sender_result.MoveValue();
-  EXPECT_TRUE(video_sender->Send(MakeMinimalVp8Parameters()).ok());
-  EXPECT_TRUE(video_sender->SetTrack(CreateVideoTrack("video2")).ok());
-}
-
-// Test that track can be set to null while sending.
-TEST_F(OrtcRtpSenderTest, UnsetTrackWhileSending) {
-  auto audio_sender_result = ortc_factory_->CreateRtpSender(
-      CreateAudioTrack("audio"), rtp_transport_.get());
-  auto audio_sender = audio_sender_result.MoveValue();
-  EXPECT_TRUE(audio_sender->Send(MakeMinimalOpusParameters()).ok());
-  EXPECT_TRUE(audio_sender->SetTrack(nullptr).ok());
-
-  auto video_sender_result = ortc_factory_->CreateRtpSender(
-      CreateVideoTrack("video"), rtp_transport_.get());
-  auto video_sender = video_sender_result.MoveValue();
-  EXPECT_TRUE(video_sender->Send(MakeMinimalVp8Parameters()).ok());
-  EXPECT_TRUE(video_sender->SetTrack(nullptr).ok());
-}
-
-// Shouldn't be able to set an audio track on a video sender or vice versa.
-TEST_F(OrtcRtpSenderTest, SetTrackOfWrongKindFails) {
-  auto audio_sender_result = ortc_factory_->CreateRtpSender(
-      cricket::MEDIA_TYPE_AUDIO, rtp_transport_.get());
-  auto audio_sender = audio_sender_result.MoveValue();
-  EXPECT_EQ(RTCErrorType::INVALID_PARAMETER,
-            audio_sender->SetTrack(CreateVideoTrack("video")).type());
-
-  auto video_sender_result = ortc_factory_->CreateRtpSender(
-      cricket::MEDIA_TYPE_VIDEO, rtp_transport_.get());
-  auto video_sender = video_sender_result.MoveValue();
-  EXPECT_EQ(RTCErrorType::INVALID_PARAMETER,
-            video_sender->SetTrack(CreateAudioTrack("audio")).type());
-}
-
-// Currently SetTransport isn't supported. When it is, replace this test with a
-// test/tests for it.
-TEST_F(OrtcRtpSenderTest, SetTransportFails) {
-  rtc::FakePacketTransport fake_packet_transport("another_transport");
-  RtpTransportParameters parameters;
-  parameters.rtcp.mux = true;
-  auto rtp_transport_result = ortc_factory_->CreateRtpTransport(
-      parameters, &fake_packet_transport, nullptr, nullptr);
-  auto rtp_transport = rtp_transport_result.MoveValue();
-
-  auto sender_result = ortc_factory_->CreateRtpSender(cricket::MEDIA_TYPE_AUDIO,
-                                                      rtp_transport_.get());
-  auto sender = sender_result.MoveValue();
-  EXPECT_EQ(RTCErrorType::UNSUPPORTED_OPERATION,
-            sender->SetTransport(rtp_transport.get()).type());
-}
-
-TEST_F(OrtcRtpSenderTest, GetTransport) {
-  auto result = ortc_factory_->CreateRtpSender(cricket::MEDIA_TYPE_AUDIO,
-                                               rtp_transport_.get());
-  EXPECT_EQ(rtp_transport_.get(), result.value()->GetTransport());
-}
-
-// Test that "Send" causes the expected parameters to be applied to the media
-// engine level, for an audio sender.
-TEST_F(OrtcRtpSenderTest, SendAppliesAudioParametersToMediaEngine) {
-  auto audio_sender_result = ortc_factory_->CreateRtpSender(
-      cricket::MEDIA_TYPE_AUDIO, rtp_transport_.get());
-  auto audio_sender = audio_sender_result.MoveValue();
-
-  // First, create parameters with all the bells and whistles.
-  RtpParameters parameters;
-
-  RtpCodecParameters opus_codec;
-  opus_codec.name = "opus";
-  opus_codec.kind = cricket::MEDIA_TYPE_AUDIO;
-  opus_codec.payload_type = 120;
-  opus_codec.clock_rate.emplace(48000);
-  opus_codec.num_channels.emplace(2);
-  opus_codec.parameters["minptime"] = "10";
-  opus_codec.rtcp_feedback.emplace_back(RtcpFeedbackType::TRANSPORT_CC);
-  parameters.codecs.push_back(std::move(opus_codec));
-
-  // Add two codecs, expecting the first to be used.
-  // TODO(deadbeef): Once "codec_payload_type" is supported, use it to select a
-  // codec that's not at the top of the list.
-  RtpCodecParameters isac_codec;
-  isac_codec.name = "ISAC";
-  isac_codec.kind = cricket::MEDIA_TYPE_AUDIO;
-  isac_codec.payload_type = 110;
-  isac_codec.clock_rate.emplace(16000);
-  parameters.codecs.push_back(std::move(isac_codec));
-
-  RtpEncodingParameters encoding;
-  encoding.ssrc.emplace(0xdeadbeef);
-  encoding.max_bitrate_bps.emplace(20000);
-  parameters.encodings.push_back(std::move(encoding));
-
-  parameters.header_extensions.emplace_back(
-      "urn:ietf:params:rtp-hdrext:ssrc-audio-level", 3);
-
-  EXPECT_TRUE(audio_sender->Send(parameters).ok());
-
-  // Now verify that the parameters were applied to the fake media engine layer
-  // that exists below BaseChannel.
-  cricket::FakeVoiceMediaChannel* fake_voice_channel =
-      fake_media_engine_->GetVoiceChannel(0);
-  ASSERT_NE(nullptr, fake_voice_channel);
-  EXPECT_TRUE(fake_voice_channel->sending());
-
-  // Verify codec parameters.
-  ASSERT_GT(fake_voice_channel->send_codecs().size(), 0u);
-  const cricket::AudioCodec& top_codec = fake_voice_channel->send_codecs()[0];
-  EXPECT_EQ("opus", top_codec.name);
-  EXPECT_EQ(120, top_codec.id);
-  EXPECT_EQ(48000, top_codec.clockrate);
-  EXPECT_EQ(2u, top_codec.channels);
-  ASSERT_NE(top_codec.params.end(), top_codec.params.find("minptime"));
-  EXPECT_EQ("10", top_codec.params.at("minptime"));
-
-  // Verify encoding parameters.
-  EXPECT_EQ(20000, fake_voice_channel->max_bps());
-  ASSERT_EQ(1u, fake_voice_channel->send_streams().size());
-  const cricket::StreamParams& send_stream =
-      fake_voice_channel->send_streams()[0];
-  EXPECT_EQ(1u, send_stream.ssrcs.size());
-  EXPECT_EQ(0xdeadbeef, send_stream.first_ssrc());
-
-  // Verify header extensions.
-  ASSERT_EQ(1u, fake_voice_channel->send_extensions().size());
-  const RtpExtension& extension = fake_voice_channel->send_extensions()[0];
-  EXPECT_EQ("urn:ietf:params:rtp-hdrext:ssrc-audio-level", extension.uri);
-  EXPECT_EQ(3, extension.id);
-}
-
-// Test that "Send" causes the expected parameters to be applied to the media
-// engine level, for a video sender.
-TEST_F(OrtcRtpSenderTest, SendAppliesVideoParametersToMediaEngine) {
-  auto video_sender_result = ortc_factory_->CreateRtpSender(
-      cricket::MEDIA_TYPE_VIDEO, rtp_transport_.get());
-  auto video_sender = video_sender_result.MoveValue();
-
-  // First, create parameters with all the bells and whistles.
-  RtpParameters parameters;
-
-  RtpCodecParameters vp8_codec;
-  vp8_codec.name = "VP8";
-  vp8_codec.kind = cricket::MEDIA_TYPE_VIDEO;
-  vp8_codec.payload_type = 99;
-  // Try a couple types of feedback params. "Generic NACK" is a bit of a
-  // special case, so test it here.
-  vp8_codec.rtcp_feedback.emplace_back(RtcpFeedbackType::CCM,
-                                       RtcpFeedbackMessageType::FIR);
-  vp8_codec.rtcp_feedback.emplace_back(RtcpFeedbackType::NACK,
-                                       RtcpFeedbackMessageType::GENERIC_NACK);
-  parameters.codecs.push_back(std::move(vp8_codec));
-
-  RtpCodecParameters vp8_rtx_codec;
-  vp8_rtx_codec.name = "rtx";
-  vp8_rtx_codec.kind = cricket::MEDIA_TYPE_VIDEO;
-  vp8_rtx_codec.payload_type = 100;
-  vp8_rtx_codec.parameters["apt"] = "99";
-  parameters.codecs.push_back(std::move(vp8_rtx_codec));
-
-  // Add two codecs, expecting the first to be used.
-  // TODO(deadbeef): Once "codec_payload_type" is supported, use it to select a
-  // codec that's not at the top of the list.
-  RtpCodecParameters vp9_codec;
-  vp9_codec.name = "VP9";
-  vp9_codec.kind = cricket::MEDIA_TYPE_VIDEO;
-  vp9_codec.payload_type = 102;
-  parameters.codecs.push_back(std::move(vp9_codec));
-
-  RtpCodecParameters vp9_rtx_codec;
-  vp9_rtx_codec.name = "rtx";
-  vp9_rtx_codec.kind = cricket::MEDIA_TYPE_VIDEO;
-  vp9_rtx_codec.payload_type = 103;
-  vp9_rtx_codec.parameters["apt"] = "102";
-  parameters.codecs.push_back(std::move(vp9_rtx_codec));
-
-  RtpEncodingParameters encoding;
-  encoding.ssrc.emplace(0xdeadbeef);
-  encoding.rtx.emplace(0xbaadfeed);
-  encoding.max_bitrate_bps.emplace(99999);
-  parameters.encodings.push_back(std::move(encoding));
-
-  parameters.header_extensions.emplace_back("urn:3gpp:video-orientation", 4);
-  parameters.header_extensions.emplace_back(
-      "http://www.webrtc.org/experiments/rtp-hdrext/playout-delay", 6);
-
-  EXPECT_TRUE(video_sender->Send(parameters).ok());
-
-  // Now verify that the parameters were applied to the fake media engine layer
-  // that exists below BaseChannel.
-  cricket::FakeVideoMediaChannel* fake_video_channel =
-      fake_media_engine_->GetVideoChannel(0);
-  ASSERT_NE(nullptr, fake_video_channel);
-  EXPECT_TRUE(fake_video_channel->sending());
-
-  // Verify codec parameters.
-  ASSERT_GE(fake_video_channel->send_codecs().size(), 2u);
-  const cricket::VideoCodec& top_codec = fake_video_channel->send_codecs()[0];
-  EXPECT_EQ("VP8", top_codec.name);
-  EXPECT_EQ(99, top_codec.id);
-  EXPECT_TRUE(top_codec.feedback_params.Has({"ccm", "fir"}));
-  EXPECT_TRUE(top_codec.feedback_params.Has(cricket::FeedbackParam("nack")));
-
-  const cricket::VideoCodec& rtx_codec = fake_video_channel->send_codecs()[1];
-  EXPECT_EQ("rtx", rtx_codec.name);
-  EXPECT_EQ(100, rtx_codec.id);
-  ASSERT_NE(rtx_codec.params.end(), rtx_codec.params.find("apt"));
-  EXPECT_EQ("99", rtx_codec.params.at("apt"));
-
-  // Verify encoding parameters.
-  EXPECT_EQ(99999, fake_video_channel->max_bps());
-  ASSERT_EQ(1u, fake_video_channel->send_streams().size());
-  const cricket::StreamParams& send_stream =
-      fake_video_channel->send_streams()[0];
-  EXPECT_EQ(2u, send_stream.ssrcs.size());
-  EXPECT_EQ(0xdeadbeef, send_stream.first_ssrc());
-  uint32_t rtx_ssrc = 0u;
-  EXPECT_TRUE(send_stream.GetFidSsrc(send_stream.first_ssrc(), &rtx_ssrc));
-  EXPECT_EQ(0xbaadfeed, rtx_ssrc);
-
-  // Verify header extensions.
-  ASSERT_EQ(2u, fake_video_channel->send_extensions().size());
-  const RtpExtension& extension1 = fake_video_channel->send_extensions()[0];
-  EXPECT_EQ("urn:3gpp:video-orientation", extension1.uri);
-  EXPECT_EQ(4, extension1.id);
-  const RtpExtension& extension2 = fake_video_channel->send_extensions()[1];
-  EXPECT_EQ("http://www.webrtc.org/experiments/rtp-hdrext/playout-delay",
-            extension2.uri);
-  EXPECT_EQ(6, extension2.id);
-}
-
-// Ensure that when primary or RTX SSRCs are left unset, they're generated
-// automatically.
-TEST_F(OrtcRtpSenderTest, SendGeneratesSsrcsWhenEmpty) {
-  auto audio_sender_result = ortc_factory_->CreateRtpSender(
-      cricket::MEDIA_TYPE_AUDIO, rtp_transport_.get());
-  auto audio_sender = audio_sender_result.MoveValue();
-  RtpParameters parameters = MakeMinimalOpusParametersWithNoSsrc();
-  // Default RTX parameters, with no SSRC.
-  parameters.encodings[0].rtx.emplace();
-  EXPECT_TRUE(audio_sender->Send(parameters).ok());
-
-  cricket::FakeVoiceMediaChannel* fake_voice_channel =
-      fake_media_engine_->GetVoiceChannel(0);
-  ASSERT_NE(nullptr, fake_voice_channel);
-  ASSERT_EQ(1u, fake_voice_channel->send_streams().size());
-  const cricket::StreamParams& audio_send_stream =
-      fake_voice_channel->send_streams()[0];
-  EXPECT_NE(0u, audio_send_stream.first_ssrc());
-  uint32_t rtx_ssrc = 0u;
-  EXPECT_TRUE(
-      audio_send_stream.GetFidSsrc(audio_send_stream.first_ssrc(), &rtx_ssrc));
-  EXPECT_NE(0u, rtx_ssrc);
-  EXPECT_NE(audio_send_stream.first_ssrc(), rtx_ssrc);
-
-  auto video_sender_result = ortc_factory_->CreateRtpSender(
-      cricket::MEDIA_TYPE_VIDEO, rtp_transport_.get());
-  auto video_sender = video_sender_result.MoveValue();
-  parameters = MakeMinimalVp8ParametersWithNoSsrc();
-  // Default RTX parameters, with no SSRC.
-  parameters.encodings[0].rtx.emplace();
-  EXPECT_TRUE(video_sender->Send(parameters).ok());
-
-  cricket::FakeVideoMediaChannel* fake_video_channel =
-      fake_media_engine_->GetVideoChannel(0);
-  ASSERT_NE(nullptr, fake_video_channel);
-  ASSERT_EQ(1u, fake_video_channel->send_streams().size());
-  const cricket::StreamParams& video_send_stream =
-      fake_video_channel->send_streams()[0];
-  EXPECT_NE(0u, video_send_stream.first_ssrc());
-  rtx_ssrc = 0u;
-  EXPECT_TRUE(
-      video_send_stream.GetFidSsrc(video_send_stream.first_ssrc(), &rtx_ssrc));
-  EXPECT_NE(0u, rtx_ssrc);
-  EXPECT_NE(video_send_stream.first_ssrc(), rtx_ssrc);
-  EXPECT_NE(video_send_stream.first_ssrc(), audio_send_stream.first_ssrc());
-}
-
-// Test changing both the send codec and SSRC at the same time, and verify that
-// the new parameters are applied to the media engine level.
-TEST_F(OrtcRtpSenderTest, CallingSendTwiceChangesParameters) {
-  auto audio_sender_result = ortc_factory_->CreateRtpSender(
-      cricket::MEDIA_TYPE_AUDIO, rtp_transport_.get());
-  auto audio_sender = audio_sender_result.MoveValue();
-  EXPECT_TRUE(
-      audio_sender->Send(MakeMinimalOpusParametersWithSsrc(0x11111111)).ok());
-  EXPECT_TRUE(
-      audio_sender->Send(MakeMinimalIsacParametersWithSsrc(0x22222222)).ok());
-
-  cricket::FakeVoiceMediaChannel* fake_voice_channel =
-      fake_media_engine_->GetVoiceChannel(0);
-  ASSERT_NE(nullptr, fake_voice_channel);
-  ASSERT_GT(fake_voice_channel->send_codecs().size(), 0u);
-  EXPECT_EQ("ISAC", fake_voice_channel->send_codecs()[0].name);
-  ASSERT_EQ(1u, fake_voice_channel->send_streams().size());
-  EXPECT_EQ(0x22222222u, fake_voice_channel->send_streams()[0].first_ssrc());
-
-  auto video_sender_result = ortc_factory_->CreateRtpSender(
-      cricket::MEDIA_TYPE_VIDEO, rtp_transport_.get());
-  auto video_sender = video_sender_result.MoveValue();
-  EXPECT_TRUE(
-      video_sender->Send(MakeMinimalVp8ParametersWithSsrc(0x33333333)).ok());
-  EXPECT_TRUE(
-      video_sender->Send(MakeMinimalVp9ParametersWithSsrc(0x44444444)).ok());
-
-  cricket::FakeVideoMediaChannel* fake_video_channel =
-      fake_media_engine_->GetVideoChannel(0);
-  ASSERT_NE(nullptr, fake_video_channel);
-  ASSERT_GT(fake_video_channel->send_codecs().size(), 0u);
-  EXPECT_EQ("VP9", fake_video_channel->send_codecs()[0].name);
-  ASSERT_EQ(1u, fake_video_channel->send_streams().size());
-  EXPECT_EQ(0x44444444u, fake_video_channel->send_streams()[0].first_ssrc());
-}
-
-// Ensure that if the |active| flag of RtpEncodingParameters is set to false,
-// sending stops at the media engine level.
-TEST_F(OrtcRtpSenderTest, DeactivatingEncodingStopsSending) {
-  auto audio_sender_result = ortc_factory_->CreateRtpSender(
-      cricket::MEDIA_TYPE_AUDIO, rtp_transport_.get());
-  auto audio_sender = audio_sender_result.MoveValue();
-  RtpParameters parameters = MakeMinimalOpusParameters();
-  EXPECT_TRUE(audio_sender->Send(parameters).ok());
-
-  // Expect "sending" flag to initially be true.
-  cricket::FakeVoiceMediaChannel* fake_voice_channel =
-      fake_media_engine_->GetVoiceChannel(0);
-  ASSERT_NE(nullptr, fake_voice_channel);
-  EXPECT_TRUE(fake_voice_channel->sending());
-
-  // Deactivate encoding and expect it to change to false.
-  parameters.encodings[0].active = false;
-  EXPECT_TRUE(audio_sender->Send(parameters).ok());
-  EXPECT_FALSE(fake_voice_channel->sending());
-
-  // Try the same thing for video now.
-  auto video_sender_result = ortc_factory_->CreateRtpSender(
-      cricket::MEDIA_TYPE_VIDEO, rtp_transport_.get());
-  auto video_sender = video_sender_result.MoveValue();
-  parameters = MakeMinimalVp8Parameters();
-  EXPECT_TRUE(video_sender->Send(parameters).ok());
-
-  cricket::FakeVideoMediaChannel* fake_video_channel =
-      fake_media_engine_->GetVideoChannel(0);
-  ASSERT_NE(nullptr, fake_video_channel);
-  EXPECT_TRUE(fake_video_channel->sending());
-
-  parameters.encodings[0].active = false;
-  EXPECT_TRUE(video_sender->Send(parameters).ok());
-  EXPECT_FALSE(fake_video_channel->sending());
-}
-
-// Ensure that calling Send with an empty list of encodings causes send streams
-// at the media engine level to be cleared.
-TEST_F(OrtcRtpSenderTest, CallingSendWithEmptyEncodingsClearsSendStreams) {
-  auto audio_sender_result = ortc_factory_->CreateRtpSender(
-      cricket::MEDIA_TYPE_AUDIO, rtp_transport_.get());
-  auto audio_sender = audio_sender_result.MoveValue();
-  RtpParameters parameters = MakeMinimalOpusParameters();
-  EXPECT_TRUE(audio_sender->Send(parameters).ok());
-  parameters.encodings.clear();
-  EXPECT_TRUE(audio_sender->Send(parameters).ok());
-
-  cricket::FakeVoiceMediaChannel* fake_voice_channel =
-      fake_media_engine_->GetVoiceChannel(0);
-  ASSERT_NE(nullptr, fake_voice_channel);
-  EXPECT_TRUE(fake_voice_channel->send_streams().empty());
-
-  auto video_sender_result = ortc_factory_->CreateRtpSender(
-      cricket::MEDIA_TYPE_VIDEO, rtp_transport_.get());
-  auto video_sender = video_sender_result.MoveValue();
-  parameters = MakeMinimalVp8Parameters();
-  EXPECT_TRUE(video_sender->Send(parameters).ok());
-  parameters.encodings.clear();
-  EXPECT_TRUE(video_sender->Send(parameters).ok());
-
-  cricket::FakeVideoMediaChannel* fake_video_channel =
-      fake_media_engine_->GetVideoChannel(0);
-  ASSERT_NE(nullptr, fake_video_channel);
-  EXPECT_TRUE(fake_video_channel->send_streams().empty());
-}
-
-// These errors should be covered by rtpparametersconversion_unittest.cc, but
-// we should at least test that those errors are propogated from calls to Send,
-// with a few examples.
-TEST_F(OrtcRtpSenderTest, SendReturnsErrorOnInvalidParameters) {
-  auto result = ortc_factory_->CreateRtpSender(cricket::MEDIA_TYPE_VIDEO,
-                                               rtp_transport_.get());
-  auto sender = result.MoveValue();
-  // NACK feedback missing message type.
-  RtpParameters invalid_feedback = MakeMinimalVp8Parameters();
-  invalid_feedback.codecs[0].rtcp_feedback.emplace_back(RtcpFeedbackType::NACK);
-  EXPECT_EQ(RTCErrorType::INVALID_PARAMETER,
-            sender->Send(invalid_feedback).type());
-  // Negative payload type.
-  RtpParameters invalid_pt = MakeMinimalVp8Parameters();
-  invalid_pt.codecs[0].payload_type = -1;
-  EXPECT_EQ(RTCErrorType::INVALID_RANGE, sender->Send(invalid_pt).type());
-  // Duplicate codec payload types.
-  RtpParameters duplicate_payload_types = MakeMinimalVp8Parameters();
-  duplicate_payload_types.codecs.push_back(duplicate_payload_types.codecs[0]);
-  duplicate_payload_types.codecs.back().name = "VP9";
-  EXPECT_EQ(RTCErrorType::INVALID_PARAMETER,
-            sender->Send(duplicate_payload_types).type());
-}
-
-// Two senders using the same transport shouldn't be able to use the same
-// payload type to refer to different codecs, same header extension IDs to
-// refer to different extensions, or same SSRC.
-TEST_F(OrtcRtpSenderTest, SendReturnsErrorOnIdConflicts) {
-  auto audio_sender_result = ortc_factory_->CreateRtpSender(
-      cricket::MEDIA_TYPE_AUDIO, rtp_transport_.get());
-  auto video_sender_result = ortc_factory_->CreateRtpSender(
-      cricket::MEDIA_TYPE_VIDEO, rtp_transport_.get());
-  auto audio_sender = audio_sender_result.MoveValue();
-  auto video_sender = video_sender_result.MoveValue();
-
-  // First test payload type conflict.
-  RtpParameters audio_parameters = MakeMinimalOpusParameters();
-  RtpParameters video_parameters = MakeMinimalVp8Parameters();
-  audio_parameters.codecs[0].payload_type = 100;
-  video_parameters.codecs[0].payload_type = 100;
-  EXPECT_TRUE(audio_sender->Send(audio_parameters).ok());
-  EXPECT_EQ(RTCErrorType::INVALID_PARAMETER,
-            video_sender->Send(video_parameters).type());
-
-  // Test header extension ID conflict.
-  video_parameters.codecs[0].payload_type = 110;
-  audio_parameters.header_extensions.emplace_back("foo", 4);
-  video_parameters.header_extensions.emplace_back("bar", 4);
-  EXPECT_TRUE(audio_sender->Send(audio_parameters).ok());
-  EXPECT_EQ(RTCErrorType::INVALID_PARAMETER,
-            video_sender->Send(video_parameters).type());
-
-  // Test SSRC conflict. Have an RTX SSRC that conflicts with a primary SSRC
-  // for extra challenge.
-  video_parameters.header_extensions[0].uri = "foo";
-  audio_parameters.encodings[0].ssrc.emplace(0xdeadbeef);
-  video_parameters.encodings[0].ssrc.emplace(0xabbaabba);
-  video_parameters.encodings[0].rtx.emplace(0xdeadbeef);
-  EXPECT_TRUE(audio_sender->Send(audio_parameters).ok());
-  EXPECT_EQ(RTCErrorType::INVALID_PARAMETER,
-            video_sender->Send(video_parameters).type());
-
-  // Sanity check that parameters can be set if the conflicts are all resolved.
-  video_parameters.encodings[0].rtx->ssrc.emplace(0xbaadf00d);
-  EXPECT_TRUE(video_sender->Send(video_parameters).ok());
-}
-
-// Ensure that deleting a sender causes send streams at the media engine level
-// to be cleared.
-TEST_F(OrtcRtpSenderTest, DeletingSenderClearsSendStreams) {
-  auto audio_sender_result = ortc_factory_->CreateRtpSender(
-      cricket::MEDIA_TYPE_AUDIO, rtp_transport_.get());
-  auto audio_sender = audio_sender_result.MoveValue();
-  EXPECT_TRUE(audio_sender->Send(MakeMinimalOpusParameters()).ok());
-
-  // Also create an audio receiver, to prevent the voice channel from being
-  // completely deleted.
-  auto audio_receiver_result = ortc_factory_->CreateRtpReceiver(
-      cricket::MEDIA_TYPE_AUDIO, rtp_transport_.get());
-  auto audio_receiver = audio_receiver_result.MoveValue();
-  EXPECT_TRUE(audio_receiver->Receive(MakeMinimalOpusParameters()).ok());
-
-  audio_sender.reset(nullptr);
-  cricket::FakeVoiceMediaChannel* fake_voice_channel =
-      fake_media_engine_->GetVoiceChannel(0);
-  ASSERT_NE(nullptr, fake_voice_channel);
-  EXPECT_TRUE(fake_voice_channel->send_streams().empty());
-
-  auto video_sender_result = ortc_factory_->CreateRtpSender(
-      cricket::MEDIA_TYPE_VIDEO, rtp_transport_.get());
-  auto video_sender = video_sender_result.MoveValue();
-  EXPECT_TRUE(video_sender->Send(MakeMinimalVp8Parameters()).ok());
-
-  // Also create an video receiver, to prevent the video channel from being
-  // completely deleted.
-  auto video_receiver_result = ortc_factory_->CreateRtpReceiver(
-      cricket::MEDIA_TYPE_VIDEO, rtp_transport_.get());
-  auto video_receiver = video_receiver_result.MoveValue();
-  EXPECT_TRUE(video_receiver->Receive(MakeMinimalVp8Parameters()).ok());
-
-  video_sender.reset(nullptr);
-  cricket::FakeVideoMediaChannel* fake_video_channel =
-      fake_media_engine_->GetVideoChannel(0);
-  ASSERT_NE(nullptr, fake_video_channel);
-  EXPECT_TRUE(fake_video_channel->send_streams().empty());
-}
-
-// If Send hasn't been called, GetParameters should return empty parameters.
-TEST_F(OrtcRtpSenderTest, GetDefaultParameters) {
-  auto result = ortc_factory_->CreateRtpSender(cricket::MEDIA_TYPE_AUDIO,
-                                               rtp_transport_.get());
-  EXPECT_EQ(RtpParameters(), result.value()->GetParameters());
-  result = ortc_factory_->CreateRtpSender(cricket::MEDIA_TYPE_VIDEO,
-                                          rtp_transport_.get());
-  EXPECT_EQ(RtpParameters(), result.value()->GetParameters());
-}
-
-// Test that GetParameters returns the last parameters passed into Send, along
-// with the implementation-default values filled in where they were left unset.
-TEST_F(OrtcRtpSenderTest,
-       GetParametersReturnsLastSetParametersWithDefaultsFilled) {
-  auto audio_sender_result = ortc_factory_->CreateRtpSender(
-      CreateAudioTrack("audio"), rtp_transport_.get());
-  auto audio_sender = audio_sender_result.MoveValue();
-
-  RtpParameters opus_parameters = MakeMinimalOpusParameters();
-  EXPECT_TRUE(audio_sender->Send(opus_parameters).ok());
-  EXPECT_EQ(opus_parameters, audio_sender->GetParameters());
-
-  RtpParameters isac_parameters = MakeMinimalIsacParameters();
-  // Sanity check that num_channels actually is left unset.
-  ASSERT_FALSE(isac_parameters.codecs[0].num_channels);
-  EXPECT_TRUE(audio_sender->Send(isac_parameters).ok());
-  // Should be filled with a default "num channels" of 1.
-  // TODO(deadbeef): This should actually default to 2 for some codecs. Update
-  // this test once that's implemented.
-  isac_parameters.codecs[0].num_channels.emplace(1);
-  EXPECT_EQ(isac_parameters, audio_sender->GetParameters());
-
-  auto video_sender_result = ortc_factory_->CreateRtpSender(
-      CreateVideoTrack("video"), rtp_transport_.get());
-  auto video_sender = video_sender_result.MoveValue();
-
-  RtpParameters vp8_parameters = MakeMinimalVp8Parameters();
-  // Sanity check that clock_rate actually is left unset.
-  EXPECT_TRUE(video_sender->Send(vp8_parameters).ok());
-  // Should be filled with a default clock rate of 90000.
-  vp8_parameters.codecs[0].clock_rate.emplace(90000);
-  EXPECT_EQ(vp8_parameters, video_sender->GetParameters());
-
-  RtpParameters vp9_parameters = MakeMinimalVp9Parameters();
-  // Sanity check that clock_rate actually is left unset.
-  EXPECT_TRUE(video_sender->Send(vp9_parameters).ok());
-  // Should be filled with a default clock rate of 90000.
-  vp9_parameters.codecs[0].clock_rate.emplace(90000);
-  EXPECT_EQ(vp9_parameters, video_sender->GetParameters());
-}
-
-TEST_F(OrtcRtpSenderTest, GetKind) {
-  // Construct one sender from the "kind" enum and another from a track.
-  auto audio_sender_result = ortc_factory_->CreateRtpSender(
-      cricket::MEDIA_TYPE_AUDIO, rtp_transport_.get());
-  auto video_sender_result = ortc_factory_->CreateRtpSender(
-      CreateVideoTrack("video"), rtp_transport_.get());
-  auto audio_sender = audio_sender_result.MoveValue();
-  auto video_sender = video_sender_result.MoveValue();
-  EXPECT_EQ(cricket::MEDIA_TYPE_AUDIO, audio_sender->GetKind());
-  EXPECT_EQ(cricket::MEDIA_TYPE_VIDEO, video_sender->GetKind());
-}
-
-}  // namespace webrtc
diff --git a/ortc/ortcrtpsenderadapter.cc b/ortc/ortcrtpsenderadapter.cc
deleted file mode 100644
index 0bce591..0000000
--- a/ortc/ortcrtpsenderadapter.cc
+++ /dev/null
@@ -1,178 +0,0 @@
-/*
- *  Copyright 2017 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/ortc/ortcrtpsenderadapter.h"
-
-#include <utility>
-
-#include "webrtc/media/base/mediaconstants.h"
-#include "webrtc/ortc/rtptransportadapter.h"
-#include "webrtc/rtc_base/checks.h"
-
-namespace {
-
-void FillAudioSenderParameters(webrtc::RtpParameters* parameters) {
-  for (webrtc::RtpCodecParameters& codec : parameters->codecs) {
-    if (!codec.num_channels) {
-      codec.num_channels = rtc::Optional<int>(1);
-    }
-  }
-}
-
-void FillVideoSenderParameters(webrtc::RtpParameters* parameters) {
-  for (webrtc::RtpCodecParameters& codec : parameters->codecs) {
-    if (!codec.clock_rate) {
-      codec.clock_rate = rtc::Optional<int>(cricket::kVideoCodecClockrate);
-    }
-  }
-}
-
-}  // namespace
-
-namespace webrtc {
-
-BEGIN_OWNED_PROXY_MAP(OrtcRtpSender)
-PROXY_SIGNALING_THREAD_DESTRUCTOR()
-PROXY_METHOD1(RTCError, SetTrack, MediaStreamTrackInterface*)
-PROXY_CONSTMETHOD0(rtc::scoped_refptr<MediaStreamTrackInterface>, GetTrack)
-PROXY_METHOD1(RTCError, SetTransport, RtpTransportInterface*)
-PROXY_CONSTMETHOD0(RtpTransportInterface*, GetTransport)
-PROXY_METHOD1(RTCError, Send, const RtpParameters&)
-PROXY_CONSTMETHOD0(RtpParameters, GetParameters)
-PROXY_CONSTMETHOD0(cricket::MediaType, GetKind)
-END_PROXY_MAP()
-
-// static
-std::unique_ptr<OrtcRtpSenderInterface> OrtcRtpSenderAdapter::CreateProxy(
-    std::unique_ptr<OrtcRtpSenderAdapter> wrapped_sender) {
-  RTC_DCHECK(wrapped_sender);
-  rtc::Thread* signaling =
-      wrapped_sender->rtp_transport_controller_->signaling_thread();
-  rtc::Thread* worker =
-      wrapped_sender->rtp_transport_controller_->worker_thread();
-  return OrtcRtpSenderProxy::Create(signaling, worker,
-                                    std::move(wrapped_sender));
-}
-
-OrtcRtpSenderAdapter::~OrtcRtpSenderAdapter() {
-  internal_sender_ = nullptr;
-  SignalDestroyed();
-}
-
-RTCError OrtcRtpSenderAdapter::SetTrack(MediaStreamTrackInterface* track) {
-  if (track && cricket::MediaTypeFromString(track->kind()) != kind_) {
-    LOG_AND_RETURN_ERROR(
-        RTCErrorType::INVALID_PARAMETER,
-        "Track kind (audio/video) doesn't match the kind of this sender.");
-  }
-  if (internal_sender_ && !internal_sender_->SetTrack(track)) {
-    // Since we checked the track type above, this should never happen...
-    RTC_NOTREACHED();
-    LOG_AND_RETURN_ERROR(RTCErrorType::INTERNAL_ERROR,
-                         "Failed to set track on RtpSender.");
-  }
-  track_ = track;
-  return RTCError::OK();
-}
-
-rtc::scoped_refptr<MediaStreamTrackInterface> OrtcRtpSenderAdapter::GetTrack()
-    const {
-  return track_;
-}
-
-RTCError OrtcRtpSenderAdapter::SetTransport(RtpTransportInterface* transport) {
-  LOG_AND_RETURN_ERROR(
-      RTCErrorType::UNSUPPORTED_OPERATION,
-      "Changing the transport of an RtpSender is not yet supported.");
-}
-
-RtpTransportInterface* OrtcRtpSenderAdapter::GetTransport() const {
-  return transport_;
-}
-
-RTCError OrtcRtpSenderAdapter::Send(const RtpParameters& parameters) {
-  RtpParameters filled_parameters = parameters;
-  RTCError err;
-  uint32_t ssrc = 0;
-  switch (kind_) {
-    case cricket::MEDIA_TYPE_AUDIO:
-      FillAudioSenderParameters(&filled_parameters);
-      err = rtp_transport_controller_->ValidateAndApplyAudioSenderParameters(
-          filled_parameters, &ssrc);
-      if (!err.ok()) {
-        return err;
-      }
-      break;
-    case cricket::MEDIA_TYPE_VIDEO:
-      FillVideoSenderParameters(&filled_parameters);
-      err = rtp_transport_controller_->ValidateAndApplyVideoSenderParameters(
-          filled_parameters, &ssrc);
-      if (!err.ok()) {
-        return err;
-      }
-      break;
-    case cricket::MEDIA_TYPE_DATA:
-      RTC_NOTREACHED();
-      return webrtc::RTCError(webrtc::RTCErrorType::INTERNAL_ERROR);
-  }
-  last_applied_parameters_ = filled_parameters;
-
-  // Now that parameters were applied, can call SetSsrc on the internal sender.
-  // This is analogous to a PeerConnection calling SetSsrc after
-  // SetLocalDescription is successful.
-  //
-  // If there were no encodings, this SSRC may be 0, which is valid.
-  if (!internal_sender_) {
-    CreateInternalSender();
-  }
-  internal_sender_->SetSsrc(ssrc);
-
-  return RTCError::OK();
-}
-
-RtpParameters OrtcRtpSenderAdapter::GetParameters() const {
-  return last_applied_parameters_;
-}
-
-cricket::MediaType OrtcRtpSenderAdapter::GetKind() const {
-  return kind_;
-}
-
-OrtcRtpSenderAdapter::OrtcRtpSenderAdapter(
-    cricket::MediaType kind,
-    RtpTransportInterface* transport,
-    RtpTransportControllerAdapter* rtp_transport_controller)
-    : kind_(kind),
-      transport_(transport),
-      rtp_transport_controller_(rtp_transport_controller) {}
-
-void OrtcRtpSenderAdapter::CreateInternalSender() {
-  switch (kind_) {
-    case cricket::MEDIA_TYPE_AUDIO:
-      internal_sender_ = new AudioRtpSender(
-          rtp_transport_controller_->voice_channel(), nullptr);
-      break;
-    case cricket::MEDIA_TYPE_VIDEO:
-      internal_sender_ =
-          new VideoRtpSender(rtp_transport_controller_->video_channel());
-      break;
-    case cricket::MEDIA_TYPE_DATA:
-      RTC_NOTREACHED();
-  }
-  if (track_) {
-    if (!internal_sender_->SetTrack(track_)) {
-      // Since we checked the track type when it was set, this should never
-      // happen...
-      RTC_NOTREACHED();
-    }
-  }
-}
-
-}  // namespace webrtc
diff --git a/ortc/ortcrtpsenderadapter.h b/ortc/ortcrtpsenderadapter.h
deleted file mode 100644
index 92051e7..0000000
--- a/ortc/ortcrtpsenderadapter.h
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- *  Copyright 2017 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_ORTC_ORTCRTPSENDERADAPTER_H_
-#define WEBRTC_ORTC_ORTCRTPSENDERADAPTER_H_
-
-#include <memory>
-
-#include "webrtc/api/ortc/ortcrtpsenderinterface.h"
-#include "webrtc/api/rtcerror.h"
-#include "webrtc/api/rtpparameters.h"
-#include "webrtc/ortc/rtptransportcontrolleradapter.h"
-#include "webrtc/pc/rtpsender.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/sigslot.h"
-
-namespace webrtc {
-
-// Implementation of OrtcRtpSenderInterface that works with RtpTransportAdapter,
-// and wraps a VideoRtpSender/AudioRtpSender that's normally used with the
-// PeerConnection.
-//
-// TODO(deadbeef): When BaseChannel is split apart into separate
-// "RtpSender"/"RtpTransceiver"/"RtpSender"/"RtpReceiver" objects, this adapter
-// object can be removed.
-class OrtcRtpSenderAdapter : public OrtcRtpSenderInterface {
- public:
-  // Wraps |wrapped_sender| in a proxy that will safely call methods on the
-  // correct thread.
-  static std::unique_ptr<OrtcRtpSenderInterface> CreateProxy(
-      std::unique_ptr<OrtcRtpSenderAdapter> wrapped_sender);
-
-  // Should only be called by RtpTransportControllerAdapter.
-  OrtcRtpSenderAdapter(cricket::MediaType kind,
-                       RtpTransportInterface* transport,
-                       RtpTransportControllerAdapter* rtp_transport_controller);
-  ~OrtcRtpSenderAdapter() override;
-
-  // OrtcRtpSenderInterface implementation.
-  RTCError SetTrack(MediaStreamTrackInterface* track) override;
-  rtc::scoped_refptr<MediaStreamTrackInterface> GetTrack() const override;
-
-  RTCError SetTransport(RtpTransportInterface* transport) override;
-  RtpTransportInterface* GetTransport() const override;
-
-  RTCError Send(const RtpParameters& parameters) override;
-  RtpParameters GetParameters() const override;
-
-  cricket::MediaType GetKind() const override;
-
-  // Used so that the RtpTransportControllerAdapter knows when it can
-  // deallocate resources allocated for this object.
-  sigslot::signal0<> SignalDestroyed;
-
- private:
-  void CreateInternalSender();
-
-  cricket::MediaType kind_;
-  RtpTransportInterface* transport_;
-  RtpTransportControllerAdapter* rtp_transport_controller_;
-  // Scoped refptr due to ref-counted interface, but we should be the only
-  // reference holder.
-  rtc::scoped_refptr<RtpSenderInternal> internal_sender_;
-  rtc::scoped_refptr<MediaStreamTrackInterface> track_;
-  RtpParameters last_applied_parameters_;
-
-  RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(OrtcRtpSenderAdapter);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_ORTC_ORTCRTPSENDERADAPTER_H_
diff --git a/ortc/rtpparametersconversion.cc b/ortc/rtpparametersconversion.cc
deleted file mode 100644
index 083c3b0..0000000
--- a/ortc/rtpparametersconversion.cc
+++ /dev/null
@@ -1,459 +0,0 @@
-/*
- *  Copyright 2017 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/ortc/rtpparametersconversion.h"
-
-#include <set>
-#include <sstream>
-#include <utility>
-
-#include "webrtc/media/base/rtputils.h"
-
-namespace webrtc {
-
-RTCErrorOr<cricket::FeedbackParam> ToCricketFeedbackParam(
-    const RtcpFeedback& feedback) {
-  switch (feedback.type) {
-    case RtcpFeedbackType::CCM:
-      if (!feedback.message_type) {
-        LOG_AND_RETURN_ERROR(RTCErrorType::INVALID_PARAMETER,
-                             "Missing message type in CCM RtcpFeedback.");
-      } else if (*feedback.message_type != RtcpFeedbackMessageType::FIR) {
-        LOG_AND_RETURN_ERROR(RTCErrorType::INVALID_PARAMETER,
-                             "Invalid message type in CCM RtcpFeedback.");
-      }
-      return cricket::FeedbackParam(cricket::kRtcpFbParamCcm,
-                                    cricket::kRtcpFbCcmParamFir);
-    case RtcpFeedbackType::NACK:
-      if (!feedback.message_type) {
-        LOG_AND_RETURN_ERROR(RTCErrorType::INVALID_PARAMETER,
-                             "Missing message type in NACK RtcpFeedback.");
-      }
-      switch (*feedback.message_type) {
-        case RtcpFeedbackMessageType::GENERIC_NACK:
-          return cricket::FeedbackParam(cricket::kRtcpFbParamNack);
-        case RtcpFeedbackMessageType::PLI:
-          return cricket::FeedbackParam(cricket::kRtcpFbParamNack,
-                                        cricket::kRtcpFbNackParamPli);
-        default:
-          LOG_AND_RETURN_ERROR(RTCErrorType::INVALID_PARAMETER,
-                               "Invalid message type in NACK RtcpFeedback.");
-      }
-    case RtcpFeedbackType::REMB:
-      if (feedback.message_type) {
-        LOG_AND_RETURN_ERROR(
-            RTCErrorType::INVALID_PARAMETER,
-            "Didn't expect message type in REMB RtcpFeedback.");
-      }
-      return cricket::FeedbackParam(cricket::kRtcpFbParamRemb);
-    case RtcpFeedbackType::TRANSPORT_CC:
-      if (feedback.message_type) {
-        LOG_AND_RETURN_ERROR(
-            RTCErrorType::INVALID_PARAMETER,
-            "Didn't expect message type in transport-cc RtcpFeedback.");
-      }
-      return cricket::FeedbackParam(cricket::kRtcpFbParamTransportCc);
-  }
-  // Not reached; avoids compile warning.
-  FATAL();
-}
-
-template <typename C>
-static RTCError ToCricketCodecTypeSpecific(const RtpCodecParameters& codec,
-                                           C* cricket_codec);
-
-template <>
-RTCError ToCricketCodecTypeSpecific<cricket::AudioCodec>(
-    const RtpCodecParameters& codec,
-    cricket::AudioCodec* cricket_codec) {
-  if (codec.kind != cricket::MEDIA_TYPE_AUDIO) {
-    LOG_AND_RETURN_ERROR(
-        RTCErrorType::INVALID_PARAMETER,
-        "Can't use video codec with audio sender or receiver.");
-  }
-  if (!codec.num_channels) {
-    LOG_AND_RETURN_ERROR(RTCErrorType::INVALID_PARAMETER,
-                         "Missing number of channels for audio codec.");
-  }
-  if (*codec.num_channels <= 0) {
-    LOG_AND_RETURN_ERROR(RTCErrorType::INVALID_RANGE,
-                         "Number of channels must be positive.");
-  }
-  cricket_codec->channels = *codec.num_channels;
-  if (!codec.clock_rate) {
-    LOG_AND_RETURN_ERROR(RTCErrorType::INVALID_PARAMETER,
-                         "Missing codec clock rate.");
-  }
-  if (*codec.clock_rate <= 0) {
-    LOG_AND_RETURN_ERROR(RTCErrorType::INVALID_RANGE,
-                         "Clock rate must be positive.");
-  }
-  cricket_codec->clockrate = *codec.clock_rate;
-  return RTCError::OK();
-}
-
-// Video codecs don't use num_channels or clock_rate, but they should at least
-// be validated to ensure the application isn't trying to do something it
-// doesn't intend to.
-template <>
-RTCError ToCricketCodecTypeSpecific<cricket::VideoCodec>(
-    const RtpCodecParameters& codec,
-    cricket::VideoCodec*) {
-  if (codec.kind != cricket::MEDIA_TYPE_VIDEO) {
-    LOG_AND_RETURN_ERROR(
-        RTCErrorType::INVALID_PARAMETER,
-        "Can't use audio codec with video sender or receiver.");
-  }
-  if (codec.num_channels) {
-    LOG_AND_RETURN_ERROR(RTCErrorType::INVALID_PARAMETER,
-                         "Video codec shouldn't have num_channels.");
-  }
-  if (!codec.clock_rate) {
-    LOG_AND_RETURN_ERROR(RTCErrorType::INVALID_PARAMETER,
-                         "Missing codec clock rate.");
-  }
-  if (*codec.clock_rate != cricket::kVideoCodecClockrate) {
-    LOG_AND_RETURN_ERROR(RTCErrorType::INVALID_PARAMETER,
-                         "Video clock rate must be 90000.");
-  }
-  return RTCError::OK();
-}
-
-template <typename C>
-RTCErrorOr<C> ToCricketCodec(const RtpCodecParameters& codec) {
-  C cricket_codec;
-  // Start with audio/video specific conversion.
-  RTCError err = ToCricketCodecTypeSpecific(codec, &cricket_codec);
-  if (!err.ok()) {
-    return std::move(err);
-  }
-  cricket_codec.name = codec.name;
-  if (!cricket::IsValidRtpPayloadType(codec.payload_type)) {
-    std::ostringstream oss;
-    oss << "Invalid payload type: " << codec.payload_type;
-    LOG_AND_RETURN_ERROR(RTCErrorType::INVALID_RANGE, oss.str());
-  }
-  cricket_codec.id = codec.payload_type;
-  for (const RtcpFeedback& feedback : codec.rtcp_feedback) {
-    auto result = ToCricketFeedbackParam(feedback);
-    if (!result.ok()) {
-      return result.MoveError();
-    }
-    cricket_codec.AddFeedbackParam(result.MoveValue());
-  }
-  cricket_codec.params.insert(codec.parameters.begin(), codec.parameters.end());
-  return std::move(cricket_codec);
-}
-
-template RTCErrorOr<cricket::AudioCodec> ToCricketCodec(
-    const RtpCodecParameters& codec);
-template RTCErrorOr<cricket::VideoCodec> ToCricketCodec(
-    const RtpCodecParameters& codec);
-
-template <typename C>
-RTCErrorOr<std::vector<C>> ToCricketCodecs(
-    const std::vector<RtpCodecParameters>& codecs) {
-  std::vector<C> cricket_codecs;
-  std::set<int> seen_payload_types;
-  for (const RtpCodecParameters& codec : codecs) {
-    auto result = ToCricketCodec<C>(codec);
-    if (!result.ok()) {
-      return result.MoveError();
-    }
-    if (!seen_payload_types.insert(codec.payload_type).second) {
-      std::ostringstream oss;
-      oss << "Duplicate payload type: " << codec.payload_type;
-      LOG_AND_RETURN_ERROR(RTCErrorType::INVALID_PARAMETER, oss.str());
-    }
-    cricket_codecs.push_back(result.MoveValue());
-  }
-  return std::move(cricket_codecs);
-}
-
-template RTCErrorOr<std::vector<cricket::AudioCodec>> ToCricketCodecs<
-    cricket::AudioCodec>(const std::vector<RtpCodecParameters>& codecs);
-
-template RTCErrorOr<std::vector<cricket::VideoCodec>> ToCricketCodecs<
-    cricket::VideoCodec>(const std::vector<RtpCodecParameters>& codecs);
-
-RTCErrorOr<cricket::RtpHeaderExtensions> ToCricketRtpHeaderExtensions(
-    const std::vector<RtpHeaderExtensionParameters>& extensions) {
-  cricket::RtpHeaderExtensions cricket_extensions;
-  std::ostringstream err_writer;
-  std::set<int> seen_header_extension_ids;
-  for (const RtpHeaderExtensionParameters& extension : extensions) {
-    if (extension.id < RtpHeaderExtensionParameters::kMinId ||
-        extension.id > RtpHeaderExtensionParameters::kMaxId) {
-      err_writer << "Invalid header extension id: " << extension.id;
-      LOG_AND_RETURN_ERROR(RTCErrorType::INVALID_RANGE, err_writer.str());
-    }
-    if (!seen_header_extension_ids.insert(extension.id).second) {
-      err_writer << "Duplicate header extension id: " << extension.id;
-      LOG_AND_RETURN_ERROR(RTCErrorType::INVALID_PARAMETER, err_writer.str());
-    }
-    cricket_extensions.push_back(extension);
-  }
-  return std::move(cricket_extensions);
-}
-
-RTCErrorOr<cricket::StreamParamsVec> ToCricketStreamParamsVec(
-    const std::vector<RtpEncodingParameters>& encodings) {
-  if (encodings.size() > 1u) {
-    LOG_AND_RETURN_ERROR(RTCErrorType::UNSUPPORTED_PARAMETER,
-                         "ORTC API implementation doesn't currently "
-                         "support simulcast or layered encodings.");
-  } else if (encodings.empty()) {
-    return cricket::StreamParamsVec();
-  }
-  cricket::StreamParamsVec cricket_streams;
-  const RtpEncodingParameters& encoding = encodings[0];
-  if (encoding.rtx && encoding.rtx->ssrc && !encoding.ssrc) {
-    LOG_AND_RETURN_ERROR(RTCErrorType::UNSUPPORTED_PARAMETER,
-                         "Setting an RTX SSRC explicitly while leaving the "
-                         "primary SSRC unset is not currently supported.");
-  }
-  if (encoding.ssrc) {
-    cricket::StreamParams stream_params;
-    stream_params.add_ssrc(*encoding.ssrc);
-    if (encoding.rtx && encoding.rtx->ssrc) {
-      stream_params.AddFidSsrc(*encoding.ssrc, *encoding.rtx->ssrc);
-    }
-    cricket_streams.push_back(std::move(stream_params));
-  }
-  return std::move(cricket_streams);
-}
-
-rtc::Optional<RtcpFeedback> ToRtcpFeedback(
-    const cricket::FeedbackParam& cricket_feedback) {
-  if (cricket_feedback.id() == cricket::kRtcpFbParamCcm) {
-    if (cricket_feedback.param() == cricket::kRtcpFbCcmParamFir) {
-      return rtc::Optional<RtcpFeedback>(
-          {RtcpFeedbackType::CCM, RtcpFeedbackMessageType::FIR});
-    } else {
-      LOG(LS_WARNING) << "Unsupported parameter for CCM RTCP feedback: "
-                      << cricket_feedback.param();
-      return rtc::Optional<RtcpFeedback>();
-    }
-  } else if (cricket_feedback.id() == cricket::kRtcpFbParamNack) {
-    if (cricket_feedback.param().empty()) {
-      return rtc::Optional<RtcpFeedback>(
-          {RtcpFeedbackType::NACK, RtcpFeedbackMessageType::GENERIC_NACK});
-    } else if (cricket_feedback.param() == cricket::kRtcpFbNackParamPli) {
-      return rtc::Optional<RtcpFeedback>(
-          {RtcpFeedbackType::NACK, RtcpFeedbackMessageType::PLI});
-    } else {
-      LOG(LS_WARNING) << "Unsupported parameter for NACK RTCP feedback: "
-                      << cricket_feedback.param();
-      return rtc::Optional<RtcpFeedback>();
-    }
-  } else if (cricket_feedback.id() == cricket::kRtcpFbParamRemb) {
-    if (!cricket_feedback.param().empty()) {
-      LOG(LS_WARNING) << "Unsupported parameter for REMB RTCP feedback: "
-                      << cricket_feedback.param();
-      return rtc::Optional<RtcpFeedback>();
-    } else {
-      return rtc::Optional<RtcpFeedback>(RtcpFeedback(RtcpFeedbackType::REMB));
-    }
-  } else if (cricket_feedback.id() == cricket::kRtcpFbParamTransportCc) {
-    if (!cricket_feedback.param().empty()) {
-      LOG(LS_WARNING)
-          << "Unsupported parameter for transport-cc RTCP feedback: "
-          << cricket_feedback.param();
-      return rtc::Optional<RtcpFeedback>();
-    } else {
-      return rtc::Optional<RtcpFeedback>(
-          RtcpFeedback(RtcpFeedbackType::TRANSPORT_CC));
-    }
-  }
-  LOG(LS_WARNING) << "Unsupported RTCP feedback type: "
-                  << cricket_feedback.id();
-  return rtc::Optional<RtcpFeedback>();
-}
-
-std::vector<RtpEncodingParameters> ToRtpEncodings(
-    const cricket::StreamParamsVec& stream_params) {
-  std::vector<RtpEncodingParameters> rtp_encodings;
-  for (const cricket::StreamParams& stream_param : stream_params) {
-    RtpEncodingParameters rtp_encoding;
-    rtp_encoding.ssrc.emplace(stream_param.first_ssrc());
-    uint32_t rtx_ssrc = 0;
-    if (stream_param.GetFidSsrc(stream_param.first_ssrc(), &rtx_ssrc)) {
-      RtpRtxParameters rtx_param(rtx_ssrc);
-      rtp_encoding.rtx.emplace(rtx_param);
-    }
-    rtp_encodings.push_back(std::move(rtp_encoding));
-  }
-  return rtp_encodings;
-}
-
-template <typename C>
-cricket::MediaType KindOfCodec();
-
-template <>
-cricket::MediaType KindOfCodec<cricket::AudioCodec>() {
-  return cricket::MEDIA_TYPE_AUDIO;
-}
-
-template <>
-cricket::MediaType KindOfCodec<cricket::VideoCodec>() {
-  return cricket::MEDIA_TYPE_VIDEO;
-}
-
-template <typename C>
-static void ToRtpCodecCapabilityTypeSpecific(const C& cricket_codec,
-                                             RtpCodecCapability* codec);
-
-template <>
-void ToRtpCodecCapabilityTypeSpecific<cricket::AudioCodec>(
-    const cricket::AudioCodec& cricket_codec,
-    RtpCodecCapability* codec) {
-  codec->num_channels =
-      rtc::Optional<int>(static_cast<int>(cricket_codec.channels));
-}
-
-template <>
-void ToRtpCodecCapabilityTypeSpecific<cricket::VideoCodec>(
-    const cricket::VideoCodec& cricket_codec,
-    RtpCodecCapability* codec) {}
-
-template <typename C>
-RtpCodecCapability ToRtpCodecCapability(const C& cricket_codec) {
-  RtpCodecCapability codec;
-  codec.name = cricket_codec.name;
-  codec.kind = KindOfCodec<C>();
-  codec.clock_rate.emplace(cricket_codec.clockrate);
-  codec.preferred_payload_type.emplace(cricket_codec.id);
-  for (const cricket::FeedbackParam& cricket_feedback :
-       cricket_codec.feedback_params.params()) {
-    rtc::Optional<RtcpFeedback> feedback = ToRtcpFeedback(cricket_feedback);
-    if (feedback) {
-      codec.rtcp_feedback.push_back(feedback.MoveValue());
-    }
-  }
-  ToRtpCodecCapabilityTypeSpecific(cricket_codec, &codec);
-  codec.parameters.insert(cricket_codec.params.begin(),
-                          cricket_codec.params.end());
-  return codec;
-}
-
-template RtpCodecCapability ToRtpCodecCapability<cricket::AudioCodec>(
-    const cricket::AudioCodec& cricket_codec);
-template RtpCodecCapability ToRtpCodecCapability<cricket::VideoCodec>(
-    const cricket::VideoCodec& cricket_codec);
-
-template <typename C>
-static void ToRtpCodecParametersTypeSpecific(const C& cricket_codec,
-                                             RtpCodecParameters* codec);
-template <>
-void ToRtpCodecParametersTypeSpecific<cricket::AudioCodec>(
-    const cricket::AudioCodec& cricket_codec,
-    RtpCodecParameters* codec) {
-  codec->num_channels =
-      rtc::Optional<int>(static_cast<int>(cricket_codec.channels));
-}
-
-template <>
-void ToRtpCodecParametersTypeSpecific<cricket::VideoCodec>(
-    const cricket::VideoCodec& cricket_codec,
-    RtpCodecParameters* codec) {}
-
-template <typename C>
-RtpCodecParameters ToRtpCodecParameters(const C& cricket_codec) {
-  RtpCodecParameters codec_param;
-  codec_param.name = cricket_codec.name;
-  codec_param.kind = KindOfCodec<C>();
-  codec_param.clock_rate.emplace(cricket_codec.clockrate);
-  codec_param.payload_type = cricket_codec.id;
-  for (const cricket::FeedbackParam& cricket_feedback :
-       cricket_codec.feedback_params.params()) {
-    rtc::Optional<RtcpFeedback> feedback = ToRtcpFeedback(cricket_feedback);
-    if (feedback) {
-      codec_param.rtcp_feedback.push_back(feedback.MoveValue());
-    }
-  }
-  ToRtpCodecParametersTypeSpecific(cricket_codec, &codec_param);
-  codec_param.parameters.insert(cricket_codec.params.begin(),
-                                cricket_codec.params.end());
-  return codec_param;
-}
-
-template RtpCodecParameters ToRtpCodecParameters<cricket::AudioCodec>(
-    const cricket::AudioCodec& cricket_codec);
-template RtpCodecParameters ToRtpCodecParameters<cricket::VideoCodec>(
-    const cricket::VideoCodec& cricket_codec);
-
-template <class C>
-RtpCapabilities ToRtpCapabilities(
-    const std::vector<C>& cricket_codecs,
-    const cricket::RtpHeaderExtensions& cricket_extensions) {
-  RtpCapabilities capabilities;
-  bool have_red = false;
-  bool have_ulpfec = false;
-  bool have_flexfec = false;
-  for (const C& cricket_codec : cricket_codecs) {
-    if (cricket_codec.name == cricket::kRedCodecName) {
-      have_red = true;
-    } else if (cricket_codec.name == cricket::kUlpfecCodecName) {
-      have_ulpfec = true;
-    } else if (cricket_codec.name == cricket::kFlexfecCodecName) {
-      have_flexfec = true;
-    }
-    capabilities.codecs.push_back(ToRtpCodecCapability(cricket_codec));
-  }
-  for (const RtpExtension& cricket_extension : cricket_extensions) {
-    capabilities.header_extensions.emplace_back(cricket_extension.uri,
-                                                cricket_extension.id);
-  }
-  if (have_red) {
-    capabilities.fec.push_back(FecMechanism::RED);
-  }
-  if (have_red && have_ulpfec) {
-    capabilities.fec.push_back(FecMechanism::RED_AND_ULPFEC);
-  }
-  if (have_flexfec) {
-    capabilities.fec.push_back(FecMechanism::FLEXFEC);
-  }
-  return capabilities;
-}
-
-template RtpCapabilities ToRtpCapabilities<cricket::AudioCodec>(
-    const std::vector<cricket::AudioCodec>& cricket_codecs,
-    const cricket::RtpHeaderExtensions& cricket_extensions);
-template RtpCapabilities ToRtpCapabilities<cricket::VideoCodec>(
-    const std::vector<cricket::VideoCodec>& cricket_codecs,
-    const cricket::RtpHeaderExtensions& cricket_extensions);
-
-template <class C>
-RtpParameters ToRtpParameters(
-    const std::vector<C>& cricket_codecs,
-    const cricket::RtpHeaderExtensions& cricket_extensions,
-    const cricket::StreamParamsVec& stream_params) {
-  RtpParameters rtp_parameters;
-  for (const C& cricket_codec : cricket_codecs) {
-    rtp_parameters.codecs.push_back(ToRtpCodecParameters(cricket_codec));
-  }
-  for (const RtpExtension& cricket_extension : cricket_extensions) {
-    rtp_parameters.header_extensions.emplace_back(cricket_extension.uri,
-                                                  cricket_extension.id);
-  }
-  rtp_parameters.encodings = ToRtpEncodings(stream_params);
-  return rtp_parameters;
-}
-
-template RtpParameters ToRtpParameters<cricket::AudioCodec>(
-    const std::vector<cricket::AudioCodec>& cricket_codecs,
-    const cricket::RtpHeaderExtensions& cricket_extensions,
-    const cricket::StreamParamsVec& stream_params);
-template RtpParameters ToRtpParameters<cricket::VideoCodec>(
-    const std::vector<cricket::VideoCodec>& cricket_codecs,
-    const cricket::RtpHeaderExtensions& cricket_extensions,
-    const cricket::StreamParamsVec& stream_params);
-
-}  // namespace webrtc
diff --git a/ortc/rtpparametersconversion.h b/ortc/rtpparametersconversion.h
deleted file mode 100644
index 072aaf2..0000000
--- a/ortc/rtpparametersconversion.h
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- *  Copyright 2017 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_ORTC_RTPPARAMETERSCONVERSION_H_
-#define WEBRTC_ORTC_RTPPARAMETERSCONVERSION_H_
-
-#include <memory>
-#include <vector>
-
-#include "webrtc/api/optional.h"
-#include "webrtc/api/rtcerror.h"
-#include "webrtc/api/rtpparameters.h"
-#include "webrtc/media/base/codec.h"
-#include "webrtc/pc/mediasession.h"
-
-namespace webrtc {
-
-// NOTE: Some functions are templated for convenience, such that template-based
-// code dealing with AudioContentDescription and VideoContentDescription can
-// use this easily. Such methods are usable with cricket::AudioCodec and
-// cricket::VideoCodec.
-
-//***************************************************************************
-// Functions for converting from new webrtc:: structures to old cricket::
-// structures.
-//
-// As the return values imply, all of these functions do validation of the
-// parameters and return an error if they're invalid. It's expected that any
-// default values (such as video clock rate of 90000) have been filled by the
-// time the webrtc:: structure is being converted to the cricket:: one.
-//
-// These are expected to be used when parameters are passed into an RtpSender
-// or RtpReceiver, and need to be validated and converted so they can be
-// applied to the media engine level.
-//***************************************************************************
-
-// Returns error on invalid input. Certain message types are only valid for
-// certain feedback types.
-RTCErrorOr<cricket::FeedbackParam> ToCricketFeedbackParam(
-    const RtcpFeedback& feedback);
-
-// Verifies that the codec kind is correct, and it has mandatory parameters
-// filled, with values in valid ranges.
-template <typename C>
-RTCErrorOr<C> ToCricketCodec(const RtpCodecParameters& codec);
-
-// Verifies that payload types aren't duplicated, in addition to normal
-// validation.
-template <typename C>
-RTCErrorOr<std::vector<C>> ToCricketCodecs(
-    const std::vector<RtpCodecParameters>& codecs);
-
-// Validates that header extension IDs aren't duplicated.
-RTCErrorOr<cricket::RtpHeaderExtensions> ToCricketRtpHeaderExtensions(
-    const std::vector<RtpHeaderExtensionParameters>& extensions);
-
-// SSRCs are allowed to be ommitted. This may be used for receive parameters
-// where SSRCs are unsignaled.
-RTCErrorOr<cricket::StreamParamsVec> ToCricketStreamParamsVec(
-    const std::vector<RtpEncodingParameters>& encodings);
-
-//*****************************************************************************
-// Functions for converting from old cricket:: structures to new webrtc::
-// structures. Unlike the above functions, these are permissive with regards to
-// input validation; it's assumed that any necessary validation already
-// occurred.
-//
-// These are expected to be used either to convert from audio/video engine
-// capabilities to RtpCapabilities, or to convert from already-parsed SDP
-// (in the form of cricket:: structures) to webrtc:: structures. The latter
-// functionality is not yet implemented.
-//*****************************************************************************
-
-// Returns empty value if |cricket_feedback| is a feedback type not
-// supported/recognized.
-rtc::Optional<RtcpFeedback> ToRtcpFeedback(
-    const cricket::FeedbackParam& cricket_feedback);
-
-std::vector<RtpEncodingParameters> ToRtpEncodings(
-    const cricket::StreamParamsVec& stream_params);
-
-template <typename C>
-RtpCodecParameters ToRtpCodecParameters(const C& cricket_codec);
-
-template <typename C>
-RtpCodecCapability ToRtpCodecCapability(const C& cricket_codec);
-
-template <class C>
-RtpCapabilities ToRtpCapabilities(
-    const std::vector<C>& cricket_codecs,
-    const cricket::RtpHeaderExtensions& cricket_extensions);
-
-template <class C>
-RtpParameters ToRtpParameters(
-    const std::vector<C>& cricket_codecs,
-    const cricket::RtpHeaderExtensions& cricket_extensions,
-    const cricket::StreamParamsVec& stream_params);
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_ORTC_RTPPARAMETERSCONVERSION_H_
diff --git a/ortc/rtpparametersconversion_unittest.cc b/ortc/rtpparametersconversion_unittest.cc
deleted file mode 100644
index f6e48a9..0000000
--- a/ortc/rtpparametersconversion_unittest.cc
+++ /dev/null
@@ -1,645 +0,0 @@
-/*
- *  Copyright 2017 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 <algorithm>
-
-#include "webrtc/ortc/rtpparametersconversion.h"
-#include "webrtc/ortc/testrtpparameters.h"
-#include "webrtc/rtc_base/gunit.h"
-
-namespace webrtc {
-
-TEST(RtpParametersConversionTest, ToCricketFeedbackParam) {
-  auto result = ToCricketFeedbackParam(
-      {RtcpFeedbackType::CCM, RtcpFeedbackMessageType::FIR});
-  EXPECT_EQ(cricket::FeedbackParam("ccm", "fir"), result.value());
-  result = ToCricketFeedbackParam(
-      {RtcpFeedbackType::NACK, RtcpFeedbackMessageType::GENERIC_NACK});
-  EXPECT_EQ(cricket::FeedbackParam("nack"), result.value());
-  result = ToCricketFeedbackParam(
-      {RtcpFeedbackType::NACK, RtcpFeedbackMessageType::PLI});
-  EXPECT_EQ(cricket::FeedbackParam("nack", "pli"), result.value());
-  result = ToCricketFeedbackParam(RtcpFeedback(RtcpFeedbackType::REMB));
-  EXPECT_EQ(cricket::FeedbackParam("goog-remb"), result.value());
-  result = ToCricketFeedbackParam(RtcpFeedback(RtcpFeedbackType::TRANSPORT_CC));
-  EXPECT_EQ(cricket::FeedbackParam("transport-cc"), result.value());
-}
-
-TEST(RtpParametersConversionTest, ToCricketFeedbackParamErrors) {
-  // CCM with missing or invalid message type.
-  auto result = ToCricketFeedbackParam(RtcpFeedback(RtcpFeedbackType::CCM));
-  EXPECT_EQ(RTCErrorType::INVALID_PARAMETER, result.error().type());
-  result = ToCricketFeedbackParam(
-      {RtcpFeedbackType::CCM, RtcpFeedbackMessageType::PLI});
-  EXPECT_EQ(RTCErrorType::INVALID_PARAMETER, result.error().type());
-  // NACK with missing or invalid message type.
-  result = ToCricketFeedbackParam(RtcpFeedback(RtcpFeedbackType::NACK));
-  EXPECT_EQ(RTCErrorType::INVALID_PARAMETER, result.error().type());
-  result = ToCricketFeedbackParam(
-      {RtcpFeedbackType::NACK, RtcpFeedbackMessageType::FIR});
-  EXPECT_EQ(RTCErrorType::INVALID_PARAMETER, result.error().type());
-  // REMB with message type (should be left empty).
-  result = ToCricketFeedbackParam(
-      {RtcpFeedbackType::REMB, RtcpFeedbackMessageType::GENERIC_NACK});
-  EXPECT_EQ(RTCErrorType::INVALID_PARAMETER, result.error().type());
-  // TRANSPORT_CC with message type (should be left empty).
-  result = ToCricketFeedbackParam(
-      {RtcpFeedbackType::TRANSPORT_CC, RtcpFeedbackMessageType::FIR});
-  EXPECT_EQ(RTCErrorType::INVALID_PARAMETER, result.error().type());
-}
-
-TEST(RtpParametersConversionTest, ToAudioCodec) {
-  RtpCodecParameters codec;
-  codec.name = "AuDiO";
-  codec.kind = cricket::MEDIA_TYPE_AUDIO;
-  codec.payload_type = 120;
-  codec.clock_rate.emplace(36000);
-  codec.num_channels.emplace(6);
-  codec.parameters["foo"] = "bar";
-  codec.rtcp_feedback.emplace_back(RtcpFeedbackType::TRANSPORT_CC);
-  auto result = ToCricketCodec<cricket::AudioCodec>(codec);
-  ASSERT_TRUE(result.ok());
-
-  EXPECT_EQ("AuDiO", result.value().name);
-  EXPECT_EQ(120, result.value().id);
-  EXPECT_EQ(36000, result.value().clockrate);
-  EXPECT_EQ(6u, result.value().channels);
-  ASSERT_EQ(1u, result.value().params.size());
-  EXPECT_EQ("bar", result.value().params["foo"]);
-  EXPECT_EQ(1u, result.value().feedback_params.params().size());
-  EXPECT_TRUE(result.value().feedback_params.Has(
-      cricket::FeedbackParam("transport-cc")));
-}
-
-TEST(RtpParametersConversionTest, ToVideoCodec) {
-  RtpCodecParameters codec;
-  codec.name = "coolcodec";
-  codec.kind = cricket::MEDIA_TYPE_VIDEO;
-  codec.payload_type = 101;
-  codec.clock_rate.emplace(90000);
-  codec.parameters["foo"] = "bar";
-  codec.parameters["PING"] = "PONG";
-  codec.rtcp_feedback.emplace_back(RtcpFeedbackType::TRANSPORT_CC);
-  codec.rtcp_feedback.emplace_back(RtcpFeedbackType::NACK,
-                                   RtcpFeedbackMessageType::PLI);
-  auto result = ToCricketCodec<cricket::VideoCodec>(codec);
-  ASSERT_TRUE(result.ok());
-
-  EXPECT_EQ("coolcodec", result.value().name);
-  EXPECT_EQ(101, result.value().id);
-  EXPECT_EQ(90000, result.value().clockrate);
-  ASSERT_EQ(2u, result.value().params.size());
-  EXPECT_EQ("bar", result.value().params["foo"]);
-  EXPECT_EQ("PONG", result.value().params["PING"]);
-  EXPECT_EQ(2u, result.value().feedback_params.params().size());
-  EXPECT_TRUE(result.value().feedback_params.Has(
-      cricket::FeedbackParam("transport-cc")));
-  EXPECT_TRUE(result.value().feedback_params.Has(
-      cricket::FeedbackParam("nack", "pli")));
-}
-
-// Trying to convert to an AudioCodec if the kind is "video" should fail.
-TEST(RtpParametersConversionTest, ToCricketCodecInvalidKind) {
-  RtpCodecParameters audio_codec;
-  audio_codec.name = "opus";
-  audio_codec.kind = cricket::MEDIA_TYPE_VIDEO;
-  audio_codec.payload_type = 111;
-  audio_codec.clock_rate.emplace(48000);
-  audio_codec.num_channels.emplace(2);
-
-  RtpCodecParameters video_codec;
-  video_codec.name = "VP8";
-  video_codec.kind = cricket::MEDIA_TYPE_AUDIO;
-  video_codec.payload_type = 102;
-  video_codec.clock_rate.emplace(90000);
-
-  auto audio_result = ToCricketCodec<cricket::AudioCodec>(audio_codec);
-  EXPECT_EQ(RTCErrorType::INVALID_PARAMETER, audio_result.error().type());
-
-  auto video_result = ToCricketCodec<cricket::VideoCodec>(video_codec);
-  EXPECT_EQ(RTCErrorType::INVALID_PARAMETER, video_result.error().type());
-
-  // Sanity check that if the kind is correct, the conversion succeeds.
-  audio_codec.kind = cricket::MEDIA_TYPE_AUDIO;
-  video_codec.kind = cricket::MEDIA_TYPE_VIDEO;
-  audio_result = ToCricketCodec<cricket::AudioCodec>(audio_codec);
-  EXPECT_TRUE(audio_result.ok());
-  video_result = ToCricketCodec<cricket::VideoCodec>(video_codec);
-  EXPECT_TRUE(video_result.ok());
-}
-
-TEST(RtpParametersConversionTest, ToAudioCodecInvalidParameters) {
-  // Missing channels.
-  RtpCodecParameters codec;
-  codec.name = "opus";
-  codec.kind = cricket::MEDIA_TYPE_AUDIO;
-  codec.payload_type = 111;
-  codec.clock_rate.emplace(48000);
-  auto result = ToCricketCodec<cricket::AudioCodec>(codec);
-  EXPECT_EQ(RTCErrorType::INVALID_PARAMETER, result.error().type());
-
-  // Negative number of channels.
-  codec.num_channels.emplace(-1);
-  result = ToCricketCodec<cricket::AudioCodec>(codec);
-  EXPECT_EQ(RTCErrorType::INVALID_RANGE, result.error().type());
-
-  // Missing clock rate.
-  codec.num_channels.emplace(2);
-  codec.clock_rate.reset();
-  result = ToCricketCodec<cricket::AudioCodec>(codec);
-  EXPECT_EQ(RTCErrorType::INVALID_PARAMETER, result.error().type());
-
-  // Negative clock rate.
-  codec.clock_rate.emplace(-48000);
-  result = ToCricketCodec<cricket::AudioCodec>(codec);
-  EXPECT_EQ(RTCErrorType::INVALID_RANGE, result.error().type());
-
-  // Sanity check that conversion succeeds if these errors are fixed.
-  codec.clock_rate.emplace(48000);
-  result = ToCricketCodec<cricket::AudioCodec>(codec);
-  EXPECT_TRUE(result.ok());
-}
-
-TEST(RtpParametersConversionTest, ToVideoCodecInvalidParameters) {
-  // Missing clock rate.
-  RtpCodecParameters codec;
-  codec.name = "VP8";
-  codec.kind = cricket::MEDIA_TYPE_VIDEO;
-  codec.payload_type = 102;
-  auto result = ToCricketCodec<cricket::VideoCodec>(codec);
-  EXPECT_EQ(RTCErrorType::INVALID_PARAMETER, result.error().type());
-
-  // Invalid clock rate.
-  codec.clock_rate.emplace(48000);
-  result = ToCricketCodec<cricket::VideoCodec>(codec);
-  EXPECT_EQ(RTCErrorType::INVALID_PARAMETER, result.error().type());
-
-  // Channels set (should be unset).
-  codec.clock_rate.emplace(90000);
-  codec.num_channels.emplace(2);
-  result = ToCricketCodec<cricket::VideoCodec>(codec);
-  EXPECT_EQ(RTCErrorType::INVALID_PARAMETER, result.error().type());
-
-  // Sanity check that conversion succeeds if these errors are fixed.
-  codec.num_channels.reset();
-  result = ToCricketCodec<cricket::VideoCodec>(codec);
-  EXPECT_TRUE(result.ok());
-}
-
-TEST(RtpParametersConversionTest, ToCricketCodecInvalidPayloadType) {
-  RtpCodecParameters codec;
-  codec.name = "VP8";
-  codec.kind = cricket::MEDIA_TYPE_VIDEO;
-  codec.clock_rate.emplace(90000);
-
-  codec.payload_type = -1000;
-  auto result = ToCricketCodec<cricket::VideoCodec>(codec);
-  EXPECT_EQ(RTCErrorType::INVALID_RANGE, result.error().type());
-
-  // Max payload type is 127.
-  codec.payload_type = 128;
-  result = ToCricketCodec<cricket::VideoCodec>(codec);
-  EXPECT_EQ(RTCErrorType::INVALID_RANGE, result.error().type());
-
-  // Sanity check that conversion succeeds with a valid payload type.
-  codec.payload_type = 127;
-  result = ToCricketCodec<cricket::VideoCodec>(codec);
-  EXPECT_TRUE(result.ok());
-}
-
-// There are already tests for ToCricketFeedbackParam, but ensure that those
-// errors are propagated from ToCricketCodec.
-TEST(RtpParametersConversionTest, ToCricketCodecInvalidRtcpFeedback) {
-  RtpCodecParameters codec;
-  codec.name = "VP8";
-  codec.kind = cricket::MEDIA_TYPE_VIDEO;
-  codec.clock_rate.emplace(90000);
-  codec.payload_type = 99;
-  codec.rtcp_feedback.emplace_back(RtcpFeedbackType::CCM,
-                                   RtcpFeedbackMessageType::PLI);
-
-  auto result = ToCricketCodec<cricket::VideoCodec>(codec);
-  EXPECT_EQ(RTCErrorType::INVALID_PARAMETER, result.error().type());
-
-  // Sanity check that conversion succeeds without invalid feedback.
-  codec.rtcp_feedback.clear();
-  result = ToCricketCodec<cricket::VideoCodec>(codec);
-  EXPECT_TRUE(result.ok());
-}
-
-TEST(RtpParametersConversionTest, ToCricketCodecs) {
-  std::vector<RtpCodecParameters> codecs;
-  RtpCodecParameters codec;
-  codec.name = "VP8";
-  codec.kind = cricket::MEDIA_TYPE_VIDEO;
-  codec.clock_rate.emplace(90000);
-  codec.payload_type = 99;
-  codecs.push_back(codec);
-
-  codec.name = "VP9";
-  codec.payload_type = 100;
-  codecs.push_back(codec);
-
-  auto result = ToCricketCodecs<cricket::VideoCodec>(codecs);
-  ASSERT_TRUE(result.ok());
-  ASSERT_EQ(2u, result.value().size());
-  EXPECT_EQ("VP8", result.value()[0].name);
-  EXPECT_EQ(99, result.value()[0].id);
-  EXPECT_EQ("VP9", result.value()[1].name);
-  EXPECT_EQ(100, result.value()[1].id);
-}
-
-TEST(RtpParametersConversionTest, ToCricketCodecsDuplicatePayloadType) {
-  std::vector<RtpCodecParameters> codecs;
-  RtpCodecParameters codec;
-  codec.name = "VP8";
-  codec.kind = cricket::MEDIA_TYPE_VIDEO;
-  codec.clock_rate.emplace(90000);
-  codec.payload_type = 99;
-  codecs.push_back(codec);
-
-  codec.name = "VP9";
-  codec.payload_type = 99;
-  codecs.push_back(codec);
-
-  auto result = ToCricketCodecs<cricket::VideoCodec>(codecs);
-  EXPECT_EQ(RTCErrorType::INVALID_PARAMETER, result.error().type());
-
-  // Sanity check that this succeeds without the duplicate payload type.
-  codecs[1].payload_type = 120;
-  result = ToCricketCodecs<cricket::VideoCodec>(codecs);
-  EXPECT_TRUE(result.ok());
-}
-
-TEST(RtpParametersConversionTest, ToCricketRtpHeaderExtensions) {
-  std::vector<RtpHeaderExtensionParameters> extensions = {
-      {"http://example.com", 1}, {"urn:foo:bar", 14}};
-  auto result = ToCricketRtpHeaderExtensions(extensions);
-  ASSERT_TRUE(result.ok());
-  ASSERT_EQ(2u, result.value().size());
-  EXPECT_EQ("http://example.com", result.value()[0].uri);
-  EXPECT_EQ(1, result.value()[0].id);
-  EXPECT_EQ("urn:foo:bar", result.value()[1].uri);
-  EXPECT_EQ(14, result.value()[1].id);
-}
-
-TEST(RtpParametersConversionTest, ToCricketRtpHeaderExtensionsErrors) {
-  // First, IDs outside the range 1-14.
-  std::vector<RtpHeaderExtensionParameters> extensions = {
-      {"http://example.com", 0}};
-  auto result = ToCricketRtpHeaderExtensions(extensions);
-  EXPECT_EQ(RTCErrorType::INVALID_RANGE, result.error().type());
-
-  extensions[0].id = 15;
-  result = ToCricketRtpHeaderExtensions(extensions);
-  EXPECT_EQ(RTCErrorType::INVALID_RANGE, result.error().type());
-
-  // Duplicate IDs.
-  extensions = {{"http://example.com", 1}, {"urn:foo:bar", 1}};
-  result = ToCricketRtpHeaderExtensions(extensions);
-  EXPECT_EQ(RTCErrorType::INVALID_PARAMETER, result.error().type());
-}
-
-TEST(RtpParametersConversionTest, ToCricketStreamParamsVecSimple) {
-  std::vector<RtpEncodingParameters> encodings;
-  RtpEncodingParameters encoding;
-  encoding.ssrc.emplace(0xbaadf00d);
-  encodings.push_back(encoding);
-  auto result = ToCricketStreamParamsVec(encodings);
-  ASSERT_TRUE(result.ok());
-  ASSERT_EQ(1u, result.value().size());
-  EXPECT_EQ(1u, result.value()[0].ssrcs.size());
-  EXPECT_EQ(0xbaadf00d, result.value()[0].first_ssrc());
-}
-
-TEST(RtpParametersConversionTest, ToCricketStreamParamsVecWithRtx) {
-  std::vector<RtpEncodingParameters> encodings;
-  RtpEncodingParameters encoding;
-  // Test a corner case SSRC of 0.
-  encoding.ssrc.emplace(0u);
-  encoding.rtx.emplace(0xdeadbeef);
-  encodings.push_back(encoding);
-  auto result = ToCricketStreamParamsVec(encodings);
-  ASSERT_TRUE(result.ok());
-  ASSERT_EQ(1u, result.value().size());
-  EXPECT_EQ(2u, result.value()[0].ssrcs.size());
-  EXPECT_EQ(0u, result.value()[0].first_ssrc());
-  uint32_t rtx_ssrc = 0;
-  EXPECT_TRUE(result.value()[0].GetFidSsrc(0u, &rtx_ssrc));
-  EXPECT_EQ(0xdeadbeef, rtx_ssrc);
-}
-
-// No encodings should be accepted; an endpoint may want to prepare a
-// decoder/encoder without having something to receive/send yet.
-TEST(RtpParametersConversionTest, ToCricketStreamParamsVecNoEncodings) {
-  std::vector<RtpEncodingParameters> encodings;
-  auto result = ToCricketStreamParamsVec(encodings);
-  ASSERT_TRUE(result.ok());
-  EXPECT_EQ(0u, result.value().size());
-}
-
-// An encoding without SSRCs should be accepted. This could be the case when
-// SSRCs aren't signaled and payload-type based demuxing is used.
-TEST(RtpParametersConversionTest, ToCricketStreamParamsVecMissingSsrcs) {
-  std::vector<RtpEncodingParameters> encodings = {{}};
-  // Creates RtxParameters with empty SSRC.
-  encodings[0].rtx.emplace();
-  auto result = ToCricketStreamParamsVec(encodings);
-  ASSERT_TRUE(result.ok());
-  EXPECT_EQ(0u, result.value().size());
-}
-
-// The media engine doesn't have a way of receiving an RTX SSRC that's known
-// with a primary SSRC that's unknown, so this should produce an error.
-TEST(RtpParametersConversionTest, ToStreamParamsWithPrimarySsrcSetAndRtxUnset) {
-  std::vector<RtpEncodingParameters> encodings = {{}};
-  encodings[0].rtx.emplace(0xdeadbeef);
-  EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
-            ToCricketStreamParamsVec(encodings).error().type());
-}
-
-// TODO(deadbeef): Update this test when we support multiple encodings.
-TEST(RtpParametersConversionTest, ToCricketStreamParamsVecMultipleEncodings) {
-  std::vector<RtpEncodingParameters> encodings = {{}, {}};
-  auto result = ToCricketStreamParamsVec(encodings);
-  EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER, result.error().type());
-}
-
-TEST(RtpParametersConversionTest, ToRtcpFeedback) {
-  rtc::Optional<RtcpFeedback> result = ToRtcpFeedback({"ccm", "fir"});
-  EXPECT_EQ(RtcpFeedback(RtcpFeedbackType::CCM, RtcpFeedbackMessageType::FIR),
-            *result);
-  result = ToRtcpFeedback(cricket::FeedbackParam("nack"));
-  EXPECT_EQ(RtcpFeedback(RtcpFeedbackType::NACK,
-                         RtcpFeedbackMessageType::GENERIC_NACK),
-            *result);
-  result = ToRtcpFeedback({"nack", "pli"});
-  EXPECT_EQ(RtcpFeedback(RtcpFeedbackType::NACK, RtcpFeedbackMessageType::PLI),
-            *result);
-  result = ToRtcpFeedback(cricket::FeedbackParam("goog-remb"));
-  EXPECT_EQ(RtcpFeedback(RtcpFeedbackType::REMB), *result);
-  result = ToRtcpFeedback(cricket::FeedbackParam("transport-cc"));
-  EXPECT_EQ(RtcpFeedback(RtcpFeedbackType::TRANSPORT_CC), *result);
-}
-
-TEST(RtpParametersConversionTest, ToRtcpFeedbackErrors) {
-  // CCM with missing or invalid message type.
-  rtc::Optional<RtcpFeedback> result = ToRtcpFeedback({"ccm", "pli"});
-  EXPECT_FALSE(result);
-  result = ToRtcpFeedback(cricket::FeedbackParam("ccm"));
-  EXPECT_FALSE(result);
-  // NACK with missing or invalid message type.
-  result = ToRtcpFeedback({"nack", "fir"});
-  EXPECT_FALSE(result);
-  // REMB with message type (should be left empty).
-  result = ToRtcpFeedback({"goog-remb", "pli"});
-  EXPECT_FALSE(result);
-  // TRANSPORT_CC with message type (should be left empty).
-  result = ToRtcpFeedback({"transport-cc", "fir"});
-  EXPECT_FALSE(result);
-  // Unknown message type.
-  result = ToRtcpFeedback(cricket::FeedbackParam("foo"));
-  EXPECT_FALSE(result);
-}
-
-TEST(RtpParametersConversionTest, ToAudioRtpCodecCapability) {
-  cricket::AudioCodec cricket_codec;
-  cricket_codec.name = "foo";
-  cricket_codec.id = 50;
-  cricket_codec.clockrate = 22222;
-  cricket_codec.channels = 4;
-  cricket_codec.params["foo"] = "bar";
-  cricket_codec.feedback_params.Add(cricket::FeedbackParam("transport-cc"));
-  RtpCodecCapability codec = ToRtpCodecCapability(cricket_codec);
-
-  EXPECT_EQ("foo", codec.name);
-  EXPECT_EQ(cricket::MEDIA_TYPE_AUDIO, codec.kind);
-  EXPECT_EQ(rtc::Optional<int>(50), codec.preferred_payload_type);
-  EXPECT_EQ(rtc::Optional<int>(22222), codec.clock_rate);
-  EXPECT_EQ(rtc::Optional<int>(4), codec.num_channels);
-  ASSERT_EQ(1u, codec.parameters.size());
-  EXPECT_EQ("bar", codec.parameters["foo"]);
-  EXPECT_EQ(1u, codec.rtcp_feedback.size());
-  EXPECT_EQ(RtcpFeedback(RtcpFeedbackType::TRANSPORT_CC),
-            codec.rtcp_feedback[0]);
-}
-
-TEST(RtpParametersConversionTest, ToVideoRtpCodecCapability) {
-  cricket::VideoCodec cricket_codec;
-  cricket_codec.name = "VID";
-  cricket_codec.id = 101;
-  cricket_codec.clockrate = 80000;
-  cricket_codec.params["foo"] = "bar";
-  cricket_codec.params["ANOTHER"] = "param";
-  cricket_codec.feedback_params.Add(cricket::FeedbackParam("transport-cc"));
-  cricket_codec.feedback_params.Add({"nack", "pli"});
-  RtpCodecCapability codec = ToRtpCodecCapability(cricket_codec);
-
-  EXPECT_EQ("VID", codec.name);
-  EXPECT_EQ(cricket::MEDIA_TYPE_VIDEO, codec.kind);
-  EXPECT_EQ(rtc::Optional<int>(101), codec.preferred_payload_type);
-  EXPECT_EQ(rtc::Optional<int>(80000), codec.clock_rate);
-  ASSERT_EQ(2u, codec.parameters.size());
-  EXPECT_EQ("bar", codec.parameters["foo"]);
-  EXPECT_EQ("param", codec.parameters["ANOTHER"]);
-  EXPECT_EQ(2u, codec.rtcp_feedback.size());
-  EXPECT_EQ(RtcpFeedback(RtcpFeedbackType::TRANSPORT_CC),
-            codec.rtcp_feedback[0]);
-  EXPECT_EQ(RtcpFeedback(RtcpFeedbackType::NACK, RtcpFeedbackMessageType::PLI),
-            codec.rtcp_feedback[1]);
-}
-
-TEST(RtpParametersConversionTest, ToRtpEncodingsWithEmptyStreamParamsVec) {
-  cricket::StreamParamsVec streams;
-  auto rtp_encodings = ToRtpEncodings(streams);
-  ASSERT_EQ(0u, rtp_encodings.size());
-}
-
-TEST(RtpParametersConversionTest, ToRtpEncodingsWithMultipleStreamParams) {
-  cricket::StreamParamsVec streams;
-  cricket::StreamParams stream1;
-  stream1.ssrcs.push_back(1111u);
-  stream1.AddFidSsrc(1111u, 0xaaaaaaaa);
-
-  cricket::StreamParams stream2;
-  stream2.ssrcs.push_back(2222u);
-  stream2.AddFidSsrc(2222u, 0xaaaaaaab);
-
-  streams.push_back(stream1);
-  streams.push_back(stream2);
-
-  auto rtp_encodings = ToRtpEncodings(streams);
-  ASSERT_EQ(2u, rtp_encodings.size());
-  EXPECT_EQ(1111u, rtp_encodings[0].ssrc);
-  EXPECT_EQ(0xaaaaaaaa, rtp_encodings[0].rtx->ssrc);
-  EXPECT_EQ(2222u, rtp_encodings[1].ssrc);
-  EXPECT_EQ(0xaaaaaaab, rtp_encodings[1].rtx->ssrc);
-}
-
-TEST(RtpParametersConversionTest, ToAudioRtpCodecParameters) {
-  cricket::AudioCodec cricket_codec;
-  cricket_codec.name = "foo";
-  cricket_codec.id = 50;
-  cricket_codec.clockrate = 22222;
-  cricket_codec.channels = 4;
-  cricket_codec.params["foo"] = "bar";
-  cricket_codec.feedback_params.Add(cricket::FeedbackParam("transport-cc"));
-  RtpCodecParameters codec = ToRtpCodecParameters(cricket_codec);
-
-  EXPECT_EQ("foo", codec.name);
-  EXPECT_EQ(cricket::MEDIA_TYPE_AUDIO, codec.kind);
-  EXPECT_EQ(50, codec.payload_type);
-  EXPECT_EQ(rtc::Optional<int>(22222), codec.clock_rate);
-  EXPECT_EQ(rtc::Optional<int>(4), codec.num_channels);
-  ASSERT_EQ(1u, codec.parameters.size());
-  EXPECT_EQ("bar", codec.parameters["foo"]);
-  EXPECT_EQ(1u, codec.rtcp_feedback.size());
-  EXPECT_EQ(RtcpFeedback(RtcpFeedbackType::TRANSPORT_CC),
-            codec.rtcp_feedback[0]);
-}
-
-TEST(RtpParametersConversionTest, ToVideoRtpCodecParameters) {
-  cricket::VideoCodec cricket_codec;
-  cricket_codec.name = "VID";
-  cricket_codec.id = 101;
-  cricket_codec.clockrate = 80000;
-  cricket_codec.params["foo"] = "bar";
-  cricket_codec.params["ANOTHER"] = "param";
-  cricket_codec.feedback_params.Add(cricket::FeedbackParam("transport-cc"));
-  cricket_codec.feedback_params.Add({"nack", "pli"});
-  RtpCodecParameters codec = ToRtpCodecParameters(cricket_codec);
-
-  EXPECT_EQ("VID", codec.name);
-  EXPECT_EQ(cricket::MEDIA_TYPE_VIDEO, codec.kind);
-  EXPECT_EQ(101, codec.payload_type);
-  EXPECT_EQ(rtc::Optional<int>(80000), codec.clock_rate);
-  ASSERT_EQ(2u, codec.parameters.size());
-  EXPECT_EQ("bar", codec.parameters["foo"]);
-  EXPECT_EQ("param", codec.parameters["ANOTHER"]);
-  EXPECT_EQ(2u, codec.rtcp_feedback.size());
-  EXPECT_EQ(RtcpFeedback(RtcpFeedbackType::TRANSPORT_CC),
-            codec.rtcp_feedback[0]);
-  EXPECT_EQ(RtcpFeedback(RtcpFeedbackType::NACK, RtcpFeedbackMessageType::PLI),
-            codec.rtcp_feedback[1]);
-}
-
-// An unknown feedback param should just be ignored.
-TEST(RtpParametersConversionTest, ToRtpCodecCapabilityUnknownFeedbackParam) {
-  cricket::AudioCodec cricket_codec;
-  cricket_codec.name = "foo";
-  cricket_codec.id = 50;
-  cricket_codec.clockrate = 22222;
-  cricket_codec.channels = 4;
-  cricket_codec.params["foo"] = "bar";
-  cricket_codec.feedback_params.Add({"unknown", "param"});
-  cricket_codec.feedback_params.Add(cricket::FeedbackParam("transport-cc"));
-  RtpCodecCapability codec = ToRtpCodecCapability(cricket_codec);
-
-  ASSERT_EQ(1u, codec.rtcp_feedback.size());
-  EXPECT_EQ(RtcpFeedback(RtcpFeedbackType::TRANSPORT_CC),
-            codec.rtcp_feedback[0]);
-}
-
-// Most of ToRtpCapabilities is tested by ToRtpCodecCapability, but we need to
-// test that the result of ToRtpCodecCapability ends up in the result, and that
-// the "fec" list is assembled correctly.
-TEST(RtpParametersConversionTest, ToRtpCapabilities) {
-  cricket::VideoCodec vp8;
-  vp8.name = "VP8";
-  vp8.id = 101;
-  vp8.clockrate = 90000;
-
-  cricket::VideoCodec red;
-  red.name = "red";
-  red.id = 102;
-  red.clockrate = 90000;
-
-  cricket::VideoCodec ulpfec;
-  ulpfec.name = "ulpfec";
-  ulpfec.id = 103;
-  ulpfec.clockrate = 90000;
-
-  cricket::VideoCodec flexfec;
-  flexfec.name = "flexfec-03";
-  flexfec.id = 102;
-  flexfec.clockrate = 90000;
-
-  RtpCapabilities capabilities = ToRtpCapabilities<cricket::VideoCodec>(
-      {vp8, ulpfec}, {{"uri", 1}, {"uri2", 3}});
-  ASSERT_EQ(2u, capabilities.codecs.size());
-  EXPECT_EQ("VP8", capabilities.codecs[0].name);
-  EXPECT_EQ("ulpfec", capabilities.codecs[1].name);
-  ASSERT_EQ(2u, capabilities.header_extensions.size());
-  EXPECT_EQ("uri", capabilities.header_extensions[0].uri);
-  EXPECT_EQ(1, capabilities.header_extensions[0].preferred_id);
-  EXPECT_EQ("uri2", capabilities.header_extensions[1].uri);
-  EXPECT_EQ(3, capabilities.header_extensions[1].preferred_id);
-  EXPECT_EQ(0u, capabilities.fec.size());
-
-  capabilities = ToRtpCapabilities<cricket::VideoCodec>(
-      {vp8, red, ulpfec}, cricket::RtpHeaderExtensions());
-  EXPECT_EQ(3u, capabilities.codecs.size());
-  EXPECT_EQ(2u, capabilities.fec.size());
-  EXPECT_NE(capabilities.fec.end(),
-            std::find(capabilities.fec.begin(), capabilities.fec.end(),
-                      FecMechanism::RED));
-  EXPECT_NE(capabilities.fec.end(),
-            std::find(capabilities.fec.begin(), capabilities.fec.end(),
-                      FecMechanism::RED_AND_ULPFEC));
-
-  capabilities = ToRtpCapabilities<cricket::VideoCodec>(
-      {vp8, red, flexfec}, cricket::RtpHeaderExtensions());
-  EXPECT_EQ(3u, capabilities.codecs.size());
-  EXPECT_EQ(2u, capabilities.fec.size());
-  EXPECT_NE(capabilities.fec.end(),
-            std::find(capabilities.fec.begin(), capabilities.fec.end(),
-                      FecMechanism::RED));
-  EXPECT_NE(capabilities.fec.end(),
-            std::find(capabilities.fec.begin(), capabilities.fec.end(),
-                      FecMechanism::FLEXFEC));
-}
-
-TEST(RtpParametersConversionTest, ToRtpParameters) {
-  cricket::VideoCodec vp8;
-  vp8.name = "VP8";
-  vp8.id = 101;
-  vp8.clockrate = 90000;
-
-  cricket::VideoCodec red;
-  red.name = "red";
-  red.id = 102;
-  red.clockrate = 90000;
-
-  cricket::VideoCodec ulpfec;
-  ulpfec.name = "ulpfec";
-  ulpfec.id = 103;
-  ulpfec.clockrate = 90000;
-
-  cricket::StreamParamsVec streams;
-  cricket::StreamParams stream;
-  stream.ssrcs.push_back(1234u);
-  streams.push_back(stream);
-
-  RtpParameters rtp_parameters = ToRtpParameters<cricket::VideoCodec>(
-      {vp8, red, ulpfec}, {{"uri", 1}, {"uri2", 3}}, streams);
-  ASSERT_EQ(3u, rtp_parameters.codecs.size());
-  EXPECT_EQ("VP8", rtp_parameters.codecs[0].name);
-  EXPECT_EQ("red", rtp_parameters.codecs[1].name);
-  EXPECT_EQ("ulpfec", rtp_parameters.codecs[2].name);
-  ASSERT_EQ(2u, rtp_parameters.header_extensions.size());
-  EXPECT_EQ("uri", rtp_parameters.header_extensions[0].uri);
-  EXPECT_EQ(1, rtp_parameters.header_extensions[0].id);
-  EXPECT_EQ("uri2", rtp_parameters.header_extensions[1].uri);
-  EXPECT_EQ(3, rtp_parameters.header_extensions[1].id);
-  ASSERT_EQ(1u, rtp_parameters.encodings.size());
-  EXPECT_EQ(1234u, rtp_parameters.encodings[0].ssrc);
-}
-
-}  // namespace webrtc
diff --git a/ortc/rtptransport_unittest.cc b/ortc/rtptransport_unittest.cc
deleted file mode 100644
index 95ee1c7..0000000
--- a/ortc/rtptransport_unittest.cc
+++ /dev/null
@@ -1,283 +0,0 @@
-/*
- *  Copyright 2017 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 <memory>
-
-#include "webrtc/media/base/fakemediaengine.h"
-#include "webrtc/ortc/ortcfactory.h"
-#include "webrtc/ortc/testrtpparameters.h"
-#include "webrtc/p2p/base/fakepackettransport.h"
-#include "webrtc/rtc_base/gunit.h"
-
-namespace webrtc {
-
-// This test uses fake packet transports and a fake media engine, in order to
-// test the RtpTransport at only an API level. Any end-to-end test should go in
-// ortcfactory_integrationtest.cc instead.
-class RtpTransportTest : public testing::Test {
- public:
-  RtpTransportTest() {
-    fake_media_engine_ = new cricket::FakeMediaEngine();
-    // Note: This doesn't need to use fake network classes, since it uses
-    // FakePacketTransports.
-    auto result = OrtcFactory::Create(
-        nullptr, nullptr, nullptr, nullptr, nullptr,
-        std::unique_ptr<cricket::MediaEngineInterface>(fake_media_engine_));
-    ortc_factory_ = result.MoveValue();
-  }
-
- protected:
-  // Owned by |ortc_factory_|.
-  cricket::FakeMediaEngine* fake_media_engine_;
-  std::unique_ptr<OrtcFactoryInterface> ortc_factory_;
-};
-
-// Test GetRtpPacketTransport and GetRtcpPacketTransport, with and without RTCP
-// muxing.
-TEST_F(RtpTransportTest, GetPacketTransports) {
-  rtc::FakePacketTransport rtp("rtp");
-  rtc::FakePacketTransport rtcp("rtcp");
-  // With muxed RTCP.
-  RtpTransportParameters parameters;
-  parameters.rtcp.mux = true;
-  auto result =
-      ortc_factory_->CreateRtpTransport(parameters, &rtp, nullptr, nullptr);
-  ASSERT_TRUE(result.ok());
-  EXPECT_EQ(&rtp, result.value()->GetRtpPacketTransport());
-  EXPECT_EQ(nullptr, result.value()->GetRtcpPacketTransport());
-  result.MoveValue().reset();
-  // With non-muxed RTCP.
-  parameters.rtcp.mux = false;
-  result = ortc_factory_->CreateRtpTransport(parameters, &rtp, &rtcp, nullptr);
-  ASSERT_TRUE(result.ok());
-  EXPECT_EQ(&rtp, result.value()->GetRtpPacketTransport());
-  EXPECT_EQ(&rtcp, result.value()->GetRtcpPacketTransport());
-}
-
-// If an RtpTransport starts out un-muxed and then starts muxing, the RTCP
-// packet transport should be forgotten and GetRtcpPacketTransport should
-// return null.
-TEST_F(RtpTransportTest, EnablingRtcpMuxingUnsetsRtcpTransport) {
-  rtc::FakePacketTransport rtp("rtp");
-  rtc::FakePacketTransport rtcp("rtcp");
-
-  // Create non-muxed.
-  RtpTransportParameters parameters;
-  parameters.rtcp.mux = false;
-  auto result =
-      ortc_factory_->CreateRtpTransport(parameters, &rtp, &rtcp, nullptr);
-  ASSERT_TRUE(result.ok());
-  auto rtp_transport = result.MoveValue();
-
-  // Enable muxing.
-  parameters.rtcp.mux = true;
-  EXPECT_TRUE(rtp_transport->SetParameters(parameters).ok());
-  EXPECT_EQ(nullptr, rtp_transport->GetRtcpPacketTransport());
-}
-
-TEST_F(RtpTransportTest, GetAndSetRtcpParameters) {
-  rtc::FakePacketTransport rtp("rtp");
-  rtc::FakePacketTransport rtcp("rtcp");
-  // Start with non-muxed RTCP.
-  RtpTransportParameters parameters;
-  parameters.rtcp.mux = false;
-  parameters.rtcp.cname = "teST";
-  parameters.rtcp.reduced_size = false;
-  auto result =
-      ortc_factory_->CreateRtpTransport(parameters, &rtp, &rtcp, nullptr);
-  ASSERT_TRUE(result.ok());
-  auto transport = result.MoveValue();
-  EXPECT_EQ(parameters, transport->GetParameters());
-
-  // Changing the CNAME is currently unsupported.
-  parameters.rtcp.cname = "different";
-  EXPECT_EQ(RTCErrorType::UNSUPPORTED_OPERATION,
-            transport->SetParameters(parameters).type());
-  parameters.rtcp.cname = "teST";
-
-  // Enable RTCP muxing and reduced-size RTCP.
-  parameters.rtcp.mux = true;
-  parameters.rtcp.reduced_size = true;
-  EXPECT_TRUE(transport->SetParameters(parameters).ok());
-  EXPECT_EQ(parameters, transport->GetParameters());
-
-  // Empty CNAME should result in the existing CNAME being used.
-  parameters.rtcp.cname.clear();
-  EXPECT_TRUE(transport->SetParameters(parameters).ok());
-  EXPECT_EQ("teST", transport->GetParameters().rtcp.cname);
-
-  // Disabling RTCP muxing after enabling shouldn't be allowed, since enabling
-  // muxing should have made the RTP transport forget about the RTCP packet
-  // transport initially passed into it.
-  parameters.rtcp.mux = false;
-  EXPECT_EQ(RTCErrorType::INVALID_STATE,
-            transport->SetParameters(parameters).type());
-}
-
-// When Send or Receive is called on a sender or receiver, the RTCP parameters
-// from the RtpTransport underneath the sender should be applied to the created
-// media stream. The only relevant parameters (currently) are |cname| and
-// |reduced_size|.
-TEST_F(RtpTransportTest, SendAndReceiveApplyRtcpParametersToMediaEngine) {
-  // First, create video transport with reduced-size RTCP.
-  rtc::FakePacketTransport fake_packet_transport1("1");
-  RtpTransportParameters parameters;
-  parameters.rtcp.mux = true;
-  parameters.rtcp.reduced_size = true;
-  parameters.rtcp.cname = "foo";
-  auto rtp_transport_result = ortc_factory_->CreateRtpTransport(
-      parameters, &fake_packet_transport1, nullptr, nullptr);
-  auto video_transport = rtp_transport_result.MoveValue();
-
-  // Create video sender and call Send, expecting parameters to be applied.
-  auto sender_result = ortc_factory_->CreateRtpSender(cricket::MEDIA_TYPE_VIDEO,
-                                                      video_transport.get());
-  auto video_sender = sender_result.MoveValue();
-  EXPECT_TRUE(video_sender->Send(MakeMinimalVp8Parameters()).ok());
-  cricket::FakeVideoMediaChannel* fake_video_channel =
-      fake_media_engine_->GetVideoChannel(0);
-  ASSERT_NE(nullptr, fake_video_channel);
-  EXPECT_TRUE(fake_video_channel->send_rtcp_parameters().reduced_size);
-  ASSERT_EQ(1u, fake_video_channel->send_streams().size());
-  const cricket::StreamParams& video_send_stream =
-      fake_video_channel->send_streams()[0];
-  EXPECT_EQ("foo", video_send_stream.cname);
-
-  // Create video receiver and call Receive, expecting parameters to be applied
-  // (minus |cname|, since that's the sent cname, not received).
-  auto receiver_result = ortc_factory_->CreateRtpReceiver(
-      cricket::MEDIA_TYPE_VIDEO, video_transport.get());
-  auto video_receiver = receiver_result.MoveValue();
-  EXPECT_TRUE(
-      video_receiver->Receive(MakeMinimalVp8ParametersWithSsrc(0xdeadbeef))
-          .ok());
-  EXPECT_TRUE(fake_video_channel->recv_rtcp_parameters().reduced_size);
-
-  // Create audio transport with non-reduced size RTCP.
-  rtc::FakePacketTransport fake_packet_transport2("2");
-  parameters.rtcp.reduced_size = false;
-  parameters.rtcp.cname = "bar";
-  rtp_transport_result = ortc_factory_->CreateRtpTransport(
-      parameters, &fake_packet_transport2, nullptr, nullptr);
-  auto audio_transport = rtp_transport_result.MoveValue();
-
-  // Create audio sender and call Send, expecting parameters to be applied.
-  sender_result = ortc_factory_->CreateRtpSender(cricket::MEDIA_TYPE_AUDIO,
-                                                 audio_transport.get());
-  auto audio_sender = sender_result.MoveValue();
-  EXPECT_TRUE(audio_sender->Send(MakeMinimalIsacParameters()).ok());
-
-  cricket::FakeVoiceMediaChannel* fake_voice_channel =
-      fake_media_engine_->GetVoiceChannel(0);
-  ASSERT_NE(nullptr, fake_voice_channel);
-  EXPECT_FALSE(fake_voice_channel->send_rtcp_parameters().reduced_size);
-  ASSERT_EQ(1u, fake_voice_channel->send_streams().size());
-  const cricket::StreamParams& audio_send_stream =
-      fake_voice_channel->send_streams()[0];
-  EXPECT_EQ("bar", audio_send_stream.cname);
-
-  // Create audio receiver and call Receive, expecting parameters to be applied
-  // (minus |cname|, since that's the sent cname, not received).
-  receiver_result = ortc_factory_->CreateRtpReceiver(cricket::MEDIA_TYPE_AUDIO,
-                                                     audio_transport.get());
-  auto audio_receiver = receiver_result.MoveValue();
-  EXPECT_TRUE(
-      audio_receiver->Receive(MakeMinimalOpusParametersWithSsrc(0xbaadf00d))
-          .ok());
-  EXPECT_FALSE(fake_voice_channel->recv_rtcp_parameters().reduced_size);
-}
-
-// When SetParameters is called, the modified parameters should be applied
-// to the media engine.
-// TODO(deadbeef): Once the implementation supports changing the CNAME,
-// test that here.
-TEST_F(RtpTransportTest, SetRtcpParametersAppliesParametersToMediaEngine) {
-  rtc::FakePacketTransport fake_packet_transport("fake");
-  RtpTransportParameters parameters;
-  parameters.rtcp.mux = true;
-  parameters.rtcp.reduced_size = false;
-  auto rtp_transport_result = ortc_factory_->CreateRtpTransport(
-      parameters, &fake_packet_transport, nullptr, nullptr);
-  auto rtp_transport = rtp_transport_result.MoveValue();
-
-  // Create video sender and call Send, applying an initial set of parameters.
-  auto sender_result = ortc_factory_->CreateRtpSender(cricket::MEDIA_TYPE_VIDEO,
-                                                      rtp_transport.get());
-  auto sender = sender_result.MoveValue();
-  EXPECT_TRUE(sender->Send(MakeMinimalVp8Parameters()).ok());
-
-  // Modify parameters and expect them to be changed at the media engine level.
-  parameters.rtcp.reduced_size = true;
-  EXPECT_TRUE(rtp_transport->SetParameters(parameters).ok());
-
-  cricket::FakeVideoMediaChannel* fake_video_channel =
-      fake_media_engine_->GetVideoChannel(0);
-  ASSERT_NE(nullptr, fake_video_channel);
-  EXPECT_TRUE(fake_video_channel->send_rtcp_parameters().reduced_size);
-}
-
-// SetParameters should set keepalive for all RTP transports.
-// It is impossible to modify keepalive parameters if any streams are created.
-// Note: This is an implementation detail for current way of configuring the
-// keep-alive. It may change in the future.
-TEST_F(RtpTransportTest, CantChangeKeepAliveAfterCreatedSendStreams) {
-  rtc::FakePacketTransport fake_packet_transport("fake");
-  RtpTransportParameters parameters;
-  parameters.keepalive.timeout_interval_ms = 100;
-  auto rtp_transport_result = ortc_factory_->CreateRtpTransport(
-      parameters, &fake_packet_transport, nullptr, nullptr);
-  ASSERT_TRUE(rtp_transport_result.ok());
-  std::unique_ptr<RtpTransportInterface> rtp_transport =
-      rtp_transport_result.MoveValue();
-
-  // Updating keepalive parameters is ok, since no rtp sender created.
-  parameters.keepalive.timeout_interval_ms = 200;
-  EXPECT_TRUE(rtp_transport->SetParameters(parameters).ok());
-
-  // Create video sender. Note: |sender_result| scope must extend past the
-  // SetParameters() call below.
-  auto sender_result = ortc_factory_->CreateRtpSender(cricket::MEDIA_TYPE_VIDEO,
-                                                      rtp_transport.get());
-  EXPECT_TRUE(sender_result.ok());
-
-  // Modify parameters second time after video send stream created.
-  parameters.keepalive.timeout_interval_ms = 10;
-  EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION,
-            rtp_transport->SetParameters(parameters).type());
-}
-
-// Note: This is an implementation detail for current way of configuring the
-// keep-alive. It may change in the future.
-TEST_F(RtpTransportTest, KeepAliveMustBeSameAcrossTransportController) {
-  rtc::FakePacketTransport fake_packet_transport("fake");
-  RtpTransportParameters parameters;
-  parameters.keepalive.timeout_interval_ms = 100;
-
-  // Manually create a controller, that can be shared by multiple transports.
-  auto controller_result = ortc_factory_->CreateRtpTransportController();
-  ASSERT_TRUE(controller_result.ok());
-  std::unique_ptr<RtpTransportControllerInterface> controller =
-      controller_result.MoveValue();
-
-  // Create a first transport.
-  auto first_transport_result = ortc_factory_->CreateRtpTransport(
-      parameters, &fake_packet_transport, nullptr, controller.get());
-  ASSERT_TRUE(first_transport_result.ok());
-
-  // Update the parameters, and create another transport for the same
-  // controller.
-  parameters.keepalive.timeout_interval_ms = 10;
-  auto seconds_transport_result = ortc_factory_->CreateRtpTransport(
-      parameters, &fake_packet_transport, nullptr, controller.get());
-  EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION,
-            seconds_transport_result.error().type());
-}
-
-}  // namespace webrtc
diff --git a/ortc/rtptransportadapter.cc b/ortc/rtptransportadapter.cc
deleted file mode 100644
index 10e5e8f..0000000
--- a/ortc/rtptransportadapter.cc
+++ /dev/null
@@ -1,227 +0,0 @@
-/*
- *  Copyright 2017 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/ortc/rtptransportadapter.h"
-
-#include <algorithm>  // For std::find.
-#include <set>
-#include <sstream>
-#include <utility>  // For std::move.
-
-#include "webrtc/api/proxy.h"
-#include "webrtc/rtc_base/logging.h"
-
-namespace webrtc {
-
-BEGIN_OWNED_PROXY_MAP(RtpTransport)
-PROXY_SIGNALING_THREAD_DESTRUCTOR()
-PROXY_CONSTMETHOD0(PacketTransportInterface*, GetRtpPacketTransport)
-PROXY_CONSTMETHOD0(PacketTransportInterface*, GetRtcpPacketTransport)
-PROXY_METHOD1(RTCError, SetParameters, const RtpTransportParameters&)
-PROXY_CONSTMETHOD0(RtpTransportParameters, GetParameters)
-protected:
-RtpTransportAdapter* GetInternal() override {
-  return internal();
-}
-END_PROXY_MAP()
-
-BEGIN_OWNED_PROXY_MAP(SrtpTransport)
-PROXY_SIGNALING_THREAD_DESTRUCTOR()
-PROXY_CONSTMETHOD0(PacketTransportInterface*, GetRtpPacketTransport)
-PROXY_CONSTMETHOD0(PacketTransportInterface*, GetRtcpPacketTransport)
-PROXY_METHOD1(RTCError, SetParameters, const RtpTransportParameters&)
-PROXY_CONSTMETHOD0(RtpTransportParameters, GetParameters)
-PROXY_METHOD1(RTCError, SetSrtpSendKey, const cricket::CryptoParams&)
-PROXY_METHOD1(RTCError, SetSrtpReceiveKey, const cricket::CryptoParams&)
-protected:
-RtpTransportAdapter* GetInternal() override {
-  return internal();
-}
-END_PROXY_MAP()
-
-// static
-RTCErrorOr<std::unique_ptr<RtpTransportInterface>>
-RtpTransportAdapter::CreateProxied(
-    const RtpTransportParameters& parameters,
-    PacketTransportInterface* rtp,
-    PacketTransportInterface* rtcp,
-    RtpTransportControllerAdapter* rtp_transport_controller) {
-  if (!rtp) {
-    LOG_AND_RETURN_ERROR(RTCErrorType::INVALID_PARAMETER,
-                         "Must provide an RTP packet transport.");
-  }
-  if (!parameters.rtcp.mux && !rtcp) {
-    LOG_AND_RETURN_ERROR(
-        RTCErrorType::INVALID_PARAMETER,
-        "Must provide an RTCP packet transport when RTCP muxing is not used.");
-  }
-  if (parameters.rtcp.mux && rtcp) {
-    LOG_AND_RETURN_ERROR(RTCErrorType::INVALID_PARAMETER,
-                         "Creating an RtpTransport with RTCP muxing enabled, "
-                         "with a separate RTCP packet transport?");
-  }
-  if (!rtp_transport_controller) {
-    // Since OrtcFactory::CreateRtpTransport creates an RtpTransportController
-    // automatically when one isn't passed in, this should never be reached.
-    RTC_NOTREACHED();
-    LOG_AND_RETURN_ERROR(RTCErrorType::INVALID_PARAMETER,
-                         "Must provide an RTP transport controller.");
-  }
-  std::unique_ptr<RtpTransportAdapter> transport_adapter(
-      new RtpTransportAdapter(parameters.rtcp, rtp, rtcp,
-                              rtp_transport_controller,
-                              false /*is_srtp_transport*/));
-  RTCError params_result = transport_adapter->SetParameters(parameters);
-  if (!params_result.ok()) {
-    return std::move(params_result);
-  }
-
-  return RtpTransportProxyWithInternal<RtpTransportAdapter>::Create(
-      rtp_transport_controller->signaling_thread(),
-      rtp_transport_controller->worker_thread(), std::move(transport_adapter));
-}
-
-RTCErrorOr<std::unique_ptr<SrtpTransportInterface>>
-RtpTransportAdapter::CreateSrtpProxied(
-    const RtpTransportParameters& parameters,
-    PacketTransportInterface* rtp,
-    PacketTransportInterface* rtcp,
-    RtpTransportControllerAdapter* rtp_transport_controller) {
-  if (!rtp) {
-    LOG_AND_RETURN_ERROR(RTCErrorType::INVALID_PARAMETER,
-                         "Must provide an RTP packet transport.");
-  }
-  if (!parameters.rtcp.mux && !rtcp) {
-    LOG_AND_RETURN_ERROR(
-        RTCErrorType::INVALID_PARAMETER,
-        "Must provide an RTCP packet transport when RTCP muxing is not used.");
-  }
-  if (parameters.rtcp.mux && rtcp) {
-    LOG_AND_RETURN_ERROR(RTCErrorType::INVALID_PARAMETER,
-                         "Creating an RtpTransport with RTCP muxing enabled, "
-                         "with a separate RTCP packet transport?");
-  }
-  if (!rtp_transport_controller) {
-    // Since OrtcFactory::CreateRtpTransport creates an RtpTransportController
-    // automatically when one isn't passed in, this should never be reached.
-    RTC_NOTREACHED();
-    LOG_AND_RETURN_ERROR(RTCErrorType::INVALID_PARAMETER,
-                         "Must provide an RTP transport controller.");
-  }
-  std::unique_ptr<RtpTransportAdapter> transport_adapter(
-      new RtpTransportAdapter(parameters.rtcp, rtp, rtcp,
-                              rtp_transport_controller,
-                              true /*is_srtp_transport*/));
-  RTCError params_result = transport_adapter->SetParameters(parameters);
-  if (!params_result.ok()) {
-    return std::move(params_result);
-  }
-
-  return SrtpTransportProxyWithInternal<RtpTransportAdapter>::Create(
-      rtp_transport_controller->signaling_thread(),
-      rtp_transport_controller->worker_thread(), std::move(transport_adapter));
-}
-
-void RtpTransportAdapter::TakeOwnershipOfRtpTransportController(
-    std::unique_ptr<RtpTransportControllerInterface> controller) {
-  RTC_DCHECK_EQ(rtp_transport_controller_, controller->GetInternal());
-  RTC_DCHECK(owned_rtp_transport_controller_.get() == nullptr);
-  owned_rtp_transport_controller_ = std::move(controller);
-}
-
-RtpTransportAdapter::RtpTransportAdapter(
-    const RtcpParameters& rtcp_params,
-    PacketTransportInterface* rtp,
-    PacketTransportInterface* rtcp,
-    RtpTransportControllerAdapter* rtp_transport_controller,
-    bool is_srtp_transport)
-    : rtp_packet_transport_(rtp),
-      rtcp_packet_transport_(rtcp),
-      rtp_transport_controller_(rtp_transport_controller),
-      is_srtp_transport_(is_srtp_transport) {
-  parameters_.rtcp = rtcp_params;
-  // CNAME should have been filled by OrtcFactory if empty.
-  RTC_DCHECK(!parameters_.rtcp.cname.empty());
-  RTC_DCHECK(rtp_transport_controller);
-}
-
-RtpTransportAdapter::~RtpTransportAdapter() {
-  SignalDestroyed(this);
-}
-
-PacketTransportInterface* RtpTransportAdapter::GetRtpPacketTransport() const {
-  return rtp_packet_transport_;
-}
-
-PacketTransportInterface* RtpTransportAdapter::GetRtcpPacketTransport() const {
-  return rtcp_packet_transport_;
-}
-
-RTCError RtpTransportAdapter::SetParameters(
-    const RtpTransportParameters& parameters) {
-  if (!parameters.rtcp.mux && parameters_.rtcp.mux) {
-    LOG_AND_RETURN_ERROR(webrtc::RTCErrorType::INVALID_STATE,
-                         "Can't disable RTCP muxing after enabling.");
-  }
-  if (!parameters.rtcp.cname.empty() &&
-      parameters.rtcp.cname != parameters_.rtcp.cname) {
-    LOG_AND_RETURN_ERROR(webrtc::RTCErrorType::UNSUPPORTED_OPERATION,
-                         "Changing the RTCP CNAME is currently unsupported.");
-  }
-  // If the CNAME is empty, use the existing one.
-  RtpTransportParameters copy = parameters;
-  if (copy.rtcp.cname.empty()) {
-    copy.rtcp.cname = parameters_.rtcp.cname;
-  }
-  RTCError err =
-      rtp_transport_controller_->SetRtpTransportParameters(copy, this);
-  if (!err.ok()) {
-    return err;
-  }
-  parameters_ = copy;
-  if (parameters_.rtcp.mux) {
-    rtcp_packet_transport_ = nullptr;
-  }
-  return RTCError::OK();
-}
-
-RTCError RtpTransportAdapter::SetSrtpSendKey(
-    const cricket::CryptoParams& params) {
-  if (send_key_) {
-    LOG_AND_RETURN_ERROR(
-        webrtc::RTCErrorType::UNSUPPORTED_OPERATION,
-        "Setting the SRTP send key twice is currently unsupported.");
-  }
-  if (receive_key_ && receive_key_->cipher_suite != params.cipher_suite) {
-    LOG_AND_RETURN_ERROR(
-        webrtc::RTCErrorType::UNSUPPORTED_OPERATION,
-        "The send key and receive key must have the same cipher suite.");
-  }
-  send_key_ = rtc::Optional<cricket::CryptoParams>(params);
-  return RTCError::OK();
-}
-
-RTCError RtpTransportAdapter::SetSrtpReceiveKey(
-    const cricket::CryptoParams& params) {
-  if (receive_key_) {
-    LOG_AND_RETURN_ERROR(
-        webrtc::RTCErrorType::UNSUPPORTED_OPERATION,
-        "Setting the SRTP receive key twice is currently unsupported.");
-  }
-  if (send_key_ && send_key_->cipher_suite != params.cipher_suite) {
-    LOG_AND_RETURN_ERROR(
-        webrtc::RTCErrorType::UNSUPPORTED_OPERATION,
-        "The send key and receive key must have the same cipher suite.");
-  }
-  receive_key_ = rtc::Optional<cricket::CryptoParams>(params);
-  return RTCError::OK();
-}
-
-}  // namespace webrtc
diff --git a/ortc/rtptransportadapter.h b/ortc/rtptransportadapter.h
deleted file mode 100644
index c71a4f4..0000000
--- a/ortc/rtptransportadapter.h
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- *  Copyright 2017 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_ORTC_RTPTRANSPORTADAPTER_H_
-#define WEBRTC_ORTC_RTPTRANSPORTADAPTER_H_
-
-#include <memory>
-#include <vector>
-
-#include "webrtc/api/ortc/srtptransportinterface.h"
-#include "webrtc/api/rtcerror.h"
-#include "webrtc/media/base/streamparams.h"
-#include "webrtc/ortc/rtptransportcontrolleradapter.h"
-#include "webrtc/pc/channel.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/sigslot.h"
-
-namespace webrtc {
-
-// Implementation of SrtpTransportInterface to be used with RtpSenderAdapter,
-// RtpReceiverAdapter, and RtpTransportControllerAdapter classes. This class
-// is used to implement both a secure and insecure RTP transport.
-//
-// TODO(deadbeef): When BaseChannel is split apart into separate
-// "RtpTransport"/"RtpTransceiver"/"RtpSender"/"RtpReceiver" objects, this
-// adapter object can be removed.
-class RtpTransportAdapter : public SrtpTransportInterface {
- public:
-  // |rtp| can't be null. |rtcp| can if RTCP muxing is used immediately (meaning
-  // |rtcp_parameters.mux| is also true).
-  static RTCErrorOr<std::unique_ptr<RtpTransportInterface>> CreateProxied(
-      const RtpTransportParameters& rtcp_parameters,
-      PacketTransportInterface* rtp,
-      PacketTransportInterface* rtcp,
-      RtpTransportControllerAdapter* rtp_transport_controller);
-
-  static RTCErrorOr<std::unique_ptr<SrtpTransportInterface>> CreateSrtpProxied(
-      const RtpTransportParameters& rtcp_parameters,
-      PacketTransportInterface* rtp,
-      PacketTransportInterface* rtcp,
-      RtpTransportControllerAdapter* rtp_transport_controller);
-
-  ~RtpTransportAdapter() override;
-
-  // RtpTransportInterface implementation.
-  PacketTransportInterface* GetRtpPacketTransport() const override;
-  PacketTransportInterface* GetRtcpPacketTransport() const override;
-  RTCError SetParameters(const RtpTransportParameters& parameters) override;
-  RtpTransportParameters GetParameters() const override { return parameters_; }
-
-  // SRTP specific implementation.
-  RTCError SetSrtpSendKey(const cricket::CryptoParams& params) override;
-  RTCError SetSrtpReceiveKey(const cricket::CryptoParams& params) override;
-
-  // Methods used internally by OrtcFactory.
-  RtpTransportControllerAdapter* rtp_transport_controller() {
-    return rtp_transport_controller_;
-  }
-  void TakeOwnershipOfRtpTransportController(
-      std::unique_ptr<RtpTransportControllerInterface> controller);
-
-  // Used by RtpTransportControllerAdapter to tell when it should stop
-  // returning this transport from GetTransports().
-  sigslot::signal1<RtpTransportAdapter*> SignalDestroyed;
-
-  // Used by the RtpTransportControllerAdapter to tell if an rtp sender or
-  // receiver can be created.
-  bool is_srtp_transport() { return is_srtp_transport_; }
-  // Used by the RtpTransportControllerAdapter to set keys for senders and
-  // receivers.
-  rtc::Optional<cricket::CryptoParams> send_key() { return send_key_; }
-  rtc::Optional<cricket::CryptoParams> receive_key() { return receive_key_; }
-
- protected:
-  RtpTransportAdapter* GetInternal() override { return this; }
-
- private:
-  RtpTransportAdapter(const RtcpParameters& rtcp_params,
-                      PacketTransportInterface* rtp,
-                      PacketTransportInterface* rtcp,
-                      RtpTransportControllerAdapter* rtp_transport_controller,
-                      bool is_srtp_transport);
-
-  PacketTransportInterface* rtp_packet_transport_;
-  PacketTransportInterface* rtcp_packet_transport_;
-  RtpTransportControllerAdapter* const rtp_transport_controller_;
-  // Non-null if this class owns the transport controller.
-  std::unique_ptr<RtpTransportControllerInterface>
-      owned_rtp_transport_controller_;
-  RtpTransportParameters parameters_;
-
-  // SRTP specific members.
-  rtc::Optional<cricket::CryptoParams> send_key_;
-  rtc::Optional<cricket::CryptoParams> receive_key_;
-  bool is_srtp_transport_;
-
-  RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(RtpTransportAdapter);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_ORTC_RTPTRANSPORTADAPTER_H_
diff --git a/ortc/rtptransportcontroller_unittest.cc b/ortc/rtptransportcontroller_unittest.cc
deleted file mode 100644
index 56bf8a6..0000000
--- a/ortc/rtptransportcontroller_unittest.cc
+++ /dev/null
@@ -1,195 +0,0 @@
-/*
- *  Copyright 2017 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 <memory>
-
-#include "webrtc/media/base/fakemediaengine.h"
-#include "webrtc/ortc/ortcfactory.h"
-#include "webrtc/ortc/testrtpparameters.h"
-#include "webrtc/p2p/base/fakepackettransport.h"
-#include "webrtc/rtc_base/gunit.h"
-
-namespace webrtc {
-
-// This test uses fake packet transports and a fake media engine, in order to
-// test the RtpTransportController at only an API level. Any end-to-end test
-// should go in ortcfactory_integrationtest.cc instead.
-//
-// Currently, this test mainly focuses on the limitations of the "adapter"
-// RtpTransportController implementation. Only one of each type of
-// sender/receiver can be created, and the sender/receiver of the same media
-// type must use the same transport.
-class RtpTransportControllerTest : public testing::Test {
- public:
-  RtpTransportControllerTest() {
-    // Note: This doesn't need to use fake network classes, since it uses
-    // FakePacketTransports.
-    auto result =
-        OrtcFactory::Create(nullptr, nullptr, nullptr, nullptr, nullptr,
-                            std::unique_ptr<cricket::MediaEngineInterface>(
-                                new cricket::FakeMediaEngine()));
-    ortc_factory_ = result.MoveValue();
-    rtp_transport_controller_ =
-        ortc_factory_->CreateRtpTransportController().MoveValue();
-  }
-
- protected:
-  std::unique_ptr<OrtcFactoryInterface> ortc_factory_;
-  std::unique_ptr<RtpTransportControllerInterface> rtp_transport_controller_;
-};
-
-TEST_F(RtpTransportControllerTest, GetTransports) {
-  rtc::FakePacketTransport packet_transport1("one");
-  rtc::FakePacketTransport packet_transport2("two");
-
-  auto rtp_transport_result1 = ortc_factory_->CreateRtpTransport(
-      MakeRtcpMuxParameters(), &packet_transport1, nullptr,
-      rtp_transport_controller_.get());
-  ASSERT_TRUE(rtp_transport_result1.ok());
-
-  auto rtp_transport_result2 = ortc_factory_->CreateRtpTransport(
-      MakeRtcpMuxParameters(), &packet_transport2, nullptr,
-      rtp_transport_controller_.get());
-  ASSERT_TRUE(rtp_transport_result2.ok());
-
-  auto returned_transports = rtp_transport_controller_->GetTransports();
-  ASSERT_EQ(2u, returned_transports.size());
-  EXPECT_EQ(rtp_transport_result1.value().get(), returned_transports[0]);
-  EXPECT_EQ(rtp_transport_result2.value().get(), returned_transports[1]);
-
-  // If a transport is deleted, it shouldn't be returned any more.
-  rtp_transport_result1.MoveValue().reset();
-  returned_transports = rtp_transport_controller_->GetTransports();
-  ASSERT_EQ(1u, returned_transports.size());
-  EXPECT_EQ(rtp_transport_result2.value().get(), returned_transports[0]);
-}
-
-// Create RtpSenders and RtpReceivers on top of RtpTransports controlled by the
-// same RtpTransportController. Currently only one each of audio/video is
-// supported.
-TEST_F(RtpTransportControllerTest, AttachMultipleSendersAndReceivers) {
-  rtc::FakePacketTransport audio_packet_transport("audio");
-  rtc::FakePacketTransport video_packet_transport("video");
-
-  auto audio_rtp_transport_result = ortc_factory_->CreateRtpTransport(
-      MakeRtcpMuxParameters(), &audio_packet_transport, nullptr,
-      rtp_transport_controller_.get());
-  ASSERT_TRUE(audio_rtp_transport_result.ok());
-  auto audio_rtp_transport = audio_rtp_transport_result.MoveValue();
-
-  auto video_rtp_transport_result = ortc_factory_->CreateRtpTransport(
-      MakeRtcpMuxParameters(), &video_packet_transport, nullptr,
-      rtp_transport_controller_.get());
-  ASSERT_TRUE(video_rtp_transport_result.ok());
-  auto video_rtp_transport = video_rtp_transport_result.MoveValue();
-
-  auto audio_sender_result = ortc_factory_->CreateRtpSender(
-      cricket::MEDIA_TYPE_AUDIO, audio_rtp_transport.get());
-  EXPECT_TRUE(audio_sender_result.ok());
-  auto audio_receiver_result = ortc_factory_->CreateRtpReceiver(
-      cricket::MEDIA_TYPE_AUDIO, audio_rtp_transport.get());
-  EXPECT_TRUE(audio_receiver_result.ok());
-  auto video_sender_result = ortc_factory_->CreateRtpSender(
-      cricket::MEDIA_TYPE_VIDEO, video_rtp_transport.get());
-  EXPECT_TRUE(video_sender_result.ok());
-  auto video_receiver_result = ortc_factory_->CreateRtpReceiver(
-      cricket::MEDIA_TYPE_VIDEO, video_rtp_transport.get());
-  EXPECT_TRUE(video_receiver_result.ok());
-
-  // Now that we have one each of audio/video senders/receivers, trying to
-  // create more on top of the same controller is expected to fail.
-  // TODO(deadbeef): Update this test once multiple senders/receivers on top of
-  // the same controller is supported.
-  auto failed_sender_result = ortc_factory_->CreateRtpSender(
-      cricket::MEDIA_TYPE_AUDIO, audio_rtp_transport.get());
-  EXPECT_EQ(RTCErrorType::UNSUPPORTED_OPERATION,
-            failed_sender_result.error().type());
-  auto failed_receiver_result = ortc_factory_->CreateRtpReceiver(
-      cricket::MEDIA_TYPE_AUDIO, audio_rtp_transport.get());
-  EXPECT_EQ(RTCErrorType::UNSUPPORTED_OPERATION,
-            failed_receiver_result.error().type());
-  failed_sender_result = ortc_factory_->CreateRtpSender(
-      cricket::MEDIA_TYPE_VIDEO, video_rtp_transport.get());
-  EXPECT_EQ(RTCErrorType::UNSUPPORTED_OPERATION,
-            failed_sender_result.error().type());
-  failed_receiver_result = ortc_factory_->CreateRtpReceiver(
-      cricket::MEDIA_TYPE_VIDEO, video_rtp_transport.get());
-  EXPECT_EQ(RTCErrorType::UNSUPPORTED_OPERATION,
-            failed_receiver_result.error().type());
-
-  // If we destroy the existing sender/receiver using a transport controller,
-  // we should be able to make a new one, despite the above limitation.
-  audio_sender_result.MoveValue().reset();
-  audio_sender_result = ortc_factory_->CreateRtpSender(
-      cricket::MEDIA_TYPE_AUDIO, audio_rtp_transport.get());
-  EXPECT_TRUE(audio_sender_result.ok());
-  audio_receiver_result.MoveValue().reset();
-  audio_receiver_result = ortc_factory_->CreateRtpReceiver(
-      cricket::MEDIA_TYPE_AUDIO, audio_rtp_transport.get());
-  EXPECT_TRUE(audio_receiver_result.ok());
-  video_sender_result.MoveValue().reset();
-  video_sender_result = ortc_factory_->CreateRtpSender(
-      cricket::MEDIA_TYPE_VIDEO, video_rtp_transport.get());
-  EXPECT_TRUE(video_sender_result.ok());
-  video_receiver_result.MoveValue().reset();
-  video_receiver_result = ortc_factory_->CreateRtpReceiver(
-      cricket::MEDIA_TYPE_VIDEO, video_rtp_transport.get());
-  EXPECT_TRUE(video_receiver_result.ok());
-}
-
-// Given the current limitations of the BaseChannel-based implementation, it's
-// not possible for an audio sender and receiver to use different RtpTransports.
-// TODO(deadbeef): Once this is supported, update/replace this test.
-TEST_F(RtpTransportControllerTest,
-       SenderAndReceiverUsingDifferentTransportsUnsupported) {
-  rtc::FakePacketTransport packet_transport1("one");
-  rtc::FakePacketTransport packet_transport2("two");
-
-  auto rtp_transport_result1 = ortc_factory_->CreateRtpTransport(
-      MakeRtcpMuxParameters(), &packet_transport1, nullptr,
-      rtp_transport_controller_.get());
-  ASSERT_TRUE(rtp_transport_result1.ok());
-  auto rtp_transport1 = rtp_transport_result1.MoveValue();
-
-  auto rtp_transport_result2 = ortc_factory_->CreateRtpTransport(
-      MakeRtcpMuxParameters(), &packet_transport2, nullptr,
-      rtp_transport_controller_.get());
-  ASSERT_TRUE(rtp_transport_result2.ok());
-  auto rtp_transport2 = rtp_transport_result2.MoveValue();
-
-  // Create an audio sender on transport 1, then try to create a receiver on 2.
-  auto audio_sender_result = ortc_factory_->CreateRtpSender(
-      cricket::MEDIA_TYPE_AUDIO, rtp_transport1.get());
-  EXPECT_TRUE(audio_sender_result.ok());
-  auto audio_receiver_result = ortc_factory_->CreateRtpReceiver(
-      cricket::MEDIA_TYPE_AUDIO, rtp_transport2.get());
-  EXPECT_EQ(RTCErrorType::UNSUPPORTED_OPERATION,
-            audio_receiver_result.error().type());
-  // Delete the sender; now we should be ok to create the receiver on 2.
-  audio_sender_result.MoveValue().reset();
-  audio_receiver_result = ortc_factory_->CreateRtpReceiver(
-      cricket::MEDIA_TYPE_AUDIO, rtp_transport2.get());
-  EXPECT_TRUE(audio_receiver_result.ok());
-
-  // Do the same thing for video, reversing 1 and 2 (for variety).
-  auto video_sender_result = ortc_factory_->CreateRtpSender(
-      cricket::MEDIA_TYPE_VIDEO, rtp_transport2.get());
-  EXPECT_TRUE(video_sender_result.ok());
-  auto video_receiver_result = ortc_factory_->CreateRtpReceiver(
-      cricket::MEDIA_TYPE_VIDEO, rtp_transport1.get());
-  EXPECT_EQ(RTCErrorType::UNSUPPORTED_OPERATION,
-            video_receiver_result.error().type());
-  video_sender_result.MoveValue().reset();
-  video_receiver_result = ortc_factory_->CreateRtpReceiver(
-      cricket::MEDIA_TYPE_VIDEO, rtp_transport1.get());
-  EXPECT_TRUE(video_receiver_result.ok());
-}
-
-}  // namespace webrtc
diff --git a/ortc/rtptransportcontrolleradapter.cc b/ortc/rtptransportcontrolleradapter.cc
deleted file mode 100644
index f2ad995..0000000
--- a/ortc/rtptransportcontrolleradapter.cc
+++ /dev/null
@@ -1,1014 +0,0 @@
-/*
- *  Copyright 2017 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/ortc/rtptransportcontrolleradapter.h"
-
-#include <algorithm>  // For "remove", "find".
-#include <set>
-#include <sstream>
-#include <unordered_map>
-#include <utility>  // For std::move.
-
-#include "webrtc/api/proxy.h"
-#include "webrtc/media/base/mediaconstants.h"
-#include "webrtc/ortc/ortcrtpreceiveradapter.h"
-#include "webrtc/ortc/ortcrtpsenderadapter.h"
-#include "webrtc/ortc/rtpparametersconversion.h"
-#include "webrtc/ortc/rtptransportadapter.h"
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-
-// Note: It's assumed that each individual list doesn't have conflicts, since
-// they should have been detected already by rtpparametersconversion.cc. This
-// only needs to detect conflicts *between* A and B.
-template <typename C1, typename C2>
-static RTCError CheckForIdConflicts(
-    const std::vector<C1>& codecs_a,
-    const cricket::RtpHeaderExtensions& extensions_a,
-    const cricket::StreamParamsVec& streams_a,
-    const std::vector<C2>& codecs_b,
-    const cricket::RtpHeaderExtensions& extensions_b,
-    const cricket::StreamParamsVec& streams_b) {
-  std::ostringstream oss;
-  // Since it's assumed that C1 and C2 are different types, codecs_a and
-  // codecs_b should never contain the same payload type, and thus we can just
-  // use a set.
-  std::set<int> seen_payload_types;
-  for (const C1& codec : codecs_a) {
-    seen_payload_types.insert(codec.id);
-  }
-  for (const C2& codec : codecs_b) {
-    if (!seen_payload_types.insert(codec.id).second) {
-      oss << "Same payload type used for audio and video codecs: " << codec.id;
-      LOG_AND_RETURN_ERROR(RTCErrorType::INVALID_PARAMETER, oss.str());
-    }
-  }
-  // Audio and video *may* use the same header extensions, so use a map.
-  std::unordered_map<int, std::string> seen_extensions;
-  for (const webrtc::RtpExtension& extension : extensions_a) {
-    seen_extensions[extension.id] = extension.uri;
-  }
-  for (const webrtc::RtpExtension& extension : extensions_b) {
-    if (seen_extensions.find(extension.id) != seen_extensions.end() &&
-        seen_extensions.at(extension.id) != extension.uri) {
-      oss << "Same ID used for different RTP header extensions: "
-          << extension.id;
-      LOG_AND_RETURN_ERROR(RTCErrorType::INVALID_PARAMETER, oss.str());
-    }
-  }
-  std::set<uint32_t> seen_ssrcs;
-  for (const cricket::StreamParams& stream : streams_a) {
-    seen_ssrcs.insert(stream.ssrcs.begin(), stream.ssrcs.end());
-  }
-  for (const cricket::StreamParams& stream : streams_b) {
-    for (uint32_t ssrc : stream.ssrcs) {
-      if (!seen_ssrcs.insert(ssrc).second) {
-        oss << "Same SSRC used for audio and video senders: " << ssrc;
-        LOG_AND_RETURN_ERROR(RTCErrorType::INVALID_PARAMETER, oss.str());
-      }
-    }
-  }
-  return RTCError::OK();
-}
-
-BEGIN_OWNED_PROXY_MAP(RtpTransportController)
-PROXY_SIGNALING_THREAD_DESTRUCTOR()
-PROXY_CONSTMETHOD0(std::vector<RtpTransportInterface*>, GetTransports)
-protected:
-RtpTransportControllerAdapter* GetInternal() override {
-  return internal();
-}
-END_PROXY_MAP()
-
-// static
-std::unique_ptr<RtpTransportControllerInterface>
-RtpTransportControllerAdapter::CreateProxied(
-    const cricket::MediaConfig& config,
-    cricket::ChannelManager* channel_manager,
-    webrtc::RtcEventLog* event_log,
-    rtc::Thread* signaling_thread,
-    rtc::Thread* worker_thread) {
-  std::unique_ptr<RtpTransportControllerAdapter> wrapped(
-      new RtpTransportControllerAdapter(config, channel_manager, event_log,
-                                        signaling_thread, worker_thread));
-  return RtpTransportControllerProxyWithInternal<
-      RtpTransportControllerAdapter>::Create(signaling_thread, worker_thread,
-                                             std::move(wrapped));
-}
-
-RtpTransportControllerAdapter::~RtpTransportControllerAdapter() {
-  RTC_DCHECK_RUN_ON(signaling_thread_);
-  if (!transport_proxies_.empty()) {
-    LOG(LS_ERROR)
-        << "Destroying RtpTransportControllerAdapter while RtpTransports "
-           "are still using it; this is unsafe.";
-  }
-  if (voice_channel_) {
-    // This would mean audio RTP senders/receivers that are using us haven't
-    // been destroyed. This isn't safe (see error log above).
-    DestroyVoiceChannel();
-  }
-  if (voice_channel_) {
-    // This would mean video RTP senders/receivers that are using us haven't
-    // been destroyed. This isn't safe (see error log above).
-    DestroyVideoChannel();
-  }
-  // Call must be destroyed on the worker thread.
-  worker_thread_->Invoke<void>(
-      RTC_FROM_HERE,
-      rtc::Bind(&RtpTransportControllerAdapter::Close_w, this));
-}
-
-RTCErrorOr<std::unique_ptr<RtpTransportInterface>>
-RtpTransportControllerAdapter::CreateProxiedRtpTransport(
-    const RtpTransportParameters& parameters,
-    PacketTransportInterface* rtp,
-    PacketTransportInterface* rtcp) {
-  if (!transport_proxies_.empty() && (parameters.keepalive != keepalive_)) {
-    LOG_AND_RETURN_ERROR(RTCErrorType::INVALID_MODIFICATION,
-                         "Cannot create RtpTransport with different keep-alive "
-                         "from the RtpTransports already associated with this "
-                         "transport controller.");
-  }
-  auto result = RtpTransportAdapter::CreateProxied(parameters, rtp, rtcp, this);
-  if (result.ok()) {
-    transport_proxies_.push_back(result.value().get());
-    transport_proxies_.back()->GetInternal()->SignalDestroyed.connect(
-        this, &RtpTransportControllerAdapter::OnRtpTransportDestroyed);
-  }
-  return result;
-}
-
-RTCErrorOr<std::unique_ptr<SrtpTransportInterface>>
-RtpTransportControllerAdapter::CreateProxiedSrtpTransport(
-    const RtpTransportParameters& parameters,
-    PacketTransportInterface* rtp,
-    PacketTransportInterface* rtcp) {
-  auto result =
-      RtpTransportAdapter::CreateSrtpProxied(parameters, rtp, rtcp, this);
-  if (result.ok()) {
-    transport_proxies_.push_back(result.value().get());
-    transport_proxies_.back()->GetInternal()->SignalDestroyed.connect(
-        this, &RtpTransportControllerAdapter::OnRtpTransportDestroyed);
-  }
-  return result;
-}
-
-RTCErrorOr<std::unique_ptr<OrtcRtpSenderInterface>>
-RtpTransportControllerAdapter::CreateProxiedRtpSender(
-    cricket::MediaType kind,
-    RtpTransportInterface* transport_proxy) {
-  RTC_DCHECK(transport_proxy);
-  RTC_DCHECK(std::find(transport_proxies_.begin(), transport_proxies_.end(),
-                       transport_proxy) != transport_proxies_.end());
-  std::unique_ptr<OrtcRtpSenderAdapter> new_sender(
-      new OrtcRtpSenderAdapter(kind, transport_proxy, this));
-  RTCError err;
-  switch (kind) {
-    case cricket::MEDIA_TYPE_AUDIO:
-      err = AttachAudioSender(new_sender.get(), transport_proxy->GetInternal());
-      break;
-    case cricket::MEDIA_TYPE_VIDEO:
-      err = AttachVideoSender(new_sender.get(), transport_proxy->GetInternal());
-      break;
-    case cricket::MEDIA_TYPE_DATA:
-      RTC_NOTREACHED();
-  }
-  if (!err.ok()) {
-    return std::move(err);
-  }
-
-  return OrtcRtpSenderAdapter::CreateProxy(std::move(new_sender));
-}
-
-RTCErrorOr<std::unique_ptr<OrtcRtpReceiverInterface>>
-RtpTransportControllerAdapter::CreateProxiedRtpReceiver(
-    cricket::MediaType kind,
-    RtpTransportInterface* transport_proxy) {
-  RTC_DCHECK(transport_proxy);
-  RTC_DCHECK(std::find(transport_proxies_.begin(), transport_proxies_.end(),
-                       transport_proxy) != transport_proxies_.end());
-  std::unique_ptr<OrtcRtpReceiverAdapter> new_receiver(
-      new OrtcRtpReceiverAdapter(kind, transport_proxy, this));
-  RTCError err;
-  switch (kind) {
-    case cricket::MEDIA_TYPE_AUDIO:
-      err = AttachAudioReceiver(new_receiver.get(),
-                                transport_proxy->GetInternal());
-      break;
-    case cricket::MEDIA_TYPE_VIDEO:
-      err = AttachVideoReceiver(new_receiver.get(),
-                                transport_proxy->GetInternal());
-      break;
-    case cricket::MEDIA_TYPE_DATA:
-      RTC_NOTREACHED();
-  }
-  if (!err.ok()) {
-    return std::move(err);
-  }
-
-  return OrtcRtpReceiverAdapter::CreateProxy(std::move(new_receiver));
-}
-
-std::vector<RtpTransportInterface*>
-RtpTransportControllerAdapter::GetTransports() const {
-  RTC_DCHECK_RUN_ON(signaling_thread_);
-  return transport_proxies_;
-}
-
-RTCError RtpTransportControllerAdapter::SetRtpTransportParameters(
-    const RtpTransportParameters& parameters,
-    RtpTransportInterface* inner_transport) {
-  if ((video_channel_ != nullptr || voice_channel_ != nullptr) &&
-      (parameters.keepalive != keepalive_)) {
-    LOG_AND_RETURN_ERROR(RTCErrorType::INVALID_MODIFICATION,
-                         "Cannot change keep-alive settings after creating "
-                         "media streams or additional transports for the same "
-                         "transport controller.");
-  }
-  // Call must be configured on the worker thread.
-  worker_thread_->Invoke<void>(
-      RTC_FROM_HERE,
-      rtc::Bind(&RtpTransportControllerAdapter::SetRtpTransportParameters_w,
-                this, parameters));
-
-  do {
-    if (inner_transport == inner_audio_transport_) {
-      CopyRtcpParametersToDescriptions(parameters.rtcp,
-                                       &local_audio_description_,
-                                       &remote_audio_description_);
-      if (!voice_channel_->SetLocalContent(&local_audio_description_,
-                                           cricket::CA_OFFER, nullptr)) {
-        break;
-      }
-      if (!voice_channel_->SetRemoteContent(&remote_audio_description_,
-                                            cricket::CA_ANSWER, nullptr)) {
-        break;
-      }
-    } else if (inner_transport == inner_video_transport_) {
-      CopyRtcpParametersToDescriptions(parameters.rtcp,
-                                       &local_video_description_,
-                                       &remote_video_description_);
-      if (!video_channel_->SetLocalContent(&local_video_description_,
-                                           cricket::CA_OFFER, nullptr)) {
-        break;
-      }
-      if (!video_channel_->SetRemoteContent(&remote_video_description_,
-                                            cricket::CA_ANSWER, nullptr)) {
-        break;
-      }
-    }
-    return RTCError::OK();
-  } while (false);
-  LOG_AND_RETURN_ERROR(RTCErrorType::INTERNAL_ERROR,
-                       "Failed to apply new RTCP parameters.");
-}
-
-void RtpTransportControllerAdapter::SetRtpTransportParameters_w(
-    const RtpTransportParameters& parameters) {
-  call_send_rtp_transport_controller_->SetKeepAliveConfig(parameters.keepalive);
-}
-
-RTCError RtpTransportControllerAdapter::ValidateAndApplyAudioSenderParameters(
-    const RtpParameters& parameters,
-    uint32_t* primary_ssrc) {
-  RTC_DCHECK(voice_channel_);
-  RTC_DCHECK(have_audio_sender_);
-
-  auto codecs_result = ToCricketCodecs<cricket::AudioCodec>(parameters.codecs);
-  if (!codecs_result.ok()) {
-    return codecs_result.MoveError();
-  }
-
-  auto extensions_result =
-      ToCricketRtpHeaderExtensions(parameters.header_extensions);
-  if (!extensions_result.ok()) {
-    return extensions_result.MoveError();
-  }
-
-  auto stream_params_result = MakeSendStreamParamsVec(
-      parameters.encodings, inner_audio_transport_->GetParameters().rtcp.cname,
-      local_audio_description_);
-  if (!stream_params_result.ok()) {
-    return stream_params_result.MoveError();
-  }
-
-  // Check that audio/video sender aren't using the same IDs to refer to
-  // different things, if they share the same transport.
-  if (inner_audio_transport_ == inner_video_transport_) {
-    RTCError err = CheckForIdConflicts(
-        codecs_result.value(), extensions_result.value(),
-        stream_params_result.value(), remote_video_description_.codecs(),
-        remote_video_description_.rtp_header_extensions(),
-        local_video_description_.streams());
-    if (!err.ok()) {
-      return err;
-    }
-  }
-
-  cricket::RtpTransceiverDirection local_direction =
-      cricket::RtpTransceiverDirection::FromMediaContentDirection(
-          local_audio_description_.direction());
-  int bandwidth = cricket::kAutoBandwidth;
-  if (parameters.encodings.size() == 1u) {
-    if (parameters.encodings[0].max_bitrate_bps) {
-      bandwidth = *parameters.encodings[0].max_bitrate_bps;
-    }
-    local_direction.send = parameters.encodings[0].active;
-  } else {
-    local_direction.send = false;
-  }
-  if (primary_ssrc && !stream_params_result.value().empty()) {
-    *primary_ssrc = stream_params_result.value()[0].first_ssrc();
-  }
-
-  // Validation is done, so we can attempt applying the descriptions. Sent
-  // codecs and header extensions go in remote description, streams go in
-  // local.
-  //
-  // If there are no codecs or encodings, just leave the previous set of
-  // codecs. The media engine doesn't like an empty set of codecs.
-  if (local_audio_description_.streams().empty() &&
-      remote_audio_description_.codecs().empty()) {
-  } else {
-    remote_audio_description_.set_codecs(codecs_result.MoveValue());
-  }
-  remote_audio_description_.set_rtp_header_extensions(
-      extensions_result.MoveValue());
-  remote_audio_description_.set_bandwidth(bandwidth);
-  local_audio_description_.mutable_streams() = stream_params_result.MoveValue();
-  // Direction set based on encoding "active" flag.
-  local_audio_description_.set_direction(
-      local_direction.ToMediaContentDirection());
-  remote_audio_description_.set_direction(
-      local_direction.Reversed().ToMediaContentDirection());
-
-  // Set remote content first, to ensure the stream is created with the correct
-  // codec.
-  if (!voice_channel_->SetRemoteContent(&remote_audio_description_,
-                                        cricket::CA_OFFER, nullptr)) {
-    LOG_AND_RETURN_ERROR(RTCErrorType::INTERNAL_ERROR,
-                         "Failed to apply remote parameters to media channel.");
-  }
-  if (!voice_channel_->SetLocalContent(&local_audio_description_,
-                                       cricket::CA_ANSWER, nullptr)) {
-    LOG_AND_RETURN_ERROR(RTCErrorType::INTERNAL_ERROR,
-                         "Failed to apply local parameters to media channel.");
-  }
-  return RTCError::OK();
-}
-
-RTCError RtpTransportControllerAdapter::ValidateAndApplyVideoSenderParameters(
-    const RtpParameters& parameters,
-    uint32_t* primary_ssrc) {
-  RTC_DCHECK(video_channel_);
-  RTC_DCHECK(have_video_sender_);
-
-  auto codecs_result = ToCricketCodecs<cricket::VideoCodec>(parameters.codecs);
-  if (!codecs_result.ok()) {
-    return codecs_result.MoveError();
-  }
-
-  auto extensions_result =
-      ToCricketRtpHeaderExtensions(parameters.header_extensions);
-  if (!extensions_result.ok()) {
-    return extensions_result.MoveError();
-  }
-
-  auto stream_params_result = MakeSendStreamParamsVec(
-      parameters.encodings, inner_video_transport_->GetParameters().rtcp.cname,
-      local_video_description_);
-  if (!stream_params_result.ok()) {
-    return stream_params_result.MoveError();
-  }
-
-  // Check that audio/video sender aren't using the same IDs to refer to
-  // different things, if they share the same transport.
-  if (inner_audio_transport_ == inner_video_transport_) {
-    RTCError err = CheckForIdConflicts(
-        codecs_result.value(), extensions_result.value(),
-        stream_params_result.value(), remote_audio_description_.codecs(),
-        remote_audio_description_.rtp_header_extensions(),
-        local_audio_description_.streams());
-    if (!err.ok()) {
-      return err;
-    }
-  }
-
-  cricket::RtpTransceiverDirection local_direction =
-      cricket::RtpTransceiverDirection::FromMediaContentDirection(
-          local_video_description_.direction());
-  int bandwidth = cricket::kAutoBandwidth;
-  if (parameters.encodings.size() == 1u) {
-    if (parameters.encodings[0].max_bitrate_bps) {
-      bandwidth = *parameters.encodings[0].max_bitrate_bps;
-    }
-    local_direction.send = parameters.encodings[0].active;
-  } else {
-    local_direction.send = false;
-  }
-  if (primary_ssrc && !stream_params_result.value().empty()) {
-    *primary_ssrc = stream_params_result.value()[0].first_ssrc();
-  }
-
-  // Validation is done, so we can attempt applying the descriptions. Sent
-  // codecs and header extensions go in remote description, streams go in
-  // local.
-  //
-  // If there are no codecs or encodings, just leave the previous set of
-  // codecs. The media engine doesn't like an empty set of codecs.
-  if (local_video_description_.streams().empty() &&
-      remote_video_description_.codecs().empty()) {
-  } else {
-    remote_video_description_.set_codecs(codecs_result.MoveValue());
-  }
-  remote_video_description_.set_rtp_header_extensions(
-      extensions_result.MoveValue());
-  remote_video_description_.set_bandwidth(bandwidth);
-  local_video_description_.mutable_streams() = stream_params_result.MoveValue();
-  // Direction set based on encoding "active" flag.
-  local_video_description_.set_direction(
-      local_direction.ToMediaContentDirection());
-  remote_video_description_.set_direction(
-      local_direction.Reversed().ToMediaContentDirection());
-
-  // Set remote content first, to ensure the stream is created with the correct
-  // codec.
-  if (!video_channel_->SetRemoteContent(&remote_video_description_,
-                                        cricket::CA_OFFER, nullptr)) {
-    LOG_AND_RETURN_ERROR(RTCErrorType::INTERNAL_ERROR,
-                         "Failed to apply remote parameters to media channel.");
-  }
-  if (!video_channel_->SetLocalContent(&local_video_description_,
-                                       cricket::CA_ANSWER, nullptr)) {
-    LOG_AND_RETURN_ERROR(RTCErrorType::INTERNAL_ERROR,
-                         "Failed to apply local parameters to media channel.");
-  }
-  return RTCError::OK();
-}
-
-RTCError RtpTransportControllerAdapter::ValidateAndApplyAudioReceiverParameters(
-    const RtpParameters& parameters) {
-  RTC_DCHECK(voice_channel_);
-  RTC_DCHECK(have_audio_receiver_);
-
-  auto codecs_result = ToCricketCodecs<cricket::AudioCodec>(parameters.codecs);
-  if (!codecs_result.ok()) {
-    return codecs_result.MoveError();
-  }
-
-  auto extensions_result =
-      ToCricketRtpHeaderExtensions(parameters.header_extensions);
-  if (!extensions_result.ok()) {
-    return extensions_result.MoveError();
-  }
-
-  cricket::RtpTransceiverDirection local_direction =
-      cricket::RtpTransceiverDirection::FromMediaContentDirection(
-          local_audio_description_.direction());
-  auto stream_params_result = ToCricketStreamParamsVec(parameters.encodings);
-  if (!stream_params_result.ok()) {
-    return stream_params_result.MoveError();
-  }
-
-  // Check that audio/video receive aren't using the same IDs to refer to
-  // different things, if they share the same transport.
-  if (inner_audio_transport_ == inner_video_transport_) {
-    RTCError err = CheckForIdConflicts(
-        codecs_result.value(), extensions_result.value(),
-        stream_params_result.value(), local_video_description_.codecs(),
-        local_video_description_.rtp_header_extensions(),
-        remote_video_description_.streams());
-    if (!err.ok()) {
-      return err;
-    }
-  }
-
-  local_direction.recv =
-      !parameters.encodings.empty() && parameters.encodings[0].active;
-
-  // Validation is done, so we can attempt applying the descriptions. Received
-  // codecs and header extensions go in local description, streams go in
-  // remote.
-  //
-  // If there are no codecs or encodings, just leave the previous set of
-  // codecs. The media engine doesn't like an empty set of codecs.
-  if (remote_audio_description_.streams().empty() &&
-      local_audio_description_.codecs().empty()) {
-  } else {
-    local_audio_description_.set_codecs(codecs_result.MoveValue());
-  }
-  local_audio_description_.set_rtp_header_extensions(
-      extensions_result.MoveValue());
-  remote_audio_description_.mutable_streams() =
-      stream_params_result.MoveValue();
-  // Direction set based on encoding "active" flag.
-  local_audio_description_.set_direction(
-      local_direction.ToMediaContentDirection());
-  remote_audio_description_.set_direction(
-      local_direction.Reversed().ToMediaContentDirection());
-
-  if (!voice_channel_->SetLocalContent(&local_audio_description_,
-                                       cricket::CA_OFFER, nullptr)) {
-    LOG_AND_RETURN_ERROR(RTCErrorType::INTERNAL_ERROR,
-                         "Failed to apply local parameters to media channel.");
-  }
-  if (!voice_channel_->SetRemoteContent(&remote_audio_description_,
-                                        cricket::CA_ANSWER, nullptr)) {
-    LOG_AND_RETURN_ERROR(RTCErrorType::INTERNAL_ERROR,
-                         "Failed to apply remote parameters to media channel.");
-  }
-  return RTCError::OK();
-}
-
-RTCError RtpTransportControllerAdapter::ValidateAndApplyVideoReceiverParameters(
-    const RtpParameters& parameters) {
-  RTC_DCHECK(video_channel_);
-  RTC_DCHECK(have_video_receiver_);
-
-  auto codecs_result = ToCricketCodecs<cricket::VideoCodec>(parameters.codecs);
-  if (!codecs_result.ok()) {
-    return codecs_result.MoveError();
-  }
-
-  auto extensions_result =
-      ToCricketRtpHeaderExtensions(parameters.header_extensions);
-  if (!extensions_result.ok()) {
-    return extensions_result.MoveError();
-  }
-
-  cricket::RtpTransceiverDirection local_direction =
-      cricket::RtpTransceiverDirection::FromMediaContentDirection(
-          local_video_description_.direction());
-  int bandwidth = cricket::kAutoBandwidth;
-  auto stream_params_result = ToCricketStreamParamsVec(parameters.encodings);
-  if (!stream_params_result.ok()) {
-    return stream_params_result.MoveError();
-  }
-
-  // Check that audio/video receiver aren't using the same IDs to refer to
-  // different things, if they share the same transport.
-  if (inner_audio_transport_ == inner_video_transport_) {
-    RTCError err = CheckForIdConflicts(
-        codecs_result.value(), extensions_result.value(),
-        stream_params_result.value(), local_audio_description_.codecs(),
-        local_audio_description_.rtp_header_extensions(),
-        remote_audio_description_.streams());
-    if (!err.ok()) {
-      return err;
-    }
-  }
-
-  local_direction.recv =
-      !parameters.encodings.empty() && parameters.encodings[0].active;
-
-  // Validation is done, so we can attempt applying the descriptions. Received
-  // codecs and header extensions go in local description, streams go in
-  // remote.
-  //
-  // If there are no codecs or encodings, just leave the previous set of
-  // codecs. The media engine doesn't like an empty set of codecs.
-  if (remote_video_description_.streams().empty() &&
-      local_video_description_.codecs().empty()) {
-  } else {
-    local_video_description_.set_codecs(codecs_result.MoveValue());
-  }
-  local_video_description_.set_rtp_header_extensions(
-      extensions_result.MoveValue());
-  local_video_description_.set_bandwidth(bandwidth);
-  remote_video_description_.mutable_streams() =
-      stream_params_result.MoveValue();
-  // Direction set based on encoding "active" flag.
-  local_video_description_.set_direction(
-      local_direction.ToMediaContentDirection());
-  remote_video_description_.set_direction(
-      local_direction.Reversed().ToMediaContentDirection());
-
-  if (!video_channel_->SetLocalContent(&local_video_description_,
-                                       cricket::CA_OFFER, nullptr)) {
-    LOG_AND_RETURN_ERROR(RTCErrorType::INTERNAL_ERROR,
-                         "Failed to apply local parameters to media channel.");
-  }
-  if (!video_channel_->SetRemoteContent(&remote_video_description_,
-                                        cricket::CA_ANSWER, nullptr)) {
-    LOG_AND_RETURN_ERROR(RTCErrorType::INTERNAL_ERROR,
-                         "Failed to apply remote parameters to media channel.");
-  }
-  return RTCError::OK();
-}
-
-RtpTransportControllerAdapter::RtpTransportControllerAdapter(
-    const cricket::MediaConfig& config,
-    cricket::ChannelManager* channel_manager,
-    webrtc::RtcEventLog* event_log,
-    rtc::Thread* signaling_thread,
-    rtc::Thread* worker_thread)
-    : signaling_thread_(signaling_thread),
-      worker_thread_(worker_thread),
-      media_config_(config),
-      channel_manager_(channel_manager),
-      event_log_(event_log),
-      call_send_rtp_transport_controller_(nullptr) {
-  RTC_DCHECK_RUN_ON(signaling_thread_);
-  RTC_DCHECK(channel_manager_);
-  // Add "dummy" codecs to the descriptions, because the media engines
-  // currently reject empty lists of codecs. Note that these codecs will never
-  // actually be used, because when parameters are set, the dummy codecs will
-  // be replaced by actual codecs before any send/receive streams are created.
-  static const cricket::AudioCodec dummy_audio(0, cricket::kPcmuCodecName, 8000,
-                                               0, 1);
-  static const cricket::VideoCodec dummy_video(96, cricket::kVp8CodecName);
-  local_audio_description_.AddCodec(dummy_audio);
-  remote_audio_description_.AddCodec(dummy_audio);
-  local_video_description_.AddCodec(dummy_video);
-  remote_video_description_.AddCodec(dummy_video);
-
-  worker_thread_->Invoke<void>(
-      RTC_FROM_HERE,
-      rtc::Bind(&RtpTransportControllerAdapter::Init_w, this));
-}
-
-// TODO(nisse): Duplicates corresponding method in PeerConnection (used
-// to be in MediaController).
-void RtpTransportControllerAdapter::Init_w() {
-  RTC_DCHECK(worker_thread_->IsCurrent());
-  RTC_DCHECK(!call_);
-
-  const int kMinBandwidthBps = 30000;
-  const int kStartBandwidthBps = 300000;
-  const int kMaxBandwidthBps = 2000000;
-
-  webrtc::Call::Config call_config(event_log_);
-  call_config.audio_state = channel_manager_->media_engine()->GetAudioState();
-  call_config.bitrate_config.min_bitrate_bps = kMinBandwidthBps;
-  call_config.bitrate_config.start_bitrate_bps = kStartBandwidthBps;
-  call_config.bitrate_config.max_bitrate_bps = kMaxBandwidthBps;
-
-  call_send_rtp_transport_controller_ =
-      new RtpTransportControllerSend(Clock::GetRealTimeClock(), event_log_);
-  call_.reset(webrtc::Call::Create(
-      call_config, std::unique_ptr<RtpTransportControllerSendInterface>(
-                       call_send_rtp_transport_controller_)));
-}
-
-void RtpTransportControllerAdapter::Close_w() {
-  call_.reset();
-  call_send_rtp_transport_controller_ = nullptr;
-}
-
-RTCError RtpTransportControllerAdapter::AttachAudioSender(
-    OrtcRtpSenderAdapter* sender,
-    RtpTransportInterface* inner_transport) {
-  if (have_audio_sender_) {
-    LOG_AND_RETURN_ERROR(RTCErrorType::UNSUPPORTED_OPERATION,
-                         "Using two audio RtpSenders with the same "
-                         "RtpTransportControllerAdapter is not currently "
-                         "supported.");
-  }
-  if (inner_audio_transport_ && inner_audio_transport_ != inner_transport) {
-    LOG_AND_RETURN_ERROR(RTCErrorType::UNSUPPORTED_OPERATION,
-                         "Using different transports for the audio "
-                         "RtpSender and RtpReceiver is not currently "
-                         "supported.");
-  }
-  RTCError err = MaybeSetCryptos(inner_transport, &local_audio_description_,
-                                 &remote_audio_description_);
-  if (!err.ok()) {
-    return err;
-  }
-  // If setting new transport, extract its RTCP parameters and create voice
-  // channel.
-  if (!inner_audio_transport_) {
-    CopyRtcpParametersToDescriptions(inner_transport->GetParameters().rtcp,
-                                     &local_audio_description_,
-                                     &remote_audio_description_);
-    inner_audio_transport_ = inner_transport;
-    CreateVoiceChannel();
-  }
-  have_audio_sender_ = true;
-  sender->SignalDestroyed.connect(
-      this, &RtpTransportControllerAdapter::OnAudioSenderDestroyed);
-  return RTCError::OK();
-}
-
-RTCError RtpTransportControllerAdapter::AttachVideoSender(
-    OrtcRtpSenderAdapter* sender,
-    RtpTransportInterface* inner_transport) {
-  if (have_video_sender_) {
-    LOG_AND_RETURN_ERROR(RTCErrorType::UNSUPPORTED_OPERATION,
-                         "Using two video RtpSenders with the same "
-                         "RtpTransportControllerAdapter is not currently "
-                         "supported.");
-  }
-  if (inner_video_transport_ && inner_video_transport_ != inner_transport) {
-    LOG_AND_RETURN_ERROR(RTCErrorType::UNSUPPORTED_OPERATION,
-                         "Using different transports for the video "
-                         "RtpSender and RtpReceiver is not currently "
-                         "supported.");
-  }
-  RTCError err = MaybeSetCryptos(inner_transport, &local_video_description_,
-                                 &remote_video_description_);
-  if (!err.ok()) {
-    return err;
-  }
-  // If setting new transport, extract its RTCP parameters and create video
-  // channel.
-  if (!inner_video_transport_) {
-    CopyRtcpParametersToDescriptions(inner_transport->GetParameters().rtcp,
-                                     &local_video_description_,
-                                     &remote_video_description_);
-    inner_video_transport_ = inner_transport;
-    CreateVideoChannel();
-  }
-  have_video_sender_ = true;
-  sender->SignalDestroyed.connect(
-      this, &RtpTransportControllerAdapter::OnVideoSenderDestroyed);
-  return RTCError::OK();
-}
-
-RTCError RtpTransportControllerAdapter::AttachAudioReceiver(
-    OrtcRtpReceiverAdapter* receiver,
-    RtpTransportInterface* inner_transport) {
-  if (have_audio_receiver_) {
-    LOG_AND_RETURN_ERROR(RTCErrorType::UNSUPPORTED_OPERATION,
-                         "Using two audio RtpReceivers with the same "
-                         "RtpTransportControllerAdapter is not currently "
-                         "supported.");
-  }
-  if (inner_audio_transport_ && inner_audio_transport_ != inner_transport) {
-    LOG_AND_RETURN_ERROR(RTCErrorType::UNSUPPORTED_OPERATION,
-                         "Using different transports for the audio "
-                         "RtpReceiver and RtpReceiver is not currently "
-                         "supported.");
-  }
-  RTCError err = MaybeSetCryptos(inner_transport, &local_audio_description_,
-                                 &remote_audio_description_);
-  if (!err.ok()) {
-    return err;
-  }
-  // If setting new transport, extract its RTCP parameters and create voice
-  // channel.
-  if (!inner_audio_transport_) {
-    CopyRtcpParametersToDescriptions(inner_transport->GetParameters().rtcp,
-                                     &local_audio_description_,
-                                     &remote_audio_description_);
-    inner_audio_transport_ = inner_transport;
-    CreateVoiceChannel();
-  }
-  have_audio_receiver_ = true;
-  receiver->SignalDestroyed.connect(
-      this, &RtpTransportControllerAdapter::OnAudioReceiverDestroyed);
-  return RTCError::OK();
-}
-
-RTCError RtpTransportControllerAdapter::AttachVideoReceiver(
-    OrtcRtpReceiverAdapter* receiver,
-    RtpTransportInterface* inner_transport) {
-  if (have_video_receiver_) {
-    LOG_AND_RETURN_ERROR(RTCErrorType::UNSUPPORTED_OPERATION,
-                         "Using two video RtpReceivers with the same "
-                         "RtpTransportControllerAdapter is not currently "
-                         "supported.");
-  }
-  if (inner_video_transport_ && inner_video_transport_ != inner_transport) {
-    LOG_AND_RETURN_ERROR(RTCErrorType::UNSUPPORTED_OPERATION,
-                         "Using different transports for the video "
-                         "RtpReceiver and RtpReceiver is not currently "
-                         "supported.");
-  }
-  RTCError err = MaybeSetCryptos(inner_transport, &local_video_description_,
-                                 &remote_video_description_);
-  if (!err.ok()) {
-    return err;
-  }
-  // If setting new transport, extract its RTCP parameters and create video
-  // channel.
-  if (!inner_video_transport_) {
-    CopyRtcpParametersToDescriptions(inner_transport->GetParameters().rtcp,
-                                     &local_video_description_,
-                                     &remote_video_description_);
-    inner_video_transport_ = inner_transport;
-    CreateVideoChannel();
-  }
-  have_video_receiver_ = true;
-  receiver->SignalDestroyed.connect(
-      this, &RtpTransportControllerAdapter::OnVideoReceiverDestroyed);
-  return RTCError::OK();
-}
-
-void RtpTransportControllerAdapter::OnRtpTransportDestroyed(
-    RtpTransportAdapter* transport) {
-  RTC_DCHECK_RUN_ON(signaling_thread_);
-  auto it = std::find_if(transport_proxies_.begin(), transport_proxies_.end(),
-                         [transport](RtpTransportInterface* proxy) {
-                           return proxy->GetInternal() == transport;
-                         });
-  if (it == transport_proxies_.end()) {
-    RTC_NOTREACHED();
-    return;
-  }
-  transport_proxies_.erase(it);
-}
-
-void RtpTransportControllerAdapter::OnAudioSenderDestroyed() {
-  if (!have_audio_sender_) {
-    RTC_NOTREACHED();
-    return;
-  }
-  // Empty parameters should result in sending being stopped.
-  RTCError err =
-      ValidateAndApplyAudioSenderParameters(RtpParameters(), nullptr);
-  RTC_DCHECK(err.ok());
-  have_audio_sender_ = false;
-  if (!have_audio_receiver_) {
-    DestroyVoiceChannel();
-  }
-}
-
-void RtpTransportControllerAdapter::OnVideoSenderDestroyed() {
-  if (!have_video_sender_) {
-    RTC_NOTREACHED();
-    return;
-  }
-  // Empty parameters should result in sending being stopped.
-  RTCError err =
-      ValidateAndApplyVideoSenderParameters(RtpParameters(), nullptr);
-  RTC_DCHECK(err.ok());
-  have_video_sender_ = false;
-  if (!have_video_receiver_) {
-    DestroyVideoChannel();
-  }
-}
-
-void RtpTransportControllerAdapter::OnAudioReceiverDestroyed() {
-  if (!have_audio_receiver_) {
-    RTC_NOTREACHED();
-    return;
-  }
-  // Empty parameters should result in receiving being stopped.
-  RTCError err = ValidateAndApplyAudioReceiverParameters(RtpParameters());
-  RTC_DCHECK(err.ok());
-  have_audio_receiver_ = false;
-  if (!have_audio_sender_) {
-    DestroyVoiceChannel();
-  }
-}
-
-void RtpTransportControllerAdapter::OnVideoReceiverDestroyed() {
-  if (!have_video_receiver_) {
-    RTC_NOTREACHED();
-    return;
-  }
-  // Empty parameters should result in receiving being stopped.
-  RTCError err = ValidateAndApplyVideoReceiverParameters(RtpParameters());
-  RTC_DCHECK(err.ok());
-  have_video_receiver_ = false;
-  if (!have_video_sender_) {
-    DestroyVideoChannel();
-  }
-}
-
-void RtpTransportControllerAdapter::CreateVoiceChannel() {
-  voice_channel_ = channel_manager_->CreateVoiceChannel(
-      call_.get(), media_config_,
-      inner_audio_transport_->GetRtpPacketTransport()->GetInternal(),
-      inner_audio_transport_->GetRtcpPacketTransport()
-          ? inner_audio_transport_->GetRtcpPacketTransport()->GetInternal()
-          : nullptr,
-      signaling_thread_, "audio", false, cricket::AudioOptions());
-  RTC_DCHECK(voice_channel_);
-  voice_channel_->Enable(true);
-}
-
-void RtpTransportControllerAdapter::CreateVideoChannel() {
-  video_channel_ = channel_manager_->CreateVideoChannel(
-      call_.get(), media_config_,
-      inner_video_transport_->GetRtpPacketTransport()->GetInternal(),
-      inner_video_transport_->GetRtcpPacketTransport()
-          ? inner_video_transport_->GetRtcpPacketTransport()->GetInternal()
-          : nullptr,
-      signaling_thread_, "video", false, cricket::VideoOptions());
-  RTC_DCHECK(video_channel_);
-  video_channel_->Enable(true);
-}
-
-void RtpTransportControllerAdapter::DestroyVoiceChannel() {
-  RTC_DCHECK(voice_channel_);
-  channel_manager_->DestroyVoiceChannel(voice_channel_);
-  voice_channel_ = nullptr;
-  inner_audio_transport_ = nullptr;
-}
-
-void RtpTransportControllerAdapter::DestroyVideoChannel() {
-  RTC_DCHECK(video_channel_);
-  channel_manager_->DestroyVideoChannel(video_channel_);
-  video_channel_ = nullptr;
-  inner_video_transport_ = nullptr;
-}
-
-void RtpTransportControllerAdapter::CopyRtcpParametersToDescriptions(
-    const RtcpParameters& params,
-    cricket::MediaContentDescription* local,
-    cricket::MediaContentDescription* remote) {
-  local->set_rtcp_mux(params.mux);
-  remote->set_rtcp_mux(params.mux);
-  local->set_rtcp_reduced_size(params.reduced_size);
-  remote->set_rtcp_reduced_size(params.reduced_size);
-  for (cricket::StreamParams& stream_params : local->mutable_streams()) {
-    stream_params.cname = params.cname;
-  }
-}
-
-uint32_t RtpTransportControllerAdapter::GenerateUnusedSsrc(
-    std::set<uint32_t>* new_ssrcs) const {
-  uint32_t ssrc;
-  do {
-    ssrc = rtc::CreateRandomNonZeroId();
-  } while (
-      cricket::GetStreamBySsrc(local_audio_description_.streams(), ssrc) ||
-      cricket::GetStreamBySsrc(remote_audio_description_.streams(), ssrc) ||
-      cricket::GetStreamBySsrc(local_video_description_.streams(), ssrc) ||
-      cricket::GetStreamBySsrc(remote_video_description_.streams(), ssrc) ||
-      !new_ssrcs->insert(ssrc).second);
-  return ssrc;
-}
-
-RTCErrorOr<cricket::StreamParamsVec>
-RtpTransportControllerAdapter::MakeSendStreamParamsVec(
-    std::vector<RtpEncodingParameters> encodings,
-    const std::string& cname,
-    const cricket::MediaContentDescription& description) const {
-  if (encodings.size() > 1u) {
-    LOG_AND_RETURN_ERROR(webrtc::RTCErrorType::UNSUPPORTED_PARAMETER,
-                         "ORTC API implementation doesn't currently "
-                         "support simulcast or layered encodings.");
-  } else if (encodings.empty()) {
-    return cricket::StreamParamsVec();
-  }
-  RtpEncodingParameters& encoding = encodings[0];
-  std::set<uint32_t> new_ssrcs;
-  if (encoding.ssrc) {
-    new_ssrcs.insert(*encoding.ssrc);
-  }
-  if (encoding.rtx && encoding.rtx->ssrc) {
-    new_ssrcs.insert(*encoding.rtx->ssrc);
-  }
-  // May need to fill missing SSRCs with generated ones.
-  if (!encoding.ssrc) {
-    if (!description.streams().empty()) {
-      encoding.ssrc.emplace(description.streams()[0].first_ssrc());
-    } else {
-      encoding.ssrc.emplace(GenerateUnusedSsrc(&new_ssrcs));
-    }
-  }
-  if (encoding.rtx && !encoding.rtx->ssrc) {
-    uint32_t existing_rtx_ssrc;
-    if (!description.streams().empty() &&
-        description.streams()[0].GetFidSsrc(
-            description.streams()[0].first_ssrc(), &existing_rtx_ssrc)) {
-      encoding.rtx->ssrc.emplace(existing_rtx_ssrc);
-    } else {
-      encoding.rtx->ssrc.emplace(GenerateUnusedSsrc(&new_ssrcs));
-    }
-  }
-
-  auto result = ToCricketStreamParamsVec(encodings);
-  if (!result.ok()) {
-    return result.MoveError();
-  }
-  // If conversion was successful, there should be one StreamParams.
-  RTC_DCHECK_EQ(1u, result.value().size());
-  result.value()[0].cname = cname;
-  return result;
-}
-
-RTCError RtpTransportControllerAdapter::MaybeSetCryptos(
-    RtpTransportInterface* rtp_transport,
-    cricket::MediaContentDescription* local_description,
-    cricket::MediaContentDescription* remote_description) {
-  if (rtp_transport->GetInternal()->is_srtp_transport()) {
-    if (!rtp_transport->GetInternal()->send_key() ||
-        !rtp_transport->GetInternal()->receive_key()) {
-      LOG_AND_RETURN_ERROR(webrtc::RTCErrorType::UNSUPPORTED_PARAMETER,
-                           "The SRTP send key or receive key is not set.")
-    }
-    std::vector<cricket::CryptoParams> cryptos;
-    cryptos.push_back(*(rtp_transport->GetInternal()->receive_key()));
-    local_description->set_cryptos(cryptos);
-
-    cryptos.clear();
-    cryptos.push_back(*(rtp_transport->GetInternal()->send_key()));
-    remote_description->set_cryptos(cryptos);
-  }
-  return RTCError::OK();
-}
-
-}  // namespace webrtc
diff --git a/ortc/rtptransportcontrolleradapter.h b/ortc/rtptransportcontrolleradapter.h
deleted file mode 100644
index d4494d0..0000000
--- a/ortc/rtptransportcontrolleradapter.h
+++ /dev/null
@@ -1,224 +0,0 @@
-/*
- *  Copyright 2017 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_ORTC_RTPTRANSPORTCONTROLLERADAPTER_H_
-#define WEBRTC_ORTC_RTPTRANSPORTCONTROLLERADAPTER_H_
-
-#include <memory>
-#include <set>
-#include <string>
-#include <vector>
-
-#include "webrtc/api/ortc/ortcrtpreceiverinterface.h"
-#include "webrtc/api/ortc/ortcrtpsenderinterface.h"
-#include "webrtc/api/ortc/rtptransportcontrollerinterface.h"
-#include "webrtc/api/ortc/srtptransportinterface.h"
-#include "webrtc/call/call.h"
-#include "webrtc/call/rtp_transport_controller_send.h"
-#include "webrtc/logging/rtc_event_log/rtc_event_log.h"
-#include "webrtc/media/base/mediachannel.h"  // For MediaConfig.
-#include "webrtc/pc/channelmanager.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/sigslot.h"
-#include "webrtc/rtc_base/thread.h"
-
-namespace webrtc {
-
-class RtpTransportAdapter;
-class OrtcRtpSenderAdapter;
-class OrtcRtpReceiverAdapter;
-
-// Implementation of RtpTransportControllerInterface. Wraps a Call,
-// a VoiceChannel and VideoChannel, and maintains a list of dependent RTP
-// transports.
-//
-// When used along with an RtpSenderAdapter or RtpReceiverAdapter, the
-// sender/receiver passes its parameters along to this class, which turns them
-// into cricket:: media descriptions (the interface used by BaseChannel).
-//
-// Due to the fact that BaseChannel has different subclasses for audio/video,
-// the actual BaseChannel object is not created until an RtpSender/RtpReceiver
-// needs them.
-//
-// All methods should be called on the signaling thread.
-//
-// TODO(deadbeef): When BaseChannel is split apart into separate
-// "RtpSender"/"RtpTransceiver"/"RtpSender"/"RtpReceiver" objects, this adapter
-// object can be replaced by a "real" one.
-class RtpTransportControllerAdapter : public RtpTransportControllerInterface,
-                                      public sigslot::has_slots<> {
- public:
-  // Creates a proxy that will call "public interface" methods on the correct
-  // thread.
-  //
-  // Doesn't take ownership of any objects passed in.
-  //
-  // |channel_manager| must not be null.
-  static std::unique_ptr<RtpTransportControllerInterface> CreateProxied(
-      const cricket::MediaConfig& config,
-      cricket::ChannelManager* channel_manager,
-      webrtc::RtcEventLog* event_log,
-      rtc::Thread* signaling_thread,
-      rtc::Thread* worker_thread);
-
-  ~RtpTransportControllerAdapter() override;
-
-  // RtpTransportControllerInterface implementation.
-  std::vector<RtpTransportInterface*> GetTransports() const override;
-
-  // These methods are used by OrtcFactory to create RtpTransports, RtpSenders
-  // and RtpReceivers using this controller. Called "CreateProxied" because
-  // these methods return proxies that will safely call methods on the correct
-  // thread.
-  RTCErrorOr<std::unique_ptr<RtpTransportInterface>> CreateProxiedRtpTransport(
-      const RtpTransportParameters& rtcp_parameters,
-      PacketTransportInterface* rtp,
-      PacketTransportInterface* rtcp);
-
-  RTCErrorOr<std::unique_ptr<SrtpTransportInterface>>
-  CreateProxiedSrtpTransport(const RtpTransportParameters& rtcp_parameters,
-                             PacketTransportInterface* rtp,
-                             PacketTransportInterface* rtcp);
-
-  // |transport_proxy| needs to be a proxy to a transport because the
-  // application may call GetTransport() on the returned sender or receiver,
-  // and expects it to return a thread-safe transport proxy.
-  RTCErrorOr<std::unique_ptr<OrtcRtpSenderInterface>> CreateProxiedRtpSender(
-      cricket::MediaType kind,
-      RtpTransportInterface* transport_proxy);
-  RTCErrorOr<std::unique_ptr<OrtcRtpReceiverInterface>>
-  CreateProxiedRtpReceiver(cricket::MediaType kind,
-                           RtpTransportInterface* transport_proxy);
-
-  // Methods used internally by other "adapter" classes.
-  rtc::Thread* signaling_thread() const { return signaling_thread_; }
-  rtc::Thread* worker_thread() const { return worker_thread_; }
-
-  // |parameters.keepalive| will be set for ALL RTP transports in the call.
-  RTCError SetRtpTransportParameters(const RtpTransportParameters& parameters,
-                                     RtpTransportInterface* inner_transport);
-  void SetRtpTransportParameters_w(const RtpTransportParameters& parameters);
-
-  cricket::VoiceChannel* voice_channel() { return voice_channel_; }
-  cricket::VideoChannel* video_channel() { return video_channel_; }
-
-  // |primary_ssrc| out parameter is filled with either
-  // |parameters.encodings[0].ssrc|, or a generated SSRC if that's left unset.
-  RTCError ValidateAndApplyAudioSenderParameters(
-      const RtpParameters& parameters,
-      uint32_t* primary_ssrc);
-  RTCError ValidateAndApplyVideoSenderParameters(
-      const RtpParameters& parameters,
-      uint32_t* primary_ssrc);
-  RTCError ValidateAndApplyAudioReceiverParameters(
-      const RtpParameters& parameters);
-  RTCError ValidateAndApplyVideoReceiverParameters(
-      const RtpParameters& parameters);
-
- protected:
-  RtpTransportControllerAdapter* GetInternal() override { return this; }
-
- private:
-  // Only expected to be called by RtpTransportControllerAdapter::CreateProxied.
-  RtpTransportControllerAdapter(const cricket::MediaConfig& config,
-                                cricket::ChannelManager* channel_manager,
-                                webrtc::RtcEventLog* event_log,
-                                rtc::Thread* signaling_thread,
-                                rtc::Thread* worker_thread);
-  void Init_w();
-  void Close_w();
-
-  // These return an error if another of the same type of object is already
-  // attached, or if |transport_proxy| can't be used with the sender/receiver
-  // due to the limitation that the sender/receiver of the same media type must
-  // use the same transport.
-  RTCError AttachAudioSender(OrtcRtpSenderAdapter* sender,
-                             RtpTransportInterface* inner_transport);
-  RTCError AttachVideoSender(OrtcRtpSenderAdapter* sender,
-                             RtpTransportInterface* inner_transport);
-  RTCError AttachAudioReceiver(OrtcRtpReceiverAdapter* receiver,
-                               RtpTransportInterface* inner_transport);
-  RTCError AttachVideoReceiver(OrtcRtpReceiverAdapter* receiver,
-                               RtpTransportInterface* inner_transport);
-
-  void OnRtpTransportDestroyed(RtpTransportAdapter* transport);
-
-  void OnAudioSenderDestroyed();
-  void OnVideoSenderDestroyed();
-  void OnAudioReceiverDestroyed();
-  void OnVideoReceiverDestroyed();
-
-  void CreateVoiceChannel();
-  void CreateVideoChannel();
-  void DestroyVoiceChannel();
-  void DestroyVideoChannel();
-
-  void CopyRtcpParametersToDescriptions(
-      const RtcpParameters& params,
-      cricket::MediaContentDescription* local,
-      cricket::MediaContentDescription* remote);
-
-  // Helper function to generate an SSRC that doesn't match one in any of the
-  // "content description" structs, or in |new_ssrcs| (which is needed since
-  // multiple SSRCs may be generated in one go).
-  uint32_t GenerateUnusedSsrc(std::set<uint32_t>* new_ssrcs) const;
-
-  // |description| is the matching description where existing SSRCs can be
-  // found.
-  //
-  // This is a member function because it may need to generate SSRCs that don't
-  // match existing ones, which is more than ToStreamParamsVec does.
-  RTCErrorOr<cricket::StreamParamsVec> MakeSendStreamParamsVec(
-      std::vector<RtpEncodingParameters> encodings,
-      const std::string& cname,
-      const cricket::MediaContentDescription& description) const;
-
-  // If the |rtp_transport| is a SrtpTransport, set the cryptos of the
-  // audio/video content descriptions.
-  RTCError MaybeSetCryptos(
-      RtpTransportInterface* rtp_transport,
-      cricket::MediaContentDescription* local_description,
-      cricket::MediaContentDescription* remote_description);
-
-  rtc::Thread* signaling_thread_;
-  rtc::Thread* worker_thread_;
-  // |transport_proxies_| and |inner_audio_transport_|/|inner_audio_transport_|
-  // are somewhat redundant, but the latter are only set when
-  // RtpSenders/RtpReceivers are attached to the transport.
-  std::vector<RtpTransportInterface*> transport_proxies_;
-  RtpTransportInterface* inner_audio_transport_ = nullptr;
-  RtpTransportInterface* inner_video_transport_ = nullptr;
-  const cricket::MediaConfig media_config_;
-  RtpKeepAliveConfig keepalive_;
-  cricket::ChannelManager* channel_manager_;
-  webrtc::RtcEventLog* event_log_;
-  std::unique_ptr<Call> call_;
-  webrtc::RtpTransportControllerSend* call_send_rtp_transport_controller_;
-
-  // BaseChannel takes content descriptions as input, so we store them here
-  // such that they can be updated when a new RtpSenderAdapter/
-  // RtpReceiverAdapter attaches itself.
-  cricket::AudioContentDescription local_audio_description_;
-  cricket::AudioContentDescription remote_audio_description_;
-  cricket::VideoContentDescription local_video_description_;
-  cricket::VideoContentDescription remote_video_description_;
-  cricket::VoiceChannel* voice_channel_ = nullptr;
-  cricket::VideoChannel* video_channel_ = nullptr;
-  bool have_audio_sender_ = false;
-  bool have_video_sender_ = false;
-  bool have_audio_receiver_ = false;
-  bool have_video_receiver_ = false;
-
-  RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(RtpTransportControllerAdapter);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_ORTC_RTPTRANSPORTCONTROLLERADAPTER_H_
diff --git a/ortc/srtptransport_unittest.cc b/ortc/srtptransport_unittest.cc
deleted file mode 100644
index ea9b28a..0000000
--- a/ortc/srtptransport_unittest.cc
+++ /dev/null
@@ -1,167 +0,0 @@
-/*
- *  Copyright 2017 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 <memory>
-
-#include "webrtc/media/base/fakemediaengine.h"
-#include "webrtc/ortc/ortcfactory.h"
-#include "webrtc/ortc/testrtpparameters.h"
-#include "webrtc/p2p/base/fakepackettransport.h"
-#include "webrtc/rtc_base/gunit.h"
-
-namespace webrtc {
-
-static const char kTestSha1KeyParams1[] =
-    "inline:WVNfX19zZW1jdGwgKCkgewkyMjA7fQp9CnVubGVz";
-static const char kTestSha1KeyParams2[] =
-    "inline:PS1uQCVeeCFCanVmcjkpPywjNWhcYD0mXXtxaVBR";
-static const char kTestGcmKeyParams3[] =
-    "inline:e166KFlKzJsGW0d5apX+rrI05vxbrvMJEzFI14aTDCa63IRTlLK4iH66uOI=";
-
-static const cricket::CryptoParams kTestSha1CryptoParams1(
-    1,
-    "AES_CM_128_HMAC_SHA1_80",
-    kTestSha1KeyParams1,
-    "");
-static const cricket::CryptoParams kTestSha1CryptoParams2(
-    1,
-    "AES_CM_128_HMAC_SHA1_80",
-    kTestSha1KeyParams2,
-    "");
-static const cricket::CryptoParams kTestGcmCryptoParams3(1,
-                                                         "AEAD_AES_256_GCM",
-                                                         kTestGcmKeyParams3,
-                                                         "");
-
-// This test uses fake packet transports and a fake media engine, in order to
-// test the SrtpTransport at only an API level. Any end-to-end test should go in
-// ortcfactory_integrationtest.cc instead.
-class SrtpTransportTest : public testing::Test {
- public:
-  SrtpTransportTest() {
-    fake_media_engine_ = new cricket::FakeMediaEngine();
-    // Note: This doesn't need to use fake network classes, since it uses
-    // FakePacketTransports.
-    auto result = OrtcFactory::Create(
-        nullptr, nullptr, nullptr, nullptr, nullptr,
-        std::unique_ptr<cricket::MediaEngineInterface>(fake_media_engine_));
-    ortc_factory_ = result.MoveValue();
-    rtp_transport_controller_ =
-        ortc_factory_->CreateRtpTransportController().MoveValue();
-
-    fake_packet_transport_.reset(new rtc::FakePacketTransport("fake"));
-    auto srtp_transport_result = ortc_factory_->CreateSrtpTransport(
-        rtp_transport_parameters_, fake_packet_transport_.get(), nullptr,
-        rtp_transport_controller_.get());
-    srtp_transport_ = srtp_transport_result.MoveValue();
-  }
-
- protected:
-  // Owned by |ortc_factory_|.
-  cricket::FakeMediaEngine* fake_media_engine_;
-  std::unique_ptr<OrtcFactoryInterface> ortc_factory_;
-  std::unique_ptr<RtpTransportControllerInterface> rtp_transport_controller_;
-  std::unique_ptr<SrtpTransportInterface> srtp_transport_;
-  RtpTransportParameters rtp_transport_parameters_;
-  std::unique_ptr<rtc::FakePacketTransport> fake_packet_transport_;
-};
-
-// Tests that setting the SRTP send/receive key succeeds.
-TEST_F(SrtpTransportTest, SetSrtpSendAndReceiveKey) {
-  EXPECT_TRUE(srtp_transport_->SetSrtpSendKey(kTestSha1CryptoParams1).ok());
-  EXPECT_TRUE(srtp_transport_->SetSrtpReceiveKey(kTestSha1CryptoParams2).ok());
-  auto sender_result = ortc_factory_->CreateRtpSender(cricket::MEDIA_TYPE_AUDIO,
-                                                      srtp_transport_.get());
-  EXPECT_TRUE(sender_result.ok());
-  auto receiver_result = ortc_factory_->CreateRtpReceiver(
-      cricket::MEDIA_TYPE_AUDIO, srtp_transport_.get());
-  EXPECT_TRUE(receiver_result.ok());
-}
-
-// Tests that setting the SRTP send/receive key twice is not supported.
-TEST_F(SrtpTransportTest, SetSrtpSendAndReceiveKeyTwice) {
-  EXPECT_TRUE(srtp_transport_->SetSrtpSendKey(kTestSha1CryptoParams1).ok());
-  EXPECT_TRUE(srtp_transport_->SetSrtpReceiveKey(kTestSha1CryptoParams2).ok());
-  EXPECT_EQ(RTCErrorType::UNSUPPORTED_OPERATION,
-            srtp_transport_->SetSrtpSendKey(kTestSha1CryptoParams2).type());
-  EXPECT_EQ(RTCErrorType::UNSUPPORTED_OPERATION,
-            srtp_transport_->SetSrtpReceiveKey(kTestSha1CryptoParams1).type());
-  // Ensure that the senders and receivers can be created despite the previous
-  // errors.
-  auto sender_result = ortc_factory_->CreateRtpSender(cricket::MEDIA_TYPE_AUDIO,
-                                                      srtp_transport_.get());
-  EXPECT_TRUE(sender_result.ok());
-  auto receiver_result = ortc_factory_->CreateRtpReceiver(
-      cricket::MEDIA_TYPE_AUDIO, srtp_transport_.get());
-  EXPECT_TRUE(receiver_result.ok());
-}
-
-// Test that the SRTP send key and receive key must have the same cipher suite.
-TEST_F(SrtpTransportTest, SetSrtpSendAndReceiveKeyDifferentCipherSuite) {
-  EXPECT_TRUE(srtp_transport_->SetSrtpSendKey(kTestSha1CryptoParams1).ok());
-  EXPECT_EQ(RTCErrorType::UNSUPPORTED_OPERATION,
-            srtp_transport_->SetSrtpReceiveKey(kTestGcmCryptoParams3).type());
-  EXPECT_TRUE(srtp_transport_->SetSrtpReceiveKey(kTestSha1CryptoParams2).ok());
-  // Ensure that the senders and receivers can be created despite the previous
-  // error.
-  auto sender_result = ortc_factory_->CreateRtpSender(cricket::MEDIA_TYPE_AUDIO,
-                                                      srtp_transport_.get());
-  EXPECT_TRUE(sender_result.ok());
-  auto receiver_result = ortc_factory_->CreateRtpReceiver(
-      cricket::MEDIA_TYPE_AUDIO, srtp_transport_.get());
-  EXPECT_TRUE(receiver_result.ok());
-}
-
-class SrtpTransportTestWithMediaType
-    : public SrtpTransportTest,
-      public ::testing::WithParamInterface<cricket::MediaType> {};
-
-// Tests that the senders cannot be created before setting the keys.
-TEST_P(SrtpTransportTestWithMediaType, CreateSenderBeforeSettingKeys) {
-  auto sender_result =
-      ortc_factory_->CreateRtpSender(GetParam(), srtp_transport_.get());
-  EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER, sender_result.error().type());
-  EXPECT_TRUE(srtp_transport_->SetSrtpSendKey(kTestSha1CryptoParams1).ok());
-  sender_result =
-      ortc_factory_->CreateRtpSender(GetParam(), srtp_transport_.get());
-  EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER, sender_result.error().type());
-  EXPECT_TRUE(srtp_transport_->SetSrtpReceiveKey(kTestSha1CryptoParams2).ok());
-  // Ensure that after the keys are set, a sender can be created, despite the
-  // previous errors.
-  sender_result =
-      ortc_factory_->CreateRtpSender(GetParam(), srtp_transport_.get());
-  EXPECT_TRUE(sender_result.ok());
-}
-
-// Tests that the receivers cannot be created before setting the keys.
-TEST_P(SrtpTransportTestWithMediaType, CreateReceiverBeforeSettingKeys) {
-  auto receiver_result =
-      ortc_factory_->CreateRtpReceiver(GetParam(), srtp_transport_.get());
-  EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
-            receiver_result.error().type());
-  EXPECT_TRUE(srtp_transport_->SetSrtpSendKey(kTestSha1CryptoParams1).ok());
-  receiver_result =
-      ortc_factory_->CreateRtpReceiver(GetParam(), srtp_transport_.get());
-  EXPECT_EQ(RTCErrorType::UNSUPPORTED_PARAMETER,
-            receiver_result.error().type());
-  EXPECT_TRUE(srtp_transport_->SetSrtpReceiveKey(kTestSha1CryptoParams2).ok());
-  // Ensure that after the keys are set, a receiver can be created, despite the
-  // previous errors.
-  receiver_result =
-      ortc_factory_->CreateRtpReceiver(GetParam(), srtp_transport_.get());
-  EXPECT_TRUE(receiver_result.ok());
-}
-
-INSTANTIATE_TEST_CASE_P(SenderCreatationTest,
-                        SrtpTransportTestWithMediaType,
-                        ::testing::Values(cricket::MEDIA_TYPE_AUDIO,
-                                          cricket::MEDIA_TYPE_VIDEO));
-
-}  // namespace webrtc
diff --git a/ortc/testrtpparameters.cc b/ortc/testrtpparameters.cc
deleted file mode 100644
index 5d1cdf9..0000000
--- a/ortc/testrtpparameters.cc
+++ /dev/null
@@ -1,315 +0,0 @@
-/*
- *  Copyright 2017 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/ortc/testrtpparameters.h"
-
-#include <algorithm>
-#include <utility>
-
-namespace webrtc {
-
-RtpParameters MakeMinimalOpusParameters() {
-  RtpParameters parameters;
-  RtpCodecParameters opus_codec;
-  opus_codec.name = "opus";
-  opus_codec.kind = cricket::MEDIA_TYPE_AUDIO;
-  opus_codec.payload_type = 111;
-  opus_codec.clock_rate.emplace(48000);
-  opus_codec.num_channels.emplace(2);
-  parameters.codecs.push_back(std::move(opus_codec));
-  RtpEncodingParameters encoding;
-  encoding.codec_payload_type.emplace(111);
-  parameters.encodings.push_back(std::move(encoding));
-  return parameters;
-}
-
-RtpParameters MakeMinimalIsacParameters() {
-  RtpParameters parameters;
-  RtpCodecParameters isac_codec;
-  isac_codec.name = "ISAC";
-  isac_codec.kind = cricket::MEDIA_TYPE_AUDIO;
-  isac_codec.payload_type = 103;
-  isac_codec.clock_rate.emplace(16000);
-  parameters.codecs.push_back(std::move(isac_codec));
-  RtpEncodingParameters encoding;
-  encoding.codec_payload_type.emplace(111);
-  parameters.encodings.push_back(std::move(encoding));
-  return parameters;
-}
-
-RtpParameters MakeMinimalOpusParametersWithSsrc(uint32_t ssrc) {
-  RtpParameters parameters = MakeMinimalOpusParameters();
-  parameters.encodings[0].ssrc.emplace(ssrc);
-  return parameters;
-}
-
-RtpParameters MakeMinimalIsacParametersWithSsrc(uint32_t ssrc) {
-  RtpParameters parameters = MakeMinimalIsacParameters();
-  parameters.encodings[0].ssrc.emplace(ssrc);
-  return parameters;
-}
-
-RtpParameters MakeMinimalVideoParameters(const char* codec_name) {
-  RtpParameters parameters;
-  RtpCodecParameters vp8_codec;
-  vp8_codec.name = codec_name;
-  vp8_codec.kind = cricket::MEDIA_TYPE_VIDEO;
-  vp8_codec.payload_type = 96;
-  parameters.codecs.push_back(std::move(vp8_codec));
-  RtpEncodingParameters encoding;
-  encoding.codec_payload_type.emplace(96);
-  parameters.encodings.push_back(std::move(encoding));
-  return parameters;
-}
-
-RtpParameters MakeMinimalVp8Parameters() {
-  return MakeMinimalVideoParameters("VP8");
-}
-
-RtpParameters MakeMinimalVp9Parameters() {
-  return MakeMinimalVideoParameters("VP9");
-}
-
-RtpParameters MakeMinimalVp8ParametersWithSsrc(uint32_t ssrc) {
-  RtpParameters parameters = MakeMinimalVp8Parameters();
-  parameters.encodings[0].ssrc.emplace(ssrc);
-  return parameters;
-}
-
-RtpParameters MakeMinimalVp9ParametersWithSsrc(uint32_t ssrc) {
-  RtpParameters parameters = MakeMinimalVp9Parameters();
-  parameters.encodings[0].ssrc.emplace(ssrc);
-  return parameters;
-}
-
-// Note: Currently, these "WithNoSsrc" methods are identical to the normal
-// "MakeMinimal" methods, but with the added guarantee that they will never be
-// changed to include an SSRC.
-
-RtpParameters MakeMinimalOpusParametersWithNoSsrc() {
-  RtpParameters parameters = MakeMinimalOpusParameters();
-  RTC_DCHECK(!parameters.encodings[0].ssrc);
-  return parameters;
-}
-
-RtpParameters MakeMinimalIsacParametersWithNoSsrc() {
-  RtpParameters parameters = MakeMinimalIsacParameters();
-  RTC_DCHECK(!parameters.encodings[0].ssrc);
-  return parameters;
-}
-
-RtpParameters MakeMinimalVp8ParametersWithNoSsrc() {
-  RtpParameters parameters = MakeMinimalVp8Parameters();
-  RTC_DCHECK(!parameters.encodings[0].ssrc);
-  return parameters;
-}
-
-RtpParameters MakeMinimalVp9ParametersWithNoSsrc() {
-  RtpParameters parameters = MakeMinimalVp9Parameters();
-  RTC_DCHECK(!parameters.encodings[0].ssrc);
-  return parameters;
-}
-
-// Make audio parameters with all the available properties configured and
-// features used, and with multiple codecs offered. Obtained by taking a
-// snapshot of a default PeerConnection offer (and adding other things, like
-// bitrate limit).
-//
-// See "MakeFullOpusParameters"/"MakeFullIsacParameters" below.
-RtpParameters MakeFullAudioParameters(int preferred_payload_type) {
-  RtpParameters parameters;
-
-  RtpCodecParameters opus_codec;
-  opus_codec.name = "opus";
-  opus_codec.kind = cricket::MEDIA_TYPE_AUDIO;
-  opus_codec.payload_type = 111;
-  opus_codec.clock_rate.emplace(48000);
-  opus_codec.num_channels.emplace(2);
-  opus_codec.parameters["minptime"] = "10";
-  opus_codec.parameters["useinbandfec"] = "1";
-  opus_codec.parameters["usedtx"] = "1";
-  opus_codec.parameters["stereo"] = "1";
-  opus_codec.rtcp_feedback.emplace_back(RtcpFeedbackType::TRANSPORT_CC);
-  parameters.codecs.push_back(std::move(opus_codec));
-
-  RtpCodecParameters isac_codec;
-  isac_codec.name = "ISAC";
-  isac_codec.kind = cricket::MEDIA_TYPE_AUDIO;
-  isac_codec.payload_type = 103;
-  isac_codec.clock_rate.emplace(16000);
-  parameters.codecs.push_back(std::move(isac_codec));
-
-  RtpCodecParameters cn_codec;
-  cn_codec.name = "CN";
-  cn_codec.kind = cricket::MEDIA_TYPE_AUDIO;
-  cn_codec.payload_type = 106;
-  cn_codec.clock_rate.emplace(32000);
-  parameters.codecs.push_back(std::move(cn_codec));
-
-  RtpCodecParameters dtmf_codec;
-  dtmf_codec.name = "telephone-event";
-  dtmf_codec.kind = cricket::MEDIA_TYPE_AUDIO;
-  dtmf_codec.payload_type = 126;
-  dtmf_codec.clock_rate.emplace(8000);
-  parameters.codecs.push_back(std::move(dtmf_codec));
-
-  // "codec_payload_type" isn't implemented, so we need to reorder codecs to
-  // cause one to be used.
-  // TODO(deadbeef): Remove this when it becomes unnecessary.
-  auto it = std::find_if(parameters.codecs.begin(), parameters.codecs.end(),
-                         [preferred_payload_type](const RtpCodecParameters& p) {
-                           return p.payload_type == preferred_payload_type;
-                         });
-  RtpCodecParameters preferred = *it;
-  parameters.codecs.erase(it);
-  parameters.codecs.insert(parameters.codecs.begin(), preferred);
-
-  // Intentionally leave out SSRC so one's chosen automatically.
-  RtpEncodingParameters encoding;
-  encoding.codec_payload_type.emplace(preferred_payload_type);
-  encoding.dtx.emplace(DtxStatus::ENABLED);
-  // 20 kbps.
-  encoding.max_bitrate_bps.emplace(20000);
-  parameters.encodings.push_back(std::move(encoding));
-
-  parameters.header_extensions.emplace_back(
-      "urn:ietf:params:rtp-hdrext:ssrc-audio-level", 1);
-  return parameters;
-}
-
-RtpParameters MakeFullOpusParameters() {
-  return MakeFullAudioParameters(111);
-}
-
-RtpParameters MakeFullIsacParameters() {
-  return MakeFullAudioParameters(103);
-}
-
-// Make video parameters with all the available properties configured and
-// features used, and with multiple codecs offered. Obtained by taking a
-// snapshot of a default PeerConnection offer (and adding other things, like
-// bitrate limit).
-//
-// See "MakeFullVp8Parameters"/"MakeFullVp9Parameters" below.
-RtpParameters MakeFullVideoParameters(int preferred_payload_type) {
-  RtpParameters parameters;
-
-  RtpCodecParameters vp8_codec;
-  vp8_codec.name = "VP8";
-  vp8_codec.kind = cricket::MEDIA_TYPE_VIDEO;
-  vp8_codec.payload_type = 100;
-  vp8_codec.clock_rate.emplace(90000);
-  vp8_codec.rtcp_feedback.emplace_back(RtcpFeedbackType::CCM,
-                                       RtcpFeedbackMessageType::FIR);
-  vp8_codec.rtcp_feedback.emplace_back(RtcpFeedbackType::NACK,
-                                       RtcpFeedbackMessageType::GENERIC_NACK);
-  vp8_codec.rtcp_feedback.emplace_back(RtcpFeedbackType::NACK,
-                                       RtcpFeedbackMessageType::PLI);
-  vp8_codec.rtcp_feedback.emplace_back(RtcpFeedbackType::REMB);
-  vp8_codec.rtcp_feedback.emplace_back(RtcpFeedbackType::TRANSPORT_CC);
-  parameters.codecs.push_back(std::move(vp8_codec));
-
-  RtpCodecParameters vp8_rtx_codec;
-  vp8_rtx_codec.name = "rtx";
-  vp8_rtx_codec.kind = cricket::MEDIA_TYPE_VIDEO;
-  vp8_rtx_codec.payload_type = 96;
-  vp8_rtx_codec.clock_rate.emplace(90000);
-  vp8_rtx_codec.parameters["apt"] = "100";
-  parameters.codecs.push_back(std::move(vp8_rtx_codec));
-
-  RtpCodecParameters vp9_codec;
-  vp9_codec.name = "VP9";
-  vp9_codec.kind = cricket::MEDIA_TYPE_VIDEO;
-  vp9_codec.payload_type = 101;
-  vp9_codec.clock_rate.emplace(90000);
-  vp9_codec.rtcp_feedback.emplace_back(RtcpFeedbackType::CCM,
-                                       RtcpFeedbackMessageType::FIR);
-  vp9_codec.rtcp_feedback.emplace_back(RtcpFeedbackType::NACK,
-                                       RtcpFeedbackMessageType::GENERIC_NACK);
-  vp9_codec.rtcp_feedback.emplace_back(RtcpFeedbackType::NACK,
-                                       RtcpFeedbackMessageType::PLI);
-  vp9_codec.rtcp_feedback.emplace_back(RtcpFeedbackType::REMB);
-  vp9_codec.rtcp_feedback.emplace_back(RtcpFeedbackType::TRANSPORT_CC);
-  parameters.codecs.push_back(std::move(vp9_codec));
-
-  RtpCodecParameters vp9_rtx_codec;
-  vp9_rtx_codec.name = "rtx";
-  vp9_rtx_codec.kind = cricket::MEDIA_TYPE_VIDEO;
-  vp9_rtx_codec.payload_type = 97;
-  vp9_rtx_codec.clock_rate.emplace(90000);
-  vp9_rtx_codec.parameters["apt"] = "101";
-  parameters.codecs.push_back(std::move(vp9_rtx_codec));
-
-  RtpCodecParameters red_codec;
-  red_codec.name = "red";
-  red_codec.kind = cricket::MEDIA_TYPE_VIDEO;
-  red_codec.payload_type = 116;
-  red_codec.clock_rate.emplace(90000);
-  parameters.codecs.push_back(std::move(red_codec));
-
-  RtpCodecParameters red_rtx_codec;
-  red_rtx_codec.name = "rtx";
-  red_rtx_codec.kind = cricket::MEDIA_TYPE_VIDEO;
-  red_rtx_codec.payload_type = 98;
-  red_rtx_codec.clock_rate.emplace(90000);
-  red_rtx_codec.parameters["apt"] = "116";
-  parameters.codecs.push_back(std::move(red_rtx_codec));
-
-  RtpCodecParameters ulpfec_codec;
-  ulpfec_codec.name = "ulpfec";
-  ulpfec_codec.kind = cricket::MEDIA_TYPE_VIDEO;
-  ulpfec_codec.payload_type = 117;
-  ulpfec_codec.clock_rate.emplace(90000);
-  parameters.codecs.push_back(std::move(ulpfec_codec));
-
-  // "codec_payload_type" isn't implemented, so we need to reorder codecs to
-  // cause one to be used.
-  // TODO(deadbeef): Remove this when it becomes unnecessary.
-  auto it = std::find_if(parameters.codecs.begin(), parameters.codecs.end(),
-                         [preferred_payload_type](const RtpCodecParameters& p) {
-                           return p.payload_type == preferred_payload_type;
-                         });
-  RtpCodecParameters preferred = *it;
-  parameters.codecs.erase(it);
-  parameters.codecs.insert(parameters.codecs.begin(), preferred);
-
-  // Intentionally leave out SSRC so one's chosen automatically.
-  RtpEncodingParameters encoding;
-  encoding.codec_payload_type.emplace(preferred_payload_type);
-  encoding.fec.emplace(FecMechanism::RED_AND_ULPFEC);
-  // Will create default RtxParameters, with unset SSRC.
-  encoding.rtx.emplace();
-  // 100 kbps.
-  encoding.max_bitrate_bps.emplace(100000);
-  parameters.encodings.push_back(std::move(encoding));
-
-  parameters.header_extensions.emplace_back(
-      "urn:ietf:params:rtp-hdrext:toffset", 2);
-  parameters.header_extensions.emplace_back(
-      "http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time", 3);
-  parameters.header_extensions.emplace_back("urn:3gpp:video-orientation", 4);
-  parameters.header_extensions.emplace_back(
-      "http://www.ietf.org/id/"
-      "draft-holmer-rmcat-transport-wide-cc-extensions-01",
-      5);
-  parameters.header_extensions.emplace_back(
-      "http://www.webrtc.org/experiments/rtp-hdrext/playout-delay", 6);
-  return parameters;
-}
-
-RtpParameters MakeFullVp8Parameters() {
-  return MakeFullVideoParameters(100);
-}
-
-RtpParameters MakeFullVp9Parameters() {
-  return MakeFullVideoParameters(101);
-}
-
-}  // namespace webrtc
diff --git a/ortc/testrtpparameters.h b/ortc/testrtpparameters.h
deleted file mode 100644
index 042dab2..0000000
--- a/ortc/testrtpparameters.h
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- *  Copyright 2017 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_ORTC_TESTRTPPARAMETERS_H_
-#define WEBRTC_ORTC_TESTRTPPARAMETERS_H_
-
-#include "webrtc/api/ortc/rtptransportinterface.h"
-#include "webrtc/api/rtpparameters.h"
-
-namespace webrtc {
-
-// Helper methods to create RtpParameters to use for sending/receiving.
-//
-// "MakeMinimal" methods contain the minimal necessary information for an
-// RtpSender or RtpReceiver to function. The "MakeFull" methods are the
-// opposite, and include all features that would normally be offered by a
-// PeerConnection, and in some cases additional ones.
-//
-// These methods are intended to be used for end-to-end testing (such as in
-// ortcfactory_integrationtest.cc), or unit testing that doesn't care about the
-// specific contents of the parameters. Tests should NOT assume that these
-// methods will not change; tests that are testing that a specific value in the
-// parameters is applied properly should construct the parameters in the test
-// itself.
-
-inline RtpTransportParameters MakeRtcpMuxParameters() {
-  RtpTransportParameters parameters;
-  parameters.rtcp.mux = true;
-  return parameters;
-}
-
-RtpParameters MakeMinimalOpusParameters();
-RtpParameters MakeMinimalIsacParameters();
-RtpParameters MakeMinimalOpusParametersWithSsrc(uint32_t ssrc);
-RtpParameters MakeMinimalIsacParametersWithSsrc(uint32_t ssrc);
-
-RtpParameters MakeMinimalVp8Parameters();
-RtpParameters MakeMinimalVp9Parameters();
-RtpParameters MakeMinimalVp8ParametersWithSsrc(uint32_t ssrc);
-RtpParameters MakeMinimalVp9ParametersWithSsrc(uint32_t ssrc);
-
-// Will create an encoding with no SSRC (meaning "match first SSRC seen" for a
-// receiver, or "pick one automatically" for a sender).
-RtpParameters MakeMinimalOpusParametersWithNoSsrc();
-RtpParameters MakeMinimalIsacParametersWithNoSsrc();
-RtpParameters MakeMinimalVp8ParametersWithNoSsrc();
-RtpParameters MakeMinimalVp9ParametersWithNoSsrc();
-
-// Make audio parameters with all the available properties configured and
-// features used, and with multiple codecs offered. Obtained by taking a
-// snapshot of a default PeerConnection offer (and adding other things, like
-// bitrate limit).
-RtpParameters MakeFullOpusParameters();
-RtpParameters MakeFullIsacParameters();
-
-// Make video parameters with all the available properties configured and
-// features used, and with multiple codecs offered. Obtained by taking a
-// snapshot of a default PeerConnection offer (and adding other things, like
-// bitrate limit).
-RtpParameters MakeFullVp8Parameters();
-RtpParameters MakeFullVp9Parameters();
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_ORTC_TESTRTPPARAMETERS_H_
diff --git a/p2p/BUILD.gn b/p2p/BUILD.gn
deleted file mode 100644
index 9223f86..0000000
--- a/p2p/BUILD.gn
+++ /dev/null
@@ -1,274 +0,0 @@
-# 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.
-
-import("../webrtc.gni")
-
-group("p2p") {
-  public_deps = [
-    ":libstunprober",
-    ":rtc_p2p",
-  ]
-}
-
-config("rtc_p2p_inherited_config") {
-  defines = [ "FEATURE_ENABLE_VOICEMAIL" ]
-}
-
-rtc_static_library("rtc_p2p") {
-  sources = [
-    "base/asyncstuntcpsocket.cc",
-    "base/asyncstuntcpsocket.h",
-    "base/basicpacketsocketfactory.cc",
-    "base/basicpacketsocketfactory.h",
-    "base/candidate.h",
-    "base/common.h",
-    "base/dtlstransport.cc",
-    "base/dtlstransport.h",
-    "base/dtlstransportinternal.h",
-    "base/icetransportinternal.h",
-    "base/jseptransport.cc",
-    "base/jseptransport.h",
-    "base/p2pconstants.cc",
-    "base/p2pconstants.h",
-    "base/p2ptransportchannel.cc",
-    "base/p2ptransportchannel.h",
-    "base/packetlossestimator.cc",
-    "base/packetlossestimator.h",
-    "base/packetsocketfactory.h",
-    "base/packettransportinterface.h",
-    "base/packettransportinternal.h",
-    "base/port.cc",
-    "base/port.h",
-    "base/portallocator.cc",
-    "base/portallocator.h",
-    "base/portinterface.h",
-    "base/pseudotcp.cc",
-    "base/pseudotcp.h",
-    "base/relayport.cc",
-    "base/relayport.h",
-    "base/session.cc",
-    "base/session.h",
-    "base/sessiondescription.cc",
-    "base/sessiondescription.h",
-    "base/stun.cc",
-    "base/stun.h",
-    "base/stunport.cc",
-    "base/stunport.h",
-    "base/stunrequest.cc",
-    "base/stunrequest.h",
-    "base/tcpport.cc",
-    "base/tcpport.h",
-    "base/transport.h",
-    "base/transportcontroller.cc",
-    "base/transportcontroller.h",
-    "base/transportdescription.cc",
-    "base/transportdescription.h",
-    "base/transportdescriptionfactory.cc",
-    "base/transportdescriptionfactory.h",
-    "base/transportinfo.h",
-    "base/turnport.cc",
-    "base/turnport.h",
-    "base/udpport.h",
-    "base/udptransport.cc",
-    "base/udptransport.h",
-    "client/basicportallocator.cc",
-    "client/basicportallocator.h",
-    "client/socketmonitor.cc",
-    "client/socketmonitor.h",
-  ]
-
-  defines = []
-
-  deps = [
-    "../api:libjingle_peerconnection_api",
-    "../api:optional",
-    "../api:ortc_api",
-    "../rtc_base:rtc_base",
-    "../system_wrappers:field_trial_api",
-  ]
-
-  public_configs = [ ":rtc_p2p_inherited_config" ]
-
-  if (build_with_chromium) {
-    if (is_nacl) {
-      deps += [ "//native_client_sdk/src/libraries/nacl_io" ]
-    }
-  } else {
-    sources += [
-      "base/relayserver.cc",
-      "base/relayserver.h",
-      "base/stunserver.cc",
-      "base/stunserver.h",
-      "base/turnserver.cc",
-      "base/turnserver.h",
-    ]
-    defines += [
-      "FEATURE_ENABLE_VOICEMAIL",
-      "FEATURE_ENABLE_PSTN",
-    ]
-
-    if (!build_with_chromium && is_clang) {
-      # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-    }
-  }
-
-  if (rtc_use_quic) {
-    deps = [
-      "//third_party/libquic",
-    ]
-    sources += [
-      "quic/quicconnectionhelper.cc",
-      "quic/quicconnectionhelper.h",
-      "quic/quicsession.cc",
-      "quic/quicsession.h",
-      "quic/quictransport.cc",
-      "quic/quictransport.h",
-      "quic/quictransportchannel.cc",
-      "quic/quictransportchannel.h",
-      "quic/reliablequicstream.cc",
-      "quic/reliablequicstream.h",
-    ]
-    public_deps += [ "//third_party/libquic" ]
-  }
-}
-
-if (rtc_include_tests) {
-  rtc_source_set("p2p_test_utils") {
-    testonly = true
-    sources = [
-      "base/fakecandidatepair.h",
-      "base/fakedtlstransport.h",
-      "base/fakeicetransport.h",
-      "base/fakepackettransport.h",
-      "base/fakeportallocator.h",
-      "base/faketransportcontroller.h",
-      "base/mockicetransport.h",
-      "base/testrelayserver.h",
-      "base/teststunserver.h",
-      "base/testturnserver.h",
-    ]
-    deps = [
-      ":rtc_p2p",
-      "../api:ortc_api",
-      "../rtc_base:rtc_base",
-      "../rtc_base:rtc_base_approved",
-      "../rtc_base:rtc_base_tests_utils",
-      "../test:test_support",
-      "//testing/gmock",
-    ]
-  }
-
-  rtc_source_set("rtc_p2p_unittests") {
-    testonly = true
-
-    # Skip restricting visibility on mobile platforms since the tests on those
-    # gets additional generated targets which would require many lines here to
-    # cover (which would be confusing to read and hard to maintain).
-    if (!is_android && !is_ios) {
-      visibility = [ "..:rtc_unittests" ]
-    }
-    sources = [
-      "base/asyncstuntcpsocket_unittest.cc",
-      "base/dtlstransport_unittest.cc",
-      "base/jseptransport_unittest.cc",
-      "base/p2ptransportchannel_unittest.cc",
-      "base/packetlossestimator_unittest.cc",
-      "base/port_unittest.cc",
-      "base/portallocator_unittest.cc",
-      "base/pseudotcp_unittest.cc",
-      "base/relayport_unittest.cc",
-      "base/relayserver_unittest.cc",
-      "base/stun_unittest.cc",
-      "base/stunport_unittest.cc",
-      "base/stunrequest_unittest.cc",
-      "base/stunserver_unittest.cc",
-      "base/tcpport_unittest.cc",
-      "base/transportcontroller_unittest.cc",
-      "base/transportdescriptionfactory_unittest.cc",
-      "base/turnport_unittest.cc",
-      "base/turnserver_unittest.cc",
-      "base/udptransport_unittest.cc",
-      "client/basicportallocator_unittest.cc",
-    ]
-    if (rtc_use_quic) {
-      sources += [
-        "quic/quicconnectionhelper_unittest.cc",
-        "quic/quicsession_unittest.cc",
-        "quic/quictransport_unittest.cc",
-        "quic/quictransportchannel_unittest.cc",
-        "quic/reliablequicstream_unittest.cc",
-      ]
-    }
-    deps = [
-      ":p2p_test_utils",
-      ":rtc_p2p",
-      "../api:fakemetricsobserver",
-      "../api:ortc_api",
-      "../rtc_base:rtc_base",
-      "../rtc_base:rtc_base_approved",
-      "../rtc_base:rtc_base_tests_utils",
-      "../test:test_support",
-      "//testing/gmock",
-      "//testing/gtest",
-    ]
-    if (!build_with_chromium && is_clang) {
-      # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-    }
-    defines = [ "GTEST_RELATIVE_PATH" ]
-  }
-}
-
-rtc_static_library("libstunprober") {
-  sources = [
-    "stunprober/stunprober.cc",
-  ]
-
-  if (!build_with_chromium && is_clang) {
-    # Suppress warnings from Chrome's Clang plugins.
-    # See http://code.google.com/p/webrtc/issues/detail?id=163 for details.
-    suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-  }
-
-  deps = [
-    ":rtc_p2p",
-    "..:webrtc_common",
-    "../rtc_base:rtc_base",
-  ]
-}
-
-if (rtc_include_tests) {
-  rtc_source_set("libstunprober_unittests") {
-    testonly = true
-
-    # Skip restricting visibility on mobile platforms since the tests on those
-    # gets additional generated targets which would require many lines here to
-    # cover (which would be confusing to read and hard to maintain).
-    if (!is_android && !is_ios) {
-      visibility = [ "..:rtc_unittests" ]
-    }
-    sources = [
-      "stunprober/stunprober_unittest.cc",
-    ]
-    deps = [
-      ":libstunprober",
-      ":p2p_test_utils",
-      ":rtc_p2p",
-      "../rtc_base:rtc_base",
-      "../rtc_base:rtc_base_tests_utils",
-      "//testing/gmock",
-      "//testing/gtest",
-    ]
-    if (!build_with_chromium && is_clang) {
-      # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-    }
-    defines = [ "GTEST_RELATIVE_PATH" ]
-  }
-}
diff --git a/p2p/DEPS b/p2p/DEPS
deleted file mode 100644
index 083e8d4..0000000
--- a/p2p/DEPS
+++ /dev/null
@@ -1,4 +0,0 @@
-include_rules = [
-  "+net",
-  "+webrtc/system_wrappers",
-]
diff --git a/p2p/OWNERS b/p2p/OWNERS
deleted file mode 100644
index 26beddd..0000000
--- a/p2p/OWNERS
+++ /dev/null
@@ -1,17 +0,0 @@
-henrika@webrtc.org
-henrikg@webrtc.org
-hta@webrtc.org
-jiayl@webrtc.org
-juberti@webrtc.org
-mflodman@webrtc.org
-perkj@webrtc.org
-pthatcher@webrtc.org
-sergeyu@chromium.org
-tommi@webrtc.org
-deadbeef@webrtc.org
-honghaiz@webrtc.org
-
-# These are for the common case of adding or renaming files. If you're doing
-# structural changes, please get a review from a reviewer in this file.
-per-file *.gn=*
-per-file *.gni=*
diff --git a/p2p/base/asyncstuntcpsocket.cc b/p2p/base/asyncstuntcpsocket.cc
deleted file mode 100644
index 38dd65b..0000000
--- a/p2p/base/asyncstuntcpsocket.cc
+++ /dev/null
@@ -1,156 +0,0 @@
-/*
- *  Copyright 2013 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/p2p/base/asyncstuntcpsocket.h"
-
-#include <string.h>
-
-#include "webrtc/p2p/base/stun.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-
-namespace cricket {
-
-static const size_t kMaxPacketSize = 64 * 1024;
-
-typedef uint16_t PacketLength;
-static const size_t kPacketLenSize = sizeof(PacketLength);
-static const size_t kPacketLenOffset = 2;
-static const size_t kBufSize = kMaxPacketSize + kStunHeaderSize;
-static const size_t kTurnChannelDataHdrSize = 4;
-
-inline bool IsStunMessage(uint16_t msg_type) {
-  // The first two bits of a channel data message are 0b01.
-  return (msg_type & 0xC000) ? false : true;
-}
-
-// AsyncStunTCPSocket
-// Binds and connects |socket| and creates AsyncTCPSocket for
-// it. Takes ownership of |socket|. Returns NULL if bind() or
-// connect() fail (|socket| is destroyed in that case).
-AsyncStunTCPSocket* AsyncStunTCPSocket::Create(
-    rtc::AsyncSocket* socket,
-    const rtc::SocketAddress& bind_address,
-    const rtc::SocketAddress& remote_address) {
-  return new AsyncStunTCPSocket(AsyncTCPSocketBase::ConnectSocket(
-      socket, bind_address, remote_address), false);
-}
-
-AsyncStunTCPSocket::AsyncStunTCPSocket(
-    rtc::AsyncSocket* socket, bool listen)
-    : rtc::AsyncTCPSocketBase(socket, listen, kBufSize) {
-}
-
-int AsyncStunTCPSocket::Send(const void *pv, size_t cb,
-                             const rtc::PacketOptions& options) {
-  if (cb > kBufSize || cb < kPacketLenSize + kPacketLenOffset) {
-    SetError(EMSGSIZE);
-    return -1;
-  }
-
-  // If we are blocking on send, then silently drop this packet
-  if (!IsOutBufferEmpty())
-    return static_cast<int>(cb);
-
-  int pad_bytes;
-  size_t expected_pkt_len = GetExpectedLength(pv, cb, &pad_bytes);
-
-  // Accepts only complete STUN/ChannelData packets.
-  if (cb != expected_pkt_len)
-    return -1;
-
-  AppendToOutBuffer(pv, cb);
-
-  RTC_DCHECK(pad_bytes < 4);
-  char padding[4] = {0};
-  AppendToOutBuffer(padding, pad_bytes);
-
-  int res = FlushOutBuffer();
-  if (res <= 0) {
-    // drop packet if we made no progress
-    ClearOutBuffer();
-    return res;
-  }
-
-  rtc::SentPacket sent_packet(options.packet_id, rtc::TimeMillis());
-  SignalSentPacket(this, sent_packet);
-
-  // We claim to have sent the whole thing, even if we only sent partial
-  return static_cast<int>(cb);
-}
-
-void AsyncStunTCPSocket::ProcessInput(char* data, size_t* len) {
-  rtc::SocketAddress remote_addr(GetRemoteAddress());
-  // STUN packet - First 4 bytes. Total header size is 20 bytes.
-  // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-  // |0 0|     STUN Message Type     |         Message Length        |
-  // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-
-  // TURN ChannelData
-  // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-  // |         Channel Number        |            Length             |
-  // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-
-  while (true) {
-    // We need at least 4 bytes to read the STUN or ChannelData packet length.
-    if (*len < kPacketLenOffset + kPacketLenSize)
-      return;
-
-    int pad_bytes;
-    size_t expected_pkt_len = GetExpectedLength(data, *len, &pad_bytes);
-    size_t actual_length = expected_pkt_len + pad_bytes;
-
-    if (*len < actual_length) {
-      return;
-    }
-
-    SignalReadPacket(this, data, expected_pkt_len, remote_addr,
-                     rtc::CreatePacketTime(0));
-
-    *len -= actual_length;
-    if (*len > 0) {
-      memmove(data, data + actual_length, *len);
-    }
-  }
-}
-
-void AsyncStunTCPSocket::HandleIncomingConnection(
-    rtc::AsyncSocket* socket) {
-  SignalNewConnection(this, new AsyncStunTCPSocket(socket, false));
-}
-
-size_t AsyncStunTCPSocket::GetExpectedLength(const void* data, size_t len,
-                                             int* pad_bytes) {
-  *pad_bytes = 0;
-  PacketLength pkt_len =
-      rtc::GetBE16(static_cast<const char*>(data) + kPacketLenOffset);
-  size_t expected_pkt_len;
-  uint16_t msg_type = rtc::GetBE16(data);
-  if (IsStunMessage(msg_type)) {
-    // STUN message.
-    expected_pkt_len = kStunHeaderSize + pkt_len;
-  } else {
-    // TURN ChannelData message.
-    expected_pkt_len = kTurnChannelDataHdrSize + pkt_len;
-    // From RFC 5766 section 11.5
-    // Over TCP and TLS-over-TCP, the ChannelData message MUST be padded to
-    // a multiple of four bytes in order to ensure the alignment of
-    // subsequent messages.  The padding is not reflected in the length
-    // field of the ChannelData message, so the actual size of a ChannelData
-    // message (including padding) is (4 + Length) rounded up to the nearest
-    // multiple of 4.  Over UDP, the padding is not required but MAY be
-    // included.
-    if (expected_pkt_len % 4)
-      *pad_bytes = 4 - (expected_pkt_len % 4);
-  }
-  return expected_pkt_len;
-}
-
-}  // namespace cricket
diff --git a/p2p/base/asyncstuntcpsocket.h b/p2p/base/asyncstuntcpsocket.h
deleted file mode 100644
index b578f31..0000000
--- a/p2p/base/asyncstuntcpsocket.h
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- *  Copyright 2013 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_P2P_BASE_ASYNCSTUNTCPSOCKET_H_
-#define WEBRTC_P2P_BASE_ASYNCSTUNTCPSOCKET_H_
-
-#include "webrtc/rtc_base/asynctcpsocket.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/socketfactory.h"
-
-namespace cricket {
-
-class AsyncStunTCPSocket : public rtc::AsyncTCPSocketBase {
- public:
-  // Binds and connects |socket| and creates AsyncTCPSocket for
-  // it. Takes ownership of |socket|. Returns NULL if bind() or
-  // connect() fail (|socket| is destroyed in that case).
-  static AsyncStunTCPSocket* Create(
-      rtc::AsyncSocket* socket,
-      const rtc::SocketAddress& bind_address,
-      const rtc::SocketAddress& remote_address);
-
-  AsyncStunTCPSocket(rtc::AsyncSocket* socket, bool listen);
-  virtual ~AsyncStunTCPSocket() {}
-
-  virtual int Send(const void* pv, size_t cb,
-                   const rtc::PacketOptions& options);
-  virtual void ProcessInput(char* data, size_t* len);
-  virtual void HandleIncomingConnection(rtc::AsyncSocket* socket);
-
- private:
-  // This method returns the message hdr + length written in the header.
-  // This method also returns the number of padding bytes needed/added to the
-  // turn message. |pad_bytes| should be used only when |is_turn| is true.
-  size_t GetExpectedLength(const void* data, size_t len,
-                           int* pad_bytes);
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(AsyncStunTCPSocket);
-};
-
-}  // namespace cricket
-
-#endif  // WEBRTC_P2P_BASE_ASYNCSTUNTCPSOCKET_H_
diff --git a/p2p/base/asyncstuntcpsocket_unittest.cc b/p2p/base/asyncstuntcpsocket_unittest.cc
deleted file mode 100644
index 5dd9661..0000000
--- a/p2p/base/asyncstuntcpsocket_unittest.cc
+++ /dev/null
@@ -1,291 +0,0 @@
-/*
- *  Copyright 2013 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 <memory>
-
-#include "webrtc/p2p/base/asyncstuntcpsocket.h"
-#include "webrtc/rtc_base/asyncsocket.h"
-#include "webrtc/rtc_base/gunit.h"
-#include "webrtc/rtc_base/virtualsocketserver.h"
-
-namespace cricket {
-
-static unsigned char kStunMessageWithZeroLength[] = {
-  0x00, 0x01, 0x00, 0x00,  // length of 0 (last 2 bytes)
-  0x21, 0x12, 0xA4, 0x42,
-  '0', '1', '2', '3',
-  '4', '5', '6', '7',
-  '8', '9', 'a', 'b',
-};
-
-
-static unsigned char kTurnChannelDataMessageWithZeroLength[] = {
-  0x40, 0x00, 0x00, 0x00,  // length of 0 (last 2 bytes)
-};
-
-static unsigned char kTurnChannelDataMessage[] = {
-  0x40, 0x00, 0x00, 0x10,
-  0x21, 0x12, 0xA4, 0x42,
-  '0', '1', '2', '3',
-  '4', '5', '6', '7',
-  '8', '9', 'a', 'b',
-};
-
-static unsigned char kStunMessageWithInvalidLength[] = {
-  0x00, 0x01, 0x00, 0x10,
-  0x21, 0x12, 0xA4, 0x42,
-  '0', '1', '2', '3',
-  '4', '5', '6', '7',
-  '8', '9', 'a', 'b',
-};
-
-static unsigned char kTurnChannelDataMessageWithInvalidLength[] = {
-  0x80, 0x00, 0x00, 0x20,
-  0x21, 0x12, 0xA4, 0x42,
-  '0', '1', '2', '3',
-  '4', '5', '6', '7',
-  '8', '9', 'a', 'b',
-};
-
-static unsigned char kTurnChannelDataMessageWithOddLength[] = {
-  0x40, 0x00, 0x00, 0x05,
-  0x21, 0x12, 0xA4, 0x42,
-  '0',
-};
-
-
-static const rtc::SocketAddress kClientAddr("11.11.11.11", 0);
-static const rtc::SocketAddress kServerAddr("22.22.22.22", 0);
-
-class AsyncStunTCPSocketTest : public testing::Test,
-                               public sigslot::has_slots<> {
- protected:
-  AsyncStunTCPSocketTest()
-      : vss_(new rtc::VirtualSocketServer()), thread_(vss_.get()) {}
-
-  virtual void SetUp() {
-    CreateSockets();
-  }
-
-  void CreateSockets() {
-    rtc::AsyncSocket* server = vss_->CreateAsyncSocket(
-        kServerAddr.family(), SOCK_STREAM);
-    server->Bind(kServerAddr);
-    recv_socket_.reset(new AsyncStunTCPSocket(server, true));
-    recv_socket_->SignalNewConnection.connect(
-        this, &AsyncStunTCPSocketTest::OnNewConnection);
-
-    rtc::AsyncSocket* client = vss_->CreateAsyncSocket(
-        kClientAddr.family(), SOCK_STREAM);
-    send_socket_.reset(AsyncStunTCPSocket::Create(
-        client, kClientAddr, recv_socket_->GetLocalAddress()));
-    send_socket_->SignalSentPacket.connect(
-        this, &AsyncStunTCPSocketTest::OnSentPacket);
-    ASSERT_TRUE(send_socket_.get() != NULL);
-    vss_->ProcessMessagesUntilIdle();
-  }
-
-  void OnReadPacket(rtc::AsyncPacketSocket* socket, const char* data,
-                    size_t len, const rtc::SocketAddress& remote_addr,
-                    const rtc::PacketTime& packet_time) {
-    recv_packets_.push_back(std::string(data, len));
-  }
-
-  void OnSentPacket(rtc::AsyncPacketSocket* socket,
-                    const rtc::SentPacket& packet) {
-    ++sent_packets_;
-  }
-
-  void OnNewConnection(rtc::AsyncPacketSocket* server,
-                       rtc::AsyncPacketSocket* new_socket) {
-    listen_socket_.reset(new_socket);
-    new_socket->SignalReadPacket.connect(
-        this, &AsyncStunTCPSocketTest::OnReadPacket);
-  }
-
-  bool Send(const void* data, size_t len) {
-    rtc::PacketOptions options;
-    size_t ret = send_socket_->Send(
-        reinterpret_cast<const char*>(data), len, options);
-    vss_->ProcessMessagesUntilIdle();
-    return (ret == len);
-  }
-
-  bool CheckData(const void* data, int len) {
-    bool ret = false;
-    if (recv_packets_.size()) {
-      std::string packet =  recv_packets_.front();
-      recv_packets_.pop_front();
-      ret = (memcmp(data, packet.c_str(), len) == 0);
-    }
-    return ret;
-  }
-
-  std::unique_ptr<rtc::VirtualSocketServer> vss_;
-  rtc::AutoSocketServerThread thread_;
-  std::unique_ptr<AsyncStunTCPSocket> send_socket_;
-  std::unique_ptr<AsyncStunTCPSocket> recv_socket_;
-  std::unique_ptr<rtc::AsyncPacketSocket> listen_socket_;
-  std::list<std::string> recv_packets_;
-  int sent_packets_ = 0;
-};
-
-// Testing a stun packet sent/recv properly.
-TEST_F(AsyncStunTCPSocketTest, TestSingleStunPacket) {
-  EXPECT_TRUE(Send(kStunMessageWithZeroLength,
-                   sizeof(kStunMessageWithZeroLength)));
-  EXPECT_EQ(1u, recv_packets_.size());
-  EXPECT_TRUE(CheckData(kStunMessageWithZeroLength,
-                        sizeof(kStunMessageWithZeroLength)));
-}
-
-// Verify sending multiple packets.
-TEST_F(AsyncStunTCPSocketTest, TestMultipleStunPackets) {
-  EXPECT_TRUE(Send(kStunMessageWithZeroLength,
-                   sizeof(kStunMessageWithZeroLength)));
-  EXPECT_TRUE(Send(kStunMessageWithZeroLength,
-                   sizeof(kStunMessageWithZeroLength)));
-  EXPECT_TRUE(Send(kStunMessageWithZeroLength,
-                   sizeof(kStunMessageWithZeroLength)));
-  EXPECT_TRUE(Send(kStunMessageWithZeroLength,
-                   sizeof(kStunMessageWithZeroLength)));
-  EXPECT_EQ(4u, recv_packets_.size());
-}
-
-// Verifying TURN channel data message with zero length.
-TEST_F(AsyncStunTCPSocketTest, TestTurnChannelDataWithZeroLength) {
-  EXPECT_TRUE(Send(kTurnChannelDataMessageWithZeroLength,
-                   sizeof(kTurnChannelDataMessageWithZeroLength)));
-  EXPECT_EQ(1u, recv_packets_.size());
-  EXPECT_TRUE(CheckData(kTurnChannelDataMessageWithZeroLength,
-                        sizeof(kTurnChannelDataMessageWithZeroLength)));
-}
-
-// Verifying TURN channel data message.
-TEST_F(AsyncStunTCPSocketTest, TestTurnChannelData) {
-  EXPECT_TRUE(Send(kTurnChannelDataMessage,
-                   sizeof(kTurnChannelDataMessage)));
-  EXPECT_EQ(1u, recv_packets_.size());
-  EXPECT_TRUE(CheckData(kTurnChannelDataMessage,
-                        sizeof(kTurnChannelDataMessage)));
-}
-
-// Verifying TURN channel messages which needs padding handled properly.
-TEST_F(AsyncStunTCPSocketTest, TestTurnChannelDataPadding) {
-  EXPECT_TRUE(Send(kTurnChannelDataMessageWithOddLength,
-                   sizeof(kTurnChannelDataMessageWithOddLength)));
-  EXPECT_EQ(1u, recv_packets_.size());
-  EXPECT_TRUE(CheckData(kTurnChannelDataMessageWithOddLength,
-                        sizeof(kTurnChannelDataMessageWithOddLength)));
-}
-
-// Verifying stun message with invalid length.
-TEST_F(AsyncStunTCPSocketTest, TestStunInvalidLength) {
-  EXPECT_FALSE(Send(kStunMessageWithInvalidLength,
-                    sizeof(kStunMessageWithInvalidLength)));
-  EXPECT_EQ(0u, recv_packets_.size());
-
-  // Modify the message length to larger value.
-  kStunMessageWithInvalidLength[2] = 0xFF;
-  kStunMessageWithInvalidLength[3] = 0xFF;
-  EXPECT_FALSE(Send(kStunMessageWithInvalidLength,
-                    sizeof(kStunMessageWithInvalidLength)));
-
-  // Modify the message length to smaller value.
-  kStunMessageWithInvalidLength[2] = 0x00;
-  kStunMessageWithInvalidLength[3] = 0x01;
-  EXPECT_FALSE(Send(kStunMessageWithInvalidLength,
-                    sizeof(kStunMessageWithInvalidLength)));
-}
-
-// Verifying TURN channel data message with invalid length.
-TEST_F(AsyncStunTCPSocketTest, TestTurnChannelDataWithInvalidLength) {
-  EXPECT_FALSE(Send(kTurnChannelDataMessageWithInvalidLength,
-                   sizeof(kTurnChannelDataMessageWithInvalidLength)));
-  // Modify the length to larger value.
-  kTurnChannelDataMessageWithInvalidLength[2] = 0xFF;
-  kTurnChannelDataMessageWithInvalidLength[3] = 0xF0;
-  EXPECT_FALSE(Send(kTurnChannelDataMessageWithInvalidLength,
-                   sizeof(kTurnChannelDataMessageWithInvalidLength)));
-
-  // Modify the length to smaller value.
-  kTurnChannelDataMessageWithInvalidLength[2] = 0x00;
-  kTurnChannelDataMessageWithInvalidLength[3] = 0x00;
-  EXPECT_FALSE(Send(kTurnChannelDataMessageWithInvalidLength,
-                   sizeof(kTurnChannelDataMessageWithInvalidLength)));
-}
-
-// Verifying a small buffer handled (dropped) properly. This will be
-// a common one for both stun and turn.
-TEST_F(AsyncStunTCPSocketTest, TestTooSmallMessageBuffer) {
-  char data[1];
-  EXPECT_FALSE(Send(data, sizeof(data)));
-}
-
-// Verifying a legal large turn message.
-TEST_F(AsyncStunTCPSocketTest, TestMaximumSizeTurnPacket) {
-  // We have problem in getting the SignalWriteEvent from the virtual socket
-  // server. So increasing the send buffer to 64k.
-  // TODO(mallinath) - Remove this setting after we fix vss issue.
-  vss_->set_send_buffer_capacity(64 * 1024);
-  unsigned char packet[65539];
-  packet[0] = 0x40;
-  packet[1] = 0x00;
-  packet[2] = 0xFF;
-  packet[3] = 0xFF;
-  EXPECT_TRUE(Send(packet, sizeof(packet)));
-}
-
-// Verifying a legal large stun message.
-TEST_F(AsyncStunTCPSocketTest, TestMaximumSizeStunPacket) {
-  // We have problem in getting the SignalWriteEvent from the virtual socket
-  // server. So increasing the send buffer to 64k.
-  // TODO(mallinath) - Remove this setting after we fix vss issue.
-  vss_->set_send_buffer_capacity(64 * 1024);
-  unsigned char packet[65552];
-  packet[0] = 0x00;
-  packet[1] = 0x01;
-  packet[2] = 0xFF;
-  packet[3] = 0xFC;
-  EXPECT_TRUE(Send(packet, sizeof(packet)));
-}
-
-// Investigate why WriteEvent is not signaled from VSS.
-TEST_F(AsyncStunTCPSocketTest, DISABLED_TestWithSmallSendBuffer) {
-  vss_->set_send_buffer_capacity(1);
-  Send(kTurnChannelDataMessageWithOddLength,
-       sizeof(kTurnChannelDataMessageWithOddLength));
-  EXPECT_EQ(1u, recv_packets_.size());
-  EXPECT_TRUE(CheckData(kTurnChannelDataMessageWithOddLength,
-                        sizeof(kTurnChannelDataMessageWithOddLength)));
-}
-
-// Test that SignalSentPacket is fired when a packet is sent.
-TEST_F(AsyncStunTCPSocketTest, SignalSentPacketFiredWhenPacketSent) {
-  ASSERT_TRUE(
-      Send(kStunMessageWithZeroLength, sizeof(kStunMessageWithZeroLength)));
-  EXPECT_EQ(1, sent_packets_);
-  // Send another packet for good measure.
-  ASSERT_TRUE(
-      Send(kStunMessageWithZeroLength, sizeof(kStunMessageWithZeroLength)));
-  EXPECT_EQ(2, sent_packets_);
-}
-
-// Test that SignalSentPacket isn't fired when a packet isn't sent (for
-// example, because it's invalid).
-TEST_F(AsyncStunTCPSocketTest, SignalSentPacketNotFiredWhenPacketNotSent) {
-  // Attempt to send a packet that's too small; since it isn't sent,
-  // SignalSentPacket shouldn't fire.
-  char data[1];
-  ASSERT_FALSE(Send(data, sizeof(data)));
-  EXPECT_EQ(0, sent_packets_);
-}
-
-}  // namespace cricket
diff --git a/p2p/base/basicpacketsocketfactory.cc b/p2p/base/basicpacketsocketfactory.cc
deleted file mode 100644
index b0f464b..0000000
--- a/p2p/base/basicpacketsocketfactory.cc
+++ /dev/null
@@ -1,228 +0,0 @@
-/*
- *  Copyright 2011 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/p2p/base/basicpacketsocketfactory.h"
-
-#include <string>
-
-#include "webrtc/p2p/base/asyncstuntcpsocket.h"
-#include "webrtc/p2p/base/stun.h"
-#include "webrtc/rtc_base/asynctcpsocket.h"
-#include "webrtc/rtc_base/asyncudpsocket.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/nethelpers.h"
-#include "webrtc/rtc_base/physicalsocketserver.h"
-#include "webrtc/rtc_base/socketadapters.h"
-#include "webrtc/rtc_base/ssladapter.h"
-#include "webrtc/rtc_base/thread.h"
-
-namespace rtc {
-
-BasicPacketSocketFactory::BasicPacketSocketFactory()
-    : thread_(Thread::Current()),
-      socket_factory_(NULL) {
-}
-
-BasicPacketSocketFactory::BasicPacketSocketFactory(Thread* thread)
-    : thread_(thread),
-      socket_factory_(NULL) {
-}
-
-BasicPacketSocketFactory::BasicPacketSocketFactory(
-    SocketFactory* socket_factory)
-    : thread_(NULL),
-      socket_factory_(socket_factory) {
-}
-
-BasicPacketSocketFactory::~BasicPacketSocketFactory() {
-}
-
-AsyncPacketSocket* BasicPacketSocketFactory::CreateUdpSocket(
-    const SocketAddress& address,
-    uint16_t min_port,
-    uint16_t max_port) {
-  // UDP sockets are simple.
-  AsyncSocket* socket =
-      socket_factory()->CreateAsyncSocket(address.family(), SOCK_DGRAM);
-  if (!socket) {
-    return NULL;
-  }
-  if (BindSocket(socket, address, min_port, max_port) < 0) {
-    LOG(LS_ERROR) << "UDP bind failed with error "
-                    << socket->GetError();
-    delete socket;
-    return NULL;
-  }
-  return new AsyncUDPSocket(socket);
-}
-
-AsyncPacketSocket* BasicPacketSocketFactory::CreateServerTcpSocket(
-    const SocketAddress& local_address,
-    uint16_t min_port,
-    uint16_t max_port,
-    int opts) {
-  // Fail if TLS is required.
-  if (opts & PacketSocketFactory::OPT_TLS) {
-    LOG(LS_ERROR) << "TLS support currently is not available.";
-    return NULL;
-  }
-
-  AsyncSocket* socket =
-      socket_factory()->CreateAsyncSocket(local_address.family(), SOCK_STREAM);
-  if (!socket) {
-    return NULL;
-  }
-
-  if (BindSocket(socket, local_address, min_port, max_port) < 0) {
-    LOG(LS_ERROR) << "TCP bind failed with error "
-                  << socket->GetError();
-    delete socket;
-    return NULL;
-  }
-
-  // If using fake TLS, wrap the TCP socket in a pseudo-SSL socket.
-  if (opts & PacketSocketFactory::OPT_TLS_FAKE) {
-    RTC_DCHECK(!(opts & PacketSocketFactory::OPT_TLS));
-    socket = new AsyncSSLSocket(socket);
-  }
-
-  // Set TCP_NODELAY (via OPT_NODELAY) for improved performance.
-  // See http://go/gtalktcpnodelayexperiment
-  socket->SetOption(Socket::OPT_NODELAY, 1);
-
-  if (opts & PacketSocketFactory::OPT_STUN)
-    return new cricket::AsyncStunTCPSocket(socket, true);
-
-  return new AsyncTCPSocket(socket, true);
-}
-
-AsyncPacketSocket* BasicPacketSocketFactory::CreateClientTcpSocket(
-    const SocketAddress& local_address,
-    const SocketAddress& remote_address,
-    const ProxyInfo& proxy_info,
-    const std::string& user_agent,
-    const PacketSocketTcpOptions& tcp_options) {
-  AsyncSocket* socket =
-      socket_factory()->CreateAsyncSocket(local_address.family(), SOCK_STREAM);
-  if (!socket) {
-    return NULL;
-  }
-
-  if (BindSocket(socket, local_address, 0, 0) < 0) {
-    // Allow BindSocket to fail if we're binding to the ANY address, since this
-    // is mostly redundant in the first place. The socket will be bound when we
-    // call Connect() instead.
-    if (local_address.IsAnyIP()) {
-      LOG(LS_WARNING) << "TCP bind failed with error " << socket->GetError()
-                      << "; ignoring since socket is using 'any' address.";
-    } else {
-      LOG(LS_ERROR) << "TCP bind failed with error " << socket->GetError();
-      delete socket;
-      return NULL;
-    }
-  }
-
-  // If using a proxy, wrap the socket in a proxy socket.
-  if (proxy_info.type == PROXY_SOCKS5) {
-    socket = new AsyncSocksProxySocket(
-        socket, proxy_info.address, proxy_info.username, proxy_info.password);
-  } else if (proxy_info.type == PROXY_HTTPS) {
-    socket =
-        new AsyncHttpsProxySocket(socket, user_agent, proxy_info.address,
-                                  proxy_info.username, proxy_info.password);
-  }
-
-  // Assert that at most one TLS option is used.
-  int tlsOpts = tcp_options.opts & (PacketSocketFactory::OPT_TLS |
-                                    PacketSocketFactory::OPT_TLS_FAKE |
-                                    PacketSocketFactory::OPT_TLS_INSECURE);
-  RTC_DCHECK((tlsOpts & (tlsOpts - 1)) == 0);
-
-  if ((tlsOpts & PacketSocketFactory::OPT_TLS) ||
-      (tlsOpts & PacketSocketFactory::OPT_TLS_INSECURE)) {
-    // Using TLS, wrap the socket in an SSL adapter.
-    SSLAdapter* ssl_adapter = SSLAdapter::Create(socket);
-    if (!ssl_adapter) {
-      return NULL;
-    }
-
-    if (tlsOpts & PacketSocketFactory::OPT_TLS_INSECURE) {
-      ssl_adapter->SetIgnoreBadCert(true);
-    }
-
-    ssl_adapter->SetAlpnProtocols(tcp_options.tls_alpn_protocols);
-    ssl_adapter->SetEllipticCurves(tcp_options.tls_elliptic_curves);
-
-    socket = ssl_adapter;
-
-    if (ssl_adapter->StartSSL(remote_address.hostname().c_str(), false) != 0) {
-      delete ssl_adapter;
-      return NULL;
-    }
-
-  } else if (tlsOpts & PacketSocketFactory::OPT_TLS_FAKE) {
-    // Using fake TLS, wrap the TCP socket in a pseudo-SSL socket.
-    socket = new AsyncSSLSocket(socket);
-  }
-
-  if (socket->Connect(remote_address) < 0) {
-    LOG(LS_ERROR) << "TCP connect failed with error "
-                  << socket->GetError();
-    delete socket;
-    return NULL;
-  }
-
-  // Finally, wrap that socket in a TCP or STUN TCP packet socket.
-  AsyncPacketSocket* tcp_socket;
-  if (tcp_options.opts & PacketSocketFactory::OPT_STUN) {
-    tcp_socket = new cricket::AsyncStunTCPSocket(socket, false);
-  } else {
-    tcp_socket = new AsyncTCPSocket(socket, false);
-  }
-
-  // Set TCP_NODELAY (via OPT_NODELAY) for improved performance.
-  // See http://go/gtalktcpnodelayexperiment
-  tcp_socket->SetOption(Socket::OPT_NODELAY, 1);
-
-  return tcp_socket;
-}
-
-AsyncResolverInterface* BasicPacketSocketFactory::CreateAsyncResolver() {
-  return new AsyncResolver();
-}
-
-int BasicPacketSocketFactory::BindSocket(AsyncSocket* socket,
-                                         const SocketAddress& local_address,
-                                         uint16_t min_port,
-                                         uint16_t max_port) {
-  int ret = -1;
-  if (min_port == 0 && max_port == 0) {
-    // If there's no port range, let the OS pick a port for us.
-    ret = socket->Bind(local_address);
-  } else {
-    // Otherwise, try to find a port in the provided range.
-    for (int port = min_port; ret < 0 && port <= max_port; ++port) {
-      ret = socket->Bind(SocketAddress(local_address.ipaddr(), port));
-    }
-  }
-  return ret;
-}
-
-SocketFactory* BasicPacketSocketFactory::socket_factory() {
-  if (thread_) {
-    RTC_DCHECK(thread_ == Thread::Current());
-    return thread_->socketserver();
-  } else {
-    return socket_factory_;
-  }
-}
-
-}  // namespace rtc
diff --git a/p2p/base/basicpacketsocketfactory.h b/p2p/base/basicpacketsocketfactory.h
deleted file mode 100644
index 3cb3304..0000000
--- a/p2p/base/basicpacketsocketfactory.h
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- *  Copyright 2011 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_P2P_BASE_BASICPACKETSOCKETFACTORY_H_
-#define WEBRTC_P2P_BASE_BASICPACKETSOCKETFACTORY_H_
-
-#include "webrtc/p2p/base/packetsocketfactory.h"
-
-namespace rtc {
-
-class AsyncSocket;
-class SocketFactory;
-class Thread;
-
-class BasicPacketSocketFactory : public PacketSocketFactory {
- public:
-  BasicPacketSocketFactory();
-  explicit BasicPacketSocketFactory(Thread* thread);
-  explicit BasicPacketSocketFactory(SocketFactory* socket_factory);
-  ~BasicPacketSocketFactory() override;
-
-  AsyncPacketSocket* CreateUdpSocket(const SocketAddress& local_address,
-                                     uint16_t min_port,
-                                     uint16_t max_port) override;
-  AsyncPacketSocket* CreateServerTcpSocket(const SocketAddress& local_address,
-                                           uint16_t min_port,
-                                           uint16_t max_port,
-                                           int opts) override;
-  AsyncPacketSocket* CreateClientTcpSocket(const SocketAddress& local_address,
-                                           const SocketAddress& remote_address,
-                                           const ProxyInfo& proxy_info,
-                                           const std::string& user_agent,
-                                           int opts) override {
-    PacketSocketTcpOptions tcp_options;
-    tcp_options.opts = opts;
-    return CreateClientTcpSocket(local_address, remote_address, proxy_info,
-                                 user_agent, tcp_options);
-  }
-  AsyncPacketSocket* CreateClientTcpSocket(
-      const SocketAddress& local_address,
-      const SocketAddress& remote_address,
-      const ProxyInfo& proxy_info,
-      const std::string& user_agent,
-      const PacketSocketTcpOptions& tcp_options) override;
-
-  AsyncResolverInterface* CreateAsyncResolver() override;
-
- private:
-  int BindSocket(AsyncSocket* socket,
-                 const SocketAddress& local_address,
-                 uint16_t min_port,
-                 uint16_t max_port);
-
-  SocketFactory* socket_factory();
-
-  Thread* thread_;
-  SocketFactory* socket_factory_;
-};
-
-}  // namespace rtc
-
-#endif  // WEBRTC_P2P_BASE_BASICPACKETSOCKETFACTORY_H_
diff --git a/p2p/base/candidate.h b/p2p/base/candidate.h
deleted file mode 100644
index 474d7fb..0000000
--- a/p2p/base/candidate.h
+++ /dev/null
@@ -1,307 +0,0 @@
-/*
- *  Copyright 2004 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_P2P_BASE_CANDIDATE_H_
-#define WEBRTC_P2P_BASE_CANDIDATE_H_
-
-#include <limits.h>
-#include <math.h>
-#include <stdint.h>
-
-#include <algorithm>
-#include <iomanip>
-#include <sstream>
-#include <string>
-
-#include "webrtc/p2p/base/p2pconstants.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/helpers.h"
-#include "webrtc/rtc_base/network.h"
-#include "webrtc/rtc_base/socketaddress.h"
-
-namespace cricket {
-
-// Candidate for ICE based connection discovery.
-
-class Candidate {
- public:
-  // TODO: Match the ordering and param list as per RFC 5245
-  // candidate-attribute syntax. http://tools.ietf.org/html/rfc5245#section-15.1
-  Candidate()
-      : id_(rtc::CreateRandomString(8)),
-        component_(0),
-        priority_(0),
-        network_type_(rtc::ADAPTER_TYPE_UNKNOWN),
-        generation_(0),
-        network_id_(0),
-        network_cost_(0) {}
-
-  Candidate(int component,
-            const std::string& protocol,
-            const rtc::SocketAddress& address,
-            uint32_t priority,
-            const std::string& username,
-            const std::string& password,
-            const std::string& type,
-            uint32_t generation,
-            const std::string& foundation,
-            uint16_t network_id = 0,
-            uint16_t network_cost = 0)
-      : id_(rtc::CreateRandomString(8)),
-        component_(component),
-        protocol_(protocol),
-        address_(address),
-        priority_(priority),
-        username_(username),
-        password_(password),
-        type_(type),
-        network_type_(rtc::ADAPTER_TYPE_UNKNOWN),
-        generation_(generation),
-        foundation_(foundation),
-        network_id_(network_id),
-        network_cost_(network_cost) {}
-
-  const std::string & id() const { return id_; }
-  void set_id(const std::string & id) { id_ = id; }
-
-  int component() const { return component_; }
-  void set_component(int component) { component_ = component; }
-
-  const std::string & protocol() const { return protocol_; }
-  void set_protocol(const std::string & protocol) { protocol_ = protocol; }
-
-  // The protocol used to talk to relay.
-  const std::string& relay_protocol() const { return relay_protocol_; }
-  void set_relay_protocol(const std::string& protocol) {
-    relay_protocol_ = protocol;
-  }
-
-  const rtc::SocketAddress & address() const { return address_; }
-  void set_address(const rtc::SocketAddress & address) {
-    address_ = address;
-  }
-
-  uint32_t priority() const { return priority_; }
-  void set_priority(const uint32_t priority) { priority_ = priority; }
-
-  // TODO(pthatcher): Remove once Chromium's jingle/glue/utils.cc
-  // doesn't use it.
-  // Maps old preference (which was 0.0-1.0) to match priority (which
-  // is 0-2^32-1) to to match RFC 5245, section 4.1.2.1.  Also see
-  // https://docs.google.com/a/google.com/document/d/
-  // 1iNQDiwDKMh0NQOrCqbj3DKKRT0Dn5_5UJYhmZO-t7Uc/edit
-  float preference() const {
-    // The preference value is clamped to two decimal precision.
-    return static_cast<float>(((priority_ >> 24) * 100 / 127) / 100.0);
-  }
-
-  // TODO(pthatcher): Remove once Chromium's jingle/glue/utils.cc
-  // doesn't use it.
-  void set_preference(float preference) {
-    // Limiting priority to UINT_MAX when value exceeds uint32_t max.
-    // This can happen for e.g. when preference = 3.
-    uint64_t prio_val = static_cast<uint64_t>(preference * 127) << 24;
-    priority_ = static_cast<uint32_t>(
-        std::min(prio_val, static_cast<uint64_t>(UINT_MAX)));
-  }
-
-  // TODO(honghaiz): Change to usernameFragment or ufrag.
-  const std::string & username() const { return username_; }
-  void set_username(const std::string & username) { username_ = username; }
-
-  const std::string & password() const { return password_; }
-  void set_password(const std::string & password) { password_ = password; }
-
-  const std::string & type() const { return type_; }
-  void set_type(const std::string & type) { type_ = type; }
-
-  const std::string & network_name() const { return network_name_; }
-  void set_network_name(const std::string & network_name) {
-    network_name_ = network_name;
-  }
-
-  rtc::AdapterType network_type() const { return network_type_; }
-  void set_network_type(rtc::AdapterType network_type) {
-    network_type_ = network_type;
-  }
-
-  // Candidates in a new generation replace those in the old generation.
-  uint32_t generation() const { return generation_; }
-  void set_generation(uint32_t generation) { generation_ = generation; }
-  const std::string generation_str() const {
-    std::ostringstream ost;
-    ost << generation_;
-    return ost.str();
-  }
-  void set_generation_str(const std::string& str) {
-    std::istringstream ist(str);
-    ist >> generation_;
-  }
-
-  // |network_cost| measures the cost/penalty of using this candidate. A network
-  // cost of 0 indicates this candidate can be used freely. A value of
-  // rtc::kNetworkCostMax indicates it should be used only as the last resort.
-  void set_network_cost(uint16_t network_cost) {
-    RTC_DCHECK_LE(network_cost, rtc::kNetworkCostMax);
-    network_cost_ = network_cost;
-  }
-  uint16_t network_cost() const { return network_cost_; }
-
-  // An ID assigned to the network hosting the candidate.
-  uint16_t network_id() const { return network_id_; }
-  void set_network_id(uint16_t network_id) { network_id_ = network_id; }
-
-  const std::string& foundation() const {
-    return foundation_;
-  }
-  void set_foundation(const std::string& foundation) {
-    foundation_ = foundation;
-  }
-
-  const rtc::SocketAddress & related_address() const {
-    return related_address_;
-  }
-  void set_related_address(
-      const rtc::SocketAddress & related_address) {
-    related_address_ = related_address;
-  }
-  const std::string& tcptype() const { return tcptype_; }
-  void set_tcptype(const std::string& tcptype){
-    tcptype_ = tcptype;
-  }
-
-  // The name of the transport channel of this candidate.
-  const std::string& transport_name() const { return transport_name_; }
-  void set_transport_name(const std::string& transport_name) {
-    transport_name_ = transport_name;
-  }
-
-  // The URL of the ICE server which this candidate is gathered from.
-  const std::string& url() const { return url_; }
-  void set_url(const std::string& url) { url_ = url; }
-
-  // Determines whether this candidate is equivalent to the given one.
-  bool IsEquivalent(const Candidate& c) const {
-    // We ignore the network name, since that is just debug information, and
-    // the priority and the network cost, since they should be the same if the
-    // rest are.
-    return (component_ == c.component_) && (protocol_ == c.protocol_) &&
-           (address_ == c.address_) && (username_ == c.username_) &&
-           (password_ == c.password_) && (type_ == c.type_) &&
-           (generation_ == c.generation_) && (foundation_ == c.foundation_) &&
-           (related_address_ == c.related_address_) &&
-           (network_id_ == c.network_id_);
-  }
-
-  // Determines whether this candidate can be considered equivalent to the
-  // given one when looking for a matching candidate to remove.
-  bool MatchesForRemoval(const Candidate& c) const {
-    return component_ == c.component_ && protocol_ == c.protocol_ &&
-           address_ == c.address_;
-  }
-
-  std::string ToString() const {
-    return ToStringInternal(false);
-  }
-
-  std::string ToSensitiveString() const {
-    return ToStringInternal(true);
-  }
-
-  uint32_t GetPriority(uint32_t type_preference,
-                       int network_adapter_preference,
-                       int relay_preference) const {
-    // RFC 5245 - 4.1.2.1.
-    // priority = (2^24)*(type preference) +
-    //            (2^8)*(local preference) +
-    //            (2^0)*(256 - component ID)
-
-    // |local_preference| length is 2 bytes, 0-65535 inclusive.
-    // In our implemenation we will partion local_preference into
-    //              0                 1
-    //       0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
-    //      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-    //      |  NIC Pref     |    Addr Pref  |
-    //      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-    // NIC Type - Type of the network adapter e.g. 3G/Wifi/Wired.
-    // Addr Pref - Address preference value as per RFC 3484.
-    // local preference =  (NIC Type << 8 | Addr_Pref) - relay preference.
-
-    int addr_pref = IPAddressPrecedence(address_.ipaddr());
-    int local_preference = ((network_adapter_preference << 8) | addr_pref) +
-        relay_preference;
-
-    return (type_preference << 24) |
-           (local_preference << 8) |
-           (256 - component_);
-  }
-
-  bool operator==(const Candidate& o) const {
-    return id_ == o.id_ && component_ == o.component_ &&
-           protocol_ == o.protocol_ && relay_protocol_ == o.relay_protocol_ &&
-           address_ == o.address_ && priority_ == o.priority_ &&
-           username_ == o.username_ && password_ == o.password_ &&
-           type_ == o.type_ && network_name_ == o.network_name_ &&
-           network_type_ == o.network_type_ && generation_ == o.generation_ &&
-           foundation_ == o.foundation_ &&
-           related_address_ == o.related_address_ && tcptype_ == o.tcptype_ &&
-           transport_name_ == o.transport_name_ && network_id_ == o.network_id_;
-  }
-  bool operator!=(const Candidate& o) const { return !(*this == o); }
-
- private:
-  std::string ToStringInternal(bool sensitive) const {
-    std::ostringstream ost;
-    std::string address = sensitive ? address_.ToSensitiveString() :
-                                      address_.ToString();
-    ost << "Cand[" << transport_name_ << ":" << foundation_ << ":" << component_
-        << ":" << protocol_ << ":" << priority_ << ":" << address << ":"
-        << type_ << ":" << related_address_ << ":" << username_ << ":"
-        << password_ << ":" << network_id_ << ":" << network_cost_ << ":"
-        << generation_ << "]";
-    return ost.str();
-  }
-
-  std::string id_;
-  int component_;
-  std::string protocol_;
-  std::string relay_protocol_;
-  rtc::SocketAddress address_;
-  uint32_t priority_;
-  std::string username_;
-  std::string password_;
-  std::string type_;
-  std::string network_name_;
-  rtc::AdapterType network_type_;
-  uint32_t generation_;
-  std::string foundation_;
-  rtc::SocketAddress related_address_;
-  std::string tcptype_;
-  std::string transport_name_;
-  uint16_t network_id_;
-  uint16_t network_cost_;
-  std::string url_;
-};
-
-// Used during parsing and writing to map component to channel name
-// and back.  This is primarily for converting old G-ICE candidate
-// signalling to new ICE candidate classes.
-class CandidateTranslator {
- public:
-  virtual ~CandidateTranslator() {}
-  virtual bool GetChannelNameFromComponent(
-      int component, std::string* channel_name) const = 0;
-  virtual bool GetComponentFromChannelName(
-      const std::string& channel_name, int* component) const = 0;
-};
-
-}  // namespace cricket
-
-#endif  // WEBRTC_P2P_BASE_CANDIDATE_H_
diff --git a/p2p/base/candidatepairinterface.h b/p2p/base/candidatepairinterface.h
deleted file mode 100644
index 1d11c22..0000000
--- a/p2p/base/candidatepairinterface.h
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- *  Copyright 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_P2P_BASE_CANDIDATEPAIRINTERFACE_H_
-#define WEBRTC_P2P_BASE_CANDIDATEPAIRINTERFACE_H_
-
-namespace cricket {
-
-class Candidate;
-
-class CandidatePairInterface {
- public:
-  virtual ~CandidatePairInterface() {}
-
-  virtual const Candidate& local_candidate() const = 0;
-  virtual const Candidate& remote_candidate() const = 0;
-};
-
-}  // namespace cricket
-
-#endif  // WEBRTC_P2P_BASE_CANDIDATEPAIRINTERFACE_H_
diff --git a/p2p/base/common.h b/p2p/base/common.h
deleted file mode 100644
index 5dbe491..0000000
--- a/p2p/base/common.h
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- *  Copyright 2004 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_P2P_BASE_COMMON_H_
-#define WEBRTC_P2P_BASE_COMMON_H_
-
-#include "webrtc/rtc_base/logging.h"
-
-// Common log description format for jingle messages
-#define LOG_J(sev, obj) LOG(sev) << "Jingle:" << obj->ToString() << ": "
-#define LOG_JV(sev, obj) LOG_V(sev) << "Jingle:" << obj->ToString() << ": "
-
-#endif  // WEBRTC_P2P_BASE_COMMON_H_
diff --git a/p2p/base/dtlstransport.cc b/p2p/base/dtlstransport.cc
deleted file mode 100644
index 5f32a9b..0000000
--- a/p2p/base/dtlstransport.cc
+++ /dev/null
@@ -1,685 +0,0 @@
-/*
- *  Copyright 2011 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 <algorithm>
-#include <memory>
-#include <utility>
-
-#include "webrtc/p2p/base/dtlstransport.h"
-
-#include "webrtc/p2p/base/common.h"
-#include "webrtc/p2p/base/packettransportinternal.h"
-#include "webrtc/rtc_base/buffer.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/dscp.h"
-#include "webrtc/rtc_base/messagequeue.h"
-#include "webrtc/rtc_base/sslstreamadapter.h"
-#include "webrtc/rtc_base/stream.h"
-#include "webrtc/rtc_base/thread.h"
-
-namespace cricket {
-
-// We don't pull the RTP constants from rtputils.h, to avoid a layer violation.
-static const size_t kDtlsRecordHeaderLen = 13;
-static const size_t kMaxDtlsPacketLen = 2048;
-static const size_t kMinRtpPacketLen = 12;
-
-// Maximum number of pending packets in the queue. Packets are read immediately
-// after they have been written, so a capacity of "1" is sufficient.
-static const size_t kMaxPendingPackets = 1;
-
-// Minimum and maximum values for the initial DTLS handshake timeout. We'll pick
-// an initial timeout based on ICE RTT estimates, but clamp it to this range.
-static const int kMinHandshakeTimeout = 50;
-static const int kMaxHandshakeTimeout = 3000;
-
-static bool IsDtlsPacket(const char* data, size_t len) {
-  const uint8_t* u = reinterpret_cast<const uint8_t*>(data);
-  return (len >= kDtlsRecordHeaderLen && (u[0] > 19 && u[0] < 64));
-}
-static bool IsDtlsClientHelloPacket(const char* data, size_t len) {
-  if (!IsDtlsPacket(data, len)) {
-    return false;
-  }
-  const uint8_t* u = reinterpret_cast<const uint8_t*>(data);
-  return len > 17 && u[0] == 22 && u[13] == 1;
-}
-static bool IsRtpPacket(const char* data, size_t len) {
-  const uint8_t* u = reinterpret_cast<const uint8_t*>(data);
-  return (len >= kMinRtpPacketLen && (u[0] & 0xC0) == 0x80);
-}
-
-StreamInterfaceChannel::StreamInterfaceChannel(
-    IceTransportInternal* ice_transport)
-    : ice_transport_(ice_transport),
-      state_(rtc::SS_OPEN),
-      packets_(kMaxPendingPackets, kMaxDtlsPacketLen) {}
-
-rtc::StreamResult StreamInterfaceChannel::Read(void* buffer,
-                                               size_t buffer_len,
-                                               size_t* read,
-                                               int* error) {
-  if (state_ == rtc::SS_CLOSED)
-    return rtc::SR_EOS;
-  if (state_ == rtc::SS_OPENING)
-    return rtc::SR_BLOCK;
-
-  if (!packets_.ReadFront(buffer, buffer_len, read)) {
-    return rtc::SR_BLOCK;
-  }
-
-  return rtc::SR_SUCCESS;
-}
-
-rtc::StreamResult StreamInterfaceChannel::Write(const void* data,
-                                                size_t data_len,
-                                                size_t* written,
-                                                int* error) {
-  // Always succeeds, since this is an unreliable transport anyway.
-  // TODO(zhihuang): Should this block if ice_transport_'s temporarily
-  // unwritable?
-  rtc::PacketOptions packet_options;
-  ice_transport_->SendPacket(static_cast<const char*>(data), data_len,
-                             packet_options);
-  if (written) {
-    *written = data_len;
-  }
-  return rtc::SR_SUCCESS;
-}
-
-bool StreamInterfaceChannel::OnPacketReceived(const char* data, size_t size) {
-  // We force a read event here to ensure that we don't overflow our queue.
-  bool ret = packets_.WriteBack(data, size, NULL);
-  RTC_CHECK(ret) << "Failed to write packet to queue.";
-  if (ret) {
-    SignalEvent(this, rtc::SE_READ, 0);
-  }
-  return ret;
-}
-
-void StreamInterfaceChannel::Close() {
-  packets_.Clear();
-  state_ = rtc::SS_CLOSED;
-}
-
-DtlsTransport::DtlsTransport(IceTransportInternal* ice_transport,
-                             const rtc::CryptoOptions& crypto_options)
-    : transport_name_(ice_transport->transport_name()),
-      component_(ice_transport->component()),
-      network_thread_(rtc::Thread::Current()),
-      ice_transport_(ice_transport),
-      downward_(NULL),
-      srtp_ciphers_(GetSupportedDtlsSrtpCryptoSuites(crypto_options)),
-      ssl_role_(rtc::SSL_CLIENT),
-      ssl_max_version_(rtc::SSL_PROTOCOL_DTLS_12),
-      crypto_options_(crypto_options) {
-  ice_transport_->SignalWritableState.connect(this,
-                                              &DtlsTransport::OnWritableState);
-  ice_transport_->SignalReadPacket.connect(this, &DtlsTransport::OnReadPacket);
-  ice_transport_->SignalSentPacket.connect(this, &DtlsTransport::OnSentPacket);
-  ice_transport_->SignalReadyToSend.connect(this,
-                                            &DtlsTransport::OnReadyToSend);
-  ice_transport_->SignalReceivingState.connect(
-      this, &DtlsTransport::OnReceivingState);
-}
-
-DtlsTransport::~DtlsTransport() {}
-
-bool DtlsTransport::SetLocalCertificate(
-    const rtc::scoped_refptr<rtc::RTCCertificate>& certificate) {
-  if (dtls_active_) {
-    if (certificate == local_certificate_) {
-      // This may happen during renegotiation.
-      LOG_J(LS_INFO, this) << "Ignoring identical DTLS identity";
-      return true;
-    } else {
-      LOG_J(LS_ERROR, this) << "Can't change DTLS local identity in this state";
-      return false;
-    }
-  }
-
-  if (certificate) {
-    local_certificate_ = certificate;
-    dtls_active_ = true;
-  } else {
-    LOG_J(LS_INFO, this) << "NULL DTLS identity supplied. Not doing DTLS";
-  }
-
-  return true;
-}
-
-rtc::scoped_refptr<rtc::RTCCertificate> DtlsTransport::GetLocalCertificate()
-    const {
-  return local_certificate_;
-}
-
-bool DtlsTransport::SetSslMaxProtocolVersion(rtc::SSLProtocolVersion version) {
-  if (dtls_active_) {
-    LOG(LS_ERROR) << "Not changing max. protocol version "
-                  << "while DTLS is negotiating";
-    return false;
-  }
-
-  ssl_max_version_ = version;
-  return true;
-}
-
-bool DtlsTransport::SetSslRole(rtc::SSLRole role) {
-  if (dtls_) {
-    if (ssl_role_ != role) {
-      LOG(LS_ERROR) << "SSL Role can't be reversed after the session is setup.";
-      return false;
-    }
-    return true;
-  }
-
-  ssl_role_ = role;
-  return true;
-}
-
-bool DtlsTransport::GetSslRole(rtc::SSLRole* role) const {
-  *role = ssl_role_;
-  return true;
-}
-
-bool DtlsTransport::GetSslCipherSuite(int* cipher) {
-  if (dtls_state() != DTLS_TRANSPORT_CONNECTED) {
-    return false;
-  }
-
-  return dtls_->GetSslCipherSuite(cipher);
-}
-
-bool DtlsTransport::SetRemoteFingerprint(const std::string& digest_alg,
-                                         const uint8_t* digest,
-                                         size_t digest_len) {
-  rtc::Buffer remote_fingerprint_value(digest, digest_len);
-
-  // Once we have the local certificate, the same remote fingerprint can be set
-  // multiple times.
-  if (dtls_active_ && remote_fingerprint_value_ == remote_fingerprint_value &&
-      !digest_alg.empty()) {
-    // This may happen during renegotiation.
-    LOG_J(LS_INFO, this) << "Ignoring identical remote DTLS fingerprint";
-    return true;
-  }
-
-  // If the other side doesn't support DTLS, turn off |dtls_active_|.
-  if (digest_alg.empty()) {
-    RTC_DCHECK(!digest_len);
-    LOG_J(LS_INFO, this) << "Other side didn't support DTLS.";
-    dtls_active_ = false;
-    return true;
-  }
-
-  // Otherwise, we must have a local certificate before setting remote
-  // fingerprint.
-  if (!dtls_active_) {
-    LOG_J(LS_ERROR, this) << "Can't set DTLS remote settings in this state.";
-    return false;
-  }
-
-  // At this point we know we are doing DTLS
-  bool fingerprint_changing = remote_fingerprint_value_.size() > 0u;
-  remote_fingerprint_value_ = std::move(remote_fingerprint_value);
-  remote_fingerprint_algorithm_ = digest_alg;
-
-  if (dtls_ && !fingerprint_changing) {
-    // This can occur if DTLS is set up before a remote fingerprint is
-    // received. For instance, if we set up DTLS due to receiving an early
-    // ClientHello.
-    rtc::SSLPeerCertificateDigestError err;
-    if (!dtls_->SetPeerCertificateDigest(
-            remote_fingerprint_algorithm_,
-            reinterpret_cast<unsigned char*>(remote_fingerprint_value_.data()),
-            remote_fingerprint_value_.size(), &err)) {
-      LOG_J(LS_ERROR, this) << "Couldn't set DTLS certificate digest.";
-      set_dtls_state(DTLS_TRANSPORT_FAILED);
-      // If the error is "verification failed", don't return false, because
-      // this means the fingerprint was formatted correctly but didn't match
-      // the certificate from the DTLS handshake. Thus the DTLS state should go
-      // to "failed", but SetRemoteDescription shouldn't fail.
-      return err == rtc::SSLPeerCertificateDigestError::VERIFICATION_FAILED;
-    }
-    return true;
-  }
-
-  // If the fingerprint is changing, we'll tear down the DTLS association and
-  // create a new one, resetting our state.
-  if (dtls_ && fingerprint_changing) {
-    dtls_.reset(nullptr);
-    set_dtls_state(DTLS_TRANSPORT_NEW);
-    set_writable(false);
-  }
-
-  if (!SetupDtls()) {
-    set_dtls_state(DTLS_TRANSPORT_FAILED);
-    return false;
-  }
-
-  return true;
-}
-
-std::unique_ptr<rtc::SSLCertificate> DtlsTransport::GetRemoteSSLCertificate()
-    const {
-  if (!dtls_) {
-    return nullptr;
-  }
-
-  return dtls_->GetPeerCertificate();
-}
-
-bool DtlsTransport::SetupDtls() {
-  StreamInterfaceChannel* downward = new StreamInterfaceChannel(ice_transport_);
-
-  dtls_.reset(rtc::SSLStreamAdapter::Create(downward));
-  if (!dtls_) {
-    LOG_J(LS_ERROR, this) << "Failed to create DTLS adapter.";
-    delete downward;
-    return false;
-  }
-
-  downward_ = downward;
-
-  dtls_->SetIdentity(local_certificate_->identity()->GetReference());
-  dtls_->SetMode(rtc::SSL_MODE_DTLS);
-  dtls_->SetMaxProtocolVersion(ssl_max_version_);
-  dtls_->SetServerRole(ssl_role_);
-  dtls_->SignalEvent.connect(this, &DtlsTransport::OnDtlsEvent);
-  dtls_->SignalSSLHandshakeError.connect(this,
-                                         &DtlsTransport::OnDtlsHandshakeError);
-  if (remote_fingerprint_value_.size() &&
-      !dtls_->SetPeerCertificateDigest(
-          remote_fingerprint_algorithm_,
-          reinterpret_cast<unsigned char*>(remote_fingerprint_value_.data()),
-          remote_fingerprint_value_.size())) {
-    LOG_J(LS_ERROR, this) << "Couldn't set DTLS certificate digest.";
-    return false;
-  }
-
-  // Set up DTLS-SRTP, if it's been enabled.
-  if (!srtp_ciphers_.empty()) {
-    if (!dtls_->SetDtlsSrtpCryptoSuites(srtp_ciphers_)) {
-      LOG_J(LS_ERROR, this) << "Couldn't set DTLS-SRTP ciphers.";
-      return false;
-    }
-  } else {
-    LOG_J(LS_INFO, this) << "Not using DTLS-SRTP.";
-  }
-
-  LOG_J(LS_INFO, this) << "DTLS setup complete.";
-
-  // If the underlying ice_transport is already writable at this point, we may
-  // be able to start DTLS right away.
-  MaybeStartDtls();
-  return true;
-}
-
-bool DtlsTransport::GetSrtpCryptoSuite(int* cipher) {
-  if (dtls_state() != DTLS_TRANSPORT_CONNECTED) {
-    return false;
-  }
-
-  return dtls_->GetDtlsSrtpCryptoSuite(cipher);
-}
-
-// Called from upper layers to send a media packet.
-int DtlsTransport::SendPacket(const char* data,
-                              size_t size,
-                              const rtc::PacketOptions& options,
-                              int flags) {
-  if (!dtls_active_) {
-    // Not doing DTLS.
-    return ice_transport_->SendPacket(data, size, options);
-  }
-
-  switch (dtls_state()) {
-    case DTLS_TRANSPORT_NEW:
-      // Can't send data until the connection is active.
-      // TODO(ekr@rtfm.com): assert here if dtls_ is NULL?
-      return -1;
-    case DTLS_TRANSPORT_CONNECTING:
-      // Can't send data until the connection is active.
-      return -1;
-    case DTLS_TRANSPORT_CONNECTED:
-      if (flags & PF_SRTP_BYPASS) {
-        RTC_DCHECK(!srtp_ciphers_.empty());
-        if (!IsRtpPacket(data, size)) {
-          return -1;
-        }
-
-        return ice_transport_->SendPacket(data, size, options);
-      } else {
-        return (dtls_->WriteAll(data, size, NULL, NULL) == rtc::SR_SUCCESS)
-                   ? static_cast<int>(size)
-                   : -1;
-      }
-    case DTLS_TRANSPORT_FAILED:
-    case DTLS_TRANSPORT_CLOSED:
-      // Can't send anything when we're closed.
-      return -1;
-    default:
-      RTC_NOTREACHED();
-      return -1;
-  }
-}
-
-bool DtlsTransport::IsDtlsConnected() {
-  return dtls_ && dtls_->IsTlsConnected();
-}
-
-// The state transition logic here is as follows:
-// (1) If we're not doing DTLS-SRTP, then the state is just the
-//     state of the underlying impl()
-// (2) If we're doing DTLS-SRTP:
-//     - Prior to the DTLS handshake, the state is neither receiving nor
-//       writable
-//     - When the impl goes writable for the first time we
-//       start the DTLS handshake
-//     - Once the DTLS handshake completes, the state is that of the
-//       impl again
-void DtlsTransport::OnWritableState(rtc::PacketTransportInternal* transport) {
-  RTC_DCHECK(rtc::Thread::Current() == network_thread_);
-  RTC_DCHECK(transport == ice_transport_);
-  LOG_J(LS_VERBOSE, this)
-      << "DTLSTransportChannelWrapper: ice_transport writable state changed to "
-      << ice_transport_->writable();
-
-  if (!dtls_active_) {
-    // Not doing DTLS.
-    // Note: SignalWritableState fired by set_writable.
-    set_writable(ice_transport_->writable());
-    return;
-  }
-
-  switch (dtls_state()) {
-    case DTLS_TRANSPORT_NEW:
-      MaybeStartDtls();
-      break;
-    case DTLS_TRANSPORT_CONNECTED:
-      // Note: SignalWritableState fired by set_writable.
-      set_writable(ice_transport_->writable());
-      break;
-    case DTLS_TRANSPORT_CONNECTING:
-      // Do nothing.
-      break;
-    case DTLS_TRANSPORT_FAILED:
-    case DTLS_TRANSPORT_CLOSED:
-      // Should not happen. Do nothing.
-      break;
-  }
-}
-
-void DtlsTransport::OnReceivingState(rtc::PacketTransportInternal* transport) {
-  RTC_DCHECK(rtc::Thread::Current() == network_thread_);
-  RTC_DCHECK(transport == ice_transport_);
-  LOG_J(LS_VERBOSE, this) << "DTLSTransportChannelWrapper: ice_transport "
-                             "receiving state changed to "
-                          << ice_transport_->receiving();
-  if (!dtls_active_ || dtls_state() == DTLS_TRANSPORT_CONNECTED) {
-    // Note: SignalReceivingState fired by set_receiving.
-    set_receiving(ice_transport_->receiving());
-  }
-}
-
-void DtlsTransport::OnReadPacket(rtc::PacketTransportInternal* transport,
-                                 const char* data,
-                                 size_t size,
-                                 const rtc::PacketTime& packet_time,
-                                 int flags) {
-  RTC_DCHECK(rtc::Thread::Current() == network_thread_);
-  RTC_DCHECK(transport == ice_transport_);
-  RTC_DCHECK(flags == 0);
-
-  if (!dtls_active_) {
-    // Not doing DTLS.
-    SignalReadPacket(this, data, size, packet_time, 0);
-    return;
-  }
-
-  switch (dtls_state()) {
-    case DTLS_TRANSPORT_NEW:
-      if (dtls_) {
-        LOG_J(LS_INFO, this) << "Packet received before DTLS started.";
-      } else {
-        LOG_J(LS_WARNING, this) << "Packet received before we know if we are "
-                                << "doing DTLS or not.";
-      }
-      // Cache a client hello packet received before DTLS has actually started.
-      if (IsDtlsClientHelloPacket(data, size)) {
-        LOG_J(LS_INFO, this) << "Caching DTLS ClientHello packet until DTLS is "
-                             << "started.";
-        cached_client_hello_.SetData(data, size);
-        // If we haven't started setting up DTLS yet (because we don't have a
-        // remote fingerprint/role), we can use the client hello as a clue that
-        // the peer has chosen the client role, and proceed with the handshake.
-        // The fingerprint will be verified when it's set.
-        if (!dtls_ && local_certificate_) {
-          SetSslRole(rtc::SSL_SERVER);
-          SetupDtls();
-        }
-      } else {
-        LOG_J(LS_INFO, this) << "Not a DTLS ClientHello packet; dropping.";
-      }
-      break;
-
-    case DTLS_TRANSPORT_CONNECTING:
-    case DTLS_TRANSPORT_CONNECTED:
-      // We should only get DTLS or SRTP packets; STUN's already been demuxed.
-      // Is this potentially a DTLS packet?
-      if (IsDtlsPacket(data, size)) {
-        if (!HandleDtlsPacket(data, size)) {
-          LOG_J(LS_ERROR, this) << "Failed to handle DTLS packet.";
-          return;
-        }
-      } else {
-        // Not a DTLS packet; our handshake should be complete by now.
-        if (dtls_state() != DTLS_TRANSPORT_CONNECTED) {
-          LOG_J(LS_ERROR, this) << "Received non-DTLS packet before DTLS "
-                                << "complete.";
-          return;
-        }
-
-        // And it had better be a SRTP packet.
-        if (!IsRtpPacket(data, size)) {
-          LOG_J(LS_ERROR, this) << "Received unexpected non-DTLS packet.";
-          return;
-        }
-
-        // Sanity check.
-        RTC_DCHECK(!srtp_ciphers_.empty());
-
-        // Signal this upwards as a bypass packet.
-        SignalReadPacket(this, data, size, packet_time, PF_SRTP_BYPASS);
-      }
-      break;
-    case DTLS_TRANSPORT_FAILED:
-    case DTLS_TRANSPORT_CLOSED:
-      // This shouldn't be happening. Drop the packet.
-      break;
-  }
-}
-
-void DtlsTransport::OnSentPacket(rtc::PacketTransportInternal* transport,
-                                 const rtc::SentPacket& sent_packet) {
-  RTC_DCHECK(rtc::Thread::Current() == network_thread_);
-
-  SignalSentPacket(this, sent_packet);
-}
-
-void DtlsTransport::OnReadyToSend(rtc::PacketTransportInternal* transport) {
-  if (writable()) {
-    SignalReadyToSend(this);
-  }
-}
-
-void DtlsTransport::OnDtlsEvent(rtc::StreamInterface* dtls, int sig, int err) {
-  RTC_DCHECK(rtc::Thread::Current() == network_thread_);
-  RTC_DCHECK(dtls == dtls_.get());
-  if (sig & rtc::SE_OPEN) {
-    // This is the first time.
-    LOG_J(LS_INFO, this) << "DTLS handshake complete.";
-    if (dtls_->GetState() == rtc::SS_OPEN) {
-      // The check for OPEN shouldn't be necessary but let's make
-      // sure we don't accidentally frob the state if it's closed.
-      set_dtls_state(DTLS_TRANSPORT_CONNECTED);
-      set_writable(true);
-    }
-  }
-  if (sig & rtc::SE_READ) {
-    char buf[kMaxDtlsPacketLen];
-    size_t read;
-    int read_error;
-    rtc::StreamResult ret;
-    // The underlying DTLS stream may have received multiple DTLS records in
-    // one packet, so read all of them.
-    do {
-      ret = dtls_->Read(buf, sizeof(buf), &read, &read_error);
-      if (ret == rtc::SR_SUCCESS) {
-        SignalReadPacket(this, buf, read, rtc::CreatePacketTime(0), 0);
-      } else if (ret == rtc::SR_EOS) {
-        // Remote peer shut down the association with no error.
-        LOG_J(LS_INFO, this) << "DTLS transport closed";
-        set_writable(false);
-        set_dtls_state(DTLS_TRANSPORT_CLOSED);
-      } else if (ret == rtc::SR_ERROR) {
-        // Remote peer shut down the association with an error.
-        LOG_J(LS_INFO, this) << "DTLS transport error, code=" << read_error;
-        set_writable(false);
-        set_dtls_state(DTLS_TRANSPORT_FAILED);
-      }
-    } while (ret == rtc::SR_SUCCESS);
-  }
-  if (sig & rtc::SE_CLOSE) {
-    RTC_DCHECK(sig == rtc::SE_CLOSE);  // SE_CLOSE should be by itself.
-    set_writable(false);
-    if (!err) {
-      LOG_J(LS_INFO, this) << "DTLS transport closed";
-      set_dtls_state(DTLS_TRANSPORT_CLOSED);
-    } else {
-      LOG_J(LS_INFO, this) << "DTLS transport error, code=" << err;
-      set_dtls_state(DTLS_TRANSPORT_FAILED);
-    }
-  }
-}
-
-void DtlsTransport::MaybeStartDtls() {
-  if (dtls_ && ice_transport_->writable()) {
-    ConfigureHandshakeTimeout();
-
-    if (dtls_->StartSSL()) {
-      // This should never fail:
-      // Because we are operating in a nonblocking mode and all
-      // incoming packets come in via OnReadPacket(), which rejects
-      // packets in this state, the incoming queue must be empty. We
-      // ignore write errors, thus any errors must be because of
-      // configuration and therefore are our fault.
-      RTC_NOTREACHED() << "StartSSL failed.";
-      LOG_J(LS_ERROR, this) << "Couldn't start DTLS handshake";
-      set_dtls_state(DTLS_TRANSPORT_FAILED);
-      return;
-    }
-    LOG_J(LS_INFO, this) << "DtlsTransport: Started DTLS handshake";
-    set_dtls_state(DTLS_TRANSPORT_CONNECTING);
-    // Now that the handshake has started, we can process a cached ClientHello
-    // (if one exists).
-    if (cached_client_hello_.size()) {
-      if (ssl_role_ == rtc::SSL_SERVER) {
-        LOG_J(LS_INFO, this) << "Handling cached DTLS ClientHello packet.";
-        if (!HandleDtlsPacket(cached_client_hello_.data<char>(),
-                              cached_client_hello_.size())) {
-          LOG_J(LS_ERROR, this) << "Failed to handle DTLS packet.";
-        }
-      } else {
-        LOG_J(LS_WARNING, this) << "Discarding cached DTLS ClientHello packet "
-                                << "because we don't have the server role.";
-      }
-      cached_client_hello_.Clear();
-    }
-  }
-}
-
-// Called from OnReadPacket when a DTLS packet is received.
-bool DtlsTransport::HandleDtlsPacket(const char* data, size_t size) {
-  // Sanity check we're not passing junk that
-  // just looks like DTLS.
-  const uint8_t* tmp_data = reinterpret_cast<const uint8_t*>(data);
-  size_t tmp_size = size;
-  while (tmp_size > 0) {
-    if (tmp_size < kDtlsRecordHeaderLen)
-      return false;  // Too short for the header
-
-    size_t record_len = (tmp_data[11] << 8) | (tmp_data[12]);
-    if ((record_len + kDtlsRecordHeaderLen) > tmp_size)
-      return false;  // Body too short
-
-    tmp_data += record_len + kDtlsRecordHeaderLen;
-    tmp_size -= record_len + kDtlsRecordHeaderLen;
-  }
-
-  // Looks good. Pass to the SIC which ends up being passed to
-  // the DTLS stack.
-  return downward_->OnPacketReceived(data, size);
-}
-
-void DtlsTransport::set_receiving(bool receiving) {
-  if (receiving_ == receiving) {
-    return;
-  }
-  receiving_ = receiving;
-  SignalReceivingState(this);
-}
-
-void DtlsTransport::set_writable(bool writable) {
-  if (writable_ == writable) {
-    return;
-  }
-  LOG_J(LS_VERBOSE, this) << "set_writable from:" << writable_ << " to "
-                          << writable;
-  writable_ = writable;
-  if (writable_) {
-    SignalReadyToSend(this);
-  }
-  SignalWritableState(this);
-}
-
-void DtlsTransport::set_dtls_state(DtlsTransportState state) {
-  if (dtls_state_ == state) {
-    return;
-  }
-  LOG_J(LS_VERBOSE, this) << "set_dtls_state from:" << dtls_state_ << " to "
-                          << state;
-  dtls_state_ = state;
-  SignalDtlsState(this, state);
-}
-
-void DtlsTransport::OnDtlsHandshakeError(rtc::SSLHandshakeError error) {
-  SignalDtlsHandshakeError(error);
-}
-
-void DtlsTransport::ConfigureHandshakeTimeout() {
-  RTC_DCHECK(dtls_);
-  rtc::Optional<int> rtt = ice_transport_->GetRttEstimate();
-  if (rtt) {
-    // Limit the timeout to a reasonable range in case the ICE RTT takes
-    // extreme values.
-    int initial_timeout = std::max(kMinHandshakeTimeout,
-                                   std::min(kMaxHandshakeTimeout, 2 * (*rtt)));
-    LOG_J(LS_INFO, this) << "configuring DTLS handshake timeout "
-                         << initial_timeout << " based on ICE RTT " << *rtt;
-
-    dtls_->SetInitialRetransmissionTimeout(initial_timeout);
-  } else {
-    LOG_J(LS_INFO, this)
-        << "no RTT estimate - using default DTLS handshake timeout";
-  }
-}
-
-}  // namespace cricket
diff --git a/p2p/base/dtlstransport.h b/p2p/base/dtlstransport.h
deleted file mode 100644
index 4c0432c..0000000
--- a/p2p/base/dtlstransport.h
+++ /dev/null
@@ -1,239 +0,0 @@
-/*
- *  Copyright 2011 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_P2P_BASE_DTLSTRANSPORT_H_
-#define WEBRTC_P2P_BASE_DTLSTRANSPORT_H_
-
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "webrtc/p2p/base/dtlstransportinternal.h"
-#include "webrtc/p2p/base/icetransportinternal.h"
-#include "webrtc/rtc_base/buffer.h"
-#include "webrtc/rtc_base/bufferqueue.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/sslstreamadapter.h"
-#include "webrtc/rtc_base/stream.h"
-
-namespace rtc {
-class PacketTransportInternal;
-}
-
-namespace cricket {
-
-// A bridge between a packet-oriented/transport-type interface on
-// the bottom and a StreamInterface on the top.
-class StreamInterfaceChannel : public rtc::StreamInterface {
- public:
-  explicit StreamInterfaceChannel(IceTransportInternal* ice_transport);
-
-  // Push in a packet; this gets pulled out from Read().
-  bool OnPacketReceived(const char* data, size_t size);
-
-  // Implementations of StreamInterface
-  rtc::StreamState GetState() const override { return state_; }
-  void Close() override;
-  rtc::StreamResult Read(void* buffer,
-                         size_t buffer_len,
-                         size_t* read,
-                         int* error) override;
-  rtc::StreamResult Write(const void* data,
-                          size_t data_len,
-                          size_t* written,
-                          int* error) override;
-
- private:
-  IceTransportInternal* ice_transport_;  // owned by DtlsTransport
-  rtc::StreamState state_;
-  rtc::BufferQueue packets_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(StreamInterfaceChannel);
-};
-
-// This class provides a DTLS SSLStreamAdapter inside a TransportChannel-style
-// packet-based interface, wrapping an existing TransportChannel instance
-// (e.g a P2PTransportChannel)
-// Here's the way this works:
-//
-//   DtlsTransport {
-//       SSLStreamAdapter* dtls_ {
-//           StreamInterfaceChannel downward_ {
-//               IceTransportInternal* ice_transport_;
-//           }
-//       }
-//   }
-//
-//   - Data which comes into DtlsTransport from the underlying
-//     ice_transport_ via OnReadPacket() is checked for whether it is DTLS
-//     or not, and if it is, is passed to DtlsTransport::HandleDtlsPacket,
-//     which pushes it into to downward_. dtls_ is listening for events on
-//     downward_, so it immediately calls downward_->Read().
-//
-//   - Data written to DtlsTransport is passed either to downward_ or directly
-//     to ice_transport_, depending on whether DTLS is negotiated and whether
-//     the flags include PF_SRTP_BYPASS
-//
-//   - The SSLStreamAdapter writes to downward_->Write() which translates it
-//     into packet writes on ice_transport_.
-class DtlsTransport : public DtlsTransportInternal {
- public:
-  // |ice_transport| is the ICE transport this DTLS transport is wrapping.
-  //
-  // |crypto_options| are the options used for the DTLS handshake. This affects
-  // whether GCM crypto suites are negotiated.
-  explicit DtlsTransport(IceTransportInternal* ice_transport,
-                         const rtc::CryptoOptions& crypto_options);
-  ~DtlsTransport() override;
-
-  const rtc::CryptoOptions& crypto_options() const override {
-    return crypto_options_;
-  }
-
-  DtlsTransportState dtls_state() const override { return dtls_state_; }
-
-  const std::string& transport_name() const override { return transport_name_; }
-
-  int component() const override { return component_; }
-
-  // Returns false if no local certificate was set, or if the peer doesn't
-  // support DTLS.
-  bool IsDtlsActive() const override { return dtls_active_; }
-
-  bool SetLocalCertificate(
-      const rtc::scoped_refptr<rtc::RTCCertificate>& certificate) override;
-  rtc::scoped_refptr<rtc::RTCCertificate> GetLocalCertificate() const override;
-
-  bool SetRemoteFingerprint(const std::string& digest_alg,
-                            const uint8_t* digest,
-                            size_t digest_len) override;
-
-  // Called to send a packet (via DTLS, if turned on).
-  int SendPacket(const char* data,
-                 size_t size,
-                 const rtc::PacketOptions& options,
-                 int flags) override;
-
-  bool GetOption(rtc::Socket::Option opt, int* value) override {
-    return ice_transport_->GetOption(opt, value);
-  }
-
-  virtual bool SetSslMaxProtocolVersion(rtc::SSLProtocolVersion version);
-
-  // Find out which DTLS-SRTP cipher was negotiated
-  bool GetSrtpCryptoSuite(int* cipher) override;
-
-  bool GetSslRole(rtc::SSLRole* role) const override;
-  bool SetSslRole(rtc::SSLRole role) override;
-
-  // Find out which DTLS cipher was negotiated
-  bool GetSslCipherSuite(int* cipher) override;
-
-  // Once DTLS has been established, this method retrieves the certificate in
-  // use by the remote peer, for use in external identity verification.
-  std::unique_ptr<rtc::SSLCertificate> GetRemoteSSLCertificate() const override;
-
-  // Once DTLS has established (i.e., this ice_transport is writable), this
-  // method extracts the keys negotiated during the DTLS handshake, for use in
-  // external encryption. DTLS-SRTP uses this to extract the needed SRTP keys.
-  // See the SSLStreamAdapter documentation for info on the specific parameters.
-  bool ExportKeyingMaterial(const std::string& label,
-                            const uint8_t* context,
-                            size_t context_len,
-                            bool use_context,
-                            uint8_t* result,
-                            size_t result_len) override {
-    return (dtls_.get())
-               ? dtls_->ExportKeyingMaterial(label, context, context_len,
-                                             use_context, result, result_len)
-               : false;
-  }
-
-  IceTransportInternal* ice_transport() override { return ice_transport_; }
-
-  // For informational purposes. Tells if the DTLS handshake has finished.
-  // This may be true even if writable() is false, if the remote fingerprint
-  // has not yet been verified.
-  bool IsDtlsConnected();
-
-  bool receiving() const override { return receiving_; }
-
-  bool writable() const override { return writable_; }
-
-  int GetError() override { return ice_transport_->GetError(); }
-
-  int SetOption(rtc::Socket::Option opt, int value) override {
-    return ice_transport_->SetOption(opt, value);
-  }
-
-  std::string ToString() const {
-    const char RECEIVING_ABBREV[2] = {'_', 'R'};
-    const char WRITABLE_ABBREV[2] = {'_', 'W'};
-    std::stringstream ss;
-    ss << "DtlsTransport[" << transport_name_ << "|" << component_ << "|"
-       << RECEIVING_ABBREV[receiving()] << WRITABLE_ABBREV[writable()] << "]";
-    return ss.str();
-  }
-
- private:
-  void OnWritableState(rtc::PacketTransportInternal* transport);
-  void OnReadPacket(rtc::PacketTransportInternal* transport,
-                    const char* data,
-                    size_t size,
-                    const rtc::PacketTime& packet_time,
-                    int flags);
-  void OnSentPacket(rtc::PacketTransportInternal* transport,
-                    const rtc::SentPacket& sent_packet);
-  void OnReadyToSend(rtc::PacketTransportInternal* transport);
-  void OnReceivingState(rtc::PacketTransportInternal* transport);
-  void OnDtlsEvent(rtc::StreamInterface* stream_, int sig, int err);
-  bool SetupDtls();
-  void MaybeStartDtls();
-  bool HandleDtlsPacket(const char* data, size_t size);
-  void OnDtlsHandshakeError(rtc::SSLHandshakeError error);
-  void ConfigureHandshakeTimeout();
-
-  void set_receiving(bool receiving);
-  void set_writable(bool writable);
-  // Sets the DTLS state, signaling if necessary.
-  void set_dtls_state(DtlsTransportState state);
-
-  std::string transport_name_;
-  int component_;
-  DtlsTransportState dtls_state_ = DTLS_TRANSPORT_NEW;
-  rtc::Thread* network_thread_;  // Everything should occur on this thread.
-  // Underlying ice_transport, not owned by this class.
-  IceTransportInternal* const ice_transport_;
-  std::unique_ptr<rtc::SSLStreamAdapter> dtls_;  // The DTLS stream
-  StreamInterfaceChannel*
-      downward_;  // Wrapper for ice_transport_, owned by dtls_.
-  std::vector<int> srtp_ciphers_;  // SRTP ciphers to use with DTLS.
-  bool dtls_active_ = false;
-  rtc::scoped_refptr<rtc::RTCCertificate> local_certificate_;
-  rtc::SSLRole ssl_role_;
-  rtc::SSLProtocolVersion ssl_max_version_;
-  rtc::CryptoOptions crypto_options_;
-  rtc::Buffer remote_fingerprint_value_;
-  std::string remote_fingerprint_algorithm_;
-
-  // Cached DTLS ClientHello packet that was received before we started the
-  // DTLS handshake. This could happen if the hello was received before the
-  // ice transport became writable, or before a remote fingerprint was received.
-  rtc::Buffer cached_client_hello_;
-
-  bool receiving_ = false;
-  bool writable_ = false;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(DtlsTransport);
-};
-
-}  // namespace cricket
-
-#endif  // WEBRTC_P2P_BASE_DTLSTRANSPORT_H_
diff --git a/p2p/base/dtlstransport_unittest.cc b/p2p/base/dtlstransport_unittest.cc
deleted file mode 100644
index adad443..0000000
--- a/p2p/base/dtlstransport_unittest.cc
+++ /dev/null
@@ -1,1137 +0,0 @@
-/*
- *  Copyright 2011 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 <algorithm>
-#include <memory>
-#include <set>
-
-#include "webrtc/p2p/base/dtlstransport.h"
-#include "webrtc/p2p/base/fakeicetransport.h"
-#include "webrtc/p2p/base/packettransportinternal.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/dscp.h"
-#include "webrtc/rtc_base/gunit.h"
-#include "webrtc/rtc_base/helpers.h"
-#include "webrtc/rtc_base/ssladapter.h"
-#include "webrtc/rtc_base/sslidentity.h"
-#include "webrtc/rtc_base/sslstreamadapter.h"
-#include "webrtc/rtc_base/stringutils.h"
-
-#define MAYBE_SKIP_TEST(feature)                              \
-  if (!(rtc::SSLStreamAdapter::feature())) {                  \
-    LOG(LS_INFO) << #feature " feature disabled... skipping"; \
-    return;                                                   \
-  }
-
-static const char kIceUfrag1[] = "TESTICEUFRAG0001";
-static const char kIcePwd1[] = "TESTICEPWD00000000000001";
-static const size_t kPacketNumOffset = 8;
-static const size_t kPacketHeaderLen = 12;
-static const int kFakePacketId = 0x1234;
-static const int kTimeout = 10000;
-
-static bool IsRtpLeadByte(uint8_t b) {
-  return ((b & 0xC0) == 0x80);
-}
-
-cricket::TransportDescription MakeTransportDescription(
-    const rtc::scoped_refptr<rtc::RTCCertificate>& cert,
-    cricket::ConnectionRole role) {
-  std::unique_ptr<rtc::SSLFingerprint> fingerprint;
-  if (cert) {
-    std::string digest_algorithm;
-    EXPECT_TRUE(
-        cert->ssl_certificate().GetSignatureDigestAlgorithm(&digest_algorithm));
-    EXPECT_FALSE(digest_algorithm.empty());
-    fingerprint.reset(
-        rtc::SSLFingerprint::Create(digest_algorithm, cert->identity()));
-    EXPECT_TRUE(fingerprint.get() != NULL);
-    EXPECT_EQ(rtc::DIGEST_SHA_256, digest_algorithm);
-  }
-  return cricket::TransportDescription(std::vector<std::string>(), kIceUfrag1,
-                                       kIcePwd1, cricket::ICEMODE_FULL, role,
-                                       fingerprint.get());
-}
-
-using cricket::ConnectionRole;
-
-enum Flags { NF_REOFFER = 0x1, NF_EXPECT_FAILURE = 0x2 };
-
-// TODO(deadbeef): Remove the dependency on JsepTransport. This test should be
-// testing DtlsTransportChannel by itself, calling methods to set the
-// configuration directly instead of negotiating TransportDescriptions.
-class DtlsTestClient : public sigslot::has_slots<> {
- public:
-  explicit DtlsTestClient(const std::string& name) : name_(name) {}
-  void CreateCertificate(rtc::KeyType key_type) {
-    certificate_ =
-        rtc::RTCCertificate::Create(std::unique_ptr<rtc::SSLIdentity>(
-            rtc::SSLIdentity::Generate(name_, key_type)));
-  }
-  const rtc::scoped_refptr<rtc::RTCCertificate>& certificate() {
-    return certificate_;
-  }
-  void SetupMaxProtocolVersion(rtc::SSLProtocolVersion version) {
-    ssl_max_version_ = version;
-  }
-  void SetupChannels(int count, cricket::IceRole role, int async_delay_ms = 0) {
-    transport_.reset(
-        new cricket::JsepTransport("dtls content name", certificate_));
-    for (int i = 0; i < count; ++i) {
-      cricket::FakeIceTransport* fake_ice_channel =
-          new cricket::FakeIceTransport(transport_->mid(), i);
-      fake_ice_channel->SetAsync(true);
-      fake_ice_channel->SetAsyncDelay(async_delay_ms);
-      // Hook the raw packets so that we can verify they are encrypted.
-      fake_ice_channel->SignalReadPacket.connect(
-          this, &DtlsTestClient::OnFakeTransportChannelReadPacket);
-
-      cricket::DtlsTransport* dtls =
-          new cricket::DtlsTransport(fake_ice_channel, rtc::CryptoOptions());
-      dtls->SetLocalCertificate(certificate_);
-      dtls->ice_transport()->SetIceRole(role);
-      dtls->ice_transport()->SetIceTiebreaker(
-          (role == cricket::ICEROLE_CONTROLLING) ? 1 : 2);
-      dtls->SetSslMaxProtocolVersion(ssl_max_version_);
-      dtls->SignalWritableState.connect(
-          this, &DtlsTestClient::OnTransportChannelWritableState);
-      dtls->SignalReadPacket.connect(
-          this, &DtlsTestClient::OnTransportChannelReadPacket);
-      dtls->SignalSentPacket.connect(
-          this, &DtlsTestClient::OnTransportChannelSentPacket);
-      dtls_transports_.push_back(std::unique_ptr<cricket::DtlsTransport>(dtls));
-      fake_ice_transports_.push_back(
-          std::unique_ptr<cricket::FakeIceTransport>(fake_ice_channel));
-      transport_->AddChannel(dtls, i);
-    }
-  }
-
-  cricket::JsepTransport* transport() { return transport_.get(); }
-
-  cricket::FakeIceTransport* GetFakeIceTransort(int component) {
-    for (const auto& ch : fake_ice_transports_) {
-      if (ch->component() == component) {
-        return ch.get();
-      }
-    }
-    return nullptr;
-  }
-
-  cricket::DtlsTransport* GetDtlsTransport(int component) {
-    for (const auto& dtls : dtls_transports_) {
-      if (dtls->component() == component) {
-        return dtls.get();
-      }
-    }
-    return nullptr;
-  }
-
-  // Offer DTLS if we have an identity; pass in a remote fingerprint only if
-  // both sides support DTLS.
-  void Negotiate(DtlsTestClient* peer,
-                 cricket::ContentAction action,
-                 ConnectionRole local_role,
-                 ConnectionRole remote_role,
-                 int flags) {
-    Negotiate(certificate_, certificate_ ? peer->certificate_ : nullptr, action,
-              local_role, remote_role, flags);
-  }
-
-  void SetLocalTransportDescription(
-      const rtc::scoped_refptr<rtc::RTCCertificate>& cert,
-      cricket::ContentAction action,
-      ConnectionRole role,
-      int flags) {
-    // If |NF_EXPECT_FAILURE| is set, expect SRTD or SLTD to fail when
-    // content action is CA_ANSWER.
-    bool expect_success =
-        !((action == cricket::CA_ANSWER) && (flags & NF_EXPECT_FAILURE));
-    EXPECT_EQ(expect_success,
-              transport_->SetLocalTransportDescription(
-                  MakeTransportDescription(cert, role), action, nullptr));
-  }
-
-  void SetRemoteTransportDescription(
-      const rtc::scoped_refptr<rtc::RTCCertificate>& cert,
-      cricket::ContentAction action,
-      ConnectionRole role,
-      int flags) {
-    // If |NF_EXPECT_FAILURE| is set, expect SRTD or SLTD to fail when
-    // content action is CA_ANSWER.
-    bool expect_success =
-        !((action == cricket::CA_ANSWER) && (flags & NF_EXPECT_FAILURE));
-    EXPECT_EQ(expect_success,
-              transport_->SetRemoteTransportDescription(
-                  MakeTransportDescription(cert, role), action, nullptr));
-  }
-
-  // Allow any DTLS configuration to be specified (including invalid ones).
-  void Negotiate(const rtc::scoped_refptr<rtc::RTCCertificate>& local_cert,
-                 const rtc::scoped_refptr<rtc::RTCCertificate>& remote_cert,
-                 cricket::ContentAction action,
-                 ConnectionRole local_role,
-                 ConnectionRole remote_role,
-                 int flags) {
-    if (action == cricket::CA_OFFER) {
-      SetLocalTransportDescription(local_cert, cricket::CA_OFFER, local_role,
-                                   flags);
-      SetRemoteTransportDescription(remote_cert, cricket::CA_ANSWER,
-                                    remote_role, flags);
-    } else {
-      SetRemoteTransportDescription(remote_cert, cricket::CA_OFFER, remote_role,
-                                    flags);
-      // If remote if the offerer and has no DTLS support, answer will be
-      // without any fingerprint.
-      SetLocalTransportDescription(remote_cert ? local_cert : nullptr,
-                                   cricket::CA_ANSWER, local_role, flags);
-    }
-  }
-
-  bool Connect(DtlsTestClient* peer, bool asymmetric) {
-    for (auto& ice : fake_ice_transports_) {
-      ice->SetDestination(peer->GetFakeIceTransort(ice->component()),
-                          asymmetric);
-    }
-    return true;
-  }
-
-  bool all_dtls_transports_writable() const {
-    if (dtls_transports_.empty()) {
-      return false;
-    }
-    for (const auto& dtls : dtls_transports_) {
-      if (!dtls->writable()) {
-        return false;
-      }
-    }
-    return true;
-  }
-
-  bool all_ice_transports_writable() const {
-    if (dtls_transports_.empty()) {
-      return false;
-    }
-    for (const auto& dtls : dtls_transports_) {
-      if (!dtls->ice_transport()->writable()) {
-        return false;
-      }
-    }
-    return true;
-  }
-
-  int received_dtls_client_hellos() const {
-    return received_dtls_client_hellos_;
-  }
-
-  int received_dtls_server_hellos() const {
-    return received_dtls_server_hellos_;
-  }
-
-  bool negotiated_dtls() const {
-    return transport_->local_description() &&
-           transport_->local_description()->identity_fingerprint &&
-           transport_->remote_description() &&
-           transport_->remote_description()->identity_fingerprint;
-  }
-
-  void CheckRole(rtc::SSLRole role) {
-    if (role == rtc::SSL_CLIENT) {
-      ASSERT_EQ(0, received_dtls_client_hellos_);
-      ASSERT_GT(received_dtls_server_hellos_, 0);
-    } else {
-      ASSERT_GT(received_dtls_client_hellos_, 0);
-      ASSERT_EQ(0, received_dtls_server_hellos_);
-    }
-  }
-
-  void CheckSrtp(int expected_crypto_suite) {
-    for (const auto& dtls : dtls_transports_) {
-      int crypto_suite;
-
-      bool rv = dtls->GetSrtpCryptoSuite(&crypto_suite);
-      if (negotiated_dtls() && expected_crypto_suite) {
-        ASSERT_TRUE(rv);
-
-        ASSERT_EQ(crypto_suite, expected_crypto_suite);
-      } else {
-        ASSERT_FALSE(rv);
-      }
-    }
-  }
-
-  void CheckSsl() {
-    for (const auto& dtls : dtls_transports_) {
-      int cipher;
-
-      bool rv = dtls->GetSslCipherSuite(&cipher);
-      if (negotiated_dtls()) {
-        ASSERT_TRUE(rv);
-
-        EXPECT_TRUE(
-            rtc::SSLStreamAdapter::IsAcceptableCipher(cipher, rtc::KT_DEFAULT));
-      } else {
-        ASSERT_FALSE(rv);
-      }
-    }
-  }
-
-  void SendPackets(size_t transport, size_t size, size_t count, bool srtp) {
-    RTC_CHECK(transport < dtls_transports_.size());
-    std::unique_ptr<char[]> packet(new char[size]);
-    size_t sent = 0;
-    do {
-      // Fill the packet with a known value and a sequence number to check
-      // against, and make sure that it doesn't look like DTLS.
-      memset(packet.get(), sent & 0xff, size);
-      packet[0] = (srtp) ? 0x80 : 0x00;
-      rtc::SetBE32(packet.get() + kPacketNumOffset,
-                   static_cast<uint32_t>(sent));
-
-      // Only set the bypass flag if we've activated DTLS.
-      int flags = (certificate_ && srtp) ? cricket::PF_SRTP_BYPASS : 0;
-      rtc::PacketOptions packet_options;
-      packet_options.packet_id = kFakePacketId;
-      int rv = dtls_transports_[transport]->SendPacket(packet.get(), size,
-                                                       packet_options, flags);
-      ASSERT_GT(rv, 0);
-      ASSERT_EQ(size, static_cast<size_t>(rv));
-      ++sent;
-    } while (sent < count);
-  }
-
-  int SendInvalidSrtpPacket(size_t transport, size_t size) {
-    RTC_CHECK(transport < dtls_transports_.size());
-    std::unique_ptr<char[]> packet(new char[size]);
-    // Fill the packet with 0 to form an invalid SRTP packet.
-    memset(packet.get(), 0, size);
-
-    rtc::PacketOptions packet_options;
-    return dtls_transports_[transport]->SendPacket(
-        packet.get(), size, packet_options, cricket::PF_SRTP_BYPASS);
-  }
-
-  void ExpectPackets(size_t transport, size_t size) {
-    packet_size_ = size;
-    received_.clear();
-  }
-
-  size_t NumPacketsReceived() { return received_.size(); }
-
-  bool VerifyPacket(const char* data, size_t size, uint32_t* out_num) {
-    if (size != packet_size_ ||
-        (data[0] != 0 && static_cast<uint8_t>(data[0]) != 0x80)) {
-      return false;
-    }
-    uint32_t packet_num = rtc::GetBE32(data + kPacketNumOffset);
-    for (size_t i = kPacketHeaderLen; i < size; ++i) {
-      if (static_cast<uint8_t>(data[i]) != (packet_num & 0xff)) {
-        return false;
-      }
-    }
-    if (out_num) {
-      *out_num = packet_num;
-    }
-    return true;
-  }
-  bool VerifyEncryptedPacket(const char* data, size_t size) {
-    // This is an encrypted data packet; let's make sure it's mostly random;
-    // less than 10% of the bytes should be equal to the cleartext packet.
-    if (size <= packet_size_) {
-      return false;
-    }
-    uint32_t packet_num = rtc::GetBE32(data + kPacketNumOffset);
-    int num_matches = 0;
-    for (size_t i = kPacketNumOffset; i < size; ++i) {
-      if (static_cast<uint8_t>(data[i]) == (packet_num & 0xff)) {
-        ++num_matches;
-      }
-    }
-    return (num_matches < ((static_cast<int>(size) - 5) / 10));
-  }
-
-  // Transport channel callbacks
-  void OnTransportChannelWritableState(
-      rtc::PacketTransportInternal* transport) {
-    LOG(LS_INFO) << name_ << ": Channel '" << transport->debug_name()
-                 << "' is writable";
-  }
-
-  void OnTransportChannelReadPacket(rtc::PacketTransportInternal* transport,
-                                    const char* data,
-                                    size_t size,
-                                    const rtc::PacketTime& packet_time,
-                                    int flags) {
-    uint32_t packet_num = 0;
-    ASSERT_TRUE(VerifyPacket(data, size, &packet_num));
-    received_.insert(packet_num);
-    // Only DTLS-SRTP packets should have the bypass flag set.
-    int expected_flags =
-        (certificate_ && IsRtpLeadByte(data[0])) ? cricket::PF_SRTP_BYPASS : 0;
-    ASSERT_EQ(expected_flags, flags);
-  }
-
-  void OnTransportChannelSentPacket(rtc::PacketTransportInternal* transport,
-                                    const rtc::SentPacket& sent_packet) {
-    sent_packet_ = sent_packet;
-  }
-
-  rtc::SentPacket sent_packet() const { return sent_packet_; }
-
-  // Hook into the raw packet stream to make sure DTLS packets are encrypted.
-  void OnFakeTransportChannelReadPacket(rtc::PacketTransportInternal* transport,
-                                        const char* data,
-                                        size_t size,
-                                        const rtc::PacketTime& time,
-                                        int flags) {
-    // Flags shouldn't be set on the underlying TransportChannel packets.
-    ASSERT_EQ(0, flags);
-
-    // Look at the handshake packets to see what role we played.
-    // Check that non-handshake packets are DTLS data or SRTP bypass.
-    if (data[0] == 22 && size > 17) {
-      if (data[13] == 1) {
-        ++received_dtls_client_hellos_;
-      } else if (data[13] == 2) {
-        ++received_dtls_server_hellos_;
-      }
-    } else if (negotiated_dtls() && !(data[0] >= 20 && data[0] <= 22)) {
-      ASSERT_TRUE(data[0] == 23 || IsRtpLeadByte(data[0]));
-      if (data[0] == 23) {
-        ASSERT_TRUE(VerifyEncryptedPacket(data, size));
-      } else if (IsRtpLeadByte(data[0])) {
-        ASSERT_TRUE(VerifyPacket(data, size, NULL));
-      }
-    }
-  }
-
- private:
-  std::string name_;
-  rtc::scoped_refptr<rtc::RTCCertificate> certificate_;
-  std::vector<std::unique_ptr<cricket::FakeIceTransport>> fake_ice_transports_;
-  std::vector<std::unique_ptr<cricket::DtlsTransport>> dtls_transports_;
-  std::unique_ptr<cricket::JsepTransport> transport_;
-  size_t packet_size_ = 0u;
-  std::set<int> received_;
-  rtc::SSLProtocolVersion ssl_max_version_ = rtc::SSL_PROTOCOL_DTLS_12;
-  int received_dtls_client_hellos_ = 0;
-  int received_dtls_server_hellos_ = 0;
-  rtc::SentPacket sent_packet_;
-};
-
-// Base class for DtlsTransportChannelTest and DtlsEventOrderingTest, which
-// inherit from different variants of testing::Test.
-//
-// Note that this test always uses a FakeClock, due to the |fake_clock_| member
-// variable.
-class DtlsTransportChannelTestBase {
- public:
-  DtlsTransportChannelTestBase()
-      : client1_("P1"),
-        client2_("P2"),
-        channel_ct_(1),
-        use_dtls_(false),
-        ssl_expected_version_(rtc::SSL_PROTOCOL_DTLS_12) {}
-
-  void SetChannelCount(size_t channel_ct) {
-    channel_ct_ = static_cast<int>(channel_ct);
-  }
-  void SetMaxProtocolVersions(rtc::SSLProtocolVersion c1,
-                              rtc::SSLProtocolVersion c2) {
-    client1_.SetupMaxProtocolVersion(c1);
-    client2_.SetupMaxProtocolVersion(c2);
-    ssl_expected_version_ = std::min(c1, c2);
-  }
-  void PrepareDtls(bool c1, bool c2, rtc::KeyType key_type) {
-    if (c1) {
-      client1_.CreateCertificate(key_type);
-    }
-    if (c2) {
-      client2_.CreateCertificate(key_type);
-    }
-    if (c1 && c2)
-      use_dtls_ = true;
-  }
-
-  // Negotiate local/remote fingerprint before or after the underlying
-  // tranpsort is connected?
-  enum NegotiateOrdering { NEGOTIATE_BEFORE_CONNECT, CONNECT_BEFORE_NEGOTIATE };
-  bool Connect(ConnectionRole client1_role,
-               ConnectionRole client2_role,
-               NegotiateOrdering ordering = NEGOTIATE_BEFORE_CONNECT) {
-    bool rv;
-    if (ordering == NEGOTIATE_BEFORE_CONNECT) {
-      Negotiate(client1_role, client2_role);
-      rv = client1_.Connect(&client2_, false);
-    } else {
-      client1_.SetupChannels(channel_ct_, cricket::ICEROLE_CONTROLLING);
-      client2_.SetupChannels(channel_ct_, cricket::ICEROLE_CONTROLLED);
-      // This is equivalent to an offer being processed on both sides, but an
-      // answer not yet being received on the initiating side. So the
-      // connection will be made before negotiation has finished on both sides.
-      client1_.SetLocalTransportDescription(client1_.certificate(),
-                                            cricket::CA_OFFER, client1_role, 0);
-      client2_.SetRemoteTransportDescription(
-          client1_.certificate(), cricket::CA_OFFER, client1_role, 0);
-      client2_.SetLocalTransportDescription(
-          client2_.certificate(), cricket::CA_ANSWER, client2_role, 0);
-      rv = client1_.Connect(&client2_, false);
-      client1_.SetRemoteTransportDescription(
-          client2_.certificate(), cricket::CA_ANSWER, client2_role, 0);
-    }
-
-    EXPECT_TRUE(rv);
-    if (!rv)
-      return false;
-
-    EXPECT_TRUE_SIMULATED_WAIT(client1_.all_dtls_transports_writable() &&
-                                   client2_.all_dtls_transports_writable(),
-                               kTimeout, fake_clock_);
-    if (!client1_.all_dtls_transports_writable() ||
-        !client2_.all_dtls_transports_writable())
-      return false;
-
-    // Check that we used the right roles.
-    if (use_dtls_) {
-      rtc::SSLRole client1_ssl_role =
-          (client1_role == cricket::CONNECTIONROLE_ACTIVE ||
-           (client2_role == cricket::CONNECTIONROLE_PASSIVE &&
-            client1_role == cricket::CONNECTIONROLE_ACTPASS))
-              ? rtc::SSL_CLIENT
-              : rtc::SSL_SERVER;
-
-      rtc::SSLRole client2_ssl_role =
-          (client2_role == cricket::CONNECTIONROLE_ACTIVE ||
-           (client1_role == cricket::CONNECTIONROLE_PASSIVE &&
-            client2_role == cricket::CONNECTIONROLE_ACTPASS))
-              ? rtc::SSL_CLIENT
-              : rtc::SSL_SERVER;
-
-      client1_.CheckRole(client1_ssl_role);
-      client2_.CheckRole(client2_ssl_role);
-    }
-
-    if (use_dtls_) {
-      // Check that we negotiated the right ciphers. Since GCM ciphers are not
-      // negotiated by default, we should end up with SRTP_AES128_CM_SHA1_32.
-      client1_.CheckSrtp(rtc::SRTP_AES128_CM_SHA1_32);
-      client2_.CheckSrtp(rtc::SRTP_AES128_CM_SHA1_32);
-    } else {
-      // If DTLS isn't actually being used, GetSrtpCryptoSuite should return
-      // false.
-      client1_.CheckSrtp(rtc::SRTP_INVALID_CRYPTO_SUITE);
-      client2_.CheckSrtp(rtc::SRTP_INVALID_CRYPTO_SUITE);
-    }
-
-    client1_.CheckSsl();
-    client2_.CheckSsl();
-
-    return true;
-  }
-
-  bool Connect() {
-    // By default, Client1 will be Server and Client2 will be Client.
-    return Connect(cricket::CONNECTIONROLE_ACTPASS,
-                   cricket::CONNECTIONROLE_ACTIVE);
-  }
-
-  void Negotiate() {
-    Negotiate(cricket::CONNECTIONROLE_ACTPASS, cricket::CONNECTIONROLE_ACTIVE);
-  }
-
-  void Negotiate(ConnectionRole client1_role, ConnectionRole client2_role) {
-    client1_.SetupChannels(channel_ct_, cricket::ICEROLE_CONTROLLING);
-    client2_.SetupChannels(channel_ct_, cricket::ICEROLE_CONTROLLED);
-    // Expect success from SLTD and SRTD.
-    client1_.Negotiate(&client2_, cricket::CA_OFFER, client1_role, client2_role,
-                       0);
-    client2_.Negotiate(&client1_, cricket::CA_ANSWER, client2_role,
-                       client1_role, 0);
-  }
-
-  // Negotiate with legacy client |client2|. Legacy client doesn't use setup
-  // attributes, except NONE.
-  void NegotiateWithLegacy() {
-    client1_.SetupChannels(channel_ct_, cricket::ICEROLE_CONTROLLING);
-    client2_.SetupChannels(channel_ct_, cricket::ICEROLE_CONTROLLED);
-    // Expect success from SLTD and SRTD.
-    client1_.Negotiate(&client2_, cricket::CA_OFFER,
-                       cricket::CONNECTIONROLE_ACTPASS,
-                       cricket::CONNECTIONROLE_NONE, 0);
-    client2_.Negotiate(&client1_, cricket::CA_ANSWER,
-                       cricket::CONNECTIONROLE_ACTIVE,
-                       cricket::CONNECTIONROLE_NONE, 0);
-  }
-
-  void Renegotiate(DtlsTestClient* reoffer_initiator,
-                   ConnectionRole client1_role,
-                   ConnectionRole client2_role,
-                   int flags) {
-    if (reoffer_initiator == &client1_) {
-      client1_.Negotiate(&client2_, cricket::CA_OFFER, client1_role,
-                         client2_role, flags);
-      client2_.Negotiate(&client1_, cricket::CA_ANSWER, client2_role,
-                         client1_role, flags);
-    } else {
-      client2_.Negotiate(&client1_, cricket::CA_OFFER, client2_role,
-                         client1_role, flags);
-      client1_.Negotiate(&client2_, cricket::CA_ANSWER, client1_role,
-                         client2_role, flags);
-    }
-  }
-
-  void TestTransfer(size_t transport, size_t size, size_t count, bool srtp) {
-    LOG(LS_INFO) << "Expect packets, size=" << size;
-    client2_.ExpectPackets(transport, size);
-    client1_.SendPackets(transport, size, count, srtp);
-    EXPECT_EQ_SIMULATED_WAIT(count, client2_.NumPacketsReceived(), kTimeout,
-                             fake_clock_);
-  }
-
- protected:
-  rtc::ScopedFakeClock fake_clock_;
-  DtlsTestClient client1_;
-  DtlsTestClient client2_;
-  int channel_ct_;
-  bool use_dtls_;
-  rtc::SSLProtocolVersion ssl_expected_version_;
-};
-
-class DtlsTransportChannelTest : public DtlsTransportChannelTestBase,
-                                 public ::testing::Test {};
-
-// Test that transport negotiation of ICE, no DTLS works properly.
-TEST_F(DtlsTransportChannelTest, TestChannelSetupIce) {
-  Negotiate();
-  cricket::FakeIceTransport* channel1 = client1_.GetFakeIceTransort(0);
-  cricket::FakeIceTransport* channel2 = client2_.GetFakeIceTransort(0);
-  ASSERT_TRUE(channel1 != NULL);
-  ASSERT_TRUE(channel2 != NULL);
-  EXPECT_EQ(cricket::ICEROLE_CONTROLLING, channel1->GetIceRole());
-  EXPECT_EQ(1U, channel1->IceTiebreaker());
-  EXPECT_EQ(kIceUfrag1, channel1->ice_ufrag());
-  EXPECT_EQ(kIcePwd1, channel1->ice_pwd());
-  EXPECT_EQ(cricket::ICEROLE_CONTROLLED, channel2->GetIceRole());
-  EXPECT_EQ(2U, channel2->IceTiebreaker());
-}
-
-// Connect without DTLS, and transfer some data.
-TEST_F(DtlsTransportChannelTest, TestTransfer) {
-  ASSERT_TRUE(Connect());
-  TestTransfer(0, 1000, 100, false);
-}
-
-// Connect without DTLS, and transfer some data.
-TEST_F(DtlsTransportChannelTest, TestOnSentPacket) {
-  ASSERT_TRUE(Connect());
-  EXPECT_EQ(client1_.sent_packet().send_time_ms, -1);
-  TestTransfer(0, 1000, 100, false);
-  EXPECT_EQ(kFakePacketId, client1_.sent_packet().packet_id);
-  EXPECT_GE(client1_.sent_packet().send_time_ms, 0);
-}
-
-// Create two channels without DTLS, and transfer some data.
-TEST_F(DtlsTransportChannelTest, TestTransferTwoChannels) {
-  SetChannelCount(2);
-  ASSERT_TRUE(Connect());
-  TestTransfer(0, 1000, 100, false);
-  TestTransfer(1, 1000, 100, false);
-}
-
-// Connect without DTLS, and transfer SRTP data.
-TEST_F(DtlsTransportChannelTest, TestTransferSrtp) {
-  ASSERT_TRUE(Connect());
-  TestTransfer(0, 1000, 100, true);
-}
-
-// Create two channels without DTLS, and transfer SRTP data.
-TEST_F(DtlsTransportChannelTest, TestTransferSrtpTwoChannels) {
-  SetChannelCount(2);
-  ASSERT_TRUE(Connect());
-  TestTransfer(0, 1000, 100, true);
-  TestTransfer(1, 1000, 100, true);
-}
-
-// Connect with DTLS, and transfer some data.
-TEST_F(DtlsTransportChannelTest, TestTransferDtls) {
-  PrepareDtls(true, true, rtc::KT_DEFAULT);
-  ASSERT_TRUE(Connect());
-  TestTransfer(0, 1000, 100, false);
-}
-
-// Create two channels with DTLS, and transfer some data.
-TEST_F(DtlsTransportChannelTest, TestTransferDtlsTwoChannels) {
-  SetChannelCount(2);
-  PrepareDtls(true, true, rtc::KT_DEFAULT);
-  ASSERT_TRUE(Connect());
-  TestTransfer(0, 1000, 100, false);
-  TestTransfer(1, 1000, 100, false);
-}
-
-// Connect with DTLS, combine multiple DTLS records into one packet.
-// Our DTLS implementation doesn't do this, but other implementations may;
-// see https://tools.ietf.org/html/rfc6347#section-4.1.1.
-// This has caused interoperability problems with ORTCLib in the past.
-TEST_F(DtlsTransportChannelTest, TestTransferDtlsCombineRecords) {
-  PrepareDtls(true, true, rtc::KT_DEFAULT);
-  ASSERT_TRUE(Connect());
-  // Our DTLS implementation always sends one record per packet, so to simulate
-  // an endpoint that sends multiple records per packet, we configure the fake
-  // ICE transport to combine every two consecutive packets into a single
-  // packet.
-  cricket::FakeIceTransport* transport = client1_.GetFakeIceTransort(0);
-  transport->combine_outgoing_packets(true);
-  TestTransfer(0, 500, 100, false);
-}
-
-// Connect with A doing DTLS and B not, and transfer some data.
-TEST_F(DtlsTransportChannelTest, TestTransferDtlsRejected) {
-  PrepareDtls(true, false, rtc::KT_DEFAULT);
-  ASSERT_TRUE(Connect());
-  TestTransfer(0, 1000, 100, false);
-}
-
-// Connect with B doing DTLS and A not, and transfer some data.
-TEST_F(DtlsTransportChannelTest, TestTransferDtlsNotOffered) {
-  PrepareDtls(false, true, rtc::KT_DEFAULT);
-  ASSERT_TRUE(Connect());
-  TestTransfer(0, 1000, 100, false);
-}
-
-// Create two channels with DTLS 1.0 and check ciphers.
-TEST_F(DtlsTransportChannelTest, TestDtls12None) {
-  SetChannelCount(2);
-  PrepareDtls(true, true, rtc::KT_DEFAULT);
-  SetMaxProtocolVersions(rtc::SSL_PROTOCOL_DTLS_10, rtc::SSL_PROTOCOL_DTLS_10);
-  ASSERT_TRUE(Connect());
-}
-
-// Create two channels with DTLS 1.2 and check ciphers.
-TEST_F(DtlsTransportChannelTest, TestDtls12Both) {
-  SetChannelCount(2);
-  PrepareDtls(true, true, rtc::KT_DEFAULT);
-  SetMaxProtocolVersions(rtc::SSL_PROTOCOL_DTLS_12, rtc::SSL_PROTOCOL_DTLS_12);
-  ASSERT_TRUE(Connect());
-}
-
-// Create two channels with DTLS 1.0 / DTLS 1.2 and check ciphers.
-TEST_F(DtlsTransportChannelTest, TestDtls12Client1) {
-  SetChannelCount(2);
-  PrepareDtls(true, true, rtc::KT_DEFAULT);
-  SetMaxProtocolVersions(rtc::SSL_PROTOCOL_DTLS_12, rtc::SSL_PROTOCOL_DTLS_10);
-  ASSERT_TRUE(Connect());
-}
-
-// Create two channels with DTLS 1.2 / DTLS 1.0 and check ciphers.
-TEST_F(DtlsTransportChannelTest, TestDtls12Client2) {
-  SetChannelCount(2);
-  PrepareDtls(true, true, rtc::KT_DEFAULT);
-  SetMaxProtocolVersions(rtc::SSL_PROTOCOL_DTLS_10, rtc::SSL_PROTOCOL_DTLS_12);
-  ASSERT_TRUE(Connect());
-}
-
-// Connect with DTLS, negotiating DTLS-SRTP, and transfer SRTP using bypass.
-TEST_F(DtlsTransportChannelTest, TestTransferDtlsSrtp) {
-  PrepareDtls(true, true, rtc::KT_DEFAULT);
-  ASSERT_TRUE(Connect());
-  TestTransfer(0, 1000, 100, true);
-}
-
-// Connect with DTLS-SRTP, transfer an invalid SRTP packet, and expects -1
-// returned.
-TEST_F(DtlsTransportChannelTest, TestTransferDtlsInvalidSrtpPacket) {
-  PrepareDtls(true, true, rtc::KT_DEFAULT);
-  ASSERT_TRUE(Connect());
-  int result = client1_.SendInvalidSrtpPacket(0, 100);
-  ASSERT_EQ(-1, result);
-}
-
-// Connect with DTLS. A does DTLS-SRTP but B does not.
-TEST_F(DtlsTransportChannelTest, TestTransferDtlsSrtpRejected) {
-  PrepareDtls(true, true, rtc::KT_DEFAULT);
-  ASSERT_TRUE(Connect());
-}
-
-// Connect with DTLS. B does DTLS-SRTP but A does not.
-TEST_F(DtlsTransportChannelTest, TestTransferDtlsSrtpNotOffered) {
-  PrepareDtls(true, true, rtc::KT_DEFAULT);
-  ASSERT_TRUE(Connect());
-}
-
-// Create two channels with DTLS, negotiate DTLS-SRTP, and transfer bypass SRTP.
-TEST_F(DtlsTransportChannelTest, TestTransferDtlsSrtpTwoChannels) {
-  SetChannelCount(2);
-  PrepareDtls(true, true, rtc::KT_DEFAULT);
-  ASSERT_TRUE(Connect());
-  TestTransfer(0, 1000, 100, true);
-  TestTransfer(1, 1000, 100, true);
-}
-
-// Create a single channel with DTLS, and send normal data and SRTP data on it.
-TEST_F(DtlsTransportChannelTest, TestTransferDtlsSrtpDemux) {
-  PrepareDtls(true, true, rtc::KT_DEFAULT);
-  ASSERT_TRUE(Connect());
-  TestTransfer(0, 1000, 100, false);
-  TestTransfer(0, 1000, 100, true);
-}
-
-// Testing when the remote is passive.
-TEST_F(DtlsTransportChannelTest, TestTransferDtlsAnswererIsPassive) {
-  SetChannelCount(2);
-  PrepareDtls(true, true, rtc::KT_DEFAULT);
-  ASSERT_TRUE(Connect(cricket::CONNECTIONROLE_ACTPASS,
-                      cricket::CONNECTIONROLE_PASSIVE));
-  TestTransfer(0, 1000, 100, true);
-  TestTransfer(1, 1000, 100, true);
-}
-
-// Testing with the legacy DTLS client which doesn't use setup attribute.
-// In this case legacy is the answerer.
-TEST_F(DtlsTransportChannelTest, TestDtlsSetupWithLegacyAsAnswerer) {
-  PrepareDtls(true, true, rtc::KT_DEFAULT);
-  NegotiateWithLegacy();
-  EXPECT_EQ(rtc::SSL_SERVER, *client1_.transport()->GetSslRole());
-  EXPECT_EQ(rtc::SSL_CLIENT, *client2_.transport()->GetSslRole());
-}
-
-// Testing re offer/answer after the session is estbalished. Roles will be
-// kept same as of the previous negotiation.
-TEST_F(DtlsTransportChannelTest, TestDtlsReOfferFromOfferer) {
-  SetChannelCount(2);
-  PrepareDtls(true, true, rtc::KT_DEFAULT);
-  // Initial role for client1 is ACTPASS and client2 is ACTIVE.
-  ASSERT_TRUE(
-      Connect(cricket::CONNECTIONROLE_ACTPASS, cricket::CONNECTIONROLE_ACTIVE));
-  TestTransfer(0, 1000, 100, true);
-  TestTransfer(1, 1000, 100, true);
-  // Using input roles for the re-offer.
-  Renegotiate(&client1_, cricket::CONNECTIONROLE_ACTPASS,
-              cricket::CONNECTIONROLE_ACTIVE, NF_REOFFER);
-  TestTransfer(0, 1000, 100, true);
-  TestTransfer(1, 1000, 100, true);
-}
-
-TEST_F(DtlsTransportChannelTest, TestDtlsReOfferFromAnswerer) {
-  SetChannelCount(2);
-  PrepareDtls(true, true, rtc::KT_DEFAULT);
-  // Initial role for client1 is ACTPASS and client2 is ACTIVE.
-  ASSERT_TRUE(
-      Connect(cricket::CONNECTIONROLE_ACTPASS, cricket::CONNECTIONROLE_ACTIVE));
-  TestTransfer(0, 1000, 100, true);
-  TestTransfer(1, 1000, 100, true);
-  // Using input roles for the re-offer.
-  Renegotiate(&client2_, cricket::CONNECTIONROLE_PASSIVE,
-              cricket::CONNECTIONROLE_ACTPASS, NF_REOFFER);
-  TestTransfer(0, 1000, 100, true);
-  TestTransfer(1, 1000, 100, true);
-}
-
-// Test that any change in role after the intial setup will result in failure.
-TEST_F(DtlsTransportChannelTest, TestDtlsRoleReversal) {
-  SetChannelCount(2);
-  PrepareDtls(true, true, rtc::KT_DEFAULT);
-  ASSERT_TRUE(Connect(cricket::CONNECTIONROLE_ACTPASS,
-                      cricket::CONNECTIONROLE_PASSIVE));
-
-  // Renegotiate from client2 with actpass and client1 as active.
-  Renegotiate(&client2_, cricket::CONNECTIONROLE_ACTPASS,
-              cricket::CONNECTIONROLE_ACTIVE, NF_REOFFER | NF_EXPECT_FAILURE);
-}
-
-// Test that using different setup attributes which results in similar ssl
-// role as the initial negotiation will result in success.
-TEST_F(DtlsTransportChannelTest, TestDtlsReOfferWithDifferentSetupAttr) {
-  SetChannelCount(2);
-  PrepareDtls(true, true, rtc::KT_DEFAULT);
-  ASSERT_TRUE(Connect(cricket::CONNECTIONROLE_ACTPASS,
-                      cricket::CONNECTIONROLE_PASSIVE));
-  // Renegotiate from client2 with actpass and client1 as active.
-  Renegotiate(&client2_, cricket::CONNECTIONROLE_ACTIVE,
-              cricket::CONNECTIONROLE_ACTPASS, NF_REOFFER);
-  TestTransfer(0, 1000, 100, true);
-  TestTransfer(1, 1000, 100, true);
-}
-
-// Test that re-negotiation can be started before the clients become connected
-// in the first negotiation.
-TEST_F(DtlsTransportChannelTest, TestRenegotiateBeforeConnect) {
-  SetChannelCount(2);
-  PrepareDtls(true, true, rtc::KT_DEFAULT);
-  Negotiate();
-
-  Renegotiate(&client1_, cricket::CONNECTIONROLE_ACTPASS,
-              cricket::CONNECTIONROLE_ACTIVE, NF_REOFFER);
-  bool rv = client1_.Connect(&client2_, false);
-  EXPECT_TRUE(rv);
-  EXPECT_TRUE_SIMULATED_WAIT(client1_.all_dtls_transports_writable() &&
-                                 client2_.all_dtls_transports_writable(),
-                             kTimeout, fake_clock_);
-
-  TestTransfer(0, 1000, 100, true);
-  TestTransfer(1, 1000, 100, true);
-}
-
-// Test Certificates state after negotiation but before connection.
-TEST_F(DtlsTransportChannelTest, TestCertificatesBeforeConnect) {
-  PrepareDtls(true, true, rtc::KT_DEFAULT);
-  Negotiate();
-
-  rtc::scoped_refptr<rtc::RTCCertificate> certificate1;
-  rtc::scoped_refptr<rtc::RTCCertificate> certificate2;
-  std::unique_ptr<rtc::SSLCertificate> remote_cert1;
-  std::unique_ptr<rtc::SSLCertificate> remote_cert2;
-
-  // After negotiation, each side has a distinct local certificate, but still no
-  // remote certificate, because connection has not yet occurred.
-  ASSERT_TRUE(client1_.transport()->GetLocalCertificate(&certificate1));
-  ASSERT_TRUE(client2_.transport()->GetLocalCertificate(&certificate2));
-  ASSERT_NE(certificate1->ssl_certificate().ToPEMString(),
-            certificate2->ssl_certificate().ToPEMString());
-  ASSERT_FALSE(client1_.GetDtlsTransport(0)->GetRemoteSSLCertificate());
-  ASSERT_FALSE(client2_.GetDtlsTransport(0)->GetRemoteSSLCertificate());
-}
-
-// Test Certificates state after connection.
-TEST_F(DtlsTransportChannelTest, TestCertificatesAfterConnect) {
-  PrepareDtls(true, true, rtc::KT_DEFAULT);
-  ASSERT_TRUE(Connect());
-
-  rtc::scoped_refptr<rtc::RTCCertificate> certificate1;
-  rtc::scoped_refptr<rtc::RTCCertificate> certificate2;
-
-  // After connection, each side has a distinct local certificate.
-  ASSERT_TRUE(client1_.transport()->GetLocalCertificate(&certificate1));
-  ASSERT_TRUE(client2_.transport()->GetLocalCertificate(&certificate2));
-  ASSERT_NE(certificate1->ssl_certificate().ToPEMString(),
-            certificate2->ssl_certificate().ToPEMString());
-
-  // Each side's remote certificate is the other side's local certificate.
-  std::unique_ptr<rtc::SSLCertificate> remote_cert1 =
-      client1_.GetDtlsTransport(0)->GetRemoteSSLCertificate();
-  ASSERT_TRUE(remote_cert1);
-  ASSERT_EQ(remote_cert1->ToPEMString(),
-            certificate2->ssl_certificate().ToPEMString());
-  std::unique_ptr<rtc::SSLCertificate> remote_cert2 =
-      client2_.GetDtlsTransport(0)->GetRemoteSSLCertificate();
-  ASSERT_TRUE(remote_cert2);
-  ASSERT_EQ(remote_cert2->ToPEMString(),
-            certificate1->ssl_certificate().ToPEMString());
-}
-
-// Test that packets are retransmitted according to the expected schedule.
-// Each time a timeout occurs, the retransmission timer should be doubled up to
-// 60 seconds. The timer defaults to 1 second, but for WebRTC we should be
-// initializing it to 50ms.
-TEST_F(DtlsTransportChannelTest, TestRetransmissionSchedule) {
-  // We can only change the retransmission schedule with a recently-added
-  // BoringSSL API. Skip the test if not built with BoringSSL.
-  MAYBE_SKIP_TEST(IsBoringSsl);
-
-  PrepareDtls(true, true, rtc::KT_DEFAULT);
-  // Exchange transport descriptions.
-  Negotiate(cricket::CONNECTIONROLE_ACTPASS, cricket::CONNECTIONROLE_ACTIVE);
-
-  // Make client2_ writable, but not client1_.
-  // This means client1_ will send DTLS client hellos but get no response.
-  EXPECT_TRUE(client2_.Connect(&client1_, true));
-  EXPECT_TRUE_SIMULATED_WAIT(client2_.all_ice_transports_writable(), kTimeout,
-                             fake_clock_);
-
-  // Wait for the first client hello to be sent.
-  EXPECT_EQ_WAIT(1, client1_.received_dtls_client_hellos(), kTimeout);
-  EXPECT_FALSE(client1_.all_ice_transports_writable());
-
-  static int timeout_schedule_ms[] = {50,   100,  200,   400,   800,   1600,
-                                      3200, 6400, 12800, 25600, 51200, 60000};
-
-  int expected_hellos = 1;
-  for (size_t i = 0;
-       i < (sizeof(timeout_schedule_ms) / sizeof(timeout_schedule_ms[0]));
-       ++i) {
-    // For each expected retransmission time, advance the fake clock a
-    // millisecond before the expected time and verify that no unexpected
-    // retransmissions were sent. Then advance it the final millisecond and
-    // verify that the expected retransmission was sent.
-    fake_clock_.AdvanceTime(
-        rtc::TimeDelta::FromMilliseconds(timeout_schedule_ms[i] - 1));
-    EXPECT_EQ(expected_hellos, client1_.received_dtls_client_hellos());
-    fake_clock_.AdvanceTime(rtc::TimeDelta::FromMilliseconds(1));
-    EXPECT_EQ(++expected_hellos, client1_.received_dtls_client_hellos());
-  }
-}
-
-// Test that a DTLS connection can be made even if the underlying transport
-// is connected before DTLS fingerprints/roles have been negotiated.
-TEST_F(DtlsTransportChannelTest, TestConnectBeforeNegotiate) {
-  PrepareDtls(true, true, rtc::KT_DEFAULT);
-  ASSERT_TRUE(Connect(cricket::CONNECTIONROLE_ACTPASS,
-                      cricket::CONNECTIONROLE_ACTIVE,
-                      CONNECT_BEFORE_NEGOTIATE));
-  TestTransfer(0, 1000, 100, false);
-}
-
-// The following events can occur in many different orders:
-// 1. Caller receives remote fingerprint.
-// 2. Caller is writable.
-// 3. Caller receives ClientHello.
-// 4. DTLS handshake finishes.
-//
-// The tests below cover all causally consistent permutations of these events;
-// the caller must be writable and receive a ClientHello before the handshake
-// finishes, but otherwise any ordering is possible.
-//
-// For each permutation, the test verifies that a connection is established and
-// fingerprint verified without any DTLS packet needing to be retransmitted.
-//
-// Each permutation is also tested with valid and invalid fingerprints,
-// ensuring that the handshake fails with an invalid fingerprint.
-enum DtlsTransportEvent {
-  CALLER_RECEIVES_FINGERPRINT,
-  CALLER_WRITABLE,
-  CALLER_RECEIVES_CLIENTHELLO,
-  HANDSHAKE_FINISHES
-};
-
-class DtlsEventOrderingTest
-    : public DtlsTransportChannelTestBase,
-      public ::testing::TestWithParam<
-          ::testing::tuple<std::vector<DtlsTransportEvent>, bool>> {
- protected:
-  // If |valid_fingerprint| is false, the caller will receive a fingerprint
-  // that doesn't match the callee's certificate, so the handshake should fail.
-  void TestEventOrdering(const std::vector<DtlsTransportEvent>& events,
-                         bool valid_fingerprint) {
-    // Pre-setup: Set local certificate on both caller and callee, and
-    // remote fingerprint on callee, but neither is writable and the caller
-    // doesn't have the callee's fingerprint.
-    PrepareDtls(true, true, rtc::KT_DEFAULT);
-    // Simulate packets being sent and arriving asynchronously.
-    // Otherwise the entire DTLS handshake would occur in one clock tick, and
-    // we couldn't inject method calls in the middle of it.
-    int simulated_delay_ms = 10;
-    client1_.SetupChannels(channel_ct_, cricket::ICEROLE_CONTROLLING,
-                           simulated_delay_ms);
-    client2_.SetupChannels(channel_ct_, cricket::ICEROLE_CONTROLLED,
-                           simulated_delay_ms);
-    client1_.SetLocalTransportDescription(client1_.certificate(),
-                                          cricket::CA_OFFER,
-                                          cricket::CONNECTIONROLE_ACTPASS, 0);
-    client2_.Negotiate(&client1_, cricket::CA_ANSWER,
-                       cricket::CONNECTIONROLE_ACTIVE,
-                       cricket::CONNECTIONROLE_ACTPASS, 0);
-
-    for (DtlsTransportEvent e : events) {
-      switch (e) {
-        case CALLER_RECEIVES_FINGERPRINT:
-          if (valid_fingerprint) {
-            client1_.SetRemoteTransportDescription(
-                client2_.certificate(), cricket::CA_ANSWER,
-                cricket::CONNECTIONROLE_ACTIVE, 0);
-          } else {
-            // Create a fingerprint with a correct algorithm but an invalid
-            // digest.
-            cricket::TransportDescription remote_desc =
-                MakeTransportDescription(client2_.certificate(),
-                                         cricket::CONNECTIONROLE_ACTIVE);
-            ++(remote_desc.identity_fingerprint->digest[0]);
-            // Even if certificate verification fails inside this method,
-            // it should return true as long as the fingerprint was formatted
-            // correctly.
-            EXPECT_TRUE(client1_.transport()->SetRemoteTransportDescription(
-                remote_desc, cricket::CA_ANSWER, nullptr));
-          }
-          break;
-        case CALLER_WRITABLE:
-          EXPECT_TRUE(client1_.Connect(&client2_, true));
-          EXPECT_TRUE_SIMULATED_WAIT(client1_.all_ice_transports_writable(),
-                                     kTimeout, fake_clock_);
-          break;
-        case CALLER_RECEIVES_CLIENTHELLO:
-          // Sanity check that a ClientHello hasn't already been received.
-          EXPECT_EQ(0, client1_.received_dtls_client_hellos());
-          // Making client2_ writable will cause it to send the ClientHello.
-          EXPECT_TRUE(client2_.Connect(&client1_, true));
-          EXPECT_TRUE_SIMULATED_WAIT(client2_.all_ice_transports_writable(),
-                                     kTimeout, fake_clock_);
-          EXPECT_EQ_SIMULATED_WAIT(1, client1_.received_dtls_client_hellos(),
-                                   kTimeout, fake_clock_);
-          break;
-        case HANDSHAKE_FINISHES:
-          // Sanity check that the handshake hasn't already finished.
-          EXPECT_FALSE(client1_.GetDtlsTransport(0)->IsDtlsConnected() ||
-                       client1_.GetDtlsTransport(0)->dtls_state() ==
-                           cricket::DTLS_TRANSPORT_FAILED);
-          EXPECT_TRUE_SIMULATED_WAIT(
-              client1_.GetDtlsTransport(0)->IsDtlsConnected() ||
-                  client1_.GetDtlsTransport(0)->dtls_state() ==
-                      cricket::DTLS_TRANSPORT_FAILED,
-              kTimeout, fake_clock_);
-          break;
-      }
-    }
-
-    cricket::DtlsTransportState expected_final_state =
-        valid_fingerprint ? cricket::DTLS_TRANSPORT_CONNECTED
-                          : cricket::DTLS_TRANSPORT_FAILED;
-    EXPECT_EQ_SIMULATED_WAIT(expected_final_state,
-                             client1_.GetDtlsTransport(0)->dtls_state(),
-                             kTimeout, fake_clock_);
-    EXPECT_EQ_SIMULATED_WAIT(expected_final_state,
-                             client2_.GetDtlsTransport(0)->dtls_state(),
-                             kTimeout, fake_clock_);
-
-    // Channel should be writable iff there was a valid fingerprint.
-    EXPECT_EQ(valid_fingerprint, client1_.GetDtlsTransport(0)->writable());
-    EXPECT_EQ(valid_fingerprint, client2_.GetDtlsTransport(0)->writable());
-
-    // Check that no hello needed to be retransmitted.
-    EXPECT_EQ(1, client1_.received_dtls_client_hellos());
-    EXPECT_EQ(1, client2_.received_dtls_server_hellos());
-
-    if (valid_fingerprint) {
-      TestTransfer(0, 1000, 100, false);
-    }
-  }
-};
-
-TEST_P(DtlsEventOrderingTest, TestEventOrdering) {
-  TestEventOrdering(::testing::get<0>(GetParam()),
-                    ::testing::get<1>(GetParam()));
-}
-
-INSTANTIATE_TEST_CASE_P(
-    TestEventOrdering,
-    DtlsEventOrderingTest,
-    ::testing::Combine(
-        ::testing::Values(
-            std::vector<DtlsTransportEvent>{
-                CALLER_RECEIVES_FINGERPRINT, CALLER_WRITABLE,
-                CALLER_RECEIVES_CLIENTHELLO, HANDSHAKE_FINISHES},
-            std::vector<DtlsTransportEvent>{
-                CALLER_WRITABLE, CALLER_RECEIVES_FINGERPRINT,
-                CALLER_RECEIVES_CLIENTHELLO, HANDSHAKE_FINISHES},
-            std::vector<DtlsTransportEvent>{
-                CALLER_WRITABLE, CALLER_RECEIVES_CLIENTHELLO,
-                CALLER_RECEIVES_FINGERPRINT, HANDSHAKE_FINISHES},
-            std::vector<DtlsTransportEvent>{
-                CALLER_WRITABLE, CALLER_RECEIVES_CLIENTHELLO,
-                HANDSHAKE_FINISHES, CALLER_RECEIVES_FINGERPRINT},
-            std::vector<DtlsTransportEvent>{
-                CALLER_RECEIVES_FINGERPRINT, CALLER_RECEIVES_CLIENTHELLO,
-                CALLER_WRITABLE, HANDSHAKE_FINISHES},
-            std::vector<DtlsTransportEvent>{
-                CALLER_RECEIVES_CLIENTHELLO, CALLER_RECEIVES_FINGERPRINT,
-                CALLER_WRITABLE, HANDSHAKE_FINISHES},
-            std::vector<DtlsTransportEvent>{
-                CALLER_RECEIVES_CLIENTHELLO, CALLER_WRITABLE,
-                CALLER_RECEIVES_FINGERPRINT, HANDSHAKE_FINISHES},
-            std::vector<DtlsTransportEvent>{CALLER_RECEIVES_CLIENTHELLO,
-                                            CALLER_WRITABLE, HANDSHAKE_FINISHES,
-                                            CALLER_RECEIVES_FINGERPRINT}),
-        ::testing::Bool()));
diff --git a/p2p/base/dtlstransportinternal.h b/p2p/base/dtlstransportinternal.h
deleted file mode 100644
index b77ae07..0000000
--- a/p2p/base/dtlstransportinternal.h
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- *  Copyright 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_P2P_BASE_DTLSTRANSPORTINTERNAL_H_
-#define WEBRTC_P2P_BASE_DTLSTRANSPORTINTERNAL_H_
-
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "webrtc/p2p/base/icetransportinternal.h"
-#include "webrtc/p2p/base/jseptransport.h"
-#include "webrtc/p2p/base/packettransportinternal.h"
-#include "webrtc/rtc_base/sslstreamadapter.h"
-#include "webrtc/rtc_base/stringencode.h"
-
-namespace cricket {
-
-enum PacketFlags {
-  PF_NORMAL = 0x00,       // A normal packet.
-  PF_SRTP_BYPASS = 0x01,  // An encrypted SRTP packet; bypass any additional
-                          // crypto provided by the transport (e.g. DTLS)
-};
-
-// DtlsTransportInternal is an internal interface that does DTLS, also
-// negotiating SRTP crypto suites so that it may be used for DTLS-SRTP.
-//
-// Once the public interface is supported,
-// (https://www.w3.org/TR/webrtc/#rtcdtlstransport-interface)
-// the DtlsTransportInterface will be split from this class.
-class DtlsTransportInternal : public rtc::PacketTransportInternal {
- public:
-  virtual ~DtlsTransportInternal() {}
-
-  virtual const rtc::CryptoOptions& crypto_options() const = 0;
-
-  virtual DtlsTransportState dtls_state() const = 0;
-
-  virtual const std::string& transport_name() const = 0;
-
-  virtual int component() const = 0;
-
-  virtual bool IsDtlsActive() const = 0;
-
-  virtual bool GetSslRole(rtc::SSLRole* role) const = 0;
-
-  virtual bool SetSslRole(rtc::SSLRole role) = 0;
-
-  // Finds out which DTLS-SRTP cipher was negotiated.
-  // TODO(zhihuang): Remove this once all dependencies implement this.
-  virtual bool GetSrtpCryptoSuite(int* cipher) = 0;
-
-  // Finds out which DTLS cipher was negotiated.
-  // TODO(zhihuang): Remove this once all dependencies implement this.
-  virtual bool GetSslCipherSuite(int* cipher) = 0;
-
-  // Gets the local RTCCertificate used for DTLS.
-  virtual rtc::scoped_refptr<rtc::RTCCertificate> GetLocalCertificate()
-      const = 0;
-
-  virtual bool SetLocalCertificate(
-      const rtc::scoped_refptr<rtc::RTCCertificate>& certificate) = 0;
-
-  // Gets a copy of the remote side's SSL certificate.
-  virtual std::unique_ptr<rtc::SSLCertificate> GetRemoteSSLCertificate()
-      const = 0;
-
-  // Allows key material to be extracted for external encryption.
-  virtual bool ExportKeyingMaterial(const std::string& label,
-                                    const uint8_t* context,
-                                    size_t context_len,
-                                    bool use_context,
-                                    uint8_t* result,
-                                    size_t result_len) = 0;
-
-  // Set DTLS remote fingerprint. Must be after local identity set.
-  virtual bool SetRemoteFingerprint(const std::string& digest_alg,
-                                    const uint8_t* digest,
-                                    size_t digest_len) = 0;
-
-  // Expose the underneath IceTransport.
-  virtual IceTransportInternal* ice_transport() = 0;
-
-  sigslot::signal2<DtlsTransportInternal*, DtlsTransportState> SignalDtlsState;
-
-  // Emitted whenever the Dtls handshake failed on some transport channel.
-  sigslot::signal1<rtc::SSLHandshakeError> SignalDtlsHandshakeError;
-
-  // Debugging description of this transport.
-  std::string debug_name() const override {
-    return transport_name() + " " + rtc::ToString(component());
-  }
-
- protected:
-  DtlsTransportInternal() {}
-
- private:
-  RTC_DISALLOW_COPY_AND_ASSIGN(DtlsTransportInternal);
-};
-
-}  // namespace cricket
-
-#endif  // WEBRTC_P2P_BASE_DTLSTRANSPORTINTERNAL_H_
diff --git a/p2p/base/fakecandidatepair.h b/p2p/base/fakecandidatepair.h
deleted file mode 100644
index 73e6c67..0000000
--- a/p2p/base/fakecandidatepair.h
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- *  Copyright 2017 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_P2P_BASE_FAKECANDIDATEPAIR_H_
-#define WEBRTC_P2P_BASE_FAKECANDIDATEPAIR_H_
-
-#include <memory>
-
-#include "webrtc/p2p/base/candidate.h"
-#include "webrtc/p2p/base/candidatepairinterface.h"
-
-namespace cricket {
-
-// Fake candidate pair class, which can be passed to BaseChannel for testing
-// purposes.
-class FakeCandidatePair : public CandidatePairInterface {
- public:
-  FakeCandidatePair(const Candidate& local_candidate,
-                    const Candidate& remote_candidate)
-      : local_candidate_(local_candidate),
-        remote_candidate_(remote_candidate) {}
-  const Candidate& local_candidate() const override { return local_candidate_; }
-  const Candidate& remote_candidate() const override {
-    return remote_candidate_;
-  }
-
-  static std::unique_ptr<FakeCandidatePair> Create(
-      const rtc::SocketAddress& local_address,
-      int16_t local_network_id,
-      const rtc::SocketAddress& remote_address,
-      int16_t remote_network_id) {
-    Candidate local_candidate(0, "udp", local_address, 0u, "", "", "local", 0,
-                              "foundation", local_network_id, 0);
-    Candidate remote_candidate(0, "udp", remote_address, 0u, "", "", "local", 0,
-                               "foundation", remote_network_id, 0);
-    return std::unique_ptr<FakeCandidatePair>(
-        new FakeCandidatePair(local_candidate, remote_candidate));
-  }
-
- private:
-  Candidate local_candidate_;
-  Candidate remote_candidate_;
-};
-
-}  // namespace cricket
-
-#endif  // WEBRTC_P2P_BASE_FAKECANDIDATEPAIR_H_
diff --git a/p2p/base/fakedtlstransport.h b/p2p/base/fakedtlstransport.h
deleted file mode 100644
index e78c7fc..0000000
--- a/p2p/base/fakedtlstransport.h
+++ /dev/null
@@ -1,254 +0,0 @@
-/*
- *  Copyright 2017 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_P2P_BASE_FAKEDTLSTRANSPORT_H_
-#define WEBRTC_P2P_BASE_FAKEDTLSTRANSPORT_H_
-
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "webrtc/p2p/base/dtlstransportinternal.h"
-#include "webrtc/p2p/base/fakeicetransport.h"
-#include "webrtc/rtc_base/fakesslidentity.h"
-
-namespace cricket {
-
-// Fake DTLS transport which is implemented by wrapping a fake ICE transport.
-// Doesn't interact directly with fake ICE transport for anything other than
-// sending packets.
-class FakeDtlsTransport : public DtlsTransportInternal {
- public:
-  explicit FakeDtlsTransport(FakeIceTransport* ice_transport)
-      : ice_transport_(ice_transport),
-        transport_name_(ice_transport->transport_name()),
-        component_(ice_transport->component()),
-        dtls_fingerprint_("", nullptr, 0) {
-    ice_transport_->SignalReadPacket.connect(
-        this, &FakeDtlsTransport::OnIceTransportReadPacket);
-  }
-
-  // If this constructor is called, a new fake ICE transport will be created,
-  // and this FakeDtlsTransport will take the ownership.
-  explicit FakeDtlsTransport(const std::string& name, int component)
-      : owned_ice_transport_(new FakeIceTransport(name, component)),
-        transport_name_(owned_ice_transport_->transport_name()),
-        component_(owned_ice_transport_->component()),
-        dtls_fingerprint_("", nullptr, 0) {
-    ice_transport_ = owned_ice_transport_.get();
-    ice_transport_->SignalReadPacket.connect(
-        this, &FakeDtlsTransport::OnIceTransportReadPacket);
-  }
-
-  ~FakeDtlsTransport() override {
-    if (dest_ && dest_->dest_ == this) {
-      dest_->dest_ = nullptr;
-    }
-  }
-
-  // Get inner fake ICE transport.
-  FakeIceTransport* fake_ice_transport() { return ice_transport_; }
-
-  // If async, will send packets by "Post"-ing to message queue instead of
-  // synchronously "Send"-ing.
-  void SetAsync(bool async) { ice_transport_->SetAsync(async); }
-  void SetAsyncDelay(int delay_ms) { ice_transport_->SetAsyncDelay(delay_ms); }
-
-  // SetWritable, SetReceiving and SetDestination are the main methods that can
-  // be used for testing, to simulate connectivity or lack thereof.
-  void SetWritable(bool writable) {
-    ice_transport_->SetWritable(writable);
-    set_writable(writable);
-  }
-  void SetReceiving(bool receiving) {
-    ice_transport_->SetReceiving(receiving);
-    set_receiving(receiving);
-  }
-
-  // Simulates the two DTLS transports connecting to each other.
-  // If |asymmetric| is true this method only affects this FakeDtlsTransport.
-  // If false, it affects |dest| as well.
-  void SetDestination(FakeDtlsTransport* dest, bool asymmetric = false) {
-    if (dest == dest_) {
-      return;
-    }
-    RTC_DCHECK(!dest || !dest_)
-        << "Changing fake destination from one to another is not supported.";
-    if (dest && !dest_) {
-      // This simulates the DTLS handshake.
-      dest_ = dest;
-      if (local_cert_ && dest_->local_cert_) {
-        do_dtls_ = true;
-      }
-      SetWritable(true);
-      if (!asymmetric) {
-        dest->SetDestination(this, true);
-      }
-      dtls_state_ = DTLS_TRANSPORT_CONNECTED;
-      ice_transport_->SetDestination(
-          static_cast<FakeIceTransport*>(dest->ice_transport()), asymmetric);
-    } else {
-      // Simulates loss of connectivity, by asymmetrically forgetting dest_.
-      dest_ = nullptr;
-      SetWritable(false);
-      ice_transport_->SetDestination(nullptr, asymmetric);
-    }
-  }
-
-  // Fake DtlsTransportInternal implementation.
-  DtlsTransportState dtls_state() const override { return dtls_state_; }
-  const std::string& transport_name() const override { return transport_name_; }
-  int component() const override { return component_; }
-  const rtc::SSLFingerprint& dtls_fingerprint() const {
-    return dtls_fingerprint_;
-  }
-  bool SetRemoteFingerprint(const std::string& alg,
-                            const uint8_t* digest,
-                            size_t digest_len) override {
-    dtls_fingerprint_ = rtc::SSLFingerprint(alg, digest, digest_len);
-    return true;
-  }
-  bool SetSslRole(rtc::SSLRole role) override {
-    ssl_role_ = role;
-    return true;
-  }
-  bool GetSslRole(rtc::SSLRole* role) const override {
-    *role = ssl_role_;
-    return true;
-  }
-  const rtc::CryptoOptions& crypto_options() const override {
-    return crypto_options_;
-  }
-  void SetCryptoOptions(const rtc::CryptoOptions& crypto_options) {
-    crypto_options_ = crypto_options;
-  }
-  bool SetLocalCertificate(
-      const rtc::scoped_refptr<rtc::RTCCertificate>& certificate) override {
-    local_cert_ = certificate;
-    return true;
-  }
-  void SetRemoteSSLCertificate(rtc::FakeSSLCertificate* cert) {
-    remote_cert_ = cert;
-  }
-  bool IsDtlsActive() const override { return do_dtls_; }
-  bool GetSrtpCryptoSuite(int* crypto_suite) override {
-    if (!do_dtls_) {
-      return false;
-    }
-    *crypto_suite = crypto_suite_;
-    return true;
-  }
-  void SetSrtpCryptoSuite(int crypto_suite) {
-    crypto_suite_ = crypto_suite;
-  }
-  bool GetSslCipherSuite(int* cipher_suite) override { return false; }
-  rtc::scoped_refptr<rtc::RTCCertificate> GetLocalCertificate() const override {
-    return local_cert_;
-  }
-  std::unique_ptr<rtc::SSLCertificate> GetRemoteSSLCertificate()
-      const override {
-    return remote_cert_ ? std::unique_ptr<rtc::SSLCertificate>(
-                              remote_cert_->GetReference())
-                        : nullptr;
-  }
-  bool ExportKeyingMaterial(const std::string& label,
-                            const uint8_t* context,
-                            size_t context_len,
-                            bool use_context,
-                            uint8_t* result,
-                            size_t result_len) override {
-    if (!do_dtls_) {
-      return false;
-    }
-    memset(result, 0xff, result_len);
-    return true;
-  }
-  void set_ssl_max_protocol_version(rtc::SSLProtocolVersion version) {
-    ssl_max_version_ = version;
-  }
-  rtc::SSLProtocolVersion ssl_max_protocol_version() const {
-    return ssl_max_version_;
-  }
-
-  IceTransportInternal* ice_transport() override { return ice_transport_; }
-
-  // PacketTransportInternal implementation, which passes through to fake ICE
-  // transport for sending actual packets.
-  bool writable() const override { return writable_; }
-  bool receiving() const override { return receiving_; }
-  int SendPacket(const char* data,
-                 size_t len,
-                 const rtc::PacketOptions& options,
-                 int flags) override {
-    // We expect only SRTP packets to be sent through this interface.
-    if (flags != PF_SRTP_BYPASS && flags != 0) {
-      return -1;
-    }
-    return ice_transport_->SendPacket(data, len, options, flags);
-  }
-  int SetOption(rtc::Socket::Option opt, int value) override {
-    return ice_transport_->SetOption(opt, value);
-  }
-  bool GetOption(rtc::Socket::Option opt, int* value) override {
-    return ice_transport_->GetOption(opt, value);
-  }
-  int GetError() override { return ice_transport_->GetError(); }
-
- private:
-  void OnIceTransportReadPacket(PacketTransportInternal* ice_,
-                                const char* data,
-                                size_t len,
-                                const rtc::PacketTime& time,
-                                int flags) {
-    SignalReadPacket(this, data, len, time, flags);
-  }
-
-  void set_receiving(bool receiving) {
-    if (receiving_ == receiving) {
-      return;
-    }
-    receiving_ = receiving;
-    SignalReceivingState(this);
-  }
-
-  void set_writable(bool writable) {
-    if (writable_ == writable) {
-      return;
-    }
-    writable_ = writable;
-    if (writable_) {
-      SignalReadyToSend(this);
-    }
-    SignalWritableState(this);
-  }
-
-  FakeIceTransport* ice_transport_;
-  std::unique_ptr<FakeIceTransport> owned_ice_transport_;
-  std::string transport_name_;
-  int component_;
-  FakeDtlsTransport* dest_ = nullptr;
-  rtc::scoped_refptr<rtc::RTCCertificate> local_cert_;
-  rtc::FakeSSLCertificate* remote_cert_ = nullptr;
-  bool do_dtls_ = false;
-  rtc::SSLProtocolVersion ssl_max_version_ = rtc::SSL_PROTOCOL_DTLS_12;
-  rtc::SSLFingerprint dtls_fingerprint_;
-  rtc::SSLRole ssl_role_ = rtc::SSL_CLIENT;
-  int crypto_suite_ = rtc::SRTP_AES128_CM_SHA1_80;
-  rtc::CryptoOptions crypto_options_;
-
-  DtlsTransportState dtls_state_ = DTLS_TRANSPORT_NEW;
-
-  bool receiving_ = false;
-  bool writable_ = false;
-};
-
-}  // namespace cricket
-
-#endif  // WEBRTC_P2P_BASE_FAKEDTLSTRANSPORT_H_
diff --git a/p2p/base/fakeicetransport.h b/p2p/base/fakeicetransport.h
deleted file mode 100644
index eff246e..0000000
--- a/p2p/base/fakeicetransport.h
+++ /dev/null
@@ -1,251 +0,0 @@
-/*
- *  Copyright 2017 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_P2P_BASE_FAKEICETRANSPORT_H_
-#define WEBRTC_P2P_BASE_FAKEICETRANSPORT_H_
-
-#include <string>
-
-#include "webrtc/p2p/base/icetransportinternal.h"
-#include "webrtc/rtc_base/asyncinvoker.h"
-#include "webrtc/rtc_base/copyonwritebuffer.h"
-
-namespace cricket {
-
-class FakeIceTransport : public IceTransportInternal {
- public:
-  explicit FakeIceTransport(const std::string& name, int component)
-      : name_(name), component_(component) {}
-  ~FakeIceTransport() override {
-    if (dest_ && dest_->dest_ == this) {
-      dest_->dest_ = nullptr;
-    }
-  }
-
-  // If async, will send packets by "Post"-ing to message queue instead of
-  // synchronously "Send"-ing.
-  void SetAsync(bool async) { async_ = async; }
-  void SetAsyncDelay(int delay_ms) { async_delay_ms_ = delay_ms; }
-
-  // SetWritable, SetReceiving and SetDestination are the main methods that can
-  // be used for testing, to simulate connectivity or lack thereof.
-  void SetWritable(bool writable) { set_writable(writable); }
-  void SetReceiving(bool receiving) { set_receiving(receiving); }
-
-  // Simulates the two transports connecting to each other.
-  // If |asymmetric| is true this method only affects this FakeIceTransport.
-  // If false, it affects |dest| as well.
-  void SetDestination(FakeIceTransport* dest, bool asymmetric = false) {
-    if (dest == dest_) {
-      return;
-    }
-    RTC_DCHECK(!dest || !dest_)
-        << "Changing fake destination from one to another is not supported.";
-    if (dest) {
-      // This simulates the delivery of candidates.
-      dest_ = dest;
-      set_writable(true);
-      if (!asymmetric) {
-        dest->SetDestination(this, true);
-      }
-    } else {
-      // Simulates loss of connectivity, by asymmetrically forgetting dest_.
-      dest_ = nullptr;
-      set_writable(false);
-    }
-  }
-
-  void SetConnectionCount(size_t connection_count) {
-    size_t old_connection_count = connection_count_;
-    connection_count_ = connection_count;
-    if (connection_count) {
-      had_connection_ = true;
-    }
-    // In this fake transport channel, |connection_count_| determines the
-    // transport state.
-    if (connection_count_ < old_connection_count) {
-      SignalStateChanged(this);
-    }
-  }
-
-  void SetCandidatesGatheringComplete() {
-    if (gathering_state_ != kIceGatheringComplete) {
-      gathering_state_ = kIceGatheringComplete;
-      SignalGatheringState(this);
-    }
-  }
-
-  // Convenience functions for accessing ICE config and other things.
-  int receiving_timeout() const { return ice_config_.receiving_timeout; }
-  bool gather_continually() const { return ice_config_.gather_continually(); }
-  const Candidates& remote_candidates() const { return remote_candidates_; }
-
-  // Fake IceTransportInternal implementation.
-  const std::string& transport_name() const override { return name_; }
-  int component() const override { return component_; }
-  uint64_t IceTiebreaker() const { return tiebreaker_; }
-  IceMode remote_ice_mode() const { return remote_ice_mode_; }
-  const std::string& ice_ufrag() const { return ice_ufrag_; }
-  const std::string& ice_pwd() const { return ice_pwd_; }
-  const std::string& remote_ice_ufrag() const { return remote_ice_ufrag_; }
-  const std::string& remote_ice_pwd() const { return remote_ice_pwd_; }
-
-  IceTransportState GetState() const override {
-    if (connection_count_ == 0) {
-      return had_connection_ ? IceTransportState::STATE_FAILED
-                             : IceTransportState::STATE_INIT;
-    }
-
-    if (connection_count_ == 1) {
-      return IceTransportState::STATE_COMPLETED;
-    }
-
-    return IceTransportState::STATE_CONNECTING;
-  }
-
-  void SetIceRole(IceRole role) override { role_ = role; }
-  IceRole GetIceRole() const override { return role_; }
-  void SetIceTiebreaker(uint64_t tiebreaker) override {
-    tiebreaker_ = tiebreaker;
-  }
-  void SetIceParameters(const IceParameters& ice_params) override {
-    ice_ufrag_ = ice_params.ufrag;
-    ice_pwd_ = ice_params.pwd;
-  }
-  void SetRemoteIceParameters(const IceParameters& params) override {
-    remote_ice_ufrag_ = params.ufrag;
-    remote_ice_pwd_ = params.pwd;
-  }
-
-  void SetRemoteIceMode(IceMode mode) override { remote_ice_mode_ = mode; }
-
-  void MaybeStartGathering() override {
-    if (gathering_state_ == kIceGatheringNew) {
-      gathering_state_ = kIceGatheringGathering;
-      SignalGatheringState(this);
-    }
-  }
-
-  IceGatheringState gathering_state() const override {
-    return gathering_state_;
-  }
-
-  void SetIceConfig(const IceConfig& config) override { ice_config_ = config; }
-
-  void AddRemoteCandidate(const Candidate& candidate) override {
-    remote_candidates_.push_back(candidate);
-  }
-  void RemoveRemoteCandidate(const Candidate& candidate) override {}
-
-  bool GetStats(ConnectionInfos* infos) override {
-    ConnectionInfo info;
-    infos->clear();
-    infos->push_back(info);
-    return true;
-  }
-
-  rtc::Optional<int> GetRttEstimate() override {
-    return rtc::Optional<int>();
-  }
-
-  void SetMetricsObserver(webrtc::MetricsObserverInterface* observer) override {
-  }
-
-  // Fake PacketTransportInternal implementation.
-  bool writable() const override { return writable_; }
-  bool receiving() const override { return receiving_; }
-  // If combine is enabled, every two consecutive packets to be sent with
-  // "SendPacket" will be combined into one outgoing packet.
-  void combine_outgoing_packets(bool combine) {
-    combine_outgoing_packets_ = combine;
-  }
-  int SendPacket(const char* data,
-                 size_t len,
-                 const rtc::PacketOptions& options,
-                 int flags) override {
-    if (!dest_) {
-      return -1;
-    }
-
-    send_packet_.AppendData(data, len);
-    if (!combine_outgoing_packets_ || send_packet_.size() > len) {
-      rtc::CopyOnWriteBuffer packet(std::move(send_packet_));
-      if (async_) {
-        invoker_.AsyncInvokeDelayed<void>(
-            RTC_FROM_HERE, rtc::Thread::Current(),
-            rtc::Bind(&FakeIceTransport::SendPacketInternal, this, packet),
-            async_delay_ms_);
-      } else {
-        SendPacketInternal(packet);
-      }
-    }
-    rtc::SentPacket sent_packet(options.packet_id, rtc::TimeMillis());
-    SignalSentPacket(this, sent_packet);
-    return static_cast<int>(len);
-  }
-  int SetOption(rtc::Socket::Option opt, int value) override { return true; }
-  bool GetOption(rtc::Socket::Option opt, int* value) override { return true; }
-  int GetError() override { return 0; }
-
- private:
-  void set_writable(bool writable) {
-    if (writable_ == writable) {
-      return;
-    }
-    LOG(INFO) << "set_writable from:" << writable_ << " to " << writable;
-    writable_ = writable;
-    if (writable_) {
-      SignalReadyToSend(this);
-    }
-    SignalWritableState(this);
-  }
-
-  void set_receiving(bool receiving) {
-    if (receiving_ == receiving) {
-      return;
-    }
-    receiving_ = receiving;
-    SignalReceivingState(this);
-  }
-
-  void SendPacketInternal(const rtc::CopyOnWriteBuffer& packet) {
-    if (dest_) {
-      dest_->SignalReadPacket(dest_, packet.data<char>(), packet.size(),
-                              rtc::CreatePacketTime(0), 0);
-    }
-  }
-
-  rtc::AsyncInvoker invoker_;
-  std::string name_;
-  int component_;
-  FakeIceTransport* dest_ = nullptr;
-  bool async_ = false;
-  int async_delay_ms_ = 0;
-  Candidates remote_candidates_;
-  IceConfig ice_config_;
-  IceRole role_ = ICEROLE_UNKNOWN;
-  uint64_t tiebreaker_ = 0;
-  std::string ice_ufrag_;
-  std::string ice_pwd_;
-  std::string remote_ice_ufrag_;
-  std::string remote_ice_pwd_;
-  IceMode remote_ice_mode_ = ICEMODE_FULL;
-  size_t connection_count_ = 0;
-  IceGatheringState gathering_state_ = kIceGatheringNew;
-  bool had_connection_ = false;
-  bool writable_ = false;
-  bool receiving_ = false;
-  bool combine_outgoing_packets_ = false;
-  rtc::CopyOnWriteBuffer send_packet_;
-};
-
-}  // namespace cricket
-
-#endif  // WEBRTC_P2P_BASE_FAKEICETRANSPORT_H_
diff --git a/p2p/base/fakepackettransport.h b/p2p/base/fakepackettransport.h
deleted file mode 100644
index 82d39c2..0000000
--- a/p2p/base/fakepackettransport.h
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- *  Copyright 2017 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_P2P_BASE_FAKEPACKETTRANSPORT_H_
-#define WEBRTC_P2P_BASE_FAKEPACKETTRANSPORT_H_
-
-#include <string>
-
-#include "webrtc/api/ortc/packettransportinterface.h"
-#include "webrtc/p2p/base/packettransportinternal.h"
-#include "webrtc/rtc_base/asyncinvoker.h"
-#include "webrtc/rtc_base/copyonwritebuffer.h"
-
-namespace rtc {
-
-// Used to simulate a packet-based transport.
-class FakePacketTransport : public PacketTransportInternal {
- public:
-  explicit FakePacketTransport(const std::string& debug_name)
-      : debug_name_(debug_name) {}
-  ~FakePacketTransport() override {
-    if (dest_ && dest_->dest_ == this) {
-      dest_->dest_ = nullptr;
-    }
-  }
-
-  // If async, will send packets by "Post"-ing to message queue instead of
-  // synchronously "Send"-ing.
-  void SetAsync(bool async) { async_ = async; }
-  void SetAsyncDelay(int delay_ms) { async_delay_ms_ = delay_ms; }
-
-  // SetWritable, SetReceiving and SetDestination are the main methods that can
-  // be used for testing, to simulate connectivity or lack thereof.
-  void SetWritable(bool writable) { set_writable(writable); }
-  void SetReceiving(bool receiving) { set_receiving(receiving); }
-
-  // Simulates the two transports connecting to each other.
-  // If |asymmetric| is true this method only affects this FakePacketTransport.
-  // If false, it affects |dest| as well.
-  void SetDestination(FakePacketTransport* dest, bool asymmetric) {
-    if (dest) {
-      dest_ = dest;
-      set_writable(true);
-      if (!asymmetric) {
-        dest->SetDestination(this, true);
-      }
-    } else {
-      // Simulates loss of connectivity, by asymmetrically forgetting dest_.
-      dest_ = nullptr;
-      set_writable(false);
-    }
-  }
-
-  // Fake PacketTransportInternal implementation.
-  std::string debug_name() const override { return debug_name_; }
-  bool writable() const override { return writable_; }
-  bool receiving() const override { return receiving_; }
-  int SendPacket(const char* data,
-                 size_t len,
-                 const PacketOptions& options,
-                 int flags) override {
-    if (!dest_) {
-      return -1;
-    }
-    CopyOnWriteBuffer packet(data, len);
-    if (async_) {
-      invoker_.AsyncInvokeDelayed<void>(
-          RTC_FROM_HERE, Thread::Current(),
-          Bind(&FakePacketTransport::SendPacketInternal, this, packet),
-          async_delay_ms_);
-    } else {
-      SendPacketInternal(packet);
-    }
-    SentPacket sent_packet(options.packet_id, TimeMillis());
-    SignalSentPacket(this, sent_packet);
-    return static_cast<int>(len);
-  }
-  int SetOption(Socket::Option opt, int value) override { return true; }
-  bool GetOption(Socket::Option opt, int* value) override { return true; }
-  int GetError() override { return 0; }
-
-  const CopyOnWriteBuffer* last_sent_packet() { return &last_sent_packet_; }
-
- private:
-  void set_writable(bool writable) {
-    if (writable_ == writable) {
-      return;
-    }
-    writable_ = writable;
-    if (writable_) {
-      SignalReadyToSend(this);
-    }
-    SignalWritableState(this);
-  }
-
-  void set_receiving(bool receiving) {
-    if (receiving_ == receiving) {
-      return;
-    }
-    receiving_ = receiving;
-    SignalReceivingState(this);
-  }
-
-  void SendPacketInternal(const CopyOnWriteBuffer& packet) {
-    last_sent_packet_ = packet;
-    if (dest_) {
-      dest_->SignalReadPacket(dest_, packet.data<char>(), packet.size(),
-                              CreatePacketTime(0), 0);
-    }
-  }
-
-  CopyOnWriteBuffer last_sent_packet_;
-  AsyncInvoker invoker_;
-  std::string debug_name_;
-  FakePacketTransport* dest_ = nullptr;
-  bool async_ = false;
-  int async_delay_ms_ = 0;
-  bool writable_ = false;
-  bool receiving_ = false;
-};
-
-}  // namespace rtc
-
-#endif  // WEBRTC_P2P_BASE_FAKEPACKETTRANSPORT_H_
diff --git a/p2p/base/fakeportallocator.h b/p2p/base/fakeportallocator.h
deleted file mode 100644
index d7c30f0..0000000
--- a/p2p/base/fakeportallocator.h
+++ /dev/null
@@ -1,253 +0,0 @@
-/*
- *  Copyright 2010 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_P2P_BASE_FAKEPORTALLOCATOR_H_
-#define WEBRTC_P2P_BASE_FAKEPORTALLOCATOR_H_
-
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "webrtc/p2p/base/basicpacketsocketfactory.h"
-#include "webrtc/p2p/base/portallocator.h"
-#include "webrtc/p2p/base/udpport.h"
-#include "webrtc/rtc_base/nethelpers.h"
-
-namespace rtc {
-class SocketFactory;
-class Thread;
-}
-
-namespace cricket {
-
-class TestUDPPort : public UDPPort {
- public:
-  static TestUDPPort* Create(rtc::Thread* thread,
-                             rtc::PacketSocketFactory* factory,
-                             rtc::Network* network,
-                             uint16_t min_port,
-                             uint16_t max_port,
-                             const std::string& username,
-                             const std::string& password,
-                             const std::string& origin,
-                             bool emit_localhost_for_anyaddress) {
-    TestUDPPort* port =
-        new TestUDPPort(thread, factory, network, min_port, max_port, username,
-                        password, origin, emit_localhost_for_anyaddress);
-    if (!port->Init()) {
-      delete port;
-      port = nullptr;
-    }
-    return port;
-  }
-  void SendBindingResponse(StunMessage* request,
-                           const rtc::SocketAddress& addr) override {
-    UDPPort::SendBindingResponse(request, addr);
-    sent_binding_response_ = true;
-  }
-  bool sent_binding_response() { return sent_binding_response_; }
-  void set_sent_binding_response(bool response) {
-    sent_binding_response_ = response;
-  }
-
- protected:
-  TestUDPPort(rtc::Thread* thread,
-              rtc::PacketSocketFactory* factory,
-              rtc::Network* network,
-              uint16_t min_port,
-              uint16_t max_port,
-              const std::string& username,
-              const std::string& password,
-              const std::string& origin,
-              bool emit_localhost_for_anyaddress)
-      : UDPPort(thread,
-                factory,
-                network,
-                min_port,
-                max_port,
-                username,
-                password,
-                origin,
-                emit_localhost_for_anyaddress) {}
-
-  bool sent_binding_response_ = false;
-};
-
-// A FakePortAllocatorSession can be used with either a real or fake socket
-// factory. It gathers a single loopback port, using IPv6 if available and
-// not disabled.
-class FakePortAllocatorSession : public PortAllocatorSession {
- public:
-  FakePortAllocatorSession(PortAllocator* allocator,
-                           rtc::Thread* network_thread,
-                           rtc::PacketSocketFactory* factory,
-                           const std::string& content_name,
-                           int component,
-                           const std::string& ice_ufrag,
-                           const std::string& ice_pwd)
-      : PortAllocatorSession(content_name,
-                             component,
-                             ice_ufrag,
-                             ice_pwd,
-                             allocator->flags()),
-        network_thread_(network_thread),
-        factory_(factory),
-        ipv4_network_("network",
-                      "unittest",
-                      rtc::IPAddress(INADDR_LOOPBACK),
-                      32),
-        ipv6_network_("network",
-                      "unittest",
-                      rtc::IPAddress(in6addr_loopback),
-                      64),
-        port_(),
-        port_config_count_(0),
-        stun_servers_(allocator->stun_servers()),
-        turn_servers_(allocator->turn_servers()) {
-    ipv4_network_.AddIP(rtc::IPAddress(INADDR_LOOPBACK));
-    ipv6_network_.AddIP(rtc::IPAddress(in6addr_loopback));
-  }
-
-  void SetCandidateFilter(uint32_t filter) override {
-    candidate_filter_ = filter;
-  }
-
-  void StartGettingPorts() override {
-    if (!port_) {
-      rtc::Network& network =
-          (rtc::HasIPv6Enabled() && (flags() & PORTALLOCATOR_ENABLE_IPV6))
-              ? ipv6_network_
-              : ipv4_network_;
-      port_.reset(TestUDPPort::Create(network_thread_, factory_, &network, 0, 0,
-                                      username(), password(), std::string(),
-                                      false));
-      port_->SignalDestroyed.connect(
-          this, &FakePortAllocatorSession::OnPortDestroyed);
-      AddPort(port_.get());
-    }
-    ++port_config_count_;
-    running_ = true;
-  }
-
-  void StopGettingPorts() override { running_ = false; }
-  bool IsGettingPorts() override { return running_; }
-  void ClearGettingPorts() override {}
-
-  std::vector<PortInterface*> ReadyPorts() const override {
-    return ready_ports_;
-  }
-  std::vector<Candidate> ReadyCandidates() const override {
-    return candidates_;
-  }
-  void PruneAllPorts() override { port_->Prune(); }
-  bool CandidatesAllocationDone() const override { return allocation_done_; }
-
-  int port_config_count() { return port_config_count_; }
-
-  const ServerAddresses& stun_servers() const { return stun_servers_; }
-
-  const std::vector<RelayServerConfig>& turn_servers() const {
-    return turn_servers_;
-  }
-
-  uint32_t candidate_filter() const { return candidate_filter_; }
-
-  int transport_info_update_count() const {
-    return transport_info_update_count_;
-  }
-
- protected:
-  void UpdateIceParametersInternal() override {
-    // Since this class is a fake and this method only is overridden for tests,
-    // we don't need to actually update the transport info.
-    ++transport_info_update_count_;
-  }
-
- private:
-  void AddPort(cricket::Port* port) {
-    port->set_component(component());
-    port->set_generation(generation());
-    port->SignalPortComplete.connect(this,
-                                     &FakePortAllocatorSession::OnPortComplete);
-    port->PrepareAddress();
-    ready_ports_.push_back(port);
-    SignalPortReady(this, port);
-    port->KeepAliveUntilPruned();
-  }
-  void OnPortComplete(cricket::Port* port) {
-    const std::vector<Candidate>& candidates = port->Candidates();
-    candidates_.insert(candidates_.end(), candidates.begin(), candidates.end());
-    SignalCandidatesReady(this, candidates);
-
-    allocation_done_ = true;
-    SignalCandidatesAllocationDone(this);
-  }
-  void OnPortDestroyed(cricket::PortInterface* port) {
-    // Don't want to double-delete port if it deletes itself.
-    port_.release();
-  }
-
-  rtc::Thread* network_thread_;
-  rtc::PacketSocketFactory* factory_;
-  rtc::Network ipv4_network_;
-  rtc::Network ipv6_network_;
-  std::unique_ptr<cricket::Port> port_;
-  int port_config_count_;
-  std::vector<Candidate> candidates_;
-  std::vector<PortInterface*> ready_ports_;
-  bool allocation_done_ = false;
-  ServerAddresses stun_servers_;
-  std::vector<RelayServerConfig> turn_servers_;
-  uint32_t candidate_filter_ = CF_ALL;
-  int transport_info_update_count_ = 0;
-  bool running_ = false;
-};
-
-class FakePortAllocator : public cricket::PortAllocator {
- public:
-  FakePortAllocator(rtc::Thread* network_thread,
-                    rtc::PacketSocketFactory* factory)
-      : network_thread_(network_thread), factory_(factory) {
-    if (factory_ == NULL) {
-      owned_factory_.reset(new rtc::BasicPacketSocketFactory(network_thread_));
-      factory_ = owned_factory_.get();
-    }
-  }
-
-  void Initialize() override {
-    // Port allocator should be initialized on the network thread.
-    RTC_CHECK(network_thread_->IsCurrent());
-    initialized_ = true;
-  }
-
-  void SetNetworkIgnoreMask(int network_ignore_mask) override {}
-
-  cricket::PortAllocatorSession* CreateSessionInternal(
-      const std::string& content_name,
-      int component,
-      const std::string& ice_ufrag,
-      const std::string& ice_pwd) override {
-    return new FakePortAllocatorSession(this, network_thread_, factory_,
-                                        content_name, component, ice_ufrag,
-                                        ice_pwd);
-  }
-
-  bool initialized() const { return initialized_; }
-
- private:
-  rtc::Thread* network_thread_;
-  rtc::PacketSocketFactory* factory_;
-  std::unique_ptr<rtc::BasicPacketSocketFactory> owned_factory_;
-  bool initialized_ = false;
-};
-
-}  // namespace cricket
-
-#endif  // WEBRTC_P2P_BASE_FAKEPORTALLOCATOR_H_
diff --git a/p2p/base/faketransportcontroller.h b/p2p/base/faketransportcontroller.h
deleted file mode 100644
index 0c78475..0000000
--- a/p2p/base/faketransportcontroller.h
+++ /dev/null
@@ -1,159 +0,0 @@
-/*
- *  Copyright 2009 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_P2P_BASE_FAKETRANSPORTCONTROLLER_H_
-#define WEBRTC_P2P_BASE_FAKETRANSPORTCONTROLLER_H_
-
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "webrtc/p2p/base/fakedtlstransport.h"
-#include "webrtc/p2p/base/fakeicetransport.h"
-#include "webrtc/p2p/base/transportcontroller.h"
-#include "webrtc/rtc_base/bind.h"
-#include "webrtc/rtc_base/sslfingerprint.h"
-#include "webrtc/rtc_base/thread.h"
-
-namespace cricket {
-
-// Fake TransportController class, which can be passed into a WebRtcSession
-// object for test purposes. Can be connected to other FakeTransportControllers
-// via Connect().
-//
-// This fake is unusual in that for the most part, it's implemented with the
-// real TransportController code, but with fake TransportChannels underneath.
-class FakeTransportController : public TransportController {
- public:
-  FakeTransportController()
-      : TransportController(rtc::Thread::Current(),
-                            rtc::Thread::Current(),
-                            nullptr,
-                            /*redetermine_role_on_ice_restart=*/true,
-                            rtc::CryptoOptions()) {}
-
-  explicit FakeTransportController(bool redetermine_role_on_ice_restart)
-      : TransportController(rtc::Thread::Current(),
-                            rtc::Thread::Current(),
-                            nullptr,
-                            redetermine_role_on_ice_restart,
-                            rtc::CryptoOptions()) {}
-
-  explicit FakeTransportController(IceRole role)
-      : TransportController(rtc::Thread::Current(),
-                            rtc::Thread::Current(),
-                            nullptr,
-                            /*redetermine_role_on_ice_restart=*/true,
-                            rtc::CryptoOptions()) {
-    SetIceRole(role);
-  }
-
-  explicit FakeTransportController(rtc::Thread* network_thread)
-      : TransportController(rtc::Thread::Current(),
-                            network_thread,
-                            nullptr,
-                            /*redetermine_role_on_ice_restart=*/true,
-                            rtc::CryptoOptions()) {}
-
-  FakeTransportController(rtc::Thread* network_thread, IceRole role)
-      : TransportController(rtc::Thread::Current(),
-                            network_thread,
-                            nullptr,
-                            /*redetermine_role_on_ice_restart=*/true,
-                            rtc::CryptoOptions()) {
-    SetIceRole(role);
-  }
-
-  FakeDtlsTransport* GetFakeDtlsTransport_n(const std::string& transport_name,
-                                            int component) {
-    return static_cast<FakeDtlsTransport*>(
-        get_channel_for_testing(transport_name, component));
-  }
-
-  // Simulate the exchange of transport descriptions, and the gathering and
-  // exchange of ICE candidates.
-  void Connect(FakeTransportController* dest) {
-    for (const std::string& transport_name : transport_names_for_testing()) {
-      std::unique_ptr<rtc::SSLFingerprint> local_fingerprint;
-      std::unique_ptr<rtc::SSLFingerprint> remote_fingerprint;
-      if (certificate_for_testing()) {
-        local_fingerprint.reset(rtc::SSLFingerprint::CreateFromCertificate(
-            certificate_for_testing()));
-      }
-      if (dest->certificate_for_testing()) {
-        remote_fingerprint.reset(rtc::SSLFingerprint::CreateFromCertificate(
-            dest->certificate_for_testing()));
-      }
-      TransportDescription local_desc(
-          std::vector<std::string>(),
-          rtc::CreateRandomString(cricket::ICE_UFRAG_LENGTH),
-          rtc::CreateRandomString(cricket::ICE_PWD_LENGTH),
-          cricket::ICEMODE_FULL, cricket::CONNECTIONROLE_NONE,
-          local_fingerprint.get());
-      TransportDescription remote_desc(
-          std::vector<std::string>(),
-          rtc::CreateRandomString(cricket::ICE_UFRAG_LENGTH),
-          rtc::CreateRandomString(cricket::ICE_PWD_LENGTH),
-          cricket::ICEMODE_FULL, cricket::CONNECTIONROLE_NONE,
-          remote_fingerprint.get());
-      std::string err;
-      SetLocalTransportDescription(transport_name, local_desc,
-                                   cricket::CA_OFFER, &err);
-      dest->SetRemoteTransportDescription(transport_name, local_desc,
-                                          cricket::CA_OFFER, &err);
-      dest->SetLocalTransportDescription(transport_name, remote_desc,
-                                         cricket::CA_ANSWER, &err);
-      SetRemoteTransportDescription(transport_name, remote_desc,
-                                    cricket::CA_ANSWER, &err);
-    }
-    MaybeStartGathering();
-    dest->MaybeStartGathering();
-    network_thread()->Invoke<void>(
-        RTC_FROM_HERE,
-        rtc::Bind(&FakeTransportController::SetChannelDestinations_n, this,
-                  dest));
-  }
-
-  void DestroyRtcpTransport(const std::string& transport_name) {
-    DestroyDtlsTransport_n(transport_name,
-                           cricket::ICE_CANDIDATE_COMPONENT_RTCP);
-  }
-
- protected:
-  IceTransportInternal* CreateIceTransportChannel_n(
-      const std::string& transport_name,
-      int component) override {
-    return new FakeIceTransport(transport_name, component);
-  }
-
-  DtlsTransportInternal* CreateDtlsTransportChannel_n(
-      const std::string& transport_name,
-      int component,
-      IceTransportInternal* ice) override {
-    return new FakeDtlsTransport(static_cast<FakeIceTransport*>(ice));
-  }
-
- private:
-  void SetChannelDestinations_n(FakeTransportController* dest) {
-    for (DtlsTransportInternal* tc : channels_for_testing()) {
-      FakeDtlsTransport* local = static_cast<FakeDtlsTransport*>(tc);
-      FakeDtlsTransport* remote = dest->GetFakeDtlsTransport_n(
-          local->transport_name(), local->component());
-      if (remote) {
-        bool asymmetric = false;
-        local->SetDestination(remote, asymmetric);
-      }
-    }
-  }
-};
-
-}  // namespace cricket
-
-#endif  // WEBRTC_P2P_BASE_FAKETRANSPORTCONTROLLER_H_
diff --git a/p2p/base/icetransportinternal.h b/p2p/base/icetransportinternal.h
deleted file mode 100644
index 435a081..0000000
--- a/p2p/base/icetransportinternal.h
+++ /dev/null
@@ -1,150 +0,0 @@
-/*
- *  Copyright 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_P2P_BASE_ICETRANSPORTINTERNAL_H_
-#define WEBRTC_P2P_BASE_ICETRANSPORTINTERNAL_H_
-
-#include <string>
-
-#include "webrtc/p2p/base/candidate.h"
-#include "webrtc/p2p/base/candidatepairinterface.h"
-#include "webrtc/p2p/base/jseptransport.h"
-#include "webrtc/p2p/base/packettransportinternal.h"
-#include "webrtc/p2p/base/transportdescription.h"
-#include "webrtc/rtc_base/stringencode.h"
-
-namespace webrtc {
-class MetricsObserverInterface;
-}
-
-namespace cricket {
-
-// TODO(zhihuang): Replace this with
-// PeerConnectionInterface::IceConnectionState.
-enum class IceTransportState {
-  STATE_INIT,
-  STATE_CONNECTING,  // Will enter this state once a connection is created
-  STATE_COMPLETED,
-  STATE_FAILED
-};
-
-// TODO(zhihuang): Remove this once it's no longer used in
-// remoting/protocol/libjingle_transport_factory.cc
-enum IceProtocolType {
-  ICEPROTO_RFC5245  // Standard RFC 5245 version of ICE.
-};
-
-// IceTransportInternal is an internal abstract class that does ICE.
-// Once the public interface is supported,
-// (https://www.w3.org/TR/webrtc/#rtcicetransport-interface)
-// the IceTransportInterface will be split from this class.
-class IceTransportInternal : public rtc::PacketTransportInternal {
- public:
-  virtual ~IceTransportInternal(){};
-
-  virtual IceTransportState GetState() const = 0;
-
-  virtual const std::string& transport_name() const = 0;
-
-  virtual int component() const = 0;
-
-  virtual IceRole GetIceRole() const = 0;
-
-  virtual void SetIceRole(IceRole role) = 0;
-
-  virtual void SetIceTiebreaker(uint64_t tiebreaker) = 0;
-
-  // TODO(zhihuang): Remove this once it's no longer called in
-  // remoting/protocol/libjingle_transport_factory.cc
-  virtual void SetIceProtocolType(IceProtocolType type) {}
-
-  virtual void SetIceCredentials(const std::string& ice_ufrag,
-                                 const std::string& ice_pwd) {
-    SetIceParameters(IceParameters(ice_ufrag, ice_pwd, false));
-  }
-
-  virtual void SetRemoteIceCredentials(const std::string& ice_ufrag,
-                                       const std::string& ice_pwd) {
-    SetRemoteIceParameters(IceParameters(ice_ufrag, ice_pwd, false));
-  }
-
-  // The ufrag and pwd in |ice_params| must be set
-  // before candidate gathering can start.
-  virtual void SetIceParameters(const IceParameters& ice_params) = 0;
-
-  virtual void SetRemoteIceParameters(const IceParameters& ice_params) = 0;
-
-  virtual void SetRemoteIceMode(IceMode mode) = 0;
-
-  virtual void SetIceConfig(const IceConfig& config) = 0;
-
-  // Start gathering candidates if not already started, or if an ICE restart
-  // occurred.
-  virtual void MaybeStartGathering() = 0;
-
-  virtual void SetMetricsObserver(
-      webrtc::MetricsObserverInterface* observer) = 0;
-
-  virtual void AddRemoteCandidate(const Candidate& candidate) = 0;
-
-  virtual void RemoveRemoteCandidate(const Candidate& candidate) = 0;
-
-  virtual IceGatheringState gathering_state() const = 0;
-
-  // Returns the current stats for this connection.
-  virtual bool GetStats(ConnectionInfos* infos) = 0;
-
-  // Returns RTT estimate over the currently active connection, or an empty
-  // rtc::Optional if there is none.
-  virtual rtc::Optional<int> GetRttEstimate() = 0;
-
-  sigslot::signal1<IceTransportInternal*> SignalGatheringState;
-
-  // Handles sending and receiving of candidates.
-  sigslot::signal2<IceTransportInternal*, const Candidate&>
-      SignalCandidateGathered;
-
-  sigslot::signal2<IceTransportInternal*, const Candidates&>
-      SignalCandidatesRemoved;
-
-  // Deprecated by SignalSelectedCandidatePairChanged
-  // This signal occurs when there is a change in the way that packets are
-  // being routed, i.e. to a different remote location. The candidate
-  // indicates where and how we are currently sending media.
-  sigslot::signal2<IceTransportInternal*, const Candidate&> SignalRouteChange;
-
-  // Signalled when the current selected candidate pair has changed.
-  // The first parameter is the transport that signals the event.
-  // The second parameter is the new selected candidate pair. The third
-  // parameter is the last packet id sent on the previous candidate pair.
-  // The fourth parameter is a boolean which is true if the Transport
-  // is ready to send with this candidate pair.
-  sigslot::signal4<IceTransportInternal*, CandidatePairInterface*, int, bool>
-      SignalSelectedCandidatePairChanged;
-
-  // Invoked when there is conflict in the ICE role between local and remote
-  // agents.
-  sigslot::signal1<IceTransportInternal*> SignalRoleConflict;
-
-  // Emitted whenever the transport state changed.
-  sigslot::signal1<IceTransportInternal*> SignalStateChanged;
-
-  // Invoked when the transport is being destroyed.
-  sigslot::signal1<IceTransportInternal*> SignalDestroyed;
-
-  // Debugging description of this transport.
-  std::string debug_name() const override {
-    return transport_name() + " " + rtc::ToString(component());
-  }
-};
-
-}  // namespace cricket
-
-#endif  // WEBRTC_P2P_BASE_ICETRANSPORTINTERNAL_H_
diff --git a/p2p/base/jseptransport.cc b/p2p/base/jseptransport.cc
deleted file mode 100644
index 191d34f..0000000
--- a/p2p/base/jseptransport.cc
+++ /dev/null
@@ -1,502 +0,0 @@
-/*
- *  Copyright 2004 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/p2p/base/jseptransport.h"
-
-#include <memory>
-#include <utility>  // for std::pair
-
-#include "webrtc/p2p/base/candidate.h"
-#include "webrtc/p2p/base/dtlstransport.h"
-#include "webrtc/p2p/base/p2pconstants.h"
-#include "webrtc/p2p/base/p2ptransportchannel.h"
-#include "webrtc/p2p/base/port.h"
-#include "webrtc/rtc_base/bind.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-
-namespace cricket {
-
-static bool VerifyIceParams(const TransportDescription& desc) {
-  // For legacy protocols.
-  if (desc.ice_ufrag.empty() && desc.ice_pwd.empty())
-    return true;
-
-  if (desc.ice_ufrag.length() < ICE_UFRAG_MIN_LENGTH ||
-      desc.ice_ufrag.length() > ICE_UFRAG_MAX_LENGTH) {
-    return false;
-  }
-  if (desc.ice_pwd.length() < ICE_PWD_MIN_LENGTH ||
-      desc.ice_pwd.length() > ICE_PWD_MAX_LENGTH) {
-    return false;
-  }
-  return true;
-}
-
-ConnectionInfo::ConnectionInfo()
-    : best_connection(false),
-      writable(false),
-      receiving(false),
-      timeout(false),
-      new_connection(false),
-      rtt(0),
-      sent_total_bytes(0),
-      sent_bytes_second(0),
-      sent_discarded_packets(0),
-      sent_total_packets(0),
-      sent_ping_requests_total(0),
-      sent_ping_requests_before_first_response(0),
-      sent_ping_responses(0),
-      recv_total_bytes(0),
-      recv_bytes_second(0),
-      recv_ping_requests(0),
-      recv_ping_responses(0),
-      key(nullptr),
-      state(IceCandidatePairState::WAITING),
-      priority(0),
-      nominated(false),
-      total_round_trip_time_ms(0) {}
-
-bool BadTransportDescription(const std::string& desc, std::string* err_desc) {
-  if (err_desc) {
-    *err_desc = desc;
-  }
-  LOG(LS_ERROR) << desc;
-  return false;
-}
-
-bool IceCredentialsChanged(const std::string& old_ufrag,
-                           const std::string& old_pwd,
-                           const std::string& new_ufrag,
-                           const std::string& new_pwd) {
-  // The standard (RFC 5245 Section 9.1.1.1) says that ICE restarts MUST change
-  // both the ufrag and password. However, section 9.2.1.1 says changing the
-  // ufrag OR password indicates an ICE restart. So, to keep compatibility with
-  // endpoints that only change one, we'll treat this as an ICE restart.
-  return (old_ufrag != new_ufrag) || (old_pwd != new_pwd);
-}
-
-bool VerifyCandidate(const Candidate& cand, std::string* error) {
-  // No address zero.
-  if (cand.address().IsNil() || cand.address().IsAnyIP()) {
-    *error = "candidate has address of zero";
-    return false;
-  }
-
-  // Disallow all ports below 1024, except for 80 and 443 on public addresses.
-  int port = cand.address().port();
-  if (cand.protocol() == TCP_PROTOCOL_NAME &&
-      (cand.tcptype() == TCPTYPE_ACTIVE_STR || port == 0)) {
-    // Expected for active-only candidates per
-    // http://tools.ietf.org/html/rfc6544#section-4.5 so no error.
-    // Libjingle clients emit port 0, in "active" mode.
-    return true;
-  }
-  if (port < 1024) {
-    if ((port != 80) && (port != 443)) {
-      *error = "candidate has port below 1024, but not 80 or 443";
-      return false;
-    }
-
-    if (cand.address().IsPrivateIP()) {
-      *error = "candidate has port of 80 or 443 with private IP address";
-      return false;
-    }
-  }
-
-  return true;
-}
-
-bool VerifyCandidates(const Candidates& candidates, std::string* error) {
-  for (const Candidate& candidate : candidates) {
-    if (!VerifyCandidate(candidate, error)) {
-      return false;
-    }
-  }
-  return true;
-}
-
-JsepTransport::JsepTransport(
-    const std::string& mid,
-    const rtc::scoped_refptr<rtc::RTCCertificate>& certificate)
-    : mid_(mid), certificate_(certificate) {}
-
-bool JsepTransport::AddChannel(DtlsTransportInternal* dtls, int component) {
-  if (channels_.find(component) != channels_.end()) {
-    LOG(LS_ERROR) << "Adding channel for component " << component << " twice.";
-    return false;
-  }
-  channels_[component] = dtls;
-  // Something's wrong if a channel is being added after a description is set.
-  // This may currently occur if rtcp-mux is negotiated, then a new m= section
-  // is added in a later offer/answer. But this is suboptimal and should be
-  // changed; we shouldn't support going from muxed to non-muxed.
-  // TODO(deadbeef): Once this is fixed, make the warning an error, and remove
-  // the calls to "ApplyXTransportDescription" below.
-  if (local_description_set_ || remote_description_set_) {
-    LOG(LS_WARNING) << "Adding new transport channel after "
-                       "transport description already applied.";
-  }
-  bool ret = true;
-  std::string err;
-  if (local_description_set_) {
-    ret &= ApplyLocalTransportDescription(channels_[component], &err);
-  }
-  if (remote_description_set_) {
-    ret &= ApplyRemoteTransportDescription(channels_[component], &err);
-  }
-  if (local_description_set_ && remote_description_set_) {
-    ret &= ApplyNegotiatedTransportDescription(channels_[component], &err);
-  }
-  return ret;
-}
-
-bool JsepTransport::RemoveChannel(int component) {
-  auto it = channels_.find(component);
-  if (it == channels_.end()) {
-    LOG(LS_ERROR) << "Trying to remove channel for component " << component
-                  << ", which doesn't exist.";
-    return false;
-  }
-  channels_.erase(component);
-  return true;
-}
-
-bool JsepTransport::HasChannels() const {
-  return !channels_.empty();
-}
-
-void JsepTransport::SetLocalCertificate(
-    const rtc::scoped_refptr<rtc::RTCCertificate>& certificate) {
-  certificate_ = certificate;
-}
-
-bool JsepTransport::GetLocalCertificate(
-    rtc::scoped_refptr<rtc::RTCCertificate>* certificate) const {
-  if (!certificate_) {
-    return false;
-  }
-
-  *certificate = certificate_;
-  return true;
-}
-
-bool JsepTransport::SetLocalTransportDescription(
-    const TransportDescription& description,
-    ContentAction action,
-    std::string* error_desc) {
-  bool ret = true;
-
-  if (!VerifyIceParams(description)) {
-    return BadTransportDescription("Invalid ice-ufrag or ice-pwd length",
-                                   error_desc);
-  }
-
-  bool ice_restarting =
-      local_description_set_ &&
-      IceCredentialsChanged(local_description_->ice_ufrag,
-                            local_description_->ice_pwd, description.ice_ufrag,
-                            description.ice_pwd);
-  local_description_.reset(new TransportDescription(description));
-
-  rtc::SSLFingerprint* local_fp =
-      local_description_->identity_fingerprint.get();
-
-  if (!local_fp) {
-    certificate_ = nullptr;
-  } else if (!VerifyCertificateFingerprint(certificate_.get(), local_fp,
-                                           error_desc)) {
-    return false;
-  }
-
-  for (const auto& kv : channels_) {
-    ret &= ApplyLocalTransportDescription(kv.second, error_desc);
-  }
-  if (!ret) {
-    return false;
-  }
-
-  // If PRANSWER/ANSWER is set, we should decide transport protocol type.
-  if (action == CA_PRANSWER || action == CA_ANSWER) {
-    ret &= NegotiateTransportDescription(action, error_desc);
-  }
-  if (!ret) {
-    return false;
-  }
-
-  if (needs_ice_restart_ && ice_restarting) {
-    needs_ice_restart_ = false;
-    LOG(LS_VERBOSE) << "needs-ice-restart flag cleared for transport " << mid();
-  }
-
-  local_description_set_ = true;
-  return true;
-}
-
-bool JsepTransport::SetRemoteTransportDescription(
-    const TransportDescription& description,
-    ContentAction action,
-    std::string* error_desc) {
-  bool ret = true;
-
-  if (!VerifyIceParams(description)) {
-    return BadTransportDescription("Invalid ice-ufrag or ice-pwd length",
-                                   error_desc);
-  }
-
-  remote_description_.reset(new TransportDescription(description));
-  for (const auto& kv : channels_) {
-    ret &= ApplyRemoteTransportDescription(kv.second, error_desc);
-  }
-
-  // If PRANSWER/ANSWER is set, we should decide transport protocol type.
-  if (action == CA_PRANSWER || action == CA_ANSWER) {
-    ret = NegotiateTransportDescription(CA_OFFER, error_desc);
-  }
-  if (ret) {
-    remote_description_set_ = true;
-  }
-
-  return ret;
-}
-
-void JsepTransport::SetNeedsIceRestartFlag() {
-  if (!needs_ice_restart_) {
-    needs_ice_restart_ = true;
-    LOG(LS_VERBOSE) << "needs-ice-restart flag set for transport " << mid();
-  }
-}
-
-bool JsepTransport::NeedsIceRestart() const {
-  return needs_ice_restart_;
-}
-
-rtc::Optional<rtc::SSLRole> JsepTransport::GetSslRole() const {
-  return ssl_role_;
-}
-
-bool JsepTransport::GetStats(TransportStats* stats) {
-  stats->transport_name = mid();
-  stats->channel_stats.clear();
-  for (auto& kv : channels_) {
-    DtlsTransportInternal* dtls_transport = kv.second;
-    TransportChannelStats substats;
-    substats.component = kv.first;
-    dtls_transport->GetSrtpCryptoSuite(&substats.srtp_crypto_suite);
-    dtls_transport->GetSslCipherSuite(&substats.ssl_cipher_suite);
-    substats.dtls_state = dtls_transport->dtls_state();
-    if (!dtls_transport->ice_transport()->GetStats(
-            &substats.connection_infos)) {
-      return false;
-    }
-    stats->channel_stats.push_back(substats);
-  }
-  return true;
-}
-
-bool JsepTransport::VerifyCertificateFingerprint(
-    const rtc::RTCCertificate* certificate,
-    const rtc::SSLFingerprint* fingerprint,
-    std::string* error_desc) const {
-  if (!fingerprint) {
-    return BadTransportDescription("No fingerprint.", error_desc);
-  }
-  if (!certificate) {
-    return BadTransportDescription(
-        "Fingerprint provided but no identity available.", error_desc);
-  }
-  std::unique_ptr<rtc::SSLFingerprint> fp_tmp(rtc::SSLFingerprint::Create(
-      fingerprint->algorithm, certificate->identity()));
-  RTC_DCHECK(fp_tmp.get() != NULL);
-  if (*fp_tmp == *fingerprint) {
-    return true;
-  }
-  std::ostringstream desc;
-  desc << "Local fingerprint does not match identity. Expected: ";
-  desc << fp_tmp->ToString();
-  desc << " Got: " << fingerprint->ToString();
-  return BadTransportDescription(desc.str(), error_desc);
-}
-
-bool JsepTransport::ApplyLocalTransportDescription(
-    DtlsTransportInternal* dtls_transport,
-    std::string* error_desc) {
-  dtls_transport->ice_transport()->SetIceParameters(
-      local_description_->GetIceParameters());
-  bool ret = true;
-  if (certificate_) {
-    ret = dtls_transport->SetLocalCertificate(certificate_);
-    RTC_DCHECK(ret);
-  }
-  return ret;
-}
-
-bool JsepTransport::ApplyRemoteTransportDescription(
-    DtlsTransportInternal* dtls_transport,
-    std::string* error_desc) {
-  dtls_transport->ice_transport()->SetRemoteIceParameters(
-      remote_description_->GetIceParameters());
-  dtls_transport->ice_transport()->SetRemoteIceMode(
-      remote_description_->ice_mode);
-  return true;
-}
-
-bool JsepTransport::ApplyNegotiatedTransportDescription(
-    DtlsTransportInternal* dtls_transport,
-    std::string* error_desc) {
-  // Set SSL role. Role must be set before fingerprint is applied, which
-  // initiates DTLS setup.
-  if (ssl_role_ && !dtls_transport->SetSslRole(*ssl_role_)) {
-    return BadTransportDescription("Failed to set SSL role for the channel.",
-                                   error_desc);
-  }
-  // Apply remote fingerprint.
-  if (!dtls_transport->SetRemoteFingerprint(
-          remote_fingerprint_->algorithm,
-          reinterpret_cast<const uint8_t*>(remote_fingerprint_->digest.data()),
-          remote_fingerprint_->digest.size())) {
-    return BadTransportDescription("Failed to apply remote fingerprint.",
-                                   error_desc);
-  }
-  return true;
-}
-
-bool JsepTransport::NegotiateTransportDescription(
-    ContentAction local_description_type,
-    std::string* error_desc) {
-  if (!local_description_ || !remote_description_) {
-    const std::string msg =
-        "Applying an answer transport description "
-        "without applying any offer.";
-    return BadTransportDescription(msg, error_desc);
-  }
-  rtc::SSLFingerprint* local_fp =
-      local_description_->identity_fingerprint.get();
-  rtc::SSLFingerprint* remote_fp =
-      remote_description_->identity_fingerprint.get();
-  if (remote_fp && local_fp) {
-    remote_fingerprint_.reset(new rtc::SSLFingerprint(*remote_fp));
-    if (!NegotiateRole(local_description_type, error_desc)) {
-      return false;
-    }
-  } else if (local_fp && (local_description_type == CA_ANSWER)) {
-    return BadTransportDescription(
-        "Local fingerprint supplied when caller didn't offer DTLS.",
-        error_desc);
-  } else {
-    // We are not doing DTLS
-    remote_fingerprint_.reset(new rtc::SSLFingerprint("", nullptr, 0));
-  }
-  // Now that we have negotiated everything, push it downward.
-  // Note that we cache the result so that if we have race conditions
-  // between future SetRemote/SetLocal invocations and new channel
-  // creation, we have the negotiation state saved until a new
-  // negotiation happens.
-  for (const auto& kv : channels_) {
-    if (!ApplyNegotiatedTransportDescription(kv.second, error_desc)) {
-      return false;
-    }
-  }
-  return true;
-}
-
-bool JsepTransport::NegotiateRole(ContentAction local_description_type,
-                                  std::string* error_desc) {
-  if (!local_description_ || !remote_description_) {
-    const std::string msg =
-        "Local and Remote description must be set before "
-        "transport descriptions are negotiated";
-    return BadTransportDescription(msg, error_desc);
-  }
-
-  // From RFC 4145, section-4.1, The following are the values that the
-  // 'setup' attribute can take in an offer/answer exchange:
-  //       Offer      Answer
-  //      ________________
-  //      active     passive / holdconn
-  //      passive    active / holdconn
-  //      actpass    active / passive / holdconn
-  //      holdconn   holdconn
-  //
-  // Set the role that is most conformant with RFC 5763, Section 5, bullet 1
-  // The endpoint MUST use the setup attribute defined in [RFC4145].
-  // The endpoint that is the offerer MUST use the setup attribute
-  // value of setup:actpass and be prepared to receive a client_hello
-  // before it receives the answer.  The answerer MUST use either a
-  // setup attribute value of setup:active or setup:passive.  Note that
-  // if the answerer uses setup:passive, then the DTLS handshake will
-  // not begin until the answerer is received, which adds additional
-  // latency. setup:active allows the answer and the DTLS handshake to
-  // occur in parallel.  Thus, setup:active is RECOMMENDED.  Whichever
-  // party is active MUST initiate a DTLS handshake by sending a
-  // ClientHello over each flow (host/port quartet).
-  // IOW - actpass and passive modes should be treated as server and
-  // active as client.
-  ConnectionRole local_connection_role = local_description_->connection_role;
-  ConnectionRole remote_connection_role = remote_description_->connection_role;
-
-  bool is_remote_server = false;
-  if (local_description_type == CA_OFFER) {
-    if (local_connection_role != CONNECTIONROLE_ACTPASS) {
-      return BadTransportDescription(
-          "Offerer must use actpass value for setup attribute.", error_desc);
-    }
-
-    if (remote_connection_role == CONNECTIONROLE_ACTIVE ||
-        remote_connection_role == CONNECTIONROLE_PASSIVE ||
-        remote_connection_role == CONNECTIONROLE_NONE) {
-      is_remote_server = (remote_connection_role == CONNECTIONROLE_PASSIVE);
-    } else {
-      const std::string msg =
-          "Answerer must use either active or passive value "
-          "for setup attribute.";
-      return BadTransportDescription(msg, error_desc);
-    }
-    // If remote is NONE or ACTIVE it will act as client.
-  } else {
-    if (remote_connection_role != CONNECTIONROLE_ACTPASS &&
-        remote_connection_role != CONNECTIONROLE_NONE) {
-      // Accept a remote role attribute that's not "actpass", but matches the
-      // current negotiated role. This is allowed by dtls-sdp, though our
-      // implementation will never generate such an offer as it's not
-      // recommended.
-      //
-      // See https://datatracker.ietf.org/doc/html/draft-ietf-mmusic-dtls-sdp,
-      // section 5.5.
-      if (!ssl_role_ ||
-          (*ssl_role_ == rtc::SSL_CLIENT &&
-           remote_connection_role == CONNECTIONROLE_ACTIVE) ||
-          (*ssl_role_ == rtc::SSL_SERVER &&
-           remote_connection_role == CONNECTIONROLE_PASSIVE)) {
-        return BadTransportDescription(
-            "Offerer must use actpass value or current negotiated role for "
-            "setup attribute.",
-            error_desc);
-      }
-    }
-
-    if (local_connection_role == CONNECTIONROLE_ACTIVE ||
-        local_connection_role == CONNECTIONROLE_PASSIVE) {
-      is_remote_server = (local_connection_role == CONNECTIONROLE_ACTIVE);
-    } else {
-      const std::string msg =
-          "Answerer must use either active or passive value "
-          "for setup attribute.";
-      return BadTransportDescription(msg, error_desc);
-    }
-
-    // If local is passive, local will act as server.
-  }
-
-  ssl_role_.emplace(is_remote_server ? rtc::SSL_CLIENT : rtc::SSL_SERVER);
-  return true;
-}
-
-}  // namespace cricket
diff --git a/p2p/base/jseptransport.h b/p2p/base/jseptransport.h
deleted file mode 100644
index f680646..0000000
--- a/p2p/base/jseptransport.h
+++ /dev/null
@@ -1,383 +0,0 @@
-/*
- *  Copyright 2004 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_P2P_BASE_JSEPTRANSPORT_H_
-#define WEBRTC_P2P_BASE_JSEPTRANSPORT_H_
-
-#include <map>
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "webrtc/api/optional.h"
-#include "webrtc/p2p/base/candidate.h"
-#include "webrtc/p2p/base/p2pconstants.h"
-#include "webrtc/p2p/base/sessiondescription.h"
-#include "webrtc/p2p/base/transportinfo.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/messagequeue.h"
-#include "webrtc/rtc_base/rtccertificate.h"
-#include "webrtc/rtc_base/sigslot.h"
-#include "webrtc/rtc_base/sslstreamadapter.h"
-
-namespace cricket {
-
-class DtlsTransportInternal;
-enum class IceCandidatePairState;
-
-typedef std::vector<Candidate> Candidates;
-
-// TODO(deadbeef): Move all of these enums, POD types and utility methods to
-// another header file.
-
-// TODO(deadbeef): Unify with PeerConnectionInterface::IceConnectionState
-// once /talk/ and /webrtc/ are combined, and also switch to ENUM_NAME naming
-// style.
-enum IceConnectionState {
-  kIceConnectionConnecting = 0,
-  kIceConnectionFailed,
-  kIceConnectionConnected,  // Writable, but still checking one or more
-                            // connections
-  kIceConnectionCompleted,
-};
-
-enum DtlsTransportState {
-  // Haven't started negotiating.
-  DTLS_TRANSPORT_NEW = 0,
-  // Have started negotiating.
-  DTLS_TRANSPORT_CONNECTING,
-  // Negotiated, and has a secure connection.
-  DTLS_TRANSPORT_CONNECTED,
-  // Transport is closed.
-  DTLS_TRANSPORT_CLOSED,
-  // Failed due to some error in the handshake process.
-  DTLS_TRANSPORT_FAILED,
-};
-
-// TODO(deadbeef): Unify with PeerConnectionInterface::IceConnectionState
-// once /talk/ and /webrtc/ are combined, and also switch to ENUM_NAME naming
-// style.
-enum IceGatheringState {
-  kIceGatheringNew = 0,
-  kIceGatheringGathering,
-  kIceGatheringComplete,
-};
-
-enum ContinualGatheringPolicy {
-  // All port allocator sessions will stop after a writable connection is found.
-  GATHER_ONCE = 0,
-  // The most recent port allocator session will keep on running.
-  GATHER_CONTINUALLY,
-  // The most recent port allocator session will keep on running, and it will
-  // try to recover connectivity if the channel becomes disconnected.
-  GATHER_CONTINUALLY_AND_RECOVER,
-};
-
-// Stats that we can return about the connections for a transport channel.
-// TODO(hta): Rename to ConnectionStats
-struct ConnectionInfo {
-  ConnectionInfo();
-
-  bool best_connection;      // Is this the best connection we have?
-  bool writable;             // Has this connection received a STUN response?
-  bool receiving;            // Has this connection received anything?
-  bool timeout;              // Has this connection timed out?
-  bool new_connection;       // Is this a newly created connection?
-  size_t rtt;                // The STUN RTT for this connection.
-  size_t sent_total_bytes;   // Total bytes sent on this connection.
-  size_t sent_bytes_second;  // Bps over the last measurement interval.
-  size_t sent_discarded_packets;  // Number of outgoing packets discarded due to
-                                  // socket errors.
-  size_t sent_total_packets;  // Number of total outgoing packets attempted for
-                              // sending.
-  size_t sent_ping_requests_total;  // Number of STUN ping request sent.
-  size_t sent_ping_requests_before_first_response;  // Number of STUN ping
-  // sent before receiving the first response.
-  size_t sent_ping_responses;  // Number of STUN ping response sent.
-
-  size_t recv_total_bytes;     // Total bytes received on this connection.
-  size_t recv_bytes_second;    // Bps over the last measurement interval.
-  size_t recv_ping_requests;   // Number of STUN ping request received.
-  size_t recv_ping_responses;  // Number of STUN ping response received.
-  Candidate local_candidate;   // The local candidate for this connection.
-  Candidate remote_candidate;  // The remote candidate for this connection.
-  void* key;                   // A static value that identifies this conn.
-  // https://w3c.github.io/webrtc-stats/#dom-rtcicecandidatepairstats-state
-  IceCandidatePairState state;
-  // https://w3c.github.io/webrtc-stats/#dom-rtcicecandidatepairstats-priority
-  uint64_t priority;
-  // https://w3c.github.io/webrtc-stats/#dom-rtcicecandidatepairstats-nominated
-  bool nominated;
-  // https://w3c.github.io/webrtc-stats/#dom-rtcicecandidatepairstats-totalroundtriptime
-  uint64_t total_round_trip_time_ms;
-  // https://w3c.github.io/webrtc-stats/#dom-rtcicecandidatepairstats-currentroundtriptime
-  rtc::Optional<uint32_t> current_round_trip_time_ms;
-};
-
-// Information about all the connections of a channel.
-typedef std::vector<ConnectionInfo> ConnectionInfos;
-
-// Information about a specific channel
-struct TransportChannelStats {
-  int component = 0;
-  ConnectionInfos connection_infos;
-  int srtp_crypto_suite = rtc::SRTP_INVALID_CRYPTO_SUITE;
-  int ssl_cipher_suite = rtc::TLS_NULL_WITH_NULL_NULL;
-  DtlsTransportState dtls_state = DTLS_TRANSPORT_NEW;
-};
-
-// Information about all the channels of a transport.
-// TODO(hta): Consider if a simple vector is as good as a map.
-typedef std::vector<TransportChannelStats> TransportChannelStatsList;
-
-// Information about the stats of a transport.
-struct TransportStats {
-  std::string transport_name;
-  TransportChannelStatsList channel_stats;
-};
-
-// ICE Nomination mode.
-enum class NominationMode {
-  REGULAR,         // Nominate once per ICE restart (Not implemented yet).
-  AGGRESSIVE,      // Nominate every connection except that it will behave as if
-                   // REGULAR when the remote is an ICE-LITE endpoint.
-  SEMI_AGGRESSIVE  // Our current implementation of the nomination algorithm.
-                   // The details are described in P2PTransportChannel.
-};
-
-// Information about ICE configuration.
-// TODO(deadbeef): Use rtc::Optional to represent unset values, instead of
-// -1.
-struct IceConfig {
-  // The ICE connection receiving timeout value in milliseconds.
-  int receiving_timeout = -1;
-  // Time interval in milliseconds to ping a backup connection when the ICE
-  // channel is strongly connected.
-  int backup_connection_ping_interval = -1;
-
-  ContinualGatheringPolicy continual_gathering_policy = GATHER_ONCE;
-
-  bool gather_continually() const {
-    return continual_gathering_policy == GATHER_CONTINUALLY ||
-           continual_gathering_policy == GATHER_CONTINUALLY_AND_RECOVER;
-  }
-
-  // Whether we should prioritize Relay/Relay candidate when nothing
-  // is writable yet.
-  bool prioritize_most_likely_candidate_pairs = false;
-
-  // Writable connections are pinged at a slower rate once stablized.
-  int stable_writable_connection_ping_interval = -1;
-
-  // If set to true, this means the ICE transport should presume TURN-to-TURN
-  // candidate pairs will succeed, even before a binding response is received.
-  bool presume_writable_when_fully_relayed = false;
-
-  // Interval to check on all networks and to perform ICE regathering on any
-  // active network having no connection on it.
-  rtc::Optional<int> regather_on_failed_networks_interval;
-
-  // Interval to perform ICE regathering on all networks
-  // The delay in milliseconds is sampled from the uniform distribution [a, b]
-  rtc::Optional<rtc::IntervalRange> regather_all_networks_interval_range;
-
-  // The time period in which we will not switch the selected connection
-  // when a new connection becomes receiving but the selected connection is not
-  // in case that the selected connection may become receiving soon.
-  rtc::Optional<int> receiving_switching_delay;
-
-  // TODO(honghaiz): Change the default to regular nomination.
-  // Default nomination mode if the remote does not support renomination.
-  NominationMode default_nomination_mode = NominationMode::SEMI_AGGRESSIVE;
-
-  // ICE checks (STUN pings) will not be sent at higher rate (lower interval)
-  // than this, no matter what other settings there are.
-  // Measure in milliseconds.
-  rtc::Optional<int> ice_check_min_interval;
-
-  IceConfig() {}
-  IceConfig(int receiving_timeout_ms,
-            int backup_connection_ping_interval,
-            ContinualGatheringPolicy gathering_policy,
-            bool prioritize_most_likely_candidate_pairs,
-            int stable_writable_connection_ping_interval_ms,
-            bool presume_writable_when_fully_relayed,
-            int regather_on_failed_networks_interval_ms,
-            int receiving_switching_delay_ms)
-      : receiving_timeout(receiving_timeout_ms),
-        backup_connection_ping_interval(backup_connection_ping_interval),
-        continual_gathering_policy(gathering_policy),
-        prioritize_most_likely_candidate_pairs(
-            prioritize_most_likely_candidate_pairs),
-        stable_writable_connection_ping_interval(
-            stable_writable_connection_ping_interval_ms),
-        presume_writable_when_fully_relayed(
-            presume_writable_when_fully_relayed),
-        regather_on_failed_networks_interval(
-            regather_on_failed_networks_interval_ms),
-        receiving_switching_delay(receiving_switching_delay_ms) {}
-};
-
-bool BadTransportDescription(const std::string& desc, std::string* err_desc);
-
-bool IceCredentialsChanged(const std::string& old_ufrag,
-                           const std::string& old_pwd,
-                           const std::string& new_ufrag,
-                           const std::string& new_pwd);
-
-// If a candidate is not acceptable, returns false and sets error.
-bool VerifyCandidate(const Candidate& candidate, std::string* error);
-bool VerifyCandidates(const Candidates& candidates, std::string* error);
-
-// Helper class used by TransportController that processes
-// TransportDescriptions. A TransportDescription represents the
-// transport-specific properties of an SDP m= section, processed according to
-// JSEP. Each transport consists of DTLS and ICE transport channels for RTP
-// (and possibly RTCP, if rtcp-mux isn't used).
-//
-// On Threading:  Transport performs work solely on the network thread, and so
-// its methods should only be called on the network thread.
-//
-// TODO(deadbeef): Move this into /pc/ and out of /p2p/base/, since it's
-// PeerConnection-specific.
-class JsepTransport : public sigslot::has_slots<> {
- public:
-  // |mid| is just used for log statements in order to identify the Transport.
-  // Note that |certificate| is allowed to be null since a remote description
-  // may be set before a local certificate is generated.
-  JsepTransport(const std::string& mid,
-                const rtc::scoped_refptr<rtc::RTCCertificate>& certificate);
-
-  // Returns the MID of this transport.
-  const std::string& mid() const { return mid_; }
-
-  // Add or remove channel that is affected when a local/remote transport
-  // description is set on this transport. Need to add all channels before
-  // setting a transport description.
-  bool AddChannel(DtlsTransportInternal* dtls, int component);
-  bool RemoveChannel(int component);
-  bool HasChannels() const;
-
-  bool ready_for_remote_candidates() const {
-    return local_description_set_ && remote_description_set_;
-  }
-
-  // Must be called before applying local session description.
-  // Needed in order to verify the local fingerprint.
-  void SetLocalCertificate(
-      const rtc::scoped_refptr<rtc::RTCCertificate>& certificate);
-
-  // Get a copy of the local certificate provided by SetLocalCertificate.
-  bool GetLocalCertificate(
-      rtc::scoped_refptr<rtc::RTCCertificate>* certificate) const;
-
-  // Set the local TransportDescription to be used by DTLS and ICE channels
-  // that are part of this Transport.
-  bool SetLocalTransportDescription(const TransportDescription& description,
-                                    ContentAction action,
-                                    std::string* error_desc);
-
-  // Set the remote TransportDescription to be used by DTLS and ICE channels
-  // that are part of this Transport.
-  bool SetRemoteTransportDescription(const TransportDescription& description,
-                                     ContentAction action,
-                                     std::string* error_desc);
-
-  // Set the "needs-ice-restart" flag as described in JSEP. After the flag is
-  // set, offers should generate new ufrags/passwords until an ICE restart
-  // occurs.
-  //
-  // This and the below method can be called safely from any thread as long as
-  // SetXTransportDescription is not in progress.
-  void SetNeedsIceRestartFlag();
-  // Returns true if the ICE restart flag above was set, and no ICE restart has
-  // occurred yet for this transport (by applying a local description with
-  // changed ufrag/password).
-  bool NeedsIceRestart() const;
-
-  // Returns role if negotiated, or empty Optional if it hasn't been negotiated
-  // yet.
-  rtc::Optional<rtc::SSLRole> GetSslRole() const;
-
-  // TODO(deadbeef): Make this const. See comment in transportcontroller.h.
-  bool GetStats(TransportStats* stats);
-
-  // The current local transport description, possibly used
-  // by the transport controller.
-  const TransportDescription* local_description() const {
-    return local_description_.get();
-  }
-
-  // The current remote transport description, possibly used
-  // by the transport controller.
-  const TransportDescription* remote_description() const {
-    return remote_description_.get();
-  }
-
-  // TODO(deadbeef): The methods below are only public for testing. Should make
-  // them utility functions or objects so they can be tested independently from
-  // this class.
-
-  // Returns false if the certificate's identity does not match the fingerprint,
-  // or either is NULL.
-  bool VerifyCertificateFingerprint(const rtc::RTCCertificate* certificate,
-                                    const rtc::SSLFingerprint* fingerprint,
-                                    std::string* error_desc) const;
-
- private:
-  // Negotiates the transport parameters based on the current local and remote
-  // transport description, such as the ICE role to use, and whether DTLS
-  // should be activated.
-  //
-  // Called when an answer TransportDescription is applied.
-  bool NegotiateTransportDescription(ContentAction local_description_type,
-                                     std::string* error_desc);
-
-  // Negotiates the SSL role based off the offer and answer as specified by
-  // RFC 4145, section-4.1. Returns false if the SSL role cannot be determined
-  // from the local description and remote description.
-  bool NegotiateRole(ContentAction local_description_type,
-                     std::string* error_desc);
-
-  // Pushes down the transport parameters from the local description, such
-  // as the ICE ufrag and pwd.
-  bool ApplyLocalTransportDescription(DtlsTransportInternal* dtls_transport,
-                                      std::string* error_desc);
-
-  // Pushes down the transport parameters from the remote description to the
-  // transport channel.
-  bool ApplyRemoteTransportDescription(DtlsTransportInternal* dtls_transport,
-                                       std::string* error_desc);
-
-  // Pushes down the transport parameters obtained via negotiation.
-  bool ApplyNegotiatedTransportDescription(
-      DtlsTransportInternal* dtls_transport,
-      std::string* error_desc);
-
-  const std::string mid_;
-  // needs-ice-restart bit as described in JSEP.
-  bool needs_ice_restart_ = false;
-  rtc::scoped_refptr<rtc::RTCCertificate> certificate_;
-  rtc::Optional<rtc::SSLRole> ssl_role_;
-  std::unique_ptr<rtc::SSLFingerprint> remote_fingerprint_;
-  std::unique_ptr<TransportDescription> local_description_;
-  std::unique_ptr<TransportDescription> remote_description_;
-  bool local_description_set_ = false;
-  bool remote_description_set_ = false;
-
-  // Candidate component => DTLS channel
-  std::map<int, DtlsTransportInternal*> channels_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(JsepTransport);
-};
-
-}  // namespace cricket
-
-#endif  // WEBRTC_P2P_BASE_JSEPTRANSPORT_H_
diff --git a/p2p/base/jseptransport_unittest.cc b/p2p/base/jseptransport_unittest.cc
deleted file mode 100644
index 56b61ec..0000000
--- a/p2p/base/jseptransport_unittest.cc
+++ /dev/null
@@ -1,452 +0,0 @@
-/*
- *  Copyright 2011 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 <memory>
-
-#include "webrtc/p2p/base/fakedtlstransport.h"
-#include "webrtc/p2p/base/fakeicetransport.h"
-#include "webrtc/rtc_base/fakesslidentity.h"
-#include "webrtc/rtc_base/gunit.h"
-#include "webrtc/rtc_base/network.h"
-
-using cricket::JsepTransport;
-using cricket::TransportChannel;
-using cricket::FakeDtlsTransport;
-using cricket::FakeIceTransport;
-using cricket::IceRole;
-using cricket::TransportDescription;
-using rtc::SocketAddress;
-
-static const char kIceUfrag1[] = "TESTICEUFRAG0001";
-static const char kIcePwd1[] = "TESTICEPWD00000000000001";
-
-static const char kIceUfrag2[] = "TESTICEUFRAG0002";
-static const char kIcePwd2[] = "TESTICEPWD00000000000002";
-
-class JsepTransportTest : public testing::Test, public sigslot::has_slots<> {
- public:
-  JsepTransportTest() { RecreateTransport(); }
-
-  bool SetupChannel() {
-    fake_ice_transport_.reset(new FakeIceTransport(transport_->mid(), 1));
-    fake_dtls_transport_.reset(
-        new FakeDtlsTransport(fake_ice_transport_.get()));
-    return transport_->AddChannel(fake_dtls_transport_.get(), 1);
-  }
-
-  void DestroyChannel() { transport_->RemoveChannel(1); }
-
-  void RecreateTransport() {
-    transport_.reset(new JsepTransport("test content name", nullptr));
-  }
-
- protected:
-  std::unique_ptr<FakeDtlsTransport> fake_dtls_transport_;
-  std::unique_ptr<FakeIceTransport> fake_ice_transport_;
-  std::unique_ptr<JsepTransport> transport_;
-};
-
-// This test verifies channels are created with proper ICE
-// ufrag/password after a transport description is applied.
-TEST_F(JsepTransportTest, TestChannelIceParameters) {
-  cricket::TransportDescription local_desc(kIceUfrag1, kIcePwd1);
-  ASSERT_TRUE(transport_->SetLocalTransportDescription(
-      local_desc, cricket::CA_OFFER, NULL));
-  EXPECT_TRUE(SetupChannel());
-  EXPECT_EQ(cricket::ICEMODE_FULL, fake_ice_transport_->remote_ice_mode());
-  EXPECT_EQ(kIceUfrag1, fake_ice_transport_->ice_ufrag());
-  EXPECT_EQ(kIcePwd1, fake_ice_transport_->ice_pwd());
-
-  cricket::TransportDescription remote_desc(kIceUfrag1, kIcePwd1);
-  ASSERT_TRUE(transport_->SetRemoteTransportDescription(
-      remote_desc, cricket::CA_ANSWER, NULL));
-  EXPECT_EQ(cricket::ICEMODE_FULL, fake_ice_transport_->remote_ice_mode());
-  EXPECT_EQ(kIceUfrag1, fake_ice_transport_->remote_ice_ufrag());
-  EXPECT_EQ(kIcePwd1, fake_ice_transport_->remote_ice_pwd());
-}
-
-// Verifies that IceCredentialsChanged returns true when either ufrag or pwd
-// changed, and false in other cases.
-TEST_F(JsepTransportTest, TestIceCredentialsChanged) {
-  EXPECT_TRUE(cricket::IceCredentialsChanged("u1", "p1", "u2", "p2"));
-  EXPECT_TRUE(cricket::IceCredentialsChanged("u1", "p1", "u2", "p1"));
-  EXPECT_TRUE(cricket::IceCredentialsChanged("u1", "p1", "u1", "p2"));
-  EXPECT_FALSE(cricket::IceCredentialsChanged("u1", "p1", "u1", "p1"));
-}
-
-// Tests SetNeedsIceRestartFlag and NeedsIceRestart, ensuring NeedsIceRestart
-// only starts returning "false" once an ICE restart has been initiated.
-TEST_F(JsepTransportTest, NeedsIceRestart) {
-  // Do initial offer/answer so there's something to restart.
-  cricket::TransportDescription local_desc(kIceUfrag1, kIcePwd1);
-  cricket::TransportDescription remote_desc(kIceUfrag1, kIcePwd1);
-  ASSERT_TRUE(transport_->SetLocalTransportDescription(
-      local_desc, cricket::CA_OFFER, nullptr));
-  ASSERT_TRUE(transport_->SetRemoteTransportDescription(
-      remote_desc, cricket::CA_ANSWER, nullptr));
-
-  // Flag initially should be false.
-  EXPECT_FALSE(transport_->NeedsIceRestart());
-
-  // After setting flag, it should be true.
-  transport_->SetNeedsIceRestartFlag();
-  EXPECT_TRUE(transport_->NeedsIceRestart());
-
-  // Doing an identical offer/answer shouldn't clear the flag.
-  ASSERT_TRUE(transport_->SetLocalTransportDescription(
-      local_desc, cricket::CA_OFFER, nullptr));
-  ASSERT_TRUE(transport_->SetRemoteTransportDescription(
-      remote_desc, cricket::CA_ANSWER, nullptr));
-  EXPECT_TRUE(transport_->NeedsIceRestart());
-
-  // Doing an offer/answer that restarts ICE should clear the flag.
-  cricket::TransportDescription ice_restart_local_desc(kIceUfrag2, kIcePwd2);
-  cricket::TransportDescription ice_restart_remote_desc(kIceUfrag2, kIcePwd2);
-  ASSERT_TRUE(transport_->SetLocalTransportDescription(
-      ice_restart_local_desc, cricket::CA_OFFER, nullptr));
-  ASSERT_TRUE(transport_->SetRemoteTransportDescription(
-      ice_restart_remote_desc, cricket::CA_ANSWER, nullptr));
-  EXPECT_FALSE(transport_->NeedsIceRestart());
-}
-
-TEST_F(JsepTransportTest, TestGetStats) {
-  EXPECT_TRUE(SetupChannel());
-  cricket::TransportStats stats;
-  EXPECT_TRUE(transport_->GetStats(&stats));
-  // Note that this tests the behavior of a FakeIceTransport.
-  ASSERT_EQ(1U, stats.channel_stats.size());
-  EXPECT_EQ(1, stats.channel_stats[0].component);
-  // Set local transport description for FakeTransport before connecting.
-  TransportDescription faketransport_desc(
-      std::vector<std::string>(),
-      rtc::CreateRandomString(cricket::ICE_UFRAG_LENGTH),
-      rtc::CreateRandomString(cricket::ICE_PWD_LENGTH), cricket::ICEMODE_FULL,
-      cricket::CONNECTIONROLE_NONE, nullptr);
-  transport_->SetLocalTransportDescription(faketransport_desc,
-                                           cricket::CA_OFFER, nullptr);
-  EXPECT_TRUE(transport_->GetStats(&stats));
-  ASSERT_EQ(1U, stats.channel_stats.size());
-  EXPECT_EQ(1, stats.channel_stats[0].component);
-}
-
-// Tests that VerifyCertificateFingerprint only returns true when the
-// certificate matches the fingerprint.
-TEST_F(JsepTransportTest, TestVerifyCertificateFingerprint) {
-  std::string error_desc;
-  EXPECT_FALSE(
-      transport_->VerifyCertificateFingerprint(nullptr, nullptr, &error_desc));
-  rtc::KeyType key_types[] = {rtc::KT_RSA, rtc::KT_ECDSA};
-
-  for (auto& key_type : key_types) {
-    rtc::scoped_refptr<rtc::RTCCertificate> certificate =
-        rtc::RTCCertificate::Create(std::unique_ptr<rtc::SSLIdentity>(
-            rtc::SSLIdentity::Generate("testing", key_type)));
-    ASSERT_NE(nullptr, certificate);
-
-    std::string digest_algorithm;
-    ASSERT_TRUE(certificate->ssl_certificate().GetSignatureDigestAlgorithm(
-        &digest_algorithm));
-    ASSERT_FALSE(digest_algorithm.empty());
-    std::unique_ptr<rtc::SSLFingerprint> good_fingerprint(
-        rtc::SSLFingerprint::Create(digest_algorithm, certificate->identity()));
-    ASSERT_NE(nullptr, good_fingerprint);
-
-    EXPECT_TRUE(transport_->VerifyCertificateFingerprint(
-        certificate.get(), good_fingerprint.get(), &error_desc));
-    EXPECT_FALSE(transport_->VerifyCertificateFingerprint(
-        certificate.get(), nullptr, &error_desc));
-    EXPECT_FALSE(transport_->VerifyCertificateFingerprint(
-        nullptr, good_fingerprint.get(), &error_desc));
-
-    rtc::SSLFingerprint bad_fingerprint = *good_fingerprint;
-    bad_fingerprint.digest.AppendData("0", 1);
-    EXPECT_FALSE(transport_->VerifyCertificateFingerprint(
-        certificate.get(), &bad_fingerprint, &error_desc));
-  }
-}
-
-// Tests the logic of DTLS role negotiation for an initial offer/answer.
-TEST_F(JsepTransportTest, DtlsRoleNegotiation) {
-  rtc::scoped_refptr<rtc::RTCCertificate> certificate =
-      rtc::RTCCertificate::Create(std::unique_ptr<rtc::SSLIdentity>(
-          rtc::SSLIdentity::Generate("testing", rtc::KT_ECDSA)));
-  std::unique_ptr<rtc::SSLFingerprint> fingerprint(
-      rtc::SSLFingerprint::CreateFromCertificate(certificate));
-
-  TransportDescription local_desc(kIceUfrag1, kIcePwd1);
-  TransportDescription remote_desc(kIceUfrag2, kIcePwd2);
-  // Just use the same fingerprint in both descriptions; the remote fingerprint
-  // doesn't matter in a non end-to-end test.
-  local_desc.identity_fingerprint.reset(
-      TransportDescription::CopyFingerprint(fingerprint.get()));
-  remote_desc.identity_fingerprint.reset(
-      TransportDescription::CopyFingerprint(fingerprint.get()));
-
-  struct NegotiateRoleParams {
-    cricket::ConnectionRole local_role;
-    cricket::ConnectionRole remote_role;
-    cricket::ContentAction local_action;
-    cricket::ContentAction remote_action;
-  };
-
-  std::string error_desc;
-
-  // Parameters which set the SSL role to SSL_CLIENT.
-  NegotiateRoleParams valid_client_params[] = {
-      {cricket::CONNECTIONROLE_ACTIVE, cricket::CONNECTIONROLE_ACTPASS,
-       cricket::CA_ANSWER, cricket::CA_OFFER},
-      {cricket::CONNECTIONROLE_ACTIVE, cricket::CONNECTIONROLE_ACTPASS,
-       cricket::CA_PRANSWER, cricket::CA_OFFER},
-      {cricket::CONNECTIONROLE_ACTPASS, cricket::CONNECTIONROLE_PASSIVE,
-       cricket::CA_OFFER, cricket::CA_ANSWER},
-      {cricket::CONNECTIONROLE_ACTPASS, cricket::CONNECTIONROLE_PASSIVE,
-       cricket::CA_OFFER, cricket::CA_PRANSWER}};
-
-  for (auto& param : valid_client_params) {
-    RecreateTransport();
-    transport_->SetLocalCertificate(certificate);
-
-    local_desc.connection_role = param.local_role;
-    remote_desc.connection_role = param.remote_role;
-
-    // Set the offer first.
-    if (param.local_action == cricket::CA_OFFER) {
-      EXPECT_TRUE(transport_->SetLocalTransportDescription(
-          local_desc, param.local_action, nullptr));
-      EXPECT_TRUE(transport_->SetRemoteTransportDescription(
-          remote_desc, param.remote_action, nullptr));
-    } else {
-      EXPECT_TRUE(transport_->SetRemoteTransportDescription(
-          remote_desc, param.remote_action, nullptr));
-      EXPECT_TRUE(transport_->SetLocalTransportDescription(
-          local_desc, param.local_action, nullptr));
-    }
-    EXPECT_EQ(rtc::SSL_CLIENT, *transport_->GetSslRole());
-  }
-
-  // Parameters which set the SSL role to SSL_SERVER.
-  NegotiateRoleParams valid_server_params[] = {
-      {cricket::CONNECTIONROLE_PASSIVE, cricket::CONNECTIONROLE_ACTPASS,
-       cricket::CA_ANSWER, cricket::CA_OFFER},
-      {cricket::CONNECTIONROLE_PASSIVE, cricket::CONNECTIONROLE_ACTPASS,
-       cricket::CA_PRANSWER, cricket::CA_OFFER},
-      {cricket::CONNECTIONROLE_ACTPASS, cricket::CONNECTIONROLE_ACTIVE,
-       cricket::CA_OFFER, cricket::CA_ANSWER},
-      {cricket::CONNECTIONROLE_ACTPASS, cricket::CONNECTIONROLE_ACTIVE,
-       cricket::CA_OFFER, cricket::CA_PRANSWER}};
-
-  for (auto& param : valid_server_params) {
-    RecreateTransport();
-    transport_->SetLocalCertificate(certificate);
-
-    local_desc.connection_role = param.local_role;
-    remote_desc.connection_role = param.remote_role;
-
-    // Set the offer first.
-    if (param.local_action == cricket::CA_OFFER) {
-      EXPECT_TRUE(transport_->SetLocalTransportDescription(
-          local_desc, param.local_action, nullptr));
-      EXPECT_TRUE(transport_->SetRemoteTransportDescription(
-          remote_desc, param.remote_action, nullptr));
-    } else {
-      EXPECT_TRUE(transport_->SetRemoteTransportDescription(
-          remote_desc, param.remote_action, nullptr));
-      EXPECT_TRUE(transport_->SetLocalTransportDescription(
-          local_desc, param.local_action, nullptr));
-    }
-    EXPECT_EQ(rtc::SSL_SERVER, *transport_->GetSslRole());
-  }
-
-  // Invalid parameters due to both peers having a duplicate role.
-  NegotiateRoleParams duplicate_params[] = {
-      {cricket::CONNECTIONROLE_ACTIVE, cricket::CONNECTIONROLE_ACTIVE,
-       cricket::CA_ANSWER, cricket::CA_OFFER},
-      {cricket::CONNECTIONROLE_ACTPASS, cricket::CONNECTIONROLE_ACTPASS,
-       cricket::CA_ANSWER, cricket::CA_OFFER},
-      {cricket::CONNECTIONROLE_PASSIVE, cricket::CONNECTIONROLE_PASSIVE,
-       cricket::CA_ANSWER, cricket::CA_OFFER},
-      {cricket::CONNECTIONROLE_ACTIVE, cricket::CONNECTIONROLE_ACTIVE,
-       cricket::CA_PRANSWER, cricket::CA_OFFER},
-      {cricket::CONNECTIONROLE_ACTPASS, cricket::CONNECTIONROLE_ACTPASS,
-       cricket::CA_PRANSWER, cricket::CA_OFFER},
-      {cricket::CONNECTIONROLE_PASSIVE, cricket::CONNECTIONROLE_PASSIVE,
-       cricket::CA_PRANSWER, cricket::CA_OFFER},
-      {cricket::CONNECTIONROLE_ACTIVE, cricket::CONNECTIONROLE_ACTIVE,
-       cricket::CA_OFFER, cricket::CA_ANSWER},
-      {cricket::CONNECTIONROLE_ACTPASS, cricket::CONNECTIONROLE_ACTPASS,
-       cricket::CA_OFFER, cricket::CA_ANSWER},
-      {cricket::CONNECTIONROLE_PASSIVE, cricket::CONNECTIONROLE_PASSIVE,
-       cricket::CA_OFFER, cricket::CA_ANSWER},
-      {cricket::CONNECTIONROLE_ACTIVE, cricket::CONNECTIONROLE_ACTIVE,
-       cricket::CA_OFFER, cricket::CA_PRANSWER},
-      {cricket::CONNECTIONROLE_ACTPASS, cricket::CONNECTIONROLE_ACTPASS,
-       cricket::CA_OFFER, cricket::CA_PRANSWER},
-      {cricket::CONNECTIONROLE_PASSIVE, cricket::CONNECTIONROLE_PASSIVE,
-       cricket::CA_OFFER, cricket::CA_PRANSWER}};
-
-  for (auto& param : duplicate_params) {
-    RecreateTransport();
-    transport_->SetLocalCertificate(certificate);
-
-    local_desc.connection_role = param.local_role;
-    remote_desc.connection_role = param.remote_role;
-
-    // Set the offer first.
-    if (param.local_action == cricket::CA_OFFER) {
-      EXPECT_TRUE(transport_->SetLocalTransportDescription(
-          local_desc, param.local_action, nullptr));
-      EXPECT_FALSE(transport_->SetRemoteTransportDescription(
-          remote_desc, param.remote_action, nullptr));
-    } else {
-      EXPECT_TRUE(transport_->SetRemoteTransportDescription(
-          remote_desc, param.remote_action, nullptr));
-      EXPECT_FALSE(transport_->SetLocalTransportDescription(
-          local_desc, param.local_action, nullptr));
-    }
-  }
-
-  // Invalid parameters due to the offerer not using ACTPASS.
-  NegotiateRoleParams offerer_without_actpass_params[] = {
-      {cricket::CONNECTIONROLE_ACTIVE, cricket::CONNECTIONROLE_PASSIVE,
-       cricket::CA_ANSWER, cricket::CA_OFFER},
-      {cricket::CONNECTIONROLE_PASSIVE, cricket::CONNECTIONROLE_ACTIVE,
-       cricket::CA_ANSWER, cricket::CA_OFFER},
-      {cricket::CONNECTIONROLE_ACTPASS, cricket::CONNECTIONROLE_PASSIVE,
-       cricket::CA_ANSWER, cricket::CA_OFFER},
-      {cricket::CONNECTIONROLE_ACTIVE, cricket::CONNECTIONROLE_PASSIVE,
-       cricket::CA_PRANSWER, cricket::CA_OFFER},
-      {cricket::CONNECTIONROLE_PASSIVE, cricket::CONNECTIONROLE_ACTIVE,
-       cricket::CA_PRANSWER, cricket::CA_OFFER},
-      {cricket::CONNECTIONROLE_ACTPASS, cricket::CONNECTIONROLE_PASSIVE,
-       cricket::CA_PRANSWER, cricket::CA_OFFER},
-      {cricket::CONNECTIONROLE_ACTIVE, cricket::CONNECTIONROLE_PASSIVE,
-       cricket::CA_OFFER, cricket::CA_ANSWER},
-      {cricket::CONNECTIONROLE_PASSIVE, cricket::CONNECTIONROLE_ACTIVE,
-       cricket::CA_OFFER, cricket::CA_ANSWER},
-      {cricket::CONNECTIONROLE_PASSIVE, cricket::CONNECTIONROLE_ACTPASS,
-       cricket::CA_OFFER, cricket::CA_ANSWER},
-      {cricket::CONNECTIONROLE_ACTIVE, cricket::CONNECTIONROLE_PASSIVE,
-       cricket::CA_OFFER, cricket::CA_PRANSWER},
-      {cricket::CONNECTIONROLE_PASSIVE, cricket::CONNECTIONROLE_ACTIVE,
-       cricket::CA_OFFER, cricket::CA_PRANSWER},
-      {cricket::CONNECTIONROLE_PASSIVE, cricket::CONNECTIONROLE_ACTPASS,
-       cricket::CA_OFFER, cricket::CA_PRANSWER}};
-
-  for (auto& param : offerer_without_actpass_params) {
-    RecreateTransport();
-    transport_->SetLocalCertificate(certificate);
-
-    local_desc.connection_role = param.local_role;
-    remote_desc.connection_role = param.remote_role;
-
-    // Set the offer first.
-    // TODO(deadbeef): Really this should fail as soon as the offer is
-    // attempted to be applied, and not when the answer is applied.
-    if (param.local_action == cricket::CA_OFFER) {
-      EXPECT_TRUE(transport_->SetLocalTransportDescription(
-          local_desc, param.local_action, nullptr));
-      EXPECT_FALSE(transport_->SetRemoteTransportDescription(
-          remote_desc, param.remote_action, nullptr));
-    } else {
-      EXPECT_TRUE(transport_->SetRemoteTransportDescription(
-          remote_desc, param.remote_action, nullptr));
-      EXPECT_FALSE(transport_->SetLocalTransportDescription(
-          local_desc, param.local_action, nullptr));
-    }
-  }
-}
-
-// Test that a remote offer with the current negotiated role can be accepted.
-// This is allowed by dtls-sdp, though we'll never generate such an offer,
-// since JSEP requires generating "actpass".
-TEST_F(JsepTransportTest, RemoteOfferWithCurrentNegotiatedDtlsRole) {
-  rtc::scoped_refptr<rtc::RTCCertificate> certificate =
-      rtc::RTCCertificate::Create(std::unique_ptr<rtc::SSLIdentity>(
-          rtc::SSLIdentity::Generate("testing", rtc::KT_ECDSA)));
-  std::unique_ptr<rtc::SSLFingerprint> fingerprint(
-      rtc::SSLFingerprint::CreateFromCertificate(certificate));
-  transport_->SetLocalCertificate(certificate);
-
-  TransportDescription local_desc(kIceUfrag1, kIcePwd1);
-  TransportDescription remote_desc(kIceUfrag2, kIcePwd2);
-  // Just use the same fingerprint in both descriptions; the remote fingerprint
-  // doesn't matter in a non end-to-end test.
-  local_desc.identity_fingerprint.reset(
-      TransportDescription::CopyFingerprint(fingerprint.get()));
-  remote_desc.identity_fingerprint.reset(
-      TransportDescription::CopyFingerprint(fingerprint.get()));
-
-  remote_desc.connection_role = cricket::CONNECTIONROLE_ACTPASS;
-  local_desc.connection_role = cricket::CONNECTIONROLE_ACTIVE;
-
-  // Normal initial offer/answer with "actpass" in the offer and "active" in
-  // the answer.
-  ASSERT_TRUE(transport_->SetRemoteTransportDescription(
-      remote_desc, cricket::CA_OFFER, nullptr));
-  ASSERT_TRUE(transport_->SetLocalTransportDescription(
-      local_desc, cricket::CA_ANSWER, nullptr));
-
-  // Sanity check that role was actually negotiated.
-  rtc::Optional<rtc::SSLRole> role = transport_->GetSslRole();
-  ASSERT_TRUE(role);
-  EXPECT_EQ(rtc::SSL_CLIENT, *role);
-
-  // Subsequent offer with current negotiated role of "passive".
-  remote_desc.connection_role = cricket::CONNECTIONROLE_PASSIVE;
-  EXPECT_TRUE(transport_->SetRemoteTransportDescription(
-      remote_desc, cricket::CA_OFFER, nullptr));
-  EXPECT_TRUE(transport_->SetLocalTransportDescription(
-      local_desc, cricket::CA_ANSWER, nullptr));
-}
-
-// Test that a remote offer with the inverse of the current negotiated DTLS
-// role is rejected.
-TEST_F(JsepTransportTest, RemoteOfferThatChangesNegotiatedDtlsRole) {
-  rtc::scoped_refptr<rtc::RTCCertificate> certificate =
-      rtc::RTCCertificate::Create(std::unique_ptr<rtc::SSLIdentity>(
-          rtc::SSLIdentity::Generate("testing", rtc::KT_ECDSA)));
-  std::unique_ptr<rtc::SSLFingerprint> fingerprint(
-      rtc::SSLFingerprint::CreateFromCertificate(certificate));
-  transport_->SetLocalCertificate(certificate);
-
-  TransportDescription local_desc(kIceUfrag1, kIcePwd1);
-  TransportDescription remote_desc(kIceUfrag2, kIcePwd2);
-  // Just use the same fingerprint in both descriptions; the remote fingerprint
-  // doesn't matter in a non end-to-end test.
-  local_desc.identity_fingerprint.reset(
-      TransportDescription::CopyFingerprint(fingerprint.get()));
-  remote_desc.identity_fingerprint.reset(
-      TransportDescription::CopyFingerprint(fingerprint.get()));
-
-  remote_desc.connection_role = cricket::CONNECTIONROLE_ACTPASS;
-  local_desc.connection_role = cricket::CONNECTIONROLE_ACTIVE;
-
-  // Normal initial offer/answer with "actpass" in the offer and "active" in
-  // the answer.
-  ASSERT_TRUE(transport_->SetRemoteTransportDescription(
-      remote_desc, cricket::CA_OFFER, nullptr));
-  ASSERT_TRUE(transport_->SetLocalTransportDescription(
-      local_desc, cricket::CA_ANSWER, nullptr));
-
-  // Sanity check that role was actually negotiated.
-  rtc::Optional<rtc::SSLRole> role = transport_->GetSslRole();
-  ASSERT_TRUE(role);
-  EXPECT_EQ(rtc::SSL_CLIENT, *role);
-
-  // Subsequent offer with "active", which is the opposite of the remote
-  // endpoint's negotiated role.
-  // TODO(deadbeef): Really this should fail as soon as the offer is
-  // attempted to be applied, and not when the answer is applied.
-  remote_desc.connection_role = cricket::CONNECTIONROLE_ACTIVE;
-  EXPECT_TRUE(transport_->SetRemoteTransportDescription(
-      remote_desc, cricket::CA_OFFER, nullptr));
-  EXPECT_FALSE(transport_->SetLocalTransportDescription(
-      local_desc, cricket::CA_ANSWER, nullptr));
-}
diff --git a/p2p/base/mockicetransport.h b/p2p/base/mockicetransport.h
deleted file mode 100644
index 92d0373..0000000
--- a/p2p/base/mockicetransport.h
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- *  Copyright 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_P2P_BASE_MOCKICETRANSPORT_H_
-#define WEBRTC_P2P_BASE_MOCKICETRANSPORT_H_
-
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "webrtc/p2p/base/icetransportinternal.h"
-#include "webrtc/rtc_base/gunit.h"
-#include "webrtc/test/gmock.h"
-
-using testing::_;
-using testing::Return;
-
-namespace cricket {
-
-// Used in Chromium/remoting/protocol/channel_socket_adapter_unittest.cc
-class MockIceTransport : public IceTransportInternal {
- public:
-  MockIceTransport() {
-    SignalReadyToSend(this);
-    SignalWritableState(this);
-  }
-
-  MOCK_METHOD4(SendPacket,
-               int(const char* data,
-                   size_t len,
-                   const rtc::PacketOptions& options,
-                   int flags));
-  MOCK_METHOD2(SetOption, int(rtc::Socket::Option opt, int value));
-  MOCK_METHOD0(GetError, int());
-  MOCK_CONST_METHOD0(GetIceRole, cricket::IceRole());
-  MOCK_METHOD1(GetStats, bool(cricket::ConnectionInfos* infos));
-  MOCK_CONST_METHOD0(IsDtlsActive, bool());
-  MOCK_CONST_METHOD1(GetSslRole, bool(rtc::SSLRole* role));
-
-  IceTransportState GetState() const override {
-    return IceTransportState::STATE_INIT;
-  }
-  const std::string& transport_name() const override { return transport_name_; }
-  int component() const override { return 0; }
-  void SetIceRole(IceRole role) override {}
-  void SetIceTiebreaker(uint64_t tiebreaker) override {}
-  // The ufrag and pwd in |ice_params| must be set
-  // before candidate gathering can start.
-  void SetIceParameters(const IceParameters& ice_params) override {}
-  void SetRemoteIceParameters(const IceParameters& ice_params) override {}
-  void SetRemoteIceMode(IceMode mode) override {}
-  void SetIceConfig(const IceConfig& config) override {}
-  rtc::Optional<int> GetRttEstimate() override {
-    return rtc::Optional<int>();
-  }
-  void MaybeStartGathering() override {}
-  void SetMetricsObserver(webrtc::MetricsObserverInterface* observer) override {
-  }
-  void AddRemoteCandidate(const Candidate& candidate) override {}
-  void RemoveRemoteCandidate(const Candidate& candidate) override {}
-  IceGatheringState gathering_state() const override {
-    return IceGatheringState::kIceGatheringComplete;
-  }
-
-  bool receiving() const override { return true; }
-  bool writable() const override { return true; }
-
- private:
-  std::string transport_name_;
-};
-
-}  // namespace cricket
-
-#endif  // WEBRTC_P2P_BASE_MOCKICETRANSPORT_H_
diff --git a/p2p/base/p2pconstants.cc b/p2p/base/p2pconstants.cc
deleted file mode 100644
index 64e5a13..0000000
--- a/p2p/base/p2pconstants.cc
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- *  Copyright 2004 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/p2p/base/p2pconstants.h"
-
-#include <string>
-
-namespace cricket {
-
-const char CN_AUDIO[] = "audio";
-const char CN_VIDEO[] = "video";
-const char CN_DATA[] = "data";
-const char CN_OTHER[] = "main";
-
-const char GROUP_TYPE_BUNDLE[] = "BUNDLE";
-
-// Minimum ufrag length is 4 characters as per RFC5245.
-const int ICE_UFRAG_LENGTH = 4;
-// Minimum password length of 22 characters as per RFC5245. We chose 24 because
-// some internal systems expect password to be multiple of 4.
-const int ICE_PWD_LENGTH = 24;
-const size_t ICE_UFRAG_MIN_LENGTH = 4;
-const size_t ICE_PWD_MIN_LENGTH = 22;
-const size_t ICE_UFRAG_MAX_LENGTH = 255;
-const size_t ICE_PWD_MAX_LENGTH = 256;
-
-// This is media-specific, so might belong
-// somewhere like media/base/mediaconstants.h
-const int ICE_CANDIDATE_COMPONENT_RTP = 1;
-const int ICE_CANDIDATE_COMPONENT_RTCP = 2;
-const int ICE_CANDIDATE_COMPONENT_DEFAULT = 1;
-
-const char NS_JINGLE_RTP[] = "urn:xmpp:jingle:apps:rtp:1";
-const char NS_JINGLE_DRAFT_SCTP[] = "google:jingle:sctp";
-
-// From RFC 4145, SDP setup attribute values.
-const char CONNECTIONROLE_ACTIVE_STR[] = "active";
-const char CONNECTIONROLE_PASSIVE_STR[] = "passive";
-const char CONNECTIONROLE_ACTPASS_STR[] = "actpass";
-const char CONNECTIONROLE_HOLDCONN_STR[] = "holdconn";
-
-}  // namespace cricket
diff --git a/p2p/base/p2pconstants.h b/p2p/base/p2pconstants.h
deleted file mode 100644
index a36cd88..0000000
--- a/p2p/base/p2pconstants.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- *  Copyright 2004 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_P2P_BASE_P2PCONSTANTS_H_
-#define WEBRTC_P2P_BASE_P2PCONSTANTS_H_
-
-#include <string>
-
-namespace cricket {
-
-// CN_ == "content name".  When we initiate a session, we choose the
-// name, and when we receive a Gingle session, we provide default
-// names (since Gingle has no content names).  But when we receive a
-// Jingle call, the content name can be anything, so don't rely on
-// these values being the same as the ones received.
-extern const char CN_AUDIO[];
-extern const char CN_VIDEO[];
-extern const char CN_DATA[];
-extern const char CN_OTHER[];
-
-// GN stands for group name
-extern const char GROUP_TYPE_BUNDLE[];
-
-extern const int ICE_UFRAG_LENGTH;
-extern const int ICE_PWD_LENGTH;
-extern const size_t ICE_UFRAG_MIN_LENGTH;
-extern const size_t ICE_PWD_MIN_LENGTH;
-extern const size_t ICE_UFRAG_MAX_LENGTH;
-extern const size_t ICE_PWD_MAX_LENGTH;
-
-extern const int ICE_CANDIDATE_COMPONENT_RTP;
-extern const int ICE_CANDIDATE_COMPONENT_RTCP;
-extern const int ICE_CANDIDATE_COMPONENT_DEFAULT;
-
-extern const char NS_JINGLE_RTP[];
-extern const char NS_JINGLE_DRAFT_SCTP[];
-
-// RFC 4145, SDP setup attribute values.
-extern const char CONNECTIONROLE_ACTIVE_STR[];
-extern const char CONNECTIONROLE_PASSIVE_STR[];
-extern const char CONNECTIONROLE_ACTPASS_STR[];
-extern const char CONNECTIONROLE_HOLDCONN_STR[];
-
-}  // namespace cricket
-
-#endif  // WEBRTC_P2P_BASE_P2PCONSTANTS_H_
diff --git a/p2p/base/p2ptransportchannel.cc b/p2p/base/p2ptransportchannel.cc
deleted file mode 100644
index 90fe07c..0000000
--- a/p2p/base/p2ptransportchannel.cc
+++ /dev/null
@@ -1,2137 +0,0 @@
-/*
- *  Copyright 2004 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/p2p/base/p2ptransportchannel.h"
-
-#include <algorithm>
-#include <iterator>
-#include <set>
-
-#include "webrtc/api/umametrics.h"
-#include "webrtc/p2p/base/candidate.h"
-#include "webrtc/p2p/base/candidatepairinterface.h"
-#include "webrtc/p2p/base/common.h"
-#include "webrtc/p2p/base/relayport.h"  // For RELAY_PORT_TYPE.
-#include "webrtc/p2p/base/stunport.h"   // For STUN_PORT_TYPE.
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/crc32.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/stringencode.h"
-#include "webrtc/rtc_base/timeutils.h"
-#include "webrtc/system_wrappers/include/field_trial.h"
-
-namespace {
-
-// messages for queuing up work for ourselves
-enum {
-  MSG_SORT_AND_UPDATE_STATE = 1,
-  MSG_CHECK_AND_PING,
-  MSG_REGATHER_ON_FAILED_NETWORKS,
-  MSG_REGATHER_ON_ALL_NETWORKS
-};
-
-// The minimum improvement in RTT that justifies a switch.
-const int kMinImprovement = 10;
-
-bool IsRelayRelay(const cricket::Connection* conn) {
-  return conn->local_candidate().type() == cricket::RELAY_PORT_TYPE &&
-         conn->remote_candidate().type() == cricket::RELAY_PORT_TYPE;
-}
-
-bool IsUdp(cricket::Connection* conn) {
-  return conn->local_candidate().relay_protocol() == cricket::UDP_PROTOCOL_NAME;
-}
-
-cricket::PortInterface::CandidateOrigin GetOrigin(cricket::PortInterface* port,
-                                         cricket::PortInterface* origin_port) {
-  if (!origin_port)
-    return cricket::PortInterface::ORIGIN_MESSAGE;
-  else if (port == origin_port)
-    return cricket::PortInterface::ORIGIN_THIS_PORT;
-  else
-    return cricket::PortInterface::ORIGIN_OTHER_PORT;
-}
-
-}  // unnamed namespace
-
-namespace cricket {
-
-// When the socket is unwritable, we will use 10 Kbps (ignoring IP+UDP headers)
-// for pinging.  When the socket is writable, we will use only 1 Kbps because
-// we don't want to degrade the quality on a modem.  These numbers should work
-// well on a 28.8K modem, which is the slowest connection on which the voice
-// quality is reasonable at all.
-static const int PING_PACKET_SIZE = 60 * 8;
-
-// The next two ping intervals are at the channel level.
-// STRONG_PING_INTERVAL (480ms) is applied when the selected connection is both
-// writable and receiving.
-const int STRONG_PING_INTERVAL = 1000 * PING_PACKET_SIZE / 1000;
-// WEAK_PING_INTERVAL (48ms) is applied when the selected connection is either
-// not writable or not receiving.
-const int WEAK_PING_INTERVAL = 1000 * PING_PACKET_SIZE / 10000;
-
-// The next two ping intervals are at the connection level.
-// Writable connections are pinged at a faster rate while the connections are
-// stabilizing or the channel is weak.
-const int WEAK_OR_STABILIZING_WRITABLE_CONNECTION_PING_INTERVAL = 900;  // ms
-// Writable connections are pinged at a slower rate once they are stabilized and
-// the channel is strongly connected.
-const int STRONG_AND_STABLE_WRITABLE_CONNECTION_PING_INTERVAL = 2500;  // ms
-
-static const int MIN_CHECK_RECEIVING_INTERVAL = 50;  // ms
-
-static const int RECEIVING_SWITCHING_DELAY = 1000;  // ms
-
-// We periodically check if any existing networks do not have any connection
-// and regather on those networks.
-static const int DEFAULT_REGATHER_ON_FAILED_NETWORKS_INTERVAL = 5 * 60 * 1000;
-
-static constexpr int DEFAULT_BACKUP_CONNECTION_PING_INTERVAL = 25 * 1000;
-
-static constexpr int a_is_better = 1;
-static constexpr int b_is_better = -1;
-
-P2PTransportChannel::P2PTransportChannel(const std::string& transport_name,
-                                         int component,
-                                         PortAllocator* allocator)
-    : transport_name_(transport_name),
-      component_(component),
-      allocator_(allocator),
-      network_thread_(rtc::Thread::Current()),
-      incoming_only_(false),
-      error_(0),
-      sort_dirty_(false),
-      remote_ice_mode_(ICEMODE_FULL),
-      ice_role_(ICEROLE_UNKNOWN),
-      tiebreaker_(0),
-      gathering_state_(kIceGatheringNew),
-      rand_(rtc::SystemTimeNanos()),
-      check_receiving_interval_(MIN_CHECK_RECEIVING_INTERVAL * 5),
-      config_(MIN_CHECK_RECEIVING_INTERVAL * 50 /* receiving_timeout */,
-              DEFAULT_BACKUP_CONNECTION_PING_INTERVAL,
-              GATHER_ONCE /* continual_gathering_policy */,
-              false /* prioritize_most_likely_candidate_pairs */,
-              STRONG_AND_STABLE_WRITABLE_CONNECTION_PING_INTERVAL,
-              true /* presume_writable_when_fully_relayed */,
-              DEFAULT_REGATHER_ON_FAILED_NETWORKS_INTERVAL,
-              RECEIVING_SWITCHING_DELAY) {
-  uint32_t weak_ping_interval = ::strtoul(
-      webrtc::field_trial::FindFullName("WebRTC-StunInterPacketDelay").c_str(),
-      nullptr, 10);
-  if (weak_ping_interval) {
-    weak_ping_interval_ = static_cast<int>(weak_ping_interval);
-  }
-}
-
-P2PTransportChannel::~P2PTransportChannel() {
-  RTC_DCHECK(network_thread_ == rtc::Thread::Current());
-}
-
-// Add the allocator session to our list so that we know which sessions
-// are still active.
-void P2PTransportChannel::AddAllocatorSession(
-    std::unique_ptr<PortAllocatorSession> session) {
-  RTC_DCHECK(network_thread_ == rtc::Thread::Current());
-
-  session->set_generation(static_cast<uint32_t>(allocator_sessions_.size()));
-  session->SignalPortReady.connect(this, &P2PTransportChannel::OnPortReady);
-  session->SignalPortsPruned.connect(this, &P2PTransportChannel::OnPortsPruned);
-  session->SignalCandidatesReady.connect(
-      this, &P2PTransportChannel::OnCandidatesReady);
-  session->SignalCandidatesRemoved.connect(
-      this, &P2PTransportChannel::OnCandidatesRemoved);
-  session->SignalCandidatesAllocationDone.connect(
-      this, &P2PTransportChannel::OnCandidatesAllocationDone);
-  if (!allocator_sessions_.empty()) {
-    allocator_session()->PruneAllPorts();
-  }
-  allocator_sessions_.push_back(std::move(session));
-
-  // We now only want to apply new candidates that we receive to the ports
-  // created by this new session because these are replacing those of the
-  // previous sessions.
-  PruneAllPorts();
-}
-
-void P2PTransportChannel::AddConnection(Connection* connection) {
-  connections_.push_back(connection);
-  unpinged_connections_.insert(connection);
-  connection->set_remote_ice_mode(remote_ice_mode_);
-  connection->set_receiving_timeout(config_.receiving_timeout);
-  connection->SignalReadPacket.connect(
-      this, &P2PTransportChannel::OnReadPacket);
-  connection->SignalReadyToSend.connect(
-      this, &P2PTransportChannel::OnReadyToSend);
-  connection->SignalStateChange.connect(
-      this, &P2PTransportChannel::OnConnectionStateChange);
-  connection->SignalDestroyed.connect(
-      this, &P2PTransportChannel::OnConnectionDestroyed);
-  connection->SignalNominated.connect(this, &P2PTransportChannel::OnNominated);
-  had_connection_ = true;
-}
-
-// Determines whether we should switch the selected connection to
-// |new_connection| based the writable/receiving state, the nomination state,
-// and the last data received time. This prevents the controlled side from
-// switching the selected connection too frequently when the controlling side
-// is doing aggressive nominations. The precedence of the connection switching
-// criteria is as follows:
-// i) write/receiving/connected states
-// ii) For controlled side,
-//        a) nomination state,
-//        b) last data received time.
-// iii) Lower cost / higher priority.
-// iv) rtt.
-// To further prevent switching to high-cost networks, does not switch to
-// a high-cost connection if it is not receiving.
-// TODO(honghaiz): Stop the aggressive nomination on the controlling side and
-// implement the ice-renomination option.
-bool P2PTransportChannel::ShouldSwitchSelectedConnection(
-    Connection* new_connection,
-    bool* missed_receiving_unchanged_threshold) const {
-  if (!ReadyToSend(new_connection) || selected_connection_ == new_connection) {
-    return false;
-  }
-
-  if (selected_connection_ == nullptr) {
-    return true;
-  }
-
-  // Do not switch to a connection that is not receiving if it has higher cost
-  // because it may be just spuriously better.
-  if (new_connection->ComputeNetworkCost() >
-          selected_connection_->ComputeNetworkCost() &&
-      !new_connection->receiving()) {
-    return false;
-  }
-
-  rtc::Optional<int64_t> receiving_unchanged_threshold(
-      rtc::TimeMillis() - config_.receiving_switching_delay.value_or(0));
-  int cmp = CompareConnections(selected_connection_, new_connection,
-                               receiving_unchanged_threshold,
-                               missed_receiving_unchanged_threshold);
-  if (cmp != 0) {
-    return cmp < 0;
-  }
-
-  // If everything else is the same, switch only if rtt has improved by
-  // a margin.
-  return new_connection->rtt() <= selected_connection_->rtt() - kMinImprovement;
-}
-
-bool P2PTransportChannel::MaybeSwitchSelectedConnection(
-    Connection* new_connection,
-    const std::string& reason) {
-  bool missed_receiving_unchanged_threshold = false;
-  if (ShouldSwitchSelectedConnection(new_connection,
-                                     &missed_receiving_unchanged_threshold)) {
-    LOG(LS_INFO) << "Switching selected connection due to " << reason;
-    SwitchSelectedConnection(new_connection);
-    return true;
-  }
-  if (missed_receiving_unchanged_threshold &&
-      config_.receiving_switching_delay) {
-    // If we do not switch to the connection because it missed the receiving
-    // threshold, the new connection is in a better receiving state than the
-    // currently selected connection. So we need to re-check whether it needs
-    // to be switched at a later time.
-    thread()->PostDelayed(RTC_FROM_HERE, *config_.receiving_switching_delay,
-                          this, MSG_SORT_AND_UPDATE_STATE);
-  }
-  return false;
-}
-
-void P2PTransportChannel::SetIceRole(IceRole ice_role) {
-  RTC_DCHECK(network_thread_ == rtc::Thread::Current());
-  if (ice_role_ != ice_role) {
-    ice_role_ = ice_role;
-    for (PortInterface* port : ports_) {
-      port->SetIceRole(ice_role);
-    }
-    // Update role on pruned ports as well, because they may still have
-    // connections alive that should be using the correct role.
-    for (PortInterface* port : pruned_ports_) {
-      port->SetIceRole(ice_role);
-    }
-  }
-}
-
-void P2PTransportChannel::SetIceTiebreaker(uint64_t tiebreaker) {
-  RTC_DCHECK(network_thread_ == rtc::Thread::Current());
-  if (!ports_.empty() || !pruned_ports_.empty()) {
-    LOG(LS_ERROR)
-        << "Attempt to change tiebreaker after Port has been allocated.";
-    return;
-  }
-
-  tiebreaker_ = tiebreaker;
-}
-
-IceTransportState P2PTransportChannel::GetState() const {
-  return state_;
-}
-
-rtc::Optional<int> P2PTransportChannel::GetRttEstimate() {
-  if (selected_connection_ != nullptr
-      && selected_connection_->rtt_samples() > 0) {
-    return rtc::Optional<int>(selected_connection_->rtt());
-  } else {
-    return rtc::Optional<int>();
-  }
-}
-
-// A channel is considered ICE completed once there is at most one active
-// connection per network and at least one active connection.
-IceTransportState P2PTransportChannel::ComputeState() const {
-  if (!had_connection_) {
-    return IceTransportState::STATE_INIT;
-  }
-
-  std::vector<Connection*> active_connections;
-  for (Connection* connection : connections_) {
-    if (connection->active()) {
-      active_connections.push_back(connection);
-    }
-  }
-  if (active_connections.empty()) {
-    return IceTransportState::STATE_FAILED;
-  }
-
-  std::set<rtc::Network*> networks;
-  for (Connection* connection : active_connections) {
-    rtc::Network* network = connection->port()->Network();
-    if (networks.find(network) == networks.end()) {
-      networks.insert(network);
-    } else {
-      LOG_J(LS_VERBOSE, this) << "Ice not completed yet for this channel as "
-                              << network->ToString()
-                              << " has more than 1 connection.";
-      return IceTransportState::STATE_CONNECTING;
-    }
-  }
-
-  return IceTransportState::STATE_COMPLETED;
-}
-
-void P2PTransportChannel::SetIceParameters(const IceParameters& ice_params) {
-  RTC_DCHECK(network_thread_ == rtc::Thread::Current());
-  LOG(LS_INFO) << "Set ICE ufrag: " << ice_params.ufrag
-               << " pwd: " << ice_params.pwd << " on transport "
-               << transport_name();
-  ice_parameters_ = ice_params;
-  // Note: Candidate gathering will restart when MaybeStartGathering is next
-  // called.
-}
-
-void P2PTransportChannel::SetRemoteIceParameters(
-    const IceParameters& ice_params) {
-  RTC_DCHECK(network_thread_ == rtc::Thread::Current());
-  LOG(LS_INFO) << "Remote supports ICE renomination ? "
-               << ice_params.renomination;
-  IceParameters* current_ice = remote_ice();
-  if (!current_ice || *current_ice != ice_params) {
-    // Keep the ICE credentials so that newer connections
-    // are prioritized over the older ones.
-    remote_ice_parameters_.push_back(ice_params);
-  }
-
-  // Update the pwd of remote candidate if needed.
-  for (RemoteCandidate& candidate : remote_candidates_) {
-    if (candidate.username() == ice_params.ufrag &&
-        candidate.password().empty()) {
-      candidate.set_password(ice_params.pwd);
-    }
-  }
-  // We need to update the credentials and generation for any peer reflexive
-  // candidates.
-  for (Connection* conn : connections_) {
-    conn->MaybeSetRemoteIceParametersAndGeneration(
-        ice_params, static_cast<int>(remote_ice_parameters_.size() - 1));
-  }
-  // Updating the remote ICE candidate generation could change the sort order.
-  RequestSortAndStateUpdate();
-}
-
-void P2PTransportChannel::SetRemoteIceMode(IceMode mode) {
-  remote_ice_mode_ = mode;
-}
-
-void P2PTransportChannel::SetIceConfig(const IceConfig& config) {
-  if (config_.continual_gathering_policy != config.continual_gathering_policy) {
-    if (!allocator_sessions_.empty()) {
-      LOG(LS_ERROR) << "Trying to change continual gathering policy "
-                    << "when gathering has already started!";
-    } else {
-      config_.continual_gathering_policy = config.continual_gathering_policy;
-      LOG(LS_INFO) << "Set continual_gathering_policy to "
-                   << config_.continual_gathering_policy;
-    }
-  }
-
-  if (config.backup_connection_ping_interval >= 0 &&
-      config_.backup_connection_ping_interval !=
-          config.backup_connection_ping_interval) {
-    config_.backup_connection_ping_interval =
-        config.backup_connection_ping_interval;
-    LOG(LS_INFO) << "Set backup connection ping interval to "
-                 << config_.backup_connection_ping_interval << " milliseconds.";
-  }
-
-  if (config.receiving_timeout >= 0 &&
-      config_.receiving_timeout != config.receiving_timeout) {
-    config_.receiving_timeout = config.receiving_timeout;
-    check_receiving_interval_ =
-        std::max(MIN_CHECK_RECEIVING_INTERVAL, config_.receiving_timeout / 10);
-
-    for (Connection* connection : connections_) {
-      connection->set_receiving_timeout(config_.receiving_timeout);
-    }
-    LOG(LS_INFO) << "Set ICE receiving timeout to " << config_.receiving_timeout
-                 << " milliseconds";
-  }
-
-  config_.prioritize_most_likely_candidate_pairs =
-      config.prioritize_most_likely_candidate_pairs;
-  LOG(LS_INFO) << "Set ping most likely connection to "
-               << config_.prioritize_most_likely_candidate_pairs;
-
-  if (config.stable_writable_connection_ping_interval >= 0 &&
-      config_.stable_writable_connection_ping_interval !=
-          config.stable_writable_connection_ping_interval) {
-    config_.stable_writable_connection_ping_interval =
-        config.stable_writable_connection_ping_interval;
-    LOG(LS_INFO) << "Set stable_writable_connection_ping_interval to "
-                 << config_.stable_writable_connection_ping_interval;
-  }
-
-  if (config.presume_writable_when_fully_relayed !=
-      config_.presume_writable_when_fully_relayed) {
-    if (!connections_.empty()) {
-      LOG(LS_ERROR) << "Trying to change 'presume writable' "
-                    << "while connections already exist!";
-    } else {
-      config_.presume_writable_when_fully_relayed =
-          config.presume_writable_when_fully_relayed;
-      LOG(LS_INFO) << "Set presume writable when fully relayed to "
-                   << config_.presume_writable_when_fully_relayed;
-    }
-  }
-
-  if (config.regather_on_failed_networks_interval) {
-    config_.regather_on_failed_networks_interval =
-        config.regather_on_failed_networks_interval;
-    LOG(LS_INFO) << "Set regather_on_failed_networks_interval to "
-                 << *config_.regather_on_failed_networks_interval;
-  }
-
-  if (config.regather_all_networks_interval_range) {
-    // Config validation is assumed to have already happened at the API layer.
-    RTC_DCHECK(config.continual_gathering_policy != GATHER_ONCE);
-    config_.regather_all_networks_interval_range =
-        config.regather_all_networks_interval_range;
-    LOG(LS_INFO) << "Set regather_all_networks_interval_range to "
-                 << config.regather_all_networks_interval_range->ToString();
-  }
-
-  if (config.receiving_switching_delay) {
-    config_.receiving_switching_delay = config.receiving_switching_delay;
-    LOG(LS_INFO) << "Set receiving_switching_delay to"
-                 << *config_.receiving_switching_delay;
-  }
-
-  if (config_.default_nomination_mode != config.default_nomination_mode) {
-    config_.default_nomination_mode = config.default_nomination_mode;
-    LOG(LS_INFO) << "Set default nomination mode to "
-                 << static_cast<int>(config_.default_nomination_mode);
-  }
-
-  if (config_.ice_check_min_interval != config.ice_check_min_interval) {
-    config_.ice_check_min_interval = config.ice_check_min_interval;
-    LOG(LS_INFO) << "Set min ping interval to "
-                 << *config_.ice_check_min_interval;
-  }
-}
-
-const IceConfig& P2PTransportChannel::config() const {
-  return config_;
-}
-
-void P2PTransportChannel::SetMetricsObserver(
-    webrtc::MetricsObserverInterface* observer) {
-  metrics_observer_ = observer;
-}
-
-void P2PTransportChannel::MaybeStartGathering() {
-  if (ice_parameters_.ufrag.empty() || ice_parameters_.pwd.empty()) {
-    LOG(LS_ERROR) << "Cannot gather candidates because ICE parameters are empty"
-                  << " ufrag: " << ice_parameters_.ufrag
-                  << " pwd: " << ice_parameters_.pwd;
-    return;
-  }
-  // Start gathering if we never started before, or if an ICE restart occurred.
-  if (allocator_sessions_.empty() ||
-      IceCredentialsChanged(allocator_sessions_.back()->ice_ufrag(),
-                            allocator_sessions_.back()->ice_pwd(),
-                            ice_parameters_.ufrag, ice_parameters_.pwd)) {
-    if (gathering_state_ != kIceGatheringGathering) {
-      gathering_state_ = kIceGatheringGathering;
-      SignalGatheringState(this);
-    }
-
-    if (metrics_observer_ && !allocator_sessions_.empty()) {
-      IceRestartState state;
-      if (writable()) {
-        state = IceRestartState::CONNECTED;
-      } else if (IsGettingPorts()) {
-        state = IceRestartState::CONNECTING;
-      } else {
-        state = IceRestartState::DISCONNECTED;
-      }
-      metrics_observer_->IncrementEnumCounter(
-          webrtc::kEnumCounterIceRestart, static_cast<int>(state),
-          static_cast<int>(IceRestartState::MAX_VALUE));
-    }
-
-    // Time for a new allocator.
-    std::unique_ptr<PortAllocatorSession> pooled_session =
-        allocator_->TakePooledSession(transport_name(), component(),
-                                      ice_parameters_.ufrag,
-                                      ice_parameters_.pwd);
-    if (pooled_session) {
-      AddAllocatorSession(std::move(pooled_session));
-      PortAllocatorSession* raw_pooled_session =
-          allocator_sessions_.back().get();
-      // Process the pooled session's existing candidates/ports, if they exist.
-      OnCandidatesReady(raw_pooled_session,
-                        raw_pooled_session->ReadyCandidates());
-      for (PortInterface* port : allocator_sessions_.back()->ReadyPorts()) {
-        OnPortReady(raw_pooled_session, port);
-      }
-      if (allocator_sessions_.back()->CandidatesAllocationDone()) {
-        OnCandidatesAllocationDone(raw_pooled_session);
-      }
-    } else {
-      AddAllocatorSession(allocator_->CreateSession(
-          transport_name(), component(), ice_parameters_.ufrag,
-          ice_parameters_.pwd));
-      allocator_sessions_.back()->StartGettingPorts();
-    }
-  }
-}
-
-// A new port is available, attempt to make connections for it
-void P2PTransportChannel::OnPortReady(PortAllocatorSession *session,
-                                      PortInterface* port) {
-  RTC_DCHECK(network_thread_ == rtc::Thread::Current());
-
-  // Set in-effect options on the new port
-  for (OptionMap::const_iterator it = options_.begin();
-       it != options_.end();
-       ++it) {
-    int val = port->SetOption(it->first, it->second);
-    if (val < 0) {
-      LOG_J(LS_WARNING, port) << "SetOption(" << it->first
-                              << ", " << it->second
-                              << ") failed: " << port->GetError();
-    }
-  }
-
-  // Remember the ports and candidates, and signal that candidates are ready.
-  // The session will handle this, and send an initiate/accept/modify message
-  // if one is pending.
-
-  port->SetIceRole(ice_role_);
-  port->SetIceTiebreaker(tiebreaker_);
-  ports_.push_back(port);
-  port->SignalUnknownAddress.connect(
-      this, &P2PTransportChannel::OnUnknownAddress);
-  port->SignalDestroyed.connect(this, &P2PTransportChannel::OnPortDestroyed);
-
-  port->SignalRoleConflict.connect(
-      this, &P2PTransportChannel::OnRoleConflict);
-  port->SignalSentPacket.connect(this, &P2PTransportChannel::OnSentPacket);
-
-  // Attempt to create a connection from this new port to all of the remote
-  // candidates that we were given so far.
-
-  std::vector<RemoteCandidate>::iterator iter;
-  for (iter = remote_candidates_.begin(); iter != remote_candidates_.end();
-       ++iter) {
-    CreateConnection(port, *iter, iter->origin_port());
-  }
-
-  SortConnectionsAndUpdateState();
-}
-
-// A new candidate is available, let listeners know
-void P2PTransportChannel::OnCandidatesReady(
-    PortAllocatorSession* session,
-    const std::vector<Candidate>& candidates) {
-  RTC_DCHECK(network_thread_ == rtc::Thread::Current());
-  for (size_t i = 0; i < candidates.size(); ++i) {
-    SignalCandidateGathered(this, candidates[i]);
-  }
-}
-
-void P2PTransportChannel::OnCandidatesAllocationDone(
-    PortAllocatorSession* session) {
-  RTC_DCHECK(network_thread_ == rtc::Thread::Current());
-  if (config_.gather_continually()) {
-    LOG(LS_INFO) << "P2PTransportChannel: " << transport_name()
-                 << ", component " << component()
-                 << " gathering complete, but using continual "
-                 << "gathering so not changing gathering state.";
-    return;
-  }
-  gathering_state_ = kIceGatheringComplete;
-  LOG(LS_INFO) << "P2PTransportChannel: " << transport_name() << ", component "
-               << component() << " gathering complete";
-  SignalGatheringState(this);
-}
-
-// Handle stun packets
-void P2PTransportChannel::OnUnknownAddress(
-    PortInterface* port,
-    const rtc::SocketAddress& address, ProtocolType proto,
-    IceMessage* stun_msg, const std::string &remote_username,
-    bool port_muxed) {
-  RTC_DCHECK(network_thread_ == rtc::Thread::Current());
-
-  // Port has received a valid stun packet from an address that no Connection
-  // is currently available for. See if we already have a candidate with the
-  // address. If it isn't we need to create new candidate for it.
-
-  const Candidate* candidate = nullptr;
-  for (const Candidate& c : remote_candidates_) {
-    if (c.username() == remote_username && c.address() == address &&
-        c.protocol() == ProtoToString(proto)) {
-      candidate = &c;
-      break;
-    }
-  }
-
-  uint32_t remote_generation = 0;
-  std::string remote_password;
-  // The STUN binding request may arrive after setRemoteDescription and before
-  // adding remote candidate, so we need to set the password to the shared
-  // password and set the generation if the user name matches.
-  const IceParameters* ice_param =
-      FindRemoteIceFromUfrag(remote_username, &remote_generation);
-  // Note: if not found, the remote_generation will still be 0.
-  if (ice_param != nullptr) {
-    remote_password = ice_param->pwd;
-  }
-
-  Candidate remote_candidate;
-  bool remote_candidate_is_new = (candidate == nullptr);
-  if (!remote_candidate_is_new) {
-    remote_candidate = *candidate;
-  } else {
-    // Create a new candidate with this address.
-    // The priority of the candidate is set to the PRIORITY attribute
-    // from the request.
-    const StunUInt32Attribute* priority_attr =
-        stun_msg->GetUInt32(STUN_ATTR_PRIORITY);
-    if (!priority_attr) {
-      LOG(LS_WARNING) << "P2PTransportChannel::OnUnknownAddress - "
-                      << "No STUN_ATTR_PRIORITY found in the "
-                      << "stun request message";
-      port->SendBindingErrorResponse(stun_msg, address, STUN_ERROR_BAD_REQUEST,
-                                     STUN_ERROR_REASON_BAD_REQUEST);
-      return;
-    }
-    int remote_candidate_priority = priority_attr->value();
-
-    uint16_t network_id = 0;
-    uint16_t network_cost = 0;
-    const StunUInt32Attribute* network_attr =
-        stun_msg->GetUInt32(STUN_ATTR_NETWORK_INFO);
-    if (network_attr) {
-      uint32_t network_info = network_attr->value();
-      network_id = static_cast<uint16_t>(network_info >> 16);
-      network_cost = static_cast<uint16_t>(network_info);
-    }
-
-    // RFC 5245
-    // If the source transport address of the request does not match any
-    // existing remote candidates, it represents a new peer reflexive remote
-    // candidate.
-    remote_candidate = Candidate(
-        component(), ProtoToString(proto), address, remote_candidate_priority,
-        remote_username, remote_password, PRFLX_PORT_TYPE, remote_generation,
-        "", network_id, network_cost);
-
-    // From RFC 5245, section-7.2.1.3:
-    // The foundation of the candidate is set to an arbitrary value, different
-    // from the foundation for all other remote candidates.
-    remote_candidate.set_foundation(
-        rtc::ToString<uint32_t>(rtc::ComputeCrc32(remote_candidate.id())));
-  }
-
-  // RFC5245, the agent constructs a pair whose local candidate is equal to
-  // the transport address on which the STUN request was received, and a
-  // remote candidate equal to the source transport address where the
-  // request came from.
-
-  // There shouldn't be an existing connection with this remote address.
-  // When ports are muxed, this channel might get multiple unknown address
-  // signals. In that case if the connection is already exists, we should
-  // simply ignore the signal otherwise send server error.
-  if (port->GetConnection(remote_candidate.address())) {
-    if (port_muxed) {
-      LOG(LS_INFO) << "Connection already exists for peer reflexive "
-                   << "candidate: " << remote_candidate.ToString();
-      return;
-    } else {
-      RTC_NOTREACHED();
-      port->SendBindingErrorResponse(stun_msg, address,
-                                     STUN_ERROR_SERVER_ERROR,
-                                     STUN_ERROR_REASON_SERVER_ERROR);
-      return;
-    }
-  }
-
-  Connection* connection =
-      port->CreateConnection(remote_candidate, PortInterface::ORIGIN_THIS_PORT);
-  if (!connection) {
-    // This could happen in some scenarios. For example, a TurnPort may have
-    // had a refresh request timeout, so it won't create connections.
-    port->SendBindingErrorResponse(stun_msg, address, STUN_ERROR_SERVER_ERROR,
-                                   STUN_ERROR_REASON_SERVER_ERROR);
-    return;
-  }
-
-  LOG(LS_INFO) << "Adding connection from "
-               << (remote_candidate_is_new ? "peer reflexive" : "resurrected")
-               << " candidate: " << remote_candidate.ToString();
-  AddConnection(connection);
-  connection->HandleBindingRequest(stun_msg);
-
-  // Update the list of connections since we just added another.  We do this
-  // after sending the response since it could (in principle) delete the
-  // connection in question.
-  SortConnectionsAndUpdateState();
-}
-
-void P2PTransportChannel::OnRoleConflict(PortInterface* port) {
-  SignalRoleConflict(this);  // STUN ping will be sent when SetRole is called
-                             // from Transport.
-}
-
-const IceParameters* P2PTransportChannel::FindRemoteIceFromUfrag(
-    const std::string& ufrag,
-    uint32_t* generation) {
-  const auto& params = remote_ice_parameters_;
-  auto it = std::find_if(
-      params.rbegin(), params.rend(),
-      [ufrag](const IceParameters& param) { return param.ufrag == ufrag; });
-  if (it == params.rend()) {
-    // Not found.
-    return nullptr;
-  }
-  *generation = params.rend() - it - 1;
-  return &(*it);
-}
-
-void P2PTransportChannel::OnNominated(Connection* conn) {
-  RTC_DCHECK(network_thread_ == rtc::Thread::Current());
-  RTC_DCHECK(ice_role_ == ICEROLE_CONTROLLED);
-
-  if (selected_connection_ == conn) {
-    return;
-  }
-
-  if (MaybeSwitchSelectedConnection(conn,
-                                    "nomination on the controlled side")) {
-    // Now that we have selected a connection, it is time to prune other
-    // connections and update the read/write state of the channel.
-    RequestSortAndStateUpdate();
-  } else {
-    LOG(LS_INFO)
-        << "Not switching the selected connection on controlled side yet: "
-        << conn->ToString();
-  }
-}
-
-void P2PTransportChannel::AddRemoteCandidate(const Candidate& candidate) {
-  RTC_DCHECK(network_thread_ == rtc::Thread::Current());
-
-  uint32_t generation = GetRemoteCandidateGeneration(candidate);
-  // If a remote candidate with a previous generation arrives, drop it.
-  if (generation < remote_ice_generation()) {
-    LOG(LS_WARNING) << "Dropping a remote candidate because its ufrag "
-                    << candidate.username()
-                    << " indicates it was for a previous generation.";
-    return;
-  }
-
-  Candidate new_remote_candidate(candidate);
-  new_remote_candidate.set_generation(generation);
-  // ICE candidates don't need to have username and password set, but
-  // the code below this (specifically, ConnectionRequest::Prepare in
-  // port.cc) uses the remote candidates's username.  So, we set it
-  // here.
-  if (remote_ice()) {
-    if (candidate.username().empty()) {
-      new_remote_candidate.set_username(remote_ice()->ufrag);
-    }
-    if (new_remote_candidate.username() == remote_ice()->ufrag) {
-      if (candidate.password().empty()) {
-        new_remote_candidate.set_password(remote_ice()->pwd);
-      }
-    } else {
-      // The candidate belongs to the next generation. Its pwd will be set
-      // when the new remote ICE credentials arrive.
-      LOG(LS_WARNING) << "A remote candidate arrives with an unknown ufrag: "
-                      << candidate.username();
-    }
-  }
-
-  // If this candidate matches what was thought to be a peer reflexive
-  // candidate, we need to update the candidate priority/etc.
-  for (Connection* conn : connections_) {
-    conn->MaybeUpdatePeerReflexiveCandidate(new_remote_candidate);
-  }
-
-  // Create connections to this remote candidate.
-  CreateConnections(new_remote_candidate, NULL);
-
-  // Resort the connections list, which may have new elements.
-  SortConnectionsAndUpdateState();
-}
-
-void P2PTransportChannel::RemoveRemoteCandidate(
-    const Candidate& cand_to_remove) {
-  auto iter =
-      std::remove_if(remote_candidates_.begin(), remote_candidates_.end(),
-                     [cand_to_remove](const Candidate& candidate) {
-                       return cand_to_remove.MatchesForRemoval(candidate);
-                     });
-  if (iter != remote_candidates_.end()) {
-    LOG(LS_VERBOSE) << "Removed remote candidate " << cand_to_remove.ToString();
-    remote_candidates_.erase(iter, remote_candidates_.end());
-  }
-}
-
-// Creates connections from all of the ports that we care about to the given
-// remote candidate.  The return value is true if we created a connection from
-// the origin port.
-bool P2PTransportChannel::CreateConnections(const Candidate& remote_candidate,
-                                            PortInterface* origin_port) {
-  RTC_DCHECK(network_thread_ == rtc::Thread::Current());
-
-  // If we've already seen the new remote candidate (in the current candidate
-  // generation), then we shouldn't try creating connections for it.
-  // We either already have a connection for it, or we previously created one
-  // and then later pruned it. If we don't return, the channel will again
-  // re-create any connections that were previously pruned, which will then
-  // immediately be re-pruned, churning the network for no purpose.
-  // This only applies to candidates received over signaling (i.e. origin_port
-  // is NULL).
-  if (!origin_port && IsDuplicateRemoteCandidate(remote_candidate)) {
-    // return true to indicate success, without creating any new connections.
-    return true;
-  }
-
-  // Add a new connection for this candidate to every port that allows such a
-  // connection (i.e., if they have compatible protocols) and that does not
-  // already have a connection to an equivalent candidate.  We must be careful
-  // to make sure that the origin port is included, even if it was pruned,
-  // since that may be the only port that can create this connection.
-  bool created = false;
-  std::vector<PortInterface *>::reverse_iterator it;
-  for (it = ports_.rbegin(); it != ports_.rend(); ++it) {
-    if (CreateConnection(*it, remote_candidate, origin_port)) {
-      if (*it == origin_port)
-        created = true;
-    }
-  }
-
-  if ((origin_port != NULL) &&
-      std::find(ports_.begin(), ports_.end(), origin_port) == ports_.end()) {
-    if (CreateConnection(origin_port, remote_candidate, origin_port))
-      created = true;
-  }
-
-  // Remember this remote candidate so that we can add it to future ports.
-  RememberRemoteCandidate(remote_candidate, origin_port);
-
-  return created;
-}
-
-// Setup a connection object for the local and remote candidate combination.
-// And then listen to connection object for changes.
-bool P2PTransportChannel::CreateConnection(PortInterface* port,
-                                           const Candidate& remote_candidate,
-                                           PortInterface* origin_port) {
-  if (!port->SupportsProtocol(remote_candidate.protocol())) {
-    return false;
-  }
-  // Look for an existing connection with this remote address.  If one is not
-  // found or it is found but the existing remote candidate has an older
-  // generation, then we can create a new connection for this address.
-  Connection* connection = port->GetConnection(remote_candidate.address());
-  if (connection == nullptr ||
-      connection->remote_candidate().generation() <
-          remote_candidate.generation()) {
-    // Don't create a connection if this is a candidate we received in a
-    // message and we are not allowed to make outgoing connections.
-    PortInterface::CandidateOrigin origin = GetOrigin(port, origin_port);
-    if (origin == PortInterface::ORIGIN_MESSAGE && incoming_only_) {
-      return false;
-    }
-    Connection* connection = port->CreateConnection(remote_candidate, origin);
-    if (!connection) {
-      return false;
-    }
-    AddConnection(connection);
-    LOG_J(LS_INFO, this) << "Created connection with origin=" << origin << ", ("
-                         << connections_.size() << " total)";
-    return true;
-  }
-
-  // No new connection was created.
-  // It is not legal to try to change any of the parameters of an existing
-  // connection; however, the other side can send a duplicate candidate.
-  if (!remote_candidate.IsEquivalent(connection->remote_candidate())) {
-    LOG(INFO) << "Attempt to change a remote candidate."
-              << " Existing remote candidate: "
-              << connection->remote_candidate().ToString()
-              << "New remote candidate: " << remote_candidate.ToString();
-  }
-  return false;
-}
-
-bool P2PTransportChannel::FindConnection(Connection* connection) const {
-  std::vector<Connection*>::const_iterator citer =
-      std::find(connections_.begin(), connections_.end(), connection);
-  return citer != connections_.end();
-}
-
-uint32_t P2PTransportChannel::GetRemoteCandidateGeneration(
-    const Candidate& candidate) {
-  // If the candidate has a ufrag, use it to find the generation.
-  if (!candidate.username().empty()) {
-    uint32_t generation = 0;
-    if (!FindRemoteIceFromUfrag(candidate.username(), &generation)) {
-      // If the ufrag is not found, assume the next/future generation.
-      generation = static_cast<uint32_t>(remote_ice_parameters_.size());
-    }
-    return generation;
-  }
-  // If candidate generation is set, use that.
-  if (candidate.generation() > 0) {
-    return candidate.generation();
-  }
-  // Otherwise, assume the generation from remote ice parameters.
-  return remote_ice_generation();
-}
-
-// Check if remote candidate is already cached.
-bool P2PTransportChannel::IsDuplicateRemoteCandidate(
-    const Candidate& candidate) {
-  for (size_t i = 0; i < remote_candidates_.size(); ++i) {
-    if (remote_candidates_[i].IsEquivalent(candidate)) {
-      return true;
-    }
-  }
-  return false;
-}
-
-// Maintain our remote candidate list, adding this new remote one.
-void P2PTransportChannel::RememberRemoteCandidate(
-    const Candidate& remote_candidate, PortInterface* origin_port) {
-  // Remove any candidates whose generation is older than this one.  The
-  // presence of a new generation indicates that the old ones are not useful.
-  size_t i = 0;
-  while (i < remote_candidates_.size()) {
-    if (remote_candidates_[i].generation() < remote_candidate.generation()) {
-      LOG(INFO) << "Pruning candidate from old generation: "
-                << remote_candidates_[i].address().ToSensitiveString();
-      remote_candidates_.erase(remote_candidates_.begin() + i);
-    } else {
-      i += 1;
-    }
-  }
-
-  // Make sure this candidate is not a duplicate.
-  if (IsDuplicateRemoteCandidate(remote_candidate)) {
-    LOG(INFO) << "Duplicate candidate: " << remote_candidate.ToString();
-    return;
-  }
-
-  // Try this candidate for all future ports.
-  remote_candidates_.push_back(RemoteCandidate(remote_candidate, origin_port));
-}
-
-// Set options on ourselves is simply setting options on all of our available
-// port objects.
-int P2PTransportChannel::SetOption(rtc::Socket::Option opt, int value) {
-  RTC_DCHECK(network_thread_ == rtc::Thread::Current());
-  OptionMap::iterator it = options_.find(opt);
-  if (it == options_.end()) {
-    options_.insert(std::make_pair(opt, value));
-  } else if (it->second == value) {
-    return 0;
-  } else {
-    it->second = value;
-  }
-
-  for (PortInterface* port : ports_) {
-    int val = port->SetOption(opt, value);
-    if (val < 0) {
-      // Because this also occurs deferred, probably no point in reporting an
-      // error
-      LOG(WARNING) << "SetOption(" << opt << ", " << value
-                   << ") failed: " << port->GetError();
-    }
-  }
-  return 0;
-}
-
-bool P2PTransportChannel::GetOption(rtc::Socket::Option opt, int* value) {
-  RTC_DCHECK(network_thread_ == rtc::Thread::Current());
-
-  const auto& found = options_.find(opt);
-  if (found == options_.end()) {
-    return false;
-  }
-  *value = found->second;
-  return true;
-}
-
-// Send data to the other side, using our selected connection.
-int P2PTransportChannel::SendPacket(const char *data, size_t len,
-                                    const rtc::PacketOptions& options,
-                                    int flags) {
-  RTC_DCHECK(network_thread_ == rtc::Thread::Current());
-  if (flags != 0) {
-    error_ = EINVAL;
-    return -1;
-  }
-  // If we don't think the connection is working yet, return ENOTCONN
-  // instead of sending a packet that will probably be dropped.
-  if (!ReadyToSend(selected_connection_)) {
-    error_ = ENOTCONN;
-    return -1;
-  }
-
-  last_sent_packet_id_ = options.packet_id;
-  int sent = selected_connection_->Send(data, len, options);
-  if (sent <= 0) {
-    RTC_DCHECK(sent < 0);
-    error_ = selected_connection_->GetError();
-  }
-  return sent;
-}
-
-bool P2PTransportChannel::GetStats(ConnectionInfos *infos) {
-  RTC_DCHECK(network_thread_ == rtc::Thread::Current());
-  // Gather connection infos.
-  infos->clear();
-
-  for (Connection* connection : connections_) {
-    ConnectionInfo info = connection->stats();
-    info.best_connection = (selected_connection_ == connection);
-    infos->push_back(std::move(info));
-    connection->set_reported(true);
-  }
-
-  return true;
-}
-
-rtc::DiffServCodePoint P2PTransportChannel::DefaultDscpValue() const {
-  OptionMap::const_iterator it = options_.find(rtc::Socket::OPT_DSCP);
-  if (it == options_.end()) {
-    return rtc::DSCP_NO_CHANGE;
-  }
-  return static_cast<rtc::DiffServCodePoint> (it->second);
-}
-
-// Monitor connection states.
-void P2PTransportChannel::UpdateConnectionStates() {
-  int64_t now = rtc::TimeMillis();
-
-  // We need to copy the list of connections since some may delete themselves
-  // when we call UpdateState.
-  for (Connection* c : connections_) {
-    c->UpdateState(now);
-  }
-}
-
-// Prepare for best candidate sorting.
-void P2PTransportChannel::RequestSortAndStateUpdate() {
-  if (!sort_dirty_) {
-    network_thread_->Post(RTC_FROM_HERE, this, MSG_SORT_AND_UPDATE_STATE);
-    sort_dirty_ = true;
-  }
-}
-
-void P2PTransportChannel::MaybeStartPinging() {
-  if (started_pinging_) {
-    return;
-  }
-
-  int64_t now = rtc::TimeMillis();
-  if (std::any_of(
-          connections_.begin(), connections_.end(),
-          [this, now](const Connection* c) { return IsPingable(c, now); })) {
-    LOG_J(LS_INFO, this) << "Have a pingable connection for the first time; "
-                         << "starting to ping.";
-    thread()->Post(RTC_FROM_HERE, this, MSG_CHECK_AND_PING);
-    thread()->PostDelayed(RTC_FROM_HERE,
-                          *config_.regather_on_failed_networks_interval, this,
-                          MSG_REGATHER_ON_FAILED_NETWORKS);
-    if (config_.regather_all_networks_interval_range) {
-      thread()->PostDelayed(RTC_FROM_HERE,
-                            SampleRegatherAllNetworksInterval(), this,
-                            MSG_REGATHER_ON_ALL_NETWORKS);
-    }
-    started_pinging_ = true;
-  }
-}
-
-// Compare two connections based on their writing, receiving, and connected
-// states.
-int P2PTransportChannel::CompareConnectionStates(
-    const Connection* a,
-    const Connection* b,
-    rtc::Optional<int64_t> receiving_unchanged_threshold,
-    bool* missed_receiving_unchanged_threshold) const {
-  // First, prefer a connection that's writable or presumed writable over
-  // one that's not writable.
-  bool a_writable = a->writable() || PresumedWritable(a);
-  bool b_writable = b->writable() || PresumedWritable(b);
-  if (a_writable && !b_writable) {
-    return a_is_better;
-  }
-  if (!a_writable && b_writable) {
-    return b_is_better;
-  }
-
-  // Sort based on write-state. Better states have lower values.
-  if (a->write_state() < b->write_state()) {
-    return a_is_better;
-  }
-  if (b->write_state() < a->write_state()) {
-    return b_is_better;
-  }
-
-  // We prefer a receiving connection to a non-receiving, higher-priority
-  // connection when sorting connections and choosing which connection to
-  // switch to.
-  if (a->receiving() && !b->receiving()) {
-    return a_is_better;
-  }
-  if (!a->receiving() && b->receiving()) {
-    if (!receiving_unchanged_threshold ||
-        (a->receiving_unchanged_since() <= *receiving_unchanged_threshold &&
-         b->receiving_unchanged_since() <= *receiving_unchanged_threshold)) {
-      return b_is_better;
-    }
-    *missed_receiving_unchanged_threshold = true;
-  }
-
-  // WARNING: Some complexity here about TCP reconnecting.
-  // When a TCP connection fails because of a TCP socket disconnecting, the
-  // active side of the connection will attempt to reconnect for 5 seconds while
-  // pretending to be writable (the connection is not set to the unwritable
-  // state).  On the passive side, the connection also remains writable even
-  // though it is disconnected, and a new connection is created when the active
-  // side connects.  At that point, there are two TCP connections on the passive
-  // side: 1. the old, disconnected one that is pretending to be writable, and
-  // 2.  the new, connected one that is maybe not yet writable.  For purposes of
-  // pruning, pinging, and selecting the selected connection, we want to treat
-  // the new connection as "better" than the old one. We could add a method
-  // called something like Connection::ImReallyBadEvenThoughImWritable, but that
-  // is equivalent to the existing Connection::connected(), which we already
-  // have. So, in code throughout this file, we'll check whether the connection
-  // is connected() or not, and if it is not, treat it as "worse" than a
-  // connected one, even though it's writable.  In the code below, we're doing
-  // so to make sure we treat a new writable connection as better than an old
-  // disconnected connection.
-
-  // In the case where we reconnect TCP connections, the original best
-  // connection is disconnected without changing to WRITE_TIMEOUT. In this case,
-  // the new connection, when it becomes writable, should have higher priority.
-  if (a->write_state() == Connection::STATE_WRITABLE &&
-      b->write_state() == Connection::STATE_WRITABLE) {
-    if (a->connected() && !b->connected()) {
-      return a_is_better;
-    }
-    if (!a->connected() && b->connected()) {
-      return b_is_better;
-    }
-  }
-  return 0;
-}
-
-// Compares two connections based only on the candidate and network information.
-// Returns positive if |a| is better than |b|.
-int P2PTransportChannel::CompareConnectionCandidates(
-    const Connection* a,
-    const Connection* b) const {
-  // Prefer lower network cost.
-  uint32_t a_cost = a->ComputeNetworkCost();
-  uint32_t b_cost = b->ComputeNetworkCost();
-  // Smaller cost is better.
-  if (a_cost < b_cost) {
-    return a_is_better;
-  }
-  if (a_cost > b_cost) {
-    return b_is_better;
-  }
-
-  // Compare connection priority. Lower values get sorted last.
-  if (a->priority() > b->priority()) {
-    return a_is_better;
-  }
-  if (a->priority() < b->priority()) {
-    return b_is_better;
-  }
-
-  // If we're still tied at this point, prefer a younger generation.
-  // (Younger generation means a larger generation number).
-  int cmp = (a->remote_candidate().generation() + a->port()->generation()) -
-            (b->remote_candidate().generation() + b->port()->generation());
-  if (cmp != 0) {
-    return cmp;
-  }
-
-  // A periodic regather (triggered by the regather_all_networks_interval_range)
-  // will produce candidates that appear the same but would use a new port. We
-  // want to use the new candidates and purge the old candidates as they come
-  // in, so use the fact that the old ports get pruned immediately to rank the
-  // candidates with an active port/remote candidate higher.
-  bool a_pruned = IsPortPruned(a->port()) ||
-      IsRemoteCandidatePruned(a->remote_candidate());
-  bool b_pruned = IsPortPruned(b->port()) ||
-      IsRemoteCandidatePruned(b->remote_candidate());
-  if (!a_pruned && b_pruned) {
-    return a_is_better;
-  }
-  if (a_pruned && !b_pruned) {
-    return b_is_better;
-  }
-
-  // Otherwise, must be equal
-  return 0;
-}
-
-bool P2PTransportChannel::IsPortPruned(const Port* port) const {
-  return std::find(ports_.begin(), ports_.end(), port) == ports_.end();
-}
-
-bool P2PTransportChannel::IsRemoteCandidatePruned(const Candidate& cand) const {
-  return std::find(remote_candidates_.begin(), remote_candidates_.end(), cand)
-      == remote_candidates_.end();
-}
-
-int P2PTransportChannel::CompareConnections(
-    const Connection* a,
-    const Connection* b,
-    rtc::Optional<int64_t> receiving_unchanged_threshold,
-    bool* missed_receiving_unchanged_threshold) const {
-  RTC_CHECK(a != nullptr);
-  RTC_CHECK(b != nullptr);
-
-  // We prefer to switch to a writable and receiving connection over a
-  // non-writable or non-receiving connection, even if the latter has
-  // been nominated by the controlling side.
-  int state_cmp = CompareConnectionStates(a, b, receiving_unchanged_threshold,
-                                          missed_receiving_unchanged_threshold);
-  if (state_cmp != 0) {
-    return state_cmp;
-  }
-
-  if (ice_role_ == ICEROLE_CONTROLLED) {
-    // Compare the connections based on the nomination states and the last data
-    // received time if this is on the controlled side.
-    if (a->remote_nomination() > b->remote_nomination()) {
-      return a_is_better;
-    }
-    if (a->remote_nomination() < b->remote_nomination()) {
-      return b_is_better;
-    }
-
-    if (a->last_data_received() > b->last_data_received()) {
-      return a_is_better;
-    }
-    if (a->last_data_received() < b->last_data_received()) {
-      return b_is_better;
-    }
-  }
-
-  // Compare the network cost and priority.
-  return CompareConnectionCandidates(a, b);
-}
-
-bool P2PTransportChannel::PresumedWritable(const Connection* conn) const {
-  return (conn->write_state() == Connection::STATE_WRITE_INIT &&
-          config_.presume_writable_when_fully_relayed &&
-          conn->local_candidate().type() == RELAY_PORT_TYPE &&
-          (conn->remote_candidate().type() == RELAY_PORT_TYPE ||
-           conn->remote_candidate().type() == PRFLX_PORT_TYPE));
-}
-
-// Sort the available connections to find the best one.  We also monitor
-// the number of available connections and the current state.
-void P2PTransportChannel::SortConnectionsAndUpdateState() {
-  RTC_DCHECK(network_thread_ == rtc::Thread::Current());
-
-  // Make sure the connection states are up-to-date since this affects how they
-  // will be sorted.
-  UpdateConnectionStates();
-
-  // Any changes after this point will require a re-sort.
-  sort_dirty_ = false;
-
-  // Find the best alternative connection by sorting.  It is important to note
-  // that amongst equal preference, writable connections, this will choose the
-  // one whose estimated latency is lowest.  So it is the only one that we
-  // need to consider switching to.
-  // TODO(honghaiz): Don't sort;  Just use std::max_element in the right places.
-  std::stable_sort(connections_.begin(), connections_.end(),
-                   [this](const Connection* a, const Connection* b) {
-                     int cmp = CompareConnections(
-                         a, b, rtc::Optional<int64_t>(), nullptr);
-                     if (cmp != 0) {
-                       return cmp > 0;
-                     }
-                     // Otherwise, sort based on latency estimate.
-                     return a->rtt() < b->rtt();
-                   });
-
-  LOG(LS_VERBOSE) << "Sorting " << connections_.size()
-                  << " available connections:";
-  for (size_t i = 0; i < connections_.size(); ++i) {
-    LOG(LS_VERBOSE) << connections_[i]->ToString();
-  }
-
-  Connection* top_connection =
-      (connections_.size() > 0) ? connections_[0] : nullptr;
-
-  // If necessary, switch to the new choice. Note that |top_connection| doesn't
-  // have to be writable to become the selected connection although it will
-  // have higher priority if it is writable.
-  MaybeSwitchSelectedConnection(top_connection, "sorting");
-
-  // The controlled side can prune only if the selected connection has been
-  // nominated because otherwise it may prune the connection that will be
-  // selected by the controlling side.
-  // TODO(honghaiz): This is not enough to prevent a connection from being
-  // pruned too early because with aggressive nomination, the controlling side
-  // will nominate every connection until it becomes writable.
-  if (ice_role_ == ICEROLE_CONTROLLING ||
-      (selected_connection_ && selected_connection_->nominated())) {
-    PruneConnections();
-  }
-
-  // Check if all connections are timedout.
-  bool all_connections_timedout = true;
-  for (size_t i = 0; i < connections_.size(); ++i) {
-    if (connections_[i]->write_state() != Connection::STATE_WRITE_TIMEOUT) {
-      all_connections_timedout = false;
-      break;
-    }
-  }
-
-  // Now update the writable state of the channel with the information we have
-  // so far.
-  if (all_connections_timedout) {
-    HandleAllTimedOut();
-  }
-
-  // Update the state of this channel.
-  UpdateState();
-
-  // Also possibly start pinging.
-  // We could start pinging if:
-  // * The first connection was created.
-  // * ICE credentials were provided.
-  // * A TCP connection became connected.
-  MaybeStartPinging();
-}
-
-std::map<rtc::Network*, Connection*>
-P2PTransportChannel::GetBestConnectionByNetwork() const {
-  // |connections_| has been sorted, so the first one in the list on a given
-  // network is the best connection on the network, except that the selected
-  // connection is always the best connection on the network.
-  std::map<rtc::Network*, Connection*> best_connection_by_network;
-  if (selected_connection_) {
-    best_connection_by_network[selected_connection_->port()->Network()] =
-        selected_connection_;
-  }
-  // TODO(honghaiz): Need to update this if |connections_| are not sorted.
-  for (Connection* conn : connections_) {
-    rtc::Network* network = conn->port()->Network();
-    // This only inserts when the network does not exist in the map.
-    best_connection_by_network.insert(std::make_pair(network, conn));
-  }
-  return best_connection_by_network;
-}
-
-std::vector<Connection*>
-P2PTransportChannel::GetBestWritableConnectionPerNetwork() const {
-  std::vector<Connection*> connections;
-  for (auto kv : GetBestConnectionByNetwork()) {
-    Connection* conn = kv.second;
-    if (conn->writable() && conn->connected()) {
-      connections.push_back(conn);
-    }
-  }
-  return connections;
-}
-
-void P2PTransportChannel::PruneConnections() {
-  // We can prune any connection for which there is a connected, writable
-  // connection on the same network with better or equal priority.  We leave
-  // those with better priority just in case they become writable later (at
-  // which point, we would prune out the current selected connection).  We leave
-  // connections on other networks because they may not be using the same
-  // resources and they may represent very distinct paths over which we can
-  // switch. If |best_conn_on_network| is not connected, we may be reconnecting
-  // a TCP connection and should not prune connections in this network.
-  // See the big comment in CompareConnectionStates.
-  //
-  // An exception is made for connections on an "any address" network, meaning
-  // not bound to any specific network interface. We don't want to keep one of
-  // these alive as a backup, since it could be using the same network
-  // interface as the higher-priority, selected candidate pair.
-  auto best_connection_by_network = GetBestConnectionByNetwork();
-  for (Connection* conn : connections_) {
-    Connection* best_conn = selected_connection_;
-    if (!rtc::IPIsAny(conn->port()->Network()->ip())) {
-      // If the connection is bound to a specific network interface (not an
-      // "any address" network), compare it against the best connection for
-      // that network interface rather than the best connection overall. This
-      // ensures that at least one connection per network will be left
-      // unpruned.
-      best_conn = best_connection_by_network[conn->port()->Network()];
-    }
-    // Do not prune connections if the connection being compared against is
-    // weak. Otherwise, it may delete connections prematurely.
-    if (best_conn && conn != best_conn && !best_conn->weak() &&
-        CompareConnectionCandidates(best_conn, conn) >= 0) {
-      conn->Prune();
-    }
-  }
-}
-
-// Change the selected connection, and let listeners know.
-void P2PTransportChannel::SwitchSelectedConnection(Connection* conn) {
-  // Note: if conn is NULL, the previous |selected_connection_| has been
-  // destroyed, so don't use it.
-  Connection* old_selected_connection = selected_connection_;
-  selected_connection_ = conn;
-  if (selected_connection_) {
-    ++nomination_;
-    if (old_selected_connection) {
-      LOG_J(LS_INFO, this) << "Previous selected connection: "
-                           << old_selected_connection->ToString();
-    }
-    LOG_J(LS_INFO, this) << "New selected connection: "
-                         << selected_connection_->ToString();
-    SignalRouteChange(this, selected_connection_->remote_candidate());
-    // This is a temporary, but safe fix to webrtc issue 5705.
-    // TODO(honghaiz): Make all ENOTCONN error routed through the transport
-    // channel so that it knows whether the media channel is allowed to
-    // send; then it will only signal ready-to-send if the media channel
-    // has been disallowed to send.
-    if (selected_connection_->writable() ||
-        PresumedWritable(selected_connection_)) {
-      SignalReadyToSend(this);
-    }
-  } else {
-    LOG_J(LS_INFO, this) << "No selected connection";
-  }
-  SignalSelectedCandidatePairChanged(this, selected_connection_,
-                                     last_sent_packet_id_,
-                                     ReadyToSend(selected_connection_));
-}
-
-// Warning: UpdateState should eventually be called whenever a connection
-// is added, deleted, or the write state of any connection changes so that the
-// transport controller will get the up-to-date channel state. However it
-// should not be called too often; in the case that multiple connection states
-// change, it should be called after all the connection states have changed. For
-// example, we call this at the end of SortConnectionsAndUpdateState.
-void P2PTransportChannel::UpdateState() {
-  IceTransportState state = ComputeState();
-  if (state_ != state) {
-    LOG_J(LS_INFO, this) << "Transport channel state changed from "
-                         << static_cast<int>(state_) << " to "
-                         << static_cast<int>(state);
-    // Check that the requested transition is allowed. Note that
-    // P2PTransportChannel does not (yet) implement a direct mapping of the ICE
-    // states from the standard; the difference is covered by
-    // TransportController and PeerConnection.
-    switch (state_) {
-      case IceTransportState::STATE_INIT:
-        // TODO(deadbeef): Once we implement end-of-candidates signaling,
-        // we shouldn't go from INIT to COMPLETED.
-        RTC_DCHECK(state == IceTransportState::STATE_CONNECTING ||
-                   state == IceTransportState::STATE_COMPLETED);
-        break;
-      case IceTransportState::STATE_CONNECTING:
-        RTC_DCHECK(state == IceTransportState::STATE_COMPLETED ||
-                   state == IceTransportState::STATE_FAILED);
-        break;
-      case IceTransportState::STATE_COMPLETED:
-        // TODO(deadbeef): Once we implement end-of-candidates signaling,
-        // we shouldn't go from COMPLETED to CONNECTING.
-        // Though we *can* go from COMPlETED to FAILED, if consent expires.
-        RTC_DCHECK(state == IceTransportState::STATE_CONNECTING ||
-                   state == IceTransportState::STATE_FAILED);
-        break;
-      case IceTransportState::STATE_FAILED:
-        // TODO(deadbeef): Once we implement end-of-candidates signaling,
-        // we shouldn't go from FAILED to CONNECTING or COMPLETED.
-        RTC_DCHECK(state == IceTransportState::STATE_CONNECTING ||
-                   state == IceTransportState::STATE_COMPLETED);
-        break;
-      default:
-        RTC_NOTREACHED();
-        break;
-    }
-    state_ = state;
-    SignalStateChanged(this);
-  }
-
-  // If our selected connection is "presumed writable" (TURN-TURN with no
-  // CreatePermission required), act like we're already writable to the upper
-  // layers, so they can start media quicker.
-  bool writable =
-      selected_connection_ && (selected_connection_->writable() ||
-                               PresumedWritable(selected_connection_));
-  set_writable(writable);
-
-  bool receiving = false;
-  for (const Connection* connection : connections_) {
-    if (connection->receiving()) {
-      receiving = true;
-      break;
-    }
-  }
-  set_receiving(receiving);
-}
-
-void P2PTransportChannel::MaybeStopPortAllocatorSessions() {
-  if (!IsGettingPorts()) {
-    return;
-  }
-
-  for (const auto& session : allocator_sessions_) {
-    if (session->IsStopped()) {
-      continue;
-    }
-    // If gathering continually, keep the last session running so that
-    // it can gather candidates if the networks change.
-    if (config_.gather_continually() && session == allocator_sessions_.back()) {
-      session->ClearGettingPorts();
-    } else {
-      session->StopGettingPorts();
-    }
-  }
-}
-
-// If all connections timed out, delete them all.
-void P2PTransportChannel::HandleAllTimedOut() {
-  for (Connection* connection : connections_) {
-    connection->Destroy();
-  }
-}
-
-bool P2PTransportChannel::weak() const {
-  return !selected_connection_ || selected_connection_->weak();
-}
-
-bool P2PTransportChannel::ReadyToSend(Connection* connection) const {
-  // Note that we allow sending on an unreliable connection, because it's
-  // possible that it became unreliable simply due to bad chance.
-  // So this shouldn't prevent attempting to send media.
-  return connection != nullptr &&
-         (connection->writable() ||
-          connection->write_state() == Connection::STATE_WRITE_UNRELIABLE ||
-          PresumedWritable(connection));
-}
-
-// Handle any queued up requests
-void P2PTransportChannel::OnMessage(rtc::Message *pmsg) {
-  switch (pmsg->message_id) {
-    case MSG_SORT_AND_UPDATE_STATE:
-      SortConnectionsAndUpdateState();
-      break;
-    case MSG_CHECK_AND_PING:
-      OnCheckAndPing();
-      break;
-    case MSG_REGATHER_ON_FAILED_NETWORKS:
-      OnRegatherOnFailedNetworks();
-      break;
-    case MSG_REGATHER_ON_ALL_NETWORKS:
-      OnRegatherOnAllNetworks();
-      break;
-    default:
-      RTC_NOTREACHED();
-      break;
-  }
-}
-
-// Handle queued up check-and-ping request
-void P2PTransportChannel::OnCheckAndPing() {
-  // Make sure the states of the connections are up-to-date (since this affects
-  // which ones are pingable).
-  UpdateConnectionStates();
-  // When the selected connection is not receiving or not writable, or any
-  // active connection has not been pinged enough times, use the weak ping
-  // interval.
-  bool need_more_pings_at_weak_interval = std::any_of(
-      connections_.begin(), connections_.end(), [](Connection* conn) {
-        return conn->active() &&
-               conn->num_pings_sent() < MIN_PINGS_AT_WEAK_PING_INTERVAL;
-      });
-  int ping_interval = (weak() || need_more_pings_at_weak_interval)
-                          ? weak_ping_interval()
-                          : strong_ping_interval();
-  if (rtc::TimeMillis() >= last_ping_sent_ms_ + ping_interval) {
-    Connection* conn = FindNextPingableConnection();
-    if (conn) {
-      PingConnection(conn);
-      MarkConnectionPinged(conn);
-    }
-  }
-  int delay = std::min(ping_interval, check_receiving_interval_);
-  thread()->PostDelayed(RTC_FROM_HERE, delay, this, MSG_CHECK_AND_PING);
-}
-
-// A connection is considered a backup connection if the channel state
-// is completed, the connection is not the selected connection and it is active.
-bool P2PTransportChannel::IsBackupConnection(const Connection* conn) const {
-  return state_ == IceTransportState::STATE_COMPLETED &&
-         conn != selected_connection_ && conn->active();
-}
-
-// Is the connection in a state for us to even consider pinging the other side?
-// We consider a connection pingable even if it's not connected because that's
-// how a TCP connection is kicked into reconnecting on the active side.
-bool P2PTransportChannel::IsPingable(const Connection* conn,
-                                     int64_t now) const {
-  const Candidate& remote = conn->remote_candidate();
-  // We should never get this far with an empty remote ufrag.
-  RTC_DCHECK(!remote.username().empty());
-  if (remote.username().empty() || remote.password().empty()) {
-    // If we don't have an ICE ufrag and pwd, there's no way we can ping.
-    return false;
-  }
-
-  // A failed connection will not be pinged.
-  if (conn->state() == IceCandidatePairState::FAILED) {
-    return false;
-  }
-
-  // An never connected connection cannot be written to at all, so pinging is
-  // out of the question. However, if it has become WRITABLE, it is in the
-  // reconnecting state so ping is needed.
-  if (!conn->connected() && !conn->writable()) {
-    return false;
-  }
-
-  // If the channel is weakly connected, ping all connections.
-  if (weak()) {
-    return true;
-  }
-
-  // Always ping active connections regardless whether the channel is completed
-  // or not, but backup connections are pinged at a slower rate.
-  if (IsBackupConnection(conn)) {
-    return conn->rtt_samples() == 0 ||
-           (now >= conn->last_ping_response_received() +
-                       config_.backup_connection_ping_interval);
-  }
-  // Don't ping inactive non-backup connections.
-  if (!conn->active()) {
-    return false;
-  }
-
-  // Do ping unwritable, active connections.
-  if (!conn->writable()) {
-    return true;
-  }
-
-  // Ping writable, active connections if it's been long enough since the last
-  // ping.
-  return WritableConnectionPastPingInterval(conn, now);
-}
-
-bool P2PTransportChannel::WritableConnectionPastPingInterval(
-    const Connection* conn,
-    int64_t now) const {
-  int interval = CalculateActiveWritablePingInterval(conn, now);
-  return conn->last_ping_sent() + interval <= now;
-}
-
-int P2PTransportChannel::CalculateActiveWritablePingInterval(
-    const Connection* conn,
-    int64_t now) const {
-  // Ping each connection at a higher rate at least
-  // MIN_PINGS_AT_WEAK_PING_INTERVAL times.
-  if (conn->num_pings_sent() < MIN_PINGS_AT_WEAK_PING_INTERVAL) {
-    return weak_ping_interval();
-  }
-
-  int stable_interval = config_.stable_writable_connection_ping_interval;
-  int weak_or_stablizing_interval = std::min(
-      stable_interval, WEAK_OR_STABILIZING_WRITABLE_CONNECTION_PING_INTERVAL);
-  // If the channel is weak or the connection is not stable yet, use the
-  // weak_or_stablizing_interval.
-  return (!weak() && conn->stable(now)) ? stable_interval
-                                        : weak_or_stablizing_interval;
-}
-
-// Returns the next pingable connection to ping.
-Connection* P2PTransportChannel::FindNextPingableConnection() {
-  int64_t now = rtc::TimeMillis();
-
-  // Rule 1: Selected connection takes priority over non-selected ones.
-  if (selected_connection_ && selected_connection_->connected() &&
-      selected_connection_->writable() &&
-      WritableConnectionPastPingInterval(selected_connection_, now)) {
-    return selected_connection_;
-  }
-
-  // Rule 2: If the channel is weak, we need to find a new writable and
-  // receiving connection, probably on a different network. If there are lots of
-  // connections, it may take several seconds between two pings for every
-  // non-selected connection. This will cause the receiving state of those
-  // connections to be false, and thus they won't be selected. This is
-  // problematic for network fail-over. We want to make sure at least one
-  // connection per network is pinged frequently enough in order for it to be
-  // selectable. So we prioritize one connection per network.
-  // Rule 2.1: Among such connections, pick the one with the earliest
-  // last-ping-sent time.
-  if (weak()) {
-    auto selectable_connections = GetBestWritableConnectionPerNetwork();
-    std::vector<Connection*> pingable_selectable_connections;
-    std::copy_if(selectable_connections.begin(), selectable_connections.end(),
-                 std::back_inserter(pingable_selectable_connections),
-                 [this, now](Connection* conn) {
-                   return WritableConnectionPastPingInterval(conn, now);
-                 });
-    auto iter = std::min_element(pingable_selectable_connections.begin(),
-                                 pingable_selectable_connections.end(),
-                                 [](Connection* conn1, Connection* conn2) {
-                                   return conn1->last_ping_sent() <
-                                          conn2->last_ping_sent();
-                                 });
-    if (iter != pingable_selectable_connections.end()) {
-      return *iter;
-    }
-  }
-
-  // Rule 3: Triggered checks have priority over non-triggered connections.
-  // Rule 3.1: Among triggered checks, oldest takes precedence.
-  Connection* oldest_triggered_check =
-      FindOldestConnectionNeedingTriggeredCheck(now);
-  if (oldest_triggered_check) {
-    return oldest_triggered_check;
-  }
-
-  // Rule 4: Unpinged connections have priority over pinged ones.
-  RTC_CHECK(connections_.size() ==
-            pinged_connections_.size() + unpinged_connections_.size());
-  // If there are unpinged and pingable connections, only ping those.
-  // Otherwise, treat everything as unpinged.
-  // TODO(honghaiz): Instead of adding two separate vectors, we can add a state
-  // "pinged" to filter out unpinged connections.
-  if (std::find_if(unpinged_connections_.begin(), unpinged_connections_.end(),
-                   [this, now](Connection* conn) {
-                     return this->IsPingable(conn, now);
-                   }) == unpinged_connections_.end()) {
-    unpinged_connections_.insert(pinged_connections_.begin(),
-                                 pinged_connections_.end());
-    pinged_connections_.clear();
-  }
-
-  // Among un-pinged pingable connections, "more pingable" takes precedence.
-  std::vector<Connection*> pingable_connections;
-  std::copy_if(unpinged_connections_.begin(), unpinged_connections_.end(),
-               std::back_inserter(pingable_connections),
-               [this, now](Connection* conn) { return IsPingable(conn, now); });
-  auto iter =
-      std::max_element(pingable_connections.begin(), pingable_connections.end(),
-                       [this](Connection* conn1, Connection* conn2) {
-                         return MorePingable(conn1, conn2) == conn2;
-                       });
-  if (iter != pingable_connections.end()) {
-    return *iter;
-  }
-  return nullptr;
-}
-
-void P2PTransportChannel::MarkConnectionPinged(Connection* conn) {
-  if (conn && pinged_connections_.insert(conn).second) {
-    unpinged_connections_.erase(conn);
-  }
-}
-
-// Apart from sending ping from |conn| this method also updates
-// |use_candidate_attr| and |nomination| flags. One of the flags is set to
-// nominate |conn| if this channel is in CONTROLLING.
-void P2PTransportChannel::PingConnection(Connection* conn) {
-  bool use_candidate_attr = false;
-  uint32_t nomination = 0;
-  if (ice_role_ == ICEROLE_CONTROLLING) {
-    bool renomination_supported = ice_parameters_.renomination &&
-                                  !remote_ice_parameters_.empty() &&
-                                  remote_ice_parameters_.back().renomination;
-    if (renomination_supported) {
-      nomination = GetNominationAttr(conn);
-    } else {
-      use_candidate_attr =
-          GetUseCandidateAttr(conn, config_.default_nomination_mode);
-    }
-  }
-  conn->set_nomination(nomination);
-  conn->set_use_candidate_attr(use_candidate_attr);
-  last_ping_sent_ms_ = rtc::TimeMillis();
-  conn->Ping(last_ping_sent_ms_);
-}
-
-uint32_t P2PTransportChannel::GetNominationAttr(Connection* conn) const {
-  return (conn == selected_connection_) ? nomination_ : 0;
-}
-
-// Nominate a connection based on the NominationMode.
-bool P2PTransportChannel::GetUseCandidateAttr(Connection* conn,
-                                              NominationMode mode) const {
-  switch (mode) {
-    case NominationMode::REGULAR:
-      // TODO(honghaiz): Implement regular nomination.
-      return false;
-    case NominationMode::AGGRESSIVE:
-      if (remote_ice_mode_ == ICEMODE_LITE) {
-        return GetUseCandidateAttr(conn, NominationMode::REGULAR);
-      }
-      return true;
-    case NominationMode::SEMI_AGGRESSIVE: {
-      // Nominate if
-      // a) Remote is in FULL ICE AND
-      //    a.1) |conn| is the selected connection OR
-      //    a.2) there is no selected connection OR
-      //    a.3) the selected connection is unwritable OR
-      //    a.4) |conn| has higher priority than selected_connection.
-      // b) Remote is in LITE ICE AND
-      //    b.1) |conn| is the selected_connection AND
-      //    b.2) |conn| is writable.
-      bool selected = conn == selected_connection_;
-      if (remote_ice_mode_ == ICEMODE_LITE) {
-        return selected && conn->writable();
-      }
-      bool better_than_selected =
-          !selected_connection_ || !selected_connection_->writable() ||
-          CompareConnectionCandidates(selected_connection_, conn) < 0;
-      return selected || better_than_selected;
-    }
-    default:
-      RTC_NOTREACHED();
-      return false;
-  }
-}
-
-// When a connection's state changes, we need to figure out who to use as
-// the selected connection again.  It could have become usable, or become
-// unusable.
-void P2PTransportChannel::OnConnectionStateChange(Connection* connection) {
-  RTC_DCHECK(network_thread_ == rtc::Thread::Current());
-
-  // May stop the allocator session when at least one connection becomes
-  // strongly connected after starting to get ports and the local candidate of
-  // the connection is at the latest generation. It is not enough to check
-  // that the connection becomes weakly connected because the connection may be
-  // changing from (writable, receiving) to (writable, not receiving).
-  bool strongly_connected = !connection->weak();
-  bool latest_generation = connection->local_candidate().generation() >=
-                           allocator_session()->generation();
-  if (strongly_connected && latest_generation) {
-    MaybeStopPortAllocatorSessions();
-  }
-
-  // We have to unroll the stack before doing this because we may be changing
-  // the state of connections while sorting.
-  RequestSortAndStateUpdate();
-}
-
-// When a connection is removed, edit it out, and then update our best
-// connection.
-void P2PTransportChannel::OnConnectionDestroyed(Connection* connection) {
-  RTC_DCHECK(network_thread_ == rtc::Thread::Current());
-
-  // Note: the previous selected_connection_ may be destroyed by now, so don't
-  // use it.
-
-  // Remove this connection from the list.
-  std::vector<Connection*>::iterator iter =
-      std::find(connections_.begin(), connections_.end(), connection);
-  RTC_DCHECK(iter != connections_.end());
-  pinged_connections_.erase(*iter);
-  unpinged_connections_.erase(*iter);
-  connections_.erase(iter);
-
-  LOG_J(LS_INFO, this) << "Removed connection " << std::hex << connection
-                       << std::dec << " (" << connections_.size()
-                       << " remaining)";
-
-  // If this is currently the selected connection, then we need to pick a new
-  // one. The call to SortConnectionsAndUpdateState will pick a new one. It
-  // looks at the current selected connection in order to avoid switching
-  // between fairly similar ones. Since this connection is no longer an option,
-  // we can just set selected to nullptr and re-choose a best assuming that
-  // there was no selected connection.
-  if (selected_connection_ == connection) {
-    LOG(LS_INFO) << "Selected connection destroyed. Will choose a new one.";
-    SwitchSelectedConnection(nullptr);
-    RequestSortAndStateUpdate();
-  } else {
-    // If a non-selected connection was destroyed, we don't need to re-sort but
-    // we do need to update state, because we could be switching to "failed" or
-    // "completed".
-    UpdateState();
-  }
-}
-
-// When a port is destroyed, remove it from our list of ports to use for
-// connection attempts.
-void P2PTransportChannel::OnPortDestroyed(PortInterface* port) {
-  RTC_DCHECK(network_thread_ == rtc::Thread::Current());
-
-  ports_.erase(std::remove(ports_.begin(), ports_.end(), port), ports_.end());
-  pruned_ports_.erase(
-      std::remove(pruned_ports_.begin(), pruned_ports_.end(), port),
-      pruned_ports_.end());
-  LOG(INFO) << "Removed port because it is destroyed: " << ports_.size()
-            << " remaining";
-}
-
-void P2PTransportChannel::OnPortsPruned(
-    PortAllocatorSession* session,
-    const std::vector<PortInterface*>& ports) {
-  RTC_DCHECK(network_thread_ == rtc::Thread::Current());
-  for (PortInterface* port : ports) {
-    if (PrunePort(port)) {
-      LOG(INFO) << "Removed port: " << port->ToString() << " " << ports_.size()
-                << " remaining";
-    }
-  }
-}
-
-void P2PTransportChannel::OnCandidatesRemoved(
-    PortAllocatorSession* session,
-    const std::vector<Candidate>& candidates) {
-  RTC_DCHECK(network_thread_ == rtc::Thread::Current());
-  // Do not signal candidate removals if continual gathering is not enabled, or
-  // if this is not the last session because an ICE restart would have signaled
-  // the remote side to remove all candidates in previous sessions.
-  if (!config_.gather_continually() || session != allocator_session()) {
-    return;
-  }
-
-  std::vector<Candidate> candidates_to_remove;
-  for (Candidate candidate : candidates) {
-    candidate.set_transport_name(transport_name());
-    candidates_to_remove.push_back(candidate);
-  }
-  SignalCandidatesRemoved(this, candidates_to_remove);
-}
-
-void P2PTransportChannel::OnRegatherOnFailedNetworks() {
-  // Only re-gather when the current session is in the CLEARED state (i.e., not
-  // running or stopped). It is only possible to enter this state when we gather
-  // continually, so there is an implicit check on continual gathering here.
-  if (!allocator_sessions_.empty() && allocator_session()->IsCleared()) {
-    allocator_session()->RegatherOnFailedNetworks();
-  }
-
-  thread()->PostDelayed(RTC_FROM_HERE,
-                        *config_.regather_on_failed_networks_interval, this,
-                        MSG_REGATHER_ON_FAILED_NETWORKS);
-}
-
-void P2PTransportChannel::OnRegatherOnAllNetworks() {
-  if (!allocator_sessions_.empty() && allocator_session()->IsCleared()) {
-    allocator_session()->RegatherOnAllNetworks();
-  }
-
-  thread()->PostDelayed(RTC_FROM_HERE,
-                        SampleRegatherAllNetworksInterval(), this,
-                        MSG_REGATHER_ON_ALL_NETWORKS);
-}
-
-void P2PTransportChannel::PruneAllPorts() {
-  pruned_ports_.insert(pruned_ports_.end(), ports_.begin(), ports_.end());
-  ports_.clear();
-}
-
-bool P2PTransportChannel::PrunePort(PortInterface* port) {
-  auto it = std::find(ports_.begin(), ports_.end(), port);
-  // Don't need to do anything if the port has been deleted from the port list.
-  if (it == ports_.end()) {
-    return false;
-  }
-  ports_.erase(it);
-  pruned_ports_.push_back(port);
-  return true;
-}
-
-// We data is available, let listeners know
-void P2PTransportChannel::OnReadPacket(Connection* connection,
-                                       const char* data,
-                                       size_t len,
-                                       const rtc::PacketTime& packet_time) {
-  RTC_DCHECK(network_thread_ == rtc::Thread::Current());
-
-  // Do not deliver, if packet doesn't belong to the correct transport channel.
-  if (!FindConnection(connection))
-    return;
-
-  // Let the client know of an incoming packet
-  SignalReadPacket(this, data, len, packet_time, 0);
-
-  // May need to switch the sending connection based on the receiving media path
-  // if this is the controlled side.
-  if (ice_role_ == ICEROLE_CONTROLLED) {
-    MaybeSwitchSelectedConnection(connection, "data received");
-  }
-}
-
-void P2PTransportChannel::OnSentPacket(const rtc::SentPacket& sent_packet) {
-  RTC_DCHECK(network_thread_ == rtc::Thread::Current());
-
-  SignalSentPacket(this, sent_packet);
-}
-
-void P2PTransportChannel::OnReadyToSend(Connection* connection) {
-  if (connection == selected_connection_ && writable()) {
-    SignalReadyToSend(this);
-  }
-}
-
-// Find "triggered checks".  We ping first those connections that have
-// received a ping but have not sent a ping since receiving it
-// (last_ping_received > last_ping_sent).  But we shouldn't do
-// triggered checks if the connection is already writable.
-Connection* P2PTransportChannel::FindOldestConnectionNeedingTriggeredCheck(
-    int64_t now) {
-  Connection* oldest_needing_triggered_check = nullptr;
-  for (auto conn : connections_) {
-    if (!IsPingable(conn, now)) {
-      continue;
-    }
-    bool needs_triggered_check =
-        (!conn->writable() &&
-         conn->last_ping_received() > conn->last_ping_sent());
-    if (needs_triggered_check &&
-        (!oldest_needing_triggered_check ||
-         (conn->last_ping_received() <
-          oldest_needing_triggered_check->last_ping_received()))) {
-      oldest_needing_triggered_check = conn;
-    }
-  }
-
-  if (oldest_needing_triggered_check) {
-    LOG(LS_INFO) << "Selecting connection for triggered check: "
-                 << oldest_needing_triggered_check->ToString();
-  }
-  return oldest_needing_triggered_check;
-}
-
-Connection* P2PTransportChannel::MostLikelyToWork(Connection* conn1,
-                                                  Connection* conn2) {
-  bool rr1 = IsRelayRelay(conn1);
-  bool rr2 = IsRelayRelay(conn2);
-  if (rr1 && !rr2) {
-    return conn1;
-  } else if (rr2 && !rr1) {
-    return conn2;
-  } else if (rr1 && rr2) {
-    bool udp1 = IsUdp(conn1);
-    bool udp2 = IsUdp(conn2);
-    if (udp1 && !udp2) {
-      return conn1;
-    } else if (udp2 && udp1) {
-      return conn2;
-    }
-  }
-  return nullptr;
-}
-
-Connection* P2PTransportChannel::LeastRecentlyPinged(Connection* conn1,
-                                                     Connection* conn2) {
-  if (conn1->last_ping_sent() < conn2->last_ping_sent()) {
-    return conn1;
-  }
-  if (conn1->last_ping_sent() > conn2->last_ping_sent()) {
-    return conn2;
-  }
-  return nullptr;
-}
-
-Connection* P2PTransportChannel::MorePingable(Connection* conn1,
-                                              Connection* conn2) {
-  RTC_DCHECK(conn1 != conn2);
-  if (config_.prioritize_most_likely_candidate_pairs) {
-    Connection* most_likely_to_work_conn = MostLikelyToWork(conn1, conn2);
-    if (most_likely_to_work_conn) {
-      return most_likely_to_work_conn;
-    }
-  }
-
-  Connection* least_recently_pinged_conn = LeastRecentlyPinged(conn1, conn2);
-  if (least_recently_pinged_conn) {
-    return least_recently_pinged_conn;
-  }
-
-  // During the initial state when nothing has been pinged yet, return the first
-  // one in the ordered |connections_|.
-  return *(std::find_if(connections_.begin(), connections_.end(),
-                        [conn1, conn2](Connection* conn) {
-                          return conn == conn1 || conn == conn2;
-                        }));
-}
-
-void P2PTransportChannel::set_writable(bool writable) {
-  if (writable_ == writable) {
-    return;
-  }
-  LOG_J(LS_VERBOSE, this) << "set_writable from:" << writable_ << " to "
-                          << writable;
-  writable_ = writable;
-  if (writable_) {
-    SignalReadyToSend(this);
-  }
-  SignalWritableState(this);
-}
-
-void P2PTransportChannel::set_receiving(bool receiving) {
-  if (receiving_ == receiving) {
-    return;
-  }
-  receiving_ = receiving;
-  SignalReceivingState(this);
-}
-
-int P2PTransportChannel::SampleRegatherAllNetworksInterval() {
-  auto interval = config_.regather_all_networks_interval_range;
-  RTC_DCHECK(interval);
-  return rand_.Rand(interval->min(), interval->max());
-}
-
-}  // namespace cricket
diff --git a/p2p/base/p2ptransportchannel.h b/p2p/base/p2ptransportchannel.h
deleted file mode 100644
index d2461de..0000000
--- a/p2p/base/p2ptransportchannel.h
+++ /dev/null
@@ -1,410 +0,0 @@
-/*
- *  Copyright 2004 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.
- */
-
-// P2PTransportChannel wraps up the state management of the connection between
-// two P2P clients.  Clients have candidate ports for connecting, and
-// connections which are combinations of candidates from each end (Alice and
-// Bob each have candidates, one candidate from Alice and one candidate from
-// Bob are used to make a connection, repeat to make many connections).
-//
-// When all of the available connections become invalid (non-writable), we
-// kick off a process of determining more candidates and more connections.
-//
-#ifndef WEBRTC_P2P_BASE_P2PTRANSPORTCHANNEL_H_
-#define WEBRTC_P2P_BASE_P2PTRANSPORTCHANNEL_H_
-
-#include <map>
-#include <memory>
-#include <set>
-#include <string>
-#include <vector>
-
-#include "webrtc/p2p/base/candidate.h"
-#include "webrtc/p2p/base/candidatepairinterface.h"
-#include "webrtc/p2p/base/icetransportinternal.h"
-#include "webrtc/p2p/base/portallocator.h"
-#include "webrtc/p2p/base/portinterface.h"
-#include "webrtc/rtc_base/asyncpacketsocket.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/random.h"
-#include "webrtc/rtc_base/sigslot.h"
-
-namespace cricket {
-
-// Enum for UMA metrics, used to record whether the channel is
-// connected/connecting/disconnected when ICE restart happens.
-enum class IceRestartState { CONNECTING, CONNECTED, DISCONNECTED, MAX_VALUE };
-
-extern const int WEAK_PING_INTERVAL;
-extern const int STRONG_PING_INTERVAL;
-extern const int WEAK_OR_STABILIZING_WRITABLE_CONNECTION_PING_INTERVAL;
-extern const int STRONG_AND_STABLE_WRITABLE_CONNECTION_PING_INTERVAL;
-static const int MIN_PINGS_AT_WEAK_PING_INTERVAL = 3;
-
-// Adds the port on which the candidate originated.
-class RemoteCandidate : public Candidate {
- public:
-  RemoteCandidate(const Candidate& c, PortInterface* origin_port)
-      : Candidate(c), origin_port_(origin_port) {}
-
-  PortInterface* origin_port() { return origin_port_; }
-
- private:
-  PortInterface* origin_port_;
-};
-
-// P2PTransportChannel manages the candidates and connection process to keep
-// two P2P clients connected to each other.
-class P2PTransportChannel : public IceTransportInternal,
-                            public rtc::MessageHandler {
- public:
-  P2PTransportChannel(const std::string& transport_name,
-                      int component,
-                      PortAllocator* allocator);
-  virtual ~P2PTransportChannel();
-
-  // From TransportChannelImpl:
-  IceTransportState GetState() const override;
-  const std::string& transport_name() const override { return transport_name_; }
-  int component() const override { return component_; }
-  bool writable() const override { return writable_; }
-  bool receiving() const override { return receiving_; }
-  void SetIceRole(IceRole role) override;
-  IceRole GetIceRole() const override { return ice_role_; }
-  void SetIceTiebreaker(uint64_t tiebreaker) override;
-  void SetIceParameters(const IceParameters& ice_params) override;
-  void SetRemoteIceParameters(const IceParameters& ice_params) override;
-  void SetRemoteIceMode(IceMode mode) override;
-  // TODO(deadbeef): Deprecated. Remove when Chromium's
-  // IceTransportChannel does not depend on this.
-  void Connect() {}
-  void MaybeStartGathering() override;
-  IceGatheringState gathering_state() const override {
-    return gathering_state_;
-  }
-  void AddRemoteCandidate(const Candidate& candidate) override;
-  void RemoveRemoteCandidate(const Candidate& candidate) override;
-  // Sets the parameters in IceConfig. We do not set them blindly. Instead, we
-  // only update the parameter if it is considered set in |config|. For example,
-  // a negative value of receiving_timeout will be considered "not set" and we
-  // will not use it to update the respective parameter in |config_|.
-  // TODO(deadbeef): Use rtc::Optional instead of negative values.
-  void SetIceConfig(const IceConfig& config) override;
-  const IceConfig& config() const;
-  void SetMetricsObserver(webrtc::MetricsObserverInterface* observer) override;
-
-  // From TransportChannel:
-  int SendPacket(const char* data,
-                 size_t len,
-                 const rtc::PacketOptions& options,
-                 int flags) override;
-  int SetOption(rtc::Socket::Option opt, int value) override;
-  bool GetOption(rtc::Socket::Option opt, int* value) override;
-  int GetError() override { return error_; }
-  bool GetStats(std::vector<ConnectionInfo>* stats) override;
-  rtc::Optional<int> GetRttEstimate() override;
-
-  // TODO(honghaiz): Remove this method once the reference of it in
-  // Chromoting is removed.
-  const Connection* best_connection() const { return selected_connection_; }
-
-  const Connection* selected_connection() const { return selected_connection_; }
-  void set_incoming_only(bool value) { incoming_only_ = value; }
-
-  // Note: These are only for testing purpose.
-  // |ports_| and |pruned_ports| should not be changed from outside.
-  const std::vector<PortInterface*>& ports() { return ports_; }
-  const std::vector<PortInterface*>& pruned_ports() { return pruned_ports_; }
-
-  IceMode remote_ice_mode() const { return remote_ice_mode_; }
-
-  void PruneAllPorts();
-  int receiving_timeout() const { return config_.receiving_timeout; }
-  int check_receiving_interval() const { return check_receiving_interval_; }
-
-  // Helper method used only in unittest.
-  rtc::DiffServCodePoint DefaultDscpValue() const;
-
-  // Public for unit tests.
-  Connection* FindNextPingableConnection();
-  void MarkConnectionPinged(Connection* conn);
-
-  // Public for unit tests.
-  const std::vector<Connection*>& connections() const { return connections_; }
-
-  // Public for unit tests.
-  PortAllocatorSession* allocator_session() {
-    return allocator_sessions_.back().get();
-  }
-
-  // Public for unit tests.
-  const std::vector<RemoteCandidate>& remote_candidates() const {
-    return remote_candidates_;
-  }
-
-  std::string ToString() const {
-    const char RECEIVING_ABBREV[2] = {'_', 'R'};
-    const char WRITABLE_ABBREV[2] = {'_', 'W'};
-    std::stringstream ss;
-    ss << "Channel[" << transport_name_ << "|" << component_ << "|"
-       << RECEIVING_ABBREV[receiving_] << WRITABLE_ABBREV[writable_] << "]";
-    return ss.str();
-  }
-
- private:
-  rtc::Thread* thread() const { return network_thread_; }
-  bool IsGettingPorts() { return allocator_session()->IsGettingPorts(); }
-
-  // A transport channel is weak if the current best connection is either
-  // not receiving or not writable, or if there is no best connection at all.
-  bool weak() const;
-
-  int weak_ping_interval() const {
-    if (config_.ice_check_min_interval &&
-        weak_ping_interval_ < *config_.ice_check_min_interval) {
-      return *config_.ice_check_min_interval;
-    }
-    return weak_ping_interval_;
-  }
-
-  int strong_ping_interval() const {
-    if (config_.ice_check_min_interval &&
-        STRONG_PING_INTERVAL < *config_.ice_check_min_interval) {
-      return *config_.ice_check_min_interval;
-    }
-    return STRONG_PING_INTERVAL;
-  }
-
-  // Returns true if it's possible to send packets on |connection|.
-  bool ReadyToSend(Connection* connection) const;
-  void UpdateConnectionStates();
-  void RequestSortAndStateUpdate();
-  // Start pinging if we haven't already started, and we now have a connection
-  // that's pingable.
-  void MaybeStartPinging();
-
-  // The methods below return a positive value if |a| is preferable to |b|,
-  // a negative value if |b| is preferable, and 0 if they're equally preferable.
-  // If |receiving_unchanged_threshold| is set, then when |b| is receiving and
-  // |a| is not, returns a negative value only if |b| has been in receiving
-  // state and |a| has been in not receiving state since
-  // |receiving_unchanged_threshold| and sets
-  // |missed_receiving_unchanged_threshold| to true otherwise.
-  int CompareConnectionStates(
-      const cricket::Connection* a,
-      const cricket::Connection* b,
-      rtc::Optional<int64_t> receiving_unchanged_threshold,
-      bool* missed_receiving_unchanged_threshold) const;
-  int CompareConnectionCandidates(const cricket::Connection* a,
-                                  const cricket::Connection* b) const;
-  // Compares two connections based on the connection states
-  // (writable/receiving/connected), nomination states, last data received time,
-  // and static preferences. Does not include latency. Used by both sorting
-  // and ShouldSwitchSelectedConnection().
-  // Returns a positive value if |a| is better than |b|.
-  int CompareConnections(const cricket::Connection* a,
-                         const cricket::Connection* b,
-                         rtc::Optional<int64_t> receiving_unchanged_threshold,
-                         bool* missed_receiving_unchanged_threshold) const;
-
-  bool PresumedWritable(const cricket::Connection* conn) const;
-
-  void SortConnectionsAndUpdateState();
-  void SwitchSelectedConnection(Connection* conn);
-  void UpdateState();
-  void HandleAllTimedOut();
-  void MaybeStopPortAllocatorSessions();
-  IceTransportState ComputeState() const;
-
-  Connection* GetBestConnectionOnNetwork(rtc::Network* network) const;
-  bool CreateConnections(const Candidate& remote_candidate,
-                         PortInterface* origin_port);
-  bool CreateConnection(PortInterface* port,
-                        const Candidate& remote_candidate,
-                        PortInterface* origin_port);
-  bool FindConnection(cricket::Connection* connection) const;
-
-  uint32_t GetRemoteCandidateGeneration(const Candidate& candidate);
-  bool IsDuplicateRemoteCandidate(const Candidate& candidate);
-  void RememberRemoteCandidate(const Candidate& remote_candidate,
-                               PortInterface* origin_port);
-  bool IsPingable(const Connection* conn, int64_t now) const;
-  // Whether a writable connection is past its ping interval and needs to be
-  // pinged again.
-  bool WritableConnectionPastPingInterval(const Connection* conn,
-                                          int64_t now) const;
-  int CalculateActiveWritablePingInterval(const Connection* conn,
-                                          int64_t now) const;
-  void PingConnection(Connection* conn);
-  void AddAllocatorSession(std::unique_ptr<PortAllocatorSession> session);
-  void AddConnection(Connection* connection);
-
-  void OnPortReady(PortAllocatorSession *session, PortInterface* port);
-  void OnPortsPruned(PortAllocatorSession* session,
-                     const std::vector<PortInterface*>& ports);
-  void OnCandidatesReady(PortAllocatorSession *session,
-                         const std::vector<Candidate>& candidates);
-  void OnCandidatesRemoved(PortAllocatorSession* session,
-                           const std::vector<Candidate>& candidates);
-  void OnCandidatesAllocationDone(PortAllocatorSession* session);
-  void OnUnknownAddress(PortInterface* port,
-                        const rtc::SocketAddress& addr,
-                        ProtocolType proto,
-                        IceMessage* stun_msg,
-                        const std::string& remote_username,
-                        bool port_muxed);
-
-  // When a port is destroyed, remove it from both lists |ports_|
-  // and |pruned_ports_|.
-  void OnPortDestroyed(PortInterface* port);
-  // When pruning a port, move it from |ports_| to |pruned_ports_|.
-  // Returns true if the port is found and removed from |ports_|.
-  bool PrunePort(PortInterface* port);
-  void OnRoleConflict(PortInterface* port);
-
-  void OnConnectionStateChange(Connection* connection);
-  void OnReadPacket(Connection *connection, const char *data, size_t len,
-                    const rtc::PacketTime& packet_time);
-  void OnSentPacket(const rtc::SentPacket& sent_packet);
-  void OnReadyToSend(Connection* connection);
-  void OnConnectionDestroyed(Connection *connection);
-
-  void OnNominated(Connection* conn);
-
-  void OnMessage(rtc::Message* pmsg) override;
-  void OnCheckAndPing();
-  void OnRegatherOnFailedNetworks();
-  void OnRegatherOnAllNetworks();
-
-  uint32_t GetNominationAttr(Connection* conn) const;
-  bool GetUseCandidateAttr(Connection* conn, NominationMode mode) const;
-
-  // Returns true if we should switch to the new connection.
-  // sets |missed_receiving_unchanged_threshold| to true if either
-  // the selected connection or the new connection missed its
-  // receiving-unchanged-threshold.
-  bool ShouldSwitchSelectedConnection(
-      Connection* new_connection,
-      bool* missed_receiving_unchanged_threshold) const;
-  // Returns true if the new_connection is selected for transmission.
-  bool MaybeSwitchSelectedConnection(Connection* new_connection,
-                                     const std::string& reason);
-  // Gets the best connection for each network.
-  std::map<rtc::Network*, Connection*> GetBestConnectionByNetwork() const;
-  std::vector<Connection*> GetBestWritableConnectionPerNetwork() const;
-  void PruneConnections();
-  bool IsBackupConnection(const Connection* conn) const;
-
-  Connection* FindOldestConnectionNeedingTriggeredCheck(int64_t now);
-  // Between |conn1| and |conn2|, this function returns the one which should
-  // be pinged first.
-  Connection* MorePingable(Connection* conn1, Connection* conn2);
-  // Select the connection which is Relay/Relay. If both of them are,
-  // UDP relay protocol takes precedence.
-  Connection* MostLikelyToWork(Connection* conn1, Connection* conn2);
-  // Compare the last_ping_sent time and return the one least recently pinged.
-  Connection* LeastRecentlyPinged(Connection* conn1, Connection* conn2);
-
-  // Returns the latest remote ICE parameters or nullptr if there are no remote
-  // ICE parameters yet.
-  IceParameters* remote_ice() {
-    return remote_ice_parameters_.empty() ? nullptr
-                                          : &remote_ice_parameters_.back();
-  }
-  // Returns the remote IceParameters and generation that match |ufrag|
-  // if found, and returns nullptr otherwise.
-  const IceParameters* FindRemoteIceFromUfrag(const std::string& ufrag,
-                                              uint32_t* generation);
-  // Returns the index of the latest remote ICE parameters, or 0 if no remote
-  // ICE parameters have been received.
-  uint32_t remote_ice_generation() {
-    return remote_ice_parameters_.empty()
-               ? 0
-               : static_cast<uint32_t>(remote_ice_parameters_.size() - 1);
-  }
-
-  // Samples a delay from the uniform distribution defined by the
-  // regather_on_all_networks_interval ICE configuration pair.
-  int SampleRegatherAllNetworksInterval();
-
-  // Indicates if the given local port has been pruned.
-  bool IsPortPruned(const Port* port) const;
-
-  // Indicates if the given remote candidate has been pruned.
-  bool IsRemoteCandidatePruned(const Candidate& cand) const;
-
-  // Sets the writable state, signaling if necessary.
-  void set_writable(bool writable);
-  // Sets the receiving state, signaling if necessary.
-  void set_receiving(bool receiving);
-
-  std::string transport_name_;
-  int component_;
-  PortAllocator* allocator_;
-  rtc::Thread* network_thread_;
-  bool incoming_only_;
-  int error_;
-  std::vector<std::unique_ptr<PortAllocatorSession>> allocator_sessions_;
-  // |ports_| contains ports that are used to form new connections when
-  // new remote candidates are added.
-  std::vector<PortInterface*> ports_;
-  // |pruned_ports_| contains ports that have been removed from |ports_| and
-  // are not being used to form new connections, but that aren't yet destroyed.
-  // They may have existing connections, and they still fire signals such as
-  // SignalUnknownAddress.
-  std::vector<PortInterface*> pruned_ports_;
-
-  // |connections_| is a sorted list with the first one always be the
-  // |selected_connection_| when it's not nullptr. The combination of
-  // |pinged_connections_| and |unpinged_connections_| has the same
-  // connections as |connections_|. These 2 sets maintain whether a
-  // connection should be pinged next or not.
-  std::vector<Connection *> connections_;
-  std::set<Connection*> pinged_connections_;
-  std::set<Connection*> unpinged_connections_;
-
-  Connection* selected_connection_ = nullptr;
-
-  std::vector<RemoteCandidate> remote_candidates_;
-  bool sort_dirty_;  // indicates whether another sort is needed right now
-  bool had_connection_ = false;  // if connections_ has ever been nonempty
-  typedef std::map<rtc::Socket::Option, int> OptionMap;
-  OptionMap options_;
-  IceParameters ice_parameters_;
-  std::vector<IceParameters> remote_ice_parameters_;
-  IceMode remote_ice_mode_;
-  IceRole ice_role_;
-  uint64_t tiebreaker_;
-  IceGatheringState gathering_state_;
-
-  // Used to generate random intervals for regather_all_networks_interval_range.
-  webrtc::Random rand_;
-
-  int check_receiving_interval_;
-  int64_t last_ping_sent_ms_ = 0;
-  int weak_ping_interval_ = WEAK_PING_INTERVAL;
-  IceTransportState state_ = IceTransportState::STATE_INIT;
-  IceConfig config_;
-  int last_sent_packet_id_ = -1;  // -1 indicates no packet was sent before.
-  bool started_pinging_ = false;
-  // The value put in the "nomination" attribute for the next nominated
-  // connection. A zero-value indicates the connection will not be nominated.
-  uint32_t nomination_ = 0;
-  bool receiving_ = false;
-  bool writable_ = false;
-
-  webrtc::MetricsObserverInterface* metrics_observer_ = nullptr;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(P2PTransportChannel);
-};
-
-}  // namespace cricket
-
-#endif  // WEBRTC_P2P_BASE_P2PTRANSPORTCHANNEL_H_
diff --git a/p2p/base/p2ptransportchannel_unittest.cc b/p2p/base/p2ptransportchannel_unittest.cc
deleted file mode 100644
index 62fddb2..0000000
--- a/p2p/base/p2ptransportchannel_unittest.cc
+++ /dev/null
@@ -1,4517 +0,0 @@
-/*
- *  Copyright 2009 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 <algorithm>
-#include <memory>
-
-#include "webrtc/api/fakemetricsobserver.h"
-#include "webrtc/p2p/base/fakeportallocator.h"
-#include "webrtc/p2p/base/icetransportinternal.h"
-#include "webrtc/p2p/base/p2ptransportchannel.h"
-#include "webrtc/p2p/base/packettransportinternal.h"
-#include "webrtc/p2p/base/testrelayserver.h"
-#include "webrtc/p2p/base/teststunserver.h"
-#include "webrtc/p2p/base/testturnserver.h"
-#include "webrtc/p2p/client/basicportallocator.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/dscp.h"
-#include "webrtc/rtc_base/fakeclock.h"
-#include "webrtc/rtc_base/fakenetwork.h"
-#include "webrtc/rtc_base/firewallsocketserver.h"
-#include "webrtc/rtc_base/gunit.h"
-#include "webrtc/rtc_base/helpers.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/natserver.h"
-#include "webrtc/rtc_base/natsocketfactory.h"
-#include "webrtc/rtc_base/proxyserver.h"
-#include "webrtc/rtc_base/ptr_util.h"
-#include "webrtc/rtc_base/socketaddress.h"
-#include "webrtc/rtc_base/ssladapter.h"
-#include "webrtc/rtc_base/thread.h"
-#include "webrtc/rtc_base/virtualsocketserver.h"
-
-namespace {
-
-using rtc::SocketAddress;
-
-// Default timeout for tests in this file.
-// Should be large enough for slow buildbots to run the tests reliably.
-static const int kDefaultTimeout = 10000;
-static const int kMediumTimeout = 3000;
-static const int kShortTimeout = 1000;
-
-static const int kOnlyLocalPorts = cricket::PORTALLOCATOR_DISABLE_STUN |
-                                   cricket::PORTALLOCATOR_DISABLE_RELAY |
-                                   cricket::PORTALLOCATOR_DISABLE_TCP;
-static const int LOW_RTT = 20;
-// Addresses on the public internet.
-static const SocketAddress kPublicAddrs[2] =
-    { SocketAddress("11.11.11.11", 0), SocketAddress("22.22.22.22", 0) };
-// IPv6 Addresses on the public internet.
-static const SocketAddress kIPv6PublicAddrs[2] = {
-    SocketAddress("2400:4030:1:2c00:be30:abcd:efab:cdef", 0),
-    SocketAddress("2600:0:1000:1b03:2e41:38ff:fea6:f2a4", 0)};
-// For configuring multihomed clients.
-static const SocketAddress kAlternateAddrs[2] = {
-    SocketAddress("101.101.101.101", 0), SocketAddress("202.202.202.202", 0)};
-static const SocketAddress kIPv6AlternateAddrs[2] = {
-    SocketAddress("2401:4030:1:2c00:be30:abcd:efab:cdef", 0),
-    SocketAddress("2601:0:1000:1b03:2e41:38ff:fea6:f2a4", 0)};
-// Addresses for HTTP proxy servers.
-static const SocketAddress kHttpsProxyAddrs[2] =
-    { SocketAddress("11.11.11.1", 443), SocketAddress("22.22.22.1", 443) };
-// Addresses for SOCKS proxy servers.
-static const SocketAddress kSocksProxyAddrs[2] =
-    { SocketAddress("11.11.11.1", 1080), SocketAddress("22.22.22.1", 1080) };
-// Internal addresses for NAT boxes.
-static const SocketAddress kNatAddrs[2] =
-    { SocketAddress("192.168.1.1", 0), SocketAddress("192.168.2.1", 0) };
-// Private addresses inside the NAT private networks.
-static const SocketAddress kPrivateAddrs[2] =
-    { SocketAddress("192.168.1.11", 0), SocketAddress("192.168.2.22", 0) };
-// For cascaded NATs, the internal addresses of the inner NAT boxes.
-static const SocketAddress kCascadedNatAddrs[2] =
-    { SocketAddress("192.168.10.1", 0), SocketAddress("192.168.20.1", 0) };
-// For cascaded NATs, private addresses inside the inner private networks.
-static const SocketAddress kCascadedPrivateAddrs[2] =
-    { SocketAddress("192.168.10.11", 0), SocketAddress("192.168.20.22", 0) };
-// The address of the public STUN server.
-static const SocketAddress kStunAddr("99.99.99.1", cricket::STUN_SERVER_PORT);
-// The addresses for the public turn server.
-static const SocketAddress kTurnUdpIntAddr("99.99.99.3",
-                                           cricket::STUN_SERVER_PORT);
-static const SocketAddress kTurnTcpIntAddr("99.99.99.4",
-                                           cricket::STUN_SERVER_PORT + 1);
-static const SocketAddress kTurnUdpExtAddr("99.99.99.5", 0);
-static const cricket::RelayCredentials kRelayCredentials("test", "test");
-
-// Based on ICE_UFRAG_LENGTH
-const char* kIceUfrag[4] = {"UF00", "UF01", "UF02", "UF03"};
-// Based on ICE_PWD_LENGTH
-const char* kIcePwd[4] = {
-    "TESTICEPWD00000000000000", "TESTICEPWD00000000000001",
-    "TESTICEPWD00000000000002", "TESTICEPWD00000000000003"};
-const cricket::IceParameters kIceParams[4] = {
-    {kIceUfrag[0], kIcePwd[0], false},
-    {kIceUfrag[1], kIcePwd[1], false},
-    {kIceUfrag[2], kIcePwd[2], false},
-    {kIceUfrag[3], kIcePwd[3], false}};
-
-const uint64_t kLowTiebreaker = 11111;
-const uint64_t kHighTiebreaker = 22222;
-
-enum { MSG_ADD_CANDIDATES, MSG_REMOVE_CANDIDATES };
-
-cricket::IceConfig CreateIceConfig(
-    int receiving_timeout,
-    cricket::ContinualGatheringPolicy continual_gathering_policy,
-    int backup_ping_interval = -1) {
-  cricket::IceConfig config;
-  config.receiving_timeout = receiving_timeout;
-  config.continual_gathering_policy = continual_gathering_policy;
-  config.backup_connection_ping_interval = backup_ping_interval;
-  return config;
-}
-
-cricket::Candidate CreateUdpCandidate(const std::string& type,
-                                      const std::string& ip,
-                                      int port,
-                                      int priority,
-                                      const std::string& ufrag = "") {
-  cricket::Candidate c;
-  c.set_address(rtc::SocketAddress(ip, port));
-  c.set_component(cricket::ICE_CANDIDATE_COMPONENT_DEFAULT);
-  c.set_protocol(cricket::UDP_PROTOCOL_NAME);
-  c.set_priority(priority);
-  c.set_username(ufrag);
-  c.set_type(type);
-  return c;
-}
-
-cricket::BasicPortAllocator* CreateBasicPortAllocator(
-    rtc::NetworkManager* network_manager,
-    const cricket::ServerAddresses& stun_servers,
-    const rtc::SocketAddress& turn_server_udp,
-    const rtc::SocketAddress& turn_server_tcp) {
-  cricket::RelayServerConfig turn_server(cricket::RELAY_TURN);
-  turn_server.credentials = kRelayCredentials;
-  if (!turn_server_udp.IsNil()) {
-    turn_server.ports.push_back(
-        cricket::ProtocolAddress(turn_server_udp, cricket::PROTO_UDP));
-  }
-  if (!turn_server_tcp.IsNil()) {
-    turn_server.ports.push_back(
-        cricket::ProtocolAddress(turn_server_tcp, cricket::PROTO_TCP));
-  }
-  std::vector<cricket::RelayServerConfig> turn_servers(1, turn_server);
-
-  cricket::BasicPortAllocator* allocator =
-      new cricket::BasicPortAllocator(network_manager);
-  allocator->SetConfiguration(stun_servers, turn_servers, 0, false);
-  return allocator;
-}
-}  // namespace
-
-namespace cricket {
-
-// This test simulates 2 P2P endpoints that want to establish connectivity
-// with each other over various network topologies and conditions, which can be
-// specified in each individial test.
-// A virtual network (via VirtualSocketServer) along with virtual firewalls and
-// NATs (via Firewall/NATSocketServer) are used to simulate the various network
-// conditions. We can configure the IP addresses of the endpoints,
-// block various types of connectivity, or add arbitrary levels of NAT.
-// We also run a STUN server and a relay server on the virtual network to allow
-// our typical P2P mechanisms to do their thing.
-// For each case, we expect the P2P stack to eventually settle on a specific
-// form of connectivity to the other side. The test checks that the P2P
-// negotiation successfully establishes connectivity within a certain time,
-// and that the result is what we expect.
-// Note that this class is a base class for use by other tests, who will provide
-// specialized test behavior.
-class P2PTransportChannelTestBase : public testing::Test,
-                                    public rtc::MessageHandler,
-                                    public sigslot::has_slots<> {
- public:
-  P2PTransportChannelTestBase()
-      : vss_(new rtc::VirtualSocketServer()),
-        nss_(new rtc::NATSocketServer(vss_.get())),
-        ss_(new rtc::FirewallSocketServer(nss_.get())),
-        main_(ss_.get()),
-        stun_server_(TestStunServer::Create(&main_, kStunAddr)),
-        turn_server_(&main_, kTurnUdpIntAddr, kTurnUdpExtAddr),
-        socks_server1_(ss_.get(),
-                       kSocksProxyAddrs[0],
-                       ss_.get(),
-                       kSocksProxyAddrs[0]),
-        socks_server2_(ss_.get(),
-                       kSocksProxyAddrs[1],
-                       ss_.get(),
-                       kSocksProxyAddrs[1]),
-        force_relay_(false) {
-    ep1_.role_ = ICEROLE_CONTROLLING;
-    ep2_.role_ = ICEROLE_CONTROLLED;
-
-    ServerAddresses stun_servers;
-    stun_servers.insert(kStunAddr);
-    ep1_.allocator_.reset(
-        CreateBasicPortAllocator(&ep1_.network_manager_, stun_servers,
-                                 kTurnUdpIntAddr, rtc::SocketAddress()));
-    ep1_.metrics_observer_ =
-        new rtc::RefCountedObject<webrtc::FakeMetricsObserver>();
-    ep1_.allocator_->SetMetricsObserver(ep1_.metrics_observer_);
-    ep2_.allocator_.reset(
-        CreateBasicPortAllocator(&ep2_.network_manager_, stun_servers,
-                                 kTurnUdpIntAddr, rtc::SocketAddress()));
-    ep2_.metrics_observer_ =
-        new rtc::RefCountedObject<webrtc::FakeMetricsObserver>();
-    ep2_.allocator_->SetMetricsObserver(ep2_.metrics_observer_);
-  }
-
- protected:
-  enum Config {
-    OPEN,                           // Open to the Internet
-    NAT_FULL_CONE,                  // NAT, no filtering
-    NAT_ADDR_RESTRICTED,            // NAT, must send to an addr to recv
-    NAT_PORT_RESTRICTED,            // NAT, must send to an addr+port to recv
-    NAT_SYMMETRIC,                  // NAT, endpoint-dependent bindings
-    NAT_DOUBLE_CONE,                // Double NAT, both cone
-    NAT_SYMMETRIC_THEN_CONE,        // Double NAT, symmetric outer, cone inner
-    BLOCK_UDP,                      // Firewall, UDP in/out blocked
-    BLOCK_UDP_AND_INCOMING_TCP,     // Firewall, UDP in/out and TCP in blocked
-    BLOCK_ALL_BUT_OUTGOING_HTTP,    // Firewall, only TCP out on 80/443
-    PROXY_HTTPS,                    // All traffic through HTTPS proxy
-    PROXY_SOCKS,                    // All traffic through SOCKS proxy
-    NUM_CONFIGS
-  };
-
-  struct Result {
-    Result(const std::string& controlling_type,
-           const std::string& controlling_protocol,
-           const std::string& controlled_type,
-           const std::string& controlled_protocol,
-           int wait)
-        : controlling_type(controlling_type),
-          controlling_protocol(controlling_protocol),
-          controlled_type(controlled_type),
-          controlled_protocol(controlled_protocol),
-          connect_wait(wait) {}
-
-    // The expected candidate type and protocol of the controlling ICE agent.
-    std::string controlling_type;
-    std::string controlling_protocol;
-    // The expected candidate type and protocol of the controlled ICE agent.
-    std::string controlled_type;
-    std::string controlled_protocol;
-    // How long to wait before the correct candidate pair is selected.
-    int connect_wait;
-  };
-
-  struct ChannelData {
-    bool CheckData(const char* data, int len) {
-      bool ret = false;
-      if (!ch_packets_.empty()) {
-        std::string packet =  ch_packets_.front();
-        ret = (packet == std::string(data, len));
-        ch_packets_.pop_front();
-      }
-      return ret;
-    }
-
-    std::string name_;  // TODO - Currently not used.
-    std::list<std::string> ch_packets_;
-    std::unique_ptr<P2PTransportChannel> ch_;
-  };
-
-  struct CandidatesData : public rtc::MessageData {
-    CandidatesData(IceTransportInternal* ch, const Candidate& c)
-        : channel(ch), candidates(1, c) {}
-    CandidatesData(IceTransportInternal* ch, const std::vector<Candidate>& cc)
-        : channel(ch), candidates(cc) {}
-    IceTransportInternal* channel;
-    Candidates candidates;
-  };
-
-  struct Endpoint {
-    Endpoint()
-        : role_(ICEROLE_UNKNOWN),
-          tiebreaker_(0),
-          role_conflict_(false),
-          save_candidates_(false) {}
-    bool HasTransport(const rtc::PacketTransportInternal* transport) {
-      return (transport == cd1_.ch_.get() || transport == cd2_.ch_.get());
-    }
-    ChannelData* GetChannelData(rtc::PacketTransportInternal* transport) {
-      if (!HasTransport(transport))
-        return NULL;
-      if (cd1_.ch_.get() == transport)
-        return &cd1_;
-      else
-        return &cd2_;
-    }
-
-    void SetIceRole(IceRole role) { role_ = role; }
-    IceRole ice_role() { return role_; }
-    void SetIceTiebreaker(uint64_t tiebreaker) { tiebreaker_ = tiebreaker; }
-    uint64_t GetIceTiebreaker() { return tiebreaker_; }
-    void OnRoleConflict(bool role_conflict) { role_conflict_ = role_conflict; }
-    bool role_conflict() { return role_conflict_; }
-    void SetAllocationStepDelay(uint32_t delay) {
-      allocator_->set_step_delay(delay);
-    }
-    void SetAllowTcpListen(bool allow_tcp_listen) {
-      allocator_->set_allow_tcp_listen(allow_tcp_listen);
-    }
-
-    rtc::FakeNetworkManager network_manager_;
-    // |metrics_observer_| should outlive |allocator_| as the former may be
-    // used by the latter.
-    rtc::scoped_refptr<webrtc::FakeMetricsObserver> metrics_observer_;
-    std::unique_ptr<BasicPortAllocator> allocator_;
-    ChannelData cd1_;
-    ChannelData cd2_;
-    IceRole role_;
-    uint64_t tiebreaker_;
-    bool role_conflict_;
-    bool save_candidates_;
-    std::vector<std::unique_ptr<CandidatesData>> saved_candidates_;
-    bool ready_to_send_ = false;
-  };
-
-  ChannelData* GetChannelData(rtc::PacketTransportInternal* transport) {
-    if (ep1_.HasTransport(transport))
-      return ep1_.GetChannelData(transport);
-    else
-      return ep2_.GetChannelData(transport);
-  }
-
-  IceParameters IceParamsWithRenomination(const IceParameters& ice,
-                                          bool renomination) {
-    IceParameters new_ice = ice;
-    new_ice.renomination = renomination;
-    return new_ice;
-  }
-
-  void CreateChannels(const IceConfig& ep1_config,
-                      const IceConfig& ep2_config,
-                      bool renomination = false) {
-    IceParameters ice_ep1_cd1_ch =
-        IceParamsWithRenomination(kIceParams[0], renomination);
-    IceParameters ice_ep2_cd1_ch =
-        IceParamsWithRenomination(kIceParams[1], renomination);
-    ep1_.cd1_.ch_.reset(CreateChannel(0, ICE_CANDIDATE_COMPONENT_DEFAULT,
-                                      ice_ep1_cd1_ch, ice_ep2_cd1_ch));
-    ep2_.cd1_.ch_.reset(CreateChannel(1, ICE_CANDIDATE_COMPONENT_DEFAULT,
-                                      ice_ep2_cd1_ch, ice_ep1_cd1_ch));
-    ep1_.cd1_.ch_->SetMetricsObserver(ep1_.metrics_observer_);
-    ep2_.cd1_.ch_->SetMetricsObserver(ep2_.metrics_observer_);
-    ep1_.cd1_.ch_->SetIceConfig(ep1_config);
-    ep2_.cd1_.ch_->SetIceConfig(ep2_config);
-    ep1_.cd1_.ch_->MaybeStartGathering();
-    ep2_.cd1_.ch_->MaybeStartGathering();
-  }
-
-  void CreateChannels() {
-    IceConfig default_config;
-    CreateChannels(default_config, default_config, false);
-  }
-
-  P2PTransportChannel* CreateChannel(int endpoint,
-                                     int component,
-                                     const IceParameters& local_ice,
-                                     const IceParameters& remote_ice) {
-    P2PTransportChannel* channel = new P2PTransportChannel(
-        "test content name", component, GetAllocator(endpoint));
-    channel->SignalReadyToSend.connect(
-        this, &P2PTransportChannelTestBase::OnReadyToSend);
-    channel->SignalCandidateGathered.connect(
-        this, &P2PTransportChannelTestBase::OnCandidateGathered);
-    channel->SignalCandidatesRemoved.connect(
-        this, &P2PTransportChannelTestBase::OnCandidatesRemoved);
-    channel->SignalReadPacket.connect(
-        this, &P2PTransportChannelTestBase::OnReadPacket);
-    channel->SignalRoleConflict.connect(
-        this, &P2PTransportChannelTestBase::OnRoleConflict);
-    channel->SignalSelectedCandidatePairChanged.connect(
-        this, &P2PTransportChannelTestBase::OnSelectedCandidatePairChanged);
-    channel->SetIceParameters(local_ice);
-    if (remote_ice_parameter_source_ == FROM_SETICEPARAMETERS) {
-      channel->SetRemoteIceParameters(remote_ice);
-    }
-    channel->SetIceRole(GetEndpoint(endpoint)->ice_role());
-    channel->SetIceTiebreaker(GetEndpoint(endpoint)->GetIceTiebreaker());
-    return channel;
-  }
-  void DestroyChannels() {
-    ep1_.cd1_.ch_.reset();
-    ep2_.cd1_.ch_.reset();
-    ep1_.cd2_.ch_.reset();
-    ep2_.cd2_.ch_.reset();
-  }
-  P2PTransportChannel* ep1_ch1() { return ep1_.cd1_.ch_.get(); }
-  P2PTransportChannel* ep1_ch2() { return ep1_.cd2_.ch_.get(); }
-  P2PTransportChannel* ep2_ch1() { return ep2_.cd1_.ch_.get(); }
-  P2PTransportChannel* ep2_ch2() { return ep2_.cd2_.ch_.get(); }
-
-  TestTurnServer* test_turn_server() { return &turn_server_; }
-  rtc::VirtualSocketServer* virtual_socket_server() { return vss_.get(); }
-
-  // Common results.
-  static const Result kLocalUdpToLocalUdp;
-  static const Result kLocalUdpToStunUdp;
-  static const Result kLocalUdpToPrflxUdp;
-  static const Result kPrflxUdpToLocalUdp;
-  static const Result kStunUdpToLocalUdp;
-  static const Result kStunUdpToStunUdp;
-  static const Result kStunUdpToPrflxUdp;
-  static const Result kPrflxUdpToStunUdp;
-  static const Result kLocalUdpToRelayUdp;
-  static const Result kPrflxUdpToRelayUdp;
-  static const Result kRelayUdpToPrflxUdp;
-  static const Result kLocalTcpToLocalTcp;
-  static const Result kLocalTcpToPrflxTcp;
-  static const Result kPrflxTcpToLocalTcp;
-
-  rtc::NATSocketServer* nat() { return nss_.get(); }
-  rtc::FirewallSocketServer* fw() { return ss_.get(); }
-
-  Endpoint* GetEndpoint(int endpoint) {
-    if (endpoint == 0) {
-      return &ep1_;
-    } else if (endpoint == 1) {
-      return &ep2_;
-    } else {
-      return NULL;
-    }
-  }
-  BasicPortAllocator* GetAllocator(int endpoint) {
-    return GetEndpoint(endpoint)->allocator_.get();
-  }
-  webrtc::FakeMetricsObserver* GetMetricsObserver(int endpoint) {
-    return GetEndpoint(endpoint)->metrics_observer_;
-  }
-  void AddAddress(int endpoint, const SocketAddress& addr) {
-    GetEndpoint(endpoint)->network_manager_.AddInterface(addr);
-  }
-  void AddAddress(int endpoint,
-                  const SocketAddress& addr,
-                  const std::string& ifname,
-                  rtc::AdapterType adapter_type) {
-    GetEndpoint(endpoint)->network_manager_.AddInterface(addr, ifname,
-                                                         adapter_type);
-  }
-  void RemoveAddress(int endpoint, const SocketAddress& addr) {
-    GetEndpoint(endpoint)->network_manager_.RemoveInterface(addr);
-    fw()->AddRule(false, rtc::FP_ANY, rtc::FD_ANY, addr);
-  }
-  void SetProxy(int endpoint, rtc::ProxyType type) {
-    rtc::ProxyInfo info;
-    info.type = type;
-    info.address = (type == rtc::PROXY_HTTPS) ?
-        kHttpsProxyAddrs[endpoint] : kSocksProxyAddrs[endpoint];
-    GetAllocator(endpoint)->set_proxy("unittest/1.0", info);
-  }
-  void SetAllocatorFlags(int endpoint, int flags) {
-    GetAllocator(endpoint)->set_flags(flags);
-  }
-  void SetIceRole(int endpoint, IceRole role) {
-    GetEndpoint(endpoint)->SetIceRole(role);
-  }
-  void SetIceTiebreaker(int endpoint, uint64_t tiebreaker) {
-    GetEndpoint(endpoint)->SetIceTiebreaker(tiebreaker);
-  }
-  bool GetRoleConflict(int endpoint) {
-    return GetEndpoint(endpoint)->role_conflict();
-  }
-  void SetAllocationStepDelay(int endpoint, uint32_t delay) {
-    return GetEndpoint(endpoint)->SetAllocationStepDelay(delay);
-  }
-  void SetAllowTcpListen(int endpoint, bool allow_tcp_listen) {
-    return GetEndpoint(endpoint)->SetAllowTcpListen(allow_tcp_listen);
-  }
-
-  // Return true if the approprite parts of the expected Result, based
-  // on the local and remote candidate of ep1_ch1, match.  This can be
-  // used in an EXPECT_TRUE_WAIT.
-  bool CheckCandidate1(const Result& expected) {
-    const std::string& local_type = LocalCandidate(ep1_ch1())->type();
-    const std::string& local_protocol = LocalCandidate(ep1_ch1())->protocol();
-    const std::string& remote_type = RemoteCandidate(ep1_ch1())->type();
-    const std::string& remote_protocol = RemoteCandidate(ep1_ch1())->protocol();
-    return (local_protocol == expected.controlling_protocol &&
-            remote_protocol == expected.controlled_protocol &&
-            local_type == expected.controlling_type &&
-            remote_type == expected.controlled_type);
-  }
-
-  // EXPECT_EQ on the approprite parts of the expected Result, based
-  // on the local and remote candidate of ep1_ch1.  This is like
-  // CheckCandidate1, except that it will provide more detail about
-  // what didn't match.
-  void ExpectCandidate1(const Result& expected) {
-    if (CheckCandidate1(expected)) {
-      return;
-    }
-
-    const std::string& local_type = LocalCandidate(ep1_ch1())->type();
-    const std::string& local_protocol = LocalCandidate(ep1_ch1())->protocol();
-    const std::string& remote_type = RemoteCandidate(ep1_ch1())->type();
-    const std::string& remote_protocol = RemoteCandidate(ep1_ch1())->protocol();
-    EXPECT_EQ(expected.controlling_type, local_type);
-    EXPECT_EQ(expected.controlled_type, remote_type);
-    EXPECT_EQ(expected.controlling_protocol, local_protocol);
-    EXPECT_EQ(expected.controlled_protocol, remote_protocol);
-  }
-
-  // Return true if the approprite parts of the expected Result, based
-  // on the local and remote candidate of ep2_ch1, match.  This can be
-  // used in an EXPECT_TRUE_WAIT.
-  bool CheckCandidate2(const Result& expected) {
-    const std::string& local_type = LocalCandidate(ep2_ch1())->type();
-    const std::string& local_protocol = LocalCandidate(ep2_ch1())->protocol();
-    const std::string& remote_type = RemoteCandidate(ep2_ch1())->type();
-    const std::string& remote_protocol = RemoteCandidate(ep2_ch1())->protocol();
-    return (local_protocol == expected.controlled_protocol &&
-            remote_protocol == expected.controlling_protocol &&
-            local_type == expected.controlled_type &&
-            remote_type == expected.controlling_type);
-  }
-
-  // EXPECT_EQ on the approprite parts of the expected Result, based
-  // on the local and remote candidate of ep2_ch1.  This is like
-  // CheckCandidate2, except that it will provide more detail about
-  // what didn't match.
-  void ExpectCandidate2(const Result& expected) {
-    if (CheckCandidate2(expected)) {
-      return;
-    }
-
-    const std::string& local_type = LocalCandidate(ep2_ch1())->type();
-    const std::string& local_protocol = LocalCandidate(ep2_ch1())->protocol();
-    const std::string& remote_type = RemoteCandidate(ep2_ch1())->type();
-    const std::string& remote_protocol = RemoteCandidate(ep2_ch1())->protocol();
-    EXPECT_EQ(expected.controlled_type, local_type);
-    EXPECT_EQ(expected.controlling_type, remote_type);
-    EXPECT_EQ(expected.controlled_protocol, local_protocol);
-    EXPECT_EQ(expected.controlling_protocol, remote_protocol);
-  }
-
-  void Test(const Result& expected) {
-    rtc::ScopedFakeClock clock;
-    int64_t connect_start = rtc::TimeMillis();
-    int64_t connect_time;
-
-    // Create the channels and wait for them to connect.
-    CreateChannels();
-    EXPECT_TRUE_SIMULATED_WAIT(
-        ep1_ch1() != NULL && ep2_ch1() != NULL && ep1_ch1()->receiving() &&
-            ep1_ch1()->writable() && ep2_ch1()->receiving() &&
-            ep2_ch1()->writable(),
-        expected.connect_wait + kShortTimeout, clock);
-    connect_time = rtc::TimeMillis() - connect_start;
-    if (connect_time < expected.connect_wait) {
-      LOG(LS_INFO) << "Connect time: " << connect_time << " ms";
-    } else {
-      LOG(LS_INFO) << "Connect time: " << "TIMEOUT ("
-                   << expected.connect_wait << " ms)";
-    }
-
-    // Allow a few turns of the crank for the selected connections to emerge.
-    // This may take up to 2 seconds.
-    if (ep1_ch1()->selected_connection() && ep2_ch1()->selected_connection()) {
-      int64_t converge_start = rtc::TimeMillis();
-      int64_t converge_time;
-      // Verifying local and remote channel selected connection information.
-      // This is done only for the RFC 5245 as controlled agent will use
-      // USE-CANDIDATE from controlling (ep1) agent. We can easily predict from
-      // EP1 result matrix.
-      EXPECT_TRUE_SIMULATED_WAIT(
-          CheckCandidate1(expected) && CheckCandidate2(expected),
-          kMediumTimeout, clock);
-      // Also do EXPECT_EQ on each part so that failures are more verbose.
-      ExpectCandidate1(expected);
-      ExpectCandidate2(expected);
-
-      converge_time = rtc::TimeMillis() - converge_start;
-      int64_t converge_wait = 2000;
-      if (converge_time < converge_wait) {
-        LOG(LS_INFO) << "Converge time: " << converge_time << " ms";
-      } else {
-        LOG(LS_INFO) << "Converge time: " << "TIMEOUT ("
-                     << converge_wait << " ms)";
-      }
-    }
-    // Try sending some data to other end.
-    TestSendRecv(clock);
-
-    // Destroy the channels, and wait for them to be fully cleaned up.
-    DestroyChannels();
-  }
-
-  void TestSendRecv(rtc::FakeClock& clock) {
-    for (int i = 0; i < 10; ++i) {
-      const char* data = "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
-      int len = static_cast<int>(strlen(data));
-      // local_channel1 <==> remote_channel1
-      EXPECT_EQ_SIMULATED_WAIT(len, SendData(ep1_ch1(), data, len),
-                               kMediumTimeout, clock);
-      EXPECT_TRUE_SIMULATED_WAIT(CheckDataOnChannel(ep2_ch1(), data, len),
-                                 kMediumTimeout, clock);
-      EXPECT_EQ_SIMULATED_WAIT(len, SendData(ep2_ch1(), data, len),
-                               kMediumTimeout, clock);
-      EXPECT_TRUE_SIMULATED_WAIT(CheckDataOnChannel(ep1_ch1(), data, len),
-                                 kMediumTimeout, clock);
-    }
-  }
-
-  // This test waits for the transport to become receiving and writable on both
-  // end points. Once they are, the end points set new local ice parameters and
-  // restart the ice gathering. Finally it waits for the transport to select a
-  // new connection using the newly generated ice candidates.
-  // Before calling this function the end points must be configured.
-  void TestHandleIceUfragPasswordChanged() {
-    rtc::ScopedFakeClock clock;
-    ep1_ch1()->SetRemoteIceParameters(kIceParams[1]);
-    ep2_ch1()->SetRemoteIceParameters(kIceParams[0]);
-    EXPECT_TRUE_SIMULATED_WAIT(
-        ep1_ch1()->receiving() && ep1_ch1()->writable() &&
-            ep2_ch1()->receiving() && ep2_ch1()->writable(),
-        kMediumTimeout, clock);
-
-    const Candidate* old_local_candidate1 = LocalCandidate(ep1_ch1());
-    const Candidate* old_local_candidate2 = LocalCandidate(ep2_ch1());
-    const Candidate* old_remote_candidate1 = RemoteCandidate(ep1_ch1());
-    const Candidate* old_remote_candidate2 = RemoteCandidate(ep2_ch1());
-
-    ep1_ch1()->SetIceParameters(kIceParams[2]);
-    ep1_ch1()->SetRemoteIceParameters(kIceParams[3]);
-    ep1_ch1()->MaybeStartGathering();
-    ep2_ch1()->SetIceParameters(kIceParams[3]);
-
-    ep2_ch1()->SetRemoteIceParameters(kIceParams[2]);
-    ep2_ch1()->MaybeStartGathering();
-
-    EXPECT_TRUE_SIMULATED_WAIT(LocalCandidate(ep1_ch1())->generation() !=
-                                   old_local_candidate1->generation(),
-                               kMediumTimeout, clock);
-    EXPECT_TRUE_SIMULATED_WAIT(LocalCandidate(ep2_ch1())->generation() !=
-                                   old_local_candidate2->generation(),
-                               kMediumTimeout, clock);
-    EXPECT_TRUE_SIMULATED_WAIT(RemoteCandidate(ep1_ch1())->generation() !=
-                                   old_remote_candidate1->generation(),
-                               kMediumTimeout, clock);
-    EXPECT_TRUE_SIMULATED_WAIT(RemoteCandidate(ep2_ch1())->generation() !=
-                                   old_remote_candidate2->generation(),
-                               kMediumTimeout, clock);
-    EXPECT_EQ(1u, RemoteCandidate(ep2_ch1())->generation());
-    EXPECT_EQ(1u, RemoteCandidate(ep1_ch1())->generation());
-  }
-
-  void TestSignalRoleConflict() {
-    rtc::ScopedFakeClock clock;
-    // Default EP1 is in controlling state.
-    SetIceTiebreaker(0, kLowTiebreaker);
-
-    SetIceRole(1, ICEROLE_CONTROLLING);
-    SetIceTiebreaker(1, kHighTiebreaker);
-
-    // Creating channels with both channels role set to CONTROLLING.
-    CreateChannels();
-    // Since both the channels initiated with controlling state and channel2
-    // has higher tiebreaker value, channel1 should receive SignalRoleConflict.
-    EXPECT_TRUE_SIMULATED_WAIT(GetRoleConflict(0), kShortTimeout, clock);
-    EXPECT_FALSE(GetRoleConflict(1));
-
-    EXPECT_TRUE_SIMULATED_WAIT(
-        ep1_ch1()->receiving() && ep1_ch1()->writable() &&
-            ep2_ch1()->receiving() && ep2_ch1()->writable(),
-        kShortTimeout, clock);
-
-    EXPECT_TRUE(ep1_ch1()->selected_connection() &&
-                ep2_ch1()->selected_connection());
-
-    TestSendRecv(clock);
-  }
-
-  void OnReadyToSend(rtc::PacketTransportInternal* transport) {
-    GetEndpoint(transport)->ready_to_send_ = true;
-  }
-
-  // We pass the candidates directly to the other side.
-  void OnCandidateGathered(IceTransportInternal* ch, const Candidate& c) {
-    if (force_relay_ && c.type() != RELAY_PORT_TYPE)
-      return;
-
-    if (GetEndpoint(ch)->save_candidates_) {
-      GetEndpoint(ch)->saved_candidates_.push_back(
-          std::unique_ptr<CandidatesData>(new CandidatesData(ch, c)));
-    } else {
-      main_.Post(RTC_FROM_HERE, this, MSG_ADD_CANDIDATES,
-                 new CandidatesData(ch, c));
-    }
-  }
-  void OnSelectedCandidatePairChanged(
-      IceTransportInternal* transport_channel,
-      CandidatePairInterface* selected_candidate_pair,
-      int last_sent_packet_id,
-      bool ready_to_send) {
-    // Do not count if it switches to nullptr. This may happen if all
-    // connections timed out.
-    if (selected_candidate_pair != nullptr) {
-      ++selected_candidate_pair_switches_;
-    }
-  }
-
-  int reset_selected_candidate_pair_switches() {
-    int switches = selected_candidate_pair_switches_;
-    selected_candidate_pair_switches_ = 0;
-    return switches;
-  }
-
-  void PauseCandidates(int endpoint) {
-    GetEndpoint(endpoint)->save_candidates_ = true;
-  }
-
-  void OnCandidatesRemoved(IceTransportInternal* ch,
-                           const std::vector<Candidate>& candidates) {
-    // Candidate removals are not paused.
-    CandidatesData* candidates_data = new CandidatesData(ch, candidates);
-    main_.Post(RTC_FROM_HERE, this, MSG_REMOVE_CANDIDATES, candidates_data);
-  }
-
-  // Tcp candidate verification has to be done when they are generated.
-  void VerifySavedTcpCandidates(int endpoint, const std::string& tcptype) {
-    for (auto& data : GetEndpoint(endpoint)->saved_candidates_) {
-      for (auto& candidate : data->candidates) {
-        EXPECT_EQ(candidate.protocol(), TCP_PROTOCOL_NAME);
-        EXPECT_EQ(candidate.tcptype(), tcptype);
-        if (candidate.tcptype() == TCPTYPE_ACTIVE_STR) {
-          EXPECT_EQ(candidate.address().port(), DISCARD_PORT);
-        } else if (candidate.tcptype() == TCPTYPE_PASSIVE_STR) {
-          EXPECT_NE(candidate.address().port(), DISCARD_PORT);
-        } else {
-          FAIL() << "Unknown tcptype: " << candidate.tcptype();
-        }
-      }
-    }
-  }
-
-  void ResumeCandidates(int endpoint) {
-    Endpoint* ed = GetEndpoint(endpoint);
-    for (auto& candidate : ed->saved_candidates_) {
-      main_.Post(RTC_FROM_HERE, this, MSG_ADD_CANDIDATES, candidate.release());
-    }
-    ed->saved_candidates_.clear();
-    ed->save_candidates_ = false;
-  }
-
-  void OnMessage(rtc::Message* msg) {
-    switch (msg->message_id) {
-      case MSG_ADD_CANDIDATES: {
-        std::unique_ptr<CandidatesData> data(
-            static_cast<CandidatesData*>(msg->pdata));
-        P2PTransportChannel* rch = GetRemoteChannel(data->channel);
-        if (!rch) {
-          return;
-        }
-        for (auto& c : data->candidates) {
-          if (remote_ice_parameter_source_ != FROM_CANDIDATE) {
-            c.set_username("");
-            c.set_password("");
-          }
-          LOG(LS_INFO) << "Candidate(" << data->channel->component() << "->"
-                       << rch->component() << "): " << c.ToString();
-          rch->AddRemoteCandidate(c);
-        }
-        break;
-      }
-      case MSG_REMOVE_CANDIDATES: {
-        std::unique_ptr<CandidatesData> data(
-            static_cast<CandidatesData*>(msg->pdata));
-        P2PTransportChannel* rch = GetRemoteChannel(data->channel);
-        if (!rch) {
-          return;
-        }
-        for (Candidate& c : data->candidates) {
-          LOG(LS_INFO) << "Removed remote candidate " << c.ToString();
-          rch->RemoveRemoteCandidate(c);
-        }
-        break;
-      }
-    }
-  }
-
-  void OnReadPacket(rtc::PacketTransportInternal* transport,
-                    const char* data,
-                    size_t len,
-                    const rtc::PacketTime& packet_time,
-                    int flags) {
-    std::list<std::string>& packets = GetPacketList(transport);
-    packets.push_front(std::string(data, len));
-  }
-
-  void OnRoleConflict(IceTransportInternal* channel) {
-    GetEndpoint(channel)->OnRoleConflict(true);
-    IceRole new_role = GetEndpoint(channel)->ice_role() == ICEROLE_CONTROLLING
-                           ? ICEROLE_CONTROLLED
-                           : ICEROLE_CONTROLLING;
-    channel->SetIceRole(new_role);
-  }
-
-  int SendData(IceTransportInternal* channel, const char* data, size_t len) {
-    rtc::PacketOptions options;
-    return channel->SendPacket(data, len, options, 0);
-  }
-  bool CheckDataOnChannel(IceTransportInternal* channel,
-                          const char* data,
-                          int len) {
-    return GetChannelData(channel)->CheckData(data, len);
-  }
-  static const Candidate* LocalCandidate(P2PTransportChannel* ch) {
-    return (ch && ch->selected_connection())
-               ? &ch->selected_connection()->local_candidate()
-               : NULL;
-  }
-  static const Candidate* RemoteCandidate(P2PTransportChannel* ch) {
-    return (ch && ch->selected_connection())
-               ? &ch->selected_connection()->remote_candidate()
-               : NULL;
-  }
-  Endpoint* GetEndpoint(rtc::PacketTransportInternal* transport) {
-    if (ep1_.HasTransport(transport)) {
-      return &ep1_;
-    } else if (ep2_.HasTransport(transport)) {
-      return &ep2_;
-    } else {
-      return NULL;
-    }
-  }
-  P2PTransportChannel* GetRemoteChannel(IceTransportInternal* ch) {
-    if (ch == ep1_ch1())
-      return ep2_ch1();
-    else if (ch == ep1_ch2())
-      return ep2_ch2();
-    else if (ch == ep2_ch1())
-      return ep1_ch1();
-    else if (ch == ep2_ch2())
-      return ep1_ch2();
-    else
-      return NULL;
-  }
-  std::list<std::string>& GetPacketList(
-      rtc::PacketTransportInternal* transport) {
-    return GetChannelData(transport)->ch_packets_;
-  }
-
-  enum RemoteIceParameterSource { FROM_CANDIDATE, FROM_SETICEPARAMETERS };
-
-  // How does the test pass ICE parameters to the P2PTransportChannel?
-  // On the candidate itself, or through SetRemoteIceParameters?
-  // Goes through the candidate itself by default.
-  void set_remote_ice_parameter_source(RemoteIceParameterSource source) {
-    remote_ice_parameter_source_ = source;
-  }
-
-  void set_force_relay(bool relay) {
-    force_relay_ = relay;
-  }
-
-  void ConnectSignalNominated(Connection* conn) {
-    conn->SignalNominated.connect(this,
-                                  &P2PTransportChannelTestBase::OnNominated);
-  }
-
-  void OnNominated(Connection* conn) { nominated_ = true; }
-  bool nominated() { return nominated_; }
-
- private:
-  std::unique_ptr<rtc::VirtualSocketServer> vss_;
-  std::unique_ptr<rtc::NATSocketServer> nss_;
-  std::unique_ptr<rtc::FirewallSocketServer> ss_;
-  rtc::AutoSocketServerThread main_;
-  std::unique_ptr<TestStunServer> stun_server_;
-  TestTurnServer turn_server_;
-  rtc::SocksProxyServer socks_server1_;
-  rtc::SocksProxyServer socks_server2_;
-  Endpoint ep1_;
-  Endpoint ep2_;
-  RemoteIceParameterSource remote_ice_parameter_source_ = FROM_CANDIDATE;
-  bool force_relay_;
-  int selected_candidate_pair_switches_ = 0;
-
-  bool nominated_ = false;
-};
-
-// The tests have only a few outcomes, which we predefine.
-const P2PTransportChannelTestBase::Result
-    P2PTransportChannelTestBase::kLocalUdpToLocalUdp("local",
-                                                     "udp",
-                                                     "local",
-                                                     "udp",
-                                                     1000);
-const P2PTransportChannelTestBase::Result
-    P2PTransportChannelTestBase::kLocalUdpToStunUdp("local",
-                                                    "udp",
-                                                    "stun",
-                                                    "udp",
-                                                    1000);
-const P2PTransportChannelTestBase::Result
-    P2PTransportChannelTestBase::kLocalUdpToPrflxUdp("local",
-                                                     "udp",
-                                                     "prflx",
-                                                     "udp",
-                                                     1000);
-const P2PTransportChannelTestBase::Result
-    P2PTransportChannelTestBase::kPrflxUdpToLocalUdp("prflx",
-                                                     "udp",
-                                                     "local",
-                                                     "udp",
-                                                     1000);
-const P2PTransportChannelTestBase::Result
-    P2PTransportChannelTestBase::kStunUdpToLocalUdp("stun",
-                                                    "udp",
-                                                    "local",
-                                                    "udp",
-                                                    1000);
-const P2PTransportChannelTestBase::Result
-    P2PTransportChannelTestBase::kStunUdpToStunUdp("stun",
-                                                   "udp",
-                                                   "stun",
-                                                   "udp",
-                                                   1000);
-const P2PTransportChannelTestBase::Result
-    P2PTransportChannelTestBase::kStunUdpToPrflxUdp("stun",
-                                                    "udp",
-                                                    "prflx",
-                                                    "udp",
-                                                    1000);
-const P2PTransportChannelTestBase::Result
-    P2PTransportChannelTestBase::kPrflxUdpToStunUdp("prflx",
-                                                    "udp",
-                                                    "stun",
-                                                    "udp",
-                                                    1000);
-const P2PTransportChannelTestBase::Result
-    P2PTransportChannelTestBase::kLocalUdpToRelayUdp("local",
-                                                     "udp",
-                                                     "relay",
-                                                     "udp",
-                                                     2000);
-const P2PTransportChannelTestBase::Result
-    P2PTransportChannelTestBase::kPrflxUdpToRelayUdp("prflx",
-                                                     "udp",
-                                                     "relay",
-                                                     "udp",
-                                                     2000);
-const P2PTransportChannelTestBase::Result
-    P2PTransportChannelTestBase::kRelayUdpToPrflxUdp("relay",
-                                                     "udp",
-                                                     "prflx",
-                                                     "udp",
-                                                     2000);
-const P2PTransportChannelTestBase::Result
-    P2PTransportChannelTestBase::kLocalTcpToLocalTcp("local",
-                                                     "tcp",
-                                                     "local",
-                                                     "tcp",
-                                                     3000);
-const P2PTransportChannelTestBase::Result
-    P2PTransportChannelTestBase::kLocalTcpToPrflxTcp("local",
-                                                     "tcp",
-                                                     "prflx",
-                                                     "tcp",
-                                                     3000);
-const P2PTransportChannelTestBase::Result
-    P2PTransportChannelTestBase::kPrflxTcpToLocalTcp("prflx",
-                                                     "tcp",
-                                                     "local",
-                                                     "tcp",
-                                                     3000);
-
-// Test the matrix of all the connectivity types we expect to see in the wild.
-// Just test every combination of the configs in the Config enum.
-class P2PTransportChannelTest : public P2PTransportChannelTestBase {
- protected:
-  static const Result* kMatrix[NUM_CONFIGS][NUM_CONFIGS];
-  void ConfigureEndpoints(Config config1,
-                          Config config2,
-                          int allocator_flags1,
-                          int allocator_flags2) {
-    ConfigureEndpoint(0, config1);
-    SetAllocatorFlags(0, allocator_flags1);
-    SetAllocationStepDelay(0, kMinimumStepDelay);
-    ConfigureEndpoint(1, config2);
-    SetAllocatorFlags(1, allocator_flags2);
-    SetAllocationStepDelay(1, kMinimumStepDelay);
-
-    set_remote_ice_parameter_source(FROM_SETICEPARAMETERS);
-  }
-  void ConfigureEndpoint(int endpoint, Config config) {
-    switch (config) {
-      case OPEN:
-        AddAddress(endpoint, kPublicAddrs[endpoint]);
-        break;
-      case NAT_FULL_CONE:
-      case NAT_ADDR_RESTRICTED:
-      case NAT_PORT_RESTRICTED:
-      case NAT_SYMMETRIC:
-        AddAddress(endpoint, kPrivateAddrs[endpoint]);
-        // Add a single NAT of the desired type
-        nat()->AddTranslator(kPublicAddrs[endpoint], kNatAddrs[endpoint],
-            static_cast<rtc::NATType>(config - NAT_FULL_CONE))->
-            AddClient(kPrivateAddrs[endpoint]);
-        break;
-      case NAT_DOUBLE_CONE:
-      case NAT_SYMMETRIC_THEN_CONE:
-        AddAddress(endpoint, kCascadedPrivateAddrs[endpoint]);
-        // Add a two cascaded NATs of the desired types
-        nat()->AddTranslator(kPublicAddrs[endpoint], kNatAddrs[endpoint],
-            (config == NAT_DOUBLE_CONE) ?
-                rtc::NAT_OPEN_CONE : rtc::NAT_SYMMETRIC)->
-            AddTranslator(kPrivateAddrs[endpoint], kCascadedNatAddrs[endpoint],
-                rtc::NAT_OPEN_CONE)->
-                AddClient(kCascadedPrivateAddrs[endpoint]);
-        break;
-      case BLOCK_UDP:
-      case BLOCK_UDP_AND_INCOMING_TCP:
-      case BLOCK_ALL_BUT_OUTGOING_HTTP:
-      case PROXY_HTTPS:
-      case PROXY_SOCKS:
-        AddAddress(endpoint, kPublicAddrs[endpoint]);
-        // Block all UDP
-        fw()->AddRule(false, rtc::FP_UDP, rtc::FD_ANY,
-                      kPublicAddrs[endpoint]);
-        if (config == BLOCK_UDP_AND_INCOMING_TCP) {
-          // Block TCP inbound to the endpoint
-          fw()->AddRule(false, rtc::FP_TCP, SocketAddress(),
-                        kPublicAddrs[endpoint]);
-        } else if (config == BLOCK_ALL_BUT_OUTGOING_HTTP) {
-          // Block all TCP to/from the endpoint except 80/443 out
-          fw()->AddRule(true, rtc::FP_TCP, kPublicAddrs[endpoint],
-                        SocketAddress(rtc::IPAddress(INADDR_ANY), 80));
-          fw()->AddRule(true, rtc::FP_TCP, kPublicAddrs[endpoint],
-                        SocketAddress(rtc::IPAddress(INADDR_ANY), 443));
-          fw()->AddRule(false, rtc::FP_TCP, rtc::FD_ANY,
-                        kPublicAddrs[endpoint]);
-        } else if (config == PROXY_HTTPS) {
-          // Block all TCP to/from the endpoint except to the proxy server
-          fw()->AddRule(true, rtc::FP_TCP, kPublicAddrs[endpoint],
-                        kHttpsProxyAddrs[endpoint]);
-          fw()->AddRule(false, rtc::FP_TCP, rtc::FD_ANY,
-                        kPublicAddrs[endpoint]);
-          SetProxy(endpoint, rtc::PROXY_HTTPS);
-        } else if (config == PROXY_SOCKS) {
-          // Block all TCP to/from the endpoint except to the proxy server
-          fw()->AddRule(true, rtc::FP_TCP, kPublicAddrs[endpoint],
-                        kSocksProxyAddrs[endpoint]);
-          fw()->AddRule(false, rtc::FP_TCP, rtc::FD_ANY,
-                        kPublicAddrs[endpoint]);
-          SetProxy(endpoint, rtc::PROXY_SOCKS5);
-        }
-        break;
-      default:
-        RTC_NOTREACHED();
-        break;
-    }
-  }
-};
-
-// Shorthands for use in the test matrix.
-#define LULU &kLocalUdpToLocalUdp
-#define LUSU &kLocalUdpToStunUdp
-#define LUPU &kLocalUdpToPrflxUdp
-#define PULU &kPrflxUdpToLocalUdp
-#define SULU &kStunUdpToLocalUdp
-#define SUSU &kStunUdpToStunUdp
-#define SUPU &kStunUdpToPrflxUdp
-#define PUSU &kPrflxUdpToStunUdp
-#define LURU &kLocalUdpToRelayUdp
-#define PURU &kPrflxUdpToRelayUdp
-#define RUPU &kRelayUdpToPrflxUdp
-#define LTLT &kLocalTcpToLocalTcp
-#define LTPT &kLocalTcpToPrflxTcp
-#define PTLT &kPrflxTcpToLocalTcp
-// TODO: Enable these once TestRelayServer can accept external TCP.
-#define LTRT NULL
-#define LSRS NULL
-
-// Test matrix. Originator behavior defined by rows, receiever by columns.
-
-// TODO: Fix NULLs caused by lack of TCP support in NATSocket.
-// TODO: Fix NULLs caused by no HTTP proxy support.
-// TODO: Rearrange rows/columns from best to worst.
-const P2PTransportChannelTest::Result*
-    P2PTransportChannelTest::kMatrix[NUM_CONFIGS][NUM_CONFIGS] = {
-//      OPEN  CONE  ADDR  PORT  SYMM  2CON  SCON  !UDP  !TCP  HTTP  PRXH  PRXS
-/*OP*/ {LULU, LUSU, LUSU, LUSU, LUPU, LUSU, LUPU, LTPT, LTPT, LSRS, NULL, LTPT},
-/*CO*/ {SULU, SUSU, SUSU, SUSU, SUPU, SUSU, SUPU, NULL, NULL, LSRS, NULL, LTRT},
-/*AD*/ {SULU, SUSU, SUSU, SUSU, SUPU, SUSU, SUPU, NULL, NULL, LSRS, NULL, LTRT},
-/*PO*/ {SULU, SUSU, SUSU, SUSU, RUPU, SUSU, RUPU, NULL, NULL, LSRS, NULL, LTRT},
-/*SY*/ {PULU, PUSU, PUSU, PURU, PURU, PUSU, PURU, NULL, NULL, LSRS, NULL, LTRT},
-/*2C*/ {SULU, SUSU, SUSU, SUSU, SUPU, SUSU, SUPU, NULL, NULL, LSRS, NULL, LTRT},
-/*SC*/ {PULU, PUSU, PUSU, PURU, PURU, PUSU, PURU, NULL, NULL, LSRS, NULL, LTRT},
-/*!U*/ {LTPT, NULL, NULL, NULL, NULL, NULL, NULL, LTPT, LTPT, LSRS, NULL, LTRT},
-/*!T*/ {PTLT, NULL, NULL, NULL, NULL, NULL, NULL, PTLT, LTRT, LSRS, NULL, LTRT},
-/*HT*/ {LSRS, LSRS, LSRS, LSRS, LSRS, LSRS, LSRS, LSRS, LSRS, LSRS, NULL, LSRS},
-/*PR*/ {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
-/*PR*/ {LTRT, LTRT, LTRT, LTRT, LTRT, LTRT, LTRT, LTRT, LTRT, LSRS, NULL, LTRT},
-};
-
-// The actual tests that exercise all the various configurations.
-// Test names are of the form P2PTransportChannelTest_TestOPENToNAT_FULL_CONE
-#define P2P_TEST_DECLARATION(x, y, z)                            \
-  TEST_F(P2PTransportChannelTest, z##Test##x##To##y) {           \
-    ConfigureEndpoints(x, y, PORTALLOCATOR_ENABLE_SHARED_SOCKET, \
-                       PORTALLOCATOR_ENABLE_SHARED_SOCKET);      \
-    if (kMatrix[x][y] != NULL)                                   \
-      Test(*kMatrix[x][y]);                                      \
-    else                                                         \
-      LOG(LS_WARNING) << "Not yet implemented";                  \
-  }
-
-#define P2P_TEST(x, y) \
-  P2P_TEST_DECLARATION(x, y,)
-
-#define P2P_TEST_SET(x)                    \
-  P2P_TEST(x, OPEN)                        \
-  P2P_TEST(x, NAT_FULL_CONE)               \
-  P2P_TEST(x, NAT_ADDR_RESTRICTED)         \
-  P2P_TEST(x, NAT_PORT_RESTRICTED)         \
-  P2P_TEST(x, NAT_SYMMETRIC)               \
-  P2P_TEST(x, NAT_DOUBLE_CONE)             \
-  P2P_TEST(x, NAT_SYMMETRIC_THEN_CONE)     \
-  P2P_TEST(x, BLOCK_UDP)                   \
-  P2P_TEST(x, BLOCK_UDP_AND_INCOMING_TCP)  \
-  P2P_TEST(x, BLOCK_ALL_BUT_OUTGOING_HTTP) \
-  P2P_TEST(x, PROXY_HTTPS)                 \
-  P2P_TEST(x, PROXY_SOCKS)
-
-P2P_TEST_SET(OPEN)
-P2P_TEST_SET(NAT_FULL_CONE)
-P2P_TEST_SET(NAT_ADDR_RESTRICTED)
-P2P_TEST_SET(NAT_PORT_RESTRICTED)
-P2P_TEST_SET(NAT_SYMMETRIC)
-P2P_TEST_SET(NAT_DOUBLE_CONE)
-P2P_TEST_SET(NAT_SYMMETRIC_THEN_CONE)
-P2P_TEST_SET(BLOCK_UDP)
-P2P_TEST_SET(BLOCK_UDP_AND_INCOMING_TCP)
-P2P_TEST_SET(BLOCK_ALL_BUT_OUTGOING_HTTP)
-P2P_TEST_SET(PROXY_HTTPS)
-P2P_TEST_SET(PROXY_SOCKS)
-
-// Test that we restart candidate allocation when local ufrag&pwd changed.
-// Standard Ice protocol is used.
-TEST_F(P2PTransportChannelTest, HandleUfragPwdChange) {
-  ConfigureEndpoints(OPEN, OPEN, kDefaultPortAllocatorFlags,
-                     kDefaultPortAllocatorFlags);
-  CreateChannels();
-  TestHandleIceUfragPasswordChanged();
-  DestroyChannels();
-}
-
-// Same as above test, but with a symmetric NAT.
-// We should end up with relay<->prflx candidate pairs, with generation "1".
-TEST_F(P2PTransportChannelTest, HandleUfragPwdChangeSymmetricNat) {
-  ConfigureEndpoints(NAT_SYMMETRIC, NAT_SYMMETRIC, kDefaultPortAllocatorFlags,
-                     kDefaultPortAllocatorFlags);
-  CreateChannels();
-  TestHandleIceUfragPasswordChanged();
-  DestroyChannels();
-}
-
-// Test the operation of GetStats.
-TEST_F(P2PTransportChannelTest, GetStats) {
-  rtc::ScopedFakeClock clock;
-  ConfigureEndpoints(OPEN, OPEN, kDefaultPortAllocatorFlags,
-                     kDefaultPortAllocatorFlags);
-  CreateChannels();
-  EXPECT_TRUE_SIMULATED_WAIT(ep1_ch1()->receiving() && ep1_ch1()->writable() &&
-                                 ep2_ch1()->receiving() &&
-                                 ep2_ch1()->writable(),
-                             kMediumTimeout, clock);
-  TestSendRecv(clock);
-  ConnectionInfos infos;
-  ASSERT_TRUE(ep1_ch1()->GetStats(&infos));
-  ASSERT_TRUE(infos.size() >= 1);
-  ConnectionInfo* best_conn_info = nullptr;
-  for (ConnectionInfo& info : infos) {
-    if (info.best_connection) {
-      best_conn_info = &info;
-      break;
-    }
-  }
-  ASSERT_TRUE(best_conn_info != nullptr);
-  EXPECT_TRUE(best_conn_info->new_connection);
-  EXPECT_TRUE(best_conn_info->receiving);
-  EXPECT_TRUE(best_conn_info->writable);
-  EXPECT_FALSE(best_conn_info->timeout);
-  EXPECT_EQ(10U, best_conn_info->sent_total_packets);
-  EXPECT_EQ(0U, best_conn_info->sent_discarded_packets);
-  EXPECT_EQ(10 * 36U, best_conn_info->sent_total_bytes);
-  EXPECT_EQ(10 * 36U, best_conn_info->recv_total_bytes);
-  DestroyChannels();
-}
-
-// Tests that UMAs are recorded when ICE restarts while the channel
-// is disconnected.
-TEST_F(P2PTransportChannelTest, TestUMAIceRestartWhileDisconnected) {
-  rtc::ScopedFakeClock clock;
-  ConfigureEndpoints(OPEN, OPEN, kOnlyLocalPorts, kOnlyLocalPorts);
-
-  CreateChannels();
-  EXPECT_TRUE_SIMULATED_WAIT(ep1_ch1()->receiving() && ep1_ch1()->writable() &&
-                                 ep2_ch1()->receiving() &&
-                                 ep2_ch1()->writable(),
-                             kDefaultTimeout, clock);
-
-  // Drop all packets so that both channels become not writable.
-  fw()->AddRule(false, rtc::FP_ANY, rtc::FD_ANY, kPublicAddrs[0]);
-  const int kWriteTimeoutDelay = 8000;
-  EXPECT_TRUE_SIMULATED_WAIT(!ep1_ch1()->writable() && !ep2_ch1()->writable(),
-                             kWriteTimeoutDelay, clock);
-
-  ep1_ch1()->SetIceParameters(kIceParams[2]);
-  ep1_ch1()->SetRemoteIceParameters(kIceParams[3]);
-  ep1_ch1()->MaybeStartGathering();
-  EXPECT_EQ(1, GetMetricsObserver(0)->GetEnumCounter(
-                   webrtc::kEnumCounterIceRestart,
-                   static_cast<int>(IceRestartState::DISCONNECTED)));
-
-  ep2_ch1()->SetIceParameters(kIceParams[3]);
-  ep2_ch1()->SetRemoteIceParameters(kIceParams[2]);
-  ep2_ch1()->MaybeStartGathering();
-  EXPECT_EQ(1, GetMetricsObserver(1)->GetEnumCounter(
-                   webrtc::kEnumCounterIceRestart,
-                   static_cast<int>(IceRestartState::DISCONNECTED)));
-
-  DestroyChannels();
-}
-
-// Tests that UMAs are recorded when ICE restarts while the channel
-// is connected.
-TEST_F(P2PTransportChannelTest, TestUMAIceRestartWhileConnected) {
-  rtc::ScopedFakeClock clock;
-  ConfigureEndpoints(OPEN, OPEN, kOnlyLocalPorts, kOnlyLocalPorts);
-
-  CreateChannels();
-  EXPECT_TRUE_SIMULATED_WAIT(ep1_ch1()->receiving() && ep1_ch1()->writable() &&
-                                 ep2_ch1()->receiving() &&
-                                 ep2_ch1()->writable(),
-                             kDefaultTimeout, clock);
-
-  ep1_ch1()->SetIceParameters(kIceParams[2]);
-  ep1_ch1()->SetRemoteIceParameters(kIceParams[3]);
-  ep1_ch1()->MaybeStartGathering();
-  EXPECT_EQ(1, GetMetricsObserver(0)->GetEnumCounter(
-                   webrtc::kEnumCounterIceRestart,
-                   static_cast<int>(IceRestartState::CONNECTED)));
-
-  ep2_ch1()->SetIceParameters(kIceParams[3]);
-  ep2_ch1()->SetRemoteIceParameters(kIceParams[2]);
-  ep2_ch1()->MaybeStartGathering();
-  EXPECT_EQ(1, GetMetricsObserver(1)->GetEnumCounter(
-                   webrtc::kEnumCounterIceRestart,
-                   static_cast<int>(IceRestartState::CONNECTED)));
-
-  DestroyChannels();
-}
-
-// Tests that UMAs are recorded when ICE restarts while the channel
-// is connecting.
-TEST_F(P2PTransportChannelTest, TestUMAIceRestartWhileConnecting) {
-  rtc::ScopedFakeClock clock;
-  ConfigureEndpoints(OPEN, OPEN, kOnlyLocalPorts, kOnlyLocalPorts);
-
-  // Create the channels without waiting for them to become connected.
-  CreateChannels();
-
-  ep1_ch1()->SetIceParameters(kIceParams[2]);
-  ep1_ch1()->SetRemoteIceParameters(kIceParams[3]);
-  ep1_ch1()->MaybeStartGathering();
-  EXPECT_EQ(1, GetMetricsObserver(0)->GetEnumCounter(
-                   webrtc::kEnumCounterIceRestart,
-                   static_cast<int>(IceRestartState::CONNECTING)));
-
-  ep2_ch1()->SetIceParameters(kIceParams[3]);
-  ep2_ch1()->SetRemoteIceParameters(kIceParams[2]);
-  ep2_ch1()->MaybeStartGathering();
-  EXPECT_EQ(1, GetMetricsObserver(1)->GetEnumCounter(
-                   webrtc::kEnumCounterIceRestart,
-                   static_cast<int>(IceRestartState::CONNECTING)));
-
-  DestroyChannels();
-}
-
-// Tests that a UMA on ICE regathering is recorded when there is a network
-// change if and only if continual gathering is enabled.
-TEST_F(P2PTransportChannelTest,
-       TestIceRegatheringReasonContinualGatheringByNetworkChange) {
-  rtc::ScopedFakeClock clock;
-  ConfigureEndpoints(OPEN, OPEN, kOnlyLocalPorts, kOnlyLocalPorts);
-
-  // ep1 gathers continually but ep2 does not.
-  IceConfig continual_gathering_config =
-      CreateIceConfig(1000, GATHER_CONTINUALLY);
-  IceConfig default_config;
-  CreateChannels(continual_gathering_config, default_config);
-
-  EXPECT_TRUE_SIMULATED_WAIT(ep1_ch1()->receiving() && ep1_ch1()->writable() &&
-                                 ep2_ch1()->receiving() &&
-                                 ep2_ch1()->writable(),
-                             kDefaultTimeout, clock);
-
-  // Adding address in ep1 will trigger continual gathering.
-  AddAddress(0, kAlternateAddrs[0]);
-  EXPECT_EQ_SIMULATED_WAIT(
-      1, GetMetricsObserver(0)->GetEnumCounter(
-             webrtc::kEnumCounterIceRegathering,
-             static_cast<int>(IceRegatheringReason::NETWORK_CHANGE)),
-      kDefaultTimeout, clock);
-
-  ep2_ch1()->SetIceParameters(kIceParams[3]);
-  ep2_ch1()->SetRemoteIceParameters(kIceParams[2]);
-  ep2_ch1()->MaybeStartGathering();
-
-  AddAddress(1, kAlternateAddrs[1]);
-  SIMULATED_WAIT(false, kDefaultTimeout, clock);
-  // ep2 has not enabled continual gathering.
-  EXPECT_EQ(0, GetMetricsObserver(1)->GetEnumCounter(
-                   webrtc::kEnumCounterIceRegathering,
-                   static_cast<int>(IceRegatheringReason::NETWORK_CHANGE)));
-
-  DestroyChannels();
-}
-
-// Tests that a UMA on ICE regathering is recorded when there is a network
-// failure if and only if continual gathering is enabled.
-TEST_F(P2PTransportChannelTest,
-       TestIceRegatheringReasonContinualGatheringByNetworkFailure) {
-  rtc::ScopedFakeClock clock;
-  ConfigureEndpoints(OPEN, OPEN, kOnlyLocalPorts, kOnlyLocalPorts);
-
-  // ep1 gathers continually but ep2 does not.
-  IceConfig config1 = CreateIceConfig(1000, GATHER_CONTINUALLY);
-  config1.regather_on_failed_networks_interval = rtc::Optional<int>(2000);
-  IceConfig config2;
-  config2.regather_on_failed_networks_interval = rtc::Optional<int>(2000);
-  CreateChannels(config1, config2);
-
-  EXPECT_TRUE_SIMULATED_WAIT(ep1_ch1()->receiving() && ep1_ch1()->writable() &&
-                                 ep2_ch1()->receiving() &&
-                                 ep2_ch1()->writable(),
-                             kDefaultTimeout, clock);
-
-  fw()->AddRule(false, rtc::FP_ANY, rtc::FD_ANY, kPublicAddrs[0]);
-  // Timeout value such that all connections are deleted.
-  const int kNetworkFailureTimeout = 35000;
-  SIMULATED_WAIT(false, kNetworkFailureTimeout, clock);
-  EXPECT_LE(1, GetMetricsObserver(0)->GetEnumCounter(
-                   webrtc::kEnumCounterIceRegathering,
-                   static_cast<int>(IceRegatheringReason::NETWORK_FAILURE)));
-  EXPECT_EQ(0, GetMetricsObserver(1)->GetEnumCounter(
-                   webrtc::kEnumCounterIceRegathering,
-                   static_cast<int>(IceRegatheringReason::NETWORK_FAILURE)));
-
-  DestroyChannels();
-}
-
-// Tests that ICE regathering occurs regularly when
-// regather_all_networks_interval_range configuration value is set.
-TEST_F(P2PTransportChannelTest, TestIceRegatherOnAllNetworksContinual) {
-  rtc::ScopedFakeClock clock;
-  ConfigureEndpoints(OPEN, OPEN, kOnlyLocalPorts, kOnlyLocalPorts);
-
-  // ep1 gathers continually but ep2 does not.
-  const int kRegatherInterval = 2000;
-  IceConfig config1 = CreateIceConfig(1000, GATHER_CONTINUALLY);
-  config1.regather_all_networks_interval_range.emplace(
-      kRegatherInterval, kRegatherInterval);
-  IceConfig config2;
-  CreateChannels(config1, config2);
-
-  EXPECT_TRUE_SIMULATED_WAIT(ep1_ch1()->receiving() && ep1_ch1()->writable() &&
-                                 ep2_ch1()->receiving() &&
-                                 ep2_ch1()->writable(),
-                             kDefaultTimeout, clock);
-
-  fw()->AddRule(false, rtc::FP_ANY, rtc::FD_ANY, kPublicAddrs[0]);
-  // Timeout value such that all connections are deleted.
-  const int kNetworkGatherDuration = 11000;
-  SIMULATED_WAIT(false, kNetworkGatherDuration, clock);
-  // Expect regathering to happen 5 times in 11s with 2s interval.
-  EXPECT_LE(5, GetMetricsObserver(0)->GetEnumCounter(
-                   webrtc::kEnumCounterIceRegathering,
-                   static_cast<int>(IceRegatheringReason::OCCASIONAL_REFRESH)));
-  // Expect no regathering if continual gathering not configured.
-  EXPECT_EQ(0, GetMetricsObserver(1)->GetEnumCounter(
-                   webrtc::kEnumCounterIceRegathering,
-                   static_cast<int>(IceRegatheringReason::OCCASIONAL_REFRESH)));
-
-  DestroyChannels();
-}
-
-// Test that ICE periodic regathering can change the selected connection on the
-// specified interval and that the peers can communicate over the new
-// connection. The test is parameterized to test that it works when regathering
-// is done by the ICE controlling peer and when done by the controlled peer.
-class P2PTransportRegatherAllNetworksTest : public P2PTransportChannelTest {
- protected:
-  void TestWithRoles(IceRole p1_role, IceRole p2_role) {
-    rtc::ScopedFakeClock clock;
-    ConfigureEndpoints(NAT_SYMMETRIC, NAT_SYMMETRIC, kDefaultPortAllocatorFlags,
-        kDefaultPortAllocatorFlags);
-    set_force_relay(true);
-
-    const int kRegatherInterval = 2000;
-    const int kNumRegathers = 2;
-
-    // Set up peer 1 to auto regather every 2s.
-    IceConfig config1 = CreateIceConfig(1000, GATHER_CONTINUALLY);
-    config1.regather_all_networks_interval_range.emplace(
-        kRegatherInterval, kRegatherInterval);
-    IceConfig config2 = CreateIceConfig(1000, GATHER_CONTINUALLY);
-
-    // Set peer roles.
-    SetIceRole(0, p1_role);
-    SetIceRole(1, p2_role);
-
-    CreateChannels(config1, config2);
-
-    // Wait for initial connection to be made.
-    EXPECT_TRUE_SIMULATED_WAIT(ep1_ch1()->receiving() &&
-                                   ep1_ch1()->writable() &&
-                                   ep2_ch1()->receiving() &&
-                                   ep2_ch1()->writable(),
-                               kMediumTimeout, clock);
-
-    const Connection* initial_selected = ep1_ch1()->selected_connection();
-
-    // Wait long enough for 2 regathering cycles to happen plus some extra so
-    // the new connection has time to settle.
-    const int kWaitRegather =
-        kRegatherInterval * kNumRegathers + kRegatherInterval / 2;
-    SIMULATED_WAIT(false, kWaitRegather, clock);
-    EXPECT_EQ(kNumRegathers, GetMetricsObserver(0)->GetEnumCounter(
-        webrtc::kEnumCounterIceRegathering,
-        static_cast<int>(IceRegatheringReason::OCCASIONAL_REFRESH)));
-
-    const Connection* new_selected = ep1_ch1()->selected_connection();
-
-    // Want the new selected connection to be different.
-    ASSERT_NE(initial_selected, new_selected);
-
-    // Make sure we can communicate over the new connection too.
-    TestSendRecv(clock);
-  }
-};
-
-TEST_F(P2PTransportRegatherAllNetworksTest, TestControlling) {
-  TestWithRoles(ICEROLE_CONTROLLING, ICEROLE_CONTROLLED);
-}
-
-TEST_F(P2PTransportRegatherAllNetworksTest, TestControlled) {
-  TestWithRoles(ICEROLE_CONTROLLED, ICEROLE_CONTROLLING);
-}
-
-// Test that we properly create a connection on a STUN ping from unknown address
-// when the signaling is slow.
-TEST_F(P2PTransportChannelTest, PeerReflexiveCandidateBeforeSignaling) {
-  ConfigureEndpoints(OPEN, OPEN, kDefaultPortAllocatorFlags,
-                     kDefaultPortAllocatorFlags);
-  // Emulate no remote parameters coming in.
-  set_remote_ice_parameter_source(FROM_CANDIDATE);
-  CreateChannels();
-  // Only have remote parameters come in for ep2, not ep1.
-  ep2_ch1()->SetRemoteIceParameters(kIceParams[0]);
-
-  // Pause sending ep2's candidates to ep1 until ep1 receives the peer reflexive
-  // candidate.
-  PauseCandidates(1);
-
-  // Wait until the callee becomes writable to make sure that a ping request is
-  // received by the caller before his remote ICE credentials are set.
-  ASSERT_TRUE_WAIT(ep2_ch1()->selected_connection() != nullptr, kMediumTimeout);
-  // Add two sets of remote ICE credentials, so that the ones used by the
-  // candidate will be generation 1 instead of 0.
-  ep1_ch1()->SetRemoteIceParameters(kIceParams[3]);
-  ep1_ch1()->SetRemoteIceParameters(kIceParams[1]);
-  // The caller should have the selected connection connected to the peer
-  // reflexive candidate.
-  const Connection* selected_connection = nullptr;
-  ASSERT_TRUE_WAIT(
-      (selected_connection = ep1_ch1()->selected_connection()) != nullptr,
-      kMediumTimeout);
-  EXPECT_EQ("prflx", selected_connection->remote_candidate().type());
-  EXPECT_EQ(kIceUfrag[1], selected_connection->remote_candidate().username());
-  EXPECT_EQ(kIcePwd[1], selected_connection->remote_candidate().password());
-  EXPECT_EQ(1u, selected_connection->remote_candidate().generation());
-
-  ResumeCandidates(1);
-  // Verify ep1's selected connection is updated to use the 'local' candidate.
-  EXPECT_EQ_WAIT("local",
-                 ep1_ch1()->selected_connection()->remote_candidate().type(),
-                 kMediumTimeout);
-  EXPECT_EQ(selected_connection, ep1_ch1()->selected_connection());
-  DestroyChannels();
-}
-
-// Test that we properly create a connection on a STUN ping from unknown address
-// when the signaling is slow and the end points are behind NAT.
-TEST_F(P2PTransportChannelTest, PeerReflexiveCandidateBeforeSignalingWithNAT) {
-  ConfigureEndpoints(OPEN, NAT_SYMMETRIC, kDefaultPortAllocatorFlags,
-                     kDefaultPortAllocatorFlags);
-  // Emulate no remote parameters coming in.
-  set_remote_ice_parameter_source(FROM_CANDIDATE);
-  CreateChannels();
-  // Only have remote parameters come in for ep2, not ep1.
-  ep2_ch1()->SetRemoteIceParameters(kIceParams[0]);
-  // Pause sending ep2's candidates to ep1 until ep1 receives the peer reflexive
-  // candidate.
-  PauseCandidates(1);
-
-  // Wait until the callee becomes writable to make sure that a ping request is
-  // received by the caller before his remote ICE credentials are set.
-  ASSERT_TRUE_WAIT(ep2_ch1()->selected_connection() != nullptr, kMediumTimeout);
-  // Add two sets of remote ICE credentials, so that the ones used by the
-  // candidate will be generation 1 instead of 0.
-  ep1_ch1()->SetRemoteIceParameters(kIceParams[3]);
-  ep1_ch1()->SetRemoteIceParameters(kIceParams[1]);
-
-  // The caller's selected connection should be connected to the peer reflexive
-  // candidate.
-  const Connection* selected_connection = nullptr;
-  ASSERT_TRUE_WAIT(
-      (selected_connection = ep1_ch1()->selected_connection()) != nullptr,
-      kMediumTimeout);
-  EXPECT_EQ("prflx", selected_connection->remote_candidate().type());
-  EXPECT_EQ(kIceUfrag[1], selected_connection->remote_candidate().username());
-  EXPECT_EQ(kIcePwd[1], selected_connection->remote_candidate().password());
-  EXPECT_EQ(1u, selected_connection->remote_candidate().generation());
-
-  ResumeCandidates(1);
-
-  EXPECT_EQ_WAIT("prflx",
-                 ep1_ch1()->selected_connection()->remote_candidate().type(),
-                 kMediumTimeout);
-  EXPECT_EQ(selected_connection, ep1_ch1()->selected_connection());
-  DestroyChannels();
-}
-
-// Test that we properly create a connection on a STUN ping from unknown address
-// when the signaling is slow, even if the new candidate is created due to the
-// remote peer doing an ICE restart, pairing this candidate across generations.
-//
-// Previously this wasn't working due to a bug where the peer reflexive
-// candidate was only updated for the newest generation candidate pairs, and
-// not older-generation candidate pairs created by pairing candidates across
-// generations. This resulted in the old-generation prflx candidate being
-// prioritized above new-generation candidate pairs.
-TEST_F(P2PTransportChannelTest,
-       PeerReflexiveCandidateBeforeSignalingWithIceRestart) {
-  ConfigureEndpoints(OPEN, OPEN, kDefaultPortAllocatorFlags,
-                     kDefaultPortAllocatorFlags);
-  // Only gather relay candidates, so that when the prflx candidate arrives
-  // it's prioritized above the current candidate pair.
-  GetEndpoint(0)->allocator_->set_candidate_filter(CF_RELAY);
-  GetEndpoint(1)->allocator_->set_candidate_filter(CF_RELAY);
-  // Setting this allows us to control when SetRemoteIceParameters is called.
-  set_remote_ice_parameter_source(FROM_CANDIDATE);
-  CreateChannels();
-  // Wait for the initial connection to be made.
-  ep1_ch1()->SetRemoteIceParameters(kIceParams[1]);
-  ep2_ch1()->SetRemoteIceParameters(kIceParams[0]);
-  EXPECT_TRUE_WAIT(ep1_ch1()->receiving() && ep1_ch1()->writable() &&
-                       ep2_ch1()->receiving() && ep2_ch1()->writable(),
-                   kDefaultTimeout);
-
-  // Simulate an ICE restart on ep2, but don't signal the candidate or new
-  // ICE parameters until after a prflx connection has been made.
-  PauseCandidates(1);
-  ep2_ch1()->SetIceParameters(kIceParams[3]);
-
-  ep1_ch1()->SetRemoteIceParameters(kIceParams[3]);
-  ep2_ch1()->MaybeStartGathering();
-
-  // The caller should have the selected connection connected to the peer
-  // reflexive candidate.
-  EXPECT_EQ_WAIT("prflx",
-                 ep1_ch1()->selected_connection()->remote_candidate().type(),
-                 kDefaultTimeout);
-  const Connection* prflx_selected_connection =
-      ep1_ch1()->selected_connection();
-
-  // Now simulate the ICE restart on ep1.
-  ep1_ch1()->SetIceParameters(kIceParams[2]);
-
-  ep2_ch1()->SetRemoteIceParameters(kIceParams[2]);
-  ep1_ch1()->MaybeStartGathering();
-
-  // Finally send the candidates from ep2's ICE restart and verify that ep1 uses
-  // their information to update the peer reflexive candidate.
-  ResumeCandidates(1);
-
-  EXPECT_EQ_WAIT("relay",
-                 ep1_ch1()->selected_connection()->remote_candidate().type(),
-                 kDefaultTimeout);
-  EXPECT_EQ(prflx_selected_connection, ep1_ch1()->selected_connection());
-  DestroyChannels();
-}
-
-// Test that if remote candidates don't have ufrag and pwd, we still work.
-TEST_F(P2PTransportChannelTest, RemoteCandidatesWithoutUfragPwd) {
-  rtc::ScopedFakeClock clock;
-  set_remote_ice_parameter_source(FROM_SETICEPARAMETERS);
-  ConfigureEndpoints(OPEN, OPEN, kDefaultPortAllocatorFlags,
-                     kDefaultPortAllocatorFlags);
-  CreateChannels();
-  const Connection* selected_connection = NULL;
-  // Wait until the callee's connections are created.
-  EXPECT_TRUE_SIMULATED_WAIT(
-      (selected_connection = ep2_ch1()->selected_connection()) != NULL,
-      kMediumTimeout, clock);
-  // Wait to make sure the selected connection is not changed.
-  SIMULATED_WAIT(ep2_ch1()->selected_connection() != selected_connection,
-                 kShortTimeout, clock);
-  EXPECT_TRUE(ep2_ch1()->selected_connection() == selected_connection);
-  DestroyChannels();
-}
-
-// Test that a host behind NAT cannot be reached when incoming_only
-// is set to true.
-TEST_F(P2PTransportChannelTest, IncomingOnlyBlocked) {
-  rtc::ScopedFakeClock clock;
-  ConfigureEndpoints(NAT_FULL_CONE, OPEN, kDefaultPortAllocatorFlags,
-                     kDefaultPortAllocatorFlags);
-
-  SetAllocatorFlags(0, kOnlyLocalPorts);
-  CreateChannels();
-  ep1_ch1()->set_incoming_only(true);
-
-  // Pump for 1 second and verify that the channels are not connected.
-  SIMULATED_WAIT(false, kShortTimeout, clock);
-
-  EXPECT_FALSE(ep1_ch1()->receiving());
-  EXPECT_FALSE(ep1_ch1()->writable());
-  EXPECT_FALSE(ep2_ch1()->receiving());
-  EXPECT_FALSE(ep2_ch1()->writable());
-
-  DestroyChannels();
-}
-
-// Test that a peer behind NAT can connect to a peer that has
-// incoming_only flag set.
-TEST_F(P2PTransportChannelTest, IncomingOnlyOpen) {
-  rtc::ScopedFakeClock clock;
-  ConfigureEndpoints(OPEN, NAT_FULL_CONE, kDefaultPortAllocatorFlags,
-                     kDefaultPortAllocatorFlags);
-
-  SetAllocatorFlags(0, kOnlyLocalPorts);
-  CreateChannels();
-  ep1_ch1()->set_incoming_only(true);
-
-  EXPECT_TRUE_SIMULATED_WAIT(
-      ep1_ch1() != NULL && ep2_ch1() != NULL && ep1_ch1()->receiving() &&
-          ep1_ch1()->writable() && ep2_ch1()->receiving() &&
-          ep2_ch1()->writable(),
-      kMediumTimeout, clock);
-
-  DestroyChannels();
-}
-
-// Test that two peers can connect when one can only make outgoing TCP
-// connections. This has been observed in some scenarios involving
-// VPNs/firewalls.
-TEST_F(P2PTransportChannelTest, CanOnlyMakeOutgoingTcpConnections) {
-  // The PORTALLOCATOR_ENABLE_ANY_ADDRESS_PORTS flag is required if the
-  // application needs this use case to work, since the application must accept
-  // the tradeoff that more candidates need to be allocated.
-  //
-  // TODO(deadbeef): Later, make this flag the default, and do more elegant
-  // things to ensure extra candidates don't waste resources?
-  ConfigureEndpoints(
-      OPEN, OPEN,
-      kDefaultPortAllocatorFlags | PORTALLOCATOR_ENABLE_ANY_ADDRESS_PORTS,
-      kDefaultPortAllocatorFlags);
-  // In order to simulate nothing working but outgoing TCP connections, prevent
-  // the endpoint from binding to its interface's address as well as the
-  // "any" addresses. It can then only make a connection by using "Connect()".
-  fw()->SetUnbindableIps({rtc::GetAnyIP(AF_INET), rtc::GetAnyIP(AF_INET6),
-                          kPublicAddrs[0].ipaddr()});
-  CreateChannels();
-  // Expect a "prflx" candidate on the side that can only make outgoing
-  // connections, endpoint 0.
-  Test(kPrflxTcpToLocalTcp);
-  DestroyChannels();
-}
-
-TEST_F(P2PTransportChannelTest, TestTcpConnectionsFromActiveToPassive) {
-  rtc::ScopedFakeClock clock;
-  AddAddress(0, kPublicAddrs[0]);
-  AddAddress(1, kPublicAddrs[1]);
-
-  SetAllocationStepDelay(0, kMinimumStepDelay);
-  SetAllocationStepDelay(1, kMinimumStepDelay);
-
-  int kOnlyLocalTcpPorts = PORTALLOCATOR_DISABLE_UDP |
-                           PORTALLOCATOR_DISABLE_STUN |
-                           PORTALLOCATOR_DISABLE_RELAY;
-  // Disable all protocols except TCP.
-  SetAllocatorFlags(0, kOnlyLocalTcpPorts);
-  SetAllocatorFlags(1, kOnlyLocalTcpPorts);
-
-  SetAllowTcpListen(0, true);   // actpass.
-  SetAllowTcpListen(1, false);  // active.
-
-  // We want SetRemoteIceParameters to be called as it normally would.
-  // Otherwise we won't know what parameters to use for the expected
-  // prflx TCP candidates.
-  set_remote_ice_parameter_source(FROM_SETICEPARAMETERS);
-
-  // Pause candidate so we could verify the candidate properties.
-  PauseCandidates(0);
-  PauseCandidates(1);
-  CreateChannels();
-
-  // Verify tcp candidates.
-  VerifySavedTcpCandidates(0, TCPTYPE_PASSIVE_STR);
-  VerifySavedTcpCandidates(1, TCPTYPE_ACTIVE_STR);
-
-  // Resume candidates.
-  ResumeCandidates(0);
-  ResumeCandidates(1);
-
-  EXPECT_TRUE_SIMULATED_WAIT(ep1_ch1()->receiving() && ep1_ch1()->writable() &&
-                                 ep2_ch1()->receiving() &&
-                                 ep2_ch1()->writable(),
-                             kShortTimeout, clock);
-  EXPECT_TRUE(ep1_ch1()->selected_connection() &&
-              ep2_ch1()->selected_connection() &&
-              LocalCandidate(ep1_ch1())->address().EqualIPs(kPublicAddrs[0]) &&
-              RemoteCandidate(ep1_ch1())->address().EqualIPs(kPublicAddrs[1]));
-
-  TestSendRecv(clock);
-  DestroyChannels();
-}
-
-TEST_F(P2PTransportChannelTest, TestIceRoleConflict) {
-  AddAddress(0, kPublicAddrs[0]);
-  AddAddress(1, kPublicAddrs[1]);
-  TestSignalRoleConflict();
-}
-
-// Tests that the ice configs (protocol, tiebreaker and role) can be passed
-// down to ports.
-TEST_F(P2PTransportChannelTest, TestIceConfigWillPassDownToPort) {
-  rtc::ScopedFakeClock clock;
-  AddAddress(0, kPublicAddrs[0]);
-  AddAddress(1, kPublicAddrs[1]);
-
-  // Give the first connection the higher tiebreaker so its role won't
-  // change unless we tell it to.
-  SetIceRole(0, ICEROLE_CONTROLLING);
-  SetIceTiebreaker(0, kHighTiebreaker);
-  SetIceRole(1, ICEROLE_CONTROLLING);
-  SetIceTiebreaker(1, kLowTiebreaker);
-
-  CreateChannels();
-
-  EXPECT_EQ_SIMULATED_WAIT(2u, ep1_ch1()->ports().size(), kShortTimeout, clock);
-
-  const std::vector<PortInterface*> ports_before = ep1_ch1()->ports();
-  for (size_t i = 0; i < ports_before.size(); ++i) {
-    EXPECT_EQ(ICEROLE_CONTROLLING, ports_before[i]->GetIceRole());
-    EXPECT_EQ(kHighTiebreaker, ports_before[i]->IceTiebreaker());
-  }
-
-  ep1_ch1()->SetIceRole(ICEROLE_CONTROLLED);
-  ep1_ch1()->SetIceTiebreaker(kLowTiebreaker);
-
-  const std::vector<PortInterface*> ports_after = ep1_ch1()->ports();
-  for (size_t i = 0; i < ports_after.size(); ++i) {
-    EXPECT_EQ(ICEROLE_CONTROLLED, ports_before[i]->GetIceRole());
-    // SetIceTiebreaker after ports have been created will fail. So expect the
-    // original value.
-    EXPECT_EQ(kHighTiebreaker, ports_before[i]->IceTiebreaker());
-  }
-
-  EXPECT_TRUE_SIMULATED_WAIT(ep1_ch1()->receiving() && ep1_ch1()->writable() &&
-                                 ep2_ch1()->receiving() &&
-                                 ep2_ch1()->writable(),
-                             kShortTimeout, clock);
-
-  EXPECT_TRUE(ep1_ch1()->selected_connection() &&
-              ep2_ch1()->selected_connection());
-
-  TestSendRecv(clock);
-  DestroyChannels();
-}
-
-// Verify that we can set DSCP value and retrieve properly from P2PTC.
-TEST_F(P2PTransportChannelTest, TestDefaultDscpValue) {
-  AddAddress(0, kPublicAddrs[0]);
-  AddAddress(1, kPublicAddrs[1]);
-
-  CreateChannels();
-  EXPECT_EQ(rtc::DSCP_NO_CHANGE,
-            GetEndpoint(0)->cd1_.ch_->DefaultDscpValue());
-  EXPECT_EQ(rtc::DSCP_NO_CHANGE,
-            GetEndpoint(1)->cd1_.ch_->DefaultDscpValue());
-  GetEndpoint(0)->cd1_.ch_->SetOption(
-      rtc::Socket::OPT_DSCP, rtc::DSCP_CS6);
-  GetEndpoint(1)->cd1_.ch_->SetOption(
-      rtc::Socket::OPT_DSCP, rtc::DSCP_CS6);
-  EXPECT_EQ(rtc::DSCP_CS6,
-            GetEndpoint(0)->cd1_.ch_->DefaultDscpValue());
-  EXPECT_EQ(rtc::DSCP_CS6,
-            GetEndpoint(1)->cd1_.ch_->DefaultDscpValue());
-  GetEndpoint(0)->cd1_.ch_->SetOption(
-      rtc::Socket::OPT_DSCP, rtc::DSCP_AF41);
-  GetEndpoint(1)->cd1_.ch_->SetOption(
-      rtc::Socket::OPT_DSCP, rtc::DSCP_AF41);
-  EXPECT_EQ(rtc::DSCP_AF41,
-            GetEndpoint(0)->cd1_.ch_->DefaultDscpValue());
-  EXPECT_EQ(rtc::DSCP_AF41,
-            GetEndpoint(1)->cd1_.ch_->DefaultDscpValue());
-}
-
-// Verify IPv6 connection is preferred over IPv4.
-TEST_F(P2PTransportChannelTest, TestIPv6Connections) {
-  rtc::ScopedFakeClock clock;
-  AddAddress(0, kIPv6PublicAddrs[0]);
-  AddAddress(0, kPublicAddrs[0]);
-  AddAddress(1, kIPv6PublicAddrs[1]);
-  AddAddress(1, kPublicAddrs[1]);
-
-  SetAllocationStepDelay(0, kMinimumStepDelay);
-  SetAllocationStepDelay(1, kMinimumStepDelay);
-
-  // Enable IPv6
-  SetAllocatorFlags(
-      0, PORTALLOCATOR_ENABLE_IPV6 | PORTALLOCATOR_ENABLE_IPV6_ON_WIFI);
-  SetAllocatorFlags(
-      1, PORTALLOCATOR_ENABLE_IPV6 | PORTALLOCATOR_ENABLE_IPV6_ON_WIFI);
-
-  CreateChannels();
-
-  EXPECT_TRUE_SIMULATED_WAIT(ep1_ch1()->receiving() && ep1_ch1()->writable() &&
-                                 ep2_ch1()->receiving() &&
-                                 ep2_ch1()->writable(),
-                             kShortTimeout, clock);
-  EXPECT_TRUE(
-      ep1_ch1()->selected_connection() && ep2_ch1()->selected_connection() &&
-      LocalCandidate(ep1_ch1())->address().EqualIPs(kIPv6PublicAddrs[0]) &&
-      RemoteCandidate(ep1_ch1())->address().EqualIPs(kIPv6PublicAddrs[1]));
-
-  TestSendRecv(clock);
-  DestroyChannels();
-}
-
-// Testing forceful TURN connections.
-TEST_F(P2PTransportChannelTest, TestForceTurn) {
-  rtc::ScopedFakeClock clock;
-  ConfigureEndpoints(
-      NAT_PORT_RESTRICTED, NAT_SYMMETRIC,
-      kDefaultPortAllocatorFlags | PORTALLOCATOR_ENABLE_SHARED_SOCKET,
-      kDefaultPortAllocatorFlags | PORTALLOCATOR_ENABLE_SHARED_SOCKET);
-  set_force_relay(true);
-
-  SetAllocationStepDelay(0, kMinimumStepDelay);
-  SetAllocationStepDelay(1, kMinimumStepDelay);
-
-  CreateChannels();
-
-  EXPECT_TRUE_SIMULATED_WAIT(ep1_ch1()->receiving() && ep1_ch1()->writable() &&
-                                 ep2_ch1()->receiving() &&
-                                 ep2_ch1()->writable(),
-                             kMediumTimeout, clock);
-
-  EXPECT_TRUE(ep1_ch1()->selected_connection() &&
-              ep2_ch1()->selected_connection());
-
-  EXPECT_EQ("relay", RemoteCandidate(ep1_ch1())->type());
-  EXPECT_EQ("relay", LocalCandidate(ep1_ch1())->type());
-  EXPECT_EQ("relay", RemoteCandidate(ep2_ch1())->type());
-  EXPECT_EQ("relay", LocalCandidate(ep2_ch1())->type());
-
-  TestSendRecv(clock);
-  DestroyChannels();
-}
-
-// Test that if continual gathering is set to true, ICE gathering state will
-// not change to "Complete", and vice versa.
-TEST_F(P2PTransportChannelTest, TestContinualGathering) {
-  rtc::ScopedFakeClock clock;
-  ConfigureEndpoints(OPEN, OPEN, kDefaultPortAllocatorFlags,
-                     kDefaultPortAllocatorFlags);
-  SetAllocationStepDelay(0, kDefaultStepDelay);
-  SetAllocationStepDelay(1, kDefaultStepDelay);
-  IceConfig continual_gathering_config =
-      CreateIceConfig(1000, GATHER_CONTINUALLY);
-  // By default, ep2 does not gather continually.
-  IceConfig default_config;
-  CreateChannels(continual_gathering_config, default_config);
-
-  EXPECT_TRUE_SIMULATED_WAIT(
-      ep1_ch1() != NULL && ep2_ch1() != NULL && ep1_ch1()->receiving() &&
-          ep1_ch1()->writable() && ep2_ch1()->receiving() &&
-          ep2_ch1()->writable(),
-      kMediumTimeout, clock);
-  SIMULATED_WAIT(
-      IceGatheringState::kIceGatheringComplete == ep1_ch1()->gathering_state(),
-      kShortTimeout, clock);
-  EXPECT_EQ(IceGatheringState::kIceGatheringGathering,
-            ep1_ch1()->gathering_state());
-  // By now, ep2 should have completed gathering.
-  EXPECT_EQ(IceGatheringState::kIceGatheringComplete,
-            ep2_ch1()->gathering_state());
-
-  DestroyChannels();
-}
-
-// Test that a connection succeeds when the P2PTransportChannel uses a pooled
-// PortAllocatorSession that has not yet finished gathering candidates.
-TEST_F(P2PTransportChannelTest, TestUsingPooledSessionBeforeDoneGathering) {
-  rtc::ScopedFakeClock clock;
-  ConfigureEndpoints(OPEN, OPEN, kDefaultPortAllocatorFlags,
-                     kDefaultPortAllocatorFlags);
-  // First create a pooled session for each endpoint.
-  auto& allocator_1 = GetEndpoint(0)->allocator_;
-  auto& allocator_2 = GetEndpoint(1)->allocator_;
-  int pool_size = 1;
-  allocator_1->SetConfiguration(allocator_1->stun_servers(),
-                                allocator_1->turn_servers(), pool_size, false);
-  allocator_2->SetConfiguration(allocator_2->stun_servers(),
-                                allocator_2->turn_servers(), pool_size, false);
-  const PortAllocatorSession* pooled_session_1 =
-      allocator_1->GetPooledSession();
-  const PortAllocatorSession* pooled_session_2 =
-      allocator_2->GetPooledSession();
-  ASSERT_NE(nullptr, pooled_session_1);
-  ASSERT_NE(nullptr, pooled_session_2);
-  // Sanity check that pooled sessions haven't gathered anything yet.
-  EXPECT_TRUE(pooled_session_1->ReadyPorts().empty());
-  EXPECT_TRUE(pooled_session_1->ReadyCandidates().empty());
-  EXPECT_TRUE(pooled_session_2->ReadyPorts().empty());
-  EXPECT_TRUE(pooled_session_2->ReadyCandidates().empty());
-  // Now let the endpoints connect and try exchanging some data.
-  CreateChannels();
-  EXPECT_TRUE_SIMULATED_WAIT(
-      ep1_ch1() != NULL && ep2_ch1() != NULL && ep1_ch1()->receiving() &&
-          ep1_ch1()->writable() && ep2_ch1()->receiving() &&
-          ep2_ch1()->writable(),
-      kMediumTimeout, clock);
-  TestSendRecv(clock);
-  // Make sure the P2PTransportChannels are actually using ports from the
-  // pooled sessions.
-  auto pooled_ports_1 = pooled_session_1->ReadyPorts();
-  auto pooled_ports_2 = pooled_session_2->ReadyPorts();
-  EXPECT_NE(pooled_ports_1.end(),
-            std::find(pooled_ports_1.begin(), pooled_ports_1.end(),
-                      ep1_ch1()->selected_connection()->port()));
-  EXPECT_NE(pooled_ports_2.end(),
-            std::find(pooled_ports_2.begin(), pooled_ports_2.end(),
-                      ep2_ch1()->selected_connection()->port()));
-}
-
-// Test that a connection succeeds when the P2PTransportChannel uses a pooled
-// PortAllocatorSession that already finished gathering candidates.
-TEST_F(P2PTransportChannelTest, TestUsingPooledSessionAfterDoneGathering) {
-  rtc::ScopedFakeClock clock;
-  ConfigureEndpoints(OPEN, OPEN, kDefaultPortAllocatorFlags,
-                     kDefaultPortAllocatorFlags);
-  // First create a pooled session for each endpoint.
-  auto& allocator_1 = GetEndpoint(0)->allocator_;
-  auto& allocator_2 = GetEndpoint(1)->allocator_;
-  int pool_size = 1;
-  allocator_1->SetConfiguration(allocator_1->stun_servers(),
-                                allocator_1->turn_servers(), pool_size, false);
-  allocator_2->SetConfiguration(allocator_2->stun_servers(),
-                                allocator_2->turn_servers(), pool_size, false);
-  const PortAllocatorSession* pooled_session_1 =
-      allocator_1->GetPooledSession();
-  const PortAllocatorSession* pooled_session_2 =
-      allocator_2->GetPooledSession();
-  ASSERT_NE(nullptr, pooled_session_1);
-  ASSERT_NE(nullptr, pooled_session_2);
-  // Wait for the pooled sessions to finish gathering before the
-  // P2PTransportChannels try to use them.
-  EXPECT_TRUE_SIMULATED_WAIT(pooled_session_1->CandidatesAllocationDone() &&
-                                 pooled_session_2->CandidatesAllocationDone(),
-                             kDefaultTimeout, clock);
-  // Now let the endpoints connect and try exchanging some data.
-  CreateChannels();
-  EXPECT_TRUE_SIMULATED_WAIT(
-      ep1_ch1() != NULL && ep2_ch1() != NULL && ep1_ch1()->receiving() &&
-          ep1_ch1()->writable() && ep2_ch1()->receiving() &&
-          ep2_ch1()->writable(),
-      kMediumTimeout, clock);
-  TestSendRecv(clock);
-  // Make sure the P2PTransportChannels are actually using ports from the
-  // pooled sessions.
-  auto pooled_ports_1 = pooled_session_1->ReadyPorts();
-  auto pooled_ports_2 = pooled_session_2->ReadyPorts();
-  EXPECT_NE(pooled_ports_1.end(),
-            std::find(pooled_ports_1.begin(), pooled_ports_1.end(),
-                      ep1_ch1()->selected_connection()->port()));
-  EXPECT_NE(pooled_ports_2.end(),
-            std::find(pooled_ports_2.begin(), pooled_ports_2.end(),
-                      ep2_ch1()->selected_connection()->port()));
-}
-
-// Test that when the "presume_writable_when_fully_relayed" flag is set to
-// true and there's a TURN-TURN candidate pair, it's presumed to be writable
-// as soon as it's created.
-// TODO(deadbeef): Move this and other "presumed writable" tests into a test
-// class that operates on a single P2PTransportChannel, once an appropriate one
-// (which supports TURN servers and TURN candidate gathering) is available.
-TEST_F(P2PTransportChannelTest, TurnToTurnPresumedWritable) {
-  ConfigureEndpoints(OPEN, OPEN, kDefaultPortAllocatorFlags,
-                     kDefaultPortAllocatorFlags);
-  // Only configure one channel so we can control when the remote candidate
-  // is added.
-  GetEndpoint(0)->cd1_.ch_.reset(CreateChannel(
-      0, ICE_CANDIDATE_COMPONENT_DEFAULT, kIceParams[0], kIceParams[1]));
-  IceConfig config;
-  config.presume_writable_when_fully_relayed = true;
-  ep1_ch1()->SetIceConfig(config);
-  ep1_ch1()->MaybeStartGathering();
-  EXPECT_EQ_WAIT(IceGatheringState::kIceGatheringComplete,
-                 ep1_ch1()->gathering_state(), kDefaultTimeout);
-  // Add two remote candidates; a host candidate (with higher priority)
-  // and TURN candidate.
-  ep1_ch1()->AddRemoteCandidate(
-      CreateUdpCandidate(LOCAL_PORT_TYPE, "1.1.1.1", 1, 100));
-  ep1_ch1()->AddRemoteCandidate(
-      CreateUdpCandidate(RELAY_PORT_TYPE, "2.2.2.2", 2, 0));
-  // Expect that the TURN-TURN candidate pair will be prioritized since it's
-  // "probably writable".
-  EXPECT_TRUE(ep1_ch1()->selected_connection() != nullptr);
-  EXPECT_EQ(RELAY_PORT_TYPE, LocalCandidate(ep1_ch1())->type());
-  EXPECT_EQ(RELAY_PORT_TYPE, RemoteCandidate(ep1_ch1())->type());
-  // Also expect that the channel instantly indicates that it's writable since
-  // it has a TURN-TURN pair.
-  EXPECT_TRUE(ep1_ch1()->writable());
-  EXPECT_TRUE(GetEndpoint(0)->ready_to_send_);
-  // Also make sure we can immediately send packets.
-  const char* data = "test";
-  int len = static_cast<int>(strlen(data));
-  EXPECT_EQ(len, SendData(ep1_ch1(), data, len));
-}
-
-// Test that a TURN/peer reflexive candidate pair is also presumed writable.
-TEST_F(P2PTransportChannelTest, TurnToPrflxPresumedWritable) {
-  rtc::ScopedFakeClock fake_clock;
-
-  // We need to add artificial network delay to verify that the connection
-  // is presumed writable before it's actually writable. Without this delay
-  // it would become writable instantly.
-  virtual_socket_server()->set_delay_mean(50);
-  virtual_socket_server()->UpdateDelayDistribution();
-
-  ConfigureEndpoints(NAT_SYMMETRIC, NAT_SYMMETRIC, kDefaultPortAllocatorFlags,
-                     kDefaultPortAllocatorFlags);
-  // We want the remote TURN candidate to show up as prflx. To do this we need
-  // to configure the server to accept packets from an address we haven't
-  // explicitly installed permission for.
-  test_turn_server()->set_enable_permission_checks(false);
-  IceConfig config;
-  config.presume_writable_when_fully_relayed = true;
-  GetEndpoint(0)->cd1_.ch_.reset(CreateChannel(
-      0, ICE_CANDIDATE_COMPONENT_DEFAULT, kIceParams[0], kIceParams[1]));
-  GetEndpoint(1)->cd1_.ch_.reset(CreateChannel(
-      1, ICE_CANDIDATE_COMPONENT_DEFAULT, kIceParams[1], kIceParams[0]));
-  ep1_ch1()->SetIceConfig(config);
-  ep2_ch1()->SetIceConfig(config);
-  // Don't signal candidates from channel 2, so that channel 1 sees the TURN
-  // candidate as peer reflexive.
-  PauseCandidates(1);
-  ep1_ch1()->MaybeStartGathering();
-  ep2_ch1()->MaybeStartGathering();
-
-  // Wait for the TURN<->prflx connection.
-  EXPECT_TRUE_SIMULATED_WAIT(ep1_ch1()->receiving() && ep1_ch1()->writable(),
-                             kShortTimeout, fake_clock);
-  ASSERT_NE(nullptr, ep1_ch1()->selected_connection());
-  EXPECT_EQ(RELAY_PORT_TYPE, LocalCandidate(ep1_ch1())->type());
-  EXPECT_EQ(PRFLX_PORT_TYPE, RemoteCandidate(ep1_ch1())->type());
-  // Make sure that at this point the connection is only presumed writable,
-  // not fully writable.
-  EXPECT_FALSE(ep1_ch1()->selected_connection()->writable());
-
-  // Now wait for it to actually become writable.
-  EXPECT_TRUE_SIMULATED_WAIT(ep1_ch1()->selected_connection()->writable(),
-                             kShortTimeout, fake_clock);
-
-  // Explitly destroy channels, before fake clock is destroyed.
-  DestroyChannels();
-}
-
-// Test that a presumed-writable TURN<->TURN connection is preferred above an
-// unreliable connection (one that has failed to be pinged for some time).
-TEST_F(P2PTransportChannelTest, PresumedWritablePreferredOverUnreliable) {
-  rtc::ScopedFakeClock fake_clock;
-
-  ConfigureEndpoints(NAT_SYMMETRIC, NAT_SYMMETRIC, kDefaultPortAllocatorFlags,
-                     kDefaultPortAllocatorFlags);
-  IceConfig config;
-  config.presume_writable_when_fully_relayed = true;
-  GetEndpoint(0)->cd1_.ch_.reset(CreateChannel(
-      0, ICE_CANDIDATE_COMPONENT_DEFAULT, kIceParams[0], kIceParams[1]));
-  GetEndpoint(1)->cd1_.ch_.reset(CreateChannel(
-      1, ICE_CANDIDATE_COMPONENT_DEFAULT, kIceParams[1], kIceParams[0]));
-  ep1_ch1()->SetIceConfig(config);
-  ep2_ch1()->SetIceConfig(config);
-  ep1_ch1()->MaybeStartGathering();
-  ep2_ch1()->MaybeStartGathering();
-  // Wait for initial connection as usual.
-  EXPECT_TRUE_SIMULATED_WAIT(ep1_ch1()->receiving() && ep1_ch1()->writable() &&
-                                 ep1_ch1()->selected_connection()->writable() &&
-                                 ep2_ch1()->receiving() &&
-                                 ep2_ch1()->writable() &&
-                                 ep2_ch1()->selected_connection()->writable(),
-                             kShortTimeout, fake_clock);
-  const Connection* old_selected_connection = ep1_ch1()->selected_connection();
-  // Destroy the second channel and wait for the current connection on the
-  // first channel to become "unreliable", making it no longer writable.
-  GetEndpoint(1)->cd1_.ch_.reset();
-  EXPECT_TRUE_SIMULATED_WAIT(!ep1_ch1()->writable(), kDefaultTimeout,
-                             fake_clock);
-  EXPECT_NE(nullptr, ep1_ch1()->selected_connection());
-  // Add a remote TURN candidate. The first channel should still have a TURN
-  // port available to make a TURN<->TURN pair that's presumed writable.
-  ep1_ch1()->AddRemoteCandidate(
-      CreateUdpCandidate(RELAY_PORT_TYPE, "2.2.2.2", 2, 0));
-  EXPECT_EQ(RELAY_PORT_TYPE, LocalCandidate(ep1_ch1())->type());
-  EXPECT_EQ(RELAY_PORT_TYPE, RemoteCandidate(ep1_ch1())->type());
-  EXPECT_TRUE(ep1_ch1()->writable());
-  EXPECT_TRUE(GetEndpoint(0)->ready_to_send_);
-  EXPECT_NE(old_selected_connection, ep1_ch1()->selected_connection());
-  // Explitly destroy channels, before fake clock is destroyed.
-  DestroyChannels();
-}
-
-// Ensure that "SignalReadyToSend" is fired as expected with a "presumed
-// writable" connection. Previously this did not work.
-TEST_F(P2PTransportChannelTest, SignalReadyToSendWithPresumedWritable) {
-  ConfigureEndpoints(OPEN, OPEN, kDefaultPortAllocatorFlags,
-                     kDefaultPortAllocatorFlags);
-  // Only test one endpoint, so we can ensure the connection doesn't receive a
-  // binding response and advance beyond being "presumed" writable.
-  GetEndpoint(0)->cd1_.ch_.reset(CreateChannel(
-      0, ICE_CANDIDATE_COMPONENT_DEFAULT, kIceParams[0], kIceParams[1]));
-  IceConfig config;
-  config.presume_writable_when_fully_relayed = true;
-  ep1_ch1()->SetIceConfig(config);
-  ep1_ch1()->MaybeStartGathering();
-  EXPECT_EQ_WAIT(IceGatheringState::kIceGatheringComplete,
-                 ep1_ch1()->gathering_state(), kDefaultTimeout);
-  ep1_ch1()->AddRemoteCandidate(
-      CreateUdpCandidate(RELAY_PORT_TYPE, "1.1.1.1", 1, 0));
-  // Sanity checking the type of the connection.
-  EXPECT_TRUE(ep1_ch1()->selected_connection() != nullptr);
-  EXPECT_EQ(RELAY_PORT_TYPE, LocalCandidate(ep1_ch1())->type());
-  EXPECT_EQ(RELAY_PORT_TYPE, RemoteCandidate(ep1_ch1())->type());
-
-  // Tell the socket server to block packets (returning EWOULDBLOCK).
-  virtual_socket_server()->SetSendingBlocked(true);
-  const char* data = "test";
-  int len = static_cast<int>(strlen(data));
-  EXPECT_EQ(-1, SendData(ep1_ch1(), data, len));
-
-  // Reset |ready_to_send_| flag, which is set to true if the event fires as it
-  // should.
-  GetEndpoint(0)->ready_to_send_ = false;
-  virtual_socket_server()->SetSendingBlocked(false);
-  EXPECT_TRUE(GetEndpoint(0)->ready_to_send_);
-  EXPECT_EQ(len, SendData(ep1_ch1(), data, len));
-}
-
-// Test what happens when we have 2 users behind the same NAT. This can lead
-// to interesting behavior because the STUN server will only give out the
-// address of the outermost NAT.
-class P2PTransportChannelSameNatTest : public P2PTransportChannelTestBase {
- protected:
-  void ConfigureEndpoints(Config nat_type, Config config1, Config config2) {
-    RTC_CHECK_GE(nat_type, NAT_FULL_CONE);
-    RTC_CHECK_LE(nat_type, NAT_SYMMETRIC);
-    rtc::NATSocketServer::Translator* outer_nat =
-        nat()->AddTranslator(kPublicAddrs[0], kNatAddrs[0],
-            static_cast<rtc::NATType>(nat_type - NAT_FULL_CONE));
-    ConfigureEndpoint(outer_nat, 0, config1);
-    ConfigureEndpoint(outer_nat, 1, config2);
-    set_remote_ice_parameter_source(FROM_SETICEPARAMETERS);
-  }
-  void ConfigureEndpoint(rtc::NATSocketServer::Translator* nat,
-                         int endpoint, Config config) {
-    RTC_CHECK(config <= NAT_SYMMETRIC);
-    if (config == OPEN) {
-      AddAddress(endpoint, kPrivateAddrs[endpoint]);
-      nat->AddClient(kPrivateAddrs[endpoint]);
-    } else {
-      AddAddress(endpoint, kCascadedPrivateAddrs[endpoint]);
-      nat->AddTranslator(kPrivateAddrs[endpoint], kCascadedNatAddrs[endpoint],
-          static_cast<rtc::NATType>(config - NAT_FULL_CONE))->AddClient(
-              kCascadedPrivateAddrs[endpoint]);
-    }
-  }
-};
-
-TEST_F(P2PTransportChannelSameNatTest, TestConesBehindSameCone) {
-  ConfigureEndpoints(NAT_FULL_CONE, NAT_FULL_CONE, NAT_FULL_CONE);
-  Test(
-      P2PTransportChannelTestBase::Result("prflx", "udp", "stun", "udp", 1000));
-}
-
-// Test what happens when we have multiple available pathways.
-// In the future we will try different RTTs and configs for the different
-// interfaces, so that we can simulate a user with Ethernet and VPN networks.
-class P2PTransportChannelMultihomedTest : public P2PTransportChannelTestBase {
- public:
-  const Connection* GetConnectionWithRemoteAddress(
-      P2PTransportChannel* channel,
-      const SocketAddress& address) {
-    for (Connection* conn : channel->connections()) {
-      if (conn->remote_candidate().address().EqualIPs(address)) {
-        return conn;
-      }
-    }
-    return nullptr;
-  }
-
-  Connection* GetConnectionWithLocalAddress(P2PTransportChannel* channel,
-                                            const SocketAddress& address) {
-    for (Connection* conn : channel->connections()) {
-      if (conn->local_candidate().address().EqualIPs(address)) {
-        return conn;
-      }
-    }
-    return nullptr;
-  }
-
-  Connection* GetConnection(P2PTransportChannel* channel,
-                            const SocketAddress& local,
-                            const SocketAddress& remote) {
-    for (Connection* conn : channel->connections()) {
-      if (conn->local_candidate().address().EqualIPs(local) &&
-          conn->remote_candidate().address().EqualIPs(remote)) {
-        return conn;
-      }
-    }
-    return nullptr;
-  }
-
-  void DestroyAllButBestConnection(P2PTransportChannel* channel) {
-    const Connection* selected_connection = channel->selected_connection();
-    for (Connection* conn : channel->connections()) {
-      if (conn != selected_connection) {
-        conn->Destroy();
-      }
-    }
-  }
-};
-
-// Test that we can establish connectivity when both peers are multihomed.
-TEST_F(P2PTransportChannelMultihomedTest, TestBasic) {
-  AddAddress(0, kPublicAddrs[0]);
-  AddAddress(0, kAlternateAddrs[0]);
-  AddAddress(1, kPublicAddrs[1]);
-  AddAddress(1, kAlternateAddrs[1]);
-  Test(kLocalUdpToLocalUdp);
-}
-
-// Test that we can quickly switch links if an interface goes down.
-// The controlled side has two interfaces and one will die.
-TEST_F(P2PTransportChannelMultihomedTest, TestFailoverControlledSide) {
-  rtc::ScopedFakeClock clock;
-  AddAddress(0, kPublicAddrs[0]);
-  // Simulate failing over from Wi-Fi to cell interface.
-  AddAddress(1, kPublicAddrs[1], "eth0", rtc::ADAPTER_TYPE_WIFI);
-  AddAddress(1, kAlternateAddrs[1], "wlan0", rtc::ADAPTER_TYPE_CELLULAR);
-
-  // Use only local ports for simplicity.
-  SetAllocatorFlags(0, kOnlyLocalPorts);
-  SetAllocatorFlags(1, kOnlyLocalPorts);
-
-  // Make the receiving timeout shorter for testing.
-  IceConfig config = CreateIceConfig(1000, GATHER_ONCE);
-  // Create channels and let them go writable, as usual.
-  CreateChannels(config, config);
-
-  EXPECT_TRUE_SIMULATED_WAIT(ep1_ch1()->receiving() && ep1_ch1()->writable() &&
-                                 ep2_ch1()->receiving() &&
-                                 ep2_ch1()->writable(),
-                             kMediumTimeout, clock);
-  EXPECT_TRUE(ep1_ch1()->selected_connection() &&
-              ep2_ch1()->selected_connection() &&
-              LocalCandidate(ep1_ch1())->address().EqualIPs(kPublicAddrs[0]) &&
-              RemoteCandidate(ep1_ch1())->address().EqualIPs(kPublicAddrs[1]));
-
-  // Blackhole any traffic to or from the public addrs.
-  LOG(LS_INFO) << "Failing over...";
-  fw()->AddRule(false, rtc::FP_ANY, rtc::FD_ANY, kPublicAddrs[1]);
-  // The selected connections may switch, so keep references to them.
-  const Connection* selected_connection1 = ep1_ch1()->selected_connection();
-  const Connection* selected_connection2 = ep2_ch1()->selected_connection();
-  // We should detect loss of receiving within 1 second or so.
-  EXPECT_TRUE_SIMULATED_WAIT(
-      !selected_connection1->receiving() && !selected_connection2->receiving(),
-      kMediumTimeout, clock);
-
-  // We should switch over to use the alternate addr on both sides
-  // when we are not receiving.
-  EXPECT_TRUE_SIMULATED_WAIT(ep1_ch1()->selected_connection()->receiving() &&
-                                 ep2_ch1()->selected_connection()->receiving(),
-                             kMediumTimeout, clock);
-  EXPECT_TRUE(LocalCandidate(ep1_ch1())->address().EqualIPs(kPublicAddrs[0]));
-  EXPECT_TRUE(
-      RemoteCandidate(ep1_ch1())->address().EqualIPs(kAlternateAddrs[1]));
-  EXPECT_TRUE(
-      LocalCandidate(ep2_ch1())->address().EqualIPs(kAlternateAddrs[1]));
-
-  DestroyChannels();
-}
-
-// Test that we can quickly switch links if an interface goes down.
-// The controlling side has two interfaces and one will die.
-TEST_F(P2PTransportChannelMultihomedTest, TestFailoverControllingSide) {
-  rtc::ScopedFakeClock clock;
-  // Simulate failing over from Wi-Fi to cell interface.
-  AddAddress(0, kPublicAddrs[0], "eth0", rtc::ADAPTER_TYPE_WIFI);
-  AddAddress(0, kAlternateAddrs[0], "wlan0", rtc::ADAPTER_TYPE_CELLULAR);
-  AddAddress(1, kPublicAddrs[1]);
-
-  // Use only local ports for simplicity.
-  SetAllocatorFlags(0, kOnlyLocalPorts);
-  SetAllocatorFlags(1, kOnlyLocalPorts);
-
-  // Make the receiving timeout shorter for testing.
-  IceConfig config = CreateIceConfig(1000, GATHER_ONCE);
-  // Create channels and let them go writable, as usual.
-  CreateChannels(config, config);
-  EXPECT_TRUE_SIMULATED_WAIT(ep1_ch1()->receiving() && ep1_ch1()->writable() &&
-                                 ep2_ch1()->receiving() &&
-                                 ep2_ch1()->writable(),
-                             kMediumTimeout, clock);
-  EXPECT_TRUE(ep1_ch1()->selected_connection() &&
-              ep2_ch1()->selected_connection() &&
-              LocalCandidate(ep1_ch1())->address().EqualIPs(kPublicAddrs[0]) &&
-              RemoteCandidate(ep1_ch1())->address().EqualIPs(kPublicAddrs[1]));
-
-  // Blackhole any traffic to or from the public addrs.
-  LOG(LS_INFO) << "Failing over...";
-  fw()->AddRule(false, rtc::FP_ANY, rtc::FD_ANY, kPublicAddrs[0]);
-  // The selected connections will switch, so keep references to them.
-  const Connection* selected_connection1 = ep1_ch1()->selected_connection();
-  const Connection* selected_connection2 = ep2_ch1()->selected_connection();
-  // We should detect loss of receiving within 1 second or so.
-  EXPECT_TRUE_SIMULATED_WAIT(
-      !selected_connection1->receiving() && !selected_connection2->receiving(),
-      kMediumTimeout, clock);
-
-  // We should switch over to use the alternate addr on both sides
-  // when we are not receiving.
-  EXPECT_TRUE_SIMULATED_WAIT(ep1_ch1()->selected_connection()->receiving() &&
-                                 ep2_ch1()->selected_connection()->receiving(),
-                             kMediumTimeout, clock);
-  EXPECT_TRUE(
-    LocalCandidate(ep1_ch1())->address().EqualIPs(kAlternateAddrs[0]));
-  EXPECT_TRUE(RemoteCandidate(ep1_ch1())->address().EqualIPs(kPublicAddrs[1]));
-  EXPECT_TRUE(
-      RemoteCandidate(ep2_ch1())->address().EqualIPs(kAlternateAddrs[0]));
-
-  DestroyChannels();
-}
-
-// Tests that we can quickly switch links if an interface goes down when
-// there are many connections.
-TEST_F(P2PTransportChannelMultihomedTest, TestFailoverWithManyConnections) {
-  rtc::ScopedFakeClock clock;
-  test_turn_server()->AddInternalSocket(kTurnTcpIntAddr, PROTO_TCP);
-  RelayServerConfig turn_server(RELAY_TURN);
-  turn_server.credentials = kRelayCredentials;
-  turn_server.ports.push_back(ProtocolAddress(kTurnTcpIntAddr, PROTO_TCP));
-  GetAllocator(0)->AddTurnServer(turn_server);
-  GetAllocator(1)->AddTurnServer(turn_server);
-  // Enable IPv6
-  SetAllocatorFlags(
-      0, PORTALLOCATOR_ENABLE_IPV6 | PORTALLOCATOR_ENABLE_IPV6_ON_WIFI);
-  SetAllocatorFlags(
-      1, PORTALLOCATOR_ENABLE_IPV6 | PORTALLOCATOR_ENABLE_IPV6_ON_WIFI);
-  SetAllocationStepDelay(0, kMinimumStepDelay);
-  SetAllocationStepDelay(1, kMinimumStepDelay);
-
-  auto& wifi = kPublicAddrs;
-  auto& cellular = kAlternateAddrs;
-  auto& wifiIpv6 = kIPv6PublicAddrs;
-  auto& cellularIpv6 = kIPv6AlternateAddrs;
-  AddAddress(0, wifi[0], "wifi0", rtc::ADAPTER_TYPE_WIFI);
-  AddAddress(0, wifiIpv6[0], "wifi0", rtc::ADAPTER_TYPE_WIFI);
-  AddAddress(0, cellular[0], "cellular0", rtc::ADAPTER_TYPE_CELLULAR);
-  AddAddress(0, cellularIpv6[0], "cellular0", rtc::ADAPTER_TYPE_CELLULAR);
-  AddAddress(1, wifi[1], "wifi1", rtc::ADAPTER_TYPE_WIFI);
-  AddAddress(1, wifiIpv6[1], "wifi1", rtc::ADAPTER_TYPE_WIFI);
-  AddAddress(1, cellular[1], "cellular1", rtc::ADAPTER_TYPE_CELLULAR);
-  AddAddress(1, cellularIpv6[1], "cellular1", rtc::ADAPTER_TYPE_CELLULAR);
-
-  // Set smaller delay on the TCP TURN server so that TCP TURN candidates
-  // will be created in time.
-  virtual_socket_server()->SetDelayOnAddress(kTurnTcpIntAddr, 1);
-  virtual_socket_server()->SetDelayOnAddress(kTurnUdpExtAddr, 1);
-  virtual_socket_server()->set_delay_mean(500);
-  virtual_socket_server()->UpdateDelayDistribution();
-
-  // Make the receiving timeout shorter for testing.
-  IceConfig config = CreateIceConfig(1000, GATHER_CONTINUALLY);
-  // Create channels and let them go writable, as usual.
-  CreateChannels(config, config, true /* ice_renomination */);
-  EXPECT_TRUE_SIMULATED_WAIT(ep1_ch1()->receiving() && ep1_ch1()->writable() &&
-                                 ep2_ch1()->receiving() &&
-                                 ep2_ch1()->writable(),
-                             kMediumTimeout, clock);
-  EXPECT_TRUE_SIMULATED_WAIT(
-      ep1_ch1()->selected_connection() && ep2_ch1()->selected_connection() &&
-          LocalCandidate(ep1_ch1())->address().EqualIPs(wifiIpv6[0]) &&
-          RemoteCandidate(ep1_ch1())->address().EqualIPs(wifiIpv6[1]),
-      kMediumTimeout, clock);
-
-  // Blackhole any traffic to or from the wifi on endpoint 1.
-  LOG(LS_INFO) << "Failing over...";
-  fw()->AddRule(false, rtc::FP_ANY, rtc::FD_ANY, wifi[0]);
-  fw()->AddRule(false, rtc::FP_ANY, rtc::FD_ANY, wifiIpv6[0]);
-
-  // The selected connections may switch, so keep references to them.
-  const Connection* selected_connection1 = ep1_ch1()->selected_connection();
-  const Connection* selected_connection2 = ep2_ch1()->selected_connection();
-  EXPECT_TRUE_SIMULATED_WAIT(
-      !selected_connection1->receiving() && !selected_connection2->receiving(),
-      kMediumTimeout, clock);
-
-  // Per-network best connections will be pinged at relatively higher rate when
-  // the selected connection becomes not receiving.
-  Connection* per_network_best_connection1 =
-      GetConnection(ep1_ch1(), cellularIpv6[0], wifiIpv6[1]);
-  ASSERT_NE(nullptr, per_network_best_connection1);
-  int64_t last_ping_sent1 = per_network_best_connection1->last_ping_sent();
-  int num_pings_sent1 = per_network_best_connection1->num_pings_sent();
-  EXPECT_TRUE_SIMULATED_WAIT(
-      num_pings_sent1 < per_network_best_connection1->num_pings_sent(),
-      kMediumTimeout, clock);
-  int64_t ping_interval1 =
-      (per_network_best_connection1->last_ping_sent() - last_ping_sent1) /
-      (per_network_best_connection1->num_pings_sent() - num_pings_sent1);
-  constexpr int SCHEDULING_DELAY = 200;
-  EXPECT_LT(
-      ping_interval1,
-      WEAK_OR_STABILIZING_WRITABLE_CONNECTION_PING_INTERVAL + SCHEDULING_DELAY);
-
-  // It should switch over to use the cellular IPv6 addr on endpoint 1 before
-  // it timed out on writing.
-  EXPECT_TRUE_SIMULATED_WAIT(
-      ep1_ch1()->selected_connection()->receiving() &&
-          ep2_ch1()->selected_connection()->receiving() &&
-          RemoteCandidate(ep2_ch1())->address().EqualIPs(cellularIpv6[0]) &&
-          LocalCandidate(ep1_ch1())->address().EqualIPs(cellularIpv6[0]),
-      kMediumTimeout, clock);
-
-  DestroyChannels();
-}
-
-// Test that when the controlling side switches the selected connection,
-// the nomination of the selected connection on the controlled side will
-// increase.
-TEST_F(P2PTransportChannelMultihomedTest, TestIceRenomination) {
-  rtc::ScopedFakeClock clock;
-  // Simulate failing over from Wi-Fi to cell interface.
-  AddAddress(0, kPublicAddrs[0], "eth0", rtc::ADAPTER_TYPE_WIFI);
-  AddAddress(0, kAlternateAddrs[0], "wlan0", rtc::ADAPTER_TYPE_CELLULAR);
-  AddAddress(1, kPublicAddrs[1]);
-
-  // Use only local ports for simplicity.
-  SetAllocatorFlags(0, kOnlyLocalPorts);
-  SetAllocatorFlags(1, kOnlyLocalPorts);
-
-  // We want it to set the remote ICE parameters when creating channels.
-  set_remote_ice_parameter_source(FROM_SETICEPARAMETERS);
-  // Make the receiving timeout shorter for testing.
-  IceConfig config = CreateIceConfig(1000, GATHER_ONCE);
-  // Create channels with ICE renomination and let them go writable as usual.
-  CreateChannels(config, config, true);
-  EXPECT_TRUE_SIMULATED_WAIT(ep1_ch1()->receiving() && ep1_ch1()->writable() &&
-                                 ep2_ch1()->receiving() &&
-                                 ep2_ch1()->writable(),
-                             kMediumTimeout, clock);
-  EXPECT_TRUE_SIMULATED_WAIT(
-      ep2_ch1()->selected_connection()->remote_nomination() > 0 &&
-          ep1_ch1()->selected_connection()->acked_nomination() > 0,
-      kDefaultTimeout, clock);
-  const Connection* selected_connection1 = ep1_ch1()->selected_connection();
-  Connection* selected_connection2 =
-      const_cast<Connection*>(ep2_ch1()->selected_connection());
-  uint32_t remote_nomination2 = selected_connection2->remote_nomination();
-  // |selected_connection2| should not be nominated any more since the previous
-  // nomination has been acknowledged.
-  ConnectSignalNominated(selected_connection2);
-  SIMULATED_WAIT(nominated(), kMediumTimeout, clock);
-  EXPECT_FALSE(nominated());
-
-  // Blackhole any traffic to or from the public addrs.
-  LOG(LS_INFO) << "Failing over...";
-  fw()->AddRule(false, rtc::FP_ANY, rtc::FD_ANY, kPublicAddrs[0]);
-
-  // The selected connection on the controlling side should switch.
-  EXPECT_TRUE_SIMULATED_WAIT(
-      ep1_ch1()->selected_connection() != selected_connection1, kMediumTimeout,
-      clock);
-  // The connection on the controlled side should be nominated again
-  // and have an increased nomination.
-  EXPECT_TRUE_SIMULATED_WAIT(
-      ep2_ch1()->selected_connection()->remote_nomination() >
-          remote_nomination2,
-      kDefaultTimeout, clock);
-
-  DestroyChannels();
-}
-
-// Test that if an interface fails temporarily and then recovers quickly,
-// the selected connection will not switch.
-// The case that it will switch over to the backup connection if the selected
-// connection does not recover after enough time is covered in
-// TestFailoverControlledSide and TestFailoverControllingSide.
-TEST_F(P2PTransportChannelMultihomedTest,
-       TestConnectionSwitchDampeningControlledSide) {
-  rtc::ScopedFakeClock clock;
-  AddAddress(0, kPublicAddrs[0]);
-  // Simulate failing over from Wi-Fi to cell interface.
-  AddAddress(1, kPublicAddrs[1], "eth0", rtc::ADAPTER_TYPE_WIFI);
-  AddAddress(1, kAlternateAddrs[1], "wlan0", rtc::ADAPTER_TYPE_CELLULAR);
-
-  // Use only local ports for simplicity.
-  SetAllocatorFlags(0, kOnlyLocalPorts);
-  SetAllocatorFlags(1, kOnlyLocalPorts);
-
-  // Create channels and let them go writable, as usual.
-  CreateChannels();
-
-  EXPECT_TRUE_SIMULATED_WAIT(ep1_ch1()->receiving() && ep1_ch1()->writable() &&
-                                 ep2_ch1()->receiving() &&
-                                 ep2_ch1()->writable(),
-                             kMediumTimeout, clock);
-  EXPECT_TRUE(ep1_ch1()->selected_connection() &&
-              ep2_ch1()->selected_connection() &&
-              LocalCandidate(ep1_ch1())->address().EqualIPs(kPublicAddrs[0]) &&
-              RemoteCandidate(ep1_ch1())->address().EqualIPs(kPublicAddrs[1]));
-
-  // Make the receiving timeout shorter for testing.
-  IceConfig config = CreateIceConfig(1000, GATHER_ONCE);
-  ep1_ch1()->SetIceConfig(config);
-  ep2_ch1()->SetIceConfig(config);
-  reset_selected_candidate_pair_switches();
-
-  // Blackhole any traffic to or from the public addrs.
-  LOG(LS_INFO) << "Failing over...";
-  fw()->AddRule(false, rtc::FP_ANY, rtc::FD_ANY, kPublicAddrs[1]);
-
-  // The selected connections may switch, so keep references to them.
-  const Connection* selected_connection1 = ep1_ch1()->selected_connection();
-  const Connection* selected_connection2 = ep2_ch1()->selected_connection();
-  // We should detect loss of receiving within 1 second or so.
-  EXPECT_TRUE_SIMULATED_WAIT(
-      !selected_connection1->receiving() && !selected_connection2->receiving(),
-      kMediumTimeout, clock);
-  // After a short while, the link recovers itself.
-  SIMULATED_WAIT(false, 10, clock);
-  fw()->ClearRules();
-
-  // We should remain on the public address on both sides and no connection
-  // switches should have happened.
-  EXPECT_TRUE_SIMULATED_WAIT(ep1_ch1()->selected_connection()->receiving() &&
-                                 ep2_ch1()->selected_connection()->receiving(),
-                             kMediumTimeout, clock);
-  EXPECT_TRUE(RemoteCandidate(ep1_ch1())->address().EqualIPs(kPublicAddrs[1]));
-  EXPECT_TRUE(LocalCandidate(ep2_ch1())->address().EqualIPs(kPublicAddrs[1]));
-  EXPECT_EQ(0, reset_selected_candidate_pair_switches());
-
-  DestroyChannels();
-}
-
-// Test that if an interface fails temporarily and then recovers quickly,
-// the selected connection will not switch.
-TEST_F(P2PTransportChannelMultihomedTest,
-       TestConnectionSwitchDampeningControllingSide) {
-  rtc::ScopedFakeClock clock;
-  // Simulate failing over from Wi-Fi to cell interface.
-  AddAddress(0, kPublicAddrs[0], "eth0", rtc::ADAPTER_TYPE_WIFI);
-  AddAddress(0, kAlternateAddrs[0], "wlan0", rtc::ADAPTER_TYPE_CELLULAR);
-  AddAddress(1, kPublicAddrs[1]);
-
-  // Use only local ports for simplicity.
-  SetAllocatorFlags(0, kOnlyLocalPorts);
-  SetAllocatorFlags(1, kOnlyLocalPorts);
-
-  // Create channels and let them go writable, as usual.
-  CreateChannels();
-  EXPECT_TRUE_SIMULATED_WAIT(ep1_ch1()->receiving() && ep1_ch1()->writable() &&
-                                 ep2_ch1()->receiving() &&
-                                 ep2_ch1()->writable(),
-                             kMediumTimeout, clock);
-  EXPECT_TRUE(ep1_ch1()->selected_connection() &&
-              ep2_ch1()->selected_connection() &&
-              LocalCandidate(ep1_ch1())->address().EqualIPs(kPublicAddrs[0]) &&
-              RemoteCandidate(ep1_ch1())->address().EqualIPs(kPublicAddrs[1]));
-
-  // Make the receiving timeout shorter for testing.
-  IceConfig config = CreateIceConfig(1000, GATHER_ONCE);
-  ep1_ch1()->SetIceConfig(config);
-  ep2_ch1()->SetIceConfig(config);
-  reset_selected_candidate_pair_switches();
-
-  // Blackhole any traffic to or from the public addrs.
-  LOG(LS_INFO) << "Failing over...";
-  fw()->AddRule(false, rtc::FP_ANY, rtc::FD_ANY, kPublicAddrs[0]);
-  // The selected connections may switch, so keep references to them.
-  const Connection* selected_connection1 = ep1_ch1()->selected_connection();
-  const Connection* selected_connection2 = ep2_ch1()->selected_connection();
-  // We should detect loss of receiving within 1 second or so.
-  EXPECT_TRUE_SIMULATED_WAIT(
-      !selected_connection1->receiving() && !selected_connection2->receiving(),
-      kMediumTimeout, clock);
-  // The link recovers after a short while.
-  SIMULATED_WAIT(false, 10, clock);
-  fw()->ClearRules();
-
-  // We should not switch to the alternate addr on both sides because of the
-  // dampening.
-  EXPECT_TRUE_SIMULATED_WAIT(ep1_ch1()->selected_connection()->receiving() &&
-                                 ep2_ch1()->selected_connection()->receiving(),
-                             kMediumTimeout, clock);
-  EXPECT_TRUE(LocalCandidate(ep1_ch1())->address().EqualIPs(kPublicAddrs[0]));
-  EXPECT_TRUE(RemoteCandidate(ep2_ch1())->address().EqualIPs(kPublicAddrs[0]));
-  EXPECT_EQ(0, reset_selected_candidate_pair_switches());
-  DestroyChannels();
-}
-
-// Tests that if the remote side's network failed, it won't cause the local
-// side to switch connections and networks.
-TEST_F(P2PTransportChannelMultihomedTest, TestRemoteFailover) {
-  rtc::ScopedFakeClock clock;
-  // The interface names are chosen so that |cellular| would have higher
-  // candidate priority and higher cost.
-  auto& wifi = kPublicAddrs;
-  auto& cellular = kAlternateAddrs;
-  AddAddress(0, wifi[0], "wifi0", rtc::ADAPTER_TYPE_WIFI);
-  AddAddress(0, cellular[0], "cellular0", rtc::ADAPTER_TYPE_CELLULAR);
-  AddAddress(1, wifi[1], "wifi0", rtc::ADAPTER_TYPE_WIFI);
-
-  // Use only local ports for simplicity.
-  SetAllocatorFlags(0, kOnlyLocalPorts);
-  SetAllocatorFlags(1, kOnlyLocalPorts);
-  // Create channels and let them go writable, as usual.
-  CreateChannels();
-  // Make the receiving timeout shorter for testing.
-  // Set the backup connection ping interval to 25s.
-  IceConfig config = CreateIceConfig(1000, GATHER_ONCE, 25000);
-  // Ping the best connection more frequently since we don't have traffic.
-  config.stable_writable_connection_ping_interval = 900;
-  ep1_ch1()->SetIceConfig(config);
-  ep2_ch1()->SetIceConfig(config);
-  // Need to wait to make sure the connections on both networks are writable.
-  EXPECT_TRUE_SIMULATED_WAIT(ep1_ch1()->receiving() && ep1_ch1()->writable() &&
-                                 ep2_ch1()->receiving() &&
-                                 ep2_ch1()->writable(),
-                             kMediumTimeout, clock);
-  EXPECT_TRUE_SIMULATED_WAIT(
-      ep1_ch1()->selected_connection() &&
-          LocalCandidate(ep1_ch1())->address().EqualIPs(wifi[0]) &&
-          RemoteCandidate(ep1_ch1())->address().EqualIPs(wifi[1]),
-      kDefaultTimeout, clock);
-  Connection* backup_conn =
-      GetConnectionWithLocalAddress(ep1_ch1(), cellular[0]);
-  ASSERT_NE(nullptr, backup_conn);
-  // After a short while, the backup connection will be writable but not
-  // receiving because backup connection is pinged at a slower rate.
-  EXPECT_TRUE_SIMULATED_WAIT(
-      backup_conn->writable() && !backup_conn->receiving(), kDefaultTimeout,
-      clock);
-  reset_selected_candidate_pair_switches();
-  // Blackhole any traffic to or from the remote WiFi networks.
-  LOG(LS_INFO) << "Failing over...";
-  fw()->AddRule(false, rtc::FP_ANY, rtc::FD_ANY, wifi[1]);
-
-  int num_switches = 0;
-  SIMULATED_WAIT((num_switches = reset_selected_candidate_pair_switches()) > 0,
-                 20000, clock);
-  EXPECT_EQ(0, num_switches);
-  DestroyChannels();
-}
-
-// Tests that a Wifi-Wifi connection has the highest precedence.
-TEST_F(P2PTransportChannelMultihomedTest, TestPreferWifiToWifiConnection) {
-  // The interface names are chosen so that |cellular| would have higher
-  // candidate priority if it is not for the network type.
-  auto& wifi = kAlternateAddrs;
-  auto& cellular = kPublicAddrs;
-  AddAddress(0, wifi[0], "test0", rtc::ADAPTER_TYPE_WIFI);
-  AddAddress(0, cellular[0], "test1", rtc::ADAPTER_TYPE_CELLULAR);
-  AddAddress(1, wifi[1], "test0", rtc::ADAPTER_TYPE_WIFI);
-  AddAddress(1, cellular[1], "test1", rtc::ADAPTER_TYPE_CELLULAR);
-
-  // Use only local ports for simplicity.
-  SetAllocatorFlags(0, kOnlyLocalPorts);
-  SetAllocatorFlags(1, kOnlyLocalPorts);
-
-  // Create channels and let them go writable, as usual.
-  CreateChannels();
-
-  EXPECT_TRUE_WAIT_MARGIN(ep1_ch1()->receiving() && ep1_ch1()->writable() &&
-                              ep2_ch1()->receiving() && ep2_ch1()->writable(),
-                          1000, 1000);
-  // Need to wait to make sure the connections on both networks are writable.
-  EXPECT_TRUE_WAIT(ep1_ch1()->selected_connection() &&
-                       LocalCandidate(ep1_ch1())->address().EqualIPs(wifi[0]) &&
-                       RemoteCandidate(ep1_ch1())->address().EqualIPs(wifi[1]),
-                   1000);
-  EXPECT_TRUE_WAIT(ep2_ch1()->selected_connection() &&
-                       LocalCandidate(ep2_ch1())->address().EqualIPs(wifi[1]) &&
-                       RemoteCandidate(ep2_ch1())->address().EqualIPs(wifi[0]),
-                   1000);
-  DestroyChannels();
-}
-
-// Tests that a Wifi-Cellular connection has higher precedence than
-// a Cellular-Cellular connection.
-TEST_F(P2PTransportChannelMultihomedTest, TestPreferWifiOverCellularNetwork) {
-  // The interface names are chosen so that |cellular| would have higher
-  // candidate priority if it is not for the network type.
-  auto& wifi = kAlternateAddrs;
-  auto& cellular = kPublicAddrs;
-  AddAddress(0, cellular[0], "test1", rtc::ADAPTER_TYPE_CELLULAR);
-  AddAddress(1, wifi[1], "test0", rtc::ADAPTER_TYPE_WIFI);
-  AddAddress(1, cellular[1], "test1", rtc::ADAPTER_TYPE_CELLULAR);
-
-  // Use only local ports for simplicity.
-  SetAllocatorFlags(0, kOnlyLocalPorts);
-  SetAllocatorFlags(1, kOnlyLocalPorts);
-
-  // Create channels and let them go writable, as usual.
-  CreateChannels();
-
-  EXPECT_TRUE_WAIT_MARGIN(ep1_ch1()->receiving() && ep1_ch1()->writable() &&
-                              ep2_ch1()->receiving() && ep2_ch1()->writable(),
-                          1000, 1000);
-  // Need to wait to make sure the connections on both networks are writable.
-  EXPECT_TRUE_WAIT(ep1_ch1()->selected_connection() &&
-                       RemoteCandidate(ep1_ch1())->address().EqualIPs(wifi[1]),
-                   1000);
-  EXPECT_TRUE_WAIT(ep2_ch1()->selected_connection() &&
-                       LocalCandidate(ep2_ch1())->address().EqualIPs(wifi[1]),
-                   1000);
-  DestroyChannels();
-}
-
-// Test that the backup connection is pinged at a rate no faster than
-// what was configured.
-TEST_F(P2PTransportChannelMultihomedTest, TestPingBackupConnectionRate) {
-  AddAddress(0, kPublicAddrs[0]);
-  // Adding alternate address will make sure |kPublicAddrs| has the higher
-  // priority than others. This is due to FakeNetwork::AddInterface method.
-  AddAddress(1, kAlternateAddrs[1]);
-  AddAddress(1, kPublicAddrs[1]);
-
-  // Use only local ports for simplicity.
-  SetAllocatorFlags(0, kOnlyLocalPorts);
-  SetAllocatorFlags(1, kOnlyLocalPorts);
-
-  // Create channels and let them go writable, as usual.
-  CreateChannels();
-  EXPECT_TRUE_WAIT_MARGIN(ep1_ch1()->receiving() && ep1_ch1()->writable() &&
-                              ep2_ch1()->receiving() && ep2_ch1()->writable(),
-                          1000, 1000);
-  int backup_ping_interval = 2000;
-  ep2_ch1()->SetIceConfig(
-      CreateIceConfig(2000, GATHER_ONCE, backup_ping_interval));
-  // After the state becomes COMPLETED, the backup connection will be pinged
-  // once every |backup_ping_interval| milliseconds.
-  ASSERT_TRUE_WAIT(ep2_ch1()->GetState() == IceTransportState::STATE_COMPLETED,
-                   1000);
-  const std::vector<Connection*>& connections = ep2_ch1()->connections();
-  ASSERT_EQ(2U, connections.size());
-  Connection* backup_conn = connections[1];
-  EXPECT_TRUE_WAIT(backup_conn->writable(), kMediumTimeout);
-  int64_t last_ping_response_ms = backup_conn->last_ping_response_received();
-  EXPECT_TRUE_WAIT(
-      last_ping_response_ms < backup_conn->last_ping_response_received(),
-      kDefaultTimeout);
-  int time_elapsed =
-      backup_conn->last_ping_response_received() - last_ping_response_ms;
-  LOG(LS_INFO) << "Time elapsed: " << time_elapsed;
-  EXPECT_GE(time_elapsed, backup_ping_interval);
-
-  DestroyChannels();
-}
-
-TEST_F(P2PTransportChannelMultihomedTest, TestGetState) {
-  rtc::ScopedFakeClock clock;
-  AddAddress(0, kAlternateAddrs[0]);
-  AddAddress(0, kPublicAddrs[0]);
-  AddAddress(1, kPublicAddrs[1]);
-  // Create channels and let them go writable, as usual.
-  CreateChannels();
-
-  // Both transport channels will reach STATE_COMPLETED quickly.
-  EXPECT_EQ_SIMULATED_WAIT(IceTransportState::STATE_COMPLETED,
-                           ep1_ch1()->GetState(), kShortTimeout, clock);
-  EXPECT_EQ_SIMULATED_WAIT(IceTransportState::STATE_COMPLETED,
-                           ep2_ch1()->GetState(), kShortTimeout, clock);
-}
-
-// Tests that when a network interface becomes inactive, if Continual Gathering
-// policy is GATHER_CONTINUALLY, the ports associated with that network
-// will be removed from the port list of the channel, and the respective
-// remote candidates on the other participant will be removed eventually.
-TEST_F(P2PTransportChannelMultihomedTest, TestNetworkBecomesInactive) {
-  rtc::ScopedFakeClock clock;
-  AddAddress(0, kPublicAddrs[0]);
-  AddAddress(1, kPublicAddrs[1]);
-  // Create channels and let them go writable, as usual.
-  IceConfig ep1_config = CreateIceConfig(2000, GATHER_CONTINUALLY);
-  IceConfig ep2_config = CreateIceConfig(2000, GATHER_ONCE);
-  CreateChannels(ep1_config, ep2_config);
-
-  SetAllocatorFlags(0, kOnlyLocalPorts);
-  SetAllocatorFlags(1, kOnlyLocalPorts);
-  EXPECT_TRUE_SIMULATED_WAIT(ep1_ch1()->receiving() && ep1_ch1()->writable() &&
-                                 ep2_ch1()->receiving() &&
-                                 ep2_ch1()->writable(),
-                             kDefaultTimeout, clock);
-  // More than one port has been created.
-  EXPECT_LE(1U, ep1_ch1()->ports().size());
-  // Endpoint 1 enabled continual gathering; the port will be removed
-  // when the interface is removed.
-  RemoveAddress(0, kPublicAddrs[0]);
-  EXPECT_TRUE(ep1_ch1()->ports().empty());
-  // The remote candidates will be removed eventually.
-  EXPECT_TRUE_SIMULATED_WAIT(ep2_ch1()->remote_candidates().empty(), 1000,
-                             clock);
-
-  size_t num_ports = ep2_ch1()->ports().size();
-  EXPECT_LE(1U, num_ports);
-  size_t num_remote_candidates = ep1_ch1()->remote_candidates().size();
-  // Endpoint 2 did not enable continual gathering; the local port will still be
-  // removed when the interface is removed but the remote candidates on the
-  // other participant will not be removed.
-  RemoveAddress(1, kPublicAddrs[1]);
-
-  EXPECT_EQ_SIMULATED_WAIT(0U, ep2_ch1()->ports().size(), kDefaultTimeout,
-                           clock);
-  SIMULATED_WAIT(0U == ep1_ch1()->remote_candidates().size(), 500, clock);
-  EXPECT_EQ(num_remote_candidates, ep1_ch1()->remote_candidates().size());
-
-  DestroyChannels();
-}
-
-// Tests that continual gathering will create new connections when a new
-// interface is added.
-TEST_F(P2PTransportChannelMultihomedTest,
-       TestContinualGatheringOnNewInterface) {
-  auto& wifi = kAlternateAddrs;
-  auto& cellular = kPublicAddrs;
-  AddAddress(0, wifi[0], "test_wifi0", rtc::ADAPTER_TYPE_WIFI);
-  AddAddress(1, cellular[1], "test_cell1", rtc::ADAPTER_TYPE_CELLULAR);
-  // Set continual gathering policy.
-  IceConfig continual_gathering_config =
-      CreateIceConfig(1000, GATHER_CONTINUALLY);
-  CreateChannels(continual_gathering_config, continual_gathering_config);
-  SetAllocatorFlags(0, kOnlyLocalPorts);
-  SetAllocatorFlags(1, kOnlyLocalPorts);
-  EXPECT_TRUE_WAIT_MARGIN(ep1_ch1()->receiving() && ep1_ch1()->writable() &&
-                              ep2_ch1()->receiving() && ep2_ch1()->writable(),
-                          kDefaultTimeout, kDefaultTimeout);
-
-  // Add a new wifi interface on end point 2. We should expect a new connection
-  // to be created and the new one will be the best connection.
-  AddAddress(1, wifi[1], "test_wifi1", rtc::ADAPTER_TYPE_WIFI);
-  const Connection* conn;
-  EXPECT_TRUE_WAIT((conn = ep1_ch1()->selected_connection()) != nullptr &&
-                       conn->remote_candidate().address().EqualIPs(wifi[1]),
-                   kDefaultTimeout);
-  EXPECT_TRUE_WAIT((conn = ep2_ch1()->selected_connection()) != nullptr &&
-                       conn->local_candidate().address().EqualIPs(wifi[1]),
-                   kDefaultTimeout);
-
-  // Add a new cellular interface on end point 1, we should expect a new
-  // backup connection created using this new interface.
-  AddAddress(0, cellular[0], "test_cellular0", rtc::ADAPTER_TYPE_CELLULAR);
-  EXPECT_TRUE_WAIT(
-      ep1_ch1()->GetState() == IceTransportState::STATE_COMPLETED &&
-          (conn = GetConnectionWithLocalAddress(ep1_ch1(), cellular[0])) !=
-              nullptr &&
-          conn != ep1_ch1()->selected_connection() && conn->writable(),
-      kDefaultTimeout);
-  EXPECT_TRUE_WAIT(
-      ep2_ch1()->GetState() == IceTransportState::STATE_COMPLETED &&
-          (conn = GetConnectionWithRemoteAddress(ep2_ch1(), cellular[0])) !=
-              nullptr &&
-          conn != ep2_ch1()->selected_connection() && conn->receiving(),
-      kDefaultTimeout);
-
-  DestroyChannels();
-}
-
-// Tests that we can switch links via continual gathering.
-TEST_F(P2PTransportChannelMultihomedTest,
-       TestSwitchLinksViaContinualGathering) {
-  rtc::ScopedFakeClock clock;
-  AddAddress(0, kPublicAddrs[0]);
-  AddAddress(1, kPublicAddrs[1]);
-  // Use only local ports for simplicity.
-  SetAllocatorFlags(0, kOnlyLocalPorts);
-  SetAllocatorFlags(1, kOnlyLocalPorts);
-
-  // Set continual gathering policy.
-  IceConfig continual_gathering_config =
-      CreateIceConfig(1000, GATHER_CONTINUALLY);
-  // Create channels and let them go writable, as usual.
-  CreateChannels(continual_gathering_config, continual_gathering_config);
-  EXPECT_TRUE_SIMULATED_WAIT(ep1_ch1()->receiving() && ep1_ch1()->writable() &&
-                                 ep2_ch1()->receiving() &&
-                                 ep2_ch1()->writable(),
-                             kMediumTimeout, clock);
-  EXPECT_TRUE(
-      ep1_ch1()->selected_connection() && ep2_ch1()->selected_connection() &&
-      LocalCandidate(ep1_ch1())->address().EqualIPs(kPublicAddrs[0]) &&
-      RemoteCandidate(ep1_ch1())->address().EqualIPs(kPublicAddrs[1]));
-
-  // Add the new address first and then remove the other one.
-  LOG(LS_INFO) << "Draining...";
-  AddAddress(1, kAlternateAddrs[1]);
-  RemoveAddress(1, kPublicAddrs[1]);
-  // We should switch to use the alternate address after an exchange of pings.
-  EXPECT_TRUE_SIMULATED_WAIT(
-      ep1_ch1()->selected_connection() && ep2_ch1()->selected_connection() &&
-          LocalCandidate(ep1_ch1())->address().EqualIPs(kPublicAddrs[0]) &&
-          RemoteCandidate(ep1_ch1())->address().EqualIPs(kAlternateAddrs[1]),
-      kMediumTimeout, clock);
-
-  // Remove one address first and then add another address.
-  LOG(LS_INFO) << "Draining again...";
-  RemoveAddress(1, kAlternateAddrs[1]);
-  AddAddress(1, kAlternateAddrs[0]);
-  EXPECT_TRUE_SIMULATED_WAIT(
-      ep1_ch1()->selected_connection() && ep2_ch1()->selected_connection() &&
-          LocalCandidate(ep1_ch1())->address().EqualIPs(kPublicAddrs[0]) &&
-          RemoteCandidate(ep1_ch1())->address().EqualIPs(kAlternateAddrs[0]),
-      kMediumTimeout, clock);
-
-  DestroyChannels();
-}
-
-/*
-TODO(honghaiz) Once continual gathering fully supports
-GATHER_CONTINUALLY_AND_RECOVER, put this test back.
-
-// Tests that if the backup connections are lost and then the interface with the
-// selected connection is gone, continual gathering will restore the
-// connectivity.
-TEST_F(P2PTransportChannelMultihomedTest,
-       TestBackupConnectionLostThenInterfaceGone) {
-  rtc::ScopedFakeClock clock;
-  auto& wifi = kAlternateAddrs;
-  auto& cellular = kPublicAddrs;
-  AddAddress(0, wifi[0], "test_wifi0", rtc::ADAPTER_TYPE_WIFI);
-  AddAddress(0, cellular[0], "test_cell0", rtc::ADAPTER_TYPE_CELLULAR);
-  AddAddress(1, wifi[1], "test_wifi1", rtc::ADAPTER_TYPE_WIFI);
-  AddAddress(1, cellular[1], "test_cell1", rtc::ADAPTER_TYPE_CELLULAR);
-  // Use only local ports for simplicity.
-  SetAllocatorFlags(0, kOnlyLocalPorts);
-  SetAllocatorFlags(1, kOnlyLocalPorts);
-
-  // Set continual gathering policy.
-  IceConfig config = CreateIceConfig(1000, GATHER_CONTINUALLY_AND_RECOVER);
-  // Create channels and let them go writable, as usual.
-  CreateChannels(config, config);
-  EXPECT_TRUE_SIMULATED_WAIT(ep1_ch1()->receiving() && ep1_ch1()->writable() &&
-                              ep2_ch1()->receiving() && ep2_ch1()->writable(),
-                          kMediumTimeout, clock);
-  EXPECT_TRUE(ep1_ch1()->selected_connection() &&
-              ep2_ch1()->selected_connection() &&
-              LocalCandidate(ep1_ch1())->address().EqualIPs(wifi[0]) &&
-              RemoteCandidate(ep1_ch1())->address().EqualIPs(wifi[1]));
-
-  // First destroy all backup connection.
-  DestroyAllButBestConnection(ep1_ch1());
-
-  SIMULATED_WAIT(false, 10, clock);
-  // Then the interface of the best connection goes away.
-  RemoveAddress(0, wifi[0]);
-  EXPECT_TRUE_SIMULATED_WAIT(
-      ep1_ch1()->selected_connection() && ep2_ch1()->selected_connection() &&
-          LocalCandidate(ep1_ch1())->address().EqualIPs(cellular[0]) &&
-          RemoteCandidate(ep1_ch1())->address().EqualIPs(wifi[1]),
-      kMediumTimeout, clock);
-
-  DestroyChannels();
-}
-*/
-
-// Tests that the backup connection will be restored after it is destroyed.
-TEST_F(P2PTransportChannelMultihomedTest, TestRestoreBackupConnection) {
-  rtc::ScopedFakeClock clock;
-  auto& wifi = kAlternateAddrs;
-  auto& cellular = kPublicAddrs;
-  AddAddress(0, wifi[0], "test_wifi0", rtc::ADAPTER_TYPE_WIFI);
-  AddAddress(0, cellular[0], "test_cell0", rtc::ADAPTER_TYPE_CELLULAR);
-  AddAddress(1, wifi[1], "test_wifi1", rtc::ADAPTER_TYPE_WIFI);
-  AddAddress(1, cellular[1], "test_cell1", rtc::ADAPTER_TYPE_CELLULAR);
-  // Use only local ports for simplicity.
-  SetAllocatorFlags(0, kOnlyLocalPorts);
-  SetAllocatorFlags(1, kOnlyLocalPorts);
-
-  // Create channels and let them go writable, as usual.
-  IceConfig config = CreateIceConfig(1000, GATHER_CONTINUALLY);
-  config.regather_on_failed_networks_interval = rtc::Optional<int>(2000);
-  CreateChannels(config, config);
-  EXPECT_TRUE_SIMULATED_WAIT(ep1_ch1()->receiving() && ep1_ch1()->writable() &&
-                                 ep2_ch1()->receiving() &&
-                                 ep2_ch1()->writable(),
-                             kMediumTimeout, clock);
-  EXPECT_TRUE(ep1_ch1()->selected_connection() &&
-              ep2_ch1()->selected_connection() &&
-              LocalCandidate(ep1_ch1())->address().EqualIPs(wifi[0]) &&
-              RemoteCandidate(ep1_ch1())->address().EqualIPs(wifi[1]));
-
-  // Destroy all backup connections.
-  DestroyAllButBestConnection(ep1_ch1());
-  // Ensure the backup connection is removed first.
-  EXPECT_TRUE_SIMULATED_WAIT(
-      GetConnectionWithLocalAddress(ep1_ch1(), cellular[0]) == nullptr,
-      kDefaultTimeout, clock);
-  const Connection* conn;
-  EXPECT_TRUE_SIMULATED_WAIT(
-      (conn = GetConnectionWithLocalAddress(ep1_ch1(), cellular[0])) !=
-              nullptr &&
-          conn != ep1_ch1()->selected_connection() && conn->writable(),
-      kDefaultTimeout, clock);
-
-  DestroyChannels();
-}
-
-// A collection of tests which tests a single P2PTransportChannel by sending
-// pings.
-class P2PTransportChannelPingTest : public testing::Test,
-                                    public sigslot::has_slots<> {
- public:
-  P2PTransportChannelPingTest()
-      : vss_(new rtc::VirtualSocketServer()), thread_(vss_.get()) {}
-
- protected:
-  void PrepareChannel(P2PTransportChannel* ch) {
-    ch->SetIceRole(ICEROLE_CONTROLLING);
-    ch->SetIceParameters(kIceParams[0]);
-    ch->SetRemoteIceParameters(kIceParams[1]);
-    ch->SignalSelectedCandidatePairChanged.connect(
-        this, &P2PTransportChannelPingTest::OnSelectedCandidatePairChanged);
-    ch->SignalReadyToSend.connect(this,
-                                  &P2PTransportChannelPingTest::OnReadyToSend);
-    ch->SignalStateChanged.connect(
-        this, &P2PTransportChannelPingTest::OnChannelStateChanged);
-  }
-
-  Connection* WaitForConnectionTo(P2PTransportChannel* ch,
-                                  const std::string& ip,
-                                  int port_num,
-                                  rtc::FakeClock* clock = nullptr) {
-    if (clock == nullptr) {
-      EXPECT_TRUE_WAIT(GetConnectionTo(ch, ip, port_num) != nullptr,
-                       kMediumTimeout);
-    } else {
-      EXPECT_TRUE_SIMULATED_WAIT(GetConnectionTo(ch, ip, port_num) != nullptr,
-                                 kMediumTimeout, *clock);
-    }
-    return GetConnectionTo(ch, ip, port_num);
-  }
-
-  Port* GetPort(P2PTransportChannel* ch) {
-    if (ch->ports().empty()) {
-      return nullptr;
-    }
-    return static_cast<Port*>(ch->ports()[0]);
-  }
-
-  Port* GetPrunedPort(P2PTransportChannel* ch) {
-    if (ch->pruned_ports().empty()) {
-      return nullptr;
-    }
-    return static_cast<Port*>(ch->pruned_ports()[0]);
-  }
-
-  Connection* GetConnectionTo(P2PTransportChannel* ch,
-                              const std::string& ip,
-                              int port_num) {
-    Port* port = GetPort(ch);
-    if (!port) {
-      return nullptr;
-    }
-    return port->GetConnection(rtc::SocketAddress(ip, port_num));
-  }
-
-  Connection* FindNextPingableConnectionAndPingIt(P2PTransportChannel* ch) {
-    Connection* conn = ch->FindNextPingableConnection();
-    if (conn) {
-      ch->MarkConnectionPinged(conn);
-    }
-    return conn;
-  }
-
-  int SendData(IceTransportInternal& channel,
-               const char* data,
-               size_t len,
-               int packet_id) {
-    rtc::PacketOptions options;
-    options.packet_id = packet_id;
-    return channel.SendPacket(data, len, options, 0);
-  }
-
-  Connection* CreateConnectionWithCandidate(P2PTransportChannel& channel,
-                                            rtc::ScopedFakeClock& clock,
-                                            const std::string& ip_addr,
-                                            int port,
-                                            int priority,
-                                            bool writable) {
-    channel.AddRemoteCandidate(
-        CreateUdpCandidate(LOCAL_PORT_TYPE, ip_addr, port, priority));
-    EXPECT_TRUE_SIMULATED_WAIT(
-        GetConnectionTo(&channel, ip_addr, port) != nullptr, kMediumTimeout,
-        clock);
-    Connection* conn = GetConnectionTo(&channel, ip_addr, port);
-
-    if (conn && writable) {
-      conn->ReceivedPingResponse(LOW_RTT, "id");  // make it writable
-    }
-    return conn;
-  }
-
-  void NominateConnection(Connection* conn, uint32_t remote_nomination = 1U) {
-    conn->set_remote_nomination(remote_nomination);
-    conn->SignalNominated(conn);
-  }
-
-  void OnSelectedCandidatePairChanged(
-      IceTransportInternal* transport_channel,
-      CandidatePairInterface* selected_candidate_pair,
-      int last_sent_packet_id,
-      bool ready_to_send) {
-    last_selected_candidate_pair_ = selected_candidate_pair;
-    last_sent_packet_id_ = last_sent_packet_id;
-    ++selected_candidate_pair_switches_;
-  }
-
-  void ReceivePingOnConnection(Connection* conn,
-                               const std::string& remote_ufrag,
-                               int priority,
-                               uint32_t nomination = 0) {
-    IceMessage msg;
-    msg.SetType(STUN_BINDING_REQUEST);
-    msg.AddAttribute(rtc::MakeUnique<StunByteStringAttribute>(
-        STUN_ATTR_USERNAME,
-        conn->local_candidate().username() + ":" + remote_ufrag));
-    msg.AddAttribute(
-        rtc::MakeUnique<StunUInt32Attribute>(STUN_ATTR_PRIORITY, priority));
-    if (nomination != 0) {
-      msg.AddAttribute(rtc::MakeUnique<StunUInt32Attribute>(
-          STUN_ATTR_NOMINATION, nomination));
-    }
-    msg.SetTransactionID(rtc::CreateRandomString(kStunTransactionIdLength));
-    msg.AddMessageIntegrity(conn->local_candidate().password());
-    msg.AddFingerprint();
-    rtc::ByteBufferWriter buf;
-    msg.Write(&buf);
-    conn->OnReadPacket(buf.Data(), buf.Length(), rtc::CreatePacketTime(0));
-  }
-
-  void OnReadyToSend(rtc::PacketTransportInternal* transport) {
-    channel_ready_to_send_ = true;
-  }
-  void OnChannelStateChanged(IceTransportInternal* channel) {
-    channel_state_ = channel->GetState();
-  }
-
-  CandidatePairInterface* last_selected_candidate_pair() {
-    return last_selected_candidate_pair_;
-  }
-  int last_sent_packet_id() { return last_sent_packet_id_; }
-  bool channel_ready_to_send() { return channel_ready_to_send_; }
-  void reset_channel_ready_to_send() { channel_ready_to_send_ = false; }
-  IceTransportState channel_state() { return channel_state_; }
-  int reset_selected_candidate_pair_switches() {
-    int switches = selected_candidate_pair_switches_;
-    selected_candidate_pair_switches_ = 0;
-    return switches;
-  }
-
- private:
-  std::unique_ptr<rtc::VirtualSocketServer> vss_;
-  rtc::AutoSocketServerThread thread_;
-  CandidatePairInterface* last_selected_candidate_pair_ = nullptr;
-  int selected_candidate_pair_switches_ = 0;
-  int last_sent_packet_id_ = -1;
-  bool channel_ready_to_send_ = false;
-  IceTransportState channel_state_ = IceTransportState::STATE_INIT;
-};
-
-TEST_F(P2PTransportChannelPingTest, TestTriggeredChecks) {
-  FakePortAllocator pa(rtc::Thread::Current(), nullptr);
-  P2PTransportChannel ch("trigger checks", 1, &pa);
-  PrepareChannel(&ch);
-  ch.MaybeStartGathering();
-  ch.AddRemoteCandidate(CreateUdpCandidate(LOCAL_PORT_TYPE, "1.1.1.1", 1, 1));
-  ch.AddRemoteCandidate(CreateUdpCandidate(LOCAL_PORT_TYPE, "2.2.2.2", 2, 2));
-
-  Connection* conn1 = WaitForConnectionTo(&ch, "1.1.1.1", 1);
-  Connection* conn2 = WaitForConnectionTo(&ch, "2.2.2.2", 2);
-  ASSERT_TRUE(conn1 != nullptr);
-  ASSERT_TRUE(conn2 != nullptr);
-
-  // Before a triggered check, the first connection to ping is the
-  // highest priority one.
-  EXPECT_EQ(conn2, FindNextPingableConnectionAndPingIt(&ch));
-
-  // Receiving a ping causes a triggered check which should make conn1
-  // be pinged first instead of conn2, even though conn2 has a higher
-  // priority.
-  conn1->ReceivedPing();
-  EXPECT_EQ(conn1, FindNextPingableConnectionAndPingIt(&ch));
-}
-
-TEST_F(P2PTransportChannelPingTest, TestAllConnectionsPingedSufficiently) {
-  FakePortAllocator pa(rtc::Thread::Current(), nullptr);
-  P2PTransportChannel ch("ping sufficiently", 1, &pa);
-  PrepareChannel(&ch);
-  ch.MaybeStartGathering();
-  ch.AddRemoteCandidate(CreateUdpCandidate(LOCAL_PORT_TYPE, "1.1.1.1", 1, 1));
-  ch.AddRemoteCandidate(CreateUdpCandidate(LOCAL_PORT_TYPE, "2.2.2.2", 2, 2));
-
-  Connection* conn1 = WaitForConnectionTo(&ch, "1.1.1.1", 1);
-  Connection* conn2 = WaitForConnectionTo(&ch, "2.2.2.2", 2);
-  ASSERT_TRUE(conn1 != nullptr);
-  ASSERT_TRUE(conn2 != nullptr);
-
-  // Low-priority connection becomes writable so that the other connection
-  // is not pruned.
-  conn1->ReceivedPingResponse(LOW_RTT, "id");
-  EXPECT_TRUE_WAIT(
-      conn1->num_pings_sent() >= MIN_PINGS_AT_WEAK_PING_INTERVAL &&
-          conn2->num_pings_sent() >= MIN_PINGS_AT_WEAK_PING_INTERVAL,
-      kDefaultTimeout);
-}
-
-// Verify that the connections are pinged at the right time.
-TEST_F(P2PTransportChannelPingTest, TestStunPingIntervals) {
-  rtc::ScopedFakeClock clock;
-  int RTT_RATIO = 4;
-  int SCHEDULING_RANGE = 200;
-  int RTT_RANGE = 10;
-
-  FakePortAllocator pa(rtc::Thread::Current(), nullptr);
-  P2PTransportChannel ch("TestChannel", 1, &pa);
-  PrepareChannel(&ch);
-  ch.MaybeStartGathering();
-  ch.AddRemoteCandidate(CreateUdpCandidate(LOCAL_PORT_TYPE, "1.1.1.1", 1, 1));
-  Connection* conn = WaitForConnectionTo(&ch, "1.1.1.1", 1);
-
-  ASSERT_TRUE(conn != nullptr);
-  SIMULATED_WAIT(conn->num_pings_sent() == 1, kDefaultTimeout, clock);
-
-  // Initializing.
-
-  int64_t start = clock.TimeNanos();
-  SIMULATED_WAIT(conn->num_pings_sent() >= MIN_PINGS_AT_WEAK_PING_INTERVAL,
-                 kDefaultTimeout, clock);
-  int64_t ping_interval_ms = (clock.TimeNanos() - start) /
-                             rtc::kNumNanosecsPerMillisec /
-                             (MIN_PINGS_AT_WEAK_PING_INTERVAL - 1);
-  EXPECT_EQ(ping_interval_ms, WEAK_PING_INTERVAL);
-
-  // Stabilizing.
-
-  conn->ReceivedPingResponse(LOW_RTT, "id");
-  int ping_sent_before = conn->num_pings_sent();
-  start = clock.TimeNanos();
-  // The connection becomes strong but not stable because we haven't been able
-  // to converge the RTT.
-  SIMULATED_WAIT(conn->num_pings_sent() == ping_sent_before + 1, kMediumTimeout,
-                 clock);
-  ping_interval_ms = (clock.TimeNanos() - start) / rtc::kNumNanosecsPerMillisec;
-  EXPECT_GE(ping_interval_ms,
-            WEAK_OR_STABILIZING_WRITABLE_CONNECTION_PING_INTERVAL);
-  EXPECT_LE(
-      ping_interval_ms,
-      WEAK_OR_STABILIZING_WRITABLE_CONNECTION_PING_INTERVAL + SCHEDULING_RANGE);
-
-  // Stabilized.
-
-  // The connection becomes stable after receiving more than RTT_RATIO rtt
-  // samples.
-  for (int i = 0; i < RTT_RATIO; i++) {
-    conn->ReceivedPingResponse(LOW_RTT, "id");
-  }
-  ping_sent_before = conn->num_pings_sent();
-  start = clock.TimeNanos();
-  SIMULATED_WAIT(conn->num_pings_sent() == ping_sent_before + 1, kMediumTimeout,
-                 clock);
-  ping_interval_ms = (clock.TimeNanos() - start) / rtc::kNumNanosecsPerMillisec;
-  EXPECT_GE(ping_interval_ms,
-            STRONG_AND_STABLE_WRITABLE_CONNECTION_PING_INTERVAL);
-  EXPECT_LE(
-      ping_interval_ms,
-      STRONG_AND_STABLE_WRITABLE_CONNECTION_PING_INTERVAL + SCHEDULING_RANGE);
-
-  // Destabilized.
-
-  conn->ReceivedPingResponse(LOW_RTT, "id");
-  // Create a in-flight ping.
-  conn->Ping(clock.TimeNanos() / rtc::kNumNanosecsPerMillisec);
-  start = clock.TimeNanos();
-  // In-flight ping timeout and the connection will be unstable.
-  SIMULATED_WAIT(
-      !conn->stable(clock.TimeNanos() / rtc::kNumNanosecsPerMillisec),
-      kMediumTimeout, clock);
-  int64_t duration_ms =
-      (clock.TimeNanos() - start) / rtc::kNumNanosecsPerMillisec;
-  EXPECT_GE(duration_ms, 2 * conn->rtt() - RTT_RANGE);
-  EXPECT_LE(duration_ms, 2 * conn->rtt() + RTT_RANGE);
-  // The connection become unstable due to not receiving ping responses.
-  ping_sent_before = conn->num_pings_sent();
-  SIMULATED_WAIT(conn->num_pings_sent() == ping_sent_before + 1, kMediumTimeout,
-                 clock);
-  // The interval is expected to be
-  // WEAK_OR_STABILIZING_WRITABLE_CONNECTION_PING_INTERVAL.
-  start = clock.TimeNanos();
-  ping_sent_before = conn->num_pings_sent();
-  SIMULATED_WAIT(conn->num_pings_sent() == ping_sent_before + 1, kMediumTimeout,
-                 clock);
-  ping_interval_ms = (clock.TimeNanos() - start) / rtc::kNumNanosecsPerMillisec;
-  EXPECT_GE(ping_interval_ms,
-            WEAK_OR_STABILIZING_WRITABLE_CONNECTION_PING_INTERVAL);
-  EXPECT_LE(
-      ping_interval_ms,
-      WEAK_OR_STABILIZING_WRITABLE_CONNECTION_PING_INTERVAL + SCHEDULING_RANGE);
-}
-
-// Test that we start pinging as soon as we have a connection and remote ICE
-// parameters.
-TEST_F(P2PTransportChannelPingTest, PingingStartedAsSoonAsPossible) {
-  rtc::ScopedFakeClock clock;
-
-  FakePortAllocator pa(rtc::Thread::Current(), nullptr);
-  P2PTransportChannel ch("TestChannel", 1, &pa);
-  ch.SetIceRole(ICEROLE_CONTROLLING);
-  ch.SetIceParameters(kIceParams[0]);
-  ch.MaybeStartGathering();
-  EXPECT_EQ_WAIT(IceGatheringState::kIceGatheringComplete, ch.gathering_state(),
-                 kDefaultTimeout);
-
-  // Simulate a binding request being received, creating a peer reflexive
-  // candidate pair while we still don't have remote ICE parameters.
-  IceMessage request;
-  request.SetType(STUN_BINDING_REQUEST);
-  request.AddAttribute(rtc::MakeUnique<StunByteStringAttribute>(
-      STUN_ATTR_USERNAME, kIceUfrag[1]));
-  uint32_t prflx_priority = ICE_TYPE_PREFERENCE_PRFLX << 24;
-  request.AddAttribute(
-      rtc::MakeUnique<StunUInt32Attribute>(STUN_ATTR_PRIORITY, prflx_priority));
-  Port* port = GetPort(&ch);
-  ASSERT_NE(nullptr, port);
-  port->SignalUnknownAddress(port, rtc::SocketAddress("1.1.1.1", 1), PROTO_UDP,
-                             &request, kIceUfrag[1], false);
-  Connection* conn = GetConnectionTo(&ch, "1.1.1.1", 1);
-  ASSERT_NE(nullptr, conn);
-
-  // Simulate waiting for a second (and change) and verify that no pings were
-  // sent, since we don't yet have remote ICE parameters.
-  SIMULATED_WAIT(conn->num_pings_sent() > 0, 1025, clock);
-  EXPECT_EQ(0, conn->num_pings_sent());
-
-  // Set remote ICE parameters. Now we should be able to ping. Ensure that
-  // the first ping is sent as soon as possible, within one simulated clock
-  // tick.
-  ch.SetRemoteIceParameters(kIceParams[1]);
-  EXPECT_TRUE_SIMULATED_WAIT(conn->num_pings_sent() > 0, 1, clock);
-}
-
-TEST_F(P2PTransportChannelPingTest, TestNoTriggeredChecksWhenWritable) {
-  FakePortAllocator pa(rtc::Thread::Current(), nullptr);
-  P2PTransportChannel ch("trigger checks", 1, &pa);
-  PrepareChannel(&ch);
-  ch.MaybeStartGathering();
-  ch.AddRemoteCandidate(CreateUdpCandidate(LOCAL_PORT_TYPE, "1.1.1.1", 1, 1));
-  ch.AddRemoteCandidate(CreateUdpCandidate(LOCAL_PORT_TYPE, "2.2.2.2", 2, 2));
-
-  Connection* conn1 = WaitForConnectionTo(&ch, "1.1.1.1", 1);
-  Connection* conn2 = WaitForConnectionTo(&ch, "2.2.2.2", 2);
-  ASSERT_TRUE(conn1 != nullptr);
-  ASSERT_TRUE(conn2 != nullptr);
-
-  EXPECT_EQ(conn2, FindNextPingableConnectionAndPingIt(&ch));
-  EXPECT_EQ(conn1, FindNextPingableConnectionAndPingIt(&ch));
-  conn1->ReceivedPingResponse(LOW_RTT, "id");
-  ASSERT_TRUE(conn1->writable());
-  conn1->ReceivedPing();
-
-  // Ping received, but the connection is already writable, so no
-  // "triggered check" and conn2 is pinged before conn1 because it has
-  // a higher priority.
-  EXPECT_EQ(conn2, FindNextPingableConnectionAndPingIt(&ch));
-}
-
-TEST_F(P2PTransportChannelPingTest, TestFailedConnectionNotPingable) {
-  FakePortAllocator pa(rtc::Thread::Current(), nullptr);
-  P2PTransportChannel ch("Do not ping failed connections", 1, &pa);
-  PrepareChannel(&ch);
-  ch.MaybeStartGathering();
-  ch.AddRemoteCandidate(CreateUdpCandidate(LOCAL_PORT_TYPE, "1.1.1.1", 1, 1));
-
-  Connection* conn1 = WaitForConnectionTo(&ch, "1.1.1.1", 1);
-  ASSERT_TRUE(conn1 != nullptr);
-
-  EXPECT_EQ(conn1, ch.FindNextPingableConnection());
-  conn1->Prune();  // A pruned connection may still be pingable.
-  EXPECT_EQ(conn1, ch.FindNextPingableConnection());
-  conn1->FailAndPrune();
-  EXPECT_TRUE(nullptr == ch.FindNextPingableConnection());
-}
-
-TEST_F(P2PTransportChannelPingTest, TestSignalStateChanged) {
-  FakePortAllocator pa(rtc::Thread::Current(), nullptr);
-  P2PTransportChannel ch("state change", 1, &pa);
-  PrepareChannel(&ch);
-  ch.MaybeStartGathering();
-  ch.AddRemoteCandidate(CreateUdpCandidate(LOCAL_PORT_TYPE, "1.1.1.1", 1, 1));
-  Connection* conn1 = WaitForConnectionTo(&ch, "1.1.1.1", 1);
-  ASSERT_TRUE(conn1 != nullptr);
-  // Pruning the connection reduces the set of active connections and changes
-  // the channel state.
-  conn1->Prune();
-  EXPECT_EQ_WAIT(IceTransportState::STATE_FAILED, channel_state(),
-                 kDefaultTimeout);
-}
-
-// Test adding remote candidates with different ufrags. If a remote candidate
-// is added with an old ufrag, it will be discarded. If it is added with a
-// ufrag that was not seen before, it will be used to create connections
-// although the ICE pwd in the remote candidate will be set when the ICE
-// parameters arrive. If a remote candidate is added with the current ICE
-// ufrag, its pwd and generation will be set properly.
-TEST_F(P2PTransportChannelPingTest, TestAddRemoteCandidateWithVariousUfrags) {
-  FakePortAllocator pa(rtc::Thread::Current(), nullptr);
-  P2PTransportChannel ch("add candidate", 1, &pa);
-  PrepareChannel(&ch);
-  ch.MaybeStartGathering();
-  // Add a candidate with a future ufrag.
-  ch.AddRemoteCandidate(
-      CreateUdpCandidate(LOCAL_PORT_TYPE, "1.1.1.1", 1, 1, kIceUfrag[2]));
-  Connection* conn1 = WaitForConnectionTo(&ch, "1.1.1.1", 1);
-  ASSERT_TRUE(conn1 != nullptr);
-  const Candidate& candidate = conn1->remote_candidate();
-  EXPECT_EQ(kIceUfrag[2], candidate.username());
-  EXPECT_TRUE(candidate.password().empty());
-  EXPECT_TRUE(FindNextPingableConnectionAndPingIt(&ch) == nullptr);
-
-  // Set the remote ICE parameters with the "future" ufrag.
-  // This should set the ICE pwd in the remote candidate of |conn1|, making
-  // it pingable.
-  ch.SetRemoteIceParameters(kIceParams[2]);
-  EXPECT_EQ(kIceUfrag[2], candidate.username());
-  EXPECT_EQ(kIcePwd[2], candidate.password());
-  EXPECT_EQ(conn1, FindNextPingableConnectionAndPingIt(&ch));
-
-  // Add a candidate with an old ufrag. No connection will be created.
-  ch.AddRemoteCandidate(
-      CreateUdpCandidate(LOCAL_PORT_TYPE, "2.2.2.2", 2, 2, kIceUfrag[1]));
-  rtc::Thread::Current()->ProcessMessages(500);
-  EXPECT_TRUE(GetConnectionTo(&ch, "2.2.2.2", 2) == nullptr);
-
-  // Add a candidate with the current ufrag, its pwd and generation will be
-  // assigned, even if the generation is not set.
-  ch.AddRemoteCandidate(
-      CreateUdpCandidate(LOCAL_PORT_TYPE, "3.3.3.3", 3, 0, kIceUfrag[2]));
-  Connection* conn3 = nullptr;
-  ASSERT_TRUE_WAIT((conn3 = GetConnectionTo(&ch, "3.3.3.3", 3)) != nullptr,
-                   kMediumTimeout);
-  const Candidate& new_candidate = conn3->remote_candidate();
-  EXPECT_EQ(kIcePwd[2], new_candidate.password());
-  EXPECT_EQ(1U, new_candidate.generation());
-
-  // Check that the pwd of all remote candidates are properly assigned.
-  for (const RemoteCandidate& candidate : ch.remote_candidates()) {
-    EXPECT_TRUE(candidate.username() == kIceUfrag[1] ||
-                candidate.username() == kIceUfrag[2]);
-    if (candidate.username() == kIceUfrag[1]) {
-      EXPECT_EQ(kIcePwd[1], candidate.password());
-    } else if (candidate.username() == kIceUfrag[2]) {
-      EXPECT_EQ(kIcePwd[2], candidate.password());
-    }
-  }
-}
-
-TEST_F(P2PTransportChannelPingTest, ConnectionResurrection) {
-  FakePortAllocator pa(rtc::Thread::Current(), nullptr);
-  P2PTransportChannel ch("connection resurrection", 1, &pa);
-  PrepareChannel(&ch);
-  ch.MaybeStartGathering();
-
-  // Create conn1 and keep track of original candidate priority.
-  ch.AddRemoteCandidate(CreateUdpCandidate(LOCAL_PORT_TYPE, "1.1.1.1", 1, 1));
-  Connection* conn1 = WaitForConnectionTo(&ch, "1.1.1.1", 1);
-  ASSERT_TRUE(conn1 != nullptr);
-  uint32_t remote_priority = conn1->remote_candidate().priority();
-
-  // Create a higher priority candidate and make the connection
-  // receiving/writable. This will prune conn1.
-  ch.AddRemoteCandidate(CreateUdpCandidate(LOCAL_PORT_TYPE, "2.2.2.2", 2, 2));
-  Connection* conn2 = WaitForConnectionTo(&ch, "2.2.2.2", 2);
-  ASSERT_TRUE(conn2 != nullptr);
-  conn2->ReceivedPing();
-  conn2->ReceivedPingResponse(LOW_RTT, "id");
-
-  // Wait for conn1 to be pruned.
-  EXPECT_TRUE_WAIT(conn1->pruned(), kMediumTimeout);
-  // Destroy the connection to test SignalUnknownAddress.
-  conn1->Destroy();
-  EXPECT_TRUE_WAIT(GetConnectionTo(&ch, "1.1.1.1", 1) == nullptr,
-                   kMediumTimeout);
-
-  // Create a minimal STUN message with prflx priority.
-  IceMessage request;
-  request.SetType(STUN_BINDING_REQUEST);
-  request.AddAttribute(rtc::MakeUnique<StunByteStringAttribute>(
-      STUN_ATTR_USERNAME, kIceUfrag[1]));
-  uint32_t prflx_priority = ICE_TYPE_PREFERENCE_PRFLX << 24;
-  request.AddAttribute(
-      rtc::MakeUnique<StunUInt32Attribute>(STUN_ATTR_PRIORITY, prflx_priority));
-  EXPECT_NE(prflx_priority, remote_priority);
-
-  Port* port = GetPort(&ch);
-  // conn1 should be resurrected with original priority.
-  port->SignalUnknownAddress(port, rtc::SocketAddress("1.1.1.1", 1), PROTO_UDP,
-                             &request, kIceUfrag[1], false);
-  conn1 = WaitForConnectionTo(&ch, "1.1.1.1", 1);
-  ASSERT_TRUE(conn1 != nullptr);
-  EXPECT_EQ(conn1->remote_candidate().priority(), remote_priority);
-
-  // conn3, a real prflx connection, should have prflx priority.
-  port->SignalUnknownAddress(port, rtc::SocketAddress("3.3.3.3", 1), PROTO_UDP,
-                             &request, kIceUfrag[1], false);
-  Connection* conn3 = WaitForConnectionTo(&ch, "3.3.3.3", 1);
-  ASSERT_TRUE(conn3 != nullptr);
-  EXPECT_EQ(conn3->remote_candidate().priority(), prflx_priority);
-}
-
-TEST_F(P2PTransportChannelPingTest, TestReceivingStateChange) {
-  rtc::ScopedFakeClock clock;
-  FakePortAllocator pa(rtc::Thread::Current(), nullptr);
-  P2PTransportChannel ch("receiving state change", 1, &pa);
-  PrepareChannel(&ch);
-  // Default receiving timeout and checking receiving interval should not be too
-  // small.
-  EXPECT_LE(1000, ch.receiving_timeout());
-  EXPECT_LE(200, ch.check_receiving_interval());
-  ch.SetIceConfig(CreateIceConfig(500, GATHER_ONCE));
-  EXPECT_EQ(500, ch.receiving_timeout());
-  EXPECT_EQ(50, ch.check_receiving_interval());
-  ch.MaybeStartGathering();
-  ch.AddRemoteCandidate(CreateUdpCandidate(LOCAL_PORT_TYPE, "1.1.1.1", 1, 1));
-  Connection* conn1 = WaitForConnectionTo(&ch, "1.1.1.1", 1, &clock);
-  ASSERT_TRUE(conn1 != nullptr);
-
-  clock.AdvanceTime(rtc::TimeDelta::FromSeconds(1));
-  conn1->ReceivedPing();
-  conn1->OnReadPacket("ABC", 3, rtc::CreatePacketTime(0));
-  EXPECT_TRUE_SIMULATED_WAIT(ch.receiving(), kShortTimeout, clock);
-  EXPECT_TRUE_SIMULATED_WAIT(!ch.receiving(), kShortTimeout, clock);
-}
-
-// The controlled side will select a connection as the "selected connection"
-// based on priority until the controlling side nominates a connection, at which
-// point the controlled side will select that connection as the
-// "selected connection". Plus, SignalSelectedCandidatePair will be fired if the
-// selected connection changes and SignalReadyToSend will be fired if the new
-// selected connection is writable.
-TEST_F(P2PTransportChannelPingTest, TestSelectConnectionBeforeNomination) {
-  FakePortAllocator pa(rtc::Thread::Current(), nullptr);
-  P2PTransportChannel ch("receiving state change", 1, &pa);
-  PrepareChannel(&ch);
-  ch.SetIceRole(ICEROLE_CONTROLLED);
-  ch.MaybeStartGathering();
-  ch.AddRemoteCandidate(CreateUdpCandidate(LOCAL_PORT_TYPE, "1.1.1.1", 1, 1));
-  Connection* conn1 = WaitForConnectionTo(&ch, "1.1.1.1", 1);
-  ASSERT_TRUE(conn1 != nullptr);
-  // Channel is not ready to send because it is not writable.
-  EXPECT_FALSE(channel_ready_to_send());
-  int last_packet_id = 0;
-  const char* data = "ABCDEFGH";
-  int len = static_cast<int>(strlen(data));
-  EXPECT_EQ(-1, SendData(ch, data, len, ++last_packet_id));
-  EXPECT_EQ(-1, last_sent_packet_id());
-
-  // A connection needs to be writable before it is selected for transmission.
-  conn1->ReceivedPingResponse(LOW_RTT, "id");
-  EXPECT_EQ_WAIT(conn1, ch.selected_connection(), kDefaultTimeout);
-  EXPECT_EQ(conn1, last_selected_candidate_pair());
-  EXPECT_EQ(len, SendData(ch, data, len, ++last_packet_id));
-
-  // When a higher priority candidate comes in, the new connection is chosen
-  // as the selected connection.
-  ch.AddRemoteCandidate(CreateUdpCandidate(LOCAL_PORT_TYPE, "2.2.2.2", 2, 10));
-  Connection* conn2 = WaitForConnectionTo(&ch, "2.2.2.2", 2);
-  ASSERT_TRUE(conn2 != nullptr);
-  conn2->ReceivedPingResponse(LOW_RTT, "id");
-  EXPECT_EQ_WAIT(conn2, ch.selected_connection(), kDefaultTimeout);
-  EXPECT_EQ(conn2, last_selected_candidate_pair());
-  EXPECT_TRUE(channel_ready_to_send());
-  EXPECT_EQ(last_packet_id, last_sent_packet_id());
-
-  // If a stun request with use-candidate attribute arrives, the receiving
-  // connection will be set as the selected connection, even though
-  // its priority is lower.
-  EXPECT_EQ(len, SendData(ch, data, len, ++last_packet_id));
-  ch.AddRemoteCandidate(CreateUdpCandidate(LOCAL_PORT_TYPE, "3.3.3.3", 3, 1));
-  Connection* conn3 = WaitForConnectionTo(&ch, "3.3.3.3", 3);
-  ASSERT_TRUE(conn3 != nullptr);
-  // Because it has a lower priority, the selected connection is still conn2.
-  EXPECT_EQ(conn2, ch.selected_connection());
-  conn3->ReceivedPingResponse(LOW_RTT, "id");  // Become writable.
-  // But if it is nominated via use_candidate, it is chosen as the selected
-  // connection.
-  NominateConnection(conn3);
-  EXPECT_EQ(conn3, ch.selected_connection());
-  EXPECT_EQ(conn3, last_selected_candidate_pair());
-  EXPECT_EQ(last_packet_id, last_sent_packet_id());
-  EXPECT_TRUE(channel_ready_to_send());
-
-  // Even if another higher priority candidate arrives, it will not be set as
-  // the selected connection because the selected connection is nominated by
-  // the controlling side.
-  EXPECT_EQ(len, SendData(ch, data, len, ++last_packet_id));
-  ch.AddRemoteCandidate(CreateUdpCandidate(LOCAL_PORT_TYPE, "4.4.4.4", 4, 100));
-  Connection* conn4 = WaitForConnectionTo(&ch, "4.4.4.4", 4);
-  ASSERT_TRUE(conn4 != nullptr);
-  EXPECT_EQ(conn3, ch.selected_connection());
-  // But if it is nominated via use_candidate and writable, it will be set as
-  // the selected connection.
-  NominateConnection(conn4);
-  // Not switched yet because conn4 is not writable.
-  EXPECT_EQ(conn3, ch.selected_connection());
-  reset_channel_ready_to_send();
-  // The selected connection switches after conn4 becomes writable.
-  conn4->ReceivedPingResponse(LOW_RTT, "id");
-  EXPECT_EQ_WAIT(conn4, ch.selected_connection(), kDefaultTimeout);
-  EXPECT_EQ(conn4, last_selected_candidate_pair());
-  EXPECT_EQ(last_packet_id, last_sent_packet_id());
-  // SignalReadyToSend is fired again because conn4 is writable.
-  EXPECT_TRUE(channel_ready_to_send());
-}
-
-// The controlled side will select a connection as the "selected connection"
-// based on requests from an unknown address before the controlling side
-// nominates a connection, and will nominate a connection from an unknown
-// address if the request contains the use_candidate attribute. Plus, it will
-// also sends back a ping response and set the ICE pwd in the remote candidate
-// appropriately.
-TEST_F(P2PTransportChannelPingTest, TestSelectConnectionFromUnknownAddress) {
-  FakePortAllocator pa(rtc::Thread::Current(), nullptr);
-  P2PTransportChannel ch("receiving state change", 1, &pa);
-  PrepareChannel(&ch);
-  ch.SetIceRole(ICEROLE_CONTROLLED);
-  ch.MaybeStartGathering();
-  // A minimal STUN message with prflx priority.
-  IceMessage request;
-  request.SetType(STUN_BINDING_REQUEST);
-  request.AddAttribute(rtc::MakeUnique<StunByteStringAttribute>(
-      STUN_ATTR_USERNAME, kIceUfrag[1]));
-  uint32_t prflx_priority = ICE_TYPE_PREFERENCE_PRFLX << 24;
-  request.AddAttribute(
-      rtc::MakeUnique<StunUInt32Attribute>(STUN_ATTR_PRIORITY, prflx_priority));
-  TestUDPPort* port = static_cast<TestUDPPort*>(GetPort(&ch));
-  port->SignalUnknownAddress(port, rtc::SocketAddress("1.1.1.1", 1), PROTO_UDP,
-                             &request, kIceUfrag[1], false);
-  Connection* conn1 = WaitForConnectionTo(&ch, "1.1.1.1", 1);
-  ASSERT_TRUE(conn1 != nullptr);
-  EXPECT_TRUE(port->sent_binding_response());
-  EXPECT_NE(conn1, ch.selected_connection());
-  conn1->ReceivedPingResponse(LOW_RTT, "id");
-  EXPECT_EQ_WAIT(conn1, ch.selected_connection(), kDefaultTimeout);
-  port->set_sent_binding_response(false);
-
-  // Another connection is nominated via use_candidate.
-  ch.AddRemoteCandidate(CreateUdpCandidate(LOCAL_PORT_TYPE, "2.2.2.2", 2, 1));
-  Connection* conn2 = WaitForConnectionTo(&ch, "2.2.2.2", 2);
-  ASSERT_TRUE(conn2 != nullptr);
-  // Because it has a lower priority, the selected connection is still conn1.
-  EXPECT_EQ(conn1, ch.selected_connection());
-  // When it is nominated via use_candidate and writable, it is chosen as the
-  // selected connection.
-  conn2->ReceivedPingResponse(LOW_RTT, "id");  // Become writable.
-  NominateConnection(conn2);
-  EXPECT_EQ(conn2, ch.selected_connection());
-
-  // Another request with unknown address, it will not be set as the selected
-  // connection because the selected connection was nominated by the controlling
-  // side.
-  port->SignalUnknownAddress(port, rtc::SocketAddress("3.3.3.3", 3), PROTO_UDP,
-                             &request, kIceUfrag[1], false);
-  Connection* conn3 = WaitForConnectionTo(&ch, "3.3.3.3", 3);
-  ASSERT_TRUE(conn3 != nullptr);
-  EXPECT_TRUE(port->sent_binding_response());
-  conn3->ReceivedPingResponse(LOW_RTT, "id");  // Become writable.
-  EXPECT_EQ(conn2, ch.selected_connection());
-  port->set_sent_binding_response(false);
-
-  // However if the request contains use_candidate attribute, it will be
-  // selected as the selected connection.
-  request.AddAttribute(
-      rtc::MakeUnique<StunByteStringAttribute>(STUN_ATTR_USE_CANDIDATE));
-  port->SignalUnknownAddress(port, rtc::SocketAddress("4.4.4.4", 4), PROTO_UDP,
-                             &request, kIceUfrag[1], false);
-  Connection* conn4 = WaitForConnectionTo(&ch, "4.4.4.4", 4);
-  ASSERT_TRUE(conn4 != nullptr);
-  EXPECT_TRUE(port->sent_binding_response());
-  // conn4 is not the selected connection yet because it is not writable.
-  EXPECT_EQ(conn2, ch.selected_connection());
-  conn4->ReceivedPingResponse(LOW_RTT, "id");  // Become writable.
-  EXPECT_EQ_WAIT(conn4, ch.selected_connection(), kDefaultTimeout);
-
-  // Test that the request from an unknown address contains a ufrag from an old
-  // generation.
-  port->set_sent_binding_response(false);
-  ch.SetRemoteIceParameters(kIceParams[2]);
-  ch.SetRemoteIceParameters(kIceParams[3]);
-  port->SignalUnknownAddress(port, rtc::SocketAddress("5.5.5.5", 5), PROTO_UDP,
-                             &request, kIceUfrag[2], false);
-  Connection* conn5 = WaitForConnectionTo(&ch, "5.5.5.5", 5);
-  ASSERT_TRUE(conn5 != nullptr);
-  EXPECT_TRUE(port->sent_binding_response());
-  EXPECT_EQ(kIcePwd[2], conn5->remote_candidate().password());
-}
-
-// The controlled side will select a connection as the "selected connection"
-// based on media received until the controlling side nominates a connection,
-// at which point the controlled side will select that connection as
-// the "selected connection".
-TEST_F(P2PTransportChannelPingTest, TestSelectConnectionBasedOnMediaReceived) {
-  FakePortAllocator pa(rtc::Thread::Current(), nullptr);
-  P2PTransportChannel ch("receiving state change", 1, &pa);
-  PrepareChannel(&ch);
-  ch.SetIceRole(ICEROLE_CONTROLLED);
-  ch.MaybeStartGathering();
-  ch.AddRemoteCandidate(CreateUdpCandidate(LOCAL_PORT_TYPE, "1.1.1.1", 1, 10));
-  Connection* conn1 = WaitForConnectionTo(&ch, "1.1.1.1", 1);
-  ASSERT_TRUE(conn1 != nullptr);
-  conn1->ReceivedPingResponse(LOW_RTT, "id");
-  EXPECT_EQ_WAIT(conn1, ch.selected_connection(), kDefaultTimeout);
-
-  // If a data packet is received on conn2, the selected connection should
-  // switch to conn2 because the controlled side must mirror the media path
-  // chosen by the controlling side.
-  ch.AddRemoteCandidate(CreateUdpCandidate(LOCAL_PORT_TYPE, "2.2.2.2", 2, 1));
-  Connection* conn2 = WaitForConnectionTo(&ch, "2.2.2.2", 2);
-  ASSERT_TRUE(conn2 != nullptr);
-  conn2->ReceivedPingResponse(LOW_RTT, "id");  // Become writable and receiving.
-  conn2->OnReadPacket("ABC", 3, rtc::CreatePacketTime(0));
-  EXPECT_EQ(conn2, ch.selected_connection());
-  conn2->ReceivedPingResponse(LOW_RTT, "id");  // Become writable.
-
-  // Now another STUN message with an unknown address and use_candidate will
-  // nominate the selected connection.
-  IceMessage request;
-  request.SetType(STUN_BINDING_REQUEST);
-  request.AddAttribute(rtc::MakeUnique<StunByteStringAttribute>(
-      STUN_ATTR_USERNAME, kIceUfrag[1]));
-  uint32_t prflx_priority = ICE_TYPE_PREFERENCE_PRFLX << 24;
-  request.AddAttribute(
-      rtc::MakeUnique<StunUInt32Attribute>(STUN_ATTR_PRIORITY, prflx_priority));
-  request.AddAttribute(
-      rtc::MakeUnique<StunByteStringAttribute>(STUN_ATTR_USE_CANDIDATE));
-  Port* port = GetPort(&ch);
-  port->SignalUnknownAddress(port, rtc::SocketAddress("3.3.3.3", 3), PROTO_UDP,
-                             &request, kIceUfrag[1], false);
-  Connection* conn3 = WaitForConnectionTo(&ch, "3.3.3.3", 3);
-  ASSERT_TRUE(conn3 != nullptr);
-  EXPECT_EQ(conn2, ch.selected_connection());  // Not writable yet.
-  conn3->ReceivedPingResponse(LOW_RTT, "id");  // Become writable.
-  EXPECT_EQ_WAIT(conn3, ch.selected_connection(), kDefaultTimeout);
-
-  // Now another data packet will not switch the selected connection because the
-  // selected connection was nominated by the controlling side.
-  conn2->ReceivedPing();
-  conn2->ReceivedPingResponse(LOW_RTT, "id");
-  conn2->OnReadPacket("XYZ", 3, rtc::CreatePacketTime(0));
-  EXPECT_EQ_WAIT(conn3, ch.selected_connection(), kDefaultTimeout);
-}
-
-TEST_F(P2PTransportChannelPingTest,
-       TestControlledAgentDataReceivingTakesHigherPrecedenceThanPriority) {
-  rtc::ScopedFakeClock clock;
-  clock.AdvanceTime(rtc::TimeDelta::FromSeconds(1));
-  FakePortAllocator pa(rtc::Thread::Current(), nullptr);
-  P2PTransportChannel ch("SwitchSelectedConnection", 1, &pa);
-  PrepareChannel(&ch);
-  ch.SetIceRole(ICEROLE_CONTROLLED);
-  ch.MaybeStartGathering();
-  // The connections have decreasing priority.
-  Connection* conn1 =
-      CreateConnectionWithCandidate(ch, clock, "1.1.1.1", 1, 10, true);
-  ASSERT_TRUE(conn1 != nullptr);
-  Connection* conn2 =
-      CreateConnectionWithCandidate(ch, clock, "2.2.2.2", 2, 9, true);
-  ASSERT_TRUE(conn2 != nullptr);
-
-  // Initially, connections are selected based on priority.
-  EXPECT_EQ(1, reset_selected_candidate_pair_switches());
-  EXPECT_EQ(conn1, last_selected_candidate_pair());
-
-  // conn2 receives data; it becomes selected.
-  // Advance the clock by 1ms so that the last data receiving timestamp of
-  // conn2 is larger.
-  SIMULATED_WAIT(false, 1, clock);
-  conn2->OnReadPacket("XYZ", 3, rtc::CreatePacketTime(0));
-  EXPECT_EQ(1, reset_selected_candidate_pair_switches());
-  EXPECT_EQ(conn2, last_selected_candidate_pair());
-
-  // conn1 also receives data; it becomes selected due to priority again.
-  conn1->OnReadPacket("XYZ", 3, rtc::CreatePacketTime(0));
-  EXPECT_EQ(1, reset_selected_candidate_pair_switches());
-  EXPECT_EQ(conn1, last_selected_candidate_pair());
-
-  // conn2 received data more recently; it is selected now because it
-  // received data more recently.
-  SIMULATED_WAIT(false, 1, clock);
-  // Need to become writable again because it was pruned.
-  conn2->ReceivedPingResponse(LOW_RTT, "id");
-  conn2->OnReadPacket("XYZ", 3, rtc::CreatePacketTime(0));
-  EXPECT_EQ(1, reset_selected_candidate_pair_switches());
-  EXPECT_EQ(conn2, last_selected_candidate_pair());
-
-  // Make sure sorting won't reselect candidate pair.
-  SIMULATED_WAIT(false, 10, clock);
-  EXPECT_EQ(0, reset_selected_candidate_pair_switches());
-}
-
-TEST_F(P2PTransportChannelPingTest,
-       TestControlledAgentNominationTakesHigherPrecedenceThanDataReceiving) {
-  rtc::ScopedFakeClock clock;
-  clock.AdvanceTime(rtc::TimeDelta::FromSeconds(1));
-
-  FakePortAllocator pa(rtc::Thread::Current(), nullptr);
-  P2PTransportChannel ch("SwitchSelectedConnection", 1, &pa);
-  PrepareChannel(&ch);
-  ch.SetIceRole(ICEROLE_CONTROLLED);
-  ch.MaybeStartGathering();
-  // The connections have decreasing priority.
-  Connection* conn1 =
-      CreateConnectionWithCandidate(ch, clock, "1.1.1.1", 1, 10, true);
-  ASSERT_TRUE(conn1 != nullptr);
-  Connection* conn2 =
-      CreateConnectionWithCandidate(ch, clock, "2.2.2.2", 2, 9, true);
-  ASSERT_TRUE(conn2 != nullptr);
-
-  // conn1 received data; it is the selected connection.
-  // Advance the clock to have a non-zero last-data-receiving time.
-  SIMULATED_WAIT(false, 1, clock);
-  conn1->OnReadPacket("XYZ", 3, rtc::CreatePacketTime(0));
-  EXPECT_EQ(1, reset_selected_candidate_pair_switches());
-  EXPECT_EQ(conn1, last_selected_candidate_pair());
-
-  // conn2 is nominated; it becomes the selected connection.
-  NominateConnection(conn2);
-  EXPECT_EQ(1, reset_selected_candidate_pair_switches());
-  EXPECT_EQ(conn2, last_selected_candidate_pair());
-
-  // conn1 is selected because it has higher priority and also nominated.
-  NominateConnection(conn1);
-  EXPECT_EQ(1, reset_selected_candidate_pair_switches());
-  EXPECT_EQ(conn1, last_selected_candidate_pair());
-
-  // Make sure sorting won't reselect candidate pair.
-  SIMULATED_WAIT(false, 10, clock);
-  EXPECT_EQ(0, reset_selected_candidate_pair_switches());
-}
-
-TEST_F(P2PTransportChannelPingTest,
-       TestControlledAgentSelectsConnectionWithHigherNomination) {
-  rtc::ScopedFakeClock clock;
-  clock.AdvanceTime(rtc::TimeDelta::FromSeconds(1));
-
-  FakePortAllocator pa(rtc::Thread::Current(), nullptr);
-  P2PTransportChannel ch("test", 1, &pa);
-  PrepareChannel(&ch);
-  ch.SetIceRole(ICEROLE_CONTROLLED);
-  ch.MaybeStartGathering();
-  // The connections have decreasing priority.
-  Connection* conn1 =
-      CreateConnectionWithCandidate(ch, clock, "1.1.1.1", 1, 10, true);
-  ASSERT_TRUE(conn1 != nullptr);
-  Connection* conn2 =
-      CreateConnectionWithCandidate(ch, clock, "2.2.2.2", 2, 9, true);
-  ASSERT_TRUE(conn2 != nullptr);
-
-  // conn1 is the selected connection because it has a higher priority,
-  EXPECT_EQ_SIMULATED_WAIT(conn1, last_selected_candidate_pair(),
-                           kDefaultTimeout, clock);
-  reset_selected_candidate_pair_switches();
-
-  // conn2 is nominated; it becomes selected.
-  NominateConnection(conn2);
-  EXPECT_EQ(1, reset_selected_candidate_pair_switches());
-  EXPECT_EQ(conn2, last_selected_candidate_pair());
-
-  // conn1 is selected because of its priority.
-  NominateConnection(conn1);
-  EXPECT_EQ(1, reset_selected_candidate_pair_switches());
-  EXPECT_EQ(conn1, last_selected_candidate_pair());
-
-  // conn2 gets higher remote nomination; it is selected again.
-  NominateConnection(conn2, 2U);
-  EXPECT_EQ(1, reset_selected_candidate_pair_switches());
-  EXPECT_EQ(conn2, last_selected_candidate_pair());
-
-  // Make sure sorting won't reselect candidate pair.
-  SIMULATED_WAIT(false, 100, clock);
-  EXPECT_EQ(0, reset_selected_candidate_pair_switches());
-}
-
-TEST_F(P2PTransportChannelPingTest,
-       TestControlledAgentIgnoresSmallerNomination) {
-  rtc::ScopedFakeClock clock;
-  clock.AdvanceTime(rtc::TimeDelta::FromSeconds(1));
-
-  FakePortAllocator pa(rtc::Thread::Current(), nullptr);
-  P2PTransportChannel ch("test", 1, &pa);
-  PrepareChannel(&ch);
-  ch.SetIceRole(ICEROLE_CONTROLLED);
-  ch.MaybeStartGathering();
-  Connection* conn =
-      CreateConnectionWithCandidate(ch, clock, "1.1.1.1", 1, 10, false);
-  ReceivePingOnConnection(conn, kIceUfrag[1], 1, 2U);
-  EXPECT_EQ(2U, conn->remote_nomination());
-  // Smaller nomination is ignored.
-  ReceivePingOnConnection(conn, kIceUfrag[1], 1, 1U);
-  EXPECT_EQ(2U, conn->remote_nomination());
-}
-
-TEST_F(P2PTransportChannelPingTest,
-       TestControlledAgentWriteStateTakesHigherPrecedenceThanNomination) {
-  rtc::ScopedFakeClock clock;
-
-  FakePortAllocator pa(rtc::Thread::Current(), nullptr);
-  P2PTransportChannel ch("SwitchSelectedConnection", 1, &pa);
-  PrepareChannel(&ch);
-  ch.SetIceRole(ICEROLE_CONTROLLED);
-  ch.MaybeStartGathering();
-  // The connections have decreasing priority.
-  Connection* conn1 =
-      CreateConnectionWithCandidate(ch, clock, "1.1.1.1", 1, 10, false);
-  ASSERT_TRUE(conn1 != nullptr);
-  Connection* conn2 =
-      CreateConnectionWithCandidate(ch, clock, "2.2.2.2", 2, 9, false);
-  ASSERT_TRUE(conn2 != nullptr);
-
-  NominateConnection(conn1);
-  // There is no selected connection because no connection is writable.
-  EXPECT_EQ(0, reset_selected_candidate_pair_switches());
-
-  // conn2 becomes writable; it is selected even though it is not nominated.
-  conn2->ReceivedPingResponse(LOW_RTT, "id");
-  EXPECT_EQ_SIMULATED_WAIT(1, reset_selected_candidate_pair_switches(),
-                           kDefaultTimeout, clock);
-  EXPECT_EQ_SIMULATED_WAIT(conn2, last_selected_candidate_pair(),
-                           kDefaultTimeout, clock);
-
-  // If conn1 is also writable, it will become selected.
-  conn1->ReceivedPingResponse(LOW_RTT, "id");
-  EXPECT_EQ_SIMULATED_WAIT(1, reset_selected_candidate_pair_switches(),
-                           kDefaultTimeout, clock);
-  EXPECT_EQ_SIMULATED_WAIT(conn1, last_selected_candidate_pair(),
-                           kDefaultTimeout, clock);
-
-  // Make sure sorting won't reselect candidate pair.
-  SIMULATED_WAIT(false, 10, clock);
-  EXPECT_EQ(0, reset_selected_candidate_pair_switches());
-}
-
-// Test that if a new remote candidate has the same address and port with
-// an old one, it will be used to create a new connection.
-TEST_F(P2PTransportChannelPingTest, TestAddRemoteCandidateWithAddressReuse) {
-  FakePortAllocator pa(rtc::Thread::Current(), nullptr);
-  P2PTransportChannel ch("candidate reuse", 1, &pa);
-  PrepareChannel(&ch);
-  ch.MaybeStartGathering();
-  const std::string host_address = "1.1.1.1";
-  const int port_num = 1;
-
-  // kIceUfrag[1] is the current generation ufrag.
-  Candidate candidate = CreateUdpCandidate(LOCAL_PORT_TYPE, host_address,
-                                           port_num, 1, kIceUfrag[1]);
-  ch.AddRemoteCandidate(candidate);
-  Connection* conn1 = WaitForConnectionTo(&ch, host_address, port_num);
-  ASSERT_TRUE(conn1 != nullptr);
-  EXPECT_EQ(0u, conn1->remote_candidate().generation());
-
-  // Simply adding the same candidate again won't create a new connection.
-  ch.AddRemoteCandidate(candidate);
-  Connection* conn2 = GetConnectionTo(&ch, host_address, port_num);
-  EXPECT_EQ(conn1, conn2);
-
-  // Update the ufrag of the candidate and add it again.
-  candidate.set_username(kIceUfrag[2]);
-  ch.AddRemoteCandidate(candidate);
-  conn2 = GetConnectionTo(&ch, host_address, port_num);
-  EXPECT_NE(conn1, conn2);
-  EXPECT_EQ(kIceUfrag[2], conn2->remote_candidate().username());
-  EXPECT_EQ(1u, conn2->remote_candidate().generation());
-
-  // Verify that a ping with the new ufrag can be received on the new
-  // connection.
-  EXPECT_EQ(0, conn2->last_ping_received());
-  ReceivePingOnConnection(conn2, kIceUfrag[2], 1 /* priority */);
-  EXPECT_TRUE(conn2->last_ping_received() > 0);
-}
-
-// When the current selected connection is strong, lower-priority connections
-// will be pruned. Otherwise, lower-priority connections are kept.
-TEST_F(P2PTransportChannelPingTest, TestDontPruneWhenWeak) {
-  rtc::ScopedFakeClock clock;
-  clock.AdvanceTime(rtc::TimeDelta::FromSeconds(1));
-  FakePortAllocator pa(rtc::Thread::Current(), nullptr);
-  P2PTransportChannel ch("test channel", 1, &pa);
-  PrepareChannel(&ch);
-  ch.SetIceRole(ICEROLE_CONTROLLED);
-  ch.MaybeStartGathering();
-  ch.AddRemoteCandidate(CreateUdpCandidate(LOCAL_PORT_TYPE, "1.1.1.1", 1, 1));
-  Connection* conn1 = WaitForConnectionTo(&ch, "1.1.1.1", 1);
-  ASSERT_TRUE(conn1 != nullptr);
-  EXPECT_EQ(nullptr, ch.selected_connection());
-  conn1->ReceivedPingResponse(LOW_RTT, "id");  // Becomes writable and receiving
-
-  // When a higher-priority, nominated candidate comes in, the connections with
-  // lower-priority are pruned.
-  ch.AddRemoteCandidate(CreateUdpCandidate(LOCAL_PORT_TYPE, "2.2.2.2", 2, 10));
-  Connection* conn2 = WaitForConnectionTo(&ch, "2.2.2.2", 2, &clock);
-  ASSERT_TRUE(conn2 != nullptr);
-  conn2->ReceivedPingResponse(LOW_RTT, "id");  // Becomes writable and receiving
-  NominateConnection(conn2);
-  EXPECT_TRUE_SIMULATED_WAIT(conn1->pruned(), kMediumTimeout, clock);
-
-  ch.SetIceConfig(CreateIceConfig(500, GATHER_ONCE));
-  // Wait until conn2 becomes not receiving.
-  EXPECT_TRUE_SIMULATED_WAIT(!conn2->receiving(), kMediumTimeout, clock);
-
-  ch.AddRemoteCandidate(CreateUdpCandidate(LOCAL_PORT_TYPE, "3.3.3.3", 3, 1));
-  Connection* conn3 = WaitForConnectionTo(&ch, "3.3.3.3", 3, &clock);
-  ASSERT_TRUE(conn3 != nullptr);
-  // The selected connection should still be conn2. Even through conn3 has lower
-  // priority and is not receiving/writable, it is not pruned because the
-  // selected connection is not receiving.
-  SIMULATED_WAIT(conn3->pruned(), kShortTimeout, clock);
-  EXPECT_FALSE(conn3->pruned());
-}
-
-TEST_F(P2PTransportChannelPingTest, TestDontPruneHighPriorityConnections) {
-  rtc::ScopedFakeClock clock;
-  FakePortAllocator pa(rtc::Thread::Current(), nullptr);
-  P2PTransportChannel ch("test channel", 1, &pa);
-  PrepareChannel(&ch);
-  ch.SetIceRole(ICEROLE_CONTROLLED);
-  ch.MaybeStartGathering();
-  Connection* conn1 =
-      CreateConnectionWithCandidate(ch, clock, "1.1.1.1", 1, 100, true);
-  ASSERT_TRUE(conn1 != nullptr);
-  Connection* conn2 =
-      CreateConnectionWithCandidate(ch, clock, "2.2.2.2", 2, 200, false);
-  ASSERT_TRUE(conn2 != nullptr);
-  // Even if conn1 is writable, nominated, receiving data, it should not prune
-  // conn2.
-  NominateConnection(conn1);
-  SIMULATED_WAIT(false, 1, clock);
-  conn1->OnReadPacket("XYZ", 3, rtc::CreatePacketTime(0));
-  SIMULATED_WAIT(conn2->pruned(), 100, clock);
-  EXPECT_FALSE(conn2->pruned());
-}
-
-// Test that GetState returns the state correctly.
-TEST_F(P2PTransportChannelPingTest, TestGetState) {
-  rtc::ScopedFakeClock clock;
-  clock.AdvanceTime(rtc::TimeDelta::FromSeconds(1));
-  FakePortAllocator pa(rtc::Thread::Current(), nullptr);
-  P2PTransportChannel ch("test channel", 1, &pa);
-  PrepareChannel(&ch);
-  ch.MaybeStartGathering();
-  EXPECT_EQ(IceTransportState::STATE_INIT, ch.GetState());
-  ch.AddRemoteCandidate(CreateUdpCandidate(LOCAL_PORT_TYPE, "1.1.1.1", 1, 100));
-  ch.AddRemoteCandidate(CreateUdpCandidate(LOCAL_PORT_TYPE, "2.2.2.2", 2, 1));
-  Connection* conn1 = WaitForConnectionTo(&ch, "1.1.1.1", 1, &clock);
-  Connection* conn2 = WaitForConnectionTo(&ch, "2.2.2.2", 2, &clock);
-  ASSERT_TRUE(conn1 != nullptr);
-  ASSERT_TRUE(conn2 != nullptr);
-  // Now there are two connections, so the transport channel is connecting.
-  EXPECT_EQ(IceTransportState::STATE_CONNECTING, ch.GetState());
-  // |conn1| becomes writable and receiving; it then should prune |conn2|.
-  conn1->ReceivedPingResponse(LOW_RTT, "id");
-  EXPECT_TRUE_SIMULATED_WAIT(conn2->pruned(), kShortTimeout, clock);
-  EXPECT_EQ(IceTransportState::STATE_COMPLETED, ch.GetState());
-  conn1->Prune();  // All connections are pruned.
-  // Need to wait until the channel state is updated.
-  EXPECT_EQ_SIMULATED_WAIT(IceTransportState::STATE_FAILED, ch.GetState(),
-                           kShortTimeout, clock);
-}
-
-// Test that when a low-priority connection is pruned, it is not deleted
-// right away, and it can become active and be pruned again.
-TEST_F(P2PTransportChannelPingTest, TestConnectionPrunedAgain) {
-  rtc::ScopedFakeClock clock;
-  clock.AdvanceTime(rtc::TimeDelta::FromSeconds(1));
-
-  FakePortAllocator pa(rtc::Thread::Current(), nullptr);
-  P2PTransportChannel ch("test channel", 1, &pa);
-  PrepareChannel(&ch);
-  IceConfig config = CreateIceConfig(1000, GATHER_ONCE);
-  config.receiving_switching_delay = rtc::Optional<int>(800);
-  ch.SetIceConfig(config);
-  ch.MaybeStartGathering();
-  ch.AddRemoteCandidate(CreateUdpCandidate(LOCAL_PORT_TYPE, "1.1.1.1", 1, 100));
-  Connection* conn1 = WaitForConnectionTo(&ch, "1.1.1.1", 1, &clock);
-  ASSERT_TRUE(conn1 != nullptr);
-  EXPECT_EQ(nullptr, ch.selected_connection());
-  conn1->ReceivedPingResponse(LOW_RTT, "id");  // Becomes writable and receiving
-  EXPECT_EQ_SIMULATED_WAIT(conn1, ch.selected_connection(), kDefaultTimeout,
-                           clock);
-
-  // Add a low-priority connection |conn2|, which will be pruned, but it will
-  // not be deleted right away. Once the current selected connection becomes not
-  // receiving, |conn2| will start to ping and upon receiving the ping response,
-  // it will become the selected connection.
-  ch.AddRemoteCandidate(CreateUdpCandidate(LOCAL_PORT_TYPE, "2.2.2.2", 2, 1));
-  Connection* conn2 = WaitForConnectionTo(&ch, "2.2.2.2", 2, &clock);
-  ASSERT_TRUE(conn2 != nullptr);
-  EXPECT_TRUE_SIMULATED_WAIT(!conn2->active(), kDefaultTimeout, clock);
-  // |conn2| should not send a ping yet.
-  EXPECT_EQ(IceCandidatePairState::WAITING, conn2->state());
-  EXPECT_EQ(IceTransportState::STATE_COMPLETED, ch.GetState());
-  // Wait for |conn1| becoming not receiving.
-  EXPECT_TRUE_SIMULATED_WAIT(!conn1->receiving(), kMediumTimeout, clock);
-  // Make sure conn2 is not deleted.
-  conn2 = WaitForConnectionTo(&ch, "2.2.2.2", 2, &clock);
-  ASSERT_TRUE(conn2 != nullptr);
-  EXPECT_EQ_SIMULATED_WAIT(IceCandidatePairState::IN_PROGRESS, conn2->state(),
-                           kDefaultTimeout, clock);
-  conn2->ReceivedPingResponse(LOW_RTT, "id");
-  EXPECT_EQ_SIMULATED_WAIT(conn2, ch.selected_connection(), kDefaultTimeout,
-                           clock);
-  EXPECT_EQ(IceTransportState::STATE_CONNECTING, ch.GetState());
-
-  // When |conn1| comes back again, |conn2| will be pruned again.
-  conn1->ReceivedPingResponse(LOW_RTT, "id");
-  EXPECT_EQ_SIMULATED_WAIT(conn1, ch.selected_connection(), kDefaultTimeout,
-                           clock);
-  EXPECT_TRUE_SIMULATED_WAIT(!conn2->active(), kDefaultTimeout, clock);
-  EXPECT_EQ(IceTransportState::STATE_COMPLETED, ch.GetState());
-}
-
-// Test that if all connections in a channel has timed out on writing, they
-// will all be deleted. We use Prune to simulate write_time_out.
-TEST_F(P2PTransportChannelPingTest, TestDeleteConnectionsIfAllWriteTimedout) {
-  rtc::ScopedFakeClock clock;
-  FakePortAllocator pa(rtc::Thread::Current(), nullptr);
-  P2PTransportChannel ch("test channel", 1, &pa);
-  PrepareChannel(&ch);
-  ch.MaybeStartGathering();
-  // Have one connection only but later becomes write-time-out.
-  ch.AddRemoteCandidate(CreateUdpCandidate(LOCAL_PORT_TYPE, "1.1.1.1", 1, 100));
-  Connection* conn1 = WaitForConnectionTo(&ch, "1.1.1.1", 1, &clock);
-  ASSERT_TRUE(conn1 != nullptr);
-  conn1->ReceivedPing();  // Becomes receiving
-  conn1->Prune();
-  EXPECT_TRUE_SIMULATED_WAIT(ch.connections().empty(), kShortTimeout, clock);
-
-  // Have two connections but both become write-time-out later.
-  ch.AddRemoteCandidate(CreateUdpCandidate(LOCAL_PORT_TYPE, "2.2.2.2", 2, 1));
-  Connection* conn2 = WaitForConnectionTo(&ch, "2.2.2.2", 2, &clock);
-  ASSERT_TRUE(conn2 != nullptr);
-  conn2->ReceivedPing();  // Becomes receiving
-  ch.AddRemoteCandidate(CreateUdpCandidate(LOCAL_PORT_TYPE, "3.3.3.3", 3, 2));
-  Connection* conn3 = WaitForConnectionTo(&ch, "3.3.3.3", 3, &clock);
-  ASSERT_TRUE(conn3 != nullptr);
-  conn3->ReceivedPing();  // Becomes receiving
-  // Now prune both conn2 and conn3; they will be deleted soon.
-  conn2->Prune();
-  conn3->Prune();
-  EXPECT_TRUE_SIMULATED_WAIT(ch.connections().empty(), kShortTimeout, clock);
-}
-
-// Tests that after a port allocator session is started, it will be stopped
-// when a new connection becomes writable and receiving. Also tests that if a
-// connection belonging to an old session becomes writable, it won't stop
-// the current port allocator session.
-TEST_F(P2PTransportChannelPingTest, TestStopPortAllocatorSessions) {
-  FakePortAllocator pa(rtc::Thread::Current(), nullptr);
-  P2PTransportChannel ch("test channel", 1, &pa);
-  PrepareChannel(&ch);
-  ch.SetIceConfig(CreateIceConfig(2000, GATHER_ONCE));
-  ch.MaybeStartGathering();
-  ch.AddRemoteCandidate(CreateUdpCandidate(LOCAL_PORT_TYPE, "1.1.1.1", 1, 100));
-  Connection* conn1 = WaitForConnectionTo(&ch, "1.1.1.1", 1);
-  ASSERT_TRUE(conn1 != nullptr);
-  conn1->ReceivedPingResponse(LOW_RTT, "id");  // Becomes writable and receiving
-  EXPECT_TRUE(!ch.allocator_session()->IsGettingPorts());
-
-  // Start a new session. Even though conn1, which belongs to an older
-  // session, becomes unwritable and writable again, it should not stop the
-  // current session.
-  ch.SetIceParameters(kIceParams[1]);
-  ch.MaybeStartGathering();
-  conn1->Prune();
-  conn1->ReceivedPingResponse(LOW_RTT, "id");
-  EXPECT_TRUE(ch.allocator_session()->IsGettingPorts());
-
-  // But if a new connection created from the new session becomes writable,
-  // it will stop the current session.
-  ch.AddRemoteCandidate(CreateUdpCandidate(LOCAL_PORT_TYPE, "2.2.2.2", 2, 100));
-  Connection* conn2 = WaitForConnectionTo(&ch, "2.2.2.2", 2);
-  ASSERT_TRUE(conn2 != nullptr);
-  conn2->ReceivedPingResponse(LOW_RTT, "id");  // Becomes writable and receiving
-  EXPECT_TRUE(!ch.allocator_session()->IsGettingPorts());
-}
-
-// Test that the ICE role is updated even on ports that has been removed.
-// These ports may still have connections that need a correct role, in case that
-// the connections on it may still receive stun pings.
-TEST_F(P2PTransportChannelPingTest, TestIceRoleUpdatedOnRemovedPort) {
-  FakePortAllocator pa(rtc::Thread::Current(), nullptr);
-  P2PTransportChannel ch("test channel", ICE_CANDIDATE_COMPONENT_DEFAULT, &pa);
-  // Starts with ICEROLE_CONTROLLING.
-  PrepareChannel(&ch);
-  IceConfig config = CreateIceConfig(1000, GATHER_CONTINUALLY);
-  ch.SetIceConfig(config);
-  ch.MaybeStartGathering();
-  ch.AddRemoteCandidate(CreateUdpCandidate(LOCAL_PORT_TYPE, "1.1.1.1", 1, 1));
-
-  Connection* conn = WaitForConnectionTo(&ch, "1.1.1.1", 1);
-  ASSERT_TRUE(conn != nullptr);
-
-  // Make a fake signal to remove the ports in the p2ptransportchannel. then
-  // change the ICE role and expect it to be updated.
-  std::vector<PortInterface*> ports(1, conn->port());
-  ch.allocator_session()->SignalPortsPruned(ch.allocator_session(), ports);
-  ch.SetIceRole(ICEROLE_CONTROLLED);
-  EXPECT_EQ(ICEROLE_CONTROLLED, conn->port()->GetIceRole());
-}
-
-// Test that the ICE role is updated even on ports with inactive networks.
-// These ports may still have connections that need a correct role, for the
-// pings sent by those connections until they're replaced by newer-generation
-// connections.
-TEST_F(P2PTransportChannelPingTest, TestIceRoleUpdatedOnPortAfterIceRestart) {
-  FakePortAllocator pa(rtc::Thread::Current(), nullptr);
-  P2PTransportChannel ch("test channel", ICE_CANDIDATE_COMPONENT_DEFAULT, &pa);
-  // Starts with ICEROLE_CONTROLLING.
-  PrepareChannel(&ch);
-  ch.MaybeStartGathering();
-  ch.AddRemoteCandidate(CreateUdpCandidate(LOCAL_PORT_TYPE, "1.1.1.1", 1, 1));
-
-  Connection* conn = WaitForConnectionTo(&ch, "1.1.1.1", 1);
-  ASSERT_TRUE(conn != nullptr);
-
-  // Do an ICE restart, change the role, and expect the old port to have its
-  // role updated.
-  ch.SetIceParameters(kIceParams[1]);
-  ch.MaybeStartGathering();
-  ch.SetIceRole(ICEROLE_CONTROLLED);
-  EXPECT_EQ(ICEROLE_CONTROLLED, conn->port()->GetIceRole());
-}
-
-// Test that after some amount of time without receiving data, the connection
-// will be destroyed. The port will only be destroyed after it is marked as
-// "pruned."
-TEST_F(P2PTransportChannelPingTest, TestPortDestroyedAfterTimeoutAndPruned) {
-  rtc::ScopedFakeClock fake_clock;
-
-  FakePortAllocator pa(rtc::Thread::Current(), nullptr);
-  P2PTransportChannel ch("test channel", ICE_CANDIDATE_COMPONENT_DEFAULT, &pa);
-  PrepareChannel(&ch);
-  ch.SetIceRole(ICEROLE_CONTROLLED);
-  ch.MaybeStartGathering();
-  ch.AddRemoteCandidate(CreateUdpCandidate(LOCAL_PORT_TYPE, "1.1.1.1", 1, 1));
-
-  Connection* conn = WaitForConnectionTo(&ch, "1.1.1.1", 1);
-  ASSERT_TRUE(conn != nullptr);
-
-  // Simulate 2 minutes going by. This should be enough time for the port to
-  // time out.
-  for (int second = 0; second < 120; ++second) {
-    fake_clock.AdvanceTime(rtc::TimeDelta::FromSeconds(1));
-  }
-  EXPECT_EQ(nullptr, GetConnectionTo(&ch, "1.1.1.1", 1));
-  // Port will not be removed because it is not pruned yet.
-  PortInterface* port = GetPort(&ch);
-  ASSERT_NE(nullptr, port);
-
-  // If the session prunes all ports, the port will be destroyed.
-  ch.allocator_session()->PruneAllPorts();
-  EXPECT_EQ_SIMULATED_WAIT(nullptr, GetPort(&ch), 1, fake_clock);
-  EXPECT_EQ_SIMULATED_WAIT(nullptr, GetPrunedPort(&ch), 1, fake_clock);
-}
-
-class P2PTransportChannelMostLikelyToWorkFirstTest
-    : public P2PTransportChannelPingTest {
- public:
-  P2PTransportChannelMostLikelyToWorkFirstTest()
-      : turn_server_(rtc::Thread::Current(), kTurnUdpIntAddr, kTurnUdpExtAddr) {
-    network_manager_.AddInterface(kPublicAddrs[0]);
-    allocator_.reset(
-        CreateBasicPortAllocator(&network_manager_, ServerAddresses(),
-                                 kTurnUdpIntAddr, rtc::SocketAddress()));
-    allocator_->set_flags(allocator_->flags() | PORTALLOCATOR_DISABLE_STUN |
-                          PORTALLOCATOR_DISABLE_TCP);
-    allocator_->set_step_delay(kMinimumStepDelay);
-  }
-
-  P2PTransportChannel& StartTransportChannel(
-      bool prioritize_most_likely_to_work,
-      int stable_writable_connection_ping_interval) {
-    channel_.reset(new P2PTransportChannel("checks", 1, allocator()));
-    IceConfig config = channel_->config();
-    config.prioritize_most_likely_candidate_pairs =
-        prioritize_most_likely_to_work;
-    config.stable_writable_connection_ping_interval =
-        stable_writable_connection_ping_interval;
-    channel_->SetIceConfig(config);
-    PrepareChannel(channel_.get());
-    channel_->MaybeStartGathering();
-    return *channel_.get();
-  }
-
-  BasicPortAllocator* allocator() { return allocator_.get(); }
-  TestTurnServer* turn_server() { return &turn_server_; }
-
-  // This verifies the next pingable connection has the expected candidates'
-  // types and, for relay local candidate, the expected relay protocol and ping
-  // it.
-  void VerifyNextPingableConnection(
-      const std::string& local_candidate_type,
-      const std::string& remote_candidate_type,
-      const std::string& relay_protocol_type = UDP_PROTOCOL_NAME) {
-    Connection* conn = FindNextPingableConnectionAndPingIt(channel_.get());
-    EXPECT_EQ(conn->local_candidate().type(), local_candidate_type);
-    if (conn->local_candidate().type() == RELAY_PORT_TYPE) {
-      EXPECT_EQ(conn->local_candidate().relay_protocol(), relay_protocol_type);
-    }
-    EXPECT_EQ(conn->remote_candidate().type(), remote_candidate_type);
-  }
-
- private:
-  std::unique_ptr<BasicPortAllocator> allocator_;
-  rtc::FakeNetworkManager network_manager_;
-  TestTurnServer turn_server_;
-  std::unique_ptr<P2PTransportChannel> channel_;
-};
-
-// Test that Relay/Relay connections will be pinged first when no other
-// connections have been pinged yet, unless we need to ping a trigger check or
-// we have a selected connection.
-TEST_F(P2PTransportChannelMostLikelyToWorkFirstTest,
-       TestRelayRelayFirstWhenNothingPingedYet) {
-  const int max_strong_interval = 100;
-  P2PTransportChannel& ch = StartTransportChannel(true, max_strong_interval);
-  EXPECT_TRUE_WAIT(ch.ports().size() == 2, kDefaultTimeout);
-  EXPECT_EQ(ch.ports()[0]->Type(), LOCAL_PORT_TYPE);
-  EXPECT_EQ(ch.ports()[1]->Type(), RELAY_PORT_TYPE);
-
-  ch.AddRemoteCandidate(CreateUdpCandidate(RELAY_PORT_TYPE, "1.1.1.1", 1, 1));
-  ch.AddRemoteCandidate(CreateUdpCandidate(LOCAL_PORT_TYPE, "2.2.2.2", 2, 2));
-
-  EXPECT_TRUE_WAIT(ch.connections().size() == 4, kDefaultTimeout);
-
-  // Relay/Relay should be the first pingable connection.
-  Connection* conn = FindNextPingableConnectionAndPingIt(&ch);
-  EXPECT_EQ(conn->local_candidate().type(), RELAY_PORT_TYPE);
-  EXPECT_EQ(conn->remote_candidate().type(), RELAY_PORT_TYPE);
-
-  // Unless that we have a trigger check waiting to be pinged.
-  Connection* conn2 = WaitForConnectionTo(&ch, "2.2.2.2", 2);
-  EXPECT_EQ(conn2->local_candidate().type(), LOCAL_PORT_TYPE);
-  EXPECT_EQ(conn2->remote_candidate().type(), LOCAL_PORT_TYPE);
-  conn2->ReceivedPing();
-  EXPECT_EQ(conn2, FindNextPingableConnectionAndPingIt(&ch));
-
-  // Make conn3 the selected connection.
-  Connection* conn3 = WaitForConnectionTo(&ch, "1.1.1.1", 1);
-  EXPECT_EQ(conn3->local_candidate().type(), LOCAL_PORT_TYPE);
-  EXPECT_EQ(conn3->remote_candidate().type(), RELAY_PORT_TYPE);
-  conn3->ReceivedPingResponse(LOW_RTT, "id");
-  ASSERT_TRUE(conn3->writable());
-  conn3->ReceivedPing();
-
-  /*
-
-  TODO(honghaiz): Re-enable this once we use fake clock for this test to fix
-  the flakiness. The following test becomes flaky because we now ping the
-  connections with fast rates until every connection is pinged at least three
-  times. The selected connection may have been pinged before
-  |max_strong_interval|, so it may not be the next connection to be pinged as
-  expected in the test.
-
-  // Verify that conn3 will be the "selected connection" since it is readable
-  // and writable. After |MAX_CURRENT_STRONG_INTERVAL|, it should be the next
-  // pingable connection.
-  EXPECT_TRUE_WAIT(conn3 == ch.selected_connection(), kDefaultTimeout);
-  WAIT(false, max_strong_interval + 100);
-  conn3->ReceivedPingResponse(LOW_RTT, "id");
-  ASSERT_TRUE(conn3->writable());
-  EXPECT_EQ(conn3, FindNextPingableConnectionAndPingIt(&ch));
-
-  */
-}
-
-// Test that Relay/Relay connections will be pinged first when everything has
-// been pinged even if the Relay/Relay connection wasn't the first to be pinged
-// in the first round.
-TEST_F(P2PTransportChannelMostLikelyToWorkFirstTest,
-       TestRelayRelayFirstWhenEverythingPinged) {
-  P2PTransportChannel& ch = StartTransportChannel(true, 100);
-  EXPECT_TRUE_WAIT(ch.ports().size() == 2, kDefaultTimeout);
-  EXPECT_EQ(ch.ports()[0]->Type(), LOCAL_PORT_TYPE);
-  EXPECT_EQ(ch.ports()[1]->Type(), RELAY_PORT_TYPE);
-
-  ch.AddRemoteCandidate(CreateUdpCandidate(LOCAL_PORT_TYPE, "1.1.1.1", 1, 1));
-  EXPECT_TRUE_WAIT(ch.connections().size() == 2, kDefaultTimeout);
-
-  // Initially, only have Local/Local and Local/Relay.
-  VerifyNextPingableConnection(LOCAL_PORT_TYPE, LOCAL_PORT_TYPE);
-  VerifyNextPingableConnection(RELAY_PORT_TYPE, LOCAL_PORT_TYPE);
-
-  // Remote Relay candidate arrives.
-  ch.AddRemoteCandidate(CreateUdpCandidate(RELAY_PORT_TYPE, "2.2.2.2", 2, 2));
-  EXPECT_TRUE_WAIT(ch.connections().size() == 4, kDefaultTimeout);
-
-  // Relay/Relay should be the first since it hasn't been pinged before.
-  VerifyNextPingableConnection(RELAY_PORT_TYPE, RELAY_PORT_TYPE);
-
-  // Local/Relay is the final one.
-  VerifyNextPingableConnection(LOCAL_PORT_TYPE, RELAY_PORT_TYPE);
-
-  // Now, every connection has been pinged once. The next one should be
-  // Relay/Relay.
-  VerifyNextPingableConnection(RELAY_PORT_TYPE, RELAY_PORT_TYPE);
-}
-
-// Test that when we receive a new remote candidate, they will be tried first
-// before we re-ping Relay/Relay connections again.
-TEST_F(P2PTransportChannelMostLikelyToWorkFirstTest,
-       TestNoStarvationOnNonRelayConnection) {
-  P2PTransportChannel& ch = StartTransportChannel(true, 100);
-  EXPECT_TRUE_WAIT(ch.ports().size() == 2, kDefaultTimeout);
-  EXPECT_EQ(ch.ports()[0]->Type(), LOCAL_PORT_TYPE);
-  EXPECT_EQ(ch.ports()[1]->Type(), RELAY_PORT_TYPE);
-
-  ch.AddRemoteCandidate(CreateUdpCandidate(RELAY_PORT_TYPE, "1.1.1.1", 1, 1));
-  EXPECT_TRUE_WAIT(ch.connections().size() == 2, kDefaultTimeout);
-
-  // Initially, only have Relay/Relay and Local/Relay. Ping Relay/Relay first.
-  VerifyNextPingableConnection(RELAY_PORT_TYPE, RELAY_PORT_TYPE);
-
-  // Next, ping Local/Relay.
-  VerifyNextPingableConnection(LOCAL_PORT_TYPE, RELAY_PORT_TYPE);
-
-  // Remote Local candidate arrives.
-  ch.AddRemoteCandidate(CreateUdpCandidate(LOCAL_PORT_TYPE, "2.2.2.2", 2, 2));
-  EXPECT_TRUE_WAIT(ch.connections().size() == 4, kDefaultTimeout);
-
-  // Local/Local should be the first since it hasn't been pinged before.
-  VerifyNextPingableConnection(LOCAL_PORT_TYPE, LOCAL_PORT_TYPE);
-
-  // Relay/Local is the final one.
-  VerifyNextPingableConnection(RELAY_PORT_TYPE, LOCAL_PORT_TYPE);
-
-  // Now, every connection has been pinged once. The next one should be
-  // Relay/Relay.
-  VerifyNextPingableConnection(RELAY_PORT_TYPE, RELAY_PORT_TYPE);
-}
-
-// Test the ping sequence is UDP Relay/Relay followed by TCP Relay/Relay,
-// followed by the rest.
-TEST_F(P2PTransportChannelMostLikelyToWorkFirstTest, TestTcpTurn) {
-  // Add a Tcp Turn server.
-  turn_server()->AddInternalSocket(kTurnTcpIntAddr, PROTO_TCP);
-  RelayServerConfig config(RELAY_TURN);
-  config.credentials = kRelayCredentials;
-  config.ports.push_back(ProtocolAddress(kTurnTcpIntAddr, PROTO_TCP));
-  allocator()->AddTurnServer(config);
-
-  P2PTransportChannel& ch = StartTransportChannel(true, 100);
-  EXPECT_TRUE_WAIT(ch.ports().size() == 3, kDefaultTimeout);
-  EXPECT_EQ(ch.ports()[0]->Type(), LOCAL_PORT_TYPE);
-  EXPECT_EQ(ch.ports()[1]->Type(), RELAY_PORT_TYPE);
-  EXPECT_EQ(ch.ports()[2]->Type(), RELAY_PORT_TYPE);
-
-  // Remote Relay candidate arrives.
-  ch.AddRemoteCandidate(CreateUdpCandidate(RELAY_PORT_TYPE, "1.1.1.1", 1, 1));
-  EXPECT_TRUE_WAIT(ch.connections().size() == 3, kDefaultTimeout);
-
-  // UDP Relay/Relay should be pinged first.
-  VerifyNextPingableConnection(RELAY_PORT_TYPE, RELAY_PORT_TYPE);
-
-  // TCP Relay/Relay is the next.
-  VerifyNextPingableConnection(RELAY_PORT_TYPE, RELAY_PORT_TYPE,
-                               TCP_PROTOCOL_NAME);
-
-  // Finally, Local/Relay will be pinged.
-  VerifyNextPingableConnection(LOCAL_PORT_TYPE, RELAY_PORT_TYPE);
-}
-
-}  // namespace cricket {
diff --git a/p2p/base/packetlossestimator.cc b/p2p/base/packetlossestimator.cc
deleted file mode 100644
index 7990119..0000000
--- a/p2p/base/packetlossestimator.cc
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
- *  Copyright 2017 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 <sstream>
-
-#include "webrtc/p2p/base/packetlossestimator.h"
-
-#include "webrtc/rtc_base/checks.h"
-
-namespace cricket {
-
-PacketLossEstimator::PacketLossEstimator(int64_t consider_lost_after_ms,
-                                         int64_t forget_after_ms)
-    : consider_lost_after_ms_(consider_lost_after_ms),
-      forget_after_ms_(forget_after_ms) {
-  RTC_DCHECK_LT(consider_lost_after_ms, forget_after_ms);
-}
-
-void PacketLossEstimator::ExpectResponse(std::string id, int64_t sent_time) {
-  tracked_packets_[id] = PacketInfo{sent_time, false};
-
-  // Called to free memory in case the client hasn't called UpdateResponseRate
-  // in a while.
-  MaybeForgetOldRequests(sent_time);
-}
-
-void PacketLossEstimator::ReceivedResponse(std::string id,
-                                           int64_t received_time) {
-  auto iter = tracked_packets_.find(id);
-  if (iter != tracked_packets_.end()) {
-    auto& packet_info = iter->second;
-    packet_info.response_received = true;
-  }
-
-  // Called to free memory in case the client hasn't called UpdateResponseRate
-  // in a while.
-  MaybeForgetOldRequests(received_time);
-}
-
-void PacketLossEstimator::UpdateResponseRate(int64_t now) {
-  int responses_expected = 0;
-  int responses_received = 0;
-
-  for (auto iter = tracked_packets_.begin(); iter != tracked_packets_.end();) {
-    const auto& packet_info = iter->second;
-    if (Forget(packet_info, now)) {
-      iter = tracked_packets_.erase(iter);
-      continue;
-    }
-    if (packet_info.response_received) {
-      responses_expected += 1;
-      responses_received += 1;
-    } else if (ConsiderLost(packet_info, now)) {
-      responses_expected += 1;
-    }
-    ++iter;
-  }
-
-  if (responses_expected > 0) {
-    response_rate_ =
-        static_cast<double>(responses_received) / responses_expected;
-  } else {
-    response_rate_ = 1.0;
-  }
-
-  last_forgot_at_ = now;
-}
-
-void PacketLossEstimator::MaybeForgetOldRequests(int64_t now) {
-  if (now - last_forgot_at_ <= forget_after_ms_) {
-    return;
-  }
-
-  for (auto iter = tracked_packets_.begin(); iter != tracked_packets_.end();) {
-    const auto& packet_info = iter->second;
-    if (Forget(packet_info, now)) {
-      iter = tracked_packets_.erase(iter);
-    } else {
-      ++iter;
-    }
-  }
-
-  last_forgot_at_ = now;
-}
-
-bool PacketLossEstimator::ConsiderLost(const PacketInfo& packet_info,
-                                       int64_t now) const {
-  return packet_info.sent_time < now - consider_lost_after_ms_;
-}
-
-bool PacketLossEstimator::Forget(const PacketInfo& packet_info,
-                                 int64_t now) const {
-  return now - packet_info.sent_time > forget_after_ms_;
-}
-
-std::size_t PacketLossEstimator::tracked_packet_count_for_testing() const {
-  return tracked_packets_.size();
-}
-
-std::string PacketLossEstimator::TrackedPacketsStringForTesting(
-    std::size_t max) const {
-  std::ostringstream oss;
-
-  size_t count = 0;
-  for (const auto& p : tracked_packets_) {
-    const auto& id = p.first;
-    const auto& packet_info = p.second;
-    oss << "{ " << id << ", " << packet_info.sent_time << "}, ";
-    count += 1;
-    if (count == max) {
-      oss << "...";
-      break;
-    }
-  }
-
-  return oss.str();
-}
-
-}  // namespace cricket
diff --git a/p2p/base/packetlossestimator.h b/p2p/base/packetlossestimator.h
deleted file mode 100644
index dfc5fe5..0000000
--- a/p2p/base/packetlossestimator.h
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- *  Copyright 2017 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_P2P_BASE_PACKETLOSSESTIMATOR_H_
-#define WEBRTC_P2P_BASE_PACKETLOSSESTIMATOR_H_
-
-#include <stdint.h>
-#include <string>
-#include <unordered_map>
-
-namespace cricket {
-
-// Estimates the response rate for a series of messages expecting responses.
-// Messages and their corresponding responses are identified by a string id.
-//
-// Responses are considered lost if they are not received within
-// |consider_lost_after_ms|. If a response is received after
-// |consider_lost_after_ms|, it is still considered as a response.
-// Messages sent more than |forget_after_ms| ago are not considered
-// anymore. The response rate is initially assumed to be 1.0.
-//
-// If the current time is 7, |forget_after_ms| is 6, and
-// |consider_lost_after_ms| is 2, the response rate considers messages sent
-// between times 1 and 5, so only messages in the following window can be
-// considered lost:
-//
-// Time: 0 1 2 3 4 5 6 7
-// Wind:   <------->   |
-//
-// Responses received to the right of the window are still counted.
-class PacketLossEstimator {
- public:
-  explicit PacketLossEstimator(int64_t consider_lost_after_ms,
-                               int64_t forget_after_ms);
-
-  // Registers that a message with the given |id| was sent at |sent_time|.
-  void ExpectResponse(std::string id, int64_t sent_time);
-
-  // Registers a response with the given |id| was received at |received_time|.
-  void ReceivedResponse(std::string id, int64_t received_time);
-
-  // Calculates the current response rate based on the expected and received
-  // messages. Messages sent more than |forget_after| ms ago will be forgotten.
-  void UpdateResponseRate(int64_t now);
-
-  // Gets the current response rate as updated by UpdateResponseRate.
-  double get_response_rate() const { return response_rate_; }
-
-  std::size_t tracked_packet_count_for_testing() const;
-
-  // Output tracked packet state as a string.
-  std::string TrackedPacketsStringForTesting(std::size_t max) const;
-
- private:
-  struct PacketInfo {
-    int64_t sent_time;
-    bool response_received;
-  };
-
-  // Called periodically by ExpectResponse and ReceivedResponse to manage memory
-  // usage.
-  void MaybeForgetOldRequests(int64_t now);
-
-  bool ConsiderLost(const PacketInfo&, int64_t now) const;
-  bool Forget(const PacketInfo&, int64_t now) const;
-
-  int64_t consider_lost_after_ms_;
-  int64_t forget_after_ms_;
-
-  int64_t last_forgot_at_ = 0;
-
-  std::unordered_map<std::string, PacketInfo> tracked_packets_;
-
-  double response_rate_ = 1.0;
-};
-
-}  // namespace cricket
-
-#endif  // WEBRTC_P2P_BASE_PACKETLOSSESTIMATOR_H_
diff --git a/p2p/base/packetlossestimator_unittest.cc b/p2p/base/packetlossestimator_unittest.cc
deleted file mode 100644
index 642dcc2..0000000
--- a/p2p/base/packetlossestimator_unittest.cc
+++ /dev/null
@@ -1,172 +0,0 @@
-/*
- *  Copyright 2017 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/p2p/base/packetlossestimator.h"
-#include "webrtc/rtc_base/gunit.h"
-
-using cricket::PacketLossEstimator;
-
-class PacketLossEstimatorTest : public testing::Test {};
-
-TEST_F(PacketLossEstimatorTest, InitialResponseRate) {
-  PacketLossEstimator ple(5, 100);
-  EXPECT_EQ(1.0, ple.get_response_rate());
-}
-
-TEST_F(PacketLossEstimatorTest, InitialUpdateResponseRate) {
-  PacketLossEstimator ple(5, 100);
-  ple.UpdateResponseRate(10);
-  EXPECT_EQ(1.0, ple.get_response_rate());
-}
-
-TEST_F(PacketLossEstimatorTest, ResponseReceived) {
-  PacketLossEstimator ple(5, 100);
-
-  ple.ExpectResponse("a", 0);
-  ple.ReceivedResponse("a", 1);
-  ple.UpdateResponseRate(2);
-
-  EXPECT_EQ(1.0, ple.get_response_rate());
-}
-
-TEST_F(PacketLossEstimatorTest, ResponseNotConsideredLostYet) {
-  PacketLossEstimator ple(5, 100);
-
-  ple.ExpectResponse("a", 0);
-  ple.UpdateResponseRate(2);
-
-  EXPECT_EQ(1.0, ple.get_response_rate());
-}
-
-TEST_F(PacketLossEstimatorTest, ResponseConsideredLost) {
-  PacketLossEstimator ple(5, 100);
-
-  ple.ExpectResponse("a", 0);
-  ple.UpdateResponseRate(10);
-
-  EXPECT_EQ(0.0, ple.get_response_rate());
-}
-
-TEST_F(PacketLossEstimatorTest, ResponseLate) {
-  PacketLossEstimator ple(5, 100);
-
-  ple.ExpectResponse("a", 0);
-  ple.ReceivedResponse("a", 6);
-  ple.UpdateResponseRate(10);
-
-  EXPECT_EQ(1.0, ple.get_response_rate());
-}
-
-TEST_F(PacketLossEstimatorTest, ResponseForgotten) {
-  PacketLossEstimator ple(5, 100);
-  ple.ExpectResponse("a", 0);
-  ple.UpdateResponseRate(101);
-
-  EXPECT_EQ(1.0, ple.get_response_rate());
-}
-
-TEST_F(PacketLossEstimatorTest, Lost1_Received1) {
-  PacketLossEstimator ple(5, 100);
-
-  ple.ExpectResponse("a", 0);
-  ple.ExpectResponse("b", 2);
-  ple.ReceivedResponse("b", 6);
-  ple.UpdateResponseRate(7);
-
-  EXPECT_EQ(0.5, ple.get_response_rate());
-}
-
-static const std::pair<std::string, int64_t> kFivePackets[5] = {{"a", 0},
-                                                                {"b", 2},
-                                                                {"c", 4},
-                                                                {"d", 6},
-                                                                {"e", 8}};
-
-// Time: 0 1 2 3 4 5 6 7 8 9 10
-// Sent: a   b   c   d   e   |
-// Recv:       b             |
-// Wind: -------------->     |
-TEST_F(PacketLossEstimatorTest, Lost3_Received1_Waiting1) {
-  PacketLossEstimator ple(3, 100);
-
-  for (const auto& p : kFivePackets) {
-    ple.ExpectResponse(p.first, p.second);
-  }
-  ple.ReceivedResponse("b", 3);
-  ple.UpdateResponseRate(10);
-  EXPECT_EQ(0.25, ple.get_response_rate());
-}
-
-// Time: 0 1 2 3 4 5 6 7 8 9 10
-// Sent: a   b   c   d   e   |
-// Recv:                   e |
-// Wind: -------------->     |
-TEST_F(PacketLossEstimatorTest, Lost4_Early1) {
-  PacketLossEstimator ple(3, 100);
-
-  for (const auto& p : kFivePackets) {
-    ple.ExpectResponse(p.first, p.second);
-  }
-  ple.ReceivedResponse("e", 9);
-  ple.UpdateResponseRate(10);
-  // e should be considered, even though its response was received less than
-  // |consider_lost_after_ms| ago.
-  EXPECT_EQ(0.2, ple.get_response_rate());
-}
-
-// Time: 0 1 2 3 4 5 6 7 8 9 10
-// Sent: a   b   c   d   e   |
-// Recv:           c         |
-// Wind:       <------->     |
-TEST_F(PacketLossEstimatorTest, Forgot2_Received1_Lost1_Waiting1) {
-  PacketLossEstimator ple(3, 7);
-
-  for (const auto& p : kFivePackets) {
-    ple.ExpectResponse(p.first, p.second);
-  }
-  ple.ReceivedResponse("c", 5);
-  ple.UpdateResponseRate(10);
-  EXPECT_EQ(0.5, ple.get_response_rate());
-}
-
-// Tests that old messages are forgotten if ExpectResponse is called
-// |forget_after_ms| after |last_forgot_at|. It is important that ExpectResponse
-// and ReceivedResponse forget old messages to avoid |tracked_packets_| growing
-// without bound if UpdateResponseRate is never called (or rarely called).
-//
-// Time: 0 1 2 3 4 5 6
-// Sent: a           b
-// Wind:   <------->
-TEST_F(PacketLossEstimatorTest, ExpectResponseForgetsOldPackets) {
-  PacketLossEstimator ple(1, 5);
-  ple.ExpectResponse("a", 0);  // This message will be forgotten.
-  ple.ExpectResponse("b", 6);  // This call should trigger clean up.
-  // a should be forgotten, b should be tracked.
-  EXPECT_EQ(1u, ple.tracked_packet_count_for_testing());
-}
-
-// Tests that old messages are forgotten if ExpectResponse is called
-// |forget_after_ms| after |last_forgot_at|. It is important that ExpectResponse
-// and ReceivedResponse forget old messages to avoid |tracked_packets_| growing
-// without bound if UpdateResponseRate is never called (or rarely called).
-//
-// Time: 0 1 2 3 4 5 6
-// Sent: a
-// Recv:             b
-// Wind:   <------->
-TEST_F(PacketLossEstimatorTest, ReceivedResponseForgetsOldPackets) {
-  PacketLossEstimator ple(1, 5);
-  ple.ExpectResponse("a", 0);    // This message will be forgotten.
-  ple.ReceivedResponse("b", 6);  // This call should trigger clean up.
-  // a should be forgoten, b should not be tracked (received but not sent).
-  EXPECT_EQ(0u, ple.tracked_packet_count_for_testing());
-}
diff --git a/p2p/base/packetsocketfactory.h b/p2p/base/packetsocketfactory.h
deleted file mode 100644
index 8ae0bd3..0000000
--- a/p2p/base/packetsocketfactory.h
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- *  Copyright 2011 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_P2P_BASE_PACKETSOCKETFACTORY_H_
-#define WEBRTC_P2P_BASE_PACKETSOCKETFACTORY_H_
-
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/proxyinfo.h"
-
-namespace rtc {
-
-// This structure contains options required to create TCP packet sockets.
-struct PacketSocketTcpOptions {
-  int opts;
-  std::vector<std::string> tls_alpn_protocols;
-  std::vector<std::string> tls_elliptic_curves;
-};
-
-class AsyncPacketSocket;
-class AsyncResolverInterface;
-
-class PacketSocketFactory {
- public:
-  enum Options {
-    OPT_STUN = 0x04,
-
-    // The TLS options below are mutually exclusive.
-    OPT_TLS = 0x02,           // Real and secure TLS.
-    OPT_TLS_FAKE = 0x01,      // Fake TLS with a dummy SSL handshake.
-    OPT_TLS_INSECURE = 0x08,  // Insecure TLS without certificate validation.
-
-    // Deprecated, use OPT_TLS_FAKE.
-    OPT_SSLTCP = OPT_TLS_FAKE,
-  };
-
-  PacketSocketFactory() { }
-  virtual ~PacketSocketFactory() { }
-
-  virtual AsyncPacketSocket* CreateUdpSocket(const SocketAddress& address,
-                                             uint16_t min_port,
-                                             uint16_t max_port) = 0;
-  virtual AsyncPacketSocket* CreateServerTcpSocket(
-      const SocketAddress& local_address,
-      uint16_t min_port,
-      uint16_t max_port,
-      int opts) = 0;
-
-  // TODO(deadbeef): |proxy_info| and |user_agent| should be set
-  // per-factory and not when socket is created.
-  virtual AsyncPacketSocket* CreateClientTcpSocket(
-      const SocketAddress& local_address,
-      const SocketAddress& remote_address,
-      const ProxyInfo& proxy_info,
-      const std::string& user_agent,
-      int opts) = 0;
-
-  // TODO(deadbeef): |proxy_info|, |user_agent| and |tcp_options| should
-  // be set per-factory and not when socket is created.
-  // TODO(deadbeef): Implement this method in all subclasses (namely those in
-  // Chromium), make pure virtual, and remove the old CreateClientTcpSocket.
-  virtual AsyncPacketSocket* CreateClientTcpSocket(
-      const SocketAddress& local_address,
-      const SocketAddress& remote_address,
-      const ProxyInfo& proxy_info,
-      const std::string& user_agent,
-      const PacketSocketTcpOptions& tcp_options) {
-    return CreateClientTcpSocket(local_address, remote_address, proxy_info,
-                                 user_agent, tcp_options.opts);
-  }
-
-  virtual AsyncResolverInterface* CreateAsyncResolver() = 0;
-
- private:
-  RTC_DISALLOW_COPY_AND_ASSIGN(PacketSocketFactory);
-};
-
-}  // namespace rtc
-
-#endif  // WEBRTC_P2P_BASE_PACKETSOCKETFACTORY_H_
diff --git a/p2p/base/packettransportinterface.h b/p2p/base/packettransportinterface.h
deleted file mode 100644
index 05ca746..0000000
--- a/p2p/base/packettransportinterface.h
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- *  Copyright 2017 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.
- */
-
-// This exists for backwards compatibility with chromium remoting code that
-// uses it.
-// TODO(deadbeef): Update chromium and remove this file.
-
-#ifndef WEBRTC_P2P_BASE_PACKETTRANSPORTINTERFACE_H_
-#define WEBRTC_P2P_BASE_PACKETTRANSPORTINTERFACE_H_
-
-#include "webrtc/p2p/base/packettransportinternal.h"
-
-namespace rtc {
-typedef PacketTransportInternal PacketTransportInterface;
-}
-
-#endif
diff --git a/p2p/base/packettransportinternal.h b/p2p/base/packettransportinternal.h
deleted file mode 100644
index 3dc27d5..0000000
--- a/p2p/base/packettransportinternal.h
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- *  Copyright 2017 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_P2P_BASE_PACKETTRANSPORTINTERNAL_H_
-#define WEBRTC_P2P_BASE_PACKETTRANSPORTINTERNAL_H_
-
-#include <string>
-#include <vector>
-
-// This is included for PacketOptions.
-#include "webrtc/api/ortc/packettransportinterface.h"
-#include "webrtc/rtc_base/asyncpacketsocket.h"
-#include "webrtc/rtc_base/sigslot.h"
-#include "webrtc/rtc_base/socket.h"
-
-namespace cricket {
-class TransportChannel;
-}
-
-namespace rtc {
-struct PacketOptions;
-struct PacketTime;
-struct SentPacket;
-
-class PacketTransportInternal : public virtual webrtc::PacketTransportInterface,
-                                public sigslot::has_slots<> {
- public:
-  // Identify the object for logging and debug purpose.
-  virtual std::string debug_name() const = 0;
-
-  // The transport has been established.
-  virtual bool writable() const = 0;
-
-  // The transport has received a packet in the last X milliseconds, here X is
-  // configured by each implementation.
-  virtual bool receiving() const = 0;
-
-  // Attempts to send the given packet.
-  // The return value is < 0 on failure. The return value in failure case is not
-  // descriptive. Depending on failure cause and implementation details
-  // GetError() returns an descriptive errno.h error value.
-  // This mimics posix socket send() or sendto() behavior.
-  // TODO(johan): Reliable, meaningful, consistent error codes for all
-  // implementations would be nice.
-  // TODO(johan): Remove the default argument once channel code is updated.
-  virtual int SendPacket(const char* data,
-                         size_t len,
-                         const rtc::PacketOptions& options,
-                         int flags = 0) = 0;
-
-  // Sets a socket option. Note that not all options are
-  // supported by all transport types.
-  virtual int SetOption(rtc::Socket::Option opt, int value) = 0;
-
-  // TODO(pthatcher): Once Chrome's MockPacketTransportInterface implements
-  // this, remove the default implementation.
-  virtual bool GetOption(rtc::Socket::Option opt, int* value) { return false; }
-
-  // Returns the most recent error that occurred on this channel.
-  virtual int GetError() = 0;
-
-  // Emitted when the writable state, represented by |writable()|, changes.
-  sigslot::signal1<PacketTransportInternal*> SignalWritableState;
-
-  //  Emitted when the PacketTransportInternal is ready to send packets. "Ready
-  //  to send" is more sensitive than the writable state; a transport may be
-  //  writable, but temporarily not able to send packets. For example, the
-  //  underlying transport's socket buffer may be full, as indicated by
-  //  SendPacket's return code and/or GetError.
-  sigslot::signal1<PacketTransportInternal*> SignalReadyToSend;
-
-  // Emitted when receiving state changes to true.
-  sigslot::signal1<PacketTransportInternal*> SignalReceivingState;
-
-  // Signalled each time a packet is received on this channel.
-  sigslot::signal5<PacketTransportInternal*,
-                   const char*,
-                   size_t,
-                   const rtc::PacketTime&,
-                   int>
-      SignalReadPacket;
-
-  // Signalled each time a packet is sent on this channel.
-  sigslot::signal2<PacketTransportInternal*, const rtc::SentPacket&>
-      SignalSentPacket;
-
- protected:
-  PacketTransportInternal* GetInternal() override { return this; }
-};
-
-}  // namespace rtc
-
-#endif  // WEBRTC_P2P_BASE_PACKETTRANSPORTINTERNAL_H_
diff --git a/p2p/base/port.cc b/p2p/base/port.cc
deleted file mode 100644
index 40b2502..0000000
--- a/p2p/base/port.cc
+++ /dev/null
@@ -1,1639 +0,0 @@
-/*
- *  Copyright 2004 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/p2p/base/port.h"
-
-#include <algorithm>
-#include <vector>
-
-#include "webrtc/p2p/base/common.h"
-#include "webrtc/p2p/base/portallocator.h"
-#include "webrtc/rtc_base/base64.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/crc32.h"
-#include "webrtc/rtc_base/helpers.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/messagedigest.h"
-#include "webrtc/rtc_base/network.h"
-#include "webrtc/rtc_base/ptr_util.h"
-#include "webrtc/rtc_base/safe_minmax.h"
-#include "webrtc/rtc_base/stringencode.h"
-#include "webrtc/rtc_base/stringutils.h"
-
-namespace {
-
-// Determines whether we have seen at least the given maximum number of
-// pings fail to have a response.
-inline bool TooManyFailures(
-    const std::vector<cricket::Connection::SentPing>& pings_since_last_response,
-    uint32_t maximum_failures,
-    int rtt_estimate,
-    int64_t now) {
-  // If we haven't sent that many pings, then we can't have failed that many.
-  if (pings_since_last_response.size() < maximum_failures)
-    return false;
-
-  // Check if the window in which we would expect a response to the ping has
-  // already elapsed.
-  int64_t expected_response_time =
-      pings_since_last_response[maximum_failures - 1].sent_time + rtt_estimate;
-  return now > expected_response_time;
-}
-
-// Determines whether we have gone too long without seeing any response.
-inline bool TooLongWithoutResponse(
-    const std::vector<cricket::Connection::SentPing>& pings_since_last_response,
-    int64_t maximum_time,
-    int64_t now) {
-  if (pings_since_last_response.size() == 0)
-    return false;
-
-  auto first = pings_since_last_response[0];
-  return now > (first.sent_time + maximum_time);
-}
-
-// We will restrict RTT estimates (when used for determining state) to be
-// within a reasonable range.
-const int MINIMUM_RTT = 100;   // 0.1 seconds
-const int MAXIMUM_RTT = 60000;  // 60 seconds
-
-// When we don't have any RTT data, we have to pick something reasonable.  We
-// use a large value just in case the connection is really slow.
-const int DEFAULT_RTT = 3000;  // 3 seconds
-
-// Computes our estimate of the RTT given the current estimate.
-inline int ConservativeRTTEstimate(int rtt) {
-  return rtc::SafeClamp(2 * rtt, MINIMUM_RTT, MAXIMUM_RTT);
-}
-
-// Weighting of the old rtt value to new data.
-const int RTT_RATIO = 3;  // 3 : 1
-
-// The delay before we begin checking if this port is useless. We set
-// it to a little higher than a total STUN timeout.
-const int kPortTimeoutDelay = cricket::STUN_TOTAL_TIMEOUT + 5000;
-
-// For packet loss estimation.
-const int64_t kConsiderPacketLostAfter = 3000;  // 3 seconds
-
-// For packet loss estimation.
-const int64_t kForgetPacketAfter = 30000;  // 30 seconds
-
-}  // namespace
-
-namespace cricket {
-
-// TODO(ronghuawu): Use "local", "srflx", "prflx" and "relay". But this requires
-// the signaling part be updated correspondingly as well.
-const char LOCAL_PORT_TYPE[] = "local";
-const char STUN_PORT_TYPE[] = "stun";
-const char PRFLX_PORT_TYPE[] = "prflx";
-const char RELAY_PORT_TYPE[] = "relay";
-
-const char UDP_PROTOCOL_NAME[] = "udp";
-const char TCP_PROTOCOL_NAME[] = "tcp";
-const char SSLTCP_PROTOCOL_NAME[] = "ssltcp";
-const char TLS_PROTOCOL_NAME[] = "tls";
-
-static const char* const PROTO_NAMES[] = {UDP_PROTOCOL_NAME, TCP_PROTOCOL_NAME,
-                                          SSLTCP_PROTOCOL_NAME,
-                                          TLS_PROTOCOL_NAME};
-
-const char* ProtoToString(ProtocolType proto) {
-  return PROTO_NAMES[proto];
-}
-
-bool StringToProto(const char* value, ProtocolType* proto) {
-  for (size_t i = 0; i <= PROTO_LAST; ++i) {
-    if (_stricmp(PROTO_NAMES[i], value) == 0) {
-      *proto = static_cast<ProtocolType>(i);
-      return true;
-    }
-  }
-  return false;
-}
-
-// RFC 6544, TCP candidate encoding rules.
-const int DISCARD_PORT = 9;
-const char TCPTYPE_ACTIVE_STR[] = "active";
-const char TCPTYPE_PASSIVE_STR[] = "passive";
-const char TCPTYPE_SIMOPEN_STR[] = "so";
-
-// Foundation:  An arbitrary string that is the same for two candidates
-//   that have the same type, base IP address, protocol (UDP, TCP,
-//   etc.), and STUN or TURN server.  If any of these are different,
-//   then the foundation will be different.  Two candidate pairs with
-//   the same foundation pairs are likely to have similar network
-//   characteristics.  Foundations are used in the frozen algorithm.
-static std::string ComputeFoundation(const std::string& type,
-                                     const std::string& protocol,
-                                     const std::string& relay_protocol,
-                                     const rtc::SocketAddress& base_address) {
-  std::ostringstream ost;
-  ost << type << base_address.ipaddr().ToString() << protocol << relay_protocol;
-  return rtc::ToString<uint32_t>(rtc::ComputeCrc32(ost.str()));
-}
-
-Port::Port(rtc::Thread* thread,
-           const std::string& type,
-           rtc::PacketSocketFactory* factory,
-           rtc::Network* network,
-           const std::string& username_fragment,
-           const std::string& password)
-    : thread_(thread),
-      factory_(factory),
-      type_(type),
-      send_retransmit_count_attribute_(false),
-      network_(network),
-      min_port_(0),
-      max_port_(0),
-      component_(ICE_CANDIDATE_COMPONENT_DEFAULT),
-      generation_(0),
-      ice_username_fragment_(username_fragment),
-      password_(password),
-      timeout_delay_(kPortTimeoutDelay),
-      enable_port_packets_(false),
-      ice_role_(ICEROLE_UNKNOWN),
-      tiebreaker_(0),
-      shared_socket_(true) {
-  Construct();
-}
-
-Port::Port(rtc::Thread* thread,
-           const std::string& type,
-           rtc::PacketSocketFactory* factory,
-           rtc::Network* network,
-           uint16_t min_port,
-           uint16_t max_port,
-           const std::string& username_fragment,
-           const std::string& password)
-    : thread_(thread),
-      factory_(factory),
-      type_(type),
-      send_retransmit_count_attribute_(false),
-      network_(network),
-      min_port_(min_port),
-      max_port_(max_port),
-      component_(ICE_CANDIDATE_COMPONENT_DEFAULT),
-      generation_(0),
-      ice_username_fragment_(username_fragment),
-      password_(password),
-      timeout_delay_(kPortTimeoutDelay),
-      enable_port_packets_(false),
-      ice_role_(ICEROLE_UNKNOWN),
-      tiebreaker_(0),
-      shared_socket_(false) {
-  RTC_DCHECK(factory_ != NULL);
-  Construct();
-}
-
-void Port::Construct() {
-  // TODO(pthatcher): Remove this old behavior once we're sure no one
-  // relies on it.  If the username_fragment and password are empty,
-  // we should just create one.
-  if (ice_username_fragment_.empty()) {
-    RTC_DCHECK(password_.empty());
-    ice_username_fragment_ = rtc::CreateRandomString(ICE_UFRAG_LENGTH);
-    password_ = rtc::CreateRandomString(ICE_PWD_LENGTH);
-  }
-  network_->SignalTypeChanged.connect(this, &Port::OnNetworkTypeChanged);
-  network_cost_ = network_->GetCost();
-
-  thread_->PostDelayed(RTC_FROM_HERE, timeout_delay_, this,
-                       MSG_DESTROY_IF_DEAD);
-  LOG_J(LS_INFO, this) << "Port created with network cost " << network_cost_;
-}
-
-Port::~Port() {
-  // Delete all of the remaining connections.  We copy the list up front
-  // because each deletion will cause it to be modified.
-
-  std::vector<Connection*> list;
-
-  AddressMap::iterator iter = connections_.begin();
-  while (iter != connections_.end()) {
-    list.push_back(iter->second);
-    ++iter;
-  }
-
-  for (uint32_t i = 0; i < list.size(); i++)
-    delete list[i];
-}
-
-void Port::SetIceParameters(int component,
-                            const std::string& username_fragment,
-                            const std::string& password) {
-  component_ = component;
-  ice_username_fragment_ = username_fragment;
-  password_ = password;
-  for (Candidate& c : candidates_) {
-    c.set_component(component);
-    c.set_username(username_fragment);
-    c.set_password(password);
-  }
-}
-
-Connection* Port::GetConnection(const rtc::SocketAddress& remote_addr) {
-  AddressMap::const_iterator iter = connections_.find(remote_addr);
-  if (iter != connections_.end())
-    return iter->second;
-  else
-    return NULL;
-}
-
-void Port::AddAddress(const rtc::SocketAddress& address,
-                      const rtc::SocketAddress& base_address,
-                      const rtc::SocketAddress& related_address,
-                      const std::string& protocol,
-                      const std::string& relay_protocol,
-                      const std::string& tcptype,
-                      const std::string& type,
-                      uint32_t type_preference,
-                      uint32_t relay_preference,
-                      bool final) {
-  AddAddress(address, base_address, related_address, protocol, relay_protocol,
-             tcptype, type, type_preference, relay_preference, "", final);
-}
-
-void Port::AddAddress(const rtc::SocketAddress& address,
-                      const rtc::SocketAddress& base_address,
-                      const rtc::SocketAddress& related_address,
-                      const std::string& protocol,
-                      const std::string& relay_protocol,
-                      const std::string& tcptype,
-                      const std::string& type,
-                      uint32_t type_preference,
-                      uint32_t relay_preference,
-                      const std::string& url,
-                      bool final) {
-  if (protocol == TCP_PROTOCOL_NAME && type == LOCAL_PORT_TYPE) {
-    RTC_DCHECK(!tcptype.empty());
-  }
-
-  std::string foundation =
-      ComputeFoundation(type, protocol, relay_protocol, base_address);
-  Candidate c(component_, protocol, address, 0U, username_fragment(), password_,
-              type, generation_, foundation, network_->id(), network_cost_);
-  c.set_priority(
-      c.GetPriority(type_preference, network_->preference(), relay_preference));
-  c.set_relay_protocol(relay_protocol);
-  c.set_tcptype(tcptype);
-  c.set_network_name(network_->name());
-  c.set_network_type(network_->type());
-  c.set_related_address(related_address);
-  c.set_url(url);
-  candidates_.push_back(c);
-  SignalCandidateReady(this, c);
-
-  if (final) {
-    SignalPortComplete(this);
-  }
-}
-
-void Port::AddOrReplaceConnection(Connection* conn) {
-  auto ret = connections_.insert(
-      std::make_pair(conn->remote_candidate().address(), conn));
-  // If there is a different connection on the same remote address, replace
-  // it with the new one and destroy the old one.
-  if (ret.second == false && ret.first->second != conn) {
-    LOG_J(LS_WARNING, this)
-        << "A new connection was created on an existing remote address. "
-        << "New remote candidate: " << conn->remote_candidate().ToString();
-    ret.first->second->SignalDestroyed.disconnect(this);
-    ret.first->second->Destroy();
-    ret.first->second = conn;
-  }
-  conn->SignalDestroyed.connect(this, &Port::OnConnectionDestroyed);
-  SignalConnectionCreated(this, conn);
-}
-
-void Port::OnReadPacket(
-    const char* data, size_t size, const rtc::SocketAddress& addr,
-    ProtocolType proto) {
-  // If the user has enabled port packets, just hand this over.
-  if (enable_port_packets_) {
-    SignalReadPacket(this, data, size, addr);
-    return;
-  }
-
-  // If this is an authenticated STUN request, then signal unknown address and
-  // send back a proper binding response.
-  std::unique_ptr<IceMessage> msg;
-  std::string remote_username;
-  if (!GetStunMessage(data, size, addr, &msg, &remote_username)) {
-    LOG_J(LS_ERROR, this) << "Received non-STUN packet from unknown address ("
-                          << addr.ToSensitiveString() << ")";
-  } else if (!msg) {
-    // STUN message handled already
-  } else if (msg->type() == STUN_BINDING_REQUEST) {
-    LOG(LS_INFO) << "Received STUN ping "
-                 << " id=" << rtc::hex_encode(msg->transaction_id())
-                 << " from unknown address " << addr.ToSensitiveString();
-
-    // Check for role conflicts.
-    if (!MaybeIceRoleConflict(addr, msg.get(), remote_username)) {
-      LOG(LS_INFO) << "Received conflicting role from the peer.";
-      return;
-    }
-
-    SignalUnknownAddress(this, addr, proto, msg.get(), remote_username, false);
-  } else {
-    // NOTE(tschmelcher): STUN_BINDING_RESPONSE is benign. It occurs if we
-    // pruned a connection for this port while it had STUN requests in flight,
-    // because we then get back responses for them, which this code correctly
-    // does not handle.
-    if (msg->type() != STUN_BINDING_RESPONSE) {
-      LOG_J(LS_ERROR, this) << "Received unexpected STUN message type ("
-                            << msg->type() << ") from unknown address ("
-                            << addr.ToSensitiveString() << ")";
-    }
-  }
-}
-
-void Port::OnReadyToSend() {
-  AddressMap::iterator iter = connections_.begin();
-  for (; iter != connections_.end(); ++iter) {
-    iter->second->OnReadyToSend();
-  }
-}
-
-size_t Port::AddPrflxCandidate(const Candidate& local) {
-  candidates_.push_back(local);
-  return (candidates_.size() - 1);
-}
-
-bool Port::GetStunMessage(const char* data,
-                          size_t size,
-                          const rtc::SocketAddress& addr,
-                          std::unique_ptr<IceMessage>* out_msg,
-                          std::string* out_username) {
-  // NOTE: This could clearly be optimized to avoid allocating any memory.
-  //       However, at the data rates we'll be looking at on the client side,
-  //       this probably isn't worth worrying about.
-  RTC_DCHECK(out_msg != NULL);
-  RTC_DCHECK(out_username != NULL);
-  out_username->clear();
-
-  // Don't bother parsing the packet if we can tell it's not STUN.
-  // In ICE mode, all STUN packets will have a valid fingerprint.
-  if (!StunMessage::ValidateFingerprint(data, size)) {
-    return false;
-  }
-
-  // Parse the request message.  If the packet is not a complete and correct
-  // STUN message, then ignore it.
-  std::unique_ptr<IceMessage> stun_msg(new IceMessage());
-  rtc::ByteBufferReader buf(data, size);
-  if (!stun_msg->Read(&buf) || (buf.Length() > 0)) {
-    return false;
-  }
-
-  if (stun_msg->type() == STUN_BINDING_REQUEST) {
-    // Check for the presence of USERNAME and MESSAGE-INTEGRITY (if ICE) first.
-    // If not present, fail with a 400 Bad Request.
-    if (!stun_msg->GetByteString(STUN_ATTR_USERNAME) ||
-        !stun_msg->GetByteString(STUN_ATTR_MESSAGE_INTEGRITY)) {
-      LOG_J(LS_ERROR, this) << "Received STUN request without username/M-I "
-                            << "from " << addr.ToSensitiveString();
-      SendBindingErrorResponse(stun_msg.get(), addr, STUN_ERROR_BAD_REQUEST,
-                               STUN_ERROR_REASON_BAD_REQUEST);
-      return true;
-    }
-
-    // If the username is bad or unknown, fail with a 401 Unauthorized.
-    std::string local_ufrag;
-    std::string remote_ufrag;
-    if (!ParseStunUsername(stun_msg.get(), &local_ufrag, &remote_ufrag) ||
-        local_ufrag != username_fragment()) {
-      LOG_J(LS_ERROR, this) << "Received STUN request with bad local username "
-                            << local_ufrag << " from "
-                            << addr.ToSensitiveString();
-      SendBindingErrorResponse(stun_msg.get(), addr, STUN_ERROR_UNAUTHORIZED,
-                               STUN_ERROR_REASON_UNAUTHORIZED);
-      return true;
-    }
-
-    // If ICE, and the MESSAGE-INTEGRITY is bad, fail with a 401 Unauthorized
-    if (!stun_msg->ValidateMessageIntegrity(data, size, password_)) {
-      LOG_J(LS_ERROR, this) << "Received STUN request with bad M-I "
-                            << "from " << addr.ToSensitiveString()
-                            << ", password_=" << password_;
-      SendBindingErrorResponse(stun_msg.get(), addr, STUN_ERROR_UNAUTHORIZED,
-                               STUN_ERROR_REASON_UNAUTHORIZED);
-      return true;
-    }
-    out_username->assign(remote_ufrag);
-  } else if ((stun_msg->type() == STUN_BINDING_RESPONSE) ||
-             (stun_msg->type() == STUN_BINDING_ERROR_RESPONSE)) {
-    if (stun_msg->type() == STUN_BINDING_ERROR_RESPONSE) {
-      if (const StunErrorCodeAttribute* error_code = stun_msg->GetErrorCode()) {
-        LOG_J(LS_ERROR, this) << "Received STUN binding error:"
-                              << " class=" << error_code->eclass()
-                              << " number=" << error_code->number()
-                              << " reason='" << error_code->reason() << "'"
-                              << " from " << addr.ToSensitiveString();
-        // Return message to allow error-specific processing
-      } else {
-        LOG_J(LS_ERROR, this) << "Received STUN binding error without a error "
-                              << "code from " << addr.ToSensitiveString();
-        return true;
-      }
-    }
-    // NOTE: Username should not be used in verifying response messages.
-    out_username->clear();
-  } else if (stun_msg->type() == STUN_BINDING_INDICATION) {
-    LOG_J(LS_VERBOSE, this) << "Received STUN binding indication:"
-                            << " from " << addr.ToSensitiveString();
-    out_username->clear();
-    // No stun attributes will be verified, if it's stun indication message.
-    // Returning from end of the this method.
-  } else {
-    LOG_J(LS_ERROR, this) << "Received STUN packet with invalid type ("
-                          << stun_msg->type() << ") from "
-                          << addr.ToSensitiveString();
-    return true;
-  }
-
-  // Return the STUN message found.
-  *out_msg = std::move(stun_msg);
-  return true;
-}
-
-bool Port::IsCompatibleAddress(const rtc::SocketAddress& addr) {
-  // Get a representative IP for the Network this port is configured to use.
-  rtc::IPAddress ip = network_->GetBestIP();
-  // We use single-stack sockets, so families must match.
-  if (addr.family() != ip.family()) {
-    return false;
-  }
-  // Link-local IPv6 ports can only connect to other link-local IPv6 ports.
-  if (ip.family() == AF_INET6 &&
-      (IPIsLinkLocal(ip) != IPIsLinkLocal(addr.ipaddr()))) {
-    return false;
-  }
-  return true;
-}
-
-bool Port::ParseStunUsername(const StunMessage* stun_msg,
-                             std::string* local_ufrag,
-                             std::string* remote_ufrag) const {
-  // The packet must include a username that either begins or ends with our
-  // fragment.  It should begin with our fragment if it is a request and it
-  // should end with our fragment if it is a response.
-  local_ufrag->clear();
-  remote_ufrag->clear();
-  const StunByteStringAttribute* username_attr =
-        stun_msg->GetByteString(STUN_ATTR_USERNAME);
-  if (username_attr == NULL)
-    return false;
-
-  // RFRAG:LFRAG
-  const std::string username = username_attr->GetString();
-  size_t colon_pos = username.find(":");
-  if (colon_pos == std::string::npos) {
-    return false;
-  }
-
-  *local_ufrag = username.substr(0, colon_pos);
-  *remote_ufrag = username.substr(colon_pos + 1, username.size());
-  return true;
-}
-
-bool Port::MaybeIceRoleConflict(
-    const rtc::SocketAddress& addr, IceMessage* stun_msg,
-    const std::string& remote_ufrag) {
-  // Validate ICE_CONTROLLING or ICE_CONTROLLED attributes.
-  bool ret = true;
-  IceRole remote_ice_role = ICEROLE_UNKNOWN;
-  uint64_t remote_tiebreaker = 0;
-  const StunUInt64Attribute* stun_attr =
-      stun_msg->GetUInt64(STUN_ATTR_ICE_CONTROLLING);
-  if (stun_attr) {
-    remote_ice_role = ICEROLE_CONTROLLING;
-    remote_tiebreaker = stun_attr->value();
-  }
-
-  // If |remote_ufrag| is same as port local username fragment and
-  // tie breaker value received in the ping message matches port
-  // tiebreaker value this must be a loopback call.
-  // We will treat this as valid scenario.
-  if (remote_ice_role == ICEROLE_CONTROLLING &&
-      username_fragment() == remote_ufrag &&
-      remote_tiebreaker == IceTiebreaker()) {
-    return true;
-  }
-
-  stun_attr = stun_msg->GetUInt64(STUN_ATTR_ICE_CONTROLLED);
-  if (stun_attr) {
-    remote_ice_role = ICEROLE_CONTROLLED;
-    remote_tiebreaker = stun_attr->value();
-  }
-
-  switch (ice_role_) {
-    case ICEROLE_CONTROLLING:
-      if (ICEROLE_CONTROLLING == remote_ice_role) {
-        if (remote_tiebreaker >= tiebreaker_) {
-          SignalRoleConflict(this);
-        } else {
-          // Send Role Conflict (487) error response.
-          SendBindingErrorResponse(stun_msg, addr,
-              STUN_ERROR_ROLE_CONFLICT, STUN_ERROR_REASON_ROLE_CONFLICT);
-          ret = false;
-        }
-      }
-      break;
-    case ICEROLE_CONTROLLED:
-      if (ICEROLE_CONTROLLED == remote_ice_role) {
-        if (remote_tiebreaker < tiebreaker_) {
-          SignalRoleConflict(this);
-        } else {
-          // Send Role Conflict (487) error response.
-          SendBindingErrorResponse(stun_msg, addr,
-              STUN_ERROR_ROLE_CONFLICT, STUN_ERROR_REASON_ROLE_CONFLICT);
-          ret = false;
-        }
-      }
-      break;
-    default:
-      RTC_NOTREACHED();
-  }
-  return ret;
-}
-
-void Port::CreateStunUsername(const std::string& remote_username,
-                              std::string* stun_username_attr_str) const {
-  stun_username_attr_str->clear();
-  *stun_username_attr_str = remote_username;
-  stun_username_attr_str->append(":");
-  stun_username_attr_str->append(username_fragment());
-}
-
-void Port::SendBindingResponse(StunMessage* request,
-                               const rtc::SocketAddress& addr) {
-  RTC_DCHECK(request->type() == STUN_BINDING_REQUEST);
-
-  // Retrieve the username from the request.
-  const StunByteStringAttribute* username_attr =
-      request->GetByteString(STUN_ATTR_USERNAME);
-  RTC_DCHECK(username_attr != NULL);
-  if (username_attr == NULL) {
-    // No valid username, skip the response.
-    return;
-  }
-
-  // Fill in the response message.
-  StunMessage response;
-  response.SetType(STUN_BINDING_RESPONSE);
-  response.SetTransactionID(request->transaction_id());
-  const StunUInt32Attribute* retransmit_attr =
-      request->GetUInt32(STUN_ATTR_RETRANSMIT_COUNT);
-  if (retransmit_attr) {
-    // Inherit the incoming retransmit value in the response so the other side
-    // can see our view of lost pings.
-    response.AddAttribute(rtc::MakeUnique<StunUInt32Attribute>(
-        STUN_ATTR_RETRANSMIT_COUNT, retransmit_attr->value()));
-
-    if (retransmit_attr->value() > CONNECTION_WRITE_CONNECT_FAILURES) {
-      LOG_J(LS_INFO, this)
-          << "Received a remote ping with high retransmit count: "
-          << retransmit_attr->value();
-    }
-  }
-
-  response.AddAttribute(rtc::MakeUnique<StunXorAddressAttribute>(
-      STUN_ATTR_XOR_MAPPED_ADDRESS, addr));
-  response.AddMessageIntegrity(password_);
-  response.AddFingerprint();
-
-  // Send the response message.
-  rtc::ByteBufferWriter buf;
-  response.Write(&buf);
-  rtc::PacketOptions options(DefaultDscpValue());
-  auto err = SendTo(buf.Data(), buf.Length(), addr, options, false);
-  if (err < 0) {
-    LOG_J(LS_ERROR, this)
-        << "Failed to send STUN ping response"
-        << ", to=" << addr.ToSensitiveString()
-        << ", err=" << err
-        << ", id=" << rtc::hex_encode(response.transaction_id());
-  } else {
-    // Log at LS_INFO if we send a stun ping response on an unwritable
-    // connection.
-    Connection* conn = GetConnection(addr);
-    rtc::LoggingSeverity sev = (conn && !conn->writable()) ?
-        rtc::LS_INFO : rtc::LS_VERBOSE;
-    LOG_JV(sev, this)
-        << "Sent STUN ping response"
-        << ", to=" << addr.ToSensitiveString()
-        << ", id=" << rtc::hex_encode(response.transaction_id());
-
-    conn->stats_.sent_ping_responses++;
-  }
-}
-
-void Port::SendBindingErrorResponse(StunMessage* request,
-                                    const rtc::SocketAddress& addr,
-                                    int error_code, const std::string& reason) {
-  RTC_DCHECK(request->type() == STUN_BINDING_REQUEST);
-
-  // Fill in the response message.
-  StunMessage response;
-  response.SetType(STUN_BINDING_ERROR_RESPONSE);
-  response.SetTransactionID(request->transaction_id());
-
-  // When doing GICE, we need to write out the error code incorrectly to
-  // maintain backwards compatiblility.
-  auto error_attr = StunAttribute::CreateErrorCode();
-  error_attr->SetCode(error_code);
-  error_attr->SetReason(reason);
-  response.AddAttribute(std::move(error_attr));
-
-  // Per Section 10.1.2, certain error cases don't get a MESSAGE-INTEGRITY,
-  // because we don't have enough information to determine the shared secret.
-  if (error_code != STUN_ERROR_BAD_REQUEST &&
-      error_code != STUN_ERROR_UNAUTHORIZED)
-    response.AddMessageIntegrity(password_);
-  response.AddFingerprint();
-
-  // Send the response message.
-  rtc::ByteBufferWriter buf;
-  response.Write(&buf);
-  rtc::PacketOptions options(DefaultDscpValue());
-  SendTo(buf.Data(), buf.Length(), addr, options, false);
-  LOG_J(LS_INFO, this) << "Sending STUN binding error: reason=" << reason
-                       << " to " << addr.ToSensitiveString();
-}
-
-void Port::KeepAliveUntilPruned() {
-  // If it is pruned, we won't bring it up again.
-  if (state_ == State::INIT) {
-    state_ = State::KEEP_ALIVE_UNTIL_PRUNED;
-  }
-}
-
-void Port::Prune() {
-  state_ = State::PRUNED;
-  thread_->Post(RTC_FROM_HERE, this, MSG_DESTROY_IF_DEAD);
-}
-
-void Port::OnMessage(rtc::Message *pmsg) {
-  RTC_DCHECK(pmsg->message_id == MSG_DESTROY_IF_DEAD);
-  bool dead =
-      (state_ == State::INIT || state_ == State::PRUNED) &&
-      connections_.empty() &&
-      rtc::TimeMillis() - last_time_all_connections_removed_ >= timeout_delay_;
-  if (dead) {
-    Destroy();
-  }
-}
-
-void Port::OnNetworkTypeChanged(const rtc::Network* network) {
-  RTC_DCHECK(network == network_);
-
-  UpdateNetworkCost();
-}
-
-std::string Port::ToString() const {
-  std::stringstream ss;
-  ss << "Port[" << std::hex << this << std::dec << ":" << content_name_ << ":"
-     << component_ << ":" << generation_ << ":" << type_ << ":"
-     << network_->ToString() << "]";
-  return ss.str();
-}
-
-// TODO(honghaiz): Make the network cost configurable from user setting.
-void Port::UpdateNetworkCost() {
-  uint16_t new_cost = network_->GetCost();
-  if (network_cost_ == new_cost) {
-    return;
-  }
-  LOG(LS_INFO) << "Network cost changed from " << network_cost_
-               << " to " << new_cost
-               << ". Number of candidates created: " << candidates_.size()
-               << ". Number of connections created: " << connections_.size();
-  network_cost_ = new_cost;
-  for (cricket::Candidate& candidate : candidates_) {
-    candidate.set_network_cost(network_cost_);
-  }
-  // Network cost change will affect the connection selection criteria.
-  // Signal the connection state change on each connection to force a
-  // re-sort in P2PTransportChannel.
-  for (auto kv : connections_) {
-    Connection* conn = kv.second;
-    conn->SignalStateChange(conn);
-  }
-}
-
-void Port::EnablePortPackets() {
-  enable_port_packets_ = true;
-}
-
-void Port::OnConnectionDestroyed(Connection* conn) {
-  AddressMap::iterator iter =
-      connections_.find(conn->remote_candidate().address());
-  RTC_DCHECK(iter != connections_.end());
-  connections_.erase(iter);
-  HandleConnectionDestroyed(conn);
-
-  // Ports time out after all connections fail if it is not marked as
-  // "keep alive until pruned."
-  // Note: If a new connection is added after this message is posted, but it
-  // fails and is removed before kPortTimeoutDelay, then this message will
-  // not cause the Port to be destroyed.
-  if (connections_.empty()) {
-    last_time_all_connections_removed_ = rtc::TimeMillis();
-    thread_->PostDelayed(RTC_FROM_HERE, timeout_delay_, this,
-                         MSG_DESTROY_IF_DEAD);
-  }
-}
-
-void Port::Destroy() {
-  RTC_DCHECK(connections_.empty());
-  LOG_J(LS_INFO, this) << "Port deleted";
-  SignalDestroyed(this);
-  delete this;
-}
-
-const std::string Port::username_fragment() const {
-  return ice_username_fragment_;
-}
-
-// A ConnectionRequest is a simple STUN ping used to determine writability.
-class ConnectionRequest : public StunRequest {
- public:
-  explicit ConnectionRequest(Connection* connection)
-      : StunRequest(new IceMessage()),
-        connection_(connection) {
-  }
-
-  virtual ~ConnectionRequest() {
-  }
-
-  void Prepare(StunMessage* request) override {
-    request->SetType(STUN_BINDING_REQUEST);
-    std::string username;
-    connection_->port()->CreateStunUsername(
-        connection_->remote_candidate().username(), &username);
-    request->AddAttribute(
-        rtc::MakeUnique<StunByteStringAttribute>(STUN_ATTR_USERNAME, username));
-
-    // connection_ already holds this ping, so subtract one from count.
-    if (connection_->port()->send_retransmit_count_attribute()) {
-      request->AddAttribute(rtc::MakeUnique<StunUInt32Attribute>(
-          STUN_ATTR_RETRANSMIT_COUNT,
-          static_cast<uint32_t>(connection_->pings_since_last_response_.size() -
-                                1)));
-    }
-    uint32_t network_info = connection_->port()->Network()->id();
-    network_info = (network_info << 16) | connection_->port()->network_cost();
-    request->AddAttribute(rtc::MakeUnique<StunUInt32Attribute>(
-        STUN_ATTR_NETWORK_INFO, network_info));
-
-    // Adding ICE_CONTROLLED or ICE_CONTROLLING attribute based on the role.
-    if (connection_->port()->GetIceRole() == ICEROLE_CONTROLLING) {
-      request->AddAttribute(rtc::MakeUnique<StunUInt64Attribute>(
-          STUN_ATTR_ICE_CONTROLLING, connection_->port()->IceTiebreaker()));
-      // We should have either USE_CANDIDATE attribute or ICE_NOMINATION
-      // attribute but not both. That was enforced in p2ptransportchannel.
-      if (connection_->use_candidate_attr()) {
-        request->AddAttribute(
-            rtc::MakeUnique<StunByteStringAttribute>(STUN_ATTR_USE_CANDIDATE));
-      }
-      if (connection_->nomination() &&
-          connection_->nomination() != connection_->acked_nomination()) {
-        request->AddAttribute(rtc::MakeUnique<StunUInt32Attribute>(
-            STUN_ATTR_NOMINATION, connection_->nomination()));
-      }
-    } else if (connection_->port()->GetIceRole() == ICEROLE_CONTROLLED) {
-      request->AddAttribute(rtc::MakeUnique<StunUInt64Attribute>(
-          STUN_ATTR_ICE_CONTROLLED, connection_->port()->IceTiebreaker()));
-    } else {
-      RTC_NOTREACHED();
-    }
-
-    // Adding PRIORITY Attribute.
-    // Changing the type preference to Peer Reflexive and local preference
-    // and component id information is unchanged from the original priority.
-    // priority = (2^24)*(type preference) +
-    //           (2^8)*(local preference) +
-    //           (2^0)*(256 - component ID)
-    uint32_t type_preference =
-        (connection_->local_candidate().protocol() == TCP_PROTOCOL_NAME)
-            ? ICE_TYPE_PREFERENCE_PRFLX_TCP
-            : ICE_TYPE_PREFERENCE_PRFLX;
-    uint32_t prflx_priority =
-        type_preference << 24 |
-        (connection_->local_candidate().priority() & 0x00FFFFFF);
-    request->AddAttribute(rtc::MakeUnique<StunUInt32Attribute>(
-        STUN_ATTR_PRIORITY, prflx_priority));
-
-    // Adding Message Integrity attribute.
-    request->AddMessageIntegrity(connection_->remote_candidate().password());
-    // Adding Fingerprint.
-    request->AddFingerprint();
-  }
-
-  void OnResponse(StunMessage* response) override {
-    connection_->OnConnectionRequestResponse(this, response);
-  }
-
-  void OnErrorResponse(StunMessage* response) override {
-    connection_->OnConnectionRequestErrorResponse(this, response);
-  }
-
-  void OnTimeout() override {
-    connection_->OnConnectionRequestTimeout(this);
-  }
-
-  void OnSent() override {
-    connection_->OnConnectionRequestSent(this);
-    // Each request is sent only once.  After a single delay , the request will
-    // time out.
-    timeout_ = true;
-  }
-
-  int resend_delay() override {
-    return CONNECTION_RESPONSE_TIMEOUT;
-  }
-
- private:
-  Connection* connection_;
-};
-
-//
-// Connection
-//
-
-Connection::Connection(Port* port,
-                       size_t index,
-                       const Candidate& remote_candidate)
-    : port_(port),
-      local_candidate_index_(index),
-      remote_candidate_(remote_candidate),
-      recv_rate_tracker_(100, 10u),
-      send_rate_tracker_(100, 10u),
-      write_state_(STATE_WRITE_INIT),
-      receiving_(false),
-      connected_(true),
-      pruned_(false),
-      use_candidate_attr_(false),
-      remote_ice_mode_(ICEMODE_FULL),
-      requests_(port->thread()),
-      rtt_(DEFAULT_RTT),
-      last_ping_sent_(0),
-      last_ping_received_(0),
-      last_data_received_(0),
-      last_ping_response_received_(0),
-      packet_loss_estimator_(kConsiderPacketLostAfter, kForgetPacketAfter),
-      reported_(false),
-      state_(IceCandidatePairState::WAITING),
-      receiving_timeout_(WEAK_CONNECTION_RECEIVE_TIMEOUT),
-      time_created_ms_(rtc::TimeMillis()) {
-  // All of our connections start in WAITING state.
-  // TODO(mallinath) - Start connections from STATE_FROZEN.
-  // Wire up to send stun packets
-  requests_.SignalSendPacket.connect(this, &Connection::OnSendStunPacket);
-  LOG_J(LS_INFO, this) << "Connection created";
-}
-
-Connection::~Connection() {
-}
-
-const Candidate& Connection::local_candidate() const {
-  RTC_DCHECK(local_candidate_index_ < port_->Candidates().size());
-  return port_->Candidates()[local_candidate_index_];
-}
-
-const Candidate& Connection::remote_candidate() const {
-  return remote_candidate_;
-}
-
-uint64_t Connection::priority() const {
-  uint64_t priority = 0;
-  // RFC 5245 - 5.7.2.  Computing Pair Priority and Ordering Pairs
-  // Let G be the priority for the candidate provided by the controlling
-  // agent.  Let D be the priority for the candidate provided by the
-  // controlled agent.
-  // pair priority = 2^32*MIN(G,D) + 2*MAX(G,D) + (G>D?1:0)
-  IceRole role = port_->GetIceRole();
-  if (role != ICEROLE_UNKNOWN) {
-    uint32_t g = 0;
-    uint32_t d = 0;
-    if (role == ICEROLE_CONTROLLING) {
-      g = local_candidate().priority();
-      d = remote_candidate_.priority();
-    } else {
-      g = remote_candidate_.priority();
-      d = local_candidate().priority();
-    }
-    priority = std::min(g, d);
-    priority = priority << 32;
-    priority += 2 * std::max(g, d) + (g > d ? 1 : 0);
-  }
-  return priority;
-}
-
-void Connection::set_write_state(WriteState value) {
-  WriteState old_value = write_state_;
-  write_state_ = value;
-  if (value != old_value) {
-    LOG_J(LS_VERBOSE, this) << "set_write_state from: " << old_value << " to "
-                            << value;
-    SignalStateChange(this);
-  }
-}
-
-void Connection::UpdateReceiving(int64_t now) {
-  bool receiving =
-      last_received() > 0 && now <= last_received() + receiving_timeout_;
-  if (receiving_ == receiving) {
-    return;
-  }
-  LOG_J(LS_VERBOSE, this) << "set_receiving to " << receiving;
-  receiving_ = receiving;
-  receiving_unchanged_since_ = now;
-  SignalStateChange(this);
-}
-
-void Connection::set_state(IceCandidatePairState state) {
-  IceCandidatePairState old_state = state_;
-  state_ = state;
-  if (state != old_state) {
-    LOG_J(LS_VERBOSE, this) << "set_state";
-  }
-}
-
-void Connection::set_connected(bool value) {
-  bool old_value = connected_;
-  connected_ = value;
-  if (value != old_value) {
-    LOG_J(LS_VERBOSE, this) << "set_connected from: " << old_value << " to "
-                            << value;
-    SignalStateChange(this);
-  }
-}
-
-void Connection::set_use_candidate_attr(bool enable) {
-  use_candidate_attr_ = enable;
-}
-
-void Connection::OnSendStunPacket(const void* data, size_t size,
-                                  StunRequest* req) {
-  rtc::PacketOptions options(port_->DefaultDscpValue());
-  auto err = port_->SendTo(
-      data, size, remote_candidate_.address(), options, false);
-  if (err < 0) {
-    LOG_J(LS_WARNING, this) << "Failed to send STUN ping "
-                            << " err=" << err
-                            << " id=" << rtc::hex_encode(req->id());
-  }
-}
-
-void Connection::OnReadPacket(
-  const char* data, size_t size, const rtc::PacketTime& packet_time) {
-  std::unique_ptr<IceMessage> msg;
-  std::string remote_ufrag;
-  const rtc::SocketAddress& addr(remote_candidate_.address());
-  if (!port_->GetStunMessage(data, size, addr, &msg, &remote_ufrag)) {
-    // The packet did not parse as a valid STUN message
-    // This is a data packet, pass it along.
-    last_data_received_ = rtc::TimeMillis();
-    UpdateReceiving(last_data_received_);
-    recv_rate_tracker_.AddSamples(size);
-    SignalReadPacket(this, data, size, packet_time);
-
-    // If timed out sending writability checks, start up again
-    if (!pruned_ && (write_state_ == STATE_WRITE_TIMEOUT)) {
-      LOG(LS_WARNING) << "Received a data packet on a timed-out Connection. "
-                      << "Resetting state to STATE_WRITE_INIT.";
-      set_write_state(STATE_WRITE_INIT);
-    }
-  } else if (!msg) {
-    // The packet was STUN, but failed a check and was handled internally.
-  } else {
-    // The packet is STUN and passed the Port checks.
-    // Perform our own checks to ensure this packet is valid.
-    // If this is a STUN request, then update the receiving bit and respond.
-    // If this is a STUN response, then update the writable bit.
-    // Log at LS_INFO if we receive a ping on an unwritable connection.
-    rtc::LoggingSeverity sev = (!writable() ? rtc::LS_INFO : rtc::LS_VERBOSE);
-    switch (msg->type()) {
-      case STUN_BINDING_REQUEST:
-        LOG_JV(sev, this) << "Received STUN ping"
-                          << ", id=" << rtc::hex_encode(msg->transaction_id());
-
-        if (remote_ufrag == remote_candidate_.username()) {
-          HandleBindingRequest(msg.get());
-        } else {
-          // The packet had the right local username, but the remote username
-          // was not the right one for the remote address.
-          LOG_J(LS_ERROR, this)
-            << "Received STUN request with bad remote username "
-            << remote_ufrag;
-          port_->SendBindingErrorResponse(msg.get(), addr,
-                                          STUN_ERROR_UNAUTHORIZED,
-                                          STUN_ERROR_REASON_UNAUTHORIZED);
-
-        }
-        break;
-
-      // Response from remote peer. Does it match request sent?
-      // This doesn't just check, it makes callbacks if transaction
-      // id's match.
-      case STUN_BINDING_RESPONSE:
-      case STUN_BINDING_ERROR_RESPONSE:
-        if (msg->ValidateMessageIntegrity(
-                data, size, remote_candidate().password())) {
-          requests_.CheckResponse(msg.get());
-        }
-        // Otherwise silently discard the response message.
-        break;
-
-      // Remote end point sent an STUN indication instead of regular binding
-      // request. In this case |last_ping_received_| will be updated but no
-      // response will be sent.
-      case STUN_BINDING_INDICATION:
-        ReceivedPing();
-        break;
-
-      default:
-        RTC_NOTREACHED();
-        break;
-    }
-  }
-}
-
-void Connection::HandleBindingRequest(IceMessage* msg) {
-  // This connection should now be receiving.
-  ReceivedPing();
-
-  const rtc::SocketAddress& remote_addr = remote_candidate_.address();
-  const std::string& remote_ufrag = remote_candidate_.username();
-  // Check for role conflicts.
-  if (!port_->MaybeIceRoleConflict(remote_addr, msg, remote_ufrag)) {
-    // Received conflicting role from the peer.
-    LOG(LS_INFO) << "Received conflicting role from the peer.";
-    return;
-  }
-
-  stats_.recv_ping_requests++;
-
-  // This is a validated stun request from remote peer.
-  port_->SendBindingResponse(msg, remote_addr);
-
-  // If it timed out on writing check, start up again
-  if (!pruned_ && write_state_ == STATE_WRITE_TIMEOUT) {
-    set_write_state(STATE_WRITE_INIT);
-  }
-
-  if (port_->GetIceRole() == ICEROLE_CONTROLLED) {
-    const StunUInt32Attribute* nomination_attr =
-        msg->GetUInt32(STUN_ATTR_NOMINATION);
-    uint32_t nomination = 0;
-    if (nomination_attr) {
-      nomination = nomination_attr->value();
-      if (nomination == 0) {
-        LOG(LS_ERROR) << "Invalid nomination: " << nomination;
-      }
-    } else {
-      const StunByteStringAttribute* use_candidate_attr =
-          msg->GetByteString(STUN_ATTR_USE_CANDIDATE);
-      if (use_candidate_attr) {
-        nomination = 1;
-      }
-    }
-    // We don't un-nominate a connection, so we only keep a larger nomination.
-    if (nomination > remote_nomination_) {
-      set_remote_nomination(nomination);
-      SignalNominated(this);
-    }
-  }
-  // Set the remote cost if the network_info attribute is available.
-  // Note: If packets are re-ordered, we may get incorrect network cost
-  // temporarily, but it should get the correct value shortly after that.
-  const StunUInt32Attribute* network_attr =
-      msg->GetUInt32(STUN_ATTR_NETWORK_INFO);
-  if (network_attr) {
-    uint32_t network_info = network_attr->value();
-    uint16_t network_cost = static_cast<uint16_t>(network_info);
-    if (network_cost != remote_candidate_.network_cost()) {
-      remote_candidate_.set_network_cost(network_cost);
-      // Network cost change will affect the connection ranking, so signal
-      // state change to force a re-sort in P2PTransportChannel.
-      SignalStateChange(this);
-    }
-  }
-}
-
-void Connection::OnReadyToSend() {
-  SignalReadyToSend(this);
-}
-
-void Connection::Prune() {
-  if (!pruned_ || active()) {
-    LOG_J(LS_INFO, this) << "Connection pruned";
-    pruned_ = true;
-    requests_.Clear();
-    set_write_state(STATE_WRITE_TIMEOUT);
-  }
-}
-
-void Connection::Destroy() {
-  // TODO(deadbeef, nisse): This may leak if an application closes a
-  // PeerConnection and then quickly destroys the PeerConnectionFactory (along
-  // with the networking thread on which this message is posted). Also affects
-  // tests, with a workaround in
-  // AutoSocketServerThread::~AutoSocketServerThread.
-  LOG_J(LS_VERBOSE, this) << "Connection destroyed";
-  port_->thread()->Post(RTC_FROM_HERE, this, MSG_DELETE);
-}
-
-void Connection::FailAndDestroy() {
-  set_state(IceCandidatePairState::FAILED);
-  Destroy();
-}
-
-void Connection::FailAndPrune() {
-  set_state(IceCandidatePairState::FAILED);
-  Prune();
-}
-
-void Connection::PrintPingsSinceLastResponse(std::string* s, size_t max) {
-  std::ostringstream oss;
-  oss << std::boolalpha;
-  if (pings_since_last_response_.size() > max) {
-    for (size_t i = 0; i < max; i++) {
-      const SentPing& ping = pings_since_last_response_[i];
-      oss << rtc::hex_encode(ping.id) << " ";
-    }
-    oss << "... " << (pings_since_last_response_.size() - max) << " more";
-  } else {
-    for (const SentPing& ping : pings_since_last_response_) {
-      oss << rtc::hex_encode(ping.id) << " ";
-    }
-  }
-  *s = oss.str();
-}
-
-void Connection::UpdateState(int64_t now) {
-  int rtt = ConservativeRTTEstimate(rtt_);
-
-  if (LOG_CHECK_LEVEL(LS_VERBOSE)) {
-    std::string pings;
-    PrintPingsSinceLastResponse(&pings, 5);
-    LOG_J(LS_VERBOSE, this) << "UpdateState()"
-                            << ", ms since last received response="
-                            << now - last_ping_response_received_
-                            << ", ms since last received data="
-                            << now - last_data_received_
-                            << ", rtt=" << rtt
-                            << ", pings_since_last_response=" << pings;
-  }
-
-  // Check the writable state.  (The order of these checks is important.)
-  //
-  // Before becoming unwritable, we allow for a fixed number of pings to fail
-  // (i.e., receive no response).  We also have to give the response time to
-  // get back, so we include a conservative estimate of this.
-  //
-  // Before timing out writability, we give a fixed amount of time.  This is to
-  // allow for changes in network conditions.
-
-  if ((write_state_ == STATE_WRITABLE) &&
-      TooManyFailures(pings_since_last_response_,
-                      CONNECTION_WRITE_CONNECT_FAILURES,
-                      rtt,
-                      now) &&
-      TooLongWithoutResponse(pings_since_last_response_,
-                             CONNECTION_WRITE_CONNECT_TIMEOUT,
-                             now)) {
-    uint32_t max_pings = CONNECTION_WRITE_CONNECT_FAILURES;
-    LOG_J(LS_INFO, this) << "Unwritable after " << max_pings
-                         << " ping failures and "
-                         << now - pings_since_last_response_[0].sent_time
-                         << " ms without a response,"
-                         << " ms since last received ping="
-                         << now - last_ping_received_
-                         << " ms since last received data="
-                         << now - last_data_received_
-                         << " rtt=" << rtt;
-    set_write_state(STATE_WRITE_UNRELIABLE);
-  }
-  if ((write_state_ == STATE_WRITE_UNRELIABLE ||
-       write_state_ == STATE_WRITE_INIT) &&
-      TooLongWithoutResponse(pings_since_last_response_,
-                             CONNECTION_WRITE_TIMEOUT,
-                             now)) {
-    LOG_J(LS_INFO, this) << "Timed out after "
-                         << now - pings_since_last_response_[0].sent_time
-                         << " ms without a response"
-                         << ", rtt=" << rtt;
-    set_write_state(STATE_WRITE_TIMEOUT);
-  }
-
-  // Update the receiving state.
-  UpdateReceiving(now);
-  if (dead(now)) {
-    Destroy();
-  }
-}
-
-void Connection::Ping(int64_t now) {
-  last_ping_sent_ = now;
-  ConnectionRequest *req = new ConnectionRequest(this);
-  // If not using renomination, we use "1" to mean "nominated" and "0" to mean
-  // "not nominated". If using renomination, values greater than 1 are used for
-  // re-nominated pairs.
-  int nomination = use_candidate_attr_ ? 1 : 0;
-  if (nomination_ > 0) {
-    nomination = nomination_;
-  }
-  pings_since_last_response_.push_back(SentPing(req->id(), now, nomination));
-  packet_loss_estimator_.ExpectResponse(req->id(), now);
-  LOG_J(LS_VERBOSE, this) << "Sending STUN ping "
-                          << ", id=" << rtc::hex_encode(req->id())
-                          << ", nomination=" << nomination_;
-  requests_.Send(req);
-  state_ = IceCandidatePairState::IN_PROGRESS;
-  num_pings_sent_++;
-}
-
-void Connection::ReceivedPing() {
-  last_ping_received_ = rtc::TimeMillis();
-  UpdateReceiving(last_ping_received_);
-}
-
-void Connection::ReceivedPingResponse(int rtt, const std::string& request_id) {
-  RTC_DCHECK_GE(rtt, 0);
-  // We've already validated that this is a STUN binding response with
-  // the correct local and remote username for this connection.
-  // So if we're not already, become writable. We may be bringing a pruned
-  // connection back to life, but if we don't really want it, we can always
-  // prune it again.
-  auto iter = std::find_if(
-      pings_since_last_response_.begin(), pings_since_last_response_.end(),
-      [request_id](const SentPing& ping) { return ping.id == request_id; });
-  if (iter != pings_since_last_response_.end() &&
-      iter->nomination > acked_nomination_) {
-    acked_nomination_ = iter->nomination;
-  }
-
-  total_round_trip_time_ms_ += rtt;
-  current_round_trip_time_ms_ = rtc::Optional<uint32_t>(
-      static_cast<uint32_t>(rtt));
-
-  pings_since_last_response_.clear();
-  last_ping_response_received_ = rtc::TimeMillis();
-  UpdateReceiving(last_ping_response_received_);
-  set_write_state(STATE_WRITABLE);
-  set_state(IceCandidatePairState::SUCCEEDED);
-  if (rtt_samples_ > 0) {
-    rtt_ = (RTT_RATIO * rtt_ + rtt) / (RTT_RATIO + 1);
-  } else {
-    rtt_ = rtt;
-  }
-  rtt_samples_++;
-}
-
-bool Connection::dead(int64_t now) const {
-  if (last_received() > 0) {
-    // If it has ever received anything, we keep it alive until it hasn't
-    // received anything for DEAD_CONNECTION_RECEIVE_TIMEOUT. This covers the
-    // normal case of a successfully used connection that stops working. This
-    // also allows a remote peer to continue pinging over a locally inactive
-    // (pruned) connection.
-    return (now > (last_received() + DEAD_CONNECTION_RECEIVE_TIMEOUT));
-  }
-
-  if (active()) {
-    // If it has never received anything, keep it alive as long as it is
-    // actively pinging and not pruned. Otherwise, the connection might be
-    // deleted before it has a chance to ping. This is the normal case for a
-    // new connection that is pinging but hasn't received anything yet.
-    return false;
-  }
-
-  // If it has never received anything and is not actively pinging (pruned), we
-  // keep it around for at least MIN_CONNECTION_LIFETIME to prevent connections
-  // from being pruned too quickly during a network change event when two
-  // networks would be up simultaneously but only for a brief period.
-  return now > (time_created_ms_ + MIN_CONNECTION_LIFETIME);
-}
-
-bool Connection::stable(int64_t now) const {
-  // A connection is stable if it's RTT has converged and it isn't missing any
-  // responses.  We should send pings at a higher rate until the RTT converges
-  // and whenever a ping response is missing (so that we can detect
-  // unwritability faster)
-  return rtt_converged() && !missing_responses(now);
-}
-
-std::string Connection::ToDebugId() const {
-  std::stringstream ss;
-  ss << std::hex << this;
-  return ss.str();
-}
-
-uint32_t Connection::ComputeNetworkCost() const {
-  // TODO(honghaiz): Will add rtt as part of the network cost.
-  return port()->network_cost() + remote_candidate_.network_cost();
-}
-
-std::string Connection::ToString() const {
-  const char CONNECT_STATE_ABBREV[2] = {
-    '-',  // not connected (false)
-    'C',  // connected (true)
-  };
-  const char RECEIVE_STATE_ABBREV[2] = {
-    '-',  // not receiving (false)
-    'R',  // receiving (true)
-  };
-  const char WRITE_STATE_ABBREV[4] = {
-    'W',  // STATE_WRITABLE
-    'w',  // STATE_WRITE_UNRELIABLE
-    '-',  // STATE_WRITE_INIT
-    'x',  // STATE_WRITE_TIMEOUT
-  };
-  const std::string ICESTATE[4] = {
-    "W",  // STATE_WAITING
-    "I",  // STATE_INPROGRESS
-    "S",  // STATE_SUCCEEDED
-    "F"   // STATE_FAILED
-  };
-  const Candidate& local = local_candidate();
-  const Candidate& remote = remote_candidate();
-  std::stringstream ss;
-  ss << "Conn[" << ToDebugId() << ":" << port_->content_name() << ":"
-     << local.id() << ":" << local.component() << ":" << local.generation()
-     << ":" << local.type() << ":" << local.protocol() << ":"
-     << local.address().ToSensitiveString() << "->" << remote.id() << ":"
-     << remote.component() << ":" << remote.priority() << ":" << remote.type()
-     << ":" << remote.protocol() << ":" << remote.address().ToSensitiveString()
-     << "|" << CONNECT_STATE_ABBREV[connected()]
-     << RECEIVE_STATE_ABBREV[receiving()] << WRITE_STATE_ABBREV[write_state()]
-     << ICESTATE[static_cast<int>(state())] << "|" << remote_nomination() << "|"
-     << nomination() << "|" << priority() << "|";
-  if (rtt_ < DEFAULT_RTT) {
-    ss << rtt_ << "]";
-  } else {
-    ss << "-]";
-  }
-  return ss.str();
-}
-
-std::string Connection::ToSensitiveString() const {
-  return ToString();
-}
-
-void Connection::OnConnectionRequestResponse(ConnectionRequest* request,
-                                             StunMessage* response) {
-  // Log at LS_INFO if we receive a ping response on an unwritable
-  // connection.
-  rtc::LoggingSeverity sev = !writable() ? rtc::LS_INFO : rtc::LS_VERBOSE;
-
-  int rtt = request->Elapsed();
-
-  if (LOG_CHECK_LEVEL_V(sev)) {
-    std::string pings;
-    PrintPingsSinceLastResponse(&pings, 5);
-    LOG_JV(sev, this) << "Received STUN ping response"
-                      << ", id=" << rtc::hex_encode(request->id())
-                      << ", code=0"  // Makes logging easier to parse.
-                      << ", rtt=" << rtt
-                      << ", pings_since_last_response=" << pings;
-  }
-  ReceivedPingResponse(rtt, request->id());
-
-  int64_t time_received = rtc::TimeMillis();
-  packet_loss_estimator_.ReceivedResponse(request->id(), time_received);
-
-  stats_.recv_ping_responses++;
-
-  MaybeUpdateLocalCandidate(request, response);
-}
-
-void Connection::OnConnectionRequestErrorResponse(ConnectionRequest* request,
-                                                  StunMessage* response) {
-  int error_code = response->GetErrorCodeValue();
-  LOG_J(LS_INFO, this) << "Received STUN error response"
-                       << " id=" << rtc::hex_encode(request->id())
-                       << " code=" << error_code
-                       << " rtt=" << request->Elapsed();
-
-  if (error_code == STUN_ERROR_UNKNOWN_ATTRIBUTE ||
-      error_code == STUN_ERROR_SERVER_ERROR ||
-      error_code == STUN_ERROR_UNAUTHORIZED) {
-    // Recoverable error, retry
-  } else if (error_code == STUN_ERROR_STALE_CREDENTIALS) {
-    // Race failure, retry
-  } else if (error_code == STUN_ERROR_ROLE_CONFLICT) {
-    HandleRoleConflictFromPeer();
-  } else {
-    // This is not a valid connection.
-    LOG_J(LS_ERROR, this) << "Received STUN error response, code="
-                          << error_code << "; killing connection";
-    FailAndDestroy();
-  }
-}
-
-void Connection::OnConnectionRequestTimeout(ConnectionRequest* request) {
-  // Log at LS_INFO if we miss a ping on a writable connection.
-  rtc::LoggingSeverity sev = writable() ? rtc::LS_INFO : rtc::LS_VERBOSE;
-  LOG_JV(sev, this) << "Timing-out STUN ping "
-                    << rtc::hex_encode(request->id())
-                    << " after " << request->Elapsed() << " ms";
-}
-
-void Connection::OnConnectionRequestSent(ConnectionRequest* request) {
-  // Log at LS_INFO if we send a ping on an unwritable connection.
-  rtc::LoggingSeverity sev = !writable() ? rtc::LS_INFO : rtc::LS_VERBOSE;
-  LOG_JV(sev, this) << "Sent STUN ping"
-                    << ", id=" << rtc::hex_encode(request->id())
-                    << ", use_candidate=" << use_candidate_attr()
-                    << ", nomination=" << nomination();
-  stats_.sent_ping_requests_total++;
-  if (stats_.recv_ping_responses == 0) {
-    stats_.sent_ping_requests_before_first_response++;
-  }
-}
-
-void Connection::HandleRoleConflictFromPeer() {
-  port_->SignalRoleConflict(port_);
-}
-
-void Connection::MaybeSetRemoteIceParametersAndGeneration(
-    const IceParameters& ice_params,
-    int generation) {
-  if (remote_candidate_.username() == ice_params.ufrag &&
-      remote_candidate_.password().empty()) {
-    remote_candidate_.set_password(ice_params.pwd);
-  }
-  // TODO(deadbeef): A value of '0' for the generation is used for both
-  // generation 0 and "generation unknown". It should be changed to an
-  // rtc::Optional to fix this.
-  if (remote_candidate_.username() == ice_params.ufrag &&
-      remote_candidate_.password() == ice_params.pwd &&
-      remote_candidate_.generation() == 0) {
-    remote_candidate_.set_generation(generation);
-  }
-}
-
-void Connection::MaybeUpdatePeerReflexiveCandidate(
-    const Candidate& new_candidate) {
-  if (remote_candidate_.type() == PRFLX_PORT_TYPE &&
-      new_candidate.type() != PRFLX_PORT_TYPE &&
-      remote_candidate_.protocol() == new_candidate.protocol() &&
-      remote_candidate_.address() == new_candidate.address() &&
-      remote_candidate_.username() == new_candidate.username() &&
-      remote_candidate_.password() == new_candidate.password() &&
-      remote_candidate_.generation() == new_candidate.generation()) {
-    remote_candidate_ = new_candidate;
-  }
-}
-
-void Connection::OnMessage(rtc::Message *pmsg) {
-  RTC_DCHECK(pmsg->message_id == MSG_DELETE);
-  LOG(LS_INFO) << "Connection deleted with number of pings sent: "
-               << num_pings_sent_;
-  SignalDestroyed(this);
-  delete this;
-}
-
-int64_t Connection::last_received() const {
-  return std::max(last_data_received_,
-             std::max(last_ping_received_, last_ping_response_received_));
-}
-
-ConnectionInfo Connection::stats() {
-  stats_.recv_bytes_second = round(recv_rate_tracker_.ComputeRate());
-  stats_.recv_total_bytes = recv_rate_tracker_.TotalSampleCount();
-  stats_.sent_bytes_second = round(send_rate_tracker_.ComputeRate());
-  stats_.sent_total_bytes = send_rate_tracker_.TotalSampleCount();
-  stats_.receiving = receiving_;
-  stats_.writable = write_state_ == STATE_WRITABLE;
-  stats_.timeout = write_state_ == STATE_WRITE_TIMEOUT;
-  stats_.new_connection = !reported_;
-  stats_.rtt = rtt_;
-  stats_.local_candidate = local_candidate();
-  stats_.remote_candidate = remote_candidate();
-  stats_.key = this;
-  stats_.state = state_;
-  stats_.priority = priority();
-  stats_.nominated = nominated();
-  stats_.total_round_trip_time_ms = total_round_trip_time_ms_;
-  stats_.current_round_trip_time_ms = current_round_trip_time_ms_;
-  return stats_;
-}
-
-void Connection::MaybeUpdateLocalCandidate(ConnectionRequest* request,
-                                           StunMessage* response) {
-  // RFC 5245
-  // The agent checks the mapped address from the STUN response.  If the
-  // transport address does not match any of the local candidates that the
-  // agent knows about, the mapped address represents a new candidate -- a
-  // peer reflexive candidate.
-  const StunAddressAttribute* addr =
-      response->GetAddress(STUN_ATTR_XOR_MAPPED_ADDRESS);
-  if (!addr) {
-    LOG(LS_WARNING) << "Connection::OnConnectionRequestResponse - "
-                    << "No MAPPED-ADDRESS or XOR-MAPPED-ADDRESS found in the "
-                    << "stun response message";
-    return;
-  }
-
-  for (size_t i = 0; i < port_->Candidates().size(); ++i) {
-    if (port_->Candidates()[i].address() == addr->GetAddress()) {
-      if (local_candidate_index_ != i) {
-        LOG_J(LS_INFO, this) << "Updating local candidate type to srflx.";
-        local_candidate_index_ = i;
-        // SignalStateChange to force a re-sort in P2PTransportChannel as this
-        // Connection's local candidate has changed.
-        SignalStateChange(this);
-      }
-      return;
-    }
-  }
-
-  // RFC 5245
-  // Its priority is set equal to the value of the PRIORITY attribute
-  // in the Binding request.
-  const StunUInt32Attribute* priority_attr =
-      request->msg()->GetUInt32(STUN_ATTR_PRIORITY);
-  if (!priority_attr) {
-    LOG(LS_WARNING) << "Connection::OnConnectionRequestResponse - "
-                    << "No STUN_ATTR_PRIORITY found in the "
-                    << "stun response message";
-    return;
-  }
-  const uint32_t priority = priority_attr->value();
-  std::string id = rtc::CreateRandomString(8);
-
-  Candidate new_local_candidate;
-  new_local_candidate.set_id(id);
-  new_local_candidate.set_component(local_candidate().component());
-  new_local_candidate.set_type(PRFLX_PORT_TYPE);
-  new_local_candidate.set_protocol(local_candidate().protocol());
-  new_local_candidate.set_address(addr->GetAddress());
-  new_local_candidate.set_priority(priority);
-  new_local_candidate.set_username(local_candidate().username());
-  new_local_candidate.set_password(local_candidate().password());
-  new_local_candidate.set_network_name(local_candidate().network_name());
-  new_local_candidate.set_network_type(local_candidate().network_type());
-  new_local_candidate.set_related_address(local_candidate().address());
-  new_local_candidate.set_generation(local_candidate().generation());
-  new_local_candidate.set_foundation(ComputeFoundation(
-      PRFLX_PORT_TYPE, local_candidate().protocol(),
-      local_candidate().relay_protocol(), local_candidate().address()));
-  new_local_candidate.set_network_id(local_candidate().network_id());
-  new_local_candidate.set_network_cost(local_candidate().network_cost());
-
-  // Change the local candidate of this Connection to the new prflx candidate.
-  LOG_J(LS_INFO, this) << "Updating local candidate type to prflx.";
-  local_candidate_index_ = port_->AddPrflxCandidate(new_local_candidate);
-
-  // SignalStateChange to force a re-sort in P2PTransportChannel as this
-  // Connection's local candidate has changed.
-  SignalStateChange(this);
-}
-
-bool Connection::rtt_converged() const {
-  return rtt_samples_ > (RTT_RATIO + 1);
-}
-
-bool Connection::missing_responses(int64_t now) const {
-  if (pings_since_last_response_.empty()) {
-    return false;
-  }
-
-  int64_t waiting = now - pings_since_last_response_[0].sent_time;
-  return waiting > 2 * rtt();
-}
-
-ProxyConnection::ProxyConnection(Port* port,
-                                 size_t index,
-                                 const Candidate& remote_candidate)
-    : Connection(port, index, remote_candidate) {}
-
-int ProxyConnection::Send(const void* data, size_t size,
-                          const rtc::PacketOptions& options) {
-  stats_.sent_total_packets++;
-  int sent = port_->SendTo(data, size, remote_candidate_.address(),
-                           options, true);
-  if (sent <= 0) {
-    RTC_DCHECK(sent < 0);
-    error_ = port_->GetError();
-    stats_.sent_discarded_packets++;
-  } else {
-    send_rate_tracker_.AddSamples(sent);
-  }
-  return sent;
-}
-
-}  // namespace cricket
diff --git a/p2p/base/port.h b/p2p/base/port.h
deleted file mode 100644
index 76a3dea..0000000
--- a/p2p/base/port.h
+++ /dev/null
@@ -1,757 +0,0 @@
-/*
- *  Copyright 2004 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_P2P_BASE_PORT_H_
-#define WEBRTC_P2P_BASE_PORT_H_
-
-#include <map>
-#include <memory>
-#include <set>
-#include <string>
-#include <vector>
-
-#include "webrtc/api/optional.h"
-#include "webrtc/p2p/base/candidate.h"
-#include "webrtc/p2p/base/candidatepairinterface.h"
-#include "webrtc/p2p/base/jseptransport.h"
-#include "webrtc/p2p/base/packetlossestimator.h"
-#include "webrtc/p2p/base/packetsocketfactory.h"
-#include "webrtc/p2p/base/portinterface.h"
-#include "webrtc/p2p/base/stun.h"
-#include "webrtc/p2p/base/stunrequest.h"
-#include "webrtc/rtc_base/asyncpacketsocket.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/network.h"
-#include "webrtc/rtc_base/proxyinfo.h"
-#include "webrtc/rtc_base/ratetracker.h"
-#include "webrtc/rtc_base/sigslot.h"
-#include "webrtc/rtc_base/socketaddress.h"
-#include "webrtc/rtc_base/thread.h"
-
-namespace cricket {
-
-class Connection;
-class ConnectionRequest;
-
-extern const char LOCAL_PORT_TYPE[];
-extern const char STUN_PORT_TYPE[];
-extern const char PRFLX_PORT_TYPE[];
-extern const char RELAY_PORT_TYPE[];
-
-extern const char UDP_PROTOCOL_NAME[];
-extern const char TCP_PROTOCOL_NAME[];
-extern const char SSLTCP_PROTOCOL_NAME[];
-extern const char TLS_PROTOCOL_NAME[];
-
-// RFC 6544, TCP candidate encoding rules.
-extern const int DISCARD_PORT;
-extern const char TCPTYPE_ACTIVE_STR[];
-extern const char TCPTYPE_PASSIVE_STR[];
-extern const char TCPTYPE_SIMOPEN_STR[];
-
-// The minimum time we will wait before destroying a connection after creating
-// it.
-static const int MIN_CONNECTION_LIFETIME = 10 * 1000;  // 10 seconds.
-
-// A connection will be declared dead if it has not received anything for this
-// long.
-static const int DEAD_CONNECTION_RECEIVE_TIMEOUT = 30 * 1000;  // 30 seconds.
-
-// The timeout duration when a connection does not receive anything.
-static const int WEAK_CONNECTION_RECEIVE_TIMEOUT = 2500;  // 2.5 seconds
-
-// The length of time we wait before timing out writability on a connection.
-static const int CONNECTION_WRITE_TIMEOUT = 15 * 1000;  // 15 seconds
-
-// The length of time we wait before we become unwritable.
-static const int CONNECTION_WRITE_CONNECT_TIMEOUT = 5 * 1000;  // 5 seconds
-
-// This is the length of time that we wait for a ping response to come back.
-// There is no harm to keep this value high other than a small amount
-// of increased memory.  But in some networks (2G),
-// we observe up to 60s RTTs.
-static const int CONNECTION_RESPONSE_TIMEOUT = 60 * 1000;  // 60 seconds
-
-// The number of pings that must fail to respond before we become unwritable.
-static const uint32_t CONNECTION_WRITE_CONNECT_FAILURES = 5;
-
-enum RelayType {
-  RELAY_GTURN,   // Legacy google relay service.
-  RELAY_TURN     // Standard (TURN) relay service.
-};
-
-enum IcePriorityValue {
-  ICE_TYPE_PREFERENCE_RELAY_TLS = 0,
-  ICE_TYPE_PREFERENCE_RELAY_TCP = 1,
-  ICE_TYPE_PREFERENCE_RELAY_UDP = 2,
-  ICE_TYPE_PREFERENCE_PRFLX_TCP = 80,
-  ICE_TYPE_PREFERENCE_HOST_TCP = 90,
-  ICE_TYPE_PREFERENCE_SRFLX = 100,
-  ICE_TYPE_PREFERENCE_PRFLX = 110,
-  ICE_TYPE_PREFERENCE_HOST = 126
-};
-
-// States are from RFC 5245. http://tools.ietf.org/html/rfc5245#section-5.7.4
-enum class IceCandidatePairState {
-  WAITING = 0,  // Check has not been performed, Waiting pair on CL.
-  IN_PROGRESS,  // Check has been sent, transaction is in progress.
-  SUCCEEDED,    // Check already done, produced a successful result.
-  FAILED,       // Check for this connection failed.
-  // According to spec there should also be a frozen state, but nothing is ever
-  // frozen because we have not implemented ICE freezing logic.
-};
-
-const char* ProtoToString(ProtocolType proto);
-bool StringToProto(const char* value, ProtocolType* proto);
-
-struct ProtocolAddress {
-  rtc::SocketAddress address;
-  ProtocolType proto;
-
-  ProtocolAddress(const rtc::SocketAddress& a, ProtocolType p)
-      : address(a), proto(p) {}
-
-  bool operator==(const ProtocolAddress& o) const {
-    return address == o.address && proto == o.proto;
-  }
-  bool operator!=(const ProtocolAddress& o) const { return !(*this == o); }
-};
-
-typedef std::set<rtc::SocketAddress> ServerAddresses;
-
-// Represents a local communication mechanism that can be used to create
-// connections to similar mechanisms of the other client.  Subclasses of this
-// one add support for specific mechanisms like local UDP ports.
-class Port : public PortInterface, public rtc::MessageHandler,
-             public sigslot::has_slots<> {
- public:
-  // INIT: The state when a port is just created.
-  // KEEP_ALIVE_UNTIL_PRUNED: A port should not be destroyed even if no
-  // connection is using it.
-  // PRUNED: It will be destroyed if no connection is using it for a period of
-  // 30 seconds.
-  enum class State { INIT, KEEP_ALIVE_UNTIL_PRUNED, PRUNED };
-  Port(rtc::Thread* thread,
-       const std::string& type,
-       rtc::PacketSocketFactory* factory,
-       rtc::Network* network,
-       const std::string& username_fragment,
-       const std::string& password);
-  // TODO(deadbeef): Delete this constructor once clients are moved off of it.
-  Port(rtc::Thread* thread,
-       const std::string& type,
-       rtc::PacketSocketFactory* factory,
-       rtc::Network* network,
-       const rtc::IPAddress& ip,
-       const std::string& username_fragment,
-       const std::string& password)
-      : Port(thread, type, factory, network, username_fragment, password) {}
-  Port(rtc::Thread* thread,
-       const std::string& type,
-       rtc::PacketSocketFactory* factory,
-       rtc::Network* network,
-       uint16_t min_port,
-       uint16_t max_port,
-       const std::string& username_fragment,
-       const std::string& password);
-  virtual ~Port();
-
-  virtual const std::string& Type() const { return type_; }
-  virtual rtc::Network* Network() const { return network_; }
-
-  // Methods to set/get ICE role and tiebreaker values.
-  IceRole GetIceRole() const { return ice_role_; }
-  void SetIceRole(IceRole role) { ice_role_ = role; }
-
-  void SetIceTiebreaker(uint64_t tiebreaker) { tiebreaker_ = tiebreaker; }
-  uint64_t IceTiebreaker() const { return tiebreaker_; }
-
-  virtual bool SharedSocket() const { return shared_socket_; }
-  void ResetSharedSocket() { shared_socket_ = false; }
-
-  // Should not destroy the port even if no connection is using it. Called when
-  // a port is ready to use.
-  void KeepAliveUntilPruned();
-  // Allows a port to be destroyed if no connection is using it.
-  void Prune();
-
-  // The thread on which this port performs its I/O.
-  rtc::Thread* thread() { return thread_; }
-
-  // The factory used to create the sockets of this port.
-  rtc::PacketSocketFactory* socket_factory() const { return factory_; }
-  void set_socket_factory(rtc::PacketSocketFactory* factory) {
-    factory_ = factory;
-  }
-
-  // For debugging purposes.
-  const std::string& content_name() const { return content_name_; }
-  void set_content_name(const std::string& content_name) {
-    content_name_ = content_name;
-  }
-
-  int component() const { return component_; }
-  void set_component(int component) { component_ = component; }
-
-  bool send_retransmit_count_attribute() const {
-    return send_retransmit_count_attribute_;
-  }
-  void set_send_retransmit_count_attribute(bool enable) {
-    send_retransmit_count_attribute_ = enable;
-  }
-
-  // Identifies the generation that this port was created in.
-  uint32_t generation() const { return generation_; }
-  void set_generation(uint32_t generation) { generation_ = generation; }
-
-  const std::string username_fragment() const;
-  const std::string& password() const { return password_; }
-
-  // May be called when this port was initially created by a pooled
-  // PortAllocatorSession, and is now being assigned to an ICE transport.
-  // Updates the information for candidates as well.
-  void SetIceParameters(int component,
-                        const std::string& username_fragment,
-                        const std::string& password);
-
-  // Fired when candidates are discovered by the port. When all candidates
-  // are discovered that belong to port SignalAddressReady is fired.
-  sigslot::signal2<Port*, const Candidate&> SignalCandidateReady;
-
-  // Provides all of the above information in one handy object.
-  virtual const std::vector<Candidate>& Candidates() const {
-    return candidates_;
-  }
-
-  // SignalPortComplete is sent when port completes the task of candidates
-  // allocation.
-  sigslot::signal1<Port*> SignalPortComplete;
-  // This signal sent when port fails to allocate candidates and this port
-  // can't be used in establishing the connections. When port is in shared mode
-  // and port fails to allocate one of the candidates, port shouldn't send
-  // this signal as other candidates might be usefull in establishing the
-  // connection.
-  sigslot::signal1<Port*> SignalPortError;
-
-  // Returns a map containing all of the connections of this port, keyed by the
-  // remote address.
-  typedef std::map<rtc::SocketAddress, Connection*> AddressMap;
-  const AddressMap& connections() { return connections_; }
-
-  // Returns the connection to the given address or NULL if none exists.
-  virtual Connection* GetConnection(
-      const rtc::SocketAddress& remote_addr);
-
-  // Called each time a connection is created.
-  sigslot::signal2<Port*, Connection*> SignalConnectionCreated;
-
-  // In a shared socket mode each port which shares the socket will decide
-  // to accept the packet based on the |remote_addr|. Currently only UDP
-  // port implemented this method.
-  // TODO(mallinath) - Make it pure virtual.
-  virtual bool HandleIncomingPacket(
-      rtc::AsyncPacketSocket* socket, const char* data, size_t size,
-      const rtc::SocketAddress& remote_addr,
-      const rtc::PacketTime& packet_time) {
-    RTC_NOTREACHED();
-    return false;
-  }
-
-  // Sends a response message (normal or error) to the given request.  One of
-  // these methods should be called as a response to SignalUnknownAddress.
-  // NOTE: You MUST call CreateConnection BEFORE SendBindingResponse.
-  virtual void SendBindingResponse(StunMessage* request,
-                                   const rtc::SocketAddress& addr);
-  virtual void SendBindingErrorResponse(
-      StunMessage* request, const rtc::SocketAddress& addr,
-      int error_code, const std::string& reason);
-
-  void set_proxy(const std::string& user_agent,
-                 const rtc::ProxyInfo& proxy) {
-    user_agent_ = user_agent;
-    proxy_ = proxy;
-  }
-  const std::string& user_agent() { return user_agent_; }
-  const rtc::ProxyInfo& proxy() { return proxy_; }
-
-  virtual void EnablePortPackets();
-
-  // Called if the port has no connections and is no longer useful.
-  void Destroy();
-
-  virtual void OnMessage(rtc::Message *pmsg);
-
-  // Debugging description of this port
-  virtual std::string ToString() const;
-  uint16_t min_port() { return min_port_; }
-  uint16_t max_port() { return max_port_; }
-
-  // Timeout shortening function to speed up unit tests.
-  void set_timeout_delay(int delay) { timeout_delay_ = delay; }
-
-  // This method will return local and remote username fragements from the
-  // stun username attribute if present.
-  bool ParseStunUsername(const StunMessage* stun_msg,
-                         std::string* local_username,
-                         std::string* remote_username) const;
-  void CreateStunUsername(const std::string& remote_username,
-                          std::string* stun_username_attr_str) const;
-
-  bool MaybeIceRoleConflict(const rtc::SocketAddress& addr,
-                            IceMessage* stun_msg,
-                            const std::string& remote_ufrag);
-
-  // Called when a packet has been sent to the socket.
-  // This is made pure virtual to notify subclasses of Port that they MUST
-  // listen to AsyncPacketSocket::SignalSentPacket and then call
-  // PortInterface::OnSentPacket.
-  virtual void OnSentPacket(rtc::AsyncPacketSocket* socket,
-                            const rtc::SentPacket& sent_packet) = 0;
-
-  // Called when the socket is currently able to send.
-  void OnReadyToSend();
-
-  // Called when the Connection discovers a local peer reflexive candidate.
-  // Returns the index of the new local candidate.
-  size_t AddPrflxCandidate(const Candidate& local);
-
-  int16_t network_cost() const { return network_cost_; }
-
- protected:
-  enum { MSG_DESTROY_IF_DEAD = 0, MSG_FIRST_AVAILABLE };
-
-  virtual void UpdateNetworkCost();
-
-  void set_type(const std::string& type) { type_ = type; }
-
-  // Deprecated. Use the AddAddress() method below with "url" instead.
-  // TODO(zhihuang): Remove this after downstream applications stop using it.
-  void AddAddress(const rtc::SocketAddress& address,
-                  const rtc::SocketAddress& base_address,
-                  const rtc::SocketAddress& related_address,
-                  const std::string& protocol,
-                  const std::string& relay_protocol,
-                  const std::string& tcptype,
-                  const std::string& type,
-                  uint32_t type_preference,
-                  uint32_t relay_preference,
-                  bool final);
-
-  void AddAddress(const rtc::SocketAddress& address,
-                  const rtc::SocketAddress& base_address,
-                  const rtc::SocketAddress& related_address,
-                  const std::string& protocol,
-                  const std::string& relay_protocol,
-                  const std::string& tcptype,
-                  const std::string& type,
-                  uint32_t type_preference,
-                  uint32_t relay_preference,
-                  const std::string& url,
-                  bool final);
-
-  // Adds the given connection to the map keyed by the remote candidate address.
-  // If an existing connection has the same address, the existing one will be
-  // replaced and destroyed.
-  void AddOrReplaceConnection(Connection* conn);
-
-  // Called when a packet is received from an unknown address that is not
-  // currently a connection.  If this is an authenticated STUN binding request,
-  // then we will signal the client.
-  void OnReadPacket(const char* data, size_t size,
-                    const rtc::SocketAddress& addr,
-                    ProtocolType proto);
-
-  // If the given data comprises a complete and correct STUN message then the
-  // return value is true, otherwise false. If the message username corresponds
-  // with this port's username fragment, msg will contain the parsed STUN
-  // message.  Otherwise, the function may send a STUN response internally.
-  // remote_username contains the remote fragment of the STUN username.
-  bool GetStunMessage(const char* data,
-                      size_t size,
-                      const rtc::SocketAddress& addr,
-                      std::unique_ptr<IceMessage>* out_msg,
-                      std::string* out_username);
-
-  // Checks if the address in addr is compatible with the port's ip.
-  bool IsCompatibleAddress(const rtc::SocketAddress& addr);
-
-  // Returns default DSCP value.
-  rtc::DiffServCodePoint DefaultDscpValue() const {
-    // No change from what MediaChannel set.
-    return rtc::DSCP_NO_CHANGE;
-  }
-
-  // Extra work to be done in subclasses when a connection is destroyed.
-  virtual void HandleConnectionDestroyed(Connection* conn) {}
-
- private:
-  void Construct();
-  // Called when one of our connections deletes itself.
-  void OnConnectionDestroyed(Connection* conn);
-
-  void OnNetworkTypeChanged(const rtc::Network* network);
-
-  rtc::Thread* thread_;
-  rtc::PacketSocketFactory* factory_;
-  std::string type_;
-  bool send_retransmit_count_attribute_;
-  rtc::Network* network_;
-  uint16_t min_port_;
-  uint16_t max_port_;
-  std::string content_name_;
-  int component_;
-  uint32_t generation_;
-  // In order to establish a connection to this Port (so that real data can be
-  // sent through), the other side must send us a STUN binding request that is
-  // authenticated with this username_fragment and password.
-  // PortAllocatorSession will provide these username_fragment and password.
-  //
-  // Note: we should always use username_fragment() instead of using
-  // |ice_username_fragment_| directly. For the details see the comment on
-  // username_fragment().
-  std::string ice_username_fragment_;
-  std::string password_;
-  std::vector<Candidate> candidates_;
-  AddressMap connections_;
-  int timeout_delay_;
-  bool enable_port_packets_;
-  IceRole ice_role_;
-  uint64_t tiebreaker_;
-  bool shared_socket_;
-  // Information to use when going through a proxy.
-  std::string user_agent_;
-  rtc::ProxyInfo proxy_;
-
-  // A virtual cost perceived by the user, usually based on the network type
-  // (WiFi. vs. Cellular). It takes precedence over the priority when
-  // comparing two connections.
-  uint16_t network_cost_;
-  State state_ = State::INIT;
-  int64_t last_time_all_connections_removed_ = 0;
-
-  friend class Connection;
-};
-
-// Represents a communication link between a port on the local client and a
-// port on the remote client.
-class Connection : public CandidatePairInterface,
-                   public rtc::MessageHandler,
-                   public sigslot::has_slots<> {
- public:
-  struct SentPing {
-    SentPing(const std::string id, int64_t sent_time, uint32_t nomination)
-        : id(id), sent_time(sent_time), nomination(nomination) {}
-
-    std::string id;
-    int64_t sent_time;
-    uint32_t nomination;
-  };
-
-  virtual ~Connection();
-
-  // The local port where this connection sends and receives packets.
-  Port* port() { return port_; }
-  const Port* port() const { return port_; }
-
-  // Implementation of virtual methods in CandidatePairInterface.
-  // Returns the description of the local port
-  virtual const Candidate& local_candidate() const;
-  // Returns the description of the remote port to which we communicate.
-  virtual const Candidate& remote_candidate() const;
-
-  // Returns the pair priority.
-  uint64_t priority() const;
-
-  enum WriteState {
-    STATE_WRITABLE          = 0,  // we have received ping responses recently
-    STATE_WRITE_UNRELIABLE  = 1,  // we have had a few ping failures
-    STATE_WRITE_INIT        = 2,  // we have yet to receive a ping response
-    STATE_WRITE_TIMEOUT     = 3,  // we have had a large number of ping failures
-  };
-
-  WriteState write_state() const { return write_state_; }
-  bool writable() const { return write_state_ == STATE_WRITABLE; }
-  bool receiving() const { return receiving_; }
-
-  // Determines whether the connection has finished connecting.  This can only
-  // be false for TCP connections.
-  bool connected() const { return connected_; }
-  bool weak() const { return !(writable() && receiving() && connected()); }
-  bool active() const {
-    return write_state_ != STATE_WRITE_TIMEOUT;
-  }
-
-  // A connection is dead if it can be safely deleted.
-  bool dead(int64_t now) const;
-
-  // Estimate of the round-trip time over this connection.
-  int rtt() const { return rtt_; }
-
-  // Gets the |ConnectionInfo| stats, where |best_connection| has not been
-  // populated (default value false).
-  ConnectionInfo stats();
-
-  sigslot::signal1<Connection*> SignalStateChange;
-
-  // Sent when the connection has decided that it is no longer of value.  It
-  // will delete itself immediately after this call.
-  sigslot::signal1<Connection*> SignalDestroyed;
-
-  // The connection can send and receive packets asynchronously.  This matches
-  // the interface of AsyncPacketSocket, which may use UDP or TCP under the
-  // covers.
-  virtual int Send(const void* data, size_t size,
-                   const rtc::PacketOptions& options) = 0;
-
-  // Error if Send() returns < 0
-  virtual int GetError() = 0;
-
-  sigslot::signal4<Connection*, const char*, size_t, const rtc::PacketTime&>
-      SignalReadPacket;
-
-  sigslot::signal1<Connection*> SignalReadyToSend;
-
-  // Called when a packet is received on this connection.
-  void OnReadPacket(const char* data, size_t size,
-                    const rtc::PacketTime& packet_time);
-
-  // Called when the socket is currently able to send.
-  void OnReadyToSend();
-
-  // Called when a connection is determined to be no longer useful to us.  We
-  // still keep it around in case the other side wants to use it.  But we can
-  // safely stop pinging on it and we can allow it to time out if the other
-  // side stops using it as well.
-  bool pruned() const { return pruned_; }
-  void Prune();
-
-  bool use_candidate_attr() const { return use_candidate_attr_; }
-  void set_use_candidate_attr(bool enable);
-
-  void set_nomination(uint32_t value) { nomination_ = value; }
-
-  uint32_t remote_nomination() const { return remote_nomination_; }
-  // One or several pairs may be nominated based on if Regular or Aggressive
-  // Nomination is used. https://tools.ietf.org/html/rfc5245#section-8
-  // |nominated| is defined both for the controlling or controlled agent based
-  // on if a nomination has been pinged or acknowledged. The controlled agent
-  // gets its |remote_nomination_| set when pinged by the controlling agent with
-  // a nomination value. The controlling agent gets its |acked_nomination_| set
-  // when receiving a response to a nominating ping.
-  bool nominated() const { return acked_nomination_ || remote_nomination_; }
-  // Public for unit tests.
-  void set_remote_nomination(uint32_t remote_nomination) {
-    remote_nomination_ = remote_nomination;
-  }
-  // Public for unit tests.
-  uint32_t acked_nomination() const { return acked_nomination_; }
-
-  void set_remote_ice_mode(IceMode mode) {
-    remote_ice_mode_ = mode;
-  }
-
-  void set_receiving_timeout(int receiving_timeout_ms) {
-    receiving_timeout_ = receiving_timeout_ms;
-  }
-
-  // Makes the connection go away.
-  void Destroy();
-
-  // Makes the connection go away, in a failed state.
-  void FailAndDestroy();
-
-  // Prunes the connection and sets its state to STATE_FAILED,
-  // It will not be used or send pings although it can still receive packets.
-  void FailAndPrune();
-
-  // Checks that the state of this connection is up-to-date.  The argument is
-  // the current time, which is compared against various timeouts.
-  void UpdateState(int64_t now);
-
-  // Called when this connection should try checking writability again.
-  int64_t last_ping_sent() const { return last_ping_sent_; }
-  void Ping(int64_t now);
-  void ReceivedPingResponse(int rtt, const std::string& request_id);
-  int64_t last_ping_response_received() const {
-    return last_ping_response_received_;
-  }
-  // Used to check if any STUN ping response has been received.
-  int rtt_samples() const { return rtt_samples_; }
-
-  // Called whenever a valid ping is received on this connection.  This is
-  // public because the connection intercepts the first ping for us.
-  int64_t last_ping_received() const { return last_ping_received_; }
-  void ReceivedPing();
-  // Handles the binding request; sends a response if this is a valid request.
-  void HandleBindingRequest(IceMessage* msg);
-
-  int64_t last_data_received() const { return last_data_received_; }
-
-  // Debugging description of this connection
-  std::string ToDebugId() const;
-  std::string ToString() const;
-  std::string ToSensitiveString() const;
-  // Prints pings_since_last_response_ into a string.
-  void PrintPingsSinceLastResponse(std::string* pings, size_t max);
-
-  bool reported() const { return reported_; }
-  void set_reported(bool reported) { reported_ = reported;}
-
-  // This signal will be fired if this connection is nominated by the
-  // controlling side.
-  sigslot::signal1<Connection*> SignalNominated;
-
-  // Invoked when Connection receives STUN error response with 487 code.
-  void HandleRoleConflictFromPeer();
-
-  IceCandidatePairState state() const { return state_; }
-
-  int num_pings_sent() const { return num_pings_sent_; }
-
-  IceMode remote_ice_mode() const { return remote_ice_mode_; }
-
-  uint32_t ComputeNetworkCost() const;
-
-  // Update the ICE password and/or generation of the remote candidate if the
-  // ufrag in |params| matches the candidate's ufrag, and the
-  // candidate's password and/or ufrag has not been set.
-  void MaybeSetRemoteIceParametersAndGeneration(const IceParameters& params,
-                                                int generation);
-
-  // If |remote_candidate_| is peer reflexive and is equivalent to
-  // |new_candidate| except the type, update |remote_candidate_| to
-  // |new_candidate|.
-  void MaybeUpdatePeerReflexiveCandidate(const Candidate& new_candidate);
-
-  // Returns the last received time of any data, stun request, or stun
-  // response in milliseconds
-  int64_t last_received() const;
-  // Returns the last time when the connection changed its receiving state.
-  int64_t receiving_unchanged_since() const {
-    return receiving_unchanged_since_;
-  }
-
-  bool stable(int64_t now) const;
-
- protected:
-  enum { MSG_DELETE = 0, MSG_FIRST_AVAILABLE };
-
-  // Constructs a new connection to the given remote port.
-  Connection(Port* port, size_t index, const Candidate& candidate);
-
-  // Called back when StunRequestManager has a stun packet to send
-  void OnSendStunPacket(const void* data, size_t size, StunRequest* req);
-
-  // Callbacks from ConnectionRequest
-  virtual void OnConnectionRequestResponse(ConnectionRequest* req,
-                                           StunMessage* response);
-  void OnConnectionRequestErrorResponse(ConnectionRequest* req,
-                                        StunMessage* response);
-  void OnConnectionRequestTimeout(ConnectionRequest* req);
-  void OnConnectionRequestSent(ConnectionRequest* req);
-
-  bool rtt_converged() const;
-
-  // If the response is not received within 2 * RTT, the response is assumed to
-  // be missing.
-  bool missing_responses(int64_t now) const;
-
-  // Changes the state and signals if necessary.
-  void set_write_state(WriteState value);
-  void UpdateReceiving(int64_t now);
-  void set_state(IceCandidatePairState state);
-  void set_connected(bool value);
-
-  uint32_t nomination() const { return nomination_; }
-
-  void OnMessage(rtc::Message *pmsg);
-
-  Port* port_;
-  size_t local_candidate_index_;
-  Candidate remote_candidate_;
-
-  ConnectionInfo stats_;
-  rtc::RateTracker recv_rate_tracker_;
-  rtc::RateTracker send_rate_tracker_;
-
- private:
-  // Update the local candidate based on the mapped address attribute.
-  // If the local candidate changed, fires SignalStateChange.
-  void MaybeUpdateLocalCandidate(ConnectionRequest* request,
-                                 StunMessage* response);
-
-  WriteState write_state_;
-  bool receiving_;
-  bool connected_;
-  bool pruned_;
-  // By default |use_candidate_attr_| flag will be true,
-  // as we will be using aggressive nomination.
-  // But when peer is ice-lite, this flag "must" be initialized to false and
-  // turn on when connection becomes "best connection".
-  bool use_candidate_attr_;
-  // Used by the controlling side to indicate that this connection will be
-  // selected for transmission if the peer supports ICE-renomination when this
-  // value is positive. A larger-value indicates that a connection is nominated
-  // later and should be selected by the controlled side with higher precedence.
-  // A zero-value indicates not nominating this connection.
-  uint32_t nomination_ = 0;
-  // The last nomination that has been acknowledged.
-  uint32_t acked_nomination_ = 0;
-  // Used by the controlled side to remember the nomination value received from
-  // the controlling side. When the peer does not support ICE re-nomination,
-  // its value will be 1 if the connection has been nominated.
-  uint32_t remote_nomination_ = 0;
-
-  IceMode remote_ice_mode_;
-  StunRequestManager requests_;
-  int rtt_;
-  int rtt_samples_ = 0;
-  // https://w3c.github.io/webrtc-stats/#dom-rtcicecandidatepairstats-totalroundtriptime
-  uint64_t total_round_trip_time_ms_ = 0;
-  // https://w3c.github.io/webrtc-stats/#dom-rtcicecandidatepairstats-currentroundtriptime
-  rtc::Optional<uint32_t> current_round_trip_time_ms_;
-  int64_t last_ping_sent_;      // last time we sent a ping to the other side
-  int64_t last_ping_received_;  // last time we received a ping from the other
-                                // side
-  int64_t last_data_received_;
-  int64_t last_ping_response_received_;
-  int64_t receiving_unchanged_since_ = 0;
-  std::vector<SentPing> pings_since_last_response_;
-
-  PacketLossEstimator packet_loss_estimator_;
-
-  bool reported_;
-  IceCandidatePairState state_;
-  // Time duration to switch from receiving to not receiving.
-  int receiving_timeout_;
-  int64_t time_created_ms_;
-  int num_pings_sent_ = 0;
-
-  friend class Port;
-  friend class ConnectionRequest;
-};
-
-// ProxyConnection defers all the interesting work to the port.
-class ProxyConnection : public Connection {
- public:
-  ProxyConnection(Port* port, size_t index, const Candidate& remote_candidate);
-
-  int Send(const void* data,
-           size_t size,
-           const rtc::PacketOptions& options) override;
-  int GetError() override { return error_; }
-
- private:
-  int error_ = 0;
-};
-
-}  // namespace cricket
-
-#endif  // WEBRTC_P2P_BASE_PORT_H_
diff --git a/p2p/base/port_unittest.cc b/p2p/base/port_unittest.cc
deleted file mode 100644
index f47751f..0000000
--- a/p2p/base/port_unittest.cc
+++ /dev/null
@@ -1,2898 +0,0 @@
-/*
- *  Copyright 2004 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 <list>
-#include <memory>
-
-#include "webrtc/p2p/base/basicpacketsocketfactory.h"
-#include "webrtc/p2p/base/jseptransport.h"
-#include "webrtc/p2p/base/relayport.h"
-#include "webrtc/p2p/base/stunport.h"
-#include "webrtc/p2p/base/tcpport.h"
-#include "webrtc/p2p/base/testrelayserver.h"
-#include "webrtc/p2p/base/teststunserver.h"
-#include "webrtc/p2p/base/testturnserver.h"
-#include "webrtc/p2p/base/turnport.h"
-#include "webrtc/rtc_base/arraysize.h"
-#include "webrtc/rtc_base/buffer.h"
-#include "webrtc/rtc_base/crc32.h"
-#include "webrtc/rtc_base/gunit.h"
-#include "webrtc/rtc_base/helpers.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/natserver.h"
-#include "webrtc/rtc_base/natsocketfactory.h"
-#include "webrtc/rtc_base/ptr_util.h"
-#include "webrtc/rtc_base/socketaddress.h"
-#include "webrtc/rtc_base/ssladapter.h"
-#include "webrtc/rtc_base/stringutils.h"
-#include "webrtc/rtc_base/thread.h"
-#include "webrtc/rtc_base/virtualsocketserver.h"
-
-using rtc::AsyncPacketSocket;
-using rtc::Buffer;
-using rtc::ByteBufferReader;
-using rtc::ByteBufferWriter;
-using rtc::NATType;
-using rtc::NAT_OPEN_CONE;
-using rtc::NAT_ADDR_RESTRICTED;
-using rtc::NAT_PORT_RESTRICTED;
-using rtc::NAT_SYMMETRIC;
-using rtc::PacketSocketFactory;
-using rtc::Socket;
-using rtc::SocketAddress;
-using namespace cricket;
-
-static const int kDefaultTimeout = 3000;
-static const int kShortTimeout = 1000;
-static const SocketAddress kLocalAddr1("192.168.1.2", 0);
-static const SocketAddress kLocalAddr2("192.168.1.3", 0);
-static const SocketAddress kNatAddr1("77.77.77.77", rtc::NAT_SERVER_UDP_PORT);
-static const SocketAddress kNatAddr2("88.88.88.88", rtc::NAT_SERVER_UDP_PORT);
-static const SocketAddress kStunAddr("99.99.99.1", STUN_SERVER_PORT);
-static const SocketAddress kRelayUdpIntAddr("99.99.99.2", 5000);
-static const SocketAddress kRelayUdpExtAddr("99.99.99.3", 5001);
-static const SocketAddress kRelayTcpIntAddr("99.99.99.2", 5002);
-static const SocketAddress kRelayTcpExtAddr("99.99.99.3", 5003);
-static const SocketAddress kRelaySslTcpIntAddr("99.99.99.2", 5004);
-static const SocketAddress kRelaySslTcpExtAddr("99.99.99.3", 5005);
-static const SocketAddress kTurnUdpIntAddr("99.99.99.4", STUN_SERVER_PORT);
-static const SocketAddress kTurnTcpIntAddr("99.99.99.4", 5010);
-static const SocketAddress kTurnUdpExtAddr("99.99.99.5", 0);
-static const RelayCredentials kRelayCredentials("test", "test");
-
-// TODO: Update these when RFC5245 is completely supported.
-// Magic value of 30 is from RFC3484, for IPv4 addresses.
-static const uint32_t kDefaultPrflxPriority =
-    ICE_TYPE_PREFERENCE_PRFLX << 24 | 30 << 8 |
-    (256 - ICE_CANDIDATE_COMPONENT_DEFAULT);
-
-static const int kTiebreaker1 = 11111;
-static const int kTiebreaker2 = 22222;
-
-static const char* data = "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
-
-static const int kGturnUserNameLength = 16;
-
-static Candidate GetCandidate(Port* port) {
-  assert(port->Candidates().size() >= 1);
-  return port->Candidates()[0];
-}
-
-static SocketAddress GetAddress(Port* port) {
-  return GetCandidate(port).address();
-}
-
-static IceMessage* CopyStunMessage(const IceMessage* src) {
-  IceMessage* dst = new IceMessage();
-  ByteBufferWriter buf;
-  src->Write(&buf);
-  ByteBufferReader read_buf(buf);
-  dst->Read(&read_buf);
-  return dst;
-}
-
-static bool WriteStunMessage(const StunMessage* msg, ByteBufferWriter* buf) {
-  buf->Resize(0);  // clear out any existing buffer contents
-  return msg->Write(buf);
-}
-
-// Stub port class for testing STUN generation and processing.
-class TestPort : public Port {
- public:
-  TestPort(rtc::Thread* thread,
-           const std::string& type,
-           rtc::PacketSocketFactory* factory,
-           rtc::Network* network,
-           uint16_t min_port,
-           uint16_t max_port,
-           const std::string& username_fragment,
-           const std::string& password)
-      : Port(thread,
-             type,
-             factory,
-             network,
-             min_port,
-             max_port,
-             username_fragment,
-             password) {}
-  ~TestPort() {}
-
-  // Expose GetStunMessage so that we can test it.
-  using cricket::Port::GetStunMessage;
-
-  // The last StunMessage that was sent on this Port.
-  // TODO: Make these const; requires changes to SendXXXXResponse.
-  Buffer* last_stun_buf() { return last_stun_buf_.get(); }
-  IceMessage* last_stun_msg() { return last_stun_msg_.get(); }
-  int last_stun_error_code() {
-    int code = 0;
-    if (last_stun_msg_) {
-      const StunErrorCodeAttribute* error_attr = last_stun_msg_->GetErrorCode();
-      if (error_attr) {
-        code = error_attr->code();
-      }
-    }
-    return code;
-  }
-
-  virtual void PrepareAddress() {
-    // Act as if the socket was bound to the best IP on the network, to the
-    // first port in the allowed range.
-    rtc::SocketAddress addr(Network()->GetBestIP(), min_port());
-    AddAddress(addr, addr, rtc::SocketAddress(), "udp", "", "", Type(),
-               ICE_TYPE_PREFERENCE_HOST, 0, "", true);
-  }
-
-  virtual bool SupportsProtocol(const std::string& protocol) const {
-    return true;
-  }
-
-  virtual ProtocolType GetProtocol() const { return PROTO_UDP; }
-
-  // Exposed for testing candidate building.
-  void AddCandidateAddress(const rtc::SocketAddress& addr) {
-    AddAddress(addr, addr, rtc::SocketAddress(), "udp", "", "", Type(),
-               type_preference_, 0, "", false);
-  }
-  void AddCandidateAddress(const rtc::SocketAddress& addr,
-                           const rtc::SocketAddress& base_address,
-                           const std::string& type,
-                           int type_preference,
-                           bool final) {
-    AddAddress(addr, base_address, rtc::SocketAddress(), "udp", "", "", type,
-               type_preference, 0, "", final);
-  }
-
-  virtual Connection* CreateConnection(const Candidate& remote_candidate,
-                                       CandidateOrigin origin) {
-    Connection* conn = new ProxyConnection(this, 0, remote_candidate);
-    AddOrReplaceConnection(conn);
-    // Set use-candidate attribute flag as this will add USE-CANDIDATE attribute
-    // in STUN binding requests.
-    conn->set_use_candidate_attr(true);
-    return conn;
-  }
-  virtual int SendTo(
-      const void* data, size_t size, const rtc::SocketAddress& addr,
-      const rtc::PacketOptions& options, bool payload) {
-    if (!payload) {
-      IceMessage* msg = new IceMessage;
-      Buffer* buf = new Buffer(static_cast<const char*>(data), size);
-      ByteBufferReader read_buf(*buf);
-      if (!msg->Read(&read_buf)) {
-        delete msg;
-        delete buf;
-        return -1;
-      }
-      last_stun_buf_.reset(buf);
-      last_stun_msg_.reset(msg);
-    }
-    return static_cast<int>(size);
-  }
-  virtual int SetOption(rtc::Socket::Option opt, int value) {
-    return 0;
-  }
-  virtual int GetOption(rtc::Socket::Option opt, int* value) {
-    return -1;
-  }
-  virtual int GetError() {
-    return 0;
-  }
-  void Reset() {
-    last_stun_buf_.reset();
-    last_stun_msg_.reset();
-  }
-  void set_type_preference(int type_preference) {
-    type_preference_ = type_preference;
-  }
-
- private:
-  void OnSentPacket(rtc::AsyncPacketSocket* socket,
-                    const rtc::SentPacket& sent_packet) {
-    PortInterface::SignalSentPacket(sent_packet);
-  }
-  std::unique_ptr<Buffer> last_stun_buf_;
-  std::unique_ptr<IceMessage> last_stun_msg_;
-  int type_preference_ = 0;
-};
-
-static void SendPingAndReceiveResponse(
-    Connection* lconn, TestPort* lport, Connection* rconn, TestPort* rport,
-    rtc::ScopedFakeClock* clock, int64_t ms) {
-  lconn->Ping(rtc::TimeMillis());
-  ASSERT_TRUE_WAIT(lport->last_stun_msg(), kDefaultTimeout);
-  ASSERT_TRUE(lport->last_stun_buf());
-  rconn->OnReadPacket(lport->last_stun_buf()->data<char>(),
-                      lport->last_stun_buf()->size(),
-                      rtc::PacketTime());
-  clock->AdvanceTime(rtc::TimeDelta::FromMilliseconds(ms));
-  ASSERT_TRUE_WAIT(rport->last_stun_msg(), kDefaultTimeout);
-  ASSERT_TRUE(rport->last_stun_buf());
-  lconn->OnReadPacket(rport->last_stun_buf()->data<char>(),
-                      rport->last_stun_buf()->size(),
-                      rtc::PacketTime());
-}
-
-class TestChannel : public sigslot::has_slots<> {
- public:
-  // Takes ownership of |p1| (but not |p2|).
-  TestChannel(Port* p1)
-      : ice_mode_(ICEMODE_FULL),
-        port_(p1),
-        complete_count_(0),
-        conn_(NULL),
-        remote_request_(),
-        nominated_(false) {
-    port_->SignalPortComplete.connect(this, &TestChannel::OnPortComplete);
-    port_->SignalUnknownAddress.connect(this, &TestChannel::OnUnknownAddress);
-    port_->SignalDestroyed.connect(this, &TestChannel::OnSrcPortDestroyed);
-  }
-
-  int complete_count() { return complete_count_; }
-  Connection* conn() { return conn_; }
-  const SocketAddress& remote_address() { return remote_address_; }
-  const std::string remote_fragment() { return remote_frag_; }
-
-  void Start() { port_->PrepareAddress(); }
-  void CreateConnection(const Candidate& remote_candidate) {
-    conn_ = port_->CreateConnection(remote_candidate, Port::ORIGIN_MESSAGE);
-    IceMode remote_ice_mode =
-        (ice_mode_ == ICEMODE_FULL) ? ICEMODE_LITE : ICEMODE_FULL;
-    conn_->set_remote_ice_mode(remote_ice_mode);
-    conn_->set_use_candidate_attr(remote_ice_mode == ICEMODE_FULL);
-    conn_->SignalStateChange.connect(
-        this, &TestChannel::OnConnectionStateChange);
-    conn_->SignalDestroyed.connect(this, &TestChannel::OnDestroyed);
-    conn_->SignalReadyToSend.connect(this,
-                                     &TestChannel::OnConnectionReadyToSend);
-    connection_ready_to_send_ = false;
-  }
-  void OnConnectionStateChange(Connection* conn) {
-    if (conn->write_state() == Connection::STATE_WRITABLE) {
-      conn->set_use_candidate_attr(true);
-      nominated_ = true;
-    }
-  }
-  void AcceptConnection(const Candidate& remote_candidate) {
-    ASSERT_TRUE(remote_request_.get() != NULL);
-    Candidate c = remote_candidate;
-    c.set_address(remote_address_);
-    conn_ = port_->CreateConnection(c, Port::ORIGIN_MESSAGE);
-    conn_->SignalDestroyed.connect(this, &TestChannel::OnDestroyed);
-    port_->SendBindingResponse(remote_request_.get(), remote_address_);
-    remote_request_.reset();
-  }
-  void Ping() {
-    Ping(0);
-  }
-  void Ping(int64_t now) { conn_->Ping(now); }
-  void Stop() {
-    if (conn_) {
-      conn_->Destroy();
-    }
-  }
-
-  void OnPortComplete(Port* port) {
-    complete_count_++;
-  }
-  void SetIceMode(IceMode ice_mode) {
-    ice_mode_ = ice_mode;
-  }
-
-  int SendData(const char* data, size_t len) {
-    rtc::PacketOptions options;
-    return conn_->Send(data, len, options);
-  }
-
-  void OnUnknownAddress(PortInterface* port, const SocketAddress& addr,
-                        ProtocolType proto,
-                        IceMessage* msg, const std::string& rf,
-                        bool /*port_muxed*/) {
-    ASSERT_EQ(port_.get(), port);
-    if (!remote_address_.IsNil()) {
-      ASSERT_EQ(remote_address_, addr);
-    }
-    const cricket::StunUInt32Attribute* priority_attr =
-        msg->GetUInt32(STUN_ATTR_PRIORITY);
-    const cricket::StunByteStringAttribute* mi_attr =
-        msg->GetByteString(STUN_ATTR_MESSAGE_INTEGRITY);
-    const cricket::StunUInt32Attribute* fingerprint_attr =
-        msg->GetUInt32(STUN_ATTR_FINGERPRINT);
-    EXPECT_TRUE(priority_attr != NULL);
-    EXPECT_TRUE(mi_attr != NULL);
-    EXPECT_TRUE(fingerprint_attr != NULL);
-    remote_address_ = addr;
-    remote_request_.reset(CopyStunMessage(msg));
-    remote_frag_ = rf;
-  }
-
-  void OnDestroyed(Connection* conn) {
-    ASSERT_EQ(conn_, conn);
-    LOG(INFO) << "OnDestroy connection " << conn << " deleted";
-    conn_ = NULL;
-    // When the connection is destroyed, also clear these fields so future
-    // connections are possible.
-    remote_request_.reset();
-    remote_address_.Clear();
-  }
-
-  void OnSrcPortDestroyed(PortInterface* port) {
-    Port* destroyed_src = port_.release();
-    ASSERT_EQ(destroyed_src, port);
-  }
-
-  Port* port() { return port_.get(); }
-
-  bool nominated() const { return nominated_; }
-
-  void set_connection_ready_to_send(bool ready) {
-    connection_ready_to_send_ = ready;
-  }
-  bool connection_ready_to_send() const {
-    return connection_ready_to_send_;
-  }
-
- private:
-  // ReadyToSend will only issue after a Connection recovers from ENOTCONN
-  void OnConnectionReadyToSend(Connection* conn) {
-    ASSERT_EQ(conn, conn_);
-    connection_ready_to_send_ = true;
-  }
-
-  IceMode ice_mode_;
-  std::unique_ptr<Port> port_;
-
-  int complete_count_;
-  Connection* conn_;
-  SocketAddress remote_address_;
-  std::unique_ptr<StunMessage> remote_request_;
-  std::string remote_frag_;
-  bool nominated_;
-  bool connection_ready_to_send_ = false;
-};
-
-class PortTest : public testing::Test, public sigslot::has_slots<> {
- public:
-  PortTest()
-      : ss_(new rtc::VirtualSocketServer()),
-        main_(ss_.get()),
-        socket_factory_(rtc::Thread::Current()),
-        nat_factory1_(ss_.get(), kNatAddr1, SocketAddress()),
-        nat_factory2_(ss_.get(), kNatAddr2, SocketAddress()),
-        nat_socket_factory1_(&nat_factory1_),
-        nat_socket_factory2_(&nat_factory2_),
-        stun_server_(TestStunServer::Create(&main_, kStunAddr)),
-        turn_server_(&main_, kTurnUdpIntAddr, kTurnUdpExtAddr),
-        relay_server_(&main_,
-                      kRelayUdpIntAddr,
-                      kRelayUdpExtAddr,
-                      kRelayTcpIntAddr,
-                      kRelayTcpExtAddr,
-                      kRelaySslTcpIntAddr,
-                      kRelaySslTcpExtAddr),
-        username_(rtc::CreateRandomString(ICE_UFRAG_LENGTH)),
-        password_(rtc::CreateRandomString(ICE_PWD_LENGTH)),
-        role_conflict_(false),
-        ports_destroyed_(0) {
-  }
-
- protected:
-  void TestLocalToLocal() {
-    Port* port1 = CreateUdpPort(kLocalAddr1);
-    port1->SetIceRole(cricket::ICEROLE_CONTROLLING);
-    Port* port2 = CreateUdpPort(kLocalAddr2);
-    port2->SetIceRole(cricket::ICEROLE_CONTROLLED);
-    TestConnectivity("udp", port1, "udp", port2, true, true, true, true);
-  }
-  void TestLocalToStun(NATType ntype) {
-    Port* port1 = CreateUdpPort(kLocalAddr1);
-    port1->SetIceRole(cricket::ICEROLE_CONTROLLING);
-    nat_server2_.reset(CreateNatServer(kNatAddr2, ntype));
-    Port* port2 = CreateStunPort(kLocalAddr2, &nat_socket_factory2_);
-    port2->SetIceRole(cricket::ICEROLE_CONTROLLED);
-    TestConnectivity("udp", port1, StunName(ntype), port2,
-                     ntype == NAT_OPEN_CONE, true,
-                     ntype != NAT_SYMMETRIC, true);
-  }
-  void TestLocalToRelay(RelayType rtype, ProtocolType proto) {
-    Port* port1 = CreateUdpPort(kLocalAddr1);
-    port1->SetIceRole(cricket::ICEROLE_CONTROLLING);
-    Port* port2 = CreateRelayPort(kLocalAddr2, rtype, proto, PROTO_UDP);
-    port2->SetIceRole(cricket::ICEROLE_CONTROLLED);
-    TestConnectivity("udp", port1, RelayName(rtype, proto), port2,
-                     rtype == RELAY_GTURN, true, true, true);
-  }
-  void TestStunToLocal(NATType ntype) {
-    nat_server1_.reset(CreateNatServer(kNatAddr1, ntype));
-    Port* port1 = CreateStunPort(kLocalAddr1, &nat_socket_factory1_);
-    port1->SetIceRole(cricket::ICEROLE_CONTROLLING);
-    Port* port2 = CreateUdpPort(kLocalAddr2);
-    port2->SetIceRole(cricket::ICEROLE_CONTROLLED);
-    TestConnectivity(StunName(ntype), port1, "udp", port2,
-                     true, ntype != NAT_SYMMETRIC, true, true);
-  }
-  void TestStunToStun(NATType ntype1, NATType ntype2) {
-    nat_server1_.reset(CreateNatServer(kNatAddr1, ntype1));
-    Port* port1 = CreateStunPort(kLocalAddr1, &nat_socket_factory1_);
-    port1->SetIceRole(cricket::ICEROLE_CONTROLLING);
-    nat_server2_.reset(CreateNatServer(kNatAddr2, ntype2));
-    Port* port2 = CreateStunPort(kLocalAddr2, &nat_socket_factory2_);
-    port2->SetIceRole(cricket::ICEROLE_CONTROLLED);
-    TestConnectivity(StunName(ntype1), port1, StunName(ntype2), port2,
-                     ntype2 == NAT_OPEN_CONE,
-                     ntype1 != NAT_SYMMETRIC, ntype2 != NAT_SYMMETRIC,
-                     ntype1 + ntype2 < (NAT_PORT_RESTRICTED + NAT_SYMMETRIC));
-  }
-  void TestStunToRelay(NATType ntype, RelayType rtype, ProtocolType proto) {
-    nat_server1_.reset(CreateNatServer(kNatAddr1, ntype));
-    Port* port1 = CreateStunPort(kLocalAddr1, &nat_socket_factory1_);
-    port1->SetIceRole(cricket::ICEROLE_CONTROLLING);
-    Port* port2 = CreateRelayPort(kLocalAddr2, rtype, proto, PROTO_UDP);
-    port2->SetIceRole(cricket::ICEROLE_CONTROLLED);
-    TestConnectivity(StunName(ntype), port1, RelayName(rtype, proto), port2,
-                     rtype == RELAY_GTURN, ntype != NAT_SYMMETRIC, true, true);
-  }
-  void TestTcpToTcp() {
-    Port* port1 = CreateTcpPort(kLocalAddr1);
-    port1->SetIceRole(cricket::ICEROLE_CONTROLLING);
-    Port* port2 = CreateTcpPort(kLocalAddr2);
-    port2->SetIceRole(cricket::ICEROLE_CONTROLLED);
-    TestConnectivity("tcp", port1, "tcp", port2, true, false, true, true);
-  }
-  void TestTcpToRelay(RelayType rtype, ProtocolType proto) {
-    Port* port1 = CreateTcpPort(kLocalAddr1);
-    port1->SetIceRole(cricket::ICEROLE_CONTROLLING);
-    Port* port2 = CreateRelayPort(kLocalAddr2, rtype, proto, PROTO_TCP);
-    port2->SetIceRole(cricket::ICEROLE_CONTROLLED);
-    TestConnectivity("tcp", port1, RelayName(rtype, proto), port2,
-                     rtype == RELAY_GTURN, false, true, true);
-  }
-  void TestSslTcpToRelay(RelayType rtype, ProtocolType proto) {
-    Port* port1 = CreateTcpPort(kLocalAddr1);
-    port1->SetIceRole(cricket::ICEROLE_CONTROLLING);
-    Port* port2 = CreateRelayPort(kLocalAddr2, rtype, proto, PROTO_SSLTCP);
-    port2->SetIceRole(cricket::ICEROLE_CONTROLLED);
-    TestConnectivity("ssltcp", port1, RelayName(rtype, proto), port2,
-                     rtype == RELAY_GTURN, false, true, true);
-  }
-
-  rtc::Network* MakeNetwork(const SocketAddress& addr) {
-    networks_.emplace_back("unittest", "unittest", addr.ipaddr(), 32);
-    networks_.back().AddIP(addr.ipaddr());
-    return &networks_.back();
-  }
-
-  // helpers for above functions
-  UDPPort* CreateUdpPort(const SocketAddress& addr) {
-    return CreateUdpPort(addr, &socket_factory_);
-  }
-  UDPPort* CreateUdpPort(const SocketAddress& addr,
-                         PacketSocketFactory* socket_factory) {
-    return UDPPort::Create(&main_, socket_factory, MakeNetwork(addr), 0, 0,
-                           username_, password_, std::string(), true);
-  }
-  TCPPort* CreateTcpPort(const SocketAddress& addr) {
-    return CreateTcpPort(addr, &socket_factory_);
-  }
-  TCPPort* CreateTcpPort(const SocketAddress& addr,
-                        PacketSocketFactory* socket_factory) {
-    return TCPPort::Create(&main_, socket_factory, MakeNetwork(addr), 0, 0,
-                           username_, password_, true);
-  }
-  StunPort* CreateStunPort(const SocketAddress& addr,
-                           rtc::PacketSocketFactory* factory) {
-    ServerAddresses stun_servers;
-    stun_servers.insert(kStunAddr);
-    return StunPort::Create(&main_, factory, MakeNetwork(addr), 0, 0, username_,
-                            password_, stun_servers, std::string());
-  }
-  Port* CreateRelayPort(const SocketAddress& addr, RelayType rtype,
-                        ProtocolType int_proto, ProtocolType ext_proto) {
-    if (rtype == RELAY_TURN) {
-      return CreateTurnPort(addr, &socket_factory_, int_proto, ext_proto);
-    } else {
-      return CreateGturnPort(addr, int_proto, ext_proto);
-    }
-  }
-  TurnPort* CreateTurnPort(const SocketAddress& addr,
-                           PacketSocketFactory* socket_factory,
-                           ProtocolType int_proto, ProtocolType ext_proto) {
-    SocketAddress server_addr =
-        int_proto == PROTO_TCP ? kTurnTcpIntAddr : kTurnUdpIntAddr;
-    return CreateTurnPort(addr, socket_factory, int_proto, ext_proto,
-                          server_addr);
-  }
-  TurnPort* CreateTurnPort(const SocketAddress& addr,
-                           PacketSocketFactory* socket_factory,
-                           ProtocolType int_proto, ProtocolType ext_proto,
-                           const rtc::SocketAddress& server_addr) {
-    return TurnPort::Create(
-        &main_, socket_factory, MakeNetwork(addr), 0, 0, username_, password_,
-        ProtocolAddress(server_addr, int_proto), kRelayCredentials, 0,
-        std::string(), std::vector<std::string>(), std::vector<std::string>());
-  }
-  RelayPort* CreateGturnPort(const SocketAddress& addr,
-                             ProtocolType int_proto, ProtocolType ext_proto) {
-    RelayPort* port = CreateGturnPort(addr);
-    SocketAddress addrs[] =
-        { kRelayUdpIntAddr, kRelayTcpIntAddr, kRelaySslTcpIntAddr };
-    port->AddServerAddress(ProtocolAddress(addrs[int_proto], int_proto));
-    return port;
-  }
-  RelayPort* CreateGturnPort(const SocketAddress& addr) {
-    // TODO(pthatcher):  Remove GTURN.
-    // Generate a username with length of 16 for Gturn only.
-    std::string username = rtc::CreateRandomString(kGturnUserNameLength);
-    return RelayPort::Create(&main_, &socket_factory_, MakeNetwork(addr), 0, 0,
-                             username, password_);
-    // TODO: Add an external address for ext_proto, so that the
-    // other side can connect to this port using a non-UDP protocol.
-  }
-  rtc::NATServer* CreateNatServer(const SocketAddress& addr,
-                                        rtc::NATType type) {
-    return new rtc::NATServer(type, ss_.get(), addr, addr, ss_.get(), addr);
-  }
-  static const char* StunName(NATType type) {
-    switch (type) {
-      case NAT_OPEN_CONE:
-        return "stun(open cone)";
-      case NAT_ADDR_RESTRICTED:
-        return "stun(addr restricted)";
-      case NAT_PORT_RESTRICTED:
-        return "stun(port restricted)";
-      case NAT_SYMMETRIC:
-        return "stun(symmetric)";
-      default:
-        return "stun(?)";
-    }
-  }
-  static const char* RelayName(RelayType type, ProtocolType proto) {
-    if (type == RELAY_TURN) {
-      switch (proto) {
-        case PROTO_UDP:
-          return "turn(udp)";
-        case PROTO_TCP:
-          return "turn(tcp)";
-        case PROTO_SSLTCP:
-          return "turn(ssltcp)";
-        case PROTO_TLS:
-          return "turn(tls)";
-        default:
-          return "turn(?)";
-      }
-    } else {
-      switch (proto) {
-        case PROTO_UDP:
-          return "gturn(udp)";
-        case PROTO_TCP:
-          return "gturn(tcp)";
-        case PROTO_SSLTCP:
-          return "gturn(ssltcp)";
-        case PROTO_TLS:
-          return "gturn(tls)";
-        default:
-          return "gturn(?)";
-      }
-    }
-  }
-
-  void TestCrossFamilyPorts(int type);
-
-  void ExpectPortsCanConnect(bool can_connect, Port* p1, Port* p2);
-
-  // This does all the work and then deletes |port1| and |port2|.
-  void TestConnectivity(const char* name1, Port* port1,
-                        const char* name2, Port* port2,
-                        bool accept, bool same_addr1,
-                        bool same_addr2, bool possible);
-
-  // This connects the provided channels which have already started.  |ch1|
-  // should have its Connection created (either through CreateConnection() or
-  // TCP reconnecting mechanism before entering this function.
-  void ConnectStartedChannels(TestChannel* ch1, TestChannel* ch2) {
-    ASSERT_TRUE(ch1->conn());
-    EXPECT_TRUE_WAIT(ch1->conn()->connected(),
-                     kDefaultTimeout);  // for TCP connect
-    ch1->Ping();
-    WAIT(!ch2->remote_address().IsNil(), kShortTimeout);
-
-    // Send a ping from dst to src.
-    ch2->AcceptConnection(GetCandidate(ch1->port()));
-    ch2->Ping();
-    EXPECT_EQ_WAIT(Connection::STATE_WRITABLE, ch2->conn()->write_state(),
-                   kDefaultTimeout);
-  }
-
-  // This connects and disconnects the provided channels in the same sequence as
-  // TestConnectivity with all options set to |true|.  It does not delete either
-  // channel.
-  void StartConnectAndStopChannels(TestChannel* ch1, TestChannel* ch2) {
-    // Acquire addresses.
-    ch1->Start();
-    ch2->Start();
-
-    ch1->CreateConnection(GetCandidate(ch2->port()));
-    ConnectStartedChannels(ch1, ch2);
-
-    // Destroy the connections.
-    ch1->Stop();
-    ch2->Stop();
-  }
-
-  // This disconnects both end's Connection and make sure ch2 ready for new
-  // connection.
-  void DisconnectTcpTestChannels(TestChannel* ch1, TestChannel* ch2) {
-    TCPConnection* tcp_conn1 = static_cast<TCPConnection*>(ch1->conn());
-    TCPConnection* tcp_conn2 = static_cast<TCPConnection*>(ch2->conn());
-    ASSERT_TRUE(
-        ss_->CloseTcpConnections(tcp_conn1->socket()->GetLocalAddress(),
-                                 tcp_conn2->socket()->GetLocalAddress()));
-
-    // Wait for both OnClose are delivered.
-    EXPECT_TRUE_WAIT(!ch1->conn()->connected(), kDefaultTimeout);
-    EXPECT_TRUE_WAIT(!ch2->conn()->connected(), kDefaultTimeout);
-
-    // Ensure redundant SignalClose events on TcpConnection won't break tcp
-    // reconnection. Chromium will fire SignalClose for all outstanding IPC
-    // packets during reconnection.
-    tcp_conn1->socket()->SignalClose(tcp_conn1->socket(), 0);
-    tcp_conn2->socket()->SignalClose(tcp_conn2->socket(), 0);
-
-    // Speed up destroying ch2's connection such that the test is ready to
-    // accept a new connection from ch1 before ch1's connection destroys itself.
-    ch2->conn()->Destroy();
-    EXPECT_TRUE_WAIT(ch2->conn() == NULL, kDefaultTimeout);
-  }
-
-  void TestTcpReconnect(bool ping_after_disconnected,
-                        bool send_after_disconnected) {
-    Port* port1 = CreateTcpPort(kLocalAddr1);
-    port1->SetIceRole(cricket::ICEROLE_CONTROLLING);
-    Port* port2 = CreateTcpPort(kLocalAddr2);
-    port2->SetIceRole(cricket::ICEROLE_CONTROLLED);
-
-    port1->set_component(cricket::ICE_CANDIDATE_COMPONENT_DEFAULT);
-    port2->set_component(cricket::ICE_CANDIDATE_COMPONENT_DEFAULT);
-
-    // Set up channels and ensure both ports will be deleted.
-    TestChannel ch1(port1);
-    TestChannel ch2(port2);
-    EXPECT_EQ(0, ch1.complete_count());
-    EXPECT_EQ(0, ch2.complete_count());
-
-    ch1.Start();
-    ch2.Start();
-    ASSERT_EQ_WAIT(1, ch1.complete_count(), kDefaultTimeout);
-    ASSERT_EQ_WAIT(1, ch2.complete_count(), kDefaultTimeout);
-
-    // Initial connecting the channel, create connection on channel1.
-    ch1.CreateConnection(GetCandidate(port2));
-    ConnectStartedChannels(&ch1, &ch2);
-
-    // Shorten the timeout period.
-    const int kTcpReconnectTimeout = kDefaultTimeout;
-    static_cast<TCPConnection*>(ch1.conn())
-        ->set_reconnection_timeout(kTcpReconnectTimeout);
-    static_cast<TCPConnection*>(ch2.conn())
-        ->set_reconnection_timeout(kTcpReconnectTimeout);
-
-    EXPECT_FALSE(ch1.connection_ready_to_send());
-    EXPECT_FALSE(ch2.connection_ready_to_send());
-
-    // Once connected, disconnect them.
-    DisconnectTcpTestChannels(&ch1, &ch2);
-
-    if (send_after_disconnected || ping_after_disconnected) {
-      if (send_after_disconnected) {
-        // First SendData after disconnect should fail but will trigger
-        // reconnect.
-        EXPECT_EQ(-1, ch1.SendData(data, static_cast<int>(strlen(data))));
-      }
-
-      if (ping_after_disconnected) {
-        // Ping should trigger reconnect.
-        ch1.Ping();
-      }
-
-      // Wait for channel's outgoing TCPConnection connected.
-      EXPECT_TRUE_WAIT(ch1.conn()->connected(), kDefaultTimeout);
-
-      // Verify that we could still connect channels.
-      ConnectStartedChannels(&ch1, &ch2);
-      EXPECT_TRUE_WAIT(ch1.connection_ready_to_send(),
-                       kTcpReconnectTimeout);
-      // Channel2 is the passive one so a new connection is created during
-      // reconnect. This new connection should never have issued ENOTCONN
-      // hence the connection_ready_to_send() should be false.
-      EXPECT_FALSE(ch2.connection_ready_to_send());
-    } else {
-      EXPECT_EQ(ch1.conn()->write_state(), Connection::STATE_WRITABLE);
-      // Since the reconnection never happens, the connections should have been
-      // destroyed after the timeout.
-      EXPECT_TRUE_WAIT(!ch1.conn(), kTcpReconnectTimeout + kDefaultTimeout);
-      EXPECT_TRUE(!ch2.conn());
-    }
-
-    // Tear down and ensure that goes smoothly.
-    ch1.Stop();
-    ch2.Stop();
-    EXPECT_TRUE_WAIT(ch1.conn() == NULL, kDefaultTimeout);
-    EXPECT_TRUE_WAIT(ch2.conn() == NULL, kDefaultTimeout);
-  }
-
-  IceMessage* CreateStunMessage(int type) {
-    IceMessage* msg = new IceMessage();
-    msg->SetType(type);
-    msg->SetTransactionID("TESTTESTTEST");
-    return msg;
-  }
-  IceMessage* CreateStunMessageWithUsername(int type,
-                                            const std::string& username) {
-    IceMessage* msg = CreateStunMessage(type);
-    msg->AddAttribute(
-        rtc::MakeUnique<StunByteStringAttribute>(STUN_ATTR_USERNAME, username));
-    return msg;
-  }
-  TestPort* CreateTestPort(const rtc::SocketAddress& addr,
-                           const std::string& username,
-                           const std::string& password) {
-    TestPort* port = new TestPort(&main_, "test", &socket_factory_,
-                                  MakeNetwork(addr), 0, 0, username, password);
-    port->SignalRoleConflict.connect(this, &PortTest::OnRoleConflict);
-    return port;
-  }
-  TestPort* CreateTestPort(const rtc::SocketAddress& addr,
-                           const std::string& username,
-                           const std::string& password,
-                           cricket::IceRole role,
-                           int tiebreaker) {
-    TestPort* port = CreateTestPort(addr, username, password);
-    port->SetIceRole(role);
-    port->SetIceTiebreaker(tiebreaker);
-    return port;
-  }
-  // Overload to create a test port given an rtc::Network directly.
-  TestPort* CreateTestPort(rtc::Network* network,
-                           const std::string& username,
-                           const std::string& password) {
-    TestPort* port = new TestPort(&main_, "test", &socket_factory_, network, 0,
-                                  0, username, password);
-    port->SignalRoleConflict.connect(this, &PortTest::OnRoleConflict);
-    return port;
-  }
-
-  void OnRoleConflict(PortInterface* port) {
-    role_conflict_ = true;
-  }
-  bool role_conflict() const { return role_conflict_; }
-
-  void ConnectToSignalDestroyed(PortInterface* port) {
-    port->SignalDestroyed.connect(this, &PortTest::OnDestroyed);
-  }
-
-  void OnDestroyed(PortInterface* port) { ++ports_destroyed_; }
-  int ports_destroyed() const { return ports_destroyed_; }
-
-  rtc::BasicPacketSocketFactory* nat_socket_factory1() {
-    return &nat_socket_factory1_;
-  }
-
-  rtc::VirtualSocketServer* vss() { return ss_.get(); }
-
- private:
-  // When a "create port" helper method is called with an IP, we create a
-  // Network with that IP and add it to this list. Using a list instead of a
-  // vector so that when it grows, pointers aren't invalidated.
-  std::list<rtc::Network> networks_;
-  std::unique_ptr<rtc::VirtualSocketServer> ss_;
-  rtc::AutoSocketServerThread main_;
-  rtc::BasicPacketSocketFactory socket_factory_;
-  std::unique_ptr<rtc::NATServer> nat_server1_;
-  std::unique_ptr<rtc::NATServer> nat_server2_;
-  rtc::NATSocketFactory nat_factory1_;
-  rtc::NATSocketFactory nat_factory2_;
-  rtc::BasicPacketSocketFactory nat_socket_factory1_;
-  rtc::BasicPacketSocketFactory nat_socket_factory2_;
-  std::unique_ptr<TestStunServer> stun_server_;
-  TestTurnServer turn_server_;
-  TestRelayServer relay_server_;
-  std::string username_;
-  std::string password_;
-  bool role_conflict_;
-  int ports_destroyed_;
-};
-
-void PortTest::TestConnectivity(const char* name1, Port* port1,
-                                const char* name2, Port* port2,
-                                bool accept, bool same_addr1,
-                                bool same_addr2, bool possible) {
-  rtc::ScopedFakeClock clock;
-  LOG(LS_INFO) << "Test: " << name1 << " to " << name2 << ": ";
-  port1->set_component(cricket::ICE_CANDIDATE_COMPONENT_DEFAULT);
-  port2->set_component(cricket::ICE_CANDIDATE_COMPONENT_DEFAULT);
-
-  // Set up channels and ensure both ports will be deleted.
-  TestChannel ch1(port1);
-  TestChannel ch2(port2);
-  EXPECT_EQ(0, ch1.complete_count());
-  EXPECT_EQ(0, ch2.complete_count());
-
-  // Acquire addresses.
-  ch1.Start();
-  ch2.Start();
-  ASSERT_EQ_SIMULATED_WAIT(1, ch1.complete_count(), kDefaultTimeout, clock);
-  ASSERT_EQ_SIMULATED_WAIT(1, ch2.complete_count(), kDefaultTimeout, clock);
-
-  // Send a ping from src to dst. This may or may not make it.
-  ch1.CreateConnection(GetCandidate(port2));
-  ASSERT_TRUE(ch1.conn() != NULL);
-  EXPECT_TRUE_SIMULATED_WAIT(ch1.conn()->connected(), kDefaultTimeout,
-                             clock);  // for TCP connect
-  ch1.Ping();
-  SIMULATED_WAIT(!ch2.remote_address().IsNil(), kShortTimeout, clock);
-
-  if (accept) {
-    // We are able to send a ping from src to dst. This is the case when
-    // sending to UDP ports and cone NATs.
-    EXPECT_TRUE(ch1.remote_address().IsNil());
-    EXPECT_EQ(ch2.remote_fragment(), port1->username_fragment());
-
-    // Ensure the ping came from the same address used for src.
-    // This is the case unless the source NAT was symmetric.
-    if (same_addr1) EXPECT_EQ(ch2.remote_address(), GetAddress(port1));
-    EXPECT_TRUE(same_addr2);
-
-    // Send a ping from dst to src.
-    ch2.AcceptConnection(GetCandidate(port1));
-    ASSERT_TRUE(ch2.conn() != NULL);
-    ch2.Ping();
-    EXPECT_EQ_SIMULATED_WAIT(Connection::STATE_WRITABLE,
-                             ch2.conn()->write_state(), kDefaultTimeout, clock);
-  } else {
-    // We can't send a ping from src to dst, so flip it around. This will happen
-    // when the destination NAT is addr/port restricted or symmetric.
-    EXPECT_TRUE(ch1.remote_address().IsNil());
-    EXPECT_TRUE(ch2.remote_address().IsNil());
-
-    // Send a ping from dst to src. Again, this may or may not make it.
-    ch2.CreateConnection(GetCandidate(port1));
-    ASSERT_TRUE(ch2.conn() != NULL);
-    ch2.Ping();
-    SIMULATED_WAIT(ch2.conn()->write_state() == Connection::STATE_WRITABLE,
-                   kShortTimeout, clock);
-
-    if (same_addr1 && same_addr2) {
-      // The new ping got back to the source.
-      EXPECT_TRUE(ch1.conn()->receiving());
-      EXPECT_EQ(Connection::STATE_WRITABLE, ch2.conn()->write_state());
-
-      // First connection may not be writable if the first ping did not get
-      // through.  So we will have to do another.
-      if (ch1.conn()->write_state() == Connection::STATE_WRITE_INIT) {
-        ch1.Ping();
-        EXPECT_EQ_SIMULATED_WAIT(Connection::STATE_WRITABLE,
-                                 ch1.conn()->write_state(), kDefaultTimeout,
-                                 clock);
-      }
-    } else if (!same_addr1 && possible) {
-      // The new ping went to the candidate address, but that address was bad.
-      // This will happen when the source NAT is symmetric.
-      EXPECT_TRUE(ch1.remote_address().IsNil());
-      EXPECT_TRUE(ch2.remote_address().IsNil());
-
-      // However, since we have now sent a ping to the source IP, we should be
-      // able to get a ping from it. This gives us the real source address.
-      ch1.Ping();
-      EXPECT_TRUE_SIMULATED_WAIT(!ch2.remote_address().IsNil(), kDefaultTimeout,
-                                 clock);
-      EXPECT_FALSE(ch2.conn()->receiving());
-      EXPECT_TRUE(ch1.remote_address().IsNil());
-
-      // Pick up the actual address and establish the connection.
-      ch2.AcceptConnection(GetCandidate(port1));
-      ASSERT_TRUE(ch2.conn() != NULL);
-      ch2.Ping();
-      EXPECT_EQ_SIMULATED_WAIT(Connection::STATE_WRITABLE,
-                               ch2.conn()->write_state(), kDefaultTimeout,
-                               clock);
-    } else if (!same_addr2 && possible) {
-      // The new ping came in, but from an unexpected address. This will happen
-      // when the destination NAT is symmetric.
-      EXPECT_FALSE(ch1.remote_address().IsNil());
-      EXPECT_FALSE(ch1.conn()->receiving());
-
-      // Update our address and complete the connection.
-      ch1.AcceptConnection(GetCandidate(port2));
-      ch1.Ping();
-      EXPECT_EQ_SIMULATED_WAIT(Connection::STATE_WRITABLE,
-                               ch1.conn()->write_state(), kDefaultTimeout,
-                               clock);
-    } else {  // (!possible)
-      // There should be s no way for the pings to reach each other. Check it.
-      EXPECT_TRUE(ch1.remote_address().IsNil());
-      EXPECT_TRUE(ch2.remote_address().IsNil());
-      ch1.Ping();
-      SIMULATED_WAIT(!ch2.remote_address().IsNil(), kShortTimeout, clock);
-      EXPECT_TRUE(ch1.remote_address().IsNil());
-      EXPECT_TRUE(ch2.remote_address().IsNil());
-    }
-  }
-
-  // Everything should be good, unless we know the situation is impossible.
-  ASSERT_TRUE(ch1.conn() != NULL);
-  ASSERT_TRUE(ch2.conn() != NULL);
-  if (possible) {
-    EXPECT_TRUE(ch1.conn()->receiving());
-    EXPECT_EQ(Connection::STATE_WRITABLE, ch1.conn()->write_state());
-    EXPECT_TRUE(ch2.conn()->receiving());
-    EXPECT_EQ(Connection::STATE_WRITABLE, ch2.conn()->write_state());
-  } else {
-    EXPECT_FALSE(ch1.conn()->receiving());
-    EXPECT_NE(Connection::STATE_WRITABLE, ch1.conn()->write_state());
-    EXPECT_FALSE(ch2.conn()->receiving());
-    EXPECT_NE(Connection::STATE_WRITABLE, ch2.conn()->write_state());
-  }
-
-  // Tear down and ensure that goes smoothly.
-  ch1.Stop();
-  ch2.Stop();
-  EXPECT_TRUE_SIMULATED_WAIT(ch1.conn() == NULL, kDefaultTimeout, clock);
-  EXPECT_TRUE_SIMULATED_WAIT(ch2.conn() == NULL, kDefaultTimeout, clock);
-}
-
-class FakePacketSocketFactory : public rtc::PacketSocketFactory {
- public:
-  FakePacketSocketFactory()
-      : next_udp_socket_(NULL),
-        next_server_tcp_socket_(NULL),
-        next_client_tcp_socket_(NULL) {
-  }
-  ~FakePacketSocketFactory() override { }
-
-  AsyncPacketSocket* CreateUdpSocket(const SocketAddress& address,
-                                     uint16_t min_port,
-                                     uint16_t max_port) override {
-    EXPECT_TRUE(next_udp_socket_ != NULL);
-    AsyncPacketSocket* result = next_udp_socket_;
-    next_udp_socket_ = NULL;
-    return result;
-  }
-
-  AsyncPacketSocket* CreateServerTcpSocket(const SocketAddress& local_address,
-                                           uint16_t min_port,
-                                           uint16_t max_port,
-                                           int opts) override {
-    EXPECT_TRUE(next_server_tcp_socket_ != NULL);
-    AsyncPacketSocket* result = next_server_tcp_socket_;
-    next_server_tcp_socket_ = NULL;
-    return result;
-  }
-
-  // TODO: |proxy_info| and |user_agent| should be set
-  // per-factory and not when socket is created.
-  AsyncPacketSocket* CreateClientTcpSocket(const SocketAddress& local_address,
-                                           const SocketAddress& remote_address,
-                                           const rtc::ProxyInfo& proxy_info,
-                                           const std::string& user_agent,
-                                           int opts) override {
-    EXPECT_TRUE(next_client_tcp_socket_ != NULL);
-    AsyncPacketSocket* result = next_client_tcp_socket_;
-    next_client_tcp_socket_ = NULL;
-    return result;
-  }
-
-  void set_next_udp_socket(AsyncPacketSocket* next_udp_socket) {
-    next_udp_socket_ = next_udp_socket;
-  }
-  void set_next_server_tcp_socket(AsyncPacketSocket* next_server_tcp_socket) {
-    next_server_tcp_socket_ = next_server_tcp_socket;
-  }
-  void set_next_client_tcp_socket(AsyncPacketSocket* next_client_tcp_socket) {
-    next_client_tcp_socket_ = next_client_tcp_socket;
-  }
-  rtc::AsyncResolverInterface* CreateAsyncResolver() override {
-    return NULL;
-  }
-
- private:
-  AsyncPacketSocket* next_udp_socket_;
-  AsyncPacketSocket* next_server_tcp_socket_;
-  AsyncPacketSocket* next_client_tcp_socket_;
-};
-
-class FakeAsyncPacketSocket : public AsyncPacketSocket {
- public:
-  // Returns current local address. Address may be set to NULL if the
-  // socket is not bound yet (GetState() returns STATE_BINDING).
-  virtual SocketAddress GetLocalAddress() const {
-    return SocketAddress();
-  }
-
-  // Returns remote address. Returns zeroes if this is not a client TCP socket.
-  virtual SocketAddress GetRemoteAddress() const {
-    return SocketAddress();
-  }
-
-  // Send a packet.
-  virtual int Send(const void *pv, size_t cb,
-                   const rtc::PacketOptions& options) {
-    return static_cast<int>(cb);
-  }
-  virtual int SendTo(const void *pv, size_t cb, const SocketAddress& addr,
-                     const rtc::PacketOptions& options) {
-    return static_cast<int>(cb);
-  }
-  virtual int Close() {
-    return 0;
-  }
-
-  virtual State GetState() const { return state_; }
-  virtual int GetOption(Socket::Option opt, int* value) { return 0; }
-  virtual int SetOption(Socket::Option opt, int value) { return 0; }
-  virtual int GetError() const { return 0; }
-  virtual void SetError(int error) { }
-
-  void set_state(State state) { state_ = state; }
-
- private:
-  State state_;
-};
-
-// Local -> XXXX
-TEST_F(PortTest, TestLocalToLocal) {
-  TestLocalToLocal();
-}
-
-TEST_F(PortTest, TestLocalToConeNat) {
-  TestLocalToStun(NAT_OPEN_CONE);
-}
-
-TEST_F(PortTest, TestLocalToARNat) {
-  TestLocalToStun(NAT_ADDR_RESTRICTED);
-}
-
-TEST_F(PortTest, TestLocalToPRNat) {
-  TestLocalToStun(NAT_PORT_RESTRICTED);
-}
-
-TEST_F(PortTest, TestLocalToSymNat) {
-  TestLocalToStun(NAT_SYMMETRIC);
-}
-
-// Flaky: https://code.google.com/p/webrtc/issues/detail?id=3316.
-TEST_F(PortTest, DISABLED_TestLocalToTurn) {
-  TestLocalToRelay(RELAY_TURN, PROTO_UDP);
-}
-
-TEST_F(PortTest, TestLocalToGturn) {
-  TestLocalToRelay(RELAY_GTURN, PROTO_UDP);
-}
-
-TEST_F(PortTest, TestLocalToTcpGturn) {
-  TestLocalToRelay(RELAY_GTURN, PROTO_TCP);
-}
-
-TEST_F(PortTest, TestLocalToSslTcpGturn) {
-  TestLocalToRelay(RELAY_GTURN, PROTO_SSLTCP);
-}
-
-// Cone NAT -> XXXX
-TEST_F(PortTest, TestConeNatToLocal) {
-  TestStunToLocal(NAT_OPEN_CONE);
-}
-
-TEST_F(PortTest, TestConeNatToConeNat) {
-  TestStunToStun(NAT_OPEN_CONE, NAT_OPEN_CONE);
-}
-
-TEST_F(PortTest, TestConeNatToARNat) {
-  TestStunToStun(NAT_OPEN_CONE, NAT_ADDR_RESTRICTED);
-}
-
-TEST_F(PortTest, TestConeNatToPRNat) {
-  TestStunToStun(NAT_OPEN_CONE, NAT_PORT_RESTRICTED);
-}
-
-TEST_F(PortTest, TestConeNatToSymNat) {
-  TestStunToStun(NAT_OPEN_CONE, NAT_SYMMETRIC);
-}
-
-TEST_F(PortTest, TestConeNatToTurn) {
-  TestStunToRelay(NAT_OPEN_CONE, RELAY_TURN, PROTO_UDP);
-}
-
-TEST_F(PortTest, TestConeNatToGturn) {
-  TestStunToRelay(NAT_OPEN_CONE, RELAY_GTURN, PROTO_UDP);
-}
-
-TEST_F(PortTest, TestConeNatToTcpGturn) {
-  TestStunToRelay(NAT_OPEN_CONE, RELAY_GTURN, PROTO_TCP);
-}
-
-// Address-restricted NAT -> XXXX
-TEST_F(PortTest, TestARNatToLocal) {
-  TestStunToLocal(NAT_ADDR_RESTRICTED);
-}
-
-TEST_F(PortTest, TestARNatToConeNat) {
-  TestStunToStun(NAT_ADDR_RESTRICTED, NAT_OPEN_CONE);
-}
-
-TEST_F(PortTest, TestARNatToARNat) {
-  TestStunToStun(NAT_ADDR_RESTRICTED, NAT_ADDR_RESTRICTED);
-}
-
-TEST_F(PortTest, TestARNatToPRNat) {
-  TestStunToStun(NAT_ADDR_RESTRICTED, NAT_PORT_RESTRICTED);
-}
-
-TEST_F(PortTest, TestARNatToSymNat) {
-  TestStunToStun(NAT_ADDR_RESTRICTED, NAT_SYMMETRIC);
-}
-
-TEST_F(PortTest, TestARNatToTurn) {
-  TestStunToRelay(NAT_ADDR_RESTRICTED, RELAY_TURN, PROTO_UDP);
-}
-
-TEST_F(PortTest, TestARNatToGturn) {
-  TestStunToRelay(NAT_ADDR_RESTRICTED, RELAY_GTURN, PROTO_UDP);
-}
-
-TEST_F(PortTest, TestARNATNatToTcpGturn) {
-  TestStunToRelay(NAT_ADDR_RESTRICTED, RELAY_GTURN, PROTO_TCP);
-}
-
-// Port-restricted NAT -> XXXX
-TEST_F(PortTest, TestPRNatToLocal) {
-  TestStunToLocal(NAT_PORT_RESTRICTED);
-}
-
-TEST_F(PortTest, TestPRNatToConeNat) {
-  TestStunToStun(NAT_PORT_RESTRICTED, NAT_OPEN_CONE);
-}
-
-TEST_F(PortTest, TestPRNatToARNat) {
-  TestStunToStun(NAT_PORT_RESTRICTED, NAT_ADDR_RESTRICTED);
-}
-
-TEST_F(PortTest, TestPRNatToPRNat) {
-  TestStunToStun(NAT_PORT_RESTRICTED, NAT_PORT_RESTRICTED);
-}
-
-TEST_F(PortTest, TestPRNatToSymNat) {
-  // Will "fail"
-  TestStunToStun(NAT_PORT_RESTRICTED, NAT_SYMMETRIC);
-}
-
-TEST_F(PortTest, TestPRNatToTurn) {
-  TestStunToRelay(NAT_PORT_RESTRICTED, RELAY_TURN, PROTO_UDP);
-}
-
-TEST_F(PortTest, TestPRNatToGturn) {
-  TestStunToRelay(NAT_PORT_RESTRICTED, RELAY_GTURN, PROTO_UDP);
-}
-
-TEST_F(PortTest, TestPRNatToTcpGturn) {
-  TestStunToRelay(NAT_PORT_RESTRICTED, RELAY_GTURN, PROTO_TCP);
-}
-
-// Symmetric NAT -> XXXX
-TEST_F(PortTest, TestSymNatToLocal) {
-  TestStunToLocal(NAT_SYMMETRIC);
-}
-
-TEST_F(PortTest, TestSymNatToConeNat) {
-  TestStunToStun(NAT_SYMMETRIC, NAT_OPEN_CONE);
-}
-
-TEST_F(PortTest, TestSymNatToARNat) {
-  TestStunToStun(NAT_SYMMETRIC, NAT_ADDR_RESTRICTED);
-}
-
-TEST_F(PortTest, TestSymNatToPRNat) {
-  // Will "fail"
-  TestStunToStun(NAT_SYMMETRIC, NAT_PORT_RESTRICTED);
-}
-
-TEST_F(PortTest, TestSymNatToSymNat) {
-  // Will "fail"
-  TestStunToStun(NAT_SYMMETRIC, NAT_SYMMETRIC);
-}
-
-TEST_F(PortTest, TestSymNatToTurn) {
-  TestStunToRelay(NAT_SYMMETRIC, RELAY_TURN, PROTO_UDP);
-}
-
-TEST_F(PortTest, TestSymNatToGturn) {
-  TestStunToRelay(NAT_SYMMETRIC, RELAY_GTURN, PROTO_UDP);
-}
-
-TEST_F(PortTest, TestSymNatToTcpGturn) {
-  TestStunToRelay(NAT_SYMMETRIC, RELAY_GTURN, PROTO_TCP);
-}
-
-// Outbound TCP -> XXXX
-TEST_F(PortTest, TestTcpToTcp) {
-  TestTcpToTcp();
-}
-
-TEST_F(PortTest, TestTcpReconnectOnSendPacket) {
-  TestTcpReconnect(false /* ping */, true /* send */);
-}
-
-TEST_F(PortTest, TestTcpReconnectOnPing) {
-  TestTcpReconnect(true /* ping */, false /* send */);
-}
-
-TEST_F(PortTest, TestTcpReconnectTimeout) {
-  TestTcpReconnect(false /* ping */, false /* send */);
-}
-
-// Test when TcpConnection never connects, the OnClose() will be called to
-// destroy the connection.
-TEST_F(PortTest, TestTcpNeverConnect) {
-  Port* port1 = CreateTcpPort(kLocalAddr1);
-  port1->SetIceRole(cricket::ICEROLE_CONTROLLING);
-  port1->set_component(cricket::ICE_CANDIDATE_COMPONENT_DEFAULT);
-
-  // Set up a channel and ensure the port will be deleted.
-  TestChannel ch1(port1);
-  EXPECT_EQ(0, ch1.complete_count());
-
-  ch1.Start();
-  ASSERT_EQ_WAIT(1, ch1.complete_count(), kDefaultTimeout);
-
-  std::unique_ptr<rtc::AsyncSocket> server(
-      vss()->CreateAsyncSocket(kLocalAddr2.family(), SOCK_STREAM));
-  // Bind but not listen.
-  EXPECT_EQ(0, server->Bind(kLocalAddr2));
-
-  Candidate c = GetCandidate(port1);
-  c.set_address(server->GetLocalAddress());
-
-  ch1.CreateConnection(c);
-  EXPECT_TRUE(ch1.conn());
-  EXPECT_TRUE_WAIT(!ch1.conn(), kDefaultTimeout);  // for TCP connect
-}
-
-/* TODO: Enable these once testrelayserver can accept external TCP.
-TEST_F(PortTest, TestTcpToTcpRelay) {
-  TestTcpToRelay(PROTO_TCP);
-}
-
-TEST_F(PortTest, TestTcpToSslTcpRelay) {
-  TestTcpToRelay(PROTO_SSLTCP);
-}
-*/
-
-// Outbound SSLTCP -> XXXX
-/* TODO: Enable these once testrelayserver can accept external SSL.
-TEST_F(PortTest, TestSslTcpToTcpRelay) {
-  TestSslTcpToRelay(PROTO_TCP);
-}
-
-TEST_F(PortTest, TestSslTcpToSslTcpRelay) {
-  TestSslTcpToRelay(PROTO_SSLTCP);
-}
-*/
-
-// Test that a connection will be dead and deleted if
-// i) it has never received anything for MIN_CONNECTION_LIFETIME milliseconds
-//    since it was created, or
-// ii) it has not received anything for DEAD_CONNECTION_RECEIVE_TIMEOUT
-//     milliseconds since last receiving.
-TEST_F(PortTest, TestConnectionDead) {
-  UDPPort* port1 = CreateUdpPort(kLocalAddr1);
-  UDPPort* port2 = CreateUdpPort(kLocalAddr2);
-  TestChannel ch1(port1);
-  TestChannel ch2(port2);
-  // Acquire address.
-  ch1.Start();
-  ch2.Start();
-  ASSERT_EQ_WAIT(1, ch1.complete_count(), kDefaultTimeout);
-  ASSERT_EQ_WAIT(1, ch2.complete_count(), kDefaultTimeout);
-
-  // Test case that the connection has never received anything.
-  int64_t before_created = rtc::TimeMillis();
-  ch1.CreateConnection(GetCandidate(port2));
-  int64_t after_created = rtc::TimeMillis();
-  Connection* conn = ch1.conn();
-  ASSERT_NE(conn, nullptr);
-  // It is not dead if it is after MIN_CONNECTION_LIFETIME but not pruned.
-  conn->UpdateState(after_created + MIN_CONNECTION_LIFETIME + 1);
-  rtc::Thread::Current()->ProcessMessages(0);
-  EXPECT_TRUE(ch1.conn() != nullptr);
-  // It is not dead if it is before MIN_CONNECTION_LIFETIME and pruned.
-  conn->UpdateState(before_created + MIN_CONNECTION_LIFETIME - 1);
-  conn->Prune();
-  rtc::Thread::Current()->ProcessMessages(0);
-  EXPECT_TRUE(ch1.conn() != nullptr);
-  // It will be dead after MIN_CONNECTION_LIFETIME and pruned.
-  conn->UpdateState(after_created + MIN_CONNECTION_LIFETIME + 1);
-  EXPECT_TRUE_WAIT(ch1.conn() == nullptr, kDefaultTimeout);
-
-  // Test case that the connection has received something.
-  // Create a connection again and receive a ping.
-  ch1.CreateConnection(GetCandidate(port2));
-  conn = ch1.conn();
-  ASSERT_NE(conn, nullptr);
-  int64_t before_last_receiving = rtc::TimeMillis();
-  conn->ReceivedPing();
-  int64_t after_last_receiving = rtc::TimeMillis();
-  // The connection will be dead after DEAD_CONNECTION_RECEIVE_TIMEOUT
-  conn->UpdateState(
-      before_last_receiving + DEAD_CONNECTION_RECEIVE_TIMEOUT - 1);
-  rtc::Thread::Current()->ProcessMessages(100);
-  EXPECT_TRUE(ch1.conn() != nullptr);
-  conn->UpdateState(after_last_receiving + DEAD_CONNECTION_RECEIVE_TIMEOUT + 1);
-  EXPECT_TRUE_WAIT(ch1.conn() == nullptr, kDefaultTimeout);
-}
-
-// This test case verifies standard ICE features in STUN messages. Currently it
-// verifies Message Integrity attribute in STUN messages and username in STUN
-// binding request will have colon (":") between remote and local username.
-TEST_F(PortTest, TestLocalToLocalStandard) {
-  UDPPort* port1 = CreateUdpPort(kLocalAddr1);
-  port1->SetIceRole(cricket::ICEROLE_CONTROLLING);
-  port1->SetIceTiebreaker(kTiebreaker1);
-  UDPPort* port2 = CreateUdpPort(kLocalAddr2);
-  port2->SetIceRole(cricket::ICEROLE_CONTROLLED);
-  port2->SetIceTiebreaker(kTiebreaker2);
-  // Same parameters as TestLocalToLocal above.
-  TestConnectivity("udp", port1, "udp", port2, true, true, true, true);
-}
-
-// This test is trying to validate a successful and failure scenario in a
-// loopback test when protocol is RFC5245. For success IceTiebreaker, username
-// should remain equal to the request generated by the port and role of port
-// must be in controlling.
-TEST_F(PortTest, TestLoopbackCall) {
-  std::unique_ptr<TestPort> lport(
-      CreateTestPort(kLocalAddr1, "lfrag", "lpass"));
-  lport->SetIceRole(cricket::ICEROLE_CONTROLLING);
-  lport->SetIceTiebreaker(kTiebreaker1);
-  lport->PrepareAddress();
-  ASSERT_FALSE(lport->Candidates().empty());
-  Connection* conn = lport->CreateConnection(lport->Candidates()[0],
-                                             Port::ORIGIN_MESSAGE);
-  conn->Ping(0);
-
-  ASSERT_TRUE_WAIT(lport->last_stun_msg() != NULL, kDefaultTimeout);
-  IceMessage* msg = lport->last_stun_msg();
-  EXPECT_EQ(STUN_BINDING_REQUEST, msg->type());
-  conn->OnReadPacket(lport->last_stun_buf()->data<char>(),
-                     lport->last_stun_buf()->size(),
-                     rtc::PacketTime());
-  ASSERT_TRUE_WAIT(lport->last_stun_msg() != NULL, kDefaultTimeout);
-  msg = lport->last_stun_msg();
-  EXPECT_EQ(STUN_BINDING_RESPONSE, msg->type());
-
-  // If the tiebreaker value is different from port, we expect a error
-  // response.
-  lport->Reset();
-  lport->AddCandidateAddress(kLocalAddr2);
-  // Creating a different connection as |conn| is receiving.
-  Connection* conn1 = lport->CreateConnection(lport->Candidates()[1],
-                                              Port::ORIGIN_MESSAGE);
-  conn1->Ping(0);
-
-  ASSERT_TRUE_WAIT(lport->last_stun_msg() != NULL, kDefaultTimeout);
-  msg = lport->last_stun_msg();
-  EXPECT_EQ(STUN_BINDING_REQUEST, msg->type());
-  std::unique_ptr<IceMessage> modified_req(
-      CreateStunMessage(STUN_BINDING_REQUEST));
-  const StunByteStringAttribute* username_attr = msg->GetByteString(
-      STUN_ATTR_USERNAME);
-  modified_req->AddAttribute(rtc::MakeUnique<StunByteStringAttribute>(
-      STUN_ATTR_USERNAME, username_attr->GetString()));
-  // To make sure we receive error response, adding tiebreaker less than
-  // what's present in request.
-  modified_req->AddAttribute(rtc::MakeUnique<StunUInt64Attribute>(
-      STUN_ATTR_ICE_CONTROLLING, kTiebreaker1 - 1));
-  modified_req->AddMessageIntegrity("lpass");
-  modified_req->AddFingerprint();
-
-  lport->Reset();
-  std::unique_ptr<ByteBufferWriter> buf(new ByteBufferWriter());
-  WriteStunMessage(modified_req.get(), buf.get());
-  conn1->OnReadPacket(buf->Data(), buf->Length(), rtc::PacketTime());
-  ASSERT_TRUE_WAIT(lport->last_stun_msg() != NULL, kDefaultTimeout);
-  msg = lport->last_stun_msg();
-  EXPECT_EQ(STUN_BINDING_ERROR_RESPONSE, msg->type());
-}
-
-// This test verifies role conflict signal is received when there is
-// conflict in the role. In this case both ports are in controlling and
-// |rport| has higher tiebreaker value than |lport|. Since |lport| has lower
-// value of tiebreaker, when it receives ping request from |rport| it will
-// send role conflict signal.
-TEST_F(PortTest, TestIceRoleConflict) {
-  std::unique_ptr<TestPort> lport(
-      CreateTestPort(kLocalAddr1, "lfrag", "lpass"));
-  lport->SetIceRole(cricket::ICEROLE_CONTROLLING);
-  lport->SetIceTiebreaker(kTiebreaker1);
-  std::unique_ptr<TestPort> rport(
-      CreateTestPort(kLocalAddr2, "rfrag", "rpass"));
-  rport->SetIceRole(cricket::ICEROLE_CONTROLLING);
-  rport->SetIceTiebreaker(kTiebreaker2);
-
-  lport->PrepareAddress();
-  rport->PrepareAddress();
-  ASSERT_FALSE(lport->Candidates().empty());
-  ASSERT_FALSE(rport->Candidates().empty());
-  Connection* lconn = lport->CreateConnection(rport->Candidates()[0],
-                                              Port::ORIGIN_MESSAGE);
-  Connection* rconn = rport->CreateConnection(lport->Candidates()[0],
-                                              Port::ORIGIN_MESSAGE);
-  rconn->Ping(0);
-
-  ASSERT_TRUE_WAIT(rport->last_stun_msg() != NULL, kDefaultTimeout);
-  IceMessage* msg = rport->last_stun_msg();
-  EXPECT_EQ(STUN_BINDING_REQUEST, msg->type());
-  // Send rport binding request to lport.
-  lconn->OnReadPacket(rport->last_stun_buf()->data<char>(),
-                      rport->last_stun_buf()->size(),
-                      rtc::PacketTime());
-
-  ASSERT_TRUE_WAIT(lport->last_stun_msg() != NULL, kDefaultTimeout);
-  EXPECT_EQ(STUN_BINDING_RESPONSE, lport->last_stun_msg()->type());
-  EXPECT_TRUE(role_conflict());
-}
-
-TEST_F(PortTest, TestTcpNoDelay) {
-  TCPPort* port1 = CreateTcpPort(kLocalAddr1);
-  port1->SetIceRole(cricket::ICEROLE_CONTROLLING);
-  int option_value = -1;
-  int success = port1->GetOption(rtc::Socket::OPT_NODELAY,
-                                 &option_value);
-  ASSERT_EQ(0, success);  // GetOption() should complete successfully w/ 0
-  ASSERT_EQ(1, option_value);
-  delete port1;
-}
-
-TEST_F(PortTest, TestDelayedBindingUdp) {
-  FakeAsyncPacketSocket *socket = new FakeAsyncPacketSocket();
-  FakePacketSocketFactory socket_factory;
-
-  socket_factory.set_next_udp_socket(socket);
-  std::unique_ptr<UDPPort> port(CreateUdpPort(kLocalAddr1, &socket_factory));
-
-  socket->set_state(AsyncPacketSocket::STATE_BINDING);
-  port->PrepareAddress();
-
-  EXPECT_EQ(0U, port->Candidates().size());
-  socket->SignalAddressReady(socket, kLocalAddr2);
-
-  EXPECT_EQ(1U, port->Candidates().size());
-}
-
-TEST_F(PortTest, TestDelayedBindingTcp) {
-  FakeAsyncPacketSocket *socket = new FakeAsyncPacketSocket();
-  FakePacketSocketFactory socket_factory;
-
-  socket_factory.set_next_server_tcp_socket(socket);
-  std::unique_ptr<TCPPort> port(CreateTcpPort(kLocalAddr1, &socket_factory));
-
-  socket->set_state(AsyncPacketSocket::STATE_BINDING);
-  port->PrepareAddress();
-
-  EXPECT_EQ(0U, port->Candidates().size());
-  socket->SignalAddressReady(socket, kLocalAddr2);
-
-  EXPECT_EQ(1U, port->Candidates().size());
-}
-
-void PortTest::TestCrossFamilyPorts(int type) {
-  FakePacketSocketFactory factory;
-  std::unique_ptr<Port> ports[4];
-  SocketAddress addresses[4] = {SocketAddress("192.168.1.3", 0),
-                                SocketAddress("192.168.1.4", 0),
-                                SocketAddress("2001:db8::1", 0),
-                                SocketAddress("2001:db8::2", 0)};
-  for (int i = 0; i < 4; i++) {
-    FakeAsyncPacketSocket *socket = new FakeAsyncPacketSocket();
-    if (type == SOCK_DGRAM) {
-      factory.set_next_udp_socket(socket);
-      ports[i].reset(CreateUdpPort(addresses[i], &factory));
-    } else if (type == SOCK_STREAM) {
-      factory.set_next_server_tcp_socket(socket);
-      ports[i].reset(CreateTcpPort(addresses[i], &factory));
-    }
-    socket->set_state(AsyncPacketSocket::STATE_BINDING);
-    socket->SignalAddressReady(socket, addresses[i]);
-    ports[i]->PrepareAddress();
-  }
-
-  // IPv4 Port, connects to IPv6 candidate and then to IPv4 candidate.
-  if (type == SOCK_STREAM) {
-    FakeAsyncPacketSocket* clientsocket = new FakeAsyncPacketSocket();
-    factory.set_next_client_tcp_socket(clientsocket);
-  }
-  Connection* c = ports[0]->CreateConnection(GetCandidate(ports[2].get()),
-                                             Port::ORIGIN_MESSAGE);
-  EXPECT_TRUE(NULL == c);
-  EXPECT_EQ(0U, ports[0]->connections().size());
-  c = ports[0]->CreateConnection(GetCandidate(ports[1].get()),
-                                 Port::ORIGIN_MESSAGE);
-  EXPECT_FALSE(NULL == c);
-  EXPECT_EQ(1U, ports[0]->connections().size());
-
-  // IPv6 Port, connects to IPv4 candidate and to IPv6 candidate.
-  if (type == SOCK_STREAM) {
-    FakeAsyncPacketSocket* clientsocket = new FakeAsyncPacketSocket();
-    factory.set_next_client_tcp_socket(clientsocket);
-  }
-  c = ports[2]->CreateConnection(GetCandidate(ports[0].get()),
-                                 Port::ORIGIN_MESSAGE);
-  EXPECT_TRUE(NULL == c);
-  EXPECT_EQ(0U, ports[2]->connections().size());
-  c = ports[2]->CreateConnection(GetCandidate(ports[3].get()),
-                                 Port::ORIGIN_MESSAGE);
-  EXPECT_FALSE(NULL == c);
-  EXPECT_EQ(1U, ports[2]->connections().size());
-}
-
-TEST_F(PortTest, TestSkipCrossFamilyTcp) {
-  TestCrossFamilyPorts(SOCK_STREAM);
-}
-
-TEST_F(PortTest, TestSkipCrossFamilyUdp) {
-  TestCrossFamilyPorts(SOCK_DGRAM);
-}
-
-void PortTest::ExpectPortsCanConnect(bool can_connect, Port* p1, Port* p2) {
-  Connection* c = p1->CreateConnection(GetCandidate(p2),
-                                       Port::ORIGIN_MESSAGE);
-  if (can_connect) {
-    EXPECT_FALSE(NULL == c);
-    EXPECT_EQ(1U, p1->connections().size());
-  } else {
-    EXPECT_TRUE(NULL == c);
-    EXPECT_EQ(0U, p1->connections().size());
-  }
-}
-
-TEST_F(PortTest, TestUdpV6CrossTypePorts) {
-  FakePacketSocketFactory factory;
-  std::unique_ptr<Port> ports[4];
-  SocketAddress addresses[4] = {SocketAddress("2001:db8::1", 0),
-                                SocketAddress("fe80::1", 0),
-                                SocketAddress("fe80::2", 0),
-                                SocketAddress("::1", 0)};
-  for (int i = 0; i < 4; i++) {
-    FakeAsyncPacketSocket *socket = new FakeAsyncPacketSocket();
-    factory.set_next_udp_socket(socket);
-    ports[i].reset(CreateUdpPort(addresses[i], &factory));
-    socket->set_state(AsyncPacketSocket::STATE_BINDING);
-    socket->SignalAddressReady(socket, addresses[i]);
-    ports[i]->PrepareAddress();
-  }
-
-  Port* standard = ports[0].get();
-  Port* link_local1 = ports[1].get();
-  Port* link_local2 = ports[2].get();
-  Port* localhost = ports[3].get();
-
-  ExpectPortsCanConnect(false, link_local1, standard);
-  ExpectPortsCanConnect(false, standard, link_local1);
-  ExpectPortsCanConnect(false, link_local1, localhost);
-  ExpectPortsCanConnect(false, localhost, link_local1);
-
-  ExpectPortsCanConnect(true, link_local1, link_local2);
-  ExpectPortsCanConnect(true, localhost, standard);
-  ExpectPortsCanConnect(true, standard, localhost);
-}
-
-// This test verifies DSCP value set through SetOption interface can be
-// get through DefaultDscpValue.
-TEST_F(PortTest, TestDefaultDscpValue) {
-  int dscp;
-  std::unique_ptr<UDPPort> udpport(CreateUdpPort(kLocalAddr1));
-  EXPECT_EQ(0, udpport->SetOption(rtc::Socket::OPT_DSCP,
-                                  rtc::DSCP_CS6));
-  EXPECT_EQ(0, udpport->GetOption(rtc::Socket::OPT_DSCP, &dscp));
-  std::unique_ptr<TCPPort> tcpport(CreateTcpPort(kLocalAddr1));
-  EXPECT_EQ(0, tcpport->SetOption(rtc::Socket::OPT_DSCP,
-                                 rtc::DSCP_AF31));
-  EXPECT_EQ(0, tcpport->GetOption(rtc::Socket::OPT_DSCP, &dscp));
-  EXPECT_EQ(rtc::DSCP_AF31, dscp);
-  std::unique_ptr<StunPort> stunport(
-      CreateStunPort(kLocalAddr1, nat_socket_factory1()));
-  EXPECT_EQ(0, stunport->SetOption(rtc::Socket::OPT_DSCP,
-                                  rtc::DSCP_AF41));
-  EXPECT_EQ(0, stunport->GetOption(rtc::Socket::OPT_DSCP, &dscp));
-  EXPECT_EQ(rtc::DSCP_AF41, dscp);
-  std::unique_ptr<TurnPort> turnport1(
-      CreateTurnPort(kLocalAddr1, nat_socket_factory1(), PROTO_UDP, PROTO_UDP));
-  // Socket is created in PrepareAddress.
-  turnport1->PrepareAddress();
-  EXPECT_EQ(0, turnport1->SetOption(rtc::Socket::OPT_DSCP,
-                                  rtc::DSCP_CS7));
-  EXPECT_EQ(0, turnport1->GetOption(rtc::Socket::OPT_DSCP, &dscp));
-  EXPECT_EQ(rtc::DSCP_CS7, dscp);
-  // This will verify correct value returned without the socket.
-  std::unique_ptr<TurnPort> turnport2(
-      CreateTurnPort(kLocalAddr1, nat_socket_factory1(), PROTO_UDP, PROTO_UDP));
-  EXPECT_EQ(0, turnport2->SetOption(rtc::Socket::OPT_DSCP,
-                                  rtc::DSCP_CS6));
-  EXPECT_EQ(0, turnport2->GetOption(rtc::Socket::OPT_DSCP, &dscp));
-  EXPECT_EQ(rtc::DSCP_CS6, dscp);
-}
-
-// Test sending STUN messages.
-TEST_F(PortTest, TestSendStunMessage) {
-  std::unique_ptr<TestPort> lport(
-      CreateTestPort(kLocalAddr1, "lfrag", "lpass"));
-  std::unique_ptr<TestPort> rport(
-      CreateTestPort(kLocalAddr2, "rfrag", "rpass"));
-  lport->SetIceRole(cricket::ICEROLE_CONTROLLING);
-  lport->SetIceTiebreaker(kTiebreaker1);
-  rport->SetIceRole(cricket::ICEROLE_CONTROLLED);
-  rport->SetIceTiebreaker(kTiebreaker2);
-
-  // Send a fake ping from lport to rport.
-  lport->PrepareAddress();
-  rport->PrepareAddress();
-  ASSERT_FALSE(rport->Candidates().empty());
-  Connection* lconn = lport->CreateConnection(
-      rport->Candidates()[0], Port::ORIGIN_MESSAGE);
-  Connection* rconn = rport->CreateConnection(
-      lport->Candidates()[0], Port::ORIGIN_MESSAGE);
-  lconn->Ping(0);
-
-  // Check that it's a proper BINDING-REQUEST.
-  ASSERT_TRUE_WAIT(lport->last_stun_msg() != NULL, kDefaultTimeout);
-  IceMessage* msg = lport->last_stun_msg();
-  EXPECT_EQ(STUN_BINDING_REQUEST, msg->type());
-  EXPECT_FALSE(msg->IsLegacy());
-  const StunByteStringAttribute* username_attr =
-      msg->GetByteString(STUN_ATTR_USERNAME);
-  ASSERT_TRUE(username_attr != NULL);
-  const StunUInt32Attribute* priority_attr = msg->GetUInt32(STUN_ATTR_PRIORITY);
-  ASSERT_TRUE(priority_attr != NULL);
-  EXPECT_EQ(kDefaultPrflxPriority, priority_attr->value());
-  EXPECT_EQ("rfrag:lfrag", username_attr->GetString());
-  EXPECT_TRUE(msg->GetByteString(STUN_ATTR_MESSAGE_INTEGRITY) != NULL);
-  EXPECT_TRUE(StunMessage::ValidateMessageIntegrity(
-      lport->last_stun_buf()->data<char>(), lport->last_stun_buf()->size(),
-      "rpass"));
-  const StunUInt64Attribute* ice_controlling_attr =
-      msg->GetUInt64(STUN_ATTR_ICE_CONTROLLING);
-  ASSERT_TRUE(ice_controlling_attr != NULL);
-  EXPECT_EQ(lport->IceTiebreaker(), ice_controlling_attr->value());
-  EXPECT_TRUE(msg->GetByteString(STUN_ATTR_ICE_CONTROLLED) == NULL);
-  EXPECT_TRUE(msg->GetByteString(STUN_ATTR_USE_CANDIDATE) != NULL);
-  EXPECT_TRUE(msg->GetUInt32(STUN_ATTR_FINGERPRINT) != NULL);
-  EXPECT_TRUE(StunMessage::ValidateFingerprint(
-      lport->last_stun_buf()->data<char>(), lport->last_stun_buf()->size()));
-
-  // Request should not include ping count.
-  ASSERT_TRUE(msg->GetUInt32(STUN_ATTR_RETRANSMIT_COUNT) == NULL);
-
-  // Save a copy of the BINDING-REQUEST for use below.
-  std::unique_ptr<IceMessage> request(CopyStunMessage(msg));
-
-  // Receive the BINDING-REQUEST and respond with BINDING-RESPONSE.
-  rconn->OnReadPacket(lport->last_stun_buf()->data<char>(),
-                      lport->last_stun_buf()->size(), rtc::PacketTime());
-  msg = rport->last_stun_msg();
-  ASSERT_TRUE(msg != NULL);
-  EXPECT_EQ(STUN_BINDING_RESPONSE, msg->type());
-  // Received a BINDING-RESPONSE.
-  lconn->OnReadPacket(rport->last_stun_buf()->data<char>(),
-                      rport->last_stun_buf()->size(), rtc::PacketTime());
-  // Verify the STUN Stats.
-  EXPECT_EQ(1U, lconn->stats().sent_ping_requests_total);
-  EXPECT_EQ(1U, lconn->stats().sent_ping_requests_before_first_response);
-  EXPECT_EQ(1U, lconn->stats().recv_ping_responses);
-  EXPECT_EQ(1U, rconn->stats().recv_ping_requests);
-  EXPECT_EQ(1U, rconn->stats().sent_ping_responses);
-
-  EXPECT_FALSE(msg->IsLegacy());
-  const StunAddressAttribute* addr_attr = msg->GetAddress(
-      STUN_ATTR_XOR_MAPPED_ADDRESS);
-  ASSERT_TRUE(addr_attr != NULL);
-  EXPECT_EQ(lport->Candidates()[0].address(), addr_attr->GetAddress());
-  EXPECT_TRUE(msg->GetByteString(STUN_ATTR_MESSAGE_INTEGRITY) != NULL);
-  EXPECT_TRUE(StunMessage::ValidateMessageIntegrity(
-      rport->last_stun_buf()->data<char>(), rport->last_stun_buf()->size(),
-      "rpass"));
-  EXPECT_TRUE(msg->GetUInt32(STUN_ATTR_FINGERPRINT) != NULL);
-  EXPECT_TRUE(StunMessage::ValidateFingerprint(
-      lport->last_stun_buf()->data<char>(), lport->last_stun_buf()->size()));
-  // No USERNAME or PRIORITY in ICE responses.
-  EXPECT_TRUE(msg->GetByteString(STUN_ATTR_USERNAME) == NULL);
-  EXPECT_TRUE(msg->GetByteString(STUN_ATTR_PRIORITY) == NULL);
-  EXPECT_TRUE(msg->GetByteString(STUN_ATTR_MAPPED_ADDRESS) == NULL);
-  EXPECT_TRUE(msg->GetByteString(STUN_ATTR_ICE_CONTROLLING) == NULL);
-  EXPECT_TRUE(msg->GetByteString(STUN_ATTR_ICE_CONTROLLED) == NULL);
-  EXPECT_TRUE(msg->GetByteString(STUN_ATTR_USE_CANDIDATE) == NULL);
-
-  // Response should not include ping count.
-  ASSERT_TRUE(msg->GetUInt32(STUN_ATTR_RETRANSMIT_COUNT) == NULL);
-
-  // Respond with a BINDING-ERROR-RESPONSE. This wouldn't happen in real life,
-  // but we can do it here.
-  rport->SendBindingErrorResponse(request.get(),
-                                  lport->Candidates()[0].address(),
-                                  STUN_ERROR_SERVER_ERROR,
-                                  STUN_ERROR_REASON_SERVER_ERROR);
-  msg = rport->last_stun_msg();
-  ASSERT_TRUE(msg != NULL);
-  EXPECT_EQ(STUN_BINDING_ERROR_RESPONSE, msg->type());
-  EXPECT_FALSE(msg->IsLegacy());
-  const StunErrorCodeAttribute* error_attr = msg->GetErrorCode();
-  ASSERT_TRUE(error_attr != NULL);
-  EXPECT_EQ(STUN_ERROR_SERVER_ERROR, error_attr->code());
-  EXPECT_EQ(std::string(STUN_ERROR_REASON_SERVER_ERROR), error_attr->reason());
-  EXPECT_TRUE(msg->GetByteString(STUN_ATTR_MESSAGE_INTEGRITY) != NULL);
-  EXPECT_TRUE(StunMessage::ValidateMessageIntegrity(
-      rport->last_stun_buf()->data<char>(), rport->last_stun_buf()->size(),
-      "rpass"));
-  EXPECT_TRUE(msg->GetUInt32(STUN_ATTR_FINGERPRINT) != NULL);
-  EXPECT_TRUE(StunMessage::ValidateFingerprint(
-      lport->last_stun_buf()->data<char>(), lport->last_stun_buf()->size()));
-  // No USERNAME with ICE.
-  EXPECT_TRUE(msg->GetByteString(STUN_ATTR_USERNAME) == NULL);
-  EXPECT_TRUE(msg->GetByteString(STUN_ATTR_PRIORITY) == NULL);
-
-  // Testing STUN binding requests from rport --> lport, having ICE_CONTROLLED
-  // and (incremented) RETRANSMIT_COUNT attributes.
-  rport->Reset();
-  rport->set_send_retransmit_count_attribute(true);
-  rconn->Ping(0);
-  rconn->Ping(0);
-  rconn->Ping(0);
-  ASSERT_TRUE_WAIT(rport->last_stun_msg() != NULL, kDefaultTimeout);
-  msg = rport->last_stun_msg();
-  EXPECT_EQ(STUN_BINDING_REQUEST, msg->type());
-  const StunUInt64Attribute* ice_controlled_attr =
-      msg->GetUInt64(STUN_ATTR_ICE_CONTROLLED);
-  ASSERT_TRUE(ice_controlled_attr != NULL);
-  EXPECT_EQ(rport->IceTiebreaker(), ice_controlled_attr->value());
-  EXPECT_TRUE(msg->GetByteString(STUN_ATTR_USE_CANDIDATE) == NULL);
-
-  // Request should include ping count.
-  const StunUInt32Attribute* retransmit_attr =
-      msg->GetUInt32(STUN_ATTR_RETRANSMIT_COUNT);
-  ASSERT_TRUE(retransmit_attr != NULL);
-  EXPECT_EQ(2U, retransmit_attr->value());
-
-  // Respond with a BINDING-RESPONSE.
-  request.reset(CopyStunMessage(msg));
-  lconn->OnReadPacket(rport->last_stun_buf()->data<char>(),
-                      rport->last_stun_buf()->size(), rtc::PacketTime());
-  msg = lport->last_stun_msg();
-  // Receive the BINDING-RESPONSE.
-  rconn->OnReadPacket(lport->last_stun_buf()->data<char>(),
-                      lport->last_stun_buf()->size(), rtc::PacketTime());
-
-  // Verify the Stun ping stats.
-  EXPECT_EQ(3U, rconn->stats().sent_ping_requests_total);
-  EXPECT_EQ(3U, rconn->stats().sent_ping_requests_before_first_response);
-  EXPECT_EQ(1U, rconn->stats().recv_ping_responses);
-  EXPECT_EQ(1U, lconn->stats().sent_ping_responses);
-  EXPECT_EQ(1U, lconn->stats().recv_ping_requests);
-  // Ping after receiver the first response
-  rconn->Ping(0);
-  rconn->Ping(0);
-  EXPECT_EQ(5U, rconn->stats().sent_ping_requests_total);
-  EXPECT_EQ(3U, rconn->stats().sent_ping_requests_before_first_response);
-
-  // Response should include same ping count.
-  retransmit_attr = msg->GetUInt32(STUN_ATTR_RETRANSMIT_COUNT);
-  ASSERT_TRUE(retransmit_attr != NULL);
-  EXPECT_EQ(2U, retransmit_attr->value());
-}
-
-TEST_F(PortTest, TestNomination) {
-  std::unique_ptr<TestPort> lport(
-      CreateTestPort(kLocalAddr1, "lfrag", "lpass"));
-  std::unique_ptr<TestPort> rport(
-      CreateTestPort(kLocalAddr2, "rfrag", "rpass"));
-  lport->SetIceRole(cricket::ICEROLE_CONTROLLING);
-  lport->SetIceTiebreaker(kTiebreaker1);
-  rport->SetIceRole(cricket::ICEROLE_CONTROLLED);
-  rport->SetIceTiebreaker(kTiebreaker2);
-
-  lport->PrepareAddress();
-  rport->PrepareAddress();
-  ASSERT_FALSE(lport->Candidates().empty());
-  ASSERT_FALSE(rport->Candidates().empty());
-  Connection* lconn = lport->CreateConnection(rport->Candidates()[0],
-                                              Port::ORIGIN_MESSAGE);
-  Connection* rconn = rport->CreateConnection(lport->Candidates()[0],
-                                              Port::ORIGIN_MESSAGE);
-
-  // |lconn| is controlling, |rconn| is controlled.
-  uint32_t nomination = 1234;
-  lconn->set_nomination(nomination);
-
-  EXPECT_FALSE(lconn->nominated());
-  EXPECT_FALSE(rconn->nominated());
-  EXPECT_EQ(lconn->nominated(), lconn->stats().nominated);
-  EXPECT_EQ(rconn->nominated(), rconn->stats().nominated);
-
-  // Send ping (including the nomination value) from |lconn| to |rconn|. This
-  // should set the remote nomination of |rconn|.
-  lconn->Ping(0);
-  ASSERT_TRUE_WAIT(lport->last_stun_msg(), kDefaultTimeout);
-  ASSERT_TRUE(lport->last_stun_buf());
-  rconn->OnReadPacket(lport->last_stun_buf()->data<char>(),
-                      lport->last_stun_buf()->size(),
-                      rtc::PacketTime());
-  EXPECT_EQ(nomination, rconn->remote_nomination());
-  EXPECT_FALSE(lconn->nominated());
-  EXPECT_TRUE(rconn->nominated());
-  EXPECT_EQ(lconn->nominated(), lconn->stats().nominated);
-  EXPECT_EQ(rconn->nominated(), rconn->stats().nominated);
-
-  // This should result in an acknowledgment sent back from |rconn| to |lconn|,
-  // updating the acknowledged nomination of |lconn|.
-  ASSERT_TRUE_WAIT(rport->last_stun_msg(), kDefaultTimeout);
-  ASSERT_TRUE(rport->last_stun_buf());
-  lconn->OnReadPacket(rport->last_stun_buf()->data<char>(),
-                      rport->last_stun_buf()->size(),
-                      rtc::PacketTime());
-  EXPECT_EQ(nomination, lconn->acked_nomination());
-  EXPECT_TRUE(lconn->nominated());
-  EXPECT_TRUE(rconn->nominated());
-  EXPECT_EQ(lconn->nominated(), lconn->stats().nominated);
-  EXPECT_EQ(rconn->nominated(), rconn->stats().nominated);
-}
-
-TEST_F(PortTest, TestRoundTripTime) {
-  rtc::ScopedFakeClock clock;
-
-  std::unique_ptr<TestPort> lport(
-      CreateTestPort(kLocalAddr1, "lfrag", "lpass"));
-  std::unique_ptr<TestPort> rport(
-      CreateTestPort(kLocalAddr2, "rfrag", "rpass"));
-  lport->SetIceRole(cricket::ICEROLE_CONTROLLING);
-  lport->SetIceTiebreaker(kTiebreaker1);
-  rport->SetIceRole(cricket::ICEROLE_CONTROLLED);
-  rport->SetIceTiebreaker(kTiebreaker2);
-
-  lport->PrepareAddress();
-  rport->PrepareAddress();
-  ASSERT_FALSE(lport->Candidates().empty());
-  ASSERT_FALSE(rport->Candidates().empty());
-  Connection* lconn = lport->CreateConnection(rport->Candidates()[0],
-                                              Port::ORIGIN_MESSAGE);
-  Connection* rconn = rport->CreateConnection(lport->Candidates()[0],
-                                              Port::ORIGIN_MESSAGE);
-
-  EXPECT_EQ(0u, lconn->stats().total_round_trip_time_ms);
-  EXPECT_FALSE(lconn->stats().current_round_trip_time_ms);
-
-  SendPingAndReceiveResponse(
-      lconn, lport.get(), rconn, rport.get(), &clock, 10);
-  EXPECT_EQ(10u, lconn->stats().total_round_trip_time_ms);
-  ASSERT_TRUE(lconn->stats().current_round_trip_time_ms);
-  EXPECT_EQ(10u, *lconn->stats().current_round_trip_time_ms);
-
-  SendPingAndReceiveResponse(
-      lconn, lport.get(), rconn, rport.get(), &clock, 20);
-  EXPECT_EQ(30u, lconn->stats().total_round_trip_time_ms);
-  ASSERT_TRUE(lconn->stats().current_round_trip_time_ms);
-  EXPECT_EQ(20u, *lconn->stats().current_round_trip_time_ms);
-
-  SendPingAndReceiveResponse(
-      lconn, lport.get(), rconn, rport.get(), &clock, 30);
-  EXPECT_EQ(60u, lconn->stats().total_round_trip_time_ms);
-  ASSERT_TRUE(lconn->stats().current_round_trip_time_ms);
-  EXPECT_EQ(30u, *lconn->stats().current_round_trip_time_ms);
-}
-
-TEST_F(PortTest, TestUseCandidateAttribute) {
-  std::unique_ptr<TestPort> lport(
-      CreateTestPort(kLocalAddr1, "lfrag", "lpass"));
-  std::unique_ptr<TestPort> rport(
-      CreateTestPort(kLocalAddr2, "rfrag", "rpass"));
-  lport->SetIceRole(cricket::ICEROLE_CONTROLLING);
-  lport->SetIceTiebreaker(kTiebreaker1);
-  rport->SetIceRole(cricket::ICEROLE_CONTROLLED);
-  rport->SetIceTiebreaker(kTiebreaker2);
-
-  // Send a fake ping from lport to rport.
-  lport->PrepareAddress();
-  rport->PrepareAddress();
-  ASSERT_FALSE(rport->Candidates().empty());
-  Connection* lconn = lport->CreateConnection(
-      rport->Candidates()[0], Port::ORIGIN_MESSAGE);
-  lconn->Ping(0);
-  ASSERT_TRUE_WAIT(lport->last_stun_msg() != NULL, kDefaultTimeout);
-  IceMessage* msg = lport->last_stun_msg();
-  const StunUInt64Attribute* ice_controlling_attr =
-      msg->GetUInt64(STUN_ATTR_ICE_CONTROLLING);
-  ASSERT_TRUE(ice_controlling_attr != NULL);
-  const StunByteStringAttribute* use_candidate_attr = msg->GetByteString(
-      STUN_ATTR_USE_CANDIDATE);
-  ASSERT_TRUE(use_candidate_attr != NULL);
-}
-
-// Tests that when the network type changes, the network cost of the port will
-// change, the network cost of the local candidates will change. Also tests that
-// the remote network costs are updated with the stun binding requests.
-TEST_F(PortTest, TestNetworkCostChange) {
-  rtc::Network* test_network = MakeNetwork(kLocalAddr1);
-  std::unique_ptr<TestPort> lport(
-      CreateTestPort(test_network, "lfrag", "lpass"));
-  std::unique_ptr<TestPort> rport(
-      CreateTestPort(test_network, "rfrag", "rpass"));
-  lport->SetIceRole(cricket::ICEROLE_CONTROLLING);
-  lport->SetIceTiebreaker(kTiebreaker1);
-  rport->SetIceRole(cricket::ICEROLE_CONTROLLED);
-  rport->SetIceTiebreaker(kTiebreaker2);
-  lport->PrepareAddress();
-  rport->PrepareAddress();
-
-  // Default local port cost is rtc::kNetworkCostUnknown.
-  EXPECT_EQ(rtc::kNetworkCostUnknown, lport->network_cost());
-  ASSERT_TRUE(!lport->Candidates().empty());
-  for (const cricket::Candidate& candidate : lport->Candidates()) {
-    EXPECT_EQ(rtc::kNetworkCostUnknown, candidate.network_cost());
-  }
-
-  // Change the network type to wifi.
-  test_network->set_type(rtc::ADAPTER_TYPE_WIFI);
-  EXPECT_EQ(rtc::kNetworkCostLow, lport->network_cost());
-  for (const cricket::Candidate& candidate : lport->Candidates()) {
-    EXPECT_EQ(rtc::kNetworkCostLow, candidate.network_cost());
-  }
-
-  // Add a connection and then change the network type.
-  Connection* lconn =
-      lport->CreateConnection(rport->Candidates()[0], Port::ORIGIN_MESSAGE);
-  // Change the network type to cellular.
-  test_network->set_type(rtc::ADAPTER_TYPE_CELLULAR);
-  EXPECT_EQ(rtc::kNetworkCostHigh, lport->network_cost());
-  for (const cricket::Candidate& candidate : lport->Candidates()) {
-    EXPECT_EQ(rtc::kNetworkCostHigh, candidate.network_cost());
-  }
-
-  test_network->set_type(rtc::ADAPTER_TYPE_WIFI);
-  Connection* rconn =
-      rport->CreateConnection(lport->Candidates()[0], Port::ORIGIN_MESSAGE);
-  test_network->set_type(rtc::ADAPTER_TYPE_CELLULAR);
-  lconn->Ping(0);
-  // The rconn's remote candidate cost is rtc::kNetworkCostLow, but the ping
-  // contains an attribute of network cost of rtc::kNetworkCostHigh. Once the
-  // message is handled in rconn, The rconn's remote candidate will have cost
-  // rtc::kNetworkCostHigh;
-  EXPECT_EQ(rtc::kNetworkCostLow, rconn->remote_candidate().network_cost());
-  ASSERT_TRUE_WAIT(lport->last_stun_msg() != NULL, kDefaultTimeout);
-  IceMessage* msg = lport->last_stun_msg();
-  EXPECT_EQ(STUN_BINDING_REQUEST, msg->type());
-  // Pass the binding request to rport.
-  rconn->OnReadPacket(lport->last_stun_buf()->data<char>(),
-                      lport->last_stun_buf()->size(), rtc::PacketTime());
-  // Wait until rport sends the response and then check the remote network cost.
-  ASSERT_TRUE_WAIT(rport->last_stun_msg() != NULL, kDefaultTimeout);
-  EXPECT_EQ(rtc::kNetworkCostHigh, rconn->remote_candidate().network_cost());
-}
-
-TEST_F(PortTest, TestNetworkInfoAttribute) {
-  rtc::Network* test_network = MakeNetwork(kLocalAddr1);
-  std::unique_ptr<TestPort> lport(
-      CreateTestPort(test_network, "lfrag", "lpass"));
-  std::unique_ptr<TestPort> rport(
-      CreateTestPort(test_network, "rfrag", "rpass"));
-  lport->SetIceRole(cricket::ICEROLE_CONTROLLING);
-  lport->SetIceTiebreaker(kTiebreaker1);
-  rport->SetIceRole(cricket::ICEROLE_CONTROLLED);
-  rport->SetIceTiebreaker(kTiebreaker2);
-
-  uint16_t lnetwork_id = 9;
-  lport->Network()->set_id(lnetwork_id);
-  // Send a fake ping from lport to rport.
-  lport->PrepareAddress();
-  rport->PrepareAddress();
-  Connection* lconn =
-      lport->CreateConnection(rport->Candidates()[0], Port::ORIGIN_MESSAGE);
-  lconn->Ping(0);
-  ASSERT_TRUE_WAIT(lport->last_stun_msg() != NULL, kDefaultTimeout);
-  IceMessage* msg = lport->last_stun_msg();
-  const StunUInt32Attribute* network_info_attr =
-      msg->GetUInt32(STUN_ATTR_NETWORK_INFO);
-  ASSERT_TRUE(network_info_attr != NULL);
-  uint32_t network_info = network_info_attr->value();
-  EXPECT_EQ(lnetwork_id, network_info >> 16);
-  // Default network has unknown type and cost kNetworkCostUnknown.
-  EXPECT_EQ(rtc::kNetworkCostUnknown, network_info & 0xFFFF);
-
-  // Set the network type to be cellular so its cost will be kNetworkCostHigh.
-  // Send a fake ping from rport to lport.
-  test_network->set_type(rtc::ADAPTER_TYPE_CELLULAR);
-  uint16_t rnetwork_id = 8;
-  rport->Network()->set_id(rnetwork_id);
-  Connection* rconn =
-      rport->CreateConnection(lport->Candidates()[0], Port::ORIGIN_MESSAGE);
-  rconn->Ping(0);
-  ASSERT_TRUE_WAIT(rport->last_stun_msg() != NULL, kDefaultTimeout);
-  msg = rport->last_stun_msg();
-  network_info_attr = msg->GetUInt32(STUN_ATTR_NETWORK_INFO);
-  ASSERT_TRUE(network_info_attr != NULL);
-  network_info = network_info_attr->value();
-  EXPECT_EQ(rnetwork_id, network_info >> 16);
-  EXPECT_EQ(rtc::kNetworkCostHigh, network_info & 0xFFFF);
-}
-
-// Test handling STUN messages.
-TEST_F(PortTest, TestHandleStunMessage) {
-  // Our port will act as the "remote" port.
-  std::unique_ptr<TestPort> port(CreateTestPort(kLocalAddr2, "rfrag", "rpass"));
-
-  std::unique_ptr<IceMessage> in_msg, out_msg;
-  std::unique_ptr<ByteBufferWriter> buf(new ByteBufferWriter());
-  rtc::SocketAddress addr(kLocalAddr1);
-  std::string username;
-
-  // BINDING-REQUEST from local to remote with valid ICE username,
-  // MESSAGE-INTEGRITY, and FINGERPRINT.
-  in_msg.reset(CreateStunMessageWithUsername(STUN_BINDING_REQUEST,
-                                             "rfrag:lfrag"));
-  in_msg->AddMessageIntegrity("rpass");
-  in_msg->AddFingerprint();
-  WriteStunMessage(in_msg.get(), buf.get());
-  EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr, &out_msg,
-                                   &username));
-  EXPECT_TRUE(out_msg.get() != NULL);
-  EXPECT_EQ("lfrag", username);
-
-  // BINDING-RESPONSE without username, with MESSAGE-INTEGRITY and FINGERPRINT.
-  in_msg.reset(CreateStunMessage(STUN_BINDING_RESPONSE));
-  in_msg->AddAttribute(rtc::MakeUnique<StunXorAddressAttribute>(
-      STUN_ATTR_XOR_MAPPED_ADDRESS, kLocalAddr2));
-  in_msg->AddMessageIntegrity("rpass");
-  in_msg->AddFingerprint();
-  WriteStunMessage(in_msg.get(), buf.get());
-  EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr, &out_msg,
-                                   &username));
-  EXPECT_TRUE(out_msg.get() != NULL);
-  EXPECT_EQ("", username);
-
-  // BINDING-ERROR-RESPONSE without username, with error, M-I, and FINGERPRINT.
-  in_msg.reset(CreateStunMessage(STUN_BINDING_ERROR_RESPONSE));
-  in_msg->AddAttribute(rtc::MakeUnique<StunErrorCodeAttribute>(
-      STUN_ATTR_ERROR_CODE, STUN_ERROR_SERVER_ERROR,
-      STUN_ERROR_REASON_SERVER_ERROR));
-  in_msg->AddFingerprint();
-  WriteStunMessage(in_msg.get(), buf.get());
-  EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr, &out_msg,
-                                   &username));
-  EXPECT_TRUE(out_msg.get() != NULL);
-  EXPECT_EQ("", username);
-  ASSERT_TRUE(out_msg->GetErrorCode() != NULL);
-  EXPECT_EQ(STUN_ERROR_SERVER_ERROR, out_msg->GetErrorCode()->code());
-  EXPECT_EQ(std::string(STUN_ERROR_REASON_SERVER_ERROR),
-      out_msg->GetErrorCode()->reason());
-}
-
-// Tests handling of ICE binding requests with missing or incorrect usernames.
-TEST_F(PortTest, TestHandleStunMessageBadUsername) {
-  std::unique_ptr<TestPort> port(CreateTestPort(kLocalAddr2, "rfrag", "rpass"));
-
-  std::unique_ptr<IceMessage> in_msg, out_msg;
-  std::unique_ptr<ByteBufferWriter> buf(new ByteBufferWriter());
-  rtc::SocketAddress addr(kLocalAddr1);
-  std::string username;
-
-  // BINDING-REQUEST with no username.
-  in_msg.reset(CreateStunMessage(STUN_BINDING_REQUEST));
-  in_msg->AddMessageIntegrity("rpass");
-  in_msg->AddFingerprint();
-  WriteStunMessage(in_msg.get(), buf.get());
-  EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr, &out_msg,
-                                   &username));
-  EXPECT_TRUE(out_msg.get() == NULL);
-  EXPECT_EQ("", username);
-  EXPECT_EQ(STUN_ERROR_BAD_REQUEST, port->last_stun_error_code());
-
-  // BINDING-REQUEST with empty username.
-  in_msg.reset(CreateStunMessageWithUsername(STUN_BINDING_REQUEST, ""));
-  in_msg->AddMessageIntegrity("rpass");
-  in_msg->AddFingerprint();
-  WriteStunMessage(in_msg.get(), buf.get());
-  EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr, &out_msg,
-                                   &username));
-  EXPECT_TRUE(out_msg.get() == NULL);
-  EXPECT_EQ("", username);
-  EXPECT_EQ(STUN_ERROR_UNAUTHORIZED, port->last_stun_error_code());
-
-  // BINDING-REQUEST with too-short username.
-  in_msg.reset(CreateStunMessageWithUsername(STUN_BINDING_REQUEST, "rfra"));
-  in_msg->AddMessageIntegrity("rpass");
-  in_msg->AddFingerprint();
-  WriteStunMessage(in_msg.get(), buf.get());
-  EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr, &out_msg,
-                                   &username));
-  EXPECT_TRUE(out_msg.get() == NULL);
-  EXPECT_EQ("", username);
-  EXPECT_EQ(STUN_ERROR_UNAUTHORIZED, port->last_stun_error_code());
-
-  // BINDING-REQUEST with reversed username.
-  in_msg.reset(CreateStunMessageWithUsername(STUN_BINDING_REQUEST,
-                                            "lfrag:rfrag"));
-  in_msg->AddMessageIntegrity("rpass");
-  in_msg->AddFingerprint();
-  WriteStunMessage(in_msg.get(), buf.get());
-  EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr, &out_msg,
-                                   &username));
-  EXPECT_TRUE(out_msg.get() == NULL);
-  EXPECT_EQ("", username);
-  EXPECT_EQ(STUN_ERROR_UNAUTHORIZED, port->last_stun_error_code());
-
-  // BINDING-REQUEST with garbage username.
-  in_msg.reset(CreateStunMessageWithUsername(STUN_BINDING_REQUEST,
-                                             "abcd:efgh"));
-  in_msg->AddMessageIntegrity("rpass");
-  in_msg->AddFingerprint();
-  WriteStunMessage(in_msg.get(), buf.get());
-  EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr, &out_msg,
-                                   &username));
-  EXPECT_TRUE(out_msg.get() == NULL);
-  EXPECT_EQ("", username);
-  EXPECT_EQ(STUN_ERROR_UNAUTHORIZED, port->last_stun_error_code());
-}
-
-// Test handling STUN messages with missing or malformed M-I.
-TEST_F(PortTest, TestHandleStunMessageBadMessageIntegrity) {
-  // Our port will act as the "remote" port.
-  std::unique_ptr<TestPort> port(CreateTestPort(kLocalAddr2, "rfrag", "rpass"));
-
-  std::unique_ptr<IceMessage> in_msg, out_msg;
-  std::unique_ptr<ByteBufferWriter> buf(new ByteBufferWriter());
-  rtc::SocketAddress addr(kLocalAddr1);
-  std::string username;
-
-  // BINDING-REQUEST from local to remote with valid ICE username and
-  // FINGERPRINT, but no MESSAGE-INTEGRITY.
-  in_msg.reset(CreateStunMessageWithUsername(STUN_BINDING_REQUEST,
-                                             "rfrag:lfrag"));
-  in_msg->AddFingerprint();
-  WriteStunMessage(in_msg.get(), buf.get());
-  EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr, &out_msg,
-                                   &username));
-  EXPECT_TRUE(out_msg.get() == NULL);
-  EXPECT_EQ("", username);
-  EXPECT_EQ(STUN_ERROR_BAD_REQUEST, port->last_stun_error_code());
-
-  // BINDING-REQUEST from local to remote with valid ICE username and
-  // FINGERPRINT, but invalid MESSAGE-INTEGRITY.
-  in_msg.reset(CreateStunMessageWithUsername(STUN_BINDING_REQUEST,
-                                             "rfrag:lfrag"));
-  in_msg->AddMessageIntegrity("invalid");
-  in_msg->AddFingerprint();
-  WriteStunMessage(in_msg.get(), buf.get());
-  EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr, &out_msg,
-                                   &username));
-  EXPECT_TRUE(out_msg.get() == NULL);
-  EXPECT_EQ("", username);
-  EXPECT_EQ(STUN_ERROR_UNAUTHORIZED, port->last_stun_error_code());
-
-  // TODO: BINDING-RESPONSES and BINDING-ERROR-RESPONSES are checked
-  // by the Connection, not the Port, since they require the remote username.
-  // Change this test to pass in data via Connection::OnReadPacket instead.
-}
-
-// Test handling STUN messages with missing or malformed FINGERPRINT.
-TEST_F(PortTest, TestHandleStunMessageBadFingerprint) {
-  // Our port will act as the "remote" port.
-  std::unique_ptr<TestPort> port(CreateTestPort(kLocalAddr2, "rfrag", "rpass"));
-
-  std::unique_ptr<IceMessage> in_msg, out_msg;
-  std::unique_ptr<ByteBufferWriter> buf(new ByteBufferWriter());
-  rtc::SocketAddress addr(kLocalAddr1);
-  std::string username;
-
-  // BINDING-REQUEST from local to remote with valid ICE username and
-  // MESSAGE-INTEGRITY, but no FINGERPRINT; GetStunMessage should fail.
-  in_msg.reset(CreateStunMessageWithUsername(STUN_BINDING_REQUEST,
-                                             "rfrag:lfrag"));
-  in_msg->AddMessageIntegrity("rpass");
-  WriteStunMessage(in_msg.get(), buf.get());
-  EXPECT_FALSE(port->GetStunMessage(buf->Data(), buf->Length(), addr, &out_msg,
-                                    &username));
-  EXPECT_EQ(0, port->last_stun_error_code());
-
-  // Now, add a fingerprint, but munge the message so it's not valid.
-  in_msg->AddFingerprint();
-  in_msg->SetTransactionID("TESTTESTBADD");
-  WriteStunMessage(in_msg.get(), buf.get());
-  EXPECT_FALSE(port->GetStunMessage(buf->Data(), buf->Length(), addr, &out_msg,
-                                    &username));
-  EXPECT_EQ(0, port->last_stun_error_code());
-
-  // Valid BINDING-RESPONSE, except no FINGERPRINT.
-  in_msg.reset(CreateStunMessage(STUN_BINDING_RESPONSE));
-  in_msg->AddAttribute(rtc::MakeUnique<StunXorAddressAttribute>(
-      STUN_ATTR_XOR_MAPPED_ADDRESS, kLocalAddr2));
-  in_msg->AddMessageIntegrity("rpass");
-  WriteStunMessage(in_msg.get(), buf.get());
-  EXPECT_FALSE(port->GetStunMessage(buf->Data(), buf->Length(), addr, &out_msg,
-                                    &username));
-  EXPECT_EQ(0, port->last_stun_error_code());
-
-  // Now, add a fingerprint, but munge the message so it's not valid.
-  in_msg->AddFingerprint();
-  in_msg->SetTransactionID("TESTTESTBADD");
-  WriteStunMessage(in_msg.get(), buf.get());
-  EXPECT_FALSE(port->GetStunMessage(buf->Data(), buf->Length(), addr, &out_msg,
-                                    &username));
-  EXPECT_EQ(0, port->last_stun_error_code());
-
-  // Valid BINDING-ERROR-RESPONSE, except no FINGERPRINT.
-  in_msg.reset(CreateStunMessage(STUN_BINDING_ERROR_RESPONSE));
-  in_msg->AddAttribute(rtc::MakeUnique<StunErrorCodeAttribute>(
-      STUN_ATTR_ERROR_CODE, STUN_ERROR_SERVER_ERROR,
-      STUN_ERROR_REASON_SERVER_ERROR));
-  in_msg->AddMessageIntegrity("rpass");
-  WriteStunMessage(in_msg.get(), buf.get());
-  EXPECT_FALSE(port->GetStunMessage(buf->Data(), buf->Length(), addr, &out_msg,
-                                    &username));
-  EXPECT_EQ(0, port->last_stun_error_code());
-
-  // Now, add a fingerprint, but munge the message so it's not valid.
-  in_msg->AddFingerprint();
-  in_msg->SetTransactionID("TESTTESTBADD");
-  WriteStunMessage(in_msg.get(), buf.get());
-  EXPECT_FALSE(port->GetStunMessage(buf->Data(), buf->Length(), addr, &out_msg,
-                                    &username));
-  EXPECT_EQ(0, port->last_stun_error_code());
-}
-
-// Test handling of STUN binding indication messages . STUN binding
-// indications are allowed only to the connection which is in read mode.
-TEST_F(PortTest, TestHandleStunBindingIndication) {
-  std::unique_ptr<TestPort> lport(
-      CreateTestPort(kLocalAddr2, "lfrag", "lpass"));
-  lport->SetIceRole(cricket::ICEROLE_CONTROLLING);
-  lport->SetIceTiebreaker(kTiebreaker1);
-
-  // Verifying encoding and decoding STUN indication message.
-  std::unique_ptr<IceMessage> in_msg, out_msg;
-  std::unique_ptr<ByteBufferWriter> buf(new ByteBufferWriter());
-  rtc::SocketAddress addr(kLocalAddr1);
-  std::string username;
-
-  in_msg.reset(CreateStunMessage(STUN_BINDING_INDICATION));
-  in_msg->AddFingerprint();
-  WriteStunMessage(in_msg.get(), buf.get());
-  EXPECT_TRUE(lport->GetStunMessage(buf->Data(), buf->Length(), addr, &out_msg,
-                                    &username));
-  EXPECT_TRUE(out_msg.get() != NULL);
-  EXPECT_EQ(out_msg->type(), STUN_BINDING_INDICATION);
-  EXPECT_EQ("", username);
-
-  // Verify connection can handle STUN indication and updates
-  // last_ping_received.
-  std::unique_ptr<TestPort> rport(
-      CreateTestPort(kLocalAddr2, "rfrag", "rpass"));
-  rport->SetIceRole(cricket::ICEROLE_CONTROLLED);
-  rport->SetIceTiebreaker(kTiebreaker2);
-
-  lport->PrepareAddress();
-  rport->PrepareAddress();
-  ASSERT_FALSE(lport->Candidates().empty());
-  ASSERT_FALSE(rport->Candidates().empty());
-
-  Connection* lconn = lport->CreateConnection(rport->Candidates()[0],
-                                              Port::ORIGIN_MESSAGE);
-  Connection* rconn = rport->CreateConnection(lport->Candidates()[0],
-                                              Port::ORIGIN_MESSAGE);
-  rconn->Ping(0);
-
-  ASSERT_TRUE_WAIT(rport->last_stun_msg() != NULL, kDefaultTimeout);
-  IceMessage* msg = rport->last_stun_msg();
-  EXPECT_EQ(STUN_BINDING_REQUEST, msg->type());
-  // Send rport binding request to lport.
-  lconn->OnReadPacket(rport->last_stun_buf()->data<char>(),
-                      rport->last_stun_buf()->size(),
-                      rtc::PacketTime());
-  ASSERT_TRUE_WAIT(lport->last_stun_msg() != NULL, kDefaultTimeout);
-  EXPECT_EQ(STUN_BINDING_RESPONSE, lport->last_stun_msg()->type());
-  int64_t last_ping_received1 = lconn->last_ping_received();
-
-  // Adding a delay of 100ms.
-  rtc::Thread::Current()->ProcessMessages(100);
-  // Pinging lconn using stun indication message.
-  lconn->OnReadPacket(buf->Data(), buf->Length(), rtc::PacketTime());
-  int64_t last_ping_received2 = lconn->last_ping_received();
-  EXPECT_GT(last_ping_received2, last_ping_received1);
-}
-
-TEST_F(PortTest, TestComputeCandidatePriority) {
-  std::unique_ptr<TestPort> port(CreateTestPort(kLocalAddr1, "name", "pass"));
-  port->set_type_preference(90);
-  port->set_component(177);
-  port->AddCandidateAddress(SocketAddress("192.168.1.4", 1234));
-  port->AddCandidateAddress(SocketAddress("2001:db8::1234", 1234));
-  port->AddCandidateAddress(SocketAddress("fc12:3456::1234", 1234));
-  port->AddCandidateAddress(SocketAddress("::ffff:192.168.1.4", 1234));
-  port->AddCandidateAddress(SocketAddress("::192.168.1.4", 1234));
-  port->AddCandidateAddress(SocketAddress("2002::1234:5678", 1234));
-  port->AddCandidateAddress(SocketAddress("2001::1234:5678", 1234));
-  port->AddCandidateAddress(SocketAddress("fecf::1234:5678", 1234));
-  port->AddCandidateAddress(SocketAddress("3ffe::1234:5678", 1234));
-  // These should all be:
-  // (90 << 24) | ([rfc3484 pref value] << 8) | (256 - 177)
-  uint32_t expected_priority_v4 = 1509957199U;
-  uint32_t expected_priority_v6 = 1509959759U;
-  uint32_t expected_priority_ula = 1509962319U;
-  uint32_t expected_priority_v4mapped = expected_priority_v4;
-  uint32_t expected_priority_v4compat = 1509949775U;
-  uint32_t expected_priority_6to4 = 1509954639U;
-  uint32_t expected_priority_teredo = 1509952079U;
-  uint32_t expected_priority_sitelocal = 1509949775U;
-  uint32_t expected_priority_6bone = 1509949775U;
-  ASSERT_EQ(expected_priority_v4, port->Candidates()[0].priority());
-  ASSERT_EQ(expected_priority_v6, port->Candidates()[1].priority());
-  ASSERT_EQ(expected_priority_ula, port->Candidates()[2].priority());
-  ASSERT_EQ(expected_priority_v4mapped, port->Candidates()[3].priority());
-  ASSERT_EQ(expected_priority_v4compat, port->Candidates()[4].priority());
-  ASSERT_EQ(expected_priority_6to4, port->Candidates()[5].priority());
-  ASSERT_EQ(expected_priority_teredo, port->Candidates()[6].priority());
-  ASSERT_EQ(expected_priority_sitelocal, port->Candidates()[7].priority());
-  ASSERT_EQ(expected_priority_6bone, port->Candidates()[8].priority());
-}
-
-// In the case of shared socket, one port may be shared by local and stun.
-// Test that candidates with different types will have different foundation.
-TEST_F(PortTest, TestFoundation) {
-  std::unique_ptr<TestPort> testport(
-      CreateTestPort(kLocalAddr1, "name", "pass"));
-  testport->AddCandidateAddress(kLocalAddr1, kLocalAddr1,
-                                LOCAL_PORT_TYPE,
-                                cricket::ICE_TYPE_PREFERENCE_HOST, false);
-  testport->AddCandidateAddress(kLocalAddr2, kLocalAddr1,
-                                STUN_PORT_TYPE,
-                                cricket::ICE_TYPE_PREFERENCE_SRFLX, true);
-  EXPECT_NE(testport->Candidates()[0].foundation(),
-            testport->Candidates()[1].foundation());
-}
-
-// This test verifies the foundation of different types of ICE candidates.
-TEST_F(PortTest, TestCandidateFoundation) {
-  std::unique_ptr<rtc::NATServer> nat_server(
-      CreateNatServer(kNatAddr1, NAT_OPEN_CONE));
-  std::unique_ptr<UDPPort> udpport1(CreateUdpPort(kLocalAddr1));
-  udpport1->PrepareAddress();
-  std::unique_ptr<UDPPort> udpport2(CreateUdpPort(kLocalAddr1));
-  udpport2->PrepareAddress();
-  EXPECT_EQ(udpport1->Candidates()[0].foundation(),
-            udpport2->Candidates()[0].foundation());
-  std::unique_ptr<TCPPort> tcpport1(CreateTcpPort(kLocalAddr1));
-  tcpport1->PrepareAddress();
-  std::unique_ptr<TCPPort> tcpport2(CreateTcpPort(kLocalAddr1));
-  tcpport2->PrepareAddress();
-  EXPECT_EQ(tcpport1->Candidates()[0].foundation(),
-            tcpport2->Candidates()[0].foundation());
-  std::unique_ptr<Port> stunport(
-      CreateStunPort(kLocalAddr1, nat_socket_factory1()));
-  stunport->PrepareAddress();
-  ASSERT_EQ_WAIT(1U, stunport->Candidates().size(), kDefaultTimeout);
-  EXPECT_NE(tcpport1->Candidates()[0].foundation(),
-            stunport->Candidates()[0].foundation());
-  EXPECT_NE(tcpport2->Candidates()[0].foundation(),
-            stunport->Candidates()[0].foundation());
-  EXPECT_NE(udpport1->Candidates()[0].foundation(),
-            stunport->Candidates()[0].foundation());
-  EXPECT_NE(udpport2->Candidates()[0].foundation(),
-            stunport->Candidates()[0].foundation());
-  // Verify GTURN candidate foundation.
-  std::unique_ptr<RelayPort> relayport(CreateGturnPort(kLocalAddr1));
-  relayport->AddServerAddress(
-      cricket::ProtocolAddress(kRelayUdpIntAddr, cricket::PROTO_UDP));
-  relayport->PrepareAddress();
-  ASSERT_EQ_WAIT(1U, relayport->Candidates().size(), kDefaultTimeout);
-  EXPECT_NE(udpport1->Candidates()[0].foundation(),
-            relayport->Candidates()[0].foundation());
-  EXPECT_NE(udpport2->Candidates()[0].foundation(),
-            relayport->Candidates()[0].foundation());
-  // Verifying TURN candidate foundation.
-  std::unique_ptr<Port> turnport1(
-      CreateTurnPort(kLocalAddr1, nat_socket_factory1(), PROTO_UDP, PROTO_UDP));
-  turnport1->PrepareAddress();
-  ASSERT_EQ_WAIT(1U, turnport1->Candidates().size(), kDefaultTimeout);
-  EXPECT_NE(udpport1->Candidates()[0].foundation(),
-            turnport1->Candidates()[0].foundation());
-  EXPECT_NE(udpport2->Candidates()[0].foundation(),
-            turnport1->Candidates()[0].foundation());
-  EXPECT_NE(stunport->Candidates()[0].foundation(),
-            turnport1->Candidates()[0].foundation());
-  std::unique_ptr<Port> turnport2(
-      CreateTurnPort(kLocalAddr1, nat_socket_factory1(), PROTO_UDP, PROTO_UDP));
-  turnport2->PrepareAddress();
-  ASSERT_EQ_WAIT(1U, turnport2->Candidates().size(), kDefaultTimeout);
-  EXPECT_EQ(turnport1->Candidates()[0].foundation(),
-            turnport2->Candidates()[0].foundation());
-
-  // Running a second turn server, to get different base IP address.
-  SocketAddress kTurnUdpIntAddr2("99.99.98.4", STUN_SERVER_PORT);
-  SocketAddress kTurnUdpExtAddr2("99.99.98.5", 0);
-  TestTurnServer turn_server2(
-      rtc::Thread::Current(), kTurnUdpIntAddr2, kTurnUdpExtAddr2);
-  std::unique_ptr<Port> turnport3(
-      CreateTurnPort(kLocalAddr1, nat_socket_factory1(), PROTO_UDP, PROTO_UDP,
-                     kTurnUdpIntAddr2));
-  turnport3->PrepareAddress();
-  ASSERT_EQ_WAIT(1U, turnport3->Candidates().size(), kDefaultTimeout);
-  EXPECT_NE(turnport3->Candidates()[0].foundation(),
-            turnport2->Candidates()[0].foundation());
-
-  // Start a TCP turn server, and check that two turn candidates have
-  // different foundations if their relay protocols are different.
-  TestTurnServer turn_server3(rtc::Thread::Current(), kTurnTcpIntAddr,
-                              kTurnUdpExtAddr, PROTO_TCP);
-  std::unique_ptr<Port> turnport4(
-      CreateTurnPort(kLocalAddr1, nat_socket_factory1(), PROTO_TCP, PROTO_UDP));
-  turnport4->PrepareAddress();
-  ASSERT_EQ_WAIT(1U, turnport4->Candidates().size(), kDefaultTimeout);
-  EXPECT_NE(turnport2->Candidates()[0].foundation(),
-            turnport4->Candidates()[0].foundation());
-}
-
-// This test verifies the related addresses of different types of
-// ICE candiates.
-TEST_F(PortTest, TestCandidateRelatedAddress) {
-  std::unique_ptr<rtc::NATServer> nat_server(
-      CreateNatServer(kNatAddr1, NAT_OPEN_CONE));
-  std::unique_ptr<UDPPort> udpport(CreateUdpPort(kLocalAddr1));
-  udpport->PrepareAddress();
-  // For UDPPort, related address will be empty.
-  EXPECT_TRUE(udpport->Candidates()[0].related_address().IsNil());
-  // Testing related address for stun candidates.
-  // For stun candidate related address must be equal to the base
-  // socket address.
-  std::unique_ptr<StunPort> stunport(
-      CreateStunPort(kLocalAddr1, nat_socket_factory1()));
-  stunport->PrepareAddress();
-  ASSERT_EQ_WAIT(1U, stunport->Candidates().size(), kDefaultTimeout);
-  // Check STUN candidate address.
-  EXPECT_EQ(stunport->Candidates()[0].address().ipaddr(),
-            kNatAddr1.ipaddr());
-  // Check STUN candidate related address.
-  EXPECT_EQ(stunport->Candidates()[0].related_address(),
-            stunport->GetLocalAddress());
-  // Verifying the related address for the GTURN candidates.
-  // NOTE: In case of GTURN related address will be equal to the mapped
-  // address, but address(mapped) will not be XOR.
-  std::unique_ptr<RelayPort> relayport(CreateGturnPort(kLocalAddr1));
-  relayport->AddServerAddress(
-      cricket::ProtocolAddress(kRelayUdpIntAddr, cricket::PROTO_UDP));
-  relayport->PrepareAddress();
-  ASSERT_EQ_WAIT(1U, relayport->Candidates().size(), kDefaultTimeout);
-  // For Gturn related address is set to "0.0.0.0:0"
-  EXPECT_EQ(rtc::SocketAddress(),
-            relayport->Candidates()[0].related_address());
-  // Verifying the related address for TURN candidate.
-  // For TURN related address must be equal to the mapped address.
-  std::unique_ptr<Port> turnport(
-      CreateTurnPort(kLocalAddr1, nat_socket_factory1(), PROTO_UDP, PROTO_UDP));
-  turnport->PrepareAddress();
-  ASSERT_EQ_WAIT(1U, turnport->Candidates().size(), kDefaultTimeout);
-  EXPECT_EQ(kTurnUdpExtAddr.ipaddr(),
-            turnport->Candidates()[0].address().ipaddr());
-  EXPECT_EQ(kNatAddr1.ipaddr(),
-            turnport->Candidates()[0].related_address().ipaddr());
-}
-
-// Test priority value overflow handling when preference is set to 3.
-TEST_F(PortTest, TestCandidatePriority) {
-  cricket::Candidate cand1;
-  cand1.set_priority(3);
-  cricket::Candidate cand2;
-  cand2.set_priority(1);
-  EXPECT_TRUE(cand1.priority() > cand2.priority());
-}
-
-// Test the Connection priority is calculated correctly.
-TEST_F(PortTest, TestConnectionPriority) {
-  std::unique_ptr<TestPort> lport(
-      CreateTestPort(kLocalAddr1, "lfrag", "lpass"));
-  lport->set_type_preference(cricket::ICE_TYPE_PREFERENCE_HOST);
-  std::unique_ptr<TestPort> rport(
-      CreateTestPort(kLocalAddr2, "rfrag", "rpass"));
-  rport->set_type_preference(cricket::ICE_TYPE_PREFERENCE_RELAY_UDP);
-  lport->set_component(123);
-  lport->AddCandidateAddress(SocketAddress("192.168.1.4", 1234));
-  rport->set_component(23);
-  rport->AddCandidateAddress(SocketAddress("10.1.1.100", 1234));
-
-  EXPECT_EQ(0x7E001E85U, lport->Candidates()[0].priority());
-  EXPECT_EQ(0x2001EE9U, rport->Candidates()[0].priority());
-
-  // RFC 5245
-  // pair priority = 2^32*MIN(G,D) + 2*MAX(G,D) + (G>D?1:0)
-  lport->SetIceRole(cricket::ICEROLE_CONTROLLING);
-  rport->SetIceRole(cricket::ICEROLE_CONTROLLED);
-  Connection* lconn = lport->CreateConnection(
-      rport->Candidates()[0], Port::ORIGIN_MESSAGE);
-#if defined(WEBRTC_WIN)
-  EXPECT_EQ(0x2001EE9FC003D0BU, lconn->priority());
-#else
-  EXPECT_EQ(0x2001EE9FC003D0BLLU, lconn->priority());
-#endif
-
-  lport->SetIceRole(cricket::ICEROLE_CONTROLLED);
-  rport->SetIceRole(cricket::ICEROLE_CONTROLLING);
-  Connection* rconn = rport->CreateConnection(
-      lport->Candidates()[0], Port::ORIGIN_MESSAGE);
-#if defined(WEBRTC_WIN)
-  EXPECT_EQ(0x2001EE9FC003D0AU, rconn->priority());
-#else
-  EXPECT_EQ(0x2001EE9FC003D0ALLU, rconn->priority());
-#endif
-}
-
-TEST_F(PortTest, TestWritableState) {
-  rtc::ScopedFakeClock clock;
-  UDPPort* port1 = CreateUdpPort(kLocalAddr1);
-  port1->SetIceRole(cricket::ICEROLE_CONTROLLING);
-  UDPPort* port2 = CreateUdpPort(kLocalAddr2);
-  port2->SetIceRole(cricket::ICEROLE_CONTROLLED);
-
-  // Set up channels.
-  TestChannel ch1(port1);
-  TestChannel ch2(port2);
-
-  // Acquire addresses.
-  ch1.Start();
-  ch2.Start();
-  ASSERT_EQ_SIMULATED_WAIT(1, ch1.complete_count(), kDefaultTimeout, clock);
-  ASSERT_EQ_SIMULATED_WAIT(1, ch2.complete_count(), kDefaultTimeout, clock);
-
-  // Send a ping from src to dst.
-  ch1.CreateConnection(GetCandidate(port2));
-  ASSERT_TRUE(ch1.conn() != NULL);
-  EXPECT_EQ(Connection::STATE_WRITE_INIT, ch1.conn()->write_state());
-  // for TCP connect
-  EXPECT_TRUE_SIMULATED_WAIT(ch1.conn()->connected(), kDefaultTimeout, clock);
-  ch1.Ping();
-  SIMULATED_WAIT(!ch2.remote_address().IsNil(), kShortTimeout, clock);
-
-  // Data should be sendable before the connection is accepted.
-  char data[] = "abcd";
-  int data_size = arraysize(data);
-  rtc::PacketOptions options;
-  EXPECT_EQ(data_size, ch1.conn()->Send(data, data_size, options));
-
-  // Accept the connection to return the binding response, transition to
-  // writable, and allow data to be sent.
-  ch2.AcceptConnection(GetCandidate(port1));
-  EXPECT_EQ_SIMULATED_WAIT(Connection::STATE_WRITABLE,
-                           ch1.conn()->write_state(), kDefaultTimeout, clock);
-  EXPECT_EQ(data_size, ch1.conn()->Send(data, data_size, options));
-
-  // Ask the connection to update state as if enough time has passed to lose
-  // full writability and 5 pings went unresponded to. We'll accomplish the
-  // latter by sending pings but not pumping messages.
-  for (uint32_t i = 1; i <= CONNECTION_WRITE_CONNECT_FAILURES; ++i) {
-    ch1.Ping(i);
-  }
-  int unreliable_timeout_delay = CONNECTION_WRITE_CONNECT_TIMEOUT + 500;
-  ch1.conn()->UpdateState(unreliable_timeout_delay);
-  EXPECT_EQ(Connection::STATE_WRITE_UNRELIABLE, ch1.conn()->write_state());
-
-  // Data should be able to be sent in this state.
-  EXPECT_EQ(data_size, ch1.conn()->Send(data, data_size, options));
-
-  // And now allow the other side to process the pings and send binding
-  // responses.
-  EXPECT_EQ_SIMULATED_WAIT(Connection::STATE_WRITABLE,
-                           ch1.conn()->write_state(), kDefaultTimeout, clock);
-
-  // Wait long enough for a full timeout (past however long we've already
-  // waited).
-  for (uint32_t i = 1; i <= CONNECTION_WRITE_CONNECT_FAILURES; ++i) {
-    ch1.Ping(unreliable_timeout_delay + i);
-  }
-  ch1.conn()->UpdateState(unreliable_timeout_delay + CONNECTION_WRITE_TIMEOUT +
-                          500u);
-  EXPECT_EQ(Connection::STATE_WRITE_TIMEOUT, ch1.conn()->write_state());
-
-  // Even if the connection has timed out, the Connection shouldn't block
-  // the sending of data.
-  EXPECT_EQ(data_size, ch1.conn()->Send(data, data_size, options));
-
-  ch1.Stop();
-  ch2.Stop();
-}
-
-TEST_F(PortTest, TestTimeoutForNeverWritable) {
-  UDPPort* port1 = CreateUdpPort(kLocalAddr1);
-  port1->SetIceRole(cricket::ICEROLE_CONTROLLING);
-  UDPPort* port2 = CreateUdpPort(kLocalAddr2);
-  port2->SetIceRole(cricket::ICEROLE_CONTROLLED);
-
-  // Set up channels.
-  TestChannel ch1(port1);
-  TestChannel ch2(port2);
-
-  // Acquire addresses.
-  ch1.Start();
-  ch2.Start();
-
-  ch1.CreateConnection(GetCandidate(port2));
-  ASSERT_TRUE(ch1.conn() != NULL);
-  EXPECT_EQ(Connection::STATE_WRITE_INIT, ch1.conn()->write_state());
-
-  // Attempt to go directly to write timeout.
-  for (uint32_t i = 1; i <= CONNECTION_WRITE_CONNECT_FAILURES; ++i) {
-    ch1.Ping(i);
-  }
-  ch1.conn()->UpdateState(CONNECTION_WRITE_TIMEOUT + 500u);
-  EXPECT_EQ(Connection::STATE_WRITE_TIMEOUT, ch1.conn()->write_state());
-}
-
-// This test verifies the connection setup between ICEMODE_FULL
-// and ICEMODE_LITE.
-// In this test |ch1| behaves like FULL mode client and we have created
-// port which responds to the ping message just like LITE client.
-TEST_F(PortTest, TestIceLiteConnectivity) {
-  TestPort* ice_full_port = CreateTestPort(
-      kLocalAddr1, "lfrag", "lpass",
-      cricket::ICEROLE_CONTROLLING, kTiebreaker1);
-
-  std::unique_ptr<TestPort> ice_lite_port(
-      CreateTestPort(kLocalAddr2, "rfrag", "rpass", cricket::ICEROLE_CONTROLLED,
-                     kTiebreaker2));
-  // Setup TestChannel. This behaves like FULL mode client.
-  TestChannel ch1(ice_full_port);
-  ch1.SetIceMode(ICEMODE_FULL);
-
-  // Start gathering candidates.
-  ch1.Start();
-  ice_lite_port->PrepareAddress();
-
-  ASSERT_EQ_WAIT(1, ch1.complete_count(), kDefaultTimeout);
-  ASSERT_FALSE(ice_lite_port->Candidates().empty());
-
-  ch1.CreateConnection(GetCandidate(ice_lite_port.get()));
-  ASSERT_TRUE(ch1.conn() != NULL);
-  EXPECT_EQ(Connection::STATE_WRITE_INIT, ch1.conn()->write_state());
-
-  // Send ping from full mode client.
-  // This ping must not have USE_CANDIDATE_ATTR.
-  ch1.Ping();
-
-  // Verify stun ping is without USE_CANDIDATE_ATTR. Getting message directly
-  // from port.
-  ASSERT_TRUE_WAIT(ice_full_port->last_stun_msg() != NULL, kDefaultTimeout);
-  IceMessage* msg = ice_full_port->last_stun_msg();
-  EXPECT_TRUE(msg->GetByteString(STUN_ATTR_USE_CANDIDATE) == NULL);
-
-  // Respond with a BINDING-RESPONSE from litemode client.
-  // NOTE: Ideally we should't create connection at this stage from lite
-  // port, as it should be done only after receiving ping with USE_CANDIDATE.
-  // But we need a connection to send a response message.
-  ice_lite_port->CreateConnection(
-      ice_full_port->Candidates()[0], cricket::Port::ORIGIN_MESSAGE);
-  std::unique_ptr<IceMessage> request(CopyStunMessage(msg));
-  ice_lite_port->SendBindingResponse(
-      request.get(), ice_full_port->Candidates()[0].address());
-
-  // Feeding the respone message from litemode to the full mode connection.
-  ch1.conn()->OnReadPacket(ice_lite_port->last_stun_buf()->data<char>(),
-                           ice_lite_port->last_stun_buf()->size(),
-                           rtc::PacketTime());
-  // Verifying full mode connection becomes writable from the response.
-  EXPECT_EQ_WAIT(Connection::STATE_WRITABLE, ch1.conn()->write_state(),
-                 kDefaultTimeout);
-  EXPECT_TRUE_WAIT(ch1.nominated(), kDefaultTimeout);
-
-  // Clear existing stun messsages. Otherwise we will process old stun
-  // message right after we send ping.
-  ice_full_port->Reset();
-  // Send ping. This must have USE_CANDIDATE_ATTR.
-  ch1.Ping();
-  ASSERT_TRUE_WAIT(ice_full_port->last_stun_msg() != NULL, kDefaultTimeout);
-  msg = ice_full_port->last_stun_msg();
-  EXPECT_TRUE(msg->GetByteString(STUN_ATTR_USE_CANDIDATE) != NULL);
-  ch1.Stop();
-}
-
-// This test case verifies that both the controlling port and the controlled
-// port will time out after connectivity is lost, if they are not marked as
-// "keep alive until pruned."
-TEST_F(PortTest, TestPortTimeoutIfNotKeptAlive) {
-  rtc::ScopedFakeClock clock;
-  int timeout_delay = 100;
-  UDPPort* port1 = CreateUdpPort(kLocalAddr1);
-  ConnectToSignalDestroyed(port1);
-  port1->set_timeout_delay(timeout_delay);  // milliseconds
-  port1->SetIceRole(cricket::ICEROLE_CONTROLLING);
-  port1->SetIceTiebreaker(kTiebreaker1);
-
-  UDPPort* port2 = CreateUdpPort(kLocalAddr2);
-  ConnectToSignalDestroyed(port2);
-  port2->set_timeout_delay(timeout_delay);  // milliseconds
-  port2->SetIceRole(cricket::ICEROLE_CONTROLLED);
-  port2->SetIceTiebreaker(kTiebreaker2);
-
-  // Set up channels and ensure both ports will be deleted.
-  TestChannel ch1(port1);
-  TestChannel ch2(port2);
-
-  // Simulate a connection that succeeds, and then is destroyed.
-  StartConnectAndStopChannels(&ch1, &ch2);
-  // After the connection is destroyed, the port will be destroyed because
-  // none of them is marked as "keep alive until pruned.
-  EXPECT_EQ_SIMULATED_WAIT(2, ports_destroyed(), 110, clock);
-}
-
-// Test that if after all connection are destroyed, new connections are created
-// and destroyed again, ports won't be destroyed until a timeout period passes
-// after the last set of connections are all destroyed.
-TEST_F(PortTest, TestPortTimeoutAfterNewConnectionCreatedAndDestroyed) {
-  rtc::ScopedFakeClock clock;
-  int timeout_delay = 100;
-  UDPPort* port1 = CreateUdpPort(kLocalAddr1);
-  ConnectToSignalDestroyed(port1);
-  port1->set_timeout_delay(timeout_delay);  // milliseconds
-  port1->SetIceRole(cricket::ICEROLE_CONTROLLING);
-  port1->SetIceTiebreaker(kTiebreaker1);
-
-  UDPPort* port2 = CreateUdpPort(kLocalAddr2);
-  ConnectToSignalDestroyed(port2);
-  port2->set_timeout_delay(timeout_delay);  // milliseconds
-
-  port2->SetIceRole(cricket::ICEROLE_CONTROLLED);
-  port2->SetIceTiebreaker(kTiebreaker2);
-
-  // Set up channels and ensure both ports will be deleted.
-  TestChannel ch1(port1);
-  TestChannel ch2(port2);
-
-  // Simulate a connection that succeeds, and then is destroyed.
-  StartConnectAndStopChannels(&ch1, &ch2);
-  SIMULATED_WAIT(ports_destroyed() > 0, 80, clock);
-  EXPECT_EQ(0, ports_destroyed());
-
-  // Start the second set of connection and destroy them.
-  ch1.CreateConnection(GetCandidate(ch2.port()));
-  ch2.CreateConnection(GetCandidate(ch1.port()));
-  ch1.Stop();
-  ch2.Stop();
-
-  SIMULATED_WAIT(ports_destroyed() > 0, 80, clock);
-  EXPECT_EQ(0, ports_destroyed());
-
-  // The ports on both sides should be destroyed after timeout.
-  EXPECT_TRUE_SIMULATED_WAIT(ports_destroyed() == 2, 30, clock);
-}
-
-// This test case verifies that neither the controlling port nor the controlled
-// port will time out after connectivity is lost if they are marked as "keep
-// alive until pruned". They will time out after they are pruned.
-TEST_F(PortTest, TestPortNotTimeoutUntilPruned) {
-  rtc::ScopedFakeClock clock;
-  int timeout_delay = 100;
-  UDPPort* port1 = CreateUdpPort(kLocalAddr1);
-  ConnectToSignalDestroyed(port1);
-  port1->set_timeout_delay(timeout_delay);  // milliseconds
-  port1->SetIceRole(cricket::ICEROLE_CONTROLLING);
-  port1->SetIceTiebreaker(kTiebreaker1);
-
-  UDPPort* port2 = CreateUdpPort(kLocalAddr2);
-  ConnectToSignalDestroyed(port2);
-  port2->set_timeout_delay(timeout_delay);  // milliseconds
-  port2->SetIceRole(cricket::ICEROLE_CONTROLLED);
-  port2->SetIceTiebreaker(kTiebreaker2);
-  // The connection must not be destroyed before a connection is attempted.
-  EXPECT_EQ(0, ports_destroyed());
-
-  port1->set_component(cricket::ICE_CANDIDATE_COMPONENT_DEFAULT);
-  port2->set_component(cricket::ICE_CANDIDATE_COMPONENT_DEFAULT);
-
-  // Set up channels and keep the port alive.
-  TestChannel ch1(port1);
-  TestChannel ch2(port2);
-  // Simulate a connection that succeeds, and then is destroyed. But ports
-  // are kept alive. Ports won't be destroyed.
-  StartConnectAndStopChannels(&ch1, &ch2);
-  port1->KeepAliveUntilPruned();
-  port2->KeepAliveUntilPruned();
-  SIMULATED_WAIT(ports_destroyed() > 0, 150, clock);
-  EXPECT_EQ(0, ports_destroyed());
-
-  // If they are pruned now, they will be destroyed right away.
-  port1->Prune();
-  port2->Prune();
-  // The ports on both sides should be destroyed after timeout.
-  EXPECT_TRUE_SIMULATED_WAIT(ports_destroyed() == 2, 1, clock);
-}
-
-TEST_F(PortTest, TestSupportsProtocol) {
-  std::unique_ptr<Port> udp_port(CreateUdpPort(kLocalAddr1));
-  EXPECT_TRUE(udp_port->SupportsProtocol(UDP_PROTOCOL_NAME));
-  EXPECT_FALSE(udp_port->SupportsProtocol(TCP_PROTOCOL_NAME));
-
-  std::unique_ptr<Port> stun_port(
-      CreateStunPort(kLocalAddr1, nat_socket_factory1()));
-  EXPECT_TRUE(stun_port->SupportsProtocol(UDP_PROTOCOL_NAME));
-  EXPECT_FALSE(stun_port->SupportsProtocol(TCP_PROTOCOL_NAME));
-
-  std::unique_ptr<Port> tcp_port(CreateTcpPort(kLocalAddr1));
-  EXPECT_TRUE(tcp_port->SupportsProtocol(TCP_PROTOCOL_NAME));
-  EXPECT_TRUE(tcp_port->SupportsProtocol(SSLTCP_PROTOCOL_NAME));
-  EXPECT_FALSE(tcp_port->SupportsProtocol(UDP_PROTOCOL_NAME));
-
-  std::unique_ptr<Port> turn_port(
-      CreateTurnPort(kLocalAddr1, nat_socket_factory1(), PROTO_UDP, PROTO_UDP));
-  EXPECT_TRUE(turn_port->SupportsProtocol(UDP_PROTOCOL_NAME));
-  EXPECT_FALSE(turn_port->SupportsProtocol(TCP_PROTOCOL_NAME));
-}
-
-// Test that SetIceParameters updates the component, ufrag and password
-// on both the port itself and its candidates.
-TEST_F(PortTest, TestSetIceParameters) {
-  std::unique_ptr<TestPort> port(
-      CreateTestPort(kLocalAddr1, "ufrag1", "password1"));
-  port->PrepareAddress();
-  EXPECT_EQ(1UL, port->Candidates().size());
-  port->SetIceParameters(1, "ufrag2", "password2");
-  EXPECT_EQ(1, port->component());
-  EXPECT_EQ("ufrag2", port->username_fragment());
-  EXPECT_EQ("password2", port->password());
-  const Candidate& candidate = port->Candidates()[0];
-  EXPECT_EQ(1, candidate.component());
-  EXPECT_EQ("ufrag2", candidate.username());
-  EXPECT_EQ("password2", candidate.password());
-}
-
-TEST_F(PortTest, TestAddConnectionWithSameAddress) {
-  std::unique_ptr<TestPort> port(
-      CreateTestPort(kLocalAddr1, "ufrag1", "password1"));
-  port->PrepareAddress();
-  EXPECT_EQ(1u, port->Candidates().size());
-  rtc::SocketAddress address("1.1.1.1", 5000);
-  cricket::Candidate candidate(1, "udp", address, 0, "", "", "relay", 0, "");
-  cricket::Connection* conn1 =
-      port->CreateConnection(candidate, Port::ORIGIN_MESSAGE);
-  cricket::Connection* conn_in_use = port->GetConnection(address);
-  EXPECT_EQ(conn1, conn_in_use);
-  EXPECT_EQ(0u, conn_in_use->remote_candidate().generation());
-
-  // Creating with a candidate with the same address again will get us a
-  // different connection with the new candidate.
-  candidate.set_generation(2);
-  cricket::Connection* conn2 =
-      port->CreateConnection(candidate, Port::ORIGIN_MESSAGE);
-  EXPECT_NE(conn1, conn2);
-  conn_in_use = port->GetConnection(address);
-  EXPECT_EQ(conn2, conn_in_use);
-  EXPECT_EQ(2u, conn_in_use->remote_candidate().generation());
-
-  // Make sure the new connection was not deleted.
-  rtc::Thread::Current()->ProcessMessages(300);
-  EXPECT_TRUE(port->GetConnection(address) != nullptr);
-}
diff --git a/p2p/base/portallocator.cc b/p2p/base/portallocator.cc
deleted file mode 100644
index dd776e7..0000000
--- a/p2p/base/portallocator.cc
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- *  Copyright 2004 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/p2p/base/portallocator.h"
-#include "webrtc/rtc_base/checks.h"
-
-namespace cricket {
-
-PortAllocatorSession::PortAllocatorSession(const std::string& content_name,
-                                           int component,
-                                           const std::string& ice_ufrag,
-                                           const std::string& ice_pwd,
-                                           uint32_t flags)
-    : flags_(flags),
-      generation_(0),
-      content_name_(content_name),
-      component_(component),
-      ice_ufrag_(ice_ufrag),
-      ice_pwd_(ice_pwd) {
-  // Pooled sessions are allowed to be created with empty content name,
-  // component, ufrag and password.
-  RTC_DCHECK(ice_ufrag.empty() == ice_pwd.empty());
-}
-
-bool PortAllocator::SetConfiguration(
-    const ServerAddresses& stun_servers,
-    const std::vector<RelayServerConfig>& turn_servers,
-    int candidate_pool_size,
-    bool prune_turn_ports) {
-  bool ice_servers_changed =
-      (stun_servers != stun_servers_ || turn_servers != turn_servers_);
-  stun_servers_ = stun_servers;
-  turn_servers_ = turn_servers;
-  prune_turn_ports_ = prune_turn_ports;
-
-  if (candidate_pool_frozen_) {
-    if (candidate_pool_size != candidate_pool_size_) {
-      LOG(LS_ERROR) << "Trying to change candidate pool size after pool was "
-                    << "frozen.";
-      return false;
-    }
-    return true;
-  }
-
-  if (candidate_pool_size < 0) {
-    LOG(LS_ERROR) << "Can't set negative pool size.";
-    return false;
-  }
-
-  candidate_pool_size_ = candidate_pool_size;
-
-  // If ICE servers changed, throw away any existing pooled sessions and create
-  // new ones.
-  if (ice_servers_changed) {
-    pooled_sessions_.clear();
-  }
-
-  // If |candidate_pool_size_| is less than the number of pooled sessions, get
-  // rid of the extras.
-  while (candidate_pool_size_ < static_cast<int>(pooled_sessions_.size())) {
-    pooled_sessions_.front().reset(nullptr);
-    pooled_sessions_.pop_front();
-  }
-
-  // If |candidate_pool_size_| is greater than the number of pooled sessions,
-  // create new sessions.
-  while (static_cast<int>(pooled_sessions_.size()) < candidate_pool_size_) {
-    PortAllocatorSession* pooled_session = CreateSessionInternal("", 0, "", "");
-    pooled_session->StartGettingPorts();
-    pooled_sessions_.push_back(
-        std::unique_ptr<PortAllocatorSession>(pooled_session));
-  }
-  return true;
-}
-
-std::unique_ptr<PortAllocatorSession> PortAllocator::CreateSession(
-    const std::string& content_name,
-    int component,
-    const std::string& ice_ufrag,
-    const std::string& ice_pwd) {
-  auto session = std::unique_ptr<PortAllocatorSession>(
-      CreateSessionInternal(content_name, component, ice_ufrag, ice_pwd));
-  session->SetCandidateFilter(candidate_filter());
-  return session;
-}
-
-std::unique_ptr<PortAllocatorSession> PortAllocator::TakePooledSession(
-    const std::string& content_name,
-    int component,
-    const std::string& ice_ufrag,
-    const std::string& ice_pwd) {
-  RTC_DCHECK(!ice_ufrag.empty());
-  RTC_DCHECK(!ice_pwd.empty());
-  if (pooled_sessions_.empty()) {
-    return nullptr;
-  }
-  std::unique_ptr<PortAllocatorSession> ret =
-      std::move(pooled_sessions_.front());
-  ret->SetIceParameters(content_name, component, ice_ufrag, ice_pwd);
-  // According to JSEP, a pooled session should filter candidates only after
-  // it's taken out of the pool.
-  ret->SetCandidateFilter(candidate_filter());
-  pooled_sessions_.pop_front();
-  return ret;
-}
-
-const PortAllocatorSession* PortAllocator::GetPooledSession() const {
-  if (pooled_sessions_.empty()) {
-    return nullptr;
-  }
-  return pooled_sessions_.front().get();
-}
-
-void PortAllocator::FreezeCandidatePool() {
-  candidate_pool_frozen_ = true;
-}
-
-void PortAllocator::DiscardCandidatePool() {
-  pooled_sessions_.clear();
-}
-
-}  // namespace cricket
diff --git a/p2p/base/portallocator.h b/p2p/base/portallocator.h
deleted file mode 100644
index 63d7c71..0000000
--- a/p2p/base/portallocator.h
+++ /dev/null
@@ -1,513 +0,0 @@
-/*
- *  Copyright 2004 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_P2P_BASE_PORTALLOCATOR_H_
-#define WEBRTC_P2P_BASE_PORTALLOCATOR_H_
-
-#include <deque>
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "webrtc/p2p/base/port.h"
-#include "webrtc/p2p/base/portinterface.h"
-#include "webrtc/rtc_base/helpers.h"
-#include "webrtc/rtc_base/proxyinfo.h"
-#include "webrtc/rtc_base/sigslot.h"
-#include "webrtc/rtc_base/thread.h"
-
-namespace webrtc {
-class MetricsObserverInterface;
-}
-
-namespace cricket {
-
-// PortAllocator is responsible for allocating Port types for a given
-// P2PSocket. It also handles port freeing.
-//
-// Clients can override this class to control port allocation, including
-// what kinds of ports are allocated.
-
-enum {
-  // Disable local UDP ports. This doesn't impact how we connect to relay
-  // servers.
-  PORTALLOCATOR_DISABLE_UDP = 0x01,
-  PORTALLOCATOR_DISABLE_STUN = 0x02,
-  PORTALLOCATOR_DISABLE_RELAY = 0x04,
-  // Disable local TCP ports. This doesn't impact how we connect to relay
-  // servers.
-  PORTALLOCATOR_DISABLE_TCP = 0x08,
-  PORTALLOCATOR_ENABLE_IPV6 = 0x40,
-  // TODO(pthatcher): Remove this once it's no longer used in:
-  // remoting/client/plugin/pepper_port_allocator.cc
-  // remoting/protocol/chromium_port_allocator.cc
-  // remoting/test/fake_port_allocator.cc
-  // It's a no-op and is no longer needed.
-  PORTALLOCATOR_ENABLE_SHARED_UFRAG = 0x80,
-  PORTALLOCATOR_ENABLE_SHARED_SOCKET = 0x100,
-  PORTALLOCATOR_ENABLE_STUN_RETRANSMIT_ATTRIBUTE = 0x200,
-  // When specified, we'll only allocate the STUN candidate for the public
-  // interface as seen by regular http traffic and the HOST candidate associated
-  // with the default local interface.
-  PORTALLOCATOR_DISABLE_ADAPTER_ENUMERATION = 0x400,
-  // When specified along with PORTALLOCATOR_DISABLE_ADAPTER_ENUMERATION, the
-  // default local candidate mentioned above will not be allocated. Only the
-  // STUN candidate will be.
-  PORTALLOCATOR_DISABLE_DEFAULT_LOCAL_CANDIDATE = 0x800,
-  // Disallow use of UDP when connecting to a relay server. Since proxy servers
-  // usually don't handle UDP, using UDP will leak the IP address.
-  PORTALLOCATOR_DISABLE_UDP_RELAY = 0x1000,
-
-  // When multiple networks exist, do not gather candidates on the ones with
-  // high cost. So if both Wi-Fi and cellular networks exist, gather only on the
-  // Wi-Fi network. If a network type is "unknown", it has a cost lower than
-  // cellular but higher than Wi-Fi/Ethernet. So if an unknown network exists,
-  // cellular networks will not be used to gather candidates and if a Wi-Fi
-  // network is present, "unknown" networks will not be usd to gather
-  // candidates. Doing so ensures that even if a cellular network type was not
-  // detected initially, it would not be used if a Wi-Fi network is present.
-  PORTALLOCATOR_DISABLE_COSTLY_NETWORKS = 0x2000,
-
-  // When specified, do not collect IPv6 ICE candidates on Wi-Fi.
-  PORTALLOCATOR_ENABLE_IPV6_ON_WIFI = 0x4000,
-
-  // When this flag is set, ports not bound to any specific network interface
-  // will be used, in addition to normal ports bound to the enumerated
-  // interfaces. Without this flag, these "any address" ports would only be
-  // used when network enumeration fails or is disabled. But under certain
-  // conditions, these ports may succeed where others fail, so they may allow
-  // the application to work in a wider variety of environments, at the expense
-  // of having to allocate additional candidates.
-  PORTALLOCATOR_ENABLE_ANY_ADDRESS_PORTS = 0x8000,
-};
-
-// Defines various reasons that have caused ICE regathering.
-enum class IceRegatheringReason {
-  NETWORK_CHANGE,      // Network interfaces on the device changed
-  NETWORK_FAILURE,     // Regather only on networks that have failed
-  OCCASIONAL_REFRESH,  // Periodic regather on all networks
-  MAX_VALUE
-};
-
-const uint32_t kDefaultPortAllocatorFlags = 0;
-
-const uint32_t kDefaultStepDelay = 1000;  // 1 sec step delay.
-// As per RFC 5245 Appendix B.1, STUN transactions need to be paced at certain
-// internal. Less than 20ms is not acceptable. We choose 50ms as our default.
-const uint32_t kMinimumStepDelay = 50;
-
-// Turning on IPv6 could make many IPv6 interfaces available for connectivity
-// check and delay the call setup time. kDefaultMaxIPv6Networks is the default
-// upper limit of IPv6 networks but could be changed by
-// set_max_ipv6_networks().
-constexpr int kDefaultMaxIPv6Networks = 5;
-
-// CF = CANDIDATE FILTER
-enum {
-  CF_NONE = 0x0,
-  CF_HOST = 0x1,
-  CF_REFLEXIVE = 0x2,
-  CF_RELAY = 0x4,
-  CF_ALL = 0x7,
-};
-
-// TLS certificate policy.
-enum class TlsCertPolicy {
-  // For TLS based protocols, ensure the connection is secure by not
-  // circumventing certificate validation.
-  TLS_CERT_POLICY_SECURE,
-  // For TLS based protocols, disregard security completely by skipping
-  // certificate validation. This is insecure and should never be used unless
-  // security is irrelevant in that particular context.
-  TLS_CERT_POLICY_INSECURE_NO_CHECK,
-};
-
-// TODO(deadbeef): Rename to TurnCredentials (and username to ufrag).
-struct RelayCredentials {
-  RelayCredentials() {}
-  RelayCredentials(const std::string& username, const std::string& password)
-      : username(username), password(password) {}
-
-  bool operator==(const RelayCredentials& o) const {
-    return username == o.username && password == o.password;
-  }
-  bool operator!=(const RelayCredentials& o) const { return !(*this == o); }
-
-  std::string username;
-  std::string password;
-};
-
-typedef std::vector<ProtocolAddress> PortList;
-// TODO(deadbeef): Rename to TurnServerConfig.
-struct RelayServerConfig {
-  RelayServerConfig(RelayType type) : type(type) {}
-
-  RelayServerConfig(const rtc::SocketAddress& address,
-                    const std::string& username,
-                    const std::string& password,
-                    ProtocolType proto)
-      : type(RELAY_TURN), credentials(username, password) {
-    ports.push_back(ProtocolAddress(address, proto));
-  }
-
-  RelayServerConfig(const std::string& address,
-                    int port,
-                    const std::string& username,
-                    const std::string& password,
-                    ProtocolType proto)
-      : RelayServerConfig(rtc::SocketAddress(address, port),
-                          username,
-                          password,
-                          proto) {}
-
-  // Legacy constructor where "secure" and PROTO_TCP implies PROTO_TLS.
-  RelayServerConfig(const std::string& address,
-                    int port,
-                    const std::string& username,
-                    const std::string& password,
-                    ProtocolType proto,
-                    bool secure)
-      : RelayServerConfig(address,
-                          port,
-                          username,
-                          password,
-                          (proto == PROTO_TCP && secure ? PROTO_TLS : proto)) {}
-
-  bool operator==(const RelayServerConfig& o) const {
-    return type == o.type && ports == o.ports && credentials == o.credentials &&
-           priority == o.priority;
-  }
-  bool operator!=(const RelayServerConfig& o) const { return !(*this == o); }
-
-  RelayType type;
-  PortList ports;
-  RelayCredentials credentials;
-  int priority = 0;
-  TlsCertPolicy tls_cert_policy = TlsCertPolicy::TLS_CERT_POLICY_SECURE;
-  std::vector<std::string> tls_alpn_protocols;
-  std::vector<std::string> tls_elliptic_curves;
-};
-
-class PortAllocatorSession : public sigslot::has_slots<> {
- public:
-  // Content name passed in mostly for logging and debugging.
-  PortAllocatorSession(const std::string& content_name,
-                       int component,
-                       const std::string& ice_ufrag,
-                       const std::string& ice_pwd,
-                       uint32_t flags);
-
-  // Subclasses should clean up any ports created.
-  virtual ~PortAllocatorSession() {}
-
-  uint32_t flags() const { return flags_; }
-  void set_flags(uint32_t flags) { flags_ = flags; }
-  std::string content_name() const { return content_name_; }
-  int component() const { return component_; }
-  const std::string& ice_ufrag() const { return ice_ufrag_; }
-  const std::string& ice_pwd() const { return ice_pwd_; }
-  bool pooled() const { return ice_ufrag_.empty(); }
-
-  // Setting this filter should affect not only candidates gathered in the
-  // future, but candidates already gathered and ports already "ready",
-  // which would be returned by ReadyCandidates() and ReadyPorts().
-  //
-  // Default filter should be CF_ALL.
-  virtual void SetCandidateFilter(uint32_t filter) = 0;
-
-  // Starts gathering ports and ICE candidates.
-  virtual void StartGettingPorts() = 0;
-  // Completely stops gathering. Will not gather again unless StartGettingPorts
-  // is called again.
-  virtual void StopGettingPorts() = 0;
-  // Whether the session is actively getting ports.
-  virtual bool IsGettingPorts() = 0;
-
-  //
-  // NOTE: The group of methods below is only used for continual gathering.
-  //
-
-  // ClearGettingPorts should have the same immediate effect as
-  // StopGettingPorts, but if the implementation supports continual gathering,
-  // ClearGettingPorts allows additional ports/candidates to be gathered if the
-  // network conditions change.
-  virtual void ClearGettingPorts() = 0;
-  // Whether it is in the state where the existing gathering process is stopped,
-  // but new ones may be started (basically after calling ClearGettingPorts).
-  virtual bool IsCleared() const { return false; }
-  // Whether the session has completely stopped.
-  virtual bool IsStopped() const { return false; }
-  // Re-gathers candidates on networks that do not have any connections. More
-  // precisely, a network interface may have more than one IP addresses (e.g.,
-  // IPv4 and IPv6 addresses). Each address subnet will be used to create a
-  // network. Only if all networks of an interface have no connection, the
-  // implementation should start re-gathering on all networks of that interface.
-  virtual void RegatherOnFailedNetworks() {}
-  // Re-gathers candidates on all networks.
-  virtual void RegatherOnAllNetworks() {}
-
-  // Another way of getting the information provided by the signals below.
-  //
-  // Ports and candidates are not guaranteed to be in the same order as the
-  // signals were emitted in.
-  virtual std::vector<PortInterface*> ReadyPorts() const = 0;
-  virtual std::vector<Candidate> ReadyCandidates() const = 0;
-  virtual bool CandidatesAllocationDone() const = 0;
-  // Marks all ports in the current session as "pruned" so that they may be
-  // destroyed if no connection is using them.
-  virtual void PruneAllPorts() {}
-
-  sigslot::signal2<PortAllocatorSession*, PortInterface*> SignalPortReady;
-  // Fires this signal when the network of the ports failed (either because the
-  // interface is down, or because there is no connection on the interface),
-  // or when TURN ports are pruned because a higher-priority TURN port becomes
-  // ready(pairable).
-  sigslot::signal2<PortAllocatorSession*, const std::vector<PortInterface*>&>
-      SignalPortsPruned;
-  sigslot::signal2<PortAllocatorSession*,
-                   const std::vector<Candidate>&> SignalCandidatesReady;
-  // Candidates should be signaled to be removed when the port that generated
-  // the candidates is removed.
-  sigslot::signal2<PortAllocatorSession*, const std::vector<Candidate>&>
-      SignalCandidatesRemoved;
-  sigslot::signal1<PortAllocatorSession*> SignalCandidatesAllocationDone;
-
-  sigslot::signal2<PortAllocatorSession*, IceRegatheringReason>
-      SignalIceRegathering;
-
-  virtual uint32_t generation() { return generation_; }
-  virtual void set_generation(uint32_t generation) { generation_ = generation; }
-  sigslot::signal1<PortAllocatorSession*> SignalDestroyed;
-
- protected:
-  // This method is called when a pooled session (which doesn't have these
-  // properties initially) is returned by PortAllocator::TakePooledSession,
-  // and the content name, component, and ICE ufrag/pwd are updated.
-  //
-  // A subclass may need to override this method to perform additional actions,
-  // such as applying the updated information to ports and candidates.
-  virtual void UpdateIceParametersInternal() {}
-
-  // TODO(deadbeef): Get rid of these when everyone switches to ice_ufrag and
-  // ice_pwd.
-  const std::string& username() const { return ice_ufrag_; }
-  const std::string& password() const { return ice_pwd_; }
-
- private:
-  void SetIceParameters(const std::string& content_name,
-                        int component,
-                        const std::string& ice_ufrag,
-                        const std::string& ice_pwd) {
-    content_name_ = content_name;
-    component_ = component;
-    ice_ufrag_ = ice_ufrag;
-    ice_pwd_ = ice_pwd;
-    UpdateIceParametersInternal();
-  }
-
-  uint32_t flags_;
-  uint32_t generation_;
-  std::string content_name_;
-  int component_;
-  std::string ice_ufrag_;
-  std::string ice_pwd_;
-
-  // SetIceParameters is an implementation detail which only PortAllocator
-  // should be able to call.
-  friend class PortAllocator;
-};
-
-// Every method of PortAllocator (including the destructor) must be called on
-// the same thread, except for the constructor which may be called on any
-// thread.
-//
-// This allows constructing a PortAllocator subclass on one thread and
-// passing it into an object that uses it on a different thread.
-class PortAllocator : public sigslot::has_slots<> {
- public:
-  PortAllocator()
-      : flags_(kDefaultPortAllocatorFlags),
-        min_port_(0),
-        max_port_(0),
-        max_ipv6_networks_(kDefaultMaxIPv6Networks),
-        step_delay_(kDefaultStepDelay),
-        allow_tcp_listen_(true),
-        candidate_filter_(CF_ALL) {}
-
-  virtual ~PortAllocator() {}
-
-  // This should be called on the PortAllocator's thread before the
-  // PortAllocator is used. Subclasses may override this if necessary.
-  virtual void Initialize() {}
-
-  // Set STUN and TURN servers to be used in future sessions, and set
-  // candidate pool size, as described in JSEP.
-  //
-  // If the servers are changing, and the candidate pool size is nonzero, and
-  // FreezeCandidatePool hasn't been called, existing pooled sessions will be
-  // destroyed and new ones created.
-  //
-  // If the servers are not changing but the candidate pool size is, and
-  // FreezeCandidatePool hasn't been called, pooled sessions will be either
-  // created or destroyed as necessary.
-  //
-  // Returns true if the configuration could successfully be changed.
-  bool SetConfiguration(const ServerAddresses& stun_servers,
-                        const std::vector<RelayServerConfig>& turn_servers,
-                        int candidate_pool_size,
-                        bool prune_turn_ports);
-
-  const ServerAddresses& stun_servers() const { return stun_servers_; }
-
-  const std::vector<RelayServerConfig>& turn_servers() const {
-    return turn_servers_;
-  }
-
-  int candidate_pool_size() const { return candidate_pool_size_; }
-
-  // Sets the network types to ignore.
-  // Values are defined by the AdapterType enum.
-  // For instance, calling this with
-  // ADAPTER_TYPE_ETHERNET | ADAPTER_TYPE_LOOPBACK will ignore Ethernet and
-  // loopback interfaces.
-  virtual void SetNetworkIgnoreMask(int network_ignore_mask) = 0;
-
-  std::unique_ptr<PortAllocatorSession> CreateSession(
-      const std::string& content_name,
-      int component,
-      const std::string& ice_ufrag,
-      const std::string& ice_pwd);
-
-  // Get an available pooled session and set the transport information on it.
-  //
-  // Caller takes ownership of the returned session.
-  //
-  // If no pooled sessions are available, returns null.
-  std::unique_ptr<PortAllocatorSession> TakePooledSession(
-      const std::string& content_name,
-      int component,
-      const std::string& ice_ufrag,
-      const std::string& ice_pwd);
-
-  // Returns the next session that would be returned by TakePooledSession.
-  const PortAllocatorSession* GetPooledSession() const;
-
-  // After FreezeCandidatePool is called, changing the candidate pool size will
-  // no longer be allowed, and changing ICE servers will not cause pooled
-  // sessions to be recreated.
-  //
-  // Expected to be called when SetLocalDescription is called on a
-  // PeerConnection. Can be called safely on any thread as long as not
-  // simultaneously with SetConfiguration.
-  void FreezeCandidatePool();
-
-  // Discard any remaining pooled sessions.
-  void DiscardCandidatePool();
-
-  uint32_t flags() const { return flags_; }
-  void set_flags(uint32_t flags) { flags_ = flags; }
-
-  // These three methods are deprecated. If connections need to go through a
-  // proxy, the application should create a BasicPortAllocator given a custom
-  // PacketSocketFactory that creates proxy sockets.
-  const std::string& user_agent() const { return agent_; }
-  const rtc::ProxyInfo& proxy() const { return proxy_; }
-  void set_proxy(const std::string& agent, const rtc::ProxyInfo& proxy) {
-    agent_ = agent;
-    proxy_ = proxy;
-  }
-
-  // Gets/Sets the port range to use when choosing client ports.
-  int min_port() const { return min_port_; }
-  int max_port() const { return max_port_; }
-  bool SetPortRange(int min_port, int max_port) {
-    if (min_port > max_port) {
-      return false;
-    }
-
-    min_port_ = min_port;
-    max_port_ = max_port;
-    return true;
-  }
-
-  // Can be used to change the default numer of IPv6 network interfaces used
-  // (5). Can set to INT_MAX to effectively disable the limit.
-  //
-  // TODO(deadbeef): Applications shouldn't have to arbitrarily limit the
-  // number of available IPv6 network interfaces just because they could slow
-  // ICE down. We should work on making our ICE logic smarter (for example,
-  // prioritizing pinging connections that are most likely to work) so that
-  // every network interface can be used without impacting ICE's speed.
-  void set_max_ipv6_networks(int networks) { max_ipv6_networks_ = networks; }
-  int max_ipv6_networks() { return max_ipv6_networks_; }
-
-  uint32_t step_delay() const { return step_delay_; }
-  void set_step_delay(uint32_t delay) { step_delay_ = delay; }
-
-  bool allow_tcp_listen() const { return allow_tcp_listen_; }
-  void set_allow_tcp_listen(bool allow_tcp_listen) {
-    allow_tcp_listen_ = allow_tcp_listen;
-  }
-
-  uint32_t candidate_filter() { return candidate_filter_; }
-  void set_candidate_filter(uint32_t filter) {
-    candidate_filter_ = filter;
-  }
-
-  bool prune_turn_ports() const { return prune_turn_ports_; }
-
-  // Gets/Sets the Origin value used for WebRTC STUN requests.
-  const std::string& origin() const { return origin_; }
-  void set_origin(const std::string& origin) { origin_ = origin; }
-
-  void SetMetricsObserver(webrtc::MetricsObserverInterface* observer) {
-    metrics_observer_ = observer;
-  }
-
- protected:
-  virtual PortAllocatorSession* CreateSessionInternal(
-      const std::string& content_name,
-      int component,
-      const std::string& ice_ufrag,
-      const std::string& ice_pwd) = 0;
-
-  webrtc::MetricsObserverInterface* metrics_observer() {
-    return metrics_observer_;
-  }
-
-  const std::deque<std::unique_ptr<PortAllocatorSession>>& pooled_sessions() {
-    return pooled_sessions_;
-  }
-
-  uint32_t flags_;
-  std::string agent_;
-  rtc::ProxyInfo proxy_;
-  int min_port_;
-  int max_port_;
-  int max_ipv6_networks_;
-  uint32_t step_delay_;
-  bool allow_tcp_listen_;
-  uint32_t candidate_filter_;
-  std::string origin_;
-
- private:
-  ServerAddresses stun_servers_;
-  std::vector<RelayServerConfig> turn_servers_;
-  int candidate_pool_size_ = 0;  // Last value passed into SetConfiguration.
-  std::deque<std::unique_ptr<PortAllocatorSession>> pooled_sessions_;
-  bool candidate_pool_frozen_ = false;
-  bool prune_turn_ports_ = false;
-
-  webrtc::MetricsObserverInterface* metrics_observer_ = nullptr;
-};
-
-}  // namespace cricket
-
-#endif  // WEBRTC_P2P_BASE_PORTALLOCATOR_H_
diff --git a/p2p/base/portallocator_unittest.cc b/p2p/base/portallocator_unittest.cc
deleted file mode 100644
index 4845f7c..0000000
--- a/p2p/base/portallocator_unittest.cc
+++ /dev/null
@@ -1,277 +0,0 @@
-/*
- *  Copyright 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 <memory>
-
-#include "webrtc/p2p/base/fakeportallocator.h"
-#include "webrtc/p2p/base/portallocator.h"
-#include "webrtc/rtc_base/gunit.h"
-#include "webrtc/rtc_base/thread.h"
-#include "webrtc/rtc_base/virtualsocketserver.h"
-
-static const char kContentName[] = "test content";
-// Based on ICE_UFRAG_LENGTH
-static const char kIceUfrag[] = "UF00";
-// Based on ICE_PWD_LENGTH
-static const char kIcePwd[] = "TESTICEPWD00000000000000";
-static const char kTurnUsername[] = "test";
-static const char kTurnPassword[] = "test";
-
-class PortAllocatorTest : public testing::Test, public sigslot::has_slots<> {
- public:
-  PortAllocatorTest()
-      : vss_(new rtc::VirtualSocketServer()), main_(vss_.get()) {
-    allocator_.reset(
-        new cricket::FakePortAllocator(rtc::Thread::Current(), nullptr));
-  }
-
- protected:
-  void SetConfigurationWithPoolSize(int candidate_pool_size) {
-    EXPECT_TRUE(allocator_->SetConfiguration(
-        cricket::ServerAddresses(), std::vector<cricket::RelayServerConfig>(),
-        candidate_pool_size, false));
-  }
-
-  void SetConfigurationWithPoolSizeExpectFailure(int candidate_pool_size) {
-    EXPECT_FALSE(allocator_->SetConfiguration(
-        cricket::ServerAddresses(), std::vector<cricket::RelayServerConfig>(),
-        candidate_pool_size, false));
-  }
-
-  std::unique_ptr<cricket::FakePortAllocatorSession> CreateSession(
-      const std::string& content_name,
-      int component,
-      const std::string& ice_ufrag,
-      const std::string& ice_pwd) {
-    return std::unique_ptr<cricket::FakePortAllocatorSession>(
-        static_cast<cricket::FakePortAllocatorSession*>(
-            allocator_
-                ->CreateSession(content_name, component, ice_ufrag, ice_pwd)
-                .release()));
-  }
-
-  const cricket::FakePortAllocatorSession* GetPooledSession() const {
-    return static_cast<const cricket::FakePortAllocatorSession*>(
-        allocator_->GetPooledSession());
-  }
-
-  std::unique_ptr<cricket::FakePortAllocatorSession> TakePooledSession() {
-    return std::unique_ptr<cricket::FakePortAllocatorSession>(
-        static_cast<cricket::FakePortAllocatorSession*>(
-            allocator_->TakePooledSession(kContentName, 0, kIceUfrag, kIcePwd)
-                .release()));
-  }
-
-  int GetAllPooledSessionsReturnCount() {
-    int count = 0;
-    while (GetPooledSession()) {
-      TakePooledSession();
-      ++count;
-    }
-    return count;
-  }
-
-  std::unique_ptr<rtc::VirtualSocketServer> vss_;
-  rtc::AutoSocketServerThread main_;
-  std::unique_ptr<cricket::FakePortAllocator> allocator_;
-  rtc::SocketAddress stun_server_1{"11.11.11.11", 3478};
-  rtc::SocketAddress stun_server_2{"22.22.22.22", 3478};
-  cricket::RelayServerConfig turn_server_1{"11.11.11.11",      3478,
-                                           kTurnUsername,      kTurnPassword,
-                                           cricket::PROTO_UDP, false};
-  cricket::RelayServerConfig turn_server_2{"22.22.22.22",      3478,
-                                           kTurnUsername,      kTurnPassword,
-                                           cricket::PROTO_UDP, false};
-};
-
-TEST_F(PortAllocatorTest, TestDefaults) {
-  EXPECT_EQ(0UL, allocator_->stun_servers().size());
-  EXPECT_EQ(0UL, allocator_->turn_servers().size());
-  EXPECT_EQ(0, allocator_->candidate_pool_size());
-  EXPECT_EQ(0, GetAllPooledSessionsReturnCount());
-}
-
-// Call CreateSession and verify that the parameters passed in and the
-// candidate filter are applied as expected.
-TEST_F(PortAllocatorTest, CreateSession) {
-  allocator_->set_candidate_filter(cricket::CF_RELAY);
-  auto session = CreateSession(kContentName, 1, kIceUfrag, kIcePwd);
-  ASSERT_NE(nullptr, session);
-  EXPECT_EQ(cricket::CF_RELAY, session->candidate_filter());
-  EXPECT_EQ(kContentName, session->content_name());
-  EXPECT_EQ(1, session->component());
-  EXPECT_EQ(kIceUfrag, session->ice_ufrag());
-  EXPECT_EQ(kIcePwd, session->ice_pwd());
-}
-
-TEST_F(PortAllocatorTest, SetConfigurationUpdatesIceServers) {
-  cricket::ServerAddresses stun_servers_1 = {stun_server_1};
-  std::vector<cricket::RelayServerConfig> turn_servers_1 = {turn_server_1};
-  EXPECT_TRUE(
-      allocator_->SetConfiguration(stun_servers_1, turn_servers_1, 0, false));
-  EXPECT_EQ(stun_servers_1, allocator_->stun_servers());
-  EXPECT_EQ(turn_servers_1, allocator_->turn_servers());
-
-  // Update with a different set of servers.
-  cricket::ServerAddresses stun_servers_2 = {stun_server_2};
-  std::vector<cricket::RelayServerConfig> turn_servers_2 = {turn_server_2};
-  EXPECT_TRUE(
-      allocator_->SetConfiguration(stun_servers_2, turn_servers_2, 0, false));
-  EXPECT_EQ(stun_servers_2, allocator_->stun_servers());
-  EXPECT_EQ(turn_servers_2, allocator_->turn_servers());
-}
-
-TEST_F(PortAllocatorTest, SetConfigurationUpdatesCandidatePoolSize) {
-  SetConfigurationWithPoolSize(2);
-  EXPECT_EQ(2, allocator_->candidate_pool_size());
-  SetConfigurationWithPoolSize(3);
-  EXPECT_EQ(3, allocator_->candidate_pool_size());
-  SetConfigurationWithPoolSize(1);
-  EXPECT_EQ(1, allocator_->candidate_pool_size());
-  SetConfigurationWithPoolSize(4);
-  EXPECT_EQ(4, allocator_->candidate_pool_size());
-}
-
-// A negative pool size should just be treated as zero.
-TEST_F(PortAllocatorTest, SetConfigurationWithNegativePoolSizeFails) {
-  SetConfigurationWithPoolSizeExpectFailure(-1);
-}
-
-// Test that if the candidate pool size is nonzero, pooled sessions are
-// created, and StartGettingPorts is called on them.
-TEST_F(PortAllocatorTest, SetConfigurationCreatesPooledSessions) {
-  SetConfigurationWithPoolSize(2);
-  auto session_1 = TakePooledSession();
-  auto session_2 = TakePooledSession();
-  ASSERT_NE(nullptr, session_1.get());
-  ASSERT_NE(nullptr, session_2.get());
-  EXPECT_EQ(1, session_1->port_config_count());
-  EXPECT_EQ(1, session_2->port_config_count());
-  EXPECT_EQ(0, GetAllPooledSessionsReturnCount());
-}
-
-// Test that if the candidate pool size is increased, pooled sessions are
-// created as necessary.
-TEST_F(PortAllocatorTest, SetConfigurationCreatesMorePooledSessions) {
-  SetConfigurationWithPoolSize(1);
-  SetConfigurationWithPoolSize(2);
-  EXPECT_EQ(2, GetAllPooledSessionsReturnCount());
-}
-
-// Test that if the candidate pool size is reduced, extra sessions are
-// destroyed.
-TEST_F(PortAllocatorTest, SetConfigurationDestroysPooledSessions) {
-  SetConfigurationWithPoolSize(2);
-  SetConfigurationWithPoolSize(1);
-  EXPECT_EQ(1, GetAllPooledSessionsReturnCount());
-}
-
-// According to JSEP, existing pooled sessions should be destroyed and new
-// ones created when the ICE servers change.
-TEST_F(PortAllocatorTest,
-       SetConfigurationRecreatesPooledSessionsWhenIceServersChange) {
-  cricket::ServerAddresses stun_servers_1 = {stun_server_1};
-  std::vector<cricket::RelayServerConfig> turn_servers_1 = {turn_server_1};
-  allocator_->SetConfiguration(stun_servers_1, turn_servers_1, 1, false);
-  EXPECT_EQ(stun_servers_1, allocator_->stun_servers());
-  EXPECT_EQ(turn_servers_1, allocator_->turn_servers());
-
-  // Update with a different set of servers (and also change pool size).
-  cricket::ServerAddresses stun_servers_2 = {stun_server_2};
-  std::vector<cricket::RelayServerConfig> turn_servers_2 = {turn_server_2};
-  allocator_->SetConfiguration(stun_servers_2, turn_servers_2, 2, false);
-  EXPECT_EQ(stun_servers_2, allocator_->stun_servers());
-  EXPECT_EQ(turn_servers_2, allocator_->turn_servers());
-  auto session_1 = TakePooledSession();
-  auto session_2 = TakePooledSession();
-  ASSERT_NE(nullptr, session_1.get());
-  ASSERT_NE(nullptr, session_2.get());
-  EXPECT_EQ(stun_servers_2, session_1->stun_servers());
-  EXPECT_EQ(turn_servers_2, session_1->turn_servers());
-  EXPECT_EQ(stun_servers_2, session_2->stun_servers());
-  EXPECT_EQ(turn_servers_2, session_2->turn_servers());
-  EXPECT_EQ(0, GetAllPooledSessionsReturnCount());
-}
-
-// According to JSEP, after SetLocalDescription, setting different ICE servers
-// will not cause the pool to be refilled. This is implemented by the
-// PeerConnection calling FreezeCandidatePool when a local description is set.
-TEST_F(PortAllocatorTest,
-       SetConfigurationDoesNotRecreatePooledSessionsAfterFreezeCandidatePool) {
-  cricket::ServerAddresses stun_servers_1 = {stun_server_1};
-  std::vector<cricket::RelayServerConfig> turn_servers_1 = {turn_server_1};
-  allocator_->SetConfiguration(stun_servers_1, turn_servers_1, 1, false);
-  EXPECT_EQ(stun_servers_1, allocator_->stun_servers());
-  EXPECT_EQ(turn_servers_1, allocator_->turn_servers());
-
-  // Update with a different set of servers, but first freeze the pool.
-  allocator_->FreezeCandidatePool();
-  cricket::ServerAddresses stun_servers_2 = {stun_server_2};
-  std::vector<cricket::RelayServerConfig> turn_servers_2 = {turn_server_2};
-  allocator_->SetConfiguration(stun_servers_2, turn_servers_2, 2, false);
-  EXPECT_EQ(stun_servers_2, allocator_->stun_servers());
-  EXPECT_EQ(turn_servers_2, allocator_->turn_servers());
-  auto session = TakePooledSession();
-  ASSERT_NE(nullptr, session.get());
-  EXPECT_EQ(stun_servers_1, session->stun_servers());
-  EXPECT_EQ(turn_servers_1, session->turn_servers());
-  EXPECT_EQ(0, GetAllPooledSessionsReturnCount());
-}
-
-TEST_F(PortAllocatorTest, GetPooledSessionReturnsNextSession) {
-  SetConfigurationWithPoolSize(2);
-  auto peeked_session_1 = GetPooledSession();
-  auto session_1 = TakePooledSession();
-  EXPECT_EQ(session_1.get(), peeked_session_1);
-  auto peeked_session_2 = GetPooledSession();
-  auto session_2 = TakePooledSession();
-  EXPECT_EQ(session_2.get(), peeked_session_2);
-}
-
-// Verify that subclasses of PortAllocatorSession are given a chance to update
-// ICE parameters when TakePooledSession is called, and the base class updates
-// the info itself.
-TEST_F(PortAllocatorTest, TakePooledSessionUpdatesIceParameters) {
-  SetConfigurationWithPoolSize(1);
-  auto peeked_session = GetPooledSession();
-  ASSERT_NE(nullptr, peeked_session);
-  EXPECT_EQ(0, peeked_session->transport_info_update_count());
-  std::unique_ptr<cricket::FakePortAllocatorSession> session(
-      static_cast<cricket::FakePortAllocatorSession*>(
-          allocator_->TakePooledSession(kContentName, 1, kIceUfrag, kIcePwd)
-              .release()));
-  EXPECT_EQ(1, session->transport_info_update_count());
-  EXPECT_EQ(kContentName, session->content_name());
-  EXPECT_EQ(1, session->component());
-  EXPECT_EQ(kIceUfrag, session->ice_ufrag());
-  EXPECT_EQ(kIcePwd, session->ice_pwd());
-}
-
-// According to JSEP, candidate filtering should be done when the pooled
-// candidates are surfaced to the application. This means when a pooled
-// session is taken. So a pooled session should gather candidates
-// unfiltered until it's returned by TakePooledSession.
-TEST_F(PortAllocatorTest, TakePooledSessionUpdatesCandidateFilter) {
-  allocator_->set_candidate_filter(cricket::CF_RELAY);
-  SetConfigurationWithPoolSize(1);
-  auto peeked_session = GetPooledSession();
-  ASSERT_NE(nullptr, peeked_session);
-  EXPECT_EQ(cricket::CF_ALL, peeked_session->candidate_filter());
-  auto session = TakePooledSession();
-  EXPECT_EQ(cricket::CF_RELAY, session->candidate_filter());
-}
-
-// Verify that after DiscardCandidatePool, TakePooledSession doesn't return
-// anything.
-TEST_F(PortAllocatorTest, DiscardCandidatePool) {
-  SetConfigurationWithPoolSize(1);
-  allocator_->DiscardCandidatePool();
-  EXPECT_EQ(0, GetAllPooledSessionsReturnCount());
-}
diff --git a/p2p/base/portinterface.h b/p2p/base/portinterface.h
deleted file mode 100644
index 7cb8429..0000000
--- a/p2p/base/portinterface.h
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- *  Copyright 2012 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_P2P_BASE_PORTINTERFACE_H_
-#define WEBRTC_P2P_BASE_PORTINTERFACE_H_
-
-#include <string>
-
-#include "webrtc/p2p/base/jseptransport.h"
-#include "webrtc/rtc_base/asyncpacketsocket.h"
-#include "webrtc/rtc_base/socketaddress.h"
-
-namespace rtc {
-class Network;
-struct PacketOptions;
-}
-
-namespace cricket {
-class Connection;
-class IceMessage;
-class StunMessage;
-
-enum ProtocolType {
-  PROTO_UDP,
-  PROTO_TCP,
-  PROTO_SSLTCP,  // Pseudo-TLS.
-  PROTO_TLS,
-  PROTO_LAST = PROTO_TLS
-};
-
-// Defines the interface for a port, which represents a local communication
-// mechanism that can be used to create connections to similar mechanisms of
-// the other client. Various types of ports will implement this interface.
-class PortInterface {
- public:
-  virtual ~PortInterface() {}
-
-  virtual const std::string& Type() const = 0;
-  virtual rtc::Network* Network() const = 0;
-
-  // Methods to set/get ICE role and tiebreaker values.
-  virtual void SetIceRole(IceRole role) = 0;
-  virtual IceRole GetIceRole() const = 0;
-
-  virtual void SetIceTiebreaker(uint64_t tiebreaker) = 0;
-  virtual uint64_t IceTiebreaker() const = 0;
-
-  virtual bool SharedSocket() const = 0;
-
-  virtual bool SupportsProtocol(const std::string& protocol) const = 0;
-
-  // PrepareAddress will attempt to get an address for this port that other
-  // clients can send to.  It may take some time before the address is ready.
-  // Once it is ready, we will send SignalAddressReady.  If errors are
-  // preventing the port from getting an address, it may send
-  // SignalAddressError.
-  virtual void PrepareAddress() = 0;
-
-  // Returns the connection to the given address or NULL if none exists.
-  virtual Connection* GetConnection(
-      const rtc::SocketAddress& remote_addr) = 0;
-
-  // Creates a new connection to the given address.
-  enum CandidateOrigin { ORIGIN_THIS_PORT, ORIGIN_OTHER_PORT, ORIGIN_MESSAGE };
-  virtual Connection* CreateConnection(
-      const Candidate& remote_candidate, CandidateOrigin origin) = 0;
-
-  // Functions on the underlying socket(s).
-  virtual int SetOption(rtc::Socket::Option opt, int value) = 0;
-  virtual int GetOption(rtc::Socket::Option opt, int* value) = 0;
-  virtual int GetError() = 0;
-
-  virtual ProtocolType GetProtocol() const = 0;
-
-  virtual const std::vector<Candidate>& Candidates() const = 0;
-
-  // Sends the given packet to the given address, provided that the address is
-  // that of a connection or an address that has sent to us already.
-  virtual int SendTo(const void* data, size_t size,
-                     const rtc::SocketAddress& addr,
-                     const rtc::PacketOptions& options, bool payload) = 0;
-
-  // Indicates that we received a successful STUN binding request from an
-  // address that doesn't correspond to any current connection.  To turn this
-  // into a real connection, call CreateConnection.
-  sigslot::signal6<PortInterface*, const rtc::SocketAddress&,
-                   ProtocolType, IceMessage*, const std::string&,
-                   bool> SignalUnknownAddress;
-
-  // Sends a response message (normal or error) to the given request.  One of
-  // these methods should be called as a response to SignalUnknownAddress.
-  // NOTE: You MUST call CreateConnection BEFORE SendBindingResponse.
-  virtual void SendBindingResponse(StunMessage* request,
-                                   const rtc::SocketAddress& addr) = 0;
-  virtual void SendBindingErrorResponse(
-      StunMessage* request, const rtc::SocketAddress& addr,
-      int error_code, const std::string& reason) = 0;
-
-  // Signaled when this port decides to delete itself because it no longer has
-  // any usefulness.
-  sigslot::signal1<PortInterface*> SignalDestroyed;
-
-  // Signaled when Port discovers ice role conflict with the peer.
-  sigslot::signal1<PortInterface*> SignalRoleConflict;
-
-  // Normally, packets arrive through a connection (or they result signaling of
-  // unknown address).  Calling this method turns off delivery of packets
-  // through their respective connection and instead delivers every packet
-  // through this port.
-  virtual void EnablePortPackets() = 0;
-  sigslot::signal4<PortInterface*, const char*, size_t,
-                   const rtc::SocketAddress&> SignalReadPacket;
-
-  // Emitted each time a packet is sent on this port.
-  sigslot::signal1<const rtc::SentPacket&> SignalSentPacket;
-
-  virtual std::string ToString() const = 0;
-
- protected:
-  PortInterface() {}
-};
-
-}  // namespace cricket
-
-#endif  // WEBRTC_P2P_BASE_PORTINTERFACE_H_
diff --git a/p2p/base/pseudotcp.cc b/p2p/base/pseudotcp.cc
deleted file mode 100644
index 55935e3..0000000
--- a/p2p/base/pseudotcp.cc
+++ /dev/null
@@ -1,1282 +0,0 @@
-/*
- *  Copyright 2004 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/p2p/base/pseudotcp.h"
-
-#include <stdio.h>
-#include <stdlib.h>
-
-#include <algorithm>
-#include <memory>
-#include <set>
-
-#include "webrtc/rtc_base/arraysize.h"
-#include "webrtc/rtc_base/basictypes.h"
-#include "webrtc/rtc_base/bytebuffer.h"
-#include "webrtc/rtc_base/byteorder.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/safe_minmax.h"
-#include "webrtc/rtc_base/socket.h"
-#include "webrtc/rtc_base/stringutils.h"
-#include "webrtc/rtc_base/timeutils.h"
-
-// The following logging is for detailed (packet-level) analysis only.
-#define _DBG_NONE     0
-#define _DBG_NORMAL   1
-#define _DBG_VERBOSE  2
-#define _DEBUGMSG _DBG_NONE
-
-namespace cricket {
-
-//////////////////////////////////////////////////////////////////////
-// Network Constants
-//////////////////////////////////////////////////////////////////////
-
-// Standard MTUs
-const uint16_t PACKET_MAXIMUMS[] = {
-    65535,  // Theoretical maximum, Hyperchannel
-    32000,  // Nothing
-    17914,  // 16Mb IBM Token Ring
-    8166,   // IEEE 802.4
-    // 4464,   // IEEE 802.5 (4Mb max)
-    4352,  // FDDI
-    // 2048,   // Wideband Network
-    2002,  // IEEE 802.5 (4Mb recommended)
-    // 1536,   // Expermental Ethernet Networks
-    // 1500,   // Ethernet, Point-to-Point (default)
-    1492,  // IEEE 802.3
-    1006,  // SLIP, ARPANET
-    // 576,    // X.25 Networks
-    // 544,    // DEC IP Portal
-    // 512,    // NETBIOS
-    508,  // IEEE 802/Source-Rt Bridge, ARCNET
-    296,  // Point-to-Point (low delay)
-    // 68,     // Official minimum
-    0,  // End of list marker
-};
-
-const uint32_t MAX_PACKET = 65535;
-// Note: we removed lowest level because packet overhead was larger!
-const uint32_t MIN_PACKET = 296;
-
-const uint32_t IP_HEADER_SIZE = 20;  // (+ up to 40 bytes of options?)
-const uint32_t UDP_HEADER_SIZE = 8;
-// TODO: Make JINGLE_HEADER_SIZE transparent to this code?
-const uint32_t JINGLE_HEADER_SIZE = 64;  // when relay framing is in use
-
-// Default size for receive and send buffer.
-const uint32_t DEFAULT_RCV_BUF_SIZE = 60 * 1024;
-const uint32_t DEFAULT_SND_BUF_SIZE = 90 * 1024;
-
-//////////////////////////////////////////////////////////////////////
-// Global Constants and Functions
-//////////////////////////////////////////////////////////////////////
-//
-//    0                   1                   2                   3
-//    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
-//    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//  0 |                      Conversation Number                      |
-//    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//  4 |                        Sequence Number                        |
-//    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//  8 |                     Acknowledgment Number                     |
-//    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//    |               |   |U|A|P|R|S|F|                               |
-// 12 |    Control    |   |R|C|S|S|Y|I|            Window             |
-//    |               |   |G|K|H|T|N|N|                               |
-//    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-// 16 |                       Timestamp sending                       |
-//    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-// 20 |                      Timestamp receiving                      |
-//    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-// 24 |                             data                              |
-//    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//
-//////////////////////////////////////////////////////////////////////
-
-#define PSEUDO_KEEPALIVE 0
-
-const uint32_t HEADER_SIZE = 24;
-const uint32_t PACKET_OVERHEAD =
-    HEADER_SIZE + UDP_HEADER_SIZE + IP_HEADER_SIZE + JINGLE_HEADER_SIZE;
-
-const uint32_t MIN_RTO =
-    250;  // 250 ms (RFC1122, Sec 4.2.3.1 "fractions of a second")
-const uint32_t DEF_RTO = 3000;       // 3 seconds (RFC1122, Sec 4.2.3.1)
-const uint32_t MAX_RTO = 60000;      // 60 seconds
-const uint32_t DEF_ACK_DELAY = 100;  // 100 milliseconds
-
-const uint8_t FLAG_CTL = 0x02;
-const uint8_t FLAG_RST = 0x04;
-
-const uint8_t CTL_CONNECT = 0;
-
-// TCP options.
-const uint8_t TCP_OPT_EOL = 0;        // End of list.
-const uint8_t TCP_OPT_NOOP = 1;       // No-op.
-const uint8_t TCP_OPT_MSS = 2;        // Maximum segment size.
-const uint8_t TCP_OPT_WND_SCALE = 3;  // Window scale factor.
-
-const long DEFAULT_TIMEOUT = 4000; // If there are no pending clocks, wake up every 4 seconds
-const long CLOSED_TIMEOUT = 60 * 1000; // If the connection is closed, once per minute
-
-#if PSEUDO_KEEPALIVE
-// !?! Rethink these times
-const uint32_t IDLE_PING =
-    20 *
-    1000;  // 20 seconds (note: WinXP SP2 firewall udp timeout is 90 seconds)
-const uint32_t IDLE_TIMEOUT = 90 * 1000;  // 90 seconds;
-#endif // PSEUDO_KEEPALIVE
-
-//////////////////////////////////////////////////////////////////////
-// Helper Functions
-//////////////////////////////////////////////////////////////////////
-
-inline void long_to_bytes(uint32_t val, void* buf) {
-  *static_cast<uint32_t*>(buf) = rtc::HostToNetwork32(val);
-}
-
-inline void short_to_bytes(uint16_t val, void* buf) {
-  *static_cast<uint16_t*>(buf) = rtc::HostToNetwork16(val);
-}
-
-inline uint32_t bytes_to_long(const void* buf) {
-  return rtc::NetworkToHost32(*static_cast<const uint32_t*>(buf));
-}
-
-inline uint16_t bytes_to_short(const void* buf) {
-  return rtc::NetworkToHost16(*static_cast<const uint16_t*>(buf));
-}
-
-//////////////////////////////////////////////////////////////////////
-// Debugging Statistics
-//////////////////////////////////////////////////////////////////////
-
-#if 0  // Not used yet
-
-enum Stat {
-  S_SENT_PACKET,   // All packet sends
-  S_RESENT_PACKET, // All packet sends that are retransmits
-  S_RECV_PACKET,   // All packet receives
-  S_RECV_NEW,      // All packet receives that are too new
-  S_RECV_OLD,      // All packet receives that are too old
-  S_NUM_STATS
-};
-
-const char* const STAT_NAMES[S_NUM_STATS] = {
-  "snt",
-  "snt-r",
-  "rcv"
-  "rcv-n",
-  "rcv-o"
-};
-
-int g_stats[S_NUM_STATS];
-inline void Incr(Stat s) { ++g_stats[s]; }
-void ReportStats() {
-  char buffer[256];
-  size_t len = 0;
-  for (int i = 0; i < S_NUM_STATS; ++i) {
-    len += rtc::sprintfn(buffer, arraysize(buffer), "%s%s:%d",
-                               (i == 0) ? "" : ",", STAT_NAMES[i], g_stats[i]);
-    g_stats[i] = 0;
-  }
-  LOG(LS_INFO) << "Stats[" << buffer << "]";
-}
-
-#endif
-
-//////////////////////////////////////////////////////////////////////
-// PseudoTcp
-//////////////////////////////////////////////////////////////////////
-
-uint32_t PseudoTcp::Now() {
-#if 0  // Use this to synchronize timers with logging timestamps (easier debug)
-  return static_cast<uint32_t>(rtc::TimeSince(StartTime()));
-#else
-  return rtc::Time32();
-#endif
-}
-
-PseudoTcp::PseudoTcp(IPseudoTcpNotify* notify, uint32_t conv)
-    : m_notify(notify),
-      m_shutdown(SD_NONE),
-      m_error(0),
-      m_rbuf_len(DEFAULT_RCV_BUF_SIZE),
-      m_rbuf(m_rbuf_len),
-      m_sbuf_len(DEFAULT_SND_BUF_SIZE),
-      m_sbuf(m_sbuf_len) {
-  // Sanity check on buffer sizes (needed for OnTcpWriteable notification logic)
-  RTC_DCHECK(m_rbuf_len + MIN_PACKET < m_sbuf_len);
-
-  uint32_t now = Now();
-
-  m_state = TCP_LISTEN;
-  m_conv = conv;
-  m_rcv_wnd = m_rbuf_len;
-  m_rwnd_scale = m_swnd_scale = 0;
-  m_snd_nxt = 0;
-  m_snd_wnd = 1;
-  m_snd_una = m_rcv_nxt = 0;
-  m_bReadEnable = true;
-  m_bWriteEnable = false;
-  m_t_ack = 0;
-
-  m_msslevel = 0;
-  m_largest = 0;
-  RTC_DCHECK(MIN_PACKET > PACKET_OVERHEAD);
-  m_mss = MIN_PACKET - PACKET_OVERHEAD;
-  m_mtu_advise = MAX_PACKET;
-
-  m_rto_base = 0;
-
-  m_cwnd = 2 * m_mss;
-  m_ssthresh = m_rbuf_len;
-  m_lastrecv = m_lastsend = m_lasttraffic = now;
-  m_bOutgoing = false;
-
-  m_dup_acks = 0;
-  m_recover = 0;
-
-  m_ts_recent = m_ts_lastack = 0;
-
-  m_rx_rto = DEF_RTO;
-  m_rx_srtt = m_rx_rttvar = 0;
-
-  m_use_nagling = true;
-  m_ack_delay = DEF_ACK_DELAY;
-  m_support_wnd_scale = true;
-}
-
-PseudoTcp::~PseudoTcp() {
-}
-
-int PseudoTcp::Connect() {
-  if (m_state != TCP_LISTEN) {
-    m_error = EINVAL;
-    return -1;
-  }
-
-  m_state = TCP_SYN_SENT;
-  LOG(LS_INFO) << "State: TCP_SYN_SENT";
-
-  queueConnectMessage();
-  attemptSend();
-
-  return 0;
-}
-
-void PseudoTcp::NotifyMTU(uint16_t mtu) {
-  m_mtu_advise = mtu;
-  if (m_state == TCP_ESTABLISHED) {
-    adjustMTU();
-  }
-}
-
-void PseudoTcp::NotifyClock(uint32_t now) {
-  if (m_state == TCP_CLOSED)
-    return;
-
-    // Check if it's time to retransmit a segment
-  if (m_rto_base && (rtc::TimeDiff32(m_rto_base + m_rx_rto, now) <= 0)) {
-    if (m_slist.empty()) {
-      RTC_NOTREACHED();
-    } else {
-      // Note: (m_slist.front().xmit == 0)) {
-      // retransmit segments
-#if _DEBUGMSG >= _DBG_NORMAL
-      LOG(LS_INFO) << "timeout retransmit (rto: " << m_rx_rto
-                   << ") (rto_base: " << m_rto_base
-                   << ") (now: " << now
-                   << ") (dup_acks: " << static_cast<unsigned>(m_dup_acks)
-                   << ")";
-#endif // _DEBUGMSG
-      if (!transmit(m_slist.begin(), now)) {
-        closedown(ECONNABORTED);
-        return;
-      }
-
-      uint32_t nInFlight = m_snd_nxt - m_snd_una;
-      m_ssthresh = std::max(nInFlight / 2, 2 * m_mss);
-      //LOG(LS_INFO) << "m_ssthresh: " << m_ssthresh << "  nInFlight: " << nInFlight << "  m_mss: " << m_mss;
-      m_cwnd = m_mss;
-
-      // Back off retransmit timer.  Note: the limit is lower when connecting.
-      uint32_t rto_limit = (m_state < TCP_ESTABLISHED) ? DEF_RTO : MAX_RTO;
-      m_rx_rto = std::min(rto_limit, m_rx_rto * 2);
-      m_rto_base = now;
-    }
-  }
-
-  // Check if it's time to probe closed windows
-  if ((m_snd_wnd == 0) && (rtc::TimeDiff32(m_lastsend + m_rx_rto, now) <= 0)) {
-    if (rtc::TimeDiff32(now, m_lastrecv) >= 15000) {
-      closedown(ECONNABORTED);
-      return;
-    }
-
-    // probe the window
-    packet(m_snd_nxt - 1, 0, 0, 0);
-    m_lastsend = now;
-
-    // back off retransmit timer
-    m_rx_rto = std::min(MAX_RTO, m_rx_rto * 2);
-  }
-
-  // Check if it's time to send delayed acks
-  if (m_t_ack && (rtc::TimeDiff32(m_t_ack + m_ack_delay, now) <= 0)) {
-    packet(m_snd_nxt, 0, 0, 0);
-  }
-
-#if PSEUDO_KEEPALIVE
-  // Check for idle timeout
-  if ((m_state == TCP_ESTABLISHED) &&
-      (TimeDiff32(m_lastrecv + IDLE_TIMEOUT, now) <= 0)) {
-    closedown(ECONNABORTED);
-    return;
-  }
-
-  // Check for ping timeout (to keep udp mapping open)
-  if ((m_state == TCP_ESTABLISHED) &&
-      (TimeDiff32(m_lasttraffic + (m_bOutgoing ? IDLE_PING * 3 / 2 : IDLE_PING),
-                  now) <= 0)) {
-    packet(m_snd_nxt, 0, 0, 0);
-  }
-#endif // PSEUDO_KEEPALIVE
-}
-
-bool PseudoTcp::NotifyPacket(const char* buffer, size_t len) {
-  if (len > MAX_PACKET) {
-    LOG_F(WARNING) << "packet too large";
-    return false;
-  }
-  return parse(reinterpret_cast<const uint8_t*>(buffer), uint32_t(len));
-}
-
-bool PseudoTcp::GetNextClock(uint32_t now, long& timeout) {
-  return clock_check(now, timeout);
-}
-
-void PseudoTcp::GetOption(Option opt, int* value) {
-  if (opt == OPT_NODELAY) {
-    *value = m_use_nagling ? 0 : 1;
-  } else if (opt == OPT_ACKDELAY) {
-    *value = m_ack_delay;
-  } else if (opt == OPT_SNDBUF) {
-    *value = m_sbuf_len;
-  } else if (opt == OPT_RCVBUF) {
-    *value = m_rbuf_len;
-  } else {
-    RTC_NOTREACHED();
-  }
-}
-void PseudoTcp::SetOption(Option opt, int value) {
-  if (opt == OPT_NODELAY) {
-    m_use_nagling = value == 0;
-  } else if (opt == OPT_ACKDELAY) {
-    m_ack_delay = value;
-  } else if (opt == OPT_SNDBUF) {
-    RTC_DCHECK(m_state == TCP_LISTEN);
-    resizeSendBuffer(value);
-  } else if (opt == OPT_RCVBUF) {
-    RTC_DCHECK(m_state == TCP_LISTEN);
-    resizeReceiveBuffer(value);
-  } else {
-    RTC_NOTREACHED();
-  }
-}
-
-uint32_t PseudoTcp::GetCongestionWindow() const {
-  return m_cwnd;
-}
-
-uint32_t PseudoTcp::GetBytesInFlight() const {
-  return m_snd_nxt - m_snd_una;
-}
-
-uint32_t PseudoTcp::GetBytesBufferedNotSent() const {
-  size_t buffered_bytes = 0;
-  m_sbuf.GetBuffered(&buffered_bytes);
-  return static_cast<uint32_t>(m_snd_una + buffered_bytes - m_snd_nxt);
-}
-
-uint32_t PseudoTcp::GetRoundTripTimeEstimateMs() const {
-  return m_rx_srtt;
-}
-
-//
-// IPStream Implementation
-//
-
-int PseudoTcp::Recv(char* buffer, size_t len) {
-  if (m_state != TCP_ESTABLISHED) {
-    m_error = ENOTCONN;
-    return SOCKET_ERROR;
-  }
-
-  size_t read = 0;
-  rtc::StreamResult result = m_rbuf.Read(buffer, len, &read, NULL);
-
-  // If there's no data in |m_rbuf|.
-  if (result == rtc::SR_BLOCK) {
-    m_bReadEnable = true;
-    m_error = EWOULDBLOCK;
-    return SOCKET_ERROR;
-  }
-  RTC_DCHECK(result == rtc::SR_SUCCESS);
-
-  size_t available_space = 0;
-  m_rbuf.GetWriteRemaining(&available_space);
-
-  if (uint32_t(available_space) - m_rcv_wnd >=
-      std::min<uint32_t>(m_rbuf_len / 2, m_mss)) {
-    // TODO(jbeda): !?! Not sure about this was closed business
-    bool bWasClosed = (m_rcv_wnd == 0);
-    m_rcv_wnd = static_cast<uint32_t>(available_space);
-
-    if (bWasClosed) {
-      attemptSend(sfImmediateAck);
-    }
-  }
-
-  return static_cast<int>(read);
-}
-
-int PseudoTcp::Send(const char* buffer, size_t len) {
-  if (m_state != TCP_ESTABLISHED) {
-    m_error = ENOTCONN;
-    return SOCKET_ERROR;
-  }
-
-  size_t available_space = 0;
-  m_sbuf.GetWriteRemaining(&available_space);
-
-  if (!available_space) {
-    m_bWriteEnable = true;
-    m_error = EWOULDBLOCK;
-    return SOCKET_ERROR;
-  }
-
-  int written = queue(buffer, uint32_t(len), false);
-  attemptSend();
-  return written;
-}
-
-void PseudoTcp::Close(bool force) {
-  LOG_F(LS_VERBOSE) << "(" << (force ? "true" : "false") << ")";
-  m_shutdown = force ? SD_FORCEFUL : SD_GRACEFUL;
-}
-
-int PseudoTcp::GetError() {
-  return m_error;
-}
-
-//
-// Internal Implementation
-//
-
-uint32_t PseudoTcp::queue(const char* data, uint32_t len, bool bCtrl) {
-  size_t available_space = 0;
-  m_sbuf.GetWriteRemaining(&available_space);
-
-  if (len > static_cast<uint32_t>(available_space)) {
-    RTC_DCHECK(!bCtrl);
-    len = static_cast<uint32_t>(available_space);
-  }
-
-  // We can concatenate data if the last segment is the same type
-  // (control v. regular data), and has not been transmitted yet
-  if (!m_slist.empty() && (m_slist.back().bCtrl == bCtrl) &&
-      (m_slist.back().xmit == 0)) {
-    m_slist.back().len += len;
-  } else {
-    size_t snd_buffered = 0;
-    m_sbuf.GetBuffered(&snd_buffered);
-    SSegment sseg(static_cast<uint32_t>(m_snd_una + snd_buffered), len, bCtrl);
-    m_slist.push_back(sseg);
-  }
-
-  size_t written = 0;
-  m_sbuf.Write(data, len, &written, NULL);
-  return static_cast<uint32_t>(written);
-}
-
-IPseudoTcpNotify::WriteResult PseudoTcp::packet(uint32_t seq,
-                                                uint8_t flags,
-                                                uint32_t offset,
-                                                uint32_t len) {
-  RTC_DCHECK(HEADER_SIZE + len <= MAX_PACKET);
-
-  uint32_t now = Now();
-
-  std::unique_ptr<uint8_t[]> buffer(new uint8_t[MAX_PACKET]);
-  long_to_bytes(m_conv, buffer.get());
-  long_to_bytes(seq, buffer.get() + 4);
-  long_to_bytes(m_rcv_nxt, buffer.get() + 8);
-  buffer[12] = 0;
-  buffer[13] = flags;
-  short_to_bytes(static_cast<uint16_t>(m_rcv_wnd >> m_rwnd_scale),
-                 buffer.get() + 14);
-
-  // Timestamp computations
-  long_to_bytes(now, buffer.get() + 16);
-  long_to_bytes(m_ts_recent, buffer.get() + 20);
-  m_ts_lastack = m_rcv_nxt;
-
-  if (len) {
-    size_t bytes_read = 0;
-    rtc::StreamResult result = m_sbuf.ReadOffset(
-        buffer.get() + HEADER_SIZE, len, offset, &bytes_read);
-    RTC_DCHECK(result == rtc::SR_SUCCESS);
-    RTC_DCHECK(static_cast<uint32_t>(bytes_read) == len);
-  }
-
-#if _DEBUGMSG >= _DBG_VERBOSE
-  LOG(LS_INFO) << "<-- <CONV=" << m_conv
-               << "><FLG=" << static_cast<unsigned>(flags)
-               << "><SEQ=" << seq << ":" << seq + len
-               << "><ACK=" << m_rcv_nxt
-               << "><WND=" << m_rcv_wnd
-               << "><TS="  << (now % 10000)
-               << "><TSR=" << (m_ts_recent % 10000)
-               << "><LEN=" << len << ">";
-#endif // _DEBUGMSG
-
-  IPseudoTcpNotify::WriteResult wres = m_notify->TcpWritePacket(
-      this, reinterpret_cast<char *>(buffer.get()), len + HEADER_SIZE);
-  // Note: When len is 0, this is an ACK packet.  We don't read the return value for those,
-  // and thus we won't retry.  So go ahead and treat the packet as a success (basically simulate
-  // as if it were dropped), which will prevent our timers from being messed up.
-  if ((wres != IPseudoTcpNotify::WR_SUCCESS) && (0 != len))
-    return wres;
-
-  m_t_ack = 0;
-  if (len > 0) {
-    m_lastsend = now;
-  }
-  m_lasttraffic = now;
-  m_bOutgoing = true;
-
-  return IPseudoTcpNotify::WR_SUCCESS;
-}
-
-bool PseudoTcp::parse(const uint8_t* buffer, uint32_t size) {
-  if (size < HEADER_SIZE)
-    return false;
-
-  Segment seg;
-  seg.conv = bytes_to_long(buffer);
-  seg.seq = bytes_to_long(buffer + 4);
-  seg.ack = bytes_to_long(buffer + 8);
-  seg.flags = buffer[13];
-  seg.wnd = bytes_to_short(buffer + 14);
-
-  seg.tsval = bytes_to_long(buffer + 16);
-  seg.tsecr = bytes_to_long(buffer + 20);
-
-  seg.data = reinterpret_cast<const char *>(buffer) + HEADER_SIZE;
-  seg.len = size - HEADER_SIZE;
-
-#if _DEBUGMSG >= _DBG_VERBOSE
-  LOG(LS_INFO) << "--> <CONV=" << seg.conv
-               << "><FLG=" << static_cast<unsigned>(seg.flags)
-               << "><SEQ=" << seg.seq << ":" << seg.seq + seg.len
-               << "><ACK=" << seg.ack
-               << "><WND=" << seg.wnd
-               << "><TS="  << (seg.tsval % 10000)
-               << "><TSR=" << (seg.tsecr % 10000)
-               << "><LEN=" << seg.len << ">";
-#endif // _DEBUGMSG
-
-  return process(seg);
-}
-
-bool PseudoTcp::clock_check(uint32_t now, long& nTimeout) {
-  if (m_shutdown == SD_FORCEFUL)
-    return false;
-
-  size_t snd_buffered = 0;
-  m_sbuf.GetBuffered(&snd_buffered);
-  if ((m_shutdown == SD_GRACEFUL)
-      && ((m_state != TCP_ESTABLISHED)
-          || ((snd_buffered == 0) && (m_t_ack == 0)))) {
-    return false;
-  }
-
-  if (m_state == TCP_CLOSED) {
-    nTimeout = CLOSED_TIMEOUT;
-    return true;
-  }
-
-  nTimeout = DEFAULT_TIMEOUT;
-
-  if (m_t_ack) {
-    nTimeout = std::min<int32_t>(nTimeout,
-                                 rtc::TimeDiff32(m_t_ack + m_ack_delay, now));
-  }
-  if (m_rto_base) {
-    nTimeout = std::min<int32_t>(nTimeout,
-                                 rtc::TimeDiff32(m_rto_base + m_rx_rto, now));
-  }
-  if (m_snd_wnd == 0) {
-    nTimeout = std::min<int32_t>(nTimeout,
-                                 rtc::TimeDiff32(m_lastsend + m_rx_rto, now));
-  }
-#if PSEUDO_KEEPALIVE
-  if (m_state == TCP_ESTABLISHED) {
-    nTimeout = std::min<int32_t>(
-        nTimeout,
-        rtc::TimeDiff32(
-            m_lasttraffic + (m_bOutgoing ? IDLE_PING * 3 / 2 : IDLE_PING),
-            now));
-  }
-#endif // PSEUDO_KEEPALIVE
-  return true;
-}
-
-bool PseudoTcp::process(Segment& seg) {
-  // If this is the wrong conversation, send a reset!?! (with the correct conversation?)
-  if (seg.conv != m_conv) {
-    //if ((seg.flags & FLAG_RST) == 0) {
-    //  packet(tcb, seg.ack, 0, FLAG_RST, 0, 0);
-    //}
-    LOG_F(LS_ERROR) << "wrong conversation";
-    return false;
-  }
-
-  uint32_t now = Now();
-  m_lasttraffic = m_lastrecv = now;
-  m_bOutgoing = false;
-
-  if (m_state == TCP_CLOSED) {
-    // !?! send reset?
-    LOG_F(LS_ERROR) << "closed";
-    return false;
-  }
-
-  // Check if this is a reset segment
-  if (seg.flags & FLAG_RST) {
-    closedown(ECONNRESET);
-    return false;
-  }
-
-  // Check for control data
-  bool bConnect = false;
-  if (seg.flags & FLAG_CTL) {
-    if (seg.len == 0) {
-      LOG_F(LS_ERROR) << "Missing control code";
-      return false;
-    } else if (seg.data[0] == CTL_CONNECT) {
-      bConnect = true;
-
-      // TCP options are in the remainder of the payload after CTL_CONNECT.
-      parseOptions(&seg.data[1], seg.len - 1);
-
-      if (m_state == TCP_LISTEN) {
-        m_state = TCP_SYN_RECEIVED;
-        LOG(LS_INFO) << "State: TCP_SYN_RECEIVED";
-        //m_notify->associate(addr);
-        queueConnectMessage();
-      } else if (m_state == TCP_SYN_SENT) {
-        m_state = TCP_ESTABLISHED;
-        LOG(LS_INFO) << "State: TCP_ESTABLISHED";
-        adjustMTU();
-        if (m_notify) {
-          m_notify->OnTcpOpen(this);
-        }
-        //notify(evOpen);
-      }
-    } else {
-      LOG_F(LS_WARNING) << "Unknown control code: " << seg.data[0];
-      return false;
-    }
-  }
-
-  // Update timestamp
-  if ((seg.seq <= m_ts_lastack) && (m_ts_lastack < seg.seq + seg.len)) {
-    m_ts_recent = seg.tsval;
-  }
-
-  // Check if this is a valuable ack
-  if ((seg.ack > m_snd_una) && (seg.ack <= m_snd_nxt)) {
-    // Calculate round-trip time
-    if (seg.tsecr) {
-      int32_t rtt = rtc::TimeDiff32(now, seg.tsecr);
-      if (rtt >= 0) {
-        if (m_rx_srtt == 0) {
-          m_rx_srtt = rtt;
-          m_rx_rttvar = rtt / 2;
-        } else {
-          uint32_t unsigned_rtt = static_cast<uint32_t>(rtt);
-          uint32_t abs_err = unsigned_rtt > m_rx_srtt
-                                 ? unsigned_rtt - m_rx_srtt
-                                 : m_rx_srtt - unsigned_rtt;
-          m_rx_rttvar = (3 * m_rx_rttvar + abs_err) / 4;
-          m_rx_srtt = (7 * m_rx_srtt + rtt) / 8;
-        }
-        m_rx_rto = rtc::SafeClamp(m_rx_srtt + rtc::SafeMax(1, 4 * m_rx_rttvar),
-                                  MIN_RTO, MAX_RTO);
-#if _DEBUGMSG >= _DBG_VERBOSE
-        LOG(LS_INFO) << "rtt: " << rtt
-                     << "  srtt: " << m_rx_srtt
-                     << "  rto: " << m_rx_rto;
-#endif // _DEBUGMSG
-      } else {
-        RTC_NOTREACHED();
-      }
-    }
-
-    m_snd_wnd = static_cast<uint32_t>(seg.wnd) << m_swnd_scale;
-
-    uint32_t nAcked = seg.ack - m_snd_una;
-    m_snd_una = seg.ack;
-
-    m_rto_base = (m_snd_una == m_snd_nxt) ? 0 : now;
-
-    m_sbuf.ConsumeReadData(nAcked);
-
-    for (uint32_t nFree = nAcked; nFree > 0;) {
-      RTC_DCHECK(!m_slist.empty());
-      if (nFree < m_slist.front().len) {
-        m_slist.front().len -= nFree;
-        nFree = 0;
-      } else {
-        if (m_slist.front().len > m_largest) {
-          m_largest = m_slist.front().len;
-        }
-        nFree -= m_slist.front().len;
-        m_slist.pop_front();
-      }
-    }
-
-    if (m_dup_acks >= 3) {
-      if (m_snd_una >= m_recover) { // NewReno
-        uint32_t nInFlight = m_snd_nxt - m_snd_una;
-        m_cwnd = std::min(m_ssthresh, nInFlight + m_mss);  // (Fast Retransmit)
-#if _DEBUGMSG >= _DBG_NORMAL
-        LOG(LS_INFO) << "exit recovery";
-#endif // _DEBUGMSG
-        m_dup_acks = 0;
-      } else {
-#if _DEBUGMSG >= _DBG_NORMAL
-        LOG(LS_INFO) << "recovery retransmit";
-#endif // _DEBUGMSG
-        if (!transmit(m_slist.begin(), now)) {
-          closedown(ECONNABORTED);
-          return false;
-        }
-        m_cwnd += m_mss - std::min(nAcked, m_cwnd);
-      }
-    } else {
-      m_dup_acks = 0;
-      // Slow start, congestion avoidance
-      if (m_cwnd < m_ssthresh) {
-        m_cwnd += m_mss;
-      } else {
-        m_cwnd += std::max<uint32_t>(1, m_mss * m_mss / m_cwnd);
-      }
-    }
-  } else if (seg.ack == m_snd_una) {
-    // !?! Note, tcp says don't do this... but otherwise how does a closed window become open?
-    m_snd_wnd = static_cast<uint32_t>(seg.wnd) << m_swnd_scale;
-
-    // Check duplicate acks
-    if (seg.len > 0) {
-      // it's a dup ack, but with a data payload, so don't modify m_dup_acks
-    } else if (m_snd_una != m_snd_nxt) {
-      m_dup_acks += 1;
-      if (m_dup_acks == 3) { // (Fast Retransmit)
-#if _DEBUGMSG >= _DBG_NORMAL
-        LOG(LS_INFO) << "enter recovery";
-        LOG(LS_INFO) << "recovery retransmit";
-#endif // _DEBUGMSG
-        if (!transmit(m_slist.begin(), now)) {
-          closedown(ECONNABORTED);
-          return false;
-        }
-        m_recover = m_snd_nxt;
-        uint32_t nInFlight = m_snd_nxt - m_snd_una;
-        m_ssthresh = std::max(nInFlight / 2, 2 * m_mss);
-        //LOG(LS_INFO) << "m_ssthresh: " << m_ssthresh << "  nInFlight: " << nInFlight << "  m_mss: " << m_mss;
-        m_cwnd = m_ssthresh + 3 * m_mss;
-      } else if (m_dup_acks > 3) {
-        m_cwnd += m_mss;
-      }
-    } else {
-      m_dup_acks = 0;
-    }
-  }
-
-  // !?! A bit hacky
-  if ((m_state == TCP_SYN_RECEIVED) && !bConnect) {
-    m_state = TCP_ESTABLISHED;
-    LOG(LS_INFO) << "State: TCP_ESTABLISHED";
-    adjustMTU();
-    if (m_notify) {
-      m_notify->OnTcpOpen(this);
-    }
-    //notify(evOpen);
-  }
-
-  // If we make room in the send queue, notify the user
-  // The goal it to make sure we always have at least enough data to fill the
-  // window.  We'd like to notify the app when we are halfway to that point.
-  const uint32_t kIdealRefillSize = (m_sbuf_len + m_rbuf_len) / 2;
-  size_t snd_buffered = 0;
-  m_sbuf.GetBuffered(&snd_buffered);
-  if (m_bWriteEnable &&
-      static_cast<uint32_t>(snd_buffered) < kIdealRefillSize) {
-    m_bWriteEnable = false;
-    if (m_notify) {
-      m_notify->OnTcpWriteable(this);
-    }
-    //notify(evWrite);
-  }
-
-  // Conditions were acks must be sent:
-  // 1) Segment is too old (they missed an ACK) (immediately)
-  // 2) Segment is too new (we missed a segment) (immediately)
-  // 3) Segment has data (so we need to ACK!) (delayed)
-  // ... so the only time we don't need to ACK, is an empty segment that points to rcv_nxt!
-
-  SendFlags sflags = sfNone;
-  if (seg.seq != m_rcv_nxt) {
-    sflags = sfImmediateAck; // (Fast Recovery)
-  } else if (seg.len != 0) {
-    if (m_ack_delay == 0) {
-      sflags = sfImmediateAck;
-    } else {
-      sflags = sfDelayedAck;
-    }
-  }
-#if _DEBUGMSG >= _DBG_NORMAL
-  if (sflags == sfImmediateAck) {
-    if (seg.seq > m_rcv_nxt) {
-      LOG_F(LS_INFO) << "too new";
-    } else if (seg.seq + seg.len <= m_rcv_nxt) {
-      LOG_F(LS_INFO) << "too old";
-    }
-  }
-#endif // _DEBUGMSG
-
-  // Adjust the incoming segment to fit our receive buffer
-  if (seg.seq < m_rcv_nxt) {
-    uint32_t nAdjust = m_rcv_nxt - seg.seq;
-    if (nAdjust < seg.len) {
-      seg.seq += nAdjust;
-      seg.data += nAdjust;
-      seg.len -= nAdjust;
-    } else {
-      seg.len = 0;
-    }
-  }
-
-  size_t available_space = 0;
-  m_rbuf.GetWriteRemaining(&available_space);
-
-  if ((seg.seq + seg.len - m_rcv_nxt) >
-      static_cast<uint32_t>(available_space)) {
-    uint32_t nAdjust =
-        seg.seq + seg.len - m_rcv_nxt - static_cast<uint32_t>(available_space);
-    if (nAdjust < seg.len) {
-      seg.len -= nAdjust;
-    } else {
-      seg.len = 0;
-    }
-  }
-
-  bool bIgnoreData = (seg.flags & FLAG_CTL) || (m_shutdown != SD_NONE);
-  bool bNewData = false;
-
-  if (seg.len > 0) {
-    if (bIgnoreData) {
-      if (seg.seq == m_rcv_nxt) {
-        m_rcv_nxt += seg.len;
-      }
-    } else {
-      uint32_t nOffset = seg.seq - m_rcv_nxt;
-
-      rtc::StreamResult result =
-          m_rbuf.WriteOffset(seg.data, seg.len, nOffset, NULL);
-      if (result == rtc::SR_BLOCK) {
-        // Ignore incoming packets outside of the receive window.
-        return false;
-      }
-
-      RTC_DCHECK(result == rtc::SR_SUCCESS);
-
-      if (seg.seq == m_rcv_nxt) {
-        m_rbuf.ConsumeWriteBuffer(seg.len);
-        m_rcv_nxt += seg.len;
-        m_rcv_wnd -= seg.len;
-        bNewData = true;
-
-        RList::iterator it = m_rlist.begin();
-        while ((it != m_rlist.end()) && (it->seq <= m_rcv_nxt)) {
-          if (it->seq + it->len > m_rcv_nxt) {
-            sflags = sfImmediateAck; // (Fast Recovery)
-            uint32_t nAdjust = (it->seq + it->len) - m_rcv_nxt;
-#if _DEBUGMSG >= _DBG_NORMAL
-            LOG(LS_INFO) << "Recovered " << nAdjust << " bytes (" << m_rcv_nxt << " -> " << m_rcv_nxt + nAdjust << ")";
-#endif // _DEBUGMSG
-            m_rbuf.ConsumeWriteBuffer(nAdjust);
-            m_rcv_nxt += nAdjust;
-            m_rcv_wnd -= nAdjust;
-          }
-          it = m_rlist.erase(it);
-        }
-      } else {
-#if _DEBUGMSG >= _DBG_NORMAL
-        LOG(LS_INFO) << "Saving " << seg.len << " bytes (" << seg.seq << " -> " << seg.seq + seg.len << ")";
-#endif // _DEBUGMSG
-        RSegment rseg;
-        rseg.seq = seg.seq;
-        rseg.len = seg.len;
-        RList::iterator it = m_rlist.begin();
-        while ((it != m_rlist.end()) && (it->seq < rseg.seq)) {
-          ++it;
-        }
-        m_rlist.insert(it, rseg);
-      }
-    }
-  }
-
-  attemptSend(sflags);
-
-  // If we have new data, notify the user
-  if (bNewData && m_bReadEnable) {
-    m_bReadEnable = false;
-    if (m_notify) {
-      m_notify->OnTcpReadable(this);
-    }
-    //notify(evRead);
-  }
-
-  return true;
-}
-
-bool PseudoTcp::transmit(const SList::iterator& seg, uint32_t now) {
-  if (seg->xmit >= ((m_state == TCP_ESTABLISHED) ? 15 : 30)) {
-    LOG_F(LS_VERBOSE) << "too many retransmits";
-    return false;
-  }
-
-  uint32_t nTransmit = std::min(seg->len, m_mss);
-
-  while (true) {
-    uint32_t seq = seg->seq;
-    uint8_t flags = (seg->bCtrl ? FLAG_CTL : 0);
-    IPseudoTcpNotify::WriteResult wres = packet(seq,
-                                                flags,
-                                                seg->seq - m_snd_una,
-                                                nTransmit);
-
-    if (wres == IPseudoTcpNotify::WR_SUCCESS)
-      break;
-
-    if (wres == IPseudoTcpNotify::WR_FAIL) {
-      LOG_F(LS_VERBOSE) << "packet failed";
-      return false;
-    }
-
-    RTC_DCHECK(wres == IPseudoTcpNotify::WR_TOO_LARGE);
-
-    while (true) {
-      if (PACKET_MAXIMUMS[m_msslevel + 1] == 0) {
-        LOG_F(LS_VERBOSE) << "MTU too small";
-        return false;
-      }
-      // !?! We need to break up all outstanding and pending packets and then retransmit!?!
-
-      m_mss = PACKET_MAXIMUMS[++m_msslevel] - PACKET_OVERHEAD;
-      m_cwnd = 2 * m_mss; // I added this... haven't researched actual formula
-      if (m_mss < nTransmit) {
-        nTransmit = m_mss;
-        break;
-      }
-    }
-#if _DEBUGMSG >= _DBG_NORMAL
-    LOG(LS_INFO) << "Adjusting mss to " << m_mss << " bytes";
-#endif // _DEBUGMSG
-  }
-
-  if (nTransmit < seg->len) {
-    LOG_F(LS_VERBOSE) << "mss reduced to " << m_mss;
-
-    SSegment subseg(seg->seq + nTransmit, seg->len - nTransmit, seg->bCtrl);
-    //subseg.tstamp = seg->tstamp;
-    subseg.xmit = seg->xmit;
-    seg->len = nTransmit;
-
-    SList::iterator next = seg;
-    m_slist.insert(++next, subseg);
-  }
-
-  if (seg->xmit == 0) {
-    m_snd_nxt += seg->len;
-  }
-  seg->xmit += 1;
-  //seg->tstamp = now;
-  if (m_rto_base == 0) {
-    m_rto_base = now;
-  }
-
-  return true;
-}
-
-void PseudoTcp::attemptSend(SendFlags sflags) {
-  uint32_t now = Now();
-
-  if (rtc::TimeDiff32(now, m_lastsend) > static_cast<long>(m_rx_rto)) {
-    m_cwnd = m_mss;
-  }
-
-#if _DEBUGMSG
-  bool bFirst = true;
-#endif // _DEBUGMSG
-
-  while (true) {
-    uint32_t cwnd = m_cwnd;
-    if ((m_dup_acks == 1) || (m_dup_acks == 2)) { // Limited Transmit
-      cwnd += m_dup_acks * m_mss;
-    }
-    uint32_t nWindow = std::min(m_snd_wnd, cwnd);
-    uint32_t nInFlight = m_snd_nxt - m_snd_una;
-    uint32_t nUseable = (nInFlight < nWindow) ? (nWindow - nInFlight) : 0;
-
-    size_t snd_buffered = 0;
-    m_sbuf.GetBuffered(&snd_buffered);
-    uint32_t nAvailable =
-        std::min(static_cast<uint32_t>(snd_buffered) - nInFlight, m_mss);
-
-    if (nAvailable > nUseable) {
-      if (nUseable * 4 < nWindow) {
-        // RFC 813 - avoid SWS
-        nAvailable = 0;
-      } else {
-        nAvailable = nUseable;
-      }
-    }
-
-#if _DEBUGMSG >= _DBG_VERBOSE
-    if (bFirst) {
-      size_t available_space = 0;
-      m_sbuf.GetWriteRemaining(&available_space);
-
-      bFirst = false;
-      LOG(LS_INFO) << "[cwnd: " << m_cwnd
-                   << "  nWindow: " << nWindow
-                   << "  nInFlight: " << nInFlight
-                   << "  nAvailable: " << nAvailable
-                   << "  nQueued: " << snd_buffered
-                   << "  nEmpty: " << available_space
-                   << "  ssthresh: " << m_ssthresh << "]";
-    }
-#endif // _DEBUGMSG
-
-    if (nAvailable == 0) {
-      if (sflags == sfNone)
-        return;
-
-      // If this is an immediate ack, or the second delayed ack
-      if ((sflags == sfImmediateAck) || m_t_ack) {
-        packet(m_snd_nxt, 0, 0, 0);
-      } else {
-        m_t_ack = Now();
-      }
-      return;
-    }
-
-    // Nagle's algorithm.
-    // If there is data already in-flight, and we haven't a full segment of
-    // data ready to send then hold off until we get more to send, or the
-    // in-flight data is acknowledged.
-    if (m_use_nagling && (m_snd_nxt > m_snd_una) && (nAvailable < m_mss))  {
-      return;
-    }
-
-    // Find the next segment to transmit
-    SList::iterator it = m_slist.begin();
-    while (it->xmit > 0) {
-      ++it;
-      RTC_DCHECK(it != m_slist.end());
-    }
-    SList::iterator seg = it;
-
-    // If the segment is too large, break it into two
-    if (seg->len > nAvailable) {
-      SSegment subseg(seg->seq + nAvailable, seg->len - nAvailable, seg->bCtrl);
-      seg->len = nAvailable;
-      m_slist.insert(++it, subseg);
-    }
-
-    if (!transmit(seg, now)) {
-      LOG_F(LS_VERBOSE) << "transmit failed";
-      // TODO: consider closing socket
-      return;
-    }
-
-    sflags = sfNone;
-  }
-}
-
-void PseudoTcp::closedown(uint32_t err) {
-  LOG(LS_INFO) << "State: TCP_CLOSED";
-  m_state = TCP_CLOSED;
-  if (m_notify) {
-    m_notify->OnTcpClosed(this, err);
-  }
-  //notify(evClose, err);
-}
-
-void
-PseudoTcp::adjustMTU() {
-  // Determine our current mss level, so that we can adjust appropriately later
-  for (m_msslevel = 0; PACKET_MAXIMUMS[m_msslevel + 1] > 0; ++m_msslevel) {
-    if (static_cast<uint16_t>(PACKET_MAXIMUMS[m_msslevel]) <= m_mtu_advise) {
-      break;
-    }
-  }
-  m_mss = m_mtu_advise - PACKET_OVERHEAD;
-  // !?! Should we reset m_largest here?
-#if _DEBUGMSG >= _DBG_NORMAL
-  LOG(LS_INFO) << "Adjusting mss to " << m_mss << " bytes";
-#endif // _DEBUGMSG
-  // Enforce minimums on ssthresh and cwnd
-  m_ssthresh = std::max(m_ssthresh, 2 * m_mss);
-  m_cwnd = std::max(m_cwnd, m_mss);
-}
-
-bool
-PseudoTcp::isReceiveBufferFull() const {
-  size_t available_space = 0;
-  m_rbuf.GetWriteRemaining(&available_space);
-  return !available_space;
-}
-
-void
-PseudoTcp::disableWindowScale() {
-  m_support_wnd_scale = false;
-}
-
-void
-PseudoTcp::queueConnectMessage() {
-  rtc::ByteBufferWriter buf(rtc::ByteBuffer::ORDER_NETWORK);
-
-  buf.WriteUInt8(CTL_CONNECT);
-  if (m_support_wnd_scale) {
-    buf.WriteUInt8(TCP_OPT_WND_SCALE);
-    buf.WriteUInt8(1);
-    buf.WriteUInt8(m_rwnd_scale);
-  }
-  m_snd_wnd = static_cast<uint32_t>(buf.Length());
-  queue(buf.Data(), static_cast<uint32_t>(buf.Length()), true);
-}
-
-void PseudoTcp::parseOptions(const char* data, uint32_t len) {
-  std::set<uint8_t> options_specified;
-
-  // See http://www.freesoft.org/CIE/Course/Section4/8.htm for
-  // parsing the options list.
-  rtc::ByteBufferReader buf(data, len);
-  while (buf.Length()) {
-    uint8_t kind = TCP_OPT_EOL;
-    buf.ReadUInt8(&kind);
-
-    if (kind == TCP_OPT_EOL) {
-      // End of option list.
-      break;
-    } else if (kind == TCP_OPT_NOOP) {
-      // No op.
-      continue;
-    }
-
-    // Length of this option.
-    RTC_DCHECK(len != 0);
-    uint8_t opt_len = 0;
-    buf.ReadUInt8(&opt_len);
-
-    // Content of this option.
-    if (opt_len <= buf.Length()) {
-      applyOption(kind, buf.Data(), opt_len);
-      buf.Consume(opt_len);
-    } else {
-      LOG(LS_ERROR) << "Invalid option length received.";
-      return;
-    }
-    options_specified.insert(kind);
-  }
-
-  if (options_specified.find(TCP_OPT_WND_SCALE) == options_specified.end()) {
-    LOG(LS_WARNING) << "Peer doesn't support window scaling";
-
-    if (m_rwnd_scale > 0) {
-      // Peer doesn't support TCP options and window scaling.
-      // Revert receive buffer size to default value.
-      resizeReceiveBuffer(DEFAULT_RCV_BUF_SIZE);
-      m_swnd_scale = 0;
-    }
-  }
-}
-
-void PseudoTcp::applyOption(char kind, const char* data, uint32_t len) {
-  if (kind == TCP_OPT_MSS) {
-    LOG(LS_WARNING) << "Peer specified MSS option which is not supported.";
-    // TODO: Implement.
-  } else if (kind == TCP_OPT_WND_SCALE) {
-    // Window scale factor.
-    // http://www.ietf.org/rfc/rfc1323.txt
-    if (len != 1) {
-      LOG_F(WARNING) << "Invalid window scale option received.";
-      return;
-    }
-    applyWindowScaleOption(data[0]);
-  }
-}
-
-void PseudoTcp::applyWindowScaleOption(uint8_t scale_factor) {
-  m_swnd_scale = scale_factor;
-}
-
-void PseudoTcp::resizeSendBuffer(uint32_t new_size) {
-  m_sbuf_len = new_size;
-  m_sbuf.SetCapacity(new_size);
-}
-
-void PseudoTcp::resizeReceiveBuffer(uint32_t new_size) {
-  uint8_t scale_factor = 0;
-
-  // Determine the scale factor such that the scaled window size can fit
-  // in a 16-bit unsigned integer.
-  while (new_size > 0xFFFF) {
-    ++scale_factor;
-    new_size >>= 1;
-  }
-
-  // Determine the proper size of the buffer.
-  new_size <<= scale_factor;
-  bool result = m_rbuf.SetCapacity(new_size);
-
-  // Make sure the new buffer is large enough to contain data in the old
-  // buffer. This should always be true because this method is called either
-  // before connection is established or when peers are exchanging connect
-  // messages.
-  RTC_DCHECK(result);
-  m_rbuf_len = new_size;
-  m_rwnd_scale = scale_factor;
-  m_ssthresh = new_size;
-
-  size_t available_space = 0;
-  m_rbuf.GetWriteRemaining(&available_space);
-  m_rcv_wnd = static_cast<uint32_t>(available_space);
-}
-
-}  // namespace cricket
diff --git a/p2p/base/pseudotcp.h b/p2p/base/pseudotcp.h
deleted file mode 100644
index 134bc00..0000000
--- a/p2p/base/pseudotcp.h
+++ /dev/null
@@ -1,242 +0,0 @@
-/*
- *  Copyright 2004 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_P2P_BASE_PSEUDOTCP_H_
-#define WEBRTC_P2P_BASE_PSEUDOTCP_H_
-
-#include <list>
-
-#include "webrtc/rtc_base/basictypes.h"
-#include "webrtc/rtc_base/stream.h"
-
-namespace cricket {
-
-//////////////////////////////////////////////////////////////////////
-// IPseudoTcpNotify
-//////////////////////////////////////////////////////////////////////
-
-class PseudoTcp;
-
-class IPseudoTcpNotify {
- public:
-  // Notification of tcp events
-  virtual void OnTcpOpen(PseudoTcp* tcp) = 0;
-  virtual void OnTcpReadable(PseudoTcp* tcp) = 0;
-  virtual void OnTcpWriteable(PseudoTcp* tcp) = 0;
-  virtual void OnTcpClosed(PseudoTcp* tcp, uint32_t error) = 0;
-
-  // Write the packet onto the network
-  enum WriteResult { WR_SUCCESS, WR_TOO_LARGE, WR_FAIL };
-  virtual WriteResult TcpWritePacket(PseudoTcp* tcp,
-                                     const char* buffer, size_t len) = 0;
-
- protected:
-  virtual ~IPseudoTcpNotify() {}
-};
-
-//////////////////////////////////////////////////////////////////////
-// PseudoTcp
-//////////////////////////////////////////////////////////////////////
-
-class PseudoTcp {
- public:
-  static uint32_t Now();
-
-  PseudoTcp(IPseudoTcpNotify* notify, uint32_t conv);
-  virtual ~PseudoTcp();
-
-  int Connect();
-  int Recv(char* buffer, size_t len);
-  int Send(const char* buffer, size_t len);
-  void Close(bool force);
-  int GetError();
-
-  enum TcpState {
-    TCP_LISTEN, TCP_SYN_SENT, TCP_SYN_RECEIVED, TCP_ESTABLISHED, TCP_CLOSED
-  };
-  TcpState State() const { return m_state; }
-
-  // Call this when the PMTU changes.
-  void NotifyMTU(uint16_t mtu);
-
-  // Call this based on timeout value returned from GetNextClock.
-  // It's ok to call this too frequently.
-  void NotifyClock(uint32_t now);
-
-  // Call this whenever a packet arrives.
-  // Returns true if the packet was processed successfully.
-  bool NotifyPacket(const char * buffer, size_t len);
-
-  // Call this to determine the next time NotifyClock should be called.
-  // Returns false if the socket is ready to be destroyed.
-  bool GetNextClock(uint32_t now, long& timeout);
-
-  // Call these to get/set option values to tailor this PseudoTcp
-  // instance's behaviour for the kind of data it will carry.
-  // If an unrecognized option is set or got, an assertion will fire.
-  //
-  // Setting options for OPT_RCVBUF or OPT_SNDBUF after Connect() is called
-  // will result in an assertion.
-  enum Option {
-    OPT_NODELAY,      // Whether to enable Nagle's algorithm (0 == off)
-    OPT_ACKDELAY,     // The Delayed ACK timeout (0 == off).
-    OPT_RCVBUF,       // Set the receive buffer size, in bytes.
-    OPT_SNDBUF,       // Set the send buffer size, in bytes.
-  };
-  void GetOption(Option opt, int* value);
-  void SetOption(Option opt, int value);
-
-  // Returns current congestion window in bytes.
-  uint32_t GetCongestionWindow() const;
-
-  // Returns amount of data in bytes that has been sent, but haven't
-  // been acknowledged.
-  uint32_t GetBytesInFlight() const;
-
-  // Returns number of bytes that were written in buffer and haven't
-  // been sent.
-  uint32_t GetBytesBufferedNotSent() const;
-
-  // Returns current round-trip time estimate in milliseconds.
-  uint32_t GetRoundTripTimeEstimateMs() const;
-
- protected:
-  enum SendFlags { sfNone, sfDelayedAck, sfImmediateAck };
-
-  struct Segment {
-    uint32_t conv, seq, ack;
-    uint8_t flags;
-    uint16_t wnd;
-    const char * data;
-    uint32_t len;
-    uint32_t tsval, tsecr;
-  };
-
-  struct SSegment {
-    SSegment(uint32_t s, uint32_t l, bool c)
-        : seq(s), len(l), /*tstamp(0),*/ xmit(0), bCtrl(c) {}
-    uint32_t seq, len;
-    // uint32_t tstamp;
-    uint8_t xmit;
-    bool bCtrl;
-  };
-  typedef std::list<SSegment> SList;
-
-  struct RSegment {
-    uint32_t seq, len;
-  };
-
-  uint32_t queue(const char* data, uint32_t len, bool bCtrl);
-
-  // Creates a packet and submits it to the network. This method can either
-  // send payload or just an ACK packet.
-  //
-  // |seq| is the sequence number of this packet.
-  // |flags| is the flags for sending this packet.
-  // |offset| is the offset to read from |m_sbuf|.
-  // |len| is the number of bytes to read from |m_sbuf| as payload. If this
-  // value is 0 then this is an ACK packet, otherwise this packet has payload.
-  IPseudoTcpNotify::WriteResult packet(uint32_t seq,
-                                       uint8_t flags,
-                                       uint32_t offset,
-                                       uint32_t len);
-  bool parse(const uint8_t* buffer, uint32_t size);
-
-  void attemptSend(SendFlags sflags = sfNone);
-
-  void closedown(uint32_t err = 0);
-
-  bool clock_check(uint32_t now, long& nTimeout);
-
-  bool process(Segment& seg);
-  bool transmit(const SList::iterator& seg, uint32_t now);
-
-  void adjustMTU();
-
- protected:
-  // This method is used in test only to query receive buffer state.
-  bool isReceiveBufferFull() const;
-
-  // This method is only used in tests, to disable window scaling
-  // support for testing backward compatibility.
-  void disableWindowScale();
-
- private:
-  // Queue the connect message with TCP options.
-  void queueConnectMessage();
-
-  // Parse TCP options in the header.
-  void parseOptions(const char* data, uint32_t len);
-
-  // Apply a TCP option that has been read from the header.
-  void applyOption(char kind, const char* data, uint32_t len);
-
-  // Apply window scale option.
-  void applyWindowScaleOption(uint8_t scale_factor);
-
-  // Resize the send buffer with |new_size| in bytes.
-  void resizeSendBuffer(uint32_t new_size);
-
-  // Resize the receive buffer with |new_size| in bytes. This call adjusts
-  // window scale factor |m_swnd_scale| accordingly.
-  void resizeReceiveBuffer(uint32_t new_size);
-
-  IPseudoTcpNotify* m_notify;
-  enum Shutdown { SD_NONE, SD_GRACEFUL, SD_FORCEFUL } m_shutdown;
-  int m_error;
-
-  // TCB data
-  TcpState m_state;
-  uint32_t m_conv;
-  bool m_bReadEnable, m_bWriteEnable, m_bOutgoing;
-  uint32_t m_lasttraffic;
-
-  // Incoming data
-  typedef std::list<RSegment> RList;
-  RList m_rlist;
-  uint32_t m_rbuf_len, m_rcv_nxt, m_rcv_wnd, m_lastrecv;
-  uint8_t m_rwnd_scale;  // Window scale factor.
-  rtc::FifoBuffer m_rbuf;
-
-  // Outgoing data
-  SList m_slist;
-  uint32_t m_sbuf_len, m_snd_nxt, m_snd_wnd, m_lastsend, m_snd_una;
-  uint8_t m_swnd_scale;  // Window scale factor.
-  rtc::FifoBuffer m_sbuf;
-
-  // Maximum segment size, estimated protocol level, largest segment sent
-  uint32_t m_mss, m_msslevel, m_largest, m_mtu_advise;
-  // Retransmit timer
-  uint32_t m_rto_base;
-
-  // Timestamp tracking
-  uint32_t m_ts_recent, m_ts_lastack;
-
-  // Round-trip calculation
-  uint32_t m_rx_rttvar, m_rx_srtt, m_rx_rto;
-
-  // Congestion avoidance, Fast retransmit/recovery, Delayed ACKs
-  uint32_t m_ssthresh, m_cwnd;
-  uint8_t m_dup_acks;
-  uint32_t m_recover;
-  uint32_t m_t_ack;
-
-  // Configuration options
-  bool m_use_nagling;
-  uint32_t m_ack_delay;
-
-  // This is used by unit tests to test backward compatibility of
-  // PseudoTcp implementations that don't support window scaling.
-  bool m_support_wnd_scale;
-};
-
-}  // namespace cricket
-
-#endif  // WEBRTC_P2P_BASE_PSEUDOTCP_H_
diff --git a/p2p/base/pseudotcp_unittest.cc b/p2p/base/pseudotcp_unittest.cc
deleted file mode 100644
index 157f456..0000000
--- a/p2p/base/pseudotcp_unittest.cc
+++ /dev/null
@@ -1,841 +0,0 @@
-/*
- *  Copyright 2011 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 <algorithm>
-#include <vector>
-
-#include "webrtc/p2p/base/pseudotcp.h"
-#include "webrtc/rtc_base/gunit.h"
-#include "webrtc/rtc_base/helpers.h"
-#include "webrtc/rtc_base/messagehandler.h"
-#include "webrtc/rtc_base/stream.h"
-#include "webrtc/rtc_base/thread.h"
-#include "webrtc/rtc_base/timeutils.h"
-
-using cricket::PseudoTcp;
-
-static const int kConnectTimeoutMs = 10000;  // ~3 * default RTO of 3000ms
-static const int kTransferTimeoutMs = 15000;
-static const int kBlockSize = 4096;
-
-class PseudoTcpForTest : public cricket::PseudoTcp {
- public:
-  PseudoTcpForTest(cricket::IPseudoTcpNotify* notify, uint32_t conv)
-      : PseudoTcp(notify, conv) {}
-
-  bool isReceiveBufferFull() const {
-    return PseudoTcp::isReceiveBufferFull();
-  }
-
-  void disableWindowScale() {
-    PseudoTcp::disableWindowScale();
-  }
-};
-
-class PseudoTcpTestBase : public testing::Test,
-                      public rtc::MessageHandler,
-                      public cricket::IPseudoTcpNotify {
- public:
-  PseudoTcpTestBase()
-      : local_(this, 1),
-        remote_(this, 1),
-        have_connected_(false),
-        have_disconnected_(false),
-        local_mtu_(65535),
-        remote_mtu_(65535),
-        delay_(0),
-        loss_(0) {
-    // Set use of the test RNG to get predictable loss patterns.
-    rtc::SetRandomTestMode(true);
-  }
-  ~PseudoTcpTestBase() {
-    // Put it back for the next test.
-    rtc::SetRandomTestMode(false);
-  }
-  void SetLocalMtu(int mtu) {
-    local_.NotifyMTU(mtu);
-    local_mtu_ = mtu;
-  }
-  void SetRemoteMtu(int mtu) {
-    remote_.NotifyMTU(mtu);
-    remote_mtu_ = mtu;
-  }
-  void SetDelay(int delay) {
-    delay_ = delay;
-  }
-  void SetLoss(int percent) {
-    loss_ = percent;
-  }
-  void SetOptNagling(bool enable_nagles) {
-    local_.SetOption(PseudoTcp::OPT_NODELAY, !enable_nagles);
-    remote_.SetOption(PseudoTcp::OPT_NODELAY, !enable_nagles);
-  }
-  void SetOptAckDelay(int ack_delay) {
-    local_.SetOption(PseudoTcp::OPT_ACKDELAY, ack_delay);
-    remote_.SetOption(PseudoTcp::OPT_ACKDELAY, ack_delay);
-  }
-  void SetOptSndBuf(int size) {
-    local_.SetOption(PseudoTcp::OPT_SNDBUF, size);
-    remote_.SetOption(PseudoTcp::OPT_SNDBUF, size);
-  }
-  void SetRemoteOptRcvBuf(int size) {
-    remote_.SetOption(PseudoTcp::OPT_RCVBUF, size);
-  }
-  void SetLocalOptRcvBuf(int size) {
-    local_.SetOption(PseudoTcp::OPT_RCVBUF, size);
-  }
-  void DisableRemoteWindowScale() {
-    remote_.disableWindowScale();
-  }
-  void DisableLocalWindowScale() {
-    local_.disableWindowScale();
-  }
-
- protected:
-  int Connect() {
-    int ret = local_.Connect();
-    if (ret == 0) {
-      UpdateLocalClock();
-    }
-    return ret;
-  }
-  void Close() {
-    local_.Close(false);
-    UpdateLocalClock();
-  }
-
-  enum { MSG_LPACKET, MSG_RPACKET, MSG_LCLOCK, MSG_RCLOCK, MSG_IOCOMPLETE,
-         MSG_WRITE};
-  virtual void OnTcpOpen(PseudoTcp* tcp) {
-    // Consider ourselves connected when the local side gets OnTcpOpen.
-    // OnTcpWriteable isn't fired at open, so we trigger it now.
-    LOG(LS_VERBOSE) << "Opened";
-    if (tcp == &local_) {
-      have_connected_ = true;
-      OnTcpWriteable(tcp);
-    }
-  }
-  // Test derived from the base should override
-  //   virtual void OnTcpReadable(PseudoTcp* tcp)
-  // and
-  //   virtual void OnTcpWritable(PseudoTcp* tcp)
-  virtual void OnTcpClosed(PseudoTcp* tcp, uint32_t error) {
-    // Consider ourselves closed when the remote side gets OnTcpClosed.
-    // TODO: OnTcpClosed is only ever notified in case of error in
-    // the current implementation.  Solicited close is not (yet) supported.
-    LOG(LS_VERBOSE) << "Closed";
-    EXPECT_EQ(0U, error);
-    if (tcp == &remote_) {
-      have_disconnected_ = true;
-    }
-  }
-  virtual WriteResult TcpWritePacket(PseudoTcp* tcp,
-                                     const char* buffer, size_t len) {
-    // Randomly drop the desired percentage of packets.
-    // Also drop packets that are larger than the configured MTU.
-    if (rtc::CreateRandomId() % 100 < static_cast<uint32_t>(loss_)) {
-      LOG(LS_VERBOSE) << "Randomly dropping packet, size=" << len;
-    } else if (len > static_cast<size_t>(std::min(local_mtu_, remote_mtu_))) {
-      LOG(LS_VERBOSE) << "Dropping packet that exceeds path MTU, size=" << len;
-    } else {
-      int id = (tcp == &local_) ? MSG_RPACKET : MSG_LPACKET;
-      std::string packet(buffer, len);
-      rtc::Thread::Current()->PostDelayed(RTC_FROM_HERE, delay_, this, id,
-                                          rtc::WrapMessageData(packet));
-    }
-    return WR_SUCCESS;
-  }
-
-  void UpdateLocalClock() { UpdateClock(&local_, MSG_LCLOCK); }
-  void UpdateRemoteClock() { UpdateClock(&remote_, MSG_RCLOCK); }
-  void UpdateClock(PseudoTcp* tcp, uint32_t message) {
-    long interval = 0;  // NOLINT
-    tcp->GetNextClock(PseudoTcp::Now(), interval);
-    interval = std::max<int>(interval, 0L);  // sometimes interval is < 0
-    rtc::Thread::Current()->Clear(this, message);
-    rtc::Thread::Current()->PostDelayed(RTC_FROM_HERE, interval, this, message);
-  }
-
-  virtual void OnMessage(rtc::Message* message) {
-    switch (message->message_id) {
-      case MSG_LPACKET: {
-        const std::string& s(
-            rtc::UseMessageData<std::string>(message->pdata));
-        local_.NotifyPacket(s.c_str(), s.size());
-        UpdateLocalClock();
-        break;
-      }
-      case MSG_RPACKET: {
-        const std::string& s(
-            rtc::UseMessageData<std::string>(message->pdata));
-        remote_.NotifyPacket(s.c_str(), s.size());
-        UpdateRemoteClock();
-        break;
-      }
-      case MSG_LCLOCK:
-        local_.NotifyClock(PseudoTcp::Now());
-        UpdateLocalClock();
-        break;
-      case MSG_RCLOCK:
-        remote_.NotifyClock(PseudoTcp::Now());
-        UpdateRemoteClock();
-        break;
-      default:
-        break;
-    }
-    delete message->pdata;
-  }
-
-  PseudoTcpForTest local_;
-  PseudoTcpForTest remote_;
-  rtc::MemoryStream send_stream_;
-  rtc::MemoryStream recv_stream_;
-  bool have_connected_;
-  bool have_disconnected_;
-  int local_mtu_;
-  int remote_mtu_;
-  int delay_;
-  int loss_;
-};
-
-class PseudoTcpTest : public PseudoTcpTestBase {
- public:
-  void TestTransfer(int size) {
-    uint32_t start;
-    int32_t elapsed;
-    size_t received;
-    // Create some dummy data to send.
-    send_stream_.ReserveSize(size);
-    for (int i = 0; i < size; ++i) {
-      char ch = static_cast<char>(i);
-      send_stream_.Write(&ch, 1, NULL, NULL);
-    }
-    send_stream_.Rewind();
-    // Prepare the receive stream.
-    recv_stream_.ReserveSize(size);
-    // Connect and wait until connected.
-    start = rtc::Time32();
-    EXPECT_EQ(0, Connect());
-    EXPECT_TRUE_WAIT(have_connected_, kConnectTimeoutMs);
-    // Sending will start from OnTcpWriteable and complete when all data has
-    // been received.
-    EXPECT_TRUE_WAIT(have_disconnected_, kTransferTimeoutMs);
-    elapsed = rtc::Time32() - start;
-    recv_stream_.GetSize(&received);
-    // Ensure we closed down OK and we got the right data.
-    // TODO: Ensure the errors are cleared properly.
-    //EXPECT_EQ(0, local_.GetError());
-    //EXPECT_EQ(0, remote_.GetError());
-    EXPECT_EQ(static_cast<size_t>(size), received);
-    EXPECT_EQ(0, memcmp(send_stream_.GetBuffer(),
-                        recv_stream_.GetBuffer(), size));
-    LOG(LS_INFO) << "Transferred " << received << " bytes in " << elapsed
-                 << " ms (" << size * 8 / elapsed << " Kbps)";
-  }
-
- private:
-  // IPseudoTcpNotify interface
-
-  virtual void OnTcpReadable(PseudoTcp* tcp) {
-    // Stream bytes to the recv stream as they arrive.
-    if (tcp == &remote_) {
-      ReadData();
-
-      // TODO: OnTcpClosed() is currently only notified on error -
-      // there is no on-the-wire equivalent of TCP FIN.
-      // So we fake the notification when all the data has been read.
-      size_t received, required;
-      recv_stream_.GetPosition(&received);
-      send_stream_.GetSize(&required);
-      if (received == required)
-        OnTcpClosed(&remote_, 0);
-    }
-  }
-  virtual void OnTcpWriteable(PseudoTcp* tcp) {
-    // Write bytes from the send stream when we can.
-    // Shut down when we've sent everything.
-    if (tcp == &local_) {
-      LOG(LS_VERBOSE) << "Flow Control Lifted";
-      bool done;
-      WriteData(&done);
-      if (done) {
-        Close();
-      }
-    }
-  }
-
-  void ReadData() {
-    char block[kBlockSize];
-    size_t position;
-    int rcvd;
-    do {
-      rcvd = remote_.Recv(block, sizeof(block));
-      if (rcvd != -1) {
-        recv_stream_.Write(block, rcvd, NULL, NULL);
-        recv_stream_.GetPosition(&position);
-        LOG(LS_VERBOSE) << "Received: " << position;
-      }
-    } while (rcvd > 0);
-  }
-  void WriteData(bool* done) {
-    size_t position, tosend;
-    int sent;
-    char block[kBlockSize];
-    do {
-      send_stream_.GetPosition(&position);
-      if (send_stream_.Read(block, sizeof(block), &tosend, NULL) !=
-          rtc::SR_EOS) {
-        sent = local_.Send(block, tosend);
-        UpdateLocalClock();
-        if (sent != -1) {
-          send_stream_.SetPosition(position + sent);
-          LOG(LS_VERBOSE) << "Sent: " << position + sent;
-        } else {
-          send_stream_.SetPosition(position);
-          LOG(LS_VERBOSE) << "Flow Controlled";
-        }
-      } else {
-        sent = static_cast<int>(tosend = 0);
-      }
-    } while (sent > 0);
-    *done = (tosend == 0);
-  }
-
- private:
-  rtc::MemoryStream send_stream_;
-  rtc::MemoryStream recv_stream_;
-};
-
-
-class PseudoTcpTestPingPong : public PseudoTcpTestBase {
- public:
-  PseudoTcpTestPingPong()
-      : iterations_remaining_(0),
-	sender_(NULL),
-	receiver_(NULL),
-	bytes_per_send_(0) {
-  }
-  void SetBytesPerSend(int bytes) {
-    bytes_per_send_ = bytes;
-  }
-  void TestPingPong(int size, int iterations) {
-    uint32_t start, elapsed;
-    iterations_remaining_ = iterations;
-    receiver_ = &remote_;
-    sender_ = &local_;
-    // Create some dummy data to send.
-    send_stream_.ReserveSize(size);
-    for (int i = 0; i < size; ++i) {
-      char ch = static_cast<char>(i);
-      send_stream_.Write(&ch, 1, NULL, NULL);
-    }
-    send_stream_.Rewind();
-    // Prepare the receive stream.
-    recv_stream_.ReserveSize(size);
-    // Connect and wait until connected.
-    start = rtc::Time32();
-    EXPECT_EQ(0, Connect());
-    EXPECT_TRUE_WAIT(have_connected_, kConnectTimeoutMs);
-    // Sending will start from OnTcpWriteable and stop when the required
-    // number of iterations have completed.
-    EXPECT_TRUE_WAIT(have_disconnected_, kTransferTimeoutMs);
-    elapsed = rtc::TimeSince(start);
-    LOG(LS_INFO) << "Performed " << iterations << " pings in "
-                 << elapsed << " ms";
-  }
-
- private:
-  // IPseudoTcpNotify interface
-
-  virtual void OnTcpReadable(PseudoTcp* tcp) {
-    if (tcp != receiver_) {
-      LOG_F(LS_ERROR) << "unexpected OnTcpReadable";
-      return;
-    }
-    // Stream bytes to the recv stream as they arrive.
-    ReadData();
-    // If we've received the desired amount of data, rewind things
-    // and send it back the other way!
-    size_t position, desired;
-    recv_stream_.GetPosition(&position);
-    send_stream_.GetSize(&desired);
-    if (position == desired) {
-      if (receiver_ == &local_ && --iterations_remaining_ == 0) {
-        Close();
-        // TODO: Fake OnTcpClosed() on the receiver for now.
-        OnTcpClosed(&remote_, 0);
-        return;
-      }
-      PseudoTcp* tmp = receiver_;
-      receiver_ = sender_;
-      sender_ = tmp;
-      recv_stream_.Rewind();
-      send_stream_.Rewind();
-      OnTcpWriteable(sender_);
-    }
-  }
-  virtual void OnTcpWriteable(PseudoTcp* tcp) {
-    if (tcp != sender_)
-      return;
-    // Write bytes from the send stream when we can.
-    // Shut down when we've sent everything.
-    LOG(LS_VERBOSE) << "Flow Control Lifted";
-    WriteData();
-  }
-
-  void ReadData() {
-    char block[kBlockSize];
-    size_t position;
-    int rcvd;
-    do {
-      rcvd = receiver_->Recv(block, sizeof(block));
-      if (rcvd != -1) {
-        recv_stream_.Write(block, rcvd, NULL, NULL);
-        recv_stream_.GetPosition(&position);
-        LOG(LS_VERBOSE) << "Received: " << position;
-      }
-    } while (rcvd > 0);
-  }
-  void WriteData() {
-    size_t position, tosend;
-    int sent;
-    char block[kBlockSize];
-    do {
-      send_stream_.GetPosition(&position);
-      tosend = bytes_per_send_ ? bytes_per_send_ : sizeof(block);
-      if (send_stream_.Read(block, tosend, &tosend, NULL) !=
-          rtc::SR_EOS) {
-        sent = sender_->Send(block, tosend);
-        UpdateLocalClock();
-        if (sent != -1) {
-          send_stream_.SetPosition(position + sent);
-          LOG(LS_VERBOSE) << "Sent: " << position + sent;
-        } else {
-          send_stream_.SetPosition(position);
-          LOG(LS_VERBOSE) << "Flow Controlled";
-        }
-      } else {
-        sent = static_cast<int>(tosend = 0);
-      }
-    } while (sent > 0);
-  }
-
- private:
-  int iterations_remaining_;
-  PseudoTcp* sender_;
-  PseudoTcp* receiver_;
-  int bytes_per_send_;
-};
-
-// Fill the receiver window until it is full, drain it and then
-// fill it with the same amount. This is to test that receiver window
-// contracts and enlarges correctly.
-class PseudoTcpTestReceiveWindow : public PseudoTcpTestBase {
- public:
-  // Not all the data are transfered, |size| just need to be big enough
-  // to fill up the receiver window twice.
-  void TestTransfer(int size) {
-    // Create some dummy data to send.
-    send_stream_.ReserveSize(size);
-    for (int i = 0; i < size; ++i) {
-      char ch = static_cast<char>(i);
-      send_stream_.Write(&ch, 1, NULL, NULL);
-    }
-    send_stream_.Rewind();
-
-    // Prepare the receive stream.
-    recv_stream_.ReserveSize(size);
-
-    // Connect and wait until connected.
-    EXPECT_EQ(0, Connect());
-    EXPECT_TRUE_WAIT(have_connected_, kConnectTimeoutMs);
-
-    rtc::Thread::Current()->Post(RTC_FROM_HERE, this, MSG_WRITE);
-    EXPECT_TRUE_WAIT(have_disconnected_, kTransferTimeoutMs);
-
-    ASSERT_EQ(2u, send_position_.size());
-    ASSERT_EQ(2u, recv_position_.size());
-
-    const size_t estimated_recv_window = EstimateReceiveWindowSize();
-
-    // The difference in consecutive send positions should equal the
-    // receive window size or match very closely. This verifies that receive
-    // window is open after receiver drained all the data.
-    const size_t send_position_diff = send_position_[1] - send_position_[0];
-    EXPECT_GE(1024u, estimated_recv_window - send_position_diff);
-
-    // Receiver drained the receive window twice.
-    EXPECT_EQ(2 * estimated_recv_window, recv_position_[1]);
-  }
-
-  virtual void OnMessage(rtc::Message* message) {
-    int message_id = message->message_id;
-    PseudoTcpTestBase::OnMessage(message);
-
-    switch (message_id) {
-      case MSG_WRITE: {
-        WriteData();
-        break;
-      }
-      default:
-        break;
-    }
-  }
-
-  uint32_t EstimateReceiveWindowSize() const {
-    return static_cast<uint32_t>(recv_position_[0]);
-  }
-
-  uint32_t EstimateSendWindowSize() const {
-    return static_cast<uint32_t>(send_position_[0] - recv_position_[0]);
-  }
-
- private:
-  // IPseudoTcpNotify interface
-  virtual void OnTcpReadable(PseudoTcp* tcp) {
-  }
-
-  virtual void OnTcpWriteable(PseudoTcp* tcp) {
-  }
-
-  void ReadUntilIOPending() {
-    char block[kBlockSize];
-    size_t position;
-    int rcvd;
-
-    do {
-      rcvd = remote_.Recv(block, sizeof(block));
-      if (rcvd != -1) {
-        recv_stream_.Write(block, rcvd, NULL, NULL);
-        recv_stream_.GetPosition(&position);
-        LOG(LS_VERBOSE) << "Received: " << position;
-      }
-    } while (rcvd > 0);
-
-    recv_stream_.GetPosition(&position);
-    recv_position_.push_back(position);
-
-    // Disconnect if we have done two transfers.
-    if (recv_position_.size() == 2u) {
-      Close();
-      OnTcpClosed(&remote_, 0);
-    } else {
-      WriteData();
-    }
-  }
-
-  void WriteData() {
-    size_t position, tosend;
-    int sent;
-    char block[kBlockSize];
-    do {
-      send_stream_.GetPosition(&position);
-      if (send_stream_.Read(block, sizeof(block), &tosend, NULL) !=
-          rtc::SR_EOS) {
-        sent = local_.Send(block, tosend);
-        UpdateLocalClock();
-        if (sent != -1) {
-          send_stream_.SetPosition(position + sent);
-          LOG(LS_VERBOSE) << "Sent: " << position + sent;
-        } else {
-          send_stream_.SetPosition(position);
-          LOG(LS_VERBOSE) << "Flow Controlled";
-        }
-      } else {
-        sent = static_cast<int>(tosend = 0);
-      }
-    } while (sent > 0);
-    // At this point, we've filled up the available space in the send queue.
-
-    int message_queue_size =
-        static_cast<int>(rtc::Thread::Current()->size());
-    // The message queue will always have at least 2 messages, an RCLOCK and
-    // an LCLOCK, since they are added back on the delay queue at the same time
-    // they are pulled off and therefore are never really removed.
-    if (message_queue_size > 2) {
-      // If there are non-clock messages remaining, attempt to continue sending
-      // after giving those messages time to process, which should free up the
-      // send buffer.
-      rtc::Thread::Current()->PostDelayed(RTC_FROM_HERE, 10, this, MSG_WRITE);
-    } else {
-      if (!remote_.isReceiveBufferFull()) {
-        LOG(LS_ERROR) << "This shouldn't happen - the send buffer is full, "
-                      << "the receive buffer is not, and there are no "
-                      << "remaining messages to process.";
-      }
-      send_stream_.GetPosition(&position);
-      send_position_.push_back(position);
-
-      // Drain the receiver buffer.
-      ReadUntilIOPending();
-    }
-  }
-
- private:
-  rtc::MemoryStream send_stream_;
-  rtc::MemoryStream recv_stream_;
-
-  std::vector<size_t> send_position_;
-  std::vector<size_t> recv_position_;
-};
-
-// Basic end-to-end data transfer tests
-
-// Test the normal case of sending data from one side to the other.
-TEST_F(PseudoTcpTest, TestSend) {
-  SetLocalMtu(1500);
-  SetRemoteMtu(1500);
-  TestTransfer(1000000);
-}
-
-// Test sending data with a 50 ms RTT. Transmission should take longer due
-// to a slower ramp-up in send rate.
-TEST_F(PseudoTcpTest, TestSendWithDelay) {
-  SetLocalMtu(1500);
-  SetRemoteMtu(1500);
-  SetDelay(50);
-  TestTransfer(1000000);
-}
-
-// Test sending data with packet loss. Transmission should take much longer due
-// to send back-off when loss occurs.
-TEST_F(PseudoTcpTest, TestSendWithLoss) {
-  SetLocalMtu(1500);
-  SetRemoteMtu(1500);
-  SetLoss(10);
-  TestTransfer(100000);  // less data so test runs faster
-}
-
-// Test sending data with a 50 ms RTT and 10% packet loss. Transmission should
-// take much longer due to send back-off and slower detection of loss.
-TEST_F(PseudoTcpTest, TestSendWithDelayAndLoss) {
-  SetLocalMtu(1500);
-  SetRemoteMtu(1500);
-  SetDelay(50);
-  SetLoss(10);
-  TestTransfer(100000);  // less data so test runs faster
-}
-
-// Test sending data with 10% packet loss and Nagling disabled.  Transmission
-// should take about the same time as with Nagling enabled.
-TEST_F(PseudoTcpTest, TestSendWithLossAndOptNaglingOff) {
-  SetLocalMtu(1500);
-  SetRemoteMtu(1500);
-  SetLoss(10);
-  SetOptNagling(false);
-  TestTransfer(100000);  // less data so test runs faster
-}
-
-// Test sending data with 10% packet loss and Delayed ACK disabled.
-// Transmission should be slightly faster than with it enabled.
-TEST_F(PseudoTcpTest, TestSendWithLossAndOptAckDelayOff) {
-  SetLocalMtu(1500);
-  SetRemoteMtu(1500);
-  SetLoss(10);
-  SetOptAckDelay(0);
-  TestTransfer(100000);
-}
-
-// Test sending data with 50ms delay and Nagling disabled.
-TEST_F(PseudoTcpTest, TestSendWithDelayAndOptNaglingOff) {
-  SetLocalMtu(1500);
-  SetRemoteMtu(1500);
-  SetDelay(50);
-  SetOptNagling(false);
-  TestTransfer(100000);  // less data so test runs faster
-}
-
-// Test sending data with 50ms delay and Delayed ACK disabled.
-TEST_F(PseudoTcpTest, TestSendWithDelayAndOptAckDelayOff) {
-  SetLocalMtu(1500);
-  SetRemoteMtu(1500);
-  SetDelay(50);
-  SetOptAckDelay(0);
-  TestTransfer(100000);  // less data so test runs faster
-}
-
-// Test a large receive buffer with a sender that doesn't support scaling.
-TEST_F(PseudoTcpTest, TestSendRemoteNoWindowScale) {
-  SetLocalMtu(1500);
-  SetRemoteMtu(1500);
-  SetLocalOptRcvBuf(100000);
-  DisableRemoteWindowScale();
-  TestTransfer(1000000);
-}
-
-// Test a large sender-side receive buffer with a receiver that doesn't support
-// scaling.
-TEST_F(PseudoTcpTest, TestSendLocalNoWindowScale) {
-  SetLocalMtu(1500);
-  SetRemoteMtu(1500);
-  SetRemoteOptRcvBuf(100000);
-  DisableLocalWindowScale();
-  TestTransfer(1000000);
-}
-
-// Test when both sides use window scaling.
-TEST_F(PseudoTcpTest, TestSendBothUseWindowScale) {
-  SetLocalMtu(1500);
-  SetRemoteMtu(1500);
-  SetRemoteOptRcvBuf(100000);
-  SetLocalOptRcvBuf(100000);
-  TestTransfer(1000000);
-}
-
-// Test using a large window scale value.
-TEST_F(PseudoTcpTest, TestSendLargeInFlight) {
-  SetLocalMtu(1500);
-  SetRemoteMtu(1500);
-  SetRemoteOptRcvBuf(100000);
-  SetLocalOptRcvBuf(100000);
-  SetOptSndBuf(150000);
-  TestTransfer(1000000);
-}
-
-TEST_F(PseudoTcpTest, TestSendBothUseLargeWindowScale) {
-  SetLocalMtu(1500);
-  SetRemoteMtu(1500);
-  SetRemoteOptRcvBuf(1000000);
-  SetLocalOptRcvBuf(1000000);
-  TestTransfer(10000000);
-}
-
-// Test using a small receive buffer.
-TEST_F(PseudoTcpTest, TestSendSmallReceiveBuffer) {
-  SetLocalMtu(1500);
-  SetRemoteMtu(1500);
-  SetRemoteOptRcvBuf(10000);
-  SetLocalOptRcvBuf(10000);
-  TestTransfer(1000000);
-}
-
-// Test using a very small receive buffer.
-TEST_F(PseudoTcpTest, TestSendVerySmallReceiveBuffer) {
-  SetLocalMtu(1500);
-  SetRemoteMtu(1500);
-  SetRemoteOptRcvBuf(100);
-  SetLocalOptRcvBuf(100);
-  TestTransfer(100000);
-}
-
-// Ping-pong (request/response) tests
-
-// Test sending <= 1x MTU of data in each ping/pong.  Should take <10ms.
-TEST_F(PseudoTcpTestPingPong, TestPingPong1xMtu) {
-  SetLocalMtu(1500);
-  SetRemoteMtu(1500);
-  TestPingPong(100, 100);
-}
-
-// Test sending 2x-3x MTU of data in each ping/pong.  Should take <10ms.
-TEST_F(PseudoTcpTestPingPong, TestPingPong3xMtu) {
-  SetLocalMtu(1500);
-  SetRemoteMtu(1500);
-  TestPingPong(400, 100);
-}
-
-// Test sending 1x-2x MTU of data in each ping/pong.
-// Should take ~1s, due to interaction between Nagling and Delayed ACK.
-TEST_F(PseudoTcpTestPingPong, TestPingPong2xMtu) {
-  SetLocalMtu(1500);
-  SetRemoteMtu(1500);
-  TestPingPong(2000, 5);
-}
-
-// Test sending 1x-2x MTU of data in each ping/pong with Delayed ACK off.
-// Should take <10ms.
-TEST_F(PseudoTcpTestPingPong, TestPingPong2xMtuWithAckDelayOff) {
-  SetLocalMtu(1500);
-  SetRemoteMtu(1500);
-  SetOptAckDelay(0);
-  TestPingPong(2000, 100);
-}
-
-// Test sending 1x-2x MTU of data in each ping/pong with Nagling off.
-// Should take <10ms.
-TEST_F(PseudoTcpTestPingPong, TestPingPong2xMtuWithNaglingOff) {
-  SetLocalMtu(1500);
-  SetRemoteMtu(1500);
-  SetOptNagling(false);
-  TestPingPong(2000, 5);
-}
-
-// Test sending a ping as pair of short (non-full) segments.
-// Should take ~1s, due to Delayed ACK interaction with Nagling.
-TEST_F(PseudoTcpTestPingPong, TestPingPongShortSegments) {
-  SetLocalMtu(1500);
-  SetRemoteMtu(1500);
-  SetOptAckDelay(5000);
-  SetBytesPerSend(50); // i.e. two Send calls per payload
-  TestPingPong(100, 5);
-}
-
-// Test sending ping as a pair of short (non-full) segments, with Nagling off.
-// Should take <10ms.
-TEST_F(PseudoTcpTestPingPong, TestPingPongShortSegmentsWithNaglingOff) {
-  SetLocalMtu(1500);
-  SetRemoteMtu(1500);
-  SetOptNagling(false);
-  SetBytesPerSend(50); // i.e. two Send calls per payload
-  TestPingPong(100, 5);
-}
-
-// Test sending <= 1x MTU of data ping/pong, in two segments, no Delayed ACK.
-// Should take ~1s.
-TEST_F(PseudoTcpTestPingPong, TestPingPongShortSegmentsWithAckDelayOff) {
-  SetLocalMtu(1500);
-  SetRemoteMtu(1500);
-  SetBytesPerSend(50); // i.e. two Send calls per payload
-  SetOptAckDelay(0);
-  TestPingPong(100, 5);
-}
-
-// Test that receive window expands and contract correctly.
-TEST_F(PseudoTcpTestReceiveWindow, TestReceiveWindow) {
-  SetLocalMtu(1500);
-  SetRemoteMtu(1500);
-  SetOptNagling(false);
-  SetOptAckDelay(0);
-  TestTransfer(1024 * 1000);
-}
-
-// Test setting send window size to a very small value.
-TEST_F(PseudoTcpTestReceiveWindow, TestSetVerySmallSendWindowSize) {
-  SetLocalMtu(1500);
-  SetRemoteMtu(1500);
-  SetOptNagling(false);
-  SetOptAckDelay(0);
-  SetOptSndBuf(900);
-  TestTransfer(1024 * 1000);
-  EXPECT_EQ(900u, EstimateSendWindowSize());
-}
-
-// Test setting receive window size to a value other than default.
-TEST_F(PseudoTcpTestReceiveWindow, TestSetReceiveWindowSize) {
-  SetLocalMtu(1500);
-  SetRemoteMtu(1500);
-  SetOptNagling(false);
-  SetOptAckDelay(0);
-  SetRemoteOptRcvBuf(100000);
-  SetLocalOptRcvBuf(100000);
-  TestTransfer(1024 * 1000);
-  EXPECT_EQ(100000u, EstimateReceiveWindowSize());
-}
-
-/* Test sending data with mismatched MTUs. We should detect this and reduce
-// our packet size accordingly.
-// TODO: This doesn't actually work right now. The current code
-// doesn't detect if the MTU is set too high on either side.
-TEST_F(PseudoTcpTest, TestSendWithMismatchedMtus) {
-  SetLocalMtu(1500);
-  SetRemoteMtu(1280);
-  TestTransfer(1000000);
-}
-*/
diff --git a/p2p/base/relayport.cc b/p2p/base/relayport.cc
deleted file mode 100644
index 387ec4b..0000000
--- a/p2p/base/relayport.cc
+++ /dev/null
@@ -1,841 +0,0 @@
-/*
- *  Copyright 2004 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 <algorithm>
-
-#include "webrtc/p2p/base/relayport.h"
-#include "webrtc/rtc_base/asyncpacketsocket.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/helpers.h"
-#include "webrtc/rtc_base/logging.h"
-
-namespace cricket {
-
-static const int kMessageConnectTimeout = 1;
-static const int kKeepAliveDelay           = 10 * 60 * 1000;
-static const int kRetryTimeout             = 50 * 1000;  // ICE says 50 secs
-// How long to wait for a socket to connect to remote host in milliseconds
-// before trying another connection.
-static const int kSoftConnectTimeoutMs     = 3 * 1000;
-
-// Handles a connection to one address/port/protocol combination for a
-// particular RelayEntry.
-class RelayConnection : public sigslot::has_slots<> {
- public:
-  RelayConnection(const ProtocolAddress* protocol_address,
-                  rtc::AsyncPacketSocket* socket,
-                  rtc::Thread* thread);
-  ~RelayConnection();
-  rtc::AsyncPacketSocket* socket() const { return socket_; }
-
-  const ProtocolAddress* protocol_address() {
-    return protocol_address_;
-  }
-
-  rtc::SocketAddress GetAddress() const {
-    return protocol_address_->address;
-  }
-
-  ProtocolType GetProtocol() const {
-    return protocol_address_->proto;
-  }
-
-  int SetSocketOption(rtc::Socket::Option opt, int value);
-
-  // Validates a response to a STUN allocate request.
-  bool CheckResponse(StunMessage* msg);
-
-  // Sends data to the relay server.
-  int Send(const void* pv, size_t cb, const rtc::PacketOptions& options);
-
-  // Sends a STUN allocate request message to the relay server.
-  void SendAllocateRequest(RelayEntry* entry, int delay);
-
-  // Return the latest error generated by the socket.
-  int GetError() { return socket_->GetError(); }
-
-  // Called on behalf of a StunRequest to write data to the socket.  This is
-  // already STUN intended for the server, so no wrapping is necessary.
-  void OnSendPacket(const void* data, size_t size, StunRequest* req);
-
- private:
-  rtc::AsyncPacketSocket* socket_;
-  const ProtocolAddress* protocol_address_;
-  StunRequestManager *request_manager_;
-};
-
-// Manages a number of connections to the relayserver, one for each
-// available protocol. We aim to use each connection for only a
-// specific destination address so that we can avoid wrapping every
-// packet in a STUN send / data indication.
-class RelayEntry : public rtc::MessageHandler,
-                   public sigslot::has_slots<> {
- public:
-  RelayEntry(RelayPort* port, const rtc::SocketAddress& ext_addr);
-  ~RelayEntry();
-
-  RelayPort* port() { return port_; }
-
-  const rtc::SocketAddress& address() const { return ext_addr_; }
-  void set_address(const rtc::SocketAddress& addr) { ext_addr_ = addr; }
-
-  bool connected() const { return connected_; }
-  bool locked() const { return locked_; }
-
-  // Returns the last error on the socket of this entry.
-  int GetError();
-
-  // Returns the most preferred connection of the given
-  // ones. Connections are rated based on protocol in the order of:
-  // UDP, TCP and SSLTCP, where UDP is the most preferred protocol
-  static RelayConnection* GetBestConnection(RelayConnection* conn1,
-                                            RelayConnection* conn2);
-
-  // Sends the STUN requests to the server to initiate this connection.
-  void Connect();
-
-  // Called when this entry becomes connected.  The address given is the one
-  // exposed to the outside world on the relay server.
-  void OnConnect(const rtc::SocketAddress& mapped_addr,
-                 RelayConnection* socket);
-
-  // Sends a packet to the given destination address using the socket of this
-  // entry.  This will wrap the packet in STUN if necessary.
-  int SendTo(const void* data, size_t size,
-             const rtc::SocketAddress& addr,
-             const rtc::PacketOptions& options);
-
-  // Schedules a keep-alive allocate request.
-  void ScheduleKeepAlive();
-
-  void SetServerIndex(size_t sindex) { server_index_ = sindex; }
-
-  // Sets this option on the socket of each connection.
-  int SetSocketOption(rtc::Socket::Option opt, int value);
-
-  size_t ServerIndex() const { return server_index_; }
-
-  // Try a different server address
-  void HandleConnectFailure(rtc::AsyncPacketSocket* socket);
-
-  // Implementation of the MessageHandler Interface.
-  virtual void OnMessage(rtc::Message *pmsg);
-
- private:
-  RelayPort* port_;
-  rtc::SocketAddress ext_addr_;
-  size_t server_index_;
-  bool connected_;
-  bool locked_;
-  RelayConnection* current_connection_;
-
-  // Called when a TCP connection is established or fails
-  void OnSocketConnect(rtc::AsyncPacketSocket* socket);
-  void OnSocketClose(rtc::AsyncPacketSocket* socket, int error);
-
-  // Called when a packet is received on this socket.
-  void OnReadPacket(
-    rtc::AsyncPacketSocket* socket,
-    const char* data, size_t size,
-    const rtc::SocketAddress& remote_addr,
-    const rtc::PacketTime& packet_time);
-
-  void OnSentPacket(rtc::AsyncPacketSocket* socket,
-                    const rtc::SentPacket& sent_packet);
-
-  // Called when the socket is currently able to send.
-  void OnReadyToSend(rtc::AsyncPacketSocket* socket);
-
-  // Sends the given data on the socket to the server with no wrapping.  This
-  // returns the number of bytes written or -1 if an error occurred.
-  int SendPacket(const void* data, size_t size,
-                 const rtc::PacketOptions& options);
-};
-
-// Handles an allocate request for a particular RelayEntry.
-class AllocateRequest : public StunRequest {
- public:
-  AllocateRequest(RelayEntry* entry, RelayConnection* connection);
-  virtual ~AllocateRequest() {}
-
-  void Prepare(StunMessage* request) override;
-
-  void OnSent() override;
-  int resend_delay() override;
-
-  void OnResponse(StunMessage* response) override;
-  void OnErrorResponse(StunMessage* response) override;
-  void OnTimeout() override;
-
- private:
-  RelayEntry* entry_;
-  RelayConnection* connection_;
-  int64_t start_time_;
-};
-
-RelayPort::RelayPort(rtc::Thread* thread,
-                     rtc::PacketSocketFactory* factory,
-                     rtc::Network* network,
-                     uint16_t min_port,
-                     uint16_t max_port,
-                     const std::string& username,
-                     const std::string& password)
-    : Port(thread,
-           RELAY_PORT_TYPE,
-           factory,
-           network,
-           min_port,
-           max_port,
-           username,
-           password),
-      ready_(false),
-      error_(0) {
-  entries_.push_back(
-      new RelayEntry(this, rtc::SocketAddress()));
-  // TODO: set local preference value for TCP based candidates.
-}
-
-RelayPort::~RelayPort() {
-  for (size_t i = 0; i < entries_.size(); ++i)
-    delete entries_[i];
-  thread()->Clear(this);
-}
-
-void RelayPort::AddServerAddress(const ProtocolAddress& addr) {
-  // Since HTTP proxies usually only allow 443,
-  // let's up the priority on PROTO_SSLTCP
-  if (addr.proto == PROTO_SSLTCP &&
-      (proxy().type == rtc::PROXY_HTTPS ||
-       proxy().type == rtc::PROXY_UNKNOWN)) {
-    server_addr_.push_front(addr);
-  } else {
-    server_addr_.push_back(addr);
-  }
-}
-
-void RelayPort::AddExternalAddress(const ProtocolAddress& addr) {
-  std::string proto_name = ProtoToString(addr.proto);
-  for (std::vector<ProtocolAddress>::iterator it = external_addr_.begin();
-       it != external_addr_.end(); ++it) {
-    if ((it->address == addr.address) && (it->proto == addr.proto)) {
-      LOG(INFO) << "Redundant relay address: " << proto_name
-                << " @ " << addr.address.ToSensitiveString();
-      return;
-    }
-  }
-  external_addr_.push_back(addr);
-}
-
-void RelayPort::SetReady() {
-  if (!ready_) {
-    std::vector<ProtocolAddress>::iterator iter;
-    for (iter = external_addr_.begin();
-         iter != external_addr_.end(); ++iter) {
-      std::string proto_name = ProtoToString(iter->proto);
-      // In case of Gturn, related address is set to null socket address.
-      // This is due to as mapped address stun attribute is used for allocated
-      // address.
-      AddAddress(iter->address, iter->address, rtc::SocketAddress(), proto_name,
-                 proto_name, "", RELAY_PORT_TYPE, ICE_TYPE_PREFERENCE_RELAY_UDP,
-                 0, "", false);
-    }
-    ready_ = true;
-    SignalPortComplete(this);
-  }
-}
-
-const ProtocolAddress * RelayPort::ServerAddress(size_t index) const {
-  if (index < server_addr_.size())
-    return &server_addr_[index];
-  return NULL;
-}
-
-bool RelayPort::HasMagicCookie(const char* data, size_t size) {
-  if (size < 24 + sizeof(TURN_MAGIC_COOKIE_VALUE)) {
-    return false;
-  } else {
-    return memcmp(data + 24,
-                  TURN_MAGIC_COOKIE_VALUE,
-                  sizeof(TURN_MAGIC_COOKIE_VALUE)) == 0;
-  }
-}
-
-void RelayPort::PrepareAddress() {
-  // We initiate a connect on the first entry.  If this completes, it will fill
-  // in the server address as the address of this port.
-  RTC_DCHECK(entries_.size() == 1);
-  entries_[0]->Connect();
-  ready_ = false;
-}
-
-Connection* RelayPort::CreateConnection(const Candidate& address,
-                                        CandidateOrigin origin) {
-  // We only create conns to non-udp sockets if they are incoming on this port
-  if ((address.protocol() != UDP_PROTOCOL_NAME) &&
-      (origin != ORIGIN_THIS_PORT)) {
-    return 0;
-  }
-
-  // We don't support loopback on relays
-  if (address.type() == Type()) {
-    return 0;
-  }
-
-  if (!IsCompatibleAddress(address.address())) {
-    return 0;
-  }
-
-  size_t index = 0;
-  for (size_t i = 0; i < Candidates().size(); ++i) {
-    const Candidate& local = Candidates()[i];
-    if (local.protocol() == address.protocol()) {
-      index = i;
-      break;
-    }
-  }
-
-  Connection * conn = new ProxyConnection(this, index, address);
-  AddOrReplaceConnection(conn);
-  return conn;
-}
-
-int RelayPort::SendTo(const void* data, size_t size,
-                      const rtc::SocketAddress& addr,
-                      const rtc::PacketOptions& options,
-                      bool payload) {
-  // Try to find an entry for this specific address.  Note that the first entry
-  // created was not given an address initially, so it can be set to the first
-  // address that comes along.
-  RelayEntry* entry = 0;
-
-  for (size_t i = 0; i < entries_.size(); ++i) {
-    if (entries_[i]->address().IsNil() && payload) {
-      entry = entries_[i];
-      entry->set_address(addr);
-      break;
-    } else if (entries_[i]->address() == addr) {
-      entry = entries_[i];
-      break;
-    }
-  }
-
-  // If we did not find one, then we make a new one.  This will not be useable
-  // until it becomes connected, however.
-  if (!entry && payload) {
-    entry = new RelayEntry(this, addr);
-    if (!entries_.empty()) {
-      entry->SetServerIndex(entries_[0]->ServerIndex());
-    }
-    entry->Connect();
-    entries_.push_back(entry);
-  }
-
-  // If the entry is connected, then we can send on it (though wrapping may
-  // still be necessary).  Otherwise, we can't yet use this connection, so we
-  // default to the first one.
-  if (!entry || !entry->connected()) {
-    RTC_DCHECK(!entries_.empty());
-    entry = entries_[0];
-    if (!entry->connected()) {
-      error_ = ENOTCONN;
-      return SOCKET_ERROR;
-    }
-  }
-
-  // Send the actual contents to the server using the usual mechanism.
-  int sent = entry->SendTo(data, size, addr, options);
-  if (sent <= 0) {
-    RTC_DCHECK(sent < 0);
-    error_ = entry->GetError();
-    return SOCKET_ERROR;
-  }
-  // The caller of the function is expecting the number of user data bytes,
-  // rather than the size of the packet.
-  return static_cast<int>(size);
-}
-
-int RelayPort::SetOption(rtc::Socket::Option opt, int value) {
-  int result = 0;
-  for (size_t i = 0; i < entries_.size(); ++i) {
-    if (entries_[i]->SetSocketOption(opt, value) < 0) {
-      result = -1;
-      error_ = entries_[i]->GetError();
-    }
-  }
-  options_.push_back(OptionValue(opt, value));
-  return result;
-}
-
-int RelayPort::GetOption(rtc::Socket::Option opt, int* value) {
-  std::vector<OptionValue>::iterator it;
-  for (it = options_.begin(); it < options_.end(); ++it) {
-    if (it->first == opt) {
-      *value = it->second;
-      return 0;
-    }
-  }
-  return SOCKET_ERROR;
-}
-
-int RelayPort::GetError() {
-  return error_;
-}
-
-void RelayPort::OnReadPacket(
-    const char* data, size_t size,
-    const rtc::SocketAddress& remote_addr,
-    ProtocolType proto,
-    const rtc::PacketTime& packet_time) {
-  if (Connection* conn = GetConnection(remote_addr)) {
-    conn->OnReadPacket(data, size, packet_time);
-  } else {
-    Port::OnReadPacket(data, size, remote_addr, proto);
-  }
-}
-
-RelayConnection::RelayConnection(const ProtocolAddress* protocol_address,
-                                 rtc::AsyncPacketSocket* socket,
-                                 rtc::Thread* thread)
-    : socket_(socket),
-      protocol_address_(protocol_address) {
-  request_manager_ = new StunRequestManager(thread);
-  request_manager_->SignalSendPacket.connect(this,
-                                             &RelayConnection::OnSendPacket);
-}
-
-RelayConnection::~RelayConnection() {
-  delete request_manager_;
-  delete socket_;
-}
-
-int RelayConnection::SetSocketOption(rtc::Socket::Option opt,
-                                     int value) {
-  if (socket_) {
-    return socket_->SetOption(opt, value);
-  }
-  return 0;
-}
-
-bool RelayConnection::CheckResponse(StunMessage* msg) {
-  return request_manager_->CheckResponse(msg);
-}
-
-void RelayConnection::OnSendPacket(const void* data, size_t size,
-                                   StunRequest* req) {
-  // TODO(mallinath) Find a way to get DSCP value from Port.
-  rtc::PacketOptions options;  // Default dscp set to NO_CHANGE.
-  int sent = socket_->SendTo(data, size, GetAddress(), options);
-  if (sent <= 0) {
-    LOG(LS_VERBOSE) << "OnSendPacket: failed sending to " << GetAddress() <<
-        strerror(socket_->GetError());
-    RTC_DCHECK(sent < 0);
-  }
-}
-
-int RelayConnection::Send(const void* pv, size_t cb,
-                          const rtc::PacketOptions& options) {
-  return socket_->SendTo(pv, cb, GetAddress(), options);
-}
-
-void RelayConnection::SendAllocateRequest(RelayEntry* entry, int delay) {
-  request_manager_->SendDelayed(new AllocateRequest(entry, this), delay);
-}
-
-RelayEntry::RelayEntry(RelayPort* port,
-                       const rtc::SocketAddress& ext_addr)
-    : port_(port), ext_addr_(ext_addr),
-      server_index_(0), connected_(false), locked_(false),
-      current_connection_(NULL) {
-}
-
-RelayEntry::~RelayEntry() {
-  // Remove all RelayConnections and dispose sockets.
-  delete current_connection_;
-  current_connection_ = NULL;
-}
-
-void RelayEntry::Connect() {
-  // If we're already connected, return.
-  if (connected_)
-    return;
-
-  // If we've exhausted all options, bail out.
-  const ProtocolAddress* ra = port()->ServerAddress(server_index_);
-  if (!ra) {
-    LOG(LS_WARNING) << "No more relay addresses left to try";
-    return;
-  }
-
-  // Remove any previous connection.
-  if (current_connection_) {
-    port()->thread()->Dispose(current_connection_);
-    current_connection_ = NULL;
-  }
-
-  // Try to set up our new socket.
-  LOG(LS_INFO) << "Connecting to relay via " << ProtoToString(ra->proto) <<
-      " @ " << ra->address.ToSensitiveString();
-
-  rtc::AsyncPacketSocket* socket = NULL;
-
-  if (ra->proto == PROTO_UDP) {
-    // UDP sockets are simple.
-    socket = port_->socket_factory()->CreateUdpSocket(
-        rtc::SocketAddress(port_->Network()->GetBestIP(), 0), port_->min_port(),
-        port_->max_port());
-  } else if (ra->proto == PROTO_TCP || ra->proto == PROTO_SSLTCP) {
-    int opts = (ra->proto == PROTO_SSLTCP)
-                   ? rtc::PacketSocketFactory::OPT_TLS_FAKE
-                   : 0;
-    socket = port_->socket_factory()->CreateClientTcpSocket(
-        rtc::SocketAddress(port_->Network()->GetBestIP(), 0), ra->address,
-        port_->proxy(), port_->user_agent(), opts);
-  } else {
-    LOG(LS_WARNING) << "Unknown protocol (" << ra->proto << ")";
-  }
-
-  if (!socket) {
-    LOG(LS_WARNING) << "Socket creation failed";
-  }
-
-  // If we failed to get a socket, move on to the next protocol.
-  if (!socket) {
-    port()->thread()->Post(RTC_FROM_HERE, this, kMessageConnectTimeout);
-    return;
-  }
-
-  // Otherwise, create the new connection and configure any socket options.
-  socket->SignalReadPacket.connect(this, &RelayEntry::OnReadPacket);
-  socket->SignalSentPacket.connect(this, &RelayEntry::OnSentPacket);
-  socket->SignalReadyToSend.connect(this, &RelayEntry::OnReadyToSend);
-  current_connection_ = new RelayConnection(ra, socket, port()->thread());
-  for (size_t i = 0; i < port_->options().size(); ++i) {
-    current_connection_->SetSocketOption(port_->options()[i].first,
-                                         port_->options()[i].second);
-  }
-
-  // If we're trying UDP, start binding requests.
-  // If we're trying TCP, wait for connection with a fixed timeout.
-  if ((ra->proto == PROTO_TCP) || (ra->proto == PROTO_SSLTCP)) {
-    socket->SignalClose.connect(this, &RelayEntry::OnSocketClose);
-    socket->SignalConnect.connect(this, &RelayEntry::OnSocketConnect);
-    port()->thread()->PostDelayed(RTC_FROM_HERE, kSoftConnectTimeoutMs, this,
-                                  kMessageConnectTimeout);
-  } else {
-    current_connection_->SendAllocateRequest(this, 0);
-  }
-}
-
-int RelayEntry::GetError() {
-  if (current_connection_ != NULL) {
-    return current_connection_->GetError();
-  }
-  return 0;
-}
-
-RelayConnection* RelayEntry::GetBestConnection(RelayConnection* conn1,
-                                               RelayConnection* conn2) {
-  return conn1->GetProtocol() <= conn2->GetProtocol() ? conn1 : conn2;
-}
-
-void RelayEntry::OnConnect(const rtc::SocketAddress& mapped_addr,
-                           RelayConnection* connection) {
-  // We are connected, notify our parent.
-  ProtocolType proto = PROTO_UDP;
-  LOG(INFO) << "Relay allocate succeeded: " << ProtoToString(proto)
-            << " @ " << mapped_addr.ToSensitiveString();
-  connected_ = true;
-
-  port_->AddExternalAddress(ProtocolAddress(mapped_addr, proto));
-  port_->SetReady();
-}
-
-int RelayEntry::SendTo(const void* data, size_t size,
-                       const rtc::SocketAddress& addr,
-                       const rtc::PacketOptions& options) {
-  // If this connection is locked to the address given, then we can send the
-  // packet with no wrapper.
-  if (locked_ && (ext_addr_ == addr))
-    return SendPacket(data, size, options);
-
-  // Otherwise, we must wrap the given data in a STUN SEND request so that we
-  // can communicate the destination address to the server.
-  //
-  // Note that we do not use a StunRequest here.  This is because there is
-  // likely no reason to resend this packet. If it is late, we just drop it.
-  // The next send to this address will try again.
-
-  RelayMessage request;
-  request.SetType(STUN_SEND_REQUEST);
-
-  auto magic_cookie_attr =
-      StunAttribute::CreateByteString(STUN_ATTR_MAGIC_COOKIE);
-  magic_cookie_attr->CopyBytes(TURN_MAGIC_COOKIE_VALUE,
-                               sizeof(TURN_MAGIC_COOKIE_VALUE));
-  request.AddAttribute(std::move(magic_cookie_attr));
-
-  auto username_attr = StunAttribute::CreateByteString(STUN_ATTR_USERNAME);
-  username_attr->CopyBytes(port_->username_fragment().c_str(),
-                           port_->username_fragment().size());
-  request.AddAttribute(std::move(username_attr));
-
-  auto addr_attr = StunAttribute::CreateAddress(STUN_ATTR_DESTINATION_ADDRESS);
-  addr_attr->SetIP(addr.ipaddr());
-  addr_attr->SetPort(addr.port());
-  request.AddAttribute(std::move(addr_attr));
-
-  // Attempt to lock
-  if (ext_addr_ == addr) {
-    auto options_attr = StunAttribute::CreateUInt32(STUN_ATTR_OPTIONS);
-    options_attr->SetValue(0x1);
-    request.AddAttribute(std::move(options_attr));
-  }
-
-  auto data_attr = StunAttribute::CreateByteString(STUN_ATTR_DATA);
-  data_attr->CopyBytes(data, size);
-  request.AddAttribute(std::move(data_attr));
-
-  // TODO: compute the HMAC.
-
-  rtc::ByteBufferWriter buf;
-  request.Write(&buf);
-
-  return SendPacket(buf.Data(), buf.Length(), options);
-}
-
-void RelayEntry::ScheduleKeepAlive() {
-  if (current_connection_) {
-    current_connection_->SendAllocateRequest(this, kKeepAliveDelay);
-  }
-}
-
-int RelayEntry::SetSocketOption(rtc::Socket::Option opt, int value) {
-  // Set the option on all available sockets.
-  int socket_error = 0;
-  if (current_connection_) {
-    socket_error = current_connection_->SetSocketOption(opt, value);
-  }
-  return socket_error;
-}
-
-void RelayEntry::HandleConnectFailure(
-    rtc::AsyncPacketSocket* socket) {
-  // Make sure it's the current connection that has failed, it might
-  // be an old socked that has not yet been disposed.
-  if (!socket ||
-      (current_connection_ && socket == current_connection_->socket())) {
-    if (current_connection_)
-      port()->SignalConnectFailure(current_connection_->protocol_address());
-
-    // Try to connect to the next server address.
-    server_index_ += 1;
-    Connect();
-  }
-}
-
-void RelayEntry::OnMessage(rtc::Message *pmsg) {
-  RTC_DCHECK(pmsg->message_id == kMessageConnectTimeout);
-  if (current_connection_) {
-    const ProtocolAddress* ra = current_connection_->protocol_address();
-    LOG(LS_WARNING) << "Relay " << ra->proto << " connection to " <<
-        ra->address << " timed out";
-
-    // Currently we connect to each server address in sequence. If we
-    // have more addresses to try, treat this is an error and move on to
-    // the next address, otherwise give this connection more time and
-    // await the real timeout.
-    //
-    // TODO: Connect to servers in parallel to speed up connect time
-    // and to avoid giving up too early.
-    port_->SignalSoftTimeout(ra);
-    HandleConnectFailure(current_connection_->socket());
-  } else {
-    HandleConnectFailure(NULL);
-  }
-}
-
-void RelayEntry::OnSocketConnect(rtc::AsyncPacketSocket* socket) {
-  LOG(INFO) << "relay tcp connected to " <<
-      socket->GetRemoteAddress().ToSensitiveString();
-  if (current_connection_ != NULL) {
-    current_connection_->SendAllocateRequest(this, 0);
-  }
-}
-
-void RelayEntry::OnSocketClose(rtc::AsyncPacketSocket* socket,
-                               int error) {
-  PLOG(LERROR, error) << "Relay connection failed: socket closed";
-  HandleConnectFailure(socket);
-}
-
-void RelayEntry::OnReadPacket(
-    rtc::AsyncPacketSocket* socket,
-    const char* data, size_t size,
-    const rtc::SocketAddress& remote_addr,
-    const rtc::PacketTime& packet_time) {
-  // RTC_DCHECK(remote_addr == port_->server_addr());
-  // TODO: are we worried about this?
-
-  if (current_connection_ == NULL || socket != current_connection_->socket()) {
-    // This packet comes from an unknown address.
-    LOG(WARNING) << "Dropping packet: unknown address";
-    return;
-  }
-
-  // If the magic cookie is not present, then this is an unwrapped packet sent
-  // by the server,  The actual remote address is the one we recorded.
-  if (!port_->HasMagicCookie(data, size)) {
-    if (locked_) {
-      port_->OnReadPacket(data, size, ext_addr_, PROTO_UDP, packet_time);
-    } else {
-      LOG(WARNING) << "Dropping packet: entry not locked";
-    }
-    return;
-  }
-
-  rtc::ByteBufferReader buf(data, size);
-  RelayMessage msg;
-  if (!msg.Read(&buf)) {
-    LOG(INFO) << "Incoming packet was not STUN";
-    return;
-  }
-
-  // The incoming packet should be a STUN ALLOCATE response, SEND response, or
-  // DATA indication.
-  if (current_connection_->CheckResponse(&msg)) {
-    return;
-  } else if (msg.type() == STUN_SEND_RESPONSE) {
-    if (const StunUInt32Attribute* options_attr =
-        msg.GetUInt32(STUN_ATTR_OPTIONS)) {
-      if (options_attr->value() & 0x1) {
-        locked_ = true;
-      }
-    }
-    return;
-  } else if (msg.type() != STUN_DATA_INDICATION) {
-    LOG(INFO) << "Received BAD stun type from server: " << msg.type();
-    return;
-  }
-
-  // This must be a data indication.
-
-  const StunAddressAttribute* addr_attr =
-      msg.GetAddress(STUN_ATTR_SOURCE_ADDRESS2);
-  if (!addr_attr) {
-    LOG(INFO) << "Data indication has no source address";
-    return;
-  } else if (addr_attr->family() != 1) {
-    LOG(INFO) << "Source address has bad family";
-    return;
-  }
-
-  rtc::SocketAddress remote_addr2(addr_attr->ipaddr(), addr_attr->port());
-
-  const StunByteStringAttribute* data_attr = msg.GetByteString(STUN_ATTR_DATA);
-  if (!data_attr) {
-    LOG(INFO) << "Data indication has no data";
-    return;
-  }
-
-  // Process the actual data and remote address in the normal manner.
-  port_->OnReadPacket(data_attr->bytes(), data_attr->length(), remote_addr2,
-                      PROTO_UDP, packet_time);
-}
-
-void RelayEntry::OnSentPacket(rtc::AsyncPacketSocket* socket,
-                              const rtc::SentPacket& sent_packet) {
-  port_->OnSentPacket(socket, sent_packet);
-}
-
-void RelayEntry::OnReadyToSend(rtc::AsyncPacketSocket* socket) {
-  if (connected()) {
-    port_->OnReadyToSend();
-  }
-}
-
-int RelayEntry::SendPacket(const void* data, size_t size,
-                           const rtc::PacketOptions& options) {
-  int sent = 0;
-  if (current_connection_) {
-    // We are connected, no need to send packets anywere else than to
-    // the current connection.
-    sent = current_connection_->Send(data, size, options);
-  }
-  return sent;
-}
-
-AllocateRequest::AllocateRequest(RelayEntry* entry,
-                                 RelayConnection* connection)
-    : StunRequest(new RelayMessage()),
-      entry_(entry),
-      connection_(connection) {
-  start_time_ = rtc::TimeMillis();
-}
-
-void AllocateRequest::Prepare(StunMessage* request) {
-  request->SetType(STUN_ALLOCATE_REQUEST);
-
-  auto username_attr = StunAttribute::CreateByteString(STUN_ATTR_USERNAME);
-  username_attr->CopyBytes(
-      entry_->port()->username_fragment().c_str(),
-      entry_->port()->username_fragment().size());
-  request->AddAttribute(std::move(username_attr));
-}
-
-void AllocateRequest::OnSent() {
-  count_ += 1;
-  if (count_ == 5)
-    timeout_ = true;
-}
-
-int AllocateRequest::resend_delay() {
-  if (count_ == 0) {
-    return 0;
-  }
-  return 100 * std::max(1 << (count_-1), 2);
-}
-
-
-void AllocateRequest::OnResponse(StunMessage* response) {
-  const StunAddressAttribute* addr_attr =
-      response->GetAddress(STUN_ATTR_MAPPED_ADDRESS);
-  if (!addr_attr) {
-    LOG(INFO) << "Allocate response missing mapped address.";
-  } else if (addr_attr->family() != 1) {
-    LOG(INFO) << "Mapped address has bad family";
-  } else {
-    rtc::SocketAddress addr(addr_attr->ipaddr(), addr_attr->port());
-    entry_->OnConnect(addr, connection_);
-  }
-
-  // We will do a keep-alive regardless of whether this request suceeds.
-  // This should have almost no impact on network usage.
-  entry_->ScheduleKeepAlive();
-}
-
-void AllocateRequest::OnErrorResponse(StunMessage* response) {
-  const StunErrorCodeAttribute* attr = response->GetErrorCode();
-  if (!attr) {
-    LOG(LS_ERROR) << "Missing allocate response error code.";
-  } else {
-    LOG(INFO) << "Allocate error response:"
-              << " code=" << attr->code()
-              << " reason='" << attr->reason() << "'";
-  }
-
-  if (rtc::TimeMillis() - start_time_ <= kRetryTimeout)
-    entry_->ScheduleKeepAlive();
-}
-
-void AllocateRequest::OnTimeout() {
-  LOG(INFO) << "Allocate request timed out";
-  entry_->HandleConnectFailure(connection_->socket());
-}
-
-}  // namespace cricket
diff --git a/p2p/base/relayport.h b/p2p/base/relayport.h
deleted file mode 100644
index e2e6800..0000000
--- a/p2p/base/relayport.h
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- *  Copyright 2004 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_P2P_BASE_RELAYPORT_H_
-#define WEBRTC_P2P_BASE_RELAYPORT_H_
-
-#include <deque>
-#include <string>
-#include <utility>
-#include <vector>
-
-#include "webrtc/p2p/base/port.h"
-#include "webrtc/p2p/base/stunrequest.h"
-
-namespace cricket {
-
-class RelayEntry;
-class RelayConnection;
-
-// Communicates using an allocated port on the relay server. For each
-// remote candidate that we try to send data to a RelayEntry instance
-// is created. The RelayEntry will try to reach the remote destination
-// by connecting to all available server addresses in a pre defined
-// order with a small delay in between. When a connection is
-// successful all other connection attempts are aborted.
-class RelayPort : public Port {
- public:
-  typedef std::pair<rtc::Socket::Option, int> OptionValue;
-
-  // RelayPort doesn't yet do anything fancy in the ctor.
-  static RelayPort* Create(rtc::Thread* thread,
-                           rtc::PacketSocketFactory* factory,
-                           rtc::Network* network,
-                           uint16_t min_port,
-                           uint16_t max_port,
-                           const std::string& username,
-                           const std::string& password) {
-    return new RelayPort(thread, factory, network, min_port, max_port, username,
-                         password);
-  }
-  ~RelayPort() override;
-
-  void AddServerAddress(const ProtocolAddress& addr);
-  void AddExternalAddress(const ProtocolAddress& addr);
-
-  const std::vector<OptionValue>& options() const { return options_; }
-  bool HasMagicCookie(const char* data, size_t size);
-
-  void PrepareAddress() override;
-  Connection* CreateConnection(const Candidate& address,
-                               CandidateOrigin origin) override;
-  int SetOption(rtc::Socket::Option opt, int value) override;
-  int GetOption(rtc::Socket::Option opt, int* value) override;
-  int GetError() override;
-  bool SupportsProtocol(const std::string& protocol) const override {
-    // Relay port may create both TCP and UDP connections.
-    return true;
-  }
-
-  const ProtocolAddress * ServerAddress(size_t index) const;
-  bool IsReady() { return ready_; }
-
-  ProtocolType GetProtocol() const override {
-    // We shouldn't be using RelayPort, but we need to provide an
-    // implementation here.
-    return PROTO_UDP;
-  }
-
-  // Used for testing.
-  sigslot::signal1<const ProtocolAddress*> SignalConnectFailure;
-  sigslot::signal1<const ProtocolAddress*> SignalSoftTimeout;
-
- protected:
-  RelayPort(rtc::Thread* thread,
-            rtc::PacketSocketFactory* factory,
-            rtc::Network*,
-            uint16_t min_port,
-            uint16_t max_port,
-            const std::string& username,
-            const std::string& password);
-  bool Init();
-
-  void SetReady();
-
-  int SendTo(const void* data,
-             size_t size,
-             const rtc::SocketAddress& addr,
-             const rtc::PacketOptions& options,
-             bool payload) override;
-
-  // Dispatches the given packet to the port or connection as appropriate.
-  void OnReadPacket(const char* data, size_t size,
-                    const rtc::SocketAddress& remote_addr,
-                    ProtocolType proto,
-                    const rtc::PacketTime& packet_time);
-
-  // The OnSentPacket callback is left empty here since they are handled by
-  // RelayEntry.
-  void OnSentPacket(rtc::AsyncPacketSocket* socket,
-                    const rtc::SentPacket& sent_packet) override {}
-
- private:
-  friend class RelayEntry;
-
-  std::deque<ProtocolAddress> server_addr_;
-  std::vector<ProtocolAddress> external_addr_;
-  bool ready_;
-  std::vector<RelayEntry*> entries_;
-  std::vector<OptionValue> options_;
-  int error_;
-};
-
-}  // namespace cricket
-
-#endif  // WEBRTC_P2P_BASE_RELAYPORT_H_
diff --git a/p2p/base/relayport_unittest.cc b/p2p/base/relayport_unittest.cc
deleted file mode 100644
index a5d919a..0000000
--- a/p2p/base/relayport_unittest.cc
+++ /dev/null
@@ -1,273 +0,0 @@
-/*
- *  Copyright 2009 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 <memory>
-
-#include "webrtc/p2p/base/basicpacketsocketfactory.h"
-#include "webrtc/p2p/base/relayport.h"
-#include "webrtc/p2p/base/relayserver.h"
-#include "webrtc/rtc_base/gunit.h"
-#include "webrtc/rtc_base/helpers.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/socketadapters.h"
-#include "webrtc/rtc_base/socketaddress.h"
-#include "webrtc/rtc_base/ssladapter.h"
-#include "webrtc/rtc_base/thread.h"
-#include "webrtc/rtc_base/virtualsocketserver.h"
-
-using rtc::SocketAddress;
-
-static const SocketAddress kLocalAddress = SocketAddress("192.168.1.2", 0);
-static const SocketAddress kRelayUdpAddr = SocketAddress("99.99.99.1", 5000);
-static const SocketAddress kRelayTcpAddr = SocketAddress("99.99.99.2", 5001);
-static const SocketAddress kRelaySslAddr = SocketAddress("99.99.99.3", 443);
-static const SocketAddress kRelayExtAddr = SocketAddress("99.99.99.3", 5002);
-
-static const int kTimeoutMs = 1000;
-static const int kMaxTimeoutMs = 5000;
-
-// Tests connecting a RelayPort to a fake relay server
-// (cricket::RelayServer) using all currently available protocols. The
-// network layer is faked out by using a VirtualSocketServer for
-// creating sockets. The test will monitor the current state of the
-// RelayPort and created sockets by listening for signals such as,
-// SignalConnectFailure, SignalConnectTimeout, SignalSocketClosed and
-// SignalReadPacket.
-class RelayPortTest : public testing::Test,
-                      public sigslot::has_slots<> {
- public:
-  RelayPortTest()
-      : virtual_socket_server_(new rtc::VirtualSocketServer()),
-        main_(virtual_socket_server_.get()),
-        network_("unittest", "unittest", kLocalAddress.ipaddr(), 32),
-        socket_factory_(rtc::Thread::Current()),
-        username_(rtc::CreateRandomString(16)),
-        password_(rtc::CreateRandomString(16)),
-        relay_port_(cricket::RelayPort::Create(&main_,
-                                               &socket_factory_,
-                                               &network_,
-                                               0,
-                                               0,
-                                               username_,
-                                               password_)),
-        relay_server_(new cricket::RelayServer(&main_)) {
-    network_.AddIP(kLocalAddress.ipaddr());
-  }
-
-  void OnReadPacket(rtc::AsyncPacketSocket* socket,
-                    const char* data, size_t size,
-                    const rtc::SocketAddress& remote_addr,
-                    const rtc::PacketTime& packet_time) {
-    received_packet_count_[socket]++;
-  }
-
-  void OnConnectFailure(const cricket::ProtocolAddress* addr) {
-    failed_connections_.push_back(*addr);
-  }
-
-  void OnSoftTimeout(const cricket::ProtocolAddress* addr) {
-    soft_timedout_connections_.push_back(*addr);
-  }
-
- protected:
-  virtual void SetUp() {
-    // The relay server needs an external socket to work properly.
-    rtc::AsyncUDPSocket* ext_socket =
-        CreateAsyncUdpSocket(kRelayExtAddr);
-    relay_server_->AddExternalSocket(ext_socket);
-
-    // Listen for failures.
-    relay_port_->SignalConnectFailure.
-        connect(this, &RelayPortTest::OnConnectFailure);
-
-    // Listen for soft timeouts.
-    relay_port_->SignalSoftTimeout.
-        connect(this, &RelayPortTest::OnSoftTimeout);
-  }
-
-  // Udp has the highest 'goodness' value of the three different
-  // protocols used for connecting to the relay server. As soon as
-  // PrepareAddress is called, the RelayPort will start trying to
-  // connect to the given UDP address. As soon as a response to the
-  // sent STUN allocate request message has been received, the
-  // RelayPort will consider the connection to be complete and will
-  // abort any other connection attempts.
-  void TestConnectUdp() {
-    // Add a UDP socket to the relay server.
-    rtc::AsyncUDPSocket* internal_udp_socket =
-        CreateAsyncUdpSocket(kRelayUdpAddr);
-    rtc::AsyncSocket* server_socket = CreateServerSocket(kRelayTcpAddr);
-
-    relay_server_->AddInternalSocket(internal_udp_socket);
-    relay_server_->AddInternalServerSocket(server_socket, cricket::PROTO_TCP);
-
-    // Now add our relay addresses to the relay port and let it start.
-    relay_port_->AddServerAddress(
-        cricket::ProtocolAddress(kRelayUdpAddr, cricket::PROTO_UDP));
-    relay_port_->AddServerAddress(
-        cricket::ProtocolAddress(kRelayTcpAddr, cricket::PROTO_TCP));
-    relay_port_->PrepareAddress();
-
-    // Should be connected.
-    EXPECT_TRUE_WAIT(relay_port_->IsReady(), kTimeoutMs);
-
-    // Make sure that we are happy with UDP, ie. not continuing with
-    // TCP, SSLTCP, etc.
-    WAIT(relay_server_->HasConnection(kRelayTcpAddr), kTimeoutMs);
-
-    // Should have only one connection.
-    EXPECT_EQ(1, relay_server_->GetConnectionCount());
-
-    // Should be the UDP address.
-    EXPECT_TRUE(relay_server_->HasConnection(kRelayUdpAddr));
-  }
-
-  // TCP has the second best 'goodness' value, and as soon as UDP
-  // connection has failed, the RelayPort will attempt to connect via
-  // TCP. Here we add a fake UDP address together with a real TCP
-  // address to simulate an UDP failure. As soon as UDP has failed the
-  // RelayPort will try the TCP adress and succed.
-  void TestConnectTcp() {
-    // Create a fake UDP address for relay port to simulate a failure.
-    cricket::ProtocolAddress fake_protocol_address =
-        cricket::ProtocolAddress(kRelayUdpAddr, cricket::PROTO_UDP);
-
-    // Create a server socket for the RelayServer.
-    rtc::AsyncSocket* server_socket = CreateServerSocket(kRelayTcpAddr);
-    relay_server_->AddInternalServerSocket(server_socket, cricket::PROTO_TCP);
-
-    // Add server addresses to the relay port and let it start.
-    relay_port_->AddServerAddress(
-        cricket::ProtocolAddress(fake_protocol_address));
-    relay_port_->AddServerAddress(
-        cricket::ProtocolAddress(kRelayTcpAddr, cricket::PROTO_TCP));
-    relay_port_->PrepareAddress();
-
-    EXPECT_FALSE(relay_port_->IsReady());
-
-    // Should have timed out in 200 + 200 + 400 + 800 + 1600 ms = 3200ms.
-    // Add some margin of error for slow bots.
-    // TODO(deadbeef): Use simulated clock instead of just increasing timeouts
-    // to fix flaky tests.
-    EXPECT_TRUE_WAIT(HasFailed(&fake_protocol_address), 5000);
-
-    // Wait until relayport is ready.
-    EXPECT_TRUE_WAIT(relay_port_->IsReady(), kMaxTimeoutMs);
-
-    // Should have only one connection.
-    EXPECT_EQ(1, relay_server_->GetConnectionCount());
-
-    // Should be the TCP address.
-    EXPECT_TRUE(relay_server_->HasConnection(kRelayTcpAddr));
-  }
-
-  void TestConnectSslTcp() {
-    // Create a fake TCP address for relay port to simulate a failure.
-    // We skip UDP here since transition from UDP to TCP has been
-    // tested above.
-    cricket::ProtocolAddress fake_protocol_address =
-        cricket::ProtocolAddress(kRelayTcpAddr, cricket::PROTO_TCP);
-
-    // Create a ssl server socket for the RelayServer.
-    rtc::AsyncSocket* ssl_server_socket =
-        CreateServerSocket(kRelaySslAddr);
-    relay_server_->AddInternalServerSocket(ssl_server_socket,
-                                           cricket::PROTO_SSLTCP);
-
-    // Create a tcp server socket that listens on the fake address so
-    // the relay port can attempt to connect to it.
-    std::unique_ptr<rtc::AsyncSocket> tcp_server_socket(
-        CreateServerSocket(kRelayTcpAddr));
-
-    // Add server addresses to the relay port and let it start.
-    relay_port_->AddServerAddress(fake_protocol_address);
-    relay_port_->AddServerAddress(
-        cricket::ProtocolAddress(kRelaySslAddr, cricket::PROTO_SSLTCP));
-    relay_port_->PrepareAddress();
-    EXPECT_FALSE(relay_port_->IsReady());
-
-    // Should have timed out in 3000 ms(relayport.cc, kSoftConnectTimeoutMs).
-    EXPECT_TRUE_WAIT_MARGIN(HasTimedOut(&fake_protocol_address), 3000, 100);
-
-    // Wait until relayport is ready.
-    EXPECT_TRUE_WAIT(relay_port_->IsReady(), kMaxTimeoutMs);
-
-    // Should have only one connection.
-    EXPECT_EQ(1, relay_server_->GetConnectionCount());
-
-    // Should be the SSLTCP address.
-    EXPECT_TRUE(relay_server_->HasConnection(kRelaySslAddr));
-  }
-
- private:
-  rtc::AsyncUDPSocket* CreateAsyncUdpSocket(const SocketAddress addr) {
-    rtc::AsyncSocket* socket =
-        virtual_socket_server_->CreateAsyncSocket(SOCK_DGRAM);
-    rtc::AsyncUDPSocket* packet_socket =
-        rtc::AsyncUDPSocket::Create(socket, addr);
-    EXPECT_TRUE(packet_socket != NULL);
-    packet_socket->SignalReadPacket.connect(this, &RelayPortTest::OnReadPacket);
-    return packet_socket;
-  }
-
-  rtc::AsyncSocket* CreateServerSocket(const SocketAddress addr) {
-    rtc::AsyncSocket* socket =
-        virtual_socket_server_->CreateAsyncSocket(SOCK_STREAM);
-    EXPECT_GE(socket->Bind(addr), 0);
-    EXPECT_GE(socket->Listen(5), 0);
-    return socket;
-  }
-
-  bool HasFailed(cricket::ProtocolAddress* addr) {
-    for (size_t i = 0; i < failed_connections_.size(); i++) {
-      if (failed_connections_[i].address == addr->address &&
-          failed_connections_[i].proto == addr->proto) {
-        return true;
-      }
-    }
-    return false;
-  }
-
-  bool HasTimedOut(cricket::ProtocolAddress* addr) {
-    for (size_t i = 0; i < soft_timedout_connections_.size(); i++) {
-      if (soft_timedout_connections_[i].address == addr->address &&
-          soft_timedout_connections_[i].proto == addr->proto) {
-        return true;
-      }
-    }
-    return false;
-  }
-
-  typedef std::map<rtc::AsyncPacketSocket*, int> PacketMap;
-
-  std::unique_ptr<rtc::VirtualSocketServer> virtual_socket_server_;
-  rtc::AutoSocketServerThread main_;
-  rtc::Network network_;
-  rtc::BasicPacketSocketFactory socket_factory_;
-  std::string username_;
-  std::string password_;
-  std::unique_ptr<cricket::RelayPort> relay_port_;
-  std::unique_ptr<cricket::RelayServer> relay_server_;
-  std::vector<cricket::ProtocolAddress> failed_connections_;
-  std::vector<cricket::ProtocolAddress> soft_timedout_connections_;
-  PacketMap received_packet_count_;
-};
-
-TEST_F(RelayPortTest, ConnectUdp) {
-  TestConnectUdp();
-}
-
-TEST_F(RelayPortTest, ConnectTcp) {
-  TestConnectTcp();
-}
-
-TEST_F(RelayPortTest, ConnectSslTcp) {
-  TestConnectSslTcp();
-}
diff --git a/p2p/base/relayserver.cc b/p2p/base/relayserver.cc
deleted file mode 100644
index 3a97d4e..0000000
--- a/p2p/base/relayserver.cc
+++ /dev/null
@@ -1,749 +0,0 @@
-/*
- *  Copyright 2004 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/p2p/base/relayserver.h"
-
-#ifdef WEBRTC_POSIX
-#include <errno.h>
-#endif  // WEBRTC_POSIX
-
-#include <algorithm>
-
-#include "webrtc/rtc_base/asynctcpsocket.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/helpers.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/socketadapters.h"
-
-namespace cricket {
-
-// By default, we require a ping every 90 seconds.
-const int MAX_LIFETIME = 15 * 60 * 1000;
-
-// The number of bytes in each of the usernames we use.
-const uint32_t USERNAME_LENGTH = 16;
-
-// Calls SendTo on the given socket and logs any bad results.
-void Send(rtc::AsyncPacketSocket* socket, const char* bytes, size_t size,
-          const rtc::SocketAddress& addr) {
-  rtc::PacketOptions options;
-  int result = socket->SendTo(bytes, size, addr, options);
-  if (result < static_cast<int>(size)) {
-    LOG(LS_ERROR) << "SendTo wrote only " << result << " of " << size
-                  << " bytes";
-  } else if (result < 0) {
-    LOG_ERR(LS_ERROR) << "SendTo";
-  }
-}
-
-// Sends the given STUN message on the given socket.
-void SendStun(const StunMessage& msg,
-              rtc::AsyncPacketSocket* socket,
-              const rtc::SocketAddress& addr) {
-  rtc::ByteBufferWriter buf;
-  msg.Write(&buf);
-  Send(socket, buf.Data(), buf.Length(), addr);
-}
-
-// Constructs a STUN error response and sends it on the given socket.
-void SendStunError(const StunMessage& msg, rtc::AsyncPacketSocket* socket,
-                   const rtc::SocketAddress& remote_addr, int error_code,
-                   const char* error_desc, const std::string& magic_cookie) {
-  RelayMessage err_msg;
-  err_msg.SetType(GetStunErrorResponseType(msg.type()));
-  err_msg.SetTransactionID(msg.transaction_id());
-
-  auto magic_cookie_attr =
-      StunAttribute::CreateByteString(cricket::STUN_ATTR_MAGIC_COOKIE);
-  if (magic_cookie.size() == 0) {
-    magic_cookie_attr->CopyBytes(cricket::TURN_MAGIC_COOKIE_VALUE,
-                                 sizeof(cricket::TURN_MAGIC_COOKIE_VALUE));
-  } else {
-    magic_cookie_attr->CopyBytes(magic_cookie.c_str(), magic_cookie.size());
-  }
-  err_msg.AddAttribute(std::move(magic_cookie_attr));
-
-  auto err_code = StunAttribute::CreateErrorCode();
-  err_code->SetClass(error_code / 100);
-  err_code->SetNumber(error_code % 100);
-  err_code->SetReason(error_desc);
-  err_msg.AddAttribute(std::move(err_code));
-
-  SendStun(err_msg, socket, remote_addr);
-}
-
-RelayServer::RelayServer(rtc::Thread* thread)
-  : thread_(thread), log_bindings_(true) {
-}
-
-RelayServer::~RelayServer() {
-  // Deleting the binding will cause it to be removed from the map.
-  while (!bindings_.empty())
-    delete bindings_.begin()->second;
-  for (size_t i = 0; i < internal_sockets_.size(); ++i)
-    delete internal_sockets_[i];
-  for (size_t i = 0; i < external_sockets_.size(); ++i)
-    delete external_sockets_[i];
-  for (size_t i = 0; i < removed_sockets_.size(); ++i)
-    delete removed_sockets_[i];
-  while (!server_sockets_.empty()) {
-    rtc::AsyncSocket* socket = server_sockets_.begin()->first;
-    server_sockets_.erase(server_sockets_.begin()->first);
-    delete socket;
-  }
-}
-
-void RelayServer::AddInternalSocket(rtc::AsyncPacketSocket* socket) {
-  RTC_DCHECK(internal_sockets_.end() == std::find(internal_sockets_.begin(),
-                                                  internal_sockets_.end(),
-                                                  socket));
-  internal_sockets_.push_back(socket);
-  socket->SignalReadPacket.connect(this, &RelayServer::OnInternalPacket);
-}
-
-void RelayServer::RemoveInternalSocket(rtc::AsyncPacketSocket* socket) {
-  SocketList::iterator iter =
-      std::find(internal_sockets_.begin(), internal_sockets_.end(), socket);
-  RTC_DCHECK(iter != internal_sockets_.end());
-  internal_sockets_.erase(iter);
-  removed_sockets_.push_back(socket);
-  socket->SignalReadPacket.disconnect(this);
-}
-
-void RelayServer::AddExternalSocket(rtc::AsyncPacketSocket* socket) {
-  RTC_DCHECK(external_sockets_.end() == std::find(external_sockets_.begin(),
-                                                  external_sockets_.end(),
-                                                  socket));
-  external_sockets_.push_back(socket);
-  socket->SignalReadPacket.connect(this, &RelayServer::OnExternalPacket);
-}
-
-void RelayServer::RemoveExternalSocket(rtc::AsyncPacketSocket* socket) {
-  SocketList::iterator iter =
-      std::find(external_sockets_.begin(), external_sockets_.end(), socket);
-  RTC_DCHECK(iter != external_sockets_.end());
-  external_sockets_.erase(iter);
-  removed_sockets_.push_back(socket);
-  socket->SignalReadPacket.disconnect(this);
-}
-
-void RelayServer::AddInternalServerSocket(rtc::AsyncSocket* socket,
-                                          cricket::ProtocolType proto) {
-  RTC_DCHECK(server_sockets_.end() == server_sockets_.find(socket));
-  server_sockets_[socket] = proto;
-  socket->SignalReadEvent.connect(this, &RelayServer::OnReadEvent);
-}
-
-void RelayServer::RemoveInternalServerSocket(
-    rtc::AsyncSocket* socket) {
-  ServerSocketMap::iterator iter = server_sockets_.find(socket);
-  RTC_DCHECK(iter != server_sockets_.end());
-  server_sockets_.erase(iter);
-  socket->SignalReadEvent.disconnect(this);
-}
-
-int RelayServer::GetConnectionCount() const {
-  return static_cast<int>(connections_.size());
-}
-
-rtc::SocketAddressPair RelayServer::GetConnection(int connection) const {
-  int i = 0;
-  for (ConnectionMap::const_iterator it = connections_.begin();
-       it != connections_.end(); ++it) {
-    if (i == connection) {
-      return it->second->addr_pair();
-    }
-    ++i;
-  }
-  return rtc::SocketAddressPair();
-}
-
-bool RelayServer::HasConnection(const rtc::SocketAddress& address) const {
-  for (ConnectionMap::const_iterator it = connections_.begin();
-       it != connections_.end(); ++it) {
-    if (it->second->addr_pair().destination() == address) {
-      return true;
-    }
-  }
-  return false;
-}
-
-void RelayServer::OnReadEvent(rtc::AsyncSocket* socket) {
-  RTC_DCHECK(server_sockets_.find(socket) != server_sockets_.end());
-  AcceptConnection(socket);
-}
-
-void RelayServer::OnInternalPacket(
-    rtc::AsyncPacketSocket* socket, const char* bytes, size_t size,
-    const rtc::SocketAddress& remote_addr,
-    const rtc::PacketTime& packet_time) {
-
-  // Get the address of the connection we just received on.
-  rtc::SocketAddressPair ap(remote_addr, socket->GetLocalAddress());
-  RTC_DCHECK(!ap.destination().IsNil());
-
-  // If this did not come from an existing connection, it should be a STUN
-  // allocate request.
-  ConnectionMap::iterator piter = connections_.find(ap);
-  if (piter == connections_.end()) {
-    HandleStunAllocate(bytes, size, ap, socket);
-    return;
-  }
-
-  RelayServerConnection* int_conn = piter->second;
-
-  // Handle STUN requests to the server itself.
-  if (int_conn->binding()->HasMagicCookie(bytes, size)) {
-    HandleStun(int_conn, bytes, size);
-    return;
-  }
-
-  // Otherwise, this is a non-wrapped packet that we are to forward.  Make sure
-  // that this connection has been locked.  (Otherwise, we would not know what
-  // address to forward to.)
-  if (!int_conn->locked()) {
-    LOG(LS_WARNING) << "Dropping packet: connection not locked";
-    return;
-  }
-
-  // Forward this to the destination address into the connection.
-  RelayServerConnection* ext_conn = int_conn->binding()->GetExternalConnection(
-      int_conn->default_destination());
-  if (ext_conn && ext_conn->locked()) {
-    // TODO: Check the HMAC.
-    ext_conn->Send(bytes, size);
-  } else {
-    // This happens very often and is not an error.
-    LOG(LS_INFO) << "Dropping packet: no external connection";
-  }
-}
-
-void RelayServer::OnExternalPacket(
-    rtc::AsyncPacketSocket* socket, const char* bytes, size_t size,
-    const rtc::SocketAddress& remote_addr,
-    const rtc::PacketTime& packet_time) {
-
-  // Get the address of the connection we just received on.
-  rtc::SocketAddressPair ap(remote_addr, socket->GetLocalAddress());
-  RTC_DCHECK(!ap.destination().IsNil());
-
-  // If this connection already exists, then forward the traffic.
-  ConnectionMap::iterator piter = connections_.find(ap);
-  if (piter != connections_.end()) {
-    // TODO: Check the HMAC.
-    RelayServerConnection* ext_conn = piter->second;
-    RelayServerConnection* int_conn =
-        ext_conn->binding()->GetInternalConnection(
-            ext_conn->addr_pair().source());
-    RTC_DCHECK(int_conn != NULL);
-    int_conn->Send(bytes, size, ext_conn->addr_pair().source());
-    ext_conn->Lock();  // allow outgoing packets
-    return;
-  }
-
-  // The first packet should always be a STUN / TURN packet.  If it isn't, then
-  // we should just ignore this packet.
-  RelayMessage msg;
-  rtc::ByteBufferReader buf(bytes, size);
-  if (!msg.Read(&buf)) {
-    LOG(LS_WARNING) << "Dropping packet: first packet not STUN";
-    return;
-  }
-
-  // The initial packet should have a username (which identifies the binding).
-  const StunByteStringAttribute* username_attr =
-      msg.GetByteString(STUN_ATTR_USERNAME);
-  if (!username_attr) {
-    LOG(LS_WARNING) << "Dropping packet: no username";
-    return;
-  }
-
-  uint32_t length =
-      std::min(static_cast<uint32_t>(username_attr->length()), USERNAME_LENGTH);
-  std::string username(username_attr->bytes(), length);
-  // TODO: Check the HMAC.
-
-  // The binding should already be present.
-  BindingMap::iterator biter = bindings_.find(username);
-  if (biter == bindings_.end()) {
-    LOG(LS_WARNING) << "Dropping packet: no binding with username";
-    return;
-  }
-
-  // Add this authenticted connection to the binding.
-  RelayServerConnection* ext_conn =
-      new RelayServerConnection(biter->second, ap, socket);
-  ext_conn->binding()->AddExternalConnection(ext_conn);
-  AddConnection(ext_conn);
-
-  // We always know where external packets should be forwarded, so we can lock
-  // them from the beginning.
-  ext_conn->Lock();
-
-  // Send this message on the appropriate internal connection.
-  RelayServerConnection* int_conn = ext_conn->binding()->GetInternalConnection(
-      ext_conn->addr_pair().source());
-  RTC_DCHECK(int_conn != NULL);
-  int_conn->Send(bytes, size, ext_conn->addr_pair().source());
-}
-
-bool RelayServer::HandleStun(
-    const char* bytes, size_t size, const rtc::SocketAddress& remote_addr,
-    rtc::AsyncPacketSocket* socket, std::string* username,
-    StunMessage* msg) {
-
-  // Parse this into a stun message. Eat the message if this fails.
-  rtc::ByteBufferReader buf(bytes, size);
-  if (!msg->Read(&buf)) {
-    return false;
-  }
-
-  // The initial packet should have a username (which identifies the binding).
-  const StunByteStringAttribute* username_attr =
-      msg->GetByteString(STUN_ATTR_USERNAME);
-  if (!username_attr) {
-    SendStunError(*msg, socket, remote_addr, 432, "Missing Username", "");
-    return false;
-  }
-
-  // Record the username if requested.
-  if (username)
-    username->append(username_attr->bytes(), username_attr->length());
-
-  // TODO: Check for unknown attributes (<= 0x7fff)
-
-  return true;
-}
-
-void RelayServer::HandleStunAllocate(
-    const char* bytes, size_t size, const rtc::SocketAddressPair& ap,
-    rtc::AsyncPacketSocket* socket) {
-
-  // Make sure this is a valid STUN request.
-  RelayMessage request;
-  std::string username;
-  if (!HandleStun(bytes, size, ap.source(), socket, &username, &request))
-    return;
-
-  // Make sure this is a an allocate request.
-  if (request.type() != STUN_ALLOCATE_REQUEST) {
-    SendStunError(request,
-                  socket,
-                  ap.source(),
-                  600,
-                  "Operation Not Supported",
-                  "");
-    return;
-  }
-
-  // TODO: Check the HMAC.
-
-  // Find or create the binding for this username.
-
-  RelayServerBinding* binding;
-
-  BindingMap::iterator biter = bindings_.find(username);
-  if (biter != bindings_.end()) {
-    binding = biter->second;
-  } else {
-    // NOTE: In the future, bindings will be created by the bot only.  This
-    //       else-branch will then disappear.
-
-    // Compute the appropriate lifetime for this binding.
-    int lifetime = MAX_LIFETIME;
-    const StunUInt32Attribute* lifetime_attr =
-        request.GetUInt32(STUN_ATTR_LIFETIME);
-    if (lifetime_attr)
-      lifetime =
-          std::min(lifetime, static_cast<int>(lifetime_attr->value() * 1000));
-
-    binding = new RelayServerBinding(this, username, "0", lifetime);
-    binding->SignalTimeout.connect(this, &RelayServer::OnTimeout);
-    bindings_[username] = binding;
-
-    if (log_bindings_) {
-      LOG(LS_INFO) << "Added new binding " << username << ", "
-                   << bindings_.size() << " total";
-    }
-  }
-
-  // Add this connection to the binding.  It starts out unlocked.
-  RelayServerConnection* int_conn =
-      new RelayServerConnection(binding, ap, socket);
-  binding->AddInternalConnection(int_conn);
-  AddConnection(int_conn);
-
-  // Now that we have a connection, this other method takes over.
-  HandleStunAllocate(int_conn, request);
-}
-
-void RelayServer::HandleStun(
-    RelayServerConnection* int_conn, const char* bytes, size_t size) {
-
-  // Make sure this is a valid STUN request.
-  RelayMessage request;
-  std::string username;
-  if (!HandleStun(bytes, size, int_conn->addr_pair().source(),
-                  int_conn->socket(), &username, &request))
-    return;
-
-  // Make sure the username is the one were were expecting.
-  if (username != int_conn->binding()->username()) {
-    int_conn->SendStunError(request, 430, "Stale Credentials");
-    return;
-  }
-
-  // TODO: Check the HMAC.
-
-  // Send this request to the appropriate handler.
-  if (request.type() == STUN_SEND_REQUEST)
-    HandleStunSend(int_conn, request);
-  else if (request.type() == STUN_ALLOCATE_REQUEST)
-    HandleStunAllocate(int_conn, request);
-  else
-    int_conn->SendStunError(request, 600, "Operation Not Supported");
-}
-
-void RelayServer::HandleStunAllocate(
-    RelayServerConnection* int_conn, const StunMessage& request) {
-
-  // Create a response message that includes an address with which external
-  // clients can communicate.
-
-  RelayMessage response;
-  response.SetType(STUN_ALLOCATE_RESPONSE);
-  response.SetTransactionID(request.transaction_id());
-
-  auto magic_cookie_attr =
-      StunAttribute::CreateByteString(cricket::STUN_ATTR_MAGIC_COOKIE);
-  magic_cookie_attr->CopyBytes(int_conn->binding()->magic_cookie().c_str(),
-                               int_conn->binding()->magic_cookie().size());
-  response.AddAttribute(std::move(magic_cookie_attr));
-
-  size_t index = rand() % external_sockets_.size();
-  rtc::SocketAddress ext_addr =
-      external_sockets_[index]->GetLocalAddress();
-
-  auto addr_attr = StunAttribute::CreateAddress(STUN_ATTR_MAPPED_ADDRESS);
-  addr_attr->SetIP(ext_addr.ipaddr());
-  addr_attr->SetPort(ext_addr.port());
-  response.AddAttribute(std::move(addr_attr));
-
-  auto res_lifetime_attr = StunAttribute::CreateUInt32(STUN_ATTR_LIFETIME);
-  res_lifetime_attr->SetValue(int_conn->binding()->lifetime() / 1000);
-  response.AddAttribute(std::move(res_lifetime_attr));
-
-  // TODO: Support transport-prefs (preallocate RTCP port).
-  // TODO: Support bandwidth restrictions.
-  // TODO: Add message integrity check.
-
-  // Send a response to the caller.
-  int_conn->SendStun(response);
-}
-
-void RelayServer::HandleStunSend(
-    RelayServerConnection* int_conn, const StunMessage& request) {
-
-  const StunAddressAttribute* addr_attr =
-      request.GetAddress(STUN_ATTR_DESTINATION_ADDRESS);
-  if (!addr_attr) {
-    int_conn->SendStunError(request, 400, "Bad Request");
-    return;
-  }
-
-  const StunByteStringAttribute* data_attr =
-      request.GetByteString(STUN_ATTR_DATA);
-  if (!data_attr) {
-    int_conn->SendStunError(request, 400, "Bad Request");
-    return;
-  }
-
-  rtc::SocketAddress ext_addr(addr_attr->ipaddr(), addr_attr->port());
-  RelayServerConnection* ext_conn =
-      int_conn->binding()->GetExternalConnection(ext_addr);
-  if (!ext_conn) {
-    // Create a new connection to establish the relationship with this binding.
-    RTC_DCHECK(external_sockets_.size() == 1);
-    rtc::AsyncPacketSocket* socket = external_sockets_[0];
-    rtc::SocketAddressPair ap(ext_addr, socket->GetLocalAddress());
-    ext_conn = new RelayServerConnection(int_conn->binding(), ap, socket);
-    ext_conn->binding()->AddExternalConnection(ext_conn);
-    AddConnection(ext_conn);
-  }
-
-  // If this connection has pinged us, then allow outgoing traffic.
-  if (ext_conn->locked())
-    ext_conn->Send(data_attr->bytes(), data_attr->length());
-
-  const StunUInt32Attribute* options_attr =
-      request.GetUInt32(STUN_ATTR_OPTIONS);
-  if (options_attr && (options_attr->value() & 0x01)) {
-    int_conn->set_default_destination(ext_addr);
-    int_conn->Lock();
-
-    RelayMessage response;
-    response.SetType(STUN_SEND_RESPONSE);
-    response.SetTransactionID(request.transaction_id());
-
-    auto magic_cookie_attr =
-        StunAttribute::CreateByteString(cricket::STUN_ATTR_MAGIC_COOKIE);
-    magic_cookie_attr->CopyBytes(int_conn->binding()->magic_cookie().c_str(),
-                                 int_conn->binding()->magic_cookie().size());
-    response.AddAttribute(std::move(magic_cookie_attr));
-
-    auto options2_attr =
-        StunAttribute::CreateUInt32(cricket::STUN_ATTR_OPTIONS);
-    options2_attr->SetValue(0x01);
-    response.AddAttribute(std::move(options2_attr));
-
-    int_conn->SendStun(response);
-  }
-}
-
-void RelayServer::AddConnection(RelayServerConnection* conn) {
-  RTC_DCHECK(connections_.find(conn->addr_pair()) == connections_.end());
-  connections_[conn->addr_pair()] = conn;
-}
-
-void RelayServer::RemoveConnection(RelayServerConnection* conn) {
-  ConnectionMap::iterator iter = connections_.find(conn->addr_pair());
-  RTC_DCHECK(iter != connections_.end());
-  connections_.erase(iter);
-}
-
-void RelayServer::RemoveBinding(RelayServerBinding* binding) {
-  BindingMap::iterator iter = bindings_.find(binding->username());
-  RTC_DCHECK(iter != bindings_.end());
-  bindings_.erase(iter);
-
-  if (log_bindings_) {
-    LOG(LS_INFO) << "Removed binding " << binding->username() << ", "
-                 << bindings_.size() << " remaining";
-  }
-}
-
-void RelayServer::OnMessage(rtc::Message *pmsg) {
-  static const uint32_t kMessageAcceptConnection = 1;
-  RTC_DCHECK(pmsg->message_id == kMessageAcceptConnection);
-
-  rtc::MessageData* data = pmsg->pdata;
-  rtc::AsyncSocket* socket =
-      static_cast <rtc::TypedMessageData<rtc::AsyncSocket*>*>
-      (data)->data();
-  AcceptConnection(socket);
-  delete data;
-}
-
-void RelayServer::OnTimeout(RelayServerBinding* binding) {
-  // This call will result in all of the necessary clean-up. We can't call
-  // delete here, because you can't delete an object that is signaling you.
-  thread_->Dispose(binding);
-}
-
-void RelayServer::AcceptConnection(rtc::AsyncSocket* server_socket) {
-  // Check if someone is trying to connect to us.
-  rtc::SocketAddress accept_addr;
-  rtc::AsyncSocket* accepted_socket =
-      server_socket->Accept(&accept_addr);
-  if (accepted_socket != NULL) {
-    // We had someone trying to connect, now check which protocol to
-    // use and create a packet socket.
-    RTC_DCHECK(server_sockets_[server_socket] == cricket::PROTO_TCP ||
-               server_sockets_[server_socket] == cricket::PROTO_SSLTCP);
-    if (server_sockets_[server_socket] == cricket::PROTO_SSLTCP) {
-      accepted_socket = new rtc::AsyncSSLServerSocket(accepted_socket);
-    }
-    rtc::AsyncTCPSocket* tcp_socket =
-        new rtc::AsyncTCPSocket(accepted_socket, false);
-
-    // Finally add the socket so it can start communicating with the client.
-    AddInternalSocket(tcp_socket);
-  }
-}
-
-RelayServerConnection::RelayServerConnection(
-    RelayServerBinding* binding, const rtc::SocketAddressPair& addrs,
-    rtc::AsyncPacketSocket* socket)
-  : binding_(binding), addr_pair_(addrs), socket_(socket), locked_(false) {
-  // The creation of a new connection constitutes a use of the binding.
-  binding_->NoteUsed();
-}
-
-RelayServerConnection::~RelayServerConnection() {
-  // Remove this connection from the server's map (if it exists there).
-  binding_->server()->RemoveConnection(this);
-}
-
-void RelayServerConnection::Send(const char* data, size_t size) {
-  // Note that the binding has been used again.
-  binding_->NoteUsed();
-
-  cricket::Send(socket_, data, size, addr_pair_.source());
-}
-
-void RelayServerConnection::Send(
-    const char* data, size_t size, const rtc::SocketAddress& from_addr) {
-  // If the from address is known to the client, we don't need to send it.
-  if (locked() && (from_addr == default_dest_)) {
-    Send(data, size);
-    return;
-  }
-
-  // Wrap the given data in a data-indication packet.
-
-  RelayMessage msg;
-  msg.SetType(STUN_DATA_INDICATION);
-
-  auto magic_cookie_attr =
-      StunAttribute::CreateByteString(cricket::STUN_ATTR_MAGIC_COOKIE);
-  magic_cookie_attr->CopyBytes(binding_->magic_cookie().c_str(),
-                               binding_->magic_cookie().size());
-  msg.AddAttribute(std::move(magic_cookie_attr));
-
-  auto addr_attr = StunAttribute::CreateAddress(STUN_ATTR_SOURCE_ADDRESS2);
-  addr_attr->SetIP(from_addr.ipaddr());
-  addr_attr->SetPort(from_addr.port());
-  msg.AddAttribute(std::move(addr_attr));
-
-  auto data_attr = StunAttribute::CreateByteString(STUN_ATTR_DATA);
-  RTC_DCHECK(size <= 65536);
-  data_attr->CopyBytes(data, uint16_t(size));
-  msg.AddAttribute(std::move(data_attr));
-
-  SendStun(msg);
-}
-
-void RelayServerConnection::SendStun(const StunMessage& msg) {
-  // Note that the binding has been used again.
-  binding_->NoteUsed();
-
-  cricket::SendStun(msg, socket_, addr_pair_.source());
-}
-
-void RelayServerConnection::SendStunError(
-      const StunMessage& request, int error_code, const char* error_desc) {
-  // An error does not indicate use.  If no legitimate use off the binding
-  // occurs, we want it to be cleaned up even if errors are still occuring.
-
-  cricket::SendStunError(
-      request, socket_, addr_pair_.source(), error_code, error_desc,
-      binding_->magic_cookie());
-}
-
-void RelayServerConnection::Lock() {
-  locked_ = true;
-}
-
-void RelayServerConnection::Unlock() {
-  locked_ = false;
-}
-
-// IDs used for posted messages:
-const uint32_t MSG_LIFETIME_TIMER = 1;
-
-RelayServerBinding::RelayServerBinding(RelayServer* server,
-                                       const std::string& username,
-                                       const std::string& password,
-                                       int lifetime)
-    : server_(server),
-      username_(username),
-      password_(password),
-      lifetime_(lifetime) {
-  // For now, every connection uses the standard magic cookie value.
-  magic_cookie_.append(
-      reinterpret_cast<const char*>(TURN_MAGIC_COOKIE_VALUE),
-      sizeof(TURN_MAGIC_COOKIE_VALUE));
-
-  // Initialize the last-used time to now.
-  NoteUsed();
-
-  // Set the first timeout check.
-  server_->thread()->PostDelayed(RTC_FROM_HERE, lifetime_, this,
-                                 MSG_LIFETIME_TIMER);
-}
-
-RelayServerBinding::~RelayServerBinding() {
-  // Clear the outstanding timeout check.
-  server_->thread()->Clear(this);
-
-  // Clean up all of the connections.
-  for (size_t i = 0; i < internal_connections_.size(); ++i)
-    delete internal_connections_[i];
-  for (size_t i = 0; i < external_connections_.size(); ++i)
-    delete external_connections_[i];
-
-  // Remove this binding from the server's map.
-  server_->RemoveBinding(this);
-}
-
-void RelayServerBinding::AddInternalConnection(RelayServerConnection* conn) {
-  internal_connections_.push_back(conn);
-}
-
-void RelayServerBinding::AddExternalConnection(RelayServerConnection* conn) {
-  external_connections_.push_back(conn);
-}
-
-void RelayServerBinding::NoteUsed() {
-  last_used_ = rtc::TimeMillis();
-}
-
-bool RelayServerBinding::HasMagicCookie(const char* bytes, size_t size) const {
-  if (size < 24 + magic_cookie_.size()) {
-    return false;
-  } else {
-    return memcmp(bytes + 24, magic_cookie_.c_str(), magic_cookie_.size()) == 0;
-  }
-}
-
-RelayServerConnection* RelayServerBinding::GetInternalConnection(
-    const rtc::SocketAddress& ext_addr) {
-
-  // Look for an internal connection that is locked to this address.
-  for (size_t i = 0; i < internal_connections_.size(); ++i) {
-    if (internal_connections_[i]->locked() &&
-        (ext_addr == internal_connections_[i]->default_destination()))
-      return internal_connections_[i];
-  }
-
-  // If one was not found, we send to the first connection.
-  RTC_DCHECK(internal_connections_.size() > 0);
-  return internal_connections_[0];
-}
-
-RelayServerConnection* RelayServerBinding::GetExternalConnection(
-    const rtc::SocketAddress& ext_addr) {
-  for (size_t i = 0; i < external_connections_.size(); ++i) {
-    if (ext_addr == external_connections_[i]->addr_pair().source())
-      return external_connections_[i];
-  }
-  return 0;
-}
-
-void RelayServerBinding::OnMessage(rtc::Message *pmsg) {
-  if (pmsg->message_id == MSG_LIFETIME_TIMER) {
-    RTC_DCHECK(!pmsg->pdata);
-
-    // If the lifetime timeout has been exceeded, then send a signal.
-    // Otherwise, just keep waiting.
-    if (rtc::TimeMillis() >= last_used_ + lifetime_) {
-      LOG(LS_INFO) << "Expiring binding " << username_;
-      SignalTimeout(this);
-    } else {
-      server_->thread()->PostDelayed(RTC_FROM_HERE, lifetime_, this,
-                                     MSG_LIFETIME_TIMER);
-    }
-
-  } else {
-    RTC_NOTREACHED();
-  }
-}
-
-}  // namespace cricket
diff --git a/p2p/base/relayserver.h b/p2p/base/relayserver.h
deleted file mode 100644
index 579b014..0000000
--- a/p2p/base/relayserver.h
+++ /dev/null
@@ -1,236 +0,0 @@
-/*
- *  Copyright 2004 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_P2P_BASE_RELAYSERVER_H_
-#define WEBRTC_P2P_BASE_RELAYSERVER_H_
-
-#include <map>
-#include <string>
-#include <vector>
-
-#include "webrtc/p2p/base/port.h"
-#include "webrtc/p2p/base/stun.h"
-#include "webrtc/rtc_base/asyncudpsocket.h"
-#include "webrtc/rtc_base/socketaddresspair.h"
-#include "webrtc/rtc_base/thread.h"
-#include "webrtc/rtc_base/timeutils.h"
-
-namespace cricket {
-
-class RelayServerBinding;
-class RelayServerConnection;
-
-// Relays traffic between connections to the server that are "bound" together.
-// All connections created with the same username/password are bound together.
-class RelayServer : public rtc::MessageHandler,
-                    public sigslot::has_slots<> {
- public:
-  // Creates a server, which will use this thread to post messages to itself.
-  explicit RelayServer(rtc::Thread* thread);
-  ~RelayServer();
-
-  rtc::Thread* thread() { return thread_; }
-
-  // Indicates whether we will print updates of the number of bindings.
-  bool log_bindings() const { return log_bindings_; }
-  void set_log_bindings(bool log_bindings) { log_bindings_ = log_bindings; }
-
-  // Updates the set of sockets that the server uses to talk to "internal"
-  // clients.  These are clients that do the "port allocations".
-  void AddInternalSocket(rtc::AsyncPacketSocket* socket);
-  void RemoveInternalSocket(rtc::AsyncPacketSocket* socket);
-
-  // Updates the set of sockets that the server uses to talk to "external"
-  // clients.  These are the clients that do not do allocations.  They do not
-  // know that these addresses represent a relay server.
-  void AddExternalSocket(rtc::AsyncPacketSocket* socket);
-  void RemoveExternalSocket(rtc::AsyncPacketSocket* socket);
-
-  // Starts listening for connections on this sockets. When someone
-  // tries to connect, the connection will be accepted and a new
-  // internal socket will be added.
-  void AddInternalServerSocket(rtc::AsyncSocket* socket,
-                               cricket::ProtocolType proto);
-
-  // Removes this server socket from the list.
-  void RemoveInternalServerSocket(rtc::AsyncSocket* socket);
-
-  // Methods for testing and debuging.
-  int GetConnectionCount() const;
-  rtc::SocketAddressPair GetConnection(int connection) const;
-  bool HasConnection(const rtc::SocketAddress& address) const;
-
- private:
-  typedef std::vector<rtc::AsyncPacketSocket*> SocketList;
-  typedef std::map<rtc::AsyncSocket*,
-                   cricket::ProtocolType> ServerSocketMap;
-  typedef std::map<std::string, RelayServerBinding*> BindingMap;
-  typedef std::map<rtc::SocketAddressPair,
-                   RelayServerConnection*> ConnectionMap;
-
-  rtc::Thread* thread_;
-  bool log_bindings_;
-  SocketList internal_sockets_;
-  SocketList external_sockets_;
-  SocketList removed_sockets_;
-  ServerSocketMap server_sockets_;
-  BindingMap bindings_;
-  ConnectionMap connections_;
-
-  // Called when a packet is received by the server on one of its sockets.
-  void OnInternalPacket(rtc::AsyncPacketSocket* socket,
-                        const char* bytes, size_t size,
-                        const rtc::SocketAddress& remote_addr,
-                        const rtc::PacketTime& packet_time);
-  void OnExternalPacket(rtc::AsyncPacketSocket* socket,
-                        const char* bytes, size_t size,
-                        const rtc::SocketAddress& remote_addr,
-                        const rtc::PacketTime& packet_time);
-
-  void OnReadEvent(rtc::AsyncSocket* socket);
-
-  // Processes the relevant STUN request types from the client.
-  bool HandleStun(const char* bytes, size_t size,
-                  const rtc::SocketAddress& remote_addr,
-                  rtc::AsyncPacketSocket* socket,
-                  std::string* username, StunMessage* msg);
-  void HandleStunAllocate(const char* bytes, size_t size,
-                          const rtc::SocketAddressPair& ap,
-                          rtc::AsyncPacketSocket* socket);
-  void HandleStun(RelayServerConnection* int_conn, const char* bytes,
-                  size_t size);
-  void HandleStunAllocate(RelayServerConnection* int_conn,
-                          const StunMessage& msg);
-  void HandleStunSend(RelayServerConnection* int_conn, const StunMessage& msg);
-
-  // Adds/Removes the a connection or binding.
-  void AddConnection(RelayServerConnection* conn);
-  void RemoveConnection(RelayServerConnection* conn);
-  void RemoveBinding(RelayServerBinding* binding);
-
-  // Handle messages in our thread.
-  void OnMessage(rtc::Message *pmsg);
-
-  // Called when the timer for checking lifetime times out.
-  void OnTimeout(RelayServerBinding* binding);
-
-  // Accept connections on this server socket.
-  void AcceptConnection(rtc::AsyncSocket* server_socket);
-
-  friend class RelayServerConnection;
-  friend class RelayServerBinding;
-};
-
-// Maintains information about a connection to the server.  Each connection is
-// part of one and only one binding.
-class RelayServerConnection {
- public:
-  RelayServerConnection(RelayServerBinding* binding,
-                        const rtc::SocketAddressPair& addrs,
-                        rtc::AsyncPacketSocket* socket);
-  ~RelayServerConnection();
-
-  RelayServerBinding* binding() { return binding_; }
-  rtc::AsyncPacketSocket* socket() { return socket_; }
-
-  // Returns a pair where the source is the remote address and the destination
-  // is the local address.
-  const rtc::SocketAddressPair& addr_pair() { return addr_pair_; }
-
-  // Sends a packet to the connected client.  If an address is provided, then
-  // we make sure the internal client receives it, wrapping if necessary.
-  void Send(const char* data, size_t size);
-  void Send(const char* data, size_t size,
-            const rtc::SocketAddress& ext_addr);
-
-  // Sends a STUN message to the connected client with no wrapping.
-  void SendStun(const StunMessage& msg);
-  void SendStunError(const StunMessage& request, int code, const char* desc);
-
-  // A locked connection is one for which we know the intended destination of
-  // any raw packet received.
-  bool locked() const { return locked_; }
-  void Lock();
-  void Unlock();
-
-  // Records the address that raw packets should be forwarded to (for internal
-  // packets only; for external, we already know where they go).
-  const rtc::SocketAddress& default_destination() const {
-    return default_dest_;
-  }
-  void set_default_destination(const rtc::SocketAddress& addr) {
-    default_dest_ = addr;
-  }
-
- private:
-  RelayServerBinding* binding_;
-  rtc::SocketAddressPair addr_pair_;
-  rtc::AsyncPacketSocket* socket_;
-  bool locked_;
-  rtc::SocketAddress default_dest_;
-};
-
-// Records a set of internal and external connections that we relay between,
-// or in other words, that are "bound" together.
-class RelayServerBinding : public rtc::MessageHandler {
- public:
-  RelayServerBinding(RelayServer* server,
-                     const std::string& username,
-                     const std::string& password,
-                     int lifetime);
-  virtual ~RelayServerBinding();
-
-  RelayServer* server() { return server_; }
-  int lifetime() { return lifetime_; }
-  const std::string& username() { return username_; }
-  const std::string& password() { return password_; }
-  const std::string& magic_cookie() { return magic_cookie_; }
-
-  // Adds/Removes a connection into the binding.
-  void AddInternalConnection(RelayServerConnection* conn);
-  void AddExternalConnection(RelayServerConnection* conn);
-
-  // We keep track of the use of each binding.  If we detect that it was not
-  // used for longer than the lifetime, then we send a signal.
-  void NoteUsed();
-  sigslot::signal1<RelayServerBinding*> SignalTimeout;
-
-  // Determines whether the given packet has the magic cookie present (in the
-  // right place).
-  bool HasMagicCookie(const char* bytes, size_t size) const;
-
-  // Determines the connection to use to send packets to or from the given
-  // external address.
-  RelayServerConnection* GetInternalConnection(
-      const rtc::SocketAddress& ext_addr);
-  RelayServerConnection* GetExternalConnection(
-      const rtc::SocketAddress& ext_addr);
-
-  // MessageHandler:
-  void OnMessage(rtc::Message *pmsg);
-
- private:
-  RelayServer* server_;
-
-  std::string username_;
-  std::string password_;
-  std::string magic_cookie_;
-
-  std::vector<RelayServerConnection*> internal_connections_;
-  std::vector<RelayServerConnection*> external_connections_;
-
-  int lifetime_;
-  int64_t last_used_;
-  // TODO: bandwidth
-};
-
-}  // namespace cricket
-
-#endif  // WEBRTC_P2P_BASE_RELAYSERVER_H_
diff --git a/p2p/base/relayserver_unittest.cc b/p2p/base/relayserver_unittest.cc
deleted file mode 100644
index 7c1b29e..0000000
--- a/p2p/base/relayserver_unittest.cc
+++ /dev/null
@@ -1,513 +0,0 @@
-/*
- *  Copyright 2004 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 <memory>
-#include <string>
-
-#include "webrtc/p2p/base/relayserver.h"
-#include "webrtc/rtc_base/gunit.h"
-#include "webrtc/rtc_base/helpers.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/ptr_util.h"
-#include "webrtc/rtc_base/socketaddress.h"
-#include "webrtc/rtc_base/ssladapter.h"
-#include "webrtc/rtc_base/testclient.h"
-#include "webrtc/rtc_base/thread.h"
-#include "webrtc/rtc_base/virtualsocketserver.h"
-
-using rtc::SocketAddress;
-using namespace cricket;
-
-static const uint32_t LIFETIME = 4;  // seconds
-static const SocketAddress server_int_addr("127.0.0.1", 5000);
-static const SocketAddress server_ext_addr("127.0.0.1", 5001);
-static const SocketAddress client1_addr("127.0.0.1", 6000 + (rand() % 1000));
-static const SocketAddress client2_addr("127.0.0.1", 7000 + (rand() % 1000));
-static const char* bad = "this is a completely nonsensical message whose only "
-                         "purpose is to make the parser go 'ack'.  it doesn't "
-                         "look anything like a normal stun message";
-static const char* msg1 = "spamspamspamspamspamspamspambakedbeansspam";
-static const char* msg2 = "Lobster Thermidor a Crevette with a mornay sauce...";
-
-class RelayServerTest : public testing::Test {
- public:
-  RelayServerTest()
-      : ss_(new rtc::VirtualSocketServer()),
-        thread_(ss_.get()),
-        username_(rtc::CreateRandomString(12)),
-        password_(rtc::CreateRandomString(12)) {}
-
- protected:
-  virtual void SetUp() {
-    server_.reset(new RelayServer(rtc::Thread::Current()));
-
-    server_->AddInternalSocket(
-        rtc::AsyncUDPSocket::Create(ss_.get(), server_int_addr));
-    server_->AddExternalSocket(
-        rtc::AsyncUDPSocket::Create(ss_.get(), server_ext_addr));
-
-    client1_.reset(new rtc::TestClient(
-        WrapUnique(rtc::AsyncUDPSocket::Create(ss_.get(), client1_addr))));
-    client2_.reset(new rtc::TestClient(
-        WrapUnique(rtc::AsyncUDPSocket::Create(ss_.get(), client2_addr))));
-  }
-
-  void Allocate() {
-    std::unique_ptr<StunMessage> req(CreateStunMessage(STUN_ALLOCATE_REQUEST));
-    AddUsernameAttr(req.get(), username_);
-    AddLifetimeAttr(req.get(), LIFETIME);
-    Send1(req.get());
-    delete Receive1();
-  }
-  void Bind() {
-    std::unique_ptr<StunMessage> req(CreateStunMessage(STUN_BINDING_REQUEST));
-    AddUsernameAttr(req.get(), username_);
-    Send2(req.get());
-    delete Receive1();
-  }
-
-  void Send1(const StunMessage* msg) {
-    rtc::ByteBufferWriter buf;
-    msg->Write(&buf);
-    SendRaw1(buf.Data(), static_cast<int>(buf.Length()));
-  }
-  void Send2(const StunMessage* msg) {
-    rtc::ByteBufferWriter buf;
-    msg->Write(&buf);
-    SendRaw2(buf.Data(), static_cast<int>(buf.Length()));
-  }
-  void SendRaw1(const char* data, int len) {
-    return Send(client1_.get(), data, len, server_int_addr);
-  }
-  void SendRaw2(const char* data, int len) {
-    return Send(client2_.get(), data, len, server_ext_addr);
-  }
-  void Send(rtc::TestClient* client, const char* data,
-            int len, const SocketAddress& addr) {
-    client->SendTo(data, len, addr);
-  }
-
-  bool Receive1Fails() {
-    return client1_.get()->CheckNoPacket();
-  }
-  bool Receive2Fails() {
-    return client2_.get()->CheckNoPacket();
-  }
-
-  StunMessage* Receive1() {
-    return Receive(client1_.get());
-  }
-  StunMessage* Receive2() {
-    return Receive(client2_.get());
-  }
-  std::string ReceiveRaw1() {
-    return ReceiveRaw(client1_.get());
-  }
-  std::string ReceiveRaw2() {
-    return ReceiveRaw(client2_.get());
-  }
-  StunMessage* Receive(rtc::TestClient* client) {
-    StunMessage* msg = NULL;
-    std::unique_ptr<rtc::TestClient::Packet> packet =
-        client->NextPacket(rtc::TestClient::kTimeoutMs);
-    if (packet) {
-      rtc::ByteBufferWriter buf(packet->buf, packet->size);
-      rtc::ByteBufferReader read_buf(buf);
-      msg = new RelayMessage();
-      msg->Read(&read_buf);
-    }
-    return msg;
-  }
-  std::string ReceiveRaw(rtc::TestClient* client) {
-    std::string raw;
-    std::unique_ptr<rtc::TestClient::Packet> packet =
-        client->NextPacket(rtc::TestClient::kTimeoutMs);
-    if (packet) {
-      raw = std::string(packet->buf, packet->size);
-    }
-    return raw;
-  }
-
-  static StunMessage* CreateStunMessage(int type) {
-    StunMessage* msg = new RelayMessage();
-    msg->SetType(type);
-    msg->SetTransactionID(
-        rtc::CreateRandomString(kStunTransactionIdLength));
-    return msg;
-  }
-  static void AddMagicCookieAttr(StunMessage* msg) {
-    auto attr = StunAttribute::CreateByteString(STUN_ATTR_MAGIC_COOKIE);
-    attr->CopyBytes(TURN_MAGIC_COOKIE_VALUE, sizeof(TURN_MAGIC_COOKIE_VALUE));
-    msg->AddAttribute(std::move(attr));
-  }
-  static void AddUsernameAttr(StunMessage* msg, const std::string& val) {
-    auto attr = StunAttribute::CreateByteString(STUN_ATTR_USERNAME);
-    attr->CopyBytes(val.c_str(), val.size());
-    msg->AddAttribute(std::move(attr));
-  }
-  static void AddLifetimeAttr(StunMessage* msg, int val) {
-    auto attr = StunAttribute::CreateUInt32(STUN_ATTR_LIFETIME);
-    attr->SetValue(val);
-    msg->AddAttribute(std::move(attr));
-  }
-  static void AddDestinationAttr(StunMessage* msg, const SocketAddress& addr) {
-    auto attr = StunAttribute::CreateAddress(STUN_ATTR_DESTINATION_ADDRESS);
-    attr->SetIP(addr.ipaddr());
-    attr->SetPort(addr.port());
-    msg->AddAttribute(std::move(attr));
-  }
-
-  std::unique_ptr<rtc::VirtualSocketServer> ss_;
-  rtc::AutoSocketServerThread thread_;
-  std::unique_ptr<RelayServer> server_;
-  std::unique_ptr<rtc::TestClient> client1_;
-  std::unique_ptr<rtc::TestClient> client2_;
-  std::string username_;
-  std::string password_;
-};
-
-// Send a complete nonsense message and verify that it is eaten.
-TEST_F(RelayServerTest, TestBadRequest) {
-  SendRaw1(bad, static_cast<int>(strlen(bad)));
-  ASSERT_TRUE(Receive1Fails());
-}
-
-// Send an allocate request without a username and verify it is rejected.
-TEST_F(RelayServerTest, TestAllocateNoUsername) {
-  std::unique_ptr<StunMessage> req(CreateStunMessage(STUN_ALLOCATE_REQUEST)),
-      res;
-
-  Send1(req.get());
-  res.reset(Receive1());
-
-  ASSERT_TRUE(res);
-  EXPECT_EQ(STUN_ALLOCATE_ERROR_RESPONSE, res->type());
-  EXPECT_EQ(req->transaction_id(), res->transaction_id());
-
-  const StunErrorCodeAttribute* err = res->GetErrorCode();
-  ASSERT_TRUE(err != NULL);
-  EXPECT_EQ(4, err->eclass());
-  EXPECT_EQ(32, err->number());
-  EXPECT_EQ("Missing Username", err->reason());
-}
-
-// Send a binding request and verify that it is rejected.
-TEST_F(RelayServerTest, TestBindingRequest) {
-  std::unique_ptr<StunMessage> req(CreateStunMessage(STUN_BINDING_REQUEST)),
-      res;
-  AddUsernameAttr(req.get(), username_);
-
-  Send1(req.get());
-  res.reset(Receive1());
-
-  ASSERT_TRUE(res);
-  EXPECT_EQ(STUN_BINDING_ERROR_RESPONSE, res->type());
-  EXPECT_EQ(req->transaction_id(), res->transaction_id());
-
-  const StunErrorCodeAttribute* err = res->GetErrorCode();
-  ASSERT_TRUE(err != NULL);
-  EXPECT_EQ(6, err->eclass());
-  EXPECT_EQ(0, err->number());
-  EXPECT_EQ("Operation Not Supported", err->reason());
-}
-
-// Send an allocate request and verify that it is accepted.
-TEST_F(RelayServerTest, TestAllocate) {
-  std::unique_ptr<StunMessage> req(CreateStunMessage(STUN_ALLOCATE_REQUEST)),
-      res;
-  AddUsernameAttr(req.get(), username_);
-  AddLifetimeAttr(req.get(), LIFETIME);
-
-  Send1(req.get());
-  res.reset(Receive1());
-
-  ASSERT_TRUE(res);
-  EXPECT_EQ(STUN_ALLOCATE_RESPONSE, res->type());
-  EXPECT_EQ(req->transaction_id(), res->transaction_id());
-
-  const StunAddressAttribute* mapped_addr =
-      res->GetAddress(STUN_ATTR_MAPPED_ADDRESS);
-  ASSERT_TRUE(mapped_addr != NULL);
-  EXPECT_EQ(1, mapped_addr->family());
-  EXPECT_EQ(server_ext_addr.port(), mapped_addr->port());
-  EXPECT_EQ(server_ext_addr.ipaddr(), mapped_addr->ipaddr());
-
-  const StunUInt32Attribute* res_lifetime_attr =
-      res->GetUInt32(STUN_ATTR_LIFETIME);
-  ASSERT_TRUE(res_lifetime_attr != NULL);
-  EXPECT_EQ(LIFETIME, res_lifetime_attr->value());
-}
-
-// Send a second allocate request and verify that it is also accepted, though
-// the lifetime should be ignored.
-TEST_F(RelayServerTest, TestReallocate) {
-  Allocate();
-
-  std::unique_ptr<StunMessage> req(CreateStunMessage(STUN_ALLOCATE_REQUEST)),
-      res;
-  AddMagicCookieAttr(req.get());
-  AddUsernameAttr(req.get(), username_);
-
-  Send1(req.get());
-  res.reset(Receive1());
-
-  ASSERT_TRUE(res);
-  EXPECT_EQ(STUN_ALLOCATE_RESPONSE, res->type());
-  EXPECT_EQ(req->transaction_id(), res->transaction_id());
-
-  const StunAddressAttribute* mapped_addr =
-      res->GetAddress(STUN_ATTR_MAPPED_ADDRESS);
-  ASSERT_TRUE(mapped_addr != NULL);
-  EXPECT_EQ(1, mapped_addr->family());
-  EXPECT_EQ(server_ext_addr.port(), mapped_addr->port());
-  EXPECT_EQ(server_ext_addr.ipaddr(), mapped_addr->ipaddr());
-
-  const StunUInt32Attribute* lifetime_attr =
-      res->GetUInt32(STUN_ATTR_LIFETIME);
-  ASSERT_TRUE(lifetime_attr != NULL);
-  EXPECT_EQ(LIFETIME, lifetime_attr->value());
-}
-
-// Send a request from another client and see that it arrives at the first
-// client in the binding.
-TEST_F(RelayServerTest, TestRemoteBind) {
-  Allocate();
-
-  std::unique_ptr<StunMessage> req(CreateStunMessage(STUN_BINDING_REQUEST)),
-      res;
-  AddUsernameAttr(req.get(), username_);
-
-  Send2(req.get());
-  res.reset(Receive1());
-
-  ASSERT_TRUE(res);
-  EXPECT_EQ(STUN_DATA_INDICATION, res->type());
-
-  const StunByteStringAttribute* recv_data =
-      res->GetByteString(STUN_ATTR_DATA);
-  ASSERT_TRUE(recv_data != NULL);
-
-  rtc::ByteBufferReader buf(recv_data->bytes(), recv_data->length());
-  std::unique_ptr<StunMessage> res2(new StunMessage());
-  EXPECT_TRUE(res2->Read(&buf));
-  EXPECT_EQ(STUN_BINDING_REQUEST, res2->type());
-  EXPECT_EQ(req->transaction_id(), res2->transaction_id());
-
-  const StunAddressAttribute* src_addr =
-      res->GetAddress(STUN_ATTR_SOURCE_ADDRESS2);
-  ASSERT_TRUE(src_addr != NULL);
-  EXPECT_EQ(1, src_addr->family());
-  EXPECT_EQ(client2_addr.ipaddr(), src_addr->ipaddr());
-  EXPECT_EQ(client2_addr.port(), src_addr->port());
-
-  EXPECT_TRUE(Receive2Fails());
-}
-
-// Send a complete nonsense message to the established connection and verify
-// that it is dropped by the server.
-TEST_F(RelayServerTest, TestRemoteBadRequest) {
-  Allocate();
-  Bind();
-
-  SendRaw1(bad, static_cast<int>(strlen(bad)));
-  EXPECT_TRUE(Receive1Fails());
-  EXPECT_TRUE(Receive2Fails());
-}
-
-// Send a send request without a username and verify it is rejected.
-TEST_F(RelayServerTest, TestSendRequestMissingUsername) {
-  Allocate();
-  Bind();
-
-  std::unique_ptr<StunMessage> req(CreateStunMessage(STUN_SEND_REQUEST)), res;
-  AddMagicCookieAttr(req.get());
-
-  Send1(req.get());
-  res.reset(Receive1());
-
-  ASSERT_TRUE(res);
-  EXPECT_EQ(STUN_SEND_ERROR_RESPONSE, res->type());
-  EXPECT_EQ(req->transaction_id(), res->transaction_id());
-
-  const StunErrorCodeAttribute* err = res->GetErrorCode();
-  ASSERT_TRUE(err != NULL);
-  EXPECT_EQ(4, err->eclass());
-  EXPECT_EQ(32, err->number());
-  EXPECT_EQ("Missing Username", err->reason());
-}
-
-// Send a send request with the wrong username and verify it is rejected.
-TEST_F(RelayServerTest, TestSendRequestBadUsername) {
-  Allocate();
-  Bind();
-
-  std::unique_ptr<StunMessage> req(CreateStunMessage(STUN_SEND_REQUEST)), res;
-  AddMagicCookieAttr(req.get());
-  AddUsernameAttr(req.get(), "foobarbizbaz");
-
-  Send1(req.get());
-  res.reset(Receive1());
-
-  ASSERT_TRUE(res);
-  EXPECT_EQ(STUN_SEND_ERROR_RESPONSE, res->type());
-  EXPECT_EQ(req->transaction_id(), res->transaction_id());
-
-  const StunErrorCodeAttribute* err = res->GetErrorCode();
-  ASSERT_TRUE(err != NULL);
-  EXPECT_EQ(4, err->eclass());
-  EXPECT_EQ(30, err->number());
-  EXPECT_EQ("Stale Credentials", err->reason());
-}
-
-// Send a send request without a destination address and verify that it is
-// rejected.
-TEST_F(RelayServerTest, TestSendRequestNoDestinationAddress) {
-  Allocate();
-  Bind();
-
-  std::unique_ptr<StunMessage> req(CreateStunMessage(STUN_SEND_REQUEST)), res;
-  AddMagicCookieAttr(req.get());
-  AddUsernameAttr(req.get(), username_);
-
-  Send1(req.get());
-  res.reset(Receive1());
-
-  ASSERT_TRUE(res);
-  EXPECT_EQ(STUN_SEND_ERROR_RESPONSE, res->type());
-  EXPECT_EQ(req->transaction_id(), res->transaction_id());
-
-  const StunErrorCodeAttribute* err = res->GetErrorCode();
-  ASSERT_TRUE(err != NULL);
-  EXPECT_EQ(4, err->eclass());
-  EXPECT_EQ(0, err->number());
-  EXPECT_EQ("Bad Request", err->reason());
-}
-
-// Send a send request without data and verify that it is rejected.
-TEST_F(RelayServerTest, TestSendRequestNoData) {
-  Allocate();
-  Bind();
-
-  std::unique_ptr<StunMessage> req(CreateStunMessage(STUN_SEND_REQUEST)), res;
-  AddMagicCookieAttr(req.get());
-  AddUsernameAttr(req.get(), username_);
-  AddDestinationAttr(req.get(), client2_addr);
-
-  Send1(req.get());
-  res.reset(Receive1());
-
-  ASSERT_TRUE(res);
-  EXPECT_EQ(STUN_SEND_ERROR_RESPONSE, res->type());
-  EXPECT_EQ(req->transaction_id(), res->transaction_id());
-
-  const StunErrorCodeAttribute* err = res->GetErrorCode();
-  ASSERT_TRUE(err != NULL);
-  EXPECT_EQ(4, err->eclass());
-  EXPECT_EQ(00, err->number());
-  EXPECT_EQ("Bad Request", err->reason());
-}
-
-// Send a binding request after an allocate and verify that it is rejected.
-TEST_F(RelayServerTest, TestSendRequestWrongType) {
-  Allocate();
-  Bind();
-
-  std::unique_ptr<StunMessage> req(CreateStunMessage(STUN_BINDING_REQUEST)),
-      res;
-  AddMagicCookieAttr(req.get());
-  AddUsernameAttr(req.get(), username_);
-
-  Send1(req.get());
-  res.reset(Receive1());
-
-  ASSERT_TRUE(res);
-  EXPECT_EQ(STUN_BINDING_ERROR_RESPONSE, res->type());
-  EXPECT_EQ(req->transaction_id(), res->transaction_id());
-
-  const StunErrorCodeAttribute* err = res->GetErrorCode();
-  ASSERT_TRUE(err != NULL);
-  EXPECT_EQ(6, err->eclass());
-  EXPECT_EQ(0, err->number());
-  EXPECT_EQ("Operation Not Supported", err->reason());
-}
-
-// Verify that we can send traffic back and forth between the clients after a
-// successful allocate and bind.
-TEST_F(RelayServerTest, TestSendRaw) {
-  Allocate();
-  Bind();
-
-  for (int i = 0; i < 10; i++) {
-    std::unique_ptr<StunMessage> req(CreateStunMessage(STUN_SEND_REQUEST)), res;
-    AddMagicCookieAttr(req.get());
-    AddUsernameAttr(req.get(), username_);
-    AddDestinationAttr(req.get(), client2_addr);
-
-    auto send_data = StunAttribute::CreateByteString(STUN_ATTR_DATA);
-    send_data->CopyBytes(msg1);
-    req->AddAttribute(std::move(send_data));
-
-    Send1(req.get());
-    EXPECT_EQ(msg1, ReceiveRaw2());
-    SendRaw2(msg2, static_cast<int>(strlen(msg2)));
-    res.reset(Receive1());
-
-    ASSERT_TRUE(res);
-    EXPECT_EQ(STUN_DATA_INDICATION, res->type());
-
-    const StunAddressAttribute* src_addr =
-        res->GetAddress(STUN_ATTR_SOURCE_ADDRESS2);
-    ASSERT_TRUE(src_addr != NULL);
-    EXPECT_EQ(1, src_addr->family());
-    EXPECT_EQ(client2_addr.ipaddr(), src_addr->ipaddr());
-    EXPECT_EQ(client2_addr.port(), src_addr->port());
-
-    const StunByteStringAttribute* recv_data =
-        res->GetByteString(STUN_ATTR_DATA);
-    ASSERT_TRUE(recv_data != NULL);
-    EXPECT_EQ(strlen(msg2), recv_data->length());
-    EXPECT_EQ(0, memcmp(msg2, recv_data->bytes(), recv_data->length()));
-  }
-}
-
-// Verify that a binding expires properly, and rejects send requests.
-// Flaky, see https://code.google.com/p/webrtc/issues/detail?id=4134
-TEST_F(RelayServerTest, DISABLED_TestExpiration) {
-  Allocate();
-  Bind();
-
-  // Wait twice the lifetime to make sure the server has expired the binding.
-  rtc::Thread::Current()->ProcessMessages((LIFETIME * 2) * 1000);
-
-  std::unique_ptr<StunMessage> req(CreateStunMessage(STUN_SEND_REQUEST)), res;
-  AddMagicCookieAttr(req.get());
-  AddUsernameAttr(req.get(), username_);
-  AddDestinationAttr(req.get(), client2_addr);
-
-  auto data_attr = StunAttribute::CreateByteString(STUN_ATTR_DATA);
-  data_attr->CopyBytes(msg1);
-  req->AddAttribute(std::move(data_attr));
-
-  Send1(req.get());
-  res.reset(Receive1());
-
-  ASSERT_TRUE(res.get() != NULL);
-  EXPECT_EQ(STUN_SEND_ERROR_RESPONSE, res->type());
-
-  const StunErrorCodeAttribute* err = res->GetErrorCode();
-  ASSERT_TRUE(err != NULL);
-  EXPECT_EQ(6, err->eclass());
-  EXPECT_EQ(0, err->number());
-  EXPECT_EQ("Operation Not Supported", err->reason());
-
-  // Also verify that traffic from the external client is ignored.
-  SendRaw2(msg2, static_cast<int>(strlen(msg2)));
-  EXPECT_TRUE(ReceiveRaw1().empty());
-}
diff --git a/p2p/base/session.cc b/p2p/base/session.cc
deleted file mode 100644
index 1a23f83..0000000
--- a/p2p/base/session.cc
+++ /dev/null
@@ -1,12 +0,0 @@
-/*
- *  Copyright 2004 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.
- */
-
-// TODO(deadbeef): Remove this file when Chrome build files no longer reference
-// it.
diff --git a/p2p/base/session.h b/p2p/base/session.h
deleted file mode 100644
index a98a5ef..0000000
--- a/p2p/base/session.h
+++ /dev/null
@@ -1,13 +0,0 @@
-/*
- *  Copyright 2004 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.
- */
-
-// TODO(deadbeef): Remove this file when Chrome build files no longer reference
-// it.
-#error "DONT INCLUDE THIS"
diff --git a/p2p/base/sessiondescription.cc b/p2p/base/sessiondescription.cc
deleted file mode 100644
index 1e69c83..0000000
--- a/p2p/base/sessiondescription.cc
+++ /dev/null
@@ -1,229 +0,0 @@
-/*
- *  Copyright 2010 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/p2p/base/sessiondescription.h"
-
-namespace cricket {
-
-ContentInfo* FindContentInfoByName(
-    ContentInfos& contents, const std::string& name) {
-  for (ContentInfos::iterator content = contents.begin();
-       content != contents.end(); ++content) {
-    if (content->name == name) {
-      return &(*content);
-    }
-  }
-  return NULL;
-}
-
-const ContentInfo* FindContentInfoByName(
-    const ContentInfos& contents, const std::string& name) {
-  for (ContentInfos::const_iterator content = contents.begin();
-       content != contents.end(); ++content) {
-    if (content->name == name) {
-      return &(*content);
-    }
-  }
-  return NULL;
-}
-
-const ContentInfo* FindContentInfoByType(
-    const ContentInfos& contents, const std::string& type) {
-  for (ContentInfos::const_iterator content = contents.begin();
-       content != contents.end(); ++content) {
-    if (content->type == type) {
-      return &(*content);
-    }
-  }
-  return NULL;
-}
-
-const std::string* ContentGroup::FirstContentName() const {
-  return (!content_names_.empty()) ? &(*content_names_.begin()) : NULL;
-}
-
-bool ContentGroup::HasContentName(const std::string& content_name) const {
-  return (std::find(content_names_.begin(), content_names_.end(),
-                    content_name) != content_names_.end());
-}
-
-void ContentGroup::AddContentName(const std::string& content_name) {
-  if (!HasContentName(content_name)) {
-    content_names_.push_back(content_name);
-  }
-}
-
-bool ContentGroup::RemoveContentName(const std::string& content_name) {
-  ContentNames::iterator iter = std::find(
-      content_names_.begin(), content_names_.end(), content_name);
-  if (iter == content_names_.end()) {
-    return false;
-  }
-  content_names_.erase(iter);
-  return true;
-}
-
-SessionDescription* SessionDescription::Copy() const {
-  SessionDescription* copy = new SessionDescription(*this);
-  // Copy all ContentDescriptions.
-  for (ContentInfos::iterator content = copy->contents_.begin();
-      content != copy->contents().end(); ++content) {
-    content->description = content->description->Copy();
-  }
-  return copy;
-}
-
-const ContentInfo* SessionDescription::GetContentByName(
-    const std::string& name) const {
-  return FindContentInfoByName(contents_, name);
-}
-
-ContentInfo* SessionDescription::GetContentByName(
-    const std::string& name)  {
-  return FindContentInfoByName(contents_, name);
-}
-
-const ContentDescription* SessionDescription::GetContentDescriptionByName(
-    const std::string& name) const {
-  const ContentInfo* cinfo = FindContentInfoByName(contents_, name);
-  if (cinfo == NULL) {
-    return NULL;
-  }
-
-  return cinfo->description;
-}
-
-ContentDescription* SessionDescription::GetContentDescriptionByName(
-    const std::string& name) {
-  ContentInfo* cinfo = FindContentInfoByName(contents_, name);
-  if (cinfo == NULL) {
-    return NULL;
-  }
-
-  return cinfo->description;
-}
-
-const ContentInfo* SessionDescription::FirstContentByType(
-    const std::string& type) const {
-  return FindContentInfoByType(contents_, type);
-}
-
-const ContentInfo* SessionDescription::FirstContent() const {
-  return (contents_.empty()) ? NULL : &(*contents_.begin());
-}
-
-void SessionDescription::AddContent(const std::string& name,
-                                    const std::string& type,
-                                    ContentDescription* description) {
-  contents_.push_back(ContentInfo(name, type, description));
-}
-
-void SessionDescription::AddContent(const std::string& name,
-                                    const std::string& type,
-                                    bool rejected,
-                                    ContentDescription* description) {
-  contents_.push_back(ContentInfo(name, type, rejected, description));
-}
-
-void SessionDescription::AddContent(const std::string& name,
-                                    const std::string& type,
-                                    bool rejected,
-                                    bool bundle_only,
-                                    ContentDescription* description) {
-  contents_.push_back(
-      ContentInfo(name, type, rejected, bundle_only, description));
-}
-
-bool SessionDescription::RemoveContentByName(const std::string& name) {
-  for (ContentInfos::iterator content = contents_.begin();
-       content != contents_.end(); ++content) {
-    if (content->name == name) {
-      delete content->description;
-      contents_.erase(content);
-      return true;
-    }
-  }
-
-  return false;
-}
-
-bool SessionDescription::AddTransportInfo(const TransportInfo& transport_info) {
-  if (GetTransportInfoByName(transport_info.content_name) != NULL) {
-    return false;
-  }
-  transport_infos_.push_back(transport_info);
-  return true;
-}
-
-bool SessionDescription::RemoveTransportInfoByName(const std::string& name) {
-  for (TransportInfos::iterator transport_info = transport_infos_.begin();
-       transport_info != transport_infos_.end(); ++transport_info) {
-    if (transport_info->content_name == name) {
-      transport_infos_.erase(transport_info);
-      return true;
-    }
-  }
-  return false;
-}
-
-const TransportInfo* SessionDescription::GetTransportInfoByName(
-    const std::string& name) const {
-  for (TransportInfos::const_iterator iter = transport_infos_.begin();
-       iter != transport_infos_.end(); ++iter) {
-    if (iter->content_name == name) {
-      return &(*iter);
-    }
-  }
-  return NULL;
-}
-
-TransportInfo* SessionDescription::GetTransportInfoByName(
-    const std::string& name) {
-  for (TransportInfos::iterator iter = transport_infos_.begin();
-       iter != transport_infos_.end(); ++iter) {
-    if (iter->content_name == name) {
-      return &(*iter);
-    }
-  }
-  return NULL;
-}
-
-void SessionDescription::RemoveGroupByName(const std::string& name) {
-  for (ContentGroups::iterator iter = content_groups_.begin();
-       iter != content_groups_.end(); ++iter) {
-    if (iter->semantics() == name) {
-      content_groups_.erase(iter);
-      break;
-    }
-  }
-}
-
-bool SessionDescription::HasGroup(const std::string& name) const {
-  for (ContentGroups::const_iterator iter = content_groups_.begin();
-       iter != content_groups_.end(); ++iter) {
-    if (iter->semantics() == name) {
-      return true;
-    }
-  }
-  return false;
-}
-
-const ContentGroup* SessionDescription::GetGroupByName(
-    const std::string& name) const {
-  for (ContentGroups::const_iterator iter = content_groups_.begin();
-       iter != content_groups_.end(); ++iter) {
-    if (iter->semantics() == name) {
-      return &(*iter);
-    }
-  }
-  return NULL;
-}
-
-}  // namespace cricket
diff --git a/p2p/base/sessiondescription.h b/p2p/base/sessiondescription.h
deleted file mode 100644
index df9348d..0000000
--- a/p2p/base/sessiondescription.h
+++ /dev/null
@@ -1,206 +0,0 @@
-/*
- *  Copyright 2004 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_P2P_BASE_SESSIONDESCRIPTION_H_
-#define WEBRTC_P2P_BASE_SESSIONDESCRIPTION_H_
-
-#include <string>
-#include <vector>
-
-#include "webrtc/p2p/base/transportinfo.h"
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace cricket {
-
-// Describes a session content. Individual content types inherit from
-// this class.  Analagous to a <jingle><content><description> or
-// <session><description>.
-class ContentDescription {
- public:
-  virtual ~ContentDescription() {}
-  virtual ContentDescription* Copy() const = 0;
-};
-
-// Analagous to a <jingle><content> or <session><description>.
-// name = name of <content name="...">
-// type = xmlns of <content>
-struct ContentInfo {
-  ContentInfo() {}
-  ContentInfo(const std::string& name,
-              const std::string& type,
-              ContentDescription* description)
-      : name(name), type(type), description(description) {}
-  ContentInfo(const std::string& name,
-              const std::string& type,
-              bool rejected,
-              ContentDescription* description) :
-      name(name), type(type), rejected(rejected), description(description) {}
-  ContentInfo(const std::string& name,
-              const std::string& type,
-              bool rejected,
-              bool bundle_only,
-              ContentDescription* description)
-      : name(name),
-        type(type),
-        rejected(rejected),
-        bundle_only(bundle_only),
-        description(description) {}
-  std::string name;
-  std::string type;
-  bool rejected = false;
-  bool bundle_only = false;
-  ContentDescription* description = nullptr;
-};
-
-typedef std::vector<std::string> ContentNames;
-
-// This class provides a mechanism to aggregate different media contents into a
-// group. This group can also be shared with the peers in a pre-defined format.
-// GroupInfo should be populated only with the |content_name| of the
-// MediaDescription.
-class ContentGroup {
- public:
-  explicit ContentGroup(const std::string& semantics) :
-      semantics_(semantics) {}
-
-  const std::string& semantics() const { return semantics_; }
-  const ContentNames& content_names() const { return content_names_; }
-
-  const std::string* FirstContentName() const;
-  bool HasContentName(const std::string& content_name) const;
-  void AddContentName(const std::string& content_name);
-  bool RemoveContentName(const std::string& content_name);
-
- private:
-  std::string semantics_;
-  ContentNames content_names_;
-};
-
-typedef std::vector<ContentInfo> ContentInfos;
-typedef std::vector<ContentGroup> ContentGroups;
-
-const ContentInfo* FindContentInfoByName(
-    const ContentInfos& contents, const std::string& name);
-const ContentInfo* FindContentInfoByType(
-    const ContentInfos& contents, const std::string& type);
-
-// Describes a collection of contents, each with its own name and
-// type.  Analogous to a <jingle> or <session> stanza.  Assumes that
-// contents are unique be name, but doesn't enforce that.
-class SessionDescription {
- public:
-  SessionDescription() {}
-  explicit SessionDescription(const ContentInfos& contents) :
-      contents_(contents) {}
-  SessionDescription(const ContentInfos& contents,
-                     const ContentGroups& groups) :
-      contents_(contents),
-      content_groups_(groups) {}
-  SessionDescription(const ContentInfos& contents,
-                     const TransportInfos& transports,
-                     const ContentGroups& groups) :
-      contents_(contents),
-      transport_infos_(transports),
-      content_groups_(groups) {}
-  ~SessionDescription() {
-    for (ContentInfos::iterator content = contents_.begin();
-         content != contents_.end(); ++content) {
-      delete content->description;
-    }
-  }
-
-  SessionDescription* Copy() const;
-
-  // Content accessors.
-  const ContentInfos& contents() const { return contents_; }
-  ContentInfos& contents() { return contents_; }
-  const ContentInfo* GetContentByName(const std::string& name) const;
-  ContentInfo* GetContentByName(const std::string& name);
-  const ContentDescription* GetContentDescriptionByName(
-      const std::string& name) const;
-  ContentDescription* GetContentDescriptionByName(const std::string& name);
-  const ContentInfo* FirstContentByType(const std::string& type) const;
-  const ContentInfo* FirstContent() const;
-
-  // Content mutators.
-  // Adds a content to this description. Takes ownership of ContentDescription*.
-  void AddContent(const std::string& name,
-                  const std::string& type,
-                  ContentDescription* description);
-  void AddContent(const std::string& name,
-                  const std::string& type,
-                  bool rejected,
-                  ContentDescription* description);
-  void AddContent(const std::string& name,
-                  const std::string& type,
-                  bool rejected,
-                  bool bundle_only,
-                  ContentDescription* description);
-  bool RemoveContentByName(const std::string& name);
-
-  // Transport accessors.
-  const TransportInfos& transport_infos() const { return transport_infos_; }
-  TransportInfos& transport_infos() { return transport_infos_; }
-  const TransportInfo* GetTransportInfoByName(
-      const std::string& name) const;
-  TransportInfo* GetTransportInfoByName(const std::string& name);
-  const TransportDescription* GetTransportDescriptionByName(
-      const std::string& name) const {
-    const TransportInfo* tinfo = GetTransportInfoByName(name);
-    return tinfo ? &tinfo->description : NULL;
-  }
-
-  // Transport mutators.
-  void set_transport_infos(const TransportInfos& transport_infos) {
-    transport_infos_ = transport_infos;
-  }
-  // Adds a TransportInfo to this description.
-  // Returns false if a TransportInfo with the same name already exists.
-  bool AddTransportInfo(const TransportInfo& transport_info);
-  bool RemoveTransportInfoByName(const std::string& name);
-
-  // Group accessors.
-  const ContentGroups& groups() const { return content_groups_; }
-  const ContentGroup* GetGroupByName(const std::string& name) const;
-  bool HasGroup(const std::string& name) const;
-
-  // Group mutators.
-  void AddGroup(const ContentGroup& group) { content_groups_.push_back(group); }
-  // Remove the first group with the same semantics specified by |name|.
-  void RemoveGroupByName(const std::string& name);
-
-  // Global attributes.
-  void set_msid_supported(bool supported) { msid_supported_ = supported; }
-  bool msid_supported() const { return msid_supported_; }
-
- private:
-  ContentInfos contents_;
-  TransportInfos transport_infos_;
-  ContentGroups content_groups_;
-  bool msid_supported_ = true;
-};
-
-// Indicates whether a ContentDescription was an offer or an answer, as
-// described in http://www.ietf.org/rfc/rfc3264.txt. CA_UPDATE
-// indicates a jingle update message which contains a subset of a full
-// session description
-enum ContentAction {
-  CA_OFFER, CA_PRANSWER, CA_ANSWER, CA_UPDATE
-};
-
-// Indicates whether a ContentDescription was sent by the local client
-// or received from the remote client.
-enum ContentSource {
-  CS_LOCAL, CS_REMOTE
-};
-
-}  // namespace cricket
-
-#endif  // WEBRTC_P2P_BASE_SESSIONDESCRIPTION_H_
diff --git a/p2p/base/stun.cc b/p2p/base/stun.cc
deleted file mode 100644
index 56b4ee1..0000000
--- a/p2p/base/stun.cc
+++ /dev/null
@@ -1,932 +0,0 @@
-/*
- *  Copyright 2004 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/p2p/base/stun.h"
-
-#include <string.h>
-
-#include <memory>
-
-#include "webrtc/rtc_base/byteorder.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/crc32.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/messagedigest.h"
-#include "webrtc/rtc_base/ptr_util.h"
-#include "webrtc/rtc_base/stringencode.h"
-
-using rtc::ByteBufferReader;
-using rtc::ByteBufferWriter;
-
-namespace cricket {
-
-const char STUN_ERROR_REASON_TRY_ALTERNATE_SERVER[] = "Try Alternate Server";
-const char STUN_ERROR_REASON_BAD_REQUEST[] = "Bad Request";
-const char STUN_ERROR_REASON_UNAUTHORIZED[] = "Unauthorized";
-const char STUN_ERROR_REASON_FORBIDDEN[] = "Forbidden";
-const char STUN_ERROR_REASON_STALE_CREDENTIALS[] = "Stale Credentials";
-const char STUN_ERROR_REASON_ALLOCATION_MISMATCH[] = "Allocation Mismatch";
-const char STUN_ERROR_REASON_STALE_NONCE[] = "Stale Nonce";
-const char STUN_ERROR_REASON_WRONG_CREDENTIALS[] = "Wrong Credentials";
-const char STUN_ERROR_REASON_UNSUPPORTED_PROTOCOL[] = "Unsupported Protocol";
-const char STUN_ERROR_REASON_ROLE_CONFLICT[] = "Role Conflict";
-const char STUN_ERROR_REASON_SERVER_ERROR[] = "Server Error";
-
-const char TURN_MAGIC_COOKIE_VALUE[] = { '\x72', '\xC6', '\x4B', '\xC6' };
-const char EMPTY_TRANSACTION_ID[] = "0000000000000000";
-const uint32_t STUN_FINGERPRINT_XOR_VALUE = 0x5354554E;
-
-// StunMessage
-
-StunMessage::StunMessage()
-    : type_(0),
-      length_(0),
-      transaction_id_(EMPTY_TRANSACTION_ID) {
-  RTC_DCHECK(IsValidTransactionId(transaction_id_));
-}
-
-bool StunMessage::IsLegacy() const {
-  if (transaction_id_.size() == kStunLegacyTransactionIdLength)
-    return true;
-  RTC_DCHECK(transaction_id_.size() == kStunTransactionIdLength);
-  return false;
-}
-
-bool StunMessage::SetTransactionID(const std::string& str) {
-  if (!IsValidTransactionId(str)) {
-    return false;
-  }
-  transaction_id_ = str;
-  return true;
-}
-
-void StunMessage::AddAttribute(std::unique_ptr<StunAttribute> attr) {
-  // Fail any attributes that aren't valid for this type of message.
-  RTC_DCHECK_EQ(attr->value_type(), GetAttributeValueType(attr->type()));
-
-  attr->SetOwner(this);
-  size_t attr_length = attr->length();
-  if (attr_length % 4 != 0) {
-    attr_length += (4 - (attr_length % 4));
-  }
-  length_ += static_cast<uint16_t>(attr_length + 4);
-
-  attrs_.push_back(std::move(attr));
-}
-
-const StunAddressAttribute* StunMessage::GetAddress(int type) const {
-  switch (type) {
-    case STUN_ATTR_MAPPED_ADDRESS: {
-      // Return XOR-MAPPED-ADDRESS when MAPPED-ADDRESS attribute is
-      // missing.
-      const StunAttribute* mapped_address =
-          GetAttribute(STUN_ATTR_MAPPED_ADDRESS);
-      if (!mapped_address)
-        mapped_address = GetAttribute(STUN_ATTR_XOR_MAPPED_ADDRESS);
-      return reinterpret_cast<const StunAddressAttribute*>(mapped_address);
-    }
-
-    default:
-      return static_cast<const StunAddressAttribute*>(GetAttribute(type));
-  }
-}
-
-const StunUInt32Attribute* StunMessage::GetUInt32(int type) const {
-  return static_cast<const StunUInt32Attribute*>(GetAttribute(type));
-}
-
-const StunUInt64Attribute* StunMessage::GetUInt64(int type) const {
-  return static_cast<const StunUInt64Attribute*>(GetAttribute(type));
-}
-
-const StunByteStringAttribute* StunMessage::GetByteString(int type) const {
-  return static_cast<const StunByteStringAttribute*>(GetAttribute(type));
-}
-
-const StunErrorCodeAttribute* StunMessage::GetErrorCode() const {
-  return static_cast<const StunErrorCodeAttribute*>(
-      GetAttribute(STUN_ATTR_ERROR_CODE));
-}
-
-int StunMessage::GetErrorCodeValue() const {
-  const StunErrorCodeAttribute* error_attribute = GetErrorCode();
-  return error_attribute ? error_attribute->code() : STUN_ERROR_GLOBAL_FAILURE;
-}
-
-const StunUInt16ListAttribute* StunMessage::GetUnknownAttributes() const {
-  return static_cast<const StunUInt16ListAttribute*>(
-      GetAttribute(STUN_ATTR_UNKNOWN_ATTRIBUTES));
-}
-
-// Verifies a STUN message has a valid MESSAGE-INTEGRITY attribute, using the
-// procedure outlined in RFC 5389, section 15.4.
-bool StunMessage::ValidateMessageIntegrity(const char* data, size_t size,
-                                           const std::string& password) {
-  // Verifying the size of the message.
-  if ((size % 4) != 0 || size < kStunHeaderSize) {
-    return false;
-  }
-
-  // Getting the message length from the STUN header.
-  uint16_t msg_length = rtc::GetBE16(&data[2]);
-  if (size != (msg_length + kStunHeaderSize)) {
-    return false;
-  }
-
-  // Finding Message Integrity attribute in stun message.
-  size_t current_pos = kStunHeaderSize;
-  bool has_message_integrity_attr = false;
-  while (current_pos + 4 <= size) {
-    uint16_t attr_type, attr_length;
-    // Getting attribute type and length.
-    attr_type = rtc::GetBE16(&data[current_pos]);
-    attr_length = rtc::GetBE16(&data[current_pos + sizeof(attr_type)]);
-
-    // If M-I, sanity check it, and break out.
-    if (attr_type == STUN_ATTR_MESSAGE_INTEGRITY) {
-      if (attr_length != kStunMessageIntegritySize ||
-          current_pos + sizeof(attr_type) + sizeof(attr_length) + attr_length >
-              size) {
-        return false;
-      }
-      has_message_integrity_attr = true;
-      break;
-    }
-
-    // Otherwise, skip to the next attribute.
-    current_pos += sizeof(attr_type) + sizeof(attr_length) + attr_length;
-    if ((attr_length % 4) != 0) {
-      current_pos += (4 - (attr_length % 4));
-    }
-  }
-
-  if (!has_message_integrity_attr) {
-    return false;
-  }
-
-  // Getting length of the message to calculate Message Integrity.
-  size_t mi_pos = current_pos;
-  std::unique_ptr<char[]> temp_data(new char[current_pos]);
-  memcpy(temp_data.get(), data, current_pos);
-  if (size > mi_pos + kStunAttributeHeaderSize + kStunMessageIntegritySize) {
-    // Stun message has other attributes after message integrity.
-    // Adjust the length parameter in stun message to calculate HMAC.
-    size_t extra_offset = size -
-        (mi_pos + kStunAttributeHeaderSize + kStunMessageIntegritySize);
-    size_t new_adjusted_len = size - extra_offset - kStunHeaderSize;
-
-    // Writing new length of the STUN message @ Message Length in temp buffer.
-    //      0                   1                   2                   3
-    //      0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
-    //     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-    //     |0 0|     STUN Message Type     |         Message Length        |
-    //     +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-    rtc::SetBE16(temp_data.get() + 2, static_cast<uint16_t>(new_adjusted_len));
-  }
-
-  char hmac[kStunMessageIntegritySize];
-  size_t ret = rtc::ComputeHmac(rtc::DIGEST_SHA_1,
-                                      password.c_str(), password.size(),
-                                      temp_data.get(), mi_pos,
-                                      hmac, sizeof(hmac));
-  RTC_DCHECK(ret == sizeof(hmac));
-  if (ret != sizeof(hmac))
-    return false;
-
-  // Comparing the calculated HMAC with the one present in the message.
-  return memcmp(data + current_pos + kStunAttributeHeaderSize,
-                hmac,
-                sizeof(hmac)) == 0;
-}
-
-bool StunMessage::AddMessageIntegrity(const std::string& password) {
-  return AddMessageIntegrity(password.c_str(), password.size());
-}
-
-bool StunMessage::AddMessageIntegrity(const char* key,
-                                      size_t keylen) {
-  // Add the attribute with a dummy value. Since this is a known attribute, it
-  // can't fail.
-  auto msg_integrity_attr_ptr = rtc::MakeUnique<StunByteStringAttribute>(
-      STUN_ATTR_MESSAGE_INTEGRITY, std::string(kStunMessageIntegritySize, '0'));
-  auto* msg_integrity_attr = msg_integrity_attr_ptr.get();
-  AddAttribute(std::move(msg_integrity_attr_ptr));
-
-  // Calculate the HMAC for the message.
-  ByteBufferWriter buf;
-  if (!Write(&buf))
-    return false;
-
-  int msg_len_for_hmac = static_cast<int>(
-      buf.Length() - kStunAttributeHeaderSize - msg_integrity_attr->length());
-  char hmac[kStunMessageIntegritySize];
-  size_t ret = rtc::ComputeHmac(rtc::DIGEST_SHA_1,
-                                      key, keylen,
-                                      buf.Data(), msg_len_for_hmac,
-                                      hmac, sizeof(hmac));
-  RTC_DCHECK(ret == sizeof(hmac));
-  if (ret != sizeof(hmac)) {
-    LOG(LS_ERROR) << "HMAC computation failed. Message-Integrity "
-                  << "has dummy value.";
-    return false;
-  }
-
-  // Insert correct HMAC into the attribute.
-  msg_integrity_attr->CopyBytes(hmac, sizeof(hmac));
-  return true;
-}
-
-// Verifies a message is in fact a STUN message, by performing the checks
-// outlined in RFC 5389, section 7.3, including the FINGERPRINT check detailed
-// in section 15.5.
-bool StunMessage::ValidateFingerprint(const char* data, size_t size) {
-  // Check the message length.
-  size_t fingerprint_attr_size =
-      kStunAttributeHeaderSize + StunUInt32Attribute::SIZE;
-  if (size % 4 != 0 || size < kStunHeaderSize + fingerprint_attr_size)
-    return false;
-
-  // Skip the rest if the magic cookie isn't present.
-  const char* magic_cookie =
-      data + kStunTransactionIdOffset - kStunMagicCookieLength;
-  if (rtc::GetBE32(magic_cookie) != kStunMagicCookie)
-    return false;
-
-  // Check the fingerprint type and length.
-  const char* fingerprint_attr_data = data + size - fingerprint_attr_size;
-  if (rtc::GetBE16(fingerprint_attr_data) != STUN_ATTR_FINGERPRINT ||
-      rtc::GetBE16(fingerprint_attr_data + sizeof(uint16_t)) !=
-          StunUInt32Attribute::SIZE)
-    return false;
-
-  // Check the fingerprint value.
-  uint32_t fingerprint =
-      rtc::GetBE32(fingerprint_attr_data + kStunAttributeHeaderSize);
-  return ((fingerprint ^ STUN_FINGERPRINT_XOR_VALUE) ==
-      rtc::ComputeCrc32(data, size - fingerprint_attr_size));
-}
-
-bool StunMessage::AddFingerprint() {
-  // Add the attribute with a dummy value. Since this is a known attribute,
-  // it can't fail.
-  auto fingerprint_attr_ptr =
-      rtc::MakeUnique<StunUInt32Attribute>(STUN_ATTR_FINGERPRINT, 0);
-  auto fingerprint_attr = fingerprint_attr_ptr.get();
-  AddAttribute(std::move(fingerprint_attr_ptr));
-
-  // Calculate the CRC-32 for the message and insert it.
-  ByteBufferWriter buf;
-  if (!Write(&buf))
-    return false;
-
-  int msg_len_for_crc32 = static_cast<int>(
-      buf.Length() - kStunAttributeHeaderSize - fingerprint_attr->length());
-  uint32_t c = rtc::ComputeCrc32(buf.Data(), msg_len_for_crc32);
-
-  // Insert the correct CRC-32, XORed with a constant, into the attribute.
-  fingerprint_attr->SetValue(c ^ STUN_FINGERPRINT_XOR_VALUE);
-  return true;
-}
-
-bool StunMessage::Read(ByteBufferReader* buf) {
-  if (!buf->ReadUInt16(&type_))
-    return false;
-
-  if (type_ & 0x8000) {
-    // RTP and RTCP set the MSB of first byte, since first two bits are version,
-    // and version is always 2 (10). If set, this is not a STUN packet.
-    return false;
-  }
-
-  if (!buf->ReadUInt16(&length_))
-    return false;
-
-  std::string magic_cookie;
-  if (!buf->ReadString(&magic_cookie, kStunMagicCookieLength))
-    return false;
-
-  std::string transaction_id;
-  if (!buf->ReadString(&transaction_id, kStunTransactionIdLength))
-    return false;
-
-  uint32_t magic_cookie_int =
-      *reinterpret_cast<const uint32_t*>(magic_cookie.data());
-  if (rtc::NetworkToHost32(magic_cookie_int) != kStunMagicCookie) {
-    // If magic cookie is invalid it means that the peer implements
-    // RFC3489 instead of RFC5389.
-    transaction_id.insert(0, magic_cookie);
-  }
-  RTC_DCHECK(IsValidTransactionId(transaction_id));
-  transaction_id_ = transaction_id;
-
-  if (length_ != buf->Length())
-    return false;
-
-  attrs_.resize(0);
-
-  size_t rest = buf->Length() - length_;
-  while (buf->Length() > rest) {
-    uint16_t attr_type, attr_length;
-    if (!buf->ReadUInt16(&attr_type))
-      return false;
-    if (!buf->ReadUInt16(&attr_length))
-      return false;
-
-    std::unique_ptr<StunAttribute> attr(
-        CreateAttribute(attr_type, attr_length));
-    if (!attr) {
-      // Skip any unknown or malformed attributes.
-      if ((attr_length % 4) != 0) {
-        attr_length += (4 - (attr_length % 4));
-      }
-      if (!buf->Consume(attr_length))
-        return false;
-    } else {
-      if (!attr->Read(buf))
-        return false;
-      attrs_.push_back(std::move(attr));
-    }
-  }
-
-  RTC_DCHECK(buf->Length() == rest);
-  return true;
-}
-
-bool StunMessage::Write(ByteBufferWriter* buf) const {
-  buf->WriteUInt16(type_);
-  buf->WriteUInt16(length_);
-  if (!IsLegacy())
-    buf->WriteUInt32(kStunMagicCookie);
-  buf->WriteString(transaction_id_);
-
-  for (const auto& attr : attrs_) {
-    buf->WriteUInt16(attr->type());
-    buf->WriteUInt16(static_cast<uint16_t>(attr->length()));
-    if (!attr->Write(buf)) {
-      return false;
-    }
-  }
-
-  return true;
-}
-
-StunAttributeValueType StunMessage::GetAttributeValueType(int type) const {
-  switch (type) {
-    case STUN_ATTR_MAPPED_ADDRESS:      return STUN_VALUE_ADDRESS;
-    case STUN_ATTR_USERNAME:            return STUN_VALUE_BYTE_STRING;
-    case STUN_ATTR_MESSAGE_INTEGRITY:   return STUN_VALUE_BYTE_STRING;
-    case STUN_ATTR_ERROR_CODE:          return STUN_VALUE_ERROR_CODE;
-    case STUN_ATTR_UNKNOWN_ATTRIBUTES:  return STUN_VALUE_UINT16_LIST;
-    case STUN_ATTR_REALM:               return STUN_VALUE_BYTE_STRING;
-    case STUN_ATTR_NONCE:               return STUN_VALUE_BYTE_STRING;
-    case STUN_ATTR_XOR_MAPPED_ADDRESS:  return STUN_VALUE_XOR_ADDRESS;
-    case STUN_ATTR_SOFTWARE:            return STUN_VALUE_BYTE_STRING;
-    case STUN_ATTR_ALTERNATE_SERVER:    return STUN_VALUE_ADDRESS;
-    case STUN_ATTR_FINGERPRINT:         return STUN_VALUE_UINT32;
-    case STUN_ATTR_ORIGIN:              return STUN_VALUE_BYTE_STRING;
-    case STUN_ATTR_RETRANSMIT_COUNT:    return STUN_VALUE_UINT32;
-    default:                            return STUN_VALUE_UNKNOWN;
-  }
-}
-
-StunAttribute* StunMessage::CreateAttribute(int type, size_t length) /*const*/ {
-  StunAttributeValueType value_type = GetAttributeValueType(type);
-  return StunAttribute::Create(value_type, type, static_cast<uint16_t>(length),
-                               this);
-}
-
-const StunAttribute* StunMessage::GetAttribute(int type) const {
-  for (const auto& attr : attrs_) {
-    if (attr->type() == type) {
-      return attr.get();
-    }
-  }
-  return NULL;
-}
-
-bool StunMessage::IsValidTransactionId(const std::string& transaction_id) {
-  return transaction_id.size() == kStunTransactionIdLength ||
-      transaction_id.size() == kStunLegacyTransactionIdLength;
-}
-
-// StunAttribute
-
-StunAttribute::StunAttribute(uint16_t type, uint16_t length)
-    : type_(type), length_(length) {
-}
-
-void StunAttribute::ConsumePadding(ByteBufferReader* buf) const {
-  int remainder = length_ % 4;
-  if (remainder > 0) {
-    buf->Consume(4 - remainder);
-  }
-}
-
-void StunAttribute::WritePadding(ByteBufferWriter* buf) const {
-  int remainder = length_ % 4;
-  if (remainder > 0) {
-    char zeroes[4] = {0};
-    buf->WriteBytes(zeroes, 4 - remainder);
-  }
-}
-
-StunAttribute* StunAttribute::Create(StunAttributeValueType value_type,
-                                     uint16_t type,
-                                     uint16_t length,
-                                     StunMessage* owner) {
-  switch (value_type) {
-    case STUN_VALUE_ADDRESS:
-      return new StunAddressAttribute(type, length);
-    case STUN_VALUE_XOR_ADDRESS:
-      return new StunXorAddressAttribute(type, length, owner);
-    case STUN_VALUE_UINT32:
-      return new StunUInt32Attribute(type);
-    case STUN_VALUE_UINT64:
-      return new StunUInt64Attribute(type);
-    case STUN_VALUE_BYTE_STRING:
-      return new StunByteStringAttribute(type, length);
-    case STUN_VALUE_ERROR_CODE:
-      return new StunErrorCodeAttribute(type, length);
-    case STUN_VALUE_UINT16_LIST:
-      return new StunUInt16ListAttribute(type, length);
-    default:
-      return NULL;
-  }
-}
-
-std::unique_ptr<StunAddressAttribute> StunAttribute::CreateAddress(
-    uint16_t type) {
-  return rtc::MakeUnique<StunAddressAttribute>(type, 0);
-}
-
-std::unique_ptr<StunXorAddressAttribute> StunAttribute::CreateXorAddress(
-    uint16_t type) {
-  return rtc::MakeUnique<StunXorAddressAttribute>(type, 0, nullptr);
-}
-
-std::unique_ptr<StunUInt64Attribute> StunAttribute::CreateUInt64(
-    uint16_t type) {
-  return rtc::MakeUnique<StunUInt64Attribute>(type);
-}
-
-std::unique_ptr<StunUInt32Attribute> StunAttribute::CreateUInt32(
-    uint16_t type) {
-  return rtc::MakeUnique<StunUInt32Attribute>(type);
-}
-
-std::unique_ptr<StunByteStringAttribute> StunAttribute::CreateByteString(
-    uint16_t type) {
-  return rtc::MakeUnique<StunByteStringAttribute>(type, 0);
-}
-
-std::unique_ptr<StunErrorCodeAttribute> StunAttribute::CreateErrorCode() {
-  return rtc::MakeUnique<StunErrorCodeAttribute>(
-      STUN_ATTR_ERROR_CODE, StunErrorCodeAttribute::MIN_SIZE);
-}
-
-std::unique_ptr<StunUInt16ListAttribute>
-StunAttribute::CreateUnknownAttributes() {
-  return rtc::MakeUnique<StunUInt16ListAttribute>(STUN_ATTR_UNKNOWN_ATTRIBUTES,
-                                                  0);
-}
-
-StunAddressAttribute::StunAddressAttribute(uint16_t type,
-                                           const rtc::SocketAddress& addr)
-    : StunAttribute(type, 0) {
-  SetAddress(addr);
-}
-
-StunAddressAttribute::StunAddressAttribute(uint16_t type, uint16_t length)
-    : StunAttribute(type, length) {
-}
-
-bool StunAddressAttribute::Read(ByteBufferReader* buf) {
-  uint8_t dummy;
-  if (!buf->ReadUInt8(&dummy))
-    return false;
-
-  uint8_t stun_family;
-  if (!buf->ReadUInt8(&stun_family)) {
-    return false;
-  }
-  uint16_t port;
-  if (!buf->ReadUInt16(&port))
-    return false;
-  if (stun_family == STUN_ADDRESS_IPV4) {
-    in_addr v4addr;
-    if (length() != SIZE_IP4) {
-      return false;
-    }
-    if (!buf->ReadBytes(reinterpret_cast<char*>(&v4addr), sizeof(v4addr))) {
-      return false;
-    }
-    rtc::IPAddress ipaddr(v4addr);
-    SetAddress(rtc::SocketAddress(ipaddr, port));
-  } else if (stun_family == STUN_ADDRESS_IPV6) {
-    in6_addr v6addr;
-    if (length() != SIZE_IP6) {
-      return false;
-    }
-    if (!buf->ReadBytes(reinterpret_cast<char*>(&v6addr), sizeof(v6addr))) {
-      return false;
-    }
-    rtc::IPAddress ipaddr(v6addr);
-    SetAddress(rtc::SocketAddress(ipaddr, port));
-  } else {
-    return false;
-  }
-  return true;
-}
-
-bool StunAddressAttribute::Write(ByteBufferWriter* buf) const {
-  StunAddressFamily address_family = family();
-  if (address_family == STUN_ADDRESS_UNDEF) {
-    LOG(LS_ERROR) << "Error writing address attribute: unknown family.";
-    return false;
-  }
-  buf->WriteUInt8(0);
-  buf->WriteUInt8(address_family);
-  buf->WriteUInt16(address_.port());
-  switch (address_.family()) {
-    case AF_INET: {
-      in_addr v4addr = address_.ipaddr().ipv4_address();
-      buf->WriteBytes(reinterpret_cast<char*>(&v4addr), sizeof(v4addr));
-      break;
-    }
-    case AF_INET6: {
-      in6_addr v6addr = address_.ipaddr().ipv6_address();
-      buf->WriteBytes(reinterpret_cast<char*>(&v6addr), sizeof(v6addr));
-      break;
-    }
-  }
-  return true;
-}
-
-StunXorAddressAttribute::StunXorAddressAttribute(uint16_t type,
-                                                 const rtc::SocketAddress& addr)
-    : StunAddressAttribute(type, addr), owner_(NULL) {
-}
-
-StunXorAddressAttribute::StunXorAddressAttribute(uint16_t type,
-                                                 uint16_t length,
-                                                 StunMessage* owner)
-    : StunAddressAttribute(type, length), owner_(owner) {
-}
-
-rtc::IPAddress StunXorAddressAttribute::GetXoredIP() const {
-  if (owner_) {
-    rtc::IPAddress ip = ipaddr();
-    switch (ip.family()) {
-      case AF_INET: {
-        in_addr v4addr = ip.ipv4_address();
-        v4addr.s_addr =
-            (v4addr.s_addr ^ rtc::HostToNetwork32(kStunMagicCookie));
-        return rtc::IPAddress(v4addr);
-      }
-      case AF_INET6: {
-        in6_addr v6addr = ip.ipv6_address();
-        const std::string& transaction_id = owner_->transaction_id();
-        if (transaction_id.length() == kStunTransactionIdLength) {
-          uint32_t transactionid_as_ints[3];
-          memcpy(&transactionid_as_ints[0], transaction_id.c_str(),
-                 transaction_id.length());
-          uint32_t* ip_as_ints = reinterpret_cast<uint32_t*>(&v6addr.s6_addr);
-          // Transaction ID is in network byte order, but magic cookie
-          // is stored in host byte order.
-          ip_as_ints[0] =
-              (ip_as_ints[0] ^ rtc::HostToNetwork32(kStunMagicCookie));
-          ip_as_ints[1] = (ip_as_ints[1] ^ transactionid_as_ints[0]);
-          ip_as_ints[2] = (ip_as_ints[2] ^ transactionid_as_ints[1]);
-          ip_as_ints[3] = (ip_as_ints[3] ^ transactionid_as_ints[2]);
-          return rtc::IPAddress(v6addr);
-        }
-        break;
-      }
-    }
-  }
-  // Invalid ip family or transaction ID, or missing owner.
-  // Return an AF_UNSPEC address.
-  return rtc::IPAddress();
-}
-
-bool StunXorAddressAttribute::Read(ByteBufferReader* buf) {
-  if (!StunAddressAttribute::Read(buf))
-    return false;
-  uint16_t xoredport = port() ^ (kStunMagicCookie >> 16);
-  rtc::IPAddress xored_ip = GetXoredIP();
-  SetAddress(rtc::SocketAddress(xored_ip, xoredport));
-  return true;
-}
-
-bool StunXorAddressAttribute::Write(ByteBufferWriter* buf) const {
-  StunAddressFamily address_family = family();
-  if (address_family == STUN_ADDRESS_UNDEF) {
-    LOG(LS_ERROR) << "Error writing xor-address attribute: unknown family.";
-    return false;
-  }
-  rtc::IPAddress xored_ip = GetXoredIP();
-  if (xored_ip.family() == AF_UNSPEC) {
-    return false;
-  }
-  buf->WriteUInt8(0);
-  buf->WriteUInt8(family());
-  buf->WriteUInt16(port() ^ (kStunMagicCookie >> 16));
-  switch (xored_ip.family()) {
-    case AF_INET: {
-      in_addr v4addr = xored_ip.ipv4_address();
-      buf->WriteBytes(reinterpret_cast<const char*>(&v4addr), sizeof(v4addr));
-      break;
-    }
-    case AF_INET6: {
-      in6_addr v6addr = xored_ip.ipv6_address();
-      buf->WriteBytes(reinterpret_cast<const char*>(&v6addr), sizeof(v6addr));
-      break;
-    }
-  }
-  return true;
-}
-
-StunUInt32Attribute::StunUInt32Attribute(uint16_t type, uint32_t value)
-    : StunAttribute(type, SIZE), bits_(value) {
-}
-
-StunUInt32Attribute::StunUInt32Attribute(uint16_t type)
-    : StunAttribute(type, SIZE), bits_(0) {
-}
-
-bool StunUInt32Attribute::GetBit(size_t index) const {
-  RTC_DCHECK(index < 32);
-  return static_cast<bool>((bits_ >> index) & 0x1);
-}
-
-void StunUInt32Attribute::SetBit(size_t index, bool value) {
-  RTC_DCHECK(index < 32);
-  bits_ &= ~(1 << index);
-  bits_ |= value ? (1 << index) : 0;
-}
-
-bool StunUInt32Attribute::Read(ByteBufferReader* buf) {
-  if (length() != SIZE || !buf->ReadUInt32(&bits_))
-    return false;
-  return true;
-}
-
-bool StunUInt32Attribute::Write(ByteBufferWriter* buf) const {
-  buf->WriteUInt32(bits_);
-  return true;
-}
-
-StunUInt64Attribute::StunUInt64Attribute(uint16_t type, uint64_t value)
-    : StunAttribute(type, SIZE), bits_(value) {
-}
-
-StunUInt64Attribute::StunUInt64Attribute(uint16_t type)
-    : StunAttribute(type, SIZE), bits_(0) {
-}
-
-bool StunUInt64Attribute::Read(ByteBufferReader* buf) {
-  if (length() != SIZE || !buf->ReadUInt64(&bits_))
-    return false;
-  return true;
-}
-
-bool StunUInt64Attribute::Write(ByteBufferWriter* buf) const {
-  buf->WriteUInt64(bits_);
-  return true;
-}
-
-StunByteStringAttribute::StunByteStringAttribute(uint16_t type)
-    : StunAttribute(type, 0), bytes_(NULL) {
-}
-
-StunByteStringAttribute::StunByteStringAttribute(uint16_t type,
-                                                 const std::string& str)
-    : StunAttribute(type, 0), bytes_(NULL) {
-  CopyBytes(str.c_str(), str.size());
-}
-
-StunByteStringAttribute::StunByteStringAttribute(uint16_t type,
-                                                 const void* bytes,
-                                                 size_t length)
-    : StunAttribute(type, 0), bytes_(NULL) {
-  CopyBytes(bytes, length);
-}
-
-StunByteStringAttribute::StunByteStringAttribute(uint16_t type, uint16_t length)
-    : StunAttribute(type, length), bytes_(NULL) {
-}
-
-StunByteStringAttribute::~StunByteStringAttribute() {
-  delete [] bytes_;
-}
-
-void StunByteStringAttribute::CopyBytes(const char* bytes) {
-  CopyBytes(bytes, strlen(bytes));
-}
-
-void StunByteStringAttribute::CopyBytes(const void* bytes, size_t length) {
-  char* new_bytes = new char[length];
-  memcpy(new_bytes, bytes, length);
-  SetBytes(new_bytes, length);
-}
-
-uint8_t StunByteStringAttribute::GetByte(size_t index) const {
-  RTC_DCHECK(bytes_ != NULL);
-  RTC_DCHECK(index < length());
-  return static_cast<uint8_t>(bytes_[index]);
-}
-
-void StunByteStringAttribute::SetByte(size_t index, uint8_t value) {
-  RTC_DCHECK(bytes_ != NULL);
-  RTC_DCHECK(index < length());
-  bytes_[index] = value;
-}
-
-bool StunByteStringAttribute::Read(ByteBufferReader* buf) {
-  bytes_ = new char[length()];
-  if (!buf->ReadBytes(bytes_, length())) {
-    return false;
-  }
-
-  ConsumePadding(buf);
-  return true;
-}
-
-bool StunByteStringAttribute::Write(ByteBufferWriter* buf) const {
-  buf->WriteBytes(bytes_, length());
-  WritePadding(buf);
-  return true;
-}
-
-void StunByteStringAttribute::SetBytes(char* bytes, size_t length) {
-  delete [] bytes_;
-  bytes_ = bytes;
-  SetLength(static_cast<uint16_t>(length));
-}
-
-const uint16_t StunErrorCodeAttribute::MIN_SIZE = 4;
-
-StunErrorCodeAttribute::StunErrorCodeAttribute(uint16_t type,
-                                               int code,
-                                               const std::string& reason)
-    : StunAttribute(type, 0) {
-  SetCode(code);
-  SetReason(reason);
-}
-
-StunErrorCodeAttribute::StunErrorCodeAttribute(uint16_t type, uint16_t length)
-    : StunAttribute(type, length), class_(0), number_(0) {
-}
-
-StunErrorCodeAttribute::~StunErrorCodeAttribute() {
-}
-
-int StunErrorCodeAttribute::code() const {
-  return class_ * 100 + number_;
-}
-
-void StunErrorCodeAttribute::SetCode(int code) {
-  class_ = static_cast<uint8_t>(code / 100);
-  number_ = static_cast<uint8_t>(code % 100);
-}
-
-void StunErrorCodeAttribute::SetReason(const std::string& reason) {
-  SetLength(MIN_SIZE + static_cast<uint16_t>(reason.size()));
-  reason_ = reason;
-}
-
-bool StunErrorCodeAttribute::Read(ByteBufferReader* buf) {
-  uint32_t val;
-  if (length() < MIN_SIZE || !buf->ReadUInt32(&val))
-    return false;
-
-  if ((val >> 11) != 0)
-    LOG(LS_ERROR) << "error-code bits not zero";
-
-  class_ = ((val >> 8) & 0x7);
-  number_ = (val & 0xff);
-
-  if (!buf->ReadString(&reason_, length() - 4))
-    return false;
-
-  ConsumePadding(buf);
-  return true;
-}
-
-bool StunErrorCodeAttribute::Write(ByteBufferWriter* buf) const {
-  buf->WriteUInt32(class_ << 8 | number_);
-  buf->WriteString(reason_);
-  WritePadding(buf);
-  return true;
-}
-
-StunUInt16ListAttribute::StunUInt16ListAttribute(uint16_t type, uint16_t length)
-    : StunAttribute(type, length) {
-  attr_types_ = new std::vector<uint16_t>();
-}
-
-StunUInt16ListAttribute::~StunUInt16ListAttribute() {
-  delete attr_types_;
-}
-
-size_t StunUInt16ListAttribute::Size() const {
-  return attr_types_->size();
-}
-
-uint16_t StunUInt16ListAttribute::GetType(int index) const {
-  return (*attr_types_)[index];
-}
-
-void StunUInt16ListAttribute::SetType(int index, uint16_t value) {
-  (*attr_types_)[index] = value;
-}
-
-void StunUInt16ListAttribute::AddType(uint16_t value) {
-  attr_types_->push_back(value);
-  SetLength(static_cast<uint16_t>(attr_types_->size() * 2));
-}
-
-bool StunUInt16ListAttribute::Read(ByteBufferReader* buf) {
-  if (length() % 2)
-    return false;
-
-  for (size_t i = 0; i < length() / 2; i++) {
-    uint16_t attr;
-    if (!buf->ReadUInt16(&attr))
-      return false;
-    attr_types_->push_back(attr);
-  }
-  // Padding of these attributes is done in RFC 5389 style. This is
-  // slightly different from RFC3489, but it shouldn't be important.
-  // RFC3489 pads out to a 32 bit boundary by duplicating one of the
-  // entries in the list (not necessarily the last one - it's unspecified).
-  // RFC5389 pads on the end, and the bytes are always ignored.
-  ConsumePadding(buf);
-  return true;
-}
-
-bool StunUInt16ListAttribute::Write(ByteBufferWriter* buf) const {
-  for (size_t i = 0; i < attr_types_->size(); ++i) {
-    buf->WriteUInt16((*attr_types_)[i]);
-  }
-  WritePadding(buf);
-  return true;
-}
-
-int GetStunSuccessResponseType(int req_type) {
-  return IsStunRequestType(req_type) ? (req_type | 0x100) : -1;
-}
-
-int GetStunErrorResponseType(int req_type) {
-  return IsStunRequestType(req_type) ? (req_type | 0x110) : -1;
-}
-
-bool IsStunRequestType(int msg_type) {
-  return ((msg_type & kStunTypeMask) == 0x000);
-}
-
-bool IsStunIndicationType(int msg_type) {
-  return ((msg_type & kStunTypeMask) == 0x010);
-}
-
-bool IsStunSuccessResponseType(int msg_type) {
-  return ((msg_type & kStunTypeMask) == 0x100);
-}
-
-bool IsStunErrorResponseType(int msg_type) {
-  return ((msg_type & kStunTypeMask) == 0x110);
-}
-
-bool ComputeStunCredentialHash(const std::string& username,
-                               const std::string& realm,
-                               const std::string& password,
-                               std::string* hash) {
-  // http://tools.ietf.org/html/rfc5389#section-15.4
-  // long-term credentials will be calculated using the key and key is
-  // key = MD5(username ":" realm ":" SASLprep(password))
-  std::string input = username;
-  input += ':';
-  input += realm;
-  input += ':';
-  input += password;
-
-  char digest[rtc::MessageDigest::kMaxSize];
-  size_t size = rtc::ComputeDigest(
-      rtc::DIGEST_MD5, input.c_str(), input.size(),
-      digest, sizeof(digest));
-  if (size == 0) {
-    return false;
-  }
-
-  *hash = std::string(digest, size);
-  return true;
-}
-
-}  // namespace cricket
diff --git a/p2p/base/stun.h b/p2p/base/stun.h
deleted file mode 100644
index 4a44dcb..0000000
--- a/p2p/base/stun.h
+++ /dev/null
@@ -1,644 +0,0 @@
-/*
- *  Copyright 2004 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_P2P_BASE_STUN_H_
-#define WEBRTC_P2P_BASE_STUN_H_
-
-// This file contains classes for dealing with the STUN protocol, as specified
-// in RFC 5389, and its descendants.
-
-#include <string>
-#include <vector>
-
-#include "webrtc/rtc_base/basictypes.h"
-#include "webrtc/rtc_base/bytebuffer.h"
-#include "webrtc/rtc_base/socketaddress.h"
-
-namespace cricket {
-
-// These are the types of STUN messages defined in RFC 5389.
-enum StunMessageType {
-  STUN_BINDING_REQUEST                  = 0x0001,
-  STUN_BINDING_INDICATION               = 0x0011,
-  STUN_BINDING_RESPONSE                 = 0x0101,
-  STUN_BINDING_ERROR_RESPONSE           = 0x0111,
-};
-
-// These are all known STUN attributes, defined in RFC 5389 and elsewhere.
-// Next to each is the name of the class (T is StunTAttribute) that implements
-// that type.
-// RETRANSMIT_COUNT is the number of outstanding pings without a response at
-// the time the packet is generated.
-enum StunAttributeType {
-  STUN_ATTR_MAPPED_ADDRESS              = 0x0001,  // Address
-  STUN_ATTR_USERNAME                    = 0x0006,  // ByteString
-  STUN_ATTR_MESSAGE_INTEGRITY           = 0x0008,  // ByteString, 20 bytes
-  STUN_ATTR_ERROR_CODE                  = 0x0009,  // ErrorCode
-  STUN_ATTR_UNKNOWN_ATTRIBUTES          = 0x000a,  // UInt16List
-  STUN_ATTR_REALM                       = 0x0014,  // ByteString
-  STUN_ATTR_NONCE                       = 0x0015,  // ByteString
-  STUN_ATTR_XOR_MAPPED_ADDRESS          = 0x0020,  // XorAddress
-  STUN_ATTR_SOFTWARE                    = 0x8022,  // ByteString
-  STUN_ATTR_ALTERNATE_SERVER            = 0x8023,  // Address
-  STUN_ATTR_FINGERPRINT                 = 0x8028,  // UInt32
-  STUN_ATTR_ORIGIN                      = 0x802F,  // ByteString
-  STUN_ATTR_RETRANSMIT_COUNT            = 0xFF00   // UInt32
-};
-
-// These are the types of the values associated with the attributes above.
-// This allows us to perform some basic validation when reading or adding
-// attributes. Note that these values are for our own use, and not defined in
-// RFC 5389.
-enum StunAttributeValueType {
-  STUN_VALUE_UNKNOWN                    = 0,
-  STUN_VALUE_ADDRESS                    = 1,
-  STUN_VALUE_XOR_ADDRESS                = 2,
-  STUN_VALUE_UINT32                     = 3,
-  STUN_VALUE_UINT64                     = 4,
-  STUN_VALUE_BYTE_STRING                = 5,
-  STUN_VALUE_ERROR_CODE                 = 6,
-  STUN_VALUE_UINT16_LIST                = 7
-};
-
-// These are the types of STUN addresses defined in RFC 5389.
-enum StunAddressFamily {
-  // NB: UNDEF is not part of the STUN spec.
-  STUN_ADDRESS_UNDEF                    = 0,
-  STUN_ADDRESS_IPV4                     = 1,
-  STUN_ADDRESS_IPV6                     = 2
-};
-
-// These are the types of STUN error codes defined in RFC 5389.
-enum StunErrorCode {
-  STUN_ERROR_TRY_ALTERNATE              = 300,
-  STUN_ERROR_BAD_REQUEST                = 400,
-  STUN_ERROR_UNAUTHORIZED               = 401,
-  STUN_ERROR_UNKNOWN_ATTRIBUTE          = 420,
-  STUN_ERROR_STALE_CREDENTIALS          = 430,  // GICE only
-  STUN_ERROR_STALE_NONCE                = 438,
-  STUN_ERROR_SERVER_ERROR               = 500,
-  STUN_ERROR_GLOBAL_FAILURE             = 600
-};
-
-// Strings for the error codes above.
-extern const char STUN_ERROR_REASON_TRY_ALTERNATE_SERVER[];
-extern const char STUN_ERROR_REASON_BAD_REQUEST[];
-extern const char STUN_ERROR_REASON_UNAUTHORIZED[];
-extern const char STUN_ERROR_REASON_UNKNOWN_ATTRIBUTE[];
-extern const char STUN_ERROR_REASON_STALE_CREDENTIALS[];
-extern const char STUN_ERROR_REASON_STALE_NONCE[];
-extern const char STUN_ERROR_REASON_SERVER_ERROR[];
-
-// The mask used to determine whether a STUN message is a request/response etc.
-const uint32_t kStunTypeMask = 0x0110;
-
-// STUN Attribute header length.
-const size_t kStunAttributeHeaderSize = 4;
-
-// Following values correspond to RFC5389.
-const size_t kStunHeaderSize = 20;
-const size_t kStunTransactionIdOffset = 8;
-const size_t kStunTransactionIdLength = 12;
-const uint32_t kStunMagicCookie = 0x2112A442;
-const size_t kStunMagicCookieLength = sizeof(kStunMagicCookie);
-
-// Following value corresponds to an earlier version of STUN from
-// RFC3489.
-const size_t kStunLegacyTransactionIdLength = 16;
-
-// STUN Message Integrity HMAC length.
-const size_t kStunMessageIntegritySize = 20;
-
-class StunAttribute;
-class StunAddressAttribute;
-class StunXorAddressAttribute;
-class StunUInt32Attribute;
-class StunUInt64Attribute;
-class StunByteStringAttribute;
-class StunErrorCodeAttribute;
-class StunUInt16ListAttribute;
-
-// Records a complete STUN/TURN message.  Each message consists of a type and
-// any number of attributes.  Each attribute is parsed into an instance of an
-// appropriate class (see above).  The Get* methods will return instances of
-// that attribute class.
-class StunMessage {
- public:
-  StunMessage();
-  virtual ~StunMessage() = default;
-
-  int type() const { return type_; }
-  size_t length() const { return length_; }
-  const std::string& transaction_id() const { return transaction_id_; }
-
-  // Returns true if the message confirms to RFC3489 rather than
-  // RFC5389. The main difference between two version of the STUN
-  // protocol is the presence of the magic cookie and different length
-  // of transaction ID. For outgoing packets version of the protocol
-  // is determined by the lengths of the transaction ID.
-  bool IsLegacy() const;
-
-  void SetType(int type) { type_ = static_cast<uint16_t>(type); }
-  bool SetTransactionID(const std::string& str);
-
-  // Gets the desired attribute value, or NULL if no such attribute type exists.
-  const StunAddressAttribute* GetAddress(int type) const;
-  const StunUInt32Attribute* GetUInt32(int type) const;
-  const StunUInt64Attribute* GetUInt64(int type) const;
-  const StunByteStringAttribute* GetByteString(int type) const;
-
-  // Gets these specific attribute values.
-  const StunErrorCodeAttribute* GetErrorCode() const;
-  // Returns the code inside the error code attribute, if present, and
-  // STUN_ERROR_GLOBAL_FAILURE otherwise.
-  int GetErrorCodeValue() const;
-  const StunUInt16ListAttribute* GetUnknownAttributes() const;
-
-  // Takes ownership of the specified attribute and adds it to the message.
-  void AddAttribute(std::unique_ptr<StunAttribute> attr);
-
-  // Validates that a raw STUN message has a correct MESSAGE-INTEGRITY value.
-  // This can't currently be done on a StunMessage, since it is affected by
-  // padding data (which we discard when reading a StunMessage).
-  static bool ValidateMessageIntegrity(const char* data, size_t size,
-                                       const std::string& password);
-  // Adds a MESSAGE-INTEGRITY attribute that is valid for the current message.
-  bool AddMessageIntegrity(const std::string& password);
-  bool AddMessageIntegrity(const char* key, size_t keylen);
-
-  // Verifies that a given buffer is STUN by checking for a correct FINGERPRINT.
-  static bool ValidateFingerprint(const char* data, size_t size);
-
-  // Adds a FINGERPRINT attribute that is valid for the current message.
-  bool AddFingerprint();
-
-  // Parses the STUN packet in the given buffer and records it here. The
-  // return value indicates whether this was successful.
-  bool Read(rtc::ByteBufferReader* buf);
-
-  // Writes this object into a STUN packet. The return value indicates whether
-  // this was successful.
-  bool Write(rtc::ByteBufferWriter* buf) const;
-
-  // Creates an empty message. Overridable by derived classes.
-  virtual StunMessage* CreateNew() const { return new StunMessage(); }
-
- protected:
-  // Verifies that the given attribute is allowed for this message.
-  virtual StunAttributeValueType GetAttributeValueType(int type) const;
-
- private:
-  StunAttribute* CreateAttribute(int type, size_t length) /* const*/;
-  const StunAttribute* GetAttribute(int type) const;
-  static bool IsValidTransactionId(const std::string& transaction_id);
-
-  uint16_t type_;
-  uint16_t length_;
-  std::string transaction_id_;
-  std::vector<std::unique_ptr<StunAttribute>> attrs_;
-};
-
-// Base class for all STUN/TURN attributes.
-class StunAttribute {
- public:
-  virtual ~StunAttribute() {
-  }
-
-  int type() const { return type_; }
-  size_t length() const { return length_; }
-
-  // Return the type of this attribute.
-  virtual StunAttributeValueType value_type() const = 0;
-
-  // Only XorAddressAttribute needs this so far.
-  virtual void SetOwner(StunMessage* owner) {}
-
-  // Reads the body (not the type or length) for this type of attribute from
-  // the given buffer.  Return value is true if successful.
-  virtual bool Read(rtc::ByteBufferReader* buf) = 0;
-
-  // Writes the body (not the type or length) to the given buffer.  Return
-  // value is true if successful.
-  virtual bool Write(rtc::ByteBufferWriter* buf) const = 0;
-
-  // Creates an attribute object with the given type and smallest length.
-  static StunAttribute* Create(StunAttributeValueType value_type,
-                               uint16_t type,
-                               uint16_t length,
-                               StunMessage* owner);
-  // TODO: Allow these create functions to take parameters, to reduce
-  // the amount of work callers need to do to initialize attributes.
-  static std::unique_ptr<StunAddressAttribute> CreateAddress(uint16_t type);
-  static std::unique_ptr<StunXorAddressAttribute> CreateXorAddress(
-      uint16_t type);
-  static std::unique_ptr<StunUInt32Attribute> CreateUInt32(uint16_t type);
-  static std::unique_ptr<StunUInt64Attribute> CreateUInt64(uint16_t type);
-  static std::unique_ptr<StunByteStringAttribute> CreateByteString(
-      uint16_t type);
-  static std::unique_ptr<StunErrorCodeAttribute> CreateErrorCode();
-  static std::unique_ptr<StunUInt16ListAttribute> CreateUnknownAttributes();
-
- protected:
-  StunAttribute(uint16_t type, uint16_t length);
-  void SetLength(uint16_t length) { length_ = length; }
-  void WritePadding(rtc::ByteBufferWriter* buf) const;
-  void ConsumePadding(rtc::ByteBufferReader* buf) const;
-
- private:
-  uint16_t type_;
-  uint16_t length_;
-};
-
-// Implements STUN attributes that record an Internet address.
-class StunAddressAttribute : public StunAttribute {
- public:
-  static const uint16_t SIZE_UNDEF = 0;
-  static const uint16_t SIZE_IP4 = 8;
-  static const uint16_t SIZE_IP6 = 20;
-  StunAddressAttribute(uint16_t type, const rtc::SocketAddress& addr);
-  StunAddressAttribute(uint16_t type, uint16_t length);
-
-  virtual StunAttributeValueType value_type() const {
-    return STUN_VALUE_ADDRESS;
-  }
-
-  StunAddressFamily family() const {
-    switch (address_.ipaddr().family()) {
-      case AF_INET:
-        return STUN_ADDRESS_IPV4;
-      case AF_INET6:
-        return STUN_ADDRESS_IPV6;
-    }
-    return STUN_ADDRESS_UNDEF;
-  }
-
-  const rtc::SocketAddress& GetAddress() const { return address_; }
-  const rtc::IPAddress& ipaddr() const { return address_.ipaddr(); }
-  uint16_t port() const { return address_.port(); }
-
-  void SetAddress(const rtc::SocketAddress& addr) {
-    address_ = addr;
-    EnsureAddressLength();
-  }
-  void SetIP(const rtc::IPAddress& ip) {
-    address_.SetIP(ip);
-    EnsureAddressLength();
-  }
-  void SetPort(uint16_t port) { address_.SetPort(port); }
-
-  virtual bool Read(rtc::ByteBufferReader* buf);
-  virtual bool Write(rtc::ByteBufferWriter* buf) const;
-
- private:
-  void EnsureAddressLength() {
-    switch (family()) {
-      case STUN_ADDRESS_IPV4: {
-        SetLength(SIZE_IP4);
-        break;
-      }
-      case STUN_ADDRESS_IPV6: {
-        SetLength(SIZE_IP6);
-        break;
-      }
-      default: {
-        SetLength(SIZE_UNDEF);
-        break;
-      }
-    }
-  }
-  rtc::SocketAddress address_;
-};
-
-// Implements STUN attributes that record an Internet address. When encoded
-// in a STUN message, the address contained in this attribute is XORed with the
-// transaction ID of the message.
-class StunXorAddressAttribute : public StunAddressAttribute {
- public:
-  StunXorAddressAttribute(uint16_t type, const rtc::SocketAddress& addr);
-  StunXorAddressAttribute(uint16_t type, uint16_t length, StunMessage* owner);
-
-  virtual StunAttributeValueType value_type() const {
-    return STUN_VALUE_XOR_ADDRESS;
-  }
-  virtual void SetOwner(StunMessage* owner) {
-    owner_ = owner;
-  }
-  virtual bool Read(rtc::ByteBufferReader* buf);
-  virtual bool Write(rtc::ByteBufferWriter* buf) const;
-
- private:
-  rtc::IPAddress GetXoredIP() const;
-  StunMessage* owner_;
-};
-
-// Implements STUN attributes that record a 32-bit integer.
-class StunUInt32Attribute : public StunAttribute {
- public:
-  static const uint16_t SIZE = 4;
-  StunUInt32Attribute(uint16_t type, uint32_t value);
-  explicit StunUInt32Attribute(uint16_t type);
-
-  virtual StunAttributeValueType value_type() const {
-    return STUN_VALUE_UINT32;
-  }
-
-  uint32_t value() const { return bits_; }
-  void SetValue(uint32_t bits) { bits_ = bits; }
-
-  bool GetBit(size_t index) const;
-  void SetBit(size_t index, bool value);
-
-  virtual bool Read(rtc::ByteBufferReader* buf);
-  virtual bool Write(rtc::ByteBufferWriter* buf) const;
-
- private:
-  uint32_t bits_;
-};
-
-class StunUInt64Attribute : public StunAttribute {
- public:
-  static const uint16_t SIZE = 8;
-  StunUInt64Attribute(uint16_t type, uint64_t value);
-  explicit StunUInt64Attribute(uint16_t type);
-
-  virtual StunAttributeValueType value_type() const {
-    return STUN_VALUE_UINT64;
-  }
-
-  uint64_t value() const { return bits_; }
-  void SetValue(uint64_t bits) { bits_ = bits; }
-
-  virtual bool Read(rtc::ByteBufferReader* buf);
-  virtual bool Write(rtc::ByteBufferWriter* buf) const;
-
- private:
-  uint64_t bits_;
-};
-
-// Implements STUN attributes that record an arbitrary byte string.
-class StunByteStringAttribute : public StunAttribute {
- public:
-  explicit StunByteStringAttribute(uint16_t type);
-  StunByteStringAttribute(uint16_t type, const std::string& str);
-  StunByteStringAttribute(uint16_t type, const void* bytes, size_t length);
-  StunByteStringAttribute(uint16_t type, uint16_t length);
-  ~StunByteStringAttribute();
-
-  virtual StunAttributeValueType value_type() const {
-    return STUN_VALUE_BYTE_STRING;
-  }
-
-  const char* bytes() const { return bytes_; }
-  std::string GetString() const { return std::string(bytes_, length()); }
-
-  void CopyBytes(const char* bytes);  // uses strlen
-  void CopyBytes(const void* bytes, size_t length);
-
-  uint8_t GetByte(size_t index) const;
-  void SetByte(size_t index, uint8_t value);
-
-  virtual bool Read(rtc::ByteBufferReader* buf);
-  virtual bool Write(rtc::ByteBufferWriter* buf) const;
-
- private:
-  void SetBytes(char* bytes, size_t length);
-
-  char* bytes_;
-};
-
-// Implements STUN attributes that record an error code.
-class StunErrorCodeAttribute : public StunAttribute {
- public:
-  static const uint16_t MIN_SIZE;
-  StunErrorCodeAttribute(uint16_t type, int code, const std::string& reason);
-  StunErrorCodeAttribute(uint16_t type, uint16_t length);
-  ~StunErrorCodeAttribute();
-
-  virtual StunAttributeValueType value_type() const {
-    return STUN_VALUE_ERROR_CODE;
-  }
-
-  // The combined error and class, e.g. 0x400.
-  int code() const;
-  void SetCode(int code);
-
-  // The individual error components.
-  int eclass() const { return class_; }
-  int number() const { return number_; }
-  const std::string& reason() const { return reason_; }
-  void SetClass(uint8_t eclass) { class_ = eclass; }
-  void SetNumber(uint8_t number) { number_ = number; }
-  void SetReason(const std::string& reason);
-
-  bool Read(rtc::ByteBufferReader* buf);
-  bool Write(rtc::ByteBufferWriter* buf) const;
-
- private:
-  uint8_t class_;
-  uint8_t number_;
-  std::string reason_;
-};
-
-// Implements STUN attributes that record a list of attribute names.
-class StunUInt16ListAttribute : public StunAttribute {
- public:
-  StunUInt16ListAttribute(uint16_t type, uint16_t length);
-  ~StunUInt16ListAttribute();
-
-  virtual StunAttributeValueType value_type() const {
-    return STUN_VALUE_UINT16_LIST;
-  }
-
-  size_t Size() const;
-  uint16_t GetType(int index) const;
-  void SetType(int index, uint16_t value);
-  void AddType(uint16_t value);
-
-  bool Read(rtc::ByteBufferReader* buf);
-  bool Write(rtc::ByteBufferWriter* buf) const;
-
- private:
-  std::vector<uint16_t>* attr_types_;
-};
-
-// Returns the (successful) response type for the given request type.
-// Returns -1 if |request_type| is not a valid request type.
-int GetStunSuccessResponseType(int request_type);
-
-// Returns the error response type for the given request type.
-// Returns -1 if |request_type| is not a valid request type.
-int GetStunErrorResponseType(int request_type);
-
-// Returns whether a given message is a request type.
-bool IsStunRequestType(int msg_type);
-
-// Returns whether a given message is an indication type.
-bool IsStunIndicationType(int msg_type);
-
-// Returns whether a given response is a success type.
-bool IsStunSuccessResponseType(int msg_type);
-
-// Returns whether a given response is an error type.
-bool IsStunErrorResponseType(int msg_type);
-
-// Computes the STUN long-term credential hash.
-bool ComputeStunCredentialHash(const std::string& username,
-    const std::string& realm, const std::string& password, std::string* hash);
-
-// TODO: Move the TURN/ICE stuff below out to separate files.
-extern const char TURN_MAGIC_COOKIE_VALUE[4];
-
-// "GTURN" STUN methods.
-// TODO: Rename these methods to GTURN_ to make it clear they aren't
-// part of standard STUN/TURN.
-enum RelayMessageType {
-  // For now, using the same defs from TurnMessageType below.
-  // STUN_ALLOCATE_REQUEST              = 0x0003,
-  // STUN_ALLOCATE_RESPONSE             = 0x0103,
-  // STUN_ALLOCATE_ERROR_RESPONSE       = 0x0113,
-  STUN_SEND_REQUEST                     = 0x0004,
-  STUN_SEND_RESPONSE                    = 0x0104,
-  STUN_SEND_ERROR_RESPONSE              = 0x0114,
-  STUN_DATA_INDICATION                  = 0x0115,
-};
-
-// "GTURN"-specific STUN attributes.
-// TODO: Rename these attributes to GTURN_ to avoid conflicts.
-enum RelayAttributeType {
-  STUN_ATTR_LIFETIME                    = 0x000d,  // UInt32
-  STUN_ATTR_MAGIC_COOKIE                = 0x000f,  // ByteString, 4 bytes
-  STUN_ATTR_BANDWIDTH                   = 0x0010,  // UInt32
-  STUN_ATTR_DESTINATION_ADDRESS         = 0x0011,  // Address
-  STUN_ATTR_SOURCE_ADDRESS2             = 0x0012,  // Address
-  STUN_ATTR_DATA                        = 0x0013,  // ByteString
-  STUN_ATTR_OPTIONS                     = 0x8001,  // UInt32
-};
-
-// A "GTURN" STUN message.
-class RelayMessage : public StunMessage {
- protected:
-  virtual StunAttributeValueType GetAttributeValueType(int type) const {
-    switch (type) {
-      case STUN_ATTR_LIFETIME:            return STUN_VALUE_UINT32;
-      case STUN_ATTR_MAGIC_COOKIE:        return STUN_VALUE_BYTE_STRING;
-      case STUN_ATTR_BANDWIDTH:           return STUN_VALUE_UINT32;
-      case STUN_ATTR_DESTINATION_ADDRESS: return STUN_VALUE_ADDRESS;
-      case STUN_ATTR_SOURCE_ADDRESS2:     return STUN_VALUE_ADDRESS;
-      case STUN_ATTR_DATA:                return STUN_VALUE_BYTE_STRING;
-      case STUN_ATTR_OPTIONS:             return STUN_VALUE_UINT32;
-      default: return StunMessage::GetAttributeValueType(type);
-    }
-  }
-  virtual StunMessage* CreateNew() const { return new RelayMessage(); }
-};
-
-// Defined in TURN RFC 5766.
-enum TurnMessageType {
-  STUN_ALLOCATE_REQUEST                 = 0x0003,
-  STUN_ALLOCATE_RESPONSE                = 0x0103,
-  STUN_ALLOCATE_ERROR_RESPONSE          = 0x0113,
-  TURN_REFRESH_REQUEST                  = 0x0004,
-  TURN_REFRESH_RESPONSE                 = 0x0104,
-  TURN_REFRESH_ERROR_RESPONSE           = 0x0114,
-  TURN_SEND_INDICATION                  = 0x0016,
-  TURN_DATA_INDICATION                  = 0x0017,
-  TURN_CREATE_PERMISSION_REQUEST        = 0x0008,
-  TURN_CREATE_PERMISSION_RESPONSE       = 0x0108,
-  TURN_CREATE_PERMISSION_ERROR_RESPONSE = 0x0118,
-  TURN_CHANNEL_BIND_REQUEST             = 0x0009,
-  TURN_CHANNEL_BIND_RESPONSE            = 0x0109,
-  TURN_CHANNEL_BIND_ERROR_RESPONSE      = 0x0119,
-};
-
-enum TurnAttributeType {
-  STUN_ATTR_CHANNEL_NUMBER              = 0x000C,  // UInt32
-  STUN_ATTR_TURN_LIFETIME               = 0x000d,  // UInt32
-  STUN_ATTR_XOR_PEER_ADDRESS            = 0x0012,  // XorAddress
-  // TODO(mallinath) - Uncomment after RelayAttributes are renamed.
-  // STUN_ATTR_DATA                     = 0x0013,  // ByteString
-  STUN_ATTR_XOR_RELAYED_ADDRESS         = 0x0016,  // XorAddress
-  STUN_ATTR_EVEN_PORT                   = 0x0018,  // ByteString, 1 byte.
-  STUN_ATTR_REQUESTED_TRANSPORT         = 0x0019,  // UInt32
-  STUN_ATTR_DONT_FRAGMENT               = 0x001A,  // No content, Length = 0
-  STUN_ATTR_RESERVATION_TOKEN           = 0x0022,  // ByteString, 8 bytes.
-  // TODO(mallinath) - Rename STUN_ATTR_TURN_LIFETIME to STUN_ATTR_LIFETIME and
-  // STUN_ATTR_TURN_DATA to STUN_ATTR_DATA. Also rename RelayMessage attributes
-  // by appending G to attribute name.
-};
-
-// RFC 5766-defined errors.
-enum TurnErrorType {
-  STUN_ERROR_FORBIDDEN                  = 403,
-  STUN_ERROR_ALLOCATION_MISMATCH        = 437,
-  STUN_ERROR_WRONG_CREDENTIALS          = 441,
-  STUN_ERROR_UNSUPPORTED_PROTOCOL       = 442
-};
-extern const char STUN_ERROR_REASON_FORBIDDEN[];
-extern const char STUN_ERROR_REASON_ALLOCATION_MISMATCH[];
-extern const char STUN_ERROR_REASON_WRONG_CREDENTIALS[];
-extern const char STUN_ERROR_REASON_UNSUPPORTED_PROTOCOL[];
-class TurnMessage : public StunMessage {
- protected:
-  virtual StunAttributeValueType GetAttributeValueType(int type) const {
-    switch (type) {
-      case STUN_ATTR_CHANNEL_NUMBER:      return STUN_VALUE_UINT32;
-      case STUN_ATTR_TURN_LIFETIME:       return STUN_VALUE_UINT32;
-      case STUN_ATTR_XOR_PEER_ADDRESS:    return STUN_VALUE_XOR_ADDRESS;
-      case STUN_ATTR_DATA:                return STUN_VALUE_BYTE_STRING;
-      case STUN_ATTR_XOR_RELAYED_ADDRESS: return STUN_VALUE_XOR_ADDRESS;
-      case STUN_ATTR_EVEN_PORT:           return STUN_VALUE_BYTE_STRING;
-      case STUN_ATTR_REQUESTED_TRANSPORT: return STUN_VALUE_UINT32;
-      case STUN_ATTR_DONT_FRAGMENT:       return STUN_VALUE_BYTE_STRING;
-      case STUN_ATTR_RESERVATION_TOKEN:   return STUN_VALUE_BYTE_STRING;
-      default: return StunMessage::GetAttributeValueType(type);
-    }
-  }
-  virtual StunMessage* CreateNew() const { return new TurnMessage(); }
-};
-
-// RFC 5245 ICE STUN attributes.
-enum IceAttributeType {
-  STUN_ATTR_PRIORITY = 0x0024,         // UInt32
-  STUN_ATTR_USE_CANDIDATE = 0x0025,    // No content, Length = 0
-  STUN_ATTR_ICE_CONTROLLED = 0x8029,   // UInt64
-  STUN_ATTR_ICE_CONTROLLING = 0x802A,  // UInt64
-  STUN_ATTR_NOMINATION = 0xC001,       // UInt32
-  // UInt32. The higher 16 bits are the network ID. The lower 16 bits are the
-  // network cost.
-  STUN_ATTR_NETWORK_INFO = 0xC057
-};
-
-// RFC 5245-defined errors.
-enum IceErrorCode {
-  STUN_ERROR_ROLE_CONFLICT              = 487,
-};
-extern const char STUN_ERROR_REASON_ROLE_CONFLICT[];
-
-// A RFC 5245 ICE STUN message.
-class IceMessage : public StunMessage {
- protected:
-  virtual StunAttributeValueType GetAttributeValueType(int type) const {
-    switch (type) {
-      case STUN_ATTR_PRIORITY:
-      case STUN_ATTR_NETWORK_INFO:
-      case STUN_ATTR_NOMINATION:
-        return STUN_VALUE_UINT32;
-      case STUN_ATTR_USE_CANDIDATE:   return STUN_VALUE_BYTE_STRING;
-      case STUN_ATTR_ICE_CONTROLLED:  return STUN_VALUE_UINT64;
-      case STUN_ATTR_ICE_CONTROLLING: return STUN_VALUE_UINT64;
-      default: return StunMessage::GetAttributeValueType(type);
-    }
-  }
-  virtual StunMessage* CreateNew() const { return new IceMessage(); }
-};
-
-}  // namespace cricket
-
-#endif  // WEBRTC_P2P_BASE_STUN_H_
diff --git a/p2p/base/stun_unittest.cc b/p2p/base/stun_unittest.cc
deleted file mode 100644
index ef387a1..0000000
--- a/p2p/base/stun_unittest.cc
+++ /dev/null
@@ -1,1482 +0,0 @@
-/*
- *  Copyright 2004 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 <string>
-
-#include "webrtc/p2p/base/stun.h"
-#include "webrtc/rtc_base/arraysize.h"
-#include "webrtc/rtc_base/bytebuffer.h"
-#include "webrtc/rtc_base/gunit.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/messagedigest.h"
-#include "webrtc/rtc_base/ptr_util.h"
-#include "webrtc/rtc_base/socketaddress.h"
-
-namespace cricket {
-
-class StunTest : public ::testing::Test {
- protected:
-  void CheckStunHeader(const StunMessage& msg, StunMessageType expected_type,
-                       size_t expected_length) {
-    ASSERT_EQ(expected_type, msg.type());
-    ASSERT_EQ(expected_length, msg.length());
-  }
-
-  void CheckStunTransactionID(const StunMessage& msg,
-                              const unsigned char* expectedID, size_t length) {
-    ASSERT_EQ(length, msg.transaction_id().size());
-    ASSERT_EQ(length == kStunTransactionIdLength + 4, msg.IsLegacy());
-    ASSERT_EQ(length == kStunTransactionIdLength, !msg.IsLegacy());
-    ASSERT_EQ(0, memcmp(msg.transaction_id().c_str(), expectedID, length));
-  }
-
-  void CheckStunAddressAttribute(const StunAddressAttribute* addr,
-                                 StunAddressFamily expected_family,
-                                 int expected_port,
-                                 rtc::IPAddress expected_address) {
-    ASSERT_EQ(expected_family, addr->family());
-    ASSERT_EQ(expected_port, addr->port());
-
-    if (addr->family() == STUN_ADDRESS_IPV4) {
-      in_addr v4_address = expected_address.ipv4_address();
-      in_addr stun_address = addr->ipaddr().ipv4_address();
-      ASSERT_EQ(0, memcmp(&v4_address, &stun_address, sizeof(stun_address)));
-    } else if (addr->family() == STUN_ADDRESS_IPV6) {
-      in6_addr v6_address = expected_address.ipv6_address();
-      in6_addr stun_address = addr->ipaddr().ipv6_address();
-      ASSERT_EQ(0, memcmp(&v6_address, &stun_address, sizeof(stun_address)));
-    } else {
-      ASSERT_TRUE(addr->family() == STUN_ADDRESS_IPV6 ||
-                  addr->family() == STUN_ADDRESS_IPV4);
-    }
-  }
-
-  size_t ReadStunMessageTestCase(StunMessage* msg,
-                                 const unsigned char* testcase,
-                                 size_t size) {
-    const char* input = reinterpret_cast<const char*>(testcase);
-    rtc::ByteBufferReader buf(input, size);
-    if (msg->Read(&buf)) {
-      // Returns the size the stun message should report itself as being
-      return (size - 20);
-    } else {
-      return 0;
-    }
-  }
-};
-
-
-// Sample STUN packets with various attributes
-// Gathered by wiresharking pjproject's pjnath test programs
-// pjproject available at www.pjsip.org
-
-static const unsigned char kStunMessageWithIPv6MappedAddress[] = {
-  0x00, 0x01, 0x00, 0x18,  // message header
-  0x21, 0x12, 0xa4, 0x42,  // transaction id
-  0x29, 0x1f, 0xcd, 0x7c,
-  0xba, 0x58, 0xab, 0xd7,
-  0xf2, 0x41, 0x01, 0x00,
-  0x00, 0x01, 0x00, 0x14,  // Address type (mapped), length
-  0x00, 0x02, 0xb8, 0x81,  // family (IPv6), port
-  0x24, 0x01, 0xfa, 0x00,  // an IPv6 address
-  0x00, 0x04, 0x10, 0x00,
-  0xbe, 0x30, 0x5b, 0xff,
-  0xfe, 0xe5, 0x00, 0xc3
-};
-
-static const unsigned char kStunMessageWithIPv4MappedAddress[] = {
-  0x01, 0x01, 0x00, 0x0c,   // binding response, length 12
-  0x21, 0x12, 0xa4, 0x42,   // magic cookie
-  0x29, 0x1f, 0xcd, 0x7c,   // transaction ID
-  0xba, 0x58, 0xab, 0xd7,
-  0xf2, 0x41, 0x01, 0x00,
-  0x00, 0x01, 0x00, 0x08,  // Mapped, 8 byte length
-  0x00, 0x01, 0x9d, 0xfc,  // AF_INET, unxor-ed port
-  0xac, 0x17, 0x44, 0xe6   // IPv4 address
-};
-
-// Test XOR-mapped IP addresses:
-static const unsigned char kStunMessageWithIPv6XorMappedAddress[] = {
-  0x01, 0x01, 0x00, 0x18,  // message header (binding response)
-  0x21, 0x12, 0xa4, 0x42,  // magic cookie (rfc5389)
-  0xe3, 0xa9, 0x46, 0xe1,  // transaction ID
-  0x7c, 0x00, 0xc2, 0x62,
-  0x54, 0x08, 0x01, 0x00,
-  0x00, 0x20, 0x00, 0x14,  // Address Type (XOR), length
-  0x00, 0x02, 0xcb, 0x5b,  // family, XOR-ed port
-  0x05, 0x13, 0x5e, 0x42,  // XOR-ed IPv6 address
-  0xe3, 0xad, 0x56, 0xe1,
-  0xc2, 0x30, 0x99, 0x9d,
-  0xaa, 0xed, 0x01, 0xc3
-};
-
-static const unsigned char kStunMessageWithIPv4XorMappedAddress[] = {
-  0x01, 0x01, 0x00, 0x0c,  // message header (binding response)
-  0x21, 0x12, 0xa4, 0x42,  // magic cookie
-  0x29, 0x1f, 0xcd, 0x7c,  // transaction ID
-  0xba, 0x58, 0xab, 0xd7,
-  0xf2, 0x41, 0x01, 0x00,
-  0x00, 0x20, 0x00, 0x08,  // address type (xor), length
-  0x00, 0x01, 0xfc, 0xb5,  // family (AF_INET), XOR-ed port
-  0x8d, 0x05, 0xe0, 0xa4   // IPv4 address
-};
-
-// ByteString Attribute (username)
-static const unsigned char kStunMessageWithByteStringAttribute[] = {
-  0x00, 0x01, 0x00, 0x0c,
-  0x21, 0x12, 0xa4, 0x42,
-  0xe3, 0xa9, 0x46, 0xe1,
-  0x7c, 0x00, 0xc2, 0x62,
-  0x54, 0x08, 0x01, 0x00,
-  0x00, 0x06, 0x00, 0x08,  // username attribute (length 8)
-  0x61, 0x62, 0x63, 0x64,  // abcdefgh
-  0x65, 0x66, 0x67, 0x68
-};
-
-// Message with an unknown but comprehensible optional attribute.
-// Parsing should succeed despite this unknown attribute.
-static const unsigned char kStunMessageWithUnknownAttribute[] = {
-  0x00, 0x01, 0x00, 0x14,
-  0x21, 0x12, 0xa4, 0x42,
-  0xe3, 0xa9, 0x46, 0xe1,
-  0x7c, 0x00, 0xc2, 0x62,
-  0x54, 0x08, 0x01, 0x00,
-  0x00, 0xaa, 0x00, 0x07,  // Unknown attribute, length 7 (needs padding!)
-  0x61, 0x62, 0x63, 0x64,  // abcdefg + padding
-  0x65, 0x66, 0x67, 0x00,
-  0x00, 0x06, 0x00, 0x03,  // Followed by a known attribute we can
-  0x61, 0x62, 0x63, 0x00   // check for (username of length 3)
-};
-
-// ByteString Attribute (username) with padding byte
-static const unsigned char kStunMessageWithPaddedByteStringAttribute[] = {
-  0x00, 0x01, 0x00, 0x08,
-  0x21, 0x12, 0xa4, 0x42,
-  0xe3, 0xa9, 0x46, 0xe1,
-  0x7c, 0x00, 0xc2, 0x62,
-  0x54, 0x08, 0x01, 0x00,
-  0x00, 0x06, 0x00, 0x03,  // username attribute (length 3)
-  0x61, 0x62, 0x63, 0xcc   // abc
-};
-
-// Message with an Unknown Attributes (uint16_t list) attribute.
-static const unsigned char kStunMessageWithUInt16ListAttribute[] = {
-  0x00, 0x01, 0x00, 0x0c,
-  0x21, 0x12, 0xa4, 0x42,
-  0xe3, 0xa9, 0x46, 0xe1,
-  0x7c, 0x00, 0xc2, 0x62,
-  0x54, 0x08, 0x01, 0x00,
-  0x00, 0x0a, 0x00, 0x06,  // username attribute (length 6)
-  0x00, 0x01, 0x10, 0x00,  // three attributes plus padding
-  0xAB, 0xCU, 0xBE, 0xEF
-};
-
-// Error response message (unauthorized)
-static const unsigned char kStunMessageWithErrorAttribute[] = {
-  0x01, 0x11, 0x00, 0x14,
-  0x21, 0x12, 0xa4, 0x42,
-  0x29, 0x1f, 0xcd, 0x7c,
-  0xba, 0x58, 0xab, 0xd7,
-  0xf2, 0x41, 0x01, 0x00,
-  0x00, 0x09, 0x00, 0x10,
-  0x00, 0x00, 0x04, 0x01,
-  0x55, 0x6e, 0x61, 0x75,
-  0x74, 0x68, 0x6f, 0x72,
-  0x69, 0x7a, 0x65, 0x64
-};
-
-static const unsigned char kStunMessageWithOriginAttribute[] = {
-  0x00, 0x01, 0x00, 0x18,  // message header (binding request), length 24
-  0x21, 0x12, 0xA4, 0x42,  // magic cookie
-  0x29, 0x1f, 0xcd, 0x7c,  // transaction id
-  0xba, 0x58, 0xab, 0xd7,
-  0xf2, 0x41, 0x01, 0x00,
-  0x80, 0x2f, 0x00, 0x12,  // origin attribute (length 18)
-  0x68, 0x74, 0x74, 0x70,  // http://example.com
-  0x3A, 0x2F, 0x2F, 0x65,
-  0x78, 0x61, 0x6d, 0x70,
-  0x6c, 0x65, 0x2e, 0x63,
-  0x6f, 0x6d, 0x00, 0x00,
-};
-
-// Sample messages with an invalid length Field
-
-// The actual length in bytes of the invalid messages (including STUN header)
-static const int kRealLengthOfInvalidLengthTestCases = 32;
-
-static const unsigned char kStunMessageWithZeroLength[] = {
-  0x00, 0x01, 0x00, 0x00,  // length of 0 (last 2 bytes)
-  0x21, 0x12, 0xA4, 0x42,  // magic cookie
-  '0', '1', '2', '3',      // transaction id
-  '4', '5', '6', '7',
-  '8', '9', 'a', 'b',
-  0x00, 0x20, 0x00, 0x08,  // xor mapped address
-  0x00, 0x01, 0x21, 0x1F,
-  0x21, 0x12, 0xA4, 0x53,
-};
-
-static const unsigned char kStunMessageWithExcessLength[] = {
-  0x00, 0x01, 0x00, 0x55,  // length of 85
-  0x21, 0x12, 0xA4, 0x42,  // magic cookie
-  '0', '1', '2', '3',      // transaction id
-  '4', '5', '6', '7',
-  '8', '9', 'a', 'b',
-  0x00, 0x20, 0x00, 0x08,  // xor mapped address
-  0x00, 0x01, 0x21, 0x1F,
-  0x21, 0x12, 0xA4, 0x53,
-};
-
-static const unsigned char kStunMessageWithSmallLength[] = {
-  0x00, 0x01, 0x00, 0x03,  // length of 3
-  0x21, 0x12, 0xA4, 0x42,  // magic cookie
-  '0', '1', '2', '3',      // transaction id
-  '4', '5', '6', '7',
-  '8', '9', 'a', 'b',
-  0x00, 0x20, 0x00, 0x08,  // xor mapped address
-  0x00, 0x01, 0x21, 0x1F,
-  0x21, 0x12, 0xA4, 0x53,
-};
-
-static const unsigned char kStunMessageWithBadHmacAtEnd[] = {
-  0x00, 0x01, 0x00, 0x14,  // message length exactly 20
-  0x21, 0x12, 0xA4, 0x42,  // magic cookie
-  '0', '1', '2', '3',      // transaction ID
-  '4', '5', '6', '7',
-  '8', '9', 'a', 'b',
-  0x00, 0x08, 0x00, 0x14,  // type=STUN_ATTR_MESSAGE_INTEGRITY, length=20
-  '0', '0', '0', '0',      // We lied, there are only 16 bytes of HMAC.
-  '0', '0', '0', '0',
-  '0', '0', '0', '0',
-  '0', '0', '0', '0',
-};
-
-// RTCP packet, for testing we correctly ignore non stun packet types.
-// V=2, P=false, RC=0, Type=200, Len=6, Sender-SSRC=85, etc
-static const unsigned char kRtcpPacket[] = {
-  0x80, 0xc8, 0x00, 0x06, 0x00, 0x00, 0x00, 0x55,
-  0xce, 0xa5, 0x18, 0x3a, 0x39, 0xcc, 0x7d, 0x09,
-  0x23, 0xed, 0x19, 0x07, 0x00, 0x00, 0x01, 0x56,
-  0x00, 0x03, 0x73, 0x50,
-};
-
-// RFC5769 Test Vectors
-// Software name (request):  "STUN test client" (without quotes)
-// Software name (response): "test vector" (without quotes)
-// Username:  "evtj:h6vY" (without quotes)
-// Password:  "VOkJxbRl1RmTxUk/WvJxBt" (without quotes)
-static const unsigned char kRfc5769SampleMsgTransactionId[] = {
-  0xb7, 0xe7, 0xa7, 0x01, 0xbc, 0x34, 0xd6, 0x86, 0xfa, 0x87, 0xdf, 0xae
-};
-static const char kRfc5769SampleMsgClientSoftware[] = "STUN test client";
-static const char kRfc5769SampleMsgServerSoftware[] = "test vector";
-static const char kRfc5769SampleMsgUsername[] = "evtj:h6vY";
-static const char kRfc5769SampleMsgPassword[] = "VOkJxbRl1RmTxUk/WvJxBt";
-static const rtc::SocketAddress kRfc5769SampleMsgMappedAddress(
-    "192.0.2.1", 32853);
-static const rtc::SocketAddress kRfc5769SampleMsgIPv6MappedAddress(
-    "2001:db8:1234:5678:11:2233:4455:6677", 32853);
-
-static const unsigned char kRfc5769SampleMsgWithAuthTransactionId[] = {
-  0x78, 0xad, 0x34, 0x33, 0xc6, 0xad, 0x72, 0xc0, 0x29, 0xda, 0x41, 0x2e
-};
-static const char kRfc5769SampleMsgWithAuthUsername[] =
-    "\xe3\x83\x9e\xe3\x83\x88\xe3\x83\xaa\xe3\x83\x83\xe3\x82\xaf\xe3\x82\xb9";
-static const char kRfc5769SampleMsgWithAuthPassword[] = "TheMatrIX";
-static const char kRfc5769SampleMsgWithAuthNonce[] =
-    "f//499k954d6OL34oL9FSTvy64sA";
-static const char kRfc5769SampleMsgWithAuthRealm[] = "example.org";
-
-// 2.1.  Sample Request
-static const unsigned char kRfc5769SampleRequest[] = {
-  0x00, 0x01, 0x00, 0x58,   //    Request type and message length
-  0x21, 0x12, 0xa4, 0x42,   //    Magic cookie
-  0xb7, 0xe7, 0xa7, 0x01,   // }
-  0xbc, 0x34, 0xd6, 0x86,   // }  Transaction ID
-  0xfa, 0x87, 0xdf, 0xae,   // }
-  0x80, 0x22, 0x00, 0x10,   //    SOFTWARE attribute header
-  0x53, 0x54, 0x55, 0x4e,   // }
-  0x20, 0x74, 0x65, 0x73,   // }  User-agent...
-  0x74, 0x20, 0x63, 0x6c,   // }  ...name
-  0x69, 0x65, 0x6e, 0x74,   // }
-  0x00, 0x24, 0x00, 0x04,   //    PRIORITY attribute header
-  0x6e, 0x00, 0x01, 0xff,   //    ICE priority value
-  0x80, 0x29, 0x00, 0x08,   //    ICE-CONTROLLED attribute header
-  0x93, 0x2f, 0xf9, 0xb1,   // }  Pseudo-random tie breaker...
-  0x51, 0x26, 0x3b, 0x36,   // }   ...for ICE control
-  0x00, 0x06, 0x00, 0x09,   //    USERNAME attribute header
-  0x65, 0x76, 0x74, 0x6a,   // }
-  0x3a, 0x68, 0x36, 0x76,   // }  Username (9 bytes) and padding (3 bytes)
-  0x59, 0x20, 0x20, 0x20,   // }
-  0x00, 0x08, 0x00, 0x14,   //    MESSAGE-INTEGRITY attribute header
-  0x9a, 0xea, 0xa7, 0x0c,   // }
-  0xbf, 0xd8, 0xcb, 0x56,   // }
-  0x78, 0x1e, 0xf2, 0xb5,   // }  HMAC-SHA1 fingerprint
-  0xb2, 0xd3, 0xf2, 0x49,   // }
-  0xc1, 0xb5, 0x71, 0xa2,   // }
-  0x80, 0x28, 0x00, 0x04,   //    FINGERPRINT attribute header
-  0xe5, 0x7a, 0x3b, 0xcf    //    CRC32 fingerprint
-};
-
-// 2.2.  Sample IPv4 Response
-static const unsigned char kRfc5769SampleResponse[] = {
-  0x01, 0x01, 0x00, 0x3c,  //     Response type and message length
-  0x21, 0x12, 0xa4, 0x42,  //     Magic cookie
-  0xb7, 0xe7, 0xa7, 0x01,  // }
-  0xbc, 0x34, 0xd6, 0x86,  // }  Transaction ID
-  0xfa, 0x87, 0xdf, 0xae,  // }
-  0x80, 0x22, 0x00, 0x0b,  //    SOFTWARE attribute header
-  0x74, 0x65, 0x73, 0x74,  // }
-  0x20, 0x76, 0x65, 0x63,  // }  UTF-8 server name
-  0x74, 0x6f, 0x72, 0x20,  // }
-  0x00, 0x20, 0x00, 0x08,  //    XOR-MAPPED-ADDRESS attribute header
-  0x00, 0x01, 0xa1, 0x47,  //    Address family (IPv4) and xor'd mapped port
-  0xe1, 0x12, 0xa6, 0x43,  //    Xor'd mapped IPv4 address
-  0x00, 0x08, 0x00, 0x14,  //    MESSAGE-INTEGRITY attribute header
-  0x2b, 0x91, 0xf5, 0x99,  // }
-  0xfd, 0x9e, 0x90, 0xc3,  // }
-  0x8c, 0x74, 0x89, 0xf9,  // }  HMAC-SHA1 fingerprint
-  0x2a, 0xf9, 0xba, 0x53,  // }
-  0xf0, 0x6b, 0xe7, 0xd7,  // }
-  0x80, 0x28, 0x00, 0x04,  //    FINGERPRINT attribute header
-  0xc0, 0x7d, 0x4c, 0x96   //    CRC32 fingerprint
-};
-
-// 2.3.  Sample IPv6 Response
-static const unsigned char kRfc5769SampleResponseIPv6[] = {
-  0x01, 0x01, 0x00, 0x48,  //    Response type and message length
-  0x21, 0x12, 0xa4, 0x42,  //    Magic cookie
-  0xb7, 0xe7, 0xa7, 0x01,  // }
-  0xbc, 0x34, 0xd6, 0x86,  // }  Transaction ID
-  0xfa, 0x87, 0xdf, 0xae,  // }
-  0x80, 0x22, 0x00, 0x0b,  //    SOFTWARE attribute header
-  0x74, 0x65, 0x73, 0x74,  // }
-  0x20, 0x76, 0x65, 0x63,  // }  UTF-8 server name
-  0x74, 0x6f, 0x72, 0x20,  // }
-  0x00, 0x20, 0x00, 0x14,  //    XOR-MAPPED-ADDRESS attribute header
-  0x00, 0x02, 0xa1, 0x47,  //    Address family (IPv6) and xor'd mapped port.
-  0x01, 0x13, 0xa9, 0xfa,  // }
-  0xa5, 0xd3, 0xf1, 0x79,  // }  Xor'd mapped IPv6 address
-  0xbc, 0x25, 0xf4, 0xb5,  // }
-  0xbe, 0xd2, 0xb9, 0xd9,  // }
-  0x00, 0x08, 0x00, 0x14,  //    MESSAGE-INTEGRITY attribute header
-  0xa3, 0x82, 0x95, 0x4e,  // }
-  0x4b, 0xe6, 0x7b, 0xf1,  // }
-  0x17, 0x84, 0xc9, 0x7c,  // }  HMAC-SHA1 fingerprint
-  0x82, 0x92, 0xc2, 0x75,  // }
-  0xbf, 0xe3, 0xed, 0x41,  // }
-  0x80, 0x28, 0x00, 0x04,  //    FINGERPRINT attribute header
-  0xc8, 0xfb, 0x0b, 0x4c   //    CRC32 fingerprint
-};
-
-// 2.4.  Sample Request with Long-Term Authentication
-static const unsigned char kRfc5769SampleRequestLongTermAuth[] = {
-  0x00, 0x01, 0x00, 0x60,  //    Request type and message length
-  0x21, 0x12, 0xa4, 0x42,  //    Magic cookie
-  0x78, 0xad, 0x34, 0x33,  // }
-  0xc6, 0xad, 0x72, 0xc0,  // }  Transaction ID
-  0x29, 0xda, 0x41, 0x2e,  // }
-  0x00, 0x06, 0x00, 0x12,  //    USERNAME attribute header
-  0xe3, 0x83, 0x9e, 0xe3,  // }
-  0x83, 0x88, 0xe3, 0x83,  // }
-  0xaa, 0xe3, 0x83, 0x83,  // }  Username value (18 bytes) and padding (2 bytes)
-  0xe3, 0x82, 0xaf, 0xe3,  // }
-  0x82, 0xb9, 0x00, 0x00,  // }
-  0x00, 0x15, 0x00, 0x1c,  //    NONCE attribute header
-  0x66, 0x2f, 0x2f, 0x34,  // }
-  0x39, 0x39, 0x6b, 0x39,  // }
-  0x35, 0x34, 0x64, 0x36,  // }
-  0x4f, 0x4c, 0x33, 0x34,  // }  Nonce value
-  0x6f, 0x4c, 0x39, 0x46,  // }
-  0x53, 0x54, 0x76, 0x79,  // }
-  0x36, 0x34, 0x73, 0x41,  // }
-  0x00, 0x14, 0x00, 0x0b,  //    REALM attribute header
-  0x65, 0x78, 0x61, 0x6d,  // }
-  0x70, 0x6c, 0x65, 0x2e,  // }  Realm value (11 bytes) and padding (1 byte)
-  0x6f, 0x72, 0x67, 0x00,  // }
-  0x00, 0x08, 0x00, 0x14,  //    MESSAGE-INTEGRITY attribute header
-  0xf6, 0x70, 0x24, 0x65,  // }
-  0x6d, 0xd6, 0x4a, 0x3e,  // }
-  0x02, 0xb8, 0xe0, 0x71,  // }  HMAC-SHA1 fingerprint
-  0x2e, 0x85, 0xc9, 0xa2,  // }
-  0x8c, 0xa8, 0x96, 0x66   // }
-};
-
-// Length parameter is changed to 0x38 from 0x58.
-// AddMessageIntegrity will add MI information and update the length param
-// accordingly.
-static const unsigned char kRfc5769SampleRequestWithoutMI[] = {
-  0x00, 0x01, 0x00, 0x38,  //    Request type and message length
-  0x21, 0x12, 0xa4, 0x42,  //    Magic cookie
-  0xb7, 0xe7, 0xa7, 0x01,  // }
-  0xbc, 0x34, 0xd6, 0x86,  // }  Transaction ID
-  0xfa, 0x87, 0xdf, 0xae,  // }
-  0x80, 0x22, 0x00, 0x10,  //    SOFTWARE attribute header
-  0x53, 0x54, 0x55, 0x4e,  // }
-  0x20, 0x74, 0x65, 0x73,  // }  User-agent...
-  0x74, 0x20, 0x63, 0x6c,  // }  ...name
-  0x69, 0x65, 0x6e, 0x74,  // }
-  0x00, 0x24, 0x00, 0x04,  //    PRIORITY attribute header
-  0x6e, 0x00, 0x01, 0xff,  //    ICE priority value
-  0x80, 0x29, 0x00, 0x08,  //    ICE-CONTROLLED attribute header
-  0x93, 0x2f, 0xf9, 0xb1,  // }  Pseudo-random tie breaker...
-  0x51, 0x26, 0x3b, 0x36,  // }   ...for ICE control
-  0x00, 0x06, 0x00, 0x09,  //    USERNAME attribute header
-  0x65, 0x76, 0x74, 0x6a,  // }
-  0x3a, 0x68, 0x36, 0x76,  // }  Username (9 bytes) and padding (3 bytes)
-  0x59, 0x20, 0x20, 0x20   // }
-};
-
-// This HMAC differs from the RFC 5769 SampleRequest message. This differs
-// because spec uses 0x20 for the padding where as our implementation uses 0.
-static const unsigned char kCalculatedHmac1[] = {
-  0x79, 0x07, 0xc2, 0xd2,  // }
-  0xed, 0xbf, 0xea, 0x48,  // }
-  0x0e, 0x4c, 0x76, 0xd8,  // }  HMAC-SHA1 fingerprint
-  0x29, 0x62, 0xd5, 0xc3,  // }
-  0x74, 0x2a, 0xf9, 0xe3   // }
-};
-
-// Length parameter is changed to 0x1c from 0x3c.
-// AddMessageIntegrity will add MI information and update the length param
-// accordingly.
-static const unsigned char kRfc5769SampleResponseWithoutMI[] = {
-  0x01, 0x01, 0x00, 0x1c,  //    Response type and message length
-  0x21, 0x12, 0xa4, 0x42,  //    Magic cookie
-  0xb7, 0xe7, 0xa7, 0x01,  // }
-  0xbc, 0x34, 0xd6, 0x86,  // }  Transaction ID
-  0xfa, 0x87, 0xdf, 0xae,  // }
-  0x80, 0x22, 0x00, 0x0b,  //    SOFTWARE attribute header
-  0x74, 0x65, 0x73, 0x74,  // }
-  0x20, 0x76, 0x65, 0x63,  // }  UTF-8 server name
-  0x74, 0x6f, 0x72, 0x20,  // }
-  0x00, 0x20, 0x00, 0x08,  //    XOR-MAPPED-ADDRESS attribute header
-  0x00, 0x01, 0xa1, 0x47,  //    Address family (IPv4) and xor'd mapped port
-  0xe1, 0x12, 0xa6, 0x43   //    Xor'd mapped IPv4 address
-};
-
-// This HMAC differs from the RFC 5769 SampleResponse message. This differs
-// because spec uses 0x20 for the padding where as our implementation uses 0.
-static const unsigned char kCalculatedHmac2[] = {
-  0x5d, 0x6b, 0x58, 0xbe,  // }
-  0xad, 0x94, 0xe0, 0x7e,  // }
-  0xef, 0x0d, 0xfc, 0x12,  // }  HMAC-SHA1 fingerprint
-  0x82, 0xa2, 0xbd, 0x08,  // }
-  0x43, 0x14, 0x10, 0x28   // }
-};
-
-// A transaction ID without the 'magic cookie' portion
-// pjnat's test programs use this transaction ID a lot.
-const unsigned char kTestTransactionId1[] = { 0x029, 0x01f, 0x0cd, 0x07c,
-                                              0x0ba, 0x058, 0x0ab, 0x0d7,
-                                              0x0f2, 0x041, 0x001, 0x000 };
-
-// They use this one sometimes too.
-const unsigned char kTestTransactionId2[] = { 0x0e3, 0x0a9, 0x046, 0x0e1,
-                                              0x07c, 0x000, 0x0c2, 0x062,
-                                              0x054, 0x008, 0x001, 0x000 };
-
-const in6_addr kIPv6TestAddress1 = { { { 0x24, 0x01, 0xfa, 0x00,
-                                         0x00, 0x04, 0x10, 0x00,
-                                         0xbe, 0x30, 0x5b, 0xff,
-                                         0xfe, 0xe5, 0x00, 0xc3 } } };
-const in6_addr kIPv6TestAddress2 = { { { 0x24, 0x01, 0xfa, 0x00,
-                                         0x00, 0x04, 0x10, 0x12,
-                                         0x06, 0x0c, 0xce, 0xff,
-                                         0xfe, 0x1f, 0x61, 0xa4 } } };
-
-#ifdef WEBRTC_POSIX
-const in_addr kIPv4TestAddress1 =  { 0xe64417ac };
-#elif defined WEBRTC_WIN
-// Windows in_addr has a union with a uchar[] array first.
-const in_addr kIPv4TestAddress1 =  { { { 0x0ac, 0x017, 0x044, 0x0e6 } } };
-#endif
-const char kTestUserName1[] = "abcdefgh";
-const char kTestUserName2[] = "abc";
-const char kTestErrorReason[] = "Unauthorized";
-const char kTestOrigin[] = "http://example.com";
-const int kTestErrorClass = 4;
-const int kTestErrorNumber = 1;
-const int kTestErrorCode = 401;
-
-const int kTestMessagePort1 = 59977;
-const int kTestMessagePort2 = 47233;
-const int kTestMessagePort3 = 56743;
-const int kTestMessagePort4 = 40444;
-
-#define ReadStunMessage(X, Y) ReadStunMessageTestCase(X, Y, sizeof(Y));
-
-// Test that the GetStun*Type and IsStun*Type methods work as expected.
-TEST_F(StunTest, MessageTypes) {
-  EXPECT_EQ(STUN_BINDING_RESPONSE,
-      GetStunSuccessResponseType(STUN_BINDING_REQUEST));
-  EXPECT_EQ(STUN_BINDING_ERROR_RESPONSE,
-      GetStunErrorResponseType(STUN_BINDING_REQUEST));
-  EXPECT_EQ(-1, GetStunSuccessResponseType(STUN_BINDING_INDICATION));
-  EXPECT_EQ(-1, GetStunSuccessResponseType(STUN_BINDING_RESPONSE));
-  EXPECT_EQ(-1, GetStunSuccessResponseType(STUN_BINDING_ERROR_RESPONSE));
-  EXPECT_EQ(-1, GetStunErrorResponseType(STUN_BINDING_INDICATION));
-  EXPECT_EQ(-1, GetStunErrorResponseType(STUN_BINDING_RESPONSE));
-  EXPECT_EQ(-1, GetStunErrorResponseType(STUN_BINDING_ERROR_RESPONSE));
-
-  int types[] = {
-    STUN_BINDING_REQUEST, STUN_BINDING_INDICATION,
-    STUN_BINDING_RESPONSE, STUN_BINDING_ERROR_RESPONSE
-  };
-  for (size_t i = 0; i < arraysize(types); ++i) {
-    EXPECT_EQ(i == 0U, IsStunRequestType(types[i]));
-    EXPECT_EQ(i == 1U, IsStunIndicationType(types[i]));
-    EXPECT_EQ(i == 2U, IsStunSuccessResponseType(types[i]));
-    EXPECT_EQ(i == 3U, IsStunErrorResponseType(types[i]));
-    EXPECT_EQ(1, types[i] & 0xFEEF);
-  }
-}
-
-TEST_F(StunTest, ReadMessageWithIPv4AddressAttribute) {
-  StunMessage msg;
-  size_t size = ReadStunMessage(&msg, kStunMessageWithIPv4MappedAddress);
-  CheckStunHeader(msg, STUN_BINDING_RESPONSE, size);
-  CheckStunTransactionID(msg, kTestTransactionId1, kStunTransactionIdLength);
-
-  const StunAddressAttribute* addr = msg.GetAddress(STUN_ATTR_MAPPED_ADDRESS);
-  rtc::IPAddress test_address(kIPv4TestAddress1);
-  CheckStunAddressAttribute(addr, STUN_ADDRESS_IPV4,
-                            kTestMessagePort4, test_address);
-}
-
-TEST_F(StunTest, ReadMessageWithIPv4XorAddressAttribute) {
-  StunMessage msg;
-  StunMessage msg2;
-  size_t size = ReadStunMessage(&msg, kStunMessageWithIPv4XorMappedAddress);
-  CheckStunHeader(msg, STUN_BINDING_RESPONSE, size);
-  CheckStunTransactionID(msg, kTestTransactionId1, kStunTransactionIdLength);
-
-  const StunAddressAttribute* addr =
-      msg.GetAddress(STUN_ATTR_XOR_MAPPED_ADDRESS);
-  rtc::IPAddress test_address(kIPv4TestAddress1);
-  CheckStunAddressAttribute(addr, STUN_ADDRESS_IPV4,
-                            kTestMessagePort3, test_address);
-}
-
-TEST_F(StunTest, ReadMessageWithIPv6AddressAttribute) {
-  StunMessage msg;
-  size_t size = ReadStunMessage(&msg, kStunMessageWithIPv6MappedAddress);
-  CheckStunHeader(msg, STUN_BINDING_REQUEST, size);
-  CheckStunTransactionID(msg, kTestTransactionId1, kStunTransactionIdLength);
-
-  rtc::IPAddress test_address(kIPv6TestAddress1);
-
-  const StunAddressAttribute* addr = msg.GetAddress(STUN_ATTR_MAPPED_ADDRESS);
-  CheckStunAddressAttribute(addr, STUN_ADDRESS_IPV6,
-                            kTestMessagePort2, test_address);
-}
-
-TEST_F(StunTest, ReadMessageWithInvalidAddressAttribute) {
-  StunMessage msg;
-  size_t size = ReadStunMessage(&msg, kStunMessageWithIPv6MappedAddress);
-  CheckStunHeader(msg, STUN_BINDING_REQUEST, size);
-  CheckStunTransactionID(msg, kTestTransactionId1, kStunTransactionIdLength);
-
-  rtc::IPAddress test_address(kIPv6TestAddress1);
-
-  const StunAddressAttribute* addr = msg.GetAddress(STUN_ATTR_MAPPED_ADDRESS);
-  CheckStunAddressAttribute(addr, STUN_ADDRESS_IPV6,
-                            kTestMessagePort2, test_address);
-}
-
-TEST_F(StunTest, ReadMessageWithIPv6XorAddressAttribute) {
-  StunMessage msg;
-  size_t size = ReadStunMessage(&msg, kStunMessageWithIPv6XorMappedAddress);
-
-  rtc::IPAddress test_address(kIPv6TestAddress1);
-
-  CheckStunHeader(msg, STUN_BINDING_RESPONSE, size);
-  CheckStunTransactionID(msg, kTestTransactionId2, kStunTransactionIdLength);
-
-  const StunAddressAttribute* addr =
-      msg.GetAddress(STUN_ATTR_XOR_MAPPED_ADDRESS);
-  CheckStunAddressAttribute(addr, STUN_ADDRESS_IPV6,
-                            kTestMessagePort1, test_address);
-}
-
-// Read the RFC5389 fields from the RFC5769 sample STUN request.
-TEST_F(StunTest, ReadRfc5769RequestMessage) {
-  StunMessage msg;
-  size_t size = ReadStunMessage(&msg, kRfc5769SampleRequest);
-  CheckStunHeader(msg, STUN_BINDING_REQUEST, size);
-  CheckStunTransactionID(msg, kRfc5769SampleMsgTransactionId,
-                         kStunTransactionIdLength);
-
-  const StunByteStringAttribute* software =
-      msg.GetByteString(STUN_ATTR_SOFTWARE);
-  ASSERT_TRUE(software != NULL);
-  EXPECT_EQ(kRfc5769SampleMsgClientSoftware, software->GetString());
-
-  const StunByteStringAttribute* username =
-      msg.GetByteString(STUN_ATTR_USERNAME);
-  ASSERT_TRUE(username != NULL);
-  EXPECT_EQ(kRfc5769SampleMsgUsername, username->GetString());
-
-  // Actual M-I value checked in a later test.
-  ASSERT_TRUE(msg.GetByteString(STUN_ATTR_MESSAGE_INTEGRITY) != NULL);
-
-  // Fingerprint checked in a later test, but double-check the value here.
-  const StunUInt32Attribute* fingerprint =
-      msg.GetUInt32(STUN_ATTR_FINGERPRINT);
-  ASSERT_TRUE(fingerprint != NULL);
-  EXPECT_EQ(0xe57a3bcf, fingerprint->value());
-}
-
-// Read the RFC5389 fields from the RFC5769 sample STUN response.
-TEST_F(StunTest, ReadRfc5769ResponseMessage) {
-  StunMessage msg;
-  size_t size = ReadStunMessage(&msg, kRfc5769SampleResponse);
-  CheckStunHeader(msg, STUN_BINDING_RESPONSE, size);
-  CheckStunTransactionID(msg, kRfc5769SampleMsgTransactionId,
-                         kStunTransactionIdLength);
-
-  const StunByteStringAttribute* software =
-      msg.GetByteString(STUN_ATTR_SOFTWARE);
-  ASSERT_TRUE(software != NULL);
-  EXPECT_EQ(kRfc5769SampleMsgServerSoftware, software->GetString());
-
-  const StunAddressAttribute* mapped_address =
-      msg.GetAddress(STUN_ATTR_XOR_MAPPED_ADDRESS);
-  ASSERT_TRUE(mapped_address != NULL);
-  EXPECT_EQ(kRfc5769SampleMsgMappedAddress, mapped_address->GetAddress());
-
-  // Actual M-I and fingerprint checked in later tests.
-  ASSERT_TRUE(msg.GetByteString(STUN_ATTR_MESSAGE_INTEGRITY) != NULL);
-  ASSERT_TRUE(msg.GetUInt32(STUN_ATTR_FINGERPRINT) != NULL);
-}
-
-// Read the RFC5389 fields from the RFC5769 sample STUN response for IPv6.
-TEST_F(StunTest, ReadRfc5769ResponseMessageIPv6) {
-  StunMessage msg;
-  size_t size = ReadStunMessage(&msg, kRfc5769SampleResponseIPv6);
-  CheckStunHeader(msg, STUN_BINDING_RESPONSE, size);
-  CheckStunTransactionID(msg, kRfc5769SampleMsgTransactionId,
-                         kStunTransactionIdLength);
-
-  const StunByteStringAttribute* software =
-      msg.GetByteString(STUN_ATTR_SOFTWARE);
-  ASSERT_TRUE(software != NULL);
-  EXPECT_EQ(kRfc5769SampleMsgServerSoftware, software->GetString());
-
-  const StunAddressAttribute* mapped_address =
-      msg.GetAddress(STUN_ATTR_XOR_MAPPED_ADDRESS);
-  ASSERT_TRUE(mapped_address != NULL);
-  EXPECT_EQ(kRfc5769SampleMsgIPv6MappedAddress, mapped_address->GetAddress());
-
-  // Actual M-I and fingerprint checked in later tests.
-  ASSERT_TRUE(msg.GetByteString(STUN_ATTR_MESSAGE_INTEGRITY) != NULL);
-  ASSERT_TRUE(msg.GetUInt32(STUN_ATTR_FINGERPRINT) != NULL);
-}
-
-// Read the RFC5389 fields from the RFC5769 sample STUN response with auth.
-TEST_F(StunTest, ReadRfc5769RequestMessageLongTermAuth) {
-  StunMessage msg;
-  size_t size = ReadStunMessage(&msg, kRfc5769SampleRequestLongTermAuth);
-  CheckStunHeader(msg, STUN_BINDING_REQUEST, size);
-  CheckStunTransactionID(msg, kRfc5769SampleMsgWithAuthTransactionId,
-                         kStunTransactionIdLength);
-
-  const StunByteStringAttribute* username =
-      msg.GetByteString(STUN_ATTR_USERNAME);
-  ASSERT_TRUE(username != NULL);
-  EXPECT_EQ(kRfc5769SampleMsgWithAuthUsername, username->GetString());
-
-  const StunByteStringAttribute* nonce =
-      msg.GetByteString(STUN_ATTR_NONCE);
-  ASSERT_TRUE(nonce != NULL);
-  EXPECT_EQ(kRfc5769SampleMsgWithAuthNonce, nonce->GetString());
-
-  const StunByteStringAttribute* realm =
-      msg.GetByteString(STUN_ATTR_REALM);
-  ASSERT_TRUE(realm != NULL);
-  EXPECT_EQ(kRfc5769SampleMsgWithAuthRealm, realm->GetString());
-
-  // No fingerprint, actual M-I checked in later tests.
-  ASSERT_TRUE(msg.GetByteString(STUN_ATTR_MESSAGE_INTEGRITY) != NULL);
-  ASSERT_TRUE(msg.GetUInt32(STUN_ATTR_FINGERPRINT) == NULL);
-}
-
-// The RFC3489 packet in this test is the same as
-// kStunMessageWithIPv4MappedAddress, but with a different value where the
-// magic cookie was.
-TEST_F(StunTest, ReadLegacyMessage) {
-  unsigned char rfc3489_packet[sizeof(kStunMessageWithIPv4MappedAddress)];
-  memcpy(rfc3489_packet, kStunMessageWithIPv4MappedAddress,
-      sizeof(kStunMessageWithIPv4MappedAddress));
-  // Overwrite the magic cookie here.
-  memcpy(&rfc3489_packet[4], "ABCD", 4);
-
-  StunMessage msg;
-  size_t size = ReadStunMessage(&msg, rfc3489_packet);
-  CheckStunHeader(msg, STUN_BINDING_RESPONSE, size);
-  CheckStunTransactionID(msg, &rfc3489_packet[4], kStunTransactionIdLength + 4);
-
-  const StunAddressAttribute* addr = msg.GetAddress(STUN_ATTR_MAPPED_ADDRESS);
-  rtc::IPAddress test_address(kIPv4TestAddress1);
-  CheckStunAddressAttribute(addr, STUN_ADDRESS_IPV4,
-                            kTestMessagePort4, test_address);
-}
-
-TEST_F(StunTest, SetIPv6XorAddressAttributeOwner) {
-  StunMessage msg;
-  StunMessage msg2;
-  size_t size = ReadStunMessage(&msg, kStunMessageWithIPv6XorMappedAddress);
-
-  rtc::IPAddress test_address(kIPv6TestAddress1);
-
-  CheckStunHeader(msg, STUN_BINDING_RESPONSE, size);
-  CheckStunTransactionID(msg, kTestTransactionId2, kStunTransactionIdLength);
-
-  const StunAddressAttribute* addr =
-      msg.GetAddress(STUN_ATTR_XOR_MAPPED_ADDRESS);
-  CheckStunAddressAttribute(addr, STUN_ADDRESS_IPV6,
-                            kTestMessagePort1, test_address);
-
-  // Owner with a different transaction ID.
-  msg2.SetTransactionID("ABCDABCDABCD");
-  StunXorAddressAttribute addr2(STUN_ATTR_XOR_MAPPED_ADDRESS, 20, NULL);
-  addr2.SetIP(addr->ipaddr());
-  addr2.SetPort(addr->port());
-  addr2.SetOwner(&msg2);
-  // The internal IP address shouldn't change.
-  ASSERT_EQ(addr2.ipaddr(), addr->ipaddr());
-
-  rtc::ByteBufferWriter correct_buf;
-  rtc::ByteBufferWriter wrong_buf;
-  EXPECT_TRUE(addr->Write(&correct_buf));
-  EXPECT_TRUE(addr2.Write(&wrong_buf));
-  // But when written out, the buffers should look different.
-  ASSERT_NE(0,
-            memcmp(correct_buf.Data(), wrong_buf.Data(), wrong_buf.Length()));
-  // And when reading a known good value, the address should be wrong.
-  rtc::ByteBufferReader read_buf(correct_buf);
-  addr2.Read(&read_buf);
-  ASSERT_NE(addr->ipaddr(), addr2.ipaddr());
-  addr2.SetIP(addr->ipaddr());
-  addr2.SetPort(addr->port());
-  // Try writing with no owner at all, should fail and write nothing.
-  addr2.SetOwner(NULL);
-  ASSERT_EQ(addr2.ipaddr(), addr->ipaddr());
-  wrong_buf.Clear();
-  EXPECT_FALSE(addr2.Write(&wrong_buf));
-  ASSERT_EQ(0U, wrong_buf.Length());
-}
-
-TEST_F(StunTest, SetIPv4XorAddressAttributeOwner) {
-  // Unlike the IPv6XorAddressAttributeOwner test, IPv4 XOR address attributes
-  // should _not_ be affected by a change in owner. IPv4 XOR address uses the
-  // magic cookie value which is fixed.
-  StunMessage msg;
-  StunMessage msg2;
-  size_t size = ReadStunMessage(&msg, kStunMessageWithIPv4XorMappedAddress);
-
-  rtc::IPAddress test_address(kIPv4TestAddress1);
-
-  CheckStunHeader(msg, STUN_BINDING_RESPONSE, size);
-  CheckStunTransactionID(msg, kTestTransactionId1, kStunTransactionIdLength);
-
-  const StunAddressAttribute* addr =
-      msg.GetAddress(STUN_ATTR_XOR_MAPPED_ADDRESS);
-  CheckStunAddressAttribute(addr, STUN_ADDRESS_IPV4,
-                            kTestMessagePort3, test_address);
-
-  // Owner with a different transaction ID.
-  msg2.SetTransactionID("ABCDABCDABCD");
-  StunXorAddressAttribute addr2(STUN_ATTR_XOR_MAPPED_ADDRESS, 20, NULL);
-  addr2.SetIP(addr->ipaddr());
-  addr2.SetPort(addr->port());
-  addr2.SetOwner(&msg2);
-  // The internal IP address shouldn't change.
-  ASSERT_EQ(addr2.ipaddr(), addr->ipaddr());
-
-  rtc::ByteBufferWriter correct_buf;
-  rtc::ByteBufferWriter wrong_buf;
-  EXPECT_TRUE(addr->Write(&correct_buf));
-  EXPECT_TRUE(addr2.Write(&wrong_buf));
-  // The same address data should be written.
-  ASSERT_EQ(0,
-            memcmp(correct_buf.Data(), wrong_buf.Data(), wrong_buf.Length()));
-  // And an attribute should be able to un-XOR an address belonging to a message
-  // with a different transaction ID.
-  rtc::ByteBufferReader read_buf(correct_buf);
-  EXPECT_TRUE(addr2.Read(&read_buf));
-  ASSERT_EQ(addr->ipaddr(), addr2.ipaddr());
-
-  // However, no owner is still an error, should fail and write nothing.
-  addr2.SetOwner(NULL);
-  ASSERT_EQ(addr2.ipaddr(), addr->ipaddr());
-  wrong_buf.Clear();
-  EXPECT_FALSE(addr2.Write(&wrong_buf));
-}
-
-TEST_F(StunTest, CreateIPv6AddressAttribute) {
-  rtc::IPAddress test_ip(kIPv6TestAddress2);
-
-  auto addr = StunAttribute::CreateAddress(STUN_ATTR_MAPPED_ADDRESS);
-  rtc::SocketAddress test_addr(test_ip, kTestMessagePort2);
-  addr->SetAddress(test_addr);
-
-  CheckStunAddressAttribute(addr.get(), STUN_ADDRESS_IPV6, kTestMessagePort2,
-                            test_ip);
-}
-
-TEST_F(StunTest, CreateIPv4AddressAttribute) {
-  struct in_addr test_in_addr;
-  test_in_addr.s_addr = 0xBEB0B0BE;
-  rtc::IPAddress test_ip(test_in_addr);
-
-  auto addr = StunAttribute::CreateAddress(STUN_ATTR_MAPPED_ADDRESS);
-  rtc::SocketAddress test_addr(test_ip, kTestMessagePort2);
-  addr->SetAddress(test_addr);
-
-  CheckStunAddressAttribute(addr.get(), STUN_ADDRESS_IPV4, kTestMessagePort2,
-                            test_ip);
-}
-
-// Test that we don't care what order we set the parts of an address
-TEST_F(StunTest, CreateAddressInArbitraryOrder) {
-  auto addr = StunAttribute::CreateAddress(STUN_ATTR_DESTINATION_ADDRESS);
-  // Port first
-  addr->SetPort(kTestMessagePort1);
-  addr->SetIP(rtc::IPAddress(kIPv4TestAddress1));
-  ASSERT_EQ(kTestMessagePort1, addr->port());
-  ASSERT_EQ(rtc::IPAddress(kIPv4TestAddress1), addr->ipaddr());
-
-  auto addr2 = StunAttribute::CreateAddress(STUN_ATTR_DESTINATION_ADDRESS);
-  // IP first
-  addr2->SetIP(rtc::IPAddress(kIPv4TestAddress1));
-  addr2->SetPort(kTestMessagePort2);
-  ASSERT_EQ(kTestMessagePort2, addr2->port());
-  ASSERT_EQ(rtc::IPAddress(kIPv4TestAddress1), addr2->ipaddr());
-}
-
-TEST_F(StunTest, WriteMessageWithIPv6AddressAttribute) {
-  StunMessage msg;
-  size_t size = sizeof(kStunMessageWithIPv6MappedAddress);
-
-  rtc::IPAddress test_ip(kIPv6TestAddress1);
-
-  msg.SetType(STUN_BINDING_REQUEST);
-  msg.SetTransactionID(
-      std::string(reinterpret_cast<const char*>(kTestTransactionId1),
-                  kStunTransactionIdLength));
-  CheckStunTransactionID(msg, kTestTransactionId1, kStunTransactionIdLength);
-
-  auto addr = StunAttribute::CreateAddress(STUN_ATTR_MAPPED_ADDRESS);
-  rtc::SocketAddress test_addr(test_ip, kTestMessagePort2);
-  addr->SetAddress(test_addr);
-  msg.AddAttribute(std::move(addr));
-
-  CheckStunHeader(msg, STUN_BINDING_REQUEST, (size - 20));
-
-  rtc::ByteBufferWriter out;
-  EXPECT_TRUE(msg.Write(&out));
-  ASSERT_EQ(out.Length(), sizeof(kStunMessageWithIPv6MappedAddress));
-  int len1 = static_cast<int>(out.Length());
-  rtc::ByteBufferReader read_buf(out);
-  std::string bytes;
-  read_buf.ReadString(&bytes, len1);
-  ASSERT_EQ(0, memcmp(bytes.c_str(), kStunMessageWithIPv6MappedAddress, len1));
-}
-
-TEST_F(StunTest, WriteMessageWithIPv4AddressAttribute) {
-  StunMessage msg;
-  size_t size = sizeof(kStunMessageWithIPv4MappedAddress);
-
-  rtc::IPAddress test_ip(kIPv4TestAddress1);
-
-  msg.SetType(STUN_BINDING_RESPONSE);
-  msg.SetTransactionID(
-      std::string(reinterpret_cast<const char*>(kTestTransactionId1),
-                  kStunTransactionIdLength));
-  CheckStunTransactionID(msg, kTestTransactionId1, kStunTransactionIdLength);
-
-  auto addr = StunAttribute::CreateAddress(STUN_ATTR_MAPPED_ADDRESS);
-  rtc::SocketAddress test_addr(test_ip, kTestMessagePort4);
-  addr->SetAddress(test_addr);
-  msg.AddAttribute(std::move(addr));
-
-  CheckStunHeader(msg, STUN_BINDING_RESPONSE, (size - 20));
-
-  rtc::ByteBufferWriter out;
-  EXPECT_TRUE(msg.Write(&out));
-  ASSERT_EQ(out.Length(), sizeof(kStunMessageWithIPv4MappedAddress));
-  int len1 = static_cast<int>(out.Length());
-  rtc::ByteBufferReader read_buf(out);
-  std::string bytes;
-  read_buf.ReadString(&bytes, len1);
-  ASSERT_EQ(0, memcmp(bytes.c_str(), kStunMessageWithIPv4MappedAddress, len1));
-}
-
-TEST_F(StunTest, WriteMessageWithIPv6XorAddressAttribute) {
-  StunMessage msg;
-  size_t size = sizeof(kStunMessageWithIPv6XorMappedAddress);
-
-  rtc::IPAddress test_ip(kIPv6TestAddress1);
-
-  msg.SetType(STUN_BINDING_RESPONSE);
-  msg.SetTransactionID(
-      std::string(reinterpret_cast<const char*>(kTestTransactionId2),
-                  kStunTransactionIdLength));
-  CheckStunTransactionID(msg, kTestTransactionId2, kStunTransactionIdLength);
-
-  auto addr = StunAttribute::CreateXorAddress(STUN_ATTR_XOR_MAPPED_ADDRESS);
-  rtc::SocketAddress test_addr(test_ip, kTestMessagePort1);
-  addr->SetAddress(test_addr);
-  msg.AddAttribute(std::move(addr));
-
-  CheckStunHeader(msg, STUN_BINDING_RESPONSE, (size - 20));
-
-  rtc::ByteBufferWriter out;
-  EXPECT_TRUE(msg.Write(&out));
-  ASSERT_EQ(out.Length(), sizeof(kStunMessageWithIPv6XorMappedAddress));
-  int len1 = static_cast<int>(out.Length());
-  rtc::ByteBufferReader read_buf(out);
-  std::string bytes;
-  read_buf.ReadString(&bytes, len1);
-  ASSERT_EQ(0,
-            memcmp(bytes.c_str(), kStunMessageWithIPv6XorMappedAddress, len1));
-}
-
-TEST_F(StunTest, WriteMessageWithIPv4XoreAddressAttribute) {
-  StunMessage msg;
-  size_t size = sizeof(kStunMessageWithIPv4XorMappedAddress);
-
-  rtc::IPAddress test_ip(kIPv4TestAddress1);
-
-  msg.SetType(STUN_BINDING_RESPONSE);
-  msg.SetTransactionID(
-      std::string(reinterpret_cast<const char*>(kTestTransactionId1),
-                  kStunTransactionIdLength));
-  CheckStunTransactionID(msg, kTestTransactionId1, kStunTransactionIdLength);
-
-  auto addr = StunAttribute::CreateXorAddress(STUN_ATTR_XOR_MAPPED_ADDRESS);
-  rtc::SocketAddress test_addr(test_ip, kTestMessagePort3);
-  addr->SetAddress(test_addr);
-  msg.AddAttribute(std::move(addr));
-
-  CheckStunHeader(msg, STUN_BINDING_RESPONSE, (size - 20));
-
-  rtc::ByteBufferWriter out;
-  EXPECT_TRUE(msg.Write(&out));
-  ASSERT_EQ(out.Length(), sizeof(kStunMessageWithIPv4XorMappedAddress));
-  int len1 = static_cast<int>(out.Length());
-  rtc::ByteBufferReader read_buf(out);
-  std::string bytes;
-  read_buf.ReadString(&bytes, len1);
-  ASSERT_EQ(0,
-            memcmp(bytes.c_str(), kStunMessageWithIPv4XorMappedAddress, len1));
-}
-
-TEST_F(StunTest, ReadByteStringAttribute) {
-  StunMessage msg;
-  size_t size = ReadStunMessage(&msg, kStunMessageWithByteStringAttribute);
-
-  CheckStunHeader(msg, STUN_BINDING_REQUEST, size);
-  CheckStunTransactionID(msg, kTestTransactionId2, kStunTransactionIdLength);
-  const StunByteStringAttribute* username =
-      msg.GetByteString(STUN_ATTR_USERNAME);
-  ASSERT_TRUE(username != NULL);
-  EXPECT_EQ(kTestUserName1, username->GetString());
-}
-
-TEST_F(StunTest, ReadPaddedByteStringAttribute) {
-  StunMessage msg;
-  size_t size = ReadStunMessage(&msg,
-                                kStunMessageWithPaddedByteStringAttribute);
-  ASSERT_NE(0U, size);
-  CheckStunHeader(msg, STUN_BINDING_REQUEST, size);
-  CheckStunTransactionID(msg, kTestTransactionId2, kStunTransactionIdLength);
-  const StunByteStringAttribute* username =
-      msg.GetByteString(STUN_ATTR_USERNAME);
-  ASSERT_TRUE(username != NULL);
-  EXPECT_EQ(kTestUserName2, username->GetString());
-}
-
-TEST_F(StunTest, ReadErrorCodeAttribute) {
-  StunMessage msg;
-  size_t size = ReadStunMessage(&msg, kStunMessageWithErrorAttribute);
-
-  CheckStunHeader(msg, STUN_BINDING_ERROR_RESPONSE, size);
-  CheckStunTransactionID(msg, kTestTransactionId1, kStunTransactionIdLength);
-  const StunErrorCodeAttribute* errorcode = msg.GetErrorCode();
-  ASSERT_TRUE(errorcode != NULL);
-  EXPECT_EQ(kTestErrorClass, errorcode->eclass());
-  EXPECT_EQ(kTestErrorNumber, errorcode->number());
-  EXPECT_EQ(kTestErrorReason, errorcode->reason());
-  EXPECT_EQ(kTestErrorCode, errorcode->code());
-  EXPECT_EQ(kTestErrorCode, msg.GetErrorCodeValue());
-}
-
-// Test that GetErrorCodeValue returns STUN_ERROR_GLOBAL_FAILURE if the message
-// in question doesn't have an error code attribute, rather than crashing.
-TEST_F(StunTest, GetErrorCodeValueWithNoErrorAttribute) {
-  StunMessage msg;
-  ReadStunMessage(&msg, kStunMessageWithIPv6MappedAddress);
-  EXPECT_EQ(STUN_ERROR_GLOBAL_FAILURE, msg.GetErrorCodeValue());
-}
-
-TEST_F(StunTest, ReadMessageWithAUInt16ListAttribute) {
-  StunMessage msg;
-  size_t size = ReadStunMessage(&msg, kStunMessageWithUInt16ListAttribute);
-  CheckStunHeader(msg, STUN_BINDING_REQUEST, size);
-  const StunUInt16ListAttribute* types = msg.GetUnknownAttributes();
-  ASSERT_TRUE(types != NULL);
-  EXPECT_EQ(3U, types->Size());
-  EXPECT_EQ(0x1U, types->GetType(0));
-  EXPECT_EQ(0x1000U, types->GetType(1));
-  EXPECT_EQ(0xAB0CU, types->GetType(2));
-}
-
-TEST_F(StunTest, ReadMessageWithAnUnknownAttribute) {
-  StunMessage msg;
-  size_t size = ReadStunMessage(&msg, kStunMessageWithUnknownAttribute);
-  CheckStunHeader(msg, STUN_BINDING_REQUEST, size);
-
-  // Parsing should have succeeded and there should be a USERNAME attribute
-  const StunByteStringAttribute* username =
-      msg.GetByteString(STUN_ATTR_USERNAME);
-  ASSERT_TRUE(username != NULL);
-  EXPECT_EQ(kTestUserName2, username->GetString());
-}
-
-TEST_F(StunTest, ReadMessageWithOriginAttribute) {
-  StunMessage msg;
-  size_t size = ReadStunMessage(&msg, kStunMessageWithOriginAttribute);
-  CheckStunHeader(msg, STUN_BINDING_REQUEST, size);
-  const StunByteStringAttribute* origin =
-      msg.GetByteString(STUN_ATTR_ORIGIN);
-  ASSERT_TRUE(origin != NULL);
-  EXPECT_EQ(kTestOrigin, origin->GetString());
-}
-
-TEST_F(StunTest, WriteMessageWithAnErrorCodeAttribute) {
-  StunMessage msg;
-  size_t size = sizeof(kStunMessageWithErrorAttribute);
-
-  msg.SetType(STUN_BINDING_ERROR_RESPONSE);
-  msg.SetTransactionID(
-      std::string(reinterpret_cast<const char*>(kTestTransactionId1),
-                  kStunTransactionIdLength));
-  CheckStunTransactionID(msg, kTestTransactionId1, kStunTransactionIdLength);
-  auto errorcode = StunAttribute::CreateErrorCode();
-  errorcode->SetCode(kTestErrorCode);
-  errorcode->SetReason(kTestErrorReason);
-  msg.AddAttribute(std::move(errorcode));
-  CheckStunHeader(msg, STUN_BINDING_ERROR_RESPONSE, (size - 20));
-
-  rtc::ByteBufferWriter out;
-  EXPECT_TRUE(msg.Write(&out));
-  ASSERT_EQ(size, out.Length());
-  // No padding.
-  ASSERT_EQ(0, memcmp(out.Data(), kStunMessageWithErrorAttribute, size));
-}
-
-TEST_F(StunTest, WriteMessageWithAUInt16ListAttribute) {
-  StunMessage msg;
-  size_t size = sizeof(kStunMessageWithUInt16ListAttribute);
-
-  msg.SetType(STUN_BINDING_REQUEST);
-  msg.SetTransactionID(
-      std::string(reinterpret_cast<const char*>(kTestTransactionId2),
-                  kStunTransactionIdLength));
-  CheckStunTransactionID(msg, kTestTransactionId2, kStunTransactionIdLength);
-  auto list = StunAttribute::CreateUnknownAttributes();
-  list->AddType(0x1U);
-  list->AddType(0x1000U);
-  list->AddType(0xAB0CU);
-  msg.AddAttribute(std::move(list));
-  CheckStunHeader(msg, STUN_BINDING_REQUEST, (size - 20));
-
-  rtc::ByteBufferWriter out;
-  EXPECT_TRUE(msg.Write(&out));
-  ASSERT_EQ(size, out.Length());
-  // Check everything up to the padding.
-  ASSERT_EQ(0,
-            memcmp(out.Data(), kStunMessageWithUInt16ListAttribute, size - 2));
-}
-
-TEST_F(StunTest, WriteMessageWithOriginAttribute) {
-  StunMessage msg;
-  size_t size = sizeof(kStunMessageWithOriginAttribute);
-
-  msg.SetType(STUN_BINDING_REQUEST);
-  msg.SetTransactionID(
-      std::string(reinterpret_cast<const char*>(kTestTransactionId1),
-                  kStunTransactionIdLength));
-  auto origin =
-      rtc::MakeUnique<StunByteStringAttribute>(STUN_ATTR_ORIGIN, kTestOrigin);
-  msg.AddAttribute(std::move(origin));
-
-  rtc::ByteBufferWriter out;
-  EXPECT_TRUE(msg.Write(&out));
-  ASSERT_EQ(size, out.Length());
-  // Check everything up to the padding
-  ASSERT_EQ(0, memcmp(out.Data(), kStunMessageWithOriginAttribute, size - 2));
-}
-
-// Test that we fail to read messages with invalid lengths.
-void CheckFailureToRead(const unsigned char* testcase, size_t length) {
-  StunMessage msg;
-  const char* input = reinterpret_cast<const char*>(testcase);
-  rtc::ByteBufferReader buf(input, length);
-  ASSERT_FALSE(msg.Read(&buf));
-}
-
-TEST_F(StunTest, FailToReadInvalidMessages) {
-  CheckFailureToRead(kStunMessageWithZeroLength,
-                     kRealLengthOfInvalidLengthTestCases);
-  CheckFailureToRead(kStunMessageWithSmallLength,
-                     kRealLengthOfInvalidLengthTestCases);
-  CheckFailureToRead(kStunMessageWithExcessLength,
-                     kRealLengthOfInvalidLengthTestCases);
-}
-
-// Test that we properly fail to read a non-STUN message.
-TEST_F(StunTest, FailToReadRtcpPacket) {
-  CheckFailureToRead(kRtcpPacket, sizeof(kRtcpPacket));
-}
-
-// Check our STUN message validation code against the RFC5769 test messages.
-TEST_F(StunTest, ValidateMessageIntegrity) {
-  // Try the messages from RFC 5769.
-  EXPECT_TRUE(StunMessage::ValidateMessageIntegrity(
-      reinterpret_cast<const char*>(kRfc5769SampleRequest),
-      sizeof(kRfc5769SampleRequest),
-      kRfc5769SampleMsgPassword));
-  EXPECT_FALSE(StunMessage::ValidateMessageIntegrity(
-      reinterpret_cast<const char*>(kRfc5769SampleRequest),
-      sizeof(kRfc5769SampleRequest),
-      "InvalidPassword"));
-
-  EXPECT_TRUE(StunMessage::ValidateMessageIntegrity(
-      reinterpret_cast<const char*>(kRfc5769SampleResponse),
-      sizeof(kRfc5769SampleResponse),
-      kRfc5769SampleMsgPassword));
-  EXPECT_FALSE(StunMessage::ValidateMessageIntegrity(
-      reinterpret_cast<const char*>(kRfc5769SampleResponse),
-      sizeof(kRfc5769SampleResponse),
-      "InvalidPassword"));
-
-  EXPECT_TRUE(StunMessage::ValidateMessageIntegrity(
-      reinterpret_cast<const char*>(kRfc5769SampleResponseIPv6),
-      sizeof(kRfc5769SampleResponseIPv6),
-      kRfc5769SampleMsgPassword));
-  EXPECT_FALSE(StunMessage::ValidateMessageIntegrity(
-      reinterpret_cast<const char*>(kRfc5769SampleResponseIPv6),
-      sizeof(kRfc5769SampleResponseIPv6),
-      "InvalidPassword"));
-
-  // We first need to compute the key for the long-term authentication HMAC.
-  std::string key;
-  ComputeStunCredentialHash(kRfc5769SampleMsgWithAuthUsername,
-      kRfc5769SampleMsgWithAuthRealm, kRfc5769SampleMsgWithAuthPassword, &key);
-  EXPECT_TRUE(StunMessage::ValidateMessageIntegrity(
-      reinterpret_cast<const char*>(kRfc5769SampleRequestLongTermAuth),
-      sizeof(kRfc5769SampleRequestLongTermAuth), key));
-  EXPECT_FALSE(StunMessage::ValidateMessageIntegrity(
-      reinterpret_cast<const char*>(kRfc5769SampleRequestLongTermAuth),
-      sizeof(kRfc5769SampleRequestLongTermAuth),
-      "InvalidPassword"));
-
-  // Try some edge cases.
-  EXPECT_FALSE(StunMessage::ValidateMessageIntegrity(
-      reinterpret_cast<const char*>(kStunMessageWithZeroLength),
-      sizeof(kStunMessageWithZeroLength),
-      kRfc5769SampleMsgPassword));
-  EXPECT_FALSE(StunMessage::ValidateMessageIntegrity(
-      reinterpret_cast<const char*>(kStunMessageWithExcessLength),
-      sizeof(kStunMessageWithExcessLength),
-      kRfc5769SampleMsgPassword));
-  EXPECT_FALSE(StunMessage::ValidateMessageIntegrity(
-      reinterpret_cast<const char*>(kStunMessageWithSmallLength),
-      sizeof(kStunMessageWithSmallLength),
-      kRfc5769SampleMsgPassword));
-
-  // Again, but with the lengths matching what is claimed in the headers.
-  EXPECT_FALSE(StunMessage::ValidateMessageIntegrity(
-      reinterpret_cast<const char*>(kStunMessageWithZeroLength),
-      kStunHeaderSize + rtc::GetBE16(&kStunMessageWithZeroLength[2]),
-      kRfc5769SampleMsgPassword));
-  EXPECT_FALSE(StunMessage::ValidateMessageIntegrity(
-      reinterpret_cast<const char*>(kStunMessageWithExcessLength),
-      kStunHeaderSize + rtc::GetBE16(&kStunMessageWithExcessLength[2]),
-      kRfc5769SampleMsgPassword));
-  EXPECT_FALSE(StunMessage::ValidateMessageIntegrity(
-      reinterpret_cast<const char*>(kStunMessageWithSmallLength),
-      kStunHeaderSize + rtc::GetBE16(&kStunMessageWithSmallLength[2]),
-      kRfc5769SampleMsgPassword));
-
-  // Check that a too-short HMAC doesn't cause buffer overflow.
-  EXPECT_FALSE(StunMessage::ValidateMessageIntegrity(
-      reinterpret_cast<const char*>(kStunMessageWithBadHmacAtEnd),
-      sizeof(kStunMessageWithBadHmacAtEnd),
-      kRfc5769SampleMsgPassword));
-
-  // Test that munging a single bit anywhere in the message causes the
-  // message-integrity check to fail, unless it is after the M-I attribute.
-  char buf[sizeof(kRfc5769SampleRequest)];
-  memcpy(buf, kRfc5769SampleRequest, sizeof(kRfc5769SampleRequest));
-  for (size_t i = 0; i < sizeof(buf); ++i) {
-    buf[i] ^= 0x01;
-    if (i > 0)
-      buf[i - 1] ^= 0x01;
-    EXPECT_EQ(i >= sizeof(buf) - 8, StunMessage::ValidateMessageIntegrity(
-        buf, sizeof(buf), kRfc5769SampleMsgPassword));
-  }
-}
-
-// Validate that we generate correct MESSAGE-INTEGRITY attributes.
-// Note the use of IceMessage instead of StunMessage; this is necessary because
-// the RFC5769 test messages used include attributes not found in basic STUN.
-TEST_F(StunTest, AddMessageIntegrity) {
-  IceMessage msg;
-  rtc::ByteBufferReader buf(
-      reinterpret_cast<const char*>(kRfc5769SampleRequestWithoutMI),
-      sizeof(kRfc5769SampleRequestWithoutMI));
-  EXPECT_TRUE(msg.Read(&buf));
-  EXPECT_TRUE(msg.AddMessageIntegrity(kRfc5769SampleMsgPassword));
-  const StunByteStringAttribute* mi_attr =
-      msg.GetByteString(STUN_ATTR_MESSAGE_INTEGRITY);
-  EXPECT_EQ(20U, mi_attr->length());
-  EXPECT_EQ(0, memcmp(
-      mi_attr->bytes(), kCalculatedHmac1, sizeof(kCalculatedHmac1)));
-
-  rtc::ByteBufferWriter buf1;
-  EXPECT_TRUE(msg.Write(&buf1));
-  EXPECT_TRUE(StunMessage::ValidateMessageIntegrity(
-        reinterpret_cast<const char*>(buf1.Data()), buf1.Length(),
-        kRfc5769SampleMsgPassword));
-
-  IceMessage msg2;
-  rtc::ByteBufferReader buf2(
-      reinterpret_cast<const char*>(kRfc5769SampleResponseWithoutMI),
-      sizeof(kRfc5769SampleResponseWithoutMI));
-  EXPECT_TRUE(msg2.Read(&buf2));
-  EXPECT_TRUE(msg2.AddMessageIntegrity(kRfc5769SampleMsgPassword));
-  const StunByteStringAttribute* mi_attr2 =
-      msg2.GetByteString(STUN_ATTR_MESSAGE_INTEGRITY);
-  EXPECT_EQ(20U, mi_attr2->length());
-  EXPECT_EQ(
-      0, memcmp(mi_attr2->bytes(), kCalculatedHmac2, sizeof(kCalculatedHmac2)));
-
-  rtc::ByteBufferWriter buf3;
-  EXPECT_TRUE(msg2.Write(&buf3));
-  EXPECT_TRUE(StunMessage::ValidateMessageIntegrity(
-        reinterpret_cast<const char*>(buf3.Data()), buf3.Length(),
-        kRfc5769SampleMsgPassword));
-}
-
-// Check our STUN message validation code against the RFC5769 test messages.
-TEST_F(StunTest, ValidateFingerprint) {
-  EXPECT_TRUE(StunMessage::ValidateFingerprint(
-      reinterpret_cast<const char*>(kRfc5769SampleRequest),
-      sizeof(kRfc5769SampleRequest)));
-  EXPECT_TRUE(StunMessage::ValidateFingerprint(
-      reinterpret_cast<const char*>(kRfc5769SampleResponse),
-      sizeof(kRfc5769SampleResponse)));
-  EXPECT_TRUE(StunMessage::ValidateFingerprint(
-      reinterpret_cast<const char*>(kRfc5769SampleResponseIPv6),
-      sizeof(kRfc5769SampleResponseIPv6)));
-
-  EXPECT_FALSE(StunMessage::ValidateFingerprint(
-      reinterpret_cast<const char*>(kStunMessageWithZeroLength),
-      sizeof(kStunMessageWithZeroLength)));
-  EXPECT_FALSE(StunMessage::ValidateFingerprint(
-      reinterpret_cast<const char*>(kStunMessageWithExcessLength),
-      sizeof(kStunMessageWithExcessLength)));
-  EXPECT_FALSE(StunMessage::ValidateFingerprint(
-      reinterpret_cast<const char*>(kStunMessageWithSmallLength),
-      sizeof(kStunMessageWithSmallLength)));
-
-  // Test that munging a single bit anywhere in the message causes the
-  // fingerprint check to fail.
-  char buf[sizeof(kRfc5769SampleRequest)];
-  memcpy(buf, kRfc5769SampleRequest, sizeof(kRfc5769SampleRequest));
-  for (size_t i = 0; i < sizeof(buf); ++i) {
-    buf[i] ^= 0x01;
-    if (i > 0)
-      buf[i - 1] ^= 0x01;
-    EXPECT_FALSE(StunMessage::ValidateFingerprint(buf, sizeof(buf)));
-  }
-  // Put them all back to normal and the check should pass again.
-  buf[sizeof(buf) - 1] ^= 0x01;
-  EXPECT_TRUE(StunMessage::ValidateFingerprint(buf, sizeof(buf)));
-}
-
-TEST_F(StunTest, AddFingerprint) {
-  IceMessage msg;
-  rtc::ByteBufferReader buf(
-      reinterpret_cast<const char*>(kRfc5769SampleRequestWithoutMI),
-      sizeof(kRfc5769SampleRequestWithoutMI));
-  EXPECT_TRUE(msg.Read(&buf));
-  EXPECT_TRUE(msg.AddFingerprint());
-
-  rtc::ByteBufferWriter buf1;
-  EXPECT_TRUE(msg.Write(&buf1));
-  EXPECT_TRUE(StunMessage::ValidateFingerprint(
-      reinterpret_cast<const char*>(buf1.Data()), buf1.Length()));
-}
-
-// Sample "GTURN" relay message.
-static const unsigned char kRelayMessage[] = {
-  0x00, 0x01, 0x00, 88,    // message header
-  0x21, 0x12, 0xA4, 0x42,  // magic cookie
-  '0', '1', '2', '3',      // transaction id
-  '4', '5', '6', '7',
-  '8', '9', 'a', 'b',
-  0x00, 0x01, 0x00, 8,     // mapped address
-  0x00, 0x01, 0x00, 13,
-  0x00, 0x00, 0x00, 17,
-  0x00, 0x06, 0x00, 12,    // username
-  'a', 'b', 'c', 'd',
-  'e', 'f', 'g', 'h',
-  'i', 'j', 'k', 'l',
-  0x00, 0x0d, 0x00, 4,     // lifetime
-  0x00, 0x00, 0x00, 11,
-  0x00, 0x0f, 0x00, 4,     // magic cookie
-  0x72, 0xc6, 0x4b, 0xc6,
-  0x00, 0x10, 0x00, 4,     // bandwidth
-  0x00, 0x00, 0x00, 6,
-  0x00, 0x11, 0x00, 8,     // destination address
-  0x00, 0x01, 0x00, 13,
-  0x00, 0x00, 0x00, 17,
-  0x00, 0x12, 0x00, 8,     // source address 2
-  0x00, 0x01, 0x00, 13,
-  0x00, 0x00, 0x00, 17,
-  0x00, 0x13, 0x00, 7,     // data
-  'a', 'b', 'c', 'd',
-  'e', 'f', 'g', 0         // DATA must be padded per rfc5766.
-};
-
-// Test that we can read the GTURN-specific fields.
-TEST_F(StunTest, ReadRelayMessage) {
-  RelayMessage msg, msg2;
-
-  const char* input = reinterpret_cast<const char*>(kRelayMessage);
-  size_t size = sizeof(kRelayMessage);
-  rtc::ByteBufferReader buf(input, size);
-  EXPECT_TRUE(msg.Read(&buf));
-
-  EXPECT_EQ(STUN_BINDING_REQUEST, msg.type());
-  EXPECT_EQ(size - 20, msg.length());
-  EXPECT_EQ("0123456789ab", msg.transaction_id());
-
-  msg2.SetType(STUN_BINDING_REQUEST);
-  msg2.SetTransactionID("0123456789ab");
-
-  in_addr legacy_in_addr;
-  legacy_in_addr.s_addr = htonl(17U);
-  rtc::IPAddress legacy_ip(legacy_in_addr);
-
-  const StunAddressAttribute* addr = msg.GetAddress(STUN_ATTR_MAPPED_ADDRESS);
-  ASSERT_TRUE(addr != NULL);
-  EXPECT_EQ(1, addr->family());
-  EXPECT_EQ(13, addr->port());
-  EXPECT_EQ(legacy_ip, addr->ipaddr());
-
-  auto addr2 = StunAttribute::CreateAddress(STUN_ATTR_MAPPED_ADDRESS);
-  addr2->SetPort(13);
-  addr2->SetIP(legacy_ip);
-  msg2.AddAttribute(std::move(addr2));
-
-  const StunByteStringAttribute* bytes = msg.GetByteString(STUN_ATTR_USERNAME);
-  ASSERT_TRUE(bytes != NULL);
-  EXPECT_EQ(12U, bytes->length());
-  EXPECT_EQ("abcdefghijkl", bytes->GetString());
-
-  auto bytes2 = StunAttribute::CreateByteString(STUN_ATTR_USERNAME);
-  bytes2->CopyBytes("abcdefghijkl");
-  msg2.AddAttribute(std::move(bytes2));
-
-  const StunUInt32Attribute* uval = msg.GetUInt32(STUN_ATTR_LIFETIME);
-  ASSERT_TRUE(uval != NULL);
-  EXPECT_EQ(11U, uval->value());
-
-  auto uval2 = StunAttribute::CreateUInt32(STUN_ATTR_LIFETIME);
-  uval2->SetValue(11);
-  msg2.AddAttribute(std::move(uval2));
-
-  bytes = msg.GetByteString(STUN_ATTR_MAGIC_COOKIE);
-  ASSERT_TRUE(bytes != NULL);
-  EXPECT_EQ(4U, bytes->length());
-  EXPECT_EQ(0,
-            memcmp(bytes->bytes(),
-                   TURN_MAGIC_COOKIE_VALUE,
-                   sizeof(TURN_MAGIC_COOKIE_VALUE)));
-
-  bytes2 = StunAttribute::CreateByteString(STUN_ATTR_MAGIC_COOKIE);
-  bytes2->CopyBytes(reinterpret_cast<const char*>(TURN_MAGIC_COOKIE_VALUE),
-                    sizeof(TURN_MAGIC_COOKIE_VALUE));
-  msg2.AddAttribute(std::move(bytes2));
-
-  uval = msg.GetUInt32(STUN_ATTR_BANDWIDTH);
-  ASSERT_TRUE(uval != NULL);
-  EXPECT_EQ(6U, uval->value());
-
-  uval2 = StunAttribute::CreateUInt32(STUN_ATTR_BANDWIDTH);
-  uval2->SetValue(6);
-  msg2.AddAttribute(std::move(uval2));
-
-  addr = msg.GetAddress(STUN_ATTR_DESTINATION_ADDRESS);
-  ASSERT_TRUE(addr != NULL);
-  EXPECT_EQ(1, addr->family());
-  EXPECT_EQ(13, addr->port());
-  EXPECT_EQ(legacy_ip, addr->ipaddr());
-
-  addr2 = StunAttribute::CreateAddress(STUN_ATTR_DESTINATION_ADDRESS);
-  addr2->SetPort(13);
-  addr2->SetIP(legacy_ip);
-  msg2.AddAttribute(std::move(addr2));
-
-  addr = msg.GetAddress(STUN_ATTR_SOURCE_ADDRESS2);
-  ASSERT_TRUE(addr != NULL);
-  EXPECT_EQ(1, addr->family());
-  EXPECT_EQ(13, addr->port());
-  EXPECT_EQ(legacy_ip, addr->ipaddr());
-
-  addr2 = StunAttribute::CreateAddress(STUN_ATTR_SOURCE_ADDRESS2);
-  addr2->SetPort(13);
-  addr2->SetIP(legacy_ip);
-  msg2.AddAttribute(std::move(addr2));
-
-  bytes = msg.GetByteString(STUN_ATTR_DATA);
-  ASSERT_TRUE(bytes != NULL);
-  EXPECT_EQ(7U, bytes->length());
-  EXPECT_EQ("abcdefg", bytes->GetString());
-
-  bytes2 = StunAttribute::CreateByteString(STUN_ATTR_DATA);
-  bytes2->CopyBytes("abcdefg");
-  msg2.AddAttribute(std::move(bytes2));
-
-  rtc::ByteBufferWriter out;
-  EXPECT_TRUE(msg.Write(&out));
-  EXPECT_EQ(size, out.Length());
-  size_t len1 = out.Length();
-  rtc::ByteBufferReader read_buf(out);
-  std::string outstring;
-  read_buf.ReadString(&outstring, len1);
-  EXPECT_EQ(0, memcmp(outstring.c_str(), input, len1));
-
-  rtc::ByteBufferWriter out2;
-  EXPECT_TRUE(msg2.Write(&out2));
-  EXPECT_EQ(size, out2.Length());
-  size_t len2 = out2.Length();
-  rtc::ByteBufferReader read_buf2(out2);
-  std::string outstring2;
-  read_buf2.ReadString(&outstring2, len2);
-  EXPECT_EQ(0, memcmp(outstring2.c_str(), input, len2));
-}
-
-}  // namespace cricket
diff --git a/p2p/base/stunport.cc b/p2p/base/stunport.cc
deleted file mode 100644
index 5f6889e..0000000
--- a/p2p/base/stunport.cc
+++ /dev/null
@@ -1,516 +0,0 @@
-/*
- *  Copyright 2004 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/p2p/base/stunport.h"
-
-#include "webrtc/p2p/base/common.h"
-#include "webrtc/p2p/base/portallocator.h"
-#include "webrtc/p2p/base/stun.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/helpers.h"
-#include "webrtc/rtc_base/ipaddress.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/nethelpers.h"
-
-namespace cricket {
-
-// TODO: Move these to a common place (used in relayport too)
-const int KEEPALIVE_DELAY = 10 * 1000;  // 10 seconds - sort timeouts
-const int RETRY_TIMEOUT = 50 * 1000;    // 50 seconds
-
-// Handles a binding request sent to the STUN server.
-class StunBindingRequest : public StunRequest {
- public:
-  StunBindingRequest(UDPPort* port,
-                     const rtc::SocketAddress& addr,
-                     int64_t start_time)
-      : port_(port), server_addr_(addr), start_time_(start_time) {}
-
-  virtual ~StunBindingRequest() {
-  }
-
-  const rtc::SocketAddress& server_addr() const { return server_addr_; }
-
-  virtual void Prepare(StunMessage* request) override {
-    request->SetType(STUN_BINDING_REQUEST);
-  }
-
-  virtual void OnResponse(StunMessage* response) override {
-    const StunAddressAttribute* addr_attr =
-        response->GetAddress(STUN_ATTR_MAPPED_ADDRESS);
-    if (!addr_attr) {
-      LOG(LS_ERROR) << "Binding response missing mapped address.";
-    } else if (addr_attr->family() != STUN_ADDRESS_IPV4 &&
-               addr_attr->family() != STUN_ADDRESS_IPV6) {
-      LOG(LS_ERROR) << "Binding address has bad family";
-    } else {
-      rtc::SocketAddress addr(addr_attr->ipaddr(), addr_attr->port());
-      port_->OnStunBindingRequestSucceeded(server_addr_, addr);
-    }
-
-    // The keep-alive requests will be stopped after its lifetime has passed.
-    if (WithinLifetime(rtc::TimeMillis())) {
-      port_->requests_.SendDelayed(
-          new StunBindingRequest(port_, server_addr_, start_time_),
-          port_->stun_keepalive_delay());
-    }
-  }
-
-  virtual void OnErrorResponse(StunMessage* response) override {
-    const StunErrorCodeAttribute* attr = response->GetErrorCode();
-    if (!attr) {
-      LOG(LS_ERROR) << "Missing binding response error code.";
-    } else {
-      LOG(LS_ERROR) << "Binding error response:"
-                    << " class=" << attr->eclass()
-                    << " number=" << attr->number() << " reason='"
-                    << attr->reason() << "'";
-    }
-
-    port_->OnStunBindingOrResolveRequestFailed(server_addr_);
-
-    int64_t now = rtc::TimeMillis();
-    if (WithinLifetime(now) &&
-        rtc::TimeDiff(now, start_time_) < RETRY_TIMEOUT) {
-      port_->requests_.SendDelayed(
-          new StunBindingRequest(port_, server_addr_, start_time_),
-          port_->stun_keepalive_delay());
-    }
-  }
-  virtual void OnTimeout() override {
-    LOG(LS_ERROR) << "Binding request timed out from "
-                  << port_->GetLocalAddress().ToSensitiveString() << " ("
-                  << port_->Network()->name() << ")";
-
-    port_->OnStunBindingOrResolveRequestFailed(server_addr_);
-  }
-
- private:
-  // Returns true if |now| is within the lifetime of the request (a negative
-  // lifetime means infinite).
-  bool WithinLifetime(int64_t now) const {
-    int lifetime = port_->stun_keepalive_lifetime();
-    return lifetime < 0 || rtc::TimeDiff(now, start_time_) <= lifetime;
-  }
-  UDPPort* port_;
-  const rtc::SocketAddress server_addr_;
-
-  int64_t start_time_;
-};
-
-UDPPort::AddressResolver::AddressResolver(
-    rtc::PacketSocketFactory* factory)
-    : socket_factory_(factory) {}
-
-UDPPort::AddressResolver::~AddressResolver() {
-  for (ResolverMap::iterator it = resolvers_.begin();
-       it != resolvers_.end(); ++it) {
-    // TODO(guoweis): Change to asynchronous DNS resolution to prevent the hang
-    // when passing true to the Destroy() which is a safer way to avoid the code
-    // unloaded before the thread exits. Please see webrtc bug 5139.
-    it->second->Destroy(false);
-  }
-}
-
-void UDPPort::AddressResolver::Resolve(
-    const rtc::SocketAddress& address) {
-  if (resolvers_.find(address) != resolvers_.end())
-    return;
-
-  rtc::AsyncResolverInterface* resolver =
-      socket_factory_->CreateAsyncResolver();
-  resolvers_.insert(
-      std::pair<rtc::SocketAddress, rtc::AsyncResolverInterface*>(
-          address, resolver));
-
-  resolver->SignalDone.connect(this,
-                               &UDPPort::AddressResolver::OnResolveResult);
-
-  resolver->Start(address);
-}
-
-bool UDPPort::AddressResolver::GetResolvedAddress(
-    const rtc::SocketAddress& input,
-    int family,
-    rtc::SocketAddress* output) const {
-  ResolverMap::const_iterator it = resolvers_.find(input);
-  if (it == resolvers_.end())
-    return false;
-
-  return it->second->GetResolvedAddress(family, output);
-}
-
-void UDPPort::AddressResolver::OnResolveResult(
-    rtc::AsyncResolverInterface* resolver) {
-  for (ResolverMap::iterator it = resolvers_.begin();
-       it != resolvers_.end(); ++it) {
-    if (it->second == resolver) {
-      SignalDone(it->first, resolver->GetError());
-      return;
-    }
-  }
-}
-
-UDPPort::UDPPort(rtc::Thread* thread,
-                 rtc::PacketSocketFactory* factory,
-                 rtc::Network* network,
-                 rtc::AsyncPacketSocket* socket,
-                 const std::string& username,
-                 const std::string& password,
-                 const std::string& origin,
-                 bool emit_local_for_anyaddress)
-    : Port(thread,
-           LOCAL_PORT_TYPE,
-           factory,
-           network,
-           username,
-           password),
-      requests_(thread),
-      socket_(socket),
-      error_(0),
-      ready_(false),
-      stun_keepalive_delay_(KEEPALIVE_DELAY),
-      emit_local_for_anyaddress_(emit_local_for_anyaddress) {
-  requests_.set_origin(origin);
-}
-
-UDPPort::UDPPort(rtc::Thread* thread,
-                 rtc::PacketSocketFactory* factory,
-                 rtc::Network* network,
-                 uint16_t min_port,
-                 uint16_t max_port,
-                 const std::string& username,
-                 const std::string& password,
-                 const std::string& origin,
-                 bool emit_local_for_anyaddress)
-    : Port(thread,
-           LOCAL_PORT_TYPE,
-           factory,
-           network,
-           min_port,
-           max_port,
-           username,
-           password),
-      requests_(thread),
-      socket_(NULL),
-      error_(0),
-      ready_(false),
-      stun_keepalive_delay_(KEEPALIVE_DELAY),
-      emit_local_for_anyaddress_(emit_local_for_anyaddress) {
-  requests_.set_origin(origin);
-}
-
-bool UDPPort::Init() {
-  stun_keepalive_lifetime_ = GetStunKeepaliveLifetime();
-  if (!SharedSocket()) {
-    RTC_DCHECK(socket_ == NULL);
-    socket_ = socket_factory()->CreateUdpSocket(
-        rtc::SocketAddress(Network()->GetBestIP(), 0), min_port(), max_port());
-    if (!socket_) {
-      LOG_J(LS_WARNING, this) << "UDP socket creation failed";
-      return false;
-    }
-    socket_->SignalReadPacket.connect(this, &UDPPort::OnReadPacket);
-  }
-  socket_->SignalSentPacket.connect(this, &UDPPort::OnSentPacket);
-  socket_->SignalReadyToSend.connect(this, &UDPPort::OnReadyToSend);
-  socket_->SignalAddressReady.connect(this, &UDPPort::OnLocalAddressReady);
-  requests_.SignalSendPacket.connect(this, &UDPPort::OnSendPacket);
-  return true;
-}
-
-UDPPort::~UDPPort() {
-  if (!SharedSocket())
-    delete socket_;
-}
-
-void UDPPort::PrepareAddress() {
-  RTC_DCHECK(requests_.empty());
-  if (socket_->GetState() == rtc::AsyncPacketSocket::STATE_BOUND) {
-    OnLocalAddressReady(socket_, socket_->GetLocalAddress());
-  }
-}
-
-void UDPPort::MaybePrepareStunCandidate() {
-  // Sending binding request to the STUN server if address is available to
-  // prepare STUN candidate.
-  if (!server_addresses_.empty()) {
-    SendStunBindingRequests();
-  } else {
-    // Port is done allocating candidates.
-    MaybeSetPortCompleteOrError();
-  }
-}
-
-Connection* UDPPort::CreateConnection(const Candidate& address,
-                                      CandidateOrigin origin) {
-  if (!SupportsProtocol(address.protocol())) {
-    return NULL;
-  }
-
-  if (!IsCompatibleAddress(address.address())) {
-    return NULL;
-  }
-
-  if (SharedSocket() && Candidates()[0].type() != LOCAL_PORT_TYPE) {
-    RTC_NOTREACHED();
-    return NULL;
-  }
-
-  Connection* conn = new ProxyConnection(this, 0, address);
-  AddOrReplaceConnection(conn);
-  return conn;
-}
-
-int UDPPort::SendTo(const void* data, size_t size,
-                    const rtc::SocketAddress& addr,
-                    const rtc::PacketOptions& options,
-                    bool payload) {
-  int sent = socket_->SendTo(data, size, addr, options);
-  if (sent < 0) {
-    error_ = socket_->GetError();
-    LOG_J(LS_ERROR, this) << "UDP send of " << size
-                          << " bytes failed with error " << error_;
-  }
-  return sent;
-}
-
-void UDPPort::UpdateNetworkCost() {
-  Port::UpdateNetworkCost();
-  stun_keepalive_lifetime_ = GetStunKeepaliveLifetime();
-}
-
-int UDPPort::SetOption(rtc::Socket::Option opt, int value) {
-  return socket_->SetOption(opt, value);
-}
-
-int UDPPort::GetOption(rtc::Socket::Option opt, int* value) {
-  return socket_->GetOption(opt, value);
-}
-
-int UDPPort::GetError() {
-  return error_;
-}
-
-void UDPPort::OnLocalAddressReady(rtc::AsyncPacketSocket* socket,
-                                  const rtc::SocketAddress& address) {
-  // When adapter enumeration is disabled and binding to the any address, the
-  // default local address will be issued as a candidate instead if
-  // |emit_local_for_anyaddress| is true. This is to allow connectivity for
-  // applications which absolutely requires a HOST candidate.
-  rtc::SocketAddress addr = address;
-
-  // If MaybeSetDefaultLocalAddress fails, we keep the "any" IP so that at
-  // least the port is listening.
-  MaybeSetDefaultLocalAddress(&addr);
-
-  AddAddress(addr, addr, rtc::SocketAddress(), UDP_PROTOCOL_NAME, "", "",
-             LOCAL_PORT_TYPE, ICE_TYPE_PREFERENCE_HOST, 0, "", false);
-  MaybePrepareStunCandidate();
-}
-
-void UDPPort::OnReadPacket(rtc::AsyncPacketSocket* socket,
-                           const char* data,
-                           size_t size,
-                           const rtc::SocketAddress& remote_addr,
-                           const rtc::PacketTime& packet_time) {
-  RTC_DCHECK(socket == socket_);
-  RTC_DCHECK(!remote_addr.IsUnresolvedIP());
-
-  // Look for a response from the STUN server.
-  // Even if the response doesn't match one of our outstanding requests, we
-  // will eat it because it might be a response to a retransmitted packet, and
-  // we already cleared the request when we got the first response.
-  if (server_addresses_.find(remote_addr) != server_addresses_.end()) {
-    requests_.CheckResponse(data, size);
-    return;
-  }
-
-  if (Connection* conn = GetConnection(remote_addr)) {
-    conn->OnReadPacket(data, size, packet_time);
-  } else {
-    Port::OnReadPacket(data, size, remote_addr, PROTO_UDP);
-  }
-}
-
-void UDPPort::OnSentPacket(rtc::AsyncPacketSocket* socket,
-                           const rtc::SentPacket& sent_packet) {
-  PortInterface::SignalSentPacket(sent_packet);
-}
-
-void UDPPort::OnReadyToSend(rtc::AsyncPacketSocket* socket) {
-  Port::OnReadyToSend();
-}
-
-void UDPPort::SendStunBindingRequests() {
-  // We will keep pinging the stun server to make sure our NAT pin-hole stays
-  // open until the deadline (specified in SendStunBindingRequest).
-  RTC_DCHECK(requests_.empty());
-
-  for (ServerAddresses::const_iterator it = server_addresses_.begin();
-       it != server_addresses_.end(); ++it) {
-    SendStunBindingRequest(*it);
-  }
-}
-
-void UDPPort::ResolveStunAddress(const rtc::SocketAddress& stun_addr) {
-  if (!resolver_) {
-    resolver_.reset(new AddressResolver(socket_factory()));
-    resolver_->SignalDone.connect(this, &UDPPort::OnResolveResult);
-  }
-
-  LOG_J(LS_INFO, this) << "Starting STUN host lookup for "
-                       << stun_addr.ToSensitiveString();
-  resolver_->Resolve(stun_addr);
-}
-
-void UDPPort::OnResolveResult(const rtc::SocketAddress& input,
-                              int error) {
-  RTC_DCHECK(resolver_.get() != NULL);
-
-  rtc::SocketAddress resolved;
-  if (error != 0 || !resolver_->GetResolvedAddress(
-                        input, Network()->GetBestIP().family(), &resolved)) {
-    LOG_J(LS_WARNING, this) << "StunPort: stun host lookup received error "
-                            << error;
-    OnStunBindingOrResolveRequestFailed(input);
-    return;
-  }
-
-  server_addresses_.erase(input);
-
-  if (server_addresses_.find(resolved) == server_addresses_.end()) {
-    server_addresses_.insert(resolved);
-    SendStunBindingRequest(resolved);
-  }
-}
-
-void UDPPort::SendStunBindingRequest(const rtc::SocketAddress& stun_addr) {
-  if (stun_addr.IsUnresolvedIP()) {
-    ResolveStunAddress(stun_addr);
-
-  } else if (socket_->GetState() == rtc::AsyncPacketSocket::STATE_BOUND) {
-    // Check if |server_addr_| is compatible with the port's ip.
-    if (IsCompatibleAddress(stun_addr)) {
-      requests_.Send(
-          new StunBindingRequest(this, stun_addr, rtc::TimeMillis()));
-    } else {
-      // Since we can't send stun messages to the server, we should mark this
-      // port ready.
-      LOG(LS_WARNING) << "STUN server address is incompatible.";
-      OnStunBindingOrResolveRequestFailed(stun_addr);
-    }
-  }
-}
-
-bool UDPPort::MaybeSetDefaultLocalAddress(rtc::SocketAddress* addr) const {
-  if (!addr->IsAnyIP() || !emit_local_for_anyaddress_ ||
-      !Network()->default_local_address_provider()) {
-    return true;
-  }
-  rtc::IPAddress default_address;
-  bool result =
-      Network()->default_local_address_provider()->GetDefaultLocalAddress(
-          addr->family(), &default_address);
-  if (!result || default_address.IsNil()) {
-    return false;
-  }
-
-  addr->SetIP(default_address);
-  return true;
-}
-
-void UDPPort::OnStunBindingRequestSucceeded(
-    const rtc::SocketAddress& stun_server_addr,
-    const rtc::SocketAddress& stun_reflected_addr) {
-  if (bind_request_succeeded_servers_.find(stun_server_addr) !=
-          bind_request_succeeded_servers_.end()) {
-    return;
-  }
-  bind_request_succeeded_servers_.insert(stun_server_addr);
-
-  // If socket is shared and |stun_reflected_addr| is equal to local socket
-  // address, or if the same address has been added by another STUN server,
-  // then discarding the stun address.
-  // For STUN, related address is the local socket address.
-  if ((!SharedSocket() || stun_reflected_addr != socket_->GetLocalAddress()) &&
-      !HasCandidateWithAddress(stun_reflected_addr)) {
-
-    rtc::SocketAddress related_address = socket_->GetLocalAddress();
-    // If we can't stamp the related address correctly, empty it to avoid leak.
-    if (!MaybeSetDefaultLocalAddress(&related_address)) {
-      related_address = rtc::EmptySocketAddressWithFamily(
-          related_address.family());
-    }
-
-    std::ostringstream url;
-    url << "stun:" << stun_server_addr.ipaddr().ToString() << ":"
-        << stun_server_addr.port();
-    AddAddress(stun_reflected_addr, socket_->GetLocalAddress(), related_address,
-               UDP_PROTOCOL_NAME, "", "", STUN_PORT_TYPE,
-               ICE_TYPE_PREFERENCE_SRFLX, 0, url.str(), false);
-  }
-  MaybeSetPortCompleteOrError();
-}
-
-void UDPPort::OnStunBindingOrResolveRequestFailed(
-    const rtc::SocketAddress& stun_server_addr) {
-  if (bind_request_failed_servers_.find(stun_server_addr) !=
-          bind_request_failed_servers_.end()) {
-    return;
-  }
-  bind_request_failed_servers_.insert(stun_server_addr);
-  MaybeSetPortCompleteOrError();
-}
-
-void UDPPort::MaybeSetPortCompleteOrError() {
-  if (ready_)
-    return;
-
-  // Do not set port ready if we are still waiting for bind responses.
-  const size_t servers_done_bind_request = bind_request_failed_servers_.size() +
-      bind_request_succeeded_servers_.size();
-  if (server_addresses_.size() != servers_done_bind_request) {
-    return;
-  }
-
-  // Setting ready status.
-  ready_ = true;
-
-  // The port is "completed" if there is no stun server provided, or the bind
-  // request succeeded for any stun server, or the socket is shared.
-  if (server_addresses_.empty() ||
-      bind_request_succeeded_servers_.size() > 0 ||
-      SharedSocket()) {
-    SignalPortComplete(this);
-  } else {
-    SignalPortError(this);
-  }
-}
-
-// TODO: merge this with SendTo above.
-void UDPPort::OnSendPacket(const void* data, size_t size, StunRequest* req) {
-  StunBindingRequest* sreq = static_cast<StunBindingRequest*>(req);
-  rtc::PacketOptions options(DefaultDscpValue());
-  if (socket_->SendTo(data, size, sreq->server_addr(), options) < 0)
-    PLOG(LERROR, socket_->GetError()) << "sendto";
-}
-
-bool UDPPort::HasCandidateWithAddress(const rtc::SocketAddress& addr) const {
-  const std::vector<Candidate>& existing_candidates = Candidates();
-  std::vector<Candidate>::const_iterator it = existing_candidates.begin();
-  for (; it != existing_candidates.end(); ++it) {
-    if (it->address() == addr)
-      return true;
-  }
-  return false;
-}
-
-}  // namespace cricket
diff --git a/p2p/base/stunport.h b/p2p/base/stunport.h
deleted file mode 100644
index 8fbc0d5..0000000
--- a/p2p/base/stunport.h
+++ /dev/null
@@ -1,308 +0,0 @@
-/*
- *  Copyright 2004 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_P2P_BASE_STUNPORT_H_
-#define WEBRTC_P2P_BASE_STUNPORT_H_
-
-#include <memory>
-#include <string>
-
-#include "webrtc/p2p/base/port.h"
-#include "webrtc/p2p/base/stunrequest.h"
-#include "webrtc/rtc_base/asyncpacketsocket.h"
-
-// TODO(mallinath) - Rename stunport.cc|h to udpport.cc|h.
-namespace rtc {
-class AsyncResolver;
-class SignalThread;
-}
-
-namespace cricket {
-
-// Lifetime chosen for STUN ports on low-cost networks.
-static const int INFINITE_LIFETIME = -1;
-// Lifetime for STUN ports on high-cost networks: 2 minutes
-static const int HIGH_COST_PORT_KEEPALIVE_LIFETIME = 2 * 60 * 1000;
-
-// Communicates using the address on the outside of a NAT.
-class UDPPort : public Port {
- public:
-  static UDPPort* Create(rtc::Thread* thread,
-                         rtc::PacketSocketFactory* factory,
-                         rtc::Network* network,
-                         rtc::AsyncPacketSocket* socket,
-                         const std::string& username,
-                         const std::string& password,
-                         const std::string& origin,
-                         bool emit_local_for_anyaddress) {
-    UDPPort* port = new UDPPort(thread, factory, network, socket, username,
-                                password, origin, emit_local_for_anyaddress);
-    if (!port->Init()) {
-      delete port;
-      port = NULL;
-    }
-    return port;
-  }
-
-  static UDPPort* Create(rtc::Thread* thread,
-                         rtc::PacketSocketFactory* factory,
-                         rtc::Network* network,
-                         uint16_t min_port,
-                         uint16_t max_port,
-                         const std::string& username,
-                         const std::string& password,
-                         const std::string& origin,
-                         bool emit_local_for_anyaddress) {
-    UDPPort* port =
-        new UDPPort(thread, factory, network, min_port, max_port, username,
-                    password, origin, emit_local_for_anyaddress);
-    if (!port->Init()) {
-      delete port;
-      port = NULL;
-    }
-    return port;
-  }
-
-  virtual ~UDPPort();
-
-  rtc::SocketAddress GetLocalAddress() const {
-    return socket_->GetLocalAddress();
-  }
-
-  const ServerAddresses& server_addresses() const {
-    return server_addresses_;
-  }
-  void set_server_addresses(const ServerAddresses& addresses) {
-    server_addresses_ = addresses;
-  }
-
-  virtual void PrepareAddress();
-
-  virtual Connection* CreateConnection(const Candidate& address,
-                                       CandidateOrigin origin);
-  virtual int SetOption(rtc::Socket::Option opt, int value);
-  virtual int GetOption(rtc::Socket::Option opt, int* value);
-  virtual int GetError();
-
-  virtual bool HandleIncomingPacket(
-      rtc::AsyncPacketSocket* socket, const char* data, size_t size,
-      const rtc::SocketAddress& remote_addr,
-      const rtc::PacketTime& packet_time) {
-    // All packets given to UDP port will be consumed.
-    OnReadPacket(socket, data, size, remote_addr, packet_time);
-    return true;
-  }
-  virtual bool SupportsProtocol(const std::string& protocol) const {
-    return protocol == UDP_PROTOCOL_NAME;
-  }
-
-  virtual ProtocolType GetProtocol() const { return PROTO_UDP; }
-
-  void set_stun_keepalive_delay(int delay) {
-    stun_keepalive_delay_ = delay;
-  }
-  int stun_keepalive_delay() const {
-    return stun_keepalive_delay_;
-  }
-
-  // Visible for testing.
-  int stun_keepalive_lifetime() const { return stun_keepalive_lifetime_; }
-  void set_stun_keepalive_lifetime(int lifetime) {
-    stun_keepalive_lifetime_ = lifetime;
-  }
-  // Returns true if there is a pending request with type |msg_type|.
-  bool HasPendingRequest(int msg_type) {
-    return requests_.HasRequest(msg_type);
-  }
-
- protected:
-  UDPPort(rtc::Thread* thread,
-          rtc::PacketSocketFactory* factory,
-          rtc::Network* network,
-          uint16_t min_port,
-          uint16_t max_port,
-          const std::string& username,
-          const std::string& password,
-          const std::string& origin,
-          bool emit_local_for_anyaddress);
-
-  UDPPort(rtc::Thread* thread,
-          rtc::PacketSocketFactory* factory,
-          rtc::Network* network,
-          rtc::AsyncPacketSocket* socket,
-          const std::string& username,
-          const std::string& password,
-          const std::string& origin,
-          bool emit_local_for_anyaddress);
-
-  bool Init();
-
-  virtual int SendTo(const void* data, size_t size,
-                     const rtc::SocketAddress& addr,
-                     const rtc::PacketOptions& options,
-                     bool payload);
-
-  virtual void UpdateNetworkCost();
-
-  void OnLocalAddressReady(rtc::AsyncPacketSocket* socket,
-                           const rtc::SocketAddress& address);
-  void OnReadPacket(rtc::AsyncPacketSocket* socket,
-                    const char* data, size_t size,
-                    const rtc::SocketAddress& remote_addr,
-                    const rtc::PacketTime& packet_time);
-
-  void OnSentPacket(rtc::AsyncPacketSocket* socket,
-                    const rtc::SentPacket& sent_packet);
-
-  void OnReadyToSend(rtc::AsyncPacketSocket* socket);
-
-  // This method will send STUN binding request if STUN server address is set.
-  void MaybePrepareStunCandidate();
-
-  void SendStunBindingRequests();
-
-  // Helper function which will set |addr|'s IP to the default local address if
-  // |addr| is the "any" address and |emit_local_for_anyaddress_| is true. When
-  // returning false, it indicates that the operation has failed and the
-  // address shouldn't be used by any candidate.
-  bool MaybeSetDefaultLocalAddress(rtc::SocketAddress* addr) const;
-
- private:
-  // A helper class which can be called repeatedly to resolve multiple
-  // addresses, as opposed to rtc::AsyncResolverInterface, which can only
-  // resolve one address per instance.
-  class AddressResolver : public sigslot::has_slots<> {
-   public:
-    explicit AddressResolver(rtc::PacketSocketFactory* factory);
-    ~AddressResolver();
-
-    void Resolve(const rtc::SocketAddress& address);
-    bool GetResolvedAddress(const rtc::SocketAddress& input,
-                            int family,
-                            rtc::SocketAddress* output) const;
-
-    // The signal is sent when resolving the specified address is finished. The
-    // first argument is the input address, the second argument is the error
-    // or 0 if it succeeded.
-    sigslot::signal2<const rtc::SocketAddress&, int> SignalDone;
-
-   private:
-    typedef std::map<rtc::SocketAddress,
-                     rtc::AsyncResolverInterface*> ResolverMap;
-
-    void OnResolveResult(rtc::AsyncResolverInterface* resolver);
-
-    rtc::PacketSocketFactory* socket_factory_;
-    ResolverMap resolvers_;
-  };
-
-  // DNS resolution of the STUN server.
-  void ResolveStunAddress(const rtc::SocketAddress& stun_addr);
-  void OnResolveResult(const rtc::SocketAddress& input, int error);
-
-  void SendStunBindingRequest(const rtc::SocketAddress& stun_addr);
-
-  // Below methods handles binding request responses.
-  void OnStunBindingRequestSucceeded(
-      const rtc::SocketAddress& stun_server_addr,
-      const rtc::SocketAddress& stun_reflected_addr);
-  void OnStunBindingOrResolveRequestFailed(
-      const rtc::SocketAddress& stun_server_addr);
-
-  // Sends STUN requests to the server.
-  void OnSendPacket(const void* data, size_t size, StunRequest* req);
-
-  // TODO(mallinaht) - Move this up to cricket::Port when SignalAddressReady is
-  // changed to SignalPortReady.
-  void MaybeSetPortCompleteOrError();
-
-  bool HasCandidateWithAddress(const rtc::SocketAddress& addr) const;
-
-  // If this is a low-cost network, it will keep on sending STUN binding
-  // requests indefinitely to keep the NAT binding alive. Otherwise, stop
-  // sending STUN binding requests after HIGH_COST_PORT_KEEPALIVE_LIFETIME.
-  int GetStunKeepaliveLifetime() {
-    return (network_cost() >= rtc::kNetworkCostHigh)
-               ? HIGH_COST_PORT_KEEPALIVE_LIFETIME
-               : INFINITE_LIFETIME;
-  }
-
-  ServerAddresses server_addresses_;
-  ServerAddresses bind_request_succeeded_servers_;
-  ServerAddresses bind_request_failed_servers_;
-  StunRequestManager requests_;
-  rtc::AsyncPacketSocket* socket_;
-  int error_;
-  std::unique_ptr<AddressResolver> resolver_;
-  bool ready_;
-  int stun_keepalive_delay_;
-  int stun_keepalive_lifetime_ = INFINITE_LIFETIME;
-
-  // This is true by default and false when
-  // PORTALLOCATOR_DISABLE_DEFAULT_LOCAL_CANDIDATE is specified.
-  bool emit_local_for_anyaddress_;
-
-  friend class StunBindingRequest;
-};
-
-class StunPort : public UDPPort {
- public:
-  static StunPort* Create(rtc::Thread* thread,
-                          rtc::PacketSocketFactory* factory,
-                          rtc::Network* network,
-                          uint16_t min_port,
-                          uint16_t max_port,
-                          const std::string& username,
-                          const std::string& password,
-                          const ServerAddresses& servers,
-                          const std::string& origin) {
-    StunPort* port = new StunPort(thread, factory, network, min_port, max_port,
-                                  username, password, servers, origin);
-    if (!port->Init()) {
-      delete port;
-      port = NULL;
-    }
-    return port;
-  }
-
-  virtual ~StunPort() {}
-
-  virtual void PrepareAddress() {
-    SendStunBindingRequests();
-  }
-
- protected:
-  StunPort(rtc::Thread* thread,
-           rtc::PacketSocketFactory* factory,
-           rtc::Network* network,
-           uint16_t min_port,
-           uint16_t max_port,
-           const std::string& username,
-           const std::string& password,
-           const ServerAddresses& servers,
-           const std::string& origin)
-      : UDPPort(thread,
-                factory,
-                network,
-                min_port,
-                max_port,
-                username,
-                password,
-                origin,
-                false) {
-    // UDPPort will set these to local udp, updating these to STUN.
-    set_type(STUN_PORT_TYPE);
-    set_server_addresses(servers);
-  }
-};
-
-}  // namespace cricket
-
-#endif  // WEBRTC_P2P_BASE_STUNPORT_H_
diff --git a/p2p/base/stunport_unittest.cc b/p2p/base/stunport_unittest.cc
deleted file mode 100644
index e994f67..0000000
--- a/p2p/base/stunport_unittest.cc
+++ /dev/null
@@ -1,385 +0,0 @@
-/*
- *  Copyright 2009 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 <memory>
-
-#include "webrtc/p2p/base/basicpacketsocketfactory.h"
-#include "webrtc/p2p/base/stunport.h"
-#include "webrtc/p2p/base/teststunserver.h"
-#include "webrtc/rtc_base/gunit.h"
-#include "webrtc/rtc_base/helpers.h"
-#include "webrtc/rtc_base/socketaddress.h"
-#include "webrtc/rtc_base/ssladapter.h"
-#include "webrtc/rtc_base/virtualsocketserver.h"
-
-using cricket::ServerAddresses;
-using rtc::SocketAddress;
-
-static const SocketAddress kLocalAddr("127.0.0.1", 0);
-static const SocketAddress kStunAddr1("127.0.0.1", 5000);
-static const SocketAddress kStunAddr2("127.0.0.1", 4000);
-static const SocketAddress kStunAddr3("127.0.0.1", 3000);
-static const SocketAddress kBadAddr("0.0.0.1", 5000);
-static const SocketAddress kStunHostnameAddr("localhost", 5000);
-static const SocketAddress kBadHostnameAddr("not-a-real-hostname", 5000);
-// STUN timeout (with all retries) is cricket::STUN_TOTAL_TIMEOUT.
-// Add some margin of error for slow bots.
-static const int kTimeoutMs = cricket::STUN_TOTAL_TIMEOUT;
-// stun prio = 100 << 24 | 30 (IPV4) << 8 | 256 - 0
-static const uint32_t kStunCandidatePriority = 1677729535;
-static const int kInfiniteLifetime = -1;
-static const int kHighCostPortKeepaliveLifetimeMs = 2 * 60 * 1000;
-
-// Tests connecting a StunPort to a fake STUN server (cricket::StunServer)
-class StunPortTestBase : public testing::Test, public sigslot::has_slots<> {
- public:
-  StunPortTestBase()
-      : ss_(new rtc::VirtualSocketServer()),
-        thread_(ss_.get()),
-        network_("unittest", "unittest", kLocalAddr.ipaddr(), 32),
-        socket_factory_(rtc::Thread::Current()),
-        stun_server_1_(cricket::TestStunServer::Create(rtc::Thread::Current(),
-                                                       kStunAddr1)),
-        stun_server_2_(cricket::TestStunServer::Create(rtc::Thread::Current(),
-                                                       kStunAddr2)),
-        done_(false),
-        error_(false),
-        stun_keepalive_delay_(1),
-        stun_keepalive_lifetime_(-1) {
-    network_.AddIP(kLocalAddr.ipaddr());
-  }
-
-  cricket::UDPPort* port() const { return stun_port_.get(); }
-  bool done() const { return done_; }
-  bool error() const { return error_; }
-
-  void SetNetworkType(rtc::AdapterType adapter_type) {
-    network_.set_type(adapter_type);
-  }
-
-  void CreateStunPort(const rtc::SocketAddress& server_addr) {
-    ServerAddresses stun_servers;
-    stun_servers.insert(server_addr);
-    CreateStunPort(stun_servers);
-  }
-
-  void CreateStunPort(const ServerAddresses& stun_servers) {
-    stun_port_.reset(cricket::StunPort::Create(
-        rtc::Thread::Current(), &socket_factory_, &network_, 0, 0,
-        rtc::CreateRandomString(16), rtc::CreateRandomString(22), stun_servers,
-        std::string()));
-    stun_port_->set_stun_keepalive_delay(stun_keepalive_delay_);
-    // If |stun_keepalive_lifetime_| is negative, let the stun port
-    // choose its lifetime from the network type.
-    if (stun_keepalive_lifetime_ >= 0) {
-      stun_port_->set_stun_keepalive_lifetime(stun_keepalive_lifetime_);
-    }
-    stun_port_->SignalPortComplete.connect(this,
-                                           &StunPortTestBase::OnPortComplete);
-    stun_port_->SignalPortError.connect(this, &StunPortTestBase::OnPortError);
-  }
-
-  void CreateSharedUdpPort(const rtc::SocketAddress& server_addr) {
-    socket_.reset(socket_factory_.CreateUdpSocket(
-        rtc::SocketAddress(kLocalAddr.ipaddr(), 0), 0, 0));
-    ASSERT_TRUE(socket_ != NULL);
-    socket_->SignalReadPacket.connect(this, &StunPortTestBase::OnReadPacket);
-    stun_port_.reset(cricket::UDPPort::Create(
-        rtc::Thread::Current(), &socket_factory_,
-        &network_, socket_.get(),
-        rtc::CreateRandomString(16), rtc::CreateRandomString(22),
-        std::string(), false));
-    ASSERT_TRUE(stun_port_ != NULL);
-    ServerAddresses stun_servers;
-    stun_servers.insert(server_addr);
-    stun_port_->set_server_addresses(stun_servers);
-    stun_port_->SignalPortComplete.connect(this,
-                                           &StunPortTestBase::OnPortComplete);
-    stun_port_->SignalPortError.connect(this, &StunPortTestBase::OnPortError);
-  }
-
-  void PrepareAddress() {
-    stun_port_->PrepareAddress();
-  }
-
-  void OnReadPacket(rtc::AsyncPacketSocket* socket, const char* data,
-                    size_t size, const rtc::SocketAddress& remote_addr,
-                    const rtc::PacketTime& packet_time) {
-    stun_port_->HandleIncomingPacket(
-        socket, data, size, remote_addr, rtc::PacketTime());
-  }
-
-  void SendData(const char* data, size_t len) {
-    stun_port_->HandleIncomingPacket(
-        socket_.get(), data, len, rtc::SocketAddress("22.22.22.22", 0),
-        rtc::PacketTime());
-  }
-
- protected:
-  static void SetUpTestCase() {
-    // Ensure the RNG is inited.
-    rtc::InitRandom(NULL, 0);
-
-  }
-
-  void OnPortComplete(cricket::Port* port) {
-    ASSERT_FALSE(done_);
-    done_ = true;
-    error_ = false;
-  }
-  void OnPortError(cricket::Port* port) {
-    done_ = true;
-    error_ = true;
-  }
-  void SetKeepaliveDelay(int delay) {
-    stun_keepalive_delay_ = delay;
-  }
-
-  void SetKeepaliveLifetime(int lifetime) {
-    stun_keepalive_lifetime_ = lifetime;
-  }
-
-  cricket::TestStunServer* stun_server_1() {
-    return stun_server_1_.get();
-  }
-  cricket::TestStunServer* stun_server_2() {
-    return stun_server_2_.get();
-  }
-
- private:
-  std::unique_ptr<rtc::VirtualSocketServer> ss_;
-  rtc::AutoSocketServerThread thread_;
-  rtc::Network network_;
-  rtc::BasicPacketSocketFactory socket_factory_;
-  std::unique_ptr<cricket::UDPPort> stun_port_;
-  std::unique_ptr<cricket::TestStunServer> stun_server_1_;
-  std::unique_ptr<cricket::TestStunServer> stun_server_2_;
-  std::unique_ptr<rtc::AsyncPacketSocket> socket_;
-  bool done_;
-  bool error_;
-  int stun_keepalive_delay_;
-  int stun_keepalive_lifetime_;
-};
-
-class StunPortTestWithRealClock : public StunPortTestBase {};
-
-class FakeClockBase {
- public:
-  rtc::ScopedFakeClock fake_clock;
-};
-
-class StunPortTest : public FakeClockBase, public StunPortTestBase {};
-
-// Test that we can create a STUN port.
-TEST_F(StunPortTest, TestCreateStunPort) {
-  CreateStunPort(kStunAddr1);
-  EXPECT_EQ("stun", port()->Type());
-  EXPECT_EQ(0U, port()->Candidates().size());
-}
-
-// Test that we can create a UDP port.
-TEST_F(StunPortTest, TestCreateUdpPort) {
-  CreateSharedUdpPort(kStunAddr1);
-  EXPECT_EQ("local", port()->Type());
-  EXPECT_EQ(0U, port()->Candidates().size());
-}
-
-// Test that we can get an address from a STUN server.
-TEST_F(StunPortTest, TestPrepareAddress) {
-  CreateStunPort(kStunAddr1);
-  PrepareAddress();
-  EXPECT_TRUE_SIMULATED_WAIT(done(), kTimeoutMs, fake_clock);
-  ASSERT_EQ(1U, port()->Candidates().size());
-  EXPECT_TRUE(kLocalAddr.EqualIPs(port()->Candidates()[0].address()));
-  std::string expected_server_url = "stun:127.0.0.1:5000";
-  EXPECT_EQ(port()->Candidates()[0].url(), expected_server_url);
-
-  // TODO(deadbeef): Add IPv6 tests here.
-}
-
-// Test that we fail properly if we can't get an address.
-TEST_F(StunPortTest, TestPrepareAddressFail) {
-  CreateStunPort(kBadAddr);
-  PrepareAddress();
-  EXPECT_TRUE_SIMULATED_WAIT(done(), kTimeoutMs, fake_clock);
-  EXPECT_TRUE(error());
-  EXPECT_EQ(0U, port()->Candidates().size());
-}
-
-// Test that we can get an address from a STUN server specified by a hostname.
-// Crashes on Linux, see webrtc:7416
-#if defined(WEBRTC_LINUX)
-#define MAYBE_TestPrepareAddressHostname DISABLED_TestPrepareAddressHostname
-#else
-#define MAYBE_TestPrepareAddressHostname TestPrepareAddressHostname
-#endif
-TEST_F(StunPortTest, MAYBE_TestPrepareAddressHostname) {
-  CreateStunPort(kStunHostnameAddr);
-  PrepareAddress();
-  EXPECT_TRUE_SIMULATED_WAIT(done(), kTimeoutMs, fake_clock);
-  ASSERT_EQ(1U, port()->Candidates().size());
-  EXPECT_TRUE(kLocalAddr.EqualIPs(port()->Candidates()[0].address()));
-  EXPECT_EQ(kStunCandidatePriority, port()->Candidates()[0].priority());
-}
-
-// Test that we handle hostname lookup failures properly.
-TEST_F(StunPortTestWithRealClock, TestPrepareAddressHostnameFail) {
-  CreateStunPort(kBadHostnameAddr);
-  PrepareAddress();
-  EXPECT_TRUE_WAIT(done(), kTimeoutMs);
-  EXPECT_TRUE(error());
-  EXPECT_EQ(0U, port()->Candidates().size());
-}
-
-// This test verifies keepalive response messages don't result in
-// additional candidate generation.
-TEST_F(StunPortTest, TestKeepAliveResponse) {
-  SetKeepaliveDelay(500);  // 500ms of keepalive delay.
-  CreateStunPort(kStunAddr1);
-  PrepareAddress();
-  EXPECT_TRUE_SIMULATED_WAIT(done(), kTimeoutMs, fake_clock);
-  ASSERT_EQ(1U, port()->Candidates().size());
-  EXPECT_TRUE(kLocalAddr.EqualIPs(port()->Candidates()[0].address()));
-  SIMULATED_WAIT(false, 1000, fake_clock);
-  EXPECT_EQ(1U, port()->Candidates().size());
-}
-
-// Test that a local candidate can be generated using a shared socket.
-TEST_F(StunPortTest, TestSharedSocketPrepareAddress) {
-  CreateSharedUdpPort(kStunAddr1);
-  PrepareAddress();
-  EXPECT_TRUE_SIMULATED_WAIT(done(), kTimeoutMs, fake_clock);
-  ASSERT_EQ(1U, port()->Candidates().size());
-  EXPECT_TRUE(kLocalAddr.EqualIPs(port()->Candidates()[0].address()));
-}
-
-// Test that we still a get a local candidate with invalid stun server hostname.
-// Also verifing that UDPPort can receive packets when stun address can't be
-// resolved.
-TEST_F(StunPortTestWithRealClock,
-       TestSharedSocketPrepareAddressInvalidHostname) {
-  CreateSharedUdpPort(kBadHostnameAddr);
-  PrepareAddress();
-  EXPECT_TRUE_WAIT(done(), kTimeoutMs);
-  ASSERT_EQ(1U, port()->Candidates().size());
-  EXPECT_TRUE(kLocalAddr.EqualIPs(port()->Candidates()[0].address()));
-
-  // Send data to port after it's ready. This is to make sure, UDP port can
-  // handle data with unresolved stun server address.
-  std::string data = "some random data, sending to cricket::Port.";
-  SendData(data.c_str(), data.length());
-  // No crash is success.
-}
-
-// Test that the same address is added only once if two STUN servers are in use.
-TEST_F(StunPortTest, TestNoDuplicatedAddressWithTwoStunServers) {
-  ServerAddresses stun_servers;
-  stun_servers.insert(kStunAddr1);
-  stun_servers.insert(kStunAddr2);
-  CreateStunPort(stun_servers);
-  EXPECT_EQ("stun", port()->Type());
-  PrepareAddress();
-  EXPECT_TRUE_SIMULATED_WAIT(done(), kTimeoutMs, fake_clock);
-  EXPECT_EQ(1U, port()->Candidates().size());
-  EXPECT_EQ(port()->Candidates()[0].relay_protocol(), "");
-}
-
-// Test that candidates can be allocated for multiple STUN servers, one of which
-// is not reachable.
-TEST_F(StunPortTest, TestMultipleStunServersWithBadServer) {
-  ServerAddresses stun_servers;
-  stun_servers.insert(kStunAddr1);
-  stun_servers.insert(kBadAddr);
-  CreateStunPort(stun_servers);
-  EXPECT_EQ("stun", port()->Type());
-  PrepareAddress();
-  EXPECT_TRUE_SIMULATED_WAIT(done(), kTimeoutMs, fake_clock);
-  EXPECT_EQ(1U, port()->Candidates().size());
-}
-
-// Test that two candidates are allocated if the two STUN servers return
-// different mapped addresses.
-TEST_F(StunPortTest, TestTwoCandidatesWithTwoStunServersAcrossNat) {
-  const SocketAddress kStunMappedAddr1("77.77.77.77", 0);
-  const SocketAddress kStunMappedAddr2("88.77.77.77", 0);
-  stun_server_1()->set_fake_stun_addr(kStunMappedAddr1);
-  stun_server_2()->set_fake_stun_addr(kStunMappedAddr2);
-
-  ServerAddresses stun_servers;
-  stun_servers.insert(kStunAddr1);
-  stun_servers.insert(kStunAddr2);
-  CreateStunPort(stun_servers);
-  EXPECT_EQ("stun", port()->Type());
-  PrepareAddress();
-  EXPECT_TRUE_SIMULATED_WAIT(done(), kTimeoutMs, fake_clock);
-  EXPECT_EQ(2U, port()->Candidates().size());
-  EXPECT_EQ(port()->Candidates()[0].relay_protocol(), "");
-  EXPECT_EQ(port()->Candidates()[1].relay_protocol(), "");
-}
-
-// Test that the stun_keepalive_lifetime is set correctly based on the network
-// type on a STUN port. Also test that it will be updated if the network type
-// changes.
-TEST_F(StunPortTest, TestStunPortGetStunKeepaliveLifetime) {
-  // Lifetime for the default (unknown) network type is |kInfiniteLifetime|.
-  CreateStunPort(kStunAddr1);
-  EXPECT_EQ(kInfiniteLifetime, port()->stun_keepalive_lifetime());
-  // Lifetime for the cellular network is |kHighCostPortKeepaliveLifetimeMs|
-  SetNetworkType(rtc::ADAPTER_TYPE_CELLULAR);
-  EXPECT_EQ(kHighCostPortKeepaliveLifetimeMs,
-            port()->stun_keepalive_lifetime());
-
-  // Lifetime for the wifi network is |kInfiniteLifetime|.
-  SetNetworkType(rtc::ADAPTER_TYPE_WIFI);
-  CreateStunPort(kStunAddr2);
-  EXPECT_EQ(kInfiniteLifetime, port()->stun_keepalive_lifetime());
-}
-
-// Test that the stun_keepalive_lifetime is set correctly based on the network
-// type on a shared STUN port (UDPPort). Also test that it will be updated
-// if the network type changes.
-TEST_F(StunPortTest, TestUdpPortGetStunKeepaliveLifetime) {
-  // Lifetime for the default (unknown) network type is |kInfiniteLifetime|.
-  CreateSharedUdpPort(kStunAddr1);
-  EXPECT_EQ(kInfiniteLifetime, port()->stun_keepalive_lifetime());
-  // Lifetime for the cellular network is |kHighCostPortKeepaliveLifetimeMs|.
-  SetNetworkType(rtc::ADAPTER_TYPE_CELLULAR);
-  EXPECT_EQ(kHighCostPortKeepaliveLifetimeMs,
-            port()->stun_keepalive_lifetime());
-
-  // Lifetime for the wifi network type is |kInfiniteLifetime|.
-  SetNetworkType(rtc::ADAPTER_TYPE_WIFI);
-  CreateSharedUdpPort(kStunAddr2);
-  EXPECT_EQ(kInfiniteLifetime, port()->stun_keepalive_lifetime());
-}
-
-// Test that STUN binding requests will be stopped shortly if the keep-alive
-// lifetime is short.
-TEST_F(StunPortTest, TestStunBindingRequestShortLifetime) {
-  SetKeepaliveDelay(101);
-  SetKeepaliveLifetime(100);
-  CreateStunPort(kStunAddr1);
-  PrepareAddress();
-  EXPECT_TRUE_SIMULATED_WAIT(done(), kTimeoutMs, fake_clock);
-  EXPECT_TRUE_SIMULATED_WAIT(
-      !port()->HasPendingRequest(cricket::STUN_BINDING_REQUEST), 2000,
-      fake_clock);
-}
-
-// Test that by default, the STUN binding requests will last for a long time.
-TEST_F(StunPortTest, TestStunBindingRequestLongLifetime) {
-  SetKeepaliveDelay(101);
-  CreateStunPort(kStunAddr1);
-  PrepareAddress();
-  EXPECT_TRUE_SIMULATED_WAIT(done(), kTimeoutMs, fake_clock);
-  EXPECT_TRUE_SIMULATED_WAIT(
-      port()->HasPendingRequest(cricket::STUN_BINDING_REQUEST), 1000,
-      fake_clock);
-}
diff --git a/p2p/base/stunrequest.cc b/p2p/base/stunrequest.cc
deleted file mode 100644
index cace17f..0000000
--- a/p2p/base/stunrequest.cc
+++ /dev/null
@@ -1,260 +0,0 @@
-/*
- *  Copyright 2004 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/p2p/base/stunrequest.h"
-
-#include <algorithm>
-#include <memory>
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/helpers.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/ptr_util.h"
-#include "webrtc/rtc_base/stringencode.h"
-
-namespace cricket {
-
-const uint32_t MSG_STUN_SEND = 1;
-
-// RFC 5389 says SHOULD be 500ms.
-// For years, this was 100ms, but for networks that
-// experience moments of high RTT (such as 2G networks), this doesn't
-// work well.
-const int STUN_INITIAL_RTO = 250;  // milliseconds
-
-// The timeout doubles each retransmission, up to this many times
-// RFC 5389 says SHOULD retransmit 7 times.
-// This has been 8 for years (not sure why).
-const int STUN_MAX_RETRANSMISSIONS = 8;  // Total sends: 9
-
-// We also cap the doubling, even though the standard doesn't say to.
-// This has been 1.6 seconds for years, but for networks that
-// experience moments of high RTT (such as 2G networks), this doesn't
-// work well.
-const int STUN_MAX_RTO = 8000;  // milliseconds, or 5 doublings
-
-StunRequestManager::StunRequestManager(rtc::Thread* thread)
-    : thread_(thread) {
-}
-
-StunRequestManager::~StunRequestManager() {
-  while (requests_.begin() != requests_.end()) {
-    StunRequest *request = requests_.begin()->second;
-    requests_.erase(requests_.begin());
-    delete request;
-  }
-}
-
-void StunRequestManager::Send(StunRequest* request) {
-  SendDelayed(request, 0);
-}
-
-void StunRequestManager::SendDelayed(StunRequest* request, int delay) {
-  request->set_manager(this);
-  RTC_DCHECK(requests_.find(request->id()) == requests_.end());
-  request->set_origin(origin_);
-  request->Construct();
-  requests_[request->id()] = request;
-  if (delay > 0) {
-    thread_->PostDelayed(RTC_FROM_HERE, delay, request, MSG_STUN_SEND, NULL);
-  } else {
-    thread_->Send(RTC_FROM_HERE, request, MSG_STUN_SEND, NULL);
-  }
-}
-
-void StunRequestManager::Flush(int msg_type) {
-  for (const auto kv : requests_) {
-    StunRequest* request = kv.second;
-    if (msg_type == kAllRequests || msg_type == request->type()) {
-      thread_->Clear(request, MSG_STUN_SEND);
-      thread_->Send(RTC_FROM_HERE, request, MSG_STUN_SEND, NULL);
-    }
-  }
-}
-
-bool StunRequestManager::HasRequest(int msg_type) {
-  for (const auto kv : requests_) {
-    StunRequest* request = kv.second;
-    if (msg_type == kAllRequests || msg_type == request->type()) {
-      return true;
-    }
-  }
-  return false;
-}
-
-void StunRequestManager::Remove(StunRequest* request) {
-  RTC_DCHECK(request->manager() == this);
-  RequestMap::iterator iter = requests_.find(request->id());
-  if (iter != requests_.end()) {
-    RTC_DCHECK(iter->second == request);
-    requests_.erase(iter);
-    thread_->Clear(request);
-  }
-}
-
-void StunRequestManager::Clear() {
-  std::vector<StunRequest*> requests;
-  for (RequestMap::iterator i = requests_.begin(); i != requests_.end(); ++i)
-    requests.push_back(i->second);
-
-  for (uint32_t i = 0; i < requests.size(); ++i) {
-    // StunRequest destructor calls Remove() which deletes requests
-    // from |requests_|.
-    delete requests[i];
-  }
-}
-
-bool StunRequestManager::CheckResponse(StunMessage* msg) {
-  RequestMap::iterator iter = requests_.find(msg->transaction_id());
-  if (iter == requests_.end()) {
-    // TODO(pthatcher): Log unknown responses without being too spammy
-    // in the logs.
-    return false;
-  }
-
-  StunRequest* request = iter->second;
-  if (msg->type() == GetStunSuccessResponseType(request->type())) {
-    request->OnResponse(msg);
-  } else if (msg->type() == GetStunErrorResponseType(request->type())) {
-    request->OnErrorResponse(msg);
-  } else {
-    LOG(LERROR) << "Received response with wrong type: " << msg->type()
-                << " (expecting "
-                << GetStunSuccessResponseType(request->type()) << ")";
-    return false;
-  }
-
-  delete request;
-  return true;
-}
-
-bool StunRequestManager::CheckResponse(const char* data, size_t size) {
-  // Check the appropriate bytes of the stream to see if they match the
-  // transaction ID of a response we are expecting.
-
-  if (size < 20)
-    return false;
-
-  std::string id;
-  id.append(data + kStunTransactionIdOffset, kStunTransactionIdLength);
-
-  RequestMap::iterator iter = requests_.find(id);
-  if (iter == requests_.end()) {
-    // TODO(pthatcher): Log unknown responses without being too spammy
-    // in the logs.
-    return false;
-  }
-
-  // Parse the STUN message and continue processing as usual.
-
-  rtc::ByteBufferReader buf(data, size);
-  std::unique_ptr<StunMessage> response(iter->second->msg_->CreateNew());
-  if (!response->Read(&buf)) {
-    LOG(LS_WARNING) << "Failed to read STUN response " << rtc::hex_encode(id);
-    return false;
-  }
-
-  return CheckResponse(response.get());
-}
-
-StunRequest::StunRequest()
-    : count_(0), timeout_(false), manager_(0),
-      msg_(new StunMessage()), tstamp_(0) {
-  msg_->SetTransactionID(
-      rtc::CreateRandomString(kStunTransactionIdLength));
-}
-
-StunRequest::StunRequest(StunMessage* request)
-    : count_(0), timeout_(false), manager_(0),
-      msg_(request), tstamp_(0) {
-  msg_->SetTransactionID(
-      rtc::CreateRandomString(kStunTransactionIdLength));
-}
-
-StunRequest::~StunRequest() {
-  RTC_DCHECK(manager_ != NULL);
-  if (manager_) {
-    manager_->Remove(this);
-    manager_->thread_->Clear(this);
-  }
-  delete msg_;
-}
-
-void StunRequest::Construct() {
-  if (msg_->type() == 0) {
-    if (!origin_.empty()) {
-      msg_->AddAttribute(
-          rtc::MakeUnique<StunByteStringAttribute>(STUN_ATTR_ORIGIN, origin_));
-    }
-    Prepare(msg_);
-    RTC_DCHECK(msg_->type() != 0);
-  }
-}
-
-int StunRequest::type() {
-  RTC_DCHECK(msg_ != NULL);
-  return msg_->type();
-}
-
-const StunMessage* StunRequest::msg() const {
-  return msg_;
-}
-
-int StunRequest::Elapsed() const {
-  return static_cast<int>(rtc::TimeMillis() - tstamp_);
-}
-
-
-void StunRequest::set_manager(StunRequestManager* manager) {
-  RTC_DCHECK(!manager_);
-  manager_ = manager;
-}
-
-void StunRequest::OnMessage(rtc::Message* pmsg) {
-  RTC_DCHECK(manager_ != NULL);
-  RTC_DCHECK(pmsg->message_id == MSG_STUN_SEND);
-
-  if (timeout_) {
-    OnTimeout();
-    delete this;
-    return;
-  }
-
-  tstamp_ = rtc::TimeMillis();
-
-  rtc::ByteBufferWriter buf;
-  msg_->Write(&buf);
-  manager_->SignalSendPacket(buf.Data(), buf.Length(), this);
-
-  OnSent();
-  manager_->thread_->PostDelayed(RTC_FROM_HERE, resend_delay(), this,
-                                 MSG_STUN_SEND, NULL);
-}
-
-void StunRequest::OnSent() {
-  count_ += 1;
-  int retransmissions = (count_ - 1);
-  if (retransmissions >= STUN_MAX_RETRANSMISSIONS) {
-    timeout_ = true;
-  }
-  LOG(LS_VERBOSE) << "Sent STUN request " << count_
-                  << "; resend delay = " << resend_delay();
-}
-
-int StunRequest::resend_delay() {
-  if (count_ == 0) {
-    return 0;
-  }
-  int retransmissions = (count_ - 1);
-  int rto = STUN_INITIAL_RTO << retransmissions;
-  return std::min(rto, STUN_MAX_RTO);
-}
-
-}  // namespace cricket
diff --git a/p2p/base/stunrequest.h b/p2p/base/stunrequest.h
deleted file mode 100644
index a1c6930..0000000
--- a/p2p/base/stunrequest.h
+++ /dev/null
@@ -1,144 +0,0 @@
-/*
- *  Copyright 2004 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_P2P_BASE_STUNREQUEST_H_
-#define WEBRTC_P2P_BASE_STUNREQUEST_H_
-
-#include <map>
-#include <string>
-#include "webrtc/p2p/base/stun.h"
-#include "webrtc/rtc_base/sigslot.h"
-#include "webrtc/rtc_base/thread.h"
-
-namespace cricket {
-
-class StunRequest;
-
-const int kAllRequests = 0;
-
-// Total max timeouts: 39.75 seconds
-// For years, this was 9.5 seconds, but for networks that experience moments of
-// high RTT (such as 40s on 2G networks), this doesn't work well.
-const int STUN_TOTAL_TIMEOUT = 39750;  // milliseconds
-
-// Manages a set of STUN requests, sending and resending until we receive a
-// response or determine that the request has timed out.
-class StunRequestManager {
- public:
-  StunRequestManager(rtc::Thread* thread);
-  ~StunRequestManager();
-
-  // Starts sending the given request (perhaps after a delay).
-  void Send(StunRequest* request);
-  void SendDelayed(StunRequest* request, int delay);
-
-  // If |msg_type| is kAllRequests, sends all pending requests right away.
-  // Otherwise, sends those that have a matching type right away.
-  // Only for testing.
-  void Flush(int msg_type);
-
-  // Returns true if at least one request with |msg_type| is scheduled for
-  // transmission. For testing only.
-  bool HasRequest(int msg_type);
-
-  // Removes a stun request that was added previously.  This will happen
-  // automatically when a request succeeds, fails, or times out.
-  void Remove(StunRequest* request);
-
-  // Removes all stun requests that were added previously.
-  void Clear();
-
-  // Determines whether the given message is a response to one of the
-  // outstanding requests, and if so, processes it appropriately.
-  bool CheckResponse(StunMessage* msg);
-  bool CheckResponse(const char* data, size_t size);
-
-  bool empty() { return requests_.empty(); }
-
-  // Set the Origin header for outgoing stun messages.
-  void set_origin(const std::string& origin) { origin_ = origin; }
-
-  // Raised when there are bytes to be sent.
-  sigslot::signal3<const void*, size_t, StunRequest*> SignalSendPacket;
-
- private:
-  typedef std::map<std::string, StunRequest*> RequestMap;
-
-  rtc::Thread* thread_;
-  RequestMap requests_;
-  std::string origin_;
-
-  friend class StunRequest;
-};
-
-// Represents an individual request to be sent.  The STUN message can either be
-// constructed beforehand or built on demand.
-class StunRequest : public rtc::MessageHandler {
- public:
-  StunRequest();
-  StunRequest(StunMessage* request);
-  virtual ~StunRequest();
-
-  // Causes our wrapped StunMessage to be Prepared
-  void Construct();
-
-  // The manager handling this request (if it has been scheduled for sending).
-  StunRequestManager* manager() { return manager_; }
-
-  // Returns the transaction ID of this request.
-  const std::string& id() { return msg_->transaction_id(); }
-
-  // the origin value
-  const std::string& origin() const { return origin_; }
-  void set_origin(const std::string& origin) { origin_ = origin; }
-
-  // Returns the STUN type of the request message.
-  int type();
-
-  // Returns a const pointer to |msg_|.
-  const StunMessage* msg() const;
-
-  // Time elapsed since last send (in ms)
-  int Elapsed() const;
-
- protected:
-  int count_;
-  bool timeout_;
-  std::string origin_;
-
-  // Fills in a request object to be sent.  Note that request's transaction ID
-  // will already be set and cannot be changed.
-  virtual void Prepare(StunMessage* request) {}
-
-  // Called when the message receives a response or times out.
-  virtual void OnResponse(StunMessage* response) {}
-  virtual void OnErrorResponse(StunMessage* response) {}
-  virtual void OnTimeout() {}
-  // Called when the message is sent.
-  virtual void OnSent();
-  // Returns the next delay for resends.
-  virtual int resend_delay();
-
- private:
-  void set_manager(StunRequestManager* manager);
-
-  // Handles messages for sending and timeout.
-  void OnMessage(rtc::Message* pmsg);
-
-  StunRequestManager* manager_;
-  StunMessage* msg_;
-  int64_t tstamp_;
-
-  friend class StunRequestManager;
-};
-
-}  // namespace cricket
-
-#endif  // WEBRTC_P2P_BASE_STUNREQUEST_H_
diff --git a/p2p/base/stunrequest_unittest.cc b/p2p/base/stunrequest_unittest.cc
deleted file mode 100644
index a4f603b..0000000
--- a/p2p/base/stunrequest_unittest.cc
+++ /dev/null
@@ -1,200 +0,0 @@
-/*
- *  Copyright 2004 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/p2p/base/stunrequest.h"
-#include "webrtc/rtc_base/fakeclock.h"
-#include "webrtc/rtc_base/gunit.h"
-#include "webrtc/rtc_base/helpers.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/ssladapter.h"
-#include "webrtc/rtc_base/timeutils.h"
-
-using namespace cricket;
-
-class StunRequestTest : public testing::Test,
-                        public sigslot::has_slots<> {
- public:
-  StunRequestTest()
-      : manager_(rtc::Thread::Current()),
-        request_count_(0), response_(NULL),
-        success_(false), failure_(false), timeout_(false) {
-    manager_.SignalSendPacket.connect(this, &StunRequestTest::OnSendPacket);
-  }
-
-  void OnSendPacket(const void* data, size_t size, StunRequest* req) {
-    request_count_++;
-  }
-
-  void OnResponse(StunMessage* res) {
-    response_ = res;
-    success_ = true;
-  }
-  void OnErrorResponse(StunMessage* res) {
-    response_ = res;
-    failure_ = true;
-  }
-  void OnTimeout() {
-    timeout_ = true;
-  }
-
- protected:
-  static StunMessage* CreateStunMessage(StunMessageType type,
-                                        StunMessage* req) {
-    StunMessage* msg = new StunMessage();
-    msg->SetType(type);
-    if (req) {
-      msg->SetTransactionID(req->transaction_id());
-    }
-    return msg;
-  }
-  static int TotalDelay(int sends) {
-    std::vector<int> delays = {0,    250,   750,   1750,  3750,
-                               7750, 15750, 23750, 31750, 39750};
-    return delays[sends];
-  }
-
-  StunRequestManager manager_;
-  int request_count_;
-  StunMessage* response_;
-  bool success_;
-  bool failure_;
-  bool timeout_;
-};
-
-// Forwards results to the test class.
-class StunRequestThunker : public StunRequest {
- public:
-  StunRequestThunker(StunMessage* msg, StunRequestTest* test)
-      : StunRequest(msg), test_(test) {}
-  explicit StunRequestThunker(StunRequestTest* test) : test_(test) {}
- private:
-  virtual void OnResponse(StunMessage* res) {
-    test_->OnResponse(res);
-  }
-  virtual void OnErrorResponse(StunMessage* res) {
-    test_->OnErrorResponse(res);
-  }
-  virtual void OnTimeout() {
-    test_->OnTimeout();
-  }
-
-  virtual void Prepare(StunMessage* request) {
-    request->SetType(STUN_BINDING_REQUEST);
-  }
-
-  StunRequestTest* test_;
-};
-
-// Test handling of a normal binding response.
-TEST_F(StunRequestTest, TestSuccess) {
-  StunMessage* req = CreateStunMessage(STUN_BINDING_REQUEST, NULL);
-
-  manager_.Send(new StunRequestThunker(req, this));
-  StunMessage* res = CreateStunMessage(STUN_BINDING_RESPONSE, req);
-  EXPECT_TRUE(manager_.CheckResponse(res));
-
-  EXPECT_TRUE(response_ == res);
-  EXPECT_TRUE(success_);
-  EXPECT_FALSE(failure_);
-  EXPECT_FALSE(timeout_);
-  delete res;
-}
-
-// Test handling of an error binding response.
-TEST_F(StunRequestTest, TestError) {
-  StunMessage* req = CreateStunMessage(STUN_BINDING_REQUEST, NULL);
-
-  manager_.Send(new StunRequestThunker(req, this));
-  StunMessage* res = CreateStunMessage(STUN_BINDING_ERROR_RESPONSE, req);
-  EXPECT_TRUE(manager_.CheckResponse(res));
-
-  EXPECT_TRUE(response_ == res);
-  EXPECT_FALSE(success_);
-  EXPECT_TRUE(failure_);
-  EXPECT_FALSE(timeout_);
-  delete res;
-}
-
-// Test handling of a binding response with the wrong transaction id.
-TEST_F(StunRequestTest, TestUnexpected) {
-  StunMessage* req = CreateStunMessage(STUN_BINDING_REQUEST, NULL);
-
-  manager_.Send(new StunRequestThunker(req, this));
-  StunMessage* res = CreateStunMessage(STUN_BINDING_RESPONSE, NULL);
-  EXPECT_FALSE(manager_.CheckResponse(res));
-
-  EXPECT_TRUE(response_ == NULL);
-  EXPECT_FALSE(success_);
-  EXPECT_FALSE(failure_);
-  EXPECT_FALSE(timeout_);
-  delete res;
-}
-
-// Test that requests are sent at the right times.
-TEST_F(StunRequestTest, TestBackoff) {
-  rtc::ScopedFakeClock fake_clock;
-  StunMessage* req = CreateStunMessage(STUN_BINDING_REQUEST, NULL);
-
-  int64_t start = rtc::TimeMillis();
-  manager_.Send(new StunRequestThunker(req, this));
-  StunMessage* res = CreateStunMessage(STUN_BINDING_RESPONSE, req);
-  for (int i = 0; i < 9; ++i) {
-    EXPECT_TRUE_SIMULATED_WAIT(request_count_ != i, STUN_TOTAL_TIMEOUT,
-                               fake_clock);
-    int64_t elapsed = rtc::TimeMillis() - start;
-    LOG(LS_INFO) << "STUN request #" << (i + 1)
-                 << " sent at " << elapsed << " ms";
-    EXPECT_EQ(TotalDelay(i), elapsed);
-  }
-  EXPECT_TRUE(manager_.CheckResponse(res));
-
-  EXPECT_TRUE(response_ == res);
-  EXPECT_TRUE(success_);
-  EXPECT_FALSE(failure_);
-  EXPECT_FALSE(timeout_);
-  delete res;
-}
-
-// Test that we timeout properly if no response is received.
-TEST_F(StunRequestTest, TestTimeout) {
-  rtc::ScopedFakeClock fake_clock;
-  StunMessage* req = CreateStunMessage(STUN_BINDING_REQUEST, NULL);
-  StunMessage* res = CreateStunMessage(STUN_BINDING_RESPONSE, req);
-
-  manager_.Send(new StunRequestThunker(req, this));
-  SIMULATED_WAIT(false, cricket::STUN_TOTAL_TIMEOUT, fake_clock);
-
-  EXPECT_FALSE(manager_.CheckResponse(res));
-  EXPECT_TRUE(response_ == NULL);
-  EXPECT_FALSE(success_);
-  EXPECT_FALSE(failure_);
-  EXPECT_TRUE(timeout_);
-  delete res;
-}
-
-// Regression test for specific crash where we receive a response with the
-// same id as a request that doesn't have an underlying StunMessage yet.
-TEST_F(StunRequestTest, TestNoEmptyRequest) {
-  StunRequestThunker* request = new StunRequestThunker(this);
-
-  manager_.SendDelayed(request, 100);
-
-  StunMessage dummy_req;
-  dummy_req.SetTransactionID(request->id());
-  StunMessage* res = CreateStunMessage(STUN_BINDING_RESPONSE, &dummy_req);
-
-  EXPECT_TRUE(manager_.CheckResponse(res));
-
-  EXPECT_TRUE(response_ == res);
-  EXPECT_TRUE(success_);
-  EXPECT_FALSE(failure_);
-  EXPECT_FALSE(timeout_);
-  delete res;
-}
diff --git a/p2p/base/stunserver.cc b/p2p/base/stunserver.cc
deleted file mode 100644
index 3a3a0ab..0000000
--- a/p2p/base/stunserver.cc
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- *  Copyright 2004 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/p2p/base/stunserver.h"
-
-#include "webrtc/rtc_base/bytebuffer.h"
-#include "webrtc/rtc_base/logging.h"
-
-namespace cricket {
-
-StunServer::StunServer(rtc::AsyncUDPSocket* socket) : socket_(socket) {
-  socket_->SignalReadPacket.connect(this, &StunServer::OnPacket);
-}
-
-StunServer::~StunServer() {
-  socket_->SignalReadPacket.disconnect(this);
-}
-
-void StunServer::OnPacket(
-    rtc::AsyncPacketSocket* socket, const char* buf, size_t size,
-    const rtc::SocketAddress& remote_addr,
-    const rtc::PacketTime& packet_time) {
-  // Parse the STUN message; eat any messages that fail to parse.
-  rtc::ByteBufferReader bbuf(buf, size);
-  StunMessage msg;
-  if (!msg.Read(&bbuf)) {
-    return;
-  }
-
-  // TODO: If unknown non-optional (<= 0x7fff) attributes are found, send a
-  //       420 "Unknown Attribute" response.
-
-  // Send the message to the appropriate handler function.
-  switch (msg.type()) {
-    case STUN_BINDING_REQUEST:
-      OnBindingRequest(&msg, remote_addr);
-      break;
-
-    default:
-      SendErrorResponse(msg, remote_addr, 600, "Operation Not Supported");
-  }
-}
-
-void StunServer::OnBindingRequest(
-    StunMessage* msg, const rtc::SocketAddress& remote_addr) {
-  StunMessage response;
-  GetStunBindReqponse(msg, remote_addr, &response);
-  SendResponse(response, remote_addr);
-}
-
-void StunServer::SendErrorResponse(
-    const StunMessage& msg, const rtc::SocketAddress& addr,
-    int error_code, const char* error_desc) {
-  StunMessage err_msg;
-  err_msg.SetType(GetStunErrorResponseType(msg.type()));
-  err_msg.SetTransactionID(msg.transaction_id());
-
-  auto err_code = StunAttribute::CreateErrorCode();
-  err_code->SetCode(error_code);
-  err_code->SetReason(error_desc);
-  err_msg.AddAttribute(std::move(err_code));
-
-  SendResponse(err_msg, addr);
-}
-
-void StunServer::SendResponse(
-    const StunMessage& msg, const rtc::SocketAddress& addr) {
-  rtc::ByteBufferWriter buf;
-  msg.Write(&buf);
-  rtc::PacketOptions options;
-  if (socket_->SendTo(buf.Data(), buf.Length(), addr, options) < 0)
-    LOG_ERR(LS_ERROR) << "sendto";
-}
-
-void StunServer::GetStunBindReqponse(StunMessage* request,
-                                     const rtc::SocketAddress& remote_addr,
-                                     StunMessage* response) const {
-  response->SetType(STUN_BINDING_RESPONSE);
-  response->SetTransactionID(request->transaction_id());
-
-  // Tell the user the address that we received their request from.
-  std::unique_ptr<StunAddressAttribute> mapped_addr;
-  if (!request->IsLegacy()) {
-    mapped_addr = StunAttribute::CreateAddress(STUN_ATTR_MAPPED_ADDRESS);
-  } else {
-    mapped_addr = StunAttribute::CreateXorAddress(STUN_ATTR_XOR_MAPPED_ADDRESS);
-  }
-  mapped_addr->SetAddress(remote_addr);
-  response->AddAttribute(std::move(mapped_addr));
-}
-
-}  // namespace cricket
diff --git a/p2p/base/stunserver.h b/p2p/base/stunserver.h
deleted file mode 100644
index 92707b0..0000000
--- a/p2p/base/stunserver.h
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- *  Copyright 2004 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_P2P_BASE_STUNSERVER_H_
-#define WEBRTC_P2P_BASE_STUNSERVER_H_
-
-#include <memory>
-
-#include "webrtc/p2p/base/stun.h"
-#include "webrtc/rtc_base/asyncudpsocket.h"
-
-namespace cricket {
-
-const int STUN_SERVER_PORT = 3478;
-
-class StunServer : public sigslot::has_slots<> {
- public:
-  // Creates a STUN server, which will listen on the given socket.
-  explicit StunServer(rtc::AsyncUDPSocket* socket);
-  // Removes the STUN server from the socket and deletes the socket.
-  ~StunServer() override;
-
- protected:
-  // Slot for AsyncSocket.PacketRead:
-  void OnPacket(
-      rtc::AsyncPacketSocket* socket, const char* buf, size_t size,
-      const rtc::SocketAddress& remote_addr,
-      const rtc::PacketTime& packet_time);
-
-  // Handlers for the different types of STUN/TURN requests:
-  virtual void OnBindingRequest(StunMessage* msg,
-      const rtc::SocketAddress& addr);
-  void OnAllocateRequest(StunMessage* msg,
-      const rtc::SocketAddress& addr);
-  void OnSharedSecretRequest(StunMessage* msg,
-      const rtc::SocketAddress& addr);
-  void OnSendRequest(StunMessage* msg,
-      const rtc::SocketAddress& addr);
-
-  // Sends an error response to the given message back to the user.
-  void SendErrorResponse(
-      const StunMessage& msg, const rtc::SocketAddress& addr,
-      int error_code, const char* error_desc);
-
-  // Sends the given message to the appropriate destination.
-  void SendResponse(const StunMessage& msg,
-       const rtc::SocketAddress& addr);
-
-  // A helper method to compose a STUN binding response.
-  void GetStunBindReqponse(StunMessage* request,
-                           const rtc::SocketAddress& remote_addr,
-                           StunMessage* response) const;
-
- private:
-  std::unique_ptr<rtc::AsyncUDPSocket> socket_;
-};
-
-}  // namespace cricket
-
-#endif  // WEBRTC_P2P_BASE_STUNSERVER_H_
diff --git a/p2p/base/stunserver_unittest.cc b/p2p/base/stunserver_unittest.cc
deleted file mode 100644
index 66cb59f..0000000
--- a/p2p/base/stunserver_unittest.cc
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- *  Copyright 2004 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 <memory>
-#include <string>
-
-#include "webrtc/p2p/base/stunserver.h"
-#include "webrtc/rtc_base/gunit.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/ptr_util.h"
-#include "webrtc/rtc_base/testclient.h"
-#include "webrtc/rtc_base/thread.h"
-#include "webrtc/rtc_base/virtualsocketserver.h"
-
-using namespace cricket;
-
-static const rtc::SocketAddress server_addr("99.99.99.1", 3478);
-static const rtc::SocketAddress client_addr("1.2.3.4", 1234);
-
-class StunServerTest : public testing::Test {
- public:
-  StunServerTest() : ss_(new rtc::VirtualSocketServer()), network_(ss_.get()) {}
-  virtual void SetUp() {
-    server_.reset(new StunServer(
-        rtc::AsyncUDPSocket::Create(ss_.get(), server_addr)));
-    client_.reset(new rtc::TestClient(
-        WrapUnique(rtc::AsyncUDPSocket::Create(ss_.get(), client_addr))));
-
-    network_.Start();
-  }
-  void Send(const StunMessage& msg) {
-    rtc::ByteBufferWriter buf;
-    msg.Write(&buf);
-    Send(buf.Data(), static_cast<int>(buf.Length()));
-  }
-  void Send(const char* buf, int len) {
-    client_->SendTo(buf, len, server_addr);
-  }
-  bool ReceiveFails() {
-    return(client_->CheckNoPacket());
-  }
-  StunMessage* Receive() {
-    StunMessage* msg = NULL;
-    std::unique_ptr<rtc::TestClient::Packet> packet =
-        client_->NextPacket(rtc::TestClient::kTimeoutMs);
-    if (packet) {
-      rtc::ByteBufferReader buf(packet->buf, packet->size);
-      msg = new StunMessage();
-      msg->Read(&buf);
-    }
-    return msg;
-  }
- private:
-  std::unique_ptr<rtc::VirtualSocketServer> ss_;
-  rtc::Thread network_;
-  std::unique_ptr<StunServer> server_;
-  std::unique_ptr<rtc::TestClient> client_;
-};
-
-// Disable for TSan v2, see
-// https://code.google.com/p/webrtc/issues/detail?id=2517 for details.
-#if !defined(THREAD_SANITIZER)
-
-TEST_F(StunServerTest, TestGood) {
-  StunMessage req;
-  std::string transaction_id = "0123456789ab";
-  req.SetType(STUN_BINDING_REQUEST);
-  req.SetTransactionID(transaction_id);
-  Send(req);
-
-  StunMessage* msg = Receive();
-  ASSERT_TRUE(msg != NULL);
-  EXPECT_EQ(STUN_BINDING_RESPONSE, msg->type());
-  EXPECT_EQ(req.transaction_id(), msg->transaction_id());
-
-  const StunAddressAttribute* mapped_addr =
-      msg->GetAddress(STUN_ATTR_MAPPED_ADDRESS);
-  EXPECT_TRUE(mapped_addr != NULL);
-  EXPECT_EQ(1, mapped_addr->family());
-  EXPECT_EQ(client_addr.port(), mapped_addr->port());
-  if (mapped_addr->ipaddr() != client_addr.ipaddr()) {
-    LOG(LS_WARNING) << "Warning: mapped IP ("
-                    << mapped_addr->ipaddr()
-                    << ") != local IP (" << client_addr.ipaddr()
-                    << ")";
-  }
-
-  delete msg;
-}
-
-#endif // if !defined(THREAD_SANITIZER)
-
-TEST_F(StunServerTest, TestBad) {
-  const char* bad = "this is a completely nonsensical message whose only "
-                    "purpose is to make the parser go 'ack'.  it doesn't "
-                    "look anything like a normal stun message";
-  Send(bad, static_cast<int>(strlen(bad)));
-
-  ASSERT_TRUE(ReceiveFails());
-}
diff --git a/p2p/base/tcpport.cc b/p2p/base/tcpport.cc
deleted file mode 100644
index cbb25b9..0000000
--- a/p2p/base/tcpport.cc
+++ /dev/null
@@ -1,552 +0,0 @@
-/*
- *  Copyright 2004 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.
- */
-
-/*
- *  This is a diagram of how TCP reconnect works for the active side. The
- *  passive side just waits for an incoming connection.
- *
- *  - Connected: Indicate whether the TCP socket is connected.
- *
- *  - Writable: Whether the stun binding is completed. Sending a data packet
- *    before stun binding completed will trigger IPC socket layer to shutdown
- *    the connection.
- *
- *  - PendingTCP: |connection_pending_| indicates whether there is an
- *    outstanding TCP connection in progress.
- *
- *  - PretendWri: Tracked by |pretending_to_be_writable_|. Marking connection as
- *    WRITE_TIMEOUT will cause the connection be deleted. Instead, we're
- *    "pretending" we're still writable for a period of time such that reconnect
- *    could work.
- *
- *  Data could only be sent in state 3. Sening data during state 2 & 6 will get
- *  EWOULDBLOCK, 4 & 5 EPIPE.
- *
- *         OS Timeout         7 -------------+
- *   +----------------------->|Connected: N  |
- *   |                        |Writable:  N  |     Timeout
- *   |       Timeout          |Connection is |<----------------+
- *   |   +------------------->|Dead          |                 |
- *   |   |                    +--------------+                 |
- *   |   |                               ^                     |
- *   |   |            OnClose            |                     |
- *   |   |    +-----------------------+  |                     |
- *   |   |    |                       |  |Timeout              |
- *   |   |    v                       |  |                     |
- *   | 4 +----------+          5 -----+--+--+           6 -----+-----+
- *   | |Connected: N|Send() or |Connected: N|           |Connected: Y|
- *   | |Writable:  Y|Ping()    |Writable:  Y|OnConnect  |Writable:  Y|
- *   | |PendingTCP:N+--------> |PendingTCP:Y+---------> |PendingTCP:N|
- *   | |PretendWri:Y|          |PretendWri:Y|           |PretendWri:Y|
- *   | +-----+------+          +------------+           +---+--+-----+
- *   |   ^   ^                                              |  |
- *   |   |   |                     OnClose                  |  |
- *   |   |   +----------------------------------------------+  |
- *   |   |                                                     |
- *   |   |                              Stun Binding Completed |
- *   |   |                                                     |
- *   |   |                    OnClose                          |
- *   |   +------------------------------------------------+    |
- *   |                                                    |    v
- *  1 -----------+           2 -----------+Stun      3 -----------+
- *  |Connected: N|           |Connected: Y|Binding   |Connected: Y|
- *  |Writable:  N|OnConnect  |Writable:  N|Completed |Writable:  Y|
- *  |PendingTCP:Y+---------> |PendingTCP:N+--------> |PendingTCP:N|
- *  |PretendWri:N|           |PretendWri:N|          |PretendWri:N|
- *  +------------+           +------------+          +------------+
- *
- */
-
-#include "webrtc/p2p/base/tcpport.h"
-
-#include "webrtc/p2p/base/common.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-
-namespace cricket {
-
-TCPPort::TCPPort(rtc::Thread* thread,
-                 rtc::PacketSocketFactory* factory,
-                 rtc::Network* network,
-                 uint16_t min_port,
-                 uint16_t max_port,
-                 const std::string& username,
-                 const std::string& password,
-                 bool allow_listen)
-    : Port(thread,
-           LOCAL_PORT_TYPE,
-           factory,
-           network,
-           min_port,
-           max_port,
-           username,
-           password),
-      incoming_only_(false),
-      allow_listen_(allow_listen),
-      socket_(NULL),
-      error_(0) {
-  // TODO(mallinath) - Set preference value as per RFC 6544.
-  // http://b/issue?id=7141794
-  if (allow_listen_) {
-    TryCreateServerSocket();
-  }
-}
-
-TCPPort::~TCPPort() {
-  delete socket_;
-  std::list<Incoming>::iterator it;
-  for (it = incoming_.begin(); it != incoming_.end(); ++it)
-    delete it->socket;
-  incoming_.clear();
-}
-
-Connection* TCPPort::CreateConnection(const Candidate& address,
-                                      CandidateOrigin origin) {
-  if (!SupportsProtocol(address.protocol())) {
-    return NULL;
-  }
-
-  if (address.tcptype() == TCPTYPE_ACTIVE_STR ||
-      (address.tcptype().empty() && address.address().port() == 0)) {
-    // It's active only candidate, we should not try to create connections
-    // for these candidates.
-    return NULL;
-  }
-
-  // We can't accept TCP connections incoming on other ports
-  if (origin == ORIGIN_OTHER_PORT)
-    return NULL;
-
-  // Check if we are allowed to make outgoing TCP connections
-  if (incoming_only_ && (origin == ORIGIN_MESSAGE))
-    return NULL;
-
-  // We don't know how to act as an ssl server yet
-  if ((address.protocol() == SSLTCP_PROTOCOL_NAME) &&
-      (origin == ORIGIN_THIS_PORT)) {
-    return NULL;
-  }
-
-  if (!IsCompatibleAddress(address.address())) {
-    return NULL;
-  }
-
-  TCPConnection* conn = NULL;
-  if (rtc::AsyncPacketSocket* socket =
-      GetIncoming(address.address(), true)) {
-    // Incoming connection; we already created a socket and connected signals,
-    // so we need to hand off the "read packet" responsibility to
-    // TCPConnection.
-    socket->SignalReadPacket.disconnect(this);
-    conn = new TCPConnection(this, address, socket);
-  } else {
-    // Outgoing connection, which will create a new socket for which we still
-    // need to connect SignalReadyToSend and SignalSentPacket.
-    conn = new TCPConnection(this, address);
-    if (conn->socket()) {
-      conn->socket()->SignalReadyToSend.connect(this, &TCPPort::OnReadyToSend);
-      conn->socket()->SignalSentPacket.connect(this, &TCPPort::OnSentPacket);
-    }
-  }
-  AddOrReplaceConnection(conn);
-  return conn;
-}
-
-void TCPPort::PrepareAddress() {
-  if (socket_) {
-    // If socket isn't bound yet the address will be added in
-    // OnAddressReady(). Socket may be in the CLOSED state if Listen()
-    // failed, we still want to add the socket address.
-    LOG(LS_VERBOSE) << "Preparing TCP address, current state: "
-                    << socket_->GetState();
-    if (socket_->GetState() == rtc::AsyncPacketSocket::STATE_BOUND ||
-        socket_->GetState() == rtc::AsyncPacketSocket::STATE_CLOSED)
-      AddAddress(socket_->GetLocalAddress(), socket_->GetLocalAddress(),
-                 rtc::SocketAddress(), TCP_PROTOCOL_NAME, "",
-                 TCPTYPE_PASSIVE_STR, LOCAL_PORT_TYPE,
-                 ICE_TYPE_PREFERENCE_HOST_TCP, 0, "", true);
-  } else {
-    LOG_J(LS_INFO, this) << "Not listening due to firewall restrictions.";
-    // Note: We still add the address, since otherwise the remote side won't
-    // recognize our incoming TCP connections. According to
-    // https://tools.ietf.org/html/rfc6544#section-4.5, for active candidate,
-    // the port must be set to the discard port, i.e. 9. We can't be 100% sure
-    // which IP address will actually be used, so GetBestIP is as good as we
-    // can do.
-    // TODO(deadbeef): We could do something like create a dummy socket just to
-    // see what IP we get. But that may be overkill.
-    AddAddress(rtc::SocketAddress(Network()->GetBestIP(), DISCARD_PORT),
-               rtc::SocketAddress(Network()->GetBestIP(), 0),
-               rtc::SocketAddress(), TCP_PROTOCOL_NAME, "", TCPTYPE_ACTIVE_STR,
-               LOCAL_PORT_TYPE, ICE_TYPE_PREFERENCE_HOST_TCP, 0, "", true);
-  }
-}
-
-int TCPPort::SendTo(const void* data, size_t size,
-                    const rtc::SocketAddress& addr,
-                    const rtc::PacketOptions& options,
-                    bool payload) {
-  rtc::AsyncPacketSocket * socket = NULL;
-  TCPConnection* conn = static_cast<TCPConnection*>(GetConnection(addr));
-
-  // For Connection, this is the code path used by Ping() to establish
-  // WRITABLE. It has to send through the socket directly as TCPConnection::Send
-  // checks writability.
-  if (conn) {
-    if (!conn->connected()) {
-      conn->MaybeReconnect();
-      return SOCKET_ERROR;
-    }
-    socket = conn->socket();
-  } else {
-    socket = GetIncoming(addr);
-  }
-  if (!socket) {
-    LOG_J(LS_ERROR, this) << "Attempted to send to an unknown destination, "
-                          << addr.ToSensitiveString();
-    return SOCKET_ERROR;  // TODO(tbd): Set error_
-  }
-
-  int sent = socket->Send(data, size, options);
-  if (sent < 0) {
-    error_ = socket->GetError();
-    // Error from this code path for a Connection (instead of from a bare
-    // socket) will not trigger reconnecting. In theory, this shouldn't matter
-    // as OnClose should always be called and set connected to false.
-    LOG_J(LS_ERROR, this) << "TCP send of " << size
-                          << " bytes failed with error " << error_;
-  }
-  return sent;
-}
-
-int TCPPort::GetOption(rtc::Socket::Option opt, int* value) {
-  if (socket_) {
-    return socket_->GetOption(opt, value);
-  } else {
-    return SOCKET_ERROR;
-  }
-}
-
-int TCPPort::SetOption(rtc::Socket::Option opt, int value) {
-  if (socket_) {
-    return socket_->SetOption(opt, value);
-  } else {
-    return SOCKET_ERROR;
-  }
-}
-
-int TCPPort::GetError() {
-  return error_;
-}
-
-void TCPPort::OnNewConnection(rtc::AsyncPacketSocket* socket,
-                              rtc::AsyncPacketSocket* new_socket) {
-  RTC_DCHECK(socket == socket_);
-
-  Incoming incoming;
-  incoming.addr = new_socket->GetRemoteAddress();
-  incoming.socket = new_socket;
-  incoming.socket->SignalReadPacket.connect(this, &TCPPort::OnReadPacket);
-  incoming.socket->SignalReadyToSend.connect(this, &TCPPort::OnReadyToSend);
-  incoming.socket->SignalSentPacket.connect(this, &TCPPort::OnSentPacket);
-
-  LOG_J(LS_VERBOSE, this) << "Accepted connection from "
-                          << incoming.addr.ToSensitiveString();
-  incoming_.push_back(incoming);
-}
-
-void TCPPort::TryCreateServerSocket() {
-  socket_ = socket_factory()->CreateServerTcpSocket(
-      rtc::SocketAddress(Network()->GetBestIP(), 0), min_port(), max_port(),
-      false /* ssl */);
-  if (!socket_) {
-    LOG_J(LS_WARNING, this)
-        << "TCP server socket creation failed; continuing anyway.";
-    return;
-  }
-  socket_->SignalNewConnection.connect(this, &TCPPort::OnNewConnection);
-  socket_->SignalAddressReady.connect(this, &TCPPort::OnAddressReady);
-}
-
-rtc::AsyncPacketSocket* TCPPort::GetIncoming(
-    const rtc::SocketAddress& addr, bool remove) {
-  rtc::AsyncPacketSocket* socket = NULL;
-  for (std::list<Incoming>::iterator it = incoming_.begin();
-       it != incoming_.end(); ++it) {
-    if (it->addr == addr) {
-      socket = it->socket;
-      if (remove)
-        incoming_.erase(it);
-      break;
-    }
-  }
-  return socket;
-}
-
-void TCPPort::OnReadPacket(rtc::AsyncPacketSocket* socket,
-                           const char* data, size_t size,
-                           const rtc::SocketAddress& remote_addr,
-                           const rtc::PacketTime& packet_time) {
-  Port::OnReadPacket(data, size, remote_addr, PROTO_TCP);
-}
-
-void TCPPort::OnSentPacket(rtc::AsyncPacketSocket* socket,
-                           const rtc::SentPacket& sent_packet) {
-  PortInterface::SignalSentPacket(sent_packet);
-}
-
-void TCPPort::OnReadyToSend(rtc::AsyncPacketSocket* socket) {
-  Port::OnReadyToSend();
-}
-
-void TCPPort::OnAddressReady(rtc::AsyncPacketSocket* socket,
-                             const rtc::SocketAddress& address) {
-  AddAddress(address, address, rtc::SocketAddress(), TCP_PROTOCOL_NAME, "",
-             TCPTYPE_PASSIVE_STR, LOCAL_PORT_TYPE, ICE_TYPE_PREFERENCE_HOST_TCP,
-             0, "", true);
-}
-
-TCPConnection::TCPConnection(TCPPort* port,
-                             const Candidate& candidate,
-                             rtc::AsyncPacketSocket* socket)
-    : Connection(port, 0, candidate),
-      socket_(socket),
-      error_(0),
-      outgoing_(socket == NULL),
-      connection_pending_(false),
-      pretending_to_be_writable_(false),
-      reconnection_timeout_(cricket::CONNECTION_WRITE_CONNECT_TIMEOUT) {
-  if (outgoing_) {
-    CreateOutgoingTcpSocket();
-  } else {
-    // Incoming connections should match one of the network addresses. Same as
-    // what's being checked in OnConnect, but just DCHECKing here.
-    LOG_J(LS_VERBOSE, this)
-        << "socket ipaddr: " << socket_->GetLocalAddress().ToString()
-        << ", port() Network:" << port->Network()->ToString();
-    const std::vector<rtc::InterfaceAddress>& desired_addresses =
-        port_->Network()->GetIPs();
-    RTC_DCHECK(std::find(desired_addresses.begin(), desired_addresses.end(),
-                         socket_->GetLocalAddress().ipaddr()) !=
-               desired_addresses.end());
-    ConnectSocketSignals(socket);
-  }
-}
-
-TCPConnection::~TCPConnection() {
-}
-
-int TCPConnection::Send(const void* data, size_t size,
-                        const rtc::PacketOptions& options) {
-  if (!socket_) {
-    error_ = ENOTCONN;
-    return SOCKET_ERROR;
-  }
-
-  // Sending after OnClose on active side will trigger a reconnect for a
-  // outgoing connection. Note that the write state is still WRITABLE as we want
-  // to spend a few seconds attempting a reconnect before saying we're
-  // unwritable.
-  if (!connected()) {
-    MaybeReconnect();
-    return SOCKET_ERROR;
-  }
-
-  // Note that this is important to put this after the previous check to give
-  // the connection a chance to reconnect.
-  if (pretending_to_be_writable_ || write_state() != STATE_WRITABLE) {
-    // TODO: Should STATE_WRITE_TIMEOUT return a non-blocking error?
-    error_ = ENOTCONN;
-    return SOCKET_ERROR;
-  }
-  stats_.sent_total_packets++;
-  int sent = socket_->Send(data, size, options);
-  if (sent < 0) {
-    stats_.sent_discarded_packets++;
-    error_ = socket_->GetError();
-  } else {
-    send_rate_tracker_.AddSamples(sent);
-  }
-  return sent;
-}
-
-int TCPConnection::GetError() {
-  return error_;
-}
-
-void TCPConnection::OnConnectionRequestResponse(ConnectionRequest* req,
-                                                StunMessage* response) {
-  // Process the STUN response before we inform upper layer ready to send.
-  Connection::OnConnectionRequestResponse(req, response);
-
-  // If we're in the state of pretending to be writeable, we should inform the
-  // upper layer it's ready to send again as previous EWOULDLBLOCK from socket
-  // would have stopped the outgoing stream.
-  if (pretending_to_be_writable_) {
-    Connection::OnReadyToSend();
-  }
-  pretending_to_be_writable_ = false;
-  RTC_DCHECK(write_state() == STATE_WRITABLE);
-}
-
-void TCPConnection::OnConnect(rtc::AsyncPacketSocket* socket) {
-  RTC_DCHECK(socket == socket_.get());
-  // Do not use this port if the socket bound to an address not associated with
-  // the desired network interface. This is seen in Chrome, where TCP sockets
-  // cannot be given a binding address, and the platform is expected to pick
-  // the correct local address.
-  //
-  // However, there are two situations in which we allow the bound address to
-  // not be one of the addresses of the requested interface:
-  // 1. The bound address is the loopback address. This happens when a proxy
-  // forces TCP to bind to only the localhost address (see issue 3927).
-  // 2. The bound address is the "any address". This happens when
-  // multiple_routes is disabled (see issue 4780).
-  //
-  // Note that, aside from minor differences in log statements, this logic is
-  // identical to that in TurnPort.
-  const rtc::SocketAddress& socket_address = socket->GetLocalAddress();
-  const std::vector<rtc::InterfaceAddress>& desired_addresses =
-      port_->Network()->GetIPs();
-  if (std::find(desired_addresses.begin(), desired_addresses.end(),
-                socket_address.ipaddr()) != desired_addresses.end()) {
-    LOG_J(LS_VERBOSE, this) << "Connection established to "
-                            << socket->GetRemoteAddress().ToSensitiveString();
-  } else {
-    if (socket->GetLocalAddress().IsLoopbackIP()) {
-      LOG(LS_WARNING) << "Socket is bound to the address:"
-                      << socket_address.ipaddr().ToString()
-                      << ", rather then an address associated with network:"
-                      << port_->Network()->ToString()
-                      << ". Still allowing it since it's localhost.";
-    } else if (IPIsAny(port_->Network()->GetBestIP())) {
-      LOG(LS_WARNING) << "Socket is bound to the address:"
-                      << socket_address.ipaddr().ToString()
-                      << ", rather then an address associated with network:"
-                      << port_->Network()->ToString()
-                      << ". Still allowing it since it's the 'any' address"
-                      << ", possibly caused by multiple_routes being disabled.";
-    } else {
-      LOG(LS_WARNING) << "Dropping connection as TCP socket bound to IP "
-                      << socket_address.ipaddr().ToString()
-                      << ", rather then an address associated with network:"
-                      << port_->Network()->ToString();
-      OnClose(socket, 0);
-      return;
-    }
-  }
-
-  // Connection is established successfully.
-  set_connected(true);
-  connection_pending_ = false;
-}
-
-void TCPConnection::OnClose(rtc::AsyncPacketSocket* socket, int error) {
-  RTC_DCHECK(socket == socket_.get());
-  LOG_J(LS_INFO, this) << "Connection closed with error " << error;
-
-  // Guard against the condition where IPC socket will call OnClose for every
-  // packet it can't send.
-  if (connected()) {
-    set_connected(false);
-
-    // Prevent the connection from being destroyed by redundant SignalClose
-    // events.
-    pretending_to_be_writable_ = true;
-
-    // We don't attempt reconnect right here. This is to avoid a case where the
-    // shutdown is intentional and reconnect is not necessary. We only reconnect
-    // when the connection is used to Send() or Ping().
-    port()->thread()->PostDelayed(RTC_FROM_HERE, reconnection_timeout(), this,
-                                  MSG_TCPCONNECTION_DELAYED_ONCLOSE);
-  } else if (!pretending_to_be_writable_) {
-    // OnClose could be called when the underneath socket times out during the
-    // initial connect() (i.e. |pretending_to_be_writable_| is false) . We have
-    // to manually destroy here as this connection, as never connected, will not
-    // be scheduled for ping to trigger destroy.
-    Destroy();
-  }
-}
-
-void TCPConnection::OnMessage(rtc::Message* pmsg) {
-  switch (pmsg->message_id) {
-    case MSG_TCPCONNECTION_DELAYED_ONCLOSE:
-      // If this connection can't become connected and writable again in 5
-      // seconds, it's time to tear this down. This is the case for the original
-      // TCP connection on passive side during a reconnect.
-      if (pretending_to_be_writable_) {
-        Destroy();
-      }
-      break;
-    default:
-      Connection::OnMessage(pmsg);
-  }
-}
-
-void TCPConnection::MaybeReconnect() {
-  // Only reconnect for an outgoing TCPConnection when OnClose was signaled and
-  // no outstanding reconnect is pending.
-  if (connected() || connection_pending_ || !outgoing_) {
-    return;
-  }
-
-  LOG_J(LS_INFO, this) << "TCP Connection with remote is closed, "
-                       << "trying to reconnect";
-
-  CreateOutgoingTcpSocket();
-  error_ = EPIPE;
-}
-
-void TCPConnection::OnReadPacket(
-  rtc::AsyncPacketSocket* socket, const char* data, size_t size,
-  const rtc::SocketAddress& remote_addr,
-  const rtc::PacketTime& packet_time) {
-  RTC_DCHECK(socket == socket_.get());
-  Connection::OnReadPacket(data, size, packet_time);
-}
-
-void TCPConnection::OnReadyToSend(rtc::AsyncPacketSocket* socket) {
-  RTC_DCHECK(socket == socket_.get());
-  Connection::OnReadyToSend();
-}
-
-void TCPConnection::CreateOutgoingTcpSocket() {
-  RTC_DCHECK(outgoing_);
-  // TODO(guoweis): Handle failures here (unlikely since TCP).
-  int opts = (remote_candidate().protocol() == SSLTCP_PROTOCOL_NAME)
-                 ? rtc::PacketSocketFactory::OPT_TLS_FAKE
-                 : 0;
-  socket_.reset(port()->socket_factory()->CreateClientTcpSocket(
-      rtc::SocketAddress(port()->Network()->GetBestIP(), 0),
-      remote_candidate().address(), port()->proxy(), port()->user_agent(),
-      opts));
-  if (socket_) {
-    LOG_J(LS_VERBOSE, this)
-        << "Connecting from " << socket_->GetLocalAddress().ToSensitiveString()
-        << " to " << remote_candidate().address().ToSensitiveString();
-    set_connected(false);
-    connection_pending_ = true;
-    ConnectSocketSignals(socket_.get());
-  } else {
-    LOG_J(LS_WARNING, this) << "Failed to create connection to "
-                            << remote_candidate().address().ToSensitiveString();
-  }
-}
-
-void TCPConnection::ConnectSocketSignals(rtc::AsyncPacketSocket* socket) {
-  if (outgoing_) {
-    socket->SignalConnect.connect(this, &TCPConnection::OnConnect);
-  }
-  socket->SignalReadPacket.connect(this, &TCPConnection::OnReadPacket);
-  socket->SignalReadyToSend.connect(this, &TCPConnection::OnReadyToSend);
-  socket->SignalClose.connect(this, &TCPConnection::OnClose);
-}
-
-}  // namespace cricket
diff --git a/p2p/base/tcpport.h b/p2p/base/tcpport.h
deleted file mode 100644
index a0a36df..0000000
--- a/p2p/base/tcpport.h
+++ /dev/null
@@ -1,188 +0,0 @@
-/*
- *  Copyright 2004 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_P2P_BASE_TCPPORT_H_
-#define WEBRTC_P2P_BASE_TCPPORT_H_
-
-#include <list>
-#include <memory>
-#include <string>
-
-#include "webrtc/p2p/base/port.h"
-#include "webrtc/rtc_base/asyncpacketsocket.h"
-
-namespace cricket {
-
-class TCPConnection;
-
-// Communicates using a local TCP port.
-//
-// This class is designed to allow subclasses to take advantage of the
-// connection management provided by this class.  A subclass should take of all
-// packet sending and preparation, but when a packet is received, it should
-// call this TCPPort::OnReadPacket (3 arg) to dispatch to a connection.
-class TCPPort : public Port {
- public:
-  static TCPPort* Create(rtc::Thread* thread,
-                         rtc::PacketSocketFactory* factory,
-                         rtc::Network* network,
-                         uint16_t min_port,
-                         uint16_t max_port,
-                         const std::string& username,
-                         const std::string& password,
-                         bool allow_listen) {
-    return new TCPPort(thread, factory, network, min_port, max_port, username,
-                       password, allow_listen);
-  }
-  ~TCPPort() override;
-
-  Connection* CreateConnection(const Candidate& address,
-                               CandidateOrigin origin) override;
-
-  void PrepareAddress() override;
-
-  int GetOption(rtc::Socket::Option opt, int* value) override;
-  int SetOption(rtc::Socket::Option opt, int value) override;
-  int GetError() override;
-  bool SupportsProtocol(const std::string& protocol) const override {
-    return protocol == TCP_PROTOCOL_NAME || protocol == SSLTCP_PROTOCOL_NAME;
-  }
-
-  ProtocolType GetProtocol() const override { return PROTO_TCP; }
-
- protected:
-  TCPPort(rtc::Thread* thread,
-          rtc::PacketSocketFactory* factory,
-          rtc::Network* network,
-          uint16_t min_port,
-          uint16_t max_port,
-          const std::string& username,
-          const std::string& password,
-          bool allow_listen);
-
-  // Handles sending using the local TCP socket.
-  int SendTo(const void* data,
-             size_t size,
-             const rtc::SocketAddress& addr,
-             const rtc::PacketOptions& options,
-             bool payload) override;
-
-  // Accepts incoming TCP connection.
-  void OnNewConnection(rtc::AsyncPacketSocket* socket,
-                       rtc::AsyncPacketSocket* new_socket);
-
- private:
-  struct Incoming {
-    rtc::SocketAddress addr;
-    rtc::AsyncPacketSocket* socket;
-  };
-
-  void TryCreateServerSocket();
-
-  rtc::AsyncPacketSocket* GetIncoming(
-      const rtc::SocketAddress& addr, bool remove = false);
-
-  // Receives packet signal from the local TCP Socket.
-  void OnReadPacket(rtc::AsyncPacketSocket* socket,
-                    const char* data, size_t size,
-                    const rtc::SocketAddress& remote_addr,
-                    const rtc::PacketTime& packet_time);
-
-  void OnSentPacket(rtc::AsyncPacketSocket* socket,
-                    const rtc::SentPacket& sent_packet) override;
-
-  void OnReadyToSend(rtc::AsyncPacketSocket* socket);
-
-  void OnAddressReady(rtc::AsyncPacketSocket* socket,
-                      const rtc::SocketAddress& address);
-
-  // TODO: Is this still needed?
-  bool incoming_only_;
-  bool allow_listen_;
-  rtc::AsyncPacketSocket* socket_;
-  int error_;
-  std::list<Incoming> incoming_;
-
-  friend class TCPConnection;
-};
-
-class TCPConnection : public Connection {
- public:
-  // Connection is outgoing unless socket is specified
-  TCPConnection(TCPPort* port, const Candidate& candidate,
-                rtc::AsyncPacketSocket* socket = 0);
-  ~TCPConnection() override;
-
-  int Send(const void* data,
-           size_t size,
-           const rtc::PacketOptions& options) override;
-  int GetError() override;
-
-  rtc::AsyncPacketSocket* socket() { return socket_.get(); }
-
-  void OnMessage(rtc::Message* pmsg) override;
-
-  // Allow test cases to overwrite the default timeout period.
-  int reconnection_timeout() const { return reconnection_timeout_; }
-  void set_reconnection_timeout(int timeout_in_ms) {
-    reconnection_timeout_ = timeout_in_ms;
-  }
-
- protected:
-  enum {
-    MSG_TCPCONNECTION_DELAYED_ONCLOSE = Connection::MSG_FIRST_AVAILABLE,
-  };
-
-  // Set waiting_for_stun_binding_complete_ to false to allow data packets in
-  // addition to what Port::OnConnectionRequestResponse does.
-  void OnConnectionRequestResponse(ConnectionRequest* req,
-                                   StunMessage* response) override;
-
- private:
-  // Helper function to handle the case when Ping or Send fails with error
-  // related to socket close.
-  void MaybeReconnect();
-
-  void CreateOutgoingTcpSocket();
-
-  void ConnectSocketSignals(rtc::AsyncPacketSocket* socket);
-
-  void OnConnect(rtc::AsyncPacketSocket* socket);
-  void OnClose(rtc::AsyncPacketSocket* socket, int error);
-  void OnReadPacket(rtc::AsyncPacketSocket* socket,
-                    const char* data, size_t size,
-                    const rtc::SocketAddress& remote_addr,
-                    const rtc::PacketTime& packet_time);
-  void OnReadyToSend(rtc::AsyncPacketSocket* socket);
-
-  std::unique_ptr<rtc::AsyncPacketSocket> socket_;
-  int error_;
-  bool outgoing_;
-
-  // Guard against multiple outgoing tcp connection during a reconnect.
-  bool connection_pending_;
-
-  // Guard against data packets sent when we reconnect a TCP connection. During
-  // reconnecting, when a new tcp connection has being made, we can't send data
-  // packets out until the STUN binding is completed (i.e. the write state is
-  // set to WRITABLE again by Connection::OnConnectionRequestResponse). IPC
-  // socket, when receiving data packets before that, will trigger OnError which
-  // will terminate the newly created connection.
-  bool pretending_to_be_writable_;
-
-  // Allow test case to overwrite the default timeout period.
-  int reconnection_timeout_;
-
-  friend class TCPPort;
-};
-
-}  // namespace cricket
-
-#endif  // WEBRTC_P2P_BASE_TCPPORT_H_
diff --git a/p2p/base/tcpport_unittest.cc b/p2p/base/tcpport_unittest.cc
deleted file mode 100644
index 884488e..0000000
--- a/p2p/base/tcpport_unittest.cc
+++ /dev/null
@@ -1,211 +0,0 @@
-/*
- *  Copyright 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 <list>
-#include <memory>
-
-#include "webrtc/p2p/base/basicpacketsocketfactory.h"
-#include "webrtc/p2p/base/tcpport.h"
-#include "webrtc/rtc_base/gunit.h"
-#include "webrtc/rtc_base/thread.h"
-#include "webrtc/rtc_base/virtualsocketserver.h"
-
-using rtc::SocketAddress;
-using cricket::Connection;
-using cricket::Port;
-using cricket::TCPPort;
-using cricket::ICE_UFRAG_LENGTH;
-using cricket::ICE_PWD_LENGTH;
-
-static int kTimeout = 1000;
-static const SocketAddress kLocalAddr("11.11.11.11", 0);
-static const SocketAddress kAlternateLocalAddr("1.2.3.4", 0);
-static const SocketAddress kRemoteAddr("22.22.22.22", 0);
-
-class ConnectionObserver : public sigslot::has_slots<> {
- public:
-  ConnectionObserver(Connection* conn) {
-    conn->SignalDestroyed.connect(this, &ConnectionObserver::OnDestroyed);
-  }
-
-  bool connection_destroyed() { return connection_destroyed_; }
-
- private:
-  void OnDestroyed(Connection*) { connection_destroyed_ = true; }
-
-  bool connection_destroyed_ = false;
-};
-
-class TCPPortTest : public testing::Test, public sigslot::has_slots<> {
- public:
-  TCPPortTest()
-      : ss_(new rtc::VirtualSocketServer()),
-        main_(ss_.get()),
-        socket_factory_(rtc::Thread::Current()),
-        username_(rtc::CreateRandomString(ICE_UFRAG_LENGTH)),
-        password_(rtc::CreateRandomString(ICE_PWD_LENGTH)) {
-  }
-
-  rtc::Network* MakeNetwork(const SocketAddress& addr) {
-    networks_.emplace_back("unittest", "unittest", addr.ipaddr(), 32);
-    networks_.back().AddIP(addr.ipaddr());
-    return &networks_.back();
-  }
-
-  std::unique_ptr<TCPPort> CreateTCPPort(const SocketAddress& addr) {
-    return std::unique_ptr<TCPPort>(
-        TCPPort::Create(&main_, &socket_factory_, MakeNetwork(addr), 0, 0,
-                        username_, password_, true));
-  }
-
-  std::unique_ptr<TCPPort> CreateTCPPort(rtc::Network* network) {
-    return std::unique_ptr<TCPPort>(TCPPort::Create(
-        &main_, &socket_factory_, network, 0, 0, username_, password_, true));
-  }
-
- protected:
-  // When a "create port" helper method is called with an IP, we create a
-  // Network with that IP and add it to this list. Using a list instead of a
-  // vector so that when it grows, pointers aren't invalidated.
-  std::list<rtc::Network> networks_;
-  std::unique_ptr<rtc::VirtualSocketServer> ss_;
-  rtc::AutoSocketServerThread main_;
-  rtc::BasicPacketSocketFactory socket_factory_;
-  std::string username_;
-  std::string password_;
-};
-
-TEST_F(TCPPortTest, TestTCPPortWithLocalhostAddress) {
-  SocketAddress local_address("127.0.0.1", 0);
-  // After calling this, when TCPPort attempts to get a socket bound to
-  // kLocalAddr, it will end up using localhost instead.
-  ss_->SetAlternativeLocalAddress(kLocalAddr.ipaddr(), local_address.ipaddr());
-  auto local_port = CreateTCPPort(kLocalAddr);
-  auto remote_port = CreateTCPPort(kRemoteAddr);
-  local_port->PrepareAddress();
-  remote_port->PrepareAddress();
-  Connection* conn = local_port->CreateConnection(remote_port->Candidates()[0],
-                                                  Port::ORIGIN_MESSAGE);
-  EXPECT_TRUE_WAIT(conn->connected(), kTimeout);
-  // Verify that the socket actually used localhost, otherwise this test isn't
-  // doing what it meant to.
-  ASSERT_EQ(local_address.ipaddr(),
-            local_port->Candidates()[0].address().ipaddr());
-}
-
-// If the address the socket ends up bound to does not match any address of the
-// TCPPort's Network, then the socket should be discarded and no candidates
-// should be signaled. In the context of ICE, where one TCPPort is created for
-// each Network, when this happens it's likely that the unexpected address is
-// associated with some other Network, which another TCPPort is already
-// covering.
-TEST_F(TCPPortTest, TCPPortDiscardedIfBoundAddressDoesNotMatchNetwork) {
-  // Sockets bound to kLocalAddr will actually end up with kAlternateLocalAddr.
-  ss_->SetAlternativeLocalAddress(kLocalAddr.ipaddr(),
-                                  kAlternateLocalAddr.ipaddr());
-
-  // Create ports (local_port is the one whose IP will end up reassigned).
-  auto local_port = CreateTCPPort(kLocalAddr);
-  auto remote_port = CreateTCPPort(kRemoteAddr);
-  local_port->PrepareAddress();
-  remote_port->PrepareAddress();
-
-  // Tell port to create a connection; it should be destroyed when it's
-  // realized that it's using an unexpected address.
-  Connection* conn = local_port->CreateConnection(remote_port->Candidates()[0],
-                                                  Port::ORIGIN_MESSAGE);
-  ConnectionObserver observer(conn);
-  EXPECT_TRUE_WAIT(observer.connection_destroyed(), kTimeout);
-}
-
-// A caveat for the above logic: if the socket ends up bound to one of the IPs
-// associated with the Network, just not the "best" one, this is ok.
-TEST_F(TCPPortTest, TCPPortNotDiscardedIfNotBoundToBestIP) {
-  // Sockets bound to kLocalAddr will actually end up with kAlternateLocalAddr.
-  ss_->SetAlternativeLocalAddress(kLocalAddr.ipaddr(),
-                                  kAlternateLocalAddr.ipaddr());
-
-  // Set up a network with kLocalAddr1 as the "best" IP, and kAlternateLocalAddr
-  // as an alternate.
-  rtc::Network* network = MakeNetwork(kLocalAddr);
-  network->AddIP(kAlternateLocalAddr.ipaddr());
-  ASSERT_EQ(kLocalAddr.ipaddr(), network->GetBestIP());
-
-  // Create ports (using our special 2-IP Network for local_port).
-  auto local_port = CreateTCPPort(network);
-  auto remote_port = CreateTCPPort(kRemoteAddr);
-  local_port->PrepareAddress();
-  remote_port->PrepareAddress();
-
-  // Expect connection to succeed.
-  Connection* conn = local_port->CreateConnection(remote_port->Candidates()[0],
-                                                  Port::ORIGIN_MESSAGE);
-  EXPECT_TRUE_WAIT(conn->connected(), kTimeout);
-
-  // Verify that the socket actually used the alternate address, otherwise this
-  // test isn't doing what it meant to.
-  ASSERT_EQ(kAlternateLocalAddr.ipaddr(),
-            local_port->Candidates()[0].address().ipaddr());
-}
-
-class SentPacketCounter : public sigslot::has_slots<> {
- public:
-  SentPacketCounter(TCPPort* p) {
-    p->SignalSentPacket.connect(this, &SentPacketCounter::OnSentPacket);
-  }
-
-  int sent_packets() const { return sent_packets_; }
-
- private:
-  void OnSentPacket(const rtc::SentPacket&) { ++sent_packets_; }
-
-  int sent_packets_ = 0;
-};
-
-// Test that SignalSentPacket is fired when a packet is successfully sent, for
-// both TCP client and server sockets.
-TEST_F(TCPPortTest, SignalSentPacket) {
-  std::unique_ptr<TCPPort> client(CreateTCPPort(kLocalAddr));
-  std::unique_ptr<TCPPort> server(CreateTCPPort(kRemoteAddr));
-  client->SetIceRole(cricket::ICEROLE_CONTROLLING);
-  server->SetIceRole(cricket::ICEROLE_CONTROLLED);
-  client->PrepareAddress();
-  server->PrepareAddress();
-
-  Connection* client_conn =
-      client->CreateConnection(server->Candidates()[0], Port::ORIGIN_MESSAGE);
-  ASSERT_NE(nullptr, client_conn);
-  ASSERT_TRUE_WAIT(client_conn->connected(), kTimeout);
-
-  // Need to get the port of the actual outgoing socket, not the server socket..
-  cricket::Candidate client_candidate = client->Candidates()[0];
-  client_candidate.set_address(static_cast<cricket::TCPConnection*>(client_conn)
-                                   ->socket()
-                                   ->GetLocalAddress());
-  Connection* server_conn =
-      server->CreateConnection(client_candidate, Port::ORIGIN_THIS_PORT);
-  ASSERT_NE(nullptr, server_conn);
-  ASSERT_TRUE_WAIT(server_conn->connected(), kTimeout);
-
-  client_conn->Ping(rtc::TimeMillis());
-  server_conn->Ping(rtc::TimeMillis());
-  ASSERT_TRUE_WAIT(client_conn->writable(), kTimeout);
-  ASSERT_TRUE_WAIT(server_conn->writable(), kTimeout);
-
-  SentPacketCounter client_counter(client.get());
-  SentPacketCounter server_counter(server.get());
-  static const char kData[] = "hello";
-  for (int i = 0; i < 10; ++i) {
-    client_conn->Send(&kData, sizeof(kData), rtc::PacketOptions());
-    server_conn->Send(&kData, sizeof(kData), rtc::PacketOptions());
-  }
-  EXPECT_EQ_WAIT(10, client_counter.sent_packets(), kTimeout);
-  EXPECT_EQ_WAIT(10, server_counter.sent_packets(), kTimeout);
-}
diff --git a/p2p/base/testrelayserver.h b/p2p/base/testrelayserver.h
deleted file mode 100644
index 27bc4c1..0000000
--- a/p2p/base/testrelayserver.h
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- *  Copyright 2008 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_P2P_BASE_TESTRELAYSERVER_H_
-#define WEBRTC_P2P_BASE_TESTRELAYSERVER_H_
-
-#include <memory>
-
-#include "webrtc/p2p/base/relayserver.h"
-#include "webrtc/rtc_base/asynctcpsocket.h"
-#include "webrtc/rtc_base/sigslot.h"
-#include "webrtc/rtc_base/socketadapters.h"
-#include "webrtc/rtc_base/thread.h"
-
-namespace cricket {
-
-// A test relay server. Useful for unit tests.
-class TestRelayServer : public sigslot::has_slots<> {
- public:
-  TestRelayServer(rtc::Thread* thread,
-                  const rtc::SocketAddress& udp_int_addr,
-                  const rtc::SocketAddress& udp_ext_addr,
-                  const rtc::SocketAddress& tcp_int_addr,
-                  const rtc::SocketAddress& tcp_ext_addr,
-                  const rtc::SocketAddress& ssl_int_addr,
-                  const rtc::SocketAddress& ssl_ext_addr)
-      : server_(thread) {
-    server_.AddInternalSocket(rtc::AsyncUDPSocket::Create(
-        thread->socketserver(), udp_int_addr));
-    server_.AddExternalSocket(rtc::AsyncUDPSocket::Create(
-        thread->socketserver(), udp_ext_addr));
-
-    tcp_int_socket_.reset(CreateListenSocket(thread, tcp_int_addr));
-    tcp_ext_socket_.reset(CreateListenSocket(thread, tcp_ext_addr));
-    ssl_int_socket_.reset(CreateListenSocket(thread, ssl_int_addr));
-    ssl_ext_socket_.reset(CreateListenSocket(thread, ssl_ext_addr));
-  }
-  int GetConnectionCount() const {
-    return server_.GetConnectionCount();
-  }
-  rtc::SocketAddressPair GetConnection(int connection) const {
-    return server_.GetConnection(connection);
-  }
-  bool HasConnection(const rtc::SocketAddress& address) const {
-    return server_.HasConnection(address);
-  }
-
- private:
-  rtc::AsyncSocket* CreateListenSocket(rtc::Thread* thread,
-      const rtc::SocketAddress& addr) {
-    rtc::AsyncSocket* socket =
-        thread->socketserver()->CreateAsyncSocket(addr.family(), SOCK_STREAM);
-    socket->Bind(addr);
-    socket->Listen(5);
-    socket->SignalReadEvent.connect(this, &TestRelayServer::OnAccept);
-    return socket;
-  }
-  void OnAccept(rtc::AsyncSocket* socket) {
-    bool external = (socket == tcp_ext_socket_.get() ||
-                     socket == ssl_ext_socket_.get());
-    bool ssl = (socket == ssl_int_socket_.get() ||
-                socket == ssl_ext_socket_.get());
-    rtc::AsyncSocket* raw_socket = socket->Accept(NULL);
-    if (raw_socket) {
-      rtc::AsyncTCPSocket* packet_socket = new rtc::AsyncTCPSocket(
-          (!ssl) ? raw_socket :
-          new rtc::AsyncSSLServerSocket(raw_socket), false);
-      if (!external) {
-        packet_socket->SignalClose.connect(this,
-            &TestRelayServer::OnInternalClose);
-        server_.AddInternalSocket(packet_socket);
-      } else {
-        packet_socket->SignalClose.connect(this,
-            &TestRelayServer::OnExternalClose);
-        server_.AddExternalSocket(packet_socket);
-      }
-    }
-  }
-  void OnInternalClose(rtc::AsyncPacketSocket* socket, int error) {
-    server_.RemoveInternalSocket(socket);
-  }
-  void OnExternalClose(rtc::AsyncPacketSocket* socket, int error) {
-    server_.RemoveExternalSocket(socket);
-  }
- private:
-  cricket::RelayServer server_;
-  std::unique_ptr<rtc::AsyncSocket> tcp_int_socket_;
-  std::unique_ptr<rtc::AsyncSocket> tcp_ext_socket_;
-  std::unique_ptr<rtc::AsyncSocket> ssl_int_socket_;
-  std::unique_ptr<rtc::AsyncSocket> ssl_ext_socket_;
-};
-
-}  // namespace cricket
-
-#endif  // WEBRTC_P2P_BASE_TESTRELAYSERVER_H_
diff --git a/p2p/base/teststunserver.h b/p2p/base/teststunserver.h
deleted file mode 100644
index 1a9e670..0000000
--- a/p2p/base/teststunserver.h
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- *  Copyright 2008 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_P2P_BASE_TESTSTUNSERVER_H_
-#define WEBRTC_P2P_BASE_TESTSTUNSERVER_H_
-
-#include "webrtc/p2p/base/stunserver.h"
-#include "webrtc/rtc_base/socketaddress.h"
-#include "webrtc/rtc_base/thread.h"
-
-namespace cricket {
-
-// A test STUN server. Useful for unit tests.
-class TestStunServer : StunServer {
- public:
-  static TestStunServer* Create(rtc::Thread* thread,
-                                const rtc::SocketAddress& addr) {
-    rtc::AsyncSocket* socket =
-        thread->socketserver()->CreateAsyncSocket(addr.family(), SOCK_DGRAM);
-    rtc::AsyncUDPSocket* udp_socket =
-        rtc::AsyncUDPSocket::Create(socket, addr);
-
-    return new TestStunServer(udp_socket);
-  }
-
-  // Set a fake STUN address to return to the client.
-  void set_fake_stun_addr(const rtc::SocketAddress& addr) {
-    fake_stun_addr_ = addr;
-  }
-
- private:
-  explicit TestStunServer(rtc::AsyncUDPSocket* socket) : StunServer(socket) {}
-
-  void OnBindingRequest(StunMessage* msg,
-                        const rtc::SocketAddress& remote_addr) override {
-    if (fake_stun_addr_.IsNil()) {
-      StunServer::OnBindingRequest(msg, remote_addr);
-    } else {
-      StunMessage response;
-      GetStunBindReqponse(msg, fake_stun_addr_, &response);
-      SendResponse(response, remote_addr);
-    }
-  }
-
- private:
-  rtc::SocketAddress fake_stun_addr_;
-};
-
-}  // namespace cricket
-
-#endif  // WEBRTC_P2P_BASE_TESTSTUNSERVER_H_
diff --git a/p2p/base/testturnserver.h b/p2p/base/testturnserver.h
deleted file mode 100644
index 4333be0..0000000
--- a/p2p/base/testturnserver.h
+++ /dev/null
@@ -1,138 +0,0 @@
-/*
- *  Copyright 2012 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_P2P_BASE_TESTTURNSERVER_H_
-#define WEBRTC_P2P_BASE_TESTTURNSERVER_H_
-
-#include <string>
-#include <vector>
-
-#include "webrtc/p2p/base/basicpacketsocketfactory.h"
-#include "webrtc/p2p/base/stun.h"
-#include "webrtc/p2p/base/turnserver.h"
-#include "webrtc/rtc_base/asyncudpsocket.h"
-#include "webrtc/rtc_base/ssladapter.h"
-#include "webrtc/rtc_base/sslidentity.h"
-#include "webrtc/rtc_base/thread.h"
-
-namespace cricket {
-
-static const char kTestRealm[] = "example.org";
-static const char kTestSoftware[] = "TestTurnServer";
-
-class TestTurnRedirector : public TurnRedirectInterface {
- public:
-  explicit TestTurnRedirector(const std::vector<rtc::SocketAddress>& addresses)
-      : alternate_server_addresses_(addresses),
-        iter_(alternate_server_addresses_.begin()) {
-  }
-
-  virtual bool ShouldRedirect(const rtc::SocketAddress&,
-                              rtc::SocketAddress* out) {
-    if (!out || iter_ == alternate_server_addresses_.end()) {
-      return false;
-    }
-    *out = *iter_++;
-    return true;
-  }
-
- private:
-  const std::vector<rtc::SocketAddress>& alternate_server_addresses_;
-  std::vector<rtc::SocketAddress>::const_iterator iter_;
-};
-
-class TestTurnServer : public TurnAuthInterface {
- public:
-  TestTurnServer(rtc::Thread* thread,
-                 const rtc::SocketAddress& int_addr,
-                 const rtc::SocketAddress& udp_ext_addr,
-                 ProtocolType int_protocol = PROTO_UDP)
-      : server_(thread), thread_(thread) {
-    AddInternalSocket(int_addr, int_protocol);
-    server_.SetExternalSocketFactory(new rtc::BasicPacketSocketFactory(thread),
-                                     udp_ext_addr);
-    server_.set_realm(kTestRealm);
-    server_.set_software(kTestSoftware);
-    server_.set_auth_hook(this);
-  }
-
-  void set_enable_otu_nonce(bool enable) {
-    server_.set_enable_otu_nonce(enable);
-  }
-
-  TurnServer* server() { return &server_; }
-
-  void set_redirect_hook(TurnRedirectInterface* redirect_hook) {
-    server_.set_redirect_hook(redirect_hook);
-  }
-
-  void set_enable_permission_checks(bool enable) {
-    server_.set_enable_permission_checks(enable);
-  }
-
-  void AddInternalSocket(const rtc::SocketAddress& int_addr,
-                         ProtocolType proto) {
-    if (proto == cricket::PROTO_UDP) {
-      server_.AddInternalSocket(
-          rtc::AsyncUDPSocket::Create(thread_->socketserver(), int_addr),
-          proto);
-    } else if (proto == cricket::PROTO_TCP || proto == cricket::PROTO_TLS) {
-      // For TCP we need to create a server socket which can listen for incoming
-      // new connections.
-      rtc::AsyncSocket* socket =
-          thread_->socketserver()->CreateAsyncSocket(SOCK_STREAM);
-      if (proto == cricket::PROTO_TLS) {
-        // For TLS, wrap the TCP socket with an SSL adapter. The adapter must
-        // be configured with a self-signed certificate for testing.
-        // Additionally, the client will not present a valid certificate, so we
-        // must not fail when checking the peer's identity.
-        rtc::SSLAdapter* adapter = rtc::SSLAdapter::Create(socket);
-        adapter->SetRole(rtc::SSL_SERVER);
-        adapter->SetIdentity(
-            rtc::SSLIdentity::Generate("test turn server", rtc::KeyParams()));
-        adapter->SetIgnoreBadCert(true);
-        socket = adapter;
-      }
-      socket->Bind(int_addr);
-      socket->Listen(5);
-      server_.AddInternalServerSocket(socket, proto);
-    } else {
-      RTC_NOTREACHED() << "Unknown protocol type: " << proto;
-    }
-  }
-
-  // Finds the first allocation in the server allocation map with a source
-  // ip and port matching the socket address provided.
-  TurnServerAllocation* FindAllocation(const rtc::SocketAddress& src) {
-    const TurnServer::AllocationMap& map = server_.allocations();
-    for (TurnServer::AllocationMap::const_iterator it = map.begin();
-        it != map.end(); ++it) {
-      if (src == it->first.src()) {
-        return it->second.get();
-      }
-    }
-    return NULL;
-  }
-
- private:
-  // For this test server, succeed if the password is the same as the username.
-  // Obviously, do not use this in a production environment.
-  virtual bool GetKey(const std::string& username, const std::string& realm,
-                      std::string* key) {
-    return ComputeStunCredentialHash(username, realm, username, key);
-  }
-
-  TurnServer server_;
-  rtc::Thread* thread_;
-};
-
-}  // namespace cricket
-
-#endif  // WEBRTC_P2P_BASE_TESTTURNSERVER_H_
diff --git a/p2p/base/transport.h b/p2p/base/transport.h
deleted file mode 100644
index 0921a41..0000000
--- a/p2p/base/transport.h
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- *  Copyright 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.
- */
-
-// Most of the contents of this header have moved to jseptransport.h.
-// TODO(deadbeef): Delete this file when downstream dependents are updated.
-
-#ifndef WEBRTC_P2P_BASE_TRANSPORT_H_
-#define WEBRTC_P2P_BASE_TRANSPORT_H_
-
-#include "webrtc/p2p/base/transport.h"
-
-#endif  // WEBRTC_P2P_BASE_TRANSPORT_H_
diff --git a/p2p/base/transportchannelimpl.h b/p2p/base/transportchannelimpl.h
deleted file mode 100644
index cf6e362..0000000
--- a/p2p/base/transportchannelimpl.h
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- *  Copyright 2004 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_P2P_BASE_TRANSPORTCHANNELIMPL_H_
-#define WEBRTC_P2P_BASE_TRANSPORTCHANNELIMPL_H_
-
-#include <string>
-
-#include "webrtc/p2p/base/icetransportinternal.h"
-#include "webrtc/p2p/base/transportchannel.h"
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace webrtc {
-class MetricsObserverInterface;
-}
-
-namespace cricket {
-
-class Candidate;
-
-// Base class for real implementations of TransportChannel.  This includes some
-// methods called only by Transport, which do not need to be exposed to the
-// client.
-class TransportChannelImpl : public TransportChannel {
- public:
-  explicit TransportChannelImpl(const std::string& transport_name,
-                                int component)
-      : TransportChannel(transport_name, component) {}
-
-  // For ICE channels.
-  virtual IceRole GetIceRole() const = 0;
-  virtual void SetIceRole(IceRole role) = 0;
-  virtual void SetIceTiebreaker(uint64_t tiebreaker) = 0;
-  // TODO(pthatcher): Remove this once it's no longer called in
-  // remoting/protocol/libjingle_transport_factory.cc
-  virtual void SetIceProtocolType(IceProtocolType type) {}
-  // TODO(honghaiz): Remove this once the call in chromoting is removed.
-  virtual void SetIceCredentials(const std::string& ice_ufrag,
-                                 const std::string& ice_pwd) {
-    SetIceParameters(IceParameters(ice_ufrag, ice_pwd, false));
-  }
-  // TODO(honghaiz): Remove this once the call in chromoting is removed.
-  virtual void SetRemoteIceCredentials(const std::string& ice_ufrag,
-                                       const std::string& ice_pwd) {
-    SetRemoteIceParameters(IceParameters(ice_ufrag, ice_pwd, false));
-  }
-
-  // SetIceParameters only needs to be implemented by the ICE transport
-  // channels. Non-ICE transport channels should pass them down to the inner
-  // ICE transport channel. The ufrag and pwd in |ice_params| must be set
-  // before candidate gathering can start.
-  virtual void SetIceParameters(const IceParameters& ice_params) = 0;
-  // SetRemoteIceParameters only needs to be implemented by the ICE transport
-  // channels. Non-ICE transport channels should pass them down to the inner
-  // ICE transport channel.
-  virtual void SetRemoteIceParameters(const IceParameters& ice_params) = 0;
-
-  // SetRemoteIceMode must be implemented only by the ICE transport channels.
-  virtual void SetRemoteIceMode(IceMode mode) = 0;
-
-  virtual void SetIceConfig(const IceConfig& config) = 0;
-
-  // Start gathering candidates if not already started, or if an ICE restart
-  // occurred.
-  virtual void MaybeStartGathering() = 0;
-
-  virtual void SetMetricsObserver(
-      webrtc::MetricsObserverInterface* observer) = 0;
-
-  sigslot::signal1<TransportChannelImpl*> SignalGatheringState;
-
-  // Handles sending and receiving of candidates.  The Transport
-  // receives the candidates and may forward them to the relevant
-  // channel.
-  //
-  // Note: Since candidates are delivered asynchronously to the
-  // channel, they cannot return an error if the message is invalid.
-  // It is assumed that the Transport will have checked validity
-  // before forwarding.
-  sigslot::signal2<TransportChannelImpl*, const Candidate&>
-      SignalCandidateGathered;
-  sigslot::signal2<TransportChannelImpl*, const Candidates&>
-      SignalCandidatesRemoved;
-  virtual void AddRemoteCandidate(const Candidate& candidate) = 0;
-  virtual void RemoveRemoteCandidate(const Candidate& candidate) = 0;
-
-  virtual IceGatheringState gathering_state() const = 0;
-
-  // DTLS methods
-  virtual bool SetLocalCertificate(
-      const rtc::scoped_refptr<rtc::RTCCertificate>& certificate) = 0;
-
-  // Set DTLS Remote fingerprint. Must be after local identity set.
-  virtual bool SetRemoteFingerprint(const std::string& digest_alg,
-                                    const uint8_t* digest,
-                                    size_t digest_len) = 0;
-
-  virtual bool SetSslRole(rtc::SSLRole role) = 0;
-
-  // Invoked when there is conflict in the ICE role between local and remote
-  // agents.
-  sigslot::signal1<TransportChannelImpl*> SignalRoleConflict;
-
-  // Emitted whenever the transport channel state changed.
-  sigslot::signal1<TransportChannelImpl*> SignalStateChanged;
-
-  // Emitted whenever the Dtls handshake failed on some transport channel.
-  sigslot::signal1<rtc::SSLHandshakeError> SignalDtlsHandshakeError;
-
- private:
-  RTC_DISALLOW_COPY_AND_ASSIGN(TransportChannelImpl);
-};
-
-}  // namespace cricket
-
-#endif  // WEBRTC_P2P_BASE_TRANSPORTCHANNELIMPL_H_
diff --git a/p2p/base/transportcontroller.cc b/p2p/base/transportcontroller.cc
deleted file mode 100644
index 8f6674e..0000000
--- a/p2p/base/transportcontroller.cc
+++ /dev/null
@@ -1,891 +0,0 @@
-/*
- *  Copyright 2015 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/p2p/base/transportcontroller.h"
-
-#include <algorithm>
-#include <memory>
-
-#include "webrtc/p2p/base/port.h"
-#include "webrtc/rtc_base/bind.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/thread.h"
-
-namespace {
-
-enum {
-  MSG_ICECONNECTIONSTATE,
-  MSG_RECEIVING,
-  MSG_ICEGATHERINGSTATE,
-  MSG_CANDIDATESGATHERED,
-};
-
-struct CandidatesData : public rtc::MessageData {
-  CandidatesData(const std::string& transport_name,
-                 const cricket::Candidates& candidates)
-      : transport_name(transport_name), candidates(candidates) {}
-
-  std::string transport_name;
-  cricket::Candidates candidates;
-};
-
-}  // namespace {
-
-namespace cricket {
-
-// This class groups the DTLS and ICE channels, and helps keep track of
-// how many external objects (BaseChannels) reference each channel.
-class TransportController::ChannelPair {
- public:
-  // TODO(deadbeef): Change the types of |dtls| and |ice| to
-  // DtlsTransport and P2PTransportChannelWrapper, once TransportChannelImpl is
-  // removed.
-  ChannelPair(DtlsTransportInternal* dtls, IceTransportInternal* ice)
-      : ice_(ice), dtls_(dtls) {}
-
-  // Currently, all ICE-related calls still go through this DTLS channel. But
-  // that will change once we get rid of TransportChannelImpl, and the DTLS
-  // channel interface no longer includes ICE-specific methods.
-  const DtlsTransportInternal* dtls() const { return dtls_.get(); }
-  DtlsTransportInternal* dtls() { return dtls_.get(); }
-  const IceTransportInternal* ice() const { return ice_.get(); }
-  IceTransportInternal* ice() { return ice_.get(); }
-
- private:
-  std::unique_ptr<IceTransportInternal> ice_;
-  std::unique_ptr<DtlsTransportInternal> dtls_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(ChannelPair);
-};
-
-TransportController::TransportController(
-    rtc::Thread* signaling_thread,
-    rtc::Thread* network_thread,
-    PortAllocator* port_allocator,
-    bool redetermine_role_on_ice_restart,
-    const rtc::CryptoOptions& crypto_options)
-    : signaling_thread_(signaling_thread),
-      network_thread_(network_thread),
-      port_allocator_(port_allocator),
-      redetermine_role_on_ice_restart_(redetermine_role_on_ice_restart),
-      crypto_options_(crypto_options) {}
-
-TransportController::~TransportController() {
-  // Channel destructors may try to send packets, so this needs to happen on
-  // the network thread.
-  network_thread_->Invoke<void>(
-      RTC_FROM_HERE,
-      rtc::Bind(&TransportController::DestroyAllChannels_n, this));
-}
-
-bool TransportController::SetSslMaxProtocolVersion(
-    rtc::SSLProtocolVersion version) {
-  return network_thread_->Invoke<bool>(
-      RTC_FROM_HERE, rtc::Bind(&TransportController::SetSslMaxProtocolVersion_n,
-                               this, version));
-}
-
-void TransportController::SetIceConfig(const IceConfig& config) {
-  network_thread_->Invoke<void>(
-      RTC_FROM_HERE,
-      rtc::Bind(&TransportController::SetIceConfig_n, this, config));
-}
-
-void TransportController::SetIceRole(IceRole ice_role) {
-  network_thread_->Invoke<void>(
-      RTC_FROM_HERE,
-      rtc::Bind(&TransportController::SetIceRole_n, this, ice_role));
-}
-
-void TransportController::SetNeedsIceRestartFlag() {
-  for (auto& kv : transports_) {
-    kv.second->SetNeedsIceRestartFlag();
-  }
-}
-
-bool TransportController::NeedsIceRestart(
-    const std::string& transport_name) const {
-  const JsepTransport* transport = GetJsepTransport(transport_name);
-  if (!transport) {
-    return false;
-  }
-  return transport->NeedsIceRestart();
-}
-
-bool TransportController::GetSslRole(const std::string& transport_name,
-                                     rtc::SSLRole* role) const {
-  return network_thread_->Invoke<bool>(
-      RTC_FROM_HERE, rtc::Bind(&TransportController::GetSslRole_n, this,
-                               transport_name, role));
-}
-
-bool TransportController::SetLocalCertificate(
-    const rtc::scoped_refptr<rtc::RTCCertificate>& certificate) {
-  return network_thread_->Invoke<bool>(
-      RTC_FROM_HERE, rtc::Bind(&TransportController::SetLocalCertificate_n,
-                               this, certificate));
-}
-
-bool TransportController::GetLocalCertificate(
-    const std::string& transport_name,
-    rtc::scoped_refptr<rtc::RTCCertificate>* certificate) const {
-  if (network_thread_->IsCurrent()) {
-    return GetLocalCertificate_n(transport_name, certificate);
-  }
-  return network_thread_->Invoke<bool>(
-      RTC_FROM_HERE, rtc::Bind(&TransportController::GetLocalCertificate_n,
-                               this, transport_name, certificate));
-}
-
-std::unique_ptr<rtc::SSLCertificate>
-TransportController::GetRemoteSSLCertificate(
-    const std::string& transport_name) const {
-  if (network_thread_->IsCurrent()) {
-    return GetRemoteSSLCertificate_n(transport_name);
-  }
-  return network_thread_->Invoke<std::unique_ptr<rtc::SSLCertificate>>(
-      RTC_FROM_HERE, rtc::Bind(&TransportController::GetRemoteSSLCertificate_n,
-                               this, transport_name));
-}
-
-bool TransportController::SetLocalTransportDescription(
-    const std::string& transport_name,
-    const TransportDescription& tdesc,
-    ContentAction action,
-    std::string* err) {
-  return network_thread_->Invoke<bool>(
-      RTC_FROM_HERE,
-      rtc::Bind(&TransportController::SetLocalTransportDescription_n, this,
-                transport_name, tdesc, action, err));
-}
-
-bool TransportController::SetRemoteTransportDescription(
-    const std::string& transport_name,
-    const TransportDescription& tdesc,
-    ContentAction action,
-    std::string* err) {
-  return network_thread_->Invoke<bool>(
-      RTC_FROM_HERE,
-      rtc::Bind(&TransportController::SetRemoteTransportDescription_n, this,
-                transport_name, tdesc, action, err));
-}
-
-void TransportController::MaybeStartGathering() {
-  network_thread_->Invoke<void>(
-      RTC_FROM_HERE,
-      rtc::Bind(&TransportController::MaybeStartGathering_n, this));
-}
-
-bool TransportController::AddRemoteCandidates(const std::string& transport_name,
-                                              const Candidates& candidates,
-                                              std::string* err) {
-  return network_thread_->Invoke<bool>(
-      RTC_FROM_HERE, rtc::Bind(&TransportController::AddRemoteCandidates_n,
-                               this, transport_name, candidates, err));
-}
-
-bool TransportController::RemoveRemoteCandidates(const Candidates& candidates,
-                                                 std::string* err) {
-  return network_thread_->Invoke<bool>(
-      RTC_FROM_HERE, rtc::Bind(&TransportController::RemoveRemoteCandidates_n,
-                               this, candidates, err));
-}
-
-bool TransportController::ReadyForRemoteCandidates(
-    const std::string& transport_name) const {
-  return network_thread_->Invoke<bool>(
-      RTC_FROM_HERE, rtc::Bind(&TransportController::ReadyForRemoteCandidates_n,
-                               this, transport_name));
-}
-
-bool TransportController::GetStats(const std::string& transport_name,
-                                   TransportStats* stats) {
-  if (network_thread_->IsCurrent()) {
-    return GetStats_n(transport_name, stats);
-  }
-  return network_thread_->Invoke<bool>(
-      RTC_FROM_HERE,
-      rtc::Bind(&TransportController::GetStats_n, this, transport_name, stats));
-}
-
-void TransportController::SetMetricsObserver(
-    webrtc::MetricsObserverInterface* metrics_observer) {
-  return network_thread_->Invoke<void>(
-      RTC_FROM_HERE, rtc::Bind(&TransportController::SetMetricsObserver_n, this,
-                               metrics_observer));
-}
-
-DtlsTransportInternal* TransportController::CreateDtlsTransport(
-    const std::string& transport_name,
-    int component) {
-  return network_thread_->Invoke<DtlsTransportInternal*>(
-      RTC_FROM_HERE, rtc::Bind(&TransportController::CreateDtlsTransport_n,
-                               this, transport_name, component));
-}
-
-DtlsTransportInternal* TransportController::CreateDtlsTransport_n(
-    const std::string& transport_name,
-    int component) {
-  RTC_DCHECK(network_thread_->IsCurrent());
-
-  RefCountedChannel* existing_channel = GetChannel_n(transport_name, component);
-  if (existing_channel) {
-    // Channel already exists; increment reference count and return.
-    existing_channel->AddRef();
-    return existing_channel->dtls();
-  }
-
-  // Need to create a new channel.
-  JsepTransport* transport = GetOrCreateJsepTransport(transport_name);
-
-  // Create DTLS channel wrapping ICE channel, and configure it.
-  IceTransportInternal* ice =
-      CreateIceTransportChannel_n(transport_name, component);
-  // TODO(deadbeef): To support QUIC, would need to create a
-  // QuicTransportChannel here. What is "dtls" in this file would then become
-  // "dtls or quic".
-  DtlsTransportInternal* dtls =
-      CreateDtlsTransportChannel_n(transport_name, component, ice);
-  dtls->ice_transport()->SetMetricsObserver(metrics_observer_);
-  dtls->ice_transport()->SetIceRole(ice_role_);
-  dtls->ice_transport()->SetIceTiebreaker(ice_tiebreaker_);
-  dtls->ice_transport()->SetIceConfig(ice_config_);
-
-  // Connect to signals offered by the channels. Currently, the DTLS channel
-  // forwards signals from the ICE channel, so we only need to connect to the
-  // DTLS channel. In the future this won't be the case.
-  dtls->SignalWritableState.connect(
-      this, &TransportController::OnChannelWritableState_n);
-  dtls->SignalReceivingState.connect(
-      this, &TransportController::OnChannelReceivingState_n);
-  dtls->SignalDtlsHandshakeError.connect(
-      this, &TransportController::OnDtlsHandshakeError);
-  dtls->ice_transport()->SignalGatheringState.connect(
-      this, &TransportController::OnChannelGatheringState_n);
-  dtls->ice_transport()->SignalCandidateGathered.connect(
-      this, &TransportController::OnChannelCandidateGathered_n);
-  dtls->ice_transport()->SignalCandidatesRemoved.connect(
-      this, &TransportController::OnChannelCandidatesRemoved_n);
-  dtls->ice_transport()->SignalRoleConflict.connect(
-      this, &TransportController::OnChannelRoleConflict_n);
-  dtls->ice_transport()->SignalStateChanged.connect(
-      this, &TransportController::OnChannelStateChanged_n);
-  RefCountedChannel* new_pair = new RefCountedChannel(dtls, ice);
-  new_pair->AddRef();
-  channels_.insert(channels_.end(), new_pair);
-  bool channel_added = transport->AddChannel(dtls, component);
-  RTC_DCHECK(channel_added);
-  // Adding a channel could cause aggregate state to change.
-  UpdateAggregateStates_n();
-  return dtls;
-}
-
-void TransportController::DestroyDtlsTransport(
-    const std::string& transport_name,
-    int component) {
-  network_thread_->Invoke<void>(
-      RTC_FROM_HERE, rtc::Bind(&TransportController::DestroyDtlsTransport_n,
-                               this, transport_name, component));
-}
-
-void TransportController::DestroyDtlsTransport_n(
-    const std::string& transport_name,
-    int component) {
-  RTC_DCHECK(network_thread_->IsCurrent());
-  auto it = GetChannelIterator_n(transport_name, component);
-  if (it == channels_.end()) {
-    LOG(LS_WARNING) << "Attempting to delete " << transport_name
-                    << " TransportChannel " << component
-                    << ", which doesn't exist.";
-    return;
-  }
-  if ((*it)->Release() > 0) {
-    return;
-  }
-  channels_.erase(it);
-
-  JsepTransport* t = GetJsepTransport(transport_name);
-  bool channel_removed = t->RemoveChannel(component);
-  RTC_DCHECK(channel_removed);
-  // Just as we create a Transport when its first channel is created,
-  // we delete it when its last channel is deleted.
-  if (!t->HasChannels()) {
-    transports_.erase(transport_name);
-  }
-  // Removing a channel could cause aggregate state to change.
-  UpdateAggregateStates_n();
-}
-
-std::vector<std::string> TransportController::transport_names_for_testing() {
-  std::vector<std::string> ret;
-  for (const auto& kv : transports_) {
-    ret.push_back(kv.first);
-  }
-  return ret;
-}
-
-std::vector<DtlsTransportInternal*>
-TransportController::channels_for_testing() {
-  std::vector<DtlsTransportInternal*> ret;
-  for (RefCountedChannel* channel : channels_) {
-    ret.push_back(channel->dtls());
-  }
-  return ret;
-}
-
-DtlsTransportInternal* TransportController::get_channel_for_testing(
-    const std::string& transport_name,
-    int component) {
-  RefCountedChannel* ch = GetChannel_n(transport_name, component);
-  return ch ? ch->dtls() : nullptr;
-}
-
-IceTransportInternal* TransportController::CreateIceTransportChannel_n(
-    const std::string& transport_name,
-    int component) {
-  return new P2PTransportChannel(transport_name, component, port_allocator_);
-}
-
-DtlsTransportInternal* TransportController::CreateDtlsTransportChannel_n(
-    const std::string&,
-    int,
-    IceTransportInternal* ice) {
-  DtlsTransport* dtls = new DtlsTransport(ice, crypto_options_);
-  dtls->SetSslMaxProtocolVersion(ssl_max_version_);
-  return dtls;
-}
-
-void TransportController::OnMessage(rtc::Message* pmsg) {
-  RTC_DCHECK(signaling_thread_->IsCurrent());
-
-  switch (pmsg->message_id) {
-    case MSG_ICECONNECTIONSTATE: {
-      rtc::TypedMessageData<IceConnectionState>* data =
-          static_cast<rtc::TypedMessageData<IceConnectionState>*>(pmsg->pdata);
-      SignalConnectionState(data->data());
-      delete data;
-      break;
-    }
-    case MSG_RECEIVING: {
-      rtc::TypedMessageData<bool>* data =
-          static_cast<rtc::TypedMessageData<bool>*>(pmsg->pdata);
-      SignalReceiving(data->data());
-      delete data;
-      break;
-    }
-    case MSG_ICEGATHERINGSTATE: {
-      rtc::TypedMessageData<IceGatheringState>* data =
-          static_cast<rtc::TypedMessageData<IceGatheringState>*>(pmsg->pdata);
-      SignalGatheringState(data->data());
-      delete data;
-      break;
-    }
-    case MSG_CANDIDATESGATHERED: {
-      CandidatesData* data = static_cast<CandidatesData*>(pmsg->pdata);
-      SignalCandidatesGathered(data->transport_name, data->candidates);
-      delete data;
-      break;
-    }
-    default:
-      RTC_NOTREACHED();
-  }
-}
-
-std::vector<TransportController::RefCountedChannel*>::iterator
-TransportController::GetChannelIterator_n(const std::string& transport_name,
-                                          int component) {
-  RTC_DCHECK(network_thread_->IsCurrent());
-  return std::find_if(channels_.begin(), channels_.end(),
-                      [transport_name, component](RefCountedChannel* channel) {
-                        return channel->dtls()->transport_name() ==
-                                   transport_name &&
-                               channel->dtls()->component() == component;
-                      });
-}
-
-std::vector<TransportController::RefCountedChannel*>::const_iterator
-TransportController::GetChannelIterator_n(const std::string& transport_name,
-                                          int component) const {
-  RTC_DCHECK(network_thread_->IsCurrent());
-  return std::find_if(
-      channels_.begin(), channels_.end(),
-      [transport_name, component](const RefCountedChannel* channel) {
-        return channel->dtls()->transport_name() == transport_name &&
-               channel->dtls()->component() == component;
-      });
-}
-
-const JsepTransport* TransportController::GetJsepTransport(
-    const std::string& transport_name) const {
-  auto it = transports_.find(transport_name);
-  return (it == transports_.end()) ? nullptr : it->second.get();
-}
-
-JsepTransport* TransportController::GetJsepTransport(
-    const std::string& transport_name) {
-  auto it = transports_.find(transport_name);
-  return (it == transports_.end()) ? nullptr : it->second.get();
-}
-
-const TransportController::RefCountedChannel* TransportController::GetChannel_n(
-    const std::string& transport_name,
-    int component) const {
-  RTC_DCHECK(network_thread_->IsCurrent());
-  auto it = GetChannelIterator_n(transport_name, component);
-  return (it == channels_.end()) ? nullptr : *it;
-}
-
-TransportController::RefCountedChannel* TransportController::GetChannel_n(
-    const std::string& transport_name,
-    int component) {
-  RTC_DCHECK(network_thread_->IsCurrent());
-  auto it = GetChannelIterator_n(transport_name, component);
-  return (it == channels_.end()) ? nullptr : *it;
-}
-
-JsepTransport* TransportController::GetOrCreateJsepTransport(
-    const std::string& transport_name) {
-  RTC_DCHECK(network_thread_->IsCurrent());
-
-  JsepTransport* transport = GetJsepTransport(transport_name);
-  if (transport) {
-    return transport;
-  }
-
-  transport = new JsepTransport(transport_name, certificate_);
-  transports_[transport_name] = std::unique_ptr<JsepTransport>(transport);
-  return transport;
-}
-
-void TransportController::DestroyAllChannels_n() {
-  RTC_DCHECK(network_thread_->IsCurrent());
-  transports_.clear();
-  for (RefCountedChannel* channel : channels_) {
-    // Even though these objects are normally ref-counted, if
-    // TransportController is deleted while they still have references, just
-    // remove all references.
-    while (channel->Release() > 0) {
-    }
-  }
-  channels_.clear();
-}
-
-bool TransportController::SetSslMaxProtocolVersion_n(
-    rtc::SSLProtocolVersion version) {
-  RTC_DCHECK(network_thread_->IsCurrent());
-
-  // Max SSL version can only be set before transports are created.
-  if (!transports_.empty()) {
-    return false;
-  }
-
-  ssl_max_version_ = version;
-  return true;
-}
-
-void TransportController::SetIceConfig_n(const IceConfig& config) {
-  RTC_DCHECK(network_thread_->IsCurrent());
-
-  ice_config_ = config;
-  for (auto& channel : channels_) {
-    channel->dtls()->ice_transport()->SetIceConfig(ice_config_);
-  }
-}
-
-void TransportController::SetIceRole_n(IceRole ice_role) {
-  RTC_DCHECK(network_thread_->IsCurrent());
-
-  ice_role_ = ice_role;
-  for (auto& channel : channels_) {
-    channel->dtls()->ice_transport()->SetIceRole(ice_role_);
-  }
-}
-
-bool TransportController::GetSslRole_n(const std::string& transport_name,
-                                       rtc::SSLRole* role) const {
-  RTC_DCHECK(network_thread_->IsCurrent());
-
-  const JsepTransport* t = GetJsepTransport(transport_name);
-  if (!t) {
-    return false;
-  }
-  rtc::Optional<rtc::SSLRole> current_role = t->GetSslRole();
-  if (!current_role) {
-    return false;
-  }
-  *role = *current_role;
-  return true;
-}
-
-bool TransportController::SetLocalCertificate_n(
-    const rtc::scoped_refptr<rtc::RTCCertificate>& certificate) {
-  RTC_DCHECK(network_thread_->IsCurrent());
-
-  // Can't change a certificate, or set a null certificate.
-  if (certificate_ || !certificate) {
-    return false;
-  }
-  certificate_ = certificate;
-
-  // Set certificate for JsepTransport, which verifies it matches the
-  // fingerprint in SDP, and only applies it to the DTLS transport if a
-  // fingerprint attribute is present in SDP. This is used for fallback from
-  // DTLS to SDES.
-  for (auto& kv : transports_) {
-    kv.second->SetLocalCertificate(certificate_);
-  }
-  return true;
-}
-
-bool TransportController::GetLocalCertificate_n(
-    const std::string& transport_name,
-    rtc::scoped_refptr<rtc::RTCCertificate>* certificate) const {
-  RTC_DCHECK(network_thread_->IsCurrent());
-
-  const JsepTransport* t = GetJsepTransport(transport_name);
-  if (!t) {
-    return false;
-  }
-  return t->GetLocalCertificate(certificate);
-}
-
-std::unique_ptr<rtc::SSLCertificate>
-TransportController::GetRemoteSSLCertificate_n(
-    const std::string& transport_name) const {
-  RTC_DCHECK(network_thread_->IsCurrent());
-
-  // Get the certificate from the RTP channel's DTLS handshake. Should be
-  // identical to the RTCP channel's, since they were given the same remote
-  // fingerprint.
-  const RefCountedChannel* ch = GetChannel_n(transport_name, 1);
-  if (!ch) {
-    return nullptr;
-  }
-  return ch->dtls()->GetRemoteSSLCertificate();
-}
-
-bool TransportController::SetLocalTransportDescription_n(
-    const std::string& transport_name,
-    const TransportDescription& tdesc,
-    ContentAction action,
-    std::string* err) {
-  RTC_DCHECK(network_thread_->IsCurrent());
-
-  JsepTransport* transport = GetJsepTransport(transport_name);
-  if (!transport) {
-    // If we didn't find a transport, that's not an error;
-    // it could have been deleted as a result of bundling.
-    // TODO(deadbeef): Make callers smarter so they won't attempt to set a
-    // description on a deleted transport.
-    return true;
-  }
-
-  // Older versions of Chrome expect the ICE role to be re-determined when an
-  // ICE restart occurs, and also don't perform conflict resolution correctly,
-  // so for now we can't safely stop doing this, unless the application opts in
-  // by setting |redetermine_role_on_ice_restart_| to false.
-  // See: https://bugs.chromium.org/p/chromium/issues/detail?id=628676
-  // TODO(deadbeef): Remove this when these old versions of Chrome reach a low
-  // enough population.
-  if (redetermine_role_on_ice_restart_ && transport->local_description() &&
-      IceCredentialsChanged(transport->local_description()->ice_ufrag,
-                            transport->local_description()->ice_pwd,
-                            tdesc.ice_ufrag, tdesc.ice_pwd) &&
-      // Don't change the ICE role if the remote endpoint is ICE lite; we
-      // should always be controlling in that case.
-      (!transport->remote_description() ||
-       transport->remote_description()->ice_mode != ICEMODE_LITE)) {
-    IceRole new_ice_role =
-        (action == CA_OFFER) ? ICEROLE_CONTROLLING : ICEROLE_CONTROLLED;
-    SetIceRole(new_ice_role);
-  }
-
-  LOG(LS_INFO) << "Set local transport description on " << transport_name;
-  return transport->SetLocalTransportDescription(tdesc, action, err);
-}
-
-bool TransportController::SetRemoteTransportDescription_n(
-    const std::string& transport_name,
-    const TransportDescription& tdesc,
-    ContentAction action,
-    std::string* err) {
-  RTC_DCHECK(network_thread_->IsCurrent());
-
-  // If our role is ICEROLE_CONTROLLED and the remote endpoint supports only
-  // ice_lite, this local endpoint should take the CONTROLLING role.
-  // TODO(deadbeef): This is a session-level attribute, so it really shouldn't
-  // be in a TransportDescription in the first place...
-  if (ice_role_ == ICEROLE_CONTROLLED && tdesc.ice_mode == ICEMODE_LITE) {
-    SetIceRole_n(ICEROLE_CONTROLLING);
-  }
-
-  JsepTransport* transport = GetJsepTransport(transport_name);
-  if (!transport) {
-    // If we didn't find a transport, that's not an error;
-    // it could have been deleted as a result of bundling.
-    // TODO(deadbeef): Make callers smarter so they won't attempt to set a
-    // description on a deleted transport.
-    return true;
-  }
-
-  LOG(LS_INFO) << "Set remote transport description on " << transport_name;
-  return transport->SetRemoteTransportDescription(tdesc, action, err);
-}
-
-void TransportController::MaybeStartGathering_n() {
-  for (auto& channel : channels_) {
-    channel->dtls()->ice_transport()->MaybeStartGathering();
-  }
-}
-
-bool TransportController::AddRemoteCandidates_n(
-    const std::string& transport_name,
-    const Candidates& candidates,
-    std::string* err) {
-  RTC_DCHECK(network_thread_->IsCurrent());
-
-  // Verify each candidate before passing down to the transport layer.
-  if (!VerifyCandidates(candidates, err)) {
-    return false;
-  }
-
-  JsepTransport* transport = GetJsepTransport(transport_name);
-  if (!transport) {
-    // If we didn't find a transport, that's not an error;
-    // it could have been deleted as a result of bundling.
-    return true;
-  }
-
-  for (const Candidate& candidate : candidates) {
-    RefCountedChannel* channel =
-        GetChannel_n(transport_name, candidate.component());
-    if (!channel) {
-      *err = "Candidate has an unknown component: " + candidate.ToString() +
-             " for content: " + transport_name;
-      return false;
-    }
-    channel->dtls()->ice_transport()->AddRemoteCandidate(candidate);
-  }
-  return true;
-}
-
-bool TransportController::RemoveRemoteCandidates_n(const Candidates& candidates,
-                                                   std::string* err) {
-  RTC_DCHECK(network_thread_->IsCurrent());
-
-  // Verify each candidate before passing down to the transport layer.
-  if (!VerifyCandidates(candidates, err)) {
-    return false;
-  }
-
-  std::map<std::string, Candidates> candidates_by_transport_name;
-  for (const Candidate& cand : candidates) {
-    RTC_DCHECK(!cand.transport_name().empty());
-    candidates_by_transport_name[cand.transport_name()].push_back(cand);
-  }
-
-  bool result = true;
-  for (const auto& kv : candidates_by_transport_name) {
-    const std::string& transport_name = kv.first;
-    const Candidates& candidates = kv.second;
-    JsepTransport* transport = GetJsepTransport(transport_name);
-    if (!transport) {
-      // If we didn't find a transport, that's not an error;
-      // it could have been deleted as a result of bundling.
-      continue;
-    }
-    for (const Candidate& candidate : candidates) {
-      RefCountedChannel* channel =
-          GetChannel_n(transport_name, candidate.component());
-      if (channel) {
-        channel->dtls()->ice_transport()->RemoveRemoteCandidate(candidate);
-      }
-    }
-  }
-  return result;
-}
-
-bool TransportController::ReadyForRemoteCandidates_n(
-    const std::string& transport_name) const {
-  RTC_DCHECK(network_thread_->IsCurrent());
-
-  const JsepTransport* transport = GetJsepTransport(transport_name);
-  if (!transport) {
-    return false;
-  }
-  return transport->ready_for_remote_candidates();
-}
-
-bool TransportController::GetStats_n(const std::string& transport_name,
-                                     TransportStats* stats) {
-  RTC_DCHECK(network_thread_->IsCurrent());
-
-  JsepTransport* transport = GetJsepTransport(transport_name);
-  if (!transport) {
-    return false;
-  }
-  return transport->GetStats(stats);
-}
-
-void TransportController::SetMetricsObserver_n(
-    webrtc::MetricsObserverInterface* metrics_observer) {
-  RTC_DCHECK(network_thread_->IsCurrent());
-  metrics_observer_ = metrics_observer;
-  for (auto& channel : channels_) {
-    channel->dtls()->ice_transport()->SetMetricsObserver(metrics_observer);
-  }
-}
-
-void TransportController::OnChannelWritableState_n(
-    rtc::PacketTransportInternal* transport) {
-  RTC_DCHECK(network_thread_->IsCurrent());
-  LOG(LS_INFO) << " TransportChannel " << transport->debug_name()
-               << " writability changed to " << transport->writable() << ".";
-  UpdateAggregateStates_n();
-}
-
-void TransportController::OnChannelReceivingState_n(
-    rtc::PacketTransportInternal* transport) {
-  RTC_DCHECK(network_thread_->IsCurrent());
-  UpdateAggregateStates_n();
-}
-
-void TransportController::OnChannelGatheringState_n(
-    IceTransportInternal* channel) {
-  RTC_DCHECK(network_thread_->IsCurrent());
-  UpdateAggregateStates_n();
-}
-
-void TransportController::OnChannelCandidateGathered_n(
-    IceTransportInternal* channel,
-    const Candidate& candidate) {
-  RTC_DCHECK(network_thread_->IsCurrent());
-
-  // We should never signal peer-reflexive candidates.
-  if (candidate.type() == PRFLX_PORT_TYPE) {
-    RTC_NOTREACHED();
-    return;
-  }
-  std::vector<Candidate> candidates;
-  candidates.push_back(candidate);
-  CandidatesData* data =
-      new CandidatesData(channel->transport_name(), candidates);
-  signaling_thread_->Post(RTC_FROM_HERE, this, MSG_CANDIDATESGATHERED, data);
-}
-
-void TransportController::OnChannelCandidatesRemoved_n(
-    IceTransportInternal* channel,
-    const Candidates& candidates) {
-  invoker_.AsyncInvoke<void>(
-      RTC_FROM_HERE, signaling_thread_,
-      rtc::Bind(&TransportController::OnChannelCandidatesRemoved, this,
-                candidates));
-}
-
-void TransportController::OnChannelCandidatesRemoved(
-    const Candidates& candidates) {
-  RTC_DCHECK(signaling_thread_->IsCurrent());
-  SignalCandidatesRemoved(candidates);
-}
-
-void TransportController::OnChannelRoleConflict_n(
-    IceTransportInternal* channel) {
-  RTC_DCHECK(network_thread_->IsCurrent());
-  // Note: since the role conflict is handled entirely on the network thread,
-  // we don't need to worry about role conflicts occurring on two ports at once.
-  // The first one encountered should immediately reverse the role.
-  IceRole reversed_role = (ice_role_ == ICEROLE_CONTROLLING)
-                              ? ICEROLE_CONTROLLED
-                              : ICEROLE_CONTROLLING;
-  LOG(LS_INFO) << "Got role conflict; switching to "
-               << (reversed_role == ICEROLE_CONTROLLING ? "controlling"
-                                                        : "controlled")
-               << " role.";
-  SetIceRole_n(reversed_role);
-}
-
-void TransportController::OnChannelStateChanged_n(
-    IceTransportInternal* channel) {
-  RTC_DCHECK(network_thread_->IsCurrent());
-  LOG(LS_INFO) << channel->transport_name() << " TransportChannel "
-               << channel->component()
-               << " state changed. Check if state is complete.";
-  UpdateAggregateStates_n();
-}
-
-void TransportController::UpdateAggregateStates_n() {
-  RTC_DCHECK(network_thread_->IsCurrent());
-
-  IceConnectionState new_connection_state = kIceConnectionConnecting;
-  IceGatheringState new_gathering_state = kIceGatheringNew;
-  bool any_receiving = false;
-  bool any_failed = false;
-  bool all_connected = !channels_.empty();
-  bool all_completed = !channels_.empty();
-  bool any_gathering = false;
-  bool all_done_gathering = !channels_.empty();
-  for (const auto& channel : channels_) {
-    any_receiving = any_receiving || channel->dtls()->receiving();
-    any_failed = any_failed ||
-                 channel->dtls()->ice_transport()->GetState() ==
-                     IceTransportState::STATE_FAILED;
-    all_connected = all_connected && channel->dtls()->writable();
-    all_completed =
-        all_completed && channel->dtls()->writable() &&
-        channel->dtls()->ice_transport()->GetState() ==
-            IceTransportState::STATE_COMPLETED &&
-        channel->dtls()->ice_transport()->GetIceRole() == ICEROLE_CONTROLLING &&
-        channel->dtls()->ice_transport()->gathering_state() ==
-            kIceGatheringComplete;
-    any_gathering =
-        any_gathering ||
-        channel->dtls()->ice_transport()->gathering_state() != kIceGatheringNew;
-    all_done_gathering = all_done_gathering &&
-                         channel->dtls()->ice_transport()->gathering_state() ==
-                             kIceGatheringComplete;
-  }
-  if (any_failed) {
-    new_connection_state = kIceConnectionFailed;
-  } else if (all_completed) {
-    new_connection_state = kIceConnectionCompleted;
-  } else if (all_connected) {
-    new_connection_state = kIceConnectionConnected;
-  }
-  if (connection_state_ != new_connection_state) {
-    connection_state_ = new_connection_state;
-    signaling_thread_->Post(
-        RTC_FROM_HERE, this, MSG_ICECONNECTIONSTATE,
-        new rtc::TypedMessageData<IceConnectionState>(new_connection_state));
-  }
-
-  if (receiving_ != any_receiving) {
-    receiving_ = any_receiving;
-    signaling_thread_->Post(RTC_FROM_HERE, this, MSG_RECEIVING,
-                            new rtc::TypedMessageData<bool>(any_receiving));
-  }
-
-  if (all_done_gathering) {
-    new_gathering_state = kIceGatheringComplete;
-  } else if (any_gathering) {
-    new_gathering_state = kIceGatheringGathering;
-  }
-  if (gathering_state_ != new_gathering_state) {
-    gathering_state_ = new_gathering_state;
-    signaling_thread_->Post(
-        RTC_FROM_HERE, this, MSG_ICEGATHERINGSTATE,
-        new rtc::TypedMessageData<IceGatheringState>(new_gathering_state));
-  }
-}
-
-void TransportController::OnDtlsHandshakeError(rtc::SSLHandshakeError error) {
-  SignalDtlsHandshakeError(error);
-}
-
-}  // namespace cricket
diff --git a/p2p/base/transportcontroller.h b/p2p/base/transportcontroller.h
deleted file mode 100644
index 108800e..0000000
--- a/p2p/base/transportcontroller.h
+++ /dev/null
@@ -1,279 +0,0 @@
-/*
- *  Copyright 2015 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_P2P_BASE_TRANSPORTCONTROLLER_H_
-#define WEBRTC_P2P_BASE_TRANSPORTCONTROLLER_H_
-
-#include <map>
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "webrtc/p2p/base/candidate.h"
-#include "webrtc/p2p/base/dtlstransport.h"
-#include "webrtc/p2p/base/jseptransport.h"
-#include "webrtc/p2p/base/p2ptransportchannel.h"
-#include "webrtc/rtc_base/asyncinvoker.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/refcountedobject.h"
-#include "webrtc/rtc_base/sigslot.h"
-#include "webrtc/rtc_base/sslstreamadapter.h"
-
-namespace rtc {
-class Thread;
-class PacketTransportInternal;
-}
-namespace webrtc {
-class MetricsObserverInterface;
-}
-
-namespace cricket {
-
-class TransportController : public sigslot::has_slots<>,
-                            public rtc::MessageHandler {
- public:
-  // If |redetermine_role_on_ice_restart| is true, ICE role is redetermined
-  // upon setting a local transport description that indicates an ICE restart.
-  // For the constructor that doesn't take this parameter, it defaults to true.
-  //
-  // |crypto_options| is used to determine if created DTLS transports negotiate
-  // GCM crypto suites or not.
-  TransportController(rtc::Thread* signaling_thread,
-                      rtc::Thread* network_thread,
-                      PortAllocator* port_allocator,
-                      bool redetermine_role_on_ice_restart,
-                      const rtc::CryptoOptions& crypto_options);
-
-  virtual ~TransportController();
-
-  rtc::Thread* signaling_thread() const { return signaling_thread_; }
-  rtc::Thread* network_thread() const { return network_thread_; }
-
-  PortAllocator* port_allocator() const { return port_allocator_; }
-
-  // Can only be set before transports are created.
-  // TODO(deadbeef): Make this an argument to the constructor once BaseSession
-  // and WebRtcSession are combined
-  bool SetSslMaxProtocolVersion(rtc::SSLProtocolVersion version);
-
-  void SetIceConfig(const IceConfig& config);
-  void SetIceRole(IceRole ice_role);
-
-  // Set the "needs-ice-restart" flag as described in JSEP. After the flag is
-  // set, offers should generate new ufrags/passwords until an ICE restart
-  // occurs.
-  void SetNeedsIceRestartFlag();
-  // Returns true if the ICE restart flag above was set, and no ICE restart has
-  // occurred yet for this transport (by applying a local description with
-  // changed ufrag/password). If the transport has been deleted as a result of
-  // bundling, returns false.
-  bool NeedsIceRestart(const std::string& transport_name) const;
-
-  bool GetSslRole(const std::string& transport_name, rtc::SSLRole* role) const;
-
-  // Specifies the identity to use in this session.
-  // Can only be called once.
-  bool SetLocalCertificate(
-      const rtc::scoped_refptr<rtc::RTCCertificate>& certificate);
-  bool GetLocalCertificate(
-      const std::string& transport_name,
-      rtc::scoped_refptr<rtc::RTCCertificate>* certificate) const;
-  // Caller owns returned certificate. This method mainly exists for stats
-  // reporting.
-  std::unique_ptr<rtc::SSLCertificate> GetRemoteSSLCertificate(
-      const std::string& transport_name) const;
-  bool SetLocalTransportDescription(const std::string& transport_name,
-                                    const TransportDescription& tdesc,
-                                    ContentAction action,
-                                    std::string* err);
-  bool SetRemoteTransportDescription(const std::string& transport_name,
-                                     const TransportDescription& tdesc,
-                                     ContentAction action,
-                                     std::string* err);
-  // Start gathering candidates for any new transports, or transports doing an
-  // ICE restart.
-  void MaybeStartGathering();
-  bool AddRemoteCandidates(const std::string& transport_name,
-                           const Candidates& candidates,
-                           std::string* err);
-  bool RemoveRemoteCandidates(const Candidates& candidates, std::string* err);
-  bool ReadyForRemoteCandidates(const std::string& transport_name) const;
-  // TODO(deadbeef): GetStats isn't const because all the way down to
-  // OpenSSLStreamAdapter,
-  // GetSslCipherSuite and GetDtlsSrtpCryptoSuite are not const. Fix this.
-  bool GetStats(const std::string& transport_name, TransportStats* stats);
-  void SetMetricsObserver(webrtc::MetricsObserverInterface* metrics_observer);
-
-  // Creates a channel if it doesn't exist. Otherwise, increments a reference
-  // count and returns an existing channel.
-  DtlsTransportInternal* CreateDtlsTransport(const std::string& transport_name,
-                                             int component);
-  virtual DtlsTransportInternal* CreateDtlsTransport_n(
-      const std::string& transport_name,
-      int component);
-
-  // Decrements a channel's reference count, and destroys the channel if
-  // nothing is referencing it.
-  virtual void DestroyDtlsTransport(const std::string& transport_name,
-                                    int component);
-  virtual void DestroyDtlsTransport_n(const std::string& transport_name,
-                                      int component);
-
-  void use_quic() { quic_ = true; }
-  bool quic() const { return quic_; }
-
-  // TODO(deadbeef): Remove all for_testing methods!
-  const rtc::scoped_refptr<rtc::RTCCertificate>& certificate_for_testing()
-      const {
-    return certificate_;
-  }
-  std::vector<std::string> transport_names_for_testing();
-  std::vector<DtlsTransportInternal*> channels_for_testing();
-  DtlsTransportInternal* get_channel_for_testing(
-      const std::string& transport_name,
-      int component);
-
-  // All of these signals are fired on the signalling thread.
-
-  // If any transport failed => failed,
-  // Else if all completed => completed,
-  // Else if all connected => connected,
-  // Else => connecting
-  sigslot::signal1<IceConnectionState> SignalConnectionState;
-
-  // Receiving if any transport is receiving
-  sigslot::signal1<bool> SignalReceiving;
-
-  // If all transports done gathering => complete,
-  // Else if any are gathering => gathering,
-  // Else => new
-  sigslot::signal1<IceGatheringState> SignalGatheringState;
-
-  // (transport_name, candidates)
-  sigslot::signal2<const std::string&, const Candidates&>
-      SignalCandidatesGathered;
-
-  sigslot::signal1<const Candidates&> SignalCandidatesRemoved;
-
-  sigslot::signal1<rtc::SSLHandshakeError> SignalDtlsHandshakeError;
-
- protected:
-  // TODO(deadbeef): Get rid of these virtual methods. Used by
-  // FakeTransportController currently, but FakeTransportController shouldn't
-  // even be functioning by subclassing TransportController.
-  virtual IceTransportInternal* CreateIceTransportChannel_n(
-      const std::string& transport_name,
-      int component);
-  virtual DtlsTransportInternal* CreateDtlsTransportChannel_n(
-      const std::string& transport_name,
-      int component,
-      IceTransportInternal* ice);
-
- private:
-  void OnMessage(rtc::Message* pmsg) override;
-
-  class ChannelPair;
-  typedef rtc::RefCountedObject<ChannelPair> RefCountedChannel;
-
-  // Helper functions to get a channel or transport, or iterator to it (in case
-  // it needs to be erased).
-  std::vector<RefCountedChannel*>::iterator GetChannelIterator_n(
-      const std::string& transport_name,
-      int component);
-  std::vector<RefCountedChannel*>::const_iterator GetChannelIterator_n(
-      const std::string& transport_name,
-      int component) const;
-  const JsepTransport* GetJsepTransport(
-      const std::string& transport_name) const;
-  JsepTransport* GetJsepTransport(const std::string& transport_name);
-  const RefCountedChannel* GetChannel_n(const std::string& transport_name,
-                                        int component) const;
-  RefCountedChannel* GetChannel_n(const std::string& transport_name,
-                                  int component);
-
-  JsepTransport* GetOrCreateJsepTransport(const std::string& transport_name);
-  void DestroyAllChannels_n();
-
-  bool SetSslMaxProtocolVersion_n(rtc::SSLProtocolVersion version);
-  void SetIceConfig_n(const IceConfig& config);
-  void SetIceRole_n(IceRole ice_role);
-  bool GetSslRole_n(const std::string& transport_name,
-                    rtc::SSLRole* role) const;
-  bool SetLocalCertificate_n(
-      const rtc::scoped_refptr<rtc::RTCCertificate>& certificate);
-  bool GetLocalCertificate_n(
-      const std::string& transport_name,
-      rtc::scoped_refptr<rtc::RTCCertificate>* certificate) const;
-  std::unique_ptr<rtc::SSLCertificate> GetRemoteSSLCertificate_n(
-      const std::string& transport_name) const;
-  bool SetLocalTransportDescription_n(const std::string& transport_name,
-                                      const TransportDescription& tdesc,
-                                      ContentAction action,
-                                      std::string* err);
-  bool SetRemoteTransportDescription_n(const std::string& transport_name,
-                                       const TransportDescription& tdesc,
-                                       ContentAction action,
-                                       std::string* err);
-  void MaybeStartGathering_n();
-  bool AddRemoteCandidates_n(const std::string& transport_name,
-                             const Candidates& candidates,
-                             std::string* err);
-  bool RemoveRemoteCandidates_n(const Candidates& candidates, std::string* err);
-  bool ReadyForRemoteCandidates_n(const std::string& transport_name) const;
-  bool GetStats_n(const std::string& transport_name, TransportStats* stats);
-  void SetMetricsObserver_n(webrtc::MetricsObserverInterface* metrics_observer);
-
-  // Handlers for signals from Transport.
-  void OnChannelWritableState_n(rtc::PacketTransportInternal* transport);
-  void OnChannelReceivingState_n(rtc::PacketTransportInternal* transport);
-  void OnChannelGatheringState_n(IceTransportInternal* channel);
-  void OnChannelCandidateGathered_n(IceTransportInternal* channel,
-                                    const Candidate& candidate);
-  void OnChannelCandidatesRemoved(const Candidates& candidates);
-  void OnChannelCandidatesRemoved_n(IceTransportInternal* channel,
-                                    const Candidates& candidates);
-  void OnChannelRoleConflict_n(IceTransportInternal* channel);
-  void OnChannelStateChanged_n(IceTransportInternal* channel);
-
-  void UpdateAggregateStates_n();
-
-  void OnDtlsHandshakeError(rtc::SSLHandshakeError error);
-
-  rtc::Thread* const signaling_thread_ = nullptr;
-  rtc::Thread* const network_thread_ = nullptr;
-  PortAllocator* const port_allocator_ = nullptr;
-
-  std::map<std::string, std::unique_ptr<JsepTransport>> transports_;
-  std::vector<RefCountedChannel*> channels_;
-
-  // Aggregate state for TransportChannelImpls.
-  IceConnectionState connection_state_ = kIceConnectionConnecting;
-  bool receiving_ = false;
-  IceGatheringState gathering_state_ = kIceGatheringNew;
-
-  IceConfig ice_config_;
-  IceRole ice_role_ = ICEROLE_CONTROLLING;
-  bool redetermine_role_on_ice_restart_;
-  uint64_t ice_tiebreaker_ = rtc::CreateRandomId64();
-  rtc::CryptoOptions crypto_options_;
-  rtc::SSLProtocolVersion ssl_max_version_ = rtc::SSL_PROTOCOL_DTLS_12;
-  rtc::scoped_refptr<rtc::RTCCertificate> certificate_;
-  rtc::AsyncInvoker invoker_;
-  // True if QUIC is used instead of DTLS.
-  bool quic_ = false;
-
-  webrtc::MetricsObserverInterface* metrics_observer_ = nullptr;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(TransportController);
-};
-
-}  // namespace cricket
-
-#endif  // WEBRTC_P2P_BASE_TRANSPORTCONTROLLER_H_
diff --git a/p2p/base/transportcontroller_unittest.cc b/p2p/base/transportcontroller_unittest.cc
deleted file mode 100644
index 9352f15..0000000
--- a/p2p/base/transportcontroller_unittest.cc
+++ /dev/null
@@ -1,909 +0,0 @@
-/*
- *  Copyright 2015 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 <map>
-#include <memory>
-
-#include "webrtc/p2p/base/dtlstransport.h"
-#include "webrtc/p2p/base/fakeportallocator.h"
-#include "webrtc/p2p/base/faketransportcontroller.h"
-#include "webrtc/p2p/base/p2ptransportchannel.h"
-#include "webrtc/p2p/base/portallocator.h"
-#include "webrtc/p2p/base/transportcontroller.h"
-#include "webrtc/rtc_base/fakesslidentity.h"
-#include "webrtc/rtc_base/gunit.h"
-#include "webrtc/rtc_base/helpers.h"
-#include "webrtc/rtc_base/sslidentity.h"
-#include "webrtc/rtc_base/thread.h"
-
-static const int kTimeout = 100;
-static const char kIceUfrag1[] = "TESTICEUFRAG0001";
-static const char kIcePwd1[] = "TESTICEPWD00000000000001";
-static const char kIceUfrag2[] = "TESTICEUFRAG0002";
-static const char kIcePwd2[] = "TESTICEPWD00000000000002";
-static const char kIceUfrag3[] = "TESTICEUFRAG0003";
-static const char kIcePwd3[] = "TESTICEPWD00000000000003";
-
-namespace cricket {
-
-// Only subclassing from FakeTransportController because currently that's the
-// only way to have a TransportController with fake ICE/DTLS transports.
-//
-// TODO(deadbeef): Pass a "TransportFactory" or something similar into
-// TransportController, instead of using inheritance in this way for testing.
-typedef FakeTransportController TransportControllerForTest;
-
-class TransportControllerTest : public testing::Test,
-                                public sigslot::has_slots<> {
- public:
-  TransportControllerTest()
-      : transport_controller_(new TransportControllerForTest()),
-        signaling_thread_(rtc::Thread::Current()) {
-    ConnectTransportControllerSignals();
-  }
-
-  void CreateTransportControllerWithNetworkThread() {
-    if (!network_thread_) {
-      network_thread_ = rtc::Thread::CreateWithSocketServer();
-      network_thread_->Start();
-    }
-    transport_controller_.reset(
-        new TransportControllerForTest(network_thread_.get()));
-    ConnectTransportControllerSignals();
-  }
-
-  void ConnectTransportControllerSignals() {
-    transport_controller_->SignalConnectionState.connect(
-        this, &TransportControllerTest::OnConnectionState);
-    transport_controller_->SignalReceiving.connect(
-        this, &TransportControllerTest::OnReceiving);
-    transport_controller_->SignalGatheringState.connect(
-        this, &TransportControllerTest::OnGatheringState);
-    transport_controller_->SignalCandidatesGathered.connect(
-        this, &TransportControllerTest::OnCandidatesGathered);
-  }
-
-  FakeDtlsTransport* CreateFakeDtlsTransport(const std::string& content,
-                                             int component) {
-    DtlsTransportInternal* transport =
-        transport_controller_->CreateDtlsTransport_n(content, component);
-    return static_cast<FakeDtlsTransport*>(transport);
-  }
-
-  void DestroyFakeDtlsTransport(const std::string& content, int component) {
-    transport_controller_->DestroyDtlsTransport_n(content, component);
-  }
-
-  Candidate CreateCandidate(int component) {
-    Candidate c;
-    c.set_address(rtc::SocketAddress("192.168.1.1", 8000));
-    c.set_component(1);
-    c.set_protocol(UDP_PROTOCOL_NAME);
-    c.set_priority(1);
-    return c;
-  }
-
-  // Used for thread hopping test.
-  void CreateFakeDtlsTransportsAndCompleteConnectionOnNetworkThread() {
-    network_thread_->Invoke<void>(
-        RTC_FROM_HERE,
-        rtc::Bind(&TransportControllerTest::
-                      CreateFakeDtlsTransportsAndCompleteConnection_w,
-                  this));
-  }
-
-  void CreateFakeDtlsTransportsAndCompleteConnection_w() {
-    transport_controller_->SetIceRole(ICEROLE_CONTROLLING);
-    FakeDtlsTransport* transport1 = CreateFakeDtlsTransport("audio", 1);
-    ASSERT_NE(nullptr, transport1);
-    FakeDtlsTransport* transport2 = CreateFakeDtlsTransport("video", 1);
-    ASSERT_NE(nullptr, transport2);
-
-    TransportDescription local_desc(std::vector<std::string>(), kIceUfrag1,
-                                    kIcePwd1, ICEMODE_FULL,
-                                    CONNECTIONROLE_ACTPASS, nullptr);
-    std::string err;
-    transport_controller_->SetLocalTransportDescription("audio", local_desc,
-                                                        CA_OFFER, &err);
-    transport_controller_->SetLocalTransportDescription("video", local_desc,
-                                                        CA_OFFER, &err);
-    transport_controller_->MaybeStartGathering();
-    transport1->fake_ice_transport()->SignalCandidateGathered(
-        transport1->fake_ice_transport(), CreateCandidate(1));
-    transport2->fake_ice_transport()->SignalCandidateGathered(
-        transport2->fake_ice_transport(), CreateCandidate(1));
-    transport1->fake_ice_transport()->SetCandidatesGatheringComplete();
-    transport2->fake_ice_transport()->SetCandidatesGatheringComplete();
-    transport1->fake_ice_transport()->SetConnectionCount(2);
-    transport2->fake_ice_transport()->SetConnectionCount(2);
-    transport1->SetReceiving(true);
-    transport2->SetReceiving(true);
-    transport1->SetWritable(true);
-    transport2->SetWritable(true);
-    transport1->fake_ice_transport()->SetConnectionCount(1);
-    transport2->fake_ice_transport()->SetConnectionCount(1);
-  }
-
-  IceConfig CreateIceConfig(
-      int receiving_timeout,
-      ContinualGatheringPolicy continual_gathering_policy) {
-    IceConfig config;
-    config.receiving_timeout = receiving_timeout;
-    config.continual_gathering_policy = continual_gathering_policy;
-    return config;
-  }
-
- protected:
-  void OnConnectionState(IceConnectionState state) {
-    if (!signaling_thread_->IsCurrent()) {
-      signaled_on_non_signaling_thread_ = true;
-    }
-    connection_state_ = state;
-    ++connection_state_signal_count_;
-  }
-
-  void OnReceiving(bool receiving) {
-    if (!signaling_thread_->IsCurrent()) {
-      signaled_on_non_signaling_thread_ = true;
-    }
-    receiving_ = receiving;
-    ++receiving_signal_count_;
-  }
-
-  void OnGatheringState(IceGatheringState state) {
-    if (!signaling_thread_->IsCurrent()) {
-      signaled_on_non_signaling_thread_ = true;
-    }
-    gathering_state_ = state;
-    ++gathering_state_signal_count_;
-  }
-
-  void OnCandidatesGathered(const std::string& transport_name,
-                            const Candidates& candidates) {
-    if (!signaling_thread_->IsCurrent()) {
-      signaled_on_non_signaling_thread_ = true;
-    }
-    candidates_[transport_name].insert(candidates_[transport_name].end(),
-                                       candidates.begin(), candidates.end());
-    ++candidates_signal_count_;
-  }
-
-  std::unique_ptr<rtc::Thread> network_thread_;  // Not used for most tests.
-  std::unique_ptr<TransportControllerForTest> transport_controller_;
-
-  // Information received from signals from transport controller.
-  IceConnectionState connection_state_ = kIceConnectionConnecting;
-  bool receiving_ = false;
-  IceGatheringState gathering_state_ = kIceGatheringNew;
-  // transport_name => candidates
-  std::map<std::string, Candidates> candidates_;
-  // Counts of each signal emitted.
-  int connection_state_signal_count_ = 0;
-  int receiving_signal_count_ = 0;
-  int gathering_state_signal_count_ = 0;
-  int candidates_signal_count_ = 0;
-
-  // Used to make sure signals only come on signaling thread.
-  rtc::Thread* const signaling_thread_ = nullptr;
-  bool signaled_on_non_signaling_thread_ = false;
-};
-
-TEST_F(TransportControllerTest, TestSetIceConfig) {
-  FakeDtlsTransport* transport1 = CreateFakeDtlsTransport("audio", 1);
-  ASSERT_NE(nullptr, transport1);
-
-  transport_controller_->SetIceConfig(
-      CreateIceConfig(1000, GATHER_CONTINUALLY));
-  EXPECT_EQ(1000, transport1->fake_ice_transport()->receiving_timeout());
-  EXPECT_TRUE(transport1->fake_ice_transport()->gather_continually());
-
-  transport_controller_->SetIceConfig(
-      CreateIceConfig(1000, GATHER_CONTINUALLY_AND_RECOVER));
-  // Test that value stored in controller is applied to new transports.
-  FakeDtlsTransport* transport2 = CreateFakeDtlsTransport("video", 1);
-  ASSERT_NE(nullptr, transport2);
-  EXPECT_EQ(1000, transport2->fake_ice_transport()->receiving_timeout());
-  EXPECT_TRUE(transport2->fake_ice_transport()->gather_continually());
-}
-
-TEST_F(TransportControllerTest, TestSetSslMaxProtocolVersion) {
-  EXPECT_TRUE(transport_controller_->SetSslMaxProtocolVersion(
-      rtc::SSL_PROTOCOL_DTLS_12));
-  FakeDtlsTransport* transport = CreateFakeDtlsTransport("audio", 1);
-
-  ASSERT_NE(nullptr, transport);
-  EXPECT_EQ(rtc::SSL_PROTOCOL_DTLS_12, transport->ssl_max_protocol_version());
-
-  // Setting max version after transport is created should fail.
-  EXPECT_FALSE(transport_controller_->SetSslMaxProtocolVersion(
-      rtc::SSL_PROTOCOL_DTLS_10));
-}
-
-TEST_F(TransportControllerTest, TestSetIceRole) {
-  FakeDtlsTransport* transport1 = CreateFakeDtlsTransport("audio", 1);
-  ASSERT_NE(nullptr, transport1);
-
-  transport_controller_->SetIceRole(ICEROLE_CONTROLLING);
-  EXPECT_EQ(ICEROLE_CONTROLLING,
-            transport1->fake_ice_transport()->GetIceRole());
-  transport_controller_->SetIceRole(ICEROLE_CONTROLLED);
-  EXPECT_EQ(ICEROLE_CONTROLLED, transport1->fake_ice_transport()->GetIceRole());
-
-  // Test that value stored in controller is applied to new transports.
-  FakeDtlsTransport* transport2 = CreateFakeDtlsTransport("video", 1);
-  ASSERT_NE(nullptr, transport2);
-  EXPECT_EQ(ICEROLE_CONTROLLED, transport2->fake_ice_transport()->GetIceRole());
-}
-
-// Test that when one transport encounters a role conflict, the ICE role is
-// swapped on every transport.
-TEST_F(TransportControllerTest, TestIceRoleConflict) {
-  FakeDtlsTransport* transport1 = CreateFakeDtlsTransport("audio", 1);
-  ASSERT_NE(nullptr, transport1);
-  FakeDtlsTransport* transport2 = CreateFakeDtlsTransport("video", 1);
-  ASSERT_NE(nullptr, transport2);
-
-  transport_controller_->SetIceRole(ICEROLE_CONTROLLING);
-  EXPECT_EQ(ICEROLE_CONTROLLING,
-            transport1->fake_ice_transport()->GetIceRole());
-  EXPECT_EQ(ICEROLE_CONTROLLING,
-            transport2->fake_ice_transport()->GetIceRole());
-
-  transport1->fake_ice_transport()->SignalRoleConflict(
-      transport1->fake_ice_transport());
-  EXPECT_EQ(ICEROLE_CONTROLLED, transport1->fake_ice_transport()->GetIceRole());
-  EXPECT_EQ(ICEROLE_CONTROLLED, transport2->fake_ice_transport()->GetIceRole());
-
-  // Should be able to handle a second role conflict. The remote endpoint can
-  // change its role/tie-breaker when it does an ICE restart.
-  transport2->fake_ice_transport()->SignalRoleConflict(
-      transport2->fake_ice_transport());
-  EXPECT_EQ(ICEROLE_CONTROLLING,
-            transport1->fake_ice_transport()->GetIceRole());
-  EXPECT_EQ(ICEROLE_CONTROLLING,
-            transport2->fake_ice_transport()->GetIceRole());
-}
-
-TEST_F(TransportControllerTest, TestGetSslRole) {
-  rtc::SSLRole role;
-  CreateFakeDtlsTransport("audio", 1);
-
-  // Should return false before role has been negotiated.
-  EXPECT_FALSE(transport_controller_->GetSslRole("audio", &role));
-
-  // To negotiate an SSL role, need to set a local certificate, and
-  // local/remote transport descriptions with DTLS info.
-  rtc::scoped_refptr<rtc::RTCCertificate> certificate =
-      rtc::RTCCertificate::Create(std::unique_ptr<rtc::SSLIdentity>(
-          rtc::SSLIdentity::Generate("testing", rtc::KT_ECDSA)));
-  std::unique_ptr<rtc::SSLFingerprint> fingerprint(
-      rtc::SSLFingerprint::CreateFromCertificate(certificate));
-  transport_controller_->SetLocalCertificate(certificate);
-
-  // Set the same fingerprint on both sides since the remote fingerprint
-  // doesn't really matter for this test.
-  TransportDescription local_desc(std::vector<std::string>(), kIceUfrag1,
-                                  kIcePwd1, ICEMODE_FULL,
-                                  CONNECTIONROLE_ACTPASS, fingerprint.get());
-  TransportDescription remote_desc(std::vector<std::string>(), kIceUfrag2,
-                                   kIcePwd2, ICEMODE_FULL,
-                                   CONNECTIONROLE_ACTIVE, fingerprint.get());
-  std::string err;
-  EXPECT_TRUE(transport_controller_->SetLocalTransportDescription(
-      "audio", local_desc, cricket::CA_OFFER, &err));
-  EXPECT_TRUE(transport_controller_->SetRemoteTransportDescription(
-      "audio", remote_desc, cricket::CA_ANSWER, &err));
-
-  // Finally we can get the role. Should be "server" since the remote
-  // endpoint's role was "active".
-  EXPECT_TRUE(transport_controller_->GetSslRole("audio", &role));
-  EXPECT_EQ(rtc::SSL_SERVER, role);
-
-  // Lastly, test that GetSslRole returns false for a nonexistent transport.
-  EXPECT_FALSE(transport_controller_->GetSslRole("video", &role));
-}
-
-TEST_F(TransportControllerTest, TestSetAndGetLocalCertificate) {
-  rtc::scoped_refptr<rtc::RTCCertificate> certificate1 =
-      rtc::RTCCertificate::Create(std::unique_ptr<rtc::SSLIdentity>(
-          rtc::SSLIdentity::Generate("session1", rtc::KT_DEFAULT)));
-  rtc::scoped_refptr<rtc::RTCCertificate> certificate2 =
-      rtc::RTCCertificate::Create(std::unique_ptr<rtc::SSLIdentity>(
-          rtc::SSLIdentity::Generate("session2", rtc::KT_DEFAULT)));
-  rtc::scoped_refptr<rtc::RTCCertificate> returned_certificate;
-
-  FakeDtlsTransport* transport1 = CreateFakeDtlsTransport("audio", 1);
-  ASSERT_NE(nullptr, transport1);
-
-  EXPECT_TRUE(transport_controller_->SetLocalCertificate(certificate1));
-  EXPECT_TRUE(transport_controller_->GetLocalCertificate(
-      "audio", &returned_certificate));
-  EXPECT_EQ(certificate1->identity()->certificate().ToPEMString(),
-            returned_certificate->identity()->certificate().ToPEMString());
-
-  // Should fail if called for a nonexistant transport.
-  EXPECT_FALSE(transport_controller_->GetLocalCertificate(
-      "video", &returned_certificate));
-
-  // Test that identity stored in controller is applied to new transports.
-  FakeDtlsTransport* transport2 = CreateFakeDtlsTransport("video", 1);
-  ASSERT_NE(nullptr, transport2);
-  EXPECT_TRUE(transport_controller_->GetLocalCertificate(
-      "video", &returned_certificate));
-  EXPECT_EQ(certificate1->identity()->certificate().ToPEMString(),
-            returned_certificate->identity()->certificate().ToPEMString());
-
-  // Shouldn't be able to change the identity once set.
-  EXPECT_FALSE(transport_controller_->SetLocalCertificate(certificate2));
-}
-
-TEST_F(TransportControllerTest, TestGetRemoteSSLCertificate) {
-  rtc::FakeSSLCertificate fake_certificate("fake_data");
-
-  FakeDtlsTransport* transport = CreateFakeDtlsTransport("audio", 1);
-  ASSERT_NE(nullptr, transport);
-
-  transport->SetRemoteSSLCertificate(&fake_certificate);
-  std::unique_ptr<rtc::SSLCertificate> returned_certificate =
-      transport_controller_->GetRemoteSSLCertificate("audio");
-  EXPECT_TRUE(returned_certificate);
-  EXPECT_EQ(fake_certificate.ToPEMString(),
-            returned_certificate->ToPEMString());
-
-  // Should fail if called for a nonexistant transport.
-  EXPECT_FALSE(transport_controller_->GetRemoteSSLCertificate("video"));
-}
-
-TEST_F(TransportControllerTest, TestSetLocalTransportDescription) {
-  FakeDtlsTransport* transport = CreateFakeDtlsTransport("audio", 1);
-  ASSERT_NE(nullptr, transport);
-  TransportDescription local_desc(std::vector<std::string>(), kIceUfrag1,
-                                  kIcePwd1, ICEMODE_FULL,
-                                  CONNECTIONROLE_ACTPASS, nullptr);
-  std::string err;
-  EXPECT_TRUE(transport_controller_->SetLocalTransportDescription(
-      "audio", local_desc, CA_OFFER, &err));
-  // Check that ICE ufrag and pwd were propagated to transport.
-  EXPECT_EQ(kIceUfrag1, transport->fake_ice_transport()->ice_ufrag());
-  EXPECT_EQ(kIcePwd1, transport->fake_ice_transport()->ice_pwd());
-  // After setting local description, we should be able to start gathering
-  // candidates.
-  transport_controller_->MaybeStartGathering();
-  EXPECT_EQ_WAIT(kIceGatheringGathering, gathering_state_, kTimeout);
-  EXPECT_EQ(1, gathering_state_signal_count_);
-}
-
-TEST_F(TransportControllerTest, TestSetRemoteTransportDescription) {
-  FakeDtlsTransport* transport = CreateFakeDtlsTransport("audio", 1);
-  ASSERT_NE(nullptr, transport);
-  TransportDescription remote_desc(std::vector<std::string>(), kIceUfrag1,
-                                   kIcePwd1, ICEMODE_FULL,
-                                   CONNECTIONROLE_ACTPASS, nullptr);
-  std::string err;
-  EXPECT_TRUE(transport_controller_->SetRemoteTransportDescription(
-      "audio", remote_desc, CA_OFFER, &err));
-  // Check that ICE ufrag and pwd were propagated to transport.
-  EXPECT_EQ(kIceUfrag1, transport->fake_ice_transport()->remote_ice_ufrag());
-  EXPECT_EQ(kIcePwd1, transport->fake_ice_transport()->remote_ice_pwd());
-}
-
-TEST_F(TransportControllerTest, TestAddRemoteCandidates) {
-  FakeDtlsTransport* transport = CreateFakeDtlsTransport("audio", 1);
-  ASSERT_NE(nullptr, transport);
-  Candidates candidates;
-  candidates.push_back(CreateCandidate(1));
-  std::string err;
-  EXPECT_TRUE(
-      transport_controller_->AddRemoteCandidates("audio", candidates, &err));
-  EXPECT_EQ(1U, transport->fake_ice_transport()->remote_candidates().size());
-}
-
-TEST_F(TransportControllerTest, TestReadyForRemoteCandidates) {
-  FakeDtlsTransport* transport = CreateFakeDtlsTransport("audio", 1);
-  ASSERT_NE(nullptr, transport);
-  // We expect to be ready for remote candidates only after local and remote
-  // descriptions are set.
-  EXPECT_FALSE(transport_controller_->ReadyForRemoteCandidates("audio"));
-
-  std::string err;
-  TransportDescription remote_desc(std::vector<std::string>(), kIceUfrag1,
-                                   kIcePwd1, ICEMODE_FULL,
-                                   CONNECTIONROLE_ACTPASS, nullptr);
-  EXPECT_TRUE(transport_controller_->SetRemoteTransportDescription(
-      "audio", remote_desc, CA_OFFER, &err));
-  EXPECT_FALSE(transport_controller_->ReadyForRemoteCandidates("audio"));
-
-  TransportDescription local_desc(std::vector<std::string>(), kIceUfrag2,
-                                  kIcePwd2, ICEMODE_FULL,
-                                  CONNECTIONROLE_ACTPASS, nullptr);
-  EXPECT_TRUE(transport_controller_->SetLocalTransportDescription(
-      "audio", local_desc, CA_ANSWER, &err));
-  EXPECT_TRUE(transport_controller_->ReadyForRemoteCandidates("audio"));
-}
-
-TEST_F(TransportControllerTest, TestGetStats) {
-  FakeDtlsTransport* transport1 = CreateFakeDtlsTransport("audio", 1);
-  ASSERT_NE(nullptr, transport1);
-  FakeDtlsTransport* transport2 = CreateFakeDtlsTransport("audio", 2);
-  ASSERT_NE(nullptr, transport2);
-  FakeDtlsTransport* transport3 = CreateFakeDtlsTransport("video", 1);
-  ASSERT_NE(nullptr, transport3);
-
-  TransportStats stats;
-  EXPECT_TRUE(transport_controller_->GetStats("audio", &stats));
-  EXPECT_EQ("audio", stats.transport_name);
-  EXPECT_EQ(2U, stats.channel_stats.size());
-}
-
-// Test that a "transport" from a stats perspective (combination of RTP/RTCP
-// transports) goes away when all references to its transports are gone.
-TEST_F(TransportControllerTest, TestCreateAndDestroyFakeDtlsTransport) {
-  FakeDtlsTransport* transport1 = CreateFakeDtlsTransport("audio", 1);
-  ASSERT_NE(nullptr, transport1);
-  FakeDtlsTransport* transport2 = CreateFakeDtlsTransport("audio", 1);
-  ASSERT_NE(nullptr, transport2);
-  ASSERT_EQ(transport1, transport2);
-  FakeDtlsTransport* transport3 = CreateFakeDtlsTransport("audio", 2);
-  ASSERT_NE(nullptr, transport3);
-
-  // Using GetStats to check if transport is destroyed from an outside class's
-  // perspective.
-  TransportStats stats;
-  EXPECT_TRUE(transport_controller_->GetStats("audio", &stats));
-  DestroyFakeDtlsTransport("audio", 2);
-  DestroyFakeDtlsTransport("audio", 1);
-  EXPECT_TRUE(transport_controller_->GetStats("audio", &stats));
-  DestroyFakeDtlsTransport("audio", 1);
-  EXPECT_FALSE(transport_controller_->GetStats("audio", &stats));
-}
-
-TEST_F(TransportControllerTest, TestSignalConnectionStateFailed) {
-  // Need controlling ICE role to get in failed state.
-  transport_controller_->SetIceRole(ICEROLE_CONTROLLING);
-  FakeDtlsTransport* transport1 = CreateFakeDtlsTransport("audio", 1);
-  ASSERT_NE(nullptr, transport1);
-  FakeDtlsTransport* transport2 = CreateFakeDtlsTransport("video", 1);
-  ASSERT_NE(nullptr, transport2);
-
-  // Should signal "failed" if any transport failed; transport is considered
-  // failed
-  // if it previously had a connection but now has none, and gathering is
-  // complete.
-  transport1->fake_ice_transport()->SetCandidatesGatheringComplete();
-  transport1->fake_ice_transport()->SetConnectionCount(1);
-  transport1->fake_ice_transport()->SetConnectionCount(0);
-  EXPECT_EQ_WAIT(kIceConnectionFailed, connection_state_, kTimeout);
-  EXPECT_EQ(1, connection_state_signal_count_);
-}
-
-TEST_F(TransportControllerTest, TestSignalConnectionStateConnected) {
-  transport_controller_->SetIceRole(ICEROLE_CONTROLLING);
-  FakeDtlsTransport* transport1 = CreateFakeDtlsTransport("audio", 1);
-  ASSERT_NE(nullptr, transport1);
-  FakeDtlsTransport* transport2 = CreateFakeDtlsTransport("video", 1);
-  ASSERT_NE(nullptr, transport2);
-  FakeDtlsTransport* transport3 = CreateFakeDtlsTransport("video", 2);
-  ASSERT_NE(nullptr, transport3);
-
-  // First, have one transport connect, and another fail, to ensure that
-  // the first transport connecting didn't trigger a "connected" state signal.
-  // We should only get a signal when all are connected.
-  transport1->fake_ice_transport()->SetConnectionCount(2);
-  transport1->SetWritable(true);
-  transport3->fake_ice_transport()->SetCandidatesGatheringComplete();
-  transport3->fake_ice_transport()->SetConnectionCount(1);
-  transport3->fake_ice_transport()->SetConnectionCount(0);
-  EXPECT_EQ_WAIT(kIceConnectionFailed, connection_state_, kTimeout);
-  // Signal count of 1 means that the only signal emitted was "failed".
-  EXPECT_EQ(1, connection_state_signal_count_);
-
-  // Destroy the failed transport to return to "connecting" state.
-  DestroyFakeDtlsTransport("video", 2);
-  EXPECT_EQ_WAIT(kIceConnectionConnecting, connection_state_, kTimeout);
-  EXPECT_EQ(2, connection_state_signal_count_);
-
-  // Make the remaining transport reach a connected state.
-  transport2->fake_ice_transport()->SetConnectionCount(2);
-  transport2->SetWritable(true);
-  EXPECT_EQ_WAIT(kIceConnectionConnected, connection_state_, kTimeout);
-  EXPECT_EQ(3, connection_state_signal_count_);
-}
-
-TEST_F(TransportControllerTest, TestSignalConnectionStateComplete) {
-  transport_controller_->SetIceRole(ICEROLE_CONTROLLING);
-  FakeDtlsTransport* transport1 = CreateFakeDtlsTransport("audio", 1);
-  ASSERT_NE(nullptr, transport1);
-  FakeDtlsTransport* transport2 = CreateFakeDtlsTransport("video", 1);
-  ASSERT_NE(nullptr, transport2);
-  FakeDtlsTransport* transport3 = CreateFakeDtlsTransport("video", 2);
-  ASSERT_NE(nullptr, transport3);
-
-  // Similar to above test, but we're now reaching the completed state, which
-  // means only one connection per FakeDtlsTransport.
-  transport1->fake_ice_transport()->SetCandidatesGatheringComplete();
-  transport1->fake_ice_transport()->SetConnectionCount(1);
-  transport1->SetWritable(true);
-  transport3->fake_ice_transport()->SetCandidatesGatheringComplete();
-  transport3->fake_ice_transport()->SetConnectionCount(1);
-  transport3->fake_ice_transport()->SetConnectionCount(0);
-  EXPECT_EQ_WAIT(kIceConnectionFailed, connection_state_, kTimeout);
-  // Signal count of 1 means that the only signal emitted was "failed".
-  EXPECT_EQ(1, connection_state_signal_count_);
-
-  // Destroy the failed transport to return to "connecting" state.
-  DestroyFakeDtlsTransport("video", 2);
-  EXPECT_EQ_WAIT(kIceConnectionConnecting, connection_state_, kTimeout);
-  EXPECT_EQ(2, connection_state_signal_count_);
-
-  // Make the remaining transport reach a connected state.
-  transport2->fake_ice_transport()->SetCandidatesGatheringComplete();
-  transport2->fake_ice_transport()->SetConnectionCount(2);
-  transport2->SetWritable(true);
-  EXPECT_EQ_WAIT(kIceConnectionConnected, connection_state_, kTimeout);
-  EXPECT_EQ(3, connection_state_signal_count_);
-
-  // Finally, transition to completed state.
-  transport2->fake_ice_transport()->SetConnectionCount(1);
-  EXPECT_EQ_WAIT(kIceConnectionCompleted, connection_state_, kTimeout);
-  EXPECT_EQ(4, connection_state_signal_count_);
-}
-
-// Make sure that if we're "connected" and remove a transport, we stay in the
-// "connected" state.
-TEST_F(TransportControllerTest, TestDestroyTransportAndStayConnected) {
-  FakeDtlsTransport* transport1 = CreateFakeDtlsTransport("audio", 1);
-  ASSERT_NE(nullptr, transport1);
-  FakeDtlsTransport* transport2 = CreateFakeDtlsTransport("video", 1);
-  ASSERT_NE(nullptr, transport2);
-
-  transport1->fake_ice_transport()->SetCandidatesGatheringComplete();
-  transport1->fake_ice_transport()->SetConnectionCount(2);
-  transport1->SetWritable(true);
-  transport2->fake_ice_transport()->SetCandidatesGatheringComplete();
-  transport2->fake_ice_transport()->SetConnectionCount(2);
-  transport2->SetWritable(true);
-  EXPECT_EQ_WAIT(kIceConnectionConnected, connection_state_, kTimeout);
-  EXPECT_EQ(1, connection_state_signal_count_);
-
-  // Destroy one transport, then "complete" the other one, so we reach
-  // a known state.
-  DestroyFakeDtlsTransport("video", 1);
-  transport1->fake_ice_transport()->SetConnectionCount(1);
-  EXPECT_EQ_WAIT(kIceConnectionCompleted, connection_state_, kTimeout);
-  // Signal count of 2 means the deletion didn't cause any unexpected signals
-  EXPECT_EQ(2, connection_state_signal_count_);
-}
-
-// If we destroy the last/only transport, we should simply transition to
-// "connecting".
-TEST_F(TransportControllerTest, TestDestroyLastTransportWhileConnected) {
-  FakeDtlsTransport* transport = CreateFakeDtlsTransport("audio", 1);
-  ASSERT_NE(nullptr, transport);
-
-  transport->fake_ice_transport()->SetCandidatesGatheringComplete();
-  transport->fake_ice_transport()->SetConnectionCount(2);
-  transport->SetWritable(true);
-  EXPECT_EQ_WAIT(kIceConnectionConnected, connection_state_, kTimeout);
-  EXPECT_EQ(1, connection_state_signal_count_);
-
-  DestroyFakeDtlsTransport("audio", 1);
-  EXPECT_EQ_WAIT(kIceConnectionConnecting, connection_state_, kTimeout);
-  // Signal count of 2 means the deletion didn't cause any unexpected signals
-  EXPECT_EQ(2, connection_state_signal_count_);
-}
-
-TEST_F(TransportControllerTest, TestSignalReceiving) {
-  FakeDtlsTransport* transport1 = CreateFakeDtlsTransport("audio", 1);
-  ASSERT_NE(nullptr, transport1);
-  FakeDtlsTransport* transport2 = CreateFakeDtlsTransport("video", 1);
-  ASSERT_NE(nullptr, transport2);
-
-  // Should signal receiving as soon as any transport is receiving.
-  transport1->SetReceiving(true);
-  EXPECT_TRUE_WAIT(receiving_, kTimeout);
-  EXPECT_EQ(1, receiving_signal_count_);
-
-  transport2->SetReceiving(true);
-  transport1->SetReceiving(false);
-  transport2->SetReceiving(false);
-  EXPECT_TRUE_WAIT(!receiving_, kTimeout);
-  EXPECT_EQ(2, receiving_signal_count_);
-}
-
-TEST_F(TransportControllerTest, TestSignalGatheringStateGathering) {
-  FakeDtlsTransport* transport = CreateFakeDtlsTransport("audio", 1);
-  ASSERT_NE(nullptr, transport);
-  transport->fake_ice_transport()->MaybeStartGathering();
-  // Should be in the gathering state as soon as any transport starts gathering.
-  EXPECT_EQ_WAIT(kIceGatheringGathering, gathering_state_, kTimeout);
-  EXPECT_EQ(1, gathering_state_signal_count_);
-}
-
-TEST_F(TransportControllerTest, TestSignalGatheringStateComplete) {
-  FakeDtlsTransport* transport1 = CreateFakeDtlsTransport("audio", 1);
-  ASSERT_NE(nullptr, transport1);
-  FakeDtlsTransport* transport2 = CreateFakeDtlsTransport("video", 1);
-  ASSERT_NE(nullptr, transport2);
-  FakeDtlsTransport* transport3 = CreateFakeDtlsTransport("data", 1);
-  ASSERT_NE(nullptr, transport3);
-
-  transport3->fake_ice_transport()->MaybeStartGathering();
-  EXPECT_EQ_WAIT(kIceGatheringGathering, gathering_state_, kTimeout);
-  EXPECT_EQ(1, gathering_state_signal_count_);
-
-  // Have one transport finish gathering, then destroy it, to make sure
-  // gathering
-  // completion wasn't signalled if only one transport finished gathering.
-  transport3->fake_ice_transport()->SetCandidatesGatheringComplete();
-  DestroyFakeDtlsTransport("data", 1);
-  EXPECT_EQ_WAIT(kIceGatheringNew, gathering_state_, kTimeout);
-  EXPECT_EQ(2, gathering_state_signal_count_);
-
-  // Make remaining transports start and then finish gathering.
-  transport1->fake_ice_transport()->MaybeStartGathering();
-  transport2->fake_ice_transport()->MaybeStartGathering();
-  EXPECT_EQ_WAIT(kIceGatheringGathering, gathering_state_, kTimeout);
-  EXPECT_EQ(3, gathering_state_signal_count_);
-
-  transport1->fake_ice_transport()->SetCandidatesGatheringComplete();
-  transport2->fake_ice_transport()->SetCandidatesGatheringComplete();
-  EXPECT_EQ_WAIT(kIceGatheringComplete, gathering_state_, kTimeout);
-  EXPECT_EQ(4, gathering_state_signal_count_);
-}
-
-// Test that when the last transport that hasn't finished connecting and/or
-// gathering is destroyed, the aggregate state jumps to "completed". This can
-// happen if, for example, we have an audio and video transport, the audio
-// transport completes, then we start bundling video on the audio transport.
-TEST_F(TransportControllerTest,
-       TestSignalingWhenLastIncompleteTransportDestroyed) {
-  transport_controller_->SetIceRole(ICEROLE_CONTROLLING);
-  FakeDtlsTransport* transport1 = CreateFakeDtlsTransport("audio", 1);
-  ASSERT_NE(nullptr, transport1);
-  FakeDtlsTransport* transport2 = CreateFakeDtlsTransport("video", 1);
-  ASSERT_NE(nullptr, transport2);
-
-  transport1->fake_ice_transport()->SetCandidatesGatheringComplete();
-  EXPECT_EQ_WAIT(kIceGatheringGathering, gathering_state_, kTimeout);
-  EXPECT_EQ(1, gathering_state_signal_count_);
-
-  transport1->fake_ice_transport()->SetConnectionCount(1);
-  transport1->SetWritable(true);
-  DestroyFakeDtlsTransport("video", 1);
-  EXPECT_EQ_WAIT(kIceConnectionCompleted, connection_state_, kTimeout);
-  EXPECT_EQ(1, connection_state_signal_count_);
-  EXPECT_EQ_WAIT(kIceGatheringComplete, gathering_state_, kTimeout);
-  EXPECT_EQ(2, gathering_state_signal_count_);
-}
-
-TEST_F(TransportControllerTest, TestSignalCandidatesGathered) {
-  FakeDtlsTransport* transport = CreateFakeDtlsTransport("audio", 1);
-  ASSERT_NE(nullptr, transport);
-
-  // Transport won't signal candidates until it has a local description.
-  TransportDescription local_desc(std::vector<std::string>(), kIceUfrag1,
-                                  kIcePwd1, ICEMODE_FULL,
-                                  CONNECTIONROLE_ACTPASS, nullptr);
-  std::string err;
-  EXPECT_TRUE(transport_controller_->SetLocalTransportDescription(
-      "audio", local_desc, CA_OFFER, &err));
-  transport_controller_->MaybeStartGathering();
-
-  transport->fake_ice_transport()->SignalCandidateGathered(
-      transport->fake_ice_transport(), CreateCandidate(1));
-  EXPECT_EQ_WAIT(1, candidates_signal_count_, kTimeout);
-  EXPECT_EQ(1U, candidates_["audio"].size());
-}
-
-TEST_F(TransportControllerTest, TestSignalingOccursOnSignalingThread) {
-  CreateTransportControllerWithNetworkThread();
-  CreateFakeDtlsTransportsAndCompleteConnectionOnNetworkThread();
-
-  // connecting --> connected --> completed
-  EXPECT_EQ_WAIT(kIceConnectionCompleted, connection_state_, kTimeout);
-  EXPECT_EQ(2, connection_state_signal_count_);
-
-  EXPECT_TRUE_WAIT(receiving_, kTimeout);
-  EXPECT_EQ(1, receiving_signal_count_);
-
-  // new --> gathering --> complete
-  EXPECT_EQ_WAIT(kIceGatheringComplete, gathering_state_, kTimeout);
-  EXPECT_EQ(2, gathering_state_signal_count_);
-
-  EXPECT_EQ_WAIT(1U, candidates_["audio"].size(), kTimeout);
-  EXPECT_EQ_WAIT(1U, candidates_["video"].size(), kTimeout);
-  EXPECT_EQ(2, candidates_signal_count_);
-
-  EXPECT_TRUE(!signaled_on_non_signaling_thread_);
-}
-
-// Older versions of Chrome expect the ICE role to be re-determined when an
-// ICE restart occurs, and also don't perform conflict resolution correctly,
-// so for now we can't safely stop doing this.
-// See: https://bugs.chromium.org/p/chromium/issues/detail?id=628676
-// TODO(deadbeef): Remove this when these old versions of Chrome reach a low
-// enough population.
-TEST_F(TransportControllerTest, IceRoleRedeterminedOnIceRestartByDefault) {
-  FakeDtlsTransport* transport = CreateFakeDtlsTransport("audio", 1);
-  ASSERT_NE(nullptr, transport);
-  std::string err;
-  // Do an initial offer answer, so that the next offer is an ICE restart.
-  transport_controller_->SetIceRole(ICEROLE_CONTROLLED);
-  TransportDescription remote_desc(std::vector<std::string>(), kIceUfrag1,
-                                   kIcePwd1, ICEMODE_FULL,
-                                   CONNECTIONROLE_ACTPASS, nullptr);
-  EXPECT_TRUE(transport_controller_->SetRemoteTransportDescription(
-      "audio", remote_desc, CA_OFFER, &err));
-  TransportDescription local_desc(std::vector<std::string>(), kIceUfrag2,
-                                  kIcePwd2, ICEMODE_FULL,
-                                  CONNECTIONROLE_ACTPASS, nullptr);
-  EXPECT_TRUE(transport_controller_->SetLocalTransportDescription(
-      "audio", local_desc, CA_ANSWER, &err));
-  EXPECT_EQ(ICEROLE_CONTROLLED, transport->fake_ice_transport()->GetIceRole());
-
-  // The endpoint that initiated an ICE restart should take the controlling
-  // role.
-  TransportDescription ice_restart_desc(std::vector<std::string>(), kIceUfrag3,
-                                        kIcePwd3, ICEMODE_FULL,
-                                        CONNECTIONROLE_ACTPASS, nullptr);
-  EXPECT_TRUE(transport_controller_->SetLocalTransportDescription(
-      "audio", ice_restart_desc, CA_OFFER, &err));
-  EXPECT_EQ(ICEROLE_CONTROLLING, transport->fake_ice_transport()->GetIceRole());
-}
-
-// Test that if the TransportController was created with the
-// |redetermine_role_on_ice_restart| parameter set to false, the role is *not*
-// redetermined on an ICE restart.
-TEST_F(TransportControllerTest, IceRoleNotRedetermined) {
-  bool redetermine_role = false;
-  transport_controller_.reset(new TransportControllerForTest(redetermine_role));
-  FakeDtlsTransport* transport = CreateFakeDtlsTransport("audio", 1);
-  ASSERT_NE(nullptr, transport);
-  std::string err;
-  // Do an initial offer answer, so that the next offer is an ICE restart.
-  transport_controller_->SetIceRole(ICEROLE_CONTROLLED);
-  TransportDescription remote_desc(std::vector<std::string>(), kIceUfrag1,
-                                   kIcePwd1, ICEMODE_FULL,
-                                   CONNECTIONROLE_ACTPASS, nullptr);
-  EXPECT_TRUE(transport_controller_->SetRemoteTransportDescription(
-      "audio", remote_desc, CA_OFFER, &err));
-  TransportDescription local_desc(std::vector<std::string>(), kIceUfrag2,
-                                  kIcePwd2, ICEMODE_FULL,
-                                  CONNECTIONROLE_ACTPASS, nullptr);
-  EXPECT_TRUE(transport_controller_->SetLocalTransportDescription(
-      "audio", local_desc, CA_ANSWER, &err));
-  EXPECT_EQ(ICEROLE_CONTROLLED, transport->fake_ice_transport()->GetIceRole());
-
-  // The endpoint that initiated an ICE restart should keep the existing role.
-  TransportDescription ice_restart_desc(std::vector<std::string>(), kIceUfrag3,
-                                        kIcePwd3, ICEMODE_FULL,
-                                        CONNECTIONROLE_ACTPASS, nullptr);
-  EXPECT_TRUE(transport_controller_->SetLocalTransportDescription(
-      "audio", ice_restart_desc, CA_OFFER, &err));
-  EXPECT_EQ(ICEROLE_CONTROLLED, transport->fake_ice_transport()->GetIceRole());
-}
-
-// Tests ICE role is reversed after receiving ice-lite from remote.
-TEST_F(TransportControllerTest, TestSetRemoteIceLiteInOffer) {
-  FakeDtlsTransport* transport = CreateFakeDtlsTransport("audio", 1);
-  ASSERT_NE(nullptr, transport);
-  std::string err;
-
-  transport_controller_->SetIceRole(ICEROLE_CONTROLLED);
-  TransportDescription remote_desc(std::vector<std::string>(), kIceUfrag1,
-                                   kIcePwd1, ICEMODE_LITE,
-                                   CONNECTIONROLE_ACTPASS, nullptr);
-  EXPECT_TRUE(transport_controller_->SetRemoteTransportDescription(
-      "audio", remote_desc, CA_OFFER, &err));
-  TransportDescription local_desc(kIceUfrag1, kIcePwd1);
-  ASSERT_TRUE(transport_controller_->SetLocalTransportDescription(
-      "audio", local_desc, CA_ANSWER, nullptr));
-
-  EXPECT_EQ(ICEROLE_CONTROLLING, transport->fake_ice_transport()->GetIceRole());
-  EXPECT_EQ(ICEMODE_LITE, transport->fake_ice_transport()->remote_ice_mode());
-}
-
-// Tests ice-lite in remote answer.
-TEST_F(TransportControllerTest, TestSetRemoteIceLiteInAnswer) {
-  FakeDtlsTransport* transport = CreateFakeDtlsTransport("audio", 1);
-  ASSERT_NE(nullptr, transport);
-  std::string err;
-
-  transport_controller_->SetIceRole(ICEROLE_CONTROLLING);
-  TransportDescription local_desc(kIceUfrag1, kIcePwd1);
-  ASSERT_TRUE(transport_controller_->SetLocalTransportDescription(
-      "audio", local_desc, CA_OFFER, nullptr));
-  EXPECT_EQ(ICEROLE_CONTROLLING, transport->fake_ice_transport()->GetIceRole());
-  // Transports will be created in ICEFULL_MODE.
-  EXPECT_EQ(ICEMODE_FULL, transport->fake_ice_transport()->remote_ice_mode());
-  TransportDescription remote_desc(std::vector<std::string>(), kIceUfrag1,
-                                   kIcePwd1, ICEMODE_LITE, CONNECTIONROLE_NONE,
-                                   nullptr);
-  ASSERT_TRUE(transport_controller_->SetRemoteTransportDescription(
-      "audio", remote_desc, CA_ANSWER, nullptr));
-  EXPECT_EQ(ICEROLE_CONTROLLING, transport->fake_ice_transport()->GetIceRole());
-  // After receiving remote description with ICEMODE_LITE, transport should
-  // have mode set to ICEMODE_LITE.
-  EXPECT_EQ(ICEMODE_LITE, transport->fake_ice_transport()->remote_ice_mode());
-}
-
-// Tests that the ICE role remains "controlling" if a subsequent offer that
-// does an ICE restart is received from an ICE lite endpoint. Regression test
-// for: https://crbug.com/710760
-TEST_F(TransportControllerTest,
-       IceRoleIsControllingAfterIceRestartFromIceLiteEndpoint) {
-  FakeDtlsTransport* transport = CreateFakeDtlsTransport("audio", 1);
-  ASSERT_NE(nullptr, transport);
-  std::string err;
-
-  // Initial offer/answer.
-  TransportDescription remote_desc(std::vector<std::string>(), kIceUfrag1,
-                                   kIcePwd1, ICEMODE_LITE,
-                                   CONNECTIONROLE_ACTPASS, nullptr);
-  TransportDescription local_desc(kIceUfrag1, kIcePwd1);
-  ASSERT_TRUE(transport_controller_->SetRemoteTransportDescription(
-      "audio", remote_desc, CA_OFFER, &err));
-  ASSERT_TRUE(transport_controller_->SetLocalTransportDescription(
-      "audio", local_desc, CA_ANSWER, nullptr));
-  // Subsequent ICE restart offer/answer.
-  remote_desc.ice_ufrag = kIceUfrag2;
-  remote_desc.ice_pwd = kIcePwd2;
-  local_desc.ice_ufrag = kIceUfrag2;
-  local_desc.ice_pwd = kIcePwd2;
-  ASSERT_TRUE(transport_controller_->SetRemoteTransportDescription(
-      "audio", remote_desc, CA_OFFER, &err));
-  ASSERT_TRUE(transport_controller_->SetLocalTransportDescription(
-      "audio", local_desc, CA_ANSWER, nullptr));
-
-  EXPECT_EQ(ICEROLE_CONTROLLING, transport->fake_ice_transport()->GetIceRole());
-}
-
-// Tests SetNeedsIceRestartFlag and NeedsIceRestart, setting the flag and then
-// initiating an ICE restart for one of the transports.
-TEST_F(TransportControllerTest, NeedsIceRestart) {
-  CreateFakeDtlsTransport("audio", 1);
-  CreateFakeDtlsTransport("video", 1);
-
-  // Do initial offer/answer so there's something to restart.
-  TransportDescription local_desc(kIceUfrag1, kIcePwd1);
-  TransportDescription remote_desc(kIceUfrag1, kIcePwd1);
-  ASSERT_TRUE(transport_controller_->SetLocalTransportDescription(
-      "audio", local_desc, CA_OFFER, nullptr));
-  ASSERT_TRUE(transport_controller_->SetLocalTransportDescription(
-      "video", local_desc, CA_OFFER, nullptr));
-  ASSERT_TRUE(transport_controller_->SetRemoteTransportDescription(
-      "audio", remote_desc, CA_ANSWER, nullptr));
-  ASSERT_TRUE(transport_controller_->SetRemoteTransportDescription(
-      "video", remote_desc, CA_ANSWER, nullptr));
-
-  // Initially NeedsIceRestart should return false.
-  EXPECT_FALSE(transport_controller_->NeedsIceRestart("audio"));
-  EXPECT_FALSE(transport_controller_->NeedsIceRestart("video"));
-
-  // Set the needs-ice-restart flag and verify NeedsIceRestart starts returning
-  // true.
-  transport_controller_->SetNeedsIceRestartFlag();
-  EXPECT_TRUE(transport_controller_->NeedsIceRestart("audio"));
-  EXPECT_TRUE(transport_controller_->NeedsIceRestart("video"));
-  // For a nonexistent transport, false should be returned.
-  EXPECT_FALSE(transport_controller_->NeedsIceRestart("deadbeef"));
-
-  // Do ICE restart but only for audio.
-  TransportDescription ice_restart_local_desc(kIceUfrag2, kIcePwd2);
-  ASSERT_TRUE(transport_controller_->SetLocalTransportDescription(
-      "audio", ice_restart_local_desc, CA_OFFER, nullptr));
-  ASSERT_TRUE(transport_controller_->SetLocalTransportDescription(
-      "video", local_desc, CA_OFFER, nullptr));
-  // NeedsIceRestart should still be true for video.
-  EXPECT_FALSE(transport_controller_->NeedsIceRestart("audio"));
-  EXPECT_TRUE(transport_controller_->NeedsIceRestart("video"));
-}
-
-}  // namespace cricket {
diff --git a/p2p/base/transportdescription.cc b/p2p/base/transportdescription.cc
deleted file mode 100644
index 7c0f1f5..0000000
--- a/p2p/base/transportdescription.cc
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- *  Copyright 2013 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/p2p/base/transportdescription.h"
-
-#include "webrtc/p2p/base/p2pconstants.h"
-#include "webrtc/rtc_base/arraysize.h"
-#include "webrtc/rtc_base/stringutils.h"
-
-namespace cricket {
-
-bool StringToConnectionRole(const std::string& role_str, ConnectionRole* role) {
-  const char* const roles[] = {
-      CONNECTIONROLE_ACTIVE_STR,
-      CONNECTIONROLE_PASSIVE_STR,
-      CONNECTIONROLE_ACTPASS_STR,
-      CONNECTIONROLE_HOLDCONN_STR
-  };
-
-  for (size_t i = 0; i < arraysize(roles); ++i) {
-    if (_stricmp(roles[i], role_str.c_str()) == 0) {
-      *role = static_cast<ConnectionRole>(CONNECTIONROLE_ACTIVE + i);
-      return true;
-    }
-  }
-  return false;
-}
-
-bool ConnectionRoleToString(const ConnectionRole& role, std::string* role_str) {
-  switch (role) {
-    case cricket::CONNECTIONROLE_ACTIVE:
-      *role_str = cricket::CONNECTIONROLE_ACTIVE_STR;
-      break;
-    case cricket::CONNECTIONROLE_ACTPASS:
-      *role_str = cricket::CONNECTIONROLE_ACTPASS_STR;
-      break;
-    case cricket::CONNECTIONROLE_PASSIVE:
-      *role_str = cricket::CONNECTIONROLE_PASSIVE_STR;
-      break;
-    case cricket::CONNECTIONROLE_HOLDCONN:
-      *role_str = cricket::CONNECTIONROLE_HOLDCONN_STR;
-      break;
-    default:
-      return false;
-  }
-  return true;
-}
-
-}  // namespace cricket
diff --git a/p2p/base/transportdescription.h b/p2p/base/transportdescription.h
deleted file mode 100644
index 6702131..0000000
--- a/p2p/base/transportdescription.h
+++ /dev/null
@@ -1,181 +0,0 @@
-/*
- *  Copyright 2012 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_P2P_BASE_TRANSPORTDESCRIPTION_H_
-#define WEBRTC_P2P_BASE_TRANSPORTDESCRIPTION_H_
-
-#include <algorithm>
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "webrtc/p2p/base/p2pconstants.h"
-#include "webrtc/rtc_base/sslfingerprint.h"
-
-namespace cricket {
-
-// SEC_ENABLED and SEC_REQUIRED should only be used if the session
-// was negotiated over TLS, to protect the inline crypto material
-// exchange.
-// SEC_DISABLED: No crypto in outgoing offer, ignore any supplied crypto.
-// SEC_ENABLED:  Crypto in outgoing offer and answer (if supplied in offer).
-// SEC_REQUIRED: Crypto in outgoing offer and answer. Fail any offer with absent
-//               or unsupported crypto.
-// TODO(deadbeef): Remove this or rename it to something more appropriate, like
-// SdesPolicy.
-enum SecurePolicy {
-  SEC_DISABLED,
-  SEC_ENABLED,
-  SEC_REQUIRED
-};
-
-// Whether our side of the call is driving the negotiation, or the other side.
-enum IceRole {
-  ICEROLE_CONTROLLING = 0,
-  ICEROLE_CONTROLLED,
-  ICEROLE_UNKNOWN
-};
-
-// ICE RFC 5245 implementation type.
-enum IceMode {
-  ICEMODE_FULL,  // As defined in http://tools.ietf.org/html/rfc5245#section-4.1
-  ICEMODE_LITE   // As defined in http://tools.ietf.org/html/rfc5245#section-4.2
-};
-
-// RFC 4145 - http://tools.ietf.org/html/rfc4145#section-4
-// 'active':  The endpoint will initiate an outgoing connection.
-// 'passive': The endpoint will accept an incoming connection.
-// 'actpass': The endpoint is willing to accept an incoming
-//            connection or to initiate an outgoing connection.
-enum ConnectionRole {
-  CONNECTIONROLE_NONE = 0,
-  CONNECTIONROLE_ACTIVE,
-  CONNECTIONROLE_PASSIVE,
-  CONNECTIONROLE_ACTPASS,
-  CONNECTIONROLE_HOLDCONN,
-};
-
-struct IceParameters {
-  // TODO(honghaiz): Include ICE mode in this structure to match the ORTC
-  // struct:
-  // http://ortc.org/wp-content/uploads/2016/03/ortc.html#idl-def-RTCIceParameters
-  std::string ufrag;
-  std::string pwd;
-  bool renomination = false;
-  IceParameters() = default;
-  IceParameters(const std::string& ice_ufrag,
-                const std::string& ice_pwd,
-                bool ice_renomination)
-      : ufrag(ice_ufrag), pwd(ice_pwd), renomination(ice_renomination) {}
-
-  bool operator==(const IceParameters& other) {
-    return ufrag == other.ufrag && pwd == other.pwd &&
-           renomination == other.renomination;
-  }
-  bool operator!=(const IceParameters& other) { return !(*this == other); }
-};
-
-extern const char CONNECTIONROLE_ACTIVE_STR[];
-extern const char CONNECTIONROLE_PASSIVE_STR[];
-extern const char CONNECTIONROLE_ACTPASS_STR[];
-extern const char CONNECTIONROLE_HOLDCONN_STR[];
-
-constexpr auto ICE_OPTION_TRICKLE = "trickle";
-constexpr auto ICE_OPTION_RENOMINATION = "renomination";
-
-bool StringToConnectionRole(const std::string& role_str, ConnectionRole* role);
-bool ConnectionRoleToString(const ConnectionRole& role, std::string* role_str);
-
-struct TransportDescription {
-  TransportDescription()
-      : ice_mode(ICEMODE_FULL),
-        connection_role(CONNECTIONROLE_NONE) {}
-
-  TransportDescription(const std::vector<std::string>& transport_options,
-                       const std::string& ice_ufrag,
-                       const std::string& ice_pwd,
-                       IceMode ice_mode,
-                       ConnectionRole role,
-                       const rtc::SSLFingerprint* identity_fingerprint)
-      : transport_options(transport_options),
-        ice_ufrag(ice_ufrag),
-        ice_pwd(ice_pwd),
-        ice_mode(ice_mode),
-        connection_role(role),
-        identity_fingerprint(CopyFingerprint(identity_fingerprint)) {}
-  TransportDescription(const std::string& ice_ufrag,
-                       const std::string& ice_pwd)
-      : ice_ufrag(ice_ufrag),
-        ice_pwd(ice_pwd),
-        ice_mode(ICEMODE_FULL),
-        connection_role(CONNECTIONROLE_NONE) {}
-  TransportDescription(const TransportDescription& from)
-      : transport_options(from.transport_options),
-        ice_ufrag(from.ice_ufrag),
-        ice_pwd(from.ice_pwd),
-        ice_mode(from.ice_mode),
-        connection_role(from.connection_role),
-        identity_fingerprint(CopyFingerprint(from.identity_fingerprint.get())) {
-  }
-
-  TransportDescription& operator=(const TransportDescription& from) {
-    // Self-assignment
-    if (this == &from)
-      return *this;
-
-    transport_options = from.transport_options;
-    ice_ufrag = from.ice_ufrag;
-    ice_pwd = from.ice_pwd;
-    ice_mode = from.ice_mode;
-    connection_role = from.connection_role;
-
-    identity_fingerprint.reset(CopyFingerprint(
-        from.identity_fingerprint.get()));
-    return *this;
-  }
-
-  // TODO(deadbeef): Rename to HasIceOption, etc.
-  bool HasOption(const std::string& option) const {
-    return (std::find(transport_options.begin(), transport_options.end(),
-                      option) != transport_options.end());
-  }
-  void AddOption(const std::string& option) {
-    transport_options.push_back(option);
-  }
-  bool secure() const { return identity_fingerprint != nullptr; }
-
-  IceParameters GetIceParameters() {
-    return IceParameters(ice_ufrag, ice_pwd,
-                         HasOption(ICE_OPTION_RENOMINATION));
-  }
-
-  static rtc::SSLFingerprint* CopyFingerprint(
-      const rtc::SSLFingerprint* from) {
-    if (!from)
-      return NULL;
-
-    return new rtc::SSLFingerprint(*from);
-  }
-
-  // These are actually ICE options (appearing in the ice-options attribute in
-  // SDP).
-  // TODO(deadbeef): Rename to ice_options.
-  std::vector<std::string> transport_options;
-  std::string ice_ufrag;
-  std::string ice_pwd;
-  IceMode ice_mode;
-  ConnectionRole connection_role;
-
-  std::unique_ptr<rtc::SSLFingerprint> identity_fingerprint;
-};
-
-}  // namespace cricket
-
-#endif  // WEBRTC_P2P_BASE_TRANSPORTDESCRIPTION_H_
diff --git a/p2p/base/transportdescriptionfactory.cc b/p2p/base/transportdescriptionfactory.cc
deleted file mode 100644
index 1c75b32..0000000
--- a/p2p/base/transportdescriptionfactory.cc
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- *  Copyright 2012 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/p2p/base/transportdescriptionfactory.h"
-
-#include <memory>
-
-#include "webrtc/p2p/base/transportdescription.h"
-#include "webrtc/rtc_base/helpers.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/messagedigest.h"
-#include "webrtc/rtc_base/sslfingerprint.h"
-
-namespace cricket {
-
-TransportDescriptionFactory::TransportDescriptionFactory()
-    : secure_(SEC_DISABLED) {
-}
-
-TransportDescription* TransportDescriptionFactory::CreateOffer(
-    const TransportOptions& options,
-    const TransportDescription* current_description) const {
-  std::unique_ptr<TransportDescription> desc(new TransportDescription());
-
-  // Generate the ICE credentials if we don't already have them.
-  if (!current_description || options.ice_restart) {
-    desc->ice_ufrag = rtc::CreateRandomString(ICE_UFRAG_LENGTH);
-    desc->ice_pwd = rtc::CreateRandomString(ICE_PWD_LENGTH);
-  } else {
-    desc->ice_ufrag = current_description->ice_ufrag;
-    desc->ice_pwd = current_description->ice_pwd;
-  }
-  desc->AddOption(ICE_OPTION_TRICKLE);
-  if (options.enable_ice_renomination) {
-    desc->AddOption(ICE_OPTION_RENOMINATION);
-  }
-
-  // If we are trying to establish a secure transport, add a fingerprint.
-  if (secure_ == SEC_ENABLED || secure_ == SEC_REQUIRED) {
-    // Fail if we can't create the fingerprint.
-    // If we are the initiator set role to "actpass".
-    if (!SetSecurityInfo(desc.get(), CONNECTIONROLE_ACTPASS)) {
-      return NULL;
-    }
-  }
-
-  return desc.release();
-}
-
-TransportDescription* TransportDescriptionFactory::CreateAnswer(
-    const TransportDescription* offer,
-    const TransportOptions& options,
-    bool require_transport_attributes,
-    const TransportDescription* current_description) const {
-  // TODO(juberti): Figure out why we get NULL offers, and fix this upstream.
-  if (!offer) {
-    LOG(LS_WARNING) << "Failed to create TransportDescription answer " <<
-        "because offer is NULL";
-    return NULL;
-  }
-
-  std::unique_ptr<TransportDescription> desc(new TransportDescription());
-  // Generate the ICE credentials if we don't already have them or ice is
-  // being restarted.
-  if (!current_description || options.ice_restart) {
-    desc->ice_ufrag = rtc::CreateRandomString(ICE_UFRAG_LENGTH);
-    desc->ice_pwd = rtc::CreateRandomString(ICE_PWD_LENGTH);
-  } else {
-    desc->ice_ufrag = current_description->ice_ufrag;
-    desc->ice_pwd = current_description->ice_pwd;
-  }
-  desc->AddOption(ICE_OPTION_TRICKLE);
-  if (options.enable_ice_renomination) {
-    desc->AddOption(ICE_OPTION_RENOMINATION);
-  }
-
-  // Negotiate security params.
-  if (offer && offer->identity_fingerprint.get()) {
-    // The offer supports DTLS, so answer with DTLS, as long as we support it.
-    if (secure_ == SEC_ENABLED || secure_ == SEC_REQUIRED) {
-      // Fail if we can't create the fingerprint.
-      // Setting DTLS role to active.
-      ConnectionRole role = (options.prefer_passive_role) ?
-          CONNECTIONROLE_PASSIVE : CONNECTIONROLE_ACTIVE;
-
-      if (!SetSecurityInfo(desc.get(), role)) {
-        return NULL;
-      }
-    }
-  } else if (require_transport_attributes && secure_ == SEC_REQUIRED) {
-    // We require DTLS, but the other side didn't offer it. Fail.
-    LOG(LS_WARNING) << "Failed to create TransportDescription answer "
-                       "because of incompatible security settings";
-    return NULL;
-  }
-
-  return desc.release();
-}
-
-bool TransportDescriptionFactory::SetSecurityInfo(
-    TransportDescription* desc, ConnectionRole role) const {
-  if (!certificate_) {
-    LOG(LS_ERROR) << "Cannot create identity digest with no certificate";
-    return false;
-  }
-
-  // This digest algorithm is used to produce the a=fingerprint lines in SDP.
-  // RFC 4572 Section 5 requires that those lines use the same hash function as
-  // the certificate's signature, which is what CreateFromCertificate does.
-  desc->identity_fingerprint.reset(
-      rtc::SSLFingerprint::CreateFromCertificate(certificate_));
-  if (!desc->identity_fingerprint) {
-    return false;
-  }
-  std::string digest_alg;
-  if (!certificate_->ssl_certificate().GetSignatureDigestAlgorithm(
-          &digest_alg)) {
-    LOG(LS_ERROR) << "Failed to retrieve the certificate's digest algorithm";
-    return false;
-  }
-
-  desc->identity_fingerprint.reset(
-      rtc::SSLFingerprint::Create(digest_alg, certificate_->identity()));
-  if (!desc->identity_fingerprint.get()) {
-    LOG(LS_ERROR) << "Failed to create identity fingerprint, alg="
-                  << digest_alg;
-    return false;
-  }
-
-  // Assign security role.
-  desc->connection_role = role;
-  return true;
-}
-
-}  // namespace cricket
diff --git a/p2p/base/transportdescriptionfactory.h b/p2p/base/transportdescriptionfactory.h
deleted file mode 100644
index b9b3c5b..0000000
--- a/p2p/base/transportdescriptionfactory.h
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- *  Copyright 2012 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_P2P_BASE_TRANSPORTDESCRIPTIONFACTORY_H_
-#define WEBRTC_P2P_BASE_TRANSPORTDESCRIPTIONFACTORY_H_
-
-#include "webrtc/p2p/base/transportdescription.h"
-#include "webrtc/rtc_base/rtccertificate.h"
-
-namespace rtc {
-class SSLIdentity;
-}
-
-namespace cricket {
-
-struct TransportOptions {
-  bool ice_restart = false;
-  bool prefer_passive_role = false;
-  // If true, ICE renomination is supported and will be used if it is also
-  // supported by the remote side.
-  bool enable_ice_renomination = false;
-};
-
-// Creates transport descriptions according to the supplied configuration.
-// When creating answers, performs the appropriate negotiation
-// of the various fields to determine the proper result.
-class TransportDescriptionFactory {
- public:
-  // Default ctor; use methods below to set configuration.
-  TransportDescriptionFactory();
-  SecurePolicy secure() const { return secure_; }
-  // The certificate to use when setting up DTLS.
-  const rtc::scoped_refptr<rtc::RTCCertificate>& certificate() const {
-    return certificate_;
-  }
-
-  // Specifies the transport security policy to use.
-  void set_secure(SecurePolicy s) { secure_ = s; }
-  // Specifies the certificate to use (only used when secure != SEC_DISABLED).
-  void set_certificate(
-      const rtc::scoped_refptr<rtc::RTCCertificate>& certificate) {
-    certificate_ = certificate;
-  }
-
-  // Creates a transport description suitable for use in an offer.
-  TransportDescription* CreateOffer(const TransportOptions& options,
-      const TransportDescription* current_description) const;
-  // Create a transport description that is a response to an offer.
-  //
-  // If |require_transport_attributes| is true, then TRANSPORT category
-  // attributes are expected to be present in |offer|, as defined by
-  // sdp-mux-attributes, and null will be returned otherwise. It's expected
-  // that this will be set to false for an m= section that's in a BUNDLE group
-  // but isn't the first m= section in the group.
-  TransportDescription* CreateAnswer(
-      const TransportDescription* offer,
-      const TransportOptions& options,
-      bool require_transport_attributes,
-      const TransportDescription* current_description) const;
-
- private:
-  bool SetSecurityInfo(TransportDescription* description,
-                       ConnectionRole role) const;
-
-  SecurePolicy secure_;
-  rtc::scoped_refptr<rtc::RTCCertificate> certificate_;
-};
-
-}  // namespace cricket
-
-#endif  // WEBRTC_P2P_BASE_TRANSPORTDESCRIPTIONFACTORY_H_
diff --git a/p2p/base/transportdescriptionfactory_unittest.cc b/p2p/base/transportdescriptionfactory_unittest.cc
deleted file mode 100644
index f8f48bc..0000000
--- a/p2p/base/transportdescriptionfactory_unittest.cc
+++ /dev/null
@@ -1,312 +0,0 @@
-/*
- *  Copyright 2012 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 <memory>
-#include <string>
-#include <vector>
-
-#include "webrtc/p2p/base/p2pconstants.h"
-#include "webrtc/p2p/base/transportdescription.h"
-#include "webrtc/p2p/base/transportdescriptionfactory.h"
-#include "webrtc/rtc_base/fakesslidentity.h"
-#include "webrtc/rtc_base/gunit.h"
-#include "webrtc/rtc_base/ssladapter.h"
-
-using cricket::TransportDescriptionFactory;
-using cricket::TransportDescription;
-using cricket::TransportOptions;
-
-class TransportDescriptionFactoryTest : public testing::Test {
- public:
-  TransportDescriptionFactoryTest()
-      : cert1_(rtc::RTCCertificate::Create(std::unique_ptr<rtc::SSLIdentity>(
-            new rtc::FakeSSLIdentity("User1")))),
-        cert2_(rtc::RTCCertificate::Create(std::unique_ptr<rtc::SSLIdentity>(
-            new rtc::FakeSSLIdentity("User2")))) {}
-
-  void CheckDesc(const TransportDescription* desc,
-                 const std::string& opt, const std::string& ice_ufrag,
-                 const std::string& ice_pwd, const std::string& dtls_alg) {
-    ASSERT_TRUE(desc != NULL);
-    EXPECT_EQ(!opt.empty(), desc->HasOption(opt));
-    if (ice_ufrag.empty() && ice_pwd.empty()) {
-      EXPECT_EQ(static_cast<size_t>(cricket::ICE_UFRAG_LENGTH),
-                desc->ice_ufrag.size());
-      EXPECT_EQ(static_cast<size_t>(cricket::ICE_PWD_LENGTH),
-                desc->ice_pwd.size());
-    } else {
-      EXPECT_EQ(ice_ufrag, desc->ice_ufrag);
-      EXPECT_EQ(ice_pwd, desc->ice_pwd);
-    }
-    if (dtls_alg.empty()) {
-      EXPECT_TRUE(desc->identity_fingerprint.get() == NULL);
-    } else {
-      ASSERT_TRUE(desc->identity_fingerprint.get() != NULL);
-      EXPECT_EQ(desc->identity_fingerprint->algorithm, dtls_alg);
-      EXPECT_GT(desc->identity_fingerprint->digest.size(), 0U);
-    }
-  }
-
-  // This test ice restart by doing two offer answer exchanges. On the second
-  // exchange ice is restarted. The test verifies that the ufrag and password
-  // in the offer and answer is changed.
-  // If |dtls| is true, the test verifies that the finger print is not changed.
-  void TestIceRestart(bool dtls) {
-    SetDtls(dtls);
-    cricket::TransportOptions options;
-    // The initial offer / answer exchange.
-    std::unique_ptr<TransportDescription> offer(f1_.CreateOffer(options, NULL));
-    std::unique_ptr<TransportDescription> answer(
-        f2_.CreateAnswer(offer.get(), options, true, NULL));
-
-    // Create an updated offer where we restart ice.
-    options.ice_restart = true;
-    std::unique_ptr<TransportDescription> restart_offer(
-        f1_.CreateOffer(options, offer.get()));
-
-    VerifyUfragAndPasswordChanged(dtls, offer.get(), restart_offer.get());
-
-    // Create a new answer. The transport ufrag and password is changed since
-    // |options.ice_restart == true|
-    std::unique_ptr<TransportDescription> restart_answer(
-        f2_.CreateAnswer(restart_offer.get(), options, true, answer.get()));
-    ASSERT_TRUE(restart_answer.get() != NULL);
-
-    VerifyUfragAndPasswordChanged(dtls, answer.get(), restart_answer.get());
-  }
-
-  void VerifyUfragAndPasswordChanged(bool dtls,
-                                     const TransportDescription* org_desc,
-                                     const TransportDescription* restart_desc) {
-    EXPECT_NE(org_desc->ice_pwd, restart_desc->ice_pwd);
-    EXPECT_NE(org_desc->ice_ufrag, restart_desc->ice_ufrag);
-    EXPECT_EQ(static_cast<size_t>(cricket::ICE_UFRAG_LENGTH),
-              restart_desc->ice_ufrag.size());
-    EXPECT_EQ(static_cast<size_t>(cricket::ICE_PWD_LENGTH),
-              restart_desc->ice_pwd.size());
-    // If DTLS is enabled, make sure the finger print is unchanged.
-    if (dtls) {
-      EXPECT_FALSE(
-          org_desc->identity_fingerprint->GetRfc4572Fingerprint().empty());
-      EXPECT_EQ(org_desc->identity_fingerprint->GetRfc4572Fingerprint(),
-                restart_desc->identity_fingerprint->GetRfc4572Fingerprint());
-    }
-  }
-
-  void TestIceRenomination(bool dtls) {
-    SetDtls(dtls);
-
-    cricket::TransportOptions options;
-    // The initial offer / answer exchange.
-    std::unique_ptr<TransportDescription> offer(
-        f1_.CreateOffer(options, nullptr));
-    std::unique_ptr<TransportDescription> answer(
-        f2_.CreateAnswer(offer.get(), options, true, nullptr));
-    VerifyRenomination(offer.get(), false);
-    VerifyRenomination(answer.get(), false);
-
-    options.enable_ice_renomination = true;
-    std::unique_ptr<TransportDescription> renomination_offer(
-        f1_.CreateOffer(options, offer.get()));
-    VerifyRenomination(renomination_offer.get(), true);
-
-    std::unique_ptr<TransportDescription> renomination_answer(f2_.CreateAnswer(
-        renomination_offer.get(), options, true, answer.get()));
-    VerifyRenomination(renomination_answer.get(), true);
-  }
-
- protected:
-  void VerifyRenomination(TransportDescription* desc,
-                          bool renomination_expected) {
-    ASSERT_TRUE(desc != nullptr);
-    std::vector<std::string>& options = desc->transport_options;
-    auto iter = std::find(options.begin(), options.end(), "renomination");
-    EXPECT_EQ(renomination_expected, iter != options.end());
-  }
-
-  void SetDtls(bool dtls) {
-    if (dtls) {
-      f1_.set_secure(cricket::SEC_ENABLED);
-      f2_.set_secure(cricket::SEC_ENABLED);
-      f1_.set_certificate(cert1_);
-      f2_.set_certificate(cert2_);
-    } else {
-      f1_.set_secure(cricket::SEC_DISABLED);
-      f2_.set_secure(cricket::SEC_DISABLED);
-    }
-  }
-
-  TransportDescriptionFactory f1_;
-  TransportDescriptionFactory f2_;
-
-  rtc::scoped_refptr<rtc::RTCCertificate> cert1_;
-  rtc::scoped_refptr<rtc::RTCCertificate> cert2_;
-};
-
-TEST_F(TransportDescriptionFactoryTest, TestOfferDefault) {
-  std::unique_ptr<TransportDescription> desc(
-      f1_.CreateOffer(TransportOptions(), NULL));
-  CheckDesc(desc.get(), "", "", "", "");
-}
-
-TEST_F(TransportDescriptionFactoryTest, TestOfferDtls) {
-  f1_.set_secure(cricket::SEC_ENABLED);
-  f1_.set_certificate(cert1_);
-  std::string digest_alg;
-  ASSERT_TRUE(cert1_->ssl_certificate().GetSignatureDigestAlgorithm(
-      &digest_alg));
-  std::unique_ptr<TransportDescription> desc(
-      f1_.CreateOffer(TransportOptions(), NULL));
-  CheckDesc(desc.get(), "", "", "", digest_alg);
-  // Ensure it also works with SEC_REQUIRED.
-  f1_.set_secure(cricket::SEC_REQUIRED);
-  desc.reset(f1_.CreateOffer(TransportOptions(), NULL));
-  CheckDesc(desc.get(), "", "", "", digest_alg);
-}
-
-// Test generating an offer with DTLS fails with no identity.
-TEST_F(TransportDescriptionFactoryTest, TestOfferDtlsWithNoIdentity) {
-  f1_.set_secure(cricket::SEC_ENABLED);
-  std::unique_ptr<TransportDescription> desc(
-      f1_.CreateOffer(TransportOptions(), NULL));
-  ASSERT_TRUE(desc.get() == NULL);
-}
-
-// Test updating an offer with DTLS to pick ICE.
-// The ICE credentials should stay the same in the new offer.
-TEST_F(TransportDescriptionFactoryTest, TestOfferDtlsReofferDtls) {
-  f1_.set_secure(cricket::SEC_ENABLED);
-  f1_.set_certificate(cert1_);
-  std::string digest_alg;
-  ASSERT_TRUE(cert1_->ssl_certificate().GetSignatureDigestAlgorithm(
-      &digest_alg));
-  std::unique_ptr<TransportDescription> old_desc(
-      f1_.CreateOffer(TransportOptions(), NULL));
-  ASSERT_TRUE(old_desc.get() != NULL);
-  std::unique_ptr<TransportDescription> desc(
-      f1_.CreateOffer(TransportOptions(), old_desc.get()));
-  CheckDesc(desc.get(), "",
-            old_desc->ice_ufrag, old_desc->ice_pwd, digest_alg);
-}
-
-TEST_F(TransportDescriptionFactoryTest, TestAnswerDefault) {
-  std::unique_ptr<TransportDescription> offer(
-      f1_.CreateOffer(TransportOptions(), NULL));
-  ASSERT_TRUE(offer.get() != NULL);
-  std::unique_ptr<TransportDescription> desc(
-      f2_.CreateAnswer(offer.get(), TransportOptions(), true, NULL));
-  CheckDesc(desc.get(), "", "", "", "");
-  desc.reset(f2_.CreateAnswer(offer.get(), TransportOptions(), true, NULL));
-  CheckDesc(desc.get(), "", "", "", "");
-}
-
-// Test that we can update an answer properly; ICE credentials shouldn't change.
-TEST_F(TransportDescriptionFactoryTest, TestReanswer) {
-  std::unique_ptr<TransportDescription> offer(
-      f1_.CreateOffer(TransportOptions(), NULL));
-  ASSERT_TRUE(offer.get() != NULL);
-  std::unique_ptr<TransportDescription> old_desc(
-      f2_.CreateAnswer(offer.get(), TransportOptions(), true, NULL));
-  ASSERT_TRUE(old_desc.get() != NULL);
-  std::unique_ptr<TransportDescription> desc(
-      f2_.CreateAnswer(offer.get(), TransportOptions(), true, old_desc.get()));
-  ASSERT_TRUE(desc.get() != NULL);
-  CheckDesc(desc.get(), "",
-            old_desc->ice_ufrag, old_desc->ice_pwd, "");
-}
-
-// Test that we handle answering an offer with DTLS with no DTLS.
-TEST_F(TransportDescriptionFactoryTest, TestAnswerDtlsToNoDtls) {
-  f1_.set_secure(cricket::SEC_ENABLED);
-  f1_.set_certificate(cert1_);
-  std::unique_ptr<TransportDescription> offer(
-      f1_.CreateOffer(TransportOptions(), NULL));
-  ASSERT_TRUE(offer.get() != NULL);
-  std::unique_ptr<TransportDescription> desc(
-      f2_.CreateAnswer(offer.get(), TransportOptions(), true, NULL));
-  CheckDesc(desc.get(), "", "", "", "");
-}
-
-// Test that we handle answering an offer without DTLS if we have DTLS enabled,
-// but fail if we require DTLS.
-TEST_F(TransportDescriptionFactoryTest, TestAnswerNoDtlsToDtls) {
-  f2_.set_secure(cricket::SEC_ENABLED);
-  f2_.set_certificate(cert2_);
-  std::unique_ptr<TransportDescription> offer(
-      f1_.CreateOffer(TransportOptions(), NULL));
-  ASSERT_TRUE(offer.get() != NULL);
-  std::unique_ptr<TransportDescription> desc(
-      f2_.CreateAnswer(offer.get(), TransportOptions(), true, NULL));
-  CheckDesc(desc.get(), "", "", "", "");
-  f2_.set_secure(cricket::SEC_REQUIRED);
-  desc.reset(f2_.CreateAnswer(offer.get(), TransportOptions(), true, NULL));
-  ASSERT_TRUE(desc.get() == NULL);
-}
-
-// Test that we handle answering an DTLS offer with DTLS, both if we have
-// DTLS enabled and required.
-TEST_F(TransportDescriptionFactoryTest, TestAnswerDtlsToDtls) {
-  f1_.set_secure(cricket::SEC_ENABLED);
-  f1_.set_certificate(cert1_);
-
-  f2_.set_secure(cricket::SEC_ENABLED);
-  f2_.set_certificate(cert2_);
-  // f2_ produces the answer that is being checked in this test, so the
-  // answer must contain fingerprint lines with cert2_'s digest algorithm.
-  std::string digest_alg2;
-  ASSERT_TRUE(cert2_->ssl_certificate().GetSignatureDigestAlgorithm(
-      &digest_alg2));
-
-  std::unique_ptr<TransportDescription> offer(
-      f1_.CreateOffer(TransportOptions(), NULL));
-  ASSERT_TRUE(offer.get() != NULL);
-  std::unique_ptr<TransportDescription> desc(
-      f2_.CreateAnswer(offer.get(), TransportOptions(), true, NULL));
-  CheckDesc(desc.get(), "", "", "", digest_alg2);
-  f2_.set_secure(cricket::SEC_REQUIRED);
-  desc.reset(f2_.CreateAnswer(offer.get(), TransportOptions(), true, NULL));
-  CheckDesc(desc.get(), "", "", "", digest_alg2);
-}
-
-// Test that ice ufrag and password is changed in an updated offer and answer
-// if |TransportDescriptionOptions::ice_restart| is true.
-TEST_F(TransportDescriptionFactoryTest, TestIceRestart) {
-  TestIceRestart(false);
-}
-
-// Test that ice ufrag and password is changed in an updated offer and answer
-// if |TransportDescriptionOptions::ice_restart| is true and DTLS is enabled.
-TEST_F(TransportDescriptionFactoryTest, TestIceRestartWithDtls) {
-  TestIceRestart(true);
-}
-
-// Test that ice renomination is set in an updated offer and answer
-// if |TransportDescriptionOptions::enable_ice_renomination| is true.
-TEST_F(TransportDescriptionFactoryTest, TestIceRenomination) {
-  TestIceRenomination(false);
-}
-
-// Test that ice renomination is set in an updated offer and answer
-// if |TransportDescriptionOptions::enable_ice_renomination| is true and DTLS
-// is enabled.
-TEST_F(TransportDescriptionFactoryTest, TestIceRenominationWithDtls) {
-  TestIceRenomination(true);
-}
-
-// Test that offers and answers have ice-option:trickle.
-TEST_F(TransportDescriptionFactoryTest, AddsTrickleIceOption) {
-  cricket::TransportOptions options;
-  std::unique_ptr<TransportDescription> offer(
-      f1_.CreateOffer(options, nullptr));
-  EXPECT_TRUE(offer->HasOption("trickle"));
-  std::unique_ptr<TransportDescription> answer(
-      f2_.CreateAnswer(offer.get(), options, true, nullptr));
-  EXPECT_TRUE(answer->HasOption("trickle"));
-}
diff --git a/p2p/base/transportinfo.h b/p2p/base/transportinfo.h
deleted file mode 100644
index c38bf2a..0000000
--- a/p2p/base/transportinfo.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- *  Copyright 2012 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_P2P_BASE_TRANSPORTINFO_H_
-#define WEBRTC_P2P_BASE_TRANSPORTINFO_H_
-
-#include <string>
-#include <vector>
-
-#include "webrtc/p2p/base/candidate.h"
-#include "webrtc/p2p/base/p2pconstants.h"
-#include "webrtc/p2p/base/transportdescription.h"
-#include "webrtc/rtc_base/helpers.h"
-
-namespace cricket {
-
-// A TransportInfo is NOT a transport-info message.  It is comparable
-// to a "ContentInfo". A transport-infos message is basically just a
-// collection of TransportInfos.
-struct TransportInfo {
-  TransportInfo() {}
-
-  TransportInfo(const std::string& content_name,
-                const TransportDescription& description)
-      : content_name(content_name),
-        description(description) {}
-
-  std::string content_name;
-  TransportDescription description;
-};
-
-typedef std::vector<TransportInfo> TransportInfos;
-
-}  // namespace cricket
-
-#endif  // WEBRTC_P2P_BASE_TRANSPORTINFO_H_
diff --git a/p2p/base/turnport.cc b/p2p/base/turnport.cc
deleted file mode 100644
index 71a0311..0000000
--- a/p2p/base/turnport.cc
+++ /dev/null
@@ -1,1610 +0,0 @@
-/*
- *  Copyright 2012 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/p2p/base/turnport.h"
-
-#include <algorithm>
-#include <functional>
-
-#include "webrtc/p2p/base/common.h"
-#include "webrtc/p2p/base/stun.h"
-#include "webrtc/rtc_base/asyncpacketsocket.h"
-#include "webrtc/rtc_base/byteorder.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/nethelpers.h"
-#include "webrtc/rtc_base/ptr_util.h"
-#include "webrtc/rtc_base/socketaddress.h"
-#include "webrtc/rtc_base/stringencode.h"
-
-namespace cricket {
-
-// TODO(juberti): Move to stun.h when relay messages have been renamed.
-static const int TURN_ALLOCATE_REQUEST = STUN_ALLOCATE_REQUEST;
-
-// TODO(juberti): Extract to turnmessage.h
-static const int TURN_DEFAULT_PORT = 3478;
-static const int TURN_CHANNEL_NUMBER_START = 0x4000;
-static const int TURN_PERMISSION_TIMEOUT = 5 * 60 * 1000;  // 5 minutes
-
-static const size_t TURN_CHANNEL_HEADER_SIZE = 4U;
-
-// Retry at most twice (i.e. three different ALLOCATE requests) on
-// STUN_ERROR_ALLOCATION_MISMATCH error per rfc5766.
-static const size_t MAX_ALLOCATE_MISMATCH_RETRIES = 2;
-
-static const int TURN_SUCCESS_RESULT_CODE = 0;
-
-inline bool IsTurnChannelData(uint16_t msg_type) {
-  return ((msg_type & 0xC000) == 0x4000);  // MSB are 0b01
-}
-
-static int GetRelayPreference(cricket::ProtocolType proto) {
-  switch (proto) {
-    case cricket::PROTO_TCP:
-      return ICE_TYPE_PREFERENCE_RELAY_TCP;
-    case cricket::PROTO_TLS:
-      return ICE_TYPE_PREFERENCE_RELAY_TLS;
-    default:
-      RTC_DCHECK(proto == PROTO_UDP);
-      return ICE_TYPE_PREFERENCE_RELAY_UDP;
-  }
-}
-
-class TurnAllocateRequest : public StunRequest {
- public:
-  explicit TurnAllocateRequest(TurnPort* port);
-  void Prepare(StunMessage* request) override;
-  void OnSent() override;
-  void OnResponse(StunMessage* response) override;
-  void OnErrorResponse(StunMessage* response) override;
-  void OnTimeout() override;
-
- private:
-  // Handles authentication challenge from the server.
-  void OnAuthChallenge(StunMessage* response, int code);
-  void OnTryAlternate(StunMessage* response, int code);
-  void OnUnknownAttribute(StunMessage* response);
-
-  TurnPort* port_;
-};
-
-class TurnRefreshRequest : public StunRequest {
- public:
-  explicit TurnRefreshRequest(TurnPort* port);
-  void Prepare(StunMessage* request) override;
-  void OnSent() override;
-  void OnResponse(StunMessage* response) override;
-  void OnErrorResponse(StunMessage* response) override;
-  void OnTimeout() override;
-  void set_lifetime(int lifetime) { lifetime_ = lifetime; }
-
- private:
-  TurnPort* port_;
-  int lifetime_;
-};
-
-class TurnCreatePermissionRequest : public StunRequest,
-                                    public sigslot::has_slots<> {
- public:
-  TurnCreatePermissionRequest(TurnPort* port, TurnEntry* entry,
-                              const rtc::SocketAddress& ext_addr);
-  void Prepare(StunMessage* request) override;
-  void OnSent() override;
-  void OnResponse(StunMessage* response) override;
-  void OnErrorResponse(StunMessage* response) override;
-  void OnTimeout() override;
-
- private:
-  void OnEntryDestroyed(TurnEntry* entry);
-
-  TurnPort* port_;
-  TurnEntry* entry_;
-  rtc::SocketAddress ext_addr_;
-};
-
-class TurnChannelBindRequest : public StunRequest,
-                               public sigslot::has_slots<> {
- public:
-  TurnChannelBindRequest(TurnPort* port, TurnEntry* entry, int channel_id,
-                         const rtc::SocketAddress& ext_addr);
-  void Prepare(StunMessage* request) override;
-  void OnSent() override;
-  void OnResponse(StunMessage* response) override;
-  void OnErrorResponse(StunMessage* response) override;
-  void OnTimeout() override;
-
- private:
-  void OnEntryDestroyed(TurnEntry* entry);
-
-  TurnPort* port_;
-  TurnEntry* entry_;
-  int channel_id_;
-  rtc::SocketAddress ext_addr_;
-};
-
-// Manages a "connection" to a remote destination. We will attempt to bring up
-// a channel for this remote destination to reduce the overhead of sending data.
-class TurnEntry : public sigslot::has_slots<> {
- public:
-  enum BindState { STATE_UNBOUND, STATE_BINDING, STATE_BOUND };
-  TurnEntry(TurnPort* port, int channel_id,
-            const rtc::SocketAddress& ext_addr);
-
-  TurnPort* port() { return port_; }
-
-  int channel_id() const { return channel_id_; }
-  // For testing only.
-  void set_channel_id(int channel_id) { channel_id_ = channel_id; }
-
-  const rtc::SocketAddress& address() const { return ext_addr_; }
-  BindState state() const { return state_; }
-
-  int64_t destruction_timestamp() { return destruction_timestamp_; }
-  void set_destruction_timestamp(int64_t destruction_timestamp) {
-    destruction_timestamp_ = destruction_timestamp;
-  }
-
-  // Helper methods to send permission and channel bind requests.
-  void SendCreatePermissionRequest(int delay);
-  void SendChannelBindRequest(int delay);
-  // Sends a packet to the given destination address.
-  // This will wrap the packet in STUN if necessary.
-  int Send(const void* data, size_t size, bool payload,
-           const rtc::PacketOptions& options);
-
-  void OnCreatePermissionSuccess();
-  void OnCreatePermissionError(StunMessage* response, int code);
-  void OnCreatePermissionTimeout();
-  void OnChannelBindSuccess();
-  void OnChannelBindError(StunMessage* response, int code);
-  void OnChannelBindTimeout();
-  // Signal sent when TurnEntry is destroyed.
-  sigslot::signal1<TurnEntry*> SignalDestroyed;
-
- private:
-  TurnPort* port_;
-  int channel_id_;
-  rtc::SocketAddress ext_addr_;
-  BindState state_;
-  // A non-zero value indicates that this entry is scheduled to be destroyed.
-  // It is also used as an ID of the event scheduling. When the destruction
-  // event actually fires, the TurnEntry will be destroyed only if the
-  // timestamp here matches the one in the firing event.
-  int64_t destruction_timestamp_ = 0;
-};
-
-TurnPort::TurnPort(rtc::Thread* thread,
-                   rtc::PacketSocketFactory* factory,
-                   rtc::Network* network,
-                   rtc::AsyncPacketSocket* socket,
-                   const std::string& username,
-                   const std::string& password,
-                   const ProtocolAddress& server_address,
-                   const RelayCredentials& credentials,
-                   int server_priority,
-                   const std::string& origin)
-    : Port(thread,
-           RELAY_PORT_TYPE,
-           factory,
-           network,
-           username,
-           password),
-      server_address_(server_address),
-      credentials_(credentials),
-      socket_(socket),
-      resolver_(NULL),
-      error_(0),
-      request_manager_(thread),
-      next_channel_number_(TURN_CHANNEL_NUMBER_START),
-      state_(STATE_CONNECTING),
-      server_priority_(server_priority),
-      allocate_mismatch_retries_(0) {
-  request_manager_.SignalSendPacket.connect(this, &TurnPort::OnSendStunPacket);
-  request_manager_.set_origin(origin);
-}
-
-TurnPort::TurnPort(rtc::Thread* thread,
-                   rtc::PacketSocketFactory* factory,
-                   rtc::Network* network,
-                   uint16_t min_port,
-                   uint16_t max_port,
-                   const std::string& username,
-                   const std::string& password,
-                   const ProtocolAddress& server_address,
-                   const RelayCredentials& credentials,
-                   int server_priority,
-                   const std::string& origin,
-                   const std::vector<std::string>& tls_alpn_protocols,
-                   const std::vector<std::string>& tls_elliptic_curves)
-    : Port(thread,
-           RELAY_PORT_TYPE,
-           factory,
-           network,
-           min_port,
-           max_port,
-           username,
-           password),
-      server_address_(server_address),
-      tls_alpn_protocols_(tls_alpn_protocols),
-      tls_elliptic_curves_(tls_elliptic_curves),
-      credentials_(credentials),
-      socket_(NULL),
-      resolver_(NULL),
-      error_(0),
-      request_manager_(thread),
-      next_channel_number_(TURN_CHANNEL_NUMBER_START),
-      state_(STATE_CONNECTING),
-      server_priority_(server_priority),
-      allocate_mismatch_retries_(0) {
-  request_manager_.SignalSendPacket.connect(this, &TurnPort::OnSendStunPacket);
-  request_manager_.set_origin(origin);
-}
-
-TurnPort::~TurnPort() {
-  // TODO(juberti): Should this even be necessary?
-
-  // release the allocation by sending a refresh with
-  // lifetime 0.
-  if (ready()) {
-    TurnRefreshRequest bye(this);
-    bye.set_lifetime(0);
-    SendRequest(&bye, 0);
-  }
-
-  while (!entries_.empty()) {
-    DestroyEntry(entries_.front());
-  }
-  if (resolver_) {
-    resolver_->Destroy(false);
-  }
-  if (!SharedSocket()) {
-    delete socket_;
-  }
-}
-
-rtc::SocketAddress TurnPort::GetLocalAddress() const {
-  return socket_ ? socket_->GetLocalAddress() : rtc::SocketAddress();
-}
-
-void TurnPort::PrepareAddress() {
-  if (credentials_.username.empty() ||
-      credentials_.password.empty()) {
-    LOG(LS_ERROR) << "Allocation can't be started without setting the"
-                  << " TURN server credentials for the user.";
-    OnAllocateError();
-    return;
-  }
-
-  if (!server_address_.address.port()) {
-    // We will set default TURN port, if no port is set in the address.
-    server_address_.address.SetPort(TURN_DEFAULT_PORT);
-  }
-
-  if (server_address_.address.IsUnresolvedIP()) {
-    ResolveTurnAddress(server_address_.address);
-  } else {
-    // If protocol family of server address doesn't match with local, return.
-    if (!IsCompatibleAddress(server_address_.address)) {
-      LOG(LS_ERROR) << "IP address family does not match: "
-                    << "server: " << server_address_.address.family()
-                    << " local: " << Network()->GetBestIP().family();
-      OnAllocateError();
-      return;
-    }
-
-    // Insert the current address to prevent redirection pingpong.
-    attempted_server_addresses_.insert(server_address_.address);
-
-    LOG_J(LS_INFO, this) << "Trying to connect to TURN server via "
-                         << ProtoToString(server_address_.proto) << " @ "
-                         << server_address_.address.ToSensitiveString();
-    if (!CreateTurnClientSocket()) {
-      LOG(LS_ERROR) << "Failed to create TURN client socket";
-      OnAllocateError();
-      return;
-    }
-    if (server_address_.proto == PROTO_UDP) {
-      // If its UDP, send AllocateRequest now.
-      // For TCP and TLS AllcateRequest will be sent by OnSocketConnect.
-      SendRequest(new TurnAllocateRequest(this), 0);
-    }
-  }
-}
-
-bool TurnPort::CreateTurnClientSocket() {
-  RTC_DCHECK(!socket_ || SharedSocket());
-
-  if (server_address_.proto == PROTO_UDP && !SharedSocket()) {
-    socket_ = socket_factory()->CreateUdpSocket(
-        rtc::SocketAddress(Network()->GetBestIP(), 0), min_port(), max_port());
-  } else if (server_address_.proto == PROTO_TCP ||
-             server_address_.proto == PROTO_TLS) {
-    RTC_DCHECK(!SharedSocket());
-    int opts = rtc::PacketSocketFactory::OPT_STUN;
-
-    // Apply server address TLS and insecure bits to options.
-    if (server_address_.proto == PROTO_TLS) {
-      if (tls_cert_policy_ ==
-          TlsCertPolicy::TLS_CERT_POLICY_INSECURE_NO_CHECK) {
-        opts |= rtc::PacketSocketFactory::OPT_TLS_INSECURE;
-      } else {
-        opts |= rtc::PacketSocketFactory::OPT_TLS;
-      }
-    }
-
-    rtc::PacketSocketTcpOptions tcp_options;
-    tcp_options.opts = opts;
-    tcp_options.tls_alpn_protocols = tls_alpn_protocols_;
-    tcp_options.tls_elliptic_curves = tls_elliptic_curves_;
-    socket_ = socket_factory()->CreateClientTcpSocket(
-        rtc::SocketAddress(Network()->GetBestIP(), 0), server_address_.address,
-        proxy(), user_agent(), tcp_options);
-  }
-
-  if (!socket_) {
-    error_ = SOCKET_ERROR;
-    return false;
-  }
-
-  // Apply options if any.
-  for (SocketOptionsMap::iterator iter = socket_options_.begin();
-       iter != socket_options_.end(); ++iter) {
-    socket_->SetOption(iter->first, iter->second);
-  }
-
-  if (!SharedSocket()) {
-    // If socket is shared, AllocationSequence will receive the packet.
-    socket_->SignalReadPacket.connect(this, &TurnPort::OnReadPacket);
-  }
-
-  socket_->SignalReadyToSend.connect(this, &TurnPort::OnReadyToSend);
-
-  socket_->SignalSentPacket.connect(this, &TurnPort::OnSentPacket);
-
-  // TCP port is ready to send stun requests after the socket is connected,
-  // while UDP port is ready to do so once the socket is created.
-  if (server_address_.proto == PROTO_TCP ||
-      server_address_.proto == PROTO_TLS) {
-    socket_->SignalConnect.connect(this, &TurnPort::OnSocketConnect);
-    socket_->SignalClose.connect(this, &TurnPort::OnSocketClose);
-  } else {
-    state_ = STATE_CONNECTED;
-  }
-  return true;
-}
-
-void TurnPort::OnSocketConnect(rtc::AsyncPacketSocket* socket) {
-  // This slot should only be invoked if we're using a connection-oriented
-  // protocol.
-  RTC_DCHECK(server_address_.proto == PROTO_TCP ||
-             server_address_.proto == PROTO_TLS);
-
-  // Do not use this port if the socket bound to an address not associated with
-  // the desired network interface. This is seen in Chrome, where TCP sockets
-  // cannot be given a binding address, and the platform is expected to pick
-  // the correct local address.
-  //
-  // However, there are two situations in which we allow the bound address to
-  // not be one of the addresses of the requested interface:
-  // 1. The bound address is the loopback address. This happens when a proxy
-  // forces TCP to bind to only the localhost address (see issue 3927).
-  // 2. The bound address is the "any address". This happens when
-  // multiple_routes is disabled (see issue 4780).
-  //
-  // Note that, aside from minor differences in log statements, this logic is
-  // identical to that in TcpPort.
-  const rtc::SocketAddress& socket_address = socket->GetLocalAddress();
-  const std::vector<rtc::InterfaceAddress>& desired_addresses =
-      Network()->GetIPs();
-  if (std::find(desired_addresses.begin(), desired_addresses.end(),
-                socket_address.ipaddr()) == desired_addresses.end()) {
-    if (socket->GetLocalAddress().IsLoopbackIP()) {
-      LOG(LS_WARNING) << "Socket is bound to the address:"
-                      << socket_address.ipaddr().ToString()
-                      << ", rather then an address associated with network:"
-                      << Network()->ToString()
-                      << ". Still allowing it since it's localhost.";
-    } else if (IPIsAny(Network()->GetBestIP())) {
-      LOG(LS_WARNING) << "Socket is bound to the address:"
-                      << socket_address.ipaddr().ToString()
-                      << ", rather then an address associated with network:"
-                      << Network()->ToString()
-                      << ". Still allowing it since it's the 'any' address"
-                      << ", possibly caused by multiple_routes being disabled.";
-    } else {
-      LOG(LS_WARNING) << "Socket is bound to the address:"
-                      << socket_address.ipaddr().ToString()
-                      << ", rather then an address associated with network:"
-                      << Network()->ToString() << ". Discarding TURN port.";
-      OnAllocateError();
-      return;
-    }
-  }
-
-  state_ = STATE_CONNECTED;  // It is ready to send stun requests.
-  if (server_address_.address.IsUnresolvedIP()) {
-    server_address_.address = socket_->GetRemoteAddress();
-  }
-
-  LOG(LS_INFO) << "TurnPort connected to " << socket->GetRemoteAddress()
-               << " using tcp.";
-  SendRequest(new TurnAllocateRequest(this), 0);
-}
-
-void TurnPort::OnSocketClose(rtc::AsyncPacketSocket* socket, int error) {
-  LOG_J(LS_WARNING, this) << "Connection with server failed, error=" << error;
-  RTC_DCHECK(socket == socket_);
-  Close();
-}
-
-void TurnPort::OnAllocateMismatch() {
-  if (allocate_mismatch_retries_ >= MAX_ALLOCATE_MISMATCH_RETRIES) {
-    LOG_J(LS_WARNING, this) << "Giving up on the port after "
-                            << allocate_mismatch_retries_
-                            << " retries for STUN_ERROR_ALLOCATION_MISMATCH";
-    OnAllocateError();
-    return;
-  }
-
-  LOG_J(LS_INFO, this) << "Allocating a new socket after "
-                       << "STUN_ERROR_ALLOCATION_MISMATCH, retry = "
-                       << allocate_mismatch_retries_ + 1;
-  if (SharedSocket()) {
-    ResetSharedSocket();
-  } else {
-    delete socket_;
-  }
-  socket_ = NULL;
-
-  ResetNonce();
-  PrepareAddress();
-  ++allocate_mismatch_retries_;
-}
-
-Connection* TurnPort::CreateConnection(const Candidate& remote_candidate,
-                                       CandidateOrigin origin) {
-  // TURN-UDP can only connect to UDP candidates.
-  if (!SupportsProtocol(remote_candidate.protocol())) {
-    return NULL;
-  }
-
-  if (state_ == STATE_DISCONNECTED || state_ == STATE_RECEIVEONLY) {
-    return NULL;
-  }
-
-  // A TURN port will have two candiates, STUN and TURN. STUN may not
-  // present in all cases. If present stun candidate will be added first
-  // and TURN candidate later.
-  for (size_t index = 0; index < Candidates().size(); ++index) {
-    const Candidate& local_candidate = Candidates()[index];
-    if (local_candidate.type() == RELAY_PORT_TYPE &&
-        local_candidate.address().family() ==
-            remote_candidate.address().family()) {
-      // Create an entry, if needed, so we can get our permissions set up
-      // correctly.
-      CreateOrRefreshEntry(remote_candidate.address());
-      ProxyConnection* conn =
-          new ProxyConnection(this, index, remote_candidate);
-      AddOrReplaceConnection(conn);
-      return conn;
-    }
-  }
-  return NULL;
-}
-
-bool TurnPort::FailAndPruneConnection(const rtc::SocketAddress& address) {
-  Connection* conn = GetConnection(address);
-  if (conn != nullptr) {
-    conn->FailAndPrune();
-    return true;
-  }
-  return false;
-}
-
-int TurnPort::SetOption(rtc::Socket::Option opt, int value) {
-  if (!socket_) {
-    // If socket is not created yet, these options will be applied during socket
-    // creation.
-    socket_options_[opt] = value;
-    return 0;
-  }
-  return socket_->SetOption(opt, value);
-}
-
-int TurnPort::GetOption(rtc::Socket::Option opt, int* value) {
-  if (!socket_) {
-    SocketOptionsMap::const_iterator it = socket_options_.find(opt);
-    if (it == socket_options_.end()) {
-      return -1;
-    }
-    *value = it->second;
-    return 0;
-  }
-
-  return socket_->GetOption(opt, value);
-}
-
-int TurnPort::GetError() {
-  return error_;
-}
-
-int TurnPort::SendTo(const void* data, size_t size,
-                     const rtc::SocketAddress& addr,
-                     const rtc::PacketOptions& options,
-                     bool payload) {
-  // Try to find an entry for this specific address; we should have one.
-  TurnEntry* entry = FindEntry(addr);
-  if (!entry) {
-    LOG(LS_ERROR) << "Did not find the TurnEntry for address " << addr;
-    return 0;
-  }
-
-  if (!ready()) {
-    error_ = ENOTCONN;
-    return SOCKET_ERROR;
-  }
-
-  // Send the actual contents to the server using the usual mechanism.
-  int sent = entry->Send(data, size, payload, options);
-  if (sent <= 0) {
-    return SOCKET_ERROR;
-  }
-
-  // The caller of the function is expecting the number of user data bytes,
-  // rather than the size of the packet.
-  return static_cast<int>(size);
-}
-
-bool TurnPort::HandleIncomingPacket(rtc::AsyncPacketSocket* socket,
-                                    const char* data, size_t size,
-                                    const rtc::SocketAddress& remote_addr,
-                                    const rtc::PacketTime& packet_time) {
-  if (socket != socket_) {
-    // The packet was received on a shared socket after we've allocated a new
-    // socket for this TURN port.
-    return false;
-  }
-
-  // This is to guard against a STUN response from previous server after
-  // alternative server redirection. TODO(guoweis): add a unit test for this
-  // race condition.
-  if (remote_addr != server_address_.address) {
-    LOG_J(LS_WARNING, this) << "Discarding TURN message from unknown address:"
-                            << remote_addr.ToString()
-                            << ", server_address_:"
-                            << server_address_.address.ToString();
-    return false;
-  }
-
-  // The message must be at least the size of a channel header.
-  if (size < TURN_CHANNEL_HEADER_SIZE) {
-    LOG_J(LS_WARNING, this) << "Received TURN message that was too short";
-    return false;
-  }
-
-  if (state_ == STATE_DISCONNECTED) {
-    LOG_J(LS_WARNING, this)
-        << "Received TURN message while the TURN port is disconnected";
-    return false;
-  }
-
-  // Check the message type, to see if is a Channel Data message.
-  // The message will either be channel data, a TURN data indication, or
-  // a response to a previous request.
-  uint16_t msg_type = rtc::GetBE16(data);
-  if (IsTurnChannelData(msg_type)) {
-    HandleChannelData(msg_type, data, size, packet_time);
-    return true;
-
-  }
-
-  if (msg_type == TURN_DATA_INDICATION) {
-    HandleDataIndication(data, size, packet_time);
-    return true;
-  }
-
-  if (SharedSocket() && (msg_type == STUN_BINDING_RESPONSE ||
-                         msg_type == STUN_BINDING_ERROR_RESPONSE)) {
-    LOG_J(LS_VERBOSE, this) <<
-        "Ignoring STUN binding response message on shared socket.";
-    return false;
-  }
-
-  // This must be a response for one of our requests.
-  // Check success responses, but not errors, for MESSAGE-INTEGRITY.
-  if (IsStunSuccessResponseType(msg_type) &&
-      !StunMessage::ValidateMessageIntegrity(data, size, hash())) {
-    LOG_J(LS_WARNING, this) << "Received TURN message with invalid "
-                            << "message integrity, msg_type=" << msg_type;
-    return true;
-  }
-  request_manager_.CheckResponse(data, size);
-
-  return true;
-}
-
-void TurnPort::OnReadPacket(rtc::AsyncPacketSocket* socket,
-                            const char* data,
-                            size_t size,
-                            const rtc::SocketAddress& remote_addr,
-                            const rtc::PacketTime& packet_time) {
-  HandleIncomingPacket(socket, data, size, remote_addr, packet_time);
-}
-
-void TurnPort::OnSentPacket(rtc::AsyncPacketSocket* socket,
-                            const rtc::SentPacket& sent_packet) {
-  PortInterface::SignalSentPacket(sent_packet);
-}
-
-void TurnPort::OnReadyToSend(rtc::AsyncPacketSocket* socket) {
-  if (ready()) {
-    Port::OnReadyToSend();
-  }
-}
-
-
-// Update current server address port with the alternate server address port.
-bool TurnPort::SetAlternateServer(const rtc::SocketAddress& address) {
-  // Check if we have seen this address before and reject if we did.
-  AttemptedServerSet::iterator iter = attempted_server_addresses_.find(address);
-  if (iter != attempted_server_addresses_.end()) {
-    LOG_J(LS_WARNING, this) << "Redirection to ["
-                            << address.ToSensitiveString()
-                            << "] ignored, allocation failed.";
-    return false;
-  }
-
-  // If protocol family of server address doesn't match with local, return.
-  if (!IsCompatibleAddress(address)) {
-    LOG(LS_WARNING) << "Server IP address family does not match with "
-                    << "local host address family type";
-    return false;
-  }
-
-  // Block redirects to a loopback address.
-  // See: https://bugs.chromium.org/p/chromium/issues/detail?id=649118
-  if (address.IsLoopbackIP()) {
-    LOG_J(LS_WARNING, this)
-        << "Blocking attempted redirect to loopback address.";
-    return false;
-  }
-
-  LOG_J(LS_INFO, this) << "Redirecting from TURN server ["
-                       << server_address_.address.ToSensitiveString()
-                       << "] to TURN server ["
-                       << address.ToSensitiveString()
-                       << "]";
-  server_address_ = ProtocolAddress(address, server_address_.proto);
-
-  // Insert the current address to prevent redirection pingpong.
-  attempted_server_addresses_.insert(server_address_.address);
-  return true;
-}
-
-void TurnPort::ResolveTurnAddress(const rtc::SocketAddress& address) {
-  if (resolver_)
-    return;
-
-  LOG_J(LS_INFO, this) << "Starting TURN host lookup for "
-                       << address.ToSensitiveString();
-  resolver_ = socket_factory()->CreateAsyncResolver();
-  resolver_->SignalDone.connect(this, &TurnPort::OnResolveResult);
-  resolver_->Start(address);
-}
-
-void TurnPort::OnResolveResult(rtc::AsyncResolverInterface* resolver) {
-  RTC_DCHECK(resolver == resolver_);
-  // If DNS resolve is failed when trying to connect to the server using TCP,
-  // one of the reason could be due to DNS queries blocked by firewall.
-  // In such cases we will try to connect to the server with hostname, assuming
-  // socket layer will resolve the hostname through a HTTP proxy (if any).
-  if (resolver_->GetError() != 0 && (server_address_.proto == PROTO_TCP ||
-                                     server_address_.proto == PROTO_TLS)) {
-    if (!CreateTurnClientSocket()) {
-      OnAllocateError();
-    }
-    return;
-  }
-
-  // Copy the original server address in |resolved_address|. For TLS based
-  // sockets we need hostname along with resolved address.
-  rtc::SocketAddress resolved_address = server_address_.address;
-  if (resolver_->GetError() != 0 ||
-      !resolver_->GetResolvedAddress(Network()->GetBestIP().family(),
-                                     &resolved_address)) {
-    LOG_J(LS_WARNING, this) << "TURN host lookup received error "
-                            << resolver_->GetError();
-    error_ = resolver_->GetError();
-    OnAllocateError();
-    return;
-  }
-  // Signal needs both resolved and unresolved address. After signal is sent
-  // we can copy resolved address back into |server_address_|.
-  SignalResolvedServerAddress(this, server_address_.address,
-                              resolved_address);
-  server_address_.address = resolved_address;
-  PrepareAddress();
-}
-
-void TurnPort::OnSendStunPacket(const void* data, size_t size,
-                                StunRequest* request) {
-  RTC_DCHECK(connected());
-  rtc::PacketOptions options(DefaultDscpValue());
-  if (Send(data, size, options) < 0) {
-    LOG_J(LS_ERROR, this) << "Failed to send TURN message, err="
-                          << socket_->GetError();
-  }
-}
-
-void TurnPort::OnStunAddress(const rtc::SocketAddress& address) {
-  // STUN Port will discover STUN candidate, as it's supplied with first TURN
-  // server address.
-  // Why not using this address? - P2PTransportChannel will start creating
-  // connections after first candidate, which means it could start creating the
-  // connections before TURN candidate added. For that to handle, we need to
-  // supply STUN candidate from this port to UDPPort, and TurnPort should have
-  // handle to UDPPort to pass back the address.
-}
-
-void TurnPort::OnAllocateSuccess(const rtc::SocketAddress& address,
-                                 const rtc::SocketAddress& stun_address) {
-  state_ = STATE_READY;
-
-  rtc::SocketAddress related_address = stun_address;
-
-  // For relayed candidate, Base is the candidate itself.
-  AddAddress(address,          // Candidate address.
-             address,          // Base address.
-             related_address,  // Related address.
-             UDP_PROTOCOL_NAME,
-             ProtoToString(server_address_.proto),  // The first hop protocol.
-             "",  // TCP canddiate type, empty for turn candidates.
-             RELAY_PORT_TYPE, GetRelayPreference(server_address_.proto),
-             server_priority_, ReconstructedServerUrl(), true);
-}
-
-void TurnPort::OnAllocateError() {
-  // We will send SignalPortError asynchronously as this can be sent during
-  // port initialization. This way it will not be blocking other port
-  // creation.
-  thread()->Post(RTC_FROM_HERE, this, MSG_ALLOCATE_ERROR);
-}
-
-void TurnPort::OnRefreshError() {
-  // Need to clear the requests asynchronously because otherwise, the refresh
-  // request may be deleted twice: once at the end of the message processing
-  // and the other in HandleRefreshError().
-  thread()->Post(RTC_FROM_HERE, this, MSG_REFRESH_ERROR);
-}
-
-void TurnPort::HandleRefreshError() {
-  request_manager_.Clear();
-  state_ = STATE_RECEIVEONLY;
-  // Fail and prune all connections; stop sending data.
-  for (auto kv : connections()) {
-    kv.second->FailAndPrune();
-  }
-}
-
-void TurnPort::Close() {
-  if (!ready()) {
-    OnAllocateError();
-  }
-  request_manager_.Clear();
-  // Stop the port from creating new connections.
-  state_ = STATE_DISCONNECTED;
-  // Delete all existing connections; stop sending data.
-  for (auto kv : connections()) {
-    kv.second->Destroy();
-  }
-}
-
-void TurnPort::OnMessage(rtc::Message* message) {
-  switch (message->message_id) {
-    case MSG_ALLOCATE_ERROR:
-      SignalPortError(this);
-      break;
-    case MSG_ALLOCATE_MISMATCH:
-      OnAllocateMismatch();
-      break;
-    case MSG_REFRESH_ERROR:
-      HandleRefreshError();
-      break;
-    case MSG_TRY_ALTERNATE_SERVER:
-      if (server_address().proto == PROTO_UDP) {
-        // Send another allocate request to alternate server, with the received
-        // realm and nonce values.
-        SendRequest(new TurnAllocateRequest(this), 0);
-      } else {
-        // Since it's TCP, we have to delete the connected socket and reconnect
-        // with the alternate server. PrepareAddress will send stun binding once
-        // the new socket is connected.
-        RTC_DCHECK(server_address().proto == PROTO_TCP ||
-                   server_address().proto == PROTO_TLS);
-        RTC_DCHECK(!SharedSocket());
-        delete socket_;
-        socket_ = NULL;
-        PrepareAddress();
-      }
-      break;
-    default:
-      Port::OnMessage(message);
-  }
-}
-
-void TurnPort::OnAllocateRequestTimeout() {
-  OnAllocateError();
-}
-
-void TurnPort::HandleDataIndication(const char* data, size_t size,
-                                    const rtc::PacketTime& packet_time) {
-  // Read in the message, and process according to RFC5766, Section 10.4.
-  rtc::ByteBufferReader buf(data, size);
-  TurnMessage msg;
-  if (!msg.Read(&buf)) {
-    LOG_J(LS_WARNING, this) << "Received invalid TURN data indication";
-    return;
-  }
-
-  // Check mandatory attributes.
-  const StunAddressAttribute* addr_attr =
-      msg.GetAddress(STUN_ATTR_XOR_PEER_ADDRESS);
-  if (!addr_attr) {
-    LOG_J(LS_WARNING, this) << "Missing STUN_ATTR_XOR_PEER_ADDRESS attribute "
-                            << "in data indication.";
-    return;
-  }
-
-  const StunByteStringAttribute* data_attr =
-      msg.GetByteString(STUN_ATTR_DATA);
-  if (!data_attr) {
-    LOG_J(LS_WARNING, this) << "Missing STUN_ATTR_DATA attribute in "
-                            << "data indication.";
-    return;
-  }
-
-  // Log a warning if the data didn't come from an address that we think we have
-  // a permission for.
-  rtc::SocketAddress ext_addr(addr_attr->GetAddress());
-  if (!HasPermission(ext_addr.ipaddr())) {
-    LOG_J(LS_WARNING, this)
-        << "Received TURN data indication with unknown "
-        << "peer address, addr=" << ext_addr.ToSensitiveString();
-  }
-
-  DispatchPacket(data_attr->bytes(), data_attr->length(), ext_addr,
-                 PROTO_UDP, packet_time);
-}
-
-void TurnPort::HandleChannelData(int channel_id, const char* data,
-                                 size_t size,
-                                 const rtc::PacketTime& packet_time) {
-  // Read the message, and process according to RFC5766, Section 11.6.
-  //    0                   1                   2                   3
-  //    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
-  //   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-  //   |         Channel Number        |            Length             |
-  //   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-  //   |                                                               |
-  //   /                       Application Data                        /
-  //   /                                                               /
-  //   |                                                               |
-  //   |                               +-------------------------------+
-  //   |                               |
-  //   +-------------------------------+
-
-  // Extract header fields from the message.
-  uint16_t len = rtc::GetBE16(data + 2);
-  if (len > size - TURN_CHANNEL_HEADER_SIZE) {
-    LOG_J(LS_WARNING, this) << "Received TURN channel data message with "
-                            << "incorrect length, len=" << len;
-    return;
-  }
-  // Allowing messages larger than |len|, as ChannelData can be padded.
-
-  TurnEntry* entry = FindEntry(channel_id);
-  if (!entry) {
-    LOG_J(LS_WARNING, this) << "Received TURN channel data message for invalid "
-                            << "channel, channel_id=" << channel_id;
-    return;
-  }
-
-  DispatchPacket(data + TURN_CHANNEL_HEADER_SIZE, len, entry->address(),
-                 PROTO_UDP, packet_time);
-}
-
-void TurnPort::DispatchPacket(const char* data, size_t size,
-    const rtc::SocketAddress& remote_addr,
-    ProtocolType proto, const rtc::PacketTime& packet_time) {
-  if (Connection* conn = GetConnection(remote_addr)) {
-    conn->OnReadPacket(data, size, packet_time);
-  } else {
-    Port::OnReadPacket(data, size, remote_addr, proto);
-  }
-}
-
-bool TurnPort::ScheduleRefresh(int lifetime) {
-  // Lifetime is in seconds; we schedule a refresh for one minute less.
-  if (lifetime < 2 * 60) {
-    LOG_J(LS_WARNING, this) << "Received response with lifetime that was "
-                            << "too short, lifetime=" << lifetime;
-    return false;
-  }
-
-  int delay = (lifetime - 60) * 1000;
-  SendRequest(new TurnRefreshRequest(this), delay);
-  LOG_J(LS_INFO, this) << "Scheduled refresh in " << delay << "ms.";
-  return true;
-}
-
-void TurnPort::SendRequest(StunRequest* req, int delay) {
-  request_manager_.SendDelayed(req, delay);
-}
-
-void TurnPort::AddRequestAuthInfo(StunMessage* msg) {
-  // If we've gotten the necessary data from the server, add it to our request.
-  RTC_DCHECK(!hash_.empty());
-  msg->AddAttribute(rtc::MakeUnique<StunByteStringAttribute>(
-      STUN_ATTR_USERNAME, credentials_.username));
-  msg->AddAttribute(
-      rtc::MakeUnique<StunByteStringAttribute>(STUN_ATTR_REALM, realm_));
-  msg->AddAttribute(
-      rtc::MakeUnique<StunByteStringAttribute>(STUN_ATTR_NONCE, nonce_));
-  const bool success = msg->AddMessageIntegrity(hash());
-  RTC_DCHECK(success);
-}
-
-int TurnPort::Send(const void* data, size_t len,
-                   const rtc::PacketOptions& options) {
-  return socket_->SendTo(data, len, server_address_.address, options);
-}
-
-void TurnPort::UpdateHash() {
-  const bool success = ComputeStunCredentialHash(credentials_.username, realm_,
-                                                 credentials_.password, &hash_);
-  RTC_DCHECK(success);
-}
-
-bool TurnPort::UpdateNonce(StunMessage* response) {
-  // When stale nonce error received, we should update
-  // hash and store realm and nonce.
-  // Check the mandatory attributes.
-  const StunByteStringAttribute* realm_attr =
-      response->GetByteString(STUN_ATTR_REALM);
-  if (!realm_attr) {
-    LOG(LS_ERROR) << "Missing STUN_ATTR_REALM attribute in "
-                  << "stale nonce error response.";
-    return false;
-  }
-  set_realm(realm_attr->GetString());
-
-  const StunByteStringAttribute* nonce_attr =
-      response->GetByteString(STUN_ATTR_NONCE);
-  if (!nonce_attr) {
-    LOG(LS_ERROR) << "Missing STUN_ATTR_NONCE attribute in "
-                  << "stale nonce error response.";
-    return false;
-  }
-  set_nonce(nonce_attr->GetString());
-  return true;
-}
-
-void TurnPort::ResetNonce() {
-  hash_.clear();
-  nonce_.clear();
-  realm_.clear();
-}
-
-static bool MatchesIP(TurnEntry* e, rtc::IPAddress ipaddr) {
-  return e->address().ipaddr() == ipaddr;
-}
-bool TurnPort::HasPermission(const rtc::IPAddress& ipaddr) const {
-  return (std::find_if(entries_.begin(), entries_.end(),
-      std::bind2nd(std::ptr_fun(MatchesIP), ipaddr)) != entries_.end());
-}
-
-static bool MatchesAddress(TurnEntry* e, rtc::SocketAddress addr) {
-  return e->address() == addr;
-}
-TurnEntry* TurnPort::FindEntry(const rtc::SocketAddress& addr) const {
-  EntryList::const_iterator it = std::find_if(entries_.begin(), entries_.end(),
-      std::bind2nd(std::ptr_fun(MatchesAddress), addr));
-  return (it != entries_.end()) ? *it : NULL;
-}
-
-static bool MatchesChannelId(TurnEntry* e, int id) {
-  return e->channel_id() == id;
-}
-TurnEntry* TurnPort::FindEntry(int channel_id) const {
-  EntryList::const_iterator it = std::find_if(entries_.begin(), entries_.end(),
-      std::bind2nd(std::ptr_fun(MatchesChannelId), channel_id));
-  return (it != entries_.end()) ? *it : NULL;
-}
-
-bool TurnPort::EntryExists(TurnEntry* e) {
-  auto it = std::find(entries_.begin(), entries_.end(), e);
-  return it != entries_.end();
-}
-
-void TurnPort::CreateOrRefreshEntry(const rtc::SocketAddress& addr) {
-  TurnEntry* entry = FindEntry(addr);
-  if (entry == nullptr) {
-    entry = new TurnEntry(this, next_channel_number_++, addr);
-    entries_.push_back(entry);
-  } else {
-    // The channel binding request for the entry will be refreshed automatically
-    // until the entry is destroyed.
-    CancelEntryDestruction(entry);
-  }
-}
-
-void TurnPort::DestroyEntry(TurnEntry* entry) {
-  RTC_DCHECK(entry != NULL);
-  entry->SignalDestroyed(entry);
-  entries_.remove(entry);
-  delete entry;
-}
-
-void TurnPort::DestroyEntryIfNotCancelled(TurnEntry* entry, int64_t timestamp) {
-  if (!EntryExists(entry)) {
-    return;
-  }
-  bool cancelled = timestamp != entry->destruction_timestamp();
-  if (!cancelled) {
-    DestroyEntry(entry);
-  }
-}
-
-void TurnPort::HandleConnectionDestroyed(Connection* conn) {
-  // Schedule an event to destroy TurnEntry for the connection, which is
-  // already destroyed.
-  const rtc::SocketAddress& remote_address = conn->remote_candidate().address();
-  TurnEntry* entry = FindEntry(remote_address);
-  RTC_DCHECK(entry != NULL);
-  ScheduleEntryDestruction(entry);
-}
-
-void TurnPort::ScheduleEntryDestruction(TurnEntry* entry) {
-  RTC_DCHECK(entry->destruction_timestamp() == 0);
-  int64_t timestamp = rtc::TimeMillis();
-  entry->set_destruction_timestamp(timestamp);
-  invoker_.AsyncInvokeDelayed<void>(
-      RTC_FROM_HERE, thread(),
-      rtc::Bind(&TurnPort::DestroyEntryIfNotCancelled, this, entry, timestamp),
-      TURN_PERMISSION_TIMEOUT);
-}
-
-void TurnPort::CancelEntryDestruction(TurnEntry* entry) {
-  RTC_DCHECK(entry->destruction_timestamp() != 0);
-  entry->set_destruction_timestamp(0);
-}
-
-bool TurnPort::SetEntryChannelId(const rtc::SocketAddress& address,
-                                 int channel_id) {
-  TurnEntry* entry = FindEntry(address);
-  if (!entry) {
-    return false;
-  }
-  entry->set_channel_id(channel_id);
-  return true;
-}
-
-std::string TurnPort::ReconstructedServerUrl() {
-  // draft-petithuguenin-behave-turn-uris-01
-  // turnURI       = scheme ":" turn-host [ ":" turn-port ]
-  //                 [ "?transport=" transport ]
-  // scheme        = "turn" / "turns"
-  // transport     = "udp" / "tcp" / transport-ext
-  // transport-ext = 1*unreserved
-  // turn-host     = IP-literal / IPv4address / reg-name
-  // turn-port     = *DIGIT
-  std::string scheme = "turn";
-  std::string transport = "tcp";
-  switch (server_address_.proto) {
-    case PROTO_SSLTCP:
-    case PROTO_TLS:
-      scheme = "turns";
-      break;
-    case PROTO_UDP:
-      transport = "udp";
-      break;
-    case PROTO_TCP:
-      break;
-  }
-  std::ostringstream url;
-  url << scheme << ":" << server_address_.address.ipaddr().ToString() << ":"
-      << server_address_.address.port() << "?transport=" << transport;
-  return url.str();
-}
-
-TurnAllocateRequest::TurnAllocateRequest(TurnPort* port)
-    : StunRequest(new TurnMessage()),
-      port_(port) {
-}
-
-void TurnAllocateRequest::Prepare(StunMessage* request) {
-  // Create the request as indicated in RFC 5766, Section 6.1.
-  request->SetType(TURN_ALLOCATE_REQUEST);
-  auto transport_attr =
-      StunAttribute::CreateUInt32(STUN_ATTR_REQUESTED_TRANSPORT);
-  transport_attr->SetValue(IPPROTO_UDP << 24);
-  request->AddAttribute(std::move(transport_attr));
-  if (!port_->hash().empty()) {
-    port_->AddRequestAuthInfo(request);
-  }
-}
-
-void TurnAllocateRequest::OnSent() {
-  LOG_J(LS_INFO, port_) << "TURN allocate request sent"
-                        << ", id=" << rtc::hex_encode(id());
-  StunRequest::OnSent();
-}
-
-void TurnAllocateRequest::OnResponse(StunMessage* response) {
-  LOG_J(LS_INFO, port_) << "TURN allocate requested successfully"
-                        << ", id=" << rtc::hex_encode(id())
-                        << ", code=0"  // Makes logging easier to parse.
-                        << ", rtt=" << Elapsed();
-
-  // Check mandatory attributes as indicated in RFC5766, Section 6.3.
-  const StunAddressAttribute* mapped_attr =
-      response->GetAddress(STUN_ATTR_XOR_MAPPED_ADDRESS);
-  if (!mapped_attr) {
-    LOG_J(LS_WARNING, port_) << "Missing STUN_ATTR_XOR_MAPPED_ADDRESS "
-                             << "attribute in allocate success response";
-    return;
-  }
-  // Using XOR-Mapped-Address for stun.
-  port_->OnStunAddress(mapped_attr->GetAddress());
-
-  const StunAddressAttribute* relayed_attr =
-      response->GetAddress(STUN_ATTR_XOR_RELAYED_ADDRESS);
-  if (!relayed_attr) {
-    LOG_J(LS_WARNING, port_) << "Missing STUN_ATTR_XOR_RELAYED_ADDRESS "
-                             << "attribute in allocate success response";
-    return;
-  }
-
-  const StunUInt32Attribute* lifetime_attr =
-      response->GetUInt32(STUN_ATTR_TURN_LIFETIME);
-  if (!lifetime_attr) {
-    LOG_J(LS_WARNING, port_) << "Missing STUN_ATTR_TURN_LIFETIME attribute in "
-                             << "allocate success response";
-    return;
-  }
-  // Notify the port the allocate succeeded, and schedule a refresh request.
-  port_->OnAllocateSuccess(relayed_attr->GetAddress(),
-                           mapped_attr->GetAddress());
-  port_->ScheduleRefresh(lifetime_attr->value());
-}
-
-void TurnAllocateRequest::OnErrorResponse(StunMessage* response) {
-  // Process error response according to RFC5766, Section 6.4.
-  int error_code = response->GetErrorCodeValue();
-
-  LOG_J(LS_INFO, port_) << "Received TURN allocate error response"
-                        << ", id=" << rtc::hex_encode(id())
-                        << ", code=" << error_code << ", rtt=" << Elapsed();
-
-  switch (error_code) {
-    case STUN_ERROR_UNAUTHORIZED:       // Unauthrorized.
-      OnAuthChallenge(response, error_code);
-      break;
-    case STUN_ERROR_TRY_ALTERNATE:
-      OnTryAlternate(response, error_code);
-      break;
-    case STUN_ERROR_ALLOCATION_MISMATCH:
-      // We must handle this error async because trying to delete the socket in
-      // OnErrorResponse will cause a deadlock on the socket.
-      port_->thread()->Post(RTC_FROM_HERE, port_,
-                            TurnPort::MSG_ALLOCATE_MISMATCH);
-      break;
-    default:
-      LOG_J(LS_WARNING, port_)
-          << "Received TURN allocate error response"
-          << ", id=" << rtc::hex_encode(id()) << ", code=" << error_code
-          << ", rtt=" << Elapsed();
-      port_->OnAllocateError();
-  }
-}
-
-void TurnAllocateRequest::OnTimeout() {
-  LOG_J(LS_WARNING, port_) << "TURN allocate request "
-                           << rtc::hex_encode(id()) << " timeout";
-  port_->OnAllocateRequestTimeout();
-}
-
-void TurnAllocateRequest::OnAuthChallenge(StunMessage* response, int code) {
-  // If we failed to authenticate even after we sent our credentials, fail hard.
-  if (code == STUN_ERROR_UNAUTHORIZED && !port_->hash().empty()) {
-    LOG_J(LS_WARNING, port_) << "Failed to authenticate with the server "
-                             << "after challenge.";
-    port_->OnAllocateError();
-    return;
-  }
-
-  // Check the mandatory attributes.
-  const StunByteStringAttribute* realm_attr =
-      response->GetByteString(STUN_ATTR_REALM);
-  if (!realm_attr) {
-    LOG_J(LS_WARNING, port_) << "Missing STUN_ATTR_REALM attribute in "
-                             << "allocate unauthorized response.";
-    return;
-  }
-  port_->set_realm(realm_attr->GetString());
-
-  const StunByteStringAttribute* nonce_attr =
-      response->GetByteString(STUN_ATTR_NONCE);
-  if (!nonce_attr) {
-    LOG_J(LS_WARNING, port_) << "Missing STUN_ATTR_NONCE attribute in "
-                             << "allocate unauthorized response.";
-    return;
-  }
-  port_->set_nonce(nonce_attr->GetString());
-
-  // Send another allocate request, with the received realm and nonce values.
-  port_->SendRequest(new TurnAllocateRequest(port_), 0);
-}
-
-void TurnAllocateRequest::OnTryAlternate(StunMessage* response, int code) {
-
-  // According to RFC 5389 section 11, there are use cases where
-  // authentication of response is not possible, we're not validating
-  // message integrity.
-
-  // Get the alternate server address attribute value.
-  const StunAddressAttribute* alternate_server_attr =
-      response->GetAddress(STUN_ATTR_ALTERNATE_SERVER);
-  if (!alternate_server_attr) {
-    LOG_J(LS_WARNING, port_) << "Missing STUN_ATTR_ALTERNATE_SERVER "
-                             << "attribute in try alternate error response";
-    port_->OnAllocateError();
-    return;
-  }
-  if (!port_->SetAlternateServer(alternate_server_attr->GetAddress())) {
-    port_->OnAllocateError();
-    return;
-  }
-
-  // Check the attributes.
-  const StunByteStringAttribute* realm_attr =
-      response->GetByteString(STUN_ATTR_REALM);
-  if (realm_attr) {
-    LOG_J(LS_INFO, port_) << "Applying STUN_ATTR_REALM attribute in "
-                          << "try alternate error response.";
-    port_->set_realm(realm_attr->GetString());
-  }
-
-  const StunByteStringAttribute* nonce_attr =
-      response->GetByteString(STUN_ATTR_NONCE);
-  if (nonce_attr) {
-    LOG_J(LS_INFO, port_) << "Applying STUN_ATTR_NONCE attribute in "
-                          << "try alternate error response.";
-    port_->set_nonce(nonce_attr->GetString());
-  }
-
-  // For TCP, we can't close the original Tcp socket during handling a 300 as
-  // we're still inside that socket's event handler. Doing so will cause
-  // deadlock.
-  port_->thread()->Post(RTC_FROM_HERE, port_,
-                        TurnPort::MSG_TRY_ALTERNATE_SERVER);
-}
-
-TurnRefreshRequest::TurnRefreshRequest(TurnPort* port)
-    : StunRequest(new TurnMessage()),
-      port_(port),
-      lifetime_(-1) {
-}
-
-void TurnRefreshRequest::Prepare(StunMessage* request) {
-  // Create the request as indicated in RFC 5766, Section 7.1.
-  // No attributes need to be included.
-  request->SetType(TURN_REFRESH_REQUEST);
-  if (lifetime_ > -1) {
-    request->AddAttribute(
-        rtc::MakeUnique<StunUInt32Attribute>(STUN_ATTR_LIFETIME, lifetime_));
-  }
-
-  port_->AddRequestAuthInfo(request);
-}
-
-void TurnRefreshRequest::OnSent() {
-  LOG_J(LS_INFO, port_) << "TURN refresh request sent"
-                        << ", id=" << rtc::hex_encode(id());
-  StunRequest::OnSent();
-}
-
-void TurnRefreshRequest::OnResponse(StunMessage* response) {
-  LOG_J(LS_INFO, port_) << "TURN refresh requested successfully"
-                        << ", id=" << rtc::hex_encode(id())
-                        << ", code=0"  // Makes logging easier to parse.
-                        << ", rtt=" << Elapsed();
-
-  // Check mandatory attributes as indicated in RFC5766, Section 7.3.
-  const StunUInt32Attribute* lifetime_attr =
-      response->GetUInt32(STUN_ATTR_TURN_LIFETIME);
-  if (!lifetime_attr) {
-    LOG_J(LS_WARNING, port_) << "Missing STUN_ATTR_TURN_LIFETIME attribute in "
-                             << "refresh success response.";
-    return;
-  }
-
-  // Schedule a refresh based on the returned lifetime value.
-  port_->ScheduleRefresh(lifetime_attr->value());
-  port_->SignalTurnRefreshResult(port_, TURN_SUCCESS_RESULT_CODE);
-}
-
-void TurnRefreshRequest::OnErrorResponse(StunMessage* response) {
-  int error_code = response->GetErrorCodeValue();
-
-  if (error_code == STUN_ERROR_STALE_NONCE) {
-    if (port_->UpdateNonce(response)) {
-      // Send RefreshRequest immediately.
-      port_->SendRequest(new TurnRefreshRequest(port_), 0);
-    }
-  } else {
-    LOG_J(LS_WARNING, port_)
-        << "Received TURN refresh error response"
-        << ", id=" << rtc::hex_encode(id()) << ", code=" << error_code
-        << ", rtt=" << Elapsed();
-    port_->OnRefreshError();
-    port_->SignalTurnRefreshResult(port_, error_code);
-  }
-}
-
-void TurnRefreshRequest::OnTimeout() {
-  LOG_J(LS_WARNING, port_) << "TURN refresh timeout " << rtc::hex_encode(id());
-  port_->OnRefreshError();
-}
-
-TurnCreatePermissionRequest::TurnCreatePermissionRequest(
-    TurnPort* port, TurnEntry* entry,
-    const rtc::SocketAddress& ext_addr)
-    : StunRequest(new TurnMessage()),
-      port_(port),
-      entry_(entry),
-      ext_addr_(ext_addr) {
-  entry_->SignalDestroyed.connect(
-      this, &TurnCreatePermissionRequest::OnEntryDestroyed);
-}
-
-void TurnCreatePermissionRequest::Prepare(StunMessage* request) {
-  // Create the request as indicated in RFC5766, Section 9.1.
-  request->SetType(TURN_CREATE_PERMISSION_REQUEST);
-  request->AddAttribute(rtc::MakeUnique<StunXorAddressAttribute>(
-      STUN_ATTR_XOR_PEER_ADDRESS, ext_addr_));
-  port_->AddRequestAuthInfo(request);
-}
-
-void TurnCreatePermissionRequest::OnSent() {
-  LOG_J(LS_INFO, port_) << "TURN create permission request sent"
-                        << ", id=" << rtc::hex_encode(id());
-  StunRequest::OnSent();
-}
-
-void TurnCreatePermissionRequest::OnResponse(StunMessage* response) {
-  LOG_J(LS_INFO, port_) << "TURN permission requested successfully"
-                        << ", id=" << rtc::hex_encode(id())
-                        << ", code=0"  // Makes logging easier to parse.
-                        << ", rtt=" << Elapsed();
-
-  if (entry_) {
-    entry_->OnCreatePermissionSuccess();
-  }
-}
-
-void TurnCreatePermissionRequest::OnErrorResponse(StunMessage* response) {
-  int error_code = response->GetErrorCodeValue();
-  LOG_J(LS_WARNING, port_) << "Received TURN create permission error response"
-                           << ", id=" << rtc::hex_encode(id())
-                           << ", code=" << error_code << ", rtt=" << Elapsed();
-  if (entry_) {
-    entry_->OnCreatePermissionError(response, error_code);
-  }
-}
-
-void TurnCreatePermissionRequest::OnTimeout() {
-  LOG_J(LS_WARNING, port_) << "TURN create permission timeout "
-                           << rtc::hex_encode(id());
-  if (entry_) {
-    entry_->OnCreatePermissionTimeout();
-  }
-}
-
-void TurnCreatePermissionRequest::OnEntryDestroyed(TurnEntry* entry) {
-  RTC_DCHECK(entry_ == entry);
-  entry_ = NULL;
-}
-
-TurnChannelBindRequest::TurnChannelBindRequest(
-    TurnPort* port, TurnEntry* entry,
-    int channel_id, const rtc::SocketAddress& ext_addr)
-    : StunRequest(new TurnMessage()),
-      port_(port),
-      entry_(entry),
-      channel_id_(channel_id),
-      ext_addr_(ext_addr) {
-  entry_->SignalDestroyed.connect(
-      this, &TurnChannelBindRequest::OnEntryDestroyed);
-}
-
-void TurnChannelBindRequest::Prepare(StunMessage* request) {
-  // Create the request as indicated in RFC5766, Section 11.1.
-  request->SetType(TURN_CHANNEL_BIND_REQUEST);
-  request->AddAttribute(rtc::MakeUnique<StunUInt32Attribute>(
-      STUN_ATTR_CHANNEL_NUMBER, channel_id_ << 16));
-  request->AddAttribute(rtc::MakeUnique<StunXorAddressAttribute>(
-      STUN_ATTR_XOR_PEER_ADDRESS, ext_addr_));
-  port_->AddRequestAuthInfo(request);
-}
-
-void TurnChannelBindRequest::OnSent() {
-  LOG_J(LS_INFO, port_) << "TURN channel bind request sent"
-                        << ", id=" << rtc::hex_encode(id());
-  StunRequest::OnSent();
-}
-
-void TurnChannelBindRequest::OnResponse(StunMessage* response) {
-  LOG_J(LS_INFO, port_) << "TURN channel bind requested successfully"
-                        << ", id=" << rtc::hex_encode(id())
-                        << ", code=0"  // Makes logging easier to parse.
-                        << ", rtt=" << Elapsed();
-
-  if (entry_) {
-    entry_->OnChannelBindSuccess();
-    // Refresh the channel binding just under the permission timeout
-    // threshold. The channel binding has a longer lifetime, but
-    // this is the easiest way to keep both the channel and the
-    // permission from expiring.
-    int delay = TURN_PERMISSION_TIMEOUT - 60000;
-    entry_->SendChannelBindRequest(delay);
-    LOG_J(LS_INFO, port_) << "Scheduled channel bind in " << delay << "ms.";
-  }
-}
-
-void TurnChannelBindRequest::OnErrorResponse(StunMessage* response) {
-  int error_code = response->GetErrorCodeValue();
-  LOG_J(LS_WARNING, port_) << "Received TURN channel bind error response"
-                           << ", id=" << rtc::hex_encode(id())
-                           << ", code=" << error_code << ", rtt=" << Elapsed();
-  if (entry_) {
-    entry_->OnChannelBindError(response, error_code);
-  }
-}
-
-void TurnChannelBindRequest::OnTimeout() {
-  LOG_J(LS_WARNING, port_) << "TURN channel bind timeout "
-                           << rtc::hex_encode(id());
-  if (entry_) {
-    entry_->OnChannelBindTimeout();
-  }
-}
-
-void TurnChannelBindRequest::OnEntryDestroyed(TurnEntry* entry) {
-  RTC_DCHECK(entry_ == entry);
-  entry_ = NULL;
-}
-
-TurnEntry::TurnEntry(TurnPort* port, int channel_id,
-                     const rtc::SocketAddress& ext_addr)
-    : port_(port),
-      channel_id_(channel_id),
-      ext_addr_(ext_addr),
-      state_(STATE_UNBOUND) {
-  // Creating permission for |ext_addr_|.
-  SendCreatePermissionRequest(0);
-}
-
-void TurnEntry::SendCreatePermissionRequest(int delay) {
-  port_->SendRequest(new TurnCreatePermissionRequest(port_, this, ext_addr_),
-                     delay);
-}
-
-void TurnEntry::SendChannelBindRequest(int delay) {
-  port_->SendRequest(new TurnChannelBindRequest(
-      port_, this, channel_id_, ext_addr_), delay);
-}
-
-int TurnEntry::Send(const void* data, size_t size, bool payload,
-                    const rtc::PacketOptions& options) {
-  rtc::ByteBufferWriter buf;
-  if (state_ != STATE_BOUND) {
-    // If we haven't bound the channel yet, we have to use a Send Indication.
-    TurnMessage msg;
-    msg.SetType(TURN_SEND_INDICATION);
-    msg.SetTransactionID(
-        rtc::CreateRandomString(kStunTransactionIdLength));
-    msg.AddAttribute(rtc::MakeUnique<StunXorAddressAttribute>(
-        STUN_ATTR_XOR_PEER_ADDRESS, ext_addr_));
-    msg.AddAttribute(
-        rtc::MakeUnique<StunByteStringAttribute>(STUN_ATTR_DATA, data, size));
-    const bool success = msg.Write(&buf);
-    RTC_DCHECK(success);
-
-    // If we're sending real data, request a channel bind that we can use later.
-    if (state_ == STATE_UNBOUND && payload) {
-      SendChannelBindRequest(0);
-      state_ = STATE_BINDING;
-    }
-  } else {
-    // If the channel is bound, we can send the data as a Channel Message.
-    buf.WriteUInt16(channel_id_);
-    buf.WriteUInt16(static_cast<uint16_t>(size));
-    buf.WriteBytes(reinterpret_cast<const char*>(data), size);
-  }
-  return port_->Send(buf.Data(), buf.Length(), options);
-}
-
-void TurnEntry::OnCreatePermissionSuccess() {
-  LOG_J(LS_INFO, port_) << "Create permission for "
-                        << ext_addr_.ToSensitiveString()
-                        << " succeeded";
-  port_->SignalCreatePermissionResult(port_, ext_addr_,
-                                      TURN_SUCCESS_RESULT_CODE);
-
-  // If |state_| is STATE_BOUND, the permission will be refreshed
-  // by ChannelBindRequest.
-  if (state_ != STATE_BOUND) {
-    // Refresh the permission request about 1 minute before the permission
-    // times out.
-    int delay = TURN_PERMISSION_TIMEOUT - 60000;
-    SendCreatePermissionRequest(delay);
-    LOG_J(LS_INFO, port_) << "Scheduled create-permission-request in "
-                          << delay << "ms.";
-  }
-}
-
-void TurnEntry::OnCreatePermissionError(StunMessage* response, int code) {
-  if (code == STUN_ERROR_STALE_NONCE) {
-    if (port_->UpdateNonce(response)) {
-      SendCreatePermissionRequest(0);
-    }
-  } else {
-    bool found = port_->FailAndPruneConnection(ext_addr_);
-    if (found) {
-      LOG(LS_ERROR) << "Received TURN CreatePermission error response, "
-                    << "code=" << code << "; pruned connection.";
-    }
-    // Send signal with error code.
-    port_->SignalCreatePermissionResult(port_, ext_addr_, code);
-  }
-}
-
-void TurnEntry::OnCreatePermissionTimeout() {
-  port_->FailAndPruneConnection(ext_addr_);
-}
-
-void TurnEntry::OnChannelBindSuccess() {
-  LOG_J(LS_INFO, port_) << "Channel bind for " << ext_addr_.ToSensitiveString()
-                        << " succeeded";
-  RTC_DCHECK(state_ == STATE_BINDING || state_ == STATE_BOUND);
-  state_ = STATE_BOUND;
-}
-
-void TurnEntry::OnChannelBindError(StunMessage* response, int code) {
-  // If the channel bind fails due to errors other than STATE_NONCE,
-  // we will fail and prune the connection and rely on ICE restart to
-  // re-establish a new connection if needed.
-  if (code == STUN_ERROR_STALE_NONCE) {
-    if (port_->UpdateNonce(response)) {
-      // Send channel bind request with fresh nonce.
-      SendChannelBindRequest(0);
-    }
-  } else {
-    state_ = STATE_UNBOUND;
-    port_->FailAndPruneConnection(ext_addr_);
-  }
-}
-void TurnEntry::OnChannelBindTimeout() {
-  state_ = STATE_UNBOUND;
-  port_->FailAndPruneConnection(ext_addr_);
-}
-}  // namespace cricket
diff --git a/p2p/base/turnport.h b/p2p/base/turnport.h
deleted file mode 100644
index 4d9a811..0000000
--- a/p2p/base/turnport.h
+++ /dev/null
@@ -1,318 +0,0 @@
-/*
- *  Copyright 2012 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_P2P_BASE_TURNPORT_H_
-#define WEBRTC_P2P_BASE_TURNPORT_H_
-
-#include <stdio.h>
-#include <list>
-#include <set>
-#include <string>
-
-#include "webrtc/p2p/base/port.h"
-#include "webrtc/p2p/client/basicportallocator.h"
-#include "webrtc/rtc_base/asyncinvoker.h"
-#include "webrtc/rtc_base/asyncpacketsocket.h"
-
-namespace rtc {
-class AsyncResolver;
-class SignalThread;
-}
-
-namespace cricket {
-
-extern const char TURN_PORT_TYPE[];
-class TurnAllocateRequest;
-class TurnEntry;
-
-class TurnPort : public Port {
- public:
-  enum PortState {
-    STATE_CONNECTING,    // Initial state, cannot send any packets.
-    STATE_CONNECTED,     // Socket connected, ready to send stun requests.
-    STATE_READY,         // Received allocate success, can send any packets.
-    STATE_RECEIVEONLY,   // Had REFRESH_REQUEST error, cannot send any packets.
-    STATE_DISCONNECTED,  // TCP connection died, cannot send/receive any
-                         // packets.
-  };
-  // Create a TURN port using the shared UDP socket, |socket|.
-  static TurnPort* Create(rtc::Thread* thread,
-                          rtc::PacketSocketFactory* factory,
-                          rtc::Network* network,
-                          rtc::AsyncPacketSocket* socket,
-                          const std::string& username,  // ice username.
-                          const std::string& password,  // ice password.
-                          const ProtocolAddress& server_address,
-                          const RelayCredentials& credentials,
-                          int server_priority,
-                          const std::string& origin) {
-    return new TurnPort(thread, factory, network, socket, username, password,
-                        server_address, credentials, server_priority, origin);
-  }
-
-  // Create a TURN port that will use a new socket, bound to |network| and
-  // using a port in the range between |min_port| and |max_port|.
-  static TurnPort* Create(rtc::Thread* thread,
-                          rtc::PacketSocketFactory* factory,
-                          rtc::Network* network,
-                          uint16_t min_port,
-                          uint16_t max_port,
-                          const std::string& username,  // ice username.
-                          const std::string& password,  // ice password.
-                          const ProtocolAddress& server_address,
-                          const RelayCredentials& credentials,
-                          int server_priority,
-                          const std::string& origin,
-                          const std::vector<std::string>& tls_alpn_protocols,
-                          const std::vector<std::string>& tls_elliptic_curves) {
-    return new TurnPort(thread, factory, network, min_port, max_port, username,
-                        password, server_address, credentials, server_priority,
-                        origin, tls_alpn_protocols, tls_elliptic_curves);
-  }
-
-  virtual ~TurnPort();
-
-  const ProtocolAddress& server_address() const { return server_address_; }
-  // Returns an empty address if the local address has not been assigned.
-  rtc::SocketAddress GetLocalAddress() const;
-
-  bool ready() const { return state_ == STATE_READY; }
-  bool connected() const {
-    return state_ == STATE_READY || state_ == STATE_CONNECTED;
-  }
-  const RelayCredentials& credentials() const { return credentials_; }
-
-  virtual ProtocolType GetProtocol() const { return server_address_.proto; }
-
-  virtual TlsCertPolicy GetTlsCertPolicy() const { return tls_cert_policy_; }
-
-  virtual void SetTlsCertPolicy(TlsCertPolicy tls_cert_policy) {
-    tls_cert_policy_ = tls_cert_policy;
-  }
-
-  virtual std::vector<std::string> GetTlsAlpnProtocols() const {
-    return tls_alpn_protocols_;
-  }
-
-  virtual std::vector<std::string> GetTlsEllipticCurves() const {
-    return tls_elliptic_curves_;
-  }
-
-  virtual void PrepareAddress();
-  virtual Connection* CreateConnection(
-      const Candidate& c, PortInterface::CandidateOrigin origin);
-  virtual int SendTo(const void* data, size_t size,
-                     const rtc::SocketAddress& addr,
-                     const rtc::PacketOptions& options,
-                     bool payload);
-  virtual int SetOption(rtc::Socket::Option opt, int value);
-  virtual int GetOption(rtc::Socket::Option opt, int* value);
-  virtual int GetError();
-
-  virtual bool HandleIncomingPacket(rtc::AsyncPacketSocket* socket,
-                                    const char* data, size_t size,
-                                    const rtc::SocketAddress& remote_addr,
-                                    const rtc::PacketTime& packet_time);
-  virtual void OnReadPacket(rtc::AsyncPacketSocket* socket,
-                            const char* data, size_t size,
-                            const rtc::SocketAddress& remote_addr,
-                            const rtc::PacketTime& packet_time);
-
-  virtual void OnSentPacket(rtc::AsyncPacketSocket* socket,
-                            const rtc::SentPacket& sent_packet);
-  virtual void OnReadyToSend(rtc::AsyncPacketSocket* socket);
-  virtual bool SupportsProtocol(const std::string& protocol) const {
-    // Turn port only connects to UDP candidates.
-    return protocol == UDP_PROTOCOL_NAME;
-  }
-
-  void OnSocketConnect(rtc::AsyncPacketSocket* socket);
-  void OnSocketClose(rtc::AsyncPacketSocket* socket, int error);
-
-
-  const std::string& hash() const { return hash_; }
-  const std::string& nonce() const { return nonce_; }
-
-  int error() const { return error_; }
-
-  void OnAllocateMismatch();
-
-  rtc::AsyncPacketSocket* socket() const {
-    return socket_;
-  }
-
-  // For testing only.
-  rtc::AsyncInvoker* invoker() { return &invoker_; }
-
-  // Signal with resolved server address.
-  // Parameters are port, server address and resolved server address.
-  // This signal will be sent only if server address is resolved successfully.
-  sigslot::signal3<TurnPort*,
-                   const rtc::SocketAddress&,
-                   const rtc::SocketAddress&> SignalResolvedServerAddress;
-
-  // All public methods/signals below are for testing only.
-  sigslot::signal2<TurnPort*, int> SignalTurnRefreshResult;
-  sigslot::signal3<TurnPort*, const rtc::SocketAddress&, int>
-      SignalCreatePermissionResult;
-  void FlushRequests(int msg_type) { request_manager_.Flush(msg_type); }
-  bool HasRequests() { return !request_manager_.empty(); }
-  void set_credentials(RelayCredentials& credentials) {
-    credentials_ = credentials;
-  }
-  // Finds the turn entry with |address| and sets its channel id.
-  // Returns true if the entry is found.
-  bool SetEntryChannelId(const rtc::SocketAddress& address, int channel_id);
-  // Visible for testing.
-  // Shuts down the turn port, usually because of some fatal errors.
-  void Close();
-
- protected:
-  TurnPort(rtc::Thread* thread,
-           rtc::PacketSocketFactory* factory,
-           rtc::Network* network,
-           rtc::AsyncPacketSocket* socket,
-           const std::string& username,
-           const std::string& password,
-           const ProtocolAddress& server_address,
-           const RelayCredentials& credentials,
-           int server_priority,
-           const std::string& origin);
-
-  TurnPort(rtc::Thread* thread,
-           rtc::PacketSocketFactory* factory,
-           rtc::Network* network,
-           uint16_t min_port,
-           uint16_t max_port,
-           const std::string& username,
-           const std::string& password,
-           const ProtocolAddress& server_address,
-           const RelayCredentials& credentials,
-           int server_priority,
-           const std::string& origin,
-           const std::vector<std::string>& tls_alpn_protocols,
-           const std::vector<std::string>& tls_elliptic_curves);
-
- private:
-  enum {
-    MSG_ALLOCATE_ERROR = MSG_FIRST_AVAILABLE,
-    MSG_ALLOCATE_MISMATCH,
-    MSG_TRY_ALTERNATE_SERVER,
-    MSG_REFRESH_ERROR
-  };
-
-  typedef std::list<TurnEntry*> EntryList;
-  typedef std::map<rtc::Socket::Option, int> SocketOptionsMap;
-  typedef std::set<rtc::SocketAddress> AttemptedServerSet;
-
-  virtual void OnMessage(rtc::Message* pmsg);
-  virtual void HandleConnectionDestroyed(Connection* conn);
-
-  bool CreateTurnClientSocket();
-
-  void set_nonce(const std::string& nonce) { nonce_ = nonce; }
-  void set_realm(const std::string& realm) {
-    if (realm != realm_) {
-      realm_ = realm;
-      UpdateHash();
-    }
-  }
-
-  void OnRefreshError();
-  void HandleRefreshError();
-  bool SetAlternateServer(const rtc::SocketAddress& address);
-  void ResolveTurnAddress(const rtc::SocketAddress& address);
-  void OnResolveResult(rtc::AsyncResolverInterface* resolver);
-
-  void AddRequestAuthInfo(StunMessage* msg);
-  void OnSendStunPacket(const void* data, size_t size, StunRequest* request);
-  // Stun address from allocate success response.
-  // Currently used only for testing.
-  void OnStunAddress(const rtc::SocketAddress& address);
-  void OnAllocateSuccess(const rtc::SocketAddress& address,
-                         const rtc::SocketAddress& stun_address);
-  void OnAllocateError();
-  void OnAllocateRequestTimeout();
-
-  void HandleDataIndication(const char* data, size_t size,
-                            const rtc::PacketTime& packet_time);
-  void HandleChannelData(int channel_id, const char* data, size_t size,
-                         const rtc::PacketTime& packet_time);
-  void DispatchPacket(const char* data, size_t size,
-      const rtc::SocketAddress& remote_addr,
-      ProtocolType proto, const rtc::PacketTime& packet_time);
-
-  bool ScheduleRefresh(int lifetime);
-  void SendRequest(StunRequest* request, int delay);
-  int Send(const void* data, size_t size,
-           const rtc::PacketOptions& options);
-  void UpdateHash();
-  bool UpdateNonce(StunMessage* response);
-  void ResetNonce();
-
-  bool HasPermission(const rtc::IPAddress& ipaddr) const;
-  TurnEntry* FindEntry(const rtc::SocketAddress& address) const;
-  TurnEntry* FindEntry(int channel_id) const;
-  bool EntryExists(TurnEntry* e);
-  void CreateOrRefreshEntry(const rtc::SocketAddress& address);
-  void DestroyEntry(TurnEntry* entry);
-  // Destroys the entry only if |timestamp| matches the destruction timestamp
-  // in |entry|.
-  void DestroyEntryIfNotCancelled(TurnEntry* entry, int64_t timestamp);
-  void ScheduleEntryDestruction(TurnEntry* entry);
-  void CancelEntryDestruction(TurnEntry* entry);
-
-  // Marks the connection with remote address |address| failed and
-  // pruned (a.k.a. write-timed-out). Returns true if a connection is found.
-  bool FailAndPruneConnection(const rtc::SocketAddress& address);
-
-  // Reconstruct the URL of the server which the candidate is gathered from.
-  std::string ReconstructedServerUrl();
-
-  ProtocolAddress server_address_;
-  TlsCertPolicy tls_cert_policy_ = TlsCertPolicy::TLS_CERT_POLICY_SECURE;
-  std::vector<std::string> tls_alpn_protocols_;
-  std::vector<std::string> tls_elliptic_curves_;
-  RelayCredentials credentials_;
-  AttemptedServerSet attempted_server_addresses_;
-
-  rtc::AsyncPacketSocket* socket_;
-  SocketOptionsMap socket_options_;
-  rtc::AsyncResolverInterface* resolver_;
-  int error_;
-
-  StunRequestManager request_manager_;
-  std::string realm_;       // From 401/438 response message.
-  std::string nonce_;       // From 401/438 response message.
-  std::string hash_;        // Digest of username:realm:password
-
-  int next_channel_number_;
-  EntryList entries_;
-
-  PortState state_;
-  // By default the value will be set to 0. This value will be used in
-  // calculating the candidate priority.
-  int server_priority_;
-
-  // The number of retries made due to allocate mismatch error.
-  size_t allocate_mismatch_retries_;
-
-  rtc::AsyncInvoker invoker_;
-
-  friend class TurnEntry;
-  friend class TurnAllocateRequest;
-  friend class TurnRefreshRequest;
-  friend class TurnCreatePermissionRequest;
-  friend class TurnChannelBindRequest;
-};
-
-}  // namespace cricket
-
-#endif  // WEBRTC_P2P_BASE_TURNPORT_H_
diff --git a/p2p/base/turnport_unittest.cc b/p2p/base/turnport_unittest.cc
deleted file mode 100644
index a8e2937..0000000
--- a/p2p/base/turnport_unittest.cc
+++ /dev/null
@@ -1,1448 +0,0 @@
-/*
- *  Copyright 2012 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.
- */
-#if defined(WEBRTC_POSIX)
-#include <dirent.h>
-#endif
-
-#include <list>
-#include <memory>
-
-#include "webrtc/p2p/base/basicpacketsocketfactory.h"
-#include "webrtc/p2p/base/p2pconstants.h"
-#include "webrtc/p2p/base/portallocator.h"
-#include "webrtc/p2p/base/tcpport.h"
-#include "webrtc/p2p/base/testturnserver.h"
-#include "webrtc/p2p/base/turnport.h"
-#include "webrtc/p2p/base/udpport.h"
-#include "webrtc/rtc_base/asynctcpsocket.h"
-#include "webrtc/rtc_base/buffer.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/dscp.h"
-#include "webrtc/rtc_base/fakeclock.h"
-#include "webrtc/rtc_base/firewallsocketserver.h"
-#include "webrtc/rtc_base/gunit.h"
-#include "webrtc/rtc_base/helpers.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/socketadapters.h"
-#include "webrtc/rtc_base/socketaddress.h"
-#include "webrtc/rtc_base/ssladapter.h"
-#include "webrtc/rtc_base/thread.h"
-#include "webrtc/rtc_base/virtualsocketserver.h"
-
-using rtc::SocketAddress;
-
-static const SocketAddress kLocalAddr1("11.11.11.11", 0);
-static const SocketAddress kLocalAddr2("22.22.22.22", 0);
-static const SocketAddress kLocalIPv6Addr(
-    "2401:fa00:4:1000:be30:5bff:fee5:c3", 0);
-static const SocketAddress kLocalIPv6Addr2(
-    "2401:fa00:4:2000:be30:5bff:fee5:d4", 0);
-static const SocketAddress kTurnUdpIntAddr("99.99.99.3",
-                                           cricket::TURN_SERVER_PORT);
-static const SocketAddress kTurnTcpIntAddr("99.99.99.4",
-                                           cricket::TURN_SERVER_PORT);
-static const SocketAddress kTurnUdpExtAddr("99.99.99.5", 0);
-static const SocketAddress kTurnAlternateIntAddr("99.99.99.6",
-                                                 cricket::TURN_SERVER_PORT);
-static const SocketAddress kTurnIntAddr("99.99.99.7",
-                                        cricket::TURN_SERVER_PORT);
-static const SocketAddress kTurnIPv6IntAddr(
-    "2400:4030:2:2c00:be30:abcd:efab:cdef",
-    cricket::TURN_SERVER_PORT);
-static const SocketAddress kTurnUdpIPv6IntAddr(
-    "2400:4030:1:2c00:be30:abcd:efab:cdef", cricket::TURN_SERVER_PORT);
-
-static const char kCandidateFoundation[] = "foundation";
-static const char kIceUfrag1[] = "TESTICEUFRAG0001";
-static const char kIceUfrag2[] = "TESTICEUFRAG0002";
-static const char kIcePwd1[] = "TESTICEPWD00000000000001";
-static const char kIcePwd2[] = "TESTICEPWD00000000000002";
-static const char kTurnUsername[] = "test";
-static const char kTurnPassword[] = "test";
-static const char kTestOrigin[] = "http://example.com";
-// This test configures the virtual socket server to simulate delay so that we
-// can verify operations take no more than the expected number of round trips.
-static constexpr unsigned int kSimulatedRtt = 50;
-// Connection destruction may happen asynchronously, but it should only
-// take one simulated clock tick.
-static constexpr unsigned int kConnectionDestructionDelay = 1;
-// This used to be 1 second, but that's not always enough for getaddrinfo().
-// See: https://bugs.chromium.org/p/webrtc/issues/detail?id=5191
-static constexpr unsigned int kResolverTimeout = 10000;
-
-static const cricket::ProtocolAddress kTurnUdpProtoAddr(
-    kTurnUdpIntAddr, cricket::PROTO_UDP);
-static const cricket::ProtocolAddress kTurnTcpProtoAddr(
-    kTurnTcpIntAddr, cricket::PROTO_TCP);
-static const cricket::ProtocolAddress kTurnTlsProtoAddr(kTurnTcpIntAddr,
-                                                        cricket::PROTO_TLS);
-static const cricket::ProtocolAddress kTurnUdpIPv6ProtoAddr(
-    kTurnUdpIPv6IntAddr, cricket::PROTO_UDP);
-
-static const unsigned int MSG_TESTFINISH = 0;
-
-#if defined(WEBRTC_LINUX) && !defined(WEBRTC_ANDROID)
-static int GetFDCount() {
-  struct dirent *dp;
-  int fd_count = 0;
-  DIR *dir = opendir("/proc/self/fd/");
-  while ((dp = readdir(dir)) != NULL) {
-    if (dp->d_name[0] == '.')
-      continue;
-    ++fd_count;
-  }
-  closedir(dir);
-  return fd_count;
-}
-#endif
-
-namespace cricket {
-
-class TurnPortTestVirtualSocketServer : public rtc::VirtualSocketServer {
- public:
-  TurnPortTestVirtualSocketServer() {
-    // This configures the virtual socket server to always add a simulated
-    // delay of exactly half of kSimulatedRtt.
-    set_delay_mean(kSimulatedRtt / 2);
-    UpdateDelayDistribution();
-  }
-
-  using rtc::VirtualSocketServer::LookupBinding;
-};
-
-class TestConnectionWrapper : public sigslot::has_slots<> {
- public:
-  TestConnectionWrapper(Connection* conn) : connection_(conn) {
-    conn->SignalDestroyed.connect(
-        this, &TestConnectionWrapper::OnConnectionDestroyed);
-  }
-
-  Connection* connection() { return connection_; }
-
- private:
-  void OnConnectionDestroyed(Connection* conn) {
-    ASSERT_TRUE(conn == connection_);
-    connection_ = nullptr;
-  }
-
-  Connection* connection_;
-};
-
-// Note: This test uses a fake clock with a simulated network round trip
-// (between local port and TURN server) of kSimulatedRtt.
-class TurnPortTest : public testing::Test,
-                     public sigslot::has_slots<>,
-                     public rtc::MessageHandler {
- public:
-  TurnPortTest()
-      : ss_(new TurnPortTestVirtualSocketServer()),
-        main_(ss_.get()),
-        socket_factory_(rtc::Thread::Current()),
-        turn_server_(&main_, kTurnUdpIntAddr, kTurnUdpExtAddr),
-        turn_ready_(false),
-        turn_error_(false),
-        turn_unknown_address_(false),
-        turn_create_permission_success_(false),
-        udp_ready_(false),
-        test_finish_(false) {
-    // Some code uses "last received time == 0" to represent "nothing received
-    // so far", so we need to start the fake clock at a nonzero time...
-    // TODO(deadbeef): Fix this.
-    fake_clock_.AdvanceTime(rtc::TimeDelta::FromSeconds(1));
-  }
-
-  virtual void OnMessage(rtc::Message* msg) {
-    RTC_CHECK(msg->message_id == MSG_TESTFINISH);
-    if (msg->message_id == MSG_TESTFINISH)
-      test_finish_ = true;
-  }
-
-  void OnTurnPortComplete(Port* port) {
-    turn_ready_ = true;
-  }
-  void OnTurnPortError(Port* port) {
-    turn_error_ = true;
-  }
-  void OnTurnUnknownAddress(PortInterface* port,
-                            const SocketAddress& addr,
-                            ProtocolType proto,
-                            IceMessage* msg,
-                            const std::string& rf,
-                            bool /*port_muxed*/) {
-    turn_unknown_address_ = true;
-  }
-  void OnTurnCreatePermissionResult(TurnPort* port,
-                                    const SocketAddress& addr,
-                                    int code) {
-    // Ignoring the address.
-    turn_create_permission_success_ = (code == 0);
-  }
-
-  void OnTurnRefreshResult(TurnPort* port, int code) {
-    turn_refresh_success_ = (code == 0);
-  }
-  void OnTurnReadPacket(Connection* conn, const char* data, size_t size,
-                        const rtc::PacketTime& packet_time) {
-    turn_packets_.push_back(rtc::Buffer(data, size));
-  }
-  void OnUdpPortComplete(Port* port) {
-    udp_ready_ = true;
-  }
-  void OnUdpReadPacket(Connection* conn, const char* data, size_t size,
-                       const rtc::PacketTime& packet_time) {
-    udp_packets_.push_back(rtc::Buffer(data, size));
-  }
-  void OnSocketReadPacket(rtc::AsyncPacketSocket* socket,
-                          const char* data, size_t size,
-                          const rtc::SocketAddress& remote_addr,
-                          const rtc::PacketTime& packet_time) {
-    turn_port_->HandleIncomingPacket(socket, data, size, remote_addr,
-                                     packet_time);
-  }
-  rtc::AsyncSocket* CreateServerSocket(const SocketAddress addr) {
-    rtc::AsyncSocket* socket = ss_->CreateAsyncSocket(SOCK_STREAM);
-    EXPECT_GE(socket->Bind(addr), 0);
-    EXPECT_GE(socket->Listen(5), 0);
-    return socket;
-  }
-
-  rtc::Network* MakeNetwork(const SocketAddress& addr) {
-    networks_.emplace_back("unittest", "unittest", addr.ipaddr(), 32);
-    networks_.back().AddIP(addr.ipaddr());
-    return &networks_.back();
-  }
-
-  void CreateTurnPort(const std::string& username,
-                      const std::string& password,
-                      const ProtocolAddress& server_address) {
-    CreateTurnPortWithAllParams(MakeNetwork(kLocalAddr1), username, password,
-                                server_address, std::string());
-  }
-  void CreateTurnPort(const rtc::SocketAddress& local_address,
-                      const std::string& username,
-                      const std::string& password,
-                      const ProtocolAddress& server_address) {
-    CreateTurnPortWithAllParams(MakeNetwork(local_address), username, password,
-                                server_address, std::string());
-  }
-
-  // Should be identical to CreateTurnPort but specifies an origin value
-  // when creating the instance of TurnPort.
-  void CreateTurnPortWithOrigin(const rtc::SocketAddress& local_address,
-                                const std::string& username,
-                                const std::string& password,
-                                const ProtocolAddress& server_address,
-                                const std::string& origin) {
-    CreateTurnPortWithAllParams(MakeNetwork(local_address), username, password,
-                                server_address, origin);
-  }
-
-  void CreateTurnPortWithNetwork(rtc::Network* network,
-                                 const std::string& username,
-                                 const std::string& password,
-                                 const ProtocolAddress& server_address) {
-    CreateTurnPortWithAllParams(network, username, password, server_address,
-                                std::string());
-  }
-
-  // Version of CreateTurnPort that takes all possible parameters; all other
-  // helper methods call this, such that "SetIceRole" and "ConnectSignals" (and
-  // possibly other things in the future) only happen in one place.
-  void CreateTurnPortWithAllParams(rtc::Network* network,
-                                   const std::string& username,
-                                   const std::string& password,
-                                   const ProtocolAddress& server_address,
-                                   const std::string& origin) {
-    RelayCredentials credentials(username, password);
-    turn_port_.reset(TurnPort::Create(
-        &main_, &socket_factory_, network, 0, 0, kIceUfrag1, kIcePwd1,
-        server_address, credentials, 0, origin, std::vector<std::string>(),
-        std::vector<std::string>()));
-    // This TURN port will be the controlling.
-    turn_port_->SetIceRole(ICEROLE_CONTROLLING);
-    ConnectSignals();
-
-    if (server_address.proto == cricket::PROTO_TLS) {
-      // The test TURN server has a self-signed certificate so will not pass
-      // the normal client validation. Instruct the client to ignore certificate
-      // errors for testing only.
-      turn_port_->SetTlsCertPolicy(
-          TlsCertPolicy::TLS_CERT_POLICY_INSECURE_NO_CHECK);
-    }
-  }
-
-  void CreateSharedTurnPort(const std::string& username,
-                            const std::string& password,
-                            const ProtocolAddress& server_address) {
-    RTC_CHECK(server_address.proto == PROTO_UDP);
-
-    if (!socket_) {
-      socket_.reset(socket_factory_.CreateUdpSocket(
-          rtc::SocketAddress(kLocalAddr1.ipaddr(), 0), 0, 0));
-      ASSERT_TRUE(socket_ != NULL);
-      socket_->SignalReadPacket.connect(
-          this, &TurnPortTest::OnSocketReadPacket);
-    }
-
-    RelayCredentials credentials(username, password);
-    turn_port_.reset(TurnPort::Create(
-        &main_, &socket_factory_, MakeNetwork(kLocalAddr1), socket_.get(),
-        kIceUfrag1, kIcePwd1, server_address, credentials, 0, std::string()));
-    // This TURN port will be the controlling.
-    turn_port_->SetIceRole(ICEROLE_CONTROLLING);
-    ConnectSignals();
-  }
-
-  void ConnectSignals() {
-    turn_port_->SignalPortComplete.connect(this,
-        &TurnPortTest::OnTurnPortComplete);
-    turn_port_->SignalPortError.connect(this,
-        &TurnPortTest::OnTurnPortError);
-    turn_port_->SignalUnknownAddress.connect(this,
-        &TurnPortTest::OnTurnUnknownAddress);
-    turn_port_->SignalCreatePermissionResult.connect(this,
-        &TurnPortTest::OnTurnCreatePermissionResult);
-    turn_port_->SignalTurnRefreshResult.connect(
-        this, &TurnPortTest::OnTurnRefreshResult);
-  }
-
-  void CreateUdpPort() { CreateUdpPort(kLocalAddr2); }
-
-  void CreateUdpPort(const SocketAddress& address) {
-    udp_port_.reset(UDPPort::Create(&main_, &socket_factory_,
-                                    MakeNetwork(address), 0, 0, kIceUfrag2,
-                                    kIcePwd2, std::string(), false));
-    // UDP port will be controlled.
-    udp_port_->SetIceRole(ICEROLE_CONTROLLED);
-    udp_port_->SignalPortComplete.connect(
-        this, &TurnPortTest::OnUdpPortComplete);
-  }
-
-  void PrepareTurnAndUdpPorts(ProtocolType protocol_type) {
-    // turn_port_ should have been created.
-    ASSERT_TRUE(turn_port_ != nullptr);
-    turn_port_->PrepareAddress();
-    ASSERT_TRUE_SIMULATED_WAIT(
-        turn_ready_, TimeToGetTurnCandidate(protocol_type), fake_clock_);
-
-    CreateUdpPort();
-    udp_port_->PrepareAddress();
-    ASSERT_TRUE_SIMULATED_WAIT(udp_ready_, kSimulatedRtt, fake_clock_);
-  }
-
-  // Returns the fake clock time to establish a connection over the given
-  // protocol.
-  int TimeToConnect(ProtocolType protocol_type) {
-    switch (protocol_type) {
-      case PROTO_TCP:
-        // The virtual socket server will delay by a fixed half a round trip
-        // for a TCP connection.
-        return kSimulatedRtt / 2;
-      case PROTO_TLS:
-        // TLS operates over TCP and additionally has a round of HELLO for
-        // negotiating ciphers and a round for exchanging certificates.
-        return 2 * kSimulatedRtt + TimeToConnect(PROTO_TCP);
-      case PROTO_UDP:
-      default:
-        // UDP requires no round trips to set up the connection.
-        return 0;
-    }
-  }
-
-  // Returns the total fake clock time to establish a connection with a TURN
-  // server over the given protocol and to allocate a TURN candidate.
-  int TimeToGetTurnCandidate(ProtocolType protocol_type) {
-    // For a simple allocation, the first Allocate message will return with an
-    // error asking for credentials and will succeed after the second Allocate
-    // message.
-    return 2 * kSimulatedRtt + TimeToConnect(protocol_type);
-  }
-
-  // Total fake clock time to do the following:
-  // 1. Connect to primary TURN server
-  // 2. Send Allocate and receive a redirect from the primary TURN server
-  // 3. Connect to alternate TURN server
-  // 4. Send Allocate and receive a request for credentials
-  // 5. Send Allocate with credentials and receive allocation
-  int TimeToGetAlternateTurnCandidate(ProtocolType protocol_type) {
-    return 3 * kSimulatedRtt + 2 * TimeToConnect(protocol_type);
-  }
-
-  bool CheckConnectionFailedAndPruned(Connection* conn) {
-    return conn && !conn->active() &&
-           conn->state() == IceCandidatePairState::FAILED;
-  }
-
-  // Checks that |turn_port_| has a nonempty set of connections and they are all
-  // failed and pruned.
-  bool CheckAllConnectionsFailedAndPruned() {
-    auto& connections = turn_port_->connections();
-    if (connections.empty()) {
-      return false;
-    }
-    for (auto kv : connections) {
-      if (!CheckConnectionFailedAndPruned(kv.second)) {
-        return false;
-      }
-    }
-    return true;
-  }
-
-  void TestReconstructedServerUrl(ProtocolType protocol_type,
-                                  const char* expected_url) {
-    turn_port_->PrepareAddress();
-    ASSERT_TRUE_SIMULATED_WAIT(
-        turn_ready_, TimeToGetTurnCandidate(protocol_type), fake_clock_);
-    ASSERT_EQ(1U, turn_port_->Candidates().size());
-    EXPECT_EQ(turn_port_->Candidates()[0].url(), expected_url);
-  }
-
-  void TestTurnAlternateServer(ProtocolType protocol_type) {
-    std::vector<rtc::SocketAddress> redirect_addresses;
-    redirect_addresses.push_back(kTurnAlternateIntAddr);
-
-    TestTurnRedirector redirector(redirect_addresses);
-
-    turn_server_.AddInternalSocket(kTurnIntAddr, protocol_type);
-    turn_server_.AddInternalSocket(kTurnAlternateIntAddr, protocol_type);
-    turn_server_.set_redirect_hook(&redirector);
-    CreateTurnPort(kTurnUsername, kTurnPassword,
-                   ProtocolAddress(kTurnIntAddr, protocol_type));
-
-    // Retrieve the address before we run the state machine.
-    const SocketAddress old_addr = turn_port_->server_address().address;
-
-    turn_port_->PrepareAddress();
-    EXPECT_TRUE_SIMULATED_WAIT(turn_ready_,
-                               TimeToGetAlternateTurnCandidate(protocol_type),
-                               fake_clock_);
-    // Retrieve the address again, the turn port's address should be
-    // changed.
-    const SocketAddress new_addr = turn_port_->server_address().address;
-    EXPECT_NE(old_addr, new_addr);
-    ASSERT_EQ(1U, turn_port_->Candidates().size());
-    EXPECT_EQ(kTurnUdpExtAddr.ipaddr(),
-              turn_port_->Candidates()[0].address().ipaddr());
-    EXPECT_NE(0, turn_port_->Candidates()[0].address().port());
-  }
-
-  void TestTurnAlternateServerV4toV6(ProtocolType protocol_type) {
-    std::vector<rtc::SocketAddress> redirect_addresses;
-    redirect_addresses.push_back(kTurnIPv6IntAddr);
-
-    TestTurnRedirector redirector(redirect_addresses);
-    turn_server_.AddInternalSocket(kTurnIntAddr, protocol_type);
-    turn_server_.set_redirect_hook(&redirector);
-    CreateTurnPort(kTurnUsername, kTurnPassword,
-                   ProtocolAddress(kTurnIntAddr, protocol_type));
-    turn_port_->PrepareAddress();
-    // Need time to connect to TURN server, send Allocate request and receive
-    // redirect notice.
-    EXPECT_TRUE_SIMULATED_WAIT(
-        turn_error_, kSimulatedRtt + TimeToConnect(protocol_type), fake_clock_);
-  }
-
-  void TestTurnAlternateServerPingPong(ProtocolType protocol_type) {
-    std::vector<rtc::SocketAddress> redirect_addresses;
-    redirect_addresses.push_back(kTurnAlternateIntAddr);
-    redirect_addresses.push_back(kTurnIntAddr);
-
-    TestTurnRedirector redirector(redirect_addresses);
-
-    turn_server_.AddInternalSocket(kTurnIntAddr, protocol_type);
-    turn_server_.AddInternalSocket(kTurnAlternateIntAddr, protocol_type);
-    turn_server_.set_redirect_hook(&redirector);
-    CreateTurnPort(kTurnUsername, kTurnPassword,
-                   ProtocolAddress(kTurnIntAddr, protocol_type));
-
-    turn_port_->PrepareAddress();
-    EXPECT_TRUE_SIMULATED_WAIT(turn_error_,
-                               TimeToGetAlternateTurnCandidate(protocol_type),
-                               fake_clock_);
-    ASSERT_EQ(0U, turn_port_->Candidates().size());
-    rtc::SocketAddress address;
-    // Verify that we have exhausted all alternate servers instead of
-    // failure caused by other errors.
-    EXPECT_FALSE(redirector.ShouldRedirect(address, &address));
-  }
-
-  void TestTurnAlternateServerDetectRepetition(ProtocolType protocol_type) {
-    std::vector<rtc::SocketAddress> redirect_addresses;
-    redirect_addresses.push_back(kTurnAlternateIntAddr);
-    redirect_addresses.push_back(kTurnAlternateIntAddr);
-
-    TestTurnRedirector redirector(redirect_addresses);
-
-    turn_server_.AddInternalSocket(kTurnIntAddr, protocol_type);
-    turn_server_.AddInternalSocket(kTurnAlternateIntAddr, protocol_type);
-    turn_server_.set_redirect_hook(&redirector);
-    CreateTurnPort(kTurnUsername, kTurnPassword,
-                   ProtocolAddress(kTurnIntAddr, protocol_type));
-
-    turn_port_->PrepareAddress();
-    EXPECT_TRUE_SIMULATED_WAIT(turn_error_,
-                               TimeToGetAlternateTurnCandidate(protocol_type),
-                               fake_clock_);
-    ASSERT_EQ(0U, turn_port_->Candidates().size());
-  }
-
-  // A certain security exploit works by redirecting to a loopback address,
-  // which doesn't ever actually make sense. So redirects to loopback should
-  // be treated as errors.
-  // See: https://bugs.chromium.org/p/chromium/issues/detail?id=649118
-  void TestTurnAlternateServerLoopback(ProtocolType protocol_type, bool ipv6) {
-    const SocketAddress& local_address = ipv6 ? kLocalIPv6Addr : kLocalAddr1;
-    const SocketAddress& server_address =
-        ipv6 ? kTurnIPv6IntAddr : kTurnIntAddr;
-
-    std::vector<rtc::SocketAddress> redirect_addresses;
-    // Pick an unusual address in the 127.0.0.0/8 range to make sure more than
-    // 127.0.0.1 is covered.
-    SocketAddress loopback_address(ipv6 ? "::1" : "127.1.2.3",
-                                   TURN_SERVER_PORT);
-    redirect_addresses.push_back(loopback_address);
-
-    // Make a socket and bind it to the local port, to make extra sure no
-    // packet is sent to this address.
-    std::unique_ptr<rtc::Socket> loopback_socket(ss_->CreateSocket(
-        protocol_type == PROTO_UDP ? SOCK_DGRAM : SOCK_STREAM));
-    ASSERT_NE(nullptr, loopback_socket.get());
-    ASSERT_EQ(0, loopback_socket->Bind(loopback_address));
-    if (protocol_type == PROTO_TCP) {
-      ASSERT_EQ(0, loopback_socket->Listen(1));
-    }
-
-    TestTurnRedirector redirector(redirect_addresses);
-
-    turn_server_.AddInternalSocket(server_address, protocol_type);
-    turn_server_.set_redirect_hook(&redirector);
-    CreateTurnPort(local_address, kTurnUsername, kTurnPassword,
-                   ProtocolAddress(server_address, protocol_type));
-
-    turn_port_->PrepareAddress();
-    EXPECT_TRUE_SIMULATED_WAIT(
-        turn_error_, TimeToGetTurnCandidate(protocol_type), fake_clock_);
-
-    // Wait for some extra time, and make sure no packets were received on the
-    // loopback port we created (or in the case of TCP, no connection attempt
-    // occurred).
-    SIMULATED_WAIT(false, kSimulatedRtt, fake_clock_);
-    if (protocol_type == PROTO_UDP) {
-      char buf[1];
-      EXPECT_EQ(-1, loopback_socket->Recv(&buf, 1, nullptr));
-    } else {
-      std::unique_ptr<rtc::Socket> accepted_socket(
-          loopback_socket->Accept(nullptr));
-      EXPECT_EQ(nullptr, accepted_socket.get());
-    }
-  }
-
-  void TestTurnConnection(ProtocolType protocol_type) {
-    // Create ports and prepare addresses.
-    PrepareTurnAndUdpPorts(protocol_type);
-
-    // Send ping from UDP to TURN.
-    ASSERT_GE(turn_port_->Candidates().size(), 1U);
-    Connection* conn1 = udp_port_->CreateConnection(
-                    turn_port_->Candidates()[0], Port::ORIGIN_MESSAGE);
-    ASSERT_TRUE(conn1 != NULL);
-    conn1->Ping(0);
-    SIMULATED_WAIT(!turn_unknown_address_, kSimulatedRtt * 2, fake_clock_);
-    EXPECT_FALSE(turn_unknown_address_);
-    EXPECT_FALSE(conn1->receiving());
-    EXPECT_EQ(Connection::STATE_WRITE_INIT, conn1->write_state());
-
-    // Send ping from TURN to UDP.
-    Connection* conn2 = turn_port_->CreateConnection(
-                    udp_port_->Candidates()[0], Port::ORIGIN_MESSAGE);
-    ASSERT_TRUE(conn2 != NULL);
-    ASSERT_TRUE_SIMULATED_WAIT(turn_create_permission_success_, kSimulatedRtt,
-                               fake_clock_);
-    conn2->Ping(0);
-
-    // Two hops from TURN port to UDP port through TURN server, thus two RTTs.
-    EXPECT_EQ_SIMULATED_WAIT(Connection::STATE_WRITABLE, conn2->write_state(),
-                             kSimulatedRtt * 2, fake_clock_);
-    EXPECT_TRUE(conn1->receiving());
-    EXPECT_TRUE(conn2->receiving());
-    EXPECT_EQ(Connection::STATE_WRITE_INIT, conn1->write_state());
-
-    // Send another ping from UDP to TURN.
-    conn1->Ping(0);
-    EXPECT_EQ_SIMULATED_WAIT(Connection::STATE_WRITABLE, conn1->write_state(),
-                             kSimulatedRtt * 2, fake_clock_);
-    EXPECT_TRUE(conn2->receiving());
-  }
-
-  void TestDestroyTurnConnection() {
-    PrepareTurnAndUdpPorts(PROTO_UDP);
-
-    // Create connections on both ends.
-    Connection* conn1 = udp_port_->CreateConnection(turn_port_->Candidates()[0],
-                                                    Port::ORIGIN_MESSAGE);
-    Connection* conn2 = turn_port_->CreateConnection(udp_port_->Candidates()[0],
-                                                     Port::ORIGIN_MESSAGE);
-    ASSERT_TRUE(conn2 != NULL);
-    ASSERT_TRUE_SIMULATED_WAIT(turn_create_permission_success_, kSimulatedRtt,
-                               fake_clock_);
-    // Make sure turn connection can receive.
-    conn1->Ping(0);
-    EXPECT_EQ_SIMULATED_WAIT(Connection::STATE_WRITABLE, conn1->write_state(),
-                             kSimulatedRtt * 2, fake_clock_);
-    EXPECT_FALSE(turn_unknown_address_);
-
-    // Destroy the connection on the TURN port. The TurnEntry still exists, so
-    // the TURN port should still process a ping from an unknown address.
-    conn2->Destroy();
-    conn1->Ping(0);
-    EXPECT_TRUE_SIMULATED_WAIT(turn_unknown_address_, kSimulatedRtt,
-                               fake_clock_);
-
-    // Flush all requests in the invoker to destroy the TurnEntry.
-    // Expect that it still processes an incoming ping and signals the
-    // unknown address.
-    turn_unknown_address_ = false;
-    turn_port_->invoker()->Flush(rtc::Thread::Current());
-    conn1->Ping(0);
-    EXPECT_TRUE_SIMULATED_WAIT(turn_unknown_address_, kSimulatedRtt,
-                               fake_clock_);
-
-    // If the connection is created again, it will start to receive pings.
-    conn2 = turn_port_->CreateConnection(udp_port_->Candidates()[0],
-                                         Port::ORIGIN_MESSAGE);
-    conn1->Ping(0);
-    EXPECT_TRUE_SIMULATED_WAIT(conn2->receiving(), kSimulatedRtt, fake_clock_);
-  }
-
-  void TestTurnSendData(ProtocolType protocol_type) {
-    PrepareTurnAndUdpPorts(protocol_type);
-
-    // Create connections and send pings.
-    Connection* conn1 = turn_port_->CreateConnection(
-        udp_port_->Candidates()[0], Port::ORIGIN_MESSAGE);
-    Connection* conn2 = udp_port_->CreateConnection(
-        turn_port_->Candidates()[0], Port::ORIGIN_MESSAGE);
-    ASSERT_TRUE(conn1 != NULL);
-    ASSERT_TRUE(conn2 != NULL);
-    conn1->SignalReadPacket.connect(static_cast<TurnPortTest*>(this),
-                                    &TurnPortTest::OnTurnReadPacket);
-    conn2->SignalReadPacket.connect(static_cast<TurnPortTest*>(this),
-                                    &TurnPortTest::OnUdpReadPacket);
-    conn1->Ping(0);
-    EXPECT_EQ_SIMULATED_WAIT(Connection::STATE_WRITABLE, conn1->write_state(),
-                             kSimulatedRtt * 2, fake_clock_);
-    conn2->Ping(0);
-    EXPECT_EQ_SIMULATED_WAIT(Connection::STATE_WRITABLE, conn2->write_state(),
-                             kSimulatedRtt * 2, fake_clock_);
-
-    // Send some data.
-    size_t num_packets = 256;
-    for (size_t i = 0; i < num_packets; ++i) {
-      unsigned char buf[256] = { 0 };
-      for (size_t j = 0; j < i + 1; ++j) {
-        buf[j] = 0xFF - static_cast<unsigned char>(j);
-      }
-      conn1->Send(buf, i + 1, options);
-      conn2->Send(buf, i + 1, options);
-      SIMULATED_WAIT(false, kSimulatedRtt, fake_clock_);
-    }
-
-    // Check the data.
-    ASSERT_EQ(num_packets, turn_packets_.size());
-    ASSERT_EQ(num_packets, udp_packets_.size());
-    for (size_t i = 0; i < num_packets; ++i) {
-      EXPECT_EQ(i + 1, turn_packets_[i].size());
-      EXPECT_EQ(i + 1, udp_packets_[i].size());
-      EXPECT_EQ(turn_packets_[i], udp_packets_[i]);
-    }
-  }
-
-  // Test that a TURN allocation is released when the port is closed.
-  void TestTurnReleaseAllocation(ProtocolType protocol_type) {
-    PrepareTurnAndUdpPorts(protocol_type);
-    turn_port_.reset();
-    EXPECT_EQ_SIMULATED_WAIT(0U, turn_server_.server()->allocations().size(),
-                             kSimulatedRtt, fake_clock_);
-  }
-
- protected:
-  rtc::ScopedFakeClock fake_clock_;
-  // When a "create port" helper method is called with an IP, we create a
-  // Network with that IP and add it to this list. Using a list instead of a
-  // vector so that when it grows, pointers aren't invalidated.
-  std::list<rtc::Network> networks_;
-  std::unique_ptr<TurnPortTestVirtualSocketServer> ss_;
-  rtc::AutoSocketServerThread main_;
-  rtc::BasicPacketSocketFactory socket_factory_;
-  std::unique_ptr<rtc::AsyncPacketSocket> socket_;
-  TestTurnServer turn_server_;
-  std::unique_ptr<TurnPort> turn_port_;
-  std::unique_ptr<UDPPort> udp_port_;
-  bool turn_ready_;
-  bool turn_error_;
-  bool turn_unknown_address_;
-  bool turn_create_permission_success_;
-  bool udp_ready_;
-  bool test_finish_;
-  bool turn_refresh_success_ = false;
-  std::vector<rtc::Buffer> turn_packets_;
-  std::vector<rtc::Buffer> udp_packets_;
-  rtc::PacketOptions options;
-};
-
-TEST_F(TurnPortTest, TestTurnPortType) {
-  CreateTurnPort(kTurnUsername, kTurnPassword, kTurnUdpProtoAddr);
-  EXPECT_EQ(cricket::RELAY_PORT_TYPE, turn_port_->Type());
-}
-
-// Tests that the URL of the servers can be correctly reconstructed when
-// gathering the candidates.
-TEST_F(TurnPortTest, TestReconstructedServerUrlForUdpIPv4) {
-  CreateTurnPort(kTurnUsername, kTurnPassword, kTurnUdpProtoAddr);
-  TestReconstructedServerUrl(PROTO_UDP, "turn:99.99.99.3:3478?transport=udp");
-}
-
-TEST_F(TurnPortTest, TestReconstructedServerUrlForUdpIPv6) {
-  turn_server_.AddInternalSocket(kTurnUdpIPv6IntAddr, PROTO_UDP);
-  CreateTurnPort(kLocalIPv6Addr, kTurnUsername, kTurnPassword,
-                 kTurnUdpIPv6ProtoAddr);
-  TestReconstructedServerUrl(
-      PROTO_UDP,
-      "turn:2400:4030:1:2c00:be30:abcd:efab:cdef:3478?transport=udp");
-}
-
-TEST_F(TurnPortTest, TestReconstructedServerUrlForTcp) {
-  turn_server_.AddInternalSocket(kTurnTcpIntAddr, PROTO_TCP);
-  CreateTurnPort(kTurnUsername, kTurnPassword, kTurnTcpProtoAddr);
-  TestReconstructedServerUrl(PROTO_TCP, "turn:99.99.99.4:3478?transport=tcp");
-}
-
-TEST_F(TurnPortTest, TestReconstructedServerUrlForTls) {
-  turn_server_.AddInternalSocket(kTurnTcpIntAddr, PROTO_TLS);
-  CreateTurnPort(kTurnUsername, kTurnPassword, kTurnTlsProtoAddr);
-  TestReconstructedServerUrl(PROTO_TLS, "turns:99.99.99.4:3478?transport=tcp");
-}
-
-// Do a normal TURN allocation.
-TEST_F(TurnPortTest, TestTurnAllocate) {
-  CreateTurnPort(kTurnUsername, kTurnPassword, kTurnUdpProtoAddr);
-  EXPECT_EQ(0, turn_port_->SetOption(rtc::Socket::OPT_SNDBUF, 10*1024));
-  turn_port_->PrepareAddress();
-  EXPECT_TRUE_SIMULATED_WAIT(turn_ready_, kSimulatedRtt * 2, fake_clock_);
-  ASSERT_EQ(1U, turn_port_->Candidates().size());
-  EXPECT_EQ(kTurnUdpExtAddr.ipaddr(),
-            turn_port_->Candidates()[0].address().ipaddr());
-  EXPECT_NE(0, turn_port_->Candidates()[0].address().port());
-}
-
-// Testing a normal UDP allocation using TCP connection.
-TEST_F(TurnPortTest, TestTurnTcpAllocate) {
-  turn_server_.AddInternalSocket(kTurnTcpIntAddr, PROTO_TCP);
-  CreateTurnPort(kTurnUsername, kTurnPassword, kTurnTcpProtoAddr);
-  EXPECT_EQ(0, turn_port_->SetOption(rtc::Socket::OPT_SNDBUF, 10*1024));
-  turn_port_->PrepareAddress();
-  EXPECT_TRUE_SIMULATED_WAIT(turn_ready_, kSimulatedRtt * 3, fake_clock_);
-  ASSERT_EQ(1U, turn_port_->Candidates().size());
-  EXPECT_EQ(kTurnUdpExtAddr.ipaddr(),
-            turn_port_->Candidates()[0].address().ipaddr());
-  EXPECT_NE(0, turn_port_->Candidates()[0].address().port());
-}
-
-// Test case for WebRTC issue 3927 where a proxy binds to the local host address
-// instead the address that TurnPort originally bound to. The candidate pair
-// impacted by this behavior should still be used.
-TEST_F(TurnPortTest, TestTurnTcpAllocationWhenProxyChangesAddressToLocalHost) {
-  SocketAddress local_address("127.0.0.1", 0);
-  // After calling this, when TurnPort attempts to get a socket bound to
-  // kLocalAddr, it will end up using localhost instead.
-  ss_->SetAlternativeLocalAddress(kLocalAddr1.ipaddr(), local_address.ipaddr());
-
-  turn_server_.AddInternalSocket(kTurnTcpIntAddr, PROTO_TCP);
-  CreateTurnPort(kLocalAddr1, kTurnUsername, kTurnPassword, kTurnTcpProtoAddr);
-  EXPECT_EQ(0, turn_port_->SetOption(rtc::Socket::OPT_SNDBUF, 10 * 1024));
-  turn_port_->PrepareAddress();
-  EXPECT_TRUE_SIMULATED_WAIT(turn_ready_, kSimulatedRtt * 3, fake_clock_);
-  ASSERT_EQ(1U, turn_port_->Candidates().size());
-  EXPECT_EQ(kTurnUdpExtAddr.ipaddr(),
-            turn_port_->Candidates()[0].address().ipaddr());
-  EXPECT_NE(0, turn_port_->Candidates()[0].address().port());
-
-  // Verify that the socket actually used localhost, otherwise this test isn't
-  // doing what it meant to.
-  ASSERT_EQ(local_address.ipaddr(),
-            turn_port_->Candidates()[0].related_address().ipaddr());
-}
-
-// If the address the socket ends up bound to does not match any address of the
-// TurnPort's Network, then the socket should be discarded and no candidates
-// should be signaled. In the context of ICE, where one TurnPort is created for
-// each Network, when this happens it's likely that the unexpected address is
-// associated with some other Network, which another TurnPort is already
-// covering.
-TEST_F(TurnPortTest,
-       TurnTcpAllocationDiscardedIfBoundAddressDoesNotMatchNetwork) {
-  // Sockets bound to kLocalAddr1 will actually end up with kLocalAddr2.
-  ss_->SetAlternativeLocalAddress(kLocalAddr1.ipaddr(), kLocalAddr2.ipaddr());
-
-  // Set up TURN server to use TCP (this logic only exists for TCP).
-  turn_server_.AddInternalSocket(kTurnTcpIntAddr, PROTO_TCP);
-
-  // Create TURN port and tell it to start allocation.
-  CreateTurnPort(kLocalAddr1, kTurnUsername, kTurnPassword, kTurnTcpProtoAddr);
-  turn_port_->PrepareAddress();
-
-  // Shouldn't take more than 1 RTT to realize the bound address isn't the one
-  // expected.
-  EXPECT_TRUE_SIMULATED_WAIT(turn_error_, kSimulatedRtt, fake_clock_);
-}
-
-// A caveat for the above logic: if the socket ends up bound to one of the IPs
-// associated with the Network, just not the "best" one, this is ok.
-TEST_F(TurnPortTest, TurnTcpAllocationNotDiscardedIfNotBoundToBestIP) {
-  // Sockets bound to kLocalAddr1 will actually end up with kLocalAddr2.
-  ss_->SetAlternativeLocalAddress(kLocalAddr1.ipaddr(), kLocalAddr2.ipaddr());
-
-  // Set up a network with kLocalAddr1 as the "best" IP, and kLocalAddr2 as an
-  // alternate.
-  rtc::Network* network = MakeNetwork(kLocalAddr1);
-  network->AddIP(kLocalAddr2.ipaddr());
-  ASSERT_EQ(kLocalAddr1.ipaddr(), network->GetBestIP());
-
-  // Set up TURN server to use TCP (this logic only exists for TCP).
-  turn_server_.AddInternalSocket(kTurnTcpIntAddr, PROTO_TCP);
-
-  // Create TURN port using our special Network, and tell it to start
-  // allocation.
-  CreateTurnPortWithNetwork(network, kTurnUsername, kTurnPassword,
-                            kTurnTcpProtoAddr);
-  turn_port_->PrepareAddress();
-
-  // Candidate should be gathered as normally.
-  EXPECT_TRUE_SIMULATED_WAIT(turn_ready_, kSimulatedRtt * 3, fake_clock_);
-  ASSERT_EQ(1U, turn_port_->Candidates().size());
-
-  // Verify that the socket actually used the alternate address, otherwise this
-  // test isn't doing what it meant to.
-  ASSERT_EQ(kLocalAddr2.ipaddr(),
-            turn_port_->Candidates()[0].related_address().ipaddr());
-}
-
-// Testing turn port will attempt to create TCP socket on address resolution
-// failure.
-TEST_F(TurnPortTest, TestTurnTcpOnAddressResolveFailure) {
-  turn_server_.AddInternalSocket(kTurnTcpIntAddr, PROTO_TCP);
-  CreateTurnPort(kTurnUsername, kTurnPassword,
-                 ProtocolAddress(rtc::SocketAddress("www.google.invalid", 3478),
-                                 PROTO_TCP));
-  turn_port_->PrepareAddress();
-  EXPECT_TRUE_WAIT(turn_error_, kResolverTimeout);
-  // As VSS doesn't provide a DNS resolution, name resolve will fail. TurnPort
-  // will proceed in creating a TCP socket which will fail as there is no
-  // server on the above domain and error will be set to SOCKET_ERROR.
-  EXPECT_EQ(SOCKET_ERROR, turn_port_->error());
-}
-
-// Testing turn port will attempt to create TLS socket on address resolution
-// failure.
-TEST_F(TurnPortTest, TestTurnTlsOnAddressResolveFailure) {
-  turn_server_.AddInternalSocket(kTurnTcpIntAddr, PROTO_TLS);
-  CreateTurnPort(kTurnUsername, kTurnPassword,
-                 ProtocolAddress(rtc::SocketAddress("www.google.invalid", 3478),
-                                 PROTO_TLS));
-  turn_port_->PrepareAddress();
-  EXPECT_TRUE_WAIT(turn_error_, kResolverTimeout);
-  EXPECT_EQ(SOCKET_ERROR, turn_port_->error());
-}
-
-// In case of UDP on address resolve failure, TurnPort will not create socket
-// and return allocate failure.
-TEST_F(TurnPortTest, TestTurnUdpOnAddressResolveFailure) {
-  CreateTurnPort(kTurnUsername, kTurnPassword,
-                 ProtocolAddress(rtc::SocketAddress("www.google.invalid", 3478),
-                                 PROTO_UDP));
-  turn_port_->PrepareAddress();
-  EXPECT_TRUE_WAIT(turn_error_, kResolverTimeout);
-  // Error from turn port will not be socket error.
-  EXPECT_NE(SOCKET_ERROR, turn_port_->error());
-}
-
-// Try to do a TURN allocation with an invalid password.
-TEST_F(TurnPortTest, TestTurnAllocateBadPassword) {
-  CreateTurnPort(kTurnUsername, "bad", kTurnUdpProtoAddr);
-  turn_port_->PrepareAddress();
-  EXPECT_TRUE_SIMULATED_WAIT(turn_error_, kSimulatedRtt * 2, fake_clock_);
-  ASSERT_EQ(0U, turn_port_->Candidates().size());
-}
-
-// Tests that TURN port nonce will be reset when receiving an ALLOCATE MISMATCH
-// error.
-TEST_F(TurnPortTest, TestTurnAllocateNonceResetAfterAllocateMismatch) {
-  // Do a normal allocation first.
-  CreateTurnPort(kTurnUsername, kTurnPassword, kTurnUdpProtoAddr);
-  turn_port_->PrepareAddress();
-  EXPECT_TRUE_SIMULATED_WAIT(turn_ready_, kSimulatedRtt * 2, fake_clock_);
-  rtc::SocketAddress first_addr(turn_port_->socket()->GetLocalAddress());
-  // Destroy the turnport while keeping the drop probability to 1 to
-  // suppress the release of the allocation at the server.
-  ss_->set_drop_probability(1.0);
-  turn_port_.reset();
-  SIMULATED_WAIT(false, kSimulatedRtt, fake_clock_);
-  ss_->set_drop_probability(0.0);
-
-  // Force the socket server to assign the same port.
-  ss_->SetNextPortForTesting(first_addr.port());
-  turn_ready_ = false;
-  CreateTurnPort(kTurnUsername, kTurnPassword, kTurnUdpProtoAddr);
-
-  // It is expected that the turn port will first get a nonce from the server
-  // using timestamp |ts_before| but then get an allocate mismatch error and
-  // receive an even newer nonce based on the system clock. |ts_before| is
-  // chosen so that the two NONCEs generated by the server will be different.
-  int64_t ts_before = rtc::TimeMillis() - 1;
-  std::string first_nonce =
-      turn_server_.server()->SetTimestampForNextNonce(ts_before);
-  turn_port_->PrepareAddress();
-
-  // Four round trips; first we'll get "stale nonce", then
-  // "allocate mismatch", then "stale nonce" again, then finally it will
-  // succeed.
-  EXPECT_TRUE_SIMULATED_WAIT(turn_ready_, kSimulatedRtt * 4, fake_clock_);
-  EXPECT_NE(first_nonce, turn_port_->nonce());
-}
-
-// Tests that a new local address is created after
-// STUN_ERROR_ALLOCATION_MISMATCH.
-TEST_F(TurnPortTest, TestTurnAllocateMismatch) {
-  // Do a normal allocation first.
-  CreateTurnPort(kTurnUsername, kTurnPassword, kTurnUdpProtoAddr);
-  turn_port_->PrepareAddress();
-  EXPECT_TRUE_SIMULATED_WAIT(turn_ready_, kSimulatedRtt * 2, fake_clock_);
-  rtc::SocketAddress first_addr(turn_port_->socket()->GetLocalAddress());
-
-  // Clear connected_ flag on turnport to suppress the release of
-  // the allocation.
-  turn_port_->OnSocketClose(turn_port_->socket(), 0);
-
-  // Forces the socket server to assign the same port.
-  ss_->SetNextPortForTesting(first_addr.port());
-
-  turn_ready_ = false;
-  CreateTurnPort(kTurnUsername, kTurnPassword, kTurnUdpProtoAddr);
-  turn_port_->PrepareAddress();
-
-  // Verifies that the new port has the same address.
-  EXPECT_EQ(first_addr, turn_port_->socket()->GetLocalAddress());
-
-  // Four round trips; first we'll get "stale nonce", then
-  // "allocate mismatch", then "stale nonce" again, then finally it will
-  // succeed.
-  EXPECT_TRUE_SIMULATED_WAIT(turn_ready_, kSimulatedRtt * 4, fake_clock_);
-
-  // Verifies that the new port has a different address now.
-  EXPECT_NE(first_addr, turn_port_->socket()->GetLocalAddress());
-
-  // Verify that all packets received from the shared socket are ignored.
-  std::string test_packet = "Test packet";
-  EXPECT_FALSE(turn_port_->HandleIncomingPacket(
-      socket_.get(), test_packet.data(), test_packet.size(),
-      rtc::SocketAddress(kTurnUdpExtAddr.ipaddr(), 0),
-      rtc::CreatePacketTime(0)));
-}
-
-// Tests that a shared-socket-TurnPort creates its own socket after
-// STUN_ERROR_ALLOCATION_MISMATCH.
-TEST_F(TurnPortTest, TestSharedSocketAllocateMismatch) {
-  // Do a normal allocation first.
-  CreateSharedTurnPort(kTurnUsername, kTurnPassword, kTurnUdpProtoAddr);
-  turn_port_->PrepareAddress();
-  EXPECT_TRUE_SIMULATED_WAIT(turn_ready_, kSimulatedRtt * 2, fake_clock_);
-  rtc::SocketAddress first_addr(turn_port_->socket()->GetLocalAddress());
-
-  // Clear connected_ flag on turnport to suppress the release of
-  // the allocation.
-  turn_port_->OnSocketClose(turn_port_->socket(), 0);
-
-  turn_ready_ = false;
-  CreateSharedTurnPort(kTurnUsername, kTurnPassword, kTurnUdpProtoAddr);
-
-  // Verifies that the new port has the same address.
-  EXPECT_EQ(first_addr, turn_port_->socket()->GetLocalAddress());
-  EXPECT_TRUE(turn_port_->SharedSocket());
-
-  turn_port_->PrepareAddress();
-  // Extra 2 round trips due to allocate mismatch.
-  EXPECT_TRUE_SIMULATED_WAIT(turn_ready_, kSimulatedRtt * 4, fake_clock_);
-
-  // Verifies that the new port has a different address now.
-  EXPECT_NE(first_addr, turn_port_->socket()->GetLocalAddress());
-  EXPECT_FALSE(turn_port_->SharedSocket());
-}
-
-TEST_F(TurnPortTest, TestTurnTcpAllocateMismatch) {
-  turn_server_.AddInternalSocket(kTurnTcpIntAddr, PROTO_TCP);
-  CreateTurnPort(kTurnUsername, kTurnPassword, kTurnTcpProtoAddr);
-
-  // Do a normal allocation first.
-  turn_port_->PrepareAddress();
-  EXPECT_TRUE_SIMULATED_WAIT(turn_ready_, kSimulatedRtt * 3, fake_clock_);
-  rtc::SocketAddress first_addr(turn_port_->socket()->GetLocalAddress());
-
-  // Clear connected_ flag on turnport to suppress the release of
-  // the allocation.
-  turn_port_->OnSocketClose(turn_port_->socket(), 0);
-
-  // Forces the socket server to assign the same port.
-  ss_->SetNextPortForTesting(first_addr.port());
-
-  turn_ready_ = false;
-  CreateTurnPort(kTurnUsername, kTurnPassword, kTurnTcpProtoAddr);
-  turn_port_->PrepareAddress();
-
-  // Verifies that the new port has the same address.
-  EXPECT_EQ(first_addr, turn_port_->socket()->GetLocalAddress());
-
-  // Extra 2 round trips due to allocate mismatch.
-  EXPECT_TRUE_SIMULATED_WAIT(turn_ready_, kSimulatedRtt * 5, fake_clock_);
-
-  // Verifies that the new port has a different address now.
-  EXPECT_NE(first_addr, turn_port_->socket()->GetLocalAddress());
-}
-
-TEST_F(TurnPortTest, TestRefreshRequestGetsErrorResponse) {
-  CreateTurnPort(kTurnUsername, kTurnPassword, kTurnUdpProtoAddr);
-  PrepareTurnAndUdpPorts(PROTO_UDP);
-  turn_port_->CreateConnection(udp_port_->Candidates()[0],
-                               Port::ORIGIN_MESSAGE);
-  // Set bad credentials.
-  RelayCredentials bad_credentials("bad_user", "bad_pwd");
-  turn_port_->set_credentials(bad_credentials);
-  turn_refresh_success_ = false;
-  // This sends out the first RefreshRequest with correct credentials.
-  // When this succeeds, it will schedule a new RefreshRequest with the bad
-  // credential.
-  turn_port_->FlushRequests(TURN_REFRESH_REQUEST);
-  EXPECT_TRUE_SIMULATED_WAIT(turn_refresh_success_, kSimulatedRtt, fake_clock_);
-  // Flush it again, it will receive a bad response.
-  turn_port_->FlushRequests(TURN_REFRESH_REQUEST);
-  EXPECT_TRUE_SIMULATED_WAIT(!turn_refresh_success_, kSimulatedRtt,
-                             fake_clock_);
-  EXPECT_FALSE(turn_port_->connected());
-  EXPECT_TRUE(CheckAllConnectionsFailedAndPruned());
-  EXPECT_FALSE(turn_port_->HasRequests());
-}
-
-// Test that TurnPort will not handle any incoming packets once it has been
-// closed.
-TEST_F(TurnPortTest, TestStopProcessingPacketsAfterClosed) {
-  CreateTurnPort(kTurnUsername, kTurnPassword, kTurnUdpProtoAddr);
-  PrepareTurnAndUdpPorts(PROTO_UDP);
-  Connection* conn1 = turn_port_->CreateConnection(udp_port_->Candidates()[0],
-                                                   Port::ORIGIN_MESSAGE);
-  Connection* conn2 = udp_port_->CreateConnection(turn_port_->Candidates()[0],
-                                                  Port::ORIGIN_MESSAGE);
-  ASSERT_TRUE(conn1 != NULL);
-  ASSERT_TRUE(conn2 != NULL);
-  // Make sure conn2 is writable.
-  conn2->Ping(0);
-  EXPECT_EQ_SIMULATED_WAIT(Connection::STATE_WRITABLE, conn2->write_state(),
-                           kSimulatedRtt * 2, fake_clock_);
-
-  turn_port_->Close();
-  SIMULATED_WAIT(false, kSimulatedRtt, fake_clock_);
-  turn_unknown_address_ = false;
-  conn2->Ping(0);
-  SIMULATED_WAIT(false, kSimulatedRtt, fake_clock_);
-  // Since the turn port does not handle packets any more, it should not
-  // SignalUnknownAddress.
-  EXPECT_FALSE(turn_unknown_address_);
-}
-
-// Test that CreateConnection will return null if port becomes disconnected.
-TEST_F(TurnPortTest, TestCreateConnectionWhenSocketClosed) {
-  turn_server_.AddInternalSocket(kTurnTcpIntAddr, PROTO_TCP);
-  CreateTurnPort(kTurnUsername, kTurnPassword, kTurnTcpProtoAddr);
-  PrepareTurnAndUdpPorts(PROTO_TCP);
-  // Create a connection.
-  Connection* conn1 = turn_port_->CreateConnection(udp_port_->Candidates()[0],
-                                                   Port::ORIGIN_MESSAGE);
-  ASSERT_TRUE(conn1 != NULL);
-
-  // Close the socket and create a connection again.
-  turn_port_->OnSocketClose(turn_port_->socket(), 1);
-  conn1 = turn_port_->CreateConnection(udp_port_->Candidates()[0],
-                                       Port::ORIGIN_MESSAGE);
-  ASSERT_TRUE(conn1 == NULL);
-}
-
-// Tests that when a TCP socket is closed, the respective TURN connection will
-// be destroyed.
-TEST_F(TurnPortTest, TestSocketCloseWillDestroyConnection) {
-  turn_server_.AddInternalSocket(kTurnTcpIntAddr, PROTO_TCP);
-  CreateTurnPort(kTurnUsername, kTurnPassword, kTurnTcpProtoAddr);
-  PrepareTurnAndUdpPorts(PROTO_TCP);
-  Connection* conn = turn_port_->CreateConnection(udp_port_->Candidates()[0],
-                                                  Port::ORIGIN_MESSAGE);
-  EXPECT_NE(nullptr, conn);
-  EXPECT_TRUE(!turn_port_->connections().empty());
-  turn_port_->socket()->SignalClose(turn_port_->socket(), 1);
-  EXPECT_TRUE_SIMULATED_WAIT(turn_port_->connections().empty(),
-                             kConnectionDestructionDelay, fake_clock_);
-}
-
-// Test try-alternate-server feature.
-TEST_F(TurnPortTest, TestTurnAlternateServerUDP) {
-  TestTurnAlternateServer(PROTO_UDP);
-}
-
-TEST_F(TurnPortTest, TestTurnAlternateServerTCP) {
-  TestTurnAlternateServer(PROTO_TCP);
-}
-
-TEST_F(TurnPortTest, TestTurnAlternateServerTLS) {
-  TestTurnAlternateServer(PROTO_TLS);
-}
-
-// Test that we fail when we redirect to an address different from
-// current IP family.
-TEST_F(TurnPortTest, TestTurnAlternateServerV4toV6UDP) {
-  TestTurnAlternateServerV4toV6(PROTO_UDP);
-}
-
-TEST_F(TurnPortTest, TestTurnAlternateServerV4toV6TCP) {
-  TestTurnAlternateServerV4toV6(PROTO_TCP);
-}
-
-TEST_F(TurnPortTest, TestTurnAlternateServerV4toV6TLS) {
-  TestTurnAlternateServerV4toV6(PROTO_TLS);
-}
-
-// Test try-alternate-server catches the case of pingpong.
-TEST_F(TurnPortTest, TestTurnAlternateServerPingPongUDP) {
-  TestTurnAlternateServerPingPong(PROTO_UDP);
-}
-
-TEST_F(TurnPortTest, TestTurnAlternateServerPingPongTCP) {
-  TestTurnAlternateServerPingPong(PROTO_TCP);
-}
-
-TEST_F(TurnPortTest, TestTurnAlternateServerPingPongTLS) {
-  TestTurnAlternateServerPingPong(PROTO_TLS);
-}
-
-// Test try-alternate-server catch the case of repeated server.
-TEST_F(TurnPortTest, TestTurnAlternateServerDetectRepetitionUDP) {
-  TestTurnAlternateServerDetectRepetition(PROTO_UDP);
-}
-
-TEST_F(TurnPortTest, TestTurnAlternateServerDetectRepetitionTCP) {
-  TestTurnAlternateServerDetectRepetition(PROTO_TCP);
-}
-
-TEST_F(TurnPortTest, TestTurnAlternateServerDetectRepetitionTLS) {
-  TestTurnAlternateServerDetectRepetition(PROTO_TCP);
-}
-
-// Test catching the case of a redirect to loopback.
-TEST_F(TurnPortTest, TestTurnAlternateServerLoopbackUdpIpv4) {
-  TestTurnAlternateServerLoopback(PROTO_UDP, false);
-}
-
-TEST_F(TurnPortTest, TestTurnAlternateServerLoopbackUdpIpv6) {
-  TestTurnAlternateServerLoopback(PROTO_UDP, true);
-}
-
-TEST_F(TurnPortTest, TestTurnAlternateServerLoopbackTcpIpv4) {
-  TestTurnAlternateServerLoopback(PROTO_TCP, false);
-}
-
-TEST_F(TurnPortTest, TestTurnAlternateServerLoopbackTcpIpv6) {
-  TestTurnAlternateServerLoopback(PROTO_TCP, true);
-}
-
-TEST_F(TurnPortTest, TestTurnAlternateServerLoopbackTlsIpv4) {
-  TestTurnAlternateServerLoopback(PROTO_TLS, false);
-}
-
-TEST_F(TurnPortTest, TestTurnAlternateServerLoopbackTlsIpv6) {
-  TestTurnAlternateServerLoopback(PROTO_TLS, true);
-}
-
-// Do a TURN allocation and try to send a packet to it from the outside.
-// The packet should be dropped. Then, try to send a packet from TURN to the
-// outside. It should reach its destination. Finally, try again from the
-// outside. It should now work as well.
-TEST_F(TurnPortTest, TestTurnConnection) {
-  CreateTurnPort(kTurnUsername, kTurnPassword, kTurnUdpProtoAddr);
-  TestTurnConnection(PROTO_UDP);
-}
-
-// Similar to above, except that this test will use the shared socket.
-TEST_F(TurnPortTest, TestTurnConnectionUsingSharedSocket) {
-  CreateSharedTurnPort(kTurnUsername, kTurnPassword, kTurnUdpProtoAddr);
-  TestTurnConnection(PROTO_UDP);
-}
-
-// Test that we can establish a TCP connection with TURN server.
-TEST_F(TurnPortTest, TestTurnTcpConnection) {
-  turn_server_.AddInternalSocket(kTurnTcpIntAddr, PROTO_TCP);
-  CreateTurnPort(kTurnUsername, kTurnPassword, kTurnTcpProtoAddr);
-  TestTurnConnection(PROTO_TCP);
-}
-
-// Test that we can establish a TLS connection with TURN server.
-TEST_F(TurnPortTest, TestTurnTlsConnection) {
-  turn_server_.AddInternalSocket(kTurnTcpIntAddr, PROTO_TLS);
-  CreateTurnPort(kTurnUsername, kTurnPassword, kTurnTlsProtoAddr);
-  TestTurnConnection(PROTO_TLS);
-}
-
-// Test that if a connection on a TURN port is destroyed, the TURN port can
-// still receive ping on that connection as if it is from an unknown address.
-// If the connection is created again, it will be used to receive ping.
-TEST_F(TurnPortTest, TestDestroyTurnConnection) {
-  CreateTurnPort(kTurnUsername, kTurnPassword, kTurnUdpProtoAddr);
-  TestDestroyTurnConnection();
-}
-
-// Similar to above, except that this test will use the shared socket.
-TEST_F(TurnPortTest, TestDestroyTurnConnectionUsingSharedSocket) {
-  CreateSharedTurnPort(kTurnUsername, kTurnPassword, kTurnUdpProtoAddr);
-  TestDestroyTurnConnection();
-}
-
-// Run TurnConnectionTest with one-time-use nonce feature.
-// Here server will send a 438 STALE_NONCE error message for
-// every TURN transaction.
-TEST_F(TurnPortTest, TestTurnConnectionUsingOTUNonce) {
-  turn_server_.set_enable_otu_nonce(true);
-  CreateTurnPort(kTurnUsername, kTurnPassword, kTurnUdpProtoAddr);
-  TestTurnConnection(PROTO_UDP);
-}
-
-// Test that CreatePermissionRequest will be scheduled after the success
-// of the first create permission request and the request will get an
-// ErrorResponse if the ufrag and pwd are incorrect.
-TEST_F(TurnPortTest, TestRefreshCreatePermissionRequest) {
-  CreateTurnPort(kTurnUsername, kTurnPassword, kTurnUdpProtoAddr);
-  PrepareTurnAndUdpPorts(PROTO_UDP);
-
-  Connection* conn = turn_port_->CreateConnection(udp_port_->Candidates()[0],
-                                                  Port::ORIGIN_MESSAGE);
-  ASSERT_TRUE(conn != NULL);
-  EXPECT_TRUE_SIMULATED_WAIT(turn_create_permission_success_, kSimulatedRtt,
-                             fake_clock_);
-  turn_create_permission_success_ = false;
-  // A create-permission-request should be pending.
-  // After the next create-permission-response is received, it will schedule
-  // another request with bad_ufrag and bad_pwd.
-  RelayCredentials bad_credentials("bad_user", "bad_pwd");
-  turn_port_->set_credentials(bad_credentials);
-  turn_port_->FlushRequests(kAllRequests);
-  EXPECT_TRUE_SIMULATED_WAIT(turn_create_permission_success_, kSimulatedRtt,
-                             fake_clock_);
-  // Flush the requests again; the create-permission-request will fail.
-  turn_port_->FlushRequests(kAllRequests);
-  EXPECT_TRUE_SIMULATED_WAIT(!turn_create_permission_success_, kSimulatedRtt,
-                             fake_clock_);
-  EXPECT_TRUE(CheckConnectionFailedAndPruned(conn));
-}
-
-TEST_F(TurnPortTest, TestChannelBindGetErrorResponse) {
-  CreateTurnPort(kTurnUsername, kTurnPassword, kTurnUdpProtoAddr);
-  PrepareTurnAndUdpPorts(PROTO_UDP);
-  Connection* conn1 = turn_port_->CreateConnection(udp_port_->Candidates()[0],
-                                                   Port::ORIGIN_MESSAGE);
-  ASSERT_TRUE(conn1 != nullptr);
-  Connection* conn2 = udp_port_->CreateConnection(turn_port_->Candidates()[0],
-                                                  Port::ORIGIN_MESSAGE);
-
-  ASSERT_TRUE(conn2 != nullptr);
-  conn1->Ping(0);
-  EXPECT_TRUE_SIMULATED_WAIT(conn1->writable(), kSimulatedRtt * 2, fake_clock_);
-  // TODO(deadbeef): SetEntryChannelId should not be a public method.
-  // Instead we should set an option on the fake TURN server to force it to
-  // send a channel bind errors.
-  ASSERT_TRUE(
-      turn_port_->SetEntryChannelId(udp_port_->Candidates()[0].address(), -1));
-
-  std::string data = "ABC";
-  conn1->Send(data.data(), data.length(), options);
-
-  EXPECT_TRUE_SIMULATED_WAIT(CheckConnectionFailedAndPruned(conn1),
-                             kSimulatedRtt, fake_clock_);
-  // Verify that packets are allowed to be sent after a bind request error.
-  // They'll just use a send indication instead.
-  conn2->SignalReadPacket.connect(static_cast<TurnPortTest*>(this),
-                                  &TurnPortTest::OnUdpReadPacket);
-  conn1->Send(data.data(), data.length(), options);
-  EXPECT_TRUE_SIMULATED_WAIT(!udp_packets_.empty(), kSimulatedRtt, fake_clock_);
-}
-
-// Do a TURN allocation, establish a UDP connection, and send some data.
-TEST_F(TurnPortTest, TestTurnSendDataTurnUdpToUdp) {
-  // Create ports and prepare addresses.
-  CreateTurnPort(kTurnUsername, kTurnPassword, kTurnUdpProtoAddr);
-  TestTurnSendData(PROTO_UDP);
-  EXPECT_EQ(UDP_PROTOCOL_NAME, turn_port_->Candidates()[0].relay_protocol());
-}
-
-// Do a TURN allocation, establish a TCP connection, and send some data.
-TEST_F(TurnPortTest, TestTurnSendDataTurnTcpToUdp) {
-  turn_server_.AddInternalSocket(kTurnTcpIntAddr, PROTO_TCP);
-  // Create ports and prepare addresses.
-  CreateTurnPort(kTurnUsername, kTurnPassword, kTurnTcpProtoAddr);
-  TestTurnSendData(PROTO_TCP);
-  EXPECT_EQ(TCP_PROTOCOL_NAME, turn_port_->Candidates()[0].relay_protocol());
-}
-
-// Do a TURN allocation, establish a TLS connection, and send some data.
-TEST_F(TurnPortTest, TestTurnSendDataTurnTlsToUdp) {
-  turn_server_.AddInternalSocket(kTurnTcpIntAddr, PROTO_TLS);
-  CreateTurnPort(kTurnUsername, kTurnPassword, kTurnTlsProtoAddr);
-  TestTurnSendData(PROTO_TLS);
-  EXPECT_EQ(TLS_PROTOCOL_NAME, turn_port_->Candidates()[0].relay_protocol());
-}
-
-// Test TURN fails to make a connection from IPv6 address to a server which has
-// IPv4 address.
-TEST_F(TurnPortTest, TestTurnLocalIPv6AddressServerIPv4) {
-  turn_server_.AddInternalSocket(kTurnUdpIPv6IntAddr, PROTO_UDP);
-  CreateTurnPort(kLocalIPv6Addr, kTurnUsername, kTurnPassword,
-                 kTurnUdpProtoAddr);
-  turn_port_->PrepareAddress();
-  ASSERT_TRUE_SIMULATED_WAIT(turn_error_, kSimulatedRtt, fake_clock_);
-  EXPECT_TRUE(turn_port_->Candidates().empty());
-}
-
-// Test TURN make a connection from IPv6 address to a server which has
-// IPv6 intenal address. But in this test external address is a IPv4 address,
-// hence allocated address will be a IPv4 address.
-TEST_F(TurnPortTest, TestTurnLocalIPv6AddressServerIPv6ExtenalIPv4) {
-  turn_server_.AddInternalSocket(kTurnUdpIPv6IntAddr, PROTO_UDP);
-  CreateTurnPort(kLocalIPv6Addr, kTurnUsername, kTurnPassword,
-                 kTurnUdpIPv6ProtoAddr);
-  turn_port_->PrepareAddress();
-  EXPECT_TRUE_SIMULATED_WAIT(turn_ready_, kSimulatedRtt * 2, fake_clock_);
-  ASSERT_EQ(1U, turn_port_->Candidates().size());
-  EXPECT_EQ(kTurnUdpExtAddr.ipaddr(),
-            turn_port_->Candidates()[0].address().ipaddr());
-  EXPECT_NE(0, turn_port_->Candidates()[0].address().port());
-}
-
-// Tests that the local and remote candidate address families should match when
-// a connection is created. Specifically, if a TURN port has an IPv6 address,
-// its local candidate will still be an IPv4 address and it can only create
-// connections with IPv4 remote candidates.
-TEST_F(TurnPortTest, TestCandidateAddressFamilyMatch) {
-  turn_server_.AddInternalSocket(kTurnUdpIPv6IntAddr, PROTO_UDP);
-
-  CreateTurnPort(kLocalIPv6Addr, kTurnUsername, kTurnPassword,
-                 kTurnUdpIPv6ProtoAddr);
-  turn_port_->PrepareAddress();
-  EXPECT_TRUE_SIMULATED_WAIT(turn_ready_, kSimulatedRtt * 2, fake_clock_);
-  ASSERT_EQ(1U, turn_port_->Candidates().size());
-
-  // Create an IPv4 candidate. It will match the TURN candidate.
-  Candidate remote_candidate(ICE_CANDIDATE_COMPONENT_RTP, "udp", kLocalAddr2, 0,
-                             "", "", "local", 0, kCandidateFoundation);
-  remote_candidate.set_address(kLocalAddr2);
-  Connection* conn =
-      turn_port_->CreateConnection(remote_candidate, Port::ORIGIN_MESSAGE);
-  EXPECT_NE(nullptr, conn);
-
-  // Set the candidate address family to IPv6. It won't match the TURN
-  // candidate.
-  remote_candidate.set_address(kLocalIPv6Addr2);
-  conn = turn_port_->CreateConnection(remote_candidate, Port::ORIGIN_MESSAGE);
-  EXPECT_EQ(nullptr, conn);
-}
-
-TEST_F(TurnPortTest, TestOriginHeader) {
-  CreateTurnPortWithOrigin(kLocalAddr1, kTurnUsername, kTurnPassword,
-                           kTurnUdpProtoAddr, kTestOrigin);
-  turn_port_->PrepareAddress();
-  EXPECT_TRUE_SIMULATED_WAIT(turn_ready_, kSimulatedRtt * 2, fake_clock_);
-  ASSERT_GT(turn_server_.server()->allocations().size(), 0U);
-  SocketAddress local_address = turn_port_->GetLocalAddress();
-  ASSERT_TRUE(turn_server_.FindAllocation(local_address) != NULL);
-  EXPECT_EQ(kTestOrigin, turn_server_.FindAllocation(local_address)->origin());
-}
-
-// Test that a CreatePermission failure will result in the connection being
-// pruned and failed.
-TEST_F(TurnPortTest, TestConnectionFailedAndPrunedOnCreatePermissionFailure) {
-  turn_server_.AddInternalSocket(kTurnTcpIntAddr, PROTO_TCP);
-  turn_server_.server()->set_reject_private_addresses(true);
-  CreateTurnPort(kTurnUsername, kTurnPassword, kTurnTcpProtoAddr);
-  turn_port_->PrepareAddress();
-  EXPECT_TRUE_SIMULATED_WAIT(turn_ready_, kSimulatedRtt * 3, fake_clock_);
-
-  CreateUdpPort(SocketAddress("10.0.0.10", 0));
-  udp_port_->PrepareAddress();
-  EXPECT_TRUE_SIMULATED_WAIT(udp_ready_, kSimulatedRtt, fake_clock_);
-  // Create a connection.
-  TestConnectionWrapper conn(turn_port_->CreateConnection(
-      udp_port_->Candidates()[0], Port::ORIGIN_MESSAGE));
-  EXPECT_TRUE(conn.connection() != nullptr);
-
-  // Asynchronously, CreatePermission request should be sent and fail, which
-  // will make the connection pruned and failed.
-  EXPECT_TRUE_SIMULATED_WAIT(CheckConnectionFailedAndPruned(conn.connection()),
-                             kSimulatedRtt, fake_clock_);
-  EXPECT_TRUE_SIMULATED_WAIT(!turn_create_permission_success_, kSimulatedRtt,
-                             fake_clock_);
-  // Check that the connection is not deleted asynchronously.
-  SIMULATED_WAIT(conn.connection() == nullptr, kConnectionDestructionDelay,
-                 fake_clock_);
-  EXPECT_NE(nullptr, conn.connection());
-}
-
-// Test that a TURN allocation is released when the port is closed.
-TEST_F(TurnPortTest, TestTurnReleaseAllocation) {
-  CreateTurnPort(kTurnUsername, kTurnPassword, kTurnUdpProtoAddr);
-  TestTurnReleaseAllocation(PROTO_UDP);
-}
-
-// Test that a TURN TCP allocation is released when the port is closed.
-TEST_F(TurnPortTest, TestTurnTCPReleaseAllocation) {
-  turn_server_.AddInternalSocket(kTurnTcpIntAddr, PROTO_TCP);
-  CreateTurnPort(kTurnUsername, kTurnPassword, kTurnTcpProtoAddr);
-  TestTurnReleaseAllocation(PROTO_TCP);
-}
-
-TEST_F(TurnPortTest, TestTurnTLSReleaseAllocation) {
-  turn_server_.AddInternalSocket(kTurnTcpIntAddr, PROTO_TLS);
-  CreateTurnPort(kTurnUsername, kTurnPassword, kTurnTlsProtoAddr);
-  TestTurnReleaseAllocation(PROTO_TLS);
-}
-
-// This test verifies any FD's are not leaked after TurnPort is destroyed.
-// https://code.google.com/p/webrtc/issues/detail?id=2651
-#if defined(WEBRTC_LINUX) && !defined(WEBRTC_ANDROID)
-
-TEST_F(TurnPortTest, TestResolverShutdown) {
-  turn_server_.AddInternalSocket(kTurnUdpIPv6IntAddr, PROTO_UDP);
-  int last_fd_count = GetFDCount();
-  // Need to supply unresolved address to kick off resolver.
-  CreateTurnPort(kLocalIPv6Addr, kTurnUsername, kTurnPassword,
-                 ProtocolAddress(rtc::SocketAddress("www.google.invalid", 3478),
-                                 PROTO_UDP));
-  turn_port_->PrepareAddress();
-  ASSERT_TRUE_WAIT(turn_error_, kResolverTimeout);
-  EXPECT_TRUE(turn_port_->Candidates().empty());
-  turn_port_.reset();
-  rtc::Thread::Current()->Post(RTC_FROM_HERE, this, MSG_TESTFINISH);
-  // Waiting for above message to be processed.
-  ASSERT_TRUE_SIMULATED_WAIT(test_finish_, 1, fake_clock_);
-  EXPECT_EQ(last_fd_count, GetFDCount());
-}
-#endif
-
-}  // namespace cricket
diff --git a/p2p/base/turnserver.cc b/p2p/base/turnserver.cc
deleted file mode 100644
index afc5f1d..0000000
--- a/p2p/base/turnserver.cc
+++ /dev/null
@@ -1,972 +0,0 @@
-/*
- *  Copyright 2012 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/p2p/base/turnserver.h"
-
-#include <tuple>  // for std::tie
-
-#include "webrtc/p2p/base/asyncstuntcpsocket.h"
-#include "webrtc/p2p/base/common.h"
-#include "webrtc/p2p/base/packetsocketfactory.h"
-#include "webrtc/p2p/base/stun.h"
-#include "webrtc/rtc_base/bind.h"
-#include "webrtc/rtc_base/bytebuffer.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/helpers.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/messagedigest.h"
-#include "webrtc/rtc_base/ptr_util.h"
-#include "webrtc/rtc_base/socketadapters.h"
-#include "webrtc/rtc_base/stringencode.h"
-#include "webrtc/rtc_base/thread.h"
-
-namespace cricket {
-
-// TODO(juberti): Move this all to a future turnmessage.h
-//static const int IPPROTO_UDP = 17;
-static const int kNonceTimeout = 60 * 60 * 1000;              // 60 minutes
-static const int kDefaultAllocationTimeout = 10 * 60 * 1000;  // 10 minutes
-static const int kPermissionTimeout = 5 * 60 * 1000;          //  5 minutes
-static const int kChannelTimeout = 10 * 60 * 1000;            // 10 minutes
-
-static const int kMinChannelNumber = 0x4000;
-static const int kMaxChannelNumber = 0x7FFF;
-
-static const size_t kNonceKeySize = 16;
-static const size_t kNonceSize = 48;
-
-static const size_t TURN_CHANNEL_HEADER_SIZE = 4U;
-
-// TODO(mallinath) - Move these to a common place.
-inline bool IsTurnChannelData(uint16_t msg_type) {
-  // The first two bits of a channel data message are 0b01.
-  return ((msg_type & 0xC000) == 0x4000);
-}
-
-// IDs used for posted messages for TurnServerAllocation.
-enum {
-  MSG_ALLOCATION_TIMEOUT,
-};
-
-// Encapsulates a TURN permission.
-// The object is created when a create permission request is received by an
-// allocation, and self-deletes when its lifetime timer expires.
-class TurnServerAllocation::Permission : public rtc::MessageHandler {
- public:
-  Permission(rtc::Thread* thread, const rtc::IPAddress& peer);
-  ~Permission();
-
-  const rtc::IPAddress& peer() const { return peer_; }
-  void Refresh();
-
-  sigslot::signal1<Permission*> SignalDestroyed;
-
- private:
-  virtual void OnMessage(rtc::Message* msg);
-
-  rtc::Thread* thread_;
-  rtc::IPAddress peer_;
-};
-
-// Encapsulates a TURN channel binding.
-// The object is created when a channel bind request is received by an
-// allocation, and self-deletes when its lifetime timer expires.
-class TurnServerAllocation::Channel : public rtc::MessageHandler {
- public:
-  Channel(rtc::Thread* thread, int id,
-                     const rtc::SocketAddress& peer);
-  ~Channel();
-
-  int id() const { return id_; }
-  const rtc::SocketAddress& peer() const { return peer_; }
-  void Refresh();
-
-  sigslot::signal1<Channel*> SignalDestroyed;
-
- private:
-  virtual void OnMessage(rtc::Message* msg);
-
-  rtc::Thread* thread_;
-  int id_;
-  rtc::SocketAddress peer_;
-};
-
-static bool InitResponse(const StunMessage* req, StunMessage* resp) {
-  int resp_type = (req) ? GetStunSuccessResponseType(req->type()) : -1;
-  if (resp_type == -1)
-    return false;
-  resp->SetType(resp_type);
-  resp->SetTransactionID(req->transaction_id());
-  return true;
-}
-
-static bool InitErrorResponse(const StunMessage* req, int code,
-                              const std::string& reason, StunMessage* resp) {
-  int resp_type = (req) ? GetStunErrorResponseType(req->type()) : -1;
-  if (resp_type == -1)
-    return false;
-  resp->SetType(resp_type);
-  resp->SetTransactionID(req->transaction_id());
-  resp->AddAttribute(rtc::MakeUnique<cricket::StunErrorCodeAttribute>(
-      STUN_ATTR_ERROR_CODE, code, reason));
-  return true;
-}
-
-
-TurnServer::TurnServer(rtc::Thread* thread)
-    : thread_(thread),
-      nonce_key_(rtc::CreateRandomString(kNonceKeySize)),
-      auth_hook_(NULL),
-      redirect_hook_(NULL),
-      enable_otu_nonce_(false) {
-}
-
-TurnServer::~TurnServer() {
-  for (InternalSocketMap::iterator it = server_sockets_.begin();
-       it != server_sockets_.end(); ++it) {
-    rtc::AsyncPacketSocket* socket = it->first;
-    delete socket;
-  }
-
-  for (ServerSocketMap::iterator it = server_listen_sockets_.begin();
-       it != server_listen_sockets_.end(); ++it) {
-    rtc::AsyncSocket* socket = it->first;
-    delete socket;
-  }
-}
-
-void TurnServer::AddInternalSocket(rtc::AsyncPacketSocket* socket,
-                                   ProtocolType proto) {
-  RTC_DCHECK(server_sockets_.end() == server_sockets_.find(socket));
-  server_sockets_[socket] = proto;
-  socket->SignalReadPacket.connect(this, &TurnServer::OnInternalPacket);
-}
-
-void TurnServer::AddInternalServerSocket(rtc::AsyncSocket* socket,
-                                         ProtocolType proto) {
-  RTC_DCHECK(server_listen_sockets_.end() ==
-             server_listen_sockets_.find(socket));
-  server_listen_sockets_[socket] = proto;
-  socket->SignalReadEvent.connect(this, &TurnServer::OnNewInternalConnection);
-}
-
-void TurnServer::SetExternalSocketFactory(
-    rtc::PacketSocketFactory* factory,
-    const rtc::SocketAddress& external_addr) {
-  external_socket_factory_.reset(factory);
-  external_addr_ = external_addr;
-}
-
-void TurnServer::OnNewInternalConnection(rtc::AsyncSocket* socket) {
-  RTC_DCHECK(server_listen_sockets_.find(socket) !=
-             server_listen_sockets_.end());
-  AcceptConnection(socket);
-}
-
-void TurnServer::AcceptConnection(rtc::AsyncSocket* server_socket) {
-  // Check if someone is trying to connect to us.
-  rtc::SocketAddress accept_addr;
-  rtc::AsyncSocket* accepted_socket = server_socket->Accept(&accept_addr);
-  if (accepted_socket != NULL) {
-    ProtocolType proto = server_listen_sockets_[server_socket];
-    cricket::AsyncStunTCPSocket* tcp_socket =
-        new cricket::AsyncStunTCPSocket(accepted_socket, false);
-
-    tcp_socket->SignalClose.connect(this, &TurnServer::OnInternalSocketClose);
-    // Finally add the socket so it can start communicating with the client.
-    AddInternalSocket(tcp_socket, proto);
-  }
-}
-
-void TurnServer::OnInternalSocketClose(rtc::AsyncPacketSocket* socket,
-                                       int err) {
-  DestroyInternalSocket(socket);
-}
-
-void TurnServer::OnInternalPacket(rtc::AsyncPacketSocket* socket,
-                                  const char* data, size_t size,
-                                  const rtc::SocketAddress& addr,
-                                  const rtc::PacketTime& packet_time) {
-  // Fail if the packet is too small to even contain a channel header.
-  if (size < TURN_CHANNEL_HEADER_SIZE) {
-   return;
-  }
-  InternalSocketMap::iterator iter = server_sockets_.find(socket);
-  RTC_DCHECK(iter != server_sockets_.end());
-  TurnServerConnection conn(addr, iter->second, socket);
-  uint16_t msg_type = rtc::GetBE16(data);
-  if (!IsTurnChannelData(msg_type)) {
-    // This is a STUN message.
-    HandleStunMessage(&conn, data, size);
-  } else {
-    // This is a channel message; let the allocation handle it.
-    TurnServerAllocation* allocation = FindAllocation(&conn);
-    if (allocation) {
-      allocation->HandleChannelData(data, size);
-    }
-  }
-}
-
-void TurnServer::HandleStunMessage(TurnServerConnection* conn, const char* data,
-                                   size_t size) {
-  TurnMessage msg;
-  rtc::ByteBufferReader buf(data, size);
-  if (!msg.Read(&buf) || (buf.Length() > 0)) {
-    LOG(LS_WARNING) << "Received invalid STUN message";
-    return;
-  }
-
-  // If it's a STUN binding request, handle that specially.
-  if (msg.type() == STUN_BINDING_REQUEST) {
-    HandleBindingRequest(conn, &msg);
-    return;
-  }
-
-  if (redirect_hook_ != NULL && msg.type() == STUN_ALLOCATE_REQUEST) {
-    rtc::SocketAddress address;
-    if (redirect_hook_->ShouldRedirect(conn->src(), &address)) {
-      SendErrorResponseWithAlternateServer(
-          conn, &msg, address);
-      return;
-    }
-  }
-
-  // Look up the key that we'll use to validate the M-I. If we have an
-  // existing allocation, the key will already be cached.
-  TurnServerAllocation* allocation = FindAllocation(conn);
-  std::string key;
-  if (!allocation) {
-    GetKey(&msg, &key);
-  } else {
-    key = allocation->key();
-  }
-
-  // Ensure the message is authorized; only needed for requests.
-  if (IsStunRequestType(msg.type())) {
-    if (!CheckAuthorization(conn, &msg, data, size, key)) {
-      return;
-    }
-  }
-
-  if (!allocation && msg.type() == STUN_ALLOCATE_REQUEST) {
-    HandleAllocateRequest(conn, &msg, key);
-  } else if (allocation &&
-             (msg.type() != STUN_ALLOCATE_REQUEST ||
-              msg.transaction_id() == allocation->transaction_id())) {
-    // This is a non-allocate request, or a retransmit of an allocate.
-    // Check that the username matches the previous username used.
-    if (IsStunRequestType(msg.type()) &&
-        msg.GetByteString(STUN_ATTR_USERNAME)->GetString() !=
-            allocation->username()) {
-      SendErrorResponse(conn, &msg, STUN_ERROR_WRONG_CREDENTIALS,
-                        STUN_ERROR_REASON_WRONG_CREDENTIALS);
-      return;
-    }
-    allocation->HandleTurnMessage(&msg);
-  } else {
-    // Allocation mismatch.
-    SendErrorResponse(conn, &msg, STUN_ERROR_ALLOCATION_MISMATCH,
-                      STUN_ERROR_REASON_ALLOCATION_MISMATCH);
-  }
-}
-
-bool TurnServer::GetKey(const StunMessage* msg, std::string* key) {
-  const StunByteStringAttribute* username_attr =
-      msg->GetByteString(STUN_ATTR_USERNAME);
-  if (!username_attr) {
-    return false;
-  }
-
-  std::string username = username_attr->GetString();
-  return (auth_hook_ != NULL && auth_hook_->GetKey(username, realm_, key));
-}
-
-bool TurnServer::CheckAuthorization(TurnServerConnection* conn,
-                                    const StunMessage* msg,
-                                    const char* data, size_t size,
-                                    const std::string& key) {
-  // RFC 5389, 10.2.2.
-  RTC_DCHECK(IsStunRequestType(msg->type()));
-  const StunByteStringAttribute* mi_attr =
-      msg->GetByteString(STUN_ATTR_MESSAGE_INTEGRITY);
-  const StunByteStringAttribute* username_attr =
-      msg->GetByteString(STUN_ATTR_USERNAME);
-  const StunByteStringAttribute* realm_attr =
-      msg->GetByteString(STUN_ATTR_REALM);
-  const StunByteStringAttribute* nonce_attr =
-      msg->GetByteString(STUN_ATTR_NONCE);
-
-  // Fail if no M-I.
-  if (!mi_attr) {
-    SendErrorResponseWithRealmAndNonce(conn, msg, STUN_ERROR_UNAUTHORIZED,
-                                       STUN_ERROR_REASON_UNAUTHORIZED);
-    return false;
-  }
-
-  // Fail if there is M-I but no username, nonce, or realm.
-  if (!username_attr || !realm_attr || !nonce_attr) {
-    SendErrorResponse(conn, msg, STUN_ERROR_BAD_REQUEST,
-                      STUN_ERROR_REASON_BAD_REQUEST);
-    return false;
-  }
-
-  // Fail if bad nonce.
-  if (!ValidateNonce(nonce_attr->GetString())) {
-    SendErrorResponseWithRealmAndNonce(conn, msg, STUN_ERROR_STALE_NONCE,
-                                       STUN_ERROR_REASON_STALE_NONCE);
-    return false;
-  }
-
-  // Fail if bad username or M-I.
-  // We need |data| and |size| for the call to ValidateMessageIntegrity.
-  if (key.empty() || !StunMessage::ValidateMessageIntegrity(data, size, key)) {
-    SendErrorResponseWithRealmAndNonce(conn, msg, STUN_ERROR_UNAUTHORIZED,
-                                       STUN_ERROR_REASON_UNAUTHORIZED);
-    return false;
-  }
-
-  // Fail if one-time-use nonce feature is enabled.
-  TurnServerAllocation* allocation = FindAllocation(conn);
-  if (enable_otu_nonce_ && allocation &&
-      allocation->last_nonce() == nonce_attr->GetString()) {
-    SendErrorResponseWithRealmAndNonce(conn, msg, STUN_ERROR_STALE_NONCE,
-                                       STUN_ERROR_REASON_STALE_NONCE);
-    return false;
-  }
-
-  if (allocation) {
-    allocation->set_last_nonce(nonce_attr->GetString());
-  }
-  // Success.
-  return true;
-}
-
-void TurnServer::HandleBindingRequest(TurnServerConnection* conn,
-                                      const StunMessage* req) {
-  StunMessage response;
-  InitResponse(req, &response);
-
-  // Tell the user the address that we received their request from.
-  auto mapped_addr_attr = rtc::MakeUnique<StunXorAddressAttribute>(
-      STUN_ATTR_XOR_MAPPED_ADDRESS, conn->src());
-  response.AddAttribute(std::move(mapped_addr_attr));
-
-  SendStun(conn, &response);
-}
-
-void TurnServer::HandleAllocateRequest(TurnServerConnection* conn,
-                                       const TurnMessage* msg,
-                                       const std::string& key) {
-  // Check the parameters in the request.
-  const StunUInt32Attribute* transport_attr =
-      msg->GetUInt32(STUN_ATTR_REQUESTED_TRANSPORT);
-  if (!transport_attr) {
-    SendErrorResponse(conn, msg, STUN_ERROR_BAD_REQUEST,
-                      STUN_ERROR_REASON_BAD_REQUEST);
-    return;
-  }
-
-  // Only UDP is supported right now.
-  int proto = transport_attr->value() >> 24;
-  if (proto != IPPROTO_UDP) {
-    SendErrorResponse(conn, msg, STUN_ERROR_UNSUPPORTED_PROTOCOL,
-                      STUN_ERROR_REASON_UNSUPPORTED_PROTOCOL);
-    return;
-  }
-
-  // Create the allocation and let it send the success response.
-  // If the actual socket allocation fails, send an internal error.
-  TurnServerAllocation* alloc = CreateAllocation(conn, proto, key);
-  if (alloc) {
-    alloc->HandleTurnMessage(msg);
-  } else {
-    SendErrorResponse(conn, msg, STUN_ERROR_SERVER_ERROR,
-                      "Failed to allocate socket");
-  }
-}
-
-std::string TurnServer::GenerateNonce(int64_t now) const {
-  // Generate a nonce of the form hex(now + HMAC-MD5(nonce_key_, now))
-  std::string input(reinterpret_cast<const char*>(&now), sizeof(now));
-  std::string nonce = rtc::hex_encode(input.c_str(), input.size());
-  nonce += rtc::ComputeHmac(rtc::DIGEST_MD5, nonce_key_, input);
-  RTC_DCHECK(nonce.size() == kNonceSize);
-
-  return nonce;
-}
-
-bool TurnServer::ValidateNonce(const std::string& nonce) const {
-  // Check the size.
-  if (nonce.size() != kNonceSize) {
-    return false;
-  }
-
-  // Decode the timestamp.
-  int64_t then;
-  char* p = reinterpret_cast<char*>(&then);
-  size_t len = rtc::hex_decode(p, sizeof(then),
-      nonce.substr(0, sizeof(then) * 2));
-  if (len != sizeof(then)) {
-    return false;
-  }
-
-  // Verify the HMAC.
-  if (nonce.substr(sizeof(then) * 2) != rtc::ComputeHmac(
-      rtc::DIGEST_MD5, nonce_key_, std::string(p, sizeof(then)))) {
-    return false;
-  }
-
-  // Validate the timestamp.
-  return rtc::TimeMillis() - then < kNonceTimeout;
-}
-
-TurnServerAllocation* TurnServer::FindAllocation(TurnServerConnection* conn) {
-  AllocationMap::const_iterator it = allocations_.find(*conn);
-  return (it != allocations_.end()) ? it->second.get() : nullptr;
-}
-
-TurnServerAllocation* TurnServer::CreateAllocation(TurnServerConnection* conn,
-                                                   int proto,
-                                                   const std::string& key) {
-  rtc::AsyncPacketSocket* external_socket = (external_socket_factory_) ?
-      external_socket_factory_->CreateUdpSocket(external_addr_, 0, 0) : NULL;
-  if (!external_socket) {
-    return NULL;
-  }
-
-  // The Allocation takes ownership of the socket.
-  TurnServerAllocation* allocation = new TurnServerAllocation(this,
-      thread_, *conn, external_socket, key);
-  allocation->SignalDestroyed.connect(this, &TurnServer::OnAllocationDestroyed);
-  allocations_[*conn].reset(allocation);
-  return allocation;
-}
-
-void TurnServer::SendErrorResponse(TurnServerConnection* conn,
-                                   const StunMessage* req,
-                                   int code, const std::string& reason) {
-  TurnMessage resp;
-  InitErrorResponse(req, code, reason, &resp);
-  LOG(LS_INFO) << "Sending error response, type=" << resp.type()
-               << ", code=" << code << ", reason=" << reason;
-  SendStun(conn, &resp);
-}
-
-void TurnServer::SendErrorResponseWithRealmAndNonce(
-    TurnServerConnection* conn, const StunMessage* msg,
-    int code, const std::string& reason) {
-  TurnMessage resp;
-  InitErrorResponse(msg, code, reason, &resp);
-
-  int64_t timestamp = rtc::TimeMillis();
-  if (ts_for_next_nonce_) {
-    timestamp = ts_for_next_nonce_;
-    ts_for_next_nonce_ = 0;
-  }
-  resp.AddAttribute(rtc::MakeUnique<StunByteStringAttribute>(
-      STUN_ATTR_NONCE, GenerateNonce(timestamp)));
-  resp.AddAttribute(
-      rtc::MakeUnique<StunByteStringAttribute>(STUN_ATTR_REALM, realm_));
-  SendStun(conn, &resp);
-}
-
-void TurnServer::SendErrorResponseWithAlternateServer(
-    TurnServerConnection* conn, const StunMessage* msg,
-    const rtc::SocketAddress& addr) {
-  TurnMessage resp;
-  InitErrorResponse(msg, STUN_ERROR_TRY_ALTERNATE,
-                    STUN_ERROR_REASON_TRY_ALTERNATE_SERVER, &resp);
-  resp.AddAttribute(
-      rtc::MakeUnique<StunAddressAttribute>(STUN_ATTR_ALTERNATE_SERVER, addr));
-  SendStun(conn, &resp);
-}
-
-void TurnServer::SendStun(TurnServerConnection* conn, StunMessage* msg) {
-  rtc::ByteBufferWriter buf;
-  // Add a SOFTWARE attribute if one is set.
-  if (!software_.empty()) {
-    msg->AddAttribute(rtc::MakeUnique<StunByteStringAttribute>(
-        STUN_ATTR_SOFTWARE, software_));
-  }
-  msg->Write(&buf);
-  Send(conn, buf);
-}
-
-void TurnServer::Send(TurnServerConnection* conn,
-                      const rtc::ByteBufferWriter& buf) {
-  rtc::PacketOptions options;
-  conn->socket()->SendTo(buf.Data(), buf.Length(), conn->src(), options);
-}
-
-void TurnServer::OnAllocationDestroyed(TurnServerAllocation* allocation) {
-  // Removing the internal socket if the connection is not udp.
-  rtc::AsyncPacketSocket* socket = allocation->conn()->socket();
-  InternalSocketMap::iterator iter = server_sockets_.find(socket);
-  // Skip if the socket serving this allocation is UDP, as this will be shared
-  // by all allocations.
-  // Note: We may not find a socket if it's a TCP socket that was closed, and
-  // the allocation is only now timing out.
-  if (iter != server_sockets_.end() && iter->second != cricket::PROTO_UDP) {
-    DestroyInternalSocket(socket);
-  }
-
-  AllocationMap::iterator it = allocations_.find(*(allocation->conn()));
-  if (it != allocations_.end()) {
-    it->second.release();
-    allocations_.erase(it);
-  }
-}
-
-void TurnServer::DestroyInternalSocket(rtc::AsyncPacketSocket* socket) {
-  InternalSocketMap::iterator iter = server_sockets_.find(socket);
-  if (iter != server_sockets_.end()) {
-    rtc::AsyncPacketSocket* socket = iter->first;
-    server_sockets_.erase(iter);
-    // We must destroy the socket async to avoid invalidating the sigslot
-    // callback list iterator inside a sigslot callback. (In other words,
-    // deleting an object from within a callback from that object).
-    sockets_to_delete_.push_back(
-        std::unique_ptr<rtc::AsyncPacketSocket>(socket));
-    invoker_.AsyncInvoke<void>(RTC_FROM_HERE, rtc::Thread::Current(),
-                               rtc::Bind(&TurnServer::FreeSockets, this));
-  }
-}
-
-void TurnServer::FreeSockets() {
-  sockets_to_delete_.clear();
-}
-
-TurnServerConnection::TurnServerConnection(const rtc::SocketAddress& src,
-                                           ProtocolType proto,
-                                           rtc::AsyncPacketSocket* socket)
-    : src_(src),
-      dst_(socket->GetRemoteAddress()),
-      proto_(proto),
-      socket_(socket) {
-}
-
-bool TurnServerConnection::operator==(const TurnServerConnection& c) const {
-  return src_ == c.src_ && dst_ == c.dst_ && proto_ == c.proto_;
-}
-
-bool TurnServerConnection::operator<(const TurnServerConnection& c) const {
-  return std::tie(src_, dst_, proto_) < std::tie(c.src_, c.dst_, c.proto_);
-}
-
-std::string TurnServerConnection::ToString() const {
-  const char* const kProtos[] = {
-      "unknown", "udp", "tcp", "ssltcp"
-  };
-  std::ostringstream ost;
-  ost << src_.ToString() << "-" << dst_.ToString() << ":"<< kProtos[proto_];
-  return ost.str();
-}
-
-TurnServerAllocation::TurnServerAllocation(TurnServer* server,
-                                           rtc::Thread* thread,
-                                           const TurnServerConnection& conn,
-                                           rtc::AsyncPacketSocket* socket,
-                                           const std::string& key)
-    : server_(server),
-      thread_(thread),
-      conn_(conn),
-      external_socket_(socket),
-      key_(key) {
-  external_socket_->SignalReadPacket.connect(
-      this, &TurnServerAllocation::OnExternalPacket);
-}
-
-TurnServerAllocation::~TurnServerAllocation() {
-  for (ChannelList::iterator it = channels_.begin();
-       it != channels_.end(); ++it) {
-    delete *it;
-  }
-  for (PermissionList::iterator it = perms_.begin();
-       it != perms_.end(); ++it) {
-    delete *it;
-  }
-  thread_->Clear(this, MSG_ALLOCATION_TIMEOUT);
-  LOG_J(LS_INFO, this) << "Allocation destroyed";
-}
-
-std::string TurnServerAllocation::ToString() const {
-  std::ostringstream ost;
-  ost << "Alloc[" << conn_.ToString() << "]";
-  return ost.str();
-}
-
-void TurnServerAllocation::HandleTurnMessage(const TurnMessage* msg) {
-  RTC_DCHECK(msg != NULL);
-  switch (msg->type()) {
-    case STUN_ALLOCATE_REQUEST:
-      HandleAllocateRequest(msg);
-      break;
-    case TURN_REFRESH_REQUEST:
-      HandleRefreshRequest(msg);
-      break;
-    case TURN_SEND_INDICATION:
-      HandleSendIndication(msg);
-      break;
-    case TURN_CREATE_PERMISSION_REQUEST:
-      HandleCreatePermissionRequest(msg);
-      break;
-    case TURN_CHANNEL_BIND_REQUEST:
-      HandleChannelBindRequest(msg);
-      break;
-    default:
-      // Not sure what to do with this, just eat it.
-      LOG_J(LS_WARNING, this) << "Invalid TURN message type received: "
-                              << msg->type();
-  }
-}
-
-void TurnServerAllocation::HandleAllocateRequest(const TurnMessage* msg) {
-  // Copy the important info from the allocate request.
-  transaction_id_ = msg->transaction_id();
-  const StunByteStringAttribute* username_attr =
-      msg->GetByteString(STUN_ATTR_USERNAME);
-  RTC_DCHECK(username_attr != NULL);
-  username_ = username_attr->GetString();
-  const StunByteStringAttribute* origin_attr =
-      msg->GetByteString(STUN_ATTR_ORIGIN);
-  if (origin_attr) {
-    origin_ = origin_attr->GetString();
-  }
-
-  // Figure out the lifetime and start the allocation timer.
-  int lifetime_secs = ComputeLifetime(msg);
-  thread_->PostDelayed(RTC_FROM_HERE, lifetime_secs * 1000, this,
-                       MSG_ALLOCATION_TIMEOUT);
-
-  LOG_J(LS_INFO, this) << "Created allocation, lifetime=" << lifetime_secs;
-
-  // We've already validated all the important bits; just send a response here.
-  TurnMessage response;
-  InitResponse(msg, &response);
-
-  auto mapped_addr_attr = rtc::MakeUnique<StunXorAddressAttribute>(
-      STUN_ATTR_XOR_MAPPED_ADDRESS, conn_.src());
-  auto relayed_addr_attr = rtc::MakeUnique<StunXorAddressAttribute>(
-      STUN_ATTR_XOR_RELAYED_ADDRESS, external_socket_->GetLocalAddress());
-  auto lifetime_attr =
-      rtc::MakeUnique<StunUInt32Attribute>(STUN_ATTR_LIFETIME, lifetime_secs);
-  response.AddAttribute(std::move(mapped_addr_attr));
-  response.AddAttribute(std::move(relayed_addr_attr));
-  response.AddAttribute(std::move(lifetime_attr));
-
-  SendResponse(&response);
-}
-
-void TurnServerAllocation::HandleRefreshRequest(const TurnMessage* msg) {
-  // Figure out the new lifetime.
-  int lifetime_secs = ComputeLifetime(msg);
-
-  // Reset the expiration timer.
-  thread_->Clear(this, MSG_ALLOCATION_TIMEOUT);
-  thread_->PostDelayed(RTC_FROM_HERE, lifetime_secs * 1000, this,
-                       MSG_ALLOCATION_TIMEOUT);
-
-  LOG_J(LS_INFO, this) << "Refreshed allocation, lifetime=" << lifetime_secs;
-
-  // Send a success response with a LIFETIME attribute.
-  TurnMessage response;
-  InitResponse(msg, &response);
-
-  auto lifetime_attr =
-      rtc::MakeUnique<StunUInt32Attribute>(STUN_ATTR_LIFETIME, lifetime_secs);
-  response.AddAttribute(std::move(lifetime_attr));
-
-  SendResponse(&response);
-}
-
-void TurnServerAllocation::HandleSendIndication(const TurnMessage* msg) {
-  // Check mandatory attributes.
-  const StunByteStringAttribute* data_attr = msg->GetByteString(STUN_ATTR_DATA);
-  const StunAddressAttribute* peer_attr =
-      msg->GetAddress(STUN_ATTR_XOR_PEER_ADDRESS);
-  if (!data_attr || !peer_attr) {
-    LOG_J(LS_WARNING, this) << "Received invalid send indication";
-    return;
-  }
-
-  // If a permission exists, send the data on to the peer.
-  if (HasPermission(peer_attr->GetAddress().ipaddr())) {
-    SendExternal(data_attr->bytes(), data_attr->length(),
-                 peer_attr->GetAddress());
-  } else {
-    LOG_J(LS_WARNING, this) << "Received send indication without permission"
-                            << "peer=" << peer_attr->GetAddress();
-  }
-}
-
-void TurnServerAllocation::HandleCreatePermissionRequest(
-    const TurnMessage* msg) {
-  // Check mandatory attributes.
-  const StunAddressAttribute* peer_attr =
-      msg->GetAddress(STUN_ATTR_XOR_PEER_ADDRESS);
-  if (!peer_attr) {
-    SendBadRequestResponse(msg);
-    return;
-  }
-
-  if (server_->reject_private_addresses_ &&
-      rtc::IPIsPrivate(peer_attr->GetAddress().ipaddr())) {
-    SendErrorResponse(msg, STUN_ERROR_FORBIDDEN, STUN_ERROR_REASON_FORBIDDEN);
-    return;
-  }
-
-  // Add this permission.
-  AddPermission(peer_attr->GetAddress().ipaddr());
-
-  LOG_J(LS_INFO, this) << "Created permission, peer="
-                       << peer_attr->GetAddress();
-
-  // Send a success response.
-  TurnMessage response;
-  InitResponse(msg, &response);
-  SendResponse(&response);
-}
-
-void TurnServerAllocation::HandleChannelBindRequest(const TurnMessage* msg) {
-  // Check mandatory attributes.
-  const StunUInt32Attribute* channel_attr =
-      msg->GetUInt32(STUN_ATTR_CHANNEL_NUMBER);
-  const StunAddressAttribute* peer_attr =
-      msg->GetAddress(STUN_ATTR_XOR_PEER_ADDRESS);
-  if (!channel_attr || !peer_attr) {
-    SendBadRequestResponse(msg);
-    return;
-  }
-
-  // Check that channel id is valid.
-  int channel_id = channel_attr->value() >> 16;
-  if (channel_id < kMinChannelNumber || channel_id > kMaxChannelNumber) {
-    SendBadRequestResponse(msg);
-    return;
-  }
-
-  // Check that this channel id isn't bound to another transport address, and
-  // that this transport address isn't bound to another channel id.
-  Channel* channel1 = FindChannel(channel_id);
-  Channel* channel2 = FindChannel(peer_attr->GetAddress());
-  if (channel1 != channel2) {
-    SendBadRequestResponse(msg);
-    return;
-  }
-
-  // Add or refresh this channel.
-  if (!channel1) {
-    channel1 = new Channel(thread_, channel_id, peer_attr->GetAddress());
-    channel1->SignalDestroyed.connect(this,
-        &TurnServerAllocation::OnChannelDestroyed);
-    channels_.push_back(channel1);
-  } else {
-    channel1->Refresh();
-  }
-
-  // Channel binds also refresh permissions.
-  AddPermission(peer_attr->GetAddress().ipaddr());
-
-  LOG_J(LS_INFO, this) << "Bound channel, id=" << channel_id
-                       << ", peer=" << peer_attr->GetAddress();
-
-  // Send a success response.
-  TurnMessage response;
-  InitResponse(msg, &response);
-  SendResponse(&response);
-}
-
-void TurnServerAllocation::HandleChannelData(const char* data, size_t size) {
-  // Extract the channel number from the data.
-  uint16_t channel_id = rtc::GetBE16(data);
-  Channel* channel = FindChannel(channel_id);
-  if (channel) {
-    // Send the data to the peer address.
-    SendExternal(data + TURN_CHANNEL_HEADER_SIZE,
-                 size - TURN_CHANNEL_HEADER_SIZE, channel->peer());
-  } else {
-    LOG_J(LS_WARNING, this) << "Received channel data for invalid channel, id="
-                            << channel_id;
-  }
-}
-
-void TurnServerAllocation::OnExternalPacket(
-    rtc::AsyncPacketSocket* socket,
-    const char* data, size_t size,
-    const rtc::SocketAddress& addr,
-    const rtc::PacketTime& packet_time) {
-  RTC_DCHECK(external_socket_.get() == socket);
-  Channel* channel = FindChannel(addr);
-  if (channel) {
-    // There is a channel bound to this address. Send as a channel message.
-    rtc::ByteBufferWriter buf;
-    buf.WriteUInt16(channel->id());
-    buf.WriteUInt16(static_cast<uint16_t>(size));
-    buf.WriteBytes(data, size);
-    server_->Send(&conn_, buf);
-  } else if (!server_->enable_permission_checks_ ||
-             HasPermission(addr.ipaddr())) {
-    // No channel, but a permission exists. Send as a data indication.
-    TurnMessage msg;
-    msg.SetType(TURN_DATA_INDICATION);
-    msg.SetTransactionID(
-        rtc::CreateRandomString(kStunTransactionIdLength));
-    msg.AddAttribute(rtc::MakeUnique<StunXorAddressAttribute>(
-        STUN_ATTR_XOR_PEER_ADDRESS, addr));
-    msg.AddAttribute(
-        rtc::MakeUnique<StunByteStringAttribute>(STUN_ATTR_DATA, data, size));
-    server_->SendStun(&conn_, &msg);
-  } else {
-    LOG_J(LS_WARNING, this) << "Received external packet without permission, "
-                            << "peer=" << addr;
-  }
-}
-
-int TurnServerAllocation::ComputeLifetime(const TurnMessage* msg) {
-  // Return the smaller of our default lifetime and the requested lifetime.
-  int lifetime = kDefaultAllocationTimeout / 1000;  // convert to seconds
-  const StunUInt32Attribute* lifetime_attr = msg->GetUInt32(STUN_ATTR_LIFETIME);
-  if (lifetime_attr && static_cast<int>(lifetime_attr->value()) < lifetime) {
-    lifetime = static_cast<int>(lifetime_attr->value());
-  }
-  return lifetime;
-}
-
-bool TurnServerAllocation::HasPermission(const rtc::IPAddress& addr) {
-  return (FindPermission(addr) != NULL);
-}
-
-void TurnServerAllocation::AddPermission(const rtc::IPAddress& addr) {
-  Permission* perm = FindPermission(addr);
-  if (!perm) {
-    perm = new Permission(thread_, addr);
-    perm->SignalDestroyed.connect(
-        this, &TurnServerAllocation::OnPermissionDestroyed);
-    perms_.push_back(perm);
-  } else {
-    perm->Refresh();
-  }
-}
-
-TurnServerAllocation::Permission* TurnServerAllocation::FindPermission(
-    const rtc::IPAddress& addr) const {
-  for (PermissionList::const_iterator it = perms_.begin();
-       it != perms_.end(); ++it) {
-    if ((*it)->peer() == addr)
-      return *it;
-  }
-  return NULL;
-}
-
-TurnServerAllocation::Channel* TurnServerAllocation::FindChannel(
-    int channel_id) const {
-  for (ChannelList::const_iterator it = channels_.begin();
-       it != channels_.end(); ++it) {
-    if ((*it)->id() == channel_id)
-      return *it;
-  }
-  return NULL;
-}
-
-TurnServerAllocation::Channel* TurnServerAllocation::FindChannel(
-    const rtc::SocketAddress& addr) const {
-  for (ChannelList::const_iterator it = channels_.begin();
-       it != channels_.end(); ++it) {
-    if ((*it)->peer() == addr)
-      return *it;
-  }
-  return NULL;
-}
-
-void TurnServerAllocation::SendResponse(TurnMessage* msg) {
-  // Success responses always have M-I.
-  msg->AddMessageIntegrity(key_);
-  server_->SendStun(&conn_, msg);
-}
-
-void TurnServerAllocation::SendBadRequestResponse(const TurnMessage* req) {
-  SendErrorResponse(req, STUN_ERROR_BAD_REQUEST, STUN_ERROR_REASON_BAD_REQUEST);
-}
-
-void TurnServerAllocation::SendErrorResponse(const TurnMessage* req, int code,
-                                       const std::string& reason) {
-  server_->SendErrorResponse(&conn_, req, code, reason);
-}
-
-void TurnServerAllocation::SendExternal(const void* data, size_t size,
-                                  const rtc::SocketAddress& peer) {
-  rtc::PacketOptions options;
-  external_socket_->SendTo(data, size, peer, options);
-}
-
-void TurnServerAllocation::OnMessage(rtc::Message* msg) {
-  RTC_DCHECK(msg->message_id == MSG_ALLOCATION_TIMEOUT);
-  SignalDestroyed(this);
-  delete this;
-}
-
-void TurnServerAllocation::OnPermissionDestroyed(Permission* perm) {
-  PermissionList::iterator it = std::find(perms_.begin(), perms_.end(), perm);
-  RTC_DCHECK(it != perms_.end());
-  perms_.erase(it);
-}
-
-void TurnServerAllocation::OnChannelDestroyed(Channel* channel) {
-  ChannelList::iterator it =
-      std::find(channels_.begin(), channels_.end(), channel);
-  RTC_DCHECK(it != channels_.end());
-  channels_.erase(it);
-}
-
-TurnServerAllocation::Permission::Permission(rtc::Thread* thread,
-                                   const rtc::IPAddress& peer)
-    : thread_(thread), peer_(peer) {
-  Refresh();
-}
-
-TurnServerAllocation::Permission::~Permission() {
-  thread_->Clear(this, MSG_ALLOCATION_TIMEOUT);
-}
-
-void TurnServerAllocation::Permission::Refresh() {
-  thread_->Clear(this, MSG_ALLOCATION_TIMEOUT);
-  thread_->PostDelayed(RTC_FROM_HERE, kPermissionTimeout, this,
-                       MSG_ALLOCATION_TIMEOUT);
-}
-
-void TurnServerAllocation::Permission::OnMessage(rtc::Message* msg) {
-  RTC_DCHECK(msg->message_id == MSG_ALLOCATION_TIMEOUT);
-  SignalDestroyed(this);
-  delete this;
-}
-
-TurnServerAllocation::Channel::Channel(rtc::Thread* thread, int id,
-                             const rtc::SocketAddress& peer)
-    : thread_(thread), id_(id), peer_(peer) {
-  Refresh();
-}
-
-TurnServerAllocation::Channel::~Channel() {
-  thread_->Clear(this, MSG_ALLOCATION_TIMEOUT);
-}
-
-void TurnServerAllocation::Channel::Refresh() {
-  thread_->Clear(this, MSG_ALLOCATION_TIMEOUT);
-  thread_->PostDelayed(RTC_FROM_HERE, kChannelTimeout, this,
-                       MSG_ALLOCATION_TIMEOUT);
-}
-
-void TurnServerAllocation::Channel::OnMessage(rtc::Message* msg) {
-  RTC_DCHECK(msg->message_id == MSG_ALLOCATION_TIMEOUT);
-  SignalDestroyed(this);
-  delete this;
-}
-
-}  // namespace cricket
diff --git a/p2p/base/turnserver.h b/p2p/base/turnserver.h
deleted file mode 100644
index 0a59f27..0000000
--- a/p2p/base/turnserver.h
+++ /dev/null
@@ -1,304 +0,0 @@
-/*
- *  Copyright 2012 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_P2P_BASE_TURNSERVER_H_
-#define WEBRTC_P2P_BASE_TURNSERVER_H_
-
-#include <list>
-#include <map>
-#include <memory>
-#include <set>
-#include <string>
-#include <vector>
-
-#include "webrtc/p2p/base/portinterface.h"
-#include "webrtc/rtc_base/asyncinvoker.h"
-#include "webrtc/rtc_base/asyncpacketsocket.h"
-#include "webrtc/rtc_base/messagequeue.h"
-#include "webrtc/rtc_base/sigslot.h"
-#include "webrtc/rtc_base/socketaddress.h"
-
-namespace rtc {
-class ByteBufferWriter;
-class PacketSocketFactory;
-class Thread;
-}
-
-namespace cricket {
-
-class StunMessage;
-class TurnMessage;
-class TurnServer;
-
-// The default server port for TURN, as specified in RFC5766.
-const int TURN_SERVER_PORT = 3478;
-
-// Encapsulates the client's connection to the server.
-class TurnServerConnection {
- public:
-  TurnServerConnection() : proto_(PROTO_UDP), socket_(NULL) {}
-  TurnServerConnection(const rtc::SocketAddress& src,
-                       ProtocolType proto,
-                       rtc::AsyncPacketSocket* socket);
-  const rtc::SocketAddress& src() const { return src_; }
-  rtc::AsyncPacketSocket* socket() { return socket_; }
-  bool operator==(const TurnServerConnection& t) const;
-  bool operator<(const TurnServerConnection& t) const;
-  std::string ToString() const;
-
- private:
-  rtc::SocketAddress src_;
-  rtc::SocketAddress dst_;
-  cricket::ProtocolType proto_;
-  rtc::AsyncPacketSocket* socket_;
-};
-
-// Encapsulates a TURN allocation.
-// The object is created when an allocation request is received, and then
-// handles TURN messages (via HandleTurnMessage) and channel data messages
-// (via HandleChannelData) for this allocation when received by the server.
-// The object self-deletes and informs the server if its lifetime timer expires.
-class TurnServerAllocation : public rtc::MessageHandler,
-                             public sigslot::has_slots<> {
- public:
-  TurnServerAllocation(TurnServer* server_,
-                       rtc::Thread* thread,
-                       const TurnServerConnection& conn,
-                       rtc::AsyncPacketSocket* server_socket,
-                       const std::string& key);
-  virtual ~TurnServerAllocation();
-
-  TurnServerConnection* conn() { return &conn_; }
-  const std::string& key() const { return key_; }
-  const std::string& transaction_id() const { return transaction_id_; }
-  const std::string& username() const { return username_; }
-  const std::string& origin() const { return origin_; }
-  const std::string& last_nonce() const { return last_nonce_; }
-  void set_last_nonce(const std::string& nonce) { last_nonce_ = nonce; }
-
-  std::string ToString() const;
-
-  void HandleTurnMessage(const TurnMessage* msg);
-  void HandleChannelData(const char* data, size_t size);
-
-  sigslot::signal1<TurnServerAllocation*> SignalDestroyed;
-
- private:
-  class Channel;
-  class Permission;
-  typedef std::list<Permission*> PermissionList;
-  typedef std::list<Channel*> ChannelList;
-
-  void HandleAllocateRequest(const TurnMessage* msg);
-  void HandleRefreshRequest(const TurnMessage* msg);
-  void HandleSendIndication(const TurnMessage* msg);
-  void HandleCreatePermissionRequest(const TurnMessage* msg);
-  void HandleChannelBindRequest(const TurnMessage* msg);
-
-  void OnExternalPacket(rtc::AsyncPacketSocket* socket,
-                        const char* data, size_t size,
-                        const rtc::SocketAddress& addr,
-                        const rtc::PacketTime& packet_time);
-
-  static int ComputeLifetime(const TurnMessage* msg);
-  bool HasPermission(const rtc::IPAddress& addr);
-  void AddPermission(const rtc::IPAddress& addr);
-  Permission* FindPermission(const rtc::IPAddress& addr) const;
-  Channel* FindChannel(int channel_id) const;
-  Channel* FindChannel(const rtc::SocketAddress& addr) const;
-
-  void SendResponse(TurnMessage* msg);
-  void SendBadRequestResponse(const TurnMessage* req);
-  void SendErrorResponse(const TurnMessage* req, int code,
-                         const std::string& reason);
-  void SendExternal(const void* data, size_t size,
-                    const rtc::SocketAddress& peer);
-
-  void OnPermissionDestroyed(Permission* perm);
-  void OnChannelDestroyed(Channel* channel);
-  virtual void OnMessage(rtc::Message* msg);
-
-  TurnServer* server_;
-  rtc::Thread* thread_;
-  TurnServerConnection conn_;
-  std::unique_ptr<rtc::AsyncPacketSocket> external_socket_;
-  std::string key_;
-  std::string transaction_id_;
-  std::string username_;
-  std::string origin_;
-  std::string last_nonce_;
-  PermissionList perms_;
-  ChannelList channels_;
-};
-
-// An interface through which the MD5 credential hash can be retrieved.
-class TurnAuthInterface {
- public:
-  // Gets HA1 for the specified user and realm.
-  // HA1 = MD5(A1) = MD5(username:realm:password).
-  // Return true if the given username and realm are valid, or false if not.
-  virtual bool GetKey(const std::string& username, const std::string& realm,
-                      std::string* key) = 0;
-  virtual ~TurnAuthInterface() = default;
-};
-
-// An interface enables Turn Server to control redirection behavior.
-class TurnRedirectInterface {
- public:
-  virtual bool ShouldRedirect(const rtc::SocketAddress& address,
-                              rtc::SocketAddress* out) = 0;
-  virtual ~TurnRedirectInterface() {}
-};
-
-// The core TURN server class. Give it a socket to listen on via
-// AddInternalServerSocket, and a factory to create external sockets via
-// SetExternalSocketFactory, and it's ready to go.
-// Not yet wired up: TCP support.
-class TurnServer : public sigslot::has_slots<> {
- public:
-  typedef std::map<TurnServerConnection, std::unique_ptr<TurnServerAllocation>>
-      AllocationMap;
-
-  explicit TurnServer(rtc::Thread* thread);
-  ~TurnServer();
-
-  // Gets/sets the realm value to use for the server.
-  const std::string& realm() const { return realm_; }
-  void set_realm(const std::string& realm) { realm_ = realm; }
-
-  // Gets/sets the value for the SOFTWARE attribute for TURN messages.
-  const std::string& software() const { return software_; }
-  void set_software(const std::string& software) { software_ = software; }
-
-  const AllocationMap& allocations() const { return allocations_; }
-
-  // Sets the authentication callback; does not take ownership.
-  void set_auth_hook(TurnAuthInterface* auth_hook) { auth_hook_ = auth_hook; }
-
-  void set_redirect_hook(TurnRedirectInterface* redirect_hook) {
-    redirect_hook_ = redirect_hook;
-  }
-
-  void set_enable_otu_nonce(bool enable) { enable_otu_nonce_ = enable; }
-
-  // If set to true, reject CreatePermission requests to RFC1918 addresses.
-  void set_reject_private_addresses(bool filter) {
-    reject_private_addresses_ = filter;
-  }
-
-  void set_enable_permission_checks(bool enable) {
-    enable_permission_checks_ = enable;
-  }
-
-  // Starts listening for packets from internal clients.
-  void AddInternalSocket(rtc::AsyncPacketSocket* socket,
-                         ProtocolType proto);
-  // Starts listening for the connections on this socket. When someone tries
-  // to connect, the connection will be accepted and a new internal socket
-  // will be added.
-  void AddInternalServerSocket(rtc::AsyncSocket* socket,
-                               ProtocolType proto);
-  // Specifies the factory to use for creating external sockets.
-  void SetExternalSocketFactory(rtc::PacketSocketFactory* factory,
-                                const rtc::SocketAddress& address);
-  // For testing only.
-  std::string SetTimestampForNextNonce(int64_t timestamp) {
-    ts_for_next_nonce_ = timestamp;
-    return GenerateNonce(timestamp);
-  }
-
- private:
-  std::string GenerateNonce(int64_t now) const;
-  void OnInternalPacket(rtc::AsyncPacketSocket* socket, const char* data,
-                        size_t size, const rtc::SocketAddress& address,
-                        const rtc::PacketTime& packet_time);
-
-  void OnNewInternalConnection(rtc::AsyncSocket* socket);
-
-  // Accept connections on this server socket.
-  void AcceptConnection(rtc::AsyncSocket* server_socket);
-  void OnInternalSocketClose(rtc::AsyncPacketSocket* socket, int err);
-
-  void HandleStunMessage(
-      TurnServerConnection* conn, const char* data, size_t size);
-  void HandleBindingRequest(TurnServerConnection* conn, const StunMessage* msg);
-  void HandleAllocateRequest(TurnServerConnection* conn, const TurnMessage* msg,
-                             const std::string& key);
-
-  bool GetKey(const StunMessage* msg, std::string* key);
-  bool CheckAuthorization(TurnServerConnection* conn, const StunMessage* msg,
-                          const char* data, size_t size,
-                          const std::string& key);
-  bool ValidateNonce(const std::string& nonce) const;
-
-  TurnServerAllocation* FindAllocation(TurnServerConnection* conn);
-  TurnServerAllocation* CreateAllocation(
-      TurnServerConnection* conn, int proto, const std::string& key);
-
-  void SendErrorResponse(TurnServerConnection* conn, const StunMessage* req,
-                         int code, const std::string& reason);
-
-  void SendErrorResponseWithRealmAndNonce(TurnServerConnection* conn,
-                                          const StunMessage* req,
-                                          int code,
-                                          const std::string& reason);
-
-  void SendErrorResponseWithAlternateServer(TurnServerConnection* conn,
-                                            const StunMessage* req,
-                                            const rtc::SocketAddress& addr);
-
-  void SendStun(TurnServerConnection* conn, StunMessage* msg);
-  void Send(TurnServerConnection* conn, const rtc::ByteBufferWriter& buf);
-
-  void OnAllocationDestroyed(TurnServerAllocation* allocation);
-  void DestroyInternalSocket(rtc::AsyncPacketSocket* socket);
-
-  // Just clears |sockets_to_delete_|; called asynchronously.
-  void FreeSockets();
-
-  typedef std::map<rtc::AsyncPacketSocket*,
-                   ProtocolType> InternalSocketMap;
-  typedef std::map<rtc::AsyncSocket*,
-                   ProtocolType> ServerSocketMap;
-
-  rtc::Thread* thread_;
-  std::string nonce_key_;
-  std::string realm_;
-  std::string software_;
-  TurnAuthInterface* auth_hook_;
-  TurnRedirectInterface* redirect_hook_;
-  // otu - one-time-use. Server will respond with 438 if it's
-  // sees the same nonce in next transaction.
-  bool enable_otu_nonce_;
-  bool reject_private_addresses_ = false;
-  // Check for permission when receiving an external packet.
-  bool enable_permission_checks_ = true;
-
-  InternalSocketMap server_sockets_;
-  ServerSocketMap server_listen_sockets_;
-  // Used when we need to delete a socket asynchronously.
-  std::vector<std::unique_ptr<rtc::AsyncPacketSocket>> sockets_to_delete_;
-  std::unique_ptr<rtc::PacketSocketFactory> external_socket_factory_;
-  rtc::SocketAddress external_addr_;
-
-  AllocationMap allocations_;
-
-  rtc::AsyncInvoker invoker_;
-
-  // For testing only. If this is non-zero, the next NONCE will be generated
-  // from this value, and it will be reset to 0 after generating the NONCE.
-  int64_t ts_for_next_nonce_ = 0;
-
-  friend class TurnServerAllocation;
-};
-
-}  // namespace cricket
-
-#endif  // WEBRTC_P2P_BASE_TURNSERVER_H_
diff --git a/p2p/base/turnserver_unittest.cc b/p2p/base/turnserver_unittest.cc
deleted file mode 100644
index cac0a5c..0000000
--- a/p2p/base/turnserver_unittest.cc
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- *  Copyright 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/p2p/base/turnserver.h"
-#include "webrtc/p2p/base/basicpacketsocketfactory.h"
-#include "webrtc/rtc_base/gunit.h"
-#include "webrtc/rtc_base/virtualsocketserver.h"
-
-// NOTE: This is a work in progress. Currently this file only has tests for
-// TurnServerConnection, a primitive class used by TurnServer.
-
-namespace cricket {
-
-class TurnServerConnectionTest : public testing::Test {
- public:
-  TurnServerConnectionTest() : thread_(&vss_) {}
-
-  void ExpectEqual(const TurnServerConnection& a,
-                   const TurnServerConnection& b) {
-    EXPECT_TRUE(a == b);
-    EXPECT_FALSE(a < b);
-    EXPECT_FALSE(b < a);
-  }
-
-  void ExpectNotEqual(const TurnServerConnection& a,
-                      const TurnServerConnection& b) {
-    EXPECT_FALSE(a == b);
-    // We don't care which is less than the other, as long as only one is less
-    // than the other.
-    EXPECT_TRUE((a < b) != (b < a));
-  }
-
- protected:
-  rtc::VirtualSocketServer vss_;
-  rtc::AutoSocketServerThread thread_;
-  // Since this is constructed after |thread_|, it will pick up |threads_|'s
-  // socket server.
-  rtc::BasicPacketSocketFactory socket_factory_;
-};
-
-TEST_F(TurnServerConnectionTest, ComparisonOperators) {
-  std::unique_ptr<rtc::AsyncPacketSocket> socket1(
-      socket_factory_.CreateUdpSocket(rtc::SocketAddress("1.1.1.1", 1), 0, 0));
-  std::unique_ptr<rtc::AsyncPacketSocket> socket2(
-      socket_factory_.CreateUdpSocket(rtc::SocketAddress("2.2.2.2", 2), 0, 0));
-  TurnServerConnection connection1(socket2->GetLocalAddress(), PROTO_UDP,
-                                   socket1.get());
-  TurnServerConnection connection2(socket2->GetLocalAddress(), PROTO_UDP,
-                                   socket1.get());
-  TurnServerConnection connection3(socket1->GetLocalAddress(), PROTO_UDP,
-                                   socket2.get());
-  TurnServerConnection connection4(socket2->GetLocalAddress(), PROTO_TCP,
-                                   socket1.get());
-  ExpectEqual(connection1, connection2);
-  ExpectNotEqual(connection1, connection3);
-  ExpectNotEqual(connection1, connection4);
-}
-
-}  // namespace cricket
diff --git a/p2p/base/udpport.h b/p2p/base/udpport.h
deleted file mode 100644
index 9f86864..0000000
--- a/p2p/base/udpport.h
+++ /dev/null
@@ -1,17 +0,0 @@
-/*
- *  Copyright 2004 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_P2P_BASE_UDPPORT_H_
-#define WEBRTC_P2P_BASE_UDPPORT_H_
-
-// StunPort will be handling UDPPort functionality.
-#include "webrtc/p2p/base/stunport.h"
-
-#endif  // WEBRTC_P2P_BASE_UDPPORT_H_
diff --git a/p2p/base/udptransport.cc b/p2p/base/udptransport.cc
deleted file mode 100644
index 3df47ad..0000000
--- a/p2p/base/udptransport.cc
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- *  Copyright 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/p2p/base/udptransport.h"
-
-#include <string>
-#include <utility>  // For std::move.
-
-#include "webrtc/rtc_base/asyncpacketsocket.h"
-#include "webrtc/rtc_base/asyncudpsocket.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/socketaddress.h"
-#include "webrtc/rtc_base/thread.h"
-#include "webrtc/rtc_base/thread_checker.h"
-
-namespace cricket {
-
-UdpTransport::UdpTransport(const std::string& transport_name,
-                           std::unique_ptr<rtc::AsyncPacketSocket> socket)
-    : transport_name_(transport_name), socket_(std::move(socket)) {
-  RTC_DCHECK(socket_);
-  socket_->SignalReadPacket.connect(this, &UdpTransport::OnSocketReadPacket);
-  socket_->SignalSentPacket.connect(this, &UdpTransport::OnSocketSentPacket);
-}
-
-UdpTransport::~UdpTransport() {
-  RTC_DCHECK_RUN_ON(&network_thread_checker_);
-}
-
-rtc::SocketAddress UdpTransport::GetLocalAddress() const {
-  RTC_DCHECK_RUN_ON(&network_thread_checker_);
-  return socket_->GetLocalAddress();
-}
-
-bool UdpTransport::SetRemoteAddress(const rtc::SocketAddress& addr) {
-  RTC_DCHECK_RUN_ON(&network_thread_checker_);
-  if (!addr.IsComplete()) {
-    LOG(LS_WARNING) << "Remote address not complete.";
-    return false;
-  }
-  // TODO(johan): check for ipv4, other settings.
-  bool prev_destination_nil = remote_address_.IsNil();
-  remote_address_ = addr;
-  // Going from "didn't have destination" to "have destination" or vice versa.
-  if (prev_destination_nil != remote_address_.IsNil()) {
-    SignalWritableState(this);
-    if (prev_destination_nil) {
-      SignalReadyToSend(this);
-    }
-  }
-  return true;
-}
-
-rtc::SocketAddress UdpTransport::GetRemoteAddress() const {
-  RTC_DCHECK_RUN_ON(&network_thread_checker_);
-  return remote_address_;
-}
-
-bool UdpTransport::writable() const {
-  RTC_DCHECK_RUN_ON(&network_thread_checker_);
-  return !remote_address_.IsNil();
-}
-
-int UdpTransport::SendPacket(const char* data,
-                             size_t len,
-                             const rtc::PacketOptions& options,
-                             int flags) {
-  // No thread_checker in high frequency network function.
-  if (remote_address_.IsNil()) {
-    LOG(LS_WARNING) << "Remote address not set.";
-    send_error_ = ENOTCONN;
-    return -1;
-  }
-  int result =
-      socket_->SendTo((const void*)data, len, remote_address_, options);
-  if (result <= 0) {
-    LOG(LS_VERBOSE) << "SendPacket() " << result;
-  }
-  return result;
-}
-
-void UdpTransport::OnSocketReadPacket(rtc::AsyncPacketSocket* socket,
-                                      const char* data,
-                                      size_t len,
-                                      const rtc::SocketAddress& remote_addr,
-                                      const rtc::PacketTime& packet_time) {
-  // No thread_checker in high frequency network function.
-  SignalReadPacket(this, data, len, packet_time, 0);
-}
-
-void UdpTransport::OnSocketSentPacket(rtc::AsyncPacketSocket* socket,
-                                      const rtc::SentPacket& packet) {
-  RTC_DCHECK_EQ(socket_.get(), socket);
-  SignalSentPacket(this, packet);
-}
-
-}  // namespace cricket
diff --git a/p2p/base/udptransport.h b/p2p/base/udptransport.h
deleted file mode 100644
index 823c88f..0000000
--- a/p2p/base/udptransport.h
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- *  Copyright 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_P2P_BASE_UDPTRANSPORT_H_
-#define WEBRTC_P2P_BASE_UDPTRANSPORT_H_
-
-#include <memory>
-#include <string>
-
-#include "webrtc/api/optional.h"
-#include "webrtc/api/ortc/udptransportinterface.h"
-#include "webrtc/p2p/base/packettransportinternal.h"
-#include "webrtc/rtc_base/asyncpacketsocket.h"  // For PacketOptions.
-#include "webrtc/rtc_base/thread_checker.h"
-
-namespace rtc {
-class AsyncPacketSocket;
-struct PacketTime;
-struct SentPacket;
-class SocketAddress;
-}
-
-namespace cricket {
-
-// Implementation of UdpTransportInterface.
-// Used by OrtcFactory.
-class UdpTransport : public rtc::PacketTransportInternal,
-                     public webrtc::UdpTransportInterface {
- public:
-  // |transport_name| is only used for identification/logging.
-  // |socket| must be non-null.
-  UdpTransport(const std::string& transport_name,
-               std::unique_ptr<rtc::AsyncPacketSocket> socket);
-  ~UdpTransport();
-
-  // Overrides of UdpTransportInterface, used by the API consumer.
-  rtc::SocketAddress GetLocalAddress() const override;
-  bool SetRemoteAddress(const rtc::SocketAddress& addr) override;
-  rtc::SocketAddress GetRemoteAddress() const override;
-
-  // Overrides of PacketTransportInternal, used by webrtc internally.
-  std::string debug_name() const override { return transport_name_; }
-
-  bool receiving() const override {
-    // TODO(johan): Implement method and signal.
-    return true;
-  }
-
-  bool writable() const override;
-
-  int SendPacket(const char* data,
-                 size_t len,
-                 const rtc::PacketOptions& options,
-                 int flags) override;
-
-  int SetOption(rtc::Socket::Option opt, int value) override { return 0; }
-
-  int GetError() override { return send_error_; }
-
- protected:
-  PacketTransportInternal* GetInternal() override { return this; }
-
- private:
-  void OnSocketReadPacket(rtc::AsyncPacketSocket* socket,
-                          const char* data,
-                          size_t len,
-                          const rtc::SocketAddress& remote_addr,
-                          const rtc::PacketTime& packet_time);
-  void OnSocketSentPacket(rtc::AsyncPacketSocket* socket,
-                          const rtc::SentPacket& packet);
-  bool IsLocalConsistent();
-  std::string transport_name_;
-  int send_error_ = 0;
-  std::unique_ptr<rtc::AsyncPacketSocket> socket_;
-  // If not set, will be an "nil" address ("IsNil" returns true).
-  rtc::SocketAddress remote_address_;
-  rtc::ThreadChecker network_thread_checker_;
-};
-
-}  // namespace cricket
-
-#endif  // WEBRTC_P2P_BASE_UDPTRANSPORT_H_
diff --git a/p2p/base/udptransport_unittest.cc b/p2p/base/udptransport_unittest.cc
deleted file mode 100644
index 27455e4..0000000
--- a/p2p/base/udptransport_unittest.cc
+++ /dev/null
@@ -1,189 +0,0 @@
-/*
- *  Copyright 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 <algorithm>
-#include <list>
-#include <memory>
-#include <utility>
-#include <vector>
-
-#include "webrtc/p2p/base/basicpacketsocketfactory.h"
-#include "webrtc/p2p/base/packettransportinternal.h"
-#include "webrtc/p2p/base/udptransport.h"
-#include "webrtc/rtc_base/asyncpacketsocket.h"
-#include "webrtc/rtc_base/gunit.h"
-#include "webrtc/rtc_base/ipaddress.h"
-#include "webrtc/rtc_base/socketaddress.h"
-#include "webrtc/rtc_base/socketserver.h"
-#include "webrtc/rtc_base/thread.h"
-#include "webrtc/rtc_base/virtualsocketserver.h"
-
-namespace cricket {
-
-constexpr int kTimeoutMs = 10000;
-static const rtc::IPAddress kIPv4LocalHostAddress =
-    rtc::IPAddress(0x7F000001);  // 127.0.0.1
-
-class UdpTransportTest : public testing::Test, public sigslot::has_slots<> {
- public:
-  UdpTransportTest()
-      : virtual_socket_server_(new rtc::VirtualSocketServer()),
-        network_thread_(virtual_socket_server_.get()),
-        ep1_("Name1",
-             std::unique_ptr<rtc::AsyncPacketSocket>(
-                 socket_factory_.CreateUdpSocket(
-                     rtc::SocketAddress(rtc::GetAnyIP(AF_INET), 0),
-                     0,
-                     0))),
-        ep2_("Name2",
-             std::unique_ptr<rtc::AsyncPacketSocket>(
-                 socket_factory_.CreateUdpSocket(
-                     rtc::SocketAddress(rtc::GetAnyIP(AF_INET), 0),
-                     0,
-                     0))) {
-    // Setup IP Address for outgoing packets from sockets bound to IPV4
-    // INADDR_ANY ("0.0.0.0."), as used above when creating the virtual
-    // sockets. The virtual socket server sends these packets only if the
-    // default address is explicit set. With a physical socket, the actual
-    // network stack / operating system would set the IP address for outgoing
-    // packets.
-    virtual_socket_server_->SetDefaultRoute(kIPv4LocalHostAddress);
-  }
-
-  struct Endpoint : public sigslot::has_slots<> {
-    explicit Endpoint(std::string tch_name,
-                      std::unique_ptr<rtc::AsyncPacketSocket> socket) {
-      ch_.reset(new UdpTransport(std::move(tch_name), std::move(socket)));
-      ch_->SignalReadPacket.connect(this, &Endpoint::OnReadPacket);
-      ch_->SignalSentPacket.connect(this, &Endpoint::OnSentPacket);
-      ch_->SignalReadyToSend.connect(this, &Endpoint::OnReadyToSend);
-      ch_->SignalWritableState.connect(this, &Endpoint::OnWritableState);
-    }
-
-    bool CheckData(const char* data, int len) {
-      bool ret = false;
-      if (!ch_packets_.empty()) {
-        std::string packet = ch_packets_.front();
-        ret = (packet == std::string(data, len));
-        ch_packets_.pop_front();
-      }
-      return ret;
-    }
-
-    void OnWritableState(rtc::PacketTransportInternal* transport) {
-      num_sig_writable_++;
-    }
-
-    void OnReadyToSend(rtc::PacketTransportInternal* transport) {
-      num_sig_ready_to_send_++;
-    }
-
-    void OnReadPacket(rtc::PacketTransportInternal* transport,
-                      const char* data,
-                      size_t len,
-                      const rtc::PacketTime& packet_time,
-                      int flags) {
-      num_received_packets_++;
-      LOG(LS_VERBOSE) << "OnReadPacket (unittest)";
-      ch_packets_.push_front(std::string(data, len));
-    }
-
-    void OnSentPacket(rtc::PacketTransportInternal* transport,
-                      const rtc::SentPacket&) {
-      num_sig_sent_packets_++;
-    }
-
-    int SendData(const char* data, size_t len) {
-      rtc::PacketOptions options;
-      return ch_->SendPacket(data, len, options, 0);
-    }
-
-    void GetLocalPort(uint16_t* local_port) {
-      *local_port = ch_->GetLocalAddress().port();
-    }
-
-    std::list<std::string> ch_packets_;
-    std::unique_ptr<UdpTransport> ch_;
-    uint32_t num_received_packets_ = 0;   // Increases on SignalReadPacket.
-    uint32_t num_sig_sent_packets_ = 0;   // Increases on SignalSentPacket.
-    uint32_t num_sig_writable_ = 0;       // Increases on SignalWritable.
-    uint32_t num_sig_ready_to_send_ = 0;  // Increases on SignalReadyToSend.
-  };
-
-  std::unique_ptr<rtc::VirtualSocketServer> virtual_socket_server_;
-  rtc::AutoSocketServerThread network_thread_;
-  // Uses current thread's socket server, which will be set by ss_scope_.
-  rtc::BasicPacketSocketFactory socket_factory_;
-
-  Endpoint ep1_;
-  Endpoint ep2_;
-
-  void TestSendRecv() {
-    for (uint32_t i = 0; i < 5; ++i) {
-      static const char* data = "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
-      int len = static_cast<int>(strlen(data));
-      // local_channel <==> remote_channel
-      EXPECT_EQ_WAIT(len, ep1_.SendData(data, len), kTimeoutMs);
-      EXPECT_TRUE_WAIT(ep2_.CheckData(data, len), kTimeoutMs);
-      EXPECT_EQ_WAIT(i + 1u, ep2_.num_received_packets_, kTimeoutMs);
-      EXPECT_EQ_WAIT(len, ep2_.SendData(data, len), kTimeoutMs);
-      EXPECT_TRUE_WAIT(ep1_.CheckData(data, len), kTimeoutMs);
-      EXPECT_EQ_WAIT(i + 1u, ep1_.num_received_packets_, kTimeoutMs);
-    }
-  }
-};
-
-TEST_F(UdpTransportTest, AddressGetters) {
-  // Initially, remote address should be nil but local address shouldn't be.
-  EXPECT_FALSE(ep1_.ch_->GetLocalAddress().IsNil());
-  EXPECT_TRUE(ep1_.ch_->GetRemoteAddress().IsNil());
-  rtc::SocketAddress destination("127.0.0.1", 1337);
-  ASSERT_TRUE(ep1_.ch_->SetRemoteAddress(destination));
-  EXPECT_EQ(destination, ep1_.ch_->GetRemoteAddress());
-}
-
-// Setting an invalid address should fail and have no effect.
-TEST_F(UdpTransportTest, SettingIncompleteRemoteAddressFails) {
-  EXPECT_FALSE(ep1_.ch_->SetRemoteAddress(rtc::SocketAddress("127.0.0.1", 0)));
-  EXPECT_TRUE(ep1_.ch_->GetRemoteAddress().IsNil());
-}
-
-TEST_F(UdpTransportTest, SendRecvBasic) {
-  uint16_t port;
-  ep2_.GetLocalPort(&port);
-  rtc::SocketAddress addr2 = rtc::SocketAddress("127.0.0.1", port);
-  EXPECT_TRUE(ep1_.ch_->SetRemoteAddress(addr2));
-  ep1_.GetLocalPort(&port);
-  rtc::SocketAddress addr1 = rtc::SocketAddress("127.0.0.1", port);
-  EXPECT_TRUE(ep2_.ch_->SetRemoteAddress(addr1));
-  TestSendRecv();
-}
-
-// Test the signals and state methods used internally by causing a UdpTransport
-// to send a packet to itself.
-TEST_F(UdpTransportTest, StatusAndSignals) {
-  EXPECT_EQ(0u, ep1_.num_sig_writable_);
-  EXPECT_EQ(0u, ep1_.num_sig_ready_to_send_);
-  // Loopback
-  EXPECT_TRUE(!ep1_.ch_->writable());
-  rtc::SocketAddress addr = ep1_.ch_->GetLocalAddress();
-  // Keep port, but explicitly set IP.
-  addr.SetIP("127.0.0.1");
-  ep1_.ch_->SetRemoteAddress(addr);
-  EXPECT_TRUE(ep1_.ch_->writable());
-  EXPECT_EQ(1u, ep1_.num_sig_writable_);
-  EXPECT_EQ(1u, ep1_.num_sig_ready_to_send_);
-  const char data[] = "abc";
-  ep1_.SendData(data, sizeof(data));
-  EXPECT_EQ_WAIT(1u, ep1_.ch_packets_.size(), kTimeoutMs);
-  EXPECT_EQ_WAIT(1u, ep1_.num_sig_sent_packets_, kTimeoutMs);
-}
-
-}  // namespace cricket
diff --git a/p2p/client/basicportallocator.cc b/p2p/client/basicportallocator.cc
deleted file mode 100644
index 992aee6..0000000
--- a/p2p/client/basicportallocator.cc
+++ /dev/null
@@ -1,1581 +0,0 @@
-/*
- *  Copyright 2004 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/p2p/client/basicportallocator.h"
-
-#include <algorithm>
-#include <string>
-#include <vector>
-
-#include "webrtc/api/umametrics.h"
-#include "webrtc/p2p/base/basicpacketsocketfactory.h"
-#include "webrtc/p2p/base/common.h"
-#include "webrtc/p2p/base/port.h"
-#include "webrtc/p2p/base/relayport.h"
-#include "webrtc/p2p/base/stunport.h"
-#include "webrtc/p2p/base/tcpport.h"
-#include "webrtc/p2p/base/turnport.h"
-#include "webrtc/p2p/base/udpport.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/helpers.h"
-#include "webrtc/rtc_base/logging.h"
-
-using rtc::CreateRandomId;
-
-namespace {
-
-enum {
-  MSG_CONFIG_START,
-  MSG_CONFIG_READY,
-  MSG_ALLOCATE,
-  MSG_ALLOCATION_PHASE,
-  MSG_SEQUENCEOBJECTS_CREATED,
-  MSG_CONFIG_STOP,
-};
-
-const int PHASE_UDP = 0;
-const int PHASE_RELAY = 1;
-const int PHASE_TCP = 2;
-const int PHASE_SSLTCP = 3;
-
-const int kNumPhases = 4;
-
-// Gets protocol priority: UDP > TCP > SSLTCP == TLS.
-int GetProtocolPriority(cricket::ProtocolType protocol) {
-  switch (protocol) {
-    case cricket::PROTO_UDP:
-      return 2;
-    case cricket::PROTO_TCP:
-      return 1;
-    case cricket::PROTO_SSLTCP:
-    case cricket::PROTO_TLS:
-      return 0;
-    default:
-      RTC_NOTREACHED();
-      return 0;
-  }
-}
-// Gets address family priority:  IPv6 > IPv4 > Unspecified.
-int GetAddressFamilyPriority(int ip_family) {
-  switch (ip_family) {
-    case AF_INET6:
-      return 2;
-    case AF_INET:
-      return 1;
-    default:
-      RTC_NOTREACHED();
-      return 0;
-  }
-}
-
-// Returns positive if a is better, negative if b is better, and 0 otherwise.
-int ComparePort(const cricket::Port* a, const cricket::Port* b) {
-  int a_protocol = GetProtocolPriority(a->GetProtocol());
-  int b_protocol = GetProtocolPriority(b->GetProtocol());
-  int cmp_protocol = a_protocol - b_protocol;
-  if (cmp_protocol != 0) {
-    return cmp_protocol;
-  }
-
-  int a_family = GetAddressFamilyPriority(a->Network()->GetBestIP().family());
-  int b_family = GetAddressFamilyPriority(b->Network()->GetBestIP().family());
-  return a_family - b_family;
-}
-
-}  // namespace
-
-namespace cricket {
-const uint32_t DISABLE_ALL_PHASES =
-    PORTALLOCATOR_DISABLE_UDP | PORTALLOCATOR_DISABLE_TCP |
-    PORTALLOCATOR_DISABLE_STUN | PORTALLOCATOR_DISABLE_RELAY;
-
-// BasicPortAllocator
-BasicPortAllocator::BasicPortAllocator(rtc::NetworkManager* network_manager,
-                                       rtc::PacketSocketFactory* socket_factory)
-    : network_manager_(network_manager), socket_factory_(socket_factory) {
-  RTC_DCHECK(network_manager_ != nullptr);
-  RTC_DCHECK(socket_factory_ != nullptr);
-  Construct();
-}
-
-BasicPortAllocator::BasicPortAllocator(rtc::NetworkManager* network_manager)
-    : network_manager_(network_manager), socket_factory_(nullptr) {
-  RTC_DCHECK(network_manager_ != nullptr);
-  Construct();
-}
-
-BasicPortAllocator::BasicPortAllocator(rtc::NetworkManager* network_manager,
-                                       rtc::PacketSocketFactory* socket_factory,
-                                       const ServerAddresses& stun_servers)
-    : network_manager_(network_manager), socket_factory_(socket_factory) {
-  RTC_DCHECK(socket_factory_ != NULL);
-  SetConfiguration(stun_servers, std::vector<RelayServerConfig>(), 0, false);
-  Construct();
-}
-
-BasicPortAllocator::BasicPortAllocator(
-    rtc::NetworkManager* network_manager,
-    const ServerAddresses& stun_servers,
-    const rtc::SocketAddress& relay_address_udp,
-    const rtc::SocketAddress& relay_address_tcp,
-    const rtc::SocketAddress& relay_address_ssl)
-    : network_manager_(network_manager), socket_factory_(NULL) {
-  std::vector<RelayServerConfig> turn_servers;
-  RelayServerConfig config(RELAY_GTURN);
-  if (!relay_address_udp.IsNil()) {
-    config.ports.push_back(ProtocolAddress(relay_address_udp, PROTO_UDP));
-  }
-  if (!relay_address_tcp.IsNil()) {
-    config.ports.push_back(ProtocolAddress(relay_address_tcp, PROTO_TCP));
-  }
-  if (!relay_address_ssl.IsNil()) {
-    config.ports.push_back(ProtocolAddress(relay_address_ssl, PROTO_SSLTCP));
-  }
-
-  if (!config.ports.empty()) {
-    turn_servers.push_back(config);
-  }
-
-  SetConfiguration(stun_servers, turn_servers, 0, false);
-  Construct();
-}
-
-void BasicPortAllocator::Construct() {
-  allow_tcp_listen_ = true;
-}
-
-void BasicPortAllocator::OnIceRegathering(PortAllocatorSession* session,
-                                          IceRegatheringReason reason) {
-  if (!metrics_observer()) {
-    return;
-  }
-  // If the session has not been taken by an active channel, do not report the
-  // metric.
-  for (auto& allocator_session : pooled_sessions()) {
-    if (allocator_session.get() == session) {
-      return;
-    }
-  }
-
-  metrics_observer()->IncrementEnumCounter(
-      webrtc::kEnumCounterIceRegathering, static_cast<int>(reason),
-      static_cast<int>(IceRegatheringReason::MAX_VALUE));
-}
-
-BasicPortAllocator::~BasicPortAllocator() {
-  // Our created port allocator sessions depend on us, so destroy our remaining
-  // pooled sessions before anything else.
-  DiscardCandidatePool();
-}
-
-PortAllocatorSession* BasicPortAllocator::CreateSessionInternal(
-    const std::string& content_name, int component,
-    const std::string& ice_ufrag, const std::string& ice_pwd) {
-  PortAllocatorSession* session = new BasicPortAllocatorSession(
-      this, content_name, component, ice_ufrag, ice_pwd);
-  session->SignalIceRegathering.connect(this,
-                                        &BasicPortAllocator::OnIceRegathering);
-  return session;
-}
-
-void BasicPortAllocator::AddTurnServer(const RelayServerConfig& turn_server) {
-  std::vector<RelayServerConfig> new_turn_servers = turn_servers();
-  new_turn_servers.push_back(turn_server);
-  SetConfiguration(stun_servers(), new_turn_servers, candidate_pool_size(),
-                   prune_turn_ports());
-}
-
-// BasicPortAllocatorSession
-BasicPortAllocatorSession::BasicPortAllocatorSession(
-    BasicPortAllocator* allocator,
-    const std::string& content_name,
-    int component,
-    const std::string& ice_ufrag,
-    const std::string& ice_pwd)
-    : PortAllocatorSession(content_name,
-                           component,
-                           ice_ufrag,
-                           ice_pwd,
-                           allocator->flags()),
-      allocator_(allocator),
-      network_thread_(NULL),
-      socket_factory_(allocator->socket_factory()),
-      allocation_started_(false),
-      network_manager_started_(false),
-      allocation_sequences_created_(false),
-      prune_turn_ports_(allocator->prune_turn_ports()) {
-  allocator_->network_manager()->SignalNetworksChanged.connect(
-      this, &BasicPortAllocatorSession::OnNetworksChanged);
-  allocator_->network_manager()->StartUpdating();
-}
-
-BasicPortAllocatorSession::~BasicPortAllocatorSession() {
-  allocator_->network_manager()->StopUpdating();
-  if (network_thread_ != NULL)
-    network_thread_->Clear(this);
-
-  for (uint32_t i = 0; i < sequences_.size(); ++i) {
-    // AllocationSequence should clear it's map entry for turn ports before
-    // ports are destroyed.
-    sequences_[i]->Clear();
-  }
-
-  std::vector<PortData>::iterator it;
-  for (it = ports_.begin(); it != ports_.end(); it++)
-    delete it->port();
-
-  for (uint32_t i = 0; i < configs_.size(); ++i)
-    delete configs_[i];
-
-  for (uint32_t i = 0; i < sequences_.size(); ++i)
-    delete sequences_[i];
-}
-
-void BasicPortAllocatorSession::SetCandidateFilter(uint32_t filter) {
-  if (filter == candidate_filter_) {
-    return;
-  }
-  // We assume the filter will only change from "ALL" to something else.
-  RTC_DCHECK(candidate_filter_ == CF_ALL);
-  candidate_filter_ = filter;
-  for (PortData& port : ports_) {
-    if (!port.has_pairable_candidate()) {
-      continue;
-    }
-    const auto& candidates = port.port()->Candidates();
-    // Setting a filter may cause a ready port to become non-ready
-    // if it no longer has any pairable candidates.
-    if (!std::any_of(candidates.begin(), candidates.end(),
-                     [this, &port](const Candidate& candidate) {
-                       return CandidatePairable(candidate, port.port());
-                     })) {
-      port.set_has_pairable_candidate(false);
-    }
-  }
-}
-
-void BasicPortAllocatorSession::StartGettingPorts() {
-  network_thread_ = rtc::Thread::Current();
-  state_ = SessionState::GATHERING;
-  if (!socket_factory_) {
-    owned_socket_factory_.reset(
-        new rtc::BasicPacketSocketFactory(network_thread_));
-    socket_factory_ = owned_socket_factory_.get();
-  }
-
-  network_thread_->Post(RTC_FROM_HERE, this, MSG_CONFIG_START);
-
-  LOG(LS_INFO) << "Start getting ports with prune_turn_ports "
-               << (prune_turn_ports_ ? "enabled" : "disabled");
-}
-
-void BasicPortAllocatorSession::StopGettingPorts() {
-  RTC_DCHECK(rtc::Thread::Current() == network_thread_);
-  ClearGettingPorts();
-  // Note: this must be called after ClearGettingPorts because both may set the
-  // session state and we should set the state to STOPPED.
-  state_ = SessionState::STOPPED;
-}
-
-void BasicPortAllocatorSession::ClearGettingPorts() {
-  RTC_DCHECK(rtc::Thread::Current() == network_thread_);
-  network_thread_->Clear(this, MSG_ALLOCATE);
-  for (uint32_t i = 0; i < sequences_.size(); ++i) {
-    sequences_[i]->Stop();
-  }
-  network_thread_->Post(RTC_FROM_HERE, this, MSG_CONFIG_STOP);
-  state_ = SessionState::CLEARED;
-}
-
-std::vector<rtc::Network*> BasicPortAllocatorSession::GetFailedNetworks() {
-  std::vector<rtc::Network*> networks = GetNetworks();
-
-  // A network interface may have both IPv4 and IPv6 networks. Only if
-  // neither of the networks has any connections, the network interface
-  // is considered failed and need to be regathered on.
-  std::set<std::string> networks_with_connection;
-  for (const PortData& data : ports_) {
-    Port* port = data.port();
-    if (!port->connections().empty()) {
-      networks_with_connection.insert(port->Network()->name());
-    }
-  }
-
-  networks.erase(
-      std::remove_if(networks.begin(), networks.end(),
-                     [networks_with_connection](rtc::Network* network) {
-                       // If a network does not have any connection, it is
-                       // considered failed.
-                       return networks_with_connection.find(network->name()) !=
-                              networks_with_connection.end();
-                     }),
-      networks.end());
-  return networks;
-}
-
-void BasicPortAllocatorSession::RegatherOnFailedNetworks() {
-  // Find the list of networks that have no connection.
-  std::vector<rtc::Network*> failed_networks = GetFailedNetworks();
-  if (failed_networks.empty()) {
-    return;
-  }
-
-  LOG(LS_INFO) << "Regather candidates on failed networks";
-
-  // Mark a sequence as "network failed" if its network is in the list of failed
-  // networks, so that it won't be considered as equivalent when the session
-  // regathers ports and candidates.
-  for (AllocationSequence* sequence : sequences_) {
-    if (!sequence->network_failed() &&
-        std::find(failed_networks.begin(), failed_networks.end(),
-                  sequence->network()) != failed_networks.end()) {
-      sequence->set_network_failed();
-    }
-  }
-
-  bool disable_equivalent_phases = true;
-  Regather(failed_networks, disable_equivalent_phases,
-           IceRegatheringReason::NETWORK_FAILURE);
-}
-
-void BasicPortAllocatorSession::RegatherOnAllNetworks() {
-  std::vector<rtc::Network*> networks = GetNetworks();
-  if (networks.empty()) {
-    return;
-  }
-
-  LOG(LS_INFO) << "Regather candidates on all networks";
-
-  // We expect to generate candidates that are equivalent to what we have now.
-  // Force DoAllocate to generate them instead of skipping.
-  bool disable_equivalent_phases = false;
-  Regather(networks, disable_equivalent_phases,
-           IceRegatheringReason::OCCASIONAL_REFRESH);
-}
-
-void BasicPortAllocatorSession::Regather(
-    const std::vector<rtc::Network*>& networks,
-    bool disable_equivalent_phases,
-    IceRegatheringReason reason) {
-  // Remove ports from being used locally and send signaling to remove
-  // the candidates on the remote side.
-  std::vector<PortData*> ports_to_prune = GetUnprunedPorts(networks);
-  if (!ports_to_prune.empty()) {
-    LOG(LS_INFO) << "Prune " << ports_to_prune.size() << " ports";
-    PrunePortsAndRemoveCandidates(ports_to_prune);
-  }
-
-  if (allocation_started_ && network_manager_started_ && !IsStopped()) {
-    SignalIceRegathering(this, reason);
-
-    DoAllocate(disable_equivalent_phases);
-  }
-}
-
-std::vector<PortInterface*> BasicPortAllocatorSession::ReadyPorts() const {
-  std::vector<PortInterface*> ret;
-  for (const PortData& data : ports_) {
-    if (data.ready()) {
-      ret.push_back(data.port());
-    }
-  }
-  return ret;
-}
-
-std::vector<Candidate> BasicPortAllocatorSession::ReadyCandidates() const {
-  std::vector<Candidate> candidates;
-  for (const PortData& data : ports_) {
-    if (!data.ready()) {
-      continue;
-    }
-    GetCandidatesFromPort(data, &candidates);
-  }
-  return candidates;
-}
-
-void BasicPortAllocatorSession::GetCandidatesFromPort(
-    const PortData& data,
-    std::vector<Candidate>* candidates) const {
-  RTC_CHECK(candidates != nullptr);
-  for (const Candidate& candidate : data.port()->Candidates()) {
-    if (!CheckCandidateFilter(candidate)) {
-      continue;
-    }
-    ProtocolType pvalue;
-    if (!StringToProto(candidate.protocol().c_str(), &pvalue) ||
-        !data.sequence()->ProtocolEnabled(pvalue)) {
-      continue;
-    }
-    candidates->push_back(SanitizeRelatedAddress(candidate));
-  }
-}
-
-Candidate BasicPortAllocatorSession::SanitizeRelatedAddress(
-    const Candidate& c) const {
-  Candidate copy = c;
-  // If adapter enumeration is disabled or host candidates are disabled,
-  // clear the raddr of STUN candidates to avoid local address leakage.
-  bool filter_stun_related_address =
-      ((flags() & PORTALLOCATOR_DISABLE_ADAPTER_ENUMERATION) &&
-       (flags() & PORTALLOCATOR_DISABLE_DEFAULT_LOCAL_CANDIDATE)) ||
-      !(candidate_filter_ & CF_HOST);
-  // If the candidate filter doesn't allow reflexive addresses, empty TURN raddr
-  // to avoid reflexive address leakage.
-  bool filter_turn_related_address = !(candidate_filter_ & CF_REFLEXIVE);
-  if ((c.type() == STUN_PORT_TYPE && filter_stun_related_address) ||
-      (c.type() == RELAY_PORT_TYPE && filter_turn_related_address)) {
-    copy.set_related_address(
-        rtc::EmptySocketAddressWithFamily(copy.address().family()));
-  }
-  return copy;
-}
-
-bool BasicPortAllocatorSession::CandidatesAllocationDone() const {
-  // Done only if all required AllocationSequence objects
-  // are created.
-  if (!allocation_sequences_created_) {
-    return false;
-  }
-
-  // Check that all port allocation sequences are complete (not running).
-  if (std::any_of(sequences_.begin(), sequences_.end(),
-                  [](const AllocationSequence* sequence) {
-                    return sequence->state() == AllocationSequence::kRunning;
-                  })) {
-    return false;
-  }
-
-  // If all allocated ports are no longer gathering, session must have got all
-  // expected candidates. Session will trigger candidates allocation complete
-  // signal.
-  return std::none_of(ports_.begin(), ports_.end(),
-                      [](const PortData& port) { return port.inprogress(); });
-}
-
-void BasicPortAllocatorSession::OnMessage(rtc::Message *message) {
-  switch (message->message_id) {
-  case MSG_CONFIG_START:
-    RTC_DCHECK(rtc::Thread::Current() == network_thread_);
-    GetPortConfigurations();
-    break;
-  case MSG_CONFIG_READY:
-    RTC_DCHECK(rtc::Thread::Current() == network_thread_);
-    OnConfigReady(static_cast<PortConfiguration*>(message->pdata));
-    break;
-  case MSG_ALLOCATE:
-    RTC_DCHECK(rtc::Thread::Current() == network_thread_);
-    OnAllocate();
-    break;
-  case MSG_SEQUENCEOBJECTS_CREATED:
-    RTC_DCHECK(rtc::Thread::Current() == network_thread_);
-    OnAllocationSequenceObjectsCreated();
-    break;
-  case MSG_CONFIG_STOP:
-    RTC_DCHECK(rtc::Thread::Current() == network_thread_);
-    OnConfigStop();
-    break;
-  default:
-    RTC_NOTREACHED();
-  }
-}
-
-void BasicPortAllocatorSession::UpdateIceParametersInternal() {
-  for (PortData& port : ports_) {
-    port.port()->set_content_name(content_name());
-    port.port()->SetIceParameters(component(), ice_ufrag(), ice_pwd());
-  }
-}
-
-void BasicPortAllocatorSession::GetPortConfigurations() {
-  PortConfiguration* config = new PortConfiguration(allocator_->stun_servers(),
-                                                    username(),
-                                                    password());
-
-  for (const RelayServerConfig& turn_server : allocator_->turn_servers()) {
-    config->AddRelay(turn_server);
-  }
-  ConfigReady(config);
-}
-
-void BasicPortAllocatorSession::ConfigReady(PortConfiguration* config) {
-  network_thread_->Post(RTC_FROM_HERE, this, MSG_CONFIG_READY, config);
-}
-
-// Adds a configuration to the list.
-void BasicPortAllocatorSession::OnConfigReady(PortConfiguration* config) {
-  if (config) {
-    configs_.push_back(config);
-  }
-
-  AllocatePorts();
-}
-
-void BasicPortAllocatorSession::OnConfigStop() {
-  RTC_DCHECK(rtc::Thread::Current() == network_thread_);
-
-  // If any of the allocated ports have not completed the candidates allocation,
-  // mark those as error. Since session doesn't need any new candidates
-  // at this stage of the allocation, it's safe to discard any new candidates.
-  bool send_signal = false;
-  for (std::vector<PortData>::iterator it = ports_.begin();
-       it != ports_.end(); ++it) {
-    if (it->inprogress()) {
-      // Updating port state to error, which didn't finish allocating candidates
-      // yet.
-      it->set_error();
-      send_signal = true;
-    }
-  }
-
-  // Did we stop any running sequences?
-  for (std::vector<AllocationSequence*>::iterator it = sequences_.begin();
-       it != sequences_.end() && !send_signal; ++it) {
-    if ((*it)->state() == AllocationSequence::kStopped) {
-      send_signal = true;
-    }
-  }
-
-  // If we stopped anything that was running, send a done signal now.
-  if (send_signal) {
-    MaybeSignalCandidatesAllocationDone();
-  }
-}
-
-void BasicPortAllocatorSession::AllocatePorts() {
-  RTC_DCHECK(rtc::Thread::Current() == network_thread_);
-  network_thread_->Post(RTC_FROM_HERE, this, MSG_ALLOCATE);
-}
-
-void BasicPortAllocatorSession::OnAllocate() {
-  if (network_manager_started_ && !IsStopped()) {
-    bool disable_equivalent_phases = true;
-    DoAllocate(disable_equivalent_phases);
-  }
-
-  allocation_started_ = true;
-}
-
-std::vector<rtc::Network*> BasicPortAllocatorSession::GetNetworks() {
-  std::vector<rtc::Network*> networks;
-  rtc::NetworkManager* network_manager = allocator_->network_manager();
-  RTC_DCHECK(network_manager != nullptr);
-  // If the network permission state is BLOCKED, we just act as if the flag has
-  // been passed in.
-  if (network_manager->enumeration_permission() ==
-      rtc::NetworkManager::ENUMERATION_BLOCKED) {
-    set_flags(flags() | PORTALLOCATOR_DISABLE_ADAPTER_ENUMERATION);
-  }
-  // If the adapter enumeration is disabled, we'll just bind to any address
-  // instead of specific NIC. This is to ensure the same routing for http
-  // traffic by OS is also used here to avoid any local or public IP leakage
-  // during stun process.
-  if (flags() & PORTALLOCATOR_DISABLE_ADAPTER_ENUMERATION) {
-    network_manager->GetAnyAddressNetworks(&networks);
-  } else {
-    network_manager->GetNetworks(&networks);
-    // If network enumeration fails, use the ANY address as a fallback, so we
-    // can at least try gathering candidates using the default route chosen by
-    // the OS. Or, if the PORTALLOCATOR_ENABLE_ANY_ADDRESS_PORTS flag is
-    // set, we'll use ANY address candidates either way.
-    if (networks.empty() || flags() & PORTALLOCATOR_ENABLE_ANY_ADDRESS_PORTS) {
-      network_manager->GetAnyAddressNetworks(&networks);
-    }
-  }
-  // Do some more filtering, depending on the network ignore mask and "disable
-  // costly networks" flag.
-  networks.erase(std::remove_if(networks.begin(), networks.end(),
-                                [this](rtc::Network* network) {
-                                  return allocator_->network_ignore_mask() &
-                                         network->type();
-                                }),
-                 networks.end());
-  if (flags() & PORTALLOCATOR_DISABLE_COSTLY_NETWORKS) {
-    uint16_t lowest_cost = rtc::kNetworkCostMax;
-    for (rtc::Network* network : networks) {
-      lowest_cost = std::min<uint16_t>(lowest_cost, network->GetCost());
-    }
-    networks.erase(std::remove_if(networks.begin(), networks.end(),
-                                  [lowest_cost](rtc::Network* network) {
-                                    return network->GetCost() >
-                                           lowest_cost + rtc::kNetworkCostLow;
-                                  }),
-                   networks.end());
-  }
-  // Lastly, if we have a limit for the number of IPv6 network interfaces (by
-  // default, it's 5), remove networks to ensure that limit is satisfied.
-  //
-  // TODO(deadbeef): Instead of just taking the first N arbitrary IPv6
-  // networks, we could try to choose a set that's "most likely to work". It's
-  // hard to define what that means though; it's not just "lowest cost".
-  // Alternatively, we could just focus on making our ICE pinging logic smarter
-  // such that this filtering isn't necessary in the first place.
-  int ipv6_networks = 0;
-  for (auto it = networks.begin(); it != networks.end();) {
-    if ((*it)->prefix().family() == AF_INET6) {
-      if (ipv6_networks >= allocator_->max_ipv6_networks()) {
-        it = networks.erase(it);
-        continue;
-      } else {
-        ++ipv6_networks;
-      }
-    }
-    ++it;
-  }
-  return networks;
-}
-
-// For each network, see if we have a sequence that covers it already.  If not,
-// create a new sequence to create the appropriate ports.
-void BasicPortAllocatorSession::DoAllocate(bool disable_equivalent) {
-  bool done_signal_needed = false;
-  std::vector<rtc::Network*> networks = GetNetworks();
-  if (networks.empty()) {
-    LOG(LS_WARNING) << "Machine has no networks; no ports will be allocated";
-    done_signal_needed = true;
-  } else {
-    LOG(LS_INFO) << "Allocate ports on "<< networks.size() << " networks";
-    PortConfiguration* config = configs_.empty() ? nullptr : configs_.back();
-    for (uint32_t i = 0; i < networks.size(); ++i) {
-      uint32_t sequence_flags = flags();
-      if ((sequence_flags & DISABLE_ALL_PHASES) == DISABLE_ALL_PHASES) {
-        // If all the ports are disabled we should just fire the allocation
-        // done event and return.
-        done_signal_needed = true;
-        break;
-      }
-
-      if (!config || config->relays.empty()) {
-        // No relay ports specified in this config.
-        sequence_flags |= PORTALLOCATOR_DISABLE_RELAY;
-      }
-
-      if (!(sequence_flags & PORTALLOCATOR_ENABLE_IPV6) &&
-          networks[i]->GetBestIP().family() == AF_INET6) {
-        // Skip IPv6 networks unless the flag's been set.
-        continue;
-      }
-
-      if (!(sequence_flags & PORTALLOCATOR_ENABLE_IPV6_ON_WIFI) &&
-          networks[i]->GetBestIP().family() == AF_INET6 &&
-          networks[i]->type() == rtc::ADAPTER_TYPE_WIFI) {
-        // Skip IPv6 Wi-Fi networks unless the flag's been set.
-        continue;
-      }
-
-      if (disable_equivalent) {
-        // Disable phases that would only create ports equivalent to
-        // ones that we have already made.
-        DisableEquivalentPhases(networks[i], config, &sequence_flags);
-
-        if ((sequence_flags & DISABLE_ALL_PHASES) == DISABLE_ALL_PHASES) {
-          // New AllocationSequence would have nothing to do, so don't make it.
-          continue;
-        }
-      }
-
-      AllocationSequence* sequence =
-          new AllocationSequence(this, networks[i], config, sequence_flags);
-      sequence->SignalPortAllocationComplete.connect(
-          this, &BasicPortAllocatorSession::OnPortAllocationComplete);
-      sequence->Init();
-      sequence->Start();
-      sequences_.push_back(sequence);
-      done_signal_needed = true;
-    }
-  }
-  if (done_signal_needed) {
-    network_thread_->Post(RTC_FROM_HERE, this, MSG_SEQUENCEOBJECTS_CREATED);
-  }
-}
-
-void BasicPortAllocatorSession::OnNetworksChanged() {
-  std::vector<rtc::Network*> networks = GetNetworks();
-  std::vector<rtc::Network*> failed_networks;
-  for (AllocationSequence* sequence : sequences_) {
-    // Mark the sequence as "network failed" if its network is not in
-    // |networks|.
-    if (!sequence->network_failed() &&
-        std::find(networks.begin(), networks.end(), sequence->network()) ==
-            networks.end()) {
-      sequence->OnNetworkFailed();
-      failed_networks.push_back(sequence->network());
-    }
-  }
-  std::vector<PortData*> ports_to_prune = GetUnprunedPorts(failed_networks);
-  if (!ports_to_prune.empty()) {
-    LOG(LS_INFO) << "Prune " << ports_to_prune.size()
-                 << " ports because their networks were gone";
-    PrunePortsAndRemoveCandidates(ports_to_prune);
-  }
-
-  if (allocation_started_ && !IsStopped()) {
-    if (network_manager_started_) {
-      // If the network manager has started, it must be regathering.
-      SignalIceRegathering(this, IceRegatheringReason::NETWORK_CHANGE);
-    }
-    bool disable_equivalent_phases = true;
-    DoAllocate(disable_equivalent_phases);
-  }
-
-  if (!network_manager_started_) {
-    LOG(LS_INFO) << "Network manager has started";
-    network_manager_started_ = true;
-  }
-}
-
-void BasicPortAllocatorSession::DisableEquivalentPhases(
-    rtc::Network* network,
-    PortConfiguration* config,
-    uint32_t* flags) {
-  for (uint32_t i = 0; i < sequences_.size() &&
-                           (*flags & DISABLE_ALL_PHASES) != DISABLE_ALL_PHASES;
-       ++i) {
-    sequences_[i]->DisableEquivalentPhases(network, config, flags);
-  }
-}
-
-void BasicPortAllocatorSession::AddAllocatedPort(Port* port,
-                                                 AllocationSequence * seq,
-                                                 bool prepare_address) {
-  if (!port)
-    return;
-
-  LOG(LS_INFO) << "Adding allocated port for " << content_name();
-  port->set_content_name(content_name());
-  port->set_component(component());
-  port->set_generation(generation());
-  if (allocator_->proxy().type != rtc::PROXY_NONE)
-    port->set_proxy(allocator_->user_agent(), allocator_->proxy());
-  port->set_send_retransmit_count_attribute(
-      (flags() & PORTALLOCATOR_ENABLE_STUN_RETRANSMIT_ATTRIBUTE) != 0);
-
-  PortData data(port, seq);
-  ports_.push_back(data);
-
-  port->SignalCandidateReady.connect(
-      this, &BasicPortAllocatorSession::OnCandidateReady);
-  port->SignalPortComplete.connect(this,
-      &BasicPortAllocatorSession::OnPortComplete);
-  port->SignalDestroyed.connect(this,
-      &BasicPortAllocatorSession::OnPortDestroyed);
-  port->SignalPortError.connect(
-      this, &BasicPortAllocatorSession::OnPortError);
-  LOG_J(LS_INFO, port) << "Added port to allocator";
-
-  if (prepare_address)
-    port->PrepareAddress();
-}
-
-void BasicPortAllocatorSession::OnAllocationSequenceObjectsCreated() {
-  allocation_sequences_created_ = true;
-  // Send candidate allocation complete signal if we have no sequences.
-  MaybeSignalCandidatesAllocationDone();
-}
-
-void BasicPortAllocatorSession::OnCandidateReady(
-    Port* port, const Candidate& c) {
-  RTC_DCHECK(rtc::Thread::Current() == network_thread_);
-  PortData* data = FindPort(port);
-  RTC_DCHECK(data != NULL);
-  LOG_J(LS_INFO, port) << "Gathered candidate: " << c.ToSensitiveString();
-  // Discarding any candidate signal if port allocation status is
-  // already done with gathering.
-  if (!data->inprogress()) {
-    LOG(LS_WARNING)
-        << "Discarding candidate because port is already done gathering.";
-    return;
-  }
-
-  // Mark that the port has a pairable candidate, either because we have a
-  // usable candidate from the port, or simply because the port is bound to the
-  // any address and therefore has no host candidate. This will trigger the port
-  // to start creating candidate pairs (connections) and issue connectivity
-  // checks. If port has already been marked as having a pairable candidate,
-  // do nothing here.
-  // Note: We should check whether any candidates may become ready after this
-  // because there we will check whether the candidate is generated by the ready
-  // ports, which may include this port.
-  bool pruned = false;
-  if (CandidatePairable(c, port) && !data->has_pairable_candidate()) {
-    data->set_has_pairable_candidate(true);
-
-    if (prune_turn_ports_ && port->Type() == RELAY_PORT_TYPE) {
-      pruned = PruneTurnPorts(port);
-    }
-    // If the current port is not pruned yet, SignalPortReady.
-    if (!data->pruned()) {
-      LOG_J(LS_INFO, port) << "Port ready.";
-      SignalPortReady(this, port);
-      port->KeepAliveUntilPruned();
-    }
-  }
-
-  ProtocolType pvalue;
-  bool candidate_protocol_enabled =
-      StringToProto(c.protocol().c_str(), &pvalue) &&
-      data->sequence()->ProtocolEnabled(pvalue);
-
-  if (data->ready() && CheckCandidateFilter(c) && candidate_protocol_enabled) {
-    std::vector<Candidate> candidates;
-    candidates.push_back(SanitizeRelatedAddress(c));
-    SignalCandidatesReady(this, candidates);
-  } else if (!candidate_protocol_enabled) {
-    LOG(LS_INFO)
-        << "Not yet signaling candidate because protocol is not yet enabled.";
-  } else {
-    LOG(LS_INFO) << "Discarding candidate because it doesn't match filter.";
-  }
-
-  // If we have pruned any port, maybe need to signal port allocation done.
-  if (pruned) {
-    MaybeSignalCandidatesAllocationDone();
-  }
-}
-
-Port* BasicPortAllocatorSession::GetBestTurnPortForNetwork(
-    const std::string& network_name) const {
-  Port* best_turn_port = nullptr;
-  for (const PortData& data : ports_) {
-    if (data.port()->Network()->name() == network_name &&
-        data.port()->Type() == RELAY_PORT_TYPE && data.ready() &&
-        (!best_turn_port || ComparePort(data.port(), best_turn_port) > 0)) {
-      best_turn_port = data.port();
-    }
-  }
-  return best_turn_port;
-}
-
-bool BasicPortAllocatorSession::PruneTurnPorts(Port* newly_pairable_turn_port) {
-  // Note: We determine the same network based only on their network names. So
-  // if an IPv4 address and an IPv6 address have the same network name, they
-  // are considered the same network here.
-  const std::string& network_name = newly_pairable_turn_port->Network()->name();
-  Port* best_turn_port = GetBestTurnPortForNetwork(network_name);
-  // |port| is already in the list of ports, so the best port cannot be nullptr.
-  RTC_CHECK(best_turn_port != nullptr);
-
-  bool pruned = false;
-  std::vector<PortData*> ports_to_prune;
-  for (PortData& data : ports_) {
-    if (data.port()->Network()->name() == network_name &&
-        data.port()->Type() == RELAY_PORT_TYPE && !data.pruned() &&
-        ComparePort(data.port(), best_turn_port) < 0) {
-      pruned = true;
-      if (data.port() != newly_pairable_turn_port) {
-        // These ports will be pruned in PrunePortsAndRemoveCandidates.
-        ports_to_prune.push_back(&data);
-      } else {
-        data.Prune();
-      }
-    }
-  }
-
-  if (!ports_to_prune.empty()) {
-    LOG(LS_INFO) << "Prune " << ports_to_prune.size()
-                 << " low-priority TURN ports";
-    PrunePortsAndRemoveCandidates(ports_to_prune);
-  }
-  return pruned;
-}
-
-void BasicPortAllocatorSession::PruneAllPorts() {
-  for (PortData& data : ports_) {
-    data.Prune();
-  }
-}
-
-void BasicPortAllocatorSession::OnPortComplete(Port* port) {
-  RTC_DCHECK(rtc::Thread::Current() == network_thread_);
-  LOG_J(LS_INFO, port) << "Port completed gathering candidates.";
-  PortData* data = FindPort(port);
-  RTC_DCHECK(data != NULL);
-
-  // Ignore any late signals.
-  if (!data->inprogress()) {
-    return;
-  }
-
-  // Moving to COMPLETE state.
-  data->set_complete();
-  // Send candidate allocation complete signal if this was the last port.
-  MaybeSignalCandidatesAllocationDone();
-}
-
-void BasicPortAllocatorSession::OnPortError(Port* port) {
-  RTC_DCHECK(rtc::Thread::Current() == network_thread_);
-  LOG_J(LS_INFO, port) << "Port encountered error while gathering candidates.";
-  PortData* data = FindPort(port);
-  RTC_DCHECK(data != NULL);
-  // We might have already given up on this port and stopped it.
-  if (!data->inprogress()) {
-    return;
-  }
-
-  // SignalAddressError is currently sent from StunPort/TurnPort.
-  // But this signal itself is generic.
-  data->set_error();
-  // Send candidate allocation complete signal if this was the last port.
-  MaybeSignalCandidatesAllocationDone();
-}
-
-void BasicPortAllocatorSession::OnProtocolEnabled(AllocationSequence* seq,
-                                                  ProtocolType proto) {
-  std::vector<Candidate> candidates;
-  for (std::vector<PortData>::iterator it = ports_.begin();
-       it != ports_.end(); ++it) {
-    if (it->sequence() != seq)
-      continue;
-
-    const std::vector<Candidate>& potentials = it->port()->Candidates();
-    for (size_t i = 0; i < potentials.size(); ++i) {
-      if (!CheckCandidateFilter(potentials[i])) {
-        continue;
-      }
-      ProtocolType pvalue;
-      bool candidate_protocol_enabled =
-          StringToProto(potentials[i].protocol().c_str(), &pvalue) &&
-          pvalue == proto;
-      if (candidate_protocol_enabled) {
-        LOG(LS_INFO) << "Signaling candidate because protocol was enabled: "
-                     << potentials[i].ToSensitiveString();
-        candidates.push_back(potentials[i]);
-      }
-    }
-  }
-
-  if (!candidates.empty()) {
-    SignalCandidatesReady(this, candidates);
-  }
-}
-
-bool BasicPortAllocatorSession::CheckCandidateFilter(const Candidate& c) const {
-  uint32_t filter = candidate_filter_;
-
-  // When binding to any address, before sending packets out, the getsockname
-  // returns all 0s, but after sending packets, it'll be the NIC used to
-  // send. All 0s is not a valid ICE candidate address and should be filtered
-  // out.
-  if (c.address().IsAnyIP()) {
-    return false;
-  }
-
-  if (c.type() == RELAY_PORT_TYPE) {
-    return ((filter & CF_RELAY) != 0);
-  } else if (c.type() == STUN_PORT_TYPE) {
-    return ((filter & CF_REFLEXIVE) != 0);
-  } else if (c.type() == LOCAL_PORT_TYPE) {
-    if ((filter & CF_REFLEXIVE) && !c.address().IsPrivateIP()) {
-      // We allow host candidates if the filter allows server-reflexive
-      // candidates and the candidate is a public IP. Because we don't generate
-      // server-reflexive candidates if they have the same IP as the host
-      // candidate (i.e. when the host candidate is a public IP), filtering to
-      // only server-reflexive candidates won't work right when the host
-      // candidates have public IPs.
-      return true;
-    }
-
-    return ((filter & CF_HOST) != 0);
-  }
-  return false;
-}
-
-bool BasicPortAllocatorSession::CandidatePairable(const Candidate& c,
-                                                  const Port* port) const {
-  bool candidate_signalable = CheckCandidateFilter(c);
-
-  // When device enumeration is disabled (to prevent non-default IP addresses
-  // from leaking), we ping from some local candidates even though we don't
-  // signal them. However, if host candidates are also disabled (for example, to
-  // prevent even default IP addresses from leaking), we still don't want to
-  // ping from them, even if device enumeration is disabled.  Thus, we check for
-  // both device enumeration and host candidates being disabled.
-  bool network_enumeration_disabled = c.address().IsAnyIP();
-  bool can_ping_from_candidate =
-      (port->SharedSocket() || c.protocol() == TCP_PROTOCOL_NAME);
-  bool host_candidates_disabled = !(candidate_filter_ & CF_HOST);
-
-  return candidate_signalable ||
-         (network_enumeration_disabled && can_ping_from_candidate &&
-          !host_candidates_disabled);
-}
-
-void BasicPortAllocatorSession::OnPortAllocationComplete(
-    AllocationSequence* seq) {
-  // Send candidate allocation complete signal if all ports are done.
-  MaybeSignalCandidatesAllocationDone();
-}
-
-void BasicPortAllocatorSession::MaybeSignalCandidatesAllocationDone() {
-  if (CandidatesAllocationDone()) {
-    if (pooled()) {
-      LOG(LS_INFO) << "All candidates gathered for pooled session.";
-    } else {
-      LOG(LS_INFO) << "All candidates gathered for " << content_name() << ":"
-                   << component() << ":" << generation();
-    }
-    SignalCandidatesAllocationDone(this);
-  }
-}
-
-void BasicPortAllocatorSession::OnPortDestroyed(
-    PortInterface* port) {
-  RTC_DCHECK(rtc::Thread::Current() == network_thread_);
-  for (std::vector<PortData>::iterator iter = ports_.begin();
-       iter != ports_.end(); ++iter) {
-    if (port == iter->port()) {
-      ports_.erase(iter);
-      LOG_J(LS_INFO, port) << "Removed port from allocator ("
-                           << static_cast<int>(ports_.size()) << " remaining)";
-      return;
-    }
-  }
-  RTC_NOTREACHED();
-}
-
-BasicPortAllocatorSession::PortData* BasicPortAllocatorSession::FindPort(
-    Port* port) {
-  for (std::vector<PortData>::iterator it = ports_.begin();
-       it != ports_.end(); ++it) {
-    if (it->port() == port) {
-      return &*it;
-    }
-  }
-  return NULL;
-}
-
-std::vector<BasicPortAllocatorSession::PortData*>
-BasicPortAllocatorSession::GetUnprunedPorts(
-    const std::vector<rtc::Network*>& networks) {
-  std::vector<PortData*> unpruned_ports;
-  for (PortData& port : ports_) {
-    if (!port.pruned() &&
-        std::find(networks.begin(), networks.end(),
-                  port.sequence()->network()) != networks.end()) {
-      unpruned_ports.push_back(&port);
-    }
-  }
-  return unpruned_ports;
-}
-
-void BasicPortAllocatorSession::PrunePortsAndRemoveCandidates(
-    const std::vector<PortData*>& port_data_list) {
-  std::vector<PortInterface*> pruned_ports;
-  std::vector<Candidate> removed_candidates;
-  for (PortData* data : port_data_list) {
-    // Prune the port so that it may be destroyed.
-    data->Prune();
-    pruned_ports.push_back(data->port());
-    if (data->has_pairable_candidate()) {
-      GetCandidatesFromPort(*data, &removed_candidates);
-      // Mark the port as having no pairable candidates so that its candidates
-      // won't be removed multiple times.
-      data->set_has_pairable_candidate(false);
-    }
-  }
-  if (!pruned_ports.empty()) {
-    SignalPortsPruned(this, pruned_ports);
-  }
-  if (!removed_candidates.empty()) {
-    LOG(LS_INFO) << "Removed " << removed_candidates.size() << " candidates";
-    SignalCandidatesRemoved(this, removed_candidates);
-  }
-}
-
-// AllocationSequence
-
-AllocationSequence::AllocationSequence(BasicPortAllocatorSession* session,
-                                       rtc::Network* network,
-                                       PortConfiguration* config,
-                                       uint32_t flags)
-    : session_(session),
-      network_(network),
-      config_(config),
-      state_(kInit),
-      flags_(flags),
-      udp_socket_(),
-      udp_port_(NULL),
-      phase_(0) {
-}
-
-void AllocationSequence::Init() {
-  if (IsFlagSet(PORTALLOCATOR_ENABLE_SHARED_SOCKET)) {
-    udp_socket_.reset(session_->socket_factory()->CreateUdpSocket(
-        rtc::SocketAddress(network_->GetBestIP(), 0),
-        session_->allocator()->min_port(), session_->allocator()->max_port()));
-    if (udp_socket_) {
-      udp_socket_->SignalReadPacket.connect(
-          this, &AllocationSequence::OnReadPacket);
-    }
-    // Continuing if |udp_socket_| is NULL, as local TCP and RelayPort using TCP
-    // are next available options to setup a communication channel.
-  }
-}
-
-void AllocationSequence::Clear() {
-  udp_port_ = NULL;
-  turn_ports_.clear();
-}
-
-void AllocationSequence::OnNetworkFailed() {
-  RTC_DCHECK(!network_failed_);
-  network_failed_ = true;
-  // Stop the allocation sequence if its network failed.
-  Stop();
-}
-
-AllocationSequence::~AllocationSequence() {
-  session_->network_thread()->Clear(this);
-}
-
-void AllocationSequence::DisableEquivalentPhases(rtc::Network* network,
-    PortConfiguration* config, uint32_t* flags) {
-  if (network_failed_) {
-    // If the network of this allocation sequence has ever become failed,
-    // it won't be equivalent to the new network.
-    return;
-  }
-
-  if (!((network == network_) && (previous_best_ip_ == network->GetBestIP()))) {
-    // Different network setup; nothing is equivalent.
-    return;
-  }
-
-  // Else turn off the stuff that we've already got covered.
-
-  // Every config implicitly specifies local, so turn that off right away.
-  *flags |= PORTALLOCATOR_DISABLE_UDP;
-  *flags |= PORTALLOCATOR_DISABLE_TCP;
-
-  if (config_ && config) {
-    if (config_->StunServers() == config->StunServers()) {
-      // Already got this STUN servers covered.
-      *flags |= PORTALLOCATOR_DISABLE_STUN;
-    }
-    if (!config_->relays.empty()) {
-      // Already got relays covered.
-      // NOTE: This will even skip a _different_ set of relay servers if we
-      // were to be given one, but that never happens in our codebase. Should
-      // probably get rid of the list in PortConfiguration and just keep a
-      // single relay server in each one.
-      *flags |= PORTALLOCATOR_DISABLE_RELAY;
-    }
-  }
-}
-
-void AllocationSequence::Start() {
-  state_ = kRunning;
-  session_->network_thread()->Post(RTC_FROM_HERE, this, MSG_ALLOCATION_PHASE);
-  // Take a snapshot of the best IP, so that when DisableEquivalentPhases is
-  // called next time, we enable all phases if the best IP has since changed.
-  previous_best_ip_ = network_->GetBestIP();
-}
-
-void AllocationSequence::Stop() {
-  // If the port is completed, don't set it to stopped.
-  if (state_ == kRunning) {
-    state_ = kStopped;
-    session_->network_thread()->Clear(this, MSG_ALLOCATION_PHASE);
-  }
-}
-
-void AllocationSequence::OnMessage(rtc::Message* msg) {
-  RTC_DCHECK(rtc::Thread::Current() == session_->network_thread());
-  RTC_DCHECK(msg->message_id == MSG_ALLOCATION_PHASE);
-
-  const char* const PHASE_NAMES[kNumPhases] = {
-    "Udp", "Relay", "Tcp", "SslTcp"
-  };
-
-  // Perform all of the phases in the current step.
-  LOG_J(LS_INFO, network_) << "Allocation Phase="
-                           << PHASE_NAMES[phase_];
-
-  switch (phase_) {
-    case PHASE_UDP:
-      CreateUDPPorts();
-      CreateStunPorts();
-      EnableProtocol(PROTO_UDP);
-      break;
-
-    case PHASE_RELAY:
-      CreateRelayPorts();
-      break;
-
-    case PHASE_TCP:
-      CreateTCPPorts();
-      EnableProtocol(PROTO_TCP);
-      break;
-
-    case PHASE_SSLTCP:
-      state_ = kCompleted;
-      EnableProtocol(PROTO_SSLTCP);
-      break;
-
-    default:
-      RTC_NOTREACHED();
-  }
-
-  if (state() == kRunning) {
-    ++phase_;
-    session_->network_thread()->PostDelayed(RTC_FROM_HERE,
-                                            session_->allocator()->step_delay(),
-                                            this, MSG_ALLOCATION_PHASE);
-  } else {
-    // If all phases in AllocationSequence are completed, no allocation
-    // steps needed further. Canceling  pending signal.
-    session_->network_thread()->Clear(this, MSG_ALLOCATION_PHASE);
-    SignalPortAllocationComplete(this);
-  }
-}
-
-void AllocationSequence::EnableProtocol(ProtocolType proto) {
-  if (!ProtocolEnabled(proto)) {
-    protocols_.push_back(proto);
-    session_->OnProtocolEnabled(this, proto);
-  }
-}
-
-bool AllocationSequence::ProtocolEnabled(ProtocolType proto) const {
-  for (ProtocolList::const_iterator it = protocols_.begin();
-       it != protocols_.end(); ++it) {
-    if (*it == proto)
-      return true;
-  }
-  return false;
-}
-
-void AllocationSequence::CreateUDPPorts() {
-  if (IsFlagSet(PORTALLOCATOR_DISABLE_UDP)) {
-    LOG(LS_VERBOSE) << "AllocationSequence: UDP ports disabled, skipping.";
-    return;
-  }
-
-  // TODO(mallinath) - Remove UDPPort creating socket after shared socket
-  // is enabled completely.
-  UDPPort* port = NULL;
-  bool emit_local_candidate_for_anyaddress =
-      !IsFlagSet(PORTALLOCATOR_DISABLE_DEFAULT_LOCAL_CANDIDATE);
-  if (IsFlagSet(PORTALLOCATOR_ENABLE_SHARED_SOCKET) && udp_socket_) {
-    port = UDPPort::Create(
-        session_->network_thread(), session_->socket_factory(), network_,
-        udp_socket_.get(), session_->username(), session_->password(),
-        session_->allocator()->origin(), emit_local_candidate_for_anyaddress);
-  } else {
-    port = UDPPort::Create(
-        session_->network_thread(), session_->socket_factory(), network_,
-        session_->allocator()->min_port(), session_->allocator()->max_port(),
-        session_->username(), session_->password(),
-        session_->allocator()->origin(), emit_local_candidate_for_anyaddress);
-  }
-
-  if (port) {
-    // If shared socket is enabled, STUN candidate will be allocated by the
-    // UDPPort.
-    if (IsFlagSet(PORTALLOCATOR_ENABLE_SHARED_SOCKET)) {
-      udp_port_ = port;
-      port->SignalDestroyed.connect(this, &AllocationSequence::OnPortDestroyed);
-
-      // If STUN is not disabled, setting stun server address to port.
-      if (!IsFlagSet(PORTALLOCATOR_DISABLE_STUN)) {
-        if (config_ && !config_->StunServers().empty()) {
-          LOG(LS_INFO) << "AllocationSequence: UDPPort will be handling the "
-                       <<  "STUN candidate generation.";
-          port->set_server_addresses(config_->StunServers());
-        }
-      }
-    }
-
-    session_->AddAllocatedPort(port, this, true);
-  }
-}
-
-void AllocationSequence::CreateTCPPorts() {
-  if (IsFlagSet(PORTALLOCATOR_DISABLE_TCP)) {
-    LOG(LS_VERBOSE) << "AllocationSequence: TCP ports disabled, skipping.";
-    return;
-  }
-
-  Port* port = TCPPort::Create(
-      session_->network_thread(), session_->socket_factory(), network_,
-      session_->allocator()->min_port(), session_->allocator()->max_port(),
-      session_->username(), session_->password(),
-      session_->allocator()->allow_tcp_listen());
-  if (port) {
-    session_->AddAllocatedPort(port, this, true);
-    // Since TCPPort is not created using shared socket, |port| will not be
-    // added to the dequeue.
-  }
-}
-
-void AllocationSequence::CreateStunPorts() {
-  if (IsFlagSet(PORTALLOCATOR_DISABLE_STUN)) {
-    LOG(LS_VERBOSE) << "AllocationSequence: STUN ports disabled, skipping.";
-    return;
-  }
-
-  if (IsFlagSet(PORTALLOCATOR_ENABLE_SHARED_SOCKET)) {
-    return;
-  }
-
-  if (!(config_ && !config_->StunServers().empty())) {
-    LOG(LS_WARNING)
-        << "AllocationSequence: No STUN server configured, skipping.";
-    return;
-  }
-
-  StunPort* port = StunPort::Create(
-      session_->network_thread(), session_->socket_factory(), network_,
-      session_->allocator()->min_port(), session_->allocator()->max_port(),
-      session_->username(), session_->password(), config_->StunServers(),
-      session_->allocator()->origin());
-  if (port) {
-    session_->AddAllocatedPort(port, this, true);
-    // Since StunPort is not created using shared socket, |port| will not be
-    // added to the dequeue.
-  }
-}
-
-void AllocationSequence::CreateRelayPorts() {
-  if (IsFlagSet(PORTALLOCATOR_DISABLE_RELAY)) {
-     LOG(LS_VERBOSE) << "AllocationSequence: Relay ports disabled, skipping.";
-     return;
-  }
-
-  // If BasicPortAllocatorSession::OnAllocate left relay ports enabled then we
-  // ought to have a relay list for them here.
-  RTC_DCHECK(config_);
-  RTC_DCHECK(!config_->relays.empty());
-  if (!(config_ && !config_->relays.empty())) {
-    LOG(LS_WARNING)
-        << "AllocationSequence: No relay server configured, skipping.";
-    return;
-  }
-
-  for (RelayServerConfig& relay : config_->relays) {
-    if (relay.type == RELAY_GTURN) {
-      CreateGturnPort(relay);
-    } else if (relay.type == RELAY_TURN) {
-      CreateTurnPort(relay);
-    } else {
-      RTC_NOTREACHED();
-    }
-  }
-}
-
-void AllocationSequence::CreateGturnPort(const RelayServerConfig& config) {
-  // TODO(mallinath) - Rename RelayPort to GTurnPort.
-  RelayPort* port = RelayPort::Create(
-      session_->network_thread(), session_->socket_factory(), network_,
-      session_->allocator()->min_port(), session_->allocator()->max_port(),
-      config_->username, config_->password);
-  if (port) {
-    // Since RelayPort is not created using shared socket, |port| will not be
-    // added to the dequeue.
-    // Note: We must add the allocated port before we add addresses because
-    //       the latter will create candidates that need name and preference
-    //       settings.  However, we also can't prepare the address (normally
-    //       done by AddAllocatedPort) until we have these addresses.  So we
-    //       wait to do that until below.
-    session_->AddAllocatedPort(port, this, false);
-
-    // Add the addresses of this protocol.
-    PortList::const_iterator relay_port;
-    for (relay_port = config.ports.begin();
-         relay_port != config.ports.end();
-         ++relay_port) {
-      port->AddServerAddress(*relay_port);
-      port->AddExternalAddress(*relay_port);
-    }
-    // Start fetching an address for this port.
-    port->PrepareAddress();
-  }
-}
-
-void AllocationSequence::CreateTurnPort(const RelayServerConfig& config) {
-  PortList::const_iterator relay_port;
-  for (relay_port = config.ports.begin();
-       relay_port != config.ports.end(); ++relay_port) {
-    TurnPort* port = NULL;
-
-    // Skip UDP connections to relay servers if it's disallowed.
-    if (IsFlagSet(PORTALLOCATOR_DISABLE_UDP_RELAY) &&
-        relay_port->proto == PROTO_UDP) {
-      continue;
-    }
-
-    // Do not create a port if the server address family is known and does
-    // not match the local IP address family.
-    int server_ip_family = relay_port->address.ipaddr().family();
-    int local_ip_family = network_->GetBestIP().family();
-    if (server_ip_family != AF_UNSPEC && server_ip_family != local_ip_family) {
-      LOG(LS_INFO) << "Server and local address families are not compatible. "
-                   << "Server address: "
-                   << relay_port->address.ipaddr().ToString()
-                   << " Local address: " << network_->GetBestIP().ToString();
-      continue;
-    }
-
-
-    // Shared socket mode must be enabled only for UDP based ports. Hence
-    // don't pass shared socket for ports which will create TCP sockets.
-    // TODO(mallinath) - Enable shared socket mode for TURN ports. Disabled
-    // due to webrtc bug https://code.google.com/p/webrtc/issues/detail?id=3537
-    if (IsFlagSet(PORTALLOCATOR_ENABLE_SHARED_SOCKET) &&
-        relay_port->proto == PROTO_UDP && udp_socket_) {
-      port = TurnPort::Create(session_->network_thread(),
-                              session_->socket_factory(),
-                              network_, udp_socket_.get(),
-                              session_->username(), session_->password(),
-                              *relay_port, config.credentials, config.priority,
-                              session_->allocator()->origin());
-      turn_ports_.push_back(port);
-      // Listen to the port destroyed signal, to allow AllocationSequence to
-      // remove entrt from it's map.
-      port->SignalDestroyed.connect(this, &AllocationSequence::OnPortDestroyed);
-    } else {
-      port = TurnPort::Create(
-          session_->network_thread(), session_->socket_factory(), network_,
-          session_->allocator()->min_port(), session_->allocator()->max_port(),
-          session_->username(), session_->password(), *relay_port,
-          config.credentials, config.priority, session_->allocator()->origin(),
-          config.tls_alpn_protocols, config.tls_elliptic_curves);
-    }
-    RTC_DCHECK(port != NULL);
-    port->SetTlsCertPolicy(config.tls_cert_policy);
-    session_->AddAllocatedPort(port, this, true);
-  }
-}
-
-void AllocationSequence::OnReadPacket(
-    rtc::AsyncPacketSocket* socket, const char* data, size_t size,
-    const rtc::SocketAddress& remote_addr,
-    const rtc::PacketTime& packet_time) {
-  RTC_DCHECK(socket == udp_socket_.get());
-
-  bool turn_port_found = false;
-
-  // Try to find the TurnPort that matches the remote address. Note that the
-  // message could be a STUN binding response if the TURN server is also used as
-  // a STUN server. We don't want to parse every message here to check if it is
-  // a STUN binding response, so we pass the message to TurnPort regardless of
-  // the message type. The TurnPort will just ignore the message since it will
-  // not find any request by transaction ID.
-  for (TurnPort* port : turn_ports_) {
-    if (port->server_address().address == remote_addr) {
-      if (port->HandleIncomingPacket(socket, data, size, remote_addr,
-                                     packet_time)) {
-        return;
-      }
-      turn_port_found = true;
-    }
-  }
-
-  if (udp_port_) {
-    const ServerAddresses& stun_servers = udp_port_->server_addresses();
-
-    // Pass the packet to the UdpPort if there is no matching TurnPort, or if
-    // the TURN server is also a STUN server.
-    if (!turn_port_found ||
-        stun_servers.find(remote_addr) != stun_servers.end()) {
-      RTC_DCHECK(udp_port_->SharedSocket());
-      udp_port_->HandleIncomingPacket(socket, data, size, remote_addr,
-                                      packet_time);
-    }
-  }
-}
-
-void AllocationSequence::OnPortDestroyed(PortInterface* port) {
-  if (udp_port_ == port) {
-    udp_port_ = NULL;
-    return;
-  }
-
-  auto it = std::find(turn_ports_.begin(), turn_ports_.end(), port);
-  if (it != turn_ports_.end()) {
-    turn_ports_.erase(it);
-  } else {
-    LOG(LS_ERROR) << "Unexpected OnPortDestroyed for nonexistent port.";
-    RTC_NOTREACHED();
-  }
-}
-
-// PortConfiguration
-PortConfiguration::PortConfiguration(
-    const rtc::SocketAddress& stun_address,
-    const std::string& username,
-    const std::string& password)
-    : stun_address(stun_address), username(username), password(password) {
-  if (!stun_address.IsNil())
-    stun_servers.insert(stun_address);
-}
-
-PortConfiguration::PortConfiguration(const ServerAddresses& stun_servers,
-                                     const std::string& username,
-                                     const std::string& password)
-    : stun_servers(stun_servers),
-      username(username),
-      password(password) {
-  if (!stun_servers.empty())
-    stun_address = *(stun_servers.begin());
-}
-
-ServerAddresses PortConfiguration::StunServers() {
-  if (!stun_address.IsNil() &&
-      stun_servers.find(stun_address) == stun_servers.end()) {
-    stun_servers.insert(stun_address);
-  }
-  // Every UDP TURN server should also be used as a STUN server.
-  ServerAddresses turn_servers = GetRelayServerAddresses(RELAY_TURN, PROTO_UDP);
-  for (const rtc::SocketAddress& turn_server : turn_servers) {
-    if (stun_servers.find(turn_server) == stun_servers.end()) {
-      stun_servers.insert(turn_server);
-    }
-  }
-  return stun_servers;
-}
-
-void PortConfiguration::AddRelay(const RelayServerConfig& config) {
-  relays.push_back(config);
-}
-
-bool PortConfiguration::SupportsProtocol(
-    const RelayServerConfig& relay, ProtocolType type) const {
-  PortList::const_iterator relay_port;
-  for (relay_port = relay.ports.begin();
-        relay_port != relay.ports.end();
-        ++relay_port) {
-    if (relay_port->proto == type)
-      return true;
-  }
-  return false;
-}
-
-bool PortConfiguration::SupportsProtocol(RelayType turn_type,
-                                         ProtocolType type) const {
-  for (size_t i = 0; i < relays.size(); ++i) {
-    if (relays[i].type == turn_type &&
-        SupportsProtocol(relays[i], type))
-      return true;
-  }
-  return false;
-}
-
-ServerAddresses PortConfiguration::GetRelayServerAddresses(
-    RelayType turn_type, ProtocolType type) const {
-  ServerAddresses servers;
-  for (size_t i = 0; i < relays.size(); ++i) {
-    if (relays[i].type == turn_type && SupportsProtocol(relays[i], type)) {
-      servers.insert(relays[i].ports.front().address);
-    }
-  }
-  return servers;
-}
-
-}  // namespace cricket
diff --git a/p2p/client/basicportallocator.h b/p2p/client/basicportallocator.h
deleted file mode 100644
index 5a4999c..0000000
--- a/p2p/client/basicportallocator.h
+++ /dev/null
@@ -1,383 +0,0 @@
-/*
- *  Copyright 2004 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_P2P_CLIENT_BASICPORTALLOCATOR_H_
-#define WEBRTC_P2P_CLIENT_BASICPORTALLOCATOR_H_
-
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "webrtc/p2p/base/portallocator.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/messagequeue.h"
-#include "webrtc/rtc_base/network.h"
-#include "webrtc/rtc_base/thread.h"
-
-namespace cricket {
-
-class BasicPortAllocator : public PortAllocator {
- public:
-  BasicPortAllocator(rtc::NetworkManager* network_manager,
-                     rtc::PacketSocketFactory* socket_factory);
-  explicit BasicPortAllocator(rtc::NetworkManager* network_manager);
-  BasicPortAllocator(rtc::NetworkManager* network_manager,
-                     rtc::PacketSocketFactory* socket_factory,
-                     const ServerAddresses& stun_servers);
-  BasicPortAllocator(rtc::NetworkManager* network_manager,
-                     const ServerAddresses& stun_servers,
-                     const rtc::SocketAddress& relay_server_udp,
-                     const rtc::SocketAddress& relay_server_tcp,
-                     const rtc::SocketAddress& relay_server_ssl);
-  virtual ~BasicPortAllocator();
-
-  // Set to kDefaultNetworkIgnoreMask by default.
-  void SetNetworkIgnoreMask(int network_ignore_mask) override {
-    // TODO(phoglund): implement support for other types than loopback.
-    // See https://code.google.com/p/webrtc/issues/detail?id=4288.
-    // Then remove set_network_ignore_list from NetworkManager.
-    network_ignore_mask_ = network_ignore_mask;
-  }
-
-  int network_ignore_mask() const { return network_ignore_mask_; }
-
-  rtc::NetworkManager* network_manager() const { return network_manager_; }
-
-  // If socket_factory() is set to NULL each PortAllocatorSession
-  // creates its own socket factory.
-  rtc::PacketSocketFactory* socket_factory() { return socket_factory_; }
-
-  PortAllocatorSession* CreateSessionInternal(
-      const std::string& content_name,
-      int component,
-      const std::string& ice_ufrag,
-      const std::string& ice_pwd) override;
-
-  // Convenience method that adds a TURN server to the configuration.
-  void AddTurnServer(const RelayServerConfig& turn_server);
-
- private:
-  void Construct();
-
-  void OnIceRegathering(PortAllocatorSession* session,
-                        IceRegatheringReason reason);
-
-  rtc::NetworkManager* network_manager_;
-  rtc::PacketSocketFactory* socket_factory_;
-  bool allow_tcp_listen_;
-  int network_ignore_mask_ = rtc::kDefaultNetworkIgnoreMask;
-};
-
-struct PortConfiguration;
-class AllocationSequence;
-
-enum class SessionState {
-  GATHERING,  // Actively allocating ports and gathering candidates.
-  CLEARED,    // Current allocation process has been stopped but may start
-              // new ones.
-  STOPPED     // This session has completely stopped, no new allocation
-              // process will be started.
-};
-
-class BasicPortAllocatorSession : public PortAllocatorSession,
-                                  public rtc::MessageHandler {
- public:
-  BasicPortAllocatorSession(BasicPortAllocator* allocator,
-                            const std::string& content_name,
-                            int component,
-                            const std::string& ice_ufrag,
-                            const std::string& ice_pwd);
-  ~BasicPortAllocatorSession();
-
-  virtual BasicPortAllocator* allocator() { return allocator_; }
-  rtc::Thread* network_thread() { return network_thread_; }
-  rtc::PacketSocketFactory* socket_factory() { return socket_factory_; }
-
-  void SetCandidateFilter(uint32_t filter) override;
-  void StartGettingPorts() override;
-  void StopGettingPorts() override;
-  void ClearGettingPorts() override;
-  bool IsGettingPorts() override { return state_ == SessionState::GATHERING; }
-  bool IsCleared() const override { return state_ == SessionState::CLEARED; }
-  bool IsStopped() const override { return state_ == SessionState::STOPPED; }
-  // These will all be cricket::Ports.
-  std::vector<PortInterface*> ReadyPorts() const override;
-  std::vector<Candidate> ReadyCandidates() const override;
-  bool CandidatesAllocationDone() const override;
-  void RegatherOnFailedNetworks() override;
-  void RegatherOnAllNetworks() override;
-  void PruneAllPorts() override;
-
- protected:
-  void UpdateIceParametersInternal() override;
-
-  // Starts the process of getting the port configurations.
-  virtual void GetPortConfigurations();
-
-  // Adds a port configuration that is now ready.  Once we have one for each
-  // network (or a timeout occurs), we will start allocating ports.
-  virtual void ConfigReady(PortConfiguration* config);
-
-  // MessageHandler.  Can be overriden if message IDs do not conflict.
-  void OnMessage(rtc::Message* message) override;
-
- private:
-  class PortData {
-   public:
-    PortData() {}
-    PortData(Port* port, AllocationSequence* seq)
-        : port_(port), sequence_(seq) {}
-
-    Port* port() const { return port_; }
-    AllocationSequence* sequence() const { return sequence_; }
-    bool has_pairable_candidate() const { return has_pairable_candidate_; }
-    bool complete() const { return state_ == STATE_COMPLETE; }
-    bool error() const { return state_ == STATE_ERROR; }
-    bool pruned() const { return state_ == STATE_PRUNED; }
-    bool inprogress() const { return state_ == STATE_INPROGRESS; }
-    // Returns true if this port is ready to be used.
-    bool ready() const {
-      return has_pairable_candidate_ && state_ != STATE_ERROR &&
-             state_ != STATE_PRUNED;
-    }
-    // Sets the state to "PRUNED" and prunes the Port.
-    void Prune() {
-      state_ = STATE_PRUNED;
-      if (port()) {
-        port()->Prune();
-      }
-    }
-    void set_has_pairable_candidate(bool has_pairable_candidate) {
-      if (has_pairable_candidate) {
-        RTC_DCHECK(state_ == STATE_INPROGRESS);
-      }
-      has_pairable_candidate_ = has_pairable_candidate;
-    }
-    void set_complete() {
-      state_ = STATE_COMPLETE;
-    }
-    void set_error() {
-      RTC_DCHECK(state_ == STATE_INPROGRESS);
-      state_ = STATE_ERROR;
-    }
-
-   private:
-    enum State {
-      STATE_INPROGRESS,  // Still gathering candidates.
-      STATE_COMPLETE,    // All candidates allocated and ready for process.
-      STATE_ERROR,       // Error in gathering candidates.
-      STATE_PRUNED       // Pruned by higher priority ports on the same network
-                         // interface. Only TURN ports may be pruned.
-    };
-    Port* port_ = nullptr;
-    AllocationSequence* sequence_ = nullptr;
-    bool has_pairable_candidate_ = false;
-    State state_ = STATE_INPROGRESS;
-  };
-
-  void OnConfigReady(PortConfiguration* config);
-  void OnConfigStop();
-  void AllocatePorts();
-  void OnAllocate();
-  void DoAllocate(bool disable_equivalent_phases);
-  void OnNetworksChanged();
-  void OnAllocationSequenceObjectsCreated();
-  void DisableEquivalentPhases(rtc::Network* network,
-                               PortConfiguration* config,
-                               uint32_t* flags);
-  void AddAllocatedPort(Port* port, AllocationSequence* seq,
-                        bool prepare_address);
-  void OnCandidateReady(Port* port, const Candidate& c);
-  void OnPortComplete(Port* port);
-  void OnPortError(Port* port);
-  void OnProtocolEnabled(AllocationSequence* seq, ProtocolType proto);
-  void OnPortDestroyed(PortInterface* port);
-  void MaybeSignalCandidatesAllocationDone();
-  void OnPortAllocationComplete(AllocationSequence* seq);
-  PortData* FindPort(Port* port);
-  std::vector<rtc::Network*> GetNetworks();
-  std::vector<rtc::Network*> GetFailedNetworks();
-  void Regather(const std::vector<rtc::Network*>& networks,
-                bool disable_equivalent_phases,
-                IceRegatheringReason reason);
-
-  bool CheckCandidateFilter(const Candidate& c) const;
-  bool CandidatePairable(const Candidate& c, const Port* port) const;
-  // Clear the related address according to the flags and candidate filter
-  // in order to avoid leaking any information.
-  Candidate SanitizeRelatedAddress(const Candidate& c) const;
-
-  std::vector<PortData*> GetUnprunedPorts(
-      const std::vector<rtc::Network*>& networks);
-  // Prunes ports and signal the remote side to remove the candidates that
-  // were previously signaled from these ports.
-  void PrunePortsAndRemoveCandidates(
-      const std::vector<PortData*>& port_data_list);
-  // Gets filtered and sanitized candidates generated from a port and
-  // append to |candidates|.
-  void GetCandidatesFromPort(const PortData& data,
-                             std::vector<Candidate>* candidates) const;
-  Port* GetBestTurnPortForNetwork(const std::string& network_name) const;
-  // Returns true if at least one TURN port is pruned.
-  bool PruneTurnPorts(Port* newly_pairable_turn_port);
-
-  BasicPortAllocator* allocator_;
-  rtc::Thread* network_thread_;
-  std::unique_ptr<rtc::PacketSocketFactory> owned_socket_factory_;
-  rtc::PacketSocketFactory* socket_factory_;
-  bool allocation_started_;
-  bool network_manager_started_;
-  bool allocation_sequences_created_;
-  std::vector<PortConfiguration*> configs_;
-  std::vector<AllocationSequence*> sequences_;
-  std::vector<PortData> ports_;
-  uint32_t candidate_filter_ = CF_ALL;
-  // Whether to prune low-priority ports, taken from the port allocator.
-  bool prune_turn_ports_;
-  SessionState state_ = SessionState::CLEARED;
-
-  friend class AllocationSequence;
-};
-
-// Records configuration information useful in creating ports.
-// TODO(deadbeef): Rename "relay" to "turn_server" in this struct.
-struct PortConfiguration : public rtc::MessageData {
-  // TODO(jiayl): remove |stun_address| when Chrome is updated.
-  rtc::SocketAddress stun_address;
-  ServerAddresses stun_servers;
-  std::string username;
-  std::string password;
-
-  typedef std::vector<RelayServerConfig> RelayList;
-  RelayList relays;
-
-  // TODO(jiayl): remove this ctor when Chrome is updated.
-  PortConfiguration(const rtc::SocketAddress& stun_address,
-                    const std::string& username,
-                    const std::string& password);
-
-  PortConfiguration(const ServerAddresses& stun_servers,
-                    const std::string& username,
-                    const std::string& password);
-
-  // Returns addresses of both the explicitly configured STUN servers,
-  // and TURN servers that should be used as STUN servers.
-  ServerAddresses StunServers();
-
-  // Adds another relay server, with the given ports and modifier, to the list.
-  void AddRelay(const RelayServerConfig& config);
-
-  // Determines whether the given relay server supports the given protocol.
-  bool SupportsProtocol(const RelayServerConfig& relay,
-                        ProtocolType type) const;
-  bool SupportsProtocol(RelayType turn_type, ProtocolType type) const;
-  // Helper method returns the server addresses for the matching RelayType and
-  // Protocol type.
-  ServerAddresses GetRelayServerAddresses(
-      RelayType turn_type, ProtocolType type) const;
-};
-
-class UDPPort;
-class TurnPort;
-
-// Performs the allocation of ports, in a sequenced (timed) manner, for a given
-// network and IP address.
-class AllocationSequence : public rtc::MessageHandler,
-                           public sigslot::has_slots<> {
- public:
-  enum State {
-    kInit,       // Initial state.
-    kRunning,    // Started allocating ports.
-    kStopped,    // Stopped from running.
-    kCompleted,  // All ports are allocated.
-
-    // kInit --> kRunning --> {kCompleted|kStopped}
-  };
-  AllocationSequence(BasicPortAllocatorSession* session,
-                     rtc::Network* network,
-                     PortConfiguration* config,
-                     uint32_t flags);
-  ~AllocationSequence();
-  void Init();
-  void Clear();
-  void OnNetworkFailed();
-
-  State state() const { return state_; }
-  rtc::Network* network() const { return network_; }
-
-  bool network_failed() const { return network_failed_; }
-  void set_network_failed() { network_failed_ = true; }
-
-  // Disables the phases for a new sequence that this one already covers for an
-  // equivalent network setup.
-  void DisableEquivalentPhases(rtc::Network* network,
-                               PortConfiguration* config,
-                               uint32_t* flags);
-
-  // Starts and stops the sequence.  When started, it will continue allocating
-  // new ports on its own timed schedule.
-  void Start();
-  void Stop();
-
-  // MessageHandler
-  void OnMessage(rtc::Message* msg);
-
-  void EnableProtocol(ProtocolType proto);
-  bool ProtocolEnabled(ProtocolType proto) const;
-
-  // Signal from AllocationSequence, when it's done with allocating ports.
-  // This signal is useful, when port allocation fails which doesn't result
-  // in any candidates. Using this signal BasicPortAllocatorSession can send
-  // its candidate discovery conclusion signal. Without this signal,
-  // BasicPortAllocatorSession doesn't have any event to trigger signal. This
-  // can also be achieved by starting timer in BPAS.
-  sigslot::signal1<AllocationSequence*> SignalPortAllocationComplete;
-
- protected:
-  // For testing.
-  void CreateTurnPort(const RelayServerConfig& config);
-
- private:
-  typedef std::vector<ProtocolType> ProtocolList;
-
-  bool IsFlagSet(uint32_t flag) { return ((flags_ & flag) != 0); }
-  void CreateUDPPorts();
-  void CreateTCPPorts();
-  void CreateStunPorts();
-  void CreateRelayPorts();
-  void CreateGturnPort(const RelayServerConfig& config);
-
-  void OnReadPacket(rtc::AsyncPacketSocket* socket,
-                    const char* data,
-                    size_t size,
-                    const rtc::SocketAddress& remote_addr,
-                    const rtc::PacketTime& packet_time);
-
-  void OnPortDestroyed(PortInterface* port);
-
-  BasicPortAllocatorSession* session_;
-  bool network_failed_ = false;
-  rtc::Network* network_;
-  // Compared with the new best IP in DisableEquivalentPhases.
-  rtc::IPAddress previous_best_ip_;
-  PortConfiguration* config_;
-  State state_;
-  uint32_t flags_;
-  ProtocolList protocols_;
-  std::unique_ptr<rtc::AsyncPacketSocket> udp_socket_;
-  // There will be only one udp port per AllocationSequence.
-  UDPPort* udp_port_;
-  std::vector<TurnPort*> turn_ports_;
-  int phase_;
-};
-
-}  // namespace cricket
-
-#endif  // WEBRTC_P2P_CLIENT_BASICPORTALLOCATOR_H_
diff --git a/p2p/client/basicportallocator_unittest.cc b/p2p/client/basicportallocator_unittest.cc
deleted file mode 100644
index 638a9c8..0000000
--- a/p2p/client/basicportallocator_unittest.cc
+++ /dev/null
@@ -1,1963 +0,0 @@
-/*
- *  Copyright 2009 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 <algorithm>
-#include <memory>
-
-#include "webrtc/p2p/base/basicpacketsocketfactory.h"
-#include "webrtc/p2p/base/p2pconstants.h"
-#include "webrtc/p2p/base/p2ptransportchannel.h"
-#include "webrtc/p2p/base/testrelayserver.h"
-#include "webrtc/p2p/base/teststunserver.h"
-#include "webrtc/p2p/base/testturnserver.h"
-#include "webrtc/p2p/client/basicportallocator.h"
-#include "webrtc/rtc_base/fakeclock.h"
-#include "webrtc/rtc_base/fakenetwork.h"
-#include "webrtc/rtc_base/firewallsocketserver.h"
-#include "webrtc/rtc_base/gunit.h"
-#include "webrtc/rtc_base/helpers.h"
-#include "webrtc/rtc_base/ipaddress.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/natserver.h"
-#include "webrtc/rtc_base/natsocketfactory.h"
-#include "webrtc/rtc_base/nethelpers.h"
-#include "webrtc/rtc_base/network.h"
-#include "webrtc/rtc_base/socketaddress.h"
-#include "webrtc/rtc_base/ssladapter.h"
-#include "webrtc/rtc_base/thread.h"
-#include "webrtc/rtc_base/virtualsocketserver.h"
-
-using rtc::IPAddress;
-using rtc::SocketAddress;
-using rtc::Thread;
-
-#define MAYBE_SKIP_IPV4                    \
-  if (!rtc::HasIPv4Enabled()) {            \
-    LOG(LS_INFO) << "No IPv4... skipping"; \
-    return;                                \
-  }
-
-static const SocketAddress kAnyAddr("0.0.0.0", 0);
-static const SocketAddress kClientAddr("11.11.11.11", 0);
-static const SocketAddress kClientAddr2("22.22.22.22", 0);
-static const SocketAddress kLoopbackAddr("127.0.0.1", 0);
-static const SocketAddress kPrivateAddr("192.168.1.11", 0);
-static const SocketAddress kPrivateAddr2("192.168.1.12", 0);
-static const SocketAddress kClientIPv6Addr("2401:fa00:4:1000:be30:5bff:fee5:c3",
-                                           0);
-static const SocketAddress kClientIPv6Addr2(
-    "2401:fa00:4:2000:be30:5bff:fee5:c3",
-    0);
-static const SocketAddress kClientIPv6Addr3(
-    "2401:fa00:4:3000:be30:5bff:fee5:c3",
-    0);
-static const SocketAddress kNatUdpAddr("77.77.77.77", rtc::NAT_SERVER_UDP_PORT);
-static const SocketAddress kNatTcpAddr("77.77.77.77", rtc::NAT_SERVER_TCP_PORT);
-static const SocketAddress kRemoteClientAddr("22.22.22.22", 0);
-static const SocketAddress kStunAddr("99.99.99.1", cricket::STUN_SERVER_PORT);
-static const SocketAddress kRelayUdpIntAddr("99.99.99.2", 5000);
-static const SocketAddress kRelayUdpExtAddr("99.99.99.3", 5001);
-static const SocketAddress kRelayTcpIntAddr("99.99.99.2", 5002);
-static const SocketAddress kRelayTcpExtAddr("99.99.99.3", 5003);
-static const SocketAddress kRelaySslTcpIntAddr("99.99.99.2", 5004);
-static const SocketAddress kRelaySslTcpExtAddr("99.99.99.3", 5005);
-static const SocketAddress kTurnUdpIntAddr("99.99.99.4", 3478);
-static const SocketAddress kTurnUdpIntIPv6Addr(
-    "2402:fb00:4:1000:be30:5bff:fee5:c3",
-    3479);
-static const SocketAddress kTurnTcpIntAddr("99.99.99.5", 3478);
-static const SocketAddress kTurnTcpIntIPv6Addr(
-    "2402:fb00:4:2000:be30:5bff:fee5:c3",
-    3479);
-static const SocketAddress kTurnUdpExtAddr("99.99.99.6", 0);
-
-// Minimum and maximum port for port range tests.
-static const int kMinPort = 10000;
-static const int kMaxPort = 10099;
-
-// Based on ICE_UFRAG_LENGTH
-static const char kIceUfrag0[] = "UF00";
-// Based on ICE_PWD_LENGTH
-static const char kIcePwd0[] = "TESTICEPWD00000000000000";
-
-static const char kContentName[] = "test content";
-
-static const int kDefaultAllocationTimeout = 3000;
-static const char kTurnUsername[] = "test";
-static const char kTurnPassword[] = "test";
-
-// STUN timeout (with all retries) is cricket::STUN_TOTAL_TIMEOUT.
-// Add some margin of error for slow bots.
-static const int kStunTimeoutMs = cricket::STUN_TOTAL_TIMEOUT;
-
-namespace cricket {
-
-// Helper for dumping candidates
-std::ostream& operator<<(std::ostream& os,
-                         const std::vector<Candidate>& candidates) {
-  os << '[';
-  bool first = true;
-  for (const Candidate& c : candidates) {
-    if (!first) {
-      os << ", ";
-    }
-    os << c.ToString();
-    first = false;
-  };
-  os << ']';
-  return os;
-}
-
-class BasicPortAllocatorTestBase : public testing::Test,
-                                   public sigslot::has_slots<> {
- public:
-  BasicPortAllocatorTestBase()
-      : vss_(new rtc::VirtualSocketServer()),
-        fss_(new rtc::FirewallSocketServer(vss_.get())),
-        thread_(fss_.get()),
-        // Note that the NAT is not used by default. ResetWithStunServerAndNat
-        // must be called.
-        nat_factory_(vss_.get(), kNatUdpAddr, kNatTcpAddr),
-        nat_socket_factory_(new rtc::BasicPacketSocketFactory(&nat_factory_)),
-        stun_server_(TestStunServer::Create(Thread::Current(), kStunAddr)),
-        relay_server_(Thread::Current(),
-                      kRelayUdpIntAddr,
-                      kRelayUdpExtAddr,
-                      kRelayTcpIntAddr,
-                      kRelayTcpExtAddr,
-                      kRelaySslTcpIntAddr,
-                      kRelaySslTcpExtAddr),
-        turn_server_(Thread::Current(), kTurnUdpIntAddr, kTurnUdpExtAddr),
-        candidate_allocation_done_(false) {
-    ServerAddresses stun_servers;
-    stun_servers.insert(kStunAddr);
-    // Passing the addresses of GTURN servers will enable GTURN in
-    // Basicportallocator.
-    // TODO(deadbeef): Stop using GTURN by default in this test... Either the
-    // configuration should be blank by default (preferred), or it should use
-    // TURN instead.
-    allocator_.reset(new BasicPortAllocator(&network_manager_, stun_servers,
-                                            kRelayUdpIntAddr, kRelayTcpIntAddr,
-                                            kRelaySslTcpIntAddr));
-    allocator_->set_step_delay(kMinimumStepDelay);
-  }
-
-  void AddInterface(const SocketAddress& addr) {
-    network_manager_.AddInterface(addr);
-  }
-  void AddInterface(const SocketAddress& addr, const std::string& if_name) {
-    network_manager_.AddInterface(addr, if_name);
-  }
-  void AddInterface(const SocketAddress& addr,
-                    const std::string& if_name,
-                    rtc::AdapterType type) {
-    network_manager_.AddInterface(addr, if_name, type);
-  }
-  // The default route is the public address that STUN server will observe when
-  // the endpoint is sitting on the public internet and the local port is bound
-  // to the "any" address. This may be different from the default local address
-  // which the endpoint observes. This can occur if the route to the public
-  // endpoint like 8.8.8.8 (specified as the default local address) is
-  // different from the route to the STUN server (the default route).
-  void AddInterfaceAsDefaultRoute(const SocketAddress& addr) {
-    AddInterface(addr);
-    // When a binding comes from the any address, the |addr| will be used as the
-    // srflx address.
-    vss_->SetDefaultRoute(addr.ipaddr());
-  }
-  void RemoveInterface(const SocketAddress& addr) {
-    network_manager_.RemoveInterface(addr);
-  }
-  bool SetPortRange(int min_port, int max_port) {
-    return allocator_->SetPortRange(min_port, max_port);
-  }
-  // Endpoint is on the public network. No STUN or TURN.
-  void ResetWithNoServersOrNat() {
-    allocator_.reset(new BasicPortAllocator(&network_manager_));
-    allocator_->set_step_delay(kMinimumStepDelay);
-  }
-  // Endpoint is behind a NAT, with STUN specified.
-  void ResetWithStunServerAndNat(const rtc::SocketAddress& stun_server) {
-    ResetWithStunServer(stun_server, true);
-  }
-  // Endpoint is on the public network, with STUN specified.
-  void ResetWithStunServerNoNat(const rtc::SocketAddress& stun_server) {
-    ResetWithStunServer(stun_server, false);
-  }
-  // Endpoint is on the public network, with TURN specified.
-  void ResetWithTurnServersNoNat(const rtc::SocketAddress& udp_turn,
-                                 const rtc::SocketAddress& tcp_turn) {
-    ResetWithNoServersOrNat();
-    AddTurnServers(udp_turn, tcp_turn);
-  }
-
-  void AddTurnServers(const rtc::SocketAddress& udp_turn,
-                      const rtc::SocketAddress& tcp_turn) {
-    RelayServerConfig turn_server(RELAY_TURN);
-    RelayCredentials credentials(kTurnUsername, kTurnPassword);
-    turn_server.credentials = credentials;
-
-    if (!udp_turn.IsNil()) {
-      turn_server.ports.push_back(ProtocolAddress(udp_turn, PROTO_UDP));
-    }
-    if (!tcp_turn.IsNil()) {
-      turn_server.ports.push_back(ProtocolAddress(tcp_turn, PROTO_TCP));
-    }
-    allocator_->AddTurnServer(turn_server);
-  }
-
-  bool CreateSession(int component) {
-    session_ = CreateSession("session", component);
-    if (!session_) {
-      return false;
-    }
-    return true;
-  }
-
-  bool CreateSession(int component, const std::string& content_name) {
-    session_ = CreateSession("session", content_name, component);
-    if (!session_) {
-      return false;
-    }
-    return true;
-  }
-
-  std::unique_ptr<PortAllocatorSession> CreateSession(const std::string& sid,
-                                                      int component) {
-    return CreateSession(sid, kContentName, component);
-  }
-
-  std::unique_ptr<PortAllocatorSession> CreateSession(
-      const std::string& sid,
-      const std::string& content_name,
-      int component) {
-    return CreateSession(sid, content_name, component, kIceUfrag0, kIcePwd0);
-  }
-
-  std::unique_ptr<PortAllocatorSession> CreateSession(
-      const std::string& sid,
-      const std::string& content_name,
-      int component,
-      const std::string& ice_ufrag,
-      const std::string& ice_pwd) {
-    std::unique_ptr<PortAllocatorSession> session =
-        allocator_->CreateSession(content_name, component, ice_ufrag, ice_pwd);
-    session->SignalPortReady.connect(this,
-                                     &BasicPortAllocatorTestBase::OnPortReady);
-    session->SignalPortsPruned.connect(
-        this, &BasicPortAllocatorTestBase::OnPortsPruned);
-    session->SignalCandidatesReady.connect(
-        this, &BasicPortAllocatorTestBase::OnCandidatesReady);
-    session->SignalCandidatesRemoved.connect(
-        this, &BasicPortAllocatorTestBase::OnCandidatesRemoved);
-    session->SignalCandidatesAllocationDone.connect(
-        this, &BasicPortAllocatorTestBase::OnCandidatesAllocationDone);
-    return session;
-  }
-
-  // Return true if the addresses are the same, or the port is 0 in |pattern|
-  // (acting as a wildcard) and the IPs are the same.
-  // Even with a wildcard port, the port of the address should be nonzero if
-  // the IP is nonzero.
-  static bool AddressMatch(const SocketAddress& address,
-                           const SocketAddress& pattern) {
-    return address.ipaddr() == pattern.ipaddr() &&
-           ((pattern.port() == 0 &&
-             (address.port() != 0 || IPIsAny(address.ipaddr()))) ||
-            (pattern.port() != 0 && address.port() == pattern.port()));
-  }
-
-  // Returns the number of ports that have matching type, protocol and
-  // address.
-  static int CountPorts(const std::vector<PortInterface*>& ports,
-                        const std::string& type,
-                        ProtocolType protocol,
-                        const SocketAddress& client_addr) {
-    return std::count_if(
-        ports.begin(), ports.end(),
-        [type, protocol, client_addr](PortInterface* port) {
-          return port->Type() == type && port->GetProtocol() == protocol &&
-                 port->Network()->GetBestIP() == client_addr.ipaddr();
-        });
-  }
-
-  static int CountCandidates(const std::vector<Candidate>& candidates,
-                             const std::string& type,
-                             const std::string& proto,
-                             const SocketAddress& addr) {
-    return std::count_if(candidates.begin(), candidates.end(),
-                         [type, proto, addr](const Candidate& c) {
-                           return c.type() == type && c.protocol() == proto &&
-                                  AddressMatch(c.address(), addr);
-                         });
-  }
-
-  // Find a candidate and return it.
-  static bool FindCandidate(const std::vector<Candidate>& candidates,
-                            const std::string& type,
-                            const std::string& proto,
-                            const SocketAddress& addr,
-                            Candidate* found) {
-    auto it = std::find_if(candidates.begin(), candidates.end(),
-                           [type, proto, addr](const Candidate& c) {
-                             return c.type() == type && c.protocol() == proto &&
-                                    AddressMatch(c.address(), addr);
-                           });
-    if (it != candidates.end() && found) {
-      *found = *it;
-    }
-    return it != candidates.end();
-  }
-
-  // Convenience method to call FindCandidate with no return.
-  static bool HasCandidate(const std::vector<Candidate>& candidates,
-                           const std::string& type,
-                           const std::string& proto,
-                           const SocketAddress& addr) {
-    return FindCandidate(candidates, type, proto, addr, nullptr);
-  }
-
-  // Version of HasCandidate that also takes a related address.
-  static bool HasCandidateWithRelatedAddr(
-      const std::vector<Candidate>& candidates,
-      const std::string& type,
-      const std::string& proto,
-      const SocketAddress& addr,
-      const SocketAddress& related_addr) {
-    auto it =
-        std::find_if(candidates.begin(), candidates.end(),
-                     [type, proto, addr, related_addr](const Candidate& c) {
-                       return c.type() == type && c.protocol() == proto &&
-                              AddressMatch(c.address(), addr) &&
-                              AddressMatch(c.related_address(), related_addr);
-                     });
-    return it != candidates.end();
-  }
-
-  static bool CheckPort(const rtc::SocketAddress& addr,
-                        int min_port,
-                        int max_port) {
-    return (addr.port() >= min_port && addr.port() <= max_port);
-  }
-
-  void OnCandidatesAllocationDone(PortAllocatorSession* session) {
-    // We should only get this callback once, except in the mux test where
-    // we have multiple port allocation sessions.
-    if (session == session_.get()) {
-      ASSERT_FALSE(candidate_allocation_done_);
-      candidate_allocation_done_ = true;
-    }
-    EXPECT_TRUE(session->CandidatesAllocationDone());
-  }
-
-  // Check if all ports allocated have send-buffer size |expected|. If
-  // |expected| == -1, check if GetOptions returns SOCKET_ERROR.
-  void CheckSendBufferSizesOfAllPorts(int expected) {
-    std::vector<PortInterface*>::iterator it;
-    for (it = ports_.begin(); it < ports_.end(); ++it) {
-      int send_buffer_size;
-      if (expected == -1) {
-        EXPECT_EQ(SOCKET_ERROR,
-                  (*it)->GetOption(rtc::Socket::OPT_SNDBUF, &send_buffer_size));
-      } else {
-        EXPECT_EQ(0,
-                  (*it)->GetOption(rtc::Socket::OPT_SNDBUF, &send_buffer_size));
-        ASSERT_EQ(expected, send_buffer_size);
-      }
-    }
-  }
-
-  rtc::VirtualSocketServer* virtual_socket_server() { return vss_.get(); }
-
- protected:
-  BasicPortAllocator& allocator() { return *allocator_; }
-
-  void OnPortReady(PortAllocatorSession* ses, PortInterface* port) {
-    LOG(LS_INFO) << "OnPortReady: " << port->ToString();
-    ports_.push_back(port);
-    // Make sure the new port is added to ReadyPorts.
-    auto ready_ports = ses->ReadyPorts();
-    EXPECT_NE(ready_ports.end(),
-              std::find(ready_ports.begin(), ready_ports.end(), port));
-  }
-  void OnPortsPruned(PortAllocatorSession* ses,
-                     const std::vector<PortInterface*>& pruned_ports) {
-    LOG(LS_INFO) << "Number of ports pruned: " << pruned_ports.size();
-    auto ready_ports = ses->ReadyPorts();
-    auto new_end = ports_.end();
-    for (PortInterface* port : pruned_ports) {
-      new_end = std::remove(ports_.begin(), new_end, port);
-      // Make sure the pruned port is not in ReadyPorts.
-      EXPECT_EQ(ready_ports.end(),
-                std::find(ready_ports.begin(), ready_ports.end(), port));
-    }
-    ports_.erase(new_end, ports_.end());
-  }
-
-  void OnCandidatesReady(PortAllocatorSession* ses,
-                         const std::vector<Candidate>& candidates) {
-    for (const Candidate& candidate : candidates) {
-      LOG(LS_INFO) << "OnCandidatesReady: " << candidate.ToString();
-      // Sanity check that the ICE component is set.
-      EXPECT_EQ(ICE_CANDIDATE_COMPONENT_RTP, candidate.component());
-      candidates_.push_back(candidate);
-    }
-    // Make sure the new candidates are added to Candidates.
-    auto ses_candidates = ses->ReadyCandidates();
-    for (const Candidate& candidate : candidates) {
-      EXPECT_NE(
-          ses_candidates.end(),
-          std::find(ses_candidates.begin(), ses_candidates.end(), candidate));
-    }
-  }
-
-  void OnCandidatesRemoved(PortAllocatorSession* session,
-                           const std::vector<Candidate>& removed_candidates) {
-    auto new_end = std::remove_if(
-        candidates_.begin(), candidates_.end(),
-        [removed_candidates](Candidate& candidate) {
-          for (const Candidate& removed_candidate : removed_candidates) {
-            if (candidate.MatchesForRemoval(removed_candidate)) {
-              return true;
-            }
-          }
-          return false;
-        });
-    candidates_.erase(new_end, candidates_.end());
-  }
-
-  bool HasRelayAddress(const ProtocolAddress& proto_addr) {
-    for (size_t i = 0; i < allocator_->turn_servers().size(); ++i) {
-      RelayServerConfig server_config = allocator_->turn_servers()[i];
-      PortList::const_iterator relay_port;
-      for (relay_port = server_config.ports.begin();
-           relay_port != server_config.ports.end(); ++relay_port) {
-        if (proto_addr.address == relay_port->address &&
-            proto_addr.proto == relay_port->proto)
-          return true;
-      }
-    }
-    return false;
-  }
-
-  void ResetWithStunServer(const rtc::SocketAddress& stun_server,
-                           bool with_nat) {
-    if (with_nat) {
-      nat_server_.reset(new rtc::NATServer(
-          rtc::NAT_OPEN_CONE, vss_.get(), kNatUdpAddr, kNatTcpAddr, vss_.get(),
-          rtc::SocketAddress(kNatUdpAddr.ipaddr(), 0)));
-    } else {
-      nat_socket_factory_.reset(new rtc::BasicPacketSocketFactory());
-    }
-
-    ServerAddresses stun_servers;
-    if (!stun_server.IsNil()) {
-      stun_servers.insert(stun_server);
-    }
-    allocator_.reset(new BasicPortAllocator(
-        &network_manager_, nat_socket_factory_.get(), stun_servers));
-    allocator().set_step_delay(kMinimumStepDelay);
-  }
-
-  std::unique_ptr<rtc::VirtualSocketServer> vss_;
-  std::unique_ptr<rtc::FirewallSocketServer> fss_;
-  rtc::AutoSocketServerThread thread_;
-  std::unique_ptr<rtc::NATServer> nat_server_;
-  rtc::NATSocketFactory nat_factory_;
-  std::unique_ptr<rtc::BasicPacketSocketFactory> nat_socket_factory_;
-  std::unique_ptr<TestStunServer> stun_server_;
-  TestRelayServer relay_server_;
-  TestTurnServer turn_server_;
-  rtc::FakeNetworkManager network_manager_;
-  std::unique_ptr<BasicPortAllocator> allocator_;
-  std::unique_ptr<PortAllocatorSession> session_;
-  std::vector<PortInterface*> ports_;
-  std::vector<Candidate> candidates_;
-  bool candidate_allocation_done_;
-};
-
-class BasicPortAllocatorTestWithRealClock : public BasicPortAllocatorTestBase {
-};
-
-class FakeClockBase {
- public:
-  rtc::ScopedFakeClock fake_clock;
-};
-
-class BasicPortAllocatorTest : public FakeClockBase,
-                               public BasicPortAllocatorTestBase {
- public:
-  // This function starts the port/address gathering and check the existence of
-  // candidates as specified. When |expect_stun_candidate| is true,
-  // |stun_candidate_addr| carries the expected reflective address, which is
-  // also the related address for TURN candidate if it is expected. Otherwise,
-  // it should be ignore.
-  void CheckDisableAdapterEnumeration(
-      uint32_t total_ports,
-      const rtc::IPAddress& host_candidate_addr,
-      const rtc::IPAddress& stun_candidate_addr,
-      const rtc::IPAddress& relay_candidate_udp_transport_addr,
-      const rtc::IPAddress& relay_candidate_tcp_transport_addr) {
-    network_manager_.set_default_local_addresses(kPrivateAddr.ipaddr(),
-                                                 rtc::IPAddress());
-    if (!session_) {
-      EXPECT_TRUE(CreateSession(ICE_CANDIDATE_COMPONENT_RTP));
-    }
-    session_->set_flags(session_->flags() |
-                        PORTALLOCATOR_DISABLE_ADAPTER_ENUMERATION |
-                        PORTALLOCATOR_ENABLE_SHARED_SOCKET);
-    allocator().set_allow_tcp_listen(false);
-    session_->StartGettingPorts();
-    EXPECT_TRUE_SIMULATED_WAIT(candidate_allocation_done_,
-                               kDefaultAllocationTimeout, fake_clock);
-
-    uint32_t total_candidates = 0;
-    if (!host_candidate_addr.IsNil()) {
-      EXPECT_PRED4(HasCandidate, candidates_, "local", "udp",
-                   rtc::SocketAddress(kPrivateAddr.ipaddr(), 0));
-      ++total_candidates;
-    }
-    if (!stun_candidate_addr.IsNil()) {
-      rtc::SocketAddress related_address(host_candidate_addr, 0);
-      if (host_candidate_addr.IsNil()) {
-        related_address.SetIP(rtc::GetAnyIP(stun_candidate_addr.family()));
-      }
-      EXPECT_PRED5(HasCandidateWithRelatedAddr, candidates_, "stun", "udp",
-                   rtc::SocketAddress(stun_candidate_addr, 0), related_address);
-      ++total_candidates;
-    }
-    if (!relay_candidate_udp_transport_addr.IsNil()) {
-      EXPECT_PRED5(HasCandidateWithRelatedAddr, candidates_, "relay", "udp",
-                   rtc::SocketAddress(relay_candidate_udp_transport_addr, 0),
-                   rtc::SocketAddress(stun_candidate_addr, 0));
-      ++total_candidates;
-    }
-    if (!relay_candidate_tcp_transport_addr.IsNil()) {
-      EXPECT_PRED5(HasCandidateWithRelatedAddr, candidates_, "relay", "udp",
-                   rtc::SocketAddress(relay_candidate_tcp_transport_addr, 0),
-                   rtc::SocketAddress(stun_candidate_addr, 0));
-      ++total_candidates;
-    }
-
-    EXPECT_EQ(total_candidates, candidates_.size());
-    EXPECT_EQ(total_ports, ports_.size());
-  }
-
-  void TestIPv6TurnPortPrunesIPv4TurnPort() {
-    turn_server_.AddInternalSocket(kTurnUdpIntIPv6Addr, PROTO_UDP);
-    // Add two IP addresses on the same interface.
-    AddInterface(kClientAddr, "net1");
-    AddInterface(kClientIPv6Addr, "net1");
-    allocator_.reset(new BasicPortAllocator(&network_manager_));
-    allocator_->SetConfiguration(allocator_->stun_servers(),
-                                 allocator_->turn_servers(), 0, true);
-    AddTurnServers(kTurnUdpIntIPv6Addr, rtc::SocketAddress());
-    AddTurnServers(kTurnUdpIntAddr, rtc::SocketAddress());
-
-    allocator_->set_step_delay(kMinimumStepDelay);
-    allocator_->set_flags(
-        allocator().flags() | PORTALLOCATOR_ENABLE_SHARED_SOCKET |
-        PORTALLOCATOR_ENABLE_IPV6 | PORTALLOCATOR_DISABLE_TCP);
-
-    EXPECT_TRUE(CreateSession(ICE_CANDIDATE_COMPONENT_RTP));
-    session_->StartGettingPorts();
-    EXPECT_TRUE_SIMULATED_WAIT(candidate_allocation_done_,
-                               kDefaultAllocationTimeout, fake_clock);
-    // Three ports (one IPv4 STUN, one IPv6 STUN and one TURN) will be ready.
-    EXPECT_EQ(3U, session_->ReadyPorts().size());
-    EXPECT_EQ(3U, ports_.size());
-    EXPECT_EQ(1, CountPorts(ports_, "local", PROTO_UDP, kClientAddr));
-    EXPECT_EQ(1, CountPorts(ports_, "local", PROTO_UDP, kClientIPv6Addr));
-    EXPECT_EQ(1, CountPorts(ports_, "relay", PROTO_UDP, kClientIPv6Addr));
-    EXPECT_EQ(0, CountPorts(ports_, "relay", PROTO_UDP, kClientAddr));
-
-    // Now that we remove candidates when a TURN port is pruned, there will be
-    // exactly 3 candidates in both |candidates_| and |ready_candidates|.
-    EXPECT_EQ(3U, candidates_.size());
-    const std::vector<Candidate>& ready_candidates =
-        session_->ReadyCandidates();
-    EXPECT_EQ(3U, ready_candidates.size());
-    EXPECT_PRED4(HasCandidate, ready_candidates, "local", "udp", kClientAddr);
-    EXPECT_PRED4(HasCandidate, ready_candidates, "relay", "udp",
-                 rtc::SocketAddress(kTurnUdpExtAddr.ipaddr(), 0));
-  }
-
-  void TestUdpTurnPortPrunesTcpTurnPort() {
-    turn_server_.AddInternalSocket(kTurnTcpIntAddr, PROTO_TCP);
-    AddInterface(kClientAddr);
-    allocator_.reset(new BasicPortAllocator(&network_manager_));
-    allocator_->SetConfiguration(allocator_->stun_servers(),
-                                 allocator_->turn_servers(), 0, true);
-    AddTurnServers(kTurnUdpIntAddr, kTurnTcpIntAddr);
-    allocator_->set_step_delay(kMinimumStepDelay);
-    allocator_->set_flags(allocator().flags() |
-                          PORTALLOCATOR_ENABLE_SHARED_SOCKET |
-                          PORTALLOCATOR_DISABLE_TCP);
-
-    EXPECT_TRUE(CreateSession(ICE_CANDIDATE_COMPONENT_RTP));
-    session_->StartGettingPorts();
-    EXPECT_TRUE_SIMULATED_WAIT(candidate_allocation_done_,
-                               kDefaultAllocationTimeout, fake_clock);
-    // Only 2 ports (one STUN and one TURN) are actually being used.
-    EXPECT_EQ(2U, session_->ReadyPorts().size());
-    // We have verified that each port, when it is added to |ports_|, it is
-    // found in |ready_ports|, and when it is pruned, it is not found in
-    // |ready_ports|, so we only need to verify the content in one of them.
-    EXPECT_EQ(2U, ports_.size());
-    EXPECT_EQ(1, CountPorts(ports_, "local", PROTO_UDP, kClientAddr));
-    EXPECT_EQ(1, CountPorts(ports_, "relay", PROTO_UDP, kClientAddr));
-    EXPECT_EQ(0, CountPorts(ports_, "relay", PROTO_TCP, kClientAddr));
-
-    // Now that we remove candidates when a TURN port is pruned, |candidates_|
-    // should only contains two candidates regardless whether the TCP TURN port
-    // is created before or after the UDP turn port.
-    EXPECT_EQ(2U, candidates_.size());
-    // There will only be 2 candidates in |ready_candidates| because it only
-    // includes the candidates in the ready ports.
-    const std::vector<Candidate>& ready_candidates =
-        session_->ReadyCandidates();
-    EXPECT_EQ(2U, ready_candidates.size());
-    EXPECT_PRED4(HasCandidate, ready_candidates, "local", "udp", kClientAddr);
-    EXPECT_PRED4(HasCandidate, ready_candidates, "relay", "udp",
-                 rtc::SocketAddress(kTurnUdpExtAddr.ipaddr(), 0));
-  }
-
-  void TestEachInterfaceHasItsOwnTurnPorts() {
-    turn_server_.AddInternalSocket(kTurnTcpIntAddr, PROTO_TCP);
-    turn_server_.AddInternalSocket(kTurnUdpIntIPv6Addr, PROTO_UDP);
-    turn_server_.AddInternalSocket(kTurnTcpIntIPv6Addr, PROTO_TCP);
-    // Add two interfaces both having IPv4 and IPv6 addresses.
-    AddInterface(kClientAddr, "net1", rtc::ADAPTER_TYPE_WIFI);
-    AddInterface(kClientIPv6Addr, "net1", rtc::ADAPTER_TYPE_WIFI);
-    AddInterface(kClientAddr2, "net2", rtc::ADAPTER_TYPE_CELLULAR);
-    AddInterface(kClientIPv6Addr2, "net2", rtc::ADAPTER_TYPE_CELLULAR);
-    allocator_.reset(new BasicPortAllocator(&network_manager_));
-    allocator_->SetConfiguration(allocator_->stun_servers(),
-                                 allocator_->turn_servers(), 0, true);
-    // Have both UDP/TCP and IPv4/IPv6 TURN ports.
-    AddTurnServers(kTurnUdpIntAddr, kTurnTcpIntAddr);
-    AddTurnServers(kTurnUdpIntIPv6Addr, kTurnTcpIntIPv6Addr);
-
-    allocator_->set_step_delay(kMinimumStepDelay);
-    allocator_->set_flags(
-        allocator().flags() | PORTALLOCATOR_ENABLE_SHARED_SOCKET |
-        PORTALLOCATOR_ENABLE_IPV6 | PORTALLOCATOR_ENABLE_IPV6_ON_WIFI);
-    EXPECT_TRUE(CreateSession(ICE_CANDIDATE_COMPONENT_RTP));
-    session_->StartGettingPorts();
-    EXPECT_TRUE_SIMULATED_WAIT(candidate_allocation_done_,
-                               kDefaultAllocationTimeout, fake_clock);
-    // 10 ports (4 STUN and 1 TURN ports on each interface) will be ready to
-    // use.
-    EXPECT_EQ(10U, session_->ReadyPorts().size());
-    EXPECT_EQ(10U, ports_.size());
-    EXPECT_EQ(1, CountPorts(ports_, "local", PROTO_UDP, kClientAddr));
-    EXPECT_EQ(1, CountPorts(ports_, "local", PROTO_UDP, kClientAddr2));
-    EXPECT_EQ(1, CountPorts(ports_, "local", PROTO_UDP, kClientIPv6Addr));
-    EXPECT_EQ(1, CountPorts(ports_, "local", PROTO_UDP, kClientIPv6Addr2));
-    EXPECT_EQ(1, CountPorts(ports_, "local", PROTO_TCP, kClientAddr));
-    EXPECT_EQ(1, CountPorts(ports_, "local", PROTO_TCP, kClientAddr2));
-    EXPECT_EQ(1, CountPorts(ports_, "local", PROTO_TCP, kClientIPv6Addr));
-    EXPECT_EQ(1, CountPorts(ports_, "local", PROTO_TCP, kClientIPv6Addr2));
-    EXPECT_EQ(1, CountPorts(ports_, "relay", PROTO_UDP, kClientIPv6Addr));
-    EXPECT_EQ(1, CountPorts(ports_, "relay", PROTO_UDP, kClientIPv6Addr2));
-
-    // Now that we remove candidates when TURN ports are pruned, there will be
-    // exactly 10 candidates in |candidates_|.
-    EXPECT_EQ(10U, candidates_.size());
-    const std::vector<Candidate>& ready_candidates =
-        session_->ReadyCandidates();
-    EXPECT_EQ(10U, ready_candidates.size());
-    EXPECT_PRED4(HasCandidate, ready_candidates, "local", "udp", kClientAddr);
-    EXPECT_PRED4(HasCandidate, ready_candidates, "local", "udp", kClientAddr2);
-    EXPECT_PRED4(HasCandidate, ready_candidates, "local", "udp",
-                 kClientIPv6Addr);
-    EXPECT_PRED4(HasCandidate, ready_candidates, "local", "udp",
-                 kClientIPv6Addr2);
-    EXPECT_PRED4(HasCandidate, ready_candidates, "local", "tcp", kClientAddr);
-    EXPECT_PRED4(HasCandidate, ready_candidates, "local", "tcp", kClientAddr2);
-    EXPECT_PRED4(HasCandidate, ready_candidates, "local", "tcp",
-                 kClientIPv6Addr);
-    EXPECT_PRED4(HasCandidate, ready_candidates, "local", "tcp",
-                 kClientIPv6Addr2);
-    EXPECT_PRED4(HasCandidate, ready_candidates, "relay", "udp",
-                 rtc::SocketAddress(kTurnUdpExtAddr.ipaddr(), 0));
-  }
-};
-
-// Tests that we can init the port allocator and create a session.
-TEST_F(BasicPortAllocatorTest, TestBasic) {
-  EXPECT_EQ(&network_manager_, allocator().network_manager());
-  EXPECT_EQ(kStunAddr, *allocator().stun_servers().begin());
-  ASSERT_EQ(1u, allocator().turn_servers().size());
-  EXPECT_EQ(RELAY_GTURN, allocator().turn_servers()[0].type);
-  // Empty relay credentials are used for GTURN.
-  EXPECT_TRUE(allocator().turn_servers()[0].credentials.username.empty());
-  EXPECT_TRUE(allocator().turn_servers()[0].credentials.password.empty());
-  EXPECT_TRUE(HasRelayAddress(ProtocolAddress(kRelayUdpIntAddr, PROTO_UDP)));
-  EXPECT_TRUE(HasRelayAddress(ProtocolAddress(kRelayTcpIntAddr, PROTO_TCP)));
-  EXPECT_TRUE(
-      HasRelayAddress(ProtocolAddress(kRelaySslTcpIntAddr, PROTO_SSLTCP)));
-  EXPECT_TRUE(CreateSession(ICE_CANDIDATE_COMPONENT_RTP));
-  EXPECT_FALSE(session_->CandidatesAllocationDone());
-}
-
-// Tests that our network filtering works properly.
-TEST_F(BasicPortAllocatorTest, TestIgnoreOnlyLoopbackNetworkByDefault) {
-  AddInterface(SocketAddress(IPAddress(0x12345600U), 0), "test_eth0",
-               rtc::ADAPTER_TYPE_ETHERNET);
-  AddInterface(SocketAddress(IPAddress(0x12345601U), 0), "test_wlan0",
-               rtc::ADAPTER_TYPE_WIFI);
-  AddInterface(SocketAddress(IPAddress(0x12345602U), 0), "test_cell0",
-               rtc::ADAPTER_TYPE_CELLULAR);
-  AddInterface(SocketAddress(IPAddress(0x12345603U), 0), "test_vpn0",
-               rtc::ADAPTER_TYPE_VPN);
-  AddInterface(SocketAddress(IPAddress(0x12345604U), 0), "test_lo",
-               rtc::ADAPTER_TYPE_LOOPBACK);
-  EXPECT_TRUE(CreateSession(ICE_CANDIDATE_COMPONENT_RTP));
-  session_->set_flags(PORTALLOCATOR_DISABLE_STUN | PORTALLOCATOR_DISABLE_RELAY |
-                      PORTALLOCATOR_DISABLE_TCP);
-  session_->StartGettingPorts();
-  EXPECT_TRUE_SIMULATED_WAIT(candidate_allocation_done_,
-                             kDefaultAllocationTimeout, fake_clock);
-  EXPECT_EQ(4U, candidates_.size());
-  for (Candidate candidate : candidates_) {
-    EXPECT_LT(candidate.address().ip(), 0x12345604U);
-  }
-}
-
-TEST_F(BasicPortAllocatorTest, TestIgnoreNetworksAccordingToIgnoreMask) {
-  AddInterface(SocketAddress(IPAddress(0x12345600U), 0), "test_eth0",
-               rtc::ADAPTER_TYPE_ETHERNET);
-  AddInterface(SocketAddress(IPAddress(0x12345601U), 0), "test_wlan0",
-               rtc::ADAPTER_TYPE_WIFI);
-  AddInterface(SocketAddress(IPAddress(0x12345602U), 0), "test_cell0",
-               rtc::ADAPTER_TYPE_CELLULAR);
-  allocator_->SetNetworkIgnoreMask(rtc::ADAPTER_TYPE_ETHERNET |
-                                   rtc::ADAPTER_TYPE_LOOPBACK |
-                                   rtc::ADAPTER_TYPE_WIFI);
-  EXPECT_TRUE(CreateSession(ICE_CANDIDATE_COMPONENT_RTP));
-  session_->set_flags(PORTALLOCATOR_DISABLE_STUN | PORTALLOCATOR_DISABLE_RELAY |
-                      PORTALLOCATOR_DISABLE_TCP);
-  session_->StartGettingPorts();
-  EXPECT_TRUE_SIMULATED_WAIT(candidate_allocation_done_,
-                             kDefaultAllocationTimeout, fake_clock);
-  EXPECT_EQ(1U, candidates_.size());
-  EXPECT_EQ(0x12345602U, candidates_[0].address().ip());
-}
-
-// Test that high cost networks are filtered if the flag
-// PORTALLOCATOR_DISABLE_COSTLY_NETWORKS is set.
-TEST_F(BasicPortAllocatorTest, TestGatherLowCostNetworkOnly) {
-  SocketAddress addr_wifi(IPAddress(0x12345600U), 0);
-  SocketAddress addr_cellular(IPAddress(0x12345601U), 0);
-  SocketAddress addr_unknown1(IPAddress(0x12345602U), 0);
-  SocketAddress addr_unknown2(IPAddress(0x12345603U), 0);
-  // If both Wi-Fi and cellular interfaces are present, only gather on the Wi-Fi
-  // interface.
-  AddInterface(addr_wifi, "test_wlan0", rtc::ADAPTER_TYPE_WIFI);
-  AddInterface(addr_cellular, "test_cell0", rtc::ADAPTER_TYPE_CELLULAR);
-  allocator().set_flags(cricket::PORTALLOCATOR_DISABLE_STUN |
-                        cricket::PORTALLOCATOR_DISABLE_RELAY |
-                        cricket::PORTALLOCATOR_DISABLE_TCP |
-                        cricket::PORTALLOCATOR_DISABLE_COSTLY_NETWORKS);
-  EXPECT_TRUE(CreateSession(cricket::ICE_CANDIDATE_COMPONENT_RTP));
-  session_->StartGettingPorts();
-  EXPECT_TRUE_SIMULATED_WAIT(candidate_allocation_done_,
-                             kDefaultAllocationTimeout, fake_clock);
-  EXPECT_EQ(1U, candidates_.size());
-  EXPECT_TRUE(addr_wifi.EqualIPs(candidates_[0].address()));
-
-  // If both cellular and unknown interfaces are present, only gather on the
-  // unknown interfaces.
-  candidates_.clear();
-  candidate_allocation_done_ = false;
-  RemoveInterface(addr_wifi);
-  AddInterface(addr_unknown1, "test_unknown0", rtc::ADAPTER_TYPE_UNKNOWN);
-  AddInterface(addr_unknown2, "test_unknown1", rtc::ADAPTER_TYPE_UNKNOWN);
-  session_->StartGettingPorts();
-  EXPECT_TRUE_SIMULATED_WAIT(candidate_allocation_done_,
-                             kDefaultAllocationTimeout, fake_clock);
-  EXPECT_EQ(2U, candidates_.size());
-  EXPECT_TRUE((addr_unknown1.EqualIPs(candidates_[0].address()) &&
-               addr_unknown2.EqualIPs(candidates_[1].address())) ||
-              (addr_unknown1.EqualIPs(candidates_[1].address()) &&
-               addr_unknown2.EqualIPs(candidates_[0].address())));
-
-  // If Wi-Fi, cellular, unknown interfaces are all present, only gather on the
-  // Wi-Fi interface.
-  candidates_.clear();
-  candidate_allocation_done_ = false;
-  AddInterface(addr_wifi, "test_wlan0", rtc::ADAPTER_TYPE_WIFI);
-  session_->StartGettingPorts();
-  EXPECT_TRUE_SIMULATED_WAIT(candidate_allocation_done_,
-                             kDefaultAllocationTimeout, fake_clock);
-  EXPECT_EQ(1U, candidates_.size());
-  EXPECT_TRUE(addr_wifi.EqualIPs(candidates_[0].address()));
-}
-
-// Test that no more than allocator.max_ipv6_networks() IPv6 networks are used
-// to gather candidates.
-TEST_F(BasicPortAllocatorTest, MaxIpv6NetworksLimitEnforced) {
-  // Add three IPv6 network interfaces, but tell the allocator to only use two.
-  allocator().set_max_ipv6_networks(2);
-  AddInterface(kClientIPv6Addr, "eth0", rtc::ADAPTER_TYPE_ETHERNET);
-  AddInterface(kClientIPv6Addr2, "eth1", rtc::ADAPTER_TYPE_ETHERNET);
-  AddInterface(kClientIPv6Addr3, "eth2", rtc::ADAPTER_TYPE_ETHERNET);
-
-  // To simplify the test, only gather UDP host candidates.
-  allocator().set_flags(PORTALLOCATOR_ENABLE_IPV6 | PORTALLOCATOR_DISABLE_TCP |
-                        PORTALLOCATOR_DISABLE_STUN |
-                        PORTALLOCATOR_DISABLE_RELAY);
-
-  EXPECT_TRUE(CreateSession(cricket::ICE_CANDIDATE_COMPONENT_RTP));
-  session_->StartGettingPorts();
-  EXPECT_TRUE_SIMULATED_WAIT(candidate_allocation_done_,
-                             kDefaultAllocationTimeout, fake_clock);
-  EXPECT_EQ(2U, candidates_.size());
-  // Ensure the expected two interfaces (eth0 and eth1) were used.
-  EXPECT_PRED4(HasCandidate, candidates_, "local", "udp", kClientIPv6Addr);
-  EXPECT_PRED4(HasCandidate, candidates_, "local", "udp", kClientIPv6Addr2);
-}
-
-// Ensure that allocator.max_ipv6_networks() doesn't prevent IPv4 networks from
-// being used.
-TEST_F(BasicPortAllocatorTest, MaxIpv6NetworksLimitDoesNotImpactIpv4Networks) {
-  // Set the "max IPv6" limit to 1, adding two IPv6 and two IPv4 networks.
-  allocator().set_max_ipv6_networks(1);
-  AddInterface(kClientIPv6Addr, "eth0", rtc::ADAPTER_TYPE_ETHERNET);
-  AddInterface(kClientIPv6Addr2, "eth1", rtc::ADAPTER_TYPE_ETHERNET);
-  AddInterface(kClientAddr, "eth2", rtc::ADAPTER_TYPE_ETHERNET);
-  AddInterface(kClientAddr2, "eth3", rtc::ADAPTER_TYPE_ETHERNET);
-
-  // To simplify the test, only gather UDP host candidates.
-  allocator().set_flags(PORTALLOCATOR_ENABLE_IPV6 | PORTALLOCATOR_DISABLE_TCP |
-                        PORTALLOCATOR_DISABLE_STUN |
-                        PORTALLOCATOR_DISABLE_RELAY);
-
-  EXPECT_TRUE(CreateSession(cricket::ICE_CANDIDATE_COMPONENT_RTP));
-  session_->StartGettingPorts();
-  EXPECT_TRUE_SIMULATED_WAIT(candidate_allocation_done_,
-                             kDefaultAllocationTimeout, fake_clock);
-  EXPECT_EQ(3U, candidates_.size());
-  // Ensure that only one IPv6 interface was used, but both IPv4 interfaces
-  // were used.
-  EXPECT_PRED4(HasCandidate, candidates_, "local", "udp", kClientIPv6Addr);
-  EXPECT_PRED4(HasCandidate, candidates_, "local", "udp", kClientAddr);
-  EXPECT_PRED4(HasCandidate, candidates_, "local", "udp", kClientAddr2);
-}
-
-// Test that we could use loopback interface as host candidate.
-TEST_F(BasicPortAllocatorTest, TestLoopbackNetworkInterface) {
-  AddInterface(kLoopbackAddr, "test_loopback", rtc::ADAPTER_TYPE_LOOPBACK);
-  allocator_->SetNetworkIgnoreMask(0);
-  EXPECT_TRUE(CreateSession(ICE_CANDIDATE_COMPONENT_RTP));
-  session_->set_flags(PORTALLOCATOR_DISABLE_STUN | PORTALLOCATOR_DISABLE_RELAY |
-                      PORTALLOCATOR_DISABLE_TCP);
-  session_->StartGettingPorts();
-  EXPECT_TRUE_SIMULATED_WAIT(candidate_allocation_done_,
-                             kDefaultAllocationTimeout, fake_clock);
-  EXPECT_EQ(1U, candidates_.size());
-}
-
-// Tests that we can get all the desired addresses successfully.
-TEST_F(BasicPortAllocatorTest, TestGetAllPortsWithMinimumStepDelay) {
-  AddInterface(kClientAddr);
-  EXPECT_TRUE(CreateSession(ICE_CANDIDATE_COMPONENT_RTP));
-  session_->StartGettingPorts();
-  ASSERT_EQ_SIMULATED_WAIT(7U, candidates_.size(), kDefaultAllocationTimeout,
-                           fake_clock);
-  EXPECT_EQ(4U, ports_.size());
-  EXPECT_PRED4(HasCandidate, candidates_, "local", "udp", kClientAddr);
-  EXPECT_PRED4(HasCandidate, candidates_, "stun", "udp", kClientAddr);
-  EXPECT_PRED4(HasCandidate, candidates_, "relay", "udp", kRelayUdpIntAddr);
-  EXPECT_PRED4(HasCandidate, candidates_, "relay", "udp", kRelayUdpExtAddr);
-  EXPECT_PRED4(HasCandidate, candidates_, "relay", "tcp", kRelayTcpIntAddr);
-  EXPECT_PRED4(HasCandidate, candidates_, "local", "tcp", kClientAddr);
-  EXPECT_PRED4(HasCandidate, candidates_, "relay", "ssltcp",
-               kRelaySslTcpIntAddr);
-  EXPECT_TRUE(candidate_allocation_done_);
-}
-
-// Test that when the same network interface is brought down and up, the
-// port allocator session will restart a new allocation sequence if
-// it is not stopped.
-TEST_F(BasicPortAllocatorTest, TestSameNetworkDownAndUpWhenSessionNotStopped) {
-  std::string if_name("test_net0");
-  AddInterface(kClientAddr, if_name);
-  EXPECT_TRUE(CreateSession(ICE_CANDIDATE_COMPONENT_RTP));
-  session_->StartGettingPorts();
-  ASSERT_EQ_SIMULATED_WAIT(7U, candidates_.size(), kDefaultAllocationTimeout,
-                           fake_clock);
-  EXPECT_EQ(4U, ports_.size());
-  EXPECT_TRUE(candidate_allocation_done_);
-  candidate_allocation_done_ = false;
-  candidates_.clear();
-  ports_.clear();
-
-  RemoveInterface(kClientAddr);
-  ASSERT_EQ_SIMULATED_WAIT(0U, candidates_.size(), kDefaultAllocationTimeout,
-                           fake_clock);
-  EXPECT_EQ(0U, ports_.size());
-  EXPECT_FALSE(candidate_allocation_done_);
-
-  // When the same interfaces are added again, new candidates/ports should be
-  // generated.
-  AddInterface(kClientAddr, if_name);
-  ASSERT_EQ_SIMULATED_WAIT(7U, candidates_.size(), kDefaultAllocationTimeout,
-                           fake_clock);
-  EXPECT_EQ(4U, ports_.size());
-  EXPECT_TRUE(candidate_allocation_done_);
-}
-
-// Test that when the same network interface is brought down and up, the
-// port allocator session will not restart a new allocation sequence if
-// it is stopped.
-TEST_F(BasicPortAllocatorTest, TestSameNetworkDownAndUpWhenSessionStopped) {
-  std::string if_name("test_net0");
-  AddInterface(kClientAddr, if_name);
-  EXPECT_TRUE(CreateSession(ICE_CANDIDATE_COMPONENT_RTP));
-  session_->StartGettingPorts();
-  ASSERT_EQ_SIMULATED_WAIT(7U, candidates_.size(), kDefaultAllocationTimeout,
-                           fake_clock);
-  EXPECT_EQ(4U, ports_.size());
-  EXPECT_TRUE(candidate_allocation_done_);
-  session_->StopGettingPorts();
-  candidates_.clear();
-  ports_.clear();
-
-  RemoveInterface(kClientAddr);
-  ASSERT_EQ_SIMULATED_WAIT(0U, candidates_.size(), kDefaultAllocationTimeout,
-                           fake_clock);
-  EXPECT_EQ(0U, ports_.size());
-
-  // When the same interfaces are added again, new candidates/ports should not
-  // be generated because the session has stopped.
-  AddInterface(kClientAddr, if_name);
-  ASSERT_EQ_SIMULATED_WAIT(0U, candidates_.size(), kDefaultAllocationTimeout,
-                           fake_clock);
-  EXPECT_EQ(0U, ports_.size());
-  EXPECT_TRUE(candidate_allocation_done_);
-}
-
-// Verify candidates with default step delay of 1sec.
-TEST_F(BasicPortAllocatorTest, TestGetAllPortsWithOneSecondStepDelay) {
-  AddInterface(kClientAddr);
-  allocator_->set_step_delay(kDefaultStepDelay);
-  EXPECT_TRUE(CreateSession(ICE_CANDIDATE_COMPONENT_RTP));
-  session_->StartGettingPorts();
-  ASSERT_EQ_SIMULATED_WAIT(2U, candidates_.size(), 1000, fake_clock);
-  EXPECT_EQ(2U, ports_.size());
-  ASSERT_EQ_SIMULATED_WAIT(4U, candidates_.size(), 2000, fake_clock);
-  EXPECT_EQ(3U, ports_.size());
-  EXPECT_PRED4(HasCandidate, candidates_, "relay", "udp", kRelayUdpIntAddr);
-  EXPECT_PRED4(HasCandidate, candidates_, "relay", "udp", kRelayUdpExtAddr);
-  ASSERT_EQ_SIMULATED_WAIT(6U, candidates_.size(), 1500, fake_clock);
-  EXPECT_PRED4(HasCandidate, candidates_, "relay", "tcp", kRelayTcpIntAddr);
-  EXPECT_PRED4(HasCandidate, candidates_, "local", "tcp", kClientAddr);
-  EXPECT_EQ(4U, ports_.size());
-  ASSERT_EQ_SIMULATED_WAIT(7U, candidates_.size(), 2000, fake_clock);
-  EXPECT_PRED4(HasCandidate, candidates_, "relay", "ssltcp",
-               kRelaySslTcpIntAddr);
-  EXPECT_EQ(4U, ports_.size());
-  EXPECT_TRUE(candidate_allocation_done_);
-  // If we Stop gathering now, we shouldn't get a second "done" callback.
-  session_->StopGettingPorts();
-}
-
-TEST_F(BasicPortAllocatorTest, TestSetupVideoRtpPortsWithNormalSendBuffers) {
-  AddInterface(kClientAddr);
-  EXPECT_TRUE(CreateSession(ICE_CANDIDATE_COMPONENT_RTP, CN_VIDEO));
-  session_->StartGettingPorts();
-  ASSERT_EQ_SIMULATED_WAIT(7U, candidates_.size(), kDefaultAllocationTimeout,
-                           fake_clock);
-  EXPECT_TRUE(candidate_allocation_done_);
-  // If we Stop gathering now, we shouldn't get a second "done" callback.
-  session_->StopGettingPorts();
-
-  // All ports should have unset send-buffer sizes.
-  CheckSendBufferSizesOfAllPorts(-1);
-}
-
-// Tests that we can get callback after StopGetAllPorts.
-TEST_F(BasicPortAllocatorTest, TestStopGetAllPorts) {
-  AddInterface(kClientAddr);
-  EXPECT_TRUE(CreateSession(ICE_CANDIDATE_COMPONENT_RTP));
-  session_->StartGettingPorts();
-  ASSERT_EQ_WAIT(2U, candidates_.size(), kDefaultAllocationTimeout);
-  EXPECT_EQ(2U, ports_.size());
-  session_->StopGettingPorts();
-  EXPECT_TRUE_WAIT(candidate_allocation_done_, kDefaultAllocationTimeout);
-}
-
-// Test that we restrict client ports appropriately when a port range is set.
-// We check the candidates for udp/stun/tcp ports, and the from address
-// for relay ports.
-TEST_F(BasicPortAllocatorTest, TestGetAllPortsPortRange) {
-  AddInterface(kClientAddr);
-  // Check that an invalid port range fails.
-  EXPECT_FALSE(SetPortRange(kMaxPort, kMinPort));
-  // Check that a null port range succeeds.
-  EXPECT_TRUE(SetPortRange(0, 0));
-  // Check that a valid port range succeeds.
-  EXPECT_TRUE(SetPortRange(kMinPort, kMaxPort));
-  EXPECT_TRUE(CreateSession(ICE_CANDIDATE_COMPONENT_RTP));
-  session_->StartGettingPorts();
-  ASSERT_EQ_SIMULATED_WAIT(7U, candidates_.size(), kDefaultAllocationTimeout,
-                           fake_clock);
-  EXPECT_EQ(4U, ports_.size());
-
-  int num_nonrelay_candidates = 0;
-  for (const Candidate& candidate : candidates_) {
-    // Check the port number for the UDP/STUN/TCP port objects.
-    if (candidate.type() != RELAY_PORT_TYPE) {
-      EXPECT_PRED3(CheckPort, candidate.address(), kMinPort, kMaxPort);
-      ++num_nonrelay_candidates;
-    }
-  }
-  EXPECT_EQ(3, num_nonrelay_candidates);
-  // Check the port number used to connect to the relay server.
-  EXPECT_PRED3(CheckPort, relay_server_.GetConnection(0).source(), kMinPort,
-               kMaxPort);
-  EXPECT_TRUE(candidate_allocation_done_);
-}
-
-// Test that if we have no network adapters, we bind to the ANY address and
-// still get non-host candidates.
-TEST_F(BasicPortAllocatorTest, TestGetAllPortsNoAdapters) {
-  // Default config uses GTURN and no NAT, so replace that with the
-  // desired setup (NAT, STUN server, TURN server, UDP/TCP).
-  ResetWithStunServerAndNat(kStunAddr);
-  turn_server_.AddInternalSocket(kTurnTcpIntAddr, PROTO_TCP);
-  AddTurnServers(kTurnUdpIntAddr, kTurnTcpIntAddr);
-  AddTurnServers(kTurnUdpIntIPv6Addr, kTurnTcpIntIPv6Addr);
-  // Disable IPv6, because our test infrastructure doesn't support having IPv4
-  // behind a NAT but IPv6 not, or having an IPv6 NAT.
-  // TODO(deadbeef): Fix this.
-  network_manager_.set_ipv6_enabled(false);
-  EXPECT_TRUE(CreateSession(ICE_CANDIDATE_COMPONENT_RTP));
-  session_->StartGettingPorts();
-  EXPECT_TRUE_SIMULATED_WAIT(candidate_allocation_done_,
-                             kDefaultAllocationTimeout, fake_clock);
-  EXPECT_EQ(4U, ports_.size());
-  EXPECT_EQ(1, CountPorts(ports_, "stun", PROTO_UDP, kAnyAddr));
-  EXPECT_EQ(1, CountPorts(ports_, "local", PROTO_TCP, kAnyAddr));
-  // Two TURN ports, using UDP/TCP for the first hop to the TURN server.
-  EXPECT_EQ(1, CountPorts(ports_, "relay", PROTO_UDP, kAnyAddr));
-  EXPECT_EQ(1, CountPorts(ports_, "relay", PROTO_TCP, kAnyAddr));
-  // The "any" address port should be in the signaled ready ports, but the host
-  // candidate for it is useless and shouldn't be signaled. So we only have
-  // STUN/TURN candidates.
-  EXPECT_EQ(3U, candidates_.size());
-  EXPECT_PRED4(HasCandidate, candidates_, "stun", "udp",
-               rtc::SocketAddress(kNatUdpAddr.ipaddr(), 0));
-  // Again, two TURN candidates, using UDP/TCP for the first hop to the TURN
-  // server.
-  EXPECT_EQ(2,
-            CountCandidates(candidates_, "relay", "udp",
-                            rtc::SocketAddress(kTurnUdpExtAddr.ipaddr(), 0)));
-}
-
-// Test that when enumeration is disabled, we should not have any ports when
-// candidate_filter() is set to CF_RELAY and no relay is specified.
-TEST_F(BasicPortAllocatorTest,
-       TestDisableAdapterEnumerationWithoutNatRelayTransportOnly) {
-  ResetWithStunServerNoNat(kStunAddr);
-  allocator().set_candidate_filter(CF_RELAY);
-  // Expect to see no ports and no candidates.
-  CheckDisableAdapterEnumeration(0U, rtc::IPAddress(), rtc::IPAddress(),
-                                 rtc::IPAddress(), rtc::IPAddress());
-}
-
-// Test that even with multiple interfaces, the result should still be a single
-// default private, one STUN and one TURN candidate since we bind to any address
-// (i.e. all 0s).
-TEST_F(BasicPortAllocatorTest,
-       TestDisableAdapterEnumerationBehindNatMultipleInterfaces) {
-  AddInterface(kPrivateAddr);
-  AddInterface(kPrivateAddr2);
-  ResetWithStunServerAndNat(kStunAddr);
-  AddTurnServers(kTurnUdpIntAddr, rtc::SocketAddress());
-
-  // Enable IPv6 here. Since the network_manager doesn't have IPv6 default
-  // address set and we have no IPv6 STUN server, there should be no IPv6
-  // candidates.
-  EXPECT_TRUE(CreateSession(ICE_CANDIDATE_COMPONENT_RTP));
-  session_->set_flags(PORTALLOCATOR_ENABLE_IPV6);
-
-  // Expect to see 3 ports for IPv4: HOST/STUN, TURN/UDP and TCP ports, 2 ports
-  // for IPv6: HOST, and TCP. Only IPv4 candidates: a default private, STUN and
-  // TURN/UDP candidates.
-  CheckDisableAdapterEnumeration(5U, kPrivateAddr.ipaddr(),
-                                 kNatUdpAddr.ipaddr(), kTurnUdpExtAddr.ipaddr(),
-                                 rtc::IPAddress());
-}
-
-// Test that we should get a default private, STUN, TURN/UDP and TURN/TCP
-// candidates when both TURN/UDP and TURN/TCP servers are specified.
-TEST_F(BasicPortAllocatorTest, TestDisableAdapterEnumerationBehindNatWithTcp) {
-  turn_server_.AddInternalSocket(kTurnTcpIntAddr, PROTO_TCP);
-  AddInterface(kPrivateAddr);
-  ResetWithStunServerAndNat(kStunAddr);
-  AddTurnServers(kTurnUdpIntAddr, kTurnTcpIntAddr);
-  // Expect to see 4 ports - STUN, TURN/UDP, TURN/TCP and TCP port. A default
-  // private, STUN, TURN/UDP, and TURN/TCP candidates.
-  CheckDisableAdapterEnumeration(4U, kPrivateAddr.ipaddr(),
-                                 kNatUdpAddr.ipaddr(), kTurnUdpExtAddr.ipaddr(),
-                                 kTurnUdpExtAddr.ipaddr());
-}
-
-// Test that when adapter enumeration is disabled, for endpoints without
-// STUN/TURN specified, a default private candidate is still generated.
-TEST_F(BasicPortAllocatorTest,
-       TestDisableAdapterEnumerationWithoutNatOrServers) {
-  ResetWithNoServersOrNat();
-  // Expect to see 2 ports: STUN and TCP ports, one default private candidate.
-  CheckDisableAdapterEnumeration(2U, kPrivateAddr.ipaddr(), rtc::IPAddress(),
-                                 rtc::IPAddress(), rtc::IPAddress());
-}
-
-// Test that when adapter enumeration is disabled, with
-// PORTALLOCATOR_DISABLE_LOCALHOST_CANDIDATE specified, for endpoints not behind
-// a NAT, there is no local candidate.
-TEST_F(BasicPortAllocatorTest,
-       TestDisableAdapterEnumerationWithoutNatLocalhostCandidateDisabled) {
-  ResetWithStunServerNoNat(kStunAddr);
-  EXPECT_TRUE(CreateSession(ICE_CANDIDATE_COMPONENT_RTP));
-  session_->set_flags(PORTALLOCATOR_DISABLE_DEFAULT_LOCAL_CANDIDATE);
-  // Expect to see 2 ports: STUN and TCP ports, localhost candidate and STUN
-  // candidate.
-  CheckDisableAdapterEnumeration(2U, rtc::IPAddress(), rtc::IPAddress(),
-                                 rtc::IPAddress(), rtc::IPAddress());
-}
-
-// Test that when adapter enumeration is disabled, with
-// PORTALLOCATOR_DISABLE_LOCALHOST_CANDIDATE specified, for endpoints not behind
-// a NAT, there is no local candidate. However, this specified default route
-// (kClientAddr) which was discovered when sending STUN requests, will become
-// the srflx addresses.
-TEST_F(
-    BasicPortAllocatorTest,
-    TestDisableAdapterEnumerationWithoutNatLocalhostCandidateDisabledWithDifferentDefaultRoute) {
-  ResetWithStunServerNoNat(kStunAddr);
-  AddInterfaceAsDefaultRoute(kClientAddr);
-  EXPECT_TRUE(CreateSession(ICE_CANDIDATE_COMPONENT_RTP));
-  session_->set_flags(PORTALLOCATOR_DISABLE_DEFAULT_LOCAL_CANDIDATE);
-  // Expect to see 2 ports: STUN and TCP ports, localhost candidate and STUN
-  // candidate.
-  CheckDisableAdapterEnumeration(2U, rtc::IPAddress(), kClientAddr.ipaddr(),
-                                 rtc::IPAddress(), rtc::IPAddress());
-}
-
-// Test that when adapter enumeration is disabled, with
-// PORTALLOCATOR_DISABLE_LOCALHOST_CANDIDATE specified, for endpoints behind a
-// NAT, there is only one STUN candidate.
-TEST_F(BasicPortAllocatorTest,
-       TestDisableAdapterEnumerationWithNatLocalhostCandidateDisabled) {
-  ResetWithStunServerAndNat(kStunAddr);
-  EXPECT_TRUE(CreateSession(ICE_CANDIDATE_COMPONENT_RTP));
-  session_->set_flags(PORTALLOCATOR_DISABLE_DEFAULT_LOCAL_CANDIDATE);
-  // Expect to see 2 ports: STUN and TCP ports, and single STUN candidate.
-  CheckDisableAdapterEnumeration(2U, rtc::IPAddress(), kNatUdpAddr.ipaddr(),
-                                 rtc::IPAddress(), rtc::IPAddress());
-}
-
-// Test that we disable relay over UDP, and only TCP is used when connecting to
-// the relay server.
-TEST_F(BasicPortAllocatorTest, TestDisableUdpTurn) {
-  turn_server_.AddInternalSocket(kTurnTcpIntAddr, PROTO_TCP);
-  AddInterface(kClientAddr);
-  ResetWithStunServerAndNat(kStunAddr);
-  AddTurnServers(kTurnUdpIntAddr, kTurnTcpIntAddr);
-  EXPECT_TRUE(CreateSession(ICE_CANDIDATE_COMPONENT_RTP));
-  session_->set_flags(PORTALLOCATOR_DISABLE_UDP_RELAY |
-                      PORTALLOCATOR_DISABLE_UDP | PORTALLOCATOR_DISABLE_STUN |
-                      PORTALLOCATOR_ENABLE_SHARED_SOCKET);
-
-  session_->StartGettingPorts();
-  EXPECT_TRUE_SIMULATED_WAIT(candidate_allocation_done_,
-                             kDefaultAllocationTimeout, fake_clock);
-
-  // Expect to see 2 ports and 2 candidates - TURN/TCP and TCP ports, TCP and
-  // TURN/TCP candidates.
-  EXPECT_EQ(2U, ports_.size());
-  EXPECT_EQ(2U, candidates_.size());
-  Candidate turn_candidate;
-  EXPECT_PRED5(FindCandidate, candidates_, "relay", "udp", kTurnUdpExtAddr,
-               &turn_candidate);
-  // The TURN candidate should use TCP to contact the TURN server.
-  EXPECT_EQ(TCP_PROTOCOL_NAME, turn_candidate.relay_protocol());
-  EXPECT_PRED4(HasCandidate, candidates_, "local", "tcp", kClientAddr);
-}
-
-// Disable for asan, see
-// https://code.google.com/p/webrtc/issues/detail?id=4743 for details.
-#if !defined(ADDRESS_SANITIZER)
-
-// Test that we can get OnCandidatesAllocationDone callback when all the ports
-// are disabled.
-TEST_F(BasicPortAllocatorTest, TestDisableAllPorts) {
-  AddInterface(kClientAddr);
-  EXPECT_TRUE(CreateSession(ICE_CANDIDATE_COMPONENT_RTP));
-  session_->set_flags(PORTALLOCATOR_DISABLE_UDP | PORTALLOCATOR_DISABLE_STUN |
-                      PORTALLOCATOR_DISABLE_RELAY | PORTALLOCATOR_DISABLE_TCP);
-  session_->StartGettingPorts();
-  EXPECT_TRUE_SIMULATED_WAIT(candidate_allocation_done_, 1000, fake_clock);
-  EXPECT_EQ(0U, candidates_.size());
-}
-
-// Test that we don't crash or malfunction if we can't create UDP sockets.
-TEST_F(BasicPortAllocatorTest, TestGetAllPortsNoUdpSockets) {
-  AddInterface(kClientAddr);
-  fss_->set_udp_sockets_enabled(false);
-  EXPECT_TRUE(CreateSession(1));
-  session_->StartGettingPorts();
-  ASSERT_EQ_SIMULATED_WAIT(5U, candidates_.size(), kDefaultAllocationTimeout,
-                           fake_clock);
-  EXPECT_EQ(2U, ports_.size());
-  EXPECT_PRED4(HasCandidate, candidates_, "relay", "udp", kRelayUdpIntAddr);
-  EXPECT_PRED4(HasCandidate, candidates_, "relay", "udp", kRelayUdpExtAddr);
-  EXPECT_PRED4(HasCandidate, candidates_, "relay", "tcp", kRelayTcpIntAddr);
-  EXPECT_PRED4(HasCandidate, candidates_, "local", "tcp", kClientAddr);
-  EXPECT_PRED4(HasCandidate, candidates_, "relay", "ssltcp",
-               kRelaySslTcpIntAddr);
-  EXPECT_TRUE(candidate_allocation_done_);
-}
-
-#endif  // if !defined(ADDRESS_SANITIZER)
-
-// Test that we don't crash or malfunction if we can't create UDP sockets or
-// listen on TCP sockets. We still give out a local TCP address, since
-// apparently this is needed for the remote side to accept our connection.
-TEST_F(BasicPortAllocatorTest, TestGetAllPortsNoUdpSocketsNoTcpListen) {
-  AddInterface(kClientAddr);
-  fss_->set_udp_sockets_enabled(false);
-  fss_->set_tcp_listen_enabled(false);
-  EXPECT_TRUE(CreateSession(1));
-  session_->StartGettingPorts();
-  ASSERT_EQ_SIMULATED_WAIT(5U, candidates_.size(), kDefaultAllocationTimeout,
-                           fake_clock);
-  EXPECT_EQ(2U, ports_.size());
-  EXPECT_PRED4(HasCandidate, candidates_, "relay", "udp", kRelayUdpIntAddr);
-  EXPECT_PRED4(HasCandidate, candidates_, "relay", "udp", kRelayUdpExtAddr);
-  EXPECT_PRED4(HasCandidate, candidates_, "relay", "tcp", kRelayTcpIntAddr);
-  EXPECT_PRED4(HasCandidate, candidates_, "local", "tcp", kClientAddr);
-  EXPECT_PRED4(HasCandidate, candidates_, "relay", "ssltcp",
-               kRelaySslTcpIntAddr);
-  EXPECT_TRUE(candidate_allocation_done_);
-}
-
-// Test that we don't crash or malfunction if we can't create any sockets.
-// TODO(deadbeef): Find a way to exit early here.
-TEST_F(BasicPortAllocatorTest, TestGetAllPortsNoSockets) {
-  AddInterface(kClientAddr);
-  fss_->set_tcp_sockets_enabled(false);
-  fss_->set_udp_sockets_enabled(false);
-  EXPECT_TRUE(CreateSession(ICE_CANDIDATE_COMPONENT_RTP));
-  session_->StartGettingPorts();
-  WAIT(candidates_.size() > 0, 2000);
-  // TODO(deadbeef): Check candidate_allocation_done signal.
-  // In case of Relay, ports creation will succeed but sockets will fail.
-  // There is no error reporting from RelayEntry to handle this failure.
-}
-
-// Testing STUN timeout.
-TEST_F(BasicPortAllocatorTest, TestGetAllPortsNoUdpAllowed) {
-  fss_->AddRule(false, rtc::FP_UDP, rtc::FD_ANY, kClientAddr);
-  AddInterface(kClientAddr);
-  EXPECT_TRUE(CreateSession(ICE_CANDIDATE_COMPONENT_RTP));
-  session_->StartGettingPorts();
-  EXPECT_EQ_SIMULATED_WAIT(2U, candidates_.size(), kDefaultAllocationTimeout,
-                           fake_clock);
-  EXPECT_EQ(2U, ports_.size());
-  EXPECT_PRED4(HasCandidate, candidates_, "local", "udp", kClientAddr);
-  EXPECT_PRED4(HasCandidate, candidates_, "local", "tcp", kClientAddr);
-  // RelayPort connection timeout is 3sec. TCP connection with RelayServer
-  // will be tried after about 3 seconds.
-  EXPECT_EQ_SIMULATED_WAIT(6U, candidates_.size(), 3500, fake_clock);
-  EXPECT_EQ(3U, ports_.size());
-  EXPECT_PRED4(HasCandidate, candidates_, "relay", "udp", kRelayUdpIntAddr);
-  EXPECT_PRED4(HasCandidate, candidates_, "relay", "tcp", kRelayTcpIntAddr);
-  EXPECT_PRED4(HasCandidate, candidates_, "relay", "ssltcp",
-               kRelaySslTcpIntAddr);
-  EXPECT_PRED4(HasCandidate, candidates_, "relay", "udp", kRelayUdpExtAddr);
-  // We wait at least for a full STUN timeout, which
-  // cricket::STUN_TOTAL_TIMEOUT seconds.  But since 3-3.5 seconds
-  // already passed (see above), we wait 3 seconds less than that.
-  EXPECT_TRUE_SIMULATED_WAIT(candidate_allocation_done_,
-                             cricket::STUN_TOTAL_TIMEOUT - 3000, fake_clock);
-}
-
-TEST_F(BasicPortAllocatorTest, TestCandidatePriorityOfMultipleInterfaces) {
-  AddInterface(kClientAddr);
-  AddInterface(kClientAddr2);
-  // Allocating only host UDP ports. This is done purely for testing
-  // convenience.
-  allocator().set_flags(PORTALLOCATOR_DISABLE_TCP | PORTALLOCATOR_DISABLE_STUN |
-                        PORTALLOCATOR_DISABLE_RELAY);
-  EXPECT_TRUE(CreateSession(ICE_CANDIDATE_COMPONENT_RTP));
-  session_->StartGettingPorts();
-  EXPECT_TRUE_SIMULATED_WAIT(candidate_allocation_done_,
-                             kDefaultAllocationTimeout, fake_clock);
-  ASSERT_EQ(2U, candidates_.size());
-  EXPECT_EQ(2U, ports_.size());
-  // Candidates priorities should be different.
-  EXPECT_NE(candidates_[0].priority(), candidates_[1].priority());
-}
-
-// Test to verify ICE restart process.
-TEST_F(BasicPortAllocatorTest, TestGetAllPortsRestarts) {
-  AddInterface(kClientAddr);
-  EXPECT_TRUE(CreateSession(ICE_CANDIDATE_COMPONENT_RTP));
-  session_->StartGettingPorts();
-  EXPECT_EQ_SIMULATED_WAIT(7U, candidates_.size(), kDefaultAllocationTimeout,
-                           fake_clock);
-  EXPECT_EQ(4U, ports_.size());
-  EXPECT_TRUE(candidate_allocation_done_);
-  // TODO(deadbeef): Extend this to verify ICE restart.
-}
-
-// Test that the allocator session uses the candidate filter it's created with,
-// rather than the filter of its parent allocator.
-// The filter of the allocator should only affect the next gathering phase,
-// according to JSEP, which means the *next* allocator session returned.
-TEST_F(BasicPortAllocatorTest, TestSessionUsesOwnCandidateFilter) {
-  AddInterface(kClientAddr);
-  EXPECT_TRUE(CreateSession(ICE_CANDIDATE_COMPONENT_RTP));
-  // Set candidate filter *after* creating the session. Should have no effect.
-  allocator().set_candidate_filter(CF_RELAY);
-  session_->StartGettingPorts();
-  // 7 candidates and 4 ports is what we would normally get (see the
-  // TestGetAllPorts* tests).
-  EXPECT_EQ_SIMULATED_WAIT(7U, candidates_.size(), kDefaultAllocationTimeout,
-                           fake_clock);
-  EXPECT_EQ(4U, ports_.size());
-  EXPECT_TRUE(candidate_allocation_done_);
-}
-
-// Test ICE candidate filter mechanism with options Relay/Host/Reflexive.
-// This test also verifies that when the allocator is only allowed to use
-// relay (i.e. IceTransportsType is relay), the raddr is an empty
-// address with the correct family. This is to prevent any local
-// reflective address leakage in the sdp line.
-TEST_F(BasicPortAllocatorTest, TestCandidateFilterWithRelayOnly) {
-  AddInterface(kClientAddr);
-  // GTURN is not configured here.
-  ResetWithTurnServersNoNat(kTurnUdpIntAddr, rtc::SocketAddress());
-  allocator().set_candidate_filter(CF_RELAY);
-  EXPECT_TRUE(CreateSession(ICE_CANDIDATE_COMPONENT_RTP));
-  session_->StartGettingPorts();
-  EXPECT_TRUE_SIMULATED_WAIT(candidate_allocation_done_,
-                             kDefaultAllocationTimeout, fake_clock);
-  EXPECT_PRED4(HasCandidate, candidates_, "relay", "udp",
-               rtc::SocketAddress(kTurnUdpExtAddr.ipaddr(), 0));
-
-  EXPECT_EQ(1U, candidates_.size());
-  EXPECT_EQ(1U, ports_.size());  // Only Relay port will be in ready state.
-  EXPECT_EQ(std::string(RELAY_PORT_TYPE), candidates_[0].type());
-  EXPECT_EQ(
-      candidates_[0].related_address(),
-      rtc::EmptySocketAddressWithFamily(candidates_[0].address().family()));
-}
-
-TEST_F(BasicPortAllocatorTest, TestCandidateFilterWithHostOnly) {
-  AddInterface(kClientAddr);
-  allocator().set_flags(PORTALLOCATOR_ENABLE_SHARED_SOCKET);
-  allocator().set_candidate_filter(CF_HOST);
-  EXPECT_TRUE(CreateSession(ICE_CANDIDATE_COMPONENT_RTP));
-  session_->StartGettingPorts();
-  EXPECT_TRUE_SIMULATED_WAIT(candidate_allocation_done_,
-                             kDefaultAllocationTimeout, fake_clock);
-  EXPECT_EQ(2U, candidates_.size());  // Host UDP/TCP candidates only.
-  EXPECT_EQ(2U, ports_.size());       // UDP/TCP ports only.
-  for (const Candidate& candidate : candidates_) {
-    EXPECT_EQ(std::string(LOCAL_PORT_TYPE), candidate.type());
-  }
-}
-
-// Host is behind the NAT.
-TEST_F(BasicPortAllocatorTest, TestCandidateFilterWithReflexiveOnly) {
-  AddInterface(kPrivateAddr);
-  ResetWithStunServerAndNat(kStunAddr);
-
-  allocator().set_flags(PORTALLOCATOR_ENABLE_SHARED_SOCKET);
-  allocator().set_candidate_filter(CF_REFLEXIVE);
-  EXPECT_TRUE(CreateSession(ICE_CANDIDATE_COMPONENT_RTP));
-  session_->StartGettingPorts();
-  EXPECT_TRUE_SIMULATED_WAIT(candidate_allocation_done_,
-                             kDefaultAllocationTimeout, fake_clock);
-  // Host is behind NAT, no private address will be exposed. Hence only UDP
-  // port with STUN candidate will be sent outside.
-  EXPECT_EQ(1U, candidates_.size());  // Only STUN candidate.
-  EXPECT_EQ(1U, ports_.size());       // Only UDP port will be in ready state.
-  EXPECT_EQ(std::string(STUN_PORT_TYPE), candidates_[0].type());
-  EXPECT_EQ(
-      candidates_[0].related_address(),
-      rtc::EmptySocketAddressWithFamily(candidates_[0].address().family()));
-}
-
-// Host is not behind the NAT.
-TEST_F(BasicPortAllocatorTest, TestCandidateFilterWithReflexiveOnlyAndNoNAT) {
-  AddInterface(kClientAddr);
-  allocator().set_flags(PORTALLOCATOR_ENABLE_SHARED_SOCKET);
-  allocator().set_candidate_filter(CF_REFLEXIVE);
-  EXPECT_TRUE(CreateSession(ICE_CANDIDATE_COMPONENT_RTP));
-  session_->StartGettingPorts();
-  EXPECT_TRUE_SIMULATED_WAIT(candidate_allocation_done_,
-                             kDefaultAllocationTimeout, fake_clock);
-  // Host has a public address, both UDP and TCP candidates will be exposed.
-  EXPECT_EQ(2U, candidates_.size());  // Local UDP + TCP candidate.
-  EXPECT_EQ(2U, ports_.size());  //  UDP and TCP ports will be in ready state.
-  for (const Candidate& candidate : candidates_) {
-    EXPECT_EQ(std::string(LOCAL_PORT_TYPE), candidate.type());
-  }
-}
-
-// Test that we get the same ufrag and pwd for all candidates.
-TEST_F(BasicPortAllocatorTest, TestEnableSharedUfrag) {
-  AddInterface(kClientAddr);
-  EXPECT_TRUE(CreateSession(ICE_CANDIDATE_COMPONENT_RTP));
-  session_->StartGettingPorts();
-  ASSERT_EQ_SIMULATED_WAIT(7U, candidates_.size(), kDefaultAllocationTimeout,
-                           fake_clock);
-  EXPECT_PRED4(HasCandidate, candidates_, "local", "udp", kClientAddr);
-  EXPECT_PRED4(HasCandidate, candidates_, "stun", "udp", kClientAddr);
-  EXPECT_PRED4(HasCandidate, candidates_, "local", "tcp", kClientAddr);
-  EXPECT_EQ(4U, ports_.size());
-  for (const Candidate& candidate : candidates_) {
-    EXPECT_EQ(kIceUfrag0, candidate.username());
-    EXPECT_EQ(kIcePwd0, candidate.password());
-  }
-  EXPECT_TRUE(candidate_allocation_done_);
-}
-
-// Test that when PORTALLOCATOR_ENABLE_SHARED_SOCKET is enabled only one port
-// is allocated for udp and stun. Also verify there is only one candidate
-// (local) if stun candidate is same as local candidate, which will be the case
-// in a public network like the below test.
-TEST_F(BasicPortAllocatorTest, TestSharedSocketWithoutNat) {
-  AddInterface(kClientAddr);
-  allocator_->set_flags(allocator().flags() |
-                        PORTALLOCATOR_ENABLE_SHARED_SOCKET);
-  EXPECT_TRUE(CreateSession(ICE_CANDIDATE_COMPONENT_RTP));
-  session_->StartGettingPorts();
-  ASSERT_EQ_SIMULATED_WAIT(6U, candidates_.size(), kDefaultAllocationTimeout,
-                           fake_clock);
-  EXPECT_EQ(3U, ports_.size());
-  EXPECT_PRED4(HasCandidate, candidates_, "local", "udp", kClientAddr);
-  EXPECT_TRUE_SIMULATED_WAIT(candidate_allocation_done_,
-                             kDefaultAllocationTimeout, fake_clock);
-}
-
-// Test that when PORTALLOCATOR_ENABLE_SHARED_SOCKET is enabled only one port
-// is allocated for udp and stun. In this test we should expect both stun and
-// local candidates as client behind a nat.
-TEST_F(BasicPortAllocatorTest, TestSharedSocketWithNat) {
-  AddInterface(kClientAddr);
-  ResetWithStunServerAndNat(kStunAddr);
-
-  allocator_->set_flags(allocator().flags() |
-                        PORTALLOCATOR_ENABLE_SHARED_SOCKET);
-  EXPECT_TRUE(CreateSession(ICE_CANDIDATE_COMPONENT_RTP));
-  session_->StartGettingPorts();
-  ASSERT_EQ_SIMULATED_WAIT(3U, candidates_.size(), kDefaultAllocationTimeout,
-                           fake_clock);
-  ASSERT_EQ(2U, ports_.size());
-  EXPECT_PRED4(HasCandidate, candidates_, "local", "udp", kClientAddr);
-  EXPECT_PRED4(HasCandidate, candidates_, "stun", "udp",
-               rtc::SocketAddress(kNatUdpAddr.ipaddr(), 0));
-  EXPECT_TRUE_SIMULATED_WAIT(candidate_allocation_done_,
-                             kDefaultAllocationTimeout, fake_clock);
-  EXPECT_EQ(3U, candidates_.size());
-}
-
-// Test TURN port in shared socket mode with UDP and TCP TURN server addresses.
-TEST_F(BasicPortAllocatorTest, TestSharedSocketWithoutNatUsingTurn) {
-  turn_server_.AddInternalSocket(kTurnTcpIntAddr, PROTO_TCP);
-  AddInterface(kClientAddr);
-  allocator_.reset(new BasicPortAllocator(&network_manager_));
-
-  AddTurnServers(kTurnUdpIntAddr, kTurnTcpIntAddr);
-
-  allocator_->set_step_delay(kMinimumStepDelay);
-  allocator_->set_flags(allocator().flags() |
-                        PORTALLOCATOR_ENABLE_SHARED_SOCKET |
-                        PORTALLOCATOR_DISABLE_TCP);
-
-  EXPECT_TRUE(CreateSession(ICE_CANDIDATE_COMPONENT_RTP));
-  session_->StartGettingPorts();
-
-  ASSERT_EQ_SIMULATED_WAIT(3U, candidates_.size(), kDefaultAllocationTimeout,
-                           fake_clock);
-  ASSERT_EQ(3U, ports_.size());
-  EXPECT_PRED4(HasCandidate, candidates_, "local", "udp", kClientAddr);
-  EXPECT_PRED4(HasCandidate, candidates_, "relay", "udp",
-               rtc::SocketAddress(kTurnUdpExtAddr.ipaddr(), 0));
-  EXPECT_PRED4(HasCandidate, candidates_, "relay", "udp",
-               rtc::SocketAddress(kTurnUdpExtAddr.ipaddr(), 0));
-  EXPECT_TRUE_SIMULATED_WAIT(candidate_allocation_done_,
-                             kDefaultAllocationTimeout, fake_clock);
-  EXPECT_EQ(3U, candidates_.size());
-}
-
-// Test that if prune_turn_ports is set, TCP TURN port will not be used
-// if UDP TurnPort is used, given that TCP TURN port becomes ready first.
-TEST_F(BasicPortAllocatorTest,
-       TestUdpTurnPortPrunesTcpTurnPortWithTcpPortReadyFirst) {
-  // UDP has longer delay than TCP so that TCP TURN port becomes ready first.
-  virtual_socket_server()->SetDelayOnAddress(kTurnUdpIntAddr, 200);
-  virtual_socket_server()->SetDelayOnAddress(kTurnTcpIntAddr, 100);
-
-  TestUdpTurnPortPrunesTcpTurnPort();
-}
-
-// Test that if prune_turn_ports is set, TCP TURN port will not be used
-// if UDP TurnPort is used, given that UDP TURN port becomes ready first.
-TEST_F(BasicPortAllocatorTest,
-       TestUdpTurnPortPrunesTcpTurnPortsWithUdpPortReadyFirst) {
-  // UDP has shorter delay than TCP so that UDP TURN port becomes ready first.
-  virtual_socket_server()->SetDelayOnAddress(kTurnUdpIntAddr, 100);
-  virtual_socket_server()->SetDelayOnAddress(kTurnTcpIntAddr, 200);
-
-  TestUdpTurnPortPrunesTcpTurnPort();
-}
-
-// Tests that if prune_turn_ports is set, IPv4 TurnPort will not be used
-// if IPv6 TurnPort is used, given that IPv4 TURN port becomes ready first.
-TEST_F(BasicPortAllocatorTest,
-       TestIPv6TurnPortPrunesIPv4TurnPortWithIPv4PortReadyFirst) {
-  // IPv6 has longer delay than IPv4, so that IPv4 TURN port becomes ready
-  // first.
-  virtual_socket_server()->SetDelayOnAddress(kTurnUdpIntAddr, 100);
-  virtual_socket_server()->SetDelayOnAddress(kTurnUdpIntIPv6Addr, 200);
-
-  TestIPv6TurnPortPrunesIPv4TurnPort();
-}
-
-// Tests that if prune_turn_ports is set, IPv4 TurnPort will not be used
-// if IPv6 TurnPort is used, given that IPv6 TURN port becomes ready first.
-TEST_F(BasicPortAllocatorTest,
-       TestIPv6TurnPortPrunesIPv4TurnPortWithIPv6PortReadyFirst) {
-  // IPv6 has longer delay than IPv4, so that IPv6 TURN port becomes ready
-  // first.
-  virtual_socket_server()->SetDelayOnAddress(kTurnUdpIntAddr, 200);
-  virtual_socket_server()->SetDelayOnAddress(kTurnUdpIntIPv6Addr, 100);
-
-  TestIPv6TurnPortPrunesIPv4TurnPort();
-}
-
-// Tests that if prune_turn_ports is set, each network interface
-// will has its own set of TurnPorts based on their priorities, in the default
-// case where no transit delay is set.
-TEST_F(BasicPortAllocatorTest, TestEachInterfaceHasItsOwnTurnPortsNoDelay) {
-  TestEachInterfaceHasItsOwnTurnPorts();
-}
-
-// Tests that if prune_turn_ports is set, each network interface
-// will has its own set of TurnPorts based on their priorities, given that
-// IPv4/TCP TURN port becomes ready first.
-TEST_F(BasicPortAllocatorTest,
-       TestEachInterfaceHasItsOwnTurnPortsWithTcpIPv4ReadyFirst) {
-  // IPv6/UDP have longer delay than IPv4/TCP, so that IPv4/TCP TURN port
-  // becomes ready last.
-  virtual_socket_server()->SetDelayOnAddress(kTurnTcpIntAddr, 10);
-  virtual_socket_server()->SetDelayOnAddress(kTurnUdpIntAddr, 100);
-  virtual_socket_server()->SetDelayOnAddress(kTurnTcpIntIPv6Addr, 20);
-  virtual_socket_server()->SetDelayOnAddress(kTurnUdpIntIPv6Addr, 300);
-
-  TestEachInterfaceHasItsOwnTurnPorts();
-}
-
-// Testing DNS resolve for the TURN server, this will test AllocationSequence
-// handling the unresolved address signal from TurnPort.
-// TODO(pthatcher): Make this test work with SIMULATED_WAIT. It
-// appears that it doesn't currently because of the DNS look up not
-// using the fake clock.
-TEST_F(BasicPortAllocatorTestWithRealClock,
-       TestSharedSocketWithServerAddressResolve) {
-  // This test relies on a real query for "localhost", so it won't work on an
-  // IPv6-only machine.
-  MAYBE_SKIP_IPV4;
-  turn_server_.AddInternalSocket(rtc::SocketAddress("127.0.0.1", 3478),
-                                 PROTO_UDP);
-  AddInterface(kClientAddr);
-  allocator_.reset(new BasicPortAllocator(&network_manager_));
-  RelayServerConfig turn_server(RELAY_TURN);
-  RelayCredentials credentials(kTurnUsername, kTurnPassword);
-  turn_server.credentials = credentials;
-  turn_server.ports.push_back(
-      ProtocolAddress(rtc::SocketAddress("localhost", 3478), PROTO_UDP));
-  allocator_->AddTurnServer(turn_server);
-
-  allocator_->set_step_delay(kMinimumStepDelay);
-  allocator_->set_flags(allocator().flags() |
-                        PORTALLOCATOR_ENABLE_SHARED_SOCKET |
-                        PORTALLOCATOR_DISABLE_TCP);
-
-  EXPECT_TRUE(CreateSession(ICE_CANDIDATE_COMPONENT_RTP));
-  session_->StartGettingPorts();
-
-  EXPECT_EQ_WAIT(2U, ports_.size(), kDefaultAllocationTimeout);
-}
-
-// Test that when PORTALLOCATOR_ENABLE_SHARED_SOCKET is enabled only one port
-// is allocated for udp/stun/turn. In this test we should expect all local,
-// stun and turn candidates.
-TEST_F(BasicPortAllocatorTest, TestSharedSocketWithNatUsingTurn) {
-  AddInterface(kClientAddr);
-  ResetWithStunServerAndNat(kStunAddr);
-
-  AddTurnServers(kTurnUdpIntAddr, rtc::SocketAddress());
-
-  allocator_->set_flags(allocator().flags() |
-                        PORTALLOCATOR_ENABLE_SHARED_SOCKET |
-                        PORTALLOCATOR_DISABLE_TCP);
-
-  EXPECT_TRUE(CreateSession(ICE_CANDIDATE_COMPONENT_RTP));
-  session_->StartGettingPorts();
-
-  ASSERT_EQ_SIMULATED_WAIT(3U, candidates_.size(), kDefaultAllocationTimeout,
-                           fake_clock);
-  ASSERT_EQ(2U, ports_.size());
-  EXPECT_PRED4(HasCandidate, candidates_, "local", "udp", kClientAddr);
-  EXPECT_PRED4(HasCandidate, candidates_, "stun", "udp",
-               rtc::SocketAddress(kNatUdpAddr.ipaddr(), 0));
-  EXPECT_PRED4(HasCandidate, candidates_, "relay", "udp",
-               rtc::SocketAddress(kTurnUdpExtAddr.ipaddr(), 0));
-  EXPECT_TRUE_SIMULATED_WAIT(candidate_allocation_done_,
-                             kDefaultAllocationTimeout, fake_clock);
-  EXPECT_EQ(3U, candidates_.size());
-  // Local port will be created first and then TURN port.
-  EXPECT_EQ(2U, ports_[0]->Candidates().size());
-  EXPECT_EQ(1U, ports_[1]->Candidates().size());
-}
-
-// Test that when PORTALLOCATOR_ENABLE_SHARED_SOCKET is enabled and the TURN
-// server is also used as the STUN server, we should get 'local', 'stun', and
-// 'relay' candidates.
-TEST_F(BasicPortAllocatorTest, TestSharedSocketWithNatUsingTurnAsStun) {
-  AddInterface(kClientAddr);
-  // Use an empty SocketAddress to add a NAT without STUN server.
-  ResetWithStunServerAndNat(SocketAddress());
-  AddTurnServers(kTurnUdpIntAddr, rtc::SocketAddress());
-
-  // Must set the step delay to 0 to make sure the relay allocation phase is
-  // started before the STUN candidates are obtained, so that the STUN binding
-  // response is processed when both StunPort and TurnPort exist to reproduce
-  // webrtc issue 3537.
-  allocator_->set_step_delay(0);
-  allocator_->set_flags(allocator().flags() |
-                        PORTALLOCATOR_ENABLE_SHARED_SOCKET |
-                        PORTALLOCATOR_DISABLE_TCP);
-
-  EXPECT_TRUE(CreateSession(ICE_CANDIDATE_COMPONENT_RTP));
-  session_->StartGettingPorts();
-
-  ASSERT_EQ_SIMULATED_WAIT(3U, candidates_.size(), kDefaultAllocationTimeout,
-                           fake_clock);
-  EXPECT_PRED4(HasCandidate, candidates_, "local", "udp", kClientAddr);
-  Candidate stun_candidate;
-  EXPECT_PRED5(FindCandidate, candidates_, "stun", "udp",
-               rtc::SocketAddress(kNatUdpAddr.ipaddr(), 0), &stun_candidate);
-  EXPECT_PRED5(HasCandidateWithRelatedAddr, candidates_, "relay", "udp",
-               rtc::SocketAddress(kTurnUdpExtAddr.ipaddr(), 0),
-               stun_candidate.address());
-
-  EXPECT_TRUE_SIMULATED_WAIT(candidate_allocation_done_,
-                             kDefaultAllocationTimeout, fake_clock);
-  EXPECT_EQ(3U, candidates_.size());
-  // Local port will be created first and then TURN port.
-  EXPECT_EQ(2U, ports_[0]->Candidates().size());
-  EXPECT_EQ(1U, ports_[1]->Candidates().size());
-}
-
-// Test that when only a TCP TURN server is available, we do NOT use it as
-// a UDP STUN server, as this could leak our IP address. Thus we should only
-// expect two ports, a UDPPort and TurnPort.
-TEST_F(BasicPortAllocatorTest, TestSharedSocketWithNatUsingTurnTcpOnly) {
-  turn_server_.AddInternalSocket(kTurnTcpIntAddr, PROTO_TCP);
-  AddInterface(kClientAddr);
-  ResetWithStunServerAndNat(rtc::SocketAddress());
-  AddTurnServers(rtc::SocketAddress(), kTurnTcpIntAddr);
-
-  allocator_->set_flags(allocator().flags() |
-                        PORTALLOCATOR_ENABLE_SHARED_SOCKET |
-                        PORTALLOCATOR_DISABLE_TCP);
-
-  EXPECT_TRUE(CreateSession(ICE_CANDIDATE_COMPONENT_RTP));
-  session_->StartGettingPorts();
-
-  ASSERT_EQ_SIMULATED_WAIT(2U, candidates_.size(), kDefaultAllocationTimeout,
-                           fake_clock);
-  ASSERT_EQ(2U, ports_.size());
-  EXPECT_PRED4(HasCandidate, candidates_, "local", "udp", kClientAddr);
-  EXPECT_PRED4(HasCandidate, candidates_, "relay", "udp",
-               rtc::SocketAddress(kTurnUdpExtAddr.ipaddr(), 0));
-  EXPECT_TRUE_SIMULATED_WAIT(candidate_allocation_done_,
-                             kDefaultAllocationTimeout, fake_clock);
-  EXPECT_EQ(2U, candidates_.size());
-  EXPECT_EQ(1U, ports_[0]->Candidates().size());
-  EXPECT_EQ(1U, ports_[1]->Candidates().size());
-}
-
-// Test that even when PORTALLOCATOR_ENABLE_SHARED_SOCKET is NOT enabled, the
-// TURN server is used as the STUN server and we get 'local', 'stun', and
-// 'relay' candidates.
-// TODO(deadbeef): Remove this test when support for non-shared socket mode
-// is removed.
-TEST_F(BasicPortAllocatorTest, TestNonSharedSocketWithNatUsingTurnAsStun) {
-  AddInterface(kClientAddr);
-  // Use an empty SocketAddress to add a NAT without STUN server.
-  ResetWithStunServerAndNat(SocketAddress());
-  AddTurnServers(kTurnUdpIntAddr, rtc::SocketAddress());
-
-  allocator_->set_flags(allocator().flags() | PORTALLOCATOR_DISABLE_TCP);
-
-  EXPECT_TRUE(CreateSession(ICE_CANDIDATE_COMPONENT_RTP));
-  session_->StartGettingPorts();
-
-  ASSERT_EQ_SIMULATED_WAIT(3U, candidates_.size(), kDefaultAllocationTimeout,
-                           fake_clock);
-  ASSERT_EQ(3U, ports_.size());
-  EXPECT_PRED4(HasCandidate, candidates_, "local", "udp", kClientAddr);
-  Candidate stun_candidate;
-  EXPECT_PRED5(FindCandidate, candidates_, "stun", "udp",
-               rtc::SocketAddress(kNatUdpAddr.ipaddr(), 0), &stun_candidate);
-  Candidate turn_candidate;
-  EXPECT_PRED5(FindCandidate, candidates_, "relay", "udp",
-               rtc::SocketAddress(kTurnUdpExtAddr.ipaddr(), 0),
-               &turn_candidate);
-  // Not using shared socket, so the STUN request's server reflexive address
-  // should be different than the TURN request's server reflexive address.
-  EXPECT_NE(turn_candidate.related_address(), stun_candidate.address());
-
-  EXPECT_TRUE_SIMULATED_WAIT(candidate_allocation_done_,
-                             kDefaultAllocationTimeout, fake_clock);
-  EXPECT_EQ(3U, candidates_.size());
-  EXPECT_EQ(1U, ports_[0]->Candidates().size());
-  EXPECT_EQ(1U, ports_[1]->Candidates().size());
-  EXPECT_EQ(1U, ports_[2]->Candidates().size());
-}
-
-// Test that even when both a STUN and TURN server are configured, the TURN
-// server is used as a STUN server and we get a 'stun' candidate.
-TEST_F(BasicPortAllocatorTest, TestSharedSocketWithNatUsingTurnAndStun) {
-  AddInterface(kClientAddr);
-  // Configure with STUN server but destroy it, so we can ensure that it's
-  // the TURN server actually being used as a STUN server.
-  ResetWithStunServerAndNat(kStunAddr);
-  stun_server_.reset();
-  AddTurnServers(kTurnUdpIntAddr, rtc::SocketAddress());
-
-  allocator_->set_flags(allocator().flags() |
-                        PORTALLOCATOR_ENABLE_SHARED_SOCKET |
-                        PORTALLOCATOR_DISABLE_TCP);
-
-  EXPECT_TRUE(CreateSession(ICE_CANDIDATE_COMPONENT_RTP));
-  session_->StartGettingPorts();
-
-  ASSERT_EQ_SIMULATED_WAIT(3U, candidates_.size(), kDefaultAllocationTimeout,
-                           fake_clock);
-  EXPECT_PRED4(HasCandidate, candidates_, "local", "udp", kClientAddr);
-  Candidate stun_candidate;
-  EXPECT_PRED5(FindCandidate, candidates_, "stun", "udp",
-               rtc::SocketAddress(kNatUdpAddr.ipaddr(), 0), &stun_candidate);
-  EXPECT_PRED5(HasCandidateWithRelatedAddr, candidates_, "relay", "udp",
-               rtc::SocketAddress(kTurnUdpExtAddr.ipaddr(), 0),
-               stun_candidate.address());
-
-  // Don't bother waiting for STUN timeout, since we already verified
-  // that we got a STUN candidate from the TURN server.
-}
-
-// This test verifies when PORTALLOCATOR_ENABLE_SHARED_SOCKET flag is enabled
-// and fail to generate STUN candidate, local UDP candidate is generated
-// properly.
-TEST_F(BasicPortAllocatorTest, TestSharedSocketNoUdpAllowed) {
-  allocator().set_flags(allocator().flags() | PORTALLOCATOR_DISABLE_RELAY |
-                        PORTALLOCATOR_DISABLE_TCP |
-                        PORTALLOCATOR_ENABLE_SHARED_SOCKET);
-  fss_->AddRule(false, rtc::FP_UDP, rtc::FD_ANY, kClientAddr);
-  AddInterface(kClientAddr);
-  EXPECT_TRUE(CreateSession(ICE_CANDIDATE_COMPONENT_RTP));
-  session_->StartGettingPorts();
-  ASSERT_EQ_SIMULATED_WAIT(1U, ports_.size(), kDefaultAllocationTimeout,
-                           fake_clock);
-  EXPECT_EQ(1U, candidates_.size());
-  EXPECT_PRED4(HasCandidate, candidates_, "local", "udp", kClientAddr);
-  // STUN timeout is 9.5sec. We need to wait to get candidate done signal.
-  EXPECT_TRUE_SIMULATED_WAIT(candidate_allocation_done_, kStunTimeoutMs,
-                             fake_clock);
-  EXPECT_EQ(1U, candidates_.size());
-}
-
-// Test that when the NetworkManager doesn't have permission to enumerate
-// adapters, the PORTALLOCATOR_DISABLE_ADAPTER_ENUMERATION is specified
-// automatically.
-TEST_F(BasicPortAllocatorTest, TestNetworkPermissionBlocked) {
-  network_manager_.set_default_local_addresses(kPrivateAddr.ipaddr(),
-                                               rtc::IPAddress());
-  network_manager_.set_enumeration_permission(
-      rtc::NetworkManager::ENUMERATION_BLOCKED);
-  allocator().set_flags(allocator().flags() | PORTALLOCATOR_DISABLE_RELAY |
-                        PORTALLOCATOR_DISABLE_TCP |
-                        PORTALLOCATOR_ENABLE_SHARED_SOCKET);
-  EXPECT_EQ(0U,
-            allocator_->flags() & PORTALLOCATOR_DISABLE_ADAPTER_ENUMERATION);
-  EXPECT_TRUE(CreateSession(ICE_CANDIDATE_COMPONENT_RTP));
-  EXPECT_EQ(0U, session_->flags() & PORTALLOCATOR_DISABLE_ADAPTER_ENUMERATION);
-  session_->StartGettingPorts();
-  EXPECT_EQ_SIMULATED_WAIT(1U, ports_.size(), kDefaultAllocationTimeout,
-                           fake_clock);
-  EXPECT_EQ(1U, candidates_.size());
-  EXPECT_PRED4(HasCandidate, candidates_, "local", "udp", kPrivateAddr);
-  EXPECT_NE(0U, session_->flags() & PORTALLOCATOR_DISABLE_ADAPTER_ENUMERATION);
-}
-
-// This test verifies allocator can use IPv6 addresses along with IPv4.
-TEST_F(BasicPortAllocatorTest, TestEnableIPv6Addresses) {
-  allocator().set_flags(allocator().flags() | PORTALLOCATOR_DISABLE_RELAY |
-                        PORTALLOCATOR_ENABLE_IPV6 |
-                        PORTALLOCATOR_ENABLE_SHARED_SOCKET);
-  AddInterface(kClientIPv6Addr);
-  AddInterface(kClientAddr);
-  allocator_->set_step_delay(kMinimumStepDelay);
-  EXPECT_TRUE(CreateSession(ICE_CANDIDATE_COMPONENT_RTP));
-  session_->StartGettingPorts();
-  ASSERT_EQ_SIMULATED_WAIT(4U, ports_.size(), kDefaultAllocationTimeout,
-                           fake_clock);
-  EXPECT_EQ(4U, candidates_.size());
-  EXPECT_TRUE_SIMULATED_WAIT(candidate_allocation_done_,
-                             kDefaultAllocationTimeout, fake_clock);
-  EXPECT_PRED4(HasCandidate, candidates_, "local", "udp", kClientIPv6Addr);
-  EXPECT_PRED4(HasCandidate, candidates_, "local", "udp", kClientAddr);
-  EXPECT_PRED4(HasCandidate, candidates_, "local", "tcp", kClientIPv6Addr);
-  EXPECT_PRED4(HasCandidate, candidates_, "local", "tcp", kClientAddr);
-  EXPECT_EQ(4U, candidates_.size());
-}
-
-TEST_F(BasicPortAllocatorTest, TestStopGettingPorts) {
-  AddInterface(kClientAddr);
-  allocator_->set_step_delay(kDefaultStepDelay);
-  EXPECT_TRUE(CreateSession(ICE_CANDIDATE_COMPONENT_RTP));
-  session_->StartGettingPorts();
-  ASSERT_EQ_SIMULATED_WAIT(2U, candidates_.size(), 1000, fake_clock);
-  EXPECT_EQ(2U, ports_.size());
-  session_->StopGettingPorts();
-  EXPECT_TRUE_SIMULATED_WAIT(candidate_allocation_done_, 1000, fake_clock);
-
-  // After stopping getting ports, adding a new interface will not start
-  // getting ports again.
-  allocator_->set_step_delay(kMinimumStepDelay);
-  candidates_.clear();
-  ports_.clear();
-  candidate_allocation_done_ = false;
-  network_manager_.AddInterface(kClientAddr2);
-  SIMULATED_WAIT(false, 1000, fake_clock);
-  EXPECT_EQ(0U, candidates_.size());
-  EXPECT_EQ(0U, ports_.size());
-}
-
-TEST_F(BasicPortAllocatorTest, TestClearGettingPorts) {
-  AddInterface(kClientAddr);
-  allocator_->set_step_delay(kDefaultStepDelay);
-  EXPECT_TRUE(CreateSession(ICE_CANDIDATE_COMPONENT_RTP));
-  session_->StartGettingPorts();
-  ASSERT_EQ_SIMULATED_WAIT(2U, candidates_.size(), 1000, fake_clock);
-  EXPECT_EQ(2U, ports_.size());
-  session_->ClearGettingPorts();
-  EXPECT_TRUE_SIMULATED_WAIT(candidate_allocation_done_, 1000, fake_clock);
-
-  // After clearing getting ports, adding a new interface will start getting
-  // ports again.
-  allocator_->set_step_delay(kMinimumStepDelay);
-  candidates_.clear();
-  ports_.clear();
-  candidate_allocation_done_ = false;
-  network_manager_.AddInterface(kClientAddr2);
-  ASSERT_EQ_SIMULATED_WAIT(2U, candidates_.size(), 1000, fake_clock);
-  EXPECT_EQ(2U, ports_.size());
-  EXPECT_TRUE_SIMULATED_WAIT(candidate_allocation_done_,
-                             kDefaultAllocationTimeout, fake_clock);
-}
-
-// Test that the ports and candidates are updated with new ufrag/pwd/etc. when
-// a pooled session is taken out of the pool.
-TEST_F(BasicPortAllocatorTest, TestTransportInformationUpdated) {
-  AddInterface(kClientAddr);
-  int pool_size = 1;
-  allocator_->SetConfiguration(allocator_->stun_servers(),
-                               allocator_->turn_servers(), pool_size, false);
-  const PortAllocatorSession* peeked_session = allocator_->GetPooledSession();
-  ASSERT_NE(nullptr, peeked_session);
-  EXPECT_EQ_SIMULATED_WAIT(true, peeked_session->CandidatesAllocationDone(),
-                           kDefaultAllocationTimeout, fake_clock);
-  // Expect that when TakePooledSession is called,
-  // UpdateTransportInformationInternal will be called and the
-  // BasicPortAllocatorSession will update the ufrag/pwd of ports and
-  // candidates.
-  session_ =
-      allocator_->TakePooledSession(kContentName, 1, kIceUfrag0, kIcePwd0);
-  ASSERT_NE(nullptr, session_.get());
-  auto ready_ports = session_->ReadyPorts();
-  auto candidates = session_->ReadyCandidates();
-  EXPECT_FALSE(ready_ports.empty());
-  EXPECT_FALSE(candidates.empty());
-  for (const PortInterface* port_interface : ready_ports) {
-    const Port* port = static_cast<const Port*>(port_interface);
-    EXPECT_EQ(kContentName, port->content_name());
-    EXPECT_EQ(1, port->component());
-    EXPECT_EQ(kIceUfrag0, port->username_fragment());
-    EXPECT_EQ(kIcePwd0, port->password());
-  }
-  for (const Candidate& candidate : candidates) {
-    EXPECT_EQ(1, candidate.component());
-    EXPECT_EQ(kIceUfrag0, candidate.username());
-    EXPECT_EQ(kIcePwd0, candidate.password());
-  }
-}
-
-// Test that a new candidate filter takes effect even on already-gathered
-// candidates.
-TEST_F(BasicPortAllocatorTest, TestSetCandidateFilterAfterCandidatesGathered) {
-  AddInterface(kClientAddr);
-  int pool_size = 1;
-  allocator_->SetConfiguration(allocator_->stun_servers(),
-                               allocator_->turn_servers(), pool_size, false);
-  const PortAllocatorSession* peeked_session = allocator_->GetPooledSession();
-  ASSERT_NE(nullptr, peeked_session);
-  EXPECT_EQ_SIMULATED_WAIT(true, peeked_session->CandidatesAllocationDone(),
-                           kDefaultAllocationTimeout, fake_clock);
-  size_t initial_candidates_size = peeked_session->ReadyCandidates().size();
-  size_t initial_ports_size = peeked_session->ReadyPorts().size();
-  allocator_->set_candidate_filter(CF_RELAY);
-  // Assume that when TakePooledSession is called, the candidate filter will be
-  // applied to the pooled session. This is tested by PortAllocatorTest.
-  session_ =
-      allocator_->TakePooledSession(kContentName, 1, kIceUfrag0, kIcePwd0);
-  ASSERT_NE(nullptr, session_.get());
-  auto candidates = session_->ReadyCandidates();
-  auto ports = session_->ReadyPorts();
-  // Sanity check that the number of candidates and ports decreased.
-  EXPECT_GT(initial_candidates_size, candidates.size());
-  EXPECT_GT(initial_ports_size, ports.size());
-  for (const PortInterface* port : ports) {
-    // Expect only relay ports.
-    EXPECT_EQ(RELAY_PORT_TYPE, port->Type());
-  }
-  for (const Candidate& candidate : candidates) {
-    // Expect only relay candidates now that the filter is applied.
-    EXPECT_EQ(std::string(RELAY_PORT_TYPE), candidate.type());
-    // Expect that the raddr is emptied due to the CF_RELAY filter.
-    EXPECT_EQ(candidate.related_address(),
-              rtc::EmptySocketAddressWithFamily(candidate.address().family()));
-  }
-}
-
-}  // namespace cricket
diff --git a/p2p/client/socketmonitor.cc b/p2p/client/socketmonitor.cc
deleted file mode 100644
index 4e26e42..0000000
--- a/p2p/client/socketmonitor.cc
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- *  Copyright 2004 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/p2p/client/socketmonitor.h"
-
-#include "webrtc/rtc_base/checks.h"
-
-namespace cricket {
-
-enum {
-  MSG_MONITOR_POLL,
-  MSG_MONITOR_START,
-  MSG_MONITOR_STOP,
-  MSG_MONITOR_SIGNAL
-};
-
-ConnectionMonitor::ConnectionMonitor(ConnectionStatsGetter* stats_getter,
-                                     rtc::Thread* network_thread,
-                                     rtc::Thread* monitoring_thread) {
-  stats_getter_ = stats_getter;
-  network_thread_ = network_thread;
-  monitoring_thread_ = monitoring_thread;
-  monitoring_ = false;
-}
-
-ConnectionMonitor::~ConnectionMonitor() {
-  network_thread_->Clear(this);
-  monitoring_thread_->Clear(this);
-}
-
-void ConnectionMonitor::Start(int milliseconds) {
-  rate_ = milliseconds;
-  if (rate_ < 250)
-    rate_ = 250;
-  network_thread_->Post(RTC_FROM_HERE, this, MSG_MONITOR_START);
-}
-
-void ConnectionMonitor::Stop() {
-  network_thread_->Post(RTC_FROM_HERE, this, MSG_MONITOR_STOP);
-}
-
-void ConnectionMonitor::OnMessage(rtc::Message *message) {
-  rtc::CritScope cs(&crit_);
-  switch (message->message_id) {
-    case MSG_MONITOR_START:
-      RTC_DCHECK(rtc::Thread::Current() == network_thread_);
-      if (!monitoring_) {
-        monitoring_ = true;
-        PollConnectionStats_w();
-      }
-      break;
-
-    case MSG_MONITOR_STOP:
-      RTC_DCHECK(rtc::Thread::Current() == network_thread_);
-      if (monitoring_) {
-        monitoring_ = false;
-        network_thread_->Clear(this);
-      }
-      break;
-
-    case MSG_MONITOR_POLL:
-      RTC_DCHECK(rtc::Thread::Current() == network_thread_);
-      PollConnectionStats_w();
-      break;
-
-    case MSG_MONITOR_SIGNAL: {
-      RTC_DCHECK(rtc::Thread::Current() == monitoring_thread_);
-      std::vector<ConnectionInfo> infos = connection_infos_;
-      crit_.Leave();
-      SignalUpdate(this, infos);
-      crit_.Enter();
-      break;
-    }
-  }
-}
-
-void ConnectionMonitor::PollConnectionStats_w() {
-  RTC_DCHECK(rtc::Thread::Current() == network_thread_);
-  rtc::CritScope cs(&crit_);
-
-  // Gather connection infos
-  stats_getter_->GetConnectionStats(&connection_infos_);
-
-  // Signal the monitoring thread, start another poll timer
-  monitoring_thread_->Post(RTC_FROM_HERE, this, MSG_MONITOR_SIGNAL);
-  network_thread_->PostDelayed(RTC_FROM_HERE, rate_, this, MSG_MONITOR_POLL);
-}
-
-}  // namespace cricket
diff --git a/p2p/client/socketmonitor.h b/p2p/client/socketmonitor.h
deleted file mode 100644
index 4cb1899..0000000
--- a/p2p/client/socketmonitor.h
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- *  Copyright 2004 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_P2P_CLIENT_SOCKETMONITOR_H_
-#define WEBRTC_P2P_CLIENT_SOCKETMONITOR_H_
-
-#include <vector>
-
-#include "webrtc/p2p/base/jseptransport.h"  // for ConnectionInfos
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/sigslot.h"
-#include "webrtc/rtc_base/thread.h"
-
-// TODO(pthatcher): Move these to connectionmonitor.h and
-// connectionmonitor.cc, or just move them into channel.cc
-
-namespace cricket {
-
-class ConnectionStatsGetter {
- public:
-  virtual ~ConnectionStatsGetter() {}
-  virtual bool GetConnectionStats(ConnectionInfos* infos) = 0;
-};
-
-class ConnectionMonitor : public rtc::MessageHandler,
-                          public sigslot::has_slots<> {
-public:
-  ConnectionMonitor(ConnectionStatsGetter* stats_getter,
-                    rtc::Thread* network_thread,
-                    rtc::Thread* monitoring_thread);
-  ~ConnectionMonitor();
-
-  void Start(int cms);
-  void Stop();
-
-  sigslot::signal2<ConnectionMonitor*,
-                   const std::vector<ConnectionInfo>&> SignalUpdate;
-
- protected:
-  void OnMessage(rtc::Message* message);
- private:
-  void PollConnectionStats_w();
-
-  std::vector<ConnectionInfo> connection_infos_;
-  ConnectionStatsGetter* stats_getter_;
-  rtc::Thread* network_thread_;
-  rtc::Thread* monitoring_thread_;
-  rtc::CriticalSection crit_;
-  uint32_t rate_;
-  bool monitoring_;
-};
-
-}  // namespace cricket
-
-#endif  // WEBRTC_P2P_CLIENT_SOCKETMONITOR_H_
diff --git a/p2p/quic/quicconnectionhelper.cc b/p2p/quic/quicconnectionhelper.cc
deleted file mode 100644
index 2b40820..0000000
--- a/p2p/quic/quicconnectionhelper.cc
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- *  Copyright 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/p2p/quic/quicconnectionhelper.h"
-
-namespace cricket {
-
-QuicAlarm* QuicConnectionHelper::CreateAlarm(
-    net::QuicAlarm::Delegate* delegate) {
-  return new QuicAlarm(GetClock(), thread_,
-                       net::QuicArenaScopedPtr<QuicAlarm::Delegate>(delegate));
-}
-
-net::QuicArenaScopedPtr<net::QuicAlarm> QuicConnectionHelper::CreateAlarm(
-    net::QuicArenaScopedPtr<QuicAlarm::Delegate> delegate,
-    net::QuicConnectionArena* arena) {
-  return net::QuicArenaScopedPtr<QuicAlarm>(
-      new QuicAlarm(GetClock(), thread_, std::move(delegate)));
-}
-
-QuicAlarm::QuicAlarm(const net::QuicClock* clock,
-                     rtc::Thread* thread,
-                     net::QuicArenaScopedPtr<net::QuicAlarm::Delegate> delegate)
-    : net::QuicAlarm(std::move(delegate)), clock_(clock), thread_(thread) {}
-
-QuicAlarm::~QuicAlarm() {}
-
-void QuicAlarm::OnMessage(rtc::Message* msg) {
-  // The alarm may have been cancelled.
-  if (!deadline().IsInitialized()) {
-    return;
-  }
-
-  // The alarm may have been re-set to a later time.
-  if (clock_->Now() < deadline()) {
-    SetImpl();
-    return;
-  }
-
-  Fire();
-}
-
-int64_t QuicAlarm::GetDelay() const {
-  return deadline().Subtract(clock_->Now()).ToMilliseconds();
-}
-
-void QuicAlarm::SetImpl() {
-  DCHECK(deadline().IsInitialized());
-  CancelImpl();  // Unregister if already posted.
-
-  int64_t delay_ms = GetDelay();
-  if (delay_ms < 0) {
-    delay_ms = 0;
-  }
-  thread_->PostDelayed(RTC_FROM_HERE, delay_ms, this);
-}
-
-void QuicAlarm::CancelImpl() {
-  thread_->Clear(this);
-}
-
-QuicConnectionHelper::QuicConnectionHelper(rtc::Thread* thread)
-    : thread_(thread) {}
-
-QuicConnectionHelper::~QuicConnectionHelper() {}
-
-const net::QuicClock* QuicConnectionHelper::GetClock() const {
-  return &clock_;
-}
-
-net::QuicRandom* QuicConnectionHelper::GetRandomGenerator() {
-  return net::QuicRandom::GetInstance();
-}
-
-net::QuicBufferAllocator* QuicConnectionHelper::GetBufferAllocator() {
-  return &buffer_allocator_;
-}
-
-}  // namespace cricket
diff --git a/p2p/quic/quicconnectionhelper.h b/p2p/quic/quicconnectionhelper.h
deleted file mode 100644
index 07894f0..0000000
--- a/p2p/quic/quicconnectionhelper.h
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- *  Copyright 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_P2P_QUIC_QUICCONNECTIONHELPER_H_
-#define WEBRTC_P2P_QUIC_QUICCONNECTIONHELPER_H_
-
-#include "net/quic/crypto/quic_random.h"
-#include "net/quic/quic_alarm.h"
-#include "net/quic/quic_clock.h"
-#include "net/quic/quic_connection.h"
-#include "net/quic/quic_simple_buffer_allocator.h"
-#include "webrtc/rtc_base/thread.h"
-
-namespace cricket {
-
-// An alarm which will go off at a scheduled time, and execute the |OnAlarm|
-// method of the delegate.
-class QuicAlarm : public net::QuicAlarm, public rtc::MessageHandler {
- public:
-  QuicAlarm(const net::QuicClock* clock,
-            rtc::Thread* thread,
-            net::QuicArenaScopedPtr<net::QuicAlarm::Delegate> delegate);
-
-  ~QuicAlarm() override;
-
-  // rtc::MessageHandler override.
-  void OnMessage(rtc::Message* msg) override;
-
-  // Helper method to get the delay in ms for posting task.
-  int64_t GetDelay() const;
-
- protected:
-  // net::QuicAlarm overrides.
-  void SetImpl() override;
-  void CancelImpl() override;
-
- private:
-  const net::QuicClock* clock_;
-  rtc::Thread* thread_;
-};
-
-// Helper methods for QuicConnection timing and random number generation.
-class QuicConnectionHelper : public net::QuicConnectionHelperInterface {
- public:
-  explicit QuicConnectionHelper(rtc::Thread* thread);
-  ~QuicConnectionHelper() override;
-
-  // QuicConnectionHelperInterface overrides.
-  const net::QuicClock* GetClock() const override;
-  net::QuicRandom* GetRandomGenerator() override;
-  QuicAlarm* CreateAlarm(net::QuicAlarm::Delegate* delegate) override;
-  net::QuicArenaScopedPtr<net::QuicAlarm> CreateAlarm(
-      net::QuicArenaScopedPtr<QuicAlarm::Delegate> delegate,
-      net::QuicConnectionArena* arena) override;
-  net::QuicBufferAllocator* GetBufferAllocator() override;
-
- private:
-  net::QuicClock clock_;
-  net::SimpleBufferAllocator buffer_allocator_;
-  rtc::Thread* thread_;
-};
-
-}  // namespace cricket
-
-#endif  // WEBRTC_P2P_QUIC_QUICCONNECTIONHELPER_H_
diff --git a/p2p/quic/quicconnectionhelper_unittest.cc b/p2p/quic/quicconnectionhelper_unittest.cc
deleted file mode 100644
index 910caca..0000000
--- a/p2p/quic/quicconnectionhelper_unittest.cc
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- *  Copyright 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 <memory>
-
-#include "webrtc/p2p/quic/quicconnectionhelper.h"
-
-#include "net/quic/quic_time.h"
-#include "webrtc/rtc_base/gunit.h"
-
-using cricket::QuicAlarm;
-using cricket::QuicConnectionHelper;
-
-using net::QuicClock;
-using net::QuicTime;
-using net::QuicWallTime;
-
-// Clock that can be set to arbitrary times.
-class MockClock : public QuicClock {
- public:
-  MockClock() : now_(QuicTime::Zero()) {}
-
-  void AdvanceTime(QuicTime::Delta delta) { now_ = now_.Add(delta); }
-
-  QuicTime Now() const override { return now_; }
-
-  QuicTime ApproximateNow() const override { return now_; }
-
-  QuicWallTime WallNow() const override {
-    return QuicWallTime::FromUNIXSeconds(
-        now_.Subtract(QuicTime::Zero()).ToSeconds());
-  }
-
-  base::TimeTicks NowInTicks() const {
-    base::TimeTicks ticks;
-    return ticks + base::TimeDelta::FromMicroseconds(
-                       now_.Subtract(QuicTime::Zero()).ToMicroseconds());
-  }
-
- private:
-  QuicTime now_;
-};
-
-// Implements OnAlarm() event which alarm triggers.
-class MockAlarmDelegate : public QuicAlarm::Delegate {
- public:
-  MockAlarmDelegate() : fired_(false) {}
-
-  void OnAlarm() override { fired_ = true; }
-
-  bool fired() const { return fired_; }
-  void Clear() { fired_ = false; }
-
- private:
-  bool fired_;
-};
-
-class QuicAlarmTest : public ::testing::Test {
- public:
-  QuicAlarmTest()
-      : delegate_(new MockAlarmDelegate()),
-        alarm_(new QuicAlarm(
-            &clock_,
-            rtc::Thread::Current(),
-            net::QuicArenaScopedPtr<net::QuicAlarm::Delegate>(delegate_))) {}
-
-  // Make the alarm fire after the given microseconds (us). Negative values
-  // imply the alarm should fire immediately.
-  void SetTime(int us) {
-    QuicTime::Delta delta = QuicTime::Delta::FromMicroseconds(us);
-    alarm_->Set(clock_.Now().Add(delta));
-  }
-
-  // Make rtc::Thread::Current() process the next message.
-  void ProcessNextMessage() { rtc::Thread::Current()->ProcessMessages(0); }
-
- protected:
-  // Handles event that alarm fires.
-  MockAlarmDelegate* delegate_;
-  // Used for setting clock time relative to alarm.
-  MockClock clock_;
-
-  std::unique_ptr<QuicAlarm> alarm_;
-};
-
-// Test that the alarm is fired.
-TEST_F(QuicAlarmTest, FireAlarm) {
-  SetTime(-1);
-  ProcessNextMessage();
-  ASSERT_TRUE(delegate_->fired());
-  ASSERT_EQ(QuicTime::Zero(), alarm_->deadline());
-}
-
-// Test cancellation of alarm when it is set to fire.
-TEST_F(QuicAlarmTest, CancelAlarmAfterSet) {
-  // TODO(mikescarlett): Test will fail in the future if
-  // rtc::Thread::PostDelayed calls the delegate synchronously for times <= 0.
-  // Rewrite this when rtc::Thread is able to use a mock clock.
-  SetTime(-1);
-  alarm_->Cancel();
-  ProcessNextMessage();
-  ASSERT_FALSE(delegate_->fired());
-}
-
-// Test cancellation of alarm when it is not set to fire.
-TEST_F(QuicAlarmTest, CancelAlarmBeforeSet) {
-  alarm_->Cancel();
-  ProcessNextMessage();
-  ASSERT_FALSE(delegate_->fired());
-}
-
-// Test that timing for posting task is accurate.
-TEST_F(QuicAlarmTest, AlarmGetDelay) {
-  SetTime(1000000);
-  EXPECT_EQ(1000, alarm_->GetDelay());
-  clock_.AdvanceTime(QuicTime::Delta::FromMicroseconds(300000));
-  EXPECT_EQ(700, alarm_->GetDelay());
-}
diff --git a/p2p/quic/quicsession.cc b/p2p/quic/quicsession.cc
deleted file mode 100644
index c7860ef..0000000
--- a/p2p/quic/quicsession.cc
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
- *  Copyright 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/p2p/quic/quicsession.h"
-
-#include <string>
-#include <utility>
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/messagehandler.h"
-#include "webrtc/rtc_base/messagequeue.h"
-
-namespace cricket {
-
-// Default priority for incoming QUIC streams.
-// TODO(mikescarlett): Determine if this value is correct.
-static const net::SpdyPriority kDefaultPriority = 3;
-
-QuicSession::QuicSession(std::unique_ptr<net::QuicConnection> connection,
-                         const net::QuicConfig& config)
-    : net::QuicSession(connection.release(), config) {}
-
-QuicSession::~QuicSession() {}
-
-void QuicSession::StartClientHandshake(
-    net::QuicCryptoClientStream* crypto_stream) {
-  SetCryptoStream(crypto_stream);
-  net::QuicSession::Initialize();
-  crypto_stream->CryptoConnect();
-}
-
-void QuicSession::StartServerHandshake(
-    net::QuicCryptoServerStream* crypto_stream) {
-  SetCryptoStream(crypto_stream);
-  net::QuicSession::Initialize();
-}
-
-void QuicSession::SetCryptoStream(net::QuicCryptoStream* crypto_stream) {
-  crypto_stream_.reset(crypto_stream);
-}
-
-bool QuicSession::ExportKeyingMaterial(base::StringPiece label,
-                                       base::StringPiece context,
-                                       size_t result_len,
-                                       std::string* result) {
-  return crypto_stream_->ExportKeyingMaterial(label, context, result_len,
-                                              result);
-}
-
-void QuicSession::OnCryptoHandshakeEvent(CryptoHandshakeEvent event) {
-  net::QuicSession::OnCryptoHandshakeEvent(event);
-  if (event == HANDSHAKE_CONFIRMED) {
-    LOG(LS_INFO) << "QuicSession handshake complete";
-    RTC_DCHECK(IsEncryptionEstablished());
-    RTC_DCHECK(IsCryptoHandshakeConfirmed());
-
-    SignalHandshakeComplete();
-  }
-}
-
-void QuicSession::CloseStream(net::QuicStreamId stream_id) {
-  if (IsClosedStream(stream_id)) {
-    // When CloseStream has been called recursively (via
-    // ReliableQuicStream::OnClose), the stream is already closed so return.
-    return;
-  }
-  write_blocked_streams()->UnregisterStream(stream_id);
-  net::QuicSession::CloseStream(stream_id);
-}
-
-ReliableQuicStream* QuicSession::CreateIncomingDynamicStream(
-    net::QuicStreamId id) {
-  ReliableQuicStream* stream = CreateDataStream(id, kDefaultPriority);
-  if (stream) {
-    SignalIncomingStream(stream);
-  }
-  return stream;
-}
-
-ReliableQuicStream* QuicSession::CreateOutgoingDynamicStream(
-    net::SpdyPriority priority) {
-  return CreateDataStream(GetNextOutgoingStreamId(), priority);
-}
-
-ReliableQuicStream* QuicSession::CreateDataStream(net::QuicStreamId id,
-                                                  net::SpdyPriority priority) {
-  if (crypto_stream_ == nullptr || !crypto_stream_->encryption_established()) {
-    // Encryption not active so no stream created
-    return nullptr;
-  }
-  ReliableQuicStream* stream = new ReliableQuicStream(id, this);
-  if (stream) {
-    // Make QuicSession take ownership of the stream.
-    ActivateStream(stream);
-    // Register the stream to the QuicWriteBlockedList. |priority| is clamped
-    // between 0 and 7, with 0 being the highest priority and 7 the lowest
-    // priority.
-    write_blocked_streams()->RegisterStream(stream->id(), priority);
-  }
-  return stream;
-}
-
-void QuicSession::OnConnectionClosed(net::QuicErrorCode error,
-                                     const std::string& error_details,
-                                     net::ConnectionCloseSource source) {
-  net::QuicSession::OnConnectionClosed(error, error_details, source);
-  SignalConnectionClosed(error,
-                         source == net::ConnectionCloseSource::FROM_PEER);
-}
-
-bool QuicSession::OnReadPacket(const char* data, size_t data_len) {
-  net::QuicReceivedPacket packet(data, data_len, clock_.Now());
-  ProcessUdpPacket(connection()->self_address(), connection()->peer_address(),
-                   packet);
-  return true;
-}
-
-}  // namespace cricket
diff --git a/p2p/quic/quicsession.h b/p2p/quic/quicsession.h
deleted file mode 100644
index 99195a8..0000000
--- a/p2p/quic/quicsession.h
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- *  Copyright 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_P2P_QUIC_QUICSESSION_H_
-#define WEBRTC_P2P_QUIC_QUICSESSION_H_
-
-#include <memory>
-#include <string>
-
-#include "net/quic/quic_crypto_client_stream.h"
-#include "net/quic/quic_crypto_server_stream.h"
-#include "net/quic/quic_crypto_stream.h"
-#include "net/quic/quic_session.h"
-#include "webrtc/p2p/quic/reliablequicstream.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/sigslot.h"
-#include "webrtc/rtc_base/sslidentity.h"
-
-namespace cricket {
-
-// This class provides a QUIC session over peer-to-peer transport that
-// negotiates the crypto handshake (using QuicCryptoHandshake) and provides
-// reading/writing of data using QUIC packets.
-class QuicSession : public net::QuicSession, public sigslot::has_slots<> {
- public:
-  QuicSession(std::unique_ptr<net::QuicConnection> connection,
-              const net::QuicConfig& config);
-  ~QuicSession() override;
-
-  // Initiates client crypto handshake by sending client hello.
-  void StartClientHandshake(net::QuicCryptoClientStream* crypto_stream);
-
-  // Responds to a client who has inititated the crypto handshake.
-  void StartServerHandshake(net::QuicCryptoServerStream* crypto_stream);
-
-  // QuicSession overrides.
-  net::QuicCryptoStream* GetCryptoStream() override {
-    return crypto_stream_.get();
-  }
-  ReliableQuicStream* CreateOutgoingDynamicStream(
-      net::SpdyPriority priority) override;
-
-  // QuicSession optional overrides.
-  void OnCryptoHandshakeEvent(CryptoHandshakeEvent event) override;
-  void CloseStream(net::QuicStreamId stream_id) override;
-
-  // QuicConnectionVisitorInterface overrides.
-  void OnConnectionClosed(net::QuicErrorCode error,
-                          const std::string& error_details,
-                          net::ConnectionCloseSource source) override;
-
-  // Exports keying material for SRTP.
-  bool ExportKeyingMaterial(base::StringPiece label,
-                            base::StringPiece context,
-                            size_t result_len,
-                            std::string* result);
-
-  // Decrypts an incoming QUIC packet to a data stream.
-  bool OnReadPacket(const char* data, size_t data_len);
-
-  // Called when peers have established forward-secure encryption
-  sigslot::signal0<> SignalHandshakeComplete;
-  // Called when connection closes locally, or remotely by peer.
-  sigslot::signal2<net::QuicErrorCode, bool> SignalConnectionClosed;
-  // Called when an incoming QUIC stream is created so we can process data
-  // from it by registering a listener to
-  // ReliableQuicStream::SignalDataReceived.
-  sigslot::signal1<ReliableQuicStream*> SignalIncomingStream;
-
- protected:
-  // Sets the QUIC crypto stream and takes ownership of it.
-  void SetCryptoStream(net::QuicCryptoStream* crypto_stream);
-
-  // QuicSession override.
-  ReliableQuicStream* CreateIncomingDynamicStream(
-      net::QuicStreamId id) override;
-
-  virtual ReliableQuicStream* CreateDataStream(net::QuicStreamId id,
-                                               net::SpdyPriority priority);
-
- private:
-  std::unique_ptr<net::QuicCryptoStream> crypto_stream_;
-  net::QuicClock clock_;  // For recording packet receipt time
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(QuicSession);
-};
-
-}  // namespace cricket
-
-#endif  // WEBRTC_P2P_QUIC_QUICSESSION_H_
diff --git a/p2p/quic/quicsession_unittest.cc b/p2p/quic/quicsession_unittest.cc
deleted file mode 100644
index 1e906fe..0000000
--- a/p2p/quic/quicsession_unittest.cc
+++ /dev/null
@@ -1,475 +0,0 @@
-/*
- *  Copyright 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/p2p/quic/quicsession.h"
-
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "net/base/ip_endpoint.h"
-#include "net/quic/crypto/crypto_server_config_protobuf.h"
-#include "net/quic/crypto/proof_source.h"
-#include "net/quic/crypto/proof_verifier.h"
-#include "net/quic/crypto/quic_crypto_client_config.h"
-#include "net/quic/crypto/quic_crypto_server_config.h"
-#include "net/quic/crypto/quic_random.h"
-#include "net/quic/quic_crypto_client_stream.h"
-#include "net/quic/quic_crypto_server_stream.h"
-#include "webrtc/p2p/base/faketransportcontroller.h"
-#include "webrtc/p2p/quic/quicconnectionhelper.h"
-#include "webrtc/p2p/quic/reliablequicstream.h"
-#include "webrtc/rtc_base/gunit.h"
-
-using net::IPAddress;
-using net::IPEndPoint;
-using net::PerPacketOptions;
-using net::Perspective;
-using net::ProofVerifyContext;
-using net::ProofVerifyDetails;
-using net::QuicByteCount;
-using net::QuicClock;
-using net::QuicCompressedCertsCache;
-using net::QuicConfig;
-using net::QuicConnection;
-using net::QuicCryptoClientConfig;
-using net::QuicCryptoServerConfig;
-using net::QuicCryptoClientStream;
-using net::QuicCryptoServerStream;
-using net::QuicCryptoStream;
-using net::QuicErrorCode;
-using net::QuicPacketWriter;
-using net::QuicRandom;
-using net::QuicServerConfigProtobuf;
-using net::QuicServerId;
-using net::QuicStreamId;
-using net::WriteResult;
-using net::WriteStatus;
-
-using cricket::FakeTransportChannel;
-using cricket::QuicConnectionHelper;
-using cricket::QuicSession;
-using cricket::ReliableQuicStream;
-using cricket::TransportChannel;
-
-using rtc::Thread;
-
-// Timeout for running asynchronous operations within unit tests.
-static const int kTimeoutMs = 1000;
-// Testing SpdyPriority value for creating outgoing ReliableQuicStream.
-static const uint8_t kDefaultPriority = 3;
-// TExport keying material function
-static const char kExporterLabel[] = "label";
-static const char kExporterContext[] = "context";
-static const size_t kExporterContextLen = sizeof(kExporterContext);
-// Identifies QUIC server session
-static const QuicServerId kServerId("www.google.com", 443);
-
-// Used by QuicCryptoServerConfig to provide server credentials, returning a
-// canned response equal to |success|.
-class FakeProofSource : public net::ProofSource {
- public:
-  explicit FakeProofSource(bool success) : success_(success) {}
-
-  // ProofSource override.
-  bool GetProof(const IPAddress& server_ip,
-                const std::string& hostname,
-                const std::string& server_config,
-                net::QuicVersion quic_version,
-                base::StringPiece chlo_hash,
-                bool ecdsa_ok,
-                scoped_refptr<net::ProofSource::Chain>* out_certs,
-                std::string* out_signature,
-                std::string* out_leaf_cert_sct) override {
-    if (success_) {
-      std::vector<std::string> certs;
-      certs.push_back("Required to establish handshake");
-      *out_certs = new ProofSource::Chain(certs);
-      *out_signature = "Signature";
-      *out_leaf_cert_sct = "Time";
-    }
-    return success_;
-  }
-
- private:
-  // Whether or not obtaining proof source succeeds.
-  bool success_;
-};
-
-// Used by QuicCryptoClientConfig to verify server credentials, returning a
-// canned response of QUIC_SUCCESS if |success| is true.
-class FakeProofVerifier : public net::ProofVerifier {
- public:
-  explicit FakeProofVerifier(bool success) : success_(success) {}
-
-  // ProofVerifier override
-  net::QuicAsyncStatus VerifyProof(
-      const std::string& hostname,
-      const uint16_t port,
-      const std::string& server_config,
-      net::QuicVersion quic_version,
-      base::StringPiece chlo_hash,
-      const std::vector<std::string>& certs,
-      const std::string& cert_sct,
-      const std::string& signature,
-      const ProofVerifyContext* context,
-      std::string* error_details,
-      std::unique_ptr<net::ProofVerifyDetails>* verify_details,
-      net::ProofVerifierCallback* callback) override {
-    return success_ ? net::QUIC_SUCCESS : net::QUIC_FAILURE;
-  }
-
- private:
-  // Whether or not proof verification succeeds.
-  bool success_;
-};
-
-// Writes QUIC packets to a fake transport channel that simulates a network.
-class FakeQuicPacketWriter : public QuicPacketWriter {
- public:
-  explicit FakeQuicPacketWriter(FakeTransportChannel* fake_channel)
-      : fake_channel_(fake_channel) {}
-
-  // Sends packets across the network.
-  WriteResult WritePacket(const char* buffer,
-                          size_t buf_len,
-                          const IPAddress& self_address,
-                          const IPEndPoint& peer_address,
-                          PerPacketOptions* options) override {
-    rtc::PacketOptions packet_options;
-    int rv = fake_channel_->SendPacket(buffer, buf_len, packet_options, 0);
-    net::WriteStatus status;
-    if (rv > 0) {
-      status = net::WRITE_STATUS_OK;
-    } else if (fake_channel_->GetError() == EWOULDBLOCK) {
-      status = net::WRITE_STATUS_BLOCKED;
-    } else {
-      status = net::WRITE_STATUS_ERROR;
-    }
-    return net::WriteResult(status, rv);
-  }
-
-  // Returns true if the writer buffers and subsequently rewrites data
-  // when an attempt to write results in the underlying socket becoming
-  // write blocked.
-  bool IsWriteBlockedDataBuffered() const override { return true; }
-
-  // Returns true if the network socket is not writable.
-  bool IsWriteBlocked() const override { return !fake_channel_->writable(); }
-
-  // Records that the socket has become writable, for example when an EPOLLOUT
-  // is received or an asynchronous write completes.
-  void SetWritable() override { fake_channel_->SetWritable(true); }
-
-  // Returns the maximum size of the packet which can be written using this
-  // writer for the supplied peer address.  This size may actually exceed the
-  // size of a valid QUIC packet.
-  QuicByteCount GetMaxPacketSize(
-      const IPEndPoint& peer_address) const override {
-    return net::kMaxPacketSize;
-  }
-
- private:
-  FakeTransportChannel* fake_channel_;
-};
-
-// Wrapper for QuicSession and transport channel that stores incoming data.
-class QuicSessionForTest : public QuicSession {
- public:
-  QuicSessionForTest(std::unique_ptr<net::QuicConnection> connection,
-                     const net::QuicConfig& config,
-                     std::unique_ptr<FakeTransportChannel> channel)
-      : QuicSession(std::move(connection), config),
-        channel_(std::move(channel)) {
-    channel_->SignalReadPacket.connect(
-        this, &QuicSessionForTest::OnChannelReadPacket);
-  }
-
-  // Called when channel has packets to read.
-  void OnChannelReadPacket(TransportChannel* channel,
-                           const char* data,
-                           size_t size,
-                           const rtc::PacketTime& packet_time,
-                           int flags) {
-    OnReadPacket(data, size);
-  }
-
-  // Called when peer receives incoming stream from another peer.
-  void OnIncomingStream(ReliableQuicStream* stream) {
-    stream->SignalDataReceived.connect(this,
-                                       &QuicSessionForTest::OnDataReceived);
-    last_incoming_stream_ = stream;
-  }
-
-  // Called when peer has data to read from incoming stream.
-  void OnDataReceived(net::QuicStreamId id, const char* data, size_t length) {
-    last_received_data_ = std::string(data, length);
-  }
-
-  std::string data() { return last_received_data_; }
-
-  bool has_data() { return data().size() > 0; }
-
-  FakeTransportChannel* channel() { return channel_.get(); }
-
-  ReliableQuicStream* incoming_stream() { return last_incoming_stream_; }
-
- private:
-  // Transports QUIC packets to/from peer.
-  std::unique_ptr<FakeTransportChannel> channel_;
-  // Stores data received by peer once it is sent from the other peer.
-  std::string last_received_data_;
-  // Handles incoming streams from sender.
-  ReliableQuicStream* last_incoming_stream_ = nullptr;
-};
-
-// Simulates data transfer between two peers using QUIC.
-class QuicSessionTest : public ::testing::Test,
-                        public QuicCryptoClientStream::ProofHandler {
- public:
-  QuicSessionTest()
-      : quic_helper_(rtc::Thread::Current()),
-        quic_compressed_certs_cache_(
-            QuicCompressedCertsCache::kQuicCompressedCertsCacheSize) {}
-
-  // Instantiates |client_peer_| and |server_peer_|.
-  void CreateClientAndServerSessions();
-
-  std::unique_ptr<QuicSessionForTest> CreateSession(
-      std::unique_ptr<FakeTransportChannel> channel,
-      Perspective perspective);
-
-  QuicCryptoClientStream* CreateCryptoClientStream(QuicSessionForTest* session,
-                                                   bool handshake_success);
-  QuicCryptoServerStream* CreateCryptoServerStream(QuicSessionForTest* session,
-                                                   bool handshake_success);
-
-  std::unique_ptr<QuicConnection> CreateConnection(
-      FakeTransportChannel* channel,
-      Perspective perspective);
-
-  void StartHandshake(bool client_handshake_success,
-                      bool server_handshake_success);
-
-  // Test handshake establishment and sending/receiving of data.
-  void TestStreamConnection(QuicSessionForTest* from_session,
-                            QuicSessionForTest* to_session);
-  // Test that client and server are not connected after handshake failure.
-  void TestDisconnectAfterFailedHandshake();
-
-  // QuicCryptoClientStream::ProofHelper overrides.
-  void OnProofValid(
-      const QuicCryptoClientConfig::CachedState& cached) override {}
-  void OnProofVerifyDetailsAvailable(
-      const ProofVerifyDetails& verify_details) override {}
-
- protected:
-  QuicConnectionHelper quic_helper_;
-  QuicConfig config_;
-  QuicClock clock_;
-  QuicCompressedCertsCache quic_compressed_certs_cache_;
-
-  std::unique_ptr<QuicSessionForTest> client_peer_;
-  std::unique_ptr<QuicSessionForTest> server_peer_;
-};
-
-// Initializes "client peer" who begins crypto handshake and "server peer" who
-// establishes encryption with client.
-void QuicSessionTest::CreateClientAndServerSessions() {
-  std::unique_ptr<FakeTransportChannel> channel1(
-      new FakeTransportChannel("channel1", 0));
-  std::unique_ptr<FakeTransportChannel> channel2(
-      new FakeTransportChannel("channel2", 0));
-
-  // Prevent channel1->OnReadPacket and channel2->OnReadPacket from calling
-  // themselves in a loop, which causes to future packets to be recursively
-  // consumed while the current thread blocks consumption of current ones.
-  channel2->SetAsync(true);
-
-  // Configure peers to send packets to each other.
-  channel1->SetDestination(channel2.get());
-
-  client_peer_ = CreateSession(std::move(channel1), Perspective::IS_CLIENT);
-  server_peer_ = CreateSession(std::move(channel2), Perspective::IS_SERVER);
-}
-
-std::unique_ptr<QuicSessionForTest> QuicSessionTest::CreateSession(
-    std::unique_ptr<FakeTransportChannel> channel,
-    Perspective perspective) {
-  std::unique_ptr<QuicConnection> quic_connection =
-      CreateConnection(channel.get(), perspective);
-  return std::unique_ptr<QuicSessionForTest>(new QuicSessionForTest(
-      std::move(quic_connection), config_, std::move(channel)));
-}
-
-QuicCryptoClientStream* QuicSessionTest::CreateCryptoClientStream(
-    QuicSessionForTest* session,
-    bool handshake_success) {
-  QuicCryptoClientConfig* client_config =
-      new QuicCryptoClientConfig(new FakeProofVerifier(handshake_success));
-  return new QuicCryptoClientStream(
-      kServerId, session, new ProofVerifyContext(), client_config, this);
-}
-
-QuicCryptoServerStream* QuicSessionTest::CreateCryptoServerStream(
-    QuicSessionForTest* session,
-    bool handshake_success) {
-  QuicCryptoServerConfig* server_config =
-      new QuicCryptoServerConfig("TESTING", QuicRandom::GetInstance(),
-                                 new FakeProofSource(handshake_success));
-  // Provide server with serialized config string to prove ownership.
-  QuicCryptoServerConfig::ConfigOptions options;
-  QuicServerConfigProtobuf* primary_config = server_config->GenerateConfig(
-      QuicRandom::GetInstance(), &clock_, options);
-  server_config->AddConfig(primary_config, clock_.WallNow());
-  bool use_stateless_rejects_if_peer_supported = false;
-  return new QuicCryptoServerStream(
-      server_config, &quic_compressed_certs_cache_,
-      use_stateless_rejects_if_peer_supported, session);
-}
-
-std::unique_ptr<QuicConnection> QuicSessionTest::CreateConnection(
-    FakeTransportChannel* channel,
-    Perspective perspective) {
-  FakeQuicPacketWriter* writer = new FakeQuicPacketWriter(channel);
-
-  IPAddress ip(0, 0, 0, 0);
-  bool owns_writer = true;
-
-  return std::unique_ptr<QuicConnection>(new QuicConnection(
-      0, net::IPEndPoint(ip, 0), &quic_helper_, writer, owns_writer,
-      perspective, net::QuicSupportedVersions()));
-}
-
-void QuicSessionTest::StartHandshake(bool client_handshake_success,
-                                     bool server_handshake_success) {
-  server_peer_->StartServerHandshake(
-      CreateCryptoServerStream(server_peer_.get(), server_handshake_success));
-  client_peer_->StartClientHandshake(
-      CreateCryptoClientStream(client_peer_.get(), client_handshake_success));
-}
-
-void QuicSessionTest::TestStreamConnection(QuicSessionForTest* from_session,
-                                           QuicSessionForTest* to_session) {
-  // Wait for crypto handshake to finish then check if encryption established.
-  ASSERT_TRUE_WAIT(from_session->IsCryptoHandshakeConfirmed() &&
-                       to_session->IsCryptoHandshakeConfirmed(),
-                   kTimeoutMs);
-
-  ASSERT_TRUE(from_session->IsEncryptionEstablished());
-  ASSERT_TRUE(to_session->IsEncryptionEstablished());
-
-  std::string from_key;
-  std::string to_key;
-
-  bool from_success = from_session->ExportKeyingMaterial(
-      kExporterLabel, kExporterContext, kExporterContextLen, &from_key);
-  ASSERT_TRUE(from_success);
-  bool to_success = to_session->ExportKeyingMaterial(
-      kExporterLabel, kExporterContext, kExporterContextLen, &to_key);
-  ASSERT_TRUE(to_success);
-
-  EXPECT_EQ(from_key.size(), kExporterContextLen);
-  EXPECT_EQ(from_key, to_key);
-
-  // Now we can establish encrypted outgoing stream.
-  ReliableQuicStream* outgoing_stream =
-      from_session->CreateOutgoingDynamicStream(kDefaultPriority);
-  ASSERT_NE(nullptr, outgoing_stream);
-  EXPECT_TRUE(from_session->HasOpenDynamicStreams());
-
-  outgoing_stream->SignalDataReceived.connect(
-      from_session, &QuicSessionForTest::OnDataReceived);
-  to_session->SignalIncomingStream.connect(
-      to_session, &QuicSessionForTest::OnIncomingStream);
-
-  // Send a test message from peer 1 to peer 2.
-  const char kTestMessage[] = "Hello, World!";
-  outgoing_stream->Write(kTestMessage, strlen(kTestMessage));
-
-  // Wait for peer 2 to receive messages.
-  ASSERT_TRUE_WAIT(to_session->has_data(), kTimeoutMs);
-
-  ReliableQuicStream* incoming = to_session->incoming_stream();
-  ASSERT_TRUE(incoming);
-  EXPECT_TRUE(to_session->HasOpenDynamicStreams());
-
-  EXPECT_EQ(to_session->data(), kTestMessage);
-
-  // Send a test message from peer 2 to peer 1.
-  const char kTestResponse[] = "Response";
-  incoming->Write(kTestResponse, strlen(kTestResponse));
-
-  // Wait for peer 1 to receive messages.
-  ASSERT_TRUE_WAIT(from_session->has_data(), kTimeoutMs);
-
-  EXPECT_EQ(from_session->data(), kTestResponse);
-}
-
-// Client and server should disconnect when proof verification fails.
-void QuicSessionTest::TestDisconnectAfterFailedHandshake() {
-  EXPECT_TRUE_WAIT(!client_peer_->connection()->connected(), kTimeoutMs);
-  EXPECT_TRUE_WAIT(!server_peer_->connection()->connected(), kTimeoutMs);
-
-  EXPECT_FALSE(client_peer_->IsEncryptionEstablished());
-  EXPECT_FALSE(client_peer_->IsCryptoHandshakeConfirmed());
-
-  EXPECT_FALSE(server_peer_->IsEncryptionEstablished());
-  EXPECT_FALSE(server_peer_->IsCryptoHandshakeConfirmed());
-}
-
-// Establish encryption then send message from client to server.
-TEST_F(QuicSessionTest, ClientToServer) {
-  CreateClientAndServerSessions();
-  StartHandshake(true, true);
-  TestStreamConnection(client_peer_.get(), server_peer_.get());
-}
-
-// Establish encryption then send message from server to client.
-TEST_F(QuicSessionTest, ServerToClient) {
-  CreateClientAndServerSessions();
-  StartHandshake(true, true);
-  TestStreamConnection(server_peer_.get(), client_peer_.get());
-}
-
-// Make client fail to verify proof from server.
-TEST_F(QuicSessionTest, ClientRejection) {
-  CreateClientAndServerSessions();
-  StartHandshake(false, true);
-  TestDisconnectAfterFailedHandshake();
-}
-
-// Make server fail to give proof to client.
-TEST_F(QuicSessionTest, ServerRejection) {
-  CreateClientAndServerSessions();
-  StartHandshake(true, false);
-  TestDisconnectAfterFailedHandshake();
-}
-
-// Test that data streams are not created before handshake.
-TEST_F(QuicSessionTest, CannotCreateDataStreamBeforeHandshake) {
-  CreateClientAndServerSessions();
-  EXPECT_EQ(nullptr, server_peer_->CreateOutgoingDynamicStream(5));
-  EXPECT_EQ(nullptr, client_peer_->CreateOutgoingDynamicStream(5));
-}
-
-// Test that closing a QUIC stream causes the QuicSession to remove it.
-TEST_F(QuicSessionTest, CloseQuicStream) {
-  CreateClientAndServerSessions();
-  StartHandshake(true, true);
-  ASSERT_TRUE_WAIT(client_peer_->IsCryptoHandshakeConfirmed() &&
-                       server_peer_->IsCryptoHandshakeConfirmed(),
-                   kTimeoutMs);
-  ReliableQuicStream* stream = client_peer_->CreateOutgoingDynamicStream(5);
-  ASSERT_NE(nullptr, stream);
-  EXPECT_FALSE(client_peer_->IsClosedStream(stream->id()));
-  stream->Close();
-  EXPECT_TRUE(client_peer_->IsClosedStream(stream->id()));
-}
diff --git a/p2p/quic/quictransport.cc b/p2p/quic/quictransport.cc
deleted file mode 100644
index 8240f58..0000000
--- a/p2p/quic/quictransport.cc
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- *  Copyright 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/p2p/quic/quictransport.h"
-
-#include "webrtc/p2p/base/p2ptransportchannel.h"
-#include "webrtc/rtc_base/checks.h"
-
-namespace cricket {
-
-QuicTransport::QuicTransport(
-    const std::string& name,
-    PortAllocator* allocator,
-    const rtc::scoped_refptr<rtc::RTCCertificate>& certificate)
-    : Transport(name, allocator), local_certificate_(certificate) {}
-
-QuicTransport::~QuicTransport() {
-  DestroyAllChannels();
-}
-
-void QuicTransport::SetLocalCertificate(
-    const rtc::scoped_refptr<rtc::RTCCertificate>& certificate) {
-  local_certificate_ = certificate;
-}
-bool QuicTransport::GetLocalCertificate(
-    rtc::scoped_refptr<rtc::RTCCertificate>* certificate) {
-  if (!local_certificate_) {
-    return false;
-  }
-  *certificate = local_certificate_;
-  return true;
-}
-
-bool QuicTransport::ApplyLocalTransportDescription(
-    TransportChannelImpl* channel,
-    std::string* error_desc) {
-  rtc::SSLFingerprint* local_fp =
-      local_description()->identity_fingerprint.get();
-  if (!VerifyCertificateFingerprint(local_certificate_.get(), local_fp,
-                                    error_desc)) {
-    return false;
-  }
-  if (!channel->SetLocalCertificate(local_certificate_)) {
-    return BadTransportDescription("Failed to set local identity.", error_desc);
-  }
-  return Transport::ApplyLocalTransportDescription(channel, error_desc);
-}
-
-bool QuicTransport::NegotiateTransportDescription(ContentAction action,
-                                                  std::string* error_desc) {
-  if (!local_description() || !remote_description()) {
-    const std::string msg =
-        "Local and Remote description must be set before "
-        "transport descriptions are negotiated";
-    return BadTransportDescription(msg, error_desc);
-  }
-  rtc::SSLFingerprint* local_fp =
-      local_description()->identity_fingerprint.get();
-  rtc::SSLFingerprint* remote_fp =
-      remote_description()->identity_fingerprint.get();
-  if (!local_fp || !remote_fp) {
-    return BadTransportDescription("Fingerprints must be supplied for QUIC.",
-                                   error_desc);
-  }
-  remote_fingerprint_.reset(new rtc::SSLFingerprint(*remote_fp));
-  if (!NegotiateRole(action, &local_role_, error_desc)) {
-    return false;
-  }
-  // Now run the negotiation for the Transport class.
-  return Transport::NegotiateTransportDescription(action, error_desc);
-}
-
-QuicTransportChannel* QuicTransport::CreateTransportChannel(int component) {
-  P2PTransportChannel* ice_channel =
-      new P2PTransportChannel(name(), component, port_allocator());
-  return new QuicTransportChannel(ice_channel);
-}
-
-void QuicTransport::DestroyTransportChannel(TransportChannelImpl* channel) {
-  delete channel;
-}
-
-bool QuicTransport::GetSslRole(rtc::SSLRole* ssl_role) const {
-  RTC_DCHECK(ssl_role != NULL);
-  *ssl_role = local_role_;
-  return true;
-}
-
-bool QuicTransport::ApplyNegotiatedTransportDescription(
-    TransportChannelImpl* channel,
-    std::string* error_desc) {
-  // Set ssl role and remote fingerprint. These are required for QUIC setup.
-  if (!channel->SetSslRole(local_role_)) {
-    return BadTransportDescription("Failed to set ssl role for the channel.",
-                                   error_desc);
-  }
-  // Apply remote fingerprint.
-  if (!channel->SetRemoteFingerprint(
-          remote_fingerprint_->algorithm,
-          reinterpret_cast<const uint8_t*>(remote_fingerprint_->digest.data()),
-          remote_fingerprint_->digest.size())) {
-    return BadTransportDescription("Failed to apply remote fingerprint.",
-                                   error_desc);
-  }
-  return Transport::ApplyNegotiatedTransportDescription(channel, error_desc);
-}
-
-}  // namespace cricket
diff --git a/p2p/quic/quictransport.h b/p2p/quic/quictransport.h
deleted file mode 100644
index 5e834e0..0000000
--- a/p2p/quic/quictransport.h
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- *  Copyright 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_P2P_QUIC_QUICTRANSPORT_H_
-#define WEBRTC_P2P_QUIC_QUICTRANSPORT_H_
-
-#include <string>
-#include <map>
-#include <memory>
-
-#include "webrtc/p2p/base/jseptransport.h"
-#include "webrtc/p2p/quic/quictransportchannel.h"
-
-namespace cricket {
-
-class P2PTransportChannel;
-class PortAllocator;
-
-// TODO(deadbeef): To get QUIC working with TransportController again, would
-// need to merge this class with Transport (or make separate DTLS/QUIC
-// subclasses). The only difference between the two (as of typing this) is that
-// the QUIC channel *requires* a fingerprint, whereas the DTLS channel can
-// operate in a passthrough mode when SDES is used.
-class QuicTransport : public Transport {
- public:
-  QuicTransport(const std::string& name,
-                PortAllocator* allocator,
-                const rtc::scoped_refptr<rtc::RTCCertificate>& certificate);
-
-  ~QuicTransport() override;
-
-  // Transport overrides.
-  void SetLocalCertificate(
-      const rtc::scoped_refptr<rtc::RTCCertificate>& certificate) override;
-  bool GetLocalCertificate(
-      rtc::scoped_refptr<rtc::RTCCertificate>* certificate) override;
-  bool SetSslMaxProtocolVersion(rtc::SSLProtocolVersion version) override {
-    return true;  // Not needed by QUIC
-  }
-  bool GetSslRole(rtc::SSLRole* ssl_role) const override;
-
- protected:
-  // Transport overrides.
-  QuicTransportChannel* CreateTransportChannel(int component) override;
-  void DestroyTransportChannel(TransportChannelImpl* channel) override;
-  bool ApplyLocalTransportDescription(TransportChannelImpl* channel,
-                                      std::string* error_desc) override;
-  bool NegotiateTransportDescription(ContentAction action,
-                                     std::string* error_desc) override;
-  bool ApplyNegotiatedTransportDescription(TransportChannelImpl* channel,
-                                           std::string* error_desc) override;
-
- private:
-  rtc::scoped_refptr<rtc::RTCCertificate> local_certificate_;
-  rtc::SSLRole local_role_ = rtc::SSL_CLIENT;
-  std::unique_ptr<rtc::SSLFingerprint> remote_fingerprint_;
-};
-
-}  // namespace cricket
-
-#endif  // WEBRTC_P2P_QUIC_QUICTRANSPORT_H_
diff --git a/p2p/quic/quictransport_unittest.cc b/p2p/quic/quictransport_unittest.cc
deleted file mode 100644
index 3328556..0000000
--- a/p2p/quic/quictransport_unittest.cc
+++ /dev/null
@@ -1,160 +0,0 @@
-/*
- *  Copyright 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/p2p/quic/quictransport.h"
-
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "webrtc/rtc_base/gunit.h"
-#include "webrtc/rtc_base/rtccertificate.h"
-#include "webrtc/rtc_base/sslidentity.h"
-
-using cricket::TransportChannelImpl;
-using cricket::QuicTransport;
-using cricket::Transport;
-using cricket::TransportDescription;
-
-static const char kIceUfrag1[] = "TESTICEUFRAG0001";
-static const char kIcePwd1[] = "TESTICEPWD00000000000001";
-
-static const char kIceUfrag2[] = "TESTICEUFRAG0002";
-static const char kIcePwd2[] = "TESTICEPWD00000000000002";
-
-static rtc::scoped_refptr<rtc::RTCCertificate> CreateCertificate(
-    std::string name) {
-  return rtc::RTCCertificate::Create(std::unique_ptr<rtc::SSLIdentity>(
-      rtc::SSLIdentity::Generate(name, rtc::KT_DEFAULT)));
-}
-
-static std::unique_ptr<rtc::SSLFingerprint> CreateFingerprint(
-    rtc::RTCCertificate* cert) {
-  std::string digest_algorithm;
-  cert->ssl_certificate().GetSignatureDigestAlgorithm(&digest_algorithm);
-  return std::unique_ptr<rtc::SSLFingerprint>(
-      rtc::SSLFingerprint::Create(digest_algorithm, cert->identity()));
-}
-
-class QuicTransportTest : public testing::Test {
- public:
-  QuicTransportTest() : transport_("testing", nullptr, nullptr) {}
-
-  void SetTransportDescription(cricket::ConnectionRole local_role,
-                               cricket::ConnectionRole remote_role,
-                               cricket::ContentAction local_action,
-                               cricket::ContentAction remote_action,
-                               rtc::SSLRole expected_ssl_role) {
-    TransportChannelImpl* channel = transport_.CreateChannel(1);
-    ASSERT_NE(nullptr, channel);
-
-    rtc::scoped_refptr<rtc::RTCCertificate> local_certificate(
-        CreateCertificate("local"));
-    ASSERT_NE(nullptr, local_certificate);
-    transport_.SetLocalCertificate(local_certificate);
-
-    std::unique_ptr<rtc::SSLFingerprint> local_fingerprint =
-        CreateFingerprint(local_certificate.get());
-    ASSERT_NE(nullptr, local_fingerprint);
-    TransportDescription local_desc(std::vector<std::string>(), kIceUfrag1,
-                                    kIcePwd1, cricket::ICEMODE_FULL, local_role,
-                                    local_fingerprint.get());
-    ASSERT_TRUE(transport_.SetLocalTransportDescription(local_desc,
-                                                        local_action, nullptr));
-    // The certificate is applied to QuicTransportChannel when the local
-    // description is set.
-    rtc::scoped_refptr<rtc::RTCCertificate> channel_local_certificate =
-        channel->GetLocalCertificate();
-    ASSERT_NE(nullptr, channel_local_certificate);
-    EXPECT_EQ(local_certificate, channel_local_certificate);
-    std::unique_ptr<rtc::SSLFingerprint> remote_fingerprint =
-        CreateFingerprint(CreateCertificate("remote").get());
-    // NegotiateTransportDescription was not called yet. The SSL role should
-    // not be set and neither should the remote fingerprint.
-    std::unique_ptr<rtc::SSLRole> role(new rtc::SSLRole());
-    EXPECT_FALSE(channel->GetSslRole(role.get()));
-    // Setting the remote description should set the SSL role.
-    ASSERT_NE(nullptr, remote_fingerprint);
-    TransportDescription remote_desc(std::vector<std::string>(), kIceUfrag2,
-                                     kIcePwd2, cricket::ICEMODE_FULL,
-                                     remote_role, remote_fingerprint.get());
-    ASSERT_TRUE(transport_.SetRemoteTransportDescription(
-        remote_desc, remote_action, nullptr));
-    ASSERT_TRUE(channel->GetSslRole(role.get()));
-    // SSL role should be client because the remote description is an ANSWER.
-    EXPECT_EQ(expected_ssl_role, *role);
-  }
-
- protected:
-  QuicTransport transport_;
-};
-
-// Test setting the local certificate.
-TEST_F(QuicTransportTest, SetLocalCertificate) {
-  rtc::scoped_refptr<rtc::RTCCertificate> local_certificate(
-      CreateCertificate("local"));
-  ASSERT_NE(nullptr, local_certificate);
-  rtc::scoped_refptr<rtc::RTCCertificate> transport_local_certificate;
-  EXPECT_FALSE(transport_.GetLocalCertificate(&transport_local_certificate));
-  transport_.SetLocalCertificate(local_certificate);
-  ASSERT_TRUE(transport_.GetLocalCertificate(&transport_local_certificate));
-  ASSERT_NE(nullptr, transport_local_certificate);
-  EXPECT_EQ(local_certificate, transport_local_certificate);
-}
-
-// Test setting the ICE role.
-TEST_F(QuicTransportTest, SetIceRole) {
-  TransportChannelImpl* channel1 = transport_.CreateChannel(1);
-  ASSERT_NE(nullptr, channel1);
-  transport_.SetIceRole(cricket::ICEROLE_CONTROLLING);
-  EXPECT_EQ(cricket::ICEROLE_CONTROLLING, transport_.ice_role());
-  TransportChannelImpl* channel2 = transport_.CreateChannel(2);
-  ASSERT_NE(nullptr, channel2);
-  EXPECT_EQ(cricket::ICEROLE_CONTROLLING, channel1->GetIceRole());
-  EXPECT_EQ(cricket::ICEROLE_CONTROLLING, channel2->GetIceRole());
-}
-
-// Test setting the ICE tie breaker.
-TEST_F(QuicTransportTest, SetIceTiebreaker) {
-  transport_.SetIceTiebreaker(1u);
-  EXPECT_EQ(1u, transport_.IceTiebreaker());
-}
-
-// Test setting the local and remote descriptions for a SSL client.
-TEST_F(QuicTransportTest, SetLocalAndRemoteTransportDescriptionClient) {
-  SetTransportDescription(cricket::CONNECTIONROLE_ACTPASS,
-                          cricket::CONNECTIONROLE_PASSIVE, cricket::CA_OFFER,
-                          cricket::CA_ANSWER, rtc::SSL_CLIENT);
-}
-
-// Test setting the local and remote descriptions for a SSL server.
-TEST_F(QuicTransportTest, SetLocalAndRemoteTransportDescriptionServer) {
-  SetTransportDescription(cricket::CONNECTIONROLE_ACTPASS,
-                          cricket::CONNECTIONROLE_ACTIVE, cricket::CA_OFFER,
-                          cricket::CA_ANSWER, rtc::SSL_SERVER);
-}
-
-// Test creation and destruction of channels.
-TEST_F(QuicTransportTest, CreateAndDestroyChannels) {
-  TransportChannelImpl* channel1 = transport_.CreateChannel(1);
-  ASSERT_NE(nullptr, channel1);
-  EXPECT_TRUE(transport_.HasChannel(1));
-  EXPECT_EQ(channel1, transport_.GetChannel(1));
-  TransportChannelImpl* channel2 = transport_.CreateChannel(2);
-  ASSERT_NE(nullptr, channel2);
-  EXPECT_TRUE(transport_.HasChannel(2));
-  EXPECT_EQ(channel2, transport_.GetChannel(2));
-  transport_.DestroyChannel(1);
-  EXPECT_FALSE(transport_.HasChannel(1));
-  EXPECT_EQ(nullptr, transport_.GetChannel(1));
-  transport_.DestroyChannel(2);
-  EXPECT_FALSE(transport_.HasChannel(2));
-  EXPECT_EQ(nullptr, transport_.GetChannel(2));
-}
diff --git a/p2p/quic/quictransportchannel.cc b/p2p/quic/quictransportchannel.cc
deleted file mode 100644
index f875ab6..0000000
--- a/p2p/quic/quictransportchannel.cc
+++ /dev/null
@@ -1,598 +0,0 @@
-/*
- *  Copyright 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/p2p/quic/quictransportchannel.h"
-
-#include <utility>
-
-#include "net/quic/crypto/proof_source.h"
-#include "net/quic/crypto/proof_verifier.h"
-#include "net/quic/crypto/quic_crypto_client_config.h"
-#include "net/quic/crypto/quic_crypto_server_config.h"
-#include "net/quic/quic_connection.h"
-#include "net/quic/quic_crypto_client_stream.h"
-#include "net/quic/quic_crypto_server_stream.h"
-#include "net/quic/quic_packet_writer.h"
-#include "net/quic/quic_protocol.h"
-#include "webrtc/p2p/base/common.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/helpers.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/socket.h"
-#include "webrtc/rtc_base/thread.h"
-
-namespace {
-
-// QUIC public header constants for net::QuicConnection. These are arbitrary
-// given that |channel_| only receives packets specific to this channel,
-// in which case we already know the QUIC packets have the correct destination.
-const net::QuicConnectionId kConnectionId = 0;
-const net::IPAddress kConnectionIpAddress(0, 0, 0, 0);
-const net::IPEndPoint kConnectionIpEndpoint(kConnectionIpAddress, 0);
-
-// Arbitrary server port number for net::QuicCryptoClientConfig.
-const int kQuicServerPort = 0;
-
-// QUIC connection timeout. This is large so that |channel_| can
-// be responsible for connection timeout.
-const int kIdleConnectionStateLifetime = 1000;  // seconds
-
-// Length of HKDF input keying material, equal to its number of bytes.
-// https://tools.ietf.org/html/rfc5869#section-2.2.
-// TODO(mikescarlett): Verify that input keying material length is correct.
-const size_t kInputKeyingMaterialLength = 32;
-
-// We don't pull the RTP constants from rtputils.h, to avoid a layer violation.
-const size_t kMinRtpPacketLen = 12;
-
-bool IsRtpPacket(const char* data, size_t len) {
-  const uint8_t* u = reinterpret_cast<const uint8_t*>(data);
-  return (len >= kMinRtpPacketLen && (u[0] & 0xC0) == 0x80);
-}
-
-// Function for detecting QUIC packets based off
-// https://tools.ietf.org/html/draft-tsvwg-quic-protocol-02#section-6.
-const size_t kMinQuicPacketLen = 2;
-
-bool IsQuicPacket(const char* data, size_t len) {
-  const uint8_t* u = reinterpret_cast<const uint8_t*>(data);
-  return (len >= kMinQuicPacketLen && (u[0] & 0x80) == 0);
-}
-
-// Used by QuicCryptoServerConfig to provide dummy proof credentials.
-// TODO(mikescarlett): Remove when secure P2P QUIC handshake is possible.
-class DummyProofSource : public net::ProofSource {
- public:
-  DummyProofSource() {}
-  ~DummyProofSource() override {}
-
-  // ProofSource override.
-  bool GetProof(const net::IPAddress& server_ip,
-                const std::string& hostname,
-                const std::string& server_config,
-                net::QuicVersion quic_version,
-                base::StringPiece chlo_hash,
-                bool ecdsa_ok,
-                scoped_refptr<net::ProofSource::Chain>* out_chain,
-                std::string* out_signature,
-                std::string* out_leaf_cert_sct) override {
-    LOG(LS_INFO) << "GetProof() providing dummy credentials for insecure QUIC";
-    std::vector<std::string> certs;
-    certs.push_back("Dummy cert");
-    *out_chain = new ProofSource::Chain(certs);
-    *out_signature = "Dummy signature";
-    *out_leaf_cert_sct = "Dummy timestamp";
-    return true;
-  }
-};
-
-// Used by QuicCryptoClientConfig to ignore the peer's credentials
-// and establish an insecure QUIC connection.
-// TODO(mikescarlett): Remove when secure P2P QUIC handshake is possible.
-class InsecureProofVerifier : public net::ProofVerifier {
- public:
-  InsecureProofVerifier() {}
-  ~InsecureProofVerifier() override {}
-
-  // ProofVerifier override.
-  net::QuicAsyncStatus VerifyProof(
-      const std::string& hostname,
-      const uint16_t port,
-      const std::string& server_config,
-      net::QuicVersion quic_version,
-      base::StringPiece chlo_hash,
-      const std::vector<std::string>& certs,
-      const std::string& cert_sct,
-      const std::string& signature,
-      const net::ProofVerifyContext* context,
-      std::string* error_details,
-      std::unique_ptr<net::ProofVerifyDetails>* verify_details,
-      net::ProofVerifierCallback* callback) override {
-    LOG(LS_INFO) << "VerifyProof() ignoring credentials and returning success";
-    return net::QUIC_SUCCESS;
-  }
-};
-
-}  // namespace
-
-namespace cricket {
-
-QuicTransportChannel::QuicTransportChannel(TransportChannelImpl* channel)
-    : TransportChannelImpl(channel->transport_name(), channel->component()),
-      network_thread_(rtc::Thread::Current()),
-      channel_(channel),
-      helper_(network_thread_) {
-  channel_->SignalWritableState.connect(this,
-                                        &QuicTransportChannel::OnWritableState);
-  channel_->SignalReadPacket.connect(this, &QuicTransportChannel::OnReadPacket);
-  channel_->SignalSentPacket.connect(this, &QuicTransportChannel::OnSentPacket);
-  channel_->SignalReadyToSend.connect(this,
-                                      &QuicTransportChannel::OnReadyToSend);
-  channel_->SignalGatheringState.connect(
-      this, &QuicTransportChannel::OnGatheringState);
-  channel_->SignalCandidateGathered.connect(
-      this, &QuicTransportChannel::OnCandidateGathered);
-  channel_->SignalRoleConflict.connect(this,
-                                       &QuicTransportChannel::OnRoleConflict);
-  channel_->SignalRouteChange.connect(this,
-                                      &QuicTransportChannel::OnRouteChange);
-  channel_->SignalSelectedCandidatePairChanged.connect(
-      this, &QuicTransportChannel::OnSelectedCandidatePairChanged);
-  channel_->SignalStateChanged.connect(
-      this, &QuicTransportChannel::OnChannelStateChanged);
-  channel_->SignalReceivingState.connect(
-      this, &QuicTransportChannel::OnReceivingState);
-
-  // Set the QUIC connection timeout.
-  config_.SetIdleConnectionStateLifetime(
-      net::QuicTime::Delta::FromSeconds(kIdleConnectionStateLifetime),
-      net::QuicTime::Delta::FromSeconds(kIdleConnectionStateLifetime));
-  // Set the bytes reserved for the QUIC connection ID to zero.
-  config_.SetBytesForConnectionIdToSend(0);
-}
-
-QuicTransportChannel::~QuicTransportChannel() {}
-
-bool QuicTransportChannel::SetLocalCertificate(
-    const rtc::scoped_refptr<rtc::RTCCertificate>& certificate) {
-  if (!certificate) {
-    LOG_J(LS_ERROR, this)
-        << "No local certificate was supplied. Not doing QUIC.";
-    return false;
-  }
-  if (!local_certificate_) {
-    local_certificate_ = certificate;
-    return true;
-  }
-  if (certificate == local_certificate_) {
-    // This may happen during renegotiation.
-    LOG_J(LS_INFO, this) << "Ignoring identical certificate";
-    return true;
-  }
-  LOG_J(LS_ERROR, this)
-      << "Local certificate of the QUIC connection already set. "
-         "Can't change the local certificate once it's active.";
-  return false;
-}
-
-rtc::scoped_refptr<rtc::RTCCertificate>
-QuicTransportChannel::GetLocalCertificate() const {
-  return local_certificate_;
-}
-
-bool QuicTransportChannel::SetSslRole(rtc::SSLRole role) {
-  if (ssl_role_ && *ssl_role_ == role) {
-    LOG_J(LS_WARNING, this) << "Ignoring SSL Role identical to current role.";
-    return true;
-  }
-  if (quic_state_ != QUIC_TRANSPORT_CONNECTED) {
-    ssl_role_ = rtc::Optional<rtc::SSLRole>(role);
-    return true;
-  }
-  LOG_J(LS_ERROR, this)
-      << "SSL Role can't be reversed after the session is setup.";
-  return false;
-}
-
-bool QuicTransportChannel::GetSslRole(rtc::SSLRole* role) const {
-  if (!ssl_role_) {
-    return false;
-  }
-  *role = *ssl_role_;
-  return true;
-}
-
-bool QuicTransportChannel::SetRemoteFingerprint(const std::string& digest_alg,
-                                                const uint8_t* digest,
-                                                size_t digest_len) {
-  if (digest_alg.empty()) {
-    RTC_DCHECK(!digest_len);
-    LOG_J(LS_ERROR, this) << "Remote peer doesn't support digest algorithm.";
-    return false;
-  }
-  std::string remote_fingerprint_value(reinterpret_cast<const char*>(digest),
-                                       digest_len);
-  // Once we have the local certificate, the same remote fingerprint can be set
-  // multiple times. This may happen during renegotiation.
-  if (remote_fingerprint_ &&
-      remote_fingerprint_->value == remote_fingerprint_value &&
-      remote_fingerprint_->algorithm == digest_alg) {
-    LOG_J(LS_INFO, this)
-        << "Ignoring identical remote fingerprint and algorithm";
-    return true;
-  }
-  remote_fingerprint_ = rtc::Optional<RemoteFingerprint>(RemoteFingerprint());
-  remote_fingerprint_->value = remote_fingerprint_value;
-  remote_fingerprint_->algorithm = digest_alg;
-  return true;
-}
-
-bool QuicTransportChannel::ExportKeyingMaterial(const std::string& label,
-                                                const uint8_t* context,
-                                                size_t context_len,
-                                                bool use_context,
-                                                uint8_t* result,
-                                                size_t result_len) {
-  std::string quic_context(reinterpret_cast<const char*>(context), context_len);
-  std::string quic_result;
-  if (!quic_->ExportKeyingMaterial(label, quic_context, result_len,
-                                   &quic_result)) {
-    return false;
-  }
-  quic_result.copy(reinterpret_cast<char*>(result), result_len);
-  return true;
-}
-
-bool QuicTransportChannel::GetSrtpCryptoSuite(int* cipher) {
-  *cipher = rtc::SRTP_AES128_CM_SHA1_80;
-  return true;
-}
-
-// Called from upper layers to send a media packet.
-int QuicTransportChannel::SendPacket(const char* data,
-                                     size_t size,
-                                     const rtc::PacketOptions& options,
-                                     int flags) {
-  if ((flags & PF_SRTP_BYPASS) && IsRtpPacket(data, size)) {
-    return channel_->SendPacket(data, size, options);
-  }
-  LOG(LS_ERROR) << "Failed to send an invalid SRTP bypass packet using QUIC.";
-  return -1;
-}
-
-// The state transition logic here is as follows:
-//     - Before the QUIC handshake is complete, the QUIC channel is unwritable.
-//     - When |channel_| goes writable we start the QUIC handshake.
-//     - Once the QUIC handshake completes, the state is that of the
-//       |channel_| again.
-void QuicTransportChannel::OnWritableState(TransportChannel* channel) {
-  RTC_DCHECK(rtc::Thread::Current() == network_thread_);
-  RTC_DCHECK(channel == channel_.get());
-  LOG_J(LS_VERBOSE, this)
-      << "QuicTransportChannel: channel writable state changed to "
-      << channel_->writable();
-  switch (quic_state_) {
-    case QUIC_TRANSPORT_NEW:
-      // Start the QUIC handshake when |channel_| is writable.
-      // This will fail if the SSL role or remote fingerprint are not set.
-      // Otherwise failure could result from network or QUIC errors.
-      MaybeStartQuic();
-      break;
-    case QUIC_TRANSPORT_CONNECTED:
-      // Note: SignalWritableState fired by set_writable.
-      set_writable(channel_->writable());
-      if (HasDataToWrite()) {
-        OnCanWrite();
-      }
-      break;
-    case QUIC_TRANSPORT_CONNECTING:
-      // This channel is not writable until the QUIC handshake finishes. It
-      // might have been write blocked.
-      if (HasDataToWrite()) {
-        OnCanWrite();
-      }
-      break;
-    case QUIC_TRANSPORT_CLOSED:
-      // TODO(mikescarlett): Allow the QUIC connection to be reset if it drops
-      // due to a non-failure.
-      break;
-  }
-}
-
-void QuicTransportChannel::OnReceivingState(TransportChannel* channel) {
-  RTC_DCHECK(rtc::Thread::Current() == network_thread_);
-  RTC_DCHECK(channel == channel_.get());
-  LOG_J(LS_VERBOSE, this)
-      << "QuicTransportChannel: channel receiving state changed to "
-      << channel_->receiving();
-  if (quic_state_ == QUIC_TRANSPORT_CONNECTED) {
-    // Note: SignalReceivingState fired by set_receiving.
-    set_receiving(channel_->receiving());
-  }
-}
-
-void QuicTransportChannel::OnReadPacket(TransportChannel* channel,
-                                        const char* data,
-                                        size_t size,
-                                        const rtc::PacketTime& packet_time,
-                                        int flags) {
-  RTC_DCHECK(rtc::Thread::Current() == network_thread_);
-  RTC_DCHECK(channel == channel_.get());
-  RTC_DCHECK(flags == 0);
-
-  switch (quic_state_) {
-    case QUIC_TRANSPORT_NEW:
-      // This would occur if other peer is ready to start QUIC but this peer
-      // hasn't started QUIC.
-      LOG_J(LS_INFO, this) << "Dropping packet received before QUIC started.";
-      break;
-    case QUIC_TRANSPORT_CONNECTING:
-    case QUIC_TRANSPORT_CONNECTED:
-      // We should only get QUIC or SRTP packets; STUN's already been demuxed.
-      // Is this potentially a QUIC packet?
-      if (IsQuicPacket(data, size)) {
-        if (!HandleQuicPacket(data, size)) {
-          LOG_J(LS_ERROR, this) << "Failed to handle QUIC packet.";
-          return;
-        }
-      } else {
-        // If this is an RTP packet, signal upwards as a bypass packet.
-        if (!IsRtpPacket(data, size)) {
-          LOG_J(LS_ERROR, this)
-              << "Received unexpected non-QUIC, non-RTP packet.";
-          return;
-        }
-        SignalReadPacket(this, data, size, packet_time, PF_SRTP_BYPASS);
-      }
-      break;
-    case QUIC_TRANSPORT_CLOSED:
-      // This shouldn't be happening. Drop the packet.
-      break;
-  }
-}
-
-void QuicTransportChannel::OnSentPacket(TransportChannel* channel,
-                                        const rtc::SentPacket& sent_packet) {
-  RTC_DCHECK(rtc::Thread::Current() == network_thread_);
-  SignalSentPacket(this, sent_packet);
-}
-
-void QuicTransportChannel::OnReadyToSend(TransportChannel* channel) {
-  if (writable()) {
-    SignalReadyToSend(this);
-  }
-}
-
-void QuicTransportChannel::OnGatheringState(TransportChannelImpl* channel) {
-  RTC_DCHECK(channel == channel_.get());
-  SignalGatheringState(this);
-}
-
-void QuicTransportChannel::OnCandidateGathered(TransportChannelImpl* channel,
-                                               const Candidate& c) {
-  RTC_DCHECK(channel == channel_.get());
-  SignalCandidateGathered(this, c);
-}
-
-void QuicTransportChannel::OnRoleConflict(TransportChannelImpl* channel) {
-  RTC_DCHECK(channel == channel_.get());
-  SignalRoleConflict(this);
-}
-
-void QuicTransportChannel::OnRouteChange(TransportChannel* channel,
-                                         const Candidate& candidate) {
-  RTC_DCHECK(channel == channel_.get());
-  SignalRouteChange(this, candidate);
-}
-
-void QuicTransportChannel::OnSelectedCandidatePairChanged(
-    TransportChannel* channel,
-    CandidatePairInterface* selected_candidate_pair,
-    int last_sent_packet_id,
-    bool ready_to_send) {
-  RTC_DCHECK(channel == channel_.get());
-  SignalSelectedCandidatePairChanged(this, selected_candidate_pair,
-                                     last_sent_packet_id, ready_to_send);
-}
-
-void QuicTransportChannel::OnChannelStateChanged(
-    TransportChannelImpl* channel) {
-  RTC_DCHECK(channel == channel_.get());
-  SignalStateChanged(this);
-}
-
-bool QuicTransportChannel::MaybeStartQuic() {
-  if (!channel_->writable()) {
-    LOG_J(LS_ERROR, this) << "Couldn't start QUIC handshake.";
-    return false;
-  }
-  if (!CreateQuicSession() || !StartQuicHandshake()) {
-    LOG_J(LS_WARNING, this)
-        << "Underlying channel is writable but cannot start "
-           "the QUIC handshake.";
-    return false;
-  }
-  // Verify connection is not closed due to QUIC bug or network failure.
-  // A closed connection should not happen since |channel_| is writable.
-  if (!quic_->connection()->connected()) {
-    LOG_J(LS_ERROR, this)
-        << "QUIC connection should not be closed if underlying "
-           "channel is writable.";
-    return false;
-  }
-  // Indicate that |quic_| is ready to receive QUIC packets.
-  set_quic_state(QUIC_TRANSPORT_CONNECTING);
-  return true;
-}
-
-bool QuicTransportChannel::CreateQuicSession() {
-  if (!ssl_role_ || !remote_fingerprint_) {
-    return false;
-  }
-  net::Perspective perspective = (*ssl_role_ == rtc::SSL_CLIENT)
-                                     ? net::Perspective::IS_CLIENT
-                                     : net::Perspective::IS_SERVER;
-  bool owns_writer = false;
-  std::unique_ptr<net::QuicConnection> connection(new net::QuicConnection(
-      kConnectionId, kConnectionIpEndpoint, &helper_, this, owns_writer,
-      perspective, net::QuicSupportedVersions()));
-  quic_.reset(new QuicSession(std::move(connection), config_));
-  quic_->SignalHandshakeComplete.connect(
-      this, &QuicTransportChannel::OnHandshakeComplete);
-  quic_->SignalConnectionClosed.connect(
-      this, &QuicTransportChannel::OnConnectionClosed);
-  quic_->SignalIncomingStream.connect(this,
-                                      &QuicTransportChannel::OnIncomingStream);
-  return true;
-}
-
-bool QuicTransportChannel::StartQuicHandshake() {
-  if (*ssl_role_ == rtc::SSL_CLIENT) {
-    // Unique identifier for remote peer.
-    net::QuicServerId server_id(remote_fingerprint_->value, kQuicServerPort);
-    // Perform authentication of remote peer; owned by QuicCryptoClientConfig.
-    // TODO(mikescarlett): Actually verify proof.
-    net::ProofVerifier* proof_verifier = new InsecureProofVerifier();
-    quic_crypto_client_config_.reset(
-        new net::QuicCryptoClientConfig(proof_verifier));
-    net::QuicCryptoClientStream* crypto_stream =
-        new net::QuicCryptoClientStream(server_id, quic_.get(),
-                                        new net::ProofVerifyContext(),
-                                        quic_crypto_client_config_.get(), this);
-    quic_->StartClientHandshake(crypto_stream);
-    LOG_J(LS_INFO, this) << "QuicTransportChannel: Started client handshake.";
-  } else {
-    RTC_DCHECK_EQ(*ssl_role_, rtc::SSL_SERVER);
-    // Provide credentials to remote peer; owned by QuicCryptoServerConfig.
-    // TODO(mikescarlett): Actually provide credentials.
-    net::ProofSource* proof_source = new DummyProofSource();
-    // Input keying material to HKDF, per http://tools.ietf.org/html/rfc5869.
-    // This is pseudorandom so that HKDF-Extract outputs a pseudorandom key,
-    // since QuicCryptoServerConfig does not use a salt value.
-    std::string source_address_token_secret;
-    if (!rtc::CreateRandomString(kInputKeyingMaterialLength,
-                                 &source_address_token_secret)) {
-      LOG_J(LS_ERROR, this)
-          << "Error generating input keying material for HKDF.";
-      return false;
-    }
-    quic_crypto_server_config_.reset(new net::QuicCryptoServerConfig(
-        source_address_token_secret, helper_.GetRandomGenerator(),
-        proof_source));
-    // Provide server with serialized config string to prove ownership.
-    net::QuicCryptoServerConfig::ConfigOptions options;
-    quic_crypto_server_config_->AddDefaultConfig(helper_.GetRandomGenerator(),
-                                                 helper_.GetClock(), options);
-    quic_compressed_certs_cache_.reset(new net::QuicCompressedCertsCache(
-        net::QuicCompressedCertsCache::kQuicCompressedCertsCacheSize));
-    // TODO(mikescarlett): Add support for stateless rejects.
-    bool use_stateless_rejects_if_peer_supported = false;
-    net::QuicCryptoServerStream* crypto_stream =
-        new net::QuicCryptoServerStream(quic_crypto_server_config_.get(),
-                                        quic_compressed_certs_cache_.get(),
-                                        use_stateless_rejects_if_peer_supported,
-                                        quic_.get());
-    quic_->StartServerHandshake(crypto_stream);
-    LOG_J(LS_INFO, this) << "QuicTransportChannel: Started server handshake.";
-  }
-  return true;
-}
-
-bool QuicTransportChannel::HandleQuicPacket(const char* data, size_t size) {
-  RTC_DCHECK(rtc::Thread::Current() == network_thread_);
-  return quic_->OnReadPacket(data, size);
-}
-
-net::WriteResult QuicTransportChannel::WritePacket(
-    const char* buffer,
-    size_t buf_len,
-    const net::IPAddress& self_address,
-    const net::IPEndPoint& peer_address,
-    net::PerPacketOptions* options) {
-  // QUIC should never call this if IsWriteBlocked, but just in case...
-  if (IsWriteBlocked()) {
-    return net::WriteResult(net::WRITE_STATUS_BLOCKED, EWOULDBLOCK);
-  }
-  // TODO(mikescarlett): Figure out how to tell QUIC "I dropped your packet, but
-  // don't block" without the QUIC connection tearing itself down.
-  int sent = channel_->SendPacket(buffer, buf_len, rtc::PacketOptions());
-  int bytes_written = sent > 0 ? sent : 0;
-  return net::WriteResult(net::WRITE_STATUS_OK, bytes_written);
-}
-
-// TODO(mikescarlett): Implement check for whether |channel_| is currently
-// write blocked so that |quic_| does not try to write packet. This is
-// necessary because |channel_| can be writable yet write blocked and
-// channel_->GetError() is not flushed when there is no error.
-bool QuicTransportChannel::IsWriteBlocked() const {
-  return !channel_->writable();
-}
-
-void QuicTransportChannel::OnHandshakeComplete() {
-  set_quic_state(QUIC_TRANSPORT_CONNECTED);
-  set_writable(true);
-  // OnReceivingState might have been called before the QUIC channel was
-  // connected, in which case the QUIC channel is now receiving.
-  if (channel_->receiving()) {
-    set_receiving(true);
-  }
-}
-
-void QuicTransportChannel::OnConnectionClosed(net::QuicErrorCode error,
-                                              bool from_peer) {
-  LOG_J(LS_INFO, this) << "Connection closed by "
-                       << (from_peer ? "other" : "this") << " peer "
-                       << "with QUIC error " << error;
-  // TODO(mikescarlett): Allow the QUIC session to be reset when the connection
-  // does not close due to failure.
-  set_quic_state(QUIC_TRANSPORT_CLOSED);
-  set_writable(false);
-  SignalClosed();
-}
-
-void QuicTransportChannel::OnProofValid(
-    const net::QuicCryptoClientConfig::CachedState& cached) {
-  LOG_J(LS_INFO, this) << "Cached proof marked valid";
-}
-
-void QuicTransportChannel::OnProofVerifyDetailsAvailable(
-    const net::ProofVerifyDetails& verify_details) {
-  LOG_J(LS_INFO, this) << "Proof verify details available from"
-                       << " QuicCryptoClientStream";
-}
-
-bool QuicTransportChannel::HasDataToWrite() const {
-  return quic_ && quic_->HasDataToWrite();
-}
-
-void QuicTransportChannel::OnCanWrite() {
-  RTC_DCHECK(quic_ != nullptr);
-  quic_->connection()->OnCanWrite();
-}
-
-void QuicTransportChannel::set_quic_state(QuicTransportState state) {
-  LOG_J(LS_VERBOSE, this) << "set_quic_state from:" << quic_state_ << " to "
-                          << state;
-  quic_state_ = state;
-}
-
-ReliableQuicStream* QuicTransportChannel::CreateQuicStream() {
-  if (quic_) {
-    net::SpdyPriority priority = 0;  // Priority of the QUIC stream
-    return quic_->CreateOutgoingDynamicStream(priority);
-  }
-  return nullptr;
-}
-
-void QuicTransportChannel::OnIncomingStream(ReliableQuicStream* stream) {
-  SignalIncomingStream(stream);
-}
-
-}  // namespace cricket
diff --git a/p2p/quic/quictransportchannel.h b/p2p/quic/quictransportchannel.h
deleted file mode 100644
index 76560e9..0000000
--- a/p2p/quic/quictransportchannel.h
+++ /dev/null
@@ -1,308 +0,0 @@
-/*
- *  Copyright 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_P2P_QUIC_QUICTRANSPORTCHANNEL_H_
-#define WEBRTC_P2P_QUIC_QUICTRANSPORTCHANNEL_H_
-
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "net/quic/quic_crypto_client_stream.h"
-#include "net/quic/quic_packet_writer.h"
-#include "webrtc/api/optional.h"
-#include "webrtc/p2p/base/transportchannelimpl.h"
-#include "webrtc/p2p/quic/quicconnectionhelper.h"
-#include "webrtc/p2p/quic/quicsession.h"
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace cricket {
-
-enum QuicTransportState {
-  // Haven't started QUIC handshake.
-  QUIC_TRANSPORT_NEW = 0,
-  // Started QUIC handshake.
-  QUIC_TRANSPORT_CONNECTING,
-  // Negotiated, and has an encrypted connection.
-  QUIC_TRANSPORT_CONNECTED,
-  // QUIC connection closed due to handshake failure or explicit shutdown.
-  QUIC_TRANSPORT_CLOSED,
-};
-
-// QuicTransportChannel uses the QUIC protocol to establish encryption with
-// another peer, wrapping an existing TransportChannelImpl instance
-// (e.g a P2PTransportChannel) responsible for connecting peers.
-// Once the wrapped transport channel is connected, QuicTransportChannel
-// negotiates the crypto handshake and establishes SRTP keying material.
-//
-// How it works:
-//
-//   QuicTransportChannel {
-//       QuicSession* quic_;
-//       TransportChannelImpl* channel_;
-//   }
-//
-//   - Data written to SendPacket() is passed directly to |channel_| if it is
-//     an SRTP packet with the PF_SRTP_BYPASS flag.
-//
-//   - |quic_| passes outgoing packets to WritePacket(), which transfers them
-//     to |channel_| to be sent across the network.
-//
-//   - Data which comes into QuicTransportChannel::OnReadPacket is checked to
-//     see if it is QUIC, and if it is, passed to |quic_|. SRTP packets are
-//     signaled upwards as bypass packets.
-//
-//   - When the QUIC handshake is completed, quic_state() returns
-//     QUIC_TRANSPORT_CONNECTED and SRTP keying material can be exported.
-//
-//   - CreateQuicStream() creates an outgoing QUIC stream. Once the local peer
-//     sends data from this stream, the remote peer emits SignalIncomingStream
-//     with a QUIC stream of the same id to handle received data.
-//
-// TODO(mikescarlett): Implement secure QUIC handshake and 0-RTT handshakes.
-class QuicTransportChannel : public TransportChannelImpl,
-                             public net::QuicPacketWriter,
-                             public net::QuicCryptoClientStream::ProofHandler {
- public:
-  // |channel| - the TransportChannelImpl we are wrapping.
-  explicit QuicTransportChannel(TransportChannelImpl* channel);
-  ~QuicTransportChannel() override;
-
-  // TransportChannel overrides.
-  // TODO(mikescarlett): Implement certificate authentication.
-  bool SetLocalCertificate(
-      const rtc::scoped_refptr<rtc::RTCCertificate>& certificate) override;
-  rtc::scoped_refptr<rtc::RTCCertificate> GetLocalCertificate() const override;
-  // TODO(mikescarlett): Implement fingerprint authentication.
-  bool SetRemoteFingerprint(const std::string& digest_alg,
-                            const uint8_t* digest,
-                            size_t digest_len) override;
-  // TODO(mikescarlett): Remove this DTLS-specific method when TransportChannel
-  // does not require defining it.
-  bool IsDtlsActive() const override { return true; }
-  // Sends a RTP packet if the PF_SRTP_BYPASS flag is set.
-  int SendPacket(const char* data,
-                 size_t size,
-                 const rtc::PacketOptions& options,
-                 int flags) override;
-  // Sets up the ciphers to use for SRTP.
-  // TODO(mikescarlett): Use SRTP ciphers for negotiation.
-  bool SetSrtpCryptoSuites(const std::vector<int>& ciphers) override {
-    return true;
-  }
-  // Determines which SRTP cipher was negotiated.
-  // TODO(mikescarlett): Implement QUIC cipher negotiation. This currently
-  // returns SRTP_AES128_CM_SHA1_80.
-  bool GetSrtpCryptoSuite(int* cipher) override;
-  bool SetSslRole(rtc::SSLRole role) override;
-  bool GetSslRole(rtc::SSLRole* role) const override;
-  // Determines which SSL cipher was negotiated.
-  // TODO(mikescarlett): Implement QUIC cipher negotiation.
-  bool GetSslCipherSuite(int* cipher) override { return false; }
-  // Once QUIC is established (i.e., |quic_state_| is QUIC_TRANSPORT_CONNECTED),
-  // this extracts the keys negotiated during the QUIC handshake, for use
-  // in external encryption such as for extracting SRTP keys.
-  bool ExportKeyingMaterial(const std::string& label,
-                            const uint8_t* context,
-                            size_t context_len,
-                            bool use_context,
-                            uint8_t* result,
-                            size_t result_len) override;
-  // TODO(mikescarlett): Remove this method once TransportChannel does not
-  // require defining it.
-  std::unique_ptr<rtc::SSLCertificate> GetRemoteSSLCertificate()
-      const override {
-    return nullptr;
-  }
-
-  // TransportChannelImpl overrides that we forward to the wrapped transport.
-  void SetIceRole(IceRole role) override { channel_->SetIceRole(role); }
-  IceRole GetIceRole() const override { return channel_->GetIceRole(); }
-  int SetOption(rtc::Socket::Option opt, int value) override {
-    return channel_->SetOption(opt, value);
-  }
-  bool GetOption(rtc::Socket::Option opt, int* value) override {
-    return channel_->GetOption(opt, value);
-  }
-  int GetError() override { return channel_->GetError(); }
-  bool GetStats(ConnectionInfos* infos) override {
-    return channel_->GetStats(infos);
-  }
-  const std::string SessionId() const override { return channel_->SessionId(); }
-  TransportChannelState GetState() const override {
-    return channel_->GetState();
-  }
-  void SetIceTiebreaker(uint64_t tiebreaker) override {
-    channel_->SetIceTiebreaker(tiebreaker);
-  }
-  void SetIceParameters(const IceParameters& ice_params) override {
-    channel_->SetIceParameters(ice_params);
-  }
-  void SetRemoteIceParameters(const IceParameters& ice_params) override {
-    channel_->SetRemoteIceParameters(ice_params);
-  }
-  void SetRemoteIceMode(IceMode mode) override {
-    channel_->SetRemoteIceMode(mode);
-  }
-  void MaybeStartGathering() override { channel_->MaybeStartGathering(); }
-  IceGatheringState gathering_state() const override {
-    return channel_->gathering_state();
-  }
-  void AddRemoteCandidate(const Candidate& candidate) override {
-    channel_->AddRemoteCandidate(candidate);
-  }
-  void RemoveRemoteCandidate(const Candidate& candidate) override {
-    channel_->RemoveRemoteCandidate(candidate);
-  }
-  void SetIceConfig(const IceConfig& config) override {
-    channel_->SetIceConfig(config);
-  }
-
-  // QuicPacketWriter overrides.
-  // Called from net::QuicConnection when |quic_| has packets to write.
-  net::WriteResult WritePacket(const char* buffer,
-                               size_t buf_len,
-                               const net::IPAddress& self_address,
-                               const net::IPEndPoint& peer_address,
-                               net::PerPacketOptions* options) override;
-  // Whether QuicTransportChannel buffers data when unable to write. If this is
-  // set to false, then net::QuicConnection buffers unsent packets.
-  bool IsWriteBlockedDataBuffered() const override { return false; }
-  // Whether QuicTransportChannel is write blocked. If this returns true,
-  // outgoing QUIC packets are queued by net::QuicConnection until
-  // QuicTransportChannel::OnCanWrite() is called.
-  bool IsWriteBlocked() const override;
-  // Maximum size of the QUIC packet which can be written.
-  net::QuicByteCount GetMaxPacketSize(
-      const net::IPEndPoint& peer_address) const override {
-    return net::kMaxPacketSize;
-  }
-  // This method is not used -- call set_writable(bool writable) instead.
-  // TODO(miekscarlett): Remove this method once QuicPacketWriter does not
-  // require defining it.
-  void SetWritable() override {}
-
-  // QuicCryptoClientStream::ProofHandler overrides.
-  // Called by client crypto handshake when cached proof is marked valid.
-  void OnProofValid(
-      const net::QuicCryptoClientConfig::CachedState& cached) override;
-  // Called by the client crypto handshake when proof verification details
-  // become available, either because proof verification is complete, or when
-  // cached details are used.
-  void OnProofVerifyDetailsAvailable(
-      const net::ProofVerifyDetails& verify_details) override;
-
-  void SetMetricsObserver(webrtc::MetricsObserverInterface* observer) override {
-    channel_->SetMetricsObserver(observer);
-  }
-
-  // Returns true if |quic_| has queued data which wasn't written due
-  // to |channel_| being write blocked.
-  bool HasDataToWrite() const;
-  // Writes queued data for |quic_| when |channel_| is no longer write blocked.
-  void OnCanWrite();
-  // Connectivity state of QuicTransportChannel.
-  QuicTransportState quic_state() const { return quic_state_; }
-  // Creates a new QUIC stream that can send data.
-  ReliableQuicStream* CreateQuicStream();
-
-  TransportChannelImpl* ice_transport_channel() { return channel_.get(); }
-
-  // Emitted when |quic_| creates a QUIC stream to receive data from the remote
-  // peer, when the stream did not exist previously.
-  sigslot::signal1<ReliableQuicStream*> SignalIncomingStream;
-  // Emitted when the QuicTransportChannel state becomes QUIC_TRANSPORT_CLOSED.
-  sigslot::signal0<> SignalClosed;
-
- private:
-  // Fingerprint of remote peer.
-  struct RemoteFingerprint {
-    std::string value;
-    std::string algorithm;
-  };
-
-  // Callbacks for |channel_|.
-  void OnReadableState(TransportChannel* channel);
-  void OnWritableState(TransportChannel* channel);
-  void OnReadPacket(TransportChannel* channel,
-                    const char* data,
-                    size_t size,
-                    const rtc::PacketTime& packet_time,
-                    int flags);
-  void OnSentPacket(TransportChannel* channel,
-                    const rtc::SentPacket& sent_packet);
-  void OnReadyToSend(TransportChannel* channel);
-  void OnReceivingState(TransportChannel* channel);
-  void OnGatheringState(TransportChannelImpl* channel);
-  void OnCandidateGathered(TransportChannelImpl* channel, const Candidate& c);
-  void OnRoleConflict(TransportChannelImpl* channel);
-  void OnRouteChange(TransportChannel* channel, const Candidate& candidate);
-  void OnSelectedCandidatePairChanged(
-      TransportChannel* channel,
-      CandidatePairInterface* selected_candidate_pair,
-      int last_sent_packet_id,
-      bool ready_to_send);
-  void OnChannelStateChanged(TransportChannelImpl* channel);
-
-  // Callbacks for |quic_|.
-  // Called when |quic_| has established the crypto handshake.
-  void OnHandshakeComplete();
-  // Called when |quic_| has closed the connection.
-  void OnConnectionClosed(net::QuicErrorCode error, bool from_peer);
-  // Called when |quic_| has created a new QUIC stream for incoming data.
-  void OnIncomingStream(ReliableQuicStream* stream);
-
-  // Called by OnReadPacket() when a QUIC packet is received.
-  bool HandleQuicPacket(const char* data, size_t size);
-  // Sets up the QUIC handshake.
-  bool MaybeStartQuic();
-  // Creates the QUIC connection and |quic_|.
-  bool CreateQuicSession();
-  // Creates the crypto stream and initializes the handshake.
-  bool StartQuicHandshake();
-  // Sets the QuicTransportChannel connectivity state.
-  void set_quic_state(QuicTransportState state);
-
-  // Everything should occur on this thread.
-  rtc::Thread* network_thread_;
-  // Underlying channel which is responsible for connecting with the remote peer
-  // and sending/receiving packets across the network.
-  std::unique_ptr<TransportChannelImpl> channel_;
-  // Connectivity state of QuicTransportChannel.
-  QuicTransportState quic_state_ = QUIC_TRANSPORT_NEW;
-  // QUIC session which establishes the crypto handshake and converts data
-  // to/from QUIC packets.
-  std::unique_ptr<QuicSession> quic_;
-  // Non-crypto config for |quic_|.
-  net::QuicConfig config_;
-  // Helper for net::QuicConnection that provides timing and
-  // random number generation.
-  QuicConnectionHelper helper_;
-  // This peer's role in the QUIC crypto handshake. SSL_CLIENT implies this peer
-  // initiates the handshake, while SSL_SERVER implies the remote peer initiates
-  // the handshake. This must be set before we start QUIC.
-  rtc::Optional<rtc::SSLRole> ssl_role_;
-  // Config for QUIC crypto client stream, used when |ssl_role_| is SSL_CLIENT.
-  std::unique_ptr<net::QuicCryptoClientConfig> quic_crypto_client_config_;
-  // Config for QUIC crypto server stream, used when |ssl_role_| is SSL_SERVER.
-  std::unique_ptr<net::QuicCryptoServerConfig> quic_crypto_server_config_;
-  // Used by QUIC crypto server stream to track most recently compressed certs.
-  std::unique_ptr<net::QuicCompressedCertsCache> quic_compressed_certs_cache_;
-  // This peer's certificate.
-  rtc::scoped_refptr<rtc::RTCCertificate> local_certificate_;
-  // Fingerprint of the remote peer. This must be set before we start QUIC.
-  rtc::Optional<RemoteFingerprint> remote_fingerprint_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(QuicTransportChannel);
-};
-
-}  // namespace cricket
-
-#endif  // WEBRTC_P2P_QUIC_QUICTRANSPORTCHANNEL_H_
diff --git a/p2p/quic/quictransportchannel_unittest.cc b/p2p/quic/quictransportchannel_unittest.cc
deleted file mode 100644
index 9ed21f1..0000000
--- a/p2p/quic/quictransportchannel_unittest.cc
+++ /dev/null
@@ -1,550 +0,0 @@
-/*
- *  Copyright 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/p2p/quic/quictransportchannel.h"
-
-#include <memory>
-#include <set>
-#include <string>
-#include <vector>
-
-#include "webrtc/p2p/base/faketransportcontroller.h"
-#include "webrtc/rtc_base/gunit.h"
-#include "webrtc/rtc_base/sslidentity.h"
-
-using cricket::ConnectionRole;
-using cricket::IceRole;
-using cricket::QuicTransportChannel;
-using cricket::ReliableQuicStream;
-using cricket::TransportChannel;
-using cricket::TransportDescription;
-
-// Timeout in milliseconds for asynchronous operations in unit tests.
-static const int kTimeoutMs = 1000;
-
-// Export keying material parameters.
-static const char kExporterLabel[] = "label";
-static const uint8_t kExporterContext[] = "context";
-static const size_t kExporterContextLength = sizeof(kExporterContext);
-static const size_t kOutputKeyLength = 20;
-
-// Packet size for SRTP.
-static const size_t kPacketSize = 100;
-
-// Indicates ICE channel has no write error.
-static const int kNoWriteError = 0;
-
-// ICE parameters.
-static const char kIceUfrag[] = "TESTICEUFRAG0001";
-static const char kIcePwd[] = "TESTICEPWD00000000000001";
-
-// QUIC packet parameters.
-static const net::IPAddress kIpAddress(0, 0, 0, 0);
-static const net::IPEndPoint kIpEndpoint(kIpAddress, 0);
-
-// Detects incoming RTP packets.
-static bool IsRtpLeadByte(uint8_t b) {
-  return (b & 0xC0) == 0x80;
-}
-
-// Maps SSL role to ICE connection role. The peer with a client role is assumed
-// to be the one who initiates the connection.
-static ConnectionRole SslRoleToConnectionRole(rtc::SSLRole ssl_role) {
-  return (ssl_role == rtc::SSL_CLIENT) ? cricket::CONNECTIONROLE_ACTIVE
-                                       : cricket::CONNECTIONROLE_PASSIVE;
-}
-
-// Allows cricket::FakeTransportChannel to simulate write blocked
-// and write error states.
-// TODO(mikescarlett): Add this functionality to cricket::FakeTransportChannel.
-class FailableTransportChannel : public cricket::FakeTransportChannel {
- public:
-  FailableTransportChannel(const std::string& name, int component)
-      : cricket::FakeTransportChannel(name, component), error_(kNoWriteError) {}
-  int GetError() override { return error_; }
-  void SetError(int error) { error_ = error; }
-  int SendPacket(const char* data,
-                 size_t len,
-                 const rtc::PacketOptions& options,
-                 int flags) override {
-    if (error_ == kNoWriteError) {
-      return cricket::FakeTransportChannel::SendPacket(data, len, options,
-                                                       flags);
-    }
-    return -1;
-  }
-
- private:
-  int error_;
-};
-
-// Peer who establishes a handshake using a QuicTransportChannel, which wraps
-// a FailableTransportChannel to simulate network connectivity and ICE
-// negotiation.
-class QuicTestPeer : public sigslot::has_slots<> {
- public:
-  explicit QuicTestPeer(const std::string& name)
-      : name_(name),
-        bytes_sent_(0),
-        ice_channel_(new FailableTransportChannel(name_, 0)),
-        quic_channel_(ice_channel_),
-        incoming_stream_count_(0) {
-    quic_channel_.SignalReadPacket.connect(
-        this, &QuicTestPeer::OnTransportChannelReadPacket);
-    quic_channel_.SignalIncomingStream.connect(this,
-                                               &QuicTestPeer::OnIncomingStream);
-    quic_channel_.SignalClosed.connect(this, &QuicTestPeer::OnClosed);
-    ice_channel_->SetAsync(true);
-    rtc::scoped_refptr<rtc::RTCCertificate> local_cert =
-        rtc::RTCCertificate::Create(std::unique_ptr<rtc::SSLIdentity>(
-            rtc::SSLIdentity::Generate(name_, rtc::KT_DEFAULT)));
-    quic_channel_.SetLocalCertificate(local_cert);
-    local_fingerprint_.reset(CreateFingerprint(local_cert.get()));
-  }
-
-  // Connects |ice_channel_| to that of the other peer.
-  void Connect(QuicTestPeer* other_peer) {
-    ice_channel_->SetDestination(other_peer->ice_channel_);
-  }
-
-  // Disconnects |ice_channel_|.
-  void Disconnect() { ice_channel_->SetDestination(nullptr); }
-
-  // Generates ICE credentials and passes them to |quic_channel_|.
-  void SetIceParameters(IceRole local_ice_role,
-                        ConnectionRole local_connection_role,
-                        ConnectionRole remote_connection_role,
-                        rtc::SSLFingerprint* remote_fingerprint) {
-    quic_channel_.SetIceRole(local_ice_role);
-    quic_channel_.SetIceTiebreaker(
-        (local_ice_role == cricket::ICEROLE_CONTROLLING) ? 1 : 2);
-
-    TransportDescription local_desc(
-        std::vector<std::string>(), kIceUfrag, kIcePwd, cricket::ICEMODE_FULL,
-        local_connection_role, local_fingerprint_.get());
-    TransportDescription remote_desc(
-        std::vector<std::string>(), kIceUfrag, kIcePwd, cricket::ICEMODE_FULL,
-        remote_connection_role, remote_fingerprint);
-
-    quic_channel_.SetIceParameters(local_desc.GetIceParameters());
-    quic_channel_.SetRemoteIceParameters(remote_desc.GetIceParameters());
-  }
-
-  // Creates fingerprint from certificate.
-  rtc::SSLFingerprint* CreateFingerprint(rtc::RTCCertificate* cert) {
-    std::string digest_algorithm;
-    bool get_digest_algorithm =
-        cert->ssl_certificate().GetSignatureDigestAlgorithm(&digest_algorithm);
-    if (!get_digest_algorithm || digest_algorithm.empty()) {
-      return nullptr;
-    }
-    std::unique_ptr<rtc::SSLFingerprint> fingerprint(
-        rtc::SSLFingerprint::Create(digest_algorithm, cert->identity()));
-    if (digest_algorithm != rtc::DIGEST_SHA_256) {
-      return nullptr;
-    }
-    return fingerprint.release();
-  }
-
-  // Sends SRTP packet to the other peer via |quic_channel_|.
-  int SendSrtpPacket() {
-    char packet[kPacketSize];
-    packet[0] = 0x80;  // Make the packet header look like RTP.
-    int rv = quic_channel_.SendPacket(
-        &packet[0], kPacketSize, rtc::PacketOptions(), cricket::PF_SRTP_BYPASS);
-    bytes_sent_ += rv;
-    return rv;
-  }
-
-  // Sends a non-SRTP packet with the PF_SRTP_BYPASS flag via |quic_channel_|.
-  int SendInvalidSrtpPacket() {
-    char packet[kPacketSize];
-    // Fill the packet with 0 to form an invalid SRTP packet.
-    memset(packet, 0, kPacketSize);
-    return quic_channel_.SendPacket(
-        &packet[0], kPacketSize, rtc::PacketOptions(), cricket::PF_SRTP_BYPASS);
-  }
-
-  // Sends an RTP packet to the other peer via |quic_channel_|, without the SRTP
-  // bypass flag.
-  int SendRtpPacket() {
-    char packet[kPacketSize];
-    packet[0] = 0x80;  // Make the packet header look like RTP.
-    return quic_channel_.SendPacket(&packet[0], kPacketSize,
-                                    rtc::PacketOptions(), 0);
-  }
-
-  void ClearBytesSent() { bytes_sent_ = 0; }
-
-  void ClearBytesReceived() { bytes_received_ = 0; }
-
-  void SetWriteError(int error) { ice_channel_->SetError(error); }
-
-  size_t bytes_received() const { return bytes_received_; }
-
-  size_t bytes_sent() const { return bytes_sent_; }
-
-  FailableTransportChannel* ice_channel() { return ice_channel_; }
-
-  QuicTransportChannel* quic_channel() { return &quic_channel_; }
-
-  std::unique_ptr<rtc::SSLFingerprint>& local_fingerprint() {
-    return local_fingerprint_;
-  }
-
-  ReliableQuicStream* incoming_quic_stream() { return incoming_quic_stream_; }
-
-  size_t incoming_stream_count() const { return incoming_stream_count_; }
-
-  bool signal_closed_emitted() const { return signal_closed_emitted_; }
-
- private:
-  // QuicTransportChannel callbacks.
-  void OnTransportChannelReadPacket(TransportChannel* channel,
-                                    const char* data,
-                                    size_t size,
-                                    const rtc::PacketTime& packet_time,
-                                    int flags) {
-    bytes_received_ += size;
-    // Only SRTP packets should have the bypass flag set.
-    int expected_flags = IsRtpLeadByte(data[0]) ? cricket::PF_SRTP_BYPASS : 0;
-    ASSERT_EQ(expected_flags, flags);
-  }
-  void OnIncomingStream(ReliableQuicStream* stream) {
-    incoming_quic_stream_ = stream;
-    ++incoming_stream_count_;
-  }
-  void OnClosed() { signal_closed_emitted_ = true; }
-
-  std::string name_;                      // Channel name.
-  size_t bytes_sent_;                     // Bytes sent by QUIC channel.
-  size_t bytes_received_;                 // Bytes received by QUIC channel.
-  FailableTransportChannel* ice_channel_;  // Simulates an ICE channel.
-  QuicTransportChannel quic_channel_;     // QUIC channel to test.
-  std::unique_ptr<rtc::SSLFingerprint> local_fingerprint_;
-  ReliableQuicStream* incoming_quic_stream_ = nullptr;
-  size_t incoming_stream_count_;
-  bool signal_closed_emitted_ = false;
-};
-
-class QuicTransportChannelTest : public testing::Test {
- public:
-  QuicTransportChannelTest() : peer1_("P1"), peer2_("P2") {}
-
-  // Performs negotiation before QUIC handshake, then connects the fake
-  // transport channels of each peer. As a side effect, the QUIC channels
-  // start sending handshake messages. |peer1_| has a client role and |peer2_|
-  // has server role in the QUIC handshake.
-  void Connect() {
-    SetIceAndCryptoParameters(rtc::SSL_CLIENT, rtc::SSL_SERVER);
-    peer1_.Connect(&peer2_);
-  }
-
-  // Disconnects the fake transport channels.
-  void Disconnect() {
-    peer1_.Disconnect();
-    peer2_.Disconnect();
-  }
-
-  // Sets up ICE parameters and exchanges fingerprints before QUIC handshake.
-  void SetIceAndCryptoParameters(rtc::SSLRole peer1_ssl_role,
-                                 rtc::SSLRole peer2_ssl_role) {
-    peer1_.quic_channel()->SetSslRole(peer1_ssl_role);
-    peer2_.quic_channel()->SetSslRole(peer2_ssl_role);
-
-    std::unique_ptr<rtc::SSLFingerprint>& peer1_fingerprint =
-        peer1_.local_fingerprint();
-    std::unique_ptr<rtc::SSLFingerprint>& peer2_fingerprint =
-        peer2_.local_fingerprint();
-
-    peer1_.quic_channel()->SetRemoteFingerprint(
-        peer2_fingerprint->algorithm,
-        reinterpret_cast<const uint8_t*>(peer2_fingerprint->digest.data()),
-        peer2_fingerprint->digest.size());
-    peer2_.quic_channel()->SetRemoteFingerprint(
-        peer1_fingerprint->algorithm,
-        reinterpret_cast<const uint8_t*>(peer1_fingerprint->digest.data()),
-        peer1_fingerprint->digest.size());
-
-    ConnectionRole peer1_connection_role =
-        SslRoleToConnectionRole(peer1_ssl_role);
-    ConnectionRole peer2_connection_role =
-        SslRoleToConnectionRole(peer2_ssl_role);
-
-    peer1_.SetIceParameters(cricket::ICEROLE_CONTROLLED, peer1_connection_role,
-                            peer2_connection_role, peer2_fingerprint.get());
-    peer2_.SetIceParameters(cricket::ICEROLE_CONTROLLING, peer2_connection_role,
-                            peer1_connection_role, peer1_fingerprint.get());
-  }
-
-  // Checks if QUIC handshake is done.
-  bool quic_connected() {
-    return peer1_.quic_channel()->quic_state() ==
-               cricket::QUIC_TRANSPORT_CONNECTED &&
-           peer2_.quic_channel()->quic_state() ==
-               cricket::QUIC_TRANSPORT_CONNECTED;
-  }
-
-  // Checks if QUIC channels are writable.
-  bool quic_writable() {
-    return peer1_.quic_channel()->writable() &&
-           peer2_.quic_channel()->writable();
-  }
-
- protected:
-  // QUIC peer with a client role, who initiates the QUIC handshake.
-  QuicTestPeer peer1_;
-  // QUIC peer with a server role, who responds to the client peer.
-  QuicTestPeer peer2_;
-};
-
-// Test that the QUIC channel passes ICE parameters to the underlying ICE
-// channel.
-TEST_F(QuicTransportChannelTest, ChannelSetupIce) {
-  SetIceAndCryptoParameters(rtc::SSL_CLIENT, rtc::SSL_SERVER);
-  FailableTransportChannel* channel1 = peer1_.ice_channel();
-  FailableTransportChannel* channel2 = peer2_.ice_channel();
-  EXPECT_EQ(cricket::ICEROLE_CONTROLLED, channel1->GetIceRole());
-  EXPECT_EQ(2u, channel1->IceTiebreaker());
-  EXPECT_EQ(kIceUfrag, channel1->ice_ufrag());
-  EXPECT_EQ(kIcePwd, channel1->ice_pwd());
-  EXPECT_EQ(cricket::ICEROLE_CONTROLLING, channel2->GetIceRole());
-  EXPECT_EQ(1u, channel2->IceTiebreaker());
-}
-
-// Test that export keying material generates identical keys for both peers
-// after the QUIC handshake.
-TEST_F(QuicTransportChannelTest, ExportKeyingMaterial) {
-  Connect();
-  ASSERT_TRUE_WAIT(quic_connected(), kTimeoutMs);
-  uint8_t key1[kOutputKeyLength];
-  uint8_t key2[kOutputKeyLength];
-
-  bool from_success = peer1_.quic_channel()->ExportKeyingMaterial(
-      kExporterLabel, kExporterContext, kExporterContextLength, true, key1,
-      kOutputKeyLength);
-  ASSERT_TRUE(from_success);
-  bool to_success = peer2_.quic_channel()->ExportKeyingMaterial(
-      kExporterLabel, kExporterContext, kExporterContextLength, true, key2,
-      kOutputKeyLength);
-  ASSERT_TRUE(to_success);
-
-  EXPECT_EQ(0, memcmp(key1, key2, sizeof(key1)));
-}
-
-// Test that the QUIC channel is not writable before the QUIC handshake.
-TEST_F(QuicTransportChannelTest, NotWritableBeforeHandshake) {
-  Connect();
-  EXPECT_FALSE(quic_writable());
-  Disconnect();
-  EXPECT_FALSE(quic_writable());
-  Connect();
-  EXPECT_FALSE(quic_writable());
-}
-
-// Test that once handshake begins, QUIC is not writable until its completion.
-TEST_F(QuicTransportChannelTest, QuicHandshake) {
-  Connect();
-  EXPECT_FALSE(quic_writable());
-  ASSERT_TRUE_WAIT(quic_connected(), kTimeoutMs);
-  EXPECT_TRUE(quic_writable());
-}
-
-// Test that Non-SRTP data is not sent using SendPacket(), regardless of QUIC
-// channel state.
-TEST_F(QuicTransportChannelTest, TransferNonSrtp) {
-  // Send data before ICE channel is connected.
-  peer1_.ClearBytesSent();
-  peer2_.ClearBytesReceived();
-  ASSERT_EQ(-1, peer1_.SendRtpPacket());
-  EXPECT_EQ(0u, peer1_.bytes_sent());
-  // Send data after ICE channel is connected, before QUIC handshake.
-  Connect();
-  peer1_.ClearBytesSent();
-  peer2_.ClearBytesReceived();
-  ASSERT_EQ(-1, peer1_.SendRtpPacket());
-  EXPECT_EQ(0u, peer1_.bytes_sent());
-  // Send data after QUIC handshake.
-  ASSERT_TRUE_WAIT(quic_connected(), kTimeoutMs);
-  peer1_.ClearBytesSent();
-  peer2_.ClearBytesReceived();
-  ASSERT_EQ(-1, peer1_.SendRtpPacket());
-  EXPECT_EQ(0u, peer1_.bytes_sent());
-}
-
-// Test that SRTP data is always be sent, regardless of QUIC channel state, when
-// the ICE channel is connected.
-TEST_F(QuicTransportChannelTest, TransferSrtp) {
-  // Send data after ICE channel is connected, before QUIC handshake.
-  Connect();
-  peer1_.ClearBytesSent();
-  peer2_.ClearBytesReceived();
-  ASSERT_EQ(kPacketSize, static_cast<size_t>(peer1_.SendSrtpPacket()));
-  EXPECT_EQ_WAIT(kPacketSize, peer2_.bytes_received(), kTimeoutMs);
-  EXPECT_EQ(kPacketSize, peer1_.bytes_sent());
-  ASSERT_TRUE_WAIT(quic_connected(), kTimeoutMs);
-  // Send data after QUIC handshake.
-  peer1_.ClearBytesSent();
-  peer2_.ClearBytesReceived();
-  ASSERT_EQ(kPacketSize, static_cast<size_t>(peer1_.SendSrtpPacket()));
-  EXPECT_EQ_WAIT(kPacketSize, peer2_.bytes_received(), kTimeoutMs);
-  EXPECT_EQ(kPacketSize, peer1_.bytes_sent());
-}
-
-// Test that invalid SRTP (non-SRTP data with
-// PF_SRTP_BYPASS flag) fails to send with return value -1.
-TEST_F(QuicTransportChannelTest, TransferInvalidSrtp) {
-  peer1_.ClearBytesSent();
-  peer2_.ClearBytesReceived();
-  EXPECT_EQ(-1, peer1_.SendInvalidSrtpPacket());
-  EXPECT_EQ(0u, peer2_.bytes_received());
-  Connect();
-  peer1_.ClearBytesSent();
-  peer2_.ClearBytesReceived();
-  EXPECT_EQ(-1, peer1_.SendInvalidSrtpPacket());
-  EXPECT_EQ(0u, peer2_.bytes_received());
-}
-
-// Test that QuicTransportChannel::WritePacket blocks when the ICE
-// channel is not writable, and otherwise succeeds.
-TEST_F(QuicTransportChannelTest, QuicWritePacket) {
-  peer1_.ice_channel()->SetDestination(peer2_.ice_channel());
-  std::string packet = "FAKEQUICPACKET";
-
-  // QUIC should be write blocked when the ICE channel is not writable.
-  peer1_.ice_channel()->SetWritable(false);
-  EXPECT_TRUE(peer1_.quic_channel()->IsWriteBlocked());
-  net::WriteResult write_blocked_result = peer1_.quic_channel()->WritePacket(
-      packet.data(), packet.size(), kIpAddress, kIpEndpoint, nullptr);
-  EXPECT_EQ(net::WRITE_STATUS_BLOCKED, write_blocked_result.status);
-  EXPECT_EQ(EWOULDBLOCK, write_blocked_result.error_code);
-
-  // QUIC should ignore errors when the ICE channel is writable.
-  peer1_.ice_channel()->SetWritable(true);
-  EXPECT_FALSE(peer1_.quic_channel()->IsWriteBlocked());
-  peer1_.SetWriteError(EWOULDBLOCK);
-  net::WriteResult ignore_error_result = peer1_.quic_channel()->WritePacket(
-      packet.data(), packet.size(), kIpAddress, kIpEndpoint, nullptr);
-  EXPECT_EQ(net::WRITE_STATUS_OK, ignore_error_result.status);
-  EXPECT_EQ(0, ignore_error_result.bytes_written);
-
-  peer1_.SetWriteError(kNoWriteError);
-  net::WriteResult no_error_result = peer1_.quic_channel()->WritePacket(
-      packet.data(), packet.size(), kIpAddress, kIpEndpoint, nullptr);
-  EXPECT_EQ(net::WRITE_STATUS_OK, no_error_result.status);
-  EXPECT_EQ(static_cast<int>(packet.size()), no_error_result.bytes_written);
-}
-
-// Test that SSL roles can be reversed before QUIC handshake.
-TEST_F(QuicTransportChannelTest, QuicRoleReversalBeforeQuic) {
-  EXPECT_TRUE(peer1_.quic_channel()->SetSslRole(rtc::SSL_SERVER));
-  EXPECT_TRUE(peer1_.quic_channel()->SetSslRole(rtc::SSL_CLIENT));
-  EXPECT_TRUE(peer1_.quic_channel()->SetSslRole(rtc::SSL_SERVER));
-}
-
-// Test that SSL roles cannot be reversed after the QUIC handshake. SetSslRole
-// returns true if the current SSL role equals the proposed SSL role.
-TEST_F(QuicTransportChannelTest, QuicRoleReversalAfterQuic) {
-  Connect();
-  ASSERT_TRUE_WAIT(quic_connected(), kTimeoutMs);
-  EXPECT_FALSE(peer1_.quic_channel()->SetSslRole(rtc::SSL_SERVER));
-  EXPECT_TRUE(peer1_.quic_channel()->SetSslRole(rtc::SSL_CLIENT));
-  EXPECT_FALSE(peer2_.quic_channel()->SetSslRole(rtc::SSL_CLIENT));
-  EXPECT_TRUE(peer2_.quic_channel()->SetSslRole(rtc::SSL_SERVER));
-}
-
-// Set the SSL role, then test that GetSslRole returns the same value.
-TEST_F(QuicTransportChannelTest, SetGetSslRole) {
-  ASSERT_TRUE(peer1_.quic_channel()->SetSslRole(rtc::SSL_SERVER));
-  std::unique_ptr<rtc::SSLRole> role(new rtc::SSLRole());
-  ASSERT_TRUE(peer1_.quic_channel()->GetSslRole(role.get()));
-  EXPECT_EQ(rtc::SSL_SERVER, *role);
-}
-
-// Test that after the QUIC handshake is complete, the QUIC handshake remains
-// confirmed even if the ICE channel reconnects.
-TEST_F(QuicTransportChannelTest, HandshakeConfirmedAfterReconnect) {
-  Connect();
-  ASSERT_TRUE_WAIT(quic_connected(), kTimeoutMs);
-  Disconnect();
-  EXPECT_TRUE(quic_connected());
-  Connect();
-  EXPECT_TRUE(quic_connected());
-}
-
-// Test that if the ICE channel becomes receiving after the QUIC channel is
-// connected, then the QUIC channel becomes receiving.
-TEST_F(QuicTransportChannelTest, IceReceivingAfterConnected) {
-  Connect();
-  ASSERT_TRUE_WAIT(quic_connected(), kTimeoutMs);
-  ASSERT_FALSE(peer1_.ice_channel()->receiving());
-  EXPECT_FALSE(peer1_.quic_channel()->receiving());
-  peer1_.ice_channel()->SetReceiving(true);
-  EXPECT_TRUE(peer1_.quic_channel()->receiving());
-}
-
-// Test that if the ICE channel becomes receiving before the QUIC channel is
-// connected, then the QUIC channel becomes receiving.
-TEST_F(QuicTransportChannelTest, IceReceivingBeforeConnected) {
-  Connect();
-  peer1_.ice_channel()->SetReceiving(true);
-  ASSERT_TRUE(peer1_.ice_channel()->receiving());
-  ASSERT_TRUE_WAIT(quic_connected(), kTimeoutMs);
-  EXPECT_TRUE(peer1_.quic_channel()->receiving());
-}
-
-// Test that when peer 1 creates an outgoing stream, peer 2 creates an incoming
-// QUIC stream with the same ID and fires OnIncomingStream.
-TEST_F(QuicTransportChannelTest, CreateOutgoingAndIncomingQuicStream) {
-  Connect();
-  EXPECT_EQ(nullptr, peer1_.quic_channel()->CreateQuicStream());
-  ASSERT_TRUE_WAIT(quic_connected(), kTimeoutMs);
-  ReliableQuicStream* stream = peer1_.quic_channel()->CreateQuicStream();
-  ASSERT_NE(nullptr, stream);
-  stream->Write("Hi", 2);
-  EXPECT_TRUE_WAIT(peer2_.incoming_quic_stream() != nullptr, kTimeoutMs);
-  EXPECT_EQ(stream->id(), peer2_.incoming_quic_stream()->id());
-}
-
-// Test that if the QuicTransportChannel is unwritable, then all outgoing QUIC
-// streams can send data once the QuicTransprotChannel becomes writable again.
-TEST_F(QuicTransportChannelTest, OutgoingQuicStreamSendsDataAfterReconnect) {
-  Connect();
-  ASSERT_TRUE_WAIT(quic_connected(), kTimeoutMs);
-  ReliableQuicStream* stream1 = peer1_.quic_channel()->CreateQuicStream();
-  ASSERT_NE(nullptr, stream1);
-  ReliableQuicStream* stream2 = peer1_.quic_channel()->CreateQuicStream();
-  ASSERT_NE(nullptr, stream2);
-
-  peer1_.ice_channel()->SetWritable(false);
-  stream1->Write("First", 5);
-  EXPECT_EQ(5u, stream1->queued_data_bytes());
-  stream2->Write("Second", 6);
-  EXPECT_EQ(6u, stream2->queued_data_bytes());
-  EXPECT_EQ(0u, peer2_.incoming_stream_count());
-
-  peer1_.ice_channel()->SetWritable(true);
-  EXPECT_EQ_WAIT(0u, stream1->queued_data_bytes(), kTimeoutMs);
-  EXPECT_EQ_WAIT(0u, stream2->queued_data_bytes(), kTimeoutMs);
-  EXPECT_EQ_WAIT(2u, peer2_.incoming_stream_count(), kTimeoutMs);
-}
-
-// Test that SignalClosed is emitted when the QuicConnection closes.
-TEST_F(QuicTransportChannelTest, SignalClosedEmitted) {
-  Connect();
-  ASSERT_TRUE_WAIT(quic_connected(), kTimeoutMs);
-  ASSERT_FALSE(peer1_.signal_closed_emitted());
-  ReliableQuicStream* stream = peer1_.quic_channel()->CreateQuicStream();
-  ASSERT_NE(nullptr, stream);
-  stream->CloseConnectionWithDetails(net::QuicErrorCode::QUIC_NO_ERROR,
-                                     "Closing QUIC for testing");
-  EXPECT_TRUE(peer1_.signal_closed_emitted());
-  EXPECT_TRUE_WAIT(peer2_.signal_closed_emitted(), kTimeoutMs);
-}
diff --git a/p2p/quic/reliablequicstream.cc b/p2p/quic/reliablequicstream.cc
deleted file mode 100644
index 23c2df2..0000000
--- a/p2p/quic/reliablequicstream.cc
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- *  Copyright 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/p2p/quic/reliablequicstream.h"
-
-#include <string>
-
-#include "net/quic/quic_session.h"
-#include "webrtc/rtc_base/checks.h"
-
-namespace cricket {
-
-ReliableQuicStream::ReliableQuicStream(net::QuicStreamId id,
-                                       net::QuicSession* session)
-    : net::ReliableQuicStream(id, session) {
-  RTC_DCHECK_NE(net::kCryptoStreamId, id);
-}
-
-ReliableQuicStream::~ReliableQuicStream() {}
-
-void ReliableQuicStream::OnDataAvailable() {
-  struct iovec iov;
-  while (sequencer()->GetReadableRegions(&iov, 1) == 1) {
-    SignalDataReceived(id(), reinterpret_cast<const char*>(iov.iov_base),
-                       iov.iov_len);
-    sequencer()->MarkConsumed(iov.iov_len);
-  }
-}
-
-void ReliableQuicStream::OnClose() {
-  net::ReliableQuicStream::OnClose();
-  SignalClosed(id(), connection_error());
-}
-
-rtc::StreamResult ReliableQuicStream::Write(const char* data,
-                                            size_t len,
-                                            bool fin) {
-  // Writes the data, or buffers it.
-  WriteOrBufferData(base::StringPiece(data, len), fin, nullptr);
-  if (HasBufferedData()) {
-    return rtc::StreamResult(rtc::SR_BLOCK);
-  }
-  return rtc::StreamResult(rtc::SR_SUCCESS);
-}
-
-void ReliableQuicStream::Close() {
-  net::ReliableQuicStream::session()->CloseStream(id());
-}
-
-void ReliableQuicStream::OnCanWrite() {
-  uint64_t prev_queued_bytes = queued_data_bytes();
-  net::ReliableQuicStream::OnCanWrite();
-  uint64_t queued_bytes_written = prev_queued_bytes - queued_data_bytes();
-  SignalQueuedBytesWritten(id(), queued_bytes_written);
-}
-
-}  // namespace cricket
diff --git a/p2p/quic/reliablequicstream.h b/p2p/quic/reliablequicstream.h
deleted file mode 100644
index a2d0b57..0000000
--- a/p2p/quic/reliablequicstream.h
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- *  Copyright 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_P2P_QUIC_RELIABLEQUICSTREAM_H_
-#define WEBRTC_P2P_QUIC_RELIABLEQUICSTREAM_H_
-
-#include "net/quic/reliable_quic_stream.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/sigslot.h"
-#include "webrtc/rtc_base/stream.h"
-
-namespace cricket {
-
-// Streams created by QuicSession.
-class ReliableQuicStream : public net::ReliableQuicStream,
-                           public sigslot::has_slots<> {
- public:
-  ReliableQuicStream(net::QuicStreamId id, net::QuicSession* session);
-
-  ~ReliableQuicStream() override;
-
-  // ReliableQuicStream overrides.
-  void OnDataAvailable() override;
-  void OnClose() override;
-  void OnCanWrite() override;
-
-  // Process decrypted data into encrypted QUIC packets, which get sent to the
-  // QuicPacketWriter. rtc::SR_BLOCK is returned if the operation blocks instead
-  // of writing, in which case the data is queued until OnCanWrite() is called.
-  // If |fin| == true, then this stream closes after sending data.
-  rtc::StreamResult Write(const char* data, size_t len, bool fin = false);
-  // Removes this stream from the QuicSession's stream map.
-  void Close();
-
-  // Called when decrypted data is ready to be read.
-  sigslot::signal3<net::QuicStreamId, const char*, size_t> SignalDataReceived;
-  // Called when the stream is closed.
-  sigslot::signal2<net::QuicStreamId, int> SignalClosed;
-  // Emits the number of queued bytes that were written by OnCanWrite(), after
-  // the stream was previously write blocked.
-  sigslot::signal2<net::QuicStreamId, uint64_t> SignalQueuedBytesWritten;
-
- private:
-  RTC_DISALLOW_COPY_AND_ASSIGN(ReliableQuicStream);
-};
-
-}  // namespace cricket
-
-#endif  // WEBRTC_P2P_QUIC_RELIABLEQUICSTREAM_H_
diff --git a/p2p/quic/reliablequicstream_unittest.cc b/p2p/quic/reliablequicstream_unittest.cc
deleted file mode 100644
index 4357bcd..0000000
--- a/p2p/quic/reliablequicstream_unittest.cc
+++ /dev/null
@@ -1,257 +0,0 @@
-/*
- *  Copyright 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/p2p/quic/reliablequicstream.h"
-
-#include <memory>
-#include <string>
-
-#include "net/base/ip_address_number.h"
-#include "net/quic/quic_connection.h"
-#include "net/quic/quic_protocol.h"
-#include "net/quic/quic_session.h"
-#include "webrtc/p2p/quic/quicconnectionhelper.h"
-#include "webrtc/rtc_base/buffer.h"
-#include "webrtc/rtc_base/gunit.h"
-#include "webrtc/rtc_base/sigslot.h"
-#include "webrtc/rtc_base/stream.h"
-
-using cricket::QuicConnectionHelper;
-using cricket::ReliableQuicStream;
-
-using net::IPAddress;
-using net::IPEndPoint;
-using net::PerPacketOptions;
-using net::Perspective;
-using net::QuicAckListenerInterface;
-using net::QuicConfig;
-using net::QuicConnection;
-using net::QuicConsumedData;
-using net::QuicCryptoStream;
-using net::QuicErrorCode;
-using net::QuicIOVector;
-using net::QuicPacketWriter;
-using net::QuicRstStreamErrorCode;
-using net::QuicSession;
-using net::QuicStreamId;
-using net::QuicStreamOffset;
-using net::SpdyPriority;
-
-using rtc::SR_SUCCESS;
-using rtc::SR_BLOCK;
-
-// Arbitrary number for a stream's write blocked priority.
-static const SpdyPriority kDefaultPriority = 3;
-static const net::QuicStreamId kStreamId = 5;
-
-// QuicSession that does not create streams and writes data from
-// ReliableQuicStream to a string.
-class MockQuicSession : public QuicSession {
- public:
-  MockQuicSession(QuicConnection* connection,
-                  const QuicConfig& config,
-                  std::string* write_buffer)
-      : QuicSession(connection, config), write_buffer_(write_buffer) {}
-
-  // Writes outgoing data from ReliableQuicStream to a string.
-  QuicConsumedData WritevData(
-      QuicStreamId id,
-      QuicIOVector iovector,
-      QuicStreamOffset offset,
-      bool fin,
-      QuicAckListenerInterface* ack_notifier_delegate) override {
-    if (!writable_) {
-      return QuicConsumedData(0, false);
-    }
-
-    const char* data = reinterpret_cast<const char*>(iovector.iov->iov_base);
-    size_t len = iovector.total_length;
-    write_buffer_->append(data, len);
-    return QuicConsumedData(len, false);
-  }
-
-  net::ReliableQuicStream* CreateIncomingDynamicStream(
-      QuicStreamId id) override {
-    return new ReliableQuicStream(kStreamId, this);
-  }
-
-  net::ReliableQuicStream* CreateOutgoingDynamicStream(
-      SpdyPriority priority) override {
-    return nullptr;
-  }
-
-  QuicCryptoStream* GetCryptoStream() override { return nullptr; }
-
-  // Called by ReliableQuicStream when they want to close stream.
-  void SendRstStream(QuicStreamId id,
-                     QuicRstStreamErrorCode error,
-                     QuicStreamOffset bytes_written) override {}
-
-  // Sets whether data is written to buffer, or else if this is write blocked.
-  void set_writable(bool writable) { writable_ = writable; }
-
-  // Tracks whether the stream is write blocked and its priority.
-  void register_write_blocked_stream(QuicStreamId stream_id,
-                                     SpdyPriority priority) {
-    write_blocked_streams()->RegisterStream(stream_id, priority);
-  }
-
- private:
-  // Stores written data from ReliableQuicStream.
-  std::string* write_buffer_;
-  // Whether data is written to write_buffer_.
-  bool writable_ = true;
-};
-
-// Packet writer that does nothing. This is required for QuicConnection but
-// isn't used for writing data.
-class DummyPacketWriter : public QuicPacketWriter {
- public:
-  DummyPacketWriter() {}
-
-  // QuicPacketWriter overrides.
-  net::WriteResult WritePacket(const char* buffer,
-                               size_t buf_len,
-                               const IPAddress& self_address,
-                               const IPEndPoint& peer_address,
-                               PerPacketOptions* options) override {
-    return net::WriteResult(net::WRITE_STATUS_ERROR, 0);
-  }
-
-  bool IsWriteBlockedDataBuffered() const override { return false; }
-
-  bool IsWriteBlocked() const override { return false; };
-
-  void SetWritable() override {}
-
-  net::QuicByteCount GetMaxPacketSize(
-      const net::IPEndPoint& peer_address) const override {
-    return 0;
-  }
-};
-
-class ReliableQuicStreamTest : public ::testing::Test,
-                               public sigslot::has_slots<> {
- public:
-  ReliableQuicStreamTest() {}
-
-  void CreateReliableQuicStream() {
-
-    // Arbitrary values for QuicConnection.
-    QuicConnectionHelper* quic_helper =
-        new QuicConnectionHelper(rtc::Thread::Current());
-    Perspective perspective = Perspective::IS_SERVER;
-    net::IPAddress ip(0, 0, 0, 0);
-
-    bool owns_writer = true;
-
-    QuicConnection* connection = new QuicConnection(
-        0, IPEndPoint(ip, 0), quic_helper, new DummyPacketWriter(), owns_writer,
-        perspective, net::QuicSupportedVersions());
-
-    session_.reset(
-        new MockQuicSession(connection, QuicConfig(), &write_buffer_));
-    stream_.reset(new ReliableQuicStream(kStreamId, session_.get()));
-    stream_->SignalDataReceived.connect(
-        this, &ReliableQuicStreamTest::OnDataReceived);
-    stream_->SignalClosed.connect(this, &ReliableQuicStreamTest::OnClosed);
-    stream_->SignalQueuedBytesWritten.connect(
-        this, &ReliableQuicStreamTest::OnQueuedBytesWritten);
-
-    session_->register_write_blocked_stream(stream_->id(), kDefaultPriority);
-  }
-
-  void OnDataReceived(QuicStreamId id, const char* data, size_t length) {
-    ASSERT_EQ(id, stream_->id());
-    read_buffer_.append(data, length);
-  }
-
-  void OnClosed(QuicStreamId id, int err) { closed_ = true; }
-
-  void OnQueuedBytesWritten(QuicStreamId id, uint64_t queued_bytes_written) {
-    queued_bytes_written_ = queued_bytes_written;
-  }
-
- protected:
-  std::unique_ptr<ReliableQuicStream> stream_;
-  std::unique_ptr<MockQuicSession> session_;
-
-  // Data written by the ReliableQuicStream.
-  std::string write_buffer_;
-  // Data read by the ReliableQuicStream.
-  std::string read_buffer_;
-  // Whether the ReliableQuicStream is closed.
-  bool closed_ = false;
-  // Bytes written by OnCanWrite().
-  uint64_t queued_bytes_written_;
-};
-
-// Write an entire string.
-TEST_F(ReliableQuicStreamTest, WriteDataWhole) {
-  CreateReliableQuicStream();
-  EXPECT_EQ(SR_SUCCESS, stream_->Write("Foo bar", 7));
-
-  EXPECT_EQ("Foo bar", write_buffer_);
-}
-
-// Write part of a string.
-TEST_F(ReliableQuicStreamTest, WriteDataPartial) {
-  CreateReliableQuicStream();
-  EXPECT_EQ(SR_SUCCESS, stream_->Write("Hello, World!", 8));
-  EXPECT_EQ("Hello, W", write_buffer_);
-}
-
-// Test that strings are buffered correctly.
-TEST_F(ReliableQuicStreamTest, BufferData) {
-  CreateReliableQuicStream();
-
-  session_->set_writable(false);
-  EXPECT_EQ(SR_BLOCK, stream_->Write("Foo bar", 7));
-
-  EXPECT_EQ(0ul, write_buffer_.size());
-  EXPECT_TRUE(stream_->HasBufferedData());
-
-  session_->set_writable(true);
-  stream_->OnCanWrite();
-  EXPECT_EQ(7ul, queued_bytes_written_);
-
-  EXPECT_FALSE(stream_->HasBufferedData());
-  EXPECT_EQ("Foo bar", write_buffer_);
-
-  EXPECT_EQ(SR_SUCCESS, stream_->Write("xyzzy", 5));
-  EXPECT_EQ("Foo barxyzzy", write_buffer_);
-}
-
-// Read an entire string.
-TEST_F(ReliableQuicStreamTest, ReadDataWhole) {
-  CreateReliableQuicStream();
-  net::QuicStreamFrame frame(kStreamId, false, 0, "Hello, World!");
-  stream_->OnStreamFrame(frame);
-
-  EXPECT_EQ("Hello, World!", read_buffer_);
-}
-
-// Read part of a string.
-TEST_F(ReliableQuicStreamTest, ReadDataPartial) {
-  CreateReliableQuicStream();
-  net::QuicStreamFrame frame(kStreamId, false, 0, "Hello, World!");
-  frame.frame_length = 5;
-  stream_->OnStreamFrame(frame);
-
-  EXPECT_EQ("Hello", read_buffer_);
-}
-
-// Test that closing the stream results in a callback.
-TEST_F(ReliableQuicStreamTest, CloseStream) {
-  CreateReliableQuicStream();
-  EXPECT_FALSE(closed_);
-  stream_->OnClose();
-  EXPECT_TRUE(closed_);
-}
diff --git a/p2p/stunprober/stunprober.cc b/p2p/stunprober/stunprober.cc
deleted file mode 100644
index 54c8b1c..0000000
--- a/p2p/stunprober/stunprober.cc
+++ /dev/null
@@ -1,590 +0,0 @@
-/*
- *  Copyright 2015 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 <map>
-#include <memory>
-#include <set>
-#include <string>
-
-#include "webrtc/p2p/base/packetsocketfactory.h"
-#include "webrtc/p2p/base/stun.h"
-#include "webrtc/p2p/stunprober/stunprober.h"
-#include "webrtc/rtc_base/asyncpacketsocket.h"
-#include "webrtc/rtc_base/asyncresolverinterface.h"
-#include "webrtc/rtc_base/bind.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/helpers.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/thread.h"
-#include "webrtc/rtc_base/timeutils.h"
-
-namespace stunprober {
-
-namespace {
-
-const int THREAD_WAKE_UP_INTERVAL_MS = 5;
-
-template <typename T>
-void IncrementCounterByAddress(std::map<T, int>* counter_per_ip, const T& ip) {
-  counter_per_ip->insert(std::make_pair(ip, 0)).first->second++;
-}
-
-}  // namespace
-
-// A requester tracks the requests and responses from a single socket to many
-// STUN servers
-class StunProber::Requester : public sigslot::has_slots<> {
- public:
-  // Each Request maps to a request and response.
-  struct Request {
-    // Actual time the STUN bind request was sent.
-    int64_t sent_time_ms = 0;
-    // Time the response was received.
-    int64_t received_time_ms = 0;
-
-    // Server reflexive address from STUN response for this given request.
-    rtc::SocketAddress srflx_addr;
-
-    rtc::IPAddress server_addr;
-
-    int64_t rtt() { return received_time_ms - sent_time_ms; }
-    void ProcessResponse(const char* buf, size_t buf_len);
-  };
-
-  // StunProber provides |server_ips| for Requester to probe. For shared
-  // socket mode, it'll be all the resolved IP addresses. For non-shared mode,
-  // it'll just be a single address.
-  Requester(StunProber* prober,
-            rtc::AsyncPacketSocket* socket,
-            const std::vector<rtc::SocketAddress>& server_ips);
-  virtual ~Requester();
-
-  // There is no callback for SendStunRequest as the underneath socket send is
-  // expected to be completed immediately. Otherwise, it'll skip this request
-  // and move to the next one.
-  void SendStunRequest();
-
-  void OnStunResponseReceived(rtc::AsyncPacketSocket* socket,
-                              const char* buf,
-                              size_t size,
-                              const rtc::SocketAddress& addr,
-                              const rtc::PacketTime& time);
-
-  const std::vector<Request*>& requests() { return requests_; }
-
-  // Whether this Requester has completed all requests.
-  bool Done() {
-    return static_cast<size_t>(num_request_sent_) == server_ips_.size();
-  }
-
- private:
-  Request* GetRequestByAddress(const rtc::IPAddress& ip);
-
-  StunProber* prober_;
-
-  // The socket for this session.
-  std::unique_ptr<rtc::AsyncPacketSocket> socket_;
-
-  // Temporary SocketAddress and buffer for RecvFrom.
-  rtc::SocketAddress addr_;
-  std::unique_ptr<rtc::ByteBufferWriter> response_packet_;
-
-  std::vector<Request*> requests_;
-  std::vector<rtc::SocketAddress> server_ips_;
-  int16_t num_request_sent_ = 0;
-  int16_t num_response_received_ = 0;
-
-  rtc::ThreadChecker& thread_checker_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(Requester);
-};
-
-StunProber::Requester::Requester(
-    StunProber* prober,
-    rtc::AsyncPacketSocket* socket,
-    const std::vector<rtc::SocketAddress>& server_ips)
-    : prober_(prober),
-      socket_(socket),
-      response_packet_(new rtc::ByteBufferWriter(nullptr, kMaxUdpBufferSize)),
-      server_ips_(server_ips),
-      thread_checker_(prober->thread_checker_) {
-  socket_->SignalReadPacket.connect(
-      this, &StunProber::Requester::OnStunResponseReceived);
-}
-
-StunProber::Requester::~Requester() {
-  if (socket_) {
-    socket_->Close();
-  }
-  for (auto req : requests_) {
-    if (req) {
-      delete req;
-    }
-  }
-}
-
-void StunProber::Requester::SendStunRequest() {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  requests_.push_back(new Request());
-  Request& request = *(requests_.back());
-  cricket::StunMessage message;
-
-  // Random transaction ID, STUN_BINDING_REQUEST
-  message.SetTransactionID(
-      rtc::CreateRandomString(cricket::kStunTransactionIdLength));
-  message.SetType(cricket::STUN_BINDING_REQUEST);
-
-  std::unique_ptr<rtc::ByteBufferWriter> request_packet(
-      new rtc::ByteBufferWriter(nullptr, kMaxUdpBufferSize));
-  if (!message.Write(request_packet.get())) {
-    prober_->ReportOnFinished(WRITE_FAILED);
-    return;
-  }
-
-  auto addr = server_ips_[num_request_sent_];
-  request.server_addr = addr.ipaddr();
-
-  // The write must succeed immediately. Otherwise, the calculating of the STUN
-  // request timing could become too complicated. Callback is ignored by passing
-  // empty AsyncCallback.
-  rtc::PacketOptions options;
-  int rv = socket_->SendTo(const_cast<char*>(request_packet->Data()),
-                           request_packet->Length(), addr, options);
-  if (rv < 0) {
-    prober_->ReportOnFinished(WRITE_FAILED);
-    return;
-  }
-
-  request.sent_time_ms = rtc::TimeMillis();
-
-  num_request_sent_++;
-  RTC_DCHECK(static_cast<size_t>(num_request_sent_) <= server_ips_.size());
-}
-
-void StunProber::Requester::Request::ProcessResponse(const char* buf,
-                                                     size_t buf_len) {
-  int64_t now = rtc::TimeMillis();
-  rtc::ByteBufferReader message(buf, buf_len);
-  cricket::StunMessage stun_response;
-  if (!stun_response.Read(&message)) {
-    // Invalid or incomplete STUN packet.
-    received_time_ms = 0;
-    return;
-  }
-
-  // Get external address of the socket.
-  const cricket::StunAddressAttribute* addr_attr =
-      stun_response.GetAddress(cricket::STUN_ATTR_MAPPED_ADDRESS);
-  if (addr_attr == nullptr) {
-    // Addresses not available to detect whether or not behind a NAT.
-    return;
-  }
-
-  if (addr_attr->family() != cricket::STUN_ADDRESS_IPV4 &&
-      addr_attr->family() != cricket::STUN_ADDRESS_IPV6) {
-    return;
-  }
-
-  received_time_ms = now;
-
-  srflx_addr = addr_attr->GetAddress();
-}
-
-void StunProber::Requester::OnStunResponseReceived(
-    rtc::AsyncPacketSocket* socket,
-    const char* buf,
-    size_t size,
-    const rtc::SocketAddress& addr,
-    const rtc::PacketTime& time) {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  RTC_DCHECK(socket_);
-  Request* request = GetRequestByAddress(addr.ipaddr());
-  if (!request) {
-    // Something is wrong, finish the test.
-    prober_->ReportOnFinished(GENERIC_FAILURE);
-    return;
-  }
-
-  num_response_received_++;
-  request->ProcessResponse(buf, size);
-}
-
-StunProber::Requester::Request* StunProber::Requester::GetRequestByAddress(
-    const rtc::IPAddress& ipaddr) {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  for (auto request : requests_) {
-    if (request->server_addr == ipaddr) {
-      return request;
-    }
-  }
-
-  return nullptr;
-}
-
-StunProber::StunProber(rtc::PacketSocketFactory* socket_factory,
-                       rtc::Thread* thread,
-                       const rtc::NetworkManager::NetworkList& networks)
-    : interval_ms_(0),
-      socket_factory_(socket_factory),
-      thread_(thread),
-      networks_(networks) {
-}
-
-StunProber::~StunProber() {
-  for (auto req : requesters_) {
-    if (req) {
-      delete req;
-    }
-  }
-  for (auto s : sockets_) {
-    if (s) {
-      delete s;
-    }
-  }
-}
-
-bool StunProber::Start(const std::vector<rtc::SocketAddress>& servers,
-                       bool shared_socket_mode,
-                       int interval_ms,
-                       int num_request_per_ip,
-                       int timeout_ms,
-                       const AsyncCallback callback) {
-  observer_adapter_.set_callback(callback);
-  return Prepare(servers, shared_socket_mode, interval_ms, num_request_per_ip,
-                 timeout_ms, &observer_adapter_);
-}
-
-bool StunProber::Prepare(const std::vector<rtc::SocketAddress>& servers,
-                         bool shared_socket_mode,
-                         int interval_ms,
-                         int num_request_per_ip,
-                         int timeout_ms,
-                         StunProber::Observer* observer) {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  interval_ms_ = interval_ms;
-  shared_socket_mode_ = shared_socket_mode;
-
-  requests_per_ip_ = num_request_per_ip;
-  if (requests_per_ip_ == 0 || servers.size() == 0) {
-    return false;
-  }
-
-  timeout_ms_ = timeout_ms;
-  servers_ = servers;
-  observer_ = observer;
-  // Remove addresses that are already resolved.
-  for (auto it = servers_.begin(); it != servers_.end();) {
-    if (it->ipaddr().family() != AF_UNSPEC) {
-      all_servers_addrs_.push_back(*it);
-      it = servers_.erase(it);
-    } else {
-      ++it;
-    }
-  }
-  if (servers_.empty()) {
-    CreateSockets();
-    return true;
-  }
-  return ResolveServerName(servers_.back());
-}
-
-bool StunProber::Start(StunProber::Observer* observer) {
-  observer_ = observer;
-  if (total_ready_sockets_ != total_socket_required()) {
-    return false;
-  }
-  MaybeScheduleStunRequests();
-  return true;
-}
-
-bool StunProber::ResolveServerName(const rtc::SocketAddress& addr) {
-  rtc::AsyncResolverInterface* resolver =
-      socket_factory_->CreateAsyncResolver();
-  if (!resolver) {
-    return false;
-  }
-  resolver->SignalDone.connect(this, &StunProber::OnServerResolved);
-  resolver->Start(addr);
-  return true;
-}
-
-void StunProber::OnSocketReady(rtc::AsyncPacketSocket* socket,
-                               const rtc::SocketAddress& addr) {
-  total_ready_sockets_++;
-  if (total_ready_sockets_ == total_socket_required()) {
-    ReportOnPrepared(SUCCESS);
-  }
-}
-
-void StunProber::OnServerResolved(rtc::AsyncResolverInterface* resolver) {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-
-  if (resolver->GetError() == 0) {
-    rtc::SocketAddress addr(resolver->address().ipaddr(),
-                            resolver->address().port());
-    all_servers_addrs_.push_back(addr);
-  }
-
-  // Deletion of AsyncResolverInterface can't be done in OnResolveResult which
-  // handles SignalDone.
-  invoker_.AsyncInvoke<void>(
-      RTC_FROM_HERE, thread_,
-      rtc::Bind(&rtc::AsyncResolverInterface::Destroy, resolver, false));
-  servers_.pop_back();
-
-  if (servers_.size()) {
-    if (!ResolveServerName(servers_.back())) {
-      ReportOnPrepared(RESOLVE_FAILED);
-    }
-    return;
-  }
-
-  if (all_servers_addrs_.size() == 0) {
-    ReportOnPrepared(RESOLVE_FAILED);
-    return;
-  }
-
-  CreateSockets();
-}
-
-void StunProber::CreateSockets() {
-  // Dedupe.
-  std::set<rtc::SocketAddress> addrs(all_servers_addrs_.begin(),
-                                     all_servers_addrs_.end());
-  all_servers_addrs_.assign(addrs.begin(), addrs.end());
-
-  // Prepare all the sockets beforehand. All of them will bind to "any" address.
-  while (sockets_.size() < total_socket_required()) {
-    std::unique_ptr<rtc::AsyncPacketSocket> socket(
-        socket_factory_->CreateUdpSocket(rtc::SocketAddress(INADDR_ANY, 0), 0,
-                                         0));
-    if (!socket) {
-      ReportOnPrepared(GENERIC_FAILURE);
-      return;
-    }
-    // Chrome and WebRTC behave differently in terms of the state of a socket
-    // once returned from PacketSocketFactory::CreateUdpSocket.
-    if (socket->GetState() == rtc::AsyncPacketSocket::STATE_BINDING) {
-      socket->SignalAddressReady.connect(this, &StunProber::OnSocketReady);
-    } else {
-      OnSocketReady(socket.get(), rtc::SocketAddress(INADDR_ANY, 0));
-    }
-    sockets_.push_back(socket.release());
-  }
-}
-
-StunProber::Requester* StunProber::CreateRequester() {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  if (!sockets_.size()) {
-    return nullptr;
-  }
-  StunProber::Requester* requester;
-  if (shared_socket_mode_) {
-    requester = new Requester(this, sockets_.back(), all_servers_addrs_);
-  } else {
-    std::vector<rtc::SocketAddress> server_ip;
-    server_ip.push_back(
-        all_servers_addrs_[(num_request_sent_ % all_servers_addrs_.size())]);
-    requester = new Requester(this, sockets_.back(), server_ip);
-  }
-
-  sockets_.pop_back();
-  return requester;
-}
-
-bool StunProber::SendNextRequest() {
-  if (!current_requester_ || current_requester_->Done()) {
-    current_requester_ = CreateRequester();
-    requesters_.push_back(current_requester_);
-  }
-  if (!current_requester_) {
-    return false;
-  }
-  current_requester_->SendStunRequest();
-  num_request_sent_++;
-  return true;
-}
-
-bool StunProber::should_send_next_request(int64_t now) {
-  if (interval_ms_ < THREAD_WAKE_UP_INTERVAL_MS) {
-    return now >= next_request_time_ms_;
-  } else {
-    return (now + (THREAD_WAKE_UP_INTERVAL_MS / 2)) >= next_request_time_ms_;
-  }
-}
-
-int StunProber::get_wake_up_interval_ms() {
-  if (interval_ms_ < THREAD_WAKE_UP_INTERVAL_MS) {
-    return 1;
-  } else {
-    return THREAD_WAKE_UP_INTERVAL_MS;
-  }
-}
-
-void StunProber::MaybeScheduleStunRequests() {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  int64_t now = rtc::TimeMillis();
-
-  if (Done()) {
-    invoker_.AsyncInvokeDelayed<void>(
-        RTC_FROM_HERE, thread_,
-        rtc::Bind(&StunProber::ReportOnFinished, this, SUCCESS), timeout_ms_);
-    return;
-  }
-  if (should_send_next_request(now)) {
-    if (!SendNextRequest()) {
-      ReportOnFinished(GENERIC_FAILURE);
-      return;
-    }
-    next_request_time_ms_ = now + interval_ms_;
-  }
-  invoker_.AsyncInvokeDelayed<void>(
-      RTC_FROM_HERE, thread_,
-      rtc::Bind(&StunProber::MaybeScheduleStunRequests, this),
-      get_wake_up_interval_ms());
-}
-
-bool StunProber::GetStats(StunProber::Stats* prob_stats) const {
-  // No need to be on the same thread.
-  if (!prob_stats) {
-    return false;
-  }
-
-  StunProber::Stats stats;
-
-  int rtt_sum = 0;
-  int64_t first_sent_time = 0;
-  int64_t last_sent_time = 0;
-  NatType nat_type = NATTYPE_INVALID;
-
-  // Track of how many srflx IP that we have seen.
-  std::set<rtc::IPAddress> srflx_ips;
-
-  // If we're not receiving any response on a given IP, all requests sent to
-  // that IP should be ignored as this could just be an DNS error.
-  std::map<rtc::IPAddress, int> num_response_per_server;
-  std::map<rtc::IPAddress, int> num_request_per_server;
-
-  for (auto* requester : requesters_) {
-    std::map<rtc::SocketAddress, int> num_response_per_srflx_addr;
-    for (auto request : requester->requests()) {
-      if (request->sent_time_ms <= 0) {
-        continue;
-      }
-
-      ++stats.raw_num_request_sent;
-      IncrementCounterByAddress(&num_request_per_server, request->server_addr);
-
-      if (!first_sent_time) {
-        first_sent_time = request->sent_time_ms;
-      }
-      last_sent_time = request->sent_time_ms;
-
-      if (request->received_time_ms < request->sent_time_ms) {
-        continue;
-      }
-
-      IncrementCounterByAddress(&num_response_per_server, request->server_addr);
-      IncrementCounterByAddress(&num_response_per_srflx_addr,
-                                request->srflx_addr);
-      rtt_sum += request->rtt();
-      stats.srflx_addrs.insert(request->srflx_addr.ToString());
-      srflx_ips.insert(request->srflx_addr.ipaddr());
-    }
-
-    // If we're using shared mode and seeing >1 srflx addresses for a single
-    // requester, it's symmetric NAT.
-    if (shared_socket_mode_ && num_response_per_srflx_addr.size() > 1) {
-      nat_type = NATTYPE_SYMMETRIC;
-    }
-  }
-
-  // We're probably not behind a regular NAT. We have more than 1 distinct
-  // server reflexive IPs.
-  if (srflx_ips.size() > 1) {
-    return false;
-  }
-
-  int num_sent = 0;
-  int num_received = 0;
-  int num_server_ip_with_response = 0;
-
-  for (const auto& kv : num_response_per_server) {
-    RTC_DCHECK_GT(kv.second, 0);
-    num_server_ip_with_response++;
-    num_received += kv.second;
-    num_sent += num_request_per_server[kv.first];
-  }
-
-  // Shared mode is only true if we use the shared socket and there are more
-  // than 1 responding servers.
-  stats.shared_socket_mode =
-      shared_socket_mode_ && (num_server_ip_with_response > 1);
-
-  if (stats.shared_socket_mode && nat_type == NATTYPE_INVALID) {
-    nat_type = NATTYPE_NON_SYMMETRIC;
-  }
-
-  // If we could find a local IP matching srflx, we're not behind a NAT.
-  rtc::SocketAddress srflx_addr;
-  if (stats.srflx_addrs.size() &&
-      !srflx_addr.FromString(*(stats.srflx_addrs.begin()))) {
-    return false;
-  }
-  for (const auto& net : networks_) {
-    if (srflx_addr.ipaddr() == net->GetBestIP()) {
-      nat_type = stunprober::NATTYPE_NONE;
-      stats.host_ip = net->GetBestIP().ToString();
-      break;
-    }
-  }
-
-  // Finally, we know we're behind a NAT but can't determine which type it is.
-  if (nat_type == NATTYPE_INVALID) {
-    nat_type = NATTYPE_UNKNOWN;
-  }
-
-  stats.nat_type = nat_type;
-  stats.num_request_sent = num_sent;
-  stats.num_response_received = num_received;
-  stats.target_request_interval_ns = interval_ms_ * 1000;
-
-  if (num_sent) {
-    stats.success_percent = static_cast<int>(100 * num_received / num_sent);
-  }
-
-  if (stats.raw_num_request_sent > 1) {
-    stats.actual_request_interval_ns =
-        (1000 * (last_sent_time - first_sent_time)) /
-        (stats.raw_num_request_sent - 1);
-  }
-
-  if (num_received) {
-    stats.average_rtt_ms = static_cast<int>((rtt_sum / num_received));
-  }
-
-  *prob_stats = stats;
-  return true;
-}
-
-void StunProber::ReportOnPrepared(StunProber::Status status) {
-  if (observer_) {
-    observer_->OnPrepared(this, status);
-  }
-}
-
-void StunProber::ReportOnFinished(StunProber::Status status) {
-  if (observer_) {
-    observer_->OnFinished(this, status);
-  }
-}
-
-}  // namespace stunprober
diff --git a/p2p/stunprober/stunprober.h b/p2p/stunprober/stunprober.h
deleted file mode 100644
index b32c8b2..0000000
--- a/p2p/stunprober/stunprober.h
+++ /dev/null
@@ -1,256 +0,0 @@
-/*
- *  Copyright 2015 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_P2P_STUNPROBER_STUNPROBER_H_
-#define WEBRTC_P2P_STUNPROBER_STUNPROBER_H_
-
-#include <set>
-#include <string>
-#include <vector>
-
-#include "webrtc/rtc_base/asyncinvoker.h"
-#include "webrtc/rtc_base/basictypes.h"
-#include "webrtc/rtc_base/bytebuffer.h"
-#include "webrtc/rtc_base/callback.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/ipaddress.h"
-#include "webrtc/rtc_base/network.h"
-#include "webrtc/rtc_base/socketaddress.h"
-#include "webrtc/rtc_base/thread.h"
-#include "webrtc/rtc_base/thread_checker.h"
-#include "webrtc/typedefs.h"
-
-namespace rtc {
-class AsyncPacketSocket;
-class PacketSocketFactory;
-class Thread;
-class NetworkManager;
-class AsyncResolverInterface;
-}  // namespace rtc
-
-namespace stunprober {
-
-class StunProber;
-
-static const int kMaxUdpBufferSize = 1200;
-
-typedef rtc::Callback2<void, StunProber*, int> AsyncCallback;
-
-enum NatType {
-  NATTYPE_INVALID,
-  NATTYPE_NONE,          // Not behind a NAT.
-  NATTYPE_UNKNOWN,       // Behind a NAT but type can't be determine.
-  NATTYPE_SYMMETRIC,     // Behind a symmetric NAT.
-  NATTYPE_NON_SYMMETRIC  // Behind a non-symmetric NAT.
-};
-
-class StunProber : public sigslot::has_slots<> {
- public:
-  enum Status {       // Used in UMA_HISTOGRAM_ENUMERATION.
-    SUCCESS,          // Successfully received bytes from the server.
-    GENERIC_FAILURE,  // Generic failure.
-    RESOLVE_FAILED,   // Host resolution failed.
-    WRITE_FAILED,     // Sending a message to the server failed.
-    READ_FAILED,      // Reading the reply from the server failed.
-  };
-
-  class Observer {
-   public:
-    virtual ~Observer() = default;
-    virtual void OnPrepared(StunProber* prober, StunProber::Status status) = 0;
-    virtual void OnFinished(StunProber* prober, StunProber::Status status) = 0;
-  };
-
-  struct Stats {
-    Stats() {}
-
-    // |raw_num_request_sent| is the total number of requests
-    // sent. |num_request_sent| is the count of requests against a server where
-    // we see at least one response. |num_request_sent| is designed to protect
-    // against DNS resolution failure or the STUN server is not responsive
-    // which could skew the result.
-    int raw_num_request_sent = 0;
-    int num_request_sent = 0;
-
-    int num_response_received = 0;
-    NatType nat_type = NATTYPE_INVALID;
-    int average_rtt_ms = -1;
-    int success_percent = 0;
-    int target_request_interval_ns = 0;
-    int actual_request_interval_ns = 0;
-
-    // Also report whether this trial can't be considered truly as shared
-    // mode. Share mode only makes sense when we have multiple IP resolved and
-    // successfully probed.
-    bool shared_socket_mode = false;
-
-    std::string host_ip;
-
-    // If the srflx_addrs has more than 1 element, the NAT is symmetric.
-    std::set<std::string> srflx_addrs;
-  };
-
-  StunProber(rtc::PacketSocketFactory* socket_factory,
-             rtc::Thread* thread,
-             const rtc::NetworkManager::NetworkList& networks);
-  virtual ~StunProber();
-
-  // Begin performing the probe test against the |servers|. If
-  // |shared_socket_mode| is false, each request will be done with a new socket.
-  // Otherwise, a unique socket will be used for a single round of requests
-  // against all resolved IPs. No single socket will be used against a given IP
-  // more than once.  The interval of requests will be as close to the requested
-  // inter-probe interval |stun_ta_interval_ms| as possible. After sending out
-  // the last scheduled request, the probe will wait |timeout_ms| for request
-  // responses and then call |finish_callback|.  |requests_per_ip| indicates how
-  // many requests should be tried for each resolved IP address. In shared mode,
-  // (the number of sockets to be created) equals to |requests_per_ip|. In
-  // non-shared mode, (the number of sockets) equals to requests_per_ip * (the
-  // number of resolved IP addresses). TODO(guoweis): Remove this once
-  // everything moved to Prepare() and Run().
-  bool Start(const std::vector<rtc::SocketAddress>& servers,
-             bool shared_socket_mode,
-             int stun_ta_interval_ms,
-             int requests_per_ip,
-             int timeout_ms,
-             const AsyncCallback finish_callback);
-
-  // TODO(guoweis): The combination of Prepare() and Run() are equivalent to the
-  // Start() above. Remove Start() once everything is migrated.
-  bool Prepare(const std::vector<rtc::SocketAddress>& servers,
-               bool shared_socket_mode,
-               int stun_ta_interval_ms,
-               int requests_per_ip,
-               int timeout_ms,
-               StunProber::Observer* observer);
-
-  // Start to send out the STUN probes.
-  bool Start(StunProber::Observer* observer);
-
-  // Method to retrieve the Stats once |finish_callback| is invoked. Returning
-  // false when the result is inconclusive, for example, whether it's behind a
-  // NAT or not.
-  bool GetStats(Stats* stats) const;
-
-  int estimated_execution_time() {
-    return static_cast<int>(requests_per_ip_ * all_servers_addrs_.size() *
-                            interval_ms_);
-  }
-
- private:
-  // A requester tracks the requests and responses from a single socket to many
-  // STUN servers.
-  class Requester;
-
-  // TODO(guoweis): Remove this once all dependencies move away from
-  // AsyncCallback.
-  class ObserverAdapter : public Observer {
-   public:
-    void set_callback(AsyncCallback callback) { callback_ = callback; }
-    void OnPrepared(StunProber* stunprober, Status status) {
-      if (status == SUCCESS) {
-        stunprober->Start(this);
-      } else {
-        callback_(stunprober, status);
-      }
-    }
-    void OnFinished(StunProber* stunprober, Status status) {
-      callback_(stunprober, status);
-    }
-
-   private:
-    AsyncCallback callback_;
-  };
-
-  bool ResolveServerName(const rtc::SocketAddress& addr);
-  void OnServerResolved(rtc::AsyncResolverInterface* resolver);
-
-  void OnSocketReady(rtc::AsyncPacketSocket* socket,
-                     const rtc::SocketAddress& addr);
-
-  void CreateSockets();
-
-  bool Done() {
-    return num_request_sent_ >= requests_per_ip_ * all_servers_addrs_.size();
-  }
-
-  size_t total_socket_required() {
-    return (shared_socket_mode_ ? 1 : all_servers_addrs_.size()) *
-           requests_per_ip_;
-  }
-
-  bool should_send_next_request(int64_t now);
-  int get_wake_up_interval_ms();
-
-  bool SendNextRequest();
-
-  // Will be invoked in 1ms intervals and schedule the next request from the
-  // |current_requester_| if the time has passed for another request.
-  void MaybeScheduleStunRequests();
-
-  void ReportOnPrepared(StunProber::Status status);
-  void ReportOnFinished(StunProber::Status status);
-
-  Requester* CreateRequester();
-
-  Requester* current_requester_ = nullptr;
-
-  // The time when the next request should go out.
-  int64_t next_request_time_ms_ = 0;
-
-  // Total requests sent so far.
-  uint32_t num_request_sent_ = 0;
-
-  bool shared_socket_mode_ = false;
-
-  // How many requests should be done against each resolved IP.
-  uint32_t requests_per_ip_ = 0;
-
-  // Milliseconds to pause between each STUN request.
-  int interval_ms_;
-
-  // Timeout period after the last request is sent.
-  int timeout_ms_;
-
-  // STUN server name to be resolved.
-  std::vector<rtc::SocketAddress> servers_;
-
-  // Weak references.
-  rtc::PacketSocketFactory* socket_factory_;
-  rtc::Thread* thread_;
-
-  // Accumulate all resolved addresses.
-  std::vector<rtc::SocketAddress> all_servers_addrs_;
-
-  // The set of STUN probe sockets and their state.
-  std::vector<Requester*> requesters_;
-
-  rtc::ThreadChecker thread_checker_;
-
-  // Temporary storage for created sockets.
-  std::vector<rtc::AsyncPacketSocket*> sockets_;
-  // This tracks how many of the sockets are ready.
-  size_t total_ready_sockets_ = 0;
-
-  rtc::AsyncInvoker invoker_;
-
-  Observer* observer_ = nullptr;
-  // TODO(guoweis): Remove this once all dependencies move away from
-  // AsyncCallback.
-  ObserverAdapter observer_adapter_;
-
-  rtc::NetworkManager::NetworkList networks_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(StunProber);
-};
-
-}  // namespace stunprober
-
-#endif  // WEBRTC_P2P_STUNPROBER_STUNPROBER_H_
diff --git a/p2p/stunprober/stunprober_unittest.cc b/p2p/stunprober/stunprober_unittest.cc
deleted file mode 100644
index 2252e61..0000000
--- a/p2p/stunprober/stunprober_unittest.cc
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
- *  Copyright 2015 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 <stdint.h>
-
-#include <memory>
-
-#include "webrtc/p2p/base/basicpacketsocketfactory.h"
-#include "webrtc/p2p/base/teststunserver.h"
-#include "webrtc/p2p/stunprober/stunprober.h"
-#include "webrtc/rtc_base/asyncresolverinterface.h"
-#include "webrtc/rtc_base/bind.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/gunit.h"
-#include "webrtc/rtc_base/ssladapter.h"
-#include "webrtc/rtc_base/virtualsocketserver.h"
-
-using stunprober::StunProber;
-using stunprober::AsyncCallback;
-
-namespace stunprober {
-
-namespace {
-
-const rtc::SocketAddress kLocalAddr("192.168.0.1", 0);
-const rtc::SocketAddress kStunAddr1("1.1.1.1", 3478);
-const rtc::SocketAddress kStunAddr2("1.1.1.2", 3478);
-const rtc::SocketAddress kFailedStunAddr("1.1.1.3", 3478);
-const rtc::SocketAddress kStunMappedAddr("77.77.77.77", 0);
-
-}  // namespace
-
-class StunProberTest : public testing::Test {
- public:
-  StunProberTest()
-      : ss_(new rtc::VirtualSocketServer()),
-        main_(ss_.get()),
-        result_(StunProber::SUCCESS),
-        stun_server_1_(cricket::TestStunServer::Create(rtc::Thread::Current(),
-                                                       kStunAddr1)),
-        stun_server_2_(cricket::TestStunServer::Create(rtc::Thread::Current(),
-                                                       kStunAddr2)) {
-    stun_server_1_->set_fake_stun_addr(kStunMappedAddr);
-    stun_server_2_->set_fake_stun_addr(kStunMappedAddr);
-    rtc::InitializeSSL();
-  }
-
-  void set_expected_result(int result) { result_ = result; }
-
-  void StartProbing(rtc::PacketSocketFactory* socket_factory,
-                    const std::vector<rtc::SocketAddress>& addrs,
-                    const rtc::NetworkManager::NetworkList& networks,
-                    bool shared_socket,
-                    uint16_t interval,
-                    uint16_t pings_per_ip) {
-    prober.reset(
-        new StunProber(socket_factory, rtc::Thread::Current(), networks));
-    prober->Start(addrs, shared_socket, interval, pings_per_ip,
-                  100 /* timeout_ms */, [this](StunProber* prober, int result) {
-                    this->StopCallback(prober, result);
-                  });
-  }
-
-  void RunProber(bool shared_mode) {
-    const int pings_per_ip = 3;
-    std::vector<rtc::SocketAddress> addrs;
-    addrs.push_back(kStunAddr1);
-    addrs.push_back(kStunAddr2);
-    // Add a non-existing server. This shouldn't pollute the result.
-    addrs.push_back(kFailedStunAddr);
-
-    rtc::Network ipv4_network1("test_eth0", "Test Network Adapter 1",
-                               rtc::IPAddress(0x12345600U), 24);
-    ipv4_network1.AddIP(rtc::IPAddress(0x12345678));
-    rtc::NetworkManager::NetworkList networks;
-    networks.push_back(&ipv4_network1);
-
-    std::unique_ptr<rtc::BasicPacketSocketFactory> socket_factory(
-        new rtc::BasicPacketSocketFactory());
-
-    // Set up the expected results for verification.
-    std::set<std::string> srflx_addresses;
-    srflx_addresses.insert(kStunMappedAddr.ToString());
-    const uint32_t total_pings_tried =
-        static_cast<uint32_t>(pings_per_ip * addrs.size());
-
-    // The reported total_pings should not count for pings sent to the
-    // kFailedStunAddr.
-    const uint32_t total_pings_reported = total_pings_tried - pings_per_ip;
-
-    StartProbing(socket_factory.get(), addrs, networks, shared_mode, 3,
-                 pings_per_ip);
-
-    WAIT(stopped_, 1000);
-
-    StunProber::Stats stats;
-    EXPECT_TRUE(prober->GetStats(&stats));
-    EXPECT_EQ(stats.success_percent, 100);
-    EXPECT_TRUE(stats.nat_type > stunprober::NATTYPE_NONE);
-    EXPECT_EQ(stats.srflx_addrs, srflx_addresses);
-    EXPECT_EQ(static_cast<uint32_t>(stats.num_request_sent),
-              total_pings_reported);
-    EXPECT_EQ(static_cast<uint32_t>(stats.num_response_received),
-              total_pings_reported);
-  }
-
- private:
-  void StopCallback(StunProber* prober, int result) {
-    EXPECT_EQ(result, result_);
-    stopped_ = true;
-  }
-
-  std::unique_ptr<rtc::VirtualSocketServer> ss_;
-  rtc::AutoSocketServerThread main_;
-  std::unique_ptr<StunProber> prober;
-  int result_ = 0;
-  bool stopped_ = false;
-  std::unique_ptr<cricket::TestStunServer> stun_server_1_;
-  std::unique_ptr<cricket::TestStunServer> stun_server_2_;
-};
-
-TEST_F(StunProberTest, NonSharedMode) {
-  RunProber(false);
-}
-
-TEST_F(StunProberTest, SharedMode) {
-  RunProber(true);
-}
-
-}  // namespace stunprober
diff --git a/pc/BUILD.gn b/pc/BUILD.gn
deleted file mode 100644
index 09c58ab..0000000
--- a/pc/BUILD.gn
+++ /dev/null
@@ -1,469 +0,0 @@
-# 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.
-
-import("../webrtc.gni")
-if (is_android) {
-  import("//build/config/android/config.gni")
-  import("//build/config/android/rules.gni")
-}
-
-group("pc") {
-  public_deps = [
-    ":rtc_pc",
-  ]
-}
-
-config("rtc_pc_config") {
-  defines = []
-  if (rtc_enable_sctp) {
-    defines += [ "HAVE_SCTP" ]
-  }
-}
-
-rtc_static_library("rtc_pc_base") {
-  defines = []
-  sources = [
-    "audiomonitor.cc",
-    "audiomonitor.h",
-    "bundlefilter.cc",
-    "bundlefilter.h",
-    "channel.cc",
-    "channel.h",
-    "channelmanager.cc",
-    "channelmanager.h",
-    "currentspeakermonitor.cc",
-    "currentspeakermonitor.h",
-    "externalhmac.cc",
-    "externalhmac.h",
-    "mediamonitor.cc",
-    "mediamonitor.h",
-    "mediasession.cc",
-    "mediasession.h",
-    "rtcpmuxfilter.cc",
-    "rtcpmuxfilter.h",
-    "rtptransport.cc",
-    "rtptransport.h",
-    "rtptransportinternal.h",
-    "srtpfilter.cc",
-    "srtpfilter.h",
-    "srtpsession.cc",
-    "srtpsession.h",
-    "srtptransport.cc",
-    "srtptransport.h",
-    "voicechannel.h",
-  ]
-
-  deps = [
-    "..:webrtc_common",
-    "../api:call_api",
-    "../api:libjingle_peerconnection_api",
-    "../api:optional",
-    "../api:ortc_api",
-    "../media:rtc_data",
-    "../media:rtc_h264_profile_id",
-    "../media:rtc_media_base",
-    "../p2p:rtc_p2p",
-    "../rtc_base:rtc_base",
-    "../rtc_base:rtc_task_queue",
-  ]
-
-  if (rtc_build_libsrtp) {
-    deps += [ "//third_party/libsrtp" ]
-  }
-
-  public_configs = [ ":rtc_pc_config" ]
-
-  if (!build_with_chromium && is_clang) {
-    # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-    suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-  }
-}
-
-rtc_source_set("rtc_pc") {
-  public_deps = [
-    ":rtc_pc_base",
-  ]
-
-  deps = [
-    "../media:rtc_audio_video",
-  ]
-}
-
-config("libjingle_peerconnection_warnings_config") {
-  # GN orders flags on a target before flags from configs. The default config
-  # adds these flags so to cancel them out they need to come from a config and
-  # cannot be on the target directly.
-  if (!is_win && !is_clang) {
-    cflags = [ "-Wno-maybe-uninitialized" ]  # Only exists for GCC.
-  }
-}
-
-rtc_static_library("peerconnection") {
-  cflags = []
-  sources = [
-    "audiotrack.cc",
-    "audiotrack.h",
-    "datachannel.cc",
-    "datachannel.h",
-    "dtmfsender.cc",
-    "dtmfsender.h",
-    "iceserverparsing.cc",
-    "iceserverparsing.h",
-    "jsepicecandidate.cc",
-    "jsepsessiondescription.cc",
-    "localaudiosource.cc",
-    "localaudiosource.h",
-    "mediastream.cc",
-    "mediastream.h",
-    "mediastreamobserver.cc",
-    "mediastreamobserver.h",
-    "mediastreamtrack.h",
-    "peerconnection.cc",
-    "peerconnection.h",
-    "peerconnectionfactory.cc",
-    "peerconnectionfactory.h",
-    "remoteaudiosource.cc",
-    "remoteaudiosource.h",
-    "rtcstatscollector.cc",
-    "rtcstatscollector.h",
-    "rtpreceiver.cc",
-    "rtpreceiver.h",
-    "rtpsender.cc",
-    "rtpsender.h",
-    "sctputils.cc",
-    "sctputils.h",
-    "statscollector.cc",
-    "statscollector.h",
-    "streamcollection.h",
-    "trackmediainfomap.cc",
-    "trackmediainfomap.h",
-    "videocapturertracksource.cc",
-    "videocapturertracksource.h",
-    "videotrack.cc",
-    "videotrack.h",
-    "videotracksource.cc",
-    "videotracksource.h",
-    "webrtcsdp.cc",
-    "webrtcsdp.h",
-    "webrtcsession.cc",
-    "webrtcsession.h",
-    "webrtcsessiondescriptionfactory.cc",
-    "webrtcsessiondescriptionfactory.h",
-  ]
-
-  configs += [ ":libjingle_peerconnection_warnings_config" ]
-
-  if (!build_with_chromium && is_clang) {
-    # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-    suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-  }
-
-  deps = [
-    ":rtc_pc_base",
-    "..:webrtc_common",
-    "../api:call_api",
-    "../api:optional",
-    "../api:rtc_stats_api",
-    "../api/video_codecs:video_codecs_api",
-    "../call:call_interfaces",
-    "../logging:rtc_event_log_api",
-    "../media:rtc_data",
-    "../media:rtc_media_base",
-    "../p2p:rtc_p2p",
-    "../rtc_base:rtc_base",
-    "../rtc_base:rtc_base_approved",
-    "../stats",
-    "../system_wrappers:system_wrappers",
-  ]
-
-  public_deps = [
-    "../api:libjingle_peerconnection_api",
-  ]
-}
-
-# This target implements CreatePeerConnectionFactory methods that will create a
-# PeerConnection will full functionality (audio, video and data). Applications
-# that wish to reduce their binary size by ommitting functionality they don't
-# need should use CreateModularCreatePeerConnectionFactory instead, using the
-# "peerconnection" build target and other targets specific to their
-# requrements. See comment in peerconnectionfactoryinterface.h.
-rtc_static_library("create_pc_factory") {
-  sources = [
-    "createpeerconnectionfactory.cc",
-  ]
-
-  deps = [
-    "../api:audio_mixer_api",
-    "../api:libjingle_peerconnection_api",
-    "../api/audio_codecs:audio_codecs_api",
-    "../api/audio_codecs:builtin_audio_decoder_factory",
-    "../api/audio_codecs:builtin_audio_encoder_factory",
-    "../call",
-    "../call:call_interfaces",
-    "../logging:rtc_event_log_api",
-    "../media:rtc_audio_video",
-    "../modules/audio_device:audio_device",
-    "../modules/audio_processing:audio_processing",
-    "../rtc_base:rtc_base",
-    "../rtc_base:rtc_base_approved",
-  ]
-
-  configs += [ ":libjingle_peerconnection_warnings_config" ]
-
-  if (!build_with_chromium && is_clang) {
-    # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-    suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-  }
-}
-
-rtc_source_set("libjingle_peerconnection") {
-  public_deps = [
-    ":create_pc_factory",
-    ":peerconnection",
-    "../api:libjingle_peerconnection_api",
-  ]
-
-  if (rtc_use_quic) {
-    sources += [
-      "quicdatachannel.cc",
-      "quicdatachannel.h",
-      "quicdatatransport.cc",
-      "quicdatatransport.h",
-    ]
-    deps += [ "//third_party/libquic" ]
-    public_deps = [
-      "//third_party/libquic",
-    ]
-  }
-}
-
-if (rtc_include_tests) {
-  config("rtc_pc_unittests_config") {
-    # GN orders flags on a target before flags from configs. The default config
-    # adds -Wall, and this flag have to be after -Wall -- so they need to
-    # come from a config and can't be on the target directly.
-    if (!is_win && !is_clang) {
-      cflags = [ "-Wno-maybe-uninitialized" ]  # Only exists for GCC.
-    }
-  }
-
-  rtc_test("rtc_pc_unittests") {
-    testonly = true
-
-    sources = [
-      "bundlefilter_unittest.cc",
-      "channel_unittest.cc",
-      "channelmanager_unittest.cc",
-      "currentspeakermonitor_unittest.cc",
-      "mediasession_unittest.cc",
-      "rtcpmuxfilter_unittest.cc",
-      "rtptransport_unittest.cc",
-      "rtptransporttestutil.h",
-      "srtpfilter_unittest.cc",
-      "srtpsession_unittest.cc",
-      "srtptestutil.h",
-      "srtptransport_unittest.cc",
-    ]
-
-    include_dirs = [ "//third_party/libsrtp/srtp" ]
-
-    configs += [ ":rtc_pc_unittests_config" ]
-
-    if (!build_with_chromium && is_clang) {
-      # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-    }
-
-    if (is_win) {
-      libs = [ "strmiids.lib" ]
-    }
-
-    deps = [
-      ":libjingle_peerconnection",
-      ":rtc_pc",
-      "../api:array_view",
-      "../logging:rtc_event_log_api",
-      "../media:rtc_media_base",
-      "../media:rtc_media_tests_utils",
-      "../p2p:p2p_test_utils",
-      "../p2p:rtc_p2p",
-      "../rtc_base:rtc_base",
-      "../rtc_base:rtc_base_approved",
-      "../rtc_base:rtc_base_tests_main",
-      "../rtc_base:rtc_base_tests_utils",
-      "../system_wrappers:metrics_default",
-      "../test:test_support",
-    ]
-
-    if (rtc_build_libsrtp) {
-      deps += [ "//third_party/libsrtp" ]
-    }
-
-    if (is_android) {
-      deps += [ "//testing/android/native_test:native_test_support" ]
-    }
-  }
-
-  rtc_source_set("pc_test_utils") {
-    testonly = true
-    sources = [
-      "test/fakeaudiocapturemodule.cc",
-      "test/fakeaudiocapturemodule.h",
-      "test/fakedatachannelprovider.h",
-      "test/fakeperiodicvideocapturer.h",
-      "test/fakertccertificategenerator.h",
-      "test/fakevideotrackrenderer.h",
-      "test/fakevideotracksource.h",
-      "test/mock_datachannel.h",
-      "test/mock_peerconnection.h",
-      "test/mock_webrtcsession.h",
-      "test/mockpeerconnectionobservers.h",
-      "test/peerconnectiontestwrapper.cc",
-      "test/peerconnectiontestwrapper.h",
-      "test/rtcstatsobtainer.h",
-      "test/testsdpstrings.h",
-    ]
-
-    deps = [
-      ":libjingle_peerconnection",
-      "..:webrtc_common",
-      "../api:libjingle_peerconnection_test_api",
-      "../api:rtc_stats_api",
-      "../call:call_interfaces",
-      "../logging:rtc_event_log_api",
-      "../media:rtc_media",
-      "../media:rtc_media_tests_utils",
-      "../modules/audio_device:audio_device",
-      "../p2p:p2p_test_utils",
-      "../rtc_base:rtc_base",
-      "../rtc_base:rtc_base_approved",
-      "../rtc_base:rtc_base_tests_utils",
-      "../test:test_support",
-      "//testing/gmock",
-    ]
-
-    if (!build_with_chromium && is_clang) {
-      # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-    }
-  }
-
-  config("peerconnection_unittests_config") {
-    # The warnings below are enabled by default. Since GN orders compiler flags
-    # for a target before flags from configs, the only way to disable such
-    # warnings is by having them in a separate config, loaded from the target.
-    # TODO(kjellander): Make the code compile without disabling these flags.
-    # See https://bugs.webrtc.org/3307.
-    if (is_clang && is_win) {
-      cflags = [
-        # See https://bugs.chromium.org/p/webrtc/issues/detail?id=6267
-        # for -Wno-sign-compare
-        "-Wno-sign-compare",
-      ]
-    }
-
-    if (!is_win) {
-      cflags = [ "-Wno-sign-compare" ]
-    }
-  }
-
-  rtc_test("peerconnection_unittests") {
-    check_includes = false  # TODO(kjellander): Remove (bugs.webrtc.org/6828)
-    testonly = true
-    sources = [
-      "datachannel_unittest.cc",
-      "dtmfsender_unittest.cc",
-      "iceserverparsing_unittest.cc",
-      "jsepsessiondescription_unittest.cc",
-      "localaudiosource_unittest.cc",
-      "mediaconstraintsinterface_unittest.cc",
-      "mediastream_unittest.cc",
-      "peerconnection_integrationtest.cc",
-      "peerconnectionendtoend_unittest.cc",
-      "peerconnectionfactory_unittest.cc",
-      "peerconnectioninterface_unittest.cc",
-      "proxy_unittest.cc",
-      "rtcstats_integrationtest.cc",
-      "rtcstatscollector_unittest.cc",
-      "rtpsenderreceiver_unittest.cc",
-      "sctputils_unittest.cc",
-      "statscollector_unittest.cc",
-      "test/fakeaudiocapturemodule_unittest.cc",
-      "test/testsdpstrings.h",
-      "trackmediainfomap_unittest.cc",
-      "videocapturertracksource_unittest.cc",
-      "videotrack_unittest.cc",
-      "webrtcsdp_unittest.cc",
-      "webrtcsession_unittest.cc",
-    ]
-
-    if (rtc_enable_sctp) {
-      defines = [ "HAVE_SCTP" ]
-    }
-
-    configs += [ ":peerconnection_unittests_config" ]
-
-    if (!build_with_chromium && is_clang) {
-      # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-    }
-
-    # TODO(jschuh): Bug 1348: fix this warning.
-    configs += [ "//build/config/compiler:no_size_t_to_int_warning" ]
-
-    if (is_win) {
-      cflags = [
-        "/wd4245",  # conversion from int to size_t, signed/unsigned mismatch.
-        "/wd4389",  # signed/unsigned mismatch.
-      ]
-    }
-
-    if (rtc_use_quic) {
-      public_deps = [
-        "//third_party/libquic",
-      ]
-      sources += [
-        "quicdatachannel_unittest.cc",
-        "quicdatatransport_unittest.cc",
-      ]
-    }
-
-    deps = []
-    if (is_android) {
-      sources += [
-        "test/androidtestinitializer.cc",
-        "test/androidtestinitializer.h",
-      ]
-      deps += [
-        "../sdk/android:libjingle_peerconnection_java",
-        "../sdk/android:libjingle_peerconnection_jni",
-        "//testing/android/native_test:native_test_support",
-      ]
-    }
-
-    deps += [
-      ":libjingle_peerconnection",
-      ":pc_test_utils",
-      "..:webrtc_common",
-      "../api:fakemetricsobserver",
-      "../media:rtc_media_tests_utils",
-      "../pc:rtc_pc",
-      "../rtc_base:rtc_base_tests_main",
-      "../rtc_base:rtc_base_tests_utils",
-      "../system_wrappers:metrics_default",
-      "../test:audio_codec_mocks",
-      "//testing/gmock",
-    ]
-
-    if (is_android) {
-      deps += [ "//testing/android/native_test:native_test_support" ]
-
-      shard_timeout = 900
-    }
-  }
-}
diff --git a/pc/DEPS b/pc/DEPS
deleted file mode 100644
index 20bbba2..0000000
--- a/pc/DEPS
+++ /dev/null
@@ -1,35 +0,0 @@
-include_rules = [
-  "+third_party/libsrtp",
-  "+webrtc/api",
-  "+webrtc/call",
-  "+webrtc/common_video/h264",
-  "+webrtc/logging/rtc_event_log",
-  "+webrtc/logging/rtc_event_log",
-  "+webrtc/media",
-  "+webrtc/modules/audio_device",
-  "+webrtc/modules/audio_processing",
-  "+webrtc/modules/rtp_rtcp",
-  "+webrtc/modules/video_coding",
-  "+webrtc/modules/video_render",
-  "+webrtc/p2p",
-  "+webrtc/system_wrappers",
-]
-
-specific_include_rules = {
-  "androidtestinitializer\.cc": [
-    "+base/android",  # Allowed only for Android tests.
-    "+webrtc/voice_engine",
-  ],
-  "srtpfilter_unittest\.cc": [
-    "+crypto",
-  ],
-
-  # TODO(ossu): Remove these exceptions when audio_encoder_factory.h
-  # has moved to api/.
-  "peerconnectionfactory\.cc": [
-    "+webrtc/modules/audio_coding/codecs/builtin_audio_encoder_factory.h",
-  ],
-  "peerconnectioninterface_unittest\.cc": [
-    "+webrtc/modules/audio_coding/codecs/builtin_audio_encoder_factory.h",
-  ],
-}
diff --git a/pc/OWNERS b/pc/OWNERS
deleted file mode 100644
index f6ae01a..0000000
--- a/pc/OWNERS
+++ /dev/null
@@ -1,17 +0,0 @@
-deadbeef@webrtc.org
-honghaiz@webrtc.org
-hta@webrtc.org
-jiayl@webrtc.org
-juberti@webrtc.org
-perkj@webrtc.org
-pthatcher@webrtc.org
-sergeyu@chromium.org
-tommi@webrtc.org
-
-per-file rtcstats*=hbos@webrtc.org
-per-file rtcstats*=hta@webrtc.org
-
-# These are for the common case of adding or renaming files. If you're doing
-# structural changes, please get a review from a reviewer in this file.
-per-file *.gn=*
-per-file *.gni=*
diff --git a/pc/audiomonitor.cc b/pc/audiomonitor.cc
deleted file mode 100644
index 9c610bc..0000000
--- a/pc/audiomonitor.cc
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- *  Copyright 2004 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 <assert.h>
-#include "webrtc/pc/audiomonitor.h"
-#include "webrtc/pc/voicechannel.h"
-
-namespace cricket {
-
-const uint32_t MSG_MONITOR_POLL = 1;
-const uint32_t MSG_MONITOR_START = 2;
-const uint32_t MSG_MONITOR_STOP = 3;
-const uint32_t MSG_MONITOR_SIGNAL = 4;
-
-AudioMonitor::AudioMonitor(VoiceChannel *voice_channel,
-                           rtc::Thread *monitor_thread) {
-  voice_channel_ = voice_channel;
-  monitoring_thread_ = monitor_thread;
-  monitoring_ = false;
-}
-
-AudioMonitor::~AudioMonitor() {
-  voice_channel_->worker_thread()->Clear(this);
-  monitoring_thread_->Clear(this);
-}
-
-void AudioMonitor::Start(int milliseconds) {
-  rate_ = milliseconds;
-  if (rate_ < 100)
-    rate_ = 100;
-  voice_channel_->worker_thread()->Post(RTC_FROM_HERE, this, MSG_MONITOR_START);
-}
-
-void AudioMonitor::Stop() {
-  voice_channel_->worker_thread()->Post(RTC_FROM_HERE, this, MSG_MONITOR_STOP);
-}
-
-void AudioMonitor::OnMessage(rtc::Message *message) {
-  rtc::CritScope cs(&crit_);
-
-  switch (message->message_id) {
-  case MSG_MONITOR_START:
-    assert(rtc::Thread::Current() == voice_channel_->worker_thread());
-    if (!monitoring_) {
-      monitoring_ = true;
-      PollVoiceChannel();
-    }
-    break;
-
-  case MSG_MONITOR_STOP:
-    assert(rtc::Thread::Current() == voice_channel_->worker_thread());
-    if (monitoring_) {
-      monitoring_ = false;
-      voice_channel_->worker_thread()->Clear(this);
-    }
-    break;
-
-  case MSG_MONITOR_POLL:
-    assert(rtc::Thread::Current() == voice_channel_->worker_thread());
-    PollVoiceChannel();
-    break;
-
-  case MSG_MONITOR_SIGNAL:
-    {
-      assert(rtc::Thread::Current() == monitoring_thread_);
-      AudioInfo info = audio_info_;
-      crit_.Leave();
-      SignalUpdate(this, info);
-      crit_.Enter();
-    }
-    break;
-  }
-}
-
-void AudioMonitor::PollVoiceChannel() {
-  rtc::CritScope cs(&crit_);
-  assert(rtc::Thread::Current() == voice_channel_->worker_thread());
-
-  // Gather connection infos
-  audio_info_.input_level = voice_channel_->GetInputLevel_w();
-  audio_info_.output_level = voice_channel_->GetOutputLevel_w();
-  voice_channel_->GetActiveStreams_w(&audio_info_.active_streams);
-
-  // Signal the monitoring thread, start another poll timer
-  monitoring_thread_->Post(RTC_FROM_HERE, this, MSG_MONITOR_SIGNAL);
-  voice_channel_->worker_thread()->PostDelayed(RTC_FROM_HERE, rate_, this,
-                                               MSG_MONITOR_POLL);
-}
-
-VoiceChannel *AudioMonitor::voice_channel() {
-  return voice_channel_;
-}
-
-rtc::Thread *AudioMonitor::monitor_thread() {
-  return monitoring_thread_;
-}
-
-}  // namespace cricket
diff --git a/pc/audiomonitor.h b/pc/audiomonitor.h
deleted file mode 100644
index 86e8ba2..0000000
--- a/pc/audiomonitor.h
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- *  Copyright 2004 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_PC_AUDIOMONITOR_H_
-#define WEBRTC_PC_AUDIOMONITOR_H_
-
-#include <vector>
-#include <utility>
-
-#include "webrtc/p2p/base/port.h"
-#include "webrtc/rtc_base/sigslot.h"
-#include "webrtc/rtc_base/thread.h"
-
-namespace cricket {
-
-class VoiceChannel;
-
-struct AudioInfo {
-  int input_level;
-  int output_level;
-  typedef std::vector<std::pair<uint32_t, int> > StreamList;
-  StreamList active_streams;  // ssrcs contributing to output_level
-};
-
-class AudioMonitor : public rtc::MessageHandler,
-    public sigslot::has_slots<> {
- public:
-  AudioMonitor(VoiceChannel* voice_channel, rtc::Thread *monitor_thread);
-  ~AudioMonitor();
-
-  void Start(int cms);
-  void Stop();
-
-  VoiceChannel* voice_channel();
-  rtc::Thread *monitor_thread();
-
-  sigslot::signal2<AudioMonitor*, const AudioInfo&> SignalUpdate;
-
- protected:
-  void OnMessage(rtc::Message *message);
-  void PollVoiceChannel();
-
-  AudioInfo audio_info_;
-  VoiceChannel* voice_channel_;
-  rtc::Thread* monitoring_thread_;
-  rtc::CriticalSection crit_;
-  uint32_t rate_;
-  bool monitoring_;
-};
-
-}  // namespace cricket
-
-#endif  // WEBRTC_PC_AUDIOMONITOR_H_
diff --git a/pc/audiotrack.cc b/pc/audiotrack.cc
deleted file mode 100644
index 02607da..0000000
--- a/pc/audiotrack.cc
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- *  Copyright 2011 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/pc/audiotrack.h"
-
-#include "webrtc/rtc_base/checks.h"
-
-using rtc::scoped_refptr;
-
-namespace webrtc {
-
-// static
-scoped_refptr<AudioTrack> AudioTrack::Create(
-    const std::string& id,
-    const scoped_refptr<AudioSourceInterface>& source) {
-  return new rtc::RefCountedObject<AudioTrack>(id, source);
-}
-
-AudioTrack::AudioTrack(const std::string& label,
-                       const scoped_refptr<AudioSourceInterface>& source)
-    : MediaStreamTrack<AudioTrackInterface>(label), audio_source_(source) {
-  if (audio_source_) {
-    audio_source_->RegisterObserver(this);
-    OnChanged();
-  }
-}
-
-AudioTrack::~AudioTrack() {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  set_state(MediaStreamTrackInterface::kEnded);
-  if (audio_source_)
-    audio_source_->UnregisterObserver(this);
-}
-
-std::string AudioTrack::kind() const {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  return kAudioKind;
-}
-
-AudioSourceInterface* AudioTrack::GetSource() const {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  return audio_source_.get();
-}
-
-void AudioTrack::AddSink(AudioTrackSinkInterface* sink) {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  if (audio_source_)
-    audio_source_->AddSink(sink);
-}
-
-void AudioTrack::RemoveSink(AudioTrackSinkInterface* sink) {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  if (audio_source_)
-    audio_source_->RemoveSink(sink);
-}
-
-void AudioTrack::OnChanged() {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  if (audio_source_->state() == MediaSourceInterface::kEnded) {
-    set_state(kEnded);
-  } else {
-    set_state(kLive);
-  }
-}
-
-}  // namespace webrtc
diff --git a/pc/audiotrack.h b/pc/audiotrack.h
deleted file mode 100644
index 8dde2ef..0000000
--- a/pc/audiotrack.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- *  Copyright 2011 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_PC_AUDIOTRACK_H_
-#define WEBRTC_PC_AUDIOTRACK_H_
-
-#include <string>
-
-#include "webrtc/api/mediastreaminterface.h"
-#include "webrtc/api/notifier.h"
-#include "webrtc/pc/mediastreamtrack.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/scoped_ref_ptr.h"
-#include "webrtc/rtc_base/thread_checker.h"
-
-namespace webrtc {
-
-class AudioTrack : public MediaStreamTrack<AudioTrackInterface>,
-                   public ObserverInterface {
- protected:
-  // Protected ctor to force use of factory method.
-  AudioTrack(const std::string& label,
-             const rtc::scoped_refptr<AudioSourceInterface>& source);
-  ~AudioTrack() override;
-
- public:
-  static rtc::scoped_refptr<AudioTrack> Create(
-      const std::string& id,
-      const rtc::scoped_refptr<AudioSourceInterface>& source);
-
- private:
-  // MediaStreamTrack implementation.
-  std::string kind() const override;
-
-  // AudioTrackInterface implementation.
-  AudioSourceInterface* GetSource() const override;
-
-  void AddSink(AudioTrackSinkInterface* sink) override;
-  void RemoveSink(AudioTrackSinkInterface* sink) override;
-
-  // ObserverInterface implementation.
-  void OnChanged() override;
-
- private:
-  const rtc::scoped_refptr<AudioSourceInterface> audio_source_;
-  rtc::ThreadChecker thread_checker_;
-  RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(AudioTrack);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_PC_AUDIOTRACK_H_
diff --git a/pc/bundlefilter.cc b/pc/bundlefilter.cc
deleted file mode 100644
index 3b7dcd6..0000000
--- a/pc/bundlefilter.cc
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- *  Copyright 2004 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/pc/bundlefilter.h"
-
-#include "webrtc/media/base/rtputils.h"
-#include "webrtc/rtc_base/logging.h"
-
-namespace cricket {
-
-BundleFilter::BundleFilter() {
-}
-
-BundleFilter::~BundleFilter() {
-}
-
-bool BundleFilter::DemuxPacket(const uint8_t* data, size_t len) {
-  // For RTP packets, we check whether the payload type can be found.
-  if (!IsRtpPacket(data, len)) {
-    return false;
-  }
-
-  int payload_type = 0;
-  if (!GetRtpPayloadType(data, len, &payload_type)) {
-    return false;
-  }
-  return FindPayloadType(payload_type);
-}
-
-void BundleFilter::AddPayloadType(int payload_type) {
-  payload_types_.insert(payload_type);
-}
-
-bool BundleFilter::FindPayloadType(int pl_type) const {
-  return payload_types_.find(pl_type) != payload_types_.end();
-}
-
-void BundleFilter::ClearAllPayloadTypes() {
-  payload_types_.clear();
-}
-
-}  // namespace cricket
diff --git a/pc/bundlefilter.h b/pc/bundlefilter.h
deleted file mode 100644
index b4ad824..0000000
--- a/pc/bundlefilter.h
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- *  Copyright 2004 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_PC_BUNDLEFILTER_H_
-#define WEBRTC_PC_BUNDLEFILTER_H_
-
-#include <stdint.h>
-
-#include <set>
-#include <vector>
-
-#include "webrtc/media/base/streamparams.h"
-#include "webrtc/rtc_base/basictypes.h"
-
-namespace cricket {
-
-// In case of single RTP session and single transport channel, all session
-// (or media) channels share a common transport channel. Hence they all get
-// SignalReadPacket when packet received on transport channel. This requires
-// cricket::BaseChannel to know all the valid sources, else media channel
-// will decode invalid packets.
-//
-// This class determines whether a packet is destined for cricket::BaseChannel.
-// This is only to be used for RTP packets as RTCP packets are not filtered.
-// For RTP packets, this is decided based on the payload type.
-class BundleFilter {
- public:
-  BundleFilter();
-  ~BundleFilter();
-
-  // Determines if a RTP packet belongs to valid cricket::BaseChannel.
-  bool DemuxPacket(const uint8_t* data, size_t len);
-
-  // Adds the supported payload type.
-  void AddPayloadType(int payload_type);
-
-  // Public for unittests.
-  bool FindPayloadType(int pl_type) const;
-  void ClearAllPayloadTypes();
-
- private:
-  std::set<int> payload_types_;
-};
-
-}  // namespace cricket
-
-#endif  // WEBRTC_PC_BUNDLEFILTER_H_
diff --git a/pc/bundlefilter_unittest.cc b/pc/bundlefilter_unittest.cc
deleted file mode 100644
index f0f56a5..0000000
--- a/pc/bundlefilter_unittest.cc
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- *  Copyright 2004 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/pc/bundlefilter.h"
-#include "webrtc/rtc_base/gunit.h"
-
-using cricket::StreamParams;
-
-static const int kPayloadType1 = 0x11;
-static const int kPayloadType2 = 0x22;
-static const int kPayloadType3 = 0x33;
-
-// SSRC = 0x1111, Payload type = 0x11
-static const unsigned char kRtpPacketPt1Ssrc1[] = {
-    0x80, kPayloadType1, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11,
-    0x11,
-};
-
-// SSRC = 0x2222, Payload type = 0x22
-static const unsigned char kRtpPacketPt2Ssrc2[] = {
-    0x80, 0x80 + kPayloadType2, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-    0x22, 0x22,
-};
-
-// SSRC = 0x2222, Payload type = 0x33
-static const unsigned char kRtpPacketPt3Ssrc2[] = {
-    0x80, kPayloadType3, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22,
-    0x22,
-};
-
-// An SCTP packet.
-static const unsigned char kSctpPacket[] = {
-    0x00, 0x01, 0x00, 0x01,
-    0xff, 0xff, 0xff, 0xff,
-    0x00, 0x00, 0x00, 0x00,
-    0x03, 0x00, 0x00, 0x04,
-    0x00, 0x00, 0x00, 0x00,
-};
-
-TEST(BundleFilterTest, RtpPacketTest) {
-  cricket::BundleFilter bundle_filter;
-  bundle_filter.AddPayloadType(kPayloadType1);
-  EXPECT_TRUE(bundle_filter.DemuxPacket(kRtpPacketPt1Ssrc1,
-                                        sizeof(kRtpPacketPt1Ssrc1)));
-  bundle_filter.AddPayloadType(kPayloadType2);
-  EXPECT_TRUE(bundle_filter.DemuxPacket(kRtpPacketPt2Ssrc2,
-                                        sizeof(kRtpPacketPt2Ssrc2)));
-
-  // Payload type 0x33 is not added.
-  EXPECT_FALSE(bundle_filter.DemuxPacket(kRtpPacketPt3Ssrc2,
-                                         sizeof(kRtpPacketPt3Ssrc2)));
-  // Size is too small.
-  EXPECT_FALSE(bundle_filter.DemuxPacket(kRtpPacketPt1Ssrc1, 11));
-
-  bundle_filter.ClearAllPayloadTypes();
-  EXPECT_FALSE(bundle_filter.DemuxPacket(kRtpPacketPt1Ssrc1,
-                                         sizeof(kRtpPacketPt1Ssrc1)));
-  EXPECT_FALSE(bundle_filter.DemuxPacket(kRtpPacketPt2Ssrc2,
-                                         sizeof(kRtpPacketPt2Ssrc2)));
-}
-
-TEST(BundleFilterTest, InvalidRtpPacket) {
-  cricket::BundleFilter bundle_filter;
-  EXPECT_FALSE(bundle_filter.DemuxPacket(kSctpPacket, sizeof(kSctpPacket)));
-}
diff --git a/pc/channel.cc b/pc/channel.cc
deleted file mode 100644
index 8e82925..0000000
--- a/pc/channel.cc
+++ /dev/null
@@ -1,2385 +0,0 @@
-/*
- *  Copyright 2004 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 <algorithm>
-#include <iterator>
-#include <utility>
-
-#include "webrtc/pc/channel.h"
-
-#include "webrtc/api/call/audio_sink.h"
-#include "webrtc/media/base/mediaconstants.h"
-#include "webrtc/media/base/rtputils.h"
-#include "webrtc/rtc_base/bind.h"
-#include "webrtc/rtc_base/byteorder.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/copyonwritebuffer.h"
-#include "webrtc/rtc_base/dscp.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/networkroute.h"
-#include "webrtc/rtc_base/ptr_util.h"
-#include "webrtc/rtc_base/trace_event.h"
-// Adding 'nogncheck' to disable the gn include headers check to support modular
-// WebRTC build targets.
-#include "webrtc/media/engine/webrtcvoiceengine.h"  // nogncheck
-#include "webrtc/p2p/base/packettransportinternal.h"
-#include "webrtc/pc/channelmanager.h"
-#include "webrtc/pc/rtptransport.h"
-#include "webrtc/pc/srtptransport.h"
-
-namespace cricket {
-using rtc::Bind;
-
-namespace {
-// See comment below for why we need to use a pointer to a unique_ptr.
-bool SetRawAudioSink_w(VoiceMediaChannel* channel,
-                       uint32_t ssrc,
-                       std::unique_ptr<webrtc::AudioSinkInterface>* sink) {
-  channel->SetRawAudioSink(ssrc, std::move(*sink));
-  return true;
-}
-
-struct SendPacketMessageData : public rtc::MessageData {
-  rtc::CopyOnWriteBuffer packet;
-  rtc::PacketOptions options;
-};
-
-}  // namespace
-
-enum {
-  MSG_EARLYMEDIATIMEOUT = 1,
-  MSG_SEND_RTP_PACKET,
-  MSG_SEND_RTCP_PACKET,
-  MSG_CHANNEL_ERROR,
-  MSG_READYTOSENDDATA,
-  MSG_DATARECEIVED,
-  MSG_FIRSTPACKETRECEIVED,
-};
-
-// Value specified in RFC 5764.
-static const char kDtlsSrtpExporterLabel[] = "EXTRACTOR-dtls_srtp";
-
-static const int kAgcMinus10db = -10;
-
-static void SafeSetError(const std::string& message, std::string* error_desc) {
-  if (error_desc) {
-    *error_desc = message;
-  }
-}
-
-struct VoiceChannelErrorMessageData : public rtc::MessageData {
-  VoiceChannelErrorMessageData(uint32_t in_ssrc,
-                               VoiceMediaChannel::Error in_error)
-      : ssrc(in_ssrc), error(in_error) {}
-  uint32_t ssrc;
-  VoiceMediaChannel::Error error;
-};
-
-struct VideoChannelErrorMessageData : public rtc::MessageData {
-  VideoChannelErrorMessageData(uint32_t in_ssrc,
-                               VideoMediaChannel::Error in_error)
-      : ssrc(in_ssrc), error(in_error) {}
-  uint32_t ssrc;
-  VideoMediaChannel::Error error;
-};
-
-struct DataChannelErrorMessageData : public rtc::MessageData {
-  DataChannelErrorMessageData(uint32_t in_ssrc,
-                              DataMediaChannel::Error in_error)
-      : ssrc(in_ssrc), error(in_error) {}
-  uint32_t ssrc;
-  DataMediaChannel::Error error;
-};
-
-static bool ValidPacket(bool rtcp, const rtc::CopyOnWriteBuffer* packet) {
-  // Check the packet size. We could check the header too if needed.
-  return packet && IsValidRtpRtcpPacketSize(rtcp, packet->size());
-}
-
-static bool IsReceiveContentDirection(MediaContentDirection direction) {
-  return direction == MD_SENDRECV || direction == MD_RECVONLY;
-}
-
-static bool IsSendContentDirection(MediaContentDirection direction) {
-  return direction == MD_SENDRECV || direction == MD_SENDONLY;
-}
-
-template <class Codec>
-void RtpParametersFromMediaDescription(
-    const MediaContentDescriptionImpl<Codec>* desc,
-    const RtpHeaderExtensions& extensions,
-    RtpParameters<Codec>* params) {
-  // TODO(pthatcher): Remove this once we're sure no one will give us
-  // a description without codecs (currently a CA_UPDATE with just
-  // streams can).
-  if (desc->has_codecs()) {
-    params->codecs = desc->codecs();
-  }
-  // TODO(pthatcher): See if we really need
-  // rtp_header_extensions_set() and remove it if we don't.
-  if (desc->rtp_header_extensions_set()) {
-    params->extensions = extensions;
-  }
-  params->rtcp.reduced_size = desc->rtcp_reduced_size();
-}
-
-template <class Codec>
-void RtpSendParametersFromMediaDescription(
-    const MediaContentDescriptionImpl<Codec>* desc,
-    const RtpHeaderExtensions& extensions,
-    RtpSendParameters<Codec>* send_params) {
-  RtpParametersFromMediaDescription(desc, extensions, send_params);
-  send_params->max_bandwidth_bps = desc->bandwidth();
-}
-
-BaseChannel::BaseChannel(rtc::Thread* worker_thread,
-                         rtc::Thread* network_thread,
-                         rtc::Thread* signaling_thread,
-                         MediaChannel* media_channel,
-                         const std::string& content_name,
-                         bool rtcp_mux_required,
-                         bool srtp_required)
-    : worker_thread_(worker_thread),
-      network_thread_(network_thread),
-      signaling_thread_(signaling_thread),
-      content_name_(content_name),
-      rtcp_mux_required_(rtcp_mux_required),
-      srtp_required_(srtp_required),
-      media_channel_(media_channel),
-      selected_candidate_pair_(nullptr) {
-  RTC_DCHECK(worker_thread_ == rtc::Thread::Current());
-  if (srtp_required) {
-    auto transport =
-        rtc::MakeUnique<webrtc::SrtpTransport>(rtcp_mux_required, content_name);
-    srtp_transport_ = transport.get();
-    rtp_transport_ = std::move(transport);
-#if defined(ENABLE_EXTERNAL_AUTH)
-    srtp_transport_->EnableExternalAuth();
-#endif
-  } else {
-    rtp_transport_ = rtc::MakeUnique<webrtc::RtpTransport>(rtcp_mux_required);
-    srtp_transport_ = nullptr;
-  }
-  rtp_transport_->SignalReadyToSend.connect(
-      this, &BaseChannel::OnTransportReadyToSend);
-  // TODO(zstein):  RtpTransport::SignalPacketReceived will probably be replaced
-  // with a callback interface later so that the demuxer can select which
-  // channel to signal.
-  rtp_transport_->SignalPacketReceived.connect(this,
-                                               &BaseChannel::OnPacketReceived);
-  LOG(LS_INFO) << "Created channel for " << content_name;
-}
-
-BaseChannel::~BaseChannel() {
-  TRACE_EVENT0("webrtc", "BaseChannel::~BaseChannel");
-  RTC_DCHECK(worker_thread_ == rtc::Thread::Current());
-  Deinit();
-  StopConnectionMonitor();
-  // Eats any outstanding messages or packets.
-  worker_thread_->Clear(&invoker_);
-  worker_thread_->Clear(this);
-  // We must destroy the media channel before the transport channel, otherwise
-  // the media channel may try to send on the dead transport channel. NULLing
-  // is not an effective strategy since the sends will come on another thread.
-  delete media_channel_;
-  LOG(LS_INFO) << "Destroyed channel: " << content_name_;
-}
-
-void BaseChannel::DisconnectTransportChannels_n() {
-  // Send any outstanding RTCP packets.
-  FlushRtcpMessages_n();
-
-  // Stop signals from transport channels, but keep them alive because
-  // media_channel may use them from a different thread.
-  if (rtp_dtls_transport_) {
-    DisconnectFromDtlsTransport(rtp_dtls_transport_);
-  } else if (rtp_transport_->rtp_packet_transport()) {
-    DisconnectFromPacketTransport(rtp_transport_->rtp_packet_transport());
-  }
-  if (rtcp_dtls_transport_) {
-    DisconnectFromDtlsTransport(rtcp_dtls_transport_);
-  } else if (rtp_transport_->rtcp_packet_transport()) {
-    DisconnectFromPacketTransport(rtp_transport_->rtcp_packet_transport());
-  }
-
-  rtp_transport_->SetRtpPacketTransport(nullptr);
-  rtp_transport_->SetRtcpPacketTransport(nullptr);
-
-  // Clear pending read packets/messages.
-  network_thread_->Clear(&invoker_);
-  network_thread_->Clear(this);
-}
-
-bool BaseChannel::Init_w(DtlsTransportInternal* rtp_dtls_transport,
-                         DtlsTransportInternal* rtcp_dtls_transport,
-                         rtc::PacketTransportInternal* rtp_packet_transport,
-                         rtc::PacketTransportInternal* rtcp_packet_transport) {
-  if (!network_thread_->Invoke<bool>(
-          RTC_FROM_HERE, Bind(&BaseChannel::InitNetwork_n, this,
-                              rtp_dtls_transport, rtcp_dtls_transport,
-                              rtp_packet_transport, rtcp_packet_transport))) {
-    return false;
-  }
-  // Both RTP and RTCP channels should be set, we can call SetInterface on
-  // the media channel and it can set network options.
-  RTC_DCHECK_RUN_ON(worker_thread_);
-  media_channel_->SetInterface(this);
-  return true;
-}
-
-bool BaseChannel::InitNetwork_n(
-    DtlsTransportInternal* rtp_dtls_transport,
-    DtlsTransportInternal* rtcp_dtls_transport,
-    rtc::PacketTransportInternal* rtp_packet_transport,
-    rtc::PacketTransportInternal* rtcp_packet_transport) {
-  RTC_DCHECK(network_thread_->IsCurrent());
-  SetTransports_n(rtp_dtls_transport, rtcp_dtls_transport, rtp_packet_transport,
-                  rtcp_packet_transport);
-
-  if (rtcp_mux_required_) {
-    rtcp_mux_filter_.SetActive();
-  }
-  return true;
-}
-
-void BaseChannel::Deinit() {
-  RTC_DCHECK(worker_thread_->IsCurrent());
-  media_channel_->SetInterface(NULL);
-  // Packets arrive on the network thread, processing packets calls virtual
-  // functions, so need to stop this process in Deinit that is called in
-  // derived classes destructor.
-  network_thread_->Invoke<void>(
-      RTC_FROM_HERE, Bind(&BaseChannel::DisconnectTransportChannels_n, this));
-}
-
-void BaseChannel::SetTransports(DtlsTransportInternal* rtp_dtls_transport,
-                                DtlsTransportInternal* rtcp_dtls_transport) {
-  network_thread_->Invoke<void>(
-      RTC_FROM_HERE,
-      Bind(&BaseChannel::SetTransports_n, this, rtp_dtls_transport,
-           rtcp_dtls_transport, rtp_dtls_transport, rtcp_dtls_transport));
-}
-
-void BaseChannel::SetTransports(
-    rtc::PacketTransportInternal* rtp_packet_transport,
-    rtc::PacketTransportInternal* rtcp_packet_transport) {
-  network_thread_->Invoke<void>(
-      RTC_FROM_HERE, Bind(&BaseChannel::SetTransports_n, this, nullptr, nullptr,
-                          rtp_packet_transport, rtcp_packet_transport));
-}
-
-void BaseChannel::SetTransports_n(
-    DtlsTransportInternal* rtp_dtls_transport,
-    DtlsTransportInternal* rtcp_dtls_transport,
-    rtc::PacketTransportInternal* rtp_packet_transport,
-    rtc::PacketTransportInternal* rtcp_packet_transport) {
-  RTC_DCHECK(network_thread_->IsCurrent());
-  // Validate some assertions about the input.
-  RTC_DCHECK(rtp_packet_transport);
-  RTC_DCHECK_EQ(NeedsRtcpTransport(), rtcp_packet_transport != nullptr);
-  if (rtp_dtls_transport || rtcp_dtls_transport) {
-    // DTLS/non-DTLS pointers should be to the same object.
-    RTC_DCHECK(rtp_dtls_transport == rtp_packet_transport);
-    RTC_DCHECK(rtcp_dtls_transport == rtcp_packet_transport);
-    // Can't go from non-DTLS to DTLS.
-    RTC_DCHECK(!rtp_transport_->rtp_packet_transport() || rtp_dtls_transport_);
-  } else {
-    // Can't go from DTLS to non-DTLS.
-    RTC_DCHECK(!rtp_dtls_transport_);
-  }
-  // Transport names should be the same.
-  if (rtp_dtls_transport && rtcp_dtls_transport) {
-    RTC_DCHECK(rtp_dtls_transport->transport_name() ==
-               rtcp_dtls_transport->transport_name());
-  }
-  std::string debug_name;
-  if (rtp_dtls_transport) {
-    transport_name_ = rtp_dtls_transport->transport_name();
-    debug_name = transport_name_;
-  } else {
-    debug_name = rtp_packet_transport->debug_name();
-  }
-  if (rtp_packet_transport == rtp_transport_->rtp_packet_transport()) {
-    // Nothing to do if transport isn't changing.
-    return;
-  }
-
-  // When using DTLS-SRTP, we must reset the SrtpTransport every time the
-  // DtlsTransport changes and wait until the DTLS handshake is complete to set
-  // the newly negotiated parameters.
-  if (ShouldSetupDtlsSrtp_n()) {
-    // Set |writable_| to false such that UpdateWritableState_w can set up
-    // DTLS-SRTP when |writable_| becomes true again.
-    writable_ = false;
-    dtls_active_ = false;
-    if (srtp_transport_) {
-      srtp_transport_->ResetParams();
-    }
-  }
-
-  // If this BaseChannel doesn't require RTCP mux and we haven't fully
-  // negotiated RTCP mux, we need an RTCP transport.
-  if (rtcp_packet_transport) {
-    LOG(LS_INFO) << "Setting RTCP Transport for " << content_name() << " on "
-                 << debug_name << " transport " << rtcp_packet_transport;
-    SetTransport_n(true, rtcp_dtls_transport, rtcp_packet_transport);
-  }
-
-  LOG(LS_INFO) << "Setting RTP Transport for " << content_name() << " on "
-               << debug_name << " transport " << rtp_packet_transport;
-  SetTransport_n(false, rtp_dtls_transport, rtp_packet_transport);
-
-  // Update aggregate writable/ready-to-send state between RTP and RTCP upon
-  // setting new transport channels.
-  UpdateWritableState_n();
-}
-
-void BaseChannel::SetTransport_n(
-    bool rtcp,
-    DtlsTransportInternal* new_dtls_transport,
-    rtc::PacketTransportInternal* new_packet_transport) {
-  RTC_DCHECK(network_thread_->IsCurrent());
-  DtlsTransportInternal*& old_dtls_transport =
-      rtcp ? rtcp_dtls_transport_ : rtp_dtls_transport_;
-  rtc::PacketTransportInternal* old_packet_transport =
-      rtcp ? rtp_transport_->rtcp_packet_transport()
-           : rtp_transport_->rtp_packet_transport();
-
-  if (!old_packet_transport && !new_packet_transport) {
-    // Nothing to do.
-    return;
-  }
-
-  RTC_DCHECK(old_packet_transport != new_packet_transport);
-  if (old_dtls_transport) {
-    DisconnectFromDtlsTransport(old_dtls_transport);
-  } else if (old_packet_transport) {
-    DisconnectFromPacketTransport(old_packet_transport);
-  }
-
-  if (rtcp) {
-    rtp_transport_->SetRtcpPacketTransport(new_packet_transport);
-  } else {
-    rtp_transport_->SetRtpPacketTransport(new_packet_transport);
-  }
-  old_dtls_transport = new_dtls_transport;
-
-  // If there's no new transport, we're done after disconnecting from old one.
-  if (!new_packet_transport) {
-    return;
-  }
-
-  if (rtcp && new_dtls_transport) {
-    RTC_CHECK(!(ShouldSetupDtlsSrtp_n() && srtp_active()))
-        << "Setting RTCP for DTLS/SRTP after the DTLS is active "
-        << "should never happen.";
-  }
-
-  if (new_dtls_transport) {
-    ConnectToDtlsTransport(new_dtls_transport);
-  } else {
-    ConnectToPacketTransport(new_packet_transport);
-  }
-  auto& socket_options = rtcp ? rtcp_socket_options_ : socket_options_;
-  for (const auto& pair : socket_options) {
-    new_packet_transport->SetOption(pair.first, pair.second);
-  }
-}
-
-void BaseChannel::ConnectToDtlsTransport(DtlsTransportInternal* transport) {
-  RTC_DCHECK(network_thread_->IsCurrent());
-
-  // TODO(zstein): de-dup with ConnectToPacketTransport
-  transport->SignalWritableState.connect(this, &BaseChannel::OnWritableState);
-  transport->SignalDtlsState.connect(this, &BaseChannel::OnDtlsState);
-  transport->SignalSentPacket.connect(this, &BaseChannel::SignalSentPacket_n);
-  transport->ice_transport()->SignalSelectedCandidatePairChanged.connect(
-      this, &BaseChannel::OnSelectedCandidatePairChanged);
-}
-
-void BaseChannel::DisconnectFromDtlsTransport(
-    DtlsTransportInternal* transport) {
-  RTC_DCHECK(network_thread_->IsCurrent());
-  OnSelectedCandidatePairChanged(transport->ice_transport(), nullptr, -1,
-                                 false);
-
-  transport->SignalWritableState.disconnect(this);
-  transport->SignalDtlsState.disconnect(this);
-  transport->SignalSentPacket.disconnect(this);
-  transport->ice_transport()->SignalSelectedCandidatePairChanged.disconnect(
-      this);
-}
-
-void BaseChannel::ConnectToPacketTransport(
-    rtc::PacketTransportInternal* transport) {
-  RTC_DCHECK_RUN_ON(network_thread_);
-  transport->SignalWritableState.connect(this, &BaseChannel::OnWritableState);
-  transport->SignalSentPacket.connect(this, &BaseChannel::SignalSentPacket_n);
-}
-
-void BaseChannel::DisconnectFromPacketTransport(
-    rtc::PacketTransportInternal* transport) {
-  RTC_DCHECK_RUN_ON(network_thread_);
-  transport->SignalWritableState.disconnect(this);
-  transport->SignalSentPacket.disconnect(this);
-}
-
-bool BaseChannel::Enable(bool enable) {
-  worker_thread_->Invoke<void>(
-      RTC_FROM_HERE,
-      Bind(enable ? &BaseChannel::EnableMedia_w : &BaseChannel::DisableMedia_w,
-           this));
-  return true;
-}
-
-bool BaseChannel::AddRecvStream(const StreamParams& sp) {
-  return InvokeOnWorker<bool>(RTC_FROM_HERE,
-                              Bind(&BaseChannel::AddRecvStream_w, this, sp));
-}
-
-bool BaseChannel::RemoveRecvStream(uint32_t ssrc) {
-  return InvokeOnWorker<bool>(
-      RTC_FROM_HERE, Bind(&BaseChannel::RemoveRecvStream_w, this, ssrc));
-}
-
-bool BaseChannel::AddSendStream(const StreamParams& sp) {
-  return InvokeOnWorker<bool>(
-      RTC_FROM_HERE, Bind(&MediaChannel::AddSendStream, media_channel(), sp));
-}
-
-bool BaseChannel::RemoveSendStream(uint32_t ssrc) {
-  return InvokeOnWorker<bool>(
-      RTC_FROM_HERE,
-      Bind(&MediaChannel::RemoveSendStream, media_channel(), ssrc));
-}
-
-bool BaseChannel::SetLocalContent(const MediaContentDescription* content,
-                                  ContentAction action,
-                                  std::string* error_desc) {
-  TRACE_EVENT0("webrtc", "BaseChannel::SetLocalContent");
-  return InvokeOnWorker<bool>(
-      RTC_FROM_HERE,
-      Bind(&BaseChannel::SetLocalContent_w, this, content, action, error_desc));
-}
-
-bool BaseChannel::SetRemoteContent(const MediaContentDescription* content,
-                                   ContentAction action,
-                                   std::string* error_desc) {
-  TRACE_EVENT0("webrtc", "BaseChannel::SetRemoteContent");
-  return InvokeOnWorker<bool>(
-      RTC_FROM_HERE, Bind(&BaseChannel::SetRemoteContent_w, this, content,
-                          action, error_desc));
-}
-
-void BaseChannel::StartConnectionMonitor(int cms) {
-  // We pass in the BaseChannel instead of the rtp_dtls_transport_
-  // because if the rtp_dtls_transport_ changes, the ConnectionMonitor
-  // would be pointing to the wrong TransportChannel.
-  // We pass in the network thread because on that thread connection monitor
-  // will call BaseChannel::GetConnectionStats which must be called on the
-  // network thread.
-  connection_monitor_.reset(
-      new ConnectionMonitor(this, network_thread(), rtc::Thread::Current()));
-  connection_monitor_->SignalUpdate.connect(
-      this, &BaseChannel::OnConnectionMonitorUpdate);
-  connection_monitor_->Start(cms);
-}
-
-void BaseChannel::StopConnectionMonitor() {
-  if (connection_monitor_) {
-    connection_monitor_->Stop();
-    connection_monitor_.reset();
-  }
-}
-
-bool BaseChannel::GetConnectionStats(ConnectionInfos* infos) {
-  RTC_DCHECK(network_thread_->IsCurrent());
-  if (!rtp_dtls_transport_) {
-    return false;
-  }
-  return rtp_dtls_transport_->ice_transport()->GetStats(infos);
-}
-
-bool BaseChannel::NeedsRtcpTransport() {
-  // If this BaseChannel doesn't require RTCP mux and we haven't fully
-  // negotiated RTCP mux, we need an RTCP transport.
-  return !rtcp_mux_required_ && !rtcp_mux_filter_.IsFullyActive();
-}
-
-bool BaseChannel::IsReadyToReceiveMedia_w() const {
-  // Receive data if we are enabled and have local content,
-  return enabled() && IsReceiveContentDirection(local_content_direction_);
-}
-
-bool BaseChannel::IsReadyToSendMedia_w() const {
-  // Need to access some state updated on the network thread.
-  return network_thread_->Invoke<bool>(
-      RTC_FROM_HERE, Bind(&BaseChannel::IsReadyToSendMedia_n, this));
-}
-
-bool BaseChannel::IsReadyToSendMedia_n() const {
-  // Send outgoing data if we are enabled, have local and remote content,
-  // and we have had some form of connectivity.
-  return enabled() && IsReceiveContentDirection(remote_content_direction_) &&
-         IsSendContentDirection(local_content_direction_) &&
-         was_ever_writable() && (srtp_active() || !ShouldSetupDtlsSrtp_n());
-}
-
-bool BaseChannel::SendPacket(rtc::CopyOnWriteBuffer* packet,
-                             const rtc::PacketOptions& options) {
-  return SendPacket(false, packet, options);
-}
-
-bool BaseChannel::SendRtcp(rtc::CopyOnWriteBuffer* packet,
-                           const rtc::PacketOptions& options) {
-  return SendPacket(true, packet, options);
-}
-
-int BaseChannel::SetOption(SocketType type, rtc::Socket::Option opt,
-                           int value) {
-  return network_thread_->Invoke<int>(
-      RTC_FROM_HERE, Bind(&BaseChannel::SetOption_n, this, type, opt, value));
-}
-
-int BaseChannel::SetOption_n(SocketType type,
-                             rtc::Socket::Option opt,
-                             int value) {
-  RTC_DCHECK(network_thread_->IsCurrent());
-  rtc::PacketTransportInternal* transport = nullptr;
-  switch (type) {
-    case ST_RTP:
-      transport = rtp_transport_->rtp_packet_transport();
-      socket_options_.push_back(
-          std::pair<rtc::Socket::Option, int>(opt, value));
-      break;
-    case ST_RTCP:
-      transport = rtp_transport_->rtcp_packet_transport();
-      rtcp_socket_options_.push_back(
-          std::pair<rtc::Socket::Option, int>(opt, value));
-      break;
-  }
-  return transport ? transport->SetOption(opt, value) : -1;
-}
-
-void BaseChannel::OnWritableState(rtc::PacketTransportInternal* transport) {
-  RTC_DCHECK(transport == rtp_transport_->rtp_packet_transport() ||
-             transport == rtp_transport_->rtcp_packet_transport());
-  RTC_DCHECK(network_thread_->IsCurrent());
-  UpdateWritableState_n();
-}
-
-void BaseChannel::OnDtlsState(DtlsTransportInternal* transport,
-                              DtlsTransportState state) {
-  if (!ShouldSetupDtlsSrtp_n()) {
-    return;
-  }
-
-  // Reset the SrtpTransport if it's not the CONNECTED state. For the CONNECTED
-  // state, setting up DTLS-SRTP context is deferred to ChannelWritable_w to
-  // cover other scenarios like the whole transport is writable (not just this
-  // TransportChannel) or when TransportChannel is attached after DTLS is
-  // negotiated.
-  if (state != DTLS_TRANSPORT_CONNECTED) {
-    dtls_active_ = false;
-    if (srtp_transport_) {
-      srtp_transport_->ResetParams();
-    }
-  }
-}
-
-void BaseChannel::OnSelectedCandidatePairChanged(
-    IceTransportInternal* ice_transport,
-    CandidatePairInterface* selected_candidate_pair,
-    int last_sent_packet_id,
-    bool ready_to_send) {
-  RTC_DCHECK((rtp_dtls_transport_ &&
-              ice_transport == rtp_dtls_transport_->ice_transport()) ||
-             (rtcp_dtls_transport_ &&
-              ice_transport == rtcp_dtls_transport_->ice_transport()));
-  RTC_DCHECK(network_thread_->IsCurrent());
-  selected_candidate_pair_ = selected_candidate_pair;
-  std::string transport_name = ice_transport->transport_name();
-  rtc::NetworkRoute network_route;
-  if (selected_candidate_pair) {
-    network_route = rtc::NetworkRoute(
-        ready_to_send, selected_candidate_pair->local_candidate().network_id(),
-        selected_candidate_pair->remote_candidate().network_id(),
-        last_sent_packet_id);
-
-    UpdateTransportOverhead();
-  }
-  invoker_.AsyncInvoke<void>(
-      RTC_FROM_HERE, worker_thread_,
-      Bind(&MediaChannel::OnNetworkRouteChanged, media_channel_, transport_name,
-           network_route));
-}
-
-void BaseChannel::OnTransportReadyToSend(bool ready) {
-  invoker_.AsyncInvoke<void>(
-      RTC_FROM_HERE, worker_thread_,
-      Bind(&MediaChannel::OnReadyToSend, media_channel_, ready));
-}
-
-bool BaseChannel::SendPacket(bool rtcp,
-                             rtc::CopyOnWriteBuffer* packet,
-                             const rtc::PacketOptions& options) {
-  // SendPacket gets called from MediaEngine, on a pacer or an encoder thread.
-  // If the thread is not our network thread, we will post to our network
-  // so that the real work happens on our network. This avoids us having to
-  // synchronize access to all the pieces of the send path, including
-  // SRTP and the inner workings of the transport channels.
-  // The only downside is that we can't return a proper failure code if
-  // needed. Since UDP is unreliable anyway, this should be a non-issue.
-  if (!network_thread_->IsCurrent()) {
-    // Avoid a copy by transferring the ownership of the packet data.
-    int message_id = rtcp ? MSG_SEND_RTCP_PACKET : MSG_SEND_RTP_PACKET;
-    SendPacketMessageData* data = new SendPacketMessageData;
-    data->packet = std::move(*packet);
-    data->options = options;
-    network_thread_->Post(RTC_FROM_HERE, this, message_id, data);
-    return true;
-  }
-  TRACE_EVENT0("webrtc", "BaseChannel::SendPacket");
-
-  // Now that we are on the correct thread, ensure we have a place to send this
-  // packet before doing anything. (We might get RTCP packets that we don't
-  // intend to send.) If we've negotiated RTCP mux, send RTCP over the RTP
-  // transport.
-  if (!rtp_transport_->IsWritable(rtcp)) {
-    return false;
-  }
-
-  // Protect ourselves against crazy data.
-  if (!ValidPacket(rtcp, packet)) {
-    LOG(LS_ERROR) << "Dropping outgoing " << content_name_ << " "
-                  << RtpRtcpStringLiteral(rtcp)
-                  << " packet: wrong size=" << packet->size();
-    return false;
-  }
-
-  if (!srtp_active()) {
-    if (srtp_required_) {
-      // The audio/video engines may attempt to send RTCP packets as soon as the
-      // streams are created, so don't treat this as an error for RTCP.
-      // See: https://bugs.chromium.org/p/webrtc/issues/detail?id=6809
-      if (rtcp) {
-        return false;
-      }
-      // However, there shouldn't be any RTP packets sent before SRTP is set up
-      // (and SetSend(true) is called).
-      LOG(LS_ERROR) << "Can't send outgoing RTP packet when SRTP is inactive"
-                    << " and crypto is required";
-      RTC_NOTREACHED();
-      return false;
-    }
-    // Bon voyage.
-    return rtcp ? rtp_transport_->SendRtcpPacket(packet, options, PF_NORMAL)
-                : rtp_transport_->SendRtpPacket(packet, options, PF_NORMAL);
-  }
-  RTC_DCHECK(srtp_transport_);
-  RTC_DCHECK(srtp_transport_->IsActive());
-  // Bon voyage.
-  return rtcp ? srtp_transport_->SendRtcpPacket(packet, options, PF_SRTP_BYPASS)
-              : srtp_transport_->SendRtpPacket(packet, options, PF_SRTP_BYPASS);
-}
-
-bool BaseChannel::HandlesPayloadType(int packet_type) const {
-  return rtp_transport_->HandlesPayloadType(packet_type);
-}
-
-void BaseChannel::OnPacketReceived(bool rtcp,
-                                   rtc::CopyOnWriteBuffer* packet,
-                                   const rtc::PacketTime& packet_time) {
-  if (!has_received_packet_ && !rtcp) {
-    has_received_packet_ = true;
-    signaling_thread()->Post(RTC_FROM_HERE, this, MSG_FIRSTPACKETRECEIVED);
-  }
-
-  if (!srtp_active() && srtp_required_) {
-    // Our session description indicates that SRTP is required, but we got a
-    // packet before our SRTP filter is active. This means either that
-    // a) we got SRTP packets before we received the SDES keys, in which case
-    //    we can't decrypt it anyway, or
-    // b) we got SRTP packets before DTLS completed on both the RTP and RTCP
-    //    transports, so we haven't yet extracted keys, even if DTLS did
-    //    complete on the transport that the packets are being sent on. It's
-    //    really good practice to wait for both RTP and RTCP to be good to go
-    //    before sending  media, to prevent weird failure modes, so it's fine
-    //    for us to just eat packets here. This is all sidestepped if RTCP mux
-    //    is used anyway.
-    LOG(LS_WARNING) << "Can't process incoming " << RtpRtcpStringLiteral(rtcp)
-                    << " packet when SRTP is inactive and crypto is required";
-    return;
-  }
-
-  invoker_.AsyncInvoke<void>(
-      RTC_FROM_HERE, worker_thread_,
-      Bind(&BaseChannel::ProcessPacket, this, rtcp, *packet, packet_time));
-}
-
-void BaseChannel::ProcessPacket(bool rtcp,
-                                const rtc::CopyOnWriteBuffer& packet,
-                                const rtc::PacketTime& packet_time) {
-  RTC_DCHECK(worker_thread_->IsCurrent());
-
-  // Need to copy variable because OnRtcpReceived/OnPacketReceived
-  // requires non-const pointer to buffer. This doesn't memcpy the actual data.
-  rtc::CopyOnWriteBuffer data(packet);
-  if (rtcp) {
-    media_channel_->OnRtcpReceived(&data, packet_time);
-  } else {
-    media_channel_->OnPacketReceived(&data, packet_time);
-  }
-}
-
-void BaseChannel::EnableMedia_w() {
-  RTC_DCHECK(worker_thread_ == rtc::Thread::Current());
-  if (enabled_)
-    return;
-
-  LOG(LS_INFO) << "Channel enabled";
-  enabled_ = true;
-  UpdateMediaSendRecvState_w();
-}
-
-void BaseChannel::DisableMedia_w() {
-  RTC_DCHECK(worker_thread_ == rtc::Thread::Current());
-  if (!enabled_)
-    return;
-
-  LOG(LS_INFO) << "Channel disabled";
-  enabled_ = false;
-  UpdateMediaSendRecvState_w();
-}
-
-void BaseChannel::UpdateWritableState_n() {
-  rtc::PacketTransportInternal* rtp_packet_transport =
-      rtp_transport_->rtp_packet_transport();
-  rtc::PacketTransportInternal* rtcp_packet_transport =
-      rtp_transport_->rtcp_packet_transport();
-  if (rtp_packet_transport && rtp_packet_transport->writable() &&
-      (!rtcp_packet_transport || rtcp_packet_transport->writable())) {
-    ChannelWritable_n();
-  } else {
-    ChannelNotWritable_n();
-  }
-}
-
-void BaseChannel::ChannelWritable_n() {
-  RTC_DCHECK(network_thread_->IsCurrent());
-  if (writable_) {
-    return;
-  }
-
-  LOG(LS_INFO) << "Channel writable (" << content_name_ << ")"
-               << (was_ever_writable_ ? "" : " for the first time");
-
-  if (selected_candidate_pair_)
-    LOG(LS_INFO)
-        << "Using "
-        << selected_candidate_pair_->local_candidate().ToSensitiveString()
-        << "->"
-        << selected_candidate_pair_->remote_candidate().ToSensitiveString();
-
-  was_ever_writable_ = true;
-  MaybeSetupDtlsSrtp_n();
-  writable_ = true;
-  UpdateMediaSendRecvState();
-}
-
-void BaseChannel::SignalDtlsSrtpSetupFailure_n(bool rtcp) {
-  RTC_DCHECK(network_thread_->IsCurrent());
-  invoker_.AsyncInvoke<void>(
-      RTC_FROM_HERE, signaling_thread(),
-      Bind(&BaseChannel::SignalDtlsSrtpSetupFailure_s, this, rtcp));
-}
-
-void BaseChannel::SignalDtlsSrtpSetupFailure_s(bool rtcp) {
-  RTC_DCHECK(signaling_thread() == rtc::Thread::Current());
-  SignalDtlsSrtpSetupFailure(this, rtcp);
-}
-
-bool BaseChannel::ShouldSetupDtlsSrtp_n() const {
-  // Since DTLS is applied to all transports, checking RTP should be enough.
-  return rtp_dtls_transport_ && rtp_dtls_transport_->IsDtlsActive();
-}
-
-// This function returns true if either DTLS-SRTP is not in use
-// *or* DTLS-SRTP is successfully set up.
-bool BaseChannel::SetupDtlsSrtp_n(bool rtcp) {
-  RTC_DCHECK(network_thread_->IsCurrent());
-  bool ret = false;
-
-  DtlsTransportInternal* transport =
-      rtcp ? rtcp_dtls_transport_ : rtp_dtls_transport_;
-  RTC_DCHECK(transport);
-  RTC_DCHECK(transport->IsDtlsActive());
-
-  int selected_crypto_suite;
-
-  if (!transport->GetSrtpCryptoSuite(&selected_crypto_suite)) {
-    LOG(LS_ERROR) << "No DTLS-SRTP selected crypto suite";
-    return false;
-  }
-
-  LOG(LS_INFO) << "Installing keys from DTLS-SRTP on " << content_name() << " "
-               << RtpRtcpStringLiteral(rtcp);
-
-  int key_len;
-  int salt_len;
-  if (!rtc::GetSrtpKeyAndSaltLengths(selected_crypto_suite, &key_len,
-      &salt_len)) {
-    LOG(LS_ERROR) << "Unknown DTLS-SRTP crypto suite" << selected_crypto_suite;
-    return false;
-  }
-
-  // OK, we're now doing DTLS (RFC 5764)
-  std::vector<unsigned char> dtls_buffer(key_len * 2 + salt_len * 2);
-
-  // RFC 5705 exporter using the RFC 5764 parameters
-  if (!transport->ExportKeyingMaterial(kDtlsSrtpExporterLabel, NULL, 0, false,
-                                       &dtls_buffer[0], dtls_buffer.size())) {
-    LOG(LS_WARNING) << "DTLS-SRTP key export failed";
-    RTC_NOTREACHED();  // This should never happen
-    return false;
-  }
-
-  // Sync up the keys with the DTLS-SRTP interface
-  std::vector<unsigned char> client_write_key(key_len + salt_len);
-  std::vector<unsigned char> server_write_key(key_len + salt_len);
-  size_t offset = 0;
-  memcpy(&client_write_key[0], &dtls_buffer[offset], key_len);
-  offset += key_len;
-  memcpy(&server_write_key[0], &dtls_buffer[offset], key_len);
-  offset += key_len;
-  memcpy(&client_write_key[key_len], &dtls_buffer[offset], salt_len);
-  offset += salt_len;
-  memcpy(&server_write_key[key_len], &dtls_buffer[offset], salt_len);
-
-  std::vector<unsigned char> *send_key, *recv_key;
-  rtc::SSLRole role;
-  if (!transport->GetSslRole(&role)) {
-    LOG(LS_WARNING) << "GetSslRole failed";
-    return false;
-  }
-
-  if (role == rtc::SSL_SERVER) {
-    send_key = &server_write_key;
-    recv_key = &client_write_key;
-  } else {
-    send_key = &client_write_key;
-    recv_key = &server_write_key;
-  }
-
-  if (rtcp) {
-    if (!dtls_active()) {
-      RTC_DCHECK(srtp_transport_);
-      ret = srtp_transport_->SetRtcpParams(
-          selected_crypto_suite, &(*send_key)[0],
-          static_cast<int>(send_key->size()), selected_crypto_suite,
-          &(*recv_key)[0], static_cast<int>(recv_key->size()));
-    } else {
-      // RTCP doesn't need to call SetRtpParam because it is only used
-      // to make the updated encrypted RTP header extension IDs take effect.
-      ret = true;
-    }
-  } else {
-    RTC_DCHECK(srtp_transport_);
-    ret = srtp_transport_->SetRtpParams(selected_crypto_suite, &(*send_key)[0],
-                                        static_cast<int>(send_key->size()),
-                                        selected_crypto_suite, &(*recv_key)[0],
-                                        static_cast<int>(recv_key->size()));
-    dtls_active_ = ret;
-  }
-
-  if (!ret) {
-    LOG(LS_WARNING) << "DTLS-SRTP key installation failed";
-  } else {
-    UpdateTransportOverhead();
-  }
-  return ret;
-}
-
-void BaseChannel::MaybeSetupDtlsSrtp_n() {
-  if (dtls_active()) {
-    return;
-  }
-
-  if (!ShouldSetupDtlsSrtp_n()) {
-    return;
-  }
-
-  if (!srtp_transport_) {
-    EnableSrtpTransport_n();
-  }
-
-  if (!SetupDtlsSrtp_n(false)) {
-    SignalDtlsSrtpSetupFailure_n(false);
-    return;
-  }
-
-  if (rtcp_dtls_transport_) {
-    if (!SetupDtlsSrtp_n(true)) {
-      SignalDtlsSrtpSetupFailure_n(true);
-      return;
-    }
-  }
-}
-
-void BaseChannel::ChannelNotWritable_n() {
-  RTC_DCHECK(network_thread_->IsCurrent());
-  if (!writable_)
-    return;
-
-  LOG(LS_INFO) << "Channel not writable (" << content_name_ << ")";
-  writable_ = false;
-  UpdateMediaSendRecvState();
-}
-
-bool BaseChannel::SetRtpTransportParameters(
-    const MediaContentDescription* content,
-    ContentAction action,
-    ContentSource src,
-    const RtpHeaderExtensions& extensions,
-    std::string* error_desc) {
-  if (action == CA_UPDATE) {
-    // These parameters never get changed by a CA_UDPATE.
-    return true;
-  }
-
-  std::vector<int> encrypted_extension_ids;
-  for (const webrtc::RtpExtension& extension : extensions) {
-    if (extension.encrypt) {
-      LOG(LS_INFO) << "Using " << (src == CS_LOCAL ? "local" : "remote")
-          << " encrypted extension: " << extension.ToString();
-      encrypted_extension_ids.push_back(extension.id);
-    }
-  }
-
-  // Cache srtp_required_ for belt and suspenders check on SendPacket
-  return network_thread_->Invoke<bool>(
-      RTC_FROM_HERE, Bind(&BaseChannel::SetRtpTransportParameters_n, this,
-                          content, action, src, encrypted_extension_ids,
-                          error_desc));
-}
-
-bool BaseChannel::SetRtpTransportParameters_n(
-    const MediaContentDescription* content,
-    ContentAction action,
-    ContentSource src,
-    const std::vector<int>& encrypted_extension_ids,
-    std::string* error_desc) {
-  RTC_DCHECK(network_thread_->IsCurrent());
-
-  if (!SetSrtp_n(content->cryptos(), action, src, encrypted_extension_ids,
-      error_desc)) {
-    return false;
-  }
-
-  if (!SetRtcpMux_n(content->rtcp_mux(), action, src, error_desc)) {
-    return false;
-  }
-
-  return true;
-}
-
-// |dtls| will be set to true if DTLS is active for transport and crypto is
-// empty.
-bool BaseChannel::CheckSrtpConfig_n(const std::vector<CryptoParams>& cryptos,
-                                    bool* dtls,
-                                    std::string* error_desc) {
-  *dtls = rtp_dtls_transport_ && rtp_dtls_transport_->IsDtlsActive();
-  if (*dtls && !cryptos.empty()) {
-    SafeSetError("Cryptos must be empty when DTLS is active.", error_desc);
-    return false;
-  }
-  return true;
-}
-
-void BaseChannel::EnableSrtpTransport_n() {
-  if (srtp_transport_ == nullptr) {
-    rtp_transport_->SignalReadyToSend.disconnect(this);
-    rtp_transport_->SignalPacketReceived.disconnect(this);
-
-    auto transport = rtc::MakeUnique<webrtc::SrtpTransport>(
-        std::move(rtp_transport_), content_name_);
-    srtp_transport_ = transport.get();
-    rtp_transport_ = std::move(transport);
-
-    rtp_transport_->SignalReadyToSend.connect(
-        this, &BaseChannel::OnTransportReadyToSend);
-    rtp_transport_->SignalPacketReceived.connect(
-        this, &BaseChannel::OnPacketReceived);
-    LOG(LS_INFO) << "Wrapping RtpTransport in SrtpTransport.";
-  }
-}
-
-bool BaseChannel::SetSrtp_n(const std::vector<CryptoParams>& cryptos,
-                            ContentAction action,
-                            ContentSource src,
-                            const std::vector<int>& encrypted_extension_ids,
-                            std::string* error_desc) {
-  TRACE_EVENT0("webrtc", "BaseChannel::SetSrtp_w");
-  if (action == CA_UPDATE) {
-    // no crypto params.
-    return true;
-  }
-  bool ret = false;
-  bool dtls = false;
-  ret = CheckSrtpConfig_n(cryptos, &dtls, error_desc);
-  if (!ret) {
-    return false;
-  }
-
-  // If SRTP was not required, but we're setting a description that uses SDES,
-  // we need to upgrade to an SrtpTransport.
-  if (!srtp_transport_ && !dtls && !cryptos.empty()) {
-    EnableSrtpTransport_n();
-  }
-  if (srtp_transport_) {
-    srtp_transport_->SetEncryptedHeaderExtensionIds(src,
-                                                    encrypted_extension_ids);
-  }
-  switch (action) {
-    case CA_OFFER:
-      // If DTLS is already active on the channel, we could be renegotiating
-      // here. We don't update the srtp filter.
-      if (!dtls) {
-        ret = sdes_negotiator_.SetOffer(cryptos, src);
-      }
-      break;
-    case CA_PRANSWER:
-      // If we're doing DTLS-SRTP, we don't want to update the filter
-      // with an answer, because we already have SRTP parameters.
-      if (!dtls) {
-        ret = sdes_negotiator_.SetProvisionalAnswer(cryptos, src);
-      }
-      break;
-    case CA_ANSWER:
-      // If we're doing DTLS-SRTP, we don't want to update the filter
-      // with an answer, because we already have SRTP parameters.
-      if (!dtls) {
-        ret = sdes_negotiator_.SetAnswer(cryptos, src);
-      }
-      break;
-    default:
-      break;
-  }
-
-  // If setting an SDES answer succeeded, apply the negotiated parameters
-  // to the SRTP transport.
-  if ((action == CA_PRANSWER || action == CA_ANSWER) && !dtls && ret) {
-    if (sdes_negotiator_.send_cipher_suite() &&
-        sdes_negotiator_.recv_cipher_suite()) {
-      ret = srtp_transport_->SetRtpParams(
-          *(sdes_negotiator_.send_cipher_suite()),
-          sdes_negotiator_.send_key().data(),
-          static_cast<int>(sdes_negotiator_.send_key().size()),
-          *(sdes_negotiator_.recv_cipher_suite()),
-          sdes_negotiator_.recv_key().data(),
-          static_cast<int>(sdes_negotiator_.recv_key().size()));
-    } else {
-      LOG(LS_INFO) << "No crypto keys are provided for SDES.";
-      if (action == CA_ANSWER && srtp_transport_) {
-        // Explicitly reset the |srtp_transport_| if no crypto param is
-        // provided in the answer. No need to call |ResetParams()| for
-        // |sdes_negotiator_| because it resets the params inside |SetAnswer|.
-        srtp_transport_->ResetParams();
-      }
-    }
-  }
-
-  // Only update SRTP filter if using DTLS. SDES is handled internally
-  // by the SRTP filter.
-  // TODO(jbauch): Only update if encrypted extension ids have changed.
-  if (ret && dtls_active() && rtp_dtls_transport_ &&
-      rtp_dtls_transport_->dtls_state() == DTLS_TRANSPORT_CONNECTED) {
-    bool rtcp = false;
-    ret = SetupDtlsSrtp_n(rtcp);
-  }
-  if (!ret) {
-    SafeSetError("Failed to setup SRTP filter.", error_desc);
-    return false;
-  }
-  return true;
-}
-
-bool BaseChannel::SetRtcpMux_n(bool enable,
-                               ContentAction action,
-                               ContentSource src,
-                               std::string* error_desc) {
-  // Provide a more specific error message for the RTCP mux "require" policy
-  // case.
-  if (rtcp_mux_required_ && !enable) {
-    SafeSetError(
-        "rtcpMuxPolicy is 'require', but media description does not "
-        "contain 'a=rtcp-mux'.",
-        error_desc);
-    return false;
-  }
-  bool ret = false;
-  switch (action) {
-    case CA_OFFER:
-      ret = rtcp_mux_filter_.SetOffer(enable, src);
-      break;
-    case CA_PRANSWER:
-      // This may activate RTCP muxing, but we don't yet destroy the transport
-      // because the final answer may deactivate it.
-      ret = rtcp_mux_filter_.SetProvisionalAnswer(enable, src);
-      break;
-    case CA_ANSWER:
-      ret = rtcp_mux_filter_.SetAnswer(enable, src);
-      if (ret && rtcp_mux_filter_.IsActive()) {
-        // We permanently activated RTCP muxing; signal that we no longer need
-        // the RTCP transport.
-        std::string debug_name =
-            transport_name_.empty()
-                ? rtp_transport_->rtp_packet_transport()->debug_name()
-                : transport_name_;
-        LOG(LS_INFO) << "Enabling rtcp-mux for " << content_name()
-                     << "; no longer need RTCP transport for " << debug_name;
-        if (rtp_transport_->rtcp_packet_transport()) {
-          SetTransport_n(true, nullptr, nullptr);
-          SignalRtcpMuxFullyActive(transport_name_);
-        }
-        UpdateWritableState_n();
-      }
-      break;
-    case CA_UPDATE:
-      // No RTCP mux info.
-      ret = true;
-      break;
-    default:
-      break;
-  }
-  if (!ret) {
-    SafeSetError("Failed to setup RTCP mux filter.", error_desc);
-    return false;
-  }
-  rtp_transport_->SetRtcpMuxEnabled(rtcp_mux_filter_.IsActive());
-  // |rtcp_mux_filter_| can be active if |action| is CA_PRANSWER or
-  // CA_ANSWER, but we only want to tear down the RTCP transport if we received
-  // a final answer.
-  if (rtcp_mux_filter_.IsActive()) {
-    // If the RTP transport is already writable, then so are we.
-    if (rtp_transport_->rtp_packet_transport()->writable()) {
-      ChannelWritable_n();
-    }
-  }
-
-  return true;
-}
-
-bool BaseChannel::AddRecvStream_w(const StreamParams& sp) {
-  RTC_DCHECK(worker_thread() == rtc::Thread::Current());
-  return media_channel()->AddRecvStream(sp);
-}
-
-bool BaseChannel::RemoveRecvStream_w(uint32_t ssrc) {
-  RTC_DCHECK(worker_thread() == rtc::Thread::Current());
-  return media_channel()->RemoveRecvStream(ssrc);
-}
-
-bool BaseChannel::UpdateLocalStreams_w(const std::vector<StreamParams>& streams,
-                                       ContentAction action,
-                                       std::string* error_desc) {
-  if (!(action == CA_OFFER || action == CA_ANSWER ||
-        action == CA_PRANSWER || action == CA_UPDATE))
-    return false;
-
-  // If this is an update, streams only contain streams that have changed.
-  if (action == CA_UPDATE) {
-    for (StreamParamsVec::const_iterator it = streams.begin();
-         it != streams.end(); ++it) {
-      const StreamParams* existing_stream =
-          GetStreamByIds(local_streams_, it->groupid, it->id);
-      if (!existing_stream && it->has_ssrcs()) {
-        if (media_channel()->AddSendStream(*it)) {
-          local_streams_.push_back(*it);
-          LOG(LS_INFO) << "Add send stream ssrc: " << it->first_ssrc();
-        } else {
-          std::ostringstream desc;
-          desc << "Failed to add send stream ssrc: " << it->first_ssrc();
-          SafeSetError(desc.str(), error_desc);
-          return false;
-        }
-      } else if (existing_stream && !it->has_ssrcs()) {
-        if (!media_channel()->RemoveSendStream(existing_stream->first_ssrc())) {
-          std::ostringstream desc;
-          desc << "Failed to remove send stream with ssrc "
-               << it->first_ssrc() << ".";
-          SafeSetError(desc.str(), error_desc);
-          return false;
-        }
-        RemoveStreamBySsrc(&local_streams_, existing_stream->first_ssrc());
-      } else {
-        LOG(LS_WARNING) << "Ignore unsupported stream update";
-      }
-    }
-    return true;
-  }
-  // Else streams are all the streams we want to send.
-
-  // Check for streams that have been removed.
-  bool ret = true;
-  for (StreamParamsVec::const_iterator it = local_streams_.begin();
-       it != local_streams_.end(); ++it) {
-    if (!GetStreamBySsrc(streams, it->first_ssrc())) {
-      if (!media_channel()->RemoveSendStream(it->first_ssrc())) {
-        std::ostringstream desc;
-        desc << "Failed to remove send stream with ssrc "
-             << it->first_ssrc() << ".";
-        SafeSetError(desc.str(), error_desc);
-        ret = false;
-      }
-    }
-  }
-  // Check for new streams.
-  for (StreamParamsVec::const_iterator it = streams.begin();
-       it != streams.end(); ++it) {
-    if (!GetStreamBySsrc(local_streams_, it->first_ssrc())) {
-      if (media_channel()->AddSendStream(*it)) {
-        LOG(LS_INFO) << "Add send stream ssrc: " << it->ssrcs[0];
-      } else {
-        std::ostringstream desc;
-        desc << "Failed to add send stream ssrc: " << it->first_ssrc();
-        SafeSetError(desc.str(), error_desc);
-        ret = false;
-      }
-    }
-  }
-  local_streams_ = streams;
-  return ret;
-}
-
-bool BaseChannel::UpdateRemoteStreams_w(
-    const std::vector<StreamParams>& streams,
-    ContentAction action,
-    std::string* error_desc) {
-  if (!(action == CA_OFFER || action == CA_ANSWER ||
-        action == CA_PRANSWER || action == CA_UPDATE))
-    return false;
-
-  // If this is an update, streams only contain streams that have changed.
-  if (action == CA_UPDATE) {
-    for (StreamParamsVec::const_iterator it = streams.begin();
-         it != streams.end(); ++it) {
-      const StreamParams* existing_stream =
-          GetStreamByIds(remote_streams_, it->groupid, it->id);
-      if (!existing_stream && it->has_ssrcs()) {
-        if (AddRecvStream_w(*it)) {
-          remote_streams_.push_back(*it);
-          LOG(LS_INFO) << "Add remote stream ssrc: " << it->first_ssrc();
-        } else {
-          std::ostringstream desc;
-          desc << "Failed to add remote stream ssrc: " << it->first_ssrc();
-          SafeSetError(desc.str(), error_desc);
-          return false;
-        }
-      } else if (existing_stream && !it->has_ssrcs()) {
-        if (!RemoveRecvStream_w(existing_stream->first_ssrc())) {
-          std::ostringstream desc;
-          desc << "Failed to remove remote stream with ssrc "
-               << it->first_ssrc() << ".";
-          SafeSetError(desc.str(), error_desc);
-          return false;
-        }
-        RemoveStreamBySsrc(&remote_streams_, existing_stream->first_ssrc());
-      } else {
-        LOG(LS_WARNING) << "Ignore unsupported stream update."
-                        << " Stream exists? " << (existing_stream != nullptr)
-                        << " new stream = " << it->ToString();
-      }
-    }
-    return true;
-  }
-  // Else streams are all the streams we want to receive.
-
-  // Check for streams that have been removed.
-  bool ret = true;
-  for (StreamParamsVec::const_iterator it = remote_streams_.begin();
-       it != remote_streams_.end(); ++it) {
-    if (!GetStreamBySsrc(streams, it->first_ssrc())) {
-      if (!RemoveRecvStream_w(it->first_ssrc())) {
-        std::ostringstream desc;
-        desc << "Failed to remove remote stream with ssrc "
-             << it->first_ssrc() << ".";
-        SafeSetError(desc.str(), error_desc);
-        ret = false;
-      }
-    }
-  }
-  // Check for new streams.
-  for (StreamParamsVec::const_iterator it = streams.begin();
-      it != streams.end(); ++it) {
-    if (!GetStreamBySsrc(remote_streams_, it->first_ssrc())) {
-      if (AddRecvStream_w(*it)) {
-        LOG(LS_INFO) << "Add remote ssrc: " << it->ssrcs[0];
-      } else {
-        std::ostringstream desc;
-        desc << "Failed to add remote stream ssrc: " << it->first_ssrc();
-        SafeSetError(desc.str(), error_desc);
-        ret = false;
-      }
-    }
-  }
-  remote_streams_ = streams;
-  return ret;
-}
-
-RtpHeaderExtensions BaseChannel::GetFilteredRtpHeaderExtensions(
-    const RtpHeaderExtensions& extensions) {
-  if (!rtp_dtls_transport_ ||
-      !rtp_dtls_transport_->crypto_options()
-          .enable_encrypted_rtp_header_extensions) {
-    RtpHeaderExtensions filtered;
-    auto pred = [](const webrtc::RtpExtension& extension) {
-        return !extension.encrypt;
-    };
-    std::copy_if(extensions.begin(), extensions.end(),
-        std::back_inserter(filtered), pred);
-    return filtered;
-  }
-
-  return webrtc::RtpExtension::FilterDuplicateNonEncrypted(extensions);
-}
-
-void BaseChannel::MaybeCacheRtpAbsSendTimeHeaderExtension_w(
-    const std::vector<webrtc::RtpExtension>& extensions) {
-// Absolute Send Time extension id is used only with external auth,
-// so do not bother searching for it and making asyncronious call to set
-// something that is not used.
-#if defined(ENABLE_EXTERNAL_AUTH)
-  const webrtc::RtpExtension* send_time_extension =
-      webrtc::RtpExtension::FindHeaderExtensionByUri(
-          extensions, webrtc::RtpExtension::kAbsSendTimeUri);
-  int rtp_abs_sendtime_extn_id =
-      send_time_extension ? send_time_extension->id : -1;
-  invoker_.AsyncInvoke<void>(
-      RTC_FROM_HERE, network_thread_,
-      Bind(&BaseChannel::CacheRtpAbsSendTimeHeaderExtension_n, this,
-           rtp_abs_sendtime_extn_id));
-#endif
-}
-
-void BaseChannel::CacheRtpAbsSendTimeHeaderExtension_n(
-    int rtp_abs_sendtime_extn_id) {
-  if (srtp_transport_) {
-    srtp_transport_->CacheRtpAbsSendTimeHeaderExtension(
-        rtp_abs_sendtime_extn_id);
-  } else {
-    LOG(LS_WARNING) << "Trying to cache the Absolute Send Time extension id "
-                       "but the SRTP is not active.";
-  }
-}
-
-void BaseChannel::OnMessage(rtc::Message *pmsg) {
-  TRACE_EVENT0("webrtc", "BaseChannel::OnMessage");
-  switch (pmsg->message_id) {
-    case MSG_SEND_RTP_PACKET:
-    case MSG_SEND_RTCP_PACKET: {
-      RTC_DCHECK(network_thread_->IsCurrent());
-      SendPacketMessageData* data =
-          static_cast<SendPacketMessageData*>(pmsg->pdata);
-      bool rtcp = pmsg->message_id == MSG_SEND_RTCP_PACKET;
-      SendPacket(rtcp, &data->packet, data->options);
-      delete data;
-      break;
-    }
-    case MSG_FIRSTPACKETRECEIVED: {
-      SignalFirstPacketReceived(this);
-      break;
-    }
-  }
-}
-
-void BaseChannel::AddHandledPayloadType(int payload_type) {
-  rtp_transport_->AddHandledPayloadType(payload_type);
-}
-
-void BaseChannel::FlushRtcpMessages_n() {
-  // Flush all remaining RTCP messages. This should only be called in
-  // destructor.
-  RTC_DCHECK(network_thread_->IsCurrent());
-  rtc::MessageList rtcp_messages;
-  network_thread_->Clear(this, MSG_SEND_RTCP_PACKET, &rtcp_messages);
-  for (const auto& message : rtcp_messages) {
-    network_thread_->Send(RTC_FROM_HERE, this, MSG_SEND_RTCP_PACKET,
-                          message.pdata);
-  }
-}
-
-void BaseChannel::SignalSentPacket_n(
-    rtc::PacketTransportInternal* /* transport */,
-    const rtc::SentPacket& sent_packet) {
-  RTC_DCHECK(network_thread_->IsCurrent());
-  invoker_.AsyncInvoke<void>(
-      RTC_FROM_HERE, worker_thread_,
-      rtc::Bind(&BaseChannel::SignalSentPacket_w, this, sent_packet));
-}
-
-void BaseChannel::SignalSentPacket_w(const rtc::SentPacket& sent_packet) {
-  RTC_DCHECK(worker_thread_->IsCurrent());
-  SignalSentPacket(sent_packet);
-}
-
-VoiceChannel::VoiceChannel(rtc::Thread* worker_thread,
-                           rtc::Thread* network_thread,
-                           rtc::Thread* signaling_thread,
-                           MediaEngineInterface* media_engine,
-                           VoiceMediaChannel* media_channel,
-                           const std::string& content_name,
-                           bool rtcp_mux_required,
-                           bool srtp_required)
-    : BaseChannel(worker_thread,
-                  network_thread,
-                  signaling_thread,
-                  media_channel,
-                  content_name,
-                  rtcp_mux_required,
-                  srtp_required),
-      media_engine_(media_engine),
-      received_media_(false) {}
-
-VoiceChannel::~VoiceChannel() {
-  TRACE_EVENT0("webrtc", "VoiceChannel::~VoiceChannel");
-  StopAudioMonitor();
-  StopMediaMonitor();
-  // this can't be done in the base class, since it calls a virtual
-  DisableMedia_w();
-  Deinit();
-}
-
-bool VoiceChannel::SetAudioSend(uint32_t ssrc,
-                                bool enable,
-                                const AudioOptions* options,
-                                AudioSource* source) {
-  return InvokeOnWorker<bool>(
-      RTC_FROM_HERE, Bind(&VoiceMediaChannel::SetAudioSend, media_channel(),
-                          ssrc, enable, options, source));
-}
-
-// TODO(juberti): Handle early media the right way. We should get an explicit
-// ringing message telling us to start playing local ringback, which we cancel
-// if any early media actually arrives. For now, we do the opposite, which is
-// to wait 1 second for early media, and start playing local ringback if none
-// arrives.
-void VoiceChannel::SetEarlyMedia(bool enable) {
-  if (enable) {
-    // Start the early media timeout
-    worker_thread()->PostDelayed(RTC_FROM_HERE, kEarlyMediaTimeout, this,
-                                 MSG_EARLYMEDIATIMEOUT);
-  } else {
-    // Stop the timeout if currently going.
-    worker_thread()->Clear(this, MSG_EARLYMEDIATIMEOUT);
-  }
-}
-
-bool VoiceChannel::CanInsertDtmf() {
-  return InvokeOnWorker<bool>(
-      RTC_FROM_HERE, Bind(&VoiceMediaChannel::CanInsertDtmf, media_channel()));
-}
-
-bool VoiceChannel::InsertDtmf(uint32_t ssrc,
-                              int event_code,
-                              int duration) {
-  return InvokeOnWorker<bool>(
-      RTC_FROM_HERE,
-      Bind(&VoiceChannel::InsertDtmf_w, this, ssrc, event_code, duration));
-}
-
-bool VoiceChannel::SetOutputVolume(uint32_t ssrc, double volume) {
-  return InvokeOnWorker<bool>(
-      RTC_FROM_HERE,
-      Bind(&VoiceMediaChannel::SetOutputVolume, media_channel(), ssrc, volume));
-}
-
-void VoiceChannel::SetRawAudioSink(
-    uint32_t ssrc,
-    std::unique_ptr<webrtc::AudioSinkInterface> sink) {
-  // We need to work around Bind's lack of support for unique_ptr and ownership
-  // passing.  So we invoke to our own little routine that gets a pointer to
-  // our local variable.  This is OK since we're synchronously invoking.
-  InvokeOnWorker<bool>(RTC_FROM_HERE,
-                       Bind(&SetRawAudioSink_w, media_channel(), ssrc, &sink));
-}
-
-webrtc::RtpParameters VoiceChannel::GetRtpSendParameters(uint32_t ssrc) const {
-  return worker_thread()->Invoke<webrtc::RtpParameters>(
-      RTC_FROM_HERE, Bind(&VoiceChannel::GetRtpSendParameters_w, this, ssrc));
-}
-
-webrtc::RtpParameters VoiceChannel::GetRtpSendParameters_w(
-    uint32_t ssrc) const {
-  return media_channel()->GetRtpSendParameters(ssrc);
-}
-
-bool VoiceChannel::SetRtpSendParameters(
-    uint32_t ssrc,
-    const webrtc::RtpParameters& parameters) {
-  return InvokeOnWorker<bool>(
-      RTC_FROM_HERE,
-      Bind(&VoiceChannel::SetRtpSendParameters_w, this, ssrc, parameters));
-}
-
-bool VoiceChannel::SetRtpSendParameters_w(uint32_t ssrc,
-                                          webrtc::RtpParameters parameters) {
-  return media_channel()->SetRtpSendParameters(ssrc, parameters);
-}
-
-webrtc::RtpParameters VoiceChannel::GetRtpReceiveParameters(
-    uint32_t ssrc) const {
-  return worker_thread()->Invoke<webrtc::RtpParameters>(
-      RTC_FROM_HERE,
-      Bind(&VoiceChannel::GetRtpReceiveParameters_w, this, ssrc));
-}
-
-webrtc::RtpParameters VoiceChannel::GetRtpReceiveParameters_w(
-    uint32_t ssrc) const {
-  return media_channel()->GetRtpReceiveParameters(ssrc);
-}
-
-bool VoiceChannel::SetRtpReceiveParameters(
-    uint32_t ssrc,
-    const webrtc::RtpParameters& parameters) {
-  return InvokeOnWorker<bool>(
-      RTC_FROM_HERE,
-      Bind(&VoiceChannel::SetRtpReceiveParameters_w, this, ssrc, parameters));
-}
-
-bool VoiceChannel::SetRtpReceiveParameters_w(uint32_t ssrc,
-                                             webrtc::RtpParameters parameters) {
-  return media_channel()->SetRtpReceiveParameters(ssrc, parameters);
-}
-
-bool VoiceChannel::GetStats(VoiceMediaInfo* stats) {
-  return InvokeOnWorker<bool>(RTC_FROM_HERE, Bind(&VoiceMediaChannel::GetStats,
-                                                  media_channel(), stats));
-}
-
-std::vector<webrtc::RtpSource> VoiceChannel::GetSources(uint32_t ssrc) const {
-  return worker_thread()->Invoke<std::vector<webrtc::RtpSource>>(
-      RTC_FROM_HERE, Bind(&VoiceChannel::GetSources_w, this, ssrc));
-}
-
-std::vector<webrtc::RtpSource> VoiceChannel::GetSources_w(uint32_t ssrc) const {
-  RTC_DCHECK(worker_thread()->IsCurrent());
-  return media_channel()->GetSources(ssrc);
-}
-
-void VoiceChannel::StartMediaMonitor(int cms) {
-  media_monitor_.reset(new VoiceMediaMonitor(media_channel(), worker_thread(),
-      rtc::Thread::Current()));
-  media_monitor_->SignalUpdate.connect(
-      this, &VoiceChannel::OnMediaMonitorUpdate);
-  media_monitor_->Start(cms);
-}
-
-void VoiceChannel::StopMediaMonitor() {
-  if (media_monitor_) {
-    media_monitor_->Stop();
-    media_monitor_->SignalUpdate.disconnect(this);
-    media_monitor_.reset();
-  }
-}
-
-void VoiceChannel::StartAudioMonitor(int cms) {
-  audio_monitor_.reset(new AudioMonitor(this, rtc::Thread::Current()));
-  audio_monitor_
-    ->SignalUpdate.connect(this, &VoiceChannel::OnAudioMonitorUpdate);
-  audio_monitor_->Start(cms);
-}
-
-void VoiceChannel::StopAudioMonitor() {
-  if (audio_monitor_) {
-    audio_monitor_->Stop();
-    audio_monitor_.reset();
-  }
-}
-
-bool VoiceChannel::IsAudioMonitorRunning() const {
-  return (audio_monitor_.get() != NULL);
-}
-
-int VoiceChannel::GetInputLevel_w() {
-  return media_engine_->GetInputLevel();
-}
-
-int VoiceChannel::GetOutputLevel_w() {
-  return media_channel()->GetOutputLevel();
-}
-
-void VoiceChannel::GetActiveStreams_w(AudioInfo::StreamList* actives) {
-  media_channel()->GetActiveStreams(actives);
-}
-
-void VoiceChannel::OnPacketReceived(bool rtcp,
-                                    rtc::CopyOnWriteBuffer* packet,
-                                    const rtc::PacketTime& packet_time) {
-  BaseChannel::OnPacketReceived(rtcp, packet, packet_time);
-  // Set a flag when we've received an RTP packet. If we're waiting for early
-  // media, this will disable the timeout.
-  if (!received_media_ && !rtcp) {
-    received_media_ = true;
-  }
-}
-
-void BaseChannel::UpdateMediaSendRecvState() {
-  RTC_DCHECK(network_thread_->IsCurrent());
-  invoker_.AsyncInvoke<void>(
-      RTC_FROM_HERE, worker_thread_,
-      Bind(&BaseChannel::UpdateMediaSendRecvState_w, this));
-}
-
-int BaseChannel::GetTransportOverheadPerPacket() const {
-  RTC_DCHECK(network_thread_->IsCurrent());
-
-  if (!selected_candidate_pair_)
-    return 0;
-
-  int transport_overhead_per_packet = 0;
-
-  constexpr int kIpv4Overhaed = 20;
-  constexpr int kIpv6Overhaed = 40;
-  transport_overhead_per_packet +=
-      selected_candidate_pair_->local_candidate().address().family() == AF_INET
-          ? kIpv4Overhaed
-          : kIpv6Overhaed;
-
-  constexpr int kUdpOverhaed = 8;
-  constexpr int kTcpOverhaed = 20;
-  transport_overhead_per_packet +=
-      selected_candidate_pair_->local_candidate().protocol() ==
-              TCP_PROTOCOL_NAME
-          ? kTcpOverhaed
-          : kUdpOverhaed;
-
-  if (sdes_active()) {
-    int srtp_overhead = 0;
-    if (srtp_transport_->GetSrtpOverhead(&srtp_overhead))
-      transport_overhead_per_packet += srtp_overhead;
-  }
-
-  return transport_overhead_per_packet;
-}
-
-void BaseChannel::UpdateTransportOverhead() {
-  int transport_overhead_per_packet = GetTransportOverheadPerPacket();
-  if (transport_overhead_per_packet)
-    invoker_.AsyncInvoke<void>(
-        RTC_FROM_HERE, worker_thread_,
-        Bind(&MediaChannel::OnTransportOverheadChanged, media_channel_,
-             transport_overhead_per_packet));
-}
-
-void VoiceChannel::UpdateMediaSendRecvState_w() {
-  // Render incoming data if we're the active call, and we have the local
-  // content. We receive data on the default channel and multiplexed streams.
-  bool recv = IsReadyToReceiveMedia_w();
-  media_channel()->SetPlayout(recv);
-
-  // Send outgoing data if we're the active call, we have the remote content,
-  // and we have had some form of connectivity.
-  bool send = IsReadyToSendMedia_w();
-  media_channel()->SetSend(send);
-
-  LOG(LS_INFO) << "Changing voice state, recv=" << recv << " send=" << send;
-}
-
-bool VoiceChannel::SetLocalContent_w(const MediaContentDescription* content,
-                                     ContentAction action,
-                                     std::string* error_desc) {
-  TRACE_EVENT0("webrtc", "VoiceChannel::SetLocalContent_w");
-  RTC_DCHECK(worker_thread() == rtc::Thread::Current());
-  LOG(LS_INFO) << "Setting local voice description";
-
-  const AudioContentDescription* audio =
-      static_cast<const AudioContentDescription*>(content);
-  RTC_DCHECK(audio != NULL);
-  if (!audio) {
-    SafeSetError("Can't find audio content in local description.", error_desc);
-    return false;
-  }
-
-  RtpHeaderExtensions rtp_header_extensions =
-      GetFilteredRtpHeaderExtensions(audio->rtp_header_extensions());
-
-  if (!SetRtpTransportParameters(content, action, CS_LOCAL,
-      rtp_header_extensions, error_desc)) {
-    return false;
-  }
-
-  AudioRecvParameters recv_params = last_recv_params_;
-  RtpParametersFromMediaDescription(audio, rtp_header_extensions, &recv_params);
-  if (!media_channel()->SetRecvParameters(recv_params)) {
-    SafeSetError("Failed to set local audio description recv parameters.",
-                 error_desc);
-    return false;
-  }
-  for (const AudioCodec& codec : audio->codecs()) {
-    AddHandledPayloadType(codec.id);
-  }
-  last_recv_params_ = recv_params;
-
-  // TODO(pthatcher): Move local streams into AudioSendParameters, and
-  // only give it to the media channel once we have a remote
-  // description too (without a remote description, we won't be able
-  // to send them anyway).
-  if (!UpdateLocalStreams_w(audio->streams(), action, error_desc)) {
-    SafeSetError("Failed to set local audio description streams.", error_desc);
-    return false;
-  }
-
-  set_local_content_direction(content->direction());
-  UpdateMediaSendRecvState_w();
-  return true;
-}
-
-bool VoiceChannel::SetRemoteContent_w(const MediaContentDescription* content,
-                                      ContentAction action,
-                                      std::string* error_desc) {
-  TRACE_EVENT0("webrtc", "VoiceChannel::SetRemoteContent_w");
-  RTC_DCHECK(worker_thread() == rtc::Thread::Current());
-  LOG(LS_INFO) << "Setting remote voice description";
-
-  const AudioContentDescription* audio =
-      static_cast<const AudioContentDescription*>(content);
-  RTC_DCHECK(audio != NULL);
-  if (!audio) {
-    SafeSetError("Can't find audio content in remote description.", error_desc);
-    return false;
-  }
-
-  RtpHeaderExtensions rtp_header_extensions =
-      GetFilteredRtpHeaderExtensions(audio->rtp_header_extensions());
-
-  if (!SetRtpTransportParameters(content, action, CS_REMOTE,
-      rtp_header_extensions, error_desc)) {
-    return false;
-  }
-
-  AudioSendParameters send_params = last_send_params_;
-  RtpSendParametersFromMediaDescription(audio, rtp_header_extensions,
-      &send_params);
-  if (audio->agc_minus_10db()) {
-    send_params.options.adjust_agc_delta = rtc::Optional<int>(kAgcMinus10db);
-  }
-
-  bool parameters_applied = media_channel()->SetSendParameters(send_params);
-  if (!parameters_applied) {
-    SafeSetError("Failed to set remote audio description send parameters.",
-                 error_desc);
-    return false;
-  }
-  last_send_params_ = send_params;
-
-  // TODO(pthatcher): Move remote streams into AudioRecvParameters,
-  // and only give it to the media channel once we have a local
-  // description too (without a local description, we won't be able to
-  // recv them anyway).
-  if (!UpdateRemoteStreams_w(audio->streams(), action, error_desc)) {
-    SafeSetError("Failed to set remote audio description streams.", error_desc);
-    return false;
-  }
-
-  if (audio->rtp_header_extensions_set()) {
-    MaybeCacheRtpAbsSendTimeHeaderExtension_w(rtp_header_extensions);
-  }
-
-  set_remote_content_direction(content->direction());
-  UpdateMediaSendRecvState_w();
-  return true;
-}
-
-void VoiceChannel::HandleEarlyMediaTimeout() {
-  // This occurs on the main thread, not the worker thread.
-  if (!received_media_) {
-    LOG(LS_INFO) << "No early media received before timeout";
-    SignalEarlyMediaTimeout(this);
-  }
-}
-
-bool VoiceChannel::InsertDtmf_w(uint32_t ssrc,
-                                int event,
-                                int duration) {
-  if (!enabled()) {
-    return false;
-  }
-  return media_channel()->InsertDtmf(ssrc, event, duration);
-}
-
-void VoiceChannel::OnMessage(rtc::Message *pmsg) {
-  switch (pmsg->message_id) {
-    case MSG_EARLYMEDIATIMEOUT:
-      HandleEarlyMediaTimeout();
-      break;
-    case MSG_CHANNEL_ERROR: {
-      VoiceChannelErrorMessageData* data =
-          static_cast<VoiceChannelErrorMessageData*>(pmsg->pdata);
-      delete data;
-      break;
-    }
-    default:
-      BaseChannel::OnMessage(pmsg);
-      break;
-  }
-}
-
-void VoiceChannel::OnConnectionMonitorUpdate(
-    ConnectionMonitor* monitor, const std::vector<ConnectionInfo>& infos) {
-  SignalConnectionMonitor(this, infos);
-}
-
-void VoiceChannel::OnMediaMonitorUpdate(
-    VoiceMediaChannel* media_channel, const VoiceMediaInfo& info) {
-  RTC_DCHECK(media_channel == this->media_channel());
-  SignalMediaMonitor(this, info);
-}
-
-void VoiceChannel::OnAudioMonitorUpdate(AudioMonitor* monitor,
-                                        const AudioInfo& info) {
-  SignalAudioMonitor(this, info);
-}
-
-VideoChannel::VideoChannel(rtc::Thread* worker_thread,
-                           rtc::Thread* network_thread,
-                           rtc::Thread* signaling_thread,
-                           VideoMediaChannel* media_channel,
-                           const std::string& content_name,
-                           bool rtcp_mux_required,
-                           bool srtp_required)
-    : BaseChannel(worker_thread,
-                  network_thread,
-                  signaling_thread,
-                  media_channel,
-                  content_name,
-                  rtcp_mux_required,
-                  srtp_required) {}
-
-VideoChannel::~VideoChannel() {
-  TRACE_EVENT0("webrtc", "VideoChannel::~VideoChannel");
-  StopMediaMonitor();
-  // this can't be done in the base class, since it calls a virtual
-  DisableMedia_w();
-
-  Deinit();
-}
-
-bool VideoChannel::SetSink(uint32_t ssrc,
-                           rtc::VideoSinkInterface<webrtc::VideoFrame>* sink) {
-  worker_thread()->Invoke<void>(
-      RTC_FROM_HERE,
-      Bind(&VideoMediaChannel::SetSink, media_channel(), ssrc, sink));
-  return true;
-}
-
-bool VideoChannel::SetVideoSend(
-    uint32_t ssrc,
-    bool mute,
-    const VideoOptions* options,
-    rtc::VideoSourceInterface<webrtc::VideoFrame>* source) {
-  return InvokeOnWorker<bool>(
-      RTC_FROM_HERE, Bind(&VideoMediaChannel::SetVideoSend, media_channel(),
-                          ssrc, mute, options, source));
-}
-
-webrtc::RtpParameters VideoChannel::GetRtpSendParameters(uint32_t ssrc) const {
-  return worker_thread()->Invoke<webrtc::RtpParameters>(
-      RTC_FROM_HERE, Bind(&VideoChannel::GetRtpSendParameters_w, this, ssrc));
-}
-
-webrtc::RtpParameters VideoChannel::GetRtpSendParameters_w(
-    uint32_t ssrc) const {
-  return media_channel()->GetRtpSendParameters(ssrc);
-}
-
-bool VideoChannel::SetRtpSendParameters(
-    uint32_t ssrc,
-    const webrtc::RtpParameters& parameters) {
-  return InvokeOnWorker<bool>(
-      RTC_FROM_HERE,
-      Bind(&VideoChannel::SetRtpSendParameters_w, this, ssrc, parameters));
-}
-
-bool VideoChannel::SetRtpSendParameters_w(uint32_t ssrc,
-                                          webrtc::RtpParameters parameters) {
-  return media_channel()->SetRtpSendParameters(ssrc, parameters);
-}
-
-webrtc::RtpParameters VideoChannel::GetRtpReceiveParameters(
-    uint32_t ssrc) const {
-  return worker_thread()->Invoke<webrtc::RtpParameters>(
-      RTC_FROM_HERE,
-      Bind(&VideoChannel::GetRtpReceiveParameters_w, this, ssrc));
-}
-
-webrtc::RtpParameters VideoChannel::GetRtpReceiveParameters_w(
-    uint32_t ssrc) const {
-  return media_channel()->GetRtpReceiveParameters(ssrc);
-}
-
-bool VideoChannel::SetRtpReceiveParameters(
-    uint32_t ssrc,
-    const webrtc::RtpParameters& parameters) {
-  return InvokeOnWorker<bool>(
-      RTC_FROM_HERE,
-      Bind(&VideoChannel::SetRtpReceiveParameters_w, this, ssrc, parameters));
-}
-
-bool VideoChannel::SetRtpReceiveParameters_w(uint32_t ssrc,
-                                             webrtc::RtpParameters parameters) {
-  return media_channel()->SetRtpReceiveParameters(ssrc, parameters);
-}
-
-void VideoChannel::UpdateMediaSendRecvState_w() {
-  // Send outgoing data if we're the active call, we have the remote content,
-  // and we have had some form of connectivity.
-  bool send = IsReadyToSendMedia_w();
-  if (!media_channel()->SetSend(send)) {
-    LOG(LS_ERROR) << "Failed to SetSend on video channel";
-    // TODO(gangji): Report error back to server.
-  }
-
-  LOG(LS_INFO) << "Changing video state, send=" << send;
-}
-
-void VideoChannel::FillBitrateInfo(BandwidthEstimationInfo* bwe_info) {
-  InvokeOnWorker<void>(RTC_FROM_HERE, Bind(&VideoMediaChannel::FillBitrateInfo,
-                                           media_channel(), bwe_info));
-}
-
-bool VideoChannel::GetStats(VideoMediaInfo* stats) {
-  return InvokeOnWorker<bool>(RTC_FROM_HERE, Bind(&VideoMediaChannel::GetStats,
-                                                  media_channel(), stats));
-}
-
-void VideoChannel::StartMediaMonitor(int cms) {
-  media_monitor_.reset(new VideoMediaMonitor(media_channel(), worker_thread(),
-      rtc::Thread::Current()));
-  media_monitor_->SignalUpdate.connect(
-      this, &VideoChannel::OnMediaMonitorUpdate);
-  media_monitor_->Start(cms);
-}
-
-void VideoChannel::StopMediaMonitor() {
-  if (media_monitor_) {
-    media_monitor_->Stop();
-    media_monitor_.reset();
-  }
-}
-
-bool VideoChannel::SetLocalContent_w(const MediaContentDescription* content,
-                                     ContentAction action,
-                                     std::string* error_desc) {
-  TRACE_EVENT0("webrtc", "VideoChannel::SetLocalContent_w");
-  RTC_DCHECK(worker_thread() == rtc::Thread::Current());
-  LOG(LS_INFO) << "Setting local video description";
-
-  const VideoContentDescription* video =
-      static_cast<const VideoContentDescription*>(content);
-  RTC_DCHECK(video != NULL);
-  if (!video) {
-    SafeSetError("Can't find video content in local description.", error_desc);
-    return false;
-  }
-
-  RtpHeaderExtensions rtp_header_extensions =
-      GetFilteredRtpHeaderExtensions(video->rtp_header_extensions());
-
-  if (!SetRtpTransportParameters(content, action, CS_LOCAL,
-      rtp_header_extensions, error_desc)) {
-    return false;
-  }
-
-  VideoRecvParameters recv_params = last_recv_params_;
-  RtpParametersFromMediaDescription(video, rtp_header_extensions, &recv_params);
-  if (!media_channel()->SetRecvParameters(recv_params)) {
-    SafeSetError("Failed to set local video description recv parameters.",
-                 error_desc);
-    return false;
-  }
-  for (const VideoCodec& codec : video->codecs()) {
-    AddHandledPayloadType(codec.id);
-  }
-  last_recv_params_ = recv_params;
-
-  // TODO(pthatcher): Move local streams into VideoSendParameters, and
-  // only give it to the media channel once we have a remote
-  // description too (without a remote description, we won't be able
-  // to send them anyway).
-  if (!UpdateLocalStreams_w(video->streams(), action, error_desc)) {
-    SafeSetError("Failed to set local video description streams.", error_desc);
-    return false;
-  }
-
-  set_local_content_direction(content->direction());
-  UpdateMediaSendRecvState_w();
-  return true;
-}
-
-bool VideoChannel::SetRemoteContent_w(const MediaContentDescription* content,
-                                      ContentAction action,
-                                      std::string* error_desc) {
-  TRACE_EVENT0("webrtc", "VideoChannel::SetRemoteContent_w");
-  RTC_DCHECK(worker_thread() == rtc::Thread::Current());
-  LOG(LS_INFO) << "Setting remote video description";
-
-  const VideoContentDescription* video =
-      static_cast<const VideoContentDescription*>(content);
-  RTC_DCHECK(video != NULL);
-  if (!video) {
-    SafeSetError("Can't find video content in remote description.", error_desc);
-    return false;
-  }
-
-  RtpHeaderExtensions rtp_header_extensions =
-      GetFilteredRtpHeaderExtensions(video->rtp_header_extensions());
-
-  if (!SetRtpTransportParameters(content, action, CS_REMOTE,
-      rtp_header_extensions, error_desc)) {
-    return false;
-  }
-
-  VideoSendParameters send_params = last_send_params_;
-  RtpSendParametersFromMediaDescription(video, rtp_header_extensions,
-      &send_params);
-  if (video->conference_mode()) {
-    send_params.conference_mode = true;
-  }
-
-  bool parameters_applied = media_channel()->SetSendParameters(send_params);
-
-  if (!parameters_applied) {
-    SafeSetError("Failed to set remote video description send parameters.",
-                 error_desc);
-    return false;
-  }
-  last_send_params_ = send_params;
-
-  // TODO(pthatcher): Move remote streams into VideoRecvParameters,
-  // and only give it to the media channel once we have a local
-  // description too (without a local description, we won't be able to
-  // recv them anyway).
-  if (!UpdateRemoteStreams_w(video->streams(), action, error_desc)) {
-    SafeSetError("Failed to set remote video description streams.", error_desc);
-    return false;
-  }
-
-  if (video->rtp_header_extensions_set()) {
-    MaybeCacheRtpAbsSendTimeHeaderExtension_w(rtp_header_extensions);
-  }
-
-  set_remote_content_direction(content->direction());
-  UpdateMediaSendRecvState_w();
-  return true;
-}
-
-void VideoChannel::OnMessage(rtc::Message *pmsg) {
-  switch (pmsg->message_id) {
-    case MSG_CHANNEL_ERROR: {
-      const VideoChannelErrorMessageData* data =
-          static_cast<VideoChannelErrorMessageData*>(pmsg->pdata);
-      delete data;
-      break;
-    }
-    default:
-      BaseChannel::OnMessage(pmsg);
-      break;
-  }
-}
-
-void VideoChannel::OnConnectionMonitorUpdate(
-    ConnectionMonitor* monitor, const std::vector<ConnectionInfo> &infos) {
-  SignalConnectionMonitor(this, infos);
-}
-
-// TODO(pthatcher): Look into removing duplicate code between
-// audio, video, and data, perhaps by using templates.
-void VideoChannel::OnMediaMonitorUpdate(
-    VideoMediaChannel* media_channel, const VideoMediaInfo &info) {
-  RTC_DCHECK(media_channel == this->media_channel());
-  SignalMediaMonitor(this, info);
-}
-
-RtpDataChannel::RtpDataChannel(rtc::Thread* worker_thread,
-                               rtc::Thread* network_thread,
-                               rtc::Thread* signaling_thread,
-                               DataMediaChannel* media_channel,
-                               const std::string& content_name,
-                               bool rtcp_mux_required,
-                               bool srtp_required)
-    : BaseChannel(worker_thread,
-                  network_thread,
-                  signaling_thread,
-                  media_channel,
-                  content_name,
-                  rtcp_mux_required,
-                  srtp_required) {}
-
-RtpDataChannel::~RtpDataChannel() {
-  TRACE_EVENT0("webrtc", "RtpDataChannel::~RtpDataChannel");
-  StopMediaMonitor();
-  // this can't be done in the base class, since it calls a virtual
-  DisableMedia_w();
-
-  Deinit();
-}
-
-bool RtpDataChannel::Init_w(
-    DtlsTransportInternal* rtp_dtls_transport,
-    DtlsTransportInternal* rtcp_dtls_transport,
-    rtc::PacketTransportInternal* rtp_packet_transport,
-    rtc::PacketTransportInternal* rtcp_packet_transport) {
-  if (!BaseChannel::Init_w(rtp_dtls_transport, rtcp_dtls_transport,
-                           rtp_packet_transport, rtcp_packet_transport)) {
-    return false;
-  }
-  media_channel()->SignalDataReceived.connect(this,
-                                              &RtpDataChannel::OnDataReceived);
-  media_channel()->SignalReadyToSend.connect(
-      this, &RtpDataChannel::OnDataChannelReadyToSend);
-  return true;
-}
-
-bool RtpDataChannel::SendData(const SendDataParams& params,
-                              const rtc::CopyOnWriteBuffer& payload,
-                              SendDataResult* result) {
-  return InvokeOnWorker<bool>(
-      RTC_FROM_HERE, Bind(&DataMediaChannel::SendData, media_channel(), params,
-                          payload, result));
-}
-
-bool RtpDataChannel::CheckDataChannelTypeFromContent(
-    const DataContentDescription* content,
-    std::string* error_desc) {
-  bool is_sctp = ((content->protocol() == kMediaProtocolSctp) ||
-                  (content->protocol() == kMediaProtocolDtlsSctp));
-  // It's been set before, but doesn't match.  That's bad.
-  if (is_sctp) {
-    SafeSetError("Data channel type mismatch. Expected RTP, got SCTP.",
-                 error_desc);
-    return false;
-  }
-  return true;
-}
-
-bool RtpDataChannel::SetLocalContent_w(const MediaContentDescription* content,
-                                       ContentAction action,
-                                       std::string* error_desc) {
-  TRACE_EVENT0("webrtc", "RtpDataChannel::SetLocalContent_w");
-  RTC_DCHECK(worker_thread() == rtc::Thread::Current());
-  LOG(LS_INFO) << "Setting local data description";
-
-  const DataContentDescription* data =
-      static_cast<const DataContentDescription*>(content);
-  RTC_DCHECK(data != NULL);
-  if (!data) {
-    SafeSetError("Can't find data content in local description.", error_desc);
-    return false;
-  }
-
-  if (!CheckDataChannelTypeFromContent(data, error_desc)) {
-    return false;
-  }
-
-  RtpHeaderExtensions rtp_header_extensions =
-      GetFilteredRtpHeaderExtensions(data->rtp_header_extensions());
-
-  if (!SetRtpTransportParameters(content, action, CS_LOCAL,
-      rtp_header_extensions, error_desc)) {
-    return false;
-  }
-
-  DataRecvParameters recv_params = last_recv_params_;
-  RtpParametersFromMediaDescription(data, rtp_header_extensions, &recv_params);
-  if (!media_channel()->SetRecvParameters(recv_params)) {
-    SafeSetError("Failed to set remote data description recv parameters.",
-                 error_desc);
-    return false;
-  }
-  for (const DataCodec& codec : data->codecs()) {
-    AddHandledPayloadType(codec.id);
-  }
-  last_recv_params_ = recv_params;
-
-  // TODO(pthatcher): Move local streams into DataSendParameters, and
-  // only give it to the media channel once we have a remote
-  // description too (without a remote description, we won't be able
-  // to send them anyway).
-  if (!UpdateLocalStreams_w(data->streams(), action, error_desc)) {
-    SafeSetError("Failed to set local data description streams.", error_desc);
-    return false;
-  }
-
-  set_local_content_direction(content->direction());
-  UpdateMediaSendRecvState_w();
-  return true;
-}
-
-bool RtpDataChannel::SetRemoteContent_w(const MediaContentDescription* content,
-                                        ContentAction action,
-                                        std::string* error_desc) {
-  TRACE_EVENT0("webrtc", "RtpDataChannel::SetRemoteContent_w");
-  RTC_DCHECK(worker_thread() == rtc::Thread::Current());
-
-  const DataContentDescription* data =
-      static_cast<const DataContentDescription*>(content);
-  RTC_DCHECK(data != NULL);
-  if (!data) {
-    SafeSetError("Can't find data content in remote description.", error_desc);
-    return false;
-  }
-
-  // If the remote data doesn't have codecs and isn't an update, it
-  // must be empty, so ignore it.
-  if (!data->has_codecs() && action != CA_UPDATE) {
-    return true;
-  }
-
-  if (!CheckDataChannelTypeFromContent(data, error_desc)) {
-    return false;
-  }
-
-  RtpHeaderExtensions rtp_header_extensions =
-      GetFilteredRtpHeaderExtensions(data->rtp_header_extensions());
-
-  LOG(LS_INFO) << "Setting remote data description";
-  if (!SetRtpTransportParameters(content, action, CS_REMOTE,
-      rtp_header_extensions, error_desc)) {
-    return false;
-  }
-
-  DataSendParameters send_params = last_send_params_;
-  RtpSendParametersFromMediaDescription<DataCodec>(data, rtp_header_extensions,
-      &send_params);
-  if (!media_channel()->SetSendParameters(send_params)) {
-    SafeSetError("Failed to set remote data description send parameters.",
-                 error_desc);
-    return false;
-  }
-  last_send_params_ = send_params;
-
-  // TODO(pthatcher): Move remote streams into DataRecvParameters,
-  // and only give it to the media channel once we have a local
-  // description too (without a local description, we won't be able to
-  // recv them anyway).
-  if (!UpdateRemoteStreams_w(data->streams(), action, error_desc)) {
-    SafeSetError("Failed to set remote data description streams.",
-                 error_desc);
-    return false;
-  }
-
-  set_remote_content_direction(content->direction());
-  UpdateMediaSendRecvState_w();
-  return true;
-}
-
-void RtpDataChannel::UpdateMediaSendRecvState_w() {
-  // Render incoming data if we're the active call, and we have the local
-  // content. We receive data on the default channel and multiplexed streams.
-  bool recv = IsReadyToReceiveMedia_w();
-  if (!media_channel()->SetReceive(recv)) {
-    LOG(LS_ERROR) << "Failed to SetReceive on data channel";
-  }
-
-  // Send outgoing data if we're the active call, we have the remote content,
-  // and we have had some form of connectivity.
-  bool send = IsReadyToSendMedia_w();
-  if (!media_channel()->SetSend(send)) {
-    LOG(LS_ERROR) << "Failed to SetSend on data channel";
-  }
-
-  // Trigger SignalReadyToSendData asynchronously.
-  OnDataChannelReadyToSend(send);
-
-  LOG(LS_INFO) << "Changing data state, recv=" << recv << " send=" << send;
-}
-
-void RtpDataChannel::OnMessage(rtc::Message* pmsg) {
-  switch (pmsg->message_id) {
-    case MSG_READYTOSENDDATA: {
-      DataChannelReadyToSendMessageData* data =
-          static_cast<DataChannelReadyToSendMessageData*>(pmsg->pdata);
-      ready_to_send_data_ = data->data();
-      SignalReadyToSendData(ready_to_send_data_);
-      delete data;
-      break;
-    }
-    case MSG_DATARECEIVED: {
-      DataReceivedMessageData* data =
-          static_cast<DataReceivedMessageData*>(pmsg->pdata);
-      SignalDataReceived(data->params, data->payload);
-      delete data;
-      break;
-    }
-    case MSG_CHANNEL_ERROR: {
-      const DataChannelErrorMessageData* data =
-          static_cast<DataChannelErrorMessageData*>(pmsg->pdata);
-      delete data;
-      break;
-    }
-    default:
-      BaseChannel::OnMessage(pmsg);
-      break;
-  }
-}
-
-void RtpDataChannel::OnConnectionMonitorUpdate(
-    ConnectionMonitor* monitor,
-    const std::vector<ConnectionInfo>& infos) {
-  SignalConnectionMonitor(this, infos);
-}
-
-void RtpDataChannel::StartMediaMonitor(int cms) {
-  media_monitor_.reset(new DataMediaMonitor(media_channel(), worker_thread(),
-      rtc::Thread::Current()));
-  media_monitor_->SignalUpdate.connect(this,
-                                       &RtpDataChannel::OnMediaMonitorUpdate);
-  media_monitor_->Start(cms);
-}
-
-void RtpDataChannel::StopMediaMonitor() {
-  if (media_monitor_) {
-    media_monitor_->Stop();
-    media_monitor_->SignalUpdate.disconnect(this);
-    media_monitor_.reset();
-  }
-}
-
-void RtpDataChannel::OnMediaMonitorUpdate(DataMediaChannel* media_channel,
-                                          const DataMediaInfo& info) {
-  RTC_DCHECK(media_channel == this->media_channel());
-  SignalMediaMonitor(this, info);
-}
-
-void RtpDataChannel::OnDataReceived(const ReceiveDataParams& params,
-                                    const char* data,
-                                    size_t len) {
-  DataReceivedMessageData* msg = new DataReceivedMessageData(
-      params, data, len);
-  signaling_thread()->Post(RTC_FROM_HERE, this, MSG_DATARECEIVED, msg);
-}
-
-void RtpDataChannel::OnDataChannelError(uint32_t ssrc,
-                                        DataMediaChannel::Error err) {
-  DataChannelErrorMessageData* data = new DataChannelErrorMessageData(
-      ssrc, err);
-  signaling_thread()->Post(RTC_FROM_HERE, this, MSG_CHANNEL_ERROR, data);
-}
-
-void RtpDataChannel::OnDataChannelReadyToSend(bool writable) {
-  // This is usded for congestion control to indicate that the stream is ready
-  // to send by the MediaChannel, as opposed to OnReadyToSend, which indicates
-  // that the transport channel is ready.
-  signaling_thread()->Post(RTC_FROM_HERE, this, MSG_READYTOSENDDATA,
-                           new DataChannelReadyToSendMessageData(writable));
-}
-
-}  // namespace cricket
diff --git a/pc/channel.h b/pc/channel.h
deleted file mode 100644
index 4ff21fe..0000000
--- a/pc/channel.h
+++ /dev/null
@@ -1,726 +0,0 @@
-/*
- *  Copyright 2004 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_PC_CHANNEL_H_
-#define WEBRTC_PC_CHANNEL_H_
-
-#include <map>
-#include <memory>
-#include <set>
-#include <string>
-#include <utility>
-#include <vector>
-
-#include "webrtc/api/call/audio_sink.h"
-#include "webrtc/api/rtpreceiverinterface.h"
-#include "webrtc/media/base/mediachannel.h"
-#include "webrtc/media/base/mediaengine.h"
-#include "webrtc/media/base/streamparams.h"
-#include "webrtc/media/base/videosinkinterface.h"
-#include "webrtc/media/base/videosourceinterface.h"
-#include "webrtc/p2p/base/dtlstransportinternal.h"
-#include "webrtc/p2p/base/packettransportinternal.h"
-#include "webrtc/p2p/base/transportcontroller.h"
-#include "webrtc/p2p/client/socketmonitor.h"
-#include "webrtc/pc/audiomonitor.h"
-#include "webrtc/pc/mediamonitor.h"
-#include "webrtc/pc/mediasession.h"
-#include "webrtc/pc/rtcpmuxfilter.h"
-#include "webrtc/pc/srtpfilter.h"
-#include "webrtc/rtc_base/asyncinvoker.h"
-#include "webrtc/rtc_base/asyncudpsocket.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/network.h"
-#include "webrtc/rtc_base/sigslot.h"
-#include "webrtc/rtc_base/window.h"
-
-namespace webrtc {
-class AudioSinkInterface;
-class RtpTransportInternal;
-class SrtpTransport;
-}  // namespace webrtc
-
-namespace cricket {
-
-struct CryptoParams;
-class MediaContentDescription;
-
-// BaseChannel contains logic common to voice and video, including enable,
-// marshaling calls to a worker and network threads, and connection and media
-// monitors.
-//
-// BaseChannel assumes signaling and other threads are allowed to make
-// synchronous calls to the worker thread, the worker thread makes synchronous
-// calls only to the network thread, and the network thread can't be blocked by
-// other threads.
-// All methods with _n suffix must be called on network thread,
-//     methods with _w suffix on worker thread
-// and methods with _s suffix on signaling thread.
-// Network and worker threads may be the same thread.
-//
-// WARNING! SUBCLASSES MUST CALL Deinit() IN THEIR DESTRUCTORS!
-// This is required to avoid a data race between the destructor modifying the
-// vtable, and the media channel's thread using BaseChannel as the
-// NetworkInterface.
-
-class BaseChannel
-    : public rtc::MessageHandler, public sigslot::has_slots<>,
-      public MediaChannel::NetworkInterface,
-      public ConnectionStatsGetter {
- public:
-  // If |srtp_required| is true, the channel will not send or receive any
-  // RTP/RTCP packets without using SRTP (either using SDES or DTLS-SRTP).
-  BaseChannel(rtc::Thread* worker_thread,
-              rtc::Thread* network_thread,
-              rtc::Thread* signaling_thread,
-              MediaChannel* channel,
-              const std::string& content_name,
-              bool rtcp_mux_required,
-              bool srtp_required);
-  virtual ~BaseChannel();
-  bool Init_w(DtlsTransportInternal* rtp_dtls_transport,
-              DtlsTransportInternal* rtcp_dtls_transport,
-              rtc::PacketTransportInternal* rtp_packet_transport,
-              rtc::PacketTransportInternal* rtcp_packet_transport);
-  // Deinit may be called multiple times and is simply ignored if it's already
-  // done.
-  void Deinit();
-
-  rtc::Thread* worker_thread() const { return worker_thread_; }
-  rtc::Thread* network_thread() const { return network_thread_; }
-  const std::string& content_name() const { return content_name_; }
-  // TODO(deadbeef): This is redundant; remove this.
-  const std::string& transport_name() const { return transport_name_; }
-  bool enabled() const { return enabled_; }
-
-  // This function returns true if we are using SDES.
-  bool sdes_active() const { return sdes_negotiator_.IsActive(); }
-  // The following function returns true if we are using DTLS-based keying.
-  bool dtls_active() const { return dtls_active_; }
-  // This function returns true if using SRTP (DTLS-based keying or SDES).
-  bool srtp_active() const { return sdes_active() || dtls_active(); }
-
-  bool writable() const { return writable_; }
-
-  // Set the transport(s), and update writability and "ready-to-send" state.
-  // |rtp_transport| must be non-null.
-  // |rtcp_transport| must be supplied if NeedsRtcpTransport() is true (meaning
-  // RTCP muxing is not fully active yet).
-  // |rtp_transport| and |rtcp_transport| must share the same transport name as
-  // well.
-  // Can not start with "rtc::PacketTransportInternal" and switch to
-  // "DtlsTransportInternal", or vice-versa.
-  void SetTransports(DtlsTransportInternal* rtp_dtls_transport,
-                     DtlsTransportInternal* rtcp_dtls_transport);
-  void SetTransports(rtc::PacketTransportInternal* rtp_packet_transport,
-                     rtc::PacketTransportInternal* rtcp_packet_transport);
-  // Channel control
-  bool SetLocalContent(const MediaContentDescription* content,
-                       ContentAction action,
-                       std::string* error_desc);
-  bool SetRemoteContent(const MediaContentDescription* content,
-                        ContentAction action,
-                        std::string* error_desc);
-
-  bool Enable(bool enable);
-
-  // Multiplexing
-  bool AddRecvStream(const StreamParams& sp);
-  bool RemoveRecvStream(uint32_t ssrc);
-  bool AddSendStream(const StreamParams& sp);
-  bool RemoveSendStream(uint32_t ssrc);
-
-  // Monitoring
-  void StartConnectionMonitor(int cms);
-  void StopConnectionMonitor();
-  // For ConnectionStatsGetter, used by ConnectionMonitor
-  bool GetConnectionStats(ConnectionInfos* infos) override;
-
-  const std::vector<StreamParams>& local_streams() const {
-    return local_streams_;
-  }
-  const std::vector<StreamParams>& remote_streams() const {
-    return remote_streams_;
-  }
-
-  sigslot::signal2<BaseChannel*, bool> SignalDtlsSrtpSetupFailure;
-  void SignalDtlsSrtpSetupFailure_n(bool rtcp);
-  void SignalDtlsSrtpSetupFailure_s(bool rtcp);
-
-  // Used for latency measurements.
-  sigslot::signal1<BaseChannel*> SignalFirstPacketReceived;
-
-  // Forward SignalSentPacket to worker thread.
-  sigslot::signal1<const rtc::SentPacket&> SignalSentPacket;
-
-  // Emitted whenever rtcp-mux is fully negotiated and the rtcp-transport can
-  // be destroyed.
-  // Fired on the network thread.
-  sigslot::signal1<const std::string&> SignalRtcpMuxFullyActive;
-
-  // Only public for unit tests.  Otherwise, consider private.
-  DtlsTransportInternal* rtp_dtls_transport() const {
-    return rtp_dtls_transport_;
-  }
-  DtlsTransportInternal* rtcp_dtls_transport() const {
-    return rtcp_dtls_transport_;
-  }
-
-  bool NeedsRtcpTransport();
-
-  // From RtpTransport - public for testing only
-  void OnTransportReadyToSend(bool ready);
-
-  // Only public for unit tests.  Otherwise, consider protected.
-  int SetOption(SocketType type, rtc::Socket::Option o, int val)
-      override;
-  int SetOption_n(SocketType type, rtc::Socket::Option o, int val);
-
-  virtual cricket::MediaType media_type() = 0;
-
-  // This function returns true if we require SRTP for call setup.
-  bool srtp_required_for_testing() const { return srtp_required_; }
-
-  // Public for testing.
-  // TODO(zstein): Remove this once channels register themselves with
-  // an RtpTransport in a more explicit way.
-  bool HandlesPayloadType(int payload_type) const;
-
- protected:
-  virtual MediaChannel* media_channel() const { return media_channel_; }
-
-  void SetTransports_n(DtlsTransportInternal* rtp_dtls_transport,
-                       DtlsTransportInternal* rtcp_dtls_transport,
-                       rtc::PacketTransportInternal* rtp_packet_transport,
-                       rtc::PacketTransportInternal* rtcp_packet_transport);
-
-  // This does not update writability or "ready-to-send" state; it just
-  // disconnects from the old channel and connects to the new one.
-  void SetTransport_n(bool rtcp,
-                      DtlsTransportInternal* new_dtls_transport,
-                      rtc::PacketTransportInternal* new_packet_transport);
-
-  bool was_ever_writable() const { return was_ever_writable_; }
-  void set_local_content_direction(MediaContentDirection direction) {
-    local_content_direction_ = direction;
-  }
-  void set_remote_content_direction(MediaContentDirection direction) {
-    remote_content_direction_ = direction;
-  }
-  // These methods verify that:
-  // * The required content description directions have been set.
-  // * The channel is enabled.
-  // * And for sending:
-  //   - The SRTP filter is active if it's needed.
-  //   - The transport has been writable before, meaning it should be at least
-  //     possible to succeed in sending a packet.
-  //
-  // When any of these properties change, UpdateMediaSendRecvState_w should be
-  // called.
-  bool IsReadyToReceiveMedia_w() const;
-  bool IsReadyToSendMedia_w() const;
-  rtc::Thread* signaling_thread() { return signaling_thread_; }
-
-  void ConnectToDtlsTransport(DtlsTransportInternal* transport);
-  void DisconnectFromDtlsTransport(DtlsTransportInternal* transport);
-  void ConnectToPacketTransport(rtc::PacketTransportInternal* transport);
-  void DisconnectFromPacketTransport(rtc::PacketTransportInternal* transport);
-
-  void FlushRtcpMessages_n();
-
-  // NetworkInterface implementation, called by MediaEngine
-  bool SendPacket(rtc::CopyOnWriteBuffer* packet,
-                  const rtc::PacketOptions& options) override;
-  bool SendRtcp(rtc::CopyOnWriteBuffer* packet,
-                const rtc::PacketOptions& options) override;
-
-  // From TransportChannel
-  void OnWritableState(rtc::PacketTransportInternal* transport);
-
-  void OnDtlsState(DtlsTransportInternal* transport, DtlsTransportState state);
-
-  void OnSelectedCandidatePairChanged(
-      IceTransportInternal* ice_transport,
-      CandidatePairInterface* selected_candidate_pair,
-      int last_sent_packet_id,
-      bool ready_to_send);
-
-  bool PacketIsRtcp(const rtc::PacketTransportInternal* transport,
-                    const char* data,
-                    size_t len);
-  bool SendPacket(bool rtcp,
-                  rtc::CopyOnWriteBuffer* packet,
-                  const rtc::PacketOptions& options);
-
-  bool WantsPacket(bool rtcp, const rtc::CopyOnWriteBuffer* packet);
-  void HandlePacket(bool rtcp, rtc::CopyOnWriteBuffer* packet,
-                    const rtc::PacketTime& packet_time);
-  // TODO(zstein): packet can be const once the RtpTransport handles protection.
-  virtual void OnPacketReceived(bool rtcp,
-                                rtc::CopyOnWriteBuffer* packet,
-                                const rtc::PacketTime& packet_time);
-  void ProcessPacket(bool rtcp,
-                     const rtc::CopyOnWriteBuffer& packet,
-                     const rtc::PacketTime& packet_time);
-
-  void EnableMedia_w();
-  void DisableMedia_w();
-
-  // Performs actions if the RTP/RTCP writable state changed. This should
-  // be called whenever a channel's writable state changes or when RTCP muxing
-  // becomes active/inactive.
-  void UpdateWritableState_n();
-  void ChannelWritable_n();
-  void ChannelNotWritable_n();
-
-  bool AddRecvStream_w(const StreamParams& sp);
-  bool RemoveRecvStream_w(uint32_t ssrc);
-  bool AddSendStream_w(const StreamParams& sp);
-  bool RemoveSendStream_w(uint32_t ssrc);
-  bool ShouldSetupDtlsSrtp_n() const;
-  // Do the DTLS key expansion and impose it on the SRTP/SRTCP filters.
-  // |rtcp_channel| indicates whether to set up the RTP or RTCP filter.
-  bool SetupDtlsSrtp_n(bool rtcp);
-  void MaybeSetupDtlsSrtp_n();
-
-  // Should be called whenever the conditions for
-  // IsReadyToReceiveMedia/IsReadyToSendMedia are satisfied (or unsatisfied).
-  // Updates the send/recv state of the media channel.
-  void UpdateMediaSendRecvState();
-  virtual void UpdateMediaSendRecvState_w() = 0;
-
-  bool UpdateLocalStreams_w(const std::vector<StreamParams>& streams,
-                            ContentAction action,
-                            std::string* error_desc);
-  bool UpdateRemoteStreams_w(const std::vector<StreamParams>& streams,
-                             ContentAction action,
-                             std::string* error_desc);
-  virtual bool SetLocalContent_w(const MediaContentDescription* content,
-                                 ContentAction action,
-                                 std::string* error_desc) = 0;
-  virtual bool SetRemoteContent_w(const MediaContentDescription* content,
-                                  ContentAction action,
-                                  std::string* error_desc) = 0;
-  bool SetRtpTransportParameters(const MediaContentDescription* content,
-      ContentAction action, ContentSource src,
-      const RtpHeaderExtensions& extensions, std::string* error_desc);
-  bool SetRtpTransportParameters_n(const MediaContentDescription* content,
-      ContentAction action, ContentSource src,
-      const std::vector<int>& encrypted_extension_ids,
-      std::string* error_desc);
-
-  // Return a list of RTP header extensions with the non-encrypted extensions
-  // removed depending on the current crypto_options_ and only if both the
-  // non-encrypted and encrypted extension is present for the same URI.
-  RtpHeaderExtensions GetFilteredRtpHeaderExtensions(
-      const RtpHeaderExtensions& extensions);
-
-  // Helper method to get RTP Absoulute SendTime extension header id if
-  // present in remote supported extensions list.
-  void MaybeCacheRtpAbsSendTimeHeaderExtension_w(
-      const std::vector<webrtc::RtpExtension>& extensions);
-
-  bool CheckSrtpConfig_n(const std::vector<CryptoParams>& cryptos,
-                         bool* dtls,
-                         std::string* error_desc);
-  bool SetSrtp_n(const std::vector<CryptoParams>& params,
-                 ContentAction action,
-                 ContentSource src,
-                 const std::vector<int>& encrypted_extension_ids,
-                 std::string* error_desc);
-  bool SetRtcpMux_n(bool enable,
-                    ContentAction action,
-                    ContentSource src,
-                    std::string* error_desc);
-
-  // From MessageHandler
-  void OnMessage(rtc::Message* pmsg) override;
-
-  // Handled in derived classes
-  virtual void OnConnectionMonitorUpdate(ConnectionMonitor* monitor,
-      const std::vector<ConnectionInfo>& infos) = 0;
-
-  // Helper function template for invoking methods on the worker thread.
-  template <class T, class FunctorT>
-  T InvokeOnWorker(const rtc::Location& posted_from, const FunctorT& functor) {
-    return worker_thread_->Invoke<T>(posted_from, functor);
-  }
-
-  void AddHandledPayloadType(int payload_type);
-
- private:
-  bool InitNetwork_n(DtlsTransportInternal* rtp_dtls_transport,
-                     DtlsTransportInternal* rtcp_dtls_transport,
-                     rtc::PacketTransportInternal* rtp_packet_transport,
-                     rtc::PacketTransportInternal* rtcp_packet_transport);
-  void DisconnectTransportChannels_n();
-  void SignalSentPacket_n(rtc::PacketTransportInternal* transport,
-                          const rtc::SentPacket& sent_packet);
-  void SignalSentPacket_w(const rtc::SentPacket& sent_packet);
-  bool IsReadyToSendMedia_n() const;
-  void CacheRtpAbsSendTimeHeaderExtension_n(int rtp_abs_sendtime_extn_id);
-  int GetTransportOverheadPerPacket() const;
-  void UpdateTransportOverhead();
-  // Wraps the existing RtpTransport in an SrtpTransport.
-  void EnableSrtpTransport_n();
-
-  rtc::Thread* const worker_thread_;
-  rtc::Thread* const network_thread_;
-  rtc::Thread* const signaling_thread_;
-  rtc::AsyncInvoker invoker_;
-
-  const std::string content_name_;
-  std::unique_ptr<ConnectionMonitor> connection_monitor_;
-
-  // Won't be set when using raw packet transports. SDP-specific thing.
-  std::string transport_name_;
-
-  const bool rtcp_mux_required_;
-
-  // Separate DTLS/non-DTLS pointers to support using BaseChannel without DTLS.
-  // Temporary measure until more refactoring is done.
-  // If non-null, "X_dtls_transport_" will always equal "X_packet_transport_".
-  DtlsTransportInternal* rtp_dtls_transport_ = nullptr;
-  DtlsTransportInternal* rtcp_dtls_transport_ = nullptr;
-  std::unique_ptr<webrtc::RtpTransportInternal> rtp_transport_;
-  webrtc::SrtpTransport* srtp_transport_ = nullptr;
-  std::vector<std::pair<rtc::Socket::Option, int> > socket_options_;
-  std::vector<std::pair<rtc::Socket::Option, int> > rtcp_socket_options_;
-  SrtpFilter sdes_negotiator_;
-  RtcpMuxFilter rtcp_mux_filter_;
-  bool writable_ = false;
-  bool was_ever_writable_ = false;
-  bool has_received_packet_ = false;
-  bool dtls_active_ = false;
-  const bool srtp_required_ = true;
-
-  // MediaChannel related members that should be accessed from the worker
-  // thread.
-  MediaChannel* const media_channel_;
-  // Currently the |enabled_| flag is accessed from the signaling thread as
-  // well, but it can be changed only when signaling thread does a synchronous
-  // call to the worker thread, so it should be safe.
-  bool enabled_ = false;
-  std::vector<StreamParams> local_streams_;
-  std::vector<StreamParams> remote_streams_;
-  MediaContentDirection local_content_direction_ = MD_INACTIVE;
-  MediaContentDirection remote_content_direction_ = MD_INACTIVE;
-  CandidatePairInterface* selected_candidate_pair_;
-};
-
-// VoiceChannel is a specialization that adds support for early media, DTMF,
-// and input/output level monitoring.
-class VoiceChannel : public BaseChannel {
- public:
-  VoiceChannel(rtc::Thread* worker_thread,
-               rtc::Thread* network_thread,
-               rtc::Thread* signaling_thread,
-               MediaEngineInterface* media_engine,
-               VoiceMediaChannel* channel,
-               const std::string& content_name,
-               bool rtcp_mux_required,
-               bool srtp_required);
-  ~VoiceChannel();
-
-  // Configure sending media on the stream with SSRC |ssrc|
-  // If there is only one sending stream SSRC 0 can be used.
-  bool SetAudioSend(uint32_t ssrc,
-                    bool enable,
-                    const AudioOptions* options,
-                    AudioSource* source);
-
-  // downcasts a MediaChannel
-  VoiceMediaChannel* media_channel() const override {
-    return static_cast<VoiceMediaChannel*>(BaseChannel::media_channel());
-  }
-
-  void SetEarlyMedia(bool enable);
-  // This signal is emitted when we have gone a period of time without
-  // receiving early media. When received, a UI should start playing its
-  // own ringing sound
-  sigslot::signal1<VoiceChannel*> SignalEarlyMediaTimeout;
-
-  // Returns if the telephone-event has been negotiated.
-  bool CanInsertDtmf();
-  // Send and/or play a DTMF |event| according to the |flags|.
-  // The DTMF out-of-band signal will be used on sending.
-  // The |ssrc| should be either 0 or a valid send stream ssrc.
-  // The valid value for the |event| are 0 which corresponding to DTMF
-  // event 0-9, *, #, A-D.
-  bool InsertDtmf(uint32_t ssrc, int event_code, int duration);
-  bool SetOutputVolume(uint32_t ssrc, double volume);
-  void SetRawAudioSink(uint32_t ssrc,
-                       std::unique_ptr<webrtc::AudioSinkInterface> sink);
-  webrtc::RtpParameters GetRtpSendParameters(uint32_t ssrc) const;
-  bool SetRtpSendParameters(uint32_t ssrc,
-                            const webrtc::RtpParameters& parameters);
-  webrtc::RtpParameters GetRtpReceiveParameters(uint32_t ssrc) const;
-  bool SetRtpReceiveParameters(uint32_t ssrc,
-                               const webrtc::RtpParameters& parameters);
-
-  // Get statistics about the current media session.
-  bool GetStats(VoiceMediaInfo* stats);
-
-  std::vector<webrtc::RtpSource> GetSources(uint32_t ssrc) const;
-  std::vector<webrtc::RtpSource> GetSources_w(uint32_t ssrc) const;
-
-  // Monitoring functions
-  sigslot::signal2<VoiceChannel*, const std::vector<ConnectionInfo>&>
-      SignalConnectionMonitor;
-
-  void StartMediaMonitor(int cms);
-  void StopMediaMonitor();
-  sigslot::signal2<VoiceChannel*, const VoiceMediaInfo&> SignalMediaMonitor;
-
-  void StartAudioMonitor(int cms);
-  void StopAudioMonitor();
-  bool IsAudioMonitorRunning() const;
-  sigslot::signal2<VoiceChannel*, const AudioInfo&> SignalAudioMonitor;
-
-  int GetInputLevel_w();
-  int GetOutputLevel_w();
-  void GetActiveStreams_w(AudioInfo::StreamList* actives);
-  webrtc::RtpParameters GetRtpSendParameters_w(uint32_t ssrc) const;
-  bool SetRtpSendParameters_w(uint32_t ssrc, webrtc::RtpParameters parameters);
-  webrtc::RtpParameters GetRtpReceiveParameters_w(uint32_t ssrc) const;
-  bool SetRtpReceiveParameters_w(uint32_t ssrc,
-                                 webrtc::RtpParameters parameters);
-  cricket::MediaType media_type() override { return cricket::MEDIA_TYPE_AUDIO; }
-
- private:
-  // overrides from BaseChannel
-  void OnPacketReceived(bool rtcp,
-                        rtc::CopyOnWriteBuffer* packet,
-                        const rtc::PacketTime& packet_time) override;
-  void UpdateMediaSendRecvState_w() override;
-  bool SetLocalContent_w(const MediaContentDescription* content,
-                         ContentAction action,
-                         std::string* error_desc) override;
-  bool SetRemoteContent_w(const MediaContentDescription* content,
-                          ContentAction action,
-                          std::string* error_desc) override;
-  void HandleEarlyMediaTimeout();
-  bool InsertDtmf_w(uint32_t ssrc, int event, int duration);
-  bool SetOutputVolume_w(uint32_t ssrc, double volume);
-
-  void OnMessage(rtc::Message* pmsg) override;
-  void OnConnectionMonitorUpdate(
-      ConnectionMonitor* monitor,
-      const std::vector<ConnectionInfo>& infos) override;
-  void OnMediaMonitorUpdate(VoiceMediaChannel* media_channel,
-                            const VoiceMediaInfo& info);
-  void OnAudioMonitorUpdate(AudioMonitor* monitor, const AudioInfo& info);
-
-  static const int kEarlyMediaTimeout = 1000;
-  MediaEngineInterface* media_engine_;
-  bool received_media_;
-  std::unique_ptr<VoiceMediaMonitor> media_monitor_;
-  std::unique_ptr<AudioMonitor> audio_monitor_;
-
-  // Last AudioSendParameters sent down to the media_channel() via
-  // SetSendParameters.
-  AudioSendParameters last_send_params_;
-  // Last AudioRecvParameters sent down to the media_channel() via
-  // SetRecvParameters.
-  AudioRecvParameters last_recv_params_;
-};
-
-// VideoChannel is a specialization for video.
-class VideoChannel : public BaseChannel {
- public:
-  VideoChannel(rtc::Thread* worker_thread,
-               rtc::Thread* network_thread,
-               rtc::Thread* signaling_thread,
-               VideoMediaChannel* channel,
-               const std::string& content_name,
-               bool rtcp_mux_required,
-               bool srtp_required);
-  ~VideoChannel();
-
-  // downcasts a MediaChannel
-  VideoMediaChannel* media_channel() const override {
-    return static_cast<VideoMediaChannel*>(BaseChannel::media_channel());
-  }
-
-  bool SetSink(uint32_t ssrc,
-               rtc::VideoSinkInterface<webrtc::VideoFrame>* sink);
-  void FillBitrateInfo(BandwidthEstimationInfo* bwe_info);
-  // Get statistics about the current media session.
-  bool GetStats(VideoMediaInfo* stats);
-
-  sigslot::signal2<VideoChannel*, const std::vector<ConnectionInfo>&>
-      SignalConnectionMonitor;
-
-  void StartMediaMonitor(int cms);
-  void StopMediaMonitor();
-  sigslot::signal2<VideoChannel*, const VideoMediaInfo&> SignalMediaMonitor;
-
-  // Register a source and set options.
-  // The |ssrc| must correspond to a registered send stream.
-  bool SetVideoSend(uint32_t ssrc,
-                    bool enable,
-                    const VideoOptions* options,
-                    rtc::VideoSourceInterface<webrtc::VideoFrame>* source);
-  webrtc::RtpParameters GetRtpSendParameters(uint32_t ssrc) const;
-  bool SetRtpSendParameters(uint32_t ssrc,
-                            const webrtc::RtpParameters& parameters);
-  webrtc::RtpParameters GetRtpReceiveParameters(uint32_t ssrc) const;
-  bool SetRtpReceiveParameters(uint32_t ssrc,
-                               const webrtc::RtpParameters& parameters);
-  cricket::MediaType media_type() override { return cricket::MEDIA_TYPE_VIDEO; }
-
- private:
-  // overrides from BaseChannel
-  void UpdateMediaSendRecvState_w() override;
-  bool SetLocalContent_w(const MediaContentDescription* content,
-                         ContentAction action,
-                         std::string* error_desc) override;
-  bool SetRemoteContent_w(const MediaContentDescription* content,
-                          ContentAction action,
-                          std::string* error_desc) override;
-  bool GetStats_w(VideoMediaInfo* stats);
-  webrtc::RtpParameters GetRtpSendParameters_w(uint32_t ssrc) const;
-  bool SetRtpSendParameters_w(uint32_t ssrc, webrtc::RtpParameters parameters);
-  webrtc::RtpParameters GetRtpReceiveParameters_w(uint32_t ssrc) const;
-  bool SetRtpReceiveParameters_w(uint32_t ssrc,
-                                 webrtc::RtpParameters parameters);
-
-  void OnMessage(rtc::Message* pmsg) override;
-  void OnConnectionMonitorUpdate(
-      ConnectionMonitor* monitor,
-      const std::vector<ConnectionInfo>& infos) override;
-  void OnMediaMonitorUpdate(VideoMediaChannel* media_channel,
-                            const VideoMediaInfo& info);
-
-  std::unique_ptr<VideoMediaMonitor> media_monitor_;
-
-  // Last VideoSendParameters sent down to the media_channel() via
-  // SetSendParameters.
-  VideoSendParameters last_send_params_;
-  // Last VideoRecvParameters sent down to the media_channel() via
-  // SetRecvParameters.
-  VideoRecvParameters last_recv_params_;
-};
-
-// RtpDataChannel is a specialization for data.
-class RtpDataChannel : public BaseChannel {
- public:
-  RtpDataChannel(rtc::Thread* worker_thread,
-                 rtc::Thread* network_thread,
-                 rtc::Thread* signaling_thread,
-                 DataMediaChannel* channel,
-                 const std::string& content_name,
-                 bool rtcp_mux_required,
-                 bool srtp_required);
-  ~RtpDataChannel();
-  bool Init_w(DtlsTransportInternal* rtp_dtls_transport,
-              DtlsTransportInternal* rtcp_dtls_transport,
-              rtc::PacketTransportInternal* rtp_packet_transport,
-              rtc::PacketTransportInternal* rtcp_packet_transport);
-
-  virtual bool SendData(const SendDataParams& params,
-                        const rtc::CopyOnWriteBuffer& payload,
-                        SendDataResult* result);
-
-  void StartMediaMonitor(int cms);
-  void StopMediaMonitor();
-
-  // Should be called on the signaling thread only.
-  bool ready_to_send_data() const {
-    return ready_to_send_data_;
-  }
-
-  sigslot::signal2<RtpDataChannel*, const DataMediaInfo&> SignalMediaMonitor;
-  sigslot::signal2<RtpDataChannel*, const std::vector<ConnectionInfo>&>
-      SignalConnectionMonitor;
-
-  sigslot::signal2<const ReceiveDataParams&, const rtc::CopyOnWriteBuffer&>
-      SignalDataReceived;
-  // Signal for notifying when the channel becomes ready to send data.
-  // That occurs when the channel is enabled, the transport is writable,
-  // both local and remote descriptions are set, and the channel is unblocked.
-  sigslot::signal1<bool> SignalReadyToSendData;
-  cricket::MediaType media_type() override { return cricket::MEDIA_TYPE_DATA; }
-
- protected:
-  // downcasts a MediaChannel.
-  DataMediaChannel* media_channel() const override {
-    return static_cast<DataMediaChannel*>(BaseChannel::media_channel());
-  }
-
- private:
-  struct SendDataMessageData : public rtc::MessageData {
-    SendDataMessageData(const SendDataParams& params,
-                        const rtc::CopyOnWriteBuffer* payload,
-                        SendDataResult* result)
-        : params(params),
-          payload(payload),
-          result(result),
-          succeeded(false) {
-    }
-
-    const SendDataParams& params;
-    const rtc::CopyOnWriteBuffer* payload;
-    SendDataResult* result;
-    bool succeeded;
-  };
-
-  struct DataReceivedMessageData : public rtc::MessageData {
-    // We copy the data because the data will become invalid after we
-    // handle DataMediaChannel::SignalDataReceived but before we fire
-    // SignalDataReceived.
-    DataReceivedMessageData(
-        const ReceiveDataParams& params, const char* data, size_t len)
-        : params(params),
-          payload(data, len) {
-    }
-    const ReceiveDataParams params;
-    const rtc::CopyOnWriteBuffer payload;
-  };
-
-  typedef rtc::TypedMessageData<bool> DataChannelReadyToSendMessageData;
-
-  // overrides from BaseChannel
-  // Checks that data channel type is RTP.
-  bool CheckDataChannelTypeFromContent(const DataContentDescription* content,
-                                       std::string* error_desc);
-  bool SetLocalContent_w(const MediaContentDescription* content,
-                         ContentAction action,
-                         std::string* error_desc) override;
-  bool SetRemoteContent_w(const MediaContentDescription* content,
-                          ContentAction action,
-                          std::string* error_desc) override;
-  void UpdateMediaSendRecvState_w() override;
-
-  void OnMessage(rtc::Message* pmsg) override;
-  void OnConnectionMonitorUpdate(
-      ConnectionMonitor* monitor,
-      const std::vector<ConnectionInfo>& infos) override;
-  void OnMediaMonitorUpdate(DataMediaChannel* media_channel,
-                            const DataMediaInfo& info);
-  void OnDataReceived(
-      const ReceiveDataParams& params, const char* data, size_t len);
-  void OnDataChannelError(uint32_t ssrc, DataMediaChannel::Error error);
-  void OnDataChannelReadyToSend(bool writable);
-
-  std::unique_ptr<DataMediaMonitor> media_monitor_;
-  bool ready_to_send_data_ = false;
-
-  // Last DataSendParameters sent down to the media_channel() via
-  // SetSendParameters.
-  DataSendParameters last_send_params_;
-  // Last DataRecvParameters sent down to the media_channel() via
-  // SetRecvParameters.
-  DataRecvParameters last_recv_params_;
-};
-
-}  // namespace cricket
-
-#endif  // WEBRTC_PC_CHANNEL_H_
diff --git a/pc/channel_unittest.cc b/pc/channel_unittest.cc
deleted file mode 100644
index b16e60d..0000000
--- a/pc/channel_unittest.cc
+++ /dev/null
@@ -1,3900 +0,0 @@
-/*
- *  Copyright 2009 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 <memory>
-
-#include "webrtc/api/array_view.h"
-#include "webrtc/media/base/fakemediaengine.h"
-#include "webrtc/media/base/fakertp.h"
-#include "webrtc/media/base/mediachannel.h"
-#include "webrtc/media/base/testutils.h"
-#include "webrtc/p2p/base/fakecandidatepair.h"
-#include "webrtc/p2p/base/fakedtlstransport.h"
-#include "webrtc/p2p/base/fakepackettransport.h"
-#include "webrtc/pc/channel.h"
-#include "webrtc/rtc_base/buffer.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/fakeclock.h"
-#include "webrtc/rtc_base/gunit.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/sslstreamadapter.h"
-
-using cricket::CA_OFFER;
-using cricket::CA_PRANSWER;
-using cricket::CA_ANSWER;
-using cricket::CA_UPDATE;
-using cricket::DtlsTransportInternal;
-using cricket::FakeVoiceMediaChannel;
-using cricket::StreamParams;
-
-namespace {
-const cricket::AudioCodec kPcmuCodec(0, "PCMU", 64000, 8000, 1);
-const cricket::AudioCodec kPcmaCodec(8, "PCMA", 64000, 8000, 1);
-const cricket::AudioCodec kIsacCodec(103, "ISAC", 40000, 16000, 1);
-const cricket::VideoCodec kH264Codec(97, "H264");
-const cricket::VideoCodec kH264SvcCodec(99, "H264-SVC");
-const cricket::DataCodec kGoogleDataCodec(101, "google-data");
-const uint32_t kSsrc1 = 0x1111;
-const uint32_t kSsrc2 = 0x2222;
-const uint32_t kSsrc3 = 0x3333;
-const int kAudioPts[] = {0, 8};
-const int kVideoPts[] = {97, 99};
-enum class NetworkIsWorker { Yes, No };
-const int kDefaultTimeout = 10000;  // 10 seconds.
-}  // namespace
-
-template <class ChannelT,
-          class MediaChannelT,
-          class ContentT,
-          class CodecT,
-          class MediaInfoT,
-          class OptionsT>
-class Traits {
- public:
-  typedef ChannelT Channel;
-  typedef MediaChannelT MediaChannel;
-  typedef ContentT Content;
-  typedef CodecT Codec;
-  typedef MediaInfoT MediaInfo;
-  typedef OptionsT Options;
-};
-
-class VoiceTraits : public Traits<cricket::VoiceChannel,
-                                  cricket::FakeVoiceMediaChannel,
-                                  cricket::AudioContentDescription,
-                                  cricket::AudioCodec,
-                                  cricket::VoiceMediaInfo,
-                                  cricket::AudioOptions> {};
-
-class VideoTraits : public Traits<cricket::VideoChannel,
-                                  cricket::FakeVideoMediaChannel,
-                                  cricket::VideoContentDescription,
-                                  cricket::VideoCodec,
-                                  cricket::VideoMediaInfo,
-                                  cricket::VideoOptions> {};
-
-class DataTraits : public Traits<cricket::RtpDataChannel,
-                                 cricket::FakeDataMediaChannel,
-                                 cricket::DataContentDescription,
-                                 cricket::DataCodec,
-                                 cricket::DataMediaInfo,
-                                 cricket::DataOptions> {};
-
-// Base class for Voice/Video/RtpDataChannel tests
-template<class T>
-class ChannelTest : public testing::Test, public sigslot::has_slots<> {
- public:
-  enum Flags {
-    RTCP_MUX = 0x1,
-    RTCP_MUX_REQUIRED = 0x2,
-    SECURE = 0x4,
-    SSRC_MUX = 0x8,
-    DTLS = 0x10,
-    // Use BaseChannel with PacketTransportInternal rather than
-    // DtlsTransportInternal.
-    RAW_PACKET_TRANSPORT = 0x20,
-    GCM_CIPHER = 0x40,
-    ENCRYPTED_HEADERS = 0x80,
-  };
-
-  ChannelTest(bool verify_playout,
-              rtc::ArrayView<const uint8_t> rtp_data,
-              rtc::ArrayView<const uint8_t> rtcp_data,
-              NetworkIsWorker network_is_worker)
-      : verify_playout_(verify_playout),
-        rtp_packet_(rtp_data.data(), rtp_data.size()),
-        rtcp_packet_(rtcp_data.data(), rtcp_data.size()) {
-    if (network_is_worker == NetworkIsWorker::Yes) {
-      network_thread_ = rtc::Thread::Current();
-    } else {
-      network_thread_keeper_ = rtc::Thread::Create();
-      network_thread_keeper_->SetName("Network", nullptr);
-      network_thread_ = network_thread_keeper_.get();
-    }
-  }
-
-  void CreateChannels(int flags1, int flags2) {
-    CreateChannels(new typename T::MediaChannel(NULL, typename T::Options()),
-                   new typename T::MediaChannel(NULL, typename T::Options()),
-                   flags1, flags2);
-  }
-  void CreateChannels(typename T::MediaChannel* ch1,
-                      typename T::MediaChannel* ch2,
-                      int flags1,
-                      int flags2) {
-    // Network thread is started in CreateChannels, to allow the test to
-    // configure a fake clock before any threads are spawned and attempt to
-    // access the time.
-    if (network_thread_keeper_) {
-      network_thread_keeper_->Start();
-    }
-    // Make sure RTCP_MUX_REQUIRED isn't set without RTCP_MUX.
-    RTC_DCHECK_NE(RTCP_MUX_REQUIRED, flags1 & (RTCP_MUX | RTCP_MUX_REQUIRED));
-    RTC_DCHECK_NE(RTCP_MUX_REQUIRED, flags2 & (RTCP_MUX | RTCP_MUX_REQUIRED));
-    // Make sure if using raw packet transports, they're used for both
-    // channels.
-    RTC_DCHECK_EQ(flags1 & RAW_PACKET_TRANSPORT, flags2 & RAW_PACKET_TRANSPORT);
-    rtc::Thread* worker_thread = rtc::Thread::Current();
-    media_channel1_ = ch1;
-    media_channel2_ = ch2;
-    rtc::PacketTransportInternal* rtp1 = nullptr;
-    rtc::PacketTransportInternal* rtcp1 = nullptr;
-    rtc::PacketTransportInternal* rtp2 = nullptr;
-    rtc::PacketTransportInternal* rtcp2 = nullptr;
-    // Based on flags, create fake DTLS or raw packet transports.
-    if (flags1 & RAW_PACKET_TRANSPORT) {
-      fake_rtp_packet_transport1_.reset(
-          new rtc::FakePacketTransport("channel1_rtp"));
-      rtp1 = fake_rtp_packet_transport1_.get();
-      if (!(flags1 & RTCP_MUX_REQUIRED)) {
-        fake_rtcp_packet_transport1_.reset(
-            new rtc::FakePacketTransport("channel1_rtcp"));
-        rtcp1 = fake_rtcp_packet_transport1_.get();
-      }
-    } else {
-      // Confirmed to work with KT_RSA and KT_ECDSA.
-      fake_rtp_dtls_transport1_.reset(new cricket::FakeDtlsTransport(
-          "channel1", cricket::ICE_CANDIDATE_COMPONENT_RTP));
-      rtp1 = fake_rtp_dtls_transport1_.get();
-      if (!(flags1 & RTCP_MUX_REQUIRED)) {
-        fake_rtcp_dtls_transport1_.reset(new cricket::FakeDtlsTransport(
-            "channel1", cricket::ICE_CANDIDATE_COMPONENT_RTCP));
-        rtcp1 = fake_rtcp_dtls_transport1_.get();
-      }
-      if (flags1 & DTLS) {
-        auto cert1 =
-            rtc::RTCCertificate::Create(std::unique_ptr<rtc::SSLIdentity>(
-                rtc::SSLIdentity::Generate("session1", rtc::KT_DEFAULT)));
-        fake_rtp_dtls_transport1_->SetLocalCertificate(cert1);
-        if (fake_rtcp_dtls_transport1_) {
-          fake_rtcp_dtls_transport1_->SetLocalCertificate(cert1);
-        }
-      }
-      if (flags1 & ENCRYPTED_HEADERS) {
-        rtc::CryptoOptions crypto_options;
-        crypto_options.enable_encrypted_rtp_header_extensions = true;
-        fake_rtp_dtls_transport1_->SetCryptoOptions(crypto_options);
-        if (fake_rtcp_dtls_transport1_) {
-          fake_rtcp_dtls_transport1_->SetCryptoOptions(crypto_options);
-        }
-      }
-      if (flags1 & GCM_CIPHER) {
-        fake_rtp_dtls_transport1_->SetSrtpCryptoSuite(
-            rtc::SRTP_AEAD_AES_256_GCM);
-        if (fake_rtcp_dtls_transport1_) {
-          fake_rtcp_dtls_transport1_->SetSrtpCryptoSuite(
-              rtc::SRTP_AEAD_AES_256_GCM);
-        }
-      }
-    }
-    // Based on flags, create fake DTLS or raw packet transports.
-    if (flags2 & RAW_PACKET_TRANSPORT) {
-      fake_rtp_packet_transport2_.reset(
-          new rtc::FakePacketTransport("channel2_rtp"));
-      rtp2 = fake_rtp_packet_transport2_.get();
-      if (!(flags2 & RTCP_MUX_REQUIRED)) {
-        fake_rtcp_packet_transport2_.reset(
-            new rtc::FakePacketTransport("channel2_rtcp"));
-        rtcp2 = fake_rtcp_packet_transport2_.get();
-      }
-    } else {
-      // Confirmed to work with KT_RSA and KT_ECDSA.
-      fake_rtp_dtls_transport2_.reset(new cricket::FakeDtlsTransport(
-          "channel2", cricket::ICE_CANDIDATE_COMPONENT_RTP));
-      rtp2 = fake_rtp_dtls_transport2_.get();
-      if (!(flags2 & RTCP_MUX_REQUIRED)) {
-        fake_rtcp_dtls_transport2_.reset(new cricket::FakeDtlsTransport(
-            "channel2", cricket::ICE_CANDIDATE_COMPONENT_RTCP));
-        rtcp2 = fake_rtcp_dtls_transport2_.get();
-      }
-      if (flags2 & DTLS) {
-        auto cert2 =
-            rtc::RTCCertificate::Create(std::unique_ptr<rtc::SSLIdentity>(
-                rtc::SSLIdentity::Generate("session2", rtc::KT_DEFAULT)));
-        fake_rtp_dtls_transport2_->SetLocalCertificate(cert2);
-        if (fake_rtcp_dtls_transport2_) {
-          fake_rtcp_dtls_transport2_->SetLocalCertificate(cert2);
-        }
-      }
-      if (flags2 & ENCRYPTED_HEADERS) {
-        rtc::CryptoOptions crypto_options;
-        crypto_options.enable_encrypted_rtp_header_extensions = true;
-        fake_rtp_dtls_transport2_->SetCryptoOptions(crypto_options);
-        if (fake_rtcp_dtls_transport2_) {
-          fake_rtcp_dtls_transport2_->SetCryptoOptions(crypto_options);
-        }
-      }
-      if (flags2 & GCM_CIPHER) {
-        fake_rtp_dtls_transport2_->SetSrtpCryptoSuite(
-            rtc::SRTP_AEAD_AES_256_GCM);
-        if (fake_rtcp_dtls_transport2_) {
-          fake_rtcp_dtls_transport2_->SetSrtpCryptoSuite(
-              rtc::SRTP_AEAD_AES_256_GCM);
-        }
-      }
-    }
-    channel1_.reset(
-        CreateChannel(worker_thread, network_thread_, &media_engine_, ch1,
-                      fake_rtp_dtls_transport1_.get(),
-                      fake_rtcp_dtls_transport1_.get(), rtp1, rtcp1, flags1));
-    channel2_.reset(
-        CreateChannel(worker_thread, network_thread_, &media_engine_, ch2,
-                      fake_rtp_dtls_transport2_.get(),
-                      fake_rtcp_dtls_transport2_.get(), rtp2, rtcp2, flags2));
-    channel1_->SignalMediaMonitor.connect(this,
-                                          &ChannelTest<T>::OnMediaMonitor1);
-    channel2_->SignalMediaMonitor.connect(this,
-                                          &ChannelTest<T>::OnMediaMonitor2);
-    channel1_->SignalRtcpMuxFullyActive.connect(
-        this, &ChannelTest<T>::OnRtcpMuxFullyActive1);
-    channel2_->SignalRtcpMuxFullyActive.connect(
-        this, &ChannelTest<T>::OnRtcpMuxFullyActive2);
-    if ((flags1 & DTLS) && (flags2 & DTLS)) {
-      flags1 = (flags1 & ~SECURE);
-      flags2 = (flags2 & ~SECURE);
-    }
-    CreateContent(flags1, kPcmuCodec, kH264Codec,
-                  &local_media_content1_);
-    CreateContent(flags2, kPcmuCodec, kH264Codec,
-                  &local_media_content2_);
-    CopyContent(local_media_content1_, &remote_media_content1_);
-    CopyContent(local_media_content2_, &remote_media_content2_);
-
-    // Add stream information (SSRC) to the local content but not to the remote
-    // content. This means that we per default know the SSRC of what we send but
-    // not what we receive.
-    AddLegacyStreamInContent(kSsrc1, flags1, &local_media_content1_);
-    AddLegacyStreamInContent(kSsrc2, flags2, &local_media_content2_);
-
-    // If SSRC_MUX is used we also need to know the SSRC of the incoming stream.
-    if (flags1 & SSRC_MUX) {
-      AddLegacyStreamInContent(kSsrc1, flags1, &remote_media_content1_);
-    }
-    if (flags2 & SSRC_MUX) {
-      AddLegacyStreamInContent(kSsrc2, flags2, &remote_media_content2_);
-    }
-  }
-  typename T::Channel* CreateChannel(
-      rtc::Thread* worker_thread,
-      rtc::Thread* network_thread,
-      cricket::MediaEngineInterface* engine,
-      typename T::MediaChannel* ch,
-      cricket::DtlsTransportInternal* fake_rtp_dtls_transport,
-      cricket::DtlsTransportInternal* fake_rtcp_dtls_transport,
-      rtc::PacketTransportInternal* fake_rtp_packet_transport,
-      rtc::PacketTransportInternal* fake_rtcp_packet_transport,
-      int flags) {
-    rtc::Thread* signaling_thread = rtc::Thread::Current();
-    typename T::Channel* channel = new typename T::Channel(
-        worker_thread, network_thread, signaling_thread, engine, ch,
-        cricket::CN_AUDIO, (flags & RTCP_MUX_REQUIRED) != 0,
-        (flags & SECURE) != 0);
-    if (!channel->NeedsRtcpTransport()) {
-      fake_rtcp_dtls_transport = nullptr;
-    }
-    if (!channel->Init_w(fake_rtp_dtls_transport, fake_rtcp_dtls_transport,
-                         fake_rtp_packet_transport,
-                         fake_rtcp_packet_transport)) {
-      delete channel;
-      channel = NULL;
-    }
-    return channel;
-  }
-
-  void ConnectFakeTransports() {
-    network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
-      bool asymmetric = false;
-      // Depending on test flags, could be using DTLS or raw packet transport.
-      if (fake_rtp_dtls_transport1_ && fake_rtp_dtls_transport2_) {
-        fake_rtp_dtls_transport1_->SetDestination(
-            fake_rtp_dtls_transport2_.get(), asymmetric);
-      }
-      if (fake_rtcp_dtls_transport1_ && fake_rtcp_dtls_transport2_) {
-        fake_rtcp_dtls_transport1_->SetDestination(
-            fake_rtcp_dtls_transport2_.get(), asymmetric);
-      }
-      if (fake_rtp_packet_transport1_ && fake_rtp_packet_transport2_) {
-        fake_rtp_packet_transport1_->SetDestination(
-            fake_rtp_packet_transport2_.get(), asymmetric);
-      }
-      if (fake_rtcp_packet_transport1_ && fake_rtcp_packet_transport2_) {
-        fake_rtcp_packet_transport1_->SetDestination(
-            fake_rtcp_packet_transport2_.get(), asymmetric);
-      }
-    });
-  }
-
-  bool SendInitiate() {
-    bool result = channel1_->SetLocalContent(&local_media_content1_,
-                                             CA_OFFER, NULL);
-    if (result) {
-      channel1_->Enable(true);
-      result = channel2_->SetRemoteContent(&remote_media_content1_,
-                                           CA_OFFER, NULL);
-      if (result) {
-        ConnectFakeTransports();
-        result = channel2_->SetLocalContent(&local_media_content2_,
-                                            CA_ANSWER, NULL);
-      }
-    }
-    return result;
-  }
-
-  bool SendAccept() {
-    channel2_->Enable(true);
-    return channel1_->SetRemoteContent(&remote_media_content2_,
-                                       CA_ANSWER, NULL);
-  }
-
-  bool SendOffer() {
-    bool result = channel1_->SetLocalContent(&local_media_content1_,
-                                             CA_OFFER, NULL);
-    if (result) {
-      channel1_->Enable(true);
-      result = channel2_->SetRemoteContent(&remote_media_content1_,
-                                           CA_OFFER, NULL);
-    }
-    return result;
-  }
-
-  bool SendProvisionalAnswer() {
-    bool result = channel2_->SetLocalContent(&local_media_content2_,
-                                             CA_PRANSWER, NULL);
-    if (result) {
-      channel2_->Enable(true);
-      result = channel1_->SetRemoteContent(&remote_media_content2_,
-                                           CA_PRANSWER, NULL);
-      ConnectFakeTransports();
-    }
-    return result;
-  }
-
-  bool SendFinalAnswer() {
-    bool result = channel2_->SetLocalContent(&local_media_content2_,
-                                             CA_ANSWER, NULL);
-    if (result)
-      result = channel1_->SetRemoteContent(&remote_media_content2_,
-                                           CA_ANSWER, NULL);
-    return result;
-  }
-
-  bool Terminate() {
-    channel1_.reset();
-    channel2_.reset();
-    fake_rtp_dtls_transport1_.reset();
-    fake_rtcp_dtls_transport1_.reset();
-    fake_rtp_dtls_transport2_.reset();
-    fake_rtcp_dtls_transport2_.reset();
-    fake_rtp_packet_transport1_.reset();
-    fake_rtcp_packet_transport1_.reset();
-    fake_rtp_packet_transport2_.reset();
-    fake_rtcp_packet_transport2_.reset();
-    if (network_thread_keeper_) {
-      network_thread_keeper_.reset();
-    }
-    return true;
-  }
-
-  bool AddStream1(int id) {
-    return channel1_->AddRecvStream(cricket::StreamParams::CreateLegacy(id));
-  }
-  bool RemoveStream1(int id) {
-    return channel1_->RemoveRecvStream(id);
-  }
-
-  void SendRtp1() {
-    media_channel1_->SendRtp(rtp_packet_.data(), rtp_packet_.size(),
-                             rtc::PacketOptions());
-  }
-  void SendRtp2() {
-    media_channel2_->SendRtp(rtp_packet_.data(), rtp_packet_.size(),
-                             rtc::PacketOptions());
-  }
-  void SendRtcp1() {
-    media_channel1_->SendRtcp(rtcp_packet_.data(), rtcp_packet_.size());
-  }
-  void SendRtcp2() {
-    media_channel2_->SendRtcp(rtcp_packet_.data(), rtcp_packet_.size());
-  }
-  // Methods to send custom data.
-  void SendCustomRtp1(uint32_t ssrc, int sequence_number, int pl_type = -1) {
-    rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
-    media_channel1_->SendRtp(data.data(), data.size(), rtc::PacketOptions());
-  }
-  void SendCustomRtp2(uint32_t ssrc, int sequence_number, int pl_type = -1) {
-    rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
-    media_channel2_->SendRtp(data.data(), data.size(), rtc::PacketOptions());
-  }
-  void SendCustomRtcp1(uint32_t ssrc) {
-    rtc::Buffer data = CreateRtcpData(ssrc);
-    media_channel1_->SendRtcp(data.data(), data.size());
-  }
-  void SendCustomRtcp2(uint32_t ssrc) {
-    rtc::Buffer data = CreateRtcpData(ssrc);
-    media_channel2_->SendRtcp(data.data(), data.size());
-  }
-
-  bool CheckRtp1() {
-    return media_channel1_->CheckRtp(rtp_packet_.data(), rtp_packet_.size());
-  }
-  bool CheckRtp2() {
-    return media_channel2_->CheckRtp(rtp_packet_.data(), rtp_packet_.size());
-  }
-  bool CheckRtcp1() {
-    return media_channel1_->CheckRtcp(rtcp_packet_.data(), rtcp_packet_.size());
-  }
-  bool CheckRtcp2() {
-    return media_channel2_->CheckRtcp(rtcp_packet_.data(), rtcp_packet_.size());
-  }
-  // Methods to check custom data.
-  bool CheckCustomRtp1(uint32_t ssrc, int sequence_number, int pl_type = -1) {
-    rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
-    return media_channel1_->CheckRtp(data.data(), data.size());
-  }
-  bool CheckCustomRtp2(uint32_t ssrc, int sequence_number, int pl_type = -1) {
-    rtc::Buffer data = CreateRtpData(ssrc, sequence_number, pl_type);
-    return media_channel2_->CheckRtp(data.data(), data.size());
-  }
-  bool CheckCustomRtcp1(uint32_t ssrc) {
-    rtc::Buffer data = CreateRtcpData(ssrc);
-    return media_channel1_->CheckRtcp(data.data(), data.size());
-  }
-  bool CheckCustomRtcp2(uint32_t ssrc) {
-    rtc::Buffer data = CreateRtcpData(ssrc);
-    return media_channel2_->CheckRtcp(data.data(), data.size());
-  }
-  rtc::Buffer CreateRtpData(uint32_t ssrc, int sequence_number, int pl_type) {
-    rtc::Buffer data(rtp_packet_.data(), rtp_packet_.size());
-    // Set SSRC in the rtp packet copy.
-    rtc::SetBE32(data.data() + 8, ssrc);
-    rtc::SetBE16(data.data() + 2, sequence_number);
-    if (pl_type >= 0) {
-      rtc::Set8(data.data(), 1, static_cast<uint8_t>(pl_type));
-    }
-    return data;
-  }
-  rtc::Buffer CreateRtcpData(uint32_t ssrc) {
-    rtc::Buffer data(rtcp_packet_.data(), rtcp_packet_.size());
-    // Set SSRC in the rtcp packet copy.
-    rtc::SetBE32(data.data() + 4, ssrc);
-    return data;
-  }
-
-  bool CheckNoRtp1() {
-    return media_channel1_->CheckNoRtp();
-  }
-  bool CheckNoRtp2() {
-    return media_channel2_->CheckNoRtp();
-  }
-  bool CheckNoRtcp1() {
-    return media_channel1_->CheckNoRtcp();
-  }
-  bool CheckNoRtcp2() {
-    return media_channel2_->CheckNoRtcp();
-  }
-
-  void CreateContent(int flags,
-                     const cricket::AudioCodec& audio_codec,
-                     const cricket::VideoCodec& video_codec,
-                     typename T::Content* content) {
-    // overridden in specialized classes
-  }
-  void CopyContent(const typename T::Content& source,
-                   typename T::Content* content) {
-    // overridden in specialized classes
-  }
-
-  // Creates a MediaContent with one stream.
-  // kPcmuCodec is used as audio codec and kH264Codec is used as video codec.
-  typename T::Content* CreateMediaContentWithStream(uint32_t ssrc) {
-    typename T::Content* content = new typename T::Content();
-    CreateContent(SECURE, kPcmuCodec, kH264Codec, content);
-    AddLegacyStreamInContent(ssrc, 0, content);
-    return content;
-  }
-
-  // Will manage the lifetime of a CallThread, making sure it's
-  // destroyed before this object goes out of scope.
-  class ScopedCallThread {
-   public:
-    template <class FunctorT>
-    ScopedCallThread(const FunctorT& functor)
-        : thread_(rtc::Thread::Create()),
-          task_(new rtc::FunctorMessageHandler<void, FunctorT>(functor)) {
-      thread_->Start();
-      thread_->Post(RTC_FROM_HERE, task_.get());
-    }
-
-    ~ScopedCallThread() { thread_->Stop(); }
-
-    rtc::Thread* thread() { return thread_.get(); }
-
-   private:
-    std::unique_ptr<rtc::Thread> thread_;
-    std::unique_ptr<rtc::MessageHandler> task_;
-  };
-
-  bool CodecMatches(const typename T::Codec& c1, const typename T::Codec& c2) {
-    return false;  // overridden in specialized classes
-  }
-
-  void OnMediaMonitor1(typename T::Channel* channel,
-                       const typename T::MediaInfo& info) {
-    RTC_DCHECK_EQ(channel, channel1_.get());
-    media_info_callbacks1_++;
-  }
-  void OnMediaMonitor2(typename T::Channel* channel,
-                       const typename T::MediaInfo& info) {
-    RTC_DCHECK_EQ(channel, channel2_.get());
-    media_info_callbacks2_++;
-  }
-  void OnRtcpMuxFullyActive1(const std::string&) {
-    rtcp_mux_activated_callbacks1_++;
-  }
-  void OnRtcpMuxFullyActive2(const std::string&) {
-    rtcp_mux_activated_callbacks2_++;
-  }
-
-  cricket::CandidatePairInterface* last_selected_candidate_pair() {
-    return last_selected_candidate_pair_;
-  }
-
-  void AddLegacyStreamInContent(uint32_t ssrc,
-                                int flags,
-                                typename T::Content* content) {
-    // Base implementation.
-  }
-
-  // Tests that can be used by derived classes.
-
-  // Basic sanity check.
-  void TestInit() {
-    CreateChannels(0, 0);
-    EXPECT_FALSE(channel1_->srtp_active());
-    EXPECT_FALSE(media_channel1_->sending());
-    if (verify_playout_) {
-      EXPECT_FALSE(media_channel1_->playout());
-    }
-    EXPECT_TRUE(media_channel1_->codecs().empty());
-    EXPECT_TRUE(media_channel1_->recv_streams().empty());
-    EXPECT_TRUE(media_channel1_->rtp_packets().empty());
-    EXPECT_TRUE(media_channel1_->rtcp_packets().empty());
-  }
-
-  // Test that SetLocalContent and SetRemoteContent properly configure
-  // the codecs.
-  void TestSetContents() {
-    CreateChannels(0, 0);
-    typename T::Content content;
-    CreateContent(0, kPcmuCodec, kH264Codec, &content);
-    EXPECT_TRUE(channel1_->SetLocalContent(&content, CA_OFFER, NULL));
-    EXPECT_EQ(0U, media_channel1_->codecs().size());
-    EXPECT_TRUE(channel1_->SetRemoteContent(&content, CA_ANSWER, NULL));
-    ASSERT_EQ(1U, media_channel1_->codecs().size());
-    EXPECT_TRUE(CodecMatches(content.codecs()[0],
-                             media_channel1_->codecs()[0]));
-  }
-
-  // Test that SetLocalContent and SetRemoteContent properly deals
-  // with an empty offer.
-  void TestSetContentsNullOffer() {
-    CreateChannels(0, 0);
-    typename T::Content content;
-    EXPECT_TRUE(channel1_->SetLocalContent(&content, CA_OFFER, NULL));
-    CreateContent(0, kPcmuCodec, kH264Codec, &content);
-    EXPECT_EQ(0U, media_channel1_->codecs().size());
-    EXPECT_TRUE(channel1_->SetRemoteContent(&content, CA_ANSWER, NULL));
-    ASSERT_EQ(1U, media_channel1_->codecs().size());
-    EXPECT_TRUE(CodecMatches(content.codecs()[0],
-                             media_channel1_->codecs()[0]));
-  }
-
-  // Test that SetLocalContent and SetRemoteContent properly set RTCP
-  // mux.
-  void TestSetContentsRtcpMux() {
-    CreateChannels(0, 0);
-    typename T::Content content;
-    CreateContent(0, kPcmuCodec, kH264Codec, &content);
-    // Both sides agree on mux. Should no longer be a separate RTCP channel.
-    content.set_rtcp_mux(true);
-    EXPECT_TRUE(channel1_->SetLocalContent(&content, CA_OFFER, NULL));
-    EXPECT_TRUE(channel1_->SetRemoteContent(&content, CA_ANSWER, NULL));
-    // Only initiator supports mux. Should still have a separate RTCP channel.
-    EXPECT_TRUE(channel2_->SetLocalContent(&content, CA_OFFER, NULL));
-    content.set_rtcp_mux(false);
-    EXPECT_TRUE(channel2_->SetRemoteContent(&content, CA_ANSWER, NULL));
-  }
-
-  // Test that SetLocalContent and SetRemoteContent properly set RTCP
-  // mux when a provisional answer is received.
-  void TestSetContentsRtcpMuxWithPrAnswer() {
-    CreateChannels(0, 0);
-    typename T::Content content;
-    CreateContent(0, kPcmuCodec, kH264Codec, &content);
-    content.set_rtcp_mux(true);
-    EXPECT_TRUE(channel1_->SetLocalContent(&content, CA_OFFER, NULL));
-    EXPECT_TRUE(channel1_->SetRemoteContent(&content, CA_PRANSWER, NULL));
-    // Both sides agree on mux. Should signal RTCP mux as fully activated.
-    EXPECT_EQ(0, rtcp_mux_activated_callbacks1_);
-    EXPECT_TRUE(channel1_->SetRemoteContent(&content, CA_ANSWER, NULL));
-    EXPECT_EQ(1, rtcp_mux_activated_callbacks1_);
-    // Only initiator supports mux. Should still have a separate RTCP channel.
-    EXPECT_TRUE(channel2_->SetLocalContent(&content, CA_OFFER, NULL));
-    content.set_rtcp_mux(false);
-    EXPECT_TRUE(channel2_->SetRemoteContent(&content, CA_PRANSWER, NULL));
-    EXPECT_TRUE(channel2_->SetRemoteContent(&content, CA_ANSWER, NULL));
-    EXPECT_EQ(0, rtcp_mux_activated_callbacks2_);
-  }
-
-  // Test that SetRemoteContent properly deals with a content update.
-  void TestSetRemoteContentUpdate() {
-    CreateChannels(0, 0);
-    typename T::Content content;
-    CreateContent(RTCP_MUX | SECURE, kPcmuCodec, kH264Codec, &content);
-    EXPECT_EQ(0U, media_channel1_->codecs().size());
-    EXPECT_TRUE(channel1_->SetLocalContent(&content, CA_OFFER, NULL));
-    EXPECT_TRUE(channel1_->SetRemoteContent(&content, CA_ANSWER, NULL));
-    ASSERT_EQ(1U, media_channel1_->codecs().size());
-    EXPECT_TRUE(CodecMatches(content.codecs()[0],
-                             media_channel1_->codecs()[0]));
-    // Now update with other codecs.
-    typename T::Content update_content;
-    update_content.set_partial(true);
-    CreateContent(0, kIsacCodec, kH264SvcCodec,
-                  &update_content);
-    EXPECT_TRUE(channel1_->SetRemoteContent(&update_content, CA_UPDATE, NULL));
-    ASSERT_EQ(1U, media_channel1_->codecs().size());
-    EXPECT_TRUE(CodecMatches(update_content.codecs()[0],
-                             media_channel1_->codecs()[0]));
-    // Now update without any codecs. This is ignored.
-    typename T::Content empty_content;
-    empty_content.set_partial(true);
-    EXPECT_TRUE(channel1_->SetRemoteContent(&empty_content, CA_UPDATE, NULL));
-    ASSERT_EQ(1U, media_channel1_->codecs().size());
-    EXPECT_TRUE(CodecMatches(update_content.codecs()[0],
-                             media_channel1_->codecs()[0]));
-  }
-
-  // Test that Add/RemoveStream properly forward to the media channel.
-  void TestStreams() {
-    CreateChannels(0, 0);
-    EXPECT_TRUE(AddStream1(1));
-    EXPECT_TRUE(AddStream1(2));
-    EXPECT_EQ(2U, media_channel1_->recv_streams().size());
-    EXPECT_TRUE(RemoveStream1(2));
-    EXPECT_EQ(1U, media_channel1_->recv_streams().size());
-    EXPECT_TRUE(RemoveStream1(1));
-    EXPECT_EQ(0U, media_channel1_->recv_streams().size());
-  }
-
-  // Test that SetLocalContent properly handles adding and removing StreamParams
-  // to the local content description.
-  // This test uses the CA_UPDATE action that don't require a full
-  // MediaContentDescription to do an update.
-  void TestUpdateStreamsInLocalContent() {
-    cricket::StreamParams stream1;
-    stream1.groupid = "group1";
-    stream1.id = "stream1";
-    stream1.ssrcs.push_back(kSsrc1);
-    stream1.cname = "stream1_cname";
-
-    cricket::StreamParams stream2;
-    stream2.groupid = "group2";
-    stream2.id = "stream2";
-    stream2.ssrcs.push_back(kSsrc2);
-    stream2.cname = "stream2_cname";
-
-    cricket::StreamParams stream3;
-    stream3.groupid = "group3";
-    stream3.id = "stream3";
-    stream3.ssrcs.push_back(kSsrc3);
-    stream3.cname = "stream3_cname";
-
-    CreateChannels(0, 0);
-    typename T::Content content1;
-    CreateContent(0, kPcmuCodec, kH264Codec, &content1);
-    content1.AddStream(stream1);
-    EXPECT_EQ(0u, media_channel1_->send_streams().size());
-    EXPECT_TRUE(channel1_->SetLocalContent(&content1, CA_OFFER, NULL));
-
-    ASSERT_EQ(1u, media_channel1_->send_streams().size());
-    EXPECT_EQ(stream1, media_channel1_->send_streams()[0]);
-
-    // Update the local streams by adding another sending stream.
-    // Use a partial updated session description.
-    typename T::Content content2;
-    content2.AddStream(stream2);
-    content2.AddStream(stream3);
-    content2.set_partial(true);
-    EXPECT_TRUE(channel1_->SetLocalContent(&content2, CA_UPDATE, NULL));
-    ASSERT_EQ(3u, media_channel1_->send_streams().size());
-    EXPECT_EQ(stream1, media_channel1_->send_streams()[0]);
-    EXPECT_EQ(stream2, media_channel1_->send_streams()[1]);
-    EXPECT_EQ(stream3, media_channel1_->send_streams()[2]);
-
-    // Update the local streams by removing the first sending stream.
-    // This is done by removing all SSRCS for this particular stream.
-    typename T::Content content3;
-    stream1.ssrcs.clear();
-    content3.AddStream(stream1);
-    content3.set_partial(true);
-    EXPECT_TRUE(channel1_->SetLocalContent(&content3, CA_UPDATE, NULL));
-    ASSERT_EQ(2u, media_channel1_->send_streams().size());
-    EXPECT_EQ(stream2, media_channel1_->send_streams()[0]);
-    EXPECT_EQ(stream3, media_channel1_->send_streams()[1]);
-
-    // Update the local streams with a stream that does not change.
-    // THe update is ignored.
-    typename T::Content content4;
-    content4.AddStream(stream2);
-    content4.set_partial(true);
-    EXPECT_TRUE(channel1_->SetLocalContent(&content4, CA_UPDATE, NULL));
-    ASSERT_EQ(2u, media_channel1_->send_streams().size());
-    EXPECT_EQ(stream2, media_channel1_->send_streams()[0]);
-    EXPECT_EQ(stream3, media_channel1_->send_streams()[1]);
-  }
-
-  // Test that SetRemoteContent properly handles adding and removing
-  // StreamParams to the remote content description.
-  // This test uses the CA_UPDATE action that don't require a full
-  // MediaContentDescription to do an update.
-  void TestUpdateStreamsInRemoteContent() {
-    cricket::StreamParams stream1;
-    stream1.id = "Stream1";
-    stream1.groupid = "1";
-    stream1.ssrcs.push_back(kSsrc1);
-    stream1.cname = "stream1_cname";
-
-    cricket::StreamParams stream2;
-    stream2.id = "Stream2";
-    stream2.groupid = "2";
-    stream2.ssrcs.push_back(kSsrc2);
-    stream2.cname = "stream2_cname";
-
-    cricket::StreamParams stream3;
-    stream3.id = "Stream3";
-    stream3.groupid = "3";
-    stream3.ssrcs.push_back(kSsrc3);
-    stream3.cname = "stream3_cname";
-
-    CreateChannels(0, 0);
-    typename T::Content content1;
-    CreateContent(0, kPcmuCodec, kH264Codec, &content1);
-    content1.AddStream(stream1);
-    EXPECT_EQ(0u, media_channel1_->recv_streams().size());
-    EXPECT_TRUE(channel1_->SetRemoteContent(&content1, CA_OFFER, NULL));
-
-    ASSERT_EQ(1u, media_channel1_->codecs().size());
-    ASSERT_EQ(1u, media_channel1_->recv_streams().size());
-    EXPECT_EQ(stream1, media_channel1_->recv_streams()[0]);
-
-    // Update the remote streams by adding another sending stream.
-    // Use a partial updated session description.
-    typename T::Content content2;
-    content2.AddStream(stream2);
-    content2.AddStream(stream3);
-    content2.set_partial(true);
-    EXPECT_TRUE(channel1_->SetRemoteContent(&content2, CA_UPDATE, NULL));
-    ASSERT_EQ(3u, media_channel1_->recv_streams().size());
-    EXPECT_EQ(stream1, media_channel1_->recv_streams()[0]);
-    EXPECT_EQ(stream2, media_channel1_->recv_streams()[1]);
-    EXPECT_EQ(stream3, media_channel1_->recv_streams()[2]);
-
-    // Update the remote streams by removing the first stream.
-    // This is done by removing all SSRCS for this particular stream.
-    typename T::Content content3;
-    stream1.ssrcs.clear();
-    content3.AddStream(stream1);
-    content3.set_partial(true);
-    EXPECT_TRUE(channel1_->SetRemoteContent(&content3, CA_UPDATE, NULL));
-    ASSERT_EQ(2u, media_channel1_->recv_streams().size());
-    EXPECT_EQ(stream2, media_channel1_->recv_streams()[0]);
-    EXPECT_EQ(stream3, media_channel1_->recv_streams()[1]);
-
-    // Update the remote streams with a stream that does not change.
-    // The update is ignored.
-    typename T::Content content4;
-    content4.AddStream(stream2);
-    content4.set_partial(true);
-    EXPECT_TRUE(channel1_->SetRemoteContent(&content4, CA_UPDATE, NULL));
-    ASSERT_EQ(2u, media_channel1_->recv_streams().size());
-    EXPECT_EQ(stream2, media_channel1_->recv_streams()[0]);
-    EXPECT_EQ(stream3, media_channel1_->recv_streams()[1]);
-  }
-
-  // Test that SetLocalContent and SetRemoteContent properly
-  // handles adding and removing StreamParams when the action is a full
-  // CA_OFFER / CA_ANSWER.
-  void TestChangeStreamParamsInContent() {
-    cricket::StreamParams stream1;
-    stream1.groupid = "group1";
-    stream1.id = "stream1";
-    stream1.ssrcs.push_back(kSsrc1);
-    stream1.cname = "stream1_cname";
-
-    cricket::StreamParams stream2;
-    stream2.groupid = "group1";
-    stream2.id = "stream2";
-    stream2.ssrcs.push_back(kSsrc2);
-    stream2.cname = "stream2_cname";
-
-    // Setup a call where channel 1 send |stream1| to channel 2.
-    CreateChannels(0, 0);
-    typename T::Content content1;
-    CreateContent(0, kPcmuCodec, kH264Codec, &content1);
-    content1.AddStream(stream1);
-    EXPECT_TRUE(channel1_->SetLocalContent(&content1, CA_OFFER, NULL));
-    EXPECT_TRUE(channel1_->Enable(true));
-    EXPECT_EQ(1u, media_channel1_->send_streams().size());
-
-    EXPECT_TRUE(channel2_->SetRemoteContent(&content1, CA_OFFER, NULL));
-    EXPECT_EQ(1u, media_channel2_->recv_streams().size());
-    ConnectFakeTransports();
-
-    // Channel 2 do not send anything.
-    typename T::Content content2;
-    CreateContent(0, kPcmuCodec, kH264Codec, &content2);
-    EXPECT_TRUE(channel1_->SetRemoteContent(&content2, CA_ANSWER, NULL));
-    EXPECT_EQ(0u, media_channel1_->recv_streams().size());
-    EXPECT_TRUE(channel2_->SetLocalContent(&content2, CA_ANSWER, NULL));
-    EXPECT_TRUE(channel2_->Enable(true));
-    EXPECT_EQ(0u, media_channel2_->send_streams().size());
-
-    SendCustomRtp1(kSsrc1, 0);
-    WaitForThreads();
-    EXPECT_TRUE(CheckCustomRtp2(kSsrc1, 0));
-
-    // Let channel 2 update the content by sending |stream2| and enable SRTP.
-    typename T::Content content3;
-    CreateContent(SECURE, kPcmuCodec, kH264Codec, &content3);
-    content3.AddStream(stream2);
-    EXPECT_TRUE(channel2_->SetLocalContent(&content3, CA_OFFER, NULL));
-    ASSERT_EQ(1u, media_channel2_->send_streams().size());
-    EXPECT_EQ(stream2, media_channel2_->send_streams()[0]);
-
-    EXPECT_TRUE(channel1_->SetRemoteContent(&content3, CA_OFFER, NULL));
-    ASSERT_EQ(1u, media_channel1_->recv_streams().size());
-    EXPECT_EQ(stream2, media_channel1_->recv_streams()[0]);
-
-    // Channel 1 replies but stop sending stream1.
-    typename T::Content content4;
-    CreateContent(SECURE, kPcmuCodec, kH264Codec, &content4);
-    EXPECT_TRUE(channel1_->SetLocalContent(&content4, CA_ANSWER, NULL));
-    EXPECT_EQ(0u, media_channel1_->send_streams().size());
-
-    EXPECT_TRUE(channel2_->SetRemoteContent(&content4, CA_ANSWER, NULL));
-    EXPECT_EQ(0u, media_channel2_->recv_streams().size());
-
-    EXPECT_TRUE(channel1_->srtp_active());
-    EXPECT_TRUE(channel2_->srtp_active());
-    SendCustomRtp2(kSsrc2, 0);
-    WaitForThreads();
-    EXPECT_TRUE(CheckCustomRtp1(kSsrc2, 0));
-  }
-
-  enum EncryptedHeaderTestScenario {
-    // Offer/Answer are processed before DTLS completes.
-    DEFAULT,
-    // DTLS completes before any Offer/Answer have been sent.
-    DTLS_BEFORE_OFFER_ANSWER,
-    // DTLS completes after channel 2 has processed (remote) Offer and (local)
-    // Answer.
-    DTLS_AFTER_CHANNEL2_READY,
-  };
-
-  // Test that encrypted header extensions are working and can be changed when
-  // sending a new OFFER/ANSWER.
-  void TestChangeEncryptedHeaderExtensions(int flags,
-      EncryptedHeaderTestScenario scenario = DEFAULT) {
-    RTC_CHECK(scenario == 0 || (flags & DTLS));
-    struct PacketListener : public sigslot::has_slots<> {
-      PacketListener() {}
-      void OnReadPacket(rtc::PacketTransportInternal* transport,
-          const char* data, size_t size, const rtc::PacketTime& time,
-          int flags) {
-        CompareHeaderExtensions(
-            reinterpret_cast<const char*>(kPcmuFrameWithExtensions),
-            sizeof(kPcmuFrameWithExtensions), data, size, encrypted_headers,
-            false);
-      }
-      std::vector<int> encrypted_headers;
-    } packet_listener1, packet_listener2;
-
-    cricket::StreamParams stream1;
-    stream1.groupid = "group1";
-    stream1.id = "stream1";
-    stream1.ssrcs.push_back(kSsrc1);
-    stream1.cname = "stream1_cname";
-
-    cricket::StreamParams stream2;
-    stream2.groupid = "group1";
-    stream2.id = "stream2";
-    stream2.ssrcs.push_back(kSsrc2);
-    stream2.cname = "stream2_cname";
-
-    // Use SRTP when testing encrypted extensions.
-    int channel_flags = flags | SECURE | ENCRYPTED_HEADERS;
-    // Enable SDES if channel is not using DTLS.
-    int content_flags = (channel_flags & DTLS) == 0 ? SECURE : 0;
-
-    // kPcmuFrameWithExtensions contains RTP extension headers with ids 1-4.
-    // Make sure to use URIs that are supported for encryption.
-    cricket::RtpHeaderExtensions extensions1;
-    extensions1.push_back(
-        RtpExtension(RtpExtension::kAudioLevelUri, 10));
-    extensions1.push_back(
-        RtpExtension(RtpExtension::kAudioLevelUri, 1, true));
-
-    cricket::RtpHeaderExtensions extensions2;
-    extensions2.push_back(
-        RtpExtension(RtpExtension::kAudioLevelUri, 10));
-    extensions2.push_back(
-        RtpExtension(RtpExtension::kAudioLevelUri, 2, true));
-    extensions2.push_back(
-        RtpExtension(RtpExtension::kVideoRotationUri, 3));
-    extensions2.push_back(
-        RtpExtension(RtpExtension::kTimestampOffsetUri, 4, true));
-
-    // Setup a call where channel 1 send |stream1| to channel 2.
-    CreateChannels(channel_flags, channel_flags);
-    fake_rtp_dtls_transport1_->fake_ice_transport()->SignalReadPacket.connect(
-        &packet_listener1, &PacketListener::OnReadPacket);
-    fake_rtp_dtls_transport2_->fake_ice_transport()->SignalReadPacket.connect(
-        &packet_listener2, &PacketListener::OnReadPacket);
-
-    if (scenario == DTLS_BEFORE_OFFER_ANSWER) {
-      ConnectFakeTransports();
-      WaitForThreads();
-    }
-
-    typename T::Content content1;
-    CreateContent(content_flags, kPcmuCodec, kH264Codec, &content1);
-    content1.AddStream(stream1);
-    content1.set_rtp_header_extensions(extensions1);
-    EXPECT_TRUE(channel1_->SetLocalContent(&content1, CA_OFFER, NULL));
-    EXPECT_TRUE(channel1_->Enable(true));
-    EXPECT_EQ(1u, media_channel1_->send_streams().size());
-    packet_listener1.encrypted_headers.push_back(1);
-
-    EXPECT_TRUE(channel2_->SetRemoteContent(&content1, CA_OFFER, NULL));
-    EXPECT_EQ(1u, media_channel2_->recv_streams().size());
-
-    // Channel 2 sends back |stream2|.
-    typename T::Content content2;
-    CreateContent(content_flags, kPcmuCodec, kH264Codec, &content2);
-    content2.AddStream(stream2);
-    content2.set_rtp_header_extensions(extensions1);
-    EXPECT_TRUE(channel2_->SetLocalContent(&content2, CA_ANSWER, NULL));
-    EXPECT_TRUE(channel2_->Enable(true));
-    EXPECT_EQ(1u, media_channel2_->send_streams().size());
-    packet_listener2.encrypted_headers.push_back(1);
-
-    if (scenario == DTLS_AFTER_CHANNEL2_READY) {
-      ConnectFakeTransports();
-      WaitForThreads();
-    }
-
-    if (scenario == DTLS_BEFORE_OFFER_ANSWER ||
-        scenario == DTLS_AFTER_CHANNEL2_READY) {
-      // In both scenarios with partially completed Offer/Answer, sending
-      // packets from Channel 2 to Channel 1 should work.
-      SendCustomRtp2(kSsrc2, 0);
-      WaitForThreads();
-      EXPECT_TRUE(CheckCustomRtp1(kSsrc2, 0));
-    }
-
-    EXPECT_TRUE(channel1_->SetRemoteContent(&content2, CA_ANSWER, NULL));
-    EXPECT_EQ(1u, media_channel1_->recv_streams().size());
-
-    if (scenario == DEFAULT) {
-      ConnectFakeTransports();
-      WaitForThreads();
-    }
-
-    SendCustomRtp1(kSsrc1, 0);
-    SendCustomRtp2(kSsrc2, 0);
-    WaitForThreads();
-    EXPECT_TRUE(CheckCustomRtp2(kSsrc1, 0));
-    EXPECT_TRUE(CheckCustomRtp1(kSsrc2, 0));
-
-    // Let channel 2 update the encrypted header extensions.
-    typename T::Content content3;
-    CreateContent(content_flags, kPcmuCodec, kH264Codec, &content3);
-    content3.AddStream(stream2);
-    content3.set_rtp_header_extensions(extensions2);
-    EXPECT_TRUE(channel2_->SetLocalContent(&content3, CA_OFFER, NULL));
-    ASSERT_EQ(1u, media_channel2_->send_streams().size());
-    EXPECT_EQ(stream2, media_channel2_->send_streams()[0]);
-    packet_listener2.encrypted_headers.clear();
-    packet_listener2.encrypted_headers.push_back(2);
-    packet_listener2.encrypted_headers.push_back(4);
-
-    EXPECT_TRUE(channel1_->SetRemoteContent(&content3, CA_OFFER, NULL));
-    ASSERT_EQ(1u, media_channel1_->recv_streams().size());
-    EXPECT_EQ(stream2, media_channel1_->recv_streams()[0]);
-
-    // Channel 1 is already sending the new encrypted extensions. These
-    // can be decrypted by channel 2. Channel 2 is still sending the old
-    // encrypted extensions (which can be decrypted by channel 1).
-
-    if (flags & DTLS) {
-      // DTLS supports updating the encrypted extensions with only the OFFER
-      // being processed. For SDES both the OFFER and ANSWER must have been
-      // processed to update encrypted extensions, so we can't check this case.
-      SendCustomRtp1(kSsrc1, 0);
-      SendCustomRtp2(kSsrc2, 0);
-      WaitForThreads();
-      EXPECT_TRUE(CheckCustomRtp2(kSsrc1, 0));
-      EXPECT_TRUE(CheckCustomRtp1(kSsrc2, 0));
-    }
-
-    // Channel 1 replies with the same extensions.
-    typename T::Content content4;
-    CreateContent(content_flags, kPcmuCodec, kH264Codec, &content4);
-    content4.AddStream(stream1);
-    content4.set_rtp_header_extensions(extensions2);
-    EXPECT_TRUE(channel1_->SetLocalContent(&content4, CA_ANSWER, NULL));
-    EXPECT_EQ(1u, media_channel1_->send_streams().size());
-    packet_listener1.encrypted_headers.clear();
-    packet_listener1.encrypted_headers.push_back(2);
-    packet_listener1.encrypted_headers.push_back(4);
-
-    EXPECT_TRUE(channel2_->SetRemoteContent(&content4, CA_ANSWER, NULL));
-    EXPECT_EQ(1u, media_channel2_->recv_streams().size());
-
-    SendCustomRtp1(kSsrc1, 0);
-    SendCustomRtp2(kSsrc2, 0);
-    WaitForThreads();
-    EXPECT_TRUE(CheckCustomRtp2(kSsrc1, 0));
-    EXPECT_TRUE(CheckCustomRtp1(kSsrc2, 0));
-  }
-
-  // Test that we only start playout and sending at the right times.
-  void TestPlayoutAndSendingStates() {
-    CreateChannels(0, 0);
-    if (verify_playout_) {
-      EXPECT_FALSE(media_channel1_->playout());
-    }
-    EXPECT_FALSE(media_channel1_->sending());
-    if (verify_playout_) {
-      EXPECT_FALSE(media_channel2_->playout());
-    }
-    EXPECT_FALSE(media_channel2_->sending());
-    EXPECT_TRUE(channel1_->Enable(true));
-    if (verify_playout_) {
-      EXPECT_FALSE(media_channel1_->playout());
-    }
-    EXPECT_FALSE(media_channel1_->sending());
-    EXPECT_TRUE(channel1_->SetLocalContent(&local_media_content1_,
-                                           CA_OFFER, NULL));
-    if (verify_playout_) {
-      EXPECT_TRUE(media_channel1_->playout());
-    }
-    EXPECT_FALSE(media_channel1_->sending());
-    EXPECT_TRUE(channel2_->SetRemoteContent(&local_media_content1_,
-                                            CA_OFFER, NULL));
-    if (verify_playout_) {
-      EXPECT_FALSE(media_channel2_->playout());
-    }
-    EXPECT_FALSE(media_channel2_->sending());
-    EXPECT_TRUE(channel2_->SetLocalContent(&local_media_content2_,
-                                           CA_ANSWER, NULL));
-    if (verify_playout_) {
-      EXPECT_FALSE(media_channel2_->playout());
-    }
-    EXPECT_FALSE(media_channel2_->sending());
-    ConnectFakeTransports();
-    if (verify_playout_) {
-      EXPECT_TRUE(media_channel1_->playout());
-    }
-    EXPECT_FALSE(media_channel1_->sending());
-    if (verify_playout_) {
-      EXPECT_FALSE(media_channel2_->playout());
-    }
-    EXPECT_FALSE(media_channel2_->sending());
-    EXPECT_TRUE(channel2_->Enable(true));
-    if (verify_playout_) {
-      EXPECT_TRUE(media_channel2_->playout());
-    }
-    EXPECT_TRUE(media_channel2_->sending());
-    EXPECT_TRUE(channel1_->SetRemoteContent(&local_media_content2_,
-                                            CA_ANSWER, NULL));
-    if (verify_playout_) {
-      EXPECT_TRUE(media_channel1_->playout());
-    }
-    EXPECT_TRUE(media_channel1_->sending());
-  }
-
-  // Test that changing the MediaContentDirection in the local and remote
-  // session description start playout and sending at the right time.
-  void TestMediaContentDirection() {
-    CreateChannels(0, 0);
-    typename T::Content content1;
-    CreateContent(0, kPcmuCodec, kH264Codec, &content1);
-    typename T::Content content2;
-    CreateContent(0, kPcmuCodec, kH264Codec, &content2);
-    // Set |content2| to be InActive.
-    content2.set_direction(cricket::MD_INACTIVE);
-
-    EXPECT_TRUE(channel1_->Enable(true));
-    EXPECT_TRUE(channel2_->Enable(true));
-    if (verify_playout_) {
-      EXPECT_FALSE(media_channel1_->playout());
-    }
-    EXPECT_FALSE(media_channel1_->sending());
-    if (verify_playout_) {
-      EXPECT_FALSE(media_channel2_->playout());
-    }
-    EXPECT_FALSE(media_channel2_->sending());
-
-    EXPECT_TRUE(channel1_->SetLocalContent(&content1, CA_OFFER, NULL));
-    EXPECT_TRUE(channel2_->SetRemoteContent(&content1, CA_OFFER, NULL));
-    EXPECT_TRUE(channel2_->SetLocalContent(&content2, CA_PRANSWER, NULL));
-    EXPECT_TRUE(channel1_->SetRemoteContent(&content2, CA_PRANSWER, NULL));
-    ConnectFakeTransports();
-
-    if (verify_playout_) {
-      EXPECT_TRUE(media_channel1_->playout());
-    }
-    EXPECT_FALSE(media_channel1_->sending());  // remote InActive
-    if (verify_playout_) {
-      EXPECT_FALSE(media_channel2_->playout());  // local InActive
-    }
-    EXPECT_FALSE(media_channel2_->sending());  // local InActive
-
-    // Update |content2| to be RecvOnly.
-    content2.set_direction(cricket::MD_RECVONLY);
-    EXPECT_TRUE(channel2_->SetLocalContent(&content2, CA_PRANSWER, NULL));
-    EXPECT_TRUE(channel1_->SetRemoteContent(&content2, CA_PRANSWER, NULL));
-
-    if (verify_playout_) {
-      EXPECT_TRUE(media_channel1_->playout());
-    }
-    EXPECT_TRUE(media_channel1_->sending());
-    if (verify_playout_) {
-      EXPECT_TRUE(media_channel2_->playout());  // local RecvOnly
-    }
-    EXPECT_FALSE(media_channel2_->sending());  // local RecvOnly
-
-    // Update |content2| to be SendRecv.
-    content2.set_direction(cricket::MD_SENDRECV);
-    EXPECT_TRUE(channel2_->SetLocalContent(&content2, CA_ANSWER, NULL));
-    EXPECT_TRUE(channel1_->SetRemoteContent(&content2, CA_ANSWER, NULL));
-
-    if (verify_playout_) {
-      EXPECT_TRUE(media_channel1_->playout());
-    }
-    EXPECT_TRUE(media_channel1_->sending());
-    if (verify_playout_) {
-      EXPECT_TRUE(media_channel2_->playout());
-    }
-    EXPECT_TRUE(media_channel2_->sending());
-  }
-
-  // Tests that when the transport channel signals a candidate pair change
-  // event, the media channel will receive a call on the network route change.
-  void TestNetworkRouteChanges() {
-    static constexpr uint16_t kLocalNetId = 1;
-    static constexpr uint16_t kRemoteNetId = 2;
-    static constexpr int kLastPacketId = 100;
-
-    CreateChannels(0, 0);
-
-    typename T::MediaChannel* media_channel1 =
-        static_cast<typename T::MediaChannel*>(channel1_->media_channel());
-    ASSERT_TRUE(media_channel1);
-
-    media_channel1->set_num_network_route_changes(0);
-    network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
-      // The transport channel becomes disconnected.
-      fake_rtp_dtls_transport1_->ice_transport()
-          ->SignalSelectedCandidatePairChanged(
-              fake_rtp_dtls_transport1_->ice_transport(), nullptr, -1, false);
-    });
-    WaitForThreads();
-    EXPECT_EQ(1, media_channel1->num_network_route_changes());
-    EXPECT_FALSE(media_channel1->last_network_route().connected);
-    media_channel1->set_num_network_route_changes(0);
-
-    network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
-      // The transport channel becomes connected.
-      rtc::SocketAddress local_address("192.168.1.1", 1000 /* port number */);
-      rtc::SocketAddress remote_address("192.168.1.2", 2000 /* port number */);
-      auto candidate_pair = cricket::FakeCandidatePair::Create(
-          local_address, kLocalNetId, remote_address, kRemoteNetId);
-      fake_rtp_dtls_transport1_->ice_transport()
-          ->SignalSelectedCandidatePairChanged(
-              fake_rtp_dtls_transport1_->ice_transport(), candidate_pair.get(),
-              kLastPacketId, true);
-    });
-    WaitForThreads();
-    EXPECT_EQ(1, media_channel1->num_network_route_changes());
-    rtc::NetworkRoute expected_network_route(true, kLocalNetId, kRemoteNetId,
-                                             kLastPacketId);
-    EXPECT_EQ(expected_network_route, media_channel1->last_network_route());
-    EXPECT_EQ(kLastPacketId,
-              media_channel1->last_network_route().last_sent_packet_id);
-    constexpr int kTransportOverheadPerPacket = 28;  // Ipv4(20) + UDP(8).
-    EXPECT_EQ(kTransportOverheadPerPacket,
-              media_channel1->transport_overhead_per_packet());
-  }
-
-  // Test setting up a call.
-  void TestCallSetup() {
-    CreateChannels(0, 0);
-    EXPECT_FALSE(channel1_->srtp_active());
-    EXPECT_TRUE(SendInitiate());
-    if (verify_playout_) {
-      EXPECT_TRUE(media_channel1_->playout());
-    }
-    EXPECT_FALSE(media_channel1_->sending());
-    EXPECT_TRUE(SendAccept());
-    EXPECT_FALSE(channel1_->srtp_active());
-    EXPECT_TRUE(media_channel1_->sending());
-    EXPECT_EQ(1U, media_channel1_->codecs().size());
-    if (verify_playout_) {
-      EXPECT_TRUE(media_channel2_->playout());
-    }
-    EXPECT_TRUE(media_channel2_->sending());
-    EXPECT_EQ(1U, media_channel2_->codecs().size());
-  }
-
-  // Test that we don't crash if packets are sent during call teardown
-  // when RTCP mux is enabled. This is a regression test against a specific
-  // race condition that would only occur when a RTCP packet was sent during
-  // teardown of a channel on which RTCP mux was enabled.
-  void TestCallTeardownRtcpMux() {
-    class LastWordMediaChannel : public T::MediaChannel {
-     public:
-      LastWordMediaChannel() : T::MediaChannel(NULL, typename T::Options()) {}
-      ~LastWordMediaChannel() {
-        T::MediaChannel::SendRtp(kPcmuFrame, sizeof(kPcmuFrame),
-                                 rtc::PacketOptions());
-        T::MediaChannel::SendRtcp(kRtcpReport, sizeof(kRtcpReport));
-      }
-    };
-    CreateChannels(new LastWordMediaChannel(), new LastWordMediaChannel(),
-                   RTCP_MUX, RTCP_MUX);
-    EXPECT_TRUE(SendInitiate());
-    EXPECT_TRUE(SendAccept());
-    EXPECT_TRUE(Terminate());
-  }
-
-  // Send voice RTP data to the other side and ensure it gets there.
-  void SendRtpToRtp() {
-    CreateChannels(RTCP_MUX | RTCP_MUX_REQUIRED, RTCP_MUX | RTCP_MUX_REQUIRED);
-    EXPECT_TRUE(SendInitiate());
-    EXPECT_TRUE(SendAccept());
-    EXPECT_FALSE(channel1_->NeedsRtcpTransport());
-    EXPECT_FALSE(channel2_->NeedsRtcpTransport());
-    SendRtp1();
-    SendRtp2();
-    WaitForThreads();
-    EXPECT_TRUE(CheckRtp1());
-    EXPECT_TRUE(CheckRtp2());
-    EXPECT_TRUE(CheckNoRtp1());
-    EXPECT_TRUE(CheckNoRtp2());
-  }
-
-  void TestDeinit() {
-    CreateChannels(0, 0);
-    EXPECT_TRUE(SendInitiate());
-    EXPECT_TRUE(SendAccept());
-    SendRtp1();
-    SendRtp2();
-    SendRtcp1();
-    SendRtcp2();
-    // Do not wait, destroy channels.
-    channel1_.reset(nullptr);
-    channel2_.reset(nullptr);
-  }
-
-  // Check that RTCP can be transmitted between both sides.
-  void SendRtcpToRtcp() {
-    CreateChannels(0, 0);
-    EXPECT_TRUE(SendInitiate());
-    EXPECT_TRUE(SendAccept());
-    EXPECT_TRUE(channel1_->NeedsRtcpTransport());
-    EXPECT_TRUE(channel2_->NeedsRtcpTransport());
-    SendRtcp1();
-    SendRtcp2();
-    WaitForThreads();
-    EXPECT_TRUE(CheckRtcp1());
-    EXPECT_TRUE(CheckRtcp2());
-    EXPECT_TRUE(CheckNoRtcp1());
-    EXPECT_TRUE(CheckNoRtcp2());
-  }
-
-  // Check that RTCP is transmitted if only the initiator supports mux.
-  void SendRtcpMuxToRtcp() {
-    CreateChannels(RTCP_MUX, 0);
-    EXPECT_TRUE(SendInitiate());
-    EXPECT_TRUE(SendAccept());
-    EXPECT_TRUE(channel1_->NeedsRtcpTransport());
-    EXPECT_TRUE(channel2_->NeedsRtcpTransport());
-    SendRtcp1();
-    SendRtcp2();
-    WaitForThreads();
-    EXPECT_TRUE(CheckRtcp1());
-    EXPECT_TRUE(CheckRtcp2());
-    EXPECT_TRUE(CheckNoRtcp1());
-    EXPECT_TRUE(CheckNoRtcp2());
-  }
-
-  // Check that RTP and RTCP are transmitted ok when both sides support mux.
-  void SendRtcpMuxToRtcpMux() {
-    CreateChannels(RTCP_MUX, RTCP_MUX);
-    EXPECT_TRUE(SendInitiate());
-    EXPECT_TRUE(channel1_->NeedsRtcpTransport());
-    EXPECT_FALSE(channel2_->NeedsRtcpTransport());
-    EXPECT_EQ(0, rtcp_mux_activated_callbacks1_);
-    EXPECT_TRUE(SendAccept());
-    EXPECT_FALSE(channel1_->NeedsRtcpTransport());
-    EXPECT_EQ(1, rtcp_mux_activated_callbacks1_);
-    SendRtp1();
-    SendRtp2();
-    SendRtcp1();
-    SendRtcp2();
-    WaitForThreads();
-    EXPECT_TRUE(CheckRtp1());
-    EXPECT_TRUE(CheckRtp2());
-    EXPECT_TRUE(CheckNoRtp1());
-    EXPECT_TRUE(CheckNoRtp2());
-    EXPECT_TRUE(CheckRtcp1());
-    EXPECT_TRUE(CheckRtcp2());
-    EXPECT_TRUE(CheckNoRtcp1());
-    EXPECT_TRUE(CheckNoRtcp2());
-  }
-
-  // Check that RTP and RTCP are transmitted ok when both sides
-  // support mux and one the offerer requires mux.
-  void SendRequireRtcpMuxToRtcpMux() {
-    CreateChannels(RTCP_MUX | RTCP_MUX_REQUIRED, RTCP_MUX);
-    EXPECT_TRUE(SendInitiate());
-    EXPECT_FALSE(channel1_->NeedsRtcpTransport());
-    EXPECT_FALSE(channel2_->NeedsRtcpTransport());
-    EXPECT_TRUE(SendAccept());
-    SendRtp1();
-    SendRtp2();
-    SendRtcp1();
-    SendRtcp2();
-    WaitForThreads();
-    EXPECT_TRUE(CheckRtp1());
-    EXPECT_TRUE(CheckRtp2());
-    EXPECT_TRUE(CheckNoRtp1());
-    EXPECT_TRUE(CheckNoRtp2());
-    EXPECT_TRUE(CheckRtcp1());
-    EXPECT_TRUE(CheckRtcp2());
-    EXPECT_TRUE(CheckNoRtcp1());
-    EXPECT_TRUE(CheckNoRtcp2());
-  }
-
-  // Check that RTP and RTCP are transmitted ok when both sides
-  // support mux and only the answerer requires rtcp mux.
-  void SendRtcpMuxToRequireRtcpMux() {
-    CreateChannels(RTCP_MUX, RTCP_MUX | RTCP_MUX_REQUIRED);
-    EXPECT_TRUE(SendInitiate());
-    EXPECT_TRUE(channel1_->NeedsRtcpTransport());
-    EXPECT_FALSE(channel2_->NeedsRtcpTransport());
-    EXPECT_EQ(0, rtcp_mux_activated_callbacks1_);
-    EXPECT_TRUE(SendAccept());
-    EXPECT_FALSE(channel1_->NeedsRtcpTransport());
-    EXPECT_EQ(1, rtcp_mux_activated_callbacks1_);
-    SendRtp1();
-    SendRtp2();
-    SendRtcp1();
-    SendRtcp2();
-    WaitForThreads();
-    EXPECT_TRUE(CheckRtp1());
-    EXPECT_TRUE(CheckRtp2());
-    EXPECT_TRUE(CheckNoRtp1());
-    EXPECT_TRUE(CheckNoRtp2());
-    EXPECT_TRUE(CheckRtcp1());
-    EXPECT_TRUE(CheckRtcp2());
-    EXPECT_TRUE(CheckNoRtcp1());
-    EXPECT_TRUE(CheckNoRtcp2());
-  }
-
-  // Check that RTP and RTCP are transmitted ok when both sides
-  // require mux.
-  void SendRequireRtcpMuxToRequireRtcpMux() {
-    CreateChannels(RTCP_MUX | RTCP_MUX_REQUIRED, RTCP_MUX | RTCP_MUX_REQUIRED);
-    EXPECT_TRUE(SendInitiate());
-    EXPECT_FALSE(channel1_->NeedsRtcpTransport());
-    EXPECT_FALSE(channel2_->NeedsRtcpTransport());
-    EXPECT_TRUE(SendAccept());
-    EXPECT_FALSE(channel1_->NeedsRtcpTransport());
-    SendRtp1();
-    SendRtp2();
-    SendRtcp1();
-    SendRtcp2();
-    WaitForThreads();
-    EXPECT_TRUE(CheckRtp1());
-    EXPECT_TRUE(CheckRtp2());
-    EXPECT_TRUE(CheckNoRtp1());
-    EXPECT_TRUE(CheckNoRtp2());
-    EXPECT_TRUE(CheckRtcp1());
-    EXPECT_TRUE(CheckRtcp2());
-    EXPECT_TRUE(CheckNoRtcp1());
-    EXPECT_TRUE(CheckNoRtcp2());
-  }
-
-  // Check that SendAccept fails if the answerer doesn't support mux
-  // and the offerer requires it.
-  void SendRequireRtcpMuxToNoRtcpMux() {
-    CreateChannels(RTCP_MUX | RTCP_MUX_REQUIRED, 0);
-    EXPECT_TRUE(SendInitiate());
-    EXPECT_FALSE(channel1_->NeedsRtcpTransport());
-    EXPECT_TRUE(channel2_->NeedsRtcpTransport());
-    EXPECT_FALSE(SendAccept());
-  }
-
-  // Check that RTCP data sent by the initiator before the accept is not muxed.
-  void SendEarlyRtcpMuxToRtcp() {
-    CreateChannels(RTCP_MUX, 0);
-    EXPECT_TRUE(SendInitiate());
-    EXPECT_TRUE(channel1_->NeedsRtcpTransport());
-    EXPECT_TRUE(channel2_->NeedsRtcpTransport());
-
-    // RTCP can be sent before the call is accepted, if the transport is ready.
-    // It should not be muxed though, as the remote side doesn't support mux.
-    SendRtcp1();
-    WaitForThreads();
-    EXPECT_TRUE(CheckNoRtp2());
-    EXPECT_TRUE(CheckRtcp2());
-
-    // Send RTCP packet from callee and verify that it is received.
-    SendRtcp2();
-    WaitForThreads();
-    EXPECT_TRUE(CheckNoRtp1());
-    EXPECT_TRUE(CheckRtcp1());
-
-    // Complete call setup and ensure everything is still OK.
-    EXPECT_TRUE(SendAccept());
-    EXPECT_TRUE(channel1_->NeedsRtcpTransport());
-    SendRtcp1();
-    SendRtcp2();
-    WaitForThreads();
-    EXPECT_TRUE(CheckRtcp2());
-    EXPECT_TRUE(CheckRtcp1());
-  }
-
-
-  // Check that RTCP data is not muxed until both sides have enabled muxing,
-  // but that we properly demux before we get the accept message, since there
-  // is a race between RTP data and the jingle accept.
-  void SendEarlyRtcpMuxToRtcpMux() {
-    CreateChannels(RTCP_MUX, RTCP_MUX);
-    EXPECT_TRUE(SendInitiate());
-    EXPECT_TRUE(channel1_->NeedsRtcpTransport());
-    EXPECT_FALSE(channel2_->NeedsRtcpTransport());
-
-    // RTCP can't be sent yet, since the RTCP transport isn't writable, and
-    // we haven't yet received the accept that says we should mux.
-    SendRtcp1();
-    WaitForThreads();
-    EXPECT_TRUE(CheckNoRtcp2());
-
-    // Send muxed RTCP packet from callee and verify that it is received.
-    SendRtcp2();
-    WaitForThreads();
-    EXPECT_TRUE(CheckNoRtp1());
-    EXPECT_TRUE(CheckRtcp1());
-
-    // Complete call setup and ensure everything is still OK.
-    EXPECT_EQ(0, rtcp_mux_activated_callbacks1_);
-    EXPECT_TRUE(SendAccept());
-    EXPECT_FALSE(channel1_->NeedsRtcpTransport());
-    EXPECT_EQ(1, rtcp_mux_activated_callbacks1_);
-    SendRtcp1();
-    SendRtcp2();
-    WaitForThreads();
-    EXPECT_TRUE(CheckRtcp2());
-    EXPECT_TRUE(CheckRtcp1());
-  }
-
-  // Test that we properly send SRTP with RTCP in both directions.
-  // You can pass in DTLS, RTCP_MUX, and RAW_PACKET_TRANSPORT as flags.
-  void SendSrtpToSrtp(int flags1_in = 0, int flags2_in = 0) {
-    RTC_CHECK((flags1_in & ~(RTCP_MUX | DTLS | RAW_PACKET_TRANSPORT)) == 0);
-    RTC_CHECK((flags2_in & ~(RTCP_MUX | DTLS | RAW_PACKET_TRANSPORT)) == 0);
-
-    int flags1 = SECURE | flags1_in;
-    int flags2 = SECURE | flags2_in;
-    bool dtls1 = !!(flags1_in & DTLS);
-    bool dtls2 = !!(flags2_in & DTLS);
-    CreateChannels(flags1, flags2);
-    EXPECT_FALSE(channel1_->srtp_active());
-    EXPECT_FALSE(channel2_->srtp_active());
-    EXPECT_TRUE(SendInitiate());
-    WaitForThreads();
-    EXPECT_TRUE(channel1_->writable());
-    EXPECT_TRUE(channel2_->writable());
-    EXPECT_TRUE(SendAccept());
-    EXPECT_TRUE(channel1_->srtp_active());
-    EXPECT_TRUE(channel2_->srtp_active());
-    EXPECT_EQ(dtls1 && dtls2, channel1_->dtls_active());
-    EXPECT_EQ(dtls1 && dtls2, channel2_->dtls_active());
-    SendRtp1();
-    SendRtp2();
-    SendRtcp1();
-    SendRtcp2();
-    WaitForThreads();
-    EXPECT_TRUE(CheckRtp1());
-    EXPECT_TRUE(CheckRtp2());
-    EXPECT_TRUE(CheckNoRtp1());
-    EXPECT_TRUE(CheckNoRtp2());
-    EXPECT_TRUE(CheckRtcp1());
-    EXPECT_TRUE(CheckRtcp2());
-    EXPECT_TRUE(CheckNoRtcp1());
-    EXPECT_TRUE(CheckNoRtcp2());
-  }
-
-  // Test that we properly handling SRTP negotiating down to RTP.
-  void SendSrtpToRtp() {
-    CreateChannels(SECURE, 0);
-    EXPECT_FALSE(channel1_->srtp_active());
-    EXPECT_FALSE(channel2_->srtp_active());
-    EXPECT_TRUE(SendInitiate());
-    EXPECT_TRUE(SendAccept());
-    EXPECT_FALSE(channel1_->srtp_active());
-    EXPECT_FALSE(channel2_->srtp_active());
-    SendRtp1();
-    SendRtp2();
-    SendRtcp1();
-    SendRtcp2();
-    WaitForThreads();
-    EXPECT_TRUE(CheckRtp1());
-    EXPECT_TRUE(CheckRtp2());
-    EXPECT_TRUE(CheckNoRtp1());
-    EXPECT_TRUE(CheckNoRtp2());
-    EXPECT_TRUE(CheckRtcp1());
-    EXPECT_TRUE(CheckRtcp2());
-    EXPECT_TRUE(CheckNoRtcp1());
-    EXPECT_TRUE(CheckNoRtcp2());
-  }
-
-  // Test that we can send and receive early media when a provisional answer is
-  // sent and received. The test uses SRTP, RTCP mux and SSRC mux.
-  void SendEarlyMediaUsingRtcpMuxSrtp() {
-      int sequence_number1_1 = 0, sequence_number2_2 = 0;
-
-      CreateChannels(SSRC_MUX | RTCP_MUX | SECURE,
-                     SSRC_MUX | RTCP_MUX | SECURE);
-      EXPECT_TRUE(SendOffer());
-      EXPECT_TRUE(SendProvisionalAnswer());
-      EXPECT_TRUE(channel1_->srtp_active());
-      EXPECT_TRUE(channel2_->srtp_active());
-      EXPECT_TRUE(channel1_->NeedsRtcpTransport());
-      EXPECT_TRUE(channel2_->NeedsRtcpTransport());
-      WaitForThreads();  // Wait for 'sending' flag go through network thread.
-      SendCustomRtcp1(kSsrc1);
-      SendCustomRtp1(kSsrc1, ++sequence_number1_1);
-      WaitForThreads();
-      EXPECT_TRUE(CheckCustomRtcp2(kSsrc1));
-      EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1));
-
-      // Send packets from callee and verify that it is received.
-      SendCustomRtcp2(kSsrc2);
-      SendCustomRtp2(kSsrc2, ++sequence_number2_2);
-      WaitForThreads();
-      EXPECT_TRUE(CheckCustomRtcp1(kSsrc2));
-      EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2));
-
-      // Complete call setup and ensure everything is still OK.
-      EXPECT_EQ(0, rtcp_mux_activated_callbacks1_);
-      EXPECT_EQ(0, rtcp_mux_activated_callbacks2_);
-      EXPECT_TRUE(SendFinalAnswer());
-      EXPECT_FALSE(channel1_->NeedsRtcpTransport());
-      EXPECT_FALSE(channel2_->NeedsRtcpTransport());
-      EXPECT_EQ(1, rtcp_mux_activated_callbacks1_);
-      EXPECT_EQ(1, rtcp_mux_activated_callbacks2_);
-      EXPECT_TRUE(channel1_->srtp_active());
-      EXPECT_TRUE(channel2_->srtp_active());
-      SendCustomRtcp1(kSsrc1);
-      SendCustomRtp1(kSsrc1, ++sequence_number1_1);
-      SendCustomRtcp2(kSsrc2);
-      SendCustomRtp2(kSsrc2, ++sequence_number2_2);
-      WaitForThreads();
-      EXPECT_TRUE(CheckCustomRtcp2(kSsrc1));
-      EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1));
-      EXPECT_TRUE(CheckCustomRtcp1(kSsrc2));
-      EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2));
-  }
-
-  // Test that we properly send RTP without SRTP from a thread.
-  void SendRtpToRtpOnThread() {
-    CreateChannels(0, 0);
-    EXPECT_TRUE(SendInitiate());
-    EXPECT_TRUE(SendAccept());
-    ScopedCallThread send_rtp1([this] { SendRtp1(); });
-    ScopedCallThread send_rtp2([this] { SendRtp2(); });
-    ScopedCallThread send_rtcp1([this] { SendRtcp1(); });
-    ScopedCallThread send_rtcp2([this] { SendRtcp2(); });
-    rtc::Thread* involved_threads[] = {send_rtp1.thread(), send_rtp2.thread(),
-                                       send_rtcp1.thread(),
-                                       send_rtcp2.thread()};
-    WaitForThreads(involved_threads);
-    EXPECT_TRUE(CheckRtp1());
-    EXPECT_TRUE(CheckRtp2());
-    EXPECT_TRUE(CheckNoRtp1());
-    EXPECT_TRUE(CheckNoRtp2());
-    EXPECT_TRUE(CheckRtcp1());
-    EXPECT_TRUE(CheckRtcp2());
-    EXPECT_TRUE(CheckNoRtcp1());
-    EXPECT_TRUE(CheckNoRtcp2());
-  }
-
-  // Test that we properly send SRTP with RTCP from a thread.
-  void SendSrtpToSrtpOnThread() {
-    CreateChannels(SECURE, SECURE);
-    EXPECT_TRUE(SendInitiate());
-    EXPECT_TRUE(SendAccept());
-    ScopedCallThread send_rtp1([this] { SendRtp1(); });
-    ScopedCallThread send_rtp2([this] { SendRtp2(); });
-    ScopedCallThread send_rtcp1([this] { SendRtcp1(); });
-    ScopedCallThread send_rtcp2([this] { SendRtcp2(); });
-    rtc::Thread* involved_threads[] = {send_rtp1.thread(), send_rtp2.thread(),
-                                       send_rtcp1.thread(),
-                                       send_rtcp2.thread()};
-    WaitForThreads(involved_threads);
-    EXPECT_TRUE(CheckRtp1());
-    EXPECT_TRUE(CheckRtp2());
-    EXPECT_TRUE(CheckNoRtp1());
-    EXPECT_TRUE(CheckNoRtp2());
-    EXPECT_TRUE(CheckRtcp1());
-    EXPECT_TRUE(CheckRtcp2());
-    EXPECT_TRUE(CheckNoRtcp1());
-    EXPECT_TRUE(CheckNoRtcp2());
-  }
-
-  // Test that the mediachannel retains its sending state after the transport
-  // becomes non-writable.
-  void SendWithWritabilityLoss() {
-    CreateChannels(RTCP_MUX | RTCP_MUX_REQUIRED, RTCP_MUX | RTCP_MUX_REQUIRED);
-    EXPECT_TRUE(SendInitiate());
-    EXPECT_TRUE(SendAccept());
-    EXPECT_FALSE(channel1_->NeedsRtcpTransport());
-    EXPECT_FALSE(channel2_->NeedsRtcpTransport());
-    SendRtp1();
-    SendRtp2();
-    WaitForThreads();
-    EXPECT_TRUE(CheckRtp1());
-    EXPECT_TRUE(CheckRtp2());
-    EXPECT_TRUE(CheckNoRtp1());
-    EXPECT_TRUE(CheckNoRtp2());
-
-    // Lose writability, which should fail.
-    network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
-      fake_rtp_dtls_transport1_->SetWritable(false);
-    });
-    SendRtp1();
-    SendRtp2();
-    WaitForThreads();
-    EXPECT_TRUE(CheckRtp1());
-    EXPECT_TRUE(CheckNoRtp2());
-
-    // Regain writability
-    network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
-      fake_rtp_dtls_transport1_->SetWritable(true);
-    });
-    EXPECT_TRUE(media_channel1_->sending());
-    SendRtp1();
-    SendRtp2();
-    WaitForThreads();
-    EXPECT_TRUE(CheckRtp1());
-    EXPECT_TRUE(CheckRtp2());
-    EXPECT_TRUE(CheckNoRtp1());
-    EXPECT_TRUE(CheckNoRtp2());
-
-    // Lose writability completely
-    network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
-      bool asymmetric = true;
-      fake_rtp_dtls_transport1_->SetDestination(nullptr, asymmetric);
-    });
-    EXPECT_TRUE(media_channel1_->sending());
-
-    // Should fail also.
-    SendRtp1();
-    SendRtp2();
-    WaitForThreads();
-    EXPECT_TRUE(CheckRtp1());
-    EXPECT_TRUE(CheckNoRtp2());
-    EXPECT_TRUE(CheckNoRtp1());
-
-    // Gain writability back
-    network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
-      bool asymmetric = true;
-      fake_rtp_dtls_transport1_->SetDestination(fake_rtp_dtls_transport2_.get(),
-                                                asymmetric);
-    });
-    EXPECT_TRUE(media_channel1_->sending());
-    SendRtp1();
-    SendRtp2();
-    WaitForThreads();
-    EXPECT_TRUE(CheckRtp1());
-    EXPECT_TRUE(CheckRtp2());
-    EXPECT_TRUE(CheckNoRtp1());
-    EXPECT_TRUE(CheckNoRtp2());
-  }
-
-  void SendBundleToBundle(
-      const int* pl_types, int len, bool rtcp_mux, bool secure) {
-    ASSERT_EQ(2, len);
-    int sequence_number1_1 = 0, sequence_number2_2 = 0;
-    // Only pl_type1 was added to the bundle filter for both |channel1_|
-    // and |channel2_|.
-    int pl_type1 = pl_types[0];
-    int pl_type2 = pl_types[1];
-    int flags = SSRC_MUX;
-    if (secure) flags |= SECURE;
-    if (rtcp_mux) {
-      flags |= RTCP_MUX;
-    }
-    CreateChannels(flags, flags);
-    EXPECT_TRUE(SendInitiate());
-    EXPECT_TRUE(channel1_->NeedsRtcpTransport());
-    EXPECT_EQ(rtcp_mux, !channel2_->NeedsRtcpTransport());
-    EXPECT_TRUE(SendAccept());
-    EXPECT_EQ(rtcp_mux, !channel1_->NeedsRtcpTransport());
-    EXPECT_EQ(rtcp_mux, !channel2_->NeedsRtcpTransport());
-    EXPECT_TRUE(channel1_->HandlesPayloadType(pl_type1));
-    EXPECT_TRUE(channel2_->HandlesPayloadType(pl_type1));
-    EXPECT_FALSE(channel1_->HandlesPayloadType(pl_type2));
-    EXPECT_FALSE(channel2_->HandlesPayloadType(pl_type2));
-
-    // Both channels can receive pl_type1 only.
-    SendCustomRtp1(kSsrc1, ++sequence_number1_1, pl_type1);
-    SendCustomRtp2(kSsrc2, ++sequence_number2_2, pl_type1);
-    WaitForThreads();
-    EXPECT_TRUE(CheckCustomRtp2(kSsrc1, sequence_number1_1, pl_type1));
-    EXPECT_TRUE(CheckCustomRtp1(kSsrc2, sequence_number2_2, pl_type1));
-    EXPECT_TRUE(CheckNoRtp1());
-    EXPECT_TRUE(CheckNoRtp2());
-
-    // RTCP test
-    SendCustomRtp1(kSsrc1, ++sequence_number1_1, pl_type2);
-    SendCustomRtp2(kSsrc2, ++sequence_number2_2, pl_type2);
-    WaitForThreads();
-    EXPECT_FALSE(CheckCustomRtp2(kSsrc1, sequence_number1_1, pl_type2));
-    EXPECT_FALSE(CheckCustomRtp1(kSsrc2, sequence_number2_2, pl_type2));
-
-    SendCustomRtcp1(kSsrc1);
-    SendCustomRtcp2(kSsrc2);
-    WaitForThreads();
-    EXPECT_TRUE(CheckCustomRtcp1(kSsrc2));
-    EXPECT_TRUE(CheckNoRtcp1());
-    EXPECT_TRUE(CheckCustomRtcp2(kSsrc1));
-    EXPECT_TRUE(CheckNoRtcp2());
-
-    SendCustomRtcp1(kSsrc2);
-    SendCustomRtcp2(kSsrc1);
-    WaitForThreads();
-    // Bundle filter shouldn't filter out any RTCP.
-    EXPECT_TRUE(CheckCustomRtcp1(kSsrc1));
-    EXPECT_TRUE(CheckCustomRtcp2(kSsrc2));
-  }
-
-  // Test that the media monitor can be run and gives callbacks.
-  void TestMediaMonitor() {
-    CreateChannels(0, 0);
-    EXPECT_TRUE(SendInitiate());
-    EXPECT_TRUE(SendAccept());
-    channel1_->StartMediaMonitor(100);
-    channel2_->StartMediaMonitor(100);
-    // Ensure we get callbacks and stop.
-    EXPECT_TRUE_WAIT(media_info_callbacks1_ > 0, kDefaultTimeout);
-    EXPECT_TRUE_WAIT(media_info_callbacks2_ > 0, kDefaultTimeout);
-    channel1_->StopMediaMonitor();
-    channel2_->StopMediaMonitor();
-    // Ensure a restart of a stopped monitor works.
-    channel1_->StartMediaMonitor(100);
-    EXPECT_TRUE_WAIT(media_info_callbacks1_ > 0, kDefaultTimeout);
-    channel1_->StopMediaMonitor();
-    // Ensure stopping a stopped monitor is OK.
-    channel1_->StopMediaMonitor();
-  }
-
-  void TestSetContentFailure() {
-    CreateChannels(0, 0);
-
-    std::string err;
-    std::unique_ptr<typename T::Content> content(
-        CreateMediaContentWithStream(1));
-
-    media_channel1_->set_fail_set_recv_codecs(true);
-    EXPECT_FALSE(
-        channel1_->SetLocalContent(content.get(), cricket::CA_OFFER, &err));
-    EXPECT_FALSE(
-        channel1_->SetLocalContent(content.get(), cricket::CA_ANSWER, &err));
-
-    media_channel1_->set_fail_set_send_codecs(true);
-    EXPECT_FALSE(
-        channel1_->SetRemoteContent(content.get(), cricket::CA_OFFER, &err));
-
-    media_channel1_->set_fail_set_send_codecs(true);
-    EXPECT_FALSE(
-        channel1_->SetRemoteContent(content.get(), cricket::CA_ANSWER, &err));
-  }
-
-  void TestSendTwoOffers() {
-    CreateChannels(0, 0);
-
-    std::string err;
-    std::unique_ptr<typename T::Content> content1(
-        CreateMediaContentWithStream(1));
-    EXPECT_TRUE(
-        channel1_->SetLocalContent(content1.get(), cricket::CA_OFFER, &err));
-    EXPECT_TRUE(media_channel1_->HasSendStream(1));
-
-    std::unique_ptr<typename T::Content> content2(
-        CreateMediaContentWithStream(2));
-    EXPECT_TRUE(
-        channel1_->SetLocalContent(content2.get(), cricket::CA_OFFER, &err));
-    EXPECT_FALSE(media_channel1_->HasSendStream(1));
-    EXPECT_TRUE(media_channel1_->HasSendStream(2));
-  }
-
-  void TestReceiveTwoOffers() {
-    CreateChannels(0, 0);
-
-    std::string err;
-    std::unique_ptr<typename T::Content> content1(
-        CreateMediaContentWithStream(1));
-    EXPECT_TRUE(
-        channel1_->SetRemoteContent(content1.get(), cricket::CA_OFFER, &err));
-    EXPECT_TRUE(media_channel1_->HasRecvStream(1));
-
-    std::unique_ptr<typename T::Content> content2(
-        CreateMediaContentWithStream(2));
-    EXPECT_TRUE(
-        channel1_->SetRemoteContent(content2.get(), cricket::CA_OFFER, &err));
-    EXPECT_FALSE(media_channel1_->HasRecvStream(1));
-    EXPECT_TRUE(media_channel1_->HasRecvStream(2));
-  }
-
-  void TestSendPrAnswer() {
-    CreateChannels(0, 0);
-
-    std::string err;
-    // Receive offer
-    std::unique_ptr<typename T::Content> content1(
-        CreateMediaContentWithStream(1));
-    EXPECT_TRUE(
-        channel1_->SetRemoteContent(content1.get(), cricket::CA_OFFER, &err));
-    EXPECT_TRUE(media_channel1_->HasRecvStream(1));
-
-    // Send PR answer
-    std::unique_ptr<typename T::Content> content2(
-        CreateMediaContentWithStream(2));
-    EXPECT_TRUE(
-        channel1_->SetLocalContent(content2.get(), cricket::CA_PRANSWER, &err));
-    EXPECT_TRUE(media_channel1_->HasRecvStream(1));
-    EXPECT_TRUE(media_channel1_->HasSendStream(2));
-
-    // Send answer
-    std::unique_ptr<typename T::Content> content3(
-        CreateMediaContentWithStream(3));
-    EXPECT_TRUE(
-        channel1_->SetLocalContent(content3.get(), cricket::CA_ANSWER, &err));
-    EXPECT_TRUE(media_channel1_->HasRecvStream(1));
-    EXPECT_FALSE(media_channel1_->HasSendStream(2));
-    EXPECT_TRUE(media_channel1_->HasSendStream(3));
-  }
-
-  void TestReceivePrAnswer() {
-    CreateChannels(0, 0);
-
-    std::string err;
-    // Send offer
-    std::unique_ptr<typename T::Content> content1(
-        CreateMediaContentWithStream(1));
-    EXPECT_TRUE(
-        channel1_->SetLocalContent(content1.get(), cricket::CA_OFFER, &err));
-    EXPECT_TRUE(media_channel1_->HasSendStream(1));
-
-    // Receive PR answer
-    std::unique_ptr<typename T::Content> content2(
-        CreateMediaContentWithStream(2));
-    EXPECT_TRUE(channel1_->SetRemoteContent(content2.get(),
-                                            cricket::CA_PRANSWER, &err));
-    EXPECT_TRUE(media_channel1_->HasSendStream(1));
-    EXPECT_TRUE(media_channel1_->HasRecvStream(2));
-
-    // Receive answer
-    std::unique_ptr<typename T::Content> content3(
-        CreateMediaContentWithStream(3));
-    EXPECT_TRUE(
-        channel1_->SetRemoteContent(content3.get(), cricket::CA_ANSWER, &err));
-    EXPECT_TRUE(media_channel1_->HasSendStream(1));
-    EXPECT_FALSE(media_channel1_->HasRecvStream(2));
-    EXPECT_TRUE(media_channel1_->HasRecvStream(3));
-  }
-
-  void TestFlushRtcp() {
-    CreateChannels(0, 0);
-    EXPECT_TRUE(SendInitiate());
-    EXPECT_TRUE(SendAccept());
-    EXPECT_TRUE(channel1_->NeedsRtcpTransport());
-    EXPECT_TRUE(channel2_->NeedsRtcpTransport());
-
-    // Send RTCP1 from a different thread.
-    ScopedCallThread send_rtcp([this] { SendRtcp1(); });
-    // The sending message is only posted.  channel2_ should be empty.
-    EXPECT_TRUE(CheckNoRtcp2());
-    rtc::Thread* wait_for[] = {send_rtcp.thread()};
-    WaitForThreads(wait_for);  // Ensure rtcp was posted
-
-    // When channel1_ is deleted, the RTCP packet should be sent out to
-    // channel2_.
-    channel1_.reset();
-    WaitForThreads();
-    EXPECT_TRUE(CheckRtcp2());
-  }
-
-  void TestOnTransportReadyToSend() {
-    CreateChannels(0, 0);
-    EXPECT_FALSE(media_channel1_->ready_to_send());
-
-    channel1_->OnTransportReadyToSend(true);
-    WaitForThreads();
-    EXPECT_TRUE(media_channel1_->ready_to_send());
-
-    channel1_->OnTransportReadyToSend(false);
-    WaitForThreads();
-    EXPECT_FALSE(media_channel1_->ready_to_send());
-  }
-
-  void TestOnTransportReadyToSendWithRtcpMux() {
-    CreateChannels(0, 0);
-    typename T::Content content;
-    CreateContent(0, kPcmuCodec, kH264Codec, &content);
-    // Both sides agree on mux. Should signal that RTCP mux is fully active.
-    content.set_rtcp_mux(true);
-    EXPECT_TRUE(channel1_->SetLocalContent(&content, CA_OFFER, NULL));
-    EXPECT_EQ(0, rtcp_mux_activated_callbacks1_);
-    EXPECT_TRUE(channel1_->SetRemoteContent(&content, CA_ANSWER, NULL));
-    EXPECT_EQ(1, rtcp_mux_activated_callbacks1_);
-    cricket::FakeDtlsTransport* rtp = fake_rtp_dtls_transport1_.get();
-    EXPECT_FALSE(media_channel1_->ready_to_send());
-    // In the case of rtcp mux, the SignalReadyToSend() from rtp channel
-    // should trigger the MediaChannel's OnReadyToSend.
-    network_thread_->Invoke<void>(RTC_FROM_HERE,
-                                  [rtp] { rtp->SignalReadyToSend(rtp); });
-    WaitForThreads();
-    EXPECT_TRUE(media_channel1_->ready_to_send());
-
-    // TODO(zstein): Find a way to test this without making
-    // OnTransportReadyToSend public.
-    network_thread_->Invoke<void>(
-        RTC_FROM_HERE, [this] { channel1_->OnTransportReadyToSend(false); });
-    WaitForThreads();
-    EXPECT_FALSE(media_channel1_->ready_to_send());
-  }
-
-  bool SetRemoteContentWithBitrateLimit(int remote_limit) {
-    typename T::Content content;
-    CreateContent(0, kPcmuCodec, kH264Codec, &content);
-    content.set_bandwidth(remote_limit);
-    return channel1_->SetRemoteContent(&content, CA_OFFER, NULL);
-  }
-
-  webrtc::RtpParameters BitrateLimitedParameters(rtc::Optional<int> limit) {
-    webrtc::RtpParameters parameters;
-    webrtc::RtpEncodingParameters encoding;
-    encoding.max_bitrate_bps = limit;
-    parameters.encodings.push_back(encoding);
-    return parameters;
-  }
-
-  void VerifyMaxBitrate(const webrtc::RtpParameters& parameters,
-                        rtc::Optional<int> expected_bitrate) {
-    EXPECT_EQ(1UL, parameters.encodings.size());
-    EXPECT_EQ(expected_bitrate, parameters.encodings[0].max_bitrate_bps);
-  }
-
-  void DefaultMaxBitrateIsUnlimited() {
-    CreateChannels(0, 0);
-    EXPECT_TRUE(
-        channel1_->SetLocalContent(&local_media_content1_, CA_OFFER, NULL));
-    EXPECT_EQ(media_channel1_->max_bps(), -1);
-    VerifyMaxBitrate(media_channel1_->GetRtpSendParameters(kSsrc1),
-                     rtc::Optional<int>());
-  }
-
-  void CanChangeMaxBitrate() {
-    CreateChannels(0, 0);
-    EXPECT_TRUE(
-        channel1_->SetLocalContent(&local_media_content1_, CA_OFFER, NULL));
-
-    EXPECT_TRUE(channel1_->SetRtpSendParameters(
-        kSsrc1, BitrateLimitedParameters(rtc::Optional<int>(1000))));
-    VerifyMaxBitrate(channel1_->GetRtpSendParameters(kSsrc1),
-                     rtc::Optional<int>(1000));
-    VerifyMaxBitrate(media_channel1_->GetRtpSendParameters(kSsrc1),
-                     rtc::Optional<int>(1000));
-    EXPECT_EQ(-1, media_channel1_->max_bps());
-
-    EXPECT_TRUE(channel1_->SetRtpSendParameters(
-        kSsrc1, BitrateLimitedParameters(rtc::Optional<int>())));
-    VerifyMaxBitrate(channel1_->GetRtpSendParameters(kSsrc1),
-                     rtc::Optional<int>());
-    VerifyMaxBitrate(media_channel1_->GetRtpSendParameters(kSsrc1),
-                     rtc::Optional<int>());
-    EXPECT_EQ(-1, media_channel1_->max_bps());
-  }
-
- protected:
-  void WaitForThreads() { WaitForThreads(rtc::ArrayView<rtc::Thread*>()); }
-  static void ProcessThreadQueue(rtc::Thread* thread) {
-    RTC_DCHECK(thread->IsCurrent());
-    while (!thread->empty()) {
-      thread->ProcessMessages(0);
-    }
-  }
-  void WaitForThreads(rtc::ArrayView<rtc::Thread*> threads) {
-    // |threads| and current thread post packets to network thread.
-    for (rtc::Thread* thread : threads) {
-      thread->Invoke<void>(RTC_FROM_HERE,
-                           [thread] { ProcessThreadQueue(thread); });
-    }
-    ProcessThreadQueue(rtc::Thread::Current());
-    // Network thread move them around and post back to worker = current thread.
-    if (!network_thread_->IsCurrent()) {
-      network_thread_->Invoke<void>(
-          RTC_FROM_HERE, [this] { ProcessThreadQueue(network_thread_); });
-    }
-    // Worker thread = current Thread process received messages.
-    ProcessThreadQueue(rtc::Thread::Current());
-  }
-  // TODO(pbos): Remove playout from all media channels and let renderers mute
-  // themselves.
-  const bool verify_playout_;
-  std::unique_ptr<rtc::Thread> network_thread_keeper_;
-  rtc::Thread* network_thread_;
-  std::unique_ptr<cricket::FakeDtlsTransport> fake_rtp_dtls_transport1_;
-  std::unique_ptr<cricket::FakeDtlsTransport> fake_rtcp_dtls_transport1_;
-  std::unique_ptr<cricket::FakeDtlsTransport> fake_rtp_dtls_transport2_;
-  std::unique_ptr<cricket::FakeDtlsTransport> fake_rtcp_dtls_transport2_;
-  std::unique_ptr<rtc::FakePacketTransport> fake_rtp_packet_transport1_;
-  std::unique_ptr<rtc::FakePacketTransport> fake_rtcp_packet_transport1_;
-  std::unique_ptr<rtc::FakePacketTransport> fake_rtp_packet_transport2_;
-  std::unique_ptr<rtc::FakePacketTransport> fake_rtcp_packet_transport2_;
-  cricket::FakeMediaEngine media_engine_;
-  // The media channels are owned by the voice channel objects below.
-  typename T::MediaChannel* media_channel1_ = nullptr;
-  typename T::MediaChannel* media_channel2_ = nullptr;
-  std::unique_ptr<typename T::Channel> channel1_;
-  std::unique_ptr<typename T::Channel> channel2_;
-  typename T::Content local_media_content1_;
-  typename T::Content local_media_content2_;
-  typename T::Content remote_media_content1_;
-  typename T::Content remote_media_content2_;
-  // The RTP and RTCP packets to send in the tests.
-  rtc::Buffer rtp_packet_;
-  rtc::Buffer rtcp_packet_;
-  int media_info_callbacks1_ = 0;
-  int media_info_callbacks2_ = 0;
-  int rtcp_mux_activated_callbacks1_ = 0;
-  int rtcp_mux_activated_callbacks2_ = 0;
-  cricket::CandidatePairInterface* last_selected_candidate_pair_;
-};
-
-template<>
-void ChannelTest<VoiceTraits>::CreateContent(
-    int flags,
-    const cricket::AudioCodec& audio_codec,
-    const cricket::VideoCodec& video_codec,
-    cricket::AudioContentDescription* audio) {
-  audio->AddCodec(audio_codec);
-  audio->set_rtcp_mux((flags & RTCP_MUX) != 0);
-  if (flags & SECURE) {
-    audio->AddCrypto(cricket::CryptoParams(
-        1, rtc::CS_AES_CM_128_HMAC_SHA1_32,
-        "inline:" + rtc::CreateRandomString(40), std::string()));
-  }
-}
-
-template<>
-void ChannelTest<VoiceTraits>::CopyContent(
-    const cricket::AudioContentDescription& source,
-    cricket::AudioContentDescription* audio) {
-  *audio = source;
-}
-
-template<>
-bool ChannelTest<VoiceTraits>::CodecMatches(const cricket::AudioCodec& c1,
-                                            const cricket::AudioCodec& c2) {
-  return c1.name == c2.name && c1.clockrate == c2.clockrate &&
-      c1.bitrate == c2.bitrate && c1.channels == c2.channels;
-}
-
-template <>
-void ChannelTest<VoiceTraits>::AddLegacyStreamInContent(
-    uint32_t ssrc,
-    int flags,
-    cricket::AudioContentDescription* audio) {
-  audio->AddLegacyStream(ssrc);
-}
-
-class VoiceChannelSingleThreadTest : public ChannelTest<VoiceTraits> {
- public:
-  typedef ChannelTest<VoiceTraits> Base;
-  VoiceChannelSingleThreadTest()
-      : Base(true, kPcmuFrame, kRtcpReport, NetworkIsWorker::Yes) {}
-};
-
-class VoiceChannelDoubleThreadTest : public ChannelTest<VoiceTraits> {
- public:
-  typedef ChannelTest<VoiceTraits> Base;
-  VoiceChannelDoubleThreadTest()
-      : Base(true, kPcmuFrame, kRtcpReport, NetworkIsWorker::No) {}
-};
-
-class VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest
-  : public ChannelTest<VoiceTraits> {
- public:
-  typedef ChannelTest<VoiceTraits> Base;
-  VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest()
-      : Base(true, kPcmuFrameWithExtensions, kRtcpReport,
-            NetworkIsWorker::Yes) {}
-};
-
-class VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest
-  : public ChannelTest<VoiceTraits> {
- public:
-  typedef ChannelTest<VoiceTraits> Base;
-  VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest()
-      : Base(true, kPcmuFrameWithExtensions, kRtcpReport,
-            NetworkIsWorker::No) {}
-};
-
-// override to add NULL parameter
-template <>
-cricket::VideoChannel* ChannelTest<VideoTraits>::CreateChannel(
-    rtc::Thread* worker_thread,
-    rtc::Thread* network_thread,
-    cricket::MediaEngineInterface* engine,
-    cricket::FakeVideoMediaChannel* ch,
-    cricket::DtlsTransportInternal* fake_rtp_dtls_transport,
-    cricket::DtlsTransportInternal* fake_rtcp_dtls_transport,
-    rtc::PacketTransportInternal* fake_rtp_packet_transport,
-    rtc::PacketTransportInternal* fake_rtcp_packet_transport,
-    int flags) {
-  rtc::Thread* signaling_thread = rtc::Thread::Current();
-  cricket::VideoChannel* channel = new cricket::VideoChannel(
-      worker_thread, network_thread, signaling_thread, ch, cricket::CN_VIDEO,
-      (flags & RTCP_MUX_REQUIRED) != 0, (flags & SECURE) != 0);
-  if (!channel->NeedsRtcpTransport()) {
-    fake_rtcp_dtls_transport = nullptr;
-  }
-  if (!channel->Init_w(fake_rtp_dtls_transport, fake_rtcp_dtls_transport,
-                       fake_rtp_packet_transport, fake_rtcp_packet_transport)) {
-    delete channel;
-    channel = NULL;
-  }
-  return channel;
-}
-
-// override to add 0 parameter
-template<>
-bool ChannelTest<VideoTraits>::AddStream1(int id) {
-  return channel1_->AddRecvStream(cricket::StreamParams::CreateLegacy(id));
-}
-
-template<>
-void ChannelTest<VideoTraits>::CreateContent(
-    int flags,
-    const cricket::AudioCodec& audio_codec,
-    const cricket::VideoCodec& video_codec,
-    cricket::VideoContentDescription* video) {
-  video->AddCodec(video_codec);
-  video->set_rtcp_mux((flags & RTCP_MUX) != 0);
-  if (flags & SECURE) {
-    video->AddCrypto(cricket::CryptoParams(
-        1, rtc::CS_AES_CM_128_HMAC_SHA1_80,
-        "inline:" + rtc::CreateRandomString(40), std::string()));
-  }
-}
-
-template<>
-void ChannelTest<VideoTraits>::CopyContent(
-    const cricket::VideoContentDescription& source,
-    cricket::VideoContentDescription* video) {
-  *video = source;
-}
-
-template<>
-bool ChannelTest<VideoTraits>::CodecMatches(const cricket::VideoCodec& c1,
-                                            const cricket::VideoCodec& c2) {
-  return c1.name == c2.name;
-}
-
-template <>
-void ChannelTest<VideoTraits>::AddLegacyStreamInContent(
-    uint32_t ssrc,
-    int flags,
-    cricket::VideoContentDescription* video) {
-  video->AddLegacyStream(ssrc);
-}
-
-class VideoChannelSingleThreadTest : public ChannelTest<VideoTraits> {
- public:
-  typedef ChannelTest<VideoTraits> Base;
-  VideoChannelSingleThreadTest()
-      : Base(false, kH264Packet, kRtcpReport, NetworkIsWorker::Yes) {}
-};
-
-class VideoChannelDoubleThreadTest : public ChannelTest<VideoTraits> {
- public:
-  typedef ChannelTest<VideoTraits> Base;
-  VideoChannelDoubleThreadTest()
-      : Base(false, kH264Packet, kRtcpReport, NetworkIsWorker::No) {}
-};
-
-// VoiceChannelSingleThreadTest
-// Flaky on iOS Simualtor: bugs.webrtc.org/7247
-#if defined(WEBRTC_IOS)
-#define MAYBE_TestInit DISABLED_TestInit
-#else
-#define MAYBE_TestInit TestInit
-#endif
-TEST_F(VoiceChannelSingleThreadTest, MAYBE_TestInit) {
-  Base::TestInit();
-  EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
-  EXPECT_TRUE(media_channel1_->dtmf_info_queue().empty());
-}
-
-TEST_F(VoiceChannelSingleThreadTest, TestDeinit) {
-  Base::TestDeinit();
-}
-
-TEST_F(VoiceChannelSingleThreadTest, TestSetContents) {
-  Base::TestSetContents();
-}
-
-TEST_F(VoiceChannelSingleThreadTest, TestSetContentsNullOffer) {
-  Base::TestSetContentsNullOffer();
-}
-
-TEST_F(VoiceChannelSingleThreadTest, TestSetContentsRtcpMux) {
-  Base::TestSetContentsRtcpMux();
-}
-
-TEST_F(VoiceChannelSingleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
-  Base::TestSetContentsRtcpMux();
-}
-
-TEST_F(VoiceChannelSingleThreadTest, TestSetRemoteContentUpdate) {
-  Base::TestSetRemoteContentUpdate();
-}
-
-TEST_F(VoiceChannelSingleThreadTest, TestStreams) {
-  Base::TestStreams();
-}
-
-TEST_F(VoiceChannelSingleThreadTest, TestUpdateStreamsInLocalContent) {
-  Base::TestUpdateStreamsInLocalContent();
-}
-
-TEST_F(VoiceChannelSingleThreadTest, TestUpdateRemoteStreamsInContent) {
-  Base::TestUpdateStreamsInRemoteContent();
-}
-
-TEST_F(VoiceChannelSingleThreadTest, TestChangeStreamParamsInContent) {
-  Base::TestChangeStreamParamsInContent();
-}
-
-TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest,
-    TestChangeEncryptedHeaderExtensionsDtls) {
-  int flags = DTLS;
-  Base::TestChangeEncryptedHeaderExtensions(flags);
-}
-
-TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest,
-    TestChangeEncryptedHeaderExtensionsDtlsScenario1) {
-  int flags = DTLS;
-  Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_BEFORE_OFFER_ANSWER);
-}
-
-TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest,
-    TestChangeEncryptedHeaderExtensionsDtlsScenario2) {
-  int flags = DTLS;
-  Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_AFTER_CHANNEL2_READY);
-}
-
-TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest,
-    TestChangeEncryptedHeaderExtensionsDtlsGcm) {
-  int flags = DTLS | GCM_CIPHER;
-  Base::TestChangeEncryptedHeaderExtensions(flags);
-}
-
-TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest,
-    TestChangeEncryptedHeaderExtensionsDtlsGcmScenario1) {
-  int flags = DTLS | GCM_CIPHER;
-  Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_BEFORE_OFFER_ANSWER);
-}
-
-TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest,
-    TestChangeEncryptedHeaderExtensionsDtlsGcmScenario2) {
-  int flags = DTLS | GCM_CIPHER;
-  Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_AFTER_CHANNEL2_READY);
-}
-
-TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsSingleThreadTest,
-    TestChangeEncryptedHeaderExtensionsSDES) {
-  int flags = 0;
-  Base::TestChangeEncryptedHeaderExtensions(flags);
-}
-
-TEST_F(VoiceChannelSingleThreadTest, TestPlayoutAndSendingStates) {
-  Base::TestPlayoutAndSendingStates();
-}
-
-TEST_F(VoiceChannelSingleThreadTest, TestMuteStream) {
-  CreateChannels(0, 0);
-  // Test that we can Mute the default channel even though the sending SSRC
-  // is unknown.
-  EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
-  EXPECT_TRUE(channel1_->SetAudioSend(0, false, nullptr, nullptr));
-  EXPECT_TRUE(media_channel1_->IsStreamMuted(0));
-  EXPECT_TRUE(channel1_->SetAudioSend(0, true, nullptr, nullptr));
-  EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
-
-  // Test that we can not mute an unknown SSRC.
-  EXPECT_FALSE(channel1_->SetAudioSend(kSsrc1, false, nullptr, nullptr));
-
-  SendInitiate();
-  // After the local session description has been set, we can mute a stream
-  // with its SSRC.
-  EXPECT_TRUE(channel1_->SetAudioSend(kSsrc1, false, nullptr, nullptr));
-  EXPECT_TRUE(media_channel1_->IsStreamMuted(kSsrc1));
-  EXPECT_TRUE(channel1_->SetAudioSend(kSsrc1, true, nullptr, nullptr));
-  EXPECT_FALSE(media_channel1_->IsStreamMuted(kSsrc1));
-}
-
-TEST_F(VoiceChannelSingleThreadTest, TestMediaContentDirection) {
-  Base::TestMediaContentDirection();
-}
-
-TEST_F(VoiceChannelSingleThreadTest, TestNetworkRouteChanges) {
-  Base::TestNetworkRouteChanges();
-}
-
-TEST_F(VoiceChannelSingleThreadTest, TestCallSetup) {
-  Base::TestCallSetup();
-}
-
-TEST_F(VoiceChannelSingleThreadTest, TestCallTeardownRtcpMux) {
-  Base::TestCallTeardownRtcpMux();
-}
-
-TEST_F(VoiceChannelSingleThreadTest, SendRtpToRtp) {
-  Base::SendRtpToRtp();
-}
-
-TEST_F(VoiceChannelSingleThreadTest, SendRtcpToRtcp) {
-  Base::SendRtcpToRtcp();
-}
-
-TEST_F(VoiceChannelSingleThreadTest, SendRtcpMuxToRtcp) {
-  Base::SendRtcpMuxToRtcp();
-}
-
-TEST_F(VoiceChannelSingleThreadTest, SendRtcpMuxToRtcpMux) {
-  Base::SendRtcpMuxToRtcpMux();
-}
-
-TEST_F(VoiceChannelSingleThreadTest, SendRequireRtcpMuxToRtcpMux) {
-  Base::SendRequireRtcpMuxToRtcpMux();
-}
-
-TEST_F(VoiceChannelSingleThreadTest, SendRtcpMuxToRequireRtcpMux) {
-  Base::SendRtcpMuxToRequireRtcpMux();
-}
-
-TEST_F(VoiceChannelSingleThreadTest, SendRequireRtcpMuxToRequireRtcpMux) {
-  Base::SendRequireRtcpMuxToRequireRtcpMux();
-}
-
-TEST_F(VoiceChannelSingleThreadTest, SendRequireRtcpMuxToNoRtcpMux) {
-  Base::SendRequireRtcpMuxToNoRtcpMux();
-}
-
-TEST_F(VoiceChannelSingleThreadTest, SendEarlyRtcpMuxToRtcp) {
-  Base::SendEarlyRtcpMuxToRtcp();
-}
-
-TEST_F(VoiceChannelSingleThreadTest, SendEarlyRtcpMuxToRtcpMux) {
-  Base::SendEarlyRtcpMuxToRtcpMux();
-}
-
-TEST_F(VoiceChannelSingleThreadTest, SendSrtpToSrtpRtcpMux) {
-  Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
-}
-
-TEST_F(VoiceChannelSingleThreadTest, SendSrtpToRtp) {
-  Base::SendSrtpToSrtp();
-}
-
-TEST_F(VoiceChannelSingleThreadTest, SendSrtcpMux) {
-  Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
-}
-
-TEST_F(VoiceChannelSingleThreadTest, SendDtlsSrtpToSrtp) {
-  Base::SendSrtpToSrtp(DTLS, 0);
-}
-
-TEST_F(VoiceChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtp) {
-  Base::SendSrtpToSrtp(DTLS, DTLS);
-}
-
-TEST_F(VoiceChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
-  Base::SendSrtpToSrtp(DTLS | RTCP_MUX, DTLS | RTCP_MUX);
-}
-
-// Test using the channel with a raw packet interface, as opposed to a DTLS
-// transport interface.
-TEST_F(VoiceChannelSingleThreadTest, SendSrtpToSrtpWithRawPacketTransport) {
-  Base::SendSrtpToSrtp(RAW_PACKET_TRANSPORT, RAW_PACKET_TRANSPORT);
-}
-
-TEST_F(VoiceChannelSingleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
-  Base::SendEarlyMediaUsingRtcpMuxSrtp();
-}
-
-TEST_F(VoiceChannelSingleThreadTest, SendRtpToRtpOnThread) {
-  Base::SendRtpToRtpOnThread();
-}
-
-TEST_F(VoiceChannelSingleThreadTest, SendSrtpToSrtpOnThread) {
-  Base::SendSrtpToSrtpOnThread();
-}
-
-TEST_F(VoiceChannelSingleThreadTest, SendWithWritabilityLoss) {
-  Base::SendWithWritabilityLoss();
-}
-
-TEST_F(VoiceChannelSingleThreadTest, TestMediaMonitor) {
-  Base::TestMediaMonitor();
-}
-
-// Test that InsertDtmf properly forwards to the media channel.
-TEST_F(VoiceChannelSingleThreadTest, TestInsertDtmf) {
-  CreateChannels(0, 0);
-  EXPECT_TRUE(SendInitiate());
-  EXPECT_TRUE(SendAccept());
-  EXPECT_EQ(0U, media_channel1_->dtmf_info_queue().size());
-
-  EXPECT_TRUE(channel1_->InsertDtmf(1, 3, 100));
-  EXPECT_TRUE(channel1_->InsertDtmf(2, 5, 110));
-  EXPECT_TRUE(channel1_->InsertDtmf(3, 7, 120));
-
-  ASSERT_EQ(3U, media_channel1_->dtmf_info_queue().size());
-  EXPECT_TRUE(CompareDtmfInfo(media_channel1_->dtmf_info_queue()[0],
-                              1, 3, 100));
-  EXPECT_TRUE(CompareDtmfInfo(media_channel1_->dtmf_info_queue()[1],
-                              2, 5, 110));
-  EXPECT_TRUE(CompareDtmfInfo(media_channel1_->dtmf_info_queue()[2],
-                              3, 7, 120));
-}
-
-TEST_F(VoiceChannelSingleThreadTest, TestSetContentFailure) {
-  Base::TestSetContentFailure();
-}
-
-TEST_F(VoiceChannelSingleThreadTest, TestSendTwoOffers) {
-  Base::TestSendTwoOffers();
-}
-
-TEST_F(VoiceChannelSingleThreadTest, TestReceiveTwoOffers) {
-  Base::TestReceiveTwoOffers();
-}
-
-TEST_F(VoiceChannelSingleThreadTest, TestSendPrAnswer) {
-  Base::TestSendPrAnswer();
-}
-
-TEST_F(VoiceChannelSingleThreadTest, TestReceivePrAnswer) {
-  Base::TestReceivePrAnswer();
-}
-
-TEST_F(VoiceChannelSingleThreadTest, TestFlushRtcp) {
-  Base::TestFlushRtcp();
-}
-
-TEST_F(VoiceChannelSingleThreadTest, TestOnTransportReadyToSend) {
-  Base::TestOnTransportReadyToSend();
-}
-
-TEST_F(VoiceChannelSingleThreadTest, TestOnTransportReadyToSendWithRtcpMux) {
-  Base::TestOnTransportReadyToSendWithRtcpMux();
-}
-
-// Test that we can scale the output volume properly for 1:1 calls.
-TEST_F(VoiceChannelSingleThreadTest, TestScaleVolume1to1Call) {
-  CreateChannels(0, 0);
-  EXPECT_TRUE(SendInitiate());
-  EXPECT_TRUE(SendAccept());
-  double volume;
-
-  // Default is (1.0).
-  EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
-  EXPECT_DOUBLE_EQ(1.0, volume);
-  // invalid ssrc.
-  EXPECT_FALSE(media_channel1_->GetOutputVolume(3, &volume));
-
-  // Set scale to (1.5).
-  EXPECT_TRUE(channel1_->SetOutputVolume(0, 1.5));
-  EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
-  EXPECT_DOUBLE_EQ(1.5, volume);
-
-  // Set scale to (0).
-  EXPECT_TRUE(channel1_->SetOutputVolume(0, 0.0));
-  EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
-  EXPECT_DOUBLE_EQ(0.0, volume);
-}
-
-// Test that we can scale the output volume properly for multiway calls.
-TEST_F(VoiceChannelSingleThreadTest, TestScaleVolumeMultiwayCall) {
-  CreateChannels(0, 0);
-  EXPECT_TRUE(SendInitiate());
-  EXPECT_TRUE(SendAccept());
-  EXPECT_TRUE(AddStream1(1));
-  EXPECT_TRUE(AddStream1(2));
-
-  double volume;
-  // Default is (1.0).
-  EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
-  EXPECT_DOUBLE_EQ(1.0, volume);
-  EXPECT_TRUE(media_channel1_->GetOutputVolume(1, &volume));
-  EXPECT_DOUBLE_EQ(1.0, volume);
-  EXPECT_TRUE(media_channel1_->GetOutputVolume(2, &volume));
-  EXPECT_DOUBLE_EQ(1.0, volume);
-  // invalid ssrc.
-  EXPECT_FALSE(media_channel1_->GetOutputVolume(3, &volume));
-
-  // Set scale to (1.5) for ssrc = 1.
-  EXPECT_TRUE(channel1_->SetOutputVolume(1, 1.5));
-  EXPECT_TRUE(media_channel1_->GetOutputVolume(1, &volume));
-  EXPECT_DOUBLE_EQ(1.5, volume);
-  EXPECT_TRUE(media_channel1_->GetOutputVolume(2, &volume));
-  EXPECT_DOUBLE_EQ(1.0, volume);
-  EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
-  EXPECT_DOUBLE_EQ(1.0, volume);
-
-  // Set scale to (0) for all ssrcs.
-  EXPECT_TRUE(channel1_->SetOutputVolume(0,  0.0));
-  EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
-  EXPECT_DOUBLE_EQ(0.0, volume);
-  EXPECT_TRUE(media_channel1_->GetOutputVolume(1, &volume));
-  EXPECT_DOUBLE_EQ(0.0, volume);
-  EXPECT_TRUE(media_channel1_->GetOutputVolume(2, &volume));
-  EXPECT_DOUBLE_EQ(0.0, volume);
-}
-
-TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundle) {
-  Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, false);
-}
-
-TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleSecure) {
-  Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, true);
-}
-
-TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleWithRtcpMux) {
-  Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, false);
-}
-
-TEST_F(VoiceChannelSingleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
-  Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, true);
-}
-
-TEST_F(VoiceChannelSingleThreadTest, DefaultMaxBitrateIsUnlimited) {
-  Base::DefaultMaxBitrateIsUnlimited();
-}
-
-TEST_F(VoiceChannelSingleThreadTest, CanChangeMaxBitrate) {
-  Base::CanChangeMaxBitrate();
-}
-
-// VoiceChannelDoubleThreadTest
-TEST_F(VoiceChannelDoubleThreadTest, TestInit) {
-  Base::TestInit();
-  EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
-  EXPECT_TRUE(media_channel1_->dtmf_info_queue().empty());
-}
-
-TEST_F(VoiceChannelDoubleThreadTest, TestDeinit) {
-  Base::TestDeinit();
-}
-
-TEST_F(VoiceChannelDoubleThreadTest, TestSetContents) {
-  Base::TestSetContents();
-}
-
-TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsNullOffer) {
-  Base::TestSetContentsNullOffer();
-}
-
-TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsRtcpMux) {
-  Base::TestSetContentsRtcpMux();
-}
-
-TEST_F(VoiceChannelDoubleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
-  Base::TestSetContentsRtcpMux();
-}
-
-TEST_F(VoiceChannelDoubleThreadTest, TestSetRemoteContentUpdate) {
-  Base::TestSetRemoteContentUpdate();
-}
-
-TEST_F(VoiceChannelDoubleThreadTest, TestStreams) {
-  Base::TestStreams();
-}
-
-TEST_F(VoiceChannelDoubleThreadTest, TestUpdateStreamsInLocalContent) {
-  Base::TestUpdateStreamsInLocalContent();
-}
-
-TEST_F(VoiceChannelDoubleThreadTest, TestUpdateRemoteStreamsInContent) {
-  Base::TestUpdateStreamsInRemoteContent();
-}
-
-TEST_F(VoiceChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
-  Base::TestChangeStreamParamsInContent();
-}
-
-TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest,
-    TestChangeEncryptedHeaderExtensionsDtls) {
-  int flags = DTLS;
-  Base::TestChangeEncryptedHeaderExtensions(flags);
-}
-
-TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest,
-    TestChangeEncryptedHeaderExtensionsDtlsScenario1) {
-  int flags = DTLS;
-  Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_BEFORE_OFFER_ANSWER);
-}
-
-TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest,
-    TestChangeEncryptedHeaderExtensionsDtlsScenario2) {
-  int flags = DTLS;
-  Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_AFTER_CHANNEL2_READY);
-}
-
-TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest,
-    TestChangeEncryptedHeaderExtensionsDtlsGcm) {
-  int flags = DTLS | GCM_CIPHER;
-  Base::TestChangeEncryptedHeaderExtensions(flags);
-}
-
-TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest,
-    TestChangeEncryptedHeaderExtensionsDtlsGcmScenario1) {
-  int flags = DTLS | GCM_CIPHER;
-  Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_BEFORE_OFFER_ANSWER);
-}
-
-TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest,
-    TestChangeEncryptedHeaderExtensionsDtlsGcmScenario2) {
-  int flags = DTLS | GCM_CIPHER;
-  Base::TestChangeEncryptedHeaderExtensions(flags, DTLS_AFTER_CHANNEL2_READY);
-}
-
-TEST_F(VoiceChannelWithEncryptedRtpHeaderExtensionsDoubleThreadTest,
-    TestChangeEncryptedHeaderExtensionsSDES) {
-  int flags = 0;
-  Base::TestChangeEncryptedHeaderExtensions(flags);
-}
-
-TEST_F(VoiceChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
-  Base::TestPlayoutAndSendingStates();
-}
-
-TEST_F(VoiceChannelDoubleThreadTest, TestMuteStream) {
-  CreateChannels(0, 0);
-  // Test that we can Mute the default channel even though the sending SSRC
-  // is unknown.
-  EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
-  EXPECT_TRUE(channel1_->SetAudioSend(0, false, nullptr, nullptr));
-  EXPECT_TRUE(media_channel1_->IsStreamMuted(0));
-  EXPECT_TRUE(channel1_->SetAudioSend(0, true, nullptr, nullptr));
-  EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
-
-  // Test that we can not mute an unknown SSRC.
-  EXPECT_FALSE(channel1_->SetAudioSend(kSsrc1, false, nullptr, nullptr));
-
-  SendInitiate();
-  // After the local session description has been set, we can mute a stream
-  // with its SSRC.
-  EXPECT_TRUE(channel1_->SetAudioSend(kSsrc1, false, nullptr, nullptr));
-  EXPECT_TRUE(media_channel1_->IsStreamMuted(kSsrc1));
-  EXPECT_TRUE(channel1_->SetAudioSend(kSsrc1, true, nullptr, nullptr));
-  EXPECT_FALSE(media_channel1_->IsStreamMuted(kSsrc1));
-}
-
-TEST_F(VoiceChannelDoubleThreadTest, TestMediaContentDirection) {
-  Base::TestMediaContentDirection();
-}
-
-TEST_F(VoiceChannelDoubleThreadTest, TestNetworkRouteChanges) {
-  Base::TestNetworkRouteChanges();
-}
-
-TEST_F(VoiceChannelDoubleThreadTest, TestCallSetup) {
-  Base::TestCallSetup();
-}
-
-TEST_F(VoiceChannelDoubleThreadTest, TestCallTeardownRtcpMux) {
-  Base::TestCallTeardownRtcpMux();
-}
-
-TEST_F(VoiceChannelDoubleThreadTest, SendRtpToRtp) {
-  Base::SendRtpToRtp();
-}
-
-TEST_F(VoiceChannelDoubleThreadTest, SendRtcpToRtcp) {
-  Base::SendRtcpToRtcp();
-}
-
-TEST_F(VoiceChannelDoubleThreadTest, SendRtcpMuxToRtcp) {
-  Base::SendRtcpMuxToRtcp();
-}
-
-TEST_F(VoiceChannelDoubleThreadTest, SendRtcpMuxToRtcpMux) {
-  Base::SendRtcpMuxToRtcpMux();
-}
-
-TEST_F(VoiceChannelDoubleThreadTest, SendRequireRtcpMuxToRtcpMux) {
-  Base::SendRequireRtcpMuxToRtcpMux();
-}
-
-TEST_F(VoiceChannelDoubleThreadTest, SendRtcpMuxToRequireRtcpMux) {
-  Base::SendRtcpMuxToRequireRtcpMux();
-}
-
-TEST_F(VoiceChannelDoubleThreadTest, SendRequireRtcpMuxToRequireRtcpMux) {
-  Base::SendRequireRtcpMuxToRequireRtcpMux();
-}
-
-TEST_F(VoiceChannelDoubleThreadTest, SendRequireRtcpMuxToNoRtcpMux) {
-  Base::SendRequireRtcpMuxToNoRtcpMux();
-}
-
-TEST_F(VoiceChannelDoubleThreadTest, SendEarlyRtcpMuxToRtcp) {
-  Base::SendEarlyRtcpMuxToRtcp();
-}
-
-TEST_F(VoiceChannelDoubleThreadTest, SendEarlyRtcpMuxToRtcpMux) {
-  Base::SendEarlyRtcpMuxToRtcpMux();
-}
-
-TEST_F(VoiceChannelDoubleThreadTest, SendSrtpToSrtpRtcpMux) {
-  Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
-}
-
-TEST_F(VoiceChannelDoubleThreadTest, SendSrtpToRtp) {
-  Base::SendSrtpToSrtp();
-}
-
-TEST_F(VoiceChannelDoubleThreadTest, SendSrtcpMux) {
-  Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
-}
-
-TEST_F(VoiceChannelDoubleThreadTest, SendDtlsSrtpToSrtp) {
-  Base::SendSrtpToSrtp(DTLS, 0);
-}
-
-TEST_F(VoiceChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtp) {
-  Base::SendSrtpToSrtp(DTLS, DTLS);
-}
-
-TEST_F(VoiceChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
-  Base::SendSrtpToSrtp(DTLS | RTCP_MUX, DTLS | RTCP_MUX);
-}
-
-// Test using the channel with a raw packet interface, as opposed to a DTLS
-// transport interface.
-TEST_F(VoiceChannelDoubleThreadTest, SendSrtpToSrtpWithRawPacketTransport) {
-  Base::SendSrtpToSrtp(RAW_PACKET_TRANSPORT, RAW_PACKET_TRANSPORT);
-}
-
-TEST_F(VoiceChannelDoubleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
-  Base::SendEarlyMediaUsingRtcpMuxSrtp();
-}
-
-TEST_F(VoiceChannelDoubleThreadTest, SendRtpToRtpOnThread) {
-  Base::SendRtpToRtpOnThread();
-}
-
-TEST_F(VoiceChannelDoubleThreadTest, SendSrtpToSrtpOnThread) {
-  Base::SendSrtpToSrtpOnThread();
-}
-
-TEST_F(VoiceChannelDoubleThreadTest, SendWithWritabilityLoss) {
-  Base::SendWithWritabilityLoss();
-}
-
-TEST_F(VoiceChannelDoubleThreadTest, TestMediaMonitor) {
-  Base::TestMediaMonitor();
-}
-
-// Test that InsertDtmf properly forwards to the media channel.
-TEST_F(VoiceChannelDoubleThreadTest, TestInsertDtmf) {
-  CreateChannels(0, 0);
-  EXPECT_TRUE(SendInitiate());
-  EXPECT_TRUE(SendAccept());
-  EXPECT_EQ(0U, media_channel1_->dtmf_info_queue().size());
-
-  EXPECT_TRUE(channel1_->InsertDtmf(1, 3, 100));
-  EXPECT_TRUE(channel1_->InsertDtmf(2, 5, 110));
-  EXPECT_TRUE(channel1_->InsertDtmf(3, 7, 120));
-
-  ASSERT_EQ(3U, media_channel1_->dtmf_info_queue().size());
-  EXPECT_TRUE(
-      CompareDtmfInfo(media_channel1_->dtmf_info_queue()[0], 1, 3, 100));
-  EXPECT_TRUE(
-      CompareDtmfInfo(media_channel1_->dtmf_info_queue()[1], 2, 5, 110));
-  EXPECT_TRUE(
-      CompareDtmfInfo(media_channel1_->dtmf_info_queue()[2], 3, 7, 120));
-}
-
-TEST_F(VoiceChannelDoubleThreadTest, TestSetContentFailure) {
-  Base::TestSetContentFailure();
-}
-
-TEST_F(VoiceChannelDoubleThreadTest, TestSendTwoOffers) {
-  Base::TestSendTwoOffers();
-}
-
-TEST_F(VoiceChannelDoubleThreadTest, TestReceiveTwoOffers) {
-  Base::TestReceiveTwoOffers();
-}
-
-TEST_F(VoiceChannelDoubleThreadTest, TestSendPrAnswer) {
-  Base::TestSendPrAnswer();
-}
-
-TEST_F(VoiceChannelDoubleThreadTest, TestReceivePrAnswer) {
-  Base::TestReceivePrAnswer();
-}
-
-TEST_F(VoiceChannelDoubleThreadTest, TestFlushRtcp) {
-  Base::TestFlushRtcp();
-}
-
-TEST_F(VoiceChannelDoubleThreadTest, TestOnTransportReadyToSend) {
-  Base::TestOnTransportReadyToSend();
-}
-
-TEST_F(VoiceChannelDoubleThreadTest, TestOnTransportReadyToSendWithRtcpMux) {
-  Base::TestOnTransportReadyToSendWithRtcpMux();
-}
-
-// Test that we can scale the output volume properly for 1:1 calls.
-TEST_F(VoiceChannelDoubleThreadTest, TestScaleVolume1to1Call) {
-  CreateChannels(0, 0);
-  EXPECT_TRUE(SendInitiate());
-  EXPECT_TRUE(SendAccept());
-  double volume;
-
-  // Default is (1.0).
-  EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
-  EXPECT_DOUBLE_EQ(1.0, volume);
-  // invalid ssrc.
-  EXPECT_FALSE(media_channel1_->GetOutputVolume(3, &volume));
-
-  // Set scale to (1.5).
-  EXPECT_TRUE(channel1_->SetOutputVolume(0, 1.5));
-  EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
-  EXPECT_DOUBLE_EQ(1.5, volume);
-
-  // Set scale to (0).
-  EXPECT_TRUE(channel1_->SetOutputVolume(0, 0.0));
-  EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
-  EXPECT_DOUBLE_EQ(0.0, volume);
-}
-
-// Test that we can scale the output volume properly for multiway calls.
-TEST_F(VoiceChannelDoubleThreadTest, TestScaleVolumeMultiwayCall) {
-  CreateChannels(0, 0);
-  EXPECT_TRUE(SendInitiate());
-  EXPECT_TRUE(SendAccept());
-  EXPECT_TRUE(AddStream1(1));
-  EXPECT_TRUE(AddStream1(2));
-
-  double volume;
-  // Default is (1.0).
-  EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
-  EXPECT_DOUBLE_EQ(1.0, volume);
-  EXPECT_TRUE(media_channel1_->GetOutputVolume(1, &volume));
-  EXPECT_DOUBLE_EQ(1.0, volume);
-  EXPECT_TRUE(media_channel1_->GetOutputVolume(2, &volume));
-  EXPECT_DOUBLE_EQ(1.0, volume);
-  // invalid ssrc.
-  EXPECT_FALSE(media_channel1_->GetOutputVolume(3, &volume));
-
-  // Set scale to (1.5) for ssrc = 1.
-  EXPECT_TRUE(channel1_->SetOutputVolume(1, 1.5));
-  EXPECT_TRUE(media_channel1_->GetOutputVolume(1, &volume));
-  EXPECT_DOUBLE_EQ(1.5, volume);
-  EXPECT_TRUE(media_channel1_->GetOutputVolume(2, &volume));
-  EXPECT_DOUBLE_EQ(1.0, volume);
-  EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
-  EXPECT_DOUBLE_EQ(1.0, volume);
-
-  // Set scale to (0) for all ssrcs.
-  EXPECT_TRUE(channel1_->SetOutputVolume(0, 0.0));
-  EXPECT_TRUE(media_channel1_->GetOutputVolume(0, &volume));
-  EXPECT_DOUBLE_EQ(0.0, volume);
-  EXPECT_TRUE(media_channel1_->GetOutputVolume(1, &volume));
-  EXPECT_DOUBLE_EQ(0.0, volume);
-  EXPECT_TRUE(media_channel1_->GetOutputVolume(2, &volume));
-  EXPECT_DOUBLE_EQ(0.0, volume);
-}
-
-TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundle) {
-  Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, false);
-}
-
-TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleSecure) {
-  Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), false, true);
-}
-
-TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleWithRtcpMux) {
-  Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, false);
-}
-
-TEST_F(VoiceChannelDoubleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
-  Base::SendBundleToBundle(kAudioPts, arraysize(kAudioPts), true, true);
-}
-
-TEST_F(VoiceChannelDoubleThreadTest, DefaultMaxBitrateIsUnlimited) {
-  Base::DefaultMaxBitrateIsUnlimited();
-}
-
-TEST_F(VoiceChannelDoubleThreadTest, CanChangeMaxBitrate) {
-  Base::CanChangeMaxBitrate();
-}
-
-// VideoChannelSingleThreadTest
-TEST_F(VideoChannelSingleThreadTest, TestInit) {
-  Base::TestInit();
-}
-
-TEST_F(VideoChannelSingleThreadTest, TestDeinit) {
-  Base::TestDeinit();
-}
-
-TEST_F(VideoChannelSingleThreadTest, TestSetContents) {
-  Base::TestSetContents();
-}
-
-TEST_F(VideoChannelSingleThreadTest, TestSetContentsNullOffer) {
-  Base::TestSetContentsNullOffer();
-}
-
-TEST_F(VideoChannelSingleThreadTest, TestSetContentsRtcpMux) {
-  Base::TestSetContentsRtcpMux();
-}
-
-TEST_F(VideoChannelSingleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
-  Base::TestSetContentsRtcpMux();
-}
-
-TEST_F(VideoChannelSingleThreadTest, TestSetRemoteContentUpdate) {
-  Base::TestSetRemoteContentUpdate();
-}
-
-TEST_F(VideoChannelSingleThreadTest, TestStreams) {
-  Base::TestStreams();
-}
-
-TEST_F(VideoChannelSingleThreadTest, TestUpdateStreamsInLocalContent) {
-  Base::TestUpdateStreamsInLocalContent();
-}
-
-TEST_F(VideoChannelSingleThreadTest, TestUpdateRemoteStreamsInContent) {
-  Base::TestUpdateStreamsInRemoteContent();
-}
-
-TEST_F(VideoChannelSingleThreadTest, TestChangeStreamParamsInContent) {
-  Base::TestChangeStreamParamsInContent();
-}
-
-TEST_F(VideoChannelSingleThreadTest, TestPlayoutAndSendingStates) {
-  Base::TestPlayoutAndSendingStates();
-}
-
-TEST_F(VideoChannelSingleThreadTest, TestMuteStream) {
-  CreateChannels(0, 0);
-  // Test that we can Mute the default channel even though the sending SSRC
-  // is unknown.
-  EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
-  EXPECT_TRUE(channel1_->SetVideoSend(0, false, nullptr, nullptr));
-  EXPECT_TRUE(media_channel1_->IsStreamMuted(0));
-  EXPECT_TRUE(channel1_->SetVideoSend(0, true, nullptr, nullptr));
-  EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
-  // Test that we can not mute an unknown SSRC.
-  EXPECT_FALSE(channel1_->SetVideoSend(kSsrc1, false, nullptr, nullptr));
-  SendInitiate();
-  // After the local session description has been set, we can mute a stream
-  // with its SSRC.
-  EXPECT_TRUE(channel1_->SetVideoSend(kSsrc1, false, nullptr, nullptr));
-  EXPECT_TRUE(media_channel1_->IsStreamMuted(kSsrc1));
-  EXPECT_TRUE(channel1_->SetVideoSend(kSsrc1, true, nullptr, nullptr));
-  EXPECT_FALSE(media_channel1_->IsStreamMuted(kSsrc1));
-}
-
-TEST_F(VideoChannelSingleThreadTest, TestMediaContentDirection) {
-  Base::TestMediaContentDirection();
-}
-
-TEST_F(VideoChannelSingleThreadTest, TestNetworkRouteChanges) {
-  Base::TestNetworkRouteChanges();
-}
-
-TEST_F(VideoChannelSingleThreadTest, TestCallSetup) {
-  Base::TestCallSetup();
-}
-
-TEST_F(VideoChannelSingleThreadTest, TestCallTeardownRtcpMux) {
-  Base::TestCallTeardownRtcpMux();
-}
-
-TEST_F(VideoChannelSingleThreadTest, SendRtpToRtp) {
-  Base::SendRtpToRtp();
-}
-
-TEST_F(VideoChannelSingleThreadTest, SendRtcpToRtcp) {
-  Base::SendRtcpToRtcp();
-}
-
-TEST_F(VideoChannelSingleThreadTest, SendRtcpMuxToRtcp) {
-  Base::SendRtcpMuxToRtcp();
-}
-
-TEST_F(VideoChannelSingleThreadTest, SendRtcpMuxToRtcpMux) {
-  Base::SendRtcpMuxToRtcpMux();
-}
-
-TEST_F(VideoChannelSingleThreadTest, SendRequireRtcpMuxToRtcpMux) {
-  Base::SendRequireRtcpMuxToRtcpMux();
-}
-
-TEST_F(VideoChannelSingleThreadTest, SendRtcpMuxToRequireRtcpMux) {
-  Base::SendRtcpMuxToRequireRtcpMux();
-}
-
-TEST_F(VideoChannelSingleThreadTest, SendRequireRtcpMuxToRequireRtcpMux) {
-  Base::SendRequireRtcpMuxToRequireRtcpMux();
-}
-
-TEST_F(VideoChannelSingleThreadTest, SendRequireRtcpMuxToNoRtcpMux) {
-  Base::SendRequireRtcpMuxToNoRtcpMux();
-}
-
-TEST_F(VideoChannelSingleThreadTest, SendEarlyRtcpMuxToRtcp) {
-  Base::SendEarlyRtcpMuxToRtcp();
-}
-
-TEST_F(VideoChannelSingleThreadTest, SendEarlyRtcpMuxToRtcpMux) {
-  Base::SendEarlyRtcpMuxToRtcpMux();
-}
-
-TEST_F(VideoChannelSingleThreadTest, SendSrtpToSrtp) {
-  Base::SendSrtpToSrtp();
-}
-
-TEST_F(VideoChannelSingleThreadTest, SendSrtpToRtp) {
-  Base::SendSrtpToSrtp();
-}
-
-TEST_F(VideoChannelSingleThreadTest, SendDtlsSrtpToSrtp) {
-  Base::SendSrtpToSrtp(DTLS, 0);
-}
-
-TEST_F(VideoChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtp) {
-  Base::SendSrtpToSrtp(DTLS, DTLS);
-}
-
-TEST_F(VideoChannelSingleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
-  Base::SendSrtpToSrtp(DTLS | RTCP_MUX, DTLS | RTCP_MUX);
-}
-
-// Test using the channel with a raw packet interface, as opposed to a DTLS
-// transport interface.
-TEST_F(VideoChannelSingleThreadTest, SendSrtpToSrtpWithRawPacketTransport) {
-  Base::SendSrtpToSrtp(RAW_PACKET_TRANSPORT, RAW_PACKET_TRANSPORT);
-}
-
-TEST_F(VideoChannelSingleThreadTest, SendSrtcpMux) {
-  Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
-}
-
-TEST_F(VideoChannelSingleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
-  Base::SendEarlyMediaUsingRtcpMuxSrtp();
-}
-
-TEST_F(VideoChannelSingleThreadTest, SendRtpToRtpOnThread) {
-  Base::SendRtpToRtpOnThread();
-}
-
-TEST_F(VideoChannelSingleThreadTest, SendSrtpToSrtpOnThread) {
-  Base::SendSrtpToSrtpOnThread();
-}
-
-TEST_F(VideoChannelSingleThreadTest, SendWithWritabilityLoss) {
-  Base::SendWithWritabilityLoss();
-}
-
-TEST_F(VideoChannelSingleThreadTest, TestMediaMonitor) {
-  Base::TestMediaMonitor();
-}
-
-TEST_F(VideoChannelSingleThreadTest, TestSetContentFailure) {
-  Base::TestSetContentFailure();
-}
-
-TEST_F(VideoChannelSingleThreadTest, TestSendTwoOffers) {
-  Base::TestSendTwoOffers();
-}
-
-TEST_F(VideoChannelSingleThreadTest, TestReceiveTwoOffers) {
-  Base::TestReceiveTwoOffers();
-}
-
-TEST_F(VideoChannelSingleThreadTest, TestSendPrAnswer) {
-  Base::TestSendPrAnswer();
-}
-
-TEST_F(VideoChannelSingleThreadTest, TestReceivePrAnswer) {
-  Base::TestReceivePrAnswer();
-}
-
-TEST_F(VideoChannelSingleThreadTest, TestFlushRtcp) {
-  Base::TestFlushRtcp();
-}
-
-TEST_F(VideoChannelSingleThreadTest, SendBundleToBundle) {
-  Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, false);
-}
-
-TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleSecure) {
-  Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, true);
-}
-
-TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleWithRtcpMux) {
-  Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, false);
-}
-
-TEST_F(VideoChannelSingleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
-  Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, true);
-}
-
-TEST_F(VideoChannelSingleThreadTest, TestOnTransportReadyToSend) {
-  Base::TestOnTransportReadyToSend();
-}
-
-TEST_F(VideoChannelSingleThreadTest, TestOnTransportReadyToSendWithRtcpMux) {
-  Base::TestOnTransportReadyToSendWithRtcpMux();
-}
-
-TEST_F(VideoChannelSingleThreadTest, DefaultMaxBitrateIsUnlimited) {
-  Base::DefaultMaxBitrateIsUnlimited();
-}
-
-TEST_F(VideoChannelSingleThreadTest, CanChangeMaxBitrate) {
-  Base::CanChangeMaxBitrate();
-}
-
-// VideoChannelDoubleThreadTest
-TEST_F(VideoChannelDoubleThreadTest, TestInit) {
-  Base::TestInit();
-}
-
-TEST_F(VideoChannelDoubleThreadTest, TestDeinit) {
-  Base::TestDeinit();
-}
-
-TEST_F(VideoChannelDoubleThreadTest, TestSetContents) {
-  Base::TestSetContents();
-}
-
-TEST_F(VideoChannelDoubleThreadTest, TestSetContentsNullOffer) {
-  Base::TestSetContentsNullOffer();
-}
-
-TEST_F(VideoChannelDoubleThreadTest, TestSetContentsRtcpMux) {
-  Base::TestSetContentsRtcpMux();
-}
-
-TEST_F(VideoChannelDoubleThreadTest, TestSetContentsRtcpMuxWithPrAnswer) {
-  Base::TestSetContentsRtcpMux();
-}
-
-TEST_F(VideoChannelDoubleThreadTest, TestSetRemoteContentUpdate) {
-  Base::TestSetRemoteContentUpdate();
-}
-
-TEST_F(VideoChannelDoubleThreadTest, TestStreams) {
-  Base::TestStreams();
-}
-
-TEST_F(VideoChannelDoubleThreadTest, TestUpdateStreamsInLocalContent) {
-  Base::TestUpdateStreamsInLocalContent();
-}
-
-TEST_F(VideoChannelDoubleThreadTest, TestUpdateRemoteStreamsInContent) {
-  Base::TestUpdateStreamsInRemoteContent();
-}
-
-TEST_F(VideoChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
-  Base::TestChangeStreamParamsInContent();
-}
-
-TEST_F(VideoChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
-  Base::TestPlayoutAndSendingStates();
-}
-
-TEST_F(VideoChannelDoubleThreadTest, TestMuteStream) {
-  CreateChannels(0, 0);
-  // Test that we can Mute the default channel even though the sending SSRC
-  // is unknown.
-  EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
-  EXPECT_TRUE(channel1_->SetVideoSend(0, false, nullptr, nullptr));
-  EXPECT_TRUE(media_channel1_->IsStreamMuted(0));
-  EXPECT_TRUE(channel1_->SetVideoSend(0, true, nullptr, nullptr));
-  EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
-  // Test that we can not mute an unknown SSRC.
-  EXPECT_FALSE(channel1_->SetVideoSend(kSsrc1, false, nullptr, nullptr));
-  SendInitiate();
-  // After the local session description has been set, we can mute a stream
-  // with its SSRC.
-  EXPECT_TRUE(channel1_->SetVideoSend(kSsrc1, false, nullptr, nullptr));
-  EXPECT_TRUE(media_channel1_->IsStreamMuted(kSsrc1));
-  EXPECT_TRUE(channel1_->SetVideoSend(kSsrc1, true, nullptr, nullptr));
-  EXPECT_FALSE(media_channel1_->IsStreamMuted(kSsrc1));
-}
-
-TEST_F(VideoChannelDoubleThreadTest, TestMediaContentDirection) {
-  Base::TestMediaContentDirection();
-}
-
-TEST_F(VideoChannelDoubleThreadTest, TestNetworkRouteChanges) {
-  Base::TestNetworkRouteChanges();
-}
-
-TEST_F(VideoChannelDoubleThreadTest, TestCallSetup) {
-  Base::TestCallSetup();
-}
-
-TEST_F(VideoChannelDoubleThreadTest, TestCallTeardownRtcpMux) {
-  Base::TestCallTeardownRtcpMux();
-}
-
-TEST_F(VideoChannelDoubleThreadTest, SendRtpToRtp) {
-  Base::SendRtpToRtp();
-}
-
-TEST_F(VideoChannelDoubleThreadTest, SendRtcpToRtcp) {
-  Base::SendRtcpToRtcp();
-}
-
-TEST_F(VideoChannelDoubleThreadTest, SendRtcpMuxToRtcp) {
-  Base::SendRtcpMuxToRtcp();
-}
-
-TEST_F(VideoChannelDoubleThreadTest, SendRtcpMuxToRtcpMux) {
-  Base::SendRtcpMuxToRtcpMux();
-}
-
-TEST_F(VideoChannelDoubleThreadTest, SendRequireRtcpMuxToRtcpMux) {
-  Base::SendRequireRtcpMuxToRtcpMux();
-}
-
-TEST_F(VideoChannelDoubleThreadTest, SendRtcpMuxToRequireRtcpMux) {
-  Base::SendRtcpMuxToRequireRtcpMux();
-}
-
-TEST_F(VideoChannelDoubleThreadTest, SendRequireRtcpMuxToRequireRtcpMux) {
-  Base::SendRequireRtcpMuxToRequireRtcpMux();
-}
-
-TEST_F(VideoChannelDoubleThreadTest, SendRequireRtcpMuxToNoRtcpMux) {
-  Base::SendRequireRtcpMuxToNoRtcpMux();
-}
-
-TEST_F(VideoChannelDoubleThreadTest, SendEarlyRtcpMuxToRtcp) {
-  Base::SendEarlyRtcpMuxToRtcp();
-}
-
-TEST_F(VideoChannelDoubleThreadTest, SendEarlyRtcpMuxToRtcpMux) {
-  Base::SendEarlyRtcpMuxToRtcpMux();
-}
-
-TEST_F(VideoChannelDoubleThreadTest, SendSrtpToSrtp) {
-  Base::SendSrtpToSrtp();
-}
-
-TEST_F(VideoChannelDoubleThreadTest, SendSrtpToRtp) {
-  Base::SendSrtpToSrtp();
-}
-
-TEST_F(VideoChannelDoubleThreadTest, SendDtlsSrtpToSrtp) {
-  Base::SendSrtpToSrtp(DTLS, 0);
-}
-
-TEST_F(VideoChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtp) {
-  Base::SendSrtpToSrtp(DTLS, DTLS);
-}
-
-TEST_F(VideoChannelDoubleThreadTest, SendDtlsSrtpToDtlsSrtpRtcpMux) {
-  Base::SendSrtpToSrtp(DTLS | RTCP_MUX, DTLS | RTCP_MUX);
-}
-
-// Test using the channel with a raw packet interface, as opposed to a DTLS
-// transport interface.
-TEST_F(VideoChannelDoubleThreadTest, SendSrtpToSrtpWithRawPacketTransport) {
-  Base::SendSrtpToSrtp(RAW_PACKET_TRANSPORT, RAW_PACKET_TRANSPORT);
-}
-
-TEST_F(VideoChannelDoubleThreadTest, SendSrtcpMux) {
-  Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
-}
-
-TEST_F(VideoChannelDoubleThreadTest, SendEarlyMediaUsingRtcpMuxSrtp) {
-  Base::SendEarlyMediaUsingRtcpMuxSrtp();
-}
-
-TEST_F(VideoChannelDoubleThreadTest, SendRtpToRtpOnThread) {
-  Base::SendRtpToRtpOnThread();
-}
-
-TEST_F(VideoChannelDoubleThreadTest, SendSrtpToSrtpOnThread) {
-  Base::SendSrtpToSrtpOnThread();
-}
-
-TEST_F(VideoChannelDoubleThreadTest, SendWithWritabilityLoss) {
-  Base::SendWithWritabilityLoss();
-}
-
-TEST_F(VideoChannelDoubleThreadTest, TestMediaMonitor) {
-  Base::TestMediaMonitor();
-}
-
-TEST_F(VideoChannelDoubleThreadTest, TestSetContentFailure) {
-  Base::TestSetContentFailure();
-}
-
-TEST_F(VideoChannelDoubleThreadTest, TestSendTwoOffers) {
-  Base::TestSendTwoOffers();
-}
-
-TEST_F(VideoChannelDoubleThreadTest, TestReceiveTwoOffers) {
-  Base::TestReceiveTwoOffers();
-}
-
-TEST_F(VideoChannelDoubleThreadTest, TestSendPrAnswer) {
-  Base::TestSendPrAnswer();
-}
-
-TEST_F(VideoChannelDoubleThreadTest, TestReceivePrAnswer) {
-  Base::TestReceivePrAnswer();
-}
-
-TEST_F(VideoChannelDoubleThreadTest, TestFlushRtcp) {
-  Base::TestFlushRtcp();
-}
-
-TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundle) {
-  Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, false);
-}
-
-TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleSecure) {
-  Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), false, true);
-}
-
-TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleWithRtcpMux) {
-  Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, false);
-}
-
-TEST_F(VideoChannelDoubleThreadTest, SendBundleToBundleWithRtcpMuxSecure) {
-  Base::SendBundleToBundle(kVideoPts, arraysize(kVideoPts), true, true);
-}
-
-TEST_F(VideoChannelDoubleThreadTest, TestOnTransportReadyToSend) {
-  Base::TestOnTransportReadyToSend();
-}
-
-TEST_F(VideoChannelDoubleThreadTest, TestOnTransportReadyToSendWithRtcpMux) {
-  Base::TestOnTransportReadyToSendWithRtcpMux();
-}
-
-TEST_F(VideoChannelDoubleThreadTest, DefaultMaxBitrateIsUnlimited) {
-  Base::DefaultMaxBitrateIsUnlimited();
-}
-
-TEST_F(VideoChannelDoubleThreadTest, CanChangeMaxBitrate) {
-  Base::CanChangeMaxBitrate();
-}
-
-// RtpDataChannelSingleThreadTest
-class RtpDataChannelSingleThreadTest : public ChannelTest<DataTraits> {
- public:
-  typedef ChannelTest<DataTraits> Base;
-  RtpDataChannelSingleThreadTest()
-      : Base(true, kDataPacket, kRtcpReport, NetworkIsWorker::Yes) {}
-};
-
-// RtpDataChannelDoubleThreadTest
-class RtpDataChannelDoubleThreadTest : public ChannelTest<DataTraits> {
- public:
-  typedef ChannelTest<DataTraits> Base;
-  RtpDataChannelDoubleThreadTest()
-      : Base(true, kDataPacket, kRtcpReport, NetworkIsWorker::No) {}
-};
-
-// Override to avoid engine channel parameter.
-template <>
-cricket::RtpDataChannel* ChannelTest<DataTraits>::CreateChannel(
-    rtc::Thread* worker_thread,
-    rtc::Thread* network_thread,
-    cricket::MediaEngineInterface* engine,
-    cricket::FakeDataMediaChannel* ch,
-    cricket::DtlsTransportInternal* fake_rtp_dtls_transport,
-    cricket::DtlsTransportInternal* fake_rtcp_dtls_transport,
-    rtc::PacketTransportInternal* fake_rtp_packet_transport,
-    rtc::PacketTransportInternal* fake_rtcp_packet_transport,
-    int flags) {
-  rtc::Thread* signaling_thread = rtc::Thread::Current();
-  cricket::RtpDataChannel* channel = new cricket::RtpDataChannel(
-      worker_thread, network_thread, signaling_thread, ch, cricket::CN_DATA,
-      (flags & RTCP_MUX_REQUIRED) != 0, (flags & SECURE) != 0);
-  if (!channel->NeedsRtcpTransport()) {
-    fake_rtcp_dtls_transport = nullptr;
-  }
-  if (!channel->Init_w(fake_rtp_dtls_transport, fake_rtcp_dtls_transport,
-                       fake_rtp_packet_transport, fake_rtcp_packet_transport)) {
-    delete channel;
-    channel = NULL;
-  }
-  return channel;
-}
-
-template <>
-void ChannelTest<DataTraits>::CreateContent(
-    int flags,
-    const cricket::AudioCodec& audio_codec,
-    const cricket::VideoCodec& video_codec,
-    cricket::DataContentDescription* data) {
-  data->AddCodec(kGoogleDataCodec);
-  data->set_rtcp_mux((flags & RTCP_MUX) != 0);
-  if (flags & SECURE) {
-    data->AddCrypto(cricket::CryptoParams(
-        1, rtc::CS_AES_CM_128_HMAC_SHA1_32,
-        "inline:" + rtc::CreateRandomString(40), std::string()));
-  }
-}
-
-template <>
-void ChannelTest<DataTraits>::CopyContent(
-    const cricket::DataContentDescription& source,
-    cricket::DataContentDescription* data) {
-  *data = source;
-}
-
-template <>
-bool ChannelTest<DataTraits>::CodecMatches(const cricket::DataCodec& c1,
-                                           const cricket::DataCodec& c2) {
-  return c1.name == c2.name;
-}
-
-template <>
-void ChannelTest<DataTraits>::AddLegacyStreamInContent(
-    uint32_t ssrc,
-    int flags,
-    cricket::DataContentDescription* data) {
-  data->AddLegacyStream(ssrc);
-}
-
-TEST_F(RtpDataChannelSingleThreadTest, TestInit) {
-  Base::TestInit();
-  EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
-}
-
-TEST_F(RtpDataChannelSingleThreadTest, TestDeinit) {
-  Base::TestDeinit();
-}
-
-TEST_F(RtpDataChannelSingleThreadTest, TestSetContents) {
-  Base::TestSetContents();
-}
-
-TEST_F(RtpDataChannelSingleThreadTest, TestSetContentsNullOffer) {
-  Base::TestSetContentsNullOffer();
-}
-
-TEST_F(RtpDataChannelSingleThreadTest, TestSetContentsRtcpMux) {
-  Base::TestSetContentsRtcpMux();
-}
-
-TEST_F(RtpDataChannelSingleThreadTest, TestSetRemoteContentUpdate) {
-  Base::TestSetRemoteContentUpdate();
-}
-
-TEST_F(RtpDataChannelSingleThreadTest, TestStreams) {
-  Base::TestStreams();
-}
-
-TEST_F(RtpDataChannelSingleThreadTest, TestUpdateStreamsInLocalContent) {
-  Base::TestUpdateStreamsInLocalContent();
-}
-
-TEST_F(RtpDataChannelSingleThreadTest, TestUpdateRemoteStreamsInContent) {
-  Base::TestUpdateStreamsInRemoteContent();
-}
-
-TEST_F(RtpDataChannelSingleThreadTest, TestChangeStreamParamsInContent) {
-  Base::TestChangeStreamParamsInContent();
-}
-
-TEST_F(RtpDataChannelSingleThreadTest, TestPlayoutAndSendingStates) {
-  Base::TestPlayoutAndSendingStates();
-}
-
-TEST_F(RtpDataChannelSingleThreadTest, TestMediaContentDirection) {
-  Base::TestMediaContentDirection();
-}
-
-TEST_F(RtpDataChannelSingleThreadTest, TestCallSetup) {
-  Base::TestCallSetup();
-}
-
-TEST_F(RtpDataChannelSingleThreadTest, TestCallTeardownRtcpMux) {
-  Base::TestCallTeardownRtcpMux();
-}
-
-TEST_F(RtpDataChannelSingleThreadTest, TestOnTransportReadyToSend) {
-  Base::TestOnTransportReadyToSend();
-}
-
-TEST_F(RtpDataChannelSingleThreadTest, TestOnTransportReadyToSendWithRtcpMux) {
-  Base::TestOnTransportReadyToSendWithRtcpMux();
-}
-
-TEST_F(RtpDataChannelSingleThreadTest, SendRtpToRtp) {
-  Base::SendRtpToRtp();
-}
-
-TEST_F(RtpDataChannelSingleThreadTest, SendRtcpToRtcp) {
-  Base::SendRtcpToRtcp();
-}
-
-TEST_F(RtpDataChannelSingleThreadTest, SendRtcpMuxToRtcp) {
-  Base::SendRtcpMuxToRtcp();
-}
-
-TEST_F(RtpDataChannelSingleThreadTest, SendRtcpMuxToRtcpMux) {
-  Base::SendRtcpMuxToRtcpMux();
-}
-
-TEST_F(RtpDataChannelSingleThreadTest, SendEarlyRtcpMuxToRtcp) {
-  Base::SendEarlyRtcpMuxToRtcp();
-}
-
-TEST_F(RtpDataChannelSingleThreadTest, SendEarlyRtcpMuxToRtcpMux) {
-  Base::SendEarlyRtcpMuxToRtcpMux();
-}
-
-TEST_F(RtpDataChannelSingleThreadTest, SendSrtpToSrtp) {
-  Base::SendSrtpToSrtp();
-}
-
-TEST_F(RtpDataChannelSingleThreadTest, SendSrtpToRtp) {
-  Base::SendSrtpToSrtp();
-}
-
-TEST_F(RtpDataChannelSingleThreadTest, SendSrtcpMux) {
-  Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
-}
-
-TEST_F(RtpDataChannelSingleThreadTest, SendRtpToRtpOnThread) {
-  Base::SendRtpToRtpOnThread();
-}
-
-TEST_F(RtpDataChannelSingleThreadTest, SendSrtpToSrtpOnThread) {
-  Base::SendSrtpToSrtpOnThread();
-}
-
-TEST_F(RtpDataChannelSingleThreadTest, SendWithWritabilityLoss) {
-  Base::SendWithWritabilityLoss();
-}
-
-TEST_F(RtpDataChannelSingleThreadTest, TestMediaMonitor) {
-  Base::TestMediaMonitor();
-}
-
-TEST_F(RtpDataChannelSingleThreadTest, TestSendData) {
-  CreateChannels(0, 0);
-  EXPECT_TRUE(SendInitiate());
-  EXPECT_TRUE(SendAccept());
-
-  cricket::SendDataParams params;
-  params.ssrc = 42;
-  unsigned char data[] = {'f', 'o', 'o'};
-  rtc::CopyOnWriteBuffer payload(data, 3);
-  cricket::SendDataResult result;
-  ASSERT_TRUE(media_channel1_->SendData(params, payload, &result));
-  EXPECT_EQ(params.ssrc, media_channel1_->last_sent_data_params().ssrc);
-  EXPECT_EQ("foo", media_channel1_->last_sent_data());
-}
-
-TEST_F(RtpDataChannelDoubleThreadTest, TestInit) {
-  Base::TestInit();
-  EXPECT_FALSE(media_channel1_->IsStreamMuted(0));
-}
-
-TEST_F(RtpDataChannelDoubleThreadTest, TestDeinit) {
-  Base::TestDeinit();
-}
-
-TEST_F(RtpDataChannelDoubleThreadTest, TestSetContents) {
-  Base::TestSetContents();
-}
-
-TEST_F(RtpDataChannelDoubleThreadTest, TestSetContentsNullOffer) {
-  Base::TestSetContentsNullOffer();
-}
-
-TEST_F(RtpDataChannelDoubleThreadTest, TestSetContentsRtcpMux) {
-  Base::TestSetContentsRtcpMux();
-}
-
-TEST_F(RtpDataChannelDoubleThreadTest, TestSetRemoteContentUpdate) {
-  Base::TestSetRemoteContentUpdate();
-}
-
-TEST_F(RtpDataChannelDoubleThreadTest, TestStreams) {
-  Base::TestStreams();
-}
-
-TEST_F(RtpDataChannelDoubleThreadTest, TestUpdateStreamsInLocalContent) {
-  Base::TestUpdateStreamsInLocalContent();
-}
-
-TEST_F(RtpDataChannelDoubleThreadTest, TestUpdateRemoteStreamsInContent) {
-  Base::TestUpdateStreamsInRemoteContent();
-}
-
-TEST_F(RtpDataChannelDoubleThreadTest, TestChangeStreamParamsInContent) {
-  Base::TestChangeStreamParamsInContent();
-}
-
-TEST_F(RtpDataChannelDoubleThreadTest, TestPlayoutAndSendingStates) {
-  Base::TestPlayoutAndSendingStates();
-}
-
-TEST_F(RtpDataChannelDoubleThreadTest, TestMediaContentDirection) {
-  Base::TestMediaContentDirection();
-}
-
-TEST_F(RtpDataChannelDoubleThreadTest, TestCallSetup) {
-  Base::TestCallSetup();
-}
-
-TEST_F(RtpDataChannelDoubleThreadTest, TestCallTeardownRtcpMux) {
-  Base::TestCallTeardownRtcpMux();
-}
-
-TEST_F(RtpDataChannelDoubleThreadTest, TestOnTransportReadyToSend) {
-  Base::TestOnTransportReadyToSend();
-}
-
-TEST_F(RtpDataChannelDoubleThreadTest, TestOnTransportReadyToSendWithRtcpMux) {
-  Base::TestOnTransportReadyToSendWithRtcpMux();
-}
-
-TEST_F(RtpDataChannelDoubleThreadTest, SendRtpToRtp) {
-  Base::SendRtpToRtp();
-}
-
-TEST_F(RtpDataChannelDoubleThreadTest, SendRtcpToRtcp) {
-  Base::SendRtcpToRtcp();
-}
-
-TEST_F(RtpDataChannelDoubleThreadTest, SendRtcpMuxToRtcp) {
-  Base::SendRtcpMuxToRtcp();
-}
-
-TEST_F(RtpDataChannelDoubleThreadTest, SendRtcpMuxToRtcpMux) {
-  Base::SendRtcpMuxToRtcpMux();
-}
-
-TEST_F(RtpDataChannelDoubleThreadTest, SendEarlyRtcpMuxToRtcp) {
-  Base::SendEarlyRtcpMuxToRtcp();
-}
-
-TEST_F(RtpDataChannelDoubleThreadTest, SendEarlyRtcpMuxToRtcpMux) {
-  Base::SendEarlyRtcpMuxToRtcpMux();
-}
-
-TEST_F(RtpDataChannelDoubleThreadTest, SendSrtpToSrtp) {
-  Base::SendSrtpToSrtp();
-}
-
-TEST_F(RtpDataChannelDoubleThreadTest, SendSrtpToRtp) {
-  Base::SendSrtpToSrtp();
-}
-
-TEST_F(RtpDataChannelDoubleThreadTest, SendSrtcpMux) {
-  Base::SendSrtpToSrtp(RTCP_MUX, RTCP_MUX);
-}
-
-TEST_F(RtpDataChannelDoubleThreadTest, SendRtpToRtpOnThread) {
-  Base::SendRtpToRtpOnThread();
-}
-
-TEST_F(RtpDataChannelDoubleThreadTest, SendSrtpToSrtpOnThread) {
-  Base::SendSrtpToSrtpOnThread();
-}
-
-TEST_F(RtpDataChannelDoubleThreadTest, SendWithWritabilityLoss) {
-  Base::SendWithWritabilityLoss();
-}
-
-TEST_F(RtpDataChannelDoubleThreadTest, TestMediaMonitor) {
-  Base::TestMediaMonitor();
-}
-
-TEST_F(RtpDataChannelDoubleThreadTest, TestSendData) {
-  CreateChannels(0, 0);
-  EXPECT_TRUE(SendInitiate());
-  EXPECT_TRUE(SendAccept());
-
-  cricket::SendDataParams params;
-  params.ssrc = 42;
-  unsigned char data[] = {
-    'f', 'o', 'o'
-  };
-  rtc::CopyOnWriteBuffer payload(data, 3);
-  cricket::SendDataResult result;
-  ASSERT_TRUE(media_channel1_->SendData(params, payload, &result));
-  EXPECT_EQ(params.ssrc,
-            media_channel1_->last_sent_data_params().ssrc);
-  EXPECT_EQ("foo", media_channel1_->last_sent_data());
-}
-
-#if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
-
-// Verifies some DCHECKs are in place.
-// Uses VoiceChannel, but any BaseChannel subclass would work.
-class BaseChannelDeathTest : public testing::Test {
- public:
-  BaseChannelDeathTest()
-      : fake_rtp_dtls_transport_("foo", cricket::ICE_CANDIDATE_COMPONENT_RTP),
-        fake_rtcp_dtls_transport_("foo", cricket::ICE_CANDIDATE_COMPONENT_RTCP),
-        // RTCP mux not required, SRTP required.
-        voice_channel_(
-            rtc::Thread::Current(),
-            rtc::Thread::Current(),
-            rtc::Thread::Current(),
-            &fake_media_engine_,
-            new cricket::FakeVoiceMediaChannel(nullptr,
-                                               cricket::AudioOptions()),
-            cricket::CN_AUDIO,
-            false,
-            true) {}
-
- protected:
-  cricket::FakeMediaEngine fake_media_engine_;
-  cricket::FakeDtlsTransport fake_rtp_dtls_transport_;
-  cricket::FakeDtlsTransport fake_rtcp_dtls_transport_;
-  cricket::VoiceChannel voice_channel_;
-};
-
-TEST_F(BaseChannelDeathTest, SetTransportsWithNullRtpTransport) {
-  ASSERT_TRUE(voice_channel_.Init_w(
-      &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_,
-      &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_));
-  cricket::FakeDtlsTransport new_rtcp_transport(
-      "bar", cricket::ICE_CANDIDATE_COMPONENT_RTCP);
-  EXPECT_DEATH(voice_channel_.SetTransports(nullptr, &new_rtcp_transport), "");
-}
-
-TEST_F(BaseChannelDeathTest, SetTransportsWithMissingRtcpTransport) {
-  ASSERT_TRUE(voice_channel_.Init_w(
-      &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_,
-      &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_));
-  cricket::FakeDtlsTransport new_rtp_transport(
-      "bar", cricket::ICE_CANDIDATE_COMPONENT_RTP);
-  EXPECT_DEATH(voice_channel_.SetTransports(&new_rtp_transport, nullptr), "");
-}
-
-TEST_F(BaseChannelDeathTest, SetTransportsWithUnneededRtcpTransport) {
-  ASSERT_TRUE(voice_channel_.Init_w(
-      &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_,
-      &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_));
-  // Activate RTCP muxing, simulating offer/answer negotiation.
-  cricket::AudioContentDescription content;
-  content.set_rtcp_mux(true);
-  ASSERT_TRUE(voice_channel_.SetLocalContent(&content, CA_OFFER, nullptr));
-  ASSERT_TRUE(voice_channel_.SetRemoteContent(&content, CA_ANSWER, nullptr));
-  cricket::FakeDtlsTransport new_rtp_transport(
-      "bar", cricket::ICE_CANDIDATE_COMPONENT_RTP);
-  cricket::FakeDtlsTransport new_rtcp_transport(
-      "bar", cricket::ICE_CANDIDATE_COMPONENT_RTCP);
-  // After muxing is enabled, no RTCP transport should be passed in here.
-  EXPECT_DEATH(
-      voice_channel_.SetTransports(&new_rtp_transport, &new_rtcp_transport),
-      "");
-}
-
-// This test will probably go away if/when we move the transport name out of
-// the transport classes and into their parent classes.
-TEST_F(BaseChannelDeathTest, SetTransportsWithMismatchingTransportNames) {
-  ASSERT_TRUE(voice_channel_.Init_w(
-      &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_,
-      &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_));
-  cricket::FakeDtlsTransport new_rtp_transport(
-      "bar", cricket::ICE_CANDIDATE_COMPONENT_RTP);
-  cricket::FakeDtlsTransport new_rtcp_transport(
-      "baz", cricket::ICE_CANDIDATE_COMPONENT_RTCP);
-  EXPECT_DEATH(
-      voice_channel_.SetTransports(&new_rtp_transport, &new_rtcp_transport),
-      "");
-}
-
-// Not expected to support going from DtlsTransportInternal to
-// PacketTransportInternal.
-TEST_F(BaseChannelDeathTest, SetTransportsDtlsToNonDtls) {
-  ASSERT_TRUE(voice_channel_.Init_w(
-      &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_,
-      &fake_rtp_dtls_transport_, &fake_rtcp_dtls_transport_));
-  EXPECT_DEATH(
-      voice_channel_.SetTransports(
-          static_cast<rtc::PacketTransportInternal*>(&fake_rtp_dtls_transport_),
-          static_cast<rtc::PacketTransportInternal*>(
-              &fake_rtp_dtls_transport_)),
-      "");
-}
-
-// Not expected to support going from PacketTransportInternal to
-// DtlsTransportInternal.
-TEST_F(BaseChannelDeathTest, SetTransportsNonDtlsToDtls) {
-  ASSERT_TRUE(voice_channel_.Init_w(nullptr, nullptr, &fake_rtp_dtls_transport_,
-                                    &fake_rtcp_dtls_transport_));
-  EXPECT_DEATH(voice_channel_.SetTransports(&fake_rtp_dtls_transport_,
-                                            &fake_rtp_dtls_transport_),
-               "");
-}
-
-#endif  // RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
-
-// TODO(pthatcher): TestSetReceiver?
diff --git a/pc/channelmanager.cc b/pc/channelmanager.cc
deleted file mode 100644
index 197e722..0000000
--- a/pc/channelmanager.cc
+++ /dev/null
@@ -1,458 +0,0 @@
-/*
- *  Copyright 2004 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/pc/channelmanager.h"
-
-#include <algorithm>
-
-#include "webrtc/media/base/device.h"
-#include "webrtc/media/base/rtpdataengine.h"
-#include "webrtc/pc/srtpfilter.h"
-#include "webrtc/rtc_base/bind.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/stringencode.h"
-#include "webrtc/rtc_base/stringutils.h"
-#include "webrtc/rtc_base/trace_event.h"
-
-namespace cricket {
-
-
-using rtc::Bind;
-
-ChannelManager::ChannelManager(std::unique_ptr<MediaEngineInterface> me,
-                               std::unique_ptr<DataEngineInterface> dme,
-                               rtc::Thread* thread) {
-  Construct(std::move(me), std::move(dme), thread, thread);
-}
-
-ChannelManager::ChannelManager(std::unique_ptr<MediaEngineInterface> me,
-                               rtc::Thread* worker_thread,
-                               rtc::Thread* network_thread) {
-  Construct(std::move(me),
-            std::unique_ptr<DataEngineInterface>(new RtpDataEngine()),
-            worker_thread, network_thread);
-}
-
-void ChannelManager::Construct(std::unique_ptr<MediaEngineInterface> me,
-                               std::unique_ptr<DataEngineInterface> dme,
-                               rtc::Thread* worker_thread,
-                               rtc::Thread* network_thread) {
-  media_engine_ = std::move(me);
-  data_media_engine_ = std::move(dme);
-  initialized_ = false;
-  main_thread_ = rtc::Thread::Current();
-  worker_thread_ = worker_thread;
-  network_thread_ = network_thread;
-  capturing_ = false;
-  enable_rtx_ = false;
-}
-
-ChannelManager::~ChannelManager() {
-  if (initialized_) {
-    Terminate();
-    // If srtp is initialized (done by the Channel) then we must call
-    // srtp_shutdown to free all crypto kernel lists. But we need to make sure
-    // shutdown always called at the end, after channels are destroyed.
-    // ChannelManager d'tor is always called last, it's safe place to call
-    // shutdown.
-    ShutdownSrtp();
-  }
-  // The media engine needs to be deleted on the worker thread for thread safe
-  // destruction,
-  worker_thread_->Invoke<void>(
-      RTC_FROM_HERE, Bind(&ChannelManager::DestructorDeletes_w, this));
-}
-
-bool ChannelManager::SetVideoRtxEnabled(bool enable) {
-  // To be safe, this call is only allowed before initialization. Apps like
-  // Flute only have a singleton ChannelManager and we don't want this flag to
-  // be toggled between calls or when there's concurrent calls. We expect apps
-  // to enable this at startup and retain that setting for the lifetime of the
-  // app.
-  if (!initialized_) {
-    enable_rtx_ = enable;
-    return true;
-  } else {
-    LOG(LS_WARNING) << "Cannot toggle rtx after initialization!";
-    return false;
-  }
-}
-
-void ChannelManager::GetSupportedAudioSendCodecs(
-    std::vector<AudioCodec>* codecs) const {
-  if (!media_engine_) {
-    return;
-  }
-  *codecs = media_engine_->audio_send_codecs();
-}
-
-void ChannelManager::GetSupportedAudioReceiveCodecs(
-    std::vector<AudioCodec>* codecs) const {
-  if (!media_engine_) {
-    return;
-  }
-  *codecs = media_engine_->audio_recv_codecs();
-}
-
-void ChannelManager::GetSupportedAudioRtpHeaderExtensions(
-    RtpHeaderExtensions* ext) const {
-  if (!media_engine_) {
-    return;
-  }
-  *ext = media_engine_->GetAudioCapabilities().header_extensions;
-}
-
-void ChannelManager::GetSupportedVideoCodecs(
-    std::vector<VideoCodec>* codecs) const {
-  if (!media_engine_) {
-    return;
-  }
-  codecs->clear();
-
-  std::vector<VideoCodec> video_codecs = media_engine_->video_codecs();
-  for (const auto& video_codec : video_codecs) {
-    if (!enable_rtx_ &&
-        _stricmp(kRtxCodecName, video_codec.name.c_str()) == 0) {
-      continue;
-    }
-    codecs->push_back(video_codec);
-  }
-}
-
-void ChannelManager::GetSupportedVideoRtpHeaderExtensions(
-    RtpHeaderExtensions* ext) const {
-  if (!media_engine_) {
-    return;
-  }
-  *ext = media_engine_->GetVideoCapabilities().header_extensions;
-}
-
-void ChannelManager::GetSupportedDataCodecs(
-    std::vector<DataCodec>* codecs) const {
-  if (!data_media_engine_) {
-    return;
-  }
-  *codecs = data_media_engine_->data_codecs();
-}
-
-bool ChannelManager::Init() {
-  RTC_DCHECK(!initialized_);
-  if (initialized_) {
-    return false;
-  }
-  RTC_DCHECK(network_thread_);
-  RTC_DCHECK(worker_thread_);
-  if (!network_thread_->IsCurrent()) {
-    // Do not allow invoking calls to other threads on the network thread.
-    network_thread_->Invoke<bool>(
-        RTC_FROM_HERE,
-        rtc::Bind(&rtc::Thread::SetAllowBlockingCalls, network_thread_, false));
-  }
-
-  initialized_ = worker_thread_->Invoke<bool>(
-      RTC_FROM_HERE, Bind(&ChannelManager::InitMediaEngine_w, this));
-  RTC_DCHECK(initialized_);
-  return initialized_;
-}
-
-bool ChannelManager::InitMediaEngine_w() {
-  RTC_DCHECK(worker_thread_ == rtc::Thread::Current());
-  if (media_engine_) {
-    return media_engine_->Init();
-  }
-  return true;
-}
-
-void ChannelManager::Terminate() {
-  RTC_DCHECK(initialized_);
-  if (!initialized_) {
-    return;
-  }
-  worker_thread_->Invoke<void>(RTC_FROM_HERE,
-                               Bind(&ChannelManager::Terminate_w, this));
-  initialized_ = false;
-}
-
-void ChannelManager::DestructorDeletes_w() {
-  RTC_DCHECK(worker_thread_ == rtc::Thread::Current());
-  media_engine_.reset(nullptr);
-}
-
-void ChannelManager::Terminate_w() {
-  RTC_DCHECK(worker_thread_ == rtc::Thread::Current());
-  // Need to destroy the voice/video channels
-  video_channels_.clear();
-  voice_channels_.clear();
-}
-
-VoiceChannel* ChannelManager::CreateVoiceChannel(
-    webrtc::Call* call,
-    const cricket::MediaConfig& media_config,
-    DtlsTransportInternal* rtp_transport,
-    DtlsTransportInternal* rtcp_transport,
-    rtc::Thread* signaling_thread,
-    const std::string& content_name,
-    bool srtp_required,
-    const AudioOptions& options) {
-  return worker_thread_->Invoke<VoiceChannel*>(
-      RTC_FROM_HERE,
-      Bind(&ChannelManager::CreateVoiceChannel_w, this, call, media_config,
-           rtp_transport, rtcp_transport, rtp_transport, rtcp_transport,
-           signaling_thread, content_name, srtp_required, options));
-}
-
-VoiceChannel* ChannelManager::CreateVoiceChannel(
-    webrtc::Call* call,
-    const cricket::MediaConfig& media_config,
-    rtc::PacketTransportInternal* rtp_transport,
-    rtc::PacketTransportInternal* rtcp_transport,
-    rtc::Thread* signaling_thread,
-    const std::string& content_name,
-    bool srtp_required,
-    const AudioOptions& options) {
-  return worker_thread_->Invoke<VoiceChannel*>(
-      RTC_FROM_HERE,
-      Bind(&ChannelManager::CreateVoiceChannel_w, this, call, media_config,
-           nullptr, nullptr, rtp_transport, rtcp_transport, signaling_thread,
-           content_name, srtp_required, options));
-}
-
-VoiceChannel* ChannelManager::CreateVoiceChannel_w(
-    webrtc::Call* call,
-    const cricket::MediaConfig& media_config,
-    DtlsTransportInternal* rtp_dtls_transport,
-    DtlsTransportInternal* rtcp_dtls_transport,
-    rtc::PacketTransportInternal* rtp_packet_transport,
-    rtc::PacketTransportInternal* rtcp_packet_transport,
-    rtc::Thread* signaling_thread,
-    const std::string& content_name,
-    bool srtp_required,
-    const AudioOptions& options) {
-  RTC_DCHECK(initialized_);
-  RTC_DCHECK(worker_thread_ == rtc::Thread::Current());
-  RTC_DCHECK(nullptr != call);
-  if (!media_engine_) {
-    return nullptr;
-  }
-
-  VoiceMediaChannel* media_channel = media_engine_->CreateChannel(
-      call, media_config, options);
-  if (!media_channel) {
-    return nullptr;
-  }
-
-  std::unique_ptr<VoiceChannel> voice_channel(
-      new VoiceChannel(worker_thread_, network_thread_, signaling_thread,
-                       media_engine_.get(), media_channel, content_name,
-                       rtcp_packet_transport == nullptr, srtp_required));
-
-  if (!voice_channel->Init_w(rtp_dtls_transport, rtcp_dtls_transport,
-                             rtp_packet_transport, rtcp_packet_transport)) {
-    return nullptr;
-  }
-  VoiceChannel* voice_channel_ptr = voice_channel.get();
-  voice_channels_.push_back(std::move(voice_channel));
-  return voice_channel_ptr;
-}
-
-void ChannelManager::DestroyVoiceChannel(VoiceChannel* voice_channel) {
-  TRACE_EVENT0("webrtc", "ChannelManager::DestroyVoiceChannel");
-  if (voice_channel) {
-    worker_thread_->Invoke<void>(
-        RTC_FROM_HERE,
-        Bind(&ChannelManager::DestroyVoiceChannel_w, this, voice_channel));
-  }
-}
-
-void ChannelManager::DestroyVoiceChannel_w(VoiceChannel* voice_channel) {
-  TRACE_EVENT0("webrtc", "ChannelManager::DestroyVoiceChannel_w");
-  RTC_DCHECK(initialized_);
-  RTC_DCHECK(worker_thread_ == rtc::Thread::Current());
-
-  auto it = std::find_if(voice_channels_.begin(), voice_channels_.end(),
-                         [&](const std::unique_ptr<VoiceChannel>& p) {
-                           return p.get() == voice_channel;
-                         });
-  RTC_DCHECK(it != voice_channels_.end());
-  if (it == voice_channels_.end())
-    return;
-  voice_channels_.erase(it);
-}
-
-VideoChannel* ChannelManager::CreateVideoChannel(
-    webrtc::Call* call,
-    const cricket::MediaConfig& media_config,
-    DtlsTransportInternal* rtp_transport,
-    DtlsTransportInternal* rtcp_transport,
-    rtc::Thread* signaling_thread,
-    const std::string& content_name,
-    bool srtp_required,
-    const VideoOptions& options) {
-  return worker_thread_->Invoke<VideoChannel*>(
-      RTC_FROM_HERE,
-      Bind(&ChannelManager::CreateVideoChannel_w, this, call, media_config,
-           rtp_transport, rtcp_transport, rtp_transport, rtcp_transport,
-           signaling_thread, content_name, srtp_required, options));
-}
-
-VideoChannel* ChannelManager::CreateVideoChannel(
-    webrtc::Call* call,
-    const cricket::MediaConfig& media_config,
-    rtc::PacketTransportInternal* rtp_transport,
-    rtc::PacketTransportInternal* rtcp_transport,
-    rtc::Thread* signaling_thread,
-    const std::string& content_name,
-    bool srtp_required,
-    const VideoOptions& options) {
-  return worker_thread_->Invoke<VideoChannel*>(
-      RTC_FROM_HERE,
-      Bind(&ChannelManager::CreateVideoChannel_w, this, call, media_config,
-           nullptr, nullptr, rtp_transport, rtcp_transport, signaling_thread,
-           content_name, srtp_required, options));
-}
-
-VideoChannel* ChannelManager::CreateVideoChannel_w(
-    webrtc::Call* call,
-    const cricket::MediaConfig& media_config,
-    DtlsTransportInternal* rtp_dtls_transport,
-    DtlsTransportInternal* rtcp_dtls_transport,
-    rtc::PacketTransportInternal* rtp_packet_transport,
-    rtc::PacketTransportInternal* rtcp_packet_transport,
-    rtc::Thread* signaling_thread,
-    const std::string& content_name,
-    bool srtp_required,
-    const VideoOptions& options) {
-  RTC_DCHECK(initialized_);
-  RTC_DCHECK(worker_thread_ == rtc::Thread::Current());
-  RTC_DCHECK(nullptr != call);
-  VideoMediaChannel* media_channel = media_engine_->CreateVideoChannel(
-      call, media_config, options);
-  if (!media_channel) {
-    return nullptr;
-  }
-
-  std::unique_ptr<VideoChannel> video_channel(new VideoChannel(
-      worker_thread_, network_thread_, signaling_thread, media_channel,
-      content_name, rtcp_packet_transport == nullptr, srtp_required));
-  if (!video_channel->Init_w(rtp_dtls_transport, rtcp_dtls_transport,
-                             rtp_packet_transport, rtcp_packet_transport)) {
-    return nullptr;
-  }
-  VideoChannel* video_channel_ptr = video_channel.get();
-  video_channels_.push_back(std::move(video_channel));
-  return video_channel_ptr;
-}
-
-void ChannelManager::DestroyVideoChannel(VideoChannel* video_channel) {
-  TRACE_EVENT0("webrtc", "ChannelManager::DestroyVideoChannel");
-  if (video_channel) {
-    worker_thread_->Invoke<void>(
-        RTC_FROM_HERE,
-        Bind(&ChannelManager::DestroyVideoChannel_w, this, video_channel));
-  }
-}
-
-void ChannelManager::DestroyVideoChannel_w(VideoChannel* video_channel) {
-  TRACE_EVENT0("webrtc", "ChannelManager::DestroyVideoChannel_w");
-  RTC_DCHECK(initialized_);
-  RTC_DCHECK(worker_thread_ == rtc::Thread::Current());
-
-  auto it = std::find_if(video_channels_.begin(), video_channels_.end(),
-                         [&](const std::unique_ptr<VideoChannel>& p) {
-                           return p.get() == video_channel;
-                         });
-  RTC_DCHECK(it != video_channels_.end());
-  if (it == video_channels_.end())
-    return;
-
-  video_channels_.erase(it);
-}
-
-RtpDataChannel* ChannelManager::CreateRtpDataChannel(
-    const cricket::MediaConfig& media_config,
-    DtlsTransportInternal* rtp_transport,
-    DtlsTransportInternal* rtcp_transport,
-    rtc::Thread* signaling_thread,
-    const std::string& content_name,
-    bool srtp_required) {
-  return worker_thread_->Invoke<RtpDataChannel*>(
-      RTC_FROM_HERE, Bind(&ChannelManager::CreateRtpDataChannel_w, this,
-                          media_config, rtp_transport, rtcp_transport,
-                          signaling_thread, content_name, srtp_required));
-}
-
-RtpDataChannel* ChannelManager::CreateRtpDataChannel_w(
-    const cricket::MediaConfig& media_config,
-    DtlsTransportInternal* rtp_transport,
-    DtlsTransportInternal* rtcp_transport,
-    rtc::Thread* signaling_thread,
-    const std::string& content_name,
-    bool srtp_required) {
-  // This is ok to alloc from a thread other than the worker thread.
-  RTC_DCHECK(initialized_);
-  DataMediaChannel* media_channel
-      = data_media_engine_->CreateChannel(media_config);
-  if (!media_channel) {
-    LOG(LS_WARNING) << "Failed to create RTP data channel.";
-    return nullptr;
-  }
-
-  std::unique_ptr<RtpDataChannel> data_channel(new RtpDataChannel(
-      worker_thread_, network_thread_, signaling_thread, media_channel,
-      content_name, rtcp_transport == nullptr, srtp_required));
-  if (!data_channel->Init_w(rtp_transport, rtcp_transport, rtp_transport,
-                            rtcp_transport)) {
-    LOG(LS_WARNING) << "Failed to init data channel.";
-    return nullptr;
-  }
-  RtpDataChannel* data_channel_ptr = data_channel.get();
-  data_channels_.push_back(std::move(data_channel));
-  return data_channel_ptr;
-}
-
-void ChannelManager::DestroyRtpDataChannel(RtpDataChannel* data_channel) {
-  TRACE_EVENT0("webrtc", "ChannelManager::DestroyRtpDataChannel");
-  if (data_channel) {
-    worker_thread_->Invoke<void>(
-        RTC_FROM_HERE,
-        Bind(&ChannelManager::DestroyRtpDataChannel_w, this, data_channel));
-  }
-}
-
-void ChannelManager::DestroyRtpDataChannel_w(RtpDataChannel* data_channel) {
-  TRACE_EVENT0("webrtc", "ChannelManager::DestroyRtpDataChannel_w");
-  RTC_DCHECK(initialized_);
-
-  auto it = std::find_if(data_channels_.begin(), data_channels_.end(),
-                         [&](const std::unique_ptr<RtpDataChannel>& p) {
-                           return p.get() == data_channel;
-                         });
-  RTC_DCHECK(it != data_channels_.end());
-  if (it == data_channels_.end())
-    return;
-
-  data_channels_.erase(it);
-}
-
-bool ChannelManager::StartAecDump(rtc::PlatformFile file,
-                                  int64_t max_size_bytes) {
-  return worker_thread_->Invoke<bool>(
-      RTC_FROM_HERE, Bind(&MediaEngineInterface::StartAecDump,
-                          media_engine_.get(), file, max_size_bytes));
-}
-
-void ChannelManager::StopAecDump() {
-  worker_thread_->Invoke<void>(
-      RTC_FROM_HERE,
-      Bind(&MediaEngineInterface::StopAecDump, media_engine_.get()));
-}
-
-}  // namespace cricket
diff --git a/pc/channelmanager.h b/pc/channelmanager.h
deleted file mode 100644
index eef90fd..0000000
--- a/pc/channelmanager.h
+++ /dev/null
@@ -1,226 +0,0 @@
-/*
- *  Copyright 2004 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_PC_CHANNELMANAGER_H_
-#define WEBRTC_PC_CHANNELMANAGER_H_
-
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "webrtc/media/base/mediaengine.h"
-#include "webrtc/pc/voicechannel.h"
-#include "webrtc/rtc_base/fileutils.h"
-#include "webrtc/rtc_base/thread.h"
-
-namespace cricket {
-
-class VoiceChannel;
-
-// ChannelManager allows the MediaEngine to run on a separate thread, and takes
-// care of marshalling calls between threads. It also creates and keeps track of
-// voice and video channels; by doing so, it can temporarily pause all the
-// channels when a new audio or video device is chosen. The voice and video
-// channels are stored in separate vectors, to easily allow operations on just
-// voice or just video channels.
-// ChannelManager also allows the application to discover what devices it has
-// using device manager.
-class ChannelManager {
- public:
-  // For testing purposes. Allows the media engine and data media
-  // engine and dev manager to be mocks.
-  ChannelManager(std::unique_ptr<MediaEngineInterface> me,
-                 std::unique_ptr<DataEngineInterface> dme,
-                 rtc::Thread* worker_and_network);
-  // Same as above, but gives an easier default DataEngine.
-  ChannelManager(std::unique_ptr<MediaEngineInterface> me,
-                 rtc::Thread* worker,
-                 rtc::Thread* network);
-  ~ChannelManager();
-
-  // Accessors for the worker thread, allowing it to be set after construction,
-  // but before Init. set_worker_thread will return false if called after Init.
-  rtc::Thread* worker_thread() const { return worker_thread_; }
-  bool set_worker_thread(rtc::Thread* thread) {
-    if (initialized_) {
-      return false;
-    }
-    worker_thread_ = thread;
-    return true;
-  }
-  rtc::Thread* network_thread() const { return network_thread_; }
-  bool set_network_thread(rtc::Thread* thread) {
-    if (initialized_) {
-      return false;
-    }
-    network_thread_ = thread;
-    return true;
-  }
-
-  MediaEngineInterface* media_engine() { return media_engine_.get(); }
-
-  // Retrieves the list of supported audio & video codec types.
-  // Can be called before starting the media engine.
-  void GetSupportedAudioSendCodecs(std::vector<AudioCodec>* codecs) const;
-  void GetSupportedAudioReceiveCodecs(std::vector<AudioCodec>* codecs) const;
-  void GetSupportedAudioRtpHeaderExtensions(RtpHeaderExtensions* ext) const;
-  void GetSupportedVideoCodecs(std::vector<VideoCodec>* codecs) const;
-  void GetSupportedVideoRtpHeaderExtensions(RtpHeaderExtensions* ext) const;
-  void GetSupportedDataCodecs(std::vector<DataCodec>* codecs) const;
-
-  // Indicates whether the media engine is started.
-  bool initialized() const { return initialized_; }
-  // Starts up the media engine.
-  bool Init();
-  // Shuts down the media engine.
-  void Terminate();
-
-  // The operations below all occur on the worker thread.
-  // ChannelManager retains ownership of the created channels, so clients should
-  // call the appropriate Destroy*Channel method when done.
-
-  // Creates a voice channel, to be associated with the specified session.
-  VoiceChannel* CreateVoiceChannel(
-      webrtc::Call* call,
-      const cricket::MediaConfig& media_config,
-      DtlsTransportInternal* rtp_transport,
-      DtlsTransportInternal* rtcp_transport,
-      rtc::Thread* signaling_thread,
-      const std::string& content_name,
-      bool srtp_required,
-      const AudioOptions& options);
-  // Version of the above that takes PacketTransportInternal.
-  VoiceChannel* CreateVoiceChannel(
-      webrtc::Call* call,
-      const cricket::MediaConfig& media_config,
-      rtc::PacketTransportInternal* rtp_transport,
-      rtc::PacketTransportInternal* rtcp_transport,
-      rtc::Thread* signaling_thread,
-      const std::string& content_name,
-      bool srtp_required,
-      const AudioOptions& options);
-  // Destroys a voice channel created by CreateVoiceChannel.
-  void DestroyVoiceChannel(VoiceChannel* voice_channel);
-
-  // Creates a video channel, synced with the specified voice channel, and
-  // associated with the specified session.
-  VideoChannel* CreateVideoChannel(
-      webrtc::Call* call,
-      const cricket::MediaConfig& media_config,
-      DtlsTransportInternal* rtp_transport,
-      DtlsTransportInternal* rtcp_transport,
-      rtc::Thread* signaling_thread,
-      const std::string& content_name,
-      bool srtp_required,
-      const VideoOptions& options);
-  // Version of the above that takes PacketTransportInternal.
-  VideoChannel* CreateVideoChannel(
-      webrtc::Call* call,
-      const cricket::MediaConfig& media_config,
-      rtc::PacketTransportInternal* rtp_transport,
-      rtc::PacketTransportInternal* rtcp_transport,
-      rtc::Thread* signaling_thread,
-      const std::string& content_name,
-      bool srtp_required,
-      const VideoOptions& options);
-  // Destroys a video channel created by CreateVideoChannel.
-  void DestroyVideoChannel(VideoChannel* video_channel);
-
-  RtpDataChannel* CreateRtpDataChannel(
-      const cricket::MediaConfig& media_config,
-      DtlsTransportInternal* rtp_transport,
-      DtlsTransportInternal* rtcp_transport,
-      rtc::Thread* signaling_thread,
-      const std::string& content_name,
-      bool srtp_required);
-  // Destroys a data channel created by CreateRtpDataChannel.
-  void DestroyRtpDataChannel(RtpDataChannel* data_channel);
-
-  // Indicates whether any channels exist.
-  bool has_channels() const {
-    return (!voice_channels_.empty() || !video_channels_.empty());
-  }
-
-  // RTX will be enabled/disabled in engines that support it. The supporting
-  // engines will start offering an RTX codec. Must be called before Init().
-  bool SetVideoRtxEnabled(bool enable);
-
-  // Starts/stops the local microphone and enables polling of the input level.
-  bool capturing() const { return capturing_; }
-
-  // The operations below occur on the main thread.
-
-  // Starts AEC dump using existing file, with a specified maximum file size in
-  // bytes. When the limit is reached, logging will stop and the file will be
-  // closed. If max_size_bytes is set to <= 0, no limit will be used.
-  bool StartAecDump(rtc::PlatformFile file, int64_t max_size_bytes);
-
-  // Stops recording AEC dump.
-  void StopAecDump();
-
- private:
-  void Construct(std::unique_ptr<MediaEngineInterface> me,
-                 std::unique_ptr<DataEngineInterface> dme,
-                 rtc::Thread* worker_thread,
-                 rtc::Thread* network_thread);
-  bool InitMediaEngine_w();
-  void DestructorDeletes_w();
-  void Terminate_w();
-  VoiceChannel* CreateVoiceChannel_w(
-      webrtc::Call* call,
-      const cricket::MediaConfig& media_config,
-      DtlsTransportInternal* rtp_dtls_transport,
-      DtlsTransportInternal* rtcp_dtls_transport,
-      rtc::PacketTransportInternal* rtp_packet_transport,
-      rtc::PacketTransportInternal* rtcp_packet_transport,
-      rtc::Thread* signaling_thread,
-      const std::string& content_name,
-      bool srtp_required,
-      const AudioOptions& options);
-  void DestroyVoiceChannel_w(VoiceChannel* voice_channel);
-  VideoChannel* CreateVideoChannel_w(
-      webrtc::Call* call,
-      const cricket::MediaConfig& media_config,
-      DtlsTransportInternal* rtp_dtls_transport,
-      DtlsTransportInternal* rtcp_dtls_transport,
-      rtc::PacketTransportInternal* rtp_packet_transport,
-      rtc::PacketTransportInternal* rtcp_packet_transport,
-      rtc::Thread* signaling_thread,
-      const std::string& content_name,
-      bool srtp_required,
-      const VideoOptions& options);
-  void DestroyVideoChannel_w(VideoChannel* video_channel);
-  RtpDataChannel* CreateRtpDataChannel_w(
-      const cricket::MediaConfig& media_config,
-      DtlsTransportInternal* rtp_transport,
-      DtlsTransportInternal* rtcp_transport,
-      rtc::Thread* signaling_thread,
-      const std::string& content_name,
-      bool srtp_required);
-  void DestroyRtpDataChannel_w(RtpDataChannel* data_channel);
-
-  std::unique_ptr<MediaEngineInterface> media_engine_;
-  std::unique_ptr<DataEngineInterface> data_media_engine_;
-  bool initialized_;
-  rtc::Thread* main_thread_;
-  rtc::Thread* worker_thread_;
-  rtc::Thread* network_thread_;
-
-  std::vector<std::unique_ptr<VoiceChannel>> voice_channels_;
-  std::vector<std::unique_ptr<VideoChannel>> video_channels_;
-  std::vector<std::unique_ptr<RtpDataChannel>> data_channels_;
-
-  bool enable_rtx_;
-  bool capturing_;
-};
-
-}  // namespace cricket
-
-#endif  // WEBRTC_PC_CHANNELMANAGER_H_
diff --git a/pc/channelmanager_unittest.cc b/pc/channelmanager_unittest.cc
deleted file mode 100644
index b322407..0000000
--- a/pc/channelmanager_unittest.cc
+++ /dev/null
@@ -1,188 +0,0 @@
-/*
- *  Copyright 2008 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 <memory>
-
-#include "webrtc/logging/rtc_event_log/rtc_event_log.h"
-#include "webrtc/media/base/fakemediaengine.h"
-#include "webrtc/media/base/fakevideocapturer.h"
-#include "webrtc/media/base/testutils.h"
-#include "webrtc/media/engine/fakewebrtccall.h"
-#include "webrtc/p2p/base/faketransportcontroller.h"
-#include "webrtc/pc/channelmanager.h"
-#include "webrtc/rtc_base/gunit.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/thread.h"
-
-namespace {
-const bool kDefaultSrtpRequired = true;
-}
-
-namespace cricket {
-
-static const AudioCodec kAudioCodecs[] = {
-    AudioCodec(97, "voice", 1, 2, 3), AudioCodec(111, "OPUS", 48000, 32000, 2),
-};
-
-static const VideoCodec kVideoCodecs[] = {
-    VideoCodec(99, "H264"), VideoCodec(100, "VP8"), VideoCodec(96, "rtx"),
-};
-
-class ChannelManagerTest : public testing::Test {
- protected:
-  ChannelManagerTest()
-      : network_(rtc::Thread::CreateWithSocketServer()),
-        worker_(rtc::Thread::Create()),
-        fme_(new cricket::FakeMediaEngine()),
-        fdme_(new cricket::FakeDataEngine()),
-        cm_(new cricket::ChannelManager(
-            std::unique_ptr<MediaEngineInterface>(fme_),
-            std::unique_ptr<DataEngineInterface>(fdme_),
-            rtc::Thread::Current())),
-        fake_call_(webrtc::Call::Config(&event_log_)),
-        transport_controller_(
-            new cricket::FakeTransportController(ICEROLE_CONTROLLING)) {
-    fme_->SetAudioCodecs(MAKE_VECTOR(kAudioCodecs));
-    fme_->SetVideoCodecs(MAKE_VECTOR(kVideoCodecs));
-  }
-
-  webrtc::RtcEventLogNullImpl event_log_;
-  std::unique_ptr<rtc::Thread> network_;
-  std::unique_ptr<rtc::Thread> worker_;
-  // |fme_| and |fdme_| are actually owned by |cm_|.
-  cricket::FakeMediaEngine* fme_;
-  cricket::FakeDataEngine* fdme_;
-  std::unique_ptr<cricket::ChannelManager> cm_;
-  cricket::FakeCall fake_call_;
-  std::unique_ptr<cricket::FakeTransportController> transport_controller_;
-};
-
-// Test that we startup/shutdown properly.
-TEST_F(ChannelManagerTest, StartupShutdown) {
-  EXPECT_FALSE(cm_->initialized());
-  EXPECT_EQ(rtc::Thread::Current(), cm_->worker_thread());
-  EXPECT_TRUE(cm_->Init());
-  EXPECT_TRUE(cm_->initialized());
-  cm_->Terminate();
-  EXPECT_FALSE(cm_->initialized());
-}
-
-// Test that we startup/shutdown properly with a worker thread.
-TEST_F(ChannelManagerTest, StartupShutdownOnThread) {
-  network_->Start();
-  worker_->Start();
-  EXPECT_FALSE(cm_->initialized());
-  EXPECT_EQ(rtc::Thread::Current(), cm_->worker_thread());
-  EXPECT_TRUE(cm_->set_network_thread(network_.get()));
-  EXPECT_EQ(network_.get(), cm_->network_thread());
-  EXPECT_TRUE(cm_->set_worker_thread(worker_.get()));
-  EXPECT_EQ(worker_.get(), cm_->worker_thread());
-  EXPECT_TRUE(cm_->Init());
-  EXPECT_TRUE(cm_->initialized());
-  // Setting the network or worker thread while initialized should fail.
-  EXPECT_FALSE(cm_->set_network_thread(rtc::Thread::Current()));
-  EXPECT_FALSE(cm_->set_worker_thread(rtc::Thread::Current()));
-  cm_->Terminate();
-  EXPECT_FALSE(cm_->initialized());
-}
-
-// Test that we can create and destroy a voice and video channel.
-TEST_F(ChannelManagerTest, CreateDestroyChannels) {
-  EXPECT_TRUE(cm_->Init());
-  cricket::DtlsTransportInternal* rtp_transport =
-      transport_controller_->CreateDtlsTransport(
-          cricket::CN_AUDIO, cricket::ICE_CANDIDATE_COMPONENT_RTP);
-  cricket::VoiceChannel* voice_channel = cm_->CreateVoiceChannel(
-      &fake_call_, cricket::MediaConfig(),
-      rtp_transport, nullptr /*rtcp_transport*/,
-      rtc::Thread::Current(), cricket::CN_AUDIO, kDefaultSrtpRequired,
-      AudioOptions());
-  EXPECT_TRUE(voice_channel != nullptr);
-  cricket::VideoChannel* video_channel = cm_->CreateVideoChannel(
-      &fake_call_, cricket::MediaConfig(),
-      rtp_transport, nullptr /*rtcp_transport*/,
-      rtc::Thread::Current(), cricket::CN_VIDEO, kDefaultSrtpRequired,
-      VideoOptions());
-  EXPECT_TRUE(video_channel != nullptr);
-  cricket::RtpDataChannel* rtp_data_channel = cm_->CreateRtpDataChannel(
-      cricket::MediaConfig(), rtp_transport, nullptr /*rtcp_transport*/,
-      rtc::Thread::Current(), cricket::CN_DATA, kDefaultSrtpRequired);
-  EXPECT_TRUE(rtp_data_channel != nullptr);
-  cm_->DestroyVideoChannel(video_channel);
-  cm_->DestroyVoiceChannel(voice_channel);
-  cm_->DestroyRtpDataChannel(rtp_data_channel);
-  cm_->Terminate();
-}
-
-// Test that we can create and destroy a voice and video channel with a worker.
-TEST_F(ChannelManagerTest, CreateDestroyChannelsOnThread) {
-  network_->Start();
-  worker_->Start();
-  EXPECT_TRUE(cm_->set_worker_thread(worker_.get()));
-  EXPECT_TRUE(cm_->set_network_thread(network_.get()));
-  EXPECT_TRUE(cm_->Init());
-  transport_controller_.reset(new cricket::FakeTransportController(
-      network_.get(), ICEROLE_CONTROLLING));
-  cricket::DtlsTransportInternal* rtp_transport =
-      transport_controller_->CreateDtlsTransport(
-          cricket::CN_AUDIO, cricket::ICE_CANDIDATE_COMPONENT_RTP);
-  cricket::VoiceChannel* voice_channel = cm_->CreateVoiceChannel(
-      &fake_call_, cricket::MediaConfig(),
-      rtp_transport, nullptr /*rtcp_transport*/,
-      rtc::Thread::Current(), cricket::CN_AUDIO, kDefaultSrtpRequired,
-      AudioOptions());
-  EXPECT_TRUE(voice_channel != nullptr);
-  cricket::VideoChannel* video_channel = cm_->CreateVideoChannel(
-      &fake_call_, cricket::MediaConfig(),
-      rtp_transport, nullptr /*rtcp_transport*/,
-      rtc::Thread::Current(), cricket::CN_VIDEO, kDefaultSrtpRequired,
-      VideoOptions());
-  EXPECT_TRUE(video_channel != nullptr);
-  cricket::RtpDataChannel* rtp_data_channel = cm_->CreateRtpDataChannel(
-      cricket::MediaConfig(), rtp_transport, nullptr /*rtcp_transport*/,
-      rtc::Thread::Current(), cricket::CN_DATA, kDefaultSrtpRequired);
-  EXPECT_TRUE(rtp_data_channel != nullptr);
-  cm_->DestroyVideoChannel(video_channel);
-  cm_->DestroyVoiceChannel(voice_channel);
-  cm_->DestroyRtpDataChannel(rtp_data_channel);
-  cm_->Terminate();
-}
-
-TEST_F(ChannelManagerTest, SetVideoRtxEnabled) {
-  std::vector<VideoCodec> codecs;
-  const VideoCodec rtx_codec(96, "rtx");
-
-  // By default RTX is disabled.
-  cm_->GetSupportedVideoCodecs(&codecs);
-  EXPECT_FALSE(ContainsMatchingCodec(codecs, rtx_codec));
-
-  // Enable and check.
-  EXPECT_TRUE(cm_->SetVideoRtxEnabled(true));
-  cm_->GetSupportedVideoCodecs(&codecs);
-  EXPECT_TRUE(ContainsMatchingCodec(codecs, rtx_codec));
-
-  // Disable and check.
-  EXPECT_TRUE(cm_->SetVideoRtxEnabled(false));
-  cm_->GetSupportedVideoCodecs(&codecs);
-  EXPECT_FALSE(ContainsMatchingCodec(codecs, rtx_codec));
-
-  // Cannot toggle rtx after initialization.
-  EXPECT_TRUE(cm_->Init());
-  EXPECT_FALSE(cm_->SetVideoRtxEnabled(true));
-  EXPECT_FALSE(cm_->SetVideoRtxEnabled(false));
-
-  // Can set again after terminate.
-  cm_->Terminate();
-  EXPECT_TRUE(cm_->SetVideoRtxEnabled(true));
-  cm_->GetSupportedVideoCodecs(&codecs);
-  EXPECT_TRUE(ContainsMatchingCodec(codecs, rtx_codec));
-}
-
-}  // namespace cricket
diff --git a/pc/createpeerconnectionfactory.cc b/pc/createpeerconnectionfactory.cc
deleted file mode 100644
index 11aa121..0000000
--- a/pc/createpeerconnectionfactory.cc
+++ /dev/null
@@ -1,136 +0,0 @@
-/*
- *  Copyright 2017 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/api/audio_codecs/builtin_audio_decoder_factory.h"
-#include "webrtc/api/audio_codecs/builtin_audio_encoder_factory.h"
-#include "webrtc/api/peerconnectioninterface.h"
-#include "webrtc/call/callfactoryinterface.h"
-#include "webrtc/logging/rtc_event_log/rtc_event_log_factory_interface.h"
-#include "webrtc/media/engine/webrtcmediaengine.h"
-#include "webrtc/modules/audio_processing/include/audio_processing.h"
-#include "webrtc/rtc_base/bind.h"
-#include "webrtc/rtc_base/scoped_ref_ptr.h"
-#include "webrtc/rtc_base/thread.h"
-
-namespace webrtc {
-
-rtc::scoped_refptr<PeerConnectionFactoryInterface> CreatePeerConnectionFactory(
-    rtc::scoped_refptr<AudioEncoderFactory> audio_encoder_factory,
-    rtc::scoped_refptr<AudioDecoderFactory> audio_decoder_factory) {
-  return CreatePeerConnectionFactoryWithAudioMixer(
-      nullptr /*network_thread*/, nullptr /*worker_thread*/,
-      nullptr /*signaling_thread*/, nullptr /*default_adm*/,
-      audio_encoder_factory, audio_decoder_factory,
-      nullptr /*video_encoder_factory*/, nullptr /*video_decoder_factory*/,
-      nullptr /*audio_mixer*/);
-}
-
-rtc::scoped_refptr<PeerConnectionFactoryInterface>
-CreatePeerConnectionFactory() {
-  return CreatePeerConnectionFactory(CreateBuiltinAudioEncoderFactory(),
-                                     CreateBuiltinAudioDecoderFactory());
-}
-
-// Note: all the other CreatePeerConnectionFactory variants just end up calling
-// this, ultimately.
-rtc::scoped_refptr<PeerConnectionFactoryInterface> CreatePeerConnectionFactory(
-    rtc::Thread* network_thread,
-    rtc::Thread* worker_thread,
-    rtc::Thread* signaling_thread,
-    AudioDeviceModule* default_adm,
-    rtc::scoped_refptr<AudioEncoderFactory> audio_encoder_factory,
-    rtc::scoped_refptr<AudioDecoderFactory> audio_decoder_factory,
-    cricket::WebRtcVideoEncoderFactory* video_encoder_factory,
-    cricket::WebRtcVideoDecoderFactory* video_decoder_factory,
-    rtc::scoped_refptr<AudioMixer> audio_mixer,
-    rtc::scoped_refptr<AudioProcessing> audio_processing) {
-  rtc::scoped_refptr<AudioProcessing> audio_processing_use = audio_processing;
-  if (!audio_processing_use) {
-    audio_processing_use = AudioProcessing::Create();
-  }
-
-  std::unique_ptr<cricket::MediaEngineInterface> media_engine(
-      cricket::WebRtcMediaEngineFactory::Create(
-          default_adm, audio_encoder_factory, audio_decoder_factory,
-          video_encoder_factory, video_decoder_factory, audio_mixer,
-          audio_processing_use));
-
-  std::unique_ptr<CallFactoryInterface> call_factory = CreateCallFactory();
-
-  std::unique_ptr<RtcEventLogFactoryInterface> event_log_factory =
-      CreateRtcEventLogFactory();
-
-  return CreateModularPeerConnectionFactory(
-      network_thread, worker_thread, signaling_thread, default_adm,
-      audio_encoder_factory, audio_decoder_factory, video_encoder_factory,
-      video_decoder_factory, audio_mixer, std::move(media_engine),
-      std::move(call_factory), std::move(event_log_factory));
-}
-
-rtc::scoped_refptr<PeerConnectionFactoryInterface>
-CreatePeerConnectionFactoryWithAudioMixer(
-    rtc::Thread* network_thread,
-    rtc::Thread* worker_thread,
-    rtc::Thread* signaling_thread,
-    AudioDeviceModule* default_adm,
-    rtc::scoped_refptr<AudioEncoderFactory> audio_encoder_factory,
-    rtc::scoped_refptr<AudioDecoderFactory> audio_decoder_factory,
-    cricket::WebRtcVideoEncoderFactory* video_encoder_factory,
-    cricket::WebRtcVideoDecoderFactory* video_decoder_factory,
-    rtc::scoped_refptr<AudioMixer> audio_mixer) {
-  return CreatePeerConnectionFactory(
-      network_thread, worker_thread, signaling_thread, default_adm,
-      audio_encoder_factory, audio_decoder_factory, video_encoder_factory,
-      video_decoder_factory, audio_mixer, nullptr);
-}
-
-rtc::scoped_refptr<PeerConnectionFactoryInterface>
-CreatePeerConnectionFactoryWithAudioMixer(
-    rtc::Thread* network_thread,
-    rtc::Thread* worker_thread,
-    rtc::Thread* signaling_thread,
-    AudioDeviceModule* default_adm,
-    cricket::WebRtcVideoEncoderFactory* encoder_factory,
-    cricket::WebRtcVideoDecoderFactory* decoder_factory,
-    rtc::scoped_refptr<AudioMixer> audio_mixer) {
-  return CreatePeerConnectionFactoryWithAudioMixer(
-      network_thread, worker_thread, signaling_thread, default_adm,
-      CreateBuiltinAudioEncoderFactory(), CreateBuiltinAudioDecoderFactory(),
-      encoder_factory, decoder_factory, audio_mixer);
-}
-
-rtc::scoped_refptr<PeerConnectionFactoryInterface> CreatePeerConnectionFactory(
-    rtc::Thread* network_thread,
-    rtc::Thread* worker_thread,
-    rtc::Thread* signaling_thread,
-    AudioDeviceModule* default_adm,
-    cricket::WebRtcVideoEncoderFactory* encoder_factory,
-    cricket::WebRtcVideoDecoderFactory* decoder_factory) {
-  return CreatePeerConnectionFactoryWithAudioMixer(
-      network_thread, worker_thread, signaling_thread, default_adm,
-      encoder_factory, decoder_factory, nullptr);
-}
-
-rtc::scoped_refptr<PeerConnectionFactoryInterface> CreatePeerConnectionFactory(
-    rtc::Thread* network_thread,
-    rtc::Thread* worker_thread,
-    rtc::Thread* signaling_thread,
-    AudioDeviceModule* default_adm,
-    rtc::scoped_refptr<AudioEncoderFactory> audio_encoder_factory,
-    rtc::scoped_refptr<AudioDecoderFactory> audio_decoder_factory,
-    cricket::WebRtcVideoEncoderFactory* video_encoder_factory,
-    cricket::WebRtcVideoDecoderFactory* video_decoder_factory) {
-  return CreatePeerConnectionFactoryWithAudioMixer(
-      network_thread, worker_thread, signaling_thread, default_adm,
-      audio_encoder_factory, audio_decoder_factory, video_encoder_factory,
-      video_decoder_factory, nullptr);
-}
-
-}  // namespace webrtc
diff --git a/pc/currentspeakermonitor.cc b/pc/currentspeakermonitor.cc
deleted file mode 100644
index d52e79d..0000000
--- a/pc/currentspeakermonitor.cc
+++ /dev/null
@@ -1,203 +0,0 @@
-/*
- *  Copyright 2011 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/pc/currentspeakermonitor.h"
-
-#include <vector>
-
-#include "webrtc/media/base/streamparams.h"
-#include "webrtc/pc/audiomonitor.h"
-#include "webrtc/rtc_base/logging.h"
-
-namespace cricket {
-
-namespace {
-const int kMaxAudioLevel = 9;
-// To avoid overswitching, we disable switching for a period of time after a
-// switch is done.
-const int kDefaultMinTimeBetweenSwitches = 1000;
-}
-
-CurrentSpeakerMonitor::CurrentSpeakerMonitor(
-    AudioSourceContext* audio_source_context)
-    : started_(false),
-      audio_source_context_(audio_source_context),
-      current_speaker_ssrc_(0),
-      earliest_permitted_switch_time_(0),
-      min_time_between_switches_(kDefaultMinTimeBetweenSwitches) {}
-
-CurrentSpeakerMonitor::~CurrentSpeakerMonitor() {
-  Stop();
-}
-
-void CurrentSpeakerMonitor::Start() {
-  if (!started_) {
-    audio_source_context_->SignalAudioMonitor.connect(
-        this, &CurrentSpeakerMonitor::OnAudioMonitor);
-    audio_source_context_->SignalMediaStreamsUpdate.connect(
-        this, &CurrentSpeakerMonitor::OnMediaStreamsUpdate);
-    audio_source_context_->SignalMediaStreamsReset.connect(
-        this, &CurrentSpeakerMonitor::OnMediaStreamsReset);
-
-    started_ = true;
-  }
-}
-
-void CurrentSpeakerMonitor::Stop() {
-  if (started_) {
-    audio_source_context_->SignalAudioMonitor.disconnect(this);
-    audio_source_context_->SignalMediaStreamsUpdate.disconnect(this);
-
-    started_ = false;
-    ssrc_to_speaking_state_map_.clear();
-    current_speaker_ssrc_ = 0;
-    earliest_permitted_switch_time_ = 0;
-  }
-}
-
-void CurrentSpeakerMonitor::set_min_time_between_switches(
-    int min_time_between_switches) {
-  min_time_between_switches_ = min_time_between_switches;
-}
-
-void CurrentSpeakerMonitor::OnAudioMonitor(
-    AudioSourceContext* audio_source_context, const AudioInfo& info) {
-  std::map<uint32_t, int> active_ssrc_to_level_map;
-  cricket::AudioInfo::StreamList::const_iterator stream_list_it;
-  for (stream_list_it = info.active_streams.begin();
-       stream_list_it != info.active_streams.end(); ++stream_list_it) {
-    uint32_t ssrc = stream_list_it->first;
-    active_ssrc_to_level_map[ssrc] = stream_list_it->second;
-
-    // It's possible we haven't yet added this source to our map.  If so,
-    // add it now with a "not speaking" state.
-    if (ssrc_to_speaking_state_map_.find(ssrc) ==
-        ssrc_to_speaking_state_map_.end()) {
-      ssrc_to_speaking_state_map_[ssrc] = SS_NOT_SPEAKING;
-    }
-  }
-
-  int max_level = 0;
-  uint32_t loudest_speaker_ssrc = 0;
-
-  // Update the speaking states of all participants based on the new audio
-  // level information.  Also retain loudest speaker.
-  std::map<uint32_t, SpeakingState>::iterator state_it;
-  for (state_it = ssrc_to_speaking_state_map_.begin();
-       state_it != ssrc_to_speaking_state_map_.end(); ++state_it) {
-    bool is_previous_speaker = current_speaker_ssrc_ == state_it->first;
-
-    // This uses a state machine in order to gradually identify
-    // members as having started or stopped speaking. Matches the
-    // algorithm used by the hangouts js code.
-
-    std::map<uint32_t, int>::const_iterator level_it =
-        active_ssrc_to_level_map.find(state_it->first);
-    // Note that the stream map only contains streams with non-zero audio
-    // levels.
-    int level = (level_it != active_ssrc_to_level_map.end()) ?
-        level_it->second : 0;
-    switch (state_it->second) {
-      case SS_NOT_SPEAKING:
-        if (level > 0) {
-          // Reset level because we don't think they're really speaking.
-          level = 0;
-          state_it->second = SS_MIGHT_BE_SPEAKING;
-        } else {
-          // State unchanged.
-        }
-        break;
-      case SS_MIGHT_BE_SPEAKING:
-        if (level > 0) {
-          state_it->second = SS_SPEAKING;
-        } else {
-          state_it->second = SS_NOT_SPEAKING;
-        }
-        break;
-      case SS_SPEAKING:
-        if (level > 0) {
-          // State unchanged.
-        } else {
-          state_it->second = SS_WAS_SPEAKING_RECENTLY1;
-          if (is_previous_speaker) {
-            // Assume this is an inter-word silence and assign him the highest
-            // volume.
-            level = kMaxAudioLevel;
-          }
-        }
-        break;
-      case SS_WAS_SPEAKING_RECENTLY1:
-        if (level > 0) {
-          state_it->second = SS_SPEAKING;
-        } else {
-          state_it->second = SS_WAS_SPEAKING_RECENTLY2;
-          if (is_previous_speaker) {
-            // Assume this is an inter-word silence and assign him the highest
-            // volume.
-            level = kMaxAudioLevel;
-          }
-        }
-        break;
-      case SS_WAS_SPEAKING_RECENTLY2:
-        if (level > 0) {
-          state_it->second = SS_SPEAKING;
-        } else {
-          state_it->second = SS_NOT_SPEAKING;
-        }
-        break;
-    }
-
-    if (level > max_level) {
-      loudest_speaker_ssrc = state_it->first;
-      max_level = level;
-    } else if (level > 0 && level == max_level && is_previous_speaker) {
-      // Favor continuity of loudest speakers if audio levels are equal.
-      loudest_speaker_ssrc = state_it->first;
-    }
-  }
-
-  // We avoid over-switching by disabling switching for a period of time after
-  // a switch is done.
-  int64_t now = rtc::TimeMillis();
-  if (earliest_permitted_switch_time_ <= now &&
-      current_speaker_ssrc_ != loudest_speaker_ssrc) {
-    current_speaker_ssrc_ = loudest_speaker_ssrc;
-    LOG(LS_INFO) << "Current speaker changed to " << current_speaker_ssrc_;
-    earliest_permitted_switch_time_ = now + min_time_between_switches_;
-    SignalUpdate(this, current_speaker_ssrc_);
-  }
-}
-
-void CurrentSpeakerMonitor::OnMediaStreamsUpdate(
-    AudioSourceContext* audio_source_context,
-    const MediaStreams& added,
-    const MediaStreams& removed) {
-  if (audio_source_context == audio_source_context_) {
-    // Update the speaking state map based on added and removed streams.
-    for (std::vector<cricket::StreamParams>::const_iterator
-           it = removed.audio().begin(); it != removed.audio().end(); ++it) {
-      ssrc_to_speaking_state_map_.erase(it->first_ssrc());
-    }
-
-    for (std::vector<cricket::StreamParams>::const_iterator
-           it = added.audio().begin(); it != added.audio().end(); ++it) {
-      ssrc_to_speaking_state_map_[it->first_ssrc()] = SS_NOT_SPEAKING;
-    }
-  }
-}
-
-void CurrentSpeakerMonitor::OnMediaStreamsReset(
-    AudioSourceContext* audio_source_context) {
-  if (audio_source_context == audio_source_context_) {
-    ssrc_to_speaking_state_map_.clear();
-  }
-}
-
-}  // namespace cricket
diff --git a/pc/currentspeakermonitor.h b/pc/currentspeakermonitor.h
deleted file mode 100644
index 001035f..0000000
--- a/pc/currentspeakermonitor.h
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- *  Copyright 2011 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.
- */
-
-// CurrentSpeakerMonitor monitors the audio levels for a session and determines
-// which participant is currently speaking.
-
-#ifndef WEBRTC_PC_CURRENTSPEAKERMONITOR_H_
-#define WEBRTC_PC_CURRENTSPEAKERMONITOR_H_
-
-#include <stdint.h>
-
-#include <map>
-
-#include "webrtc/rtc_base/sigslot.h"
-
-namespace cricket {
-
-struct AudioInfo;
-struct MediaStreams;
-
-class AudioSourceContext {
- public:
-  sigslot::signal2<AudioSourceContext*, const cricket::AudioInfo&>
-      SignalAudioMonitor;
-  sigslot::signal1<AudioSourceContext*> SignalMediaStreamsReset;
-  sigslot::signal3<AudioSourceContext*,
-                   const cricket::MediaStreams&,
-                   const cricket::MediaStreams&> SignalMediaStreamsUpdate;
-};
-
-// CurrentSpeakerMonitor can be used to monitor the audio-levels from
-// many audio-sources and report on changes in the loudest audio-source.
-// Its a generic type and relies on an AudioSourceContext which is aware of
-// the audio-sources. AudioSourceContext needs to provide two signals namely
-// SignalAudioInfoMonitor - provides audio info of the all current speakers.
-// SignalMediaSourcesUpdated - provides updates when a speaker leaves or joins.
-// Note that the AudioSourceContext's audio monitor must be started
-// before this is started.
-// It's recommended that the audio monitor be started with a 100 ms period.
-class CurrentSpeakerMonitor : public sigslot::has_slots<> {
- public:
-  explicit CurrentSpeakerMonitor(AudioSourceContext* audio_source_context);
-  ~CurrentSpeakerMonitor();
-
-  void Start();
-  void Stop();
-
-  // Used by tests.  Note that the actual minimum time between switches
-  // enforced by the monitor will be the given value plus or minus the
-  // resolution of the system clock.
-  void set_min_time_between_switches(int min_time_between_switches);
-
-  // This is fired when the current speaker changes, and provides his audio
-  // SSRC.  This only fires after the audio monitor on the underlying
-  // AudioSourceContext has been started.
-  sigslot::signal2<CurrentSpeakerMonitor*, uint32_t> SignalUpdate;
-
- private:
-  void OnAudioMonitor(AudioSourceContext* audio_source_context,
-                      const AudioInfo& info);
-  void OnMediaStreamsUpdate(AudioSourceContext* audio_source_context,
-                            const MediaStreams& added,
-                            const MediaStreams& removed);
-  void OnMediaStreamsReset(AudioSourceContext* audio_source_context);
-
-  // These are states that a participant will pass through so that we gradually
-  // recognize that they have started and stopped speaking.  This avoids
-  // "twitchiness".
-  enum SpeakingState {
-    SS_NOT_SPEAKING,
-    SS_MIGHT_BE_SPEAKING,
-    SS_SPEAKING,
-    SS_WAS_SPEAKING_RECENTLY1,
-    SS_WAS_SPEAKING_RECENTLY2
-  };
-
-  bool started_;
-  AudioSourceContext* audio_source_context_;
-  std::map<uint32_t, SpeakingState> ssrc_to_speaking_state_map_;
-  uint32_t current_speaker_ssrc_;
-  // To prevent overswitching, switching is disabled for some time after a
-  // switch is made.  This gives us the earliest time a switch is permitted.
-  int64_t earliest_permitted_switch_time_;
-  int min_time_between_switches_;
-};
-
-}  // namespace cricket
-
-#endif  // WEBRTC_PC_CURRENTSPEAKERMONITOR_H_
diff --git a/pc/currentspeakermonitor_unittest.cc b/pc/currentspeakermonitor_unittest.cc
deleted file mode 100644
index 547b5a2..0000000
--- a/pc/currentspeakermonitor_unittest.cc
+++ /dev/null
@@ -1,215 +0,0 @@
-/*
- *  Copyright 2004 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/pc/currentspeakermonitor.h"
-#include "webrtc/pc/audiomonitor.h"
-#include "webrtc/rtc_base/gunit.h"
-#include "webrtc/rtc_base/thread.h"
-
-namespace cricket {
-
-static const uint32_t kSsrc1 = 1001;
-static const uint32_t kSsrc2 = 1002;
-static const uint32_t kMinTimeBetweenSwitches = 10;
-// Due to limited system clock resolution, the CurrentSpeakerMonitor may
-// actually require more or less time between switches than that specified
-// in the call to set_min_time_between_switches.  To be safe, we sleep for
-// 90 ms more than the min time between switches before checking for a switch.
-// I am assuming system clocks do not have a coarser resolution than 90 ms.
-static const uint32_t kSleepTimeBetweenSwitches = 100;
-
-class CurrentSpeakerMonitorTest : public testing::Test,
-    public sigslot::has_slots<> {
- public:
-  CurrentSpeakerMonitorTest() {
-    monitor_ = new CurrentSpeakerMonitor(&source_);
-    // Shrink the minimum time betweeen switches to 10 ms so we don't have to
-    // slow down our tests.
-    monitor_->set_min_time_between_switches(kMinTimeBetweenSwitches);
-    monitor_->SignalUpdate.connect(this, &CurrentSpeakerMonitorTest::OnUpdate);
-    current_speaker_ = 0;
-    num_changes_ = 0;
-    monitor_->Start();
-  }
-
-  ~CurrentSpeakerMonitorTest() {
-    delete monitor_;
-  }
-
-  void SignalAudioMonitor(const AudioInfo& info) {
-    source_.SignalAudioMonitor(&source_, info);
-  }
-
- protected:
-  AudioSourceContext source_;
-  CurrentSpeakerMonitor* monitor_;
-  int num_changes_;
-  uint32_t current_speaker_;
-
-  void OnUpdate(CurrentSpeakerMonitor* monitor, uint32_t current_speaker) {
-    current_speaker_ = current_speaker;
-    num_changes_++;
-  }
-};
-
-static void InitAudioInfo(AudioInfo* info, int input_level, int output_level) {
-  info->input_level = input_level;
-  info->output_level = output_level;
-}
-
-TEST_F(CurrentSpeakerMonitorTest, NoActiveStreams) {
-  AudioInfo info;
-  InitAudioInfo(&info, 0, 0);
-  SignalAudioMonitor(info);
-
-  EXPECT_EQ(current_speaker_, 0U);
-  EXPECT_EQ(num_changes_, 0);
-}
-
-TEST_F(CurrentSpeakerMonitorTest, MultipleActiveStreams) {
-  AudioInfo info;
-  InitAudioInfo(&info, 0, 0);
-
-  info.active_streams.push_back(std::make_pair(kSsrc1, 3));
-  info.active_streams.push_back(std::make_pair(kSsrc2, 7));
-  SignalAudioMonitor(info);
-
-  // No speaker recognized because the initial sample is treated as possibly
-  // just noise and disregarded.
-  EXPECT_EQ(current_speaker_, 0U);
-  EXPECT_EQ(num_changes_, 0);
-
-  info.active_streams.push_back(std::make_pair(kSsrc1, 3));
-  info.active_streams.push_back(std::make_pair(kSsrc2, 7));
-  SignalAudioMonitor(info);
-
-  EXPECT_EQ(current_speaker_, kSsrc2);
-  EXPECT_EQ(num_changes_, 1);
-}
-
-// See: https://code.google.com/p/webrtc/issues/detail?id=2409
-TEST_F(CurrentSpeakerMonitorTest, DISABLED_RapidSpeakerChange) {
-  AudioInfo info;
-  InitAudioInfo(&info, 0, 0);
-
-  info.active_streams.push_back(std::make_pair(kSsrc1, 3));
-  info.active_streams.push_back(std::make_pair(kSsrc2, 7));
-  SignalAudioMonitor(info);
-
-  EXPECT_EQ(current_speaker_, 0U);
-  EXPECT_EQ(num_changes_, 0);
-
-  info.active_streams.push_back(std::make_pair(kSsrc1, 3));
-  info.active_streams.push_back(std::make_pair(kSsrc2, 7));
-  SignalAudioMonitor(info);
-
-  EXPECT_EQ(current_speaker_, kSsrc2);
-  EXPECT_EQ(num_changes_, 1);
-
-  info.active_streams.push_back(std::make_pair(kSsrc1, 9));
-  info.active_streams.push_back(std::make_pair(kSsrc2, 1));
-  SignalAudioMonitor(info);
-
-  // We expect no speaker change because of the rapid change.
-  EXPECT_EQ(current_speaker_, kSsrc2);
-  EXPECT_EQ(num_changes_, 1);
-}
-
-// Flaky on iOS: webrtc:7057.
-#if defined(WEBRTC_IOS)
-#define MAYBE_SpeakerChange DISABLED_SpeakerChange
-#else
-#define MAYBE_SpeakerChange SpeakerChange
-#endif
-TEST_F(CurrentSpeakerMonitorTest, MAYBE_SpeakerChange) {
-  AudioInfo info;
-  InitAudioInfo(&info, 0, 0);
-
-  info.active_streams.push_back(std::make_pair(kSsrc1, 3));
-  info.active_streams.push_back(std::make_pair(kSsrc2, 7));
-  SignalAudioMonitor(info);
-
-  EXPECT_EQ(current_speaker_, 0U);
-  EXPECT_EQ(num_changes_, 0);
-
-  info.active_streams.push_back(std::make_pair(kSsrc1, 3));
-  info.active_streams.push_back(std::make_pair(kSsrc2, 7));
-  SignalAudioMonitor(info);
-
-  EXPECT_EQ(current_speaker_, kSsrc2);
-  EXPECT_EQ(num_changes_, 1);
-
-  // Wait so the changes don't come so rapidly.
-  rtc::Thread::SleepMs(kSleepTimeBetweenSwitches);
-
-  info.active_streams.push_back(std::make_pair(kSsrc1, 9));
-  info.active_streams.push_back(std::make_pair(kSsrc2, 1));
-  SignalAudioMonitor(info);
-
-  EXPECT_EQ(current_speaker_, kSsrc1);
-  EXPECT_EQ(num_changes_, 2);
-}
-
-TEST_F(CurrentSpeakerMonitorTest, InterwordSilence) {
-  AudioInfo info;
-  InitAudioInfo(&info, 0, 0);
-
-  info.active_streams.push_back(std::make_pair(kSsrc1, 3));
-  info.active_streams.push_back(std::make_pair(kSsrc2, 7));
-  SignalAudioMonitor(info);
-
-  EXPECT_EQ(current_speaker_, 0U);
-  EXPECT_EQ(num_changes_, 0);
-
-  info.active_streams.push_back(std::make_pair(kSsrc1, 3));
-  info.active_streams.push_back(std::make_pair(kSsrc2, 7));
-  SignalAudioMonitor(info);
-
-  EXPECT_EQ(current_speaker_, kSsrc2);
-  EXPECT_EQ(num_changes_, 1);
-
-  info.active_streams.push_back(std::make_pair(kSsrc1, 3));
-  info.active_streams.push_back(std::make_pair(kSsrc2, 7));
-  SignalAudioMonitor(info);
-
-  EXPECT_EQ(current_speaker_, kSsrc2);
-  EXPECT_EQ(num_changes_, 1);
-
-  // Wait so the changes don't come so rapidly.
-  rtc::Thread::SleepMs(kSleepTimeBetweenSwitches);
-
-  info.active_streams.push_back(std::make_pair(kSsrc1, 3));
-  info.active_streams.push_back(std::make_pair(kSsrc2, 0));
-  SignalAudioMonitor(info);
-
-  // Current speaker shouldn't have changed because we treat this as an inter-
-  // word silence.
-  EXPECT_EQ(current_speaker_, kSsrc2);
-  EXPECT_EQ(num_changes_, 1);
-
-  info.active_streams.push_back(std::make_pair(kSsrc1, 3));
-  info.active_streams.push_back(std::make_pair(kSsrc2, 0));
-  SignalAudioMonitor(info);
-
-  // Current speaker shouldn't have changed because we treat this as an inter-
-  // word silence.
-  EXPECT_EQ(current_speaker_, kSsrc2);
-  EXPECT_EQ(num_changes_, 1);
-
-  info.active_streams.push_back(std::make_pair(kSsrc1, 3));
-  info.active_streams.push_back(std::make_pair(kSsrc2, 0));
-  SignalAudioMonitor(info);
-
-  // At this point, we should have concluded that SSRC2 stopped speaking.
-  EXPECT_EQ(current_speaker_, kSsrc1);
-  EXPECT_EQ(num_changes_, 2);
-}
-
-}  // namespace cricket
diff --git a/pc/datachannel.cc b/pc/datachannel.cc
deleted file mode 100644
index 28c090d..0000000
--- a/pc/datachannel.cc
+++ /dev/null
@@ -1,655 +0,0 @@
-/*
- *  Copyright 2012 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/pc/datachannel.h"
-
-#include <memory>
-#include <string>
-
-#include "webrtc/media/sctp/sctptransportinternal.h"
-#include "webrtc/pc/sctputils.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/refcount.h"
-
-namespace webrtc {
-
-static size_t kMaxQueuedReceivedDataBytes = 16 * 1024 * 1024;
-static size_t kMaxQueuedSendDataBytes = 16 * 1024 * 1024;
-
-enum {
-  MSG_CHANNELREADY,
-};
-
-bool SctpSidAllocator::AllocateSid(rtc::SSLRole role, int* sid) {
-  int potential_sid = (role == rtc::SSL_CLIENT) ? 0 : 1;
-  while (!IsSidAvailable(potential_sid)) {
-    potential_sid += 2;
-    if (potential_sid > static_cast<int>(cricket::kMaxSctpSid)) {
-      return false;
-    }
-  }
-
-  *sid = potential_sid;
-  used_sids_.insert(potential_sid);
-  return true;
-}
-
-bool SctpSidAllocator::ReserveSid(int sid) {
-  if (!IsSidAvailable(sid)) {
-    return false;
-  }
-  used_sids_.insert(sid);
-  return true;
-}
-
-void SctpSidAllocator::ReleaseSid(int sid) {
-  auto it = used_sids_.find(sid);
-  if (it != used_sids_.end()) {
-    used_sids_.erase(it);
-  }
-}
-
-bool SctpSidAllocator::IsSidAvailable(int sid) const {
-  if (sid < static_cast<int>(cricket::kMinSctpSid) ||
-      sid > static_cast<int>(cricket::kMaxSctpSid)) {
-    return false;
-  }
-  return used_sids_.find(sid) == used_sids_.end();
-}
-
-DataChannel::PacketQueue::PacketQueue() : byte_count_(0) {}
-
-DataChannel::PacketQueue::~PacketQueue() {
-  Clear();
-}
-
-bool DataChannel::PacketQueue::Empty() const {
-  return packets_.empty();
-}
-
-DataBuffer* DataChannel::PacketQueue::Front() {
-  return packets_.front();
-}
-
-void DataChannel::PacketQueue::Pop() {
-  if (packets_.empty()) {
-    return;
-  }
-
-  byte_count_ -= packets_.front()->size();
-  packets_.pop_front();
-}
-
-void DataChannel::PacketQueue::Push(DataBuffer* packet) {
-  byte_count_ += packet->size();
-  packets_.push_back(packet);
-}
-
-void DataChannel::PacketQueue::Clear() {
-  while (!packets_.empty()) {
-    delete packets_.front();
-    packets_.pop_front();
-  }
-  byte_count_ = 0;
-}
-
-void DataChannel::PacketQueue::Swap(PacketQueue* other) {
-  size_t other_byte_count = other->byte_count_;
-  other->byte_count_ = byte_count_;
-  byte_count_ = other_byte_count;
-
-  other->packets_.swap(packets_);
-}
-
-rtc::scoped_refptr<DataChannel> DataChannel::Create(
-    DataChannelProviderInterface* provider,
-    cricket::DataChannelType dct,
-    const std::string& label,
-    const InternalDataChannelInit& config) {
-  rtc::scoped_refptr<DataChannel> channel(
-      new rtc::RefCountedObject<DataChannel>(provider, dct, label));
-  if (!channel->Init(config)) {
-    return NULL;
-  }
-  return channel;
-}
-
-DataChannel::DataChannel(
-    DataChannelProviderInterface* provider,
-    cricket::DataChannelType dct,
-    const std::string& label)
-    : label_(label),
-      observer_(nullptr),
-      state_(kConnecting),
-      messages_sent_(0),
-      bytes_sent_(0),
-      messages_received_(0),
-      bytes_received_(0),
-      data_channel_type_(dct),
-      provider_(provider),
-      handshake_state_(kHandshakeInit),
-      connected_to_provider_(false),
-      send_ssrc_set_(false),
-      receive_ssrc_set_(false),
-      writable_(false),
-      send_ssrc_(0),
-      receive_ssrc_(0) {
-}
-
-bool DataChannel::Init(const InternalDataChannelInit& config) {
-  if (data_channel_type_ == cricket::DCT_RTP) {
-    if (config.reliable ||
-        config.id != -1 ||
-        config.maxRetransmits != -1 ||
-        config.maxRetransmitTime != -1) {
-      LOG(LS_ERROR) << "Failed to initialize the RTP data channel due to "
-                    << "invalid DataChannelInit.";
-      return false;
-    }
-    handshake_state_ = kHandshakeReady;
-  } else if (data_channel_type_ == cricket::DCT_SCTP) {
-    if (config.id < -1 ||
-        config.maxRetransmits < -1 ||
-        config.maxRetransmitTime < -1) {
-      LOG(LS_ERROR) << "Failed to initialize the SCTP data channel due to "
-                    << "invalid DataChannelInit.";
-      return false;
-    }
-    if (config.maxRetransmits != -1 && config.maxRetransmitTime != -1) {
-      LOG(LS_ERROR) <<
-          "maxRetransmits and maxRetransmitTime should not be both set.";
-      return false;
-    }
-    config_ = config;
-
-    switch (config_.open_handshake_role) {
-    case webrtc::InternalDataChannelInit::kNone:  // pre-negotiated
-      handshake_state_ = kHandshakeReady;
-      break;
-    case webrtc::InternalDataChannelInit::kOpener:
-      handshake_state_ = kHandshakeShouldSendOpen;
-      break;
-    case webrtc::InternalDataChannelInit::kAcker:
-      handshake_state_ = kHandshakeShouldSendAck;
-      break;
-    };
-
-    // Try to connect to the transport in case the transport channel already
-    // exists.
-    OnTransportChannelCreated();
-
-    // Checks if the transport is ready to send because the initial channel
-    // ready signal may have been sent before the DataChannel creation.
-    // This has to be done async because the upper layer objects (e.g.
-    // Chrome glue and WebKit) are not wired up properly until after this
-    // function returns.
-    if (provider_->ReadyToSendData()) {
-      rtc::Thread::Current()->Post(RTC_FROM_HERE, this, MSG_CHANNELREADY, NULL);
-    }
-  }
-
-  return true;
-}
-
-DataChannel::~DataChannel() {}
-
-void DataChannel::RegisterObserver(DataChannelObserver* observer) {
-  observer_ = observer;
-  DeliverQueuedReceivedData();
-}
-
-void DataChannel::UnregisterObserver() {
-  observer_ = NULL;
-}
-
-bool DataChannel::reliable() const {
-  if (data_channel_type_ == cricket::DCT_RTP) {
-    return false;
-  } else {
-    return config_.maxRetransmits == -1 &&
-           config_.maxRetransmitTime == -1;
-  }
-}
-
-uint64_t DataChannel::buffered_amount() const {
-  return queued_send_data_.byte_count();
-}
-
-void DataChannel::Close() {
-  if (state_ == kClosed)
-    return;
-  send_ssrc_ = 0;
-  send_ssrc_set_ = false;
-  SetState(kClosing);
-  UpdateState();
-}
-
-bool DataChannel::Send(const DataBuffer& buffer) {
-  if (state_ != kOpen) {
-    return false;
-  }
-
-  // TODO(jiayl): the spec is unclear about if the remote side should get the
-  // onmessage event. We need to figure out the expected behavior and change the
-  // code accordingly.
-  if (buffer.size() == 0) {
-    return true;
-  }
-
-  // If the queue is non-empty, we're waiting for SignalReadyToSend,
-  // so just add to the end of the queue and keep waiting.
-  if (!queued_send_data_.Empty()) {
-    // Only SCTP DataChannel queues the outgoing data when the transport is
-    // blocked.
-    RTC_DCHECK(data_channel_type_ == cricket::DCT_SCTP);
-    if (!QueueSendDataMessage(buffer)) {
-      Close();
-    }
-    return true;
-  }
-
-  bool success = SendDataMessage(buffer, true);
-  if (data_channel_type_ == cricket::DCT_RTP) {
-    return success;
-  }
-
-  // Always return true for SCTP DataChannel per the spec.
-  return true;
-}
-
-void DataChannel::SetReceiveSsrc(uint32_t receive_ssrc) {
-  RTC_DCHECK(data_channel_type_ == cricket::DCT_RTP);
-
-  if (receive_ssrc_set_) {
-    return;
-  }
-  receive_ssrc_ = receive_ssrc;
-  receive_ssrc_set_ = true;
-  UpdateState();
-}
-
-// The remote peer request that this channel shall be closed.
-void DataChannel::RemotePeerRequestClose() {
-  DoClose();
-}
-
-void DataChannel::SetSctpSid(int sid) {
-  RTC_DCHECK_LT(config_.id, 0);
-  RTC_DCHECK_GE(sid, 0);
-  RTC_DCHECK_EQ(data_channel_type_, cricket::DCT_SCTP);
-  if (config_.id == sid) {
-    return;
-  }
-
-  config_.id = sid;
-  provider_->AddSctpDataStream(sid);
-}
-
-void DataChannel::OnTransportChannelCreated() {
-  RTC_DCHECK(data_channel_type_ == cricket::DCT_SCTP);
-  if (!connected_to_provider_) {
-    connected_to_provider_ = provider_->ConnectDataChannel(this);
-  }
-  // The sid may have been unassigned when provider_->ConnectDataChannel was
-  // done. So always add the streams even if connected_to_provider_ is true.
-  if (config_.id >= 0) {
-    provider_->AddSctpDataStream(config_.id);
-  }
-}
-
-void DataChannel::OnTransportChannelDestroyed() {
-  // This method needs to synchronously close the data channel, which means any
-  // queued data needs to be discarded.
-  queued_send_data_.Clear();
-  queued_control_data_.Clear();
-  DoClose();
-}
-
-void DataChannel::SetSendSsrc(uint32_t send_ssrc) {
-  RTC_DCHECK(data_channel_type_ == cricket::DCT_RTP);
-  if (send_ssrc_set_) {
-    return;
-  }
-  send_ssrc_ = send_ssrc;
-  send_ssrc_set_ = true;
-  UpdateState();
-}
-
-void DataChannel::OnMessage(rtc::Message* msg) {
-  switch (msg->message_id) {
-    case MSG_CHANNELREADY:
-      OnChannelReady(true);
-      break;
-  }
-}
-
-void DataChannel::OnDataReceived(const cricket::ReceiveDataParams& params,
-                                 const rtc::CopyOnWriteBuffer& payload) {
-  if (data_channel_type_ == cricket::DCT_RTP && params.ssrc != receive_ssrc_) {
-    return;
-  }
-  if (data_channel_type_ == cricket::DCT_SCTP && params.sid != config_.id) {
-    return;
-  }
-
-  if (params.type == cricket::DMT_CONTROL) {
-    RTC_DCHECK(data_channel_type_ == cricket::DCT_SCTP);
-    if (handshake_state_ != kHandshakeWaitingForAck) {
-      // Ignore it if we are not expecting an ACK message.
-      LOG(LS_WARNING) << "DataChannel received unexpected CONTROL message, "
-                      << "sid = " << params.sid;
-      return;
-    }
-    if (ParseDataChannelOpenAckMessage(payload)) {
-      // We can send unordered as soon as we receive the ACK message.
-      handshake_state_ = kHandshakeReady;
-      LOG(LS_INFO) << "DataChannel received OPEN_ACK message, sid = "
-                   << params.sid;
-    } else {
-      LOG(LS_WARNING) << "DataChannel failed to parse OPEN_ACK message, sid = "
-                      << params.sid;
-    }
-    return;
-  }
-
-  RTC_DCHECK(params.type == cricket::DMT_BINARY ||
-             params.type == cricket::DMT_TEXT);
-
-  LOG(LS_VERBOSE) << "DataChannel received DATA message, sid = " << params.sid;
-  // We can send unordered as soon as we receive any DATA message since the
-  // remote side must have received the OPEN (and old clients do not send
-  // OPEN_ACK).
-  if (handshake_state_ == kHandshakeWaitingForAck) {
-    handshake_state_ = kHandshakeReady;
-  }
-
-  bool binary = (params.type == cricket::DMT_BINARY);
-  std::unique_ptr<DataBuffer> buffer(new DataBuffer(payload, binary));
-  if (state_ == kOpen && observer_) {
-    ++messages_received_;
-    bytes_received_ += buffer->size();
-    observer_->OnMessage(*buffer.get());
-  } else {
-    if (queued_received_data_.byte_count() + payload.size() >
-        kMaxQueuedReceivedDataBytes) {
-      LOG(LS_ERROR) << "Queued received data exceeds the max buffer size.";
-
-      queued_received_data_.Clear();
-      if (data_channel_type_ != cricket::DCT_RTP) {
-        Close();
-      }
-
-      return;
-    }
-    queued_received_data_.Push(buffer.release());
-  }
-}
-
-void DataChannel::OnStreamClosedRemotely(int sid) {
-  if (data_channel_type_ == cricket::DCT_SCTP && sid == config_.id) {
-    Close();
-  }
-}
-
-void DataChannel::OnChannelReady(bool writable) {
-  writable_ = writable;
-  if (!writable) {
-    return;
-  }
-
-  SendQueuedControlMessages();
-  SendQueuedDataMessages();
-  UpdateState();
-}
-
-void DataChannel::DoClose() {
-  if (state_ == kClosed)
-    return;
-
-  receive_ssrc_set_ = false;
-  send_ssrc_set_ = false;
-  SetState(kClosing);
-  UpdateState();
-}
-
-void DataChannel::UpdateState() {
-  // UpdateState determines what to do from a few state variables.  Include
-  // all conditions required for each state transition here for
-  // clarity. OnChannelReady(true) will send any queued data and then invoke
-  // UpdateState().
-  switch (state_) {
-    case kConnecting: {
-      if (send_ssrc_set_ == receive_ssrc_set_) {
-        if (data_channel_type_ == cricket::DCT_RTP && !connected_to_provider_) {
-          connected_to_provider_ = provider_->ConnectDataChannel(this);
-        }
-        if (connected_to_provider_) {
-          if (handshake_state_ == kHandshakeShouldSendOpen) {
-            rtc::CopyOnWriteBuffer payload;
-            WriteDataChannelOpenMessage(label_, config_, &payload);
-            SendControlMessage(payload);
-          } else if (handshake_state_ == kHandshakeShouldSendAck) {
-            rtc::CopyOnWriteBuffer payload;
-            WriteDataChannelOpenAckMessage(&payload);
-            SendControlMessage(payload);
-          }
-          if (writable_ &&
-              (handshake_state_ == kHandshakeReady ||
-               handshake_state_ == kHandshakeWaitingForAck)) {
-            SetState(kOpen);
-            // If we have received buffers before the channel got writable.
-            // Deliver them now.
-            DeliverQueuedReceivedData();
-          }
-        }
-      }
-      break;
-    }
-    case kOpen: {
-      break;
-    }
-    case kClosing: {
-      if (queued_send_data_.Empty() && queued_control_data_.Empty()) {
-        if (connected_to_provider_) {
-          DisconnectFromProvider();
-        }
-
-        if (!connected_to_provider_ && !send_ssrc_set_ && !receive_ssrc_set_) {
-          SetState(kClosed);
-        }
-      }
-      break;
-    }
-    case kClosed:
-      break;
-  }
-}
-
-void DataChannel::SetState(DataState state) {
-  if (state_ == state) {
-    return;
-  }
-
-  state_ = state;
-  if (observer_) {
-    observer_->OnStateChange();
-  }
-  if (state_ == kOpen) {
-    SignalOpened(this);
-  } else if (state_ == kClosed) {
-    SignalClosed(this);
-  }
-}
-
-void DataChannel::DisconnectFromProvider() {
-  if (!connected_to_provider_)
-    return;
-
-  provider_->DisconnectDataChannel(this);
-  connected_to_provider_ = false;
-
-  if (data_channel_type_ == cricket::DCT_SCTP && config_.id >= 0) {
-    provider_->RemoveSctpDataStream(config_.id);
-  }
-}
-
-void DataChannel::DeliverQueuedReceivedData() {
-  if (!observer_) {
-    return;
-  }
-
-  while (!queued_received_data_.Empty()) {
-    std::unique_ptr<DataBuffer> buffer(queued_received_data_.Front());
-    ++messages_received_;
-    bytes_received_ += buffer->size();
-    observer_->OnMessage(*buffer);
-    queued_received_data_.Pop();
-  }
-}
-
-void DataChannel::SendQueuedDataMessages() {
-  if (queued_send_data_.Empty()) {
-    return;
-  }
-
-  RTC_DCHECK(state_ == kOpen || state_ == kClosing);
-
-  uint64_t start_buffered_amount = buffered_amount();
-  while (!queued_send_data_.Empty()) {
-    DataBuffer* buffer = queued_send_data_.Front();
-    if (!SendDataMessage(*buffer, false)) {
-      // Leave the message in the queue if sending is aborted.
-      break;
-    }
-    queued_send_data_.Pop();
-    delete buffer;
-  }
-
-  if (observer_ && buffered_amount() < start_buffered_amount) {
-    observer_->OnBufferedAmountChange(start_buffered_amount);
-  }
-}
-
-bool DataChannel::SendDataMessage(const DataBuffer& buffer,
-                                  bool queue_if_blocked) {
-  cricket::SendDataParams send_params;
-
-  if (data_channel_type_ == cricket::DCT_SCTP) {
-    send_params.ordered = config_.ordered;
-    // Send as ordered if it is still going through OPEN/ACK signaling.
-    if (handshake_state_ != kHandshakeReady && !config_.ordered) {
-      send_params.ordered = true;
-      LOG(LS_VERBOSE) << "Sending data as ordered for unordered DataChannel "
-                      << "because the OPEN_ACK message has not been received.";
-    }
-
-    send_params.max_rtx_count = config_.maxRetransmits;
-    send_params.max_rtx_ms = config_.maxRetransmitTime;
-    send_params.sid = config_.id;
-  } else {
-    send_params.ssrc = send_ssrc_;
-  }
-  send_params.type = buffer.binary ? cricket::DMT_BINARY : cricket::DMT_TEXT;
-
-  cricket::SendDataResult send_result = cricket::SDR_SUCCESS;
-  bool success = provider_->SendData(send_params, buffer.data, &send_result);
-
-  if (success) {
-    ++messages_sent_;
-    bytes_sent_ += buffer.size();
-    return true;
-  }
-
-  if (data_channel_type_ != cricket::DCT_SCTP) {
-    return false;
-  }
-
-  if (send_result == cricket::SDR_BLOCK) {
-    if (!queue_if_blocked || QueueSendDataMessage(buffer)) {
-      return false;
-    }
-  }
-  // Close the channel if the error is not SDR_BLOCK, or if queuing the
-  // message failed.
-  LOG(LS_ERROR) << "Closing the DataChannel due to a failure to send data, "
-                << "send_result = " << send_result;
-  Close();
-
-  return false;
-}
-
-bool DataChannel::QueueSendDataMessage(const DataBuffer& buffer) {
-  size_t start_buffered_amount = buffered_amount();
-  if (start_buffered_amount >= kMaxQueuedSendDataBytes) {
-    LOG(LS_ERROR) << "Can't buffer any more data for the data channel.";
-    return false;
-  }
-  queued_send_data_.Push(new DataBuffer(buffer));
-
-  // The buffer can have length zero, in which case there is no change.
-  if (observer_ && buffered_amount() > start_buffered_amount) {
-    observer_->OnBufferedAmountChange(start_buffered_amount);
-  }
-  return true;
-}
-
-void DataChannel::SendQueuedControlMessages() {
-  PacketQueue control_packets;
-  control_packets.Swap(&queued_control_data_);
-
-  while (!control_packets.Empty()) {
-    std::unique_ptr<DataBuffer> buf(control_packets.Front());
-    SendControlMessage(buf->data);
-    control_packets.Pop();
-  }
-}
-
-void DataChannel::QueueControlMessage(const rtc::CopyOnWriteBuffer& buffer) {
-  queued_control_data_.Push(new DataBuffer(buffer, true));
-}
-
-bool DataChannel::SendControlMessage(const rtc::CopyOnWriteBuffer& buffer) {
-  bool is_open_message = handshake_state_ == kHandshakeShouldSendOpen;
-
-  RTC_DCHECK_EQ(data_channel_type_, cricket::DCT_SCTP);
-  RTC_DCHECK(writable_);
-  RTC_DCHECK_GE(config_.id, 0);
-  RTC_DCHECK(!is_open_message || !config_.negotiated);
-
-  cricket::SendDataParams send_params;
-  send_params.sid = config_.id;
-  // Send data as ordered before we receive any message from the remote peer to
-  // make sure the remote peer will not receive any data before it receives the
-  // OPEN message.
-  send_params.ordered = config_.ordered || is_open_message;
-  send_params.type = cricket::DMT_CONTROL;
-
-  cricket::SendDataResult send_result = cricket::SDR_SUCCESS;
-  bool retval = provider_->SendData(send_params, buffer, &send_result);
-  if (retval) {
-    LOG(LS_INFO) << "Sent CONTROL message on channel " << config_.id;
-
-    if (handshake_state_ == kHandshakeShouldSendAck) {
-      handshake_state_ = kHandshakeReady;
-    } else if (handshake_state_ == kHandshakeShouldSendOpen) {
-      handshake_state_ = kHandshakeWaitingForAck;
-    }
-  } else if (send_result == cricket::SDR_BLOCK) {
-    QueueControlMessage(buffer);
-  } else {
-    LOG(LS_ERROR) << "Closing the DataChannel due to a failure to send"
-                  << " the CONTROL message, send_result = " << send_result;
-    Close();
-  }
-  return retval;
-}
-
-}  // namespace webrtc
diff --git a/pc/datachannel.h b/pc/datachannel.h
deleted file mode 100644
index 13f5b88..0000000
--- a/pc/datachannel.h
+++ /dev/null
@@ -1,298 +0,0 @@
-/*
- *  Copyright 2012 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_PC_DATACHANNEL_H_
-#define WEBRTC_PC_DATACHANNEL_H_
-
-#include <deque>
-#include <set>
-#include <string>
-
-#include "webrtc/api/datachannelinterface.h"
-#include "webrtc/api/proxy.h"
-#include "webrtc/media/base/mediachannel.h"
-#include "webrtc/pc/channel.h"
-#include "webrtc/rtc_base/messagehandler.h"
-#include "webrtc/rtc_base/scoped_ref_ptr.h"
-#include "webrtc/rtc_base/sigslot.h"
-
-namespace webrtc {
-
-class DataChannel;
-
-class DataChannelProviderInterface {
- public:
-  // Sends the data to the transport.
-  virtual bool SendData(const cricket::SendDataParams& params,
-                        const rtc::CopyOnWriteBuffer& payload,
-                        cricket::SendDataResult* result) = 0;
-  // Connects to the transport signals.
-  virtual bool ConnectDataChannel(DataChannel* data_channel) = 0;
-  // Disconnects from the transport signals.
-  virtual void DisconnectDataChannel(DataChannel* data_channel) = 0;
-  // Adds the data channel SID to the transport for SCTP.
-  virtual void AddSctpDataStream(int sid) = 0;
-  // Removes the data channel SID from the transport for SCTP.
-  virtual void RemoveSctpDataStream(int sid) = 0;
-  // Returns true if the transport channel is ready to send data.
-  virtual bool ReadyToSendData() const = 0;
-
- protected:
-  virtual ~DataChannelProviderInterface() {}
-};
-
-struct InternalDataChannelInit : public DataChannelInit {
-  enum OpenHandshakeRole {
-    kOpener,
-    kAcker,
-    kNone
-  };
-  // The default role is kOpener because the default |negotiated| is false.
-  InternalDataChannelInit() : open_handshake_role(kOpener) {}
-  explicit InternalDataChannelInit(const DataChannelInit& base)
-      : DataChannelInit(base), open_handshake_role(kOpener) {
-    // If the channel is externally negotiated, do not send the OPEN message.
-    if (base.negotiated) {
-      open_handshake_role = kNone;
-    }
-  }
-
-  OpenHandshakeRole open_handshake_role;
-};
-
-// Helper class to allocate unique IDs for SCTP DataChannels
-class SctpSidAllocator {
- public:
-  // Gets the first unused odd/even id based on the DTLS role. If |role| is
-  // SSL_CLIENT, the allocated id starts from 0 and takes even numbers;
-  // otherwise, the id starts from 1 and takes odd numbers.
-  // Returns false if no id can be allocated.
-  bool AllocateSid(rtc::SSLRole role, int* sid);
-
-  // Attempts to reserve a specific sid. Returns false if it's unavailable.
-  bool ReserveSid(int sid);
-
-  // Indicates that |sid| isn't in use any more, and is thus available again.
-  void ReleaseSid(int sid);
-
- private:
-  // Checks if |sid| is available to be assigned to a new SCTP data channel.
-  bool IsSidAvailable(int sid) const;
-
-  std::set<int> used_sids_;
-};
-
-// DataChannel is a an implementation of the DataChannelInterface based on
-// libjingle's data engine. It provides an implementation of unreliable or
-// reliabledata channels. Currently this class is specifically designed to use
-// both RtpDataEngine and SctpDataEngine.
-
-// DataChannel states:
-// kConnecting: The channel has been created the transport might not yet be
-//              ready.
-// kOpen: The channel have a local SSRC set by a call to UpdateSendSsrc
-//        and a remote SSRC set by call to UpdateReceiveSsrc and the transport
-//        has been writable once.
-// kClosing: DataChannelInterface::Close has been called or UpdateReceiveSsrc
-//           has been called with SSRC==0
-// kClosed: Both UpdateReceiveSsrc and UpdateSendSsrc has been called with
-//          SSRC==0.
-class DataChannel : public DataChannelInterface,
-                    public sigslot::has_slots<>,
-                    public rtc::MessageHandler {
- public:
-  static rtc::scoped_refptr<DataChannel> Create(
-      DataChannelProviderInterface* provider,
-      cricket::DataChannelType dct,
-      const std::string& label,
-      const InternalDataChannelInit& config);
-
-  virtual void RegisterObserver(DataChannelObserver* observer);
-  virtual void UnregisterObserver();
-
-  virtual std::string label() const { return label_; }
-  virtual bool reliable() const;
-  virtual bool ordered() const { return config_.ordered; }
-  virtual uint16_t maxRetransmitTime() const {
-    return config_.maxRetransmitTime;
-  }
-  virtual uint16_t maxRetransmits() const { return config_.maxRetransmits; }
-  virtual std::string protocol() const { return config_.protocol; }
-  virtual bool negotiated() const { return config_.negotiated; }
-  virtual int id() const { return config_.id; }
-  virtual uint64_t buffered_amount() const;
-  virtual void Close();
-  virtual DataState state() const { return state_; }
-  virtual uint32_t messages_sent() const { return messages_sent_; }
-  virtual uint64_t bytes_sent() const { return bytes_sent_; }
-  virtual uint32_t messages_received() const { return messages_received_; }
-  virtual uint64_t bytes_received() const { return bytes_received_; }
-  virtual bool Send(const DataBuffer& buffer);
-
-  // rtc::MessageHandler override.
-  virtual void OnMessage(rtc::Message* msg);
-
-  // Called when the channel's ready to use.  That can happen when the
-  // underlying DataMediaChannel becomes ready, or when this channel is a new
-  // stream on an existing DataMediaChannel, and we've finished negotiation.
-  void OnChannelReady(bool writable);
-
-  // Slots for provider to connect signals to.
-  void OnDataReceived(const cricket::ReceiveDataParams& params,
-                      const rtc::CopyOnWriteBuffer& payload);
-  void OnStreamClosedRemotely(int sid);
-
-  // The remote peer request that this channel should be closed.
-  void RemotePeerRequestClose();
-
-  // The following methods are for SCTP only.
-
-  // Sets the SCTP sid and adds to transport layer if not set yet. Should only
-  // be called once.
-  void SetSctpSid(int sid);
-  // Called when the transport channel is created.
-  // Only needs to be called for SCTP data channels.
-  void OnTransportChannelCreated();
-  // Called when the transport channel is destroyed.
-  // This method makes sure the DataChannel is disconnected and changes state
-  // to kClosed.
-  void OnTransportChannelDestroyed();
-
-  // The following methods are for RTP only.
-
-  // Set the SSRC this channel should use to send data on the
-  // underlying data engine. |send_ssrc| == 0 means that the channel is no
-  // longer part of the session negotiation.
-  void SetSendSsrc(uint32_t send_ssrc);
-  // Set the SSRC this channel should use to receive data from the
-  // underlying data engine.
-  void SetReceiveSsrc(uint32_t receive_ssrc);
-
-  cricket::DataChannelType data_channel_type() const {
-    return data_channel_type_;
-  }
-
-  // Emitted when state transitions to kOpen.
-  sigslot::signal1<DataChannel*> SignalOpened;
-  // Emitted when state transitions to kClosed.
-  // In the case of SCTP channels, this signal can be used to tell when the
-  // channel's sid is free.
-  sigslot::signal1<DataChannel*> SignalClosed;
-
- protected:
-  DataChannel(DataChannelProviderInterface* client,
-              cricket::DataChannelType dct,
-              const std::string& label);
-  virtual ~DataChannel();
-
- private:
-  // A packet queue which tracks the total queued bytes. Queued packets are
-  // owned by this class.
-  class PacketQueue {
-   public:
-    PacketQueue();
-    ~PacketQueue();
-
-    size_t byte_count() const {
-      return byte_count_;
-    }
-
-    bool Empty() const;
-
-    DataBuffer* Front();
-
-    void Pop();
-
-    void Push(DataBuffer* packet);
-
-    void Clear();
-
-    void Swap(PacketQueue* other);
-
-   private:
-    std::deque<DataBuffer*> packets_;
-    size_t byte_count_;
-  };
-
-  // The OPEN(_ACK) signaling state.
-  enum HandshakeState {
-    kHandshakeInit,
-    kHandshakeShouldSendOpen,
-    kHandshakeShouldSendAck,
-    kHandshakeWaitingForAck,
-    kHandshakeReady
-  };
-
-  bool Init(const InternalDataChannelInit& config);
-  void DoClose();
-  void UpdateState();
-  void SetState(DataState state);
-  void DisconnectFromProvider();
-
-  void DeliverQueuedReceivedData();
-
-  void SendQueuedDataMessages();
-  bool SendDataMessage(const DataBuffer& buffer, bool queue_if_blocked);
-  bool QueueSendDataMessage(const DataBuffer& buffer);
-
-  void SendQueuedControlMessages();
-  void QueueControlMessage(const rtc::CopyOnWriteBuffer& buffer);
-  bool SendControlMessage(const rtc::CopyOnWriteBuffer& buffer);
-
-  std::string label_;
-  InternalDataChannelInit config_;
-  DataChannelObserver* observer_;
-  DataState state_;
-  uint32_t messages_sent_;
-  uint64_t bytes_sent_;
-  uint32_t messages_received_;
-  uint64_t bytes_received_;
-  cricket::DataChannelType data_channel_type_;
-  DataChannelProviderInterface* provider_;
-  HandshakeState handshake_state_;
-  bool connected_to_provider_;
-  bool send_ssrc_set_;
-  bool receive_ssrc_set_;
-  bool writable_;
-  uint32_t send_ssrc_;
-  uint32_t receive_ssrc_;
-  // Control messages that always have to get sent out before any queued
-  // data.
-  PacketQueue queued_control_data_;
-  PacketQueue queued_received_data_;
-  PacketQueue queued_send_data_;
-};
-
-// Define proxy for DataChannelInterface.
-BEGIN_SIGNALING_PROXY_MAP(DataChannel)
-  PROXY_SIGNALING_THREAD_DESTRUCTOR()
-  PROXY_METHOD1(void, RegisterObserver, DataChannelObserver*)
-  PROXY_METHOD0(void, UnregisterObserver)
-  PROXY_CONSTMETHOD0(std::string, label)
-  PROXY_CONSTMETHOD0(bool, reliable)
-  PROXY_CONSTMETHOD0(bool, ordered)
-  PROXY_CONSTMETHOD0(uint16_t, maxRetransmitTime)
-  PROXY_CONSTMETHOD0(uint16_t, maxRetransmits)
-  PROXY_CONSTMETHOD0(std::string, protocol)
-  PROXY_CONSTMETHOD0(bool, negotiated)
-  PROXY_CONSTMETHOD0(int, id)
-  PROXY_CONSTMETHOD0(DataState, state)
-  PROXY_CONSTMETHOD0(uint32_t, messages_sent)
-  PROXY_CONSTMETHOD0(uint64_t, bytes_sent)
-  PROXY_CONSTMETHOD0(uint32_t, messages_received)
-  PROXY_CONSTMETHOD0(uint64_t, bytes_received)
-  PROXY_CONSTMETHOD0(uint64_t, buffered_amount)
-  PROXY_METHOD0(void, Close)
-  PROXY_METHOD1(bool, Send, const DataBuffer&)
-END_PROXY_MAP()
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_PC_DATACHANNEL_H_
diff --git a/pc/datachannel_unittest.cc b/pc/datachannel_unittest.cc
deleted file mode 100644
index 8776dce..0000000
--- a/pc/datachannel_unittest.cc
+++ /dev/null
@@ -1,714 +0,0 @@
-/*
- *  Copyright 2013 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 <memory>
-
-#include "webrtc/pc/datachannel.h"
-#include "webrtc/pc/sctputils.h"
-#include "webrtc/pc/test/fakedatachannelprovider.h"
-#include "webrtc/rtc_base/gunit.h"
-
-using webrtc::DataChannel;
-using webrtc::SctpSidAllocator;
-
-static constexpr int kDefaultTimeout = 10000;
-
-class FakeDataChannelObserver : public webrtc::DataChannelObserver {
- public:
-  FakeDataChannelObserver()
-      : messages_received_(0),
-        on_state_change_count_(0),
-        on_buffered_amount_change_count_(0) {}
-
-  void OnStateChange() {
-    ++on_state_change_count_;
-  }
-
-  void OnBufferedAmountChange(uint64_t previous_amount) {
-    ++on_buffered_amount_change_count_;
-  }
-
-  void OnMessage(const webrtc::DataBuffer& buffer) {
-    ++messages_received_;
-  }
-
-  size_t messages_received() const {
-    return messages_received_;
-  }
-
-  void ResetOnStateChangeCount() {
-    on_state_change_count_ = 0;
-  }
-
-  void ResetOnBufferedAmountChangeCount() {
-    on_buffered_amount_change_count_ = 0;
-  }
-
-  size_t on_state_change_count() const {
-    return on_state_change_count_;
-  }
-
-  size_t on_buffered_amount_change_count() const {
-    return on_buffered_amount_change_count_;
-  }
-
- private:
-  size_t messages_received_;
-  size_t on_state_change_count_;
-  size_t on_buffered_amount_change_count_;
-};
-
-class SctpDataChannelTest : public testing::Test {
- protected:
-  SctpDataChannelTest()
-      : provider_(new FakeDataChannelProvider()),
-        webrtc_data_channel_(DataChannel::Create(provider_.get(),
-                                                 cricket::DCT_SCTP,
-                                                 "test",
-                                                 init_)) {}
-
-  void SetChannelReady() {
-    provider_->set_transport_available(true);
-    webrtc_data_channel_->OnTransportChannelCreated();
-    if (webrtc_data_channel_->id() < 0) {
-      webrtc_data_channel_->SetSctpSid(0);
-    }
-    provider_->set_ready_to_send(true);
-  }
-
-  void AddObserver() {
-    observer_.reset(new FakeDataChannelObserver());
-    webrtc_data_channel_->RegisterObserver(observer_.get());
-  }
-
-  webrtc::InternalDataChannelInit init_;
-  std::unique_ptr<FakeDataChannelProvider> provider_;
-  std::unique_ptr<FakeDataChannelObserver> observer_;
-  rtc::scoped_refptr<DataChannel> webrtc_data_channel_;
-};
-
-class StateSignalsListener : public sigslot::has_slots<> {
- public:
-  int opened_count() const { return opened_count_; }
-  int closed_count() const { return closed_count_; }
-
-  void OnSignalOpened(DataChannel* data_channel) {
-    ++opened_count_;
-  }
-
-  void OnSignalClosed(DataChannel* data_channel) {
-    ++closed_count_;
-  }
-
- private:
-  int opened_count_ = 0;
-  int closed_count_ = 0;
-};
-
-// Verifies that the data channel is connected to the transport after creation.
-TEST_F(SctpDataChannelTest, ConnectedToTransportOnCreated) {
-  provider_->set_transport_available(true);
-  rtc::scoped_refptr<DataChannel> dc =
-      DataChannel::Create(provider_.get(), cricket::DCT_SCTP, "test1", init_);
-
-  EXPECT_TRUE(provider_->IsConnected(dc.get()));
-  // The sid is not set yet, so it should not have added the streams.
-  EXPECT_FALSE(provider_->IsSendStreamAdded(dc->id()));
-  EXPECT_FALSE(provider_->IsRecvStreamAdded(dc->id()));
-
-  dc->SetSctpSid(0);
-  EXPECT_TRUE(provider_->IsSendStreamAdded(dc->id()));
-  EXPECT_TRUE(provider_->IsRecvStreamAdded(dc->id()));
-}
-
-// Verifies that the data channel is connected to the transport if the transport
-// is not available initially and becomes available later.
-TEST_F(SctpDataChannelTest, ConnectedAfterTransportBecomesAvailable) {
-  EXPECT_FALSE(provider_->IsConnected(webrtc_data_channel_.get()));
-
-  provider_->set_transport_available(true);
-  webrtc_data_channel_->OnTransportChannelCreated();
-  EXPECT_TRUE(provider_->IsConnected(webrtc_data_channel_.get()));
-}
-
-// Tests the state of the data channel.
-TEST_F(SctpDataChannelTest, StateTransition) {
-  StateSignalsListener state_signals_listener;
-  webrtc_data_channel_->SignalOpened.connect(
-      &state_signals_listener, &StateSignalsListener::OnSignalOpened);
-  webrtc_data_channel_->SignalClosed.connect(
-      &state_signals_listener, &StateSignalsListener::OnSignalClosed);
-  EXPECT_EQ(webrtc::DataChannelInterface::kConnecting,
-            webrtc_data_channel_->state());
-  EXPECT_EQ(state_signals_listener.opened_count(), 0);
-  EXPECT_EQ(state_signals_listener.closed_count(), 0);
-  SetChannelReady();
-
-  EXPECT_EQ(webrtc::DataChannelInterface::kOpen, webrtc_data_channel_->state());
-  EXPECT_EQ(state_signals_listener.opened_count(), 1);
-  EXPECT_EQ(state_signals_listener.closed_count(), 0);
-  webrtc_data_channel_->Close();
-  EXPECT_EQ(webrtc::DataChannelInterface::kClosed,
-            webrtc_data_channel_->state());
-  EXPECT_EQ(state_signals_listener.opened_count(), 1);
-  EXPECT_EQ(state_signals_listener.closed_count(), 1);
-  // Verifies that it's disconnected from the transport.
-  EXPECT_FALSE(provider_->IsConnected(webrtc_data_channel_.get()));
-}
-
-// Tests that DataChannel::buffered_amount() is correct after the channel is
-// blocked.
-TEST_F(SctpDataChannelTest, BufferedAmountWhenBlocked) {
-  AddObserver();
-  SetChannelReady();
-  webrtc::DataBuffer buffer("abcd");
-  EXPECT_TRUE(webrtc_data_channel_->Send(buffer));
-
-  EXPECT_EQ(0U, webrtc_data_channel_->buffered_amount());
-  EXPECT_EQ(0U, observer_->on_buffered_amount_change_count());
-
-  provider_->set_send_blocked(true);
-
-  const int number_of_packets = 3;
-  for (int i = 0; i < number_of_packets; ++i) {
-    EXPECT_TRUE(webrtc_data_channel_->Send(buffer));
-  }
-  EXPECT_EQ(buffer.data.size() * number_of_packets,
-            webrtc_data_channel_->buffered_amount());
-  EXPECT_EQ(number_of_packets, observer_->on_buffered_amount_change_count());
-}
-
-// Tests that the queued data are sent when the channel transitions from blocked
-// to unblocked.
-TEST_F(SctpDataChannelTest, QueuedDataSentWhenUnblocked) {
-  AddObserver();
-  SetChannelReady();
-  webrtc::DataBuffer buffer("abcd");
-  provider_->set_send_blocked(true);
-  EXPECT_TRUE(webrtc_data_channel_->Send(buffer));
-
-  EXPECT_EQ(1U, observer_->on_buffered_amount_change_count());
-
-  provider_->set_send_blocked(false);
-  SetChannelReady();
-  EXPECT_EQ(0U, webrtc_data_channel_->buffered_amount());
-  EXPECT_EQ(2U, observer_->on_buffered_amount_change_count());
-}
-
-// Tests that no crash when the channel is blocked right away while trying to
-// send queued data.
-TEST_F(SctpDataChannelTest, BlockedWhenSendQueuedDataNoCrash) {
-  AddObserver();
-  SetChannelReady();
-  webrtc::DataBuffer buffer("abcd");
-  provider_->set_send_blocked(true);
-  EXPECT_TRUE(webrtc_data_channel_->Send(buffer));
-  EXPECT_EQ(1U, observer_->on_buffered_amount_change_count());
-
-  // Set channel ready while it is still blocked.
-  SetChannelReady();
-  EXPECT_EQ(buffer.size(), webrtc_data_channel_->buffered_amount());
-  EXPECT_EQ(1U, observer_->on_buffered_amount_change_count());
-
-  // Unblock the channel to send queued data again, there should be no crash.
-  provider_->set_send_blocked(false);
-  SetChannelReady();
-  EXPECT_EQ(0U, webrtc_data_channel_->buffered_amount());
-  EXPECT_EQ(2U, observer_->on_buffered_amount_change_count());
-}
-
-// Tests that DataChannel::messages_sent() and DataChannel::bytes_sent() are
-// correct, sending data both while unblocked and while blocked.
-TEST_F(SctpDataChannelTest, VerifyMessagesAndBytesSent) {
-  AddObserver();
-  SetChannelReady();
-  std::vector<webrtc::DataBuffer> buffers({
-    webrtc::DataBuffer("message 1"),
-    webrtc::DataBuffer("msg 2"),
-    webrtc::DataBuffer("message three"),
-    webrtc::DataBuffer("quadra message"),
-    webrtc::DataBuffer("fifthmsg"),
-    webrtc::DataBuffer("message of the beast"),
-  });
-
-  // Default values.
-  EXPECT_EQ(0U, webrtc_data_channel_->messages_sent());
-  EXPECT_EQ(0U, webrtc_data_channel_->bytes_sent());
-
-  // Send three buffers while not blocked.
-  provider_->set_send_blocked(false);
-  EXPECT_TRUE(webrtc_data_channel_->Send(buffers[0]));
-  EXPECT_TRUE(webrtc_data_channel_->Send(buffers[1]));
-  EXPECT_TRUE(webrtc_data_channel_->Send(buffers[2]));
-  size_t bytes_sent = buffers[0].size() + buffers[1].size() + buffers[2].size();
-  EXPECT_EQ_WAIT(0U, webrtc_data_channel_->buffered_amount(), kDefaultTimeout);
-  EXPECT_EQ(3U, webrtc_data_channel_->messages_sent());
-  EXPECT_EQ(bytes_sent, webrtc_data_channel_->bytes_sent());
-
-  // Send three buffers while blocked, queuing the buffers.
-  provider_->set_send_blocked(true);
-  EXPECT_TRUE(webrtc_data_channel_->Send(buffers[3]));
-  EXPECT_TRUE(webrtc_data_channel_->Send(buffers[4]));
-  EXPECT_TRUE(webrtc_data_channel_->Send(buffers[5]));
-  size_t bytes_queued =
-      buffers[3].size() + buffers[4].size() + buffers[5].size();
-  EXPECT_EQ(bytes_queued, webrtc_data_channel_->buffered_amount());
-  EXPECT_EQ(3U, webrtc_data_channel_->messages_sent());
-  EXPECT_EQ(bytes_sent, webrtc_data_channel_->bytes_sent());
-
-  // Unblock and make sure everything was sent.
-  provider_->set_send_blocked(false);
-  EXPECT_EQ_WAIT(0U, webrtc_data_channel_->buffered_amount(), kDefaultTimeout);
-  bytes_sent += bytes_queued;
-  EXPECT_EQ(6U, webrtc_data_channel_->messages_sent());
-  EXPECT_EQ(bytes_sent, webrtc_data_channel_->bytes_sent());
-}
-
-// Tests that the queued control message is sent when channel is ready.
-TEST_F(SctpDataChannelTest, OpenMessageSent) {
-  // Initially the id is unassigned.
-  EXPECT_EQ(-1, webrtc_data_channel_->id());
-
-  SetChannelReady();
-  EXPECT_GE(webrtc_data_channel_->id(), 0);
-  EXPECT_EQ(cricket::DMT_CONTROL, provider_->last_send_data_params().type);
-  EXPECT_EQ(provider_->last_send_data_params().ssrc,
-            static_cast<uint32_t>(webrtc_data_channel_->id()));
-}
-
-TEST_F(SctpDataChannelTest, QueuedOpenMessageSent) {
-  provider_->set_send_blocked(true);
-  SetChannelReady();
-  provider_->set_send_blocked(false);
-
-  EXPECT_EQ(cricket::DMT_CONTROL, provider_->last_send_data_params().type);
-  EXPECT_EQ(provider_->last_send_data_params().ssrc,
-            static_cast<uint32_t>(webrtc_data_channel_->id()));
-}
-
-// Tests that the DataChannel created after transport gets ready can enter OPEN
-// state.
-TEST_F(SctpDataChannelTest, LateCreatedChannelTransitionToOpen) {
-  SetChannelReady();
-  webrtc::InternalDataChannelInit init;
-  init.id = 1;
-  rtc::scoped_refptr<DataChannel> dc =
-      DataChannel::Create(provider_.get(), cricket::DCT_SCTP, "test1", init);
-  EXPECT_EQ(webrtc::DataChannelInterface::kConnecting, dc->state());
-  EXPECT_TRUE_WAIT(webrtc::DataChannelInterface::kOpen == dc->state(),
-                   1000);
-}
-
-// Tests that an unordered DataChannel sends data as ordered until the OPEN_ACK
-// message is received.
-TEST_F(SctpDataChannelTest, SendUnorderedAfterReceivesOpenAck) {
-  SetChannelReady();
-  webrtc::InternalDataChannelInit init;
-  init.id = 1;
-  init.ordered = false;
-  rtc::scoped_refptr<DataChannel> dc =
-      DataChannel::Create(provider_.get(), cricket::DCT_SCTP, "test1", init);
-
-  EXPECT_EQ_WAIT(webrtc::DataChannelInterface::kOpen, dc->state(), 1000);
-
-  // Sends a message and verifies it's ordered.
-  webrtc::DataBuffer buffer("some data");
-  ASSERT_TRUE(dc->Send(buffer));
-  EXPECT_TRUE(provider_->last_send_data_params().ordered);
-
-  // Emulates receiving an OPEN_ACK message.
-  cricket::ReceiveDataParams params;
-  params.ssrc = init.id;
-  params.type = cricket::DMT_CONTROL;
-  rtc::CopyOnWriteBuffer payload;
-  webrtc::WriteDataChannelOpenAckMessage(&payload);
-  dc->OnDataReceived(params, payload);
-
-  // Sends another message and verifies it's unordered.
-  ASSERT_TRUE(dc->Send(buffer));
-  EXPECT_FALSE(provider_->last_send_data_params().ordered);
-}
-
-// Tests that an unordered DataChannel sends unordered data after any DATA
-// message is received.
-TEST_F(SctpDataChannelTest, SendUnorderedAfterReceiveData) {
-  SetChannelReady();
-  webrtc::InternalDataChannelInit init;
-  init.id = 1;
-  init.ordered = false;
-  rtc::scoped_refptr<DataChannel> dc =
-      DataChannel::Create(provider_.get(), cricket::DCT_SCTP, "test1", init);
-
-  EXPECT_EQ_WAIT(webrtc::DataChannelInterface::kOpen, dc->state(), 1000);
-
-  // Emulates receiving a DATA message.
-  cricket::ReceiveDataParams params;
-  params.ssrc = init.id;
-  params.type = cricket::DMT_TEXT;
-  webrtc::DataBuffer buffer("data");
-  dc->OnDataReceived(params, buffer.data);
-
-  // Sends a message and verifies it's unordered.
-  ASSERT_TRUE(dc->Send(buffer));
-  EXPECT_FALSE(provider_->last_send_data_params().ordered);
-}
-
-// Tests that the channel can't open until it's successfully sent the OPEN
-// message.
-TEST_F(SctpDataChannelTest, OpenWaitsForOpenMesssage) {
-  webrtc::DataBuffer buffer("foo");
-
-  provider_->set_send_blocked(true);
-  SetChannelReady();
-  EXPECT_EQ(webrtc::DataChannelInterface::kConnecting,
-            webrtc_data_channel_->state());
-  provider_->set_send_blocked(false);
-  EXPECT_EQ_WAIT(webrtc::DataChannelInterface::kOpen,
-                 webrtc_data_channel_->state(), 1000);
-  EXPECT_EQ(cricket::DMT_CONTROL, provider_->last_send_data_params().type);
-}
-
-// Tests that close first makes sure all queued data gets sent.
-TEST_F(SctpDataChannelTest, QueuedCloseFlushes) {
-  webrtc::DataBuffer buffer("foo");
-
-  provider_->set_send_blocked(true);
-  SetChannelReady();
-  EXPECT_EQ(webrtc::DataChannelInterface::kConnecting,
-            webrtc_data_channel_->state());
-  provider_->set_send_blocked(false);
-  EXPECT_EQ_WAIT(webrtc::DataChannelInterface::kOpen,
-                 webrtc_data_channel_->state(), 1000);
-  provider_->set_send_blocked(true);
-  webrtc_data_channel_->Send(buffer);
-  webrtc_data_channel_->Close();
-  provider_->set_send_blocked(false);
-  EXPECT_EQ_WAIT(webrtc::DataChannelInterface::kClosed,
-                 webrtc_data_channel_->state(), 1000);
-  EXPECT_EQ(cricket::DMT_TEXT, provider_->last_send_data_params().type);
-}
-
-// Tests that messages are sent with the right ssrc.
-TEST_F(SctpDataChannelTest, SendDataSsrc) {
-  webrtc_data_channel_->SetSctpSid(1);
-  SetChannelReady();
-  webrtc::DataBuffer buffer("data");
-  EXPECT_TRUE(webrtc_data_channel_->Send(buffer));
-  EXPECT_EQ(1U, provider_->last_send_data_params().ssrc);
-}
-
-// Tests that the incoming messages with wrong ssrcs are rejected.
-TEST_F(SctpDataChannelTest, ReceiveDataWithInvalidSsrc) {
-  webrtc_data_channel_->SetSctpSid(1);
-  SetChannelReady();
-
-  AddObserver();
-
-  cricket::ReceiveDataParams params;
-  params.ssrc = 0;
-  webrtc::DataBuffer buffer("abcd");
-  webrtc_data_channel_->OnDataReceived(params, buffer.data);
-
-  EXPECT_EQ(0U, observer_->messages_received());
-}
-
-// Tests that the incoming messages with right ssrcs are acceted.
-TEST_F(SctpDataChannelTest, ReceiveDataWithValidSsrc) {
-  webrtc_data_channel_->SetSctpSid(1);
-  SetChannelReady();
-
-  AddObserver();
-
-  cricket::ReceiveDataParams params;
-  params.ssrc = 1;
-  webrtc::DataBuffer buffer("abcd");
-
-  webrtc_data_channel_->OnDataReceived(params, buffer.data);
-  EXPECT_EQ(1U, observer_->messages_received());
-}
-
-// Tests that no CONTROL message is sent if the datachannel is negotiated and
-// not created from an OPEN message.
-TEST_F(SctpDataChannelTest, NoMsgSentIfNegotiatedAndNotFromOpenMsg) {
-  webrtc::InternalDataChannelInit config;
-  config.id = 1;
-  config.negotiated = true;
-  config.open_handshake_role = webrtc::InternalDataChannelInit::kNone;
-
-  SetChannelReady();
-  rtc::scoped_refptr<DataChannel> dc =
-      DataChannel::Create(provider_.get(), cricket::DCT_SCTP, "test1", config);
-
-  EXPECT_EQ_WAIT(webrtc::DataChannelInterface::kOpen, dc->state(), 1000);
-  EXPECT_EQ(0U, provider_->last_send_data_params().ssrc);
-}
-
-// Tests that DataChannel::messages_received() and DataChannel::bytes_received()
-// are correct, receiving data both while not open and while open.
-TEST_F(SctpDataChannelTest, VerifyMessagesAndBytesReceived) {
-  AddObserver();
-  std::vector<webrtc::DataBuffer> buffers({
-    webrtc::DataBuffer("message 1"),
-    webrtc::DataBuffer("msg 2"),
-    webrtc::DataBuffer("message three"),
-    webrtc::DataBuffer("quadra message"),
-    webrtc::DataBuffer("fifthmsg"),
-    webrtc::DataBuffer("message of the beast"),
-  });
-
-  webrtc_data_channel_->SetSctpSid(1);
-  cricket::ReceiveDataParams params;
-  params.ssrc = 1;
-
-  // Default values.
-  EXPECT_EQ(0U, webrtc_data_channel_->messages_received());
-  EXPECT_EQ(0U, webrtc_data_channel_->bytes_received());
-
-  // Receive three buffers while data channel isn't open.
-  webrtc_data_channel_->OnDataReceived(params, buffers[0].data);
-  webrtc_data_channel_->OnDataReceived(params, buffers[1].data);
-  webrtc_data_channel_->OnDataReceived(params, buffers[2].data);
-  EXPECT_EQ(0U, observer_->messages_received());
-  EXPECT_EQ(0U, webrtc_data_channel_->messages_received());
-  EXPECT_EQ(0U, webrtc_data_channel_->bytes_received());
-
-  // Open channel and make sure everything was received.
-  SetChannelReady();
-  size_t bytes_received =
-      buffers[0].size() + buffers[1].size() + buffers[2].size();
-  EXPECT_EQ(3U, observer_->messages_received());
-  EXPECT_EQ(3U, webrtc_data_channel_->messages_received());
-  EXPECT_EQ(bytes_received, webrtc_data_channel_->bytes_received());
-
-  // Receive three buffers while open.
-  webrtc_data_channel_->OnDataReceived(params, buffers[3].data);
-  webrtc_data_channel_->OnDataReceived(params, buffers[4].data);
-  webrtc_data_channel_->OnDataReceived(params, buffers[5].data);
-  bytes_received += buffers[3].size() + buffers[4].size() + buffers[5].size();
-  EXPECT_EQ(6U, observer_->messages_received());
-  EXPECT_EQ(6U, webrtc_data_channel_->messages_received());
-  EXPECT_EQ(bytes_received, webrtc_data_channel_->bytes_received());
-}
-
-// Tests that OPEN_ACK message is sent if the datachannel is created from an
-// OPEN message.
-TEST_F(SctpDataChannelTest, OpenAckSentIfCreatedFromOpenMessage) {
-  webrtc::InternalDataChannelInit config;
-  config.id = 1;
-  config.negotiated = true;
-  config.open_handshake_role = webrtc::InternalDataChannelInit::kAcker;
-
-  SetChannelReady();
-  rtc::scoped_refptr<DataChannel> dc =
-      DataChannel::Create(provider_.get(), cricket::DCT_SCTP, "test1", config);
-
-  EXPECT_EQ_WAIT(webrtc::DataChannelInterface::kOpen, dc->state(), 1000);
-
-  EXPECT_EQ(static_cast<unsigned int>(config.id),
-            provider_->last_send_data_params().ssrc);
-  EXPECT_EQ(cricket::DMT_CONTROL, provider_->last_send_data_params().type);
-}
-
-// Tests the OPEN_ACK role assigned by InternalDataChannelInit.
-TEST_F(SctpDataChannelTest, OpenAckRoleInitialization) {
-  webrtc::InternalDataChannelInit init;
-  EXPECT_EQ(webrtc::InternalDataChannelInit::kOpener, init.open_handshake_role);
-  EXPECT_FALSE(init.negotiated);
-
-  webrtc::DataChannelInit base;
-  base.negotiated = true;
-  webrtc::InternalDataChannelInit init2(base);
-  EXPECT_EQ(webrtc::InternalDataChannelInit::kNone, init2.open_handshake_role);
-}
-
-// Tests that the DataChannel is closed if the sending buffer is full.
-TEST_F(SctpDataChannelTest, ClosedWhenSendBufferFull) {
-  SetChannelReady();
-
-  rtc::CopyOnWriteBuffer buffer(1024);
-  memset(buffer.data(), 0, buffer.size());
-
-  webrtc::DataBuffer packet(buffer, true);
-  provider_->set_send_blocked(true);
-
-  for (size_t i = 0; i < 16 * 1024 + 1; ++i) {
-    EXPECT_TRUE(webrtc_data_channel_->Send(packet));
-  }
-
-  EXPECT_TRUE(
-      webrtc::DataChannelInterface::kClosed == webrtc_data_channel_->state() ||
-      webrtc::DataChannelInterface::kClosing == webrtc_data_channel_->state());
-}
-
-// Tests that the DataChannel is closed on transport errors.
-TEST_F(SctpDataChannelTest, ClosedOnTransportError) {
-  SetChannelReady();
-  webrtc::DataBuffer buffer("abcd");
-  provider_->set_transport_error();
-
-  EXPECT_TRUE(webrtc_data_channel_->Send(buffer));
-
-  EXPECT_EQ(webrtc::DataChannelInterface::kClosed,
-            webrtc_data_channel_->state());
-}
-
-// Tests that a already closed DataChannel does not fire onStateChange again.
-TEST_F(SctpDataChannelTest, ClosedDataChannelDoesNotFireOnStateChange) {
-  AddObserver();
-  webrtc_data_channel_->Close();
-  // OnStateChange called for kClosing and kClosed.
-  EXPECT_EQ(2U, observer_->on_state_change_count());
-
-  observer_->ResetOnStateChangeCount();
-  webrtc_data_channel_->RemotePeerRequestClose();
-  EXPECT_EQ(0U, observer_->on_state_change_count());
-}
-
-// Tests that RemotePeerRequestClose closes the local DataChannel.
-TEST_F(SctpDataChannelTest, RemotePeerRequestClose) {
-  AddObserver();
-  webrtc_data_channel_->RemotePeerRequestClose();
-
-  // OnStateChange called for kClosing and kClosed.
-  EXPECT_EQ(2U, observer_->on_state_change_count());
-  EXPECT_EQ(webrtc::DataChannelInterface::kClosed,
-            webrtc_data_channel_->state());
-}
-
-// Tests that the DataChannel is closed if the received buffer is full.
-TEST_F(SctpDataChannelTest, ClosedWhenReceivedBufferFull) {
-  SetChannelReady();
-  rtc::CopyOnWriteBuffer buffer(1024);
-  memset(buffer.data(), 0, buffer.size());
-
-  cricket::ReceiveDataParams params;
-  params.ssrc = 0;
-
-  // Receiving data without having an observer will overflow the buffer.
-  for (size_t i = 0; i < 16 * 1024 + 1; ++i) {
-    webrtc_data_channel_->OnDataReceived(params, buffer);
-  }
-  EXPECT_EQ(webrtc::DataChannelInterface::kClosed,
-            webrtc_data_channel_->state());
-}
-
-// Tests that sending empty data returns no error and keeps the channel open.
-TEST_F(SctpDataChannelTest, SendEmptyData) {
-  webrtc_data_channel_->SetSctpSid(1);
-  SetChannelReady();
-  EXPECT_EQ(webrtc::DataChannelInterface::kOpen,
-            webrtc_data_channel_->state());
-
-  webrtc::DataBuffer buffer("");
-  EXPECT_TRUE(webrtc_data_channel_->Send(buffer));
-  EXPECT_EQ(webrtc::DataChannelInterface::kOpen,
-            webrtc_data_channel_->state());
-}
-
-// Tests that a channel can be closed without being opened or assigned an sid.
-TEST_F(SctpDataChannelTest, NeverOpened) {
-  provider_->set_transport_available(true);
-  webrtc_data_channel_->OnTransportChannelCreated();
-  webrtc_data_channel_->Close();
-}
-
-// Test that the data channel goes to the "closed" state (and doesn't crash)
-// when its transport goes away, even while data is buffered.
-TEST_F(SctpDataChannelTest, TransportDestroyedWhileDataBuffered) {
-  SetChannelReady();
-
-  rtc::CopyOnWriteBuffer buffer(1024);
-  memset(buffer.data(), 0, buffer.size());
-  webrtc::DataBuffer packet(buffer, true);
-
-  // Send a packet while sending is blocked so it ends up buffered.
-  provider_->set_send_blocked(true);
-  EXPECT_TRUE(webrtc_data_channel_->Send(packet));
-
-  // Tell the data channel that its tranpsort is being destroyed.
-  // It should then stop using the transport (allowing us to delete it) and
-  // transition to the "closed" state.
-  webrtc_data_channel_->OnTransportChannelDestroyed();
-  provider_.reset(nullptr);
-  EXPECT_EQ_WAIT(webrtc::DataChannelInterface::kClosed,
-                 webrtc_data_channel_->state(), kDefaultTimeout);
-}
-
-class SctpSidAllocatorTest : public testing::Test {
- protected:
-  SctpSidAllocator allocator_;
-};
-
-// Verifies that an even SCTP id is allocated for SSL_CLIENT and an odd id for
-// SSL_SERVER.
-TEST_F(SctpSidAllocatorTest, SctpIdAllocationBasedOnRole) {
-  int id;
-  EXPECT_TRUE(allocator_.AllocateSid(rtc::SSL_SERVER, &id));
-  EXPECT_EQ(1, id);
-  EXPECT_TRUE(allocator_.AllocateSid(rtc::SSL_CLIENT, &id));
-  EXPECT_EQ(0, id);
-  EXPECT_TRUE(allocator_.AllocateSid(rtc::SSL_SERVER, &id));
-  EXPECT_EQ(3, id);
-  EXPECT_TRUE(allocator_.AllocateSid(rtc::SSL_CLIENT, &id));
-  EXPECT_EQ(2, id);
-}
-
-// Verifies that SCTP ids of existing DataChannels are not reused.
-TEST_F(SctpSidAllocatorTest, SctpIdAllocationNoReuse) {
-  int old_id = 1;
-  EXPECT_TRUE(allocator_.ReserveSid(old_id));
-
-  int new_id;
-  EXPECT_TRUE(allocator_.AllocateSid(rtc::SSL_SERVER, &new_id));
-  EXPECT_NE(old_id, new_id);
-
-  old_id = 0;
-  EXPECT_TRUE(allocator_.ReserveSid(old_id));
-  EXPECT_TRUE(allocator_.AllocateSid(rtc::SSL_CLIENT, &new_id));
-  EXPECT_NE(old_id, new_id);
-}
-
-// Verifies that SCTP ids of removed DataChannels can be reused.
-TEST_F(SctpSidAllocatorTest, SctpIdReusedForRemovedDataChannel) {
-  int odd_id = 1;
-  int even_id = 0;
-  EXPECT_TRUE(allocator_.ReserveSid(odd_id));
-  EXPECT_TRUE(allocator_.ReserveSid(even_id));
-
-  int allocated_id = -1;
-  EXPECT_TRUE(allocator_.AllocateSid(rtc::SSL_SERVER, &allocated_id));
-  EXPECT_EQ(odd_id + 2, allocated_id);
-
-  EXPECT_TRUE(allocator_.AllocateSid(rtc::SSL_CLIENT, &allocated_id));
-  EXPECT_EQ(even_id + 2, allocated_id);
-
-  EXPECT_TRUE(allocator_.AllocateSid(rtc::SSL_SERVER, &allocated_id));
-  EXPECT_EQ(odd_id + 4, allocated_id);
-
-  EXPECT_TRUE(allocator_.AllocateSid(rtc::SSL_CLIENT, &allocated_id));
-  EXPECT_EQ(even_id + 4, allocated_id);
-
-  allocator_.ReleaseSid(odd_id);
-  allocator_.ReleaseSid(even_id);
-
-  // Verifies that removed ids are reused.
-  EXPECT_TRUE(allocator_.AllocateSid(rtc::SSL_SERVER, &allocated_id));
-  EXPECT_EQ(odd_id, allocated_id);
-
-  EXPECT_TRUE(allocator_.AllocateSid(rtc::SSL_CLIENT, &allocated_id));
-  EXPECT_EQ(even_id, allocated_id);
-
-  // Verifies that used higher ids are not reused.
-  EXPECT_TRUE(allocator_.AllocateSid(rtc::SSL_SERVER, &allocated_id));
-  EXPECT_EQ(odd_id + 6, allocated_id);
-
-  EXPECT_TRUE(allocator_.AllocateSid(rtc::SSL_CLIENT, &allocated_id));
-  EXPECT_EQ(even_id + 6, allocated_id);
-}
diff --git a/pc/dtmfsender.cc b/pc/dtmfsender.cc
deleted file mode 100644
index 3a95c2a..0000000
--- a/pc/dtmfsender.cc
+++ /dev/null
@@ -1,239 +0,0 @@
-/*
- *  Copyright 2012 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/pc/dtmfsender.h"
-
-#include <ctype.h>
-
-#include <string>
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/thread.h"
-
-namespace webrtc {
-
-enum {
-  MSG_DO_INSERT_DTMF = 0,
-};
-
-// RFC4733
-//  +-------+--------+------+---------+
-//  | Event | Code   | Type | Volume? |
-//  +-------+--------+------+---------+
-//  | 0--9  | 0--9   | tone | yes     |
-//  | *     | 10     | tone | yes     |
-//  | #     | 11     | tone | yes     |
-//  | A--D  | 12--15 | tone | yes     |
-//  +-------+--------+------+---------+
-// The "," is a special event defined by the WebRTC spec. It means to delay for
-// 2 seconds before processing the next tone. We use -1 as its code.
-static const int kDtmfCodeTwoSecondDelay = -1;
-static const int kDtmfTwoSecondInMs = 2000;
-static const char kDtmfValidTones[] = ",0123456789*#ABCDabcd";
-static const char kDtmfTonesTable[] = ",0123456789*#ABCD";
-// The duration cannot be more than 6000ms or less than 40ms. The gap between
-// tones must be at least 50 ms.
-static const int kDtmfDefaultDurationMs = 100;
-static const int kDtmfMinDurationMs = 40;
-static const int kDtmfMaxDurationMs = 6000;
-static const int kDtmfDefaultGapMs = 50;
-static const int kDtmfMinGapMs = 50;
-
-// Get DTMF code from the DTMF event character.
-bool GetDtmfCode(char tone, int* code) {
-  // Convert a-d to A-D.
-  char event = toupper(tone);
-  const char* p = strchr(kDtmfTonesTable, event);
-  if (!p) {
-    return false;
-  }
-  *code = p - kDtmfTonesTable - 1;
-  return true;
-}
-
-rtc::scoped_refptr<DtmfSender> DtmfSender::Create(
-    AudioTrackInterface* track,
-    rtc::Thread* signaling_thread,
-    DtmfProviderInterface* provider) {
-  if (!signaling_thread) {
-    return nullptr;
-  }
-  rtc::scoped_refptr<DtmfSender> dtmf_sender(
-      new rtc::RefCountedObject<DtmfSender>(track, signaling_thread,
-                                                  provider));
-  return dtmf_sender;
-}
-
-DtmfSender::DtmfSender(AudioTrackInterface* track,
-                       rtc::Thread* signaling_thread,
-                       DtmfProviderInterface* provider)
-    : track_(track),
-      observer_(NULL),
-      signaling_thread_(signaling_thread),
-      provider_(provider),
-      duration_(kDtmfDefaultDurationMs),
-      inter_tone_gap_(kDtmfDefaultGapMs) {
-  RTC_DCHECK(signaling_thread_ != NULL);
-  // TODO(deadbeef): Once we can use shared_ptr and weak_ptr,
-  // do that instead of relying on a "destroyed" signal.
-  if (provider_) {
-    RTC_DCHECK(provider_->GetOnDestroyedSignal() != NULL);
-    provider_->GetOnDestroyedSignal()->connect(
-        this, &DtmfSender::OnProviderDestroyed);
-  }
-}
-
-DtmfSender::~DtmfSender() {
-  StopSending();
-}
-
-void DtmfSender::RegisterObserver(DtmfSenderObserverInterface* observer) {
-  observer_ = observer;
-}
-
-void DtmfSender::UnregisterObserver() {
-  observer_ = NULL;
-}
-
-bool DtmfSender::CanInsertDtmf() {
-  RTC_DCHECK(signaling_thread_->IsCurrent());
-  if (!provider_) {
-    return false;
-  }
-  return provider_->CanInsertDtmf();
-}
-
-bool DtmfSender::InsertDtmf(const std::string& tones, int duration,
-                            int inter_tone_gap) {
-  RTC_DCHECK(signaling_thread_->IsCurrent());
-
-  if (duration > kDtmfMaxDurationMs ||
-      duration < kDtmfMinDurationMs ||
-      inter_tone_gap < kDtmfMinGapMs) {
-    LOG(LS_ERROR) << "InsertDtmf is called with invalid duration or tones gap. "
-        << "The duration cannot be more than " << kDtmfMaxDurationMs
-        << "ms or less than " << kDtmfMinDurationMs << "ms. "
-        << "The gap between tones must be at least " << kDtmfMinGapMs << "ms.";
-    return false;
-  }
-
-  if (!CanInsertDtmf()) {
-    LOG(LS_ERROR)
-        << "InsertDtmf is called on DtmfSender that can't send DTMF.";
-    return false;
-  }
-
-  tones_ = tones;
-  duration_ = duration;
-  inter_tone_gap_ = inter_tone_gap;
-  // Clear the previous queue.
-  signaling_thread_->Clear(this, MSG_DO_INSERT_DTMF);
-  // Kick off a new DTMF task queue.
-  signaling_thread_->Post(RTC_FROM_HERE, this, MSG_DO_INSERT_DTMF);
-  return true;
-}
-
-const AudioTrackInterface* DtmfSender::track() const {
-  return track_;
-}
-
-std::string DtmfSender::tones() const {
-  return tones_;
-}
-
-int DtmfSender::duration() const {
-  return duration_;
-}
-
-int DtmfSender::inter_tone_gap() const {
-  return inter_tone_gap_;
-}
-
-void DtmfSender::OnMessage(rtc::Message* msg) {
-  switch (msg->message_id) {
-    case MSG_DO_INSERT_DTMF: {
-      DoInsertDtmf();
-      break;
-    }
-    default: {
-      RTC_NOTREACHED();
-      break;
-    }
-  }
-}
-
-void DtmfSender::DoInsertDtmf() {
-  RTC_DCHECK(signaling_thread_->IsCurrent());
-
-  // Get the first DTMF tone from the tone buffer. Unrecognized characters will
-  // be ignored and skipped.
-  size_t first_tone_pos = tones_.find_first_of(kDtmfValidTones);
-  int code = 0;
-  if (first_tone_pos == std::string::npos) {
-    tones_.clear();
-    // Fire a “OnToneChange” event with an empty string and stop.
-    if (observer_) {
-      observer_->OnToneChange(std::string());
-    }
-    return;
-  } else {
-    char tone = tones_[first_tone_pos];
-    if (!GetDtmfCode(tone, &code)) {
-      // The find_first_of(kDtmfValidTones) should have guarantee |tone| is
-      // a valid DTMF tone.
-      RTC_NOTREACHED();
-    }
-  }
-
-  int tone_gap = inter_tone_gap_;
-  if (code == kDtmfCodeTwoSecondDelay) {
-    // Special case defined by WebRTC - The character',' indicates a delay of 2
-    // seconds before processing the next character in the tones parameter.
-    tone_gap = kDtmfTwoSecondInMs;
-  } else {
-    if (!provider_) {
-      LOG(LS_ERROR) << "The DtmfProvider has been destroyed.";
-      return;
-    }
-    // The provider starts playout of the given tone on the
-    // associated RTP media stream, using the appropriate codec.
-    if (!provider_->InsertDtmf(code, duration_)) {
-      LOG(LS_ERROR) << "The DtmfProvider can no longer send DTMF.";
-      return;
-    }
-    // Wait for the number of milliseconds specified by |duration_|.
-    tone_gap += duration_;
-  }
-
-  // Fire a “OnToneChange” event with the tone that's just processed.
-  if (observer_) {
-    observer_->OnToneChange(tones_.substr(first_tone_pos, 1));
-  }
-
-  // Erase the unrecognized characters plus the tone that's just processed.
-  tones_.erase(0, first_tone_pos + 1);
-
-  // Continue with the next tone.
-  signaling_thread_->PostDelayed(RTC_FROM_HERE, tone_gap, this,
-                                 MSG_DO_INSERT_DTMF);
-}
-
-void DtmfSender::OnProviderDestroyed() {
-  LOG(LS_INFO) << "The Dtmf provider is deleted. Clear the sending queue.";
-  StopSending();
-  provider_ = NULL;
-}
-
-void DtmfSender::StopSending() {
-  signaling_thread_->Clear(this);
-}
-
-}  // namespace webrtc
diff --git a/pc/dtmfsender.h b/pc/dtmfsender.h
deleted file mode 100644
index 28156f3..0000000
--- a/pc/dtmfsender.h
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- *  Copyright 2012 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_PC_DTMFSENDER_H_
-#define WEBRTC_PC_DTMFSENDER_H_
-
-#include <string>
-
-#include "webrtc/api/dtmfsenderinterface.h"
-#include "webrtc/api/mediastreaminterface.h"
-#include "webrtc/api/proxy.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/messagehandler.h"
-#include "webrtc/rtc_base/refcount.h"
-
-// DtmfSender is the native implementation of the RTCDTMFSender defined by
-// the WebRTC W3C Editor's Draft.
-// http://dev.w3.org/2011/webrtc/editor/webrtc.html
-
-namespace rtc {
-class Thread;
-}
-
-namespace webrtc {
-
-// This interface is called by DtmfSender to talk to the actual audio channel
-// to send DTMF.
-class DtmfProviderInterface {
- public:
-  // Returns true if the audio sender is capable of sending DTMF. Otherwise
-  // returns false.
-  virtual bool CanInsertDtmf() = 0;
-  // Sends DTMF |code|.
-  // The |duration| indicates the length of the DTMF tone in ms.
-  // Returns true on success and false on failure.
-  virtual bool InsertDtmf(int code, int duration) = 0;
-  // Returns a |sigslot::signal0<>| signal. The signal should fire before
-  // the provider is destroyed.
-  virtual sigslot::signal0<>* GetOnDestroyedSignal() = 0;
-
- protected:
-  virtual ~DtmfProviderInterface() {}
-};
-
-class DtmfSender
-    : public DtmfSenderInterface,
-      public sigslot::has_slots<>,
-      public rtc::MessageHandler {
- public:
-  // |track| is only there for backwards compatibility, since there's a track
-  // accessor method.
-  static rtc::scoped_refptr<DtmfSender> Create(
-      AudioTrackInterface* track,
-      rtc::Thread* signaling_thread,
-      DtmfProviderInterface* provider);
-
-  // Implements DtmfSenderInterface.
-  void RegisterObserver(DtmfSenderObserverInterface* observer) override;
-  void UnregisterObserver() override;
-  bool CanInsertDtmf() override;
-  bool InsertDtmf(const std::string& tones,
-                  int duration,
-                  int inter_tone_gap) override;
-  const AudioTrackInterface* track() const override;
-  std::string tones() const override;
-  int duration() const override;
-  int inter_tone_gap() const override;
-
- protected:
-  DtmfSender(AudioTrackInterface* track,
-             rtc::Thread* signaling_thread,
-             DtmfProviderInterface* provider);
-  virtual ~DtmfSender();
-
- private:
-  DtmfSender();
-
-  // Implements MessageHandler.
-  void OnMessage(rtc::Message* msg) override;
-
-  // The DTMF sending task.
-  void DoInsertDtmf();
-
-  void OnProviderDestroyed();
-
-  void StopSending();
-
-  rtc::scoped_refptr<AudioTrackInterface> track_;
-  DtmfSenderObserverInterface* observer_;
-  rtc::Thread* signaling_thread_;
-  DtmfProviderInterface* provider_;
-  std::string tones_;
-  int duration_;
-  int inter_tone_gap_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(DtmfSender);
-};
-
-// Define proxy for DtmfSenderInterface.
-BEGIN_SIGNALING_PROXY_MAP(DtmfSender)
-  PROXY_SIGNALING_THREAD_DESTRUCTOR()
-  PROXY_METHOD1(void, RegisterObserver, DtmfSenderObserverInterface*)
-  PROXY_METHOD0(void, UnregisterObserver)
-  PROXY_METHOD0(bool, CanInsertDtmf)
-  PROXY_METHOD3(bool, InsertDtmf, const std::string&, int, int)
-  PROXY_CONSTMETHOD0(const AudioTrackInterface*, track)
-  PROXY_CONSTMETHOD0(std::string, tones)
-  PROXY_CONSTMETHOD0(int, duration)
-  PROXY_CONSTMETHOD0(int, inter_tone_gap)
-END_PROXY_MAP()
-
-// Get DTMF code from the DTMF event character.
-bool GetDtmfCode(char tone, int* code);
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_PC_DTMFSENDER_H_
diff --git a/pc/dtmfsender_unittest.cc b/pc/dtmfsender_unittest.cc
deleted file mode 100644
index 400444e..0000000
--- a/pc/dtmfsender_unittest.cc
+++ /dev/null
@@ -1,341 +0,0 @@
-/*
- *  Copyright 2012 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/pc/dtmfsender.h"
-
-#include <memory>
-#include <set>
-#include <string>
-#include <vector>
-
-#include "webrtc/pc/audiotrack.h"
-#include "webrtc/rtc_base/fakeclock.h"
-#include "webrtc/rtc_base/gunit.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/timeutils.h"
-
-using webrtc::AudioTrackInterface;
-using webrtc::AudioTrack;
-using webrtc::DtmfProviderInterface;
-using webrtc::DtmfSender;
-using webrtc::DtmfSenderObserverInterface;
-
-static const char kTestAudioLabel[] = "test_audio_track";
-// TODO(deadbeef): Even though this test now uses a fake clock, it has a
-// generous 3-second timeout for every test case. The timeout could be tuned
-// to each test based on the tones sent, instead.
-static const int kMaxWaitMs = 3000;
-
-class FakeDtmfObserver : public DtmfSenderObserverInterface {
- public:
-  FakeDtmfObserver() : completed_(false) {}
-
-  // Implements DtmfSenderObserverInterface.
-  void OnToneChange(const std::string& tone) override {
-    LOG(LS_VERBOSE) << "FakeDtmfObserver::OnToneChange '" << tone << "'.";
-    tones_.push_back(tone);
-    if (tone.empty()) {
-      completed_ = true;
-    }
-  }
-
-  // getters
-  const std::vector<std::string>& tones() const {
-    return tones_;
-  }
-  bool completed() const {
-    return completed_;
-  }
-
- private:
-  std::vector<std::string> tones_;
-  bool completed_;
-};
-
-class FakeDtmfProvider : public DtmfProviderInterface {
- public:
-  struct DtmfInfo {
-    DtmfInfo(int code, int duration, int gap)
-      : code(code),
-        duration(duration),
-        gap(gap) {}
-    int code;
-    int duration;
-    int gap;
-  };
-
-  FakeDtmfProvider() : last_insert_dtmf_call_(0) {}
-
-  ~FakeDtmfProvider() {
-    SignalDestroyed();
-  }
-
-  // Implements DtmfProviderInterface.
-  bool CanInsertDtmf() override { return can_insert_; }
-
-  bool InsertDtmf(int code, int duration) override {
-    int gap = 0;
-    // TODO(ronghuawu): Make the timer (basically the rtc::TimeNanos)
-    // mockable and use a fake timer in the unit tests.
-    if (last_insert_dtmf_call_ > 0) {
-      gap = static_cast<int>(rtc::TimeMillis() - last_insert_dtmf_call_);
-    }
-    last_insert_dtmf_call_ = rtc::TimeMillis();
-
-    LOG(LS_VERBOSE) << "FakeDtmfProvider::InsertDtmf code=" << code
-                    << " duration=" << duration
-                    << " gap=" << gap << ".";
-    dtmf_info_queue_.push_back(DtmfInfo(code, duration, gap));
-    return true;
-  }
-
-  sigslot::signal0<>* GetOnDestroyedSignal() override {
-    return &SignalDestroyed;
-  }
-
-  // getter and setter
-  const std::vector<DtmfInfo>& dtmf_info_queue() const {
-    return dtmf_info_queue_;
-  }
-
-  // helper functions
-  void SetCanInsertDtmf(bool can_insert) { can_insert_ = can_insert; }
-
- private:
-  bool can_insert_ = false;
-  std::vector<DtmfInfo> dtmf_info_queue_;
-  int64_t last_insert_dtmf_call_;
-  sigslot::signal0<> SignalDestroyed;
-};
-
-class DtmfSenderTest : public testing::Test {
- protected:
-  DtmfSenderTest()
-      : track_(AudioTrack::Create(kTestAudioLabel, NULL)),
-        observer_(new rtc::RefCountedObject<FakeDtmfObserver>()),
-        provider_(new FakeDtmfProvider()) {
-    provider_->SetCanInsertDtmf(true);
-    dtmf_ = DtmfSender::Create(track_, rtc::Thread::Current(),
-                               provider_.get());
-    dtmf_->RegisterObserver(observer_.get());
-  }
-
-  ~DtmfSenderTest() {
-    if (dtmf_.get()) {
-      dtmf_->UnregisterObserver();
-    }
-  }
-
-  // Constructs a list of DtmfInfo from |tones|, |duration| and
-  // |inter_tone_gap|.
-  void GetDtmfInfoFromString(const std::string& tones, int duration,
-                             int inter_tone_gap,
-                             std::vector<FakeDtmfProvider::DtmfInfo>* dtmfs) {
-    // Init extra_delay as -inter_tone_gap - duration to ensure the first
-    // DtmfInfo's gap field will be 0.
-    int extra_delay = -1 * (inter_tone_gap + duration);
-
-    std::string::const_iterator it = tones.begin();
-    for (; it != tones.end(); ++it) {
-      char tone = *it;
-      int code = 0;
-      webrtc::GetDtmfCode(tone, &code);
-      if (tone == ',') {
-        extra_delay = 2000;  // 2 seconds
-      } else {
-        dtmfs->push_back(FakeDtmfProvider::DtmfInfo(code, duration,
-                         duration + inter_tone_gap + extra_delay));
-        extra_delay = 0;
-      }
-    }
-  }
-
-  void VerifyExpectedState(AudioTrackInterface* track,
-                          const std::string& tones,
-                          int duration, int inter_tone_gap) {
-    EXPECT_EQ(track, dtmf_->track());
-    EXPECT_EQ(tones, dtmf_->tones());
-    EXPECT_EQ(duration, dtmf_->duration());
-    EXPECT_EQ(inter_tone_gap, dtmf_->inter_tone_gap());
-  }
-
-  // Verify the provider got all the expected calls.
-  void VerifyOnProvider(const std::string& tones, int duration,
-                        int inter_tone_gap) {
-    std::vector<FakeDtmfProvider::DtmfInfo> dtmf_queue_ref;
-    GetDtmfInfoFromString(tones, duration, inter_tone_gap, &dtmf_queue_ref);
-    VerifyOnProvider(dtmf_queue_ref);
-  }
-
-  void VerifyOnProvider(
-      const std::vector<FakeDtmfProvider::DtmfInfo>& dtmf_queue_ref) {
-    const std::vector<FakeDtmfProvider::DtmfInfo>& dtmf_queue =
-        provider_->dtmf_info_queue();
-    ASSERT_EQ(dtmf_queue_ref.size(), dtmf_queue.size());
-    std::vector<FakeDtmfProvider::DtmfInfo>::const_iterator it_ref =
-        dtmf_queue_ref.begin();
-    std::vector<FakeDtmfProvider::DtmfInfo>::const_iterator it =
-        dtmf_queue.begin();
-    while (it_ref != dtmf_queue_ref.end() && it != dtmf_queue.end()) {
-      EXPECT_EQ(it_ref->code, it->code);
-      EXPECT_EQ(it_ref->duration, it->duration);
-      // Allow ~10ms error (can be small since we're using a fake clock).
-      EXPECT_GE(it_ref->gap, it->gap - 10);
-      EXPECT_LE(it_ref->gap, it->gap + 10);
-      ++it_ref;
-      ++it;
-    }
-  }
-
-  // Verify the observer got all the expected callbacks.
-  void VerifyOnObserver(const std::string& tones_ref) {
-    const std::vector<std::string>& tones = observer_->tones();
-    // The observer will get an empty string at the end.
-    EXPECT_EQ(tones_ref.size() + 1, tones.size());
-    EXPECT_TRUE(tones.back().empty());
-    std::string::const_iterator it_ref = tones_ref.begin();
-    std::vector<std::string>::const_iterator it = tones.begin();
-    while (it_ref != tones_ref.end() && it != tones.end()) {
-      EXPECT_EQ(*it_ref, it->at(0));
-      ++it_ref;
-      ++it;
-    }
-  }
-
-  rtc::scoped_refptr<AudioTrackInterface> track_;
-  std::unique_ptr<FakeDtmfObserver> observer_;
-  std::unique_ptr<FakeDtmfProvider> provider_;
-  rtc::scoped_refptr<DtmfSender> dtmf_;
-  rtc::ScopedFakeClock fake_clock_;
-};
-
-TEST_F(DtmfSenderTest, CanInsertDtmf) {
-  EXPECT_TRUE(dtmf_->CanInsertDtmf());
-  provider_->SetCanInsertDtmf(false);
-  EXPECT_FALSE(dtmf_->CanInsertDtmf());
-}
-
-TEST_F(DtmfSenderTest, InsertDtmf) {
-  std::string tones = "@1%a&*$";
-  int duration = 100;
-  int inter_tone_gap = 50;
-  EXPECT_TRUE(dtmf_->InsertDtmf(tones, duration, inter_tone_gap));
-  EXPECT_TRUE_SIMULATED_WAIT(observer_->completed(), kMaxWaitMs, fake_clock_);
-
-  // The unrecognized characters should be ignored.
-  std::string known_tones = "1a*";
-  VerifyOnProvider(known_tones, duration, inter_tone_gap);
-  VerifyOnObserver(known_tones);
-}
-
-TEST_F(DtmfSenderTest, InsertDtmfTwice) {
-  std::string tones1 = "12";
-  std::string tones2 = "ab";
-  int duration = 100;
-  int inter_tone_gap = 50;
-  EXPECT_TRUE(dtmf_->InsertDtmf(tones1, duration, inter_tone_gap));
-  VerifyExpectedState(track_, tones1, duration, inter_tone_gap);
-  // Wait until the first tone got sent.
-  EXPECT_TRUE_SIMULATED_WAIT(observer_->tones().size() == 1, kMaxWaitMs,
-                             fake_clock_);
-  VerifyExpectedState(track_, "2", duration, inter_tone_gap);
-  // Insert with another tone buffer.
-  EXPECT_TRUE(dtmf_->InsertDtmf(tones2, duration, inter_tone_gap));
-  VerifyExpectedState(track_, tones2, duration, inter_tone_gap);
-  // Wait until it's completed.
-  EXPECT_TRUE_SIMULATED_WAIT(observer_->completed(), kMaxWaitMs, fake_clock_);
-
-  std::vector<FakeDtmfProvider::DtmfInfo> dtmf_queue_ref;
-  GetDtmfInfoFromString("1", duration, inter_tone_gap, &dtmf_queue_ref);
-  GetDtmfInfoFromString("ab", duration, inter_tone_gap, &dtmf_queue_ref);
-  VerifyOnProvider(dtmf_queue_ref);
-  VerifyOnObserver("1ab");
-}
-
-TEST_F(DtmfSenderTest, InsertDtmfWhileProviderIsDeleted) {
-  std::string tones = "@1%a&*$";
-  int duration = 100;
-  int inter_tone_gap = 50;
-  EXPECT_TRUE(dtmf_->InsertDtmf(tones, duration, inter_tone_gap));
-  // Wait until the first tone got sent.
-  EXPECT_TRUE_SIMULATED_WAIT(observer_->tones().size() == 1, kMaxWaitMs,
-                             fake_clock_);
-  // Delete provider.
-  provider_.reset();
-  // The queue should be discontinued so no more tone callbacks.
-  SIMULATED_WAIT(false, 200, fake_clock_);
-  EXPECT_EQ(1U, observer_->tones().size());
-}
-
-TEST_F(DtmfSenderTest, InsertDtmfWhileSenderIsDeleted) {
-  std::string tones = "@1%a&*$";
-  int duration = 100;
-  int inter_tone_gap = 50;
-  EXPECT_TRUE(dtmf_->InsertDtmf(tones, duration, inter_tone_gap));
-  // Wait until the first tone got sent.
-  EXPECT_TRUE_SIMULATED_WAIT(observer_->tones().size() == 1, kMaxWaitMs,
-                             fake_clock_);
-  // Delete the sender.
-  dtmf_ = NULL;
-  // The queue should be discontinued so no more tone callbacks.
-  SIMULATED_WAIT(false, 200, fake_clock_);
-  EXPECT_EQ(1U, observer_->tones().size());
-}
-
-TEST_F(DtmfSenderTest, InsertEmptyTonesToCancelPreviousTask) {
-  std::string tones1 = "12";
-  std::string tones2 = "";
-  int duration = 100;
-  int inter_tone_gap = 50;
-  EXPECT_TRUE(dtmf_->InsertDtmf(tones1, duration, inter_tone_gap));
-  // Wait until the first tone got sent.
-  EXPECT_TRUE_SIMULATED_WAIT(observer_->tones().size() == 1, kMaxWaitMs,
-                             fake_clock_);
-  // Insert with another tone buffer.
-  EXPECT_TRUE(dtmf_->InsertDtmf(tones2, duration, inter_tone_gap));
-  // Wait until it's completed.
-  EXPECT_TRUE_SIMULATED_WAIT(observer_->completed(), kMaxWaitMs, fake_clock_);
-
-  std::vector<FakeDtmfProvider::DtmfInfo> dtmf_queue_ref;
-  GetDtmfInfoFromString("1", duration, inter_tone_gap, &dtmf_queue_ref);
-  VerifyOnProvider(dtmf_queue_ref);
-  VerifyOnObserver("1");
-}
-
-TEST_F(DtmfSenderTest, InsertDtmfWithCommaAsDelay) {
-  std::string tones = "3,4";
-  int duration = 100;
-  int inter_tone_gap = 50;
-  EXPECT_TRUE(dtmf_->InsertDtmf(tones, duration, inter_tone_gap));
-  EXPECT_TRUE_SIMULATED_WAIT(observer_->completed(), kMaxWaitMs, fake_clock_);
-
-  VerifyOnProvider(tones, duration, inter_tone_gap);
-  VerifyOnObserver(tones);
-}
-
-TEST_F(DtmfSenderTest, TryInsertDtmfWhenItDoesNotWork) {
-  std::string tones = "3,4";
-  int duration = 100;
-  int inter_tone_gap = 50;
-  provider_->SetCanInsertDtmf(false);
-  EXPECT_FALSE(dtmf_->InsertDtmf(tones, duration, inter_tone_gap));
-}
-
-TEST_F(DtmfSenderTest, InsertDtmfWithInvalidDurationOrGap) {
-  std::string tones = "3,4";
-  int duration = 40;
-  int inter_tone_gap = 50;
-
-  EXPECT_FALSE(dtmf_->InsertDtmf(tones, 6001, inter_tone_gap));
-  EXPECT_FALSE(dtmf_->InsertDtmf(tones, 39, inter_tone_gap));
-  EXPECT_FALSE(dtmf_->InsertDtmf(tones, duration, 49));
-
-  EXPECT_TRUE(dtmf_->InsertDtmf(tones, duration, inter_tone_gap));
-}
diff --git a/pc/externalhmac.cc b/pc/externalhmac.cc
deleted file mode 100644
index 34cab08..0000000
--- a/pc/externalhmac.cc
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- *  Copyright 2014 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/pc/externalhmac.h"
-
-#include <stdlib.h>  // For malloc/free.
-
-#include "webrtc/rtc_base/logging.h"
-
-#include "third_party/libsrtp/crypto/include/crypto_kernel.h"
-#include "third_party/libsrtp/include/srtp.h"
-
-// Begin test case 0 */
-static const uint8_t kExternalHmacTestCase0Key[20] = {
-  0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
-  0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
-  0x0b, 0x0b, 0x0b, 0x0b
-};
-
-static const uint8_t kExternalHmacTestCase0Data[8] = {
-  0x48, 0x69, 0x20, 0x54, 0x68, 0x65, 0x72, 0x65   // "Hi There"
-};
-
-static const uint8_t kExternalHmacFakeTag[10] = {
-  0xba, 0xdd, 0xba, 0xdd, 0xba, 0xdd, 0xba, 0xdd, 0xba, 0xdd
-};
-
-static const srtp_auth_test_case_t kExternalHmacTestCase0 = {
-  20,                                                    // Octets in key
-  const_cast<uint8_t*>(kExternalHmacTestCase0Key),   // Key
-  8,                                                     // Octets in data
-  const_cast<uint8_t*>(kExternalHmacTestCase0Data),  // Data
-  10,                                                    // Octets in tag
-  const_cast<uint8_t*>(kExternalHmacFakeTag),          // Tag
-  NULL                                                   // Pointer to next
-                                                         // testcase
-};
-
-static const char kExternalHmacDescription[] =
-    "external hmac sha-1 authentication";
-
-// srtp_auth_type_t external_hmac is the hmac metaobject
-
-static const srtp_auth_type_t external_hmac  = {
-  external_hmac_alloc,
-  external_hmac_dealloc,
-  (srtp_auth_init_func)    external_hmac_init,
-  (srtp_auth_compute_func) external_hmac_compute,
-  (srtp_auth_update_func)  external_hmac_update,
-  (srtp_auth_start_func)   external_hmac_start,
-  const_cast<char*>(kExternalHmacDescription),
-  const_cast<srtp_auth_test_case_t*>(&kExternalHmacTestCase0),
-  EXTERNAL_HMAC_SHA1
-};
-
-srtp_err_status_t external_hmac_alloc(srtp_auth_t** a,
-                                      int key_len,
-                                      int out_len) {
-  uint8_t* pointer;
-
-  // Check key length - note that we don't support keys larger
-  // than 20 bytes yet
-  if (key_len > 20)
-    return srtp_err_status_bad_param;
-
-  // Check output length - should be less than 20 bytes/
-  if (out_len > 20)
-    return srtp_err_status_bad_param;
-
-  // Allocate memory for auth and hmac_ctx_t structures.
-  pointer = new uint8_t[(sizeof(ExternalHmacContext) + sizeof(srtp_auth_t))];
-  if (pointer == NULL)
-    return srtp_err_status_alloc_fail;
-
-  // Set pointers
-  *a = (srtp_auth_t *)pointer;
-  // |external_hmac| is const and libsrtp expects |type| to be non-const.
-  // const conversion is required. |external_hmac| is constant because we don't
-  // want to increase global count in Chrome.
-  (*a)->type = const_cast<srtp_auth_type_t*>(&external_hmac);
-  (*a)->state = pointer + sizeof(srtp_auth_t);
-  (*a)->out_len = out_len;
-  (*a)->key_len = key_len;
-  (*a)->prefix_len = 0;
-
-  return srtp_err_status_ok;
-}
-
-srtp_err_status_t external_hmac_dealloc(srtp_auth_t* a) {
-  // Zeroize entire state
-  memset((uint8_t *)a, 0, sizeof(ExternalHmacContext) + sizeof(srtp_auth_t));
-
-  // Free memory
-  delete[] a;
-
-  return srtp_err_status_ok;
-}
-
-srtp_err_status_t external_hmac_init(ExternalHmacContext* state,
-                                     const uint8_t* key,
-                                     int key_len) {
-  if (key_len > HMAC_KEY_LENGTH)
-    return srtp_err_status_bad_param;
-
-  memset(state->key, 0, key_len);
-  memcpy(state->key, key, key_len);
-  state->key_length = key_len;
-  return srtp_err_status_ok;
-}
-
-srtp_err_status_t external_hmac_start(ExternalHmacContext* state) {
-  return srtp_err_status_ok;
-}
-
-srtp_err_status_t external_hmac_update(ExternalHmacContext* state,
-                                       const uint8_t* message,
-                                       int msg_octets) {
-  return srtp_err_status_ok;
-}
-
-srtp_err_status_t external_hmac_compute(ExternalHmacContext* state,
-                                       const void* message,
-                                       int msg_octets,
-                                       int tag_len,
-                                       uint8_t* result) {
-  memcpy(result, kExternalHmacFakeTag, tag_len);
-  return srtp_err_status_ok;
-}
-
-srtp_err_status_t external_crypto_init() {
-  // |external_hmac| is const. const_cast is required as libsrtp expects
-  // non-const.
-  srtp_err_status_t status = srtp_replace_auth_type(
-      const_cast<srtp_auth_type_t*>(&external_hmac), EXTERNAL_HMAC_SHA1);
-  if (status) {
-    LOG(LS_ERROR) << "Error in replacing default auth module, error: "
-                  << status;
-    return srtp_err_status_fail;
-  }
-  return srtp_err_status_ok;
-}
diff --git a/pc/externalhmac.h b/pc/externalhmac.h
deleted file mode 100644
index 4a6e817..0000000
--- a/pc/externalhmac.h
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- *  Copyright 2014 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_PC_EXTERNALHMAC_H_
-#define WEBRTC_PC_EXTERNALHMAC_H_
-
-// External libsrtp HMAC auth module which implements methods defined in
-// auth_type_t.
-// The default auth module will be replaced only when the ENABLE_EXTERNAL_AUTH
-// flag is enabled. This allows us to access to authentication keys,
-// as the default auth implementation doesn't provide access and avoids
-// hashing each packet twice.
-
-// How will libsrtp select this module?
-// Libsrtp defines authentication function types identified by an unsigned
-// integer, e.g. SRTP_HMAC_SHA1 is 3. Using authentication ids, the
-// application can plug any desired authentication modules into libsrtp.
-// libsrtp also provides a mechanism to select different auth functions for
-// individual streams. This can be done by setting the right value in
-// the auth_type of srtp_policy_t. The application must first register auth
-// functions and the corresponding authentication id using
-// crypto_kernel_replace_auth_type function.
-
-#include <stdint.h>
-
-#include "third_party/libsrtp/crypto/include/auth.h"
-
-#define EXTERNAL_HMAC_SHA1 SRTP_HMAC_SHA1 + 1
-#define HMAC_KEY_LENGTH 20
-
-// The HMAC context structure used to store authentication keys.
-// The pointer to the key  will be allocated in the external_hmac_init function.
-// This pointer is owned by srtp_t in a template context.
-typedef struct {
-  uint8_t key[HMAC_KEY_LENGTH];
-  int key_length;
-} ExternalHmacContext;
-
-srtp_err_status_t external_hmac_alloc(srtp_auth_t** a,
-                                      int key_len,
-                                      int out_len);
-
-srtp_err_status_t external_hmac_dealloc(srtp_auth_t* a);
-
-srtp_err_status_t external_hmac_init(ExternalHmacContext* state,
-                                     const uint8_t* key,
-                                     int key_len);
-
-srtp_err_status_t external_hmac_start(ExternalHmacContext* state);
-
-srtp_err_status_t external_hmac_update(ExternalHmacContext* state,
-                                       const uint8_t* message,
-                                       int msg_octets);
-
-srtp_err_status_t external_hmac_compute(ExternalHmacContext* state,
-                                        const void* message,
-                                        int msg_octets,
-                                        int tag_len,
-                                        uint8_t* result);
-
-srtp_err_status_t external_crypto_init();
-
-#endif  // WEBRTC_PC_EXTERNALHMAC_H_
diff --git a/pc/iceserverparsing.cc b/pc/iceserverparsing.cc
deleted file mode 100644
index 9b802fc..0000000
--- a/pc/iceserverparsing.cc
+++ /dev/null
@@ -1,314 +0,0 @@
-/*
- *  Copyright 2017 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/pc/iceserverparsing.h"
-
-#include <cctype>  // For std::isdigit.
-#include <string>
-
-#include "webrtc/rtc_base/arraysize.h"
-
-namespace webrtc {
-
-// The min number of tokens must present in Turn host uri.
-// e.g. user@turn.example.org
-static const size_t kTurnHostTokensNum = 2;
-// Number of tokens must be preset when TURN uri has transport param.
-static const size_t kTurnTransportTokensNum = 2;
-// The default stun port.
-static const int kDefaultStunPort = 3478;
-static const int kDefaultStunTlsPort = 5349;
-static const char kTransport[] = "transport";
-
-// NOTE: Must be in the same order as the ServiceType enum.
-static const char* kValidIceServiceTypes[] = {"stun", "stuns", "turn", "turns"};
-
-// NOTE: A loop below assumes that the first value of this enum is 0 and all
-// other values are incremental.
-enum ServiceType {
-  STUN = 0,  // Indicates a STUN server.
-  STUNS,     // Indicates a STUN server used with a TLS session.
-  TURN,      // Indicates a TURN server
-  TURNS,     // Indicates a TURN server used with a TLS session.
-  INVALID,   // Unknown.
-};
-static_assert(INVALID == arraysize(kValidIceServiceTypes),
-              "kValidIceServiceTypes must have as many strings as ServiceType "
-              "has values.");
-
-// |in_str| should be of format
-// stunURI       = scheme ":" stun-host [ ":" stun-port ]
-// scheme        = "stun" / "stuns"
-// stun-host     = IP-literal / IPv4address / reg-name
-// stun-port     = *DIGIT
-//
-// draft-petithuguenin-behave-turn-uris-01
-// turnURI       = scheme ":" turn-host [ ":" turn-port ]
-// turn-host     = username@IP-literal / IPv4address / reg-name
-static bool GetServiceTypeAndHostnameFromUri(const std::string& in_str,
-                                             ServiceType* service_type,
-                                             std::string* hostname) {
-  const std::string::size_type colonpos = in_str.find(':');
-  if (colonpos == std::string::npos) {
-    LOG(LS_WARNING) << "Missing ':' in ICE URI: " << in_str;
-    return false;
-  }
-  if ((colonpos + 1) == in_str.length()) {
-    LOG(LS_WARNING) << "Empty hostname in ICE URI: " << in_str;
-    return false;
-  }
-  *service_type = INVALID;
-  for (size_t i = 0; i < arraysize(kValidIceServiceTypes); ++i) {
-    if (in_str.compare(0, colonpos, kValidIceServiceTypes[i]) == 0) {
-      *service_type = static_cast<ServiceType>(i);
-      break;
-    }
-  }
-  if (*service_type == INVALID) {
-    return false;
-  }
-  *hostname = in_str.substr(colonpos + 1, std::string::npos);
-  return true;
-}
-
-static bool ParsePort(const std::string& in_str, int* port) {
-  // Make sure port only contains digits. FromString doesn't check this.
-  for (const char& c : in_str) {
-    if (!std::isdigit(c)) {
-      return false;
-    }
-  }
-  return rtc::FromString(in_str, port);
-}
-
-// This method parses IPv6 and IPv4 literal strings, along with hostnames in
-// standard hostname:port format.
-// Consider following formats as correct.
-// |hostname:port|, |[IPV6 address]:port|, |IPv4 address|:port,
-// |hostname|, |[IPv6 address]|, |IPv4 address|.
-static bool ParseHostnameAndPortFromString(const std::string& in_str,
-                                           std::string* host,
-                                           int* port) {
-  RTC_DCHECK(host->empty());
-  if (in_str.at(0) == '[') {
-    std::string::size_type closebracket = in_str.rfind(']');
-    if (closebracket != std::string::npos) {
-      std::string::size_type colonpos = in_str.find(':', closebracket);
-      if (std::string::npos != colonpos) {
-        if (!ParsePort(in_str.substr(closebracket + 2, std::string::npos),
-                       port)) {
-          return false;
-        }
-      }
-      *host = in_str.substr(1, closebracket - 1);
-    } else {
-      return false;
-    }
-  } else {
-    std::string::size_type colonpos = in_str.find(':');
-    if (std::string::npos != colonpos) {
-      if (!ParsePort(in_str.substr(colonpos + 1, std::string::npos), port)) {
-        return false;
-      }
-      *host = in_str.substr(0, colonpos);
-    } else {
-      *host = in_str;
-    }
-  }
-  return !host->empty();
-}
-
-// Adds a STUN or TURN server to the appropriate list,
-// by parsing |url| and using the username/password in |server|.
-static RTCErrorType ParseIceServerUrl(
-    const PeerConnectionInterface::IceServer& server,
-    const std::string& url,
-    cricket::ServerAddresses* stun_servers,
-    std::vector<cricket::RelayServerConfig>* turn_servers) {
-  // draft-nandakumar-rtcweb-stun-uri-01
-  // stunURI       = scheme ":" stun-host [ ":" stun-port ]
-  // scheme        = "stun" / "stuns"
-  // stun-host     = IP-literal / IPv4address / reg-name
-  // stun-port     = *DIGIT
-
-  // draft-petithuguenin-behave-turn-uris-01
-  // turnURI       = scheme ":" turn-host [ ":" turn-port ]
-  //                 [ "?transport=" transport ]
-  // scheme        = "turn" / "turns"
-  // transport     = "udp" / "tcp" / transport-ext
-  // transport-ext = 1*unreserved
-  // turn-host     = IP-literal / IPv4address / reg-name
-  // turn-port     = *DIGIT
-  RTC_DCHECK(stun_servers != nullptr);
-  RTC_DCHECK(turn_servers != nullptr);
-  std::vector<std::string> tokens;
-  cricket::ProtocolType turn_transport_type = cricket::PROTO_UDP;
-  RTC_DCHECK(!url.empty());
-  rtc::tokenize_with_empty_tokens(url, '?', &tokens);
-  std::string uri_without_transport = tokens[0];
-  // Let's look into transport= param, if it exists.
-  if (tokens.size() == kTurnTransportTokensNum) {  // ?transport= is present.
-    std::string uri_transport_param = tokens[1];
-    rtc::tokenize_with_empty_tokens(uri_transport_param, '=', &tokens);
-    if (tokens[0] != kTransport) {
-      LOG(LS_WARNING) << "Invalid transport parameter key.";
-      return RTCErrorType::SYNTAX_ERROR;
-    }
-    if (tokens.size() < 2) {
-      LOG(LS_WARNING) << "Transport parameter missing value.";
-      return RTCErrorType::SYNTAX_ERROR;
-    }
-    if (!cricket::StringToProto(tokens[1].c_str(), &turn_transport_type) ||
-        (turn_transport_type != cricket::PROTO_UDP &&
-         turn_transport_type != cricket::PROTO_TCP)) {
-      LOG(LS_WARNING) << "Transport parameter should always be udp or tcp.";
-      return RTCErrorType::SYNTAX_ERROR;
-    }
-  }
-
-  std::string hoststring;
-  ServiceType service_type;
-  if (!GetServiceTypeAndHostnameFromUri(uri_without_transport, &service_type,
-                                        &hoststring)) {
-    LOG(LS_WARNING) << "Invalid transport parameter in ICE URI: " << url;
-    return RTCErrorType::SYNTAX_ERROR;
-  }
-
-  // GetServiceTypeAndHostnameFromUri should never give an empty hoststring
-  RTC_DCHECK(!hoststring.empty());
-
-  // Let's break hostname.
-  tokens.clear();
-  rtc::tokenize_with_empty_tokens(hoststring, '@', &tokens);
-
-  std::string username(server.username);
-  if (tokens.size() > kTurnHostTokensNum) {
-    LOG(LS_WARNING) << "Invalid user@hostname format: " << hoststring;
-    return RTCErrorType::SYNTAX_ERROR;
-  }
-  if (tokens.size() == kTurnHostTokensNum) {
-    if (tokens[0].empty() || tokens[1].empty()) {
-      LOG(LS_WARNING) << "Invalid user@hostname format: " << hoststring;
-      return RTCErrorType::SYNTAX_ERROR;
-    }
-    username.assign(rtc::s_url_decode(tokens[0]));
-    hoststring = tokens[1];
-  } else {
-    hoststring = tokens[0];
-  }
-
-  int port = kDefaultStunPort;
-  if (service_type == TURNS) {
-    port = kDefaultStunTlsPort;
-    turn_transport_type = cricket::PROTO_TLS;
-  }
-
-  std::string address;
-  if (!ParseHostnameAndPortFromString(hoststring, &address, &port)) {
-    LOG(WARNING) << "Invalid hostname format: " << uri_without_transport;
-    return RTCErrorType::SYNTAX_ERROR;
-  }
-
-  if (port <= 0 || port > 0xffff) {
-    LOG(WARNING) << "Invalid port: " << port;
-    return RTCErrorType::SYNTAX_ERROR;
-  }
-
-  switch (service_type) {
-    case STUN:
-    case STUNS:
-      stun_servers->insert(rtc::SocketAddress(address, port));
-      break;
-    case TURN:
-    case TURNS: {
-      if (username.empty() || server.password.empty()) {
-        // The WebRTC spec requires throwing an InvalidAccessError when username
-        // or credential are ommitted; this is the native equivalent.
-        return RTCErrorType::INVALID_PARAMETER;
-      }
-      // If the hostname field is not empty, then the server address must be
-      // the resolved IP for that host, the hostname is needed later for TLS
-      // handshake (SNI and Certificate verification).
-      const std::string& hostname =
-          server.hostname.empty() ? address : server.hostname;
-      rtc::SocketAddress socket_address(hostname, port);
-      if (!server.hostname.empty()) {
-        rtc::IPAddress ip;
-        if (!IPFromString(address, &ip)) {
-          // When hostname is set, the server address must be a
-          // resolved ip address.
-          LOG(LS_ERROR) << "IceServer has hostname field set, but URI does not "
-                           "contain an IP address.";
-          return RTCErrorType::INVALID_PARAMETER;
-        }
-        socket_address.SetResolvedIP(ip);
-      }
-      cricket::RelayServerConfig config = cricket::RelayServerConfig(
-          socket_address, username, server.password, turn_transport_type);
-      if (server.tls_cert_policy ==
-          PeerConnectionInterface::kTlsCertPolicyInsecureNoCheck) {
-        config.tls_cert_policy =
-            cricket::TlsCertPolicy::TLS_CERT_POLICY_INSECURE_NO_CHECK;
-      }
-      config.tls_alpn_protocols = server.tls_alpn_protocols;
-      config.tls_elliptic_curves = server.tls_elliptic_curves;
-
-      turn_servers->push_back(config);
-      break;
-    }
-    default:
-      // We shouldn't get to this point with an invalid service_type, we should
-      // have returned an error already.
-      RTC_NOTREACHED() << "Unexpected service type";
-      return RTCErrorType::INTERNAL_ERROR;
-  }
-  return RTCErrorType::NONE;
-}
-
-RTCErrorType ParseIceServers(
-    const PeerConnectionInterface::IceServers& servers,
-    cricket::ServerAddresses* stun_servers,
-    std::vector<cricket::RelayServerConfig>* turn_servers) {
-  for (const PeerConnectionInterface::IceServer& server : servers) {
-    if (!server.urls.empty()) {
-      for (const std::string& url : server.urls) {
-        if (url.empty()) {
-          LOG(LS_ERROR) << "Empty uri.";
-          return RTCErrorType::SYNTAX_ERROR;
-        }
-        RTCErrorType err =
-            ParseIceServerUrl(server, url, stun_servers, turn_servers);
-        if (err != RTCErrorType::NONE) {
-          return err;
-        }
-      }
-    } else if (!server.uri.empty()) {
-      // Fallback to old .uri if new .urls isn't present.
-      RTCErrorType err =
-          ParseIceServerUrl(server, server.uri, stun_servers, turn_servers);
-      if (err != RTCErrorType::NONE) {
-        return err;
-      }
-    } else {
-      LOG(LS_ERROR) << "Empty uri.";
-      return RTCErrorType::SYNTAX_ERROR;
-    }
-  }
-  // Candidates must have unique priorities, so that connectivity checks
-  // are performed in a well-defined order.
-  int priority = static_cast<int>(turn_servers->size() - 1);
-  for (cricket::RelayServerConfig& turn_server : *turn_servers) {
-    // First in the list gets highest priority.
-    turn_server.priority = priority--;
-  }
-  return RTCErrorType::NONE;
-}
-
-}  // namespace webrtc
diff --git a/pc/iceserverparsing.h b/pc/iceserverparsing.h
deleted file mode 100644
index c8feefd..0000000
--- a/pc/iceserverparsing.h
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- *  Copyright 2017 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_PC_ICESERVERPARSING_H_
-#define WEBRTC_PC_ICESERVERPARSING_H_
-
-#include <vector>
-
-#include "webrtc/api/peerconnectioninterface.h"
-#include "webrtc/api/rtcerror.h"
-
-namespace webrtc {
-
-// Parses the URLs for each server in |servers| to build |stun_servers| and
-// |turn_servers|. Can return SYNTAX_ERROR if the URL is malformed, or
-// INVALID_PARAMETER if a TURN server is missing |username| or |password|.
-//
-// Intended to be used to convert/validate the servers passed into a
-// PeerConnection through RTCConfiguration.
-RTCErrorType ParseIceServers(
-    const PeerConnectionInterface::IceServers& servers,
-    cricket::ServerAddresses* stun_servers,
-    std::vector<cricket::RelayServerConfig>* turn_servers);
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_PC_ICESERVERPARSING_H_
diff --git a/pc/iceserverparsing_unittest.cc b/pc/iceserverparsing_unittest.cc
deleted file mode 100644
index d433963..0000000
--- a/pc/iceserverparsing_unittest.cc
+++ /dev/null
@@ -1,252 +0,0 @@
-/*
- *  Copyright 2012 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 <string>
-#include <vector>
-
-#include "webrtc/pc/iceserverparsing.h"
-#include "webrtc/rtc_base/gunit.h"
-
-namespace webrtc {
-
-class IceServerParsingTest : public testing::Test {
- public:
-  // Convenience functions for parsing a single URL. Result is stored in
-  // |stun_servers_| and |turn_servers_|.
-  bool ParseUrl(const std::string& url) {
-    return ParseUrl(url, std::string(), std::string());
-  }
-
-  bool ParseTurnUrl(const std::string& url) {
-    return ParseUrl(url, "username", "password");
-  }
-
-  bool ParseUrl(const std::string& url,
-                const std::string& username,
-                const std::string& password) {
-    return ParseUrl(
-        url, username, password,
-        PeerConnectionInterface::TlsCertPolicy::kTlsCertPolicySecure);
-  }
-
-  bool ParseUrl(const std::string& url,
-                const std::string& username,
-                const std::string& password,
-                PeerConnectionInterface::TlsCertPolicy tls_certificate_policy) {
-    return ParseUrl(url, username, password, tls_certificate_policy, "");
-  }
-
-  bool ParseUrl(const std::string& url,
-                const std::string& username,
-                const std::string& password,
-                PeerConnectionInterface::TlsCertPolicy tls_certificate_policy,
-                const std::string& hostname) {
-    stun_servers_.clear();
-    turn_servers_.clear();
-    PeerConnectionInterface::IceServers servers;
-    PeerConnectionInterface::IceServer server;
-    server.urls.push_back(url);
-    server.username = username;
-    server.password = password;
-    server.tls_cert_policy = tls_certificate_policy;
-    server.hostname = hostname;
-    servers.push_back(server);
-    return webrtc::ParseIceServers(servers, &stun_servers_, &turn_servers_) ==
-           webrtc::RTCErrorType::NONE;
-  }
-
- protected:
-  cricket::ServerAddresses stun_servers_;
-  std::vector<cricket::RelayServerConfig> turn_servers_;
-};
-
-// Make sure all STUN/TURN prefixes are parsed correctly.
-TEST_F(IceServerParsingTest, ParseStunPrefixes) {
-  EXPECT_TRUE(ParseUrl("stun:hostname"));
-  EXPECT_EQ(1U, stun_servers_.size());
-  EXPECT_EQ(0U, turn_servers_.size());
-
-  EXPECT_TRUE(ParseUrl("stuns:hostname"));
-  EXPECT_EQ(1U, stun_servers_.size());
-  EXPECT_EQ(0U, turn_servers_.size());
-
-  EXPECT_TRUE(ParseTurnUrl("turn:hostname"));
-  EXPECT_EQ(0U, stun_servers_.size());
-  EXPECT_EQ(1U, turn_servers_.size());
-  EXPECT_EQ(cricket::PROTO_UDP, turn_servers_[0].ports[0].proto);
-
-  EXPECT_TRUE(ParseTurnUrl("turns:hostname"));
-  EXPECT_EQ(0U, stun_servers_.size());
-  EXPECT_EQ(1U, turn_servers_.size());
-  EXPECT_EQ(cricket::PROTO_TLS, turn_servers_[0].ports[0].proto);
-  EXPECT_TRUE(turn_servers_[0].tls_cert_policy ==
-              cricket::TlsCertPolicy::TLS_CERT_POLICY_SECURE);
-
-  EXPECT_TRUE(ParseUrl(
-      "turns:hostname", "username", "password",
-      PeerConnectionInterface::TlsCertPolicy::kTlsCertPolicyInsecureNoCheck));
-  EXPECT_EQ(0U, stun_servers_.size());
-  EXPECT_EQ(1U, turn_servers_.size());
-  EXPECT_TRUE(turn_servers_[0].tls_cert_policy ==
-              cricket::TlsCertPolicy::TLS_CERT_POLICY_INSECURE_NO_CHECK);
-  EXPECT_EQ(cricket::PROTO_TLS, turn_servers_[0].ports[0].proto);
-
-  // invalid prefixes
-  EXPECT_FALSE(ParseUrl("stunn:hostname"));
-  EXPECT_FALSE(ParseUrl(":hostname"));
-  EXPECT_FALSE(ParseUrl(":"));
-  EXPECT_FALSE(ParseUrl(""));
-}
-
-TEST_F(IceServerParsingTest, VerifyDefaults) {
-  // TURNS defaults
-  EXPECT_TRUE(ParseTurnUrl("turns:hostname"));
-  EXPECT_EQ(1U, turn_servers_.size());
-  EXPECT_EQ(5349, turn_servers_[0].ports[0].address.port());
-  EXPECT_EQ(cricket::PROTO_TLS, turn_servers_[0].ports[0].proto);
-
-  // TURN defaults
-  EXPECT_TRUE(ParseTurnUrl("turn:hostname"));
-  EXPECT_EQ(1U, turn_servers_.size());
-  EXPECT_EQ(3478, turn_servers_[0].ports[0].address.port());
-  EXPECT_EQ(cricket::PROTO_UDP, turn_servers_[0].ports[0].proto);
-
-  // STUN defaults
-  EXPECT_TRUE(ParseUrl("stun:hostname"));
-  EXPECT_EQ(1U, stun_servers_.size());
-  EXPECT_EQ(3478, stun_servers_.begin()->port());
-}
-
-// Check that the 6 combinations of IPv4/IPv6/hostname and with/without port
-// can be parsed correctly.
-TEST_F(IceServerParsingTest, ParseHostnameAndPort) {
-  EXPECT_TRUE(ParseUrl("stun:1.2.3.4:1234"));
-  EXPECT_EQ(1U, stun_servers_.size());
-  EXPECT_EQ("1.2.3.4", stun_servers_.begin()->hostname());
-  EXPECT_EQ(1234, stun_servers_.begin()->port());
-
-  EXPECT_TRUE(ParseUrl("stun:[1:2:3:4:5:6:7:8]:4321"));
-  EXPECT_EQ(1U, stun_servers_.size());
-  EXPECT_EQ("1:2:3:4:5:6:7:8", stun_servers_.begin()->hostname());
-  EXPECT_EQ(4321, stun_servers_.begin()->port());
-
-  EXPECT_TRUE(ParseUrl("stun:hostname:9999"));
-  EXPECT_EQ(1U, stun_servers_.size());
-  EXPECT_EQ("hostname", stun_servers_.begin()->hostname());
-  EXPECT_EQ(9999, stun_servers_.begin()->port());
-
-  EXPECT_TRUE(ParseUrl("stun:1.2.3.4"));
-  EXPECT_EQ(1U, stun_servers_.size());
-  EXPECT_EQ("1.2.3.4", stun_servers_.begin()->hostname());
-  EXPECT_EQ(3478, stun_servers_.begin()->port());
-
-  EXPECT_TRUE(ParseUrl("stun:[1:2:3:4:5:6:7:8]"));
-  EXPECT_EQ(1U, stun_servers_.size());
-  EXPECT_EQ("1:2:3:4:5:6:7:8", stun_servers_.begin()->hostname());
-  EXPECT_EQ(3478, stun_servers_.begin()->port());
-
-  EXPECT_TRUE(ParseUrl("stun:hostname"));
-  EXPECT_EQ(1U, stun_servers_.size());
-  EXPECT_EQ("hostname", stun_servers_.begin()->hostname());
-  EXPECT_EQ(3478, stun_servers_.begin()->port());
-
-  // Both TURN IP and host exist
-  EXPECT_TRUE(
-      ParseUrl("turn:1.2.3.4:1234", "username", "password",
-               PeerConnectionInterface::TlsCertPolicy::kTlsCertPolicySecure,
-               "hostname"));
-  EXPECT_EQ(1U, turn_servers_.size());
-  rtc::SocketAddress address = turn_servers_[0].ports[0].address;
-  EXPECT_EQ("hostname", address.hostname());
-  EXPECT_EQ(1234, address.port());
-  EXPECT_FALSE(address.IsUnresolvedIP());
-  EXPECT_EQ("1.2.3.4", address.ipaddr().ToString());
-
-  // Try some invalid hostname:port strings.
-  EXPECT_FALSE(ParseUrl("stun:hostname:99a99"));
-  EXPECT_FALSE(ParseUrl("stun:hostname:-1"));
-  EXPECT_FALSE(ParseUrl("stun:hostname:port:more"));
-  EXPECT_FALSE(ParseUrl("stun:hostname:port more"));
-  EXPECT_FALSE(ParseUrl("stun:hostname:"));
-  EXPECT_FALSE(ParseUrl("stun:[1:2:3:4:5:6:7:8]junk:1000"));
-  EXPECT_FALSE(ParseUrl("stun::5555"));
-  EXPECT_FALSE(ParseUrl("stun:"));
-}
-
-// Test parsing the "?transport=xxx" part of the URL.
-TEST_F(IceServerParsingTest, ParseTransport) {
-  EXPECT_TRUE(ParseTurnUrl("turn:hostname:1234?transport=tcp"));
-  EXPECT_EQ(1U, turn_servers_.size());
-  EXPECT_EQ(cricket::PROTO_TCP, turn_servers_[0].ports[0].proto);
-
-  EXPECT_TRUE(ParseTurnUrl("turn:hostname?transport=udp"));
-  EXPECT_EQ(1U, turn_servers_.size());
-  EXPECT_EQ(cricket::PROTO_UDP, turn_servers_[0].ports[0].proto);
-
-  EXPECT_FALSE(ParseTurnUrl("turn:hostname?transport=invalid"));
-  EXPECT_FALSE(ParseTurnUrl("turn:hostname?transport="));
-  EXPECT_FALSE(ParseTurnUrl("turn:hostname?="));
-  EXPECT_FALSE(ParseTurnUrl("turn:hostname?"));
-  EXPECT_FALSE(ParseTurnUrl("?"));
-}
-
-// Test parsing ICE username contained in URL.
-TEST_F(IceServerParsingTest, ParseUsername) {
-  EXPECT_TRUE(ParseTurnUrl("turn:user@hostname"));
-  EXPECT_EQ(1U, turn_servers_.size());
-  EXPECT_EQ("user", turn_servers_[0].credentials.username);
-
-  EXPECT_FALSE(ParseTurnUrl("turn:@hostname"));
-  EXPECT_FALSE(ParseTurnUrl("turn:username@"));
-  EXPECT_FALSE(ParseTurnUrl("turn:@"));
-  EXPECT_FALSE(ParseTurnUrl("turn:user@name@hostname"));
-}
-
-// Test that username and password from IceServer is copied into the resulting
-// RelayServerConfig.
-TEST_F(IceServerParsingTest, CopyUsernameAndPasswordFromIceServer) {
-  EXPECT_TRUE(ParseUrl("turn:hostname", "username", "password"));
-  EXPECT_EQ(1U, turn_servers_.size());
-  EXPECT_EQ("username", turn_servers_[0].credentials.username);
-  EXPECT_EQ("password", turn_servers_[0].credentials.password);
-}
-
-// Ensure that if a server has multiple URLs, each one is parsed.
-TEST_F(IceServerParsingTest, ParseMultipleUrls) {
-  PeerConnectionInterface::IceServers servers;
-  PeerConnectionInterface::IceServer server;
-  server.urls.push_back("stun:hostname");
-  server.urls.push_back("turn:hostname");
-  server.username = "foo";
-  server.password = "bar";
-  servers.push_back(server);
-  EXPECT_EQ(webrtc::RTCErrorType::NONE,
-            webrtc::ParseIceServers(servers, &stun_servers_, &turn_servers_));
-  EXPECT_EQ(1U, stun_servers_.size());
-  EXPECT_EQ(1U, turn_servers_.size());
-}
-
-// Ensure that TURN servers are given unique priorities,
-// so that their resulting candidates have unique priorities.
-TEST_F(IceServerParsingTest, TurnServerPrioritiesUnique) {
-  PeerConnectionInterface::IceServers servers;
-  PeerConnectionInterface::IceServer server;
-  server.urls.push_back("turn:hostname");
-  server.urls.push_back("turn:hostname2");
-  server.username = "foo";
-  server.password = "bar";
-  servers.push_back(server);
-  EXPECT_EQ(webrtc::RTCErrorType::NONE,
-            webrtc::ParseIceServers(servers, &stun_servers_, &turn_servers_));
-  EXPECT_EQ(2U, turn_servers_.size());
-  EXPECT_NE(turn_servers_[0].priority, turn_servers_[1].priority);
-}
-
-}  // namespace webrtc
diff --git a/pc/jsepicecandidate.cc b/pc/jsepicecandidate.cc
deleted file mode 100644
index dbe05e4..0000000
--- a/pc/jsepicecandidate.cc
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- *  Copyright 2012 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/api/jsepicecandidate.h"
-
-#include <vector>
-
-#include "webrtc/pc/webrtcsdp.h"
-#include "webrtc/rtc_base/stringencode.h"
-
-namespace webrtc {
-
-IceCandidateInterface* CreateIceCandidate(const std::string& sdp_mid,
-                                          int sdp_mline_index,
-                                          const std::string& sdp,
-                                          SdpParseError* error) {
-  JsepIceCandidate* jsep_ice = new JsepIceCandidate(sdp_mid, sdp_mline_index);
-  if (!jsep_ice->Initialize(sdp, error)) {
-    delete jsep_ice;
-    return NULL;
-  }
-  return jsep_ice;
-}
-
-JsepIceCandidate::JsepIceCandidate(const std::string& sdp_mid,
-                                   int sdp_mline_index)
-    : sdp_mid_(sdp_mid),
-      sdp_mline_index_(sdp_mline_index) {
-}
-
-JsepIceCandidate::JsepIceCandidate(const std::string& sdp_mid,
-                                   int sdp_mline_index,
-                                   const cricket::Candidate& candidate)
-    : sdp_mid_(sdp_mid),
-      sdp_mline_index_(sdp_mline_index),
-      candidate_(candidate) {
-}
-
-JsepIceCandidate::~JsepIceCandidate() {
-}
-
-bool JsepIceCandidate::Initialize(const std::string& sdp, SdpParseError* err) {
-  return SdpDeserializeCandidate(sdp, this, err);
-}
-
-bool JsepIceCandidate::ToString(std::string* out) const {
-  if (!out)
-    return false;
-  *out = SdpSerializeCandidate(*this);
-  return !out->empty();
-}
-
-JsepCandidateCollection::~JsepCandidateCollection() {
-  for (std::vector<JsepIceCandidate*>::iterator it = candidates_.begin();
-       it != candidates_.end(); ++it) {
-    delete *it;
-  }
-}
-
-bool JsepCandidateCollection::HasCandidate(
-    const IceCandidateInterface* candidate) const {
-  bool ret = false;
-  for (std::vector<JsepIceCandidate*>::const_iterator it = candidates_.begin();
-      it != candidates_.end(); ++it) {
-    if ((*it)->sdp_mid() == candidate->sdp_mid() &&
-        (*it)->sdp_mline_index() == candidate->sdp_mline_index() &&
-        (*it)->candidate().IsEquivalent(candidate->candidate())) {
-      ret = true;
-      break;
-    }
-  }
-  return ret;
-}
-
-size_t JsepCandidateCollection::remove(const cricket::Candidate& candidate) {
-  auto iter = std::find_if(candidates_.begin(), candidates_.end(),
-                           [candidate](JsepIceCandidate* c) {
-                             return candidate.MatchesForRemoval(c->candidate());
-                           });
-  if (iter != candidates_.end()) {
-    delete *iter;
-    candidates_.erase(iter);
-    return 1;
-  }
-  return 0;
-}
-
-}  // namespace webrtc
diff --git a/pc/jsepsessiondescription.cc b/pc/jsepsessiondescription.cc
deleted file mode 100644
index bdb3695..0000000
--- a/pc/jsepsessiondescription.cc
+++ /dev/null
@@ -1,269 +0,0 @@
-/*
- *  Copyright 2012 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/api/jsepsessiondescription.h"
-
-#include <memory>
-
-#include "webrtc/pc/mediasession.h"
-#include "webrtc/pc/webrtcsdp.h"
-#include "webrtc/rtc_base/arraysize.h"
-#include "webrtc/rtc_base/stringencode.h"
-
-using cricket::SessionDescription;
-
-namespace webrtc {
-
-static const char* kSupportedTypes[] = {
-    JsepSessionDescription::kOffer,
-    JsepSessionDescription::kPrAnswer,
-    JsepSessionDescription::kAnswer
-};
-
-static bool IsTypeSupported(const std::string& type) {
-  bool type_supported = false;
-  for (size_t i = 0; i < arraysize(kSupportedTypes); ++i) {
-    if (kSupportedTypes[i] == type) {
-      type_supported = true;
-      break;
-    }
-  }
-  return type_supported;
-}
-
-// RFC 5245
-// It is RECOMMENDED that default candidates be chosen based on the
-// likelihood of those candidates to work with the peer that is being
-// contacted.  It is RECOMMENDED that relayed > reflexive > host.
-static const int kPreferenceUnknown = 0;
-static const int kPreferenceHost = 1;
-static const int kPreferenceReflexive = 2;
-static const int kPreferenceRelayed = 3;
-
-static const char kDummyAddress[] = "0.0.0.0";
-static const int kDummyPort = 9;
-
-static int GetCandidatePreferenceFromType(const std::string& type) {
-  int preference = kPreferenceUnknown;
-  if (type == cricket::LOCAL_PORT_TYPE) {
-    preference = kPreferenceHost;
-  } else if (type == cricket::STUN_PORT_TYPE) {
-    preference = kPreferenceReflexive;
-  } else if (type == cricket::RELAY_PORT_TYPE) {
-    preference = kPreferenceRelayed;
-  } else {
-    preference = kPreferenceUnknown;
-  }
-  return preference;
-}
-
-// Update the connection address for the MediaContentDescription based on the
-// candidates.
-static void UpdateConnectionAddress(
-    const JsepCandidateCollection& candidate_collection,
-    cricket::ContentDescription* content_description) {
-  int port = kDummyPort;
-  std::string ip = kDummyAddress;
-  int current_preference = kPreferenceUnknown;
-  int current_family = AF_UNSPEC;
-  for (size_t i = 0; i < candidate_collection.count(); ++i) {
-    const IceCandidateInterface* jsep_candidate = candidate_collection.at(i);
-    if (jsep_candidate->candidate().component() !=
-        cricket::ICE_CANDIDATE_COMPONENT_RTP) {
-      continue;
-    }
-    // Default destination should be UDP only.
-    if (jsep_candidate->candidate().protocol() != cricket::UDP_PROTOCOL_NAME) {
-      continue;
-    }
-    const int preference =
-        GetCandidatePreferenceFromType(jsep_candidate->candidate().type());
-    const int family = jsep_candidate->candidate().address().ipaddr().family();
-    // See if this candidate is more preferable then the current one if it's the
-    // same family. Or if the current family is IPv4 already so we could safely
-    // ignore all IPv6 ones. WebRTC bug 4269.
-    // http://code.google.com/p/webrtc/issues/detail?id=4269
-    if ((preference <= current_preference && current_family == family) ||
-        (current_family == AF_INET && family == AF_INET6)) {
-      continue;
-    }
-    current_preference = preference;
-    current_family = family;
-    port = jsep_candidate->candidate().address().port();
-    ip = jsep_candidate->candidate().address().ipaddr().ToString();
-  }
-  rtc::SocketAddress connection_addr;
-  connection_addr.SetIP(ip);
-  connection_addr.SetPort(port);
-  static_cast<cricket::MediaContentDescription*>(content_description)
-      ->set_connection_address(connection_addr);
-}
-
-const char SessionDescriptionInterface::kOffer[] = "offer";
-const char SessionDescriptionInterface::kPrAnswer[] = "pranswer";
-const char SessionDescriptionInterface::kAnswer[] = "answer";
-
-const int JsepSessionDescription::kDefaultVideoCodecId = 100;
-const char JsepSessionDescription::kDefaultVideoCodecName[] = "VP8";
-
-SessionDescriptionInterface* CreateSessionDescription(const std::string& type,
-                                                      const std::string& sdp,
-                                                      SdpParseError* error) {
-  if (!IsTypeSupported(type)) {
-    return NULL;
-  }
-
-  JsepSessionDescription* jsep_desc = new JsepSessionDescription(type);
-  if (!SdpDeserialize(sdp, jsep_desc, error)) {
-    delete jsep_desc;
-    return NULL;
-  }
-  return jsep_desc;
-}
-
-JsepSessionDescription::JsepSessionDescription(const std::string& type)
-    : type_(type) {
-}
-
-JsepSessionDescription::~JsepSessionDescription() {}
-
-bool JsepSessionDescription::Initialize(
-    cricket::SessionDescription* description,
-    const std::string& session_id,
-    const std::string& session_version) {
-  if (!description)
-    return false;
-
-  session_id_ = session_id;
-  session_version_ = session_version;
-  description_.reset(description);
-  candidate_collection_.resize(number_of_mediasections());
-  return true;
-}
-
-bool JsepSessionDescription::AddCandidate(
-    const IceCandidateInterface* candidate) {
-  if (!candidate || candidate->sdp_mline_index() < 0)
-    return false;
-  size_t mediasection_index = 0;
-  if (!GetMediasectionIndex(candidate, &mediasection_index)) {
-    return false;
-  }
-  if (mediasection_index >= number_of_mediasections())
-    return false;
-  const std::string& content_name =
-      description_->contents()[mediasection_index].name;
-  const cricket::TransportInfo* transport_info =
-      description_->GetTransportInfoByName(content_name);
-  if (!transport_info) {
-    return false;
-  }
-
-  cricket::Candidate updated_candidate = candidate->candidate();
-  if (updated_candidate.username().empty()) {
-    updated_candidate.set_username(transport_info->description.ice_ufrag);
-  }
-  if (updated_candidate.password().empty()) {
-    updated_candidate.set_password(transport_info->description.ice_pwd);
-  }
-
-  std::unique_ptr<JsepIceCandidate> updated_candidate_wrapper(
-      new JsepIceCandidate(candidate->sdp_mid(),
-                           static_cast<int>(mediasection_index),
-                           updated_candidate));
-  if (!candidate_collection_[mediasection_index].HasCandidate(
-          updated_candidate_wrapper.get())) {
-    candidate_collection_[mediasection_index].add(
-        updated_candidate_wrapper.release());
-    UpdateConnectionAddress(
-        candidate_collection_[mediasection_index],
-        description_->contents()[mediasection_index].description);
-  }
-
-  return true;
-}
-
-size_t JsepSessionDescription::RemoveCandidates(
-    const std::vector<cricket::Candidate>& candidates) {
-  size_t num_removed = 0;
-  for (auto& candidate : candidates) {
-    int mediasection_index = GetMediasectionIndex(candidate);
-    if (mediasection_index < 0) {
-      // Not found.
-      continue;
-    }
-    num_removed += candidate_collection_[mediasection_index].remove(candidate);
-    UpdateConnectionAddress(
-        candidate_collection_[mediasection_index],
-        description_->contents()[mediasection_index].description);
-  }
-  return num_removed;
-}
-
-size_t JsepSessionDescription::number_of_mediasections() const {
-  if (!description_)
-    return 0;
-  return description_->contents().size();
-}
-
-const IceCandidateCollection* JsepSessionDescription::candidates(
-    size_t mediasection_index) const {
-  if (mediasection_index >= candidate_collection_.size())
-    return NULL;
-  return &candidate_collection_[mediasection_index];
-}
-
-bool JsepSessionDescription::ToString(std::string* out) const {
-  if (!description_ || !out) {
-    return false;
-  }
-  *out = SdpSerialize(*this, false);
-  return !out->empty();
-}
-
-bool JsepSessionDescription::GetMediasectionIndex(
-    const IceCandidateInterface* candidate,
-    size_t* index) {
-  if (!candidate || !index) {
-    return false;
-  }
-  *index = static_cast<size_t>(candidate->sdp_mline_index());
-  if (description_ && !candidate->sdp_mid().empty()) {
-    bool found = false;
-    // Try to match the sdp_mid with content name.
-    for (size_t i = 0; i < description_->contents().size(); ++i) {
-      if (candidate->sdp_mid() == description_->contents().at(i).name) {
-        *index = i;
-        found = true;
-        break;
-      }
-    }
-    if (!found) {
-      // If the sdp_mid is presented but we can't find a match, we consider
-      // this as an error.
-      return false;
-    }
-  }
-  return true;
-}
-
-int JsepSessionDescription::GetMediasectionIndex(
-    const cricket::Candidate& candidate) {
-  // Find the description with a matching transport name of the candidate.
-  const std::string& transport_name = candidate.transport_name();
-  for (size_t i = 0; i < description_->contents().size(); ++i) {
-    if (transport_name == description_->contents().at(i).name) {
-      return static_cast<int>(i);
-    }
-  }
-  return -1;
-}
-
-}  // namespace webrtc
diff --git a/pc/jsepsessiondescription_unittest.cc b/pc/jsepsessiondescription_unittest.cc
deleted file mode 100644
index 62052af..0000000
--- a/pc/jsepsessiondescription_unittest.cc
+++ /dev/null
@@ -1,408 +0,0 @@
-/*
- *  Copyright 2012 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 <memory>
-#include <string>
-
-#include "webrtc/api/jsepicecandidate.h"
-#include "webrtc/api/jsepsessiondescription.h"
-#include "webrtc/api/webrtcsdp.h"
-#include "webrtc/p2p/base/candidate.h"
-#include "webrtc/p2p/base/p2pconstants.h"
-#include "webrtc/p2p/base/sessiondescription.h"
-#include "webrtc/pc/mediasession.h"
-#include "webrtc/rtc_base/gunit.h"
-#include "webrtc/rtc_base/helpers.h"
-#include "webrtc/rtc_base/ssladapter.h"
-#include "webrtc/rtc_base/stringencode.h"
-
-using webrtc::IceCandidateCollection;
-using webrtc::IceCandidateInterface;
-using webrtc::JsepIceCandidate;
-using webrtc::JsepSessionDescription;
-using webrtc::SessionDescriptionInterface;
-
-static const char kCandidateUfrag[] = "ufrag";
-static const char kCandidatePwd[] = "pwd";
-static const char kCandidateUfragVoice[] = "ufrag_voice";
-static const char kCandidatePwdVoice[] = "pwd_voice";
-static const char kCandidateUfragVideo[] = "ufrag_video";
-static const char kCandidatePwdVideo[] = "pwd_video";
-static const char kCandidateFoundation[] = "a0+B/1";
-static const uint32_t kCandidatePriority = 2130706432U;  // pref = 1.0
-static const uint32_t kCandidateGeneration = 2;
-
-// This creates a session description with both audio and video media contents.
-// In SDP this is described by two m lines, one audio and one video.
-static cricket::SessionDescription* CreateCricketSessionDescription() {
-  cricket::SessionDescription* desc(new cricket::SessionDescription());
-  // AudioContentDescription
-  std::unique_ptr<cricket::AudioContentDescription> audio(
-      new cricket::AudioContentDescription());
-
-  // VideoContentDescription
-  std::unique_ptr<cricket::VideoContentDescription> video(
-      new cricket::VideoContentDescription());
-
-  audio->AddCodec(cricket::AudioCodec(103, "ISAC", 16000, 0, 0));
-  desc->AddContent(cricket::CN_AUDIO, cricket::NS_JINGLE_RTP,
-                   audio.release());
-
-  video->AddCodec(cricket::VideoCodec(120, "VP8"));
-  desc->AddContent(cricket::CN_VIDEO, cricket::NS_JINGLE_RTP,
-                   video.release());
-
-  EXPECT_TRUE(desc->AddTransportInfo(cricket::TransportInfo(
-      cricket::CN_AUDIO,
-      cricket::TransportDescription(
-          std::vector<std::string>(), kCandidateUfragVoice, kCandidatePwdVoice,
-          cricket::ICEMODE_FULL, cricket::CONNECTIONROLE_NONE, NULL))));
-  EXPECT_TRUE(desc->AddTransportInfo(cricket::TransportInfo(
-      cricket::CN_VIDEO,
-      cricket::TransportDescription(
-          std::vector<std::string>(), kCandidateUfragVideo, kCandidatePwdVideo,
-          cricket::ICEMODE_FULL, cricket::CONNECTIONROLE_NONE, NULL))));
-  return desc;
-}
-
-class JsepSessionDescriptionTest : public testing::Test {
- protected:
-  virtual void SetUp() {
-    int port = 1234;
-    rtc::SocketAddress address("127.0.0.1", port++);
-    cricket::Candidate candidate(cricket::ICE_CANDIDATE_COMPONENT_RTP, "udp",
-                                 address, 1, "", "", "local", 0, "1");
-    candidate_ = candidate;
-    const std::string session_id =
-        rtc::ToString(rtc::CreateRandomId64());
-    const std::string session_version =
-        rtc::ToString(rtc::CreateRandomId());
-    jsep_desc_.reset(new JsepSessionDescription("dummy"));
-    ASSERT_TRUE(jsep_desc_->Initialize(CreateCricketSessionDescription(),
-        session_id, session_version));
-  }
-
-  std::string Serialize(const SessionDescriptionInterface* desc) {
-    std::string sdp;
-    EXPECT_TRUE(desc->ToString(&sdp));
-    EXPECT_FALSE(sdp.empty());
-    return sdp;
-  }
-
-  SessionDescriptionInterface* DeSerialize(const std::string& sdp) {
-    JsepSessionDescription* desc(new JsepSessionDescription("dummy"));
-    EXPECT_TRUE(webrtc::SdpDeserialize(sdp, desc, nullptr));
-    return desc;
-  }
-
-  cricket::Candidate candidate_;
-  std::unique_ptr<JsepSessionDescription> jsep_desc_;
-};
-
-// Test that number_of_mediasections() returns the number of media contents in
-// a session description.
-TEST_F(JsepSessionDescriptionTest, CheckSessionDescription) {
-  EXPECT_EQ(2u, jsep_desc_->number_of_mediasections());
-}
-
-// Test that we can add a candidate to a session description without MID.
-TEST_F(JsepSessionDescriptionTest, AddCandidateWithoutMid) {
-  JsepIceCandidate jsep_candidate("", 0, candidate_);
-  EXPECT_TRUE(jsep_desc_->AddCandidate(&jsep_candidate));
-  const IceCandidateCollection* ice_candidates = jsep_desc_->candidates(0);
-  ASSERT_TRUE(ice_candidates != NULL);
-  EXPECT_EQ(1u, ice_candidates->count());
-  const IceCandidateInterface* ice_candidate = ice_candidates->at(0);
-  ASSERT_TRUE(ice_candidate != NULL);
-  candidate_.set_username(kCandidateUfragVoice);
-  candidate_.set_password(kCandidatePwdVoice);
-  EXPECT_TRUE(ice_candidate->candidate().IsEquivalent(candidate_));
-  EXPECT_EQ(0, ice_candidate->sdp_mline_index());
-  EXPECT_EQ(0u, jsep_desc_->candidates(1)->count());
-}
-
-// Test that we can add and remove candidates to a session description with
-// MID. Removing candidates requires MID (transport_name).
-TEST_F(JsepSessionDescriptionTest, AddAndRemoveCandidatesWithMid) {
-  // mid and m-line index don't match, in this case mid is preferred.
-  std::string mid = "video";
-  JsepIceCandidate jsep_candidate(mid, 0, candidate_);
-  EXPECT_TRUE(jsep_desc_->AddCandidate(&jsep_candidate));
-  EXPECT_EQ(0u, jsep_desc_->candidates(0)->count());
-  const IceCandidateCollection* ice_candidates = jsep_desc_->candidates(1);
-  ASSERT_TRUE(ice_candidates != NULL);
-  EXPECT_EQ(1u, ice_candidates->count());
-  const IceCandidateInterface* ice_candidate = ice_candidates->at(0);
-  ASSERT_TRUE(ice_candidate != NULL);
-  candidate_.set_username(kCandidateUfragVideo);
-  candidate_.set_password(kCandidatePwdVideo);
-  EXPECT_TRUE(ice_candidate->candidate().IsEquivalent(candidate_));
-  // The mline index should have been updated according to mid.
-  EXPECT_EQ(1, ice_candidate->sdp_mline_index());
-
-  std::vector<cricket::Candidate> candidates(1, candidate_);
-  candidates[0].set_transport_name(mid);
-  EXPECT_EQ(1u, jsep_desc_->RemoveCandidates(candidates));
-  EXPECT_EQ(0u, jsep_desc_->candidates(0)->count());
-  EXPECT_EQ(0u, jsep_desc_->candidates(1)->count());
-}
-
-TEST_F(JsepSessionDescriptionTest, AddCandidateAlreadyHasUfrag) {
-  candidate_.set_username(kCandidateUfrag);
-  candidate_.set_password(kCandidatePwd);
-  JsepIceCandidate jsep_candidate("audio", 0, candidate_);
-  EXPECT_TRUE(jsep_desc_->AddCandidate(&jsep_candidate));
-  const IceCandidateCollection* ice_candidates = jsep_desc_->candidates(0);
-  ASSERT_TRUE(ice_candidates != NULL);
-  EXPECT_EQ(1u, ice_candidates->count());
-  const IceCandidateInterface* ice_candidate = ice_candidates->at(0);
-  ASSERT_TRUE(ice_candidate != NULL);
-  candidate_.set_username(kCandidateUfrag);
-  candidate_.set_password(kCandidatePwd);
-  EXPECT_TRUE(ice_candidate->candidate().IsEquivalent(candidate_));
-
-  EXPECT_EQ(0u, jsep_desc_->candidates(1)->count());
-}
-
-// Test that we can not add a candidate if there is no corresponding media
-// content in the session description.
-TEST_F(JsepSessionDescriptionTest, AddBadCandidate) {
-  JsepIceCandidate bad_candidate1("", 55, candidate_);
-  EXPECT_FALSE(jsep_desc_->AddCandidate(&bad_candidate1));
-
-  JsepIceCandidate bad_candidate2("some weird mid", 0, candidate_);
-  EXPECT_FALSE(jsep_desc_->AddCandidate(&bad_candidate2));
-}
-
-// Tests that repeatedly adding the same candidate, with or without credentials,
-// does not increase the number of candidates in the description.
-TEST_F(JsepSessionDescriptionTest, AddCandidateDuplicates) {
-  JsepIceCandidate jsep_candidate("", 0, candidate_);
-  EXPECT_TRUE(jsep_desc_->AddCandidate(&jsep_candidate));
-  EXPECT_EQ(1u, jsep_desc_->candidates(0)->count());
-
-  // Add the same candidate again.  It should be ignored.
-  EXPECT_TRUE(jsep_desc_->AddCandidate(&jsep_candidate));
-  EXPECT_EQ(1u, jsep_desc_->candidates(0)->count());
-
-  // Create a new candidate, identical except that the ufrag and pwd are now
-  // populated.
-  candidate_.set_username(kCandidateUfragVoice);
-  candidate_.set_password(kCandidatePwdVoice);
-  JsepIceCandidate jsep_candidate_with_credentials("", 0, candidate_);
-
-  // This should also be identified as redundant and ignored.
-  EXPECT_TRUE(jsep_desc_->AddCandidate(&jsep_candidate_with_credentials));
-  EXPECT_EQ(1u, jsep_desc_->candidates(0)->count());
-}
-
-// Test that we can serialize a JsepSessionDescription and deserialize it again.
-TEST_F(JsepSessionDescriptionTest, SerializeDeserialize) {
-  std::string sdp = Serialize(jsep_desc_.get());
-
-  std::unique_ptr<SessionDescriptionInterface> parsed_jsep_desc(
-      DeSerialize(sdp));
-  EXPECT_EQ(2u, parsed_jsep_desc->number_of_mediasections());
-
-  std::string parsed_sdp = Serialize(parsed_jsep_desc.get());
-  EXPECT_EQ(sdp, parsed_sdp);
-}
-
-// Tests that we can serialize and deserialize a JsepSesssionDescription
-// with candidates.
-TEST_F(JsepSessionDescriptionTest, SerializeDeserializeWithCandidates) {
-  std::string sdp = Serialize(jsep_desc_.get());
-
-  // Add a candidate and check that the serialized result is different.
-  JsepIceCandidate jsep_candidate("audio", 0, candidate_);
-  EXPECT_TRUE(jsep_desc_->AddCandidate(&jsep_candidate));
-  std::string sdp_with_candidate = Serialize(jsep_desc_.get());
-  EXPECT_NE(sdp, sdp_with_candidate);
-
-  std::unique_ptr<SessionDescriptionInterface> parsed_jsep_desc(
-      DeSerialize(sdp_with_candidate));
-  std::string parsed_sdp_with_candidate = Serialize(parsed_jsep_desc.get());
-
-  EXPECT_EQ(sdp_with_candidate, parsed_sdp_with_candidate);
-}
-
-// TODO(zhihuang): Modify these tests. These are used to verify that after
-// adding the candidates, the connection_address field is set correctly. Modify
-// those so that the "connection address" is tested directly.
-// Tests serialization of SDP with only IPv6 candidates and verifies that IPv6
-// is used as default address in c line according to preference.
-TEST_F(JsepSessionDescriptionTest, SerializeSessionDescriptionWithIPv6Only) {
-  // Stun has a high preference than local host.
-  cricket::Candidate candidate1(
-      cricket::ICE_CANDIDATE_COMPONENT_RTP, "udp",
-      rtc::SocketAddress("::1", 1234), kCandidatePriority, "", "",
-      cricket::STUN_PORT_TYPE, kCandidateGeneration, kCandidateFoundation);
-  cricket::Candidate candidate2(
-      cricket::ICE_CANDIDATE_COMPONENT_RTP, "udp",
-      rtc::SocketAddress("::2", 1235), kCandidatePriority, "", "",
-      cricket::LOCAL_PORT_TYPE, kCandidateGeneration, kCandidateFoundation);
-
-  JsepIceCandidate jice1("audio", 0, candidate1);
-  JsepIceCandidate jice2("audio", 0, candidate2);
-  JsepIceCandidate jice3("video", 0, candidate1);
-  JsepIceCandidate jice4("video", 0, candidate2);
-  ASSERT_TRUE(jsep_desc_->AddCandidate(&jice1));
-  ASSERT_TRUE(jsep_desc_->AddCandidate(&jice2));
-  ASSERT_TRUE(jsep_desc_->AddCandidate(&jice3));
-  ASSERT_TRUE(jsep_desc_->AddCandidate(&jice4));
-  std::string message = Serialize(jsep_desc_.get());
-
-  // Should have a c line like this one.
-  EXPECT_NE(message.find("c=IN IP6 ::1"), std::string::npos);
-  // Shouldn't have a IP4 c line.
-  EXPECT_EQ(message.find("c=IN IP4"), std::string::npos);
-}
-
-// Tests serialization of SDP with both IPv4 and IPv6 candidates and
-// verifies that IPv4 is used as default address in c line even if the
-// preference of IPv4 is lower.
-TEST_F(JsepSessionDescriptionTest,
-       SerializeSessionDescriptionWithBothIPFamilies) {
-  cricket::Candidate candidate_v4(
-      cricket::ICE_CANDIDATE_COMPONENT_RTP, "udp",
-      rtc::SocketAddress("192.168.1.5", 1234), kCandidatePriority, "", "",
-      cricket::STUN_PORT_TYPE, kCandidateGeneration, kCandidateFoundation);
-  cricket::Candidate candidate_v6(
-      cricket::ICE_CANDIDATE_COMPONENT_RTP, "udp",
-      rtc::SocketAddress("::1", 1234), kCandidatePriority, "", "",
-      cricket::LOCAL_PORT_TYPE, kCandidateGeneration, kCandidateFoundation);
-
-  JsepIceCandidate jice_v4("audio", 0, candidate_v4);
-  JsepIceCandidate jice_v6("audio", 0, candidate_v6);
-  JsepIceCandidate jice_v4_video("video", 0, candidate_v4);
-  JsepIceCandidate jice_v6_video("video", 0, candidate_v6);
-  ASSERT_TRUE(jsep_desc_->AddCandidate(&jice_v4));
-  ASSERT_TRUE(jsep_desc_->AddCandidate(&jice_v6));
-  ASSERT_TRUE(jsep_desc_->AddCandidate(&jice_v4_video));
-  ASSERT_TRUE(jsep_desc_->AddCandidate(&jice_v6_video));
-  std::string message = Serialize(jsep_desc_.get());
-
-  // Should have a c line like this one.
-  EXPECT_NE(message.find("c=IN IP4 192.168.1.5"), std::string::npos);
-  // Shouldn't have a IP6 c line.
-  EXPECT_EQ(message.find("c=IN IP6"), std::string::npos);
-}
-
-// Tests serialization of SDP with both UDP and TCP candidates and
-// verifies that UDP is used as default address in c line even if the
-// preference of UDP is lower.
-TEST_F(JsepSessionDescriptionTest,
-       SerializeSessionDescriptionWithBothProtocols) {
-  // Stun has a high preference than local host.
-  cricket::Candidate candidate1(
-      cricket::ICE_CANDIDATE_COMPONENT_RTP, "tcp",
-      rtc::SocketAddress("::1", 1234), kCandidatePriority, "", "",
-      cricket::STUN_PORT_TYPE, kCandidateGeneration, kCandidateFoundation);
-  cricket::Candidate candidate2(
-      cricket::ICE_CANDIDATE_COMPONENT_RTP, "udp",
-      rtc::SocketAddress("fe80::1234:5678:abcd:ef12", 1235), kCandidatePriority,
-      "", "", cricket::LOCAL_PORT_TYPE, kCandidateGeneration,
-      kCandidateFoundation);
-
-  JsepIceCandidate jice1("audio", 0, candidate1);
-  JsepIceCandidate jice2("audio", 0, candidate2);
-  JsepIceCandidate jice3("video", 0, candidate1);
-  JsepIceCandidate jice4("video", 0, candidate2);
-  ASSERT_TRUE(jsep_desc_->AddCandidate(&jice1));
-  ASSERT_TRUE(jsep_desc_->AddCandidate(&jice2));
-  ASSERT_TRUE(jsep_desc_->AddCandidate(&jice3));
-  ASSERT_TRUE(jsep_desc_->AddCandidate(&jice4));
-  std::string message = Serialize(jsep_desc_.get());
-
-  // Should have a c line like this one.
-  EXPECT_NE(message.find("c=IN IP6 fe80::1234:5678:abcd:ef12"),
-            std::string::npos);
-  // Shouldn't have a IP4 c line.
-  EXPECT_EQ(message.find("c=IN IP4"), std::string::npos);
-}
-
-// Tests serialization of SDP with only TCP candidates and verifies that
-// null IPv4 is used as default address in c line.
-TEST_F(JsepSessionDescriptionTest, SerializeSessionDescriptionWithTCPOnly) {
-  // Stun has a high preference than local host.
-  cricket::Candidate candidate1(
-      cricket::ICE_CANDIDATE_COMPONENT_RTP, "tcp",
-      rtc::SocketAddress("::1", 1234), kCandidatePriority, "", "",
-      cricket::STUN_PORT_TYPE, kCandidateGeneration, kCandidateFoundation);
-  cricket::Candidate candidate2(
-      cricket::ICE_CANDIDATE_COMPONENT_RTP, "tcp",
-      rtc::SocketAddress("::2", 1235), kCandidatePriority, "", "",
-      cricket::LOCAL_PORT_TYPE, kCandidateGeneration, kCandidateFoundation);
-
-  JsepIceCandidate jice1("audio", 0, candidate1);
-  JsepIceCandidate jice2("audio", 0, candidate2);
-  JsepIceCandidate jice3("video", 0, candidate1);
-  JsepIceCandidate jice4("video", 0, candidate2);
-  ASSERT_TRUE(jsep_desc_->AddCandidate(&jice1));
-  ASSERT_TRUE(jsep_desc_->AddCandidate(&jice2));
-  ASSERT_TRUE(jsep_desc_->AddCandidate(&jice3));
-  ASSERT_TRUE(jsep_desc_->AddCandidate(&jice4));
-
-  std::string message = Serialize(jsep_desc_.get());
-  EXPECT_EQ(message.find("c=IN IP6 ::3"), std::string::npos);
-  // Should have a c line like this one when no any default exists.
-  EXPECT_NE(message.find("c=IN IP4 0.0.0.0"), std::string::npos);
-}
-
-// Tests that the connection address will be correctly set when the Candidate is
-// removed.
-TEST_F(JsepSessionDescriptionTest, RemoveCandidateAndSetConnectionAddress) {
-  cricket::Candidate candidate1(
-      cricket::ICE_CANDIDATE_COMPONENT_RTP, "udp",
-      rtc::SocketAddress("::1", 1234), kCandidatePriority, "", "",
-      cricket::LOCAL_PORT_TYPE, kCandidateGeneration, kCandidateFoundation);
-  candidate1.set_transport_name("audio");
-
-  cricket::Candidate candidate2(
-      cricket::ICE_CANDIDATE_COMPONENT_RTP, "tcp",
-      rtc::SocketAddress("::2", 1235), kCandidatePriority, "", "",
-      cricket::LOCAL_PORT_TYPE, kCandidateGeneration, kCandidateFoundation);
-  candidate2.set_transport_name("audio");
-
-  cricket::Candidate candidate3(
-      cricket::ICE_CANDIDATE_COMPONENT_RTP, "udp",
-      rtc::SocketAddress("192.168.1.1", 1236), kCandidatePriority, "", "",
-      cricket::LOCAL_PORT_TYPE, kCandidateGeneration, kCandidateFoundation);
-  candidate3.set_transport_name("audio");
-
-  JsepIceCandidate jice1("audio", 0, candidate1);
-  JsepIceCandidate jice2("audio", 0, candidate2);
-  JsepIceCandidate jice3("audio", 0, candidate3);
-
-  size_t audio_index = 0;
-  auto media_desc = static_cast<cricket::MediaContentDescription*>(
-      jsep_desc_->description()->contents()[audio_index].description);
-
-  ASSERT_TRUE(jsep_desc_->AddCandidate(&jice1));
-  ASSERT_TRUE(jsep_desc_->AddCandidate(&jice2));
-  ASSERT_TRUE(jsep_desc_->AddCandidate(&jice3));
-
-  std::vector<cricket::Candidate> candidates;
-  EXPECT_EQ("192.168.1.1:1236", media_desc->connection_address().ToString());
-
-  candidates.push_back(candidate3);
-  ASSERT_TRUE(jsep_desc_->RemoveCandidates(candidates));
-  EXPECT_EQ("[::1]:1234", media_desc->connection_address().ToString());
-
-  candidates.clear();
-  candidates.push_back(candidate2);
-  ASSERT_TRUE(jsep_desc_->RemoveCandidates(candidates));
-  EXPECT_EQ("[::1]:1234", media_desc->connection_address().ToString());
-
-  candidates.clear();
-  candidates.push_back(candidate1);
-  ASSERT_TRUE(jsep_desc_->RemoveCandidates(candidates));
-  EXPECT_EQ("0.0.0.0:9", media_desc->connection_address().ToString());
-}
diff --git a/pc/localaudiosource.cc b/pc/localaudiosource.cc
deleted file mode 100644
index 5454cdf..0000000
--- a/pc/localaudiosource.cc
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- *  Copyright 2013 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/pc/localaudiosource.h"
-
-#include <vector>
-
-#include "webrtc/api/mediaconstraintsinterface.h"
-#include "webrtc/media/base/mediaengine.h"
-
-using webrtc::MediaConstraintsInterface;
-using webrtc::MediaSourceInterface;
-
-namespace webrtc {
-
-rtc::scoped_refptr<LocalAudioSource> LocalAudioSource::Create(
-    const MediaConstraintsInterface* constraints) {
-  rtc::scoped_refptr<LocalAudioSource> source(
-      new rtc::RefCountedObject<LocalAudioSource>());
-  source->Initialize(constraints);
-  return source;
-}
-
-rtc::scoped_refptr<LocalAudioSource> LocalAudioSource::Create(
-    const cricket::AudioOptions* audio_options) {
-  rtc::scoped_refptr<LocalAudioSource> source(
-      new rtc::RefCountedObject<LocalAudioSource>());
-  source->Initialize(audio_options);
-  return source;
-}
-
-void LocalAudioSource::Initialize(
-    const MediaConstraintsInterface* constraints) {
-  CopyConstraintsIntoAudioOptions(constraints, &options_);
-}
-
-void LocalAudioSource::Initialize(
-    const cricket::AudioOptions* audio_options) {
-  if (!audio_options)
-    return;
-
-  options_ = *audio_options;
-}
-
-}  // namespace webrtc
diff --git a/pc/localaudiosource.h b/pc/localaudiosource.h
deleted file mode 100644
index ffa465d..0000000
--- a/pc/localaudiosource.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- *  Copyright 2012 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_PC_LOCALAUDIOSOURCE_H_
-#define WEBRTC_PC_LOCALAUDIOSOURCE_H_
-
-#include "webrtc/api/mediastreaminterface.h"
-#include "webrtc/api/notifier.h"
-#include "webrtc/media/base/mediachannel.h"
-
-// LocalAudioSource implements AudioSourceInterface.
-// This contains settings for switching audio processing on and off.
-
-namespace webrtc {
-
-class MediaConstraintsInterface;
-
-class LocalAudioSource : public Notifier<AudioSourceInterface> {
- public:
-  // Creates an instance of LocalAudioSource.
-  static rtc::scoped_refptr<LocalAudioSource> Create(
-      const MediaConstraintsInterface* constraints);
-
-  static rtc::scoped_refptr<LocalAudioSource> Create(
-      const cricket::AudioOptions* audio_options);
-
-  SourceState state() const override { return kLive; }
-  bool remote() const override { return false; }
-
-  virtual const cricket::AudioOptions& options() const { return options_; }
-
-  void AddSink(AudioTrackSinkInterface* sink) override {}
-  void RemoveSink(AudioTrackSinkInterface* sink) override {}
-
- protected:
-  LocalAudioSource() {}
-  ~LocalAudioSource() override {}
-
- private:
-  void Initialize(const MediaConstraintsInterface* constraints);
-  void Initialize(const cricket::AudioOptions* audio_options);
-
-  cricket::AudioOptions options_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_PC_LOCALAUDIOSOURCE_H_
diff --git a/pc/localaudiosource_unittest.cc b/pc/localaudiosource_unittest.cc
deleted file mode 100644
index 9b26095..0000000
--- a/pc/localaudiosource_unittest.cc
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- *  Copyright 2013 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/pc/localaudiosource.h"
-
-#include <string>
-#include <vector>
-
-#include "webrtc/api/test/fakeconstraints.h"
-#include "webrtc/media/base/fakemediaengine.h"
-#include "webrtc/media/base/fakevideorenderer.h"
-#include "webrtc/rtc_base/gunit.h"
-
-using webrtc::LocalAudioSource;
-using webrtc::MediaConstraintsInterface;
-using webrtc::MediaSourceInterface;
-
-TEST(LocalAudioSourceTest, SetValidOptions) {
-  webrtc::FakeConstraints constraints;
-  constraints.AddMandatory(
-      MediaConstraintsInterface::kGoogEchoCancellation, false);
-  constraints.AddOptional(
-      MediaConstraintsInterface::kExtendedFilterEchoCancellation, true);
-  constraints.AddOptional(MediaConstraintsInterface::kDAEchoCancellation, true);
-  constraints.AddOptional(MediaConstraintsInterface::kAutoGainControl, true);
-  constraints.AddOptional(
-      MediaConstraintsInterface::kExperimentalAutoGainControl, true);
-  constraints.AddMandatory(MediaConstraintsInterface::kNoiseSuppression, false);
-  constraints.AddOptional(MediaConstraintsInterface::kHighpassFilter, true);
-
-  rtc::scoped_refptr<LocalAudioSource> source =
-      LocalAudioSource::Create(&constraints);
-
-  EXPECT_EQ(rtc::Optional<bool>(false), source->options().echo_cancellation);
-  EXPECT_EQ(rtc::Optional<bool>(true), source->options().extended_filter_aec);
-  EXPECT_EQ(rtc::Optional<bool>(true), source->options().delay_agnostic_aec);
-  EXPECT_EQ(rtc::Optional<bool>(true), source->options().auto_gain_control);
-  EXPECT_EQ(rtc::Optional<bool>(true), source->options().experimental_agc);
-  EXPECT_EQ(rtc::Optional<bool>(false), source->options().noise_suppression);
-  EXPECT_EQ(rtc::Optional<bool>(true), source->options().highpass_filter);
-}
-
-TEST(LocalAudioSourceTest, OptionNotSet) {
-  webrtc::FakeConstraints constraints;
-  rtc::scoped_refptr<LocalAudioSource> source =
-      LocalAudioSource::Create(&constraints);
-  EXPECT_EQ(rtc::Optional<bool>(), source->options().highpass_filter);
-}
-
-TEST(LocalAudioSourceTest, MandatoryOverridesOptional) {
-  webrtc::FakeConstraints constraints;
-  constraints.AddMandatory(
-      MediaConstraintsInterface::kGoogEchoCancellation, false);
-  constraints.AddOptional(
-      MediaConstraintsInterface::kGoogEchoCancellation, true);
-
-  rtc::scoped_refptr<LocalAudioSource> source =
-      LocalAudioSource::Create(&constraints);
-
-  EXPECT_EQ(rtc::Optional<bool>(false), source->options().echo_cancellation);
-}
-
-TEST(LocalAudioSourceTest, InvalidOptional) {
-  webrtc::FakeConstraints constraints;
-  constraints.AddOptional(MediaConstraintsInterface::kHighpassFilter, false);
-  constraints.AddOptional("invalidKey", false);
-
-  rtc::scoped_refptr<LocalAudioSource> source =
-      LocalAudioSource::Create(&constraints);
-
-  EXPECT_EQ(MediaSourceInterface::kLive, source->state());
-  EXPECT_EQ(rtc::Optional<bool>(false), source->options().highpass_filter);
-}
-
-TEST(LocalAudioSourceTest, InvalidMandatory) {
-  webrtc::FakeConstraints constraints;
-  constraints.AddMandatory(MediaConstraintsInterface::kHighpassFilter, false);
-  constraints.AddMandatory("invalidKey", false);
-
-  rtc::scoped_refptr<LocalAudioSource> source =
-      LocalAudioSource::Create(&constraints);
-
-  EXPECT_EQ(MediaSourceInterface::kLive, source->state());
-  EXPECT_EQ(rtc::Optional<bool>(false), source->options().highpass_filter);
-}
-
-TEST(LocalAudioSourceTest, InitWithAudioOptions) {
-  cricket::AudioOptions audio_options;
-  audio_options.highpass_filter = rtc::Optional<bool>(true);
-  rtc::scoped_refptr<LocalAudioSource> source =
-      LocalAudioSource::Create(&audio_options);
-  EXPECT_EQ(rtc::Optional<bool>(true), source->options().highpass_filter);
-}
-
-TEST(LocalAudioSourceTest, InitWithNoOptions) {
-  rtc::scoped_refptr<LocalAudioSource> source =
-      LocalAudioSource::Create((cricket::AudioOptions*)nullptr);
-  EXPECT_EQ(rtc::Optional<bool>(), source->options().highpass_filter);
-}
diff --git a/pc/mediaconstraintsinterface_unittest.cc b/pc/mediaconstraintsinterface_unittest.cc
deleted file mode 100644
index 81b5fb4..0000000
--- a/pc/mediaconstraintsinterface_unittest.cc
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- *  Copyright 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/api/mediaconstraintsinterface.h"
-
-#include "webrtc/api/test/fakeconstraints.h"
-#include "webrtc/rtc_base/gunit.h"
-
-namespace webrtc {
-
-namespace {
-
-// Checks all settings touched by CopyConstraintsIntoRtcConfiguration,
-// plus audio_jitter_buffer_max_packets.
-bool Matches(const PeerConnectionInterface::RTCConfiguration& a,
-             const PeerConnectionInterface::RTCConfiguration& b) {
-  return a.disable_ipv6 == b.disable_ipv6 &&
-         a.audio_jitter_buffer_max_packets ==
-             b.audio_jitter_buffer_max_packets &&
-         a.enable_rtp_data_channel == b.enable_rtp_data_channel &&
-         a.screencast_min_bitrate == b.screencast_min_bitrate &&
-         a.combined_audio_video_bwe == b.combined_audio_video_bwe &&
-         a.enable_dtls_srtp == b.enable_dtls_srtp &&
-         a.media_config.enable_dscp == b.media_config.enable_dscp &&
-         a.media_config.video.enable_cpu_overuse_detection ==
-             b.media_config.video.enable_cpu_overuse_detection &&
-         a.media_config.video.disable_prerenderer_smoothing ==
-             b.media_config.video.disable_prerenderer_smoothing &&
-         a.media_config.video.suspend_below_min_bitrate ==
-             b.media_config.video.suspend_below_min_bitrate;
-}
-
-TEST(MediaConstraintsInterface, CopyConstraintsIntoRtcConfiguration) {
-  FakeConstraints constraints;
-  PeerConnectionInterface::RTCConfiguration old_configuration;
-  PeerConnectionInterface::RTCConfiguration configuration;
-
-  CopyConstraintsIntoRtcConfiguration(&constraints, &configuration);
-  EXPECT_TRUE(Matches(old_configuration, configuration));
-
-  constraints.SetMandatory(MediaConstraintsInterface::kEnableIPv6, "true");
-  CopyConstraintsIntoRtcConfiguration(&constraints, &configuration);
-  EXPECT_FALSE(configuration.disable_ipv6);
-  constraints.SetMandatory(MediaConstraintsInterface::kEnableIPv6, "false");
-  CopyConstraintsIntoRtcConfiguration(&constraints, &configuration);
-  EXPECT_TRUE(configuration.disable_ipv6);
-
-  constraints.SetMandatory(MediaConstraintsInterface::kScreencastMinBitrate,
-                           27);
-  CopyConstraintsIntoRtcConfiguration(&constraints, &configuration);
-  EXPECT_TRUE(configuration.screencast_min_bitrate);
-  EXPECT_EQ(27, *(configuration.screencast_min_bitrate));
-
-  // An empty set of constraints will not overwrite
-  // values that are already present.
-  constraints = FakeConstraints();
-  configuration = old_configuration;
-  configuration.enable_dtls_srtp = rtc::Optional<bool>(true);
-  configuration.audio_jitter_buffer_max_packets = 34;
-  CopyConstraintsIntoRtcConfiguration(&constraints, &configuration);
-  EXPECT_EQ(34, configuration.audio_jitter_buffer_max_packets);
-  ASSERT_TRUE(configuration.enable_dtls_srtp);
-  EXPECT_TRUE(*(configuration.enable_dtls_srtp));
-}
-
-}  // namespace
-
-}  // namespace webrtc
diff --git a/pc/mediamonitor.cc b/pc/mediamonitor.cc
deleted file mode 100644
index 22e16dc..0000000
--- a/pc/mediamonitor.cc
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- *  Copyright 2005 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/pc/mediamonitor.h"
-#include "webrtc/pc/channelmanager.h"
-#include "webrtc/rtc_base/checks.h"
-
-namespace cricket {
-
-enum {
-  MSG_MONITOR_POLL = 1,
-  MSG_MONITOR_START = 2,
-  MSG_MONITOR_STOP = 3,
-  MSG_MONITOR_SIGNAL = 4
-};
-
-MediaMonitor::MediaMonitor(rtc::Thread* worker_thread,
-                           rtc::Thread* monitor_thread)
-    : worker_thread_(worker_thread),
-      monitor_thread_(monitor_thread), monitoring_(false), rate_(0) {
-}
-
-MediaMonitor::~MediaMonitor() {
-  monitoring_ = false;
-  monitor_thread_->Clear(this);
-  worker_thread_->Clear(this);
-}
-
-void MediaMonitor::Start(uint32_t milliseconds) {
-  rate_ = milliseconds;
-  if (rate_ < 100)
-    rate_ = 100;
-  worker_thread_->Post(RTC_FROM_HERE, this, MSG_MONITOR_START);
-}
-
-void MediaMonitor::Stop() {
-  worker_thread_->Post(RTC_FROM_HERE, this, MSG_MONITOR_STOP);
-  rate_ = 0;
-}
-
-void MediaMonitor::OnMessage(rtc::Message* message) {
-  rtc::CritScope cs(&crit_);
-
-  switch (message->message_id) {
-  case MSG_MONITOR_START:
-    RTC_DCHECK(rtc::Thread::Current() == worker_thread_);
-    if (!monitoring_) {
-      monitoring_ = true;
-      PollMediaChannel();
-    }
-    break;
-
-  case MSG_MONITOR_STOP:
-    RTC_DCHECK(rtc::Thread::Current() == worker_thread_);
-    if (monitoring_) {
-      monitoring_ = false;
-      worker_thread_->Clear(this);
-    }
-    break;
-
-  case MSG_MONITOR_POLL:
-    RTC_DCHECK(rtc::Thread::Current() == worker_thread_);
-    PollMediaChannel();
-    break;
-
-  case MSG_MONITOR_SIGNAL:
-    RTC_DCHECK(rtc::Thread::Current() == monitor_thread_);
-    Update();
-    break;
-  }
-}
-
-void MediaMonitor::PollMediaChannel() {
-  rtc::CritScope cs(&crit_);
-  RTC_DCHECK(rtc::Thread::Current() == worker_thread_);
-
-  GetStats();
-
-  // Signal the monitoring thread, start another poll timer
-  monitor_thread_->Post(RTC_FROM_HERE, this, MSG_MONITOR_SIGNAL);
-  worker_thread_->PostDelayed(RTC_FROM_HERE, rate_, this, MSG_MONITOR_POLL);
-}
-
-}  // namespace cricket
diff --git a/pc/mediamonitor.h b/pc/mediamonitor.h
deleted file mode 100644
index b4efefb..0000000
--- a/pc/mediamonitor.h
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- *  Copyright 2005 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.
- */
-
-// Class to collect statistics from a media channel
-
-#ifndef WEBRTC_PC_MEDIAMONITOR_H_
-#define WEBRTC_PC_MEDIAMONITOR_H_
-
-#include "webrtc/media/base/mediachannel.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/sigslot.h"
-#include "webrtc/rtc_base/thread.h"
-#include "webrtc/rtc_base/thread_annotations.h"
-
-namespace cricket {
-
-// The base MediaMonitor class, independent of voice and video.
-class MediaMonitor : public rtc::MessageHandler,
-    public sigslot::has_slots<> {
- public:
-  MediaMonitor(rtc::Thread* worker_thread,
-               rtc::Thread* monitor_thread);
-  ~MediaMonitor();
-
-  void Start(uint32_t milliseconds);
-  void Stop();
-
- protected:
-  void OnMessage(rtc::Message *message);
-  void PollMediaChannel();
-  virtual void GetStats() = 0;
-  virtual void Update() = 0;
-
-  rtc::CriticalSection crit_;
-  rtc::Thread* worker_thread_;
-  rtc::Thread* monitor_thread_;
-  bool monitoring_;
-  uint32_t rate_;
-};
-
-// Templatized MediaMonitor that can deal with different kinds of media.
-template<class MC, class MI>
-class MediaMonitorT : public MediaMonitor {
- public:
-  MediaMonitorT(MC* media_channel, rtc::Thread* worker_thread,
-                rtc::Thread* monitor_thread)
-      : MediaMonitor(worker_thread, monitor_thread),
-        media_channel_(media_channel) {}
-  sigslot::signal2<MC*, const MI&> SignalUpdate;
-
- protected:
-  // These routines assume the crit_ lock is held by the calling thread.
-  virtual void GetStats() {
-    media_info_.Clear();
-    media_channel_->GetStats(&media_info_);
-  }
-  virtual void Update() RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_) {
-    MI stats(media_info_);
-    crit_.Leave();
-    SignalUpdate(media_channel_, stats);
-    crit_.Enter();
-  }
-
- private:
-  MC* media_channel_;
-  MI media_info_;
-};
-
-typedef MediaMonitorT<VoiceMediaChannel, VoiceMediaInfo> VoiceMediaMonitor;
-typedef MediaMonitorT<VideoMediaChannel, VideoMediaInfo> VideoMediaMonitor;
-typedef MediaMonitorT<DataMediaChannel, DataMediaInfo> DataMediaMonitor;
-
-}  // namespace cricket
-
-#endif  // WEBRTC_PC_MEDIAMONITOR_H_
diff --git a/pc/mediasession.cc b/pc/mediasession.cc
deleted file mode 100644
index e1c3dd4..0000000
--- a/pc/mediasession.cc
+++ /dev/null
@@ -1,2494 +0,0 @@
-/*
- *  Copyright 2004 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/pc/mediasession.h"
-
-#include <algorithm>  // For std::find_if, std::sort.
-#include <functional>
-#include <map>
-#include <memory>
-#include <set>
-#include <unordered_map>
-#include <utility>
-
-#include "webrtc/api/optional.h"
-#include "webrtc/common_types.h"
-#include "webrtc/media/base/cryptoparams.h"
-#include "webrtc/media/base/h264_profile_level_id.h"
-#include "webrtc/media/base/mediaconstants.h"
-#include "webrtc/p2p/base/p2pconstants.h"
-#include "webrtc/pc/channelmanager.h"
-#include "webrtc/pc/srtpfilter.h"
-#include "webrtc/rtc_base/base64.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/helpers.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/stringutils.h"
-
-namespace {
-const char kInline[] = "inline:";
-
-void GetSupportedSdesCryptoSuiteNames(void (*func)(const rtc::CryptoOptions&,
-                                                   std::vector<int>*),
-                                      const rtc::CryptoOptions& crypto_options,
-                                      std::vector<std::string>* names) {
-  std::vector<int> crypto_suites;
-  func(crypto_options, &crypto_suites);
-  for (const auto crypto : crypto_suites) {
-    names->push_back(rtc::SrtpCryptoSuiteToName(crypto));
-  }
-}
-}  // namespace
-
-namespace cricket {
-
-// RTP Profile names
-// http://www.iana.org/assignments/rtp-parameters/rtp-parameters.xml
-// RFC4585
-const char kMediaProtocolAvpf[] = "RTP/AVPF";
-// RFC5124
-const char kMediaProtocolDtlsSavpf[] = "UDP/TLS/RTP/SAVPF";
-
-// We always generate offers with "UDP/TLS/RTP/SAVPF" when using DTLS-SRTP,
-// but we tolerate "RTP/SAVPF" in offers we receive, for compatibility.
-const char kMediaProtocolSavpf[] = "RTP/SAVPF";
-
-const char kMediaProtocolRtpPrefix[] = "RTP/";
-
-const char kMediaProtocolSctp[] = "SCTP";
-const char kMediaProtocolDtlsSctp[] = "DTLS/SCTP";
-const char kMediaProtocolUdpDtlsSctp[] = "UDP/DTLS/SCTP";
-const char kMediaProtocolTcpDtlsSctp[] = "TCP/DTLS/SCTP";
-
-// Note that the below functions support some protocol strings purely for
-// legacy compatibility, as required by JSEP in Section 5.1.2, Profile Names
-// and Interoperability.
-
-static bool IsDtlsRtp(const std::string& protocol) {
-  // Most-likely values first.
-  return protocol == "UDP/TLS/RTP/SAVPF" || protocol == "TCP/TLS/RTP/SAVPF" ||
-         protocol == "UDP/TLS/RTP/SAVP" || protocol == "TCP/TLS/RTP/SAVP";
-}
-
-static bool IsPlainRtp(const std::string& protocol) {
-  // Most-likely values first.
-  return protocol == "RTP/SAVPF" || protocol == "RTP/AVPF" ||
-         protocol == "RTP/SAVP" || protocol == "RTP/AVP";
-}
-
-static bool IsDtlsSctp(const std::string& protocol) {
-  return protocol == kMediaProtocolDtlsSctp ||
-         protocol == kMediaProtocolUdpDtlsSctp ||
-         protocol == kMediaProtocolTcpDtlsSctp;
-}
-
-static bool IsPlainSctp(const std::string& protocol) {
-  return protocol == kMediaProtocolSctp;
-}
-
-static bool IsSctp(const std::string& protocol) {
-  return IsPlainSctp(protocol) || IsDtlsSctp(protocol);
-}
-
-RtpTransceiverDirection RtpTransceiverDirection::FromMediaContentDirection(
-    MediaContentDirection md) {
-  const bool send = (md == MD_SENDRECV || md == MD_SENDONLY);
-  const bool recv = (md == MD_SENDRECV || md == MD_RECVONLY);
-  return RtpTransceiverDirection(send, recv);
-}
-
-MediaContentDirection RtpTransceiverDirection::ToMediaContentDirection() const {
-  if (send && recv) {
-    return MD_SENDRECV;
-  } else if (send) {
-    return MD_SENDONLY;
-  } else if (recv) {
-    return MD_RECVONLY;
-  }
-
-  return MD_INACTIVE;
-}
-
-RtpTransceiverDirection
-NegotiateRtpTransceiverDirection(RtpTransceiverDirection offer,
-                                 RtpTransceiverDirection wants) {
-  return RtpTransceiverDirection(offer.recv && wants.send,
-                                 offer.send && wants.recv);
-}
-
-static bool IsMediaContentOfType(const ContentInfo* content,
-                                 MediaType media_type) {
-  if (!IsMediaContent(content)) {
-    return false;
-  }
-
-  const MediaContentDescription* mdesc =
-      static_cast<const MediaContentDescription*>(content->description);
-  return mdesc && mdesc->type() == media_type;
-}
-
-static bool CreateCryptoParams(int tag, const std::string& cipher,
-                               CryptoParams *out) {
-  int key_len;
-  int salt_len;
-  if (!rtc::GetSrtpKeyAndSaltLengths(
-      rtc::SrtpCryptoSuiteFromName(cipher), &key_len, &salt_len)) {
-    return false;
-  }
-
-  int master_key_len = key_len + salt_len;
-  std::string master_key;
-  if (!rtc::CreateRandomData(master_key_len, &master_key)) {
-    return false;
-  }
-
-  RTC_CHECK_EQ(master_key_len, master_key.size());
-  std::string key = rtc::Base64::Encode(master_key);
-
-  out->tag = tag;
-  out->cipher_suite = cipher;
-  out->key_params = kInline;
-  out->key_params += key;
-  return true;
-}
-
-static bool AddCryptoParams(const std::string& cipher_suite,
-                            CryptoParamsVec *out) {
-  int size = static_cast<int>(out->size());
-
-  out->resize(size + 1);
-  return CreateCryptoParams(size, cipher_suite, &out->at(size));
-}
-
-void AddMediaCryptos(const CryptoParamsVec& cryptos,
-                     MediaContentDescription* media) {
-  for (CryptoParamsVec::const_iterator crypto = cryptos.begin();
-       crypto != cryptos.end(); ++crypto) {
-    media->AddCrypto(*crypto);
-  }
-}
-
-bool CreateMediaCryptos(const std::vector<std::string>& crypto_suites,
-                        MediaContentDescription* media) {
-  CryptoParamsVec cryptos;
-  for (std::vector<std::string>::const_iterator it = crypto_suites.begin();
-       it != crypto_suites.end(); ++it) {
-    if (!AddCryptoParams(*it, &cryptos)) {
-      return false;
-    }
-  }
-  AddMediaCryptos(cryptos, media);
-  return true;
-}
-
-const CryptoParamsVec* GetCryptos(const ContentInfo* content) {
-  if (!content) {
-    return nullptr;
-  }
-
-  RTC_DCHECK(IsMediaContent(content));
-  return &(static_cast<const MediaContentDescription*>(content->description)
-               ->cryptos());
-}
-
-bool FindMatchingCrypto(const CryptoParamsVec& cryptos,
-                        const CryptoParams& crypto,
-                        CryptoParams* out) {
-  for (CryptoParamsVec::const_iterator it = cryptos.begin();
-       it != cryptos.end(); ++it) {
-    if (crypto.Matches(*it)) {
-      *out = *it;
-      return true;
-    }
-  }
-  return false;
-}
-
-// For audio, HMAC 32 is prefered over HMAC 80 because of the low overhead.
-void GetSupportedAudioSdesCryptoSuites(const rtc::CryptoOptions& crypto_options,
-                                       std::vector<int>* crypto_suites) {
-  if (crypto_options.enable_gcm_crypto_suites) {
-    crypto_suites->push_back(rtc::SRTP_AEAD_AES_256_GCM);
-    crypto_suites->push_back(rtc::SRTP_AEAD_AES_128_GCM);
-  }
-  crypto_suites->push_back(rtc::SRTP_AES128_CM_SHA1_32);
-  crypto_suites->push_back(rtc::SRTP_AES128_CM_SHA1_80);
-}
-
-void GetSupportedAudioSdesCryptoSuiteNames(
-    const rtc::CryptoOptions& crypto_options,
-    std::vector<std::string>* crypto_suite_names) {
-  GetSupportedSdesCryptoSuiteNames(GetSupportedAudioSdesCryptoSuites,
-                                   crypto_options, crypto_suite_names);
-}
-
-void GetSupportedVideoSdesCryptoSuites(const rtc::CryptoOptions& crypto_options,
-                                       std::vector<int>* crypto_suites) {
-  if (crypto_options.enable_gcm_crypto_suites) {
-    crypto_suites->push_back(rtc::SRTP_AEAD_AES_256_GCM);
-    crypto_suites->push_back(rtc::SRTP_AEAD_AES_128_GCM);
-  }
-  crypto_suites->push_back(rtc::SRTP_AES128_CM_SHA1_80);
-}
-
-void GetSupportedVideoSdesCryptoSuiteNames(
-    const rtc::CryptoOptions& crypto_options,
-    std::vector<std::string>* crypto_suite_names) {
-  GetSupportedSdesCryptoSuiteNames(GetSupportedVideoSdesCryptoSuites,
-                                   crypto_options, crypto_suite_names);
-}
-
-void GetSupportedDataSdesCryptoSuites(const rtc::CryptoOptions& crypto_options,
-                                      std::vector<int>* crypto_suites) {
-  if (crypto_options.enable_gcm_crypto_suites) {
-    crypto_suites->push_back(rtc::SRTP_AEAD_AES_256_GCM);
-    crypto_suites->push_back(rtc::SRTP_AEAD_AES_128_GCM);
-  }
-  crypto_suites->push_back(rtc::SRTP_AES128_CM_SHA1_80);
-}
-
-void GetSupportedDataSdesCryptoSuiteNames(
-    const rtc::CryptoOptions& crypto_options,
-    std::vector<std::string>* crypto_suite_names) {
-  GetSupportedSdesCryptoSuiteNames(GetSupportedDataSdesCryptoSuites,
-                                   crypto_options, crypto_suite_names);
-}
-
-// Support any GCM cipher (if enabled through options). For video support only
-// 80-bit SHA1 HMAC. For audio 32-bit HMAC is tolerated unless bundle is enabled
-// because it is low overhead.
-// Pick the crypto in the list that is supported.
-static bool SelectCrypto(const MediaContentDescription* offer,
-                         bool bundle,
-                         const rtc::CryptoOptions& crypto_options,
-                         CryptoParams *crypto) {
-  bool audio = offer->type() == MEDIA_TYPE_AUDIO;
-  const CryptoParamsVec& cryptos = offer->cryptos();
-
-  for (CryptoParamsVec::const_iterator i = cryptos.begin();
-       i != cryptos.end(); ++i) {
-    if ((crypto_options.enable_gcm_crypto_suites &&
-         rtc::IsGcmCryptoSuiteName(i->cipher_suite)) ||
-        rtc::CS_AES_CM_128_HMAC_SHA1_80 == i->cipher_suite ||
-        (rtc::CS_AES_CM_128_HMAC_SHA1_32 == i->cipher_suite && audio &&
-         !bundle)) {
-      return CreateCryptoParams(i->tag, i->cipher_suite, crypto);
-    }
-  }
-  return false;
-}
-
-// Generate random SSRC values that are not already present in |params_vec|.
-// The generated values are added to |ssrcs|.
-// |num_ssrcs| is the number of the SSRC will be generated.
-static void GenerateSsrcs(const StreamParamsVec& params_vec,
-                          int num_ssrcs,
-                          std::vector<uint32_t>* ssrcs) {
-  for (int i = 0; i < num_ssrcs; i++) {
-    uint32_t candidate;
-    do {
-      candidate = rtc::CreateRandomNonZeroId();
-    } while (GetStreamBySsrc(params_vec, candidate) ||
-             std::count(ssrcs->begin(), ssrcs->end(), candidate) > 0);
-    ssrcs->push_back(candidate);
-  }
-}
-
-// Finds all StreamParams of all media types and attach them to stream_params.
-static void GetCurrentStreamParams(const SessionDescription* sdesc,
-                                   StreamParamsVec* stream_params) {
-  if (!sdesc)
-    return;
-
-  const ContentInfos& contents = sdesc->contents();
-  for (ContentInfos::const_iterator content = contents.begin();
-       content != contents.end(); ++content) {
-    if (!IsMediaContent(&*content)) {
-      continue;
-    }
-    const MediaContentDescription* media =
-        static_cast<const MediaContentDescription*>(
-            content->description);
-    const StreamParamsVec& streams = media->streams();
-    for (StreamParamsVec::const_iterator it = streams.begin();
-         it != streams.end(); ++it) {
-      stream_params->push_back(*it);
-    }
-  }
-}
-
-// Filters the data codecs for the data channel type.
-void FilterDataCodecs(std::vector<DataCodec>* codecs, bool sctp) {
-  // Filter RTP codec for SCTP and vice versa.
-  const char* codec_name =
-      sctp ? kGoogleRtpDataCodecName : kGoogleSctpDataCodecName;
-  for (std::vector<DataCodec>::iterator iter = codecs->begin();
-       iter != codecs->end();) {
-    if (CodecNamesEq(iter->name, codec_name)) {
-      iter = codecs->erase(iter);
-    } else {
-      ++iter;
-    }
-  }
-}
-
-template <typename IdStruct>
-class UsedIds {
- public:
-  UsedIds(int min_allowed_id, int max_allowed_id)
-      : min_allowed_id_(min_allowed_id),
-        max_allowed_id_(max_allowed_id),
-        next_id_(max_allowed_id) {
-  }
-
-  // Loops through all Id in |ids| and changes its id if it is
-  // already in use by another IdStruct. Call this methods with all Id
-  // in a session description to make sure no duplicate ids exists.
-  // Note that typename Id must be a type of IdStruct.
-  template <typename Id>
-  void FindAndSetIdUsed(std::vector<Id>* ids) {
-    for (typename std::vector<Id>::iterator it = ids->begin();
-         it != ids->end(); ++it) {
-      FindAndSetIdUsed(&*it);
-    }
-  }
-
-  // Finds and sets an unused id if the |idstruct| id is already in use.
-  void FindAndSetIdUsed(IdStruct* idstruct) {
-    const int original_id = idstruct->id;
-    int new_id = idstruct->id;
-
-    if (original_id > max_allowed_id_ || original_id < min_allowed_id_) {
-      // If the original id is not in range - this is an id that can't be
-      // dynamically changed.
-      return;
-    }
-
-    if (IsIdUsed(original_id)) {
-      new_id = FindUnusedId();
-      LOG(LS_WARNING) << "Duplicate id found. Reassigning from " << original_id
-          << " to " << new_id;
-      idstruct->id = new_id;
-    }
-    SetIdUsed(new_id);
-  }
-
- private:
-  // Returns the first unused id in reverse order.
-  // This hopefully reduce the risk of more collisions. We want to change the
-  // default ids as little as possible.
-  int FindUnusedId() {
-    while (IsIdUsed(next_id_) && next_id_ >= min_allowed_id_) {
-      --next_id_;
-    }
-    RTC_DCHECK(next_id_ >= min_allowed_id_);
-    return next_id_;
-  }
-
-  bool IsIdUsed(int new_id) {
-    return id_set_.find(new_id) != id_set_.end();
-  }
-
-  void SetIdUsed(int new_id) {
-    id_set_.insert(new_id);
-  }
-
-  const int min_allowed_id_;
-  const int max_allowed_id_;
-  int next_id_;
-  std::set<int> id_set_;
-};
-
-// Helper class used for finding duplicate RTP payload types among audio, video
-// and data codecs. When bundle is used the payload types may not collide.
-class UsedPayloadTypes : public UsedIds<Codec> {
- public:
-  UsedPayloadTypes()
-      : UsedIds<Codec>(kDynamicPayloadTypeMin, kDynamicPayloadTypeMax) {
-  }
-
-
- private:
-  static const int kDynamicPayloadTypeMin = 96;
-  static const int kDynamicPayloadTypeMax = 127;
-};
-
-// Helper class used for finding duplicate RTP Header extension ids among
-// audio and video extensions.
-class UsedRtpHeaderExtensionIds : public UsedIds<webrtc::RtpExtension> {
- public:
-  UsedRtpHeaderExtensionIds()
-      : UsedIds<webrtc::RtpExtension>(webrtc::RtpExtension::kMinId,
-                                      webrtc::RtpExtension::kMaxId) {}
-
- private:
-};
-
-// Adds a StreamParams for each SenderOptions in |sender_options| to
-// content_description.
-// |current_params| - All currently known StreamParams of any media type.
-template <class C>
-static bool AddStreamParams(
-    const std::vector<SenderOptions>& sender_options,
-    const std::string& rtcp_cname,
-    StreamParamsVec* current_streams,
-    MediaContentDescriptionImpl<C>* content_description) {
-  // SCTP streams are not negotiated using SDP/ContentDescriptions.
-  if (IsSctp(content_description->protocol())) {
-    return true;
-  }
-
-  const bool include_rtx_streams =
-      ContainsRtxCodec(content_description->codecs());
-
-
-  const bool include_flexfec_stream =
-      ContainsFlexfecCodec(content_description->codecs());
-
-  for (const SenderOptions& sender : sender_options) {
-    // groupid is empty for StreamParams generated using
-    // MediaSessionDescriptionFactory.
-    StreamParams* param =
-        GetStreamByIds(*current_streams, "" /*group_id*/, sender.track_id);
-    if (!param) {
-      // This is a new sender.
-      std::vector<uint32_t> ssrcs;
-      GenerateSsrcs(*current_streams, sender.num_sim_layers, &ssrcs);
-      StreamParams stream_param;
-      stream_param.id = sender.track_id;
-      // Add the generated ssrc.
-      for (size_t i = 0; i < ssrcs.size(); ++i) {
-        stream_param.ssrcs.push_back(ssrcs[i]);
-      }
-      if (sender.num_sim_layers > 1) {
-        SsrcGroup group(kSimSsrcGroupSemantics, stream_param.ssrcs);
-        stream_param.ssrc_groups.push_back(group);
-      }
-      // Generate extra ssrcs for include_rtx_streams case.
-      if (include_rtx_streams) {
-        // Generate an RTX ssrc for every ssrc in the group.
-        std::vector<uint32_t> rtx_ssrcs;
-        GenerateSsrcs(*current_streams, static_cast<int>(ssrcs.size()),
-                      &rtx_ssrcs);
-        for (size_t i = 0; i < ssrcs.size(); ++i) {
-          stream_param.AddFidSsrc(ssrcs[i], rtx_ssrcs[i]);
-        }
-        content_description->set_multistream(true);
-      }
-      // Generate extra ssrc for include_flexfec_stream case.
-      if (include_flexfec_stream) {
-        // TODO(brandtr): Update when we support multistream protection.
-        if (ssrcs.size() == 1) {
-          std::vector<uint32_t> flexfec_ssrcs;
-          GenerateSsrcs(*current_streams, 1, &flexfec_ssrcs);
-          stream_param.AddFecFrSsrc(ssrcs[0], flexfec_ssrcs[0]);
-          content_description->set_multistream(true);
-        } else if (!ssrcs.empty()) {
-          LOG(LS_WARNING)
-              << "Our FlexFEC implementation only supports protecting "
-              << "a single media streams. This session has multiple "
-              << "media streams however, so no FlexFEC SSRC will be generated.";
-        }
-      }
-      stream_param.cname = rtcp_cname;
-      // TODO(steveanton): Support any number of stream ids.
-      RTC_CHECK(sender.stream_ids.size() == 1U);
-      stream_param.sync_label = sender.stream_ids[0];
-      content_description->AddStream(stream_param);
-
-      // Store the new StreamParams in current_streams.
-      // This is necessary so that we can use the CNAME for other media types.
-      current_streams->push_back(stream_param);
-    } else {
-      // Use existing generated SSRCs/groups, but update the sync_label if
-      // necessary. This may be needed if a MediaStreamTrack was moved from one
-      // MediaStream to another.
-      // TODO(steveanton): Support any number of stream ids.
-      RTC_CHECK(sender.stream_ids.size() == 1U);
-      param->sync_label = sender.stream_ids[0];
-      content_description->AddStream(*param);
-    }
-  }
-  return true;
-}
-
-// Updates the transport infos of the |sdesc| according to the given
-// |bundle_group|. The transport infos of the content names within the
-// |bundle_group| should be updated to use the ufrag, pwd and DTLS role of the
-// first content within the |bundle_group|.
-static bool UpdateTransportInfoForBundle(const ContentGroup& bundle_group,
-                                         SessionDescription* sdesc) {
-  // The bundle should not be empty.
-  if (!sdesc || !bundle_group.FirstContentName()) {
-    return false;
-  }
-
-  // We should definitely have a transport for the first content.
-  const std::string& selected_content_name = *bundle_group.FirstContentName();
-  const TransportInfo* selected_transport_info =
-      sdesc->GetTransportInfoByName(selected_content_name);
-  if (!selected_transport_info) {
-    return false;
-  }
-
-  // Set the other contents to use the same ICE credentials.
-  const std::string& selected_ufrag =
-      selected_transport_info->description.ice_ufrag;
-  const std::string& selected_pwd =
-      selected_transport_info->description.ice_pwd;
-  ConnectionRole selected_connection_role =
-      selected_transport_info->description.connection_role;
-  for (TransportInfos::iterator it =
-           sdesc->transport_infos().begin();
-       it != sdesc->transport_infos().end(); ++it) {
-    if (bundle_group.HasContentName(it->content_name) &&
-        it->content_name != selected_content_name) {
-      it->description.ice_ufrag = selected_ufrag;
-      it->description.ice_pwd = selected_pwd;
-      it->description.connection_role = selected_connection_role;
-    }
-  }
-  return true;
-}
-
-// Gets the CryptoParamsVec of the given |content_name| from |sdesc|, and
-// sets it to |cryptos|.
-static bool GetCryptosByName(const SessionDescription* sdesc,
-                             const std::string& content_name,
-                             CryptoParamsVec* cryptos) {
-  if (!sdesc || !cryptos) {
-    return false;
-  }
-
-  const ContentInfo* content = sdesc->GetContentByName(content_name);
-  if (!IsMediaContent(content) || !content->description) {
-    return false;
-  }
-
-  const MediaContentDescription* media_desc =
-      static_cast<const MediaContentDescription*>(content->description);
-  *cryptos = media_desc->cryptos();
-  return true;
-}
-
-// Predicate function used by the remove_if.
-// Returns true if the |crypto|'s cipher_suite is not found in |filter|.
-static bool CryptoNotFound(const CryptoParams crypto,
-                           const CryptoParamsVec* filter) {
-  if (filter == NULL) {
-    return true;
-  }
-  for (CryptoParamsVec::const_iterator it = filter->begin();
-       it != filter->end(); ++it) {
-    if (it->cipher_suite == crypto.cipher_suite) {
-      return false;
-    }
-  }
-  return true;
-}
-
-// Prunes the |target_cryptos| by removing the crypto params (cipher_suite)
-// which are not available in |filter|.
-static void PruneCryptos(const CryptoParamsVec& filter,
-                         CryptoParamsVec* target_cryptos) {
-  if (!target_cryptos) {
-    return;
-  }
-  target_cryptos->erase(std::remove_if(target_cryptos->begin(),
-                                       target_cryptos->end(),
-                                       bind2nd(ptr_fun(CryptoNotFound),
-                                               &filter)),
-                        target_cryptos->end());
-}
-
-static bool IsRtpProtocol(const std::string& protocol) {
-  return protocol.empty() ||
-         (protocol.find(cricket::kMediaProtocolRtpPrefix) != std::string::npos);
-}
-
-static bool IsRtpContent(SessionDescription* sdesc,
-                         const std::string& content_name) {
-  bool is_rtp = false;
-  ContentInfo* content = sdesc->GetContentByName(content_name);
-  if (IsMediaContent(content)) {
-    MediaContentDescription* media_desc =
-        static_cast<MediaContentDescription*>(content->description);
-    if (!media_desc) {
-      return false;
-    }
-    is_rtp = IsRtpProtocol(media_desc->protocol());
-  }
-  return is_rtp;
-}
-
-// Updates the crypto parameters of the |sdesc| according to the given
-// |bundle_group|. The crypto parameters of all the contents within the
-// |bundle_group| should be updated to use the common subset of the
-// available cryptos.
-static bool UpdateCryptoParamsForBundle(const ContentGroup& bundle_group,
-                                        SessionDescription* sdesc) {
-  // The bundle should not be empty.
-  if (!sdesc || !bundle_group.FirstContentName()) {
-    return false;
-  }
-
-  bool common_cryptos_needed = false;
-  // Get the common cryptos.
-  const ContentNames& content_names = bundle_group.content_names();
-  CryptoParamsVec common_cryptos;
-  for (ContentNames::const_iterator it = content_names.begin();
-       it != content_names.end(); ++it) {
-    if (!IsRtpContent(sdesc, *it)) {
-      continue;
-    }
-    // The common cryptos are needed if any of the content does not have DTLS
-    // enabled.
-    if (!sdesc->GetTransportInfoByName(*it)->description.secure()) {
-      common_cryptos_needed = true;
-    }
-    if (it == content_names.begin()) {
-      // Initial the common_cryptos with the first content in the bundle group.
-      if (!GetCryptosByName(sdesc, *it, &common_cryptos)) {
-        return false;
-      }
-      if (common_cryptos.empty()) {
-        // If there's no crypto params, we should just return.
-        return true;
-      }
-    } else {
-      CryptoParamsVec cryptos;
-      if (!GetCryptosByName(sdesc, *it, &cryptos)) {
-        return false;
-      }
-      PruneCryptos(cryptos, &common_cryptos);
-    }
-  }
-
-  if (common_cryptos.empty() && common_cryptos_needed) {
-    return false;
-  }
-
-  // Update to use the common cryptos.
-  for (ContentNames::const_iterator it = content_names.begin();
-       it != content_names.end(); ++it) {
-    if (!IsRtpContent(sdesc, *it)) {
-      continue;
-    }
-    ContentInfo* content = sdesc->GetContentByName(*it);
-    if (IsMediaContent(content)) {
-      MediaContentDescription* media_desc =
-          static_cast<MediaContentDescription*>(content->description);
-      if (!media_desc) {
-        return false;
-      }
-      media_desc->set_cryptos(common_cryptos);
-    }
-  }
-  return true;
-}
-
-template <class C>
-static bool ContainsRtxCodec(const std::vector<C>& codecs) {
-  for (const auto& codec : codecs) {
-    if (IsRtxCodec(codec)) {
-      return true;
-    }
-  }
-  return false;
-}
-
-template <class C>
-static bool IsRtxCodec(const C& codec) {
-  return STR_CASE_CMP(codec.name.c_str(), kRtxCodecName) == 0;
-}
-
-template <class C>
-static bool ContainsFlexfecCodec(const std::vector<C>& codecs) {
-  for (const auto& codec : codecs) {
-    if (IsFlexfecCodec(codec)) {
-      return true;
-    }
-  }
-  return false;
-}
-
-template <class C>
-static bool IsFlexfecCodec(const C& codec) {
-  return STR_CASE_CMP(codec.name.c_str(), kFlexfecCodecName) == 0;
-}
-
-// Create a media content to be offered for the given |sender_options|,
-// according to the given options.rtcp_mux, session_options.is_muc, codecs,
-// secure_transport, crypto, and current_streams. If we don't currently have
-// crypto (in current_cryptos) and it is enabled (in secure_policy), crypto is
-// created (according to crypto_suites). The created content is added to the
-// offer.
-template <class C>
-static bool CreateMediaContentOffer(
-    const std::vector<SenderOptions>& sender_options,
-    const MediaSessionOptions& session_options,
-    const std::vector<C>& codecs,
-    const SecurePolicy& secure_policy,
-    const CryptoParamsVec* current_cryptos,
-    const std::vector<std::string>& crypto_suites,
-    const RtpHeaderExtensions& rtp_extensions,
-    StreamParamsVec* current_streams,
-    MediaContentDescriptionImpl<C>* offer) {
-  offer->AddCodecs(codecs);
-
-  offer->set_rtcp_mux(session_options.rtcp_mux_enabled);
-  if (offer->type() == cricket::MEDIA_TYPE_VIDEO) {
-    offer->set_rtcp_reduced_size(true);
-  }
-  offer->set_multistream(session_options.is_muc);
-  offer->set_rtp_header_extensions(rtp_extensions);
-
-  if (!AddStreamParams(sender_options, session_options.rtcp_cname,
-                       current_streams, offer)) {
-    return false;
-  }
-
-  if (secure_policy != SEC_DISABLED) {
-    if (current_cryptos) {
-      AddMediaCryptos(*current_cryptos, offer);
-    }
-    if (offer->cryptos().empty()) {
-      if (!CreateMediaCryptos(crypto_suites, offer)) {
-        return false;
-      }
-    }
-  }
-
-  if (secure_policy == SEC_REQUIRED && offer->cryptos().empty()) {
-    return false;
-  }
-  return true;
-}
-
-template <class C>
-static bool ReferencedCodecsMatch(const std::vector<C>& codecs1,
-                                  const int codec1_id,
-                                  const std::vector<C>& codecs2,
-                                  const int codec2_id) {
-  const C* codec1 = FindCodecById(codecs1, codec1_id);
-  const C* codec2 = FindCodecById(codecs2, codec2_id);
-  return codec1 != nullptr && codec2 != nullptr && codec1->Matches(*codec2);
-}
-
-template <class C>
-static void NegotiateCodecs(const std::vector<C>& local_codecs,
-                            const std::vector<C>& offered_codecs,
-                            std::vector<C>* negotiated_codecs) {
-  for (const C& ours : local_codecs) {
-    C theirs;
-    // Note that we intentionally only find one matching codec for each of our
-    // local codecs, in case the remote offer contains duplicate codecs.
-    if (FindMatchingCodec(local_codecs, offered_codecs, ours, &theirs)) {
-      C negotiated = ours;
-      negotiated.IntersectFeedbackParams(theirs);
-      if (IsRtxCodec(negotiated)) {
-        const auto apt_it =
-            theirs.params.find(kCodecParamAssociatedPayloadType);
-        // FindMatchingCodec shouldn't return something with no apt value.
-        RTC_DCHECK(apt_it != theirs.params.end());
-        negotiated.SetParam(kCodecParamAssociatedPayloadType, apt_it->second);
-      }
-      if (CodecNamesEq(ours.name.c_str(), kH264CodecName)) {
-        webrtc::H264::GenerateProfileLevelIdForAnswer(
-            ours.params, theirs.params, &negotiated.params);
-      }
-      negotiated.id = theirs.id;
-      negotiated.name = theirs.name;
-      negotiated_codecs->push_back(std::move(negotiated));
-    }
-  }
-  // RFC3264: Although the answerer MAY list the formats in their desired
-  // order of preference, it is RECOMMENDED that unless there is a
-  // specific reason, the answerer list formats in the same relative order
-  // they were present in the offer.
-  std::unordered_map<int, int> payload_type_preferences;
-  int preference = static_cast<int>(offered_codecs.size() + 1);
-  for (const C& codec : offered_codecs) {
-    payload_type_preferences[codec.id] = preference--;
-  }
-  std::sort(negotiated_codecs->begin(), negotiated_codecs->end(),
-            [&payload_type_preferences](const C& a, const C& b) {
-              return payload_type_preferences[a.id] >
-                     payload_type_preferences[b.id];
-            });
-}
-
-// Finds a codec in |codecs2| that matches |codec_to_match|, which is
-// a member of |codecs1|. If |codec_to_match| is an RTX codec, both
-// the codecs themselves and their associated codecs must match.
-template <class C>
-static bool FindMatchingCodec(const std::vector<C>& codecs1,
-                              const std::vector<C>& codecs2,
-                              const C& codec_to_match,
-                              C* found_codec) {
-  for (const C& potential_match : codecs2) {
-    if (potential_match.Matches(codec_to_match)) {
-      if (IsRtxCodec(codec_to_match)) {
-        int apt_value_1 = 0;
-        int apt_value_2 = 0;
-        if (!codec_to_match.GetParam(kCodecParamAssociatedPayloadType,
-                                     &apt_value_1) ||
-            !potential_match.GetParam(kCodecParamAssociatedPayloadType,
-                                      &apt_value_2)) {
-          LOG(LS_WARNING) << "RTX missing associated payload type.";
-          continue;
-        }
-        if (!ReferencedCodecsMatch(codecs1, apt_value_1, codecs2,
-                                   apt_value_2)) {
-          continue;
-        }
-      }
-      if (found_codec) {
-        *found_codec = potential_match;
-      }
-      return true;
-    }
-  }
-  return false;
-}
-
-// Find the codec in |codec_list| that |rtx_codec| is associated with.
-template <class C>
-static const C* GetAssociatedCodec(const std::vector<C>& codec_list,
-                                   const C& rtx_codec) {
-  std::string associated_pt_str;
-  if (!rtx_codec.GetParam(kCodecParamAssociatedPayloadType,
-                          &associated_pt_str)) {
-    LOG(LS_WARNING) << "RTX codec " << rtx_codec.name
-                    << " is missing an associated payload type.";
-    return nullptr;
-  }
-
-  int associated_pt;
-  if (!rtc::FromString(associated_pt_str, &associated_pt)) {
-    LOG(LS_WARNING) << "Couldn't convert payload type " << associated_pt_str
-                    << " of RTX codec " << rtx_codec.name << " to an integer.";
-    return nullptr;
-  }
-
-  // Find the associated reference codec for the reference RTX codec.
-  const C* associated_codec = FindCodecById(codec_list, associated_pt);
-  if (!associated_codec) {
-    LOG(LS_WARNING) << "Couldn't find associated codec with payload type "
-                    << associated_pt << " for RTX codec " << rtx_codec.name
-                    << ".";
-  }
-  return associated_codec;
-}
-
-// Adds all codecs from |reference_codecs| to |offered_codecs| that don't
-// already exist in |offered_codecs| and ensure the payload types don't
-// collide.
-template <class C>
-static void MergeCodecs(const std::vector<C>& reference_codecs,
-                        std::vector<C>* offered_codecs,
-                        UsedPayloadTypes* used_pltypes) {
-  // Add all new codecs that are not RTX codecs.
-  for (const C& reference_codec : reference_codecs) {
-    if (!IsRtxCodec(reference_codec) &&
-        !FindMatchingCodec<C>(reference_codecs, *offered_codecs,
-                              reference_codec, nullptr)) {
-      C codec = reference_codec;
-      used_pltypes->FindAndSetIdUsed(&codec);
-      offered_codecs->push_back(codec);
-    }
-  }
-
-  // Add all new RTX codecs.
-  for (const C& reference_codec : reference_codecs) {
-    if (IsRtxCodec(reference_codec) &&
-        !FindMatchingCodec<C>(reference_codecs, *offered_codecs,
-                              reference_codec, nullptr)) {
-      C rtx_codec = reference_codec;
-      const C* associated_codec =
-          GetAssociatedCodec(reference_codecs, rtx_codec);
-      if (!associated_codec) {
-        continue;
-      }
-      // Find a codec in the offered list that matches the reference codec.
-      // Its payload type may be different than the reference codec.
-      C matching_codec;
-      if (!FindMatchingCodec<C>(reference_codecs, *offered_codecs,
-                                *associated_codec, &matching_codec)) {
-        LOG(LS_WARNING) << "Couldn't find matching " << associated_codec->name
-                        << " codec.";
-        continue;
-      }
-
-      rtx_codec.params[kCodecParamAssociatedPayloadType] =
-          rtc::ToString(matching_codec.id);
-      used_pltypes->FindAndSetIdUsed(&rtx_codec);
-      offered_codecs->push_back(rtx_codec);
-    }
-  }
-}
-
-static bool FindByUriAndEncryption(const RtpHeaderExtensions& extensions,
-                                   const webrtc::RtpExtension& ext_to_match,
-                                   webrtc::RtpExtension* found_extension) {
-  for (RtpHeaderExtensions::const_iterator it = extensions.begin();
-       it != extensions.end(); ++it) {
-    // We assume that all URIs are given in a canonical format.
-    if (it->uri == ext_to_match.uri && it->encrypt == ext_to_match.encrypt) {
-      if (found_extension) {
-        *found_extension = *it;
-      }
-      return true;
-    }
-  }
-  return false;
-}
-
-static bool FindByUri(const RtpHeaderExtensions& extensions,
-                      const webrtc::RtpExtension& ext_to_match,
-                      webrtc::RtpExtension* found_extension) {
-  // We assume that all URIs are given in a canonical format.
-  const webrtc::RtpExtension* found =
-      webrtc::RtpExtension::FindHeaderExtensionByUri(extensions,
-                                                     ext_to_match.uri);
-  if (!found) {
-    return false;
-  }
-  if (found_extension) {
-    *found_extension = *found;
-  }
-  return true;
-}
-
-static bool FindByUriWithEncryptionPreference(
-    const RtpHeaderExtensions& extensions,
-    const webrtc::RtpExtension& ext_to_match, bool encryption_preference,
-    webrtc::RtpExtension* found_extension) {
-  const webrtc::RtpExtension* unencrypted_extension = nullptr;
-  for (RtpHeaderExtensions::const_iterator it = extensions.begin();
-       it  != extensions.end(); ++it) {
-    // We assume that all URIs are given in a canonical format.
-    if (it->uri == ext_to_match.uri) {
-      if (!encryption_preference || it->encrypt) {
-        if (found_extension) {
-          *found_extension = *it;
-        }
-        return true;
-      }
-      unencrypted_extension = &(*it);
-    }
-  }
-  if (unencrypted_extension) {
-    if (found_extension) {
-      *found_extension = *unencrypted_extension;
-    }
-    return true;
-  }
-  return false;
-}
-
-// Adds all extensions from |reference_extensions| to |offered_extensions| that
-// don't already exist in |offered_extensions| and ensure the IDs don't
-// collide. If an extension is added, it's also added to |regular_extensions| or
-// |encrypted_extensions|, and if the extension is in |regular_extensions| or
-// |encrypted_extensions|, its ID is marked as used in |used_ids|.
-// |offered_extensions| is for either audio or video while |regular_extensions|
-// and |encrypted_extensions| are used for both audio and video. There could be
-// overlap between audio extensions and video extensions.
-static void MergeRtpHdrExts(const RtpHeaderExtensions& reference_extensions,
-                            RtpHeaderExtensions* offered_extensions,
-                            RtpHeaderExtensions* regular_extensions,
-                            RtpHeaderExtensions* encrypted_extensions,
-                            UsedRtpHeaderExtensionIds* used_ids) {
-  for (auto reference_extension : reference_extensions) {
-    if (!FindByUriAndEncryption(*offered_extensions, reference_extension,
-                                nullptr)) {
-      webrtc::RtpExtension existing;
-      if (reference_extension.encrypt) {
-        if (FindByUriAndEncryption(*encrypted_extensions, reference_extension,
-                                   &existing)) {
-          offered_extensions->push_back(existing);
-        } else {
-          used_ids->FindAndSetIdUsed(&reference_extension);
-          encrypted_extensions->push_back(reference_extension);
-          offered_extensions->push_back(reference_extension);
-        }
-      } else {
-        if (FindByUriAndEncryption(*regular_extensions, reference_extension,
-                                   &existing)) {
-          offered_extensions->push_back(existing);
-        } else {
-          used_ids->FindAndSetIdUsed(&reference_extension);
-          regular_extensions->push_back(reference_extension);
-          offered_extensions->push_back(reference_extension);
-        }
-      }
-    }
-  }
-}
-
-static void AddEncryptedVersionsOfHdrExts(RtpHeaderExtensions* extensions,
-                                          RtpHeaderExtensions* all_extensions,
-                                          UsedRtpHeaderExtensionIds* used_ids) {
-  RtpHeaderExtensions encrypted_extensions;
-  for (const webrtc::RtpExtension& extension : *extensions) {
-    webrtc::RtpExtension existing;
-    // Don't add encrypted extensions again that were already included in a
-    // previous offer or regular extensions that are also included as encrypted
-    // extensions.
-    if (extension.encrypt ||
-        !webrtc::RtpExtension::IsEncryptionSupported(extension.uri) ||
-        (FindByUriWithEncryptionPreference(*extensions, extension, true,
-            &existing) && existing.encrypt)) {
-      continue;
-    }
-
-    if (FindByUri(*all_extensions, extension, &existing)) {
-      encrypted_extensions.push_back(existing);
-    } else {
-      webrtc::RtpExtension encrypted(extension);
-      encrypted.encrypt = true;
-      used_ids->FindAndSetIdUsed(&encrypted);
-      all_extensions->push_back(encrypted);
-      encrypted_extensions.push_back(encrypted);
-    }
-  }
-  extensions->insert(extensions->end(), encrypted_extensions.begin(),
-      encrypted_extensions.end());
-}
-
-static void NegotiateRtpHeaderExtensions(
-    const RtpHeaderExtensions& local_extensions,
-    const RtpHeaderExtensions& offered_extensions,
-    bool enable_encrypted_rtp_header_extensions,
-    RtpHeaderExtensions* negotiated_extenstions) {
-  RtpHeaderExtensions::const_iterator ours;
-  for (ours = local_extensions.begin();
-       ours != local_extensions.end(); ++ours) {
-    webrtc::RtpExtension theirs;
-    if (FindByUriWithEncryptionPreference(offered_extensions, *ours,
-        enable_encrypted_rtp_header_extensions, &theirs)) {
-      // We respond with their RTP header extension id.
-      negotiated_extenstions->push_back(theirs);
-    }
-  }
-}
-
-static void StripCNCodecs(AudioCodecs* audio_codecs) {
-  AudioCodecs::iterator iter = audio_codecs->begin();
-  while (iter != audio_codecs->end()) {
-    if (STR_CASE_CMP(iter->name.c_str(), kComfortNoiseCodecName) == 0) {
-      iter = audio_codecs->erase(iter);
-    } else {
-      ++iter;
-    }
-  }
-}
-
-// Create a media content to be answered for the given |sender_options|
-// according to the given session_options.rtcp_mux, session_options.streams,
-// codecs, crypto, and current_streams.  If we don't currently have crypto (in
-// current_cryptos) and it is enabled (in secure_policy), crypto is created
-// (according to crypto_suites). The codecs, rtcp_mux, and crypto are all
-// negotiated with the offer. If the negotiation fails, this method returns
-// false.  The created content is added to the offer.
-template <class C>
-static bool CreateMediaContentAnswer(
-    const MediaContentDescriptionImpl<C>* offer,
-    const MediaDescriptionOptions& media_description_options,
-    const MediaSessionOptions& session_options,
-    const std::vector<C>& local_codecs,
-    const SecurePolicy& sdes_policy,
-    const CryptoParamsVec* current_cryptos,
-    const RtpHeaderExtensions& local_rtp_extenstions,
-    bool enable_encrypted_rtp_header_extensions,
-    StreamParamsVec* current_streams,
-    bool bundle_enabled,
-    MediaContentDescriptionImpl<C>* answer) {
-  std::vector<C> negotiated_codecs;
-  NegotiateCodecs(local_codecs, offer->codecs(), &negotiated_codecs);
-  answer->AddCodecs(negotiated_codecs);
-  answer->set_protocol(offer->protocol());
-  RtpHeaderExtensions negotiated_rtp_extensions;
-  NegotiateRtpHeaderExtensions(local_rtp_extenstions,
-                               offer->rtp_header_extensions(),
-                               enable_encrypted_rtp_header_extensions,
-                               &negotiated_rtp_extensions);
-  answer->set_rtp_header_extensions(negotiated_rtp_extensions);
-
-  answer->set_rtcp_mux(session_options.rtcp_mux_enabled && offer->rtcp_mux());
-  if (answer->type() == cricket::MEDIA_TYPE_VIDEO) {
-    answer->set_rtcp_reduced_size(offer->rtcp_reduced_size());
-  }
-
-  if (sdes_policy != SEC_DISABLED) {
-    CryptoParams crypto;
-    if (SelectCrypto(offer, bundle_enabled, session_options.crypto_options,
-                     &crypto)) {
-      if (current_cryptos) {
-        FindMatchingCrypto(*current_cryptos, crypto, &crypto);
-      }
-      answer->AddCrypto(crypto);
-    }
-  }
-
-  if (answer->cryptos().empty() && sdes_policy == SEC_REQUIRED) {
-    return false;
-  }
-
-  if (!AddStreamParams(media_description_options.sender_options,
-                       session_options.rtcp_cname, current_streams, answer)) {
-    return false;  // Something went seriously wrong.
-  }
-
-  auto offer_rtd =
-      RtpTransceiverDirection::FromMediaContentDirection(offer->direction());
-
-  answer->set_direction(NegotiateRtpTransceiverDirection(
-                            offer_rtd, media_description_options.direction)
-                            .ToMediaContentDirection());
-  return true;
-}
-
-static bool IsMediaProtocolSupported(MediaType type,
-                                     const std::string& protocol,
-                                     bool secure_transport) {
-  // Since not all applications serialize and deserialize the media protocol,
-  // we will have to accept |protocol| to be empty.
-  if (protocol.empty()) {
-    return true;
-  }
-
-  if (type == MEDIA_TYPE_DATA) {
-    // Check for SCTP, but also for RTP for RTP-based data channels.
-    // TODO(pthatcher): Remove RTP once RTP-based data channels are gone.
-    if (secure_transport) {
-      // Most likely scenarios first.
-      return IsDtlsSctp(protocol) || IsDtlsRtp(protocol) ||
-             IsPlainRtp(protocol);
-    } else {
-      return IsPlainSctp(protocol) || IsPlainRtp(protocol);
-    }
-  }
-
-  // Allow for non-DTLS RTP protocol even when using DTLS because that's what
-  // JSEP specifies.
-  if (secure_transport) {
-    // Most likely scenarios first.
-    return IsDtlsRtp(protocol) || IsPlainRtp(protocol);
-  } else {
-    return IsPlainRtp(protocol);
-  }
-}
-
-static void SetMediaProtocol(bool secure_transport,
-                             MediaContentDescription* desc) {
-  if (!desc->cryptos().empty())
-    desc->set_protocol(kMediaProtocolSavpf);
-  else if (secure_transport)
-    desc->set_protocol(kMediaProtocolDtlsSavpf);
-  else
-    desc->set_protocol(kMediaProtocolAvpf);
-}
-
-// Gets the TransportInfo of the given |content_name| from the
-// |current_description|. If doesn't exist, returns a new one.
-static const TransportDescription* GetTransportDescription(
-    const std::string& content_name,
-    const SessionDescription* current_description) {
-  const TransportDescription* desc = NULL;
-  if (current_description) {
-    const TransportInfo* info =
-        current_description->GetTransportInfoByName(content_name);
-    if (info) {
-      desc = &info->description;
-    }
-  }
-  return desc;
-}
-
-// Gets the current DTLS state from the transport description.
-static bool IsDtlsActive(const ContentInfo* content,
-                         const SessionDescription* current_description) {
-  if (!content) {
-    return false;
-  }
-
-  size_t msection_index = content - &current_description->contents()[0];
-
-  if (current_description->transport_infos().size() <= msection_index) {
-    return false;
-  }
-
-  return current_description->transport_infos()[msection_index]
-      .description.secure();
-}
-
-std::string MediaContentDirectionToString(MediaContentDirection direction) {
-  std::string dir_str;
-  switch (direction) {
-    case MD_INACTIVE:
-      dir_str = "inactive";
-      break;
-    case MD_SENDONLY:
-      dir_str = "sendonly";
-      break;
-    case MD_RECVONLY:
-      dir_str = "recvonly";
-      break;
-    case MD_SENDRECV:
-      dir_str = "sendrecv";
-      break;
-    default:
-      RTC_NOTREACHED();
-      break;
-  }
-
-  return dir_str;
-}
-
-void MediaDescriptionOptions::AddAudioSender(
-    const std::string& track_id,
-    const std::vector<std::string>& stream_ids) {
-  RTC_DCHECK(type == MEDIA_TYPE_AUDIO);
-  AddSenderInternal(track_id, stream_ids, 1);
-}
-
-void MediaDescriptionOptions::AddVideoSender(
-    const std::string& track_id,
-    const std::vector<std::string>& stream_ids,
-    int num_sim_layers) {
-  RTC_DCHECK(type == MEDIA_TYPE_VIDEO);
-  AddSenderInternal(track_id, stream_ids, num_sim_layers);
-}
-
-void MediaDescriptionOptions::AddRtpDataChannel(const std::string& track_id,
-                                                const std::string& stream_id) {
-  RTC_DCHECK(type == MEDIA_TYPE_DATA);
-  // TODO(steveanton): Is it the case that RtpDataChannel will never have more
-  // than one stream?
-  AddSenderInternal(track_id, {stream_id}, 1);
-}
-
-void MediaDescriptionOptions::AddSenderInternal(
-    const std::string& track_id,
-    const std::vector<std::string>& stream_ids,
-    int num_sim_layers) {
-  // TODO(steveanton): Support any number of stream ids.
-  RTC_CHECK(stream_ids.size() == 1U);
-  sender_options.push_back(SenderOptions{track_id, stream_ids, num_sim_layers});
-}
-
-bool MediaSessionOptions::HasMediaDescription(MediaType type) const {
-  return std::find_if(media_description_options.begin(),
-                      media_description_options.end(),
-                      [type](const MediaDescriptionOptions& t) {
-                        return t.type == type;
-                      }) != media_description_options.end();
-}
-
-MediaSessionDescriptionFactory::MediaSessionDescriptionFactory(
-    const TransportDescriptionFactory* transport_desc_factory)
-    : transport_desc_factory_(transport_desc_factory) {}
-
-MediaSessionDescriptionFactory::MediaSessionDescriptionFactory(
-    ChannelManager* channel_manager,
-    const TransportDescriptionFactory* transport_desc_factory)
-    : transport_desc_factory_(transport_desc_factory) {
-  channel_manager->GetSupportedAudioSendCodecs(&audio_send_codecs_);
-  channel_manager->GetSupportedAudioReceiveCodecs(&audio_recv_codecs_);
-  channel_manager->GetSupportedAudioRtpHeaderExtensions(&audio_rtp_extensions_);
-  channel_manager->GetSupportedVideoCodecs(&video_codecs_);
-  channel_manager->GetSupportedVideoRtpHeaderExtensions(&video_rtp_extensions_);
-  channel_manager->GetSupportedDataCodecs(&data_codecs_);
-  ComputeAudioCodecsIntersectionAndUnion();
-}
-
-const AudioCodecs& MediaSessionDescriptionFactory::audio_sendrecv_codecs()
-    const {
-  return audio_sendrecv_codecs_;
-}
-
-const AudioCodecs& MediaSessionDescriptionFactory::audio_send_codecs() const {
-  return audio_send_codecs_;
-}
-
-const AudioCodecs& MediaSessionDescriptionFactory::audio_recv_codecs() const {
-  return audio_recv_codecs_;
-}
-
-void MediaSessionDescriptionFactory::set_audio_codecs(
-    const AudioCodecs& send_codecs, const AudioCodecs& recv_codecs) {
-  audio_send_codecs_ = send_codecs;
-  audio_recv_codecs_ = recv_codecs;
-  ComputeAudioCodecsIntersectionAndUnion();
-}
-
-SessionDescription* MediaSessionDescriptionFactory::CreateOffer(
-    const MediaSessionOptions& session_options,
-    const SessionDescription* current_description) const {
-  std::unique_ptr<SessionDescription> offer(new SessionDescription());
-
-  StreamParamsVec current_streams;
-  GetCurrentStreamParams(current_description, &current_streams);
-
-  AudioCodecs offer_audio_codecs;
-  VideoCodecs offer_video_codecs;
-  DataCodecs offer_data_codecs;
-  GetCodecsForOffer(current_description, &offer_audio_codecs,
-                    &offer_video_codecs, &offer_data_codecs);
-
-  if (!session_options.vad_enabled) {
-    // If application doesn't want CN codecs in offer.
-    StripCNCodecs(&offer_audio_codecs);
-  }
-  FilterDataCodecs(&offer_data_codecs,
-                   session_options.data_channel_type == DCT_SCTP);
-
-  RtpHeaderExtensions audio_rtp_extensions;
-  RtpHeaderExtensions video_rtp_extensions;
-  GetRtpHdrExtsToOffer(current_description, &audio_rtp_extensions,
-                       &video_rtp_extensions);
-
-  // Must have options for each existing section.
-  if (current_description) {
-    RTC_DCHECK(current_description->contents().size() <=
-               session_options.media_description_options.size());
-  }
-
-  // Iterate through the media description options, matching with existing media
-  // descriptions in |current_description|.
-  int msection_index = 0;
-  for (const MediaDescriptionOptions& media_description_options :
-       session_options.media_description_options) {
-    const ContentInfo* current_content = nullptr;
-    if (current_description &&
-        msection_index <
-            static_cast<int>(current_description->contents().size())) {
-      current_content = &current_description->contents()[msection_index];
-      // Media type must match.
-      RTC_DCHECK(IsMediaContentOfType(current_content,
-                                      media_description_options.type));
-    }
-    switch (media_description_options.type) {
-      case MEDIA_TYPE_AUDIO:
-        if (!AddAudioContentForOffer(media_description_options, session_options,
-                                     current_content, current_description,
-                                     audio_rtp_extensions, offer_audio_codecs,
-                                     &current_streams, offer.get())) {
-          return nullptr;
-        }
-        break;
-      case MEDIA_TYPE_VIDEO:
-        if (!AddVideoContentForOffer(media_description_options, session_options,
-                                     current_content, current_description,
-                                     video_rtp_extensions, offer_video_codecs,
-                                     &current_streams, offer.get())) {
-          return nullptr;
-        }
-        break;
-      case MEDIA_TYPE_DATA:
-        if (!AddDataContentForOffer(media_description_options, session_options,
-                                    current_content, current_description,
-                                    offer_data_codecs, &current_streams,
-                                    offer.get())) {
-          return nullptr;
-        }
-        break;
-      default:
-        RTC_NOTREACHED();
-    }
-    ++msection_index;
-  }
-
-  // Bundle the contents together, if we've been asked to do so, and update any
-  // parameters that need to be tweaked for BUNDLE.
-  if (session_options.bundle_enabled && offer->contents().size() > 0u) {
-    ContentGroup offer_bundle(GROUP_TYPE_BUNDLE);
-    for (const ContentInfo& content : offer->contents()) {
-      // TODO(deadbeef): There are conditions that make bundling two media
-      // descriptions together illegal. For example, they use the same payload
-      // type to represent different codecs, or same IDs for different header
-      // extensions. We need to detect this and not try to bundle those media
-      // descriptions together.
-      offer_bundle.AddContentName(content.name);
-    }
-    offer->AddGroup(offer_bundle);
-    if (!UpdateTransportInfoForBundle(offer_bundle, offer.get())) {
-      LOG(LS_ERROR) << "CreateOffer failed to UpdateTransportInfoForBundle.";
-      return nullptr;
-    }
-    if (!UpdateCryptoParamsForBundle(offer_bundle, offer.get())) {
-      LOG(LS_ERROR) << "CreateOffer failed to UpdateCryptoParamsForBundle.";
-      return nullptr;
-    }
-  }
-  return offer.release();
-}
-
-SessionDescription* MediaSessionDescriptionFactory::CreateAnswer(
-    const SessionDescription* offer,
-    const MediaSessionOptions& session_options,
-    const SessionDescription* current_description) const {
-  if (!offer) {
-    return nullptr;
-  }
-  // The answer contains the intersection of the codecs in the offer with the
-  // codecs we support. As indicated by XEP-0167, we retain the same payload ids
-  // from the offer in the answer.
-  std::unique_ptr<SessionDescription> answer(new SessionDescription());
-
-  StreamParamsVec current_streams;
-  GetCurrentStreamParams(current_description, &current_streams);
-
-  // If the offer supports BUNDLE, and we want to use it too, create a BUNDLE
-  // group in the answer with the appropriate content names.
-  const ContentGroup* offer_bundle = offer->GetGroupByName(GROUP_TYPE_BUNDLE);
-  ContentGroup answer_bundle(GROUP_TYPE_BUNDLE);
-  // Transport info shared by the bundle group.
-  std::unique_ptr<TransportInfo> bundle_transport;
-
-  // Get list of all possible codecs that respects existing payload type
-  // mappings and uses a single payload type space.
-  //
-  // Note that these lists may be further filtered for each m= section; this
-  // step is done just to establish the payload type mappings shared by all
-  // sections.
-  AudioCodecs answer_audio_codecs;
-  VideoCodecs answer_video_codecs;
-  DataCodecs answer_data_codecs;
-  GetCodecsForAnswer(current_description, offer, &answer_audio_codecs,
-                     &answer_video_codecs, &answer_data_codecs);
-
-  if (!session_options.vad_enabled) {
-    // If application doesn't want CN codecs in answer.
-    StripCNCodecs(&answer_audio_codecs);
-  }
-  FilterDataCodecs(&answer_data_codecs,
-                   session_options.data_channel_type == DCT_SCTP);
-
-  // Must have options for exactly as many sections as in the offer.
-  RTC_DCHECK(offer->contents().size() ==
-             session_options.media_description_options.size());
-  // Iterate through the media description options, matching with existing
-  // media descriptions in |current_description|.
-  int msection_index = 0;
-  for (const MediaDescriptionOptions& media_description_options :
-       session_options.media_description_options) {
-    const ContentInfo* offer_content = &offer->contents()[msection_index];
-    // Media types and MIDs must match between the remote offer and the
-    // MediaDescriptionOptions.
-    RTC_DCHECK(
-        IsMediaContentOfType(offer_content, media_description_options.type));
-    RTC_DCHECK(media_description_options.mid == offer_content->name);
-    const ContentInfo* current_content = nullptr;
-    if (current_description &&
-        msection_index <
-            static_cast<int>(current_description->contents().size())) {
-      current_content = &current_description->contents()[msection_index];
-    }
-    switch (media_description_options.type) {
-      case MEDIA_TYPE_AUDIO:
-        if (!AddAudioContentForAnswer(
-                media_description_options, session_options, offer_content,
-                offer, current_content, current_description,
-                bundle_transport.get(), answer_audio_codecs, &current_streams,
-                answer.get())) {
-          return nullptr;
-        }
-        break;
-      case MEDIA_TYPE_VIDEO:
-        if (!AddVideoContentForAnswer(
-                media_description_options, session_options, offer_content,
-                offer, current_content, current_description,
-                bundle_transport.get(), answer_video_codecs, &current_streams,
-                answer.get())) {
-          return nullptr;
-        }
-        break;
-      case MEDIA_TYPE_DATA:
-        if (!AddDataContentForAnswer(media_description_options, session_options,
-                                     offer_content, offer, current_content,
-                                     current_description,
-                                     bundle_transport.get(), answer_data_codecs,
-                                     &current_streams, answer.get())) {
-          return nullptr;
-        }
-        break;
-      default:
-        RTC_NOTREACHED();
-    }
-    ++msection_index;
-    // See if we can add the newly generated m= section to the BUNDLE group in
-    // the answer.
-    ContentInfo& added = answer->contents().back();
-    if (!added.rejected && session_options.bundle_enabled && offer_bundle &&
-        offer_bundle->HasContentName(added.name)) {
-      answer_bundle.AddContentName(added.name);
-      bundle_transport.reset(
-          new TransportInfo(*answer->GetTransportInfoByName(added.name)));
-    }
-  }
-
-  // Only put BUNDLE group in answer if nonempty.
-  if (answer_bundle.FirstContentName()) {
-    answer->AddGroup(answer_bundle);
-
-    // Share the same ICE credentials and crypto params across all contents,
-    // as BUNDLE requires.
-    if (!UpdateTransportInfoForBundle(answer_bundle, answer.get())) {
-      LOG(LS_ERROR) << "CreateAnswer failed to UpdateTransportInfoForBundle.";
-      return NULL;
-    }
-
-    if (!UpdateCryptoParamsForBundle(answer_bundle, answer.get())) {
-      LOG(LS_ERROR) << "CreateAnswer failed to UpdateCryptoParamsForBundle.";
-      return NULL;
-    }
-  }
-
-  return answer.release();
-}
-
-const AudioCodecs& MediaSessionDescriptionFactory::GetAudioCodecsForOffer(
-    const RtpTransceiverDirection& direction) const {
-  // If stream is inactive - generate list as if sendrecv.
-  if (direction.send == direction.recv) {
-    return audio_sendrecv_codecs_;
-  } else if (direction.send) {
-    return audio_send_codecs_;
-  } else {
-    return audio_recv_codecs_;
-  }
-}
-
-const AudioCodecs& MediaSessionDescriptionFactory::GetAudioCodecsForAnswer(
-    const RtpTransceiverDirection& offer,
-    const RtpTransceiverDirection& answer) const {
-  // For inactive and sendrecv answers, generate lists as if we were to accept
-  // the offer's direction. See RFC 3264 Section 6.1.
-  if (answer.send == answer.recv) {
-    if (offer.send == offer.recv) {
-      return audio_sendrecv_codecs_;
-    } else if (offer.send) {
-      return audio_recv_codecs_;
-    } else {
-      return audio_send_codecs_;
-    }
-  } else if (answer.send) {
-    return audio_send_codecs_;
-  } else {
-    return audio_recv_codecs_;
-  }
-}
-
-void MergeCodecsFromDescription(const SessionDescription* description,
-                                AudioCodecs* audio_codecs,
-                                VideoCodecs* video_codecs,
-                                DataCodecs* data_codecs,
-                                UsedPayloadTypes* used_pltypes) {
-  RTC_DCHECK(description);
-  for (const ContentInfo& content : description->contents()) {
-    if (IsMediaContentOfType(&content, MEDIA_TYPE_AUDIO)) {
-      const AudioContentDescription* audio =
-          static_cast<AudioContentDescription*>(content.description);
-      MergeCodecs<AudioCodec>(audio->codecs(), audio_codecs, used_pltypes);
-    } else if (IsMediaContentOfType(&content, MEDIA_TYPE_VIDEO)) {
-      const VideoContentDescription* video =
-          static_cast<VideoContentDescription*>(content.description);
-      MergeCodecs<VideoCodec>(video->codecs(), video_codecs, used_pltypes);
-    } else if (IsMediaContentOfType(&content, MEDIA_TYPE_DATA)) {
-      const DataContentDescription* data =
-          static_cast<DataContentDescription*>(content.description);
-      MergeCodecs<DataCodec>(data->codecs(), data_codecs, used_pltypes);
-    }
-  }
-}
-
-// Getting codecs for an offer involves these steps:
-//
-// 1. Construct payload type -> codec mappings for current description.
-// 2. Add any reference codecs that weren't already present
-// 3. For each individual media description (m= section), filter codecs based
-//    on the directional attribute (happens in another method).
-void MediaSessionDescriptionFactory::GetCodecsForOffer(
-    const SessionDescription* current_description,
-    AudioCodecs* audio_codecs,
-    VideoCodecs* video_codecs,
-    DataCodecs* data_codecs) const {
-  UsedPayloadTypes used_pltypes;
-  audio_codecs->clear();
-  video_codecs->clear();
-  data_codecs->clear();
-
-  // First - get all codecs from the current description if the media type
-  // is used. Add them to |used_pltypes| so the payload type is not reused if a
-  // new media type is added.
-  if (current_description) {
-    MergeCodecsFromDescription(current_description, audio_codecs, video_codecs,
-                               data_codecs, &used_pltypes);
-  }
-
-  // Add our codecs that are not in |current_description|.
-  MergeCodecs<AudioCodec>(all_audio_codecs_, audio_codecs, &used_pltypes);
-  MergeCodecs<VideoCodec>(video_codecs_, video_codecs, &used_pltypes);
-  MergeCodecs<DataCodec>(data_codecs_, data_codecs, &used_pltypes);
-}
-
-// Getting codecs for an answer involves these steps:
-//
-// 1. Construct payload type -> codec mappings for current description.
-// 2. Add any codecs from the offer that weren't already present.
-// 3. Add any remaining codecs that weren't already present.
-// 4. For each individual media description (m= section), filter codecs based
-//    on the directional attribute (happens in another method).
-void MediaSessionDescriptionFactory::GetCodecsForAnswer(
-    const SessionDescription* current_description,
-    const SessionDescription* remote_offer,
-    AudioCodecs* audio_codecs,
-    VideoCodecs* video_codecs,
-    DataCodecs* data_codecs) const {
-  UsedPayloadTypes used_pltypes;
-  audio_codecs->clear();
-  video_codecs->clear();
-  data_codecs->clear();
-
-  // First - get all codecs from the current description if the media type
-  // is used. Add them to |used_pltypes| so the payload type is not reused if a
-  // new media type is added.
-  if (current_description) {
-    MergeCodecsFromDescription(current_description, audio_codecs, video_codecs,
-                               data_codecs, &used_pltypes);
-  }
-
-  // Second - filter out codecs that we don't support at all and should ignore.
-  AudioCodecs filtered_offered_audio_codecs;
-  VideoCodecs filtered_offered_video_codecs;
-  DataCodecs filtered_offered_data_codecs;
-  for (const ContentInfo& content : remote_offer->contents()) {
-    if (IsMediaContentOfType(&content, MEDIA_TYPE_AUDIO)) {
-      const AudioContentDescription* audio =
-          static_cast<AudioContentDescription*>(content.description);
-      for (const AudioCodec& offered_audio_codec : audio->codecs()) {
-        if (!FindMatchingCodec<AudioCodec>(audio->codecs(),
-                                           filtered_offered_audio_codecs,
-                                           offered_audio_codec, nullptr) &&
-            FindMatchingCodec<AudioCodec>(audio->codecs(), all_audio_codecs_,
-                                          offered_audio_codec, nullptr)) {
-          filtered_offered_audio_codecs.push_back(offered_audio_codec);
-        }
-      }
-    } else if (IsMediaContentOfType(&content, MEDIA_TYPE_VIDEO)) {
-      const VideoContentDescription* video =
-          static_cast<VideoContentDescription*>(content.description);
-      for (const VideoCodec& offered_video_codec : video->codecs()) {
-        if (!FindMatchingCodec<VideoCodec>(video->codecs(),
-                                           filtered_offered_video_codecs,
-                                           offered_video_codec, nullptr) &&
-            FindMatchingCodec<VideoCodec>(video->codecs(), video_codecs_,
-                                          offered_video_codec, nullptr)) {
-          filtered_offered_video_codecs.push_back(offered_video_codec);
-        }
-      }
-    } else if (IsMediaContentOfType(&content, MEDIA_TYPE_DATA)) {
-      const DataContentDescription* data =
-          static_cast<DataContentDescription*>(content.description);
-      for (const DataCodec& offered_data_codec : data->codecs()) {
-        if (!FindMatchingCodec<DataCodec>(data->codecs(),
-                                          filtered_offered_data_codecs,
-                                          offered_data_codec, nullptr) &&
-            FindMatchingCodec<DataCodec>(data->codecs(), data_codecs_,
-                                         offered_data_codec, nullptr)) {
-          filtered_offered_data_codecs.push_back(offered_data_codec);
-        }
-      }
-    }
-  }
-
-  // Add codecs that are not in |current_description| but were in
-  // |remote_offer|.
-  MergeCodecs<AudioCodec>(filtered_offered_audio_codecs, audio_codecs,
-                          &used_pltypes);
-  MergeCodecs<VideoCodec>(filtered_offered_video_codecs, video_codecs,
-                          &used_pltypes);
-  MergeCodecs<DataCodec>(filtered_offered_data_codecs, data_codecs,
-                         &used_pltypes);
-}
-
-void MediaSessionDescriptionFactory::GetRtpHdrExtsToOffer(
-    const SessionDescription* current_description,
-    RtpHeaderExtensions* offer_audio_extensions,
-    RtpHeaderExtensions* offer_video_extensions) const {
-  // All header extensions allocated from the same range to avoid potential
-  // issues when using BUNDLE.
-  UsedRtpHeaderExtensionIds used_ids;
-  RtpHeaderExtensions all_regular_extensions;
-  RtpHeaderExtensions all_encrypted_extensions;
-  offer_audio_extensions->clear();
-  offer_video_extensions->clear();
-
-  // First - get all extensions from the current description if the media type
-  // is used.
-  // Add them to |used_ids| so the local ids are not reused if a new media
-  // type is added.
-  if (current_description) {
-    for (const ContentInfo& content : current_description->contents()) {
-      if (IsMediaContentOfType(&content, MEDIA_TYPE_AUDIO)) {
-        const AudioContentDescription* audio =
-            static_cast<const AudioContentDescription*>(content.description);
-        MergeRtpHdrExts(audio->rtp_header_extensions(), offer_audio_extensions,
-                        &all_regular_extensions, &all_encrypted_extensions,
-                        &used_ids);
-      } else if (IsMediaContentOfType(&content, MEDIA_TYPE_VIDEO)) {
-        const VideoContentDescription* video =
-            static_cast<const VideoContentDescription*>(content.description);
-        MergeRtpHdrExts(video->rtp_header_extensions(), offer_video_extensions,
-                        &all_regular_extensions, &all_encrypted_extensions,
-                        &used_ids);
-      }
-    }
-  }
-
-  // Add our default RTP header extensions that are not in
-  // |current_description|.
-  MergeRtpHdrExts(audio_rtp_header_extensions(), offer_audio_extensions,
-                  &all_regular_extensions, &all_encrypted_extensions,
-                  &used_ids);
-  MergeRtpHdrExts(video_rtp_header_extensions(), offer_video_extensions,
-                  &all_regular_extensions, &all_encrypted_extensions,
-                  &used_ids);
-
-  // TODO(jbauch): Support adding encrypted header extensions to existing
-  // sessions.
-  if (enable_encrypted_rtp_header_extensions_ && !current_description) {
-    AddEncryptedVersionsOfHdrExts(offer_audio_extensions,
-                                  &all_encrypted_extensions, &used_ids);
-    AddEncryptedVersionsOfHdrExts(offer_video_extensions,
-                                  &all_encrypted_extensions, &used_ids);
-  }
-}
-
-bool MediaSessionDescriptionFactory::AddTransportOffer(
-  const std::string& content_name,
-  const TransportOptions& transport_options,
-  const SessionDescription* current_desc,
-  SessionDescription* offer_desc) const {
-  if (!transport_desc_factory_)
-     return false;
-  const TransportDescription* current_tdesc =
-      GetTransportDescription(content_name, current_desc);
-  std::unique_ptr<TransportDescription> new_tdesc(
-      transport_desc_factory_->CreateOffer(transport_options, current_tdesc));
-  bool ret = (new_tdesc.get() != NULL &&
-      offer_desc->AddTransportInfo(TransportInfo(content_name, *new_tdesc)));
-  if (!ret) {
-    LOG(LS_ERROR)
-        << "Failed to AddTransportOffer, content name=" << content_name;
-  }
-  return ret;
-}
-
-TransportDescription* MediaSessionDescriptionFactory::CreateTransportAnswer(
-    const std::string& content_name,
-    const SessionDescription* offer_desc,
-    const TransportOptions& transport_options,
-    const SessionDescription* current_desc,
-    bool require_transport_attributes) const {
-  if (!transport_desc_factory_)
-    return NULL;
-  const TransportDescription* offer_tdesc =
-      GetTransportDescription(content_name, offer_desc);
-  const TransportDescription* current_tdesc =
-      GetTransportDescription(content_name, current_desc);
-  return transport_desc_factory_->CreateAnswer(offer_tdesc, transport_options,
-                                               require_transport_attributes,
-                                               current_tdesc);
-}
-
-bool MediaSessionDescriptionFactory::AddTransportAnswer(
-    const std::string& content_name,
-    const TransportDescription& transport_desc,
-    SessionDescription* answer_desc) const {
-  if (!answer_desc->AddTransportInfo(TransportInfo(content_name,
-                                                   transport_desc))) {
-    LOG(LS_ERROR)
-        << "Failed to AddTransportAnswer, content name=" << content_name;
-    return false;
-  }
-  return true;
-}
-
-// |audio_codecs| = set of all possible codecs that can be used, with correct
-// payload type mappings
-//
-// |supported_audio_codecs| = set of codecs that are supported for the direction
-// of this m= section
-//
-// acd->codecs() = set of previously negotiated codecs for this m= section
-//
-// The payload types should come from audio_codecs, but the order should come
-// from acd->codecs() and then supported_codecs, to ensure that re-offers don't
-// change existing codec priority, and that new codecs are added with the right
-// priority.
-bool MediaSessionDescriptionFactory::AddAudioContentForOffer(
-    const MediaDescriptionOptions& media_description_options,
-    const MediaSessionOptions& session_options,
-    const ContentInfo* current_content,
-    const SessionDescription* current_description,
-    const RtpHeaderExtensions& audio_rtp_extensions,
-    const AudioCodecs& audio_codecs,
-    StreamParamsVec* current_streams,
-    SessionDescription* desc) const {
-  // Filter audio_codecs (which includes all codecs, with correctly remapped
-  // payload types) based on transceiver direction.
-  const AudioCodecs& supported_audio_codecs =
-      GetAudioCodecsForOffer(media_description_options.direction);
-
-  AudioCodecs filtered_codecs;
-  // Add the codecs from current content if exists.
-  if (current_content) {
-    RTC_DCHECK(IsMediaContentOfType(current_content, MEDIA_TYPE_AUDIO));
-    const AudioContentDescription* acd =
-        static_cast<const AudioContentDescription*>(
-            current_content->description);
-    for (const AudioCodec& codec : acd->codecs()) {
-      if (FindMatchingCodec<AudioCodec>(supported_audio_codecs, audio_codecs,
-                                        codec, nullptr)) {
-        filtered_codecs.push_back(codec);
-      }
-    }
-  }
-  // Add other supported audio codecs.
-  AudioCodec found_codec;
-  for (const AudioCodec& codec : supported_audio_codecs) {
-    if (FindMatchingCodec<AudioCodec>(supported_audio_codecs, audio_codecs,
-                                      codec, &found_codec) &&
-        !FindMatchingCodec<AudioCodec>(supported_audio_codecs, filtered_codecs,
-                                       codec, nullptr)) {
-      // Use the |found_codec| from |audio_codecs| because it has the correctly
-      // mapped payload type.
-      filtered_codecs.push_back(found_codec);
-    }
-  }
-
-  cricket::SecurePolicy sdes_policy =
-      IsDtlsActive(current_content, current_description) ? cricket::SEC_DISABLED
-                                                         : secure();
-
-  std::unique_ptr<AudioContentDescription> audio(new AudioContentDescription());
-  std::vector<std::string> crypto_suites;
-  GetSupportedAudioSdesCryptoSuiteNames(session_options.crypto_options,
-                                        &crypto_suites);
-  if (!CreateMediaContentOffer(
-          media_description_options.sender_options, session_options,
-          filtered_codecs, sdes_policy, GetCryptos(current_content),
-          crypto_suites, audio_rtp_extensions, current_streams, audio.get())) {
-    return false;
-  }
-  audio->set_lang(lang_);
-
-  bool secure_transport = (transport_desc_factory_->secure() != SEC_DISABLED);
-  SetMediaProtocol(secure_transport, audio.get());
-
-  audio->set_direction(
-      media_description_options.direction.ToMediaContentDirection());
-
-  desc->AddContent(media_description_options.mid, NS_JINGLE_RTP,
-                   media_description_options.stopped, audio.release());
-  if (!AddTransportOffer(media_description_options.mid,
-                         media_description_options.transport_options,
-                         current_description, desc)) {
-    return false;
-  }
-
-  return true;
-}
-
-bool MediaSessionDescriptionFactory::AddVideoContentForOffer(
-    const MediaDescriptionOptions& media_description_options,
-    const MediaSessionOptions& session_options,
-    const ContentInfo* current_content,
-    const SessionDescription* current_description,
-    const RtpHeaderExtensions& video_rtp_extensions,
-    const VideoCodecs& video_codecs,
-    StreamParamsVec* current_streams,
-    SessionDescription* desc) const {
-  cricket::SecurePolicy sdes_policy =
-      IsDtlsActive(current_content, current_description) ? cricket::SEC_DISABLED
-                                                         : secure();
-
-  std::unique_ptr<VideoContentDescription> video(new VideoContentDescription());
-  std::vector<std::string> crypto_suites;
-  GetSupportedVideoSdesCryptoSuiteNames(session_options.crypto_options,
-                                        &crypto_suites);
-
-  VideoCodecs filtered_codecs;
-  // Add the codecs from current content if exists.
-  if (current_content) {
-    RTC_DCHECK(IsMediaContentOfType(current_content, MEDIA_TYPE_VIDEO));
-    const VideoContentDescription* vcd =
-        static_cast<const VideoContentDescription*>(
-            current_content->description);
-    for (const VideoCodec& codec : vcd->codecs()) {
-      if (FindMatchingCodec<VideoCodec>(video_codecs_, video_codecs, codec,
-                                        nullptr)) {
-        filtered_codecs.push_back(codec);
-      }
-    }
-  }
-  // Add other supported video codecs.
-  VideoCodec found_codec;
-  for (const VideoCodec& codec : video_codecs_) {
-    if (FindMatchingCodec<VideoCodec>(video_codecs_, video_codecs, codec,
-                                      &found_codec) &&
-        !FindMatchingCodec<VideoCodec>(video_codecs_, filtered_codecs, codec,
-                                       nullptr)) {
-      // Use the |found_codec| from |video_codecs| because it has the correctly
-      // mapped payload type.
-      filtered_codecs.push_back(found_codec);
-    }
-  }
-
-  if (!CreateMediaContentOffer(
-          media_description_options.sender_options, session_options,
-          filtered_codecs, sdes_policy, GetCryptos(current_content),
-          crypto_suites, video_rtp_extensions, current_streams, video.get())) {
-    return false;
-  }
-
-  video->set_bandwidth(kAutoBandwidth);
-
-  bool secure_transport = (transport_desc_factory_->secure() != SEC_DISABLED);
-  SetMediaProtocol(secure_transport, video.get());
-
-  video->set_direction(
-      media_description_options.direction.ToMediaContentDirection());
-
-  desc->AddContent(media_description_options.mid, NS_JINGLE_RTP,
-                   media_description_options.stopped, video.release());
-  if (!AddTransportOffer(media_description_options.mid,
-                         media_description_options.transport_options,
-                         current_description, desc)) {
-    return false;
-  }
-  return true;
-}
-
-bool MediaSessionDescriptionFactory::AddDataContentForOffer(
-    const MediaDescriptionOptions& media_description_options,
-    const MediaSessionOptions& session_options,
-    const ContentInfo* current_content,
-    const SessionDescription* current_description,
-    const DataCodecs& data_codecs,
-    StreamParamsVec* current_streams,
-    SessionDescription* desc) const {
-  bool secure_transport = (transport_desc_factory_->secure() != SEC_DISABLED);
-
-  std::unique_ptr<DataContentDescription> data(new DataContentDescription());
-  bool is_sctp = (session_options.data_channel_type == DCT_SCTP);
-  // If the DataChannel type is not specified, use the DataChannel type in
-  // the current description.
-  if (session_options.data_channel_type == DCT_NONE && current_content) {
-    is_sctp = (static_cast<const DataContentDescription*>(
-                   current_content->description)
-                   ->protocol() == kMediaProtocolSctp);
-  }
-
-  cricket::SecurePolicy sdes_policy =
-      IsDtlsActive(current_content, current_description) ? cricket::SEC_DISABLED
-                                                         : secure();
-  std::vector<std::string> crypto_suites;
-  if (is_sctp) {
-    // SDES doesn't make sense for SCTP, so we disable it, and we only
-    // get SDES crypto suites for RTP-based data channels.
-    sdes_policy = cricket::SEC_DISABLED;
-    // Unlike SetMediaProtocol below, we need to set the protocol
-    // before we call CreateMediaContentOffer.  Otherwise,
-    // CreateMediaContentOffer won't know this is SCTP and will
-    // generate SSRCs rather than SIDs.
-    // TODO(deadbeef): Offer kMediaProtocolUdpDtlsSctp (or TcpDtlsSctp), once
-    // it's safe to do so. Older versions of webrtc would reject these
-    // protocols; see https://bugs.chromium.org/p/webrtc/issues/detail?id=7706.
-    data->set_protocol(
-        secure_transport ? kMediaProtocolDtlsSctp : kMediaProtocolSctp);
-  } else {
-    GetSupportedDataSdesCryptoSuiteNames(session_options.crypto_options,
-                                         &crypto_suites);
-  }
-
-  // Even SCTP uses a "codec".
-  if (!CreateMediaContentOffer(
-          media_description_options.sender_options, session_options,
-          data_codecs, sdes_policy, GetCryptos(current_content), crypto_suites,
-          RtpHeaderExtensions(), current_streams, data.get())) {
-    return false;
-  }
-
-  if (is_sctp) {
-    desc->AddContent(media_description_options.mid, NS_JINGLE_DRAFT_SCTP,
-                     data.release());
-  } else {
-    data->set_bandwidth(kDataMaxBandwidth);
-    SetMediaProtocol(secure_transport, data.get());
-    desc->AddContent(media_description_options.mid, NS_JINGLE_RTP,
-                     media_description_options.stopped, data.release());
-  }
-  if (!AddTransportOffer(media_description_options.mid,
-                         media_description_options.transport_options,
-                         current_description, desc)) {
-    return false;
-  }
-  return true;
-}
-
-// |audio_codecs| = set of all possible codecs that can be used, with correct
-// payload type mappings
-//
-// |supported_audio_codecs| = set of codecs that are supported for the direction
-// of this m= section
-//
-// acd->codecs() = set of previously negotiated codecs for this m= section
-//
-// The payload types should come from audio_codecs, but the order should come
-// from acd->codecs() and then supported_codecs, to ensure that re-offers don't
-// change existing codec priority, and that new codecs are added with the right
-// priority.
-bool MediaSessionDescriptionFactory::AddAudioContentForAnswer(
-    const MediaDescriptionOptions& media_description_options,
-    const MediaSessionOptions& session_options,
-    const ContentInfo* offer_content,
-    const SessionDescription* offer_description,
-    const ContentInfo* current_content,
-    const SessionDescription* current_description,
-    const TransportInfo* bundle_transport,
-    const AudioCodecs& audio_codecs,
-    StreamParamsVec* current_streams,
-    SessionDescription* answer) const {
-  const AudioContentDescription* offer_audio_description =
-      static_cast<const AudioContentDescription*>(offer_content->description);
-
-  std::unique_ptr<TransportDescription> audio_transport(
-      CreateTransportAnswer(media_description_options.mid, offer_description,
-                            media_description_options.transport_options,
-                            current_description, bundle_transport != nullptr));
-  if (!audio_transport) {
-    return false;
-  }
-
-  // Pick codecs based on the requested communications direction in the offer
-  // and the selected direction in the answer.
-  // Note these will be filtered one final time in CreateMediaContentAnswer.
-  auto wants_rtd = media_description_options.direction;
-  auto offer_rtd = RtpTransceiverDirection::FromMediaContentDirection(
-      offer_audio_description->direction());
-  auto answer_rtd = NegotiateRtpTransceiverDirection(offer_rtd, wants_rtd);
-  AudioCodecs supported_audio_codecs =
-      GetAudioCodecsForAnswer(offer_rtd, answer_rtd);
-
-  AudioCodecs filtered_codecs;
-  // Add the codecs from current content if exists.
-  if (current_content) {
-    RTC_DCHECK(IsMediaContentOfType(current_content, MEDIA_TYPE_AUDIO));
-    const AudioContentDescription* acd =
-        static_cast<const AudioContentDescription*>(
-            current_content->description);
-    for (const AudioCodec& codec : acd->codecs()) {
-      if (FindMatchingCodec<AudioCodec>(supported_audio_codecs, audio_codecs,
-                                        codec, nullptr)) {
-        filtered_codecs.push_back(codec);
-      }
-    }
-  }
-  // Add other supported audio codecs.
-  AudioCodec found_codec;
-  for (const AudioCodec& codec : supported_audio_codecs) {
-    if (FindMatchingCodec<AudioCodec>(supported_audio_codecs, audio_codecs,
-                                      codec, &found_codec) &&
-        !FindMatchingCodec<AudioCodec>(supported_audio_codecs, filtered_codecs,
-                                       codec, nullptr)) {
-      // Use the |found_codec| from |audio_codecs| because it has the correctly
-      // mapped payload type.
-      filtered_codecs.push_back(found_codec);
-    }
-  }
-
-  bool bundle_enabled = offer_description->HasGroup(GROUP_TYPE_BUNDLE) &&
-                        session_options.bundle_enabled;
-  std::unique_ptr<AudioContentDescription> audio_answer(
-      new AudioContentDescription());
-  // Do not require or create SDES cryptos if DTLS is used.
-  cricket::SecurePolicy sdes_policy =
-      audio_transport->secure() ? cricket::SEC_DISABLED : secure();
-  if (!CreateMediaContentAnswer(
-          offer_audio_description, media_description_options, session_options,
-          filtered_codecs, sdes_policy, GetCryptos(current_content),
-          audio_rtp_extensions_, enable_encrypted_rtp_header_extensions_,
-          current_streams, bundle_enabled, audio_answer.get())) {
-    return false;  // Fails the session setup.
-  }
-
-  bool secure = bundle_transport ? bundle_transport->description.secure()
-                                 : audio_transport->secure();
-  bool rejected = media_description_options.stopped ||
-                  offer_content->rejected ||
-                  !IsMediaProtocolSupported(MEDIA_TYPE_AUDIO,
-                                            audio_answer->protocol(), secure);
-  if (!rejected) {
-    AddTransportAnswer(media_description_options.mid, *(audio_transport.get()),
-                       answer);
-  } else {
-    LOG(LS_INFO) << "Audio m= section '" << media_description_options.mid
-                 << "' being rejected in answer.";
-  }
-
-  answer->AddContent(media_description_options.mid, offer_content->type,
-                     rejected, audio_answer.release());
-  return true;
-}
-
-bool MediaSessionDescriptionFactory::AddVideoContentForAnswer(
-    const MediaDescriptionOptions& media_description_options,
-    const MediaSessionOptions& session_options,
-    const ContentInfo* offer_content,
-    const SessionDescription* offer_description,
-    const ContentInfo* current_content,
-    const SessionDescription* current_description,
-    const TransportInfo* bundle_transport,
-    const VideoCodecs& video_codecs,
-    StreamParamsVec* current_streams,
-    SessionDescription* answer) const {
-  const VideoContentDescription* offer_video_description =
-      static_cast<const VideoContentDescription*>(offer_content->description);
-
-  std::unique_ptr<TransportDescription> video_transport(
-      CreateTransportAnswer(media_description_options.mid, offer_description,
-                            media_description_options.transport_options,
-                            current_description, bundle_transport != nullptr));
-  if (!video_transport) {
-    return false;
-  }
-
-  VideoCodecs filtered_codecs;
-  // Add the codecs from current content if exists.
-  if (current_content) {
-    RTC_DCHECK(IsMediaContentOfType(current_content, MEDIA_TYPE_VIDEO));
-    const VideoContentDescription* vcd =
-        static_cast<const VideoContentDescription*>(
-            current_content->description);
-    for (const VideoCodec& codec : vcd->codecs()) {
-      if (FindMatchingCodec<VideoCodec>(video_codecs_, video_codecs, codec,
-                                        nullptr)) {
-        filtered_codecs.push_back(codec);
-      }
-    }
-  }
-  // Add other supported video codecs.
-  VideoCodec found_codec;
-  for (const VideoCodec& codec : video_codecs_) {
-    if (FindMatchingCodec<VideoCodec>(video_codecs_, video_codecs, codec,
-                                      &found_codec) &&
-        !FindMatchingCodec<VideoCodec>(video_codecs_, filtered_codecs, codec,
-                                       nullptr)) {
-      // Use the |found_codec| from |video_codecs| because it has the correctly
-      // mapped payload type.
-      filtered_codecs.push_back(found_codec);
-    }
-  }
-
-  bool bundle_enabled = offer_description->HasGroup(GROUP_TYPE_BUNDLE) &&
-                        session_options.bundle_enabled;
-
-  std::unique_ptr<VideoContentDescription> video_answer(
-      new VideoContentDescription());
-  // Do not require or create SDES cryptos if DTLS is used.
-  cricket::SecurePolicy sdes_policy =
-      video_transport->secure() ? cricket::SEC_DISABLED : secure();
-  if (!CreateMediaContentAnswer(
-          offer_video_description, media_description_options, session_options,
-          filtered_codecs, sdes_policy, GetCryptos(current_content),
-          video_rtp_extensions_, enable_encrypted_rtp_header_extensions_,
-          current_streams, bundle_enabled, video_answer.get())) {
-    return false;  // Failed the sessin setup.
-  }
-  bool secure = bundle_transport ? bundle_transport->description.secure()
-                                 : video_transport->secure();
-  bool rejected = media_description_options.stopped ||
-                  offer_content->rejected ||
-                  !IsMediaProtocolSupported(MEDIA_TYPE_VIDEO,
-                                            video_answer->protocol(), secure);
-  if (!rejected) {
-    if (!AddTransportAnswer(media_description_options.mid,
-                            *(video_transport.get()), answer)) {
-      return false;
-    }
-    video_answer->set_bandwidth(kAutoBandwidth);
-  } else {
-    LOG(LS_INFO) << "Video m= section '" << media_description_options.mid
-                 << "' being rejected in answer.";
-  }
-  answer->AddContent(media_description_options.mid, offer_content->type,
-                     rejected, video_answer.release());
-  return true;
-}
-
-bool MediaSessionDescriptionFactory::AddDataContentForAnswer(
-    const MediaDescriptionOptions& media_description_options,
-    const MediaSessionOptions& session_options,
-    const ContentInfo* offer_content,
-    const SessionDescription* offer_description,
-    const ContentInfo* current_content,
-    const SessionDescription* current_description,
-    const TransportInfo* bundle_transport,
-    const DataCodecs& data_codecs,
-    StreamParamsVec* current_streams,
-    SessionDescription* answer) const {
-  std::unique_ptr<TransportDescription> data_transport(
-      CreateTransportAnswer(media_description_options.mid, offer_description,
-                            media_description_options.transport_options,
-                            current_description, bundle_transport != nullptr));
-  if (!data_transport) {
-    return false;
-  }
-
-  std::unique_ptr<DataContentDescription> data_answer(
-      new DataContentDescription());
-  // Do not require or create SDES cryptos if DTLS is used.
-  cricket::SecurePolicy sdes_policy =
-      data_transport->secure() ? cricket::SEC_DISABLED : secure();
-  bool bundle_enabled = offer_description->HasGroup(GROUP_TYPE_BUNDLE) &&
-                        session_options.bundle_enabled;
-  if (!CreateMediaContentAnswer(
-          static_cast<const DataContentDescription*>(
-              offer_content->description),
-          media_description_options, session_options, data_codecs, sdes_policy,
-          GetCryptos(current_content), RtpHeaderExtensions(),
-          enable_encrypted_rtp_header_extensions_, current_streams,
-          bundle_enabled, data_answer.get())) {
-    return false;  // Fails the session setup.
-  }
-
-  // Respond with sctpmap if the offer uses sctpmap.
-  const DataContentDescription* offer_data_description =
-      static_cast<const DataContentDescription*>(offer_content->description);
-  bool offer_uses_sctpmap = offer_data_description->use_sctpmap();
-  data_answer->set_use_sctpmap(offer_uses_sctpmap);
-
-  bool secure = bundle_transport ? bundle_transport->description.secure()
-                                 : data_transport->secure();
-
-  bool rejected = session_options.data_channel_type == DCT_NONE ||
-                  media_description_options.stopped ||
-                  offer_content->rejected ||
-                  !IsMediaProtocolSupported(MEDIA_TYPE_DATA,
-                                            data_answer->protocol(), secure);
-  if (!rejected) {
-    data_answer->set_bandwidth(kDataMaxBandwidth);
-    if (!AddTransportAnswer(media_description_options.mid,
-                            *(data_transport.get()), answer)) {
-      return false;
-    }
-  } else {
-    // RFC 3264
-    // The answer MUST contain the same number of m-lines as the offer.
-    LOG(LS_INFO) << "Data is not supported in the answer.";
-  }
-  answer->AddContent(media_description_options.mid, offer_content->type,
-                     rejected, data_answer.release());
-  return true;
-}
-
-void MediaSessionDescriptionFactory::ComputeAudioCodecsIntersectionAndUnion() {
-  audio_sendrecv_codecs_.clear();
-  all_audio_codecs_.clear();
-  // Compute the audio codecs union.
-  for (const AudioCodec& send : audio_send_codecs_) {
-    all_audio_codecs_.push_back(send);
-    if (!FindMatchingCodec<AudioCodec>(audio_send_codecs_, audio_recv_codecs_,
-                                       send, nullptr)) {
-      // It doesn't make sense to have an RTX codec we support sending but not
-      // receiving.
-      RTC_DCHECK(!IsRtxCodec(send));
-    }
-  }
-  for (const AudioCodec& recv : audio_recv_codecs_) {
-    if (!FindMatchingCodec<AudioCodec>(audio_recv_codecs_, audio_send_codecs_,
-                                       recv, nullptr)) {
-      all_audio_codecs_.push_back(recv);
-    }
-  }
-  // Use NegotiateCodecs to merge our codec lists, since the operation is
-  // essentially the same. Put send_codecs as the offered_codecs, which is the
-  // order we'd like to follow. The reasoning is that encoding is usually more
-  // expensive than decoding, and prioritizing a codec in the send list probably
-  // means it's a codec we can handle efficiently.
-  NegotiateCodecs(audio_recv_codecs_, audio_send_codecs_,
-                  &audio_sendrecv_codecs_);
-}
-
-bool IsMediaContent(const ContentInfo* content) {
-  return (content &&
-          (content->type == NS_JINGLE_RTP ||
-           content->type == NS_JINGLE_DRAFT_SCTP));
-}
-
-bool IsAudioContent(const ContentInfo* content) {
-  return IsMediaContentOfType(content, MEDIA_TYPE_AUDIO);
-}
-
-bool IsVideoContent(const ContentInfo* content) {
-  return IsMediaContentOfType(content, MEDIA_TYPE_VIDEO);
-}
-
-bool IsDataContent(const ContentInfo* content) {
-  return IsMediaContentOfType(content, MEDIA_TYPE_DATA);
-}
-
-const ContentInfo* GetFirstMediaContent(const ContentInfos& contents,
-                                        MediaType media_type) {
-  for (const ContentInfo& content : contents) {
-    if (IsMediaContentOfType(&content, media_type)) {
-      return &content;
-    }
-  }
-  return nullptr;
-}
-
-const ContentInfo* GetFirstAudioContent(const ContentInfos& contents) {
-  return GetFirstMediaContent(contents, MEDIA_TYPE_AUDIO);
-}
-
-const ContentInfo* GetFirstVideoContent(const ContentInfos& contents) {
-  return GetFirstMediaContent(contents, MEDIA_TYPE_VIDEO);
-}
-
-const ContentInfo* GetFirstDataContent(const ContentInfos& contents) {
-  return GetFirstMediaContent(contents, MEDIA_TYPE_DATA);
-}
-
-static const ContentInfo* GetFirstMediaContent(const SessionDescription* sdesc,
-                                               MediaType media_type) {
-  if (sdesc == nullptr) {
-    return nullptr;
-  }
-
-  return GetFirstMediaContent(sdesc->contents(), media_type);
-}
-
-const ContentInfo* GetFirstAudioContent(const SessionDescription* sdesc) {
-  return GetFirstMediaContent(sdesc, MEDIA_TYPE_AUDIO);
-}
-
-const ContentInfo* GetFirstVideoContent(const SessionDescription* sdesc) {
-  return GetFirstMediaContent(sdesc, MEDIA_TYPE_VIDEO);
-}
-
-const ContentInfo* GetFirstDataContent(const SessionDescription* sdesc) {
-  return GetFirstMediaContent(sdesc, MEDIA_TYPE_DATA);
-}
-
-const MediaContentDescription* GetFirstMediaContentDescription(
-    const SessionDescription* sdesc, MediaType media_type) {
-  const ContentInfo* content = GetFirstMediaContent(sdesc, media_type);
-  const ContentDescription* description = content ? content->description : NULL;
-  return static_cast<const MediaContentDescription*>(description);
-}
-
-const AudioContentDescription* GetFirstAudioContentDescription(
-    const SessionDescription* sdesc) {
-  return static_cast<const AudioContentDescription*>(
-      GetFirstMediaContentDescription(sdesc, MEDIA_TYPE_AUDIO));
-}
-
-const VideoContentDescription* GetFirstVideoContentDescription(
-    const SessionDescription* sdesc) {
-  return static_cast<const VideoContentDescription*>(
-      GetFirstMediaContentDescription(sdesc, MEDIA_TYPE_VIDEO));
-}
-
-const DataContentDescription* GetFirstDataContentDescription(
-    const SessionDescription* sdesc) {
-  return static_cast<const DataContentDescription*>(
-      GetFirstMediaContentDescription(sdesc, MEDIA_TYPE_DATA));
-}
-
-//
-// Non-const versions of the above functions.
-//
-
-ContentInfo* GetFirstMediaContent(ContentInfos& contents,
-                                  MediaType media_type) {
-  for (ContentInfo& content : contents) {
-    if (IsMediaContentOfType(&content, media_type)) {
-      return &content;
-    }
-  }
-  return nullptr;
-}
-
-ContentInfo* GetFirstAudioContent(ContentInfos& contents) {
-  return GetFirstMediaContent(contents, MEDIA_TYPE_AUDIO);
-}
-
-ContentInfo* GetFirstVideoContent(ContentInfos& contents) {
-  return GetFirstMediaContent(contents, MEDIA_TYPE_VIDEO);
-}
-
-ContentInfo* GetFirstDataContent(ContentInfos& contents) {
-  return GetFirstMediaContent(contents, MEDIA_TYPE_DATA);
-}
-
-static ContentInfo* GetFirstMediaContent(SessionDescription* sdesc,
-                                         MediaType media_type) {
-  if (sdesc == nullptr) {
-    return nullptr;
-  }
-
-  return GetFirstMediaContent(sdesc->contents(), media_type);
-}
-
-ContentInfo* GetFirstAudioContent(SessionDescription* sdesc) {
-  return GetFirstMediaContent(sdesc, MEDIA_TYPE_AUDIO);
-}
-
-ContentInfo* GetFirstVideoContent(SessionDescription* sdesc) {
-  return GetFirstMediaContent(sdesc, MEDIA_TYPE_VIDEO);
-}
-
-ContentInfo* GetFirstDataContent(SessionDescription* sdesc) {
-  return GetFirstMediaContent(sdesc, MEDIA_TYPE_DATA);
-}
-
-MediaContentDescription* GetFirstMediaContentDescription(
-    SessionDescription* sdesc,
-    MediaType media_type) {
-  ContentInfo* content = GetFirstMediaContent(sdesc, media_type);
-  ContentDescription* description = content ? content->description : NULL;
-  return static_cast<MediaContentDescription*>(description);
-}
-
-AudioContentDescription* GetFirstAudioContentDescription(
-    SessionDescription* sdesc) {
-  return static_cast<AudioContentDescription*>(
-      GetFirstMediaContentDescription(sdesc, MEDIA_TYPE_AUDIO));
-}
-
-VideoContentDescription* GetFirstVideoContentDescription(
-    SessionDescription* sdesc) {
-  return static_cast<VideoContentDescription*>(
-      GetFirstMediaContentDescription(sdesc, MEDIA_TYPE_VIDEO));
-}
-
-DataContentDescription* GetFirstDataContentDescription(
-    SessionDescription* sdesc) {
-  return static_cast<DataContentDescription*>(
-      GetFirstMediaContentDescription(sdesc, MEDIA_TYPE_DATA));
-}
-
-}  // namespace cricket
diff --git a/pc/mediasession.h b/pc/mediasession.h
deleted file mode 100644
index ee7183f..0000000
--- a/pc/mediasession.h
+++ /dev/null
@@ -1,654 +0,0 @@
-/*
- *  Copyright 2004 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.
- */
-
-// Types and classes used in media session descriptions.
-
-#ifndef WEBRTC_PC_MEDIASESSION_H_
-#define WEBRTC_PC_MEDIASESSION_H_
-
-#include <algorithm>
-#include <map>
-#include <string>
-#include <vector>
-
-#include "webrtc/api/mediatypes.h"
-#include "webrtc/media/base/codec.h"
-#include "webrtc/media/base/cryptoparams.h"
-#include "webrtc/media/base/mediachannel.h"
-#include "webrtc/media/base/mediaconstants.h"
-#include "webrtc/media/base/mediaengine.h"  // For DataChannelType
-#include "webrtc/media/base/streamparams.h"
-#include "webrtc/p2p/base/sessiondescription.h"
-#include "webrtc/p2p/base/jseptransport.h"
-#include "webrtc/p2p/base/transportdescriptionfactory.h"
-
-namespace cricket {
-
-class ChannelManager;
-typedef std::vector<AudioCodec> AudioCodecs;
-typedef std::vector<VideoCodec> VideoCodecs;
-typedef std::vector<DataCodec> DataCodecs;
-typedef std::vector<CryptoParams> CryptoParamsVec;
-typedef std::vector<webrtc::RtpExtension> RtpHeaderExtensions;
-
-enum MediaContentDirection {
-  MD_INACTIVE,
-  MD_SENDONLY,
-  MD_RECVONLY,
-  MD_SENDRECV
-};
-
-std::string MediaContentDirectionToString(MediaContentDirection direction);
-
-enum CryptoType {
-  CT_NONE,
-  CT_SDES,
-  CT_DTLS
-};
-
-// RTC4585 RTP/AVPF
-extern const char kMediaProtocolAvpf[];
-// RFC5124 RTP/SAVPF
-extern const char kMediaProtocolSavpf[];
-
-extern const char kMediaProtocolDtlsSavpf[];
-
-extern const char kMediaProtocolRtpPrefix[];
-
-extern const char kMediaProtocolSctp[];
-extern const char kMediaProtocolDtlsSctp[];
-extern const char kMediaProtocolUdpDtlsSctp[];
-extern const char kMediaProtocolTcpDtlsSctp[];
-
-// Options to control how session descriptions are generated.
-const int kAutoBandwidth = -1;
-const int kBufferedModeDisabled = 0;
-
-// Default RTCP CNAME for unit tests.
-const char kDefaultRtcpCname[] = "DefaultRtcpCname";
-
-struct RtpTransceiverDirection {
-  bool send;
-  bool recv;
-
-  RtpTransceiverDirection(bool send, bool recv) : send(send), recv(recv) {}
-
-  bool operator==(const RtpTransceiverDirection& o) const {
-    return send == o.send && recv == o.recv;
-  }
-
-  bool operator!=(const RtpTransceiverDirection& o) const {
-    return !(*this == o);
-  }
-
-  static RtpTransceiverDirection FromMediaContentDirection(
-      MediaContentDirection md);
-
-  MediaContentDirection ToMediaContentDirection() const;
-
-  RtpTransceiverDirection Reversed() const {
-    return RtpTransceiverDirection(recv, send);
-  }
-};
-
-RtpTransceiverDirection
-NegotiateRtpTransceiverDirection(RtpTransceiverDirection offer,
-                                 RtpTransceiverDirection wants);
-
-// Options for an RtpSender contained with an media description/"m=" section.
-struct SenderOptions {
-  std::string track_id;
-  // TODO(steveanton): As part of work towards Unified Plan, this has been
-  // changed to be a vector. But for now this can only have exactly one.
-  std::vector<std::string> stream_ids;
-  int num_sim_layers;
-};
-
-// Options for an individual media description/"m=" section.
-struct MediaDescriptionOptions {
-  MediaDescriptionOptions(MediaType type,
-                          const std::string& mid,
-                          RtpTransceiverDirection direction,
-                          bool stopped)
-      : type(type), mid(mid), direction(direction), stopped(stopped) {}
-
-  // TODO(deadbeef): When we don't support Plan B, there will only be one
-  // sender per media description and this can be simplified.
-  void AddAudioSender(const std::string& track_id,
-                      const std::vector<std::string>& stream_ids);
-  void AddVideoSender(const std::string& track_id,
-                      const std::vector<std::string>& stream_ids,
-                      int num_sim_layers);
-
-  // Internally just uses sender_options.
-  void AddRtpDataChannel(const std::string& track_id,
-                         const std::string& stream_id);
-
-  MediaType type;
-  std::string mid;
-  RtpTransceiverDirection direction;
-  bool stopped;
-  TransportOptions transport_options;
-  // Note: There's no equivalent "RtpReceiverOptions" because only send
-  // stream information goes in the local descriptions.
-  std::vector<SenderOptions> sender_options;
-
- private:
-  // Doesn't DCHECK on |type|.
-  void AddSenderInternal(const std::string& track_id,
-                         const std::vector<std::string>& stream_ids,
-                         int num_sim_layers);
-};
-
-// Provides a mechanism for describing how m= sections should be generated.
-// The m= section with index X will use media_description_options[X]. There
-// must be an option for each existing section if creating an answer, or a
-// subsequent offer.
-struct MediaSessionOptions {
-  MediaSessionOptions() {}
-
-  bool has_audio() const { return HasMediaDescription(MEDIA_TYPE_AUDIO); }
-  bool has_video() const { return HasMediaDescription(MEDIA_TYPE_VIDEO); }
-  bool has_data() const { return HasMediaDescription(MEDIA_TYPE_DATA); }
-
-  bool HasMediaDescription(MediaType type) const;
-
-  DataChannelType data_channel_type = DCT_NONE;
-  bool is_muc = false;
-  bool vad_enabled = true;  // When disabled, removes all CN codecs from SDP.
-  bool rtcp_mux_enabled = true;
-  bool bundle_enabled = false;
-  std::string rtcp_cname = kDefaultRtcpCname;
-  rtc::CryptoOptions crypto_options;
-  // List of media description options in the same order that the media
-  // descriptions will be generated.
-  std::vector<MediaDescriptionOptions> media_description_options;
-};
-
-// "content" (as used in XEP-0166) descriptions for voice and video.
-class MediaContentDescription : public ContentDescription {
- public:
-  MediaContentDescription() {}
-
-  virtual MediaType type() const = 0;
-  virtual bool has_codecs() const = 0;
-
-  // |protocol| is the expected media transport protocol, such as RTP/AVPF,
-  // RTP/SAVPF or SCTP/DTLS.
-  std::string protocol() const { return protocol_; }
-  void set_protocol(const std::string& protocol) { protocol_ = protocol; }
-
-  MediaContentDirection direction() const { return direction_; }
-  void set_direction(MediaContentDirection direction) {
-    direction_ = direction;
-  }
-
-  bool rtcp_mux() const { return rtcp_mux_; }
-  void set_rtcp_mux(bool mux) { rtcp_mux_ = mux; }
-
-  bool rtcp_reduced_size() const { return rtcp_reduced_size_; }
-  void set_rtcp_reduced_size(bool reduced_size) {
-    rtcp_reduced_size_ = reduced_size;
-  }
-
-  int bandwidth() const { return bandwidth_; }
-  void set_bandwidth(int bandwidth) { bandwidth_ = bandwidth; }
-
-  const std::vector<CryptoParams>& cryptos() const { return cryptos_; }
-  void AddCrypto(const CryptoParams& params) {
-    cryptos_.push_back(params);
-  }
-  void set_cryptos(const std::vector<CryptoParams>& cryptos) {
-    cryptos_ = cryptos;
-  }
-
-  CryptoType crypto_required() const { return crypto_required_; }
-  void set_crypto_required(CryptoType type) {
-    crypto_required_ = type;
-  }
-
-  const RtpHeaderExtensions& rtp_header_extensions() const {
-    return rtp_header_extensions_;
-  }
-  void set_rtp_header_extensions(const RtpHeaderExtensions& extensions) {
-    rtp_header_extensions_ = extensions;
-    rtp_header_extensions_set_ = true;
-  }
-  void AddRtpHeaderExtension(const webrtc::RtpExtension& ext) {
-    rtp_header_extensions_.push_back(ext);
-    rtp_header_extensions_set_ = true;
-  }
-  void AddRtpHeaderExtension(const cricket::RtpHeaderExtension& ext) {
-    webrtc::RtpExtension webrtc_extension;
-    webrtc_extension.uri = ext.uri;
-    webrtc_extension.id = ext.id;
-    rtp_header_extensions_.push_back(webrtc_extension);
-    rtp_header_extensions_set_ = true;
-  }
-  void ClearRtpHeaderExtensions() {
-    rtp_header_extensions_.clear();
-    rtp_header_extensions_set_ = true;
-  }
-  // We can't always tell if an empty list of header extensions is
-  // because the other side doesn't support them, or just isn't hooked up to
-  // signal them. For now we assume an empty list means no signaling, but
-  // provide the ClearRtpHeaderExtensions method to allow "no support" to be
-  // clearly indicated (i.e. when derived from other information).
-  bool rtp_header_extensions_set() const {
-    return rtp_header_extensions_set_;
-  }
-  // True iff the client supports multiple streams.
-  void set_multistream(bool multistream) { multistream_ = multistream; }
-  bool multistream() const { return multistream_; }
-  const StreamParamsVec& streams() const {
-    return streams_;
-  }
-  // TODO(pthatcher): Remove this by giving mediamessage.cc access
-  // to MediaContentDescription
-  StreamParamsVec& mutable_streams() {
-    return streams_;
-  }
-  void AddStream(const StreamParams& stream) {
-    streams_.push_back(stream);
-  }
-  // Legacy streams have an ssrc, but nothing else.
-  void AddLegacyStream(uint32_t ssrc) {
-    streams_.push_back(StreamParams::CreateLegacy(ssrc));
-  }
-  void AddLegacyStream(uint32_t ssrc, uint32_t fid_ssrc) {
-    StreamParams sp = StreamParams::CreateLegacy(ssrc);
-    sp.AddFidSsrc(ssrc, fid_ssrc);
-    streams_.push_back(sp);
-  }
-  // Sets the CNAME of all StreamParams if it have not been set.
-  void SetCnameIfEmpty(const std::string& cname) {
-    for (cricket::StreamParamsVec::iterator it = streams_.begin();
-         it != streams_.end(); ++it) {
-      if (it->cname.empty())
-        it->cname = cname;
-    }
-  }
-  uint32_t first_ssrc() const {
-    if (streams_.empty()) {
-      return 0;
-    }
-    return streams_[0].first_ssrc();
-  }
-  bool has_ssrcs() const {
-    if (streams_.empty()) {
-      return false;
-    }
-    return streams_[0].has_ssrcs();
-  }
-
-  void set_conference_mode(bool enable) { conference_mode_ = enable; }
-  bool conference_mode() const { return conference_mode_; }
-
-  void set_partial(bool partial) { partial_ = partial; }
-  bool partial() const { return partial_;  }
-
-  void set_buffered_mode_latency(int latency) {
-    buffered_mode_latency_ = latency;
-  }
-  int buffered_mode_latency() const { return buffered_mode_latency_; }
-
-  // https://tools.ietf.org/html/rfc4566#section-5.7
-  // May be present at the media or session level of SDP. If present at both
-  // levels, the media-level attribute overwrites the session-level one.
-  void set_connection_address(const rtc::SocketAddress& address) {
-    connection_address_ = address;
-  }
-  const rtc::SocketAddress& connection_address() const {
-    return connection_address_;
-  }
-
- protected:
-  bool rtcp_mux_ = false;
-  bool rtcp_reduced_size_ = false;
-  int bandwidth_ = kAutoBandwidth;
-  std::string protocol_;
-  std::vector<CryptoParams> cryptos_;
-  CryptoType crypto_required_ = CT_NONE;
-  std::vector<webrtc::RtpExtension> rtp_header_extensions_;
-  bool rtp_header_extensions_set_ = false;
-  bool multistream_ = false;
-  StreamParamsVec streams_;
-  bool conference_mode_ = false;
-  bool partial_ = false;
-  int buffered_mode_latency_ = kBufferedModeDisabled;
-  MediaContentDirection direction_ = MD_SENDRECV;
-  rtc::SocketAddress connection_address_;
-};
-
-template <class C>
-class MediaContentDescriptionImpl : public MediaContentDescription {
- public:
-  typedef C CodecType;
-
-  // Codecs should be in preference order (most preferred codec first).
-  const std::vector<C>& codecs() const { return codecs_; }
-  void set_codecs(const std::vector<C>& codecs) { codecs_ = codecs; }
-  virtual bool has_codecs() const { return !codecs_.empty(); }
-  bool HasCodec(int id) {
-    bool found = false;
-    for (typename std::vector<C>::iterator iter = codecs_.begin();
-         iter != codecs_.end(); ++iter) {
-      if (iter->id == id) {
-        found = true;
-        break;
-      }
-    }
-    return found;
-  }
-  void AddCodec(const C& codec) {
-    codecs_.push_back(codec);
-  }
-  void AddOrReplaceCodec(const C& codec) {
-    for (typename std::vector<C>::iterator iter = codecs_.begin();
-         iter != codecs_.end(); ++iter) {
-      if (iter->id == codec.id) {
-        *iter = codec;
-        return;
-      }
-    }
-    AddCodec(codec);
-  }
-  void AddCodecs(const std::vector<C>& codecs) {
-    typename std::vector<C>::const_iterator codec;
-    for (codec = codecs.begin(); codec != codecs.end(); ++codec) {
-      AddCodec(*codec);
-    }
-  }
-
- private:
-  std::vector<C> codecs_;
-};
-
-class AudioContentDescription : public MediaContentDescriptionImpl<AudioCodec> {
- public:
-  AudioContentDescription() :
-      agc_minus_10db_(false) {}
-
-  virtual ContentDescription* Copy() const {
-    return new AudioContentDescription(*this);
-  }
-  virtual MediaType type() const { return MEDIA_TYPE_AUDIO; }
-
-  const std::string &lang() const { return lang_; }
-  void set_lang(const std::string &lang) { lang_ = lang; }
-
-  bool agc_minus_10db() const { return agc_minus_10db_; }
-  void set_agc_minus_10db(bool enable) {
-    agc_minus_10db_ = enable;
-  }
-
- private:
-  bool agc_minus_10db_;
-
- private:
-  std::string lang_;
-};
-
-class VideoContentDescription : public MediaContentDescriptionImpl<VideoCodec> {
- public:
-  virtual ContentDescription* Copy() const {
-    return new VideoContentDescription(*this);
-  }
-  virtual MediaType type() const { return MEDIA_TYPE_VIDEO; }
-};
-
-class DataContentDescription : public MediaContentDescriptionImpl<DataCodec> {
- public:
-  DataContentDescription() {}
-
-  virtual ContentDescription* Copy() const {
-    return new DataContentDescription(*this);
-  }
-  virtual MediaType type() const { return MEDIA_TYPE_DATA; }
-
-  bool use_sctpmap() const { return use_sctpmap_; }
-  void set_use_sctpmap(bool enable) { use_sctpmap_ = enable; }
-
- private:
-  bool use_sctpmap_ = true;
-};
-
-// Creates media session descriptions according to the supplied codecs and
-// other fields, as well as the supplied per-call options.
-// When creating answers, performs the appropriate negotiation
-// of the various fields to determine the proper result.
-class MediaSessionDescriptionFactory {
- public:
-  // Default ctor; use methods below to set configuration.
-  // The TransportDescriptionFactory is not owned by MediaSessionDescFactory,
-  // so it must be kept alive by the user of this class.
-  explicit MediaSessionDescriptionFactory(
-      const TransportDescriptionFactory* factory);
-  // This helper automatically sets up the factory to get its configuration
-  // from the specified ChannelManager.
-  MediaSessionDescriptionFactory(ChannelManager* cmanager,
-                                 const TransportDescriptionFactory* factory);
-
-  const AudioCodecs& audio_sendrecv_codecs() const;
-  const AudioCodecs& audio_send_codecs() const;
-  const AudioCodecs& audio_recv_codecs() const;
-  void set_audio_codecs(const AudioCodecs& send_codecs,
-                        const AudioCodecs& recv_codecs);
-  void set_audio_rtp_header_extensions(const RtpHeaderExtensions& extensions) {
-    audio_rtp_extensions_ = extensions;
-  }
-  const RtpHeaderExtensions& audio_rtp_header_extensions() const {
-    return audio_rtp_extensions_;
-  }
-  const VideoCodecs& video_codecs() const { return video_codecs_; }
-  void set_video_codecs(const VideoCodecs& codecs) { video_codecs_ = codecs; }
-  void set_video_rtp_header_extensions(const RtpHeaderExtensions& extensions) {
-    video_rtp_extensions_ = extensions;
-  }
-  const RtpHeaderExtensions& video_rtp_header_extensions() const {
-    return video_rtp_extensions_;
-  }
-  const DataCodecs& data_codecs() const { return data_codecs_; }
-  void set_data_codecs(const DataCodecs& codecs) { data_codecs_ = codecs; }
-  SecurePolicy secure() const { return secure_; }
-  void set_secure(SecurePolicy s) { secure_ = s; }
-
-  void set_enable_encrypted_rtp_header_extensions(bool enable) {
-    enable_encrypted_rtp_header_extensions_ = enable;
-  }
-
-  SessionDescription* CreateOffer(
-      const MediaSessionOptions& options,
-      const SessionDescription* current_description) const;
-  SessionDescription* CreateAnswer(
-      const SessionDescription* offer,
-      const MediaSessionOptions& options,
-      const SessionDescription* current_description) const;
-
- private:
-  const AudioCodecs& GetAudioCodecsForOffer(
-      const RtpTransceiverDirection& direction) const;
-  const AudioCodecs& GetAudioCodecsForAnswer(
-      const RtpTransceiverDirection& offer,
-      const RtpTransceiverDirection& answer) const;
-  void GetCodecsForOffer(const SessionDescription* current_description,
-                         AudioCodecs* audio_codecs,
-                         VideoCodecs* video_codecs,
-                         DataCodecs* data_codecs) const;
-  void GetCodecsForAnswer(const SessionDescription* current_description,
-                          const SessionDescription* remote_offer,
-                          AudioCodecs* audio_codecs,
-                          VideoCodecs* video_codecs,
-                          DataCodecs* data_codecs) const;
-  void GetRtpHdrExtsToOffer(const SessionDescription* current_description,
-                            RtpHeaderExtensions* audio_extensions,
-                            RtpHeaderExtensions* video_extensions) const;
-  bool AddTransportOffer(
-      const std::string& content_name,
-      const TransportOptions& transport_options,
-      const SessionDescription* current_desc,
-      SessionDescription* offer) const;
-
-  TransportDescription* CreateTransportAnswer(
-      const std::string& content_name,
-      const SessionDescription* offer_desc,
-      const TransportOptions& transport_options,
-      const SessionDescription* current_desc,
-      bool require_transport_attributes) const;
-
-  bool AddTransportAnswer(
-      const std::string& content_name,
-      const TransportDescription& transport_desc,
-      SessionDescription* answer_desc) const;
-
-  // Helpers for adding media contents to the SessionDescription. Returns true
-  // it succeeds or the media content is not needed, or false if there is any
-  // error.
-
-  bool AddAudioContentForOffer(
-      const MediaDescriptionOptions& media_description_options,
-      const MediaSessionOptions& session_options,
-      const ContentInfo* current_content,
-      const SessionDescription* current_description,
-      const RtpHeaderExtensions& audio_rtp_extensions,
-      const AudioCodecs& audio_codecs,
-      StreamParamsVec* current_streams,
-      SessionDescription* desc) const;
-
-  bool AddVideoContentForOffer(
-      const MediaDescriptionOptions& media_description_options,
-      const MediaSessionOptions& session_options,
-      const ContentInfo* current_content,
-      const SessionDescription* current_description,
-      const RtpHeaderExtensions& video_rtp_extensions,
-      const VideoCodecs& video_codecs,
-      StreamParamsVec* current_streams,
-      SessionDescription* desc) const;
-
-  bool AddDataContentForOffer(
-      const MediaDescriptionOptions& media_description_options,
-      const MediaSessionOptions& session_options,
-      const ContentInfo* current_content,
-      const SessionDescription* current_description,
-      const DataCodecs& data_codecs,
-      StreamParamsVec* current_streams,
-      SessionDescription* desc) const;
-
-  bool AddAudioContentForAnswer(
-      const MediaDescriptionOptions& media_description_options,
-      const MediaSessionOptions& session_options,
-      const ContentInfo* offer_content,
-      const SessionDescription* offer_description,
-      const ContentInfo* current_content,
-      const SessionDescription* current_description,
-      const TransportInfo* bundle_transport,
-      const AudioCodecs& audio_codecs,
-      StreamParamsVec* current_streams,
-      SessionDescription* answer) const;
-
-  bool AddVideoContentForAnswer(
-      const MediaDescriptionOptions& media_description_options,
-      const MediaSessionOptions& session_options,
-      const ContentInfo* offer_content,
-      const SessionDescription* offer_description,
-      const ContentInfo* current_content,
-      const SessionDescription* current_description,
-      const TransportInfo* bundle_transport,
-      const VideoCodecs& video_codecs,
-      StreamParamsVec* current_streams,
-      SessionDescription* answer) const;
-
-  bool AddDataContentForAnswer(
-      const MediaDescriptionOptions& media_description_options,
-      const MediaSessionOptions& session_options,
-      const ContentInfo* offer_content,
-      const SessionDescription* offer_description,
-      const ContentInfo* current_content,
-      const SessionDescription* current_description,
-      const TransportInfo* bundle_transport,
-      const DataCodecs& data_codecs,
-      StreamParamsVec* current_streams,
-      SessionDescription* answer) const;
-
-  void ComputeAudioCodecsIntersectionAndUnion();
-
-  AudioCodecs audio_send_codecs_;
-  AudioCodecs audio_recv_codecs_;
-  // Intersection of send and recv.
-  AudioCodecs audio_sendrecv_codecs_;
-  // Union of send and recv.
-  AudioCodecs all_audio_codecs_;
-  RtpHeaderExtensions audio_rtp_extensions_;
-  VideoCodecs video_codecs_;
-  RtpHeaderExtensions video_rtp_extensions_;
-  DataCodecs data_codecs_;
-  bool enable_encrypted_rtp_header_extensions_ = false;
-  // TODO(zhihuang): Rename secure_ to sdec_policy_; rename the related getter
-  // and setter.
-  SecurePolicy secure_ = SEC_DISABLED;
-  std::string lang_;
-  const TransportDescriptionFactory* transport_desc_factory_;
-};
-
-// Convenience functions.
-bool IsMediaContent(const ContentInfo* content);
-bool IsAudioContent(const ContentInfo* content);
-bool IsVideoContent(const ContentInfo* content);
-bool IsDataContent(const ContentInfo* content);
-const ContentInfo* GetFirstMediaContent(const ContentInfos& contents,
-                                        MediaType media_type);
-const ContentInfo* GetFirstAudioContent(const ContentInfos& contents);
-const ContentInfo* GetFirstVideoContent(const ContentInfos& contents);
-const ContentInfo* GetFirstDataContent(const ContentInfos& contents);
-const ContentInfo* GetFirstAudioContent(const SessionDescription* sdesc);
-const ContentInfo* GetFirstVideoContent(const SessionDescription* sdesc);
-const ContentInfo* GetFirstDataContent(const SessionDescription* sdesc);
-const AudioContentDescription* GetFirstAudioContentDescription(
-    const SessionDescription* sdesc);
-const VideoContentDescription* GetFirstVideoContentDescription(
-    const SessionDescription* sdesc);
-const DataContentDescription* GetFirstDataContentDescription(
-    const SessionDescription* sdesc);
-// Non-const versions of the above functions.
-// Useful when modifying an existing description.
-ContentInfo* GetFirstMediaContent(ContentInfos& contents, MediaType media_type);
-ContentInfo* GetFirstAudioContent(ContentInfos& contents);
-ContentInfo* GetFirstVideoContent(ContentInfos& contents);
-ContentInfo* GetFirstDataContent(ContentInfos& contents);
-ContentInfo* GetFirstAudioContent(SessionDescription* sdesc);
-ContentInfo* GetFirstVideoContent(SessionDescription* sdesc);
-ContentInfo* GetFirstDataContent(SessionDescription* sdesc);
-AudioContentDescription* GetFirstAudioContentDescription(
-    SessionDescription* sdesc);
-VideoContentDescription* GetFirstVideoContentDescription(
-    SessionDescription* sdesc);
-DataContentDescription* GetFirstDataContentDescription(
-    SessionDescription* sdesc);
-
-// Helper functions to return crypto suites used for SDES.
-void GetSupportedAudioSdesCryptoSuites(const rtc::CryptoOptions& crypto_options,
-                                       std::vector<int>* crypto_suites);
-void GetSupportedVideoSdesCryptoSuites(const rtc::CryptoOptions& crypto_options,
-                                       std::vector<int>* crypto_suites);
-void GetSupportedDataSdesCryptoSuites(const rtc::CryptoOptions& crypto_options,
-                                      std::vector<int>* crypto_suites);
-void GetSupportedAudioSdesCryptoSuiteNames(
-    const rtc::CryptoOptions& crypto_options,
-    std::vector<std::string>* crypto_suite_names);
-void GetSupportedVideoSdesCryptoSuiteNames(
-    const rtc::CryptoOptions& crypto_options,
-    std::vector<std::string>* crypto_suite_names);
-void GetSupportedDataSdesCryptoSuiteNames(
-    const rtc::CryptoOptions& crypto_options,
-    std::vector<std::string>* crypto_suite_names);
-
-}  // namespace cricket
-
-#endif  // WEBRTC_PC_MEDIASESSION_H_
diff --git a/pc/mediasession_unittest.cc b/pc/mediasession_unittest.cc
deleted file mode 100644
index 28883f2..0000000
--- a/pc/mediasession_unittest.cc
+++ /dev/null
@@ -1,3715 +0,0 @@
-/*
- *  Copyright 2004 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 <memory>
-#include <string>
-#include <vector>
-
-#include "webrtc/media/base/codec.h"
-#include "webrtc/media/base/testutils.h"
-#include "webrtc/p2p/base/p2pconstants.h"
-#include "webrtc/p2p/base/transportdescription.h"
-#include "webrtc/p2p/base/transportinfo.h"
-#include "webrtc/pc/mediasession.h"
-#include "webrtc/pc/srtpfilter.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/fakesslidentity.h"
-#include "webrtc/rtc_base/gunit.h"
-#include "webrtc/rtc_base/messagedigest.h"
-#include "webrtc/rtc_base/ssladapter.h"
-
-#define ASSERT_CRYPTO(cd, s, cs) \
-    ASSERT_EQ(s, cd->cryptos().size()); \
-    ASSERT_EQ(std::string(cs), cd->cryptos()[0].cipher_suite)
-
-typedef std::vector<cricket::Candidate> Candidates;
-
-using cricket::MediaContentDescription;
-using cricket::MediaSessionDescriptionFactory;
-using cricket::MediaContentDirection;
-using cricket::MediaDescriptionOptions;
-using cricket::MediaSessionOptions;
-using cricket::MediaType;
-using cricket::SessionDescription;
-using cricket::SsrcGroup;
-using cricket::StreamParams;
-using cricket::StreamParamsVec;
-using cricket::TransportDescription;
-using cricket::TransportDescriptionFactory;
-using cricket::TransportInfo;
-using cricket::ContentInfo;
-using cricket::CryptoParamsVec;
-using cricket::AudioContentDescription;
-using cricket::VideoContentDescription;
-using cricket::DataContentDescription;
-using cricket::GetFirstAudioContent;
-using cricket::GetFirstVideoContent;
-using cricket::GetFirstDataContent;
-using cricket::GetFirstAudioContentDescription;
-using cricket::GetFirstVideoContentDescription;
-using cricket::GetFirstDataContentDescription;
-using cricket::kAutoBandwidth;
-using cricket::AudioCodec;
-using cricket::VideoCodec;
-using cricket::DataCodec;
-using cricket::NS_JINGLE_RTP;
-using cricket::MEDIA_TYPE_AUDIO;
-using cricket::MEDIA_TYPE_VIDEO;
-using cricket::MEDIA_TYPE_DATA;
-using cricket::SEC_DISABLED;
-using cricket::SEC_ENABLED;
-using cricket::SEC_REQUIRED;
-using cricket::RtpTransceiverDirection;
-using rtc::CS_AES_CM_128_HMAC_SHA1_32;
-using rtc::CS_AES_CM_128_HMAC_SHA1_80;
-using rtc::CS_AEAD_AES_128_GCM;
-using rtc::CS_AEAD_AES_256_GCM;
-using webrtc::RtpExtension;
-
-static const AudioCodec kAudioCodecs1[] = {
-    AudioCodec(103, "ISAC", 16000, -1, 1),
-    AudioCodec(102, "iLBC", 8000, 13300, 1),
-    AudioCodec(0, "PCMU", 8000, 64000, 1),
-    AudioCodec(8, "PCMA", 8000, 64000, 1),
-    AudioCodec(117, "red", 8000, 0, 1),
-    AudioCodec(107, "CN", 48000, 0, 1)};
-
-static const AudioCodec kAudioCodecs2[] = {
-    AudioCodec(126, "speex", 16000, 22000, 1),
-    AudioCodec(0, "PCMU", 8000, 64000, 1),
-    AudioCodec(127, "iLBC", 8000, 13300, 1),
-};
-
-static const AudioCodec kAudioCodecsAnswer[] = {
-    AudioCodec(102, "iLBC", 8000, 13300, 1),
-    AudioCodec(0, "PCMU", 8000, 64000, 1),
-};
-
-static const VideoCodec kVideoCodecs1[] = {VideoCodec(96, "H264-SVC"),
-                                           VideoCodec(97, "H264")};
-
-static const VideoCodec kVideoCodecs1Reverse[] = {VideoCodec(97, "H264"),
-                                                  VideoCodec(96, "H264-SVC")};
-
-static const VideoCodec kVideoCodecs2[] = {VideoCodec(126, "H264"),
-                                           VideoCodec(127, "H263")};
-
-static const VideoCodec kVideoCodecsAnswer[] = {VideoCodec(97, "H264")};
-
-static const DataCodec kDataCodecs1[] = {DataCodec(98, "binary-data"),
-                                         DataCodec(99, "utf8-text")};
-
-static const DataCodec kDataCodecs2[] = {DataCodec(126, "binary-data"),
-                                         DataCodec(127, "utf8-text")};
-
-static const DataCodec kDataCodecsAnswer[] = {DataCodec(98, "binary-data"),
-                                              DataCodec(99, "utf8-text")};
-
-static const RtpExtension kAudioRtpExtension1[] = {
-    RtpExtension("urn:ietf:params:rtp-hdrext:ssrc-audio-level", 8),
-    RtpExtension("http://google.com/testing/audio_something", 10),
-};
-
-static const RtpExtension kAudioRtpExtensionEncrypted1[] = {
-    RtpExtension("urn:ietf:params:rtp-hdrext:ssrc-audio-level", 8),
-    RtpExtension("http://google.com/testing/audio_something", 10),
-    RtpExtension("urn:ietf:params:rtp-hdrext:ssrc-audio-level", 12, true),
-};
-
-static const RtpExtension kAudioRtpExtension2[] = {
-    RtpExtension("urn:ietf:params:rtp-hdrext:ssrc-audio-level", 2),
-    RtpExtension("http://google.com/testing/audio_something_else", 8),
-    RtpExtension("http://google.com/testing/both_audio_and_video", 7),
-};
-
-static const RtpExtension kAudioRtpExtension3[] = {
-    RtpExtension("http://google.com/testing/audio_something", 2),
-    RtpExtension("http://google.com/testing/both_audio_and_video", 3),
-};
-
-static const RtpExtension kAudioRtpExtension3ForEncryption[] = {
-    RtpExtension("http://google.com/testing/audio_something", 2),
-    // Use RTP extension that supports encryption.
-    RtpExtension("urn:ietf:params:rtp-hdrext:toffset", 3),
-};
-
-static const RtpExtension kAudioRtpExtension3ForEncryptionOffer[] = {
-    RtpExtension("http://google.com/testing/audio_something", 2),
-    RtpExtension("urn:ietf:params:rtp-hdrext:toffset", 3),
-    RtpExtension("urn:ietf:params:rtp-hdrext:toffset", 14, true),
-};
-
-static const RtpExtension kAudioRtpExtensionAnswer[] = {
-    RtpExtension("urn:ietf:params:rtp-hdrext:ssrc-audio-level", 8),
-};
-
-static const RtpExtension kAudioRtpExtensionEncryptedAnswer[] = {
-    RtpExtension("urn:ietf:params:rtp-hdrext:ssrc-audio-level", 12, true),
-};
-
-static const RtpExtension kVideoRtpExtension1[] = {
-    RtpExtension("urn:ietf:params:rtp-hdrext:toffset", 14),
-    RtpExtension("http://google.com/testing/video_something", 13),
-};
-
-static const RtpExtension kVideoRtpExtensionEncrypted1[] = {
-    RtpExtension("urn:ietf:params:rtp-hdrext:toffset", 14),
-    RtpExtension("http://google.com/testing/video_something", 13),
-    RtpExtension("urn:ietf:params:rtp-hdrext:toffset", 11, true),
-};
-
-static const RtpExtension kVideoRtpExtension2[] = {
-    RtpExtension("urn:ietf:params:rtp-hdrext:toffset", 2),
-    RtpExtension("http://google.com/testing/video_something_else", 14),
-    RtpExtension("http://google.com/testing/both_audio_and_video", 7),
-};
-
-static const RtpExtension kVideoRtpExtension3[] = {
-    RtpExtension("http://google.com/testing/video_something", 4),
-    RtpExtension("http://google.com/testing/both_audio_and_video", 5),
-};
-
-static const RtpExtension kVideoRtpExtension3ForEncryption[] = {
-    RtpExtension("http://google.com/testing/video_something", 4),
-    // Use RTP extension that supports encryption.
-    RtpExtension("urn:ietf:params:rtp-hdrext:toffset", 5),
-};
-
-static const RtpExtension kVideoRtpExtensionAnswer[] = {
-    RtpExtension("urn:ietf:params:rtp-hdrext:toffset", 14),
-};
-
-static const RtpExtension kVideoRtpExtensionEncryptedAnswer[] = {
-    RtpExtension("urn:ietf:params:rtp-hdrext:toffset", 11, true),
-};
-
-static const uint32_t kSimulcastParamsSsrc[] = {10, 11, 20, 21, 30, 31};
-static const uint32_t kSimSsrc[] = {10, 20, 30};
-static const uint32_t kFec1Ssrc[] = {10, 11};
-static const uint32_t kFec2Ssrc[] = {20, 21};
-static const uint32_t kFec3Ssrc[] = {30, 31};
-
-static const char kMediaStream1[] = "stream_1";
-static const char kMediaStream2[] = "stream_2";
-static const char kVideoTrack1[] = "video_1";
-static const char kVideoTrack2[] = "video_2";
-static const char kAudioTrack1[] = "audio_1";
-static const char kAudioTrack2[] = "audio_2";
-static const char kAudioTrack3[] = "audio_3";
-static const char kDataTrack1[] = "data_1";
-static const char kDataTrack2[] = "data_2";
-static const char kDataTrack3[] = "data_3";
-
-static const char* kMediaProtocols[] = {"RTP/AVP", "RTP/SAVP", "RTP/AVPF",
-                                        "RTP/SAVPF"};
-static const char* kMediaProtocolsDtls[] = {
-    "TCP/TLS/RTP/SAVPF", "TCP/TLS/RTP/SAVP", "UDP/TLS/RTP/SAVPF",
-    "UDP/TLS/RTP/SAVP"};
-
-// These constants are used to make the code using "AddMediaSection" more
-// readable.
-static constexpr bool kStopped = true;
-static constexpr bool kActive = false;
-
-static bool IsMediaContentOfType(const ContentInfo* content,
-                                 MediaType media_type) {
-  const MediaContentDescription* mdesc =
-      static_cast<const MediaContentDescription*>(content->description);
-  return mdesc && mdesc->type() == media_type;
-}
-
-static cricket::MediaContentDirection
-GetMediaDirection(const ContentInfo* content) {
-  cricket::MediaContentDescription* desc =
-      reinterpret_cast<cricket::MediaContentDescription*>(content->description);
-  return desc->direction();
-}
-
-static void AddRtxCodec(const VideoCodec& rtx_codec,
-                        std::vector<VideoCodec>* codecs) {
-  ASSERT_FALSE(cricket::FindCodecById(*codecs, rtx_codec.id));
-  codecs->push_back(rtx_codec);
-}
-
-template <class T>
-static std::vector<std::string> GetCodecNames(const std::vector<T>& codecs) {
-  std::vector<std::string> codec_names;
-  for (const auto& codec : codecs) {
-    codec_names.push_back(codec.name);
-  }
-  return codec_names;
-}
-
-// This is used for test only. MIDs are not the identification of the
-// MediaDescriptionOptions since some end points may not support MID and the SDP
-// may not contain 'mid'.
-std::vector<MediaDescriptionOptions>::iterator FindFirstMediaDescriptionByMid(
-    const std::string& mid,
-    MediaSessionOptions* opts) {
-  return std::find_if(
-      opts->media_description_options.begin(),
-      opts->media_description_options.end(),
-      [mid](const MediaDescriptionOptions& t) { return t.mid == mid; });
-}
-
-// Add a media section to the |session_options|.
-static void AddMediaSection(MediaType type,
-                            const std::string& mid,
-                            MediaContentDirection direction,
-                            bool stopped,
-                            MediaSessionOptions* opts) {
-  opts->media_description_options.push_back(MediaDescriptionOptions(
-      type, mid,
-      cricket::RtpTransceiverDirection::FromMediaContentDirection(direction),
-      stopped));
-}
-
-static void AddAudioVideoSections(MediaContentDirection direction,
-                                  MediaSessionOptions* opts) {
-  AddMediaSection(MEDIA_TYPE_AUDIO, "audio", direction, kActive, opts);
-  AddMediaSection(MEDIA_TYPE_VIDEO, "video", direction, kActive, opts);
-}
-
-static void AddDataSection(cricket::DataChannelType dct,
-                           MediaContentDirection direction,
-                           MediaSessionOptions* opts) {
-  opts->data_channel_type = dct;
-  AddMediaSection(MEDIA_TYPE_DATA, "data", direction, kActive, opts);
-}
-
-static void AttachSenderToMediaSection(
-    const std::string& mid,
-    MediaType type,
-    const std::string& track_id,
-    const std::vector<std::string>& stream_ids,
-    int num_sim_layer,
-    MediaSessionOptions* session_options) {
-  auto it = FindFirstMediaDescriptionByMid(mid, session_options);
-  switch (type) {
-    case MEDIA_TYPE_AUDIO:
-      it->AddAudioSender(track_id, stream_ids);
-      break;
-    case MEDIA_TYPE_VIDEO:
-      it->AddVideoSender(track_id, stream_ids, num_sim_layer);
-      break;
-    case MEDIA_TYPE_DATA:
-      RTC_CHECK(stream_ids.size() == 1U);
-      it->AddRtpDataChannel(track_id, stream_ids[0]);
-      break;
-    default:
-      RTC_NOTREACHED();
-  }
-}
-
-static void DetachSenderFromMediaSection(const std::string& mid,
-                                         const std::string& track_id,
-                                         MediaSessionOptions* session_options) {
-  auto it = FindFirstMediaDescriptionByMid(mid, session_options);
-  auto sender_it = it->sender_options.begin();
-  for (; sender_it != it->sender_options.end(); ++sender_it) {
-    if (sender_it->track_id == track_id) {
-      it->sender_options.erase(sender_it);
-      return;
-    }
-  }
-  RTC_NOTREACHED();
-}
-
-// Helper function used to create a default MediaSessionOptions for Plan B SDP.
-// (https://tools.ietf.org/html/draft-uberti-rtcweb-plan-00).
-static MediaSessionOptions CreatePlanBMediaSessionOptions() {
-  MediaSessionOptions session_options;
-  AddMediaSection(MEDIA_TYPE_AUDIO, "audio", cricket::MD_RECVONLY, kActive,
-                  &session_options);
-  return session_options;
-}
-
-// TODO(zhihuang): Most of these tests were written while MediaSessionOptions
-// was designed for Plan B SDP, where only one audio "m=" section and one video
-// "m=" section could be generated, and ordering couldn't be controlled. Many of
-// these tests may be obsolete as a result, and should be refactored or removed.
-class MediaSessionDescriptionFactoryTest : public testing::Test {
- public:
-  MediaSessionDescriptionFactoryTest() : f1_(&tdf1_), f2_(&tdf2_) {
-    f1_.set_audio_codecs(MAKE_VECTOR(kAudioCodecs1),
-                         MAKE_VECTOR(kAudioCodecs1));
-    f1_.set_video_codecs(MAKE_VECTOR(kVideoCodecs1));
-    f1_.set_data_codecs(MAKE_VECTOR(kDataCodecs1));
-    f2_.set_audio_codecs(MAKE_VECTOR(kAudioCodecs2),
-                         MAKE_VECTOR(kAudioCodecs2));
-    f2_.set_video_codecs(MAKE_VECTOR(kVideoCodecs2));
-    f2_.set_data_codecs(MAKE_VECTOR(kDataCodecs2));
-    tdf1_.set_certificate(rtc::RTCCertificate::Create(
-        std::unique_ptr<rtc::SSLIdentity>(new rtc::FakeSSLIdentity("id1"))));
-    tdf2_.set_certificate(rtc::RTCCertificate::Create(
-        std::unique_ptr<rtc::SSLIdentity>(new rtc::FakeSSLIdentity("id2"))));
-  }
-
-  // Create a video StreamParamsVec object with:
-  // - one video stream with 3 simulcast streams and FEC,
-  StreamParamsVec CreateComplexVideoStreamParamsVec() {
-    SsrcGroup sim_group("SIM", MAKE_VECTOR(kSimSsrc));
-    SsrcGroup fec_group1("FEC", MAKE_VECTOR(kFec1Ssrc));
-    SsrcGroup fec_group2("FEC", MAKE_VECTOR(kFec2Ssrc));
-    SsrcGroup fec_group3("FEC", MAKE_VECTOR(kFec3Ssrc));
-
-    std::vector<SsrcGroup> ssrc_groups;
-    ssrc_groups.push_back(sim_group);
-    ssrc_groups.push_back(fec_group1);
-    ssrc_groups.push_back(fec_group2);
-    ssrc_groups.push_back(fec_group3);
-
-    StreamParams simulcast_params;
-    simulcast_params.id = kVideoTrack1;
-    simulcast_params.ssrcs = MAKE_VECTOR(kSimulcastParamsSsrc);
-    simulcast_params.ssrc_groups = ssrc_groups;
-    simulcast_params.cname = "Video_SIM_FEC";
-    simulcast_params.sync_label = kMediaStream1;
-
-    StreamParamsVec video_streams;
-    video_streams.push_back(simulcast_params);
-
-    return video_streams;
-  }
-
-  bool CompareCryptoParams(const CryptoParamsVec& c1,
-                           const CryptoParamsVec& c2) {
-    if (c1.size() != c2.size())
-      return false;
-    for (size_t i = 0; i < c1.size(); ++i)
-      if (c1[i].tag != c2[i].tag || c1[i].cipher_suite != c2[i].cipher_suite ||
-          c1[i].key_params != c2[i].key_params ||
-          c1[i].session_params != c2[i].session_params)
-        return false;
-    return true;
-  }
-
-  // Returns true if the transport info contains "renomination" as an
-  // ICE option.
-  bool GetIceRenomination(const TransportInfo* transport_info) {
-    const std::vector<std::string>& ice_options =
-        transport_info->description.transport_options;
-    auto iter =
-        std::find(ice_options.begin(), ice_options.end(), "renomination");
-    return iter != ice_options.end();
-  }
-
-  void TestTransportInfo(bool offer,
-                         MediaSessionOptions& options,
-                         bool has_current_desc) {
-    const std::string current_audio_ufrag = "current_audio_ufrag";
-    const std::string current_audio_pwd = "current_audio_pwd";
-    const std::string current_video_ufrag = "current_video_ufrag";
-    const std::string current_video_pwd = "current_video_pwd";
-    const std::string current_data_ufrag = "current_data_ufrag";
-    const std::string current_data_pwd = "current_data_pwd";
-    std::unique_ptr<SessionDescription> current_desc;
-    std::unique_ptr<SessionDescription> desc;
-    if (has_current_desc) {
-      current_desc.reset(new SessionDescription());
-      EXPECT_TRUE(current_desc->AddTransportInfo(
-          TransportInfo("audio",
-                        TransportDescription(current_audio_ufrag,
-                                             current_audio_pwd))));
-      EXPECT_TRUE(current_desc->AddTransportInfo(
-          TransportInfo("video",
-                        TransportDescription(current_video_ufrag,
-                                             current_video_pwd))));
-      EXPECT_TRUE(current_desc->AddTransportInfo(
-          TransportInfo("data",
-                        TransportDescription(current_data_ufrag,
-                                             current_data_pwd))));
-    }
-    if (offer) {
-      desc.reset(f1_.CreateOffer(options, current_desc.get()));
-    } else {
-      std::unique_ptr<SessionDescription> offer;
-      offer.reset(f1_.CreateOffer(options, NULL));
-      desc.reset(f1_.CreateAnswer(offer.get(), options, current_desc.get()));
-    }
-    ASSERT_TRUE(desc.get() != NULL);
-    const TransportInfo* ti_audio = desc->GetTransportInfoByName("audio");
-    if (options.has_audio()) {
-      EXPECT_TRUE(ti_audio != NULL);
-      if (has_current_desc) {
-        EXPECT_EQ(current_audio_ufrag, ti_audio->description.ice_ufrag);
-        EXPECT_EQ(current_audio_pwd, ti_audio->description.ice_pwd);
-      } else {
-        EXPECT_EQ(static_cast<size_t>(cricket::ICE_UFRAG_LENGTH),
-                  ti_audio->description.ice_ufrag.size());
-        EXPECT_EQ(static_cast<size_t>(cricket::ICE_PWD_LENGTH),
-                  ti_audio->description.ice_pwd.size());
-      }
-      auto media_desc_options_it =
-          FindFirstMediaDescriptionByMid("audio", &options);
-      EXPECT_EQ(
-          media_desc_options_it->transport_options.enable_ice_renomination,
-          GetIceRenomination(ti_audio));
-
-    } else {
-      EXPECT_TRUE(ti_audio == NULL);
-    }
-    const TransportInfo* ti_video = desc->GetTransportInfoByName("video");
-    if (options.has_video()) {
-      EXPECT_TRUE(ti_video != NULL);
-      if (options.bundle_enabled) {
-        EXPECT_EQ(ti_audio->description.ice_ufrag,
-                  ti_video->description.ice_ufrag);
-        EXPECT_EQ(ti_audio->description.ice_pwd,
-                  ti_video->description.ice_pwd);
-      } else {
-        if (has_current_desc) {
-          EXPECT_EQ(current_video_ufrag, ti_video->description.ice_ufrag);
-          EXPECT_EQ(current_video_pwd, ti_video->description.ice_pwd);
-        } else {
-          EXPECT_EQ(static_cast<size_t>(cricket::ICE_UFRAG_LENGTH),
-                    ti_video->description.ice_ufrag.size());
-          EXPECT_EQ(static_cast<size_t>(cricket::ICE_PWD_LENGTH),
-                    ti_video->description.ice_pwd.size());
-        }
-      }
-      auto media_desc_options_it =
-          FindFirstMediaDescriptionByMid("video", &options);
-      EXPECT_EQ(
-          media_desc_options_it->transport_options.enable_ice_renomination,
-          GetIceRenomination(ti_video));
-    } else {
-      EXPECT_TRUE(ti_video == NULL);
-    }
-    const TransportInfo* ti_data = desc->GetTransportInfoByName("data");
-    if (options.has_data()) {
-      EXPECT_TRUE(ti_data != NULL);
-      if (options.bundle_enabled) {
-        EXPECT_EQ(ti_audio->description.ice_ufrag,
-                  ti_data->description.ice_ufrag);
-        EXPECT_EQ(ti_audio->description.ice_pwd,
-                  ti_data->description.ice_pwd);
-      } else {
-        if (has_current_desc) {
-          EXPECT_EQ(current_data_ufrag, ti_data->description.ice_ufrag);
-          EXPECT_EQ(current_data_pwd, ti_data->description.ice_pwd);
-        } else {
-          EXPECT_EQ(static_cast<size_t>(cricket::ICE_UFRAG_LENGTH),
-                    ti_data->description.ice_ufrag.size());
-          EXPECT_EQ(static_cast<size_t>(cricket::ICE_PWD_LENGTH),
-                    ti_data->description.ice_pwd.size());
-        }
-      }
-      auto media_desc_options_it =
-          FindFirstMediaDescriptionByMid("data", &options);
-      EXPECT_EQ(
-          media_desc_options_it->transport_options.enable_ice_renomination,
-          GetIceRenomination(ti_data));
-
-    } else {
-      EXPECT_TRUE(ti_video == NULL);
-    }
-  }
-
-  void TestCryptoWithBundle(bool offer) {
-    f1_.set_secure(SEC_ENABLED);
-    MediaSessionOptions options;
-    AddAudioVideoSections(cricket::MD_RECVONLY, &options);
-    AddDataSection(cricket::DCT_RTP, cricket::MD_RECVONLY, &options);
-    std::unique_ptr<SessionDescription> ref_desc;
-    std::unique_ptr<SessionDescription> desc;
-    if (offer) {
-      options.bundle_enabled = false;
-      ref_desc.reset(f1_.CreateOffer(options, NULL));
-      options.bundle_enabled = true;
-      desc.reset(f1_.CreateOffer(options, ref_desc.get()));
-    } else {
-      options.bundle_enabled = true;
-      ref_desc.reset(f1_.CreateOffer(options, NULL));
-      desc.reset(f1_.CreateAnswer(ref_desc.get(), options, NULL));
-    }
-    ASSERT_TRUE(desc.get() != NULL);
-    const cricket::MediaContentDescription* audio_media_desc =
-        static_cast<const cricket::MediaContentDescription*>(
-            desc.get()->GetContentDescriptionByName("audio"));
-    ASSERT_TRUE(audio_media_desc != NULL);
-    const cricket::MediaContentDescription* video_media_desc =
-        static_cast<const cricket::MediaContentDescription*>(
-            desc.get()->GetContentDescriptionByName("video"));
-    ASSERT_TRUE(video_media_desc != NULL);
-    EXPECT_TRUE(CompareCryptoParams(audio_media_desc->cryptos(),
-                                    video_media_desc->cryptos()));
-    EXPECT_EQ(1u, audio_media_desc->cryptos().size());
-    EXPECT_EQ(std::string(CS_AES_CM_128_HMAC_SHA1_80),
-              audio_media_desc->cryptos()[0].cipher_suite);
-
-    // Verify the selected crypto is one from the reference audio
-    // media content.
-    const cricket::MediaContentDescription* ref_audio_media_desc =
-        static_cast<const cricket::MediaContentDescription*>(
-            ref_desc.get()->GetContentDescriptionByName("audio"));
-    bool found = false;
-    for (size_t i = 0; i < ref_audio_media_desc->cryptos().size(); ++i) {
-      if (ref_audio_media_desc->cryptos()[i].Matches(
-          audio_media_desc->cryptos()[0])) {
-        found = true;
-        break;
-      }
-    }
-    EXPECT_TRUE(found);
-  }
-
-  // This test that the audio and video media direction is set to
-  // |expected_direction_in_answer| in an answer if the offer direction is set
-  // to |direction_in_offer| and the answer is willing to both send and receive.
-  void TestMediaDirectionInAnswer(
-      cricket::MediaContentDirection direction_in_offer,
-      cricket::MediaContentDirection expected_direction_in_answer) {
-    MediaSessionOptions offer_opts;
-    AddAudioVideoSections(direction_in_offer, &offer_opts);
-
-    std::unique_ptr<SessionDescription> offer(
-        f1_.CreateOffer(offer_opts, NULL));
-    ASSERT_TRUE(offer.get() != NULL);
-    ContentInfo* ac_offer = offer->GetContentByName("audio");
-    ASSERT_TRUE(ac_offer != NULL);
-    ContentInfo* vc_offer = offer->GetContentByName("video");
-    ASSERT_TRUE(vc_offer != NULL);
-
-    MediaSessionOptions answer_opts;
-    AddAudioVideoSections(cricket::MD_SENDRECV, &answer_opts);
-    std::unique_ptr<SessionDescription> answer(
-        f2_.CreateAnswer(offer.get(), answer_opts, NULL));
-    const AudioContentDescription* acd_answer =
-        GetFirstAudioContentDescription(answer.get());
-    EXPECT_EQ(expected_direction_in_answer, acd_answer->direction());
-    const VideoContentDescription* vcd_answer =
-        GetFirstVideoContentDescription(answer.get());
-    EXPECT_EQ(expected_direction_in_answer, vcd_answer->direction());
-  }
-
-  bool VerifyNoCNCodecs(const cricket::ContentInfo* content) {
-    const cricket::ContentDescription* description = content->description;
-    RTC_CHECK(description != NULL);
-    const cricket::AudioContentDescription* audio_content_desc =
-        static_cast<const cricket::AudioContentDescription*>(description);
-    RTC_CHECK(audio_content_desc != NULL);
-    for (size_t i = 0; i < audio_content_desc->codecs().size(); ++i) {
-      if (audio_content_desc->codecs()[i].name == "CN")
-        return false;
-    }
-    return true;
-  }
-
-  void TestVideoGcmCipher(bool gcm_offer, bool gcm_answer) {
-    MediaSessionOptions offer_opts;
-    AddAudioVideoSections(cricket::MD_RECVONLY, &offer_opts);
-    offer_opts.crypto_options.enable_gcm_crypto_suites = gcm_offer;
-
-    MediaSessionOptions answer_opts;
-    AddAudioVideoSections(cricket::MD_RECVONLY, &answer_opts);
-    answer_opts.crypto_options.enable_gcm_crypto_suites = gcm_answer;
-
-    f1_.set_secure(SEC_ENABLED);
-    f2_.set_secure(SEC_ENABLED);
-    std::unique_ptr<SessionDescription> offer(
-        f1_.CreateOffer(offer_opts, NULL));
-    ASSERT_TRUE(offer.get() != NULL);
-    std::unique_ptr<SessionDescription> answer(
-        f2_.CreateAnswer(offer.get(), answer_opts, NULL));
-    const ContentInfo* ac = answer->GetContentByName("audio");
-    const ContentInfo* vc = answer->GetContentByName("video");
-    ASSERT_TRUE(ac != NULL);
-    ASSERT_TRUE(vc != NULL);
-    EXPECT_EQ(std::string(NS_JINGLE_RTP), ac->type);
-    EXPECT_EQ(std::string(NS_JINGLE_RTP), vc->type);
-    const AudioContentDescription* acd =
-        static_cast<const AudioContentDescription*>(ac->description);
-    const VideoContentDescription* vcd =
-        static_cast<const VideoContentDescription*>(vc->description);
-    EXPECT_EQ(MEDIA_TYPE_AUDIO, acd->type());
-    EXPECT_EQ(MAKE_VECTOR(kAudioCodecsAnswer), acd->codecs());
-    EXPECT_EQ(kAutoBandwidth, acd->bandwidth());  // negotiated auto bw
-    EXPECT_EQ(0U, acd->first_ssrc());             // no sender is attached
-    EXPECT_TRUE(acd->rtcp_mux());                 // negotiated rtcp-mux
-    if (gcm_offer && gcm_answer) {
-      ASSERT_CRYPTO(acd, 1U, CS_AEAD_AES_256_GCM);
-    } else {
-      ASSERT_CRYPTO(acd, 1U, CS_AES_CM_128_HMAC_SHA1_32);
-    }
-    EXPECT_EQ(MEDIA_TYPE_VIDEO, vcd->type());
-    EXPECT_EQ(MAKE_VECTOR(kVideoCodecsAnswer), vcd->codecs());
-    EXPECT_EQ(0U, vcd->first_ssrc());             // no sender is attached
-    EXPECT_TRUE(vcd->rtcp_mux());                 // negotiated rtcp-mux
-    if (gcm_offer && gcm_answer) {
-      ASSERT_CRYPTO(vcd, 1U, CS_AEAD_AES_256_GCM);
-    } else {
-      ASSERT_CRYPTO(vcd, 1U, CS_AES_CM_128_HMAC_SHA1_80);
-    }
-    EXPECT_EQ(std::string(cricket::kMediaProtocolSavpf), vcd->protocol());
-  }
-
- protected:
-  MediaSessionDescriptionFactory f1_;
-  MediaSessionDescriptionFactory f2_;
-  TransportDescriptionFactory tdf1_;
-  TransportDescriptionFactory tdf2_;
-};
-
-// Create a typical audio offer, and ensure it matches what we expect.
-TEST_F(MediaSessionDescriptionFactoryTest, TestCreateAudioOffer) {
-  f1_.set_secure(SEC_ENABLED);
-  std::unique_ptr<SessionDescription> offer(
-      f1_.CreateOffer(CreatePlanBMediaSessionOptions(), NULL));
-  ASSERT_TRUE(offer.get() != NULL);
-  const ContentInfo* ac = offer->GetContentByName("audio");
-  const ContentInfo* vc = offer->GetContentByName("video");
-  ASSERT_TRUE(ac != NULL);
-  ASSERT_TRUE(vc == NULL);
-  EXPECT_EQ(std::string(NS_JINGLE_RTP), ac->type);
-  const AudioContentDescription* acd =
-      static_cast<const AudioContentDescription*>(ac->description);
-  EXPECT_EQ(MEDIA_TYPE_AUDIO, acd->type());
-  EXPECT_EQ(f1_.audio_sendrecv_codecs(), acd->codecs());
-  EXPECT_EQ(0U, acd->first_ssrc());             // no sender is attached.
-  EXPECT_EQ(kAutoBandwidth, acd->bandwidth());  // default bandwidth (auto)
-  EXPECT_TRUE(acd->rtcp_mux());                 // rtcp-mux defaults on
-  ASSERT_CRYPTO(acd, 2U, CS_AES_CM_128_HMAC_SHA1_32);
-  EXPECT_EQ(std::string(cricket::kMediaProtocolSavpf), acd->protocol());
-}
-
-// Create a typical video offer, and ensure it matches what we expect.
-TEST_F(MediaSessionDescriptionFactoryTest, TestCreateVideoOffer) {
-  MediaSessionOptions opts;
-  AddAudioVideoSections(cricket::MD_RECVONLY, &opts);
-  f1_.set_secure(SEC_ENABLED);
-  std::unique_ptr<SessionDescription> offer(f1_.CreateOffer(opts, NULL));
-  ASSERT_TRUE(offer.get() != NULL);
-  const ContentInfo* ac = offer->GetContentByName("audio");
-  const ContentInfo* vc = offer->GetContentByName("video");
-  ASSERT_TRUE(ac != NULL);
-  ASSERT_TRUE(vc != NULL);
-  EXPECT_EQ(std::string(NS_JINGLE_RTP), ac->type);
-  EXPECT_EQ(std::string(NS_JINGLE_RTP), vc->type);
-  const AudioContentDescription* acd =
-      static_cast<const AudioContentDescription*>(ac->description);
-  const VideoContentDescription* vcd =
-      static_cast<const VideoContentDescription*>(vc->description);
-  EXPECT_EQ(MEDIA_TYPE_AUDIO, acd->type());
-  EXPECT_EQ(f1_.audio_sendrecv_codecs(), acd->codecs());
-  EXPECT_EQ(0U, acd->first_ssrc());             // no sender is attached
-  EXPECT_EQ(kAutoBandwidth, acd->bandwidth());  // default bandwidth (auto)
-  EXPECT_TRUE(acd->rtcp_mux());                 // rtcp-mux defaults on
-  ASSERT_CRYPTO(acd, 2U, CS_AES_CM_128_HMAC_SHA1_32);
-  EXPECT_EQ(std::string(cricket::kMediaProtocolSavpf), acd->protocol());
-  EXPECT_EQ(MEDIA_TYPE_VIDEO, vcd->type());
-  EXPECT_EQ(f1_.video_codecs(), vcd->codecs());
-  EXPECT_EQ(0U, vcd->first_ssrc());             // no sender is attached
-  EXPECT_EQ(kAutoBandwidth, vcd->bandwidth());  // default bandwidth (auto)
-  EXPECT_TRUE(vcd->rtcp_mux());                 // rtcp-mux defaults on
-  ASSERT_CRYPTO(vcd, 1U, CS_AES_CM_128_HMAC_SHA1_80);
-  EXPECT_EQ(std::string(cricket::kMediaProtocolSavpf), vcd->protocol());
-}
-
-// Test creating an offer with bundle where the Codecs have the same dynamic
-// RTP playlod type. The test verifies that the offer don't contain the
-// duplicate RTP payload types.
-TEST_F(MediaSessionDescriptionFactoryTest, TestBundleOfferWithSameCodecPlType) {
-  const VideoCodec& offered_video_codec = f2_.video_codecs()[0];
-  const AudioCodec& offered_audio_codec = f2_.audio_sendrecv_codecs()[0];
-  const DataCodec& offered_data_codec = f2_.data_codecs()[0];
-  ASSERT_EQ(offered_video_codec.id, offered_audio_codec.id);
-  ASSERT_EQ(offered_video_codec.id, offered_data_codec.id);
-
-  MediaSessionOptions opts;
-  AddAudioVideoSections(cricket::MD_RECVONLY, &opts);
-  AddDataSection(cricket::DCT_RTP, cricket::MD_RECVONLY, &opts);
-  opts.bundle_enabled = true;
-  std::unique_ptr<SessionDescription> offer(f2_.CreateOffer(opts, NULL));
-  const VideoContentDescription* vcd =
-      GetFirstVideoContentDescription(offer.get());
-  const AudioContentDescription* acd =
-      GetFirstAudioContentDescription(offer.get());
-  const DataContentDescription* dcd =
-      GetFirstDataContentDescription(offer.get());
-  ASSERT_TRUE(NULL != vcd);
-  ASSERT_TRUE(NULL != acd);
-  ASSERT_TRUE(NULL != dcd);
-  EXPECT_NE(vcd->codecs()[0].id, acd->codecs()[0].id);
-  EXPECT_NE(vcd->codecs()[0].id, dcd->codecs()[0].id);
-  EXPECT_NE(acd->codecs()[0].id, dcd->codecs()[0].id);
-  EXPECT_EQ(vcd->codecs()[0].name, offered_video_codec.name);
-  EXPECT_EQ(acd->codecs()[0].name, offered_audio_codec.name);
-  EXPECT_EQ(dcd->codecs()[0].name, offered_data_codec.name);
-}
-
-// Test creating an updated offer with bundle, audio, video and data
-// after an audio only session has been negotiated.
-TEST_F(MediaSessionDescriptionFactoryTest,
-       TestCreateUpdatedVideoOfferWithBundle) {
-  f1_.set_secure(SEC_ENABLED);
-  f2_.set_secure(SEC_ENABLED);
-  MediaSessionOptions opts;
-  AddMediaSection(MEDIA_TYPE_AUDIO, "audio", cricket::MD_RECVONLY, kActive,
-                  &opts);
-  AddMediaSection(MEDIA_TYPE_VIDEO, "video", cricket::MD_INACTIVE, kStopped,
-                  &opts);
-  opts.data_channel_type = cricket::DCT_NONE;
-  opts.bundle_enabled = true;
-  std::unique_ptr<SessionDescription> offer(f1_.CreateOffer(opts, NULL));
-  std::unique_ptr<SessionDescription> answer(
-      f2_.CreateAnswer(offer.get(), opts, NULL));
-
-  MediaSessionOptions updated_opts;
-  AddAudioVideoSections(cricket::MD_RECVONLY, &updated_opts);
-  AddDataSection(cricket::DCT_RTP, cricket::MD_RECVONLY, &updated_opts);
-  updated_opts.bundle_enabled = true;
-  std::unique_ptr<SessionDescription> updated_offer(
-      f1_.CreateOffer(updated_opts, answer.get()));
-
-  const AudioContentDescription* acd =
-      GetFirstAudioContentDescription(updated_offer.get());
-  const VideoContentDescription* vcd =
-      GetFirstVideoContentDescription(updated_offer.get());
-  const DataContentDescription* dcd =
-      GetFirstDataContentDescription(updated_offer.get());
-  EXPECT_TRUE(NULL != vcd);
-  EXPECT_TRUE(NULL != acd);
-  EXPECT_TRUE(NULL != dcd);
-
-  ASSERT_CRYPTO(acd, 1U, CS_AES_CM_128_HMAC_SHA1_80);
-  EXPECT_EQ(std::string(cricket::kMediaProtocolSavpf), acd->protocol());
-  ASSERT_CRYPTO(vcd, 1U, CS_AES_CM_128_HMAC_SHA1_80);
-  EXPECT_EQ(std::string(cricket::kMediaProtocolSavpf), vcd->protocol());
-  ASSERT_CRYPTO(dcd, 1U, CS_AES_CM_128_HMAC_SHA1_80);
-  EXPECT_EQ(std::string(cricket::kMediaProtocolSavpf), dcd->protocol());
-}
-
-// Create a RTP data offer, and ensure it matches what we expect.
-TEST_F(MediaSessionDescriptionFactoryTest, TestCreateRtpDataOffer) {
-  MediaSessionOptions opts;
-  AddAudioVideoSections(cricket::MD_RECVONLY, &opts);
-  AddDataSection(cricket::DCT_RTP, cricket::MD_RECVONLY, &opts);
-  f1_.set_secure(SEC_ENABLED);
-  std::unique_ptr<SessionDescription> offer(f1_.CreateOffer(opts, NULL));
-  ASSERT_TRUE(offer.get() != NULL);
-  const ContentInfo* ac = offer->GetContentByName("audio");
-  const ContentInfo* dc = offer->GetContentByName("data");
-  ASSERT_TRUE(ac != NULL);
-  ASSERT_TRUE(dc != NULL);
-  EXPECT_EQ(std::string(NS_JINGLE_RTP), ac->type);
-  EXPECT_EQ(std::string(NS_JINGLE_RTP), dc->type);
-  const AudioContentDescription* acd =
-      static_cast<const AudioContentDescription*>(ac->description);
-  const DataContentDescription* dcd =
-      static_cast<const DataContentDescription*>(dc->description);
-  EXPECT_EQ(MEDIA_TYPE_AUDIO, acd->type());
-  EXPECT_EQ(f1_.audio_sendrecv_codecs(), acd->codecs());
-  EXPECT_EQ(0U, acd->first_ssrc());             // no sender is attched.
-  EXPECT_EQ(kAutoBandwidth, acd->bandwidth());  // default bandwidth (auto)
-  EXPECT_TRUE(acd->rtcp_mux());                 // rtcp-mux defaults on
-  ASSERT_CRYPTO(acd, 2U, CS_AES_CM_128_HMAC_SHA1_32);
-  EXPECT_EQ(std::string(cricket::kMediaProtocolSavpf), acd->protocol());
-  EXPECT_EQ(MEDIA_TYPE_DATA, dcd->type());
-  EXPECT_EQ(f1_.data_codecs(), dcd->codecs());
-  EXPECT_EQ(0U, dcd->first_ssrc());  // no sender is attached.
-  EXPECT_EQ(cricket::kDataMaxBandwidth,
-            dcd->bandwidth());                  // default bandwidth (auto)
-  EXPECT_TRUE(dcd->rtcp_mux());                 // rtcp-mux defaults on
-  ASSERT_CRYPTO(dcd, 1U, CS_AES_CM_128_HMAC_SHA1_80);
-  EXPECT_EQ(std::string(cricket::kMediaProtocolSavpf), dcd->protocol());
-}
-
-// Create an SCTP data offer with bundle without error.
-TEST_F(MediaSessionDescriptionFactoryTest, TestCreateSctpDataOffer) {
-  MediaSessionOptions opts;
-  opts.bundle_enabled = true;
-  AddDataSection(cricket::DCT_SCTP, cricket::MD_SENDRECV, &opts);
-  f1_.set_secure(SEC_ENABLED);
-  std::unique_ptr<SessionDescription> offer(f1_.CreateOffer(opts, NULL));
-  EXPECT_TRUE(offer.get() != NULL);
-  EXPECT_TRUE(offer->GetContentByName("data") != NULL);
-}
-
-// Test creating an sctp data channel from an already generated offer.
-TEST_F(MediaSessionDescriptionFactoryTest, TestCreateImplicitSctpDataOffer) {
-  MediaSessionOptions opts;
-  opts.bundle_enabled = true;
-  AddDataSection(cricket::DCT_SCTP, cricket::MD_SENDRECV, &opts);
-  f1_.set_secure(SEC_ENABLED);
-  std::unique_ptr<SessionDescription> offer1(f1_.CreateOffer(opts, NULL));
-  ASSERT_TRUE(offer1.get() != NULL);
-  const ContentInfo* data = offer1->GetContentByName("data");
-  ASSERT_TRUE(data != NULL);
-  const MediaContentDescription* mdesc =
-      static_cast<const MediaContentDescription*>(data->description);
-  ASSERT_EQ(cricket::kMediaProtocolSctp, mdesc->protocol());
-
-  // Now set data_channel_type to 'none' (default) and make sure that the
-  // datachannel type that gets generated from the previous offer, is of the
-  // same type.
-  opts.data_channel_type = cricket::DCT_NONE;
-  std::unique_ptr<SessionDescription> offer2(
-      f1_.CreateOffer(opts, offer1.get()));
-  data = offer2->GetContentByName("data");
-  ASSERT_TRUE(data != NULL);
-  mdesc = static_cast<const MediaContentDescription*>(data->description);
-  EXPECT_EQ(cricket::kMediaProtocolSctp, mdesc->protocol());
-}
-
-// Create an audio, video offer without legacy StreamParams.
-TEST_F(MediaSessionDescriptionFactoryTest,
-       TestCreateOfferWithoutLegacyStreams) {
-  MediaSessionOptions opts;
-  AddAudioVideoSections(cricket::MD_RECVONLY, &opts);
-  std::unique_ptr<SessionDescription> offer(f1_.CreateOffer(opts, NULL));
-  ASSERT_TRUE(offer.get() != NULL);
-  const ContentInfo* ac = offer->GetContentByName("audio");
-  const ContentInfo* vc = offer->GetContentByName("video");
-  ASSERT_TRUE(ac != NULL);
-  ASSERT_TRUE(vc != NULL);
-  const AudioContentDescription* acd =
-      static_cast<const AudioContentDescription*>(ac->description);
-  const VideoContentDescription* vcd =
-      static_cast<const VideoContentDescription*>(vc->description);
-
-  EXPECT_FALSE(vcd->has_ssrcs());             // No StreamParams.
-  EXPECT_FALSE(acd->has_ssrcs());             // No StreamParams.
-}
-
-// Creates an audio+video sendonly offer.
-TEST_F(MediaSessionDescriptionFactoryTest, TestCreateSendOnlyOffer) {
-  MediaSessionOptions opts;
-  AddAudioVideoSections(cricket::MD_SENDONLY, &opts);
-  AttachSenderToMediaSection("video", MEDIA_TYPE_VIDEO, kVideoTrack1,
-                             {kMediaStream1}, 1, &opts);
-  AttachSenderToMediaSection("audio", MEDIA_TYPE_AUDIO, kAudioTrack1,
-                             {kMediaStream1}, 1, &opts);
-
-  std::unique_ptr<SessionDescription> offer(f1_.CreateOffer(opts, NULL));
-  ASSERT_TRUE(offer.get() != NULL);
-  EXPECT_EQ(2u, offer->contents().size());
-  EXPECT_TRUE(IsMediaContentOfType(&offer->contents()[0], MEDIA_TYPE_AUDIO));
-  EXPECT_TRUE(IsMediaContentOfType(&offer->contents()[1], MEDIA_TYPE_VIDEO));
-
-  EXPECT_EQ(cricket::MD_SENDONLY, GetMediaDirection(&offer->contents()[0]));
-  EXPECT_EQ(cricket::MD_SENDONLY, GetMediaDirection(&offer->contents()[1]));
-}
-
-// Verifies that the order of the media contents in the current
-// SessionDescription is preserved in the new SessionDescription.
-TEST_F(MediaSessionDescriptionFactoryTest, TestCreateOfferContentOrder) {
-  MediaSessionOptions opts;
-  AddDataSection(cricket::DCT_SCTP, cricket::MD_SENDRECV, &opts);
-
-  std::unique_ptr<SessionDescription> offer1(f1_.CreateOffer(opts, NULL));
-  ASSERT_TRUE(offer1.get() != NULL);
-  EXPECT_EQ(1u, offer1->contents().size());
-  EXPECT_TRUE(IsMediaContentOfType(&offer1->contents()[0], MEDIA_TYPE_DATA));
-
-  AddMediaSection(MEDIA_TYPE_VIDEO, "video", cricket::MD_RECVONLY, kActive,
-                  &opts);
-  std::unique_ptr<SessionDescription> offer2(
-      f1_.CreateOffer(opts, offer1.get()));
-  ASSERT_TRUE(offer2.get() != NULL);
-  EXPECT_EQ(2u, offer2->contents().size());
-  EXPECT_TRUE(IsMediaContentOfType(&offer2->contents()[0], MEDIA_TYPE_DATA));
-  EXPECT_TRUE(IsMediaContentOfType(&offer2->contents()[1], MEDIA_TYPE_VIDEO));
-
-  AddMediaSection(MEDIA_TYPE_AUDIO, "audio", cricket::MD_RECVONLY, kActive,
-                  &opts);
-  std::unique_ptr<SessionDescription> offer3(
-      f1_.CreateOffer(opts, offer2.get()));
-  ASSERT_TRUE(offer3.get() != NULL);
-  EXPECT_EQ(3u, offer3->contents().size());
-  EXPECT_TRUE(IsMediaContentOfType(&offer3->contents()[0], MEDIA_TYPE_DATA));
-  EXPECT_TRUE(IsMediaContentOfType(&offer3->contents()[1], MEDIA_TYPE_VIDEO));
-  EXPECT_TRUE(IsMediaContentOfType(&offer3->contents()[2], MEDIA_TYPE_AUDIO));
-}
-
-// Create a typical audio answer, and ensure it matches what we expect.
-TEST_F(MediaSessionDescriptionFactoryTest, TestCreateAudioAnswer) {
-  f1_.set_secure(SEC_ENABLED);
-  f2_.set_secure(SEC_ENABLED);
-  std::unique_ptr<SessionDescription> offer(
-      f1_.CreateOffer(CreatePlanBMediaSessionOptions(), NULL));
-  ASSERT_TRUE(offer.get() != NULL);
-  std::unique_ptr<SessionDescription> answer(
-      f2_.CreateAnswer(offer.get(), CreatePlanBMediaSessionOptions(), NULL));
-  const ContentInfo* ac = answer->GetContentByName("audio");
-  const ContentInfo* vc = answer->GetContentByName("video");
-  ASSERT_TRUE(ac != NULL);
-  ASSERT_TRUE(vc == NULL);
-  EXPECT_EQ(std::string(NS_JINGLE_RTP), ac->type);
-  const AudioContentDescription* acd =
-      static_cast<const AudioContentDescription*>(ac->description);
-  EXPECT_EQ(MEDIA_TYPE_AUDIO, acd->type());
-  EXPECT_EQ(MAKE_VECTOR(kAudioCodecsAnswer), acd->codecs());
-  EXPECT_EQ(0U, acd->first_ssrc());             // no sender is attached
-  EXPECT_EQ(kAutoBandwidth, acd->bandwidth());  // negotiated auto bw
-  EXPECT_TRUE(acd->rtcp_mux());                 // negotiated rtcp-mux
-  ASSERT_CRYPTO(acd, 1U, CS_AES_CM_128_HMAC_SHA1_32);
-  EXPECT_EQ(std::string(cricket::kMediaProtocolSavpf), acd->protocol());
-}
-
-// Create a typical audio answer with GCM ciphers enabled, and ensure it
-// matches what we expect.
-TEST_F(MediaSessionDescriptionFactoryTest, TestCreateAudioAnswerGcm) {
-  f1_.set_secure(SEC_ENABLED);
-  f2_.set_secure(SEC_ENABLED);
-  MediaSessionOptions opts = CreatePlanBMediaSessionOptions();
-  opts.crypto_options.enable_gcm_crypto_suites = true;
-  std::unique_ptr<SessionDescription> offer(f1_.CreateOffer(opts, NULL));
-  ASSERT_TRUE(offer.get() != NULL);
-  std::unique_ptr<SessionDescription> answer(
-      f2_.CreateAnswer(offer.get(), opts, NULL));
-  const ContentInfo* ac = answer->GetContentByName("audio");
-  const ContentInfo* vc = answer->GetContentByName("video");
-  ASSERT_TRUE(ac != NULL);
-  ASSERT_TRUE(vc == NULL);
-  EXPECT_EQ(std::string(NS_JINGLE_RTP), ac->type);
-  const AudioContentDescription* acd =
-      static_cast<const AudioContentDescription*>(ac->description);
-  EXPECT_EQ(MEDIA_TYPE_AUDIO, acd->type());
-  EXPECT_EQ(MAKE_VECTOR(kAudioCodecsAnswer), acd->codecs());
-  EXPECT_EQ(0U, acd->first_ssrc());             // no sender is attached
-  EXPECT_EQ(kAutoBandwidth, acd->bandwidth());  // negotiated auto bw
-  EXPECT_TRUE(acd->rtcp_mux());                 // negotiated rtcp-mux
-  ASSERT_CRYPTO(acd, 1U, CS_AEAD_AES_256_GCM);
-  EXPECT_EQ(std::string(cricket::kMediaProtocolSavpf), acd->protocol());
-}
-
-// Create a typical video answer, and ensure it matches what we expect.
-TEST_F(MediaSessionDescriptionFactoryTest, TestCreateVideoAnswer) {
-  MediaSessionOptions opts;
-  AddAudioVideoSections(cricket::MD_RECVONLY, &opts);
-  f1_.set_secure(SEC_ENABLED);
-  f2_.set_secure(SEC_ENABLED);
-  std::unique_ptr<SessionDescription> offer(f1_.CreateOffer(opts, NULL));
-  ASSERT_TRUE(offer.get() != NULL);
-  std::unique_ptr<SessionDescription> answer(
-      f2_.CreateAnswer(offer.get(), opts, NULL));
-  const ContentInfo* ac = answer->GetContentByName("audio");
-  const ContentInfo* vc = answer->GetContentByName("video");
-  ASSERT_TRUE(ac != NULL);
-  ASSERT_TRUE(vc != NULL);
-  EXPECT_EQ(std::string(NS_JINGLE_RTP), ac->type);
-  EXPECT_EQ(std::string(NS_JINGLE_RTP), vc->type);
-  const AudioContentDescription* acd =
-      static_cast<const AudioContentDescription*>(ac->description);
-  const VideoContentDescription* vcd =
-      static_cast<const VideoContentDescription*>(vc->description);
-  EXPECT_EQ(MEDIA_TYPE_AUDIO, acd->type());
-  EXPECT_EQ(MAKE_VECTOR(kAudioCodecsAnswer), acd->codecs());
-  EXPECT_EQ(kAutoBandwidth, acd->bandwidth());  // negotiated auto bw
-  EXPECT_EQ(0U, acd->first_ssrc());             // no sender is attached
-  EXPECT_TRUE(acd->rtcp_mux());                 // negotiated rtcp-mux
-  ASSERT_CRYPTO(acd, 1U, CS_AES_CM_128_HMAC_SHA1_32);
-  EXPECT_EQ(MEDIA_TYPE_VIDEO, vcd->type());
-  EXPECT_EQ(MAKE_VECTOR(kVideoCodecsAnswer), vcd->codecs());
-  EXPECT_EQ(0U, vcd->first_ssrc());             // no sender is attached
-  EXPECT_TRUE(vcd->rtcp_mux());                 // negotiated rtcp-mux
-  ASSERT_CRYPTO(vcd, 1U, CS_AES_CM_128_HMAC_SHA1_80);
-  EXPECT_EQ(std::string(cricket::kMediaProtocolSavpf), vcd->protocol());
-}
-
-// Create a typical video answer with GCM ciphers enabled, and ensure it
-// matches what we expect.
-TEST_F(MediaSessionDescriptionFactoryTest, TestCreateVideoAnswerGcm) {
-  TestVideoGcmCipher(true, true);
-}
-
-// Create a typical video answer with GCM ciphers enabled for the offer only,
-// and ensure it matches what we expect.
-TEST_F(MediaSessionDescriptionFactoryTest, TestCreateVideoAnswerGcmOffer) {
-  TestVideoGcmCipher(true, false);
-}
-
-// Create a typical video answer with GCM ciphers enabled for the answer only,
-// and ensure it matches what we expect.
-TEST_F(MediaSessionDescriptionFactoryTest, TestCreateVideoAnswerGcmAnswer) {
-  TestVideoGcmCipher(false, true);
-}
-
-TEST_F(MediaSessionDescriptionFactoryTest, TestCreateDataAnswer) {
-  MediaSessionOptions opts = CreatePlanBMediaSessionOptions();
-  AddDataSection(cricket::DCT_RTP, cricket::MD_RECVONLY, &opts);
-  f1_.set_secure(SEC_ENABLED);
-  f2_.set_secure(SEC_ENABLED);
-  std::unique_ptr<SessionDescription> offer(f1_.CreateOffer(opts, NULL));
-  ASSERT_TRUE(offer.get() != NULL);
-  std::unique_ptr<SessionDescription> answer(
-      f2_.CreateAnswer(offer.get(), opts, NULL));
-  const ContentInfo* ac = answer->GetContentByName("audio");
-  const ContentInfo* dc = answer->GetContentByName("data");
-  ASSERT_TRUE(ac != NULL);
-  ASSERT_TRUE(dc != NULL);
-  EXPECT_EQ(std::string(NS_JINGLE_RTP), ac->type);
-  EXPECT_EQ(std::string(NS_JINGLE_RTP), dc->type);
-  const AudioContentDescription* acd =
-      static_cast<const AudioContentDescription*>(ac->description);
-  const DataContentDescription* dcd =
-      static_cast<const DataContentDescription*>(dc->description);
-  EXPECT_EQ(MEDIA_TYPE_AUDIO, acd->type());
-  EXPECT_EQ(MAKE_VECTOR(kAudioCodecsAnswer), acd->codecs());
-  EXPECT_EQ(kAutoBandwidth, acd->bandwidth());  // negotiated auto bw
-  EXPECT_EQ(0U, acd->first_ssrc());             // no sender is attached
-  EXPECT_TRUE(acd->rtcp_mux());                 // negotiated rtcp-mux
-  ASSERT_CRYPTO(acd, 1U, CS_AES_CM_128_HMAC_SHA1_32);
-  EXPECT_EQ(MEDIA_TYPE_DATA, dcd->type());
-  EXPECT_EQ(MAKE_VECTOR(kDataCodecsAnswer), dcd->codecs());
-  EXPECT_EQ(0U, dcd->first_ssrc());  // no sender is attached
-  EXPECT_TRUE(dcd->rtcp_mux());      // negotiated rtcp-mux
-  ASSERT_CRYPTO(dcd, 1U, CS_AES_CM_128_HMAC_SHA1_80);
-  EXPECT_EQ(std::string(cricket::kMediaProtocolSavpf), dcd->protocol());
-}
-
-TEST_F(MediaSessionDescriptionFactoryTest, TestCreateDataAnswerGcm) {
-  MediaSessionOptions opts = CreatePlanBMediaSessionOptions();
-  AddDataSection(cricket::DCT_RTP, cricket::MD_RECVONLY, &opts);
-  opts.crypto_options.enable_gcm_crypto_suites = true;
-  f1_.set_secure(SEC_ENABLED);
-  f2_.set_secure(SEC_ENABLED);
-  std::unique_ptr<SessionDescription> offer(f1_.CreateOffer(opts, NULL));
-  ASSERT_TRUE(offer.get() != NULL);
-  std::unique_ptr<SessionDescription> answer(
-      f2_.CreateAnswer(offer.get(), opts, NULL));
-  const ContentInfo* ac = answer->GetContentByName("audio");
-  const ContentInfo* dc = answer->GetContentByName("data");
-  ASSERT_TRUE(ac != NULL);
-  ASSERT_TRUE(dc != NULL);
-  EXPECT_EQ(std::string(NS_JINGLE_RTP), ac->type);
-  EXPECT_EQ(std::string(NS_JINGLE_RTP), dc->type);
-  const AudioContentDescription* acd =
-      static_cast<const AudioContentDescription*>(ac->description);
-  const DataContentDescription* dcd =
-      static_cast<const DataContentDescription*>(dc->description);
-  EXPECT_EQ(MEDIA_TYPE_AUDIO, acd->type());
-  EXPECT_EQ(MAKE_VECTOR(kAudioCodecsAnswer), acd->codecs());
-  EXPECT_EQ(kAutoBandwidth, acd->bandwidth());  // negotiated auto bw
-  EXPECT_EQ(0U, acd->first_ssrc());             // no sender is attached
-  EXPECT_TRUE(acd->rtcp_mux());                 // negotiated rtcp-mux
-  ASSERT_CRYPTO(acd, 1U, CS_AEAD_AES_256_GCM);
-  EXPECT_EQ(MEDIA_TYPE_DATA, dcd->type());
-  EXPECT_EQ(MAKE_VECTOR(kDataCodecsAnswer), dcd->codecs());
-  EXPECT_EQ(0U, dcd->first_ssrc());  // no sender is attached
-  EXPECT_TRUE(dcd->rtcp_mux());      // negotiated rtcp-mux
-  ASSERT_CRYPTO(dcd, 1U, CS_AEAD_AES_256_GCM);
-  EXPECT_EQ(std::string(cricket::kMediaProtocolSavpf), dcd->protocol());
-}
-
-// The use_sctpmap flag should be set in a DataContentDescription by default.
-// The answer's use_sctpmap flag should match the offer's.
-TEST_F(MediaSessionDescriptionFactoryTest, TestCreateDataAnswerUsesSctpmap) {
-  MediaSessionOptions opts;
-  AddDataSection(cricket::DCT_SCTP, cricket::MD_SENDRECV, &opts);
-  std::unique_ptr<SessionDescription> offer(f1_.CreateOffer(opts, NULL));
-  ASSERT_TRUE(offer.get() != NULL);
-  ContentInfo* dc_offer = offer->GetContentByName("data");
-  ASSERT_TRUE(dc_offer != NULL);
-  DataContentDescription* dcd_offer =
-      static_cast<DataContentDescription*>(dc_offer->description);
-  EXPECT_TRUE(dcd_offer->use_sctpmap());
-
-  std::unique_ptr<SessionDescription> answer(
-      f2_.CreateAnswer(offer.get(), opts, NULL));
-  const ContentInfo* dc_answer = answer->GetContentByName("data");
-  ASSERT_TRUE(dc_answer != NULL);
-  const DataContentDescription* dcd_answer =
-      static_cast<const DataContentDescription*>(dc_answer->description);
-  EXPECT_TRUE(dcd_answer->use_sctpmap());
-}
-
-// The answer's use_sctpmap flag should match the offer's.
-TEST_F(MediaSessionDescriptionFactoryTest, TestCreateDataAnswerWithoutSctpmap) {
-  MediaSessionOptions opts;
-  AddDataSection(cricket::DCT_SCTP, cricket::MD_SENDRECV, &opts);
-  std::unique_ptr<SessionDescription> offer(f1_.CreateOffer(opts, NULL));
-  ASSERT_TRUE(offer.get() != NULL);
-  ContentInfo* dc_offer = offer->GetContentByName("data");
-  ASSERT_TRUE(dc_offer != NULL);
-  DataContentDescription* dcd_offer =
-      static_cast<DataContentDescription*>(dc_offer->description);
-  dcd_offer->set_use_sctpmap(false);
-
-  std::unique_ptr<SessionDescription> answer(
-      f2_.CreateAnswer(offer.get(), opts, NULL));
-  const ContentInfo* dc_answer = answer->GetContentByName("data");
-  ASSERT_TRUE(dc_answer != NULL);
-  const DataContentDescription* dcd_answer =
-      static_cast<const DataContentDescription*>(dc_answer->description);
-  EXPECT_FALSE(dcd_answer->use_sctpmap());
-}
-
-// Test that a valid answer will be created for "DTLS/SCTP", "UDP/DTLS/SCTP"
-// and "TCP/DTLS/SCTP" offers.
-TEST_F(MediaSessionDescriptionFactoryTest,
-       TestCreateDataAnswerToDifferentOfferedProtos) {
-  // Need to enable DTLS offer/answer generation (disabled by default in this
-  // test).
-  f1_.set_secure(SEC_ENABLED);
-  f2_.set_secure(SEC_ENABLED);
-  tdf1_.set_secure(SEC_ENABLED);
-  tdf2_.set_secure(SEC_ENABLED);
-
-  MediaSessionOptions opts;
-  AddDataSection(cricket::DCT_SCTP, cricket::MD_SENDRECV, &opts);
-  std::unique_ptr<SessionDescription> offer(f1_.CreateOffer(opts, nullptr));
-  ASSERT_TRUE(offer.get() != nullptr);
-  ContentInfo* dc_offer = offer->GetContentByName("data");
-  ASSERT_TRUE(dc_offer != nullptr);
-  DataContentDescription* dcd_offer =
-      static_cast<DataContentDescription*>(dc_offer->description);
-
-  std::vector<std::string> protos = {"DTLS/SCTP", "UDP/DTLS/SCTP",
-                                     "TCP/DTLS/SCTP"};
-  for (const std::string& proto : protos) {
-    dcd_offer->set_protocol(proto);
-    std::unique_ptr<SessionDescription> answer(
-        f2_.CreateAnswer(offer.get(), opts, nullptr));
-    const ContentInfo* dc_answer = answer->GetContentByName("data");
-    ASSERT_TRUE(dc_answer != nullptr);
-    const DataContentDescription* dcd_answer =
-        static_cast<const DataContentDescription*>(dc_answer->description);
-    EXPECT_FALSE(dc_answer->rejected);
-    EXPECT_EQ(proto, dcd_answer->protocol());
-  }
-}
-
-// Verifies that the order of the media contents in the offer is preserved in
-// the answer.
-TEST_F(MediaSessionDescriptionFactoryTest, TestCreateAnswerContentOrder) {
-  MediaSessionOptions opts;
-
-  // Creates a data only offer.
-  AddDataSection(cricket::DCT_SCTP, cricket::MD_SENDRECV, &opts);
-  std::unique_ptr<SessionDescription> offer1(f1_.CreateOffer(opts, NULL));
-  ASSERT_TRUE(offer1.get() != NULL);
-
-  // Appends audio to the offer.
-  AddMediaSection(MEDIA_TYPE_AUDIO, "audio", cricket::MD_RECVONLY, kActive,
-                  &opts);
-  std::unique_ptr<SessionDescription> offer2(
-      f1_.CreateOffer(opts, offer1.get()));
-  ASSERT_TRUE(offer2.get() != NULL);
-
-  // Appends video to the offer.
-  AddMediaSection(MEDIA_TYPE_VIDEO, "video", cricket::MD_RECVONLY, kActive,
-                  &opts);
-  std::unique_ptr<SessionDescription> offer3(
-      f1_.CreateOffer(opts, offer2.get()));
-  ASSERT_TRUE(offer3.get() != NULL);
-
-  std::unique_ptr<SessionDescription> answer(
-      f2_.CreateAnswer(offer3.get(), opts, NULL));
-  ASSERT_TRUE(answer.get() != NULL);
-  EXPECT_EQ(3u, answer->contents().size());
-  EXPECT_TRUE(IsMediaContentOfType(&answer->contents()[0], MEDIA_TYPE_DATA));
-  EXPECT_TRUE(IsMediaContentOfType(&answer->contents()[1], MEDIA_TYPE_AUDIO));
-  EXPECT_TRUE(IsMediaContentOfType(&answer->contents()[2], MEDIA_TYPE_VIDEO));
-}
-
-// TODO(deadbeef): Extend these tests to ensure the correct direction with other
-// answerer settings.
-
-// This test that the media direction is set to send/receive in an answer if
-// the offer is send receive.
-TEST_F(MediaSessionDescriptionFactoryTest, CreateAnswerToSendReceiveOffer) {
-  TestMediaDirectionInAnswer(cricket::MD_SENDRECV, cricket::MD_SENDRECV);
-}
-
-// This test that the media direction is set to receive only in an answer if
-// the offer is send only.
-TEST_F(MediaSessionDescriptionFactoryTest, CreateAnswerToSendOnlyOffer) {
-  TestMediaDirectionInAnswer(cricket::MD_SENDONLY, cricket::MD_RECVONLY);
-}
-
-// This test that the media direction is set to send only in an answer if
-// the offer is recv only.
-TEST_F(MediaSessionDescriptionFactoryTest, CreateAnswerToRecvOnlyOffer) {
-  TestMediaDirectionInAnswer(cricket::MD_RECVONLY, cricket::MD_SENDONLY);
-}
-
-// This test that the media direction is set to inactive in an answer if
-// the offer is inactive.
-TEST_F(MediaSessionDescriptionFactoryTest, CreateAnswerToInactiveOffer) {
-  TestMediaDirectionInAnswer(cricket::MD_INACTIVE, cricket::MD_INACTIVE);
-}
-
-// Test that a data content with an unknown protocol is rejected in an answer.
-TEST_F(MediaSessionDescriptionFactoryTest,
-       CreateDataAnswerToOfferWithUnknownProtocol) {
-  MediaSessionOptions opts;
-  AddDataSection(cricket::DCT_RTP, cricket::MD_RECVONLY, &opts);
-  f1_.set_secure(SEC_ENABLED);
-  f2_.set_secure(SEC_ENABLED);
-  std::unique_ptr<SessionDescription> offer(f1_.CreateOffer(opts, NULL));
-  ContentInfo* dc_offer = offer->GetContentByName("data");
-  ASSERT_TRUE(dc_offer != NULL);
-  DataContentDescription* dcd_offer =
-      static_cast<DataContentDescription*>(dc_offer->description);
-  ASSERT_TRUE(dcd_offer != NULL);
-  std::string protocol = "a weird unknown protocol";
-  dcd_offer->set_protocol(protocol);
-
-  std::unique_ptr<SessionDescription> answer(
-      f2_.CreateAnswer(offer.get(), opts, NULL));
-
-  const ContentInfo* dc_answer = answer->GetContentByName("data");
-  ASSERT_TRUE(dc_answer != NULL);
-  EXPECT_TRUE(dc_answer->rejected);
-  const DataContentDescription* dcd_answer =
-      static_cast<const DataContentDescription*>(dc_answer->description);
-  ASSERT_TRUE(dcd_answer != NULL);
-  EXPECT_EQ(protocol, dcd_answer->protocol());
-}
-
-// Test that the media protocol is RTP/AVPF if DTLS and SDES are disabled.
-TEST_F(MediaSessionDescriptionFactoryTest, AudioOfferAnswerWithCryptoDisabled) {
-  MediaSessionOptions opts = CreatePlanBMediaSessionOptions();
-  f1_.set_secure(SEC_DISABLED);
-  f2_.set_secure(SEC_DISABLED);
-  tdf1_.set_secure(SEC_DISABLED);
-  tdf2_.set_secure(SEC_DISABLED);
-
-  std::unique_ptr<SessionDescription> offer(f1_.CreateOffer(opts, NULL));
-  const AudioContentDescription* offer_acd =
-      GetFirstAudioContentDescription(offer.get());
-  ASSERT_TRUE(offer_acd != NULL);
-  EXPECT_EQ(std::string(cricket::kMediaProtocolAvpf), offer_acd->protocol());
-
-  std::unique_ptr<SessionDescription> answer(
-      f2_.CreateAnswer(offer.get(), opts, NULL));
-
-  const ContentInfo* ac_answer = answer->GetContentByName("audio");
-  ASSERT_TRUE(ac_answer != NULL);
-  EXPECT_FALSE(ac_answer->rejected);
-
-  const AudioContentDescription* answer_acd =
-      GetFirstAudioContentDescription(answer.get());
-  ASSERT_TRUE(answer_acd != NULL);
-  EXPECT_EQ(std::string(cricket::kMediaProtocolAvpf), answer_acd->protocol());
-}
-
-// Create a video offer and answer and ensure the RTP header extensions
-// matches what we expect.
-TEST_F(MediaSessionDescriptionFactoryTest, TestOfferAnswerWithRtpExtensions) {
-  MediaSessionOptions opts;
-  AddAudioVideoSections(cricket::MD_RECVONLY, &opts);
-  f1_.set_audio_rtp_header_extensions(MAKE_VECTOR(kAudioRtpExtension1));
-  f1_.set_video_rtp_header_extensions(MAKE_VECTOR(kVideoRtpExtension1));
-  f2_.set_audio_rtp_header_extensions(MAKE_VECTOR(kAudioRtpExtension2));
-  f2_.set_video_rtp_header_extensions(MAKE_VECTOR(kVideoRtpExtension2));
-
-  std::unique_ptr<SessionDescription> offer(f1_.CreateOffer(opts, NULL));
-  ASSERT_TRUE(offer.get() != NULL);
-  std::unique_ptr<SessionDescription> answer(
-      f2_.CreateAnswer(offer.get(), opts, NULL));
-
-  EXPECT_EQ(MAKE_VECTOR(kAudioRtpExtension1),
-            GetFirstAudioContentDescription(
-                offer.get())->rtp_header_extensions());
-  EXPECT_EQ(MAKE_VECTOR(kVideoRtpExtension1),
-            GetFirstVideoContentDescription(
-                offer.get())->rtp_header_extensions());
-  EXPECT_EQ(MAKE_VECTOR(kAudioRtpExtensionAnswer),
-            GetFirstAudioContentDescription(
-                answer.get())->rtp_header_extensions());
-  EXPECT_EQ(MAKE_VECTOR(kVideoRtpExtensionAnswer),
-            GetFirstVideoContentDescription(
-                answer.get())->rtp_header_extensions());
-}
-
-TEST_F(MediaSessionDescriptionFactoryTest,
-    TestOfferAnswerWithEncryptedRtpExtensionsBoth) {
-  MediaSessionOptions opts;
-  AddAudioVideoSections(cricket::MD_RECVONLY, &opts);
-
-  f1_.set_enable_encrypted_rtp_header_extensions(true);
-  f2_.set_enable_encrypted_rtp_header_extensions(true);
-
-  f1_.set_audio_rtp_header_extensions(
-      MAKE_VECTOR(kAudioRtpExtension1));
-  f1_.set_video_rtp_header_extensions(
-      MAKE_VECTOR(kVideoRtpExtension1));
-  f2_.set_audio_rtp_header_extensions(
-      MAKE_VECTOR(kAudioRtpExtension2));
-  f2_.set_video_rtp_header_extensions(
-      MAKE_VECTOR(kVideoRtpExtension2));
-
-  std::unique_ptr<SessionDescription> offer(f1_.CreateOffer(opts, NULL));
-  ASSERT_TRUE(offer.get() != NULL);
-  std::unique_ptr<SessionDescription> answer(
-      f2_.CreateAnswer(offer.get(), opts, NULL));
-
-  EXPECT_EQ(MAKE_VECTOR(kAudioRtpExtensionEncrypted1),
-            GetFirstAudioContentDescription(
-                offer.get())->rtp_header_extensions());
-  EXPECT_EQ(MAKE_VECTOR(kVideoRtpExtensionEncrypted1),
-            GetFirstVideoContentDescription(
-                offer.get())->rtp_header_extensions());
-  EXPECT_EQ(MAKE_VECTOR(kAudioRtpExtensionEncryptedAnswer),
-            GetFirstAudioContentDescription(
-                answer.get())->rtp_header_extensions());
-  EXPECT_EQ(MAKE_VECTOR(kVideoRtpExtensionEncryptedAnswer),
-            GetFirstVideoContentDescription(
-                answer.get())->rtp_header_extensions());
-}
-
-TEST_F(MediaSessionDescriptionFactoryTest,
-    TestOfferAnswerWithEncryptedRtpExtensionsOffer) {
-  MediaSessionOptions opts;
-  AddAudioVideoSections(cricket::MD_RECVONLY, &opts);
-
-  f1_.set_enable_encrypted_rtp_header_extensions(true);
-
-  f1_.set_audio_rtp_header_extensions(
-      MAKE_VECTOR(kAudioRtpExtension1));
-  f1_.set_video_rtp_header_extensions(
-      MAKE_VECTOR(kVideoRtpExtension1));
-  f2_.set_audio_rtp_header_extensions(
-      MAKE_VECTOR(kAudioRtpExtension2));
-  f2_.set_video_rtp_header_extensions(
-      MAKE_VECTOR(kVideoRtpExtension2));
-
-  std::unique_ptr<SessionDescription> offer(f1_.CreateOffer(opts, NULL));
-  ASSERT_TRUE(offer.get() != NULL);
-  std::unique_ptr<SessionDescription> answer(
-      f2_.CreateAnswer(offer.get(), opts, NULL));
-
-  EXPECT_EQ(MAKE_VECTOR(kAudioRtpExtensionEncrypted1),
-            GetFirstAudioContentDescription(
-                offer.get())->rtp_header_extensions());
-  EXPECT_EQ(MAKE_VECTOR(kVideoRtpExtensionEncrypted1),
-            GetFirstVideoContentDescription(
-                offer.get())->rtp_header_extensions());
-  EXPECT_EQ(MAKE_VECTOR(kAudioRtpExtensionAnswer),
-            GetFirstAudioContentDescription(
-                answer.get())->rtp_header_extensions());
-  EXPECT_EQ(MAKE_VECTOR(kVideoRtpExtensionAnswer),
-            GetFirstVideoContentDescription(
-                answer.get())->rtp_header_extensions());
-}
-
-TEST_F(MediaSessionDescriptionFactoryTest,
-    TestOfferAnswerWithEncryptedRtpExtensionsAnswer) {
-  MediaSessionOptions opts;
-  AddAudioVideoSections(cricket::MD_RECVONLY, &opts);
-
-  f2_.set_enable_encrypted_rtp_header_extensions(true);
-
-  f1_.set_audio_rtp_header_extensions(
-      MAKE_VECTOR(kAudioRtpExtension1));
-  f1_.set_video_rtp_header_extensions(
-      MAKE_VECTOR(kVideoRtpExtension1));
-  f2_.set_audio_rtp_header_extensions(
-      MAKE_VECTOR(kAudioRtpExtension2));
-  f2_.set_video_rtp_header_extensions(
-      MAKE_VECTOR(kVideoRtpExtension2));
-
-  std::unique_ptr<SessionDescription> offer(f1_.CreateOffer(opts, NULL));
-  ASSERT_TRUE(offer.get() != NULL);
-  std::unique_ptr<SessionDescription> answer(
-      f2_.CreateAnswer(offer.get(), opts, NULL));
-
-  EXPECT_EQ(MAKE_VECTOR(kAudioRtpExtension1),
-            GetFirstAudioContentDescription(
-                offer.get())->rtp_header_extensions());
-  EXPECT_EQ(MAKE_VECTOR(kVideoRtpExtension1),
-            GetFirstVideoContentDescription(
-                offer.get())->rtp_header_extensions());
-  EXPECT_EQ(MAKE_VECTOR(kAudioRtpExtensionAnswer),
-            GetFirstAudioContentDescription(
-                answer.get())->rtp_header_extensions());
-  EXPECT_EQ(MAKE_VECTOR(kVideoRtpExtensionAnswer),
-            GetFirstVideoContentDescription(
-                answer.get())->rtp_header_extensions());
-}
-
-// Create an audio, video, data answer without legacy StreamParams.
-TEST_F(MediaSessionDescriptionFactoryTest,
-       TestCreateAnswerWithoutLegacyStreams) {
-  MediaSessionOptions opts;
-  AddAudioVideoSections(cricket::MD_RECVONLY, &opts);
-  AddDataSection(cricket::DCT_RTP, cricket::MD_RECVONLY, &opts);
-  std::unique_ptr<SessionDescription> offer(f1_.CreateOffer(opts, NULL));
-  ASSERT_TRUE(offer.get() != NULL);
-  std::unique_ptr<SessionDescription> answer(
-      f2_.CreateAnswer(offer.get(), opts, NULL));
-  const ContentInfo* ac = answer->GetContentByName("audio");
-  const ContentInfo* vc = answer->GetContentByName("video");
-  const ContentInfo* dc = answer->GetContentByName("data");
-  ASSERT_TRUE(ac != NULL);
-  ASSERT_TRUE(vc != NULL);
-  const AudioContentDescription* acd =
-      static_cast<const AudioContentDescription*>(ac->description);
-  const VideoContentDescription* vcd =
-      static_cast<const VideoContentDescription*>(vc->description);
-  const DataContentDescription* dcd =
-      static_cast<const DataContentDescription*>(dc->description);
-
-  EXPECT_FALSE(acd->has_ssrcs());  // No StreamParams.
-  EXPECT_FALSE(vcd->has_ssrcs());  // No StreamParams.
-  EXPECT_FALSE(dcd->has_ssrcs());  // No StreamParams.
-}
-
-TEST_F(MediaSessionDescriptionFactoryTest, TestPartial) {
-  MediaSessionOptions opts;
-  AddAudioVideoSections(cricket::MD_RECVONLY, &opts);
-  AddDataSection(cricket::DCT_RTP, cricket::MD_RECVONLY, &opts);
-  f1_.set_secure(SEC_ENABLED);
-  std::unique_ptr<SessionDescription> offer(f1_.CreateOffer(opts, NULL));
-  ASSERT_TRUE(offer.get() != NULL);
-  const ContentInfo* ac = offer->GetContentByName("audio");
-  const ContentInfo* vc = offer->GetContentByName("video");
-  const ContentInfo* dc = offer->GetContentByName("data");
-  AudioContentDescription* acd = const_cast<AudioContentDescription*>(
-      static_cast<const AudioContentDescription*>(ac->description));
-  VideoContentDescription* vcd = const_cast<VideoContentDescription*>(
-      static_cast<const VideoContentDescription*>(vc->description));
-  DataContentDescription* dcd = const_cast<DataContentDescription*>(
-      static_cast<const DataContentDescription*>(dc->description));
-
-  EXPECT_FALSE(acd->partial());  // default is false.
-  acd->set_partial(true);
-  EXPECT_TRUE(acd->partial());
-  acd->set_partial(false);
-  EXPECT_FALSE(acd->partial());
-
-  EXPECT_FALSE(vcd->partial());  // default is false.
-  vcd->set_partial(true);
-  EXPECT_TRUE(vcd->partial());
-  vcd->set_partial(false);
-  EXPECT_FALSE(vcd->partial());
-
-  EXPECT_FALSE(dcd->partial());  // default is false.
-  dcd->set_partial(true);
-  EXPECT_TRUE(dcd->partial());
-  dcd->set_partial(false);
-  EXPECT_FALSE(dcd->partial());
-}
-
-// Create a typical video answer, and ensure it matches what we expect.
-TEST_F(MediaSessionDescriptionFactoryTest, TestCreateVideoAnswerRtcpMux) {
-  MediaSessionOptions offer_opts;
-  AddAudioVideoSections(cricket::MD_SENDRECV, &offer_opts);
-  AddDataSection(cricket::DCT_RTP, cricket::MD_SENDRECV, &offer_opts);
-
-  MediaSessionOptions answer_opts;
-  AddAudioVideoSections(cricket::MD_SENDRECV, &answer_opts);
-  AddDataSection(cricket::DCT_RTP, cricket::MD_SENDRECV, &answer_opts);
-
-  std::unique_ptr<SessionDescription> offer;
-  std::unique_ptr<SessionDescription> answer;
-
-  offer_opts.rtcp_mux_enabled = true;
-  answer_opts.rtcp_mux_enabled = true;
-  offer.reset(f1_.CreateOffer(offer_opts, NULL));
-  answer.reset(f2_.CreateAnswer(offer.get(), answer_opts, NULL));
-  ASSERT_TRUE(NULL != GetFirstAudioContentDescription(offer.get()));
-  ASSERT_TRUE(NULL != GetFirstVideoContentDescription(offer.get()));
-  ASSERT_TRUE(NULL != GetFirstDataContentDescription(offer.get()));
-  ASSERT_TRUE(NULL != GetFirstAudioContentDescription(answer.get()));
-  ASSERT_TRUE(NULL != GetFirstVideoContentDescription(answer.get()));
-  ASSERT_TRUE(NULL != GetFirstDataContentDescription(answer.get()));
-  EXPECT_TRUE(GetFirstAudioContentDescription(offer.get())->rtcp_mux());
-  EXPECT_TRUE(GetFirstVideoContentDescription(offer.get())->rtcp_mux());
-  EXPECT_TRUE(GetFirstDataContentDescription(offer.get())->rtcp_mux());
-  EXPECT_TRUE(GetFirstAudioContentDescription(answer.get())->rtcp_mux());
-  EXPECT_TRUE(GetFirstVideoContentDescription(answer.get())->rtcp_mux());
-  EXPECT_TRUE(GetFirstDataContentDescription(answer.get())->rtcp_mux());
-
-  offer_opts.rtcp_mux_enabled = true;
-  answer_opts.rtcp_mux_enabled = false;
-  offer.reset(f1_.CreateOffer(offer_opts, NULL));
-  answer.reset(f2_.CreateAnswer(offer.get(), answer_opts, NULL));
-  ASSERT_TRUE(NULL != GetFirstAudioContentDescription(offer.get()));
-  ASSERT_TRUE(NULL != GetFirstVideoContentDescription(offer.get()));
-  ASSERT_TRUE(NULL != GetFirstDataContentDescription(offer.get()));
-  ASSERT_TRUE(NULL != GetFirstAudioContentDescription(answer.get()));
-  ASSERT_TRUE(NULL != GetFirstVideoContentDescription(answer.get()));
-  ASSERT_TRUE(NULL != GetFirstDataContentDescription(answer.get()));
-  EXPECT_TRUE(GetFirstAudioContentDescription(offer.get())->rtcp_mux());
-  EXPECT_TRUE(GetFirstVideoContentDescription(offer.get())->rtcp_mux());
-  EXPECT_TRUE(GetFirstDataContentDescription(offer.get())->rtcp_mux());
-  EXPECT_FALSE(GetFirstAudioContentDescription(answer.get())->rtcp_mux());
-  EXPECT_FALSE(GetFirstVideoContentDescription(answer.get())->rtcp_mux());
-  EXPECT_FALSE(GetFirstDataContentDescription(answer.get())->rtcp_mux());
-
-  offer_opts.rtcp_mux_enabled = false;
-  answer_opts.rtcp_mux_enabled = true;
-  offer.reset(f1_.CreateOffer(offer_opts, NULL));
-  answer.reset(f2_.CreateAnswer(offer.get(), answer_opts, NULL));
-  ASSERT_TRUE(NULL != GetFirstAudioContentDescription(offer.get()));
-  ASSERT_TRUE(NULL != GetFirstVideoContentDescription(offer.get()));
-  ASSERT_TRUE(NULL != GetFirstDataContentDescription(offer.get()));
-  ASSERT_TRUE(NULL != GetFirstAudioContentDescription(answer.get()));
-  ASSERT_TRUE(NULL != GetFirstVideoContentDescription(answer.get()));
-  ASSERT_TRUE(NULL != GetFirstDataContentDescription(answer.get()));
-  EXPECT_FALSE(GetFirstAudioContentDescription(offer.get())->rtcp_mux());
-  EXPECT_FALSE(GetFirstVideoContentDescription(offer.get())->rtcp_mux());
-  EXPECT_FALSE(GetFirstDataContentDescription(offer.get())->rtcp_mux());
-  EXPECT_FALSE(GetFirstAudioContentDescription(answer.get())->rtcp_mux());
-  EXPECT_FALSE(GetFirstVideoContentDescription(answer.get())->rtcp_mux());
-  EXPECT_FALSE(GetFirstDataContentDescription(answer.get())->rtcp_mux());
-
-  offer_opts.rtcp_mux_enabled = false;
-  answer_opts.rtcp_mux_enabled = false;
-  offer.reset(f1_.CreateOffer(offer_opts, NULL));
-  answer.reset(f2_.CreateAnswer(offer.get(), answer_opts, NULL));
-  ASSERT_TRUE(NULL != GetFirstAudioContentDescription(offer.get()));
-  ASSERT_TRUE(NULL != GetFirstVideoContentDescription(offer.get()));
-  ASSERT_TRUE(NULL != GetFirstDataContentDescription(offer.get()));
-  ASSERT_TRUE(NULL != GetFirstAudioContentDescription(answer.get()));
-  ASSERT_TRUE(NULL != GetFirstVideoContentDescription(answer.get()));
-  ASSERT_TRUE(NULL != GetFirstDataContentDescription(answer.get()));
-  EXPECT_FALSE(GetFirstAudioContentDescription(offer.get())->rtcp_mux());
-  EXPECT_FALSE(GetFirstVideoContentDescription(offer.get())->rtcp_mux());
-  EXPECT_FALSE(GetFirstDataContentDescription(offer.get())->rtcp_mux());
-  EXPECT_FALSE(GetFirstAudioContentDescription(answer.get())->rtcp_mux());
-  EXPECT_FALSE(GetFirstVideoContentDescription(answer.get())->rtcp_mux());
-  EXPECT_FALSE(GetFirstDataContentDescription(answer.get())->rtcp_mux());
-}
-
-// Create an audio-only answer to a video offer.
-TEST_F(MediaSessionDescriptionFactoryTest, TestCreateAudioAnswerToVideo) {
-  MediaSessionOptions opts;
-  AddMediaSection(MEDIA_TYPE_AUDIO, "audio", cricket::MD_RECVONLY, kActive,
-                  &opts);
-  AddMediaSection(MEDIA_TYPE_VIDEO, "video", cricket::MD_RECVONLY, kActive,
-                  &opts);
-  std::unique_ptr<SessionDescription> offer(f1_.CreateOffer(opts, NULL));
-  ASSERT_TRUE(offer.get() != NULL);
-
-  opts.media_description_options[1].stopped = true;
-  std::unique_ptr<SessionDescription> answer(
-      f2_.CreateAnswer(offer.get(), opts, NULL));
-  const ContentInfo* ac = answer->GetContentByName("audio");
-  const ContentInfo* vc = answer->GetContentByName("video");
-  ASSERT_TRUE(ac != NULL);
-  ASSERT_TRUE(vc != NULL);
-  ASSERT_TRUE(vc->description != NULL);
-  EXPECT_TRUE(vc->rejected);
-}
-
-// Create an audio-only answer to an offer with data.
-TEST_F(MediaSessionDescriptionFactoryTest, TestCreateNoDataAnswerToDataOffer) {
-  MediaSessionOptions opts = CreatePlanBMediaSessionOptions();
-  opts.data_channel_type = cricket::DCT_RTP;
-  AddMediaSection(MEDIA_TYPE_DATA, "data", cricket::MD_RECVONLY, kActive,
-                  &opts);
-  std::unique_ptr<SessionDescription> offer(f1_.CreateOffer(opts, NULL));
-  ASSERT_TRUE(offer.get() != NULL);
-
-  opts.media_description_options[1].stopped = true;
-  std::unique_ptr<SessionDescription> answer(
-      f2_.CreateAnswer(offer.get(), opts, NULL));
-  const ContentInfo* ac = answer->GetContentByName("audio");
-  const ContentInfo* dc = answer->GetContentByName("data");
-  ASSERT_TRUE(ac != NULL);
-  ASSERT_TRUE(dc != NULL);
-  ASSERT_TRUE(dc->description != NULL);
-  EXPECT_TRUE(dc->rejected);
-}
-
-// Create an answer that rejects the contents which are rejected in the offer.
-TEST_F(MediaSessionDescriptionFactoryTest,
-       CreateAnswerToOfferWithRejectedMedia) {
-  MediaSessionOptions opts;
-  AddAudioVideoSections(cricket::MD_RECVONLY, &opts);
-  AddDataSection(cricket::DCT_RTP, cricket::MD_RECVONLY, &opts);
-  std::unique_ptr<SessionDescription> offer(f1_.CreateOffer(opts, NULL));
-  ASSERT_TRUE(offer.get() != NULL);
-  ContentInfo* ac = offer->GetContentByName("audio");
-  ContentInfo* vc = offer->GetContentByName("video");
-  ContentInfo* dc = offer->GetContentByName("data");
-  ASSERT_TRUE(ac != NULL);
-  ASSERT_TRUE(vc != NULL);
-  ASSERT_TRUE(dc != NULL);
-  ac->rejected = true;
-  vc->rejected = true;
-  dc->rejected = true;
-  std::unique_ptr<SessionDescription> answer(
-      f2_.CreateAnswer(offer.get(), opts, NULL));
-  ac = answer->GetContentByName("audio");
-  vc = answer->GetContentByName("video");
-  dc = answer->GetContentByName("data");
-  ASSERT_TRUE(ac != NULL);
-  ASSERT_TRUE(vc != NULL);
-  ASSERT_TRUE(dc != NULL);
-  EXPECT_TRUE(ac->rejected);
-  EXPECT_TRUE(vc->rejected);
-  EXPECT_TRUE(dc->rejected);
-}
-
-// Create an audio and video offer with:
-// - one video track
-// - two audio tracks
-// - two data tracks
-// and ensure it matches what we expect. Also updates the initial offer by
-// adding a new video track and replaces one of the audio tracks.
-TEST_F(MediaSessionDescriptionFactoryTest, TestCreateMultiStreamVideoOffer) {
-  MediaSessionOptions opts;
-  AddAudioVideoSections(cricket::MD_SENDRECV, &opts);
-  AttachSenderToMediaSection("video", MEDIA_TYPE_VIDEO, kVideoTrack1,
-                             {kMediaStream1}, 1, &opts);
-  AttachSenderToMediaSection("audio", MEDIA_TYPE_AUDIO, kAudioTrack1,
-                             {kMediaStream1}, 1, &opts);
-  AttachSenderToMediaSection("audio", MEDIA_TYPE_AUDIO, kAudioTrack2,
-                             {kMediaStream1}, 1, &opts);
-
-  AddDataSection(cricket::DCT_RTP, cricket::MD_SENDRECV, &opts);
-  AttachSenderToMediaSection("data", MEDIA_TYPE_DATA, kDataTrack1,
-                             {kMediaStream1}, 1, &opts);
-  AttachSenderToMediaSection("data", MEDIA_TYPE_DATA, kDataTrack2,
-                             {kMediaStream1}, 1, &opts);
-
-  f1_.set_secure(SEC_ENABLED);
-  std::unique_ptr<SessionDescription> offer(f1_.CreateOffer(opts, NULL));
-
-  ASSERT_TRUE(offer.get() != NULL);
-  const ContentInfo* ac = offer->GetContentByName("audio");
-  const ContentInfo* vc = offer->GetContentByName("video");
-  const ContentInfo* dc = offer->GetContentByName("data");
-  ASSERT_TRUE(ac != NULL);
-  ASSERT_TRUE(vc != NULL);
-  ASSERT_TRUE(dc != NULL);
-  const AudioContentDescription* acd =
-      static_cast<const AudioContentDescription*>(ac->description);
-  const VideoContentDescription* vcd =
-      static_cast<const VideoContentDescription*>(vc->description);
-  const DataContentDescription* dcd =
-      static_cast<const DataContentDescription*>(dc->description);
-  EXPECT_EQ(MEDIA_TYPE_AUDIO, acd->type());
-  EXPECT_EQ(f1_.audio_sendrecv_codecs(), acd->codecs());
-
-  const StreamParamsVec& audio_streams = acd->streams();
-  ASSERT_EQ(2U, audio_streams.size());
-  EXPECT_EQ(audio_streams[0].cname , audio_streams[1].cname);
-  EXPECT_EQ(kAudioTrack1, audio_streams[0].id);
-  ASSERT_EQ(1U, audio_streams[0].ssrcs.size());
-  EXPECT_NE(0U, audio_streams[0].ssrcs[0]);
-  EXPECT_EQ(kAudioTrack2, audio_streams[1].id);
-  ASSERT_EQ(1U, audio_streams[1].ssrcs.size());
-  EXPECT_NE(0U, audio_streams[1].ssrcs[0]);
-
-  EXPECT_EQ(kAutoBandwidth, acd->bandwidth());  // default bandwidth (auto)
-  EXPECT_TRUE(acd->rtcp_mux());                 // rtcp-mux defaults on
-  ASSERT_CRYPTO(acd, 2U, CS_AES_CM_128_HMAC_SHA1_32);
-
-  EXPECT_EQ(MEDIA_TYPE_VIDEO, vcd->type());
-  EXPECT_EQ(f1_.video_codecs(), vcd->codecs());
-  ASSERT_CRYPTO(vcd, 1U, CS_AES_CM_128_HMAC_SHA1_80);
-
-  const StreamParamsVec& video_streams = vcd->streams();
-  ASSERT_EQ(1U, video_streams.size());
-  EXPECT_EQ(video_streams[0].cname, audio_streams[0].cname);
-  EXPECT_EQ(kVideoTrack1, video_streams[0].id);
-  EXPECT_EQ(kAutoBandwidth, vcd->bandwidth());  // default bandwidth (auto)
-  EXPECT_TRUE(vcd->rtcp_mux());                 // rtcp-mux defaults on
-
-  EXPECT_EQ(MEDIA_TYPE_DATA, dcd->type());
-  EXPECT_EQ(f1_.data_codecs(), dcd->codecs());
-  ASSERT_CRYPTO(dcd, 1U, CS_AES_CM_128_HMAC_SHA1_80);
-
-  const StreamParamsVec& data_streams = dcd->streams();
-  ASSERT_EQ(2U, data_streams.size());
-  EXPECT_EQ(data_streams[0].cname , data_streams[1].cname);
-  EXPECT_EQ(kDataTrack1, data_streams[0].id);
-  ASSERT_EQ(1U, data_streams[0].ssrcs.size());
-  EXPECT_NE(0U, data_streams[0].ssrcs[0]);
-  EXPECT_EQ(kDataTrack2, data_streams[1].id);
-  ASSERT_EQ(1U, data_streams[1].ssrcs.size());
-  EXPECT_NE(0U, data_streams[1].ssrcs[0]);
-
-  EXPECT_EQ(cricket::kDataMaxBandwidth,
-            dcd->bandwidth());                  // default bandwidth (auto)
-  EXPECT_TRUE(dcd->rtcp_mux());                 // rtcp-mux defaults on
-  ASSERT_CRYPTO(dcd, 1U, CS_AES_CM_128_HMAC_SHA1_80);
-
-  // Update the offer. Add a new video track that is not synched to the
-  // other tracks and replace audio track 2 with audio track 3.
-  AttachSenderToMediaSection("video", MEDIA_TYPE_VIDEO, kVideoTrack2,
-                             {kMediaStream2}, 1, &opts);
-  DetachSenderFromMediaSection("audio", kAudioTrack2, &opts);
-  AttachSenderToMediaSection("audio", MEDIA_TYPE_AUDIO, kAudioTrack3,
-                             {kMediaStream1}, 1, &opts);
-  DetachSenderFromMediaSection("data", kDataTrack2, &opts);
-  AttachSenderToMediaSection("data", MEDIA_TYPE_DATA, kDataTrack3,
-                             {kMediaStream1}, 1, &opts);
-  std::unique_ptr<SessionDescription> updated_offer(
-      f1_.CreateOffer(opts, offer.get()));
-
-  ASSERT_TRUE(updated_offer.get() != NULL);
-  ac = updated_offer->GetContentByName("audio");
-  vc = updated_offer->GetContentByName("video");
-  dc = updated_offer->GetContentByName("data");
-  ASSERT_TRUE(ac != NULL);
-  ASSERT_TRUE(vc != NULL);
-  ASSERT_TRUE(dc != NULL);
-  const AudioContentDescription* updated_acd =
-      static_cast<const AudioContentDescription*>(ac->description);
-  const VideoContentDescription* updated_vcd =
-      static_cast<const VideoContentDescription*>(vc->description);
-  const DataContentDescription* updated_dcd =
-      static_cast<const DataContentDescription*>(dc->description);
-
-  EXPECT_EQ(acd->type(), updated_acd->type());
-  EXPECT_EQ(acd->codecs(), updated_acd->codecs());
-  EXPECT_EQ(vcd->type(), updated_vcd->type());
-  EXPECT_EQ(vcd->codecs(), updated_vcd->codecs());
-  EXPECT_EQ(dcd->type(), updated_dcd->type());
-  EXPECT_EQ(dcd->codecs(), updated_dcd->codecs());
-  ASSERT_CRYPTO(updated_acd, 2U, CS_AES_CM_128_HMAC_SHA1_32);
-  EXPECT_TRUE(CompareCryptoParams(acd->cryptos(), updated_acd->cryptos()));
-  ASSERT_CRYPTO(updated_vcd, 1U, CS_AES_CM_128_HMAC_SHA1_80);
-  EXPECT_TRUE(CompareCryptoParams(vcd->cryptos(), updated_vcd->cryptos()));
-  ASSERT_CRYPTO(updated_dcd, 1U, CS_AES_CM_128_HMAC_SHA1_80);
-  EXPECT_TRUE(CompareCryptoParams(dcd->cryptos(), updated_dcd->cryptos()));
-
-  const StreamParamsVec& updated_audio_streams = updated_acd->streams();
-  ASSERT_EQ(2U, updated_audio_streams.size());
-  EXPECT_EQ(audio_streams[0], updated_audio_streams[0]);
-  EXPECT_EQ(kAudioTrack3, updated_audio_streams[1].id);  // New audio track.
-  ASSERT_EQ(1U, updated_audio_streams[1].ssrcs.size());
-  EXPECT_NE(0U, updated_audio_streams[1].ssrcs[0]);
-  EXPECT_EQ(updated_audio_streams[0].cname, updated_audio_streams[1].cname);
-
-  const StreamParamsVec& updated_video_streams = updated_vcd->streams();
-  ASSERT_EQ(2U, updated_video_streams.size());
-  EXPECT_EQ(video_streams[0], updated_video_streams[0]);
-  EXPECT_EQ(kVideoTrack2, updated_video_streams[1].id);
-  // All the media streams in one PeerConnection share one RTCP CNAME.
-  EXPECT_EQ(updated_video_streams[1].cname, updated_video_streams[0].cname);
-
-  const StreamParamsVec& updated_data_streams = updated_dcd->streams();
-  ASSERT_EQ(2U, updated_data_streams.size());
-  EXPECT_EQ(data_streams[0], updated_data_streams[0]);
-  EXPECT_EQ(kDataTrack3, updated_data_streams[1].id);  // New data track.
-  ASSERT_EQ(1U, updated_data_streams[1].ssrcs.size());
-  EXPECT_NE(0U, updated_data_streams[1].ssrcs[0]);
-  EXPECT_EQ(updated_data_streams[0].cname, updated_data_streams[1].cname);
-  // The stream correctly got the CNAME from the MediaSessionOptions.
-  // The Expected RTCP CNAME is the default one as we are using the default
-  // MediaSessionOptions.
-  EXPECT_EQ(updated_data_streams[0].cname, cricket::kDefaultRtcpCname);
-}
-
-// Create an offer with simulcast video stream.
-TEST_F(MediaSessionDescriptionFactoryTest, TestCreateSimulcastVideoOffer) {
-  MediaSessionOptions opts;
-  AddMediaSection(MEDIA_TYPE_AUDIO, "audio", cricket::MD_RECVONLY, kActive,
-                  &opts);
-  AddMediaSection(MEDIA_TYPE_VIDEO, "video", cricket::MD_SENDRECV, kActive,
-                  &opts);
-  const int num_sim_layers = 3;
-  AttachSenderToMediaSection("video", MEDIA_TYPE_VIDEO, kVideoTrack1,
-                             {kMediaStream1}, num_sim_layers, &opts);
-  std::unique_ptr<SessionDescription> offer(f1_.CreateOffer(opts, NULL));
-
-  ASSERT_TRUE(offer.get() != NULL);
-  const ContentInfo* vc = offer->GetContentByName("video");
-  ASSERT_TRUE(vc != NULL);
-  const VideoContentDescription* vcd =
-      static_cast<const VideoContentDescription*>(vc->description);
-
-  const StreamParamsVec& video_streams = vcd->streams();
-  ASSERT_EQ(1U, video_streams.size());
-  EXPECT_EQ(kVideoTrack1, video_streams[0].id);
-  const SsrcGroup* sim_ssrc_group =
-      video_streams[0].get_ssrc_group(cricket::kSimSsrcGroupSemantics);
-  ASSERT_TRUE(sim_ssrc_group != NULL);
-  EXPECT_EQ(static_cast<size_t>(num_sim_layers), sim_ssrc_group->ssrcs.size());
-}
-
-// Create an audio and video answer to a standard video offer with:
-// - one video track
-// - two audio tracks
-// - two data tracks
-// and ensure it matches what we expect. Also updates the initial answer by
-// adding a new video track and removes one of the audio tracks.
-TEST_F(MediaSessionDescriptionFactoryTest, TestCreateMultiStreamVideoAnswer) {
-  MediaSessionOptions offer_opts;
-  AddMediaSection(MEDIA_TYPE_AUDIO, "audio", cricket::MD_RECVONLY, kActive,
-                  &offer_opts);
-  AddMediaSection(MEDIA_TYPE_VIDEO, "video", cricket::MD_RECVONLY, kActive,
-                  &offer_opts);
-  offer_opts.data_channel_type = cricket::DCT_RTP;
-  AddMediaSection(MEDIA_TYPE_DATA, "data", cricket::MD_RECVONLY, kActive,
-                  &offer_opts);
-  f1_.set_secure(SEC_ENABLED);
-  f2_.set_secure(SEC_ENABLED);
-  std::unique_ptr<SessionDescription> offer(f1_.CreateOffer(offer_opts, NULL));
-
-  MediaSessionOptions answer_opts;
-  AddMediaSection(MEDIA_TYPE_AUDIO, "audio", cricket::MD_SENDRECV, kActive,
-                  &answer_opts);
-  AddMediaSection(MEDIA_TYPE_VIDEO, "video", cricket::MD_SENDRECV, kActive,
-                  &answer_opts);
-  AttachSenderToMediaSection("video", MEDIA_TYPE_VIDEO, kVideoTrack1,
-                             {kMediaStream1}, 1, &answer_opts);
-  AttachSenderToMediaSection("audio", MEDIA_TYPE_AUDIO, kAudioTrack1,
-                             {kMediaStream1}, 1, &answer_opts);
-  AttachSenderToMediaSection("audio", MEDIA_TYPE_AUDIO, kAudioTrack2,
-                             {kMediaStream1}, 1, &answer_opts);
-
-  AddMediaSection(MEDIA_TYPE_DATA, "data", cricket::MD_SENDRECV, kActive,
-                  &answer_opts);
-  AttachSenderToMediaSection("data", MEDIA_TYPE_DATA, kDataTrack1,
-                             {kMediaStream1}, 1, &answer_opts);
-  AttachSenderToMediaSection("data", MEDIA_TYPE_DATA, kDataTrack2,
-                             {kMediaStream1}, 1, &answer_opts);
-  answer_opts.data_channel_type = cricket::DCT_RTP;
-
-  std::unique_ptr<SessionDescription> answer(
-      f2_.CreateAnswer(offer.get(), answer_opts, NULL));
-
-  ASSERT_TRUE(answer.get() != NULL);
-  const ContentInfo* ac = answer->GetContentByName("audio");
-  const ContentInfo* vc = answer->GetContentByName("video");
-  const ContentInfo* dc = answer->GetContentByName("data");
-  ASSERT_TRUE(ac != NULL);
-  ASSERT_TRUE(vc != NULL);
-  ASSERT_TRUE(dc != NULL);
-  const AudioContentDescription* acd =
-      static_cast<const AudioContentDescription*>(ac->description);
-  const VideoContentDescription* vcd =
-      static_cast<const VideoContentDescription*>(vc->description);
-  const DataContentDescription* dcd =
-      static_cast<const DataContentDescription*>(dc->description);
-  ASSERT_CRYPTO(acd, 1U, CS_AES_CM_128_HMAC_SHA1_32);
-  ASSERT_CRYPTO(vcd, 1U, CS_AES_CM_128_HMAC_SHA1_80);
-  ASSERT_CRYPTO(dcd, 1U, CS_AES_CM_128_HMAC_SHA1_80);
-
-  EXPECT_EQ(MEDIA_TYPE_AUDIO, acd->type());
-  EXPECT_EQ(MAKE_VECTOR(kAudioCodecsAnswer), acd->codecs());
-
-  const StreamParamsVec& audio_streams = acd->streams();
-  ASSERT_EQ(2U, audio_streams.size());
-  EXPECT_TRUE(audio_streams[0].cname ==  audio_streams[1].cname);
-  EXPECT_EQ(kAudioTrack1, audio_streams[0].id);
-  ASSERT_EQ(1U, audio_streams[0].ssrcs.size());
-  EXPECT_NE(0U, audio_streams[0].ssrcs[0]);
-  EXPECT_EQ(kAudioTrack2, audio_streams[1].id);
-  ASSERT_EQ(1U, audio_streams[1].ssrcs.size());
-  EXPECT_NE(0U, audio_streams[1].ssrcs[0]);
-
-  EXPECT_EQ(kAutoBandwidth, acd->bandwidth());  // default bandwidth (auto)
-  EXPECT_TRUE(acd->rtcp_mux());                 // rtcp-mux defaults on
-
-  EXPECT_EQ(MEDIA_TYPE_VIDEO, vcd->type());
-  EXPECT_EQ(MAKE_VECTOR(kVideoCodecsAnswer), vcd->codecs());
-
-  const StreamParamsVec& video_streams = vcd->streams();
-  ASSERT_EQ(1U, video_streams.size());
-  EXPECT_EQ(video_streams[0].cname, audio_streams[0].cname);
-  EXPECT_EQ(kVideoTrack1, video_streams[0].id);
-  EXPECT_EQ(kAutoBandwidth, vcd->bandwidth());  // default bandwidth (auto)
-  EXPECT_TRUE(vcd->rtcp_mux());                 // rtcp-mux defaults on
-
-  EXPECT_EQ(MEDIA_TYPE_DATA, dcd->type());
-  EXPECT_EQ(MAKE_VECTOR(kDataCodecsAnswer), dcd->codecs());
-
-  const StreamParamsVec& data_streams = dcd->streams();
-  ASSERT_EQ(2U, data_streams.size());
-  EXPECT_TRUE(data_streams[0].cname ==  data_streams[1].cname);
-  EXPECT_EQ(kDataTrack1, data_streams[0].id);
-  ASSERT_EQ(1U, data_streams[0].ssrcs.size());
-  EXPECT_NE(0U, data_streams[0].ssrcs[0]);
-  EXPECT_EQ(kDataTrack2, data_streams[1].id);
-  ASSERT_EQ(1U, data_streams[1].ssrcs.size());
-  EXPECT_NE(0U, data_streams[1].ssrcs[0]);
-
-  EXPECT_EQ(cricket::kDataMaxBandwidth,
-            dcd->bandwidth());                  // default bandwidth (auto)
-  EXPECT_TRUE(dcd->rtcp_mux());                 // rtcp-mux defaults on
-
-  // Update the answer. Add a new video track that is not synched to the
-  // other tracks and remove 1 audio track.
-  AttachSenderToMediaSection("video", MEDIA_TYPE_VIDEO, kVideoTrack2,
-                             {kMediaStream2}, 1, &answer_opts);
-  DetachSenderFromMediaSection("audio", kAudioTrack2, &answer_opts);
-  DetachSenderFromMediaSection("data", kDataTrack2, &answer_opts);
-  std::unique_ptr<SessionDescription> updated_answer(
-      f2_.CreateAnswer(offer.get(), answer_opts, answer.get()));
-
-  ASSERT_TRUE(updated_answer.get() != NULL);
-  ac = updated_answer->GetContentByName("audio");
-  vc = updated_answer->GetContentByName("video");
-  dc = updated_answer->GetContentByName("data");
-  ASSERT_TRUE(ac != NULL);
-  ASSERT_TRUE(vc != NULL);
-  ASSERT_TRUE(dc != NULL);
-  const AudioContentDescription* updated_acd =
-      static_cast<const AudioContentDescription*>(ac->description);
-  const VideoContentDescription* updated_vcd =
-      static_cast<const VideoContentDescription*>(vc->description);
-  const DataContentDescription* updated_dcd =
-      static_cast<const DataContentDescription*>(dc->description);
-
-  ASSERT_CRYPTO(updated_acd, 1U, CS_AES_CM_128_HMAC_SHA1_32);
-  EXPECT_TRUE(CompareCryptoParams(acd->cryptos(), updated_acd->cryptos()));
-  ASSERT_CRYPTO(updated_vcd, 1U, CS_AES_CM_128_HMAC_SHA1_80);
-  EXPECT_TRUE(CompareCryptoParams(vcd->cryptos(), updated_vcd->cryptos()));
-  ASSERT_CRYPTO(updated_dcd, 1U, CS_AES_CM_128_HMAC_SHA1_80);
-  EXPECT_TRUE(CompareCryptoParams(dcd->cryptos(), updated_dcd->cryptos()));
-
-  EXPECT_EQ(acd->type(), updated_acd->type());
-  EXPECT_EQ(acd->codecs(), updated_acd->codecs());
-  EXPECT_EQ(vcd->type(), updated_vcd->type());
-  EXPECT_EQ(vcd->codecs(), updated_vcd->codecs());
-  EXPECT_EQ(dcd->type(), updated_dcd->type());
-  EXPECT_EQ(dcd->codecs(), updated_dcd->codecs());
-
-  const StreamParamsVec& updated_audio_streams = updated_acd->streams();
-  ASSERT_EQ(1U, updated_audio_streams.size());
-  EXPECT_TRUE(audio_streams[0] ==  updated_audio_streams[0]);
-
-  const StreamParamsVec& updated_video_streams = updated_vcd->streams();
-  ASSERT_EQ(2U, updated_video_streams.size());
-  EXPECT_EQ(video_streams[0], updated_video_streams[0]);
-  EXPECT_EQ(kVideoTrack2, updated_video_streams[1].id);
-  // All media streams in one PeerConnection share one CNAME.
-  EXPECT_EQ(updated_video_streams[1].cname, updated_video_streams[0].cname);
-
-  const StreamParamsVec& updated_data_streams = updated_dcd->streams();
-  ASSERT_EQ(1U, updated_data_streams.size());
-  EXPECT_TRUE(data_streams[0] == updated_data_streams[0]);
-}
-
-// Create an updated offer after creating an answer to the original offer and
-// verify that the codecs that were part of the original answer are not changed
-// in the updated offer.
-TEST_F(MediaSessionDescriptionFactoryTest,
-       RespondentCreatesOfferAfterCreatingAnswer) {
-  MediaSessionOptions opts;
-  AddAudioVideoSections(cricket::MD_RECVONLY, &opts);
-
-  std::unique_ptr<SessionDescription> offer(f1_.CreateOffer(opts, NULL));
-  std::unique_ptr<SessionDescription> answer(
-      f2_.CreateAnswer(offer.get(), opts, NULL));
-
-  const AudioContentDescription* acd =
-      GetFirstAudioContentDescription(answer.get());
-  EXPECT_EQ(MAKE_VECTOR(kAudioCodecsAnswer), acd->codecs());
-
-  const VideoContentDescription* vcd =
-      GetFirstVideoContentDescription(answer.get());
-  EXPECT_EQ(MAKE_VECTOR(kVideoCodecsAnswer), vcd->codecs());
-
-  std::unique_ptr<SessionDescription> updated_offer(
-      f2_.CreateOffer(opts, answer.get()));
-
-  // The expected audio codecs are the common audio codecs from the first
-  // offer/answer exchange plus the audio codecs only |f2_| offer, sorted in
-  // preference order.
-  // TODO(wu): |updated_offer| should not include the codec
-  // (i.e. |kAudioCodecs2[0]|) the other side doesn't support.
-  const AudioCodec kUpdatedAudioCodecOffer[] = {
-    kAudioCodecsAnswer[0],
-    kAudioCodecsAnswer[1],
-    kAudioCodecs2[0],
-  };
-
-  // The expected video codecs are the common video codecs from the first
-  // offer/answer exchange plus the video codecs only |f2_| offer, sorted in
-  // preference order.
-  const VideoCodec kUpdatedVideoCodecOffer[] = {
-    kVideoCodecsAnswer[0],
-    kVideoCodecs2[1],
-  };
-
-  const AudioContentDescription* updated_acd =
-      GetFirstAudioContentDescription(updated_offer.get());
-  EXPECT_EQ(MAKE_VECTOR(kUpdatedAudioCodecOffer), updated_acd->codecs());
-
-  const VideoContentDescription* updated_vcd =
-      GetFirstVideoContentDescription(updated_offer.get());
-  EXPECT_EQ(MAKE_VECTOR(kUpdatedVideoCodecOffer), updated_vcd->codecs());
-}
-
-// Create an updated offer after creating an answer to the original offer and
-// verify that the codecs that were part of the original answer are not changed
-// in the updated offer. In this test Rtx is enabled.
-TEST_F(MediaSessionDescriptionFactoryTest,
-       RespondentCreatesOfferAfterCreatingAnswerWithRtx) {
-  MediaSessionOptions opts;
-  AddMediaSection(MEDIA_TYPE_VIDEO, "video", cricket::MD_RECVONLY, kActive,
-                  &opts);
-  std::vector<VideoCodec> f1_codecs = MAKE_VECTOR(kVideoCodecs1);
-  // This creates rtx for H264 with the payload type |f1_| uses.
-  AddRtxCodec(VideoCodec::CreateRtxCodec(126, kVideoCodecs1[1].id), &f1_codecs);
-  f1_.set_video_codecs(f1_codecs);
-
-  std::vector<VideoCodec> f2_codecs = MAKE_VECTOR(kVideoCodecs2);
-  // This creates rtx for H264 with the payload type |f2_| uses.
-  AddRtxCodec(VideoCodec::CreateRtxCodec(125, kVideoCodecs2[0].id), &f2_codecs);
-  f2_.set_video_codecs(f2_codecs);
-
-  std::unique_ptr<SessionDescription> offer(f1_.CreateOffer(opts, NULL));
-  ASSERT_TRUE(offer.get() != NULL);
-  std::unique_ptr<SessionDescription> answer(
-      f2_.CreateAnswer(offer.get(), opts, NULL));
-
-  const VideoContentDescription* vcd =
-      GetFirstVideoContentDescription(answer.get());
-
-  std::vector<VideoCodec> expected_codecs = MAKE_VECTOR(kVideoCodecsAnswer);
-  AddRtxCodec(VideoCodec::CreateRtxCodec(126, kVideoCodecs1[1].id),
-              &expected_codecs);
-
-  EXPECT_EQ(expected_codecs, vcd->codecs());
-
-  // Now, make sure we get same result (except for the order) if |f2_| creates
-  // an updated offer even though the default payload types between |f1_| and
-  // |f2_| are different.
-  std::unique_ptr<SessionDescription> updated_offer(
-      f2_.CreateOffer(opts, answer.get()));
-  ASSERT_TRUE(updated_offer);
-  std::unique_ptr<SessionDescription> updated_answer(
-      f1_.CreateAnswer(updated_offer.get(), opts, answer.get()));
-
-  const VideoContentDescription* updated_vcd =
-      GetFirstVideoContentDescription(updated_answer.get());
-
-  EXPECT_EQ(expected_codecs, updated_vcd->codecs());
-}
-
-// Create an updated offer that adds video after creating an audio only answer
-// to the original offer. This test verifies that if a video codec and the RTX
-// codec have the same default payload type as an audio codec that is already in
-// use, the added codecs payload types are changed.
-TEST_F(MediaSessionDescriptionFactoryTest,
-       RespondentCreatesOfferWithVideoAndRtxAfterCreatingAudioAnswer) {
-  std::vector<VideoCodec> f1_codecs = MAKE_VECTOR(kVideoCodecs1);
-  // This creates rtx for H264 with the payload type |f1_| uses.
-  AddRtxCodec(VideoCodec::CreateRtxCodec(126, kVideoCodecs1[1].id), &f1_codecs);
-  f1_.set_video_codecs(f1_codecs);
-
-  MediaSessionOptions opts;
-  AddMediaSection(MEDIA_TYPE_AUDIO, "audio", cricket::MD_RECVONLY, kActive,
-                  &opts);
-
-  std::unique_ptr<SessionDescription> offer(f1_.CreateOffer(opts, NULL));
-  std::unique_ptr<SessionDescription> answer(
-      f2_.CreateAnswer(offer.get(), opts, NULL));
-
-  const AudioContentDescription* acd =
-      GetFirstAudioContentDescription(answer.get());
-  EXPECT_EQ(MAKE_VECTOR(kAudioCodecsAnswer), acd->codecs());
-
-  // Now - let |f2_| add video with RTX and let the payload type the RTX codec
-  // reference  be the same as an audio codec that was negotiated in the
-  // first offer/answer exchange.
-  opts.media_description_options.clear();
-  AddAudioVideoSections(cricket::MD_RECVONLY, &opts);
-
-  std::vector<VideoCodec> f2_codecs = MAKE_VECTOR(kVideoCodecs2);
-  int used_pl_type = acd->codecs()[0].id;
-  f2_codecs[0].id = used_pl_type;  // Set the payload type for H264.
-  AddRtxCodec(VideoCodec::CreateRtxCodec(125, used_pl_type), &f2_codecs);
-  f2_.set_video_codecs(f2_codecs);
-
-  std::unique_ptr<SessionDescription> updated_offer(
-      f2_.CreateOffer(opts, answer.get()));
-  ASSERT_TRUE(updated_offer);
-  std::unique_ptr<SessionDescription> updated_answer(
-      f1_.CreateAnswer(updated_offer.get(), opts, answer.get()));
-
-  const AudioContentDescription* updated_acd =
-      GetFirstAudioContentDescription(answer.get());
-  EXPECT_EQ(MAKE_VECTOR(kAudioCodecsAnswer), updated_acd->codecs());
-
-  const VideoContentDescription* updated_vcd =
-      GetFirstVideoContentDescription(updated_answer.get());
-
-  ASSERT_EQ("H264", updated_vcd->codecs()[0].name);
-  ASSERT_EQ(std::string(cricket::kRtxCodecName), updated_vcd->codecs()[1].name);
-  int new_h264_pl_type =  updated_vcd->codecs()[0].id;
-  EXPECT_NE(used_pl_type, new_h264_pl_type);
-  VideoCodec rtx = updated_vcd->codecs()[1];
-  int pt_referenced_by_rtx = rtc::FromString<int>(
-      rtx.params[cricket::kCodecParamAssociatedPayloadType]);
-  EXPECT_EQ(new_h264_pl_type, pt_referenced_by_rtx);
-}
-
-// Create an updated offer with RTX after creating an answer to an offer
-// without RTX, and with different default payload types.
-// Verify that the added RTX codec references the correct payload type.
-TEST_F(MediaSessionDescriptionFactoryTest,
-       RespondentCreatesOfferWithRtxAfterCreatingAnswerWithoutRtx) {
-  MediaSessionOptions opts;
-  AddAudioVideoSections(cricket::MD_RECVONLY, &opts);
-
-  std::vector<VideoCodec> f2_codecs = MAKE_VECTOR(kVideoCodecs2);
-  // This creates rtx for H264 with the payload type |f2_| uses.
-  AddRtxCodec(VideoCodec::CreateRtxCodec(125, kVideoCodecs2[0].id), &f2_codecs);
-  f2_.set_video_codecs(f2_codecs);
-
-  std::unique_ptr<SessionDescription> offer(f1_.CreateOffer(opts, nullptr));
-  ASSERT_TRUE(offer.get() != nullptr);
-  std::unique_ptr<SessionDescription> answer(
-      f2_.CreateAnswer(offer.get(), opts, nullptr));
-
-  const VideoContentDescription* vcd =
-      GetFirstVideoContentDescription(answer.get());
-
-  std::vector<VideoCodec> expected_codecs = MAKE_VECTOR(kVideoCodecsAnswer);
-  EXPECT_EQ(expected_codecs, vcd->codecs());
-
-  // Now, ensure that the RTX codec is created correctly when |f2_| creates an
-  // updated offer, even though the default payload types are different from
-  // those of |f1_|.
-  std::unique_ptr<SessionDescription> updated_offer(
-      f2_.CreateOffer(opts, answer.get()));
-  ASSERT_TRUE(updated_offer);
-
-  const VideoContentDescription* updated_vcd =
-      GetFirstVideoContentDescription(updated_offer.get());
-
-  // New offer should attempt to add H263, and RTX for H264.
-  expected_codecs.push_back(kVideoCodecs2[1]);
-  AddRtxCodec(VideoCodec::CreateRtxCodec(125, kVideoCodecs1[1].id),
-              &expected_codecs);
-  EXPECT_EQ(expected_codecs, updated_vcd->codecs());
-}
-
-// Test that RTX is ignored when there is no associated payload type parameter.
-TEST_F(MediaSessionDescriptionFactoryTest, RtxWithoutApt) {
-  MediaSessionOptions opts;
-  AddMediaSection(MEDIA_TYPE_VIDEO, "video", cricket::MD_RECVONLY, kActive,
-                  &opts);
-  std::vector<VideoCodec> f1_codecs = MAKE_VECTOR(kVideoCodecs1);
-  // This creates RTX without associated payload type parameter.
-  AddRtxCodec(VideoCodec(126, cricket::kRtxCodecName), &f1_codecs);
-  f1_.set_video_codecs(f1_codecs);
-
-  std::vector<VideoCodec> f2_codecs = MAKE_VECTOR(kVideoCodecs2);
-  // This creates RTX for H264 with the payload type |f2_| uses.
-  AddRtxCodec(VideoCodec::CreateRtxCodec(125, kVideoCodecs2[0].id), &f2_codecs);
-  f2_.set_video_codecs(f2_codecs);
-
-  std::unique_ptr<SessionDescription> offer(f1_.CreateOffer(opts, NULL));
-  ASSERT_TRUE(offer.get() != NULL);
-  // kCodecParamAssociatedPayloadType will always be added to the offer when RTX
-  // is selected. Manually remove kCodecParamAssociatedPayloadType so that it
-  // is possible to test that that RTX is dropped when
-  // kCodecParamAssociatedPayloadType is missing in the offer.
-  VideoContentDescription* desc =
-      static_cast<cricket::VideoContentDescription*>(
-          offer->GetContentDescriptionByName(cricket::CN_VIDEO));
-  ASSERT_TRUE(desc != NULL);
-  std::vector<VideoCodec> codecs = desc->codecs();
-  for (std::vector<VideoCodec>::iterator iter = codecs.begin();
-       iter != codecs.end(); ++iter) {
-    if (iter->name.find(cricket::kRtxCodecName) == 0) {
-      iter->params.clear();
-    }
-  }
-  desc->set_codecs(codecs);
-
-  std::unique_ptr<SessionDescription> answer(
-      f2_.CreateAnswer(offer.get(), opts, NULL));
-
-  std::vector<std::string> codec_names =
-      GetCodecNames(GetFirstVideoContentDescription(answer.get())->codecs());
-  EXPECT_EQ(codec_names.end(), std::find(codec_names.begin(), codec_names.end(),
-                                         cricket::kRtxCodecName));
-}
-
-// Test that RTX will be filtered out in the answer if its associated payload
-// type doesn't match the local value.
-TEST_F(MediaSessionDescriptionFactoryTest, FilterOutRtxIfAptDoesntMatch) {
-  MediaSessionOptions opts;
-  AddMediaSection(MEDIA_TYPE_VIDEO, "video", cricket::MD_RECVONLY, kActive,
-                  &opts);
-  std::vector<VideoCodec> f1_codecs = MAKE_VECTOR(kVideoCodecs1);
-  // This creates RTX for H264 in sender.
-  AddRtxCodec(VideoCodec::CreateRtxCodec(126, kVideoCodecs1[1].id), &f1_codecs);
-  f1_.set_video_codecs(f1_codecs);
-
-  std::vector<VideoCodec> f2_codecs = MAKE_VECTOR(kVideoCodecs2);
-  // This creates RTX for H263 in receiver.
-  AddRtxCodec(VideoCodec::CreateRtxCodec(125, kVideoCodecs2[1].id), &f2_codecs);
-  f2_.set_video_codecs(f2_codecs);
-
-  std::unique_ptr<SessionDescription> offer(f1_.CreateOffer(opts, NULL));
-  ASSERT_TRUE(offer.get() != NULL);
-  // Associated payload type doesn't match, therefore, RTX codec is removed in
-  // the answer.
-  std::unique_ptr<SessionDescription> answer(
-      f2_.CreateAnswer(offer.get(), opts, NULL));
-
-  std::vector<std::string> codec_names =
-      GetCodecNames(GetFirstVideoContentDescription(answer.get())->codecs());
-  EXPECT_EQ(codec_names.end(), std::find(codec_names.begin(), codec_names.end(),
-                                         cricket::kRtxCodecName));
-}
-
-// Test that when multiple RTX codecs are offered, only the matched RTX codec
-// is added in the answer, and the unsupported RTX codec is filtered out.
-TEST_F(MediaSessionDescriptionFactoryTest,
-       FilterOutUnsupportedRtxWhenCreatingAnswer) {
-  MediaSessionOptions opts;
-  AddMediaSection(MEDIA_TYPE_VIDEO, "video", cricket::MD_RECVONLY, kActive,
-                  &opts);
-  std::vector<VideoCodec> f1_codecs = MAKE_VECTOR(kVideoCodecs1);
-  // This creates RTX for H264-SVC in sender.
-  AddRtxCodec(VideoCodec::CreateRtxCodec(125, kVideoCodecs1[0].id), &f1_codecs);
-  f1_.set_video_codecs(f1_codecs);
-
-  // This creates RTX for H264 in sender.
-  AddRtxCodec(VideoCodec::CreateRtxCodec(126, kVideoCodecs1[1].id), &f1_codecs);
-  f1_.set_video_codecs(f1_codecs);
-
-  std::vector<VideoCodec> f2_codecs = MAKE_VECTOR(kVideoCodecs2);
-  // This creates RTX for H264 in receiver.
-  AddRtxCodec(VideoCodec::CreateRtxCodec(124, kVideoCodecs2[0].id), &f2_codecs);
-  f2_.set_video_codecs(f2_codecs);
-
-  // H264-SVC codec is removed in the answer, therefore, associated RTX codec
-  // for H264-SVC should also be removed.
-  std::unique_ptr<SessionDescription> offer(f1_.CreateOffer(opts, NULL));
-  ASSERT_TRUE(offer.get() != NULL);
-  std::unique_ptr<SessionDescription> answer(
-      f2_.CreateAnswer(offer.get(), opts, NULL));
-  const VideoContentDescription* vcd =
-      GetFirstVideoContentDescription(answer.get());
-  std::vector<VideoCodec> expected_codecs = MAKE_VECTOR(kVideoCodecsAnswer);
-  AddRtxCodec(VideoCodec::CreateRtxCodec(126, kVideoCodecs1[1].id),
-              &expected_codecs);
-
-  EXPECT_EQ(expected_codecs, vcd->codecs());
-}
-
-// Test that after one RTX codec has been negotiated, a new offer can attempt
-// to add another.
-TEST_F(MediaSessionDescriptionFactoryTest, AddSecondRtxInNewOffer) {
-  MediaSessionOptions opts;
-  AddMediaSection(MEDIA_TYPE_VIDEO, "video", cricket::MD_RECVONLY, kActive,
-                  &opts);
-  std::vector<VideoCodec> f1_codecs = MAKE_VECTOR(kVideoCodecs1);
-  // This creates RTX for H264 for the offerer.
-  AddRtxCodec(VideoCodec::CreateRtxCodec(126, kVideoCodecs1[1].id), &f1_codecs);
-  f1_.set_video_codecs(f1_codecs);
-
-  std::unique_ptr<SessionDescription> offer(f1_.CreateOffer(opts, nullptr));
-  ASSERT_TRUE(offer);
-  const VideoContentDescription* vcd =
-      GetFirstVideoContentDescription(offer.get());
-
-  std::vector<VideoCodec> expected_codecs = MAKE_VECTOR(kVideoCodecs1);
-  AddRtxCodec(VideoCodec::CreateRtxCodec(126, kVideoCodecs1[1].id),
-              &expected_codecs);
-  EXPECT_EQ(expected_codecs, vcd->codecs());
-
-  // Now, attempt to add RTX for H264-SVC.
-  AddRtxCodec(VideoCodec::CreateRtxCodec(125, kVideoCodecs1[0].id), &f1_codecs);
-  f1_.set_video_codecs(f1_codecs);
-
-  std::unique_ptr<SessionDescription> updated_offer(
-      f1_.CreateOffer(opts, offer.get()));
-  ASSERT_TRUE(updated_offer);
-  vcd = GetFirstVideoContentDescription(updated_offer.get());
-
-  AddRtxCodec(VideoCodec::CreateRtxCodec(125, kVideoCodecs1[0].id),
-              &expected_codecs);
-  EXPECT_EQ(expected_codecs, vcd->codecs());
-}
-
-// Test that when RTX is used in conjunction with simulcast, an RTX ssrc is
-// generated for each simulcast ssrc and correctly grouped.
-TEST_F(MediaSessionDescriptionFactoryTest, SimSsrcsGenerateMultipleRtxSsrcs) {
-  MediaSessionOptions opts;
-  AddMediaSection(MEDIA_TYPE_VIDEO, "video", cricket::MD_SENDRECV, kActive,
-                  &opts);
-  // Add simulcast streams.
-  AttachSenderToMediaSection("video", MEDIA_TYPE_VIDEO, "stream1",
-                             {"stream1label"}, 3, &opts);
-
-  // Use a single real codec, and then add RTX for it.
-  std::vector<VideoCodec> f1_codecs;
-  f1_codecs.push_back(VideoCodec(97, "H264"));
-  AddRtxCodec(VideoCodec::CreateRtxCodec(125, 97), &f1_codecs);
-  f1_.set_video_codecs(f1_codecs);
-
-  // Ensure that the offer has an RTX ssrc for each regular ssrc, and that there
-  // is a FID ssrc + grouping for each.
-  std::unique_ptr<SessionDescription> offer(f1_.CreateOffer(opts, NULL));
-  ASSERT_TRUE(offer.get() != NULL);
-  VideoContentDescription* desc = static_cast<VideoContentDescription*>(
-      offer->GetContentDescriptionByName(cricket::CN_VIDEO));
-  ASSERT_TRUE(desc != NULL);
-  EXPECT_TRUE(desc->multistream());
-  const StreamParamsVec& streams = desc->streams();
-  // Single stream.
-  ASSERT_EQ(1u, streams.size());
-  // Stream should have 6 ssrcs: 3 for video, 3 for RTX.
-  EXPECT_EQ(6u, streams[0].ssrcs.size());
-  // And should have a SIM group for the simulcast.
-  EXPECT_TRUE(streams[0].has_ssrc_group("SIM"));
-  // And a FID group for RTX.
-  EXPECT_TRUE(streams[0].has_ssrc_group("FID"));
-  std::vector<uint32_t> primary_ssrcs;
-  streams[0].GetPrimarySsrcs(&primary_ssrcs);
-  EXPECT_EQ(3u, primary_ssrcs.size());
-  std::vector<uint32_t> fid_ssrcs;
-  streams[0].GetFidSsrcs(primary_ssrcs, &fid_ssrcs);
-  EXPECT_EQ(3u, fid_ssrcs.size());
-}
-
-// Test that, when the FlexFEC codec is added, a FlexFEC ssrc is created
-// together with a FEC-FR grouping.
-TEST_F(MediaSessionDescriptionFactoryTest, GenerateFlexfecSsrc) {
-  MediaSessionOptions opts;
-  AddMediaSection(MEDIA_TYPE_VIDEO, "video", cricket::MD_SENDRECV, kActive,
-                  &opts);
-  // Add single stream.
-  AttachSenderToMediaSection("video", MEDIA_TYPE_VIDEO, "stream1",
-                             {"stream1label"}, 1, &opts);
-
-  // Use a single real codec, and then add FlexFEC for it.
-  std::vector<VideoCodec> f1_codecs;
-  f1_codecs.push_back(VideoCodec(97, "H264"));
-  f1_codecs.push_back(VideoCodec(118, "flexfec-03"));
-  f1_.set_video_codecs(f1_codecs);
-
-  // Ensure that the offer has a single FlexFEC ssrc and that
-  // there is no FEC-FR ssrc + grouping for each.
-  std::unique_ptr<SessionDescription> offer(f1_.CreateOffer(opts, nullptr));
-  ASSERT_TRUE(offer.get() != nullptr);
-  VideoContentDescription* desc = static_cast<VideoContentDescription*>(
-      offer->GetContentDescriptionByName(cricket::CN_VIDEO));
-  ASSERT_TRUE(desc != nullptr);
-  EXPECT_TRUE(desc->multistream());
-  const StreamParamsVec& streams = desc->streams();
-  // Single stream.
-  ASSERT_EQ(1u, streams.size());
-  // Stream should have 2 ssrcs: 1 for video, 1 for FlexFEC.
-  EXPECT_EQ(2u, streams[0].ssrcs.size());
-  // And should have a FEC-FR group for FlexFEC.
-  EXPECT_TRUE(streams[0].has_ssrc_group("FEC-FR"));
-  std::vector<uint32_t> primary_ssrcs;
-  streams[0].GetPrimarySsrcs(&primary_ssrcs);
-  ASSERT_EQ(1u, primary_ssrcs.size());
-  uint32_t flexfec_ssrc;
-  EXPECT_TRUE(streams[0].GetFecFrSsrc(primary_ssrcs[0], &flexfec_ssrc));
-  EXPECT_NE(flexfec_ssrc, 0u);
-}
-
-// Test that FlexFEC is disabled for simulcast.
-// TODO(brandtr): Remove this test when we support simulcast, either through
-// multiple FlexfecSenders, or through multistream protection.
-TEST_F(MediaSessionDescriptionFactoryTest, SimSsrcsGenerateNoFlexfecSsrcs) {
-  MediaSessionOptions opts;
-  AddMediaSection(MEDIA_TYPE_VIDEO, "video", cricket::MD_SENDRECV, kActive,
-                  &opts);
-  // Add simulcast streams.
-  AttachSenderToMediaSection("video", MEDIA_TYPE_VIDEO, "stream1",
-                             {"stream1label"}, 3, &opts);
-
-  // Use a single real codec, and then add FlexFEC for it.
-  std::vector<VideoCodec> f1_codecs;
-  f1_codecs.push_back(VideoCodec(97, "H264"));
-  f1_codecs.push_back(VideoCodec(118, "flexfec-03"));
-  f1_.set_video_codecs(f1_codecs);
-
-  // Ensure that the offer has no FlexFEC ssrcs for each regular ssrc, and that
-  // there is no FEC-FR ssrc + grouping for each.
-  std::unique_ptr<SessionDescription> offer(f1_.CreateOffer(opts, nullptr));
-  ASSERT_TRUE(offer.get() != nullptr);
-  VideoContentDescription* desc = static_cast<VideoContentDescription*>(
-      offer->GetContentDescriptionByName(cricket::CN_VIDEO));
-  ASSERT_TRUE(desc != nullptr);
-  EXPECT_FALSE(desc->multistream());
-  const StreamParamsVec& streams = desc->streams();
-  // Single stream.
-  ASSERT_EQ(1u, streams.size());
-  // Stream should have 3 ssrcs: 3 for video, 0 for FlexFEC.
-  EXPECT_EQ(3u, streams[0].ssrcs.size());
-  // And should have a SIM group for the simulcast.
-  EXPECT_TRUE(streams[0].has_ssrc_group("SIM"));
-  // And not a FEC-FR group for FlexFEC.
-  EXPECT_FALSE(streams[0].has_ssrc_group("FEC-FR"));
-  std::vector<uint32_t> primary_ssrcs;
-  streams[0].GetPrimarySsrcs(&primary_ssrcs);
-  EXPECT_EQ(3u, primary_ssrcs.size());
-  for (uint32_t primary_ssrc : primary_ssrcs) {
-    uint32_t flexfec_ssrc;
-    EXPECT_FALSE(streams[0].GetFecFrSsrc(primary_ssrc, &flexfec_ssrc));
-  }
-}
-
-// Create an updated offer after creating an answer to the original offer and
-// verify that the RTP header extensions that were part of the original answer
-// are not changed in the updated offer.
-TEST_F(MediaSessionDescriptionFactoryTest,
-       RespondentCreatesOfferAfterCreatingAnswerWithRtpExtensions) {
-  MediaSessionOptions opts;
-  AddAudioVideoSections(cricket::MD_RECVONLY, &opts);
-
-  f1_.set_audio_rtp_header_extensions(MAKE_VECTOR(kAudioRtpExtension1));
-  f1_.set_video_rtp_header_extensions(MAKE_VECTOR(kVideoRtpExtension1));
-  f2_.set_audio_rtp_header_extensions(MAKE_VECTOR(kAudioRtpExtension2));
-  f2_.set_video_rtp_header_extensions(MAKE_VECTOR(kVideoRtpExtension2));
-
-  std::unique_ptr<SessionDescription> offer(f1_.CreateOffer(opts, NULL));
-  std::unique_ptr<SessionDescription> answer(
-      f2_.CreateAnswer(offer.get(), opts, NULL));
-
-  EXPECT_EQ(MAKE_VECTOR(kAudioRtpExtensionAnswer),
-            GetFirstAudioContentDescription(
-                answer.get())->rtp_header_extensions());
-  EXPECT_EQ(MAKE_VECTOR(kVideoRtpExtensionAnswer),
-            GetFirstVideoContentDescription(
-                answer.get())->rtp_header_extensions());
-
-  std::unique_ptr<SessionDescription> updated_offer(
-      f2_.CreateOffer(opts, answer.get()));
-
-  // The expected RTP header extensions in the new offer are the resulting
-  // extensions from the first offer/answer exchange plus the extensions only
-  // |f2_| offer.
-  // Since the default local extension id |f2_| uses has already been used by
-  // |f1_| for another extensions, it is changed to 13.
-  const RtpExtension kUpdatedAudioRtpExtensions[] = {
-      kAudioRtpExtensionAnswer[0], RtpExtension(kAudioRtpExtension2[1].uri, 13),
-      kAudioRtpExtension2[2],
-  };
-
-  // Since the default local extension id |f2_| uses has already been used by
-  // |f1_| for another extensions, is is changed to 12.
-  const RtpExtension kUpdatedVideoRtpExtensions[] = {
-      kVideoRtpExtensionAnswer[0], RtpExtension(kVideoRtpExtension2[1].uri, 12),
-      kVideoRtpExtension2[2],
-  };
-
-  const AudioContentDescription* updated_acd =
-      GetFirstAudioContentDescription(updated_offer.get());
-  EXPECT_EQ(MAKE_VECTOR(kUpdatedAudioRtpExtensions),
-            updated_acd->rtp_header_extensions());
-
-  const VideoContentDescription* updated_vcd =
-      GetFirstVideoContentDescription(updated_offer.get());
-  EXPECT_EQ(MAKE_VECTOR(kUpdatedVideoRtpExtensions),
-            updated_vcd->rtp_header_extensions());
-}
-
-// Verify that if the same RTP extension URI is used for audio and video, the
-// same ID is used. Also verify that the ID isn't changed when creating an
-// updated offer (this was previously a bug).
-TEST_F(MediaSessionDescriptionFactoryTest, RtpExtensionIdReused) {
-  MediaSessionOptions opts;
-  AddAudioVideoSections(cricket::MD_RECVONLY, &opts);
-
-  f1_.set_audio_rtp_header_extensions(MAKE_VECTOR(kAudioRtpExtension3));
-  f1_.set_video_rtp_header_extensions(MAKE_VECTOR(kVideoRtpExtension3));
-
-  std::unique_ptr<SessionDescription> offer(f1_.CreateOffer(opts, NULL));
-
-  // Since the audio extensions used ID 3 for "both_audio_and_video", so should
-  // the video extensions.
-  const RtpExtension kExpectedVideoRtpExtension[] = {
-      kVideoRtpExtension3[0], kAudioRtpExtension3[1],
-  };
-
-  EXPECT_EQ(MAKE_VECTOR(kAudioRtpExtension3),
-            GetFirstAudioContentDescription(
-                offer.get())->rtp_header_extensions());
-  EXPECT_EQ(MAKE_VECTOR(kExpectedVideoRtpExtension),
-            GetFirstVideoContentDescription(
-                offer.get())->rtp_header_extensions());
-
-  // Nothing should change when creating a new offer
-  std::unique_ptr<SessionDescription> updated_offer(
-      f1_.CreateOffer(opts, offer.get()));
-
-  EXPECT_EQ(MAKE_VECTOR(kAudioRtpExtension3),
-            GetFirstAudioContentDescription(
-                updated_offer.get())->rtp_header_extensions());
-  EXPECT_EQ(MAKE_VECTOR(kExpectedVideoRtpExtension),
-            GetFirstVideoContentDescription(
-                updated_offer.get())->rtp_header_extensions());
-}
-
-// Same as "RtpExtensionIdReused" above for encrypted RTP extensions.
-TEST_F(MediaSessionDescriptionFactoryTest, RtpExtensionIdReusedEncrypted) {
-  MediaSessionOptions opts;
-  AddAudioVideoSections(cricket::MD_RECVONLY, &opts);
-
-  f1_.set_enable_encrypted_rtp_header_extensions(true);
-  f2_.set_enable_encrypted_rtp_header_extensions(true);
-
-  f1_.set_audio_rtp_header_extensions(
-      MAKE_VECTOR(kAudioRtpExtension3ForEncryption));
-  f1_.set_video_rtp_header_extensions(
-      MAKE_VECTOR(kVideoRtpExtension3ForEncryption));
-
-  std::unique_ptr<SessionDescription> offer(f1_.CreateOffer(opts, NULL));
-
-  // The extensions that are shared between audio and video should use the same
-  // id.
-  const RtpExtension kExpectedVideoRtpExtension[] = {
-      kVideoRtpExtension3ForEncryption[0],
-      kAudioRtpExtension3ForEncryptionOffer[1],
-      kAudioRtpExtension3ForEncryptionOffer[2],
-  };
-
-  EXPECT_EQ(MAKE_VECTOR(kAudioRtpExtension3ForEncryptionOffer),
-            GetFirstAudioContentDescription(
-                offer.get())->rtp_header_extensions());
-  EXPECT_EQ(MAKE_VECTOR(kExpectedVideoRtpExtension),
-            GetFirstVideoContentDescription(
-                offer.get())->rtp_header_extensions());
-
-  // Nothing should change when creating a new offer
-  std::unique_ptr<SessionDescription> updated_offer(
-      f1_.CreateOffer(opts, offer.get()));
-
-  EXPECT_EQ(MAKE_VECTOR(kAudioRtpExtension3ForEncryptionOffer),
-            GetFirstAudioContentDescription(
-                updated_offer.get())->rtp_header_extensions());
-  EXPECT_EQ(MAKE_VECTOR(kExpectedVideoRtpExtension),
-            GetFirstVideoContentDescription(
-                updated_offer.get())->rtp_header_extensions());
-}
-
-TEST(MediaSessionDescription, CopySessionDescription) {
-  SessionDescription source;
-  cricket::ContentGroup group(cricket::CN_AUDIO);
-  source.AddGroup(group);
-  AudioContentDescription* acd(new AudioContentDescription());
-  acd->set_codecs(MAKE_VECTOR(kAudioCodecs1));
-  acd->AddLegacyStream(1);
-  source.AddContent(cricket::CN_AUDIO, cricket::NS_JINGLE_RTP, acd);
-  VideoContentDescription* vcd(new VideoContentDescription());
-  vcd->set_codecs(MAKE_VECTOR(kVideoCodecs1));
-  vcd->AddLegacyStream(2);
-  source.AddContent(cricket::CN_VIDEO, cricket::NS_JINGLE_RTP, vcd);
-
-  std::unique_ptr<SessionDescription> copy(source.Copy());
-  ASSERT_TRUE(copy.get() != NULL);
-  EXPECT_TRUE(copy->HasGroup(cricket::CN_AUDIO));
-  const ContentInfo* ac = copy->GetContentByName("audio");
-  const ContentInfo* vc = copy->GetContentByName("video");
-  ASSERT_TRUE(ac != NULL);
-  ASSERT_TRUE(vc != NULL);
-  EXPECT_EQ(std::string(NS_JINGLE_RTP), ac->type);
-  const AudioContentDescription* acd_copy =
-      static_cast<const AudioContentDescription*>(ac->description);
-  EXPECT_EQ(acd->codecs(), acd_copy->codecs());
-  EXPECT_EQ(1u, acd->first_ssrc());
-
-  EXPECT_EQ(std::string(NS_JINGLE_RTP), vc->type);
-  const VideoContentDescription* vcd_copy =
-      static_cast<const VideoContentDescription*>(vc->description);
-  EXPECT_EQ(vcd->codecs(), vcd_copy->codecs());
-  EXPECT_EQ(2u, vcd->first_ssrc());
-}
-
-// The below TestTransportInfoXXX tests create different offers/answers, and
-// ensure the TransportInfo in the SessionDescription matches what we expect.
-TEST_F(MediaSessionDescriptionFactoryTest, TestTransportInfoOfferAudio) {
-  MediaSessionOptions options;
-  AddMediaSection(MEDIA_TYPE_AUDIO, "audio", cricket::MD_RECVONLY, kActive,
-                  &options);
-  TestTransportInfo(true, options, false);
-}
-
-TEST_F(MediaSessionDescriptionFactoryTest,
-       TestTransportInfoOfferIceRenomination) {
-  MediaSessionOptions options;
-  AddMediaSection(MEDIA_TYPE_AUDIO, "audio", cricket::MD_RECVONLY, kActive,
-                  &options);
-  options.media_description_options[0]
-      .transport_options.enable_ice_renomination = true;
-  TestTransportInfo(true, options, false);
-}
-
-TEST_F(MediaSessionDescriptionFactoryTest, TestTransportInfoOfferAudioCurrent) {
-  MediaSessionOptions options;
-  AddMediaSection(MEDIA_TYPE_AUDIO, "audio", cricket::MD_RECVONLY, kActive,
-                  &options);
-  TestTransportInfo(true, options, true);
-}
-
-TEST_F(MediaSessionDescriptionFactoryTest, TestTransportInfoOfferMultimedia) {
-  MediaSessionOptions options;
-  AddAudioVideoSections(cricket::MD_RECVONLY, &options);
-  AddDataSection(cricket::DCT_RTP, cricket::MD_RECVONLY, &options);
-  TestTransportInfo(true, options, false);
-}
-
-TEST_F(MediaSessionDescriptionFactoryTest,
-    TestTransportInfoOfferMultimediaCurrent) {
-  MediaSessionOptions options;
-  AddAudioVideoSections(cricket::MD_RECVONLY, &options);
-  AddDataSection(cricket::DCT_RTP, cricket::MD_RECVONLY, &options);
-  TestTransportInfo(true, options, true);
-}
-
-TEST_F(MediaSessionDescriptionFactoryTest, TestTransportInfoOfferBundle) {
-  MediaSessionOptions options;
-  AddAudioVideoSections(cricket::MD_RECVONLY, &options);
-  AddDataSection(cricket::DCT_RTP, cricket::MD_RECVONLY, &options);
-  options.bundle_enabled = true;
-  TestTransportInfo(true, options, false);
-}
-
-TEST_F(MediaSessionDescriptionFactoryTest,
-       TestTransportInfoOfferBundleCurrent) {
-  MediaSessionOptions options;
-  AddAudioVideoSections(cricket::MD_RECVONLY, &options);
-  AddDataSection(cricket::DCT_RTP, cricket::MD_RECVONLY, &options);
-  options.bundle_enabled = true;
-  TestTransportInfo(true, options, true);
-}
-
-TEST_F(MediaSessionDescriptionFactoryTest, TestTransportInfoAnswerAudio) {
-  MediaSessionOptions options;
-  AddMediaSection(MEDIA_TYPE_AUDIO, "audio", cricket::MD_RECVONLY, kActive,
-                  &options);
-  TestTransportInfo(false, options, false);
-}
-
-TEST_F(MediaSessionDescriptionFactoryTest,
-       TestTransportInfoAnswerIceRenomination) {
-  MediaSessionOptions options;
-  AddMediaSection(MEDIA_TYPE_AUDIO, "audio", cricket::MD_RECVONLY, kActive,
-                  &options);
-  options.media_description_options[0]
-      .transport_options.enable_ice_renomination = true;
-  TestTransportInfo(false, options, false);
-}
-
-TEST_F(MediaSessionDescriptionFactoryTest,
-       TestTransportInfoAnswerAudioCurrent) {
-  MediaSessionOptions options;
-  AddMediaSection(MEDIA_TYPE_AUDIO, "audio", cricket::MD_RECVONLY, kActive,
-                  &options);
-  TestTransportInfo(false, options, true);
-}
-
-TEST_F(MediaSessionDescriptionFactoryTest, TestTransportInfoAnswerMultimedia) {
-  MediaSessionOptions options;
-  AddAudioVideoSections(cricket::MD_RECVONLY, &options);
-  AddDataSection(cricket::DCT_RTP, cricket::MD_RECVONLY, &options);
-  TestTransportInfo(false, options, false);
-}
-
-TEST_F(MediaSessionDescriptionFactoryTest,
-    TestTransportInfoAnswerMultimediaCurrent) {
-  MediaSessionOptions options;
-  AddAudioVideoSections(cricket::MD_RECVONLY, &options);
-  AddDataSection(cricket::DCT_RTP, cricket::MD_RECVONLY, &options);
-  TestTransportInfo(false, options, true);
-}
-
-TEST_F(MediaSessionDescriptionFactoryTest, TestTransportInfoAnswerBundle) {
-  MediaSessionOptions options;
-  AddAudioVideoSections(cricket::MD_RECVONLY, &options);
-  AddDataSection(cricket::DCT_RTP, cricket::MD_RECVONLY, &options);
-  options.bundle_enabled = true;
-  TestTransportInfo(false, options, false);
-}
-
-TEST_F(MediaSessionDescriptionFactoryTest,
-    TestTransportInfoAnswerBundleCurrent) {
-  MediaSessionOptions options;
-  AddAudioVideoSections(cricket::MD_RECVONLY, &options);
-  AddDataSection(cricket::DCT_RTP, cricket::MD_RECVONLY, &options);
-  options.bundle_enabled = true;
-  TestTransportInfo(false, options, true);
-}
-
-// Create an offer with bundle enabled and verify the crypto parameters are
-// the common set of the available cryptos.
-TEST_F(MediaSessionDescriptionFactoryTest, TestCryptoWithOfferBundle) {
-  TestCryptoWithBundle(true);
-}
-
-// Create an answer with bundle enabled and verify the crypto parameters are
-// the common set of the available cryptos.
-TEST_F(MediaSessionDescriptionFactoryTest, TestCryptoWithAnswerBundle) {
-  TestCryptoWithBundle(false);
-}
-
-// Verifies that creating answer fails if the offer has UDP/TLS/RTP/SAVPF but
-// DTLS is not enabled locally.
-TEST_F(MediaSessionDescriptionFactoryTest,
-       TestOfferDtlsSavpfWithoutDtlsFailed) {
-  f1_.set_secure(SEC_ENABLED);
-  f2_.set_secure(SEC_ENABLED);
-  tdf1_.set_secure(SEC_DISABLED);
-  tdf2_.set_secure(SEC_DISABLED);
-
-  std::unique_ptr<SessionDescription> offer(
-      f1_.CreateOffer(CreatePlanBMediaSessionOptions(), NULL));
-  ASSERT_TRUE(offer.get() != NULL);
-  ContentInfo* offer_content = offer->GetContentByName("audio");
-  ASSERT_TRUE(offer_content != NULL);
-  AudioContentDescription* offer_audio_desc =
-      static_cast<AudioContentDescription*>(offer_content->description);
-  offer_audio_desc->set_protocol(cricket::kMediaProtocolDtlsSavpf);
-
-  std::unique_ptr<SessionDescription> answer(
-      f2_.CreateAnswer(offer.get(), CreatePlanBMediaSessionOptions(), NULL));
-  ASSERT_TRUE(answer != NULL);
-  ContentInfo* answer_content = answer->GetContentByName("audio");
-  ASSERT_TRUE(answer_content != NULL);
-
-  ASSERT_TRUE(answer_content->rejected);
-}
-
-// Offers UDP/TLS/RTP/SAVPF and verifies the answer can be created and contains
-// UDP/TLS/RTP/SAVPF.
-TEST_F(MediaSessionDescriptionFactoryTest, TestOfferDtlsSavpfCreateAnswer) {
-  f1_.set_secure(SEC_ENABLED);
-  f2_.set_secure(SEC_ENABLED);
-  tdf1_.set_secure(SEC_ENABLED);
-  tdf2_.set_secure(SEC_ENABLED);
-
-  std::unique_ptr<SessionDescription> offer(
-      f1_.CreateOffer(CreatePlanBMediaSessionOptions(), NULL));
-  ASSERT_TRUE(offer.get() != NULL);
-  ContentInfo* offer_content = offer->GetContentByName("audio");
-  ASSERT_TRUE(offer_content != NULL);
-  AudioContentDescription* offer_audio_desc =
-      static_cast<AudioContentDescription*>(offer_content->description);
-  offer_audio_desc->set_protocol(cricket::kMediaProtocolDtlsSavpf);
-
-  std::unique_ptr<SessionDescription> answer(
-      f2_.CreateAnswer(offer.get(), CreatePlanBMediaSessionOptions(), NULL));
-  ASSERT_TRUE(answer != NULL);
-
-  const ContentInfo* answer_content = answer->GetContentByName("audio");
-  ASSERT_TRUE(answer_content != NULL);
-  ASSERT_FALSE(answer_content->rejected);
-
-  const AudioContentDescription* answer_audio_desc =
-      static_cast<const AudioContentDescription*>(answer_content->description);
-  EXPECT_EQ(std::string(cricket::kMediaProtocolDtlsSavpf),
-                        answer_audio_desc->protocol());
-}
-
-// Test that we include both SDES and DTLS in the offer, but only include SDES
-// in the answer if DTLS isn't negotiated.
-TEST_F(MediaSessionDescriptionFactoryTest, TestCryptoDtls) {
-  f1_.set_secure(SEC_ENABLED);
-  f2_.set_secure(SEC_ENABLED);
-  tdf1_.set_secure(SEC_ENABLED);
-  tdf2_.set_secure(SEC_DISABLED);
-  MediaSessionOptions options;
-  AddAudioVideoSections(cricket::MD_RECVONLY, &options);
-  std::unique_ptr<SessionDescription> offer, answer;
-  const cricket::MediaContentDescription* audio_media_desc;
-  const cricket::MediaContentDescription* video_media_desc;
-  const cricket::TransportDescription* audio_trans_desc;
-  const cricket::TransportDescription* video_trans_desc;
-
-  // Generate an offer with SDES and DTLS support.
-  offer.reset(f1_.CreateOffer(options, NULL));
-  ASSERT_TRUE(offer.get() != NULL);
-
-  audio_media_desc = static_cast<const cricket::MediaContentDescription*>(
-      offer->GetContentDescriptionByName("audio"));
-  ASSERT_TRUE(audio_media_desc != NULL);
-  video_media_desc = static_cast<const cricket::MediaContentDescription*>(
-      offer->GetContentDescriptionByName("video"));
-  ASSERT_TRUE(video_media_desc != NULL);
-  EXPECT_EQ(2u, audio_media_desc->cryptos().size());
-  EXPECT_EQ(1u, video_media_desc->cryptos().size());
-
-  audio_trans_desc = offer->GetTransportDescriptionByName("audio");
-  ASSERT_TRUE(audio_trans_desc != NULL);
-  video_trans_desc = offer->GetTransportDescriptionByName("video");
-  ASSERT_TRUE(video_trans_desc != NULL);
-  ASSERT_TRUE(audio_trans_desc->identity_fingerprint.get() != NULL);
-  ASSERT_TRUE(video_trans_desc->identity_fingerprint.get() != NULL);
-
-  // Generate an answer with only SDES support, since tdf2 has crypto disabled.
-  answer.reset(f2_.CreateAnswer(offer.get(), options, NULL));
-  ASSERT_TRUE(answer.get() != NULL);
-
-  audio_media_desc = static_cast<const cricket::MediaContentDescription*>(
-      answer->GetContentDescriptionByName("audio"));
-  ASSERT_TRUE(audio_media_desc != NULL);
-  video_media_desc = static_cast<const cricket::MediaContentDescription*>(
-      answer->GetContentDescriptionByName("video"));
-  ASSERT_TRUE(video_media_desc != NULL);
-  EXPECT_EQ(1u, audio_media_desc->cryptos().size());
-  EXPECT_EQ(1u, video_media_desc->cryptos().size());
-
-  audio_trans_desc = answer->GetTransportDescriptionByName("audio");
-  ASSERT_TRUE(audio_trans_desc != NULL);
-  video_trans_desc = answer->GetTransportDescriptionByName("video");
-  ASSERT_TRUE(video_trans_desc != NULL);
-  ASSERT_TRUE(audio_trans_desc->identity_fingerprint.get() == NULL);
-  ASSERT_TRUE(video_trans_desc->identity_fingerprint.get() == NULL);
-
-  // Enable DTLS; the answer should now only have DTLS support.
-  tdf2_.set_secure(SEC_ENABLED);
-  answer.reset(f2_.CreateAnswer(offer.get(), options, NULL));
-  ASSERT_TRUE(answer.get() != NULL);
-
-  audio_media_desc = static_cast<const cricket::MediaContentDescription*>(
-      answer->GetContentDescriptionByName("audio"));
-  ASSERT_TRUE(audio_media_desc != NULL);
-  video_media_desc = static_cast<const cricket::MediaContentDescription*>(
-      answer->GetContentDescriptionByName("video"));
-  ASSERT_TRUE(video_media_desc != NULL);
-  EXPECT_TRUE(audio_media_desc->cryptos().empty());
-  EXPECT_TRUE(video_media_desc->cryptos().empty());
-  EXPECT_EQ(std::string(cricket::kMediaProtocolSavpf),
-            audio_media_desc->protocol());
-  EXPECT_EQ(std::string(cricket::kMediaProtocolSavpf),
-            video_media_desc->protocol());
-
-  audio_trans_desc = answer->GetTransportDescriptionByName("audio");
-  ASSERT_TRUE(audio_trans_desc != NULL);
-  video_trans_desc = answer->GetTransportDescriptionByName("video");
-  ASSERT_TRUE(video_trans_desc != NULL);
-  ASSERT_TRUE(audio_trans_desc->identity_fingerprint.get() != NULL);
-  ASSERT_TRUE(video_trans_desc->identity_fingerprint.get() != NULL);
-
-  // Try creating offer again. DTLS enabled now, crypto's should be empty
-  // in new offer.
-  offer.reset(f1_.CreateOffer(options, offer.get()));
-  ASSERT_TRUE(offer.get() != NULL);
-  audio_media_desc = static_cast<const cricket::MediaContentDescription*>(
-      offer->GetContentDescriptionByName("audio"));
-  ASSERT_TRUE(audio_media_desc != NULL);
-  video_media_desc = static_cast<const cricket::MediaContentDescription*>(
-      offer->GetContentDescriptionByName("video"));
-  ASSERT_TRUE(video_media_desc != NULL);
-  EXPECT_TRUE(audio_media_desc->cryptos().empty());
-  EXPECT_TRUE(video_media_desc->cryptos().empty());
-
-  audio_trans_desc = offer->GetTransportDescriptionByName("audio");
-  ASSERT_TRUE(audio_trans_desc != NULL);
-  video_trans_desc = offer->GetTransportDescriptionByName("video");
-  ASSERT_TRUE(video_trans_desc != NULL);
-  ASSERT_TRUE(audio_trans_desc->identity_fingerprint.get() != NULL);
-  ASSERT_TRUE(video_trans_desc->identity_fingerprint.get() != NULL);
-}
-
-// Test that an answer can't be created if cryptos are required but the offer is
-// unsecure.
-TEST_F(MediaSessionDescriptionFactoryTest, TestSecureAnswerToUnsecureOffer) {
-  MediaSessionOptions options = CreatePlanBMediaSessionOptions();
-  f1_.set_secure(SEC_DISABLED);
-  tdf1_.set_secure(SEC_DISABLED);
-  f2_.set_secure(SEC_REQUIRED);
-  tdf1_.set_secure(SEC_ENABLED);
-
-  std::unique_ptr<SessionDescription> offer(f1_.CreateOffer(options, NULL));
-  ASSERT_TRUE(offer.get() != NULL);
-  std::unique_ptr<SessionDescription> answer(
-      f2_.CreateAnswer(offer.get(), options, NULL));
-  EXPECT_TRUE(answer.get() == NULL);
-}
-
-// Test that we accept a DTLS offer without SDES and create an appropriate
-// answer.
-TEST_F(MediaSessionDescriptionFactoryTest, TestCryptoOfferDtlsButNotSdes) {
-  f1_.set_secure(SEC_DISABLED);
-  f2_.set_secure(SEC_ENABLED);
-  tdf1_.set_secure(SEC_ENABLED);
-  tdf2_.set_secure(SEC_ENABLED);
-  MediaSessionOptions options;
-  AddAudioVideoSections(cricket::MD_RECVONLY, &options);
-  AddDataSection(cricket::DCT_RTP, cricket::MD_RECVONLY, &options);
-
-  std::unique_ptr<SessionDescription> offer, answer;
-
-  // Generate an offer with DTLS but without SDES.
-  offer.reset(f1_.CreateOffer(options, NULL));
-  ASSERT_TRUE(offer.get() != NULL);
-
-  const AudioContentDescription* audio_offer =
-      GetFirstAudioContentDescription(offer.get());
-  ASSERT_TRUE(audio_offer->cryptos().empty());
-  const VideoContentDescription* video_offer =
-      GetFirstVideoContentDescription(offer.get());
-  ASSERT_TRUE(video_offer->cryptos().empty());
-  const DataContentDescription* data_offer =
-      GetFirstDataContentDescription(offer.get());
-  ASSERT_TRUE(data_offer->cryptos().empty());
-
-  const cricket::TransportDescription* audio_offer_trans_desc =
-      offer->GetTransportDescriptionByName("audio");
-  ASSERT_TRUE(audio_offer_trans_desc->identity_fingerprint.get() != NULL);
-  const cricket::TransportDescription* video_offer_trans_desc =
-      offer->GetTransportDescriptionByName("video");
-  ASSERT_TRUE(video_offer_trans_desc->identity_fingerprint.get() != NULL);
-  const cricket::TransportDescription* data_offer_trans_desc =
-      offer->GetTransportDescriptionByName("data");
-  ASSERT_TRUE(data_offer_trans_desc->identity_fingerprint.get() != NULL);
-
-  // Generate an answer with DTLS.
-  answer.reset(f2_.CreateAnswer(offer.get(), options, NULL));
-  ASSERT_TRUE(answer.get() != NULL);
-
-  const cricket::TransportDescription* audio_answer_trans_desc =
-      answer->GetTransportDescriptionByName("audio");
-  EXPECT_TRUE(audio_answer_trans_desc->identity_fingerprint.get() != NULL);
-  const cricket::TransportDescription* video_answer_trans_desc =
-      answer->GetTransportDescriptionByName("video");
-  EXPECT_TRUE(video_answer_trans_desc->identity_fingerprint.get() != NULL);
-  const cricket::TransportDescription* data_answer_trans_desc =
-      answer->GetTransportDescriptionByName("data");
-  EXPECT_TRUE(data_answer_trans_desc->identity_fingerprint.get() != NULL);
-}
-
-// Verifies if vad_enabled option is set to false, CN codecs are not present in
-// offer or answer.
-TEST_F(MediaSessionDescriptionFactoryTest, TestVADEnableOption) {
-  MediaSessionOptions options;
-  AddAudioVideoSections(cricket::MD_RECVONLY, &options);
-  std::unique_ptr<SessionDescription> offer(f1_.CreateOffer(options, NULL));
-  ASSERT_TRUE(offer.get() != NULL);
-  const ContentInfo* audio_content = offer->GetContentByName("audio");
-  EXPECT_FALSE(VerifyNoCNCodecs(audio_content));
-
-  options.vad_enabled = false;
-  offer.reset(f1_.CreateOffer(options, NULL));
-  ASSERT_TRUE(offer.get() != NULL);
-  audio_content = offer->GetContentByName("audio");
-  EXPECT_TRUE(VerifyNoCNCodecs(audio_content));
-  std::unique_ptr<SessionDescription> answer(
-      f1_.CreateAnswer(offer.get(), options, NULL));
-  ASSERT_TRUE(answer.get() != NULL);
-  audio_content = answer->GetContentByName("audio");
-  EXPECT_TRUE(VerifyNoCNCodecs(audio_content));
-}
-
-// Test that the generated MIDs match the existing offer.
-TEST_F(MediaSessionDescriptionFactoryTest, TestMIDsMatchesExistingOffer) {
-  MediaSessionOptions opts;
-  AddMediaSection(MEDIA_TYPE_AUDIO, "audio_modified", cricket::MD_RECVONLY,
-                  kActive, &opts);
-  AddMediaSection(MEDIA_TYPE_VIDEO, "video_modified", cricket::MD_RECVONLY,
-                  kActive, &opts);
-  opts.data_channel_type = cricket::DCT_SCTP;
-  AddMediaSection(MEDIA_TYPE_DATA, "data_modified", cricket::MD_SENDRECV,
-                  kActive, &opts);
-  // Create offer.
-  std::unique_ptr<SessionDescription> offer(f1_.CreateOffer(opts, nullptr));
-  std::unique_ptr<SessionDescription> updated_offer(
-      f1_.CreateOffer(opts, offer.get()));
-
-  const ContentInfo* audio_content = GetFirstAudioContent(updated_offer.get());
-  const ContentInfo* video_content = GetFirstVideoContent(updated_offer.get());
-  const ContentInfo* data_content = GetFirstDataContent(updated_offer.get());
-  ASSERT_TRUE(audio_content != nullptr);
-  ASSERT_TRUE(video_content != nullptr);
-  ASSERT_TRUE(data_content != nullptr);
-  EXPECT_EQ("audio_modified", audio_content->name);
-  EXPECT_EQ("video_modified", video_content->name);
-  EXPECT_EQ("data_modified", data_content->name);
-}
-
-// The following tests verify that the unified plan SDP is supported.
-// Test that we can create an offer with multiple media sections of same media
-// type.
-TEST_F(MediaSessionDescriptionFactoryTest,
-       CreateOfferWithMultipleAVMediaSections) {
-  MediaSessionOptions opts;
-  AddMediaSection(MEDIA_TYPE_AUDIO, "audio_1", cricket::MD_SENDRECV, kActive,
-                  &opts);
-  AttachSenderToMediaSection("audio_1", MEDIA_TYPE_AUDIO, kAudioTrack1,
-                             {kMediaStream1}, 1, &opts);
-
-  AddMediaSection(MEDIA_TYPE_VIDEO, "video_1", cricket::MD_SENDRECV, kActive,
-                  &opts);
-  AttachSenderToMediaSection("video_1", MEDIA_TYPE_VIDEO, kVideoTrack1,
-                             {kMediaStream1}, 1, &opts);
-
-  AddMediaSection(MEDIA_TYPE_AUDIO, "audio_2", cricket::MD_SENDRECV, kActive,
-                  &opts);
-  AttachSenderToMediaSection("audio_2", MEDIA_TYPE_AUDIO, kAudioTrack2,
-                             {kMediaStream2}, 1, &opts);
-
-  AddMediaSection(MEDIA_TYPE_VIDEO, "video_2", cricket::MD_SENDRECV, kActive,
-                  &opts);
-  AttachSenderToMediaSection("video_2", MEDIA_TYPE_VIDEO, kVideoTrack2,
-                             {kMediaStream2}, 1, &opts);
-  std::unique_ptr<SessionDescription> offer(f1_.CreateOffer(opts, nullptr));
-  ASSERT_TRUE(offer);
-
-  ASSERT_EQ(4u, offer->contents().size());
-  EXPECT_FALSE(offer->contents()[0].rejected);
-  const AudioContentDescription* acd =
-      static_cast<const AudioContentDescription*>(
-          offer->contents()[0].description);
-  ASSERT_EQ(1u, acd->streams().size());
-  EXPECT_EQ(kAudioTrack1, acd->streams()[0].id);
-  EXPECT_EQ(cricket::MD_SENDRECV, acd->direction());
-
-  EXPECT_FALSE(offer->contents()[1].rejected);
-  const VideoContentDescription* vcd =
-      static_cast<const VideoContentDescription*>(
-          offer->contents()[1].description);
-  ASSERT_EQ(1u, vcd->streams().size());
-  EXPECT_EQ(kVideoTrack1, vcd->streams()[0].id);
-  EXPECT_EQ(cricket::MD_SENDRECV, vcd->direction());
-
-  EXPECT_FALSE(offer->contents()[2].rejected);
-  acd = static_cast<const AudioContentDescription*>(
-      offer->contents()[2].description);
-  ASSERT_EQ(1u, acd->streams().size());
-  EXPECT_EQ(kAudioTrack2, acd->streams()[0].id);
-  EXPECT_EQ(cricket::MD_SENDRECV, acd->direction());
-
-  EXPECT_FALSE(offer->contents()[3].rejected);
-  vcd = static_cast<const VideoContentDescription*>(
-      offer->contents()[3].description);
-  ASSERT_EQ(1u, vcd->streams().size());
-  EXPECT_EQ(kVideoTrack2, vcd->streams()[0].id);
-  EXPECT_EQ(cricket::MD_SENDRECV, vcd->direction());
-}
-
-// Test that we can create an answer with multiple media sections of same media
-// type.
-TEST_F(MediaSessionDescriptionFactoryTest,
-       CreateAnswerWithMultipleAVMediaSections) {
-  MediaSessionOptions opts;
-  AddMediaSection(MEDIA_TYPE_AUDIO, "audio_1", cricket::MD_SENDRECV, kActive,
-                  &opts);
-  AttachSenderToMediaSection("audio_1", MEDIA_TYPE_AUDIO, kAudioTrack1,
-                             {kMediaStream1}, 1, &opts);
-
-  AddMediaSection(MEDIA_TYPE_VIDEO, "video_1", cricket::MD_SENDRECV, kActive,
-                  &opts);
-  AttachSenderToMediaSection("video_1", MEDIA_TYPE_VIDEO, kVideoTrack1,
-                             {kMediaStream1}, 1, &opts);
-
-  AddMediaSection(MEDIA_TYPE_AUDIO, "audio_2", cricket::MD_SENDRECV, kActive,
-                  &opts);
-  AttachSenderToMediaSection("audio_2", MEDIA_TYPE_AUDIO, kAudioTrack2,
-                             {kMediaStream2}, 1, &opts);
-
-  AddMediaSection(MEDIA_TYPE_VIDEO, "video_2", cricket::MD_SENDRECV, kActive,
-                  &opts);
-  AttachSenderToMediaSection("video_2", MEDIA_TYPE_VIDEO, kVideoTrack2,
-                             {kMediaStream2}, 1, &opts);
-
-  std::unique_ptr<SessionDescription> offer(f1_.CreateOffer(opts, nullptr));
-  ASSERT_TRUE(offer);
-  std::unique_ptr<SessionDescription> answer(
-      f2_.CreateAnswer(offer.get(), opts, nullptr));
-
-  ASSERT_EQ(4u, answer->contents().size());
-  EXPECT_FALSE(answer->contents()[0].rejected);
-  const AudioContentDescription* acd =
-      static_cast<const AudioContentDescription*>(
-          answer->contents()[0].description);
-  ASSERT_EQ(1u, acd->streams().size());
-  EXPECT_EQ(kAudioTrack1, acd->streams()[0].id);
-  EXPECT_EQ(cricket::MD_SENDRECV, acd->direction());
-
-  EXPECT_FALSE(answer->contents()[1].rejected);
-  const VideoContentDescription* vcd =
-      static_cast<const VideoContentDescription*>(
-          answer->contents()[1].description);
-  ASSERT_EQ(1u, vcd->streams().size());
-  EXPECT_EQ(kVideoTrack1, vcd->streams()[0].id);
-  EXPECT_EQ(cricket::MD_SENDRECV, vcd->direction());
-
-  EXPECT_FALSE(answer->contents()[2].rejected);
-  acd = static_cast<const AudioContentDescription*>(
-      answer->contents()[2].description);
-  ASSERT_EQ(1u, acd->streams().size());
-  EXPECT_EQ(kAudioTrack2, acd->streams()[0].id);
-  EXPECT_EQ(cricket::MD_SENDRECV, acd->direction());
-
-  EXPECT_FALSE(answer->contents()[3].rejected);
-  vcd = static_cast<const VideoContentDescription*>(
-      answer->contents()[3].description);
-  ASSERT_EQ(1u, vcd->streams().size());
-  EXPECT_EQ(kVideoTrack2, vcd->streams()[0].id);
-  EXPECT_EQ(cricket::MD_SENDRECV, vcd->direction());
-}
-
-// Test that the media section will be rejected in offer if the corresponding
-// MediaDescriptionOptions is stopped by the offerer.
-TEST_F(MediaSessionDescriptionFactoryTest,
-       CreateOfferWithMediaSectionStoppedByOfferer) {
-  // Create an offer with two audio sections and one of them is stopped.
-  MediaSessionOptions offer_opts;
-  AddMediaSection(MEDIA_TYPE_AUDIO, "audio1", cricket::MD_SENDRECV, kActive,
-                  &offer_opts);
-  AddMediaSection(MEDIA_TYPE_AUDIO, "audio2", cricket::MD_INACTIVE, kStopped,
-                  &offer_opts);
-  std::unique_ptr<SessionDescription> offer(
-      f1_.CreateOffer(offer_opts, nullptr));
-  ASSERT_TRUE(offer);
-  ASSERT_EQ(2u, offer->contents().size());
-  EXPECT_FALSE(offer->contents()[0].rejected);
-  EXPECT_TRUE(offer->contents()[1].rejected);
-}
-
-// Test that the media section will be rejected in answer if the corresponding
-// MediaDescriptionOptions is stopped by the offerer.
-TEST_F(MediaSessionDescriptionFactoryTest,
-       CreateAnswerWithMediaSectionStoppedByOfferer) {
-  // Create an offer with two audio sections and one of them is stopped.
-  MediaSessionOptions offer_opts;
-  AddMediaSection(MEDIA_TYPE_AUDIO, "audio1", cricket::MD_SENDRECV, kActive,
-                  &offer_opts);
-  AddMediaSection(MEDIA_TYPE_AUDIO, "audio2", cricket::MD_INACTIVE, kStopped,
-                  &offer_opts);
-  std::unique_ptr<SessionDescription> offer(
-      f1_.CreateOffer(offer_opts, nullptr));
-  ASSERT_TRUE(offer);
-  ASSERT_EQ(2u, offer->contents().size());
-  EXPECT_FALSE(offer->contents()[0].rejected);
-  EXPECT_TRUE(offer->contents()[1].rejected);
-
-  // Create an answer based on the offer.
-  MediaSessionOptions answer_opts;
-  AddMediaSection(MEDIA_TYPE_AUDIO, "audio1", cricket::MD_SENDRECV, kActive,
-                  &answer_opts);
-  AddMediaSection(MEDIA_TYPE_AUDIO, "audio2", cricket::MD_SENDRECV, kActive,
-                  &answer_opts);
-  std::unique_ptr<SessionDescription> answer(
-      f2_.CreateAnswer(offer.get(), answer_opts, nullptr));
-  ASSERT_EQ(2u, answer->contents().size());
-  EXPECT_FALSE(answer->contents()[0].rejected);
-  EXPECT_TRUE(answer->contents()[1].rejected);
-}
-
-// Test that the media section will be rejected in answer if the corresponding
-// MediaDescriptionOptions is stopped by the answerer.
-TEST_F(MediaSessionDescriptionFactoryTest,
-       CreateAnswerWithMediaSectionRejectedByAnswerer) {
-  // Create an offer with two audio sections.
-  MediaSessionOptions offer_opts;
-  AddMediaSection(MEDIA_TYPE_AUDIO, "audio1", cricket::MD_SENDRECV, kActive,
-                  &offer_opts);
-  AddMediaSection(MEDIA_TYPE_AUDIO, "audio2", cricket::MD_SENDRECV, kActive,
-                  &offer_opts);
-  std::unique_ptr<SessionDescription> offer(
-      f1_.CreateOffer(offer_opts, nullptr));
-  ASSERT_TRUE(offer);
-  ASSERT_EQ(2u, offer->contents().size());
-  ASSERT_FALSE(offer->contents()[0].rejected);
-  ASSERT_FALSE(offer->contents()[1].rejected);
-
-  // The answerer rejects one of the audio sections.
-  MediaSessionOptions answer_opts;
-  AddMediaSection(MEDIA_TYPE_AUDIO, "audio1", cricket::MD_SENDRECV, kActive,
-                  &answer_opts);
-  AddMediaSection(MEDIA_TYPE_AUDIO, "audio2", cricket::MD_INACTIVE, kStopped,
-                  &answer_opts);
-  std::unique_ptr<SessionDescription> answer(
-      f2_.CreateAnswer(offer.get(), answer_opts, nullptr));
-  ASSERT_EQ(2u, answer->contents().size());
-  EXPECT_FALSE(answer->contents()[0].rejected);
-  EXPECT_TRUE(answer->contents()[1].rejected);
-}
-
-// Test the generated media sections has the same order of the
-// corresponding MediaDescriptionOptions.
-TEST_F(MediaSessionDescriptionFactoryTest,
-       CreateOfferRespectsMediaDescriptionOptionsOrder) {
-  MediaSessionOptions opts;
-  // This tests put video section first because normally audio comes first by
-  // default.
-  AddMediaSection(MEDIA_TYPE_VIDEO, "video", cricket::MD_SENDRECV, kActive,
-                  &opts);
-  AddMediaSection(MEDIA_TYPE_AUDIO, "audio", cricket::MD_SENDRECV, kActive,
-                  &opts);
-  std::unique_ptr<SessionDescription> offer(f1_.CreateOffer(opts, nullptr));
-
-  ASSERT_TRUE(offer);
-  ASSERT_EQ(2u, offer->contents().size());
-  EXPECT_EQ("video", offer->contents()[0].name);
-  EXPECT_EQ("audio", offer->contents()[1].name);
-}
-
-// Test that different media sections using the same codec have same payload
-// type.
-TEST_F(MediaSessionDescriptionFactoryTest,
-       PayloadTypesSharedByMediaSectionsOfSameType) {
-  MediaSessionOptions opts;
-  AddMediaSection(MEDIA_TYPE_VIDEO, "video1", cricket::MD_SENDRECV, kActive,
-                  &opts);
-  AddMediaSection(MEDIA_TYPE_VIDEO, "video2", cricket::MD_SENDRECV, kActive,
-                  &opts);
-  // Create an offer with two video sections using same codecs.
-  std::unique_ptr<SessionDescription> offer(f1_.CreateOffer(opts, nullptr));
-  ASSERT_TRUE(offer);
-  ASSERT_EQ(2u, offer->contents().size());
-  const VideoContentDescription* vcd1 =
-      static_cast<const VideoContentDescription*>(
-          offer->contents()[0].description);
-  const VideoContentDescription* vcd2 =
-      static_cast<const VideoContentDescription*>(
-          offer->contents()[1].description);
-  EXPECT_EQ(vcd1->codecs().size(), vcd2->codecs().size());
-  ASSERT_EQ(2u, vcd1->codecs().size());
-  EXPECT_EQ(vcd1->codecs()[0].name, vcd2->codecs()[0].name);
-  EXPECT_EQ(vcd1->codecs()[0].id, vcd2->codecs()[0].id);
-  EXPECT_EQ(vcd1->codecs()[1].name, vcd2->codecs()[1].name);
-  EXPECT_EQ(vcd1->codecs()[1].id, vcd2->codecs()[1].id);
-
-  // Create answer and negotiate the codecs.
-  std::unique_ptr<SessionDescription> answer(
-      f2_.CreateAnswer(offer.get(), opts, nullptr));
-  ASSERT_TRUE(answer);
-  ASSERT_EQ(2u, answer->contents().size());
-  vcd1 = static_cast<const VideoContentDescription*>(
-      answer->contents()[0].description);
-  vcd2 = static_cast<const VideoContentDescription*>(
-      answer->contents()[1].description);
-  EXPECT_EQ(vcd1->codecs().size(), vcd2->codecs().size());
-  ASSERT_EQ(1u, vcd1->codecs().size());
-  EXPECT_EQ(vcd1->codecs()[0].name, vcd2->codecs()[0].name);
-  EXPECT_EQ(vcd1->codecs()[0].id, vcd2->codecs()[0].id);
-}
-
-// Test that the codec preference order per media section is respected in
-// subsequent offer.
-TEST_F(MediaSessionDescriptionFactoryTest,
-       CreateOfferRespectsCodecPreferenceOrder) {
-  MediaSessionOptions opts;
-  AddMediaSection(MEDIA_TYPE_VIDEO, "video1", cricket::MD_SENDRECV, kActive,
-                  &opts);
-  AddMediaSection(MEDIA_TYPE_VIDEO, "video2", cricket::MD_SENDRECV, kActive,
-                  &opts);
-  // Create an offer with two video sections using same codecs.
-  std::unique_ptr<SessionDescription> offer(f1_.CreateOffer(opts, nullptr));
-  ASSERT_TRUE(offer);
-  ASSERT_EQ(2u, offer->contents().size());
-  VideoContentDescription* vcd1 =
-      static_cast<VideoContentDescription*>(offer->contents()[0].description);
-  const VideoContentDescription* vcd2 =
-      static_cast<const VideoContentDescription*>(
-          offer->contents()[1].description);
-  auto video_codecs = MAKE_VECTOR(kVideoCodecs1);
-  EXPECT_EQ(video_codecs, vcd1->codecs());
-  EXPECT_EQ(video_codecs, vcd2->codecs());
-
-  // Change the codec preference of the first video section and create a
-  // follow-up offer.
-  auto video_codecs_reverse = MAKE_VECTOR(kVideoCodecs1Reverse);
-  vcd1->set_codecs(video_codecs_reverse);
-  std::unique_ptr<SessionDescription> updated_offer(
-      f1_.CreateOffer(opts, offer.get()));
-  vcd1 = static_cast<VideoContentDescription*>(
-      updated_offer->contents()[0].description);
-  vcd2 = static_cast<const VideoContentDescription*>(
-      updated_offer->contents()[1].description);
-  // The video codec preference order should be respected.
-  EXPECT_EQ(video_codecs_reverse, vcd1->codecs());
-  EXPECT_EQ(video_codecs, vcd2->codecs());
-}
-
-// Test that the codec preference order per media section is respected in
-// the answer.
-TEST_F(MediaSessionDescriptionFactoryTest,
-       CreateAnswerRespectsCodecPreferenceOrder) {
-  MediaSessionOptions opts;
-  AddMediaSection(MEDIA_TYPE_VIDEO, "video1", cricket::MD_SENDRECV, kActive,
-                  &opts);
-  AddMediaSection(MEDIA_TYPE_VIDEO, "video2", cricket::MD_SENDRECV, kActive,
-                  &opts);
-  // Create an offer with two video sections using same codecs.
-  std::unique_ptr<SessionDescription> offer(f1_.CreateOffer(opts, nullptr));
-  ASSERT_TRUE(offer);
-  ASSERT_EQ(2u, offer->contents().size());
-  VideoContentDescription* vcd1 =
-      static_cast<VideoContentDescription*>(offer->contents()[0].description);
-  const VideoContentDescription* vcd2 =
-      static_cast<const VideoContentDescription*>(
-          offer->contents()[1].description);
-  auto video_codecs = MAKE_VECTOR(kVideoCodecs1);
-  EXPECT_EQ(video_codecs, vcd1->codecs());
-  EXPECT_EQ(video_codecs, vcd2->codecs());
-
-  // Change the codec preference of the first video section and create an
-  // answer.
-  auto video_codecs_reverse = MAKE_VECTOR(kVideoCodecs1Reverse);
-  vcd1->set_codecs(video_codecs_reverse);
-  std::unique_ptr<SessionDescription> answer(
-      f1_.CreateAnswer(offer.get(), opts, nullptr));
-  vcd1 =
-      static_cast<VideoContentDescription*>(answer->contents()[0].description);
-  vcd2 = static_cast<const VideoContentDescription*>(
-      answer->contents()[1].description);
-  // The video codec preference order should be respected.
-  EXPECT_EQ(video_codecs_reverse, vcd1->codecs());
-  EXPECT_EQ(video_codecs, vcd2->codecs());
-}
-
-class MediaProtocolTest : public ::testing::TestWithParam<const char*> {
- public:
-  MediaProtocolTest() : f1_(&tdf1_), f2_(&tdf2_) {
-    f1_.set_audio_codecs(MAKE_VECTOR(kAudioCodecs1),
-                         MAKE_VECTOR(kAudioCodecs1));
-    f1_.set_video_codecs(MAKE_VECTOR(kVideoCodecs1));
-    f1_.set_data_codecs(MAKE_VECTOR(kDataCodecs1));
-    f2_.set_audio_codecs(MAKE_VECTOR(kAudioCodecs2),
-                         MAKE_VECTOR(kAudioCodecs2));
-    f2_.set_video_codecs(MAKE_VECTOR(kVideoCodecs2));
-    f2_.set_data_codecs(MAKE_VECTOR(kDataCodecs2));
-    f1_.set_secure(SEC_ENABLED);
-    f2_.set_secure(SEC_ENABLED);
-    tdf1_.set_certificate(rtc::RTCCertificate::Create(
-        std::unique_ptr<rtc::SSLIdentity>(new rtc::FakeSSLIdentity("id1"))));
-    tdf2_.set_certificate(rtc::RTCCertificate::Create(
-        std::unique_ptr<rtc::SSLIdentity>(new rtc::FakeSSLIdentity("id2"))));
-    tdf1_.set_secure(SEC_ENABLED);
-    tdf2_.set_secure(SEC_ENABLED);
-  }
-
- protected:
-  MediaSessionDescriptionFactory f1_;
-  MediaSessionDescriptionFactory f2_;
-  TransportDescriptionFactory tdf1_;
-  TransportDescriptionFactory tdf2_;
-};
-
-TEST_P(MediaProtocolTest, TestAudioVideoAcceptance) {
-  MediaSessionOptions opts;
-  AddAudioVideoSections(cricket::MD_RECVONLY, &opts);
-  std::unique_ptr<SessionDescription> offer(f1_.CreateOffer(opts, nullptr));
-  ASSERT_TRUE(offer.get() != nullptr);
-  // Set the protocol for all the contents.
-  for (auto content : offer.get()->contents()) {
-    static_cast<MediaContentDescription*>(content.description)
-        ->set_protocol(GetParam());
-  }
-  std::unique_ptr<SessionDescription> answer(
-      f2_.CreateAnswer(offer.get(), opts, nullptr));
-  const ContentInfo* ac = answer->GetContentByName("audio");
-  const ContentInfo* vc = answer->GetContentByName("video");
-  ASSERT_TRUE(ac != nullptr);
-  ASSERT_TRUE(vc != nullptr);
-  EXPECT_FALSE(ac->rejected);  // the offer is accepted
-  EXPECT_FALSE(vc->rejected);
-  const AudioContentDescription* acd =
-      static_cast<const AudioContentDescription*>(ac->description);
-  const VideoContentDescription* vcd =
-      static_cast<const VideoContentDescription*>(vc->description);
-  EXPECT_EQ(GetParam(), acd->protocol());
-  EXPECT_EQ(GetParam(), vcd->protocol());
-}
-
-INSTANTIATE_TEST_CASE_P(MediaProtocolPatternTest,
-                        MediaProtocolTest,
-                        ::testing::ValuesIn(kMediaProtocols));
-INSTANTIATE_TEST_CASE_P(MediaProtocolDtlsPatternTest,
-                        MediaProtocolTest,
-                        ::testing::ValuesIn(kMediaProtocolsDtls));
-
-TEST_F(MediaSessionDescriptionFactoryTest, TestSetAudioCodecs) {
-  TransportDescriptionFactory tdf;
-  MediaSessionDescriptionFactory sf(&tdf);
-  std::vector<AudioCodec> send_codecs = MAKE_VECTOR(kAudioCodecs1);
-  std::vector<AudioCodec> recv_codecs = MAKE_VECTOR(kAudioCodecs2);
-
-  // The merged list of codecs should contain any send codecs that are also
-  // nominally in the recieve codecs list. Payload types should be picked from
-  // the send codecs and a number-of-channels of 0 and 1 should be equivalent
-  // (set to 1). This equals what happens when the send codecs are used in an
-  // offer and the receive codecs are used in the following answer.
-  const std::vector<AudioCodec> sendrecv_codecs =
-      MAKE_VECTOR(kAudioCodecsAnswer);
-  const std::vector<AudioCodec> no_codecs;
-
-  RTC_CHECK_EQ(send_codecs[1].name, "iLBC")
-      << "Please don't change shared test data!";
-  RTC_CHECK_EQ(recv_codecs[2].name, "iLBC")
-      << "Please don't change shared test data!";
-  // Alter iLBC send codec to have zero channels, to test that that is handled
-  // properly.
-  send_codecs[1].channels = 0;
-
-  // Alther iLBC receive codec to be lowercase, to test that case conversions
-  // are handled properly.
-  recv_codecs[2].name = "ilbc";
-
-  // Test proper merge
-  sf.set_audio_codecs(send_codecs, recv_codecs);
-  EXPECT_EQ(send_codecs, sf.audio_send_codecs());
-  EXPECT_EQ(recv_codecs, sf.audio_recv_codecs());
-  EXPECT_EQ(sendrecv_codecs, sf.audio_sendrecv_codecs());
-
-  // Test empty send codecs list
-  sf.set_audio_codecs(no_codecs, recv_codecs);
-  EXPECT_EQ(no_codecs, sf.audio_send_codecs());
-  EXPECT_EQ(recv_codecs, sf.audio_recv_codecs());
-  EXPECT_EQ(no_codecs, sf.audio_sendrecv_codecs());
-
-  // Test empty recv codecs list
-  sf.set_audio_codecs(send_codecs, no_codecs);
-  EXPECT_EQ(send_codecs, sf.audio_send_codecs());
-  EXPECT_EQ(no_codecs, sf.audio_recv_codecs());
-  EXPECT_EQ(no_codecs, sf.audio_sendrecv_codecs());
-
-  // Test all empty codec lists
-  sf.set_audio_codecs(no_codecs, no_codecs);
-  EXPECT_EQ(no_codecs, sf.audio_send_codecs());
-  EXPECT_EQ(no_codecs, sf.audio_recv_codecs());
-  EXPECT_EQ(no_codecs, sf.audio_sendrecv_codecs());
-}
-
-namespace {
-// Compare the two vectors of codecs ignoring the payload type.
-template <class Codec>
-bool CodecsMatch(const std::vector<Codec>& codecs1,
-                 const std::vector<Codec>& codecs2) {
-  if (codecs1.size() != codecs2.size()) {
-    return false;
-  }
-
-  for (size_t i = 0; i < codecs1.size(); ++i) {
-    if (!codecs1[i].Matches(codecs2[i])) {
-      return false;
-    }
-  }
-  return true;
-}
-
-void TestAudioCodecsOffer(MediaContentDirection direction) {
-  TransportDescriptionFactory tdf;
-  MediaSessionDescriptionFactory sf(&tdf);
-  const std::vector<AudioCodec> send_codecs = MAKE_VECTOR(kAudioCodecs1);
-  const std::vector<AudioCodec> recv_codecs = MAKE_VECTOR(kAudioCodecs2);
-  const std::vector<AudioCodec> sendrecv_codecs =
-      MAKE_VECTOR(kAudioCodecsAnswer);
-  sf.set_audio_codecs(send_codecs, recv_codecs);
-
-  MediaSessionOptions opts;
-  AddMediaSection(MEDIA_TYPE_AUDIO, "audio", direction, kActive, &opts);
-
-  if (RtpTransceiverDirection::FromMediaContentDirection(direction).send) {
-    AttachSenderToMediaSection("audio", MEDIA_TYPE_AUDIO, kAudioTrack1,
-                               {kMediaStream1}, 1, &opts);
-  }
-
-  std::unique_ptr<SessionDescription> offer(sf.CreateOffer(opts, NULL));
-  ASSERT_TRUE(offer.get() != NULL);
-  const ContentInfo* ac = offer->GetContentByName("audio");
-
-  // If the factory didn't add any audio content to the offer, we cannot check
-  // that the codecs put in are right. This happens when we neither want to
-  // send nor receive audio. The checks are still in place if at some point
-  // we'd instead create an inactive stream.
-  if (ac) {
-    AudioContentDescription* acd =
-        static_cast<AudioContentDescription*>(ac->description);
-    // sendrecv and inactive should both present lists as if the channel was
-    // to be used for sending and receiving. Inactive essentially means it
-    // might eventually be used anything, but we don't know more at this
-    // moment.
-    if (acd->direction() == cricket::MD_SENDONLY) {
-      EXPECT_TRUE(CodecsMatch<AudioCodec>(send_codecs, acd->codecs()));
-    } else if (acd->direction() == cricket::MD_RECVONLY) {
-      EXPECT_TRUE(CodecsMatch<AudioCodec>(recv_codecs, acd->codecs()));
-    } else {
-      EXPECT_TRUE(CodecsMatch<AudioCodec>(sendrecv_codecs, acd->codecs()));
-    }
-  }
-}
-
-static const AudioCodec kOfferAnswerCodecs[] = {
-    AudioCodec(0, "codec0", 16000, -1, 1),
-    AudioCodec(1, "codec1", 8000, 13300, 1),
-    AudioCodec(2, "codec2", 8000, 64000, 1),
-    AudioCodec(3, "codec3", 8000, 64000, 1),
-    AudioCodec(4, "codec4", 8000, 0, 2),
-    AudioCodec(5, "codec5", 32000, 0, 1),
-    AudioCodec(6, "codec6", 48000, 0, 1)};
-
-/* The codecs groups below are chosen as per the matrix below. The objective
- * is to have different sets of codecs in the inputs, to get unique sets of
- * codecs after negotiation, depending on offer and answer communication
- * directions. One-way directions in the offer should either result in the
- * opposite direction in the answer, or an inactive answer. Regardless, the
- * choice of codecs should be as if the answer contained the opposite
- * direction. Inactive offers should be treated as sendrecv/sendrecv.
- *
- *         |     Offer   |      Answer  |         Result
- *    codec|send recv sr | send recv sr | s/r  r/s sr/s sr/r sr/sr
- *     0   | x    -    - |  -    x    - |  x    -    -    -    -
- *     1   | x    x    x |  -    x    - |  x    -    -    x    -
- *     2   | -    x    - |  x    -    - |  -    x    -    -    -
- *     3   | x    x    x |  x    -    - |  -    x    x    -    -
- *     4   | -    x    - |  x    x    x |  -    x    -    -    -
- *     5   | x    -    - |  x    x    x |  x    -    -    -    -
- *     6   | x    x    x |  x    x    x |  x    x    x    x    x
- */
-// Codecs used by offerer in the AudioCodecsAnswerTest
-static const int kOfferSendCodecs[] = {0, 1, 3, 5, 6};
-static const int kOfferRecvCodecs[] = {1, 2, 3, 4, 6};
-// Codecs used in the answerer in the AudioCodecsAnswerTest.  The order is
-// jumbled to catch the answer not following the order in the offer.
-static const int kAnswerSendCodecs[] = {6, 5, 2, 3, 4};
-static const int kAnswerRecvCodecs[] = {6, 5, 4, 1, 0};
-// The resulting sets of codecs in the answer in the AudioCodecsAnswerTest
-static const int kResultSend_RecvCodecs[] = {0, 1, 5, 6};
-static const int kResultRecv_SendCodecs[] = {2, 3, 4, 6};
-static const int kResultSendrecv_SendCodecs[] = {3, 6};
-static const int kResultSendrecv_RecvCodecs[] = {1, 6};
-static const int kResultSendrecv_SendrecvCodecs[] = {6};
-
-template <typename T, int IDXS>
-std::vector<T> VectorFromIndices(const T* array, const int (&indices)[IDXS]) {
-  std::vector<T> out;
-  out.reserve(IDXS);
-  for (int idx : indices)
-    out.push_back(array[idx]);
-
-  return out;
-}
-
-void TestAudioCodecsAnswer(MediaContentDirection offer_direction,
-                           MediaContentDirection answer_direction,
-                           bool add_legacy_stream) {
-  TransportDescriptionFactory offer_tdf;
-  TransportDescriptionFactory answer_tdf;
-  MediaSessionDescriptionFactory offer_factory(&offer_tdf);
-  MediaSessionDescriptionFactory answer_factory(&answer_tdf);
-  offer_factory.set_audio_codecs(
-      VectorFromIndices(kOfferAnswerCodecs, kOfferSendCodecs),
-      VectorFromIndices(kOfferAnswerCodecs, kOfferRecvCodecs));
-  answer_factory.set_audio_codecs(
-      VectorFromIndices(kOfferAnswerCodecs, kAnswerSendCodecs),
-      VectorFromIndices(kOfferAnswerCodecs, kAnswerRecvCodecs));
-
-  MediaSessionOptions offer_opts;
-  AddMediaSection(MEDIA_TYPE_AUDIO, "audio", offer_direction, kActive,
-                  &offer_opts);
-
-  if (RtpTransceiverDirection::FromMediaContentDirection(offer_direction)
-          .send) {
-    AttachSenderToMediaSection("audio", MEDIA_TYPE_AUDIO, kAudioTrack1,
-                               {kMediaStream1}, 1, &offer_opts);
-  }
-
-  std::unique_ptr<SessionDescription> offer(
-      offer_factory.CreateOffer(offer_opts, NULL));
-  ASSERT_TRUE(offer.get() != NULL);
-
-  MediaSessionOptions answer_opts;
-  AddMediaSection(MEDIA_TYPE_AUDIO, "audio", answer_direction, kActive,
-                  &answer_opts);
-
-  if (RtpTransceiverDirection::FromMediaContentDirection(answer_direction)
-          .send) {
-    AttachSenderToMediaSection("audio", MEDIA_TYPE_AUDIO, kAudioTrack1,
-                               {kMediaStream1}, 1, &answer_opts);
-  }
-  std::unique_ptr<SessionDescription> answer(
-      answer_factory.CreateAnswer(offer.get(), answer_opts, NULL));
-  const ContentInfo* ac = answer->GetContentByName("audio");
-
-  // If the factory didn't add any audio content to the answer, we cannot
-  // check that the codecs put in are right. This happens when we neither want
-  // to send nor receive audio. The checks are still in place if at some point
-  // we'd instead create an inactive stream.
-  if (ac) {
-    const AudioContentDescription* acd =
-        static_cast<const AudioContentDescription*>(ac->description);
-    EXPECT_EQ(MEDIA_TYPE_AUDIO, acd->type());
-
-    std::vector<AudioCodec> target_codecs;
-    // For offers with sendrecv or inactive, we should never reply with more
-    // codecs than offered, with these codec sets.
-    switch (offer_direction) {
-      case cricket::MD_INACTIVE:
-        target_codecs = VectorFromIndices(kOfferAnswerCodecs,
-                                          kResultSendrecv_SendrecvCodecs);
-        break;
-      case cricket::MD_SENDONLY:
-        target_codecs =
-            VectorFromIndices(kOfferAnswerCodecs, kResultSend_RecvCodecs);
-        break;
-      case cricket::MD_RECVONLY:
-        target_codecs =
-            VectorFromIndices(kOfferAnswerCodecs, kResultRecv_SendCodecs);
-        break;
-      case cricket::MD_SENDRECV:
-        if (acd->direction() == cricket::MD_SENDONLY) {
-          target_codecs =
-              VectorFromIndices(kOfferAnswerCodecs, kResultSendrecv_SendCodecs);
-        } else if (acd->direction() == cricket::MD_RECVONLY) {
-          target_codecs =
-              VectorFromIndices(kOfferAnswerCodecs, kResultSendrecv_RecvCodecs);
-        } else {
-          target_codecs = VectorFromIndices(kOfferAnswerCodecs,
-                                            kResultSendrecv_SendrecvCodecs);
-        }
-        break;
-    }
-
-    auto format_codecs = [](const std::vector<AudioCodec>& codecs) {
-      std::stringstream os;
-      bool first = true;
-      os << "{";
-      for (const auto& c : codecs) {
-        os << (first ? " " : ", ") << c.id;
-        first = false;
-      }
-      os << " }";
-      return os.str();
-    };
-
-    EXPECT_TRUE(acd->codecs() == target_codecs)
-        << "Expected: " << format_codecs(target_codecs)
-        << ", got: " << format_codecs(acd->codecs())
-        << "; Offered: " << MediaContentDirectionToString(offer_direction)
-        << ", answerer wants: "
-        << MediaContentDirectionToString(answer_direction)
-        << "; got: " << MediaContentDirectionToString(acd->direction());
-  } else {
-    EXPECT_EQ(offer_direction, cricket::MD_INACTIVE)
-        << "Only inactive offers are allowed to not generate any audio "
-           "content";
-  }
-}
-
-}  // namespace
-
-class AudioCodecsOfferTest
-    : public ::testing::TestWithParam<MediaContentDirection> {};
-
-TEST_P(AudioCodecsOfferTest, TestCodecsInOffer) {
-  TestAudioCodecsOffer(GetParam());
-}
-
-INSTANTIATE_TEST_CASE_P(MediaSessionDescriptionFactoryTest,
-                        AudioCodecsOfferTest,
-                        ::testing::Values(cricket::MD_SENDONLY,
-                                          cricket::MD_RECVONLY,
-                                          cricket::MD_SENDRECV,
-                                          cricket::MD_INACTIVE));
-
-class AudioCodecsAnswerTest
-    : public ::testing::TestWithParam<::testing::tuple<MediaContentDirection,
-                                                       MediaContentDirection,
-                                                       bool>> {};
-
-TEST_P(AudioCodecsAnswerTest, TestCodecsInAnswer) {
-  TestAudioCodecsAnswer(::testing::get<0>(GetParam()),
-                        ::testing::get<1>(GetParam()),
-                        ::testing::get<2>(GetParam()));
-}
-
-INSTANTIATE_TEST_CASE_P(
-    MediaSessionDescriptionFactoryTest,
-    AudioCodecsAnswerTest,
-    ::testing::Combine(::testing::Values(cricket::MD_SENDONLY,
-                                         cricket::MD_RECVONLY,
-                                         cricket::MD_SENDRECV,
-                                         cricket::MD_INACTIVE),
-                       ::testing::Values(cricket::MD_SENDONLY,
-                                         cricket::MD_RECVONLY,
-                                         cricket::MD_SENDRECV,
-                                         cricket::MD_INACTIVE),
-                       ::testing::Bool()));
diff --git a/pc/mediastream.cc b/pc/mediastream.cc
deleted file mode 100644
index c13d80d..0000000
--- a/pc/mediastream.cc
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- *  Copyright 2011 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/pc/mediastream.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-
-namespace webrtc {
-
-template <class V>
-static typename V::iterator FindTrack(V* vector,
-                                      const std::string& track_id) {
-  typename V::iterator it = vector->begin();
-  for (; it != vector->end(); ++it) {
-    if ((*it)->id() == track_id) {
-      break;
-    }
-  }
-  return it;
-};
-
-rtc::scoped_refptr<MediaStream> MediaStream::Create(
-    const std::string& label) {
-  rtc::RefCountedObject<MediaStream>* stream =
-      new rtc::RefCountedObject<MediaStream>(label);
-  return stream;
-}
-
-MediaStream::MediaStream(const std::string& label)
-    : label_(label) {
-}
-
-bool MediaStream::AddTrack(AudioTrackInterface* track) {
-  return AddTrack<AudioTrackVector, AudioTrackInterface>(&audio_tracks_, track);
-}
-
-bool MediaStream::AddTrack(VideoTrackInterface* track) {
-  return AddTrack<VideoTrackVector, VideoTrackInterface>(&video_tracks_, track);
-}
-
-bool MediaStream::RemoveTrack(AudioTrackInterface* track) {
-  return RemoveTrack<AudioTrackVector>(&audio_tracks_, track);
-}
-
-bool MediaStream::RemoveTrack(VideoTrackInterface* track) {
-  return RemoveTrack<VideoTrackVector>(&video_tracks_, track);
-}
-
-rtc::scoped_refptr<AudioTrackInterface>
-MediaStream::FindAudioTrack(const std::string& track_id) {
-  AudioTrackVector::iterator it = FindTrack(&audio_tracks_, track_id);
-  if (it == audio_tracks_.end())
-    return NULL;
-  return *it;
-}
-
-rtc::scoped_refptr<VideoTrackInterface>
-MediaStream::FindVideoTrack(const std::string& track_id) {
-  VideoTrackVector::iterator it = FindTrack(&video_tracks_, track_id);
-  if (it == video_tracks_.end())
-    return NULL;
-  return *it;
-}
-
-template <typename TrackVector, typename Track>
-bool MediaStream::AddTrack(TrackVector* tracks, Track* track) {
-  typename TrackVector::iterator it = FindTrack(tracks, track->id());
-  if (it != tracks->end())
-    return false;
-  tracks->push_back(track);
-  FireOnChanged();
-  return true;
-}
-
-template <typename TrackVector>
-bool MediaStream::RemoveTrack(TrackVector* tracks,
-                              MediaStreamTrackInterface* track) {
-  RTC_DCHECK(tracks != NULL);
-  if (!track)
-    return false;
-  typename TrackVector::iterator it = FindTrack(tracks, track->id());
-  if (it == tracks->end())
-    return false;
-  tracks->erase(it);
-  FireOnChanged();
-  return true;
-}
-
-}  // namespace webrtc
diff --git a/pc/mediastream.h b/pc/mediastream.h
deleted file mode 100644
index 56fbed9..0000000
--- a/pc/mediastream.h
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- *  Copyright 2011 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.
- */
-
-// This file contains the implementation of MediaStreamInterface interface.
-
-#ifndef WEBRTC_PC_MEDIASTREAM_H_
-#define WEBRTC_PC_MEDIASTREAM_H_
-
-#include <string>
-#include <vector>
-
-#include "webrtc/api/mediastreaminterface.h"
-#include "webrtc/api/notifier.h"
-
-namespace webrtc {
-
-class MediaStream : public Notifier<MediaStreamInterface> {
- public:
-  static rtc::scoped_refptr<MediaStream> Create(const std::string& label);
-
-  std::string label() const override { return label_; }
-
-  bool AddTrack(AudioTrackInterface* track) override;
-  bool AddTrack(VideoTrackInterface* track) override;
-  bool RemoveTrack(AudioTrackInterface* track) override;
-  bool RemoveTrack(VideoTrackInterface* track) override;
-  rtc::scoped_refptr<AudioTrackInterface>
-      FindAudioTrack(const std::string& track_id) override;
-  rtc::scoped_refptr<VideoTrackInterface>
-      FindVideoTrack(const std::string& track_id) override;
-
-  AudioTrackVector GetAudioTracks() override { return audio_tracks_; }
-  VideoTrackVector GetVideoTracks() override { return video_tracks_; }
-
- protected:
-  explicit MediaStream(const std::string& label);
-
- private:
-  template <typename TrackVector, typename Track>
-  bool AddTrack(TrackVector* Tracks, Track* track);
-  template <typename TrackVector>
-  bool RemoveTrack(TrackVector* Tracks, MediaStreamTrackInterface* track);
-
-  std::string label_;
-  AudioTrackVector audio_tracks_;
-  VideoTrackVector video_tracks_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_PC_MEDIASTREAM_H_
diff --git a/pc/mediastream_unittest.cc b/pc/mediastream_unittest.cc
deleted file mode 100644
index 1a96a56..0000000
--- a/pc/mediastream_unittest.cc
+++ /dev/null
@@ -1,154 +0,0 @@
-/*
- *  Copyright 2011 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 <string>
-
-#include "webrtc/pc/audiotrack.h"
-#include "webrtc/pc/mediastream.h"
-#include "webrtc/pc/test/fakevideotracksource.h"
-#include "webrtc/pc/videotrack.h"
-#include "webrtc/rtc_base/gunit.h"
-#include "webrtc/rtc_base/refcount.h"
-#include "webrtc/test/gmock.h"
-#include "webrtc/test/gtest.h"
-
-static const char kStreamLabel1[] = "local_stream_1";
-static const char kVideoTrackId[] = "dummy_video_cam_1";
-static const char kAudioTrackId[] = "dummy_microphone_1";
-
-using rtc::scoped_refptr;
-using ::testing::Exactly;
-
-namespace webrtc {
-
-// Helper class to test Observer.
-class MockObserver : public ObserverInterface {
- public:
-  explicit MockObserver(NotifierInterface* notifier) : notifier_(notifier) {
-    notifier_->RegisterObserver(this);
-  }
-
-  ~MockObserver() { Unregister(); }
-
-  void Unregister() {
-    if (notifier_) {
-      notifier_->UnregisterObserver(this);
-      notifier_ = nullptr;
-    }
-  }
-
-  MOCK_METHOD0(OnChanged, void());
-
- private:
-  NotifierInterface* notifier_;
-};
-
-class MediaStreamTest: public testing::Test {
- protected:
-  virtual void SetUp() {
-    stream_ = MediaStream::Create(kStreamLabel1);
-    ASSERT_TRUE(stream_.get() != NULL);
-
-    video_track_ = VideoTrack::Create(
-        kVideoTrackId, FakeVideoTrackSource::Create(), rtc::Thread::Current());
-    ASSERT_TRUE(video_track_.get() != NULL);
-    EXPECT_EQ(MediaStreamTrackInterface::kLive, video_track_->state());
-
-    audio_track_ = AudioTrack::Create(kAudioTrackId, NULL);
-
-    ASSERT_TRUE(audio_track_.get() != NULL);
-    EXPECT_EQ(MediaStreamTrackInterface::kLive, audio_track_->state());
-
-    EXPECT_TRUE(stream_->AddTrack(video_track_));
-    EXPECT_FALSE(stream_->AddTrack(video_track_));
-    EXPECT_TRUE(stream_->AddTrack(audio_track_));
-    EXPECT_FALSE(stream_->AddTrack(audio_track_));
-  }
-
-  void ChangeTrack(MediaStreamTrackInterface* track) {
-    MockObserver observer(track);
-
-    EXPECT_CALL(observer, OnChanged())
-        .Times(Exactly(1));
-    track->set_enabled(false);
-    EXPECT_FALSE(track->enabled());
-  }
-
-  scoped_refptr<MediaStreamInterface> stream_;
-  scoped_refptr<AudioTrackInterface> audio_track_;
-  scoped_refptr<VideoTrackInterface> video_track_;
-};
-
-TEST_F(MediaStreamTest, GetTrackInfo) {
-  ASSERT_EQ(1u, stream_->GetVideoTracks().size());
-  ASSERT_EQ(1u, stream_->GetAudioTracks().size());
-
-  // Verify the video track.
-  scoped_refptr<webrtc::MediaStreamTrackInterface> video_track(
-      stream_->GetVideoTracks()[0]);
-  EXPECT_EQ(0, video_track->id().compare(kVideoTrackId));
-  EXPECT_TRUE(video_track->enabled());
-
-  ASSERT_EQ(1u, stream_->GetVideoTracks().size());
-  EXPECT_TRUE(stream_->GetVideoTracks()[0].get() == video_track.get());
-  EXPECT_TRUE(stream_->FindVideoTrack(video_track->id()).get()
-              == video_track.get());
-  video_track = stream_->GetVideoTracks()[0];
-  EXPECT_EQ(0, video_track->id().compare(kVideoTrackId));
-  EXPECT_TRUE(video_track->enabled());
-
-  // Verify the audio track.
-  scoped_refptr<webrtc::MediaStreamTrackInterface> audio_track(
-      stream_->GetAudioTracks()[0]);
-  EXPECT_EQ(0, audio_track->id().compare(kAudioTrackId));
-  EXPECT_TRUE(audio_track->enabled());
-  ASSERT_EQ(1u, stream_->GetAudioTracks().size());
-  EXPECT_TRUE(stream_->GetAudioTracks()[0].get() == audio_track.get());
-  EXPECT_TRUE(stream_->FindAudioTrack(audio_track->id()).get()
-              == audio_track.get());
-  audio_track = stream_->GetAudioTracks()[0];
-  EXPECT_EQ(0, audio_track->id().compare(kAudioTrackId));
-  EXPECT_TRUE(audio_track->enabled());
-}
-
-TEST_F(MediaStreamTest, RemoveTrack) {
-  MockObserver observer(stream_);
-
-  EXPECT_CALL(observer, OnChanged())
-      .Times(Exactly(2));
-
-  EXPECT_TRUE(stream_->RemoveTrack(audio_track_));
-  EXPECT_FALSE(stream_->RemoveTrack(audio_track_));
-  EXPECT_EQ(0u, stream_->GetAudioTracks().size());
-  EXPECT_EQ(0u, stream_->GetAudioTracks().size());
-
-  EXPECT_TRUE(stream_->RemoveTrack(video_track_));
-  EXPECT_FALSE(stream_->RemoveTrack(video_track_));
-
-  EXPECT_EQ(0u, stream_->GetVideoTracks().size());
-  EXPECT_EQ(0u, stream_->GetVideoTracks().size());
-
-  EXPECT_FALSE(stream_->RemoveTrack(static_cast<AudioTrackInterface*>(NULL)));
-  EXPECT_FALSE(stream_->RemoveTrack(static_cast<VideoTrackInterface*>(NULL)));
-}
-
-TEST_F(MediaStreamTest, ChangeVideoTrack) {
-  scoped_refptr<webrtc::VideoTrackInterface> video_track(
-      stream_->GetVideoTracks()[0]);
-  ChangeTrack(video_track.get());
-}
-
-TEST_F(MediaStreamTest, ChangeAudioTrack) {
-  scoped_refptr<webrtc::AudioTrackInterface> audio_track(
-      stream_->GetAudioTracks()[0]);
-  ChangeTrack(audio_track.get());
-}
-
-}  // namespace webrtc
diff --git a/pc/mediastreamobserver.cc b/pc/mediastreamobserver.cc
deleted file mode 100644
index bf17582..0000000
--- a/pc/mediastreamobserver.cc
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- *  Copyright 2015 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/pc/mediastreamobserver.h"
-
-#include <algorithm>
-
-namespace webrtc {
-
-MediaStreamObserver::MediaStreamObserver(MediaStreamInterface* stream)
-    : stream_(stream),
-      cached_audio_tracks_(stream->GetAudioTracks()),
-      cached_video_tracks_(stream->GetVideoTracks()) {
-  stream_->RegisterObserver(this);
-}
-
-MediaStreamObserver::~MediaStreamObserver() {
-  stream_->UnregisterObserver(this);
-}
-
-void MediaStreamObserver::OnChanged() {
-  AudioTrackVector new_audio_tracks = stream_->GetAudioTracks();
-  VideoTrackVector new_video_tracks = stream_->GetVideoTracks();
-
-  // Find removed audio tracks.
-  for (const auto& cached_track : cached_audio_tracks_) {
-    auto it = std::find_if(
-        new_audio_tracks.begin(), new_audio_tracks.end(),
-        [cached_track](const AudioTrackVector::value_type& new_track) {
-          return new_track->id().compare(cached_track->id()) == 0;
-        });
-    if (it == new_audio_tracks.end()) {
-      SignalAudioTrackRemoved(cached_track.get(), stream_);
-    }
-  }
-
-  // Find added audio tracks.
-  for (const auto& new_track : new_audio_tracks) {
-    auto it = std::find_if(
-        cached_audio_tracks_.begin(), cached_audio_tracks_.end(),
-        [new_track](const AudioTrackVector::value_type& cached_track) {
-          return new_track->id().compare(cached_track->id()) == 0;
-        });
-    if (it == cached_audio_tracks_.end()) {
-      SignalAudioTrackAdded(new_track.get(), stream_);
-    }
-  }
-
-  // Find removed video tracks.
-  for (const auto& cached_track : cached_video_tracks_) {
-    auto it = std::find_if(
-        new_video_tracks.begin(), new_video_tracks.end(),
-        [cached_track](const VideoTrackVector::value_type& new_track) {
-          return new_track->id().compare(cached_track->id()) == 0;
-        });
-    if (it == new_video_tracks.end()) {
-      SignalVideoTrackRemoved(cached_track.get(), stream_);
-    }
-  }
-
-  // Find added video tracks.
-  for (const auto& new_track : new_video_tracks) {
-    auto it = std::find_if(
-        cached_video_tracks_.begin(), cached_video_tracks_.end(),
-        [new_track](const VideoTrackVector::value_type& cached_track) {
-          return new_track->id().compare(cached_track->id()) == 0;
-        });
-    if (it == cached_video_tracks_.end()) {
-      SignalVideoTrackAdded(new_track.get(), stream_);
-    }
-  }
-
-  cached_audio_tracks_ = new_audio_tracks;
-  cached_video_tracks_ = new_video_tracks;
-}
-
-}  // namespace webrtc
diff --git a/pc/mediastreamobserver.h b/pc/mediastreamobserver.h
deleted file mode 100644
index d80c732..0000000
--- a/pc/mediastreamobserver.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- *  Copyright 2015 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_PC_MEDIASTREAMOBSERVER_H_
-#define WEBRTC_PC_MEDIASTREAMOBSERVER_H_
-
-#include "webrtc/api/mediastreaminterface.h"
-#include "webrtc/rtc_base/scoped_ref_ptr.h"
-#include "webrtc/rtc_base/sigslot.h"
-
-namespace webrtc {
-
-// Helper class which will listen for changes to a stream and emit the
-// corresponding signals.
-class MediaStreamObserver : public ObserverInterface {
- public:
-  explicit MediaStreamObserver(MediaStreamInterface* stream);
-  ~MediaStreamObserver();
-
-  const MediaStreamInterface* stream() const { return stream_; }
-
-  void OnChanged() override;
-
-  sigslot::signal2<AudioTrackInterface*, MediaStreamInterface*>
-      SignalAudioTrackAdded;
-  sigslot::signal2<AudioTrackInterface*, MediaStreamInterface*>
-      SignalAudioTrackRemoved;
-  sigslot::signal2<VideoTrackInterface*, MediaStreamInterface*>
-      SignalVideoTrackAdded;
-  sigslot::signal2<VideoTrackInterface*, MediaStreamInterface*>
-      SignalVideoTrackRemoved;
-
- private:
-  rtc::scoped_refptr<MediaStreamInterface> stream_;
-  AudioTrackVector cached_audio_tracks_;
-  VideoTrackVector cached_video_tracks_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_PC_MEDIASTREAMOBSERVER_H_
diff --git a/pc/mediastreamtrack.h b/pc/mediastreamtrack.h
deleted file mode 100644
index 0fb2de2..0000000
--- a/pc/mediastreamtrack.h
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- *  Copyright 2011 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_PC_MEDIASTREAMTRACK_H_
-#define WEBRTC_PC_MEDIASTREAMTRACK_H_
-
-#include <string>
-
-#include "webrtc/api/mediastreaminterface.h"
-#include "webrtc/api/notifier.h"
-
-namespace webrtc {
-
-// MediaTrack implements the interface common to AudioTrackInterface and
-// VideoTrackInterface.
-template <typename T>
-class MediaStreamTrack : public Notifier<T> {
- public:
-  typedef typename T::TrackState TypedTrackState;
-
-  std::string id() const override { return id_; }
-  MediaStreamTrackInterface::TrackState state() const override {
-    return state_;
-  }
-  bool enabled() const override { return enabled_; }
-  bool set_enabled(bool enable) override {
-    bool fire_on_change = (enable != enabled_);
-    enabled_ = enable;
-    if (fire_on_change) {
-      Notifier<T>::FireOnChanged();
-    }
-    return fire_on_change;
-  }
-
- protected:
-  explicit MediaStreamTrack(const std::string& id)
-      : enabled_(true), id_(id), state_(MediaStreamTrackInterface::kLive) {}
-
-  bool set_state(MediaStreamTrackInterface::TrackState new_state) {
-    bool fire_on_change = (state_ != new_state);
-    state_ = new_state;
-    if (fire_on_change)
-      Notifier<T>::FireOnChanged();
-    return true;
-  }
-
- private:
-  bool enabled_;
-  std::string id_;
-  MediaStreamTrackInterface::TrackState state_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_PC_MEDIASTREAMTRACK_H_
diff --git a/pc/peerconnection.cc b/pc/peerconnection.cc
deleted file mode 100644
index 64b842b..0000000
--- a/pc/peerconnection.cc
+++ /dev/null
@@ -1,2535 +0,0 @@
-/*
- *  Copyright 2012 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/pc/peerconnection.h"
-
-#include <algorithm>
-#include <utility>
-#include <vector>
-
-#include "webrtc/api/jsepicecandidate.h"
-#include "webrtc/api/jsepsessiondescription.h"
-#include "webrtc/api/mediaconstraintsinterface.h"
-#include "webrtc/api/mediastreamproxy.h"
-#include "webrtc/api/mediastreamtrackproxy.h"
-#include "webrtc/call/call.h"
-#include "webrtc/logging/rtc_event_log/rtc_event_log.h"
-#include "webrtc/media/sctp/sctptransport.h"
-#include "webrtc/pc/audiotrack.h"
-#include "webrtc/pc/channelmanager.h"
-#include "webrtc/pc/dtmfsender.h"
-#include "webrtc/pc/mediastream.h"
-#include "webrtc/pc/mediastreamobserver.h"
-#include "webrtc/pc/remoteaudiosource.h"
-#include "webrtc/pc/rtpreceiver.h"
-#include "webrtc/pc/rtpsender.h"
-#include "webrtc/pc/streamcollection.h"
-#include "webrtc/pc/videocapturertracksource.h"
-#include "webrtc/pc/videotrack.h"
-#include "webrtc/rtc_base/bind.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/stringencode.h"
-#include "webrtc/rtc_base/stringutils.h"
-#include "webrtc/rtc_base/trace_event.h"
-#include "webrtc/system_wrappers/include/clock.h"
-#include "webrtc/system_wrappers/include/field_trial.h"
-
-namespace {
-
-using webrtc::DataChannel;
-using webrtc::MediaConstraintsInterface;
-using webrtc::MediaStreamInterface;
-using webrtc::PeerConnectionInterface;
-using webrtc::RTCError;
-using webrtc::RTCErrorType;
-using webrtc::RtpSenderInternal;
-using webrtc::RtpSenderInterface;
-using webrtc::RtpSenderProxy;
-using webrtc::RtpSenderProxyWithInternal;
-using webrtc::StreamCollection;
-
-static const char kDefaultStreamLabel[] = "default";
-static const char kDefaultAudioTrackLabel[] = "defaulta0";
-static const char kDefaultVideoTrackLabel[] = "defaultv0";
-
-// The length of RTCP CNAMEs.
-static const int kRtcpCnameLength = 16;
-
-enum {
-  MSG_SET_SESSIONDESCRIPTION_SUCCESS = 0,
-  MSG_SET_SESSIONDESCRIPTION_FAILED,
-  MSG_CREATE_SESSIONDESCRIPTION_FAILED,
-  MSG_GETSTATS,
-  MSG_FREE_DATACHANNELS,
-};
-
-struct SetSessionDescriptionMsg : public rtc::MessageData {
-  explicit SetSessionDescriptionMsg(
-      webrtc::SetSessionDescriptionObserver* observer)
-      : observer(observer) {
-  }
-
-  rtc::scoped_refptr<webrtc::SetSessionDescriptionObserver> observer;
-  std::string error;
-};
-
-struct CreateSessionDescriptionMsg : public rtc::MessageData {
-  explicit CreateSessionDescriptionMsg(
-      webrtc::CreateSessionDescriptionObserver* observer)
-      : observer(observer) {}
-
-  rtc::scoped_refptr<webrtc::CreateSessionDescriptionObserver> observer;
-  std::string error;
-};
-
-struct GetStatsMsg : public rtc::MessageData {
-  GetStatsMsg(webrtc::StatsObserver* observer,
-              webrtc::MediaStreamTrackInterface* track)
-      : observer(observer), track(track) {
-  }
-  rtc::scoped_refptr<webrtc::StatsObserver> observer;
-  rtc::scoped_refptr<webrtc::MediaStreamTrackInterface> track;
-};
-
-// Check if we can send |new_stream| on a PeerConnection.
-bool CanAddLocalMediaStream(webrtc::StreamCollectionInterface* current_streams,
-                            webrtc::MediaStreamInterface* new_stream) {
-  if (!new_stream || !current_streams) {
-    return false;
-  }
-  if (current_streams->find(new_stream->label()) != nullptr) {
-    LOG(LS_ERROR) << "MediaStream with label " << new_stream->label()
-                  << " is already added.";
-    return false;
-  }
-  return true;
-}
-
-bool MediaContentDirectionHasSend(cricket::MediaContentDirection dir) {
-  return dir == cricket::MD_SENDONLY || dir == cricket::MD_SENDRECV;
-}
-
-// If the direction is "recvonly" or "inactive", treat the description
-// as containing no streams.
-// See: https://code.google.com/p/webrtc/issues/detail?id=5054
-std::vector<cricket::StreamParams> GetActiveStreams(
-    const cricket::MediaContentDescription* desc) {
-  return MediaContentDirectionHasSend(desc->direction())
-             ? desc->streams()
-             : std::vector<cricket::StreamParams>();
-}
-
-bool IsValidOfferToReceiveMedia(int value) {
-  typedef PeerConnectionInterface::RTCOfferAnswerOptions Options;
-  return (value >= Options::kUndefined) &&
-         (value <= Options::kMaxOfferToReceiveMedia);
-}
-
-// Add options to |[audio/video]_media_description_options| from |senders|.
-void AddRtpSenderOptions(
-    const std::vector<rtc::scoped_refptr<
-        RtpSenderProxyWithInternal<RtpSenderInternal>>>& senders,
-    cricket::MediaDescriptionOptions* audio_media_description_options,
-    cricket::MediaDescriptionOptions* video_media_description_options) {
-  for (const auto& sender : senders) {
-    if (sender->media_type() == cricket::MEDIA_TYPE_AUDIO) {
-      if (audio_media_description_options) {
-        audio_media_description_options->AddAudioSender(
-            sender->id(), sender->internal()->stream_ids());
-      }
-    } else {
-      RTC_DCHECK(sender->media_type() == cricket::MEDIA_TYPE_VIDEO);
-      if (video_media_description_options) {
-        video_media_description_options->AddVideoSender(
-            sender->id(), sender->internal()->stream_ids(), 1);
-      }
-    }
-  }
-}
-
-// Add options to |session_options| from |rtp_data_channels|.
-void AddRtpDataChannelOptions(
-    const std::map<std::string, rtc::scoped_refptr<DataChannel>>&
-        rtp_data_channels,
-    cricket::MediaDescriptionOptions* data_media_description_options) {
-  if (!data_media_description_options) {
-    return;
-  }
-  // Check for data channels.
-  for (const auto& kv : rtp_data_channels) {
-    const DataChannel* channel = kv.second;
-    if (channel->state() == DataChannel::kConnecting ||
-        channel->state() == DataChannel::kOpen) {
-      // Legacy RTP data channels are signaled with the track/stream ID set to
-      // the data channel's label.
-      data_media_description_options->AddRtpDataChannel(channel->label(),
-                                                        channel->label());
-    }
-  }
-}
-
-uint32_t ConvertIceTransportTypeToCandidateFilter(
-    PeerConnectionInterface::IceTransportsType type) {
-  switch (type) {
-    case PeerConnectionInterface::kNone:
-      return cricket::CF_NONE;
-    case PeerConnectionInterface::kRelay:
-      return cricket::CF_RELAY;
-    case PeerConnectionInterface::kNoHost:
-      return (cricket::CF_ALL & ~cricket::CF_HOST);
-    case PeerConnectionInterface::kAll:
-      return cricket::CF_ALL;
-    default:
-      RTC_NOTREACHED();
-  }
-  return cricket::CF_NONE;
-}
-
-// Helper method to set a voice/video channel on all applicable senders
-// and receivers when one is created/destroyed by WebRtcSession.
-//
-// Used by On(Voice|Video)Channel(Created|Destroyed)
-template <class SENDER,
-          class RECEIVER,
-          class CHANNEL,
-          class SENDERS,
-          class RECEIVERS>
-void SetChannelOnSendersAndReceivers(CHANNEL* channel,
-                                     SENDERS& senders,
-                                     RECEIVERS& receivers,
-                                     cricket::MediaType media_type) {
-  for (auto& sender : senders) {
-    if (sender->media_type() == media_type) {
-      static_cast<SENDER*>(sender->internal())->SetChannel(channel);
-    }
-  }
-  for (auto& receiver : receivers) {
-    if (receiver->media_type() == media_type) {
-      if (!channel) {
-        receiver->internal()->Stop();
-      }
-      static_cast<RECEIVER*>(receiver->internal())->SetChannel(channel);
-    }
-  }
-}
-
-// Helper to set an error and return from a method.
-bool SafeSetError(webrtc::RTCErrorType type, webrtc::RTCError* error) {
-  if (error) {
-    error->set_type(type);
-  }
-  return type == webrtc::RTCErrorType::NONE;
-}
-
-bool SafeSetError(webrtc::RTCError error, webrtc::RTCError* error_out) {
-  if (error_out) {
-    *error_out = std::move(error);
-  }
-  return error.ok();
-}
-
-}  // namespace
-
-namespace webrtc {
-
-bool PeerConnectionInterface::RTCConfiguration::operator==(
-    const PeerConnectionInterface::RTCConfiguration& o) const {
-  // This static_assert prevents us from accidentally breaking operator==.
-  // Note: Order matters! Fields must be ordered the same as RTCConfiguration.
-  struct stuff_being_tested_for_equality {
-    IceServers servers;
-    IceTransportsType type;
-    BundlePolicy bundle_policy;
-    RtcpMuxPolicy rtcp_mux_policy;
-    std::vector<rtc::scoped_refptr<rtc::RTCCertificate>> certificates;
-    int ice_candidate_pool_size;
-    bool disable_ipv6;
-    bool disable_ipv6_on_wifi;
-    int max_ipv6_networks;
-    bool enable_rtp_data_channel;
-    rtc::Optional<int> screencast_min_bitrate;
-    rtc::Optional<bool> combined_audio_video_bwe;
-    rtc::Optional<bool> enable_dtls_srtp;
-    TcpCandidatePolicy tcp_candidate_policy;
-    CandidateNetworkPolicy candidate_network_policy;
-    int audio_jitter_buffer_max_packets;
-    bool audio_jitter_buffer_fast_accelerate;
-    int ice_connection_receiving_timeout;
-    int ice_backup_candidate_pair_ping_interval;
-    ContinualGatheringPolicy continual_gathering_policy;
-    bool prioritize_most_likely_ice_candidate_pairs;
-    struct cricket::MediaConfig media_config;
-    bool enable_quic;
-    bool prune_turn_ports;
-    bool presume_writable_when_fully_relayed;
-    bool enable_ice_renomination;
-    bool redetermine_role_on_ice_restart;
-    rtc::Optional<int> ice_check_min_interval;
-    rtc::Optional<rtc::IntervalRange> ice_regather_interval_range;
-  };
-  static_assert(sizeof(stuff_being_tested_for_equality) == sizeof(*this),
-                "Did you add something to RTCConfiguration and forget to "
-                "update operator==?");
-  return type == o.type && servers == o.servers &&
-         bundle_policy == o.bundle_policy &&
-         rtcp_mux_policy == o.rtcp_mux_policy &&
-         tcp_candidate_policy == o.tcp_candidate_policy &&
-         candidate_network_policy == o.candidate_network_policy &&
-         audio_jitter_buffer_max_packets == o.audio_jitter_buffer_max_packets &&
-         audio_jitter_buffer_fast_accelerate ==
-             o.audio_jitter_buffer_fast_accelerate &&
-         ice_connection_receiving_timeout ==
-             o.ice_connection_receiving_timeout &&
-         ice_backup_candidate_pair_ping_interval ==
-             o.ice_backup_candidate_pair_ping_interval &&
-         continual_gathering_policy == o.continual_gathering_policy &&
-         certificates == o.certificates &&
-         prioritize_most_likely_ice_candidate_pairs ==
-             o.prioritize_most_likely_ice_candidate_pairs &&
-         media_config == o.media_config && disable_ipv6 == o.disable_ipv6 &&
-         disable_ipv6_on_wifi == o.disable_ipv6_on_wifi &&
-         max_ipv6_networks == o.max_ipv6_networks &&
-         enable_rtp_data_channel == o.enable_rtp_data_channel &&
-         enable_quic == o.enable_quic &&
-         screencast_min_bitrate == o.screencast_min_bitrate &&
-         combined_audio_video_bwe == o.combined_audio_video_bwe &&
-         enable_dtls_srtp == o.enable_dtls_srtp &&
-         ice_candidate_pool_size == o.ice_candidate_pool_size &&
-         prune_turn_ports == o.prune_turn_ports &&
-         presume_writable_when_fully_relayed ==
-             o.presume_writable_when_fully_relayed &&
-         enable_ice_renomination == o.enable_ice_renomination &&
-         redetermine_role_on_ice_restart == o.redetermine_role_on_ice_restart &&
-         ice_check_min_interval == o.ice_check_min_interval &&
-         ice_regather_interval_range == o.ice_regather_interval_range;
-}
-
-bool PeerConnectionInterface::RTCConfiguration::operator!=(
-    const PeerConnectionInterface::RTCConfiguration& o) const {
-  return !(*this == o);
-}
-
-// Generate a RTCP CNAME when a PeerConnection is created.
-std::string GenerateRtcpCname() {
-  std::string cname;
-  if (!rtc::CreateRandomString(kRtcpCnameLength, &cname)) {
-    LOG(LS_ERROR) << "Failed to generate CNAME.";
-    RTC_NOTREACHED();
-  }
-  return cname;
-}
-
-bool ValidateOfferAnswerOptions(
-    const PeerConnectionInterface::RTCOfferAnswerOptions& rtc_options) {
-  return IsValidOfferToReceiveMedia(rtc_options.offer_to_receive_audio) &&
-         IsValidOfferToReceiveMedia(rtc_options.offer_to_receive_video);
-}
-
-// From |rtc_options|, fill parts of |session_options| shared by all generated
-// m= sections (in other words, nothing that involves a map/array).
-void ExtractSharedMediaSessionOptions(
-    const PeerConnectionInterface::RTCOfferAnswerOptions& rtc_options,
-    cricket::MediaSessionOptions* session_options) {
-  session_options->vad_enabled = rtc_options.voice_activity_detection;
-  session_options->bundle_enabled = rtc_options.use_rtp_mux;
-}
-
-bool ConvertConstraintsToOfferAnswerOptions(
-    const MediaConstraintsInterface* constraints,
-    PeerConnectionInterface::RTCOfferAnswerOptions* offer_answer_options) {
-  if (!constraints) {
-    return true;
-  }
-
-  bool value = false;
-  size_t mandatory_constraints_satisfied = 0;
-
-  if (FindConstraint(constraints,
-                     MediaConstraintsInterface::kOfferToReceiveAudio, &value,
-                     &mandatory_constraints_satisfied)) {
-    offer_answer_options->offer_to_receive_audio =
-        value ? PeerConnectionInterface::RTCOfferAnswerOptions::
-                    kOfferToReceiveMediaTrue
-              : 0;
-  }
-
-  if (FindConstraint(constraints,
-                     MediaConstraintsInterface::kOfferToReceiveVideo, &value,
-                     &mandatory_constraints_satisfied)) {
-    offer_answer_options->offer_to_receive_video =
-        value ? PeerConnectionInterface::RTCOfferAnswerOptions::
-                    kOfferToReceiveMediaTrue
-              : 0;
-  }
-  if (FindConstraint(constraints,
-                     MediaConstraintsInterface::kVoiceActivityDetection, &value,
-                     &mandatory_constraints_satisfied)) {
-    offer_answer_options->voice_activity_detection = value;
-  }
-  if (FindConstraint(constraints, MediaConstraintsInterface::kUseRtpMux, &value,
-                     &mandatory_constraints_satisfied)) {
-    offer_answer_options->use_rtp_mux = value;
-  }
-  if (FindConstraint(constraints, MediaConstraintsInterface::kIceRestart,
-                     &value, &mandatory_constraints_satisfied)) {
-    offer_answer_options->ice_restart = value;
-  }
-
-  return mandatory_constraints_satisfied == constraints->GetMandatory().size();
-}
-
-PeerConnection::PeerConnection(PeerConnectionFactory* factory,
-                               std::unique_ptr<RtcEventLog> event_log,
-                               std::unique_ptr<Call> call)
-    : factory_(factory),
-      observer_(NULL),
-      uma_observer_(NULL),
-      event_log_(std::move(event_log)),
-      signaling_state_(kStable),
-      ice_connection_state_(kIceConnectionNew),
-      ice_gathering_state_(kIceGatheringNew),
-      rtcp_cname_(GenerateRtcpCname()),
-      local_streams_(StreamCollection::Create()),
-      remote_streams_(StreamCollection::Create()),
-      call_(std::move(call)) {}
-
-PeerConnection::~PeerConnection() {
-  TRACE_EVENT0("webrtc", "PeerConnection::~PeerConnection");
-  RTC_DCHECK(signaling_thread()->IsCurrent());
-  // Need to detach RTP senders/receivers from WebRtcSession,
-  // since it's about to be destroyed.
-  for (const auto& sender : senders_) {
-    sender->internal()->Stop();
-  }
-  for (const auto& receiver : receivers_) {
-    receiver->internal()->Stop();
-  }
-  // Destroy stats_ because it depends on session_.
-  stats_.reset(nullptr);
-  if (stats_collector_) {
-    stats_collector_->WaitForPendingRequest();
-    stats_collector_ = nullptr;
-  }
-  // Now destroy session_ before destroying other members,
-  // because its destruction fires signals (such as VoiceChannelDestroyed)
-  // which will trigger some final actions in PeerConnection...
-  session_.reset(nullptr);
-  // port_allocator_ lives on the network thread and should be destroyed there.
-  network_thread()->Invoke<void>(RTC_FROM_HERE,
-                                 [this] { port_allocator_.reset(); });
-  // call_ and event_log_ must be destroyed on the worker thread.
-  factory_->worker_thread()->Invoke<void>(RTC_FROM_HERE, [this] {
-    call_.reset();
-    event_log_.reset();
-  });
-}
-
-bool PeerConnection::Initialize(
-    const PeerConnectionInterface::RTCConfiguration& configuration,
-    std::unique_ptr<cricket::PortAllocator> allocator,
-    std::unique_ptr<rtc::RTCCertificateGeneratorInterface> cert_generator,
-    PeerConnectionObserver* observer) {
-  TRACE_EVENT0("webrtc", "PeerConnection::Initialize");
-
-  RTCError config_error = ValidateConfiguration(configuration);
-  if (!config_error.ok()) {
-    LOG(LS_ERROR) << "Invalid configuration: " << config_error.message();
-    return false;
-  }
-
-  if (!allocator) {
-    LOG(LS_ERROR) << "PeerConnection initialized without a PortAllocator? "
-                  << "This shouldn't happen if using PeerConnectionFactory.";
-    return false;
-  }
-  if (!observer) {
-    // TODO(deadbeef): Why do we do this?
-    LOG(LS_ERROR) << "PeerConnection initialized without a "
-                  << "PeerConnectionObserver";
-    return false;
-  }
-  observer_ = observer;
-  port_allocator_ = std::move(allocator);
-
-  // The port allocator lives on the network thread and should be initialized
-  // there.
-  if (!network_thread()->Invoke<bool>(
-          RTC_FROM_HERE, rtc::Bind(&PeerConnection::InitializePortAllocator_n,
-                                   this, configuration))) {
-    return false;
-  }
-
-
-  session_.reset(new WebRtcSession(
-      call_.get(), factory_->channel_manager(), configuration.media_config,
-      event_log_.get(),
-      factory_->network_thread(),
-      factory_->worker_thread(), factory_->signaling_thread(),
-      port_allocator_.get(),
-      std::unique_ptr<cricket::TransportController>(
-          factory_->CreateTransportController(
-              port_allocator_.get(),
-              configuration.redetermine_role_on_ice_restart)),
-#ifdef HAVE_SCTP
-      std::unique_ptr<cricket::SctpTransportInternalFactory>(
-          new cricket::SctpTransportFactory(factory_->network_thread()))
-#else
-      nullptr
-#endif
-          ));
-
-  stats_.reset(new StatsCollector(this));
-  stats_collector_ = RTCStatsCollector::Create(this);
-
-  // Initialize the WebRtcSession. It creates transport channels etc.
-  if (!session_->Initialize(factory_->options(), std::move(cert_generator),
-                            configuration)) {
-    return false;
-  }
-
-  // Register PeerConnection as receiver of local ice candidates.
-  // All the callbacks will be posted to the application from PeerConnection.
-  session_->RegisterIceObserver(this);
-  session_->SignalState.connect(this, &PeerConnection::OnSessionStateChange);
-  session_->SignalVoiceChannelCreated.connect(
-      this, &PeerConnection::OnVoiceChannelCreated);
-  session_->SignalVoiceChannelDestroyed.connect(
-      this, &PeerConnection::OnVoiceChannelDestroyed);
-  session_->SignalVideoChannelCreated.connect(
-      this, &PeerConnection::OnVideoChannelCreated);
-  session_->SignalVideoChannelDestroyed.connect(
-      this, &PeerConnection::OnVideoChannelDestroyed);
-  session_->SignalDataChannelCreated.connect(
-      this, &PeerConnection::OnDataChannelCreated);
-  session_->SignalDataChannelDestroyed.connect(
-      this, &PeerConnection::OnDataChannelDestroyed);
-  session_->SignalDataChannelOpenMessage.connect(
-      this, &PeerConnection::OnDataChannelOpenMessage);
-
-  configuration_ = configuration;
-  return true;
-}
-
-RTCError PeerConnection::ValidateConfiguration(
-    const RTCConfiguration& config) const {
-  if (config.ice_regather_interval_range &&
-      config.continual_gathering_policy == GATHER_ONCE) {
-    return RTCError(RTCErrorType::INVALID_PARAMETER,
-                    "ice_regather_interval_range specified but continual "
-                    "gathering policy is GATHER_ONCE");
-  }
-  return RTCError::OK();
-}
-
-rtc::scoped_refptr<StreamCollectionInterface>
-PeerConnection::local_streams() {
-  return local_streams_;
-}
-
-rtc::scoped_refptr<StreamCollectionInterface>
-PeerConnection::remote_streams() {
-  return remote_streams_;
-}
-
-bool PeerConnection::AddStream(MediaStreamInterface* local_stream) {
-  TRACE_EVENT0("webrtc", "PeerConnection::AddStream");
-  if (IsClosed()) {
-    return false;
-  }
-  if (!CanAddLocalMediaStream(local_streams_, local_stream)) {
-    return false;
-  }
-
-  local_streams_->AddStream(local_stream);
-  MediaStreamObserver* observer = new MediaStreamObserver(local_stream);
-  observer->SignalAudioTrackAdded.connect(this,
-                                          &PeerConnection::OnAudioTrackAdded);
-  observer->SignalAudioTrackRemoved.connect(
-      this, &PeerConnection::OnAudioTrackRemoved);
-  observer->SignalVideoTrackAdded.connect(this,
-                                          &PeerConnection::OnVideoTrackAdded);
-  observer->SignalVideoTrackRemoved.connect(
-      this, &PeerConnection::OnVideoTrackRemoved);
-  stream_observers_.push_back(std::unique_ptr<MediaStreamObserver>(observer));
-
-  for (const auto& track : local_stream->GetAudioTracks()) {
-    AddAudioTrack(track.get(), local_stream);
-  }
-  for (const auto& track : local_stream->GetVideoTracks()) {
-    AddVideoTrack(track.get(), local_stream);
-  }
-
-  stats_->AddStream(local_stream);
-  observer_->OnRenegotiationNeeded();
-  return true;
-}
-
-void PeerConnection::RemoveStream(MediaStreamInterface* local_stream) {
-  TRACE_EVENT0("webrtc", "PeerConnection::RemoveStream");
-  if (!IsClosed()) {
-    for (const auto& track : local_stream->GetAudioTracks()) {
-      RemoveAudioTrack(track.get(), local_stream);
-    }
-    for (const auto& track : local_stream->GetVideoTracks()) {
-      RemoveVideoTrack(track.get(), local_stream);
-    }
-  }
-  local_streams_->RemoveStream(local_stream);
-  stream_observers_.erase(
-      std::remove_if(
-          stream_observers_.begin(), stream_observers_.end(),
-          [local_stream](const std::unique_ptr<MediaStreamObserver>& observer) {
-            return observer->stream()->label().compare(local_stream->label()) ==
-                   0;
-          }),
-      stream_observers_.end());
-
-  if (IsClosed()) {
-    return;
-  }
-  observer_->OnRenegotiationNeeded();
-}
-
-rtc::scoped_refptr<RtpSenderInterface> PeerConnection::AddTrack(
-    MediaStreamTrackInterface* track,
-    std::vector<MediaStreamInterface*> streams) {
-  TRACE_EVENT0("webrtc", "PeerConnection::AddTrack");
-  if (IsClosed()) {
-    return nullptr;
-  }
-  if (streams.size() >= 2) {
-    LOG(LS_ERROR)
-        << "Adding a track with two streams is not currently supported.";
-    return nullptr;
-  }
-  // TODO(deadbeef): Support adding a track to two different senders.
-  if (FindSenderForTrack(track) != senders_.end()) {
-    LOG(LS_ERROR) << "Sender for track " << track->id() << " already exists.";
-    return nullptr;
-  }
-
-  // TODO(deadbeef): Support adding a track to multiple streams.
-  rtc::scoped_refptr<RtpSenderProxyWithInternal<RtpSenderInternal>> new_sender;
-  if (track->kind() == MediaStreamTrackInterface::kAudioKind) {
-    new_sender = RtpSenderProxyWithInternal<RtpSenderInternal>::Create(
-        signaling_thread(),
-        new AudioRtpSender(static_cast<AudioTrackInterface*>(track),
-                           session_->voice_channel(), stats_.get()));
-    if (!streams.empty()) {
-      new_sender->internal()->set_stream_id(streams[0]->label());
-    }
-    const TrackInfo* track_info = FindTrackInfo(
-        local_audio_tracks_, new_sender->internal()->stream_id(), track->id());
-    if (track_info) {
-      new_sender->internal()->SetSsrc(track_info->ssrc);
-    }
-  } else if (track->kind() == MediaStreamTrackInterface::kVideoKind) {
-    new_sender = RtpSenderProxyWithInternal<RtpSenderInternal>::Create(
-        signaling_thread(),
-        new VideoRtpSender(static_cast<VideoTrackInterface*>(track),
-                           session_->video_channel()));
-    if (!streams.empty()) {
-      new_sender->internal()->set_stream_id(streams[0]->label());
-    }
-    const TrackInfo* track_info = FindTrackInfo(
-        local_video_tracks_, new_sender->internal()->stream_id(), track->id());
-    if (track_info) {
-      new_sender->internal()->SetSsrc(track_info->ssrc);
-    }
-  } else {
-    LOG(LS_ERROR) << "CreateSender called with invalid kind: " << track->kind();
-    return rtc::scoped_refptr<RtpSenderInterface>();
-  }
-
-  senders_.push_back(new_sender);
-  observer_->OnRenegotiationNeeded();
-  return new_sender;
-}
-
-bool PeerConnection::RemoveTrack(RtpSenderInterface* sender) {
-  TRACE_EVENT0("webrtc", "PeerConnection::RemoveTrack");
-  if (IsClosed()) {
-    return false;
-  }
-
-  auto it = std::find(senders_.begin(), senders_.end(), sender);
-  if (it == senders_.end()) {
-    LOG(LS_ERROR) << "Couldn't find sender " << sender->id() << " to remove.";
-    return false;
-  }
-  (*it)->internal()->Stop();
-  senders_.erase(it);
-
-  observer_->OnRenegotiationNeeded();
-  return true;
-}
-
-rtc::scoped_refptr<DtmfSenderInterface> PeerConnection::CreateDtmfSender(
-    AudioTrackInterface* track) {
-  TRACE_EVENT0("webrtc", "PeerConnection::CreateDtmfSender");
-  if (IsClosed()) {
-    return nullptr;
-  }
-  if (!track) {
-    LOG(LS_ERROR) << "CreateDtmfSender - track is NULL.";
-    return nullptr;
-  }
-  auto it = FindSenderForTrack(track);
-  if (it == senders_.end()) {
-    LOG(LS_ERROR) << "CreateDtmfSender called with a non-added track.";
-    return nullptr;
-  }
-
-  return (*it)->GetDtmfSender();
-}
-
-rtc::scoped_refptr<RtpSenderInterface> PeerConnection::CreateSender(
-    const std::string& kind,
-    const std::string& stream_id) {
-  TRACE_EVENT0("webrtc", "PeerConnection::CreateSender");
-  if (IsClosed()) {
-    return nullptr;
-  }
-  rtc::scoped_refptr<RtpSenderProxyWithInternal<RtpSenderInternal>> new_sender;
-  if (kind == MediaStreamTrackInterface::kAudioKind) {
-    new_sender = RtpSenderProxyWithInternal<RtpSenderInternal>::Create(
-        signaling_thread(),
-        new AudioRtpSender(session_->voice_channel(), stats_.get()));
-  } else if (kind == MediaStreamTrackInterface::kVideoKind) {
-    new_sender = RtpSenderProxyWithInternal<RtpSenderInternal>::Create(
-        signaling_thread(), new VideoRtpSender(session_->video_channel()));
-  } else {
-    LOG(LS_ERROR) << "CreateSender called with invalid kind: " << kind;
-    return new_sender;
-  }
-  if (!stream_id.empty()) {
-    new_sender->internal()->set_stream_id(stream_id);
-  }
-  senders_.push_back(new_sender);
-  return new_sender;
-}
-
-std::vector<rtc::scoped_refptr<RtpSenderInterface>> PeerConnection::GetSenders()
-    const {
-  std::vector<rtc::scoped_refptr<RtpSenderInterface>> ret;
-  for (const auto& sender : senders_) {
-    ret.push_back(sender.get());
-  }
-  return ret;
-}
-
-std::vector<rtc::scoped_refptr<RtpReceiverInterface>>
-PeerConnection::GetReceivers() const {
-  std::vector<rtc::scoped_refptr<RtpReceiverInterface>> ret;
-  for (const auto& receiver : receivers_) {
-    ret.push_back(receiver.get());
-  }
-  return ret;
-}
-
-bool PeerConnection::GetStats(StatsObserver* observer,
-                              MediaStreamTrackInterface* track,
-                              StatsOutputLevel level) {
-  TRACE_EVENT0("webrtc", "PeerConnection::GetStats");
-  RTC_DCHECK(signaling_thread()->IsCurrent());
-  if (!observer) {
-    LOG(LS_ERROR) << "GetStats - observer is NULL.";
-    return false;
-  }
-
-  stats_->UpdateStats(level);
-  // The StatsCollector is used to tell if a track is valid because it may
-  // remember tracks that the PeerConnection previously removed.
-  if (track && !stats_->IsValidTrack(track->id())) {
-    LOG(LS_WARNING) << "GetStats is called with an invalid track: "
-                    << track->id();
-    return false;
-  }
-  signaling_thread()->Post(RTC_FROM_HERE, this, MSG_GETSTATS,
-                           new GetStatsMsg(observer, track));
-  return true;
-}
-
-void PeerConnection::GetStats(RTCStatsCollectorCallback* callback) {
-  RTC_DCHECK(stats_collector_);
-  stats_collector_->GetStatsReport(callback);
-}
-
-PeerConnectionInterface::SignalingState PeerConnection::signaling_state() {
-  return signaling_state_;
-}
-
-PeerConnectionInterface::IceConnectionState
-PeerConnection::ice_connection_state() {
-  return ice_connection_state_;
-}
-
-PeerConnectionInterface::IceGatheringState
-PeerConnection::ice_gathering_state() {
-  return ice_gathering_state_;
-}
-
-rtc::scoped_refptr<DataChannelInterface>
-PeerConnection::CreateDataChannel(
-    const std::string& label,
-    const DataChannelInit* config) {
-  TRACE_EVENT0("webrtc", "PeerConnection::CreateDataChannel");
-#ifdef HAVE_QUIC
-  if (session_->data_channel_type() == cricket::DCT_QUIC) {
-    // TODO(zhihuang): Handle case when config is NULL.
-    if (!config) {
-      LOG(LS_ERROR) << "Missing config for QUIC data channel.";
-      return nullptr;
-    }
-    // TODO(zhihuang): Allow unreliable or ordered QUIC data channels.
-    if (!config->reliable || config->ordered) {
-      LOG(LS_ERROR) << "QUIC data channel does not implement unreliable or "
-                       "ordered delivery.";
-      return nullptr;
-    }
-    return session_->quic_data_transport()->CreateDataChannel(label, config);
-  }
-#endif  // HAVE_QUIC
-
-  bool first_datachannel = !HasDataChannels();
-
-  std::unique_ptr<InternalDataChannelInit> internal_config;
-  if (config) {
-    internal_config.reset(new InternalDataChannelInit(*config));
-  }
-  rtc::scoped_refptr<DataChannelInterface> channel(
-      InternalCreateDataChannel(label, internal_config.get()));
-  if (!channel.get()) {
-    return nullptr;
-  }
-
-  // Trigger the onRenegotiationNeeded event for every new RTP DataChannel, or
-  // the first SCTP DataChannel.
-  if (session_->data_channel_type() == cricket::DCT_RTP || first_datachannel) {
-    observer_->OnRenegotiationNeeded();
-  }
-
-  return DataChannelProxy::Create(signaling_thread(), channel.get());
-}
-
-void PeerConnection::CreateOffer(CreateSessionDescriptionObserver* observer,
-                                 const MediaConstraintsInterface* constraints) {
-  TRACE_EVENT0("webrtc", "PeerConnection::CreateOffer");
-  if (!observer) {
-    LOG(LS_ERROR) << "CreateOffer - observer is NULL.";
-    return;
-  }
-  PeerConnectionInterface::RTCOfferAnswerOptions offer_answer_options;
-  // Always create an offer even if |ConvertConstraintsToOfferAnswerOptions|
-  // returns false for now. Because |ConvertConstraintsToOfferAnswerOptions|
-  // compares the mandatory fields parsed with the mandatory fields added in the
-  // |constraints| and some downstream applications might create offers with
-  // mandatory fields which would not be parsed in the helper method. For
-  // example, in Chromium/remoting, |kEnableDtlsSrtp| is added to the
-  // |constraints| as a mandatory field but it is not parsed.
-  ConvertConstraintsToOfferAnswerOptions(constraints, &offer_answer_options);
-
-  CreateOffer(observer, offer_answer_options);
-}
-
-void PeerConnection::CreateOffer(CreateSessionDescriptionObserver* observer,
-                                 const RTCOfferAnswerOptions& options) {
-  TRACE_EVENT0("webrtc", "PeerConnection::CreateOffer");
-  if (!observer) {
-    LOG(LS_ERROR) << "CreateOffer - observer is NULL.";
-    return;
-  }
-
-  if (!ValidateOfferAnswerOptions(options)) {
-    std::string error = "CreateOffer called with invalid options.";
-    LOG(LS_ERROR) << error;
-    PostCreateSessionDescriptionFailure(observer, error);
-    return;
-  }
-
-  cricket::MediaSessionOptions session_options;
-  GetOptionsForOffer(options, &session_options);
-  session_->CreateOffer(observer, options, session_options);
-}
-
-void PeerConnection::CreateAnswer(
-    CreateSessionDescriptionObserver* observer,
-    const MediaConstraintsInterface* constraints) {
-  TRACE_EVENT0("webrtc", "PeerConnection::CreateAnswer");
-  if (!observer) {
-    LOG(LS_ERROR) << "CreateAnswer - observer is NULL.";
-    return;
-  }
-
-  if (!session_->remote_description() ||
-      session_->remote_description()->type() !=
-          SessionDescriptionInterface::kOffer) {
-    std::string error = "CreateAnswer called without remote offer.";
-    LOG(LS_ERROR) << error;
-    PostCreateSessionDescriptionFailure(observer, error);
-    return;
-  }
-
-  PeerConnectionInterface::RTCOfferAnswerOptions offer_answer_options;
-  if (!ConvertConstraintsToOfferAnswerOptions(constraints,
-                                              &offer_answer_options)) {
-    std::string error = "CreateAnswer called with invalid constraints.";
-    LOG(LS_ERROR) << error;
-    PostCreateSessionDescriptionFailure(observer, error);
-    return;
-  }
-
-  cricket::MediaSessionOptions session_options;
-  GetOptionsForAnswer(offer_answer_options, &session_options);
-  session_->CreateAnswer(observer, session_options);
-}
-
-void PeerConnection::CreateAnswer(CreateSessionDescriptionObserver* observer,
-                                  const RTCOfferAnswerOptions& options) {
-  TRACE_EVENT0("webrtc", "PeerConnection::CreateAnswer");
-  if (!observer) {
-    LOG(LS_ERROR) << "CreateAnswer - observer is NULL.";
-    return;
-  }
-
-  cricket::MediaSessionOptions session_options;
-  GetOptionsForAnswer(options, &session_options);
-
-  session_->CreateAnswer(observer, session_options);
-}
-
-void PeerConnection::SetLocalDescription(
-    SetSessionDescriptionObserver* observer,
-    SessionDescriptionInterface* desc) {
-  TRACE_EVENT0("webrtc", "PeerConnection::SetLocalDescription");
-  if (IsClosed()) {
-    return;
-  }
-  if (!observer) {
-    LOG(LS_ERROR) << "SetLocalDescription - observer is NULL.";
-    return;
-  }
-  if (!desc) {
-    PostSetSessionDescriptionFailure(observer, "SessionDescription is NULL.");
-    return;
-  }
-  // Update stats here so that we have the most recent stats for tracks and
-  // streams that might be removed by updating the session description.
-  stats_->UpdateStats(kStatsOutputLevelStandard);
-  std::string error;
-  if (!session_->SetLocalDescription(desc, &error)) {
-    PostSetSessionDescriptionFailure(observer, error);
-    return;
-  }
-
-  // If setting the description decided our SSL role, allocate any necessary
-  // SCTP sids.
-  rtc::SSLRole role;
-  if (session_->data_channel_type() == cricket::DCT_SCTP &&
-      session_->GetSctpSslRole(&role)) {
-    AllocateSctpSids(role);
-  }
-
-  // Update state and SSRC of local MediaStreams and DataChannels based on the
-  // local session description.
-  const cricket::ContentInfo* audio_content =
-      GetFirstAudioContent(desc->description());
-  if (audio_content) {
-    if (audio_content->rejected) {
-      RemoveTracks(cricket::MEDIA_TYPE_AUDIO);
-    } else {
-      const cricket::AudioContentDescription* audio_desc =
-          static_cast<const cricket::AudioContentDescription*>(
-              audio_content->description);
-      UpdateLocalTracks(audio_desc->streams(), audio_desc->type());
-    }
-  }
-
-  const cricket::ContentInfo* video_content =
-      GetFirstVideoContent(desc->description());
-  if (video_content) {
-    if (video_content->rejected) {
-      RemoveTracks(cricket::MEDIA_TYPE_VIDEO);
-    } else {
-      const cricket::VideoContentDescription* video_desc =
-          static_cast<const cricket::VideoContentDescription*>(
-              video_content->description);
-      UpdateLocalTracks(video_desc->streams(), video_desc->type());
-    }
-  }
-
-  const cricket::ContentInfo* data_content =
-      GetFirstDataContent(desc->description());
-  if (data_content) {
-    const cricket::DataContentDescription* data_desc =
-        static_cast<const cricket::DataContentDescription*>(
-            data_content->description);
-    if (rtc::starts_with(data_desc->protocol().data(),
-                         cricket::kMediaProtocolRtpPrefix)) {
-      UpdateLocalRtpDataChannels(data_desc->streams());
-    }
-  }
-
-  SetSessionDescriptionMsg* msg = new SetSessionDescriptionMsg(observer);
-  signaling_thread()->Post(RTC_FROM_HERE, this,
-                           MSG_SET_SESSIONDESCRIPTION_SUCCESS, msg);
-
-  // According to JSEP, after setLocalDescription, changing the candidate pool
-  // size is not allowed, and changing the set of ICE servers will not result
-  // in new candidates being gathered.
-  port_allocator_->FreezeCandidatePool();
-
-  // MaybeStartGathering needs to be called after posting
-  // MSG_SET_SESSIONDESCRIPTION_SUCCESS, so that we don't signal any candidates
-  // before signaling that SetLocalDescription completed.
-  session_->MaybeStartGathering();
-
-  if (desc->type() == SessionDescriptionInterface::kAnswer) {
-    // TODO(deadbeef): We already had to hop to the network thread for
-    // MaybeStartGathering...
-    network_thread()->Invoke<void>(
-        RTC_FROM_HERE,
-        rtc::Bind(&cricket::PortAllocator::DiscardCandidatePool,
-                  port_allocator_.get()));
-  }
-}
-
-void PeerConnection::SetRemoteDescription(
-    SetSessionDescriptionObserver* observer,
-    SessionDescriptionInterface* desc) {
-  TRACE_EVENT0("webrtc", "PeerConnection::SetRemoteDescription");
-  if (IsClosed()) {
-    return;
-  }
-  if (!observer) {
-    LOG(LS_ERROR) << "SetRemoteDescription - observer is NULL.";
-    return;
-  }
-  if (!desc) {
-    PostSetSessionDescriptionFailure(observer, "SessionDescription is NULL.");
-    return;
-  }
-  // Update stats here so that we have the most recent stats for tracks and
-  // streams that might be removed by updating the session description.
-  stats_->UpdateStats(kStatsOutputLevelStandard);
-  std::string error;
-  if (!session_->SetRemoteDescription(desc, &error)) {
-    PostSetSessionDescriptionFailure(observer, error);
-    return;
-  }
-
-  // If setting the description decided our SSL role, allocate any necessary
-  // SCTP sids.
-  rtc::SSLRole role;
-  if (session_->data_channel_type() == cricket::DCT_SCTP &&
-      session_->GetSctpSslRole(&role)) {
-    AllocateSctpSids(role);
-  }
-
-  const cricket::SessionDescription* remote_desc = desc->description();
-  const cricket::ContentInfo* audio_content = GetFirstAudioContent(remote_desc);
-  const cricket::ContentInfo* video_content = GetFirstVideoContent(remote_desc);
-  const cricket::AudioContentDescription* audio_desc =
-      GetFirstAudioContentDescription(remote_desc);
-  const cricket::VideoContentDescription* video_desc =
-      GetFirstVideoContentDescription(remote_desc);
-  const cricket::DataContentDescription* data_desc =
-      GetFirstDataContentDescription(remote_desc);
-
-  // Check if the descriptions include streams, just in case the peer supports
-  // MSID, but doesn't indicate so with "a=msid-semantic".
-  if (remote_desc->msid_supported() ||
-      (audio_desc && !audio_desc->streams().empty()) ||
-      (video_desc && !video_desc->streams().empty())) {
-    remote_peer_supports_msid_ = true;
-  }
-
-  // We wait to signal new streams until we finish processing the description,
-  // since only at that point will new streams have all their tracks.
-  rtc::scoped_refptr<StreamCollection> new_streams(StreamCollection::Create());
-
-  // Find all audio rtp streams and create corresponding remote AudioTracks
-  // and MediaStreams.
-  if (audio_content) {
-    if (audio_content->rejected) {
-      RemoveTracks(cricket::MEDIA_TYPE_AUDIO);
-    } else {
-      bool default_audio_track_needed =
-          !remote_peer_supports_msid_ &&
-          MediaContentDirectionHasSend(audio_desc->direction());
-      UpdateRemoteStreamsList(GetActiveStreams(audio_desc),
-                              default_audio_track_needed, audio_desc->type(),
-                              new_streams);
-    }
-  }
-
-  // Find all video rtp streams and create corresponding remote VideoTracks
-  // and MediaStreams.
-  if (video_content) {
-    if (video_content->rejected) {
-      RemoveTracks(cricket::MEDIA_TYPE_VIDEO);
-    } else {
-      bool default_video_track_needed =
-          !remote_peer_supports_msid_ &&
-          MediaContentDirectionHasSend(video_desc->direction());
-      UpdateRemoteStreamsList(GetActiveStreams(video_desc),
-                              default_video_track_needed, video_desc->type(),
-                              new_streams);
-    }
-  }
-
-  // Update the DataChannels with the information from the remote peer.
-  if (data_desc) {
-    if (rtc::starts_with(data_desc->protocol().data(),
-                         cricket::kMediaProtocolRtpPrefix)) {
-      UpdateRemoteRtpDataChannels(GetActiveStreams(data_desc));
-    }
-  }
-
-  // Iterate new_streams and notify the observer about new MediaStreams.
-  for (size_t i = 0; i < new_streams->count(); ++i) {
-    MediaStreamInterface* new_stream = new_streams->at(i);
-    stats_->AddStream(new_stream);
-    observer_->OnAddStream(
-        rtc::scoped_refptr<MediaStreamInterface>(new_stream));
-  }
-
-  UpdateEndedRemoteMediaStreams();
-
-  SetSessionDescriptionMsg* msg = new SetSessionDescriptionMsg(observer);
-  signaling_thread()->Post(RTC_FROM_HERE, this,
-                           MSG_SET_SESSIONDESCRIPTION_SUCCESS, msg);
-
-  if (desc->type() == SessionDescriptionInterface::kAnswer) {
-    // TODO(deadbeef): We already had to hop to the network thread for
-    // MaybeStartGathering...
-    network_thread()->Invoke<void>(
-        RTC_FROM_HERE,
-        rtc::Bind(&cricket::PortAllocator::DiscardCandidatePool,
-                  port_allocator_.get()));
-  }
-}
-
-PeerConnectionInterface::RTCConfiguration PeerConnection::GetConfiguration() {
-  return configuration_;
-}
-
-bool PeerConnection::SetConfiguration(const RTCConfiguration& configuration,
-                                      RTCError* error) {
-  TRACE_EVENT0("webrtc", "PeerConnection::SetConfiguration");
-
-  if (session_->local_description() &&
-      configuration.ice_candidate_pool_size !=
-          configuration_.ice_candidate_pool_size) {
-    LOG(LS_ERROR) << "Can't change candidate pool size after calling "
-                     "SetLocalDescription.";
-    return SafeSetError(RTCErrorType::INVALID_MODIFICATION, error);
-  }
-
-  // The simplest (and most future-compatible) way to tell if the config was
-  // modified in an invalid way is to copy each property we do support
-  // modifying, then use operator==. There are far more properties we don't
-  // support modifying than those we do, and more could be added.
-  RTCConfiguration modified_config = configuration_;
-  modified_config.servers = configuration.servers;
-  modified_config.type = configuration.type;
-  modified_config.ice_candidate_pool_size =
-      configuration.ice_candidate_pool_size;
-  modified_config.prune_turn_ports = configuration.prune_turn_ports;
-  modified_config.ice_check_min_interval = configuration.ice_check_min_interval;
-  if (configuration != modified_config) {
-    LOG(LS_ERROR) << "Modifying the configuration in an unsupported way.";
-    return SafeSetError(RTCErrorType::INVALID_MODIFICATION, error);
-  }
-
-  // Validate the modified configuration.
-  RTCError validate_error = ValidateConfiguration(modified_config);
-  if (!validate_error.ok()) {
-    return SafeSetError(std::move(validate_error), error);
-  }
-
-  // Note that this isn't possible through chromium, since it's an unsigned
-  // short in WebIDL.
-  if (configuration.ice_candidate_pool_size < 0 ||
-      configuration.ice_candidate_pool_size > UINT16_MAX) {
-    return SafeSetError(RTCErrorType::INVALID_RANGE, error);
-  }
-
-  // Parse ICE servers before hopping to network thread.
-  cricket::ServerAddresses stun_servers;
-  std::vector<cricket::RelayServerConfig> turn_servers;
-  RTCErrorType parse_error =
-      ParseIceServers(configuration.servers, &stun_servers, &turn_servers);
-  if (parse_error != RTCErrorType::NONE) {
-    return SafeSetError(parse_error, error);
-  }
-
-  // In theory this shouldn't fail.
-  if (!network_thread()->Invoke<bool>(
-          RTC_FROM_HERE,
-          rtc::Bind(&PeerConnection::ReconfigurePortAllocator_n, this,
-                    stun_servers, turn_servers, modified_config.type,
-                    modified_config.ice_candidate_pool_size,
-                    modified_config.prune_turn_ports))) {
-    LOG(LS_ERROR) << "Failed to apply configuration to PortAllocator.";
-    return SafeSetError(RTCErrorType::INTERNAL_ERROR, error);
-  }
-
-  // As described in JSEP, calling setConfiguration with new ICE servers or
-  // candidate policy must set a "needs-ice-restart" bit so that the next offer
-  // triggers an ICE restart which will pick up the changes.
-  if (modified_config.servers != configuration_.servers ||
-      modified_config.type != configuration_.type ||
-      modified_config.prune_turn_ports != configuration_.prune_turn_ports) {
-    session_->SetNeedsIceRestartFlag();
-  }
-
-  if (modified_config.ice_check_min_interval !=
-      configuration_.ice_check_min_interval) {
-    session_->SetIceConfig(session_->ParseIceConfig(modified_config));
-  }
-
-  configuration_ = modified_config;
-  return SafeSetError(RTCErrorType::NONE, error);
-}
-
-bool PeerConnection::AddIceCandidate(
-    const IceCandidateInterface* ice_candidate) {
-  TRACE_EVENT0("webrtc", "PeerConnection::AddIceCandidate");
-  if (IsClosed()) {
-    return false;
-  }
-  return session_->ProcessIceMessage(ice_candidate);
-}
-
-bool PeerConnection::RemoveIceCandidates(
-    const std::vector<cricket::Candidate>& candidates) {
-  TRACE_EVENT0("webrtc", "PeerConnection::RemoveIceCandidates");
-  return session_->RemoveRemoteIceCandidates(candidates);
-}
-
-void PeerConnection::RegisterUMAObserver(UMAObserver* observer) {
-  TRACE_EVENT0("webrtc", "PeerConnection::RegisterUmaObserver");
-  uma_observer_ = observer;
-
-  if (session_) {
-    session_->set_metrics_observer(uma_observer_);
-  }
-
-  // Send information about IPv4/IPv6 status.
-  if (uma_observer_) {
-    port_allocator_->SetMetricsObserver(uma_observer_);
-    if (port_allocator_->flags() & cricket::PORTALLOCATOR_ENABLE_IPV6) {
-      uma_observer_->IncrementEnumCounter(
-          kEnumCounterAddressFamily, kPeerConnection_IPv6,
-          kPeerConnectionAddressFamilyCounter_Max);
-    } else {
-      uma_observer_->IncrementEnumCounter(
-          kEnumCounterAddressFamily, kPeerConnection_IPv4,
-          kPeerConnectionAddressFamilyCounter_Max);
-    }
-  }
-}
-
-RTCError PeerConnection::SetBitrate(const BitrateParameters& bitrate) {
-  rtc::Thread* worker_thread = factory_->worker_thread();
-  if (!worker_thread->IsCurrent()) {
-    return worker_thread->Invoke<RTCError>(
-        RTC_FROM_HERE, rtc::Bind(&PeerConnection::SetBitrate, this, bitrate));
-  }
-
-  const bool has_min = static_cast<bool>(bitrate.min_bitrate_bps);
-  const bool has_current = static_cast<bool>(bitrate.current_bitrate_bps);
-  const bool has_max = static_cast<bool>(bitrate.max_bitrate_bps);
-  if (has_min && *bitrate.min_bitrate_bps < 0) {
-    LOG_AND_RETURN_ERROR(RTCErrorType::INVALID_PARAMETER,
-                         "min_bitrate_bps <= 0");
-  }
-  if (has_current) {
-    if (has_min && *bitrate.current_bitrate_bps < *bitrate.min_bitrate_bps) {
-      LOG_AND_RETURN_ERROR(RTCErrorType::INVALID_PARAMETER,
-                           "current_bitrate_bps < min_bitrate_bps");
-    } else if (*bitrate.current_bitrate_bps < 0) {
-      LOG_AND_RETURN_ERROR(RTCErrorType::INVALID_PARAMETER,
-                           "curent_bitrate_bps < 0");
-    }
-  }
-  if (has_max) {
-    if (has_current &&
-        *bitrate.max_bitrate_bps < *bitrate.current_bitrate_bps) {
-      LOG_AND_RETURN_ERROR(RTCErrorType::INVALID_PARAMETER,
-                           "max_bitrate_bps < current_bitrate_bps");
-    } else if (has_min && *bitrate.max_bitrate_bps < *bitrate.min_bitrate_bps) {
-      LOG_AND_RETURN_ERROR(RTCErrorType::INVALID_PARAMETER,
-                           "max_bitrate_bps < min_bitrate_bps");
-    } else if (*bitrate.max_bitrate_bps < 0) {
-      LOG_AND_RETURN_ERROR(RTCErrorType::INVALID_PARAMETER,
-                           "max_bitrate_bps < 0");
-    }
-  }
-
-  Call::Config::BitrateConfigMask mask;
-  mask.min_bitrate_bps = bitrate.min_bitrate_bps;
-  mask.start_bitrate_bps = bitrate.current_bitrate_bps;
-  mask.max_bitrate_bps = bitrate.max_bitrate_bps;
-
-  RTC_DCHECK(call_.get());
-  call_->SetBitrateConfigMask(mask);
-
-  return RTCError::OK();
-}
-
-bool PeerConnection::StartRtcEventLog(rtc::PlatformFile file,
-                                      int64_t max_size_bytes) {
-  return factory_->worker_thread()->Invoke<bool>(
-      RTC_FROM_HERE, rtc::Bind(&PeerConnection::StartRtcEventLog_w, this, file,
-                               max_size_bytes));
-}
-
-void PeerConnection::StopRtcEventLog() {
-  factory_->worker_thread()->Invoke<void>(
-      RTC_FROM_HERE, rtc::Bind(&PeerConnection::StopRtcEventLog_w, this));
-}
-
-const SessionDescriptionInterface* PeerConnection::local_description() const {
-  return session_->local_description();
-}
-
-const SessionDescriptionInterface* PeerConnection::remote_description() const {
-  return session_->remote_description();
-}
-
-const SessionDescriptionInterface* PeerConnection::current_local_description()
-    const {
-  return session_->current_local_description();
-}
-
-const SessionDescriptionInterface* PeerConnection::current_remote_description()
-    const {
-  return session_->current_remote_description();
-}
-
-const SessionDescriptionInterface* PeerConnection::pending_local_description()
-    const {
-  return session_->pending_local_description();
-}
-
-const SessionDescriptionInterface* PeerConnection::pending_remote_description()
-    const {
-  return session_->pending_remote_description();
-}
-
-void PeerConnection::Close() {
-  TRACE_EVENT0("webrtc", "PeerConnection::Close");
-  // Update stats here so that we have the most recent stats for tracks and
-  // streams before the channels are closed.
-  stats_->UpdateStats(kStatsOutputLevelStandard);
-
-  session_->Close();
-  network_thread()->Invoke<void>(
-      RTC_FROM_HERE,
-      rtc::Bind(&cricket::PortAllocator::DiscardCandidatePool,
-                port_allocator_.get()));
-
-  factory_->worker_thread()->Invoke<void>(RTC_FROM_HERE, [this] {
-    call_.reset();
-    // The event log must outlive call (and any other object that uses it).
-    event_log_.reset();
-  });
-}
-
-void PeerConnection::OnSessionStateChange(WebRtcSession* /*session*/,
-                                          WebRtcSession::State state) {
-  switch (state) {
-    case WebRtcSession::STATE_INIT:
-      ChangeSignalingState(PeerConnectionInterface::kStable);
-      break;
-    case WebRtcSession::STATE_SENTOFFER:
-      ChangeSignalingState(PeerConnectionInterface::kHaveLocalOffer);
-      break;
-    case WebRtcSession::STATE_SENTPRANSWER:
-      ChangeSignalingState(PeerConnectionInterface::kHaveLocalPrAnswer);
-      break;
-    case WebRtcSession::STATE_RECEIVEDOFFER:
-      ChangeSignalingState(PeerConnectionInterface::kHaveRemoteOffer);
-      break;
-    case WebRtcSession::STATE_RECEIVEDPRANSWER:
-      ChangeSignalingState(PeerConnectionInterface::kHaveRemotePrAnswer);
-      break;
-    case WebRtcSession::STATE_INPROGRESS:
-      ChangeSignalingState(PeerConnectionInterface::kStable);
-      break;
-    case WebRtcSession::STATE_CLOSED:
-      ChangeSignalingState(PeerConnectionInterface::kClosed);
-      break;
-    default:
-      break;
-  }
-}
-
-void PeerConnection::OnMessage(rtc::Message* msg) {
-  switch (msg->message_id) {
-    case MSG_SET_SESSIONDESCRIPTION_SUCCESS: {
-      SetSessionDescriptionMsg* param =
-          static_cast<SetSessionDescriptionMsg*>(msg->pdata);
-      param->observer->OnSuccess();
-      delete param;
-      break;
-    }
-    case MSG_SET_SESSIONDESCRIPTION_FAILED: {
-      SetSessionDescriptionMsg* param =
-          static_cast<SetSessionDescriptionMsg*>(msg->pdata);
-      param->observer->OnFailure(param->error);
-      delete param;
-      break;
-    }
-    case MSG_CREATE_SESSIONDESCRIPTION_FAILED: {
-      CreateSessionDescriptionMsg* param =
-          static_cast<CreateSessionDescriptionMsg*>(msg->pdata);
-      param->observer->OnFailure(param->error);
-      delete param;
-      break;
-    }
-    case MSG_GETSTATS: {
-      GetStatsMsg* param = static_cast<GetStatsMsg*>(msg->pdata);
-      StatsReports reports;
-      stats_->GetStats(param->track, &reports);
-      param->observer->OnComplete(reports);
-      delete param;
-      break;
-    }
-    case MSG_FREE_DATACHANNELS: {
-      sctp_data_channels_to_free_.clear();
-      break;
-    }
-    default:
-      RTC_NOTREACHED() << "Not implemented";
-      break;
-  }
-}
-
-void PeerConnection::CreateAudioReceiver(MediaStreamInterface* stream,
-                                         const std::string& track_id,
-                                         uint32_t ssrc) {
-  rtc::scoped_refptr<RtpReceiverProxyWithInternal<RtpReceiverInternal>>
-      receiver = RtpReceiverProxyWithInternal<RtpReceiverInternal>::Create(
-          signaling_thread(),
-          new AudioRtpReceiver(track_id, ssrc, session_->voice_channel()));
-  stream->AddTrack(
-      static_cast<AudioTrackInterface*>(receiver->internal()->track().get()));
-  receivers_.push_back(receiver);
-  std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams;
-  streams.push_back(rtc::scoped_refptr<MediaStreamInterface>(stream));
-  observer_->OnAddTrack(receiver, streams);
-}
-
-void PeerConnection::CreateVideoReceiver(MediaStreamInterface* stream,
-                                         const std::string& track_id,
-                                         uint32_t ssrc) {
-  rtc::scoped_refptr<RtpReceiverProxyWithInternal<RtpReceiverInternal>>
-      receiver = RtpReceiverProxyWithInternal<RtpReceiverInternal>::Create(
-          signaling_thread(),
-          new VideoRtpReceiver(track_id, factory_->worker_thread(), ssrc,
-                               session_->video_channel()));
-  stream->AddTrack(
-      static_cast<VideoTrackInterface*>(receiver->internal()->track().get()));
-  receivers_.push_back(receiver);
-  std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams;
-  streams.push_back(rtc::scoped_refptr<MediaStreamInterface>(stream));
-  observer_->OnAddTrack(receiver, streams);
-}
-
-// TODO(deadbeef): Keep RtpReceivers around even if track goes away in remote
-// description.
-void PeerConnection::DestroyReceiver(const std::string& track_id) {
-  auto it = FindReceiverForTrack(track_id);
-  if (it == receivers_.end()) {
-    LOG(LS_WARNING) << "RtpReceiver for track with id " << track_id
-                    << " doesn't exist.";
-  } else {
-    (*it)->internal()->Stop();
-    receivers_.erase(it);
-  }
-}
-
-void PeerConnection::AddAudioTrack(AudioTrackInterface* track,
-                                   MediaStreamInterface* stream) {
-  RTC_DCHECK(!IsClosed());
-  auto sender = FindSenderForTrack(track);
-  if (sender != senders_.end()) {
-    // We already have a sender for this track, so just change the stream_id
-    // so that it's correct in the next call to CreateOffer.
-    (*sender)->internal()->set_stream_id(stream->label());
-    return;
-  }
-
-  // Normal case; we've never seen this track before.
-  rtc::scoped_refptr<RtpSenderProxyWithInternal<RtpSenderInternal>> new_sender =
-      RtpSenderProxyWithInternal<RtpSenderInternal>::Create(
-          signaling_thread(),
-          new AudioRtpSender(track, {stream->label()},
-                             session_->voice_channel(), stats_.get()));
-  senders_.push_back(new_sender);
-  // If the sender has already been configured in SDP, we call SetSsrc,
-  // which will connect the sender to the underlying transport. This can
-  // occur if a local session description that contains the ID of the sender
-  // is set before AddStream is called. It can also occur if the local
-  // session description is not changed and RemoveStream is called, and
-  // later AddStream is called again with the same stream.
-  const TrackInfo* track_info =
-      FindTrackInfo(local_audio_tracks_, stream->label(), track->id());
-  if (track_info) {
-    new_sender->internal()->SetSsrc(track_info->ssrc);
-  }
-}
-
-// TODO(deadbeef): Don't destroy RtpSenders here; they should be kept around
-// indefinitely, when we have unified plan SDP.
-void PeerConnection::RemoveAudioTrack(AudioTrackInterface* track,
-                                      MediaStreamInterface* stream) {
-  RTC_DCHECK(!IsClosed());
-  auto sender = FindSenderForTrack(track);
-  if (sender == senders_.end()) {
-    LOG(LS_WARNING) << "RtpSender for track with id " << track->id()
-                    << " doesn't exist.";
-    return;
-  }
-  (*sender)->internal()->Stop();
-  senders_.erase(sender);
-}
-
-void PeerConnection::AddVideoTrack(VideoTrackInterface* track,
-                                   MediaStreamInterface* stream) {
-  RTC_DCHECK(!IsClosed());
-  auto sender = FindSenderForTrack(track);
-  if (sender != senders_.end()) {
-    // We already have a sender for this track, so just change the stream_id
-    // so that it's correct in the next call to CreateOffer.
-    (*sender)->internal()->set_stream_id(stream->label());
-    return;
-  }
-
-  // Normal case; we've never seen this track before.
-  rtc::scoped_refptr<RtpSenderProxyWithInternal<RtpSenderInternal>> new_sender =
-      RtpSenderProxyWithInternal<RtpSenderInternal>::Create(
-          signaling_thread(), new VideoRtpSender(track, {stream->label()},
-                                                 session_->video_channel()));
-  senders_.push_back(new_sender);
-  const TrackInfo* track_info =
-      FindTrackInfo(local_video_tracks_, stream->label(), track->id());
-  if (track_info) {
-    new_sender->internal()->SetSsrc(track_info->ssrc);
-  }
-}
-
-void PeerConnection::RemoveVideoTrack(VideoTrackInterface* track,
-                                      MediaStreamInterface* stream) {
-  RTC_DCHECK(!IsClosed());
-  auto sender = FindSenderForTrack(track);
-  if (sender == senders_.end()) {
-    LOG(LS_WARNING) << "RtpSender for track with id " << track->id()
-                    << " doesn't exist.";
-    return;
-  }
-  (*sender)->internal()->Stop();
-  senders_.erase(sender);
-}
-
-void PeerConnection::OnIceConnectionStateChange(
-    PeerConnectionInterface::IceConnectionState new_state) {
-  RTC_DCHECK(signaling_thread()->IsCurrent());
-  // After transitioning to "closed", ignore any additional states from
-  // WebRtcSession (such as "disconnected").
-  if (IsClosed()) {
-    return;
-  }
-  ice_connection_state_ = new_state;
-  observer_->OnIceConnectionChange(ice_connection_state_);
-}
-
-void PeerConnection::OnIceGatheringChange(
-    PeerConnectionInterface::IceGatheringState new_state) {
-  RTC_DCHECK(signaling_thread()->IsCurrent());
-  if (IsClosed()) {
-    return;
-  }
-  ice_gathering_state_ = new_state;
-  observer_->OnIceGatheringChange(ice_gathering_state_);
-}
-
-void PeerConnection::OnIceCandidate(
-    std::unique_ptr<IceCandidateInterface> candidate) {
-  RTC_DCHECK(signaling_thread()->IsCurrent());
-  if (IsClosed()) {
-    return;
-  }
-  observer_->OnIceCandidate(candidate.get());
-}
-
-void PeerConnection::OnIceCandidatesRemoved(
-    const std::vector<cricket::Candidate>& candidates) {
-  RTC_DCHECK(signaling_thread()->IsCurrent());
-  if (IsClosed()) {
-    return;
-  }
-  observer_->OnIceCandidatesRemoved(candidates);
-}
-
-void PeerConnection::OnIceConnectionReceivingChange(bool receiving) {
-  RTC_DCHECK(signaling_thread()->IsCurrent());
-  if (IsClosed()) {
-    return;
-  }
-  observer_->OnIceConnectionReceivingChange(receiving);
-}
-
-void PeerConnection::ChangeSignalingState(
-    PeerConnectionInterface::SignalingState signaling_state) {
-  signaling_state_ = signaling_state;
-  if (signaling_state == kClosed) {
-    ice_connection_state_ = kIceConnectionClosed;
-    observer_->OnIceConnectionChange(ice_connection_state_);
-    if (ice_gathering_state_ != kIceGatheringComplete) {
-      ice_gathering_state_ = kIceGatheringComplete;
-      observer_->OnIceGatheringChange(ice_gathering_state_);
-    }
-  }
-  observer_->OnSignalingChange(signaling_state_);
-}
-
-void PeerConnection::OnAudioTrackAdded(AudioTrackInterface* track,
-                                       MediaStreamInterface* stream) {
-  if (IsClosed()) {
-    return;
-  }
-  AddAudioTrack(track, stream);
-  observer_->OnRenegotiationNeeded();
-}
-
-void PeerConnection::OnAudioTrackRemoved(AudioTrackInterface* track,
-                                         MediaStreamInterface* stream) {
-  if (IsClosed()) {
-    return;
-  }
-  RemoveAudioTrack(track, stream);
-  observer_->OnRenegotiationNeeded();
-}
-
-void PeerConnection::OnVideoTrackAdded(VideoTrackInterface* track,
-                                       MediaStreamInterface* stream) {
-  if (IsClosed()) {
-    return;
-  }
-  AddVideoTrack(track, stream);
-  observer_->OnRenegotiationNeeded();
-}
-
-void PeerConnection::OnVideoTrackRemoved(VideoTrackInterface* track,
-                                         MediaStreamInterface* stream) {
-  if (IsClosed()) {
-    return;
-  }
-  RemoveVideoTrack(track, stream);
-  observer_->OnRenegotiationNeeded();
-}
-
-void PeerConnection::PostSetSessionDescriptionFailure(
-    SetSessionDescriptionObserver* observer,
-    const std::string& error) {
-  SetSessionDescriptionMsg* msg = new SetSessionDescriptionMsg(observer);
-  msg->error = error;
-  signaling_thread()->Post(RTC_FROM_HERE, this,
-                           MSG_SET_SESSIONDESCRIPTION_FAILED, msg);
-}
-
-void PeerConnection::PostCreateSessionDescriptionFailure(
-    CreateSessionDescriptionObserver* observer,
-    const std::string& error) {
-  CreateSessionDescriptionMsg* msg = new CreateSessionDescriptionMsg(observer);
-  msg->error = error;
-  signaling_thread()->Post(RTC_FROM_HERE, this,
-                           MSG_CREATE_SESSIONDESCRIPTION_FAILED, msg);
-}
-
-void PeerConnection::GetOptionsForOffer(
-    const PeerConnectionInterface::RTCOfferAnswerOptions& rtc_options,
-    cricket::MediaSessionOptions* session_options) {
-  ExtractSharedMediaSessionOptions(rtc_options, session_options);
-
-  // Figure out transceiver directional preferences.
-  bool send_audio = HasRtpSender(cricket::MEDIA_TYPE_AUDIO);
-  bool send_video = HasRtpSender(cricket::MEDIA_TYPE_VIDEO);
-
-  // By default, generate sendrecv/recvonly m= sections.
-  bool recv_audio = true;
-  bool recv_video = true;
-
-  // By default, only offer a new m= section if we have media to send with it.
-  bool offer_new_audio_description = send_audio;
-  bool offer_new_video_description = send_video;
-  bool offer_new_data_description = HasDataChannels();
-
-  // The "offer_to_receive_X" options allow those defaults to be overridden.
-  if (rtc_options.offer_to_receive_audio != RTCOfferAnswerOptions::kUndefined) {
-    recv_audio = (rtc_options.offer_to_receive_audio > 0);
-    offer_new_audio_description =
-        offer_new_audio_description || (rtc_options.offer_to_receive_audio > 0);
-  }
-  if (rtc_options.offer_to_receive_video != RTCOfferAnswerOptions::kUndefined) {
-    recv_video = (rtc_options.offer_to_receive_video > 0);
-    offer_new_video_description =
-        offer_new_video_description || (rtc_options.offer_to_receive_video > 0);
-  }
-
-  rtc::Optional<size_t> audio_index;
-  rtc::Optional<size_t> video_index;
-  rtc::Optional<size_t> data_index;
-  // If a current description exists, generate m= sections in the same order,
-  // using the first audio/video/data section that appears and rejecting
-  // extraneous ones.
-  if (session_->local_description()) {
-    GenerateMediaDescriptionOptions(
-        session_->local_description(),
-        cricket::RtpTransceiverDirection(send_audio, recv_audio),
-        cricket::RtpTransceiverDirection(send_video, recv_video), &audio_index,
-        &video_index, &data_index, session_options);
-  }
-
-  // Add audio/video/data m= sections to the end if needed.
-  if (!audio_index && offer_new_audio_description) {
-    session_options->media_description_options.push_back(
-        cricket::MediaDescriptionOptions(
-            cricket::MEDIA_TYPE_AUDIO, cricket::CN_AUDIO,
-            cricket::RtpTransceiverDirection(send_audio, recv_audio), false));
-    audio_index = rtc::Optional<size_t>(
-        session_options->media_description_options.size() - 1);
-  }
-  if (!video_index && offer_new_video_description) {
-    session_options->media_description_options.push_back(
-        cricket::MediaDescriptionOptions(
-            cricket::MEDIA_TYPE_VIDEO, cricket::CN_VIDEO,
-            cricket::RtpTransceiverDirection(send_video, recv_video), false));
-    video_index = rtc::Optional<size_t>(
-        session_options->media_description_options.size() - 1);
-  }
-  if (!data_index && offer_new_data_description) {
-    session_options->media_description_options.push_back(
-        cricket::MediaDescriptionOptions(
-            cricket::MEDIA_TYPE_DATA, cricket::CN_DATA,
-            cricket::RtpTransceiverDirection(true, true), false));
-    data_index = rtc::Optional<size_t>(
-        session_options->media_description_options.size() - 1);
-  }
-
-  cricket::MediaDescriptionOptions* audio_media_description_options =
-      !audio_index ? nullptr
-                   : &session_options->media_description_options[*audio_index];
-  cricket::MediaDescriptionOptions* video_media_description_options =
-      !video_index ? nullptr
-                   : &session_options->media_description_options[*video_index];
-  cricket::MediaDescriptionOptions* data_media_description_options =
-      !data_index ? nullptr
-                  : &session_options->media_description_options[*data_index];
-
-  // Apply ICE restart flag and renomination flag.
-  for (auto& options : session_options->media_description_options) {
-    options.transport_options.ice_restart = rtc_options.ice_restart;
-    options.transport_options.enable_ice_renomination =
-        configuration_.enable_ice_renomination;
-  }
-
-  AddRtpSenderOptions(senders_, audio_media_description_options,
-                      video_media_description_options);
-  AddRtpDataChannelOptions(rtp_data_channels_, data_media_description_options);
-
-  // Intentionally unset the data channel type for RTP data channel with the
-  // second condition. Otherwise the RTP data channels would be successfully
-  // negotiated by default and the unit tests in WebRtcDataBrowserTest will fail
-  // when building with chromium. We want to leave RTP data channels broken, so
-  // people won't try to use them.
-  if (!rtp_data_channels_.empty() ||
-      session_->data_channel_type() != cricket::DCT_RTP) {
-    session_options->data_channel_type = session_->data_channel_type();
-  }
-
-  session_options->rtcp_cname = rtcp_cname_;
-  session_options->crypto_options = factory_->options().crypto_options;
-}
-
-void PeerConnection::GetOptionsForAnswer(
-    const RTCOfferAnswerOptions& rtc_options,
-    cricket::MediaSessionOptions* session_options) {
-  ExtractSharedMediaSessionOptions(rtc_options, session_options);
-
-  // Figure out transceiver directional preferences.
-  bool send_audio = HasRtpSender(cricket::MEDIA_TYPE_AUDIO);
-  bool send_video = HasRtpSender(cricket::MEDIA_TYPE_VIDEO);
-
-  // By default, generate sendrecv/recvonly m= sections. The direction is also
-  // restricted by the direction in the offer.
-  bool recv_audio = true;
-  bool recv_video = true;
-
-  // The "offer_to_receive_X" options allow those defaults to be overridden.
-  if (rtc_options.offer_to_receive_audio != RTCOfferAnswerOptions::kUndefined) {
-    recv_audio = (rtc_options.offer_to_receive_audio > 0);
-  }
-  if (rtc_options.offer_to_receive_video != RTCOfferAnswerOptions::kUndefined) {
-    recv_video = (rtc_options.offer_to_receive_video > 0);
-  }
-
-  rtc::Optional<size_t> audio_index;
-  rtc::Optional<size_t> video_index;
-  rtc::Optional<size_t> data_index;
-  if (session_->remote_description()) {
-    // The pending remote description should be an offer.
-    RTC_DCHECK(session_->remote_description()->type() ==
-               SessionDescriptionInterface::kOffer);
-    // Generate m= sections that match those in the offer.
-    // Note that mediasession.cc will handle intersection our preferred
-    // direction with the offered direction.
-    GenerateMediaDescriptionOptions(
-        session_->remote_description(),
-        cricket::RtpTransceiverDirection(send_audio, recv_audio),
-        cricket::RtpTransceiverDirection(send_video, recv_video), &audio_index,
-        &video_index, &data_index, session_options);
-  }
-
-  cricket::MediaDescriptionOptions* audio_media_description_options =
-      !audio_index ? nullptr
-                   : &session_options->media_description_options[*audio_index];
-  cricket::MediaDescriptionOptions* video_media_description_options =
-      !video_index ? nullptr
-                   : &session_options->media_description_options[*video_index];
-  cricket::MediaDescriptionOptions* data_media_description_options =
-      !data_index ? nullptr
-                  : &session_options->media_description_options[*data_index];
-
-  // Apply ICE renomination flag.
-  for (auto& options : session_options->media_description_options) {
-    options.transport_options.enable_ice_renomination =
-        configuration_.enable_ice_renomination;
-  }
-
-  AddRtpSenderOptions(senders_, audio_media_description_options,
-                      video_media_description_options);
-  AddRtpDataChannelOptions(rtp_data_channels_, data_media_description_options);
-
-  // Intentionally unset the data channel type for RTP data channel. Otherwise
-  // the RTP data channels would be successfully negotiated by default and the
-  // unit tests in WebRtcDataBrowserTest will fail when building with chromium.
-  // We want to leave RTP data channels broken, so people won't try to use them.
-  if (!rtp_data_channels_.empty() ||
-      session_->data_channel_type() != cricket::DCT_RTP) {
-    session_options->data_channel_type = session_->data_channel_type();
-  }
-
-  session_options->rtcp_cname = rtcp_cname_;
-  session_options->crypto_options = factory_->options().crypto_options;
-}
-
-void PeerConnection::GenerateMediaDescriptionOptions(
-    const SessionDescriptionInterface* session_desc,
-    cricket::RtpTransceiverDirection audio_direction,
-    cricket::RtpTransceiverDirection video_direction,
-    rtc::Optional<size_t>* audio_index,
-    rtc::Optional<size_t>* video_index,
-    rtc::Optional<size_t>* data_index,
-    cricket::MediaSessionOptions* session_options) {
-  for (const cricket::ContentInfo& content :
-       session_desc->description()->contents()) {
-    if (IsAudioContent(&content)) {
-      // If we already have an audio m= section, reject this extra one.
-      if (*audio_index) {
-        session_options->media_description_options.push_back(
-            cricket::MediaDescriptionOptions(
-                cricket::MEDIA_TYPE_AUDIO, content.name,
-                cricket::RtpTransceiverDirection(false, false), true));
-      } else {
-        session_options->media_description_options.push_back(
-            cricket::MediaDescriptionOptions(
-                cricket::MEDIA_TYPE_AUDIO, content.name, audio_direction,
-                !audio_direction.send && !audio_direction.recv));
-        *audio_index = rtc::Optional<size_t>(
-            session_options->media_description_options.size() - 1);
-      }
-    } else if (IsVideoContent(&content)) {
-      // If we already have an video m= section, reject this extra one.
-      if (*video_index) {
-        session_options->media_description_options.push_back(
-            cricket::MediaDescriptionOptions(
-                cricket::MEDIA_TYPE_VIDEO, content.name,
-                cricket::RtpTransceiverDirection(false, false), true));
-      } else {
-        session_options->media_description_options.push_back(
-            cricket::MediaDescriptionOptions(
-                cricket::MEDIA_TYPE_VIDEO, content.name, video_direction,
-                !video_direction.send && !video_direction.recv));
-        *video_index = rtc::Optional<size_t>(
-            session_options->media_description_options.size() - 1);
-      }
-    } else {
-      RTC_DCHECK(IsDataContent(&content));
-      // If we already have an data m= section, reject this extra one.
-      if (*data_index) {
-        session_options->media_description_options.push_back(
-            cricket::MediaDescriptionOptions(
-                cricket::MEDIA_TYPE_DATA, content.name,
-                cricket::RtpTransceiverDirection(false, false), true));
-      } else {
-        session_options->media_description_options.push_back(
-            cricket::MediaDescriptionOptions(
-                cricket::MEDIA_TYPE_DATA, content.name,
-                // Direction for data sections is meaningless, but legacy
-                // endpoints might expect sendrecv.
-                cricket::RtpTransceiverDirection(true, true), false));
-        *data_index = rtc::Optional<size_t>(
-            session_options->media_description_options.size() - 1);
-      }
-    }
-  }
-}
-
-void PeerConnection::RemoveTracks(cricket::MediaType media_type) {
-  UpdateLocalTracks(std::vector<cricket::StreamParams>(), media_type);
-  UpdateRemoteStreamsList(std::vector<cricket::StreamParams>(), false,
-                          media_type, nullptr);
-}
-
-void PeerConnection::UpdateRemoteStreamsList(
-    const cricket::StreamParamsVec& streams,
-    bool default_track_needed,
-    cricket::MediaType media_type,
-    StreamCollection* new_streams) {
-  TrackInfos* current_tracks = GetRemoteTracks(media_type);
-
-  // Find removed tracks. I.e., tracks where the track id or ssrc don't match
-  // the new StreamParam.
-  auto track_it = current_tracks->begin();
-  while (track_it != current_tracks->end()) {
-    const TrackInfo& info = *track_it;
-    const cricket::StreamParams* params =
-        cricket::GetStreamBySsrc(streams, info.ssrc);
-    bool track_exists = params && params->id == info.track_id;
-    // If this is a default track, and we still need it, don't remove it.
-    if ((info.stream_label == kDefaultStreamLabel && default_track_needed) ||
-        track_exists) {
-      ++track_it;
-    } else {
-      OnRemoteTrackRemoved(info.stream_label, info.track_id, media_type);
-      track_it = current_tracks->erase(track_it);
-    }
-  }
-
-  // Find new and active tracks.
-  for (const cricket::StreamParams& params : streams) {
-    // The sync_label is the MediaStream label and the |stream.id| is the
-    // track id.
-    const std::string& stream_label = params.sync_label;
-    const std::string& track_id = params.id;
-    uint32_t ssrc = params.first_ssrc();
-
-    rtc::scoped_refptr<MediaStreamInterface> stream =
-        remote_streams_->find(stream_label);
-    if (!stream) {
-      // This is a new MediaStream. Create a new remote MediaStream.
-      stream = MediaStreamProxy::Create(rtc::Thread::Current(),
-                                        MediaStream::Create(stream_label));
-      remote_streams_->AddStream(stream);
-      new_streams->AddStream(stream);
-    }
-
-    const TrackInfo* track_info =
-        FindTrackInfo(*current_tracks, stream_label, track_id);
-    if (!track_info) {
-      current_tracks->push_back(TrackInfo(stream_label, track_id, ssrc));
-      OnRemoteTrackSeen(stream_label, track_id, ssrc, media_type);
-    }
-  }
-
-  // Add default track if necessary.
-  if (default_track_needed) {
-    rtc::scoped_refptr<MediaStreamInterface> default_stream =
-        remote_streams_->find(kDefaultStreamLabel);
-    if (!default_stream) {
-      // Create the new default MediaStream.
-      default_stream = MediaStreamProxy::Create(
-          rtc::Thread::Current(), MediaStream::Create(kDefaultStreamLabel));
-      remote_streams_->AddStream(default_stream);
-      new_streams->AddStream(default_stream);
-    }
-    std::string default_track_id = (media_type == cricket::MEDIA_TYPE_AUDIO)
-                                       ? kDefaultAudioTrackLabel
-                                       : kDefaultVideoTrackLabel;
-    const TrackInfo* default_track_info =
-        FindTrackInfo(*current_tracks, kDefaultStreamLabel, default_track_id);
-    if (!default_track_info) {
-      current_tracks->push_back(
-          TrackInfo(kDefaultStreamLabel, default_track_id, 0));
-      OnRemoteTrackSeen(kDefaultStreamLabel, default_track_id, 0, media_type);
-    }
-  }
-}
-
-void PeerConnection::OnRemoteTrackSeen(const std::string& stream_label,
-                                       const std::string& track_id,
-                                       uint32_t ssrc,
-                                       cricket::MediaType media_type) {
-  MediaStreamInterface* stream = remote_streams_->find(stream_label);
-
-  if (media_type == cricket::MEDIA_TYPE_AUDIO) {
-    CreateAudioReceiver(stream, track_id, ssrc);
-  } else if (media_type == cricket::MEDIA_TYPE_VIDEO) {
-    CreateVideoReceiver(stream, track_id, ssrc);
-  } else {
-    RTC_NOTREACHED() << "Invalid media type";
-  }
-}
-
-void PeerConnection::OnRemoteTrackRemoved(const std::string& stream_label,
-                                          const std::string& track_id,
-                                          cricket::MediaType media_type) {
-  MediaStreamInterface* stream = remote_streams_->find(stream_label);
-
-  if (media_type == cricket::MEDIA_TYPE_AUDIO) {
-    // When the MediaEngine audio channel is destroyed, the RemoteAudioSource
-    // will be notified which will end the AudioRtpReceiver::track().
-    DestroyReceiver(track_id);
-    rtc::scoped_refptr<AudioTrackInterface> audio_track =
-        stream->FindAudioTrack(track_id);
-    if (audio_track) {
-      stream->RemoveTrack(audio_track);
-    }
-  } else if (media_type == cricket::MEDIA_TYPE_VIDEO) {
-    // Stopping or destroying a VideoRtpReceiver will end the
-    // VideoRtpReceiver::track().
-    DestroyReceiver(track_id);
-    rtc::scoped_refptr<VideoTrackInterface> video_track =
-        stream->FindVideoTrack(track_id);
-    if (video_track) {
-      // There's no guarantee the track is still available, e.g. the track may
-      // have been removed from the stream by an application.
-      stream->RemoveTrack(video_track);
-    }
-  } else {
-    RTC_NOTREACHED() << "Invalid media type";
-  }
-}
-
-void PeerConnection::UpdateEndedRemoteMediaStreams() {
-  std::vector<rtc::scoped_refptr<MediaStreamInterface>> streams_to_remove;
-  for (size_t i = 0; i < remote_streams_->count(); ++i) {
-    MediaStreamInterface* stream = remote_streams_->at(i);
-    if (stream->GetAudioTracks().empty() && stream->GetVideoTracks().empty()) {
-      streams_to_remove.push_back(stream);
-    }
-  }
-
-  for (auto& stream : streams_to_remove) {
-    remote_streams_->RemoveStream(stream);
-    observer_->OnRemoveStream(std::move(stream));
-  }
-}
-
-void PeerConnection::UpdateLocalTracks(
-    const std::vector<cricket::StreamParams>& streams,
-    cricket::MediaType media_type) {
-  TrackInfos* current_tracks = GetLocalTracks(media_type);
-
-  // Find removed tracks. I.e., tracks where the track id, stream label or ssrc
-  // don't match the new StreamParam.
-  TrackInfos::iterator track_it = current_tracks->begin();
-  while (track_it != current_tracks->end()) {
-    const TrackInfo& info = *track_it;
-    const cricket::StreamParams* params =
-        cricket::GetStreamBySsrc(streams, info.ssrc);
-    if (!params || params->id != info.track_id ||
-        params->sync_label != info.stream_label) {
-      OnLocalTrackRemoved(info.stream_label, info.track_id, info.ssrc,
-                          media_type);
-      track_it = current_tracks->erase(track_it);
-    } else {
-      ++track_it;
-    }
-  }
-
-  // Find new and active tracks.
-  for (const cricket::StreamParams& params : streams) {
-    // The sync_label is the MediaStream label and the |stream.id| is the
-    // track id.
-    const std::string& stream_label = params.sync_label;
-    const std::string& track_id = params.id;
-    uint32_t ssrc = params.first_ssrc();
-    const TrackInfo* track_info =
-        FindTrackInfo(*current_tracks, stream_label, track_id);
-    if (!track_info) {
-      current_tracks->push_back(TrackInfo(stream_label, track_id, ssrc));
-      OnLocalTrackSeen(stream_label, track_id, params.first_ssrc(), media_type);
-    }
-  }
-}
-
-void PeerConnection::OnLocalTrackSeen(const std::string& stream_label,
-                                      const std::string& track_id,
-                                      uint32_t ssrc,
-                                      cricket::MediaType media_type) {
-  RtpSenderInternal* sender = FindSenderById(track_id);
-  if (!sender) {
-    LOG(LS_WARNING) << "An unknown RtpSender with id " << track_id
-                    << " has been configured in the local description.";
-    return;
-  }
-
-  if (sender->media_type() != media_type) {
-    LOG(LS_WARNING) << "An RtpSender has been configured in the local"
-                    << " description with an unexpected media type.";
-    return;
-  }
-
-  sender->set_stream_id(stream_label);
-  sender->SetSsrc(ssrc);
-}
-
-void PeerConnection::OnLocalTrackRemoved(const std::string& stream_label,
-                                         const std::string& track_id,
-                                         uint32_t ssrc,
-                                         cricket::MediaType media_type) {
-  RtpSenderInternal* sender = FindSenderById(track_id);
-  if (!sender) {
-    // This is the normal case. I.e., RemoveStream has been called and the
-    // SessionDescriptions has been renegotiated.
-    return;
-  }
-
-  // A sender has been removed from the SessionDescription but it's still
-  // associated with the PeerConnection. This only occurs if the SDP doesn't
-  // match with the calls to CreateSender, AddStream and RemoveStream.
-  if (sender->media_type() != media_type) {
-    LOG(LS_WARNING) << "An RtpSender has been configured in the local"
-                    << " description with an unexpected media type.";
-    return;
-  }
-
-  sender->SetSsrc(0);
-}
-
-void PeerConnection::UpdateLocalRtpDataChannels(
-    const cricket::StreamParamsVec& streams) {
-  std::vector<std::string> existing_channels;
-
-  // Find new and active data channels.
-  for (const cricket::StreamParams& params : streams) {
-    // |it->sync_label| is actually the data channel label. The reason is that
-    // we use the same naming of data channels as we do for
-    // MediaStreams and Tracks.
-    // For MediaStreams, the sync_label is the MediaStream label and the
-    // track label is the same as |streamid|.
-    const std::string& channel_label = params.sync_label;
-    auto data_channel_it = rtp_data_channels_.find(channel_label);
-    if (data_channel_it == rtp_data_channels_.end()) {
-      LOG(LS_ERROR) << "channel label not found";
-      continue;
-    }
-    // Set the SSRC the data channel should use for sending.
-    data_channel_it->second->SetSendSsrc(params.first_ssrc());
-    existing_channels.push_back(data_channel_it->first);
-  }
-
-  UpdateClosingRtpDataChannels(existing_channels, true);
-}
-
-void PeerConnection::UpdateRemoteRtpDataChannels(
-    const cricket::StreamParamsVec& streams) {
-  std::vector<std::string> existing_channels;
-
-  // Find new and active data channels.
-  for (const cricket::StreamParams& params : streams) {
-    // The data channel label is either the mslabel or the SSRC if the mslabel
-    // does not exist. Ex a=ssrc:444330170 mslabel:test1.
-    std::string label = params.sync_label.empty()
-                            ? rtc::ToString(params.first_ssrc())
-                            : params.sync_label;
-    auto data_channel_it = rtp_data_channels_.find(label);
-    if (data_channel_it == rtp_data_channels_.end()) {
-      // This is a new data channel.
-      CreateRemoteRtpDataChannel(label, params.first_ssrc());
-    } else {
-      data_channel_it->second->SetReceiveSsrc(params.first_ssrc());
-    }
-    existing_channels.push_back(label);
-  }
-
-  UpdateClosingRtpDataChannels(existing_channels, false);
-}
-
-void PeerConnection::UpdateClosingRtpDataChannels(
-    const std::vector<std::string>& active_channels,
-    bool is_local_update) {
-  auto it = rtp_data_channels_.begin();
-  while (it != rtp_data_channels_.end()) {
-    DataChannel* data_channel = it->second;
-    if (std::find(active_channels.begin(), active_channels.end(),
-                  data_channel->label()) != active_channels.end()) {
-      ++it;
-      continue;
-    }
-
-    if (is_local_update) {
-      data_channel->SetSendSsrc(0);
-    } else {
-      data_channel->RemotePeerRequestClose();
-    }
-
-    if (data_channel->state() == DataChannel::kClosed) {
-      rtp_data_channels_.erase(it);
-      it = rtp_data_channels_.begin();
-    } else {
-      ++it;
-    }
-  }
-}
-
-void PeerConnection::CreateRemoteRtpDataChannel(const std::string& label,
-                                                uint32_t remote_ssrc) {
-  rtc::scoped_refptr<DataChannel> channel(
-      InternalCreateDataChannel(label, nullptr));
-  if (!channel.get()) {
-    LOG(LS_WARNING) << "Remote peer requested a DataChannel but"
-                    << "CreateDataChannel failed.";
-    return;
-  }
-  channel->SetReceiveSsrc(remote_ssrc);
-  rtc::scoped_refptr<DataChannelInterface> proxy_channel =
-      DataChannelProxy::Create(signaling_thread(), channel);
-  observer_->OnDataChannel(std::move(proxy_channel));
-}
-
-rtc::scoped_refptr<DataChannel> PeerConnection::InternalCreateDataChannel(
-    const std::string& label,
-    const InternalDataChannelInit* config) {
-  if (IsClosed()) {
-    return nullptr;
-  }
-  if (session_->data_channel_type() == cricket::DCT_NONE) {
-    LOG(LS_ERROR)
-        << "InternalCreateDataChannel: Data is not supported in this call.";
-    return nullptr;
-  }
-  InternalDataChannelInit new_config =
-      config ? (*config) : InternalDataChannelInit();
-  if (session_->data_channel_type() == cricket::DCT_SCTP) {
-    if (new_config.id < 0) {
-      rtc::SSLRole role;
-      if ((session_->GetSctpSslRole(&role)) &&
-          !sid_allocator_.AllocateSid(role, &new_config.id)) {
-        LOG(LS_ERROR) << "No id can be allocated for the SCTP data channel.";
-        return nullptr;
-      }
-    } else if (!sid_allocator_.ReserveSid(new_config.id)) {
-      LOG(LS_ERROR) << "Failed to create a SCTP data channel "
-                    << "because the id is already in use or out of range.";
-      return nullptr;
-    }
-  }
-
-  rtc::scoped_refptr<DataChannel> channel(DataChannel::Create(
-      session_.get(), session_->data_channel_type(), label, new_config));
-  if (!channel) {
-    sid_allocator_.ReleaseSid(new_config.id);
-    return nullptr;
-  }
-
-  if (channel->data_channel_type() == cricket::DCT_RTP) {
-    if (rtp_data_channels_.find(channel->label()) != rtp_data_channels_.end()) {
-      LOG(LS_ERROR) << "DataChannel with label " << channel->label()
-                    << " already exists.";
-      return nullptr;
-    }
-    rtp_data_channels_[channel->label()] = channel;
-  } else {
-    RTC_DCHECK(channel->data_channel_type() == cricket::DCT_SCTP);
-    sctp_data_channels_.push_back(channel);
-    channel->SignalClosed.connect(this,
-                                  &PeerConnection::OnSctpDataChannelClosed);
-  }
-
-  SignalDataChannelCreated(channel.get());
-  return channel;
-}
-
-bool PeerConnection::HasDataChannels() const {
-#ifdef HAVE_QUIC
-  return !rtp_data_channels_.empty() || !sctp_data_channels_.empty() ||
-         (session_->quic_data_transport() &&
-          session_->quic_data_transport()->HasDataChannels());
-#else
-  return !rtp_data_channels_.empty() || !sctp_data_channels_.empty();
-#endif  // HAVE_QUIC
-}
-
-void PeerConnection::AllocateSctpSids(rtc::SSLRole role) {
-  for (const auto& channel : sctp_data_channels_) {
-    if (channel->id() < 0) {
-      int sid;
-      if (!sid_allocator_.AllocateSid(role, &sid)) {
-        LOG(LS_ERROR) << "Failed to allocate SCTP sid.";
-        continue;
-      }
-      channel->SetSctpSid(sid);
-    }
-  }
-}
-
-void PeerConnection::OnSctpDataChannelClosed(DataChannel* channel) {
-  RTC_DCHECK(signaling_thread()->IsCurrent());
-  for (auto it = sctp_data_channels_.begin(); it != sctp_data_channels_.end();
-       ++it) {
-    if (it->get() == channel) {
-      if (channel->id() >= 0) {
-        sid_allocator_.ReleaseSid(channel->id());
-      }
-      // Since this method is triggered by a signal from the DataChannel,
-      // we can't free it directly here; we need to free it asynchronously.
-      sctp_data_channels_to_free_.push_back(*it);
-      sctp_data_channels_.erase(it);
-      signaling_thread()->Post(RTC_FROM_HERE, this, MSG_FREE_DATACHANNELS,
-                               nullptr);
-      return;
-    }
-  }
-}
-
-void PeerConnection::OnVoiceChannelCreated() {
-  SetChannelOnSendersAndReceivers<AudioRtpSender, AudioRtpReceiver>(
-      session_->voice_channel(), senders_, receivers_,
-      cricket::MEDIA_TYPE_AUDIO);
-}
-
-void PeerConnection::OnVoiceChannelDestroyed() {
-  SetChannelOnSendersAndReceivers<AudioRtpSender, AudioRtpReceiver,
-                                  cricket::VoiceChannel>(
-      nullptr, senders_, receivers_, cricket::MEDIA_TYPE_AUDIO);
-}
-
-void PeerConnection::OnVideoChannelCreated() {
-  SetChannelOnSendersAndReceivers<VideoRtpSender, VideoRtpReceiver>(
-      session_->video_channel(), senders_, receivers_,
-      cricket::MEDIA_TYPE_VIDEO);
-}
-
-void PeerConnection::OnVideoChannelDestroyed() {
-  SetChannelOnSendersAndReceivers<VideoRtpSender, VideoRtpReceiver,
-                                  cricket::VideoChannel>(
-      nullptr, senders_, receivers_, cricket::MEDIA_TYPE_VIDEO);
-}
-
-void PeerConnection::OnDataChannelCreated() {
-  for (const auto& channel : sctp_data_channels_) {
-    channel->OnTransportChannelCreated();
-  }
-}
-
-void PeerConnection::OnDataChannelDestroyed() {
-  // Use a temporary copy of the RTP/SCTP DataChannel list because the
-  // DataChannel may callback to us and try to modify the list.
-  std::map<std::string, rtc::scoped_refptr<DataChannel>> temp_rtp_dcs;
-  temp_rtp_dcs.swap(rtp_data_channels_);
-  for (const auto& kv : temp_rtp_dcs) {
-    kv.second->OnTransportChannelDestroyed();
-  }
-
-  std::vector<rtc::scoped_refptr<DataChannel>> temp_sctp_dcs;
-  temp_sctp_dcs.swap(sctp_data_channels_);
-  for (const auto& channel : temp_sctp_dcs) {
-    channel->OnTransportChannelDestroyed();
-  }
-}
-
-void PeerConnection::OnDataChannelOpenMessage(
-    const std::string& label,
-    const InternalDataChannelInit& config) {
-  rtc::scoped_refptr<DataChannel> channel(
-      InternalCreateDataChannel(label, &config));
-  if (!channel.get()) {
-    LOG(LS_ERROR) << "Failed to create DataChannel from the OPEN message.";
-    return;
-  }
-
-  rtc::scoped_refptr<DataChannelInterface> proxy_channel =
-      DataChannelProxy::Create(signaling_thread(), channel);
-  observer_->OnDataChannel(std::move(proxy_channel));
-}
-
-bool PeerConnection::HasRtpSender(cricket::MediaType type) const {
-  return std::find_if(
-             senders_.begin(), senders_.end(),
-             [type](const rtc::scoped_refptr<
-                    RtpSenderProxyWithInternal<RtpSenderInternal>>& sender) {
-               return sender->media_type() == type;
-             }) != senders_.end();
-}
-
-RtpSenderInternal* PeerConnection::FindSenderById(const std::string& id) {
-  auto it = std::find_if(
-      senders_.begin(), senders_.end(),
-      [id](const rtc::scoped_refptr<
-           RtpSenderProxyWithInternal<RtpSenderInternal>>& sender) {
-        return sender->id() == id;
-      });
-  return it != senders_.end() ? (*it)->internal() : nullptr;
-}
-
-std::vector<
-    rtc::scoped_refptr<RtpSenderProxyWithInternal<RtpSenderInternal>>>::iterator
-PeerConnection::FindSenderForTrack(MediaStreamTrackInterface* track) {
-  return std::find_if(
-      senders_.begin(), senders_.end(),
-      [track](const rtc::scoped_refptr<
-              RtpSenderProxyWithInternal<RtpSenderInternal>>& sender) {
-        return sender->track() == track;
-      });
-}
-
-std::vector<rtc::scoped_refptr<
-    RtpReceiverProxyWithInternal<RtpReceiverInternal>>>::iterator
-PeerConnection::FindReceiverForTrack(const std::string& track_id) {
-  return std::find_if(
-      receivers_.begin(), receivers_.end(),
-      [track_id](const rtc::scoped_refptr<
-                 RtpReceiverProxyWithInternal<RtpReceiverInternal>>& receiver) {
-        return receiver->id() == track_id;
-      });
-}
-
-PeerConnection::TrackInfos* PeerConnection::GetRemoteTracks(
-    cricket::MediaType media_type) {
-  RTC_DCHECK(media_type == cricket::MEDIA_TYPE_AUDIO ||
-             media_type == cricket::MEDIA_TYPE_VIDEO);
-  return (media_type == cricket::MEDIA_TYPE_AUDIO) ? &remote_audio_tracks_
-                                                   : &remote_video_tracks_;
-}
-
-PeerConnection::TrackInfos* PeerConnection::GetLocalTracks(
-    cricket::MediaType media_type) {
-  RTC_DCHECK(media_type == cricket::MEDIA_TYPE_AUDIO ||
-             media_type == cricket::MEDIA_TYPE_VIDEO);
-  return (media_type == cricket::MEDIA_TYPE_AUDIO) ? &local_audio_tracks_
-                                                   : &local_video_tracks_;
-}
-
-const PeerConnection::TrackInfo* PeerConnection::FindTrackInfo(
-    const PeerConnection::TrackInfos& infos,
-    const std::string& stream_label,
-    const std::string track_id) const {
-  for (const TrackInfo& track_info : infos) {
-    if (track_info.stream_label == stream_label &&
-        track_info.track_id == track_id) {
-      return &track_info;
-    }
-  }
-  return nullptr;
-}
-
-DataChannel* PeerConnection::FindDataChannelBySid(int sid) const {
-  for (const auto& channel : sctp_data_channels_) {
-    if (channel->id() == sid) {
-      return channel;
-    }
-  }
-  return nullptr;
-}
-
-bool PeerConnection::InitializePortAllocator_n(
-    const RTCConfiguration& configuration) {
-  cricket::ServerAddresses stun_servers;
-  std::vector<cricket::RelayServerConfig> turn_servers;
-  if (ParseIceServers(configuration.servers, &stun_servers, &turn_servers) !=
-      RTCErrorType::NONE) {
-    return false;
-  }
-
-  port_allocator_->Initialize();
-
-  // To handle both internal and externally created port allocator, we will
-  // enable BUNDLE here.
-  int portallocator_flags = port_allocator_->flags();
-  portallocator_flags |= cricket::PORTALLOCATOR_ENABLE_SHARED_SOCKET |
-                         cricket::PORTALLOCATOR_ENABLE_IPV6 |
-                         cricket::PORTALLOCATOR_ENABLE_IPV6_ON_WIFI;
-  // If the disable-IPv6 flag was specified, we'll not override it
-  // by experiment.
-  if (configuration.disable_ipv6) {
-    portallocator_flags &= ~(cricket::PORTALLOCATOR_ENABLE_IPV6);
-  } else if (webrtc::field_trial::FindFullName("WebRTC-IPv6Default")
-                 .find("Disabled") == 0) {
-    portallocator_flags &= ~(cricket::PORTALLOCATOR_ENABLE_IPV6);
-  }
-
-  if (configuration.disable_ipv6_on_wifi) {
-    portallocator_flags &= ~(cricket::PORTALLOCATOR_ENABLE_IPV6_ON_WIFI);
-    LOG(LS_INFO) << "IPv6 candidates on Wi-Fi are disabled.";
-  }
-
-  if (configuration.tcp_candidate_policy == kTcpCandidatePolicyDisabled) {
-    portallocator_flags |= cricket::PORTALLOCATOR_DISABLE_TCP;
-    LOG(LS_INFO) << "TCP candidates are disabled.";
-  }
-
-  if (configuration.candidate_network_policy ==
-      kCandidateNetworkPolicyLowCost) {
-    portallocator_flags |= cricket::PORTALLOCATOR_DISABLE_COSTLY_NETWORKS;
-    LOG(LS_INFO) << "Do not gather candidates on high-cost networks";
-  }
-
-  port_allocator_->set_flags(portallocator_flags);
-  // No step delay is used while allocating ports.
-  port_allocator_->set_step_delay(cricket::kMinimumStepDelay);
-  port_allocator_->set_candidate_filter(
-      ConvertIceTransportTypeToCandidateFilter(configuration.type));
-  port_allocator_->set_max_ipv6_networks(configuration.max_ipv6_networks);
-
-  // Call this last since it may create pooled allocator sessions using the
-  // properties set above.
-  port_allocator_->SetConfiguration(stun_servers, turn_servers,
-                                    configuration.ice_candidate_pool_size,
-                                    configuration.prune_turn_ports);
-  return true;
-}
-
-bool PeerConnection::ReconfigurePortAllocator_n(
-    const cricket::ServerAddresses& stun_servers,
-    const std::vector<cricket::RelayServerConfig>& turn_servers,
-    IceTransportsType type,
-    int candidate_pool_size,
-    bool prune_turn_ports) {
-  port_allocator_->set_candidate_filter(
-      ConvertIceTransportTypeToCandidateFilter(type));
-  // Call this last since it may create pooled allocator sessions using the
-  // candidate filter set above.
-  return port_allocator_->SetConfiguration(
-      stun_servers, turn_servers, candidate_pool_size, prune_turn_ports);
-}
-
-bool PeerConnection::StartRtcEventLog_w(rtc::PlatformFile file,
-                                        int64_t max_size_bytes) {
-  if (!event_log_) {
-    return false;
-  }
-  return event_log_->StartLogging(file, max_size_bytes);
-}
-
-void PeerConnection::StopRtcEventLog_w() {
-  if (event_log_) {
-    event_log_->StopLogging();
-  }
-}
-
-}  // namespace webrtc
diff --git a/pc/peerconnection.h b/pc/peerconnection.h
deleted file mode 100644
index 5889629..0000000
--- a/pc/peerconnection.h
+++ /dev/null
@@ -1,449 +0,0 @@
-/*
- *  Copyright 2012 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_PC_PEERCONNECTION_H_
-#define WEBRTC_PC_PEERCONNECTION_H_
-
-#include <string>
-#include <map>
-#include <memory>
-#include <vector>
-
-#include "webrtc/api/peerconnectioninterface.h"
-#include "webrtc/pc/iceserverparsing.h"
-#include "webrtc/pc/peerconnectionfactory.h"
-#include "webrtc/pc/rtcstatscollector.h"
-#include "webrtc/pc/rtpreceiver.h"
-#include "webrtc/pc/rtpsender.h"
-#include "webrtc/pc/statscollector.h"
-#include "webrtc/pc/streamcollection.h"
-#include "webrtc/pc/webrtcsession.h"
-
-namespace webrtc {
-
-class MediaStreamObserver;
-class VideoRtpReceiver;
-class RtcEventLog;
-
-// TODO(zhihuang): Remove this declaration when the WebRtcSession tests don't
-// need it.
-void ExtractSharedMediaSessionOptions(
-    const PeerConnectionInterface::RTCOfferAnswerOptions& rtc_options,
-    cricket::MediaSessionOptions* session_options);
-
-// PeerConnection implements the PeerConnectionInterface interface.
-// It uses WebRtcSession to implement the PeerConnection functionality.
-class PeerConnection : public PeerConnectionInterface,
-                       public IceObserver,
-                       public rtc::MessageHandler,
-                       public sigslot::has_slots<> {
- public:
-  explicit PeerConnection(PeerConnectionFactory* factory,
-                          std::unique_ptr<RtcEventLog> event_log,
-                          std::unique_ptr<Call> call);
-
-  bool Initialize(
-      const PeerConnectionInterface::RTCConfiguration& configuration,
-      std::unique_ptr<cricket::PortAllocator> allocator,
-      std::unique_ptr<rtc::RTCCertificateGeneratorInterface> cert_generator,
-      PeerConnectionObserver* observer);
-
-  rtc::scoped_refptr<StreamCollectionInterface> local_streams() override;
-  rtc::scoped_refptr<StreamCollectionInterface> remote_streams() override;
-  bool AddStream(MediaStreamInterface* local_stream) override;
-  void RemoveStream(MediaStreamInterface* local_stream) override;
-
-  rtc::scoped_refptr<RtpSenderInterface> AddTrack(
-      MediaStreamTrackInterface* track,
-      std::vector<MediaStreamInterface*> streams) override;
-  bool RemoveTrack(RtpSenderInterface* sender) override;
-
-  virtual WebRtcSession* session() { return session_.get(); }
-
-  rtc::scoped_refptr<DtmfSenderInterface> CreateDtmfSender(
-      AudioTrackInterface* track) override;
-
-  rtc::scoped_refptr<RtpSenderInterface> CreateSender(
-      const std::string& kind,
-      const std::string& stream_id) override;
-
-  std::vector<rtc::scoped_refptr<RtpSenderInterface>> GetSenders()
-      const override;
-  std::vector<rtc::scoped_refptr<RtpReceiverInterface>> GetReceivers()
-      const override;
-
-  rtc::scoped_refptr<DataChannelInterface> CreateDataChannel(
-      const std::string& label,
-      const DataChannelInit* config) override;
-  bool GetStats(StatsObserver* observer,
-                webrtc::MediaStreamTrackInterface* track,
-                StatsOutputLevel level) override;
-  void GetStats(RTCStatsCollectorCallback* callback) override;
-
-  SignalingState signaling_state() override;
-
-  IceConnectionState ice_connection_state() override;
-  IceGatheringState ice_gathering_state() override;
-
-  const SessionDescriptionInterface* local_description() const override;
-  const SessionDescriptionInterface* remote_description() const override;
-  const SessionDescriptionInterface* current_local_description() const override;
-  const SessionDescriptionInterface* current_remote_description()
-      const override;
-  const SessionDescriptionInterface* pending_local_description() const override;
-  const SessionDescriptionInterface* pending_remote_description()
-      const override;
-
-  // JSEP01
-  // Deprecated, use version without constraints.
-  void CreateOffer(CreateSessionDescriptionObserver* observer,
-                   const MediaConstraintsInterface* constraints) override;
-  void CreateOffer(CreateSessionDescriptionObserver* observer,
-                   const RTCOfferAnswerOptions& options) override;
-  // Deprecated, use version without constraints.
-  void CreateAnswer(CreateSessionDescriptionObserver* observer,
-                    const MediaConstraintsInterface* constraints) override;
-  void CreateAnswer(CreateSessionDescriptionObserver* observer,
-                    const RTCOfferAnswerOptions& options) override;
-  void SetLocalDescription(SetSessionDescriptionObserver* observer,
-                           SessionDescriptionInterface* desc) override;
-  void SetRemoteDescription(SetSessionDescriptionObserver* observer,
-                            SessionDescriptionInterface* desc) override;
-  PeerConnectionInterface::RTCConfiguration GetConfiguration() override;
-  bool SetConfiguration(
-      const PeerConnectionInterface::RTCConfiguration& configuration,
-      RTCError* error) override;
-  bool SetConfiguration(
-      const PeerConnectionInterface::RTCConfiguration& configuration) override {
-    return SetConfiguration(configuration, nullptr);
-  }
-  bool AddIceCandidate(const IceCandidateInterface* candidate) override;
-  bool RemoveIceCandidates(
-      const std::vector<cricket::Candidate>& candidates) override;
-
-  void RegisterUMAObserver(UMAObserver* observer) override;
-
-  RTCError SetBitrate(const BitrateParameters& bitrate) override;
-
-  bool StartRtcEventLog(rtc::PlatformFile file,
-                        int64_t max_size_bytes) override;
-  void StopRtcEventLog() override;
-
-  void Close() override;
-
-  sigslot::signal1<DataChannel*> SignalDataChannelCreated;
-
-  // Virtual for unit tests.
-  virtual const std::vector<rtc::scoped_refptr<DataChannel>>&
-  sctp_data_channels() const {
-    return sctp_data_channels_;
-  }
-
- protected:
-  ~PeerConnection() override;
-
- private:
-  struct TrackInfo {
-    TrackInfo() : ssrc(0) {}
-    TrackInfo(const std::string& stream_label,
-              const std::string track_id,
-              uint32_t ssrc)
-        : stream_label(stream_label), track_id(track_id), ssrc(ssrc) {}
-    bool operator==(const TrackInfo& other) {
-      return this->stream_label == other.stream_label &&
-             this->track_id == other.track_id && this->ssrc == other.ssrc;
-    }
-    std::string stream_label;
-    std::string track_id;
-    uint32_t ssrc;
-  };
-  typedef std::vector<TrackInfo> TrackInfos;
-
-  // Implements MessageHandler.
-  void OnMessage(rtc::Message* msg) override;
-
-  void CreateAudioReceiver(MediaStreamInterface* stream,
-                           const std::string& track_id,
-                           uint32_t ssrc);
-
-  void CreateVideoReceiver(MediaStreamInterface* stream,
-                           const std::string& track_id,
-                           uint32_t ssrc);
-  void DestroyReceiver(const std::string& track_id);
-
-  // May be called either by AddStream/RemoveStream, or when a track is
-  // added/removed from a stream previously added via AddStream.
-  void AddAudioTrack(AudioTrackInterface* track, MediaStreamInterface* stream);
-  void RemoveAudioTrack(AudioTrackInterface* track,
-                        MediaStreamInterface* stream);
-  void AddVideoTrack(VideoTrackInterface* track, MediaStreamInterface* stream);
-  void RemoveVideoTrack(VideoTrackInterface* track,
-                        MediaStreamInterface* stream);
-
-  // Implements IceObserver
-  void OnIceConnectionStateChange(IceConnectionState new_state) override;
-  void OnIceGatheringChange(IceGatheringState new_state) override;
-  void OnIceCandidate(
-      std::unique_ptr<IceCandidateInterface> candidate) override;
-  void OnIceCandidatesRemoved(
-      const std::vector<cricket::Candidate>& candidates) override;
-  void OnIceConnectionReceivingChange(bool receiving) override;
-
-  // Signals from WebRtcSession.
-  void OnSessionStateChange(WebRtcSession* session, WebRtcSession::State state);
-  void ChangeSignalingState(SignalingState signaling_state);
-
-  // Signals from MediaStreamObserver.
-  void OnAudioTrackAdded(AudioTrackInterface* track,
-                         MediaStreamInterface* stream);
-  void OnAudioTrackRemoved(AudioTrackInterface* track,
-                           MediaStreamInterface* stream);
-  void OnVideoTrackAdded(VideoTrackInterface* track,
-                         MediaStreamInterface* stream);
-  void OnVideoTrackRemoved(VideoTrackInterface* track,
-                           MediaStreamInterface* stream);
-
-  rtc::Thread* signaling_thread() const {
-    return factory_->signaling_thread();
-  }
-
-  rtc::Thread* network_thread() const { return factory_->network_thread(); }
-
-  void PostSetSessionDescriptionFailure(SetSessionDescriptionObserver* observer,
-                                        const std::string& error);
-  void PostCreateSessionDescriptionFailure(
-      CreateSessionDescriptionObserver* observer,
-      const std::string& error);
-
-  bool IsClosed() const {
-    return signaling_state_ == PeerConnectionInterface::kClosed;
-  }
-
-  // Returns a MediaSessionOptions struct with options decided by |options|,
-  // the local MediaStreams and DataChannels.
-  void GetOptionsForOffer(
-      const PeerConnectionInterface::RTCOfferAnswerOptions& rtc_options,
-      cricket::MediaSessionOptions* session_options);
-
-  // Returns a MediaSessionOptions struct with options decided by
-  // |constraints|, the local MediaStreams and DataChannels.
-  void GetOptionsForAnswer(const RTCOfferAnswerOptions& options,
-                           cricket::MediaSessionOptions* session_options);
-
-  // Generates MediaDescriptionOptions for the |session_opts| based on existing
-  // local description or remote description.
-  void GenerateMediaDescriptionOptions(
-      const SessionDescriptionInterface* session_desc,
-      cricket::RtpTransceiverDirection audio_direction,
-      cricket::RtpTransceiverDirection video_direction,
-      rtc::Optional<size_t>* audio_index,
-      rtc::Optional<size_t>* video_index,
-      rtc::Optional<size_t>* data_index,
-      cricket::MediaSessionOptions* session_options);
-
-  // Remove all local and remote tracks of type |media_type|.
-  // Called when a media type is rejected (m-line set to port 0).
-  void RemoveTracks(cricket::MediaType media_type);
-
-  // Makes sure a MediaStreamTrack is created for each StreamParam in |streams|,
-  // and existing MediaStreamTracks are removed if there is no corresponding
-  // StreamParam. If |default_track_needed| is true, a default MediaStreamTrack
-  // is created if it doesn't exist; if false, it's removed if it exists.
-  // |media_type| is the type of the |streams| and can be either audio or video.
-  // If a new MediaStream is created it is added to |new_streams|.
-  void UpdateRemoteStreamsList(
-      const std::vector<cricket::StreamParams>& streams,
-      bool default_track_needed,
-      cricket::MediaType media_type,
-      StreamCollection* new_streams);
-
-  // Triggered when a remote track has been seen for the first time in a remote
-  // session description. It creates a remote MediaStreamTrackInterface
-  // implementation and triggers CreateAudioReceiver or CreateVideoReceiver.
-  void OnRemoteTrackSeen(const std::string& stream_label,
-                         const std::string& track_id,
-                         uint32_t ssrc,
-                         cricket::MediaType media_type);
-
-  // Triggered when a remote track has been removed from a remote session
-  // description. It removes the remote track with id |track_id| from a remote
-  // MediaStream and triggers DestroyAudioReceiver or DestroyVideoReceiver.
-  void OnRemoteTrackRemoved(const std::string& stream_label,
-                            const std::string& track_id,
-                            cricket::MediaType media_type);
-
-  // Finds remote MediaStreams without any tracks and removes them from
-  // |remote_streams_| and notifies the observer that the MediaStreams no longer
-  // exist.
-  void UpdateEndedRemoteMediaStreams();
-
-  // Loops through the vector of |streams| and finds added and removed
-  // StreamParams since last time this method was called.
-  // For each new or removed StreamParam, OnLocalTrackSeen or
-  // OnLocalTrackRemoved is invoked.
-  void UpdateLocalTracks(const std::vector<cricket::StreamParams>& streams,
-                         cricket::MediaType media_type);
-
-  // Triggered when a local track has been seen for the first time in a local
-  // session description.
-  // This method triggers CreateAudioSender or CreateVideoSender if the rtp
-  // streams in the local SessionDescription can be mapped to a MediaStreamTrack
-  // in a MediaStream in |local_streams_|
-  void OnLocalTrackSeen(const std::string& stream_label,
-                        const std::string& track_id,
-                        uint32_t ssrc,
-                        cricket::MediaType media_type);
-
-  // Triggered when a local track has been removed from a local session
-  // description.
-  // This method triggers DestroyAudioSender or DestroyVideoSender if a stream
-  // has been removed from the local SessionDescription and the stream can be
-  // mapped to a MediaStreamTrack in a MediaStream in |local_streams_|.
-  void OnLocalTrackRemoved(const std::string& stream_label,
-                           const std::string& track_id,
-                           uint32_t ssrc,
-                           cricket::MediaType media_type);
-
-  void UpdateLocalRtpDataChannels(const cricket::StreamParamsVec& streams);
-  void UpdateRemoteRtpDataChannels(const cricket::StreamParamsVec& streams);
-  void UpdateClosingRtpDataChannels(
-      const std::vector<std::string>& active_channels,
-      bool is_local_update);
-  void CreateRemoteRtpDataChannel(const std::string& label,
-                                  uint32_t remote_ssrc);
-
-  // Creates channel and adds it to the collection of DataChannels that will
-  // be offered in a SessionDescription.
-  rtc::scoped_refptr<DataChannel> InternalCreateDataChannel(
-      const std::string& label,
-      const InternalDataChannelInit* config);
-
-  // Checks if any data channel has been added.
-  bool HasDataChannels() const;
-
-  void AllocateSctpSids(rtc::SSLRole role);
-  void OnSctpDataChannelClosed(DataChannel* channel);
-
-  // Notifications from WebRtcSession relating to BaseChannels.
-  void OnVoiceChannelCreated();
-  void OnVoiceChannelDestroyed();
-  void OnVideoChannelCreated();
-  void OnVideoChannelDestroyed();
-  void OnDataChannelCreated();
-  void OnDataChannelDestroyed();
-  // Called when the cricket::DataChannel receives a message indicating that a
-  // webrtc::DataChannel should be opened.
-  void OnDataChannelOpenMessage(const std::string& label,
-                                const InternalDataChannelInit& config);
-
-  bool HasRtpSender(cricket::MediaType type) const;
-  RtpSenderInternal* FindSenderById(const std::string& id);
-
-  std::vector<rtc::scoped_refptr<
-      RtpSenderProxyWithInternal<RtpSenderInternal>>>::iterator
-  FindSenderForTrack(MediaStreamTrackInterface* track);
-  std::vector<rtc::scoped_refptr<
-      RtpReceiverProxyWithInternal<RtpReceiverInternal>>>::iterator
-  FindReceiverForTrack(const std::string& track_id);
-
-  TrackInfos* GetRemoteTracks(cricket::MediaType media_type);
-  TrackInfos* GetLocalTracks(cricket::MediaType media_type);
-  const TrackInfo* FindTrackInfo(const TrackInfos& infos,
-                                 const std::string& stream_label,
-                                 const std::string track_id) const;
-
-  // Returns the specified SCTP DataChannel in sctp_data_channels_,
-  // or nullptr if not found.
-  DataChannel* FindDataChannelBySid(int sid) const;
-
-  // Called when first configuring the port allocator.
-  bool InitializePortAllocator_n(const RTCConfiguration& configuration);
-  // Called when SetConfiguration is called to apply the supported subset
-  // of the configuration on the network thread.
-  bool ReconfigurePortAllocator_n(
-      const cricket::ServerAddresses& stun_servers,
-      const std::vector<cricket::RelayServerConfig>& turn_servers,
-      IceTransportsType type,
-      int candidate_pool_size,
-      bool prune_turn_ports);
-
-  // Starts recording an Rtc EventLog using the supplied platform file.
-  // This function should only be called from the worker thread.
-  bool StartRtcEventLog_w(rtc::PlatformFile file, int64_t max_size_bytes);
-  // Starts recording an Rtc EventLog using the supplied platform file.
-  // This function should only be called from the worker thread.
-  void StopRtcEventLog_w();
-
-  // Ensures the configuration doesn't have any parameters with invalid values,
-  // or values that conflict with other parameters.
-  //
-  // Returns RTCError::OK() if there are no issues.
-  RTCError ValidateConfiguration(const RTCConfiguration& config) const;
-
-  // Storing the factory as a scoped reference pointer ensures that the memory
-  // in the PeerConnectionFactoryImpl remains available as long as the
-  // PeerConnection is running. It is passed to PeerConnection as a raw pointer.
-  // However, since the reference counting is done in the
-  // PeerConnectionFactoryInterface all instances created using the raw pointer
-  // will refer to the same reference count.
-  rtc::scoped_refptr<PeerConnectionFactory> factory_;
-  PeerConnectionObserver* observer_;
-  UMAObserver* uma_observer_;
-
-  // The EventLog needs to outlive |call_| (and any other object that uses it).
-  std::unique_ptr<RtcEventLog> event_log_;
-
-  SignalingState signaling_state_;
-  IceConnectionState ice_connection_state_;
-  IceGatheringState ice_gathering_state_;
-  PeerConnectionInterface::RTCConfiguration configuration_;
-
-  std::unique_ptr<cricket::PortAllocator> port_allocator_;
-
-  // One PeerConnection has only one RTCP CNAME.
-  // https://tools.ietf.org/html/draft-ietf-rtcweb-rtp-usage-26#section-4.9
-  std::string rtcp_cname_;
-
-  // Streams added via AddStream.
-  rtc::scoped_refptr<StreamCollection> local_streams_;
-  // Streams created as a result of SetRemoteDescription.
-  rtc::scoped_refptr<StreamCollection> remote_streams_;
-
-  std::vector<std::unique_ptr<MediaStreamObserver>> stream_observers_;
-
-  // These lists store track info seen in local/remote descriptions.
-  TrackInfos remote_audio_tracks_;
-  TrackInfos remote_video_tracks_;
-  TrackInfos local_audio_tracks_;
-  TrackInfos local_video_tracks_;
-
-  SctpSidAllocator sid_allocator_;
-  // label -> DataChannel
-  std::map<std::string, rtc::scoped_refptr<DataChannel>> rtp_data_channels_;
-  std::vector<rtc::scoped_refptr<DataChannel>> sctp_data_channels_;
-  std::vector<rtc::scoped_refptr<DataChannel>> sctp_data_channels_to_free_;
-
-  bool remote_peer_supports_msid_ = false;
-
-  std::unique_ptr<Call> call_;
-  std::unique_ptr<WebRtcSession> session_;
-  std::unique_ptr<StatsCollector> stats_;  // A pointer is passed to senders_
-  rtc::scoped_refptr<RTCStatsCollector> stats_collector_;
-
-  std::vector<rtc::scoped_refptr<RtpSenderProxyWithInternal<RtpSenderInternal>>>
-      senders_;
-  std::vector<
-      rtc::scoped_refptr<RtpReceiverProxyWithInternal<RtpReceiverInternal>>>
-      receivers_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_PC_PEERCONNECTION_H_
diff --git a/pc/peerconnection_integrationtest.cc b/pc/peerconnection_integrationtest.cc
deleted file mode 100644
index 6760b14..0000000
--- a/pc/peerconnection_integrationtest.cc
+++ /dev/null
@@ -1,3007 +0,0 @@
-/*
- *  Copyright 2012 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.
- */
-
-// Disable for TSan v2, see
-// https://code.google.com/p/webrtc/issues/detail?id=1205 for details.
-#if !defined(THREAD_SANITIZER)
-
-#include <stdio.h>
-
-#include <algorithm>
-#include <functional>
-#include <list>
-#include <map>
-#include <memory>
-#include <utility>
-#include <vector>
-
-#include "webrtc/api/fakemetricsobserver.h"
-#include "webrtc/api/mediastreaminterface.h"
-#include "webrtc/api/peerconnectioninterface.h"
-#include "webrtc/api/test/fakeconstraints.h"
-#include "webrtc/media/engine/fakewebrtcvideoengine.h"
-#include "webrtc/p2p/base/p2pconstants.h"
-#include "webrtc/p2p/base/portinterface.h"
-#include "webrtc/p2p/base/sessiondescription.h"
-#include "webrtc/p2p/base/testturnserver.h"
-#include "webrtc/p2p/client/basicportallocator.h"
-#include "webrtc/pc/dtmfsender.h"
-#include "webrtc/pc/localaudiosource.h"
-#include "webrtc/pc/mediasession.h"
-#include "webrtc/pc/peerconnection.h"
-#include "webrtc/pc/peerconnectionfactory.h"
-#include "webrtc/pc/test/fakeaudiocapturemodule.h"
-#include "webrtc/pc/test/fakeperiodicvideocapturer.h"
-#include "webrtc/pc/test/fakertccertificategenerator.h"
-#include "webrtc/pc/test/fakevideotrackrenderer.h"
-#include "webrtc/pc/test/mockpeerconnectionobservers.h"
-#include "webrtc/rtc_base/asyncinvoker.h"
-#include "webrtc/rtc_base/fakenetwork.h"
-#include "webrtc/rtc_base/gunit.h"
-#include "webrtc/rtc_base/helpers.h"
-#include "webrtc/rtc_base/ssladapter.h"
-#include "webrtc/rtc_base/sslstreamadapter.h"
-#include "webrtc/rtc_base/thread.h"
-#include "webrtc/rtc_base/virtualsocketserver.h"
-
-using cricket::ContentInfo;
-using cricket::FakeWebRtcVideoDecoder;
-using cricket::FakeWebRtcVideoDecoderFactory;
-using cricket::FakeWebRtcVideoEncoder;
-using cricket::FakeWebRtcVideoEncoderFactory;
-using cricket::MediaContentDescription;
-using webrtc::DataBuffer;
-using webrtc::DataChannelInterface;
-using webrtc::DtmfSender;
-using webrtc::DtmfSenderInterface;
-using webrtc::DtmfSenderObserverInterface;
-using webrtc::FakeConstraints;
-using webrtc::MediaConstraintsInterface;
-using webrtc::MediaStreamInterface;
-using webrtc::MediaStreamTrackInterface;
-using webrtc::MockCreateSessionDescriptionObserver;
-using webrtc::MockDataChannelObserver;
-using webrtc::MockSetSessionDescriptionObserver;
-using webrtc::MockStatsObserver;
-using webrtc::ObserverInterface;
-using webrtc::PeerConnectionInterface;
-using webrtc::PeerConnectionFactory;
-using webrtc::SessionDescriptionInterface;
-using webrtc::StreamCollectionInterface;
-
-namespace {
-
-static const int kDefaultTimeout = 10000;
-static const int kMaxWaitForStatsMs = 3000;
-static const int kMaxWaitForActivationMs = 5000;
-static const int kMaxWaitForFramesMs = 10000;
-// Default number of audio/video frames to wait for before considering a test
-// successful.
-static const int kDefaultExpectedAudioFrameCount = 3;
-static const int kDefaultExpectedVideoFrameCount = 3;
-
-static const char kDataChannelLabel[] = "data_channel";
-
-// SRTP cipher name negotiated by the tests. This must be updated if the
-// default changes.
-static const int kDefaultSrtpCryptoSuite = rtc::SRTP_AES128_CM_SHA1_32;
-static const int kDefaultSrtpCryptoSuiteGcm = rtc::SRTP_AEAD_AES_256_GCM;
-
-// Helper function for constructing offer/answer options to initiate an ICE
-// restart.
-PeerConnectionInterface::RTCOfferAnswerOptions IceRestartOfferAnswerOptions() {
-  PeerConnectionInterface::RTCOfferAnswerOptions options;
-  options.ice_restart = true;
-  return options;
-}
-
-// Remove all stream information (SSRCs, track IDs, etc.) and "msid-semantic"
-// attribute from received SDP, simulating a legacy endpoint.
-void RemoveSsrcsAndMsids(cricket::SessionDescription* desc) {
-  for (ContentInfo& content : desc->contents()) {
-    MediaContentDescription* media_desc =
-        static_cast<MediaContentDescription*>(content.description);
-    media_desc->mutable_streams().clear();
-  }
-  desc->set_msid_supported(false);
-}
-
-int FindFirstMediaStatsIndexByKind(
-    const std::string& kind,
-    const std::vector<const webrtc::RTCMediaStreamTrackStats*>&
-        media_stats_vec) {
-  for (size_t i = 0; i < media_stats_vec.size(); i++) {
-    if (media_stats_vec[i]->kind.ValueToString() == kind) {
-      return i;
-    }
-  }
-  return -1;
-}
-
-class SignalingMessageReceiver {
- public:
-  virtual void ReceiveSdpMessage(const std::string& type,
-                                 const std::string& msg) = 0;
-  virtual void ReceiveIceMessage(const std::string& sdp_mid,
-                                 int sdp_mline_index,
-                                 const std::string& msg) = 0;
-
- protected:
-  SignalingMessageReceiver() {}
-  virtual ~SignalingMessageReceiver() {}
-};
-
-class MockRtpReceiverObserver : public webrtc::RtpReceiverObserverInterface {
- public:
-  explicit MockRtpReceiverObserver(cricket::MediaType media_type)
-      : expected_media_type_(media_type) {}
-
-  void OnFirstPacketReceived(cricket::MediaType media_type) override {
-    ASSERT_EQ(expected_media_type_, media_type);
-    first_packet_received_ = true;
-  }
-
-  bool first_packet_received() const { return first_packet_received_; }
-
-  virtual ~MockRtpReceiverObserver() {}
-
- private:
-  bool first_packet_received_ = false;
-  cricket::MediaType expected_media_type_;
-};
-
-// Helper class that wraps a peer connection, observes it, and can accept
-// signaling messages from another wrapper.
-//
-// Uses a fake network, fake A/V capture, and optionally fake
-// encoders/decoders, though they aren't used by default since they don't
-// advertise support of any codecs.
-class PeerConnectionWrapper : public webrtc::PeerConnectionObserver,
-                              public SignalingMessageReceiver,
-                              public ObserverInterface {
- public:
-  // Different factory methods for convenience.
-  // TODO(deadbeef): Could use the pattern of:
-  //
-  // PeerConnectionWrapper =
-  //     WrapperBuilder.WithConfig(...).WithOptions(...).build();
-  //
-  // To reduce some code duplication.
-  static PeerConnectionWrapper* CreateWithDtlsIdentityStore(
-      const std::string& debug_name,
-      std::unique_ptr<rtc::RTCCertificateGeneratorInterface> cert_generator,
-      rtc::Thread* network_thread,
-      rtc::Thread* worker_thread) {
-    PeerConnectionWrapper* client(new PeerConnectionWrapper(debug_name));
-    if (!client->Init(nullptr, nullptr, nullptr, std::move(cert_generator),
-                      network_thread, worker_thread)) {
-      delete client;
-      return nullptr;
-    }
-    return client;
-  }
-
-  static PeerConnectionWrapper* CreateWithConfig(
-      const std::string& debug_name,
-      const PeerConnectionInterface::RTCConfiguration& config,
-      rtc::Thread* network_thread,
-      rtc::Thread* worker_thread) {
-    std::unique_ptr<FakeRTCCertificateGenerator> cert_generator(
-        new FakeRTCCertificateGenerator());
-    PeerConnectionWrapper* client(new PeerConnectionWrapper(debug_name));
-    if (!client->Init(nullptr, nullptr, &config, std::move(cert_generator),
-                      network_thread, worker_thread)) {
-      delete client;
-      return nullptr;
-    }
-    return client;
-  }
-
-  static PeerConnectionWrapper* CreateWithOptions(
-      const std::string& debug_name,
-      const PeerConnectionFactory::Options& options,
-      rtc::Thread* network_thread,
-      rtc::Thread* worker_thread) {
-    std::unique_ptr<FakeRTCCertificateGenerator> cert_generator(
-        new FakeRTCCertificateGenerator());
-    PeerConnectionWrapper* client(new PeerConnectionWrapper(debug_name));
-    if (!client->Init(nullptr, &options, nullptr, std::move(cert_generator),
-                      network_thread, worker_thread)) {
-      delete client;
-      return nullptr;
-    }
-    return client;
-  }
-
-  static PeerConnectionWrapper* CreateWithConstraints(
-      const std::string& debug_name,
-      const MediaConstraintsInterface* constraints,
-      rtc::Thread* network_thread,
-      rtc::Thread* worker_thread) {
-    std::unique_ptr<FakeRTCCertificateGenerator> cert_generator(
-        new FakeRTCCertificateGenerator());
-    PeerConnectionWrapper* client(new PeerConnectionWrapper(debug_name));
-    if (!client->Init(constraints, nullptr, nullptr, std::move(cert_generator),
-                      network_thread, worker_thread)) {
-      delete client;
-      return nullptr;
-    }
-    return client;
-  }
-
-  webrtc::PeerConnectionFactoryInterface* pc_factory() const {
-    return peer_connection_factory_.get();
-  }
-
-  webrtc::PeerConnectionInterface* pc() const { return peer_connection_.get(); }
-
-  // If a signaling message receiver is set (via ConnectFakeSignaling), this
-  // will set the whole offer/answer exchange in motion. Just need to wait for
-  // the signaling state to reach "stable".
-  void CreateAndSetAndSignalOffer() {
-    auto offer = CreateOffer();
-    ASSERT_NE(nullptr, offer);
-    EXPECT_TRUE(SetLocalDescriptionAndSendSdpMessage(std::move(offer)));
-  }
-
-  // Sets the options to be used when CreateAndSetAndSignalOffer is called, or
-  // when a remote offer is received (via fake signaling) and an answer is
-  // generated. By default, uses default options.
-  void SetOfferAnswerOptions(
-      const PeerConnectionInterface::RTCOfferAnswerOptions& options) {
-    offer_answer_options_ = options;
-  }
-
-  // Set a callback to be invoked when SDP is received via the fake signaling
-  // channel, which provides an opportunity to munge (modify) the SDP. This is
-  // used to test SDP being applied that a PeerConnection would normally not
-  // generate, but a non-JSEP endpoint might.
-  void SetReceivedSdpMunger(
-      std::function<void(cricket::SessionDescription*)> munger) {
-    received_sdp_munger_ = munger;
-  }
-
-  // Similar to the above, but this is run on SDP immediately after it's
-  // generated.
-  void SetGeneratedSdpMunger(
-      std::function<void(cricket::SessionDescription*)> munger) {
-    generated_sdp_munger_ = munger;
-  }
-
-  // Number of times the gathering state has transitioned to "gathering".
-  // Useful for telling if an ICE restart occurred as expected.
-  int transitions_to_gathering_state() const {
-    return transitions_to_gathering_state_;
-  }
-
-  // TODO(deadbeef): Switch the majority of these tests to use AddTrack instead
-  // of AddStream since AddStream is deprecated.
-  void AddAudioVideoMediaStream() {
-    AddMediaStreamFromTracks(CreateLocalAudioTrack(), CreateLocalVideoTrack());
-  }
-
-  void AddAudioOnlyMediaStream() {
-    AddMediaStreamFromTracks(CreateLocalAudioTrack(), nullptr);
-  }
-
-  void AddVideoOnlyMediaStream() {
-    AddMediaStreamFromTracks(nullptr, CreateLocalVideoTrack());
-  }
-
-  rtc::scoped_refptr<webrtc::AudioTrackInterface> CreateLocalAudioTrack() {
-    FakeConstraints constraints;
-    // Disable highpass filter so that we can get all the test audio frames.
-    constraints.AddMandatory(MediaConstraintsInterface::kHighpassFilter, false);
-    rtc::scoped_refptr<webrtc::AudioSourceInterface> source =
-        peer_connection_factory_->CreateAudioSource(&constraints);
-    // TODO(perkj): Test audio source when it is implemented. Currently audio
-    // always use the default input.
-    return peer_connection_factory_->CreateAudioTrack(rtc::CreateRandomUuid(),
-                                                      source);
-  }
-
-  rtc::scoped_refptr<webrtc::VideoTrackInterface> CreateLocalVideoTrack() {
-    return CreateLocalVideoTrackInternal(FakeConstraints(),
-                                         webrtc::kVideoRotation_0);
-  }
-
-  rtc::scoped_refptr<webrtc::VideoTrackInterface>
-  CreateLocalVideoTrackWithConstraints(const FakeConstraints& constraints) {
-    return CreateLocalVideoTrackInternal(constraints, webrtc::kVideoRotation_0);
-  }
-
-  rtc::scoped_refptr<webrtc::VideoTrackInterface>
-  CreateLocalVideoTrackWithRotation(webrtc::VideoRotation rotation) {
-    return CreateLocalVideoTrackInternal(FakeConstraints(), rotation);
-  }
-
-  void AddMediaStreamFromTracks(
-      rtc::scoped_refptr<webrtc::AudioTrackInterface> audio,
-      rtc::scoped_refptr<webrtc::VideoTrackInterface> video) {
-    rtc::scoped_refptr<MediaStreamInterface> stream =
-        peer_connection_factory_->CreateLocalMediaStream(
-            rtc::CreateRandomUuid());
-    if (audio) {
-      stream->AddTrack(audio);
-    }
-    if (video) {
-      stream->AddTrack(video);
-    }
-    EXPECT_TRUE(pc()->AddStream(stream));
-  }
-
-  bool SignalingStateStable() {
-    return pc()->signaling_state() == webrtc::PeerConnectionInterface::kStable;
-  }
-
-  void CreateDataChannel() { CreateDataChannel(nullptr); }
-
-  void CreateDataChannel(const webrtc::DataChannelInit* init) {
-    data_channel_ = pc()->CreateDataChannel(kDataChannelLabel, init);
-    ASSERT_TRUE(data_channel_.get() != nullptr);
-    data_observer_.reset(new MockDataChannelObserver(data_channel_));
-  }
-
-  DataChannelInterface* data_channel() { return data_channel_; }
-  const MockDataChannelObserver* data_observer() const {
-    return data_observer_.get();
-  }
-
-  int audio_frames_received() const {
-    return fake_audio_capture_module_->frames_received();
-  }
-
-  // Takes minimum of video frames received for each track.
-  //
-  // Can be used like:
-  // EXPECT_GE(expected_frames, min_video_frames_received_per_track());
-  //
-  // To ensure that all video tracks received at least a certain number of
-  // frames.
-  int min_video_frames_received_per_track() const {
-    int min_frames = INT_MAX;
-    if (video_decoder_factory_enabled_) {
-      const std::vector<FakeWebRtcVideoDecoder*>& decoders =
-          fake_video_decoder_factory_->decoders();
-      if (decoders.empty()) {
-        return 0;
-      }
-      for (FakeWebRtcVideoDecoder* decoder : decoders) {
-        min_frames = std::min(min_frames, decoder->GetNumFramesReceived());
-      }
-      return min_frames;
-    } else {
-      if (fake_video_renderers_.empty()) {
-        return 0;
-      }
-
-      for (const auto& pair : fake_video_renderers_) {
-        min_frames = std::min(min_frames, pair.second->num_rendered_frames());
-      }
-      return min_frames;
-    }
-  }
-
-  // In contrast to the above, sums the video frames received for all tracks.
-  // Can be used to verify that no video frames were received, or that the
-  // counts didn't increase.
-  int total_video_frames_received() const {
-    int total = 0;
-    if (video_decoder_factory_enabled_) {
-      const std::vector<FakeWebRtcVideoDecoder*>& decoders =
-          fake_video_decoder_factory_->decoders();
-      for (const FakeWebRtcVideoDecoder* decoder : decoders) {
-        total += decoder->GetNumFramesReceived();
-      }
-    } else {
-      for (const auto& pair : fake_video_renderers_) {
-        total += pair.second->num_rendered_frames();
-      }
-      for (const auto& renderer : removed_fake_video_renderers_) {
-        total += renderer->num_rendered_frames();
-      }
-    }
-    return total;
-  }
-
-  // Returns a MockStatsObserver in a state after stats gathering finished,
-  // which can be used to access the gathered stats.
-  rtc::scoped_refptr<MockStatsObserver> OldGetStatsForTrack(
-      webrtc::MediaStreamTrackInterface* track) {
-    rtc::scoped_refptr<MockStatsObserver> observer(
-        new rtc::RefCountedObject<MockStatsObserver>());
-    EXPECT_TRUE(peer_connection_->GetStats(
-        observer, nullptr, PeerConnectionInterface::kStatsOutputLevelStandard));
-    EXPECT_TRUE_WAIT(observer->called(), kDefaultTimeout);
-    return observer;
-  }
-
-  // Version that doesn't take a track "filter", and gathers all stats.
-  rtc::scoped_refptr<MockStatsObserver> OldGetStats() {
-    return OldGetStatsForTrack(nullptr);
-  }
-
-  // Synchronously gets stats and returns them. If it times out, fails the test
-  // and returns null.
-  rtc::scoped_refptr<const webrtc::RTCStatsReport> NewGetStats() {
-    rtc::scoped_refptr<webrtc::MockRTCStatsCollectorCallback> callback(
-        new rtc::RefCountedObject<webrtc::MockRTCStatsCollectorCallback>());
-    peer_connection_->GetStats(callback);
-    EXPECT_TRUE_WAIT(callback->called(), kDefaultTimeout);
-    return callback->report();
-  }
-
-  int rendered_width() {
-    EXPECT_FALSE(fake_video_renderers_.empty());
-    return fake_video_renderers_.empty()
-               ? 0
-               : fake_video_renderers_.begin()->second->width();
-  }
-
-  int rendered_height() {
-    EXPECT_FALSE(fake_video_renderers_.empty());
-    return fake_video_renderers_.empty()
-               ? 0
-               : fake_video_renderers_.begin()->second->height();
-  }
-
-  double rendered_aspect_ratio() {
-    if (rendered_height() == 0) {
-      return 0.0;
-    }
-    return static_cast<double>(rendered_width()) / rendered_height();
-  }
-
-  webrtc::VideoRotation rendered_rotation() {
-    EXPECT_FALSE(fake_video_renderers_.empty());
-    return fake_video_renderers_.empty()
-               ? webrtc::kVideoRotation_0
-               : fake_video_renderers_.begin()->second->rotation();
-  }
-
-  int local_rendered_width() {
-    return local_video_renderer_ ? local_video_renderer_->width() : 0;
-  }
-
-  int local_rendered_height() {
-    return local_video_renderer_ ? local_video_renderer_->height() : 0;
-  }
-
-  double local_rendered_aspect_ratio() {
-    if (local_rendered_height() == 0) {
-      return 0.0;
-    }
-    return static_cast<double>(local_rendered_width()) /
-           local_rendered_height();
-  }
-
-  size_t number_of_remote_streams() {
-    if (!pc()) {
-      return 0;
-    }
-    return pc()->remote_streams()->count();
-  }
-
-  StreamCollectionInterface* remote_streams() const {
-    if (!pc()) {
-      ADD_FAILURE();
-      return nullptr;
-    }
-    return pc()->remote_streams();
-  }
-
-  StreamCollectionInterface* local_streams() {
-    if (!pc()) {
-      ADD_FAILURE();
-      return nullptr;
-    }
-    return pc()->local_streams();
-  }
-
-  webrtc::PeerConnectionInterface::SignalingState signaling_state() {
-    return pc()->signaling_state();
-  }
-
-  webrtc::PeerConnectionInterface::IceConnectionState ice_connection_state() {
-    return pc()->ice_connection_state();
-  }
-
-  webrtc::PeerConnectionInterface::IceGatheringState ice_gathering_state() {
-    return pc()->ice_gathering_state();
-  }
-
-  // Returns a MockRtpReceiverObserver for each RtpReceiver returned by
-  // GetReceivers. They're updated automatically when a remote offer/answer
-  // from the fake signaling channel is applied, or when
-  // ResetRtpReceiverObservers below is called.
-  const std::vector<std::unique_ptr<MockRtpReceiverObserver>>&
-  rtp_receiver_observers() {
-    return rtp_receiver_observers_;
-  }
-
-  void ResetRtpReceiverObservers() {
-    rtp_receiver_observers_.clear();
-    for (auto receiver : pc()->GetReceivers()) {
-      std::unique_ptr<MockRtpReceiverObserver> observer(
-          new MockRtpReceiverObserver(receiver->media_type()));
-      receiver->SetObserver(observer.get());
-      rtp_receiver_observers_.push_back(std::move(observer));
-    }
-  }
-
- private:
-  explicit PeerConnectionWrapper(const std::string& debug_name)
-      : debug_name_(debug_name) {}
-
-  bool Init(
-      const MediaConstraintsInterface* constraints,
-      const PeerConnectionFactory::Options* options,
-      const PeerConnectionInterface::RTCConfiguration* config,
-      std::unique_ptr<rtc::RTCCertificateGeneratorInterface> cert_generator,
-      rtc::Thread* network_thread,
-      rtc::Thread* worker_thread) {
-    // There's an error in this test code if Init ends up being called twice.
-    RTC_DCHECK(!peer_connection_);
-    RTC_DCHECK(!peer_connection_factory_);
-
-    fake_network_manager_.reset(new rtc::FakeNetworkManager());
-    fake_network_manager_->AddInterface(rtc::SocketAddress("192.168.1.1", 0));
-
-    std::unique_ptr<cricket::PortAllocator> port_allocator(
-        new cricket::BasicPortAllocator(fake_network_manager_.get()));
-    fake_audio_capture_module_ = FakeAudioCaptureModule::Create();
-    if (!fake_audio_capture_module_) {
-      return false;
-    }
-    // Note that these factories don't end up getting used unless supported
-    // codecs are added to them.
-    fake_video_decoder_factory_ = new FakeWebRtcVideoDecoderFactory();
-    fake_video_encoder_factory_ = new FakeWebRtcVideoEncoderFactory();
-    rtc::Thread* const signaling_thread = rtc::Thread::Current();
-    peer_connection_factory_ = webrtc::CreatePeerConnectionFactory(
-        network_thread, worker_thread, signaling_thread,
-        fake_audio_capture_module_, fake_video_encoder_factory_,
-        fake_video_decoder_factory_);
-    if (!peer_connection_factory_) {
-      return false;
-    }
-    if (options) {
-      peer_connection_factory_->SetOptions(*options);
-    }
-    peer_connection_ =
-        CreatePeerConnection(std::move(port_allocator), constraints, config,
-                             std::move(cert_generator));
-    return peer_connection_.get() != nullptr;
-  }
-
-  rtc::scoped_refptr<webrtc::PeerConnectionInterface> CreatePeerConnection(
-      std::unique_ptr<cricket::PortAllocator> port_allocator,
-      const MediaConstraintsInterface* constraints,
-      const PeerConnectionInterface::RTCConfiguration* config,
-      std::unique_ptr<rtc::RTCCertificateGeneratorInterface> cert_generator) {
-    PeerConnectionInterface::RTCConfiguration modified_config;
-    // If |config| is null, this will result in a default configuration being
-    // used.
-    if (config) {
-      modified_config = *config;
-    }
-    // Disable resolution adaptation; we don't want it interfering with the
-    // test results.
-    // TODO(deadbeef): Do something more robust. Since we're testing for aspect
-    // ratios and not specific resolutions, is this even necessary?
-    modified_config.set_cpu_adaptation(false);
-
-    return peer_connection_factory_->CreatePeerConnection(
-        modified_config, constraints, std::move(port_allocator),
-        std::move(cert_generator), this);
-  }
-
-  void set_signaling_message_receiver(
-      SignalingMessageReceiver* signaling_message_receiver) {
-    signaling_message_receiver_ = signaling_message_receiver;
-  }
-
-  void set_signaling_delay_ms(int delay_ms) { signaling_delay_ms_ = delay_ms; }
-
-  void EnableVideoDecoderFactory() {
-    video_decoder_factory_enabled_ = true;
-    fake_video_decoder_factory_->AddSupportedVideoCodecType(
-        webrtc::kVideoCodecVP8);
-  }
-
-  rtc::scoped_refptr<webrtc::VideoTrackInterface> CreateLocalVideoTrackInternal(
-      const FakeConstraints& constraints,
-      webrtc::VideoRotation rotation) {
-    // Set max frame rate to 10fps to reduce the risk of test flakiness.
-    // TODO(deadbeef): Do something more robust.
-    FakeConstraints source_constraints = constraints;
-    source_constraints.SetMandatoryMaxFrameRate(10);
-
-    cricket::FakeVideoCapturer* fake_capturer =
-        new webrtc::FakePeriodicVideoCapturer();
-    fake_capturer->SetRotation(rotation);
-    video_capturers_.push_back(fake_capturer);
-    rtc::scoped_refptr<webrtc::VideoTrackSourceInterface> source =
-        peer_connection_factory_->CreateVideoSource(fake_capturer,
-                                                    &source_constraints);
-    rtc::scoped_refptr<webrtc::VideoTrackInterface> track(
-        peer_connection_factory_->CreateVideoTrack(rtc::CreateRandomUuid(),
-                                                   source));
-    if (!local_video_renderer_) {
-      local_video_renderer_.reset(new webrtc::FakeVideoTrackRenderer(track));
-    }
-    return track;
-  }
-
-  void HandleIncomingOffer(const std::string& msg) {
-    LOG(LS_INFO) << debug_name_ << ": HandleIncomingOffer";
-    std::unique_ptr<SessionDescriptionInterface> desc(
-        webrtc::CreateSessionDescription("offer", msg, nullptr));
-    if (received_sdp_munger_) {
-      received_sdp_munger_(desc->description());
-    }
-
-    EXPECT_TRUE(SetRemoteDescription(std::move(desc)));
-    // Setting a remote description may have changed the number of receivers,
-    // so reset the receiver observers.
-    ResetRtpReceiverObservers();
-    auto answer = CreateAnswer();
-    ASSERT_NE(nullptr, answer);
-    EXPECT_TRUE(SetLocalDescriptionAndSendSdpMessage(std::move(answer)));
-  }
-
-  void HandleIncomingAnswer(const std::string& msg) {
-    LOG(LS_INFO) << debug_name_ << ": HandleIncomingAnswer";
-    std::unique_ptr<SessionDescriptionInterface> desc(
-        webrtc::CreateSessionDescription("answer", msg, nullptr));
-    if (received_sdp_munger_) {
-      received_sdp_munger_(desc->description());
-    }
-
-    EXPECT_TRUE(SetRemoteDescription(std::move(desc)));
-    // Set the RtpReceiverObserver after receivers are created.
-    ResetRtpReceiverObservers();
-  }
-
-  // Returns null on failure.
-  std::unique_ptr<SessionDescriptionInterface> CreateOffer() {
-    rtc::scoped_refptr<MockCreateSessionDescriptionObserver> observer(
-        new rtc::RefCountedObject<MockCreateSessionDescriptionObserver>());
-    pc()->CreateOffer(observer, offer_answer_options_);
-    return WaitForDescriptionFromObserver(observer);
-  }
-
-  // Returns null on failure.
-  std::unique_ptr<SessionDescriptionInterface> CreateAnswer() {
-    rtc::scoped_refptr<MockCreateSessionDescriptionObserver> observer(
-        new rtc::RefCountedObject<MockCreateSessionDescriptionObserver>());
-    pc()->CreateAnswer(observer, offer_answer_options_);
-    return WaitForDescriptionFromObserver(observer);
-  }
-
-  std::unique_ptr<SessionDescriptionInterface> WaitForDescriptionFromObserver(
-      rtc::scoped_refptr<MockCreateSessionDescriptionObserver> observer) {
-    EXPECT_EQ_WAIT(true, observer->called(), kDefaultTimeout);
-    if (!observer->result()) {
-      return nullptr;
-    }
-    auto description = observer->MoveDescription();
-    if (generated_sdp_munger_) {
-      generated_sdp_munger_(description->description());
-    }
-    return description;
-  }
-
-  // Setting the local description and sending the SDP message over the fake
-  // signaling channel are combined into the same method because the SDP
-  // message needs to be sent as soon as SetLocalDescription finishes, without
-  // waiting for the observer to be called. This ensures that ICE candidates
-  // don't outrace the description.
-  bool SetLocalDescriptionAndSendSdpMessage(
-      std::unique_ptr<SessionDescriptionInterface> desc) {
-    rtc::scoped_refptr<MockSetSessionDescriptionObserver> observer(
-        new rtc::RefCountedObject<MockSetSessionDescriptionObserver>());
-    LOG(LS_INFO) << debug_name_ << ": SetLocalDescriptionAndSendSdpMessage";
-    std::string type = desc->type();
-    std::string sdp;
-    EXPECT_TRUE(desc->ToString(&sdp));
-    pc()->SetLocalDescription(observer, desc.release());
-    // As mentioned above, we need to send the message immediately after
-    // SetLocalDescription.
-    SendSdpMessage(type, sdp);
-    EXPECT_TRUE_WAIT(observer->called(), kDefaultTimeout);
-    return true;
-  }
-
-  bool SetRemoteDescription(std::unique_ptr<SessionDescriptionInterface> desc) {
-    rtc::scoped_refptr<MockSetSessionDescriptionObserver> observer(
-        new rtc::RefCountedObject<MockSetSessionDescriptionObserver>());
-    LOG(LS_INFO) << debug_name_ << ": SetRemoteDescription";
-    pc()->SetRemoteDescription(observer, desc.release());
-    EXPECT_TRUE_WAIT(observer->called(), kDefaultTimeout);
-    return observer->result();
-  }
-
-  // Simulate sending a blob of SDP with delay |signaling_delay_ms_| (0 by
-  // default).
-  void SendSdpMessage(const std::string& type, const std::string& msg) {
-    if (signaling_delay_ms_ == 0) {
-      RelaySdpMessageIfReceiverExists(type, msg);
-    } else {
-      invoker_.AsyncInvokeDelayed<void>(
-          RTC_FROM_HERE, rtc::Thread::Current(),
-          rtc::Bind(&PeerConnectionWrapper::RelaySdpMessageIfReceiverExists,
-                    this, type, msg),
-          signaling_delay_ms_);
-    }
-  }
-
-  void RelaySdpMessageIfReceiverExists(const std::string& type,
-                                       const std::string& msg) {
-    if (signaling_message_receiver_) {
-      signaling_message_receiver_->ReceiveSdpMessage(type, msg);
-    }
-  }
-
-  // Simulate trickling an ICE candidate with delay |signaling_delay_ms_| (0 by
-  // default).
-  void SendIceMessage(const std::string& sdp_mid,
-                      int sdp_mline_index,
-                      const std::string& msg) {
-    if (signaling_delay_ms_ == 0) {
-      RelayIceMessageIfReceiverExists(sdp_mid, sdp_mline_index, msg);
-    } else {
-      invoker_.AsyncInvokeDelayed<void>(
-          RTC_FROM_HERE, rtc::Thread::Current(),
-          rtc::Bind(&PeerConnectionWrapper::RelayIceMessageIfReceiverExists,
-                    this, sdp_mid, sdp_mline_index, msg),
-          signaling_delay_ms_);
-    }
-  }
-
-  void RelayIceMessageIfReceiverExists(const std::string& sdp_mid,
-                                       int sdp_mline_index,
-                                       const std::string& msg) {
-    if (signaling_message_receiver_) {
-      signaling_message_receiver_->ReceiveIceMessage(sdp_mid, sdp_mline_index,
-                                                     msg);
-    }
-  }
-
-  // SignalingMessageReceiver callbacks.
-  void ReceiveSdpMessage(const std::string& type,
-                         const std::string& msg) override {
-    if (type == webrtc::SessionDescriptionInterface::kOffer) {
-      HandleIncomingOffer(msg);
-    } else {
-      HandleIncomingAnswer(msg);
-    }
-  }
-
-  void ReceiveIceMessage(const std::string& sdp_mid,
-                         int sdp_mline_index,
-                         const std::string& msg) override {
-    LOG(LS_INFO) << debug_name_ << ": ReceiveIceMessage";
-    std::unique_ptr<webrtc::IceCandidateInterface> candidate(
-        webrtc::CreateIceCandidate(sdp_mid, sdp_mline_index, msg, nullptr));
-    EXPECT_TRUE(pc()->AddIceCandidate(candidate.get()));
-  }
-
-  // PeerConnectionObserver callbacks.
-  void OnSignalingChange(
-      webrtc::PeerConnectionInterface::SignalingState new_state) override {
-    EXPECT_EQ(pc()->signaling_state(), new_state);
-  }
-  void OnAddStream(
-      rtc::scoped_refptr<MediaStreamInterface> media_stream) override {
-    media_stream->RegisterObserver(this);
-    for (size_t i = 0; i < media_stream->GetVideoTracks().size(); ++i) {
-      const std::string id = media_stream->GetVideoTracks()[i]->id();
-      ASSERT_TRUE(fake_video_renderers_.find(id) ==
-                  fake_video_renderers_.end());
-      fake_video_renderers_[id].reset(new webrtc::FakeVideoTrackRenderer(
-          media_stream->GetVideoTracks()[i]));
-    }
-  }
-  void OnRemoveStream(
-      rtc::scoped_refptr<MediaStreamInterface> media_stream) override {}
-  void OnRenegotiationNeeded() override {}
-  void OnIceConnectionChange(
-      webrtc::PeerConnectionInterface::IceConnectionState new_state) override {
-    EXPECT_EQ(pc()->ice_connection_state(), new_state);
-  }
-  void OnIceGatheringChange(
-      webrtc::PeerConnectionInterface::IceGatheringState new_state) override {
-    if (new_state == PeerConnectionInterface::kIceGatheringGathering) {
-      ++transitions_to_gathering_state_;
-    }
-    EXPECT_EQ(pc()->ice_gathering_state(), new_state);
-  }
-  void OnIceCandidate(const webrtc::IceCandidateInterface* candidate) override {
-    LOG(LS_INFO) << debug_name_ << ": OnIceCandidate";
-
-    std::string ice_sdp;
-    EXPECT_TRUE(candidate->ToString(&ice_sdp));
-    if (signaling_message_receiver_ == nullptr) {
-      // Remote party may be deleted.
-      return;
-    }
-    SendIceMessage(candidate->sdp_mid(), candidate->sdp_mline_index(), ice_sdp);
-  }
-  void OnDataChannel(
-      rtc::scoped_refptr<DataChannelInterface> data_channel) override {
-    LOG(LS_INFO) << debug_name_ << ": OnDataChannel";
-    data_channel_ = data_channel;
-    data_observer_.reset(new MockDataChannelObserver(data_channel));
-  }
-
-  // MediaStreamInterface callback
-  void OnChanged() override {
-    // Track added or removed from MediaStream, so update our renderers.
-    rtc::scoped_refptr<StreamCollectionInterface> remote_streams =
-        pc()->remote_streams();
-    // Remove renderers for tracks that were removed.
-    for (auto it = fake_video_renderers_.begin();
-         it != fake_video_renderers_.end();) {
-      if (remote_streams->FindVideoTrack(it->first) == nullptr) {
-        auto to_remove = it++;
-        removed_fake_video_renderers_.push_back(std::move(to_remove->second));
-        fake_video_renderers_.erase(to_remove);
-      } else {
-        ++it;
-      }
-    }
-    // Create renderers for new video tracks.
-    for (size_t stream_index = 0; stream_index < remote_streams->count();
-         ++stream_index) {
-      MediaStreamInterface* remote_stream = remote_streams->at(stream_index);
-      for (size_t track_index = 0;
-           track_index < remote_stream->GetVideoTracks().size();
-           ++track_index) {
-        const std::string id =
-            remote_stream->GetVideoTracks()[track_index]->id();
-        if (fake_video_renderers_.find(id) != fake_video_renderers_.end()) {
-          continue;
-        }
-        fake_video_renderers_[id].reset(new webrtc::FakeVideoTrackRenderer(
-            remote_stream->GetVideoTracks()[track_index]));
-      }
-    }
-  }
-
-  std::string debug_name_;
-
-  std::unique_ptr<rtc::FakeNetworkManager> fake_network_manager_;
-
-  rtc::scoped_refptr<webrtc::PeerConnectionInterface> peer_connection_;
-  rtc::scoped_refptr<webrtc::PeerConnectionFactoryInterface>
-      peer_connection_factory_;
-
-  // Needed to keep track of number of frames sent.
-  rtc::scoped_refptr<FakeAudioCaptureModule> fake_audio_capture_module_;
-  // Needed to keep track of number of frames received.
-  std::map<std::string, std::unique_ptr<webrtc::FakeVideoTrackRenderer>>
-      fake_video_renderers_;
-  // Needed to ensure frames aren't received for removed tracks.
-  std::vector<std::unique_ptr<webrtc::FakeVideoTrackRenderer>>
-      removed_fake_video_renderers_;
-  // Needed to keep track of number of frames received when external decoder
-  // used.
-  FakeWebRtcVideoDecoderFactory* fake_video_decoder_factory_ = nullptr;
-  FakeWebRtcVideoEncoderFactory* fake_video_encoder_factory_ = nullptr;
-  bool video_decoder_factory_enabled_ = false;
-
-  // For remote peer communication.
-  SignalingMessageReceiver* signaling_message_receiver_ = nullptr;
-  int signaling_delay_ms_ = 0;
-
-  // Store references to the video capturers we've created, so that we can stop
-  // them, if required.
-  std::vector<cricket::FakeVideoCapturer*> video_capturers_;
-  // |local_video_renderer_| attached to the first created local video track.
-  std::unique_ptr<webrtc::FakeVideoTrackRenderer> local_video_renderer_;
-
-  PeerConnectionInterface::RTCOfferAnswerOptions offer_answer_options_;
-  std::function<void(cricket::SessionDescription*)> received_sdp_munger_;
-  std::function<void(cricket::SessionDescription*)> generated_sdp_munger_;
-
-  rtc::scoped_refptr<DataChannelInterface> data_channel_;
-  std::unique_ptr<MockDataChannelObserver> data_observer_;
-
-  std::vector<std::unique_ptr<MockRtpReceiverObserver>> rtp_receiver_observers_;
-
-  int transitions_to_gathering_state_ = 0;
-
-  rtc::AsyncInvoker invoker_;
-
-  friend class PeerConnectionIntegrationTest;
-};
-
-// Tests two PeerConnections connecting to each other end-to-end, using a
-// virtual network, fake A/V capture and fake encoder/decoders. The
-// PeerConnections share the threads/socket servers, but use separate versions
-// of everything else (including "PeerConnectionFactory"s).
-class PeerConnectionIntegrationTest : public testing::Test {
- public:
-  PeerConnectionIntegrationTest()
-      : ss_(new rtc::VirtualSocketServer()),
-        network_thread_(new rtc::Thread(ss_.get())),
-        worker_thread_(rtc::Thread::Create()) {
-    RTC_CHECK(network_thread_->Start());
-    RTC_CHECK(worker_thread_->Start());
-  }
-
-  ~PeerConnectionIntegrationTest() {
-    if (caller_) {
-      caller_->set_signaling_message_receiver(nullptr);
-    }
-    if (callee_) {
-      callee_->set_signaling_message_receiver(nullptr);
-    }
-  }
-
-  bool SignalingStateStable() {
-    return caller_->SignalingStateStable() && callee_->SignalingStateStable();
-  }
-
-  bool DtlsConnected() {
-    // TODO(deadbeef): kIceConnectionConnected currently means both ICE and DTLS
-    // are connected. This is an important distinction. Once we have separate
-    // ICE and DTLS state, this check needs to use the DTLS state.
-    return (callee()->ice_connection_state() ==
-                webrtc::PeerConnectionInterface::kIceConnectionConnected ||
-            callee()->ice_connection_state() ==
-                webrtc::PeerConnectionInterface::kIceConnectionCompleted) &&
-           (caller()->ice_connection_state() ==
-                webrtc::PeerConnectionInterface::kIceConnectionConnected ||
-            caller()->ice_connection_state() ==
-                webrtc::PeerConnectionInterface::kIceConnectionCompleted);
-  }
-
-  bool CreatePeerConnectionWrappers() {
-    return CreatePeerConnectionWrappersWithConfig(
-        PeerConnectionInterface::RTCConfiguration(),
-        PeerConnectionInterface::RTCConfiguration());
-  }
-
-  bool CreatePeerConnectionWrappersWithConstraints(
-      MediaConstraintsInterface* caller_constraints,
-      MediaConstraintsInterface* callee_constraints) {
-    caller_.reset(PeerConnectionWrapper::CreateWithConstraints(
-        "Caller", caller_constraints, network_thread_.get(),
-        worker_thread_.get()));
-    callee_.reset(PeerConnectionWrapper::CreateWithConstraints(
-        "Callee", callee_constraints, network_thread_.get(),
-        worker_thread_.get()));
-    return caller_ && callee_;
-  }
-
-  bool CreatePeerConnectionWrappersWithConfig(
-      const PeerConnectionInterface::RTCConfiguration& caller_config,
-      const PeerConnectionInterface::RTCConfiguration& callee_config) {
-    caller_.reset(PeerConnectionWrapper::CreateWithConfig(
-        "Caller", caller_config, network_thread_.get(), worker_thread_.get()));
-    callee_.reset(PeerConnectionWrapper::CreateWithConfig(
-        "Callee", callee_config, network_thread_.get(), worker_thread_.get()));
-    return caller_ && callee_;
-  }
-
-  bool CreatePeerConnectionWrappersWithOptions(
-      const PeerConnectionFactory::Options& caller_options,
-      const PeerConnectionFactory::Options& callee_options) {
-    caller_.reset(PeerConnectionWrapper::CreateWithOptions(
-        "Caller", caller_options, network_thread_.get(), worker_thread_.get()));
-    callee_.reset(PeerConnectionWrapper::CreateWithOptions(
-        "Callee", callee_options, network_thread_.get(), worker_thread_.get()));
-    return caller_ && callee_;
-  }
-
-  PeerConnectionWrapper* CreatePeerConnectionWrapperWithAlternateKey() {
-    std::unique_ptr<FakeRTCCertificateGenerator> cert_generator(
-        new FakeRTCCertificateGenerator());
-    cert_generator->use_alternate_key();
-
-    // Make sure the new client is using a different certificate.
-    return PeerConnectionWrapper::CreateWithDtlsIdentityStore(
-        "New Peer", std::move(cert_generator), network_thread_.get(),
-        worker_thread_.get());
-  }
-
-  // Once called, SDP blobs and ICE candidates will be automatically signaled
-  // between PeerConnections.
-  void ConnectFakeSignaling() {
-    caller_->set_signaling_message_receiver(callee_.get());
-    callee_->set_signaling_message_receiver(caller_.get());
-  }
-
-  void SetSignalingDelayMs(int delay_ms) {
-    caller_->set_signaling_delay_ms(delay_ms);
-    callee_->set_signaling_delay_ms(delay_ms);
-  }
-
-  void EnableVideoDecoderFactory() {
-    caller_->EnableVideoDecoderFactory();
-    callee_->EnableVideoDecoderFactory();
-  }
-
-  // Messages may get lost on the unreliable DataChannel, so we send multiple
-  // times to avoid test flakiness.
-  void SendRtpDataWithRetries(webrtc::DataChannelInterface* dc,
-                              const std::string& data,
-                              int retries) {
-    for (int i = 0; i < retries; ++i) {
-      dc->Send(DataBuffer(data));
-    }
-  }
-
-  rtc::Thread* network_thread() { return network_thread_.get(); }
-
-  rtc::VirtualSocketServer* virtual_socket_server() { return ss_.get(); }
-
-  PeerConnectionWrapper* caller() { return caller_.get(); }
-
-  // Set the |caller_| to the |wrapper| passed in and return the
-  // original |caller_|.
-  PeerConnectionWrapper* SetCallerPcWrapperAndReturnCurrent(
-      PeerConnectionWrapper* wrapper) {
-    PeerConnectionWrapper* old = caller_.release();
-    caller_.reset(wrapper);
-    return old;
-  }
-
-  PeerConnectionWrapper* callee() { return callee_.get(); }
-
-  // Set the |callee_| to the |wrapper| passed in and return the
-  // original |callee_|.
-  PeerConnectionWrapper* SetCalleePcWrapperAndReturnCurrent(
-      PeerConnectionWrapper* wrapper) {
-    PeerConnectionWrapper* old = callee_.release();
-    callee_.reset(wrapper);
-    return old;
-  }
-
-  // Expects the provided number of new frames to be received within |wait_ms|.
-  // "New frames" meaning that it waits for the current frame counts to
-  // *increase* by the provided values. For video, uses
-  // RecievedVideoFramesForEachTrack for the case of multiple video tracks
-  // being received.
-  void ExpectNewFramesReceivedWithWait(
-      int expected_caller_received_audio_frames,
-      int expected_caller_received_video_frames,
-      int expected_callee_received_audio_frames,
-      int expected_callee_received_video_frames,
-      int wait_ms) {
-    // Add current frame counts to the provided values, in order to wait for
-    // the frame count to increase.
-    expected_caller_received_audio_frames += caller()->audio_frames_received();
-    expected_caller_received_video_frames +=
-        caller()->min_video_frames_received_per_track();
-    expected_callee_received_audio_frames += callee()->audio_frames_received();
-    expected_callee_received_video_frames +=
-        callee()->min_video_frames_received_per_track();
-
-    EXPECT_TRUE_WAIT(caller()->audio_frames_received() >=
-                             expected_caller_received_audio_frames &&
-                         caller()->min_video_frames_received_per_track() >=
-                             expected_caller_received_video_frames &&
-                         callee()->audio_frames_received() >=
-                             expected_callee_received_audio_frames &&
-                         callee()->min_video_frames_received_per_track() >=
-                             expected_callee_received_video_frames,
-                     wait_ms);
-
-    // After the combined wait, do an "expect" for each individual count, to
-    // print out a more detailed message upon failure.
-    EXPECT_GE(caller()->audio_frames_received(),
-              expected_caller_received_audio_frames);
-    EXPECT_GE(caller()->min_video_frames_received_per_track(),
-              expected_caller_received_video_frames);
-    EXPECT_GE(callee()->audio_frames_received(),
-              expected_callee_received_audio_frames);
-    EXPECT_GE(callee()->min_video_frames_received_per_track(),
-              expected_callee_received_video_frames);
-  }
-
-  void TestGcmNegotiationUsesCipherSuite(bool local_gcm_enabled,
-                                         bool remote_gcm_enabled,
-                                         int expected_cipher_suite) {
-    PeerConnectionFactory::Options caller_options;
-    caller_options.crypto_options.enable_gcm_crypto_suites = local_gcm_enabled;
-    PeerConnectionFactory::Options callee_options;
-    callee_options.crypto_options.enable_gcm_crypto_suites = remote_gcm_enabled;
-    ASSERT_TRUE(CreatePeerConnectionWrappersWithOptions(caller_options,
-                                                        callee_options));
-    rtc::scoped_refptr<webrtc::FakeMetricsObserver> caller_observer =
-        new rtc::RefCountedObject<webrtc::FakeMetricsObserver>();
-    caller()->pc()->RegisterUMAObserver(caller_observer);
-    ConnectFakeSignaling();
-    caller()->AddAudioVideoMediaStream();
-    callee()->AddAudioVideoMediaStream();
-    caller()->CreateAndSetAndSignalOffer();
-    ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
-    EXPECT_EQ_WAIT(rtc::SrtpCryptoSuiteToName(expected_cipher_suite),
-                   caller()->OldGetStats()->SrtpCipher(), kDefaultTimeout);
-    EXPECT_EQ(
-        1, caller_observer->GetEnumCounter(webrtc::kEnumCounterAudioSrtpCipher,
-                                           expected_cipher_suite));
-    caller()->pc()->RegisterUMAObserver(nullptr);
-  }
-
- private:
-  // |ss_| is used by |network_thread_| so it must be destroyed later.
-  std::unique_ptr<rtc::VirtualSocketServer> ss_;
-  // |network_thread_| and |worker_thread_| are used by both
-  // |caller_| and |callee_| so they must be destroyed
-  // later.
-  std::unique_ptr<rtc::Thread> network_thread_;
-  std::unique_ptr<rtc::Thread> worker_thread_;
-  std::unique_ptr<PeerConnectionWrapper> caller_;
-  std::unique_ptr<PeerConnectionWrapper> callee_;
-};
-
-// Test the OnFirstPacketReceived callback from audio/video RtpReceivers.  This
-// includes testing that the callback is invoked if an observer is connected
-// after the first packet has already been received.
-TEST_F(PeerConnectionIntegrationTest,
-       RtpReceiverObserverOnFirstPacketReceived) {
-  ASSERT_TRUE(CreatePeerConnectionWrappers());
-  ConnectFakeSignaling();
-  caller()->AddAudioVideoMediaStream();
-  callee()->AddAudioVideoMediaStream();
-  // Start offer/answer exchange and wait for it to complete.
-  caller()->CreateAndSetAndSignalOffer();
-  ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
-  // Should be one receiver each for audio/video.
-  EXPECT_EQ(2, caller()->rtp_receiver_observers().size());
-  EXPECT_EQ(2, callee()->rtp_receiver_observers().size());
-  // Wait for all "first packet received" callbacks to be fired.
-  EXPECT_TRUE_WAIT(
-      std::all_of(caller()->rtp_receiver_observers().begin(),
-                  caller()->rtp_receiver_observers().end(),
-                  [](const std::unique_ptr<MockRtpReceiverObserver>& o) {
-                    return o->first_packet_received();
-                  }),
-      kMaxWaitForFramesMs);
-  EXPECT_TRUE_WAIT(
-      std::all_of(callee()->rtp_receiver_observers().begin(),
-                  callee()->rtp_receiver_observers().end(),
-                  [](const std::unique_ptr<MockRtpReceiverObserver>& o) {
-                    return o->first_packet_received();
-                  }),
-      kMaxWaitForFramesMs);
-  // If new observers are set after the first packet was already received, the
-  // callback should still be invoked.
-  caller()->ResetRtpReceiverObservers();
-  callee()->ResetRtpReceiverObservers();
-  EXPECT_EQ(2, caller()->rtp_receiver_observers().size());
-  EXPECT_EQ(2, callee()->rtp_receiver_observers().size());
-  EXPECT_TRUE(
-      std::all_of(caller()->rtp_receiver_observers().begin(),
-                  caller()->rtp_receiver_observers().end(),
-                  [](const std::unique_ptr<MockRtpReceiverObserver>& o) {
-                    return o->first_packet_received();
-                  }));
-  EXPECT_TRUE(
-      std::all_of(callee()->rtp_receiver_observers().begin(),
-                  callee()->rtp_receiver_observers().end(),
-                  [](const std::unique_ptr<MockRtpReceiverObserver>& o) {
-                    return o->first_packet_received();
-                  }));
-}
-
-class DummyDtmfObserver : public DtmfSenderObserverInterface {
- public:
-  DummyDtmfObserver() : completed_(false) {}
-
-  // Implements DtmfSenderObserverInterface.
-  void OnToneChange(const std::string& tone) override {
-    tones_.push_back(tone);
-    if (tone.empty()) {
-      completed_ = true;
-    }
-  }
-
-  const std::vector<std::string>& tones() const { return tones_; }
-  bool completed() const { return completed_; }
-
- private:
-  bool completed_;
-  std::vector<std::string> tones_;
-};
-
-// Assumes |sender| already has an audio track added and the offer/answer
-// exchange is done.
-void TestDtmfFromSenderToReceiver(PeerConnectionWrapper* sender,
-                                  PeerConnectionWrapper* receiver) {
-  DummyDtmfObserver observer;
-  rtc::scoped_refptr<DtmfSenderInterface> dtmf_sender;
-
-  // We should be able to create a DTMF sender from a local track.
-  webrtc::AudioTrackInterface* localtrack =
-      sender->local_streams()->at(0)->GetAudioTracks()[0];
-  dtmf_sender = sender->pc()->CreateDtmfSender(localtrack);
-  ASSERT_NE(nullptr, dtmf_sender.get());
-  dtmf_sender->RegisterObserver(&observer);
-
-  // Test the DtmfSender object just created.
-  EXPECT_TRUE(dtmf_sender->CanInsertDtmf());
-  EXPECT_TRUE(dtmf_sender->InsertDtmf("1a", 100, 50));
-
-  EXPECT_TRUE_WAIT(observer.completed(), kDefaultTimeout);
-  std::vector<std::string> tones = {"1", "a", ""};
-  EXPECT_EQ(tones, observer.tones());
-  dtmf_sender->UnregisterObserver();
-  // TODO(deadbeef): Verify the tones were actually received end-to-end.
-}
-
-// Verifies the DtmfSenderObserver callbacks for a DtmfSender (one in each
-// direction).
-TEST_F(PeerConnectionIntegrationTest, DtmfSenderObserver) {
-  ASSERT_TRUE(CreatePeerConnectionWrappers());
-  ConnectFakeSignaling();
-  // Only need audio for DTMF.
-  caller()->AddAudioOnlyMediaStream();
-  callee()->AddAudioOnlyMediaStream();
-  caller()->CreateAndSetAndSignalOffer();
-  ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
-  // DTLS must finish before the DTMF sender can be used reliably.
-  ASSERT_TRUE_WAIT(DtlsConnected(), kDefaultTimeout);
-  TestDtmfFromSenderToReceiver(caller(), callee());
-  TestDtmfFromSenderToReceiver(callee(), caller());
-}
-
-// Basic end-to-end test, verifying media can be encoded/transmitted/decoded
-// between two connections, using DTLS-SRTP.
-TEST_F(PeerConnectionIntegrationTest, EndToEndCallWithDtls) {
-  ASSERT_TRUE(CreatePeerConnectionWrappers());
-  ConnectFakeSignaling();
-  // Do normal offer/answer and wait for some frames to be received in each
-  // direction.
-  caller()->AddAudioVideoMediaStream();
-  callee()->AddAudioVideoMediaStream();
-  caller()->CreateAndSetAndSignalOffer();
-  ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
-  ExpectNewFramesReceivedWithWait(
-      kDefaultExpectedAudioFrameCount, kDefaultExpectedVideoFrameCount,
-      kDefaultExpectedAudioFrameCount, kDefaultExpectedVideoFrameCount,
-      kMaxWaitForFramesMs);
-}
-
-// Uses SDES instead of DTLS for key agreement.
-TEST_F(PeerConnectionIntegrationTest, EndToEndCallWithSdes) {
-  PeerConnectionInterface::RTCConfiguration sdes_config;
-  sdes_config.enable_dtls_srtp.emplace(false);
-  ASSERT_TRUE(CreatePeerConnectionWrappersWithConfig(sdes_config, sdes_config));
-  ConnectFakeSignaling();
-
-  // Do normal offer/answer and wait for some frames to be received in each
-  // direction.
-  caller()->AddAudioVideoMediaStream();
-  callee()->AddAudioVideoMediaStream();
-  caller()->CreateAndSetAndSignalOffer();
-  ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
-  ExpectNewFramesReceivedWithWait(
-      kDefaultExpectedAudioFrameCount, kDefaultExpectedVideoFrameCount,
-      kDefaultExpectedAudioFrameCount, kDefaultExpectedVideoFrameCount,
-      kMaxWaitForFramesMs);
-}
-
-// This test sets up a call between two parties (using DTLS) and tests that we
-// can get a video aspect ratio of 16:9.
-TEST_F(PeerConnectionIntegrationTest, SendAndReceive16To9AspectRatio) {
-  ASSERT_TRUE(CreatePeerConnectionWrappers());
-  ConnectFakeSignaling();
-
-  // Add video tracks with 16:9 constraint.
-  FakeConstraints constraints;
-  double requested_ratio = 16.0 / 9;
-  constraints.SetMandatoryMinAspectRatio(requested_ratio);
-  caller()->AddMediaStreamFromTracks(
-      nullptr, caller()->CreateLocalVideoTrackWithConstraints(constraints));
-  callee()->AddMediaStreamFromTracks(
-      nullptr, callee()->CreateLocalVideoTrackWithConstraints(constraints));
-
-  // Do normal offer/answer and wait for at least one frame to be received in
-  // each direction.
-  caller()->CreateAndSetAndSignalOffer();
-  ASSERT_TRUE_WAIT(caller()->min_video_frames_received_per_track() > 0 &&
-                       callee()->min_video_frames_received_per_track() > 0,
-                   kMaxWaitForFramesMs);
-
-  // Check rendered aspect ratio.
-  EXPECT_EQ(requested_ratio, caller()->local_rendered_aspect_ratio());
-  EXPECT_EQ(requested_ratio, caller()->rendered_aspect_ratio());
-  EXPECT_EQ(requested_ratio, callee()->local_rendered_aspect_ratio());
-  EXPECT_EQ(requested_ratio, callee()->rendered_aspect_ratio());
-}
-
-// This test sets up a call between two parties with a source resolution of
-// 1280x720 and verifies that a 16:9 aspect ratio is received.
-TEST_F(PeerConnectionIntegrationTest,
-       Send1280By720ResolutionAndReceive16To9AspectRatio) {
-  ASSERT_TRUE(CreatePeerConnectionWrappers());
-  ConnectFakeSignaling();
-
-  // Similar to above test, but uses MandatoryMin[Width/Height] constraint
-  // instead of aspect ratio constraint.
-  FakeConstraints constraints;
-  constraints.SetMandatoryMinWidth(1280);
-  constraints.SetMandatoryMinHeight(720);
-  caller()->AddMediaStreamFromTracks(
-      nullptr, caller()->CreateLocalVideoTrackWithConstraints(constraints));
-  callee()->AddMediaStreamFromTracks(
-      nullptr, callee()->CreateLocalVideoTrackWithConstraints(constraints));
-
-  // Do normal offer/answer and wait for at least one frame to be received in
-  // each direction.
-  caller()->CreateAndSetAndSignalOffer();
-  ASSERT_TRUE_WAIT(caller()->min_video_frames_received_per_track() > 0 &&
-                       callee()->min_video_frames_received_per_track() > 0,
-                   kMaxWaitForFramesMs);
-
-  // Check rendered aspect ratio.
-  EXPECT_EQ(16.0 / 9, caller()->local_rendered_aspect_ratio());
-  EXPECT_EQ(16.0 / 9, caller()->rendered_aspect_ratio());
-  EXPECT_EQ(16.0 / 9, callee()->local_rendered_aspect_ratio());
-  EXPECT_EQ(16.0 / 9, callee()->rendered_aspect_ratio());
-}
-
-// This test sets up an one-way call, with media only from caller to
-// callee.
-TEST_F(PeerConnectionIntegrationTest, OneWayMediaCall) {
-  ASSERT_TRUE(CreatePeerConnectionWrappers());
-  ConnectFakeSignaling();
-  caller()->AddAudioVideoMediaStream();
-  caller()->CreateAndSetAndSignalOffer();
-  int caller_received_frames = 0;
-  ExpectNewFramesReceivedWithWait(
-      caller_received_frames, caller_received_frames,
-      kDefaultExpectedAudioFrameCount, kDefaultExpectedVideoFrameCount,
-      kMaxWaitForFramesMs);
-}
-
-// This test sets up a audio call initially, with the callee rejecting video
-// initially. Then later the callee decides to upgrade to audio/video, and
-// initiates a new offer/answer exchange.
-TEST_F(PeerConnectionIntegrationTest, AudioToVideoUpgrade) {
-  ASSERT_TRUE(CreatePeerConnectionWrappers());
-  ConnectFakeSignaling();
-  // Initially, offer an audio/video stream from the caller, but refuse to
-  // send/receive video on the callee side.
-  caller()->AddAudioVideoMediaStream();
-  callee()->AddAudioOnlyMediaStream();
-  PeerConnectionInterface::RTCOfferAnswerOptions options;
-  options.offer_to_receive_video = 0;
-  callee()->SetOfferAnswerOptions(options);
-  // Do offer/answer and make sure audio is still received end-to-end.
-  caller()->CreateAndSetAndSignalOffer();
-  ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
-  ExpectNewFramesReceivedWithWait(kDefaultExpectedAudioFrameCount, 0,
-                                  kDefaultExpectedAudioFrameCount, 0,
-                                  kMaxWaitForFramesMs);
-  // Sanity check that the callee's description has a rejected video section.
-  ASSERT_NE(nullptr, callee()->pc()->local_description());
-  const ContentInfo* callee_video_content =
-      GetFirstVideoContent(callee()->pc()->local_description()->description());
-  ASSERT_NE(nullptr, callee_video_content);
-  EXPECT_TRUE(callee_video_content->rejected);
-  // Now negotiate with video and ensure negotiation succeeds, with video
-  // frames and additional audio frames being received.
-  callee()->AddVideoOnlyMediaStream();
-  options.offer_to_receive_video = 1;
-  callee()->SetOfferAnswerOptions(options);
-  callee()->CreateAndSetAndSignalOffer();
-  ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
-  // Expect additional audio frames to be received after the upgrade.
-  ExpectNewFramesReceivedWithWait(
-      kDefaultExpectedAudioFrameCount, kDefaultExpectedVideoFrameCount,
-      kDefaultExpectedAudioFrameCount, kDefaultExpectedVideoFrameCount,
-      kMaxWaitForFramesMs);
-}
-
-// Simpler than the above test; just add an audio track to an established
-// video-only connection.
-TEST_F(PeerConnectionIntegrationTest, AddAudioToVideoOnlyCall) {
-  ASSERT_TRUE(CreatePeerConnectionWrappers());
-  ConnectFakeSignaling();
-  // Do initial offer/answer with just a video track.
-  caller()->AddVideoOnlyMediaStream();
-  callee()->AddVideoOnlyMediaStream();
-  caller()->CreateAndSetAndSignalOffer();
-  ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
-  // Now add an audio track and do another offer/answer.
-  caller()->AddAudioOnlyMediaStream();
-  callee()->AddAudioOnlyMediaStream();
-  caller()->CreateAndSetAndSignalOffer();
-  ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
-  // Ensure both audio and video frames are received end-to-end.
-  ExpectNewFramesReceivedWithWait(
-      kDefaultExpectedAudioFrameCount, kDefaultExpectedVideoFrameCount,
-      kDefaultExpectedAudioFrameCount, kDefaultExpectedVideoFrameCount,
-      kMaxWaitForFramesMs);
-}
-
-// This test sets up a call that's transferred to a new caller with a different
-// DTLS fingerprint.
-TEST_F(PeerConnectionIntegrationTest, CallTransferredForCallee) {
-  ASSERT_TRUE(CreatePeerConnectionWrappers());
-  ConnectFakeSignaling();
-  caller()->AddAudioVideoMediaStream();
-  callee()->AddAudioVideoMediaStream();
-  caller()->CreateAndSetAndSignalOffer();
-  ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
-
-  // Keep the original peer around which will still send packets to the
-  // receiving client. These SRTP packets will be dropped.
-  std::unique_ptr<PeerConnectionWrapper> original_peer(
-      SetCallerPcWrapperAndReturnCurrent(
-          CreatePeerConnectionWrapperWithAlternateKey()));
-  // TODO(deadbeef): Why do we call Close here? That goes against the comment
-  // directly above.
-  original_peer->pc()->Close();
-
-  ConnectFakeSignaling();
-  caller()->AddAudioVideoMediaStream();
-  caller()->CreateAndSetAndSignalOffer();
-  ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
-  // Wait for some additional frames to be transmitted end-to-end.
-  ExpectNewFramesReceivedWithWait(
-      kDefaultExpectedAudioFrameCount, kDefaultExpectedVideoFrameCount,
-      kDefaultExpectedAudioFrameCount, kDefaultExpectedVideoFrameCount,
-      kMaxWaitForFramesMs);
-}
-
-// This test sets up a call that's transferred to a new callee with a different
-// DTLS fingerprint.
-TEST_F(PeerConnectionIntegrationTest, CallTransferredForCaller) {
-  ASSERT_TRUE(CreatePeerConnectionWrappers());
-  ConnectFakeSignaling();
-  caller()->AddAudioVideoMediaStream();
-  callee()->AddAudioVideoMediaStream();
-  caller()->CreateAndSetAndSignalOffer();
-  ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
-
-  // Keep the original peer around which will still send packets to the
-  // receiving client. These SRTP packets will be dropped.
-  std::unique_ptr<PeerConnectionWrapper> original_peer(
-      SetCalleePcWrapperAndReturnCurrent(
-          CreatePeerConnectionWrapperWithAlternateKey()));
-  // TODO(deadbeef): Why do we call Close here? That goes against the comment
-  // directly above.
-  original_peer->pc()->Close();
-
-  ConnectFakeSignaling();
-  callee()->AddAudioVideoMediaStream();
-  caller()->SetOfferAnswerOptions(IceRestartOfferAnswerOptions());
-  caller()->CreateAndSetAndSignalOffer();
-  ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
-  // Wait for some additional frames to be transmitted end-to-end.
-  ExpectNewFramesReceivedWithWait(
-      kDefaultExpectedAudioFrameCount, kDefaultExpectedVideoFrameCount,
-      kDefaultExpectedAudioFrameCount, kDefaultExpectedVideoFrameCount,
-      kMaxWaitForFramesMs);
-}
-
-// This test sets up a non-bundled call and negotiates bundling at the same
-// time as starting an ICE restart. When bundling is in effect in the restart,
-// the DTLS-SRTP context should be successfully reset.
-TEST_F(PeerConnectionIntegrationTest, BundlingEnabledWhileIceRestartOccurs) {
-  ASSERT_TRUE(CreatePeerConnectionWrappers());
-  ConnectFakeSignaling();
-
-  caller()->AddAudioVideoMediaStream();
-  callee()->AddAudioVideoMediaStream();
-  // Remove the bundle group from the SDP received by the callee.
-  callee()->SetReceivedSdpMunger([](cricket::SessionDescription* desc) {
-    desc->RemoveGroupByName("BUNDLE");
-  });
-  caller()->CreateAndSetAndSignalOffer();
-  ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
-  ExpectNewFramesReceivedWithWait(
-      kDefaultExpectedAudioFrameCount, kDefaultExpectedVideoFrameCount,
-      kDefaultExpectedAudioFrameCount, kDefaultExpectedVideoFrameCount,
-      kMaxWaitForFramesMs);
-
-  // Now stop removing the BUNDLE group, and trigger an ICE restart.
-  callee()->SetReceivedSdpMunger(nullptr);
-  caller()->SetOfferAnswerOptions(IceRestartOfferAnswerOptions());
-  caller()->CreateAndSetAndSignalOffer();
-  ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
-
-  // Expect additional frames to be received after the ICE restart.
-  ExpectNewFramesReceivedWithWait(
-      kDefaultExpectedAudioFrameCount, kDefaultExpectedVideoFrameCount,
-      kDefaultExpectedAudioFrameCount, kDefaultExpectedVideoFrameCount,
-      kMaxWaitForFramesMs);
-}
-
-// Test CVO (Coordination of Video Orientation). If a video source is rotated
-// and both peers support the CVO RTP header extension, the actual video frames
-// don't need to be encoded in different resolutions, since the rotation is
-// communicated through the RTP header extension.
-TEST_F(PeerConnectionIntegrationTest, RotatedVideoWithCVOExtension) {
-  ASSERT_TRUE(CreatePeerConnectionWrappers());
-  ConnectFakeSignaling();
-  // Add rotated video tracks.
-  caller()->AddMediaStreamFromTracks(
-      nullptr,
-      caller()->CreateLocalVideoTrackWithRotation(webrtc::kVideoRotation_90));
-  callee()->AddMediaStreamFromTracks(
-      nullptr,
-      callee()->CreateLocalVideoTrackWithRotation(webrtc::kVideoRotation_270));
-
-  // Wait for video frames to be received by both sides.
-  caller()->CreateAndSetAndSignalOffer();
-  ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
-  ASSERT_TRUE_WAIT(caller()->min_video_frames_received_per_track() > 0 &&
-                       callee()->min_video_frames_received_per_track() > 0,
-                   kMaxWaitForFramesMs);
-
-  // Ensure that the aspect ratio is unmodified.
-  // TODO(deadbeef): Where does 4:3 come from? Should be explicit in the test,
-  // not just assumed.
-  EXPECT_EQ(4.0 / 3, caller()->local_rendered_aspect_ratio());
-  EXPECT_EQ(4.0 / 3, caller()->rendered_aspect_ratio());
-  EXPECT_EQ(4.0 / 3, callee()->local_rendered_aspect_ratio());
-  EXPECT_EQ(4.0 / 3, callee()->rendered_aspect_ratio());
-  // Ensure that the CVO bits were surfaced to the renderer.
-  EXPECT_EQ(webrtc::kVideoRotation_270, caller()->rendered_rotation());
-  EXPECT_EQ(webrtc::kVideoRotation_90, callee()->rendered_rotation());
-}
-
-// Test that when the CVO extension isn't supported, video is rotated the
-// old-fashioned way, by encoding rotated frames.
-TEST_F(PeerConnectionIntegrationTest, RotatedVideoWithoutCVOExtension) {
-  ASSERT_TRUE(CreatePeerConnectionWrappers());
-  ConnectFakeSignaling();
-  // Add rotated video tracks.
-  caller()->AddMediaStreamFromTracks(
-      nullptr,
-      caller()->CreateLocalVideoTrackWithRotation(webrtc::kVideoRotation_90));
-  callee()->AddMediaStreamFromTracks(
-      nullptr,
-      callee()->CreateLocalVideoTrackWithRotation(webrtc::kVideoRotation_270));
-
-  // Remove the CVO extension from the offered SDP.
-  callee()->SetReceivedSdpMunger([](cricket::SessionDescription* desc) {
-    cricket::VideoContentDescription* video =
-        GetFirstVideoContentDescription(desc);
-    video->ClearRtpHeaderExtensions();
-  });
-  // Wait for video frames to be received by both sides.
-  caller()->CreateAndSetAndSignalOffer();
-  ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
-  ASSERT_TRUE_WAIT(caller()->min_video_frames_received_per_track() > 0 &&
-                       callee()->min_video_frames_received_per_track() > 0,
-                   kMaxWaitForFramesMs);
-
-  // Expect that the aspect ratio is inversed to account for the 90/270 degree
-  // rotation.
-  // TODO(deadbeef): Where does 4:3 come from? Should be explicit in the test,
-  // not just assumed.
-  EXPECT_EQ(3.0 / 4, caller()->local_rendered_aspect_ratio());
-  EXPECT_EQ(3.0 / 4, caller()->rendered_aspect_ratio());
-  EXPECT_EQ(3.0 / 4, callee()->local_rendered_aspect_ratio());
-  EXPECT_EQ(3.0 / 4, callee()->rendered_aspect_ratio());
-  // Expect that each endpoint is unaware of the rotation of the other endpoint.
-  EXPECT_EQ(webrtc::kVideoRotation_0, caller()->rendered_rotation());
-  EXPECT_EQ(webrtc::kVideoRotation_0, callee()->rendered_rotation());
-}
-
-// TODO(deadbeef): The tests below rely on RTCOfferAnswerOptions to reject an
-// m= section. When we implement Unified Plan SDP, the right way to do this
-// would be by stopping an RtpTransceiver.
-
-// Test that if the answerer rejects the audio m= section, no audio is sent or
-// received, but video still can be.
-TEST_F(PeerConnectionIntegrationTest, AnswererRejectsAudioSection) {
-  ASSERT_TRUE(CreatePeerConnectionWrappers());
-  ConnectFakeSignaling();
-  caller()->AddAudioVideoMediaStream();
-  // Only add video track for callee, and set offer_to_receive_audio to 0, so
-  // it will reject the audio m= section completely.
-  PeerConnectionInterface::RTCOfferAnswerOptions options;
-  options.offer_to_receive_audio = 0;
-  callee()->SetOfferAnswerOptions(options);
-  callee()->AddMediaStreamFromTracks(nullptr,
-                                     callee()->CreateLocalVideoTrack());
-  // Do offer/answer and wait for successful end-to-end video frames.
-  caller()->CreateAndSetAndSignalOffer();
-  ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
-  ExpectNewFramesReceivedWithWait(0, kDefaultExpectedVideoFrameCount, 0,
-                                  kDefaultExpectedVideoFrameCount,
-                                  kMaxWaitForFramesMs);
-  // Shouldn't have received audio frames at any point.
-  EXPECT_EQ(0, caller()->audio_frames_received());
-  EXPECT_EQ(0, callee()->audio_frames_received());
-  // Sanity check that the callee's description has a rejected audio section.
-  ASSERT_NE(nullptr, callee()->pc()->local_description());
-  const ContentInfo* callee_audio_content =
-      GetFirstAudioContent(callee()->pc()->local_description()->description());
-  ASSERT_NE(nullptr, callee_audio_content);
-  EXPECT_TRUE(callee_audio_content->rejected);
-}
-
-// Test that if the answerer rejects the video m= section, no video is sent or
-// received, but audio still can be.
-TEST_F(PeerConnectionIntegrationTest, AnswererRejectsVideoSection) {
-  ASSERT_TRUE(CreatePeerConnectionWrappers());
-  ConnectFakeSignaling();
-  caller()->AddAudioVideoMediaStream();
-  // Only add audio track for callee, and set offer_to_receive_video to 0, so
-  // it will reject the video m= section completely.
-  PeerConnectionInterface::RTCOfferAnswerOptions options;
-  options.offer_to_receive_video = 0;
-  callee()->SetOfferAnswerOptions(options);
-  callee()->AddMediaStreamFromTracks(callee()->CreateLocalAudioTrack(),
-                                     nullptr);
-  // Do offer/answer and wait for successful end-to-end audio frames.
-  caller()->CreateAndSetAndSignalOffer();
-  ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
-  ExpectNewFramesReceivedWithWait(kDefaultExpectedAudioFrameCount, 0,
-                                  kDefaultExpectedAudioFrameCount, 0,
-                                  kMaxWaitForFramesMs);
-  // Shouldn't have received video frames at any point.
-  EXPECT_EQ(0, caller()->total_video_frames_received());
-  EXPECT_EQ(0, callee()->total_video_frames_received());
-  // Sanity check that the callee's description has a rejected video section.
-  ASSERT_NE(nullptr, callee()->pc()->local_description());
-  const ContentInfo* callee_video_content =
-      GetFirstVideoContent(callee()->pc()->local_description()->description());
-  ASSERT_NE(nullptr, callee_video_content);
-  EXPECT_TRUE(callee_video_content->rejected);
-}
-
-// Test that if the answerer rejects both audio and video m= sections, nothing
-// bad happens.
-// TODO(deadbeef): Test that a data channel still works. Currently this doesn't
-// test anything but the fact that negotiation succeeds, which doesn't mean
-// much.
-TEST_F(PeerConnectionIntegrationTest, AnswererRejectsAudioAndVideoSections) {
-  ASSERT_TRUE(CreatePeerConnectionWrappers());
-  ConnectFakeSignaling();
-  caller()->AddAudioVideoMediaStream();
-  // Don't give the callee any tracks, and set offer_to_receive_X to 0, so it
-  // will reject both audio and video m= sections.
-  PeerConnectionInterface::RTCOfferAnswerOptions options;
-  options.offer_to_receive_audio = 0;
-  options.offer_to_receive_video = 0;
-  callee()->SetOfferAnswerOptions(options);
-  // Do offer/answer and wait for stable signaling state.
-  caller()->CreateAndSetAndSignalOffer();
-  ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
-  // Sanity check that the callee's description has rejected m= sections.
-  ASSERT_NE(nullptr, callee()->pc()->local_description());
-  const ContentInfo* callee_audio_content =
-      GetFirstAudioContent(callee()->pc()->local_description()->description());
-  ASSERT_NE(nullptr, callee_audio_content);
-  EXPECT_TRUE(callee_audio_content->rejected);
-  const ContentInfo* callee_video_content =
-      GetFirstVideoContent(callee()->pc()->local_description()->description());
-  ASSERT_NE(nullptr, callee_video_content);
-  EXPECT_TRUE(callee_video_content->rejected);
-}
-
-// This test sets up an audio and video call between two parties. After the
-// call runs for a while, the caller sends an updated offer with video being
-// rejected. Once the re-negotiation is done, the video flow should stop and
-// the audio flow should continue.
-TEST_F(PeerConnectionIntegrationTest, VideoRejectedInSubsequentOffer) {
-  ASSERT_TRUE(CreatePeerConnectionWrappers());
-  ConnectFakeSignaling();
-  caller()->AddAudioVideoMediaStream();
-  callee()->AddAudioVideoMediaStream();
-  caller()->CreateAndSetAndSignalOffer();
-  ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
-  ExpectNewFramesReceivedWithWait(
-      kDefaultExpectedAudioFrameCount, kDefaultExpectedVideoFrameCount,
-      kDefaultExpectedAudioFrameCount, kDefaultExpectedVideoFrameCount,
-      kMaxWaitForFramesMs);
-
-  // Renegotiate, rejecting the video m= section.
-  // TODO(deadbeef): When an RtpTransceiver API is available, use that to
-  // reject the video m= section.
-  caller()->SetGeneratedSdpMunger([](cricket::SessionDescription* description) {
-    for (cricket::ContentInfo& content : description->contents()) {
-      if (cricket::IsVideoContent(&content)) {
-        content.rejected = true;
-      }
-    }
-  });
-  caller()->CreateAndSetAndSignalOffer();
-  ASSERT_TRUE_WAIT(SignalingStateStable(), kMaxWaitForActivationMs);
-
-  // Sanity check that the caller's description has a rejected video section.
-  ASSERT_NE(nullptr, caller()->pc()->local_description());
-  const ContentInfo* caller_video_content =
-      GetFirstVideoContent(caller()->pc()->local_description()->description());
-  ASSERT_NE(nullptr, caller_video_content);
-  EXPECT_TRUE(caller_video_content->rejected);
-
-  int caller_video_received = caller()->total_video_frames_received();
-  int callee_video_received = callee()->total_video_frames_received();
-
-  // Wait for some additional audio frames to be received.
-  ExpectNewFramesReceivedWithWait(kDefaultExpectedAudioFrameCount, 0,
-                                  kDefaultExpectedAudioFrameCount, 0,
-                                  kMaxWaitForFramesMs);
-
-  // During this time, we shouldn't have received any additional video frames
-  // for the rejected video tracks.
-  EXPECT_EQ(caller_video_received, caller()->total_video_frames_received());
-  EXPECT_EQ(callee_video_received, callee()->total_video_frames_received());
-}
-
-// Basic end-to-end test, but without SSRC/MSID signaling. This functionality
-// is needed to support legacy endpoints.
-// TODO(deadbeef): When we support the MID extension and demuxing on MID, also
-// add a test for an end-to-end test without MID signaling either (basically,
-// the minimum acceptable SDP).
-TEST_F(PeerConnectionIntegrationTest, EndToEndCallWithoutSsrcOrMsidSignaling) {
-  ASSERT_TRUE(CreatePeerConnectionWrappers());
-  ConnectFakeSignaling();
-  // Add audio and video, testing that packets can be demuxed on payload type.
-  caller()->AddAudioVideoMediaStream();
-  callee()->AddAudioVideoMediaStream();
-  // Remove SSRCs and MSIDs from the received offer SDP.
-  callee()->SetReceivedSdpMunger(RemoveSsrcsAndMsids);
-  caller()->CreateAndSetAndSignalOffer();
-  ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
-  ExpectNewFramesReceivedWithWait(
-      kDefaultExpectedAudioFrameCount, kDefaultExpectedVideoFrameCount,
-      kDefaultExpectedAudioFrameCount, kDefaultExpectedVideoFrameCount,
-      kMaxWaitForFramesMs);
-}
-
-// Test that if two video tracks are sent (from caller to callee, in this test),
-// they're transmitted correctly end-to-end.
-TEST_F(PeerConnectionIntegrationTest, EndToEndCallWithTwoVideoTracks) {
-  ASSERT_TRUE(CreatePeerConnectionWrappers());
-  ConnectFakeSignaling();
-  // Add one audio/video stream, and one video-only stream.
-  caller()->AddAudioVideoMediaStream();
-  caller()->AddVideoOnlyMediaStream();
-  caller()->CreateAndSetAndSignalOffer();
-  ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
-  ASSERT_EQ(2u, callee()->number_of_remote_streams());
-  int expected_callee_received_frames = kDefaultExpectedVideoFrameCount;
-  ExpectNewFramesReceivedWithWait(0, 0, 0, expected_callee_received_frames,
-                                  kMaxWaitForFramesMs);
-}
-
-static void MakeSpecCompliantMaxBundleOffer(cricket::SessionDescription* desc) {
-  bool first = true;
-  for (cricket::ContentInfo& content : desc->contents()) {
-    if (first) {
-      first = false;
-      continue;
-    }
-    content.bundle_only = true;
-  }
-  first = true;
-  for (cricket::TransportInfo& transport : desc->transport_infos()) {
-    if (first) {
-      first = false;
-      continue;
-    }
-    transport.description.ice_ufrag.clear();
-    transport.description.ice_pwd.clear();
-    transport.description.connection_role = cricket::CONNECTIONROLE_NONE;
-    transport.description.identity_fingerprint.reset(nullptr);
-  }
-}
-
-// Test that if applying a true "max bundle" offer, which uses ports of 0,
-// "a=bundle-only", omitting "a=fingerprint", "a=setup", "a=ice-ufrag" and
-// "a=ice-pwd" for all but the audio "m=" section, negotiation still completes
-// successfully and media flows.
-// TODO(deadbeef): Update this test to also omit "a=rtcp-mux", once that works.
-// TODO(deadbeef): Won't need this test once we start generating actual
-// standards-compliant SDP.
-TEST_F(PeerConnectionIntegrationTest,
-       EndToEndCallWithSpecCompliantMaxBundleOffer) {
-  ASSERT_TRUE(CreatePeerConnectionWrappers());
-  ConnectFakeSignaling();
-  caller()->AddAudioVideoMediaStream();
-  callee()->AddAudioVideoMediaStream();
-  // Do the equivalent of setting the port to 0, adding a=bundle-only, and
-  // removing a=ice-ufrag, a=ice-pwd, a=fingerprint and a=setup from all
-  // but the first m= section.
-  callee()->SetReceivedSdpMunger(MakeSpecCompliantMaxBundleOffer);
-  caller()->CreateAndSetAndSignalOffer();
-  ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
-  ExpectNewFramesReceivedWithWait(
-      kDefaultExpectedAudioFrameCount, kDefaultExpectedVideoFrameCount,
-      kDefaultExpectedAudioFrameCount, kDefaultExpectedVideoFrameCount,
-      kMaxWaitForFramesMs);
-}
-
-// Test that we can receive the audio output level from a remote audio track.
-// TODO(deadbeef): Use a fake audio source and verify that the output level is
-// exactly what the source on the other side was configured with.
-TEST_F(PeerConnectionIntegrationTest, GetAudioOutputLevelStatsWithOldStatsApi) {
-  ASSERT_TRUE(CreatePeerConnectionWrappers());
-  ConnectFakeSignaling();
-  // Just add an audio track.
-  caller()->AddMediaStreamFromTracks(caller()->CreateLocalAudioTrack(),
-                                     nullptr);
-  caller()->CreateAndSetAndSignalOffer();
-  ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
-
-  // Get the audio output level stats. Note that the level is not available
-  // until an RTCP packet has been received.
-  EXPECT_TRUE_WAIT(callee()->OldGetStats()->AudioOutputLevel() > 0,
-                   kMaxWaitForFramesMs);
-}
-
-// Test that an audio input level is reported.
-// TODO(deadbeef): Use a fake audio source and verify that the input level is
-// exactly what the source was configured with.
-TEST_F(PeerConnectionIntegrationTest, GetAudioInputLevelStatsWithOldStatsApi) {
-  ASSERT_TRUE(CreatePeerConnectionWrappers());
-  ConnectFakeSignaling();
-  // Just add an audio track.
-  caller()->AddMediaStreamFromTracks(caller()->CreateLocalAudioTrack(),
-                                     nullptr);
-  caller()->CreateAndSetAndSignalOffer();
-  ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
-
-  // Get the audio input level stats. The level should be available very
-  // soon after the test starts.
-  EXPECT_TRUE_WAIT(caller()->OldGetStats()->AudioInputLevel() > 0,
-                   kMaxWaitForStatsMs);
-}
-
-// Test that we can get incoming byte counts from both audio and video tracks.
-TEST_F(PeerConnectionIntegrationTest, GetBytesReceivedStatsWithOldStatsApi) {
-  ASSERT_TRUE(CreatePeerConnectionWrappers());
-  ConnectFakeSignaling();
-  caller()->AddAudioVideoMediaStream();
-  // Do offer/answer, wait for the callee to receive some frames.
-  caller()->CreateAndSetAndSignalOffer();
-  ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
-  int expected_caller_received_frames = 0;
-  ExpectNewFramesReceivedWithWait(
-      expected_caller_received_frames, expected_caller_received_frames,
-      kDefaultExpectedAudioFrameCount, kDefaultExpectedVideoFrameCount,
-      kMaxWaitForFramesMs);
-
-  // Get a handle to the remote tracks created, so they can be used as GetStats
-  // filters.
-  StreamCollectionInterface* remote_streams = callee()->remote_streams();
-  ASSERT_EQ(1u, remote_streams->count());
-  ASSERT_EQ(1u, remote_streams->at(0)->GetAudioTracks().size());
-  ASSERT_EQ(1u, remote_streams->at(0)->GetVideoTracks().size());
-  MediaStreamTrackInterface* remote_audio_track =
-      remote_streams->at(0)->GetAudioTracks()[0];
-  MediaStreamTrackInterface* remote_video_track =
-      remote_streams->at(0)->GetVideoTracks()[0];
-
-  // We received frames, so we definitely should have nonzero "received bytes"
-  // stats at this point.
-  EXPECT_GT(callee()->OldGetStatsForTrack(remote_audio_track)->BytesReceived(),
-            0);
-  EXPECT_GT(callee()->OldGetStatsForTrack(remote_video_track)->BytesReceived(),
-            0);
-}
-
-// Test that we can get outgoing byte counts from both audio and video tracks.
-TEST_F(PeerConnectionIntegrationTest, GetBytesSentStatsWithOldStatsApi) {
-  ASSERT_TRUE(CreatePeerConnectionWrappers());
-  ConnectFakeSignaling();
-  auto audio_track = caller()->CreateLocalAudioTrack();
-  auto video_track = caller()->CreateLocalVideoTrack();
-  caller()->AddMediaStreamFromTracks(audio_track, video_track);
-  // Do offer/answer, wait for the callee to receive some frames.
-  caller()->CreateAndSetAndSignalOffer();
-  ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
-  int expected_caller_received_frames = 0;
-  ExpectNewFramesReceivedWithWait(
-      expected_caller_received_frames, expected_caller_received_frames,
-      kDefaultExpectedAudioFrameCount, kDefaultExpectedVideoFrameCount,
-      kMaxWaitForFramesMs);
-
-  // The callee received frames, so we definitely should have nonzero "sent
-  // bytes" stats at this point.
-  EXPECT_GT(caller()->OldGetStatsForTrack(audio_track)->BytesSent(), 0);
-  EXPECT_GT(caller()->OldGetStatsForTrack(video_track)->BytesSent(), 0);
-}
-
-// Test that we can get capture start ntp time.
-TEST_F(PeerConnectionIntegrationTest, GetCaptureStartNtpTimeWithOldStatsApi) {
-  ASSERT_TRUE(CreatePeerConnectionWrappers());
-  ConnectFakeSignaling();
-  caller()->AddAudioOnlyMediaStream();
-
-  auto audio_track = callee()->CreateLocalAudioTrack();
-  callee()->AddMediaStreamFromTracks(audio_track, nullptr);
-
-  // Do offer/answer, wait for the callee to receive some frames.
-  caller()->CreateAndSetAndSignalOffer();
-  ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
-
-  // Get the remote audio track created on the receiver, so they can be used as
-  // GetStats filters.
-  StreamCollectionInterface* remote_streams = callee()->remote_streams();
-  ASSERT_EQ(1u, remote_streams->count());
-  ASSERT_EQ(1u, remote_streams->at(0)->GetAudioTracks().size());
-  MediaStreamTrackInterface* remote_audio_track =
-      remote_streams->at(0)->GetAudioTracks()[0];
-
-  // Get the audio output level stats. Note that the level is not available
-  // until an RTCP packet has been received.
-  EXPECT_TRUE_WAIT(callee()->OldGetStatsForTrack(remote_audio_track)->
-                   CaptureStartNtpTime() > 0, 2 * kMaxWaitForFramesMs);
-}
-
-// Test that we can get stats (using the new stats implemnetation) for
-// unsignaled streams. Meaning when SSRCs/MSIDs aren't signaled explicitly in
-// SDP.
-TEST_F(PeerConnectionIntegrationTest,
-       GetStatsForUnsignaledStreamWithNewStatsApi) {
-  ASSERT_TRUE(CreatePeerConnectionWrappers());
-  ConnectFakeSignaling();
-  caller()->AddAudioOnlyMediaStream();
-  // Remove SSRCs and MSIDs from the received offer SDP.
-  callee()->SetReceivedSdpMunger(RemoveSsrcsAndMsids);
-  caller()->CreateAndSetAndSignalOffer();
-  ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
-  // Wait for one audio frame to be received by the callee.
-  ExpectNewFramesReceivedWithWait(0, 0, 1, 0, kMaxWaitForFramesMs);
-
-  // We received a frame, so we should have nonzero "bytes received" stats for
-  // the unsignaled stream, if stats are working for it.
-  rtc::scoped_refptr<const webrtc::RTCStatsReport> report =
-      callee()->NewGetStats();
-  ASSERT_NE(nullptr, report);
-  auto inbound_stream_stats =
-      report->GetStatsOfType<webrtc::RTCInboundRTPStreamStats>();
-  ASSERT_EQ(1U, inbound_stream_stats.size());
-  ASSERT_TRUE(inbound_stream_stats[0]->bytes_received.is_defined());
-  ASSERT_GT(*inbound_stream_stats[0]->bytes_received, 0U);
-  ASSERT_TRUE(inbound_stream_stats[0]->track_id.is_defined());
-}
-
-// Test that we can successfully get the media related stats (audio level
-// etc.) for the unsignaled stream.
-TEST_F(PeerConnectionIntegrationTest,
-       GetMediaStatsForUnsignaledStreamWithNewStatsApi) {
-  ASSERT_TRUE(CreatePeerConnectionWrappers());
-  ConnectFakeSignaling();
-  caller()->AddAudioVideoMediaStream();
-  // Remove SSRCs and MSIDs from the received offer SDP.
-  callee()->SetReceivedSdpMunger(RemoveSsrcsAndMsids);
-  caller()->CreateAndSetAndSignalOffer();
-  ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
-  // Wait for one audio frame to be received by the callee.
-  ExpectNewFramesReceivedWithWait(0, 0, 1, 1, kMaxWaitForFramesMs);
-
-  rtc::scoped_refptr<const webrtc::RTCStatsReport> report =
-      callee()->NewGetStats();
-  ASSERT_NE(nullptr, report);
-
-  auto media_stats = report->GetStatsOfType<webrtc::RTCMediaStreamTrackStats>();
-  auto audio_index = FindFirstMediaStatsIndexByKind("audio", media_stats);
-  ASSERT_GE(audio_index, 0);
-  EXPECT_TRUE(media_stats[audio_index]->audio_level.is_defined());
-}
-
-// Test that DTLS 1.0 is used if both sides only support DTLS 1.0.
-TEST_F(PeerConnectionIntegrationTest, EndToEndCallWithDtls10) {
-  PeerConnectionFactory::Options dtls_10_options;
-  dtls_10_options.ssl_max_version = rtc::SSL_PROTOCOL_DTLS_10;
-  ASSERT_TRUE(CreatePeerConnectionWrappersWithOptions(dtls_10_options,
-                                                      dtls_10_options));
-  ConnectFakeSignaling();
-  // Do normal offer/answer and wait for some frames to be received in each
-  // direction.
-  caller()->AddAudioVideoMediaStream();
-  callee()->AddAudioVideoMediaStream();
-  caller()->CreateAndSetAndSignalOffer();
-  ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
-  ExpectNewFramesReceivedWithWait(
-      kDefaultExpectedAudioFrameCount, kDefaultExpectedVideoFrameCount,
-      kDefaultExpectedAudioFrameCount, kDefaultExpectedVideoFrameCount,
-      kMaxWaitForFramesMs);
-}
-
-// Test getting cipher stats and UMA metrics when DTLS 1.0 is negotiated.
-TEST_F(PeerConnectionIntegrationTest, Dtls10CipherStatsAndUmaMetrics) {
-  PeerConnectionFactory::Options dtls_10_options;
-  dtls_10_options.ssl_max_version = rtc::SSL_PROTOCOL_DTLS_10;
-  ASSERT_TRUE(CreatePeerConnectionWrappersWithOptions(dtls_10_options,
-                                                      dtls_10_options));
-  ConnectFakeSignaling();
-  // Register UMA observer before signaling begins.
-  rtc::scoped_refptr<webrtc::FakeMetricsObserver> caller_observer =
-      new rtc::RefCountedObject<webrtc::FakeMetricsObserver>();
-  caller()->pc()->RegisterUMAObserver(caller_observer);
-  caller()->AddAudioVideoMediaStream();
-  callee()->AddAudioVideoMediaStream();
-  caller()->CreateAndSetAndSignalOffer();
-  ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
-  EXPECT_TRUE_WAIT(rtc::SSLStreamAdapter::IsAcceptableCipher(
-                       caller()->OldGetStats()->DtlsCipher(), rtc::KT_DEFAULT),
-                   kDefaultTimeout);
-  EXPECT_EQ_WAIT(rtc::SrtpCryptoSuiteToName(kDefaultSrtpCryptoSuite),
-                 caller()->OldGetStats()->SrtpCipher(), kDefaultTimeout);
-  EXPECT_EQ(1,
-            caller_observer->GetEnumCounter(webrtc::kEnumCounterAudioSrtpCipher,
-                                            kDefaultSrtpCryptoSuite));
-}
-
-// Test getting cipher stats and UMA metrics when DTLS 1.2 is negotiated.
-TEST_F(PeerConnectionIntegrationTest, Dtls12CipherStatsAndUmaMetrics) {
-  PeerConnectionFactory::Options dtls_12_options;
-  dtls_12_options.ssl_max_version = rtc::SSL_PROTOCOL_DTLS_12;
-  ASSERT_TRUE(CreatePeerConnectionWrappersWithOptions(dtls_12_options,
-                                                      dtls_12_options));
-  ConnectFakeSignaling();
-  // Register UMA observer before signaling begins.
-  rtc::scoped_refptr<webrtc::FakeMetricsObserver> caller_observer =
-      new rtc::RefCountedObject<webrtc::FakeMetricsObserver>();
-  caller()->pc()->RegisterUMAObserver(caller_observer);
-  caller()->AddAudioVideoMediaStream();
-  callee()->AddAudioVideoMediaStream();
-  caller()->CreateAndSetAndSignalOffer();
-  ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
-  EXPECT_TRUE_WAIT(rtc::SSLStreamAdapter::IsAcceptableCipher(
-                       caller()->OldGetStats()->DtlsCipher(), rtc::KT_DEFAULT),
-                   kDefaultTimeout);
-  EXPECT_EQ_WAIT(rtc::SrtpCryptoSuiteToName(kDefaultSrtpCryptoSuite),
-                 caller()->OldGetStats()->SrtpCipher(), kDefaultTimeout);
-  EXPECT_EQ(1,
-            caller_observer->GetEnumCounter(webrtc::kEnumCounterAudioSrtpCipher,
-                                            kDefaultSrtpCryptoSuite));
-}
-
-// Test that DTLS 1.0 can be used if the caller supports DTLS 1.2 and the
-// callee only supports 1.0.
-TEST_F(PeerConnectionIntegrationTest, CallerDtls12ToCalleeDtls10) {
-  PeerConnectionFactory::Options caller_options;
-  caller_options.ssl_max_version = rtc::SSL_PROTOCOL_DTLS_12;
-  PeerConnectionFactory::Options callee_options;
-  callee_options.ssl_max_version = rtc::SSL_PROTOCOL_DTLS_10;
-  ASSERT_TRUE(
-      CreatePeerConnectionWrappersWithOptions(caller_options, callee_options));
-  ConnectFakeSignaling();
-  // Do normal offer/answer and wait for some frames to be received in each
-  // direction.
-  caller()->AddAudioVideoMediaStream();
-  callee()->AddAudioVideoMediaStream();
-  caller()->CreateAndSetAndSignalOffer();
-  ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
-  ExpectNewFramesReceivedWithWait(
-      kDefaultExpectedAudioFrameCount, kDefaultExpectedVideoFrameCount,
-      kDefaultExpectedAudioFrameCount, kDefaultExpectedVideoFrameCount,
-      kMaxWaitForFramesMs);
-}
-
-// Test that DTLS 1.0 can be used if the caller only supports DTLS 1.0 and the
-// callee supports 1.2.
-TEST_F(PeerConnectionIntegrationTest, CallerDtls10ToCalleeDtls12) {
-  PeerConnectionFactory::Options caller_options;
-  caller_options.ssl_max_version = rtc::SSL_PROTOCOL_DTLS_10;
-  PeerConnectionFactory::Options callee_options;
-  callee_options.ssl_max_version = rtc::SSL_PROTOCOL_DTLS_12;
-  ASSERT_TRUE(
-      CreatePeerConnectionWrappersWithOptions(caller_options, callee_options));
-  ConnectFakeSignaling();
-  // Do normal offer/answer and wait for some frames to be received in each
-  // direction.
-  caller()->AddAudioVideoMediaStream();
-  callee()->AddAudioVideoMediaStream();
-  caller()->CreateAndSetAndSignalOffer();
-  ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
-  ExpectNewFramesReceivedWithWait(
-      kDefaultExpectedAudioFrameCount, kDefaultExpectedVideoFrameCount,
-      kDefaultExpectedAudioFrameCount, kDefaultExpectedVideoFrameCount,
-      kMaxWaitForFramesMs);
-}
-
-// Test that a non-GCM cipher is used if both sides only support non-GCM.
-TEST_F(PeerConnectionIntegrationTest, NonGcmCipherUsedWhenGcmNotSupported) {
-  bool local_gcm_enabled = false;
-  bool remote_gcm_enabled = false;
-  int expected_cipher_suite = kDefaultSrtpCryptoSuite;
-  TestGcmNegotiationUsesCipherSuite(local_gcm_enabled, remote_gcm_enabled,
-                                    expected_cipher_suite);
-}
-
-// Test that a GCM cipher is used if both ends support it.
-TEST_F(PeerConnectionIntegrationTest, GcmCipherUsedWhenGcmSupported) {
-  bool local_gcm_enabled = true;
-  bool remote_gcm_enabled = true;
-  int expected_cipher_suite = kDefaultSrtpCryptoSuiteGcm;
-  TestGcmNegotiationUsesCipherSuite(local_gcm_enabled, remote_gcm_enabled,
-                                    expected_cipher_suite);
-}
-
-// Test that GCM isn't used if only the offerer supports it.
-TEST_F(PeerConnectionIntegrationTest,
-       NonGcmCipherUsedWhenOnlyCallerSupportsGcm) {
-  bool local_gcm_enabled = true;
-  bool remote_gcm_enabled = false;
-  int expected_cipher_suite = kDefaultSrtpCryptoSuite;
-  TestGcmNegotiationUsesCipherSuite(local_gcm_enabled, remote_gcm_enabled,
-                                    expected_cipher_suite);
-}
-
-// Test that GCM isn't used if only the answerer supports it.
-TEST_F(PeerConnectionIntegrationTest,
-       NonGcmCipherUsedWhenOnlyCalleeSupportsGcm) {
-  bool local_gcm_enabled = false;
-  bool remote_gcm_enabled = true;
-  int expected_cipher_suite = kDefaultSrtpCryptoSuite;
-  TestGcmNegotiationUsesCipherSuite(local_gcm_enabled, remote_gcm_enabled,
-                                    expected_cipher_suite);
-}
-
-// Verify that media can be transmitted end-to-end when GCM crypto suites are
-// enabled. Note that the above tests, such as GcmCipherUsedWhenGcmSupported,
-// only verify that a GCM cipher is negotiated, and not necessarily that SRTP
-// works with it.
-TEST_F(PeerConnectionIntegrationTest, EndToEndCallWithGcmCipher) {
-  PeerConnectionFactory::Options gcm_options;
-  gcm_options.crypto_options.enable_gcm_crypto_suites = true;
-  ASSERT_TRUE(
-      CreatePeerConnectionWrappersWithOptions(gcm_options, gcm_options));
-  ConnectFakeSignaling();
-  // Do normal offer/answer and wait for some frames to be received in each
-  // direction.
-  caller()->AddAudioVideoMediaStream();
-  callee()->AddAudioVideoMediaStream();
-  caller()->CreateAndSetAndSignalOffer();
-  ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
-  ExpectNewFramesReceivedWithWait(
-      kDefaultExpectedAudioFrameCount, kDefaultExpectedVideoFrameCount,
-      kDefaultExpectedAudioFrameCount, kDefaultExpectedVideoFrameCount,
-      kMaxWaitForFramesMs);
-}
-
-// This test sets up a call between two parties with audio, video and an RTP
-// data channel.
-TEST_F(PeerConnectionIntegrationTest, EndToEndCallWithRtpDataChannel) {
-  FakeConstraints setup_constraints;
-  setup_constraints.SetAllowRtpDataChannels();
-  ASSERT_TRUE(CreatePeerConnectionWrappersWithConstraints(&setup_constraints,
-                                                          &setup_constraints));
-  ConnectFakeSignaling();
-  // Expect that data channel created on caller side will show up for callee as
-  // well.
-  caller()->CreateDataChannel();
-  caller()->AddAudioVideoMediaStream();
-  callee()->AddAudioVideoMediaStream();
-  caller()->CreateAndSetAndSignalOffer();
-  ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
-  // Ensure the existence of the RTP data channel didn't impede audio/video.
-  ExpectNewFramesReceivedWithWait(
-      kDefaultExpectedAudioFrameCount, kDefaultExpectedVideoFrameCount,
-      kDefaultExpectedAudioFrameCount, kDefaultExpectedVideoFrameCount,
-      kMaxWaitForFramesMs);
-  ASSERT_NE(nullptr, caller()->data_channel());
-  ASSERT_NE(nullptr, callee()->data_channel());
-  EXPECT_TRUE_WAIT(caller()->data_observer()->IsOpen(), kDefaultTimeout);
-  EXPECT_TRUE_WAIT(callee()->data_observer()->IsOpen(), kDefaultTimeout);
-
-  // Ensure data can be sent in both directions.
-  std::string data = "hello world";
-  SendRtpDataWithRetries(caller()->data_channel(), data, 5);
-  EXPECT_EQ_WAIT(data, callee()->data_observer()->last_message(),
-                 kDefaultTimeout);
-  SendRtpDataWithRetries(callee()->data_channel(), data, 5);
-  EXPECT_EQ_WAIT(data, caller()->data_observer()->last_message(),
-                 kDefaultTimeout);
-}
-
-// Ensure that an RTP data channel is signaled as closed for the caller when
-// the callee rejects it in a subsequent offer.
-TEST_F(PeerConnectionIntegrationTest,
-       RtpDataChannelSignaledClosedInCalleeOffer) {
-  // Same procedure as above test.
-  FakeConstraints setup_constraints;
-  setup_constraints.SetAllowRtpDataChannels();
-  ASSERT_TRUE(CreatePeerConnectionWrappersWithConstraints(&setup_constraints,
-                                                          &setup_constraints));
-  ConnectFakeSignaling();
-  caller()->CreateDataChannel();
-  caller()->AddAudioVideoMediaStream();
-  callee()->AddAudioVideoMediaStream();
-  caller()->CreateAndSetAndSignalOffer();
-  ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
-  ASSERT_NE(nullptr, caller()->data_channel());
-  ASSERT_NE(nullptr, callee()->data_channel());
-  ASSERT_TRUE_WAIT(caller()->data_observer()->IsOpen(), kDefaultTimeout);
-  ASSERT_TRUE_WAIT(callee()->data_observer()->IsOpen(), kDefaultTimeout);
-
-  // Close the data channel on the callee, and do an updated offer/answer.
-  callee()->data_channel()->Close();
-  callee()->CreateAndSetAndSignalOffer();
-  ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
-  EXPECT_FALSE(caller()->data_observer()->IsOpen());
-  EXPECT_FALSE(callee()->data_observer()->IsOpen());
-}
-
-// Tests that data is buffered in an RTP data channel until an observer is
-// registered for it.
-//
-// NOTE: RTP data channels can receive data before the underlying
-// transport has detected that a channel is writable and thus data can be
-// received before the data channel state changes to open. That is hard to test
-// but the same buffering is expected to be used in that case.
-TEST_F(PeerConnectionIntegrationTest,
-       DataBufferedUntilRtpDataChannelObserverRegistered) {
-  // Use fake clock and simulated network delay so that we predictably can wait
-  // until an SCTP message has been delivered without "sleep()"ing.
-  rtc::ScopedFakeClock fake_clock;
-  // Some things use a time of "0" as a special value, so we need to start out
-  // the fake clock at a nonzero time.
-  // TODO(deadbeef): Fix this.
-  fake_clock.AdvanceTime(rtc::TimeDelta::FromSeconds(1));
-  virtual_socket_server()->set_delay_mean(5);  // 5 ms per hop.
-  virtual_socket_server()->UpdateDelayDistribution();
-
-  FakeConstraints constraints;
-  constraints.SetAllowRtpDataChannels();
-  ASSERT_TRUE(
-      CreatePeerConnectionWrappersWithConstraints(&constraints, &constraints));
-  ConnectFakeSignaling();
-  caller()->CreateDataChannel();
-  caller()->CreateAndSetAndSignalOffer();
-  ASSERT_TRUE(caller()->data_channel() != nullptr);
-  ASSERT_TRUE_SIMULATED_WAIT(callee()->data_channel() != nullptr,
-                             kDefaultTimeout, fake_clock);
-  ASSERT_TRUE_SIMULATED_WAIT(caller()->data_observer()->IsOpen(),
-                             kDefaultTimeout, fake_clock);
-  ASSERT_EQ_SIMULATED_WAIT(DataChannelInterface::kOpen,
-                           callee()->data_channel()->state(), kDefaultTimeout,
-                           fake_clock);
-
-  // Unregister the observer which is normally automatically registered.
-  callee()->data_channel()->UnregisterObserver();
-  // Send data and advance fake clock until it should have been received.
-  std::string data = "hello world";
-  caller()->data_channel()->Send(DataBuffer(data));
-  SIMULATED_WAIT(false, 50, fake_clock);
-
-  // Attach data channel and expect data to be received immediately. Note that
-  // EXPECT_EQ_WAIT is used, such that the simulated clock is not advanced any
-  // further, but data can be received even if the callback is asynchronous.
-  MockDataChannelObserver new_observer(callee()->data_channel());
-  EXPECT_EQ_SIMULATED_WAIT(data, new_observer.last_message(), kDefaultTimeout,
-                           fake_clock);
-}
-
-// This test sets up a call between two parties with audio, video and but only
-// the caller client supports RTP data channels.
-TEST_F(PeerConnectionIntegrationTest, RtpDataChannelsRejectedByCallee) {
-  FakeConstraints setup_constraints_1;
-  setup_constraints_1.SetAllowRtpDataChannels();
-  // Must disable DTLS to make negotiation succeed.
-  setup_constraints_1.SetMandatory(MediaConstraintsInterface::kEnableDtlsSrtp,
-                                   false);
-  FakeConstraints setup_constraints_2;
-  setup_constraints_2.SetMandatory(MediaConstraintsInterface::kEnableDtlsSrtp,
-                                   false);
-  ASSERT_TRUE(CreatePeerConnectionWrappersWithConstraints(
-      &setup_constraints_1, &setup_constraints_2));
-  ConnectFakeSignaling();
-  caller()->CreateDataChannel();
-  caller()->AddAudioVideoMediaStream();
-  callee()->AddAudioVideoMediaStream();
-  caller()->CreateAndSetAndSignalOffer();
-  ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
-  // The caller should still have a data channel, but it should be closed, and
-  // one should ever have been created for the callee.
-  EXPECT_TRUE(caller()->data_channel() != nullptr);
-  EXPECT_FALSE(caller()->data_observer()->IsOpen());
-  EXPECT_EQ(nullptr, callee()->data_channel());
-}
-
-// This test sets up a call between two parties with audio, and video. When
-// audio and video is setup and flowing, an RTP data channel is negotiated.
-TEST_F(PeerConnectionIntegrationTest, AddRtpDataChannelInSubsequentOffer) {
-  FakeConstraints setup_constraints;
-  setup_constraints.SetAllowRtpDataChannels();
-  ASSERT_TRUE(CreatePeerConnectionWrappersWithConstraints(&setup_constraints,
-                                                          &setup_constraints));
-  ConnectFakeSignaling();
-  // Do initial offer/answer with audio/video.
-  caller()->AddAudioVideoMediaStream();
-  callee()->AddAudioVideoMediaStream();
-  caller()->CreateAndSetAndSignalOffer();
-  ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
-  // Create data channel and do new offer and answer.
-  caller()->CreateDataChannel();
-  caller()->CreateAndSetAndSignalOffer();
-  ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
-  ASSERT_NE(nullptr, caller()->data_channel());
-  ASSERT_NE(nullptr, callee()->data_channel());
-  EXPECT_TRUE_WAIT(caller()->data_observer()->IsOpen(), kDefaultTimeout);
-  EXPECT_TRUE_WAIT(callee()->data_observer()->IsOpen(), kDefaultTimeout);
-  // Ensure data can be sent in both directions.
-  std::string data = "hello world";
-  SendRtpDataWithRetries(caller()->data_channel(), data, 5);
-  EXPECT_EQ_WAIT(data, callee()->data_observer()->last_message(),
-                 kDefaultTimeout);
-  SendRtpDataWithRetries(callee()->data_channel(), data, 5);
-  EXPECT_EQ_WAIT(data, caller()->data_observer()->last_message(),
-                 kDefaultTimeout);
-}
-
-#ifdef HAVE_SCTP
-
-// This test sets up a call between two parties with audio, video and an SCTP
-// data channel.
-TEST_F(PeerConnectionIntegrationTest, EndToEndCallWithSctpDataChannel) {
-  ASSERT_TRUE(CreatePeerConnectionWrappers());
-  ConnectFakeSignaling();
-  // Expect that data channel created on caller side will show up for callee as
-  // well.
-  caller()->CreateDataChannel();
-  caller()->AddAudioVideoMediaStream();
-  callee()->AddAudioVideoMediaStream();
-  caller()->CreateAndSetAndSignalOffer();
-  ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
-  // Ensure the existence of the SCTP data channel didn't impede audio/video.
-  ExpectNewFramesReceivedWithWait(
-      kDefaultExpectedAudioFrameCount, kDefaultExpectedVideoFrameCount,
-      kDefaultExpectedAudioFrameCount, kDefaultExpectedVideoFrameCount,
-      kMaxWaitForFramesMs);
-  // Caller data channel should already exist (it created one). Callee data
-  // channel may not exist yet, since negotiation happens in-band, not in SDP.
-  ASSERT_NE(nullptr, caller()->data_channel());
-  ASSERT_TRUE_WAIT(callee()->data_channel() != nullptr, kDefaultTimeout);
-  EXPECT_TRUE_WAIT(caller()->data_observer()->IsOpen(), kDefaultTimeout);
-  EXPECT_TRUE_WAIT(callee()->data_observer()->IsOpen(), kDefaultTimeout);
-
-  // Ensure data can be sent in both directions.
-  std::string data = "hello world";
-  caller()->data_channel()->Send(DataBuffer(data));
-  EXPECT_EQ_WAIT(data, callee()->data_observer()->last_message(),
-                 kDefaultTimeout);
-  callee()->data_channel()->Send(DataBuffer(data));
-  EXPECT_EQ_WAIT(data, caller()->data_observer()->last_message(),
-                 kDefaultTimeout);
-}
-
-// Ensure that when the callee closes an SCTP data channel, the closing
-// procedure results in the data channel being closed for the caller as well.
-TEST_F(PeerConnectionIntegrationTest, CalleeClosesSctpDataChannel) {
-  // Same procedure as above test.
-  ASSERT_TRUE(CreatePeerConnectionWrappers());
-  ConnectFakeSignaling();
-  caller()->CreateDataChannel();
-  caller()->AddAudioVideoMediaStream();
-  callee()->AddAudioVideoMediaStream();
-  caller()->CreateAndSetAndSignalOffer();
-  ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
-  ASSERT_NE(nullptr, caller()->data_channel());
-  ASSERT_TRUE_WAIT(callee()->data_channel() != nullptr, kDefaultTimeout);
-  ASSERT_TRUE_WAIT(caller()->data_observer()->IsOpen(), kDefaultTimeout);
-  ASSERT_TRUE_WAIT(callee()->data_observer()->IsOpen(), kDefaultTimeout);
-
-  // Close the data channel on the callee side, and wait for it to reach the
-  // "closed" state on both sides.
-  callee()->data_channel()->Close();
-  EXPECT_TRUE_WAIT(!caller()->data_observer()->IsOpen(), kDefaultTimeout);
-  EXPECT_TRUE_WAIT(!callee()->data_observer()->IsOpen(), kDefaultTimeout);
-}
-
-// Test usrsctp's ability to process unordered data stream, where data actually
-// arrives out of order using simulated delays. Previously there have been some
-// bugs in this area.
-TEST_F(PeerConnectionIntegrationTest, StressTestUnorderedSctpDataChannel) {
-  // Introduce random network delays.
-  // Otherwise it's not a true "unordered" test.
-  virtual_socket_server()->set_delay_mean(20);
-  virtual_socket_server()->set_delay_stddev(5);
-  virtual_socket_server()->UpdateDelayDistribution();
-  // Normal procedure, but with unordered data channel config.
-  ASSERT_TRUE(CreatePeerConnectionWrappers());
-  ConnectFakeSignaling();
-  webrtc::DataChannelInit init;
-  init.ordered = false;
-  caller()->CreateDataChannel(&init);
-  caller()->CreateAndSetAndSignalOffer();
-  ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
-  ASSERT_NE(nullptr, caller()->data_channel());
-  ASSERT_TRUE_WAIT(callee()->data_channel() != nullptr, kDefaultTimeout);
-  ASSERT_TRUE_WAIT(caller()->data_observer()->IsOpen(), kDefaultTimeout);
-  ASSERT_TRUE_WAIT(callee()->data_observer()->IsOpen(), kDefaultTimeout);
-
-  static constexpr int kNumMessages = 100;
-  // Deliberately chosen to be larger than the MTU so messages get fragmented.
-  static constexpr size_t kMaxMessageSize = 4096;
-  // Create and send random messages.
-  std::vector<std::string> sent_messages;
-  for (int i = 0; i < kNumMessages; ++i) {
-    size_t length =
-        (rand() % kMaxMessageSize) + 1;  // NOLINT (rand_r instead of rand)
-    std::string message;
-    ASSERT_TRUE(rtc::CreateRandomString(length, &message));
-    caller()->data_channel()->Send(DataBuffer(message));
-    callee()->data_channel()->Send(DataBuffer(message));
-    sent_messages.push_back(message);
-  }
-
-  // Wait for all messages to be received.
-  EXPECT_EQ_WAIT(kNumMessages,
-                 caller()->data_observer()->received_message_count(),
-                 kDefaultTimeout);
-  EXPECT_EQ_WAIT(kNumMessages,
-                 callee()->data_observer()->received_message_count(),
-                 kDefaultTimeout);
-
-  // Sort and compare to make sure none of the messages were corrupted.
-  std::vector<std::string> caller_received_messages =
-      caller()->data_observer()->messages();
-  std::vector<std::string> callee_received_messages =
-      callee()->data_observer()->messages();
-  std::sort(sent_messages.begin(), sent_messages.end());
-  std::sort(caller_received_messages.begin(), caller_received_messages.end());
-  std::sort(callee_received_messages.begin(), callee_received_messages.end());
-  EXPECT_EQ(sent_messages, caller_received_messages);
-  EXPECT_EQ(sent_messages, callee_received_messages);
-}
-
-// This test sets up a call between two parties with audio, and video. When
-// audio and video are setup and flowing, an SCTP data channel is negotiated.
-TEST_F(PeerConnectionIntegrationTest, AddSctpDataChannelInSubsequentOffer) {
-  ASSERT_TRUE(CreatePeerConnectionWrappers());
-  ConnectFakeSignaling();
-  // Do initial offer/answer with audio/video.
-  caller()->AddAudioVideoMediaStream();
-  callee()->AddAudioVideoMediaStream();
-  caller()->CreateAndSetAndSignalOffer();
-  ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
-  // Create data channel and do new offer and answer.
-  caller()->CreateDataChannel();
-  caller()->CreateAndSetAndSignalOffer();
-  ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
-  // Caller data channel should already exist (it created one). Callee data
-  // channel may not exist yet, since negotiation happens in-band, not in SDP.
-  ASSERT_NE(nullptr, caller()->data_channel());
-  ASSERT_TRUE_WAIT(callee()->data_channel() != nullptr, kDefaultTimeout);
-  EXPECT_TRUE_WAIT(caller()->data_observer()->IsOpen(), kDefaultTimeout);
-  EXPECT_TRUE_WAIT(callee()->data_observer()->IsOpen(), kDefaultTimeout);
-  // Ensure data can be sent in both directions.
-  std::string data = "hello world";
-  caller()->data_channel()->Send(DataBuffer(data));
-  EXPECT_EQ_WAIT(data, callee()->data_observer()->last_message(),
-                 kDefaultTimeout);
-  callee()->data_channel()->Send(DataBuffer(data));
-  EXPECT_EQ_WAIT(data, caller()->data_observer()->last_message(),
-                 kDefaultTimeout);
-}
-
-// Set up a connection initially just using SCTP data channels, later upgrading
-// to audio/video, ensuring frames are received end-to-end. Effectively the
-// inverse of the test above.
-// This was broken in M57; see https://crbug.com/711243
-TEST_F(PeerConnectionIntegrationTest, SctpDataChannelToAudioVideoUpgrade) {
-  ASSERT_TRUE(CreatePeerConnectionWrappers());
-  ConnectFakeSignaling();
-  // Do initial offer/answer with just data channel.
-  caller()->CreateDataChannel();
-  caller()->CreateAndSetAndSignalOffer();
-  ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
-  // Wait until data can be sent over the data channel.
-  ASSERT_TRUE_WAIT(callee()->data_channel() != nullptr, kDefaultTimeout);
-  ASSERT_TRUE_WAIT(caller()->data_observer()->IsOpen(), kDefaultTimeout);
-  ASSERT_TRUE_WAIT(callee()->data_observer()->IsOpen(), kDefaultTimeout);
-
-  // Do subsequent offer/answer with two-way audio and video. Audio and video
-  // should end up bundled on the DTLS/ICE transport already used for data.
-  caller()->AddAudioVideoMediaStream();
-  callee()->AddAudioVideoMediaStream();
-  caller()->CreateAndSetAndSignalOffer();
-  ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
-  ExpectNewFramesReceivedWithWait(
-      kDefaultExpectedAudioFrameCount, kDefaultExpectedVideoFrameCount,
-      kDefaultExpectedAudioFrameCount, kDefaultExpectedVideoFrameCount,
-      kMaxWaitForFramesMs);
-}
-
-static void MakeSpecCompliantSctpOffer(cricket::SessionDescription* desc) {
-  const ContentInfo* dc_offer = GetFirstDataContent(desc);
-  ASSERT_NE(nullptr, dc_offer);
-  cricket::DataContentDescription* dcd_offer =
-      static_cast<cricket::DataContentDescription*>(dc_offer->description);
-  dcd_offer->set_use_sctpmap(false);
-  dcd_offer->set_protocol("UDP/DTLS/SCTP");
-}
-
-// Test that the data channel works when a spec-compliant SCTP m= section is
-// offered (using "a=sctp-port" instead of "a=sctpmap", and using
-// "UDP/DTLS/SCTP" as the protocol).
-TEST_F(PeerConnectionIntegrationTest,
-       DataChannelWorksWhenSpecCompliantSctpOfferReceived) {
-  ASSERT_TRUE(CreatePeerConnectionWrappers());
-  ConnectFakeSignaling();
-  caller()->CreateDataChannel();
-  caller()->SetGeneratedSdpMunger(MakeSpecCompliantSctpOffer);
-  caller()->CreateAndSetAndSignalOffer();
-  ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
-  ASSERT_TRUE_WAIT(callee()->data_channel() != nullptr, kDefaultTimeout);
-  EXPECT_TRUE_WAIT(caller()->data_observer()->IsOpen(), kDefaultTimeout);
-  EXPECT_TRUE_WAIT(callee()->data_observer()->IsOpen(), kDefaultTimeout);
-
-  // Ensure data can be sent in both directions.
-  std::string data = "hello world";
-  caller()->data_channel()->Send(DataBuffer(data));
-  EXPECT_EQ_WAIT(data, callee()->data_observer()->last_message(),
-                 kDefaultTimeout);
-  callee()->data_channel()->Send(DataBuffer(data));
-  EXPECT_EQ_WAIT(data, caller()->data_observer()->last_message(),
-                 kDefaultTimeout);
-}
-
-#endif  // HAVE_SCTP
-
-// Test that the ICE connection and gathering states eventually reach
-// "complete".
-TEST_F(PeerConnectionIntegrationTest, IceStatesReachCompletion) {
-  ASSERT_TRUE(CreatePeerConnectionWrappers());
-  ConnectFakeSignaling();
-  // Do normal offer/answer.
-  caller()->AddAudioVideoMediaStream();
-  callee()->AddAudioVideoMediaStream();
-  caller()->CreateAndSetAndSignalOffer();
-  ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
-  EXPECT_EQ_WAIT(webrtc::PeerConnectionInterface::kIceGatheringComplete,
-                 caller()->ice_gathering_state(), kMaxWaitForFramesMs);
-  EXPECT_EQ_WAIT(webrtc::PeerConnectionInterface::kIceGatheringComplete,
-                 callee()->ice_gathering_state(), kMaxWaitForFramesMs);
-  // After the best candidate pair is selected and all candidates are signaled,
-  // the ICE connection state should reach "complete".
-  // TODO(deadbeef): Currently, the ICE "controlled" agent (the
-  // answerer/"callee" by default) only reaches "connected". When this is
-  // fixed, this test should be updated.
-  EXPECT_EQ_WAIT(webrtc::PeerConnectionInterface::kIceConnectionCompleted,
-                 caller()->ice_connection_state(), kDefaultTimeout);
-  EXPECT_EQ_WAIT(webrtc::PeerConnectionInterface::kIceConnectionConnected,
-                 callee()->ice_connection_state(), kDefaultTimeout);
-}
-
-// This test sets up a call between two parties with audio and video.
-// During the call, the caller restarts ICE and the test verifies that
-// new ICE candidates are generated and audio and video still can flow, and the
-// ICE state reaches completed again.
-TEST_F(PeerConnectionIntegrationTest, MediaContinuesFlowingAfterIceRestart) {
-  ASSERT_TRUE(CreatePeerConnectionWrappers());
-  ConnectFakeSignaling();
-  // Do normal offer/answer and wait for ICE to complete.
-  caller()->AddAudioVideoMediaStream();
-  callee()->AddAudioVideoMediaStream();
-  caller()->CreateAndSetAndSignalOffer();
-  ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
-  EXPECT_EQ_WAIT(webrtc::PeerConnectionInterface::kIceConnectionCompleted,
-                 caller()->ice_connection_state(), kMaxWaitForFramesMs);
-  EXPECT_EQ_WAIT(webrtc::PeerConnectionInterface::kIceConnectionConnected,
-                 callee()->ice_connection_state(), kMaxWaitForFramesMs);
-
-  // To verify that the ICE restart actually occurs, get
-  // ufrag/password/candidates before and after restart.
-  // Create an SDP string of the first audio candidate for both clients.
-  const webrtc::IceCandidateCollection* audio_candidates_caller =
-      caller()->pc()->local_description()->candidates(0);
-  const webrtc::IceCandidateCollection* audio_candidates_callee =
-      callee()->pc()->local_description()->candidates(0);
-  ASSERT_GT(audio_candidates_caller->count(), 0u);
-  ASSERT_GT(audio_candidates_callee->count(), 0u);
-  std::string caller_candidate_pre_restart;
-  ASSERT_TRUE(
-      audio_candidates_caller->at(0)->ToString(&caller_candidate_pre_restart));
-  std::string callee_candidate_pre_restart;
-  ASSERT_TRUE(
-      audio_candidates_callee->at(0)->ToString(&callee_candidate_pre_restart));
-  const cricket::SessionDescription* desc =
-      caller()->pc()->local_description()->description();
-  std::string caller_ufrag_pre_restart =
-      desc->transport_infos()[0].description.ice_ufrag;
-  desc = callee()->pc()->local_description()->description();
-  std::string callee_ufrag_pre_restart =
-      desc->transport_infos()[0].description.ice_ufrag;
-
-  // Have the caller initiate an ICE restart.
-  caller()->SetOfferAnswerOptions(IceRestartOfferAnswerOptions());
-  caller()->CreateAndSetAndSignalOffer();
-  ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
-  EXPECT_EQ_WAIT(webrtc::PeerConnectionInterface::kIceConnectionCompleted,
-                 caller()->ice_connection_state(), kMaxWaitForFramesMs);
-  EXPECT_EQ_WAIT(webrtc::PeerConnectionInterface::kIceConnectionConnected,
-                 callee()->ice_connection_state(), kMaxWaitForFramesMs);
-
-  // Grab the ufrags/candidates again.
-  audio_candidates_caller = caller()->pc()->local_description()->candidates(0);
-  audio_candidates_callee = callee()->pc()->local_description()->candidates(0);
-  ASSERT_GT(audio_candidates_caller->count(), 0u);
-  ASSERT_GT(audio_candidates_callee->count(), 0u);
-  std::string caller_candidate_post_restart;
-  ASSERT_TRUE(
-      audio_candidates_caller->at(0)->ToString(&caller_candidate_post_restart));
-  std::string callee_candidate_post_restart;
-  ASSERT_TRUE(
-      audio_candidates_callee->at(0)->ToString(&callee_candidate_post_restart));
-  desc = caller()->pc()->local_description()->description();
-  std::string caller_ufrag_post_restart =
-      desc->transport_infos()[0].description.ice_ufrag;
-  desc = callee()->pc()->local_description()->description();
-  std::string callee_ufrag_post_restart =
-      desc->transport_infos()[0].description.ice_ufrag;
-  // Sanity check that an ICE restart was actually negotiated in SDP.
-  ASSERT_NE(caller_candidate_pre_restart, caller_candidate_post_restart);
-  ASSERT_NE(callee_candidate_pre_restart, callee_candidate_post_restart);
-  ASSERT_NE(caller_ufrag_pre_restart, caller_ufrag_post_restart);
-  ASSERT_NE(callee_ufrag_pre_restart, callee_ufrag_post_restart);
-
-  // Ensure that additional frames are received after the ICE restart.
-  ExpectNewFramesReceivedWithWait(
-      kDefaultExpectedAudioFrameCount, kDefaultExpectedVideoFrameCount,
-      kDefaultExpectedAudioFrameCount, kDefaultExpectedVideoFrameCount,
-      kMaxWaitForFramesMs);
-}
-
-// Verify that audio/video can be received end-to-end when ICE renomination is
-// enabled.
-TEST_F(PeerConnectionIntegrationTest, EndToEndCallWithIceRenomination) {
-  PeerConnectionInterface::RTCConfiguration config;
-  config.enable_ice_renomination = true;
-  ASSERT_TRUE(CreatePeerConnectionWrappersWithConfig(config, config));
-  ConnectFakeSignaling();
-  // Do normal offer/answer and wait for some frames to be received in each
-  // direction.
-  caller()->AddAudioVideoMediaStream();
-  callee()->AddAudioVideoMediaStream();
-  caller()->CreateAndSetAndSignalOffer();
-  ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
-  // Sanity check that ICE renomination was actually negotiated.
-  const cricket::SessionDescription* desc =
-      caller()->pc()->local_description()->description();
-  for (const cricket::TransportInfo& info : desc->transport_infos()) {
-    ASSERT_NE(
-        info.description.transport_options.end(),
-        std::find(info.description.transport_options.begin(),
-                  info.description.transport_options.end(), "renomination"));
-  }
-  desc = callee()->pc()->local_description()->description();
-  for (const cricket::TransportInfo& info : desc->transport_infos()) {
-    ASSERT_NE(
-        info.description.transport_options.end(),
-        std::find(info.description.transport_options.begin(),
-                  info.description.transport_options.end(), "renomination"));
-  }
-  ExpectNewFramesReceivedWithWait(
-      kDefaultExpectedAudioFrameCount, kDefaultExpectedVideoFrameCount,
-      kDefaultExpectedAudioFrameCount, kDefaultExpectedVideoFrameCount,
-      kMaxWaitForFramesMs);
-}
-
-// This test sets up a call between two parties with audio and video. It then
-// renegotiates setting the video m-line to "port 0", then later renegotiates
-// again, enabling video.
-TEST_F(PeerConnectionIntegrationTest,
-       VideoFlowsAfterMediaSectionIsRejectedAndRecycled) {
-  ASSERT_TRUE(CreatePeerConnectionWrappers());
-  ConnectFakeSignaling();
-
-  // Do initial negotiation, only sending media from the caller. Will result in
-  // video and audio recvonly "m=" sections.
-  caller()->AddAudioVideoMediaStream();
-  caller()->CreateAndSetAndSignalOffer();
-  ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
-
-  // Negotiate again, disabling the video "m=" section (the callee will set the
-  // port to 0 due to offer_to_receive_video = 0).
-  PeerConnectionInterface::RTCOfferAnswerOptions options;
-  options.offer_to_receive_video = 0;
-  callee()->SetOfferAnswerOptions(options);
-  caller()->CreateAndSetAndSignalOffer();
-  ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
-  // Sanity check that video "m=" section was actually rejected.
-  const ContentInfo* answer_video_content = cricket::GetFirstVideoContent(
-      callee()->pc()->local_description()->description());
-  ASSERT_NE(nullptr, answer_video_content);
-  ASSERT_TRUE(answer_video_content->rejected);
-
-  // Enable video and do negotiation again, making sure video is received
-  // end-to-end, also adding media stream to callee.
-  options.offer_to_receive_video = 1;
-  callee()->SetOfferAnswerOptions(options);
-  callee()->AddAudioVideoMediaStream();
-  caller()->CreateAndSetAndSignalOffer();
-  ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
-  // Verify the caller receives frames from the newly added stream, and the
-  // callee receives additional frames from the re-enabled video m= section.
-  ExpectNewFramesReceivedWithWait(
-      kDefaultExpectedAudioFrameCount, kDefaultExpectedVideoFrameCount,
-      kDefaultExpectedAudioFrameCount, kDefaultExpectedVideoFrameCount,
-      kMaxWaitForFramesMs);
-}
-
-// This test sets up a Jsep call between two parties with external
-// VideoDecoderFactory.
-// TODO(holmer): Disabled due to sometimes crashing on buildbots.
-// See issue webrtc/2378.
-TEST_F(PeerConnectionIntegrationTest,
-       DISABLED_EndToEndCallWithVideoDecoderFactory) {
-  ASSERT_TRUE(CreatePeerConnectionWrappers());
-  EnableVideoDecoderFactory();
-  ConnectFakeSignaling();
-  caller()->AddAudioVideoMediaStream();
-  callee()->AddAudioVideoMediaStream();
-  caller()->CreateAndSetAndSignalOffer();
-  ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
-  ExpectNewFramesReceivedWithWait(
-      kDefaultExpectedAudioFrameCount, kDefaultExpectedVideoFrameCount,
-      kDefaultExpectedAudioFrameCount, kDefaultExpectedVideoFrameCount,
-      kMaxWaitForFramesMs);
-}
-
-// This tests that if we negotiate after calling CreateSender but before we
-// have a track, then set a track later, frames from the newly-set track are
-// received end-to-end.
-// TODO(deadbeef): Change this test to use AddTransceiver, once that's
-// implemented.
-TEST_F(PeerConnectionIntegrationTest,
-       MediaFlowsAfterEarlyWarmupWithCreateSender) {
-  ASSERT_TRUE(CreatePeerConnectionWrappers());
-  ConnectFakeSignaling();
-  auto caller_audio_sender =
-      caller()->pc()->CreateSender("audio", "caller_stream");
-  auto caller_video_sender =
-      caller()->pc()->CreateSender("video", "caller_stream");
-  auto callee_audio_sender =
-      callee()->pc()->CreateSender("audio", "callee_stream");
-  auto callee_video_sender =
-      callee()->pc()->CreateSender("video", "callee_stream");
-  caller()->CreateAndSetAndSignalOffer();
-  ASSERT_TRUE_WAIT(SignalingStateStable(), kMaxWaitForActivationMs);
-  // Wait for ICE to complete, without any tracks being set.
-  EXPECT_EQ_WAIT(webrtc::PeerConnectionInterface::kIceConnectionCompleted,
-                 caller()->ice_connection_state(), kMaxWaitForFramesMs);
-  EXPECT_EQ_WAIT(webrtc::PeerConnectionInterface::kIceConnectionConnected,
-                 callee()->ice_connection_state(), kMaxWaitForFramesMs);
-  // Now set the tracks, and expect frames to immediately start flowing.
-  EXPECT_TRUE(caller_audio_sender->SetTrack(caller()->CreateLocalAudioTrack()));
-  EXPECT_TRUE(caller_video_sender->SetTrack(caller()->CreateLocalVideoTrack()));
-  EXPECT_TRUE(callee_audio_sender->SetTrack(callee()->CreateLocalAudioTrack()));
-  EXPECT_TRUE(callee_video_sender->SetTrack(callee()->CreateLocalVideoTrack()));
-  ExpectNewFramesReceivedWithWait(
-      kDefaultExpectedAudioFrameCount, kDefaultExpectedVideoFrameCount,
-      kDefaultExpectedAudioFrameCount, kDefaultExpectedVideoFrameCount,
-      kMaxWaitForFramesMs);
-}
-
-// This test verifies that a remote video track can be added via AddStream,
-// and sent end-to-end. For this particular test, it's simply echoed back
-// from the caller to the callee, rather than being forwarded to a third
-// PeerConnection.
-TEST_F(PeerConnectionIntegrationTest, CanSendRemoteVideoTrack) {
-  ASSERT_TRUE(CreatePeerConnectionWrappers());
-  ConnectFakeSignaling();
-  // Just send a video track from the caller.
-  caller()->AddMediaStreamFromTracks(nullptr,
-                                     caller()->CreateLocalVideoTrack());
-  caller()->CreateAndSetAndSignalOffer();
-  ASSERT_TRUE_WAIT(SignalingStateStable(), kMaxWaitForActivationMs);
-  ASSERT_EQ(1, callee()->remote_streams()->count());
-
-  // Echo the stream back, and do a new offer/anwer (initiated by callee this
-  // time).
-  callee()->pc()->AddStream(callee()->remote_streams()->at(0));
-  callee()->CreateAndSetAndSignalOffer();
-  ASSERT_TRUE_WAIT(SignalingStateStable(), kMaxWaitForActivationMs);
-
-  int expected_caller_received_video_frames = kDefaultExpectedVideoFrameCount;
-  ExpectNewFramesReceivedWithWait(0, expected_caller_received_video_frames, 0,
-                                  0, kMaxWaitForFramesMs);
-}
-
-// Test that we achieve the expected end-to-end connection time, using a
-// fake clock and simulated latency on the media and signaling paths.
-// We use a TURN<->TURN connection because this is usually the quickest to
-// set up initially, especially when we're confident the connection will work
-// and can start sending media before we get a STUN response.
-//
-// With various optimizations enabled, here are the network delays we expect to
-// be on the critical path:
-// 1. 2 signaling trips: Signaling offer and offerer's TURN candidate, then
-//                       signaling answer (with DTLS fingerprint).
-// 2. 9 media hops: Rest of the DTLS handshake. 3 hops in each direction when
-//                  using TURN<->TURN pair, and DTLS exchange is 4 packets,
-//                  the first of which should have arrived before the answer.
-TEST_F(PeerConnectionIntegrationTest, EndToEndConnectionTimeWithTurnTurnPair) {
-  rtc::ScopedFakeClock fake_clock;
-  // Some things use a time of "0" as a special value, so we need to start out
-  // the fake clock at a nonzero time.
-  // TODO(deadbeef): Fix this.
-  fake_clock.AdvanceTime(rtc::TimeDelta::FromSeconds(1));
-
-  static constexpr int media_hop_delay_ms = 50;
-  static constexpr int signaling_trip_delay_ms = 500;
-  // For explanation of these values, see comment above.
-  static constexpr int required_media_hops = 9;
-  static constexpr int required_signaling_trips = 2;
-  // For internal delays (such as posting an event asychronously).
-  static constexpr int allowed_internal_delay_ms = 20;
-  static constexpr int total_connection_time_ms =
-      media_hop_delay_ms * required_media_hops +
-      signaling_trip_delay_ms * required_signaling_trips +
-      allowed_internal_delay_ms;
-
-  static const rtc::SocketAddress turn_server_1_internal_address{"88.88.88.0",
-                                                                 3478};
-  static const rtc::SocketAddress turn_server_1_external_address{"88.88.88.1",
-                                                                 0};
-  static const rtc::SocketAddress turn_server_2_internal_address{"99.99.99.0",
-                                                                 3478};
-  static const rtc::SocketAddress turn_server_2_external_address{"99.99.99.1",
-                                                                 0};
-  cricket::TestTurnServer turn_server_1(network_thread(),
-                                        turn_server_1_internal_address,
-                                        turn_server_1_external_address);
-  cricket::TestTurnServer turn_server_2(network_thread(),
-                                        turn_server_2_internal_address,
-                                        turn_server_2_external_address);
-  // Bypass permission check on received packets so media can be sent before
-  // the candidate is signaled.
-  turn_server_1.set_enable_permission_checks(false);
-  turn_server_2.set_enable_permission_checks(false);
-
-  PeerConnectionInterface::RTCConfiguration client_1_config;
-  webrtc::PeerConnectionInterface::IceServer ice_server_1;
-  ice_server_1.urls.push_back("turn:88.88.88.0:3478");
-  ice_server_1.username = "test";
-  ice_server_1.password = "test";
-  client_1_config.servers.push_back(ice_server_1);
-  client_1_config.type = webrtc::PeerConnectionInterface::kRelay;
-  client_1_config.presume_writable_when_fully_relayed = true;
-
-  PeerConnectionInterface::RTCConfiguration client_2_config;
-  webrtc::PeerConnectionInterface::IceServer ice_server_2;
-  ice_server_2.urls.push_back("turn:99.99.99.0:3478");
-  ice_server_2.username = "test";
-  ice_server_2.password = "test";
-  client_2_config.servers.push_back(ice_server_2);
-  client_2_config.type = webrtc::PeerConnectionInterface::kRelay;
-  client_2_config.presume_writable_when_fully_relayed = true;
-
-  ASSERT_TRUE(
-      CreatePeerConnectionWrappersWithConfig(client_1_config, client_2_config));
-  // Set up the simulated delays.
-  SetSignalingDelayMs(signaling_trip_delay_ms);
-  ConnectFakeSignaling();
-  virtual_socket_server()->set_delay_mean(media_hop_delay_ms);
-  virtual_socket_server()->UpdateDelayDistribution();
-
-  // Set "offer to receive audio/video" without adding any tracks, so we just
-  // set up ICE/DTLS with no media.
-  PeerConnectionInterface::RTCOfferAnswerOptions options;
-  options.offer_to_receive_audio = 1;
-  options.offer_to_receive_video = 1;
-  caller()->SetOfferAnswerOptions(options);
-  caller()->CreateAndSetAndSignalOffer();
-  EXPECT_TRUE_SIMULATED_WAIT(DtlsConnected(), total_connection_time_ms,
-                             fake_clock);
-  // Need to free the clients here since they're using things we created on
-  // the stack.
-  delete SetCallerPcWrapperAndReturnCurrent(nullptr);
-  delete SetCalleePcWrapperAndReturnCurrent(nullptr);
-}
-
-// Test that audio and video flow end-to-end when codec names don't use the
-// expected casing, given that they're supposed to be case insensitive. To test
-// this, all but one codec is removed from each media description, and its
-// casing is changed.
-//
-// In the past, this has regressed and caused crashes/black video, due to the
-// fact that code at some layers was doing case-insensitive comparisons and
-// code at other layers was not.
-TEST_F(PeerConnectionIntegrationTest, CodecNamesAreCaseInsensitive) {
-  ASSERT_TRUE(CreatePeerConnectionWrappers());
-  ConnectFakeSignaling();
-  caller()->AddAudioVideoMediaStream();
-  callee()->AddAudioVideoMediaStream();
-
-  // Remove all but one audio/video codec (opus and VP8), and change the
-  // casing of the caller's generated offer.
-  caller()->SetGeneratedSdpMunger([](cricket::SessionDescription* description) {
-    cricket::AudioContentDescription* audio =
-        GetFirstAudioContentDescription(description);
-    ASSERT_NE(nullptr, audio);
-    auto audio_codecs = audio->codecs();
-    audio_codecs.erase(std::remove_if(audio_codecs.begin(), audio_codecs.end(),
-                                      [](const cricket::AudioCodec& codec) {
-                                        return codec.name != "opus";
-                                      }),
-                       audio_codecs.end());
-    ASSERT_EQ(1u, audio_codecs.size());
-    audio_codecs[0].name = "OpUs";
-    audio->set_codecs(audio_codecs);
-
-    cricket::VideoContentDescription* video =
-        GetFirstVideoContentDescription(description);
-    ASSERT_NE(nullptr, video);
-    auto video_codecs = video->codecs();
-    video_codecs.erase(std::remove_if(video_codecs.begin(), video_codecs.end(),
-                                      [](const cricket::VideoCodec& codec) {
-                                        return codec.name != "VP8";
-                                      }),
-                       video_codecs.end());
-    ASSERT_EQ(1u, video_codecs.size());
-    video_codecs[0].name = "vP8";
-    video->set_codecs(video_codecs);
-  });
-
-  caller()->CreateAndSetAndSignalOffer();
-  ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
-
-  // Verify frames are still received end-to-end.
-  ExpectNewFramesReceivedWithWait(
-      kDefaultExpectedAudioFrameCount, kDefaultExpectedVideoFrameCount,
-      kDefaultExpectedAudioFrameCount, kDefaultExpectedVideoFrameCount,
-      kMaxWaitForFramesMs);
-}
-
-TEST_F(PeerConnectionIntegrationTest, GetSources) {
-  ASSERT_TRUE(CreatePeerConnectionWrappers());
-  ConnectFakeSignaling();
-  caller()->AddAudioOnlyMediaStream();
-  caller()->CreateAndSetAndSignalOffer();
-  ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
-  // Wait for one audio frame to be received by the callee.
-  ExpectNewFramesReceivedWithWait(0, 0, 1, 0, kMaxWaitForFramesMs);
-  ASSERT_GT(callee()->pc()->GetReceivers().size(), 0u);
-  auto receiver = callee()->pc()->GetReceivers()[0];
-  ASSERT_EQ(receiver->media_type(), cricket::MEDIA_TYPE_AUDIO);
-
-  auto contributing_sources = receiver->GetSources();
-  ASSERT_GT(receiver->GetParameters().encodings.size(), 0u);
-  EXPECT_EQ(receiver->GetParameters().encodings[0].ssrc,
-            contributing_sources[0].source_id());
-}
-
-// Test that if a track is removed and added again with a different stream ID,
-// the new stream ID is successfully communicated in SDP and media continues to
-// flow end-to-end.
-TEST_F(PeerConnectionIntegrationTest, RemoveAndAddTrackWithNewStreamId) {
-  ASSERT_TRUE(CreatePeerConnectionWrappers());
-  ConnectFakeSignaling();
-
-  rtc::scoped_refptr<MediaStreamInterface> stream_1 =
-      caller()->pc_factory()->CreateLocalMediaStream("stream_1");
-  rtc::scoped_refptr<MediaStreamInterface> stream_2 =
-      caller()->pc_factory()->CreateLocalMediaStream("stream_2");
-
-  // Add track using stream 1, do offer/answer.
-  rtc::scoped_refptr<webrtc::AudioTrackInterface> track =
-      caller()->CreateLocalAudioTrack();
-  rtc::scoped_refptr<webrtc::RtpSenderInterface> sender =
-      caller()->pc()->AddTrack(track, {stream_1.get()});
-  caller()->CreateAndSetAndSignalOffer();
-  ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
-  // Wait for one audio frame to be received by the callee.
-  ExpectNewFramesReceivedWithWait(0, 0, 1, 0, kMaxWaitForFramesMs);
-
-  // Remove the sender, and create a new one with the new stream.
-  caller()->pc()->RemoveTrack(sender);
-  sender = caller()->pc()->AddTrack(track, {stream_2.get()});
-  caller()->CreateAndSetAndSignalOffer();
-  ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
-  // Wait for additional audio frames to be received by the callee.
-  ExpectNewFramesReceivedWithWait(0, 0, kDefaultExpectedAudioFrameCount, 0,
-                                  kMaxWaitForFramesMs);
-}
-
-}  // namespace
-
-#endif  // if !defined(THREAD_SANITIZER)
diff --git a/pc/peerconnectionendtoend_unittest.cc b/pc/peerconnectionendtoend_unittest.cc
deleted file mode 100644
index f7cd91f..0000000
--- a/pc/peerconnectionendtoend_unittest.cc
+++ /dev/null
@@ -1,549 +0,0 @@
-/*
- *  Copyright 2013 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 <memory>
-
-#include "webrtc/api/audio_codecs/builtin_audio_decoder_factory.h"
-#include "webrtc/api/audio_codecs/builtin_audio_encoder_factory.h"
-#include "webrtc/rtc_base/gunit.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/ptr_util.h"
-#include "webrtc/rtc_base/ssladapter.h"
-#include "webrtc/rtc_base/sslstreamadapter.h"
-#include "webrtc/rtc_base/stringencode.h"
-#include "webrtc/rtc_base/stringutils.h"
-#include "webrtc/rtc_base/thread.h"
-#ifdef WEBRTC_ANDROID
-#include "webrtc/pc/test/androidtestinitializer.h"
-#endif
-#include "webrtc/pc/test/peerconnectiontestwrapper.h"
-// Notice that mockpeerconnectionobservers.h must be included after the above!
-#include "webrtc/pc/test/mockpeerconnectionobservers.h"
-#include "webrtc/test/mock_audio_decoder.h"
-#include "webrtc/test/mock_audio_decoder_factory.h"
-
-using testing::AtLeast;
-using testing::Invoke;
-using testing::StrictMock;
-using testing::_;
-
-using webrtc::DataChannelInterface;
-using webrtc::FakeConstraints;
-using webrtc::MediaConstraintsInterface;
-using webrtc::MediaStreamInterface;
-using webrtc::PeerConnectionInterface;
-
-namespace {
-
-const int kMaxWait = 10000;
-
-}  // namespace
-
-class PeerConnectionEndToEndTest
-    : public sigslot::has_slots<>,
-      public testing::Test {
- public:
-  typedef std::vector<rtc::scoped_refptr<DataChannelInterface> >
-      DataChannelList;
-
-  PeerConnectionEndToEndTest() {
-    network_thread_ = rtc::Thread::CreateWithSocketServer();
-    worker_thread_ = rtc::Thread::Create();
-    RTC_CHECK(network_thread_->Start());
-    RTC_CHECK(worker_thread_->Start());
-    caller_ = new rtc::RefCountedObject<PeerConnectionTestWrapper>(
-        "caller", network_thread_.get(), worker_thread_.get());
-    callee_ = new rtc::RefCountedObject<PeerConnectionTestWrapper>(
-        "callee", network_thread_.get(), worker_thread_.get());
-    webrtc::PeerConnectionInterface::IceServer ice_server;
-    ice_server.uri = "stun:stun.l.google.com:19302";
-    config_.servers.push_back(ice_server);
-
-#ifdef WEBRTC_ANDROID
-    webrtc::InitializeAndroidObjects();
-#endif
-  }
-
-  void CreatePcs(
-      const MediaConstraintsInterface* pc_constraints,
-      rtc::scoped_refptr<webrtc::AudioEncoderFactory> audio_encoder_factory,
-      rtc::scoped_refptr<webrtc::AudioDecoderFactory> audio_decoder_factory) {
-    EXPECT_TRUE(caller_->CreatePc(
-        pc_constraints, config_, audio_encoder_factory, audio_decoder_factory));
-    EXPECT_TRUE(callee_->CreatePc(
-        pc_constraints, config_, audio_encoder_factory, audio_decoder_factory));
-    PeerConnectionTestWrapper::Connect(caller_.get(), callee_.get());
-
-    caller_->SignalOnDataChannel.connect(
-        this, &PeerConnectionEndToEndTest::OnCallerAddedDataChanel);
-    callee_->SignalOnDataChannel.connect(
-        this, &PeerConnectionEndToEndTest::OnCalleeAddedDataChannel);
-  }
-
-  void GetAndAddUserMedia() {
-    FakeConstraints audio_constraints;
-    FakeConstraints video_constraints;
-    GetAndAddUserMedia(true, audio_constraints, true, video_constraints);
-  }
-
-  void GetAndAddUserMedia(bool audio, FakeConstraints audio_constraints,
-                          bool video, FakeConstraints video_constraints) {
-    caller_->GetAndAddUserMedia(audio, audio_constraints,
-                                video, video_constraints);
-    callee_->GetAndAddUserMedia(audio, audio_constraints,
-                                video, video_constraints);
-  }
-
-  void Negotiate() {
-    caller_->CreateOffer(NULL);
-  }
-
-  void WaitForCallEstablished() {
-    caller_->WaitForCallEstablished();
-    callee_->WaitForCallEstablished();
-  }
-
-  void WaitForConnection() {
-    caller_->WaitForConnection();
-    callee_->WaitForConnection();
-  }
-
-  void OnCallerAddedDataChanel(DataChannelInterface* dc) {
-    caller_signaled_data_channels_.push_back(dc);
-  }
-
-  void OnCalleeAddedDataChannel(DataChannelInterface* dc) {
-    callee_signaled_data_channels_.push_back(dc);
-  }
-
-  // Tests that |dc1| and |dc2| can send to and receive from each other.
-  void TestDataChannelSendAndReceive(
-      DataChannelInterface* dc1, DataChannelInterface* dc2) {
-    std::unique_ptr<webrtc::MockDataChannelObserver> dc1_observer(
-        new webrtc::MockDataChannelObserver(dc1));
-
-    std::unique_ptr<webrtc::MockDataChannelObserver> dc2_observer(
-        new webrtc::MockDataChannelObserver(dc2));
-
-    static const std::string kDummyData = "abcdefg";
-    webrtc::DataBuffer buffer(kDummyData);
-    EXPECT_TRUE(dc1->Send(buffer));
-    EXPECT_EQ_WAIT(kDummyData, dc2_observer->last_message(), kMaxWait);
-
-    EXPECT_TRUE(dc2->Send(buffer));
-    EXPECT_EQ_WAIT(kDummyData, dc1_observer->last_message(), kMaxWait);
-
-    EXPECT_EQ(1U, dc1_observer->received_message_count());
-    EXPECT_EQ(1U, dc2_observer->received_message_count());
-  }
-
-  void WaitForDataChannelsToOpen(DataChannelInterface* local_dc,
-                                 const DataChannelList& remote_dc_list,
-                                 size_t remote_dc_index) {
-    EXPECT_EQ_WAIT(DataChannelInterface::kOpen, local_dc->state(), kMaxWait);
-
-    EXPECT_TRUE_WAIT(remote_dc_list.size() > remote_dc_index, kMaxWait);
-    EXPECT_EQ_WAIT(DataChannelInterface::kOpen,
-                   remote_dc_list[remote_dc_index]->state(),
-                   kMaxWait);
-    EXPECT_EQ(local_dc->id(), remote_dc_list[remote_dc_index]->id());
-  }
-
-  void CloseDataChannels(DataChannelInterface* local_dc,
-                         const DataChannelList& remote_dc_list,
-                         size_t remote_dc_index) {
-    local_dc->Close();
-    EXPECT_EQ_WAIT(DataChannelInterface::kClosed, local_dc->state(), kMaxWait);
-    EXPECT_EQ_WAIT(DataChannelInterface::kClosed,
-                   remote_dc_list[remote_dc_index]->state(),
-                   kMaxWait);
-  }
-
- protected:
-  std::unique_ptr<rtc::Thread> network_thread_;
-  std::unique_ptr<rtc::Thread> worker_thread_;
-  rtc::scoped_refptr<PeerConnectionTestWrapper> caller_;
-  rtc::scoped_refptr<PeerConnectionTestWrapper> callee_;
-  DataChannelList caller_signaled_data_channels_;
-  DataChannelList callee_signaled_data_channels_;
-  webrtc::PeerConnectionInterface::RTCConfiguration config_;
-};
-
-std::unique_ptr<webrtc::AudioDecoder> CreateForwardingMockDecoder(
-    std::unique_ptr<webrtc::AudioDecoder> real_decoder) {
-  class ForwardingMockDecoder : public StrictMock<webrtc::MockAudioDecoder> {
-   public:
-    ForwardingMockDecoder(std::unique_ptr<AudioDecoder> decoder)
-        : decoder_(std::move(decoder)) {}
-
-   private:
-    std::unique_ptr<AudioDecoder> decoder_;
-  };
-
-  const auto dec = real_decoder.get();  // For lambda capturing.
-  auto mock_decoder =
-      rtc::MakeUnique<ForwardingMockDecoder>(std::move(real_decoder));
-  EXPECT_CALL(*mock_decoder, Channels())
-      .Times(AtLeast(1))
-      .WillRepeatedly(Invoke([dec] { return dec->Channels(); }));
-  EXPECT_CALL(*mock_decoder, DecodeInternal(_, _, _, _, _))
-      .Times(AtLeast(1))
-      .WillRepeatedly(
-          Invoke([dec](const uint8_t* encoded, size_t encoded_len,
-                       int sample_rate_hz, int16_t* decoded,
-                       webrtc::AudioDecoder::SpeechType* speech_type) {
-            return dec->Decode(encoded, encoded_len, sample_rate_hz,
-                               std::numeric_limits<size_t>::max(), decoded,
-                               speech_type);
-          }));
-  EXPECT_CALL(*mock_decoder, Die());
-  EXPECT_CALL(*mock_decoder, HasDecodePlc()).WillRepeatedly(Invoke([dec] {
-    return dec->HasDecodePlc();
-  }));
-  EXPECT_CALL(*mock_decoder, IncomingPacket(_, _, _, _, _))
-      .Times(AtLeast(1))
-      .WillRepeatedly(Invoke([dec](const uint8_t* payload, size_t payload_len,
-                                   uint16_t rtp_sequence_number,
-                                   uint32_t rtp_timestamp,
-                                   uint32_t arrival_timestamp) {
-        return dec->IncomingPacket(payload, payload_len, rtp_sequence_number,
-                                   rtp_timestamp, arrival_timestamp);
-      }));
-  EXPECT_CALL(*mock_decoder, PacketDuration(_, _))
-      .Times(AtLeast(1))
-      .WillRepeatedly(Invoke([dec](const uint8_t* encoded, size_t encoded_len) {
-        return dec->PacketDuration(encoded, encoded_len);
-      }));
-  EXPECT_CALL(*mock_decoder, SampleRateHz())
-      .Times(AtLeast(1))
-      .WillRepeatedly(Invoke([dec] { return dec->SampleRateHz(); }));
-
-  return std::move(mock_decoder);
-}
-
-rtc::scoped_refptr<webrtc::AudioDecoderFactory>
-CreateForwardingMockDecoderFactory(
-    webrtc::AudioDecoderFactory* real_decoder_factory) {
-  rtc::scoped_refptr<webrtc::MockAudioDecoderFactory> mock_decoder_factory =
-      new rtc::RefCountedObject<StrictMock<webrtc::MockAudioDecoderFactory>>;
-  EXPECT_CALL(*mock_decoder_factory, GetSupportedDecoders())
-      .Times(AtLeast(1))
-      .WillRepeatedly(Invoke([real_decoder_factory] {
-        return real_decoder_factory->GetSupportedDecoders();
-      }));
-  EXPECT_CALL(*mock_decoder_factory, IsSupportedDecoder(_))
-      .Times(AtLeast(1))
-      .WillRepeatedly(
-          Invoke([real_decoder_factory](const webrtc::SdpAudioFormat& format) {
-            return real_decoder_factory->IsSupportedDecoder(format);
-          }));
-  EXPECT_CALL(*mock_decoder_factory, MakeAudioDecoderMock(_, _))
-      .Times(AtLeast(2))
-      .WillRepeatedly(
-          Invoke([real_decoder_factory](
-                     const webrtc::SdpAudioFormat& format,
-                     std::unique_ptr<webrtc::AudioDecoder>* return_value) {
-            auto real_decoder = real_decoder_factory->MakeAudioDecoder(format);
-            *return_value =
-                real_decoder
-                    ? CreateForwardingMockDecoder(std::move(real_decoder))
-                    : nullptr;
-          }));
-  return mock_decoder_factory;
-}
-
-// Disabled for TSan v2, see
-// https://bugs.chromium.org/p/webrtc/issues/detail?id=4719 for details.
-// Disabled for Mac, see
-// https://bugs.chromium.org/p/webrtc/issues/detail?id=5231 for details.
-#if !defined(THREAD_SANITIZER) && !defined(WEBRTC_MAC)
-TEST_F(PeerConnectionEndToEndTest, Call) {
-  rtc::scoped_refptr<webrtc::AudioDecoderFactory> real_decoder_factory =
-      webrtc::CreateBuiltinAudioDecoderFactory();
-  CreatePcs(nullptr, webrtc::CreateBuiltinAudioEncoderFactory(),
-            CreateForwardingMockDecoderFactory(real_decoder_factory.get()));
-  GetAndAddUserMedia();
-  Negotiate();
-  WaitForCallEstablished();
-}
-#endif // if !defined(THREAD_SANITIZER) && !defined(WEBRTC_MAC)
-
-#if !defined(ADDRESS_SANITIZER)
-TEST_F(PeerConnectionEndToEndTest, CallWithLegacySdp) {
-  FakeConstraints pc_constraints;
-  pc_constraints.AddMandatory(MediaConstraintsInterface::kEnableDtlsSrtp,
-                              false);
-  CreatePcs(&pc_constraints, webrtc::CreateBuiltinAudioEncoderFactory(),
-            webrtc::CreateBuiltinAudioDecoderFactory());
-  GetAndAddUserMedia();
-  Negotiate();
-  WaitForCallEstablished();
-}
-#endif  // !defined(ADDRESS_SANITIZER)
-
-#ifdef HAVE_SCTP
-// Verifies that a DataChannel created before the negotiation can transition to
-// "OPEN" and transfer data.
-TEST_F(PeerConnectionEndToEndTest, CreateDataChannelBeforeNegotiate) {
-  CreatePcs(nullptr, webrtc::CreateBuiltinAudioEncoderFactory(),
-            webrtc::MockAudioDecoderFactory::CreateEmptyFactory());
-
-  webrtc::DataChannelInit init;
-  rtc::scoped_refptr<DataChannelInterface> caller_dc(
-      caller_->CreateDataChannel("data", init));
-  rtc::scoped_refptr<DataChannelInterface> callee_dc(
-      callee_->CreateDataChannel("data", init));
-
-  Negotiate();
-  WaitForConnection();
-
-  WaitForDataChannelsToOpen(caller_dc, callee_signaled_data_channels_, 0);
-  WaitForDataChannelsToOpen(callee_dc, caller_signaled_data_channels_, 0);
-
-  TestDataChannelSendAndReceive(caller_dc, callee_signaled_data_channels_[0]);
-  TestDataChannelSendAndReceive(callee_dc, caller_signaled_data_channels_[0]);
-
-  CloseDataChannels(caller_dc, callee_signaled_data_channels_, 0);
-  CloseDataChannels(callee_dc, caller_signaled_data_channels_, 0);
-}
-
-// Verifies that a DataChannel created after the negotiation can transition to
-// "OPEN" and transfer data.
-TEST_F(PeerConnectionEndToEndTest, CreateDataChannelAfterNegotiate) {
-  CreatePcs(nullptr, webrtc::CreateBuiltinAudioEncoderFactory(),
-            webrtc::MockAudioDecoderFactory::CreateEmptyFactory());
-
-  webrtc::DataChannelInit init;
-
-  // This DataChannel is for creating the data content in the negotiation.
-  rtc::scoped_refptr<DataChannelInterface> dummy(
-      caller_->CreateDataChannel("data", init));
-  Negotiate();
-  WaitForConnection();
-
-  // Wait for the data channel created pre-negotiation to be opened.
-  WaitForDataChannelsToOpen(dummy, callee_signaled_data_channels_, 0);
-
-  // Create new DataChannels after the negotiation and verify their states.
-  rtc::scoped_refptr<DataChannelInterface> caller_dc(
-      caller_->CreateDataChannel("hello", init));
-  rtc::scoped_refptr<DataChannelInterface> callee_dc(
-      callee_->CreateDataChannel("hello", init));
-
-  WaitForDataChannelsToOpen(caller_dc, callee_signaled_data_channels_, 1);
-  WaitForDataChannelsToOpen(callee_dc, caller_signaled_data_channels_, 0);
-
-  TestDataChannelSendAndReceive(caller_dc, callee_signaled_data_channels_[1]);
-  TestDataChannelSendAndReceive(callee_dc, caller_signaled_data_channels_[0]);
-
-  CloseDataChannels(caller_dc, callee_signaled_data_channels_, 1);
-  CloseDataChannels(callee_dc, caller_signaled_data_channels_, 0);
-}
-
-// Verifies that DataChannel IDs are even/odd based on the DTLS roles.
-TEST_F(PeerConnectionEndToEndTest, DataChannelIdAssignment) {
-  CreatePcs(nullptr, webrtc::CreateBuiltinAudioEncoderFactory(),
-            webrtc::MockAudioDecoderFactory::CreateEmptyFactory());
-
-  webrtc::DataChannelInit init;
-  rtc::scoped_refptr<DataChannelInterface> caller_dc_1(
-      caller_->CreateDataChannel("data", init));
-  rtc::scoped_refptr<DataChannelInterface> callee_dc_1(
-      callee_->CreateDataChannel("data", init));
-
-  Negotiate();
-  WaitForConnection();
-
-  EXPECT_EQ(1U, caller_dc_1->id() % 2);
-  EXPECT_EQ(0U, callee_dc_1->id() % 2);
-
-  rtc::scoped_refptr<DataChannelInterface> caller_dc_2(
-      caller_->CreateDataChannel("data", init));
-  rtc::scoped_refptr<DataChannelInterface> callee_dc_2(
-      callee_->CreateDataChannel("data", init));
-
-  EXPECT_EQ(1U, caller_dc_2->id() % 2);
-  EXPECT_EQ(0U, callee_dc_2->id() % 2);
-}
-
-// Verifies that the message is received by the right remote DataChannel when
-// there are multiple DataChannels.
-TEST_F(PeerConnectionEndToEndTest,
-       MessageTransferBetweenTwoPairsOfDataChannels) {
-  CreatePcs(nullptr, webrtc::CreateBuiltinAudioEncoderFactory(),
-            webrtc::MockAudioDecoderFactory::CreateEmptyFactory());
-
-  webrtc::DataChannelInit init;
-
-  rtc::scoped_refptr<DataChannelInterface> caller_dc_1(
-      caller_->CreateDataChannel("data", init));
-  rtc::scoped_refptr<DataChannelInterface> caller_dc_2(
-      caller_->CreateDataChannel("data", init));
-
-  Negotiate();
-  WaitForConnection();
-  WaitForDataChannelsToOpen(caller_dc_1, callee_signaled_data_channels_, 0);
-  WaitForDataChannelsToOpen(caller_dc_2, callee_signaled_data_channels_, 1);
-
-  std::unique_ptr<webrtc::MockDataChannelObserver> dc_1_observer(
-      new webrtc::MockDataChannelObserver(callee_signaled_data_channels_[0]));
-
-  std::unique_ptr<webrtc::MockDataChannelObserver> dc_2_observer(
-      new webrtc::MockDataChannelObserver(callee_signaled_data_channels_[1]));
-
-  const std::string message_1 = "hello 1";
-  const std::string message_2 = "hello 2";
-
-  caller_dc_1->Send(webrtc::DataBuffer(message_1));
-  EXPECT_EQ_WAIT(message_1, dc_1_observer->last_message(), kMaxWait);
-
-  caller_dc_2->Send(webrtc::DataBuffer(message_2));
-  EXPECT_EQ_WAIT(message_2, dc_2_observer->last_message(), kMaxWait);
-
-  EXPECT_EQ(1U, dc_1_observer->received_message_count());
-  EXPECT_EQ(1U, dc_2_observer->received_message_count());
-}
-#endif  // HAVE_SCTP
-
-#ifdef HAVE_QUIC
-// Test that QUIC data channels can be used and that messages go to the correct
-// remote data channel when both peers want to use QUIC. It is assumed that the
-// application has externally negotiated the data channel parameters.
-TEST_F(PeerConnectionEndToEndTest, MessageTransferBetweenQuicDataChannels) {
-  config_.enable_quic = true;
-  CreatePcs();
-
-  webrtc::DataChannelInit init_1;
-  init_1.id = 0;
-  init_1.ordered = false;
-  init_1.reliable = true;
-
-  webrtc::DataChannelInit init_2;
-  init_2.id = 1;
-  init_2.ordered = false;
-  init_2.reliable = true;
-
-  rtc::scoped_refptr<DataChannelInterface> caller_dc_1(
-      caller_->CreateDataChannel("data", init_1));
-  ASSERT_NE(nullptr, caller_dc_1);
-  rtc::scoped_refptr<DataChannelInterface> caller_dc_2(
-      caller_->CreateDataChannel("data", init_2));
-  ASSERT_NE(nullptr, caller_dc_2);
-  rtc::scoped_refptr<DataChannelInterface> callee_dc_1(
-      callee_->CreateDataChannel("data", init_1));
-  ASSERT_NE(nullptr, callee_dc_1);
-  rtc::scoped_refptr<DataChannelInterface> callee_dc_2(
-      callee_->CreateDataChannel("data", init_2));
-  ASSERT_NE(nullptr, callee_dc_2);
-
-  Negotiate();
-  WaitForConnection();
-  EXPECT_TRUE_WAIT(caller_dc_1->state() == webrtc::DataChannelInterface::kOpen,
-                   kMaxWait);
-  EXPECT_TRUE_WAIT(callee_dc_1->state() == webrtc::DataChannelInterface::kOpen,
-                   kMaxWait);
-  EXPECT_TRUE_WAIT(caller_dc_2->state() == webrtc::DataChannelInterface::kOpen,
-                   kMaxWait);
-  EXPECT_TRUE_WAIT(callee_dc_2->state() == webrtc::DataChannelInterface::kOpen,
-                   kMaxWait);
-
-  std::unique_ptr<webrtc::MockDataChannelObserver> dc_1_observer(
-      new webrtc::MockDataChannelObserver(callee_dc_1.get()));
-
-  std::unique_ptr<webrtc::MockDataChannelObserver> dc_2_observer(
-      new webrtc::MockDataChannelObserver(callee_dc_2.get()));
-
-  const std::string message_1 = "hello 1";
-  const std::string message_2 = "hello 2";
-
-  // Send data from caller to callee.
-  caller_dc_1->Send(webrtc::DataBuffer(message_1));
-  EXPECT_EQ_WAIT(message_1, dc_1_observer->last_message(), kMaxWait);
-
-  caller_dc_2->Send(webrtc::DataBuffer(message_2));
-  EXPECT_EQ_WAIT(message_2, dc_2_observer->last_message(), kMaxWait);
-
-  EXPECT_EQ(1U, dc_1_observer->received_message_count());
-  EXPECT_EQ(1U, dc_2_observer->received_message_count());
-
-  // Send data from callee to caller.
-  dc_1_observer.reset(new webrtc::MockDataChannelObserver(caller_dc_1.get()));
-  dc_2_observer.reset(new webrtc::MockDataChannelObserver(caller_dc_2.get()));
-
-  callee_dc_1->Send(webrtc::DataBuffer(message_1));
-  EXPECT_EQ_WAIT(message_1, dc_1_observer->last_message(), kMaxWait);
-
-  callee_dc_2->Send(webrtc::DataBuffer(message_2));
-  EXPECT_EQ_WAIT(message_2, dc_2_observer->last_message(), kMaxWait);
-
-  EXPECT_EQ(1U, dc_1_observer->received_message_count());
-  EXPECT_EQ(1U, dc_2_observer->received_message_count());
-}
-#endif  // HAVE_QUIC
-
-#ifdef HAVE_SCTP
-// Verifies that a DataChannel added from an OPEN message functions after
-// a channel has been previously closed (webrtc issue 3778).
-// This previously failed because the new channel re-uses the ID of the closed
-// channel, and the closed channel was incorrectly still assigned to the id.
-// TODO(deadbeef): This is disabled because there's currently a race condition
-// caused by the fact that a data channel signals that it's closed before it
-// really is. Re-enable this test once that's fixed.
-// See: https://bugs.chromium.org/p/webrtc/issues/detail?id=4453
-TEST_F(PeerConnectionEndToEndTest,
-       DISABLED_DataChannelFromOpenWorksAfterClose) {
-  CreatePcs(nullptr, webrtc::CreateBuiltinAudioEncoderFactory(),
-            webrtc::MockAudioDecoderFactory::CreateEmptyFactory());
-
-  webrtc::DataChannelInit init;
-  rtc::scoped_refptr<DataChannelInterface> caller_dc(
-      caller_->CreateDataChannel("data", init));
-
-  Negotiate();
-  WaitForConnection();
-
-  WaitForDataChannelsToOpen(caller_dc, callee_signaled_data_channels_, 0);
-  CloseDataChannels(caller_dc, callee_signaled_data_channels_, 0);
-
-  // Create a new channel and ensure it works after closing the previous one.
-  caller_dc = caller_->CreateDataChannel("data2", init);
-
-  WaitForDataChannelsToOpen(caller_dc, callee_signaled_data_channels_, 1);
-  TestDataChannelSendAndReceive(caller_dc, callee_signaled_data_channels_[1]);
-
-  CloseDataChannels(caller_dc, callee_signaled_data_channels_, 1);
-}
-
-// This tests that if a data channel is closed remotely while not referenced
-// by the application (meaning only the PeerConnection contributes to its
-// reference count), no memory access violation will occur.
-// See: https://code.google.com/p/chromium/issues/detail?id=565048
-TEST_F(PeerConnectionEndToEndTest, CloseDataChannelRemotelyWhileNotReferenced) {
-  CreatePcs(nullptr, webrtc::CreateBuiltinAudioEncoderFactory(),
-            webrtc::MockAudioDecoderFactory::CreateEmptyFactory());
-
-  webrtc::DataChannelInit init;
-  rtc::scoped_refptr<DataChannelInterface> caller_dc(
-      caller_->CreateDataChannel("data", init));
-
-  Negotiate();
-  WaitForConnection();
-
-  WaitForDataChannelsToOpen(caller_dc, callee_signaled_data_channels_, 0);
-  // This removes the reference to the remote data channel that we hold.
-  callee_signaled_data_channels_.clear();
-  caller_dc->Close();
-  EXPECT_EQ_WAIT(DataChannelInterface::kClosed, caller_dc->state(), kMaxWait);
-
-  // Wait for a bit longer so the remote data channel will receive the
-  // close message and be destroyed.
-  rtc::Thread::Current()->ProcessMessages(100);
-}
-#endif  // HAVE_SCTP
diff --git a/pc/peerconnectionfactory.cc b/pc/peerconnectionfactory.cc
deleted file mode 100644
index 2ff95f7..0000000
--- a/pc/peerconnectionfactory.cc
+++ /dev/null
@@ -1,361 +0,0 @@
-/*
- *  Copyright 2004 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/pc/peerconnectionfactory.h"
-
-#include <utility>
-
-#include "webrtc/api/mediaconstraintsinterface.h"
-#include "webrtc/api/mediastreamproxy.h"
-#include "webrtc/api/mediastreamtrackproxy.h"
-#include "webrtc/api/peerconnectionfactoryproxy.h"
-#include "webrtc/api/peerconnectionproxy.h"
-#include "webrtc/api/videosourceproxy.h"
-#include "webrtc/logging/rtc_event_log/rtc_event_log.h"
-#include "webrtc/rtc_base/bind.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/ptr_util.h"
-// Adding 'nogncheck' to disable the gn include headers check to support modular
-// WebRTC build targets.
-// TODO(zhihuang): This wouldn't be necessary if the interface and
-// implementation of the media engine were in separate build targets.
-#include "webrtc/media/engine/webrtcmediaengine.h"             // nogncheck
-#include "webrtc/media/engine/webrtcvideodecoderfactory.h"     // nogncheck
-#include "webrtc/media/engine/webrtcvideoencoderfactory.h"     // nogncheck
-#include "webrtc/modules/audio_device/include/audio_device.h"  // nogncheck
-#include "webrtc/p2p/base/basicpacketsocketfactory.h"
-#include "webrtc/p2p/client/basicportallocator.h"
-#include "webrtc/pc/audiotrack.h"
-#include "webrtc/pc/localaudiosource.h"
-#include "webrtc/pc/mediastream.h"
-#include "webrtc/pc/peerconnection.h"
-#include "webrtc/pc/videocapturertracksource.h"
-#include "webrtc/pc/videotrack.h"
-
-namespace webrtc {
-
-rtc::scoped_refptr<PeerConnectionFactoryInterface>
-CreateModularPeerConnectionFactory(
-    rtc::Thread* network_thread,
-    rtc::Thread* worker_thread,
-    rtc::Thread* signaling_thread,
-    AudioDeviceModule* default_adm,
-    rtc::scoped_refptr<AudioEncoderFactory> audio_encoder_factory,
-    rtc::scoped_refptr<AudioDecoderFactory> audio_decoder_factory,
-    cricket::WebRtcVideoEncoderFactory* video_encoder_factory,
-    cricket::WebRtcVideoDecoderFactory* video_decoder_factory,
-    rtc::scoped_refptr<AudioMixer> audio_mixer,
-    std::unique_ptr<cricket::MediaEngineInterface> media_engine,
-    std::unique_ptr<CallFactoryInterface> call_factory,
-    std::unique_ptr<RtcEventLogFactoryInterface> event_log_factory) {
-  rtc::scoped_refptr<PeerConnectionFactory> pc_factory(
-      new rtc::RefCountedObject<PeerConnectionFactory>(
-          network_thread, worker_thread, signaling_thread, default_adm,
-          audio_encoder_factory, audio_decoder_factory, video_encoder_factory,
-          video_decoder_factory, audio_mixer, std::move(media_engine),
-          std::move(call_factory), std::move(event_log_factory)));
-
-  // Call Initialize synchronously but make sure it is executed on
-  // |signaling_thread|.
-  MethodCall0<PeerConnectionFactory, bool> call(
-      pc_factory.get(), &PeerConnectionFactory::Initialize);
-  bool result = call.Marshal(RTC_FROM_HERE, pc_factory->signaling_thread());
-
-  if (!result) {
-    return nullptr;
-  }
-  return PeerConnectionFactoryProxy::Create(pc_factory->signaling_thread(),
-                                            pc_factory);
-}
-
-PeerConnectionFactory::PeerConnectionFactory(
-    rtc::Thread* network_thread,
-    rtc::Thread* worker_thread,
-    rtc::Thread* signaling_thread,
-    AudioDeviceModule* default_adm,
-    rtc::scoped_refptr<webrtc::AudioEncoderFactory> audio_encoder_factory,
-    rtc::scoped_refptr<webrtc::AudioDecoderFactory> audio_decoder_factory,
-    cricket::WebRtcVideoEncoderFactory* video_encoder_factory,
-    cricket::WebRtcVideoDecoderFactory* video_decoder_factory,
-    rtc::scoped_refptr<AudioMixer> audio_mixer,
-    std::unique_ptr<cricket::MediaEngineInterface> media_engine,
-    std::unique_ptr<webrtc::CallFactoryInterface> call_factory,
-    std::unique_ptr<RtcEventLogFactoryInterface> event_log_factory)
-    : wraps_current_thread_(false),
-      network_thread_(network_thread),
-      worker_thread_(worker_thread),
-      signaling_thread_(signaling_thread),
-      default_adm_(default_adm),
-      audio_encoder_factory_(audio_encoder_factory),
-      audio_decoder_factory_(audio_decoder_factory),
-      video_encoder_factory_(video_encoder_factory),
-      video_decoder_factory_(video_decoder_factory),
-      external_audio_mixer_(audio_mixer),
-      media_engine_(std::move(media_engine)),
-      call_factory_(std::move(call_factory)),
-      event_log_factory_(std::move(event_log_factory)) {
-  if (!network_thread_) {
-    owned_network_thread_ = rtc::Thread::CreateWithSocketServer();
-    owned_network_thread_->Start();
-    network_thread_ = owned_network_thread_.get();
-  }
-
-  if (!worker_thread_) {
-    owned_worker_thread_ = rtc::Thread::Create();
-    owned_worker_thread_->Start();
-    worker_thread_ = owned_worker_thread_.get();
-  }
-
-  if (!signaling_thread_) {
-    signaling_thread_ = rtc::Thread::Current();
-    if (!signaling_thread_) {
-      // If this thread isn't already wrapped by an rtc::Thread, create a
-      // wrapper and own it in this class.
-      signaling_thread_ = rtc::ThreadManager::Instance()->WrapCurrentThread();
-      wraps_current_thread_ = true;
-    }
-  }
-
-  // TODO: Currently there is no way creating an external adm in
-  // libjingle source tree. So we can 't currently assert if this is NULL.
-  // RTC_DCHECK(default_adm != NULL);
-}
-
-PeerConnectionFactory::~PeerConnectionFactory() {
-  RTC_DCHECK(signaling_thread_->IsCurrent());
-  channel_manager_.reset(nullptr);
-
-  // Make sure |worker_thread_| and |signaling_thread_| outlive
-  // |default_socket_factory_| and |default_network_manager_|.
-  default_socket_factory_ = nullptr;
-  default_network_manager_ = nullptr;
-
-  if (wraps_current_thread_)
-    rtc::ThreadManager::Instance()->UnwrapCurrentThread();
-}
-
-bool PeerConnectionFactory::Initialize() {
-  RTC_DCHECK(signaling_thread_->IsCurrent());
-  rtc::InitRandom(rtc::Time32());
-
-  default_network_manager_.reset(new rtc::BasicNetworkManager());
-  if (!default_network_manager_) {
-    return false;
-  }
-
-  default_socket_factory_.reset(
-      new rtc::BasicPacketSocketFactory(network_thread_));
-  if (!default_socket_factory_) {
-    return false;
-  }
-
-  channel_manager_.reset(new cricket::ChannelManager(
-      std::move(media_engine_), worker_thread_, network_thread_));
-
-  channel_manager_->SetVideoRtxEnabled(true);
-  if (!channel_manager_->Init()) {
-    return false;
-  }
-
-  return true;
-}
-
-void PeerConnectionFactory::SetOptions(const Options& options) {
-  options_ = options;
-}
-
-rtc::scoped_refptr<AudioSourceInterface>
-PeerConnectionFactory::CreateAudioSource(
-    const MediaConstraintsInterface* constraints) {
-  RTC_DCHECK(signaling_thread_->IsCurrent());
-  rtc::scoped_refptr<LocalAudioSource> source(
-      LocalAudioSource::Create(constraints));
-  return source;
-}
-
-rtc::scoped_refptr<AudioSourceInterface>
-PeerConnectionFactory::CreateAudioSource(const cricket::AudioOptions& options) {
-  RTC_DCHECK(signaling_thread_->IsCurrent());
-  rtc::scoped_refptr<LocalAudioSource> source(
-      LocalAudioSource::Create(&options));
-  return source;
-}
-
-rtc::scoped_refptr<VideoTrackSourceInterface>
-PeerConnectionFactory::CreateVideoSource(
-    std::unique_ptr<cricket::VideoCapturer> capturer,
-    const MediaConstraintsInterface* constraints) {
-  RTC_DCHECK(signaling_thread_->IsCurrent());
-  rtc::scoped_refptr<VideoTrackSourceInterface> source(
-      VideoCapturerTrackSource::Create(worker_thread_, std::move(capturer),
-                                       constraints, false));
-  return VideoTrackSourceProxy::Create(signaling_thread_, worker_thread_,
-                                       source);
-}
-
-rtc::scoped_refptr<VideoTrackSourceInterface>
-PeerConnectionFactory::CreateVideoSource(
-    std::unique_ptr<cricket::VideoCapturer> capturer) {
-  RTC_DCHECK(signaling_thread_->IsCurrent());
-  rtc::scoped_refptr<VideoTrackSourceInterface> source(
-      VideoCapturerTrackSource::Create(worker_thread_, std::move(capturer),
-                                       false));
-  return VideoTrackSourceProxy::Create(signaling_thread_, worker_thread_,
-                                       source);
-}
-
-bool PeerConnectionFactory::StartAecDump(rtc::PlatformFile file,
-                                         int64_t max_size_bytes) {
-  RTC_DCHECK(signaling_thread_->IsCurrent());
-  return channel_manager_->StartAecDump(file, max_size_bytes);
-}
-
-void PeerConnectionFactory::StopAecDump() {
-  RTC_DCHECK(signaling_thread_->IsCurrent());
-  channel_manager_->StopAecDump();
-}
-
-rtc::scoped_refptr<PeerConnectionInterface>
-PeerConnectionFactory::CreatePeerConnection(
-    const PeerConnectionInterface::RTCConfiguration& configuration_in,
-    const MediaConstraintsInterface* constraints,
-    std::unique_ptr<cricket::PortAllocator> allocator,
-    std::unique_ptr<rtc::RTCCertificateGeneratorInterface> cert_generator,
-    PeerConnectionObserver* observer) {
-  RTC_DCHECK(signaling_thread_->IsCurrent());
-
-  // We merge constraints and configuration into a single configuration.
-  PeerConnectionInterface::RTCConfiguration configuration = configuration_in;
-  CopyConstraintsIntoRtcConfiguration(constraints, &configuration);
-
-  return CreatePeerConnection(configuration, std::move(allocator),
-                              std::move(cert_generator), observer);
-}
-
-rtc::scoped_refptr<PeerConnectionInterface>
-PeerConnectionFactory::CreatePeerConnection(
-    const PeerConnectionInterface::RTCConfiguration& configuration,
-    std::unique_ptr<cricket::PortAllocator> allocator,
-    std::unique_ptr<rtc::RTCCertificateGeneratorInterface> cert_generator,
-    PeerConnectionObserver* observer) {
-  RTC_DCHECK(signaling_thread_->IsCurrent());
-
-  if (!cert_generator.get()) {
-    // No certificate generator specified, use the default one.
-    cert_generator.reset(
-        new rtc::RTCCertificateGenerator(signaling_thread_, network_thread_));
-  }
-
-  if (!allocator) {
-    allocator.reset(new cricket::BasicPortAllocator(
-        default_network_manager_.get(), default_socket_factory_.get()));
-  }
-  network_thread_->Invoke<void>(
-      RTC_FROM_HERE, rtc::Bind(&cricket::PortAllocator::SetNetworkIgnoreMask,
-                               allocator.get(), options_.network_ignore_mask));
-
-  std::unique_ptr<RtcEventLog> event_log =
-      worker_thread_->Invoke<std::unique_ptr<RtcEventLog>>(
-          RTC_FROM_HERE,
-          rtc::Bind(&PeerConnectionFactory::CreateRtcEventLog_w, this));
-
-  std::unique_ptr<Call> call = worker_thread_->Invoke<std::unique_ptr<Call>>(
-      RTC_FROM_HERE,
-      rtc::Bind(&PeerConnectionFactory::CreateCall_w, this, event_log.get()));
-
-  rtc::scoped_refptr<PeerConnection> pc(
-      new rtc::RefCountedObject<PeerConnection>(this, std::move(event_log),
-                                                std::move(call)));
-
-  if (!pc->Initialize(configuration, std::move(allocator),
-                      std::move(cert_generator), observer)) {
-    return nullptr;
-  }
-  return PeerConnectionProxy::Create(signaling_thread(), pc);
-}
-
-rtc::scoped_refptr<MediaStreamInterface>
-PeerConnectionFactory::CreateLocalMediaStream(const std::string& label) {
-  RTC_DCHECK(signaling_thread_->IsCurrent());
-  return MediaStreamProxy::Create(signaling_thread_,
-                                  MediaStream::Create(label));
-}
-
-rtc::scoped_refptr<VideoTrackInterface> PeerConnectionFactory::CreateVideoTrack(
-    const std::string& id,
-    VideoTrackSourceInterface* source) {
-  RTC_DCHECK(signaling_thread_->IsCurrent());
-  rtc::scoped_refptr<VideoTrackInterface> track(
-      VideoTrack::Create(id, source, worker_thread_));
-  return VideoTrackProxy::Create(signaling_thread_, worker_thread_, track);
-}
-
-rtc::scoped_refptr<AudioTrackInterface>
-PeerConnectionFactory::CreateAudioTrack(const std::string& id,
-                                        AudioSourceInterface* source) {
-  RTC_DCHECK(signaling_thread_->IsCurrent());
-  rtc::scoped_refptr<AudioTrackInterface> track(AudioTrack::Create(id, source));
-  return AudioTrackProxy::Create(signaling_thread_, track);
-}
-
-cricket::TransportController* PeerConnectionFactory::CreateTransportController(
-    cricket::PortAllocator* port_allocator,
-    bool redetermine_role_on_ice_restart) {
-  RTC_DCHECK(signaling_thread_->IsCurrent());
-  return new cricket::TransportController(
-      signaling_thread_, network_thread_, port_allocator,
-      redetermine_role_on_ice_restart, options_.crypto_options);
-}
-
-cricket::ChannelManager* PeerConnectionFactory::channel_manager() {
-  return channel_manager_.get();
-}
-
-rtc::Thread* PeerConnectionFactory::signaling_thread() {
-  // This method can be called on a different thread when the factory is
-  // created in CreatePeerConnectionFactory().
-  return signaling_thread_;
-}
-
-rtc::Thread* PeerConnectionFactory::worker_thread() {
-  return worker_thread_;
-}
-
-rtc::Thread* PeerConnectionFactory::network_thread() {
-  return network_thread_;
-}
-
-std::unique_ptr<RtcEventLog> PeerConnectionFactory::CreateRtcEventLog_w() {
-  RTC_DCHECK_RUN_ON(worker_thread_);
-  return event_log_factory_ ? event_log_factory_->CreateRtcEventLog()
-                            : rtc::MakeUnique<RtcEventLogNullImpl>();
-}
-
-std::unique_ptr<Call> PeerConnectionFactory::CreateCall_w(
-    RtcEventLog* event_log) {
-  RTC_DCHECK_RUN_ON(worker_thread_);
-
-  const int kMinBandwidthBps = 30000;
-  const int kStartBandwidthBps = 300000;
-  const int kMaxBandwidthBps = 2000000;
-
-  webrtc::Call::Config call_config(event_log);
-  if (!channel_manager_->media_engine() || !call_factory_) {
-    return nullptr;
-  }
-  call_config.audio_state = channel_manager_->media_engine()->GetAudioState();
-  call_config.bitrate_config.min_bitrate_bps = kMinBandwidthBps;
-  call_config.bitrate_config.start_bitrate_bps = kStartBandwidthBps;
-  call_config.bitrate_config.max_bitrate_bps = kMaxBandwidthBps;
-
-  return std::unique_ptr<Call>(call_factory_->CreateCall(call_config));
-}
-
-}  // namespace webrtc
diff --git a/pc/peerconnectionfactory.h b/pc/peerconnectionfactory.h
deleted file mode 100644
index 82440e7..0000000
--- a/pc/peerconnectionfactory.h
+++ /dev/null
@@ -1,157 +0,0 @@
-/*
- *  Copyright 2011 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_PC_PEERCONNECTIONFACTORY_H_
-#define WEBRTC_PC_PEERCONNECTIONFACTORY_H_
-
-#include <memory>
-#include <string>
-
-#include "webrtc/api/mediastreaminterface.h"
-#include "webrtc/api/peerconnectioninterface.h"
-#include "webrtc/pc/channelmanager.h"
-#include "webrtc/rtc_base/rtccertificategenerator.h"
-#include "webrtc/rtc_base/scoped_ref_ptr.h"
-#include "webrtc/rtc_base/thread.h"
-
-namespace rtc {
-class BasicNetworkManager;
-class BasicPacketSocketFactory;
-}
-
-namespace webrtc {
-
-class RtcEventLog;
-
-class PeerConnectionFactory : public PeerConnectionFactoryInterface {
- public:
-  // Use the overloads of CreateVideoSource that take raw VideoCapturer
-  // pointers from PeerConnectionFactoryInterface.
-  // TODO(deadbeef): Remove this using statement once those overloads are
-  // removed.
-  using PeerConnectionFactoryInterface::CreateVideoSource;
-
-  void SetOptions(const Options& options) override;
-
-  // Deprecated, use version without constraints.
-  rtc::scoped_refptr<PeerConnectionInterface> CreatePeerConnection(
-      const PeerConnectionInterface::RTCConfiguration& configuration,
-      const MediaConstraintsInterface* constraints,
-      std::unique_ptr<cricket::PortAllocator> allocator,
-      std::unique_ptr<rtc::RTCCertificateGeneratorInterface> cert_generator,
-      PeerConnectionObserver* observer) override;
-
-  virtual rtc::scoped_refptr<PeerConnectionInterface> CreatePeerConnection(
-      const PeerConnectionInterface::RTCConfiguration& configuration,
-      std::unique_ptr<cricket::PortAllocator> allocator,
-      std::unique_ptr<rtc::RTCCertificateGeneratorInterface> cert_generator,
-      PeerConnectionObserver* observer) override;
-
-  bool Initialize();
-
-  rtc::scoped_refptr<MediaStreamInterface>
-      CreateLocalMediaStream(const std::string& label) override;
-
-  virtual rtc::scoped_refptr<AudioSourceInterface> CreateAudioSource(
-      const cricket::AudioOptions& options) override;
-  // Deprecated, use version without constraints.
-  rtc::scoped_refptr<AudioSourceInterface> CreateAudioSource(
-      const MediaConstraintsInterface* constraints) override;
-
-  virtual rtc::scoped_refptr<VideoTrackSourceInterface> CreateVideoSource(
-      std::unique_ptr<cricket::VideoCapturer> capturer) override;
-  // This version supports filtering on width, height and frame rate.
-  // For the "constraints=null" case, use the version without constraints.
-  // TODO(hta): Design a version without MediaConstraintsInterface.
-  // https://bugs.chromium.org/p/webrtc/issues/detail?id=5617
-  rtc::scoped_refptr<VideoTrackSourceInterface> CreateVideoSource(
-      std::unique_ptr<cricket::VideoCapturer> capturer,
-      const MediaConstraintsInterface* constraints) override;
-
-  rtc::scoped_refptr<VideoTrackInterface> CreateVideoTrack(
-      const std::string& id,
-      VideoTrackSourceInterface* video_source) override;
-
-  rtc::scoped_refptr<AudioTrackInterface>
-      CreateAudioTrack(const std::string& id,
-                       AudioSourceInterface* audio_source) override;
-
-  bool StartAecDump(rtc::PlatformFile file, int64_t max_size_bytes) override;
-  void StopAecDump() override;
-  // TODO(ivoc) Remove after Chrome is updated.
-  bool StartRtcEventLog(rtc::PlatformFile file) override { return false; }
-  // TODO(ivoc) Remove after Chrome is updated.
-  bool StartRtcEventLog(rtc::PlatformFile file,
-                        int64_t max_size_bytes) override {
-    return false;
-  }
-  // TODO(ivoc) Remove after Chrome is updated.
-  void StopRtcEventLog() override {}
-
-  virtual cricket::TransportController* CreateTransportController(
-      cricket::PortAllocator* port_allocator,
-      bool redetermine_role_on_ice_restart);
-  virtual cricket::ChannelManager* channel_manager();
-  virtual rtc::Thread* signaling_thread();
-  virtual rtc::Thread* worker_thread();
-  virtual rtc::Thread* network_thread();
-  const Options& options() const { return options_; }
-
- protected:
-  PeerConnectionFactory(
-      rtc::Thread* network_thread,
-      rtc::Thread* worker_thread,
-      rtc::Thread* signaling_thread,
-      AudioDeviceModule* default_adm,
-      rtc::scoped_refptr<webrtc::AudioEncoderFactory> audio_encoder_factory,
-      rtc::scoped_refptr<webrtc::AudioDecoderFactory> audio_decoder_factory,
-      cricket::WebRtcVideoEncoderFactory* video_encoder_factory,
-      cricket::WebRtcVideoDecoderFactory* video_decoder_factory,
-      rtc::scoped_refptr<AudioMixer> audio_mixer,
-      std::unique_ptr<cricket::MediaEngineInterface> media_engine,
-      std::unique_ptr<webrtc::CallFactoryInterface> call_factory,
-      std::unique_ptr<RtcEventLogFactoryInterface> event_log_factory);
-  virtual ~PeerConnectionFactory();
-
- private:
-  std::unique_ptr<RtcEventLog> CreateRtcEventLog_w();
-  std::unique_ptr<Call> CreateCall_w(RtcEventLog* event_log);
-
-  bool wraps_current_thread_;
-  rtc::Thread* network_thread_;
-  rtc::Thread* worker_thread_;
-  rtc::Thread* signaling_thread_;
-  std::unique_ptr<rtc::Thread> owned_network_thread_;
-  std::unique_ptr<rtc::Thread> owned_worker_thread_;
-  Options options_;
-  // External Audio device used for audio playback.
-  rtc::scoped_refptr<AudioDeviceModule> default_adm_;
-  rtc::scoped_refptr<AudioEncoderFactory> audio_encoder_factory_;
-  rtc::scoped_refptr<AudioDecoderFactory> audio_decoder_factory_;
-  std::unique_ptr<cricket::ChannelManager> channel_manager_;
-  // External Video encoder factory. This can be NULL if the client has not
-  // injected any. In that case, video engine will use the internal SW encoder.
-  std::unique_ptr<cricket::WebRtcVideoEncoderFactory> video_encoder_factory_;
-  // External Video decoder factory. This can be NULL if the client has not
-  // injected any. In that case, video engine will use the internal SW decoder.
-  std::unique_ptr<cricket::WebRtcVideoDecoderFactory> video_decoder_factory_;
-  std::unique_ptr<rtc::BasicNetworkManager> default_network_manager_;
-  std::unique_ptr<rtc::BasicPacketSocketFactory> default_socket_factory_;
-  // External audio mixer. This can be NULL. In that case, internal audio mixer
-  // will be created and used.
-  rtc::scoped_refptr<AudioMixer> external_audio_mixer_;
-  std::unique_ptr<cricket::MediaEngineInterface> media_engine_;
-  std::unique_ptr<webrtc::CallFactoryInterface> call_factory_;
-  std::unique_ptr<RtcEventLogFactoryInterface> event_log_factory_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_PC_PEERCONNECTIONFACTORY_H_
diff --git a/pc/peerconnectionfactory_unittest.cc b/pc/peerconnectionfactory_unittest.cc
deleted file mode 100644
index cbabc25..0000000
--- a/pc/peerconnectionfactory_unittest.cc
+++ /dev/null
@@ -1,357 +0,0 @@
-/*
- *  Copyright 2012 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 <memory>
-#include <string>
-#include <utility>
-
-#include "webrtc/api/mediastreaminterface.h"
-#include "webrtc/media/base/fakevideocapturer.h"
-#include "webrtc/media/engine/webrtccommon.h"
-#include "webrtc/media/engine/webrtcvoe.h"
-#include "webrtc/p2p/base/fakeportallocator.h"
-#include "webrtc/pc/peerconnectionfactory.h"
-#include "webrtc/rtc_base/gunit.h"
-#include "webrtc/rtc_base/thread.h"
-#ifdef WEBRTC_ANDROID
-#include "webrtc/pc/test/androidtestinitializer.h"
-#endif
-#include "webrtc/pc/test/fakertccertificategenerator.h"
-#include "webrtc/pc/test/fakevideotrackrenderer.h"
-
-using webrtc::DataChannelInterface;
-using webrtc::FakeVideoTrackRenderer;
-using webrtc::MediaStreamInterface;
-using webrtc::PeerConnectionFactoryInterface;
-using webrtc::PeerConnectionInterface;
-using webrtc::PeerConnectionObserver;
-using webrtc::VideoTrackSourceInterface;
-using webrtc::VideoTrackInterface;
-
-namespace {
-
-static const char kStunIceServer[] = "stun:stun.l.google.com:19302";
-static const char kTurnIceServer[] = "turn:test%40hello.com@test.com:1234";
-static const char kTurnIceServerWithTransport[] =
-    "turn:test@hello.com?transport=tcp";
-static const char kSecureTurnIceServer[] =
-    "turns:test@hello.com?transport=tcp";
-static const char kSecureTurnIceServerWithoutTransportParam[] =
-    "turns:test_no_transport@hello.com:443";
-static const char kSecureTurnIceServerWithoutTransportAndPortParam[] =
-    "turns:test_no_transport@hello.com";
-static const char kTurnIceServerWithNoUsernameInUri[] =
-    "turn:test.com:1234";
-static const char kTurnPassword[] = "turnpassword";
-static const int kDefaultStunPort = 3478;
-static const int kDefaultStunTlsPort = 5349;
-static const char kTurnUsername[] = "test";
-static const char kStunIceServerWithIPv4Address[] = "stun:1.2.3.4:1234";
-static const char kStunIceServerWithIPv4AddressWithoutPort[] = "stun:1.2.3.4";
-static const char kStunIceServerWithIPv6Address[] = "stun:[2401:fa00:4::]:1234";
-static const char kStunIceServerWithIPv6AddressWithoutPort[] =
-    "stun:[2401:fa00:4::]";
-static const char kTurnIceServerWithIPv6Address[] =
-    "turn:test@[2401:fa00:4::]:1234";
-
-class NullPeerConnectionObserver : public PeerConnectionObserver {
- public:
-  virtual ~NullPeerConnectionObserver() = default;
-  void OnSignalingChange(
-      PeerConnectionInterface::SignalingState new_state) override {}
-  void OnAddStream(rtc::scoped_refptr<MediaStreamInterface> stream) override {}
-  void OnRemoveStream(
-      rtc::scoped_refptr<MediaStreamInterface> stream) override {}
-  void OnDataChannel(
-      rtc::scoped_refptr<DataChannelInterface> data_channel) override {}
-  void OnRenegotiationNeeded() override {}
-  void OnIceConnectionChange(
-      PeerConnectionInterface::IceConnectionState new_state) override {}
-  void OnIceGatheringChange(
-      PeerConnectionInterface::IceGatheringState new_state) override {}
-  void OnIceCandidate(
-      const webrtc::IceCandidateInterface* candidate) override {}
-};
-
-}  // namespace
-
-class PeerConnectionFactoryTest : public testing::Test {
-  void SetUp() {
-#ifdef WEBRTC_ANDROID
-    webrtc::InitializeAndroidObjects();
-#endif
-    factory_ = webrtc::CreatePeerConnectionFactory(
-        rtc::Thread::Current(), rtc::Thread::Current(), rtc::Thread::Current(),
-        nullptr, nullptr, nullptr);
-
-    ASSERT_TRUE(factory_.get() != NULL);
-    port_allocator_.reset(
-        new cricket::FakePortAllocator(rtc::Thread::Current(), nullptr));
-    raw_port_allocator_ = port_allocator_.get();
-  }
-
- protected:
-  void VerifyStunServers(cricket::ServerAddresses stun_servers) {
-    EXPECT_EQ(stun_servers, raw_port_allocator_->stun_servers());
-  }
-
-  void VerifyTurnServers(std::vector<cricket::RelayServerConfig> turn_servers) {
-    EXPECT_EQ(turn_servers.size(), raw_port_allocator_->turn_servers().size());
-    for (size_t i = 0; i < turn_servers.size(); ++i) {
-      ASSERT_EQ(1u, turn_servers[i].ports.size());
-      EXPECT_EQ(1u, raw_port_allocator_->turn_servers()[i].ports.size());
-      EXPECT_EQ(
-          turn_servers[i].ports[0].address.ToString(),
-          raw_port_allocator_->turn_servers()[i].ports[0].address.ToString());
-      EXPECT_EQ(turn_servers[i].ports[0].proto,
-                raw_port_allocator_->turn_servers()[i].ports[0].proto);
-      EXPECT_EQ(turn_servers[i].credentials.username,
-                raw_port_allocator_->turn_servers()[i].credentials.username);
-      EXPECT_EQ(turn_servers[i].credentials.password,
-                raw_port_allocator_->turn_servers()[i].credentials.password);
-    }
-  }
-
-  rtc::scoped_refptr<PeerConnectionFactoryInterface> factory_;
-  NullPeerConnectionObserver observer_;
-  std::unique_ptr<cricket::FakePortAllocator> port_allocator_;
-  // Since the PC owns the port allocator after it's been initialized,
-  // this should only be used when known to be safe.
-  cricket::FakePortAllocator* raw_port_allocator_;
-};
-
-// Verify creation of PeerConnection using internal ADM, video factory and
-// internal libjingle threads.
-TEST(PeerConnectionFactoryTestInternal, CreatePCUsingInternalModules) {
-#ifdef WEBRTC_ANDROID
-  webrtc::InitializeAndroidObjects();
-#endif
-
-  rtc::scoped_refptr<PeerConnectionFactoryInterface> factory(
-      webrtc::CreatePeerConnectionFactory());
-
-  NullPeerConnectionObserver observer;
-  webrtc::PeerConnectionInterface::RTCConfiguration config;
-
-  std::unique_ptr<FakeRTCCertificateGenerator> cert_generator(
-      new FakeRTCCertificateGenerator());
-  rtc::scoped_refptr<PeerConnectionInterface> pc(factory->CreatePeerConnection(
-      config, nullptr, nullptr, std::move(cert_generator), &observer));
-
-  EXPECT_TRUE(pc.get() != nullptr);
-}
-
-// This test verifies creation of PeerConnection with valid STUN and TURN
-// configuration. Also verifies the URL's parsed correctly as expected.
-TEST_F(PeerConnectionFactoryTest, CreatePCUsingIceServers) {
-  PeerConnectionInterface::RTCConfiguration config;
-  webrtc::PeerConnectionInterface::IceServer ice_server;
-  ice_server.uri = kStunIceServer;
-  config.servers.push_back(ice_server);
-  ice_server.uri = kTurnIceServer;
-  ice_server.password = kTurnPassword;
-  config.servers.push_back(ice_server);
-  ice_server.uri = kTurnIceServerWithTransport;
-  ice_server.password = kTurnPassword;
-  config.servers.push_back(ice_server);
-  std::unique_ptr<FakeRTCCertificateGenerator> cert_generator(
-      new FakeRTCCertificateGenerator());
-  rtc::scoped_refptr<PeerConnectionInterface> pc(factory_->CreatePeerConnection(
-      config, nullptr, std::move(port_allocator_), std::move(cert_generator),
-      &observer_));
-  ASSERT_TRUE(pc.get() != NULL);
-  cricket::ServerAddresses stun_servers;
-  rtc::SocketAddress stun1("stun.l.google.com", 19302);
-  stun_servers.insert(stun1);
-  VerifyStunServers(stun_servers);
-  std::vector<cricket::RelayServerConfig> turn_servers;
-  cricket::RelayServerConfig turn1("test.com", 1234, "test@hello.com",
-                                   kTurnPassword, cricket::PROTO_UDP);
-  turn_servers.push_back(turn1);
-  cricket::RelayServerConfig turn2("hello.com", kDefaultStunPort, "test",
-                                   kTurnPassword, cricket::PROTO_TCP);
-  turn_servers.push_back(turn2);
-  VerifyTurnServers(turn_servers);
-}
-
-// This test verifies creation of PeerConnection with valid STUN and TURN
-// configuration. Also verifies the list of URL's parsed correctly as expected.
-TEST_F(PeerConnectionFactoryTest, CreatePCUsingIceServersUrls) {
-  PeerConnectionInterface::RTCConfiguration config;
-  webrtc::PeerConnectionInterface::IceServer ice_server;
-  ice_server.urls.push_back(kStunIceServer);
-  ice_server.urls.push_back(kTurnIceServer);
-  ice_server.urls.push_back(kTurnIceServerWithTransport);
-  ice_server.password = kTurnPassword;
-  config.servers.push_back(ice_server);
-  std::unique_ptr<FakeRTCCertificateGenerator> cert_generator(
-      new FakeRTCCertificateGenerator());
-  rtc::scoped_refptr<PeerConnectionInterface> pc(factory_->CreatePeerConnection(
-      config, nullptr, std::move(port_allocator_), std::move(cert_generator),
-      &observer_));
-  ASSERT_TRUE(pc.get() != NULL);
-  cricket::ServerAddresses stun_servers;
-  rtc::SocketAddress stun1("stun.l.google.com", 19302);
-  stun_servers.insert(stun1);
-  VerifyStunServers(stun_servers);
-  std::vector<cricket::RelayServerConfig> turn_servers;
-  cricket::RelayServerConfig turn1("test.com", 1234, "test@hello.com",
-                                   kTurnPassword, cricket::PROTO_UDP);
-  turn_servers.push_back(turn1);
-  cricket::RelayServerConfig turn2("hello.com", kDefaultStunPort, "test",
-                                   kTurnPassword, cricket::PROTO_TCP);
-  turn_servers.push_back(turn2);
-  VerifyTurnServers(turn_servers);
-}
-
-TEST_F(PeerConnectionFactoryTest, CreatePCUsingNoUsernameInUri) {
-  PeerConnectionInterface::RTCConfiguration config;
-  webrtc::PeerConnectionInterface::IceServer ice_server;
-  ice_server.uri = kStunIceServer;
-  config.servers.push_back(ice_server);
-  ice_server.uri = kTurnIceServerWithNoUsernameInUri;
-  ice_server.username = kTurnUsername;
-  ice_server.password = kTurnPassword;
-  config.servers.push_back(ice_server);
-  std::unique_ptr<FakeRTCCertificateGenerator> cert_generator(
-      new FakeRTCCertificateGenerator());
-  rtc::scoped_refptr<PeerConnectionInterface> pc(factory_->CreatePeerConnection(
-      config, nullptr, std::move(port_allocator_), std::move(cert_generator),
-      &observer_));
-  ASSERT_TRUE(pc.get() != NULL);
-  std::vector<cricket::RelayServerConfig> turn_servers;
-  cricket::RelayServerConfig turn("test.com", 1234, kTurnUsername,
-                                  kTurnPassword, cricket::PROTO_UDP);
-  turn_servers.push_back(turn);
-  VerifyTurnServers(turn_servers);
-}
-
-// This test verifies the PeerConnection created properly with TURN url which
-// has transport parameter in it.
-TEST_F(PeerConnectionFactoryTest, CreatePCUsingTurnUrlWithTransportParam) {
-  PeerConnectionInterface::RTCConfiguration config;
-  webrtc::PeerConnectionInterface::IceServer ice_server;
-  ice_server.uri = kTurnIceServerWithTransport;
-  ice_server.password = kTurnPassword;
-  config.servers.push_back(ice_server);
-  std::unique_ptr<FakeRTCCertificateGenerator> cert_generator(
-      new FakeRTCCertificateGenerator());
-  rtc::scoped_refptr<PeerConnectionInterface> pc(factory_->CreatePeerConnection(
-      config, nullptr, std::move(port_allocator_), std::move(cert_generator),
-      &observer_));
-  ASSERT_TRUE(pc.get() != NULL);
-  std::vector<cricket::RelayServerConfig> turn_servers;
-  cricket::RelayServerConfig turn("hello.com", kDefaultStunPort, "test",
-                                  kTurnPassword, cricket::PROTO_TCP);
-  turn_servers.push_back(turn);
-  VerifyTurnServers(turn_servers);
-}
-
-TEST_F(PeerConnectionFactoryTest, CreatePCUsingSecureTurnUrl) {
-  PeerConnectionInterface::RTCConfiguration config;
-  webrtc::PeerConnectionInterface::IceServer ice_server;
-  ice_server.uri = kSecureTurnIceServer;
-  ice_server.password = kTurnPassword;
-  config.servers.push_back(ice_server);
-  ice_server.uri = kSecureTurnIceServerWithoutTransportParam;
-  ice_server.password = kTurnPassword;
-  config.servers.push_back(ice_server);
-  ice_server.uri = kSecureTurnIceServerWithoutTransportAndPortParam;
-  ice_server.password = kTurnPassword;
-  config.servers.push_back(ice_server);
-  std::unique_ptr<FakeRTCCertificateGenerator> cert_generator(
-      new FakeRTCCertificateGenerator());
-  rtc::scoped_refptr<PeerConnectionInterface> pc(factory_->CreatePeerConnection(
-      config, nullptr, std::move(port_allocator_), std::move(cert_generator),
-      &observer_));
-  ASSERT_TRUE(pc.get() != NULL);
-  std::vector<cricket::RelayServerConfig> turn_servers;
-  cricket::RelayServerConfig turn1("hello.com", kDefaultStunTlsPort, "test",
-                                   kTurnPassword, cricket::PROTO_TLS);
-  turn_servers.push_back(turn1);
-  // TURNS with transport param should be default to tcp.
-  cricket::RelayServerConfig turn2("hello.com", 443, "test_no_transport",
-                                   kTurnPassword, cricket::PROTO_TLS);
-  turn_servers.push_back(turn2);
-  cricket::RelayServerConfig turn3("hello.com", kDefaultStunTlsPort,
-                                   "test_no_transport", kTurnPassword,
-                                   cricket::PROTO_TLS);
-  turn_servers.push_back(turn3);
-  VerifyTurnServers(turn_servers);
-}
-
-TEST_F(PeerConnectionFactoryTest, CreatePCUsingIPLiteralAddress) {
-  PeerConnectionInterface::RTCConfiguration config;
-  webrtc::PeerConnectionInterface::IceServer ice_server;
-  ice_server.uri = kStunIceServerWithIPv4Address;
-  config.servers.push_back(ice_server);
-  ice_server.uri = kStunIceServerWithIPv4AddressWithoutPort;
-  config.servers.push_back(ice_server);
-  ice_server.uri = kStunIceServerWithIPv6Address;
-  config.servers.push_back(ice_server);
-  ice_server.uri = kStunIceServerWithIPv6AddressWithoutPort;
-  config.servers.push_back(ice_server);
-  ice_server.uri = kTurnIceServerWithIPv6Address;
-  ice_server.password = kTurnPassword;
-  config.servers.push_back(ice_server);
-  std::unique_ptr<FakeRTCCertificateGenerator> cert_generator(
-      new FakeRTCCertificateGenerator());
-  rtc::scoped_refptr<PeerConnectionInterface> pc(factory_->CreatePeerConnection(
-      config, nullptr, std::move(port_allocator_), std::move(cert_generator),
-      &observer_));
-  ASSERT_TRUE(pc.get() != NULL);
-  cricket::ServerAddresses stun_servers;
-  rtc::SocketAddress stun1("1.2.3.4", 1234);
-  stun_servers.insert(stun1);
-  rtc::SocketAddress stun2("1.2.3.4", 3478);
-  stun_servers.insert(stun2);  // Default port
-  rtc::SocketAddress stun3("2401:fa00:4::", 1234);
-  stun_servers.insert(stun3);
-  rtc::SocketAddress stun4("2401:fa00:4::", 3478);
-  stun_servers.insert(stun4);  // Default port
-  VerifyStunServers(stun_servers);
-
-  std::vector<cricket::RelayServerConfig> turn_servers;
-  cricket::RelayServerConfig turn1("2401:fa00:4::", 1234, "test", kTurnPassword,
-                                   cricket::PROTO_UDP);
-  turn_servers.push_back(turn1);
-  VerifyTurnServers(turn_servers);
-}
-
-// This test verifies the captured stream is rendered locally using a
-// local video track.
-TEST_F(PeerConnectionFactoryTest, LocalRendering) {
-  cricket::FakeVideoCapturer* capturer = new cricket::FakeVideoCapturer();
-  // The source takes ownership of |capturer|, but we keep a raw pointer to
-  // inject fake frames.
-  rtc::scoped_refptr<VideoTrackSourceInterface> source(
-      factory_->CreateVideoSource(
-          std::unique_ptr<cricket::VideoCapturer>(capturer), NULL));
-  ASSERT_TRUE(source.get() != NULL);
-  rtc::scoped_refptr<VideoTrackInterface> track(
-      factory_->CreateVideoTrack("testlabel", source));
-  ASSERT_TRUE(track.get() != NULL);
-  FakeVideoTrackRenderer local_renderer(track);
-
-  EXPECT_EQ(0, local_renderer.num_rendered_frames());
-  EXPECT_TRUE(capturer->CaptureFrame());
-  EXPECT_EQ(1, local_renderer.num_rendered_frames());
-  EXPECT_FALSE(local_renderer.black_frame());
-
-  track->set_enabled(false);
-  EXPECT_TRUE(capturer->CaptureFrame());
-  EXPECT_EQ(2, local_renderer.num_rendered_frames());
-  EXPECT_TRUE(local_renderer.black_frame());
-
-  track->set_enabled(true);
-  EXPECT_TRUE(capturer->CaptureFrame());
-  EXPECT_EQ(3, local_renderer.num_rendered_frames());
-  EXPECT_FALSE(local_renderer.black_frame());
-}
diff --git a/pc/peerconnectioninterface_unittest.cc b/pc/peerconnectioninterface_unittest.cc
deleted file mode 100644
index ccf64d2..0000000
--- a/pc/peerconnectioninterface_unittest.cc
+++ /dev/null
@@ -1,3987 +0,0 @@
-/*
- *  Copyright 2012 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 <algorithm>
-#include <memory>
-#include <sstream>
-#include <string>
-#include <utility>
-
-#include "webrtc/api/audio_codecs/builtin_audio_decoder_factory.h"
-#include "webrtc/api/audio_codecs/builtin_audio_encoder_factory.h"
-#include "webrtc/api/jsepsessiondescription.h"
-#include "webrtc/api/mediastreaminterface.h"
-#include "webrtc/api/peerconnectioninterface.h"
-#include "webrtc/api/rtpreceiverinterface.h"
-#include "webrtc/api/rtpsenderinterface.h"
-#include "webrtc/api/test/fakeconstraints.h"
-#include "webrtc/media/base/fakevideocapturer.h"
-#include "webrtc/media/engine/webrtcmediaengine.h"
-#include "webrtc/media/sctp/sctptransportinternal.h"
-#include "webrtc/modules/audio_processing/include/audio_processing.h"
-#include "webrtc/p2p/base/fakeportallocator.h"
-#include "webrtc/pc/audiotrack.h"
-#include "webrtc/pc/mediasession.h"
-#include "webrtc/pc/mediastream.h"
-#include "webrtc/pc/peerconnection.h"
-#include "webrtc/pc/streamcollection.h"
-#include "webrtc/pc/test/fakeaudiocapturemodule.h"
-#include "webrtc/pc/test/fakertccertificategenerator.h"
-#include "webrtc/pc/test/fakevideotracksource.h"
-#include "webrtc/pc/test/mockpeerconnectionobservers.h"
-#include "webrtc/pc/test/testsdpstrings.h"
-#include "webrtc/pc/videocapturertracksource.h"
-#include "webrtc/pc/videotrack.h"
-#include "webrtc/rtc_base/gunit.h"
-#include "webrtc/rtc_base/ssladapter.h"
-#include "webrtc/rtc_base/sslstreamadapter.h"
-#include "webrtc/rtc_base/stringutils.h"
-#include "webrtc/rtc_base/thread.h"
-#include "webrtc/rtc_base/virtualsocketserver.h"
-#include "webrtc/test/gmock.h"
-
-#ifdef WEBRTC_ANDROID
-#include "webrtc/pc/test/androidtestinitializer.h"
-#endif
-
-static const char kStreamLabel1[] = "local_stream_1";
-static const char kStreamLabel2[] = "local_stream_2";
-static const char kStreamLabel3[] = "local_stream_3";
-static const int kDefaultStunPort = 3478;
-static const char kStunAddressOnly[] = "stun:address";
-static const char kStunInvalidPort[] = "stun:address:-1";
-static const char kStunAddressPortAndMore1[] = "stun:address:port:more";
-static const char kStunAddressPortAndMore2[] = "stun:address:port more";
-static const char kTurnIceServerUri[] = "turn:user@turn.example.org";
-static const char kTurnUsername[] = "user";
-static const char kTurnPassword[] = "password";
-static const char kTurnHostname[] = "turn.example.org";
-static const uint32_t kTimeout = 10000U;
-
-static const char kStreams[][8] = {"stream1", "stream2"};
-static const char kAudioTracks[][32] = {"audiotrack0", "audiotrack1"};
-static const char kVideoTracks[][32] = {"videotrack0", "videotrack1"};
-
-static const char kRecvonly[] = "recvonly";
-static const char kSendrecv[] = "sendrecv";
-
-// Reference SDP with a MediaStream with label "stream1" and audio track with
-// id "audio_1" and a video track with id "video_1;
-static const char kSdpStringWithStream1[] =
-    "v=0\r\n"
-    "o=- 0 0 IN IP4 127.0.0.1\r\n"
-    "s=-\r\n"
-    "t=0 0\r\n"
-    "m=audio 1 RTP/AVPF 103\r\n"
-    "a=ice-ufrag:e5785931\r\n"
-    "a=ice-pwd:36fb7878390db89481c1d46daa4278d8\r\n"
-    "a=fingerprint:sha-256 58:AB:6E:F5:F1:E4:57:B7:E9:46:F4:86:04:28:F9:A7:ED:"
-    "BD:AB:AE:40:EF:CE:9A:51:2C:2A:B1:9B:8B:78:84\r\n"
-    "a=mid:audio\r\n"
-    "a=sendrecv\r\n"
-    "a=rtcp-mux\r\n"
-    "a=rtpmap:103 ISAC/16000\r\n"
-    "a=ssrc:1 cname:stream1\r\n"
-    "a=ssrc:1 mslabel:stream1\r\n"
-    "a=ssrc:1 label:audiotrack0\r\n"
-    "m=video 1 RTP/AVPF 120\r\n"
-    "a=ice-ufrag:e5785931\r\n"
-    "a=ice-pwd:36fb7878390db89481c1d46daa4278d8\r\n"
-    "a=fingerprint:sha-256 58:AB:6E:F5:F1:E4:57:B7:E9:46:F4:86:04:28:F9:A7:ED:"
-    "BD:AB:AE:40:EF:CE:9A:51:2C:2A:B1:9B:8B:78:84\r\n"
-    "a=mid:video\r\n"
-    "a=sendrecv\r\n"
-    "a=rtcp-mux\r\n"
-    "a=rtpmap:120 VP8/90000\r\n"
-    "a=ssrc:2 cname:stream1\r\n"
-    "a=ssrc:2 mslabel:stream1\r\n"
-    "a=ssrc:2 label:videotrack0\r\n";
-
-// Reference SDP with a MediaStream with label "stream1" and audio track with
-// id "audio_1";
-static const char kSdpStringWithStream1AudioTrackOnly[] =
-    "v=0\r\n"
-    "o=- 0 0 IN IP4 127.0.0.1\r\n"
-    "s=-\r\n"
-    "t=0 0\r\n"
-    "m=audio 1 RTP/AVPF 103\r\n"
-    "a=ice-ufrag:e5785931\r\n"
-    "a=ice-pwd:36fb7878390db89481c1d46daa4278d8\r\n"
-    "a=fingerprint:sha-256 58:AB:6E:F5:F1:E4:57:B7:E9:46:F4:86:04:28:F9:A7:ED:"
-    "BD:AB:AE:40:EF:CE:9A:51:2C:2A:B1:9B:8B:78:84\r\n"
-    "a=mid:audio\r\n"
-    "a=sendrecv\r\n"
-    "a=rtpmap:103 ISAC/16000\r\n"
-    "a=ssrc:1 cname:stream1\r\n"
-    "a=ssrc:1 mslabel:stream1\r\n"
-    "a=ssrc:1 label:audiotrack0\r\n"
-    "a=rtcp-mux\r\n";
-
-// Reference SDP with two MediaStreams with label "stream1" and "stream2. Each
-// MediaStreams have one audio track and one video track.
-// This uses MSID.
-static const char kSdpStringWithStream1And2[] =
-    "v=0\r\n"
-    "o=- 0 0 IN IP4 127.0.0.1\r\n"
-    "s=-\r\n"
-    "t=0 0\r\n"
-    "a=msid-semantic: WMS stream1 stream2\r\n"
-    "m=audio 1 RTP/AVPF 103\r\n"
-    "a=ice-ufrag:e5785931\r\n"
-    "a=ice-pwd:36fb7878390db89481c1d46daa4278d8\r\n"
-    "a=fingerprint:sha-256 58:AB:6E:F5:F1:E4:57:B7:E9:46:F4:86:04:28:F9:A7:ED:"
-    "BD:AB:AE:40:EF:CE:9A:51:2C:2A:B1:9B:8B:78:84\r\n"
-    "a=mid:audio\r\n"
-    "a=sendrecv\r\n"
-    "a=rtcp-mux\r\n"
-    "a=rtpmap:103 ISAC/16000\r\n"
-    "a=ssrc:1 cname:stream1\r\n"
-    "a=ssrc:1 msid:stream1 audiotrack0\r\n"
-    "a=ssrc:3 cname:stream2\r\n"
-    "a=ssrc:3 msid:stream2 audiotrack1\r\n"
-    "m=video 1 RTP/AVPF 120\r\n"
-    "a=ice-ufrag:e5785931\r\n"
-    "a=ice-pwd:36fb7878390db89481c1d46daa4278d8\r\n"
-    "a=fingerprint:sha-256 58:AB:6E:F5:F1:E4:57:B7:E9:46:F4:86:04:28:F9:A7:ED:"
-    "BD:AB:AE:40:EF:CE:9A:51:2C:2A:B1:9B:8B:78:84\r\n"
-    "a=mid:video\r\n"
-    "a=sendrecv\r\n"
-    "a=rtcp-mux\r\n"
-    "a=rtpmap:120 VP8/0\r\n"
-    "a=ssrc:2 cname:stream1\r\n"
-    "a=ssrc:2 msid:stream1 videotrack0\r\n"
-    "a=ssrc:4 cname:stream2\r\n"
-    "a=ssrc:4 msid:stream2 videotrack1\r\n";
-
-// Reference SDP without MediaStreams. Msid is not supported.
-static const char kSdpStringWithoutStreams[] =
-    "v=0\r\n"
-    "o=- 0 0 IN IP4 127.0.0.1\r\n"
-    "s=-\r\n"
-    "t=0 0\r\n"
-    "m=audio 1 RTP/AVPF 103\r\n"
-    "a=ice-ufrag:e5785931\r\n"
-    "a=ice-pwd:36fb7878390db89481c1d46daa4278d8\r\n"
-    "a=fingerprint:sha-256 58:AB:6E:F5:F1:E4:57:B7:E9:46:F4:86:04:28:F9:A7:ED:"
-    "BD:AB:AE:40:EF:CE:9A:51:2C:2A:B1:9B:8B:78:84\r\n"
-    "a=mid:audio\r\n"
-    "a=sendrecv\r\n"
-    "a=rtcp-mux\r\n"
-    "a=rtpmap:103 ISAC/16000\r\n"
-    "m=video 1 RTP/AVPF 120\r\n"
-    "a=ice-ufrag:e5785931\r\n"
-    "a=ice-pwd:36fb7878390db89481c1d46daa4278d8\r\n"
-    "a=fingerprint:sha-256 58:AB:6E:F5:F1:E4:57:B7:E9:46:F4:86:04:28:F9:A7:ED:"
-    "BD:AB:AE:40:EF:CE:9A:51:2C:2A:B1:9B:8B:78:84\r\n"
-    "a=mid:video\r\n"
-    "a=sendrecv\r\n"
-    "a=rtcp-mux\r\n"
-    "a=rtpmap:120 VP8/90000\r\n";
-
-// Reference SDP without MediaStreams. Msid is supported.
-static const char kSdpStringWithMsidWithoutStreams[] =
-    "v=0\r\n"
-    "o=- 0 0 IN IP4 127.0.0.1\r\n"
-    "s=-\r\n"
-    "t=0 0\r\n"
-    "a=msid-semantic: WMS\r\n"
-    "m=audio 1 RTP/AVPF 103\r\n"
-    "a=ice-ufrag:e5785931\r\n"
-    "a=ice-pwd:36fb7878390db89481c1d46daa4278d8\r\n"
-    "a=fingerprint:sha-256 58:AB:6E:F5:F1:E4:57:B7:E9:46:F4:86:04:28:F9:A7:ED:"
-    "BD:AB:AE:40:EF:CE:9A:51:2C:2A:B1:9B:8B:78:84\r\n"
-    "a=mid:audio\r\n"
-    "a=sendrecv\r\n"
-    "a=rtcp-mux\r\n"
-    "a=rtpmap:103 ISAC/16000\r\n"
-    "m=video 1 RTP/AVPF 120\r\n"
-    "a=ice-ufrag:e5785931\r\n"
-    "a=ice-pwd:36fb7878390db89481c1d46daa4278d8\r\n"
-    "a=fingerprint:sha-256 58:AB:6E:F5:F1:E4:57:B7:E9:46:F4:86:04:28:F9:A7:ED:"
-    "BD:AB:AE:40:EF:CE:9A:51:2C:2A:B1:9B:8B:78:84\r\n"
-    "a=mid:video\r\n"
-    "a=sendrecv\r\n"
-    "a=rtcp-mux\r\n"
-    "a=rtpmap:120 VP8/90000\r\n";
-
-// Reference SDP without MediaStreams and audio only.
-static const char kSdpStringWithoutStreamsAudioOnly[] =
-    "v=0\r\n"
-    "o=- 0 0 IN IP4 127.0.0.1\r\n"
-    "s=-\r\n"
-    "t=0 0\r\n"
-    "m=audio 1 RTP/AVPF 103\r\n"
-    "a=ice-ufrag:e5785931\r\n"
-    "a=ice-pwd:36fb7878390db89481c1d46daa4278d8\r\n"
-    "a=fingerprint:sha-256 58:AB:6E:F5:F1:E4:57:B7:E9:46:F4:86:04:28:F9:A7:ED:"
-    "BD:AB:AE:40:EF:CE:9A:51:2C:2A:B1:9B:8B:78:84\r\n"
-    "a=mid:audio\r\n"
-    "a=sendrecv\r\n"
-    "a=rtcp-mux\r\n"
-    "a=rtpmap:103 ISAC/16000\r\n";
-
-// Reference SENDONLY SDP without MediaStreams. Msid is not supported.
-static const char kSdpStringSendOnlyWithoutStreams[] =
-    "v=0\r\n"
-    "o=- 0 0 IN IP4 127.0.0.1\r\n"
-    "s=-\r\n"
-    "t=0 0\r\n"
-    "m=audio 1 RTP/AVPF 103\r\n"
-    "a=ice-ufrag:e5785931\r\n"
-    "a=ice-pwd:36fb7878390db89481c1d46daa4278d8\r\n"
-    "a=fingerprint:sha-256 58:AB:6E:F5:F1:E4:57:B7:E9:46:F4:86:04:28:F9:A7:ED:"
-    "BD:AB:AE:40:EF:CE:9A:51:2C:2A:B1:9B:8B:78:84\r\n"
-    "a=mid:audio\r\n"
-    "a=sendrecv\r\n"
-    "a=sendonly\r\n"
-    "a=rtcp-mux\r\n"
-    "a=rtpmap:103 ISAC/16000\r\n"
-    "m=video 1 RTP/AVPF 120\r\n"
-    "a=ice-ufrag:e5785931\r\n"
-    "a=ice-pwd:36fb7878390db89481c1d46daa4278d8\r\n"
-    "a=fingerprint:sha-256 58:AB:6E:F5:F1:E4:57:B7:E9:46:F4:86:04:28:F9:A7:ED:"
-    "BD:AB:AE:40:EF:CE:9A:51:2C:2A:B1:9B:8B:78:84\r\n"
-    "a=mid:video\r\n"
-    "a=sendrecv\r\n"
-    "a=sendonly\r\n"
-    "a=rtcp-mux\r\n"
-    "a=rtpmap:120 VP8/90000\r\n";
-
-static const char kSdpStringInit[] =
-    "v=0\r\n"
-    "o=- 0 0 IN IP4 127.0.0.1\r\n"
-    "s=-\r\n"
-    "t=0 0\r\n"
-    "a=msid-semantic: WMS\r\n";
-
-static const char kSdpStringAudio[] =
-    "m=audio 1 RTP/AVPF 103\r\n"
-    "a=ice-ufrag:e5785931\r\n"
-    "a=ice-pwd:36fb7878390db89481c1d46daa4278d8\r\n"
-    "a=fingerprint:sha-256 58:AB:6E:F5:F1:E4:57:B7:E9:46:F4:86:04:28:F9:A7:ED:"
-    "BD:AB:AE:40:EF:CE:9A:51:2C:2A:B1:9B:8B:78:84\r\n"
-    "a=mid:audio\r\n"
-    "a=sendrecv\r\n"
-    "a=rtcp-mux\r\n"
-    "a=rtpmap:103 ISAC/16000\r\n";
-
-static const char kSdpStringVideo[] =
-    "m=video 1 RTP/AVPF 120\r\n"
-    "a=ice-ufrag:e5785931\r\n"
-    "a=ice-pwd:36fb7878390db89481c1d46daa4278d8\r\n"
-    "a=fingerprint:sha-256 58:AB:6E:F5:F1:E4:57:B7:E9:46:F4:86:04:28:F9:A7:ED:"
-    "BD:AB:AE:40:EF:CE:9A:51:2C:2A:B1:9B:8B:78:84\r\n"
-    "a=mid:video\r\n"
-    "a=sendrecv\r\n"
-    "a=rtcp-mux\r\n"
-    "a=rtpmap:120 VP8/90000\r\n";
-
-static const char kSdpStringMs1Audio0[] =
-    "a=ssrc:1 cname:stream1\r\n"
-    "a=ssrc:1 msid:stream1 audiotrack0\r\n";
-
-static const char kSdpStringMs1Video0[] =
-    "a=ssrc:2 cname:stream1\r\n"
-    "a=ssrc:2 msid:stream1 videotrack0\r\n";
-
-static const char kSdpStringMs1Audio1[] =
-    "a=ssrc:3 cname:stream1\r\n"
-    "a=ssrc:3 msid:stream1 audiotrack1\r\n";
-
-static const char kSdpStringMs1Video1[] =
-    "a=ssrc:4 cname:stream1\r\n"
-    "a=ssrc:4 msid:stream1 videotrack1\r\n";
-
-static const char kDtlsSdesFallbackSdp[] =
-    "v=0\r\n"
-    "o=xxxxxx 7 2 IN IP4 0.0.0.0\r\n"
-    "s=-\r\n"
-    "c=IN IP4 0.0.0.0\r\n"
-    "t=0 0\r\n"
-    "a=group:BUNDLE audio\r\n"
-    "a=msid-semantic: WMS\r\n"
-    "m=audio 1 RTP/SAVPF 0\r\n"
-    "a=sendrecv\r\n"
-    "a=rtcp-mux\r\n"
-    "a=mid:audio\r\n"
-    "a=ssrc:1 cname:stream1\r\n"
-    "a=ssrc:1 mslabel:stream1\r\n"
-    "a=ssrc:1 label:audiotrack0\r\n"
-    "a=ice-ufrag:e5785931\r\n"
-    "a=ice-pwd:36fb7878390db89481c1d46daa4278d8\r\n"
-    "a=rtpmap:0 pcmu/8000\r\n"
-    "a=fingerprint:sha-1 "
-    "4A:AD:B9:B1:3F:82:18:3B:54:02:12:DF:3E:5D:49:6B:19:E5:7C:AB\r\n"
-    "a=setup:actpass\r\n"
-    "a=crypto:1 AES_CM_128_HMAC_SHA1_32 "
-    "inline:NzB4d1BINUAvLEw6UzF3WSJ+PSdFcGdUJShpX1Zj|2^20|1:32 "
-    "dummy_session_params\r\n";
-
-using ::testing::Exactly;
-using cricket::StreamParams;
-using webrtc::AudioSourceInterface;
-using webrtc::AudioTrack;
-using webrtc::AudioTrackInterface;
-using webrtc::DataBuffer;
-using webrtc::DataChannelInterface;
-using webrtc::FakeConstraints;
-using webrtc::IceCandidateInterface;
-using webrtc::MediaConstraintsInterface;
-using webrtc::MediaStream;
-using webrtc::MediaStreamInterface;
-using webrtc::MediaStreamTrackInterface;
-using webrtc::MockCreateSessionDescriptionObserver;
-using webrtc::MockDataChannelObserver;
-using webrtc::MockSetSessionDescriptionObserver;
-using webrtc::MockStatsObserver;
-using webrtc::NotifierInterface;
-using webrtc::ObserverInterface;
-using webrtc::PeerConnectionInterface;
-using webrtc::PeerConnectionObserver;
-using webrtc::RTCError;
-using webrtc::RTCErrorType;
-using webrtc::RtpReceiverInterface;
-using webrtc::RtpSenderInterface;
-using webrtc::SdpParseError;
-using webrtc::SessionDescriptionInterface;
-using webrtc::StreamCollection;
-using webrtc::StreamCollectionInterface;
-using webrtc::VideoTrackSourceInterface;
-using webrtc::VideoTrack;
-using webrtc::VideoTrackInterface;
-
-typedef PeerConnectionInterface::RTCOfferAnswerOptions RTCOfferAnswerOptions;
-
-namespace {
-
-// Gets the first ssrc of given content type from the ContentInfo.
-bool GetFirstSsrc(const cricket::ContentInfo* content_info, int* ssrc) {
-  if (!content_info || !ssrc) {
-    return false;
-  }
-  const cricket::MediaContentDescription* media_desc =
-      static_cast<const cricket::MediaContentDescription*>(
-          content_info->description);
-  if (!media_desc || media_desc->streams().empty()) {
-    return false;
-  }
-  *ssrc = media_desc->streams().begin()->first_ssrc();
-  return true;
-}
-
-// Get the ufrags out of an SDP blob. Useful for testing ICE restart
-// behavior.
-std::vector<std::string> GetUfrags(
-    const webrtc::SessionDescriptionInterface* desc) {
-  std::vector<std::string> ufrags;
-  for (const cricket::TransportInfo& info :
-       desc->description()->transport_infos()) {
-    ufrags.push_back(info.description.ice_ufrag);
-  }
-  return ufrags;
-}
-
-void SetSsrcToZero(std::string* sdp) {
-  const char kSdpSsrcAtribute[] = "a=ssrc:";
-  const char kSdpSsrcAtributeZero[] = "a=ssrc:0";
-  size_t ssrc_pos = 0;
-  while ((ssrc_pos = sdp->find(kSdpSsrcAtribute, ssrc_pos)) !=
-      std::string::npos) {
-    size_t end_ssrc = sdp->find(" ", ssrc_pos);
-    sdp->replace(ssrc_pos, end_ssrc - ssrc_pos, kSdpSsrcAtributeZero);
-    ssrc_pos = end_ssrc;
-  }
-}
-
-// Check if |streams| contains the specified track.
-bool ContainsTrack(const std::vector<cricket::StreamParams>& streams,
-                   const std::string& stream_label,
-                   const std::string& track_id) {
-  for (const cricket::StreamParams& params : streams) {
-    if (params.sync_label == stream_label && params.id == track_id) {
-      return true;
-    }
-  }
-  return false;
-}
-
-// Check if |senders| contains the specified sender, by id.
-bool ContainsSender(
-    const std::vector<rtc::scoped_refptr<RtpSenderInterface>>& senders,
-    const std::string& id) {
-  for (const auto& sender : senders) {
-    if (sender->id() == id) {
-      return true;
-    }
-  }
-  return false;
-}
-
-// Check if |senders| contains the specified sender, by id and stream id.
-bool ContainsSender(
-    const std::vector<rtc::scoped_refptr<RtpSenderInterface>>& senders,
-    const std::string& id,
-    const std::string& stream_id) {
-  for (const auto& sender : senders) {
-    if (sender->id() == id && sender->stream_ids()[0] == stream_id) {
-      return true;
-    }
-  }
-  return false;
-}
-
-// Create a collection of streams.
-// CreateStreamCollection(1) creates a collection that
-// correspond to kSdpStringWithStream1.
-// CreateStreamCollection(2) correspond to kSdpStringWithStream1And2.
-rtc::scoped_refptr<StreamCollection> CreateStreamCollection(
-    int number_of_streams,
-    int tracks_per_stream) {
-  rtc::scoped_refptr<StreamCollection> local_collection(
-      StreamCollection::Create());
-
-  for (int i = 0; i < number_of_streams; ++i) {
-    rtc::scoped_refptr<webrtc::MediaStreamInterface> stream(
-        webrtc::MediaStream::Create(kStreams[i]));
-
-    for (int j = 0; j < tracks_per_stream; ++j) {
-      // Add a local audio track.
-      rtc::scoped_refptr<webrtc::AudioTrackInterface> audio_track(
-          webrtc::AudioTrack::Create(kAudioTracks[i * tracks_per_stream + j],
-                                     nullptr));
-      stream->AddTrack(audio_track);
-
-      // Add a local video track.
-      rtc::scoped_refptr<webrtc::VideoTrackInterface> video_track(
-          webrtc::VideoTrack::Create(kVideoTracks[i * tracks_per_stream + j],
-                                     webrtc::FakeVideoTrackSource::Create(),
-                                     rtc::Thread::Current()));
-      stream->AddTrack(video_track);
-    }
-
-    local_collection->AddStream(stream);
-  }
-  return local_collection;
-}
-
-// Check equality of StreamCollections.
-bool CompareStreamCollections(StreamCollectionInterface* s1,
-                              StreamCollectionInterface* s2) {
-  if (s1 == nullptr || s2 == nullptr || s1->count() != s2->count()) {
-    return false;
-  }
-
-  for (size_t i = 0; i != s1->count(); ++i) {
-    if (s1->at(i)->label() != s2->at(i)->label()) {
-      return false;
-    }
-    webrtc::AudioTrackVector audio_tracks1 = s1->at(i)->GetAudioTracks();
-    webrtc::AudioTrackVector audio_tracks2 = s2->at(i)->GetAudioTracks();
-    webrtc::VideoTrackVector video_tracks1 = s1->at(i)->GetVideoTracks();
-    webrtc::VideoTrackVector video_tracks2 = s2->at(i)->GetVideoTracks();
-
-    if (audio_tracks1.size() != audio_tracks2.size()) {
-      return false;
-    }
-    for (size_t j = 0; j != audio_tracks1.size(); ++j) {
-      if (audio_tracks1[j]->id() != audio_tracks2[j]->id()) {
-        return false;
-      }
-    }
-    if (video_tracks1.size() != video_tracks2.size()) {
-      return false;
-    }
-    for (size_t j = 0; j != video_tracks1.size(); ++j) {
-      if (video_tracks1[j]->id() != video_tracks2[j]->id()) {
-        return false;
-      }
-    }
-  }
-  return true;
-}
-
-// Helper class to test Observer.
-class MockTrackObserver : public ObserverInterface {
- public:
-  explicit MockTrackObserver(NotifierInterface* notifier)
-      : notifier_(notifier) {
-    notifier_->RegisterObserver(this);
-  }
-
-  ~MockTrackObserver() { Unregister(); }
-
-  void Unregister() {
-    if (notifier_) {
-      notifier_->UnregisterObserver(this);
-      notifier_ = nullptr;
-    }
-  }
-
-  MOCK_METHOD0(OnChanged, void());
-
- private:
-  NotifierInterface* notifier_;
-};
-
-class MockPeerConnectionObserver : public PeerConnectionObserver {
- public:
-  MockPeerConnectionObserver() : remote_streams_(StreamCollection::Create()) {}
-  virtual ~MockPeerConnectionObserver() {
-  }
-  void SetPeerConnectionInterface(PeerConnectionInterface* pc) {
-    pc_ = pc;
-    if (pc) {
-      state_ = pc_->signaling_state();
-    }
-  }
-  void OnSignalingChange(
-      PeerConnectionInterface::SignalingState new_state) override {
-    EXPECT_EQ(pc_->signaling_state(), new_state);
-    state_ = new_state;
-  }
-
-  MediaStreamInterface* RemoteStream(const std::string& label) {
-    return remote_streams_->find(label);
-  }
-  StreamCollectionInterface* remote_streams() const { return remote_streams_; }
-  void OnAddStream(rtc::scoped_refptr<MediaStreamInterface> stream) override {
-    last_added_stream_ = stream;
-    remote_streams_->AddStream(stream);
-  }
-  void OnRemoveStream(
-      rtc::scoped_refptr<MediaStreamInterface> stream) override {
-    last_removed_stream_ = stream;
-    remote_streams_->RemoveStream(stream);
-  }
-  void OnRenegotiationNeeded() override { renegotiation_needed_ = true; }
-  void OnDataChannel(
-      rtc::scoped_refptr<DataChannelInterface> data_channel) override {
-    last_datachannel_ = data_channel;
-  }
-
-  void OnIceConnectionChange(
-      PeerConnectionInterface::IceConnectionState new_state) override {
-    EXPECT_EQ(pc_->ice_connection_state(), new_state);
-    callback_triggered_ = true;
-  }
-  void OnIceGatheringChange(
-      PeerConnectionInterface::IceGatheringState new_state) override {
-    EXPECT_EQ(pc_->ice_gathering_state(), new_state);
-    ice_complete_ = new_state == PeerConnectionInterface::kIceGatheringComplete;
-    callback_triggered_ = true;
-  }
-  void OnIceCandidate(const webrtc::IceCandidateInterface* candidate) override {
-    EXPECT_NE(PeerConnectionInterface::kIceGatheringNew,
-              pc_->ice_gathering_state());
-
-    std::string sdp;
-    EXPECT_TRUE(candidate->ToString(&sdp));
-    EXPECT_LT(0u, sdp.size());
-    last_candidate_.reset(webrtc::CreateIceCandidate(candidate->sdp_mid(),
-        candidate->sdp_mline_index(), sdp, NULL));
-    EXPECT_TRUE(last_candidate_.get() != NULL);
-    callback_triggered_ = true;
-  }
-
-  void OnIceCandidatesRemoved(
-      const std::vector<cricket::Candidate>& candidates) override {
-    callback_triggered_ = true;
-  }
-
-  void OnIceConnectionReceivingChange(bool receiving) override {
-    callback_triggered_ = true;
-  }
-
-  void OnAddTrack(
-      rtc::scoped_refptr<webrtc::RtpReceiverInterface> receiver,
-      const std::vector<rtc::scoped_refptr<webrtc::MediaStreamInterface>>&
-          streams) override {
-    EXPECT_TRUE(receiver != nullptr);
-    num_added_tracks_++;
-    last_added_track_label_ = receiver->id();
-  }
-
-  // Returns the label of the last added stream.
-  // Empty string if no stream have been added.
-  std::string GetLastAddedStreamLabel() {
-    if (last_added_stream_.get())
-      return last_added_stream_->label();
-    return "";
-  }
-  std::string GetLastRemovedStreamLabel() {
-    if (last_removed_stream_.get())
-      return last_removed_stream_->label();
-    return "";
-  }
-
-  rtc::scoped_refptr<PeerConnectionInterface> pc_;
-  PeerConnectionInterface::SignalingState state_;
-  std::unique_ptr<IceCandidateInterface> last_candidate_;
-  rtc::scoped_refptr<DataChannelInterface> last_datachannel_;
-  rtc::scoped_refptr<StreamCollection> remote_streams_;
-  bool renegotiation_needed_ = false;
-  bool ice_complete_ = false;
-  bool callback_triggered_ = false;
-  int num_added_tracks_ = 0;
-  std::string last_added_track_label_;
-
- private:
-  rtc::scoped_refptr<MediaStreamInterface> last_added_stream_;
-  rtc::scoped_refptr<MediaStreamInterface> last_removed_stream_;
-};
-
-}  // namespace
-
-// The PeerConnectionMediaConfig tests below verify that configuration and
-// constraints are propagated into the PeerConnection's MediaConfig. These
-// settings are intended for MediaChannel constructors, but that is not
-// exercised by these unittest.
-class PeerConnectionFactoryForTest : public webrtc::PeerConnectionFactory {
- public:
-  static rtc::scoped_refptr<PeerConnectionFactoryForTest>
-  CreatePeerConnectionFactoryForTest() {
-    auto audio_encoder_factory = webrtc::CreateBuiltinAudioEncoderFactory();
-    auto audio_decoder_factory = webrtc::CreateBuiltinAudioDecoderFactory();
-
-    auto media_engine = std::unique_ptr<cricket::MediaEngineInterface>(
-        cricket::WebRtcMediaEngineFactory::Create(
-            nullptr, audio_encoder_factory, audio_decoder_factory, nullptr,
-            nullptr, nullptr, webrtc::AudioProcessing::Create()));
-
-    std::unique_ptr<webrtc::CallFactoryInterface> call_factory =
-        webrtc::CreateCallFactory();
-
-    std::unique_ptr<webrtc::RtcEventLogFactoryInterface> event_log_factory =
-        webrtc::CreateRtcEventLogFactory();
-
-    return new rtc::RefCountedObject<PeerConnectionFactoryForTest>(
-        rtc::Thread::Current(), rtc::Thread::Current(), rtc::Thread::Current(),
-        FakeAudioCaptureModule::Create(), audio_encoder_factory,
-        audio_decoder_factory, nullptr, nullptr, nullptr,
-        std::move(media_engine), std::move(call_factory),
-        std::move(event_log_factory));
-  }
-
-  PeerConnectionFactoryForTest(
-      rtc::Thread* network_thread,
-      rtc::Thread* worker_thread,
-      rtc::Thread* signaling_thread,
-      rtc::scoped_refptr<FakeAudioCaptureModule> fake_adm,
-      rtc::scoped_refptr<webrtc::AudioEncoderFactory> audio_encoder_factory,
-      rtc::scoped_refptr<webrtc::AudioDecoderFactory> audio_decoder_factory,
-      cricket::WebRtcVideoEncoderFactory* video_encoder_factory,
-      cricket::WebRtcVideoDecoderFactory* video_decoder_factory,
-      rtc::scoped_refptr<webrtc::AudioMixer> audio_mixer,
-      std::unique_ptr<cricket::MediaEngineInterface> media_engine,
-      std::unique_ptr<webrtc::CallFactoryInterface> call_factory,
-      std::unique_ptr<webrtc::RtcEventLogFactoryInterface> event_log_factory)
-      : webrtc::PeerConnectionFactory(network_thread,
-                                      worker_thread,
-                                      signaling_thread,
-                                      fake_adm,
-                                      audio_encoder_factory,
-                                      audio_decoder_factory,
-                                      video_encoder_factory,
-                                      video_decoder_factory,
-                                      audio_mixer,
-                                      std::move(media_engine),
-                                      std::move(call_factory),
-                                      std::move(event_log_factory)) {}
-
-  cricket::TransportController* CreateTransportController(
-      cricket::PortAllocator* port_allocator,
-      bool redetermine_role_on_ice_restart) override {
-    transport_controller = new cricket::TransportController(
-        rtc::Thread::Current(), rtc::Thread::Current(), port_allocator,
-        redetermine_role_on_ice_restart, rtc::CryptoOptions());
-    return transport_controller;
-  }
-
-  rtc::scoped_refptr<FakeAudioCaptureModule> fake_audio_capture_module_;
-  cricket::TransportController* transport_controller;
-};
-
-class PeerConnectionInterfaceTest : public testing::Test {
- protected:
-  PeerConnectionInterfaceTest()
-      : vss_(new rtc::VirtualSocketServer()), main_(vss_.get()) {
-#ifdef WEBRTC_ANDROID
-    webrtc::InitializeAndroidObjects();
-#endif
-  }
-
-  virtual void SetUp() {
-    // Use fake audio capture module since we're only testing the interface
-    // level, and using a real one could make tests flaky when run in parallel.
-    fake_audio_capture_module_ = FakeAudioCaptureModule::Create();
-    pc_factory_ = webrtc::CreatePeerConnectionFactory(
-        rtc::Thread::Current(), rtc::Thread::Current(), rtc::Thread::Current(),
-        fake_audio_capture_module_, nullptr, nullptr);
-    ASSERT_TRUE(pc_factory_);
-    pc_factory_for_test_ =
-        PeerConnectionFactoryForTest::CreatePeerConnectionFactoryForTest();
-    pc_factory_for_test_->Initialize();
-  }
-
-  void CreatePeerConnection() {
-    CreatePeerConnection(PeerConnectionInterface::RTCConfiguration(), nullptr);
-  }
-
-  // DTLS does not work in a loopback call, so is disabled for most of the
-  // tests in this file.
-  void CreatePeerConnectionWithoutDtls() {
-    FakeConstraints no_dtls_constraints;
-    no_dtls_constraints.AddMandatory(
-        webrtc::MediaConstraintsInterface::kEnableDtlsSrtp, false);
-
-    CreatePeerConnection(PeerConnectionInterface::RTCConfiguration(),
-                         &no_dtls_constraints);
-  }
-
-  void CreatePeerConnection(webrtc::MediaConstraintsInterface* constraints) {
-    CreatePeerConnection(PeerConnectionInterface::RTCConfiguration(),
-                         constraints);
-  }
-
-  void CreatePeerConnectionWithIceTransportsType(
-      PeerConnectionInterface::IceTransportsType type) {
-    PeerConnectionInterface::RTCConfiguration config;
-    config.type = type;
-    return CreatePeerConnection(config, nullptr);
-  }
-
-  void CreatePeerConnectionWithIceServer(const std::string& uri,
-                                         const std::string& password) {
-    PeerConnectionInterface::RTCConfiguration config;
-    PeerConnectionInterface::IceServer server;
-    server.uri = uri;
-    server.password = password;
-    config.servers.push_back(server);
-    CreatePeerConnection(config, nullptr);
-  }
-
-  void CreatePeerConnection(PeerConnectionInterface::RTCConfiguration config,
-                            webrtc::MediaConstraintsInterface* constraints) {
-    std::unique_ptr<cricket::FakePortAllocator> port_allocator(
-        new cricket::FakePortAllocator(rtc::Thread::Current(), nullptr));
-    port_allocator_ = port_allocator.get();
-
-    // Create certificate generator unless DTLS constraint is explicitly set to
-    // false.
-    std::unique_ptr<rtc::RTCCertificateGeneratorInterface> cert_generator;
-    bool dtls;
-    if (FindConstraint(constraints,
-                       webrtc::MediaConstraintsInterface::kEnableDtlsSrtp,
-                       &dtls,
-                       nullptr) && dtls) {
-      fake_certificate_generator_ = new FakeRTCCertificateGenerator();
-      cert_generator.reset(fake_certificate_generator_);
-    }
-    pc_ = pc_factory_->CreatePeerConnection(
-        config, constraints, std::move(port_allocator),
-        std::move(cert_generator), &observer_);
-    ASSERT_TRUE(pc_.get() != NULL);
-    observer_.SetPeerConnectionInterface(pc_.get());
-    EXPECT_EQ(PeerConnectionInterface::kStable, observer_.state_);
-  }
-
-  void CreatePeerConnectionExpectFail(const std::string& uri) {
-    PeerConnectionInterface::RTCConfiguration config;
-    PeerConnectionInterface::IceServer server;
-    server.uri = uri;
-    config.servers.push_back(server);
-
-    rtc::scoped_refptr<PeerConnectionInterface> pc;
-    pc = pc_factory_->CreatePeerConnection(config, nullptr, nullptr, nullptr,
-                                           &observer_);
-    EXPECT_EQ(nullptr, pc);
-  }
-
-  void CreatePeerConnectionExpectFail(
-      PeerConnectionInterface::RTCConfiguration config) {
-    PeerConnectionInterface::IceServer server;
-    server.uri = kTurnIceServerUri;
-    server.password = kTurnPassword;
-    config.servers.push_back(server);
-    rtc::scoped_refptr<PeerConnectionInterface> pc =
-        pc_factory_->CreatePeerConnection(config, nullptr, nullptr, &observer_);
-    EXPECT_EQ(nullptr, pc);
-  }
-
-  void CreatePeerConnectionWithDifferentConfigurations() {
-    CreatePeerConnectionWithIceServer(kStunAddressOnly, "");
-    EXPECT_EQ(1u, port_allocator_->stun_servers().size());
-    EXPECT_EQ(0u, port_allocator_->turn_servers().size());
-    EXPECT_EQ("address", port_allocator_->stun_servers().begin()->hostname());
-    EXPECT_EQ(kDefaultStunPort,
-              port_allocator_->stun_servers().begin()->port());
-
-    CreatePeerConnectionExpectFail(kStunInvalidPort);
-    CreatePeerConnectionExpectFail(kStunAddressPortAndMore1);
-    CreatePeerConnectionExpectFail(kStunAddressPortAndMore2);
-
-    CreatePeerConnectionWithIceServer(kTurnIceServerUri, kTurnPassword);
-    EXPECT_EQ(0u, port_allocator_->stun_servers().size());
-    EXPECT_EQ(1u, port_allocator_->turn_servers().size());
-    EXPECT_EQ(kTurnUsername,
-              port_allocator_->turn_servers()[0].credentials.username);
-    EXPECT_EQ(kTurnPassword,
-              port_allocator_->turn_servers()[0].credentials.password);
-    EXPECT_EQ(kTurnHostname,
-              port_allocator_->turn_servers()[0].ports[0].address.hostname());
-  }
-
-  void ReleasePeerConnection() {
-    pc_ = NULL;
-    observer_.SetPeerConnectionInterface(NULL);
-  }
-
-  void AddVideoStream(const std::string& label) {
-    // Create a local stream.
-    rtc::scoped_refptr<MediaStreamInterface> stream(
-        pc_factory_->CreateLocalMediaStream(label));
-    rtc::scoped_refptr<VideoTrackSourceInterface> video_source(
-        pc_factory_->CreateVideoSource(std::unique_ptr<cricket::VideoCapturer>(
-                                           new cricket::FakeVideoCapturer()),
-                                       NULL));
-    rtc::scoped_refptr<VideoTrackInterface> video_track(
-        pc_factory_->CreateVideoTrack(label + "v0", video_source));
-    stream->AddTrack(video_track.get());
-    EXPECT_TRUE(pc_->AddStream(stream));
-    EXPECT_TRUE_WAIT(observer_.renegotiation_needed_, kTimeout);
-    observer_.renegotiation_needed_ = false;
-  }
-
-  void AddVoiceStream(const std::string& label) {
-    // Create a local stream.
-    rtc::scoped_refptr<MediaStreamInterface> stream(
-        pc_factory_->CreateLocalMediaStream(label));
-    rtc::scoped_refptr<AudioTrackInterface> audio_track(
-        pc_factory_->CreateAudioTrack(label + "a0", NULL));
-    stream->AddTrack(audio_track.get());
-    EXPECT_TRUE(pc_->AddStream(stream));
-    EXPECT_TRUE_WAIT(observer_.renegotiation_needed_, kTimeout);
-    observer_.renegotiation_needed_ = false;
-  }
-
-  void AddAudioVideoStream(const std::string& stream_label,
-                           const std::string& audio_track_label,
-                           const std::string& video_track_label) {
-    // Create a local stream.
-    rtc::scoped_refptr<MediaStreamInterface> stream(
-        pc_factory_->CreateLocalMediaStream(stream_label));
-    rtc::scoped_refptr<AudioTrackInterface> audio_track(
-        pc_factory_->CreateAudioTrack(
-            audio_track_label, static_cast<AudioSourceInterface*>(NULL)));
-    stream->AddTrack(audio_track.get());
-    rtc::scoped_refptr<VideoTrackInterface> video_track(
-        pc_factory_->CreateVideoTrack(
-            video_track_label, pc_factory_->CreateVideoSource(
-                                   std::unique_ptr<cricket::VideoCapturer>(
-                                       new cricket::FakeVideoCapturer()))));
-    stream->AddTrack(video_track.get());
-    EXPECT_TRUE(pc_->AddStream(stream));
-    EXPECT_TRUE_WAIT(observer_.renegotiation_needed_, kTimeout);
-    observer_.renegotiation_needed_ = false;
-  }
-
-  bool DoCreateOfferAnswer(std::unique_ptr<SessionDescriptionInterface>* desc,
-                           bool offer,
-                           MediaConstraintsInterface* constraints) {
-    rtc::scoped_refptr<MockCreateSessionDescriptionObserver>
-        observer(new rtc::RefCountedObject<
-            MockCreateSessionDescriptionObserver>());
-    if (offer) {
-      pc_->CreateOffer(observer, constraints);
-    } else {
-      pc_->CreateAnswer(observer, constraints);
-    }
-    EXPECT_EQ_WAIT(true, observer->called(), kTimeout);
-    *desc = observer->MoveDescription();
-    return observer->result();
-  }
-
-  bool DoCreateOffer(std::unique_ptr<SessionDescriptionInterface>* desc,
-                     MediaConstraintsInterface* constraints) {
-    return DoCreateOfferAnswer(desc, true, constraints);
-  }
-
-  bool DoCreateAnswer(std::unique_ptr<SessionDescriptionInterface>* desc,
-                      MediaConstraintsInterface* constraints) {
-    return DoCreateOfferAnswer(desc, false, constraints);
-  }
-
-  bool DoSetSessionDescription(
-      std::unique_ptr<SessionDescriptionInterface> desc,
-      bool local) {
-    rtc::scoped_refptr<MockSetSessionDescriptionObserver>
-        observer(new rtc::RefCountedObject<
-            MockSetSessionDescriptionObserver>());
-    if (local) {
-      pc_->SetLocalDescription(observer, desc.release());
-    } else {
-      pc_->SetRemoteDescription(observer, desc.release());
-    }
-    if (pc_->signaling_state() != PeerConnectionInterface::kClosed) {
-      EXPECT_EQ_WAIT(true, observer->called(), kTimeout);
-    }
-    return observer->result();
-  }
-
-  bool DoSetLocalDescription(
-      std::unique_ptr<SessionDescriptionInterface> desc) {
-    return DoSetSessionDescription(std::move(desc), true);
-  }
-
-  bool DoSetRemoteDescription(
-      std::unique_ptr<SessionDescriptionInterface> desc) {
-    return DoSetSessionDescription(std::move(desc), false);
-  }
-
-  // Calls PeerConnection::GetStats and check the return value.
-  // It does not verify the values in the StatReports since a RTCP packet might
-  // be required.
-  bool DoGetStats(MediaStreamTrackInterface* track) {
-    rtc::scoped_refptr<MockStatsObserver> observer(
-        new rtc::RefCountedObject<MockStatsObserver>());
-    if (!pc_->GetStats(
-        observer, track, PeerConnectionInterface::kStatsOutputLevelStandard))
-      return false;
-    EXPECT_TRUE_WAIT(observer->called(), kTimeout);
-    return observer->called();
-  }
-
-  void InitiateCall() {
-    CreatePeerConnectionWithoutDtls();
-    // Create a local stream with audio&video tracks.
-    AddAudioVideoStream(kStreamLabel1, "audio_label", "video_label");
-    CreateOfferReceiveAnswer();
-  }
-
-  // Verify that RTP Header extensions has been negotiated for audio and video.
-  void VerifyRemoteRtpHeaderExtensions() {
-    const cricket::MediaContentDescription* desc =
-        cricket::GetFirstAudioContentDescription(
-            pc_->remote_description()->description());
-    ASSERT_TRUE(desc != NULL);
-    EXPECT_GT(desc->rtp_header_extensions().size(), 0u);
-
-    desc = cricket::GetFirstVideoContentDescription(
-        pc_->remote_description()->description());
-    ASSERT_TRUE(desc != NULL);
-    EXPECT_GT(desc->rtp_header_extensions().size(), 0u);
-  }
-
-  void CreateOfferAsRemoteDescription() {
-    std::unique_ptr<SessionDescriptionInterface> offer;
-    ASSERT_TRUE(DoCreateOffer(&offer, nullptr));
-    std::string sdp;
-    EXPECT_TRUE(offer->ToString(&sdp));
-    std::unique_ptr<SessionDescriptionInterface> remote_offer(
-        webrtc::CreateSessionDescription(SessionDescriptionInterface::kOffer,
-                                         sdp, nullptr));
-    EXPECT_TRUE(DoSetRemoteDescription(std::move(remote_offer)));
-    EXPECT_EQ(PeerConnectionInterface::kHaveRemoteOffer, observer_.state_);
-  }
-
-  void CreateAndSetRemoteOffer(const std::string& sdp) {
-    std::unique_ptr<SessionDescriptionInterface> remote_offer(
-        webrtc::CreateSessionDescription(SessionDescriptionInterface::kOffer,
-                                         sdp, nullptr));
-    EXPECT_TRUE(DoSetRemoteDescription(std::move(remote_offer)));
-    EXPECT_EQ(PeerConnectionInterface::kHaveRemoteOffer, observer_.state_);
-  }
-
-  void CreateAnswerAsLocalDescription() {
-    std::unique_ptr<SessionDescriptionInterface> answer;
-    ASSERT_TRUE(DoCreateAnswer(&answer, nullptr));
-
-    // TODO(perkj): Currently SetLocalDescription fails if any parameters in an
-    // audio codec change, even if the parameter has nothing to do with
-    // receiving. Not all parameters are serialized to SDP.
-    // Since CreatePrAnswerAsLocalDescription serialize/deserialize
-    // the SessionDescription, it is necessary to do that here to in order to
-    // get ReceiveOfferCreatePrAnswerAndAnswer and RenegotiateAudioOnly to pass.
-    // https://code.google.com/p/webrtc/issues/detail?id=1356
-    std::string sdp;
-    EXPECT_TRUE(answer->ToString(&sdp));
-    std::unique_ptr<SessionDescriptionInterface> new_answer(
-        webrtc::CreateSessionDescription(SessionDescriptionInterface::kAnswer,
-                                         sdp, nullptr));
-    EXPECT_TRUE(DoSetLocalDescription(std::move(new_answer)));
-    EXPECT_EQ(PeerConnectionInterface::kStable, observer_.state_);
-  }
-
-  void CreatePrAnswerAsLocalDescription() {
-    std::unique_ptr<SessionDescriptionInterface> answer;
-    ASSERT_TRUE(DoCreateAnswer(&answer, nullptr));
-
-    std::string sdp;
-    EXPECT_TRUE(answer->ToString(&sdp));
-    std::unique_ptr<SessionDescriptionInterface> pr_answer(
-        webrtc::CreateSessionDescription(SessionDescriptionInterface::kPrAnswer,
-                                         sdp, nullptr));
-    EXPECT_TRUE(DoSetLocalDescription(std::move(pr_answer)));
-    EXPECT_EQ(PeerConnectionInterface::kHaveLocalPrAnswer, observer_.state_);
-  }
-
-  void CreateOfferReceiveAnswer() {
-    CreateOfferAsLocalDescription();
-    std::string sdp;
-    EXPECT_TRUE(pc_->local_description()->ToString(&sdp));
-    CreateAnswerAsRemoteDescription(sdp);
-  }
-
-  void CreateOfferAsLocalDescription() {
-    std::unique_ptr<SessionDescriptionInterface> offer;
-    ASSERT_TRUE(DoCreateOffer(&offer, nullptr));
-    // TODO(perkj): Currently SetLocalDescription fails if any parameters in an
-    // audio codec change, even if the parameter has nothing to do with
-    // receiving. Not all parameters are serialized to SDP.
-    // Since CreatePrAnswerAsLocalDescription serialize/deserialize
-    // the SessionDescription, it is necessary to do that here to in order to
-    // get ReceiveOfferCreatePrAnswerAndAnswer and RenegotiateAudioOnly to pass.
-    // https://code.google.com/p/webrtc/issues/detail?id=1356
-    std::string sdp;
-    EXPECT_TRUE(offer->ToString(&sdp));
-    std::unique_ptr<SessionDescriptionInterface> new_offer(
-        webrtc::CreateSessionDescription(SessionDescriptionInterface::kOffer,
-                                         sdp, nullptr));
-
-    EXPECT_TRUE(DoSetLocalDescription(std::move(new_offer)));
-    EXPECT_EQ(PeerConnectionInterface::kHaveLocalOffer, observer_.state_);
-    // Wait for the ice_complete message, so that SDP will have candidates.
-    EXPECT_TRUE_WAIT(observer_.ice_complete_, kTimeout);
-  }
-
-  void CreateAnswerAsRemoteDescription(const std::string& sdp) {
-    std::unique_ptr<SessionDescriptionInterface> answer(
-        webrtc::CreateSessionDescription(SessionDescriptionInterface::kAnswer,
-                                         sdp, nullptr));
-    ASSERT_TRUE(answer);
-    EXPECT_TRUE(DoSetRemoteDescription(std::move(answer)));
-    EXPECT_EQ(PeerConnectionInterface::kStable, observer_.state_);
-  }
-
-  void CreatePrAnswerAndAnswerAsRemoteDescription(const std::string& sdp) {
-    std::unique_ptr<SessionDescriptionInterface> pr_answer(
-        webrtc::CreateSessionDescription(SessionDescriptionInterface::kPrAnswer,
-                                         sdp, nullptr));
-    ASSERT_TRUE(pr_answer);
-    EXPECT_TRUE(DoSetRemoteDescription(std::move(pr_answer)));
-    EXPECT_EQ(PeerConnectionInterface::kHaveRemotePrAnswer, observer_.state_);
-    std::unique_ptr<SessionDescriptionInterface> answer(
-        webrtc::CreateSessionDescription(SessionDescriptionInterface::kAnswer,
-                                         sdp, nullptr));
-    ASSERT_TRUE(answer);
-    EXPECT_TRUE(DoSetRemoteDescription(std::move(answer)));
-    EXPECT_EQ(PeerConnectionInterface::kStable, observer_.state_);
-  }
-
-  // Help function used for waiting until a the last signaled remote stream has
-  // the same label as |stream_label|. In a few of the tests in this file we
-  // answer with the same session description as we offer and thus we can
-  // check if OnAddStream have been called with the same stream as we offer to
-  // send.
-  void WaitAndVerifyOnAddStream(const std::string& stream_label) {
-    EXPECT_EQ_WAIT(stream_label, observer_.GetLastAddedStreamLabel(), kTimeout);
-  }
-
-  // Creates an offer and applies it as a local session description.
-  // Creates an answer with the same SDP an the offer but removes all lines
-  // that start with a:ssrc"
-  void CreateOfferReceiveAnswerWithoutSsrc() {
-    CreateOfferAsLocalDescription();
-    std::string sdp;
-    EXPECT_TRUE(pc_->local_description()->ToString(&sdp));
-    SetSsrcToZero(&sdp);
-    CreateAnswerAsRemoteDescription(sdp);
-  }
-
-  // This function creates a MediaStream with label kStreams[0] and
-  // |number_of_audio_tracks| and |number_of_video_tracks| tracks and the
-  // corresponding SessionDescriptionInterface. The SessionDescriptionInterface
-  // is returned and the MediaStream is stored in
-  // |reference_collection_|
-  std::unique_ptr<SessionDescriptionInterface>
-  CreateSessionDescriptionAndReference(size_t number_of_audio_tracks,
-                                       size_t number_of_video_tracks) {
-    EXPECT_LE(number_of_audio_tracks, 2u);
-    EXPECT_LE(number_of_video_tracks, 2u);
-
-    reference_collection_ = StreamCollection::Create();
-    std::string sdp_ms1 = std::string(kSdpStringInit);
-
-    std::string mediastream_label = kStreams[0];
-
-    rtc::scoped_refptr<webrtc::MediaStreamInterface> stream(
-        webrtc::MediaStream::Create(mediastream_label));
-    reference_collection_->AddStream(stream);
-
-    if (number_of_audio_tracks > 0) {
-      sdp_ms1 += std::string(kSdpStringAudio);
-      sdp_ms1 += std::string(kSdpStringMs1Audio0);
-      AddAudioTrack(kAudioTracks[0], stream);
-    }
-    if (number_of_audio_tracks > 1) {
-      sdp_ms1 += kSdpStringMs1Audio1;
-      AddAudioTrack(kAudioTracks[1], stream);
-    }
-
-    if (number_of_video_tracks > 0) {
-      sdp_ms1 += std::string(kSdpStringVideo);
-      sdp_ms1 += std::string(kSdpStringMs1Video0);
-      AddVideoTrack(kVideoTracks[0], stream);
-    }
-    if (number_of_video_tracks > 1) {
-      sdp_ms1 += kSdpStringMs1Video1;
-      AddVideoTrack(kVideoTracks[1], stream);
-    }
-
-    return std::unique_ptr<SessionDescriptionInterface>(
-        webrtc::CreateSessionDescription(SessionDescriptionInterface::kOffer,
-                                         sdp_ms1, nullptr));
-  }
-
-  void AddAudioTrack(const std::string& track_id,
-                     MediaStreamInterface* stream) {
-    rtc::scoped_refptr<webrtc::AudioTrackInterface> audio_track(
-        webrtc::AudioTrack::Create(track_id, nullptr));
-    ASSERT_TRUE(stream->AddTrack(audio_track));
-  }
-
-  void AddVideoTrack(const std::string& track_id,
-                     MediaStreamInterface* stream) {
-    rtc::scoped_refptr<webrtc::VideoTrackInterface> video_track(
-        webrtc::VideoTrack::Create(track_id,
-                                   webrtc::FakeVideoTrackSource::Create(),
-                                   rtc::Thread::Current()));
-    ASSERT_TRUE(stream->AddTrack(video_track));
-  }
-
-  std::unique_ptr<SessionDescriptionInterface> CreateOfferWithOneAudioStream() {
-    CreatePeerConnectionWithoutDtls();
-    AddVoiceStream(kStreamLabel1);
-    std::unique_ptr<SessionDescriptionInterface> offer;
-    EXPECT_TRUE(DoCreateOffer(&offer, nullptr));
-    return offer;
-  }
-
-  std::unique_ptr<SessionDescriptionInterface>
-  CreateAnswerWithOneAudioStream() {
-    EXPECT_TRUE(DoSetRemoteDescription(CreateOfferWithOneAudioStream()));
-    std::unique_ptr<SessionDescriptionInterface> answer;
-    EXPECT_TRUE(DoCreateAnswer(&answer, nullptr));
-    return answer;
-  }
-
-  const std::string& GetFirstAudioStreamCname(
-      const SessionDescriptionInterface* desc) {
-    const cricket::ContentInfo* audio_content =
-        cricket::GetFirstAudioContent(desc->description());
-    const cricket::AudioContentDescription* audio_desc =
-        static_cast<const cricket::AudioContentDescription*>(
-            audio_content->description);
-    return audio_desc->streams()[0].cname;
-  }
-
-  std::unique_ptr<SessionDescriptionInterface> CreateOfferWithOptions(
-      const RTCOfferAnswerOptions& offer_answer_options) {
-    RTC_DCHECK(pc_);
-    rtc::scoped_refptr<MockCreateSessionDescriptionObserver> observer(
-        new rtc::RefCountedObject<MockCreateSessionDescriptionObserver>());
-    pc_->CreateOffer(observer, offer_answer_options);
-    EXPECT_EQ_WAIT(true, observer->called(), kTimeout);
-    return observer->MoveDescription();
-  }
-
-  void CreateOfferWithOptionsAsRemoteDescription(
-      std::unique_ptr<SessionDescriptionInterface>* desc,
-      const RTCOfferAnswerOptions& offer_answer_options) {
-    *desc = CreateOfferWithOptions(offer_answer_options);
-    ASSERT_TRUE(desc != nullptr);
-    std::string sdp;
-    EXPECT_TRUE((*desc)->ToString(&sdp));
-    std::unique_ptr<SessionDescriptionInterface> remote_offer(
-        webrtc::CreateSessionDescription(SessionDescriptionInterface::kOffer,
-                                         sdp, nullptr));
-    EXPECT_TRUE(DoSetRemoteDescription(std::move(remote_offer)));
-    EXPECT_EQ(PeerConnectionInterface::kHaveRemoteOffer, observer_.state_);
-  }
-
-  void CreateOfferWithOptionsAsLocalDescription(
-      std::unique_ptr<SessionDescriptionInterface>* desc,
-      const RTCOfferAnswerOptions& offer_answer_options) {
-    *desc = CreateOfferWithOptions(offer_answer_options);
-    ASSERT_TRUE(desc != nullptr);
-    std::string sdp;
-    EXPECT_TRUE((*desc)->ToString(&sdp));
-    std::unique_ptr<SessionDescriptionInterface> new_offer(
-        webrtc::CreateSessionDescription(SessionDescriptionInterface::kOffer,
-                                         sdp, nullptr));
-
-    EXPECT_TRUE(DoSetLocalDescription(std::move(new_offer)));
-    EXPECT_EQ(PeerConnectionInterface::kHaveLocalOffer, observer_.state_);
-  }
-
-  bool HasCNCodecs(const cricket::ContentInfo* content) {
-    const cricket::ContentDescription* description = content->description;
-    RTC_DCHECK(description);
-    const cricket::AudioContentDescription* audio_content_desc =
-        static_cast<const cricket::AudioContentDescription*>(description);
-    RTC_DCHECK(audio_content_desc);
-    for (size_t i = 0; i < audio_content_desc->codecs().size(); ++i) {
-      if (audio_content_desc->codecs()[i].name == "CN")
-        return true;
-    }
-    return false;
-  }
-
-  std::unique_ptr<rtc::VirtualSocketServer> vss_;
-  rtc::AutoSocketServerThread main_;
-  rtc::scoped_refptr<FakeAudioCaptureModule> fake_audio_capture_module_;
-  cricket::FakePortAllocator* port_allocator_ = nullptr;
-  FakeRTCCertificateGenerator* fake_certificate_generator_ = nullptr;
-  rtc::scoped_refptr<webrtc::PeerConnectionFactoryInterface> pc_factory_;
-  rtc::scoped_refptr<PeerConnectionFactoryForTest> pc_factory_for_test_;
-  rtc::scoped_refptr<PeerConnectionInterface> pc_;
-  MockPeerConnectionObserver observer_;
-  rtc::scoped_refptr<StreamCollection> reference_collection_;
-};
-
-// Test that no callbacks on the PeerConnectionObserver are called after the
-// PeerConnection is closed.
-TEST_F(PeerConnectionInterfaceTest, CloseAndTestCallbackFunctions) {
-  rtc::scoped_refptr<PeerConnectionInterface> pc(
-      pc_factory_for_test_->CreatePeerConnection(
-          PeerConnectionInterface::RTCConfiguration(), nullptr, nullptr,
-          nullptr, &observer_));
-  observer_.SetPeerConnectionInterface(pc.get());
-  pc->Close();
-
-  // No callbacks is expected to be called.
-  observer_.callback_triggered_ = false;
-  std::vector<cricket::Candidate> candidates;
-  pc_factory_for_test_->transport_controller->SignalGatheringState(
-      cricket::IceGatheringState{});
-  pc_factory_for_test_->transport_controller->SignalCandidatesGathered(
-      "", candidates);
-  pc_factory_for_test_->transport_controller->SignalConnectionState(
-      cricket::IceConnectionState{});
-  pc_factory_for_test_->transport_controller->SignalCandidatesRemoved(
-      candidates);
-  pc_factory_for_test_->transport_controller->SignalReceiving(false);
-  EXPECT_FALSE(observer_.callback_triggered_);
-}
-
-// Generate different CNAMEs when PeerConnections are created.
-// The CNAMEs are expected to be generated randomly. It is possible
-// that the test fails, though the possibility is very low.
-TEST_F(PeerConnectionInterfaceTest, CnameGenerationInOffer) {
-  std::unique_ptr<SessionDescriptionInterface> offer1 =
-      CreateOfferWithOneAudioStream();
-  std::unique_ptr<SessionDescriptionInterface> offer2 =
-      CreateOfferWithOneAudioStream();
-  EXPECT_NE(GetFirstAudioStreamCname(offer1.get()),
-            GetFirstAudioStreamCname(offer2.get()));
-}
-
-TEST_F(PeerConnectionInterfaceTest, CnameGenerationInAnswer) {
-  std::unique_ptr<SessionDescriptionInterface> answer1 =
-      CreateAnswerWithOneAudioStream();
-  std::unique_ptr<SessionDescriptionInterface> answer2 =
-      CreateAnswerWithOneAudioStream();
-  EXPECT_NE(GetFirstAudioStreamCname(answer1.get()),
-            GetFirstAudioStreamCname(answer2.get()));
-}
-
-TEST_F(PeerConnectionInterfaceTest,
-       CreatePeerConnectionWithDifferentConfigurations) {
-  CreatePeerConnectionWithDifferentConfigurations();
-}
-
-TEST_F(PeerConnectionInterfaceTest,
-       CreatePeerConnectionWithDifferentIceTransportsTypes) {
-  CreatePeerConnectionWithIceTransportsType(PeerConnectionInterface::kNone);
-  EXPECT_EQ(cricket::CF_NONE, port_allocator_->candidate_filter());
-  CreatePeerConnectionWithIceTransportsType(PeerConnectionInterface::kRelay);
-  EXPECT_EQ(cricket::CF_RELAY, port_allocator_->candidate_filter());
-  CreatePeerConnectionWithIceTransportsType(PeerConnectionInterface::kNoHost);
-  EXPECT_EQ(cricket::CF_ALL & ~cricket::CF_HOST,
-            port_allocator_->candidate_filter());
-  CreatePeerConnectionWithIceTransportsType(PeerConnectionInterface::kAll);
-  EXPECT_EQ(cricket::CF_ALL, port_allocator_->candidate_filter());
-}
-
-// Test that when a PeerConnection is created with a nonzero candidate pool
-// size, the pooled PortAllocatorSession is created with all the attributes
-// in the RTCConfiguration.
-TEST_F(PeerConnectionInterfaceTest, CreatePeerConnectionWithPooledCandidates) {
-  PeerConnectionInterface::RTCConfiguration config;
-  PeerConnectionInterface::IceServer server;
-  server.uri = kStunAddressOnly;
-  config.servers.push_back(server);
-  config.type = PeerConnectionInterface::kRelay;
-  config.disable_ipv6 = true;
-  config.tcp_candidate_policy =
-      PeerConnectionInterface::kTcpCandidatePolicyDisabled;
-  config.candidate_network_policy =
-      PeerConnectionInterface::kCandidateNetworkPolicyLowCost;
-  config.ice_candidate_pool_size = 1;
-  CreatePeerConnection(config, nullptr);
-
-  const cricket::FakePortAllocatorSession* session =
-      static_cast<const cricket::FakePortAllocatorSession*>(
-          port_allocator_->GetPooledSession());
-  ASSERT_NE(nullptr, session);
-  EXPECT_EQ(1UL, session->stun_servers().size());
-  EXPECT_EQ(0U, session->flags() & cricket::PORTALLOCATOR_ENABLE_IPV6);
-  EXPECT_LT(0U, session->flags() & cricket::PORTALLOCATOR_DISABLE_TCP);
-  EXPECT_LT(0U,
-            session->flags() & cricket::PORTALLOCATOR_DISABLE_COSTLY_NETWORKS);
-}
-
-// Test that network-related RTCConfiguration members are applied to the
-// PortAllocator when CreatePeerConnection is called. Specifically:
-// - disable_ipv6_on_wifi
-// - max_ipv6_networks
-// - tcp_candidate_policy
-// - candidate_network_policy
-// - prune_turn_ports
-//
-// Note that the candidate filter (RTCConfiguration::type) is already tested
-// above.
-TEST_F(PeerConnectionInterfaceTest,
-       CreatePeerConnectionAppliesNetworkConfigToPortAllocator) {
-  // Create fake port allocator.
-  std::unique_ptr<cricket::FakePortAllocator> port_allocator(
-      new cricket::FakePortAllocator(rtc::Thread::Current(), nullptr));
-  cricket::FakePortAllocator* raw_port_allocator = port_allocator.get();
-
-  // Create RTCConfiguration with some network-related fields relevant to
-  // PortAllocator populated.
-  PeerConnectionInterface::RTCConfiguration config;
-  config.disable_ipv6_on_wifi = true;
-  config.max_ipv6_networks = 10;
-  config.tcp_candidate_policy =
-      PeerConnectionInterface::kTcpCandidatePolicyDisabled;
-  config.candidate_network_policy =
-      PeerConnectionInterface::kCandidateNetworkPolicyLowCost;
-  config.prune_turn_ports = true;
-
-  // Create the PC factory and PC with the above config.
-  rtc::scoped_refptr<webrtc::PeerConnectionFactoryInterface> pc_factory(
-      webrtc::CreatePeerConnectionFactory(
-          rtc::Thread::Current(), rtc::Thread::Current(),
-          rtc::Thread::Current(), fake_audio_capture_module_, nullptr,
-          nullptr));
-  rtc::scoped_refptr<PeerConnectionInterface> pc(
-      pc_factory->CreatePeerConnection(
-          config, nullptr, std::move(port_allocator), nullptr, &observer_));
-
-  // Now validate that the config fields set above were applied to the
-  // PortAllocator, as flags or otherwise.
-  EXPECT_FALSE(raw_port_allocator->flags() &
-               cricket::PORTALLOCATOR_ENABLE_IPV6_ON_WIFI);
-  EXPECT_EQ(10, raw_port_allocator->max_ipv6_networks());
-  EXPECT_TRUE(raw_port_allocator->flags() & cricket::PORTALLOCATOR_DISABLE_TCP);
-  EXPECT_TRUE(raw_port_allocator->flags() &
-              cricket::PORTALLOCATOR_DISABLE_COSTLY_NETWORKS);
-  EXPECT_TRUE(raw_port_allocator->prune_turn_ports());
-}
-
-// Test that the PeerConnection initializes the port allocator passed into it,
-// and on the correct thread.
-TEST_F(PeerConnectionInterfaceTest,
-       CreatePeerConnectionInitializesPortAllocatorOnNetworkThread) {
-  std::unique_ptr<rtc::Thread> network_thread(
-      rtc::Thread::CreateWithSocketServer());
-  network_thread->Start();
-  rtc::scoped_refptr<webrtc::PeerConnectionFactoryInterface> pc_factory(
-      webrtc::CreatePeerConnectionFactory(
-          network_thread.get(), rtc::Thread::Current(), rtc::Thread::Current(),
-          fake_audio_capture_module_, nullptr, nullptr));
-  std::unique_ptr<cricket::FakePortAllocator> port_allocator(
-      new cricket::FakePortAllocator(network_thread.get(), nullptr));
-  cricket::FakePortAllocator* raw_port_allocator = port_allocator.get();
-  PeerConnectionInterface::RTCConfiguration config;
-  rtc::scoped_refptr<PeerConnectionInterface> pc(
-      pc_factory->CreatePeerConnection(
-          config, nullptr, std::move(port_allocator), nullptr, &observer_));
-  // FakePortAllocator RTC_CHECKs that it's initialized on the right thread,
-  // so all we have to do here is check that it's initialized.
-  EXPECT_TRUE(raw_port_allocator->initialized());
-}
-
-// Check that GetConfiguration returns the configuration the PeerConnection was
-// constructed with, before SetConfiguration is called.
-TEST_F(PeerConnectionInterfaceTest, GetConfigurationAfterCreatePeerConnection) {
-  PeerConnectionInterface::RTCConfiguration config;
-  config.type = PeerConnectionInterface::kRelay;
-  CreatePeerConnection(config, nullptr);
-
-  PeerConnectionInterface::RTCConfiguration returned_config =
-      pc_->GetConfiguration();
-  EXPECT_EQ(PeerConnectionInterface::kRelay, returned_config.type);
-}
-
-// Check that GetConfiguration returns the last configuration passed into
-// SetConfiguration.
-TEST_F(PeerConnectionInterfaceTest, GetConfigurationAfterSetConfiguration) {
-  CreatePeerConnection();
-
-  PeerConnectionInterface::RTCConfiguration config;
-  config.type = PeerConnectionInterface::kRelay;
-  EXPECT_TRUE(pc_->SetConfiguration(config));
-
-  PeerConnectionInterface::RTCConfiguration returned_config =
-      pc_->GetConfiguration();
-  EXPECT_EQ(PeerConnectionInterface::kRelay, returned_config.type);
-}
-
-TEST_F(PeerConnectionInterfaceTest, AddStreams) {
-  CreatePeerConnectionWithoutDtls();
-  AddVideoStream(kStreamLabel1);
-  AddVoiceStream(kStreamLabel2);
-  ASSERT_EQ(2u, pc_->local_streams()->count());
-
-  // Test we can add multiple local streams to one peerconnection.
-  rtc::scoped_refptr<MediaStreamInterface> stream(
-      pc_factory_->CreateLocalMediaStream(kStreamLabel3));
-  rtc::scoped_refptr<AudioTrackInterface> audio_track(
-      pc_factory_->CreateAudioTrack(kStreamLabel3,
-                                    static_cast<AudioSourceInterface*>(NULL)));
-  stream->AddTrack(audio_track.get());
-  EXPECT_TRUE(pc_->AddStream(stream));
-  EXPECT_EQ(3u, pc_->local_streams()->count());
-
-  // Remove the third stream.
-  pc_->RemoveStream(pc_->local_streams()->at(2));
-  EXPECT_EQ(2u, pc_->local_streams()->count());
-
-  // Remove the second stream.
-  pc_->RemoveStream(pc_->local_streams()->at(1));
-  EXPECT_EQ(1u, pc_->local_streams()->count());
-
-  // Remove the first stream.
-  pc_->RemoveStream(pc_->local_streams()->at(0));
-  EXPECT_EQ(0u, pc_->local_streams()->count());
-}
-
-// Test that the created offer includes streams we added.
-TEST_F(PeerConnectionInterfaceTest, AddedStreamsPresentInOffer) {
-  CreatePeerConnectionWithoutDtls();
-  AddAudioVideoStream(kStreamLabel1, "audio_track", "video_track");
-  std::unique_ptr<SessionDescriptionInterface> offer;
-  ASSERT_TRUE(DoCreateOffer(&offer, nullptr));
-
-  const cricket::ContentInfo* audio_content =
-      cricket::GetFirstAudioContent(offer->description());
-  const cricket::AudioContentDescription* audio_desc =
-      static_cast<const cricket::AudioContentDescription*>(
-          audio_content->description);
-  EXPECT_TRUE(
-      ContainsTrack(audio_desc->streams(), kStreamLabel1, "audio_track"));
-
-  const cricket::ContentInfo* video_content =
-      cricket::GetFirstVideoContent(offer->description());
-  const cricket::VideoContentDescription* video_desc =
-      static_cast<const cricket::VideoContentDescription*>(
-          video_content->description);
-  EXPECT_TRUE(
-      ContainsTrack(video_desc->streams(), kStreamLabel1, "video_track"));
-
-  // Add another stream and ensure the offer includes both the old and new
-  // streams.
-  AddAudioVideoStream(kStreamLabel2, "audio_track2", "video_track2");
-  ASSERT_TRUE(DoCreateOffer(&offer, nullptr));
-
-  audio_content = cricket::GetFirstAudioContent(offer->description());
-  audio_desc = static_cast<const cricket::AudioContentDescription*>(
-      audio_content->description);
-  EXPECT_TRUE(
-      ContainsTrack(audio_desc->streams(), kStreamLabel1, "audio_track"));
-  EXPECT_TRUE(
-      ContainsTrack(audio_desc->streams(), kStreamLabel2, "audio_track2"));
-
-  video_content = cricket::GetFirstVideoContent(offer->description());
-  video_desc = static_cast<const cricket::VideoContentDescription*>(
-      video_content->description);
-  EXPECT_TRUE(
-      ContainsTrack(video_desc->streams(), kStreamLabel1, "video_track"));
-  EXPECT_TRUE(
-      ContainsTrack(video_desc->streams(), kStreamLabel2, "video_track2"));
-}
-
-TEST_F(PeerConnectionInterfaceTest, RemoveStream) {
-  CreatePeerConnectionWithoutDtls();
-  AddVideoStream(kStreamLabel1);
-  ASSERT_EQ(1u, pc_->local_streams()->count());
-  pc_->RemoveStream(pc_->local_streams()->at(0));
-  EXPECT_EQ(0u, pc_->local_streams()->count());
-}
-
-// Test for AddTrack and RemoveTrack methods.
-// Tests that the created offer includes tracks we added,
-// and that the RtpSenders are created correctly.
-// Also tests that RemoveTrack removes the tracks from subsequent offers.
-TEST_F(PeerConnectionInterfaceTest, AddTrackRemoveTrack) {
-  CreatePeerConnectionWithoutDtls();
-  // Create a dummy stream, so tracks share a stream label.
-  rtc::scoped_refptr<MediaStreamInterface> stream(
-      pc_factory_->CreateLocalMediaStream(kStreamLabel1));
-  std::vector<MediaStreamInterface*> stream_list;
-  stream_list.push_back(stream.get());
-  rtc::scoped_refptr<AudioTrackInterface> audio_track(
-      pc_factory_->CreateAudioTrack("audio_track", nullptr));
-  rtc::scoped_refptr<VideoTrackInterface> video_track(
-      pc_factory_->CreateVideoTrack(
-          "video_track", pc_factory_->CreateVideoSource(
-                             std::unique_ptr<cricket::VideoCapturer>(
-                                 new cricket::FakeVideoCapturer()))));
-  auto audio_sender = pc_->AddTrack(audio_track, stream_list);
-  auto video_sender = pc_->AddTrack(video_track, stream_list);
-  EXPECT_EQ(1UL, audio_sender->stream_ids().size());
-  EXPECT_EQ(kStreamLabel1, audio_sender->stream_ids()[0]);
-  EXPECT_EQ("audio_track", audio_sender->id());
-  EXPECT_EQ(audio_track, audio_sender->track());
-  EXPECT_EQ(1UL, video_sender->stream_ids().size());
-  EXPECT_EQ(kStreamLabel1, video_sender->stream_ids()[0]);
-  EXPECT_EQ("video_track", video_sender->id());
-  EXPECT_EQ(video_track, video_sender->track());
-
-  // Now create an offer and check for the senders.
-  std::unique_ptr<SessionDescriptionInterface> offer;
-  ASSERT_TRUE(DoCreateOffer(&offer, nullptr));
-
-  const cricket::ContentInfo* audio_content =
-      cricket::GetFirstAudioContent(offer->description());
-  const cricket::AudioContentDescription* audio_desc =
-      static_cast<const cricket::AudioContentDescription*>(
-          audio_content->description);
-  EXPECT_TRUE(
-      ContainsTrack(audio_desc->streams(), kStreamLabel1, "audio_track"));
-
-  const cricket::ContentInfo* video_content =
-      cricket::GetFirstVideoContent(offer->description());
-  const cricket::VideoContentDescription* video_desc =
-      static_cast<const cricket::VideoContentDescription*>(
-          video_content->description);
-  EXPECT_TRUE(
-      ContainsTrack(video_desc->streams(), kStreamLabel1, "video_track"));
-
-  EXPECT_TRUE(DoSetLocalDescription(std::move(offer)));
-
-  // Now try removing the tracks.
-  EXPECT_TRUE(pc_->RemoveTrack(audio_sender));
-  EXPECT_TRUE(pc_->RemoveTrack(video_sender));
-
-  // Create a new offer and ensure it doesn't contain the removed senders.
-  ASSERT_TRUE(DoCreateOffer(&offer, nullptr));
-
-  audio_content = cricket::GetFirstAudioContent(offer->description());
-  audio_desc = static_cast<const cricket::AudioContentDescription*>(
-      audio_content->description);
-  EXPECT_FALSE(
-      ContainsTrack(audio_desc->streams(), kStreamLabel1, "audio_track"));
-
-  video_content = cricket::GetFirstVideoContent(offer->description());
-  video_desc = static_cast<const cricket::VideoContentDescription*>(
-      video_content->description);
-  EXPECT_FALSE(
-      ContainsTrack(video_desc->streams(), kStreamLabel1, "video_track"));
-
-  EXPECT_TRUE(DoSetLocalDescription(std::move(offer)));
-
-  // Calling RemoveTrack on a sender no longer attached to a PeerConnection
-  // should return false.
-  EXPECT_FALSE(pc_->RemoveTrack(audio_sender));
-  EXPECT_FALSE(pc_->RemoveTrack(video_sender));
-}
-
-// Test creating senders without a stream specified,
-// expecting a random stream ID to be generated.
-TEST_F(PeerConnectionInterfaceTest, AddTrackWithoutStream) {
-  CreatePeerConnectionWithoutDtls();
-  // Create a dummy stream, so tracks share a stream label.
-  rtc::scoped_refptr<AudioTrackInterface> audio_track(
-      pc_factory_->CreateAudioTrack("audio_track", nullptr));
-  rtc::scoped_refptr<VideoTrackInterface> video_track(
-      pc_factory_->CreateVideoTrack(
-          "video_track", pc_factory_->CreateVideoSource(
-                             std::unique_ptr<cricket::VideoCapturer>(
-                                 new cricket::FakeVideoCapturer()))));
-  auto audio_sender =
-      pc_->AddTrack(audio_track, std::vector<MediaStreamInterface*>());
-  auto video_sender =
-      pc_->AddTrack(video_track, std::vector<MediaStreamInterface*>());
-  EXPECT_EQ("audio_track", audio_sender->id());
-  EXPECT_EQ(audio_track, audio_sender->track());
-  EXPECT_EQ("video_track", video_sender->id());
-  EXPECT_EQ(video_track, video_sender->track());
-  // If the ID is truly a random GUID, it should be infinitely unlikely they
-  // will be the same.
-  EXPECT_NE(video_sender->stream_ids(), audio_sender->stream_ids());
-}
-
-TEST_F(PeerConnectionInterfaceTest, CreateOfferReceiveAnswer) {
-  InitiateCall();
-  WaitAndVerifyOnAddStream(kStreamLabel1);
-  VerifyRemoteRtpHeaderExtensions();
-}
-
-TEST_F(PeerConnectionInterfaceTest, CreateOfferReceivePrAnswerAndAnswer) {
-  CreatePeerConnectionWithoutDtls();
-  AddVideoStream(kStreamLabel1);
-  CreateOfferAsLocalDescription();
-  std::string offer;
-  EXPECT_TRUE(pc_->local_description()->ToString(&offer));
-  CreatePrAnswerAndAnswerAsRemoteDescription(offer);
-  WaitAndVerifyOnAddStream(kStreamLabel1);
-}
-
-TEST_F(PeerConnectionInterfaceTest, ReceiveOfferCreateAnswer) {
-  CreatePeerConnectionWithoutDtls();
-  AddVideoStream(kStreamLabel1);
-
-  CreateOfferAsRemoteDescription();
-  CreateAnswerAsLocalDescription();
-
-  WaitAndVerifyOnAddStream(kStreamLabel1);
-}
-
-TEST_F(PeerConnectionInterfaceTest, ReceiveOfferCreatePrAnswerAndAnswer) {
-  CreatePeerConnectionWithoutDtls();
-  AddVideoStream(kStreamLabel1);
-
-  CreateOfferAsRemoteDescription();
-  CreatePrAnswerAsLocalDescription();
-  CreateAnswerAsLocalDescription();
-
-  WaitAndVerifyOnAddStream(kStreamLabel1);
-}
-
-TEST_F(PeerConnectionInterfaceTest, Renegotiate) {
-  InitiateCall();
-  ASSERT_EQ(1u, pc_->remote_streams()->count());
-  pc_->RemoveStream(pc_->local_streams()->at(0));
-  CreateOfferReceiveAnswer();
-  EXPECT_EQ(0u, pc_->remote_streams()->count());
-  AddVideoStream(kStreamLabel1);
-  CreateOfferReceiveAnswer();
-}
-
-// Tests that after negotiating an audio only call, the respondent can perform a
-// renegotiation that removes the audio stream.
-TEST_F(PeerConnectionInterfaceTest, RenegotiateAudioOnly) {
-  CreatePeerConnectionWithoutDtls();
-  AddVoiceStream(kStreamLabel1);
-  CreateOfferAsRemoteDescription();
-  CreateAnswerAsLocalDescription();
-
-  ASSERT_EQ(1u, pc_->remote_streams()->count());
-  pc_->RemoveStream(pc_->local_streams()->at(0));
-  CreateOfferReceiveAnswer();
-  EXPECT_EQ(0u, pc_->remote_streams()->count());
-}
-
-// Test that candidates are generated and that we can parse our own candidates.
-TEST_F(PeerConnectionInterfaceTest, IceCandidates) {
-  CreatePeerConnectionWithoutDtls();
-
-  EXPECT_FALSE(pc_->AddIceCandidate(observer_.last_candidate_.get()));
-  // SetRemoteDescription takes ownership of offer.
-  std::unique_ptr<SessionDescriptionInterface> offer;
-  AddVideoStream(kStreamLabel1);
-  EXPECT_TRUE(DoCreateOffer(&offer, nullptr));
-  EXPECT_TRUE(DoSetRemoteDescription(std::move(offer)));
-
-  // SetLocalDescription takes ownership of answer.
-  std::unique_ptr<SessionDescriptionInterface> answer;
-  EXPECT_TRUE(DoCreateAnswer(&answer, nullptr));
-  EXPECT_TRUE(DoSetLocalDescription(std::move(answer)));
-
-  EXPECT_TRUE_WAIT(observer_.last_candidate_.get() != NULL, kTimeout);
-  EXPECT_TRUE_WAIT(observer_.ice_complete_, kTimeout);
-
-  EXPECT_TRUE(pc_->AddIceCandidate(observer_.last_candidate_.get()));
-}
-
-// Test that CreateOffer and CreateAnswer will fail if the track labels are
-// not unique.
-TEST_F(PeerConnectionInterfaceTest, CreateOfferAnswerWithInvalidStream) {
-  CreatePeerConnectionWithoutDtls();
-  // Create a regular offer for the CreateAnswer test later.
-  std::unique_ptr<SessionDescriptionInterface> offer;
-  EXPECT_TRUE(DoCreateOffer(&offer, nullptr));
-  EXPECT_TRUE(offer);
-  offer.reset();
-
-  // Create a local stream with audio&video tracks having same label.
-  AddAudioVideoStream(kStreamLabel1, "track_label", "track_label");
-
-  // Test CreateOffer
-  EXPECT_FALSE(DoCreateOffer(&offer, nullptr));
-
-  // Test CreateAnswer
-  std::unique_ptr<SessionDescriptionInterface> answer;
-  EXPECT_FALSE(DoCreateAnswer(&answer, nullptr));
-}
-
-// Test that we will get different SSRCs for each tracks in the offer and answer
-// we created.
-TEST_F(PeerConnectionInterfaceTest, SsrcInOfferAnswer) {
-  CreatePeerConnectionWithoutDtls();
-  // Create a local stream with audio&video tracks having different labels.
-  AddAudioVideoStream(kStreamLabel1, "audio_label", "video_label");
-
-  // Test CreateOffer
-  std::unique_ptr<SessionDescriptionInterface> offer;
-  ASSERT_TRUE(DoCreateOffer(&offer, nullptr));
-  int audio_ssrc = 0;
-  int video_ssrc = 0;
-  EXPECT_TRUE(GetFirstSsrc(GetFirstAudioContent(offer->description()),
-                           &audio_ssrc));
-  EXPECT_TRUE(GetFirstSsrc(GetFirstVideoContent(offer->description()),
-                           &video_ssrc));
-  EXPECT_NE(audio_ssrc, video_ssrc);
-
-  // Test CreateAnswer
-  EXPECT_TRUE(DoSetRemoteDescription(std::move(offer)));
-  std::unique_ptr<SessionDescriptionInterface> answer;
-  ASSERT_TRUE(DoCreateAnswer(&answer, nullptr));
-  audio_ssrc = 0;
-  video_ssrc = 0;
-  EXPECT_TRUE(GetFirstSsrc(GetFirstAudioContent(answer->description()),
-                           &audio_ssrc));
-  EXPECT_TRUE(GetFirstSsrc(GetFirstVideoContent(answer->description()),
-                           &video_ssrc));
-  EXPECT_NE(audio_ssrc, video_ssrc);
-}
-
-// Test that it's possible to call AddTrack on a MediaStream after adding
-// the stream to a PeerConnection.
-// TODO(deadbeef): Remove this test once this behavior is no longer supported.
-TEST_F(PeerConnectionInterfaceTest, AddTrackAfterAddStream) {
-  CreatePeerConnectionWithoutDtls();
-  // Create audio stream and add to PeerConnection.
-  AddVoiceStream(kStreamLabel1);
-  MediaStreamInterface* stream = pc_->local_streams()->at(0);
-
-  // Add video track to the audio-only stream.
-  rtc::scoped_refptr<VideoTrackInterface> video_track(
-      pc_factory_->CreateVideoTrack(
-          "video_label", pc_factory_->CreateVideoSource(
-                             std::unique_ptr<cricket::VideoCapturer>(
-                                 new cricket::FakeVideoCapturer()))));
-  stream->AddTrack(video_track.get());
-
-  std::unique_ptr<SessionDescriptionInterface> offer;
-  ASSERT_TRUE(DoCreateOffer(&offer, nullptr));
-
-  const cricket::MediaContentDescription* video_desc =
-      cricket::GetFirstVideoContentDescription(offer->description());
-  EXPECT_TRUE(video_desc != nullptr);
-}
-
-// Test that it's possible to call RemoveTrack on a MediaStream after adding
-// the stream to a PeerConnection.
-// TODO(deadbeef): Remove this test once this behavior is no longer supported.
-TEST_F(PeerConnectionInterfaceTest, RemoveTrackAfterAddStream) {
-  CreatePeerConnectionWithoutDtls();
-  // Create audio/video stream and add to PeerConnection.
-  AddAudioVideoStream(kStreamLabel1, "audio_label", "video_label");
-  MediaStreamInterface* stream = pc_->local_streams()->at(0);
-
-  // Remove the video track.
-  stream->RemoveTrack(stream->GetVideoTracks()[0]);
-
-  std::unique_ptr<SessionDescriptionInterface> offer;
-  ASSERT_TRUE(DoCreateOffer(&offer, nullptr));
-
-  const cricket::MediaContentDescription* video_desc =
-      cricket::GetFirstVideoContentDescription(offer->description());
-  EXPECT_TRUE(video_desc == nullptr);
-}
-
-// Verify that CreateDtmfSender only succeeds if called with a valid local
-// track. Other aspects of DtmfSenders are tested in
-// peerconnection_integrationtest.cc.
-TEST_F(PeerConnectionInterfaceTest, CreateDtmfSenderWithInvalidParams) {
-  CreatePeerConnection();
-  AddAudioVideoStream(kStreamLabel1, "audio_label", "video_label");
-  EXPECT_EQ(nullptr, pc_->CreateDtmfSender(nullptr));
-  rtc::scoped_refptr<webrtc::AudioTrackInterface> non_localtrack(
-      pc_factory_->CreateAudioTrack("dummy_track", nullptr));
-  EXPECT_EQ(nullptr, pc_->CreateDtmfSender(non_localtrack));
-}
-
-// Test creating a sender with a stream ID, and ensure the ID is populated
-// in the offer.
-TEST_F(PeerConnectionInterfaceTest, CreateSenderWithStream) {
-  CreatePeerConnectionWithoutDtls();
-  pc_->CreateSender("video", kStreamLabel1);
-
-  std::unique_ptr<SessionDescriptionInterface> offer;
-  ASSERT_TRUE(DoCreateOffer(&offer, nullptr));
-
-  const cricket::MediaContentDescription* video_desc =
-      cricket::GetFirstVideoContentDescription(offer->description());
-  ASSERT_TRUE(video_desc != nullptr);
-  ASSERT_EQ(1u, video_desc->streams().size());
-  EXPECT_EQ(kStreamLabel1, video_desc->streams()[0].sync_label);
-}
-
-// Test that we can specify a certain track that we want statistics about.
-TEST_F(PeerConnectionInterfaceTest, GetStatsForSpecificTrack) {
-  InitiateCall();
-  ASSERT_LT(0u, pc_->remote_streams()->count());
-  ASSERT_LT(0u, pc_->remote_streams()->at(0)->GetAudioTracks().size());
-  rtc::scoped_refptr<MediaStreamTrackInterface> remote_audio =
-      pc_->remote_streams()->at(0)->GetAudioTracks()[0];
-  EXPECT_TRUE(DoGetStats(remote_audio));
-
-  // Remove the stream. Since we are sending to our selves the local
-  // and the remote stream is the same.
-  pc_->RemoveStream(pc_->local_streams()->at(0));
-  // Do a re-negotiation.
-  CreateOfferReceiveAnswer();
-
-  ASSERT_EQ(0u, pc_->remote_streams()->count());
-
-  // Test that we still can get statistics for the old track. Even if it is not
-  // sent any longer.
-  EXPECT_TRUE(DoGetStats(remote_audio));
-}
-
-// Test that we can get stats on a video track.
-TEST_F(PeerConnectionInterfaceTest, GetStatsForVideoTrack) {
-  InitiateCall();
-  ASSERT_LT(0u, pc_->remote_streams()->count());
-  ASSERT_LT(0u, pc_->remote_streams()->at(0)->GetVideoTracks().size());
-  rtc::scoped_refptr<MediaStreamTrackInterface> remote_video =
-      pc_->remote_streams()->at(0)->GetVideoTracks()[0];
-  EXPECT_TRUE(DoGetStats(remote_video));
-}
-
-// Test that we don't get statistics for an invalid track.
-TEST_F(PeerConnectionInterfaceTest, GetStatsForInvalidTrack) {
-  InitiateCall();
-  rtc::scoped_refptr<AudioTrackInterface> unknown_audio_track(
-      pc_factory_->CreateAudioTrack("unknown track", NULL));
-  EXPECT_FALSE(DoGetStats(unknown_audio_track));
-}
-
-// This test setup two RTP data channels in loop back.
-TEST_F(PeerConnectionInterfaceTest, TestDataChannel) {
-  FakeConstraints constraints;
-  constraints.SetAllowRtpDataChannels();
-  CreatePeerConnection(&constraints);
-  rtc::scoped_refptr<DataChannelInterface> data1 =
-      pc_->CreateDataChannel("test1", NULL);
-  rtc::scoped_refptr<DataChannelInterface> data2 =
-      pc_->CreateDataChannel("test2", NULL);
-  ASSERT_TRUE(data1 != NULL);
-  std::unique_ptr<MockDataChannelObserver> observer1(
-      new MockDataChannelObserver(data1));
-  std::unique_ptr<MockDataChannelObserver> observer2(
-      new MockDataChannelObserver(data2));
-
-  EXPECT_EQ(DataChannelInterface::kConnecting, data1->state());
-  EXPECT_EQ(DataChannelInterface::kConnecting, data2->state());
-  std::string data_to_send1 = "testing testing";
-  std::string data_to_send2 = "testing something else";
-  EXPECT_FALSE(data1->Send(DataBuffer(data_to_send1)));
-
-  CreateOfferReceiveAnswer();
-  EXPECT_TRUE_WAIT(observer1->IsOpen(), kTimeout);
-  EXPECT_TRUE_WAIT(observer2->IsOpen(), kTimeout);
-
-  EXPECT_EQ(DataChannelInterface::kOpen, data1->state());
-  EXPECT_EQ(DataChannelInterface::kOpen, data2->state());
-  EXPECT_TRUE(data1->Send(DataBuffer(data_to_send1)));
-  EXPECT_TRUE(data2->Send(DataBuffer(data_to_send2)));
-
-  EXPECT_EQ_WAIT(data_to_send1, observer1->last_message(), kTimeout);
-  EXPECT_EQ_WAIT(data_to_send2, observer2->last_message(), kTimeout);
-
-  data1->Close();
-  EXPECT_EQ(DataChannelInterface::kClosing, data1->state());
-  CreateOfferReceiveAnswer();
-  EXPECT_FALSE(observer1->IsOpen());
-  EXPECT_EQ(DataChannelInterface::kClosed, data1->state());
-  EXPECT_TRUE(observer2->IsOpen());
-
-  data_to_send2 = "testing something else again";
-  EXPECT_TRUE(data2->Send(DataBuffer(data_to_send2)));
-
-  EXPECT_EQ_WAIT(data_to_send2, observer2->last_message(), kTimeout);
-}
-
-// This test verifies that sendnig binary data over RTP data channels should
-// fail.
-TEST_F(PeerConnectionInterfaceTest, TestSendBinaryOnRtpDataChannel) {
-  FakeConstraints constraints;
-  constraints.SetAllowRtpDataChannels();
-  CreatePeerConnection(&constraints);
-  rtc::scoped_refptr<DataChannelInterface> data1 =
-      pc_->CreateDataChannel("test1", NULL);
-  rtc::scoped_refptr<DataChannelInterface> data2 =
-      pc_->CreateDataChannel("test2", NULL);
-  ASSERT_TRUE(data1 != NULL);
-  std::unique_ptr<MockDataChannelObserver> observer1(
-      new MockDataChannelObserver(data1));
-  std::unique_ptr<MockDataChannelObserver> observer2(
-      new MockDataChannelObserver(data2));
-
-  EXPECT_EQ(DataChannelInterface::kConnecting, data1->state());
-  EXPECT_EQ(DataChannelInterface::kConnecting, data2->state());
-
-  CreateOfferReceiveAnswer();
-  EXPECT_TRUE_WAIT(observer1->IsOpen(), kTimeout);
-  EXPECT_TRUE_WAIT(observer2->IsOpen(), kTimeout);
-
-  EXPECT_EQ(DataChannelInterface::kOpen, data1->state());
-  EXPECT_EQ(DataChannelInterface::kOpen, data2->state());
-
-  rtc::CopyOnWriteBuffer buffer("test", 4);
-  EXPECT_FALSE(data1->Send(DataBuffer(buffer, true)));
-}
-
-// This test setup a RTP data channels in loop back and test that a channel is
-// opened even if the remote end answer with a zero SSRC.
-TEST_F(PeerConnectionInterfaceTest, TestSendOnlyDataChannel) {
-  FakeConstraints constraints;
-  constraints.SetAllowRtpDataChannels();
-  CreatePeerConnection(&constraints);
-  rtc::scoped_refptr<DataChannelInterface> data1 =
-      pc_->CreateDataChannel("test1", NULL);
-  std::unique_ptr<MockDataChannelObserver> observer1(
-      new MockDataChannelObserver(data1));
-
-  CreateOfferReceiveAnswerWithoutSsrc();
-
-  EXPECT_TRUE_WAIT(observer1->IsOpen(), kTimeout);
-
-  data1->Close();
-  EXPECT_EQ(DataChannelInterface::kClosing, data1->state());
-  CreateOfferReceiveAnswerWithoutSsrc();
-  EXPECT_EQ(DataChannelInterface::kClosed, data1->state());
-  EXPECT_FALSE(observer1->IsOpen());
-}
-
-// This test that if a data channel is added in an answer a receive only channel
-// channel is created.
-TEST_F(PeerConnectionInterfaceTest, TestReceiveOnlyDataChannel) {
-  FakeConstraints constraints;
-  constraints.SetAllowRtpDataChannels();
-  CreatePeerConnection(&constraints);
-
-  std::string offer_label = "offer_channel";
-  rtc::scoped_refptr<DataChannelInterface> offer_channel =
-      pc_->CreateDataChannel(offer_label, NULL);
-
-  CreateOfferAsLocalDescription();
-
-  // Replace the data channel label in the offer and apply it as an answer.
-  std::string receive_label = "answer_channel";
-  std::string sdp;
-  EXPECT_TRUE(pc_->local_description()->ToString(&sdp));
-  rtc::replace_substrs(offer_label.c_str(), offer_label.length(),
-                             receive_label.c_str(), receive_label.length(),
-                             &sdp);
-  CreateAnswerAsRemoteDescription(sdp);
-
-  // Verify that a new incoming data channel has been created and that
-  // it is open but can't we written to.
-  ASSERT_TRUE(observer_.last_datachannel_ != NULL);
-  DataChannelInterface* received_channel = observer_.last_datachannel_;
-  EXPECT_EQ(DataChannelInterface::kConnecting, received_channel->state());
-  EXPECT_EQ(receive_label, received_channel->label());
-  EXPECT_FALSE(received_channel->Send(DataBuffer("something")));
-
-  // Verify that the channel we initially offered has been rejected.
-  EXPECT_EQ(DataChannelInterface::kClosed, offer_channel->state());
-
-  // Do another offer / answer exchange and verify that the data channel is
-  // opened.
-  CreateOfferReceiveAnswer();
-  EXPECT_EQ_WAIT(DataChannelInterface::kOpen, received_channel->state(),
-                 kTimeout);
-}
-
-// This test that no data channel is returned if a reliable channel is
-// requested.
-// TODO(perkj): Remove this test once reliable channels are implemented.
-TEST_F(PeerConnectionInterfaceTest, CreateReliableRtpDataChannelShouldFail) {
-  FakeConstraints constraints;
-  constraints.SetAllowRtpDataChannels();
-  CreatePeerConnection(&constraints);
-
-  std::string label = "test";
-  webrtc::DataChannelInit config;
-  config.reliable = true;
-  rtc::scoped_refptr<DataChannelInterface> channel =
-      pc_->CreateDataChannel(label, &config);
-  EXPECT_TRUE(channel == NULL);
-}
-
-// Verifies that duplicated label is not allowed for RTP data channel.
-TEST_F(PeerConnectionInterfaceTest, RtpDuplicatedLabelNotAllowed) {
-  FakeConstraints constraints;
-  constraints.SetAllowRtpDataChannels();
-  CreatePeerConnection(&constraints);
-
-  std::string label = "test";
-  rtc::scoped_refptr<DataChannelInterface> channel =
-      pc_->CreateDataChannel(label, nullptr);
-  EXPECT_NE(channel, nullptr);
-
-  rtc::scoped_refptr<DataChannelInterface> dup_channel =
-      pc_->CreateDataChannel(label, nullptr);
-  EXPECT_EQ(dup_channel, nullptr);
-}
-
-// This tests that a SCTP data channel is returned using different
-// DataChannelInit configurations.
-TEST_F(PeerConnectionInterfaceTest, CreateSctpDataChannel) {
-  FakeConstraints constraints;
-  constraints.SetAllowDtlsSctpDataChannels();
-  CreatePeerConnection(&constraints);
-
-  webrtc::DataChannelInit config;
-
-  rtc::scoped_refptr<DataChannelInterface> channel =
-      pc_->CreateDataChannel("1", &config);
-  EXPECT_TRUE(channel != NULL);
-  EXPECT_TRUE(channel->reliable());
-  EXPECT_TRUE(observer_.renegotiation_needed_);
-  observer_.renegotiation_needed_ = false;
-
-  config.ordered = false;
-  channel = pc_->CreateDataChannel("2", &config);
-  EXPECT_TRUE(channel != NULL);
-  EXPECT_TRUE(channel->reliable());
-  EXPECT_FALSE(observer_.renegotiation_needed_);
-
-  config.ordered = true;
-  config.maxRetransmits = 0;
-  channel = pc_->CreateDataChannel("3", &config);
-  EXPECT_TRUE(channel != NULL);
-  EXPECT_FALSE(channel->reliable());
-  EXPECT_FALSE(observer_.renegotiation_needed_);
-
-  config.maxRetransmits = -1;
-  config.maxRetransmitTime = 0;
-  channel = pc_->CreateDataChannel("4", &config);
-  EXPECT_TRUE(channel != NULL);
-  EXPECT_FALSE(channel->reliable());
-  EXPECT_FALSE(observer_.renegotiation_needed_);
-}
-
-// This tests that no data channel is returned if both maxRetransmits and
-// maxRetransmitTime are set for SCTP data channels.
-TEST_F(PeerConnectionInterfaceTest,
-       CreateSctpDataChannelShouldFailForInvalidConfig) {
-  FakeConstraints constraints;
-  constraints.SetAllowDtlsSctpDataChannels();
-  CreatePeerConnection(&constraints);
-
-  std::string label = "test";
-  webrtc::DataChannelInit config;
-  config.maxRetransmits = 0;
-  config.maxRetransmitTime = 0;
-
-  rtc::scoped_refptr<DataChannelInterface> channel =
-      pc_->CreateDataChannel(label, &config);
-  EXPECT_TRUE(channel == NULL);
-}
-
-// The test verifies that creating a SCTP data channel with an id already in use
-// or out of range should fail.
-TEST_F(PeerConnectionInterfaceTest,
-       CreateSctpDataChannelWithInvalidIdShouldFail) {
-  FakeConstraints constraints;
-  constraints.SetAllowDtlsSctpDataChannels();
-  CreatePeerConnection(&constraints);
-
-  webrtc::DataChannelInit config;
-  rtc::scoped_refptr<DataChannelInterface> channel;
-
-  config.id = 1;
-  channel = pc_->CreateDataChannel("1", &config);
-  EXPECT_TRUE(channel != NULL);
-  EXPECT_EQ(1, channel->id());
-
-  channel = pc_->CreateDataChannel("x", &config);
-  EXPECT_TRUE(channel == NULL);
-
-  config.id = cricket::kMaxSctpSid;
-  channel = pc_->CreateDataChannel("max", &config);
-  EXPECT_TRUE(channel != NULL);
-  EXPECT_EQ(config.id, channel->id());
-
-  config.id = cricket::kMaxSctpSid + 1;
-  channel = pc_->CreateDataChannel("x", &config);
-  EXPECT_TRUE(channel == NULL);
-}
-
-// Verifies that duplicated label is allowed for SCTP data channel.
-TEST_F(PeerConnectionInterfaceTest, SctpDuplicatedLabelAllowed) {
-  FakeConstraints constraints;
-  constraints.AddMandatory(webrtc::MediaConstraintsInterface::kEnableDtlsSrtp,
-                           true);
-  CreatePeerConnection(&constraints);
-
-  std::string label = "test";
-  rtc::scoped_refptr<DataChannelInterface> channel =
-      pc_->CreateDataChannel(label, nullptr);
-  EXPECT_NE(channel, nullptr);
-
-  rtc::scoped_refptr<DataChannelInterface> dup_channel =
-      pc_->CreateDataChannel(label, nullptr);
-  EXPECT_NE(dup_channel, nullptr);
-}
-
-// This test verifies that OnRenegotiationNeeded is fired for every new RTP
-// DataChannel.
-TEST_F(PeerConnectionInterfaceTest, RenegotiationNeededForNewRtpDataChannel) {
-  FakeConstraints constraints;
-  constraints.SetAllowRtpDataChannels();
-  CreatePeerConnection(&constraints);
-
-  rtc::scoped_refptr<DataChannelInterface> dc1 =
-      pc_->CreateDataChannel("test1", NULL);
-  EXPECT_TRUE(observer_.renegotiation_needed_);
-  observer_.renegotiation_needed_ = false;
-
-  rtc::scoped_refptr<DataChannelInterface> dc2 =
-      pc_->CreateDataChannel("test2", NULL);
-  EXPECT_TRUE(observer_.renegotiation_needed_);
-}
-
-// This test that a data channel closes when a PeerConnection is deleted/closed.
-TEST_F(PeerConnectionInterfaceTest, DataChannelCloseWhenPeerConnectionClose) {
-  FakeConstraints constraints;
-  constraints.SetAllowRtpDataChannels();
-  CreatePeerConnection(&constraints);
-
-  rtc::scoped_refptr<DataChannelInterface> data1 =
-      pc_->CreateDataChannel("test1", NULL);
-  rtc::scoped_refptr<DataChannelInterface> data2 =
-      pc_->CreateDataChannel("test2", NULL);
-  ASSERT_TRUE(data1 != NULL);
-  std::unique_ptr<MockDataChannelObserver> observer1(
-      new MockDataChannelObserver(data1));
-  std::unique_ptr<MockDataChannelObserver> observer2(
-      new MockDataChannelObserver(data2));
-
-  CreateOfferReceiveAnswer();
-  EXPECT_TRUE_WAIT(observer1->IsOpen(), kTimeout);
-  EXPECT_TRUE_WAIT(observer2->IsOpen(), kTimeout);
-
-  ReleasePeerConnection();
-  EXPECT_EQ(DataChannelInterface::kClosed, data1->state());
-  EXPECT_EQ(DataChannelInterface::kClosed, data2->state());
-}
-
-// This test that data channels can be rejected in an answer.
-TEST_F(PeerConnectionInterfaceTest, TestRejectDataChannelInAnswer) {
-  FakeConstraints constraints;
-  constraints.SetAllowRtpDataChannels();
-  CreatePeerConnection(&constraints);
-
-  rtc::scoped_refptr<DataChannelInterface> offer_channel(
-      pc_->CreateDataChannel("offer_channel", NULL));
-
-  CreateOfferAsLocalDescription();
-
-  // Create an answer where the m-line for data channels are rejected.
-  std::string sdp;
-  EXPECT_TRUE(pc_->local_description()->ToString(&sdp));
-  std::unique_ptr<SessionDescriptionInterface> answer(
-      webrtc::CreateSessionDescription(SessionDescriptionInterface::kAnswer,
-                                       sdp, nullptr));
-  ASSERT_TRUE(answer);
-  cricket::ContentInfo* data_info =
-      answer->description()->GetContentByName("data");
-  data_info->rejected = true;
-
-  DoSetRemoteDescription(std::move(answer));
-  EXPECT_EQ(DataChannelInterface::kClosed, offer_channel->state());
-}
-
-// Test that we can create a session description from an SDP string from
-// FireFox, use it as a remote session description, generate an answer and use
-// the answer as a local description.
-TEST_F(PeerConnectionInterfaceTest, ReceiveFireFoxOffer) {
-  FakeConstraints constraints;
-  constraints.AddMandatory(webrtc::MediaConstraintsInterface::kEnableDtlsSrtp,
-                           true);
-  CreatePeerConnection(&constraints);
-  AddAudioVideoStream(kStreamLabel1, "audio_label", "video_label");
-  std::unique_ptr<SessionDescriptionInterface> desc(
-      webrtc::CreateSessionDescription(SessionDescriptionInterface::kOffer,
-                                       webrtc::kFireFoxSdpOffer, nullptr));
-  EXPECT_TRUE(DoSetSessionDescription(std::move(desc), false));
-  CreateAnswerAsLocalDescription();
-  ASSERT_TRUE(pc_->local_description() != NULL);
-  ASSERT_TRUE(pc_->remote_description() != NULL);
-
-  const cricket::ContentInfo* content =
-      cricket::GetFirstAudioContent(pc_->local_description()->description());
-  ASSERT_TRUE(content != NULL);
-  EXPECT_FALSE(content->rejected);
-
-  content =
-      cricket::GetFirstVideoContent(pc_->local_description()->description());
-  ASSERT_TRUE(content != NULL);
-  EXPECT_FALSE(content->rejected);
-#ifdef HAVE_SCTP
-  content =
-      cricket::GetFirstDataContent(pc_->local_description()->description());
-  ASSERT_TRUE(content != NULL);
-  EXPECT_TRUE(content->rejected);
-#endif
-}
-
-// Test that an offer can be received which offers DTLS with SDES fallback.
-// Regression test for issue:
-// https://bugs.chromium.org/p/webrtc/issues/detail?id=6972
-TEST_F(PeerConnectionInterfaceTest, ReceiveDtlsSdesFallbackOffer) {
-  FakeConstraints constraints;
-  constraints.AddMandatory(webrtc::MediaConstraintsInterface::kEnableDtlsSrtp,
-                           true);
-  CreatePeerConnection(&constraints);
-  // Wait for fake certificate to be generated. Previously, this is what caused
-  // the "a=crypto" lines to be rejected.
-  AddAudioVideoStream(kStreamLabel1, "audio_label", "video_label");
-  ASSERT_NE(nullptr, fake_certificate_generator_);
-  EXPECT_EQ_WAIT(1, fake_certificate_generator_->generated_certificates(),
-                 kTimeout);
-  std::unique_ptr<SessionDescriptionInterface> desc(
-      webrtc::CreateSessionDescription(SessionDescriptionInterface::kOffer,
-                                       kDtlsSdesFallbackSdp, nullptr));
-  EXPECT_TRUE(DoSetSessionDescription(std::move(desc), false));
-  CreateAnswerAsLocalDescription();
-}
-
-// Test that we can create an audio only offer and receive an answer with a
-// limited set of audio codecs and receive an updated offer with more audio
-// codecs, where the added codecs are not supported.
-TEST_F(PeerConnectionInterfaceTest, ReceiveUpdatedAudioOfferWithBadCodecs) {
-  CreatePeerConnectionWithoutDtls();
-  AddVoiceStream("audio_label");
-  CreateOfferAsLocalDescription();
-
-  std::unique_ptr<SessionDescriptionInterface> answer(
-      webrtc::CreateSessionDescription(SessionDescriptionInterface::kAnswer,
-                                       webrtc::kAudioSdp, nullptr));
-  EXPECT_TRUE(DoSetSessionDescription(std::move(answer), false));
-
-  std::unique_ptr<SessionDescriptionInterface> updated_offer(
-      webrtc::CreateSessionDescription(SessionDescriptionInterface::kOffer,
-                                       webrtc::kAudioSdpWithUnsupportedCodecs,
-                                       nullptr));
-  EXPECT_TRUE(DoSetSessionDescription(std::move(updated_offer), false));
-  CreateAnswerAsLocalDescription();
-}
-
-// Test that if we're receiving (but not sending) a track, subsequent offers
-// will have m-lines with a=recvonly.
-TEST_F(PeerConnectionInterfaceTest, CreateSubsequentRecvOnlyOffer) {
-  FakeConstraints constraints;
-  constraints.AddMandatory(webrtc::MediaConstraintsInterface::kEnableDtlsSrtp,
-                           true);
-  CreatePeerConnection(&constraints);
-  CreateAndSetRemoteOffer(kSdpStringWithStream1);
-  CreateAnswerAsLocalDescription();
-
-  // At this point we should be receiving stream 1, but not sending anything.
-  // A new offer should be recvonly.
-  std::unique_ptr<SessionDescriptionInterface> offer;
-  DoCreateOffer(&offer, nullptr);
-
-  const cricket::ContentInfo* video_content =
-      cricket::GetFirstVideoContent(offer->description());
-  const cricket::VideoContentDescription* video_desc =
-      static_cast<const cricket::VideoContentDescription*>(
-          video_content->description);
-  ASSERT_EQ(cricket::MD_RECVONLY, video_desc->direction());
-
-  const cricket::ContentInfo* audio_content =
-      cricket::GetFirstAudioContent(offer->description());
-  const cricket::AudioContentDescription* audio_desc =
-      static_cast<const cricket::AudioContentDescription*>(
-          audio_content->description);
-  ASSERT_EQ(cricket::MD_RECVONLY, audio_desc->direction());
-}
-
-// Test that if we're receiving (but not sending) a track, and the
-// offerToReceiveVideo/offerToReceiveAudio constraints are explicitly set to
-// false, the generated m-lines will be a=inactive.
-TEST_F(PeerConnectionInterfaceTest, CreateSubsequentInactiveOffer) {
-  FakeConstraints constraints;
-  constraints.AddMandatory(webrtc::MediaConstraintsInterface::kEnableDtlsSrtp,
-                           true);
-  CreatePeerConnection(&constraints);
-  CreateAndSetRemoteOffer(kSdpStringWithStream1);
-  CreateAnswerAsLocalDescription();
-
-  // At this point we should be receiving stream 1, but not sending anything.
-  // A new offer would be recvonly, but we'll set the "no receive" constraints
-  // to make it inactive.
-  std::unique_ptr<SessionDescriptionInterface> offer;
-  FakeConstraints offer_constraints;
-  offer_constraints.AddMandatory(
-      webrtc::MediaConstraintsInterface::kOfferToReceiveVideo, false);
-  offer_constraints.AddMandatory(
-      webrtc::MediaConstraintsInterface::kOfferToReceiveAudio, false);
-  DoCreateOffer(&offer, &offer_constraints);
-
-  const cricket::ContentInfo* video_content =
-      cricket::GetFirstVideoContent(offer->description());
-  const cricket::VideoContentDescription* video_desc =
-      static_cast<const cricket::VideoContentDescription*>(
-          video_content->description);
-  ASSERT_EQ(cricket::MD_INACTIVE, video_desc->direction());
-
-  const cricket::ContentInfo* audio_content =
-      cricket::GetFirstAudioContent(offer->description());
-  const cricket::AudioContentDescription* audio_desc =
-      static_cast<const cricket::AudioContentDescription*>(
-          audio_content->description);
-  ASSERT_EQ(cricket::MD_INACTIVE, audio_desc->direction());
-}
-
-// Test that we can use SetConfiguration to change the ICE servers of the
-// PortAllocator.
-TEST_F(PeerConnectionInterfaceTest, SetConfigurationChangesIceServers) {
-  CreatePeerConnection();
-
-  PeerConnectionInterface::RTCConfiguration config;
-  PeerConnectionInterface::IceServer server;
-  server.uri = "stun:test_hostname";
-  config.servers.push_back(server);
-  EXPECT_TRUE(pc_->SetConfiguration(config));
-
-  EXPECT_EQ(1u, port_allocator_->stun_servers().size());
-  EXPECT_EQ("test_hostname",
-            port_allocator_->stun_servers().begin()->hostname());
-}
-
-TEST_F(PeerConnectionInterfaceTest, SetConfigurationChangesCandidateFilter) {
-  CreatePeerConnection();
-  PeerConnectionInterface::RTCConfiguration config;
-  config.type = PeerConnectionInterface::kRelay;
-  EXPECT_TRUE(pc_->SetConfiguration(config));
-  EXPECT_EQ(cricket::CF_RELAY, port_allocator_->candidate_filter());
-}
-
-TEST_F(PeerConnectionInterfaceTest, SetConfigurationChangesPruneTurnPortsFlag) {
-  PeerConnectionInterface::RTCConfiguration config;
-  config.prune_turn_ports = false;
-  CreatePeerConnection(config, nullptr);
-  EXPECT_FALSE(port_allocator_->prune_turn_ports());
-
-  config.prune_turn_ports = true;
-  EXPECT_TRUE(pc_->SetConfiguration(config));
-  EXPECT_TRUE(port_allocator_->prune_turn_ports());
-}
-
-// Test that the ice check interval can be changed. This does not verify that
-// the setting makes it all the way to P2PTransportChannel, as that would
-// require a very complex set of mocks.
-TEST_F(PeerConnectionInterfaceTest, SetConfigurationChangesIceCheckInterval) {
-  PeerConnectionInterface::RTCConfiguration config;
-  config.ice_check_min_interval = rtc::Optional<int>();
-  CreatePeerConnection(config, nullptr);
-  config.ice_check_min_interval = rtc::Optional<int>(100);
-  EXPECT_TRUE(pc_->SetConfiguration(config));
-  PeerConnectionInterface::RTCConfiguration new_config =
-      pc_->GetConfiguration();
-  EXPECT_EQ(new_config.ice_check_min_interval, rtc::Optional<int>(100));
-}
-
-// Test that when SetConfiguration changes both the pool size and other
-// attributes, the pooled session is created with the updated attributes.
-TEST_F(PeerConnectionInterfaceTest,
-       SetConfigurationCreatesPooledSessionCorrectly) {
-  CreatePeerConnection();
-  PeerConnectionInterface::RTCConfiguration config;
-  config.ice_candidate_pool_size = 1;
-  PeerConnectionInterface::IceServer server;
-  server.uri = kStunAddressOnly;
-  config.servers.push_back(server);
-  config.type = PeerConnectionInterface::kRelay;
-  EXPECT_TRUE(pc_->SetConfiguration(config));
-
-  const cricket::FakePortAllocatorSession* session =
-      static_cast<const cricket::FakePortAllocatorSession*>(
-          port_allocator_->GetPooledSession());
-  ASSERT_NE(nullptr, session);
-  EXPECT_EQ(1UL, session->stun_servers().size());
-}
-
-// Test that after SetLocalDescription, changing the pool size is not allowed,
-// and an invalid modification error is returned.
-TEST_F(PeerConnectionInterfaceTest,
-       CantChangePoolSizeAfterSetLocalDescription) {
-  CreatePeerConnection();
-  // Start by setting a size of 1.
-  PeerConnectionInterface::RTCConfiguration config;
-  config.ice_candidate_pool_size = 1;
-  EXPECT_TRUE(pc_->SetConfiguration(config));
-
-  // Set remote offer; can still change pool size at this point.
-  CreateOfferAsRemoteDescription();
-  config.ice_candidate_pool_size = 2;
-  EXPECT_TRUE(pc_->SetConfiguration(config));
-
-  // Set local answer; now it's too late.
-  CreateAnswerAsLocalDescription();
-  config.ice_candidate_pool_size = 3;
-  RTCError error;
-  EXPECT_FALSE(pc_->SetConfiguration(config, &error));
-  EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, error.type());
-}
-
-// Test that after setting an answer, extra pooled sessions are discarded. The
-// ICE candidate pool is only intended to be used for the first offer/answer.
-TEST_F(PeerConnectionInterfaceTest,
-       ExtraPooledSessionsDiscardedAfterApplyingAnswer) {
-  CreatePeerConnection();
-
-  // Set a larger-than-necessary size.
-  PeerConnectionInterface::RTCConfiguration config;
-  config.ice_candidate_pool_size = 4;
-  EXPECT_TRUE(pc_->SetConfiguration(config));
-
-  // Do offer/answer.
-  CreateOfferAsRemoteDescription();
-  CreateAnswerAsLocalDescription();
-
-  // Expect no pooled sessions to be left.
-  const cricket::PortAllocatorSession* session =
-      port_allocator_->GetPooledSession();
-  EXPECT_EQ(nullptr, session);
-}
-
-// After Close is called, pooled candidates should be discarded so as to not
-// waste network resources.
-TEST_F(PeerConnectionInterfaceTest, PooledSessionsDiscardedAfterClose) {
-  CreatePeerConnection();
-
-  PeerConnectionInterface::RTCConfiguration config;
-  config.ice_candidate_pool_size = 3;
-  EXPECT_TRUE(pc_->SetConfiguration(config));
-  pc_->Close();
-
-  // Expect no pooled sessions to be left.
-  const cricket::PortAllocatorSession* session =
-      port_allocator_->GetPooledSession();
-  EXPECT_EQ(nullptr, session);
-}
-
-// Test that SetConfiguration returns an invalid modification error if
-// modifying a field in the configuration that isn't allowed to be modified.
-TEST_F(PeerConnectionInterfaceTest,
-       SetConfigurationReturnsInvalidModificationError) {
-  PeerConnectionInterface::RTCConfiguration config;
-  config.bundle_policy = PeerConnectionInterface::kBundlePolicyBalanced;
-  config.rtcp_mux_policy = PeerConnectionInterface::kRtcpMuxPolicyNegotiate;
-  config.continual_gathering_policy = PeerConnectionInterface::GATHER_ONCE;
-  CreatePeerConnection(config, nullptr);
-
-  PeerConnectionInterface::RTCConfiguration modified_config = config;
-  modified_config.bundle_policy =
-      PeerConnectionInterface::kBundlePolicyMaxBundle;
-  RTCError error;
-  EXPECT_FALSE(pc_->SetConfiguration(modified_config, &error));
-  EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, error.type());
-
-  modified_config = config;
-  modified_config.rtcp_mux_policy =
-      PeerConnectionInterface::kRtcpMuxPolicyRequire;
-  error.set_type(RTCErrorType::NONE);
-  EXPECT_FALSE(pc_->SetConfiguration(modified_config, &error));
-  EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, error.type());
-
-  modified_config = config;
-  modified_config.continual_gathering_policy =
-      PeerConnectionInterface::GATHER_CONTINUALLY;
-  error.set_type(RTCErrorType::NONE);
-  EXPECT_FALSE(pc_->SetConfiguration(modified_config, &error));
-  EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, error.type());
-}
-
-// Test that SetConfiguration returns a range error if the candidate pool size
-// is negative or larger than allowed by the spec.
-TEST_F(PeerConnectionInterfaceTest,
-       SetConfigurationReturnsRangeErrorForBadCandidatePoolSize) {
-  PeerConnectionInterface::RTCConfiguration config;
-  CreatePeerConnection(config, nullptr);
-
-  config.ice_candidate_pool_size = -1;
-  RTCError error;
-  EXPECT_FALSE(pc_->SetConfiguration(config, &error));
-  EXPECT_EQ(RTCErrorType::INVALID_RANGE, error.type());
-
-  config.ice_candidate_pool_size = INT_MAX;
-  error.set_type(RTCErrorType::NONE);
-  EXPECT_FALSE(pc_->SetConfiguration(config, &error));
-  EXPECT_EQ(RTCErrorType::INVALID_RANGE, error.type());
-}
-
-// Test that SetConfiguration returns a syntax error if parsing an ICE server
-// URL failed.
-TEST_F(PeerConnectionInterfaceTest,
-       SetConfigurationReturnsSyntaxErrorFromBadIceUrls) {
-  PeerConnectionInterface::RTCConfiguration config;
-  CreatePeerConnection(config, nullptr);
-
-  PeerConnectionInterface::IceServer bad_server;
-  bad_server.uri = "stunn:www.example.com";
-  config.servers.push_back(bad_server);
-  RTCError error;
-  EXPECT_FALSE(pc_->SetConfiguration(config, &error));
-  EXPECT_EQ(RTCErrorType::SYNTAX_ERROR, error.type());
-}
-
-// Test that SetConfiguration returns an invalid parameter error if a TURN
-// IceServer is missing a username or password.
-TEST_F(PeerConnectionInterfaceTest,
-       SetConfigurationReturnsInvalidParameterIfCredentialsMissing) {
-  PeerConnectionInterface::RTCConfiguration config;
-  CreatePeerConnection(config, nullptr);
-
-  PeerConnectionInterface::IceServer bad_server;
-  bad_server.uri = "turn:www.example.com";
-  // Missing password.
-  bad_server.username = "foo";
-  config.servers.push_back(bad_server);
-  RTCError error;
-  EXPECT_FALSE(pc_->SetConfiguration(config, &error));
-  EXPECT_EQ(RTCErrorType::INVALID_PARAMETER, error.type());
-}
-
-// Test that PeerConnection::Close changes the states to closed and all remote
-// tracks change state to ended.
-TEST_F(PeerConnectionInterfaceTest, CloseAndTestStreamsAndStates) {
-  // Initialize a PeerConnection and negotiate local and remote session
-  // description.
-  InitiateCall();
-  ASSERT_EQ(1u, pc_->local_streams()->count());
-  ASSERT_EQ(1u, pc_->remote_streams()->count());
-
-  pc_->Close();
-
-  EXPECT_EQ(PeerConnectionInterface::kClosed, pc_->signaling_state());
-  EXPECT_EQ(PeerConnectionInterface::kIceConnectionClosed,
-            pc_->ice_connection_state());
-  EXPECT_EQ(PeerConnectionInterface::kIceGatheringComplete,
-            pc_->ice_gathering_state());
-
-  EXPECT_EQ(1u, pc_->local_streams()->count());
-  EXPECT_EQ(1u, pc_->remote_streams()->count());
-
-  rtc::scoped_refptr<MediaStreamInterface> remote_stream =
-      pc_->remote_streams()->at(0);
-  // Track state may be updated asynchronously.
-  EXPECT_EQ_WAIT(MediaStreamTrackInterface::kEnded,
-                 remote_stream->GetAudioTracks()[0]->state(), kTimeout);
-  EXPECT_EQ_WAIT(MediaStreamTrackInterface::kEnded,
-                 remote_stream->GetVideoTracks()[0]->state(), kTimeout);
-}
-
-// Test that PeerConnection methods fails gracefully after
-// PeerConnection::Close has been called.
-TEST_F(PeerConnectionInterfaceTest, CloseAndTestMethods) {
-  CreatePeerConnectionWithoutDtls();
-  AddAudioVideoStream(kStreamLabel1, "audio_label", "video_label");
-  CreateOfferAsRemoteDescription();
-  CreateAnswerAsLocalDescription();
-
-  ASSERT_EQ(1u, pc_->local_streams()->count());
-  rtc::scoped_refptr<MediaStreamInterface> local_stream =
-      pc_->local_streams()->at(0);
-
-  pc_->Close();
-
-  pc_->RemoveStream(local_stream);
-  EXPECT_FALSE(pc_->AddStream(local_stream));
-
-  ASSERT_FALSE(local_stream->GetAudioTracks().empty());
-  rtc::scoped_refptr<webrtc::DtmfSenderInterface> dtmf_sender(
-      pc_->CreateDtmfSender(local_stream->GetAudioTracks()[0]));
-  EXPECT_TRUE(NULL == dtmf_sender);  // local stream has been removed.
-
-  EXPECT_TRUE(pc_->CreateDataChannel("test", NULL) == NULL);
-
-  EXPECT_TRUE(pc_->local_description() != NULL);
-  EXPECT_TRUE(pc_->remote_description() != NULL);
-
-  std::unique_ptr<SessionDescriptionInterface> offer;
-  EXPECT_TRUE(DoCreateOffer(&offer, nullptr));
-  std::unique_ptr<SessionDescriptionInterface> answer;
-  EXPECT_TRUE(DoCreateAnswer(&answer, nullptr));
-
-  std::string sdp;
-  ASSERT_TRUE(pc_->remote_description()->ToString(&sdp));
-  std::unique_ptr<SessionDescriptionInterface> remote_offer(
-      webrtc::CreateSessionDescription(SessionDescriptionInterface::kOffer, sdp,
-                                       nullptr));
-  EXPECT_FALSE(DoSetRemoteDescription(std::move(remote_offer)));
-
-  ASSERT_TRUE(pc_->local_description()->ToString(&sdp));
-  std::unique_ptr<SessionDescriptionInterface> local_offer(
-      webrtc::CreateSessionDescription(SessionDescriptionInterface::kOffer, sdp,
-                                       nullptr));
-  EXPECT_FALSE(DoSetLocalDescription(std::move(local_offer)));
-}
-
-// Test that GetStats can still be called after PeerConnection::Close.
-TEST_F(PeerConnectionInterfaceTest, CloseAndGetStats) {
-  InitiateCall();
-  pc_->Close();
-  DoGetStats(NULL);
-}
-
-// NOTE: The series of tests below come from what used to be
-// mediastreamsignaling_unittest.cc, and are mostly aimed at testing that
-// setting a remote or local description has the expected effects.
-
-// This test verifies that the remote MediaStreams corresponding to a received
-// SDP string is created. In this test the two separate MediaStreams are
-// signaled.
-TEST_F(PeerConnectionInterfaceTest, UpdateRemoteStreams) {
-  FakeConstraints constraints;
-  constraints.AddMandatory(webrtc::MediaConstraintsInterface::kEnableDtlsSrtp,
-                           true);
-  CreatePeerConnection(&constraints);
-  CreateAndSetRemoteOffer(kSdpStringWithStream1);
-
-  rtc::scoped_refptr<StreamCollection> reference(CreateStreamCollection(1, 1));
-  EXPECT_TRUE(
-      CompareStreamCollections(observer_.remote_streams(), reference.get()));
-  MediaStreamInterface* remote_stream = observer_.remote_streams()->at(0);
-  EXPECT_TRUE(remote_stream->GetVideoTracks()[0]->GetSource() != nullptr);
-
-  // Create a session description based on another SDP with another
-  // MediaStream.
-  CreateAndSetRemoteOffer(kSdpStringWithStream1And2);
-
-  rtc::scoped_refptr<StreamCollection> reference2(CreateStreamCollection(2, 1));
-  EXPECT_TRUE(
-      CompareStreamCollections(observer_.remote_streams(), reference2.get()));
-}
-
-// This test verifies that when remote tracks are added/removed from SDP, the
-// created remote streams are updated appropriately.
-TEST_F(PeerConnectionInterfaceTest,
-       AddRemoveTrackFromExistingRemoteMediaStream) {
-  FakeConstraints constraints;
-  constraints.AddMandatory(webrtc::MediaConstraintsInterface::kEnableDtlsSrtp,
-                           true);
-  CreatePeerConnection(&constraints);
-  std::unique_ptr<SessionDescriptionInterface> desc_ms1 =
-      CreateSessionDescriptionAndReference(1, 1);
-  EXPECT_TRUE(DoSetRemoteDescription(std::move(desc_ms1)));
-  EXPECT_TRUE(CompareStreamCollections(observer_.remote_streams(),
-                                       reference_collection_));
-
-  // Add extra audio and video tracks to the same MediaStream.
-  std::unique_ptr<SessionDescriptionInterface> desc_ms1_two_tracks =
-      CreateSessionDescriptionAndReference(2, 2);
-  EXPECT_TRUE(DoSetRemoteDescription(std::move(desc_ms1_two_tracks)));
-  EXPECT_TRUE(CompareStreamCollections(observer_.remote_streams(),
-                                       reference_collection_));
-  rtc::scoped_refptr<AudioTrackInterface> audio_track2 =
-      observer_.remote_streams()->at(0)->GetAudioTracks()[1];
-  EXPECT_EQ(webrtc::MediaStreamTrackInterface::kLive, audio_track2->state());
-  rtc::scoped_refptr<VideoTrackInterface> video_track2 =
-      observer_.remote_streams()->at(0)->GetVideoTracks()[1];
-  EXPECT_EQ(webrtc::MediaStreamTrackInterface::kLive, video_track2->state());
-
-  // Remove the extra audio and video tracks.
-  std::unique_ptr<SessionDescriptionInterface> desc_ms2 =
-      CreateSessionDescriptionAndReference(1, 1);
-  MockTrackObserver audio_track_observer(audio_track2);
-  MockTrackObserver video_track_observer(video_track2);
-
-  EXPECT_CALL(audio_track_observer, OnChanged()).Times(Exactly(1));
-  EXPECT_CALL(video_track_observer, OnChanged()).Times(Exactly(1));
-  EXPECT_TRUE(DoSetRemoteDescription(std::move(desc_ms2)));
-  EXPECT_TRUE(CompareStreamCollections(observer_.remote_streams(),
-                                       reference_collection_));
-  // Track state may be updated asynchronously.
-  EXPECT_EQ_WAIT(webrtc::MediaStreamTrackInterface::kEnded,
-                 audio_track2->state(), kTimeout);
-  EXPECT_EQ_WAIT(webrtc::MediaStreamTrackInterface::kEnded,
-                 video_track2->state(), kTimeout);
-}
-
-// This tests that remote tracks are ended if a local session description is set
-// that rejects the media content type.
-TEST_F(PeerConnectionInterfaceTest, RejectMediaContent) {
-  FakeConstraints constraints;
-  constraints.AddMandatory(webrtc::MediaConstraintsInterface::kEnableDtlsSrtp,
-                           true);
-  CreatePeerConnection(&constraints);
-  // First create and set a remote offer, then reject its video content in our
-  // answer.
-  CreateAndSetRemoteOffer(kSdpStringWithStream1);
-  ASSERT_EQ(1u, observer_.remote_streams()->count());
-  MediaStreamInterface* remote_stream = observer_.remote_streams()->at(0);
-  ASSERT_EQ(1u, remote_stream->GetVideoTracks().size());
-  ASSERT_EQ(1u, remote_stream->GetAudioTracks().size());
-
-  rtc::scoped_refptr<webrtc::VideoTrackInterface> remote_video =
-      remote_stream->GetVideoTracks()[0];
-  EXPECT_EQ(webrtc::MediaStreamTrackInterface::kLive, remote_video->state());
-  rtc::scoped_refptr<webrtc::AudioTrackInterface> remote_audio =
-      remote_stream->GetAudioTracks()[0];
-  EXPECT_EQ(webrtc::MediaStreamTrackInterface::kLive, remote_audio->state());
-
-  std::unique_ptr<SessionDescriptionInterface> local_answer;
-  EXPECT_TRUE(DoCreateAnswer(&local_answer, nullptr));
-  cricket::ContentInfo* video_info =
-      local_answer->description()->GetContentByName("video");
-  video_info->rejected = true;
-  EXPECT_TRUE(DoSetLocalDescription(std::move(local_answer)));
-  EXPECT_EQ(webrtc::MediaStreamTrackInterface::kEnded, remote_video->state());
-  EXPECT_EQ(webrtc::MediaStreamTrackInterface::kLive, remote_audio->state());
-
-  // Now create an offer where we reject both video and audio.
-  std::unique_ptr<SessionDescriptionInterface> local_offer;
-  EXPECT_TRUE(DoCreateOffer(&local_offer, nullptr));
-  video_info = local_offer->description()->GetContentByName("video");
-  ASSERT_TRUE(video_info != nullptr);
-  video_info->rejected = true;
-  cricket::ContentInfo* audio_info =
-      local_offer->description()->GetContentByName("audio");
-  ASSERT_TRUE(audio_info != nullptr);
-  audio_info->rejected = true;
-  EXPECT_TRUE(DoSetLocalDescription(std::move(local_offer)));
-  // Track state may be updated asynchronously.
-  EXPECT_EQ_WAIT(webrtc::MediaStreamTrackInterface::kEnded,
-                 remote_audio->state(), kTimeout);
-  EXPECT_EQ_WAIT(webrtc::MediaStreamTrackInterface::kEnded,
-                 remote_video->state(), kTimeout);
-}
-
-// This tests that we won't crash if the remote track has been removed outside
-// of PeerConnection and then PeerConnection tries to reject the track.
-TEST_F(PeerConnectionInterfaceTest, RemoveTrackThenRejectMediaContent) {
-  FakeConstraints constraints;
-  constraints.AddMandatory(webrtc::MediaConstraintsInterface::kEnableDtlsSrtp,
-                           true);
-  CreatePeerConnection(&constraints);
-  CreateAndSetRemoteOffer(kSdpStringWithStream1);
-  MediaStreamInterface* remote_stream = observer_.remote_streams()->at(0);
-  remote_stream->RemoveTrack(remote_stream->GetVideoTracks()[0]);
-  remote_stream->RemoveTrack(remote_stream->GetAudioTracks()[0]);
-
-  std::unique_ptr<SessionDescriptionInterface> local_answer(
-      webrtc::CreateSessionDescription(SessionDescriptionInterface::kAnswer,
-                                       kSdpStringWithStream1, nullptr));
-  cricket::ContentInfo* video_info =
-      local_answer->description()->GetContentByName("video");
-  video_info->rejected = true;
-  cricket::ContentInfo* audio_info =
-      local_answer->description()->GetContentByName("audio");
-  audio_info->rejected = true;
-  EXPECT_TRUE(DoSetLocalDescription(std::move(local_answer)));
-
-  // No crash is a pass.
-}
-
-// This tests that if a recvonly remote description is set, no remote streams
-// will be created, even if the description contains SSRCs/MSIDs.
-// See: https://code.google.com/p/webrtc/issues/detail?id=5054
-TEST_F(PeerConnectionInterfaceTest, RecvonlyDescriptionDoesntCreateStream) {
-  FakeConstraints constraints;
-  constraints.AddMandatory(webrtc::MediaConstraintsInterface::kEnableDtlsSrtp,
-                           true);
-  CreatePeerConnection(&constraints);
-
-  std::string recvonly_offer = kSdpStringWithStream1;
-  rtc::replace_substrs(kSendrecv, strlen(kSendrecv), kRecvonly,
-                       strlen(kRecvonly), &recvonly_offer);
-  CreateAndSetRemoteOffer(recvonly_offer);
-
-  EXPECT_EQ(0u, observer_.remote_streams()->count());
-}
-
-// This tests that a default MediaStream is created if a remote session
-// description doesn't contain any streams and no MSID support.
-// It also tests that the default stream is updated if a video m-line is added
-// in a subsequent session description.
-TEST_F(PeerConnectionInterfaceTest, SdpWithoutMsidCreatesDefaultStream) {
-  FakeConstraints constraints;
-  constraints.AddMandatory(webrtc::MediaConstraintsInterface::kEnableDtlsSrtp,
-                           true);
-  CreatePeerConnection(&constraints);
-  CreateAndSetRemoteOffer(kSdpStringWithoutStreamsAudioOnly);
-
-  ASSERT_EQ(1u, observer_.remote_streams()->count());
-  MediaStreamInterface* remote_stream = observer_.remote_streams()->at(0);
-
-  EXPECT_EQ(1u, remote_stream->GetAudioTracks().size());
-  EXPECT_EQ(0u, remote_stream->GetVideoTracks().size());
-  EXPECT_EQ("default", remote_stream->label());
-
-  CreateAndSetRemoteOffer(kSdpStringWithoutStreams);
-  ASSERT_EQ(1u, observer_.remote_streams()->count());
-  ASSERT_EQ(1u, remote_stream->GetAudioTracks().size());
-  EXPECT_EQ("defaulta0", remote_stream->GetAudioTracks()[0]->id());
-  EXPECT_EQ(MediaStreamTrackInterface::kLive,
-            remote_stream->GetAudioTracks()[0]->state());
-  ASSERT_EQ(1u, remote_stream->GetVideoTracks().size());
-  EXPECT_EQ("defaultv0", remote_stream->GetVideoTracks()[0]->id());
-  EXPECT_EQ(MediaStreamTrackInterface::kLive,
-            remote_stream->GetVideoTracks()[0]->state());
-}
-
-// This tests that a default MediaStream is created if a remote session
-// description doesn't contain any streams and media direction is send only.
-TEST_F(PeerConnectionInterfaceTest,
-       SendOnlySdpWithoutMsidCreatesDefaultStream) {
-  FakeConstraints constraints;
-  constraints.AddMandatory(webrtc::MediaConstraintsInterface::kEnableDtlsSrtp,
-                           true);
-  CreatePeerConnection(&constraints);
-  CreateAndSetRemoteOffer(kSdpStringSendOnlyWithoutStreams);
-
-  ASSERT_EQ(1u, observer_.remote_streams()->count());
-  MediaStreamInterface* remote_stream = observer_.remote_streams()->at(0);
-
-  EXPECT_EQ(1u, remote_stream->GetAudioTracks().size());
-  EXPECT_EQ(1u, remote_stream->GetVideoTracks().size());
-  EXPECT_EQ("default", remote_stream->label());
-}
-
-// This tests that it won't crash when PeerConnection tries to remove
-// a remote track that as already been removed from the MediaStream.
-TEST_F(PeerConnectionInterfaceTest, RemoveAlreadyGoneRemoteStream) {
-  FakeConstraints constraints;
-  constraints.AddMandatory(webrtc::MediaConstraintsInterface::kEnableDtlsSrtp,
-                           true);
-  CreatePeerConnection(&constraints);
-  CreateAndSetRemoteOffer(kSdpStringWithStream1);
-  MediaStreamInterface* remote_stream = observer_.remote_streams()->at(0);
-  remote_stream->RemoveTrack(remote_stream->GetAudioTracks()[0]);
-  remote_stream->RemoveTrack(remote_stream->GetVideoTracks()[0]);
-
-  CreateAndSetRemoteOffer(kSdpStringWithoutStreams);
-
-  // No crash is a pass.
-}
-
-// This tests that a default MediaStream is created if the remote session
-// description doesn't contain any streams and don't contain an indication if
-// MSID is supported.
-TEST_F(PeerConnectionInterfaceTest,
-       SdpWithoutMsidAndStreamsCreatesDefaultStream) {
-  FakeConstraints constraints;
-  constraints.AddMandatory(webrtc::MediaConstraintsInterface::kEnableDtlsSrtp,
-                           true);
-  CreatePeerConnection(&constraints);
-  CreateAndSetRemoteOffer(kSdpStringWithoutStreams);
-
-  ASSERT_EQ(1u, observer_.remote_streams()->count());
-  MediaStreamInterface* remote_stream = observer_.remote_streams()->at(0);
-  EXPECT_EQ(1u, remote_stream->GetAudioTracks().size());
-  EXPECT_EQ(1u, remote_stream->GetVideoTracks().size());
-}
-
-// This tests that a default MediaStream is not created if the remote session
-// description doesn't contain any streams but does support MSID.
-TEST_F(PeerConnectionInterfaceTest, SdpWithMsidDontCreatesDefaultStream) {
-  FakeConstraints constraints;
-  constraints.AddMandatory(webrtc::MediaConstraintsInterface::kEnableDtlsSrtp,
-                           true);
-  CreatePeerConnection(&constraints);
-  CreateAndSetRemoteOffer(kSdpStringWithMsidWithoutStreams);
-  EXPECT_EQ(0u, observer_.remote_streams()->count());
-}
-
-// This tests that when setting a new description, the old default tracks are
-// not destroyed and recreated.
-// See: https://bugs.chromium.org/p/webrtc/issues/detail?id=5250
-TEST_F(PeerConnectionInterfaceTest,
-       DefaultTracksNotDestroyedAndRecreated) {
-  FakeConstraints constraints;
-  constraints.AddMandatory(webrtc::MediaConstraintsInterface::kEnableDtlsSrtp,
-                           true);
-  CreatePeerConnection(&constraints);
-  CreateAndSetRemoteOffer(kSdpStringWithoutStreamsAudioOnly);
-
-  ASSERT_EQ(1u, observer_.remote_streams()->count());
-  MediaStreamInterface* remote_stream = observer_.remote_streams()->at(0);
-  ASSERT_EQ(1u, remote_stream->GetAudioTracks().size());
-
-  // Set the track to "disabled", then set a new description and ensure the
-  // track is still disabled, which ensures it hasn't been recreated.
-  remote_stream->GetAudioTracks()[0]->set_enabled(false);
-  CreateAndSetRemoteOffer(kSdpStringWithoutStreamsAudioOnly);
-  ASSERT_EQ(1u, remote_stream->GetAudioTracks().size());
-  EXPECT_FALSE(remote_stream->GetAudioTracks()[0]->enabled());
-}
-
-// This tests that a default MediaStream is not created if a remote session
-// description is updated to not have any MediaStreams.
-TEST_F(PeerConnectionInterfaceTest, VerifyDefaultStreamIsNotCreated) {
-  FakeConstraints constraints;
-  constraints.AddMandatory(webrtc::MediaConstraintsInterface::kEnableDtlsSrtp,
-                           true);
-  CreatePeerConnection(&constraints);
-  CreateAndSetRemoteOffer(kSdpStringWithStream1);
-  rtc::scoped_refptr<StreamCollection> reference(CreateStreamCollection(1, 1));
-  EXPECT_TRUE(
-      CompareStreamCollections(observer_.remote_streams(), reference.get()));
-
-  CreateAndSetRemoteOffer(kSdpStringWithoutStreams);
-  EXPECT_EQ(0u, observer_.remote_streams()->count());
-}
-
-// This tests that an RtpSender is created when the local description is set
-// after adding a local stream.
-// TODO(deadbeef): This test and the one below it need to be updated when
-// an RtpSender's lifetime isn't determined by when a local description is set.
-TEST_F(PeerConnectionInterfaceTest, LocalDescriptionChanged) {
-  FakeConstraints constraints;
-  constraints.AddMandatory(webrtc::MediaConstraintsInterface::kEnableDtlsSrtp,
-                           true);
-  CreatePeerConnection(&constraints);
-
-  // Create an offer with 1 stream with 2 tracks of each type.
-  rtc::scoped_refptr<StreamCollection> stream_collection =
-      CreateStreamCollection(1, 2);
-  pc_->AddStream(stream_collection->at(0));
-  std::unique_ptr<SessionDescriptionInterface> offer;
-  ASSERT_TRUE(DoCreateOffer(&offer, nullptr));
-  EXPECT_TRUE(DoSetLocalDescription(std::move(offer)));
-
-  auto senders = pc_->GetSenders();
-  EXPECT_EQ(4u, senders.size());
-  EXPECT_TRUE(ContainsSender(senders, kAudioTracks[0]));
-  EXPECT_TRUE(ContainsSender(senders, kVideoTracks[0]));
-  EXPECT_TRUE(ContainsSender(senders, kAudioTracks[1]));
-  EXPECT_TRUE(ContainsSender(senders, kVideoTracks[1]));
-
-  // Remove an audio and video track.
-  pc_->RemoveStream(stream_collection->at(0));
-  stream_collection = CreateStreamCollection(1, 1);
-  pc_->AddStream(stream_collection->at(0));
-  ASSERT_TRUE(DoCreateOffer(&offer, nullptr));
-  EXPECT_TRUE(DoSetLocalDescription(std::move(offer)));
-
-  senders = pc_->GetSenders();
-  EXPECT_EQ(2u, senders.size());
-  EXPECT_TRUE(ContainsSender(senders, kAudioTracks[0]));
-  EXPECT_TRUE(ContainsSender(senders, kVideoTracks[0]));
-  EXPECT_FALSE(ContainsSender(senders, kAudioTracks[1]));
-  EXPECT_FALSE(ContainsSender(senders, kVideoTracks[1]));
-}
-
-// This tests that an RtpSender is created when the local description is set
-// before adding a local stream.
-TEST_F(PeerConnectionInterfaceTest,
-       AddLocalStreamAfterLocalDescriptionChanged) {
-  FakeConstraints constraints;
-  constraints.AddMandatory(webrtc::MediaConstraintsInterface::kEnableDtlsSrtp,
-                           true);
-  CreatePeerConnection(&constraints);
-
-  rtc::scoped_refptr<StreamCollection> stream_collection =
-      CreateStreamCollection(1, 2);
-  // Add a stream to create the offer, but remove it afterwards.
-  pc_->AddStream(stream_collection->at(0));
-  std::unique_ptr<SessionDescriptionInterface> offer;
-  ASSERT_TRUE(DoCreateOffer(&offer, nullptr));
-  pc_->RemoveStream(stream_collection->at(0));
-
-  EXPECT_TRUE(DoSetLocalDescription(std::move(offer)));
-  auto senders = pc_->GetSenders();
-  EXPECT_EQ(0u, senders.size());
-
-  pc_->AddStream(stream_collection->at(0));
-  senders = pc_->GetSenders();
-  EXPECT_EQ(4u, senders.size());
-  EXPECT_TRUE(ContainsSender(senders, kAudioTracks[0]));
-  EXPECT_TRUE(ContainsSender(senders, kVideoTracks[0]));
-  EXPECT_TRUE(ContainsSender(senders, kAudioTracks[1]));
-  EXPECT_TRUE(ContainsSender(senders, kVideoTracks[1]));
-}
-
-// This tests that the expected behavior occurs if the SSRC on a local track is
-// changed when SetLocalDescription is called.
-TEST_F(PeerConnectionInterfaceTest,
-       ChangeSsrcOnTrackInLocalSessionDescription) {
-  FakeConstraints constraints;
-  constraints.AddMandatory(webrtc::MediaConstraintsInterface::kEnableDtlsSrtp,
-                           true);
-  CreatePeerConnection(&constraints);
-
-  rtc::scoped_refptr<StreamCollection> stream_collection =
-      CreateStreamCollection(2, 1);
-  pc_->AddStream(stream_collection->at(0));
-  std::unique_ptr<SessionDescriptionInterface> offer;
-  ASSERT_TRUE(DoCreateOffer(&offer, nullptr));
-  // Grab a copy of the offer before it gets passed into the PC.
-  std::unique_ptr<webrtc::JsepSessionDescription> modified_offer(
-      new webrtc::JsepSessionDescription(SessionDescriptionInterface::kOffer));
-  modified_offer->Initialize(offer->description()->Copy(), offer->session_id(),
-                             offer->session_version());
-  EXPECT_TRUE(DoSetLocalDescription(std::move(offer)));
-
-  auto senders = pc_->GetSenders();
-  EXPECT_EQ(2u, senders.size());
-  EXPECT_TRUE(ContainsSender(senders, kAudioTracks[0]));
-  EXPECT_TRUE(ContainsSender(senders, kVideoTracks[0]));
-
-  // Change the ssrc of the audio and video track.
-  cricket::MediaContentDescription* desc =
-      cricket::GetFirstAudioContentDescription(modified_offer->description());
-  ASSERT_TRUE(desc != NULL);
-  for (StreamParams& stream : desc->mutable_streams()) {
-    for (unsigned int& ssrc : stream.ssrcs) {
-      ++ssrc;
-    }
-  }
-
-  desc =
-      cricket::GetFirstVideoContentDescription(modified_offer->description());
-  ASSERT_TRUE(desc != NULL);
-  for (StreamParams& stream : desc->mutable_streams()) {
-    for (unsigned int& ssrc : stream.ssrcs) {
-      ++ssrc;
-    }
-  }
-
-  EXPECT_TRUE(DoSetLocalDescription(std::move(modified_offer)));
-  senders = pc_->GetSenders();
-  EXPECT_EQ(2u, senders.size());
-  EXPECT_TRUE(ContainsSender(senders, kAudioTracks[0]));
-  EXPECT_TRUE(ContainsSender(senders, kVideoTracks[0]));
-  // TODO(deadbeef): Once RtpSenders expose parameters, check that the SSRC
-  // changed.
-}
-
-// This tests that the expected behavior occurs if a new session description is
-// set with the same tracks, but on a different MediaStream.
-TEST_F(PeerConnectionInterfaceTest,
-       SignalSameTracksInSeparateMediaStream) {
-  FakeConstraints constraints;
-  constraints.AddMandatory(webrtc::MediaConstraintsInterface::kEnableDtlsSrtp,
-                           true);
-  CreatePeerConnection(&constraints);
-
-  rtc::scoped_refptr<StreamCollection> stream_collection =
-      CreateStreamCollection(2, 1);
-  pc_->AddStream(stream_collection->at(0));
-  std::unique_ptr<SessionDescriptionInterface> offer;
-  ASSERT_TRUE(DoCreateOffer(&offer, nullptr));
-  EXPECT_TRUE(DoSetLocalDescription(std::move(offer)));
-
-  auto senders = pc_->GetSenders();
-  EXPECT_EQ(2u, senders.size());
-  EXPECT_TRUE(ContainsSender(senders, kAudioTracks[0], kStreams[0]));
-  EXPECT_TRUE(ContainsSender(senders, kVideoTracks[0], kStreams[0]));
-
-  // Add a new MediaStream but with the same tracks as in the first stream.
-  rtc::scoped_refptr<webrtc::MediaStreamInterface> stream_1(
-      webrtc::MediaStream::Create(kStreams[1]));
-  stream_1->AddTrack(stream_collection->at(0)->GetVideoTracks()[0]);
-  stream_1->AddTrack(stream_collection->at(0)->GetAudioTracks()[0]);
-  pc_->AddStream(stream_1);
-
-  ASSERT_TRUE(DoCreateOffer(&offer, nullptr));
-  EXPECT_TRUE(DoSetLocalDescription(std::move(offer)));
-
-  auto new_senders = pc_->GetSenders();
-  // Should be the same senders as before, but with updated stream id.
-  // Note that this behavior is subject to change in the future.
-  // We may decide the PC should ignore existing tracks in AddStream.
-  EXPECT_EQ(senders, new_senders);
-  EXPECT_TRUE(ContainsSender(new_senders, kAudioTracks[0], kStreams[1]));
-  EXPECT_TRUE(ContainsSender(new_senders, kVideoTracks[0], kStreams[1]));
-}
-
-// This tests that PeerConnectionObserver::OnAddTrack is correctly called.
-TEST_F(PeerConnectionInterfaceTest, OnAddTrackCallback) {
-  FakeConstraints constraints;
-  constraints.AddMandatory(webrtc::MediaConstraintsInterface::kEnableDtlsSrtp,
-                           true);
-  CreatePeerConnection(&constraints);
-  CreateAndSetRemoteOffer(kSdpStringWithStream1AudioTrackOnly);
-  EXPECT_EQ(observer_.num_added_tracks_, 1);
-  EXPECT_EQ(observer_.last_added_track_label_, kAudioTracks[0]);
-
-  // Create and set the updated remote SDP.
-  CreateAndSetRemoteOffer(kSdpStringWithStream1);
-  EXPECT_EQ(observer_.num_added_tracks_, 2);
-  EXPECT_EQ(observer_.last_added_track_label_, kVideoTracks[0]);
-}
-
-// Test that when SetConfiguration is called and the configuration is
-// changing, the next offer causes an ICE restart.
-TEST_F(PeerConnectionInterfaceTest, SetConfigurationCausingIceRetart) {
-  PeerConnectionInterface::RTCConfiguration config;
-  config.type = PeerConnectionInterface::kRelay;
-  // Need to pass default constraints to prevent disabling of DTLS...
-  FakeConstraints default_constraints;
-  CreatePeerConnection(config, &default_constraints);
-  AddAudioVideoStream(kStreamLabel1, "audio_label", "video_label");
-
-  // Do initial offer/answer so there's something to restart.
-  CreateOfferAsLocalDescription();
-  CreateAnswerAsRemoteDescription(kSdpStringWithStream1);
-
-  // Grab the ufrags.
-  std::vector<std::string> initial_ufrags = GetUfrags(pc_->local_description());
-
-  // Change ICE policy, which should trigger an ICE restart on the next offer.
-  config.type = PeerConnectionInterface::kAll;
-  EXPECT_TRUE(pc_->SetConfiguration(config));
-  CreateOfferAsLocalDescription();
-
-  // Grab the new ufrags.
-  std::vector<std::string> subsequent_ufrags =
-      GetUfrags(pc_->local_description());
-
-  // Sanity check.
-  EXPECT_EQ(initial_ufrags.size(), subsequent_ufrags.size());
-  // Check that each ufrag is different.
-  for (int i = 0; i < static_cast<int>(initial_ufrags.size()); ++i) {
-    EXPECT_NE(initial_ufrags[i], subsequent_ufrags[i]);
-  }
-}
-
-// Test that when SetConfiguration is called and the configuration *isn't*
-// changing, the next offer does *not* cause an ICE restart.
-TEST_F(PeerConnectionInterfaceTest, SetConfigurationNotCausingIceRetart) {
-  PeerConnectionInterface::RTCConfiguration config;
-  config.type = PeerConnectionInterface::kRelay;
-  // Need to pass default constraints to prevent disabling of DTLS...
-  FakeConstraints default_constraints;
-  CreatePeerConnection(config, &default_constraints);
-  AddAudioVideoStream(kStreamLabel1, "audio_label", "video_label");
-
-  // Do initial offer/answer so there's something to restart.
-  CreateOfferAsLocalDescription();
-  CreateAnswerAsRemoteDescription(kSdpStringWithStream1);
-
-  // Grab the ufrags.
-  std::vector<std::string> initial_ufrags = GetUfrags(pc_->local_description());
-
-  // Call SetConfiguration with a config identical to what the PC was
-  // constructed with.
-  EXPECT_TRUE(pc_->SetConfiguration(config));
-  CreateOfferAsLocalDescription();
-
-  // Grab the new ufrags.
-  std::vector<std::string> subsequent_ufrags =
-      GetUfrags(pc_->local_description());
-
-  EXPECT_EQ(initial_ufrags, subsequent_ufrags);
-}
-
-// Test for a weird corner case scenario:
-// 1. Audio/video session established.
-// 2. SetConfiguration changes ICE config; ICE restart needed.
-// 3. ICE restart initiated by remote peer, but only for one m= section.
-// 4. Next createOffer should initiate an ICE restart, but only for the other
-//    m= section; it would be pointless to do an ICE restart for the m= section
-//    that was already restarted.
-TEST_F(PeerConnectionInterfaceTest, SetConfigurationCausingPartialIceRestart) {
-  PeerConnectionInterface::RTCConfiguration config;
-  config.type = PeerConnectionInterface::kRelay;
-  // Need to pass default constraints to prevent disabling of DTLS...
-  FakeConstraints default_constraints;
-  CreatePeerConnection(config, &default_constraints);
-  AddAudioVideoStream(kStreamLabel1, "audio_label", "video_label");
-
-  // Do initial offer/answer so there's something to restart.
-  CreateOfferAsLocalDescription();
-  CreateAnswerAsRemoteDescription(kSdpStringWithStream1);
-
-  // Change ICE policy, which should set the "needs-ice-restart" flag.
-  config.type = PeerConnectionInterface::kAll;
-  EXPECT_TRUE(pc_->SetConfiguration(config));
-
-  // Do ICE restart for the first m= section, initiated by remote peer.
-  std::unique_ptr<webrtc::SessionDescriptionInterface> remote_offer(
-      webrtc::CreateSessionDescription(SessionDescriptionInterface::kOffer,
-                                       kSdpStringWithStream1, nullptr));
-  ASSERT_TRUE(remote_offer);
-  remote_offer->description()->transport_infos()[0].description.ice_ufrag =
-      "modified";
-  EXPECT_TRUE(DoSetRemoteDescription(std::move(remote_offer)));
-  CreateAnswerAsLocalDescription();
-
-  // Grab the ufrags.
-  std::vector<std::string> initial_ufrags = GetUfrags(pc_->local_description());
-  ASSERT_EQ(2, initial_ufrags.size());
-
-  // Create offer and grab the new ufrags.
-  CreateOfferAsLocalDescription();
-  std::vector<std::string> subsequent_ufrags =
-      GetUfrags(pc_->local_description());
-  ASSERT_EQ(2, subsequent_ufrags.size());
-
-  // Ensure that only the ufrag for the second m= section changed.
-  EXPECT_EQ(initial_ufrags[0], subsequent_ufrags[0]);
-  EXPECT_NE(initial_ufrags[1], subsequent_ufrags[1]);
-}
-
-// Tests that the methods to return current/pending descriptions work as
-// expected at different points in the offer/answer exchange. This test does
-// one offer/answer exchange as the offerer, then another as the answerer.
-TEST_F(PeerConnectionInterfaceTest, CurrentAndPendingDescriptions) {
-  // This disables DTLS so we can apply an answer to ourselves.
-  CreatePeerConnection();
-
-  // Create initial local offer and get SDP (which will also be used as
-  // answer/pranswer);
-  std::unique_ptr<SessionDescriptionInterface> local_offer;
-  ASSERT_TRUE(DoCreateOffer(&local_offer, nullptr));
-  std::string sdp;
-  EXPECT_TRUE(local_offer->ToString(&sdp));
-
-  // Set local offer.
-  SessionDescriptionInterface* local_offer_ptr = local_offer.get();
-  EXPECT_TRUE(DoSetLocalDescription(std::move(local_offer)));
-  EXPECT_EQ(local_offer_ptr, pc_->pending_local_description());
-  EXPECT_EQ(nullptr, pc_->pending_remote_description());
-  EXPECT_EQ(nullptr, pc_->current_local_description());
-  EXPECT_EQ(nullptr, pc_->current_remote_description());
-
-  // Set remote pranswer.
-  std::unique_ptr<SessionDescriptionInterface> remote_pranswer(
-      webrtc::CreateSessionDescription(SessionDescriptionInterface::kPrAnswer,
-                                       sdp, nullptr));
-  SessionDescriptionInterface* remote_pranswer_ptr = remote_pranswer.get();
-  EXPECT_TRUE(DoSetRemoteDescription(std::move(remote_pranswer)));
-  EXPECT_EQ(local_offer_ptr, pc_->pending_local_description());
-  EXPECT_EQ(remote_pranswer_ptr, pc_->pending_remote_description());
-  EXPECT_EQ(nullptr, pc_->current_local_description());
-  EXPECT_EQ(nullptr, pc_->current_remote_description());
-
-  // Set remote answer.
-  std::unique_ptr<SessionDescriptionInterface> remote_answer(
-      webrtc::CreateSessionDescription(SessionDescriptionInterface::kAnswer,
-                                       sdp, nullptr));
-  SessionDescriptionInterface* remote_answer_ptr = remote_answer.get();
-  EXPECT_TRUE(DoSetRemoteDescription(std::move(remote_answer)));
-  EXPECT_EQ(nullptr, pc_->pending_local_description());
-  EXPECT_EQ(nullptr, pc_->pending_remote_description());
-  EXPECT_EQ(local_offer_ptr, pc_->current_local_description());
-  EXPECT_EQ(remote_answer_ptr, pc_->current_remote_description());
-
-  // Set remote offer.
-  std::unique_ptr<SessionDescriptionInterface> remote_offer(
-      webrtc::CreateSessionDescription(SessionDescriptionInterface::kOffer, sdp,
-                                       nullptr));
-  SessionDescriptionInterface* remote_offer_ptr = remote_offer.get();
-  EXPECT_TRUE(DoSetRemoteDescription(std::move(remote_offer)));
-  EXPECT_EQ(remote_offer_ptr, pc_->pending_remote_description());
-  EXPECT_EQ(nullptr, pc_->pending_local_description());
-  EXPECT_EQ(local_offer_ptr, pc_->current_local_description());
-  EXPECT_EQ(remote_answer_ptr, pc_->current_remote_description());
-
-  // Set local pranswer.
-  std::unique_ptr<SessionDescriptionInterface> local_pranswer(
-      webrtc::CreateSessionDescription(SessionDescriptionInterface::kPrAnswer,
-                                       sdp, nullptr));
-  SessionDescriptionInterface* local_pranswer_ptr = local_pranswer.get();
-  EXPECT_TRUE(DoSetLocalDescription(std::move(local_pranswer)));
-  EXPECT_EQ(remote_offer_ptr, pc_->pending_remote_description());
-  EXPECT_EQ(local_pranswer_ptr, pc_->pending_local_description());
-  EXPECT_EQ(local_offer_ptr, pc_->current_local_description());
-  EXPECT_EQ(remote_answer_ptr, pc_->current_remote_description());
-
-  // Set local answer.
-  std::unique_ptr<SessionDescriptionInterface> local_answer(
-      webrtc::CreateSessionDescription(SessionDescriptionInterface::kAnswer,
-                                       sdp, nullptr));
-  SessionDescriptionInterface* local_answer_ptr = local_answer.get();
-  EXPECT_TRUE(DoSetLocalDescription(std::move(local_answer)));
-  EXPECT_EQ(nullptr, pc_->pending_remote_description());
-  EXPECT_EQ(nullptr, pc_->pending_local_description());
-  EXPECT_EQ(remote_offer_ptr, pc_->current_remote_description());
-  EXPECT_EQ(local_answer_ptr, pc_->current_local_description());
-}
-
-// Tests that it won't crash when calling StartRtcEventLog or StopRtcEventLog
-// after the PeerConnection is closed.
-TEST_F(PeerConnectionInterfaceTest,
-       StartAndStopLoggingAfterPeerConnectionClosed) {
-  CreatePeerConnection();
-  // The RtcEventLog will be reset when the PeerConnection is closed.
-  pc_->Close();
-
-  rtc::PlatformFile file = 0;
-  int64_t max_size_bytes = 1024;
-  EXPECT_FALSE(pc_->StartRtcEventLog(file, max_size_bytes));
-  pc_->StopRtcEventLog();
-}
-
-// Test that generated offers/answers include "ice-option:trickle".
-TEST_F(PeerConnectionInterfaceTest, OffersAndAnswersHaveTrickleIceOption) {
-  CreatePeerConnection();
-
-  // First, create an offer with audio/video.
-  FakeConstraints constraints;
-  constraints.SetMandatoryReceiveAudio(true);
-  constraints.SetMandatoryReceiveVideo(true);
-  std::unique_ptr<SessionDescriptionInterface> offer;
-  ASSERT_TRUE(DoCreateOffer(&offer, &constraints));
-  cricket::SessionDescription* desc = offer->description();
-  ASSERT_EQ(2u, desc->transport_infos().size());
-  EXPECT_TRUE(desc->transport_infos()[0].description.HasOption("trickle"));
-  EXPECT_TRUE(desc->transport_infos()[1].description.HasOption("trickle"));
-
-  // Apply the offer as a remote description, then create an answer.
-  EXPECT_TRUE(DoSetRemoteDescription(std::move(offer)));
-  std::unique_ptr<SessionDescriptionInterface> answer;
-  ASSERT_TRUE(DoCreateAnswer(&answer, &constraints));
-  desc = answer->description();
-  ASSERT_EQ(2u, desc->transport_infos().size());
-  EXPECT_TRUE(desc->transport_infos()[0].description.HasOption("trickle"));
-  EXPECT_TRUE(desc->transport_infos()[1].description.HasOption("trickle"));
-}
-
-// Test that ICE renomination isn't offered if it's not enabled in the PC's
-// RTCConfiguration.
-TEST_F(PeerConnectionInterfaceTest, IceRenominationNotOffered) {
-  PeerConnectionInterface::RTCConfiguration config;
-  config.enable_ice_renomination = false;
-  CreatePeerConnection(config, nullptr);
-  AddVoiceStream("foo");
-
-  std::unique_ptr<SessionDescriptionInterface> offer;
-  ASSERT_TRUE(DoCreateOffer(&offer, nullptr));
-  cricket::SessionDescription* desc = offer->description();
-  EXPECT_EQ(1u, desc->transport_infos().size());
-  EXPECT_FALSE(
-      desc->transport_infos()[0].description.GetIceParameters().renomination);
-}
-
-// Test that the ICE renomination option is present in generated offers/answers
-// if it's enabled in the PC's RTCConfiguration.
-TEST_F(PeerConnectionInterfaceTest, IceRenominationOptionInOfferAndAnswer) {
-  PeerConnectionInterface::RTCConfiguration config;
-  config.enable_ice_renomination = true;
-  CreatePeerConnection(config, nullptr);
-  AddVoiceStream("foo");
-
-  std::unique_ptr<SessionDescriptionInterface> offer;
-  ASSERT_TRUE(DoCreateOffer(&offer, nullptr));
-  cricket::SessionDescription* desc = offer->description();
-  EXPECT_EQ(1u, desc->transport_infos().size());
-  EXPECT_TRUE(
-      desc->transport_infos()[0].description.GetIceParameters().renomination);
-
-  // Set the offer as a remote description, then create an answer and ensure it
-  // has the renomination flag too.
-  EXPECT_TRUE(DoSetRemoteDescription(std::move(offer)));
-  std::unique_ptr<SessionDescriptionInterface> answer;
-  ASSERT_TRUE(DoCreateAnswer(&answer, nullptr));
-  desc = answer->description();
-  EXPECT_EQ(1u, desc->transport_infos().size());
-  EXPECT_TRUE(
-      desc->transport_infos()[0].description.GetIceParameters().renomination);
-}
-
-// Test that if CreateOffer is called with the deprecated "offer to receive
-// audio/video" constraints, they're processed and result in an offer with
-// audio/video sections just as if RTCOfferAnswerOptions had been used.
-TEST_F(PeerConnectionInterfaceTest, CreateOfferWithOfferToReceiveConstraints) {
-  CreatePeerConnection();
-
-  FakeConstraints constraints;
-  constraints.SetMandatoryReceiveAudio(true);
-  constraints.SetMandatoryReceiveVideo(true);
-  std::unique_ptr<SessionDescriptionInterface> offer;
-  ASSERT_TRUE(DoCreateOffer(&offer, &constraints));
-
-  cricket::SessionDescription* desc = offer->description();
-  const cricket::ContentInfo* audio = cricket::GetFirstAudioContent(desc);
-  const cricket::ContentInfo* video = cricket::GetFirstVideoContent(desc);
-  ASSERT_NE(nullptr, audio);
-  ASSERT_NE(nullptr, video);
-  EXPECT_FALSE(audio->rejected);
-  EXPECT_FALSE(video->rejected);
-}
-
-// Test that if CreateAnswer is called with the deprecated "offer to receive
-// audio/video" constraints, they're processed and can be used to reject an
-// offered m= section just as can be done with RTCOfferAnswerOptions;
-TEST_F(PeerConnectionInterfaceTest, CreateAnswerWithOfferToReceiveConstraints) {
-  CreatePeerConnection();
-
-  // First, create an offer with audio/video and apply it as a remote
-  // description.
-  FakeConstraints constraints;
-  constraints.SetMandatoryReceiveAudio(true);
-  constraints.SetMandatoryReceiveVideo(true);
-  std::unique_ptr<SessionDescriptionInterface> offer;
-  ASSERT_TRUE(DoCreateOffer(&offer, &constraints));
-  EXPECT_TRUE(DoSetRemoteDescription(std::move(offer)));
-
-  // Now create answer that rejects audio/video.
-  constraints.SetMandatoryReceiveAudio(false);
-  constraints.SetMandatoryReceiveVideo(false);
-  std::unique_ptr<SessionDescriptionInterface> answer;
-  ASSERT_TRUE(DoCreateAnswer(&answer, &constraints));
-
-  cricket::SessionDescription* desc = answer->description();
-  const cricket::ContentInfo* audio = cricket::GetFirstAudioContent(desc);
-  const cricket::ContentInfo* video = cricket::GetFirstVideoContent(desc);
-  ASSERT_NE(nullptr, audio);
-  ASSERT_NE(nullptr, video);
-  EXPECT_TRUE(audio->rejected);
-  EXPECT_TRUE(video->rejected);
-}
-
-#ifdef HAVE_SCTP
-#define MAYBE_DataChannelOnlyOfferWithMaxBundlePolicy \
-  DataChannelOnlyOfferWithMaxBundlePolicy
-#else
-#define MAYBE_DataChannelOnlyOfferWithMaxBundlePolicy \
-  DISABLED_DataChannelOnlyOfferWithMaxBundlePolicy
-#endif
-
-// Test that negotiation can succeed with a data channel only, and with the max
-// bundle policy. Previously there was a bug that prevented this.
-TEST_F(PeerConnectionInterfaceTest,
-       MAYBE_DataChannelOnlyOfferWithMaxBundlePolicy) {
-  PeerConnectionInterface::RTCConfiguration config;
-  config.bundle_policy = PeerConnectionInterface::kBundlePolicyMaxBundle;
-  CreatePeerConnection(config, nullptr);
-
-  // First, create an offer with only a data channel and apply it as a remote
-  // description.
-  pc_->CreateDataChannel("test", nullptr);
-  std::unique_ptr<SessionDescriptionInterface> offer;
-  ASSERT_TRUE(DoCreateOffer(&offer, nullptr));
-  EXPECT_TRUE(DoSetRemoteDescription(std::move(offer)));
-
-  // Create and set answer as well.
-  std::unique_ptr<SessionDescriptionInterface> answer;
-  ASSERT_TRUE(DoCreateAnswer(&answer, nullptr));
-  EXPECT_TRUE(DoSetLocalDescription(std::move(answer)));
-}
-
-TEST_F(PeerConnectionInterfaceTest, SetBitrateWithoutMinSucceeds) {
-  CreatePeerConnection();
-  PeerConnectionInterface::BitrateParameters bitrate;
-  bitrate.current_bitrate_bps = rtc::Optional<int>(100000);
-  EXPECT_TRUE(pc_->SetBitrate(bitrate).ok());
-}
-
-TEST_F(PeerConnectionInterfaceTest, SetBitrateNegativeMinFails) {
-  CreatePeerConnection();
-  PeerConnectionInterface::BitrateParameters bitrate;
-  bitrate.min_bitrate_bps = rtc::Optional<int>(-1);
-  EXPECT_FALSE(pc_->SetBitrate(bitrate).ok());
-}
-
-TEST_F(PeerConnectionInterfaceTest, SetBitrateCurrentLessThanMinFails) {
-  CreatePeerConnection();
-  PeerConnectionInterface::BitrateParameters bitrate;
-  bitrate.min_bitrate_bps = rtc::Optional<int>(5);
-  bitrate.current_bitrate_bps = rtc::Optional<int>(3);
-  EXPECT_FALSE(pc_->SetBitrate(bitrate).ok());
-}
-
-TEST_F(PeerConnectionInterfaceTest, SetBitrateCurrentNegativeFails) {
-  CreatePeerConnection();
-  PeerConnectionInterface::BitrateParameters bitrate;
-  bitrate.current_bitrate_bps = rtc::Optional<int>(-1);
-  EXPECT_FALSE(pc_->SetBitrate(bitrate).ok());
-}
-
-TEST_F(PeerConnectionInterfaceTest, SetBitrateMaxLessThanCurrentFails) {
-  CreatePeerConnection();
-  PeerConnectionInterface::BitrateParameters bitrate;
-  bitrate.current_bitrate_bps = rtc::Optional<int>(10);
-  bitrate.max_bitrate_bps = rtc::Optional<int>(8);
-  EXPECT_FALSE(pc_->SetBitrate(bitrate).ok());
-}
-
-TEST_F(PeerConnectionInterfaceTest, SetBitrateMaxLessThanMinFails) {
-  CreatePeerConnection();
-  PeerConnectionInterface::BitrateParameters bitrate;
-  bitrate.min_bitrate_bps = rtc::Optional<int>(10);
-  bitrate.max_bitrate_bps = rtc::Optional<int>(8);
-  EXPECT_FALSE(pc_->SetBitrate(bitrate).ok());
-}
-
-TEST_F(PeerConnectionInterfaceTest, SetBitrateMaxNegativeFails) {
-  CreatePeerConnection();
-  PeerConnectionInterface::BitrateParameters bitrate;
-  bitrate.max_bitrate_bps = rtc::Optional<int>(-1);
-  EXPECT_FALSE(pc_->SetBitrate(bitrate).ok());
-}
-
-// ice_regather_interval_range requires WebRTC to be configured for continual
-// gathering already.
-TEST_F(PeerConnectionInterfaceTest,
-       SetIceRegatherIntervalRangeWithoutContinualGatheringFails) {
-  PeerConnectionInterface::RTCConfiguration config;
-  config.ice_regather_interval_range.emplace(1000, 2000);
-  config.continual_gathering_policy =
-      PeerConnectionInterface::ContinualGatheringPolicy::GATHER_ONCE;
-  CreatePeerConnectionExpectFail(config);
-}
-
-// Ensures that there is no error when ice_regather_interval_range is set with
-// continual gathering enabled.
-TEST_F(PeerConnectionInterfaceTest,
-       SetIceRegatherIntervalRangeWithContinualGathering) {
-  PeerConnectionInterface::RTCConfiguration config;
-  config.ice_regather_interval_range.emplace(1000, 2000);
-  config.continual_gathering_policy =
-      PeerConnectionInterface::ContinualGatheringPolicy::GATHER_CONTINUALLY;
-  CreatePeerConnection(config, nullptr);
-}
-
-// The current bitrate from Call's BitrateConfigMask is currently clamped by
-// Call's BitrateConfig, which comes from the SDP or a default value. This test
-// checks that a call to SetBitrate with a current bitrate that will be clamped
-// succeeds.
-TEST_F(PeerConnectionInterfaceTest, SetBitrateCurrentLessThanImplicitMin) {
-  CreatePeerConnection();
-  PeerConnectionInterface::BitrateParameters bitrate;
-  bitrate.current_bitrate_bps = rtc::Optional<int>(1);
-  EXPECT_TRUE(pc_->SetBitrate(bitrate).ok());
-}
-
-// The following tests verify that the offer can be created correctly.
-TEST_F(PeerConnectionInterfaceTest,
-       CreateOfferFailsWithInvalidOfferToReceiveAudio) {
-  RTCOfferAnswerOptions rtc_options;
-
-  // Setting offer_to_receive_audio to a value lower than kUndefined or greater
-  // than kMaxOfferToReceiveMedia should be treated as invalid.
-  rtc_options.offer_to_receive_audio = RTCOfferAnswerOptions::kUndefined - 1;
-  CreatePeerConnection();
-  EXPECT_FALSE(CreateOfferWithOptions(rtc_options));
-
-  rtc_options.offer_to_receive_audio =
-      RTCOfferAnswerOptions::kMaxOfferToReceiveMedia + 1;
-  EXPECT_FALSE(CreateOfferWithOptions(rtc_options));
-}
-
-TEST_F(PeerConnectionInterfaceTest,
-       CreateOfferFailsWithInvalidOfferToReceiveVideo) {
-  RTCOfferAnswerOptions rtc_options;
-
-  // Setting offer_to_receive_video to a value lower than kUndefined or greater
-  // than kMaxOfferToReceiveMedia should be treated as invalid.
-  rtc_options.offer_to_receive_video = RTCOfferAnswerOptions::kUndefined - 1;
-  CreatePeerConnection();
-  EXPECT_FALSE(CreateOfferWithOptions(rtc_options));
-
-  rtc_options.offer_to_receive_video =
-      RTCOfferAnswerOptions::kMaxOfferToReceiveMedia + 1;
-  EXPECT_FALSE(CreateOfferWithOptions(rtc_options));
-}
-
-// Test that the audio and video content will be added to an offer if both
-// |offer_to_receive_audio| and |offer_to_receive_video| options are 1.
-TEST_F(PeerConnectionInterfaceTest, CreateOfferWithAudioVideoOptions) {
-  RTCOfferAnswerOptions rtc_options;
-  rtc_options.offer_to_receive_audio = 1;
-  rtc_options.offer_to_receive_video = 1;
-
-  std::unique_ptr<SessionDescriptionInterface> offer;
-  CreatePeerConnection();
-  offer = CreateOfferWithOptions(rtc_options);
-  ASSERT_TRUE(offer);
-  EXPECT_NE(nullptr, GetFirstAudioContent(offer->description()));
-  EXPECT_NE(nullptr, GetFirstVideoContent(offer->description()));
-}
-
-// Test that only audio content will be added to the offer if only
-// |offer_to_receive_audio| options is 1.
-TEST_F(PeerConnectionInterfaceTest, CreateOfferWithAudioOnlyOptions) {
-  RTCOfferAnswerOptions rtc_options;
-  rtc_options.offer_to_receive_audio = 1;
-  rtc_options.offer_to_receive_video = 0;
-
-  std::unique_ptr<SessionDescriptionInterface> offer;
-  CreatePeerConnection();
-  offer = CreateOfferWithOptions(rtc_options);
-  ASSERT_TRUE(offer);
-  EXPECT_NE(nullptr, GetFirstAudioContent(offer->description()));
-  EXPECT_EQ(nullptr, GetFirstVideoContent(offer->description()));
-}
-
-// Test that only video content will be added if only |offer_to_receive_video|
-// options is 1.
-TEST_F(PeerConnectionInterfaceTest, CreateOfferWithVideoOnlyOptions) {
-  RTCOfferAnswerOptions rtc_options;
-  rtc_options.offer_to_receive_audio = 0;
-  rtc_options.offer_to_receive_video = 1;
-
-  std::unique_ptr<SessionDescriptionInterface> offer;
-  CreatePeerConnection();
-  offer = CreateOfferWithOptions(rtc_options);
-  ASSERT_TRUE(offer);
-  EXPECT_EQ(nullptr, GetFirstAudioContent(offer->description()));
-  EXPECT_NE(nullptr, GetFirstVideoContent(offer->description()));
-}
-
-// Test that if |voice_activity_detection| is false, no CN codec is added to the
-// offer.
-TEST_F(PeerConnectionInterfaceTest, CreateOfferWithVADOptions) {
-  RTCOfferAnswerOptions rtc_options;
-  rtc_options.offer_to_receive_audio = 1;
-  rtc_options.offer_to_receive_video = 0;
-
-  std::unique_ptr<SessionDescriptionInterface> offer;
-  CreatePeerConnection();
-  offer = CreateOfferWithOptions(rtc_options);
-  ASSERT_TRUE(offer);
-  const cricket::ContentInfo* audio_content =
-      offer->description()->GetContentByName(cricket::CN_AUDIO);
-  ASSERT_TRUE(audio_content);
-  // |voice_activity_detection| is true by default.
-  EXPECT_TRUE(HasCNCodecs(audio_content));
-
-  rtc_options.voice_activity_detection = false;
-  CreatePeerConnection();
-  offer = CreateOfferWithOptions(rtc_options);
-  ASSERT_TRUE(offer);
-  audio_content = offer->description()->GetContentByName(cricket::CN_AUDIO);
-  ASSERT_TRUE(audio_content);
-  EXPECT_FALSE(HasCNCodecs(audio_content));
-}
-
-// Test that no media content will be added to the offer if using default
-// RTCOfferAnswerOptions.
-TEST_F(PeerConnectionInterfaceTest, CreateOfferWithDefaultOfferAnswerOptions) {
-  RTCOfferAnswerOptions rtc_options;
-
-  std::unique_ptr<SessionDescriptionInterface> offer;
-  CreatePeerConnection();
-  offer = CreateOfferWithOptions(rtc_options);
-  ASSERT_TRUE(offer);
-  EXPECT_EQ(nullptr, GetFirstAudioContent(offer->description()));
-  EXPECT_EQ(nullptr, GetFirstVideoContent(offer->description()));
-}
-
-// Test that if |ice_restart| is true, the ufrag/pwd will change, otherwise
-// ufrag/pwd will be the same in the new offer.
-TEST_F(PeerConnectionInterfaceTest, CreateOfferWithIceRestart) {
-  RTCOfferAnswerOptions rtc_options;
-  rtc_options.ice_restart = false;
-  rtc_options.offer_to_receive_audio = 1;
-
-  std::unique_ptr<SessionDescriptionInterface> offer;
-  CreatePeerConnection();
-  CreateOfferWithOptionsAsLocalDescription(&offer, rtc_options);
-  auto ufrag1 = offer->description()
-                    ->GetTransportInfoByName(cricket::CN_AUDIO)
-                    ->description.ice_ufrag;
-  auto pwd1 = offer->description()
-                  ->GetTransportInfoByName(cricket::CN_AUDIO)
-                  ->description.ice_pwd;
-
-  // |ice_restart| is false, the ufrag/pwd shouldn't change.
-  CreateOfferWithOptionsAsLocalDescription(&offer, rtc_options);
-  auto ufrag2 = offer->description()
-                    ->GetTransportInfoByName(cricket::CN_AUDIO)
-                    ->description.ice_ufrag;
-  auto pwd2 = offer->description()
-                  ->GetTransportInfoByName(cricket::CN_AUDIO)
-                  ->description.ice_pwd;
-
-  // |ice_restart| is true, the ufrag/pwd should change.
-  rtc_options.ice_restart = true;
-  CreateOfferWithOptionsAsLocalDescription(&offer, rtc_options);
-  auto ufrag3 = offer->description()
-                    ->GetTransportInfoByName(cricket::CN_AUDIO)
-                    ->description.ice_ufrag;
-  auto pwd3 = offer->description()
-                  ->GetTransportInfoByName(cricket::CN_AUDIO)
-                  ->description.ice_pwd;
-
-  EXPECT_EQ(ufrag1, ufrag2);
-  EXPECT_EQ(pwd1, pwd2);
-  EXPECT_NE(ufrag2, ufrag3);
-  EXPECT_NE(pwd2, pwd3);
-}
-
-// Test that if |use_rtp_mux| is true, the bundling will be enabled in the
-// offer; if it is false, there won't be any bundle group in the offer.
-TEST_F(PeerConnectionInterfaceTest, CreateOfferWithRtpMux) {
-  RTCOfferAnswerOptions rtc_options;
-  rtc_options.offer_to_receive_audio = 1;
-  rtc_options.offer_to_receive_video = 1;
-
-  std::unique_ptr<SessionDescriptionInterface> offer;
-  CreatePeerConnection();
-
-  rtc_options.use_rtp_mux = true;
-  offer = CreateOfferWithOptions(rtc_options);
-  ASSERT_TRUE(offer);
-  EXPECT_NE(nullptr, GetFirstAudioContent(offer->description()));
-  EXPECT_NE(nullptr, GetFirstVideoContent(offer->description()));
-  EXPECT_TRUE(offer->description()->HasGroup(cricket::GROUP_TYPE_BUNDLE));
-
-  rtc_options.use_rtp_mux = false;
-  offer = CreateOfferWithOptions(rtc_options);
-  ASSERT_TRUE(offer);
-  EXPECT_NE(nullptr, GetFirstAudioContent(offer->description()));
-  EXPECT_NE(nullptr, GetFirstVideoContent(offer->description()));
-  EXPECT_FALSE(offer->description()->HasGroup(cricket::GROUP_TYPE_BUNDLE));
-}
-
-// If SetMandatoryReceiveAudio(false) and SetMandatoryReceiveVideo(false) are
-// called for the answer constraints, but an audio and a video section were
-// offered, there will still be an audio and a video section in the answer.
-TEST_F(PeerConnectionInterfaceTest,
-       RejectAudioAndVideoInAnswerWithConstraints) {
-  // Offer both audio and video.
-  RTCOfferAnswerOptions rtc_offer_options;
-  rtc_offer_options.offer_to_receive_audio = 1;
-  rtc_offer_options.offer_to_receive_video = 1;
-
-  CreatePeerConnection();
-  std::unique_ptr<SessionDescriptionInterface> offer;
-  CreateOfferWithOptionsAsRemoteDescription(&offer, rtc_offer_options);
-  EXPECT_NE(nullptr, GetFirstAudioContent(offer->description()));
-  EXPECT_NE(nullptr, GetFirstVideoContent(offer->description()));
-
-  // Since an offer has been created with both audio and video,
-  // Answers will contain the media types that exist in the offer regardless of
-  // the value of |answer_options.has_audio| and |answer_options.has_video|.
-  FakeConstraints answer_c;
-  // Reject both audio and video.
-  answer_c.SetMandatoryReceiveAudio(false);
-  answer_c.SetMandatoryReceiveVideo(false);
-
-  std::unique_ptr<SessionDescriptionInterface> answer;
-  ASSERT_TRUE(DoCreateAnswer(&answer, &answer_c));
-  const cricket::ContentInfo* audio_content =
-      GetFirstAudioContent(answer->description());
-  const cricket::ContentInfo* video_content =
-      GetFirstVideoContent(answer->description());
-  ASSERT_NE(nullptr, audio_content);
-  ASSERT_NE(nullptr, video_content);
-  EXPECT_TRUE(audio_content->rejected);
-  EXPECT_TRUE(video_content->rejected);
-}
-
-// This test ensures OnRenegotiationNeeded is called when we add track with
-// MediaStream -> AddTrack in the same way it is called when we add track with
-// PeerConnection -> AddTrack.
-// The test can be removed once addStream is rewritten in terms of addTrack
-// https://bugs.chromium.org/p/webrtc/issues/detail?id=7815
-TEST_F(PeerConnectionInterfaceTest, MediaStreamAddTrackRemoveTrackRenegotiate) {
-  CreatePeerConnectionWithoutDtls();
-  rtc::scoped_refptr<MediaStreamInterface> stream(
-      pc_factory_->CreateLocalMediaStream(kStreamLabel1));
-  pc_->AddStream(stream);
-  rtc::scoped_refptr<AudioTrackInterface> audio_track(
-      pc_factory_->CreateAudioTrack("audio_track", nullptr));
-  rtc::scoped_refptr<VideoTrackInterface> video_track(
-      pc_factory_->CreateVideoTrack(
-          "video_track", pc_factory_->CreateVideoSource(
-                             std::unique_ptr<cricket::VideoCapturer>(
-                                 new cricket::FakeVideoCapturer()))));
-  stream->AddTrack(audio_track);
-  EXPECT_TRUE_WAIT(observer_.renegotiation_needed_, kTimeout);
-  observer_.renegotiation_needed_ = false;
-
-  stream->AddTrack(video_track);
-  EXPECT_TRUE_WAIT(observer_.renegotiation_needed_, kTimeout);
-  observer_.renegotiation_needed_ = false;
-
-  stream->RemoveTrack(audio_track);
-  EXPECT_TRUE_WAIT(observer_.renegotiation_needed_, kTimeout);
-  observer_.renegotiation_needed_ = false;
-
-  stream->RemoveTrack(video_track);
-  EXPECT_TRUE_WAIT(observer_.renegotiation_needed_, kTimeout);
-  observer_.renegotiation_needed_ = false;
-}
-
-// Tests that creating answer would fail gracefully without being crashed if the
-// remote description is unset.
-TEST_F(PeerConnectionInterfaceTest, CreateAnswerWithoutRemoteDescription) {
-  CreatePeerConnection();
-  // Creating answer fails because the remote description is unset.
-  std::unique_ptr<SessionDescriptionInterface> answer;
-  EXPECT_FALSE(DoCreateAnswer(&answer, nullptr));
-
-  // Createing answer succeeds when the remote description is set.
-  CreateOfferAsRemoteDescription();
-  EXPECT_TRUE(DoCreateAnswer(&answer, nullptr));
-}
-
-// Test that an error is returned if a description is applied that doesn't
-// respect the order of existing media sections.
-TEST_F(PeerConnectionInterfaceTest,
-       MediaSectionOrderEnforcedForSubsequentOffers) {
-  CreatePeerConnection();
-  FakeConstraints constraints;
-  constraints.SetMandatoryReceiveAudio(true);
-  constraints.SetMandatoryReceiveVideo(true);
-  std::unique_ptr<SessionDescriptionInterface> offer;
-  ASSERT_TRUE(DoCreateOffer(&offer, &constraints));
-  EXPECT_TRUE(DoSetRemoteDescription(std::move(offer)));
-
-  std::unique_ptr<SessionDescriptionInterface> answer;
-  ASSERT_TRUE(DoCreateAnswer(&answer, nullptr));
-  EXPECT_TRUE(DoSetLocalDescription(std::move(answer)));
-
-  // A remote offer with different m=line order should be rejected.
-  ASSERT_TRUE(DoCreateOffer(&offer, &constraints));
-  std::reverse(offer->description()->contents().begin(),
-               offer->description()->contents().end());
-  std::reverse(offer->description()->transport_infos().begin(),
-               offer->description()->transport_infos().end());
-  EXPECT_FALSE(DoSetRemoteDescription(std::move(offer)));
-
-  // A subsequent local offer with different m=line order should be rejected.
-  ASSERT_TRUE(DoCreateOffer(&offer, &constraints));
-  std::reverse(offer->description()->contents().begin(),
-               offer->description()->contents().end());
-  std::reverse(offer->description()->transport_infos().begin(),
-               offer->description()->transport_infos().end());
-  EXPECT_FALSE(DoSetLocalDescription(std::move(offer)));
-}
-
-class PeerConnectionMediaConfigTest : public testing::Test {
- protected:
-  void SetUp() override {
-    pcf_ = PeerConnectionFactoryForTest::CreatePeerConnectionFactoryForTest();
-    pcf_->Initialize();
-  }
-  const cricket::MediaConfig TestCreatePeerConnection(
-      const PeerConnectionInterface::RTCConfiguration& config,
-      const MediaConstraintsInterface* constraints) {
-    rtc::scoped_refptr<PeerConnectionInterface> pc(pcf_->CreatePeerConnection(
-        config, constraints, nullptr, nullptr, &observer_));
-    EXPECT_TRUE(pc.get());
-    return pc->GetConfiguration().media_config;
-  }
-
-  rtc::scoped_refptr<PeerConnectionFactoryForTest> pcf_;
-  MockPeerConnectionObserver observer_;
-};
-
-// This test verifies the default behaviour with no constraints and a
-// default RTCConfiguration.
-TEST_F(PeerConnectionMediaConfigTest, TestDefaults) {
-  PeerConnectionInterface::RTCConfiguration config;
-  FakeConstraints constraints;
-
-  const cricket::MediaConfig& media_config =
-      TestCreatePeerConnection(config, &constraints);
-
-  EXPECT_FALSE(media_config.enable_dscp);
-  EXPECT_TRUE(media_config.video.enable_cpu_overuse_detection);
-  EXPECT_FALSE(media_config.video.disable_prerenderer_smoothing);
-  EXPECT_FALSE(media_config.video.suspend_below_min_bitrate);
-}
-
-// This test verifies the DSCP constraint is recognized and passed to
-// the PeerConnection.
-TEST_F(PeerConnectionMediaConfigTest, TestDscpConstraintTrue) {
-  PeerConnectionInterface::RTCConfiguration config;
-  FakeConstraints constraints;
-
-  constraints.AddOptional(webrtc::MediaConstraintsInterface::kEnableDscp, true);
-  const cricket::MediaConfig& media_config =
-      TestCreatePeerConnection(config, &constraints);
-
-  EXPECT_TRUE(media_config.enable_dscp);
-}
-
-// This test verifies the cpu overuse detection constraint is
-// recognized and passed to the PeerConnection.
-TEST_F(PeerConnectionMediaConfigTest, TestCpuOveruseConstraintFalse) {
-  PeerConnectionInterface::RTCConfiguration config;
-  FakeConstraints constraints;
-
-  constraints.AddOptional(
-      webrtc::MediaConstraintsInterface::kCpuOveruseDetection, false);
-  const cricket::MediaConfig media_config =
-      TestCreatePeerConnection(config, &constraints);
-
-  EXPECT_FALSE(media_config.video.enable_cpu_overuse_detection);
-}
-
-// This test verifies that the disable_prerenderer_smoothing flag is
-// propagated from RTCConfiguration to the PeerConnection.
-TEST_F(PeerConnectionMediaConfigTest, TestDisablePrerendererSmoothingTrue) {
-  PeerConnectionInterface::RTCConfiguration config;
-  FakeConstraints constraints;
-
-  config.set_prerenderer_smoothing(false);
-  const cricket::MediaConfig& media_config =
-      TestCreatePeerConnection(config, &constraints);
-
-  EXPECT_TRUE(media_config.video.disable_prerenderer_smoothing);
-}
-
-// This test verifies the suspend below min bitrate constraint is
-// recognized and passed to the PeerConnection.
-TEST_F(PeerConnectionMediaConfigTest,
-       TestSuspendBelowMinBitrateConstraintTrue) {
-  PeerConnectionInterface::RTCConfiguration config;
-  FakeConstraints constraints;
-
-  constraints.AddOptional(
-      webrtc::MediaConstraintsInterface::kEnableVideoSuspendBelowMinBitrate,
-      true);
-  const cricket::MediaConfig media_config =
-      TestCreatePeerConnection(config, &constraints);
-
-  EXPECT_TRUE(media_config.video.suspend_below_min_bitrate);
-}
-
-// Tests a few random fields being different.
-TEST(RTCConfigurationTest, ComparisonOperators) {
-  PeerConnectionInterface::RTCConfiguration a;
-  PeerConnectionInterface::RTCConfiguration b;
-  EXPECT_EQ(a, b);
-
-  PeerConnectionInterface::RTCConfiguration c;
-  c.servers.push_back(PeerConnectionInterface::IceServer());
-  EXPECT_NE(a, c);
-
-  PeerConnectionInterface::RTCConfiguration d;
-  d.type = PeerConnectionInterface::kRelay;
-  EXPECT_NE(a, d);
-
-  PeerConnectionInterface::RTCConfiguration e;
-  e.audio_jitter_buffer_max_packets = 5;
-  EXPECT_NE(a, e);
-
-  PeerConnectionInterface::RTCConfiguration f;
-  f.ice_connection_receiving_timeout = 1337;
-  EXPECT_NE(a, f);
-
-  PeerConnectionInterface::RTCConfiguration g;
-  g.disable_ipv6 = true;
-  EXPECT_NE(a, g);
-
-  PeerConnectionInterface::RTCConfiguration h(
-      PeerConnectionInterface::RTCConfigurationType::kAggressive);
-  EXPECT_NE(a, h);
-}
diff --git a/pc/proxy_unittest.cc b/pc/proxy_unittest.cc
deleted file mode 100644
index c21599d..0000000
--- a/pc/proxy_unittest.cc
+++ /dev/null
@@ -1,315 +0,0 @@
-/*
- *  Copyright 2013 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/api/proxy.h"
-
-#include <memory>
-#include <string>
-
-#include "webrtc/rtc_base/gunit.h"
-#include "webrtc/rtc_base/refcount.h"
-#include "webrtc/rtc_base/thread.h"
-#include "webrtc/test/gmock.h"
-
-using ::testing::_;
-using ::testing::DoAll;
-using ::testing::Exactly;
-using ::testing::InvokeWithoutArgs;
-using ::testing::Return;
-
-namespace webrtc {
-
-// Interface used for testing here.
-class FakeInterface : public rtc::RefCountInterface {
- public:
-  virtual void VoidMethod0() = 0;
-  virtual std::string Method0() = 0;
-  virtual std::string ConstMethod0() const = 0;
-  virtual std::string Method1(std::string s) = 0;
-  virtual std::string ConstMethod1(std::string s) const = 0;
-  virtual std::string Method2(std::string s1, std::string s2) = 0;
-
- protected:
-  virtual ~FakeInterface() {}
-};
-
-// Implementation of the test interface.
-class Fake : public FakeInterface {
- public:
-  static rtc::scoped_refptr<Fake> Create() {
-    return new rtc::RefCountedObject<Fake>();
-  }
-  // Used to verify destructor is called on the correct thread.
-  MOCK_METHOD0(Destroy, void());
-
-  MOCK_METHOD0(VoidMethod0, void());
-  MOCK_METHOD0(Method0, std::string());
-  MOCK_CONST_METHOD0(ConstMethod0, std::string());
-
-  MOCK_METHOD1(Method1, std::string(std::string));
-  MOCK_CONST_METHOD1(ConstMethod1, std::string(std::string));
-
-  MOCK_METHOD2(Method2, std::string(std::string, std::string));
-
- protected:
-  Fake() {}
-  ~Fake() { Destroy(); }
-};
-
-// Proxies for the test interface.
-BEGIN_PROXY_MAP(Fake)
-  PROXY_WORKER_THREAD_DESTRUCTOR()
-  PROXY_METHOD0(void, VoidMethod0)
-  PROXY_METHOD0(std::string, Method0)
-  PROXY_CONSTMETHOD0(std::string, ConstMethod0)
-  PROXY_WORKER_METHOD1(std::string, Method1, std::string)
-  PROXY_CONSTMETHOD1(std::string, ConstMethod1, std::string)
-  PROXY_WORKER_METHOD2(std::string, Method2, std::string, std::string)
-END_PROXY_MAP()
-
-// Preprocessor hack to get a proxy class a name different than FakeProxy.
-#define FakeProxy FakeSignalingProxy
-#define FakeProxyWithInternal FakeSignalingProxyWithInternal
-BEGIN_SIGNALING_PROXY_MAP(Fake)
-  PROXY_SIGNALING_THREAD_DESTRUCTOR()
-  PROXY_METHOD0(void, VoidMethod0)
-  PROXY_METHOD0(std::string, Method0)
-  PROXY_CONSTMETHOD0(std::string, ConstMethod0)
-  PROXY_METHOD1(std::string, Method1, std::string)
-  PROXY_CONSTMETHOD1(std::string, ConstMethod1, std::string)
-  PROXY_METHOD2(std::string, Method2, std::string, std::string)
-END_PROXY_MAP()
-#undef FakeProxy
-
-class SignalingProxyTest : public testing::Test {
- public:
-  // Checks that the functions are called on the right thread.
-  void CheckSignalingThread() { EXPECT_TRUE(signaling_thread_->IsCurrent()); }
-
- protected:
-  void SetUp() override {
-    signaling_thread_ = rtc::Thread::Create();
-    ASSERT_TRUE(signaling_thread_->Start());
-    fake_ = Fake::Create();
-    fake_signaling_proxy_ =
-        FakeSignalingProxy::Create(signaling_thread_.get(), fake_.get());
-  }
-
- protected:
-  std::unique_ptr<rtc::Thread> signaling_thread_;
-  rtc::scoped_refptr<FakeInterface> fake_signaling_proxy_;
-  rtc::scoped_refptr<Fake> fake_;
-};
-
-TEST_F(SignalingProxyTest, SignalingThreadDestructor) {
-  EXPECT_CALL(*fake_, Destroy())
-      .Times(Exactly(1))
-      .WillOnce(
-          InvokeWithoutArgs(this, &SignalingProxyTest::CheckSignalingThread));
-  fake_ = nullptr;
-  fake_signaling_proxy_ = nullptr;
-}
-
-TEST_F(SignalingProxyTest, VoidMethod0) {
-  EXPECT_CALL(*fake_, VoidMethod0())
-      .Times(Exactly(1))
-      .WillOnce(
-          InvokeWithoutArgs(this, &SignalingProxyTest::CheckSignalingThread));
-  fake_signaling_proxy_->VoidMethod0();
-}
-
-TEST_F(SignalingProxyTest, Method0) {
-  EXPECT_CALL(*fake_, Method0())
-      .Times(Exactly(1))
-      .WillOnce(DoAll(
-          InvokeWithoutArgs(this, &SignalingProxyTest::CheckSignalingThread),
-          Return("Method0")));
-  EXPECT_EQ("Method0", fake_signaling_proxy_->Method0());
-}
-
-TEST_F(SignalingProxyTest, ConstMethod0) {
-  EXPECT_CALL(*fake_, ConstMethod0())
-      .Times(Exactly(1))
-      .WillOnce(DoAll(
-          InvokeWithoutArgs(this, &SignalingProxyTest::CheckSignalingThread),
-          Return("ConstMethod0")));
-  EXPECT_EQ("ConstMethod0", fake_signaling_proxy_->ConstMethod0());
-}
-
-TEST_F(SignalingProxyTest, Method1) {
-  const std::string arg1 = "arg1";
-  EXPECT_CALL(*fake_, Method1(arg1))
-      .Times(Exactly(1))
-      .WillOnce(DoAll(
-          InvokeWithoutArgs(this, &SignalingProxyTest::CheckSignalingThread),
-          Return("Method1")));
-  EXPECT_EQ("Method1", fake_signaling_proxy_->Method1(arg1));
-}
-
-TEST_F(SignalingProxyTest, ConstMethod1) {
-  const std::string arg1 = "arg1";
-  EXPECT_CALL(*fake_, ConstMethod1(arg1))
-      .Times(Exactly(1))
-      .WillOnce(DoAll(
-          InvokeWithoutArgs(this, &SignalingProxyTest::CheckSignalingThread),
-          Return("ConstMethod1")));
-  EXPECT_EQ("ConstMethod1", fake_signaling_proxy_->ConstMethod1(arg1));
-}
-
-TEST_F(SignalingProxyTest, Method2) {
-  const std::string arg1 = "arg1";
-  const std::string arg2 = "arg2";
-  EXPECT_CALL(*fake_, Method2(arg1, arg2))
-      .Times(Exactly(1))
-      .WillOnce(DoAll(
-          InvokeWithoutArgs(this, &SignalingProxyTest::CheckSignalingThread),
-          Return("Method2")));
-  EXPECT_EQ("Method2", fake_signaling_proxy_->Method2(arg1, arg2));
-}
-
-class ProxyTest : public testing::Test {
- public:
-  // Checks that the functions are called on the right thread.
-  void CheckSignalingThread() { EXPECT_TRUE(signaling_thread_->IsCurrent()); }
-  void CheckWorkerThread() { EXPECT_TRUE(worker_thread_->IsCurrent()); }
-
- protected:
-  void SetUp() override {
-    signaling_thread_ = rtc::Thread::Create();
-    worker_thread_ = rtc::Thread::Create();
-    ASSERT_TRUE(signaling_thread_->Start());
-    ASSERT_TRUE(worker_thread_->Start());
-    fake_ = Fake::Create();
-    fake_proxy_ = FakeProxy::Create(signaling_thread_.get(),
-                                    worker_thread_.get(), fake_.get());
-  }
-
- protected:
-  std::unique_ptr<rtc::Thread> signaling_thread_;
-  std::unique_ptr<rtc::Thread> worker_thread_;
-  rtc::scoped_refptr<FakeInterface> fake_proxy_;
-  rtc::scoped_refptr<Fake> fake_;
-};
-
-TEST_F(ProxyTest, WorkerThreadDestructor) {
-  EXPECT_CALL(*fake_, Destroy())
-      .Times(Exactly(1))
-      .WillOnce(InvokeWithoutArgs(this, &ProxyTest::CheckWorkerThread));
-  fake_ = nullptr;
-  fake_proxy_ = nullptr;
-}
-
-TEST_F(ProxyTest, VoidMethod0) {
-  EXPECT_CALL(*fake_, VoidMethod0())
-      .Times(Exactly(1))
-      .WillOnce(InvokeWithoutArgs(this, &ProxyTest::CheckSignalingThread));
-  fake_proxy_->VoidMethod0();
-}
-
-TEST_F(ProxyTest, Method0) {
-  EXPECT_CALL(*fake_, Method0())
-      .Times(Exactly(1))
-      .WillOnce(
-          DoAll(InvokeWithoutArgs(this, &ProxyTest::CheckSignalingThread),
-                Return("Method0")));
-  EXPECT_EQ("Method0",
-            fake_proxy_->Method0());
-}
-
-TEST_F(ProxyTest, ConstMethod0) {
-  EXPECT_CALL(*fake_, ConstMethod0())
-      .Times(Exactly(1))
-      .WillOnce(
-          DoAll(InvokeWithoutArgs(this, &ProxyTest::CheckSignalingThread),
-                Return("ConstMethod0")));
-  EXPECT_EQ("ConstMethod0",
-            fake_proxy_->ConstMethod0());
-}
-
-TEST_F(ProxyTest, WorkerMethod1) {
-  const std::string arg1 = "arg1";
-  EXPECT_CALL(*fake_, Method1(arg1))
-      .Times(Exactly(1))
-      .WillOnce(DoAll(InvokeWithoutArgs(this, &ProxyTest::CheckWorkerThread),
-                      Return("Method1")));
-  EXPECT_EQ("Method1", fake_proxy_->Method1(arg1));
-}
-
-TEST_F(ProxyTest, ConstMethod1) {
-  const std::string arg1 = "arg1";
-  EXPECT_CALL(*fake_, ConstMethod1(arg1))
-      .Times(Exactly(1))
-      .WillOnce(
-          DoAll(InvokeWithoutArgs(this, &ProxyTest::CheckSignalingThread),
-                Return("ConstMethod1")));
-  EXPECT_EQ("ConstMethod1", fake_proxy_->ConstMethod1(arg1));
-}
-
-TEST_F(ProxyTest, WorkerMethod2) {
-  const std::string arg1 = "arg1";
-  const std::string arg2 = "arg2";
-  EXPECT_CALL(*fake_, Method2(arg1, arg2))
-      .Times(Exactly(1))
-      .WillOnce(DoAll(InvokeWithoutArgs(this, &ProxyTest::CheckWorkerThread),
-                      Return("Method2")));
-  EXPECT_EQ("Method2", fake_proxy_->Method2(arg1, arg2));
-}
-
-// Interface for testing OWNED_PROXY_MAP.
-class FooInterface {
- public:
-  virtual ~FooInterface() {}
-  virtual void Bar() = 0;
-};
-
-class Foo : public FooInterface {
- public:
-  Foo() {}
-  MOCK_METHOD0(Bar, void());
-};
-
-BEGIN_OWNED_PROXY_MAP(Foo)
-  PROXY_SIGNALING_THREAD_DESTRUCTOR()
-  PROXY_METHOD0(void, Bar)
-END_PROXY_MAP()
-
-class OwnedProxyTest : public testing::Test {
- public:
-  OwnedProxyTest()
-      : signaling_thread_(rtc::Thread::Create()),
-        worker_thread_(rtc::Thread::Create()),
-        foo_(new Foo()),
-        foo_proxy_(FooProxy::Create(signaling_thread_.get(),
-                                    worker_thread_.get(),
-                                    std::unique_ptr<FooInterface>(foo_))) {
-    signaling_thread_->Start();
-    worker_thread_->Start();
-  }
-
-  void CheckSignalingThread() { EXPECT_TRUE(signaling_thread_->IsCurrent()); }
-  void CheckWorkerThread() { EXPECT_TRUE(worker_thread_->IsCurrent()); }
-
- protected:
-  std::unique_ptr<rtc::Thread> signaling_thread_;
-  std::unique_ptr<rtc::Thread> worker_thread_;
-  Foo* foo_;  // Owned by foo_proxy_, not this class.
-  std::unique_ptr<FooInterface> foo_proxy_;
-};
-
-// Just tests that a method can be invoked using an "owned proxy" (as opposed
-// to normal ref-counted version).
-TEST_F(OwnedProxyTest, BasicTest) {
-  EXPECT_CALL(*foo_, Bar())
-      .Times(Exactly(1))
-      .WillOnce(InvokeWithoutArgs(this, &OwnedProxyTest::CheckSignalingThread));
-  foo_proxy_->Bar();
-}
-
-}  // namespace webrtc
diff --git a/pc/quicdatachannel.cc b/pc/quicdatachannel.cc
deleted file mode 100644
index ab8675d..0000000
--- a/pc/quicdatachannel.cc
+++ /dev/null
@@ -1,396 +0,0 @@
-/*
- *  Copyright 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/pc/quicdatachannel.h"
-
-#include "webrtc/p2p/quic/quictransportchannel.h"
-#include "webrtc/p2p/quic/reliablequicstream.h"
-#include "webrtc/rtc_base/bind.h"
-#include "webrtc/rtc_base/bytebuffer.h"
-#include "webrtc/rtc_base/copyonwritebuffer.h"
-#include "webrtc/rtc_base/logging.h"
-
-namespace webrtc {
-
-void WriteQuicDataChannelMessageHeader(int data_channel_id,
-                                       uint64_t message_id,
-                                       rtc::CopyOnWriteBuffer* header) {
-  RTC_DCHECK(header);
-  // 64-bit varints require at most 10 bytes (7*10 == 70), and 32-bit varints
-  // require at most 5 bytes (7*5 == 35).
-  size_t max_length = 15;
-  rtc::ByteBufferWriter byte_buffer(nullptr, max_length,
-                                    rtc::ByteBuffer::ByteOrder::ORDER_HOST);
-  byte_buffer.WriteUVarint(data_channel_id);
-  byte_buffer.WriteUVarint(message_id);
-  header->SetData(byte_buffer.Data(), byte_buffer.Length());
-}
-
-bool ParseQuicDataMessageHeader(const char* data,
-                                size_t len,
-                                int* data_channel_id,
-                                uint64_t* message_id,
-                                size_t* bytes_read) {
-  RTC_DCHECK(data_channel_id);
-  RTC_DCHECK(message_id);
-  RTC_DCHECK(bytes_read);
-
-  rtc::ByteBufferReader byte_buffer(data, len, rtc::ByteBuffer::ORDER_HOST);
-  uint64_t dcid;
-  if (!byte_buffer.ReadUVarint(&dcid)) {
-    LOG(LS_ERROR) << "Could not read the data channel ID";
-    return false;
-  }
-  *data_channel_id = dcid;
-  if (!byte_buffer.ReadUVarint(message_id)) {
-    LOG(LS_ERROR) << "Could not read message ID for data channel "
-                  << *data_channel_id;
-    return false;
-  }
-  size_t remaining_bytes = byte_buffer.Length();
-  *bytes_read = len - remaining_bytes;
-  return true;
-}
-
-QuicDataChannel::QuicDataChannel(rtc::Thread* signaling_thread,
-                                 rtc::Thread* worker_thread,
-                                 rtc::Thread* network_thread,
-                                 const std::string& label,
-                                 const DataChannelInit& config)
-    : signaling_thread_(signaling_thread),
-      worker_thread_(worker_thread),
-      network_thread_(network_thread),
-      id_(config.id),
-      state_(kConnecting),
-      buffered_amount_(0),
-      next_message_id_(0),
-      label_(label),
-      protocol_(config.protocol) {}
-
-QuicDataChannel::~QuicDataChannel() {}
-
-void QuicDataChannel::RegisterObserver(DataChannelObserver* observer) {
-  RTC_DCHECK(signaling_thread_->IsCurrent());
-  observer_ = observer;
-}
-
-void QuicDataChannel::UnregisterObserver() {
-  RTC_DCHECK(signaling_thread_->IsCurrent());
-  observer_ = nullptr;
-}
-
-bool QuicDataChannel::Send(const DataBuffer& buffer) {
-  RTC_DCHECK(signaling_thread_->IsCurrent());
-  if (state_ != kOpen) {
-    LOG(LS_ERROR) << "QUIC data channel " << id_
-                  << " is not open so cannot send.";
-    return false;
-  }
-  return network_thread_->Invoke<bool>(
-      RTC_FROM_HERE, rtc::Bind(&QuicDataChannel::Send_n, this, buffer));
-}
-
-bool QuicDataChannel::Send_n(const DataBuffer& buffer) {
-  RTC_DCHECK(network_thread_->IsCurrent());
-
-  // Encode and send the header containing the data channel ID and message ID.
-  rtc::CopyOnWriteBuffer header;
-  WriteQuicDataChannelMessageHeader(id_, ++next_message_id_, &header);
-  RTC_DCHECK(quic_transport_channel_);
-  cricket::ReliableQuicStream* stream =
-      quic_transport_channel_->CreateQuicStream();
-  RTC_DCHECK(stream);
-
-  // Send the header with a FIN if the message is empty.
-  bool header_fin = (buffer.size() == 0);
-  rtc::StreamResult header_result =
-      stream->Write(header.data<char>(), header.size(), header_fin);
-
-  if (header_result == rtc::SR_BLOCK) {
-    // The header is write blocked but we should try sending the message. Since
-    // the ReliableQuicStream queues data in order, if the header is write
-    // blocked then the message will be write blocked. Otherwise if the message
-    // is sent then the header is sent.
-    LOG(LS_INFO) << "Stream " << stream->id()
-                 << " header is write blocked for QUIC data channel " << id_;
-  } else if (header_result != rtc::SR_SUCCESS) {
-    LOG(LS_ERROR) << "Stream " << stream->id()
-                  << " failed to write header for QUIC data channel " << id_
-                  << ". Unexpected error " << header_result;
-    return false;
-  }
-
-  // If the message is not empty, then send the message with a FIN.
-  bool message_fin = true;
-  rtc::StreamResult message_result =
-      header_fin ? header_result : stream->Write(buffer.data.data<char>(),
-                                                 buffer.size(), message_fin);
-
-  if (message_result == rtc::SR_SUCCESS) {
-    // The message is sent and we don't need this QUIC stream.
-    LOG(LS_INFO) << "Stream " << stream->id()
-                 << " successfully wrote message for QUIC data channel " << id_;
-    stream->Close();
-    return true;
-  }
-  // TODO(mikescarlett): Register the ReliableQuicStream's priority to the
-  // QuicWriteBlockedList so that the QUIC session doesn't drop messages when
-  // the QUIC transport channel becomes unwritable.
-  if (message_result == rtc::SR_BLOCK) {
-    // The QUIC stream is write blocked, so the message is queued by the QUIC
-    // session. If this is due to the QUIC not being writable, it will be sent
-    // once QUIC becomes writable again. Otherwise it may be due to exceeding
-    // the QUIC flow control limit, in which case the remote peer's QUIC session
-    // will tell the QUIC stream to send more data.
-    LOG(LS_INFO) << "Stream " << stream->id()
-                 << " message is write blocked for QUIC data channel " << id_;
-    SetBufferedAmount_w(buffered_amount_ + stream->queued_data_bytes());
-    stream->SignalQueuedBytesWritten.connect(
-        this, &QuicDataChannel::OnQueuedBytesWritten);
-    write_blocked_quic_streams_[stream->id()] = stream;
-    // The QUIC stream will be removed from |write_blocked_quic_streams_| once
-    // it closes.
-    stream->SignalClosed.connect(this,
-                                 &QuicDataChannel::OnWriteBlockedStreamClosed);
-    return true;
-  }
-  LOG(LS_ERROR) << "Stream " << stream->id()
-                << " failed to write message for QUIC data channel " << id_
-                << ". Unexpected error: " << message_result;
-  return false;
-}
-
-void QuicDataChannel::OnQueuedBytesWritten(net::QuicStreamId stream_id,
-                                           uint64_t queued_bytes_written) {
-  RTC_DCHECK(worker_thread_->IsCurrent());
-  SetBufferedAmount_w(buffered_amount_ - queued_bytes_written);
-  const auto& kv = write_blocked_quic_streams_.find(stream_id);
-  if (kv == write_blocked_quic_streams_.end()) {
-    RTC_NOTREACHED();
-    return;
-  }
-  cricket::ReliableQuicStream* stream = kv->second;
-  // True if the QUIC stream is done sending data.
-  if (stream->fin_sent()) {
-    LOG(LS_INFO) << "Stream " << stream->id()
-                 << " successfully wrote data for QUIC data channel " << id_;
-    stream->Close();
-  }
-}
-
-void QuicDataChannel::SetBufferedAmount_w(uint64_t buffered_amount) {
-  RTC_DCHECK(worker_thread_->IsCurrent());
-  buffered_amount_ = buffered_amount;
-  invoker_.AsyncInvoke<void>(
-      RTC_FROM_HERE, signaling_thread_,
-      rtc::Bind(&QuicDataChannel::OnBufferedAmountChange_s, this,
-                buffered_amount));
-}
-
-void QuicDataChannel::Close() {
-  RTC_DCHECK(signaling_thread_->IsCurrent());
-  if (state_ == kClosed || state_ == kClosing) {
-    return;
-  }
-  LOG(LS_INFO) << "Closing QUIC data channel.";
-  SetState_s(kClosing);
-  worker_thread_->Invoke<void>(RTC_FROM_HERE,
-                               rtc::Bind(&QuicDataChannel::Close_w, this));
-  SetState_s(kClosed);
-}
-
-void QuicDataChannel::Close_w() {
-  RTC_DCHECK(worker_thread_->IsCurrent());
-  for (auto& kv : incoming_quic_messages_) {
-    Message& message = kv.second;
-    cricket::ReliableQuicStream* stream = message.stream;
-    stream->Close();
-  }
-
-  for (auto& kv : write_blocked_quic_streams_) {
-    cricket::ReliableQuicStream* stream = kv.second;
-    stream->Close();
-  }
-}
-
-bool QuicDataChannel::SetTransportChannel(
-    cricket::QuicTransportChannel* channel) {
-  RTC_DCHECK(signaling_thread_->IsCurrent());
-
-  if (!channel) {
-    LOG(LS_ERROR) << "|channel| is NULL. Cannot set transport channel.";
-    return false;
-  }
-  if (quic_transport_channel_) {
-    if (channel == quic_transport_channel_) {
-      LOG(LS_WARNING) << "Ignoring duplicate transport channel.";
-      return true;
-    }
-    LOG(LS_ERROR) << "|channel| does not match existing transport channel.";
-    return false;
-  }
-
-  quic_transport_channel_ = channel;
-  LOG(LS_INFO) << "Setting QuicTransportChannel for QUIC data channel " << id_;
-  DataState data_channel_state = worker_thread_->Invoke<DataState>(
-      RTC_FROM_HERE, rtc::Bind(&QuicDataChannel::SetTransportChannel_w, this));
-  SetState_s(data_channel_state);
-  return true;
-}
-
-DataChannelInterface::DataState QuicDataChannel::SetTransportChannel_w() {
-  RTC_DCHECK(worker_thread_->IsCurrent());
-  quic_transport_channel_->SignalReadyToSend.connect(
-      this, &QuicDataChannel::OnReadyToSend);
-  quic_transport_channel_->SignalClosed.connect(
-      this, &QuicDataChannel::OnConnectionClosed);
-  if (quic_transport_channel_->writable()) {
-    return kOpen;
-  }
-  return kConnecting;
-}
-
-void QuicDataChannel::OnIncomingMessage(Message&& message) {
-  RTC_DCHECK(network_thread_->IsCurrent());
-  RTC_DCHECK(message.stream);
-  if (!observer_) {
-    LOG(LS_WARNING) << "QUIC data channel " << id_
-                    << " received a message but has no observer.";
-    message.stream->Close();
-    return;
-  }
-  // A FIN is received if the message fits into a single QUIC stream frame and
-  // the remote peer is done sending.
-  if (message.stream->fin_received()) {
-    LOG(LS_INFO) << "Stream " << message.stream->id()
-                 << " has finished receiving data for QUIC data channel "
-                 << id_;
-    DataBuffer final_message(message.buffer, false);
-    invoker_.AsyncInvoke<void>(RTC_FROM_HERE, signaling_thread_,
-                               rtc::Bind(&QuicDataChannel::OnMessage_s, this,
-                                         std::move(final_message)));
-    message.stream->Close();
-    return;
-  }
-  // Otherwise the message is divided across multiple QUIC stream frames, so
-  // queue the data. OnDataReceived() will be called each time the remaining
-  // QUIC stream frames arrive.
-  LOG(LS_INFO) << "QUIC data channel " << id_
-               << " is queuing incoming data for stream "
-               << message.stream->id();
-  incoming_quic_messages_[message.stream->id()] = std::move(message);
-  message.stream->SignalDataReceived.connect(this,
-                                             &QuicDataChannel::OnDataReceived);
-  // The QUIC stream will be removed from |incoming_quic_messages_| once it
-  // closes.
-  message.stream->SignalClosed.connect(
-      this, &QuicDataChannel::OnIncomingQueuedStreamClosed);
-}
-
-void QuicDataChannel::OnDataReceived(net::QuicStreamId stream_id,
-                                     const char* data,
-                                     size_t len) {
-  RTC_DCHECK(network_thread_->IsCurrent());
-  RTC_DCHECK(data);
-  const auto& kv = incoming_quic_messages_.find(stream_id);
-  if (kv == incoming_quic_messages_.end()) {
-    RTC_NOTREACHED();
-    return;
-  }
-  Message& message = kv->second;
-  cricket::ReliableQuicStream* stream = message.stream;
-  rtc::CopyOnWriteBuffer& received_data = message.buffer;
-  // If the QUIC stream has not received a FIN, then the remote peer is not
-  // finished sending data.
-  if (!stream->fin_received()) {
-    received_data.AppendData(data, len);
-    return;
-  }
-  // Otherwise we are done receiving and can provide the data channel observer
-  // with the message.
-  LOG(LS_INFO) << "Stream " << stream_id
-               << " has finished receiving data for QUIC data channel " << id_;
-  received_data.AppendData(data, len);
-  DataBuffer final_message(std::move(received_data), false);
-  invoker_.AsyncInvoke<void>(
-      RTC_FROM_HERE, signaling_thread_,
-      rtc::Bind(&QuicDataChannel::OnMessage_s, this, std::move(final_message)));
-  // Once the stream is closed, OnDataReceived will not fire for the stream.
-  stream->Close();
-}
-
-void QuicDataChannel::OnReadyToSend(cricket::TransportChannel* channel) {
-  RTC_DCHECK(network_thread_->IsCurrent());
-  RTC_DCHECK(channel == quic_transport_channel_);
-  LOG(LS_INFO) << "QuicTransportChannel is ready to send";
-  invoker_.AsyncInvoke<void>(
-      RTC_FROM_HERE, signaling_thread_,
-      rtc::Bind(&QuicDataChannel::SetState_s, this, kOpen));
-}
-
-void QuicDataChannel::OnWriteBlockedStreamClosed(net::QuicStreamId stream_id,
-                                                 int error) {
-  RTC_DCHECK(worker_thread_->IsCurrent());
-  LOG(LS_VERBOSE) << "Write blocked stream " << stream_id << " is closed.";
-  write_blocked_quic_streams_.erase(stream_id);
-}
-
-void QuicDataChannel::OnIncomingQueuedStreamClosed(net::QuicStreamId stream_id,
-                                                   int error) {
-  RTC_DCHECK(network_thread_->IsCurrent());
-  LOG(LS_VERBOSE) << "Incoming queued stream " << stream_id << " is closed.";
-  incoming_quic_messages_.erase(stream_id);
-}
-
-void QuicDataChannel::OnConnectionClosed() {
-  RTC_DCHECK(worker_thread_->IsCurrent());
-  invoker_.AsyncInvoke<void>(RTC_FROM_HERE, signaling_thread_,
-                             rtc::Bind(&QuicDataChannel::Close, this));
-}
-
-void QuicDataChannel::OnMessage_s(const DataBuffer& received_data) {
-  RTC_DCHECK(signaling_thread_->IsCurrent());
-  if (observer_) {
-    observer_->OnMessage(received_data);
-  }
-}
-
-void QuicDataChannel::SetState_s(DataState state) {
-  RTC_DCHECK(signaling_thread_->IsCurrent());
-  if (state_ == state || state_ == kClosed) {
-    return;
-  }
-  if (state_ == kClosing && state != kClosed) {
-    return;
-  }
-  LOG(LS_INFO) << "Setting state to " << state << " for QUIC data channel "
-               << id_;
-  state_ = state;
-  if (observer_) {
-    observer_->OnStateChange();
-  }
-}
-
-void QuicDataChannel::OnBufferedAmountChange_s(uint64_t buffered_amount) {
-  RTC_DCHECK(signaling_thread_->IsCurrent());
-  if (observer_) {
-    observer_->OnBufferedAmountChange(buffered_amount);
-  }
-}
-
-size_t QuicDataChannel::GetNumWriteBlockedStreams() const {
-  return write_blocked_quic_streams_.size();
-}
-
-size_t QuicDataChannel::GetNumIncomingStreams() const {
-  return incoming_quic_messages_.size();
-}
-
-}  // namespace webrtc
diff --git a/pc/quicdatachannel.h b/pc/quicdatachannel.h
deleted file mode 100644
index f580c4b..0000000
--- a/pc/quicdatachannel.h
+++ /dev/null
@@ -1,220 +0,0 @@
-/*
- *  Copyright 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_PC_QUICDATACHANNEL_H_
-#define WEBRTC_PC_QUICDATACHANNEL_H_
-
-#include <string>
-#include <unordered_map>
-#include <unordered_set>
-
-#include "webrtc/api/datachannelinterface.h"
-#include "webrtc/rtc_base/asyncinvoker.h"
-#include "webrtc/rtc_base/sigslot.h"
-#include "webrtc/rtc_base/thread.h"
-
-namespace cricket {
-class QuicTransportChannel;
-class ReliableQuicStream;
-class TransportChannel;
-}  // namepsace cricket
-
-namespace net {
-// TODO(mikescarlett): Make this uint64_t once QUIC uses 64-bit ids.
-typedef uint32_t QuicStreamId;
-}  // namespace net
-
-namespace rtc {
-class CopyOnWriteBuffer;
-}  // namespace rtc
-
-namespace webrtc {
-
-// Encodes a QUIC message header with the data channel ID and message ID, then
-// stores the result in |header|.
-void WriteQuicDataChannelMessageHeader(int data_channel_id,
-                                       uint64_t message_id,
-                                       rtc::CopyOnWriteBuffer* header);
-
-// Decodes the data channel ID and message ID from the initial data received by
-// an incoming QUIC stream. The data channel ID is output to |data_channel_id|,
-// the message ID is output to |message_id|, and the number of bytes read is
-// output to |bytes_read|. Returns false if either ID cannot be read.
-bool ParseQuicDataMessageHeader(const char* data,
-                                size_t len,
-                                int* data_channel_id,
-                                uint64_t* message_id,
-                                size_t* bytes_read);
-
-// QuicDataChannel is an implementation of DataChannelInterface based on the
-// QUIC protocol. It uses a QuicTransportChannel to establish encryption and
-// transfer data, and a QuicDataTransport to receive incoming messages at
-// the correct data channel. Currently this class implements unordered, reliable
-// delivery and does not send an "OPEN" message.
-//
-// Each time a message is sent:
-//
-// - The QuicDataChannel prepends it with the data channel id and message id.
-//   The QuicTransportChannel creates a ReliableQuicStream, then the
-//   ReliableQuicStream sends the message with a FIN.
-//
-// - The remote QuicSession creates a ReliableQuicStream to receive the data.
-//   The remote QuicDataTransport dispatches the ReliableQuicStream to the
-//   QuicDataChannel with the same id as this data channel.
-//
-// - The remote QuicDataChannel queues data from the ReliableQuicStream. Once
-//   it receives a QUIC stream frame with a FIN, it provides the message to the
-//   DataChannelObserver.
-//
-// TODO(mikescarlett): Implement ordered delivery, unreliable delivery, and
-// an OPEN message similar to the one for SCTP.
-class QuicDataChannel : public rtc::RefCountedObject<DataChannelInterface>,
-                        public sigslot::has_slots<> {
- public:
-  // Message stores buffered data from the incoming QUIC stream. The QUIC stream
-  // is provided so that remaining data can be received from the remote peer.
-  struct Message {
-    uint64_t id;
-    rtc::CopyOnWriteBuffer buffer;
-    cricket::ReliableQuicStream* stream;
-  };
-
-  QuicDataChannel(rtc::Thread* signaling_thread,
-                  rtc::Thread* worker_thread,
-                  rtc::Thread* network_thread,
-                  const std::string& label,
-                  const DataChannelInit& config);
-  ~QuicDataChannel() override;
-
-  // DataChannelInterface overrides.
-  std::string label() const override { return label_; }
-  bool reliable() const override { return true; }
-  bool ordered() const override { return false; }
-  uint16_t maxRetransmitTime() const override { return -1; }
-  uint16_t maxRetransmits() const override { return -1; }
-  bool negotiated() const override { return false; }
-  int id() const override { return id_; }
-  DataState state() const override { return state_; }
-  uint64_t buffered_amount() const override { return buffered_amount_; }
-  std::string protocol() const override { return protocol_; }
-  void RegisterObserver(DataChannelObserver* observer) override;
-  void UnregisterObserver() override;
-  void Close() override;
-  bool Send(const DataBuffer& buffer) override;
-
-  // Called from QuicDataTransport to set the QUIC transport channel that the
-  // QuicDataChannel sends messages with. Returns false if a different QUIC
-  // transport channel is already set or |channel| is NULL.
-  //
-  // The QUIC transport channel is not set in the constructor to allow creating
-  // the QuicDataChannel before the PeerConnection has a QUIC transport channel,
-  // such as before the session description is not set.
-  bool SetTransportChannel(cricket::QuicTransportChannel* channel);
-
-  // Called from QuicDataTransport when an incoming ReliableQuicStream is
-  // receiving a message received for this data channel. Once this function is
-  // called, |message| is owned by the QuicDataChannel and should not be
-  // accessed by the QuicDataTransport.
-  void OnIncomingMessage(Message&& message);
-
-  // Methods for testing.
-  // Gets the number of outgoing QUIC streams with write blocked data that are
-  // currently open for this data channel and are not finished writing a
-  // message. This is equivalent to the size of |write_blocked_quic_streams_|.
-  size_t GetNumWriteBlockedStreams() const;
-  // Gets the number of incoming QUIC streams with buffered data that are
-  // currently open for this data channel and are not finished receiving a
-  // message. This is equivalent to the size of |incoming_quic_messages_|.
-  size_t GetNumIncomingStreams() const;
-
- private:
-  // Callbacks from ReliableQuicStream.
-  // Called when an incoming QUIC stream in |incoming_quic_messages_| has
-  // received a QUIC stream frame.
-  void OnDataReceived(net::QuicStreamId stream_id,
-                      const char* data,
-                      size_t len);
-  // Called when a write blocked QUIC stream that has been added to
-  // |write_blocked_quic_streams_| is closed.
-  void OnWriteBlockedStreamClosed(net::QuicStreamId stream_id, int error);
-  // Called when an incoming QUIC stream that has been added to
-  // |incoming_quic_messages_| is closed.
-  void OnIncomingQueuedStreamClosed(net::QuicStreamId stream_id, int error);
-  // Called when a write blocked QUIC stream in |write_blocked_quic_streams_|
-  // has written previously queued data.
-  void OnQueuedBytesWritten(net::QuicStreamId stream_id,
-                            uint64_t queued_bytes_written);
-
-  // Callbacks from |quic_transport_channel_|.
-  void OnReadyToSend(cricket::TransportChannel* channel);
-  void OnConnectionClosed();
-
-  // Network thread methods.
-  // Sends the data buffer to the remote peer using an outgoing QUIC stream.
-  // Returns true if the data buffer can be successfully sent, or if it is
-  // queued to be sent later.
-  bool Send_n(const DataBuffer& buffer);
-
-  // Worker thread methods.
-  // Connects the |quic_transport_channel_| signals to this QuicDataChannel,
-  // then returns the new QuicDataChannel state.
-  DataState SetTransportChannel_w();
-  // Closes the QUIC streams associated with this QuicDataChannel.
-  void Close_w();
-  // Sets |buffered_amount_|.
-  void SetBufferedAmount_w(uint64_t buffered_amount);
-
-  // Signaling thread methods.
-  // Triggers QuicDataChannelObserver::OnMessage when a message from the remote
-  // peer is ready to be read.
-  void OnMessage_s(const DataBuffer& received_data);
-  // Triggers QuicDataChannel::OnStateChange if the state change is valid.
-  // Otherwise does nothing if |state| == |state_| or |state| != kClosed when
-  // the data channel is closing.
-  void SetState_s(DataState state);
-  // Triggers QuicDataChannelObserver::OnBufferedAmountChange when the total
-  // buffered data changes for a QUIC stream.
-  void OnBufferedAmountChange_s(uint64_t buffered_amount);
-
-  // QUIC transport channel which owns the QUIC session. It is used to create
-  // a QUIC stream for sending outgoing messages.
-  cricket::QuicTransportChannel* quic_transport_channel_ = nullptr;
-  // Signaling thread for DataChannelInterface methods.
-  rtc::Thread* const signaling_thread_;
-  // Worker thread for |quic_transport_channel_| callbacks.
-  rtc::Thread* const worker_thread_;
-  // Network thread for sending data and |quic_transport_channel_| callbacks.
-  rtc::Thread* const network_thread_;
-  rtc::AsyncInvoker invoker_;
-  // Map of QUIC stream ID => ReliableQuicStream* for write blocked QUIC
-  // streams.
-  std::unordered_map<net::QuicStreamId, cricket::ReliableQuicStream*>
-      write_blocked_quic_streams_;
-  // Map of QUIC stream ID => Message for each incoming QUIC stream.
-  std::unordered_map<net::QuicStreamId, Message> incoming_quic_messages_;
-  // Handles received data from the remote peer and data channel state changes.
-  DataChannelObserver* observer_ = nullptr;
-  // QuicDataChannel ID.
-  int id_;
-  // Connectivity state of the QuicDataChannel.
-  DataState state_;
-  // Total bytes that are buffered among the QUIC streams.
-  uint64_t buffered_amount_;
-  // Counter for number of sent messages that is used for message IDs.
-  uint64_t next_message_id_;
-
-  // Variables for application use.
-  const std::string& label_;
-  const std::string& protocol_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_PC_QUICDATACHANNEL_H_
diff --git a/pc/quicdatachannel_unittest.cc b/pc/quicdatachannel_unittest.cc
deleted file mode 100644
index 173d6df..0000000
--- a/pc/quicdatachannel_unittest.cc
+++ /dev/null
@@ -1,658 +0,0 @@
-/*
- *  Copyright 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/pc/quicdatachannel.h"
-
-#include <map>
-#include <memory>
-#include <sstream>
-#include <string>
-#include <vector>
-
-#include "webrtc/p2p/base/faketransportcontroller.h"
-#include "webrtc/p2p/quic/quictransportchannel.h"
-#include "webrtc/p2p/quic/reliablequicstream.h"
-#include "webrtc/rtc_base/bind.h"
-#include "webrtc/rtc_base/gunit.h"
-#include "webrtc/rtc_base/scoped_ref_ptr.h"
-
-using cricket::FakeTransportChannel;
-using cricket::QuicTransportChannel;
-using cricket::ReliableQuicStream;
-
-using webrtc::DataBuffer;
-using webrtc::DataChannelObserver;
-using webrtc::DataChannelInit;
-using webrtc::QuicDataChannel;
-
-namespace {
-
-// Timeout for asynchronous operations.
-static const int kTimeoutMs = 1000;  // milliseconds
-
-// Small messages that can be sent within a single QUIC packet.
-static const std::string kSmallMessage1 = "Hello, world!";
-static const std::string kSmallMessage2 = "WebRTC";
-static const std::string kSmallMessage3 = "1";
-static const std::string kSmallMessage4 = "abcdefghijklmnopqrstuvwxyz";
-static const DataBuffer kSmallBuffer1(kSmallMessage1);
-static const DataBuffer kSmallBuffer2(kSmallMessage2);
-static const DataBuffer kSmallBuffer3(kSmallMessage3);
-static const DataBuffer kSmallBuffer4(kSmallMessage4);
-
-// Large messages (> 1350 bytes) that exceed the max size of a QUIC packet.
-// These are < 16 KB so they don't exceed the QUIC stream flow control limit.
-static const std::string kLargeMessage1 = std::string("a", 2000);
-static const std::string kLargeMessage2 = std::string("a", 4000);
-static const std::string kLargeMessage3 = std::string("a", 8000);
-static const std::string kLargeMessage4 = std::string("a", 12000);
-static const DataBuffer kLargeBuffer1(kLargeMessage1);
-static const DataBuffer kLargeBuffer2(kLargeMessage2);
-static const DataBuffer kLargeBuffer3(kLargeMessage3);
-static const DataBuffer kLargeBuffer4(kLargeMessage4);
-
-// Oversized message (> 16 KB) that violates the QUIC stream flow control limit.
-static const std::string kOversizedMessage = std::string("a", 20000);
-static const DataBuffer kOversizedBuffer(kOversizedMessage);
-
-// Creates a fingerprint from a certificate.
-static rtc::SSLFingerprint* CreateFingerprint(rtc::RTCCertificate* cert) {
-  std::string digest_algorithm;
-  cert->ssl_certificate().GetSignatureDigestAlgorithm(&digest_algorithm);
-  std::unique_ptr<rtc::SSLFingerprint> fingerprint(
-      rtc::SSLFingerprint::Create(digest_algorithm, cert->identity()));
-  return fingerprint.release();
-}
-
-// FakeObserver receives messages from the QuicDataChannel.
-class FakeObserver : public DataChannelObserver {
- public:
-  FakeObserver()
-      : on_state_change_count_(0), on_buffered_amount_change_count_(0) {}
-
-  // DataChannelObserver overrides.
-  void OnStateChange() override { ++on_state_change_count_; }
-  void OnBufferedAmountChange(uint64_t previous_amount) override {
-    ++on_buffered_amount_change_count_;
-  }
-  void OnMessage(const webrtc::DataBuffer& buffer) override {
-    messages_.push_back(std::string(buffer.data.data<char>(), buffer.size()));
-  }
-
-  const std::vector<std::string>& messages() const { return messages_; }
-
-  size_t messages_received() const { return messages_.size(); }
-
-  size_t on_state_change_count() const { return on_state_change_count_; }
-
-  size_t on_buffered_amount_change_count() const {
-    return on_buffered_amount_change_count_;
-  }
-
- private:
-  std::vector<std::string> messages_;
-  size_t on_state_change_count_;
-  size_t on_buffered_amount_change_count_;
-};
-
-// FakeQuicDataTransport simulates QuicDataTransport by dispatching QUIC
-// stream messages to data channels and encoding/decoding messages.
-class FakeQuicDataTransport : public sigslot::has_slots<> {
- public:
-  FakeQuicDataTransport() {}
-
-  void ConnectToTransportChannel(QuicTransportChannel* quic_transport_channel) {
-    quic_transport_channel->SignalIncomingStream.connect(
-        this, &FakeQuicDataTransport::OnIncomingStream);
-  }
-
-  rtc::scoped_refptr<QuicDataChannel> CreateDataChannel(
-      int id,
-      const std::string& label,
-      const std::string& protocol) {
-    DataChannelInit config;
-    config.id = id;
-    config.protocol = protocol;
-    rtc::scoped_refptr<QuicDataChannel> data_channel(
-        new QuicDataChannel(rtc::Thread::Current(), rtc::Thread::Current(),
-                            rtc::Thread::Current(), label, config));
-    data_channel_by_id_[id] = data_channel;
-    return data_channel;
-  }
-
- private:
-  void OnIncomingStream(cricket::ReliableQuicStream* stream) {
-    incoming_stream_ = stream;
-    incoming_stream_->SignalDataReceived.connect(
-        this, &FakeQuicDataTransport::OnDataReceived);
-  }
-
-  void OnDataReceived(net::QuicStreamId id, const char* data, size_t len) {
-    ASSERT_EQ(incoming_stream_->id(), id);
-    incoming_stream_->SignalDataReceived.disconnect(this);
-    // Retrieve the data channel ID and message ID.
-    int data_channel_id;
-    uint64_t message_id;
-    size_t bytes_read;
-    ASSERT_TRUE(webrtc::ParseQuicDataMessageHeader(data, len, &data_channel_id,
-                                                   &message_id, &bytes_read));
-    data += bytes_read;
-    len -= bytes_read;
-    // Dispatch the message to the matching QuicDataChannel.
-    const auto& kv = data_channel_by_id_.find(data_channel_id);
-    ASSERT_NE(kv, data_channel_by_id_.end());
-    QuicDataChannel* data_channel = kv->second;
-    QuicDataChannel::Message message;
-    message.id = message_id;
-    message.buffer = rtc::CopyOnWriteBuffer(data, len);
-    message.stream = incoming_stream_;
-    data_channel->OnIncomingMessage(std::move(message));
-    incoming_stream_ = nullptr;
-  }
-
-  // Map of data channel ID => QuicDataChannel.
-  std::map<int, rtc::scoped_refptr<QuicDataChannel>> data_channel_by_id_;
-  // Last incoming QUIC stream which has arrived.
-  cricket::ReliableQuicStream* incoming_stream_ = nullptr;
-};
-
-// A peer who creates a QuicDataChannel to transfer data, and simulates network
-// connectivity with a fake ICE channel wrapped by the QUIC transport channel.
-class QuicDataChannelPeer {
- public:
-  QuicDataChannelPeer()
-      : ice_transport_channel_(new FakeTransportChannel("data", 0)),
-        quic_transport_channel_(ice_transport_channel_) {
-    ice_transport_channel_->SetAsync(true);
-    fake_quic_data_transport_.ConnectToTransportChannel(
-        &quic_transport_channel_);
-  }
-
-  void GenerateCertificateAndFingerprint() {
-    rtc::scoped_refptr<rtc::RTCCertificate> local_cert =
-        rtc::RTCCertificate::Create(std::unique_ptr<rtc::SSLIdentity>(
-            rtc::SSLIdentity::Generate("cert_name", rtc::KT_DEFAULT)));
-    quic_transport_channel_.SetLocalCertificate(local_cert);
-    local_fingerprint_.reset(CreateFingerprint(local_cert.get()));
-  }
-
-  rtc::scoped_refptr<QuicDataChannel> CreateDataChannelWithTransportChannel(
-      int id,
-      const std::string& label,
-      const std::string& protocol) {
-    rtc::scoped_refptr<QuicDataChannel> data_channel =
-        fake_quic_data_transport_.CreateDataChannel(id, label, protocol);
-    data_channel->SetTransportChannel(&quic_transport_channel_);
-    return data_channel;
-  }
-
-  rtc::scoped_refptr<QuicDataChannel> CreateDataChannelWithoutTransportChannel(
-      int id,
-      const std::string& label,
-      const std::string& protocol) {
-    return fake_quic_data_transport_.CreateDataChannel(id, label, protocol);
-  }
-
-  // Connects |ice_transport_channel_| to that of the other peer.
-  void Connect(QuicDataChannelPeer* other_peer) {
-    ice_transport_channel_->SetDestination(other_peer->ice_transport_channel_);
-  }
-
-  std::unique_ptr<rtc::SSLFingerprint>& local_fingerprint() {
-    return local_fingerprint_;
-  }
-
-  QuicTransportChannel* quic_transport_channel() {
-    return &quic_transport_channel_;
-  }
-
-  FakeTransportChannel* ice_transport_channel() {
-    return ice_transport_channel_;
-  }
-
- private:
-  FakeTransportChannel* ice_transport_channel_;
-  QuicTransportChannel quic_transport_channel_;
-
-  std::unique_ptr<rtc::SSLFingerprint> local_fingerprint_;
-
-  FakeQuicDataTransport fake_quic_data_transport_;
-};
-
-class QuicDataChannelTest : public testing::Test {
- public:
-  QuicDataChannelTest() {}
-
-  // Connect the QuicTransportChannels and complete the crypto handshake.
-  void ConnectTransportChannels() {
-    SetCryptoParameters();
-    peer1_.Connect(&peer2_);
-    ASSERT_TRUE_WAIT(peer1_.quic_transport_channel()->writable() &&
-                         peer2_.quic_transport_channel()->writable(),
-                     kTimeoutMs);
-  }
-
-  // Sets crypto parameters required for the QUIC handshake.
-  void SetCryptoParameters() {
-    peer1_.GenerateCertificateAndFingerprint();
-    peer2_.GenerateCertificateAndFingerprint();
-
-    peer1_.quic_transport_channel()->SetSslRole(rtc::SSL_CLIENT);
-    peer2_.quic_transport_channel()->SetSslRole(rtc::SSL_SERVER);
-
-    std::unique_ptr<rtc::SSLFingerprint>& peer1_fingerprint =
-        peer1_.local_fingerprint();
-    std::unique_ptr<rtc::SSLFingerprint>& peer2_fingerprint =
-        peer2_.local_fingerprint();
-
-    peer1_.quic_transport_channel()->SetRemoteFingerprint(
-        peer2_fingerprint->algorithm,
-        reinterpret_cast<const uint8_t*>(peer2_fingerprint->digest.data()),
-        peer2_fingerprint->digest.size());
-    peer2_.quic_transport_channel()->SetRemoteFingerprint(
-        peer1_fingerprint->algorithm,
-        reinterpret_cast<const uint8_t*>(peer1_fingerprint->digest.data()),
-        peer1_fingerprint->digest.size());
-  }
-
- protected:
-  QuicDataChannelPeer peer1_;
-  QuicDataChannelPeer peer2_;
-};
-
-// Tests that a QuicDataChannel transitions from connecting to open when
-// the QuicTransportChannel becomes writable for the first time.
-TEST_F(QuicDataChannelTest, DataChannelOpensWhenTransportChannelConnects) {
-  rtc::scoped_refptr<QuicDataChannel> data_channel =
-      peer1_.CreateDataChannelWithTransportChannel(4, "label", "protocol");
-  EXPECT_EQ(webrtc::DataChannelInterface::kConnecting, data_channel->state());
-  ConnectTransportChannels();
-  EXPECT_EQ_WAIT(webrtc::DataChannelInterface::kOpen, data_channel->state(),
-                 kTimeoutMs);
-}
-
-// Tests that a QuicDataChannel transitions from connecting to open when
-// SetTransportChannel is called with a QuicTransportChannel that is already
-// writable.
-TEST_F(QuicDataChannelTest, DataChannelOpensWhenTransportChannelWritable) {
-  rtc::scoped_refptr<QuicDataChannel> data_channel =
-      peer1_.CreateDataChannelWithoutTransportChannel(4, "label", "protocol");
-  ConnectTransportChannels();
-  EXPECT_EQ(webrtc::DataChannelInterface::kConnecting, data_channel->state());
-  data_channel->SetTransportChannel(peer1_.quic_transport_channel());
-  EXPECT_EQ(webrtc::DataChannelInterface::kOpen, data_channel->state());
-}
-
-// Tests that the QuicDataChannel transfers messages small enough to fit into a
-// single QUIC stream frame.
-TEST_F(QuicDataChannelTest, TransferSmallMessage) {
-  ConnectTransportChannels();
-  int data_channel_id = 2;
-  std::string label = "label";
-  std::string protocol = "protocol";
-  rtc::scoped_refptr<QuicDataChannel> peer1_data_channel =
-      peer1_.CreateDataChannelWithTransportChannel(data_channel_id, label,
-                                                   protocol);
-  ASSERT_TRUE(peer1_data_channel->state() ==
-              webrtc::DataChannelInterface::kOpen);
-  rtc::scoped_refptr<QuicDataChannel> peer2_data_channel =
-      peer2_.CreateDataChannelWithTransportChannel(data_channel_id, label,
-                                                   protocol);
-  ASSERT_TRUE(peer2_data_channel->state() ==
-              webrtc::DataChannelInterface::kOpen);
-
-  FakeObserver peer1_observer;
-  peer1_data_channel->RegisterObserver(&peer1_observer);
-  FakeObserver peer2_observer;
-  peer2_data_channel->RegisterObserver(&peer2_observer);
-
-  // peer1 -> peer2
-  EXPECT_TRUE(peer1_data_channel->Send(kSmallBuffer1));
-  ASSERT_EQ_WAIT(1, peer2_observer.messages_received(), kTimeoutMs);
-  EXPECT_EQ(kSmallMessage1, peer2_observer.messages()[0]);
-  // peer2 -> peer1
-  EXPECT_TRUE(peer2_data_channel->Send(kSmallBuffer2));
-  ASSERT_EQ_WAIT(1, peer1_observer.messages_received(), kTimeoutMs);
-  EXPECT_EQ(kSmallMessage2, peer1_observer.messages()[0]);
-  // peer2 -> peer1
-  EXPECT_TRUE(peer2_data_channel->Send(kSmallBuffer3));
-  ASSERT_EQ_WAIT(2, peer1_observer.messages_received(), kTimeoutMs);
-  EXPECT_EQ(kSmallMessage3, peer1_observer.messages()[1]);
-  // peer1 -> peer2
-  EXPECT_TRUE(peer1_data_channel->Send(kSmallBuffer4));
-  ASSERT_EQ_WAIT(2, peer2_observer.messages_received(), kTimeoutMs);
-  EXPECT_EQ(kSmallMessage4, peer2_observer.messages()[1]);
-}
-
-// Tests that QuicDataChannel transfers messages large enough to fit into
-// multiple QUIC stream frames, which don't violate the QUIC flow control limit.
-// These require buffering by the QuicDataChannel.
-TEST_F(QuicDataChannelTest, TransferLargeMessage) {
-  ConnectTransportChannels();
-  int data_channel_id = 347;
-  std::string label = "label";
-  std::string protocol = "protocol";
-  rtc::scoped_refptr<QuicDataChannel> peer1_data_channel =
-      peer1_.CreateDataChannelWithTransportChannel(data_channel_id, label,
-                                                   protocol);
-  ASSERT_TRUE(peer1_data_channel->state() ==
-              webrtc::DataChannelInterface::kOpen);
-  rtc::scoped_refptr<QuicDataChannel> peer2_data_channel =
-      peer2_.CreateDataChannelWithTransportChannel(data_channel_id, label,
-                                                   protocol);
-  ASSERT_TRUE(peer2_data_channel->state() ==
-              webrtc::DataChannelInterface::kOpen);
-
-  FakeObserver peer1_observer;
-  peer1_data_channel->RegisterObserver(&peer1_observer);
-  FakeObserver peer2_observer;
-  peer2_data_channel->RegisterObserver(&peer2_observer);
-
-  // peer1 -> peer2
-  EXPECT_TRUE(peer1_data_channel->Send(kLargeBuffer1));
-  ASSERT_TRUE_WAIT(peer2_observer.messages_received() == 1, kTimeoutMs);
-  EXPECT_EQ(kLargeMessage1, peer2_observer.messages()[0]);
-  // peer2 -> peer1
-  EXPECT_TRUE(peer2_data_channel->Send(kLargeBuffer2));
-  ASSERT_EQ_WAIT(1, peer1_observer.messages_received(), kTimeoutMs);
-  EXPECT_EQ(kLargeMessage2, peer1_observer.messages()[0]);
-  // peer2 -> peer1
-  EXPECT_TRUE(peer2_data_channel->Send(kLargeBuffer3));
-  ASSERT_EQ_WAIT(2, peer1_observer.messages_received(), kTimeoutMs);
-  EXPECT_EQ(kLargeMessage3, peer1_observer.messages()[1]);
-  // peer1 -> peer2
-  EXPECT_TRUE(peer1_data_channel->Send(kLargeBuffer4));
-  ASSERT_EQ_WAIT(2, peer2_observer.messages_received(), kTimeoutMs);
-  EXPECT_EQ(kLargeMessage4, peer2_observer.messages()[1]);
-}
-
-// Tests that when a message size exceeds the flow control limit (> 16KB), the
-// QuicDataChannel can queue the data and send it after receiving window update
-// frames from the remote peer.
-TEST_F(QuicDataChannelTest, TransferOversizedMessage) {
-  ConnectTransportChannels();
-  int data_channel_id = 189;
-  std::string label = "label";
-  std::string protocol = "protocol";
-  rtc::scoped_refptr<QuicDataChannel> peer1_data_channel =
-      peer1_.CreateDataChannelWithTransportChannel(data_channel_id, label,
-                                                   protocol);
-  rtc::scoped_refptr<QuicDataChannel> peer2_data_channel =
-      peer2_.CreateDataChannelWithTransportChannel(data_channel_id, label,
-                                                   protocol);
-  ASSERT_TRUE(peer2_data_channel->state() ==
-              webrtc::DataChannelInterface::kOpen);
-
-  FakeObserver peer1_observer;
-  peer1_data_channel->RegisterObserver(&peer1_observer);
-  FakeObserver peer2_observer;
-  peer2_data_channel->RegisterObserver(&peer2_observer);
-
-  EXPECT_TRUE(peer1_data_channel->Send(kOversizedBuffer));
-  EXPECT_EQ(1, peer1_data_channel->GetNumWriteBlockedStreams());
-  EXPECT_EQ_WAIT(1, peer2_data_channel->GetNumIncomingStreams(), kTimeoutMs);
-  ASSERT_EQ_WAIT(1, peer2_observer.messages_received(), kTimeoutMs);
-  EXPECT_EQ(kOversizedMessage, peer2_observer.messages()[0]);
-  EXPECT_EQ(0, peer1_data_channel->GetNumWriteBlockedStreams());
-  EXPECT_EQ(0, peer2_data_channel->GetNumIncomingStreams());
-}
-
-// Tests that empty messages can be sent.
-TEST_F(QuicDataChannelTest, TransferEmptyMessage) {
-  ConnectTransportChannels();
-  int data_channel_id = 69;
-  std::string label = "label";
-  std::string protocol = "protocol";
-  rtc::scoped_refptr<QuicDataChannel> peer1_data_channel =
-      peer1_.CreateDataChannelWithTransportChannel(data_channel_id, label,
-                                                   protocol);
-  rtc::scoped_refptr<QuicDataChannel> peer2_data_channel =
-      peer2_.CreateDataChannelWithTransportChannel(data_channel_id, label,
-                                                   protocol);
-  ASSERT_TRUE(peer2_data_channel->state() ==
-              webrtc::DataChannelInterface::kOpen);
-
-  FakeObserver peer1_observer;
-  peer1_data_channel->RegisterObserver(&peer1_observer);
-  FakeObserver peer2_observer;
-  peer2_data_channel->RegisterObserver(&peer2_observer);
-
-  EXPECT_TRUE(peer1_data_channel->Send(DataBuffer("")));
-  ASSERT_EQ_WAIT(1, peer2_observer.messages_received(), kTimeoutMs);
-  EXPECT_EQ("", peer2_observer.messages()[0]);
-}
-
-// Tests that when the QuicDataChannel is open and sends a message while the
-// QuicTransportChannel is unwritable, it gets buffered then received once the
-// QuicTransportChannel becomes writable again.
-TEST_F(QuicDataChannelTest, MessagesReceivedWhenTransportChannelReconnects) {
-  ConnectTransportChannels();
-  int data_channel_id = 401;
-  std::string label = "label";
-  std::string protocol = "protocol";
-  rtc::scoped_refptr<QuicDataChannel> peer1_data_channel =
-      peer1_.CreateDataChannelWithTransportChannel(data_channel_id, label,
-                                                   protocol);
-  ASSERT_TRUE(peer1_data_channel->state() ==
-              webrtc::DataChannelInterface::kOpen);
-  rtc::scoped_refptr<QuicDataChannel> peer2_data_channel =
-      peer2_.CreateDataChannelWithTransportChannel(data_channel_id, label,
-                                                   protocol);
-  ASSERT_TRUE(peer2_data_channel->state() ==
-              webrtc::DataChannelInterface::kOpen);
-
-  FakeObserver peer1_observer;
-  peer1_data_channel->RegisterObserver(&peer1_observer);
-  FakeObserver peer2_observer;
-  peer2_data_channel->RegisterObserver(&peer2_observer);
-  // writable => unwritable
-  peer1_.ice_transport_channel()->SetWritable(false);
-  ASSERT_FALSE(peer1_.quic_transport_channel()->writable());
-  // Verify that sent data is buffered.
-  EXPECT_TRUE(peer1_data_channel->Send(kSmallBuffer1));
-  EXPECT_EQ(1, peer1_data_channel->GetNumWriteBlockedStreams());
-  EXPECT_TRUE(peer1_data_channel->Send(kSmallBuffer2));
-  EXPECT_EQ(2, peer1_data_channel->GetNumWriteBlockedStreams());
-  EXPECT_TRUE(peer1_data_channel->Send(kSmallBuffer3));
-  EXPECT_EQ(3, peer1_data_channel->GetNumWriteBlockedStreams());
-  EXPECT_TRUE(peer1_data_channel->Send(kSmallBuffer4));
-  EXPECT_EQ(4, peer1_data_channel->GetNumWriteBlockedStreams());
-  // unwritable => writable
-  peer1_.ice_transport_channel()->SetWritable(true);
-  ASSERT_TRUE(peer1_.quic_transport_channel()->writable());
-  ASSERT_EQ_WAIT(4, peer2_observer.messages_received(), kTimeoutMs);
-  EXPECT_EQ(0, peer1_data_channel->GetNumWriteBlockedStreams());
-  EXPECT_EQ(0, peer2_data_channel->GetNumIncomingStreams());
-}
-
-// Tests that the QuicDataChannel does not send before it is open.
-TEST_F(QuicDataChannelTest, TransferMessageBeforeChannelOpens) {
-  rtc::scoped_refptr<QuicDataChannel> data_channel =
-      peer1_.CreateDataChannelWithTransportChannel(6, "label", "protocol");
-  ASSERT_TRUE(data_channel->state() ==
-              webrtc::DataChannelInterface::kConnecting);
-  EXPECT_FALSE(data_channel->Send(kSmallBuffer1));
-}
-
-// Tests that the QuicDataChannel does not send after it is closed.
-TEST_F(QuicDataChannelTest, TransferDataAfterChannelClosed) {
-  rtc::scoped_refptr<QuicDataChannel> data_channel =
-      peer1_.CreateDataChannelWithTransportChannel(42, "label", "protocol");
-  data_channel->Close();
-  ASSERT_EQ_WAIT(webrtc::DataChannelInterface::kClosed, data_channel->state(),
-                 kTimeoutMs);
-  EXPECT_FALSE(data_channel->Send(kSmallBuffer1));
-}
-
-// Tests that QuicDataChannel state changes fire OnStateChanged() for the
-// observer, with the correct data channel states, when the data channel
-// transitions from kConnecting => kOpen => kClosing => kClosed.
-TEST_F(QuicDataChannelTest, OnStateChangedFired) {
-  rtc::scoped_refptr<QuicDataChannel> data_channel =
-      peer1_.CreateDataChannelWithTransportChannel(7, "label", "protocol");
-  FakeObserver observer;
-  data_channel->RegisterObserver(&observer);
-  EXPECT_EQ(webrtc::DataChannelInterface::kConnecting, data_channel->state());
-  EXPECT_EQ(0, observer.on_state_change_count());
-  ConnectTransportChannels();
-  EXPECT_EQ_WAIT(webrtc::DataChannelInterface::kOpen, data_channel->state(),
-                 kTimeoutMs);
-  EXPECT_EQ(1, observer.on_state_change_count());
-  data_channel->Close();
-  EXPECT_EQ_WAIT(webrtc::DataChannelInterface::kClosed, data_channel->state(),
-                 kTimeoutMs);
-  // 2 state changes due to kClosing and kClosed.
-  EXPECT_EQ(3, observer.on_state_change_count());
-}
-
-// Tests that a QuicTransportChannel can be closed without being opened when it
-// is connected to a transprot chanenl.
-TEST_F(QuicDataChannelTest, NeverOpenedWithTransportChannel) {
-  rtc::scoped_refptr<QuicDataChannel> data_channel =
-      peer1_.CreateDataChannelWithTransportChannel(7, "label", "protocol");
-  EXPECT_EQ(webrtc::DataChannelInterface::kConnecting, data_channel->state());
-  data_channel->Close();
-  EXPECT_EQ_WAIT(webrtc::DataChannelInterface::kClosed, data_channel->state(),
-                 kTimeoutMs);
-}
-
-// Tests that a QuicTransportChannel can be closed without being opened or
-// connected to a transport channel.
-TEST_F(QuicDataChannelTest, NeverOpenedWithoutTransportChannel) {
-  rtc::scoped_refptr<QuicDataChannel> data_channel =
-      peer1_.CreateDataChannelWithoutTransportChannel(7, "label", "protocol");
-  EXPECT_EQ(webrtc::DataChannelInterface::kConnecting, data_channel->state());
-  data_channel->Close();
-  EXPECT_EQ_WAIT(webrtc::DataChannelInterface::kClosed, data_channel->state(),
-                 kTimeoutMs);
-}
-
-// Tests that the QuicDataChannel is closed when the QUIC connection closes.
-TEST_F(QuicDataChannelTest, ClosedOnTransportError) {
-  ConnectTransportChannels();
-  rtc::scoped_refptr<QuicDataChannel> data_channel =
-      peer1_.CreateDataChannelWithTransportChannel(1, "label", "protocol");
-  EXPECT_EQ(webrtc::DataChannelInterface::kOpen, data_channel->state());
-  ReliableQuicStream* stream =
-      peer1_.quic_transport_channel()->CreateQuicStream();
-  ASSERT_NE(nullptr, stream);
-  stream->CloseConnectionWithDetails(net::QuicErrorCode::QUIC_NO_ERROR,
-                                     "Closing QUIC for testing");
-  EXPECT_EQ_WAIT(webrtc::DataChannelInterface::kClosed, data_channel->state(),
-                 kTimeoutMs);
-}
-
-// Tests that an already closed QuicDataChannel does not fire onStateChange and
-// remains closed.
-TEST_F(QuicDataChannelTest, DoesNotChangeStateWhenClosed) {
-  rtc::scoped_refptr<QuicDataChannel> data_channel =
-      peer1_.CreateDataChannelWithTransportChannel(4, "label", "protocol");
-  FakeObserver observer;
-  data_channel->RegisterObserver(&observer);
-  data_channel->Close();
-  EXPECT_EQ_WAIT(webrtc::DataChannelInterface::kClosed, data_channel->state(),
-                 kTimeoutMs);
-  // OnStateChange called for kClosing and kClosed.
-  EXPECT_EQ(2, observer.on_state_change_count());
-  // Call Close() again to verify that the state cannot be kClosing.
-  data_channel->Close();
-  EXPECT_EQ(webrtc::DataChannelInterface::kClosed, data_channel->state());
-  EXPECT_EQ(2, observer.on_state_change_count());
-  ConnectTransportChannels();
-  EXPECT_EQ(webrtc::DataChannelInterface::kClosed, data_channel->state());
-  EXPECT_EQ(2, observer.on_state_change_count());
-  // writable => unwritable
-  peer1_.ice_transport_channel()->SetWritable(false);
-  ASSERT_FALSE(peer1_.quic_transport_channel()->writable());
-  EXPECT_EQ(webrtc::DataChannelInterface::kClosed, data_channel->state());
-  EXPECT_EQ(2, observer.on_state_change_count());
-  // unwritable => writable
-  peer1_.ice_transport_channel()->SetWritable(true);
-  ASSERT_TRUE(peer1_.quic_transport_channel()->writable());
-  EXPECT_EQ(webrtc::DataChannelInterface::kClosed, data_channel->state());
-  EXPECT_EQ(2, observer.on_state_change_count());
-}
-
-// Tests that when the QuicDataChannel is open and the QuicTransportChannel
-// transitions between writable and unwritable, it does not fire onStateChange
-// and remains open.
-TEST_F(QuicDataChannelTest, DoesNotChangeStateWhenTransportChannelReconnects) {
-  ConnectTransportChannels();
-  rtc::scoped_refptr<QuicDataChannel> data_channel =
-      peer1_.CreateDataChannelWithTransportChannel(4, "label", "protocol");
-  FakeObserver observer;
-  data_channel->RegisterObserver(&observer);
-  EXPECT_EQ(webrtc::DataChannelInterface::kOpen, data_channel->state());
-  EXPECT_EQ(0, observer.on_state_change_count());
-  // writable => unwritable
-  peer1_.ice_transport_channel()->SetWritable(false);
-  ASSERT_FALSE(peer1_.quic_transport_channel()->writable());
-  EXPECT_EQ(webrtc::DataChannelInterface::kOpen, data_channel->state());
-  EXPECT_EQ(0, observer.on_state_change_count());
-  // unwritable => writable
-  peer1_.ice_transport_channel()->SetWritable(true);
-  ASSERT_TRUE(peer1_.quic_transport_channel()->writable());
-  EXPECT_EQ(webrtc::DataChannelInterface::kOpen, data_channel->state());
-  EXPECT_EQ(0, observer.on_state_change_count());
-}
-
-// Tests that SetTransportChannel returns false when setting a NULL transport
-// channel or a transport channel that is not equivalent to the one already set.
-TEST_F(QuicDataChannelTest, SetTransportChannelReturnValue) {
-  rtc::scoped_refptr<QuicDataChannel> data_channel =
-      peer1_.CreateDataChannelWithTransportChannel(4, "label", "protocol");
-  EXPECT_FALSE(data_channel->SetTransportChannel(nullptr));
-  QuicTransportChannel* transport_channel = peer1_.quic_transport_channel();
-  EXPECT_TRUE(data_channel->SetTransportChannel(transport_channel));
-  EXPECT_TRUE(data_channel->SetTransportChannel(transport_channel));
-  QuicTransportChannel* other_transport_channel =
-      peer2_.quic_transport_channel();
-  EXPECT_FALSE(data_channel->SetTransportChannel(other_transport_channel));
-}
-
-// Tests that the QUIC message header is encoded with the correct number of
-// bytes and is properly decoded.
-TEST_F(QuicDataChannelTest, EncodeParseQuicDataMessageHeader) {
-  int data_channel_id1 = 127;  // 1 byte
-  uint64_t message_id1 = 0;    // 1 byte
-  rtc::CopyOnWriteBuffer header1;
-  webrtc::WriteQuicDataChannelMessageHeader(data_channel_id1, message_id1,
-                                            &header1);
-  EXPECT_EQ(2u, header1.size());
-
-  int decoded_data_channel_id1;
-  uint64_t decoded_message_id1;
-  size_t bytes_read1;
-  ASSERT_TRUE(webrtc::ParseQuicDataMessageHeader(
-      header1.data<char>(), header1.size(), &decoded_data_channel_id1,
-      &decoded_message_id1, &bytes_read1));
-  EXPECT_EQ(data_channel_id1, decoded_data_channel_id1);
-  EXPECT_EQ(message_id1, decoded_message_id1);
-  EXPECT_EQ(2u, bytes_read1);
-
-  int data_channel_id2 = 4178;           // 2 bytes
-  uint64_t message_id2 = 1324921792003;  // 6 bytes
-  rtc::CopyOnWriteBuffer header2;
-  webrtc::WriteQuicDataChannelMessageHeader(data_channel_id2, message_id2,
-                                            &header2);
-  EXPECT_EQ(8u, header2.size());
-
-  int decoded_data_channel_id2;
-  uint64_t decoded_message_id2;
-  size_t bytes_read2;
-  ASSERT_TRUE(webrtc::ParseQuicDataMessageHeader(
-      header2.data<char>(), header2.size(), &decoded_data_channel_id2,
-      &decoded_message_id2, &bytes_read2));
-  EXPECT_EQ(data_channel_id2, decoded_data_channel_id2);
-  EXPECT_EQ(message_id2, decoded_message_id2);
-  EXPECT_EQ(8u, bytes_read2);
-}
-
-}  // namespace
diff --git a/pc/quicdatatransport.cc b/pc/quicdatatransport.cc
deleted file mode 100644
index 142085e..0000000
--- a/pc/quicdatatransport.cc
+++ /dev/null
@@ -1,197 +0,0 @@
-/*
- *  Copyright 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/pc/quicdatatransport.h"
-
-#include "webrtc/p2p/quic/quictransportchannel.h"
-#include "webrtc/p2p/quic/reliablequicstream.h"
-#include "webrtc/rtc_base/bind.h"
-#include "webrtc/rtc_base/logging.h"
-
-namespace webrtc {
-
-QuicDataTransport::QuicDataTransport(
-    rtc::Thread* signaling_thread,
-    rtc::Thread* worker_thread,
-    rtc::Thread* network_thread,
-    cricket::TransportController* transport_controller)
-    : signaling_thread_(signaling_thread),
-      worker_thread_(worker_thread),
-      network_thread_(network_thread),
-      transport_controller_(transport_controller) {
-  RTC_DCHECK(signaling_thread_);
-  RTC_DCHECK(worker_thread_);
-  RTC_DCHECK(network_thread_);
-}
-
-QuicDataTransport::~QuicDataTransport() {
-  DestroyTransportChannel(quic_transport_channel_);
-  LOG(LS_INFO) << "Destroyed the QUIC data transport.";
-}
-
-bool QuicDataTransport::SetTransport(const std::string& transport_name) {
-  if (transport_name_ == transport_name) {
-    // Nothing to do if transport name isn't changing
-    return true;
-  }
-
-  cricket::QuicTransportChannel* transport_channel =
-      CreateTransportChannel(transport_name);
-  if (!SetTransportChannel(transport_channel)) {
-    DestroyTransportChannel(transport_channel);
-    return false;
-  }
-
-  transport_name_ = transport_name;
-  return true;
-}
-
-bool QuicDataTransport::SetTransportChannel(
-    cricket::QuicTransportChannel* channel) {
-  if (!channel) {
-    LOG(LS_ERROR) << "|channel| is NULL. Cannot set transport channel.";
-    return false;
-  }
-  if (quic_transport_channel_) {
-    if (channel == quic_transport_channel_) {
-      LOG(LS_WARNING) << "Ignoring duplicate transport channel.";
-      return true;
-    }
-    LOG(LS_ERROR) << "|channel| does not match existing transport channel.";
-    return false;
-  }
-
-  LOG(LS_INFO) << "Setting QuicTransportChannel for QuicDataTransport";
-  quic_transport_channel_ = channel;
-  quic_transport_channel_->SignalIncomingStream.connect(
-      this, &QuicDataTransport::OnIncomingStream);
-  bool success = true;
-  for (const auto& kv : data_channel_by_id_) {
-    rtc::scoped_refptr<QuicDataChannel> data_channel = kv.second;
-    if (!data_channel->SetTransportChannel(quic_transport_channel_)) {
-      LOG(LS_ERROR)
-          << "Cannot set QUIC transport channel for QUIC data channel "
-          << kv.first;
-      success = false;
-    }
-  }
-  return success;
-}
-
-rtc::scoped_refptr<DataChannelInterface> QuicDataTransport::CreateDataChannel(
-    const std::string& label,
-    const DataChannelInit* config) {
-  if (config == nullptr) {
-    return nullptr;
-  }
-  if (data_channel_by_id_.find(config->id) != data_channel_by_id_.end()) {
-    LOG(LS_ERROR) << "QUIC data channel already exists with id " << config->id;
-    return nullptr;
-  }
-  rtc::scoped_refptr<QuicDataChannel> data_channel(new QuicDataChannel(
-      signaling_thread_, worker_thread_, network_thread_, label, *config));
-  if (quic_transport_channel_) {
-    if (!data_channel->SetTransportChannel(quic_transport_channel_)) {
-      LOG(LS_ERROR)
-          << "Cannot set QUIC transport channel for QUIC data channel "
-          << config->id;
-    }
-  }
-
-  data_channel_by_id_[data_channel->id()] = data_channel;
-  return data_channel;
-}
-
-void QuicDataTransport::DestroyDataChannel(int id) {
-  data_channel_by_id_.erase(id);
-}
-
-bool QuicDataTransport::HasDataChannel(int id) const {
-  return data_channel_by_id_.find(id) != data_channel_by_id_.end();
-}
-
-bool QuicDataTransport::HasDataChannels() const {
-  return !data_channel_by_id_.empty();
-}
-
-// Called when a QUIC stream is created for incoming data.
-void QuicDataTransport::OnIncomingStream(cricket::ReliableQuicStream* stream) {
-  RTC_DCHECK(stream != nullptr);
-  quic_stream_by_id_[stream->id()] = stream;
-  stream->SignalDataReceived.connect(this, &QuicDataTransport::OnDataReceived);
-}
-
-// Called when the first QUIC stream frame is received for incoming data.
-void QuicDataTransport::OnDataReceived(net::QuicStreamId id,
-                                       const char* data,
-                                       size_t len) {
-  const auto& quic_stream_kv = quic_stream_by_id_.find(id);
-  if (quic_stream_kv == quic_stream_by_id_.end()) {
-    RTC_NOTREACHED();
-    return;
-  }
-  cricket::ReliableQuicStream* stream = quic_stream_kv->second;
-  stream->SignalDataReceived.disconnect(this);
-  quic_stream_by_id_.erase(id);
-  // Read the data channel ID and message ID.
-  int data_channel_id;
-  uint64_t message_id;
-  size_t bytes_read;
-  if (!ParseQuicDataMessageHeader(data, len, &data_channel_id, &message_id,
-                                  &bytes_read)) {
-    LOG(LS_ERROR) << "Could not read QUIC message header from QUIC stream "
-                  << id;
-    return;
-  }
-  data += bytes_read;
-  len -= bytes_read;
-  // Retrieve the data channel which will handle the message.
-  const auto& data_channel_kv = data_channel_by_id_.find(data_channel_id);
-  if (data_channel_kv == data_channel_by_id_.end()) {
-    // TODO(mikescarlett): Implement OPEN message to create a new
-    // QuicDataChannel when messages are received for a nonexistent ID.
-    LOG(LS_ERROR) << "Data was received for QUIC data channel "
-                  << data_channel_id
-                  << " but it is not registered to the QuicDataTransport.";
-    return;
-  }
-  QuicDataChannel* data_channel = data_channel_kv->second;
-  QuicDataChannel::Message message;
-  message.id = message_id;
-  message.buffer = rtc::CopyOnWriteBuffer(data, len);
-  message.stream = stream;
-  data_channel->OnIncomingMessage(std::move(message));
-}
-
-cricket::QuicTransportChannel* QuicDataTransport::CreateTransportChannel(
-    const std::string& transport_name) {
-  DCHECK(transport_controller_->quic());
-
-  cricket::TransportChannel* transport_channel =
-      network_thread_->Invoke<cricket::TransportChannel*>(
-          RTC_FROM_HERE,
-          rtc::Bind(&cricket::TransportController::CreateTransportChannel_n,
-                    transport_controller_, transport_name,
-                    cricket::ICE_CANDIDATE_COMPONENT_DEFAULT));
-  return static_cast<cricket::QuicTransportChannel*>(transport_channel);
-}
-
-void QuicDataTransport::DestroyTransportChannel(
-    cricket::TransportChannel* transport_channel) {
-  if (transport_channel) {
-    network_thread_->Invoke<void>(
-        RTC_FROM_HERE,
-        rtc::Bind(&cricket::TransportController::DestroyTransportChannel_n,
-                  transport_controller_, transport_channel->transport_name(),
-                  cricket::ICE_CANDIDATE_COMPONENT_DEFAULT));
-  }
-}
-
-}  // namespace webrtc
diff --git a/pc/quicdatatransport.h b/pc/quicdatatransport.h
deleted file mode 100644
index 946e6b0..0000000
--- a/pc/quicdatatransport.h
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- *  Copyright 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_PC_QUICDATATRANSPORT_H_
-#define WEBRTC_PC_QUICDATATRANSPORT_H_
-
-#include <string>
-#include <unordered_map>
-
-#include "webrtc/api/datachannelinterface.h"
-#include "webrtc/p2p/base/transportcontroller.h"
-#include "webrtc/pc/quicdatachannel.h"
-#include "webrtc/rtc_base/scoped_ref_ptr.h"
-#include "webrtc/rtc_base/sigslot.h"
-#include "webrtc/rtc_base/thread.h"
-
-namespace cricket {
-class QuicTransportChannel;
-class ReliableQuicStream;
-}  // namepsace cricket
-
-namespace webrtc {
-
-// QuicDataTransport creates QuicDataChannels for the PeerConnection. It also
-// handles QUIC stream demuxing by distributing incoming QUIC streams from the
-// QuicTransportChannel among the QuicDataChannels that it has created.
-//
-// QuicDataTransport reads the data channel ID from the incoming QUIC stream,
-// then looks it up in a map of ID => QuicDataChannel. If the data channel
-// exists, it sends the QUIC stream to the QuicDataChannel.
-class QuicDataTransport : public sigslot::has_slots<> {
- public:
-  QuicDataTransport(rtc::Thread* signaling_thread,
-                    rtc::Thread* worker_thread,
-                    rtc::Thread* network_thread,
-                    cricket::TransportController* transport_controller);
-  ~QuicDataTransport() override;
-
-  // The QuicDataTransport acts like a BaseChannel with these functions.
-  bool SetTransport(const std::string& transport_name);
-  const std::string& transport_name() const { return transport_name_; }
-  const std::string& content_name() const { return content_name_; }
-  void set_content_name(const std::string& content_name) {
-    content_name_ = content_name;
-  }
-
-  // Creates a QuicDataChannel that uses this QuicDataTransport.
-  rtc::scoped_refptr<DataChannelInterface> CreateDataChannel(
-      const std::string& label,
-      const DataChannelInit* config);
-
-  // Removes a QuicDataChannel with the given ID from the QuicDataTransport's
-  // data channel map.
-  void DestroyDataChannel(int id);
-
-  // True if the QuicDataTransport has a data channel with the given ID.
-  bool HasDataChannel(int id) const;
-
-  // True if the QuicDataTransport has data channels.
-  bool HasDataChannels() const;
-
-  cricket::QuicTransportChannel* quic_transport_channel() {
-    return quic_transport_channel_;
-  }
-
- private:
-  // Sets the QUIC transport channel for the QuicDataChannels and the
-  // QuicDataTransport. Returns false if a different QUIC transport channel is
-  // already set, the QUIC transport channel cannot be set for any of the
-  // QuicDataChannels, or |channel| is NULL.
-  bool SetTransportChannel(cricket::QuicTransportChannel* channel);
-
-  // Called from the QuicTransportChannel when a ReliableQuicStream is created
-  // to receive incoming data.
-  void OnIncomingStream(cricket::ReliableQuicStream* stream);
-  // Called from the ReliableQuicStream when the first QUIC stream frame is
-  // received for incoming data. The QuicDataTransport reads the data channel ID
-  // and message ID from the incoming data, then dispatches the
-  // ReliableQuicStream to the QuicDataChannel with the same data channel ID.
-  void OnDataReceived(net::QuicStreamId stream_id,
-                      const char* data,
-                      size_t len);
-
-  cricket::QuicTransportChannel* CreateTransportChannel(
-      const std::string& transport_name);
-  void DestroyTransportChannel(cricket::TransportChannel* transport_channel);
-
-  // Map of data channel ID => QUIC data channel values.
-  std::unordered_map<int, rtc::scoped_refptr<QuicDataChannel>>
-      data_channel_by_id_;
-  // Map of QUIC stream ID => ReliableQuicStream* values.
-  std::unordered_map<net::QuicStreamId, cricket::ReliableQuicStream*>
-      quic_stream_by_id_;
-  // QuicTransportChannel for sending/receiving data.
-  cricket::QuicTransportChannel* quic_transport_channel_ = nullptr;
-  // Threads for the QUIC data channel.
-  rtc::Thread* const signaling_thread_;
-  rtc::Thread* const worker_thread_;
-  rtc::Thread* const network_thread_;
-
-  cricket::TransportController* transport_controller_;
-  std::string content_name_;
-  std::string transport_name_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_PC_QUICDATATRANSPORT_H_
diff --git a/pc/quicdatatransport_unittest.cc b/pc/quicdatatransport_unittest.cc
deleted file mode 100644
index 8d6c189..0000000
--- a/pc/quicdatatransport_unittest.cc
+++ /dev/null
@@ -1,350 +0,0 @@
-/*
- *  Copyright 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/pc/quicdatatransport.h"
-
-#include <memory>
-#include <set>
-#include <string>
-#include <unordered_map>
-#include <vector>
-
-#include "webrtc/p2p/base/faketransportcontroller.h"
-#include "webrtc/p2p/quic/quictransportchannel.h"
-#include "webrtc/p2p/quic/reliablequicstream.h"
-#include "webrtc/pc/quicdatachannel.h"
-#include "webrtc/rtc_base/bytebuffer.h"
-#include "webrtc/rtc_base/gunit.h"
-
-using webrtc::DataBuffer;
-using webrtc::DataChannelInit;
-using webrtc::DataChannelInterface;
-using webrtc::DataChannelObserver;
-using webrtc::QuicDataChannel;
-using webrtc::QuicDataTransport;
-using cricket::FakeTransportChannel;
-using cricket::FakeTransportController;
-using cricket::QuicTransportChannel;
-using cricket::ReliableQuicStream;
-
-namespace {
-
-// Timeout for asynchronous operations.
-static const int kTimeoutMs = 1000;  // milliseconds
-static const char kTransportName[] = "data";
-
-// FakeObserver receives messages from the data channel.
-class FakeObserver : public DataChannelObserver {
- public:
-  FakeObserver() {}
-
-  void OnStateChange() override {}
-
-  void OnBufferedAmountChange(uint64_t previous_amount) override {}
-
-  void OnMessage(const webrtc::DataBuffer& buffer) override {
-    messages_.push_back(std::string(buffer.data.data<char>(), buffer.size()));
-  }
-
-  const std::vector<std::string>& messages() const { return messages_; }
-
-  size_t messages_received() const { return messages_.size(); }
-
- private:
-  std::vector<std::string> messages_;
-};
-
-// A peer who uses a QUIC transport channel and fake ICE transport channel to
-// send or receive data.
-class QuicDataTransportPeer {
- public:
-  QuicDataTransportPeer()
-      : fake_transport_controller_(new FakeTransportController()),
-        quic_data_transport_(rtc::Thread::Current(),
-                             rtc::Thread::Current(),
-                             rtc::Thread::Current(),
-                             fake_transport_controller_.get()) {
-    fake_transport_controller_->use_quic();
-    quic_data_transport_.set_content_name("data");
-    quic_data_transport_.SetTransport(kTransportName);
-    ice_transport_channel_ = static_cast<FakeTransportChannel*>(
-        quic_data_transport_.quic_transport_channel()->ice_transport_channel());
-    ice_transport_channel_->SetAsync(true);
-  }
-
-  void GenerateCertificateAndFingerprint() {
-    rtc::scoped_refptr<rtc::RTCCertificate> local_cert =
-        rtc::RTCCertificate::Create(std::unique_ptr<rtc::SSLIdentity>(
-            rtc::SSLIdentity::Generate("cert_name", rtc::KT_DEFAULT)));
-    quic_data_transport_.quic_transport_channel()->SetLocalCertificate(
-        local_cert);
-    local_fingerprint_.reset(CreateFingerprint(local_cert.get()));
-  }
-
-  // Connects |ice_transport_channel_| to that of the other peer.
-  void Connect(QuicDataTransportPeer* other_peer) {
-    ice_transport_channel_->SetDestination(other_peer->ice_transport_channel_);
-  }
-
-  std::unique_ptr<rtc::SSLFingerprint>& local_fingerprint() {
-    return local_fingerprint_;
-  }
-
-  QuicTransportChannel* quic_transport_channel() {
-    return quic_data_transport_.quic_transport_channel();
-  }
-
-  // Write a messge directly to the ReliableQuicStream.
-  void WriteMessage(int data_channel_id,
-                    uint64_t message_id,
-                    const std::string& message) {
-    ReliableQuicStream* stream =
-        quic_data_transport_.quic_transport_channel()->CreateQuicStream();
-    rtc::CopyOnWriteBuffer payload;
-    webrtc::WriteQuicDataChannelMessageHeader(data_channel_id, message_id,
-                                              &payload);
-    stream->Write(payload.data<char>(), payload.size(), false);
-    stream->Write(message.data(), message.size(), true);
-  }
-
-  rtc::scoped_refptr<DataChannelInterface> CreateDataChannel(
-      const DataChannelInit* config) {
-    return quic_data_transport_.CreateDataChannel("testing", config);
-  }
-
-  QuicDataTransport* quic_data_transport() { return &quic_data_transport_; }
-
- private:
-  // Creates a fingerprint from a certificate.
-  rtc::SSLFingerprint* CreateFingerprint(rtc::RTCCertificate* cert) {
-    std::string digest_algorithm;
-    cert->ssl_certificate().GetSignatureDigestAlgorithm(&digest_algorithm);
-    std::unique_ptr<rtc::SSLFingerprint> fingerprint(
-        rtc::SSLFingerprint::Create(digest_algorithm, cert->identity()));
-    return fingerprint.release();
-  }
-
-  std::unique_ptr<FakeTransportController> fake_transport_controller_;
-  QuicDataTransport quic_data_transport_;
-  FakeTransportChannel* ice_transport_channel_;
-  std::unique_ptr<rtc::SSLFingerprint> local_fingerprint_;
-};
-
-class QuicDataTransportTest : public testing::Test {
- public:
-  QuicDataTransportTest() {}
-
-  void ConnectTransportChannels() {
-    SetCryptoParameters();
-    peer1_.Connect(&peer2_);
-    ASSERT_TRUE_WAIT(peer1_.quic_transport_channel()->writable() &&
-                         peer2_.quic_transport_channel()->writable(),
-                     kTimeoutMs);
-  }
-
-  // Sets crypto parameters required for the QUIC handshake.
-  void SetCryptoParameters() {
-    peer1_.GenerateCertificateAndFingerprint();
-    peer2_.GenerateCertificateAndFingerprint();
-
-    peer1_.quic_transport_channel()->SetSslRole(rtc::SSL_CLIENT);
-    peer2_.quic_transport_channel()->SetSslRole(rtc::SSL_SERVER);
-
-    std::unique_ptr<rtc::SSLFingerprint>& peer1_fingerprint =
-        peer1_.local_fingerprint();
-    std::unique_ptr<rtc::SSLFingerprint>& peer2_fingerprint =
-        peer2_.local_fingerprint();
-
-    peer1_.quic_transport_channel()->SetRemoteFingerprint(
-        peer2_fingerprint->algorithm,
-        reinterpret_cast<const uint8_t*>(peer2_fingerprint->digest.data()),
-        peer2_fingerprint->digest.size());
-    peer2_.quic_transport_channel()->SetRemoteFingerprint(
-        peer1_fingerprint->algorithm,
-        reinterpret_cast<const uint8_t*>(peer1_fingerprint->digest.data()),
-        peer1_fingerprint->digest.size());
-  }
-
- protected:
-  QuicDataTransportPeer peer1_;
-  QuicDataTransportPeer peer2_;
-};
-
-// Tests creation and destruction of data channels.
-TEST_F(QuicDataTransportTest, CreateAndDestroyDataChannels) {
-  QuicDataTransport* quic_data_transport = peer2_.quic_data_transport();
-  EXPECT_FALSE(quic_data_transport->HasDataChannels());
-  for (int data_channel_id = 0; data_channel_id < 5; ++data_channel_id) {
-    EXPECT_FALSE(quic_data_transport->HasDataChannel(data_channel_id));
-    webrtc::DataChannelInit config;
-    config.id = data_channel_id;
-    rtc::scoped_refptr<DataChannelInterface> data_channel =
-        peer2_.CreateDataChannel(&config);
-    EXPECT_NE(nullptr, data_channel);
-    EXPECT_EQ(data_channel_id, data_channel->id());
-    EXPECT_TRUE(quic_data_transport->HasDataChannel(data_channel_id));
-  }
-  EXPECT_TRUE(quic_data_transport->HasDataChannels());
-  for (int data_channel_id = 0; data_channel_id < 5; ++data_channel_id) {
-    quic_data_transport->DestroyDataChannel(data_channel_id);
-    EXPECT_FALSE(quic_data_transport->HasDataChannel(data_channel_id));
-  }
-  EXPECT_FALSE(quic_data_transport->HasDataChannels());
-}
-
-// Tests that the QuicDataTransport does not allow creating multiple
-// QuicDataChannels with the same id.
-TEST_F(QuicDataTransportTest, CannotCreateDataChannelsWithSameId) {
-  webrtc::DataChannelInit config;
-  config.id = 2;
-  EXPECT_NE(nullptr, peer2_.CreateDataChannel(&config));
-  EXPECT_EQ(nullptr, peer2_.CreateDataChannel(&config));
-}
-
-// Tests that any data channels created by the QuicDataTransport are in state
-// kConnecting before the QuicTransportChannel is set, then transition to state
-// kOpen when the transport channel becomes writable.
-TEST_F(QuicDataTransportTest, DataChannelsOpenWhenTransportChannelWritable) {
-  webrtc::DataChannelInit config1;
-  config1.id = 7;
-  rtc::scoped_refptr<DataChannelInterface> data_channel1 =
-      peer2_.CreateDataChannel(&config1);
-  EXPECT_EQ(webrtc::DataChannelInterface::kConnecting, data_channel1->state());
-  EXPECT_EQ(webrtc::DataChannelInterface::kConnecting, data_channel1->state());
-  webrtc::DataChannelInit config2;
-  config2.id = 14;
-  rtc::scoped_refptr<DataChannelInterface> data_channel2 =
-      peer2_.CreateDataChannel(&config2);
-  EXPECT_EQ(webrtc::DataChannelInterface::kConnecting, data_channel2->state());
-  // Existing data channels should open once the transport channel is writable.
-  ConnectTransportChannels();
-  EXPECT_EQ_WAIT(webrtc::DataChannelInterface::kOpen, data_channel1->state(),
-                 kTimeoutMs);
-  EXPECT_EQ_WAIT(webrtc::DataChannelInterface::kOpen, data_channel2->state(),
-                 kTimeoutMs);
-  // Any data channels created afterwards should start in state kOpen.
-  webrtc::DataChannelInit config3;
-  config3.id = 21;
-  rtc::scoped_refptr<DataChannelInterface> data_channel3 =
-      peer2_.CreateDataChannel(&config3);
-  EXPECT_EQ(webrtc::DataChannelInterface::kOpen, data_channel3->state());
-}
-
-// Tests that the QuicTransport dispatches messages for one QuicDataChannel.
-TEST_F(QuicDataTransportTest, ReceiveMessagesForSingleDataChannel) {
-  ConnectTransportChannels();
-
-  int data_channel_id = 1337;
-  webrtc::DataChannelInit config;
-  config.id = data_channel_id;
-  rtc::scoped_refptr<DataChannelInterface> peer2_data_channel =
-      peer2_.CreateDataChannel(&config);
-  FakeObserver observer;
-  peer2_data_channel->RegisterObserver(&observer);
-
-  uint64_t message1_id = 26u;
-  peer1_.WriteMessage(data_channel_id, message1_id, "Testing");
-  ASSERT_EQ_WAIT(1, observer.messages_received(), kTimeoutMs);
-  EXPECT_EQ("Testing", observer.messages()[0]);
-
-  uint64_t message2_id = 402u;
-  peer1_.WriteMessage(data_channel_id, message2_id, "Hello, World!");
-  ASSERT_EQ_WAIT(2, observer.messages_received(), kTimeoutMs);
-  EXPECT_EQ("Hello, World!", observer.messages()[1]);
-
-  uint64_t message3_id = 100260415u;
-  peer1_.WriteMessage(data_channel_id, message3_id, "Third message");
-  ASSERT_EQ_WAIT(3, observer.messages_received(), kTimeoutMs);
-  EXPECT_EQ("Third message", observer.messages()[2]);
-}
-
-// Tests that the QuicTransport dispatches messages to the correct data channel
-// when multiple are in use.
-TEST_F(QuicDataTransportTest, ReceiveMessagesForMultipleDataChannels) {
-  ConnectTransportChannels();
-
-  std::vector<rtc::scoped_refptr<DataChannelInterface>> data_channels;
-  for (int data_channel_id = 0; data_channel_id < 5; ++data_channel_id) {
-    webrtc::DataChannelInit config;
-    config.id = data_channel_id;
-    data_channels.push_back(peer2_.CreateDataChannel(&config));
-  }
-
-  for (int data_channel_id = 0; data_channel_id < 5; ++data_channel_id) {
-    uint64_t message1_id = 48023u;
-    FakeObserver observer;
-    DataChannelInterface* peer2_data_channel =
-        data_channels[data_channel_id].get();
-    peer2_data_channel->RegisterObserver(&observer);
-    peer1_.WriteMessage(data_channel_id, message1_id, "Testing");
-    ASSERT_EQ_WAIT(1, observer.messages_received(), kTimeoutMs);
-    EXPECT_EQ("Testing", observer.messages()[0]);
-
-    uint64_t message2_id = 1372643095u;
-    peer1_.WriteMessage(data_channel_id, message2_id, "Hello, World!");
-    ASSERT_EQ_WAIT(2, observer.messages_received(), kTimeoutMs);
-    EXPECT_EQ("Hello, World!", observer.messages()[1]);
-  }
-}
-
-// Tests end-to-end that both peers can use multiple QuicDataChannels to
-// send/receive messages using a QuicDataTransport.
-TEST_F(QuicDataTransportTest, EndToEndSendReceiveMessages) {
-  ConnectTransportChannels();
-
-  std::vector<rtc::scoped_refptr<DataChannelInterface>> peer1_data_channels;
-  std::vector<rtc::scoped_refptr<DataChannelInterface>> peer2_data_channels;
-
-  for (int data_channel_id = 0; data_channel_id < 5; ++data_channel_id) {
-    webrtc::DataChannelInit config;
-    config.id = data_channel_id;
-    peer1_data_channels.push_back(peer1_.CreateDataChannel(&config));
-    peer2_data_channels.push_back(peer2_.CreateDataChannel(&config));
-  }
-
-  for (int data_channel_id = 0; data_channel_id < 5; ++data_channel_id) {
-    DataChannelInterface* peer1_data_channel =
-        peer1_data_channels[data_channel_id].get();
-    FakeObserver observer1;
-    peer1_data_channel->RegisterObserver(&observer1);
-    DataChannelInterface* peer2_data_channel =
-        peer2_data_channels[data_channel_id].get();
-    FakeObserver observer2;
-    peer2_data_channel->RegisterObserver(&observer2);
-
-    peer1_data_channel->Send(webrtc::DataBuffer("Peer 1 message 1"));
-    ASSERT_EQ_WAIT(1, observer2.messages_received(), kTimeoutMs);
-    EXPECT_EQ("Peer 1 message 1", observer2.messages()[0]);
-
-    peer1_data_channel->Send(webrtc::DataBuffer("Peer 1 message 2"));
-    ASSERT_EQ_WAIT(2, observer2.messages_received(), kTimeoutMs);
-    EXPECT_EQ("Peer 1 message 2", observer2.messages()[1]);
-
-    peer2_data_channel->Send(webrtc::DataBuffer("Peer 2 message 1"));
-    ASSERT_EQ_WAIT(1, observer1.messages_received(), kTimeoutMs);
-    EXPECT_EQ("Peer 2 message 1", observer1.messages()[0]);
-
-    peer2_data_channel->Send(webrtc::DataBuffer("Peer 2 message 2"));
-    ASSERT_EQ_WAIT(2, observer1.messages_received(), kTimeoutMs);
-    EXPECT_EQ("Peer 2 message 2", observer1.messages()[1]);
-  }
-}
-
-// Tests that SetTransport returns false when setting a transport that is not
-// equivalent to the one already set.
-TEST_F(QuicDataTransportTest, SetTransportReturnValue) {
-  QuicDataTransport* quic_data_transport = peer1_.quic_data_transport();
-  // Ignore the same transport name.
-  EXPECT_TRUE(quic_data_transport->SetTransport(kTransportName));
-  // Return false when setting a different transport name.
-  EXPECT_FALSE(quic_data_transport->SetTransport("another transport name"));
-}
-
-}  // namespace
diff --git a/pc/remoteaudiosource.cc b/pc/remoteaudiosource.cc
deleted file mode 100644
index f6f23c3..0000000
--- a/pc/remoteaudiosource.cc
+++ /dev/null
@@ -1,161 +0,0 @@
-/*
- *  Copyright 2014 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/pc/remoteaudiosource.h"
-
-#include <algorithm>
-#include <functional>
-#include <memory>
-#include <utility>
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/thread.h"
-
-namespace webrtc {
-
-class RemoteAudioSource::MessageHandler : public rtc::MessageHandler {
- public:
-  explicit MessageHandler(RemoteAudioSource* source) : source_(source) {}
-
- private:
-  ~MessageHandler() override {}
-
-  void OnMessage(rtc::Message* msg) override {
-    source_->OnMessage(msg);
-    delete this;
-  }
-
-  const rtc::scoped_refptr<RemoteAudioSource> source_;
-  RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(MessageHandler);
-};
-
-class RemoteAudioSource::Sink : public AudioSinkInterface {
- public:
-  explicit Sink(RemoteAudioSource* source) : source_(source) {}
-  ~Sink() override { source_->OnAudioChannelGone(); }
-
- private:
-  void OnData(const AudioSinkInterface::Data& audio) override {
-    if (source_)
-      source_->OnData(audio);
-  }
-
-  const rtc::scoped_refptr<RemoteAudioSource> source_;
-  RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(Sink);
-};
-
-rtc::scoped_refptr<RemoteAudioSource> RemoteAudioSource::Create(
-    uint32_t ssrc,
-    cricket::VoiceChannel* channel) {
-  rtc::scoped_refptr<RemoteAudioSource> ret(
-      new rtc::RefCountedObject<RemoteAudioSource>());
-  ret->Initialize(ssrc, channel);
-  return ret;
-}
-
-RemoteAudioSource::RemoteAudioSource()
-    : main_thread_(rtc::Thread::Current()),
-      state_(MediaSourceInterface::kLive) {
-  RTC_DCHECK(main_thread_);
-}
-
-RemoteAudioSource::~RemoteAudioSource() {
-  RTC_DCHECK(main_thread_->IsCurrent());
-  RTC_DCHECK(audio_observers_.empty());
-  RTC_DCHECK(sinks_.empty());
-}
-
-void RemoteAudioSource::Initialize(uint32_t ssrc,
-                                   cricket::VoiceChannel* channel) {
-  RTC_DCHECK(main_thread_->IsCurrent());
-  // To make sure we always get notified when the channel goes out of scope,
-  // we register for callbacks here and not on demand in AddSink.
-  if (channel) {  // May be null in tests.
-    channel->SetRawAudioSink(
-        ssrc, std::unique_ptr<AudioSinkInterface>(new Sink(this)));
-  }
-}
-
-MediaSourceInterface::SourceState RemoteAudioSource::state() const {
-  RTC_DCHECK(main_thread_->IsCurrent());
-  return state_;
-}
-
-bool RemoteAudioSource::remote() const {
-  RTC_DCHECK(main_thread_->IsCurrent());
-  return true;
-}
-
-void RemoteAudioSource::SetVolume(double volume) {
-  RTC_DCHECK_GE(volume, 0);
-  RTC_DCHECK_LE(volume, 10);
-  for (auto* observer : audio_observers_)
-    observer->OnSetVolume(volume);
-}
-
-void RemoteAudioSource::RegisterAudioObserver(AudioObserver* observer) {
-  RTC_DCHECK(observer != NULL);
-  RTC_DCHECK(std::find(audio_observers_.begin(), audio_observers_.end(),
-                       observer) == audio_observers_.end());
-  audio_observers_.push_back(observer);
-}
-
-void RemoteAudioSource::UnregisterAudioObserver(AudioObserver* observer) {
-  RTC_DCHECK(observer != NULL);
-  audio_observers_.remove(observer);
-}
-
-void RemoteAudioSource::AddSink(AudioTrackSinkInterface* sink) {
-  RTC_DCHECK(main_thread_->IsCurrent());
-  RTC_DCHECK(sink);
-
-  if (state_ != MediaSourceInterface::kLive) {
-    LOG(LS_ERROR) << "Can't register sink as the source isn't live.";
-    return;
-  }
-
-  rtc::CritScope lock(&sink_lock_);
-  RTC_DCHECK(std::find(sinks_.begin(), sinks_.end(), sink) == sinks_.end());
-  sinks_.push_back(sink);
-}
-
-void RemoteAudioSource::RemoveSink(AudioTrackSinkInterface* sink) {
-  RTC_DCHECK(main_thread_->IsCurrent());
-  RTC_DCHECK(sink);
-
-  rtc::CritScope lock(&sink_lock_);
-  sinks_.remove(sink);
-}
-
-void RemoteAudioSource::OnData(const AudioSinkInterface::Data& audio) {
-  // Called on the externally-owned audio callback thread, via/from webrtc.
-  rtc::CritScope lock(&sink_lock_);
-  for (auto* sink : sinks_) {
-    sink->OnData(audio.data, 16, audio.sample_rate, audio.channels,
-                 audio.samples_per_channel);
-  }
-}
-
-void RemoteAudioSource::OnAudioChannelGone() {
-  // Called when the audio channel is deleted.  It may be the worker thread
-  // in libjingle or may be a different worker thread.
-  main_thread_->Post(RTC_FROM_HERE, new MessageHandler(this));
-}
-
-void RemoteAudioSource::OnMessage(rtc::Message* msg) {
-  RTC_DCHECK(main_thread_->IsCurrent());
-  sinks_.clear();
-  state_ = MediaSourceInterface::kEnded;
-  FireOnChanged();
-}
-
-}  // namespace webrtc
diff --git a/pc/remoteaudiosource.h b/pc/remoteaudiosource.h
deleted file mode 100644
index 14c16a7..0000000
--- a/pc/remoteaudiosource.h
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- *  Copyright 2014 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_PC_REMOTEAUDIOSOURCE_H_
-#define WEBRTC_PC_REMOTEAUDIOSOURCE_H_
-
-#include <list>
-#include <string>
-
-#include "webrtc/api/call/audio_sink.h"
-#include "webrtc/api/notifier.h"
-#include "webrtc/pc/channel.h"
-#include "webrtc/rtc_base/criticalsection.h"
-
-namespace rtc {
-struct Message;
-class Thread;
-}  // namespace rtc
-
-namespace webrtc {
-
-// This class implements the audio source used by the remote audio track.
-class RemoteAudioSource : public Notifier<AudioSourceInterface> {
- public:
-  // Creates an instance of RemoteAudioSource.
-  static rtc::scoped_refptr<RemoteAudioSource> Create(
-      uint32_t ssrc,
-      cricket::VoiceChannel* channel);
-
-  // MediaSourceInterface implementation.
-  MediaSourceInterface::SourceState state() const override;
-  bool remote() const override;
-
-  void AddSink(AudioTrackSinkInterface* sink) override;
-  void RemoveSink(AudioTrackSinkInterface* sink) override;
-
- protected:
-  RemoteAudioSource();
-  ~RemoteAudioSource() override;
-
-  // Post construction initialize where we can do things like save a reference
-  // to ourselves (need to be fully constructed).
-  void Initialize(uint32_t ssrc, cricket::VoiceChannel* channel);
-
- private:
-  typedef std::list<AudioObserver*> AudioObserverList;
-
-  // AudioSourceInterface implementation.
-  void SetVolume(double volume) override;
-  void RegisterAudioObserver(AudioObserver* observer) override;
-  void UnregisterAudioObserver(AudioObserver* observer) override;
-
-  class Sink;
-  void OnData(const AudioSinkInterface::Data& audio);
-  void OnAudioChannelGone();
-
-  class MessageHandler;
-  void OnMessage(rtc::Message* msg);
-
-  AudioObserverList audio_observers_;
-  rtc::CriticalSection sink_lock_;
-  std::list<AudioTrackSinkInterface*> sinks_;
-  rtc::Thread* const main_thread_;
-  SourceState state_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_PC_REMOTEAUDIOSOURCE_H_
diff --git a/pc/rtcpmuxfilter.cc b/pc/rtcpmuxfilter.cc
deleted file mode 100644
index 67293b3..0000000
--- a/pc/rtcpmuxfilter.cc
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- *  Copyright 2004 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/pc/rtcpmuxfilter.h"
-
-#include "webrtc/rtc_base/logging.h"
-
-namespace cricket {
-
-RtcpMuxFilter::RtcpMuxFilter() : state_(ST_INIT), offer_enable_(false) {
-}
-
-bool RtcpMuxFilter::IsFullyActive() const {
-  return state_ == ST_ACTIVE;
-}
-
-bool RtcpMuxFilter::IsProvisionallyActive() const {
-  return state_ == ST_SENTPRANSWER || state_ == ST_RECEIVEDPRANSWER;
-}
-
-bool RtcpMuxFilter::IsActive() const {
-  return IsFullyActive() || IsProvisionallyActive();
-}
-
-void RtcpMuxFilter::SetActive() {
-  state_ = ST_ACTIVE;
-}
-
-bool RtcpMuxFilter::SetOffer(bool offer_enable, ContentSource src) {
-  if (state_ == ST_ACTIVE) {
-    // Fail if we try to deactivate and no-op if we try and activate.
-    return offer_enable;
-  }
-
-  if (!ExpectOffer(offer_enable, src)) {
-    LOG(LS_ERROR) << "Invalid state for change of RTCP mux offer";
-    return false;
-  }
-
-  offer_enable_ = offer_enable;
-  state_ = (src == CS_LOCAL) ? ST_SENTOFFER : ST_RECEIVEDOFFER;
-  return true;
-}
-
-bool RtcpMuxFilter::SetProvisionalAnswer(bool answer_enable,
-                                         ContentSource src) {
-  if (state_ == ST_ACTIVE) {
-    // Fail if we try to deactivate and no-op if we try and activate.
-    return answer_enable;
-  }
-
-  if (!ExpectAnswer(src)) {
-    LOG(LS_ERROR) << "Invalid state for RTCP mux provisional answer";
-    return false;
-  }
-
-  if (offer_enable_) {
-    if (answer_enable) {
-      if (src == CS_REMOTE)
-        state_ = ST_RECEIVEDPRANSWER;
-      else  // CS_LOCAL
-        state_ = ST_SENTPRANSWER;
-    } else {
-      // The provisional answer doesn't want to use RTCP mux.
-      // Go back to the original state after the offer was set and wait for next
-      // provisional or final answer.
-      if (src == CS_REMOTE)
-        state_ = ST_SENTOFFER;
-      else  // CS_LOCAL
-        state_ = ST_RECEIVEDOFFER;
-    }
-  } else if (answer_enable) {
-    // If the offer didn't specify RTCP mux, the answer shouldn't either.
-    LOG(LS_WARNING) << "Invalid parameters in RTCP mux provisional answer";
-    return false;
-  }
-
-  return true;
-}
-
-bool RtcpMuxFilter::SetAnswer(bool answer_enable, ContentSource src) {
-  if (state_ == ST_ACTIVE) {
-    // Fail if we try to deactivate and no-op if we try and activate.
-    return answer_enable;
-  }
-
-  if (!ExpectAnswer(src)) {
-    LOG(LS_ERROR) << "Invalid state for RTCP mux answer";
-    return false;
-  }
-
-  if (offer_enable_ && answer_enable) {
-    state_ = ST_ACTIVE;
-  } else if (answer_enable) {
-    // If the offer didn't specify RTCP mux, the answer shouldn't either.
-    LOG(LS_WARNING) << "Invalid parameters in RTCP mux answer";
-    return false;
-  } else {
-    state_ = ST_INIT;
-  }
-  return true;
-}
-
-bool RtcpMuxFilter::ExpectOffer(bool offer_enable, ContentSource source) {
-  return ((state_ == ST_INIT) ||
-          (state_ == ST_ACTIVE && offer_enable == offer_enable_) ||
-          (state_ == ST_SENTOFFER && source == CS_LOCAL) ||
-          (state_ == ST_RECEIVEDOFFER && source == CS_REMOTE));
-}
-
-bool RtcpMuxFilter::ExpectAnswer(ContentSource source) {
-  return ((state_ == ST_SENTOFFER && source == CS_REMOTE) ||
-          (state_ == ST_RECEIVEDOFFER && source == CS_LOCAL) ||
-          (state_ == ST_SENTPRANSWER && source == CS_LOCAL) ||
-          (state_ == ST_RECEIVEDPRANSWER && source == CS_REMOTE));
-}
-
-}  // namespace cricket
diff --git a/pc/rtcpmuxfilter.h b/pc/rtcpmuxfilter.h
deleted file mode 100644
index 95a9d5f..0000000
--- a/pc/rtcpmuxfilter.h
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- *  Copyright 2004 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_PC_RTCPMUXFILTER_H_
-#define WEBRTC_PC_RTCPMUXFILTER_H_
-
-#include "webrtc/p2p/base/sessiondescription.h"
-
-namespace cricket {
-
-// RTCP Muxer, as defined in RFC 5761 (http://tools.ietf.org/html/rfc5761)
-class RtcpMuxFilter {
- public:
-  RtcpMuxFilter();
-
-  // Whether RTCP mux has been negotiated with a final answer (not provisional).
-  bool IsFullyActive() const;
-
-  // Whether RTCP mux has been negotiated with a provisional answer; this means
-  // a later answer could disable RTCP mux, and so the RTCP transport should
-  // not be disposed yet.
-  bool IsProvisionallyActive() const;
-
-  // Whether the filter is active, i.e. has RTCP mux been properly negotiated,
-  // either with a final or provisional answer.
-  bool IsActive() const;
-
-  // Make the filter active (fully, not provisionally) regardless of the
-  // current state. This should be used when an endpoint *requires* RTCP mux.
-  void SetActive();
-
-  // Specifies whether the offer indicates the use of RTCP mux.
-  bool SetOffer(bool offer_enable, ContentSource src);
-
-  // Specifies whether the provisional answer indicates the use of RTCP mux.
-  bool SetProvisionalAnswer(bool answer_enable, ContentSource src);
-
-  // Specifies whether the answer indicates the use of RTCP mux.
-  bool SetAnswer(bool answer_enable, ContentSource src);
-
- private:
-  bool ExpectOffer(bool offer_enable, ContentSource source);
-  bool ExpectAnswer(ContentSource source);
-  enum State {
-    // RTCP mux filter unused.
-    ST_INIT,
-    // Offer with RTCP mux enabled received.
-    // RTCP mux filter is not active.
-    ST_RECEIVEDOFFER,
-    // Offer with RTCP mux enabled sent.
-    // RTCP mux filter can demux incoming packets but is not active.
-    ST_SENTOFFER,
-    // RTCP mux filter is active but the sent answer is only provisional.
-    // When the final answer is set, the state transitions to ST_ACTIVE or
-    // ST_INIT.
-    ST_SENTPRANSWER,
-    // RTCP mux filter is active but the received answer is only provisional.
-    // When the final answer is set, the state transitions to ST_ACTIVE or
-    // ST_INIT.
-    ST_RECEIVEDPRANSWER,
-    // Offer and answer set, RTCP mux enabled. It is not possible to de-activate
-    // the filter.
-    ST_ACTIVE
-  };
-  State state_;
-  bool offer_enable_;
-};
-
-}  // namespace cricket
-
-#endif  // WEBRTC_PC_RTCPMUXFILTER_H_
diff --git a/pc/rtcpmuxfilter_unittest.cc b/pc/rtcpmuxfilter_unittest.cc
deleted file mode 100644
index bd2fea1..0000000
--- a/pc/rtcpmuxfilter_unittest.cc
+++ /dev/null
@@ -1,192 +0,0 @@
-/*
- *  Copyright 2011 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/pc/rtcpmuxfilter.h"
-#include "webrtc/media/base/testutils.h"
-#include "webrtc/rtc_base/gunit.h"
-
-TEST(RtcpMuxFilterTest, IsActiveSender) {
-  cricket::RtcpMuxFilter filter;
-  // Init state - not active
-  EXPECT_FALSE(filter.IsActive());
-  EXPECT_FALSE(filter.IsProvisionallyActive());
-  EXPECT_FALSE(filter.IsFullyActive());
-  // After sent offer, demux should not be active.
-  filter.SetOffer(true, cricket::CS_LOCAL);
-  EXPECT_FALSE(filter.IsActive());
-  EXPECT_FALSE(filter.IsProvisionallyActive());
-  EXPECT_FALSE(filter.IsFullyActive());
-  // Remote accepted, filter is now active.
-  filter.SetAnswer(true, cricket::CS_REMOTE);
-  EXPECT_TRUE(filter.IsActive());
-  EXPECT_FALSE(filter.IsProvisionallyActive());
-  EXPECT_TRUE(filter.IsFullyActive());
-}
-
-// Test that we can receive provisional answer and final answer.
-TEST(RtcpMuxFilterTest, ReceivePrAnswer) {
-  cricket::RtcpMuxFilter filter;
-  filter.SetOffer(true, cricket::CS_LOCAL);
-  // Received provisional answer with mux enabled.
-  EXPECT_TRUE(filter.SetProvisionalAnswer(true, cricket::CS_REMOTE));
-  // We are now provisionally active since both sender and receiver support mux.
-  EXPECT_TRUE(filter.IsActive());
-  EXPECT_TRUE(filter.IsProvisionallyActive());
-  EXPECT_FALSE(filter.IsFullyActive());
-  // Received provisional answer with mux disabled.
-  EXPECT_TRUE(filter.SetProvisionalAnswer(false, cricket::CS_REMOTE));
-  // We are now inactive since the receiver doesn't support mux.
-  EXPECT_FALSE(filter.IsActive());
-  EXPECT_FALSE(filter.IsProvisionallyActive());
-  EXPECT_FALSE(filter.IsFullyActive());
-  // Received final answer with mux enabled.
-  EXPECT_TRUE(filter.SetAnswer(true, cricket::CS_REMOTE));
-  EXPECT_TRUE(filter.IsActive());
-  EXPECT_FALSE(filter.IsProvisionallyActive());
-  EXPECT_TRUE(filter.IsFullyActive());
-}
-
-TEST(RtcpMuxFilterTest, IsActiveReceiver) {
-  cricket::RtcpMuxFilter filter;
-  // Init state - not active.
-  EXPECT_FALSE(filter.IsActive());
-  EXPECT_FALSE(filter.IsProvisionallyActive());
-  EXPECT_FALSE(filter.IsFullyActive());
-  // After received offer, demux should not be active
-  filter.SetOffer(true, cricket::CS_REMOTE);
-  EXPECT_FALSE(filter.IsActive());
-  EXPECT_FALSE(filter.IsProvisionallyActive());
-  EXPECT_FALSE(filter.IsFullyActive());
-  // We accept, filter is now active
-  filter.SetAnswer(true, cricket::CS_LOCAL);
-  EXPECT_TRUE(filter.IsActive());
-  EXPECT_FALSE(filter.IsProvisionallyActive());
-  EXPECT_TRUE(filter.IsFullyActive());
-}
-
-// Test that we can send provisional answer and final answer.
-TEST(RtcpMuxFilterTest, SendPrAnswer) {
-  cricket::RtcpMuxFilter filter;
-  filter.SetOffer(true, cricket::CS_REMOTE);
-  // Send provisional answer with mux enabled.
-  EXPECT_TRUE(filter.SetProvisionalAnswer(true, cricket::CS_LOCAL));
-  EXPECT_TRUE(filter.IsActive());
-  EXPECT_TRUE(filter.IsProvisionallyActive());
-  EXPECT_FALSE(filter.IsFullyActive());
-  // Received provisional answer with mux disabled.
-  EXPECT_TRUE(filter.SetProvisionalAnswer(false, cricket::CS_LOCAL));
-  EXPECT_FALSE(filter.IsActive());
-  EXPECT_FALSE(filter.IsProvisionallyActive());
-  EXPECT_FALSE(filter.IsFullyActive());
-  // Send final answer with mux enabled.
-  EXPECT_TRUE(filter.SetAnswer(true, cricket::CS_LOCAL));
-  EXPECT_TRUE(filter.IsActive());
-  EXPECT_FALSE(filter.IsProvisionallyActive());
-  EXPECT_TRUE(filter.IsFullyActive());
-}
-
-// Test that we can enable the filter in an update.
-// We can not disable the filter later since that would mean we need to
-// recreate a rtcp transport channel.
-TEST(RtcpMuxFilterTest, EnableFilterDuringUpdate) {
-  cricket::RtcpMuxFilter filter;
-  EXPECT_FALSE(filter.IsActive());
-  EXPECT_TRUE(filter.SetOffer(false, cricket::CS_REMOTE));
-  EXPECT_TRUE(filter.SetAnswer(false, cricket::CS_LOCAL));
-  EXPECT_FALSE(filter.IsActive());
-
-  EXPECT_TRUE(filter.SetOffer(true, cricket::CS_REMOTE));
-  EXPECT_TRUE(filter.SetAnswer(true, cricket::CS_LOCAL));
-  EXPECT_TRUE(filter.IsActive());
-
-  EXPECT_FALSE(filter.SetOffer(false, cricket::CS_REMOTE));
-  EXPECT_FALSE(filter.SetAnswer(false, cricket::CS_LOCAL));
-  EXPECT_TRUE(filter.IsActive());
-}
-
-// Test that SetOffer can be called twice.
-TEST(RtcpMuxFilterTest, SetOfferTwice) {
-  cricket::RtcpMuxFilter filter;
-
-  EXPECT_TRUE(filter.SetOffer(true, cricket::CS_REMOTE));
-  EXPECT_TRUE(filter.SetOffer(true, cricket::CS_REMOTE));
-  EXPECT_TRUE(filter.SetAnswer(true, cricket::CS_LOCAL));
-  EXPECT_TRUE(filter.IsActive());
-
-  cricket::RtcpMuxFilter filter2;
-  EXPECT_TRUE(filter2.SetOffer(false, cricket::CS_LOCAL));
-  EXPECT_TRUE(filter2.SetOffer(false, cricket::CS_LOCAL));
-  EXPECT_TRUE(filter2.SetAnswer(false, cricket::CS_REMOTE));
-  EXPECT_FALSE(filter2.IsActive());
-}
-
-// Test that the filter can be enabled twice.
-TEST(RtcpMuxFilterTest, EnableFilterTwiceDuringUpdate) {
-  cricket::RtcpMuxFilter filter;
-
-  EXPECT_TRUE(filter.SetOffer(true, cricket::CS_REMOTE));
-  EXPECT_TRUE(filter.SetAnswer(true, cricket::CS_LOCAL));
-  EXPECT_TRUE(filter.IsActive());
-
-  EXPECT_TRUE(filter.SetOffer(true, cricket::CS_REMOTE));
-  EXPECT_TRUE(filter.SetAnswer(true, cricket::CS_LOCAL));
-  EXPECT_TRUE(filter.IsActive());
-}
-
-// Test that the filter can be kept disabled during updates.
-TEST(RtcpMuxFilterTest, KeepFilterDisabledDuringUpdate) {
-  cricket::RtcpMuxFilter filter;
-
-  EXPECT_TRUE(filter.SetOffer(false, cricket::CS_REMOTE));
-  EXPECT_TRUE(filter.SetAnswer(false, cricket::CS_LOCAL));
-  EXPECT_FALSE(filter.IsActive());
-
-  EXPECT_TRUE(filter.SetOffer(false, cricket::CS_REMOTE));
-  EXPECT_TRUE(filter.SetAnswer(false, cricket::CS_LOCAL));
-  EXPECT_FALSE(filter.IsActive());
-}
-
-// Test that we can SetActive and then can't deactivate.
-TEST(RtcpMuxFilterTest, SetActiveCantDeactivate) {
-  cricket::RtcpMuxFilter filter;
-
-  filter.SetActive();
-  EXPECT_TRUE(filter.IsActive());
-
-  EXPECT_FALSE(filter.SetOffer(false, cricket::CS_LOCAL));
-  EXPECT_TRUE(filter.IsActive());
-  EXPECT_TRUE(filter.SetOffer(true, cricket::CS_LOCAL));
-  EXPECT_TRUE(filter.IsActive());
-
-  EXPECT_FALSE(filter.SetProvisionalAnswer(false, cricket::CS_REMOTE));
-  EXPECT_TRUE(filter.IsActive());
-  EXPECT_TRUE(filter.SetProvisionalAnswer(true, cricket::CS_REMOTE));
-  EXPECT_TRUE(filter.IsActive());
-
-  EXPECT_FALSE(filter.SetAnswer(false, cricket::CS_REMOTE));
-  EXPECT_TRUE(filter.IsActive());
-  EXPECT_TRUE(filter.SetAnswer(true, cricket::CS_REMOTE));
-  EXPECT_TRUE(filter.IsActive());
-
-  EXPECT_FALSE(filter.SetOffer(false, cricket::CS_REMOTE));
-  EXPECT_TRUE(filter.IsActive());
-  EXPECT_TRUE(filter.SetOffer(true, cricket::CS_REMOTE));
-  EXPECT_TRUE(filter.IsActive());
-
-  EXPECT_FALSE(filter.SetProvisionalAnswer(false, cricket::CS_LOCAL));
-  EXPECT_TRUE(filter.IsActive());
-  EXPECT_TRUE(filter.SetProvisionalAnswer(true, cricket::CS_LOCAL));
-  EXPECT_TRUE(filter.IsActive());
-
-  EXPECT_FALSE(filter.SetAnswer(false, cricket::CS_LOCAL));
-  EXPECT_TRUE(filter.IsActive());
-  EXPECT_TRUE(filter.SetAnswer(true, cricket::CS_LOCAL));
-  EXPECT_TRUE(filter.IsActive());
-}
diff --git a/pc/rtcstats_integrationtest.cc b/pc/rtcstats_integrationtest.cc
deleted file mode 100644
index 7967633..0000000
--- a/pc/rtcstats_integrationtest.cc
+++ /dev/null
@@ -1,729 +0,0 @@
-/*
- *  Copyright 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 <set>
-#include <vector>
-
-#include "webrtc/api/audio_codecs/builtin_audio_decoder_factory.h"
-#include "webrtc/api/audio_codecs/builtin_audio_encoder_factory.h"
-#include "webrtc/api/datachannelinterface.h"
-#include "webrtc/api/peerconnectioninterface.h"
-#include "webrtc/api/stats/rtcstats_objects.h"
-#include "webrtc/api/stats/rtcstatsreport.h"
-#include "webrtc/pc/test/peerconnectiontestwrapper.h"
-#include "webrtc/pc/test/rtcstatsobtainer.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/event_tracer.h"
-#include "webrtc/rtc_base/gunit.h"
-#include "webrtc/rtc_base/refcountedobject.h"
-#include "webrtc/rtc_base/scoped_ref_ptr.h"
-#include "webrtc/rtc_base/trace_event.h"
-#include "webrtc/rtc_base/virtualsocketserver.h"
-
-namespace webrtc {
-
-namespace {
-
-const int64_t kGetStatsTimeoutMs = 10000;
-
-const unsigned char* GetCategoryEnabledHandler(const char* name) {
-  if (strcmp("webrtc_stats", name) != 0) {
-    return reinterpret_cast<const unsigned char*>("");
-  }
-  return reinterpret_cast<const unsigned char*>(name);
-}
-
-class RTCStatsReportTraceListener {
- public:
-  static void SetUp() {
-    if (!traced_report_)
-      traced_report_ = new RTCStatsReportTraceListener();
-    traced_report_->last_trace_ = "";
-    SetupEventTracer(&GetCategoryEnabledHandler,
-                     &RTCStatsReportTraceListener::AddTraceEventHandler);
-  }
-
-  static const std::string& last_trace() {
-    RTC_DCHECK(traced_report_);
-    return traced_report_->last_trace_;
-  }
-
- private:
-  static void AddTraceEventHandler(char phase,
-                                   const unsigned char* category_enabled,
-                                   const char* name,
-                                   unsigned long long id,
-                                   int num_args,
-                                   const char** arg_names,
-                                   const unsigned char* arg_types,
-                                   const unsigned long long* arg_values,
-                                   unsigned char flags) {
-    RTC_DCHECK(traced_report_);
-    EXPECT_STREQ("webrtc_stats",
-                 reinterpret_cast<const char*>(category_enabled));
-    EXPECT_STREQ("webrtc_stats", name);
-    EXPECT_EQ(1, num_args);
-    EXPECT_STREQ("report", arg_names[0]);
-    EXPECT_EQ(TRACE_VALUE_TYPE_COPY_STRING, arg_types[0]);
-
-    traced_report_->last_trace_ = reinterpret_cast<const char*>(arg_values[0]);
-  }
-
-  static RTCStatsReportTraceListener* traced_report_;
-  std::string last_trace_;
-};
-
-RTCStatsReportTraceListener* RTCStatsReportTraceListener::traced_report_ =
-    nullptr;
-
-class RTCStatsIntegrationTest : public testing::Test {
- public:
-  RTCStatsIntegrationTest()
-      : network_thread_(new rtc::Thread(&virtual_socket_server_)),
-        worker_thread_(rtc::Thread::Create()) {
-    RTCStatsReportTraceListener::SetUp();
-
-    RTC_CHECK(network_thread_->Start());
-    RTC_CHECK(worker_thread_->Start());
-
-    caller_ = new rtc::RefCountedObject<PeerConnectionTestWrapper>(
-        "caller", network_thread_.get(), worker_thread_.get());
-    callee_ = new rtc::RefCountedObject<PeerConnectionTestWrapper>(
-        "callee", network_thread_.get(), worker_thread_.get());
-  }
-
-  void StartCall() {
-    // Create PeerConnections and "connect" sigslots
-    PeerConnectionInterface::RTCConfiguration config;
-    PeerConnectionInterface::IceServer ice_server;
-    ice_server.uri = "stun:1.1.1.1:3478";
-    config.servers.push_back(ice_server);
-    EXPECT_TRUE(caller_->CreatePc(nullptr, config,
-                                  CreateBuiltinAudioEncoderFactory(),
-                                  CreateBuiltinAudioDecoderFactory()));
-    EXPECT_TRUE(callee_->CreatePc(nullptr, config,
-                                  CreateBuiltinAudioEncoderFactory(),
-                                  CreateBuiltinAudioDecoderFactory()));
-    PeerConnectionTestWrapper::Connect(caller_.get(), callee_.get());
-
-    // Get user media for audio and video
-    caller_->GetAndAddUserMedia(true, FakeConstraints(),
-                                true, FakeConstraints());
-    callee_->GetAndAddUserMedia(true, FakeConstraints(),
-                                true, FakeConstraints());
-
-    // Create data channels
-    DataChannelInit init;
-    caller_->CreateDataChannel("data", init);
-    callee_->CreateDataChannel("data", init);
-
-    // Negotiate and wait for call to establish
-    caller_->CreateOffer(nullptr);
-    caller_->WaitForCallEstablished();
-    callee_->WaitForCallEstablished();
-  }
-
-  rtc::scoped_refptr<const RTCStatsReport> GetStatsFromCaller() {
-    return GetStats(caller_->pc());
-  }
-
-  rtc::scoped_refptr<const RTCStatsReport> GetStatsFromCallee() {
-    return GetStats(callee_->pc());
-  }
-
- protected:
-  static rtc::scoped_refptr<const RTCStatsReport> GetStats(
-      PeerConnectionInterface* pc) {
-    rtc::scoped_refptr<RTCStatsObtainer> stats_obtainer =
-        RTCStatsObtainer::Create();
-    pc->GetStats(stats_obtainer);
-    EXPECT_TRUE_WAIT(stats_obtainer->report(), kGetStatsTimeoutMs);
-    return stats_obtainer->report();
-  }
-
-  // |network_thread_| uses |virtual_socket_server_| so they must be
-  // constructed/destructed in the correct order.
-  rtc::VirtualSocketServer virtual_socket_server_;
-  std::unique_ptr<rtc::Thread> network_thread_;
-  std::unique_ptr<rtc::Thread> worker_thread_;
-  rtc::scoped_refptr<PeerConnectionTestWrapper> caller_;
-  rtc::scoped_refptr<PeerConnectionTestWrapper> callee_;
-};
-
-class RTCStatsVerifier {
- public:
-  RTCStatsVerifier(const RTCStatsReport* report, const RTCStats* stats)
-      : report_(report), stats_(stats), all_tests_successful_(true) {
-    RTC_CHECK(report_);
-    RTC_CHECK(stats_);
-    for (const RTCStatsMemberInterface* member : stats_->Members()) {
-      untested_members_.insert(member);
-    }
-  }
-
-  void MarkMemberTested(
-      const RTCStatsMemberInterface& member, bool test_successful) {
-    untested_members_.erase(&member);
-    all_tests_successful_ &= test_successful;
-  }
-
-  void TestMemberIsDefined(const RTCStatsMemberInterface& member) {
-    EXPECT_TRUE(member.is_defined()) <<
-        stats_->type() << "." << member.name() << "[" << stats_->id() <<
-        "] was undefined.";
-    MarkMemberTested(member, member.is_defined());
-  }
-
-  void TestMemberIsUndefined(const RTCStatsMemberInterface& member) {
-    EXPECT_FALSE(member.is_defined()) <<
-        stats_->type() << "." << member.name() << "[" << stats_->id() <<
-        "] was defined (" << member.ValueToString() << ").";
-    MarkMemberTested(member, !member.is_defined());
-  }
-
-  template<typename T>
-  void TestMemberIsPositive(const RTCStatsMemberInterface& member) {
-    EXPECT_TRUE(member.is_defined()) <<
-        stats_->type() << "." << member.name() << "[" << stats_->id() <<
-        "] was undefined.";
-    if (!member.is_defined()) {
-      MarkMemberTested(member, false);
-      return;
-    }
-    bool is_positive = *member.cast_to<RTCStatsMember<T>>() > T(0);
-    EXPECT_TRUE(is_positive) <<
-        stats_->type() << "." << member.name() << "[" << stats_->id() <<
-        "] was not positive (" << member.ValueToString() << ").";
-    MarkMemberTested(member, is_positive);
-  }
-
-  template<typename T>
-  void TestMemberIsNonNegative(const RTCStatsMemberInterface& member) {
-    EXPECT_TRUE(member.is_defined()) <<
-        stats_->type() << "." << member.name() << "[" << stats_->id() <<
-        "] was undefined.";
-    if (!member.is_defined()) {
-      MarkMemberTested(member, false);
-      return;
-    }
-    bool is_non_negative = *member.cast_to<RTCStatsMember<T>>() >= T(0);
-    EXPECT_TRUE(is_non_negative) <<
-        stats_->type() << "." << member.name() << "[" << stats_->id() <<
-        "] was not non-negative (" << member.ValueToString() << ").";
-    MarkMemberTested(member, is_non_negative);
-  }
-
-  void TestMemberIsIDReference(
-      const RTCStatsMemberInterface& member,
-      const char* expected_type) {
-    TestMemberIsIDReference(member, expected_type, false);
-  }
-
-  void TestMemberIsOptionalIDReference(
-      const RTCStatsMemberInterface& member,
-      const char* expected_type) {
-    TestMemberIsIDReference(member, expected_type, true);
-  }
-
-  bool ExpectAllMembersSuccessfullyTested() {
-    if (untested_members_.empty())
-      return all_tests_successful_;
-    for (const RTCStatsMemberInterface* member : untested_members_) {
-      EXPECT_TRUE(false) <<
-          stats_->type() << "." << member->name() << "[" << stats_->id() <<
-          "] was not tested.";
-    }
-    return false;
-  }
-
- private:
-  void TestMemberIsIDReference(
-      const RTCStatsMemberInterface& member,
-      const char* expected_type,
-      bool optional) {
-    if (optional && !member.is_defined()) {
-      MarkMemberTested(member, true);
-      return;
-    }
-    bool valid_reference = false;
-    if (member.is_defined()) {
-      if (member.type() == RTCStatsMemberInterface::kString) {
-        // A single ID.
-        const RTCStatsMember<std::string>& id =
-            member.cast_to<RTCStatsMember<std::string>>();
-        const RTCStats* referenced_stats = report_->Get(*id);
-        valid_reference =
-            referenced_stats && referenced_stats->type() == expected_type;
-      } else if (member.type() == RTCStatsMemberInterface::kSequenceString) {
-        // A vector of IDs.
-        valid_reference = true;
-        const RTCStatsMember<std::vector<std::string>>& ids =
-            member.cast_to<RTCStatsMember<std::vector<std::string>>>();
-        for (const std::string id : *ids) {
-          const RTCStats* referenced_stats = report_->Get(id);
-          if (!referenced_stats || referenced_stats->type() != expected_type) {
-            valid_reference = false;
-            break;
-          }
-        }
-      }
-    }
-    EXPECT_TRUE(valid_reference) <<
-      stats_->type() << "." << member.name() << " is not a reference to an " <<
-      "existing dictionary of type " << expected_type << " (" <<
-      member.ValueToString() << ").";
-    MarkMemberTested(member, valid_reference);
-  }
-
-  rtc::scoped_refptr<const RTCStatsReport> report_;
-  const RTCStats* stats_;
-  std::set<const RTCStatsMemberInterface*> untested_members_;
-  bool all_tests_successful_;
-};
-
-class RTCStatsReportVerifier {
- public:
-  static std::set<const char*> StatsTypes() {
-    std::set<const char*> stats_types;
-    stats_types.insert(RTCCertificateStats::kType);
-    stats_types.insert(RTCCodecStats::kType);
-    stats_types.insert(RTCDataChannelStats::kType);
-    stats_types.insert(RTCIceCandidatePairStats::kType);
-    stats_types.insert(RTCLocalIceCandidateStats::kType);
-    stats_types.insert(RTCRemoteIceCandidateStats::kType);
-    stats_types.insert(RTCMediaStreamStats::kType);
-    stats_types.insert(RTCMediaStreamTrackStats::kType);
-    stats_types.insert(RTCPeerConnectionStats::kType);
-    stats_types.insert(RTCInboundRTPStreamStats::kType);
-    stats_types.insert(RTCOutboundRTPStreamStats::kType);
-    stats_types.insert(RTCTransportStats::kType);
-    return stats_types;
-  }
-
-  explicit RTCStatsReportVerifier(const RTCStatsReport* report)
-      : report_(report) {
-  }
-
-  void VerifyReport() {
-    std::set<const char*> missing_stats = StatsTypes();
-    bool verify_successful = true;
-    std::vector<const RTCTransportStats*> transport_stats =
-        report_->GetStatsOfType<RTCTransportStats>();
-    EXPECT_EQ(transport_stats.size(), 1);
-    std::string selected_candidate_pair_id =
-        *transport_stats[0]->selected_candidate_pair_id;
-    for (const RTCStats& stats : *report_) {
-      missing_stats.erase(stats.type());
-      if (stats.type() == RTCCertificateStats::kType) {
-        verify_successful &= VerifyRTCCertificateStats(
-            stats.cast_to<RTCCertificateStats>());
-      } else if (stats.type() == RTCCodecStats::kType) {
-        verify_successful &= VerifyRTCCodecStats(
-            stats.cast_to<RTCCodecStats>());
-      } else if (stats.type() == RTCDataChannelStats::kType) {
-        verify_successful &= VerifyRTCDataChannelStats(
-            stats.cast_to<RTCDataChannelStats>());
-      } else if (stats.type() == RTCIceCandidatePairStats::kType) {
-        verify_successful &= VerifyRTCIceCandidatePairStats(
-            stats.cast_to<RTCIceCandidatePairStats>(),
-            stats.id() == selected_candidate_pair_id);
-      } else if (stats.type() == RTCLocalIceCandidateStats::kType) {
-        verify_successful &= VerifyRTCLocalIceCandidateStats(
-            stats.cast_to<RTCLocalIceCandidateStats>());
-      } else if (stats.type() == RTCRemoteIceCandidateStats::kType) {
-        verify_successful &= VerifyRTCRemoteIceCandidateStats(
-            stats.cast_to<RTCRemoteIceCandidateStats>());
-      } else if (stats.type() == RTCMediaStreamStats::kType) {
-        verify_successful &= VerifyRTCMediaStreamStats(
-            stats.cast_to<RTCMediaStreamStats>());
-      } else if (stats.type() == RTCMediaStreamTrackStats::kType) {
-        verify_successful &= VerifyRTCMediaStreamTrackStats(
-            stats.cast_to<RTCMediaStreamTrackStats>());
-      } else if (stats.type() == RTCPeerConnectionStats::kType) {
-        verify_successful &= VerifyRTCPeerConnectionStats(
-            stats.cast_to<RTCPeerConnectionStats>());
-      } else if (stats.type() == RTCInboundRTPStreamStats::kType) {
-        verify_successful &= VerifyRTCInboundRTPStreamStats(
-            stats.cast_to<RTCInboundRTPStreamStats>());
-      } else if (stats.type() == RTCOutboundRTPStreamStats::kType) {
-        verify_successful &= VerifyRTCOutboundRTPStreamStats(
-            stats.cast_to<RTCOutboundRTPStreamStats>());
-      } else if (stats.type() == RTCTransportStats::kType) {
-        verify_successful &= VerifyRTCTransportStats(
-            stats.cast_to<RTCTransportStats>());
-      } else {
-        EXPECT_TRUE(false) << "Unrecognized stats type: " << stats.type();
-        verify_successful = false;
-      }
-    }
-    if (!missing_stats.empty()) {
-      verify_successful = false;
-      for (const char* missing : missing_stats) {
-        EXPECT_TRUE(false) << "Missing expected stats type: " << missing;
-      }
-    }
-    EXPECT_TRUE(verify_successful) <<
-        "One or more problems with the stats. This is the report:\n" <<
-        report_->ToJson();
-  }
-
-  bool VerifyRTCCertificateStats(
-      const RTCCertificateStats& certificate) {
-    RTCStatsVerifier verifier(report_, &certificate);
-    verifier.TestMemberIsDefined(certificate.fingerprint);
-    verifier.TestMemberIsDefined(certificate.fingerprint_algorithm);
-    verifier.TestMemberIsDefined(certificate.base64_certificate);
-    verifier.TestMemberIsOptionalIDReference(
-        certificate.issuer_certificate_id, RTCCertificateStats::kType);
-    return verifier.ExpectAllMembersSuccessfullyTested();
-  }
-
-  bool VerifyRTCCodecStats(
-      const RTCCodecStats& codec) {
-    RTCStatsVerifier verifier(report_, &codec);
-    verifier.TestMemberIsDefined(codec.payload_type);
-    verifier.TestMemberIsDefined(codec.mime_type);
-    verifier.TestMemberIsPositive<uint32_t>(codec.clock_rate);
-    verifier.TestMemberIsUndefined(codec.channels);
-    verifier.TestMemberIsUndefined(codec.sdp_fmtp_line);
-    verifier.TestMemberIsUndefined(codec.implementation);
-    return verifier.ExpectAllMembersSuccessfullyTested();
-  }
-
-  bool VerifyRTCDataChannelStats(
-      const RTCDataChannelStats& data_channel) {
-    RTCStatsVerifier verifier(report_, &data_channel);
-    verifier.TestMemberIsDefined(data_channel.label);
-    verifier.TestMemberIsDefined(data_channel.protocol);
-    verifier.TestMemberIsDefined(data_channel.datachannelid);
-    verifier.TestMemberIsDefined(data_channel.state);
-    verifier.TestMemberIsNonNegative<uint32_t>(data_channel.messages_sent);
-    verifier.TestMemberIsNonNegative<uint64_t>(data_channel.bytes_sent);
-    verifier.TestMemberIsNonNegative<uint32_t>(data_channel.messages_received);
-    verifier.TestMemberIsNonNegative<uint64_t>(data_channel.bytes_received);
-    return verifier.ExpectAllMembersSuccessfullyTested();
-  }
-
-  bool VerifyRTCIceCandidatePairStats(
-      const RTCIceCandidatePairStats& candidate_pair, bool is_selected_pair) {
-    RTCStatsVerifier verifier(report_, &candidate_pair);
-    verifier.TestMemberIsIDReference(
-        candidate_pair.transport_id, RTCTransportStats::kType);
-    verifier.TestMemberIsIDReference(
-        candidate_pair.local_candidate_id, RTCLocalIceCandidateStats::kType);
-    verifier.TestMemberIsIDReference(
-        candidate_pair.remote_candidate_id, RTCRemoteIceCandidateStats::kType);
-    verifier.TestMemberIsDefined(candidate_pair.state);
-    verifier.TestMemberIsNonNegative<uint64_t>(candidate_pair.priority);
-    verifier.TestMemberIsDefined(candidate_pair.nominated);
-    verifier.TestMemberIsDefined(candidate_pair.writable);
-    verifier.TestMemberIsUndefined(candidate_pair.readable);
-    verifier.TestMemberIsNonNegative<uint64_t>(candidate_pair.bytes_sent);
-    verifier.TestMemberIsNonNegative<uint64_t>(candidate_pair.bytes_received);
-    verifier.TestMemberIsNonNegative<double>(
-        candidate_pair.total_round_trip_time);
-    verifier.TestMemberIsNonNegative<double>(
-        candidate_pair.current_round_trip_time);
-    if (is_selected_pair) {
-      verifier.TestMemberIsNonNegative<double>(
-          candidate_pair.available_outgoing_bitrate);
-      // A pair should be nominated in order to be selected.
-      EXPECT_TRUE(*candidate_pair.nominated);
-    } else {
-      verifier.TestMemberIsUndefined(candidate_pair.available_outgoing_bitrate);
-    }
-    verifier.TestMemberIsUndefined(candidate_pair.available_incoming_bitrate);
-    verifier.TestMemberIsNonNegative<uint64_t>(
-        candidate_pair.requests_received);
-    verifier.TestMemberIsNonNegative<uint64_t>(candidate_pair.requests_sent);
-    verifier.TestMemberIsNonNegative<uint64_t>(
-        candidate_pair.responses_received);
-    verifier.TestMemberIsNonNegative<uint64_t>(candidate_pair.responses_sent);
-    verifier.TestMemberIsUndefined(candidate_pair.retransmissions_received);
-    verifier.TestMemberIsUndefined(candidate_pair.retransmissions_sent);
-    verifier.TestMemberIsUndefined(candidate_pair.consent_requests_received);
-    verifier.TestMemberIsNonNegative<uint64_t>(
-        candidate_pair.consent_requests_sent);
-    verifier.TestMemberIsUndefined(candidate_pair.consent_responses_received);
-    verifier.TestMemberIsUndefined(candidate_pair.consent_responses_sent);
-    return verifier.ExpectAllMembersSuccessfullyTested();
-  }
-
-  bool VerifyRTCIceCandidateStats(
-      const RTCIceCandidateStats& candidate) {
-    RTCStatsVerifier verifier(report_, &candidate);
-    verifier.TestMemberIsIDReference(
-        candidate.transport_id, RTCTransportStats::kType);
-    verifier.TestMemberIsDefined(candidate.is_remote);
-    verifier.TestMemberIsDefined(candidate.ip);
-    verifier.TestMemberIsNonNegative<int32_t>(candidate.port);
-    verifier.TestMemberIsDefined(candidate.protocol);
-    verifier.TestMemberIsDefined(candidate.candidate_type);
-    verifier.TestMemberIsNonNegative<int32_t>(candidate.priority);
-    verifier.TestMemberIsUndefined(candidate.url);
-    verifier.TestMemberIsDefined(candidate.deleted);
-    return verifier.ExpectAllMembersSuccessfullyTested();
-  }
-
-  bool VerifyRTCLocalIceCandidateStats(
-      const RTCLocalIceCandidateStats& local_candidate) {
-    return VerifyRTCIceCandidateStats(local_candidate);
-  }
-
-  bool VerifyRTCRemoteIceCandidateStats(
-      const RTCRemoteIceCandidateStats& remote_candidate) {
-    return VerifyRTCIceCandidateStats(remote_candidate);
-  }
-
-  bool VerifyRTCMediaStreamStats(
-      const RTCMediaStreamStats& media_stream) {
-    RTCStatsVerifier verifier(report_, &media_stream);
-    verifier.TestMemberIsDefined(media_stream.stream_identifier);
-    verifier.TestMemberIsIDReference(
-        media_stream.track_ids, RTCMediaStreamTrackStats::kType);
-    return verifier.ExpectAllMembersSuccessfullyTested();
-  }
-
-  bool VerifyRTCMediaStreamTrackStats(
-      const RTCMediaStreamTrackStats& media_stream_track) {
-    RTCStatsVerifier verifier(report_, &media_stream_track);
-    verifier.TestMemberIsDefined(media_stream_track.track_identifier);
-    verifier.TestMemberIsDefined(media_stream_track.remote_source);
-    verifier.TestMemberIsDefined(media_stream_track.ended);
-    verifier.TestMemberIsDefined(media_stream_track.detached);
-    verifier.TestMemberIsDefined(media_stream_track.kind);
-    // Video or audio media stream track?
-    if (*media_stream_track.kind == RTCMediaStreamTrackKind::kVideo) {
-      // Video-only members
-      verifier.TestMemberIsNonNegative<uint32_t>(
-          media_stream_track.frame_width);
-      verifier.TestMemberIsNonNegative<uint32_t>(
-          media_stream_track.frame_height);
-      verifier.TestMemberIsUndefined(media_stream_track.frames_per_second);
-      if (*media_stream_track.remote_source) {
-        verifier.TestMemberIsUndefined(media_stream_track.frames_sent);
-        verifier.TestMemberIsNonNegative<uint32_t>(
-            media_stream_track.frames_received);
-        verifier.TestMemberIsNonNegative<uint32_t>(
-            media_stream_track.frames_decoded);
-        verifier.TestMemberIsNonNegative<uint32_t>(
-            media_stream_track.frames_dropped);
-      } else {
-        verifier.TestMemberIsNonNegative<uint32_t>(
-            media_stream_track.frames_sent);
-        verifier.TestMemberIsUndefined(media_stream_track.frames_received);
-        verifier.TestMemberIsUndefined(media_stream_track.frames_decoded);
-        verifier.TestMemberIsUndefined(media_stream_track.frames_dropped);
-      }
-      verifier.TestMemberIsUndefined(media_stream_track.frames_corrupted);
-      verifier.TestMemberIsUndefined(media_stream_track.partial_frames_lost);
-      verifier.TestMemberIsUndefined(media_stream_track.full_frames_lost);
-      // Audio-only members should be undefined
-      verifier.TestMemberIsUndefined(media_stream_track.audio_level);
-      verifier.TestMemberIsUndefined(media_stream_track.echo_return_loss);
-      verifier.TestMemberIsUndefined(
-          media_stream_track.echo_return_loss_enhancement);
-      verifier.TestMemberIsUndefined(media_stream_track.total_audio_energy);
-      verifier.TestMemberIsUndefined(media_stream_track.total_samples_duration);
-    } else {
-      RTC_DCHECK_EQ(*media_stream_track.kind,
-                    RTCMediaStreamTrackKind::kAudio);
-      // Video-only members should be undefined
-      verifier.TestMemberIsUndefined(media_stream_track.frame_width);
-      verifier.TestMemberIsUndefined(media_stream_track.frame_height);
-      verifier.TestMemberIsUndefined(media_stream_track.frames_per_second);
-      verifier.TestMemberIsUndefined(media_stream_track.frames_sent);
-      verifier.TestMemberIsUndefined(media_stream_track.frames_received);
-      verifier.TestMemberIsUndefined(media_stream_track.frames_decoded);
-      verifier.TestMemberIsUndefined(media_stream_track.frames_dropped);
-      verifier.TestMemberIsUndefined(media_stream_track.frames_corrupted);
-      verifier.TestMemberIsUndefined(media_stream_track.partial_frames_lost);
-      verifier.TestMemberIsUndefined(media_stream_track.full_frames_lost);
-      // Audio-only members
-      verifier.TestMemberIsNonNegative<double>(media_stream_track.audio_level);
-      verifier.TestMemberIsNonNegative<double>(
-          media_stream_track.total_audio_energy);
-      verifier.TestMemberIsNonNegative<double>(
-          media_stream_track.total_samples_duration);
-      // TODO(hbos): |echo_return_loss| and |echo_return_loss_enhancement| are
-      // flaky on msan bot (sometimes defined, sometimes undefined). Should the
-      // test run until available or is there a way to have it always be
-      // defined? crbug.com/627816
-      verifier.MarkMemberTested(media_stream_track.echo_return_loss, true);
-      verifier.MarkMemberTested(
-          media_stream_track.echo_return_loss_enhancement, true);
-    }
-    // totalSamplesReceived and concealedSamples are only present on inbound
-    // audio tracks.
-    if (*media_stream_track.kind == RTCMediaStreamTrackKind::kAudio &&
-        *media_stream_track.remote_source) {
-      verifier.TestMemberIsNonNegative<uint64_t>(
-          media_stream_track.total_samples_received);
-      verifier.TestMemberIsNonNegative<uint64_t>(
-          media_stream_track.concealed_samples);
-    } else {
-      verifier.TestMemberIsUndefined(media_stream_track.total_samples_received);
-      verifier.TestMemberIsUndefined(media_stream_track.concealed_samples);
-    }
-    return verifier.ExpectAllMembersSuccessfullyTested();
-  }
-
-  bool VerifyRTCPeerConnectionStats(
-      const RTCPeerConnectionStats& peer_connection) {
-    RTCStatsVerifier verifier(report_, &peer_connection);
-    verifier.TestMemberIsNonNegative<uint32_t>(
-        peer_connection.data_channels_opened);
-    verifier.TestMemberIsNonNegative<uint32_t>(
-        peer_connection.data_channels_closed);
-    return verifier.ExpectAllMembersSuccessfullyTested();
-  }
-
-  void VerifyRTCRTPStreamStats(
-      const RTCRTPStreamStats& stream, RTCStatsVerifier* verifier) {
-    verifier->TestMemberIsDefined(stream.ssrc);
-    verifier->TestMemberIsUndefined(stream.associate_stats_id);
-    verifier->TestMemberIsDefined(stream.is_remote);
-    verifier->TestMemberIsDefined(stream.media_type);
-    verifier->TestMemberIsIDReference(
-        stream.track_id, RTCMediaStreamTrackStats::kType);
-    verifier->TestMemberIsIDReference(
-        stream.transport_id, RTCTransportStats::kType);
-    verifier->TestMemberIsIDReference(stream.codec_id, RTCCodecStats::kType);
-    if (stream.media_type.is_defined() && *stream.media_type == "video") {
-      verifier->TestMemberIsNonNegative<uint32_t>(stream.fir_count);
-      verifier->TestMemberIsNonNegative<uint32_t>(stream.pli_count);
-      verifier->TestMemberIsNonNegative<uint32_t>(stream.nack_count);
-    } else {
-      verifier->TestMemberIsUndefined(stream.fir_count);
-      verifier->TestMemberIsUndefined(stream.pli_count);
-      verifier->TestMemberIsUndefined(stream.nack_count);
-    }
-    verifier->TestMemberIsUndefined(stream.sli_count);
-  }
-
-  bool VerifyRTCInboundRTPStreamStats(
-      const RTCInboundRTPStreamStats& inbound_stream) {
-    RTCStatsVerifier verifier(report_, &inbound_stream);
-    VerifyRTCRTPStreamStats(inbound_stream, &verifier);
-    if (inbound_stream.media_type.is_defined() &&
-        *inbound_stream.media_type == "video") {
-      verifier.TestMemberIsNonNegative<uint64_t>(inbound_stream.qp_sum);
-    } else {
-      verifier.TestMemberIsUndefined(inbound_stream.qp_sum);
-    }
-    verifier.TestMemberIsNonNegative<uint32_t>(inbound_stream.packets_received);
-    verifier.TestMemberIsNonNegative<uint64_t>(inbound_stream.bytes_received);
-    verifier.TestMemberIsNonNegative<uint32_t>(inbound_stream.packets_lost);
-    if (inbound_stream.media_type.is_defined() &&
-        *inbound_stream.media_type == "video") {
-      verifier.TestMemberIsUndefined(inbound_stream.jitter);
-    } else {
-      verifier.TestMemberIsNonNegative<double>(inbound_stream.jitter);
-    }
-    verifier.TestMemberIsNonNegative<double>(inbound_stream.fraction_lost);
-    verifier.TestMemberIsUndefined(inbound_stream.round_trip_time);
-    verifier.TestMemberIsUndefined(inbound_stream.packets_discarded);
-    verifier.TestMemberIsUndefined(inbound_stream.packets_repaired);
-    verifier.TestMemberIsUndefined(inbound_stream.burst_packets_lost);
-    verifier.TestMemberIsUndefined(inbound_stream.burst_packets_discarded);
-    verifier.TestMemberIsUndefined(inbound_stream.burst_loss_count);
-    verifier.TestMemberIsUndefined(inbound_stream.burst_discard_count);
-    verifier.TestMemberIsUndefined(inbound_stream.burst_loss_rate);
-    verifier.TestMemberIsUndefined(inbound_stream.burst_discard_rate);
-    verifier.TestMemberIsUndefined(inbound_stream.gap_loss_rate);
-    verifier.TestMemberIsUndefined(inbound_stream.gap_discard_rate);
-    if (inbound_stream.media_type.is_defined() &&
-        *inbound_stream.media_type == "video") {
-      verifier.TestMemberIsDefined(inbound_stream.frames_decoded);
-    } else {
-      verifier.TestMemberIsUndefined(inbound_stream.frames_decoded);
-    }
-    return verifier.ExpectAllMembersSuccessfullyTested();
-  }
-
-  bool VerifyRTCOutboundRTPStreamStats(
-      const RTCOutboundRTPStreamStats& outbound_stream) {
-    RTCStatsVerifier verifier(report_, &outbound_stream);
-    VerifyRTCRTPStreamStats(outbound_stream, &verifier);
-    if (outbound_stream.media_type.is_defined() &&
-        *outbound_stream.media_type == "video") {
-      verifier.TestMemberIsNonNegative<uint64_t>(outbound_stream.qp_sum);
-    } else {
-      verifier.TestMemberIsUndefined(outbound_stream.qp_sum);
-    }
-    verifier.TestMemberIsNonNegative<uint32_t>(outbound_stream.packets_sent);
-    verifier.TestMemberIsNonNegative<uint64_t>(outbound_stream.bytes_sent);
-    verifier.TestMemberIsUndefined(outbound_stream.target_bitrate);
-    if (outbound_stream.media_type.is_defined() &&
-        *outbound_stream.media_type == "video") {
-      verifier.TestMemberIsDefined(outbound_stream.frames_encoded);
-    } else {
-      verifier.TestMemberIsUndefined(outbound_stream.frames_encoded);
-    }
-    return verifier.ExpectAllMembersSuccessfullyTested();
-  }
-
-  bool VerifyRTCTransportStats(
-      const RTCTransportStats& transport) {
-    RTCStatsVerifier verifier(report_, &transport);
-    verifier.TestMemberIsNonNegative<uint64_t>(transport.bytes_sent);
-    verifier.TestMemberIsNonNegative<uint64_t>(transport.bytes_received);
-    verifier.TestMemberIsOptionalIDReference(
-        transport.rtcp_transport_stats_id, RTCTransportStats::kType);
-    verifier.TestMemberIsDefined(transport.dtls_state);
-    verifier.TestMemberIsIDReference(
-        transport.selected_candidate_pair_id, RTCIceCandidatePairStats::kType);
-    verifier.TestMemberIsIDReference(
-        transport.local_certificate_id, RTCCertificateStats::kType);
-    verifier.TestMemberIsIDReference(
-        transport.remote_certificate_id, RTCCertificateStats::kType);
-    return verifier.ExpectAllMembersSuccessfullyTested();
-  }
-
- private:
-  rtc::scoped_refptr<const RTCStatsReport> report_;
-};
-
-#ifdef HAVE_SCTP
-TEST_F(RTCStatsIntegrationTest, GetStatsFromCaller) {
-  StartCall();
-
-  rtc::scoped_refptr<const RTCStatsReport> report = GetStatsFromCaller();
-  RTCStatsReportVerifier(report.get()).VerifyReport();
-  EXPECT_EQ(report->ToJson(), RTCStatsReportTraceListener::last_trace());
-}
-
-TEST_F(RTCStatsIntegrationTest, GetStatsFromCallee) {
-  StartCall();
-
-  rtc::scoped_refptr<const RTCStatsReport> report = GetStatsFromCallee();
-  RTCStatsReportVerifier(report.get()).VerifyReport();
-  EXPECT_EQ(report->ToJson(), RTCStatsReportTraceListener::last_trace());
-}
-
-TEST_F(RTCStatsIntegrationTest, GetsStatsWhileDestroyingPeerConnections) {
-  StartCall();
-
-  rtc::scoped_refptr<RTCStatsObtainer> stats_obtainer =
-      RTCStatsObtainer::Create();
-  caller_->pc()->GetStats(stats_obtainer);
-  // This will destroy the peer connection.
-  caller_ = nullptr;
-  // Any pending stats requests should have completed in the act of destroying
-  // the peer connection.
-  EXPECT_TRUE(stats_obtainer->report());
-  EXPECT_EQ(stats_obtainer->report()->ToJson(),
-            RTCStatsReportTraceListener::last_trace());
-}
-#endif  // HAVE_SCTP
-
-}  // namespace
-
-}  // namespace webrtc
diff --git a/pc/rtcstatscollector.cc b/pc/rtcstatscollector.cc
deleted file mode 100644
index 5b84ea5..0000000
--- a/pc/rtcstatscollector.cc
+++ /dev/null
@@ -1,1267 +0,0 @@
-/*
- *  Copyright 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/pc/rtcstatscollector.h"
-
-#include <memory>
-#include <sstream>
-#include <utility>
-#include <vector>
-
-#include "webrtc/api/mediastreaminterface.h"
-#include "webrtc/api/peerconnectioninterface.h"
-#include "webrtc/media/base/mediachannel.h"
-#include "webrtc/p2p/base/candidate.h"
-#include "webrtc/p2p/base/p2pconstants.h"
-#include "webrtc/p2p/base/port.h"
-#include "webrtc/pc/peerconnection.h"
-#include "webrtc/pc/webrtcsession.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/stringutils.h"
-#include "webrtc/rtc_base/timeutils.h"
-#include "webrtc/rtc_base/trace_event.h"
-
-namespace webrtc {
-
-namespace {
-
-std::string RTCCertificateIDFromFingerprint(const std::string& fingerprint) {
-  return "RTCCertificate_" + fingerprint;
-}
-
-std::string RTCCodecStatsIDFromDirectionMediaAndPayload(
-    bool inbound, bool audio, uint32_t payload_type) {
-  // TODO(hbos): The present codec ID assignment is not sufficient to support
-  // Unified Plan or unbundled connections in all cases. When we are able to
-  // handle multiple m= lines of the same media type (and multiple BaseChannels
-  // for the same type is possible?) this needs to be updated to differentiate
-  // the transport being used, and stats need to be collected for all of them.
-  if (inbound) {
-    return audio ? "RTCCodec_InboundAudio_" + rtc::ToString<>(payload_type)
-                 : "RTCCodec_InboundVideo_" + rtc::ToString<>(payload_type);
-  }
-  return audio ? "RTCCodec_OutboundAudio_" + rtc::ToString<>(payload_type)
-               : "RTCCodec_OutboundVideo_" + rtc::ToString<>(payload_type);
-}
-
-std::string RTCIceCandidatePairStatsIDFromConnectionInfo(
-    const cricket::ConnectionInfo& info) {
-  return "RTCIceCandidatePair_" + info.local_candidate.id() + "_" +
-      info.remote_candidate.id();
-}
-
-std::string RTCMediaStreamTrackStatsIDFromTrackKindIDAndSsrc(
-    bool is_local, const char* kind, const std::string& id, uint32_t ssrc) {
-  RTC_DCHECK(kind == MediaStreamTrackInterface::kAudioKind ||
-             kind == MediaStreamTrackInterface::kVideoKind);
-  std::ostringstream oss;
-  oss << (is_local ? "RTCMediaStreamTrack_local_"
-                   : "RTCMediaStreamTrack_remote_");
-  oss << kind << "_";
-  oss << id << "_";
-  oss << ssrc;
-  return oss.str();
-}
-
-std::string RTCTransportStatsIDFromTransportChannel(
-    const std::string& transport_name, int channel_component) {
-  return "RTCTransport_" + transport_name + "_" +
-      rtc::ToString<>(channel_component);
-}
-
-std::string RTCTransportStatsIDFromBaseChannel(
-    const ProxyTransportMap& proxy_to_transport,
-    const cricket::BaseChannel& base_channel) {
-  auto proxy_it = proxy_to_transport.find(base_channel.content_name());
-  if (proxy_it == proxy_to_transport.cend())
-    return "";
-  return RTCTransportStatsIDFromTransportChannel(
-      proxy_it->second, cricket::ICE_CANDIDATE_COMPONENT_RTP);
-}
-
-std::string RTCInboundRTPStreamStatsIDFromSSRC(bool audio, uint32_t ssrc) {
-  return audio ? "RTCInboundRTPAudioStream_" + rtc::ToString<>(ssrc)
-               : "RTCInboundRTPVideoStream_" + rtc::ToString<>(ssrc);
-}
-
-std::string RTCOutboundRTPStreamStatsIDFromSSRC(bool audio, uint32_t ssrc) {
-  return audio ? "RTCOutboundRTPAudioStream_" + rtc::ToString<>(ssrc)
-               : "RTCOutboundRTPVideoStream_" + rtc::ToString<>(ssrc);
-}
-
-const char* CandidateTypeToRTCIceCandidateType(const std::string& type) {
-  if (type == cricket::LOCAL_PORT_TYPE)
-    return RTCIceCandidateType::kHost;
-  if (type == cricket::STUN_PORT_TYPE)
-    return RTCIceCandidateType::kSrflx;
-  if (type == cricket::PRFLX_PORT_TYPE)
-    return RTCIceCandidateType::kPrflx;
-  if (type == cricket::RELAY_PORT_TYPE)
-    return RTCIceCandidateType::kRelay;
-  RTC_NOTREACHED();
-  return nullptr;
-}
-
-const char* DataStateToRTCDataChannelState(
-    DataChannelInterface::DataState state) {
-  switch (state) {
-    case DataChannelInterface::kConnecting:
-      return RTCDataChannelState::kConnecting;
-    case DataChannelInterface::kOpen:
-      return RTCDataChannelState::kOpen;
-    case DataChannelInterface::kClosing:
-      return RTCDataChannelState::kClosing;
-    case DataChannelInterface::kClosed:
-      return RTCDataChannelState::kClosed;
-    default:
-      RTC_NOTREACHED();
-      return nullptr;
-  }
-}
-
-const char* IceCandidatePairStateToRTCStatsIceCandidatePairState(
-    cricket::IceCandidatePairState state) {
-  switch (state) {
-    case cricket::IceCandidatePairState::WAITING:
-      return RTCStatsIceCandidatePairState::kWaiting;
-    case cricket::IceCandidatePairState::IN_PROGRESS:
-      return RTCStatsIceCandidatePairState::kInProgress;
-    case cricket::IceCandidatePairState::SUCCEEDED:
-      return RTCStatsIceCandidatePairState::kSucceeded;
-    case cricket::IceCandidatePairState::FAILED:
-      return RTCStatsIceCandidatePairState::kFailed;
-    default:
-      RTC_NOTREACHED();
-      return nullptr;
-  }
-}
-
-const char* DtlsTransportStateToRTCDtlsTransportState(
-    cricket::DtlsTransportState state) {
-  switch (state) {
-    case cricket::DTLS_TRANSPORT_NEW:
-      return RTCDtlsTransportState::kNew;
-    case cricket::DTLS_TRANSPORT_CONNECTING:
-      return RTCDtlsTransportState::kConnecting;
-    case cricket::DTLS_TRANSPORT_CONNECTED:
-      return RTCDtlsTransportState::kConnected;
-    case cricket::DTLS_TRANSPORT_CLOSED:
-      return RTCDtlsTransportState::kClosed;
-    case cricket::DTLS_TRANSPORT_FAILED:
-      return RTCDtlsTransportState::kFailed;
-    default:
-      RTC_NOTREACHED();
-      return nullptr;
-  }
-}
-
-double DoubleAudioLevelFromIntAudioLevel(int audio_level) {
-  RTC_DCHECK_GE(audio_level, 0);
-  RTC_DCHECK_LE(audio_level, 32767);
-  return audio_level / 32767.0;
-}
-
-std::unique_ptr<RTCCodecStats> CodecStatsFromRtpCodecParameters(
-    uint64_t timestamp_us, bool inbound, bool audio,
-    const RtpCodecParameters& codec_params) {
-  RTC_DCHECK_GE(codec_params.payload_type, 0);
-  RTC_DCHECK_LE(codec_params.payload_type, 127);
-  RTC_DCHECK(codec_params.clock_rate);
-  uint32_t payload_type = static_cast<uint32_t>(codec_params.payload_type);
-  std::unique_ptr<RTCCodecStats> codec_stats(new RTCCodecStats(
-      RTCCodecStatsIDFromDirectionMediaAndPayload(inbound, audio, payload_type),
-      timestamp_us));
-  codec_stats->payload_type = payload_type;
-  codec_stats->mime_type = codec_params.mime_type();
-  if (codec_params.clock_rate) {
-    codec_stats->clock_rate = static_cast<uint32_t>(*codec_params.clock_rate);
-  }
-  return codec_stats;
-}
-
-void SetMediaStreamTrackStatsFromMediaStreamTrackInterface(
-    const MediaStreamTrackInterface& track,
-    RTCMediaStreamTrackStats* track_stats) {
-  track_stats->track_identifier = track.id();
-  track_stats->ended = (track.state() == MediaStreamTrackInterface::kEnded);
-}
-
-// Provides the media independent counters (both audio and video).
-void SetInboundRTPStreamStatsFromMediaReceiverInfo(
-    const cricket::MediaReceiverInfo& media_receiver_info,
-    RTCInboundRTPStreamStats* inbound_stats) {
-  RTC_DCHECK(inbound_stats);
-  inbound_stats->ssrc = media_receiver_info.ssrc();
-  // TODO(hbos): Support the remote case. crbug.com/657855
-  inbound_stats->is_remote = false;
-  inbound_stats->packets_received =
-      static_cast<uint32_t>(media_receiver_info.packets_rcvd);
-  inbound_stats->bytes_received =
-      static_cast<uint64_t>(media_receiver_info.bytes_rcvd);
-  inbound_stats->packets_lost =
-      static_cast<uint32_t>(media_receiver_info.packets_lost);
-  inbound_stats->fraction_lost =
-      static_cast<double>(media_receiver_info.fraction_lost);
-}
-
-void SetInboundRTPStreamStatsFromVoiceReceiverInfo(
-    const cricket::VoiceReceiverInfo& voice_receiver_info,
-    RTCInboundRTPStreamStats* inbound_audio) {
-  SetInboundRTPStreamStatsFromMediaReceiverInfo(
-      voice_receiver_info, inbound_audio);
-  inbound_audio->media_type = "audio";
-  if (voice_receiver_info.codec_payload_type) {
-    inbound_audio->codec_id =
-        RTCCodecStatsIDFromDirectionMediaAndPayload(
-            true, true, *voice_receiver_info.codec_payload_type);
-  }
-  inbound_audio->jitter =
-      static_cast<double>(voice_receiver_info.jitter_ms) /
-          rtc::kNumMillisecsPerSec;
-  // |fir_count|, |pli_count| and |sli_count| are only valid for video and are
-  // purposefully left undefined for audio.
-}
-
-void SetInboundRTPStreamStatsFromVideoReceiverInfo(
-    const cricket::VideoReceiverInfo& video_receiver_info,
-    RTCInboundRTPStreamStats* inbound_video) {
-  SetInboundRTPStreamStatsFromMediaReceiverInfo(
-      video_receiver_info, inbound_video);
-  inbound_video->media_type = "video";
-  if (video_receiver_info.codec_payload_type) {
-    inbound_video->codec_id =
-        RTCCodecStatsIDFromDirectionMediaAndPayload(
-            true, false, *video_receiver_info.codec_payload_type);
-  }
-  inbound_video->fir_count =
-      static_cast<uint32_t>(video_receiver_info.firs_sent);
-  inbound_video->pli_count =
-      static_cast<uint32_t>(video_receiver_info.plis_sent);
-  inbound_video->nack_count =
-      static_cast<uint32_t>(video_receiver_info.nacks_sent);
-  inbound_video->frames_decoded = video_receiver_info.frames_decoded;
-  if (video_receiver_info.qp_sum)
-    inbound_video->qp_sum = *video_receiver_info.qp_sum;
-}
-
-// Provides the media independent counters (both audio and video).
-void SetOutboundRTPStreamStatsFromMediaSenderInfo(
-    const cricket::MediaSenderInfo& media_sender_info,
-    RTCOutboundRTPStreamStats* outbound_stats) {
-  RTC_DCHECK(outbound_stats);
-  outbound_stats->ssrc = media_sender_info.ssrc();
-  // TODO(hbos): Support the remote case. crbug.com/657856
-  outbound_stats->is_remote = false;
-  outbound_stats->packets_sent =
-      static_cast<uint32_t>(media_sender_info.packets_sent);
-  outbound_stats->bytes_sent =
-      static_cast<uint64_t>(media_sender_info.bytes_sent);
-}
-
-void SetOutboundRTPStreamStatsFromVoiceSenderInfo(
-    const cricket::VoiceSenderInfo& voice_sender_info,
-    RTCOutboundRTPStreamStats* outbound_audio) {
-  SetOutboundRTPStreamStatsFromMediaSenderInfo(
-      voice_sender_info, outbound_audio);
-  outbound_audio->media_type = "audio";
-  if (voice_sender_info.codec_payload_type) {
-    outbound_audio->codec_id =
-        RTCCodecStatsIDFromDirectionMediaAndPayload(
-            false, true, *voice_sender_info.codec_payload_type);
-  }
-  // |fir_count|, |pli_count| and |sli_count| are only valid for video and are
-  // purposefully left undefined for audio.
-}
-
-void SetOutboundRTPStreamStatsFromVideoSenderInfo(
-    const cricket::VideoSenderInfo& video_sender_info,
-    RTCOutboundRTPStreamStats* outbound_video) {
-  SetOutboundRTPStreamStatsFromMediaSenderInfo(
-      video_sender_info, outbound_video);
-  outbound_video->media_type = "video";
-  if (video_sender_info.codec_payload_type) {
-    outbound_video->codec_id =
-        RTCCodecStatsIDFromDirectionMediaAndPayload(
-            false, false, *video_sender_info.codec_payload_type);
-  }
-  outbound_video->fir_count =
-      static_cast<uint32_t>(video_sender_info.firs_rcvd);
-  outbound_video->pli_count =
-      static_cast<uint32_t>(video_sender_info.plis_rcvd);
-  outbound_video->nack_count =
-      static_cast<uint32_t>(video_sender_info.nacks_rcvd);
-  if (video_sender_info.qp_sum)
-    outbound_video->qp_sum = *video_sender_info.qp_sum;
-  outbound_video->frames_encoded = video_sender_info.frames_encoded;
-}
-
-void ProduceCertificateStatsFromSSLCertificateStats(
-    int64_t timestamp_us, const rtc::SSLCertificateStats& certificate_stats,
-    RTCStatsReport* report) {
-  RTCCertificateStats* prev_certificate_stats = nullptr;
-  for (const rtc::SSLCertificateStats* s = &certificate_stats; s;
-       s = s->issuer.get()) {
-    std::string certificate_stats_id =
-        RTCCertificateIDFromFingerprint(s->fingerprint);
-    // It is possible for the same certificate to show up multiple times, e.g.
-    // if local and remote side use the same certificate in a loopback call.
-    // If the report already contains stats for this certificate, skip it.
-    if (report->Get(certificate_stats_id)) {
-      RTC_DCHECK_EQ(s, &certificate_stats);
-      break;
-    }
-    RTCCertificateStats* certificate_stats = new RTCCertificateStats(
-        certificate_stats_id, timestamp_us);
-    certificate_stats->fingerprint = s->fingerprint;
-    certificate_stats->fingerprint_algorithm = s->fingerprint_algorithm;
-    certificate_stats->base64_certificate = s->base64_certificate;
-    if (prev_certificate_stats)
-      prev_certificate_stats->issuer_certificate_id = certificate_stats->id();
-    report->AddStats(std::unique_ptr<RTCCertificateStats>(certificate_stats));
-    prev_certificate_stats = certificate_stats;
-  }
-}
-
-const std::string& ProduceIceCandidateStats(
-    int64_t timestamp_us, const cricket::Candidate& candidate, bool is_local,
-    const std::string& transport_id, RTCStatsReport* report) {
-  const std::string& id = "RTCIceCandidate_" + candidate.id();
-  const RTCStats* stats = report->Get(id);
-  if (!stats) {
-    std::unique_ptr<RTCIceCandidateStats> candidate_stats;
-    if (is_local)
-      candidate_stats.reset(new RTCLocalIceCandidateStats(id, timestamp_us));
-    else
-      candidate_stats.reset(new RTCRemoteIceCandidateStats(id, timestamp_us));
-    candidate_stats->transport_id = transport_id;
-    candidate_stats->ip = candidate.address().ipaddr().ToString();
-    candidate_stats->port = static_cast<int32_t>(candidate.address().port());
-    candidate_stats->protocol = candidate.protocol();
-    candidate_stats->candidate_type = CandidateTypeToRTCIceCandidateType(
-        candidate.type());
-    candidate_stats->priority = static_cast<int32_t>(candidate.priority());
-
-    stats = candidate_stats.get();
-    report->AddStats(std::move(candidate_stats));
-  }
-  RTC_DCHECK_EQ(stats->type(), is_local ? RTCLocalIceCandidateStats::kType
-                                        : RTCRemoteIceCandidateStats::kType);
-  return stats->id();
-}
-
-std::unique_ptr<RTCMediaStreamTrackStats>
-ProduceMediaStreamTrackStatsFromVoiceSenderInfo(
-    int64_t timestamp_us,
-    const AudioTrackInterface& audio_track,
-    const cricket::VoiceSenderInfo& voice_sender_info) {
-  std::unique_ptr<RTCMediaStreamTrackStats> audio_track_stats(
-      new RTCMediaStreamTrackStats(
-          RTCMediaStreamTrackStatsIDFromTrackKindIDAndSsrc(
-              true, MediaStreamTrackInterface::kAudioKind, audio_track.id(),
-              voice_sender_info.ssrc()),
-          timestamp_us,
-          RTCMediaStreamTrackKind::kAudio));
-  SetMediaStreamTrackStatsFromMediaStreamTrackInterface(
-      audio_track, audio_track_stats.get());
-  audio_track_stats->remote_source = false;
-  audio_track_stats->detached = false;
-  if (voice_sender_info.audio_level >= 0) {
-    audio_track_stats->audio_level = DoubleAudioLevelFromIntAudioLevel(
-        voice_sender_info.audio_level);
-  }
-  audio_track_stats->total_audio_energy = voice_sender_info.total_input_energy;
-  audio_track_stats->total_samples_duration =
-      voice_sender_info.total_input_duration;
-  if (voice_sender_info.echo_return_loss != -100) {
-    audio_track_stats->echo_return_loss = static_cast<double>(
-        voice_sender_info.echo_return_loss);
-  }
-  if (voice_sender_info.echo_return_loss_enhancement != -100) {
-    audio_track_stats->echo_return_loss_enhancement = static_cast<double>(
-        voice_sender_info.echo_return_loss_enhancement);
-  }
-  return audio_track_stats;
-}
-
-std::unique_ptr<RTCMediaStreamTrackStats>
-ProduceMediaStreamTrackStatsFromVoiceReceiverInfo(
-    int64_t timestamp_us,
-    const AudioTrackInterface& audio_track,
-    const cricket::VoiceReceiverInfo& voice_receiver_info) {
-  std::unique_ptr<RTCMediaStreamTrackStats> audio_track_stats(
-      new RTCMediaStreamTrackStats(
-          RTCMediaStreamTrackStatsIDFromTrackKindIDAndSsrc(
-              false, MediaStreamTrackInterface::kAudioKind, audio_track.id(),
-              voice_receiver_info.ssrc()),
-          timestamp_us,
-          RTCMediaStreamTrackKind::kAudio));
-  SetMediaStreamTrackStatsFromMediaStreamTrackInterface(
-      audio_track, audio_track_stats.get());
-  audio_track_stats->remote_source = true;
-  audio_track_stats->detached = false;
-  if (voice_receiver_info.audio_level >= 0) {
-    audio_track_stats->audio_level = DoubleAudioLevelFromIntAudioLevel(
-        voice_receiver_info.audio_level);
-  }
-  audio_track_stats->total_audio_energy =
-      voice_receiver_info.total_output_energy;
-  audio_track_stats->total_samples_received =
-      voice_receiver_info.total_samples_received;
-  audio_track_stats->total_samples_duration =
-      voice_receiver_info.total_output_duration;
-  audio_track_stats->concealed_samples = voice_receiver_info.concealed_samples;
-  return audio_track_stats;
-}
-
-std::unique_ptr<RTCMediaStreamTrackStats>
-ProduceMediaStreamTrackStatsFromVideoSenderInfo(
-    int64_t timestamp_us,
-    const VideoTrackInterface& video_track,
-    const cricket::VideoSenderInfo& video_sender_info) {
-  std::unique_ptr<RTCMediaStreamTrackStats> video_track_stats(
-      new RTCMediaStreamTrackStats(
-          RTCMediaStreamTrackStatsIDFromTrackKindIDAndSsrc(
-              true, MediaStreamTrackInterface::kVideoKind, video_track.id(),
-              video_sender_info.ssrc()),
-          timestamp_us,
-          RTCMediaStreamTrackKind::kVideo));
-  SetMediaStreamTrackStatsFromMediaStreamTrackInterface(
-      video_track, video_track_stats.get());
-  video_track_stats->remote_source = false;
-  video_track_stats->detached = false;
-  video_track_stats->frame_width = static_cast<uint32_t>(
-      video_sender_info.send_frame_width);
-  video_track_stats->frame_height = static_cast<uint32_t>(
-      video_sender_info.send_frame_height);
-  // TODO(hbos): Will reduce this by frames dropped due to congestion control
-  // when available. crbug.com/659137
-  video_track_stats->frames_sent = video_sender_info.frames_encoded;
-  return video_track_stats;
-}
-
-std::unique_ptr<RTCMediaStreamTrackStats>
-ProduceMediaStreamTrackStatsFromVideoReceiverInfo(
-    int64_t timestamp_us,
-    const VideoTrackInterface& video_track,
-    const cricket::VideoReceiverInfo& video_receiver_info) {
-  std::unique_ptr<RTCMediaStreamTrackStats> video_track_stats(
-      new RTCMediaStreamTrackStats(
-          RTCMediaStreamTrackStatsIDFromTrackKindIDAndSsrc(
-              false, MediaStreamTrackInterface::kVideoKind, video_track.id(),
-              video_receiver_info.ssrc()),
-          timestamp_us,
-          RTCMediaStreamTrackKind::kVideo));
-  SetMediaStreamTrackStatsFromMediaStreamTrackInterface(
-      video_track, video_track_stats.get());
-  video_track_stats->remote_source = true;
-  video_track_stats->detached = false;
-  if (video_receiver_info.frame_width > 0 &&
-      video_receiver_info.frame_height > 0) {
-    video_track_stats->frame_width = static_cast<uint32_t>(
-        video_receiver_info.frame_width);
-    video_track_stats->frame_height = static_cast<uint32_t>(
-        video_receiver_info.frame_height);
-  }
-  video_track_stats->frames_received = video_receiver_info.frames_received;
-  // TODO(hbos): When we support receiving simulcast, this should be the total
-  // number of frames correctly decoded, independent of which SSRC it was
-  // received from. Since we don't support that, this is correct and is the same
-  // value as "RTCInboundRTPStreamStats.framesDecoded". crbug.com/659137
-  video_track_stats->frames_decoded = video_receiver_info.frames_decoded;
-  RTC_DCHECK_GE(video_receiver_info.frames_received,
-                video_receiver_info.frames_rendered);
-  video_track_stats->frames_dropped = video_receiver_info.frames_received -
-                                      video_receiver_info.frames_rendered;
-  return video_track_stats;
-}
-
-void ProduceMediaStreamAndTrackStats(
-    int64_t timestamp_us,
-    const TrackMediaInfoMap& track_media_info_map,
-    rtc::scoped_refptr<StreamCollectionInterface> streams,
-    bool is_local,
-    RTCStatsReport* report) {
-  // TODO(hbos): When "AddTrack" is implemented we should iterate tracks to
-  // find which streams exist, not iterate streams to find tracks.
-  // crbug.com/659137
-  // TODO(hbos): Return stats of detached tracks. We have to perform stats
-  // gathering at the time of detachment to get accurate stats and timestamps.
-  // crbug.com/659137
-  if (!streams)
-    return;
-  for (size_t i = 0; i < streams->count(); ++i) {
-    MediaStreamInterface* stream = streams->at(i);
-
-    std::unique_ptr<RTCMediaStreamStats> stream_stats(
-        new RTCMediaStreamStats(
-            (is_local ? "RTCMediaStream_local_" : "RTCMediaStream_remote_") +
-            stream->label(), timestamp_us));
-    stream_stats->stream_identifier = stream->label();
-    stream_stats->track_ids = std::vector<std::string>();
-    // The track stats are per-attachment to the connection. There can be one
-    // for receiving (remote) tracks and multiple attachments for sending
-    // (local) tracks.
-    if (is_local) {
-      // Local Audio Tracks
-      for (const rtc::scoped_refptr<AudioTrackInterface>& audio_track :
-           stream->GetAudioTracks()) {
-        const std::vector<cricket::VoiceSenderInfo*>* voice_sender_infos =
-            track_media_info_map.GetVoiceSenderInfos(*audio_track);
-        if (!voice_sender_infos) {
-          continue;
-        }
-        for (const auto& voice_sender_info : *voice_sender_infos) {
-          std::unique_ptr<RTCMediaStreamTrackStats> audio_track_stats =
-              ProduceMediaStreamTrackStatsFromVoiceSenderInfo(
-                  timestamp_us, *audio_track, *voice_sender_info);
-          stream_stats->track_ids->push_back(audio_track_stats->id());
-          report->AddStats(std::move(audio_track_stats));
-        }
-      }
-      // Local Video Tracks
-      for (const rtc::scoped_refptr<VideoTrackInterface>& video_track :
-           stream->GetVideoTracks()) {
-        const std::vector<cricket::VideoSenderInfo*>* video_sender_infos =
-            track_media_info_map.GetVideoSenderInfos(*video_track);
-        if (!video_sender_infos) {
-          continue;
-        }
-        for (const auto& video_sender_info : *video_sender_infos) {
-          std::unique_ptr<RTCMediaStreamTrackStats> video_track_stats =
-              ProduceMediaStreamTrackStatsFromVideoSenderInfo(
-                  timestamp_us, *video_track, *video_sender_info);
-          stream_stats->track_ids->push_back(video_track_stats->id());
-          report->AddStats(std::move(video_track_stats));
-        }
-      }
-    } else {
-      // Remote Audio Tracks
-      for (const rtc::scoped_refptr<AudioTrackInterface>& audio_track :
-           stream->GetAudioTracks()) {
-        const cricket::VoiceReceiverInfo* voice_receiver_info =
-            track_media_info_map.GetVoiceReceiverInfo(*audio_track);
-        if (!voice_receiver_info) {
-          continue;
-        }
-        std::unique_ptr<RTCMediaStreamTrackStats> audio_track_stats =
-            ProduceMediaStreamTrackStatsFromVoiceReceiverInfo(
-                timestamp_us, *audio_track, *voice_receiver_info);
-        stream_stats->track_ids->push_back(audio_track_stats->id());
-        report->AddStats(std::move(audio_track_stats));
-      }
-      // Remote Video Tracks
-      for (const rtc::scoped_refptr<VideoTrackInterface>& video_track :
-           stream->GetVideoTracks()) {
-        const cricket::VideoReceiverInfo* video_receiver_info =
-            track_media_info_map.GetVideoReceiverInfo(*video_track);
-        if (!video_receiver_info) {
-          continue;
-        }
-        std::unique_ptr<RTCMediaStreamTrackStats> video_track_stats =
-            ProduceMediaStreamTrackStatsFromVideoReceiverInfo(
-                timestamp_us, *video_track, *video_receiver_info);
-        stream_stats->track_ids->push_back(video_track_stats->id());
-        report->AddStats(std::move(video_track_stats));
-      }
-    }
-    report->AddStats(std::move(stream_stats));
-  }
-}
-
-}  // namespace
-
-rtc::scoped_refptr<RTCStatsCollector> RTCStatsCollector::Create(
-    PeerConnection* pc, int64_t cache_lifetime_us) {
-  return rtc::scoped_refptr<RTCStatsCollector>(
-      new rtc::RefCountedObject<RTCStatsCollector>(pc, cache_lifetime_us));
-}
-
-RTCStatsCollector::RTCStatsCollector(PeerConnection* pc,
-                                     int64_t cache_lifetime_us)
-    : pc_(pc),
-      signaling_thread_(pc->session()->signaling_thread()),
-      worker_thread_(pc->session()->worker_thread()),
-      network_thread_(pc->session()->network_thread()),
-      num_pending_partial_reports_(0),
-      partial_report_timestamp_us_(0),
-      cache_timestamp_us_(0),
-      cache_lifetime_us_(cache_lifetime_us) {
-  RTC_DCHECK(pc_);
-  RTC_DCHECK(signaling_thread_);
-  RTC_DCHECK(worker_thread_);
-  RTC_DCHECK(network_thread_);
-  RTC_DCHECK_GE(cache_lifetime_us_, 0);
-  pc_->SignalDataChannelCreated.connect(
-      this, &RTCStatsCollector::OnDataChannelCreated);
-}
-
-RTCStatsCollector::~RTCStatsCollector() {
-  RTC_DCHECK_EQ(num_pending_partial_reports_, 0);
-}
-
-void RTCStatsCollector::GetStatsReport(
-    rtc::scoped_refptr<RTCStatsCollectorCallback> callback) {
-  RTC_DCHECK(signaling_thread_->IsCurrent());
-  RTC_DCHECK(callback);
-  callbacks_.push_back(callback);
-
-  // "Now" using a monotonically increasing timer.
-  int64_t cache_now_us = rtc::TimeMicros();
-  if (cached_report_ &&
-      cache_now_us - cache_timestamp_us_ <= cache_lifetime_us_) {
-    // We have a fresh cached report to deliver.
-    DeliverCachedReport();
-  } else if (!num_pending_partial_reports_) {
-    // Only start gathering stats if we're not already gathering stats. In the
-    // case of already gathering stats, |callback_| will be invoked when there
-    // are no more pending partial reports.
-
-    // "Now" using a system clock, relative to the UNIX epoch (Jan 1, 1970,
-    // UTC), in microseconds. The system clock could be modified and is not
-    // necessarily monotonically increasing.
-    int64_t timestamp_us = rtc::TimeUTCMicros();
-
-    num_pending_partial_reports_ = 2;
-    partial_report_timestamp_us_ = cache_now_us;
-
-    // Prepare |channel_name_pairs_| for use in
-    // |ProducePartialResultsOnNetworkThread|.
-    channel_name_pairs_.reset(new ChannelNamePairs());
-    if (pc_->session()->voice_channel()) {
-      channel_name_pairs_->voice = rtc::Optional<ChannelNamePair>(
-          ChannelNamePair(pc_->session()->voice_channel()->content_name(),
-                          pc_->session()->voice_channel()->transport_name()));
-    }
-    if (pc_->session()->video_channel()) {
-      channel_name_pairs_->video = rtc::Optional<ChannelNamePair>(
-          ChannelNamePair(pc_->session()->video_channel()->content_name(),
-                          pc_->session()->video_channel()->transport_name()));
-    }
-    if (pc_->session()->rtp_data_channel()) {
-      channel_name_pairs_->data =
-          rtc::Optional<ChannelNamePair>(ChannelNamePair(
-              pc_->session()->rtp_data_channel()->content_name(),
-              pc_->session()->rtp_data_channel()->transport_name()));
-    }
-    if (pc_->session()->sctp_content_name()) {
-      channel_name_pairs_->data = rtc::Optional<ChannelNamePair>(
-          ChannelNamePair(*pc_->session()->sctp_content_name(),
-                          *pc_->session()->sctp_transport_name()));
-    }
-    // Prepare |track_media_info_map_| for use in
-    // |ProducePartialResultsOnNetworkThread| and
-    // |ProducePartialResultsOnSignalingThread|.
-    track_media_info_map_.reset(PrepareTrackMediaInfoMap_s().release());
-    // Prepare |track_to_id_| for use in |ProducePartialResultsOnNetworkThread|.
-    // This avoids a possible deadlock if |MediaStreamTrackInterface::id| is
-    // implemented to invoke on the signaling thread.
-    track_to_id_ = PrepareTrackToID_s();
-
-    // Prepare |call_stats_| here since GetCallStats() will hop to the worker
-    // thread.
-    // TODO(holmer): To avoid the hop we could move BWE and BWE stats to the
-    // network thread, where it more naturally belongs.
-    call_stats_ = pc_->session()->GetCallStats();
-
-    invoker_.AsyncInvoke<void>(
-        RTC_FROM_HERE, network_thread_,
-        rtc::Bind(&RTCStatsCollector::ProducePartialResultsOnNetworkThread,
-                  rtc::scoped_refptr<RTCStatsCollector>(this), timestamp_us));
-    ProducePartialResultsOnSignalingThread(timestamp_us);
-  }
-}
-
-void RTCStatsCollector::ClearCachedStatsReport() {
-  RTC_DCHECK(signaling_thread_->IsCurrent());
-  cached_report_ = nullptr;
-}
-
-void RTCStatsCollector::WaitForPendingRequest() {
-  RTC_DCHECK(signaling_thread_->IsCurrent());
-  if (num_pending_partial_reports_) {
-    rtc::Thread::Current()->ProcessMessages(0);
-    while (num_pending_partial_reports_) {
-      rtc::Thread::Current()->SleepMs(1);
-      rtc::Thread::Current()->ProcessMessages(0);
-    }
-  }
-}
-
-void RTCStatsCollector::ProducePartialResultsOnSignalingThread(
-    int64_t timestamp_us) {
-  RTC_DCHECK(signaling_thread_->IsCurrent());
-  rtc::scoped_refptr<RTCStatsReport> report = RTCStatsReport::Create(
-      timestamp_us);
-
-  ProduceDataChannelStats_s(timestamp_us, report.get());
-  ProduceMediaStreamAndTrackStats_s(timestamp_us, report.get());
-  ProducePeerConnectionStats_s(timestamp_us, report.get());
-
-  AddPartialResults(report);
-}
-
-void RTCStatsCollector::ProducePartialResultsOnNetworkThread(
-    int64_t timestamp_us) {
-  RTC_DCHECK(network_thread_->IsCurrent());
-  rtc::scoped_refptr<RTCStatsReport> report = RTCStatsReport::Create(
-      timestamp_us);
-
-  std::unique_ptr<SessionStats> session_stats =
-      pc_->session()->GetStats(*channel_name_pairs_);
-  if (session_stats) {
-    std::map<std::string, CertificateStatsPair> transport_cert_stats =
-        PrepareTransportCertificateStats_n(*session_stats);
-
-    ProduceCertificateStats_n(
-        timestamp_us, transport_cert_stats, report.get());
-    ProduceCodecStats_n(
-        timestamp_us, *track_media_info_map_, report.get());
-    ProduceIceCandidateAndPairStats_n(timestamp_us, *session_stats,
-                                      track_media_info_map_->video_media_info(),
-                                      call_stats_, report.get());
-    ProduceRTPStreamStats_n(
-        timestamp_us, *session_stats, *track_media_info_map_, report.get());
-    ProduceTransportStats_n(
-        timestamp_us, *session_stats, transport_cert_stats, report.get());
-  }
-
-  AddPartialResults(report);
-}
-
-void RTCStatsCollector::AddPartialResults(
-    const rtc::scoped_refptr<RTCStatsReport>& partial_report) {
-  if (!signaling_thread_->IsCurrent()) {
-    invoker_.AsyncInvoke<void>(RTC_FROM_HERE, signaling_thread_,
-        rtc::Bind(&RTCStatsCollector::AddPartialResults_s,
-                  rtc::scoped_refptr<RTCStatsCollector>(this),
-                  partial_report));
-    return;
-  }
-  AddPartialResults_s(partial_report);
-}
-
-void RTCStatsCollector::AddPartialResults_s(
-    rtc::scoped_refptr<RTCStatsReport> partial_report) {
-  RTC_DCHECK(signaling_thread_->IsCurrent());
-  RTC_DCHECK_GT(num_pending_partial_reports_, 0);
-  if (!partial_report_)
-    partial_report_ = partial_report;
-  else
-    partial_report_->TakeMembersFrom(partial_report);
-  --num_pending_partial_reports_;
-  if (!num_pending_partial_reports_) {
-    cache_timestamp_us_ = partial_report_timestamp_us_;
-    cached_report_ = partial_report_;
-    partial_report_ = nullptr;
-    channel_name_pairs_.reset();
-    track_media_info_map_.reset();
-    track_to_id_.clear();
-    // Trace WebRTC Stats when getStats is called on Javascript.
-    // This allows access to WebRTC stats from trace logs. To enable them,
-    // select the "webrtc_stats" category when recording traces.
-    TRACE_EVENT_INSTANT1("webrtc_stats", "webrtc_stats", "report",
-                         cached_report_->ToJson());
-    DeliverCachedReport();
-  }
-}
-
-void RTCStatsCollector::DeliverCachedReport() {
-  RTC_DCHECK(signaling_thread_->IsCurrent());
-  RTC_DCHECK(!callbacks_.empty());
-  RTC_DCHECK(cached_report_);
-  for (const rtc::scoped_refptr<RTCStatsCollectorCallback>& callback :
-       callbacks_) {
-    callback->OnStatsDelivered(cached_report_);
-  }
-  callbacks_.clear();
-}
-
-void RTCStatsCollector::ProduceCertificateStats_n(
-    int64_t timestamp_us,
-    const std::map<std::string, CertificateStatsPair>& transport_cert_stats,
-    RTCStatsReport* report) const {
-  RTC_DCHECK(network_thread_->IsCurrent());
-  for (const auto& transport_cert_stats_pair : transport_cert_stats) {
-    if (transport_cert_stats_pair.second.local) {
-      ProduceCertificateStatsFromSSLCertificateStats(
-          timestamp_us, *transport_cert_stats_pair.second.local.get(), report);
-    }
-    if (transport_cert_stats_pair.second.remote) {
-      ProduceCertificateStatsFromSSLCertificateStats(
-          timestamp_us, *transport_cert_stats_pair.second.remote.get(), report);
-    }
-  }
-}
-
-void RTCStatsCollector::ProduceCodecStats_n(
-    int64_t timestamp_us, const TrackMediaInfoMap& track_media_info_map,
-    RTCStatsReport* report) const {
-  RTC_DCHECK(network_thread_->IsCurrent());
-  // Audio
-  if (track_media_info_map.voice_media_info()) {
-    // Inbound
-    for (const auto& pair :
-         track_media_info_map.voice_media_info()->receive_codecs) {
-      report->AddStats(CodecStatsFromRtpCodecParameters(
-          timestamp_us, true, true, pair.second));
-    }
-    // Outbound
-    for (const auto& pair :
-         track_media_info_map.voice_media_info()->send_codecs) {
-      report->AddStats(CodecStatsFromRtpCodecParameters(
-          timestamp_us, false, true, pair.second));
-    }
-  }
-  // Video
-  if (track_media_info_map.video_media_info()) {
-    // Inbound
-    for (const auto& pair :
-         track_media_info_map.video_media_info()->receive_codecs) {
-      report->AddStats(CodecStatsFromRtpCodecParameters(
-          timestamp_us, true, false, pair.second));
-    }
-    // Outbound
-    for (const auto& pair :
-         track_media_info_map.video_media_info()->send_codecs) {
-      report->AddStats(CodecStatsFromRtpCodecParameters(
-          timestamp_us, false, false, pair.second));
-    }
-  }
-}
-
-void RTCStatsCollector::ProduceDataChannelStats_s(
-    int64_t timestamp_us, RTCStatsReport* report) const {
-  RTC_DCHECK(signaling_thread_->IsCurrent());
-  for (const rtc::scoped_refptr<DataChannel>& data_channel :
-       pc_->sctp_data_channels()) {
-    std::unique_ptr<RTCDataChannelStats> data_channel_stats(
-        new RTCDataChannelStats(
-            "RTCDataChannel_" + rtc::ToString<>(data_channel->id()),
-            timestamp_us));
-    data_channel_stats->label = data_channel->label();
-    data_channel_stats->protocol = data_channel->protocol();
-    data_channel_stats->datachannelid = data_channel->id();
-    data_channel_stats->state =
-        DataStateToRTCDataChannelState(data_channel->state());
-    data_channel_stats->messages_sent = data_channel->messages_sent();
-    data_channel_stats->bytes_sent = data_channel->bytes_sent();
-    data_channel_stats->messages_received = data_channel->messages_received();
-    data_channel_stats->bytes_received = data_channel->bytes_received();
-    report->AddStats(std::move(data_channel_stats));
-  }
-}
-
-void RTCStatsCollector::ProduceIceCandidateAndPairStats_n(
-    int64_t timestamp_us,
-    const SessionStats& session_stats,
-    const cricket::VideoMediaInfo* video_media_info,
-    const Call::Stats& call_stats,
-    RTCStatsReport* report) const {
-  RTC_DCHECK(network_thread_->IsCurrent());
-  for (const auto& transport_stats : session_stats.transport_stats) {
-    for (const auto& channel_stats : transport_stats.second.channel_stats) {
-      std::string transport_id = RTCTransportStatsIDFromTransportChannel(
-          transport_stats.second.transport_name, channel_stats.component);
-      for (const cricket::ConnectionInfo& info :
-           channel_stats.connection_infos) {
-        std::unique_ptr<RTCIceCandidatePairStats> candidate_pair_stats(
-            new RTCIceCandidatePairStats(
-                RTCIceCandidatePairStatsIDFromConnectionInfo(info),
-                timestamp_us));
-
-        candidate_pair_stats->transport_id = transport_id;
-        // TODO(hbos): There could be other candidates that are not paired with
-        // anything. We don't have a complete list. Local candidates come from
-        // Port objects, and prflx candidates (both local and remote) are only
-        // stored in candidate pairs. crbug.com/632723
-        candidate_pair_stats->local_candidate_id = ProduceIceCandidateStats(
-            timestamp_us, info.local_candidate, true, transport_id, report);
-        candidate_pair_stats->remote_candidate_id = ProduceIceCandidateStats(
-            timestamp_us, info.remote_candidate, false, transport_id, report);
-        candidate_pair_stats->state =
-            IceCandidatePairStateToRTCStatsIceCandidatePairState(info.state);
-        candidate_pair_stats->priority = info.priority;
-        candidate_pair_stats->nominated = info.nominated;
-        // TODO(hbos): This writable is different than the spec. It goes to
-        // false after a certain amount of time without a response passes.
-        // crbug.com/633550
-        candidate_pair_stats->writable = info.writable;
-        candidate_pair_stats->bytes_sent =
-            static_cast<uint64_t>(info.sent_total_bytes);
-        candidate_pair_stats->bytes_received =
-            static_cast<uint64_t>(info.recv_total_bytes);
-        candidate_pair_stats->total_round_trip_time =
-            static_cast<double>(info.total_round_trip_time_ms) /
-            rtc::kNumMillisecsPerSec;
-        if (info.current_round_trip_time_ms) {
-          candidate_pair_stats->current_round_trip_time =
-              static_cast<double>(*info.current_round_trip_time_ms) /
-              rtc::kNumMillisecsPerSec;
-        }
-        if (info.best_connection) {
-          // The bandwidth estimations we have are for the selected candidate
-          // pair ("info.best_connection").
-          RTC_DCHECK_GE(call_stats.send_bandwidth_bps, 0);
-          RTC_DCHECK_GE(call_stats.recv_bandwidth_bps, 0);
-          if (call_stats.send_bandwidth_bps > 0) {
-            candidate_pair_stats->available_outgoing_bitrate =
-                static_cast<double>(call_stats.send_bandwidth_bps);
-          }
-          if (call_stats.recv_bandwidth_bps > 0) {
-            candidate_pair_stats->available_incoming_bitrate =
-                static_cast<double>(call_stats.recv_bandwidth_bps);
-          }
-        }
-        candidate_pair_stats->requests_received =
-            static_cast<uint64_t>(info.recv_ping_requests);
-        candidate_pair_stats->requests_sent = static_cast<uint64_t>(
-            info.sent_ping_requests_before_first_response);
-        candidate_pair_stats->responses_received =
-            static_cast<uint64_t>(info.recv_ping_responses);
-        candidate_pair_stats->responses_sent =
-            static_cast<uint64_t>(info.sent_ping_responses);
-        RTC_DCHECK_GE(info.sent_ping_requests_total,
-                      info.sent_ping_requests_before_first_response);
-        candidate_pair_stats->consent_requests_sent = static_cast<uint64_t>(
-            info.sent_ping_requests_total -
-            info.sent_ping_requests_before_first_response);
-
-        report->AddStats(std::move(candidate_pair_stats));
-      }
-    }
-  }
-}
-
-void RTCStatsCollector::ProduceMediaStreamAndTrackStats_s(
-    int64_t timestamp_us, RTCStatsReport* report) const {
-  RTC_DCHECK(signaling_thread_->IsCurrent());
-  RTC_DCHECK(track_media_info_map_);
-  ProduceMediaStreamAndTrackStats(timestamp_us,
-                                  *track_media_info_map_,
-                                  pc_->local_streams(),
-                                  true,
-                                  report);
-  ProduceMediaStreamAndTrackStats(timestamp_us,
-                                  *track_media_info_map_,
-                                  pc_->remote_streams(),
-                                  false,
-                                  report);
-}
-
-void RTCStatsCollector::ProducePeerConnectionStats_s(
-    int64_t timestamp_us, RTCStatsReport* report) const {
-  RTC_DCHECK(signaling_thread_->IsCurrent());
-  std::unique_ptr<RTCPeerConnectionStats> stats(
-    new RTCPeerConnectionStats("RTCPeerConnection", timestamp_us));
-  stats->data_channels_opened = internal_record_.data_channels_opened;
-  stats->data_channels_closed = internal_record_.data_channels_closed;
-  report->AddStats(std::move(stats));
-}
-
-void RTCStatsCollector::ProduceRTPStreamStats_n(
-    int64_t timestamp_us, const SessionStats& session_stats,
-    const TrackMediaInfoMap& track_media_info_map,
-    RTCStatsReport* report) const {
-  RTC_DCHECK(network_thread_->IsCurrent());
-
-  // Audio
-  if (track_media_info_map.voice_media_info()) {
-    std::string transport_id = RTCTransportStatsIDFromBaseChannel(
-        session_stats.proxy_to_transport, *pc_->session()->voice_channel());
-    RTC_DCHECK(!transport_id.empty());
-    // Inbound
-    for (const cricket::VoiceReceiverInfo& voice_receiver_info :
-         track_media_info_map.voice_media_info()->receivers) {
-      // TODO(nisse): SSRC == 0 currently means none. Delete check when that
-      // is fixed.
-      if (voice_receiver_info.ssrc() == 0)
-        continue;
-      std::unique_ptr<RTCInboundRTPStreamStats> inbound_audio(
-          new RTCInboundRTPStreamStats(
-              RTCInboundRTPStreamStatsIDFromSSRC(
-                  true, voice_receiver_info.ssrc()),
-              timestamp_us));
-      SetInboundRTPStreamStatsFromVoiceReceiverInfo(
-          voice_receiver_info, inbound_audio.get());
-      rtc::scoped_refptr<AudioTrackInterface> audio_track =
-          track_media_info_map_->GetAudioTrack(voice_receiver_info);
-      if (audio_track) {
-        RTC_DCHECK(track_to_id_.find(audio_track.get()) != track_to_id_.end());
-        inbound_audio->track_id =
-            RTCMediaStreamTrackStatsIDFromTrackKindIDAndSsrc(
-                false,
-                MediaStreamTrackInterface::kAudioKind,
-                track_to_id_.find(audio_track.get())->second,
-                voice_receiver_info.ssrc());
-      }
-      inbound_audio->transport_id = transport_id;
-      report->AddStats(std::move(inbound_audio));
-    }
-    // Outbound
-    for (const cricket::VoiceSenderInfo& voice_sender_info :
-         track_media_info_map.voice_media_info()->senders) {
-      // TODO(nisse): SSRC == 0 currently means none. Delete check when that
-      // is fixed.
-      if (voice_sender_info.ssrc() == 0)
-        continue;
-      std::unique_ptr<RTCOutboundRTPStreamStats> outbound_audio(
-          new RTCOutboundRTPStreamStats(
-              RTCOutboundRTPStreamStatsIDFromSSRC(
-                  true, voice_sender_info.ssrc()),
-              timestamp_us));
-      SetOutboundRTPStreamStatsFromVoiceSenderInfo(
-          voice_sender_info, outbound_audio.get());
-      rtc::scoped_refptr<AudioTrackInterface> audio_track =
-          track_media_info_map_->GetAudioTrack(voice_sender_info);
-      if (audio_track) {
-        RTC_DCHECK(track_to_id_.find(audio_track.get()) != track_to_id_.end());
-        outbound_audio->track_id =
-            RTCMediaStreamTrackStatsIDFromTrackKindIDAndSsrc(
-                true,
-                MediaStreamTrackInterface::kAudioKind,
-                track_to_id_.find(audio_track.get())->second,
-                voice_sender_info.ssrc());
-      }
-      outbound_audio->transport_id = transport_id;
-      report->AddStats(std::move(outbound_audio));
-    }
-  }
-  // Video
-  if (track_media_info_map.video_media_info()) {
-    std::string transport_id = RTCTransportStatsIDFromBaseChannel(
-        session_stats.proxy_to_transport, *pc_->session()->video_channel());
-    RTC_DCHECK(!transport_id.empty());
-    // Inbound
-    for (const cricket::VideoReceiverInfo& video_receiver_info :
-         track_media_info_map.video_media_info()->receivers) {
-      // TODO(nisse): SSRC == 0 currently means none. Delete check when that
-      // is fixed.
-      if (video_receiver_info.ssrc() == 0)
-        continue;
-      std::unique_ptr<RTCInboundRTPStreamStats> inbound_video(
-          new RTCInboundRTPStreamStats(
-              RTCInboundRTPStreamStatsIDFromSSRC(
-                  false, video_receiver_info.ssrc()),
-              timestamp_us));
-      SetInboundRTPStreamStatsFromVideoReceiverInfo(
-          video_receiver_info, inbound_video.get());
-      rtc::scoped_refptr<VideoTrackInterface> video_track =
-          track_media_info_map_->GetVideoTrack(video_receiver_info);
-      if (video_track) {
-        RTC_DCHECK(track_to_id_.find(video_track.get()) != track_to_id_.end());
-        inbound_video->track_id =
-            RTCMediaStreamTrackStatsIDFromTrackKindIDAndSsrc(
-                false,
-                MediaStreamTrackInterface::kVideoKind,
-                track_to_id_.find(video_track.get())->second,
-                video_receiver_info.ssrc());
-      }
-      inbound_video->transport_id = transport_id;
-      report->AddStats(std::move(inbound_video));
-    }
-    // Outbound
-    for (const cricket::VideoSenderInfo& video_sender_info :
-         track_media_info_map.video_media_info()->senders) {
-      // TODO(nisse): SSRC == 0 currently means none. Delete check when that
-      // is fixed.
-      if (video_sender_info.ssrc() == 0)
-        continue;
-      std::unique_ptr<RTCOutboundRTPStreamStats> outbound_video(
-          new RTCOutboundRTPStreamStats(
-              RTCOutboundRTPStreamStatsIDFromSSRC(
-                  false, video_sender_info.ssrc()),
-              timestamp_us));
-      SetOutboundRTPStreamStatsFromVideoSenderInfo(
-          video_sender_info, outbound_video.get());
-      rtc::scoped_refptr<VideoTrackInterface> video_track =
-          track_media_info_map_->GetVideoTrack(video_sender_info);
-      if (video_track) {
-        RTC_DCHECK(track_to_id_.find(video_track.get()) != track_to_id_.end());
-        outbound_video->track_id =
-            RTCMediaStreamTrackStatsIDFromTrackKindIDAndSsrc(
-                true,
-                MediaStreamTrackInterface::kVideoKind,
-                track_to_id_.find(video_track.get())->second,
-                video_sender_info.ssrc());
-      }
-      outbound_video->transport_id = transport_id;
-      report->AddStats(std::move(outbound_video));
-    }
-  }
-}
-
-void RTCStatsCollector::ProduceTransportStats_n(
-    int64_t timestamp_us, const SessionStats& session_stats,
-    const std::map<std::string, CertificateStatsPair>& transport_cert_stats,
-    RTCStatsReport* report) const {
-  RTC_DCHECK(network_thread_->IsCurrent());
-  for (const auto& transport : session_stats.transport_stats) {
-    // Get reference to RTCP channel, if it exists.
-    std::string rtcp_transport_stats_id;
-    for (const auto& channel_stats : transport.second.channel_stats) {
-      if (channel_stats.component ==
-          cricket::ICE_CANDIDATE_COMPONENT_RTCP) {
-        rtcp_transport_stats_id = RTCTransportStatsIDFromTransportChannel(
-            transport.second.transport_name, channel_stats.component);
-        break;
-      }
-    }
-
-    // Get reference to local and remote certificates of this transport, if they
-    // exist.
-    const auto& certificate_stats_it = transport_cert_stats.find(
-        transport.second.transport_name);
-    RTC_DCHECK(certificate_stats_it != transport_cert_stats.cend());
-    std::string local_certificate_id;
-    if (certificate_stats_it->second.local) {
-      local_certificate_id = RTCCertificateIDFromFingerprint(
-          certificate_stats_it->second.local->fingerprint);
-    }
-    std::string remote_certificate_id;
-    if (certificate_stats_it->second.remote) {
-      remote_certificate_id = RTCCertificateIDFromFingerprint(
-          certificate_stats_it->second.remote->fingerprint);
-    }
-
-    // There is one transport stats for each channel.
-    for (const auto& channel_stats : transport.second.channel_stats) {
-      std::unique_ptr<RTCTransportStats> transport_stats(
-          new RTCTransportStats(
-              RTCTransportStatsIDFromTransportChannel(
-                  transport.second.transport_name, channel_stats.component),
-              timestamp_us));
-      transport_stats->bytes_sent = 0;
-      transport_stats->bytes_received = 0;
-      transport_stats->dtls_state = DtlsTransportStateToRTCDtlsTransportState(
-          channel_stats.dtls_state);
-      for (const cricket::ConnectionInfo& info :
-           channel_stats.connection_infos) {
-        *transport_stats->bytes_sent += info.sent_total_bytes;
-        *transport_stats->bytes_received += info.recv_total_bytes;
-        if (info.best_connection) {
-          transport_stats->selected_candidate_pair_id =
-              RTCIceCandidatePairStatsIDFromConnectionInfo(info);
-        }
-      }
-      if (channel_stats.component != cricket::ICE_CANDIDATE_COMPONENT_RTCP &&
-          !rtcp_transport_stats_id.empty()) {
-        transport_stats->rtcp_transport_stats_id = rtcp_transport_stats_id;
-      }
-      if (!local_certificate_id.empty())
-        transport_stats->local_certificate_id = local_certificate_id;
-      if (!remote_certificate_id.empty())
-        transport_stats->remote_certificate_id = remote_certificate_id;
-      report->AddStats(std::move(transport_stats));
-    }
-  }
-}
-
-std::map<std::string, RTCStatsCollector::CertificateStatsPair>
-RTCStatsCollector::PrepareTransportCertificateStats_n(
-    const SessionStats& session_stats) const {
-  RTC_DCHECK(network_thread_->IsCurrent());
-  std::map<std::string, CertificateStatsPair> transport_cert_stats;
-  for (const auto& transport_stats : session_stats.transport_stats) {
-    CertificateStatsPair certificate_stats_pair;
-    rtc::scoped_refptr<rtc::RTCCertificate> local_certificate;
-    if (pc_->session()->GetLocalCertificate(
-        transport_stats.second.transport_name, &local_certificate)) {
-      certificate_stats_pair.local =
-          local_certificate->ssl_certificate().GetStats();
-    }
-    std::unique_ptr<rtc::SSLCertificate> remote_certificate =
-        pc_->session()->GetRemoteSSLCertificate(
-            transport_stats.second.transport_name);
-    if (remote_certificate) {
-      certificate_stats_pair.remote = remote_certificate->GetStats();
-    }
-    transport_cert_stats.insert(
-        std::make_pair(transport_stats.second.transport_name,
-                       std::move(certificate_stats_pair)));
-  }
-  return transport_cert_stats;
-}
-
-std::unique_ptr<TrackMediaInfoMap>
-RTCStatsCollector::PrepareTrackMediaInfoMap_s() const {
-  RTC_DCHECK(signaling_thread_->IsCurrent());
-  std::unique_ptr<cricket::VoiceMediaInfo> voice_media_info;
-  if (pc_->session()->voice_channel()) {
-    voice_media_info.reset(new cricket::VoiceMediaInfo());
-    if (!pc_->session()->voice_channel()->GetStats(voice_media_info.get())) {
-      voice_media_info.reset();
-    }
-  }
-  std::unique_ptr<cricket::VideoMediaInfo> video_media_info;
-  if (pc_->session()->video_channel()) {
-    video_media_info.reset(new cricket::VideoMediaInfo());
-    if (!pc_->session()->video_channel()->GetStats(video_media_info.get())) {
-      video_media_info.reset();
-    }
-  }
-  std::unique_ptr<TrackMediaInfoMap> track_media_info_map(
-      new TrackMediaInfoMap(std::move(voice_media_info),
-                            std::move(video_media_info),
-                            pc_->GetSenders(),
-                            pc_->GetReceivers()));
-  return track_media_info_map;
-}
-
-std::map<MediaStreamTrackInterface*, std::string>
-RTCStatsCollector::PrepareTrackToID_s() const {
-  RTC_DCHECK(signaling_thread_->IsCurrent());
-  std::map<MediaStreamTrackInterface*, std::string> track_to_id;
-  for (auto sender : pc_->GetSenders()) {
-    auto track = sender->track();
-    if (track)
-      track_to_id[track.get()] = track->id();
-  }
-  for (auto receiver : pc_->GetReceivers()) {
-    auto track = receiver->track();
-    if (track)
-      track_to_id[track.get()] = track->id();
-  }
-  return track_to_id;
-}
-
-void RTCStatsCollector::OnDataChannelCreated(DataChannel* channel) {
-  channel->SignalOpened.connect(this, &RTCStatsCollector::OnDataChannelOpened);
-  channel->SignalClosed.connect(this, &RTCStatsCollector::OnDataChannelClosed);
-}
-
-void RTCStatsCollector::OnDataChannelOpened(DataChannel* channel) {
-  RTC_DCHECK(signaling_thread_->IsCurrent());
-  bool result = internal_record_.opened_data_channels.insert(
-      reinterpret_cast<uintptr_t>(channel)).second;
-  ++internal_record_.data_channels_opened;
-  RTC_DCHECK(result);
-}
-
-void RTCStatsCollector::OnDataChannelClosed(DataChannel* channel) {
-  RTC_DCHECK(signaling_thread_->IsCurrent());
-  // Only channels that have been fully opened (and have increased the
-  // |data_channels_opened_| counter) increase the closed counter.
-  if (internal_record_.opened_data_channels.erase(
-          reinterpret_cast<uintptr_t>(channel))) {
-    ++internal_record_.data_channels_closed;
-  }
-}
-
-const char* CandidateTypeToRTCIceCandidateTypeForTesting(
-    const std::string& type) {
-  return CandidateTypeToRTCIceCandidateType(type);
-}
-
-const char* DataStateToRTCDataChannelStateForTesting(
-    DataChannelInterface::DataState state) {
-  return DataStateToRTCDataChannelState(state);
-}
-
-}  // namespace webrtc
diff --git a/pc/rtcstatscollector.h b/pc/rtcstatscollector.h
deleted file mode 100644
index 5ba4bfd..0000000
--- a/pc/rtcstatscollector.h
+++ /dev/null
@@ -1,197 +0,0 @@
-/*
- *  Copyright 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_PC_RTCSTATSCOLLECTOR_H_
-#define WEBRTC_PC_RTCSTATSCOLLECTOR_H_
-
-#include <map>
-#include <memory>
-#include <set>
-#include <vector>
-
-#include "webrtc/api/optional.h"
-#include "webrtc/api/stats/rtcstats_objects.h"
-#include "webrtc/api/stats/rtcstatscollectorcallback.h"
-#include "webrtc/api/stats/rtcstatsreport.h"
-#include "webrtc/call/call.h"
-#include "webrtc/media/base/mediachannel.h"
-#include "webrtc/pc/datachannel.h"
-#include "webrtc/pc/trackmediainfomap.h"
-#include "webrtc/rtc_base/asyncinvoker.h"
-#include "webrtc/rtc_base/refcount.h"
-#include "webrtc/rtc_base/scoped_ref_ptr.h"
-#include "webrtc/rtc_base/sigslot.h"
-#include "webrtc/rtc_base/sslidentity.h"
-#include "webrtc/rtc_base/timeutils.h"
-
-namespace cricket {
-class Candidate;
-}  // namespace cricket
-
-namespace rtc {
-class SSLCertificate;
-}  // namespace rtc
-
-namespace webrtc {
-
-class PeerConnection;
-struct SessionStats;
-struct ChannelNamePairs;
-
-// All public methods of the collector are to be called on the signaling thread.
-// Stats are gathered on the signaling, worker and network threads
-// asynchronously. The callback is invoked on the signaling thread. Resulting
-// reports are cached for |cache_lifetime_| ms.
-class RTCStatsCollector : public virtual rtc::RefCountInterface,
-                          public sigslot::has_slots<> {
- public:
-  static rtc::scoped_refptr<RTCStatsCollector> Create(
-      PeerConnection* pc,
-      int64_t cache_lifetime_us = 50 * rtc::kNumMicrosecsPerMillisec);
-
-  // Gets a recent stats report. If there is a report cached that is still fresh
-  // it is returned, otherwise new stats are gathered and returned. A report is
-  // considered fresh for |cache_lifetime_| ms. const RTCStatsReports are safe
-  // to use across multiple threads and may be destructed on any thread.
-  void GetStatsReport(rtc::scoped_refptr<RTCStatsCollectorCallback> callback);
-  // Clears the cache's reference to the most recent stats report. Subsequently
-  // calling |GetStatsReport| guarantees fresh stats.
-  void ClearCachedStatsReport();
-
-  // If there is a |GetStatsReport| requests in-flight, waits until it has been
-  // completed. Must be called on the signaling thread.
-  void WaitForPendingRequest();
-
- protected:
-  RTCStatsCollector(PeerConnection* pc, int64_t cache_lifetime_us);
-  ~RTCStatsCollector();
-
-  // Stats gathering on a particular thread. Calls |AddPartialResults| before
-  // returning. Virtual for the sake of testing.
-  virtual void ProducePartialResultsOnSignalingThread(int64_t timestamp_us);
-  virtual void ProducePartialResultsOnNetworkThread(int64_t timestamp_us);
-
-  // Can be called on any thread.
-  void AddPartialResults(
-      const rtc::scoped_refptr<RTCStatsReport>& partial_report);
-
- private:
-  struct CertificateStatsPair {
-    std::unique_ptr<rtc::SSLCertificateStats> local;
-    std::unique_ptr<rtc::SSLCertificateStats> remote;
-  };
-
-  void AddPartialResults_s(rtc::scoped_refptr<RTCStatsReport> partial_report);
-  void DeliverCachedReport();
-
-  // Produces |RTCCertificateStats|.
-  void ProduceCertificateStats_n(
-      int64_t timestamp_us,
-      const std::map<std::string, CertificateStatsPair>& transport_cert_stats,
-      RTCStatsReport* report) const;
-  // Produces |RTCCodecStats|.
-  void ProduceCodecStats_n(
-      int64_t timestamp_us, const TrackMediaInfoMap& track_media_info_map,
-      RTCStatsReport* report) const;
-  // Produces |RTCDataChannelStats|.
-  void ProduceDataChannelStats_s(
-      int64_t timestamp_us, RTCStatsReport* report) const;
-  // Produces |RTCIceCandidatePairStats| and |RTCIceCandidateStats|.
-  void ProduceIceCandidateAndPairStats_n(
-      int64_t timestamp_us,
-      const SessionStats& session_stats,
-      const cricket::VideoMediaInfo* video_media_info,
-      const Call::Stats& call_stats,
-      RTCStatsReport* report) const;
-  // Produces |RTCMediaStreamStats| and |RTCMediaStreamTrackStats|.
-  void ProduceMediaStreamAndTrackStats_s(
-      int64_t timestamp_us, RTCStatsReport* report) const;
-  // Produces |RTCPeerConnectionStats|.
-  void ProducePeerConnectionStats_s(
-      int64_t timestamp_us, RTCStatsReport* report) const;
-  // Produces |RTCInboundRTPStreamStats| and |RTCOutboundRTPStreamStats|.
-  void ProduceRTPStreamStats_n(
-      int64_t timestamp_us, const SessionStats& session_stats,
-      const TrackMediaInfoMap& track_media_info_map,
-      RTCStatsReport* report) const;
-  // Produces |RTCTransportStats|.
-  void ProduceTransportStats_n(
-      int64_t timestamp_us, const SessionStats& session_stats,
-      const std::map<std::string, CertificateStatsPair>& transport_cert_stats,
-      RTCStatsReport* report) const;
-
-  // Helper function to stats-producing functions.
-  std::map<std::string, CertificateStatsPair>
-  PrepareTransportCertificateStats_n(const SessionStats& session_stats) const;
-  std::unique_ptr<TrackMediaInfoMap> PrepareTrackMediaInfoMap_s() const;
-  std::map<MediaStreamTrackInterface*, std::string> PrepareTrackToID_s() const;
-
-  // Slots for signals (sigslot) that are wired up to |pc_|.
-  void OnDataChannelCreated(DataChannel* channel);
-  // Slots for signals (sigslot) that are wired up to |channel|.
-  void OnDataChannelOpened(DataChannel* channel);
-  void OnDataChannelClosed(DataChannel* channel);
-
-  PeerConnection* const pc_;
-  rtc::Thread* const signaling_thread_;
-  rtc::Thread* const worker_thread_;
-  rtc::Thread* const network_thread_;
-  rtc::AsyncInvoker invoker_;
-
-  int num_pending_partial_reports_;
-  int64_t partial_report_timestamp_us_;
-  rtc::scoped_refptr<RTCStatsReport> partial_report_;
-  std::vector<rtc::scoped_refptr<RTCStatsCollectorCallback>> callbacks_;
-
-  // Set in |GetStatsReport|, read in |ProducePartialResultsOnNetworkThread| and
-  // |ProducePartialResultsOnSignalingThread|, reset after work is complete. Not
-  // passed as arguments to avoid copies. This is thread safe - when we
-  // set/reset we know there are no pending stats requests in progress.
-  std::unique_ptr<ChannelNamePairs> channel_name_pairs_;
-  std::unique_ptr<TrackMediaInfoMap> track_media_info_map_;
-  std::map<MediaStreamTrackInterface*, std::string> track_to_id_;
-  Call::Stats call_stats_;
-
-  // A timestamp, in microseconds, that is based on a timer that is
-  // monotonically increasing. That is, even if the system clock is modified the
-  // difference between the timer and this timestamp is how fresh the cached
-  // report is.
-  int64_t cache_timestamp_us_;
-  int64_t cache_lifetime_us_;
-  rtc::scoped_refptr<const RTCStatsReport> cached_report_;
-
-  // Data recorded and maintained by the stats collector during its lifetime.
-  // Some stats are produced from this record instead of other components.
-  struct InternalRecord {
-    InternalRecord() : data_channels_opened(0),
-                       data_channels_closed(0) {}
-
-    // The opened count goes up when a channel is fully opened and the closed
-    // count goes up if a previously opened channel has fully closed. The opened
-    // count does not go down when a channel closes, meaning (opened - closed)
-    // is the number of channels currently opened. A channel that is closed
-    // before reaching the open state does not affect these counters.
-    uint32_t data_channels_opened;
-    uint32_t data_channels_closed;
-    // Identifies by address channels that have been opened, which remain in the
-    // set until they have been fully closed.
-    std::set<uintptr_t> opened_data_channels;
-  };
-  InternalRecord internal_record_;
-};
-
-const char* CandidateTypeToRTCIceCandidateTypeForTesting(
-    const std::string& type);
-const char* DataStateToRTCDataChannelStateForTesting(
-    DataChannelInterface::DataState state);
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_PC_RTCSTATSCOLLECTOR_H_
diff --git a/pc/rtcstatscollector_unittest.cc b/pc/rtcstatscollector_unittest.cc
deleted file mode 100644
index cc258ed..0000000
--- a/pc/rtcstatscollector_unittest.cc
+++ /dev/null
@@ -1,2343 +0,0 @@
-/*
- *  Copyright 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/pc/rtcstatscollector.h"
-
-#include <initializer_list>
-#include <memory>
-#include <ostream>
-#include <string>
-#include <vector>
-
-#include "webrtc/api/jsepsessiondescription.h"
-#include "webrtc/api/rtpparameters.h"
-#include "webrtc/api/stats/rtcstats_objects.h"
-#include "webrtc/api/stats/rtcstatsreport.h"
-#include "webrtc/api/test/mock_rtpreceiver.h"
-#include "webrtc/api/test/mock_rtpsender.h"
-#include "webrtc/logging/rtc_event_log/rtc_event_log.h"
-#include "webrtc/media/base/fakemediaengine.h"
-#include "webrtc/media/base/test/mock_mediachannel.h"
-#include "webrtc/p2p/base/p2pconstants.h"
-#include "webrtc/p2p/base/port.h"
-#include "webrtc/pc/mediastream.h"
-#include "webrtc/pc/mediastreamtrack.h"
-#include "webrtc/pc/test/mock_datachannel.h"
-#include "webrtc/pc/test/mock_peerconnection.h"
-#include "webrtc/pc/test/mock_webrtcsession.h"
-#include "webrtc/pc/test/rtcstatsobtainer.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/fakeclock.h"
-#include "webrtc/rtc_base/fakesslidentity.h"
-#include "webrtc/rtc_base/gunit.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/socketaddress.h"
-#include "webrtc/rtc_base/thread_checker.h"
-#include "webrtc/rtc_base/timedelta.h"
-#include "webrtc/rtc_base/timeutils.h"
-
-using testing::_;
-using testing::Invoke;
-using testing::Return;
-using testing::ReturnNull;
-using testing::ReturnRef;
-using testing::SetArgPointee;
-
-namespace webrtc {
-
-// These are used by gtest code, such as if |EXPECT_EQ| fails.
-void PrintTo(const RTCCertificateStats& stats, ::std::ostream* os) {
-  *os << stats.ToJson();
-}
-
-void PrintTo(const RTCCodecStats& stats, ::std::ostream* os) {
-  *os << stats.ToJson();
-}
-
-void PrintTo(const RTCDataChannelStats& stats, ::std::ostream* os) {
-  *os << stats.ToJson();
-}
-
-void PrintTo(const RTCIceCandidatePairStats& stats, ::std::ostream* os) {
-  *os << stats.ToJson();
-}
-
-void PrintTo(const RTCLocalIceCandidateStats& stats, ::std::ostream* os) {
-  *os << stats.ToJson();
-}
-
-void PrintTo(const RTCRemoteIceCandidateStats& stats, ::std::ostream* os) {
-  *os << stats.ToJson();
-}
-
-void PrintTo(const RTCPeerConnectionStats& stats, ::std::ostream* os) {
-  *os << stats.ToJson();
-}
-
-void PrintTo(const RTCMediaStreamStats& stats, ::std::ostream* os) {
-  *os << stats.ToJson();
-}
-
-void PrintTo(const RTCMediaStreamTrackStats& stats, ::std::ostream* os) {
-  *os << stats.ToJson();
-}
-
-void PrintTo(const RTCInboundRTPStreamStats& stats, ::std::ostream* os) {
-  *os << stats.ToJson();
-}
-
-void PrintTo(const RTCOutboundRTPStreamStats& stats, ::std::ostream* os) {
-  *os << stats.ToJson();
-}
-
-void PrintTo(const RTCTransportStats& stats, ::std::ostream* os) {
-  *os << stats.ToJson();
-}
-
-namespace {
-
-const int64_t kGetStatsReportTimeoutMs = 1000;
-const bool kDefaultRtcpMuxRequired = true;
-const bool kDefaultSrtpRequired = true;
-
-struct CertificateInfo {
-  rtc::scoped_refptr<rtc::RTCCertificate> certificate;
-  std::vector<std::string> ders;
-  std::vector<std::string> pems;
-  std::vector<std::string> fingerprints;
-};
-
-std::unique_ptr<CertificateInfo> CreateFakeCertificateAndInfoFromDers(
-    const std::vector<std::string>& ders) {
-  RTC_CHECK(!ders.empty());
-  std::unique_ptr<CertificateInfo> info(new CertificateInfo());
-  info->ders = ders;
-  for (const std::string& der : ders) {
-    info->pems.push_back(rtc::SSLIdentity::DerToPem(
-        "CERTIFICATE",
-        reinterpret_cast<const unsigned char*>(der.c_str()),
-        der.length()));
-  }
-  info->certificate =
-      rtc::RTCCertificate::Create(std::unique_ptr<rtc::FakeSSLIdentity>(
-          new rtc::FakeSSLIdentity(rtc::FakeSSLCertificate(info->pems))));
-  // Strip header/footer and newline characters of PEM strings.
-  for (size_t i = 0; i < info->pems.size(); ++i) {
-    rtc::replace_substrs("-----BEGIN CERTIFICATE-----", 27,
-                         "", 0, &info->pems[i]);
-    rtc::replace_substrs("-----END CERTIFICATE-----", 25,
-                         "", 0, &info->pems[i]);
-    rtc::replace_substrs("\n", 1,
-                         "", 0, &info->pems[i]);
-  }
-  // Fingerprint of leaf certificate.
-  std::unique_ptr<rtc::SSLFingerprint> fp(
-      rtc::SSLFingerprint::Create("sha-1",
-                                  &info->certificate->ssl_certificate()));
-  EXPECT_TRUE(fp);
-  info->fingerprints.push_back(fp->GetRfc4572Fingerprint());
-  // Fingerprints of the rest of the chain.
-  std::unique_ptr<rtc::SSLCertChain> chain =
-      info->certificate->ssl_certificate().GetChain();
-  if (chain) {
-    for (size_t i = 0; i < chain->GetSize(); i++) {
-      fp.reset(rtc::SSLFingerprint::Create("sha-1", &chain->Get(i)));
-      EXPECT_TRUE(fp);
-      info->fingerprints.push_back(fp->GetRfc4572Fingerprint());
-    }
-  }
-  EXPECT_EQ(info->ders.size(), info->fingerprints.size());
-  return info;
-}
-
-std::unique_ptr<cricket::Candidate> CreateFakeCandidate(
-    const std::string& hostname,
-    int port,
-    const std::string& protocol,
-    const std::string& candidate_type,
-    uint32_t priority) {
-  std::unique_ptr<cricket::Candidate> candidate(new cricket::Candidate());
-  candidate->set_address(rtc::SocketAddress(hostname, port));
-  candidate->set_protocol(protocol);
-  candidate->set_type(candidate_type);
-  candidate->set_priority(priority);
-  return candidate;
-}
-
-class FakeAudioTrackForStats
-    : public MediaStreamTrack<AudioTrackInterface> {
- public:
-  static rtc::scoped_refptr<FakeAudioTrackForStats> Create(
-      const std::string& id,
-      MediaStreamTrackInterface::TrackState state) {
-    rtc::scoped_refptr<FakeAudioTrackForStats> audio_track_stats(
-        new rtc::RefCountedObject<FakeAudioTrackForStats>(id));
-    audio_track_stats->set_state(state);
-    return audio_track_stats;
-  }
-
-  FakeAudioTrackForStats(const std::string& id)
-      : MediaStreamTrack<AudioTrackInterface>(id) {
-  }
-
-  std::string kind() const override {
-    return MediaStreamTrackInterface::kAudioKind;
-  }
-  webrtc::AudioSourceInterface* GetSource() const override { return nullptr; }
-  void AddSink(webrtc::AudioTrackSinkInterface* sink) override {}
-  void RemoveSink(webrtc::AudioTrackSinkInterface* sink) override {}
-  bool GetSignalLevel(int* level) override { return false; }
-  rtc::scoped_refptr<AudioProcessorInterface> GetAudioProcessor() override {
-    return nullptr;
-  }
-};
-
-class FakeVideoTrackForStats
-    : public MediaStreamTrack<VideoTrackInterface> {
- public:
-  static rtc::scoped_refptr<FakeVideoTrackForStats> Create(
-      const std::string& id,
-      MediaStreamTrackInterface::TrackState state) {
-    rtc::scoped_refptr<FakeVideoTrackForStats> video_track(
-        new rtc::RefCountedObject<FakeVideoTrackForStats>(id));
-    video_track->set_state(state);
-    return video_track;
-  }
-
-  FakeVideoTrackForStats(const std::string& id)
-      : MediaStreamTrack<VideoTrackInterface>(id) {
-  }
-
-  std::string kind() const override {
-    return MediaStreamTrackInterface::kVideoKind;
-  }
-
-  void AddOrUpdateSink(rtc::VideoSinkInterface<VideoFrame>* sink,
-                       const rtc::VideoSinkWants& wants) override{};
-  void RemoveSink(rtc::VideoSinkInterface<VideoFrame>* sink) override{};
-
-  VideoTrackSourceInterface* GetSource() const override { return nullptr; }
-};
-
-rtc::scoped_refptr<MediaStreamTrackInterface> CreateFakeTrack(
-    cricket::MediaType media_type,
-    const std::string& track_id,
-    MediaStreamTrackInterface::TrackState track_state) {
-  if (media_type == cricket::MEDIA_TYPE_AUDIO) {
-    return FakeAudioTrackForStats::Create(track_id, track_state);
-  } else {
-    RTC_DCHECK_EQ(media_type, cricket::MEDIA_TYPE_VIDEO);
-    return FakeVideoTrackForStats::Create(track_id, track_state);
-  }
-}
-
-rtc::scoped_refptr<MockRtpSender> CreateMockSender(
-    rtc::scoped_refptr<MediaStreamTrackInterface> track, uint32_t ssrc) {
-  rtc::scoped_refptr<MockRtpSender> sender(
-      new rtc::RefCountedObject<MockRtpSender>());
-  EXPECT_CALL(*sender, track()).WillRepeatedly(Return(track));
-  EXPECT_CALL(*sender, ssrc()).WillRepeatedly(Return(ssrc));
-  EXPECT_CALL(*sender, media_type()).WillRepeatedly(Return(
-      track->kind() == MediaStreamTrackInterface::kAudioKind
-          ? cricket::MEDIA_TYPE_AUDIO : cricket::MEDIA_TYPE_VIDEO));
-  EXPECT_CALL(*sender, GetParameters()).WillRepeatedly(Invoke(
-    [ssrc]() {
-      RtpParameters params;
-      params.encodings.push_back(RtpEncodingParameters());
-      params.encodings[0].ssrc = rtc::Optional<uint32_t>(ssrc);
-      return params;
-    }));
-  return sender;
-}
-
-rtc::scoped_refptr<MockRtpReceiver> CreateMockReceiver(
-    rtc::scoped_refptr<MediaStreamTrackInterface> track, uint32_t ssrc) {
-  rtc::scoped_refptr<MockRtpReceiver> receiver(
-      new rtc::RefCountedObject<MockRtpReceiver>());
-  EXPECT_CALL(*receiver, track()).WillRepeatedly(Return(track));
-  EXPECT_CALL(*receiver, media_type()).WillRepeatedly(Return(
-      track->kind() == MediaStreamTrackInterface::kAudioKind
-          ? cricket::MEDIA_TYPE_AUDIO : cricket::MEDIA_TYPE_VIDEO));
-  EXPECT_CALL(*receiver, GetParameters()).WillRepeatedly(Invoke(
-    [ssrc]() {
-      RtpParameters params;
-      params.encodings.push_back(RtpEncodingParameters());
-      params.encodings[0].ssrc = rtc::Optional<uint32_t>(ssrc);
-      return params;
-    }));
-  return receiver;
-}
-
-class RTCStatsCollectorTestHelper : public SetSessionDescriptionObserver {
- public:
-  RTCStatsCollectorTestHelper()
-      : worker_thread_(rtc::Thread::Current()),
-        network_thread_(rtc::Thread::Current()),
-        signaling_thread_(rtc::Thread::Current()),
-        media_engine_(new cricket::FakeMediaEngine()),
-        channel_manager_(new cricket::ChannelManager(
-            std::unique_ptr<cricket::MediaEngineInterface>(media_engine_),
-            worker_thread_,
-            network_thread_)),
-        session_(channel_manager_.get(), cricket::MediaConfig()),
-        pc_() {
-    // Default return values for mocks.
-    EXPECT_CALL(pc_, local_streams()).WillRepeatedly(Return(nullptr));
-    EXPECT_CALL(pc_, remote_streams()).WillRepeatedly(Return(nullptr));
-    EXPECT_CALL(pc_, session()).WillRepeatedly(Return(&session_));
-    EXPECT_CALL(pc_, GetSenders()).WillRepeatedly(Return(
-        std::vector<rtc::scoped_refptr<RtpSenderInterface>>()));
-    EXPECT_CALL(pc_, GetReceivers()).WillRepeatedly(Return(
-        std::vector<rtc::scoped_refptr<RtpReceiverInterface>>()));
-    EXPECT_CALL(pc_, sctp_data_channels()).WillRepeatedly(
-        ReturnRef(data_channels_));
-    EXPECT_CALL(session_, video_channel()).WillRepeatedly(ReturnNull());
-    EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull());
-    EXPECT_CALL(session_, GetStats(_)).WillRepeatedly(ReturnNull());
-    EXPECT_CALL(session_, GetLocalCertificate(_, _)).WillRepeatedly(
-        Return(false));
-    EXPECT_CALL(session_, GetRemoteSSLCertificate_ReturnsRawPointer(_))
-        .WillRepeatedly(Return(nullptr));
-  }
-
-  rtc::ScopedFakeClock& fake_clock() { return fake_clock_; }
-  rtc::Thread* worker_thread() { return worker_thread_; }
-  rtc::Thread* network_thread() { return network_thread_; }
-  rtc::Thread* signaling_thread() { return signaling_thread_; }
-  cricket::FakeMediaEngine* media_engine() { return media_engine_; }
-  MockWebRtcSession& session() { return session_; }
-  MockPeerConnection& pc() { return pc_; }
-  std::vector<rtc::scoped_refptr<DataChannel>>& data_channels() {
-    return data_channels_;
-  }
-
-  // SetSessionDescriptionObserver overrides.
-  void OnSuccess() override {}
-  void OnFailure(const std::string& error) override {
-    RTC_NOTREACHED() << error;
-  }
-
-  void SetupLocalTrackAndSender(cricket::MediaType media_type,
-                                const std::string& track_id,
-                                uint32_t ssrc) {
-    rtc::scoped_refptr<StreamCollection> local_streams =
-        StreamCollection::Create();
-    EXPECT_CALL(pc_, local_streams())
-        .WillRepeatedly(Return(local_streams));
-
-    rtc::scoped_refptr<MediaStream> local_stream =
-        MediaStream::Create("LocalStreamLabel");
-    local_streams->AddStream(local_stream);
-
-    rtc::scoped_refptr<MediaStreamTrackInterface> track;
-    if (media_type == cricket::MEDIA_TYPE_AUDIO) {
-      track = CreateFakeTrack(media_type, track_id,
-                              MediaStreamTrackInterface::kLive);
-      local_stream->AddTrack(static_cast<AudioTrackInterface*>(track.get()));
-    } else {
-      track = CreateFakeTrack(media_type, track_id,
-                              MediaStreamTrackInterface::kLive);
-      local_stream->AddTrack(static_cast<VideoTrackInterface*>(track.get()));
-    }
-
-    rtc::scoped_refptr<MockRtpSender> sender = CreateMockSender(track, ssrc);
-    EXPECT_CALL(pc_, GetSenders()).WillRepeatedly(Return(
-        std::vector<rtc::scoped_refptr<RtpSenderInterface>>({
-            rtc::scoped_refptr<RtpSenderInterface>(sender.get()) })));
-  }
-
-  void SetupRemoteTrackAndReceiver(cricket::MediaType media_type,
-                                   const std::string& track_id,
-                                   uint32_t ssrc) {
-    rtc::scoped_refptr<StreamCollection> remote_streams =
-        StreamCollection::Create();
-    EXPECT_CALL(pc_, remote_streams())
-        .WillRepeatedly(Return(remote_streams));
-
-    rtc::scoped_refptr<MediaStream> remote_stream =
-        MediaStream::Create("RemoteStreamLabel");
-    remote_streams->AddStream(remote_stream);
-
-    rtc::scoped_refptr<MediaStreamTrackInterface> track;
-    if (media_type == cricket::MEDIA_TYPE_AUDIO) {
-      track = CreateFakeTrack(media_type, track_id,
-                              MediaStreamTrackInterface::kLive);
-      remote_stream->AddTrack(static_cast<AudioTrackInterface*>(track.get()));
-    } else {
-      track = CreateFakeTrack(media_type, track_id,
-                              MediaStreamTrackInterface::kLive);
-      remote_stream->AddTrack(static_cast<VideoTrackInterface*>(track.get()));
-    }
-
-    rtc::scoped_refptr<MockRtpReceiver> receiver =
-        CreateMockReceiver(track, ssrc);
-    EXPECT_CALL(pc_, GetReceivers()).WillRepeatedly(Return(
-        std::vector<rtc::scoped_refptr<RtpReceiverInterface>>({
-            rtc::scoped_refptr<RtpReceiverInterface>(receiver.get()) })));
-  }
-
-  // Attaches tracks to peer connections by configuring RTP senders and RTP
-  // receivers according to the tracks' pairings with
-  // |[Voice/Video][Sender/Receiver]Info| and their SSRCs. Local tracks can be
-  // associated with multiple |[Voice/Video]SenderInfo|s, remote tracks can only
-  // be associated with one |[Voice/Video]ReceiverInfo|.
-  void CreateMockRtpSendersReceiversAndChannels(
-      std::initializer_list<std::pair<MediaStreamTrackInterface*,
-          cricket::VoiceSenderInfo>> local_audio_track_info_pairs,
-      std::initializer_list<std::pair<MediaStreamTrackInterface*,
-          cricket::VoiceReceiverInfo>> remote_audio_track_info_pairs,
-      std::initializer_list<std::pair<MediaStreamTrackInterface*,
-          cricket::VideoSenderInfo>> local_video_track_info_pairs,
-      std::initializer_list<std::pair<MediaStreamTrackInterface*,
-          cricket::VideoReceiverInfo>> remote_video_track_info_pairs) {
-    voice_media_info_.reset(new cricket::VoiceMediaInfo());
-    video_media_info_.reset(new cricket::VideoMediaInfo());
-    rtp_senders_.clear();
-    rtp_receivers_.clear();
-    // Local audio tracks and voice sender infos
-    for (auto& pair : local_audio_track_info_pairs) {
-      MediaStreamTrackInterface* local_audio_track = pair.first;
-      const cricket::VoiceSenderInfo& voice_sender_info = pair.second;
-      RTC_DCHECK_EQ(local_audio_track->kind(),
-                    MediaStreamTrackInterface::kAudioKind);
-
-      voice_media_info_->senders.push_back(voice_sender_info);
-      rtc::scoped_refptr<MockRtpSender> rtp_sender =
-          CreateMockSender(rtc::scoped_refptr<MediaStreamTrackInterface>(
-                               local_audio_track),
-                           voice_sender_info.local_stats[0].ssrc);
-      rtp_senders_.push_back(rtc::scoped_refptr<RtpSenderInterface>(
-          rtp_sender.get()));
-    }
-    // Remote audio tracks and voice receiver infos
-    for (auto& pair : remote_audio_track_info_pairs) {
-      MediaStreamTrackInterface* remote_audio_track = pair.first;
-      const cricket::VoiceReceiverInfo& voice_receiver_info = pair.second;
-      RTC_DCHECK_EQ(remote_audio_track->kind(),
-                    MediaStreamTrackInterface::kAudioKind);
-
-      voice_media_info_->receivers.push_back(voice_receiver_info);
-      rtc::scoped_refptr<MockRtpReceiver> rtp_receiver =
-          CreateMockReceiver(rtc::scoped_refptr<MediaStreamTrackInterface>(
-                               remote_audio_track),
-                             voice_receiver_info.local_stats[0].ssrc);
-      rtp_receivers_.push_back(rtc::scoped_refptr<RtpReceiverInterface>(
-          rtp_receiver.get()));
-    }
-    // Local video tracks and video sender infos
-    for (auto& pair : local_video_track_info_pairs) {
-      MediaStreamTrackInterface* local_video_track = pair.first;
-      const cricket::VideoSenderInfo& video_sender_info = pair.second;
-      RTC_DCHECK_EQ(local_video_track->kind(),
-                    MediaStreamTrackInterface::kVideoKind);
-
-      video_media_info_->senders.push_back(video_sender_info);
-      rtc::scoped_refptr<MockRtpSender> rtp_sender =
-          CreateMockSender(rtc::scoped_refptr<MediaStreamTrackInterface>(
-                               local_video_track),
-                           video_sender_info.local_stats[0].ssrc);
-      rtp_senders_.push_back(rtc::scoped_refptr<RtpSenderInterface>(
-          rtp_sender.get()));
-    }
-    // Remote video tracks and video receiver infos
-    for (auto& pair : remote_video_track_info_pairs) {
-      MediaStreamTrackInterface* remote_video_track = pair.first;
-      const cricket::VideoReceiverInfo& video_receiver_info = pair.second;
-      RTC_DCHECK_EQ(remote_video_track->kind(),
-                    MediaStreamTrackInterface::kVideoKind);
-
-      video_media_info_->receivers.push_back(video_receiver_info);
-      rtc::scoped_refptr<MockRtpReceiver> rtp_receiver =
-          CreateMockReceiver(rtc::scoped_refptr<MediaStreamTrackInterface>(
-                               remote_video_track),
-                             video_receiver_info.local_stats[0].ssrc);
-      rtp_receivers_.push_back(rtc::scoped_refptr<RtpReceiverInterface>(
-          rtp_receiver.get()));
-    }
-    EXPECT_CALL(pc_, GetSenders()).WillRepeatedly(Return(rtp_senders_));
-    EXPECT_CALL(pc_, GetReceivers()).WillRepeatedly(Return(rtp_receivers_));
-
-    MockVoiceMediaChannel* voice_media_channel = new MockVoiceMediaChannel();
-    voice_channel_.reset(new cricket::VoiceChannel(
-        worker_thread_, network_thread_, nullptr, media_engine_,
-        voice_media_channel, "VoiceContentName", kDefaultRtcpMuxRequired,
-        kDefaultSrtpRequired));
-    EXPECT_CALL(session_, voice_channel())
-        .WillRepeatedly(Return(voice_channel_.get()));
-    EXPECT_CALL(*voice_media_channel, GetStats(_))
-        .WillOnce(DoAll(SetArgPointee<0>(*voice_media_info_), Return(true)));
-
-    MockVideoMediaChannel* video_media_channel = new MockVideoMediaChannel();
-    video_channel_.reset(new cricket::VideoChannel(
-        worker_thread_, network_thread_, nullptr, video_media_channel,
-        "VideoContentName", kDefaultRtcpMuxRequired, kDefaultSrtpRequired));
-    EXPECT_CALL(session_, video_channel())
-        .WillRepeatedly(Return(video_channel_.get()));
-    EXPECT_CALL(*video_media_channel, GetStats(_))
-        .WillOnce(DoAll(SetArgPointee<0>(*video_media_info_), Return(true)));
-  }
-
- private:
-  rtc::ScopedFakeClock fake_clock_;
-  RtcEventLogNullImpl event_log_;
-  rtc::Thread* const worker_thread_;
-  rtc::Thread* const network_thread_;
-  rtc::Thread* const signaling_thread_;
-  // |media_engine_| is actually owned by |channel_manager_|.
-  cricket::FakeMediaEngine* media_engine_;
-  std::unique_ptr<cricket::ChannelManager> channel_manager_;
-  MockWebRtcSession session_;
-  MockPeerConnection pc_;
-
-  std::vector<rtc::scoped_refptr<DataChannel>> data_channels_;
-  std::unique_ptr<cricket::VoiceChannel> voice_channel_;
-  std::unique_ptr<cricket::VideoChannel> video_channel_;
-  std::unique_ptr<cricket::VoiceMediaInfo> voice_media_info_;
-  std::unique_ptr<cricket::VideoMediaInfo> video_media_info_;
-  std::vector<rtc::scoped_refptr<RtpSenderInterface>> rtp_senders_;
-  std::vector<rtc::scoped_refptr<RtpReceiverInterface>> rtp_receivers_;
-};
-
-class RTCTestStats : public RTCStats {
- public:
-  WEBRTC_RTCSTATS_DECL();
-
-  RTCTestStats(const std::string& id, int64_t timestamp_us)
-      : RTCStats(id, timestamp_us),
-        dummy_stat("dummyStat") {}
-
-  RTCStatsMember<int32_t> dummy_stat;
-};
-
-WEBRTC_RTCSTATS_IMPL(RTCTestStats, RTCStats, "test-stats",
-    &dummy_stat);
-
-// Overrides the stats collection to verify thread usage and that the resulting
-// partial reports are merged.
-class FakeRTCStatsCollector : public RTCStatsCollector,
-                              public RTCStatsCollectorCallback {
- public:
-  static rtc::scoped_refptr<FakeRTCStatsCollector> Create(
-      PeerConnection* pc,
-      int64_t cache_lifetime_us) {
-    return rtc::scoped_refptr<FakeRTCStatsCollector>(
-        new rtc::RefCountedObject<FakeRTCStatsCollector>(
-            pc, cache_lifetime_us));
-  }
-
-  // RTCStatsCollectorCallback implementation.
-  void OnStatsDelivered(
-      const rtc::scoped_refptr<const RTCStatsReport>& report) override {
-    EXPECT_TRUE(signaling_thread_->IsCurrent());
-    rtc::CritScope cs(&lock_);
-    delivered_report_ = report;
-  }
-
-  void VerifyThreadUsageAndResultsMerging() {
-    GetStatsReport(rtc::scoped_refptr<RTCStatsCollectorCallback>(this));
-    EXPECT_TRUE_WAIT(HasVerifiedResults(), kGetStatsReportTimeoutMs);
-  }
-
-  bool HasVerifiedResults() {
-    EXPECT_TRUE(signaling_thread_->IsCurrent());
-    rtc::CritScope cs(&lock_);
-    if (!delivered_report_)
-      return false;
-    EXPECT_EQ(produced_on_signaling_thread_, 1);
-    EXPECT_EQ(produced_on_network_thread_, 1);
-
-    EXPECT_TRUE(delivered_report_->Get("SignalingThreadStats"));
-    EXPECT_TRUE(delivered_report_->Get("NetworkThreadStats"));
-
-    produced_on_signaling_thread_ = 0;
-    produced_on_network_thread_ = 0;
-    delivered_report_ = nullptr;
-    return true;
-  }
-
- protected:
-  FakeRTCStatsCollector(
-      PeerConnection* pc,
-      int64_t cache_lifetime)
-      : RTCStatsCollector(pc, cache_lifetime),
-        signaling_thread_(pc->session()->signaling_thread()),
-        worker_thread_(pc->session()->worker_thread()),
-        network_thread_(pc->session()->network_thread()) {
-  }
-
-  void ProducePartialResultsOnSignalingThread(int64_t timestamp_us) override {
-    EXPECT_TRUE(signaling_thread_->IsCurrent());
-    {
-      rtc::CritScope cs(&lock_);
-      EXPECT_FALSE(delivered_report_);
-      ++produced_on_signaling_thread_;
-    }
-
-    rtc::scoped_refptr<RTCStatsReport> signaling_report =
-        RTCStatsReport::Create(0);
-    signaling_report->AddStats(std::unique_ptr<const RTCStats>(
-        new RTCTestStats("SignalingThreadStats", timestamp_us)));
-    AddPartialResults(signaling_report);
-  }
-  void ProducePartialResultsOnNetworkThread(int64_t timestamp_us) override {
-    EXPECT_TRUE(network_thread_->IsCurrent());
-    {
-      rtc::CritScope cs(&lock_);
-      EXPECT_FALSE(delivered_report_);
-      ++produced_on_network_thread_;
-    }
-
-    rtc::scoped_refptr<RTCStatsReport> network_report =
-        RTCStatsReport::Create(0);
-    network_report->AddStats(std::unique_ptr<const RTCStats>(
-        new RTCTestStats("NetworkThreadStats", timestamp_us)));
-    AddPartialResults(network_report);
-  }
-
- private:
-  rtc::Thread* const signaling_thread_;
-  rtc::Thread* const worker_thread_;
-  rtc::Thread* const network_thread_;
-
-  rtc::CriticalSection lock_;
-  rtc::scoped_refptr<const RTCStatsReport> delivered_report_;
-  int produced_on_signaling_thread_ = 0;
-  int produced_on_network_thread_ = 0;
-};
-
-class RTCStatsCollectorTest : public testing::Test {
- public:
-  RTCStatsCollectorTest()
-    : test_(new rtc::RefCountedObject<RTCStatsCollectorTestHelper>()),
-      collector_(RTCStatsCollector::Create(
-          &test_->pc(), 50 * rtc::kNumMicrosecsPerMillisec)) {
-  }
-
-  rtc::scoped_refptr<const RTCStatsReport> GetStatsReport() {
-    rtc::scoped_refptr<RTCStatsObtainer> callback = RTCStatsObtainer::Create();
-    collector_->GetStatsReport(callback);
-    EXPECT_TRUE_WAIT(callback->report(), kGetStatsReportTimeoutMs);
-    int64_t after = rtc::TimeUTCMicros();
-    for (const RTCStats& stats : *callback->report()) {
-      EXPECT_LE(stats.timestamp_us(), after);
-    }
-    return callback->report();
-  }
-
-  void ExpectReportContainsCertificateInfo(
-      const rtc::scoped_refptr<const RTCStatsReport>& report,
-      const CertificateInfo& certinfo) {
-    for (size_t i = 0; i < certinfo.fingerprints.size(); ++i) {
-      RTCCertificateStats expected_certificate_stats(
-          "RTCCertificate_" + certinfo.fingerprints[i],
-          report->timestamp_us());
-      expected_certificate_stats.fingerprint = certinfo.fingerprints[i];
-      expected_certificate_stats.fingerprint_algorithm = "sha-1";
-      expected_certificate_stats.base64_certificate = certinfo.pems[i];
-      if (i + 1 < certinfo.fingerprints.size()) {
-        expected_certificate_stats.issuer_certificate_id =
-            "RTCCertificate_" + certinfo.fingerprints[i + 1];
-      }
-      ASSERT_TRUE(report->Get(expected_certificate_stats.id()));
-      EXPECT_EQ(expected_certificate_stats,
-                report->Get(expected_certificate_stats.id())->cast_to<
-                      RTCCertificateStats>());
-    }
-  }
-
- protected:
-  rtc::scoped_refptr<RTCStatsCollectorTestHelper> test_;
-  rtc::scoped_refptr<RTCStatsCollector> collector_;
-};
-
-TEST_F(RTCStatsCollectorTest, SingleCallback) {
-  rtc::scoped_refptr<const RTCStatsReport> result;
-  collector_->GetStatsReport(RTCStatsObtainer::Create(&result));
-  EXPECT_TRUE_WAIT(result, kGetStatsReportTimeoutMs);
-}
-
-TEST_F(RTCStatsCollectorTest, MultipleCallbacks) {
-  rtc::scoped_refptr<const RTCStatsReport> a;
-  rtc::scoped_refptr<const RTCStatsReport> b;
-  rtc::scoped_refptr<const RTCStatsReport> c;
-  collector_->GetStatsReport(RTCStatsObtainer::Create(&a));
-  collector_->GetStatsReport(RTCStatsObtainer::Create(&b));
-  collector_->GetStatsReport(RTCStatsObtainer::Create(&c));
-  EXPECT_TRUE_WAIT(a, kGetStatsReportTimeoutMs);
-  EXPECT_TRUE_WAIT(b, kGetStatsReportTimeoutMs);
-  EXPECT_TRUE_WAIT(c, kGetStatsReportTimeoutMs);
-  EXPECT_EQ(a.get(), b.get());
-  EXPECT_EQ(b.get(), c.get());
-}
-
-TEST_F(RTCStatsCollectorTest, CachedStatsReports) {
-  // Caching should ensure |a| and |b| are the same report.
-  rtc::scoped_refptr<const RTCStatsReport> a = GetStatsReport();
-  rtc::scoped_refptr<const RTCStatsReport> b = GetStatsReport();
-  EXPECT_EQ(a.get(), b.get());
-  // Invalidate cache by clearing it.
-  collector_->ClearCachedStatsReport();
-  rtc::scoped_refptr<const RTCStatsReport> c = GetStatsReport();
-  EXPECT_NE(b.get(), c.get());
-  // Invalidate cache by advancing time.
-  test_->fake_clock().AdvanceTime(rtc::TimeDelta::FromMilliseconds(51));
-  rtc::scoped_refptr<const RTCStatsReport> d = GetStatsReport();
-  EXPECT_TRUE(d);
-  EXPECT_NE(c.get(), d.get());
-}
-
-TEST_F(RTCStatsCollectorTest, MultipleCallbacksWithInvalidatedCacheInBetween) {
-  rtc::scoped_refptr<const RTCStatsReport> a;
-  rtc::scoped_refptr<const RTCStatsReport> b;
-  rtc::scoped_refptr<const RTCStatsReport> c;
-  collector_->GetStatsReport(RTCStatsObtainer::Create(&a));
-  collector_->GetStatsReport(RTCStatsObtainer::Create(&b));
-  // Cache is invalidated after 50 ms.
-  test_->fake_clock().AdvanceTime(rtc::TimeDelta::FromMilliseconds(51));
-  collector_->GetStatsReport(RTCStatsObtainer::Create(&c));
-  EXPECT_TRUE_WAIT(a, kGetStatsReportTimeoutMs);
-  EXPECT_TRUE_WAIT(b, kGetStatsReportTimeoutMs);
-  EXPECT_TRUE_WAIT(c, kGetStatsReportTimeoutMs);
-  EXPECT_EQ(a.get(), b.get());
-  // The act of doing |AdvanceTime| processes all messages. If this was not the
-  // case we might not require |c| to be fresher than |b|.
-  EXPECT_NE(c.get(), b.get());
-}
-
-TEST_F(RTCStatsCollectorTest, CollectRTCCertificateStatsSingle) {
-  std::unique_ptr<CertificateInfo> local_certinfo =
-      CreateFakeCertificateAndInfoFromDers(
-          std::vector<std::string>({ "(local) single certificate" }));
-  std::unique_ptr<CertificateInfo> remote_certinfo =
-      CreateFakeCertificateAndInfoFromDers(
-          std::vector<std::string>({ "(remote) single certificate" }));
-
-  // Mock the session to return the local and remote certificates.
-  EXPECT_CALL(test_->session(), GetStats(_)).WillRepeatedly(Invoke(
-      [](const ChannelNamePairs&) {
-        std::unique_ptr<SessionStats> stats(new SessionStats());
-        stats->transport_stats["transport"].transport_name = "transport";
-        return stats;
-      }));
-  EXPECT_CALL(test_->session(), GetLocalCertificate(_, _)).WillRepeatedly(
-      Invoke([&local_certinfo](const std::string& transport_name,
-             rtc::scoped_refptr<rtc::RTCCertificate>* certificate) {
-        if (transport_name == "transport") {
-          *certificate = local_certinfo->certificate;
-          return true;
-        }
-        return false;
-      }));
-  EXPECT_CALL(test_->session(),
-      GetRemoteSSLCertificate_ReturnsRawPointer(_)).WillRepeatedly(Invoke(
-      [&remote_certinfo](const std::string& transport_name) {
-        if (transport_name == "transport")
-          return remote_certinfo->certificate->ssl_certificate().GetReference();
-        return static_cast<rtc::SSLCertificate*>(nullptr);
-      }));
-
-  rtc::scoped_refptr<const RTCStatsReport> report = GetStatsReport();
-  ExpectReportContainsCertificateInfo(report, *local_certinfo);
-  ExpectReportContainsCertificateInfo(report, *remote_certinfo);
-}
-
-TEST_F(RTCStatsCollectorTest, CollectRTCCodecStats) {
-  MockVoiceMediaChannel* voice_media_channel = new MockVoiceMediaChannel();
-  cricket::VoiceChannel voice_channel(
-      test_->worker_thread(), test_->network_thread(),
-      test_->signaling_thread(), test_->media_engine(), voice_media_channel,
-      "VoiceContentName", kDefaultRtcpMuxRequired, kDefaultSrtpRequired);
-
-  MockVideoMediaChannel* video_media_channel = new MockVideoMediaChannel();
-  cricket::VideoChannel video_channel(
-      test_->worker_thread(), test_->network_thread(),
-      test_->signaling_thread(), video_media_channel, "VideoContentName",
-      kDefaultRtcpMuxRequired, kDefaultSrtpRequired);
-
-  // Audio
-  cricket::VoiceMediaInfo voice_media_info;
-
-  RtpCodecParameters inbound_audio_codec;
-  inbound_audio_codec.payload_type = 1;
-  inbound_audio_codec.kind = cricket::MEDIA_TYPE_AUDIO;
-  inbound_audio_codec.name = "opus";
-  inbound_audio_codec.clock_rate = rtc::Optional<int>(1337);
-  voice_media_info.receive_codecs.insert(
-      std::make_pair(inbound_audio_codec.payload_type, inbound_audio_codec));
-
-  RtpCodecParameters outbound_audio_codec;
-  outbound_audio_codec.payload_type = 2;
-  outbound_audio_codec.kind = cricket::MEDIA_TYPE_AUDIO;
-  outbound_audio_codec.name = "isac";
-  outbound_audio_codec.clock_rate = rtc::Optional<int>(1338);
-  voice_media_info.send_codecs.insert(
-      std::make_pair(outbound_audio_codec.payload_type, outbound_audio_codec));
-
-  EXPECT_CALL(*voice_media_channel, GetStats(_))
-      .WillOnce(DoAll(SetArgPointee<0>(voice_media_info), Return(true)));
-
-  // Video
-  cricket::VideoMediaInfo video_media_info;
-
-  RtpCodecParameters inbound_video_codec;
-  inbound_video_codec.payload_type = 3;
-  inbound_video_codec.kind = cricket::MEDIA_TYPE_VIDEO;
-  inbound_video_codec.name = "H264";
-  inbound_video_codec.clock_rate = rtc::Optional<int>(1339);
-  video_media_info.receive_codecs.insert(
-      std::make_pair(inbound_video_codec.payload_type, inbound_video_codec));
-
-  RtpCodecParameters outbound_video_codec;
-  outbound_video_codec.payload_type = 4;
-  outbound_video_codec.kind = cricket::MEDIA_TYPE_VIDEO;
-  outbound_video_codec.name = "VP8";
-  outbound_video_codec.clock_rate = rtc::Optional<int>(1340);
-  video_media_info.send_codecs.insert(
-      std::make_pair(outbound_video_codec.payload_type, outbound_video_codec));
-
-  EXPECT_CALL(*video_media_channel, GetStats(_))
-      .WillOnce(DoAll(SetArgPointee<0>(video_media_info), Return(true)));
-
-  SessionStats session_stats;
-  session_stats.proxy_to_transport["VoiceContentName"] = "TransportName";
-  session_stats.proxy_to_transport["VideoContentName"] = "TransportName";
-  session_stats.transport_stats["TransportName"].transport_name =
-      "TransportName";
-
-  EXPECT_CALL(test_->session(), GetStats(_)).WillRepeatedly(Invoke(
-      [&session_stats](const ChannelNamePairs&) {
-        return std::unique_ptr<SessionStats>(new SessionStats(session_stats));
-      }));
-  EXPECT_CALL(test_->session(), voice_channel())
-      .WillRepeatedly(Return(&voice_channel));
-  EXPECT_CALL(test_->session(), video_channel())
-      .WillRepeatedly(Return(&video_channel));
-
-  rtc::scoped_refptr<const RTCStatsReport> report = GetStatsReport();
-
-  RTCCodecStats expected_inbound_audio_codec(
-      "RTCCodec_InboundAudio_1", report->timestamp_us());
-  expected_inbound_audio_codec.payload_type = 1;
-  expected_inbound_audio_codec.mime_type = "audio/opus";
-  expected_inbound_audio_codec.clock_rate = 1337;
-
-  RTCCodecStats expected_outbound_audio_codec(
-      "RTCCodec_OutboundAudio_2", report->timestamp_us());
-  expected_outbound_audio_codec.payload_type = 2;
-  expected_outbound_audio_codec.mime_type = "audio/isac";
-  expected_outbound_audio_codec.clock_rate = 1338;
-
-  RTCCodecStats expected_inbound_video_codec(
-      "RTCCodec_InboundVideo_3", report->timestamp_us());
-  expected_inbound_video_codec.payload_type = 3;
-  expected_inbound_video_codec.mime_type = "video/H264";
-  expected_inbound_video_codec.clock_rate = 1339;
-
-  RTCCodecStats expected_outbound_video_codec(
-      "RTCCodec_OutboundVideo_4", report->timestamp_us());
-  expected_outbound_video_codec.payload_type = 4;
-  expected_outbound_video_codec.mime_type = "video/VP8";
-  expected_outbound_video_codec.clock_rate = 1340;
-
-  ASSERT_TRUE(report->Get(expected_inbound_audio_codec.id()));
-  EXPECT_EQ(expected_inbound_audio_codec,
-            report->Get(expected_inbound_audio_codec.id())->cast_to<
-                  RTCCodecStats>());
-
-  ASSERT_TRUE(report->Get(expected_outbound_audio_codec.id()));
-  EXPECT_EQ(expected_outbound_audio_codec,
-            report->Get(expected_outbound_audio_codec.id())->cast_to<
-                  RTCCodecStats>());
-
-  ASSERT_TRUE(report->Get(expected_inbound_video_codec.id()));
-  EXPECT_EQ(expected_inbound_video_codec,
-            report->Get(expected_inbound_video_codec.id())->cast_to<
-                  RTCCodecStats>());
-
-  ASSERT_TRUE(report->Get(expected_outbound_video_codec.id()));
-  EXPECT_EQ(expected_outbound_video_codec,
-            report->Get(expected_outbound_video_codec.id())->cast_to<
-                  RTCCodecStats>());
-}
-
-TEST_F(RTCStatsCollectorTest, CollectRTCCertificateStatsMultiple) {
-  std::unique_ptr<CertificateInfo> audio_local_certinfo =
-      CreateFakeCertificateAndInfoFromDers(
-          std::vector<std::string>({ "(local) audio" }));
-  audio_local_certinfo = CreateFakeCertificateAndInfoFromDers(
-      audio_local_certinfo->ders);
-  std::unique_ptr<CertificateInfo> audio_remote_certinfo =
-      CreateFakeCertificateAndInfoFromDers(
-          std::vector<std::string>({ "(remote) audio" }));
-  audio_remote_certinfo = CreateFakeCertificateAndInfoFromDers(
-      audio_remote_certinfo->ders);
-
-  std::unique_ptr<CertificateInfo> video_local_certinfo =
-      CreateFakeCertificateAndInfoFromDers(
-          std::vector<std::string>({ "(local) video" }));
-  video_local_certinfo = CreateFakeCertificateAndInfoFromDers(
-      video_local_certinfo->ders);
-  std::unique_ptr<CertificateInfo> video_remote_certinfo =
-      CreateFakeCertificateAndInfoFromDers(
-          std::vector<std::string>({ "(remote) video" }));
-  video_remote_certinfo = CreateFakeCertificateAndInfoFromDers(
-      video_remote_certinfo->ders);
-
-  // Mock the session to return the local and remote certificates.
-  EXPECT_CALL(test_->session(), GetStats(_)).WillRepeatedly(Invoke(
-      [](const ChannelNamePairs&) {
-        std::unique_ptr<SessionStats> stats(new SessionStats());
-        stats->transport_stats["audio"].transport_name = "audio";
-        stats->transport_stats["video"].transport_name = "video";
-        return stats;
-      }));
-  EXPECT_CALL(test_->session(), GetLocalCertificate(_, _)).WillRepeatedly(
-      Invoke([&audio_local_certinfo, &video_local_certinfo](
-            const std::string& transport_name,
-            rtc::scoped_refptr<rtc::RTCCertificate>* certificate) {
-        if (transport_name == "audio") {
-          *certificate = audio_local_certinfo->certificate;
-          return true;
-        }
-        if (transport_name == "video") {
-          *certificate = video_local_certinfo->certificate;
-          return true;
-        }
-        return false;
-      }));
-  EXPECT_CALL(test_->session(),
-      GetRemoteSSLCertificate_ReturnsRawPointer(_)).WillRepeatedly(Invoke(
-      [&audio_remote_certinfo, &video_remote_certinfo](
-          const std::string& transport_name) {
-        if (transport_name == "audio") {
-          return audio_remote_certinfo->certificate->ssl_certificate()
-              .GetReference();
-        }
-        if (transport_name == "video") {
-          return video_remote_certinfo->certificate->ssl_certificate()
-              .GetReference();
-        }
-        return static_cast<rtc::SSLCertificate*>(nullptr);
-      }));
-
-  rtc::scoped_refptr<const RTCStatsReport> report = GetStatsReport();
-  ExpectReportContainsCertificateInfo(report, *audio_local_certinfo);
-  ExpectReportContainsCertificateInfo(report, *audio_remote_certinfo);
-  ExpectReportContainsCertificateInfo(report, *video_local_certinfo);
-  ExpectReportContainsCertificateInfo(report, *video_remote_certinfo);
-}
-
-TEST_F(RTCStatsCollectorTest, CollectRTCCertificateStatsChain) {
-  std::vector<std::string> local_ders;
-  local_ders.push_back("(local) this");
-  local_ders.push_back("(local) is");
-  local_ders.push_back("(local) a");
-  local_ders.push_back("(local) chain");
-  std::unique_ptr<CertificateInfo> local_certinfo =
-      CreateFakeCertificateAndInfoFromDers(local_ders);
-  std::vector<std::string> remote_ders;
-  remote_ders.push_back("(remote) this");
-  remote_ders.push_back("(remote) is");
-  remote_ders.push_back("(remote) another");
-  remote_ders.push_back("(remote) chain");
-  std::unique_ptr<CertificateInfo> remote_certinfo =
-      CreateFakeCertificateAndInfoFromDers(remote_ders);
-
-  // Mock the session to return the local and remote certificates.
-  EXPECT_CALL(test_->session(), GetStats(_)).WillRepeatedly(Invoke(
-      [](const ChannelNamePairs&) {
-        std::unique_ptr<SessionStats> stats(new SessionStats());
-        stats->transport_stats["transport"].transport_name = "transport";
-        return stats;
-      }));
-  EXPECT_CALL(test_->session(), GetLocalCertificate(_, _)).WillRepeatedly(
-      Invoke([&local_certinfo](const std::string& transport_name,
-             rtc::scoped_refptr<rtc::RTCCertificate>* certificate) {
-        if (transport_name == "transport") {
-          *certificate = local_certinfo->certificate;
-          return true;
-        }
-        return false;
-      }));
-  EXPECT_CALL(test_->session(),
-      GetRemoteSSLCertificate_ReturnsRawPointer(_)).WillRepeatedly(Invoke(
-      [&remote_certinfo](const std::string& transport_name) {
-        if (transport_name == "transport")
-          return remote_certinfo->certificate->ssl_certificate().GetReference();
-        return static_cast<rtc::SSLCertificate*>(nullptr);
-      }));
-
-  rtc::scoped_refptr<const RTCStatsReport> report = GetStatsReport();
-  ExpectReportContainsCertificateInfo(report, *local_certinfo);
-  ExpectReportContainsCertificateInfo(report, *remote_certinfo);
-}
-
-TEST_F(RTCStatsCollectorTest, CollectRTCDataChannelStats) {
-  test_->data_channels().push_back(
-      new MockDataChannel(
-          0, "MockDataChannel0", DataChannelInterface::kConnecting, "udp",
-          1, 2, 3, 4));
-  RTCDataChannelStats expected_data_channel0("RTCDataChannel_0", 0);
-  expected_data_channel0.label = "MockDataChannel0";
-  expected_data_channel0.protocol = "udp";
-  expected_data_channel0.datachannelid = 0;
-  expected_data_channel0.state = "connecting";
-  expected_data_channel0.messages_sent = 1;
-  expected_data_channel0.bytes_sent = 2;
-  expected_data_channel0.messages_received = 3;
-  expected_data_channel0.bytes_received = 4;
-
-  test_->data_channels().push_back(
-      new MockDataChannel(
-          1, "MockDataChannel1", DataChannelInterface::kOpen, "tcp",
-          5, 6, 7, 8));
-  RTCDataChannelStats expected_data_channel1("RTCDataChannel_1", 0);
-  expected_data_channel1.label = "MockDataChannel1";
-  expected_data_channel1.protocol = "tcp";
-  expected_data_channel1.datachannelid = 1;
-  expected_data_channel1.state = "open";
-  expected_data_channel1.messages_sent = 5;
-  expected_data_channel1.bytes_sent = 6;
-  expected_data_channel1.messages_received = 7;
-  expected_data_channel1.bytes_received = 8;
-
-  test_->data_channels().push_back(
-      new MockDataChannel(
-          2, "MockDataChannel2", DataChannelInterface::kClosing, "udp",
-          9, 10, 11, 12));
-  RTCDataChannelStats expected_data_channel2("RTCDataChannel_2", 0);
-  expected_data_channel2.label = "MockDataChannel2";
-  expected_data_channel2.protocol = "udp";
-  expected_data_channel2.datachannelid = 2;
-  expected_data_channel2.state = "closing";
-  expected_data_channel2.messages_sent = 9;
-  expected_data_channel2.bytes_sent = 10;
-  expected_data_channel2.messages_received = 11;
-  expected_data_channel2.bytes_received = 12;
-
-  test_->data_channels().push_back(
-      new MockDataChannel(
-          3, "MockDataChannel3", DataChannelInterface::kClosed, "tcp",
-          13, 14, 15, 16));
-  RTCDataChannelStats expected_data_channel3("RTCDataChannel_3", 0);
-  expected_data_channel3.label = "MockDataChannel3";
-  expected_data_channel3.protocol = "tcp";
-  expected_data_channel3.datachannelid = 3;
-  expected_data_channel3.state = "closed";
-  expected_data_channel3.messages_sent = 13;
-  expected_data_channel3.bytes_sent = 14;
-  expected_data_channel3.messages_received = 15;
-  expected_data_channel3.bytes_received = 16;
-
-  rtc::scoped_refptr<const RTCStatsReport> report = GetStatsReport();
-  ASSERT_TRUE(report->Get(expected_data_channel0.id()));
-  EXPECT_EQ(expected_data_channel0,
-            report->Get(expected_data_channel0.id())->cast_to<
-                RTCDataChannelStats>());
-  ASSERT_TRUE(report->Get(expected_data_channel1.id()));
-  EXPECT_EQ(expected_data_channel1,
-            report->Get(expected_data_channel1.id())->cast_to<
-                RTCDataChannelStats>());
-  ASSERT_TRUE(report->Get(expected_data_channel2.id()));
-  EXPECT_EQ(expected_data_channel2,
-            report->Get(expected_data_channel2.id())->cast_to<
-                RTCDataChannelStats>());
-  ASSERT_TRUE(report->Get(expected_data_channel3.id()));
-  EXPECT_EQ(expected_data_channel3,
-            report->Get(expected_data_channel3.id())->cast_to<
-                RTCDataChannelStats>());
-}
-
-TEST_F(RTCStatsCollectorTest, CollectRTCIceCandidateStats) {
-  // Candidates in the first transport stats.
-  std::unique_ptr<cricket::Candidate> a_local_host = CreateFakeCandidate(
-      "1.2.3.4", 5,
-      "a_local_host's protocol",
-      cricket::LOCAL_PORT_TYPE,
-      0);
-  RTCLocalIceCandidateStats expected_a_local_host(
-      "RTCIceCandidate_" + a_local_host->id(), 0);
-  expected_a_local_host.transport_id = "RTCTransport_a_0";
-  expected_a_local_host.ip = "1.2.3.4";
-  expected_a_local_host.port = 5;
-  expected_a_local_host.protocol = "a_local_host's protocol";
-  expected_a_local_host.candidate_type = "host";
-  expected_a_local_host.priority = 0;
-  EXPECT_FALSE(*expected_a_local_host.is_remote);
-
-  std::unique_ptr<cricket::Candidate> a_remote_srflx = CreateFakeCandidate(
-      "6.7.8.9", 10,
-      "remote_srflx's protocol",
-      cricket::STUN_PORT_TYPE,
-      1);
-  RTCRemoteIceCandidateStats expected_a_remote_srflx(
-      "RTCIceCandidate_" + a_remote_srflx->id(), 0);
-  expected_a_remote_srflx.transport_id = "RTCTransport_a_0";
-  expected_a_remote_srflx.ip = "6.7.8.9";
-  expected_a_remote_srflx.port = 10;
-  expected_a_remote_srflx.protocol = "remote_srflx's protocol";
-  expected_a_remote_srflx.candidate_type = "srflx";
-  expected_a_remote_srflx.priority = 1;
-  expected_a_remote_srflx.deleted = false;
-  EXPECT_TRUE(*expected_a_remote_srflx.is_remote);
-
-  std::unique_ptr<cricket::Candidate> a_local_prflx = CreateFakeCandidate(
-      "11.12.13.14", 15,
-      "a_local_prflx's protocol",
-      cricket::PRFLX_PORT_TYPE,
-      2);
-  RTCLocalIceCandidateStats expected_a_local_prflx(
-      "RTCIceCandidate_" + a_local_prflx->id(), 0);
-  expected_a_local_prflx.transport_id = "RTCTransport_a_0";
-  expected_a_local_prflx.ip = "11.12.13.14";
-  expected_a_local_prflx.port = 15;
-  expected_a_local_prflx.protocol = "a_local_prflx's protocol";
-  expected_a_local_prflx.candidate_type = "prflx";
-  expected_a_local_prflx.priority = 2;
-  expected_a_local_prflx.deleted = false;
-  EXPECT_FALSE(*expected_a_local_prflx.is_remote);
-
-  std::unique_ptr<cricket::Candidate> a_remote_relay = CreateFakeCandidate(
-      "16.17.18.19", 20,
-      "a_remote_relay's protocol",
-      cricket::RELAY_PORT_TYPE,
-      3);
-  RTCRemoteIceCandidateStats expected_a_remote_relay(
-      "RTCIceCandidate_" + a_remote_relay->id(), 0);
-  expected_a_remote_relay.transport_id = "RTCTransport_a_0";
-  expected_a_remote_relay.ip = "16.17.18.19";
-  expected_a_remote_relay.port = 20;
-  expected_a_remote_relay.protocol = "a_remote_relay's protocol";
-  expected_a_remote_relay.candidate_type = "relay";
-  expected_a_remote_relay.priority = 3;
-  expected_a_remote_relay.deleted = false;
-  EXPECT_TRUE(*expected_a_remote_relay.is_remote);
-
-  // Candidates in the second transport stats.
-  std::unique_ptr<cricket::Candidate> b_local = CreateFakeCandidate(
-      "42.42.42.42", 42,
-      "b_local's protocol",
-      cricket::LOCAL_PORT_TYPE,
-      42);
-  RTCLocalIceCandidateStats expected_b_local(
-      "RTCIceCandidate_" + b_local->id(), 0);
-  expected_b_local.transport_id = "RTCTransport_b_0";
-  expected_b_local.ip = "42.42.42.42";
-  expected_b_local.port = 42;
-  expected_b_local.protocol = "b_local's protocol";
-  expected_b_local.candidate_type = "host";
-  expected_b_local.priority = 42;
-  expected_b_local.deleted = false;
-  EXPECT_FALSE(*expected_b_local.is_remote);
-
-  std::unique_ptr<cricket::Candidate> b_remote = CreateFakeCandidate(
-      "42.42.42.42", 42,
-      "b_remote's protocol",
-      cricket::LOCAL_PORT_TYPE,
-      42);
-  RTCRemoteIceCandidateStats expected_b_remote(
-      "RTCIceCandidate_" + b_remote->id(), 0);
-  expected_b_remote.transport_id = "RTCTransport_b_0";
-  expected_b_remote.ip = "42.42.42.42";
-  expected_b_remote.port = 42;
-  expected_b_remote.protocol = "b_remote's protocol";
-  expected_b_remote.candidate_type = "host";
-  expected_b_remote.priority = 42;
-  expected_b_remote.deleted = false;
-  EXPECT_TRUE(*expected_b_remote.is_remote);
-
-  SessionStats session_stats;
-
-  cricket::TransportChannelStats a_transport_channel_stats;
-  a_transport_channel_stats.connection_infos.push_back(
-      cricket::ConnectionInfo());
-  a_transport_channel_stats.connection_infos[0].local_candidate =
-      *a_local_host.get();
-  a_transport_channel_stats.connection_infos[0].remote_candidate =
-      *a_remote_srflx.get();
-  a_transport_channel_stats.connection_infos.push_back(
-      cricket::ConnectionInfo());
-  a_transport_channel_stats.connection_infos[1].local_candidate =
-      *a_local_prflx.get();
-  a_transport_channel_stats.connection_infos[1].remote_candidate =
-      *a_remote_relay.get();
-  session_stats.transport_stats["a"].transport_name = "a";
-  session_stats.transport_stats["a"].channel_stats.push_back(
-      a_transport_channel_stats);
-
-  cricket::TransportChannelStats b_transport_channel_stats;
-  b_transport_channel_stats.connection_infos.push_back(
-      cricket::ConnectionInfo());
-  b_transport_channel_stats.connection_infos[0].local_candidate =
-      *b_local.get();
-  b_transport_channel_stats.connection_infos[0].remote_candidate =
-      *b_remote.get();
-  session_stats.transport_stats["b"].transport_name = "b";
-  session_stats.transport_stats["b"].channel_stats.push_back(
-      b_transport_channel_stats);
-
-  // Mock the session to return the desired candidates.
-  EXPECT_CALL(test_->session(), GetStats(_)).WillRepeatedly(Invoke(
-      [&session_stats](const ChannelNamePairs&) {
-        return std::unique_ptr<SessionStats>(new SessionStats(session_stats));
-      }));
-
-  rtc::scoped_refptr<const RTCStatsReport> report = GetStatsReport();
-
-  ASSERT_TRUE(report->Get(expected_a_local_host.id()));
-  EXPECT_EQ(expected_a_local_host,
-            report->Get(expected_a_local_host.id())->cast_to<
-                RTCLocalIceCandidateStats>());
-  ASSERT_TRUE(report->Get(expected_a_remote_srflx.id()));
-  EXPECT_EQ(expected_a_remote_srflx,
-            report->Get(expected_a_remote_srflx.id())->cast_to<
-                RTCRemoteIceCandidateStats>());
-  ASSERT_TRUE(report->Get(expected_a_local_prflx.id()));
-  EXPECT_EQ(expected_a_local_prflx,
-            report->Get(expected_a_local_prflx.id())->cast_to<
-                RTCLocalIceCandidateStats>());
-  ASSERT_TRUE(report->Get(expected_a_remote_relay.id()));
-  EXPECT_EQ(expected_a_remote_relay,
-            report->Get(expected_a_remote_relay.id())->cast_to<
-                RTCRemoteIceCandidateStats>());
-  ASSERT_TRUE(report->Get(expected_b_local.id()));
-  EXPECT_EQ(expected_b_local,
-            report->Get(expected_b_local.id())->cast_to<
-                RTCLocalIceCandidateStats>());
-  ASSERT_TRUE(report->Get(expected_b_remote.id()));
-  EXPECT_EQ(expected_b_remote,
-            report->Get(expected_b_remote.id())->cast_to<
-                RTCRemoteIceCandidateStats>());
-  EXPECT_TRUE(report->Get("RTCTransport_a_0"));
-  EXPECT_TRUE(report->Get("RTCTransport_b_0"));
-}
-
-TEST_F(RTCStatsCollectorTest, CollectRTCIceCandidatePairStats) {
-  MockVideoMediaChannel* video_media_channel = new MockVideoMediaChannel();
-  cricket::VideoChannel video_channel(
-      test_->worker_thread(), test_->network_thread(),
-      test_->signaling_thread(), video_media_channel, "VideoContentName",
-      kDefaultRtcpMuxRequired, kDefaultSrtpRequired);
-
-  std::unique_ptr<cricket::Candidate> local_candidate = CreateFakeCandidate(
-      "42.42.42.42", 42, "protocol", cricket::LOCAL_PORT_TYPE, 42);
-  std::unique_ptr<cricket::Candidate> remote_candidate = CreateFakeCandidate(
-      "42.42.42.42", 42, "protocol", cricket::LOCAL_PORT_TYPE, 42);
-
-  SessionStats session_stats;
-
-  cricket::ConnectionInfo connection_info;
-  connection_info.best_connection = false;
-  connection_info.local_candidate = *local_candidate.get();
-  connection_info.remote_candidate = *remote_candidate.get();
-  connection_info.writable = true;
-  connection_info.sent_total_bytes = 42;
-  connection_info.recv_total_bytes = 1234;
-  connection_info.total_round_trip_time_ms = 0;
-  connection_info.current_round_trip_time_ms = rtc::Optional<uint32_t>();
-  connection_info.recv_ping_requests = 2020;
-  connection_info.sent_ping_requests_total = 2020;
-  connection_info.sent_ping_requests_before_first_response = 2000;
-  connection_info.recv_ping_responses = 4321;
-  connection_info.sent_ping_responses = 1000;
-  connection_info.state = cricket::IceCandidatePairState::IN_PROGRESS;
-  connection_info.priority = 5555;
-  connection_info.nominated = false;
-
-  cricket::TransportChannelStats transport_channel_stats;
-  transport_channel_stats.component = cricket::ICE_CANDIDATE_COMPONENT_RTP;
-  transport_channel_stats.connection_infos.push_back(connection_info);
-  session_stats.proxy_to_transport["VideoContentName"] = "transport";
-  session_stats.transport_stats["transport"].transport_name = "transport";
-  session_stats.transport_stats["transport"].channel_stats.push_back(
-      transport_channel_stats);
-
-  // Mock the session to return the desired candidates.
-  EXPECT_CALL(test_->session(), GetStats(_)).WillRepeatedly(Invoke(
-      [&session_stats](const ChannelNamePairs&) {
-        return std::unique_ptr<SessionStats>(new SessionStats(session_stats));
-      }));
-
-  // Mock the session to return bandwidth estimation info. These should only
-  // be used for a selected candidate pair.
-  cricket::VideoMediaInfo video_media_info;
-  EXPECT_CALL(*video_media_channel, GetStats(_))
-      .WillOnce(DoAll(SetArgPointee<0>(video_media_info), Return(true)));
-  EXPECT_CALL(test_->session(), video_channel())
-      .WillRepeatedly(Return(&video_channel));
-
-  rtc::scoped_refptr<const RTCStatsReport> report = GetStatsReport();
-
-  RTCIceCandidatePairStats expected_pair("RTCIceCandidatePair_" +
-                                             local_candidate->id() + "_" +
-                                             remote_candidate->id(),
-                                         report->timestamp_us());
-  expected_pair.transport_id =
-      "RTCTransport_transport_" +
-      rtc::ToString<>(cricket::ICE_CANDIDATE_COMPONENT_RTP);
-  expected_pair.local_candidate_id = "RTCIceCandidate_" + local_candidate->id();
-  expected_pair.remote_candidate_id =
-      "RTCIceCandidate_" + remote_candidate->id();
-  expected_pair.state = RTCStatsIceCandidatePairState::kInProgress;
-  expected_pair.priority = 5555;
-  expected_pair.nominated = false;
-  expected_pair.writable = true;
-  expected_pair.bytes_sent = 42;
-  expected_pair.bytes_received = 1234;
-  expected_pair.total_round_trip_time = 0.0;
-  expected_pair.requests_received = 2020;
-  expected_pair.requests_sent = 2000;
-  expected_pair.responses_received = 4321;
-  expected_pair.responses_sent = 1000;
-  expected_pair.consent_requests_sent = (2020 - 2000);
-  // |expected_pair.current_round_trip_time| should be undefined because the
-  // current RTT is not set.
-  // |expected_pair.available_[outgoing/incoming]_bitrate| should be undefined
-  // because is is not the current pair.
-
-  ASSERT_TRUE(report->Get(expected_pair.id()));
-  EXPECT_EQ(
-      expected_pair,
-      report->Get(expected_pair.id())->cast_to<RTCIceCandidatePairStats>());
-  EXPECT_TRUE(report->Get(*expected_pair.transport_id));
-
-  // Set nominated and "GetStats" again.
-  session_stats.transport_stats["transport"]
-      .channel_stats[0]
-      .connection_infos[0]
-      .nominated = true;
-  EXPECT_CALL(*video_media_channel, GetStats(_))
-      .WillOnce(DoAll(SetArgPointee<0>(video_media_info), Return(true)));
-  collector_->ClearCachedStatsReport();
-  report = GetStatsReport();
-  expected_pair.nominated = true;
-  ASSERT_TRUE(report->Get(expected_pair.id()));
-  EXPECT_EQ(
-      expected_pair,
-      report->Get(expected_pair.id())->cast_to<RTCIceCandidatePairStats>());
-  EXPECT_TRUE(report->Get(*expected_pair.transport_id));
-
-  // Set round trip times and "GetStats" again.
-  session_stats.transport_stats["transport"].channel_stats[0]
-      .connection_infos[0].total_round_trip_time_ms = 7331;
-  session_stats.transport_stats["transport"].channel_stats[0]
-      .connection_infos[0].current_round_trip_time_ms =
-          rtc::Optional<uint32_t>(1337);
-  EXPECT_CALL(*video_media_channel, GetStats(_))
-      .WillOnce(DoAll(SetArgPointee<0>(video_media_info), Return(true)));
-  collector_->ClearCachedStatsReport();
-  report = GetStatsReport();
-  expected_pair.total_round_trip_time = 7.331;
-  expected_pair.current_round_trip_time = 1.337;
-  ASSERT_TRUE(report->Get(expected_pair.id()));
-  EXPECT_EQ(
-      expected_pair,
-      report->Get(expected_pair.id())->cast_to<RTCIceCandidatePairStats>());
-  EXPECT_TRUE(report->Get(*expected_pair.transport_id));
-
-  // Make pair the current pair, clear bandwidth and "GetStats" again.
-  session_stats.transport_stats["transport"]
-      .channel_stats[0]
-      .connection_infos[0]
-      .best_connection = true;
-  EXPECT_CALL(*video_media_channel, GetStats(_))
-      .WillOnce(DoAll(SetArgPointee<0>(video_media_info), Return(true)));
-  collector_->ClearCachedStatsReport();
-  report = GetStatsReport();
-  // |expected_pair.available_[outgoing/incoming]_bitrate| should still be
-  // undefined because bandwidth is not set.
-  ASSERT_TRUE(report->Get(expected_pair.id()));
-  EXPECT_EQ(
-      expected_pair,
-      report->Get(expected_pair.id())->cast_to<RTCIceCandidatePairStats>());
-  EXPECT_TRUE(report->Get(*expected_pair.transport_id));
-
-  // Set bandwidth and "GetStats" again.
-  webrtc::Call::Stats call_stats;
-  const int kSendBandwidth = 888;
-  call_stats.send_bandwidth_bps = kSendBandwidth;
-  const int kRecvBandwidth = 999;
-  call_stats.recv_bandwidth_bps = kRecvBandwidth;
-  EXPECT_CALL(test_->session(), GetCallStats())
-      .WillRepeatedly(Return(call_stats));
-  EXPECT_CALL(*video_media_channel, GetStats(_))
-      .WillOnce(DoAll(SetArgPointee<0>(video_media_info), Return(true)));
-  collector_->ClearCachedStatsReport();
-  report = GetStatsReport();
-  expected_pair.available_outgoing_bitrate = kSendBandwidth;
-  expected_pair.available_incoming_bitrate = kRecvBandwidth;
-  ASSERT_TRUE(report->Get(expected_pair.id()));
-  EXPECT_EQ(
-      expected_pair,
-      report->Get(expected_pair.id())->cast_to<RTCIceCandidatePairStats>());
-  EXPECT_TRUE(report->Get(*expected_pair.transport_id));
-
-  RTCLocalIceCandidateStats expected_local_candidate(
-      *expected_pair.local_candidate_id, report->timestamp_us());
-  expected_local_candidate.transport_id = *expected_pair.transport_id;
-  expected_local_candidate.ip = "42.42.42.42";
-  expected_local_candidate.port = 42;
-  expected_local_candidate.protocol = "protocol";
-  expected_local_candidate.candidate_type = "host";
-  expected_local_candidate.priority = 42;
-  expected_local_candidate.deleted = false;
-  EXPECT_FALSE(*expected_local_candidate.is_remote);
-  ASSERT_TRUE(report->Get(expected_local_candidate.id()));
-  EXPECT_EQ(expected_local_candidate,
-            report->Get(expected_local_candidate.id())->cast_to<
-                RTCLocalIceCandidateStats>());
-
-  RTCRemoteIceCandidateStats expected_remote_candidate(
-      *expected_pair.remote_candidate_id, report->timestamp_us());
-  expected_remote_candidate.transport_id = *expected_pair.transport_id;
-  expected_remote_candidate.ip = "42.42.42.42";
-  expected_remote_candidate.port = 42;
-  expected_remote_candidate.protocol = "protocol";
-  expected_remote_candidate.candidate_type = "host";
-  expected_remote_candidate.priority = 42;
-  expected_remote_candidate.deleted = false;
-  EXPECT_TRUE(*expected_remote_candidate.is_remote);
-  ASSERT_TRUE(report->Get(expected_remote_candidate.id()));
-  EXPECT_EQ(expected_remote_candidate,
-            report->Get(expected_remote_candidate.id())->cast_to<
-                RTCRemoteIceCandidateStats>());
-}
-
-TEST_F(RTCStatsCollectorTest, CollectRTCPeerConnectionStats) {
-  {
-    rtc::scoped_refptr<const RTCStatsReport> report = GetStatsReport();
-    RTCPeerConnectionStats expected("RTCPeerConnection",
-                                    report->timestamp_us());
-    expected.data_channels_opened = 0;
-    expected.data_channels_closed = 0;
-    ASSERT_TRUE(report->Get("RTCPeerConnection"));
-    EXPECT_EQ(expected,
-              report->Get("RTCPeerConnection")->cast_to<
-                  RTCPeerConnectionStats>());
-  }
-
-  rtc::scoped_refptr<DataChannel> dummy_channel_a = DataChannel::Create(
-      nullptr, cricket::DCT_NONE, "DummyChannelA", InternalDataChannelInit());
-  test_->pc().SignalDataChannelCreated(dummy_channel_a.get());
-  rtc::scoped_refptr<DataChannel> dummy_channel_b = DataChannel::Create(
-      nullptr, cricket::DCT_NONE, "DummyChannelB", InternalDataChannelInit());
-  test_->pc().SignalDataChannelCreated(dummy_channel_b.get());
-
-  dummy_channel_a->SignalOpened(dummy_channel_a.get());
-  // Closing a channel that is not opened should not affect the counts.
-  dummy_channel_b->SignalClosed(dummy_channel_b.get());
-
-  {
-    collector_->ClearCachedStatsReport();
-    rtc::scoped_refptr<const RTCStatsReport> report = GetStatsReport();
-    RTCPeerConnectionStats expected("RTCPeerConnection",
-                                    report->timestamp_us());
-    expected.data_channels_opened = 1;
-    expected.data_channels_closed = 0;
-    ASSERT_TRUE(report->Get("RTCPeerConnection"));
-    EXPECT_EQ(expected,
-              report->Get("RTCPeerConnection")->cast_to<
-                  RTCPeerConnectionStats>());
-  }
-
-  dummy_channel_b->SignalOpened(dummy_channel_b.get());
-  dummy_channel_b->SignalClosed(dummy_channel_b.get());
-
-  {
-    collector_->ClearCachedStatsReport();
-    rtc::scoped_refptr<const RTCStatsReport> report = GetStatsReport();
-    RTCPeerConnectionStats expected("RTCPeerConnection",
-                                    report->timestamp_us());
-    expected.data_channels_opened = 2;
-    expected.data_channels_closed = 1;
-    ASSERT_TRUE(report->Get("RTCPeerConnection"));
-    EXPECT_EQ(expected,
-              report->Get("RTCPeerConnection")->cast_to<
-                  RTCPeerConnectionStats>());
-  }
-
-  // Re-opening a data channel (or opening a new data channel that is re-using
-  // the same address in memory) should increase the opened count.
-  dummy_channel_b->SignalOpened(dummy_channel_b.get());
-
-  {
-    collector_->ClearCachedStatsReport();
-    rtc::scoped_refptr<const RTCStatsReport> report = GetStatsReport();
-    RTCPeerConnectionStats expected("RTCPeerConnection",
-                                    report->timestamp_us());
-    expected.data_channels_opened = 3;
-    expected.data_channels_closed = 1;
-    ASSERT_TRUE(report->Get("RTCPeerConnection"));
-    EXPECT_EQ(expected,
-              report->Get("RTCPeerConnection")->cast_to<
-                  RTCPeerConnectionStats>());
-  }
-
-  dummy_channel_a->SignalClosed(dummy_channel_a.get());
-  dummy_channel_b->SignalClosed(dummy_channel_b.get());
-
-  {
-    collector_->ClearCachedStatsReport();
-    rtc::scoped_refptr<const RTCStatsReport> report = GetStatsReport();
-    RTCPeerConnectionStats expected("RTCPeerConnection",
-                                    report->timestamp_us());
-    expected.data_channels_opened = 3;
-    expected.data_channels_closed = 3;
-    ASSERT_TRUE(report->Get("RTCPeerConnection"));
-    EXPECT_EQ(expected,
-              report->Get("RTCPeerConnection")->cast_to<
-                  RTCPeerConnectionStats>());
-  }
-}
-
-TEST_F(RTCStatsCollectorTest,
-       CollectRTCMediaStreamStatsAndRTCMediaStreamTrackStats_Audio) {
-  rtc::scoped_refptr<StreamCollection> local_streams =
-      StreamCollection::Create();
-  rtc::scoped_refptr<StreamCollection> remote_streams =
-      StreamCollection::Create();
-  EXPECT_CALL(test_->pc(), local_streams())
-      .WillRepeatedly(Return(local_streams));
-  EXPECT_CALL(test_->pc(), remote_streams())
-      .WillRepeatedly(Return(remote_streams));
-
-  rtc::scoped_refptr<MediaStream> local_stream =
-      MediaStream::Create("LocalStreamLabel");
-  local_streams->AddStream(local_stream);
-  rtc::scoped_refptr<MediaStream> remote_stream =
-      MediaStream::Create("RemoteStreamLabel");
-  remote_streams->AddStream(remote_stream);
-
-  // Local audio track
-  rtc::scoped_refptr<MediaStreamTrackInterface> local_audio_track =
-      CreateFakeTrack(cricket::MEDIA_TYPE_AUDIO, "LocalAudioTrackID",
-                      MediaStreamTrackInterface::kEnded);
-  local_stream->AddTrack(static_cast<AudioTrackInterface*>(
-      local_audio_track.get()));
-
-  cricket::VoiceSenderInfo voice_sender_info_ssrc1;
-  voice_sender_info_ssrc1.local_stats.push_back(cricket::SsrcSenderInfo());
-  voice_sender_info_ssrc1.local_stats[0].ssrc = 1;
-  voice_sender_info_ssrc1.audio_level = 32767;
-  voice_sender_info_ssrc1.total_input_energy = 0.25;
-  voice_sender_info_ssrc1.total_input_duration = 0.5;
-  voice_sender_info_ssrc1.echo_return_loss = 42;
-  voice_sender_info_ssrc1.echo_return_loss_enhancement = 52;
-
-  // Uses default values, the corresponding stats object should contain
-  // undefined members.
-  cricket::VoiceSenderInfo voice_sender_info_ssrc2;
-  voice_sender_info_ssrc2.local_stats.push_back(cricket::SsrcSenderInfo());
-  voice_sender_info_ssrc2.local_stats[0].ssrc = 2;
-  voice_sender_info_ssrc2.audio_level = 0;
-  voice_sender_info_ssrc2.total_input_energy = 0.0;
-  voice_sender_info_ssrc2.total_input_duration = 0.0;
-  voice_sender_info_ssrc2.echo_return_loss = -100;
-  voice_sender_info_ssrc2.echo_return_loss_enhancement = -100;
-
-  // Remote audio track
-  rtc::scoped_refptr<MediaStreamTrackInterface> remote_audio_track =
-      CreateFakeTrack(cricket::MEDIA_TYPE_AUDIO, "RemoteAudioTrackID",
-                      MediaStreamTrackInterface::kLive);
-  remote_stream->AddTrack(static_cast<AudioTrackInterface*>(
-      remote_audio_track.get()));
-
-  cricket::VoiceReceiverInfo voice_receiver_info;
-  voice_receiver_info.local_stats.push_back(cricket::SsrcReceiverInfo());
-  voice_receiver_info.local_stats[0].ssrc = 3;
-  voice_receiver_info.audio_level = 16383;
-  voice_receiver_info.total_output_energy = 0.125;
-  voice_receiver_info.total_samples_received = 4567;
-  voice_receiver_info.total_output_duration = 0.25;
-  voice_receiver_info.concealed_samples = 123;
-
-  test_->CreateMockRtpSendersReceiversAndChannels(
-      { std::make_pair(local_audio_track.get(), voice_sender_info_ssrc1),
-        std::make_pair(local_audio_track.get(), voice_sender_info_ssrc2) },
-      { std::make_pair(remote_audio_track.get(), voice_receiver_info) },
-      {}, {});
-
-  rtc::scoped_refptr<const RTCStatsReport> report = GetStatsReport();
-
-  RTCMediaStreamStats expected_local_stream(
-      "RTCMediaStream_local_LocalStreamLabel", report->timestamp_us());
-  expected_local_stream.stream_identifier = local_stream->label();
-  expected_local_stream.track_ids = std::vector<std::string>(
-      { "RTCMediaStreamTrack_local_audio_LocalAudioTrackID_1",
-        "RTCMediaStreamTrack_local_audio_LocalAudioTrackID_2" });
-  ASSERT_TRUE(report->Get(expected_local_stream.id()));
-  EXPECT_EQ(expected_local_stream,
-            report->Get(expected_local_stream.id())->cast_to<
-                RTCMediaStreamStats>());
-
-  RTCMediaStreamStats expected_remote_stream(
-      "RTCMediaStream_remote_RemoteStreamLabel", report->timestamp_us());
-  expected_remote_stream.stream_identifier = remote_stream->label();
-  expected_remote_stream.track_ids = std::vector<std::string>({
-      "RTCMediaStreamTrack_remote_audio_RemoteAudioTrackID_3" });
-  ASSERT_TRUE(report->Get(expected_remote_stream.id()));
-  EXPECT_EQ(expected_remote_stream,
-            report->Get(expected_remote_stream.id())->cast_to<
-                RTCMediaStreamStats>());
-
-  RTCMediaStreamTrackStats expected_local_audio_track_ssrc1(
-      "RTCMediaStreamTrack_local_audio_LocalAudioTrackID_1",
-      report->timestamp_us(), RTCMediaStreamTrackKind::kAudio);
-  expected_local_audio_track_ssrc1.track_identifier = local_audio_track->id();
-  expected_local_audio_track_ssrc1.remote_source = false;
-  expected_local_audio_track_ssrc1.ended = true;
-  expected_local_audio_track_ssrc1.detached = false;
-  expected_local_audio_track_ssrc1.audio_level = 1.0;
-  expected_local_audio_track_ssrc1.total_audio_energy = 0.25;
-  expected_local_audio_track_ssrc1.total_samples_duration = 0.5;
-  expected_local_audio_track_ssrc1.echo_return_loss = 42.0;
-  expected_local_audio_track_ssrc1.echo_return_loss_enhancement = 52.0;
-  ASSERT_TRUE(report->Get(expected_local_audio_track_ssrc1.id()));
-  EXPECT_EQ(expected_local_audio_track_ssrc1,
-            report->Get(expected_local_audio_track_ssrc1.id())->cast_to<
-                RTCMediaStreamTrackStats>());
-
-  RTCMediaStreamTrackStats expected_local_audio_track_ssrc2(
-      "RTCMediaStreamTrack_local_audio_LocalAudioTrackID_2",
-      report->timestamp_us(), RTCMediaStreamTrackKind::kAudio);
-  expected_local_audio_track_ssrc2.track_identifier = local_audio_track->id();
-  expected_local_audio_track_ssrc2.remote_source = false;
-  expected_local_audio_track_ssrc2.ended = true;
-  expected_local_audio_track_ssrc2.detached = false;
-  expected_local_audio_track_ssrc2.audio_level = 0.0;
-  expected_local_audio_track_ssrc2.total_audio_energy = 0.0;
-  expected_local_audio_track_ssrc2.total_samples_duration = 0.0;
-  // Should be undefined: |expected_local_audio_track_ssrc2.echo_return_loss|
-  // and |expected_local_audio_track_ssrc2.echo_return_loss_enhancement|.
-  ASSERT_TRUE(report->Get(expected_local_audio_track_ssrc2.id()));
-  EXPECT_EQ(expected_local_audio_track_ssrc2,
-            report->Get(expected_local_audio_track_ssrc2.id())->cast_to<
-                RTCMediaStreamTrackStats>());
-
-  RTCMediaStreamTrackStats expected_remote_audio_track(
-      "RTCMediaStreamTrack_remote_audio_RemoteAudioTrackID_3",
-      report->timestamp_us(), RTCMediaStreamTrackKind::kAudio);
-  expected_remote_audio_track.track_identifier = remote_audio_track->id();
-  expected_remote_audio_track.remote_source = true;
-  expected_remote_audio_track.ended = false;
-  expected_remote_audio_track.detached = false;
-  expected_remote_audio_track.audio_level = 16383.0 / 32767.0;
-  expected_remote_audio_track.total_audio_energy = 0.125;
-  expected_remote_audio_track.total_samples_received = 4567;
-  expected_remote_audio_track.total_samples_duration = 0.25;
-  expected_remote_audio_track.concealed_samples = 123;
-  ASSERT_TRUE(report->Get(expected_remote_audio_track.id()));
-  EXPECT_EQ(expected_remote_audio_track,
-            report->Get(expected_remote_audio_track.id())->cast_to<
-                RTCMediaStreamTrackStats>());
-}
-
-TEST_F(RTCStatsCollectorTest,
-       CollectRTCMediaStreamStatsAndRTCMediaStreamTrackStats_Video) {
-  rtc::scoped_refptr<StreamCollection> local_streams =
-      StreamCollection::Create();
-  rtc::scoped_refptr<StreamCollection> remote_streams =
-      StreamCollection::Create();
-  EXPECT_CALL(test_->pc(), local_streams())
-      .WillRepeatedly(Return(local_streams));
-  EXPECT_CALL(test_->pc(), remote_streams())
-      .WillRepeatedly(Return(remote_streams));
-
-  rtc::scoped_refptr<MediaStream> local_stream =
-      MediaStream::Create("LocalStreamLabel");
-  local_streams->AddStream(local_stream);
-  rtc::scoped_refptr<MediaStream> remote_stream =
-      MediaStream::Create("RemoteStreamLabel");
-  remote_streams->AddStream(remote_stream);
-
-  // Local video track
-  rtc::scoped_refptr<MediaStreamTrackInterface> local_video_track =
-      CreateFakeTrack(cricket::MEDIA_TYPE_VIDEO, "LocalVideoTrackID",
-                      MediaStreamTrackInterface::kLive);
-  local_stream->AddTrack(static_cast<VideoTrackInterface*>(
-      local_video_track.get()));
-
-  cricket::VideoSenderInfo video_sender_info_ssrc1;
-  video_sender_info_ssrc1.local_stats.push_back(cricket::SsrcSenderInfo());
-  video_sender_info_ssrc1.local_stats[0].ssrc = 1;
-  video_sender_info_ssrc1.send_frame_width = 1234;
-  video_sender_info_ssrc1.send_frame_height = 4321;
-  video_sender_info_ssrc1.frames_encoded = 11;
-
-  cricket::VideoSenderInfo video_sender_info_ssrc2;
-  video_sender_info_ssrc2.local_stats.push_back(cricket::SsrcSenderInfo());
-  video_sender_info_ssrc2.local_stats[0].ssrc = 2;
-  video_sender_info_ssrc2.send_frame_width = 4321;
-  video_sender_info_ssrc2.send_frame_height = 1234;
-  video_sender_info_ssrc2.frames_encoded = 22;
-
-  // Remote video track with values
-  rtc::scoped_refptr<MediaStreamTrackInterface> remote_video_track_ssrc3 =
-      CreateFakeTrack(cricket::MEDIA_TYPE_VIDEO, "RemoteVideoTrackID3",
-                      MediaStreamTrackInterface::kEnded);
-  remote_stream->AddTrack(static_cast<VideoTrackInterface*>(
-      remote_video_track_ssrc3.get()));
-
-  cricket::VideoReceiverInfo video_receiver_info_ssrc3;
-  video_receiver_info_ssrc3.local_stats.push_back(cricket::SsrcReceiverInfo());
-  video_receiver_info_ssrc3.local_stats[0].ssrc = 3;
-  video_receiver_info_ssrc3.frame_width = 6789;
-  video_receiver_info_ssrc3.frame_height = 9876;
-  video_receiver_info_ssrc3.frames_received = 1000;
-  video_receiver_info_ssrc3.frames_decoded = 995;
-  video_receiver_info_ssrc3.frames_rendered = 990;
-
-  // Remote video track with undefined (default) values
-  rtc::scoped_refptr<MediaStreamTrackInterface> remote_video_track_ssrc4 =
-      CreateFakeTrack(cricket::MEDIA_TYPE_VIDEO, "RemoteVideoTrackID4",
-                      MediaStreamTrackInterface::kLive);
-  remote_stream->AddTrack(static_cast<VideoTrackInterface*>(
-      remote_video_track_ssrc4.get()));
-
-  cricket::VideoReceiverInfo video_receiver_info_ssrc4;
-  video_receiver_info_ssrc4.local_stats.push_back(cricket::SsrcReceiverInfo());
-  video_receiver_info_ssrc4.local_stats[0].ssrc = 4;
-  video_receiver_info_ssrc4.frame_width = 0;
-  video_receiver_info_ssrc4.frame_height = 0;
-  video_receiver_info_ssrc4.frames_received = 0;
-  video_receiver_info_ssrc4.frames_decoded = 0;
-  video_receiver_info_ssrc4.frames_rendered = 0;
-
-  test_->CreateMockRtpSendersReceiversAndChannels(
-      {}, {},
-      { std::make_pair(local_video_track.get(), video_sender_info_ssrc1),
-        std::make_pair(local_video_track.get(), video_sender_info_ssrc2) },
-      { std::make_pair(remote_video_track_ssrc3.get(),
-                       video_receiver_info_ssrc3),
-        std::make_pair(remote_video_track_ssrc4.get(),
-                       video_receiver_info_ssrc4) });
-
-  rtc::scoped_refptr<const RTCStatsReport> report = GetStatsReport();
-
-  RTCMediaStreamStats expected_local_stream(
-      "RTCMediaStream_local_LocalStreamLabel", report->timestamp_us());
-  expected_local_stream.stream_identifier = local_stream->label();
-  expected_local_stream.track_ids = std::vector<std::string>({
-      "RTCMediaStreamTrack_local_video_LocalVideoTrackID_1",
-      "RTCMediaStreamTrack_local_video_LocalVideoTrackID_2" });
-  ASSERT_TRUE(report->Get(expected_local_stream.id()));
-  EXPECT_EQ(expected_local_stream,
-            report->Get(expected_local_stream.id())->cast_to<
-                RTCMediaStreamStats>());
-
-  RTCMediaStreamStats expected_remote_stream(
-      "RTCMediaStream_remote_RemoteStreamLabel", report->timestamp_us());
-  expected_remote_stream.stream_identifier = remote_stream->label();
-  expected_remote_stream.track_ids = std::vector<std::string>({
-      "RTCMediaStreamTrack_remote_video_RemoteVideoTrackID3_3",
-      "RTCMediaStreamTrack_remote_video_RemoteVideoTrackID4_4" });
-  ASSERT_TRUE(report->Get(expected_remote_stream.id()));
-  EXPECT_EQ(expected_remote_stream,
-            report->Get(expected_remote_stream.id())->cast_to<
-                RTCMediaStreamStats>());
-
-  RTCMediaStreamTrackStats expected_local_video_track_ssrc1(
-      "RTCMediaStreamTrack_local_video_LocalVideoTrackID_1",
-      report->timestamp_us(), RTCMediaStreamTrackKind::kVideo);
-  expected_local_video_track_ssrc1.track_identifier = local_video_track->id();
-  expected_local_video_track_ssrc1.remote_source = false;
-  expected_local_video_track_ssrc1.ended = false;
-  expected_local_video_track_ssrc1.detached = false;
-  expected_local_video_track_ssrc1.frame_width = 1234;
-  expected_local_video_track_ssrc1.frame_height = 4321;
-  expected_local_video_track_ssrc1.frames_sent = 11;
-  ASSERT_TRUE(report->Get(expected_local_video_track_ssrc1.id()));
-  EXPECT_EQ(expected_local_video_track_ssrc1,
-            report->Get(expected_local_video_track_ssrc1.id())->cast_to<
-                RTCMediaStreamTrackStats>());
-
-  RTCMediaStreamTrackStats expected_local_video_track_ssrc2(
-      "RTCMediaStreamTrack_local_video_LocalVideoTrackID_2",
-      report->timestamp_us(), RTCMediaStreamTrackKind::kVideo);
-  expected_local_video_track_ssrc2.track_identifier = local_video_track->id();
-  expected_local_video_track_ssrc2.remote_source = false;
-  expected_local_video_track_ssrc2.ended = false;
-  expected_local_video_track_ssrc2.detached = false;
-  expected_local_video_track_ssrc2.frame_width = 4321;
-  expected_local_video_track_ssrc2.frame_height = 1234;
-  expected_local_video_track_ssrc2.frames_sent = 22;
-  ASSERT_TRUE(report->Get(expected_local_video_track_ssrc2.id()));
-  EXPECT_EQ(expected_local_video_track_ssrc2,
-            report->Get(expected_local_video_track_ssrc2.id())->cast_to<
-                RTCMediaStreamTrackStats>());
-
-  RTCMediaStreamTrackStats expected_remote_video_track_ssrc3(
-      "RTCMediaStreamTrack_remote_video_RemoteVideoTrackID3_3",
-      report->timestamp_us(), RTCMediaStreamTrackKind::kVideo);
-  expected_remote_video_track_ssrc3.track_identifier =
-      remote_video_track_ssrc3->id();
-  expected_remote_video_track_ssrc3.remote_source = true;
-  expected_remote_video_track_ssrc3.ended = true;
-  expected_remote_video_track_ssrc3.detached = false;
-  expected_remote_video_track_ssrc3.frame_width = 6789;
-  expected_remote_video_track_ssrc3.frame_height = 9876;
-  expected_remote_video_track_ssrc3.frames_received = 1000;
-  expected_remote_video_track_ssrc3.frames_decoded = 995;
-  expected_remote_video_track_ssrc3.frames_dropped = 1000 - 990;
-  ASSERT_TRUE(report->Get(expected_remote_video_track_ssrc3.id()));
-  EXPECT_EQ(expected_remote_video_track_ssrc3,
-            report->Get(expected_remote_video_track_ssrc3.id())->cast_to<
-                RTCMediaStreamTrackStats>());
-
-  RTCMediaStreamTrackStats expected_remote_video_track_ssrc4(
-      "RTCMediaStreamTrack_remote_video_RemoteVideoTrackID4_4",
-      report->timestamp_us(), RTCMediaStreamTrackKind::kVideo);
-  expected_remote_video_track_ssrc4.track_identifier =
-      remote_video_track_ssrc4->id();
-  expected_remote_video_track_ssrc4.remote_source = true;
-  expected_remote_video_track_ssrc4.ended = false;
-  expected_remote_video_track_ssrc4.detached = false;
-  expected_remote_video_track_ssrc4.frames_received = 0;
-  expected_remote_video_track_ssrc4.frames_decoded = 0;
-  expected_remote_video_track_ssrc4.frames_dropped = 0;
-  // Should be undefined: |expected_remote_video_track_ssrc4.frame_width| and
-  // |expected_remote_video_track_ssrc4.frame_height|.
-  ASSERT_TRUE(report->Get(expected_remote_video_track_ssrc4.id()));
-  EXPECT_EQ(expected_remote_video_track_ssrc4,
-            report->Get(expected_remote_video_track_ssrc4.id())->cast_to<
-                RTCMediaStreamTrackStats>());
-}
-
-TEST_F(RTCStatsCollectorTest, CollectRTCInboundRTPStreamStats_Audio) {
-  MockVoiceMediaChannel* voice_media_channel = new MockVoiceMediaChannel();
-  cricket::VoiceChannel voice_channel(
-      test_->worker_thread(), test_->network_thread(),
-      test_->signaling_thread(), test_->media_engine(), voice_media_channel,
-      "VoiceContentName", kDefaultRtcpMuxRequired, kDefaultSrtpRequired);
-
-  test_->SetupRemoteTrackAndReceiver(
-      cricket::MEDIA_TYPE_AUDIO, "RemoteAudioTrackID", 1);
-
-  cricket::VoiceMediaInfo voice_media_info;
-
-  voice_media_info.receivers.push_back(cricket::VoiceReceiverInfo());
-  voice_media_info.receivers[0].local_stats.push_back(
-      cricket::SsrcReceiverInfo());
-  voice_media_info.receivers[0].local_stats[0].ssrc = 1;
-  voice_media_info.receivers[0].packets_lost = 42;
-  voice_media_info.receivers[0].packets_rcvd = 2;
-  voice_media_info.receivers[0].bytes_rcvd = 3;
-  voice_media_info.receivers[0].codec_payload_type = rtc::Optional<int>(42);
-  voice_media_info.receivers[0].jitter_ms = 4500;
-  voice_media_info.receivers[0].fraction_lost = 5.5f;
-
-  RtpCodecParameters codec_parameters;
-  codec_parameters.payload_type = 42;
-  codec_parameters.kind = cricket::MEDIA_TYPE_AUDIO;
-  codec_parameters.name = "dummy";
-  codec_parameters.clock_rate = rtc::Optional<int>(0);
-  voice_media_info.receive_codecs.insert(
-      std::make_pair(codec_parameters.payload_type, codec_parameters));
-
-  EXPECT_CALL(*voice_media_channel, GetStats(_))
-      .WillOnce(DoAll(SetArgPointee<0>(voice_media_info), Return(true)));
-
-  SessionStats session_stats;
-  session_stats.proxy_to_transport["VoiceContentName"] = "TransportName";
-  session_stats.transport_stats["TransportName"].transport_name =
-      "TransportName";
-
-  // Make sure the associated |RTCTransportStats| is created.
-  cricket::TransportChannelStats channel_stats;
-  channel_stats.component = cricket::ICE_CANDIDATE_COMPONENT_RTP;
-  session_stats.transport_stats["TransportName"].channel_stats.push_back(
-      channel_stats);
-
-  EXPECT_CALL(test_->session(), GetStats(_)).WillRepeatedly(Invoke(
-      [&session_stats](const ChannelNamePairs&) {
-        return std::unique_ptr<SessionStats>(new SessionStats(session_stats));
-      }));
-  EXPECT_CALL(test_->session(), voice_channel())
-      .WillRepeatedly(Return(&voice_channel));
-
-  rtc::scoped_refptr<const RTCStatsReport> report = GetStatsReport();
-
-  RTCInboundRTPStreamStats expected_audio(
-      "RTCInboundRTPAudioStream_1", report->timestamp_us());
-  expected_audio.ssrc = 1;
-  expected_audio.is_remote = false;
-  expected_audio.media_type = "audio";
-  expected_audio.track_id =
-      "RTCMediaStreamTrack_remote_audio_RemoteAudioTrackID_1";
-  expected_audio.transport_id = "RTCTransport_TransportName_" +
-      rtc::ToString<>(cricket::ICE_CANDIDATE_COMPONENT_RTP);
-  expected_audio.codec_id = "RTCCodec_InboundAudio_42";
-  expected_audio.packets_received = 2;
-  expected_audio.bytes_received = 3;
-  expected_audio.packets_lost = 42;
-  expected_audio.jitter = 4.5;
-  expected_audio.fraction_lost = 5.5;
-
-  ASSERT_TRUE(report->Get(expected_audio.id()));
-  EXPECT_EQ(
-      report->Get(expected_audio.id())->cast_to<RTCInboundRTPStreamStats>(),
-      expected_audio);
-  EXPECT_TRUE(report->Get(*expected_audio.track_id));
-  EXPECT_TRUE(report->Get(*expected_audio.transport_id));
-  EXPECT_TRUE(report->Get(*expected_audio.codec_id));
-}
-
-TEST_F(RTCStatsCollectorTest, CollectRTCInboundRTPStreamStats_Video) {
-  MockVideoMediaChannel* video_media_channel = new MockVideoMediaChannel();
-  cricket::VideoChannel video_channel(
-      test_->worker_thread(), test_->network_thread(),
-      test_->signaling_thread(), video_media_channel, "VideoContentName",
-      kDefaultRtcpMuxRequired, kDefaultSrtpRequired);
-
-  test_->SetupRemoteTrackAndReceiver(
-      cricket::MEDIA_TYPE_VIDEO, "RemoteVideoTrackID", 1);
-
-  cricket::VideoMediaInfo video_media_info;
-
-  video_media_info.receivers.push_back(cricket::VideoReceiverInfo());
-  video_media_info.receivers[0].local_stats.push_back(
-      cricket::SsrcReceiverInfo());
-  video_media_info.receivers[0].local_stats[0].ssrc = 1;
-  video_media_info.receivers[0].packets_rcvd = 2;
-  video_media_info.receivers[0].packets_lost = 42;
-  video_media_info.receivers[0].bytes_rcvd = 3;
-  video_media_info.receivers[0].fraction_lost = 4.5f;
-  video_media_info.receivers[0].codec_payload_type = rtc::Optional<int>(42);
-  video_media_info.receivers[0].firs_sent = 5;
-  video_media_info.receivers[0].plis_sent = 6;
-  video_media_info.receivers[0].nacks_sent = 7;
-  video_media_info.receivers[0].frames_decoded = 8;
-  video_media_info.receivers[0].qp_sum = rtc::Optional<uint64_t>();
-
-  RtpCodecParameters codec_parameters;
-  codec_parameters.payload_type = 42;
-  codec_parameters.kind = cricket::MEDIA_TYPE_AUDIO;
-  codec_parameters.name = "dummy";
-  codec_parameters.clock_rate = rtc::Optional<int>(0);
-  video_media_info.receive_codecs.insert(
-      std::make_pair(codec_parameters.payload_type, codec_parameters));
-
-  EXPECT_CALL(*video_media_channel, GetStats(_))
-      .WillOnce(DoAll(SetArgPointee<0>(video_media_info), Return(true)));
-
-  SessionStats session_stats;
-  session_stats.proxy_to_transport["VideoContentName"] = "TransportName";
-  session_stats.transport_stats["TransportName"].transport_name =
-      "TransportName";
-
-  // Make sure the associated |RTCTransportStats| is created.
-  cricket::TransportChannelStats channel_stats;
-  channel_stats.component = cricket::ICE_CANDIDATE_COMPONENT_RTP;
-  session_stats.transport_stats["TransportName"].channel_stats.push_back(
-      channel_stats);
-
-  EXPECT_CALL(test_->session(), GetStats(_)).WillRepeatedly(Invoke(
-      [&session_stats](const ChannelNamePairs&) {
-        return std::unique_ptr<SessionStats>(new SessionStats(session_stats));
-      }));
-  EXPECT_CALL(test_->session(), video_channel())
-      .WillRepeatedly(Return(&video_channel));
-
-  rtc::scoped_refptr<const RTCStatsReport> report = GetStatsReport();
-
-  RTCInboundRTPStreamStats expected_video(
-      "RTCInboundRTPVideoStream_1", report->timestamp_us());
-  expected_video.ssrc = 1;
-  expected_video.is_remote = false;
-  expected_video.media_type = "video";
-  expected_video.track_id =
-      "RTCMediaStreamTrack_remote_video_RemoteVideoTrackID_1";
-  expected_video.transport_id = "RTCTransport_TransportName_" +
-      rtc::ToString<>(cricket::ICE_CANDIDATE_COMPONENT_RTP);
-  expected_video.codec_id = "RTCCodec_InboundVideo_42";
-  expected_video.fir_count = 5;
-  expected_video.pli_count = 6;
-  expected_video.nack_count = 7;
-  expected_video.packets_received = 2;
-  expected_video.bytes_received = 3;
-  expected_video.packets_lost = 42;
-  expected_video.fraction_lost = 4.5;
-  expected_video.frames_decoded = 8;
-  // |expected_video.qp_sum| should be undefined.
-
-  ASSERT_TRUE(report->Get(expected_video.id()));
-  EXPECT_EQ(
-      report->Get(expected_video.id())->cast_to<RTCInboundRTPStreamStats>(),
-      expected_video);
-
-  // Set previously undefined values and "GetStats" again.
-  video_media_info.receivers[0].qp_sum = rtc::Optional<uint64_t>(9);
-  expected_video.qp_sum = 9;
-
-  EXPECT_CALL(*video_media_channel, GetStats(_))
-      .WillOnce(DoAll(SetArgPointee<0>(video_media_info), Return(true)));
-  collector_->ClearCachedStatsReport();
-  report = GetStatsReport();
-
-  ASSERT_TRUE(report->Get(expected_video.id()));
-  EXPECT_EQ(
-      report->Get(expected_video.id())->cast_to<RTCInboundRTPStreamStats>(),
-      expected_video);
-  EXPECT_TRUE(report->Get(*expected_video.track_id));
-  EXPECT_TRUE(report->Get(*expected_video.transport_id));
-  EXPECT_TRUE(report->Get(*expected_video.codec_id));
-}
-
-TEST_F(RTCStatsCollectorTest, CollectRTCOutboundRTPStreamStats_Audio) {
-  MockVoiceMediaChannel* voice_media_channel = new MockVoiceMediaChannel();
-  cricket::VoiceChannel voice_channel(
-      test_->worker_thread(), test_->network_thread(),
-      test_->signaling_thread(), test_->media_engine(), voice_media_channel,
-      "VoiceContentName", kDefaultRtcpMuxRequired, kDefaultSrtpRequired);
-
-  test_->SetupLocalTrackAndSender(
-      cricket::MEDIA_TYPE_AUDIO, "LocalAudioTrackID", 1);
-
-  cricket::VoiceMediaInfo voice_media_info;
-
-  voice_media_info.senders.push_back(cricket::VoiceSenderInfo());
-  voice_media_info.senders[0].local_stats.push_back(cricket::SsrcSenderInfo());
-  voice_media_info.senders[0].local_stats[0].ssrc = 1;
-  voice_media_info.senders[0].packets_sent = 2;
-  voice_media_info.senders[0].bytes_sent = 3;
-  voice_media_info.senders[0].codec_payload_type = rtc::Optional<int>(42);
-
-  RtpCodecParameters codec_parameters;
-  codec_parameters.payload_type = 42;
-  codec_parameters.kind = cricket::MEDIA_TYPE_AUDIO;
-  codec_parameters.name = "dummy";
-  codec_parameters.clock_rate = rtc::Optional<int>(0);
-  voice_media_info.send_codecs.insert(
-      std::make_pair(codec_parameters.payload_type, codec_parameters));
-
-  EXPECT_CALL(*voice_media_channel, GetStats(_))
-      .WillOnce(DoAll(SetArgPointee<0>(voice_media_info), Return(true)));
-
-  SessionStats session_stats;
-  session_stats.proxy_to_transport["VoiceContentName"] = "TransportName";
-  session_stats.transport_stats["TransportName"].transport_name =
-      "TransportName";
-
-  // Make sure the associated |RTCTransportStats| is created.
-  cricket::TransportChannelStats channel_stats;
-  channel_stats.component = cricket::ICE_CANDIDATE_COMPONENT_RTP;
-  session_stats.transport_stats["TransportName"].channel_stats.push_back(
-      channel_stats);
-
-  EXPECT_CALL(test_->session(), GetStats(_)).WillRepeatedly(Invoke(
-      [&session_stats](const ChannelNamePairs&) {
-        return std::unique_ptr<SessionStats>(new SessionStats(session_stats));
-      }));
-  EXPECT_CALL(test_->session(), voice_channel())
-      .WillRepeatedly(Return(&voice_channel));
-
-  rtc::scoped_refptr<const RTCStatsReport> report = GetStatsReport();
-
-  RTCOutboundRTPStreamStats expected_audio(
-      "RTCOutboundRTPAudioStream_1", report->timestamp_us());
-  expected_audio.ssrc = 1;
-  expected_audio.is_remote = false;
-  expected_audio.media_type = "audio";
-  expected_audio.track_id =
-      "RTCMediaStreamTrack_local_audio_LocalAudioTrackID_1";
-  expected_audio.transport_id = "RTCTransport_TransportName_" +
-      rtc::ToString<>(cricket::ICE_CANDIDATE_COMPONENT_RTP);
-  expected_audio.codec_id = "RTCCodec_OutboundAudio_42";
-  expected_audio.packets_sent = 2;
-  expected_audio.bytes_sent = 3;
-
-  ASSERT_TRUE(report->Get(expected_audio.id()));
-  EXPECT_EQ(
-      report->Get(expected_audio.id())->cast_to<RTCOutboundRTPStreamStats>(),
-      expected_audio);
-
-  ASSERT_TRUE(report->Get(expected_audio.id()));
-  EXPECT_EQ(
-      report->Get(expected_audio.id())->cast_to<RTCOutboundRTPStreamStats>(),
-      expected_audio);
-  EXPECT_TRUE(report->Get(*expected_audio.track_id));
-  EXPECT_TRUE(report->Get(*expected_audio.transport_id));
-  EXPECT_TRUE(report->Get(*expected_audio.codec_id));
-}
-
-TEST_F(RTCStatsCollectorTest, CollectRTCOutboundRTPStreamStats_Video) {
-  MockVideoMediaChannel* video_media_channel = new MockVideoMediaChannel();
-  cricket::VideoChannel video_channel(
-      test_->worker_thread(), test_->network_thread(),
-      test_->signaling_thread(), video_media_channel, "VideoContentName",
-      kDefaultRtcpMuxRequired, kDefaultSrtpRequired);
-
-  test_->SetupLocalTrackAndSender(
-      cricket::MEDIA_TYPE_VIDEO, "LocalVideoTrackID", 1);
-
-  cricket::VideoMediaInfo video_media_info;
-
-  video_media_info.senders.push_back(cricket::VideoSenderInfo());
-  video_media_info.senders[0].local_stats.push_back(cricket::SsrcSenderInfo());
-  video_media_info.senders[0].local_stats[0].ssrc = 1;
-  video_media_info.senders[0].firs_rcvd = 2;
-  video_media_info.senders[0].plis_rcvd = 3;
-  video_media_info.senders[0].nacks_rcvd = 4;
-  video_media_info.senders[0].packets_sent = 5;
-  video_media_info.senders[0].bytes_sent = 6;
-  video_media_info.senders[0].codec_payload_type = rtc::Optional<int>(42);
-  video_media_info.senders[0].frames_encoded = 8;
-  video_media_info.senders[0].qp_sum = rtc::Optional<uint64_t>();
-
-  RtpCodecParameters codec_parameters;
-  codec_parameters.payload_type = 42;
-  codec_parameters.kind = cricket::MEDIA_TYPE_AUDIO;
-  codec_parameters.name = "dummy";
-  codec_parameters.clock_rate = rtc::Optional<int>(0);
-  video_media_info.send_codecs.insert(
-      std::make_pair(codec_parameters.payload_type, codec_parameters));
-
-  EXPECT_CALL(*video_media_channel, GetStats(_))
-      .WillOnce(DoAll(SetArgPointee<0>(video_media_info), Return(true)));
-
-  SessionStats session_stats;
-  session_stats.proxy_to_transport["VideoContentName"] = "TransportName";
-  session_stats.transport_stats["TransportName"].transport_name =
-      "TransportName";
-
-  // Make sure the associated |RTCTransportStats| is created.
-  cricket::TransportChannelStats channel_stats;
-  channel_stats.component = cricket::ICE_CANDIDATE_COMPONENT_RTP;
-  session_stats.transport_stats["TransportName"].channel_stats.push_back(
-      channel_stats);
-
-  EXPECT_CALL(test_->session(), GetStats(_)).WillRepeatedly(Invoke(
-      [&session_stats](const ChannelNamePairs&) {
-        return std::unique_ptr<SessionStats>(new SessionStats(session_stats));
-      }));
-  EXPECT_CALL(test_->session(), video_channel())
-      .WillRepeatedly(Return(&video_channel));
-
-  rtc::scoped_refptr<const RTCStatsReport> report = GetStatsReport();
-
-  RTCOutboundRTPStreamStats expected_video(
-      "RTCOutboundRTPVideoStream_1", report->timestamp_us());
-  expected_video.ssrc = 1;
-  expected_video.is_remote = false;
-  expected_video.media_type = "video";
-  expected_video.track_id =
-      "RTCMediaStreamTrack_local_video_LocalVideoTrackID_1";
-  expected_video.transport_id = "RTCTransport_TransportName_" +
-      rtc::ToString<>(cricket::ICE_CANDIDATE_COMPONENT_RTP);
-  expected_video.codec_id = "RTCCodec_OutboundVideo_42";
-  expected_video.fir_count = 2;
-  expected_video.pli_count = 3;
-  expected_video.nack_count = 4;
-  expected_video.packets_sent = 5;
-  expected_video.bytes_sent = 6;
-  expected_video.frames_encoded = 8;
-  // |expected_video.qp_sum| should be undefined.
-
-  ASSERT_TRUE(report->Get(expected_video.id()));
-  EXPECT_EQ(
-      report->Get(expected_video.id())->cast_to<RTCOutboundRTPStreamStats>(),
-      expected_video);
-
-  // Set previously undefined values and "GetStats" again.
-  video_media_info.senders[0].qp_sum = rtc::Optional<uint64_t>(9);
-  expected_video.qp_sum = 9;
-
-  EXPECT_CALL(*video_media_channel, GetStats(_))
-      .WillOnce(DoAll(SetArgPointee<0>(video_media_info), Return(true)));
-  collector_->ClearCachedStatsReport();
-  report = GetStatsReport();
-
-  ASSERT_TRUE(report->Get(expected_video.id()));
-  EXPECT_EQ(
-      report->Get(expected_video.id())->cast_to<RTCOutboundRTPStreamStats>(),
-      expected_video);
-  EXPECT_TRUE(report->Get(*expected_video.track_id));
-  EXPECT_TRUE(report->Get(*expected_video.transport_id));
-  EXPECT_TRUE(report->Get(*expected_video.codec_id));
-}
-
-TEST_F(RTCStatsCollectorTest, CollectRTCTransportStats) {
-  std::unique_ptr<cricket::Candidate> rtp_local_candidate = CreateFakeCandidate(
-      "42.42.42.42", 42, "protocol", cricket::LOCAL_PORT_TYPE, 42);
-  std::unique_ptr<cricket::Candidate> rtp_remote_candidate =
-      CreateFakeCandidate("42.42.42.42", 42, "protocol",
-                          cricket::LOCAL_PORT_TYPE, 42);
-  std::unique_ptr<cricket::Candidate> rtcp_local_candidate =
-      CreateFakeCandidate("42.42.42.42", 42, "protocol",
-                          cricket::LOCAL_PORT_TYPE, 42);
-  std::unique_ptr<cricket::Candidate> rtcp_remote_candidate =
-      CreateFakeCandidate("42.42.42.42", 42, "protocol",
-                          cricket::LOCAL_PORT_TYPE, 42);
-
-  SessionStats session_stats;
-  session_stats.transport_stats["transport"].transport_name = "transport";
-
-  cricket::ConnectionInfo rtp_connection_info;
-  rtp_connection_info.best_connection = false;
-  rtp_connection_info.local_candidate = *rtp_local_candidate.get();
-  rtp_connection_info.remote_candidate = *rtp_remote_candidate.get();
-  rtp_connection_info.sent_total_bytes = 42;
-  rtp_connection_info.recv_total_bytes = 1337;
-  cricket::TransportChannelStats rtp_transport_channel_stats;
-  rtp_transport_channel_stats.component = cricket::ICE_CANDIDATE_COMPONENT_RTP;
-  rtp_transport_channel_stats.connection_infos.push_back(rtp_connection_info);
-  rtp_transport_channel_stats.dtls_state = cricket::DTLS_TRANSPORT_NEW;
-  session_stats.transport_stats["transport"].channel_stats.push_back(
-      rtp_transport_channel_stats);
-
-
-  // Mock the session to return the desired candidates.
-  EXPECT_CALL(test_->session(), GetStats(_)).WillRepeatedly(Invoke(
-      [&session_stats](const ChannelNamePairs&) {
-        return std::unique_ptr<SessionStats>(new SessionStats(session_stats));
-      }));
-
-  // Get stats without RTCP, an active connection or certificates.
-  rtc::scoped_refptr<const RTCStatsReport> report = GetStatsReport();
-
-  RTCTransportStats expected_rtp_transport(
-      "RTCTransport_transport_" +
-          rtc::ToString<>(cricket::ICE_CANDIDATE_COMPONENT_RTP),
-      report->timestamp_us());
-  expected_rtp_transport.bytes_sent = 42;
-  expected_rtp_transport.bytes_received = 1337;
-  expected_rtp_transport.dtls_state = RTCDtlsTransportState::kNew;
-
-  ASSERT_TRUE(report->Get(expected_rtp_transport.id()));
-  EXPECT_EQ(
-      expected_rtp_transport,
-      report->Get(expected_rtp_transport.id())->cast_to<RTCTransportStats>());
-
-  cricket::ConnectionInfo rtcp_connection_info;
-  rtcp_connection_info.best_connection = false;
-  rtcp_connection_info.local_candidate = *rtcp_local_candidate.get();
-  rtcp_connection_info.remote_candidate = *rtcp_remote_candidate.get();
-  rtcp_connection_info.sent_total_bytes = 1337;
-  rtcp_connection_info.recv_total_bytes = 42;
-  cricket::TransportChannelStats rtcp_transport_channel_stats;
-  rtcp_transport_channel_stats.component =
-      cricket::ICE_CANDIDATE_COMPONENT_RTCP;
-  rtcp_transport_channel_stats.connection_infos.push_back(rtcp_connection_info);
-  rtcp_transport_channel_stats.dtls_state = cricket::DTLS_TRANSPORT_CONNECTING;
-  session_stats.transport_stats["transport"].channel_stats.push_back(
-      rtcp_transport_channel_stats);
-
-  collector_->ClearCachedStatsReport();
-  // Get stats with RTCP and without an active connection or certificates.
-  report = GetStatsReport();
-
-  RTCTransportStats expected_rtcp_transport(
-      "RTCTransport_transport_" +
-          rtc::ToString<>(cricket::ICE_CANDIDATE_COMPONENT_RTCP),
-      report->timestamp_us());
-  expected_rtcp_transport.bytes_sent = 1337;
-  expected_rtcp_transport.bytes_received = 42;
-  expected_rtcp_transport.dtls_state = RTCDtlsTransportState::kConnecting;
-
-  expected_rtp_transport.rtcp_transport_stats_id = expected_rtcp_transport.id();
-
-  ASSERT_TRUE(report->Get(expected_rtp_transport.id()));
-  EXPECT_EQ(
-      expected_rtp_transport,
-      report->Get(expected_rtp_transport.id())->cast_to<RTCTransportStats>());
-  ASSERT_TRUE(report->Get(expected_rtcp_transport.id()));
-  EXPECT_EQ(
-      expected_rtcp_transport,
-      report->Get(expected_rtcp_transport.id())->cast_to<RTCTransportStats>());
-
-  // Get stats with an active connection (selected candidate pair).
-  session_stats.transport_stats["transport"]
-      .channel_stats[1]
-      .connection_infos[0]
-      .best_connection = true;
-
-  collector_->ClearCachedStatsReport();
-  report = GetStatsReport();
-
-  expected_rtcp_transport.selected_candidate_pair_id =
-      "RTCIceCandidatePair_" + rtcp_local_candidate->id() + "_" +
-      rtcp_remote_candidate->id();
-
-  ASSERT_TRUE(report->Get(expected_rtp_transport.id()));
-  EXPECT_EQ(
-      expected_rtp_transport,
-      report->Get(expected_rtp_transport.id())->cast_to<RTCTransportStats>());
-  ASSERT_TRUE(report->Get(expected_rtcp_transport.id()));
-  EXPECT_EQ(
-      expected_rtcp_transport,
-      report->Get(expected_rtcp_transport.id())->cast_to<RTCTransportStats>());
-
-  // Get stats with certificates.
-  std::unique_ptr<CertificateInfo> local_certinfo =
-      CreateFakeCertificateAndInfoFromDers(
-          std::vector<std::string>({ "(local) local", "(local) chain" }));
-  std::unique_ptr<CertificateInfo> remote_certinfo =
-      CreateFakeCertificateAndInfoFromDers(
-          std::vector<std::string>({ "(remote) local", "(remote) chain" }));
-  EXPECT_CALL(test_->session(), GetLocalCertificate(_, _)).WillRepeatedly(
-    Invoke([&local_certinfo](const std::string& transport_name,
-           rtc::scoped_refptr<rtc::RTCCertificate>* certificate) {
-      if (transport_name == "transport") {
-        *certificate = local_certinfo->certificate;
-        return true;
-      }
-      return false;
-    }));
-  EXPECT_CALL(test_->session(),
-      GetRemoteSSLCertificate_ReturnsRawPointer(_)).WillRepeatedly(Invoke(
-      [&remote_certinfo](const std::string& transport_name) {
-        if (transport_name == "transport")
-          return remote_certinfo->certificate->ssl_certificate().GetReference();
-        return static_cast<rtc::SSLCertificate*>(nullptr);
-      }));
-
-  collector_->ClearCachedStatsReport();
-  report = GetStatsReport();
-
-  expected_rtp_transport.local_certificate_id =
-      "RTCCertificate_" + local_certinfo->fingerprints[0];
-  expected_rtp_transport.remote_certificate_id =
-      "RTCCertificate_" + remote_certinfo->fingerprints[0];
-
-  expected_rtcp_transport.local_certificate_id =
-      *expected_rtp_transport.local_certificate_id;
-  expected_rtcp_transport.remote_certificate_id =
-      *expected_rtp_transport.remote_certificate_id;
-
-  ASSERT_TRUE(report->Get(expected_rtp_transport.id()));
-  EXPECT_EQ(
-      expected_rtp_transport,
-      report->Get(expected_rtp_transport.id())->cast_to<RTCTransportStats>());
-  ASSERT_TRUE(report->Get(expected_rtcp_transport.id()));
-  EXPECT_EQ(
-      expected_rtcp_transport,
-      report->Get(expected_rtcp_transport.id())->cast_to<RTCTransportStats>());
-}
-
-class RTCStatsCollectorTestWithFakeCollector : public testing::Test {
- public:
-  RTCStatsCollectorTestWithFakeCollector()
-    : test_(new rtc::RefCountedObject<RTCStatsCollectorTestHelper>()),
-      collector_(FakeRTCStatsCollector::Create(
-          &test_->pc(), 50 * rtc::kNumMicrosecsPerMillisec)) {
-  }
-
- protected:
-  rtc::scoped_refptr<RTCStatsCollectorTestHelper> test_;
-  rtc::scoped_refptr<FakeRTCStatsCollector> collector_;
-};
-
-TEST_F(RTCStatsCollectorTestWithFakeCollector, ThreadUsageAndResultsMerging) {
-  collector_->VerifyThreadUsageAndResultsMerging();
-}
-
-}  // namespace
-
-}  // namespace webrtc
diff --git a/pc/rtpreceiver.cc b/pc/rtpreceiver.cc
deleted file mode 100644
index 99c4010..0000000
--- a/pc/rtpreceiver.cc
+++ /dev/null
@@ -1,244 +0,0 @@
-/*
- *  Copyright 2015 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/pc/rtpreceiver.h"
-
-#include "webrtc/api/mediastreamtrackproxy.h"
-#include "webrtc/api/videosourceproxy.h"
-#include "webrtc/pc/audiotrack.h"
-#include "webrtc/pc/videotrack.h"
-#include "webrtc/rtc_base/trace_event.h"
-
-namespace webrtc {
-
-AudioRtpReceiver::AudioRtpReceiver(const std::string& track_id,
-                                   uint32_t ssrc,
-                                   cricket::VoiceChannel* channel)
-    : id_(track_id),
-      ssrc_(ssrc),
-      channel_(channel),
-      track_(AudioTrackProxy::Create(
-          rtc::Thread::Current(),
-          AudioTrack::Create(track_id,
-                             RemoteAudioSource::Create(ssrc, channel)))),
-      cached_track_enabled_(track_->enabled()) {
-  RTC_DCHECK(track_->GetSource()->remote());
-  track_->RegisterObserver(this);
-  track_->GetSource()->RegisterAudioObserver(this);
-  Reconfigure();
-  if (channel_) {
-    channel_->SignalFirstPacketReceived.connect(
-        this, &AudioRtpReceiver::OnFirstPacketReceived);
-  }
-}
-
-AudioRtpReceiver::~AudioRtpReceiver() {
-  track_->GetSource()->UnregisterAudioObserver(this);
-  track_->UnregisterObserver(this);
-  Stop();
-}
-
-void AudioRtpReceiver::OnChanged() {
-  if (cached_track_enabled_ != track_->enabled()) {
-    cached_track_enabled_ = track_->enabled();
-    Reconfigure();
-  }
-}
-
-void AudioRtpReceiver::OnSetVolume(double volume) {
-  RTC_DCHECK_GE(volume, 0);
-  RTC_DCHECK_LE(volume, 10);
-  cached_volume_ = volume;
-  if (!channel_) {
-    LOG(LS_ERROR) << "AudioRtpReceiver::OnSetVolume: No audio channel exists.";
-    return;
-  }
-  // When the track is disabled, the volume of the source, which is the
-  // corresponding WebRtc Voice Engine channel will be 0. So we do not allow
-  // setting the volume to the source when the track is disabled.
-  if (!stopped_ && track_->enabled()) {
-    if (!channel_->SetOutputVolume(ssrc_, cached_volume_)) {
-      RTC_NOTREACHED();
-    }
-  }
-}
-
-RtpParameters AudioRtpReceiver::GetParameters() const {
-  if (!channel_ || stopped_) {
-    return RtpParameters();
-  }
-  return channel_->GetRtpReceiveParameters(ssrc_);
-}
-
-bool AudioRtpReceiver::SetParameters(const RtpParameters& parameters) {
-  TRACE_EVENT0("webrtc", "AudioRtpReceiver::SetParameters");
-  if (!channel_ || stopped_) {
-    return false;
-  }
-  return channel_->SetRtpReceiveParameters(ssrc_, parameters);
-}
-
-void AudioRtpReceiver::Stop() {
-  // TODO(deadbeef): Need to do more here to fully stop receiving packets.
-  if (stopped_) {
-    return;
-  }
-  if (channel_) {
-    // Allow that SetOutputVolume fail. This is the normal case when the
-    // underlying media channel has already been deleted.
-    channel_->SetOutputVolume(ssrc_, 0);
-  }
-  stopped_ = true;
-}
-
-std::vector<RtpSource> AudioRtpReceiver::GetSources() const {
-  return channel_->GetSources(ssrc_);
-}
-
-void AudioRtpReceiver::Reconfigure() {
-  RTC_DCHECK(!stopped_);
-  if (!channel_) {
-    LOG(LS_ERROR) << "AudioRtpReceiver::Reconfigure: No audio channel exists.";
-    return;
-  }
-  if (!channel_->SetOutputVolume(ssrc_,
-                                 track_->enabled() ? cached_volume_ : 0)) {
-    RTC_NOTREACHED();
-  }
-}
-
-void AudioRtpReceiver::SetObserver(RtpReceiverObserverInterface* observer) {
-  observer_ = observer;
-  // Deliver any notifications the observer may have missed by being set late.
-  if (received_first_packet_ && observer_) {
-    observer_->OnFirstPacketReceived(media_type());
-  }
-}
-
-void AudioRtpReceiver::SetChannel(cricket::VoiceChannel* channel) {
-  if (channel_) {
-    channel_->SignalFirstPacketReceived.disconnect(this);
-  }
-  channel_ = channel;
-  if (channel_) {
-    channel_->SignalFirstPacketReceived.connect(
-        this, &AudioRtpReceiver::OnFirstPacketReceived);
-  }
-}
-
-void AudioRtpReceiver::OnFirstPacketReceived(cricket::BaseChannel* channel) {
-  if (observer_) {
-    observer_->OnFirstPacketReceived(media_type());
-  }
-  received_first_packet_ = true;
-}
-
-VideoRtpReceiver::VideoRtpReceiver(const std::string& track_id,
-                                   rtc::Thread* worker_thread,
-                                   uint32_t ssrc,
-                                   cricket::VideoChannel* channel)
-    : id_(track_id),
-      ssrc_(ssrc),
-      channel_(channel),
-      source_(new RefCountedObject<VideoTrackSource>(&broadcaster_,
-                                                     true /* remote */)),
-      track_(VideoTrackProxy::Create(
-          rtc::Thread::Current(),
-          worker_thread,
-          VideoTrack::Create(
-              track_id,
-              VideoTrackSourceProxy::Create(rtc::Thread::Current(),
-                                            worker_thread,
-                                            source_),
-              worker_thread))) {
-  source_->SetState(MediaSourceInterface::kLive);
-  if (!channel_) {
-    LOG(LS_ERROR)
-        << "VideoRtpReceiver::VideoRtpReceiver: No video channel exists.";
-  } else {
-    if (!channel_->SetSink(ssrc_, &broadcaster_)) {
-      RTC_NOTREACHED();
-    }
-  }
-  if (channel_) {
-    channel_->SignalFirstPacketReceived.connect(
-        this, &VideoRtpReceiver::OnFirstPacketReceived);
-  }
-}
-
-VideoRtpReceiver::~VideoRtpReceiver() {
-  // Since cricket::VideoRenderer is not reference counted,
-  // we need to remove it from the channel before we are deleted.
-  Stop();
-}
-
-RtpParameters VideoRtpReceiver::GetParameters() const {
-  if (!channel_ || stopped_) {
-    return RtpParameters();
-  }
-  return channel_->GetRtpReceiveParameters(ssrc_);
-}
-
-bool VideoRtpReceiver::SetParameters(const RtpParameters& parameters) {
-  TRACE_EVENT0("webrtc", "VideoRtpReceiver::SetParameters");
-  if (!channel_ || stopped_) {
-    return false;
-  }
-  return channel_->SetRtpReceiveParameters(ssrc_, parameters);
-}
-
-void VideoRtpReceiver::Stop() {
-  // TODO(deadbeef): Need to do more here to fully stop receiving packets.
-  if (stopped_) {
-    return;
-  }
-  source_->SetState(MediaSourceInterface::kEnded);
-  source_->OnSourceDestroyed();
-  if (!channel_) {
-    LOG(LS_WARNING) << "VideoRtpReceiver::Stop: No video channel exists.";
-  } else {
-    // Allow that SetSink fail. This is the normal case when the underlying
-    // media channel has already been deleted.
-    channel_->SetSink(ssrc_, nullptr);
-  }
-  stopped_ = true;
-}
-
-void VideoRtpReceiver::SetObserver(RtpReceiverObserverInterface* observer) {
-  observer_ = observer;
-  // Deliver any notifications the observer may have missed by being set late.
-  if (received_first_packet_ && observer_) {
-    observer_->OnFirstPacketReceived(media_type());
-  }
-}
-
-void VideoRtpReceiver::SetChannel(cricket::VideoChannel* channel) {
-  if (channel_) {
-    channel_->SignalFirstPacketReceived.disconnect(this);
-    channel_->SetSink(ssrc_, nullptr);
-  }
-  channel_ = channel;
-  if (channel_) {
-    if (!channel_->SetSink(ssrc_, &broadcaster_)) {
-      RTC_NOTREACHED();
-    }
-    channel_->SignalFirstPacketReceived.connect(
-        this, &VideoRtpReceiver::OnFirstPacketReceived);
-  }
-}
-
-void VideoRtpReceiver::OnFirstPacketReceived(cricket::BaseChannel* channel) {
-  if (observer_) {
-    observer_->OnFirstPacketReceived(media_type());
-  }
-  received_first_packet_ = true;
-}
-
-}  // namespace webrtc
diff --git a/pc/rtpreceiver.h b/pc/rtpreceiver.h
deleted file mode 100644
index 9809b73..0000000
--- a/pc/rtpreceiver.h
+++ /dev/null
@@ -1,169 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-// This file contains classes that implement RtpReceiverInterface.
-// An RtpReceiver associates a MediaStreamTrackInterface with an underlying
-// transport (provided by cricket::VoiceChannel/cricket::VideoChannel)
-
-#ifndef WEBRTC_PC_RTPRECEIVER_H_
-#define WEBRTC_PC_RTPRECEIVER_H_
-
-#include <stdint.h>
-
-#include <string>
-
-#include "webrtc/api/mediastreaminterface.h"
-#include "webrtc/api/rtpreceiverinterface.h"
-#include "webrtc/media/base/videobroadcaster.h"
-#include "webrtc/pc/channel.h"
-#include "webrtc/pc/remoteaudiosource.h"
-#include "webrtc/pc/videotracksource.h"
-#include "webrtc/rtc_base/basictypes.h"
-#include "webrtc/rtc_base/sigslot.h"
-
-namespace webrtc {
-
-// Internal class used by PeerConnection.
-class RtpReceiverInternal : public RtpReceiverInterface {
- public:
-  virtual void Stop() = 0;
-  // This SSRC is used as an identifier for the receiver between the API layer
-  // and the WebRtcVideoEngine, WebRtcVoiceEngine layer.
-  virtual uint32_t ssrc() const = 0;
-};
-
-class AudioRtpReceiver : public ObserverInterface,
-                         public AudioSourceInterface::AudioObserver,
-                         public rtc::RefCountedObject<RtpReceiverInternal>,
-                         public sigslot::has_slots<> {
- public:
-  // An SSRC of 0 will create a receiver that will match the first SSRC it
-  // sees.
-  // TODO(deadbeef): Use rtc::Optional, or have another constructor that
-  // doesn't take an SSRC, and make this one DCHECK(ssrc != 0).
-  AudioRtpReceiver(const std::string& track_id,
-                   uint32_t ssrc,
-                   cricket::VoiceChannel* channel);
-
-  virtual ~AudioRtpReceiver();
-
-  // ObserverInterface implementation
-  void OnChanged() override;
-
-  // AudioSourceInterface::AudioObserver implementation
-  void OnSetVolume(double volume) override;
-
-  rtc::scoped_refptr<AudioTrackInterface> audio_track() const {
-    return track_.get();
-  }
-
-  // RtpReceiverInterface implementation
-  rtc::scoped_refptr<MediaStreamTrackInterface> track() const override {
-    return track_.get();
-  }
-
-  cricket::MediaType media_type() const override {
-    return cricket::MEDIA_TYPE_AUDIO;
-  }
-
-  std::string id() const override { return id_; }
-
-  RtpParameters GetParameters() const override;
-  bool SetParameters(const RtpParameters& parameters) override;
-
-  // RtpReceiverInternal implementation.
-  void Stop() override;
-  uint32_t ssrc() const override { return ssrc_; }
-
-  void SetObserver(RtpReceiverObserverInterface* observer) override;
-
-  // Does not take ownership.
-  // Should call SetChannel(nullptr) before |channel| is destroyed.
-  void SetChannel(cricket::VoiceChannel* channel);
-
-  std::vector<RtpSource> GetSources() const override;
-
- private:
-  void Reconfigure();
-  void OnFirstPacketReceived(cricket::BaseChannel* channel);
-
-  const std::string id_;
-  const uint32_t ssrc_;
-  cricket::VoiceChannel* channel_;
-  const rtc::scoped_refptr<AudioTrackInterface> track_;
-  bool cached_track_enabled_;
-  double cached_volume_ = 1;
-  bool stopped_ = false;
-  RtpReceiverObserverInterface* observer_ = nullptr;
-  bool received_first_packet_ = false;
-};
-
-class VideoRtpReceiver : public rtc::RefCountedObject<RtpReceiverInternal>,
-                         public sigslot::has_slots<> {
- public:
-  // An SSRC of 0 will create a receiver that will match the first SSRC it
-  // sees.
-  VideoRtpReceiver(const std::string& track_id,
-                   rtc::Thread* worker_thread,
-                   uint32_t ssrc,
-                   cricket::VideoChannel* channel);
-
-  virtual ~VideoRtpReceiver();
-
-  rtc::scoped_refptr<VideoTrackInterface> video_track() const {
-    return track_.get();
-  }
-
-  // RtpReceiverInterface implementation
-  rtc::scoped_refptr<MediaStreamTrackInterface> track() const override {
-    return track_.get();
-  }
-
-  cricket::MediaType media_type() const override {
-    return cricket::MEDIA_TYPE_VIDEO;
-  }
-
-  std::string id() const override { return id_; }
-
-  RtpParameters GetParameters() const override;
-  bool SetParameters(const RtpParameters& parameters) override;
-
-  // RtpReceiverInternal implementation.
-  void Stop() override;
-  uint32_t ssrc() const override { return ssrc_; }
-
-  void SetObserver(RtpReceiverObserverInterface* observer) override;
-
-  // Does not take ownership.
-  // Should call SetChannel(nullptr) before |channel| is destroyed.
-  void SetChannel(cricket::VideoChannel* channel);
-
- private:
-  void OnFirstPacketReceived(cricket::BaseChannel* channel);
-
-  std::string id_;
-  uint32_t ssrc_;
-  cricket::VideoChannel* channel_;
-  // |broadcaster_| is needed since the decoder can only handle one sink.
-  // It might be better if the decoder can handle multiple sinks and consider
-  // the VideoSinkWants.
-  rtc::VideoBroadcaster broadcaster_;
-  // |source_| is held here to be able to change the state of the source when
-  // the VideoRtpReceiver is stopped.
-  rtc::scoped_refptr<VideoTrackSource> source_;
-  rtc::scoped_refptr<VideoTrackInterface> track_;
-  bool stopped_ = false;
-  RtpReceiverObserverInterface* observer_ = nullptr;
-  bool received_first_packet_ = false;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_PC_RTPRECEIVER_H_
diff --git a/pc/rtpsender.cc b/pc/rtpsender.cc
deleted file mode 100644
index c95befd..0000000
--- a/pc/rtpsender.cc
+++ /dev/null
@@ -1,484 +0,0 @@
-/*
- *  Copyright 2015 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/pc/rtpsender.h"
-
-#include "webrtc/api/mediastreaminterface.h"
-#include "webrtc/pc/localaudiosource.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/helpers.h"
-#include "webrtc/rtc_base/trace_event.h"
-
-namespace webrtc {
-
-LocalAudioSinkAdapter::LocalAudioSinkAdapter() : sink_(nullptr) {}
-
-LocalAudioSinkAdapter::~LocalAudioSinkAdapter() {
-  rtc::CritScope lock(&lock_);
-  if (sink_)
-    sink_->OnClose();
-}
-
-void LocalAudioSinkAdapter::OnData(const void* audio_data,
-                                   int bits_per_sample,
-                                   int sample_rate,
-                                   size_t number_of_channels,
-                                   size_t number_of_frames) {
-  rtc::CritScope lock(&lock_);
-  if (sink_) {
-    sink_->OnData(audio_data, bits_per_sample, sample_rate, number_of_channels,
-                  number_of_frames);
-  }
-}
-
-void LocalAudioSinkAdapter::SetSink(cricket::AudioSource::Sink* sink) {
-  rtc::CritScope lock(&lock_);
-  RTC_DCHECK(!sink || !sink_);
-  sink_ = sink;
-}
-
-AudioRtpSender::AudioRtpSender(AudioTrackInterface* track,
-                               const std::vector<std::string>& stream_ids,
-                               cricket::VoiceChannel* channel,
-                               StatsCollector* stats)
-    : id_(track->id()),
-      stream_ids_(stream_ids),
-      channel_(channel),
-      stats_(stats),
-      track_(track),
-      cached_track_enabled_(track->enabled()),
-      sink_adapter_(new LocalAudioSinkAdapter()) {
-  // TODO(steveanton): Relax this constraint once more Unified Plan work is
-  // done.
-  RTC_CHECK(stream_ids_.size() == 1U);
-  track_->RegisterObserver(this);
-  track_->AddSink(sink_adapter_.get());
-  CreateDtmfSender();
-}
-
-AudioRtpSender::AudioRtpSender(AudioTrackInterface* track,
-                               cricket::VoiceChannel* channel,
-                               StatsCollector* stats)
-    : id_(track->id()),
-      // TODO(steveanton): With Unified Plan this should be empty.
-      stream_ids_({rtc::CreateRandomUuid()}),
-      channel_(channel),
-      stats_(stats),
-      track_(track),
-      cached_track_enabled_(track->enabled()),
-      sink_adapter_(new LocalAudioSinkAdapter()) {
-  track_->RegisterObserver(this);
-  track_->AddSink(sink_adapter_.get());
-  CreateDtmfSender();
-}
-
-AudioRtpSender::AudioRtpSender(cricket::VoiceChannel* channel,
-                               StatsCollector* stats)
-    : id_(rtc::CreateRandomUuid()),
-      // TODO(steveanton): With Unified Plan this should be empty.
-      stream_ids_({rtc::CreateRandomUuid()}),
-      channel_(channel),
-      stats_(stats),
-      sink_adapter_(new LocalAudioSinkAdapter()) {
-  CreateDtmfSender();
-}
-
-AudioRtpSender::~AudioRtpSender() {
-  // For DtmfSender.
-  SignalDestroyed();
-  Stop();
-}
-
-bool AudioRtpSender::CanInsertDtmf() {
-  if (!channel_) {
-    LOG(LS_ERROR) << "CanInsertDtmf: No audio channel exists.";
-    return false;
-  }
-  // Check that this RTP sender is active (description has been applied that
-  // matches an SSRC to its ID).
-  if (!ssrc_) {
-    LOG(LS_ERROR) << "CanInsertDtmf: Sender does not have SSRC.";
-    return false;
-  }
-  return channel_->CanInsertDtmf();
-}
-
-bool AudioRtpSender::InsertDtmf(int code, int duration) {
-  if (!channel_) {
-    LOG(LS_ERROR) << "CanInsertDtmf: No audio channel exists.";
-    return false;
-  }
-  if (!ssrc_) {
-    LOG(LS_ERROR) << "CanInsertDtmf: Sender does not have SSRC.";
-    return false;
-  }
-  if (!channel_->InsertDtmf(ssrc_, code, duration)) {
-    LOG(LS_ERROR) << "Failed to insert DTMF to channel.";
-    return false;
-  }
-  return true;
-}
-
-sigslot::signal0<>* AudioRtpSender::GetOnDestroyedSignal() {
-  return &SignalDestroyed;
-}
-
-void AudioRtpSender::OnChanged() {
-  TRACE_EVENT0("webrtc", "AudioRtpSender::OnChanged");
-  RTC_DCHECK(!stopped_);
-  if (cached_track_enabled_ != track_->enabled()) {
-    cached_track_enabled_ = track_->enabled();
-    if (can_send_track()) {
-      SetAudioSend();
-    }
-  }
-}
-
-bool AudioRtpSender::SetTrack(MediaStreamTrackInterface* track) {
-  TRACE_EVENT0("webrtc", "AudioRtpSender::SetTrack");
-  if (stopped_) {
-    LOG(LS_ERROR) << "SetTrack can't be called on a stopped RtpSender.";
-    return false;
-  }
-  if (track && track->kind() != MediaStreamTrackInterface::kAudioKind) {
-    LOG(LS_ERROR) << "SetTrack called on audio RtpSender with " << track->kind()
-                  << " track.";
-    return false;
-  }
-  AudioTrackInterface* audio_track = static_cast<AudioTrackInterface*>(track);
-
-  // Detach from old track.
-  if (track_) {
-    track_->RemoveSink(sink_adapter_.get());
-    track_->UnregisterObserver(this);
-  }
-
-  if (can_send_track() && stats_) {
-    stats_->RemoveLocalAudioTrack(track_.get(), ssrc_);
-  }
-
-  // Attach to new track.
-  bool prev_can_send_track = can_send_track();
-  // Keep a reference to the old track to keep it alive until we call
-  // SetAudioSend.
-  rtc::scoped_refptr<AudioTrackInterface> old_track = track_;
-  track_ = audio_track;
-  if (track_) {
-    cached_track_enabled_ = track_->enabled();
-    track_->RegisterObserver(this);
-    track_->AddSink(sink_adapter_.get());
-  }
-
-  // Update audio channel.
-  if (can_send_track()) {
-    SetAudioSend();
-    if (stats_) {
-      stats_->AddLocalAudioTrack(track_.get(), ssrc_);
-    }
-  } else if (prev_can_send_track) {
-    ClearAudioSend();
-  }
-  return true;
-}
-
-RtpParameters AudioRtpSender::GetParameters() const {
-  if (!channel_ || stopped_) {
-    return RtpParameters();
-  }
-  return channel_->GetRtpSendParameters(ssrc_);
-}
-
-bool AudioRtpSender::SetParameters(const RtpParameters& parameters) {
-  TRACE_EVENT0("webrtc", "AudioRtpSender::SetParameters");
-  if (!channel_ || stopped_) {
-    return false;
-  }
-  return channel_->SetRtpSendParameters(ssrc_, parameters);
-}
-
-rtc::scoped_refptr<DtmfSenderInterface> AudioRtpSender::GetDtmfSender() const {
-  return dtmf_sender_proxy_;
-}
-
-void AudioRtpSender::SetSsrc(uint32_t ssrc) {
-  TRACE_EVENT0("webrtc", "AudioRtpSender::SetSsrc");
-  if (stopped_ || ssrc == ssrc_) {
-    return;
-  }
-  // If we are already sending with a particular SSRC, stop sending.
-  if (can_send_track()) {
-    ClearAudioSend();
-    if (stats_) {
-      stats_->RemoveLocalAudioTrack(track_.get(), ssrc_);
-    }
-  }
-  ssrc_ = ssrc;
-  if (can_send_track()) {
-    SetAudioSend();
-    if (stats_) {
-      stats_->AddLocalAudioTrack(track_.get(), ssrc_);
-    }
-  }
-}
-
-void AudioRtpSender::Stop() {
-  TRACE_EVENT0("webrtc", "AudioRtpSender::Stop");
-  // TODO(deadbeef): Need to do more here to fully stop sending packets.
-  if (stopped_) {
-    return;
-  }
-  if (track_) {
-    track_->RemoveSink(sink_adapter_.get());
-    track_->UnregisterObserver(this);
-  }
-  if (can_send_track()) {
-    ClearAudioSend();
-    if (stats_) {
-      stats_->RemoveLocalAudioTrack(track_.get(), ssrc_);
-    }
-  }
-  stopped_ = true;
-}
-
-void AudioRtpSender::SetAudioSend() {
-  RTC_DCHECK(!stopped_);
-  RTC_DCHECK(can_send_track());
-  if (!channel_) {
-    LOG(LS_ERROR) << "SetAudioSend: No audio channel exists.";
-    return;
-  }
-  cricket::AudioOptions options;
-#if !defined(WEBRTC_CHROMIUM_BUILD) && !defined(WEBRTC_WEBKIT_BUILD)
-  // TODO(tommi): Remove this hack when we move CreateAudioSource out of
-  // PeerConnection.  This is a bit of a strange way to apply local audio
-  // options since it is also applied to all streams/channels, local or remote.
-  if (track_->enabled() && track_->GetSource() &&
-      !track_->GetSource()->remote()) {
-    // TODO(xians): Remove this static_cast since we should be able to connect
-    // a remote audio track to a peer connection.
-    options = static_cast<LocalAudioSource*>(track_->GetSource())->options();
-  }
-#endif
-
-  cricket::AudioSource* source = sink_adapter_.get();
-  RTC_DCHECK(source != nullptr);
-  if (!channel_->SetAudioSend(ssrc_, track_->enabled(), &options, source)) {
-    LOG(LS_ERROR) << "SetAudioSend: ssrc is incorrect: " << ssrc_;
-  }
-}
-
-void AudioRtpSender::ClearAudioSend() {
-  RTC_DCHECK(ssrc_ != 0);
-  RTC_DCHECK(!stopped_);
-  if (!channel_) {
-    LOG(LS_WARNING) << "ClearAudioSend: No audio channel exists.";
-    return;
-  }
-  cricket::AudioOptions options;
-  if (!channel_->SetAudioSend(ssrc_, false, &options, nullptr)) {
-    LOG(LS_WARNING) << "ClearAudioSend: ssrc is incorrect: " << ssrc_;
-  }
-}
-
-void AudioRtpSender::CreateDtmfSender() {
-  // Should be on signaling thread.
-  // TODO(deadbeef): Add thread checking to RtpSender/RtpReceiver
-  // implementations.
-  rtc::scoped_refptr<DtmfSenderInterface> sender(
-      DtmfSender::Create(track_, rtc::Thread::Current(), this));
-  if (!sender.get()) {
-    LOG(LS_ERROR) << "CreateDtmfSender failed on DtmfSender::Create.";
-    RTC_NOTREACHED();
-  }
-  dtmf_sender_proxy_ =
-      DtmfSenderProxy::Create(rtc::Thread::Current(), sender.get());
-}
-
-VideoRtpSender::VideoRtpSender(VideoTrackInterface* track,
-                               const std::vector<std::string>& stream_ids,
-                               cricket::VideoChannel* channel)
-    : id_(track->id()),
-      stream_ids_({stream_ids}),
-      channel_(channel),
-      track_(track),
-      cached_track_enabled_(track->enabled()),
-      cached_track_content_hint_(track->content_hint()) {
-  // TODO(steveanton): Relax this constraint once more Unified Plan work is
-  // done.
-  RTC_CHECK(stream_ids_.size() == 1U);
-  track_->RegisterObserver(this);
-}
-
-VideoRtpSender::VideoRtpSender(VideoTrackInterface* track,
-                               cricket::VideoChannel* channel)
-    : id_(track->id()),
-      // TODO(steveanton): With Unified Plan this should be empty.
-      stream_ids_({rtc::CreateRandomUuid()}),
-      channel_(channel),
-      track_(track),
-      cached_track_enabled_(track->enabled()),
-      cached_track_content_hint_(track->content_hint()) {
-  track_->RegisterObserver(this);
-}
-
-VideoRtpSender::VideoRtpSender(cricket::VideoChannel* channel)
-    : id_(rtc::CreateRandomUuid()),
-      // TODO(steveanton): With Unified Plan this should be empty.
-      stream_ids_({rtc::CreateRandomUuid()}),
-      channel_(channel) {}
-
-VideoRtpSender::~VideoRtpSender() {
-  Stop();
-}
-
-void VideoRtpSender::OnChanged() {
-  TRACE_EVENT0("webrtc", "VideoRtpSender::OnChanged");
-  RTC_DCHECK(!stopped_);
-  if (cached_track_enabled_ != track_->enabled() ||
-      cached_track_content_hint_ != track_->content_hint()) {
-    cached_track_enabled_ = track_->enabled();
-    cached_track_content_hint_ = track_->content_hint();
-    if (can_send_track()) {
-      SetVideoSend();
-    }
-  }
-}
-
-bool VideoRtpSender::SetTrack(MediaStreamTrackInterface* track) {
-  TRACE_EVENT0("webrtc", "VideoRtpSender::SetTrack");
-  if (stopped_) {
-    LOG(LS_ERROR) << "SetTrack can't be called on a stopped RtpSender.";
-    return false;
-  }
-  if (track && track->kind() != MediaStreamTrackInterface::kVideoKind) {
-    LOG(LS_ERROR) << "SetTrack called on video RtpSender with " << track->kind()
-                  << " track.";
-    return false;
-  }
-  VideoTrackInterface* video_track = static_cast<VideoTrackInterface*>(track);
-
-  // Detach from old track.
-  if (track_) {
-    track_->UnregisterObserver(this);
-  }
-
-  // Attach to new track.
-  bool prev_can_send_track = can_send_track();
-  // Keep a reference to the old track to keep it alive until we call
-  // SetVideoSend.
-  rtc::scoped_refptr<VideoTrackInterface> old_track = track_;
-  track_ = video_track;
-  if (track_) {
-    cached_track_enabled_ = track_->enabled();
-    cached_track_content_hint_ = track_->content_hint();
-    track_->RegisterObserver(this);
-  }
-
-  // Update video channel.
-  if (can_send_track()) {
-    SetVideoSend();
-  } else if (prev_can_send_track) {
-    ClearVideoSend();
-  }
-  return true;
-}
-
-RtpParameters VideoRtpSender::GetParameters() const {
-  if (!channel_ || stopped_) {
-    return RtpParameters();
-  }
-  return channel_->GetRtpSendParameters(ssrc_);
-}
-
-bool VideoRtpSender::SetParameters(const RtpParameters& parameters) {
-  TRACE_EVENT0("webrtc", "VideoRtpSender::SetParameters");
-  if (!channel_ || stopped_) {
-    return false;
-  }
-  return channel_->SetRtpSendParameters(ssrc_, parameters);
-}
-
-rtc::scoped_refptr<DtmfSenderInterface> VideoRtpSender::GetDtmfSender() const {
-  LOG(LS_ERROR) << "Tried to get DTMF sender from video sender.";
-  return nullptr;
-}
-
-void VideoRtpSender::SetSsrc(uint32_t ssrc) {
-  TRACE_EVENT0("webrtc", "VideoRtpSender::SetSsrc");
-  if (stopped_ || ssrc == ssrc_) {
-    return;
-  }
-  // If we are already sending with a particular SSRC, stop sending.
-  if (can_send_track()) {
-    ClearVideoSend();
-  }
-  ssrc_ = ssrc;
-  if (can_send_track()) {
-    SetVideoSend();
-  }
-}
-
-void VideoRtpSender::Stop() {
-  TRACE_EVENT0("webrtc", "VideoRtpSender::Stop");
-  // TODO(deadbeef): Need to do more here to fully stop sending packets.
-  if (stopped_) {
-    return;
-  }
-  if (track_) {
-    track_->UnregisterObserver(this);
-  }
-  if (can_send_track()) {
-    ClearVideoSend();
-  }
-  stopped_ = true;
-}
-
-void VideoRtpSender::SetVideoSend() {
-  RTC_DCHECK(!stopped_);
-  RTC_DCHECK(can_send_track());
-  if (!channel_) {
-    LOG(LS_ERROR) << "SetVideoSend: No video channel exists.";
-    return;
-  }
-  cricket::VideoOptions options;
-  VideoTrackSourceInterface* source = track_->GetSource();
-  if (source) {
-    options.is_screencast = rtc::Optional<bool>(source->is_screencast());
-    options.video_noise_reduction = source->needs_denoising();
-  }
-  switch (cached_track_content_hint_) {
-    case VideoTrackInterface::ContentHint::kNone:
-      break;
-    case VideoTrackInterface::ContentHint::kFluid:
-      options.is_screencast = rtc::Optional<bool>(false);
-      break;
-    case VideoTrackInterface::ContentHint::kDetailed:
-      options.is_screencast = rtc::Optional<bool>(true);
-      break;
-  }
-  if (!channel_->SetVideoSend(ssrc_, track_->enabled(), &options, track_)) {
-    RTC_NOTREACHED();
-  }
-}
-
-void VideoRtpSender::ClearVideoSend() {
-  RTC_DCHECK(ssrc_ != 0);
-  RTC_DCHECK(!stopped_);
-  if (!channel_) {
-    LOG(LS_WARNING) << "SetVideoSend: No video channel exists.";
-    return;
-  }
-  // Allow SetVideoSend to fail since |enable| is false and |source| is null.
-  // This the normal case when the underlying media channel has already been
-  // deleted.
-  channel_->SetVideoSend(ssrc_, false, nullptr, nullptr);
-}
-
-}  // namespace webrtc
diff --git a/pc/rtpsender.h b/pc/rtpsender.h
deleted file mode 100644
index de679cf..0000000
--- a/pc/rtpsender.h
+++ /dev/null
@@ -1,261 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-// This file contains classes that implement RtpSenderInterface.
-// An RtpSender associates a MediaStreamTrackInterface with an underlying
-// transport (provided by AudioProviderInterface/VideoProviderInterface)
-
-#ifndef WEBRTC_PC_RTPSENDER_H_
-#define WEBRTC_PC_RTPSENDER_H_
-
-#include <memory>
-#include <string>
-
-#include "webrtc/api/mediastreaminterface.h"
-#include "webrtc/api/rtpsenderinterface.h"
-#include "webrtc/rtc_base/basictypes.h"
-#include "webrtc/rtc_base/criticalsection.h"
-// Adding 'nogncheck' to disable the gn include headers check to support modular
-// WebRTC build targets.
-#include "webrtc/media/base/audiosource.h"  // nogncheck
-#include "webrtc/pc/channel.h"
-#include "webrtc/pc/dtmfsender.h"
-#include "webrtc/pc/statscollector.h"
-
-namespace webrtc {
-
-// Internal interface used by PeerConnection.
-class RtpSenderInternal : public RtpSenderInterface {
- public:
-  // Used to set the SSRC of the sender, once a local description has been set.
-  // If |ssrc| is 0, this indiates that the sender should disconnect from the
-  // underlying transport (this occurs if the sender isn't seen in a local
-  // description).
-  virtual void SetSsrc(uint32_t ssrc) = 0;
-
-  // TODO(steveanton): With Unified Plan, a track/RTCRTPSender can be part of
-  // multiple streams (or no stream at all). Replace these singular methods with
-  // their corresponding plural methods.
-  // Until these are removed, RtpSenders must have exactly one stream.
-  virtual void set_stream_id(const std::string& stream_id) = 0;
-  virtual std::string stream_id() const = 0;
-  virtual void set_stream_ids(const std::vector<std::string>& stream_ids) = 0;
-
-  virtual void Stop() = 0;
-};
-
-// LocalAudioSinkAdapter receives data callback as a sink to the local
-// AudioTrack, and passes the data to the sink of AudioSource.
-class LocalAudioSinkAdapter : public AudioTrackSinkInterface,
-                              public cricket::AudioSource {
- public:
-  LocalAudioSinkAdapter();
-  virtual ~LocalAudioSinkAdapter();
-
- private:
-  // AudioSinkInterface implementation.
-  void OnData(const void* audio_data,
-              int bits_per_sample,
-              int sample_rate,
-              size_t number_of_channels,
-              size_t number_of_frames) override;
-
-  // cricket::AudioSource implementation.
-  void SetSink(cricket::AudioSource::Sink* sink) override;
-
-  cricket::AudioSource::Sink* sink_;
-  // Critical section protecting |sink_|.
-  rtc::CriticalSection lock_;
-};
-
-class AudioRtpSender : public DtmfProviderInterface,
-                       public ObserverInterface,
-                       public rtc::RefCountedObject<RtpSenderInternal> {
- public:
-  // StatsCollector provided so that Add/RemoveLocalAudioTrack can be called
-  // at the appropriate times.
-  // |channel| can be null if one does not exist yet.
-  AudioRtpSender(AudioTrackInterface* track,
-                 const std::vector<std::string>& stream_id,
-                 cricket::VoiceChannel* channel,
-                 StatsCollector* stats);
-
-  // Randomly generates stream_id.
-  // |channel| can be null if one does not exist yet.
-  AudioRtpSender(AudioTrackInterface* track,
-                 cricket::VoiceChannel* channel,
-                 StatsCollector* stats);
-
-  // Randomly generates id and stream_id.
-  // |channel| can be null if one does not exist yet.
-  AudioRtpSender(cricket::VoiceChannel* channel, StatsCollector* stats);
-
-  virtual ~AudioRtpSender();
-
-  // DtmfSenderProvider implementation.
-  bool CanInsertDtmf() override;
-  bool InsertDtmf(int code, int duration) override;
-  sigslot::signal0<>* GetOnDestroyedSignal() override;
-
-  // ObserverInterface implementation.
-  void OnChanged() override;
-
-  // RtpSenderInterface implementation.
-  bool SetTrack(MediaStreamTrackInterface* track) override;
-  rtc::scoped_refptr<MediaStreamTrackInterface> track() const override {
-    return track_;
-  }
-
-  uint32_t ssrc() const override { return ssrc_; }
-
-  cricket::MediaType media_type() const override {
-    return cricket::MEDIA_TYPE_AUDIO;
-  }
-
-  std::string id() const override { return id_; }
-
-  std::vector<std::string> stream_ids() const override { return stream_ids_; }
-
-  RtpParameters GetParameters() const override;
-  bool SetParameters(const RtpParameters& parameters) override;
-
-  rtc::scoped_refptr<DtmfSenderInterface> GetDtmfSender() const override;
-
-  // RtpSenderInternal implementation.
-  void SetSsrc(uint32_t ssrc) override;
-
-  void set_stream_id(const std::string& stream_id) override {
-    stream_ids_ = {stream_id};
-  }
-  std::string stream_id() const override { return stream_ids_[0]; }
-  void set_stream_ids(const std::vector<std::string>& stream_ids) override {
-    stream_ids_ = stream_ids;
-  }
-
-  void Stop() override;
-
-  // Does not take ownership.
-  // Should call SetChannel(nullptr) before |channel| is destroyed.
-  void SetChannel(cricket::VoiceChannel* channel) { channel_ = channel; }
-
- private:
-  // TODO(nisse): Since SSRC == 0 is technically valid, figure out
-  // some other way to test if we have a valid SSRC.
-  bool can_send_track() const { return track_ && ssrc_; }
-  // Helper function to construct options for
-  // AudioProviderInterface::SetAudioSend.
-  void SetAudioSend();
-  // Helper function to call SetAudioSend with "stop sending" parameters.
-  void ClearAudioSend();
-
-  void CreateDtmfSender();
-
-  sigslot::signal0<> SignalDestroyed;
-
-  std::string id_;
-  // TODO(steveanton): Until more Unified Plan work is done, this can only have
-  // exactly one element.
-  std::vector<std::string> stream_ids_;
-  cricket::VoiceChannel* channel_ = nullptr;
-  StatsCollector* stats_;
-  rtc::scoped_refptr<AudioTrackInterface> track_;
-  rtc::scoped_refptr<DtmfSenderInterface> dtmf_sender_proxy_;
-  uint32_t ssrc_ = 0;
-  bool cached_track_enabled_ = false;
-  bool stopped_ = false;
-
-  // Used to pass the data callback from the |track_| to the other end of
-  // cricket::AudioSource.
-  std::unique_ptr<LocalAudioSinkAdapter> sink_adapter_;
-};
-
-class VideoRtpSender : public ObserverInterface,
-                       public rtc::RefCountedObject<RtpSenderInternal> {
- public:
-  // |channel| can be null if one does not exist yet.
-  VideoRtpSender(VideoTrackInterface* track,
-                 const std::vector<std::string>& stream_id,
-                 cricket::VideoChannel* channel);
-
-  // Randomly generates stream_id.
-  // |channel| can be null if one does not exist yet.
-  VideoRtpSender(VideoTrackInterface* track, cricket::VideoChannel* channel);
-
-  // Randomly generates id and stream_id.
-  // |channel| can be null if one does not exist yet.
-  explicit VideoRtpSender(cricket::VideoChannel* channel);
-
-  virtual ~VideoRtpSender();
-
-  // ObserverInterface implementation
-  void OnChanged() override;
-
-  // RtpSenderInterface implementation
-  bool SetTrack(MediaStreamTrackInterface* track) override;
-  rtc::scoped_refptr<MediaStreamTrackInterface> track() const override {
-    return track_;
-  }
-
-  uint32_t ssrc() const override { return ssrc_; }
-
-  cricket::MediaType media_type() const override {
-    return cricket::MEDIA_TYPE_VIDEO;
-  }
-
-  std::string id() const override { return id_; }
-
-  std::vector<std::string> stream_ids() const override { return stream_ids_; }
-
-  RtpParameters GetParameters() const override;
-  bool SetParameters(const RtpParameters& parameters) override;
-
-  rtc::scoped_refptr<DtmfSenderInterface> GetDtmfSender() const override;
-
-  // RtpSenderInternal implementation.
-  void SetSsrc(uint32_t ssrc) override;
-
-  void set_stream_id(const std::string& stream_id) override {
-    stream_ids_ = {stream_id};
-  }
-  std::string stream_id() const override { return stream_ids_[0]; }
-  void set_stream_ids(const std::vector<std::string>& stream_ids) override {
-    stream_ids_ = stream_ids;
-  }
-
-  void Stop() override;
-
-  // Does not take ownership.
-  // Should call SetChannel(nullptr) before |channel| is destroyed.
-  void SetChannel(cricket::VideoChannel* channel) { channel_ = channel; }
-
- private:
-  bool can_send_track() const { return track_ && ssrc_; }
-  // Helper function to construct options for
-  // VideoProviderInterface::SetVideoSend.
-  void SetVideoSend();
-  // Helper function to call SetVideoSend with "stop sending" parameters.
-  void ClearVideoSend();
-
-  std::string id_;
-  // TODO(steveanton): Until more Unified Plan work is done, this can only have
-  // exactly one element.
-  std::vector<std::string> stream_ids_;
-  cricket::VideoChannel* channel_ = nullptr;
-  rtc::scoped_refptr<VideoTrackInterface> track_;
-  uint32_t ssrc_ = 0;
-  bool cached_track_enabled_ = false;
-  VideoTrackInterface::ContentHint cached_track_content_hint_ =
-      VideoTrackInterface::ContentHint::kNone;
-  bool stopped_ = false;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_PC_RTPSENDER_H_
diff --git a/pc/rtpsenderreceiver_unittest.cc b/pc/rtpsenderreceiver_unittest.cc
deleted file mode 100644
index a00b980..0000000
--- a/pc/rtpsenderreceiver_unittest.cc
+++ /dev/null
@@ -1,802 +0,0 @@
-/*
- *  Copyright 2012 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 <memory>
-#include <string>
-#include <utility>
-
-#include "webrtc/logging/rtc_event_log/rtc_event_log.h"
-#include "webrtc/media/base/fakemediaengine.h"
-#include "webrtc/media/base/mediachannel.h"
-#include "webrtc/media/engine/fakewebrtccall.h"
-#include "webrtc/p2p/base/faketransportcontroller.h"
-#include "webrtc/pc/audiotrack.h"
-#include "webrtc/pc/channelmanager.h"
-#include "webrtc/pc/localaudiosource.h"
-#include "webrtc/pc/mediastream.h"
-#include "webrtc/pc/remoteaudiosource.h"
-#include "webrtc/pc/rtpreceiver.h"
-#include "webrtc/pc/rtpsender.h"
-#include "webrtc/pc/streamcollection.h"
-#include "webrtc/pc/test/fakevideotracksource.h"
-#include "webrtc/pc/videotrack.h"
-#include "webrtc/pc/videotracksource.h"
-#include "webrtc/rtc_base/gunit.h"
-#include "webrtc/rtc_base/sigslot.h"
-#include "webrtc/test/gmock.h"
-#include "webrtc/test/gtest.h"
-
-using ::testing::_;
-using ::testing::Exactly;
-using ::testing::InvokeWithoutArgs;
-using ::testing::Return;
-
-namespace {
-
-static const char kStreamLabel1[] = "local_stream_1";
-static const char kVideoTrackId[] = "video_1";
-static const char kAudioTrackId[] = "audio_1";
-static const uint32_t kVideoSsrc = 98;
-static const uint32_t kVideoSsrc2 = 100;
-static const uint32_t kAudioSsrc = 99;
-static const uint32_t kAudioSsrc2 = 101;
-static const int kDefaultTimeout = 10000;  // 10 seconds.
-}  // namespace
-
-namespace webrtc {
-
-class RtpSenderReceiverTest : public testing::Test,
-                              public sigslot::has_slots<> {
- public:
-  RtpSenderReceiverTest()
-      :  // Create fake media engine/etc. so we can create channels to use to
-         // test RtpSenders/RtpReceivers.
-        media_engine_(new cricket::FakeMediaEngine()),
-        channel_manager_(
-            std::unique_ptr<cricket::MediaEngineInterface>(media_engine_),
-            rtc::Thread::Current(),
-            rtc::Thread::Current()),
-        fake_call_(Call::Config(&event_log_)),
-        local_stream_(MediaStream::Create(kStreamLabel1)) {
-    // Create channels to be used by the RtpSenders and RtpReceivers.
-    channel_manager_.Init();
-    bool srtp_required = true;
-    cricket::DtlsTransportInternal* rtp_transport =
-        fake_transport_controller_.CreateDtlsTransport(
-            cricket::CN_AUDIO, cricket::ICE_CANDIDATE_COMPONENT_RTP);
-    voice_channel_ = channel_manager_.CreateVoiceChannel(
-        &fake_call_, cricket::MediaConfig(),
-        rtp_transport, nullptr, rtc::Thread::Current(),
-        cricket::CN_AUDIO, srtp_required, cricket::AudioOptions());
-    video_channel_ = channel_manager_.CreateVideoChannel(
-        &fake_call_, cricket::MediaConfig(),
-        rtp_transport, nullptr, rtc::Thread::Current(),
-        cricket::CN_VIDEO, srtp_required, cricket::VideoOptions());
-    voice_channel_->Enable(true);
-    video_channel_->Enable(true);
-    voice_media_channel_ = media_engine_->GetVoiceChannel(0);
-    video_media_channel_ = media_engine_->GetVideoChannel(0);
-    RTC_CHECK(voice_channel_);
-    RTC_CHECK(video_channel_);
-    RTC_CHECK(voice_media_channel_);
-    RTC_CHECK(video_media_channel_);
-
-    // Create streams for predefined SSRCs. Streams need to exist in order
-    // for the senders and receievers to apply parameters to them.
-    // Normally these would be created by SetLocalDescription and
-    // SetRemoteDescription.
-    voice_media_channel_->AddSendStream(
-        cricket::StreamParams::CreateLegacy(kAudioSsrc));
-    voice_media_channel_->AddRecvStream(
-        cricket::StreamParams::CreateLegacy(kAudioSsrc));
-    voice_media_channel_->AddSendStream(
-        cricket::StreamParams::CreateLegacy(kAudioSsrc2));
-    voice_media_channel_->AddRecvStream(
-        cricket::StreamParams::CreateLegacy(kAudioSsrc2));
-    video_media_channel_->AddSendStream(
-        cricket::StreamParams::CreateLegacy(kVideoSsrc));
-    video_media_channel_->AddRecvStream(
-        cricket::StreamParams::CreateLegacy(kVideoSsrc));
-    video_media_channel_->AddSendStream(
-        cricket::StreamParams::CreateLegacy(kVideoSsrc2));
-    video_media_channel_->AddRecvStream(
-        cricket::StreamParams::CreateLegacy(kVideoSsrc2));
-  }
-
-  // Needed to use DTMF sender.
-  void AddDtmfCodec() {
-    cricket::AudioSendParameters params;
-    const cricket::AudioCodec kTelephoneEventCodec(106, "telephone-event", 8000,
-                                                   0, 1);
-    params.codecs.push_back(kTelephoneEventCodec);
-    voice_media_channel_->SetSendParameters(params);
-  }
-
-  void AddVideoTrack() { AddVideoTrack(false); }
-
-  void AddVideoTrack(bool is_screencast) {
-    rtc::scoped_refptr<VideoTrackSourceInterface> source(
-        FakeVideoTrackSource::Create(is_screencast));
-    video_track_ =
-        VideoTrack::Create(kVideoTrackId, source, rtc::Thread::Current());
-    EXPECT_TRUE(local_stream_->AddTrack(video_track_));
-  }
-
-  void CreateAudioRtpSender() { CreateAudioRtpSender(nullptr); }
-
-  void CreateAudioRtpSender(rtc::scoped_refptr<LocalAudioSource> source) {
-    audio_track_ = AudioTrack::Create(kAudioTrackId, source);
-    EXPECT_TRUE(local_stream_->AddTrack(audio_track_));
-    audio_rtp_sender_ =
-        new AudioRtpSender(local_stream_->GetAudioTracks()[0],
-                           {local_stream_->label()}, voice_channel_, nullptr);
-    audio_rtp_sender_->SetSsrc(kAudioSsrc);
-    audio_rtp_sender_->GetOnDestroyedSignal()->connect(
-        this, &RtpSenderReceiverTest::OnAudioSenderDestroyed);
-    VerifyVoiceChannelInput();
-  }
-
-  void OnAudioSenderDestroyed() { audio_sender_destroyed_signal_fired_ = true; }
-
-  void CreateVideoRtpSender() { CreateVideoRtpSender(false); }
-
-  void CreateVideoRtpSender(bool is_screencast) {
-    AddVideoTrack(is_screencast);
-    video_rtp_sender_ =
-        new VideoRtpSender(local_stream_->GetVideoTracks()[0],
-                           {local_stream_->label()}, video_channel_);
-    video_rtp_sender_->SetSsrc(kVideoSsrc);
-    VerifyVideoChannelInput();
-  }
-
-  void DestroyAudioRtpSender() {
-    audio_rtp_sender_ = nullptr;
-    VerifyVoiceChannelNoInput();
-  }
-
-  void DestroyVideoRtpSender() {
-    video_rtp_sender_ = nullptr;
-    VerifyVideoChannelNoInput();
-  }
-
-  void CreateAudioRtpReceiver() {
-    audio_rtp_receiver_ =
-        new AudioRtpReceiver(kAudioTrackId, kAudioSsrc, voice_channel_);
-    audio_track_ = audio_rtp_receiver_->audio_track();
-    VerifyVoiceChannelOutput();
-  }
-
-  void CreateVideoRtpReceiver() {
-    video_rtp_receiver_ = new VideoRtpReceiver(
-        kVideoTrackId, rtc::Thread::Current(), kVideoSsrc, video_channel_);
-    video_track_ = video_rtp_receiver_->video_track();
-    VerifyVideoChannelOutput();
-  }
-
-  void DestroyAudioRtpReceiver() {
-    audio_rtp_receiver_ = nullptr;
-    VerifyVoiceChannelNoOutput();
-  }
-
-  void DestroyVideoRtpReceiver() {
-    video_rtp_receiver_ = nullptr;
-    VerifyVideoChannelNoOutput();
-  }
-
-  void VerifyVoiceChannelInput() { VerifyVoiceChannelInput(kAudioSsrc); }
-
-  void VerifyVoiceChannelInput(uint32_t ssrc) {
-    // Verify that the media channel has an audio source, and the stream isn't
-    // muted.
-    EXPECT_TRUE(voice_media_channel_->HasSource(ssrc));
-    EXPECT_FALSE(voice_media_channel_->IsStreamMuted(ssrc));
-  }
-
-  void VerifyVideoChannelInput() { VerifyVideoChannelInput(kVideoSsrc); }
-
-  void VerifyVideoChannelInput(uint32_t ssrc) {
-    // Verify that the media channel has a video source,
-    EXPECT_TRUE(video_media_channel_->HasSource(ssrc));
-  }
-
-  void VerifyVoiceChannelNoInput() { VerifyVoiceChannelNoInput(kAudioSsrc); }
-
-  void VerifyVoiceChannelNoInput(uint32_t ssrc) {
-    // Verify that the media channel's source is reset.
-    EXPECT_FALSE(voice_media_channel_->HasSource(ssrc));
-  }
-
-  void VerifyVideoChannelNoInput() { VerifyVideoChannelNoInput(kVideoSsrc); }
-
-  void VerifyVideoChannelNoInput(uint32_t ssrc) {
-    // Verify that the media channel's source is reset.
-    EXPECT_FALSE(video_media_channel_->HasSource(ssrc));
-  }
-
-  void VerifyVoiceChannelOutput() {
-    // Verify that the volume is initialized to 1.
-    double volume;
-    EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
-    EXPECT_EQ(1, volume);
-  }
-
-  void VerifyVideoChannelOutput() {
-    // Verify that the media channel has a sink.
-    EXPECT_TRUE(video_media_channel_->HasSink(kVideoSsrc));
-  }
-
-  void VerifyVoiceChannelNoOutput() {
-    // Verify that the volume is reset to 0.
-    double volume;
-    EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
-    EXPECT_EQ(0, volume);
-  }
-
-  void VerifyVideoChannelNoOutput() {
-    // Verify that the media channel's sink is reset.
-    EXPECT_FALSE(video_media_channel_->HasSink(kVideoSsrc));
-  }
-
- protected:
-  webrtc::RtcEventLogNullImpl event_log_;
-  // |media_engine_| is actually owned by |channel_manager_|.
-  cricket::FakeMediaEngine* media_engine_;
-  cricket::FakeTransportController fake_transport_controller_;
-  cricket::ChannelManager channel_manager_;
-  cricket::FakeCall fake_call_;
-  cricket::VoiceChannel* voice_channel_;
-  cricket::VideoChannel* video_channel_;
-  cricket::FakeVoiceMediaChannel* voice_media_channel_;
-  cricket::FakeVideoMediaChannel* video_media_channel_;
-  rtc::scoped_refptr<AudioRtpSender> audio_rtp_sender_;
-  rtc::scoped_refptr<VideoRtpSender> video_rtp_sender_;
-  rtc::scoped_refptr<AudioRtpReceiver> audio_rtp_receiver_;
-  rtc::scoped_refptr<VideoRtpReceiver> video_rtp_receiver_;
-  rtc::scoped_refptr<MediaStreamInterface> local_stream_;
-  rtc::scoped_refptr<VideoTrackInterface> video_track_;
-  rtc::scoped_refptr<AudioTrackInterface> audio_track_;
-  bool audio_sender_destroyed_signal_fired_ = false;
-};
-
-// Test that |voice_channel_| is updated when an audio track is associated
-// and disassociated with an AudioRtpSender.
-TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpSender) {
-  CreateAudioRtpSender();
-  DestroyAudioRtpSender();
-}
-
-// Test that |video_channel_| is updated when a video track is associated and
-// disassociated with a VideoRtpSender.
-TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpSender) {
-  CreateVideoRtpSender();
-  DestroyVideoRtpSender();
-}
-
-// Test that |voice_channel_| is updated when a remote audio track is
-// associated and disassociated with an AudioRtpReceiver.
-TEST_F(RtpSenderReceiverTest, AddAndDestroyAudioRtpReceiver) {
-  CreateAudioRtpReceiver();
-  DestroyAudioRtpReceiver();
-}
-
-// Test that |video_channel_| is updated when a remote video track is
-// associated and disassociated with a VideoRtpReceiver.
-TEST_F(RtpSenderReceiverTest, AddAndDestroyVideoRtpReceiver) {
-  CreateVideoRtpReceiver();
-  DestroyVideoRtpReceiver();
-}
-
-// Test that the AudioRtpSender applies options from the local audio source.
-TEST_F(RtpSenderReceiverTest, LocalAudioSourceOptionsApplied) {
-  cricket::AudioOptions options;
-  options.echo_cancellation = rtc::Optional<bool>(true);
-  auto source = LocalAudioSource::Create(&options);
-  CreateAudioRtpSender(source.get());
-
-  EXPECT_EQ(rtc::Optional<bool>(true),
-            voice_media_channel_->options().echo_cancellation);
-
-  DestroyAudioRtpSender();
-}
-
-// Test that the stream is muted when the track is disabled, and unmuted when
-// the track is enabled.
-TEST_F(RtpSenderReceiverTest, LocalAudioTrackDisable) {
-  CreateAudioRtpSender();
-
-  audio_track_->set_enabled(false);
-  EXPECT_TRUE(voice_media_channel_->IsStreamMuted(kAudioSsrc));
-
-  audio_track_->set_enabled(true);
-  EXPECT_FALSE(voice_media_channel_->IsStreamMuted(kAudioSsrc));
-
-  DestroyAudioRtpSender();
-}
-
-// Test that the volume is set to 0 when the track is disabled, and back to
-// 1 when the track is enabled.
-TEST_F(RtpSenderReceiverTest, RemoteAudioTrackDisable) {
-  CreateAudioRtpReceiver();
-
-  double volume;
-  EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
-  EXPECT_EQ(1, volume);
-
-  audio_track_->set_enabled(false);
-  EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
-  EXPECT_EQ(0, volume);
-
-  audio_track_->set_enabled(true);
-  EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
-  EXPECT_EQ(1, volume);
-
-  DestroyAudioRtpReceiver();
-}
-
-// Currently no action is taken when a remote video track is disabled or
-// enabled, so there's nothing to test here, other than what is normally
-// verified in DestroyVideoRtpSender.
-TEST_F(RtpSenderReceiverTest, LocalVideoTrackDisable) {
-  CreateVideoRtpSender();
-
-  video_track_->set_enabled(false);
-  video_track_->set_enabled(true);
-
-  DestroyVideoRtpSender();
-}
-
-// Test that the state of the video track created by the VideoRtpReceiver is
-// updated when the receiver is destroyed.
-TEST_F(RtpSenderReceiverTest, RemoteVideoTrackState) {
-  CreateVideoRtpReceiver();
-
-  EXPECT_EQ(webrtc::MediaStreamTrackInterface::kLive, video_track_->state());
-  EXPECT_EQ(webrtc::MediaSourceInterface::kLive,
-            video_track_->GetSource()->state());
-
-  DestroyVideoRtpReceiver();
-
-  EXPECT_EQ(webrtc::MediaStreamTrackInterface::kEnded, video_track_->state());
-  EXPECT_EQ(webrtc::MediaSourceInterface::kEnded,
-            video_track_->GetSource()->state());
-}
-
-// Currently no action is taken when a remote video track is disabled or
-// enabled, so there's nothing to test here, other than what is normally
-// verified in DestroyVideoRtpReceiver.
-TEST_F(RtpSenderReceiverTest, RemoteVideoTrackDisable) {
-  CreateVideoRtpReceiver();
-
-  video_track_->set_enabled(false);
-  video_track_->set_enabled(true);
-
-  DestroyVideoRtpReceiver();
-}
-
-// Test that the AudioRtpReceiver applies volume changes from the track source
-// to the media channel.
-TEST_F(RtpSenderReceiverTest, RemoteAudioTrackSetVolume) {
-  CreateAudioRtpReceiver();
-
-  double volume;
-  audio_track_->GetSource()->SetVolume(0.5);
-  EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
-  EXPECT_EQ(0.5, volume);
-
-  // Disable the audio track, this should prevent setting the volume.
-  audio_track_->set_enabled(false);
-  audio_track_->GetSource()->SetVolume(0.8);
-  EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
-  EXPECT_EQ(0, volume);
-
-  // When the track is enabled, the previously set volume should take effect.
-  audio_track_->set_enabled(true);
-  EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
-  EXPECT_EQ(0.8, volume);
-
-  // Try changing volume one more time.
-  audio_track_->GetSource()->SetVolume(0.9);
-  EXPECT_TRUE(voice_media_channel_->GetOutputVolume(kAudioSsrc, &volume));
-  EXPECT_EQ(0.9, volume);
-
-  DestroyAudioRtpReceiver();
-}
-
-// Test that the media channel isn't enabled for sending if the audio sender
-// doesn't have both a track and SSRC.
-TEST_F(RtpSenderReceiverTest, AudioSenderWithoutTrackAndSsrc) {
-  audio_rtp_sender_ = new AudioRtpSender(voice_channel_, nullptr);
-  rtc::scoped_refptr<AudioTrackInterface> track =
-      AudioTrack::Create(kAudioTrackId, nullptr);
-
-  // Track but no SSRC.
-  EXPECT_TRUE(audio_rtp_sender_->SetTrack(track));
-  VerifyVoiceChannelNoInput();
-
-  // SSRC but no track.
-  EXPECT_TRUE(audio_rtp_sender_->SetTrack(nullptr));
-  audio_rtp_sender_->SetSsrc(kAudioSsrc);
-  VerifyVoiceChannelNoInput();
-}
-
-// Test that the media channel isn't enabled for sending if the video sender
-// doesn't have both a track and SSRC.
-TEST_F(RtpSenderReceiverTest, VideoSenderWithoutTrackAndSsrc) {
-  video_rtp_sender_ = new VideoRtpSender(video_channel_);
-
-  // Track but no SSRC.
-  EXPECT_TRUE(video_rtp_sender_->SetTrack(video_track_));
-  VerifyVideoChannelNoInput();
-
-  // SSRC but no track.
-  EXPECT_TRUE(video_rtp_sender_->SetTrack(nullptr));
-  video_rtp_sender_->SetSsrc(kVideoSsrc);
-  VerifyVideoChannelNoInput();
-}
-
-// Test that the media channel is enabled for sending when the audio sender
-// has a track and SSRC, when the SSRC is set first.
-TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupSsrcThenTrack) {
-  audio_rtp_sender_ = new AudioRtpSender(voice_channel_, nullptr);
-  rtc::scoped_refptr<AudioTrackInterface> track =
-      AudioTrack::Create(kAudioTrackId, nullptr);
-  audio_rtp_sender_->SetSsrc(kAudioSsrc);
-  audio_rtp_sender_->SetTrack(track);
-  VerifyVoiceChannelInput();
-
-  DestroyAudioRtpSender();
-}
-
-// Test that the media channel is enabled for sending when the audio sender
-// has a track and SSRC, when the SSRC is set last.
-TEST_F(RtpSenderReceiverTest, AudioSenderEarlyWarmupTrackThenSsrc) {
-  audio_rtp_sender_ = new AudioRtpSender(voice_channel_, nullptr);
-  rtc::scoped_refptr<AudioTrackInterface> track =
-      AudioTrack::Create(kAudioTrackId, nullptr);
-  audio_rtp_sender_->SetTrack(track);
-  audio_rtp_sender_->SetSsrc(kAudioSsrc);
-  VerifyVoiceChannelInput();
-
-  DestroyAudioRtpSender();
-}
-
-// Test that the media channel is enabled for sending when the video sender
-// has a track and SSRC, when the SSRC is set first.
-TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupSsrcThenTrack) {
-  AddVideoTrack();
-  video_rtp_sender_ = new VideoRtpSender(video_channel_);
-  video_rtp_sender_->SetSsrc(kVideoSsrc);
-  video_rtp_sender_->SetTrack(video_track_);
-  VerifyVideoChannelInput();
-
-  DestroyVideoRtpSender();
-}
-
-// Test that the media channel is enabled for sending when the video sender
-// has a track and SSRC, when the SSRC is set last.
-TEST_F(RtpSenderReceiverTest, VideoSenderEarlyWarmupTrackThenSsrc) {
-  AddVideoTrack();
-  video_rtp_sender_ = new VideoRtpSender(video_channel_);
-  video_rtp_sender_->SetTrack(video_track_);
-  video_rtp_sender_->SetSsrc(kVideoSsrc);
-  VerifyVideoChannelInput();
-
-  DestroyVideoRtpSender();
-}
-
-// Test that the media channel stops sending when the audio sender's SSRC is set
-// to 0.
-TEST_F(RtpSenderReceiverTest, AudioSenderSsrcSetToZero) {
-  CreateAudioRtpSender();
-
-  audio_rtp_sender_->SetSsrc(0);
-  VerifyVoiceChannelNoInput();
-}
-
-// Test that the media channel stops sending when the video sender's SSRC is set
-// to 0.
-TEST_F(RtpSenderReceiverTest, VideoSenderSsrcSetToZero) {
-  CreateAudioRtpSender();
-
-  audio_rtp_sender_->SetSsrc(0);
-  VerifyVideoChannelNoInput();
-}
-
-// Test that the media channel stops sending when the audio sender's track is
-// set to null.
-TEST_F(RtpSenderReceiverTest, AudioSenderTrackSetToNull) {
-  CreateAudioRtpSender();
-
-  EXPECT_TRUE(audio_rtp_sender_->SetTrack(nullptr));
-  VerifyVoiceChannelNoInput();
-}
-
-// Test that the media channel stops sending when the video sender's track is
-// set to null.
-TEST_F(RtpSenderReceiverTest, VideoSenderTrackSetToNull) {
-  CreateVideoRtpSender();
-
-  video_rtp_sender_->SetSsrc(0);
-  VerifyVideoChannelNoInput();
-}
-
-// Test that when the audio sender's SSRC is changed, the media channel stops
-// sending with the old SSRC and starts sending with the new one.
-TEST_F(RtpSenderReceiverTest, AudioSenderSsrcChanged) {
-  CreateAudioRtpSender();
-
-  audio_rtp_sender_->SetSsrc(kAudioSsrc2);
-  VerifyVoiceChannelNoInput(kAudioSsrc);
-  VerifyVoiceChannelInput(kAudioSsrc2);
-
-  audio_rtp_sender_ = nullptr;
-  VerifyVoiceChannelNoInput(kAudioSsrc2);
-}
-
-// Test that when the audio sender's SSRC is changed, the media channel stops
-// sending with the old SSRC and starts sending with the new one.
-TEST_F(RtpSenderReceiverTest, VideoSenderSsrcChanged) {
-  CreateVideoRtpSender();
-
-  video_rtp_sender_->SetSsrc(kVideoSsrc2);
-  VerifyVideoChannelNoInput(kVideoSsrc);
-  VerifyVideoChannelInput(kVideoSsrc2);
-
-  video_rtp_sender_ = nullptr;
-  VerifyVideoChannelNoInput(kVideoSsrc2);
-}
-
-TEST_F(RtpSenderReceiverTest, AudioSenderCanSetParameters) {
-  CreateAudioRtpSender();
-
-  RtpParameters params = audio_rtp_sender_->GetParameters();
-  EXPECT_EQ(1u, params.encodings.size());
-  EXPECT_TRUE(audio_rtp_sender_->SetParameters(params));
-
-  DestroyAudioRtpSender();
-}
-
-TEST_F(RtpSenderReceiverTest, SetAudioMaxSendBitrate) {
-  CreateAudioRtpSender();
-
-  EXPECT_EQ(-1, voice_media_channel_->max_bps());
-  webrtc::RtpParameters params = audio_rtp_sender_->GetParameters();
-  EXPECT_EQ(1, params.encodings.size());
-  EXPECT_FALSE(params.encodings[0].max_bitrate_bps);
-  params.encodings[0].max_bitrate_bps = rtc::Optional<int>(1000);
-  EXPECT_TRUE(audio_rtp_sender_->SetParameters(params));
-
-  // Read back the parameters and verify they have been changed.
-  params = audio_rtp_sender_->GetParameters();
-  EXPECT_EQ(1, params.encodings.size());
-  EXPECT_EQ(rtc::Optional<int>(1000), params.encodings[0].max_bitrate_bps);
-
-  // Verify that the audio channel received the new parameters.
-  params = voice_media_channel_->GetRtpSendParameters(kAudioSsrc);
-  EXPECT_EQ(1, params.encodings.size());
-  EXPECT_EQ(rtc::Optional<int>(1000), params.encodings[0].max_bitrate_bps);
-
-  // Verify that the global bitrate limit has not been changed.
-  EXPECT_EQ(-1, voice_media_channel_->max_bps());
-
-  DestroyAudioRtpSender();
-}
-
-TEST_F(RtpSenderReceiverTest, VideoSenderCanSetParameters) {
-  CreateVideoRtpSender();
-
-  RtpParameters params = video_rtp_sender_->GetParameters();
-  EXPECT_EQ(1u, params.encodings.size());
-  EXPECT_TRUE(video_rtp_sender_->SetParameters(params));
-
-  DestroyVideoRtpSender();
-}
-
-TEST_F(RtpSenderReceiverTest, SetVideoMaxSendBitrate) {
-  CreateVideoRtpSender();
-
-  EXPECT_EQ(-1, video_media_channel_->max_bps());
-  webrtc::RtpParameters params = video_rtp_sender_->GetParameters();
-  EXPECT_EQ(1, params.encodings.size());
-  EXPECT_FALSE(params.encodings[0].max_bitrate_bps);
-  params.encodings[0].max_bitrate_bps = rtc::Optional<int>(1000);
-  EXPECT_TRUE(video_rtp_sender_->SetParameters(params));
-
-  // Read back the parameters and verify they have been changed.
-  params = video_rtp_sender_->GetParameters();
-  EXPECT_EQ(1, params.encodings.size());
-  EXPECT_EQ(rtc::Optional<int>(1000), params.encodings[0].max_bitrate_bps);
-
-  // Verify that the video channel received the new parameters.
-  params = video_media_channel_->GetRtpSendParameters(kVideoSsrc);
-  EXPECT_EQ(1, params.encodings.size());
-  EXPECT_EQ(rtc::Optional<int>(1000), params.encodings[0].max_bitrate_bps);
-
-  // Verify that the global bitrate limit has not been changed.
-  EXPECT_EQ(-1, video_media_channel_->max_bps());
-
-  DestroyVideoRtpSender();
-}
-
-TEST_F(RtpSenderReceiverTest, AudioReceiverCanSetParameters) {
-  CreateAudioRtpReceiver();
-
-  RtpParameters params = audio_rtp_receiver_->GetParameters();
-  EXPECT_EQ(1u, params.encodings.size());
-  EXPECT_TRUE(audio_rtp_receiver_->SetParameters(params));
-
-  DestroyAudioRtpReceiver();
-}
-
-TEST_F(RtpSenderReceiverTest, VideoReceiverCanSetParameters) {
-  CreateVideoRtpReceiver();
-
-  RtpParameters params = video_rtp_receiver_->GetParameters();
-  EXPECT_EQ(1u, params.encodings.size());
-  EXPECT_TRUE(video_rtp_receiver_->SetParameters(params));
-
-  DestroyVideoRtpReceiver();
-}
-
-// Test that makes sure that a video track content hint translates to the proper
-// value for sources that are not screencast.
-TEST_F(RtpSenderReceiverTest, PropagatesVideoTrackContentHint) {
-  CreateVideoRtpSender();
-
-  video_track_->set_enabled(true);
-
-  // |video_track_| is not screencast by default.
-  EXPECT_EQ(rtc::Optional<bool>(false),
-            video_media_channel_->options().is_screencast);
-  // No content hint should be set by default.
-  EXPECT_EQ(VideoTrackInterface::ContentHint::kNone,
-            video_track_->content_hint());
-  // Setting detailed should turn a non-screencast source into screencast mode.
-  video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
-  EXPECT_EQ(rtc::Optional<bool>(true),
-            video_media_channel_->options().is_screencast);
-  // Removing the content hint should turn the track back into non-screencast
-  // mode.
-  video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
-  EXPECT_EQ(rtc::Optional<bool>(false),
-            video_media_channel_->options().is_screencast);
-  // Setting fluid should remain in non-screencast mode (its default).
-  video_track_->set_content_hint(VideoTrackInterface::ContentHint::kFluid);
-  EXPECT_EQ(rtc::Optional<bool>(false),
-            video_media_channel_->options().is_screencast);
-
-  DestroyVideoRtpSender();
-}
-
-// Test that makes sure that a video track content hint translates to the proper
-// value for screencast sources.
-TEST_F(RtpSenderReceiverTest,
-       PropagatesVideoTrackContentHintForScreencastSource) {
-  CreateVideoRtpSender(true);
-
-  video_track_->set_enabled(true);
-
-  // |video_track_| with a screencast source should be screencast by default.
-  EXPECT_EQ(rtc::Optional<bool>(true),
-            video_media_channel_->options().is_screencast);
-  // No content hint should be set by default.
-  EXPECT_EQ(VideoTrackInterface::ContentHint::kNone,
-            video_track_->content_hint());
-  // Setting fluid should turn a screencast source into non-screencast mode.
-  video_track_->set_content_hint(VideoTrackInterface::ContentHint::kFluid);
-  EXPECT_EQ(rtc::Optional<bool>(false),
-            video_media_channel_->options().is_screencast);
-  // Removing the content hint should turn the track back into screencast mode.
-  video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
-  EXPECT_EQ(rtc::Optional<bool>(true),
-            video_media_channel_->options().is_screencast);
-  // Setting detailed should still remain in screencast mode (its default).
-  video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
-  EXPECT_EQ(rtc::Optional<bool>(true),
-            video_media_channel_->options().is_screencast);
-
-  DestroyVideoRtpSender();
-}
-
-// Test that makes sure any content hints that are set on a track before
-// VideoRtpSender is ready to send are still applied when it gets ready to send.
-TEST_F(RtpSenderReceiverTest,
-       PropagatesVideoTrackContentHintSetBeforeEnabling) {
-  AddVideoTrack();
-  // Setting detailed overrides the default non-screencast mode. This should be
-  // applied even if the track is set on construction.
-  video_track_->set_content_hint(VideoTrackInterface::ContentHint::kDetailed);
-  video_rtp_sender_ =
-      new VideoRtpSender(local_stream_->GetVideoTracks()[0],
-                         {local_stream_->label()}, video_channel_);
-  video_track_->set_enabled(true);
-
-  // Sender is not ready to send (no SSRC) so no option should have been set.
-  EXPECT_EQ(rtc::Optional<bool>(),
-            video_media_channel_->options().is_screencast);
-
-  // Verify that the content hint is accounted for when video_rtp_sender_ does
-  // get enabled.
-  video_rtp_sender_->SetSsrc(kVideoSsrc);
-  EXPECT_EQ(rtc::Optional<bool>(true),
-            video_media_channel_->options().is_screencast);
-
-  // And removing the hint should go back to false (to verify that false was
-  // default correctly).
-  video_track_->set_content_hint(VideoTrackInterface::ContentHint::kNone);
-  EXPECT_EQ(rtc::Optional<bool>(false),
-            video_media_channel_->options().is_screencast);
-
-  DestroyVideoRtpSender();
-}
-
-TEST_F(RtpSenderReceiverTest, AudioSenderHasDtmfSender) {
-  CreateAudioRtpSender();
-  EXPECT_NE(nullptr, audio_rtp_sender_->GetDtmfSender());
-}
-
-TEST_F(RtpSenderReceiverTest, VideoSenderDoesNotHaveDtmfSender) {
-  CreateVideoRtpSender();
-  EXPECT_EQ(nullptr, video_rtp_sender_->GetDtmfSender());
-}
-
-// Test that the DTMF sender is really using |voice_channel_|, and thus returns
-// true/false from CanSendDtmf based on what |voice_channel_| returns.
-TEST_F(RtpSenderReceiverTest, CanInsertDtmf) {
-  AddDtmfCodec();
-  CreateAudioRtpSender();
-  auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
-  ASSERT_NE(nullptr, dtmf_sender);
-  EXPECT_TRUE(dtmf_sender->CanInsertDtmf());
-}
-
-TEST_F(RtpSenderReceiverTest, CanNotInsertDtmf) {
-  CreateAudioRtpSender();
-  auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
-  ASSERT_NE(nullptr, dtmf_sender);
-  // DTMF codec has not been added, as it was in the above test.
-  EXPECT_FALSE(dtmf_sender->CanInsertDtmf());
-}
-
-TEST_F(RtpSenderReceiverTest, InsertDtmf) {
-  AddDtmfCodec();
-  CreateAudioRtpSender();
-  auto dtmf_sender = audio_rtp_sender_->GetDtmfSender();
-  ASSERT_NE(nullptr, dtmf_sender);
-
-  EXPECT_EQ(0U, voice_media_channel_->dtmf_info_queue().size());
-
-  // Insert DTMF
-  const int expected_duration = 90;
-  dtmf_sender->InsertDtmf("012", expected_duration, 100);
-
-  // Verify
-  ASSERT_EQ_WAIT(3U, voice_media_channel_->dtmf_info_queue().size(),
-                 kDefaultTimeout);
-  const uint32_t send_ssrc =
-      voice_media_channel_->send_streams()[0].first_ssrc();
-  EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[0],
-                              send_ssrc, 0, expected_duration));
-  EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[1],
-                              send_ssrc, 1, expected_duration));
-  EXPECT_TRUE(CompareDtmfInfo(voice_media_channel_->dtmf_info_queue()[2],
-                              send_ssrc, 2, expected_duration));
-}
-
-// Make sure the signal from "GetOnDestroyedSignal()" fires when the sender is
-// destroyed, which is needed for the DTMF sender.
-TEST_F(RtpSenderReceiverTest, TestOnDestroyedSignal) {
-  CreateAudioRtpSender();
-  EXPECT_FALSE(audio_sender_destroyed_signal_fired_);
-  audio_rtp_sender_ = nullptr;
-  EXPECT_TRUE(audio_sender_destroyed_signal_fired_);
-}
-
-}  // namespace webrtc
diff --git a/pc/rtptransport.cc b/pc/rtptransport.cc
deleted file mode 100644
index b267832..0000000
--- a/pc/rtptransport.cc
+++ /dev/null
@@ -1,230 +0,0 @@
-/*
- *  Copyright 2017 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/pc/rtptransport.h"
-
-#include "webrtc/media/base/rtputils.h"
-#include "webrtc/p2p/base/packettransportinterface.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/copyonwritebuffer.h"
-#include "webrtc/rtc_base/trace_event.h"
-
-namespace webrtc {
-
-void RtpTransport::SetRtcpMuxEnabled(bool enable) {
-  rtcp_mux_enabled_ = enable;
-  MaybeSignalReadyToSend();
-}
-
-void RtpTransport::SetRtpPacketTransport(
-    rtc::PacketTransportInternal* new_packet_transport) {
-  if (new_packet_transport == rtp_packet_transport_) {
-    return;
-  }
-  if (rtp_packet_transport_) {
-    rtp_packet_transport_->SignalReadyToSend.disconnect(this);
-    rtp_packet_transport_->SignalReadPacket.disconnect(this);
-  }
-  if (new_packet_transport) {
-    new_packet_transport->SignalReadyToSend.connect(
-        this, &RtpTransport::OnReadyToSend);
-    new_packet_transport->SignalReadPacket.connect(this,
-                                                   &RtpTransport::OnReadPacket);
-  }
-  rtp_packet_transport_ = new_packet_transport;
-
-  // Assumes the transport is ready to send if it is writable. If we are wrong,
-  // ready to send will be updated the next time we try to send.
-  SetReadyToSend(false,
-                 rtp_packet_transport_ && rtp_packet_transport_->writable());
-}
-
-void RtpTransport::SetRtcpPacketTransport(
-    rtc::PacketTransportInternal* new_packet_transport) {
-  if (new_packet_transport == rtcp_packet_transport_) {
-    return;
-  }
-  if (rtcp_packet_transport_) {
-    rtcp_packet_transport_->SignalReadyToSend.disconnect(this);
-    rtcp_packet_transport_->SignalReadPacket.disconnect(this);
-  }
-  if (new_packet_transport) {
-    new_packet_transport->SignalReadyToSend.connect(
-        this, &RtpTransport::OnReadyToSend);
-    new_packet_transport->SignalReadPacket.connect(this,
-                                                   &RtpTransport::OnReadPacket);
-  }
-  rtcp_packet_transport_ = new_packet_transport;
-
-  // Assumes the transport is ready to send if it is writable. If we are wrong,
-  // ready to send will be updated the next time we try to send.
-  SetReadyToSend(true,
-                 rtcp_packet_transport_ && rtcp_packet_transport_->writable());
-}
-
-bool RtpTransport::IsWritable(bool rtcp) const {
-  rtc::PacketTransportInternal* transport = rtcp && !rtcp_mux_enabled_
-                                                ? rtcp_packet_transport_
-                                                : rtp_packet_transport_;
-  return transport && transport->writable();
-}
-
-bool RtpTransport::SendRtpPacket(rtc::CopyOnWriteBuffer* packet,
-                                 const rtc::PacketOptions& options,
-                                 int flags) {
-  return SendPacket(false, packet, options, flags);
-}
-
-bool RtpTransport::SendRtcpPacket(rtc::CopyOnWriteBuffer* packet,
-                                  const rtc::PacketOptions& options,
-                                  int flags) {
-  return SendPacket(true, packet, options, flags);
-}
-
-bool RtpTransport::SendPacket(bool rtcp,
-                              rtc::CopyOnWriteBuffer* packet,
-                              const rtc::PacketOptions& options,
-                              int flags) {
-  rtc::PacketTransportInternal* transport = rtcp && !rtcp_mux_enabled_
-                                                ? rtcp_packet_transport_
-                                                : rtp_packet_transport_;
-  int ret = transport->SendPacket(packet->data<char>(), packet->size(), options,
-                                  flags);
-  if (ret != static_cast<int>(packet->size())) {
-    if (transport->GetError() == ENOTCONN) {
-      LOG(LS_WARNING) << "Got ENOTCONN from transport.";
-      SetReadyToSend(rtcp, false);
-    }
-    return false;
-  }
-  return true;
-}
-
-bool RtpTransport::HandlesPacket(const uint8_t* data, size_t len) {
-  return bundle_filter_.DemuxPacket(data, len);
-}
-
-bool RtpTransport::HandlesPayloadType(int payload_type) const {
-  return bundle_filter_.FindPayloadType(payload_type);
-}
-
-void RtpTransport::AddHandledPayloadType(int payload_type) {
-  bundle_filter_.AddPayloadType(payload_type);
-}
-
-PacketTransportInterface* RtpTransport::GetRtpPacketTransport() const {
-  return rtp_packet_transport_;
-}
-
-PacketTransportInterface* RtpTransport::GetRtcpPacketTransport() const {
-  return rtcp_packet_transport_;
-}
-
-RTCError RtpTransport::SetParameters(const RtpTransportParameters& parameters) {
-  if (parameters_.rtcp.mux && !parameters.rtcp.mux) {
-    LOG_AND_RETURN_ERROR(RTCErrorType::INVALID_STATE,
-                         "Disabling RTCP muxing is not allowed.");
-  }
-  if (parameters.keepalive != parameters_.keepalive) {
-    // TODO(sprang): Wire up support for keep-alive (only ORTC support for now).
-    LOG_AND_RETURN_ERROR(
-        RTCErrorType::INVALID_MODIFICATION,
-        "RTP keep-alive parameters not supported by this channel.");
-  }
-
-  RtpTransportParameters new_parameters = parameters;
-
-  if (new_parameters.rtcp.cname.empty()) {
-    new_parameters.rtcp.cname = parameters_.rtcp.cname;
-  }
-
-  parameters_ = new_parameters;
-  return RTCError::OK();
-}
-
-RtpTransportParameters RtpTransport::GetParameters() const {
-  return parameters_;
-}
-
-RtpTransportAdapter* RtpTransport::GetInternal() {
-  return nullptr;
-}
-
-void RtpTransport::OnReadyToSend(rtc::PacketTransportInternal* transport) {
-  SetReadyToSend(transport == rtcp_packet_transport_, true);
-}
-
-void RtpTransport::SetReadyToSend(bool rtcp, bool ready) {
-  if (rtcp) {
-    rtcp_ready_to_send_ = ready;
-  } else {
-    rtp_ready_to_send_ = ready;
-  }
-
-  MaybeSignalReadyToSend();
-}
-
-void RtpTransport::MaybeSignalReadyToSend() {
-  bool ready_to_send =
-      rtp_ready_to_send_ && (rtcp_ready_to_send_ || rtcp_mux_enabled_);
-  if (ready_to_send != ready_to_send_) {
-    ready_to_send_ = ready_to_send;
-    SignalReadyToSend(ready_to_send);
-  }
-}
-
-// Check the RTP payload type.  If 63 < payload type < 96, it's RTCP.
-// For additional details, see http://tools.ietf.org/html/rfc5761.
-bool IsRtcp(const char* data, int len) {
-  if (len < 2) {
-    return false;
-  }
-  char pt = data[1] & 0x7F;
-  return (63 < pt) && (pt < 96);
-}
-
-void RtpTransport::OnReadPacket(rtc::PacketTransportInternal* transport,
-                                const char* data,
-                                size_t len,
-                                const rtc::PacketTime& packet_time,
-                                int flags) {
-  TRACE_EVENT0("webrtc", "RtpTransport::OnReadPacket");
-
-  // When using RTCP multiplexing we might get RTCP packets on the RTP
-  // transport. We check the RTP payload type to determine if it is RTCP.
-  bool rtcp = transport == rtcp_packet_transport() ||
-              IsRtcp(data, static_cast<int>(len));
-  rtc::CopyOnWriteBuffer packet(data, len);
-
-  if (!WantsPacket(rtcp, &packet)) {
-    return;
-  }
-
-  // This mutates |packet| if it is protected.
-  SignalPacketReceived(rtcp, &packet, packet_time);
-}
-
-bool RtpTransport::WantsPacket(bool rtcp,
-                               const rtc::CopyOnWriteBuffer* packet) {
-  // Protect ourselves against crazy data.
-  if (!packet || !cricket::IsValidRtpRtcpPacketSize(rtcp, packet->size())) {
-    LOG(LS_ERROR) << "Dropping incoming " << cricket::RtpRtcpStringLiteral(rtcp)
-                  << " packet: wrong size=" << packet->size();
-    return false;
-  }
-  if (rtcp) {
-    // Permit all (seemingly valid) RTCP packets.
-    return true;
-  }
-  // Check whether we handle this payload.
-  return HandlesPacket(packet->data(), packet->size());
-}
-
-}  // namespace webrtc
diff --git a/pc/rtptransport.h b/pc/rtptransport.h
deleted file mode 100644
index 94c5877..0000000
--- a/pc/rtptransport.h
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- *  Copyright 2017 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_PC_RTPTRANSPORT_H_
-#define WEBRTC_PC_RTPTRANSPORT_H_
-
-#include "webrtc/pc/bundlefilter.h"
-#include "webrtc/pc/rtptransportinternal.h"
-#include "webrtc/rtc_base/sigslot.h"
-
-namespace rtc {
-
-class CopyOnWriteBuffer;
-struct PacketOptions;
-struct PacketTime;
-class PacketTransportInternal;
-
-}  // namespace rtc
-
-namespace webrtc {
-
-class RtpTransport : public RtpTransportInternal {
- public:
-  RtpTransport(const RtpTransport&) = delete;
-  RtpTransport& operator=(const RtpTransport&) = delete;
-
-  explicit RtpTransport(bool rtcp_mux_enabled)
-      : rtcp_mux_enabled_(rtcp_mux_enabled) {}
-
-  bool rtcp_mux_enabled() const { return rtcp_mux_enabled_; }
-  void SetRtcpMuxEnabled(bool enable) override;
-
-  rtc::PacketTransportInternal* rtp_packet_transport() const override {
-    return rtp_packet_transport_;
-  }
-  void SetRtpPacketTransport(rtc::PacketTransportInternal* rtp) override;
-
-  rtc::PacketTransportInternal* rtcp_packet_transport() const override {
-    return rtcp_packet_transport_;
-  }
-  void SetRtcpPacketTransport(rtc::PacketTransportInternal* rtcp) override;
-
-  PacketTransportInterface* GetRtpPacketTransport() const override;
-  PacketTransportInterface* GetRtcpPacketTransport() const override;
-
-  // TODO(zstein): Use these RtcpParameters for configuration elsewhere.
-  RTCError SetParameters(const RtpTransportParameters& parameters) override;
-  RtpTransportParameters GetParameters() const override;
-
-  bool IsWritable(bool rtcp) const override;
-
-  bool SendRtpPacket(rtc::CopyOnWriteBuffer* packet,
-                     const rtc::PacketOptions& options,
-                     int flags) override;
-
-  bool SendRtcpPacket(rtc::CopyOnWriteBuffer* packet,
-                      const rtc::PacketOptions& options,
-                      int flags) override;
-
-  bool HandlesPayloadType(int payload_type) const override;
-
-  void AddHandledPayloadType(int payload_type) override;
-
- protected:
-  // TODO(zstein): Remove this when we remove RtpTransportAdapter.
-  RtpTransportAdapter* GetInternal() override;
-
- private:
-  bool HandlesPacket(const uint8_t* data, size_t len);
-
-  void OnReadyToSend(rtc::PacketTransportInternal* transport);
-
-  // Updates "ready to send" for an individual channel and fires
-  // SignalReadyToSend.
-  void SetReadyToSend(bool rtcp, bool ready);
-
-  void MaybeSignalReadyToSend();
-
-  bool SendPacket(bool rtcp,
-                  rtc::CopyOnWriteBuffer* packet,
-                  const rtc::PacketOptions& options,
-                  int flags);
-
-  void OnReadPacket(rtc::PacketTransportInternal* transport,
-                    const char* data,
-                    size_t len,
-                    const rtc::PacketTime& packet_time,
-                    int flags);
-
-  bool WantsPacket(bool rtcp, const rtc::CopyOnWriteBuffer* packet);
-
-  bool rtcp_mux_enabled_;
-
-  rtc::PacketTransportInternal* rtp_packet_transport_ = nullptr;
-  rtc::PacketTransportInternal* rtcp_packet_transport_ = nullptr;
-
-  bool ready_to_send_ = false;
-  bool rtp_ready_to_send_ = false;
-  bool rtcp_ready_to_send_ = false;
-
-  RtpTransportParameters parameters_;
-
-  cricket::BundleFilter bundle_filter_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_PC_RTPTRANSPORT_H_
diff --git a/pc/rtptransport_unittest.cc b/pc/rtptransport_unittest.cc
deleted file mode 100644
index 0ed77ee..0000000
--- a/pc/rtptransport_unittest.cc
+++ /dev/null
@@ -1,225 +0,0 @@
-/*
- *  Copyright 2017 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 <string>
-
-#include "webrtc/p2p/base/fakepackettransport.h"
-#include "webrtc/pc/rtptransport.h"
-#include "webrtc/pc/rtptransporttestutil.h"
-#include "webrtc/rtc_base/gunit.h"
-
-namespace webrtc {
-
-constexpr bool kMuxDisabled = false;
-constexpr bool kMuxEnabled = true;
-
-TEST(RtpTransportTest, SetRtcpParametersCantDisableRtcpMux) {
-  RtpTransport transport(kMuxDisabled);
-  RtpTransportParameters params;
-  transport.SetParameters(params);
-  params.rtcp.mux = false;
-  EXPECT_FALSE(transport.SetParameters(params).ok());
-}
-
-TEST(RtpTransportTest, SetRtcpParametersEmptyCnameUsesExisting) {
-  static const char kName[] = "name";
-  RtpTransport transport(kMuxDisabled);
-  RtpTransportParameters params_with_name;
-  params_with_name.rtcp.cname = kName;
-  transport.SetParameters(params_with_name);
-  EXPECT_EQ(transport.GetParameters().rtcp.cname, kName);
-
-  RtpTransportParameters params_without_name;
-  transport.SetParameters(params_without_name);
-  EXPECT_EQ(transport.GetParameters().rtcp.cname, kName);
-}
-
-TEST(RtpTransportTest, SetRtpTransportKeepAliveNotSupported) {
-  // Tests that we warn users that keep-alive isn't supported yet.
-  // TODO(sprang): Wire up keep-alive and remove this test.
-  RtpTransport transport(kMuxDisabled);
-  RtpTransportParameters params;
-  params.keepalive.timeout_interval_ms = 1;
-  auto result = transport.SetParameters(params);
-  EXPECT_FALSE(result.ok());
-  EXPECT_EQ(RTCErrorType::INVALID_MODIFICATION, result.type());
-}
-
-class SignalObserver : public sigslot::has_slots<> {
- public:
-  explicit SignalObserver(RtpTransport* transport) {
-    transport->SignalReadyToSend.connect(this, &SignalObserver::OnReadyToSend);
-  }
-  bool ready() const { return ready_; }
-  void OnReadyToSend(bool ready) { ready_ = ready; }
-
- private:
-  bool ready_ = false;
-};
-
-TEST(RtpTransportTest, SettingRtcpAndRtpSignalsReady) {
-  RtpTransport transport(kMuxDisabled);
-  SignalObserver observer(&transport);
-  rtc::FakePacketTransport fake_rtcp("fake_rtcp");
-  fake_rtcp.SetWritable(true);
-  rtc::FakePacketTransport fake_rtp("fake_rtp");
-  fake_rtp.SetWritable(true);
-
-  transport.SetRtcpPacketTransport(&fake_rtcp);  // rtcp ready
-  EXPECT_FALSE(observer.ready());
-  transport.SetRtpPacketTransport(&fake_rtp);  // rtp ready
-  EXPECT_TRUE(observer.ready());
-}
-
-TEST(RtpTransportTest, SettingRtpAndRtcpSignalsReady) {
-  RtpTransport transport(kMuxDisabled);
-  SignalObserver observer(&transport);
-  rtc::FakePacketTransport fake_rtcp("fake_rtcp");
-  fake_rtcp.SetWritable(true);
-  rtc::FakePacketTransport fake_rtp("fake_rtp");
-  fake_rtp.SetWritable(true);
-
-  transport.SetRtpPacketTransport(&fake_rtp);  // rtp ready
-  EXPECT_FALSE(observer.ready());
-  transport.SetRtcpPacketTransport(&fake_rtcp);  // rtcp ready
-  EXPECT_TRUE(observer.ready());
-}
-
-TEST(RtpTransportTest, SettingRtpWithRtcpMuxEnabledSignalsReady) {
-  RtpTransport transport(kMuxEnabled);
-  SignalObserver observer(&transport);
-  rtc::FakePacketTransport fake_rtp("fake_rtp");
-  fake_rtp.SetWritable(true);
-
-  transport.SetRtpPacketTransport(&fake_rtp);  // rtp ready
-  EXPECT_TRUE(observer.ready());
-}
-
-TEST(RtpTransportTest, DisablingRtcpMuxSignalsNotReady) {
-  RtpTransport transport(kMuxEnabled);
-  SignalObserver observer(&transport);
-  rtc::FakePacketTransport fake_rtp("fake_rtp");
-  fake_rtp.SetWritable(true);
-
-  transport.SetRtpPacketTransport(&fake_rtp);  // rtp ready
-  EXPECT_TRUE(observer.ready());
-
-  transport.SetRtcpMuxEnabled(false);
-  EXPECT_FALSE(observer.ready());
-}
-
-TEST(RtpTransportTest, EnablingRtcpMuxSignalsReady) {
-  RtpTransport transport(kMuxDisabled);
-  SignalObserver observer(&transport);
-  rtc::FakePacketTransport fake_rtp("fake_rtp");
-  fake_rtp.SetWritable(true);
-
-  transport.SetRtpPacketTransport(&fake_rtp);  // rtp ready
-  EXPECT_FALSE(observer.ready());
-
-  transport.SetRtcpMuxEnabled(true);
-  EXPECT_TRUE(observer.ready());
-}
-
-class SignalCounter : public sigslot::has_slots<> {
- public:
-  explicit SignalCounter(RtpTransport* transport) {
-    transport->SignalReadyToSend.connect(this, &SignalCounter::OnReadyToSend);
-  }
-  int count() const { return count_; }
-  void OnReadyToSend(bool ready) { ++count_; }
-
- private:
-  int count_ = 0;
-};
-
-TEST(RtpTransportTest, ChangingReadyToSendStateOnlySignalsWhenChanged) {
-  RtpTransport transport(kMuxEnabled);
-  SignalCounter observer(&transport);
-  rtc::FakePacketTransport fake_rtp("fake_rtp");
-  fake_rtp.SetWritable(true);
-
-  // State changes, so we should signal.
-  transport.SetRtpPacketTransport(&fake_rtp);
-  EXPECT_EQ(observer.count(), 1);
-
-  // State does not change, so we should not signal.
-  transport.SetRtpPacketTransport(&fake_rtp);
-  EXPECT_EQ(observer.count(), 1);
-
-  // State does not change, so we should not signal.
-  transport.SetRtcpMuxEnabled(true);
-  EXPECT_EQ(observer.count(), 1);
-
-  // State changes, so we should signal.
-  transport.SetRtcpMuxEnabled(false);
-  EXPECT_EQ(observer.count(), 2);
-}
-
-// Test that SignalPacketReceived fires with rtcp=true when a RTCP packet is
-// received.
-TEST(RtpTransportTest, SignalDemuxedRtcp) {
-  RtpTransport transport(kMuxDisabled);
-  SignalPacketReceivedCounter observer(&transport);
-  rtc::FakePacketTransport fake_rtp("fake_rtp");
-  fake_rtp.SetDestination(&fake_rtp, true);
-  transport.SetRtpPacketTransport(&fake_rtp);
-
-  // An rtcp packet.
-  const char data[] = {0, 73, 0, 0};
-  const int len = 4;
-  const rtc::PacketOptions options;
-  const int flags = 0;
-  fake_rtp.SendPacket(data, len, options, flags);
-  EXPECT_EQ(0, observer.rtp_count());
-  EXPECT_EQ(1, observer.rtcp_count());
-}
-
-static const unsigned char kRtpData[] = {0x80, 0x11, 0, 0, 0, 0,
-                                         0,    0,    0, 0, 0, 0};
-static const int kRtpLen = 12;
-
-// Test that SignalPacketReceived fires with rtcp=false when a RTP packet with a
-// handled payload type is received.
-TEST(RtpTransportTest, SignalHandledRtpPayloadType) {
-  RtpTransport transport(kMuxDisabled);
-  SignalPacketReceivedCounter observer(&transport);
-  rtc::FakePacketTransport fake_rtp("fake_rtp");
-  fake_rtp.SetDestination(&fake_rtp, true);
-  transport.SetRtpPacketTransport(&fake_rtp);
-  transport.AddHandledPayloadType(0x11);
-
-  // An rtp packet.
-  const rtc::PacketOptions options;
-  const int flags = 0;
-  rtc::Buffer rtp_data(kRtpData, kRtpLen);
-  fake_rtp.SendPacket(rtp_data.data<char>(), kRtpLen, options, flags);
-  EXPECT_EQ(1, observer.rtp_count());
-  EXPECT_EQ(0, observer.rtcp_count());
-}
-
-// Test that SignalPacketReceived does not fire when a RTP packet with an
-// unhandled payload type is received.
-TEST(RtpTransportTest, DontSignalUnhandledRtpPayloadType) {
-  RtpTransport transport(kMuxDisabled);
-  SignalPacketReceivedCounter observer(&transport);
-  rtc::FakePacketTransport fake_rtp("fake_rtp");
-  fake_rtp.SetDestination(&fake_rtp, true);
-  transport.SetRtpPacketTransport(&fake_rtp);
-
-  const rtc::PacketOptions options;
-  const int flags = 0;
-  rtc::Buffer rtp_data(kRtpData, kRtpLen);
-  fake_rtp.SendPacket(rtp_data.data<char>(), kRtpLen, options, flags);
-  EXPECT_EQ(0, observer.rtp_count());
-  EXPECT_EQ(0, observer.rtcp_count());
-}
-
-}  // namespace webrtc
diff --git a/pc/rtptransportinternal.h b/pc/rtptransportinternal.h
deleted file mode 100644
index 684afc4..0000000
--- a/pc/rtptransportinternal.h
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- *  Copyright 2017 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_PC_RTPTRANSPORTINTERNAL_H_
-#define WEBRTC_PC_RTPTRANSPORTINTERNAL_H_
-
-#include "webrtc/api/ortc/rtptransportinterface.h"
-#include "webrtc/rtc_base/sigslot.h"
-
-namespace rtc {
-class CopyOnWriteBuffer;
-struct PacketOptions;
-struct PacketTime;
-}  // namespace rtc
-
-namespace webrtc {
-
-// This represents the internal interface beneath RtpTransportInterface;
-// it is not accessible to API consumers but is accessible to internal classes
-// in order to send and receive RTP and RTCP packets belonging to a single RTP
-// session. Additional convenience and configuration methods are also provided.
-class RtpTransportInternal : public RtpTransportInterface,
-                             public sigslot::has_slots<> {
- public:
-  virtual void SetRtcpMuxEnabled(bool enable) = 0;
-
-  // TODO(zstein): Remove PacketTransport setters. Clients should pass these
-  // in to constructors instead and construct a new RtpTransportInternal instead
-  // of updating them.
-
-  virtual rtc::PacketTransportInternal* rtp_packet_transport() const = 0;
-  virtual void SetRtpPacketTransport(rtc::PacketTransportInternal* rtp) = 0;
-
-  virtual rtc::PacketTransportInternal* rtcp_packet_transport() const = 0;
-  virtual void SetRtcpPacketTransport(rtc::PacketTransportInternal* rtcp) = 0;
-
-  // Called whenever a transport's ready-to-send state changes. The argument
-  // is true if all used transports are ready to send. This is more specific
-  // than just "writable"; it means the last send didn't return ENOTCONN.
-  sigslot::signal1<bool> SignalReadyToSend;
-
-  // TODO(zstein): Consider having two signals - RtpPacketReceived and
-  // RtcpPacketReceived.
-  // The first argument is true for RTCP packets and false for RTP packets.
-  sigslot::signal3<bool, rtc::CopyOnWriteBuffer*, const rtc::PacketTime&>
-      SignalPacketReceived;
-
-  virtual bool IsWritable(bool rtcp) const = 0;
-
-  virtual bool SendRtpPacket(rtc::CopyOnWriteBuffer* packet,
-                             const rtc::PacketOptions& options,
-                             int flags) = 0;
-
-  virtual bool SendRtcpPacket(rtc::CopyOnWriteBuffer* packet,
-                              const rtc::PacketOptions& options,
-                              int flags) = 0;
-
-  virtual bool HandlesPayloadType(int payload_type) const = 0;
-
-  virtual void AddHandledPayloadType(int payload_type) = 0;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_PC_RTPTRANSPORTINTERNAL_H_
diff --git a/pc/rtptransporttestutil.h b/pc/rtptransporttestutil.h
deleted file mode 100644
index 92cfaec..0000000
--- a/pc/rtptransporttestutil.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- *  Copyright 2017 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_PC_RTPTRANSPORTTESTUTIL_H_
-#define WEBRTC_PC_RTPTRANSPORTTESTUTIL_H_
-
-#include "webrtc/pc/rtptransportinternal.h"
-#include "webrtc/rtc_base/sigslot.h"
-
-namespace webrtc {
-
-class SignalPacketReceivedCounter : public sigslot::has_slots<> {
- public:
-  explicit SignalPacketReceivedCounter(RtpTransportInternal* transport) {
-    transport->SignalPacketReceived.connect(
-        this, &SignalPacketReceivedCounter::OnPacketReceived);
-  }
-  int rtcp_count() const { return rtcp_count_; }
-  int rtp_count() const { return rtp_count_; }
-
- private:
-  void OnPacketReceived(bool rtcp,
-                        rtc::CopyOnWriteBuffer*,
-                        const rtc::PacketTime&) {
-    if (rtcp) {
-      ++rtcp_count_;
-    } else {
-      ++rtp_count_;
-    }
-  }
-  int rtcp_count_ = 0;
-  int rtp_count_ = 0;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_PC_RTPTRANSPORTTESTUTIL_H_
diff --git a/pc/sctputils.cc b/pc/sctputils.cc
deleted file mode 100644
index 48f380b..0000000
--- a/pc/sctputils.cc
+++ /dev/null
@@ -1,188 +0,0 @@
-/*
- *  Copyright 2013 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/pc/sctputils.h"
-
-#include "webrtc/rtc_base/bytebuffer.h"
-#include "webrtc/rtc_base/copyonwritebuffer.h"
-#include "webrtc/rtc_base/logging.h"
-
-namespace webrtc {
-
-// Format defined at
-// http://tools.ietf.org/html/draft-ietf-rtcweb-data-protocol-01#section
-
-static const uint8_t DATA_CHANNEL_OPEN_MESSAGE_TYPE = 0x03;
-static const uint8_t DATA_CHANNEL_OPEN_ACK_MESSAGE_TYPE = 0x02;
-
-enum DataChannelOpenMessageChannelType {
-  DCOMCT_ORDERED_RELIABLE = 0x00,
-  DCOMCT_ORDERED_PARTIAL_RTXS = 0x01,
-  DCOMCT_ORDERED_PARTIAL_TIME = 0x02,
-  DCOMCT_UNORDERED_RELIABLE = 0x80,
-  DCOMCT_UNORDERED_PARTIAL_RTXS = 0x81,
-  DCOMCT_UNORDERED_PARTIAL_TIME = 0x82,
-};
-
-bool IsOpenMessage(const rtc::CopyOnWriteBuffer& payload) {
-  // Format defined at
-  // http://tools.ietf.org/html/draft-jesup-rtcweb-data-protocol-04
-  if (payload.size() < 1) {
-    LOG(LS_WARNING) << "Could not read OPEN message type.";
-    return false;
-  }
-
-  uint8_t message_type = payload[0];
-  return message_type == DATA_CHANNEL_OPEN_MESSAGE_TYPE;
-}
-
-bool ParseDataChannelOpenMessage(const rtc::CopyOnWriteBuffer& payload,
-                                 std::string* label,
-                                 DataChannelInit* config) {
-  // Format defined at
-  // http://tools.ietf.org/html/draft-jesup-rtcweb-data-protocol-04
-
-  rtc::ByteBufferReader buffer(payload.data<char>(), payload.size());
-  uint8_t message_type;
-  if (!buffer.ReadUInt8(&message_type)) {
-    LOG(LS_WARNING) << "Could not read OPEN message type.";
-    return false;
-  }
-  if (message_type != DATA_CHANNEL_OPEN_MESSAGE_TYPE) {
-    LOG(LS_WARNING) << "Data Channel OPEN message of unexpected type: "
-                    << message_type;
-    return false;
-  }
-
-  uint8_t channel_type;
-  if (!buffer.ReadUInt8(&channel_type)) {
-    LOG(LS_WARNING) << "Could not read OPEN message channel type.";
-    return false;
-  }
-
-  uint16_t priority;
-  if (!buffer.ReadUInt16(&priority)) {
-    LOG(LS_WARNING) << "Could not read OPEN message reliabilility prioirty.";
-    return false;
-  }
-  uint32_t reliability_param;
-  if (!buffer.ReadUInt32(&reliability_param)) {
-    LOG(LS_WARNING) << "Could not read OPEN message reliabilility param.";
-    return false;
-  }
-  uint16_t label_length;
-  if (!buffer.ReadUInt16(&label_length)) {
-    LOG(LS_WARNING) << "Could not read OPEN message label length.";
-    return false;
-  }
-  uint16_t protocol_length;
-  if (!buffer.ReadUInt16(&protocol_length)) {
-    LOG(LS_WARNING) << "Could not read OPEN message protocol length.";
-    return false;
-  }
-  if (!buffer.ReadString(label, (size_t) label_length)) {
-    LOG(LS_WARNING) << "Could not read OPEN message label";
-    return false;
-  }
-  if (!buffer.ReadString(&config->protocol, protocol_length)) {
-    LOG(LS_WARNING) << "Could not read OPEN message protocol.";
-    return false;
-  }
-
-  config->ordered = true;
-  switch (channel_type) {
-    case DCOMCT_UNORDERED_RELIABLE:
-    case DCOMCT_UNORDERED_PARTIAL_RTXS:
-    case DCOMCT_UNORDERED_PARTIAL_TIME:
-      config->ordered = false;
-  }
-
-  config->maxRetransmits = -1;
-  config->maxRetransmitTime = -1;
-  switch (channel_type) {
-    case DCOMCT_ORDERED_PARTIAL_RTXS:
-    case DCOMCT_UNORDERED_PARTIAL_RTXS:
-      config->maxRetransmits = reliability_param;
-      break;
-    case DCOMCT_ORDERED_PARTIAL_TIME:
-    case DCOMCT_UNORDERED_PARTIAL_TIME:
-      config->maxRetransmitTime = reliability_param;
-      break;
-  }
-  return true;
-}
-
-bool ParseDataChannelOpenAckMessage(const rtc::CopyOnWriteBuffer& payload) {
-  if (payload.size() < 1) {
-    LOG(LS_WARNING) << "Could not read OPEN_ACK message type.";
-    return false;
-  }
-
-  uint8_t message_type = payload[0];
-  if (message_type != DATA_CHANNEL_OPEN_ACK_MESSAGE_TYPE) {
-    LOG(LS_WARNING) << "Data Channel OPEN_ACK message of unexpected type: "
-                    << message_type;
-    return false;
-  }
-  return true;
-}
-
-bool WriteDataChannelOpenMessage(const std::string& label,
-                                 const DataChannelInit& config,
-                                 rtc::CopyOnWriteBuffer* payload) {
-  // Format defined at
-  // http://tools.ietf.org/html/draft-ietf-rtcweb-data-protocol-00#section-6.1
-  uint8_t channel_type = 0;
-  uint32_t reliability_param = 0;
-  uint16_t priority = 0;
-  if (config.ordered) {
-    if (config.maxRetransmits > -1) {
-      channel_type = DCOMCT_ORDERED_PARTIAL_RTXS;
-      reliability_param = config.maxRetransmits;
-    } else if (config.maxRetransmitTime > -1) {
-      channel_type = DCOMCT_ORDERED_PARTIAL_TIME;
-      reliability_param = config.maxRetransmitTime;
-    } else {
-      channel_type = DCOMCT_ORDERED_RELIABLE;
-    }
-  } else {
-    if (config.maxRetransmits > -1) {
-      channel_type = DCOMCT_UNORDERED_PARTIAL_RTXS;
-      reliability_param = config.maxRetransmits;
-    } else if (config.maxRetransmitTime > -1) {
-      channel_type = DCOMCT_UNORDERED_PARTIAL_TIME;
-      reliability_param = config.maxRetransmitTime;
-    } else {
-      channel_type = DCOMCT_UNORDERED_RELIABLE;
-    }
-  }
-
-  rtc::ByteBufferWriter buffer(
-      NULL, 20 + label.length() + config.protocol.length(),
-      rtc::ByteBuffer::ORDER_NETWORK);
-  // TODO(tommi): Add error handling and check resulting length.
-  buffer.WriteUInt8(DATA_CHANNEL_OPEN_MESSAGE_TYPE);
-  buffer.WriteUInt8(channel_type);
-  buffer.WriteUInt16(priority);
-  buffer.WriteUInt32(reliability_param);
-  buffer.WriteUInt16(static_cast<uint16_t>(label.length()));
-  buffer.WriteUInt16(static_cast<uint16_t>(config.protocol.length()));
-  buffer.WriteString(label);
-  buffer.WriteString(config.protocol);
-  payload->SetData(buffer.Data(), buffer.Length());
-  return true;
-}
-
-void WriteDataChannelOpenAckMessage(rtc::CopyOnWriteBuffer* payload) {
-  uint8_t data = DATA_CHANNEL_OPEN_ACK_MESSAGE_TYPE;
-  payload->SetData(&data, sizeof(data));
-}
-
-}  // namespace webrtc
diff --git a/pc/sctputils.h b/pc/sctputils.h
deleted file mode 100644
index 940bd36..0000000
--- a/pc/sctputils.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- *  Copyright 2013 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_PC_SCTPUTILS_H_
-#define WEBRTC_PC_SCTPUTILS_H_
-
-#include <string>
-
-#include "webrtc/api/datachannelinterface.h"
-
-namespace rtc {
-class CopyOnWriteBuffer;
-}  // namespace rtc
-
-namespace webrtc {
-struct DataChannelInit;
-
-// Read the message type and return true if it's an OPEN message.
-bool IsOpenMessage(const rtc::CopyOnWriteBuffer& payload);
-
-bool ParseDataChannelOpenMessage(const rtc::CopyOnWriteBuffer& payload,
-                                 std::string* label,
-                                 DataChannelInit* config);
-
-bool ParseDataChannelOpenAckMessage(const rtc::CopyOnWriteBuffer& payload);
-
-bool WriteDataChannelOpenMessage(const std::string& label,
-                                 const DataChannelInit& config,
-                                 rtc::CopyOnWriteBuffer* payload);
-
-void WriteDataChannelOpenAckMessage(rtc::CopyOnWriteBuffer* payload);
-}  // namespace webrtc
-
-#endif  // WEBRTC_PC_SCTPUTILS_H_
diff --git a/pc/sctputils_unittest.cc b/pc/sctputils_unittest.cc
deleted file mode 100644
index 5ef3fcb..0000000
--- a/pc/sctputils_unittest.cc
+++ /dev/null
@@ -1,162 +0,0 @@
-/*
- *  Copyright 2013 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/pc/sctputils.h"
-#include "webrtc/rtc_base/bytebuffer.h"
-#include "webrtc/rtc_base/copyonwritebuffer.h"
-#include "webrtc/rtc_base/gunit.h"
-
-class SctpUtilsTest : public testing::Test {
- public:
-  void VerifyOpenMessageFormat(const rtc::CopyOnWriteBuffer& packet,
-                               const std::string& label,
-                               const webrtc::DataChannelInit& config) {
-    uint8_t message_type;
-    uint8_t channel_type;
-    uint32_t reliability;
-    uint16_t priority;
-    uint16_t label_length;
-    uint16_t protocol_length;
-
-    rtc::ByteBufferReader buffer(packet.data<char>(), packet.size());
-    ASSERT_TRUE(buffer.ReadUInt8(&message_type));
-    EXPECT_EQ(0x03, message_type);
-
-    ASSERT_TRUE(buffer.ReadUInt8(&channel_type));
-    if (config.ordered) {
-      EXPECT_EQ(config.maxRetransmits > -1 ?
-                    0x01 : (config.maxRetransmitTime > -1 ? 0x02 : 0),
-                channel_type);
-    } else {
-      EXPECT_EQ(config.maxRetransmits > -1 ?
-                    0x81 : (config.maxRetransmitTime > -1 ? 0x82 : 0x80),
-                channel_type);
-    }
-
-    ASSERT_TRUE(buffer.ReadUInt16(&priority));
-
-    ASSERT_TRUE(buffer.ReadUInt32(&reliability));
-    if (config.maxRetransmits > -1 || config.maxRetransmitTime > -1) {
-      EXPECT_EQ(config.maxRetransmits > -1 ?
-                    config.maxRetransmits : config.maxRetransmitTime,
-                static_cast<int>(reliability));
-    }
-
-    ASSERT_TRUE(buffer.ReadUInt16(&label_length));
-    ASSERT_TRUE(buffer.ReadUInt16(&protocol_length));
-    EXPECT_EQ(label.size(), label_length);
-    EXPECT_EQ(config.protocol.size(), protocol_length);
-
-    std::string label_output;
-    ASSERT_TRUE(buffer.ReadString(&label_output, label_length));
-    EXPECT_EQ(label, label_output);
-    std::string protocol_output;
-    ASSERT_TRUE(buffer.ReadString(&protocol_output, protocol_length));
-    EXPECT_EQ(config.protocol, protocol_output);
-  }
-};
-
-TEST_F(SctpUtilsTest, WriteParseOpenMessageWithOrderedReliable) {
-  webrtc::DataChannelInit config;
-  std::string label = "abc";
-  config.protocol = "y";
-
-  rtc::CopyOnWriteBuffer packet;
-  ASSERT_TRUE(webrtc::WriteDataChannelOpenMessage(label, config, &packet));
-
-  VerifyOpenMessageFormat(packet, label, config);
-
-  std::string output_label;
-  webrtc::DataChannelInit output_config;
-  ASSERT_TRUE(webrtc::ParseDataChannelOpenMessage(
-      packet, &output_label, &output_config));
-
-  EXPECT_EQ(label, output_label);
-  EXPECT_EQ(config.protocol, output_config.protocol);
-  EXPECT_EQ(config.ordered, output_config.ordered);
-  EXPECT_EQ(config.maxRetransmitTime, output_config.maxRetransmitTime);
-  EXPECT_EQ(config.maxRetransmits, output_config.maxRetransmits);
-}
-
-TEST_F(SctpUtilsTest, WriteParseOpenMessageWithMaxRetransmitTime) {
-  webrtc::DataChannelInit config;
-  std::string label = "abc";
-  config.ordered = false;
-  config.maxRetransmitTime = 10;
-  config.protocol = "y";
-
-  rtc::CopyOnWriteBuffer packet;
-  ASSERT_TRUE(webrtc::WriteDataChannelOpenMessage(label, config, &packet));
-
-  VerifyOpenMessageFormat(packet, label, config);
-
-  std::string output_label;
-  webrtc::DataChannelInit output_config;
-  ASSERT_TRUE(webrtc::ParseDataChannelOpenMessage(
-      packet, &output_label, &output_config));
-
-  EXPECT_EQ(label, output_label);
-  EXPECT_EQ(config.protocol, output_config.protocol);
-  EXPECT_EQ(config.ordered, output_config.ordered);
-  EXPECT_EQ(config.maxRetransmitTime, output_config.maxRetransmitTime);
-  EXPECT_EQ(-1, output_config.maxRetransmits);
-}
-
-TEST_F(SctpUtilsTest, WriteParseOpenMessageWithMaxRetransmits) {
-  webrtc::DataChannelInit config;
-  std::string label = "abc";
-  config.maxRetransmits = 10;
-  config.protocol = "y";
-
-  rtc::CopyOnWriteBuffer packet;
-  ASSERT_TRUE(webrtc::WriteDataChannelOpenMessage(label, config, &packet));
-
-  VerifyOpenMessageFormat(packet, label, config);
-
-  std::string output_label;
-  webrtc::DataChannelInit output_config;
-  ASSERT_TRUE(webrtc::ParseDataChannelOpenMessage(
-      packet, &output_label, &output_config));
-
-  EXPECT_EQ(label, output_label);
-  EXPECT_EQ(config.protocol, output_config.protocol);
-  EXPECT_EQ(config.ordered, output_config.ordered);
-  EXPECT_EQ(config.maxRetransmits, output_config.maxRetransmits);
-  EXPECT_EQ(-1, output_config.maxRetransmitTime);
-}
-
-TEST_F(SctpUtilsTest, WriteParseAckMessage) {
-  rtc::CopyOnWriteBuffer packet;
-  webrtc::WriteDataChannelOpenAckMessage(&packet);
-
-  uint8_t message_type;
-  rtc::ByteBufferReader buffer(packet.data<char>(), packet.size());
-  ASSERT_TRUE(buffer.ReadUInt8(&message_type));
-  EXPECT_EQ(0x02, message_type);
-
-  EXPECT_TRUE(webrtc::ParseDataChannelOpenAckMessage(packet));
-}
-
-TEST_F(SctpUtilsTest, TestIsOpenMessage) {
-  rtc::CopyOnWriteBuffer open(1);
-  open[0] = 0x03;
-  EXPECT_TRUE(webrtc::IsOpenMessage(open));
-
-  rtc::CopyOnWriteBuffer openAck(1);
-  openAck[0] = 0x02;
-  EXPECT_FALSE(webrtc::IsOpenMessage(openAck));
-
-  rtc::CopyOnWriteBuffer invalid(1);
-  invalid[0] = 0x01;
-  EXPECT_FALSE(webrtc::IsOpenMessage(invalid));
-
-  rtc::CopyOnWriteBuffer empty;
-  EXPECT_FALSE(webrtc::IsOpenMessage(empty));
-}
diff --git a/pc/srtpfilter.cc b/pc/srtpfilter.cc
deleted file mode 100644
index 560dac8..0000000
--- a/pc/srtpfilter.cc
+++ /dev/null
@@ -1,264 +0,0 @@
-/*
- *  Copyright 2009 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/pc/srtpfilter.h"
-
-#include <string.h>
-
-#include <algorithm>
-
-#include "webrtc/media/base/rtputils.h"
-#include "webrtc/pc/srtpsession.h"
-#include "webrtc/rtc_base/base64.h"
-#include "webrtc/rtc_base/byteorder.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/stringencode.h"
-#include "webrtc/rtc_base/timeutils.h"
-
-namespace cricket {
-
-// NOTE: This is called from ChannelManager D'tor.
-void ShutdownSrtp() {
-  // If srtp_dealloc is not executed then this will clear all existing sessions.
-  // This should be called when application is shutting down.
-  SrtpSession::Terminate();
-}
-
-SrtpFilter::SrtpFilter() {
-}
-
-SrtpFilter::~SrtpFilter() {
-}
-
-bool SrtpFilter::IsActive() const {
-  return state_ >= ST_ACTIVE;
-}
-
-bool SrtpFilter::SetOffer(const std::vector<CryptoParams>& offer_params,
-                          ContentSource source) {
-  if (!ExpectOffer(source)) {
-     LOG(LS_ERROR) << "Wrong state to update SRTP offer";
-     return false;
-  }
-  return StoreParams(offer_params, source);
-}
-
-bool SrtpFilter::SetAnswer(const std::vector<CryptoParams>& answer_params,
-                           ContentSource source) {
-  return DoSetAnswer(answer_params, source, true);
-}
-
-bool SrtpFilter::SetProvisionalAnswer(
-    const std::vector<CryptoParams>& answer_params,
-    ContentSource source) {
-  return DoSetAnswer(answer_params, source, false);
-}
-
-bool SrtpFilter::ExpectOffer(ContentSource source) {
-  return ((state_ == ST_INIT) ||
-          (state_ == ST_ACTIVE) ||
-          (state_  == ST_SENTOFFER && source == CS_LOCAL) ||
-          (state_  == ST_SENTUPDATEDOFFER && source == CS_LOCAL) ||
-          (state_ == ST_RECEIVEDOFFER && source == CS_REMOTE) ||
-          (state_ == ST_RECEIVEDUPDATEDOFFER && source == CS_REMOTE));
-}
-
-bool SrtpFilter::StoreParams(const std::vector<CryptoParams>& params,
-                             ContentSource source) {
-  offer_params_ = params;
-  if (state_ == ST_INIT) {
-    state_ = (source == CS_LOCAL) ? ST_SENTOFFER : ST_RECEIVEDOFFER;
-  } else if (state_ == ST_ACTIVE) {
-    state_ =
-        (source == CS_LOCAL) ? ST_SENTUPDATEDOFFER : ST_RECEIVEDUPDATEDOFFER;
-  }
-  return true;
-}
-
-bool SrtpFilter::ExpectAnswer(ContentSource source) {
-  return ((state_ == ST_SENTOFFER && source == CS_REMOTE) ||
-          (state_ == ST_RECEIVEDOFFER && source == CS_LOCAL) ||
-          (state_ == ST_SENTUPDATEDOFFER && source == CS_REMOTE) ||
-          (state_ == ST_RECEIVEDUPDATEDOFFER && source == CS_LOCAL) ||
-          (state_ == ST_SENTPRANSWER_NO_CRYPTO && source == CS_LOCAL) ||
-          (state_ == ST_SENTPRANSWER && source == CS_LOCAL) ||
-          (state_ == ST_RECEIVEDPRANSWER_NO_CRYPTO && source == CS_REMOTE) ||
-          (state_ == ST_RECEIVEDPRANSWER && source == CS_REMOTE));
-}
-
-bool SrtpFilter::DoSetAnswer(const std::vector<CryptoParams>& answer_params,
-                             ContentSource source,
-                             bool final) {
-  if (!ExpectAnswer(source)) {
-    LOG(LS_ERROR) << "Invalid state for SRTP answer";
-    return false;
-  }
-
-  // If the answer doesn't requests crypto complete the negotiation of an
-  // unencrypted session.
-  // Otherwise, finalize the parameters and apply them.
-  if (answer_params.empty()) {
-    if (final) {
-      return ResetParams();
-    } else {
-      // Need to wait for the final answer to decide if
-      // we should go to Active state.
-      state_ = (source == CS_LOCAL) ? ST_SENTPRANSWER_NO_CRYPTO :
-                                      ST_RECEIVEDPRANSWER_NO_CRYPTO;
-      return true;
-    }
-  }
-  CryptoParams selected_params;
-  if (!NegotiateParams(answer_params, &selected_params))
-    return false;
-
-  const CryptoParams& new_send_params =
-      (source == CS_REMOTE) ? selected_params : answer_params[0];
-  const CryptoParams& new_recv_params =
-      (source == CS_REMOTE) ? answer_params[0] : selected_params;
-  if (!ApplySendParams(new_send_params) || !ApplyRecvParams(new_recv_params)) {
-    return false;
-  }
-  applied_send_params_ = new_send_params;
-  applied_recv_params_ = new_recv_params;
-
-  if (final) {
-    offer_params_.clear();
-    state_ = ST_ACTIVE;
-  } else {
-    state_ =
-        (source == CS_LOCAL) ? ST_SENTPRANSWER : ST_RECEIVEDPRANSWER;
-  }
-  return true;
-}
-
-bool SrtpFilter::NegotiateParams(const std::vector<CryptoParams>& answer_params,
-                                 CryptoParams* selected_params) {
-  // We're processing an accept. We should have exactly one set of params,
-  // unless the offer didn't mention crypto, in which case we shouldn't be here.
-  bool ret = (answer_params.size() == 1U && !offer_params_.empty());
-  if (ret) {
-    // We should find a match between the answer params and the offered params.
-    std::vector<CryptoParams>::const_iterator it;
-    for (it = offer_params_.begin(); it != offer_params_.end(); ++it) {
-      if (answer_params[0].Matches(*it)) {
-        break;
-      }
-    }
-
-    if (it != offer_params_.end()) {
-      *selected_params = *it;
-    } else {
-      ret = false;
-    }
-  }
-
-  if (!ret) {
-    LOG(LS_WARNING) << "Invalid parameters in SRTP answer";
-  }
-  return ret;
-}
-
-bool SrtpFilter::ResetParams() {
-  offer_params_.clear();
-  applied_send_params_ = CryptoParams();
-  applied_recv_params_ = CryptoParams();
-  send_cipher_suite_ = rtc::Optional<int>();
-  recv_cipher_suite_ = rtc::Optional<int>();
-  send_key_.Clear();
-  recv_key_.Clear();
-  state_ = ST_INIT;
-  return true;
-}
-
-bool SrtpFilter::ApplySendParams(const CryptoParams& send_params) {
-  if (applied_send_params_.cipher_suite == send_params.cipher_suite &&
-      applied_send_params_.key_params == send_params.key_params) {
-    LOG(LS_INFO) << "Applying the same SRTP send parameters again. No-op.";
-
-    // We do not want to reset the ROC if the keys are the same. So just return.
-    return true;
-  }
-
-  send_cipher_suite_ = rtc::Optional<int>(
-      rtc::SrtpCryptoSuiteFromName(send_params.cipher_suite));
-  if (send_cipher_suite_ == rtc::SRTP_INVALID_CRYPTO_SUITE) {
-    LOG(LS_WARNING) << "Unknown crypto suite(s) received:"
-                    << " send cipher_suite " << send_params.cipher_suite;
-    return false;
-  }
-
-  int send_key_len, send_salt_len;
-  if (!rtc::GetSrtpKeyAndSaltLengths(*send_cipher_suite_, &send_key_len,
-                                     &send_salt_len)) {
-    LOG(LS_WARNING) << "Could not get lengths for crypto suite(s):"
-                    << " send cipher_suite " << send_params.cipher_suite;
-    return false;
-  }
-
-  send_key_ = rtc::Buffer(send_key_len + send_salt_len);
-  return ParseKeyParams(send_params.key_params, send_key_.data(),
-                        send_key_.size());
-}
-
-bool SrtpFilter::ApplyRecvParams(const CryptoParams& recv_params) {
-  if (applied_recv_params_.cipher_suite == recv_params.cipher_suite &&
-      applied_recv_params_.key_params == recv_params.key_params) {
-    LOG(LS_INFO) << "Applying the same SRTP recv parameters again. No-op.";
-
-    // We do not want to reset the ROC if the keys are the same. So just return.
-    return true;
-  }
-
-  recv_cipher_suite_ = rtc::Optional<int>(
-      rtc::SrtpCryptoSuiteFromName(recv_params.cipher_suite));
-  if (recv_cipher_suite_ == rtc::SRTP_INVALID_CRYPTO_SUITE) {
-    LOG(LS_WARNING) << "Unknown crypto suite(s) received:"
-                    << " recv cipher_suite " << recv_params.cipher_suite;
-    return false;
-  }
-
-  int recv_key_len, recv_salt_len;
-  if (!rtc::GetSrtpKeyAndSaltLengths(*recv_cipher_suite_, &recv_key_len,
-                                     &recv_salt_len)) {
-    LOG(LS_WARNING) << "Could not get lengths for crypto suite(s):"
-                    << " recv cipher_suite " << recv_params.cipher_suite;
-    return false;
-  }
-
-  recv_key_ = rtc::Buffer(recv_key_len + recv_salt_len);
-  return ParseKeyParams(recv_params.key_params, recv_key_.data(),
-                        recv_key_.size());
-}
-
-bool SrtpFilter::ParseKeyParams(const std::string& key_params,
-                                uint8_t* key,
-                                size_t len) {
-  // example key_params: "inline:YUJDZGVmZ2hpSktMbW9QUXJzVHVWd3l6MTIzNDU2"
-
-  // Fail if key-method is wrong.
-  if (key_params.find("inline:") != 0) {
-    return false;
-  }
-
-  // Fail if base64 decode fails, or the key is the wrong size.
-  std::string key_b64(key_params.substr(7)), key_str;
-  if (!rtc::Base64::Decode(key_b64, rtc::Base64::DO_STRICT, &key_str,
-                           nullptr) ||
-      key_str.size() != len) {
-    return false;
-  }
-
-  memcpy(key, key_str.c_str(), len);
-  return true;
-}
-
-}  // namespace cricket
diff --git a/pc/srtpfilter.h b/pc/srtpfilter.h
deleted file mode 100644
index 2a90360..0000000
--- a/pc/srtpfilter.h
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- *  Copyright 2009 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_PC_SRTPFILTER_H_
-#define WEBRTC_PC_SRTPFILTER_H_
-
-#include <list>
-#include <map>
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "webrtc/api/optional.h"
-#include "webrtc/media/base/cryptoparams.h"
-#include "webrtc/p2p/base/sessiondescription.h"
-#include "webrtc/rtc_base/basictypes.h"
-#include "webrtc/rtc_base/buffer.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/sslstreamadapter.h"
-#include "webrtc/rtc_base/thread_checker.h"
-
-// Forward declaration to avoid pulling in libsrtp headers here
-struct srtp_event_data_t;
-struct srtp_ctx_t_;
-
-namespace cricket {
-
-void ShutdownSrtp();
-
-// A helper class used to negotiate SDES crypto params.
-// TODO(zhihuang): Find a better name for this class, like "SdesNegotiator".
-class SrtpFilter {
- public:
-  enum Mode {
-    PROTECT,
-    UNPROTECT
-  };
-  enum Error {
-    ERROR_NONE,
-    ERROR_FAIL,
-    ERROR_AUTH,
-    ERROR_REPLAY,
-  };
-
-  SrtpFilter();
-  ~SrtpFilter();
-
-  // Whether the filter is active (i.e. crypto has been properly negotiated).
-  bool IsActive() const;
-
-  // Indicates which crypto algorithms and keys were contained in the offer.
-  // offer_params should contain a list of available parameters to use, or none,
-  // if crypto is not desired. This must be called before SetAnswer.
-  bool SetOffer(const std::vector<CryptoParams>& offer_params,
-                ContentSource source);
-  // Same as SetAnwer. But multiple calls are allowed to SetProvisionalAnswer
-  // after a call to SetOffer.
-  bool SetProvisionalAnswer(const std::vector<CryptoParams>& answer_params,
-                            ContentSource source);
-  // Indicates which crypto algorithms and keys were contained in the answer.
-  // answer_params should contain the negotiated parameters, which may be none,
-  // if crypto was not desired or could not be negotiated (and not required).
-  // This must be called after SetOffer. If crypto negotiation completes
-  // successfully, this will advance the filter to the active state.
-  bool SetAnswer(const std::vector<CryptoParams>& answer_params,
-                 ContentSource source);
-
-  bool ResetParams();
-
-  rtc::Optional<int> send_cipher_suite() { return send_cipher_suite_; }
-  rtc::Optional<int> recv_cipher_suite() { return recv_cipher_suite_; }
-
-  const rtc::Buffer& send_key() { return send_key_; }
-  const rtc::Buffer& recv_key() { return recv_key_; }
-
- protected:
-  bool ExpectOffer(ContentSource source);
-
-  bool StoreParams(const std::vector<CryptoParams>& params,
-                   ContentSource source);
-
-  bool ExpectAnswer(ContentSource source);
-
-  bool DoSetAnswer(const std::vector<CryptoParams>& answer_params,
-                   ContentSource source,
-                   bool final);
-
-  bool NegotiateParams(const std::vector<CryptoParams>& answer_params,
-                       CryptoParams* selected_params);
-
- private:
-  bool ApplySendParams(const CryptoParams& send_params);
-
-  bool ApplyRecvParams(const CryptoParams& recv_params);
-
-  static bool ParseKeyParams(const std::string& params,
-                             uint8_t* key,
-                             size_t len);
-
-  enum State {
-    ST_INIT,           // SRTP filter unused.
-    ST_SENTOFFER,      // Offer with SRTP parameters sent.
-    ST_RECEIVEDOFFER,  // Offer with SRTP parameters received.
-    ST_SENTPRANSWER_NO_CRYPTO,  // Sent provisional answer without crypto.
-    // Received provisional answer without crypto.
-    ST_RECEIVEDPRANSWER_NO_CRYPTO,
-    ST_ACTIVE,         // Offer and answer set.
-    // SRTP filter is active but new parameters are offered.
-    // When the answer is set, the state transitions to ST_ACTIVE or ST_INIT.
-    ST_SENTUPDATEDOFFER,
-    // SRTP filter is active but new parameters are received.
-    // When the answer is set, the state transitions back to ST_ACTIVE.
-    ST_RECEIVEDUPDATEDOFFER,
-    // SRTP filter is active but the sent answer is only provisional.
-    // When the final answer is set, the state transitions to ST_ACTIVE or
-    // ST_INIT.
-    ST_SENTPRANSWER,
-    // SRTP filter is active but the received answer is only provisional.
-    // When the final answer is set, the state transitions to ST_ACTIVE or
-    // ST_INIT.
-    ST_RECEIVEDPRANSWER
-  };
-  State state_ = ST_INIT;
-  std::vector<CryptoParams> offer_params_;
-  CryptoParams applied_send_params_;
-  CryptoParams applied_recv_params_;
-  rtc::Optional<int> send_cipher_suite_;
-  rtc::Optional<int> recv_cipher_suite_;
-  rtc::Buffer send_key_;
-  rtc::Buffer recv_key_;
-};
-
-}  // namespace cricket
-
-#endif  // WEBRTC_PC_SRTPFILTER_H_
diff --git a/pc/srtpfilter_unittest.cc b/pc/srtpfilter_unittest.cc
deleted file mode 100644
index c4ad305..0000000
--- a/pc/srtpfilter_unittest.cc
+++ /dev/null
@@ -1,464 +0,0 @@
-/*
- *  Copyright 2004 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 <algorithm>
-
-#include "webrtc/pc/srtpfilter.h"
-
-#include "webrtc/media/base/cryptoparams.h"
-#include "webrtc/rtc_base/gunit.h"
-
-using cricket::CryptoParams;
-using cricket::CS_LOCAL;
-using cricket::CS_REMOTE;
-
-namespace rtc {
-
-static const std::string kTestKeyParams1 =
-    "inline:WVNfX19zZW1jdGwgKCkgewkyMjA7fQp9CnVubGVz";
-static const std::string kTestKeyParams2 =
-    "inline:PS1uQCVeeCFCanVmcjkpPywjNWhcYD0mXXtxaVBR";
-static const std::string kTestKeyParams3 =
-    "inline:1234X19zZW1jdGwgKCkgewkyMjA7fQp9CnVubGVz";
-static const std::string kTestKeyParams4 =
-    "inline:4567QCVeeCFCanVmcjkpPywjNWhcYD0mXXtxaVBR";
-static const std::string kTestKeyParamsGcm1 =
-    "inline:e166KFlKzJsGW0d5apX+rrI05vxbrvMJEzFI14aTDCa63IRTlLK4iH66uOI=";
-static const std::string kTestKeyParamsGcm2 =
-    "inline:6X0oCd55zfz4VgtOwsuqcFq61275PDYN5uwuu3p7ZUHbfUY2FMpdP4m2PEo=";
-static const std::string kTestKeyParamsGcm3 =
-    "inline:YKlABGZWMgX32xuMotrG0v0T7G83veegaVzubQ==";
-static const std::string kTestKeyParamsGcm4 =
-    "inline:gJ6tWoUym2v+/F6xjr7xaxiS3QbJJozl3ZD/0A==";
-static const cricket::CryptoParams kTestCryptoParams1(
-    1, "AES_CM_128_HMAC_SHA1_80", kTestKeyParams1, "");
-static const cricket::CryptoParams kTestCryptoParams2(
-    1, "AES_CM_128_HMAC_SHA1_80", kTestKeyParams2, "");
-static const cricket::CryptoParams kTestCryptoParamsGcm1(
-    1, "AEAD_AES_256_GCM", kTestKeyParamsGcm1, "");
-static const cricket::CryptoParams kTestCryptoParamsGcm2(
-    1, "AEAD_AES_256_GCM", kTestKeyParamsGcm2, "");
-static const cricket::CryptoParams kTestCryptoParamsGcm3(
-    1, "AEAD_AES_128_GCM", kTestKeyParamsGcm3, "");
-static const cricket::CryptoParams kTestCryptoParamsGcm4(
-    1, "AEAD_AES_128_GCM", kTestKeyParamsGcm4, "");
-
-class SrtpFilterTest : public testing::Test {
- protected:
-  SrtpFilterTest() {}
-  static std::vector<CryptoParams> MakeVector(const CryptoParams& params) {
-    std::vector<CryptoParams> vec;
-    vec.push_back(params);
-    return vec;
-  }
-
-  void TestSetParams(const std::vector<CryptoParams>& params1,
-                     const std::vector<CryptoParams>& params2) {
-    EXPECT_TRUE(f1_.SetOffer(params1, CS_LOCAL));
-    EXPECT_TRUE(f2_.SetOffer(params1, CS_REMOTE));
-    EXPECT_FALSE(f1_.IsActive());
-    EXPECT_FALSE(f2_.IsActive());
-    EXPECT_TRUE(f2_.SetAnswer(params2, CS_LOCAL));
-    EXPECT_TRUE(f1_.SetAnswer(params2, CS_REMOTE));
-    EXPECT_TRUE(f1_.IsActive());
-    EXPECT_TRUE(f2_.IsActive());
-  }
-
-  void VerifyCryptoParamsMatch(const std::string& cs1, const std::string& cs2) {
-    EXPECT_EQ(rtc::SrtpCryptoSuiteFromName(cs1), f1_.send_cipher_suite());
-    EXPECT_EQ(rtc::SrtpCryptoSuiteFromName(cs2), f2_.send_cipher_suite());
-    EXPECT_TRUE(f1_.send_key() == f2_.recv_key());
-    EXPECT_TRUE(f2_.send_key() == f1_.recv_key());
-  }
-
-  cricket::SrtpFilter f1_;
-  cricket::SrtpFilter f2_;
-};
-
-// Test that we can set up the session and keys properly.
-TEST_F(SrtpFilterTest, TestGoodSetupOneCipherSuite) {
-  EXPECT_TRUE(f1_.SetOffer(MakeVector(kTestCryptoParams1), CS_LOCAL));
-  EXPECT_FALSE(f1_.IsActive());
-  EXPECT_TRUE(f1_.SetAnswer(MakeVector(kTestCryptoParams2), CS_REMOTE));
-  EXPECT_TRUE(f1_.IsActive());
-}
-
-TEST_F(SrtpFilterTest, TestGoodSetupOneCipherSuiteGcm) {
-  EXPECT_TRUE(f1_.SetOffer(MakeVector(kTestCryptoParamsGcm1), CS_LOCAL));
-  EXPECT_FALSE(f1_.IsActive());
-  EXPECT_TRUE(f1_.SetAnswer(MakeVector(kTestCryptoParamsGcm2), CS_REMOTE));
-  EXPECT_TRUE(f1_.IsActive());
-}
-
-// Test that we can set up things with multiple params.
-TEST_F(SrtpFilterTest, TestGoodSetupMultipleCipherSuites) {
-  std::vector<CryptoParams> offer(MakeVector(kTestCryptoParams1));
-  std::vector<CryptoParams> answer(MakeVector(kTestCryptoParams2));
-  offer.push_back(kTestCryptoParams1);
-  offer[1].tag = 2;
-  offer[1].cipher_suite = CS_AES_CM_128_HMAC_SHA1_32;
-  answer[0].tag = 2;
-  answer[0].cipher_suite = CS_AES_CM_128_HMAC_SHA1_32;
-  EXPECT_TRUE(f1_.SetOffer(offer, CS_LOCAL));
-  EXPECT_FALSE(f1_.IsActive());
-  EXPECT_TRUE(f1_.SetAnswer(answer, CS_REMOTE));
-  EXPECT_TRUE(f1_.IsActive());
-}
-
-TEST_F(SrtpFilterTest, TestGoodSetupMultipleCipherSuitesGcm) {
-  std::vector<CryptoParams> offer(MakeVector(kTestCryptoParamsGcm1));
-  std::vector<CryptoParams> answer(MakeVector(kTestCryptoParamsGcm3));
-  offer.push_back(kTestCryptoParamsGcm4);
-  offer[1].tag = 2;
-  answer[0].tag = 2;
-  EXPECT_TRUE(f1_.SetOffer(offer, CS_LOCAL));
-  EXPECT_FALSE(f1_.IsActive());
-  EXPECT_TRUE(f1_.SetAnswer(answer, CS_REMOTE));
-  EXPECT_TRUE(f1_.IsActive());
-}
-
-// Test that we handle the cases where crypto is not desired.
-TEST_F(SrtpFilterTest, TestGoodSetupNoCipherSuites) {
-  std::vector<CryptoParams> offer, answer;
-  EXPECT_TRUE(f1_.SetOffer(offer, CS_LOCAL));
-  EXPECT_TRUE(f1_.SetAnswer(answer, CS_REMOTE));
-  EXPECT_FALSE(f1_.IsActive());
-}
-
-// Test that we handle the cases where crypto is not desired by the remote side.
-TEST_F(SrtpFilterTest, TestGoodSetupNoAnswerCipherSuites) {
-  std::vector<CryptoParams> answer;
-  EXPECT_TRUE(f1_.SetOffer(MakeVector(kTestCryptoParams1), CS_LOCAL));
-  EXPECT_TRUE(f1_.SetAnswer(answer, CS_REMOTE));
-  EXPECT_FALSE(f1_.IsActive());
-}
-
-// Test that we fail if we call the functions the wrong way.
-TEST_F(SrtpFilterTest, TestBadSetup) {
-  std::vector<CryptoParams> offer(MakeVector(kTestCryptoParams1));
-  std::vector<CryptoParams> answer(MakeVector(kTestCryptoParams2));
-  EXPECT_FALSE(f1_.SetAnswer(answer, CS_LOCAL));
-  EXPECT_FALSE(f1_.SetAnswer(answer, CS_REMOTE));
-  EXPECT_TRUE(f1_.SetOffer(offer, CS_LOCAL));
-  EXPECT_FALSE(f1_.SetAnswer(answer, CS_LOCAL));
-  EXPECT_FALSE(f1_.IsActive());
-}
-
-// Test that we can set offer multiple times from the same source.
-TEST_F(SrtpFilterTest, TestGoodSetupMultipleOffers) {
-  EXPECT_TRUE(f1_.SetOffer(MakeVector(kTestCryptoParams1), CS_LOCAL));
-  EXPECT_TRUE(f1_.SetOffer(MakeVector(kTestCryptoParams2), CS_LOCAL));
-  EXPECT_FALSE(f1_.IsActive());
-  EXPECT_TRUE(f1_.SetAnswer(MakeVector(kTestCryptoParams2), CS_REMOTE));
-  EXPECT_TRUE(f1_.IsActive());
-  EXPECT_TRUE(f1_.SetOffer(MakeVector(kTestCryptoParams1), CS_LOCAL));
-  EXPECT_TRUE(f1_.SetOffer(MakeVector(kTestCryptoParams2), CS_LOCAL));
-  EXPECT_TRUE(f1_.SetAnswer(MakeVector(kTestCryptoParams2), CS_REMOTE));
-
-  EXPECT_TRUE(f2_.SetOffer(MakeVector(kTestCryptoParams1), CS_REMOTE));
-  EXPECT_TRUE(f2_.SetOffer(MakeVector(kTestCryptoParams2), CS_REMOTE));
-  EXPECT_FALSE(f2_.IsActive());
-  EXPECT_TRUE(f2_.SetAnswer(MakeVector(kTestCryptoParams2), CS_LOCAL));
-  EXPECT_TRUE(f2_.IsActive());
-  EXPECT_TRUE(f2_.SetOffer(MakeVector(kTestCryptoParams1), CS_REMOTE));
-  EXPECT_TRUE(f2_.SetOffer(MakeVector(kTestCryptoParams2), CS_REMOTE));
-  EXPECT_TRUE(f2_.SetAnswer(MakeVector(kTestCryptoParams2), CS_LOCAL));
-}
-// Test that we can't set offer multiple times from different sources.
-TEST_F(SrtpFilterTest, TestBadSetupMultipleOffers) {
-  EXPECT_TRUE(f1_.SetOffer(MakeVector(kTestCryptoParams1), CS_LOCAL));
-  EXPECT_FALSE(f1_.SetOffer(MakeVector(kTestCryptoParams2), CS_REMOTE));
-  EXPECT_FALSE(f1_.IsActive());
-  EXPECT_TRUE(f1_.SetAnswer(MakeVector(kTestCryptoParams1), CS_REMOTE));
-  EXPECT_TRUE(f1_.IsActive());
-  EXPECT_TRUE(f1_.SetOffer(MakeVector(kTestCryptoParams2), CS_LOCAL));
-  EXPECT_FALSE(f1_.SetOffer(MakeVector(kTestCryptoParams1), CS_REMOTE));
-  EXPECT_TRUE(f1_.SetAnswer(MakeVector(kTestCryptoParams2), CS_REMOTE));
-
-  EXPECT_TRUE(f2_.SetOffer(MakeVector(kTestCryptoParams2), CS_REMOTE));
-  EXPECT_FALSE(f2_.SetOffer(MakeVector(kTestCryptoParams1), CS_LOCAL));
-  EXPECT_FALSE(f2_.IsActive());
-  EXPECT_TRUE(f2_.SetAnswer(MakeVector(kTestCryptoParams2), CS_LOCAL));
-  EXPECT_TRUE(f2_.IsActive());
-  EXPECT_TRUE(f2_.SetOffer(MakeVector(kTestCryptoParams2), CS_REMOTE));
-  EXPECT_FALSE(f2_.SetOffer(MakeVector(kTestCryptoParams1), CS_LOCAL));
-  EXPECT_TRUE(f2_.SetAnswer(MakeVector(kTestCryptoParams2), CS_LOCAL));
-}
-
-// Test that we fail if we have params in the answer when none were offered.
-TEST_F(SrtpFilterTest, TestNoAnswerCipherSuites) {
-  std::vector<CryptoParams> offer;
-  EXPECT_TRUE(f1_.SetOffer(offer, CS_LOCAL));
-  EXPECT_FALSE(f1_.SetAnswer(MakeVector(kTestCryptoParams2), CS_REMOTE));
-  EXPECT_FALSE(f1_.IsActive());
-}
-
-// Test that we fail if we have too many params in our answer.
-TEST_F(SrtpFilterTest, TestMultipleAnswerCipherSuites) {
-  std::vector<CryptoParams> answer(MakeVector(kTestCryptoParams2));
-  answer.push_back(kTestCryptoParams2);
-  answer[1].tag = 2;
-  answer[1].cipher_suite = CS_AES_CM_128_HMAC_SHA1_32;
-  EXPECT_TRUE(f1_.SetOffer(MakeVector(kTestCryptoParams1), CS_LOCAL));
-  EXPECT_FALSE(f1_.SetAnswer(answer, CS_REMOTE));
-  EXPECT_FALSE(f1_.IsActive());
-}
-
-// Test that we fail if we don't support the cipher-suite.
-TEST_F(SrtpFilterTest, TestInvalidCipherSuite) {
-  std::vector<CryptoParams> offer(MakeVector(kTestCryptoParams1));
-  std::vector<CryptoParams> answer(MakeVector(kTestCryptoParams2));
-  offer[0].cipher_suite = answer[0].cipher_suite = "FOO";
-  EXPECT_TRUE(f1_.SetOffer(offer, CS_LOCAL));
-  EXPECT_FALSE(f1_.SetAnswer(answer, CS_REMOTE));
-  EXPECT_FALSE(f1_.IsActive());
-}
-
-// Test that we fail if we can't agree on a tag.
-TEST_F(SrtpFilterTest, TestNoMatchingTag) {
-  std::vector<CryptoParams> offer(MakeVector(kTestCryptoParams1));
-  std::vector<CryptoParams> answer(MakeVector(kTestCryptoParams2));
-  answer[0].tag = 99;
-  EXPECT_TRUE(f1_.SetOffer(offer, CS_LOCAL));
-  EXPECT_FALSE(f1_.SetAnswer(answer, CS_REMOTE));
-  EXPECT_FALSE(f1_.IsActive());
-}
-
-// Test that we fail if we can't agree on a cipher-suite.
-TEST_F(SrtpFilterTest, TestNoMatchingCipherSuite) {
-  std::vector<CryptoParams> offer(MakeVector(kTestCryptoParams1));
-  std::vector<CryptoParams> answer(MakeVector(kTestCryptoParams2));
-  answer[0].tag = 2;
-  answer[0].cipher_suite = "FOO";
-  EXPECT_TRUE(f1_.SetOffer(offer, CS_LOCAL));
-  EXPECT_FALSE(f1_.SetAnswer(answer, CS_REMOTE));
-  EXPECT_FALSE(f1_.IsActive());
-}
-
-// Test that we fail keys with bad base64 content.
-TEST_F(SrtpFilterTest, TestInvalidKeyData) {
-  std::vector<CryptoParams> offer(MakeVector(kTestCryptoParams1));
-  std::vector<CryptoParams> answer(MakeVector(kTestCryptoParams2));
-  answer[0].key_params = "inline:!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!";
-  EXPECT_TRUE(f1_.SetOffer(offer, CS_LOCAL));
-  EXPECT_FALSE(f1_.SetAnswer(answer, CS_REMOTE));
-  EXPECT_FALSE(f1_.IsActive());
-}
-
-// Test that we fail keys with the wrong key-method.
-TEST_F(SrtpFilterTest, TestWrongKeyMethod) {
-  std::vector<CryptoParams> offer(MakeVector(kTestCryptoParams1));
-  std::vector<CryptoParams> answer(MakeVector(kTestCryptoParams2));
-  answer[0].key_params = "outline:PS1uQCVeeCFCanVmcjkpPywjNWhcYD0mXXtxaVBR";
-  EXPECT_TRUE(f1_.SetOffer(offer, CS_LOCAL));
-  EXPECT_FALSE(f1_.SetAnswer(answer, CS_REMOTE));
-  EXPECT_FALSE(f1_.IsActive());
-}
-
-// Test that we fail keys of the wrong length.
-TEST_F(SrtpFilterTest, TestKeyTooShort) {
-  std::vector<CryptoParams> offer(MakeVector(kTestCryptoParams1));
-  std::vector<CryptoParams> answer(MakeVector(kTestCryptoParams2));
-  answer[0].key_params = "inline:PS1uQCVeeCFCanVmcjkpPywjNWhcYD0mXXtx";
-  EXPECT_TRUE(f1_.SetOffer(offer, CS_LOCAL));
-  EXPECT_FALSE(f1_.SetAnswer(answer, CS_REMOTE));
-  EXPECT_FALSE(f1_.IsActive());
-}
-
-// Test that we fail keys of the wrong length.
-TEST_F(SrtpFilterTest, TestKeyTooLong) {
-  std::vector<CryptoParams> offer(MakeVector(kTestCryptoParams1));
-  std::vector<CryptoParams> answer(MakeVector(kTestCryptoParams2));
-  answer[0].key_params = "inline:PS1uQCVeeCFCanVmcjkpPywjNWhcYD0mXXtxaVBRABCD";
-  EXPECT_TRUE(f1_.SetOffer(offer, CS_LOCAL));
-  EXPECT_FALSE(f1_.SetAnswer(answer, CS_REMOTE));
-  EXPECT_FALSE(f1_.IsActive());
-}
-
-// Test that we fail keys with lifetime or MKI set (since we don't support)
-TEST_F(SrtpFilterTest, TestUnsupportedOptions) {
-  std::vector<CryptoParams> offer(MakeVector(kTestCryptoParams1));
-  std::vector<CryptoParams> answer(MakeVector(kTestCryptoParams2));
-  answer[0].key_params =
-      "inline:PS1uQCVeeCFCanVmcjkpPywjNWhcYD0mXXtxaVBR|2^20|1:4";
-  EXPECT_TRUE(f1_.SetOffer(offer, CS_LOCAL));
-  EXPECT_FALSE(f1_.SetAnswer(answer, CS_REMOTE));
-  EXPECT_FALSE(f1_.IsActive());
-}
-
-// Test that we can encrypt/decrypt after negotiating AES_CM_128_HMAC_SHA1_80.
-TEST_F(SrtpFilterTest, TestProtect_AES_CM_128_HMAC_SHA1_80) {
-  std::vector<CryptoParams> offer(MakeVector(kTestCryptoParams1));
-  std::vector<CryptoParams> answer(MakeVector(kTestCryptoParams2));
-  offer.push_back(kTestCryptoParams1);
-  offer[1].tag = 2;
-  offer[1].cipher_suite = CS_AES_CM_128_HMAC_SHA1_32;
-  TestSetParams(offer, answer);
-  VerifyCryptoParamsMatch(CS_AES_CM_128_HMAC_SHA1_80,
-                          CS_AES_CM_128_HMAC_SHA1_80);
-}
-
-// Test that we can encrypt/decrypt after negotiating AES_CM_128_HMAC_SHA1_32.
-TEST_F(SrtpFilterTest, TestProtect_AES_CM_128_HMAC_SHA1_32) {
-  std::vector<CryptoParams> offer(MakeVector(kTestCryptoParams1));
-  std::vector<CryptoParams> answer(MakeVector(kTestCryptoParams2));
-  offer.push_back(kTestCryptoParams1);
-  offer[1].tag = 2;
-  offer[1].cipher_suite = CS_AES_CM_128_HMAC_SHA1_32;
-  answer[0].tag = 2;
-  answer[0].cipher_suite = CS_AES_CM_128_HMAC_SHA1_32;
-  TestSetParams(offer, answer);
-  VerifyCryptoParamsMatch(CS_AES_CM_128_HMAC_SHA1_32,
-                          CS_AES_CM_128_HMAC_SHA1_32);
-}
-
-// Test that we can change encryption parameters.
-TEST_F(SrtpFilterTest, TestChangeParameters) {
-  std::vector<CryptoParams> offer(MakeVector(kTestCryptoParams1));
-  std::vector<CryptoParams> answer(MakeVector(kTestCryptoParams2));
-
-  TestSetParams(offer, answer);
-  VerifyCryptoParamsMatch(CS_AES_CM_128_HMAC_SHA1_80,
-                          CS_AES_CM_128_HMAC_SHA1_80);
-
-  // Change the key parameters and cipher_suite.
-  offer[0].key_params = kTestKeyParams3;
-  offer[0].cipher_suite = CS_AES_CM_128_HMAC_SHA1_32;
-  answer[0].key_params = kTestKeyParams4;
-  answer[0].cipher_suite = CS_AES_CM_128_HMAC_SHA1_32;
-
-  EXPECT_TRUE(f1_.SetOffer(offer, CS_LOCAL));
-  EXPECT_TRUE(f2_.SetOffer(offer, CS_REMOTE));
-  EXPECT_TRUE(f1_.IsActive());
-  EXPECT_TRUE(f1_.IsActive());
-
-  // Test that the old keys are valid until the negotiation is complete.
-  VerifyCryptoParamsMatch(CS_AES_CM_128_HMAC_SHA1_80,
-                          CS_AES_CM_128_HMAC_SHA1_80);
-
-  // Complete the negotiation and test that we can still understand each other.
-  EXPECT_TRUE(f2_.SetAnswer(answer, CS_LOCAL));
-  EXPECT_TRUE(f1_.SetAnswer(answer, CS_REMOTE));
-
-  VerifyCryptoParamsMatch(CS_AES_CM_128_HMAC_SHA1_32,
-                          CS_AES_CM_128_HMAC_SHA1_32);
-}
-
-// Test that we can send and receive provisional answers with crypto enabled.
-// Also test that we can change the crypto.
-TEST_F(SrtpFilterTest, TestProvisionalAnswer) {
-  std::vector<CryptoParams> offer(MakeVector(kTestCryptoParams1));
-  offer.push_back(kTestCryptoParams1);
-  offer[1].tag = 2;
-  offer[1].cipher_suite = CS_AES_CM_128_HMAC_SHA1_32;
-  std::vector<CryptoParams> answer(MakeVector(kTestCryptoParams2));
-
-  EXPECT_TRUE(f1_.SetOffer(offer, CS_LOCAL));
-  EXPECT_TRUE(f2_.SetOffer(offer, CS_REMOTE));
-  EXPECT_FALSE(f1_.IsActive());
-  EXPECT_FALSE(f2_.IsActive());
-  EXPECT_TRUE(f2_.SetProvisionalAnswer(answer, CS_LOCAL));
-  EXPECT_TRUE(f1_.SetProvisionalAnswer(answer, CS_REMOTE));
-  EXPECT_TRUE(f1_.IsActive());
-  EXPECT_TRUE(f2_.IsActive());
-  VerifyCryptoParamsMatch(CS_AES_CM_128_HMAC_SHA1_80,
-                          CS_AES_CM_128_HMAC_SHA1_80);
-
-  answer[0].key_params = kTestKeyParams4;
-  answer[0].tag = 2;
-  answer[0].cipher_suite = CS_AES_CM_128_HMAC_SHA1_32;
-  EXPECT_TRUE(f2_.SetAnswer(answer, CS_LOCAL));
-  EXPECT_TRUE(f1_.SetAnswer(answer, CS_REMOTE));
-  EXPECT_TRUE(f1_.IsActive());
-  EXPECT_TRUE(f2_.IsActive());
-  VerifyCryptoParamsMatch(CS_AES_CM_128_HMAC_SHA1_32,
-                          CS_AES_CM_128_HMAC_SHA1_32);
-}
-
-// Test that a provisional answer doesn't need to contain a crypto.
-TEST_F(SrtpFilterTest, TestProvisionalAnswerWithoutCrypto) {
-  std::vector<CryptoParams> offer(MakeVector(kTestCryptoParams1));
-  std::vector<CryptoParams> answer;
-
-  EXPECT_TRUE(f1_.SetOffer(offer, CS_LOCAL));
-  EXPECT_TRUE(f2_.SetOffer(offer, CS_REMOTE));
-  EXPECT_FALSE(f1_.IsActive());
-  EXPECT_FALSE(f2_.IsActive());
-  EXPECT_TRUE(f2_.SetProvisionalAnswer(answer, CS_LOCAL));
-  EXPECT_TRUE(f1_.SetProvisionalAnswer(answer, CS_REMOTE));
-  EXPECT_FALSE(f1_.IsActive());
-  EXPECT_FALSE(f2_.IsActive());
-
-  answer.push_back(kTestCryptoParams2);
-  EXPECT_TRUE(f2_.SetAnswer(answer, CS_LOCAL));
-  EXPECT_TRUE(f1_.SetAnswer(answer, CS_REMOTE));
-  EXPECT_TRUE(f1_.IsActive());
-  EXPECT_TRUE(f2_.IsActive());
-  VerifyCryptoParamsMatch(CS_AES_CM_128_HMAC_SHA1_80,
-                          CS_AES_CM_128_HMAC_SHA1_80);
-}
-
-// Test that if we get a new local offer after a provisional answer
-// with no crypto, that we are in an inactive state.
-TEST_F(SrtpFilterTest, TestLocalOfferAfterProvisionalAnswerWithoutCrypto) {
-  std::vector<CryptoParams> offer(MakeVector(kTestCryptoParams1));
-  std::vector<CryptoParams> answer;
-
-  EXPECT_TRUE(f1_.SetOffer(offer, CS_LOCAL));
-  EXPECT_TRUE(f2_.SetOffer(offer, CS_REMOTE));
-  EXPECT_TRUE(f1_.SetProvisionalAnswer(answer, CS_REMOTE));
-  EXPECT_TRUE(f2_.SetProvisionalAnswer(answer, CS_LOCAL));
-  EXPECT_FALSE(f1_.IsActive());
-  EXPECT_FALSE(f2_.IsActive());
-  // The calls to set an offer after a provisional answer fail, so the
-  // state doesn't change.
-  EXPECT_FALSE(f1_.SetOffer(offer, CS_LOCAL));
-  EXPECT_FALSE(f2_.SetOffer(offer, CS_REMOTE));
-  EXPECT_FALSE(f1_.IsActive());
-  EXPECT_FALSE(f2_.IsActive());
-
-  answer.push_back(kTestCryptoParams2);
-  EXPECT_TRUE(f2_.SetAnswer(answer, CS_LOCAL));
-  EXPECT_TRUE(f1_.SetAnswer(answer, CS_REMOTE));
-  EXPECT_TRUE(f1_.IsActive());
-  EXPECT_TRUE(f2_.IsActive());
-  VerifyCryptoParamsMatch(CS_AES_CM_128_HMAC_SHA1_80,
-                          CS_AES_CM_128_HMAC_SHA1_80);
-}
-
-// Test that we can disable encryption.
-TEST_F(SrtpFilterTest, TestDisableEncryption) {
-  std::vector<CryptoParams> offer(MakeVector(kTestCryptoParams1));
-  std::vector<CryptoParams> answer(MakeVector(kTestCryptoParams2));
-
-  TestSetParams(offer, answer);
-  VerifyCryptoParamsMatch(CS_AES_CM_128_HMAC_SHA1_80,
-                          CS_AES_CM_128_HMAC_SHA1_80);
-
-  offer.clear();
-  answer.clear();
-  EXPECT_TRUE(f1_.SetOffer(offer, CS_LOCAL));
-  EXPECT_TRUE(f2_.SetOffer(offer, CS_REMOTE));
-  EXPECT_TRUE(f1_.IsActive());
-  EXPECT_TRUE(f2_.IsActive());
-
-  // Test that the old keys are valid until the negotiation is complete.
-  VerifyCryptoParamsMatch(CS_AES_CM_128_HMAC_SHA1_80,
-                          CS_AES_CM_128_HMAC_SHA1_80);
-
-  // Complete the negotiation.
-  EXPECT_TRUE(f2_.SetAnswer(answer, CS_LOCAL));
-  EXPECT_TRUE(f1_.SetAnswer(answer, CS_REMOTE));
-
-  EXPECT_FALSE(f1_.IsActive());
-  EXPECT_FALSE(f2_.IsActive());
-}
-
-}  // namespace rtc
diff --git a/pc/srtpsession.cc b/pc/srtpsession.cc
deleted file mode 100644
index 67ae9a6..0000000
--- a/pc/srtpsession.cc
+++ /dev/null
@@ -1,398 +0,0 @@
-/*
- *  Copyright 2017 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/pc/srtpsession.h"
-
-#include "third_party/libsrtp/include/srtp.h"
-#include "third_party/libsrtp/include/srtp_priv.h"
-#include "webrtc/media/base/rtputils.h"
-#include "webrtc/pc/externalhmac.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/sslstreamadapter.h"
-
-namespace cricket {
-
-bool SrtpSession::inited_ = false;
-
-// This lock protects SrtpSession::inited_.
-rtc::GlobalLockPod SrtpSession::lock_;
-
-SrtpSession::SrtpSession() {}
-
-SrtpSession::~SrtpSession() {
-  if (session_) {
-    srtp_set_user_data(session_, nullptr);
-    srtp_dealloc(session_);
-  }
-}
-
-bool SrtpSession::SetSend(int cs, const uint8_t* key, size_t len) {
-  return SetKey(ssrc_any_outbound, cs, key, len);
-}
-
-bool SrtpSession::UpdateSend(int cs, const uint8_t* key, size_t len) {
-  return UpdateKey(ssrc_any_outbound, cs, key, len);
-}
-
-bool SrtpSession::SetRecv(int cs, const uint8_t* key, size_t len) {
-  return SetKey(ssrc_any_inbound, cs, key, len);
-}
-
-bool SrtpSession::UpdateRecv(int cs, const uint8_t* key, size_t len) {
-  return UpdateKey(ssrc_any_inbound, cs, key, len);
-}
-
-bool SrtpSession::ProtectRtp(void* p, int in_len, int max_len, int* out_len) {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  if (!session_) {
-    LOG(LS_WARNING) << "Failed to protect SRTP packet: no SRTP Session";
-    return false;
-  }
-
-  int need_len = in_len + rtp_auth_tag_len_;  // NOLINT
-  if (max_len < need_len) {
-    LOG(LS_WARNING) << "Failed to protect SRTP packet: The buffer length "
-                    << max_len << " is less than the needed " << need_len;
-    return false;
-  }
-
-  *out_len = in_len;
-  int err = srtp_protect(session_, p, out_len);
-  int seq_num;
-  GetRtpSeqNum(p, in_len, &seq_num);
-  if (err != srtp_err_status_ok) {
-    LOG(LS_WARNING) << "Failed to protect SRTP packet, seqnum=" << seq_num
-                    << ", err=" << err
-                    << ", last seqnum=" << last_send_seq_num_;
-    return false;
-  }
-  last_send_seq_num_ = seq_num;
-  return true;
-}
-
-bool SrtpSession::ProtectRtp(void* p,
-                             int in_len,
-                             int max_len,
-                             int* out_len,
-                             int64_t* index) {
-  if (!ProtectRtp(p, in_len, max_len, out_len)) {
-    return false;
-  }
-  return (index) ? GetSendStreamPacketIndex(p, in_len, index) : true;
-}
-
-bool SrtpSession::ProtectRtcp(void* p, int in_len, int max_len, int* out_len) {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  if (!session_) {
-    LOG(LS_WARNING) << "Failed to protect SRTCP packet: no SRTP Session";
-    return false;
-  }
-
-  int need_len = in_len + sizeof(uint32_t) + rtcp_auth_tag_len_;  // NOLINT
-  if (max_len < need_len) {
-    LOG(LS_WARNING) << "Failed to protect SRTCP packet: The buffer length "
-                    << max_len << " is less than the needed " << need_len;
-    return false;
-  }
-
-  *out_len = in_len;
-  int err = srtp_protect_rtcp(session_, p, out_len);
-  if (err != srtp_err_status_ok) {
-    LOG(LS_WARNING) << "Failed to protect SRTCP packet, err=" << err;
-    return false;
-  }
-  return true;
-}
-
-bool SrtpSession::UnprotectRtp(void* p, int in_len, int* out_len) {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  if (!session_) {
-    LOG(LS_WARNING) << "Failed to unprotect SRTP packet: no SRTP Session";
-    return false;
-  }
-
-  *out_len = in_len;
-  int err = srtp_unprotect(session_, p, out_len);
-  if (err != srtp_err_status_ok) {
-    LOG(LS_WARNING) << "Failed to unprotect SRTP packet, err=" << err;
-    return false;
-  }
-  return true;
-}
-
-bool SrtpSession::UnprotectRtcp(void* p, int in_len, int* out_len) {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  if (!session_) {
-    LOG(LS_WARNING) << "Failed to unprotect SRTCP packet: no SRTP Session";
-    return false;
-  }
-
-  *out_len = in_len;
-  int err = srtp_unprotect_rtcp(session_, p, out_len);
-  if (err != srtp_err_status_ok) {
-    LOG(LS_WARNING) << "Failed to unprotect SRTCP packet, err=" << err;
-    return false;
-  }
-  return true;
-}
-
-bool SrtpSession::GetRtpAuthParams(uint8_t** key, int* key_len, int* tag_len) {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  RTC_DCHECK(IsExternalAuthActive());
-  if (!IsExternalAuthActive()) {
-    return false;
-  }
-
-  ExternalHmacContext* external_hmac = nullptr;
-  // stream_template will be the reference context for other streams.
-  // Let's use it for getting the keys.
-  srtp_stream_ctx_t* srtp_context = session_->stream_template;
-  if (srtp_context && srtp_context->session_keys &&
-      srtp_context->session_keys->rtp_auth) {
-    external_hmac = reinterpret_cast<ExternalHmacContext*>(
-        srtp_context->session_keys->rtp_auth->state);
-  }
-
-  if (!external_hmac) {
-    LOG(LS_ERROR) << "Failed to get auth keys from libsrtp!.";
-    return false;
-  }
-
-  *key = external_hmac->key;
-  *key_len = external_hmac->key_length;
-  *tag_len = rtp_auth_tag_len_;
-  return true;
-}
-
-int SrtpSession::GetSrtpOverhead() const {
-  return rtp_auth_tag_len_;
-}
-
-void SrtpSession::EnableExternalAuth() {
-  RTC_DCHECK(!session_);
-  external_auth_enabled_ = true;
-}
-
-bool SrtpSession::IsExternalAuthEnabled() const {
-  return external_auth_enabled_;
-}
-
-bool SrtpSession::IsExternalAuthActive() const {
-  return external_auth_active_;
-}
-
-bool SrtpSession::GetSendStreamPacketIndex(void* p,
-                                           int in_len,
-                                           int64_t* index) {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  srtp_hdr_t* hdr = reinterpret_cast<srtp_hdr_t*>(p);
-  srtp_stream_ctx_t* stream = srtp_get_stream(session_, hdr->ssrc);
-  if (!stream) {
-    return false;
-  }
-
-  // Shift packet index, put into network byte order
-  *index = static_cast<int64_t>(rtc::NetworkToHost64(
-      srtp_rdbx_get_packet_index(&stream->rtp_rdbx) << 16));
-  return true;
-}
-
-bool SrtpSession::DoSetKey(int type, int cs, const uint8_t* key, size_t len) {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-
-  srtp_policy_t policy;
-  memset(&policy, 0, sizeof(policy));
-  if (cs == rtc::SRTP_AES128_CM_SHA1_80) {
-    srtp_crypto_policy_set_aes_cm_128_hmac_sha1_80(&policy.rtp);
-    srtp_crypto_policy_set_aes_cm_128_hmac_sha1_80(&policy.rtcp);
-  } else if (cs == rtc::SRTP_AES128_CM_SHA1_32) {
-    // RTP HMAC is shortened to 32 bits, but RTCP remains 80 bits.
-    srtp_crypto_policy_set_aes_cm_128_hmac_sha1_32(&policy.rtp);
-    srtp_crypto_policy_set_aes_cm_128_hmac_sha1_80(&policy.rtcp);
-  } else if (cs == rtc::SRTP_AEAD_AES_128_GCM) {
-    srtp_crypto_policy_set_aes_gcm_128_16_auth(&policy.rtp);
-    srtp_crypto_policy_set_aes_gcm_128_16_auth(&policy.rtcp);
-  } else if (cs == rtc::SRTP_AEAD_AES_256_GCM) {
-    srtp_crypto_policy_set_aes_gcm_256_16_auth(&policy.rtp);
-    srtp_crypto_policy_set_aes_gcm_256_16_auth(&policy.rtcp);
-  } else {
-    LOG(LS_WARNING) << "Failed to " << (session_ ? "update" : "create")
-                    << " SRTP session: unsupported cipher_suite " << cs;
-    return false;
-  }
-
-  int expected_key_len;
-  int expected_salt_len;
-  if (!rtc::GetSrtpKeyAndSaltLengths(cs, &expected_key_len,
-                                     &expected_salt_len)) {
-    // This should never happen.
-    LOG(LS_WARNING)
-        << "Failed to " << (session_ ? "update" : "create")
-        << " SRTP session: unsupported cipher_suite without length information"
-        << cs;
-    return false;
-  }
-
-  if (!key ||
-      len != static_cast<size_t>(expected_key_len + expected_salt_len)) {
-    LOG(LS_WARNING) << "Failed to " << (session_ ? "update" : "create")
-                    << " SRTP session: invalid key";
-    return false;
-  }
-
-  policy.ssrc.type = static_cast<srtp_ssrc_type_t>(type);
-  policy.ssrc.value = 0;
-  policy.key = const_cast<uint8_t*>(key);
-  // TODO(astor) parse window size from WSH session-param
-  policy.window_size = 1024;
-  policy.allow_repeat_tx = 1;
-  // If external authentication option is enabled, supply custom auth module
-  // id EXTERNAL_HMAC_SHA1 in the policy structure.
-  // We want to set this option only for rtp packets.
-  // By default policy structure is initialized to HMAC_SHA1.
-  // Enable external HMAC authentication only for outgoing streams and only
-  // for cipher suites that support it (i.e. only non-GCM cipher suites).
-  if (type == ssrc_any_outbound && IsExternalAuthEnabled() &&
-      !rtc::IsGcmCryptoSuite(cs)) {
-    policy.rtp.auth_type = EXTERNAL_HMAC_SHA1;
-  }
-  if (!encrypted_header_extension_ids_.empty()) {
-    policy.enc_xtn_hdr = const_cast<int*>(&encrypted_header_extension_ids_[0]);
-    policy.enc_xtn_hdr_count =
-        static_cast<int>(encrypted_header_extension_ids_.size());
-  }
-  policy.next = nullptr;
-
-  if (!session_) {
-    int err = srtp_create(&session_, &policy);
-    if (err != srtp_err_status_ok) {
-      session_ = nullptr;
-      LOG(LS_ERROR) << "Failed to create SRTP session, err=" << err;
-      return false;
-    }
-    srtp_set_user_data(session_, this);
-  } else {
-    int err = srtp_update(session_, &policy);
-    if (err != srtp_err_status_ok) {
-      LOG(LS_ERROR) << "Failed to update SRTP session, err=" << err;
-      return false;
-    }
-  }
-
-  rtp_auth_tag_len_ = policy.rtp.auth_tag_len;
-  rtcp_auth_tag_len_ = policy.rtcp.auth_tag_len;
-  external_auth_active_ = (policy.rtp.auth_type == EXTERNAL_HMAC_SHA1);
-  return true;
-}
-
-bool SrtpSession::SetKey(int type, int cs, const uint8_t* key, size_t len) {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  if (session_) {
-    LOG(LS_ERROR) << "Failed to create SRTP session: "
-                  << "SRTP session already created";
-    return false;
-  }
-
-  if (!Init()) {
-    return false;
-  }
-
-  return DoSetKey(type, cs, key, len);
-}
-
-bool SrtpSession::UpdateKey(int type, int cs, const uint8_t* key, size_t len) {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  if (!session_) {
-    LOG(LS_ERROR) << "Failed to update non-existing SRTP session";
-    return false;
-  }
-
-  return DoSetKey(type, cs, key, len);
-}
-
-void SrtpSession::SetEncryptedHeaderExtensionIds(
-    const std::vector<int>& encrypted_header_extension_ids) {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  encrypted_header_extension_ids_ = encrypted_header_extension_ids;
-}
-
-bool SrtpSession::Init() {
-  rtc::GlobalLockScope ls(&lock_);
-
-  if (!inited_) {
-    int err;
-    err = srtp_init();
-    if (err != srtp_err_status_ok) {
-      LOG(LS_ERROR) << "Failed to init SRTP, err=" << err;
-      return false;
-    }
-
-    err = srtp_install_event_handler(&SrtpSession::HandleEventThunk);
-    if (err != srtp_err_status_ok) {
-      LOG(LS_ERROR) << "Failed to install SRTP event handler, err=" << err;
-      return false;
-    }
-
-    err = external_crypto_init();
-    if (err != srtp_err_status_ok) {
-      LOG(LS_ERROR) << "Failed to initialize fake auth, err=" << err;
-      return false;
-    }
-    inited_ = true;
-  }
-
-  return true;
-}
-
-void SrtpSession::Terminate() {
-  rtc::GlobalLockScope ls(&lock_);
-
-  if (inited_) {
-    int err = srtp_shutdown();
-    if (err) {
-      LOG(LS_ERROR) << "srtp_shutdown failed. err=" << err;
-      return;
-    }
-    inited_ = false;
-  }
-}
-
-void SrtpSession::HandleEvent(const srtp_event_data_t* ev) {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  switch (ev->event) {
-    case event_ssrc_collision:
-      LOG(LS_INFO) << "SRTP event: SSRC collision";
-      break;
-    case event_key_soft_limit:
-      LOG(LS_INFO) << "SRTP event: reached soft key usage limit";
-      break;
-    case event_key_hard_limit:
-      LOG(LS_INFO) << "SRTP event: reached hard key usage limit";
-      break;
-    case event_packet_index_limit:
-      LOG(LS_INFO) << "SRTP event: reached hard packet limit (2^48 packets)";
-      break;
-    default:
-      LOG(LS_INFO) << "SRTP event: unknown " << ev->event;
-      break;
-  }
-}
-
-void SrtpSession::HandleEventThunk(srtp_event_data_t* ev) {
-  // Callback will be executed from same thread that calls the "srtp_protect"
-  // and "srtp_unprotect" functions.
-  SrtpSession* session =
-      static_cast<SrtpSession*>(srtp_get_user_data(ev->session));
-  if (session) {
-    session->HandleEvent(ev);
-  }
-}
-
-}  // namespace cricket
diff --git a/pc/srtpsession.h b/pc/srtpsession.h
deleted file mode 100644
index c490c48..0000000
--- a/pc/srtpsession.h
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- *  Copyright 2017 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_PC_SRTPSESSION_H_
-#define WEBRTC_PC_SRTPSESSION_H_
-
-#include <vector>
-
-#include "webrtc/rtc_base/basictypes.h"
-#include "webrtc/rtc_base/thread_checker.h"
-
-// Forward declaration to avoid pulling in libsrtp headers here
-struct srtp_event_data_t;
-struct srtp_ctx_t_;
-
-namespace cricket {
-
-// Class that wraps a libSRTP session.
-class SrtpSession {
- public:
-  SrtpSession();
-  ~SrtpSession();
-
-  // Configures the session for sending data using the specified
-  // cipher-suite and key. Receiving must be done by a separate session.
-  bool SetSend(int cs, const uint8_t* key, size_t len);
-  bool UpdateSend(int cs, const uint8_t* key, size_t len);
-
-  // Configures the session for receiving data using the specified
-  // cipher-suite and key. Sending must be done by a separate session.
-  bool SetRecv(int cs, const uint8_t* key, size_t len);
-  bool UpdateRecv(int cs, const uint8_t* key, size_t len);
-
-  void SetEncryptedHeaderExtensionIds(
-      const std::vector<int>& encrypted_header_extension_ids);
-
-  // Encrypts/signs an individual RTP/RTCP packet, in-place.
-  // If an HMAC is used, this will increase the packet size.
-  bool ProtectRtp(void* data, int in_len, int max_len, int* out_len);
-  // Overloaded version, outputs packet index.
-  bool ProtectRtp(void* data,
-                  int in_len,
-                  int max_len,
-                  int* out_len,
-                  int64_t* index);
-  bool ProtectRtcp(void* data, int in_len, int max_len, int* out_len);
-  // Decrypts/verifies an invidiual RTP/RTCP packet.
-  // If an HMAC is used, this will decrease the packet size.
-  bool UnprotectRtp(void* data, int in_len, int* out_len);
-  bool UnprotectRtcp(void* data, int in_len, int* out_len);
-
-  // Helper method to get authentication params.
-  bool GetRtpAuthParams(uint8_t** key, int* key_len, int* tag_len);
-
-  int GetSrtpOverhead() const;
-
-  // If external auth is enabled, SRTP will write a dummy auth tag that then
-  // later must get replaced before the packet is sent out. Only supported for
-  // non-GCM cipher suites and can be checked through "IsExternalAuthActive"
-  // if it is actually used. This method is only valid before the RTP params
-  // have been set.
-  void EnableExternalAuth();
-  bool IsExternalAuthEnabled() const;
-
-  // A SRTP session supports external creation of the auth tag if a non-GCM
-  // cipher is used. This method is only valid after the RTP params have
-  // been set.
-  bool IsExternalAuthActive() const;
-
-  // Calls srtp_shutdown if it's initialized.
-  static void Terminate();
-
- private:
-  bool DoSetKey(int type, int cs, const uint8_t* key, size_t len);
-  bool SetKey(int type, int cs, const uint8_t* key, size_t len);
-  bool UpdateKey(int type, int cs, const uint8_t* key, size_t len);
-  bool SetEncryptedHeaderExtensionIds(
-      int type,
-      const std::vector<int>& encrypted_header_extension_ids);
-  // Returns send stream current packet index from srtp db.
-  bool GetSendStreamPacketIndex(void* data, int in_len, int64_t* index);
-
-  static bool Init();
-  void HandleEvent(const srtp_event_data_t* ev);
-  static void HandleEventThunk(srtp_event_data_t* ev);
-
-  rtc::ThreadChecker thread_checker_;
-  srtp_ctx_t_* session_ = nullptr;
-  int rtp_auth_tag_len_ = 0;
-  int rtcp_auth_tag_len_ = 0;
-  static bool inited_;
-  static rtc::GlobalLockPod lock_;
-  int last_send_seq_num_ = -1;
-  bool external_auth_active_ = false;
-  bool external_auth_enabled_ = false;
-  std::vector<int> encrypted_header_extension_ids_;
-  RTC_DISALLOW_COPY_AND_ASSIGN(SrtpSession);
-};
-
-}  // namespace cricket
-
-#endif  // WEBRTC_PC_SRTPSESSION_H_
diff --git a/pc/srtpsession_unittest.cc b/pc/srtpsession_unittest.cc
deleted file mode 100644
index d10989d..0000000
--- a/pc/srtpsession_unittest.cc
+++ /dev/null
@@ -1,204 +0,0 @@
-/*
- *  Copyright 2004 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/pc/srtpsession.h"
-
-#include <string>
-
-#include "webrtc/media/base/fakertp.h"
-#include "webrtc/pc/srtptestutil.h"
-#include "webrtc/rtc_base/gunit.h"
-#include "webrtc/rtc_base/sslstreamadapter.h"  // For rtc::SRTP_*
-
-namespace rtc {
-
-class SrtpSessionTest : public testing::Test {
- protected:
-  virtual void SetUp() {
-    rtp_len_ = sizeof(kPcmuFrame);
-    rtcp_len_ = sizeof(kRtcpReport);
-    memcpy(rtp_packet_, kPcmuFrame, rtp_len_);
-    memcpy(rtcp_packet_, kRtcpReport, rtcp_len_);
-  }
-  void TestProtectRtp(const std::string& cs) {
-    int out_len = 0;
-    EXPECT_TRUE(
-        s1_.ProtectRtp(rtp_packet_, rtp_len_, sizeof(rtp_packet_), &out_len));
-    EXPECT_EQ(out_len, rtp_len_ + rtp_auth_tag_len(cs));
-    EXPECT_NE(0, memcmp(rtp_packet_, kPcmuFrame, rtp_len_));
-    rtp_len_ = out_len;
-  }
-  void TestProtectRtcp(const std::string& cs) {
-    int out_len = 0;
-    EXPECT_TRUE(s1_.ProtectRtcp(rtcp_packet_, rtcp_len_, sizeof(rtcp_packet_),
-                                &out_len));
-    EXPECT_EQ(out_len, rtcp_len_ + 4 + rtcp_auth_tag_len(cs));  // NOLINT
-    EXPECT_NE(0, memcmp(rtcp_packet_, kRtcpReport, rtcp_len_));
-    rtcp_len_ = out_len;
-  }
-  void TestUnprotectRtp(const std::string& cs) {
-    int out_len = 0, expected_len = sizeof(kPcmuFrame);
-    EXPECT_TRUE(s2_.UnprotectRtp(rtp_packet_, rtp_len_, &out_len));
-    EXPECT_EQ(expected_len, out_len);
-    EXPECT_EQ(0, memcmp(rtp_packet_, kPcmuFrame, out_len));
-  }
-  void TestUnprotectRtcp(const std::string& cs) {
-    int out_len = 0, expected_len = sizeof(kRtcpReport);
-    EXPECT_TRUE(s2_.UnprotectRtcp(rtcp_packet_, rtcp_len_, &out_len));
-    EXPECT_EQ(expected_len, out_len);
-    EXPECT_EQ(0, memcmp(rtcp_packet_, kRtcpReport, out_len));
-  }
-  cricket::SrtpSession s1_;
-  cricket::SrtpSession s2_;
-  char rtp_packet_[sizeof(kPcmuFrame) + 10];
-  char rtcp_packet_[sizeof(kRtcpReport) + 4 + 10];
-  int rtp_len_;
-  int rtcp_len_;
-};
-
-// Test that we can set up the session and keys properly.
-TEST_F(SrtpSessionTest, TestGoodSetup) {
-  EXPECT_TRUE(s1_.SetSend(SRTP_AES128_CM_SHA1_80, kTestKey1, kTestKeyLen));
-  EXPECT_TRUE(s2_.SetRecv(SRTP_AES128_CM_SHA1_80, kTestKey1, kTestKeyLen));
-}
-
-// Test that we can't change the keys once set.
-TEST_F(SrtpSessionTest, TestBadSetup) {
-  EXPECT_TRUE(s1_.SetSend(SRTP_AES128_CM_SHA1_80, kTestKey1, kTestKeyLen));
-  EXPECT_TRUE(s2_.SetRecv(SRTP_AES128_CM_SHA1_80, kTestKey1, kTestKeyLen));
-  EXPECT_FALSE(s1_.SetSend(SRTP_AES128_CM_SHA1_80, kTestKey2, kTestKeyLen));
-  EXPECT_FALSE(s2_.SetRecv(SRTP_AES128_CM_SHA1_80, kTestKey2, kTestKeyLen));
-}
-
-// Test that we fail keys of the wrong length.
-TEST_F(SrtpSessionTest, TestKeysTooShort) {
-  EXPECT_FALSE(s1_.SetSend(SRTP_AES128_CM_SHA1_80, kTestKey1, 1));
-  EXPECT_FALSE(s2_.SetRecv(SRTP_AES128_CM_SHA1_80, kTestKey1, 1));
-}
-
-// Test that we can encrypt and decrypt RTP/RTCP using AES_CM_128_HMAC_SHA1_80.
-TEST_F(SrtpSessionTest, TestProtect_AES_CM_128_HMAC_SHA1_80) {
-  EXPECT_TRUE(s1_.SetSend(SRTP_AES128_CM_SHA1_80, kTestKey1, kTestKeyLen));
-  EXPECT_TRUE(s2_.SetRecv(SRTP_AES128_CM_SHA1_80, kTestKey1, kTestKeyLen));
-  TestProtectRtp(CS_AES_CM_128_HMAC_SHA1_80);
-  TestProtectRtcp(CS_AES_CM_128_HMAC_SHA1_80);
-  TestUnprotectRtp(CS_AES_CM_128_HMAC_SHA1_80);
-  TestUnprotectRtcp(CS_AES_CM_128_HMAC_SHA1_80);
-}
-
-// Test that we can encrypt and decrypt RTP/RTCP using AES_CM_128_HMAC_SHA1_32.
-TEST_F(SrtpSessionTest, TestProtect_AES_CM_128_HMAC_SHA1_32) {
-  EXPECT_TRUE(s1_.SetSend(SRTP_AES128_CM_SHA1_32, kTestKey1, kTestKeyLen));
-  EXPECT_TRUE(s2_.SetRecv(SRTP_AES128_CM_SHA1_32, kTestKey1, kTestKeyLen));
-  TestProtectRtp(CS_AES_CM_128_HMAC_SHA1_32);
-  TestProtectRtcp(CS_AES_CM_128_HMAC_SHA1_32);
-  TestUnprotectRtp(CS_AES_CM_128_HMAC_SHA1_32);
-  TestUnprotectRtcp(CS_AES_CM_128_HMAC_SHA1_32);
-}
-
-TEST_F(SrtpSessionTest, TestGetSendStreamPacketIndex) {
-  EXPECT_TRUE(s1_.SetSend(SRTP_AES128_CM_SHA1_32, kTestKey1, kTestKeyLen));
-  int64_t index;
-  int out_len = 0;
-  EXPECT_TRUE(s1_.ProtectRtp(rtp_packet_, rtp_len_, sizeof(rtp_packet_),
-                             &out_len, &index));
-  // |index| will be shifted by 16.
-  int64_t be64_index = static_cast<int64_t>(NetworkToHost64(1 << 16));
-  EXPECT_EQ(be64_index, index);
-}
-
-// Test that we fail to unprotect if someone tampers with the RTP/RTCP paylaods.
-TEST_F(SrtpSessionTest, TestTamperReject) {
-  int out_len;
-  EXPECT_TRUE(s1_.SetSend(SRTP_AES128_CM_SHA1_80, kTestKey1, kTestKeyLen));
-  EXPECT_TRUE(s2_.SetRecv(SRTP_AES128_CM_SHA1_80, kTestKey1, kTestKeyLen));
-  TestProtectRtp(CS_AES_CM_128_HMAC_SHA1_80);
-  TestProtectRtcp(CS_AES_CM_128_HMAC_SHA1_80);
-  rtp_packet_[0] = 0x12;
-  rtcp_packet_[1] = 0x34;
-  EXPECT_FALSE(s2_.UnprotectRtp(rtp_packet_, rtp_len_, &out_len));
-  EXPECT_FALSE(s2_.UnprotectRtcp(rtcp_packet_, rtcp_len_, &out_len));
-}
-
-// Test that we fail to unprotect if the payloads are not authenticated.
-TEST_F(SrtpSessionTest, TestUnencryptReject) {
-  int out_len;
-  EXPECT_TRUE(s1_.SetSend(SRTP_AES128_CM_SHA1_80, kTestKey1, kTestKeyLen));
-  EXPECT_TRUE(s2_.SetRecv(SRTP_AES128_CM_SHA1_80, kTestKey1, kTestKeyLen));
-  EXPECT_FALSE(s2_.UnprotectRtp(rtp_packet_, rtp_len_, &out_len));
-  EXPECT_FALSE(s2_.UnprotectRtcp(rtcp_packet_, rtcp_len_, &out_len));
-}
-
-// Test that we fail when using buffers that are too small.
-TEST_F(SrtpSessionTest, TestBuffersTooSmall) {
-  int out_len;
-  EXPECT_TRUE(s1_.SetSend(SRTP_AES128_CM_SHA1_80, kTestKey1, kTestKeyLen));
-  EXPECT_FALSE(s1_.ProtectRtp(rtp_packet_, rtp_len_, sizeof(rtp_packet_) - 10,
-                              &out_len));
-  EXPECT_FALSE(s1_.ProtectRtcp(rtcp_packet_, rtcp_len_,
-                               sizeof(rtcp_packet_) - 14, &out_len));
-}
-
-TEST_F(SrtpSessionTest, TestReplay) {
-  static const uint16_t kMaxSeqnum = static_cast<uint16_t>(-1);
-  static const uint16_t seqnum_big = 62275;
-  static const uint16_t seqnum_small = 10;
-  static const uint16_t replay_window = 1024;
-  int out_len;
-
-  EXPECT_TRUE(s1_.SetSend(SRTP_AES128_CM_SHA1_80, kTestKey1, kTestKeyLen));
-  EXPECT_TRUE(s2_.SetRecv(SRTP_AES128_CM_SHA1_80, kTestKey1, kTestKeyLen));
-
-  // Initial sequence number.
-  SetBE16(reinterpret_cast<uint8_t*>(rtp_packet_) + 2, seqnum_big);
-  EXPECT_TRUE(
-      s1_.ProtectRtp(rtp_packet_, rtp_len_, sizeof(rtp_packet_), &out_len));
-
-  // Replay within the 1024 window should succeed.
-  SetBE16(reinterpret_cast<uint8_t*>(rtp_packet_) + 2,
-          seqnum_big - replay_window + 1);
-  EXPECT_TRUE(
-      s1_.ProtectRtp(rtp_packet_, rtp_len_, sizeof(rtp_packet_), &out_len));
-
-  // Replay out side of the 1024 window should fail.
-  SetBE16(reinterpret_cast<uint8_t*>(rtp_packet_) + 2,
-          seqnum_big - replay_window - 1);
-  EXPECT_FALSE(
-      s1_.ProtectRtp(rtp_packet_, rtp_len_, sizeof(rtp_packet_), &out_len));
-
-  // Increment sequence number to a small number.
-  SetBE16(reinterpret_cast<uint8_t*>(rtp_packet_) + 2, seqnum_small);
-  EXPECT_TRUE(
-      s1_.ProtectRtp(rtp_packet_, rtp_len_, sizeof(rtp_packet_), &out_len));
-
-  // Replay around 0 but out side of the 1024 window should fail.
-  SetBE16(reinterpret_cast<uint8_t*>(rtp_packet_) + 2,
-          kMaxSeqnum + seqnum_small - replay_window - 1);
-  EXPECT_FALSE(
-      s1_.ProtectRtp(rtp_packet_, rtp_len_, sizeof(rtp_packet_), &out_len));
-
-  // Replay around 0 but within the 1024 window should succeed.
-  for (uint16_t seqnum = 65000; seqnum < 65003; ++seqnum) {
-    SetBE16(reinterpret_cast<uint8_t*>(rtp_packet_) + 2, seqnum);
-    EXPECT_TRUE(
-        s1_.ProtectRtp(rtp_packet_, rtp_len_, sizeof(rtp_packet_), &out_len));
-  }
-
-  // Go back to normal sequence nubmer.
-  // NOTE: without the fix in libsrtp, this would fail. This is because
-  // without the fix, the loop above would keep incrementing local sequence
-  // number in libsrtp, eventually the new sequence number would go out side
-  // of the window.
-  SetBE16(reinterpret_cast<uint8_t*>(rtp_packet_) + 2, seqnum_small + 1);
-  EXPECT_TRUE(
-      s1_.ProtectRtp(rtp_packet_, rtp_len_, sizeof(rtp_packet_), &out_len));
-}
-
-}  // namespace rtc
diff --git a/pc/srtptestutil.h b/pc/srtptestutil.h
deleted file mode 100644
index daf7eb0..0000000
--- a/pc/srtptestutil.h
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- *  Copyright 2017 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_PC_SRTPTESTUTIL_H_
-#define WEBRTC_PC_SRTPTESTUTIL_H_
-
-#include <string>
-
-namespace rtc {
-
-extern const char CS_AES_CM_128_HMAC_SHA1_32[];
-extern const char CS_AEAD_AES_128_GCM[];
-extern const char CS_AEAD_AES_256_GCM[];
-
-static const uint8_t kTestKey1[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234";
-static const uint8_t kTestKey2[] = "4321ZYXWVUTSRQPONMLKJIHGFEDCBA";
-static const int kTestKeyLen = 30;
-
-static int rtp_auth_tag_len(const std::string& cs) {
-  if (cs == CS_AES_CM_128_HMAC_SHA1_32) {
-    return 4;
-  } else if (cs == CS_AEAD_AES_128_GCM || cs == CS_AEAD_AES_256_GCM) {
-    return 16;
-  } else {
-    return 10;
-  }
-}
-static int rtcp_auth_tag_len(const std::string& cs) {
-  if (cs == CS_AEAD_AES_128_GCM || cs == CS_AEAD_AES_256_GCM) {
-    return 16;
-  } else {
-    return 10;
-  }
-}
-
-}  // namespace rtc
-
-#endif  // WEBRTC_PC_SRTPTESTUTIL_H_
diff --git a/pc/srtptransport.cc b/pc/srtptransport.cc
deleted file mode 100644
index d9f054b..0000000
--- a/pc/srtptransport.cc
+++ /dev/null
@@ -1,364 +0,0 @@
-/*
- *  Copyright 2017 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/pc/srtptransport.h"
-
-#include <string>
-
-#include "webrtc/media/base/rtputils.h"
-#include "webrtc/pc/rtptransport.h"
-#include "webrtc/pc/srtpsession.h"
-#include "webrtc/rtc_base/asyncpacketsocket.h"
-#include "webrtc/rtc_base/base64.h"
-#include "webrtc/rtc_base/copyonwritebuffer.h"
-#include "webrtc/rtc_base/ptr_util.h"
-#include "webrtc/rtc_base/trace_event.h"
-
-namespace webrtc {
-
-SrtpTransport::SrtpTransport(bool rtcp_mux_enabled,
-                             const std::string& content_name)
-    : content_name_(content_name),
-      rtp_transport_(rtc::MakeUnique<RtpTransport>(rtcp_mux_enabled)) {
-  ConnectToRtpTransport();
-}
-
-SrtpTransport::SrtpTransport(std::unique_ptr<RtpTransportInternal> transport,
-                             const std::string& content_name)
-    : content_name_(content_name), rtp_transport_(std::move(transport)) {
-  ConnectToRtpTransport();
-}
-
-void SrtpTransport::ConnectToRtpTransport() {
-  rtp_transport_->SignalPacketReceived.connect(
-      this, &SrtpTransport::OnPacketReceived);
-  rtp_transport_->SignalReadyToSend.connect(this,
-                                            &SrtpTransport::OnReadyToSend);
-}
-
-bool SrtpTransport::SendRtpPacket(rtc::CopyOnWriteBuffer* packet,
-                                  const rtc::PacketOptions& options,
-                                  int flags) {
-  return SendPacket(false, packet, options, flags);
-}
-
-bool SrtpTransport::SendRtcpPacket(rtc::CopyOnWriteBuffer* packet,
-                                   const rtc::PacketOptions& options,
-                                   int flags) {
-  return SendPacket(true, packet, options, flags);
-}
-
-bool SrtpTransport::SendPacket(bool rtcp,
-                               rtc::CopyOnWriteBuffer* packet,
-                               const rtc::PacketOptions& options,
-                               int flags) {
-  if (!IsActive()) {
-    LOG(LS_ERROR)
-        << "Failed to send the packet because SRTP transport is inactive.";
-    return false;
-  }
-
-  rtc::PacketOptions updated_options = options;
-  rtc::CopyOnWriteBuffer cp = *packet;
-  TRACE_EVENT0("webrtc", "SRTP Encode");
-  bool res;
-  uint8_t* data = packet->data();
-  int len = static_cast<int>(packet->size());
-  if (!rtcp) {
-// If ENABLE_EXTERNAL_AUTH flag is on then packet authentication is not done
-// inside libsrtp for a RTP packet. A external HMAC module will be writing
-// a fake HMAC value. This is ONLY done for a RTP packet.
-// Socket layer will update rtp sendtime extension header if present in
-// packet with current time before updating the HMAC.
-#if !defined(ENABLE_EXTERNAL_AUTH)
-    res = ProtectRtp(data, len, static_cast<int>(packet->capacity()), &len);
-#else
-    if (!IsExternalAuthActive()) {
-      res = ProtectRtp(data, len, static_cast<int>(packet->capacity()), &len);
-    } else {
-      updated_options.packet_time_params.rtp_sendtime_extension_id =
-          rtp_abs_sendtime_extn_id_;
-      res = ProtectRtp(data, len, static_cast<int>(packet->capacity()), &len,
-                       &updated_options.packet_time_params.srtp_packet_index);
-      // If protection succeeds, let's get auth params from srtp.
-      if (res) {
-        uint8_t* auth_key = NULL;
-        int key_len;
-        res = GetRtpAuthParams(
-            &auth_key, &key_len,
-            &updated_options.packet_time_params.srtp_auth_tag_len);
-        if (res) {
-          updated_options.packet_time_params.srtp_auth_key.resize(key_len);
-          updated_options.packet_time_params.srtp_auth_key.assign(
-              auth_key, auth_key + key_len);
-        }
-      }
-    }
-#endif
-    if (!res) {
-      int seq_num = -1;
-      uint32_t ssrc = 0;
-      cricket::GetRtpSeqNum(data, len, &seq_num);
-      cricket::GetRtpSsrc(data, len, &ssrc);
-      LOG(LS_ERROR) << "Failed to protect " << content_name_
-                    << " RTP packet: size=" << len << ", seqnum=" << seq_num
-                    << ", SSRC=" << ssrc;
-      return false;
-    }
-  } else {
-    res = ProtectRtcp(data, len, static_cast<int>(packet->capacity()), &len);
-    if (!res) {
-      int type = -1;
-      cricket::GetRtcpType(data, len, &type);
-      LOG(LS_ERROR) << "Failed to protect " << content_name_
-                    << " RTCP packet: size=" << len << ", type=" << type;
-      return false;
-    }
-  }
-
-  // Update the length of the packet now that we've added the auth tag.
-  packet->SetSize(len);
-  return rtcp ? rtp_transport_->SendRtcpPacket(packet, updated_options, flags)
-              : rtp_transport_->SendRtpPacket(packet, updated_options, flags);
-}
-
-void SrtpTransport::OnPacketReceived(bool rtcp,
-                                     rtc::CopyOnWriteBuffer* packet,
-                                     const rtc::PacketTime& packet_time) {
-  if (!IsActive()) {
-    LOG(LS_WARNING) << "Inactive SRTP transport received a packet. Drop it.";
-    return;
-  }
-
-  TRACE_EVENT0("webrtc", "SRTP Decode");
-  char* data = packet->data<char>();
-  int len = static_cast<int>(packet->size());
-  bool res;
-  if (!rtcp) {
-    res = UnprotectRtp(data, len, &len);
-    if (!res) {
-      int seq_num = -1;
-      uint32_t ssrc = 0;
-      cricket::GetRtpSeqNum(data, len, &seq_num);
-      cricket::GetRtpSsrc(data, len, &ssrc);
-      LOG(LS_ERROR) << "Failed to unprotect " << content_name_
-                    << " RTP packet: size=" << len << ", seqnum=" << seq_num
-                    << ", SSRC=" << ssrc;
-      return;
-    }
-  } else {
-    res = UnprotectRtcp(data, len, &len);
-    if (!res) {
-      int type = -1;
-      cricket::GetRtcpType(data, len, &type);
-      LOG(LS_ERROR) << "Failed to unprotect " << content_name_
-                    << " RTCP packet: size=" << len << ", type=" << type;
-      return;
-    }
-  }
-
-  packet->SetSize(len);
-  SignalPacketReceived(rtcp, packet, packet_time);
-}
-
-bool SrtpTransport::SetRtpParams(int send_cs,
-                                 const uint8_t* send_key,
-                                 int send_key_len,
-                                 int recv_cs,
-                                 const uint8_t* recv_key,
-                                 int recv_key_len) {
-  CreateSrtpSessions();
-  send_session_->SetEncryptedHeaderExtensionIds(
-      send_encrypted_header_extension_ids_);
-  if (external_auth_enabled_) {
-    send_session_->EnableExternalAuth();
-  }
-  if (!send_session_->SetSend(send_cs, send_key, send_key_len)) {
-    ResetParams();
-    return false;
-  }
-
-  recv_session_->SetEncryptedHeaderExtensionIds(
-      recv_encrypted_header_extension_ids_);
-  if (!recv_session_->SetRecv(recv_cs, recv_key, recv_key_len)) {
-    ResetParams();
-    return false;
-  }
-
-  LOG(LS_INFO) << "SRTP activated with negotiated parameters:"
-               << " send cipher_suite " << send_cs << " recv cipher_suite "
-               << recv_cs;
-  return true;
-}
-
-bool SrtpTransport::SetRtcpParams(int send_cs,
-                                  const uint8_t* send_key,
-                                  int send_key_len,
-                                  int recv_cs,
-                                  const uint8_t* recv_key,
-                                  int recv_key_len) {
-  // This can only be called once, but can be safely called after
-  // SetRtpParams
-  if (send_rtcp_session_ || recv_rtcp_session_) {
-    LOG(LS_ERROR) << "Tried to set SRTCP Params when filter already active";
-    return false;
-  }
-
-  send_rtcp_session_.reset(new cricket::SrtpSession());
-  if (!send_rtcp_session_->SetRecv(send_cs, send_key, send_key_len)) {
-    return false;
-  }
-
-  recv_rtcp_session_.reset(new cricket::SrtpSession());
-  if (!recv_rtcp_session_->SetRecv(recv_cs, recv_key, recv_key_len)) {
-    return false;
-  }
-
-  LOG(LS_INFO) << "SRTCP activated with negotiated parameters:"
-               << " send cipher_suite " << send_cs << " recv cipher_suite "
-               << recv_cs;
-
-  return true;
-}
-
-bool SrtpTransport::IsActive() const {
-  return send_session_ && recv_session_;
-}
-
-void SrtpTransport::ResetParams() {
-  send_session_ = nullptr;
-  recv_session_ = nullptr;
-  send_rtcp_session_ = nullptr;
-  recv_rtcp_session_ = nullptr;
-  LOG(LS_INFO) << "The params in SRTP transport are reset.";
-}
-
-void SrtpTransport::SetEncryptedHeaderExtensionIds(
-    cricket::ContentSource source,
-    const std::vector<int>& extension_ids) {
-  if (source == cricket::CS_LOCAL) {
-    recv_encrypted_header_extension_ids_ = extension_ids;
-  } else {
-    send_encrypted_header_extension_ids_ = extension_ids;
-  }
-}
-
-void SrtpTransport::CreateSrtpSessions() {
-  send_session_.reset(new cricket::SrtpSession());
-  recv_session_.reset(new cricket::SrtpSession());
-
-  if (external_auth_enabled_) {
-    send_session_->EnableExternalAuth();
-  }
-}
-
-bool SrtpTransport::ProtectRtp(void* p, int in_len, int max_len, int* out_len) {
-  if (!IsActive()) {
-    LOG(LS_WARNING) << "Failed to ProtectRtp: SRTP not active";
-    return false;
-  }
-  RTC_CHECK(send_session_);
-  return send_session_->ProtectRtp(p, in_len, max_len, out_len);
-}
-
-bool SrtpTransport::ProtectRtp(void* p,
-                               int in_len,
-                               int max_len,
-                               int* out_len,
-                               int64_t* index) {
-  if (!IsActive()) {
-    LOG(LS_WARNING) << "Failed to ProtectRtp: SRTP not active";
-    return false;
-  }
-  RTC_CHECK(send_session_);
-  return send_session_->ProtectRtp(p, in_len, max_len, out_len, index);
-}
-
-bool SrtpTransport::ProtectRtcp(void* p,
-                                int in_len,
-                                int max_len,
-                                int* out_len) {
-  if (!IsActive()) {
-    LOG(LS_WARNING) << "Failed to ProtectRtcp: SRTP not active";
-    return false;
-  }
-  if (send_rtcp_session_) {
-    return send_rtcp_session_->ProtectRtcp(p, in_len, max_len, out_len);
-  } else {
-    RTC_CHECK(send_session_);
-    return send_session_->ProtectRtcp(p, in_len, max_len, out_len);
-  }
-}
-
-bool SrtpTransport::UnprotectRtp(void* p, int in_len, int* out_len) {
-  if (!IsActive()) {
-    LOG(LS_WARNING) << "Failed to UnprotectRtp: SRTP not active";
-    return false;
-  }
-  RTC_CHECK(recv_session_);
-  return recv_session_->UnprotectRtp(p, in_len, out_len);
-}
-
-bool SrtpTransport::UnprotectRtcp(void* p, int in_len, int* out_len) {
-  if (!IsActive()) {
-    LOG(LS_WARNING) << "Failed to UnprotectRtcp: SRTP not active";
-    return false;
-  }
-  if (recv_rtcp_session_) {
-    return recv_rtcp_session_->UnprotectRtcp(p, in_len, out_len);
-  } else {
-    RTC_CHECK(recv_session_);
-    return recv_session_->UnprotectRtcp(p, in_len, out_len);
-  }
-}
-
-bool SrtpTransport::GetRtpAuthParams(uint8_t** key,
-                                     int* key_len,
-                                     int* tag_len) {
-  if (!IsActive()) {
-    LOG(LS_WARNING) << "Failed to GetRtpAuthParams: SRTP not active";
-    return false;
-  }
-
-  RTC_CHECK(send_session_);
-  return send_session_->GetRtpAuthParams(key, key_len, tag_len);
-}
-
-bool SrtpTransport::GetSrtpOverhead(int* srtp_overhead) const {
-  if (!IsActive()) {
-    LOG(LS_WARNING) << "Failed to GetSrtpOverhead: SRTP not active";
-    return false;
-  }
-
-  RTC_CHECK(send_session_);
-  *srtp_overhead = send_session_->GetSrtpOverhead();
-  return true;
-}
-
-void SrtpTransport::EnableExternalAuth() {
-  RTC_DCHECK(!IsActive());
-  external_auth_enabled_ = true;
-}
-
-bool SrtpTransport::IsExternalAuthEnabled() const {
-  return external_auth_enabled_;
-}
-
-bool SrtpTransport::IsExternalAuthActive() const {
-  if (!IsActive()) {
-    LOG(LS_WARNING) << "Failed to check IsExternalAuthActive: SRTP not active";
-    return false;
-  }
-
-  RTC_CHECK(send_session_);
-  return send_session_->IsExternalAuthActive();
-}
-
-}  // namespace webrtc
diff --git a/pc/srtptransport.h b/pc/srtptransport.h
deleted file mode 100644
index 769df06..0000000
--- a/pc/srtptransport.h
+++ /dev/null
@@ -1,198 +0,0 @@
-/*
- *  Copyright 2017 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_PC_SRTPTRANSPORT_H_
-#define WEBRTC_PC_SRTPTRANSPORT_H_
-
-#include <memory>
-#include <string>
-#include <utility>
-
-#include "webrtc/pc/rtptransportinternal.h"
-#include "webrtc/pc/srtpfilter.h"
-#include "webrtc/pc/srtpsession.h"
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-
-// This class will eventually be a wrapper around RtpTransportInternal
-// that protects and unprotects sent and received RTP packets.
-class SrtpTransport : public RtpTransportInternal {
- public:
-  SrtpTransport(bool rtcp_mux_enabled, const std::string& content_name);
-
-  SrtpTransport(std::unique_ptr<RtpTransportInternal> transport,
-                const std::string& content_name);
-
-  void SetRtcpMuxEnabled(bool enable) override {
-    rtp_transport_->SetRtcpMuxEnabled(enable);
-  }
-
-  rtc::PacketTransportInternal* rtp_packet_transport() const override {
-    return rtp_transport_->rtp_packet_transport();
-  }
-
-  void SetRtpPacketTransport(rtc::PacketTransportInternal* rtp) override {
-    rtp_transport_->SetRtpPacketTransport(rtp);
-  }
-
-  PacketTransportInterface* GetRtpPacketTransport() const override {
-    return rtp_transport_->GetRtpPacketTransport();
-  }
-
-  rtc::PacketTransportInternal* rtcp_packet_transport() const override {
-    return rtp_transport_->rtcp_packet_transport();
-  }
-  void SetRtcpPacketTransport(rtc::PacketTransportInternal* rtcp) override {
-    rtp_transport_->SetRtcpPacketTransport(rtcp);
-  }
-
-  PacketTransportInterface* GetRtcpPacketTransport() const override {
-    return rtp_transport_->GetRtcpPacketTransport();
-  }
-
-  bool SendRtpPacket(rtc::CopyOnWriteBuffer* packet,
-                     const rtc::PacketOptions& options,
-                     int flags) override;
-
-  bool SendRtcpPacket(rtc::CopyOnWriteBuffer* packet,
-                      const rtc::PacketOptions& options,
-                      int flags) override;
-
-  bool IsWritable(bool rtcp) const override {
-    return rtp_transport_->IsWritable(rtcp);
-  }
-
-  // The transport becomes active if the send_session_ and recv_session_ are
-  // created.
-  bool IsActive() const;
-
-  bool HandlesPayloadType(int payload_type) const override {
-    return rtp_transport_->HandlesPayloadType(payload_type);
-  }
-
-  void AddHandledPayloadType(int payload_type) override {
-    rtp_transport_->AddHandledPayloadType(payload_type);
-  }
-
-  RTCError SetParameters(const RtpTransportParameters& parameters) override {
-    return rtp_transport_->SetParameters(parameters);
-  }
-
-  RtpTransportParameters GetParameters() const override {
-    return rtp_transport_->GetParameters();
-  }
-
-  // TODO(zstein): Remove this when we remove RtpTransportAdapter.
-  RtpTransportAdapter* GetInternal() override { return nullptr; }
-
-  // Create new send/recv sessions and set the negotiated crypto keys for RTP
-  // packet encryption. The keys can either come from SDES negotiation or DTLS
-  // handshake.
-  bool SetRtpParams(int send_cs,
-                    const uint8_t* send_key,
-                    int send_key_len,
-                    int recv_cs,
-                    const uint8_t* recv_key,
-                    int recv_key_len);
-
-  // Create new send/recv sessions and set the negotiated crypto keys for RTCP
-  // packet encryption. The keys can either come from SDES negotiation or DTLS
-  // handshake.
-  bool SetRtcpParams(int send_cs,
-                     const uint8_t* send_key,
-                     int send_key_len,
-                     int recv_cs,
-                     const uint8_t* recv_key,
-                     int recv_key_len);
-
-  void ResetParams();
-
-  // Set the header extension ids that should be encrypted for the given source.
-  // This method doesn't immediately update the SRTP session with the new IDs,
-  // and you need to call SetRtpParams for that to happen.
-  void SetEncryptedHeaderExtensionIds(cricket::ContentSource source,
-                                      const std::vector<int>& extension_ids);
-
-  // If external auth is enabled, SRTP will write a dummy auth tag that then
-  // later must get replaced before the packet is sent out. Only supported for
-  // non-GCM cipher suites and can be checked through "IsExternalAuthActive"
-  // if it is actually used. This method is only valid before the RTP params
-  // have been set.
-  void EnableExternalAuth();
-  bool IsExternalAuthEnabled() const;
-
-  // A SrtpTransport supports external creation of the auth tag if a non-GCM
-  // cipher is used. This method is only valid after the RTP params have
-  // been set.
-  bool IsExternalAuthActive() const;
-
-  // Returns srtp overhead for rtp packets.
-  bool GetSrtpOverhead(int* srtp_overhead) const;
-
-  // Returns rtp auth params from srtp context.
-  bool GetRtpAuthParams(uint8_t** key, int* key_len, int* tag_len);
-
-  // Helper method to get RTP Absoulute SendTime extension header id if
-  // present in remote supported extensions list.
-  void CacheRtpAbsSendTimeHeaderExtension(int rtp_abs_sendtime_extn_id) {
-    rtp_abs_sendtime_extn_id_ = rtp_abs_sendtime_extn_id;
-  }
-
- private:
-  void CreateSrtpSessions();
-
-  void ConnectToRtpTransport();
-
-  bool SendPacket(bool rtcp,
-                  rtc::CopyOnWriteBuffer* packet,
-                  const rtc::PacketOptions& options,
-                  int flags);
-
-  void OnPacketReceived(bool rtcp,
-                        rtc::CopyOnWriteBuffer* packet,
-                        const rtc::PacketTime& packet_time);
-
-  void OnReadyToSend(bool ready) { SignalReadyToSend(ready); }
-
-  bool ProtectRtp(void* data, int in_len, int max_len, int* out_len);
-
-  // Overloaded version, outputs packet index.
-  bool ProtectRtp(void* data,
-                  int in_len,
-                  int max_len,
-                  int* out_len,
-                  int64_t* index);
-  bool ProtectRtcp(void* data, int in_len, int max_len, int* out_len);
-
-  // Decrypts/verifies an invidiual RTP/RTCP packet.
-  // If an HMAC is used, this will decrease the packet size.
-  bool UnprotectRtp(void* data, int in_len, int* out_len);
-
-  bool UnprotectRtcp(void* data, int in_len, int* out_len);
-
-  const std::string content_name_;
-  std::unique_ptr<RtpTransportInternal> rtp_transport_;
-
-  std::unique_ptr<cricket::SrtpSession> send_session_;
-  std::unique_ptr<cricket::SrtpSession> recv_session_;
-  std::unique_ptr<cricket::SrtpSession> send_rtcp_session_;
-  std::unique_ptr<cricket::SrtpSession> recv_rtcp_session_;
-
-  std::vector<int> send_encrypted_header_extension_ids_;
-  std::vector<int> recv_encrypted_header_extension_ids_;
-  bool external_auth_enabled_ = false;
-
-  int rtp_abs_sendtime_extn_id_ = -1;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_PC_SRTPTRANSPORT_H_
diff --git a/pc/srtptransport_unittest.cc b/pc/srtptransport_unittest.cc
deleted file mode 100644
index e097ff1..0000000
--- a/pc/srtptransport_unittest.cc
+++ /dev/null
@@ -1,422 +0,0 @@
-/*
- *  Copyright 2017 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/pc/srtptransport.h"
-
-#include "webrtc/media/base/fakertp.h"
-#include "webrtc/p2p/base/dtlstransportinternal.h"
-#include "webrtc/p2p/base/fakepackettransport.h"
-#include "webrtc/pc/rtptransport.h"
-#include "webrtc/pc/rtptransporttestutil.h"
-#include "webrtc/pc/srtptestutil.h"
-#include "webrtc/rtc_base/asyncpacketsocket.h"
-#include "webrtc/rtc_base/gunit.h"
-#include "webrtc/rtc_base/ptr_util.h"
-#include "webrtc/rtc_base/sslstreamadapter.h"
-
-using rtc::kTestKey1;
-using rtc::kTestKey2;
-using rtc::kTestKeyLen;
-using rtc::SRTP_AEAD_AES_128_GCM;
-
-namespace webrtc {
-static const uint8_t kTestKeyGcm128_1[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ12";
-static const uint8_t kTestKeyGcm128_2[] = "21ZYXWVUTSRQPONMLKJIHGFEDCBA";
-static const int kTestKeyGcm128Len = 28;  // 128 bits key + 96 bits salt.
-static const uint8_t kTestKeyGcm256_1[] =
-    "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqr";
-static const uint8_t kTestKeyGcm256_2[] =
-    "rqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA";
-static const int kTestKeyGcm256Len = 44;  // 256 bits key + 96 bits salt.
-
-class SrtpTransportTest : public testing::Test, public sigslot::has_slots<> {
- protected:
-  SrtpTransportTest() {
-    bool rtcp_mux_enabled = true;
-    auto rtp_transport1 = rtc::MakeUnique<RtpTransport>(rtcp_mux_enabled);
-    auto rtp_transport2 = rtc::MakeUnique<RtpTransport>(rtcp_mux_enabled);
-
-    rtp_packet_transport1_ =
-        rtc::MakeUnique<rtc::FakePacketTransport>("fake_packet_transport1");
-    rtp_packet_transport2_ =
-        rtc::MakeUnique<rtc::FakePacketTransport>("fake_packet_transport2");
-
-    bool asymmetric = false;
-    rtp_packet_transport1_->SetDestination(rtp_packet_transport2_.get(),
-                                           asymmetric);
-
-    rtp_transport1->SetRtpPacketTransport(rtp_packet_transport1_.get());
-    rtp_transport2->SetRtpPacketTransport(rtp_packet_transport2_.get());
-
-    // Add payload type for RTP packet and RTCP packet.
-    rtp_transport1->AddHandledPayloadType(0x00);
-    rtp_transport2->AddHandledPayloadType(0x00);
-    rtp_transport1->AddHandledPayloadType(0xc9);
-    rtp_transport2->AddHandledPayloadType(0xc9);
-
-    srtp_transport1_ =
-        rtc::MakeUnique<SrtpTransport>(std::move(rtp_transport1), "content");
-    srtp_transport2_ =
-        rtc::MakeUnique<SrtpTransport>(std::move(rtp_transport2), "content");
-
-    srtp_transport1_->SignalPacketReceived.connect(
-        this, &SrtpTransportTest::OnPacketReceived1);
-    srtp_transport2_->SignalPacketReceived.connect(
-        this, &SrtpTransportTest::OnPacketReceived2);
-  }
-
-  void OnPacketReceived1(bool rtcp,
-                         rtc::CopyOnWriteBuffer* packet,
-                         const rtc::PacketTime& packet_time) {
-    LOG(LS_INFO) << "SrtpTransport1 Received a packet.";
-    last_recv_packet1_ = *packet;
-  }
-
-  void OnPacketReceived2(bool rtcp,
-                         rtc::CopyOnWriteBuffer* packet,
-                         const rtc::PacketTime& packet_time) {
-    LOG(LS_INFO) << "SrtpTransport2 Received a packet.";
-    last_recv_packet2_ = *packet;
-  }
-
-  // With external auth enabled, SRTP doesn't write the auth tag and
-  // unprotect would fail. Check accessing the information about the
-  // tag instead, similar to what the actual code would do that relies
-  // on external auth.
-  void TestRtpAuthParams(SrtpTransport* transport, const std::string& cs) {
-    int overhead;
-    EXPECT_TRUE(transport->GetSrtpOverhead(&overhead));
-    switch (rtc::SrtpCryptoSuiteFromName(cs)) {
-      case rtc::SRTP_AES128_CM_SHA1_32:
-        EXPECT_EQ(32 / 8, overhead);  // 32-bit tag.
-        break;
-      case rtc::SRTP_AES128_CM_SHA1_80:
-        EXPECT_EQ(80 / 8, overhead);  // 80-bit tag.
-        break;
-      default:
-        RTC_NOTREACHED();
-        break;
-    }
-
-    uint8_t* auth_key = nullptr;
-    int key_len = 0;
-    int tag_len = 0;
-    EXPECT_TRUE(transport->GetRtpAuthParams(&auth_key, &key_len, &tag_len));
-    EXPECT_NE(nullptr, auth_key);
-    EXPECT_EQ(160 / 8, key_len);  // Length of SHA-1 is 160 bits.
-    EXPECT_EQ(overhead, tag_len);
-  }
-
-  void TestSendRecvRtpPacket(const std::string& cipher_suite_name) {
-    size_t rtp_len = sizeof(kPcmuFrame);
-    size_t packet_size = rtp_len + rtc::rtp_auth_tag_len(cipher_suite_name);
-    rtc::Buffer rtp_packet_buffer(packet_size);
-    char* rtp_packet_data = rtp_packet_buffer.data<char>();
-    memcpy(rtp_packet_data, kPcmuFrame, rtp_len);
-    // In order to be able to run this test function multiple times we can not
-    // use the same sequence number twice. Increase the sequence number by one.
-    rtc::SetBE16(reinterpret_cast<uint8_t*>(rtp_packet_data) + 2,
-                 ++sequence_number_);
-    rtc::CopyOnWriteBuffer rtp_packet1to2(rtp_packet_data, rtp_len,
-                                          packet_size);
-    rtc::CopyOnWriteBuffer rtp_packet2to1(rtp_packet_data, rtp_len,
-                                          packet_size);
-
-    char original_rtp_data[sizeof(kPcmuFrame)];
-    memcpy(original_rtp_data, rtp_packet_data, rtp_len);
-
-    rtc::PacketOptions options;
-    // Send a packet from |srtp_transport1_| to |srtp_transport2_| and verify
-    // that the packet can be successfully received and decrypted.
-    ASSERT_TRUE(srtp_transport1_->SendRtpPacket(&rtp_packet1to2, options,
-                                                cricket::PF_SRTP_BYPASS));
-    if (srtp_transport1_->IsExternalAuthActive()) {
-      TestRtpAuthParams(srtp_transport1_.get(), cipher_suite_name);
-    } else {
-      ASSERT_TRUE(last_recv_packet2_.data());
-      EXPECT_TRUE(
-          memcmp(last_recv_packet2_.data(), original_rtp_data, rtp_len) == 0);
-      // Get the encrypted packet from underneath packet transport and verify
-      // the data is actually encrypted.
-      auto fake_rtp_packet_transport = static_cast<rtc::FakePacketTransport*>(
-          srtp_transport1_->rtp_packet_transport());
-      EXPECT_FALSE(memcmp(fake_rtp_packet_transport->last_sent_packet()->data(),
-                          original_rtp_data, rtp_len) == 0);
-    }
-
-    // Do the same thing in the opposite direction;
-    ASSERT_TRUE(srtp_transport2_->SendRtpPacket(&rtp_packet2to1, options,
-                                                cricket::PF_SRTP_BYPASS));
-    if (srtp_transport2_->IsExternalAuthActive()) {
-      TestRtpAuthParams(srtp_transport2_.get(), cipher_suite_name);
-    } else {
-      ASSERT_TRUE(last_recv_packet1_.data());
-      EXPECT_TRUE(
-          memcmp(last_recv_packet1_.data(), original_rtp_data, rtp_len) == 0);
-      auto fake_rtp_packet_transport = static_cast<rtc::FakePacketTransport*>(
-          srtp_transport2_->rtp_packet_transport());
-      EXPECT_FALSE(memcmp(fake_rtp_packet_transport->last_sent_packet()->data(),
-                          original_rtp_data, rtp_len) == 0);
-    }
-  }
-
-  void TestSendRecvRtcpPacket(const std::string& cipher_suite_name) {
-    size_t rtcp_len = sizeof(kRtcpReport);
-    size_t packet_size =
-        rtcp_len + 4 + rtc::rtcp_auth_tag_len(cipher_suite_name);
-    rtc::Buffer rtcp_packet_buffer(packet_size);
-    char* rtcp_packet_data = rtcp_packet_buffer.data<char>();
-    memcpy(rtcp_packet_data, kRtcpReport, rtcp_len);
-
-    rtc::CopyOnWriteBuffer rtcp_packet1to2(rtcp_packet_data, rtcp_len,
-                                           packet_size);
-    rtc::CopyOnWriteBuffer rtcp_packet2to1(rtcp_packet_data, rtcp_len,
-                                           packet_size);
-
-    rtc::PacketOptions options;
-    // Send a packet from |srtp_transport1_| to |srtp_transport2_| and verify
-    // that the packet can be successfully received and decrypted.
-    ASSERT_TRUE(srtp_transport1_->SendRtcpPacket(&rtcp_packet1to2, options,
-                                                 cricket::PF_SRTP_BYPASS));
-    ASSERT_TRUE(last_recv_packet2_.data());
-    EXPECT_TRUE(memcmp(last_recv_packet2_.data(), rtcp_packet_data, rtcp_len) ==
-                0);
-    // Get the encrypted packet from underneath packet transport and verify the
-    // data is actually encrypted.
-    auto fake_rtp_packet_transport = static_cast<rtc::FakePacketTransport*>(
-        srtp_transport1_->rtp_packet_transport());
-    EXPECT_FALSE(memcmp(fake_rtp_packet_transport->last_sent_packet()->data(),
-                        rtcp_packet_data, rtcp_len) == 0);
-
-    // Do the same thing in the opposite direction;
-    ASSERT_TRUE(srtp_transport2_->SendRtcpPacket(&rtcp_packet2to1, options,
-                                                 cricket::PF_SRTP_BYPASS));
-    ASSERT_TRUE(last_recv_packet1_.data());
-    EXPECT_TRUE(memcmp(last_recv_packet1_.data(), rtcp_packet_data, rtcp_len) ==
-                0);
-    fake_rtp_packet_transport = static_cast<rtc::FakePacketTransport*>(
-        srtp_transport2_->rtp_packet_transport());
-    EXPECT_FALSE(memcmp(fake_rtp_packet_transport->last_sent_packet()->data(),
-                        rtcp_packet_data, rtcp_len) == 0);
-  }
-
-  void TestSendRecvPacket(bool enable_external_auth,
-                          int cs,
-                          const uint8_t* key1,
-                          int key1_len,
-                          const uint8_t* key2,
-                          int key2_len,
-                          const std::string& cipher_suite_name) {
-    EXPECT_EQ(key1_len, key2_len);
-    EXPECT_EQ(cipher_suite_name, rtc::SrtpCryptoSuiteToName(cs));
-    if (enable_external_auth) {
-      srtp_transport1_->EnableExternalAuth();
-      srtp_transport2_->EnableExternalAuth();
-    }
-    EXPECT_TRUE(
-        srtp_transport1_->SetRtpParams(cs, key1, key1_len, cs, key2, key2_len));
-    EXPECT_TRUE(
-        srtp_transport2_->SetRtpParams(cs, key2, key2_len, cs, key1, key1_len));
-    EXPECT_TRUE(srtp_transport1_->SetRtcpParams(cs, key1, key1_len, cs, key2,
-                                                key2_len));
-    EXPECT_TRUE(srtp_transport2_->SetRtcpParams(cs, key2, key2_len, cs, key1,
-                                                key1_len));
-    EXPECT_TRUE(srtp_transport1_->IsActive());
-    EXPECT_TRUE(srtp_transport2_->IsActive());
-    if (rtc::IsGcmCryptoSuite(cs)) {
-      EXPECT_FALSE(srtp_transport1_->IsExternalAuthActive());
-      EXPECT_FALSE(srtp_transport2_->IsExternalAuthActive());
-    } else if (enable_external_auth) {
-      EXPECT_TRUE(srtp_transport1_->IsExternalAuthActive());
-      EXPECT_TRUE(srtp_transport2_->IsExternalAuthActive());
-    }
-    TestSendRecvRtpPacket(cipher_suite_name);
-    TestSendRecvRtcpPacket(cipher_suite_name);
-  }
-
-  void TestSendRecvPacketWithEncryptedHeaderExtension(
-      const std::string& cs,
-      const std::vector<int>& encrypted_header_ids) {
-    size_t rtp_len = sizeof(kPcmuFrameWithExtensions);
-    size_t packet_size = rtp_len + rtc::rtp_auth_tag_len(cs);
-    rtc::Buffer rtp_packet_buffer(packet_size);
-    char* rtp_packet_data = rtp_packet_buffer.data<char>();
-    memcpy(rtp_packet_data, kPcmuFrameWithExtensions, rtp_len);
-    // In order to be able to run this test function multiple times we can not
-    // use the same sequence number twice. Increase the sequence number by one.
-    rtc::SetBE16(reinterpret_cast<uint8_t*>(rtp_packet_data) + 2,
-                 ++sequence_number_);
-    rtc::CopyOnWriteBuffer rtp_packet1to2(rtp_packet_data, rtp_len,
-                                          packet_size);
-    rtc::CopyOnWriteBuffer rtp_packet2to1(rtp_packet_data, rtp_len,
-                                          packet_size);
-
-    char original_rtp_data[sizeof(kPcmuFrameWithExtensions)];
-    memcpy(original_rtp_data, rtp_packet_data, rtp_len);
-
-    rtc::PacketOptions options;
-    // Send a packet from |srtp_transport1_| to |srtp_transport2_| and verify
-    // that the packet can be successfully received and decrypted.
-    ASSERT_TRUE(srtp_transport1_->SendRtpPacket(&rtp_packet1to2, options,
-                                                cricket::PF_SRTP_BYPASS));
-    ASSERT_TRUE(last_recv_packet2_.data());
-    EXPECT_TRUE(memcmp(last_recv_packet2_.data(), original_rtp_data, rtp_len) ==
-                0);
-    // Get the encrypted packet from underneath packet transport and verify the
-    // data and header extension are actually encrypted.
-    auto fake_rtp_packet_transport = static_cast<rtc::FakePacketTransport*>(
-        srtp_transport1_->rtp_packet_transport());
-    EXPECT_FALSE(memcmp(fake_rtp_packet_transport->last_sent_packet()->data(),
-                        original_rtp_data, rtp_len) == 0);
-    CompareHeaderExtensions(
-        reinterpret_cast<const char*>(
-            fake_rtp_packet_transport->last_sent_packet()->data()),
-        fake_rtp_packet_transport->last_sent_packet()->size(),
-        original_rtp_data, rtp_len, encrypted_header_ids, false);
-
-    // Do the same thing in the opposite direction;
-    ASSERT_TRUE(srtp_transport2_->SendRtpPacket(&rtp_packet2to1, options,
-                                                cricket::PF_SRTP_BYPASS));
-    ASSERT_TRUE(last_recv_packet1_.data());
-    EXPECT_TRUE(memcmp(last_recv_packet1_.data(), original_rtp_data, rtp_len) ==
-                0);
-    fake_rtp_packet_transport = static_cast<rtc::FakePacketTransport*>(
-        srtp_transport2_->rtp_packet_transport());
-    EXPECT_FALSE(memcmp(fake_rtp_packet_transport->last_sent_packet()->data(),
-                        original_rtp_data, rtp_len) == 0);
-    CompareHeaderExtensions(
-        reinterpret_cast<const char*>(
-            fake_rtp_packet_transport->last_sent_packet()->data()),
-        fake_rtp_packet_transport->last_sent_packet()->size(),
-        original_rtp_data, rtp_len, encrypted_header_ids, false);
-  }
-
-  void TestSendRecvEncryptedHeaderExtension(int cs,
-                                            const uint8_t* key1,
-                                            int key1_len,
-                                            const uint8_t* key2,
-                                            int key2_len,
-                                            const std::string& cs_name) {
-    std::vector<int> encrypted_headers;
-    encrypted_headers.push_back(1);
-    // Don't encrypt header ids 2 and 3.
-    encrypted_headers.push_back(4);
-    EXPECT_EQ(key1_len, key2_len);
-    EXPECT_EQ(cs_name, rtc::SrtpCryptoSuiteToName(cs));
-    srtp_transport1_->SetEncryptedHeaderExtensionIds(cricket::CS_LOCAL,
-                                                     encrypted_headers);
-    srtp_transport1_->SetEncryptedHeaderExtensionIds(cricket::CS_REMOTE,
-                                                     encrypted_headers);
-    srtp_transport2_->SetEncryptedHeaderExtensionIds(cricket::CS_LOCAL,
-                                                     encrypted_headers);
-    srtp_transport2_->SetEncryptedHeaderExtensionIds(cricket::CS_REMOTE,
-                                                     encrypted_headers);
-    EXPECT_TRUE(
-        srtp_transport1_->SetRtpParams(cs, key1, key1_len, cs, key2, key2_len));
-    EXPECT_TRUE(
-        srtp_transport2_->SetRtpParams(cs, key2, key2_len, cs, key1, key1_len));
-    EXPECT_TRUE(srtp_transport1_->IsActive());
-    EXPECT_TRUE(srtp_transport2_->IsActive());
-    EXPECT_FALSE(srtp_transport1_->IsExternalAuthActive());
-    EXPECT_FALSE(srtp_transport2_->IsExternalAuthActive());
-    TestSendRecvPacketWithEncryptedHeaderExtension(cs_name, encrypted_headers);
-  }
-
-  std::unique_ptr<SrtpTransport> srtp_transport1_;
-  std::unique_ptr<SrtpTransport> srtp_transport2_;
-
-  std::unique_ptr<rtc::FakePacketTransport> rtp_packet_transport1_;
-  std::unique_ptr<rtc::FakePacketTransport> rtp_packet_transport2_;
-
-  rtc::CopyOnWriteBuffer last_recv_packet1_;
-  rtc::CopyOnWriteBuffer last_recv_packet2_;
-  int sequence_number_ = 0;
-};
-
-class SrtpTransportTestWithExternalAuth
-    : public SrtpTransportTest,
-      public testing::WithParamInterface<bool> {};
-
-TEST_P(SrtpTransportTestWithExternalAuth,
-       SendAndRecvPacket_AES_CM_128_HMAC_SHA1_80) {
-  bool enable_external_auth = GetParam();
-  TestSendRecvPacket(enable_external_auth, rtc::SRTP_AES128_CM_SHA1_80,
-                     kTestKey1, kTestKeyLen, kTestKey2, kTestKeyLen,
-                     rtc::CS_AES_CM_128_HMAC_SHA1_80);
-}
-
-TEST_F(SrtpTransportTest,
-       SendAndRecvPacketWithHeaderExtension_AES_CM_128_HMAC_SHA1_80) {
-  TestSendRecvEncryptedHeaderExtension(rtc::SRTP_AES128_CM_SHA1_80, kTestKey1,
-                                       kTestKeyLen, kTestKey2, kTestKeyLen,
-                                       rtc::CS_AES_CM_128_HMAC_SHA1_80);
-}
-
-TEST_P(SrtpTransportTestWithExternalAuth,
-       SendAndRecvPacket_AES_CM_128_HMAC_SHA1_32) {
-  bool enable_external_auth = GetParam();
-  TestSendRecvPacket(enable_external_auth, rtc::SRTP_AES128_CM_SHA1_32,
-                     kTestKey1, kTestKeyLen, kTestKey2, kTestKeyLen,
-                     rtc::CS_AES_CM_128_HMAC_SHA1_32);
-}
-
-TEST_F(SrtpTransportTest,
-       SendAndRecvPacketWithHeaderExtension_AES_CM_128_HMAC_SHA1_32) {
-  TestSendRecvEncryptedHeaderExtension(rtc::SRTP_AES128_CM_SHA1_32, kTestKey1,
-                                       kTestKeyLen, kTestKey2, kTestKeyLen,
-                                       rtc::CS_AES_CM_128_HMAC_SHA1_32);
-}
-
-TEST_P(SrtpTransportTestWithExternalAuth,
-       SendAndRecvPacket_SRTP_AEAD_AES_128_GCM) {
-  bool enable_external_auth = GetParam();
-  TestSendRecvPacket(enable_external_auth, rtc::SRTP_AEAD_AES_128_GCM,
-                     kTestKeyGcm128_1, kTestKeyGcm128Len, kTestKeyGcm128_2,
-                     kTestKeyGcm128Len, rtc::CS_AEAD_AES_128_GCM);
-}
-
-TEST_F(SrtpTransportTest,
-       SendAndRecvPacketWithHeaderExtension_SRTP_AEAD_AES_128_GCM) {
-  TestSendRecvEncryptedHeaderExtension(
-      rtc::SRTP_AEAD_AES_128_GCM, kTestKeyGcm128_1, kTestKeyGcm128Len,
-      kTestKeyGcm128_2, kTestKeyGcm128Len, rtc::CS_AEAD_AES_128_GCM);
-}
-
-TEST_P(SrtpTransportTestWithExternalAuth,
-       SendAndRecvPacket_SRTP_AEAD_AES_256_GCM) {
-  bool enable_external_auth = GetParam();
-  TestSendRecvPacket(enable_external_auth, rtc::SRTP_AEAD_AES_256_GCM,
-                     kTestKeyGcm256_1, kTestKeyGcm256Len, kTestKeyGcm256_2,
-                     kTestKeyGcm256Len, rtc::CS_AEAD_AES_256_GCM);
-}
-
-TEST_F(SrtpTransportTest,
-       SendAndRecvPacketWithHeaderExtension_SRTP_AEAD_AES_256_GCM) {
-  TestSendRecvEncryptedHeaderExtension(
-      rtc::SRTP_AEAD_AES_256_GCM, kTestKeyGcm256_1, kTestKeyGcm256Len,
-      kTestKeyGcm256_2, kTestKeyGcm256Len, rtc::CS_AEAD_AES_256_GCM);
-}
-
-// Run all tests both with and without external auth enabled.
-INSTANTIATE_TEST_CASE_P(ExternalAuth,
-                        SrtpTransportTestWithExternalAuth,
-                        ::testing::Values(true, false));
-
-// Test directly setting the params with bogus keys.
-TEST_F(SrtpTransportTest, TestSetParamsKeyTooShort) {
-  EXPECT_FALSE(srtp_transport1_->SetRtpParams(
-      rtc::SRTP_AES128_CM_SHA1_80, kTestKey1, kTestKeyLen - 1,
-      rtc::SRTP_AES128_CM_SHA1_80, kTestKey1, kTestKeyLen - 1));
-  EXPECT_FALSE(srtp_transport1_->SetRtcpParams(
-      rtc::SRTP_AES128_CM_SHA1_80, kTestKey1, kTestKeyLen - 1,
-      rtc::SRTP_AES128_CM_SHA1_80, kTestKey1, kTestKeyLen - 1));
-}
-
-}  // namespace webrtc
diff --git a/pc/statscollector.cc b/pc/statscollector.cc
deleted file mode 100644
index a14967a..0000000
--- a/pc/statscollector.cc
+++ /dev/null
@@ -1,1070 +0,0 @@
-/*
- *  Copyright 2012 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/pc/statscollector.h"
-
-#include <memory>
-#include <utility>
-#include <vector>
-
-#include "webrtc/pc/channel.h"
-#include "webrtc/pc/peerconnection.h"
-#include "webrtc/rtc_base/base64.h"
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-namespace {
-
-// The following is the enum RTCStatsIceCandidateType from
-// http://w3c.github.io/webrtc-stats/#rtcstatsicecandidatetype-enum such that
-// our stats report for ice candidate type could conform to that.
-const char STATSREPORT_LOCAL_PORT_TYPE[] = "host";
-const char STATSREPORT_STUN_PORT_TYPE[] = "serverreflexive";
-const char STATSREPORT_PRFLX_PORT_TYPE[] = "peerreflexive";
-const char STATSREPORT_RELAY_PORT_TYPE[] = "relayed";
-
-// Strings used by the stats collector to report adapter types. This fits the
-// general stype of http://w3c.github.io/webrtc-stats than what
-// AdapterTypeToString does.
-const char* STATSREPORT_ADAPTER_TYPE_ETHERNET = "lan";
-const char* STATSREPORT_ADAPTER_TYPE_WIFI = "wlan";
-const char* STATSREPORT_ADAPTER_TYPE_WWAN = "wwan";
-const char* STATSREPORT_ADAPTER_TYPE_VPN = "vpn";
-const char* STATSREPORT_ADAPTER_TYPE_LOOPBACK = "loopback";
-
-template<typename ValueType>
-struct TypeForAdd {
-  const StatsReport::StatsValueName name;
-  const ValueType& value;
-};
-
-typedef TypeForAdd<bool> BoolForAdd;
-typedef TypeForAdd<float> FloatForAdd;
-typedef TypeForAdd<int64_t> Int64ForAdd;
-typedef TypeForAdd<int> IntForAdd;
-
-StatsReport::Id GetTransportIdFromProxy(const ProxyTransportMap& map,
-                                        const std::string& proxy) {
-  RTC_DCHECK(!proxy.empty());
-  auto found = map.find(proxy);
-  if (found == map.end()) {
-    return StatsReport::Id();
-  }
-
-  return StatsReport::NewComponentId(
-      found->second, cricket::ICE_CANDIDATE_COMPONENT_RTP);
-}
-
-StatsReport* AddTrackReport(StatsCollection* reports,
-                            const std::string& track_id) {
-  // Adds an empty track report.
-  StatsReport::Id id(
-      StatsReport::NewTypedId(StatsReport::kStatsReportTypeTrack, track_id));
-  StatsReport* report = reports->ReplaceOrAddNew(id);
-  report->AddString(StatsReport::kStatsValueNameTrackId, track_id);
-  return report;
-}
-
-template <class TrackVector>
-void CreateTrackReports(const TrackVector& tracks, StatsCollection* reports,
-                        TrackIdMap& track_ids) {
-  for (const auto& track : tracks) {
-    const std::string& track_id = track->id();
-    StatsReport* report = AddTrackReport(reports, track_id);
-    RTC_DCHECK(report != nullptr);
-    track_ids[track_id] = report;
-  }
-}
-
-void ExtractCommonSendProperties(const cricket::MediaSenderInfo& info,
-                                 StatsReport* report) {
-  report->AddString(StatsReport::kStatsValueNameCodecName, info.codec_name);
-  report->AddInt64(StatsReport::kStatsValueNameBytesSent, info.bytes_sent);
-  if (info.rtt_ms >= 0) {
-    report->AddInt64(StatsReport::kStatsValueNameRtt, info.rtt_ms);
-  }
-}
-
-void ExtractCommonReceiveProperties(const cricket::MediaReceiverInfo& info,
-                                    StatsReport* report) {
-  report->AddString(StatsReport::kStatsValueNameCodecName, info.codec_name);
-}
-
-void SetAudioProcessingStats(StatsReport* report,
-                             bool typing_noise_detected,
-                             int echo_return_loss,
-                             int echo_return_loss_enhancement,
-                             int echo_delay_median_ms,
-                             float aec_quality_min,
-                             int echo_delay_std_ms,
-                             float residual_echo_likelihood,
-                             float residual_echo_likelihood_recent_max) {
-  report->AddBoolean(StatsReport::kStatsValueNameTypingNoiseState,
-                     typing_noise_detected);
-  if (aec_quality_min >= 0.0f) {
-    report->AddFloat(StatsReport::kStatsValueNameEchoCancellationQualityMin,
-                     aec_quality_min);
-  }
-  const IntForAdd ints[] = {
-    { StatsReport::kStatsValueNameEchoDelayMedian, echo_delay_median_ms },
-    { StatsReport::kStatsValueNameEchoDelayStdDev, echo_delay_std_ms },
-  };
-  for (const auto& i : ints) {
-    if (i.value >= 0) {
-      report->AddInt(i.name, i.value);
-    }
-  }
-  // These can take on valid negative values.
-  report->AddInt(StatsReport::kStatsValueNameEchoReturnLoss, echo_return_loss);
-  report->AddInt(StatsReport::kStatsValueNameEchoReturnLossEnhancement,
-                 echo_return_loss_enhancement);
-  if (residual_echo_likelihood >= 0.0f) {
-    report->AddFloat(StatsReport::kStatsValueNameResidualEchoLikelihood,
-                     residual_echo_likelihood);
-  }
-  if (residual_echo_likelihood_recent_max >= 0.0f) {
-    report->AddFloat(
-        StatsReport::kStatsValueNameResidualEchoLikelihoodRecentMax,
-        residual_echo_likelihood_recent_max);
-  }
-}
-
-void ExtractStats(const cricket::VoiceReceiverInfo& info, StatsReport* report) {
-  ExtractCommonReceiveProperties(info, report);
-  const FloatForAdd floats[] = {
-    { StatsReport::kStatsValueNameExpandRate, info.expand_rate },
-    { StatsReport::kStatsValueNameSecondaryDecodedRate,
-      info.secondary_decoded_rate },
-    { StatsReport::kStatsValueNameSecondaryDiscardedRate,
-      info.secondary_discarded_rate },
-    { StatsReport::kStatsValueNameSpeechExpandRate, info.speech_expand_rate },
-    { StatsReport::kStatsValueNameAccelerateRate, info.accelerate_rate },
-    { StatsReport::kStatsValueNamePreemptiveExpandRate,
-      info.preemptive_expand_rate },
-    { StatsReport::kStatsValueNameTotalAudioEnergy, info.total_output_energy },
-    { StatsReport::kStatsValueNameTotalSamplesDuration,
-      info.total_output_duration }
-  };
-
-  const IntForAdd ints[] = {
-    { StatsReport::kStatsValueNameCurrentDelayMs, info.delay_estimate_ms },
-    { StatsReport::kStatsValueNameDecodingCNG, info.decoding_cng },
-    { StatsReport::kStatsValueNameDecodingCTN, info.decoding_calls_to_neteq },
-    { StatsReport::kStatsValueNameDecodingCTSG,
-      info.decoding_calls_to_silence_generator },
-    { StatsReport::kStatsValueNameDecodingMutedOutput,
-      info.decoding_muted_output },
-    { StatsReport::kStatsValueNameDecodingNormal, info.decoding_normal },
-    { StatsReport::kStatsValueNameDecodingPLC, info.decoding_plc },
-    { StatsReport::kStatsValueNameDecodingPLCCNG, info.decoding_plc_cng },
-    { StatsReport::kStatsValueNameJitterBufferMs, info.jitter_buffer_ms },
-    { StatsReport::kStatsValueNameJitterReceived, info.jitter_ms },
-    { StatsReport::kStatsValueNamePacketsLost, info.packets_lost },
-    { StatsReport::kStatsValueNamePacketsReceived, info.packets_rcvd },
-    { StatsReport::kStatsValueNamePreferredJitterBufferMs,
-      info.jitter_buffer_preferred_ms },
-  };
-
-  for (const auto& f : floats)
-    report->AddFloat(f.name, f.value);
-
-  for (const auto& i : ints)
-    report->AddInt(i.name, i.value);
-  if (info.audio_level >= 0) {
-    report->AddInt(StatsReport::kStatsValueNameAudioOutputLevel,
-                   info.audio_level);
-  }
-
-  report->AddInt64(StatsReport::kStatsValueNameBytesReceived,
-                   info.bytes_rcvd);
-  if (info.capture_start_ntp_time_ms >= 0) {
-    report->AddInt64(StatsReport::kStatsValueNameCaptureStartNtpTimeMs,
-                     info.capture_start_ntp_time_ms);
-  }
-  report->AddString(StatsReport::kStatsValueNameMediaType, "audio");
-}
-
-void ExtractStats(const cricket::VoiceSenderInfo& info, StatsReport* report) {
-  ExtractCommonSendProperties(info, report);
-
-  SetAudioProcessingStats(
-      report, info.typing_noise_detected, info.echo_return_loss,
-      info.echo_return_loss_enhancement, info.echo_delay_median_ms,
-      info.aec_quality_min, info.echo_delay_std_ms,
-      info.residual_echo_likelihood, info.residual_echo_likelihood_recent_max);
-
-  const FloatForAdd floats[] = {
-    { StatsReport::kStatsValueNameTotalAudioEnergy, info.total_input_energy },
-    { StatsReport::kStatsValueNameTotalSamplesDuration,
-      info.total_input_duration }
-  };
-
-  RTC_DCHECK_GE(info.audio_level, 0);
-  const IntForAdd ints[] = {
-    { StatsReport::kStatsValueNameAudioInputLevel, info.audio_level},
-    { StatsReport::kStatsValueNameJitterReceived, info.jitter_ms },
-    { StatsReport::kStatsValueNamePacketsLost, info.packets_lost },
-    { StatsReport::kStatsValueNamePacketsSent, info.packets_sent },
-  };
-
-  for (const auto& f : floats) {
-    report->AddFloat(f.name, f.value);
-  }
-
-  for (const auto& i : ints) {
-    if (i.value >= 0) {
-      report->AddInt(i.name, i.value);
-    }
-  }
-  report->AddString(StatsReport::kStatsValueNameMediaType, "audio");
-  if (info.ana_statistics.bitrate_action_counter) {
-    report->AddInt(StatsReport::kStatsValueNameAnaBitrateActionCounter,
-                   *info.ana_statistics.bitrate_action_counter);
-  }
-  if (info.ana_statistics.channel_action_counter) {
-    report->AddInt(StatsReport::kStatsValueNameAnaChannelActionCounter,
-                   *info.ana_statistics.channel_action_counter);
-  }
-  if (info.ana_statistics.dtx_action_counter) {
-    report->AddInt(StatsReport::kStatsValueNameAnaDtxActionCounter,
-                   *info.ana_statistics.dtx_action_counter);
-  }
-  if (info.ana_statistics.fec_action_counter) {
-    report->AddInt(StatsReport::kStatsValueNameAnaFecActionCounter,
-                   *info.ana_statistics.fec_action_counter);
-  }
-  if (info.ana_statistics.frame_length_increase_counter) {
-    report->AddInt(StatsReport::kStatsValueNameAnaFrameLengthIncreaseCounter,
-                   *info.ana_statistics.frame_length_increase_counter);
-  }
-  if (info.ana_statistics.frame_length_decrease_counter) {
-    report->AddInt(StatsReport::kStatsValueNameAnaFrameLengthDecreaseCounter,
-                   *info.ana_statistics.frame_length_decrease_counter);
-  }
-  if (info.ana_statistics.uplink_packet_loss_fraction) {
-    report->AddFloat(StatsReport::kStatsValueNameAnaUplinkPacketLossFraction,
-                     *info.ana_statistics.uplink_packet_loss_fraction);
-  }
-}
-
-void ExtractStats(const cricket::VideoReceiverInfo& info, StatsReport* report) {
-  ExtractCommonReceiveProperties(info, report);
-  report->AddString(StatsReport::kStatsValueNameCodecImplementationName,
-                    info.decoder_implementation_name);
-  report->AddInt64(StatsReport::kStatsValueNameBytesReceived,
-                   info.bytes_rcvd);
-  if (info.capture_start_ntp_time_ms >= 0) {
-    report->AddInt64(StatsReport::kStatsValueNameCaptureStartNtpTimeMs,
-                     info.capture_start_ntp_time_ms);
-  }
-  if (info.qp_sum)
-    report->AddInt64(StatsReport::kStatsValueNameQpSum, *info.qp_sum);
-
-  const IntForAdd ints[] = {
-    { StatsReport::kStatsValueNameCurrentDelayMs, info.current_delay_ms },
-    { StatsReport::kStatsValueNameDecodeMs, info.decode_ms },
-    { StatsReport::kStatsValueNameFirsSent, info.firs_sent },
-    { StatsReport::kStatsValueNameFrameHeightReceived, info.frame_height },
-    { StatsReport::kStatsValueNameFrameRateDecoded, info.framerate_decoded },
-    { StatsReport::kStatsValueNameFrameRateOutput, info.framerate_output },
-    { StatsReport::kStatsValueNameFrameRateReceived, info.framerate_rcvd },
-    { StatsReport::kStatsValueNameFrameWidthReceived, info.frame_width },
-    { StatsReport::kStatsValueNameJitterBufferMs, info.jitter_buffer_ms },
-    { StatsReport::kStatsValueNameMaxDecodeMs, info.max_decode_ms },
-    { StatsReport::kStatsValueNameMinPlayoutDelayMs,
-      info.min_playout_delay_ms },
-    { StatsReport::kStatsValueNameNacksSent, info.nacks_sent },
-    { StatsReport::kStatsValueNamePacketsLost, info.packets_lost },
-    { StatsReport::kStatsValueNamePacketsReceived, info.packets_rcvd },
-    { StatsReport::kStatsValueNamePlisSent, info.plis_sent },
-    { StatsReport::kStatsValueNameRenderDelayMs, info.render_delay_ms },
-    { StatsReport::kStatsValueNameTargetDelayMs, info.target_delay_ms },
-    { StatsReport::kStatsValueNameFramesDecoded, info.frames_decoded },
-  };
-
-  for (const auto& i : ints)
-    report->AddInt(i.name, i.value);
-  report->AddString(StatsReport::kStatsValueNameMediaType, "video");
-
-  if (info.timing_frame_info) {
-    report->AddString(StatsReport::kStatsValueNameTimingFrameInfo,
-                      info.timing_frame_info->ToString());
-  }
-
-  report->AddInt64(StatsReport::kStatsValueNameInterframeDelayMaxMs,
-                   info.interframe_delay_max_ms);
-
-  report->AddString(
-      StatsReport::kStatsValueNameContentType,
-      webrtc::videocontenttypehelpers::ToString(info.content_type));
-}
-
-void ExtractStats(const cricket::VideoSenderInfo& info, StatsReport* report) {
-  ExtractCommonSendProperties(info, report);
-
-  report->AddString(StatsReport::kStatsValueNameCodecImplementationName,
-                    info.encoder_implementation_name);
-  report->AddBoolean(StatsReport::kStatsValueNameBandwidthLimitedResolution,
-                     (info.adapt_reason & 0x2) > 0);
-  report->AddBoolean(StatsReport::kStatsValueNameCpuLimitedResolution,
-                     (info.adapt_reason & 0x1) > 0);
-  if (info.qp_sum)
-    report->AddInt(StatsReport::kStatsValueNameQpSum, *info.qp_sum);
-
-  const IntForAdd ints[] = {
-    { StatsReport::kStatsValueNameAdaptationChanges, info.adapt_changes },
-    { StatsReport::kStatsValueNameAvgEncodeMs, info.avg_encode_ms },
-    { StatsReport::kStatsValueNameEncodeUsagePercent,
-      info.encode_usage_percent },
-    { StatsReport::kStatsValueNameFirsReceived, info.firs_rcvd },
-    { StatsReport::kStatsValueNameFrameHeightSent, info.send_frame_height },
-    { StatsReport::kStatsValueNameFrameRateInput, info.framerate_input },
-    { StatsReport::kStatsValueNameFrameRateSent, info.framerate_sent },
-    { StatsReport::kStatsValueNameFrameWidthSent, info.send_frame_width },
-    { StatsReport::kStatsValueNameNacksReceived, info.nacks_rcvd },
-    { StatsReport::kStatsValueNamePacketsLost, info.packets_lost },
-    { StatsReport::kStatsValueNamePacketsSent, info.packets_sent },
-    { StatsReport::kStatsValueNamePlisReceived, info.plis_rcvd },
-    { StatsReport::kStatsValueNameFramesEncoded, info.frames_encoded },
-  };
-
-  for (const auto& i : ints)
-    report->AddInt(i.name, i.value);
-  report->AddString(StatsReport::kStatsValueNameMediaType, "video");
-  report->AddString(
-      StatsReport::kStatsValueNameContentType,
-      webrtc::videocontenttypehelpers::ToString(info.content_type));
-}
-
-void ExtractStats(const cricket::BandwidthEstimationInfo& info,
-                  double stats_gathering_started,
-                  StatsReport* report) {
-  RTC_DCHECK(report->type() == StatsReport::kStatsReportTypeBwe);
-
-  report->set_timestamp(stats_gathering_started);
-  const IntForAdd ints[] = {
-    { StatsReport::kStatsValueNameAvailableSendBandwidth,
-      info.available_send_bandwidth },
-    { StatsReport::kStatsValueNameAvailableReceiveBandwidth,
-      info.available_recv_bandwidth },
-    { StatsReport::kStatsValueNameTargetEncBitrate, info.target_enc_bitrate },
-    { StatsReport::kStatsValueNameActualEncBitrate, info.actual_enc_bitrate },
-    { StatsReport::kStatsValueNameRetransmitBitrate, info.retransmit_bitrate },
-    { StatsReport::kStatsValueNameTransmitBitrate, info.transmit_bitrate },
-  };
-  for (const auto& i : ints)
-    report->AddInt(i.name, i.value);
-  report->AddInt64(StatsReport::kStatsValueNameBucketDelay, info.bucket_delay);
-}
-
-void ExtractRemoteStats(const cricket::MediaSenderInfo& info,
-                        StatsReport* report) {
-  report->set_timestamp(info.remote_stats[0].timestamp);
-  // TODO(hta): Extract some stats here.
-}
-
-void ExtractRemoteStats(const cricket::MediaReceiverInfo& info,
-                        StatsReport* report) {
-  report->set_timestamp(info.remote_stats[0].timestamp);
-  // TODO(hta): Extract some stats here.
-}
-
-// Template to extract stats from a data vector.
-// In order to use the template, the functions that are called from it,
-// ExtractStats and ExtractRemoteStats, must be defined and overloaded
-// for each type.
-template<typename T>
-void ExtractStatsFromList(const std::vector<T>& data,
-                          const StatsReport::Id& transport_id,
-                          StatsCollector* collector,
-                          StatsReport::Direction direction) {
-  for (const auto& d : data) {
-    uint32_t ssrc = d.ssrc();
-    // Each track can have stats for both local and remote objects.
-    // TODO(hta): Handle the case of multiple SSRCs per object.
-    StatsReport* report = collector->PrepareReport(true, ssrc, transport_id,
-                                                   direction);
-    if (report)
-      ExtractStats(d, report);
-
-    if (!d.remote_stats.empty()) {
-      report = collector->PrepareReport(false, ssrc, transport_id, direction);
-      if (report)
-        ExtractRemoteStats(d, report);
-    }
-  }
-}
-
-}  // namespace
-
-const char* IceCandidateTypeToStatsType(const std::string& candidate_type) {
-  if (candidate_type == cricket::LOCAL_PORT_TYPE) {
-    return STATSREPORT_LOCAL_PORT_TYPE;
-  }
-  if (candidate_type == cricket::STUN_PORT_TYPE) {
-    return STATSREPORT_STUN_PORT_TYPE;
-  }
-  if (candidate_type == cricket::PRFLX_PORT_TYPE) {
-    return STATSREPORT_PRFLX_PORT_TYPE;
-  }
-  if (candidate_type == cricket::RELAY_PORT_TYPE) {
-    return STATSREPORT_RELAY_PORT_TYPE;
-  }
-  RTC_NOTREACHED();
-  return "unknown";
-}
-
-const char* AdapterTypeToStatsType(rtc::AdapterType type) {
-  switch (type) {
-    case rtc::ADAPTER_TYPE_UNKNOWN:
-      return "unknown";
-    case rtc::ADAPTER_TYPE_ETHERNET:
-      return STATSREPORT_ADAPTER_TYPE_ETHERNET;
-    case rtc::ADAPTER_TYPE_WIFI:
-      return STATSREPORT_ADAPTER_TYPE_WIFI;
-    case rtc::ADAPTER_TYPE_CELLULAR:
-      return STATSREPORT_ADAPTER_TYPE_WWAN;
-    case rtc::ADAPTER_TYPE_VPN:
-      return STATSREPORT_ADAPTER_TYPE_VPN;
-    case rtc::ADAPTER_TYPE_LOOPBACK:
-      return STATSREPORT_ADAPTER_TYPE_LOOPBACK;
-    default:
-      RTC_NOTREACHED();
-      return "";
-  }
-}
-
-StatsCollector::StatsCollector(PeerConnection* pc)
-    : pc_(pc), stats_gathering_started_(0) {
-  RTC_DCHECK(pc_);
-}
-
-StatsCollector::~StatsCollector() {
-  RTC_DCHECK(pc_->session()->signaling_thread()->IsCurrent());
-}
-
-// Wallclock time in ms.
-double StatsCollector::GetTimeNow() {
-  return rtc::TimeUTCMicros() /
-         static_cast<double>(rtc::kNumMicrosecsPerMillisec);
-}
-
-// Adds a MediaStream with tracks that can be used as a |selector| in a call
-// to GetStats.
-void StatsCollector::AddStream(MediaStreamInterface* stream) {
-  RTC_DCHECK(pc_->session()->signaling_thread()->IsCurrent());
-  RTC_DCHECK(stream != NULL);
-
-  CreateTrackReports<AudioTrackVector>(stream->GetAudioTracks(),
-                                       &reports_, track_ids_);
-  CreateTrackReports<VideoTrackVector>(stream->GetVideoTracks(),
-                                       &reports_, track_ids_);
-}
-
-void StatsCollector::AddLocalAudioTrack(AudioTrackInterface* audio_track,
-                                        uint32_t ssrc) {
-  RTC_DCHECK(pc_->session()->signaling_thread()->IsCurrent());
-  RTC_DCHECK(audio_track != NULL);
-#if RTC_DCHECK_IS_ON
-  for (const auto& track : local_audio_tracks_)
-    RTC_DCHECK(track.first != audio_track || track.second != ssrc);
-#endif
-
-  local_audio_tracks_.push_back(std::make_pair(audio_track, ssrc));
-
-  // Create the kStatsReportTypeTrack report for the new track if there is no
-  // report yet.
-  StatsReport::Id id(StatsReport::NewTypedId(StatsReport::kStatsReportTypeTrack,
-                                             audio_track->id()));
-  StatsReport* report = reports_.Find(id);
-  if (!report) {
-    report = reports_.InsertNew(id);
-    report->AddString(StatsReport::kStatsValueNameTrackId, audio_track->id());
-  }
-}
-
-void StatsCollector::RemoveLocalAudioTrack(AudioTrackInterface* audio_track,
-                                           uint32_t ssrc) {
-  RTC_DCHECK(audio_track != NULL);
-  local_audio_tracks_.erase(
-      std::remove_if(
-          local_audio_tracks_.begin(), local_audio_tracks_.end(),
-          [audio_track, ssrc](const LocalAudioTrackVector::value_type& track) {
-            return track.first == audio_track && track.second == ssrc;
-          }),
-      local_audio_tracks_.end());
-}
-
-void StatsCollector::GetStats(MediaStreamTrackInterface* track,
-                              StatsReports* reports) {
-  RTC_DCHECK(pc_->session()->signaling_thread()->IsCurrent());
-  RTC_DCHECK(reports != NULL);
-  RTC_DCHECK(reports->empty());
-
-  rtc::Thread::ScopedDisallowBlockingCalls no_blocking_calls;
-
-  if (!track) {
-    reports->reserve(reports_.size());
-    for (auto* r : reports_)
-      reports->push_back(r);
-    return;
-  }
-
-  StatsReport* report = reports_.Find(StatsReport::NewTypedId(
-      StatsReport::kStatsReportTypeSession, pc_->session()->id()));
-  if (report)
-    reports->push_back(report);
-
-  report = reports_.Find(StatsReport::NewTypedId(
-      StatsReport::kStatsReportTypeTrack, track->id()));
-
-  if (!report)
-    return;
-
-  reports->push_back(report);
-
-  std::string track_id;
-  for (const auto* r : reports_) {
-    if (r->type() != StatsReport::kStatsReportTypeSsrc)
-      continue;
-
-    const StatsReport::Value* v =
-        r->FindValue(StatsReport::kStatsValueNameTrackId);
-    if (v && v->string_val() == track->id())
-      reports->push_back(r);
-  }
-}
-
-void
-StatsCollector::UpdateStats(PeerConnectionInterface::StatsOutputLevel level) {
-  RTC_DCHECK(pc_->session()->signaling_thread()->IsCurrent());
-  double time_now = GetTimeNow();
-  // Calls to UpdateStats() that occur less than kMinGatherStatsPeriod number of
-  // ms apart will be ignored.
-  const double kMinGatherStatsPeriod = 50;
-  if (stats_gathering_started_ != 0 &&
-      stats_gathering_started_ + kMinGatherStatsPeriod > time_now) {
-    return;
-  }
-  stats_gathering_started_ = time_now;
-
-  // TODO(pthatcher): Merge PeerConnection and WebRtcSession so there is no
-  // pc_->session().
-  if (pc_->session()) {
-    // TODO(tommi): All of these hop over to the worker thread to fetch
-    // information.  We could use an AsyncInvoker to run all of these and post
-    // the information back to the signaling thread where we can create and
-    // update stats reports.  That would also clean up the threading story a bit
-    // since we'd be creating/updating the stats report objects consistently on
-    // the same thread (this class has no locks right now).
-    ExtractSessionInfo();
-    ExtractBweInfo();
-    ExtractVoiceInfo();
-    ExtractVideoInfo(level);
-    ExtractSenderInfo();
-    ExtractDataInfo();
-    UpdateTrackReports();
-  }
-}
-
-StatsReport* StatsCollector::PrepareReport(
-    bool local,
-    uint32_t ssrc,
-    const StatsReport::Id& transport_id,
-    StatsReport::Direction direction) {
-  RTC_DCHECK(pc_->session()->signaling_thread()->IsCurrent());
-  StatsReport::Id id(StatsReport::NewIdWithDirection(
-      local ? StatsReport::kStatsReportTypeSsrc
-            : StatsReport::kStatsReportTypeRemoteSsrc,
-      rtc::ToString<uint32_t>(ssrc), direction));
-  StatsReport* report = reports_.Find(id);
-
-  // Use the ID of the track that is currently mapped to the SSRC, if any.
-  std::string track_id;
-  if (!GetTrackIdBySsrc(ssrc, &track_id, direction)) {
-    if (!report) {
-      // The ssrc is not used by any track or existing report, return NULL
-      // in such case to indicate no report is prepared for the ssrc.
-      return NULL;
-    }
-
-    // The ssrc is not used by any existing track. Keeps the old track id
-    // since we want to report the stats for inactive ssrc.
-    const StatsReport::Value* v =
-        report->FindValue(StatsReport::kStatsValueNameTrackId);
-    if (v)
-      track_id = v->string_val();
-  }
-
-  if (!report)
-    report = reports_.InsertNew(id);
-
-  // FYI - for remote reports, the timestamp will be overwritten later.
-  report->set_timestamp(stats_gathering_started_);
-
-  report->AddInt64(StatsReport::kStatsValueNameSsrc, ssrc);
-  report->AddString(StatsReport::kStatsValueNameTrackId, track_id);
-  // Add the mapping of SSRC to transport.
-  report->AddId(StatsReport::kStatsValueNameTransportId, transport_id);
-  return report;
-}
-
-bool StatsCollector::IsValidTrack(const std::string& track_id) {
-  return reports_.Find(StatsReport::NewTypedId(
-             StatsReport::kStatsReportTypeTrack, track_id)) != nullptr;
-}
-
-StatsReport* StatsCollector::AddCertificateReports(
-    const rtc::SSLCertificate* cert) {
-  RTC_DCHECK(pc_->session()->signaling_thread()->IsCurrent());
-  RTC_DCHECK(cert != NULL);
-
-  std::unique_ptr<rtc::SSLCertificateStats> first_stats = cert->GetStats();
-  StatsReport* first_report = nullptr;
-  StatsReport* prev_report = nullptr;
-  for (rtc::SSLCertificateStats* stats = first_stats.get(); stats;
-       stats = stats->issuer.get()) {
-    StatsReport::Id id(StatsReport::NewTypedId(
-        StatsReport::kStatsReportTypeCertificate, stats->fingerprint));
-
-    StatsReport* report = reports_.ReplaceOrAddNew(id);
-    report->set_timestamp(stats_gathering_started_);
-    report->AddString(StatsReport::kStatsValueNameFingerprint,
-                      stats->fingerprint);
-    report->AddString(StatsReport::kStatsValueNameFingerprintAlgorithm,
-                      stats->fingerprint_algorithm);
-    report->AddString(StatsReport::kStatsValueNameDer,
-                      stats->base64_certificate);
-    if (!first_report)
-      first_report = report;
-    else
-      prev_report->AddId(StatsReport::kStatsValueNameIssuerId, id);
-    prev_report = report;
-  }
-  return first_report;
-}
-
-StatsReport* StatsCollector::AddConnectionInfoReport(
-    const std::string& content_name, int component, int connection_id,
-    const StatsReport::Id& channel_report_id,
-    const cricket::ConnectionInfo& info) {
-  StatsReport::Id id(StatsReport::NewCandidatePairId(content_name, component,
-                                                     connection_id));
-  StatsReport* report = reports_.ReplaceOrAddNew(id);
-  report->set_timestamp(stats_gathering_started_);
-
-  const BoolForAdd bools[] = {
-    {StatsReport::kStatsValueNameActiveConnection, info.best_connection},
-    {StatsReport::kStatsValueNameReceiving, info.receiving},
-    {StatsReport::kStatsValueNameWritable, info.writable},
-  };
-  for (const auto& b : bools)
-    report->AddBoolean(b.name, b.value);
-
-  report->AddId(StatsReport::kStatsValueNameChannelId, channel_report_id);
-  report->AddId(StatsReport::kStatsValueNameLocalCandidateId,
-                AddCandidateReport(info.local_candidate, true)->id());
-  report->AddId(StatsReport::kStatsValueNameRemoteCandidateId,
-                AddCandidateReport(info.remote_candidate, false)->id());
-
-  const Int64ForAdd int64s[] = {
-      {StatsReport::kStatsValueNameBytesReceived, info.recv_total_bytes},
-      {StatsReport::kStatsValueNameBytesSent, info.sent_total_bytes},
-      {StatsReport::kStatsValueNamePacketsSent, info.sent_total_packets},
-      {StatsReport::kStatsValueNameRtt, info.rtt},
-      {StatsReport::kStatsValueNameSendPacketsDiscarded,
-       info.sent_discarded_packets},
-      {StatsReport::kStatsValueNameSentPingRequestsTotal,
-       info.sent_ping_requests_total},
-      {StatsReport::kStatsValueNameSentPingRequestsBeforeFirstResponse,
-       info.sent_ping_requests_before_first_response},
-      {StatsReport::kStatsValueNameSentPingResponses, info.sent_ping_responses},
-      {StatsReport::kStatsValueNameRecvPingRequests, info.recv_ping_requests},
-      {StatsReport::kStatsValueNameRecvPingResponses, info.recv_ping_responses},
-  };
-  for (const auto& i : int64s)
-    report->AddInt64(i.name, i.value);
-
-  report->AddString(StatsReport::kStatsValueNameLocalAddress,
-                    info.local_candidate.address().ToString());
-  report->AddString(StatsReport::kStatsValueNameLocalCandidateType,
-                    info.local_candidate.type());
-  report->AddString(StatsReport::kStatsValueNameRemoteAddress,
-                    info.remote_candidate.address().ToString());
-  report->AddString(StatsReport::kStatsValueNameRemoteCandidateType,
-                    info.remote_candidate.type());
-  report->AddString(StatsReport::kStatsValueNameTransportType,
-                    info.local_candidate.protocol());
-
-  return report;
-}
-
-StatsReport* StatsCollector::AddCandidateReport(
-    const cricket::Candidate& candidate,
-    bool local) {
-  StatsReport::Id id(StatsReport::NewCandidateId(local, candidate.id()));
-  StatsReport* report = reports_.Find(id);
-  if (!report) {
-    report = reports_.InsertNew(id);
-    report->set_timestamp(stats_gathering_started_);
-    if (local) {
-      report->AddString(StatsReport::kStatsValueNameCandidateNetworkType,
-                        AdapterTypeToStatsType(candidate.network_type()));
-    }
-    report->AddString(StatsReport::kStatsValueNameCandidateIPAddress,
-                      candidate.address().ipaddr().ToString());
-    report->AddString(StatsReport::kStatsValueNameCandidatePortNumber,
-                      candidate.address().PortAsString());
-    report->AddInt(StatsReport::kStatsValueNameCandidatePriority,
-                   candidate.priority());
-    report->AddString(StatsReport::kStatsValueNameCandidateType,
-                      IceCandidateTypeToStatsType(candidate.type()));
-    report->AddString(StatsReport::kStatsValueNameCandidateTransportType,
-                      candidate.protocol());
-  }
-
-  return report;
-}
-
-void StatsCollector::ExtractSessionInfo() {
-  RTC_DCHECK(pc_->session()->signaling_thread()->IsCurrent());
-
-  // Extract information from the base session.
-  StatsReport::Id id(StatsReport::NewTypedId(
-      StatsReport::kStatsReportTypeSession, pc_->session()->id()));
-  StatsReport* report = reports_.ReplaceOrAddNew(id);
-  report->set_timestamp(stats_gathering_started_);
-  report->AddBoolean(StatsReport::kStatsValueNameInitiator,
-                     pc_->session()->initial_offerer());
-
-  std::unique_ptr<SessionStats> stats = pc_->session()->GetStats_s();
-  if (!stats) {
-    return;
-  }
-
-  // Store the proxy map away for use in SSRC reporting.
-  // TODO(tommi): This shouldn't be necessary if we post the stats back to the
-  // signaling thread after fetching them on the worker thread, then just use
-  // the proxy map directly from the session stats.
-  // As is, if GetStats() failed, we could be using old (incorrect?) proxy
-  // data.
-  proxy_to_transport_ = stats->proxy_to_transport;
-
-  for (const auto& transport_iter : stats->transport_stats) {
-    // Attempt to get a copy of the certificates from the transport and
-    // expose them in stats reports.  All channels in a transport share the
-    // same local and remote certificates.
-    //
-    StatsReport::Id local_cert_report_id, remote_cert_report_id;
-    rtc::scoped_refptr<rtc::RTCCertificate> certificate;
-    if (pc_->session()->GetLocalCertificate(
-            transport_iter.second.transport_name, &certificate)) {
-      StatsReport* r = AddCertificateReports(&(certificate->ssl_certificate()));
-      if (r)
-        local_cert_report_id = r->id();
-    }
-
-    std::unique_ptr<rtc::SSLCertificate> cert =
-        pc_->session()->GetRemoteSSLCertificate(
-            transport_iter.second.transport_name);
-    if (cert) {
-      StatsReport* r = AddCertificateReports(cert.get());
-      if (r)
-        remote_cert_report_id = r->id();
-    }
-
-    for (const auto& channel_iter : transport_iter.second.channel_stats) {
-      StatsReport::Id id(StatsReport::NewComponentId(
-          transport_iter.second.transport_name, channel_iter.component));
-      StatsReport* channel_report = reports_.ReplaceOrAddNew(id);
-      channel_report->set_timestamp(stats_gathering_started_);
-      channel_report->AddInt(StatsReport::kStatsValueNameComponent,
-                             channel_iter.component);
-      if (local_cert_report_id.get()) {
-        channel_report->AddId(StatsReport::kStatsValueNameLocalCertificateId,
-                              local_cert_report_id);
-      }
-      if (remote_cert_report_id.get()) {
-        channel_report->AddId(StatsReport::kStatsValueNameRemoteCertificateId,
-                              remote_cert_report_id);
-      }
-      int srtp_crypto_suite = channel_iter.srtp_crypto_suite;
-      if (srtp_crypto_suite != rtc::SRTP_INVALID_CRYPTO_SUITE &&
-          rtc::SrtpCryptoSuiteToName(srtp_crypto_suite).length()) {
-        channel_report->AddString(
-            StatsReport::kStatsValueNameSrtpCipher,
-            rtc::SrtpCryptoSuiteToName(srtp_crypto_suite));
-      }
-      int ssl_cipher_suite = channel_iter.ssl_cipher_suite;
-      if (ssl_cipher_suite != rtc::TLS_NULL_WITH_NULL_NULL &&
-          rtc::SSLStreamAdapter::SslCipherSuiteToName(ssl_cipher_suite)
-              .length()) {
-        channel_report->AddString(
-            StatsReport::kStatsValueNameDtlsCipher,
-            rtc::SSLStreamAdapter::SslCipherSuiteToName(ssl_cipher_suite));
-      }
-
-      int connection_id = 0;
-      for (const cricket::ConnectionInfo& info :
-               channel_iter.connection_infos) {
-        StatsReport* connection_report = AddConnectionInfoReport(
-            transport_iter.first, channel_iter.component, connection_id++,
-            channel_report->id(), info);
-        if (info.best_connection) {
-          channel_report->AddId(
-              StatsReport::kStatsValueNameSelectedCandidatePairId,
-              connection_report->id());
-        }
-      }
-    }
-  }
-}
-
-void StatsCollector::ExtractBweInfo() {
-  RTC_DCHECK(pc_->session()->signaling_thread()->IsCurrent());
-
-  if (pc_->session()->state() == WebRtcSession::State::STATE_CLOSED)
-    return;
-
-  webrtc::Call::Stats call_stats = pc_->session()->GetCallStats();
-  cricket::BandwidthEstimationInfo bwe_info;
-  bwe_info.available_send_bandwidth = call_stats.send_bandwidth_bps;
-  bwe_info.available_recv_bandwidth = call_stats.recv_bandwidth_bps;
-  bwe_info.bucket_delay = call_stats.pacer_delay_ms;
-  // Fill in target encoder bitrate, actual encoder bitrate, rtx bitrate, etc.
-  // TODO(holmer): Also fill this in for audio.
-  if (pc_->session()->video_channel()) {
-    pc_->session()->video_channel()->FillBitrateInfo(&bwe_info);
-  }
-  StatsReport::Id report_id(StatsReport::NewBandwidthEstimationId());
-  StatsReport* report = reports_.FindOrAddNew(report_id);
-  ExtractStats(bwe_info, stats_gathering_started_, report);
-}
-
-void StatsCollector::ExtractVoiceInfo() {
-  RTC_DCHECK(pc_->session()->signaling_thread()->IsCurrent());
-
-  if (!pc_->session()->voice_channel()) {
-    return;
-  }
-  cricket::VoiceMediaInfo voice_info;
-  if (!pc_->session()->voice_channel()->GetStats(&voice_info)) {
-    LOG(LS_ERROR) << "Failed to get voice channel stats.";
-    return;
-  }
-
-  // TODO(tommi): The above code should run on the worker thread and post the
-  // results back to the signaling thread, where we can add data to the reports.
-  rtc::Thread::ScopedDisallowBlockingCalls no_blocking_calls;
-
-  StatsReport::Id transport_id(GetTransportIdFromProxy(
-      proxy_to_transport_, pc_->session()->voice_channel()->content_name()));
-  if (!transport_id.get()) {
-    LOG(LS_ERROR) << "Failed to get transport name for proxy "
-                  << pc_->session()->voice_channel()->content_name();
-    return;
-  }
-
-  ExtractStatsFromList(voice_info.receivers, transport_id, this,
-      StatsReport::kReceive);
-  ExtractStatsFromList(voice_info.senders, transport_id, this,
-      StatsReport::kSend);
-
-  UpdateStatsFromExistingLocalAudioTracks();
-}
-
-void StatsCollector::ExtractVideoInfo(
-    PeerConnectionInterface::StatsOutputLevel level) {
-  RTC_DCHECK(pc_->session()->signaling_thread()->IsCurrent());
-
-  if (!pc_->session()->video_channel())
-    return;
-
-  cricket::VideoMediaInfo video_info;
-  if (!pc_->session()->video_channel()->GetStats(&video_info)) {
-    LOG(LS_ERROR) << "Failed to get video channel stats.";
-    return;
-  }
-
-  // TODO(tommi): The above code should run on the worker thread and post the
-  // results back to the signaling thread, where we can add data to the reports.
-  rtc::Thread::ScopedDisallowBlockingCalls no_blocking_calls;
-
-  StatsReport::Id transport_id(GetTransportIdFromProxy(
-      proxy_to_transport_, pc_->session()->video_channel()->content_name()));
-  if (!transport_id.get()) {
-    LOG(LS_ERROR) << "Failed to get transport name for proxy "
-                  << pc_->session()->video_channel()->content_name();
-    return;
-  }
-  ExtractStatsFromList(video_info.receivers, transport_id, this,
-      StatsReport::kReceive);
-  ExtractStatsFromList(video_info.senders, transport_id, this,
-      StatsReport::kSend);
-}
-
-void StatsCollector::ExtractSenderInfo() {
-  RTC_DCHECK(pc_->session()->signaling_thread()->IsCurrent());
-
-  for (const auto& sender : pc_->GetSenders()) {
-    // TODO(nisse): SSRC == 0 currently means none. Delete check when
-    // that is fixed.
-    if (!sender->ssrc()) {
-      continue;
-    }
-    const rtc::scoped_refptr<MediaStreamTrackInterface> track(sender->track());
-    if (!track || track->kind() != MediaStreamTrackInterface::kVideoKind) {
-      continue;
-    }
-    // Safe, because kind() == kVideoKind implies a subclass of
-    // VideoTrackInterface; see mediastreaminterface.h.
-    VideoTrackSourceInterface* source =
-        static_cast<VideoTrackInterface*>(track.get())->GetSource();
-
-    VideoTrackSourceInterface::Stats stats;
-    if (!source->GetStats(&stats)) {
-      continue;
-    }
-    const StatsReport::Id stats_id = StatsReport::NewIdWithDirection(
-        StatsReport::kStatsReportTypeSsrc,
-        rtc::ToString<uint32_t>(sender->ssrc()), StatsReport::kSend);
-    StatsReport* report = reports_.FindOrAddNew(stats_id);
-    report->AddInt(StatsReport::kStatsValueNameFrameWidthInput,
-                   stats.input_width);
-    report->AddInt(StatsReport::kStatsValueNameFrameHeightInput,
-                   stats.input_height);
-  }
-}
-
-void StatsCollector::ExtractDataInfo() {
-  RTC_DCHECK(pc_->session()->signaling_thread()->IsCurrent());
-
-  rtc::Thread::ScopedDisallowBlockingCalls no_blocking_calls;
-
-  for (const auto& dc : pc_->sctp_data_channels()) {
-    StatsReport::Id id(StatsReport::NewTypedIntId(
-        StatsReport::kStatsReportTypeDataChannel, dc->id()));
-    StatsReport* report = reports_.ReplaceOrAddNew(id);
-    report->set_timestamp(stats_gathering_started_);
-    report->AddString(StatsReport::kStatsValueNameLabel, dc->label());
-    // Filter out the initial id (-1).
-    if (dc->id() >= 0) {
-      report->AddInt(StatsReport::kStatsValueNameDataChannelId, dc->id());
-    }
-    report->AddString(StatsReport::kStatsValueNameProtocol, dc->protocol());
-    report->AddString(StatsReport::kStatsValueNameState,
-                      DataChannelInterface::DataStateString(dc->state()));
-  }
-}
-
-StatsReport* StatsCollector::GetReport(const StatsReport::StatsType& type,
-                                       const std::string& id,
-                                       StatsReport::Direction direction) {
-  RTC_DCHECK(pc_->session()->signaling_thread()->IsCurrent());
-  RTC_DCHECK(type == StatsReport::kStatsReportTypeSsrc ||
-             type == StatsReport::kStatsReportTypeRemoteSsrc);
-  return reports_.Find(StatsReport::NewIdWithDirection(type, id, direction));
-}
-
-void StatsCollector::UpdateStatsFromExistingLocalAudioTracks() {
-  RTC_DCHECK(pc_->session()->signaling_thread()->IsCurrent());
-  // Loop through the existing local audio tracks.
-  for (const auto& it : local_audio_tracks_) {
-    AudioTrackInterface* track = it.first;
-    uint32_t ssrc = it.second;
-    StatsReport* report =
-        GetReport(StatsReport::kStatsReportTypeSsrc,
-                  rtc::ToString<uint32_t>(ssrc), StatsReport::kSend);
-    if (report == NULL) {
-      // This can happen if a local audio track is added to a stream on the
-      // fly and the report has not been set up yet. Do nothing in this case.
-      LOG(LS_ERROR) << "Stats report does not exist for ssrc " << ssrc;
-      continue;
-    }
-
-    // The same ssrc can be used by both local and remote audio tracks.
-    const StatsReport::Value* v =
-        report->FindValue(StatsReport::kStatsValueNameTrackId);
-    if (!v || v->string_val() != track->id())
-      continue;
-
-    report->set_timestamp(stats_gathering_started_);
-    UpdateReportFromAudioTrack(track, report);
-  }
-}
-
-void StatsCollector::UpdateReportFromAudioTrack(AudioTrackInterface* track,
-                                                StatsReport* report) {
-  RTC_DCHECK(pc_->session()->signaling_thread()->IsCurrent());
-  RTC_DCHECK(track != NULL);
-
-  // Don't overwrite report values if they're not available.
-  int signal_level;
-  if (track->GetSignalLevel(&signal_level)) {
-    RTC_DCHECK_GE(signal_level, 0);
-    report->AddInt(StatsReport::kStatsValueNameAudioInputLevel, signal_level);
-  }
-
-  auto audio_processor(track->GetAudioProcessor());
-
-  if (audio_processor.get()) {
-    AudioProcessorInterface::AudioProcessorStats stats;
-    audio_processor->GetStats(&stats);
-
-    SetAudioProcessingStats(
-        report, stats.typing_noise_detected, stats.echo_return_loss,
-        stats.echo_return_loss_enhancement, stats.echo_delay_median_ms,
-        stats.aec_quality_min, stats.echo_delay_std_ms,
-        stats.residual_echo_likelihood,
-        stats.residual_echo_likelihood_recent_max);
-
-    report->AddFloat(StatsReport::kStatsValueNameAecDivergentFilterFraction,
-                     stats.aec_divergent_filter_fraction);
-  }
-}
-
-bool StatsCollector::GetTrackIdBySsrc(uint32_t ssrc,
-                                      std::string* track_id,
-                                      StatsReport::Direction direction) {
-  RTC_DCHECK(pc_->session()->signaling_thread()->IsCurrent());
-  if (direction == StatsReport::kSend) {
-    if (!pc_->session()->GetLocalTrackIdBySsrc(ssrc, track_id)) {
-      LOG(LS_WARNING) << "The SSRC " << ssrc
-                      << " is not associated with a sending track";
-      return false;
-    }
-  } else {
-    RTC_DCHECK(direction == StatsReport::kReceive);
-    if (!pc_->session()->GetRemoteTrackIdBySsrc(ssrc, track_id)) {
-      LOG(LS_WARNING) << "The SSRC " << ssrc
-                      << " is not associated with a receiving track";
-      return false;
-    }
-  }
-
-  return true;
-}
-
-void StatsCollector::UpdateTrackReports() {
-  RTC_DCHECK(pc_->session()->signaling_thread()->IsCurrent());
-
-  rtc::Thread::ScopedDisallowBlockingCalls no_blocking_calls;
-
-  for (const auto& entry : track_ids_) {
-    StatsReport* report = entry.second;
-    report->set_timestamp(stats_gathering_started_);
-  }
-}
-
-void StatsCollector::ClearUpdateStatsCacheForTest() {
-  stats_gathering_started_ = 0;
-}
-
-}  // namespace webrtc
diff --git a/pc/statscollector.h b/pc/statscollector.h
deleted file mode 100644
index 955bfdd..0000000
--- a/pc/statscollector.h
+++ /dev/null
@@ -1,153 +0,0 @@
-/*
- *  Copyright 2012 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.
- */
-
-// This file contains a class used for gathering statistics from an ongoing
-// libjingle PeerConnection.
-
-#ifndef WEBRTC_PC_STATSCOLLECTOR_H_
-#define WEBRTC_PC_STATSCOLLECTOR_H_
-
-#include <map>
-#include <string>
-#include <vector>
-
-#include "webrtc/api/mediastreaminterface.h"
-#include "webrtc/api/peerconnectioninterface.h"
-#include "webrtc/api/statstypes.h"
-#include "webrtc/pc/webrtcsession.h"
-
-namespace webrtc {
-
-class PeerConnection;
-
-// Conversion function to convert candidate type string to the corresponding one
-// from  enum RTCStatsIceCandidateType.
-const char* IceCandidateTypeToStatsType(const std::string& candidate_type);
-
-// Conversion function to convert adapter type to report string which are more
-// fitting to the general style of http://w3c.github.io/webrtc-stats. This is
-// only used by stats collector.
-const char* AdapterTypeToStatsType(rtc::AdapterType type);
-
-// A mapping between track ids and their StatsReport.
-typedef std::map<std::string, StatsReport*> TrackIdMap;
-
-class StatsCollector {
- public:
-  // The caller is responsible for ensuring that the pc outlives the
-  // StatsCollector instance.
-  explicit StatsCollector(PeerConnection* pc);
-  virtual ~StatsCollector();
-
-  // Adds a MediaStream with tracks that can be used as a |selector| in a call
-  // to GetStats.
-  void AddStream(MediaStreamInterface* stream);
-
-  // Adds a local audio track that is used for getting some voice statistics.
-  void AddLocalAudioTrack(AudioTrackInterface* audio_track, uint32_t ssrc);
-
-  // Removes a local audio tracks that is used for getting some voice
-  // statistics.
-  void RemoveLocalAudioTrack(AudioTrackInterface* audio_track, uint32_t ssrc);
-
-  // Gather statistics from the session and store them for future use.
-  void UpdateStats(PeerConnectionInterface::StatsOutputLevel level);
-
-  // Gets a StatsReports of the last collected stats. Note that UpdateStats must
-  // be called before this function to get the most recent stats. |selector| is
-  // a track label or empty string. The most recent reports are stored in
-  // |reports|.
-  // TODO(tommi): Change this contract to accept a callback object instead
-  // of filling in |reports|.  As is, there's a requirement that the caller
-  // uses |reports| immediately without allowing any async activity on
-  // the thread (message handling etc) and then discard the results.
-  void GetStats(MediaStreamTrackInterface* track,
-                StatsReports* reports);
-
-  // Prepare a local or remote SSRC report for the given ssrc. Used internally
-  // in the ExtractStatsFromList template.
-  StatsReport* PrepareReport(bool local,
-                             uint32_t ssrc,
-                             const StatsReport::Id& transport_id,
-                             StatsReport::Direction direction);
-
-  // A track is invalid if there is no report data for it.
-  bool IsValidTrack(const std::string& track_id);
-
-  // Method used by the unittest to force a update of stats since UpdateStats()
-  // that occur less than kMinGatherStatsPeriod number of ms apart will be
-  // ignored.
-  void ClearUpdateStatsCacheForTest();
-
- private:
-  friend class StatsCollectorTest;
-
-  // Overridden in unit tests to fake timing.
-  virtual double GetTimeNow();
-
-  bool CopySelectedReports(const std::string& selector, StatsReports* reports);
-
-  // Helper method for creating IceCandidate report. |is_local| indicates
-  // whether this candidate is local or remote.
-  StatsReport* AddCandidateReport(const cricket::Candidate& candidate,
-                                  bool local);
-
-  // Adds a report for this certificate and every certificate in its chain, and
-  // returns the leaf certificate's report (|cert|'s report).
-  StatsReport* AddCertificateReports(const rtc::SSLCertificate* cert);
-
-  StatsReport* AddConnectionInfoReport(const std::string& content_name,
-      int component, int connection_id,
-      const StatsReport::Id& channel_report_id,
-      const cricket::ConnectionInfo& info);
-
-  void ExtractDataInfo();
-  void ExtractSessionInfo();
-  void ExtractBweInfo();
-  void ExtractVoiceInfo();
-  void ExtractVideoInfo(PeerConnectionInterface::StatsOutputLevel level);
-  void ExtractSenderInfo();
-  void BuildSsrcToTransportId();
-  webrtc::StatsReport* GetReport(const StatsReport::StatsType& type,
-                                 const std::string& id,
-                                 StatsReport::Direction direction);
-
-  // Helper method to get stats from the local audio tracks.
-  void UpdateStatsFromExistingLocalAudioTracks();
-  void UpdateReportFromAudioTrack(AudioTrackInterface* track,
-                                  StatsReport* report);
-
-  // Helper method to get the id for the track identified by ssrc.
-  // |direction| tells if the track is for sending or receiving.
-  bool GetTrackIdBySsrc(uint32_t ssrc,
-                        std::string* track_id,
-                        StatsReport::Direction direction);
-
-  // Helper method to update the timestamp of track records.
-  void UpdateTrackReports();
-
-  // A collection for all of our stats reports.
-  StatsCollection reports_;
-  TrackIdMap track_ids_;
-  // Raw pointer to the peer connection the statistics are gathered from.
-  PeerConnection* const pc_;
-  double stats_gathering_started_;
-  ProxyTransportMap proxy_to_transport_;
-
-  // TODO(tommi): We appear to be holding on to raw pointers to reference
-  // counted objects?  We should be using scoped_refptr here.
-  typedef std::vector<std::pair<AudioTrackInterface*, uint32_t> >
-      LocalAudioTrackVector;
-  LocalAudioTrackVector local_audio_tracks_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_PC_STATSCOLLECTOR_H_
diff --git a/pc/statscollector_unittest.cc b/pc/statscollector_unittest.cc
deleted file mode 100644
index 6597e95..0000000
--- a/pc/statscollector_unittest.cc
+++ /dev/null
@@ -1,2178 +0,0 @@
-/*
- *  Copyright 2014 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 <stdio.h>
-
-#include <algorithm>
-#include <memory>
-
-#include "webrtc/pc/statscollector.h"
-
-#include "webrtc/api/mediastreaminterface.h"
-#include "webrtc/logging/rtc_event_log/rtc_event_log.h"
-#include "webrtc/media/base/fakemediaengine.h"
-#include "webrtc/media/base/test/mock_mediachannel.h"
-#include "webrtc/pc/channelmanager.h"
-#include "webrtc/pc/mediastream.h"
-#include "webrtc/pc/mediastreamtrack.h"
-#include "webrtc/pc/peerconnection.h"
-#include "webrtc/pc/peerconnectionfactory.h"
-#include "webrtc/pc/test/fakedatachannelprovider.h"
-#include "webrtc/pc/test/fakevideotracksource.h"
-#include "webrtc/pc/test/mock_peerconnection.h"
-#include "webrtc/pc/test/mock_webrtcsession.h"
-#include "webrtc/pc/videotrack.h"
-#include "webrtc/rtc_base/base64.h"
-#include "webrtc/rtc_base/fakesslidentity.h"
-#include "webrtc/rtc_base/gunit.h"
-#include "webrtc/rtc_base/network.h"
-#include "webrtc/rtc_base/stringencode.h"
-#include "webrtc/test/gmock.h"
-#include "webrtc/test/gtest.h"
-
-using testing::_;
-using testing::DoAll;
-using testing::Field;
-using testing::Invoke;
-using testing::Return;
-using testing::ReturnNull;
-using testing::ReturnRef;
-using testing::SetArgPointee;
-using webrtc::PeerConnectionInterface;
-using webrtc::StatsReport;
-using webrtc::StatsReports;
-
-namespace {
-const bool kDefaultRtcpMuxRequired = true;
-const bool kDefaultSrtpRequired = true;
-}
-
-namespace cricket {
-
-class ChannelManager;
-
-}  // namespace cricket
-
-namespace webrtc {
-
-namespace internal {
-// This value comes from openssl/tls1.h
-static const int TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA = 0xC014;
-}  // namespace internal
-
-// Error return values
-const char kNotFound[] = "NOT FOUND";
-
-// Constant names for track identification.
-const char kLocalTrackId[] = "local_track_id";
-const char kRemoteTrackId[] = "remote_track_id";
-const uint32_t kSsrcOfTrack = 1234;
-
-class FakeAudioProcessor : public webrtc::AudioProcessorInterface {
- public:
-  FakeAudioProcessor() {}
-  ~FakeAudioProcessor() {}
-
- private:
-  void GetStats(AudioProcessorInterface::AudioProcessorStats* stats) override {
-    stats->typing_noise_detected = true;
-    stats->echo_return_loss = 2;
-    stats->echo_return_loss_enhancement = 3;
-    stats->echo_delay_median_ms = 4;
-    stats->aec_quality_min = 5.1f;
-    stats->echo_delay_std_ms = 6;
-  }
-};
-
-class FakeAudioTrack
-    : public webrtc::MediaStreamTrack<webrtc::AudioTrackInterface> {
- public:
-  explicit FakeAudioTrack(const std::string& id)
-      : webrtc::MediaStreamTrack<webrtc::AudioTrackInterface>(id),
-        processor_(new rtc::RefCountedObject<FakeAudioProcessor>()) {}
-  std::string kind() const override { return "audio"; }
-  webrtc::AudioSourceInterface* GetSource() const override { return NULL; }
-  void AddSink(webrtc::AudioTrackSinkInterface* sink) override {}
-  void RemoveSink(webrtc::AudioTrackSinkInterface* sink) override {}
-  bool GetSignalLevel(int* level) override {
-    *level = 1;
-    return true;
-  }
-  rtc::scoped_refptr<webrtc::AudioProcessorInterface> GetAudioProcessor()
-      override {
-    return processor_;
-  }
-
- private:
-  rtc::scoped_refptr<FakeAudioProcessor> processor_;
-};
-
-// This fake audio processor is used to verify that the undesired initial values
-// (-1) will be filtered out.
-class FakeAudioProcessorWithInitValue : public webrtc::AudioProcessorInterface {
- public:
-  FakeAudioProcessorWithInitValue() {}
-  ~FakeAudioProcessorWithInitValue() {}
-
- private:
-  void GetStats(AudioProcessorInterface::AudioProcessorStats* stats) override {
-    stats->typing_noise_detected = false;
-    stats->echo_return_loss = -100;
-    stats->echo_return_loss_enhancement = -100;
-    stats->echo_delay_median_ms = -1;
-    stats->aec_quality_min = -1.0f;
-    stats->echo_delay_std_ms = -1;
-  }
-};
-
-class FakeAudioTrackWithInitValue
-    : public webrtc::MediaStreamTrack<webrtc::AudioTrackInterface> {
- public:
-  explicit FakeAudioTrackWithInitValue(const std::string& id)
-      : webrtc::MediaStreamTrack<webrtc::AudioTrackInterface>(id),
-        processor_(
-            new rtc::RefCountedObject<FakeAudioProcessorWithInitValue>()) {}
-  std::string kind() const override { return "audio"; }
-  webrtc::AudioSourceInterface* GetSource() const override { return NULL; }
-  void AddSink(webrtc::AudioTrackSinkInterface* sink) override {}
-  void RemoveSink(webrtc::AudioTrackSinkInterface* sink) override {}
-  bool GetSignalLevel(int* level) override {
-    *level = 1;
-    return true;
-  }
-  rtc::scoped_refptr<webrtc::AudioProcessorInterface> GetAudioProcessor()
-      override {
-    return processor_;
-  }
-
- private:
-  rtc::scoped_refptr<FakeAudioProcessorWithInitValue> processor_;
-};
-
-bool GetValue(const StatsReport* report,
-              StatsReport::StatsValueName name,
-              std::string* value) {
-  const StatsReport::Value* v = report->FindValue(name);
-  if (!v)
-    return false;
-  *value = v->ToString();
-  return true;
-}
-
-std::string ExtractStatsValue(const StatsReport::StatsType& type,
-                              const StatsReports& reports,
-                              StatsReport::StatsValueName name) {
-  for (const auto* r : reports) {
-    std::string ret;
-    if (r->type() == type && GetValue(r, name, &ret))
-      return ret;
-  }
-
-  return kNotFound;
-}
-
-StatsReport::Id TypedIdFromIdString(StatsReport::StatsType type,
-                                    const std::string& value) {
-  EXPECT_FALSE(value.empty());
-  StatsReport::Id id;
-  if (value.empty())
-    return id;
-
-  // This has assumptions about how the ID is constructed.  As is, this is
-  // OK since this is for testing purposes only, but if we ever need this
-  // in production, we should add a generic method that does this.
-  size_t index = value.find('_');
-  EXPECT_NE(index, std::string::npos);
-  if (index == std::string::npos || index == (value.length() - 1))
-    return id;
-
-  id = StatsReport::NewTypedId(type, value.substr(index + 1));
-  EXPECT_EQ(id->ToString(), value);
-  return id;
-}
-
-StatsReport::Id IdFromCertIdString(const std::string& cert_id) {
-  return TypedIdFromIdString(StatsReport::kStatsReportTypeCertificate, cert_id);
-}
-
-// Finds the |n|-th report of type |type| in |reports|.
-// |n| starts from 1 for finding the first report.
-const StatsReport* FindNthReportByType(
-    const StatsReports& reports, const StatsReport::StatsType& type, int n) {
-  for (size_t i = 0; i < reports.size(); ++i) {
-    if (reports[i]->type() == type) {
-      n--;
-      if (n == 0)
-        return reports[i];
-    }
-  }
-  return nullptr;
-}
-
-const StatsReport* FindReportById(const StatsReports& reports,
-                                  const StatsReport::Id& id) {
-  for (const auto* r : reports) {
-    if (r->id()->Equals(id))
-      return r;
-  }
-  return nullptr;
-}
-
-std::string ExtractSsrcStatsValue(StatsReports reports,
-                                  StatsReport::StatsValueName name) {
-  return ExtractStatsValue(StatsReport::kStatsReportTypeSsrc, reports, name);
-}
-
-std::string ExtractBweStatsValue(StatsReports reports,
-                                 StatsReport::StatsValueName name) {
-  return ExtractStatsValue(
-      StatsReport::kStatsReportTypeBwe, reports, name);
-}
-
-std::string DerToPem(const std::string& der) {
-  return rtc::SSLIdentity::DerToPem(
-        rtc::kPemTypeCertificate,
-        reinterpret_cast<const unsigned char*>(der.c_str()),
-        der.length());
-}
-
-std::vector<std::string> DersToPems(
-    const std::vector<std::string>& ders) {
-  std::vector<std::string> pems(ders.size());
-  std::transform(ders.begin(), ders.end(), pems.begin(), DerToPem);
-  return pems;
-}
-
-void CheckCertChainReports(const StatsReports& reports,
-                           const std::vector<std::string>& ders,
-                           const StatsReport::Id& start_id) {
-  StatsReport::Id cert_id;
-  const StatsReport::Id* certificate_id = &start_id;
-  size_t i = 0;
-  while (true) {
-    const StatsReport* report = FindReportById(reports, *certificate_id);
-    ASSERT_TRUE(report != NULL);
-
-    std::string der_base64;
-    EXPECT_TRUE(GetValue(
-        report, StatsReport::kStatsValueNameDer, &der_base64));
-    std::string der = rtc::Base64::Decode(der_base64, rtc::Base64::DO_STRICT);
-    EXPECT_EQ(ders[i], der);
-
-    std::string fingerprint_algorithm;
-    EXPECT_TRUE(GetValue(
-        report,
-        StatsReport::kStatsValueNameFingerprintAlgorithm,
-        &fingerprint_algorithm));
-    // The digest algorithm for a FakeSSLCertificate is always SHA-1.
-    std::string sha_1_str = rtc::DIGEST_SHA_1;
-    EXPECT_EQ(sha_1_str, fingerprint_algorithm);
-
-    std::string fingerprint;
-    EXPECT_TRUE(GetValue(report, StatsReport::kStatsValueNameFingerprint,
-                         &fingerprint));
-    EXPECT_FALSE(fingerprint.empty());
-
-    ++i;
-    std::string issuer_id;
-    if (!GetValue(report, StatsReport::kStatsValueNameIssuerId,
-                  &issuer_id)) {
-      break;
-    }
-
-    cert_id = IdFromCertIdString(issuer_id);
-    certificate_id = &cert_id;
-  }
-  EXPECT_EQ(ders.size(), i);
-}
-
-void VerifyVoiceReceiverInfoReport(
-    const StatsReport* report,
-    const cricket::VoiceReceiverInfo& info) {
-  std::string value_in_report;
-  EXPECT_TRUE(GetValue(
-      report, StatsReport::kStatsValueNameAudioOutputLevel, &value_in_report));
-  EXPECT_EQ(rtc::ToString<int>(info.audio_level), value_in_report);
-  EXPECT_TRUE(GetValue(
-      report, StatsReport::kStatsValueNameBytesReceived, &value_in_report));
-  EXPECT_EQ(rtc::ToString<int64_t>(info.bytes_rcvd), value_in_report);
-  EXPECT_TRUE(GetValue(
-      report, StatsReport::kStatsValueNameJitterReceived, &value_in_report));
-  EXPECT_EQ(rtc::ToString<int>(info.jitter_ms), value_in_report);
-  EXPECT_TRUE(GetValue(
-      report, StatsReport::kStatsValueNameJitterBufferMs, &value_in_report));
-  EXPECT_EQ(rtc::ToString<int>(info.jitter_buffer_ms), value_in_report);
-  EXPECT_TRUE(GetValue(
-      report, StatsReport::kStatsValueNamePreferredJitterBufferMs,
-      &value_in_report));
-  EXPECT_EQ(rtc::ToString<int>(info.jitter_buffer_preferred_ms),
-      value_in_report);
-  EXPECT_TRUE(GetValue(
-      report, StatsReport::kStatsValueNameCurrentDelayMs, &value_in_report));
-  EXPECT_EQ(rtc::ToString<int>(info.delay_estimate_ms), value_in_report);
-  EXPECT_TRUE(GetValue(
-      report, StatsReport::kStatsValueNameExpandRate, &value_in_report));
-  EXPECT_EQ(rtc::ToString<float>(info.expand_rate), value_in_report);
-  EXPECT_TRUE(GetValue(
-      report, StatsReport::kStatsValueNameSpeechExpandRate, &value_in_report));
-  EXPECT_EQ(rtc::ToString<float>(info.speech_expand_rate), value_in_report);
-  EXPECT_TRUE(GetValue(report, StatsReport::kStatsValueNameAccelerateRate,
-                       &value_in_report));
-  EXPECT_EQ(rtc::ToString<float>(info.accelerate_rate), value_in_report);
-  EXPECT_TRUE(GetValue(report, StatsReport::kStatsValueNamePreemptiveExpandRate,
-                       &value_in_report));
-  EXPECT_EQ(rtc::ToString<float>(info.preemptive_expand_rate), value_in_report);
-  EXPECT_TRUE(GetValue(report, StatsReport::kStatsValueNameSecondaryDecodedRate,
-                       &value_in_report));
-  EXPECT_EQ(rtc::ToString<float>(info.secondary_decoded_rate), value_in_report);
-  EXPECT_TRUE(GetValue(report,
-                       StatsReport::kStatsValueNameSecondaryDiscardedRate,
-                       &value_in_report));
-  EXPECT_EQ(rtc::ToString<float>(info.secondary_discarded_rate),
-            value_in_report);
-  EXPECT_TRUE(GetValue(
-      report, StatsReport::kStatsValueNamePacketsReceived, &value_in_report));
-  EXPECT_EQ(rtc::ToString<int>(info.packets_rcvd), value_in_report);
-  EXPECT_TRUE(GetValue(
-      report, StatsReport::kStatsValueNameDecodingCTSG, &value_in_report));
-  EXPECT_EQ(rtc::ToString<int>(info.decoding_calls_to_silence_generator),
-      value_in_report);
-  EXPECT_TRUE(GetValue(
-      report, StatsReport::kStatsValueNameDecodingCTN, &value_in_report));
-  EXPECT_EQ(rtc::ToString<int>(info.decoding_calls_to_neteq),
-      value_in_report);
-  EXPECT_TRUE(GetValue(
-      report, StatsReport::kStatsValueNameDecodingNormal, &value_in_report));
-  EXPECT_EQ(rtc::ToString<int>(info.decoding_normal), value_in_report);
-  EXPECT_TRUE(GetValue(
-      report, StatsReport::kStatsValueNameDecodingPLC, &value_in_report));
-  EXPECT_EQ(rtc::ToString<int>(info.decoding_plc), value_in_report);
-  EXPECT_TRUE(GetValue(
-      report, StatsReport::kStatsValueNameDecodingCNG, &value_in_report));
-  EXPECT_EQ(rtc::ToString<int>(info.decoding_cng), value_in_report);
-  EXPECT_TRUE(GetValue(
-      report, StatsReport::kStatsValueNameDecodingPLCCNG, &value_in_report));
-  EXPECT_EQ(rtc::ToString<int>(info.decoding_plc_cng), value_in_report);
-  EXPECT_TRUE(GetValue(report, StatsReport::kStatsValueNameDecodingMutedOutput,
-                       &value_in_report));
-  EXPECT_EQ(rtc::ToString<int>(info.decoding_muted_output), value_in_report);
-  EXPECT_TRUE(GetValue(report, StatsReport::kStatsValueNameCodecName,
-                       &value_in_report));
-}
-
-
-void VerifyVoiceSenderInfoReport(const StatsReport* report,
-                                 const cricket::VoiceSenderInfo& sinfo) {
-  std::string value_in_report;
-  EXPECT_TRUE(GetValue(
-      report, StatsReport::kStatsValueNameCodecName, &value_in_report));
-  EXPECT_EQ(sinfo.codec_name, value_in_report);
-  EXPECT_TRUE(GetValue(
-      report, StatsReport::kStatsValueNameBytesSent, &value_in_report));
-  EXPECT_EQ(rtc::ToString<int64_t>(sinfo.bytes_sent), value_in_report);
-  EXPECT_TRUE(GetValue(
-      report, StatsReport::kStatsValueNamePacketsSent, &value_in_report));
-  EXPECT_EQ(rtc::ToString<int>(sinfo.packets_sent), value_in_report);
-  EXPECT_TRUE(GetValue(
-      report, StatsReport::kStatsValueNamePacketsLost, &value_in_report));
-  EXPECT_EQ(rtc::ToString<int>(sinfo.packets_lost), value_in_report);
-  EXPECT_TRUE(GetValue(
-      report, StatsReport::kStatsValueNameRtt, &value_in_report));
-  EXPECT_EQ(rtc::ToString<int>(sinfo.rtt_ms), value_in_report);
-  EXPECT_TRUE(GetValue(
-      report, StatsReport::kStatsValueNameRtt, &value_in_report));
-  EXPECT_EQ(rtc::ToString<int>(sinfo.rtt_ms), value_in_report);
-  EXPECT_TRUE(GetValue(
-      report, StatsReport::kStatsValueNameJitterReceived, &value_in_report));
-  EXPECT_EQ(rtc::ToString<int>(sinfo.jitter_ms), value_in_report);
-  EXPECT_TRUE(GetValue(
-      report, StatsReport::kStatsValueNameEchoCancellationQualityMin,
-      &value_in_report));
-  EXPECT_EQ(rtc::ToString<float>(sinfo.aec_quality_min), value_in_report);
-  EXPECT_TRUE(GetValue(
-      report, StatsReport::kStatsValueNameEchoDelayMedian, &value_in_report));
-  EXPECT_EQ(rtc::ToString<int>(sinfo.echo_delay_median_ms),
-            value_in_report);
-  EXPECT_TRUE(GetValue(
-      report, StatsReport::kStatsValueNameEchoDelayStdDev, &value_in_report));
-  EXPECT_EQ(rtc::ToString<int>(sinfo.echo_delay_std_ms),
-            value_in_report);
-  EXPECT_TRUE(GetValue(
-      report, StatsReport::kStatsValueNameEchoReturnLoss, &value_in_report));
-  EXPECT_EQ(rtc::ToString<int>(sinfo.echo_return_loss),
-            value_in_report);
-  EXPECT_TRUE(GetValue(
-      report, StatsReport::kStatsValueNameEchoReturnLossEnhancement,
-      &value_in_report));
-  EXPECT_EQ(rtc::ToString<int>(sinfo.echo_return_loss_enhancement),
-            value_in_report);
-  EXPECT_TRUE(GetValue(report,
-                       StatsReport::kStatsValueNameResidualEchoLikelihood,
-                       &value_in_report));
-  EXPECT_EQ(rtc::ToString<float>(sinfo.residual_echo_likelihood),
-            value_in_report);
-  EXPECT_TRUE(GetValue(
-      report, StatsReport::kStatsValueNameResidualEchoLikelihoodRecentMax,
-      &value_in_report));
-  EXPECT_EQ(rtc::ToString<float>(sinfo.residual_echo_likelihood_recent_max),
-            value_in_report);
-  EXPECT_TRUE(GetValue(report, StatsReport::kStatsValueNameAudioInputLevel,
-                       &value_in_report));
-  EXPECT_EQ(rtc::ToString<int>(sinfo.audio_level), value_in_report);
-  EXPECT_TRUE(GetValue(
-      report, StatsReport::kStatsValueNameTypingNoiseState, &value_in_report));
-  std::string typing_detected = sinfo.typing_noise_detected ? "true" : "false";
-  EXPECT_EQ(typing_detected, value_in_report);
-  EXPECT_TRUE(GetValue(report,
-                       StatsReport::kStatsValueNameAnaBitrateActionCounter,
-                       &value_in_report));
-  ASSERT_TRUE(sinfo.ana_statistics.bitrate_action_counter);
-  EXPECT_EQ(
-      rtc::ToString<uint32_t>(*sinfo.ana_statistics.bitrate_action_counter),
-      value_in_report);
-  EXPECT_TRUE(GetValue(report,
-                       StatsReport::kStatsValueNameAnaChannelActionCounter,
-                       &value_in_report));
-  ASSERT_TRUE(sinfo.ana_statistics.channel_action_counter);
-  EXPECT_EQ(
-      rtc::ToString<uint32_t>(*sinfo.ana_statistics.channel_action_counter),
-      value_in_report);
-  EXPECT_TRUE(GetValue(report, StatsReport::kStatsValueNameAnaDtxActionCounter,
-                       &value_in_report));
-  ASSERT_TRUE(sinfo.ana_statistics.dtx_action_counter);
-  EXPECT_EQ(rtc::ToString<uint32_t>(*sinfo.ana_statistics.dtx_action_counter),
-            value_in_report);
-  EXPECT_TRUE(GetValue(report, StatsReport::kStatsValueNameAnaFecActionCounter,
-                       &value_in_report));
-  ASSERT_TRUE(sinfo.ana_statistics.fec_action_counter);
-  EXPECT_EQ(rtc::ToString<uint32_t>(*sinfo.ana_statistics.fec_action_counter),
-            value_in_report);
-  EXPECT_TRUE(GetValue(
-      report, StatsReport::kStatsValueNameAnaFrameLengthIncreaseCounter,
-      &value_in_report));
-  ASSERT_TRUE(sinfo.ana_statistics.frame_length_increase_counter);
-  EXPECT_EQ(rtc::ToString<uint32_t>(
-                *sinfo.ana_statistics.frame_length_increase_counter),
-            value_in_report);
-  EXPECT_TRUE(GetValue(
-      report, StatsReport::kStatsValueNameAnaFrameLengthDecreaseCounter,
-      &value_in_report));
-  ASSERT_TRUE(sinfo.ana_statistics.frame_length_decrease_counter);
-  EXPECT_EQ(rtc::ToString<uint32_t>(
-                *sinfo.ana_statistics.frame_length_decrease_counter),
-            value_in_report);
-  EXPECT_TRUE(GetValue(report,
-                       StatsReport::kStatsValueNameAnaUplinkPacketLossFraction,
-                       &value_in_report));
-  ASSERT_TRUE(sinfo.ana_statistics.uplink_packet_loss_fraction);
-  EXPECT_EQ(
-      rtc::ToString<float>(*sinfo.ana_statistics.uplink_packet_loss_fraction),
-      value_in_report);
-}
-
-// Helper methods to avoid duplication of code.
-void InitVoiceSenderInfo(cricket::VoiceSenderInfo* voice_sender_info) {
-  voice_sender_info->add_ssrc(kSsrcOfTrack);
-  voice_sender_info->codec_name = "fake_codec";
-  voice_sender_info->bytes_sent = 100;
-  voice_sender_info->packets_sent = 101;
-  voice_sender_info->rtt_ms = 102;
-  voice_sender_info->fraction_lost = 103;
-  voice_sender_info->jitter_ms = 104;
-  voice_sender_info->packets_lost = 105;
-  voice_sender_info->ext_seqnum = 106;
-  voice_sender_info->audio_level = 107;
-  voice_sender_info->echo_return_loss = 108;
-  voice_sender_info->echo_return_loss_enhancement = 109;
-  voice_sender_info->echo_delay_median_ms = 110;
-  voice_sender_info->echo_delay_std_ms = 111;
-  voice_sender_info->aec_quality_min = 112.0f;
-  voice_sender_info->typing_noise_detected = false;
-  voice_sender_info->ana_statistics.bitrate_action_counter =
-      rtc::Optional<uint32_t>(113);
-  voice_sender_info->ana_statistics.channel_action_counter =
-      rtc::Optional<uint32_t>(114);
-  voice_sender_info->ana_statistics.dtx_action_counter =
-      rtc::Optional<uint32_t>(115);
-  voice_sender_info->ana_statistics.fec_action_counter =
-      rtc::Optional<uint32_t>(116);
-  voice_sender_info->ana_statistics.frame_length_increase_counter =
-      rtc::Optional<uint32_t>(117);
-  voice_sender_info->ana_statistics.frame_length_decrease_counter =
-      rtc::Optional<uint32_t>(118);
-  voice_sender_info->ana_statistics.uplink_packet_loss_fraction =
-      rtc::Optional<float>(119.0);
-}
-
-void UpdateVoiceSenderInfoFromAudioTrack(
-    AudioTrackInterface* audio_track,
-    cricket::VoiceSenderInfo* voice_sender_info) {
-  audio_track->GetSignalLevel(&voice_sender_info->audio_level);
-  webrtc::AudioProcessorInterface::AudioProcessorStats audio_processor_stats;
-  audio_track->GetAudioProcessor()->GetStats(&audio_processor_stats);
-  voice_sender_info->typing_noise_detected =
-      audio_processor_stats.typing_noise_detected;
-  voice_sender_info->echo_return_loss = audio_processor_stats.echo_return_loss;
-  voice_sender_info->echo_return_loss_enhancement =
-      audio_processor_stats.echo_return_loss_enhancement;
-  voice_sender_info->echo_delay_median_ms =
-      audio_processor_stats.echo_delay_median_ms;
-  voice_sender_info->aec_quality_min = audio_processor_stats.aec_quality_min;
-  voice_sender_info->echo_delay_std_ms =
-      audio_processor_stats.echo_delay_std_ms;
-}
-
-void InitVoiceReceiverInfo(cricket::VoiceReceiverInfo* voice_receiver_info) {
-  voice_receiver_info->add_ssrc(kSsrcOfTrack);
-  voice_receiver_info->bytes_rcvd = 110;
-  voice_receiver_info->packets_rcvd = 111;
-  voice_receiver_info->packets_lost = 112;
-  voice_receiver_info->fraction_lost = 113;
-  voice_receiver_info->packets_lost = 114;
-  voice_receiver_info->ext_seqnum = 115;
-  voice_receiver_info->jitter_ms = 116;
-  voice_receiver_info->jitter_buffer_ms = 117;
-  voice_receiver_info->jitter_buffer_preferred_ms = 118;
-  voice_receiver_info->delay_estimate_ms = 119;
-  voice_receiver_info->audio_level = 120;
-  voice_receiver_info->expand_rate = 121;
-  voice_receiver_info->speech_expand_rate = 122;
-  voice_receiver_info->secondary_decoded_rate = 123;
-  voice_receiver_info->accelerate_rate = 124;
-  voice_receiver_info->preemptive_expand_rate = 125;
-  voice_receiver_info->secondary_discarded_rate = 126;
-}
-
-class StatsCollectorForTest : public webrtc::StatsCollector {
- public:
-  explicit StatsCollectorForTest(PeerConnection* pc)
-      : StatsCollector(pc), time_now_(19477) {}
-
-  double GetTimeNow() override {
-    return time_now_;
-  }
-
- private:
-  double time_now_;
-};
-
-class StatsCollectorTest : public testing::Test {
- protected:
-  StatsCollectorTest()
-      : worker_thread_(rtc::Thread::Current()),
-        network_thread_(rtc::Thread::Current()),
-        media_engine_(new cricket::FakeMediaEngine()),
-        channel_manager_(new cricket::ChannelManager(
-            std::unique_ptr<cricket::MediaEngineInterface>(media_engine_),
-            worker_thread_,
-            network_thread_)),
-
-        session_(channel_manager_.get(), cricket::MediaConfig()) {
-    // By default, we ignore session GetStats calls.
-    EXPECT_CALL(session_, GetStats(_)).WillRepeatedly(ReturnNull());
-    // Add default returns for mock classes.
-    EXPECT_CALL(session_, video_channel()).WillRepeatedly(ReturnNull());
-    EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull());
-    EXPECT_CALL(pc_, session()).WillRepeatedly(Return(&session_));
-    EXPECT_CALL(pc_, sctp_data_channels())
-        .WillRepeatedly(ReturnRef(data_channels_));
-    EXPECT_CALL(pc_, GetSenders()).WillRepeatedly(Return(
-        std::vector<rtc::scoped_refptr<RtpSenderInterface>>()));
-    EXPECT_CALL(pc_, GetReceivers()).WillRepeatedly(Return(
-        std::vector<rtc::scoped_refptr<RtpReceiverInterface>>()));
-  }
-
-  ~StatsCollectorTest() {}
-
-  // This creates a standard setup with a transport called "trspname"
-  // having one transport channel
-  // and the specified virtual connection name.
-  void InitSessionStats(const std::string& vc_name) {
-    const std::string kTransportName("trspname");
-    cricket::TransportStats transport_stats;
-    cricket::TransportChannelStats channel_stats;
-    channel_stats.component = 1;
-    transport_stats.transport_name = kTransportName;
-    transport_stats.channel_stats.push_back(channel_stats);
-
-    session_stats_.transport_stats[kTransportName] = transport_stats;
-    session_stats_.proxy_to_transport[vc_name] = kTransportName;
-  }
-
-  // Adds a outgoing video track with a given SSRC into the stats.
-  void AddOutgoingVideoTrackStats() {
-    stream_ = webrtc::MediaStream::Create("streamlabel");
-    track_ = webrtc::VideoTrack::Create(kLocalTrackId,
-                                        webrtc::FakeVideoTrackSource::Create(),
-                                        rtc::Thread::Current());
-    stream_->AddTrack(track_);
-    EXPECT_CALL(session_, GetLocalTrackIdBySsrc(kSsrcOfTrack, _))
-        .WillRepeatedly(DoAll(SetArgPointee<1>(kLocalTrackId), Return(true)));
-  }
-
-  // Adds a incoming video track with a given SSRC into the stats.
-  void AddIncomingVideoTrackStats() {
-    stream_ = webrtc::MediaStream::Create("streamlabel");
-    track_ = webrtc::VideoTrack::Create(kRemoteTrackId,
-                                        webrtc::FakeVideoTrackSource::Create(),
-                                        rtc::Thread::Current());
-    stream_->AddTrack(track_);
-    EXPECT_CALL(session_, GetRemoteTrackIdBySsrc(kSsrcOfTrack, _))
-        .WillRepeatedly(DoAll(SetArgPointee<1>(kRemoteTrackId), Return(true)));
-    }
-
-  // Adds a outgoing audio track with a given SSRC into the stats.
-  void AddOutgoingAudioTrackStats() {
-    if (stream_ == NULL)
-      stream_ = webrtc::MediaStream::Create("streamlabel");
-
-    audio_track_ = new rtc::RefCountedObject<FakeAudioTrack>(
-        kLocalTrackId);
-    stream_->AddTrack(audio_track_);
-    EXPECT_CALL(session_, GetLocalTrackIdBySsrc(kSsrcOfTrack, _))
-        .WillOnce(DoAll(SetArgPointee<1>(kLocalTrackId), Return(true)));
-  }
-
-  // Adds a incoming audio track with a given SSRC into the stats.
-  void AddIncomingAudioTrackStats() {
-    if (stream_ == NULL)
-      stream_ = webrtc::MediaStream::Create("streamlabel");
-
-    audio_track_ = new rtc::RefCountedObject<FakeAudioTrack>(
-        kRemoteTrackId);
-    stream_->AddTrack(audio_track_);
-    EXPECT_CALL(session_, GetRemoteTrackIdBySsrc(kSsrcOfTrack, _))
-        .WillOnce(DoAll(SetArgPointee<1>(kRemoteTrackId), Return(true)));
-  }
-
-  void AddDataChannel(cricket::DataChannelType type,
-                      const std::string& label,
-                      int id) {
-    InternalDataChannelInit config;
-    config.id = id;
-
-    data_channels_.push_back(DataChannel::Create(
-        &data_channel_provider_, cricket::DCT_SCTP, label, config));
-  }
-
-  StatsReport* AddCandidateReport(StatsCollector* collector,
-                                  const cricket::Candidate& candidate,
-                                  bool local) {
-    return collector->AddCandidateReport(candidate, local);
-  }
-
-  void SetupAndVerifyAudioTrackStats(
-      FakeAudioTrack* audio_track,
-      webrtc::MediaStream* stream,
-      webrtc::StatsCollector* stats,
-      cricket::VoiceChannel* voice_channel,
-      const std::string& vc_name,
-      MockVoiceMediaChannel* media_channel,
-      cricket::VoiceSenderInfo* voice_sender_info,
-      cricket::VoiceReceiverInfo* voice_receiver_info,
-      cricket::VoiceMediaInfo* stats_read,
-      StatsReports* reports) {
-    // A track can't have both sender report and recv report at the same time
-    // for now, this might change in the future though.
-    EXPECT_TRUE((voice_sender_info == NULL) ^ (voice_receiver_info == NULL));
-
-    // Instruct the session to return stats containing the transport channel.
-    InitSessionStats(vc_name);
-    EXPECT_CALL(session_, GetStats(_)).WillRepeatedly(Invoke(
-        [this](const ChannelNamePairs&) {
-          return std::unique_ptr<SessionStats>(
-              new SessionStats(session_stats_));
-        }));
-
-    // Constructs an ssrc stats update.
-    if (voice_sender_info)
-      stats_read->senders.push_back(*voice_sender_info);
-    if (voice_receiver_info)
-      stats_read->receivers.push_back(*voice_receiver_info);
-
-    EXPECT_CALL(session_, voice_channel()).WillRepeatedly(
-        Return(voice_channel));
-    EXPECT_CALL(session_, video_channel()).WillRepeatedly(ReturnNull());
-    EXPECT_CALL(*media_channel, GetStats(_))
-        .WillOnce(DoAll(SetArgPointee<0>(*stats_read), Return(true)));
-
-    stats->UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard);
-    stats->ClearUpdateStatsCacheForTest();
-    stats->GetStats(NULL, reports);
-
-    // Verify the existence of the track report.
-    const StatsReport* report = FindNthReportByType(
-        *reports, StatsReport::kStatsReportTypeSsrc, 1);
-    EXPECT_FALSE(report == NULL);
-    EXPECT_EQ(stats->GetTimeNow(), report->timestamp());
-    std::string track_id = ExtractSsrcStatsValue(
-        *reports, StatsReport::kStatsValueNameTrackId);
-    EXPECT_EQ(audio_track->id(), track_id);
-    std::string ssrc_id = ExtractSsrcStatsValue(
-        *reports, StatsReport::kStatsValueNameSsrc);
-    EXPECT_EQ(rtc::ToString<uint32_t>(kSsrcOfTrack), ssrc_id);
-
-    std::string media_type = ExtractSsrcStatsValue(*reports,
-        StatsReport::kStatsValueNameMediaType);
-    EXPECT_EQ("audio", media_type);
-
-    // Verifies the values in the track report.
-    if (voice_sender_info) {
-      UpdateVoiceSenderInfoFromAudioTrack(audio_track, voice_sender_info);
-      VerifyVoiceSenderInfoReport(report, *voice_sender_info);
-    }
-    if (voice_receiver_info) {
-      VerifyVoiceReceiverInfoReport(report, *voice_receiver_info);
-    }
-
-    // Verify we get the same result by passing a track to GetStats().
-    StatsReports track_reports;  // returned values.
-    stats->GetStats(audio_track, &track_reports);
-    const StatsReport* track_report = FindNthReportByType(
-        track_reports, StatsReport::kStatsReportTypeSsrc, 1);
-    EXPECT_TRUE(track_report);
-    EXPECT_EQ(stats->GetTimeNow(), track_report->timestamp());
-    track_id = ExtractSsrcStatsValue(track_reports,
-                                     StatsReport::kStatsValueNameTrackId);
-    EXPECT_EQ(audio_track->id(), track_id);
-    ssrc_id = ExtractSsrcStatsValue(track_reports,
-                                    StatsReport::kStatsValueNameSsrc);
-    EXPECT_EQ(rtc::ToString<uint32_t>(kSsrcOfTrack), ssrc_id);
-    if (voice_sender_info)
-      VerifyVoiceSenderInfoReport(track_report, *voice_sender_info);
-    if (voice_receiver_info)
-    VerifyVoiceReceiverInfoReport(track_report, *voice_receiver_info);
-  }
-
-  void TestCertificateReports(
-      const rtc::FakeSSLCertificate& local_cert,
-      const std::vector<std::string>& local_ders,
-      std::unique_ptr<rtc::FakeSSLCertificate> remote_cert,
-      const std::vector<std::string>& remote_ders) {
-    StatsCollectorForTest stats(&pc_);
-
-    StatsReports reports;  // returned values.
-
-    // Fake stats to process.
-    cricket::TransportChannelStats channel_stats;
-    channel_stats.component = 1;
-    channel_stats.srtp_crypto_suite = rtc::SRTP_AES128_CM_SHA1_80;
-    channel_stats.ssl_cipher_suite =
-        internal::TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA;
-
-    cricket::TransportStats transport_stats;
-    transport_stats.transport_name = "audio";
-    transport_stats.channel_stats.push_back(channel_stats);
-
-    SessionStats session_stats;
-    session_stats.transport_stats[transport_stats.transport_name] =
-        transport_stats;
-
-    // Fake certificate to report
-    rtc::scoped_refptr<rtc::RTCCertificate> local_certificate(
-        rtc::RTCCertificate::Create(std::unique_ptr<rtc::FakeSSLIdentity>(
-            new rtc::FakeSSLIdentity(local_cert))));
-
-    // Configure MockWebRtcSession
-    EXPECT_CALL(session_,
-                GetLocalCertificate(transport_stats.transport_name, _))
-        .WillOnce(DoAll(SetArgPointee<1>(local_certificate), Return(true)));
-    EXPECT_CALL(session_, GetRemoteSSLCertificate_ReturnsRawPointer(
-                              transport_stats.transport_name))
-        .WillOnce(Return(remote_cert.release()));
-    EXPECT_CALL(session_, GetStats(_)).WillOnce(Invoke(
-        [&session_stats](const ChannelNamePairs&) {
-          return std::unique_ptr<SessionStats>(
-              new SessionStats(session_stats));
-        }));
-
-    stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard);
-
-    stats.GetStats(NULL, &reports);
-
-    const StatsReport* channel_report = FindNthReportByType(
-        reports, StatsReport::kStatsReportTypeComponent, 1);
-    EXPECT_TRUE(channel_report != NULL);
-
-    // Check local certificate chain.
-    std::string local_certificate_id = ExtractStatsValue(
-        StatsReport::kStatsReportTypeComponent,
-        reports,
-        StatsReport::kStatsValueNameLocalCertificateId);
-    if (local_ders.size() > 0) {
-      EXPECT_NE(kNotFound, local_certificate_id);
-      StatsReport::Id id(IdFromCertIdString(local_certificate_id));
-      CheckCertChainReports(reports, local_ders, id);
-    } else {
-      EXPECT_EQ(kNotFound, local_certificate_id);
-    }
-
-    // Check remote certificate chain.
-    std::string remote_certificate_id = ExtractStatsValue(
-        StatsReport::kStatsReportTypeComponent,
-        reports,
-        StatsReport::kStatsValueNameRemoteCertificateId);
-    if (remote_ders.size() > 0) {
-      EXPECT_NE(kNotFound, remote_certificate_id);
-      StatsReport::Id id(IdFromCertIdString(remote_certificate_id));
-      CheckCertChainReports(reports, remote_ders, id);
-    } else {
-      EXPECT_EQ(kNotFound, remote_certificate_id);
-    }
-
-    // Check negotiated ciphers.
-    std::string dtls_cipher_suite =
-        ExtractStatsValue(StatsReport::kStatsReportTypeComponent, reports,
-                          StatsReport::kStatsValueNameDtlsCipher);
-    EXPECT_EQ(rtc::SSLStreamAdapter::SslCipherSuiteToName(
-                  internal::TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA),
-              dtls_cipher_suite);
-    std::string srtp_crypto_suite =
-        ExtractStatsValue(StatsReport::kStatsReportTypeComponent, reports,
-                          StatsReport::kStatsValueNameSrtpCipher);
-    EXPECT_EQ(rtc::SrtpCryptoSuiteToName(rtc::SRTP_AES128_CM_SHA1_80),
-              srtp_crypto_suite);
-  }
-
-  webrtc::RtcEventLogNullImpl event_log_;
-  rtc::Thread* const worker_thread_;
-  rtc::Thread* const network_thread_;
-  // |media_engine_| is actually owned by |channel_manager_|.
-  cricket::FakeMediaEngine* media_engine_;
-  std::unique_ptr<cricket::ChannelManager> channel_manager_;
-  MockWebRtcSession session_;
-  MockPeerConnection pc_;
-  FakeDataChannelProvider data_channel_provider_;
-  SessionStats session_stats_;
-  rtc::scoped_refptr<webrtc::MediaStream> stream_;
-  rtc::scoped_refptr<webrtc::VideoTrack> track_;
-  rtc::scoped_refptr<FakeAudioTrack> audio_track_;
-  std::vector<rtc::scoped_refptr<DataChannel>> data_channels_;
-};
-
-TEST_F(StatsCollectorTest, FilterOutNegativeDataChannelId) {
-  const std::string label = "hacks";
-  // The data channel id is from the Config which is -1 initially.
-  const int id = -1;
-  const std::string state = DataChannelInterface::DataStateString(
-      DataChannelInterface::DataState::kConnecting);
-
-  AddDataChannel(cricket::DCT_SCTP, label, id);
-  StatsCollectorForTest stats(&pc_);
-
-  stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard);
-
-  StatsReports reports;
-  stats.GetStats(NULL, &reports);
-
-  const StatsReport* report =
-      FindNthReportByType(reports, StatsReport::kStatsReportTypeDataChannel, 1);
-
-  std::string value_in_report;
-  EXPECT_FALSE(GetValue(report, StatsReport::kStatsValueNameDataChannelId,
-                        &value_in_report));
-}
-
-// Verify that ExtractDataInfo populates reports.
-TEST_F(StatsCollectorTest, ExtractDataInfo) {
-  const std::string label = "hacks";
-  const int id = 31337;
-  const std::string state = DataChannelInterface::DataStateString(
-      DataChannelInterface::DataState::kConnecting);
-
-  AddDataChannel(cricket::DCT_SCTP, label, id);
-  StatsCollectorForTest stats(&pc_);
-
-  stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard);
-
-  StatsReports reports;
-  stats.GetStats(NULL, &reports);
-
-  const StatsReport* report =
-      FindNthReportByType(reports, StatsReport::kStatsReportTypeDataChannel, 1);
-
-  StatsReport::Id reportId = StatsReport::NewTypedIntId(
-      StatsReport::kStatsReportTypeDataChannel, id);
-
-  EXPECT_TRUE(reportId->Equals(report->id()));
-
-  EXPECT_EQ(stats.GetTimeNow(), report->timestamp());
-  EXPECT_EQ(label, ExtractStatsValue(StatsReport::kStatsReportTypeDataChannel,
-                                     reports,
-                                     StatsReport::kStatsValueNameLabel));
-  EXPECT_EQ(rtc::ToString<int64_t>(id),
-            ExtractStatsValue(StatsReport::kStatsReportTypeDataChannel, reports,
-                              StatsReport::kStatsValueNameDataChannelId));
-  EXPECT_EQ(state, ExtractStatsValue(StatsReport::kStatsReportTypeDataChannel,
-                                     reports,
-                                     StatsReport::kStatsValueNameState));
-  EXPECT_EQ("", ExtractStatsValue(StatsReport::kStatsReportTypeDataChannel,
-                                  reports,
-                                  StatsReport::kStatsValueNameProtocol));
-}
-
-// This test verifies that 64-bit counters are passed successfully.
-TEST_F(StatsCollectorTest, BytesCounterHandles64Bits) {
-  StatsCollectorForTest stats(&pc_);
-
-  EXPECT_CALL(session_, GetLocalCertificate(_, _))
-      .WillRepeatedly(Return(false));
-  EXPECT_CALL(session_, GetRemoteSSLCertificate_ReturnsRawPointer(_))
-      .WillRepeatedly(Return(nullptr));
-
-  const char kVideoChannelName[] = "video";
-
-  InitSessionStats(kVideoChannelName);
-  EXPECT_CALL(session_, GetStats(_)).WillRepeatedly(Invoke(
-      [this](const ChannelNamePairs&) {
-        return std::unique_ptr<SessionStats>(
-            new SessionStats(session_stats_));
-      }));
-
-  MockVideoMediaChannel* media_channel = new MockVideoMediaChannel();
-  cricket::VideoChannel video_channel(
-      worker_thread_, network_thread_, nullptr, media_channel,
-      kVideoChannelName, kDefaultRtcpMuxRequired, kDefaultSrtpRequired);
-  StatsReports reports;  // returned values.
-  cricket::VideoSenderInfo video_sender_info;
-  cricket::VideoMediaInfo stats_read;
-  // The number of bytes must be larger than 0xFFFFFFFF for this test.
-  const int64_t kBytesSent = 12345678901234LL;
-  const std::string kBytesSentString("12345678901234");
-
-  AddOutgoingVideoTrackStats();
-  stats.AddStream(stream_);
-
-  // Construct a stats value to read.
-  video_sender_info.add_ssrc(1234);
-  video_sender_info.bytes_sent = kBytesSent;
-  stats_read.senders.push_back(video_sender_info);
-
-  EXPECT_CALL(session_, video_channel()).WillRepeatedly(Return(&video_channel));
-  EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull());
-  EXPECT_CALL(*media_channel, GetStats(_))
-      .WillOnce(DoAll(SetArgPointee<0>(stats_read),
-                      Return(true)));
-  stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard);
-  stats.GetStats(NULL, &reports);
-  std::string result = ExtractSsrcStatsValue(reports,
-      StatsReport::kStatsValueNameBytesSent);
-  EXPECT_EQ(kBytesSentString, result);
-}
-
-// Test that audio BWE information is reported via stats.
-TEST_F(StatsCollectorTest, AudioBandwidthEstimationInfoIsReported) {
-  StatsCollectorForTest stats(&pc_);
-
-  EXPECT_CALL(session_, GetLocalCertificate(_, _))
-      .WillRepeatedly(Return(false));
-  EXPECT_CALL(session_, GetRemoteSSLCertificate_ReturnsRawPointer(_))
-      .WillRepeatedly(Return(nullptr));
-
-  const char kAudioChannelName[] = "audio";
-
-  InitSessionStats(kAudioChannelName);
-  EXPECT_CALL(session_, GetStats(_))
-      .WillRepeatedly(Invoke([this](const ChannelNamePairs&) {
-        return std::unique_ptr<SessionStats>(new SessionStats(session_stats_));
-      }));
-
-  MockVoiceMediaChannel* media_channel = new MockVoiceMediaChannel();
-  cricket::VoiceChannel voice_channel(
-      worker_thread_, network_thread_, nullptr, nullptr, media_channel,
-      kAudioChannelName, kDefaultRtcpMuxRequired, kDefaultSrtpRequired);
-
-  StatsReports reports;  // returned values.
-  cricket::VoiceSenderInfo voice_sender_info;
-  cricket::VoiceMediaInfo stats_read;
-  // Set up an SSRC just to test that we get both kinds of stats back: SSRC and
-  // BWE.
-  const int64_t kBytesSent = 12345678901234LL;
-  const std::string kBytesSentString("12345678901234");
-
-  AddOutgoingAudioTrackStats();
-  stats.AddStream(stream_);
-
-  // Construct a stats value to read.
-  voice_sender_info.add_ssrc(1234);
-  voice_sender_info.bytes_sent = kBytesSent;
-  stats_read.senders.push_back(voice_sender_info);
-
-  webrtc::Call::Stats call_stats;
-  const int kSendBandwidth = 1234567;
-  const int kRecvBandwidth = 12345678;
-  const int kPacerDelay = 123;
-  call_stats.send_bandwidth_bps = kSendBandwidth;
-  call_stats.recv_bandwidth_bps = kRecvBandwidth;
-  call_stats.pacer_delay_ms = kPacerDelay;
-  EXPECT_CALL(session_, GetCallStats()).WillRepeatedly(Return(call_stats));
-  EXPECT_CALL(session_, voice_channel()).WillRepeatedly(Return(&voice_channel));
-  EXPECT_CALL(session_, video_channel()).WillRepeatedly(ReturnNull());
-  EXPECT_CALL(*media_channel, GetStats(_))
-      .WillOnce(DoAll(SetArgPointee<0>(stats_read), Return(true)));
-
-  stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard);
-  stats.GetStats(NULL, &reports);
-  std::string result =
-      ExtractSsrcStatsValue(reports, StatsReport::kStatsValueNameBytesSent);
-  EXPECT_EQ(kBytesSentString, result);
-  result = ExtractBweStatsValue(
-      reports, StatsReport::kStatsValueNameAvailableSendBandwidth);
-  EXPECT_EQ(rtc::ToString(kSendBandwidth), result);
-  result = ExtractBweStatsValue(
-      reports, StatsReport::kStatsValueNameAvailableReceiveBandwidth);
-  EXPECT_EQ(rtc::ToString(kRecvBandwidth), result);
-  result =
-      ExtractBweStatsValue(reports, StatsReport::kStatsValueNameBucketDelay);
-  EXPECT_EQ(rtc::ToString(kPacerDelay), result);
-}
-
-// Test that video BWE information is reported via stats.
-TEST_F(StatsCollectorTest, VideoBandwidthEstimationInfoIsReported) {
-  StatsCollectorForTest stats(&pc_);
-
-  EXPECT_CALL(session_, GetLocalCertificate(_, _))
-      .WillRepeatedly(Return(false));
-  EXPECT_CALL(session_, GetRemoteSSLCertificate_ReturnsRawPointer(_))
-      .WillRepeatedly(Return(nullptr));
-
-  const char kVideoChannelName[] = "video";
-
-  InitSessionStats(kVideoChannelName);
-  EXPECT_CALL(session_, GetStats(_)).WillRepeatedly(Invoke(
-      [this](const ChannelNamePairs&) {
-        return std::unique_ptr<SessionStats>(
-            new SessionStats(session_stats_));
-      }));
-
-  MockVideoMediaChannel* media_channel = new MockVideoMediaChannel();
-  cricket::VideoChannel video_channel(
-      worker_thread_, network_thread_, nullptr, media_channel,
-      kVideoChannelName, kDefaultRtcpMuxRequired, kDefaultSrtpRequired);
-
-  StatsReports reports;  // returned values.
-  cricket::VideoSenderInfo video_sender_info;
-  cricket::VideoMediaInfo stats_read;
-  // Set up an SSRC just to test that we get both kinds of stats back: SSRC and
-  // BWE.
-  const int64_t kBytesSent = 12345678901234LL;
-  const std::string kBytesSentString("12345678901234");
-
-  AddOutgoingVideoTrackStats();
-  stats.AddStream(stream_);
-
-  // Construct a stats value to read.
-  video_sender_info.add_ssrc(1234);
-  video_sender_info.bytes_sent = kBytesSent;
-  stats_read.senders.push_back(video_sender_info);
-
-  webrtc::Call::Stats call_stats;
-  const int kSendBandwidth = 1234567;
-  const int kRecvBandwidth = 12345678;
-  const int kPacerDelay = 123;
-  call_stats.send_bandwidth_bps = kSendBandwidth;
-  call_stats.recv_bandwidth_bps = kRecvBandwidth;
-  call_stats.pacer_delay_ms = kPacerDelay;
-  EXPECT_CALL(session_, GetCallStats()).WillRepeatedly(Return(call_stats));
-  EXPECT_CALL(session_, video_channel()).WillRepeatedly(Return(&video_channel));
-  EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull());
-  EXPECT_CALL(*media_channel, GetStats(_))
-      .WillOnce(DoAll(SetArgPointee<0>(stats_read), Return(true)));
-
-  stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard);
-  stats.GetStats(NULL, &reports);
-  std::string result = ExtractSsrcStatsValue(reports,
-      StatsReport::kStatsValueNameBytesSent);
-  EXPECT_EQ(kBytesSentString, result);
-  result = ExtractBweStatsValue(
-      reports, StatsReport::kStatsValueNameAvailableSendBandwidth);
-  EXPECT_EQ(rtc::ToString(kSendBandwidth), result);
-  result = ExtractBweStatsValue(
-      reports, StatsReport::kStatsValueNameAvailableReceiveBandwidth);
-  EXPECT_EQ(rtc::ToString(kRecvBandwidth), result);
-  result =
-      ExtractBweStatsValue(reports, StatsReport::kStatsValueNameBucketDelay);
-  EXPECT_EQ(rtc::ToString(kPacerDelay), result);
-}
-
-// This test verifies that an object of type "googSession" always
-// exists in the returned stats.
-TEST_F(StatsCollectorTest, SessionObjectExists) {
-  StatsCollectorForTest stats(&pc_);
-
-  StatsReports reports;  // returned values.
-  stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard);
-  stats.GetStats(NULL, &reports);
-  const StatsReport* session_report = FindNthReportByType(
-      reports, StatsReport::kStatsReportTypeSession, 1);
-  EXPECT_FALSE(session_report == NULL);
-}
-
-// This test verifies that only one object of type "googSession" exists
-// in the returned stats.
-TEST_F(StatsCollectorTest, OnlyOneSessionObjectExists) {
-  StatsCollectorForTest stats(&pc_);
-
-  StatsReports reports;  // returned values.
-  stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard);
-  stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard);
-  stats.GetStats(NULL, &reports);
-  const StatsReport* session_report = FindNthReportByType(
-      reports, StatsReport::kStatsReportTypeSession, 1);
-  EXPECT_FALSE(session_report == NULL);
-  session_report = FindNthReportByType(
-      reports, StatsReport::kStatsReportTypeSession, 2);
-  EXPECT_EQ(NULL, session_report);
-}
-
-// This test verifies that the empty track report exists in the returned stats
-// without calling StatsCollector::UpdateStats.
-TEST_F(StatsCollectorTest, TrackObjectExistsWithoutUpdateStats) {
-  StatsCollectorForTest stats(&pc_);
-
-  MockVideoMediaChannel* media_channel = new MockVideoMediaChannel();
-  cricket::VideoChannel video_channel(
-      worker_thread_, network_thread_, nullptr, media_channel, "video",
-      kDefaultRtcpMuxRequired, kDefaultSrtpRequired);
-  AddOutgoingVideoTrackStats();
-  stats.AddStream(stream_);
-
-  // Verfies the existence of the track report.
-  StatsReports reports;
-  stats.GetStats(NULL, &reports);
-  EXPECT_EQ((size_t)1, reports.size());
-  EXPECT_EQ(StatsReport::kStatsReportTypeTrack, reports[0]->type());
-  EXPECT_EQ(0, reports[0]->timestamp());
-
-  std::string trackValue =
-      ExtractStatsValue(StatsReport::kStatsReportTypeTrack,
-                        reports,
-                        StatsReport::kStatsValueNameTrackId);
-  EXPECT_EQ(kLocalTrackId, trackValue);
-}
-
-// This test verifies that the empty track report exists in the returned stats
-// when StatsCollector::UpdateStats is called with ssrc stats.
-TEST_F(StatsCollectorTest, TrackAndSsrcObjectExistAfterUpdateSsrcStats) {
-  StatsCollectorForTest stats(&pc_);
-
-  EXPECT_CALL(session_, GetLocalCertificate(_, _))
-      .WillRepeatedly(Return(false));
-  EXPECT_CALL(session_, GetRemoteSSLCertificate_ReturnsRawPointer(_))
-      .WillRepeatedly(Return(nullptr));
-
-  const char kVideoChannelName[] = "video";
-  InitSessionStats(kVideoChannelName);
-  EXPECT_CALL(session_, GetStats(_)).WillRepeatedly(Invoke(
-      [this](const ChannelNamePairs&) {
-        return std::unique_ptr<SessionStats>(
-            new SessionStats(session_stats_));
-      }));
-
-  MockVideoMediaChannel* media_channel = new MockVideoMediaChannel();
-  cricket::VideoChannel video_channel(
-      worker_thread_, network_thread_, nullptr, media_channel,
-      kVideoChannelName, kDefaultRtcpMuxRequired, kDefaultSrtpRequired);
-  AddOutgoingVideoTrackStats();
-  stats.AddStream(stream_);
-
-  // Constructs an ssrc stats update.
-  cricket::VideoSenderInfo video_sender_info;
-  cricket::VideoMediaInfo stats_read;
-  const int64_t kBytesSent = 12345678901234LL;
-
-  // Construct a stats value to read.
-  video_sender_info.add_ssrc(1234);
-  video_sender_info.bytes_sent = kBytesSent;
-  stats_read.senders.push_back(video_sender_info);
-
-  EXPECT_CALL(session_, video_channel()).WillRepeatedly(Return(&video_channel));
-  EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull());
-  EXPECT_CALL(*media_channel, GetStats(_))
-    .WillOnce(DoAll(SetArgPointee<0>(stats_read),
-                    Return(true)));
-
-  stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard);
-  StatsReports reports;
-  stats.GetStats(NULL, &reports);
-  // |reports| should contain at least one session report, one track report,
-  // and one ssrc report.
-  EXPECT_LE((size_t)3, reports.size());
-  const StatsReport* track_report = FindNthReportByType(
-      reports, StatsReport::kStatsReportTypeTrack, 1);
-  EXPECT_TRUE(track_report);
-
-  // Get report for the specific |track|.
-  reports.clear();
-  stats.GetStats(track_, &reports);
-  // |reports| should contain at least one session report, one track report,
-  // and one ssrc report.
-  EXPECT_LE((size_t)3, reports.size());
-  track_report = FindNthReportByType(
-      reports, StatsReport::kStatsReportTypeTrack, 1);
-  EXPECT_TRUE(track_report);
-  EXPECT_EQ(stats.GetTimeNow(), track_report->timestamp());
-
-  std::string ssrc_id = ExtractSsrcStatsValue(
-      reports, StatsReport::kStatsValueNameSsrc);
-  EXPECT_EQ(rtc::ToString<uint32_t>(kSsrcOfTrack), ssrc_id);
-
-  std::string track_id = ExtractSsrcStatsValue(
-      reports, StatsReport::kStatsValueNameTrackId);
-  EXPECT_EQ(kLocalTrackId, track_id);
-
-  std::string media_type = ExtractSsrcStatsValue(reports,
-      StatsReport::kStatsValueNameMediaType);
-  EXPECT_EQ("video", media_type);
-}
-
-// This test verifies that an SSRC object has the identifier of a Transport
-// stats object, and that this transport stats object exists in stats.
-TEST_F(StatsCollectorTest, TransportObjectLinkedFromSsrcObject) {
-  StatsCollectorForTest stats(&pc_);
-
-  EXPECT_CALL(session_, GetLocalCertificate(_, _))
-      .WillRepeatedly(Return(false));
-  EXPECT_CALL(session_, GetRemoteSSLCertificate_ReturnsRawPointer(_))
-      .WillRepeatedly(Return(nullptr));
-
-  MockVideoMediaChannel* media_channel = new MockVideoMediaChannel();
-  // The transport_name known by the video channel.
-  const std::string kVcName("vcname");
-  cricket::VideoChannel video_channel(
-      worker_thread_, network_thread_, nullptr, media_channel, kVcName,
-      kDefaultRtcpMuxRequired, kDefaultSrtpRequired);
-  AddOutgoingVideoTrackStats();
-  stats.AddStream(stream_);
-
-  // Constructs an ssrc stats update.
-  cricket::VideoSenderInfo video_sender_info;
-  cricket::VideoMediaInfo stats_read;
-  const int64_t kBytesSent = 12345678901234LL;
-
-  // Construct a stats value to read.
-  video_sender_info.add_ssrc(1234);
-  video_sender_info.bytes_sent = kBytesSent;
-  stats_read.senders.push_back(video_sender_info);
-
-  EXPECT_CALL(session_, video_channel()).WillRepeatedly(Return(&video_channel));
-  EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull());
-  EXPECT_CALL(*media_channel, GetStats(_))
-    .WillRepeatedly(DoAll(SetArgPointee<0>(stats_read),
-                          Return(true)));
-
-  InitSessionStats(kVcName);
-  EXPECT_CALL(session_, GetStats(_)).WillRepeatedly(Invoke(
-      [this](const ChannelNamePairs&) {
-        return std::unique_ptr<SessionStats>(
-            new SessionStats(session_stats_));
-      }));
-
-  stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard);
-  StatsReports reports;
-  stats.GetStats(NULL, &reports);
-  std::string transport_id = ExtractStatsValue(
-      StatsReport::kStatsReportTypeSsrc,
-      reports,
-      StatsReport::kStatsValueNameTransportId);
-  ASSERT_NE(kNotFound, transport_id);
-  // Transport id component ID will always be 1.
-  // This has assumptions about how the ID is constructed.  As is, this is
-  // OK since this is for testing purposes only, but if we ever need this
-  // in production, we should add a generic method that does this.
-  size_t index = transport_id.find('-');
-  ASSERT_NE(std::string::npos, index);
-  std::string content = transport_id.substr(index + 1);
-  index = content.rfind('-');
-  ASSERT_NE(std::string::npos, index);
-  content = content.substr(0, index);
-  StatsReport::Id id(StatsReport::NewComponentId(content, 1));
-  ASSERT_EQ(transport_id, id->ToString());
-  const StatsReport* transport_report = FindReportById(reports, id);
-  ASSERT_FALSE(transport_report == NULL);
-}
-
-// This test verifies that a remote stats object will not be created for
-// an outgoing SSRC where remote stats are not returned.
-TEST_F(StatsCollectorTest, RemoteSsrcInfoIsAbsent) {
-  StatsCollectorForTest stats(&pc_);
-
-  MockVideoMediaChannel* media_channel = new MockVideoMediaChannel();
-  // The transport_name known by the video channel.
-  const std::string kVcName("vcname");
-  cricket::VideoChannel video_channel(
-      worker_thread_, network_thread_, nullptr, media_channel, kVcName,
-      kDefaultRtcpMuxRequired, kDefaultSrtpRequired);
-  AddOutgoingVideoTrackStats();
-  stats.AddStream(stream_);
-
-  stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard);
-  StatsReports reports;
-  stats.GetStats(NULL, &reports);
-  const StatsReport* remote_report = FindNthReportByType(reports,
-      StatsReport::kStatsReportTypeRemoteSsrc, 1);
-  EXPECT_TRUE(remote_report == NULL);
-}
-
-// This test verifies that a remote stats object will be created for
-// an outgoing SSRC where stats are returned.
-TEST_F(StatsCollectorTest, RemoteSsrcInfoIsPresent) {
-  StatsCollectorForTest stats(&pc_);
-
-  EXPECT_CALL(session_, GetLocalCertificate(_, _))
-      .WillRepeatedly(Return(false));
-  EXPECT_CALL(session_, GetRemoteSSLCertificate_ReturnsRawPointer(_))
-      .WillRepeatedly(Return(nullptr));
-
-  MockVideoMediaChannel* media_channel = new MockVideoMediaChannel();
-  // The transport_name known by the video channel.
-  const std::string kVcName("vcname");
-  cricket::VideoChannel video_channel(
-      worker_thread_, network_thread_, nullptr, media_channel, kVcName,
-      kDefaultRtcpMuxRequired, kDefaultSrtpRequired);
-  AddOutgoingVideoTrackStats();
-  stats.AddStream(stream_);
-
-  // Instruct the session to return stats containing the transport channel.
-  InitSessionStats(kVcName);
-  EXPECT_CALL(session_, GetStats(_)).WillRepeatedly(Invoke(
-      [this](const ChannelNamePairs&) {
-        return std::unique_ptr<SessionStats>(
-            new SessionStats(session_stats_));
-      }));
-
-  // Constructs an ssrc stats update.
-  cricket::VideoMediaInfo stats_read;
-
-  cricket::SsrcReceiverInfo remote_ssrc_stats;
-  remote_ssrc_stats.timestamp = 12345.678;
-  remote_ssrc_stats.ssrc = kSsrcOfTrack;
-  cricket::VideoSenderInfo video_sender_info;
-  video_sender_info.add_ssrc(kSsrcOfTrack);
-  video_sender_info.remote_stats.push_back(remote_ssrc_stats);
-  stats_read.senders.push_back(video_sender_info);
-
-  EXPECT_CALL(session_, video_channel()).WillRepeatedly(Return(&video_channel));
-  EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull());
-  EXPECT_CALL(*media_channel, GetStats(_))
-    .WillRepeatedly(DoAll(SetArgPointee<0>(stats_read),
-                          Return(true)));
-
-  stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard);
-  StatsReports reports;
-  stats.GetStats(NULL, &reports);
-
-  const StatsReport* remote_report = FindNthReportByType(reports,
-      StatsReport::kStatsReportTypeRemoteSsrc, 1);
-  EXPECT_FALSE(remote_report == NULL);
-  EXPECT_EQ(12345.678, remote_report->timestamp());
-}
-
-// This test verifies that the empty track report exists in the returned stats
-// when StatsCollector::UpdateStats is called with ssrc stats.
-TEST_F(StatsCollectorTest, ReportsFromRemoteTrack) {
-  StatsCollectorForTest stats(&pc_);
-
-  EXPECT_CALL(session_, GetLocalCertificate(_, _))
-      .WillRepeatedly(Return(false));
-  EXPECT_CALL(session_, GetRemoteSSLCertificate_ReturnsRawPointer(_))
-      .WillRepeatedly(Return(nullptr));
-
-  const char kVideoChannelName[] = "video";
-  InitSessionStats(kVideoChannelName);
-  EXPECT_CALL(session_, GetStats(_)).WillRepeatedly(Invoke(
-      [this](const ChannelNamePairs&) {
-        return std::unique_ptr<SessionStats>(
-            new SessionStats(session_stats_));
-      }));
-
-  MockVideoMediaChannel* media_channel = new MockVideoMediaChannel();
-  cricket::VideoChannel video_channel(
-      worker_thread_, network_thread_, nullptr, media_channel,
-      kVideoChannelName, kDefaultRtcpMuxRequired, kDefaultSrtpRequired);
-  AddIncomingVideoTrackStats();
-  stats.AddStream(stream_);
-
-  // Constructs an ssrc stats update.
-  cricket::VideoReceiverInfo video_receiver_info;
-  cricket::VideoMediaInfo stats_read;
-  const int64_t kNumOfPacketsConcealed = 54321;
-
-  // Construct a stats value to read.
-  video_receiver_info.add_ssrc(1234);
-  video_receiver_info.packets_concealed = kNumOfPacketsConcealed;
-  stats_read.receivers.push_back(video_receiver_info);
-
-  EXPECT_CALL(session_, video_channel()).WillRepeatedly(Return(&video_channel));
-  EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull());
-  EXPECT_CALL(*media_channel, GetStats(_))
-      .WillOnce(DoAll(SetArgPointee<0>(stats_read),
-                      Return(true)));
-
-  stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard);
-  StatsReports reports;
-  stats.GetStats(NULL, &reports);
-  // |reports| should contain at least one session report, one track report,
-  // and one ssrc report.
-  EXPECT_LE(static_cast<size_t>(3), reports.size());
-  const StatsReport* track_report = FindNthReportByType(
-      reports, StatsReport::kStatsReportTypeTrack, 1);
-  EXPECT_TRUE(track_report);
-  EXPECT_EQ(stats.GetTimeNow(), track_report->timestamp());
-
-  std::string ssrc_id = ExtractSsrcStatsValue(
-      reports, StatsReport::kStatsValueNameSsrc);
-  EXPECT_EQ(rtc::ToString<uint32_t>(kSsrcOfTrack), ssrc_id);
-
-  std::string track_id = ExtractSsrcStatsValue(
-      reports, StatsReport::kStatsValueNameTrackId);
-  EXPECT_EQ(kRemoteTrackId, track_id);
-}
-
-// This test verifies the Ice Candidate report should contain the correct
-// information from local/remote candidates.
-TEST_F(StatsCollectorTest, IceCandidateReport) {
-  StatsCollectorForTest stats(&pc_);
-
-  StatsReports reports;                     // returned values.
-
-  const int local_port = 2000;
-  const char local_ip[] = "192.168.0.1";
-  const int remote_port = 2001;
-  const char remote_ip[] = "192.168.0.2";
-
-  rtc::SocketAddress local_address(local_ip, local_port);
-  rtc::SocketAddress remote_address(remote_ip, remote_port);
-  rtc::AdapterType network_type = rtc::ADAPTER_TYPE_ETHERNET;
-  uint32_t priority = 1000;
-
-  cricket::Candidate c;
-  EXPECT_GT(c.id().length(), 0u);
-  c.set_type(cricket::LOCAL_PORT_TYPE);
-  c.set_protocol(cricket::UDP_PROTOCOL_NAME);
-  c.set_address(local_address);
-  c.set_priority(priority);
-  c.set_network_type(network_type);
-  std::string report_id = AddCandidateReport(&stats, c, true)->id()->ToString();
-  EXPECT_EQ("Cand-" + c.id(), report_id);
-
-  c = cricket::Candidate();
-  EXPECT_GT(c.id().length(), 0u);
-  c.set_type(cricket::PRFLX_PORT_TYPE);
-  c.set_protocol(cricket::UDP_PROTOCOL_NAME);
-  c.set_address(remote_address);
-  c.set_priority(priority);
-  c.set_network_type(network_type);
-  report_id = AddCandidateReport(&stats, c, false)->id()->ToString();
-  EXPECT_EQ("Cand-" + c.id(), report_id);
-
-  stats.GetStats(NULL, &reports);
-
-  // Verify the local candidate report is populated correctly.
-  EXPECT_EQ(
-      local_ip,
-      ExtractStatsValue(StatsReport::kStatsReportTypeIceLocalCandidate, reports,
-                        StatsReport::kStatsValueNameCandidateIPAddress));
-  EXPECT_EQ(
-      rtc::ToString<int>(local_port),
-      ExtractStatsValue(StatsReport::kStatsReportTypeIceLocalCandidate, reports,
-                        StatsReport::kStatsValueNameCandidatePortNumber));
-  EXPECT_EQ(
-      cricket::UDP_PROTOCOL_NAME,
-      ExtractStatsValue(StatsReport::kStatsReportTypeIceLocalCandidate, reports,
-                        StatsReport::kStatsValueNameCandidateTransportType));
-  EXPECT_EQ(
-      rtc::ToString<int>(priority),
-      ExtractStatsValue(StatsReport::kStatsReportTypeIceLocalCandidate, reports,
-                        StatsReport::kStatsValueNameCandidatePriority));
-  EXPECT_EQ(
-      IceCandidateTypeToStatsType(cricket::LOCAL_PORT_TYPE),
-      ExtractStatsValue(StatsReport::kStatsReportTypeIceLocalCandidate, reports,
-                        StatsReport::kStatsValueNameCandidateType));
-  EXPECT_EQ(
-      AdapterTypeToStatsType(network_type),
-      ExtractStatsValue(StatsReport::kStatsReportTypeIceLocalCandidate, reports,
-                        StatsReport::kStatsValueNameCandidateNetworkType));
-
-  // Verify the remote candidate report is populated correctly.
-  EXPECT_EQ(remote_ip,
-            ExtractStatsValue(StatsReport::kStatsReportTypeIceRemoteCandidate,
-                              reports,
-                              StatsReport::kStatsValueNameCandidateIPAddress));
-  EXPECT_EQ(rtc::ToString<int>(remote_port),
-            ExtractStatsValue(StatsReport::kStatsReportTypeIceRemoteCandidate,
-                              reports,
-                              StatsReport::kStatsValueNameCandidatePortNumber));
-  EXPECT_EQ(cricket::UDP_PROTOCOL_NAME,
-            ExtractStatsValue(
-                StatsReport::kStatsReportTypeIceRemoteCandidate, reports,
-                StatsReport::kStatsValueNameCandidateTransportType));
-  EXPECT_EQ(rtc::ToString<int>(priority),
-            ExtractStatsValue(StatsReport::kStatsReportTypeIceRemoteCandidate,
-                              reports,
-                              StatsReport::kStatsValueNameCandidatePriority));
-  EXPECT_EQ(
-      IceCandidateTypeToStatsType(cricket::PRFLX_PORT_TYPE),
-      ExtractStatsValue(StatsReport::kStatsReportTypeIceRemoteCandidate,
-                        reports, StatsReport::kStatsValueNameCandidateType));
-  EXPECT_EQ(kNotFound,
-            ExtractStatsValue(
-                StatsReport::kStatsReportTypeIceRemoteCandidate, reports,
-                StatsReport::kStatsValueNameCandidateNetworkType));
-}
-
-// This test verifies that all chained certificates are correctly
-// reported
-TEST_F(StatsCollectorTest, ChainedCertificateReportsCreated) {
-  // Build local certificate chain.
-  std::vector<std::string> local_ders(5);
-  local_ders[0] = "These";
-  local_ders[1] = "are";
-  local_ders[2] = "some";
-  local_ders[3] = "der";
-  local_ders[4] = "values";
-  rtc::FakeSSLCertificate local_cert(DersToPems(local_ders));
-
-  // Build remote certificate chain
-  std::vector<std::string> remote_ders(4);
-  remote_ders[0] = "A";
-  remote_ders[1] = "non-";
-  remote_ders[2] = "intersecting";
-  remote_ders[3] = "set";
-  std::unique_ptr<rtc::FakeSSLCertificate> remote_cert(
-      new rtc::FakeSSLCertificate(DersToPems(remote_ders)));
-
-  TestCertificateReports(local_cert, local_ders, std::move(remote_cert),
-                         remote_ders);
-}
-
-// This test verifies that all certificates without chains are correctly
-// reported.
-TEST_F(StatsCollectorTest, ChainlessCertificateReportsCreated) {
-  // Build local certificate.
-  std::string local_der = "This is the local der.";
-  rtc::FakeSSLCertificate local_cert(DerToPem(local_der));
-
-  // Build remote certificate.
-  std::string remote_der = "This is somebody else's der.";
-  std::unique_ptr<rtc::FakeSSLCertificate> remote_cert(
-      new rtc::FakeSSLCertificate(DerToPem(remote_der)));
-
-  TestCertificateReports(local_cert, std::vector<std::string>(1, local_der),
-                         std::move(remote_cert),
-                         std::vector<std::string>(1, remote_der));
-}
-
-// This test verifies that the stats are generated correctly when no
-// transport is present.
-TEST_F(StatsCollectorTest, NoTransport) {
-  StatsCollectorForTest stats(&pc_);
-
-  EXPECT_CALL(session_, GetLocalCertificate(_, _))
-      .WillRepeatedly(Return(false));
-  EXPECT_CALL(session_, GetRemoteSSLCertificate_ReturnsRawPointer(_))
-      .WillRepeatedly(Return(nullptr));
-
-  StatsReports reports;  // returned values.
-
-  // Fake stats to process.
-  cricket::TransportChannelStats channel_stats;
-  channel_stats.component = 1;
-
-  cricket::TransportStats transport_stats;
-  transport_stats.transport_name = "audio";
-  transport_stats.channel_stats.push_back(channel_stats);
-
-  SessionStats session_stats;
-  session_stats.transport_stats[transport_stats.transport_name] =
-      transport_stats;
-
-  // Configure MockWebRtcSession
-  EXPECT_CALL(session_, GetStats(_)).WillRepeatedly(Invoke(
-      [&session_stats](const ChannelNamePairs&) {
-        return std::unique_ptr<SessionStats>(
-            new SessionStats(session_stats));
-      }));
-
-  stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard);
-  stats.GetStats(NULL, &reports);
-
-  // Check that the local certificate is absent.
-  std::string local_certificate_id = ExtractStatsValue(
-      StatsReport::kStatsReportTypeComponent,
-      reports,
-      StatsReport::kStatsValueNameLocalCertificateId);
-  ASSERT_EQ(kNotFound, local_certificate_id);
-
-  // Check that the remote certificate is absent.
-  std::string remote_certificate_id = ExtractStatsValue(
-      StatsReport::kStatsReportTypeComponent,
-      reports,
-      StatsReport::kStatsValueNameRemoteCertificateId);
-  ASSERT_EQ(kNotFound, remote_certificate_id);
-
-  // Check that the negotiated ciphers are absent.
-  std::string dtls_cipher_suite =
-      ExtractStatsValue(StatsReport::kStatsReportTypeComponent, reports,
-                        StatsReport::kStatsValueNameDtlsCipher);
-  ASSERT_EQ(kNotFound, dtls_cipher_suite);
-  std::string srtp_crypto_suite =
-      ExtractStatsValue(StatsReport::kStatsReportTypeComponent, reports,
-                        StatsReport::kStatsValueNameSrtpCipher);
-  ASSERT_EQ(kNotFound, srtp_crypto_suite);
-}
-
-// This test verifies that the stats are generated correctly when the transport
-// does not have any certificates.
-TEST_F(StatsCollectorTest, NoCertificates) {
-  StatsCollectorForTest stats(&pc_);
-
-  EXPECT_CALL(session_, GetLocalCertificate(_, _))
-      .WillRepeatedly(Return(false));
-  EXPECT_CALL(session_, GetRemoteSSLCertificate_ReturnsRawPointer(_))
-      .WillRepeatedly(Return(nullptr));
-
-  StatsReports reports;  // returned values.
-
-  // Fake stats to process.
-  cricket::TransportChannelStats channel_stats;
-  channel_stats.component = 1;
-
-  cricket::TransportStats transport_stats;
-  transport_stats.transport_name = "audio";
-  transport_stats.channel_stats.push_back(channel_stats);
-
-  SessionStats session_stats;
-  session_stats.transport_stats[transport_stats.transport_name] =
-      transport_stats;
-
-  // Configure MockWebRtcSession
-  EXPECT_CALL(session_, GetStats(_)).WillRepeatedly(Invoke(
-      [&session_stats](const ChannelNamePairs&) {
-        return std::unique_ptr<SessionStats>(
-            new SessionStats(session_stats));
-      }));
-  stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard);
-  stats.GetStats(NULL, &reports);
-
-  // Check that the local certificate is absent.
-  std::string local_certificate_id = ExtractStatsValue(
-      StatsReport::kStatsReportTypeComponent,
-      reports,
-      StatsReport::kStatsValueNameLocalCertificateId);
-  ASSERT_EQ(kNotFound, local_certificate_id);
-
-  // Check that the remote certificate is absent.
-  std::string remote_certificate_id = ExtractStatsValue(
-      StatsReport::kStatsReportTypeComponent,
-      reports,
-      StatsReport::kStatsValueNameRemoteCertificateId);
-  ASSERT_EQ(kNotFound, remote_certificate_id);
-}
-
-// This test verifies that a remote certificate with an unsupported digest
-// algorithm is correctly ignored.
-TEST_F(StatsCollectorTest, UnsupportedDigestIgnored) {
-  // Build a local certificate.
-  std::string local_der = "This is the local der.";
-  rtc::FakeSSLCertificate local_cert(DerToPem(local_der));
-
-  // Build a remote certificate with an unsupported digest algorithm.
-  std::string remote_der = "This is somebody else's der.";
-  std::unique_ptr<rtc::FakeSSLCertificate> remote_cert(
-      new rtc::FakeSSLCertificate(DerToPem(remote_der)));
-  remote_cert->set_digest_algorithm("foobar");
-
-  TestCertificateReports(local_cert, std::vector<std::string>(1, local_der),
-                         std::move(remote_cert), std::vector<std::string>());
-}
-
-// This test verifies that the audio/video related stats which are -1 initially
-// will be filtered out.
-TEST_F(StatsCollectorTest, FilterOutNegativeInitialValues) {
-  StatsCollectorForTest stats(&pc_);
-
-  EXPECT_CALL(session_, GetLocalCertificate(_, _))
-      .WillRepeatedly(Return(false));
-  EXPECT_CALL(session_, GetRemoteSSLCertificate_ReturnsRawPointer(_))
-      .WillRepeatedly(Return(nullptr));
-
-  MockVoiceMediaChannel* media_channel = new MockVoiceMediaChannel();
-  // The transport_name known by the voice channel.
-  const std::string kVcName("vcname");
-  cricket::VoiceChannel voice_channel(
-      worker_thread_, network_thread_, nullptr, media_engine_, media_channel,
-      kVcName, kDefaultRtcpMuxRequired, kDefaultSrtpRequired);
-
-  // Create a local stream with a local audio track and adds it to the stats.
-  if (stream_ == NULL)
-    stream_ = webrtc::MediaStream::Create("streamlabel");
-
-  rtc::scoped_refptr<FakeAudioTrackWithInitValue> local_track(
-      new rtc::RefCountedObject<FakeAudioTrackWithInitValue>(kLocalTrackId));
-  stream_->AddTrack(local_track);
-  EXPECT_CALL(session_, GetLocalTrackIdBySsrc(kSsrcOfTrack, _))
-      .WillOnce(DoAll(SetArgPointee<1>(kLocalTrackId), Return(true)));
-  stats.AddStream(stream_);
-  stats.AddLocalAudioTrack(local_track.get(), kSsrcOfTrack);
-
-  // Create a remote stream with a remote audio track and adds it to the stats.
-  rtc::scoped_refptr<webrtc::MediaStream> remote_stream(
-      webrtc::MediaStream::Create("remotestreamlabel"));
-  rtc::scoped_refptr<FakeAudioTrackWithInitValue> remote_track(
-      new rtc::RefCountedObject<FakeAudioTrackWithInitValue>(kRemoteTrackId));
-  EXPECT_CALL(session_, GetRemoteTrackIdBySsrc(kSsrcOfTrack, _))
-      .WillOnce(DoAll(SetArgPointee<1>(kRemoteTrackId), Return(true)));
-  remote_stream->AddTrack(remote_track);
-  stats.AddStream(remote_stream);
-
-  // Instruct the session to return stats containing the transport channel.
-  InitSessionStats(kVcName);
-  EXPECT_CALL(session_, GetStats(_)).WillRepeatedly(Invoke(
-      [this](const ChannelNamePairs&) {
-        return std::unique_ptr<SessionStats>(
-            new SessionStats(session_stats_));
-      }));
-
-  cricket::VoiceSenderInfo voice_sender_info;
-  voice_sender_info.add_ssrc(kSsrcOfTrack);
-  // These values are set to -1 initially in audio_send_stream.
-  // The voice_sender_info will read the values from audio_send_stream.
-  voice_sender_info.rtt_ms = -1;
-  voice_sender_info.packets_lost = -1;
-  voice_sender_info.jitter_ms = -1;
-
-  // Some of the contents in |voice_sender_info| needs to be updated from the
-  // |audio_track_|.
-  UpdateVoiceSenderInfoFromAudioTrack(local_track.get(), &voice_sender_info);
-
-  cricket::VoiceReceiverInfo voice_receiver_info;
-  voice_receiver_info.add_ssrc(kSsrcOfTrack);
-  voice_receiver_info.capture_start_ntp_time_ms = -1;
-  voice_receiver_info.audio_level = -1;
-
-  // Constructs an ssrc stats update.
-  cricket::VoiceMediaInfo stats_read;
-  stats_read.senders.push_back(voice_sender_info);
-  stats_read.receivers.push_back(voice_receiver_info);
-
-  EXPECT_CALL(session_, voice_channel()).WillRepeatedly(Return(&voice_channel));
-  EXPECT_CALL(session_, video_channel()).WillRepeatedly(ReturnNull());
-  EXPECT_CALL(*media_channel, GetStats(_))
-      .WillRepeatedly(DoAll(SetArgPointee<0>(stats_read), Return(true)));
-
-  StatsReports reports;
-  stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard);
-
-  // Get stats for the local track.
-  stats.GetStats(local_track.get(), &reports);
-  const StatsReport* report =
-      FindNthReportByType(reports, StatsReport::kStatsReportTypeSsrc, 1);
-  EXPECT_TRUE(report);
-  // The -1 will not be added to the stats report.
-  std::string value_in_report;
-  EXPECT_FALSE(
-      GetValue(report, StatsReport::kStatsValueNameRtt, &value_in_report));
-  EXPECT_FALSE(GetValue(report, StatsReport::kStatsValueNamePacketsLost,
-                        &value_in_report));
-  EXPECT_FALSE(GetValue(report, StatsReport::kStatsValueNameJitterReceived,
-                        &value_in_report));
-  EXPECT_FALSE(GetValue(report,
-                        StatsReport::kStatsValueNameEchoCancellationQualityMin,
-                        &value_in_report));
-  EXPECT_FALSE(GetValue(report, StatsReport::kStatsValueNameEchoDelayMedian,
-                        &value_in_report));
-  EXPECT_FALSE(GetValue(report, StatsReport::kStatsValueNameEchoDelayStdDev,
-                        &value_in_report));
-
-  // Get stats for the remote track.
-  reports.clear();
-  stats.GetStats(remote_track.get(), &reports);
-  report = FindNthReportByType(reports, StatsReport::kStatsReportTypeSsrc, 1);
-  EXPECT_TRUE(report);
-  EXPECT_FALSE(GetValue(report,
-                        StatsReport::kStatsValueNameCaptureStartNtpTimeMs,
-                        &value_in_report));
-  EXPECT_FALSE(GetValue(report, StatsReport::kStatsValueNameAudioInputLevel,
-                        &value_in_report));
-}
-
-// This test verifies that a local stats object can get statistics via
-// AudioTrackInterface::GetStats() method.
-TEST_F(StatsCollectorTest, GetStatsFromLocalAudioTrack) {
-  StatsCollectorForTest stats(&pc_);
-
-  EXPECT_CALL(session_, GetLocalCertificate(_, _))
-      .WillRepeatedly(Return(false));
-  EXPECT_CALL(session_, GetRemoteSSLCertificate_ReturnsRawPointer(_))
-      .WillRepeatedly(Return(nullptr));
-
-  MockVoiceMediaChannel* media_channel = new MockVoiceMediaChannel();
-  // The transport_name known by the voice channel.
-  const std::string kVcName("vcname");
-  cricket::VoiceChannel voice_channel(
-      worker_thread_, network_thread_, nullptr, media_engine_, media_channel,
-      kVcName, kDefaultRtcpMuxRequired, kDefaultSrtpRequired);
-  AddOutgoingAudioTrackStats();
-  stats.AddStream(stream_);
-  stats.AddLocalAudioTrack(audio_track_, kSsrcOfTrack);
-
-  cricket::VoiceSenderInfo voice_sender_info;
-  InitVoiceSenderInfo(&voice_sender_info);
-
-  cricket::VoiceMediaInfo stats_read;
-  StatsReports reports;  // returned values.
-  SetupAndVerifyAudioTrackStats(
-      audio_track_.get(), stream_.get(), &stats, &voice_channel, kVcName,
-      media_channel, &voice_sender_info, NULL, &stats_read, &reports);
-
-  // Verify that there is no remote report for the local audio track because
-  // we did not set it up.
-  const StatsReport* remote_report = FindNthReportByType(reports,
-      StatsReport::kStatsReportTypeRemoteSsrc, 1);
-  EXPECT_TRUE(remote_report == NULL);
-}
-
-// This test verifies that audio receive streams populate stats reports
-// correctly.
-TEST_F(StatsCollectorTest, GetStatsFromRemoteStream) {
-  StatsCollectorForTest stats(&pc_);
-
-  EXPECT_CALL(session_, GetLocalCertificate(_, _))
-      .WillRepeatedly(Return(false));
-  EXPECT_CALL(session_, GetRemoteSSLCertificate_ReturnsRawPointer(_))
-      .WillRepeatedly(Return(nullptr));
-
-  MockVoiceMediaChannel* media_channel = new MockVoiceMediaChannel();
-  // The transport_name known by the voice channel.
-  const std::string kVcName("vcname");
-  cricket::VoiceChannel voice_channel(
-      worker_thread_, network_thread_, nullptr, media_engine_, media_channel,
-      kVcName, kDefaultRtcpMuxRequired, kDefaultSrtpRequired);
-  AddIncomingAudioTrackStats();
-  stats.AddStream(stream_);
-
-  cricket::VoiceReceiverInfo voice_receiver_info;
-  InitVoiceReceiverInfo(&voice_receiver_info);
-  voice_receiver_info.codec_name = "fake_codec";
-
-  cricket::VoiceMediaInfo stats_read;
-  StatsReports reports;  // returned values.
-  SetupAndVerifyAudioTrackStats(
-      audio_track_.get(), stream_.get(), &stats, &voice_channel, kVcName,
-      media_channel, NULL, &voice_receiver_info, &stats_read, &reports);
-}
-
-// This test verifies that a local stats object won't update its statistics
-// after a RemoveLocalAudioTrack() call.
-TEST_F(StatsCollectorTest, GetStatsAfterRemoveAudioStream) {
-  StatsCollectorForTest stats(&pc_);
-
-  EXPECT_CALL(session_, GetLocalCertificate(_, _))
-      .WillRepeatedly(Return(false));
-  EXPECT_CALL(session_, GetRemoteSSLCertificate_ReturnsRawPointer(_))
-      .WillRepeatedly(Return(nullptr));
-
-  MockVoiceMediaChannel* media_channel = new MockVoiceMediaChannel();
-  // The transport_name known by the voice channel.
-  const std::string kVcName("vcname");
-  cricket::VoiceChannel voice_channel(
-      worker_thread_, network_thread_, nullptr, media_engine_, media_channel,
-      kVcName, kDefaultRtcpMuxRequired, kDefaultSrtpRequired);
-  AddOutgoingAudioTrackStats();
-  stats.AddStream(stream_);
-  stats.AddLocalAudioTrack(audio_track_.get(), kSsrcOfTrack);
-
-  // Instruct the session to return stats containing the transport channel.
-  InitSessionStats(kVcName);
-  EXPECT_CALL(session_, GetStats(_)).WillRepeatedly(Invoke(
-      [this](const ChannelNamePairs&) {
-        return std::unique_ptr<SessionStats>(
-            new SessionStats(session_stats_));
-      }));
-
-  stats.RemoveLocalAudioTrack(audio_track_.get(), kSsrcOfTrack);
-  cricket::VoiceSenderInfo voice_sender_info;
-  InitVoiceSenderInfo(&voice_sender_info);
-
-  // Constructs an ssrc stats update.
-  cricket::VoiceMediaInfo stats_read;
-  stats_read.senders.push_back(voice_sender_info);
-
-  EXPECT_CALL(session_, voice_channel()).WillRepeatedly(Return(&voice_channel));
-  EXPECT_CALL(session_, video_channel()).WillRepeatedly(ReturnNull());
-  EXPECT_CALL(*media_channel, GetStats(_))
-      .WillRepeatedly(DoAll(SetArgPointee<0>(stats_read),
-                            Return(true)));
-
-  StatsReports reports;  // returned values.
-  stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard);
-  stats.GetStats(NULL, &reports);
-
-  // The report will exist since we don't remove them in RemoveStream().
-  const StatsReport* report = FindNthReportByType(
-      reports, StatsReport::kStatsReportTypeSsrc, 1);
-  EXPECT_FALSE(report == NULL);
-  EXPECT_EQ(stats.GetTimeNow(), report->timestamp());
-  std::string track_id = ExtractSsrcStatsValue(
-      reports, StatsReport::kStatsValueNameTrackId);
-  EXPECT_EQ(kLocalTrackId, track_id);
-  std::string ssrc_id = ExtractSsrcStatsValue(
-      reports, StatsReport::kStatsValueNameSsrc);
-  EXPECT_EQ(rtc::ToString<uint32_t>(kSsrcOfTrack), ssrc_id);
-
-  // Verifies the values in the track report, no value will be changed by the
-  // AudioTrackInterface::GetSignalValue() and
-  // AudioProcessorInterface::AudioProcessorStats::GetStats();
-  VerifyVoiceSenderInfoReport(report, voice_sender_info);
-}
-
-// This test verifies that when ongoing and incoming audio tracks are using
-// the same ssrc, they populate stats reports correctly.
-TEST_F(StatsCollectorTest, LocalAndRemoteTracksWithSameSsrc) {
-  StatsCollectorForTest stats(&pc_);
-
-  EXPECT_CALL(session_, GetLocalCertificate(_, _))
-      .WillRepeatedly(Return(false));
-  EXPECT_CALL(session_, GetRemoteSSLCertificate_ReturnsRawPointer(_))
-      .WillRepeatedly(Return(nullptr));
-
-  MockVoiceMediaChannel* media_channel = new MockVoiceMediaChannel();
-  // The transport_name known by the voice channel.
-  const std::string kVcName("vcname");
-  cricket::VoiceChannel voice_channel(
-      worker_thread_, network_thread_, nullptr, media_engine_, media_channel,
-      kVcName, kDefaultRtcpMuxRequired, kDefaultSrtpRequired);
-
-  // Create a local stream with a local audio track and adds it to the stats.
-  AddOutgoingAudioTrackStats();
-  stats.AddStream(stream_);
-  stats.AddLocalAudioTrack(audio_track_.get(), kSsrcOfTrack);
-
-  // Create a remote stream with a remote audio track and adds it to the stats.
-  rtc::scoped_refptr<webrtc::MediaStream> remote_stream(
-      webrtc::MediaStream::Create("remotestreamlabel"));
-  rtc::scoped_refptr<FakeAudioTrack> remote_track(
-      new rtc::RefCountedObject<FakeAudioTrack>(kRemoteTrackId));
-  EXPECT_CALL(session_, GetRemoteTrackIdBySsrc(kSsrcOfTrack, _))
-      .WillOnce(DoAll(SetArgPointee<1>(kRemoteTrackId), Return(true)));
-  remote_stream->AddTrack(remote_track);
-  stats.AddStream(remote_stream);
-
-  // Instruct the session to return stats containing the transport channel.
-  InitSessionStats(kVcName);
-  EXPECT_CALL(session_, GetStats(_)).WillRepeatedly(Invoke(
-      [this](const ChannelNamePairs&) {
-        return std::unique_ptr<SessionStats>(
-            new SessionStats(session_stats_));
-      }));
-
-  cricket::VoiceSenderInfo voice_sender_info;
-  InitVoiceSenderInfo(&voice_sender_info);
-
-  // Some of the contents in |voice_sender_info| needs to be updated from the
-  // |audio_track_|.
-  UpdateVoiceSenderInfoFromAudioTrack(audio_track_.get(), &voice_sender_info);
-
-  cricket::VoiceReceiverInfo voice_receiver_info;
-  InitVoiceReceiverInfo(&voice_receiver_info);
-
-  // Constructs an ssrc stats update.
-  cricket::VoiceMediaInfo stats_read;
-  stats_read.senders.push_back(voice_sender_info);
-  stats_read.receivers.push_back(voice_receiver_info);
-
-  EXPECT_CALL(session_, voice_channel()).WillRepeatedly(Return(&voice_channel));
-  EXPECT_CALL(session_, video_channel()).WillRepeatedly(ReturnNull());
-  EXPECT_CALL(*media_channel, GetStats(_))
-      .WillRepeatedly(DoAll(SetArgPointee<0>(stats_read),
-                            Return(true)));
-
-  StatsReports reports;  // returned values.
-  stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard);
-
-  // Get stats for the local track.
-  stats.GetStats(audio_track_.get(), &reports);
-  const StatsReport* track_report = FindNthReportByType(
-      reports, StatsReport::kStatsReportTypeSsrc, 1);
-  EXPECT_TRUE(track_report);
-  EXPECT_EQ(stats.GetTimeNow(), track_report->timestamp());
-  std::string track_id = ExtractSsrcStatsValue(
-      reports, StatsReport::kStatsValueNameTrackId);
-  EXPECT_EQ(kLocalTrackId, track_id);
-  VerifyVoiceSenderInfoReport(track_report, voice_sender_info);
-
-  // Get stats for the remote track.
-  reports.clear();
-  stats.GetStats(remote_track.get(), &reports);
-  track_report = FindNthReportByType(reports,
-                                     StatsReport::kStatsReportTypeSsrc, 1);
-  EXPECT_TRUE(track_report);
-  EXPECT_EQ(stats.GetTimeNow(), track_report->timestamp());
-  track_id = ExtractSsrcStatsValue(reports,
-                                   StatsReport::kStatsValueNameTrackId);
-  EXPECT_EQ(kRemoteTrackId, track_id);
-  VerifyVoiceReceiverInfoReport(track_report, voice_receiver_info);
-}
-
-// This test verifies that when two outgoing audio tracks are using the same
-// ssrc at different times, they populate stats reports correctly.
-// TODO(xians): Figure out if it is possible to encapsulate the setup and
-// avoid duplication of code in test cases.
-TEST_F(StatsCollectorTest, TwoLocalTracksWithSameSsrc) {
-  StatsCollectorForTest stats(&pc_);
-
-  EXPECT_CALL(session_, GetLocalCertificate(_, _))
-      .WillRepeatedly(Return(false));
-  EXPECT_CALL(session_, GetRemoteSSLCertificate_ReturnsRawPointer(_))
-      .WillRepeatedly(Return(nullptr));
-
-  MockVoiceMediaChannel* media_channel = new MockVoiceMediaChannel();
-  // The transport_name known by the voice channel.
-  const std::string kVcName("vcname");
-  cricket::VoiceChannel voice_channel(
-      worker_thread_, network_thread_, nullptr, media_engine_, media_channel,
-      kVcName, kDefaultRtcpMuxRequired, kDefaultSrtpRequired);
-
-  // Create a local stream with a local audio track and adds it to the stats.
-  AddOutgoingAudioTrackStats();
-  stats.AddStream(stream_);
-  stats.AddLocalAudioTrack(audio_track_, kSsrcOfTrack);
-
-  cricket::VoiceSenderInfo voice_sender_info;
-  InitVoiceSenderInfo(&voice_sender_info);
-  voice_sender_info.add_ssrc(kSsrcOfTrack);
-
-  cricket::VoiceMediaInfo stats_read;
-  StatsReports reports;  // returned values.
-  SetupAndVerifyAudioTrackStats(
-      audio_track_.get(), stream_.get(), &stats, &voice_channel, kVcName,
-      media_channel, &voice_sender_info, NULL, &stats_read, &reports);
-
-  // Remove the previous audio track from the stream.
-  stream_->RemoveTrack(audio_track_.get());
-  stats.RemoveLocalAudioTrack(audio_track_.get(), kSsrcOfTrack);
-
-  // Create a new audio track and adds it to the stream and stats.
-  static const std::string kNewTrackId = "new_track_id";
-  rtc::scoped_refptr<FakeAudioTrack> new_audio_track(
-      new rtc::RefCountedObject<FakeAudioTrack>(kNewTrackId));
-  EXPECT_CALL(session_, GetLocalTrackIdBySsrc(kSsrcOfTrack, _))
-      .WillOnce(DoAll(SetArgPointee<1>(kNewTrackId), Return(true)));
-  stream_->AddTrack(new_audio_track);
-
-  stats.AddLocalAudioTrack(new_audio_track, kSsrcOfTrack);
-  stats.ClearUpdateStatsCacheForTest();
-  cricket::VoiceSenderInfo new_voice_sender_info;
-  InitVoiceSenderInfo(&new_voice_sender_info);
-  cricket::VoiceMediaInfo new_stats_read;
-  reports.clear();
-  SetupAndVerifyAudioTrackStats(
-      new_audio_track.get(), stream_.get(), &stats, &voice_channel, kVcName,
-      media_channel, &new_voice_sender_info, NULL, &new_stats_read, &reports);
-}
-
-// This test verifies that stats are correctly set in video send ssrc stats.
-TEST_F(StatsCollectorTest, VerifyVideoSendSsrcStats) {
-  StatsCollectorForTest stats(&pc_);
-
-  EXPECT_CALL(session_, GetLocalCertificate(_, _))
-      .WillRepeatedly(Return(false));
-  EXPECT_CALL(session_, GetRemoteSSLCertificate_ReturnsRawPointer(_))
-      .WillRepeatedly(Return(nullptr));
-
-  const char kVideoChannelName[] = "video";
-
-  InitSessionStats(kVideoChannelName);
-  EXPECT_CALL(session_, GetStats(_)).WillRepeatedly(Invoke(
-      [this](const ChannelNamePairs&) {
-        return std::unique_ptr<SessionStats>(
-            new SessionStats(session_stats_));
-      }));
-
-  MockVideoMediaChannel* media_channel = new MockVideoMediaChannel();
-  cricket::VideoChannel video_channel(
-      worker_thread_, network_thread_, nullptr, media_channel,
-      kVideoChannelName, kDefaultRtcpMuxRequired, kDefaultSrtpRequired);
-  StatsReports reports;  // returned values.
-  cricket::VideoSenderInfo video_sender_info;
-  cricket::VideoMediaInfo stats_read;
-
-  AddOutgoingVideoTrackStats();
-  stats.AddStream(stream_);
-
-  // Construct a stats value to read.
-  video_sender_info.add_ssrc(1234);
-  video_sender_info.frames_encoded = 10;
-  video_sender_info.qp_sum = rtc::Optional<uint64_t>(11);
-  stats_read.senders.push_back(video_sender_info);
-
-  EXPECT_CALL(session_, video_channel()).WillRepeatedly(Return(&video_channel));
-  EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull());
-  EXPECT_CALL(*media_channel, GetStats(_))
-      .WillOnce(DoAll(SetArgPointee<0>(stats_read), Return(true)));
-  stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard);
-  stats.GetStats(NULL, &reports);
-  EXPECT_EQ(rtc::ToString(video_sender_info.frames_encoded),
-            ExtractSsrcStatsValue(reports,
-                                  StatsReport::kStatsValueNameFramesEncoded));
-  EXPECT_EQ(rtc::ToString(*video_sender_info.qp_sum),
-            ExtractSsrcStatsValue(reports, StatsReport::kStatsValueNameQpSum));
-}
-
-// This test verifies that stats are correctly set in video receive ssrc stats.
-TEST_F(StatsCollectorTest, VerifyVideoReceiveSsrcStats) {
-  StatsCollectorForTest stats(&pc_);
-
-  EXPECT_CALL(session_, GetLocalCertificate(_, _))
-      .WillRepeatedly(Return(false));
-  EXPECT_CALL(session_, GetRemoteSSLCertificate_ReturnsRawPointer(_))
-      .WillRepeatedly(Return(nullptr));
-
-  const char kVideoChannelName[] = "video";
-
-  InitSessionStats(kVideoChannelName);
-  EXPECT_CALL(session_, GetStats(_)).WillRepeatedly(Invoke(
-      [this](const ChannelNamePairs&) {
-        return std::unique_ptr<SessionStats>(
-            new SessionStats(session_stats_));
-      }));
-
-  MockVideoMediaChannel* media_channel = new MockVideoMediaChannel();
-  cricket::VideoChannel video_channel(
-      worker_thread_, network_thread_, nullptr, media_channel,
-      kVideoChannelName, kDefaultRtcpMuxRequired, kDefaultSrtpRequired);
-  StatsReports reports;  // returned values.
-  cricket::VideoReceiverInfo video_receiver_info;
-  cricket::VideoMediaInfo stats_read;
-
-  AddIncomingVideoTrackStats();
-  stats.AddStream(stream_);
-
-  // Construct a stats value to read.
-  video_receiver_info.add_ssrc(1234);
-  video_receiver_info.frames_decoded = 10;
-  video_receiver_info.qp_sum = rtc::Optional<uint64_t>(11);
-  stats_read.receivers.push_back(video_receiver_info);
-
-  EXPECT_CALL(session_, video_channel()).WillRepeatedly(Return(&video_channel));
-  EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull());
-  EXPECT_CALL(*media_channel, GetStats(_))
-      .WillOnce(DoAll(SetArgPointee<0>(stats_read), Return(true)));
-  stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard);
-  stats.GetStats(NULL, &reports);
-  EXPECT_EQ(rtc::ToString(video_receiver_info.frames_decoded),
-            ExtractSsrcStatsValue(reports,
-                                  StatsReport::kStatsValueNameFramesDecoded));
-  EXPECT_EQ(rtc::ToString(*video_receiver_info.qp_sum),
-            ExtractSsrcStatsValue(reports, StatsReport::kStatsValueNameQpSum));
-}
-
-}  // namespace webrtc
diff --git a/pc/streamcollection.h b/pc/streamcollection.h
deleted file mode 100644
index b4d1f27..0000000
--- a/pc/streamcollection.h
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- *  Copyright 2011 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_PC_STREAMCOLLECTION_H_
-#define WEBRTC_PC_STREAMCOLLECTION_H_
-
-#include <string>
-#include <vector>
-
-#include "webrtc/api/peerconnectioninterface.h"
-
-namespace webrtc {
-
-// Implementation of StreamCollection.
-class StreamCollection : public StreamCollectionInterface {
- public:
-  static rtc::scoped_refptr<StreamCollection> Create() {
-    rtc::RefCountedObject<StreamCollection>* implementation =
-         new rtc::RefCountedObject<StreamCollection>();
-    return implementation;
-  }
-
-  static rtc::scoped_refptr<StreamCollection> Create(
-      StreamCollection* streams) {
-    rtc::RefCountedObject<StreamCollection>* implementation =
-         new rtc::RefCountedObject<StreamCollection>(streams);
-    return implementation;
-  }
-
-  virtual size_t count() {
-    return media_streams_.size();
-  }
-
-  virtual MediaStreamInterface* at(size_t index) {
-    return media_streams_.at(index);
-  }
-
-  virtual MediaStreamInterface* find(const std::string& label) {
-    for (StreamVector::iterator it = media_streams_.begin();
-         it != media_streams_.end(); ++it) {
-      if ((*it)->label().compare(label) == 0) {
-        return (*it);
-      }
-    }
-    return NULL;
-  }
-
-  virtual MediaStreamTrackInterface* FindAudioTrack(
-      const std::string& id) {
-    for (size_t i = 0; i < media_streams_.size(); ++i) {
-      MediaStreamTrackInterface* track = media_streams_[i]->FindAudioTrack(id);
-      if (track) {
-        return track;
-      }
-    }
-    return NULL;
-  }
-
-  virtual MediaStreamTrackInterface* FindVideoTrack(
-      const std::string& id) {
-    for (size_t i = 0; i < media_streams_.size(); ++i) {
-      MediaStreamTrackInterface* track = media_streams_[i]->FindVideoTrack(id);
-      if (track) {
-        return track;
-      }
-    }
-    return NULL;
-  }
-
-  void AddStream(MediaStreamInterface* stream) {
-    for (StreamVector::iterator it = media_streams_.begin();
-         it != media_streams_.end(); ++it) {
-      if ((*it)->label().compare(stream->label()) == 0)
-        return;
-    }
-    media_streams_.push_back(stream);
-  }
-
-  void RemoveStream(MediaStreamInterface* remove_stream) {
-    for (StreamVector::iterator it = media_streams_.begin();
-         it != media_streams_.end(); ++it) {
-      if ((*it)->label().compare(remove_stream->label()) == 0) {
-        media_streams_.erase(it);
-        break;
-      }
-    }
-  }
-
- protected:
-  StreamCollection() {}
-  explicit StreamCollection(StreamCollection* original)
-      : media_streams_(original->media_streams_) {
-  }
-  typedef std::vector<rtc::scoped_refptr<MediaStreamInterface> >
-      StreamVector;
-  StreamVector media_streams_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_PC_STREAMCOLLECTION_H_
diff --git a/pc/test/DEPS b/pc/test/DEPS
deleted file mode 100644
index 17d20c1..0000000
--- a/pc/test/DEPS
+++ /dev/null
@@ -1,6 +0,0 @@
-include_rules = [
-  # Allow include of Chrome base/android to allow inclusion of headers needed
-  # for accessing the JVM and Application context in gtest.
-  "+base/android",
-  "+webrtc/modules/utility/include/jvm_android.h",
-]
diff --git a/pc/test/androidtestinitializer.cc b/pc/test/androidtestinitializer.cc
deleted file mode 100644
index d1b0dab..0000000
--- a/pc/test/androidtestinitializer.cc
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- *  Copyright 2015 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/pc/test/androidtestinitializer.h"
-
-#include <pthread.h>
-
-#include "webrtc/rtc_base/ignore_wundef.h"
-
-// Note: this dependency is dangerous since it reaches into Chromium's base.
-// There's a risk of e.g. macro clashes. This file may only be used in tests.
-// Since we use Chromes build system for creating the gtest binary, this should
-// be fine.
-RTC_PUSH_IGNORING_WUNDEF()
-#include "base/android/jni_android.h"
-RTC_POP_IGNORING_WUNDEF()
-
-#include "webrtc/modules/utility/include/jvm_android.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/ssladapter.h"
-
-namespace webrtc {
-
-namespace {
-
-static pthread_once_t g_initialize_once = PTHREAD_ONCE_INIT;
-
-// There can only be one JNI_OnLoad in each binary. So since this is a GTEST
-// C++ runner binary, we want to initialize the same global objects we normally
-// do if this had been a Java binary.
-void EnsureInitializedOnce() {
-  RTC_CHECK(::base::android::IsVMInitialized());
-  JNIEnv* jni = ::base::android::AttachCurrentThread();
-  JavaVM* jvm = NULL;
-  RTC_CHECK_EQ(0, jni->GetJavaVM(&jvm));
-
-  RTC_CHECK(rtc::InitializeSSL()) << "Failed to InitializeSSL()";
-
-  webrtc::JVM::Initialize(jvm);
-}
-
-}  // anonymous namespace
-
-void InitializeAndroidObjects() {
-  RTC_CHECK_EQ(0, pthread_once(&g_initialize_once, &EnsureInitializedOnce));
-}
-
-}  // namespace webrtc
diff --git a/pc/test/androidtestinitializer.h b/pc/test/androidtestinitializer.h
deleted file mode 100644
index 48df9cc..0000000
--- a/pc/test/androidtestinitializer.h
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- *  Copyright 2015 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_PC_TEST_ANDROIDTESTINITIALIZER_H_
-#define WEBRTC_PC_TEST_ANDROIDTESTINITIALIZER_H_
-
-namespace webrtc {
-
-void InitializeAndroidObjects();
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_PC_TEST_ANDROIDTESTINITIALIZER_H_
diff --git a/pc/test/fakeaudiocapturemodule.cc b/pc/test/fakeaudiocapturemodule.cc
deleted file mode 100644
index 0d367cb..0000000
--- a/pc/test/fakeaudiocapturemodule.cc
+++ /dev/null
@@ -1,639 +0,0 @@
-/*
- *  Copyright 2012 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/pc/test/fakeaudiocapturemodule.h"
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/refcount.h"
-#include "webrtc/rtc_base/thread.h"
-#include "webrtc/rtc_base/timeutils.h"
-
-// Audio sample value that is high enough that it doesn't occur naturally when
-// frames are being faked. E.g. NetEq will not generate this large sample value
-// unless it has received an audio frame containing a sample of this value.
-// Even simpler buffers would likely just contain audio sample values of 0.
-static const int kHighSampleValue = 10000;
-
-// Same value as src/modules/audio_device/main/source/audio_device_config.h in
-// https://code.google.com/p/webrtc/
-static const int kAdmMaxIdleTimeProcess = 1000;
-
-// Constants here are derived by running VoE using a real ADM.
-// The constants correspond to 10ms of mono audio at 44kHz.
-static const int kTimePerFrameMs = 10;
-static const uint8_t kNumberOfChannels = 1;
-static const int kSamplesPerSecond = 44000;
-static const int kTotalDelayMs = 0;
-static const int kClockDriftMs = 0;
-static const uint32_t kMaxVolume = 14392;
-
-enum {
-  MSG_START_PROCESS,
-  MSG_RUN_PROCESS,
-};
-
-FakeAudioCaptureModule::FakeAudioCaptureModule()
-    : last_process_time_ms_(0),
-      audio_callback_(nullptr),
-      recording_(false),
-      playing_(false),
-      play_is_initialized_(false),
-      rec_is_initialized_(false),
-      current_mic_level_(kMaxVolume),
-      started_(false),
-      next_frame_time_(0),
-      frames_received_(0) {
-}
-
-FakeAudioCaptureModule::~FakeAudioCaptureModule() {
-  if (process_thread_) {
-    process_thread_->Stop();
-  }
-}
-
-rtc::scoped_refptr<FakeAudioCaptureModule> FakeAudioCaptureModule::Create() {
-  rtc::scoped_refptr<FakeAudioCaptureModule> capture_module(
-      new rtc::RefCountedObject<FakeAudioCaptureModule>());
-  if (!capture_module->Initialize()) {
-    return nullptr;
-  }
-  return capture_module;
-}
-
-int FakeAudioCaptureModule::frames_received() const {
-  rtc::CritScope cs(&crit_);
-  return frames_received_;
-}
-
-int64_t FakeAudioCaptureModule::TimeUntilNextProcess() {
-  const int64_t current_time = rtc::TimeMillis();
-  if (current_time < last_process_time_ms_) {
-    // TODO: wraparound could be handled more gracefully.
-    return 0;
-  }
-  const int64_t elapsed_time = current_time - last_process_time_ms_;
-  if (kAdmMaxIdleTimeProcess < elapsed_time) {
-    return 0;
-  }
-  return kAdmMaxIdleTimeProcess - elapsed_time;
-}
-
-void FakeAudioCaptureModule::Process() {
-  last_process_time_ms_ = rtc::TimeMillis();
-}
-
-int32_t FakeAudioCaptureModule::ActiveAudioLayer(
-    AudioLayer* /*audio_layer*/) const {
-  RTC_NOTREACHED();
-  return 0;
-}
-
-webrtc::AudioDeviceModule::ErrorCode FakeAudioCaptureModule::LastError() const {
-  RTC_NOTREACHED();
-  return webrtc::AudioDeviceModule::kAdmErrNone;
-}
-
-int32_t FakeAudioCaptureModule::RegisterEventObserver(
-    webrtc::AudioDeviceObserver* /*event_callback*/) {
-  // Only used to report warnings and errors. This fake implementation won't
-  // generate any so discard this callback.
-  return 0;
-}
-
-int32_t FakeAudioCaptureModule::RegisterAudioCallback(
-    webrtc::AudioTransport* audio_callback) {
-  rtc::CritScope cs(&crit_callback_);
-  audio_callback_ = audio_callback;
-  return 0;
-}
-
-int32_t FakeAudioCaptureModule::Init() {
-  // Initialize is called by the factory method. Safe to ignore this Init call.
-  return 0;
-}
-
-int32_t FakeAudioCaptureModule::Terminate() {
-  // Clean up in the destructor. No action here, just success.
-  return 0;
-}
-
-bool FakeAudioCaptureModule::Initialized() const {
-  RTC_NOTREACHED();
-  return 0;
-}
-
-int16_t FakeAudioCaptureModule::PlayoutDevices() {
-  RTC_NOTREACHED();
-  return 0;
-}
-
-int16_t FakeAudioCaptureModule::RecordingDevices() {
-  RTC_NOTREACHED();
-  return 0;
-}
-
-int32_t FakeAudioCaptureModule::PlayoutDeviceName(
-    uint16_t /*index*/,
-    char /*name*/[webrtc::kAdmMaxDeviceNameSize],
-    char /*guid*/[webrtc::kAdmMaxGuidSize]) {
-  RTC_NOTREACHED();
-  return 0;
-}
-
-int32_t FakeAudioCaptureModule::RecordingDeviceName(
-    uint16_t /*index*/,
-    char /*name*/[webrtc::kAdmMaxDeviceNameSize],
-    char /*guid*/[webrtc::kAdmMaxGuidSize]) {
-  RTC_NOTREACHED();
-  return 0;
-}
-
-int32_t FakeAudioCaptureModule::SetPlayoutDevice(uint16_t /*index*/) {
-  // No playout device, just playing from file. Return success.
-  return 0;
-}
-
-int32_t FakeAudioCaptureModule::SetPlayoutDevice(WindowsDeviceType /*device*/) {
-  if (play_is_initialized_) {
-    return -1;
-  }
-  return 0;
-}
-
-int32_t FakeAudioCaptureModule::SetRecordingDevice(uint16_t /*index*/) {
-  // No recording device, just dropping audio. Return success.
-  return 0;
-}
-
-int32_t FakeAudioCaptureModule::SetRecordingDevice(
-    WindowsDeviceType /*device*/) {
-  if (rec_is_initialized_) {
-    return -1;
-  }
-  return 0;
-}
-
-int32_t FakeAudioCaptureModule::PlayoutIsAvailable(bool* /*available*/) {
-  RTC_NOTREACHED();
-  return 0;
-}
-
-int32_t FakeAudioCaptureModule::InitPlayout() {
-  play_is_initialized_ = true;
-  return 0;
-}
-
-bool FakeAudioCaptureModule::PlayoutIsInitialized() const {
-  return play_is_initialized_;
-}
-
-int32_t FakeAudioCaptureModule::RecordingIsAvailable(bool* /*available*/) {
-  RTC_NOTREACHED();
-  return 0;
-}
-
-int32_t FakeAudioCaptureModule::InitRecording() {
-  rec_is_initialized_ = true;
-  return 0;
-}
-
-bool FakeAudioCaptureModule::RecordingIsInitialized() const {
-  return rec_is_initialized_;
-}
-
-int32_t FakeAudioCaptureModule::StartPlayout() {
-  if (!play_is_initialized_) {
-    return -1;
-  }
-  {
-    rtc::CritScope cs(&crit_);
-    playing_ = true;
-  }
-  bool start = true;
-  UpdateProcessing(start);
-  return 0;
-}
-
-int32_t FakeAudioCaptureModule::StopPlayout() {
-  bool start = false;
-  {
-    rtc::CritScope cs(&crit_);
-    playing_ = false;
-    start = ShouldStartProcessing();
-  }
-  UpdateProcessing(start);
-  return 0;
-}
-
-bool FakeAudioCaptureModule::Playing() const {
-  rtc::CritScope cs(&crit_);
-  return playing_;
-}
-
-int32_t FakeAudioCaptureModule::StartRecording() {
-  if (!rec_is_initialized_) {
-    return -1;
-  }
-  {
-    rtc::CritScope cs(&crit_);
-    recording_ = true;
-  }
-  bool start = true;
-  UpdateProcessing(start);
-  return 0;
-}
-
-int32_t FakeAudioCaptureModule::StopRecording() {
-  bool start = false;
-  {
-    rtc::CritScope cs(&crit_);
-    recording_ = false;
-    start = ShouldStartProcessing();
-  }
-  UpdateProcessing(start);
-  return 0;
-}
-
-bool FakeAudioCaptureModule::Recording() const {
-  rtc::CritScope cs(&crit_);
-  return recording_;
-}
-
-int32_t FakeAudioCaptureModule::SetAGC(bool /*enable*/) {
-  // No AGC but not needed since audio is pregenerated. Return success.
-  return 0;
-}
-
-bool FakeAudioCaptureModule::AGC() const {
-  RTC_NOTREACHED();
-  return 0;
-}
-
-int32_t FakeAudioCaptureModule::InitSpeaker() {
-  // No speaker, just playing from file. Return success.
-  return 0;
-}
-
-bool FakeAudioCaptureModule::SpeakerIsInitialized() const {
-  RTC_NOTREACHED();
-  return 0;
-}
-
-int32_t FakeAudioCaptureModule::InitMicrophone() {
-  // No microphone, just playing from file. Return success.
-  return 0;
-}
-
-bool FakeAudioCaptureModule::MicrophoneIsInitialized() const {
-  RTC_NOTREACHED();
-  return 0;
-}
-
-int32_t FakeAudioCaptureModule::SpeakerVolumeIsAvailable(bool* /*available*/) {
-  RTC_NOTREACHED();
-  return 0;
-}
-
-int32_t FakeAudioCaptureModule::SetSpeakerVolume(uint32_t /*volume*/) {
-  RTC_NOTREACHED();
-  return 0;
-}
-
-int32_t FakeAudioCaptureModule::SpeakerVolume(uint32_t* /*volume*/) const {
-  RTC_NOTREACHED();
-  return 0;
-}
-
-int32_t FakeAudioCaptureModule::MaxSpeakerVolume(
-    uint32_t* /*max_volume*/) const {
-  RTC_NOTREACHED();
-  return 0;
-}
-
-int32_t FakeAudioCaptureModule::MinSpeakerVolume(
-    uint32_t* /*min_volume*/) const {
-  RTC_NOTREACHED();
-  return 0;
-}
-
-int32_t FakeAudioCaptureModule::MicrophoneVolumeIsAvailable(
-    bool* /*available*/) {
-  RTC_NOTREACHED();
-  return 0;
-}
-
-int32_t FakeAudioCaptureModule::SetMicrophoneVolume(uint32_t volume) {
-  rtc::CritScope cs(&crit_);
-  current_mic_level_ = volume;
-  return 0;
-}
-
-int32_t FakeAudioCaptureModule::MicrophoneVolume(uint32_t* volume) const {
-  rtc::CritScope cs(&crit_);
-  *volume = current_mic_level_;
-  return 0;
-}
-
-int32_t FakeAudioCaptureModule::MaxMicrophoneVolume(
-    uint32_t* max_volume) const {
-  *max_volume = kMaxVolume;
-  return 0;
-}
-
-int32_t FakeAudioCaptureModule::MinMicrophoneVolume(
-    uint32_t* /*min_volume*/) const {
-  RTC_NOTREACHED();
-  return 0;
-}
-
-int32_t FakeAudioCaptureModule::SpeakerMuteIsAvailable(bool* /*available*/) {
-  RTC_NOTREACHED();
-  return 0;
-}
-
-int32_t FakeAudioCaptureModule::SetSpeakerMute(bool /*enable*/) {
-  RTC_NOTREACHED();
-  return 0;
-}
-
-int32_t FakeAudioCaptureModule::SpeakerMute(bool* /*enabled*/) const {
-  RTC_NOTREACHED();
-  return 0;
-}
-
-int32_t FakeAudioCaptureModule::MicrophoneMuteIsAvailable(bool* /*available*/) {
-  RTC_NOTREACHED();
-  return 0;
-}
-
-int32_t FakeAudioCaptureModule::SetMicrophoneMute(bool /*enable*/) {
-  RTC_NOTREACHED();
-  return 0;
-}
-
-int32_t FakeAudioCaptureModule::MicrophoneMute(bool* /*enabled*/) const {
-  RTC_NOTREACHED();
-  return 0;
-}
-
-int32_t FakeAudioCaptureModule::StereoPlayoutIsAvailable(
-    bool* available) const {
-  // No recording device, just dropping audio. Stereo can be dropped just
-  // as easily as mono.
-  *available = true;
-  return 0;
-}
-
-int32_t FakeAudioCaptureModule::SetStereoPlayout(bool /*enable*/) {
-  // No recording device, just dropping audio. Stereo can be dropped just
-  // as easily as mono.
-  return 0;
-}
-
-int32_t FakeAudioCaptureModule::StereoPlayout(bool* /*enabled*/) const {
-  RTC_NOTREACHED();
-  return 0;
-}
-
-int32_t FakeAudioCaptureModule::StereoRecordingIsAvailable(
-    bool* available) const {
-  // Keep thing simple. No stereo recording.
-  *available = false;
-  return 0;
-}
-
-int32_t FakeAudioCaptureModule::SetStereoRecording(bool enable) {
-  if (!enable) {
-    return 0;
-  }
-  return -1;
-}
-
-int32_t FakeAudioCaptureModule::StereoRecording(bool* /*enabled*/) const {
-  RTC_NOTREACHED();
-  return 0;
-}
-
-int32_t FakeAudioCaptureModule::SetRecordingChannel(
-    const ChannelType channel) {
-  if (channel != AudioDeviceModule::kChannelBoth) {
-    // There is no right or left in mono. I.e. kChannelBoth should be used for
-    // mono.
-    RTC_NOTREACHED();
-    return -1;
-  }
-  return 0;
-}
-
-int32_t FakeAudioCaptureModule::RecordingChannel(ChannelType* channel) const {
-  // Stereo recording not supported. However, WebRTC ADM returns kChannelBoth
-  // in that case. Do the same here.
-  *channel = AudioDeviceModule::kChannelBoth;
-  return 0;
-}
-
-int32_t FakeAudioCaptureModule::PlayoutDelay(uint16_t* delay_ms) const {
-  // No delay since audio frames are dropped.
-  *delay_ms = 0;
-  return 0;
-}
-
-int32_t FakeAudioCaptureModule::RecordingDelay(uint16_t* /*delay_ms*/) const {
-  RTC_NOTREACHED();
-  return 0;
-}
-
-int32_t FakeAudioCaptureModule::SetRecordingSampleRate(
-    const uint32_t /*samples_per_sec*/) {
-  RTC_NOTREACHED();
-  return 0;
-}
-
-int32_t FakeAudioCaptureModule::RecordingSampleRate(
-    uint32_t* /*samples_per_sec*/) const {
-  RTC_NOTREACHED();
-  return 0;
-}
-
-int32_t FakeAudioCaptureModule::SetPlayoutSampleRate(
-    const uint32_t /*samples_per_sec*/) {
-  RTC_NOTREACHED();
-  return 0;
-}
-
-int32_t FakeAudioCaptureModule::PlayoutSampleRate(
-    uint32_t* /*samples_per_sec*/) const {
-  RTC_NOTREACHED();
-  return 0;
-}
-
-int32_t FakeAudioCaptureModule::SetLoudspeakerStatus(bool /*enable*/) {
-  RTC_NOTREACHED();
-  return 0;
-}
-
-int32_t FakeAudioCaptureModule::GetLoudspeakerStatus(bool* /*enabled*/) const {
-  RTC_NOTREACHED();
-  return 0;
-}
-
-void FakeAudioCaptureModule::OnMessage(rtc::Message* msg) {
-  switch (msg->message_id) {
-    case MSG_START_PROCESS:
-      StartProcessP();
-      break;
-    case MSG_RUN_PROCESS:
-      ProcessFrameP();
-      break;
-    default:
-      // All existing messages should be caught. Getting here should never
-      // happen.
-      RTC_NOTREACHED();
-  }
-}
-
-bool FakeAudioCaptureModule::Initialize() {
-  // Set the send buffer samples high enough that it would not occur on the
-  // remote side unless a packet containing a sample of that magnitude has been
-  // sent to it. Note that the audio processing pipeline will likely distort the
-  // original signal.
-  SetSendBuffer(kHighSampleValue);
-  last_process_time_ms_ = rtc::TimeMillis();
-  return true;
-}
-
-void FakeAudioCaptureModule::SetSendBuffer(int value) {
-  Sample* buffer_ptr = reinterpret_cast<Sample*>(send_buffer_);
-  const size_t buffer_size_in_samples =
-      sizeof(send_buffer_) / kNumberBytesPerSample;
-  for (size_t i = 0; i < buffer_size_in_samples; ++i) {
-    buffer_ptr[i] = value;
-  }
-}
-
-void FakeAudioCaptureModule::ResetRecBuffer() {
-  memset(rec_buffer_, 0, sizeof(rec_buffer_));
-}
-
-bool FakeAudioCaptureModule::CheckRecBuffer(int value) {
-  const Sample* buffer_ptr = reinterpret_cast<const Sample*>(rec_buffer_);
-  const size_t buffer_size_in_samples =
-      sizeof(rec_buffer_) / kNumberBytesPerSample;
-  for (size_t i = 0; i < buffer_size_in_samples; ++i) {
-    if (buffer_ptr[i] >= value) return true;
-  }
-  return false;
-}
-
-bool FakeAudioCaptureModule::ShouldStartProcessing() {
-  return recording_ || playing_;
-}
-
-void FakeAudioCaptureModule::UpdateProcessing(bool start) {
-  if (start) {
-    if (!process_thread_) {
-      process_thread_ = rtc::Thread::Create();
-      process_thread_->Start();
-    }
-    process_thread_->Post(RTC_FROM_HERE, this, MSG_START_PROCESS);
-  } else {
-    if (process_thread_) {
-      process_thread_->Stop();
-      process_thread_.reset(nullptr);
-    }
-    started_ = false;
-  }
-}
-
-void FakeAudioCaptureModule::StartProcessP() {
-  RTC_CHECK(process_thread_->IsCurrent());
-  if (started_) {
-    // Already started.
-    return;
-  }
-  ProcessFrameP();
-}
-
-void FakeAudioCaptureModule::ProcessFrameP() {
-  RTC_CHECK(process_thread_->IsCurrent());
-  if (!started_) {
-    next_frame_time_ = rtc::TimeMillis();
-    started_ = true;
-  }
-
-  {
-    rtc::CritScope cs(&crit_);
-    // Receive and send frames every kTimePerFrameMs.
-    if (playing_) {
-      ReceiveFrameP();
-    }
-    if (recording_) {
-      SendFrameP();
-    }
-  }
-
-  next_frame_time_ += kTimePerFrameMs;
-  const int64_t current_time = rtc::TimeMillis();
-  const int64_t wait_time =
-      (next_frame_time_ > current_time) ? next_frame_time_ - current_time : 0;
-  process_thread_->PostDelayed(RTC_FROM_HERE, wait_time, this, MSG_RUN_PROCESS);
-}
-
-void FakeAudioCaptureModule::ReceiveFrameP() {
-  RTC_CHECK(process_thread_->IsCurrent());
-  {
-    rtc::CritScope cs(&crit_callback_);
-    if (!audio_callback_) {
-      return;
-    }
-    ResetRecBuffer();
-    size_t nSamplesOut = 0;
-    int64_t elapsed_time_ms = 0;
-    int64_t ntp_time_ms = 0;
-    if (audio_callback_->NeedMorePlayData(kNumberSamples, kNumberBytesPerSample,
-                                         kNumberOfChannels, kSamplesPerSecond,
-                                         rec_buffer_, nSamplesOut,
-                                         &elapsed_time_ms, &ntp_time_ms) != 0) {
-      RTC_NOTREACHED();
-    }
-    RTC_CHECK(nSamplesOut == kNumberSamples);
-  }
-  // The SetBuffer() function ensures that after decoding, the audio buffer
-  // should contain samples of similar magnitude (there is likely to be some
-  // distortion due to the audio pipeline). If one sample is detected to
-  // have the same or greater magnitude somewhere in the frame, an actual frame
-  // has been received from the remote side (i.e. faked frames are not being
-  // pulled).
-  if (CheckRecBuffer(kHighSampleValue)) {
-    rtc::CritScope cs(&crit_);
-    ++frames_received_;
-  }
-}
-
-void FakeAudioCaptureModule::SendFrameP() {
-  RTC_CHECK(process_thread_->IsCurrent());
-  rtc::CritScope cs(&crit_callback_);
-  if (!audio_callback_) {
-    return;
-  }
-  bool key_pressed = false;
-  uint32_t current_mic_level = 0;
-  MicrophoneVolume(&current_mic_level);
-  if (audio_callback_->RecordedDataIsAvailable(send_buffer_, kNumberSamples,
-                                              kNumberBytesPerSample,
-                                              kNumberOfChannels,
-                                              kSamplesPerSecond, kTotalDelayMs,
-                                              kClockDriftMs, current_mic_level,
-                                              key_pressed,
-                                              current_mic_level) != 0) {
-    RTC_NOTREACHED();
-  }
-  SetMicrophoneVolume(current_mic_level);
-}
diff --git a/pc/test/fakeaudiocapturemodule.h b/pc/test/fakeaudiocapturemodule.h
deleted file mode 100644
index 91879b0..0000000
--- a/pc/test/fakeaudiocapturemodule.h
+++ /dev/null
@@ -1,257 +0,0 @@
-/*
- *  Copyright 2012 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.
- */
-
-// This class implements an AudioCaptureModule that can be used to detect if
-// audio is being received properly if it is fed by another AudioCaptureModule
-// in some arbitrary audio pipeline where they are connected. It does not play
-// out or record any audio so it does not need access to any hardware and can
-// therefore be used in the gtest testing framework.
-
-// Note P postfix of a function indicates that it should only be called by the
-// processing thread.
-
-#ifndef WEBRTC_PC_TEST_FAKEAUDIOCAPTUREMODULE_H_
-#define WEBRTC_PC_TEST_FAKEAUDIOCAPTUREMODULE_H_
-
-#include <memory>
-
-#include "webrtc/common_types.h"
-#include "webrtc/modules/audio_device/include/audio_device.h"
-#include "webrtc/rtc_base/basictypes.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/messagehandler.h"
-#include "webrtc/rtc_base/scoped_ref_ptr.h"
-
-namespace rtc {
-class Thread;
-}  // namespace rtc
-
-class FakeAudioCaptureModule
-    : public webrtc::AudioDeviceModule,
-      public rtc::MessageHandler {
- public:
-  typedef uint16_t Sample;
-
-  // The value for the following constants have been derived by running VoE
-  // using a real ADM. The constants correspond to 10ms of mono audio at 44kHz.
-  static const size_t kNumberSamples = 440;
-  static const size_t kNumberBytesPerSample = sizeof(Sample);
-
-  // Creates a FakeAudioCaptureModule or returns NULL on failure.
-  static rtc::scoped_refptr<FakeAudioCaptureModule> Create();
-
-  // Returns the number of frames that have been successfully pulled by the
-  // instance. Note that correctly detecting success can only be done if the
-  // pulled frame was generated/pushed from a FakeAudioCaptureModule.
-  int frames_received() const;
-
-  // Following functions are inherited from webrtc::AudioDeviceModule.
-  // Only functions called by PeerConnection are implemented, the rest do
-  // nothing and return success. If a function is not expected to be called by
-  // PeerConnection an assertion is triggered if it is in fact called.
-  int64_t TimeUntilNextProcess() override;
-  void Process() override;
-
-  int32_t ActiveAudioLayer(AudioLayer* audio_layer) const override;
-
-  ErrorCode LastError() const override;
-  int32_t RegisterEventObserver(
-      webrtc::AudioDeviceObserver* event_callback) override;
-
-  // Note: Calling this method from a callback may result in deadlock.
-  int32_t RegisterAudioCallback(
-      webrtc::AudioTransport* audio_callback) override;
-
-  int32_t Init() override;
-  int32_t Terminate() override;
-  bool Initialized() const override;
-
-  int16_t PlayoutDevices() override;
-  int16_t RecordingDevices() override;
-  int32_t PlayoutDeviceName(uint16_t index,
-                            char name[webrtc::kAdmMaxDeviceNameSize],
-                            char guid[webrtc::kAdmMaxGuidSize]) override;
-  int32_t RecordingDeviceName(uint16_t index,
-                              char name[webrtc::kAdmMaxDeviceNameSize],
-                              char guid[webrtc::kAdmMaxGuidSize]) override;
-
-  int32_t SetPlayoutDevice(uint16_t index) override;
-  int32_t SetPlayoutDevice(WindowsDeviceType device) override;
-  int32_t SetRecordingDevice(uint16_t index) override;
-  int32_t SetRecordingDevice(WindowsDeviceType device) override;
-
-  int32_t PlayoutIsAvailable(bool* available) override;
-  int32_t InitPlayout() override;
-  bool PlayoutIsInitialized() const override;
-  int32_t RecordingIsAvailable(bool* available) override;
-  int32_t InitRecording() override;
-  bool RecordingIsInitialized() const override;
-
-  int32_t StartPlayout() override;
-  int32_t StopPlayout() override;
-  bool Playing() const override;
-  int32_t StartRecording() override;
-  int32_t StopRecording() override;
-  bool Recording() const override;
-
-  int32_t SetAGC(bool enable) override;
-  bool AGC() const override;
-
-  int32_t InitSpeaker() override;
-  bool SpeakerIsInitialized() const override;
-  int32_t InitMicrophone() override;
-  bool MicrophoneIsInitialized() const override;
-
-  int32_t SpeakerVolumeIsAvailable(bool* available) override;
-  int32_t SetSpeakerVolume(uint32_t volume) override;
-  int32_t SpeakerVolume(uint32_t* volume) const override;
-  int32_t MaxSpeakerVolume(uint32_t* max_volume) const override;
-  int32_t MinSpeakerVolume(uint32_t* min_volume) const override;
-
-  int32_t MicrophoneVolumeIsAvailable(bool* available) override;
-  int32_t SetMicrophoneVolume(uint32_t volume) override;
-  int32_t MicrophoneVolume(uint32_t* volume) const override;
-  int32_t MaxMicrophoneVolume(uint32_t* max_volume) const override;
-
-  int32_t MinMicrophoneVolume(uint32_t* min_volume) const override;
-
-  int32_t SpeakerMuteIsAvailable(bool* available) override;
-  int32_t SetSpeakerMute(bool enable) override;
-  int32_t SpeakerMute(bool* enabled) const override;
-
-  int32_t MicrophoneMuteIsAvailable(bool* available) override;
-  int32_t SetMicrophoneMute(bool enable) override;
-  int32_t MicrophoneMute(bool* enabled) const override;
-
-  int32_t StereoPlayoutIsAvailable(bool* available) const override;
-  int32_t SetStereoPlayout(bool enable) override;
-  int32_t StereoPlayout(bool* enabled) const override;
-  int32_t StereoRecordingIsAvailable(bool* available) const override;
-  int32_t SetStereoRecording(bool enable) override;
-  int32_t StereoRecording(bool* enabled) const override;
-  int32_t SetRecordingChannel(const ChannelType channel) override;
-  int32_t RecordingChannel(ChannelType* channel) const override;
-
-  int32_t PlayoutDelay(uint16_t* delay_ms) const override;
-  int32_t RecordingDelay(uint16_t* delay_ms) const override;
-
-  int32_t SetRecordingSampleRate(const uint32_t samples_per_sec) override;
-  int32_t RecordingSampleRate(uint32_t* samples_per_sec) const override;
-  int32_t SetPlayoutSampleRate(const uint32_t samples_per_sec) override;
-  int32_t PlayoutSampleRate(uint32_t* samples_per_sec) const override;
-
-  int32_t SetLoudspeakerStatus(bool enable) override;
-  int32_t GetLoudspeakerStatus(bool* enabled) const override;
-  bool BuiltInAECIsAvailable() const override { return false; }
-  int32_t EnableBuiltInAEC(bool enable) override { return -1; }
-  bool BuiltInAGCIsAvailable() const override { return false; }
-  int32_t EnableBuiltInAGC(bool enable) override { return -1; }
-  bool BuiltInNSIsAvailable() const override { return false; }
-  int32_t EnableBuiltInNS(bool enable) override { return -1; }
-#if defined(WEBRTC_IOS)
-  int GetPlayoutAudioParameters(
-      webrtc::AudioParameters* params) const override {
-    return -1;
-  }
-  int GetRecordAudioParameters(webrtc::AudioParameters* params) const override {
-    return -1;
-  }
-#endif  // WEBRTC_IOS
-
-  // End of functions inherited from webrtc::AudioDeviceModule.
-
-  // The following function is inherited from rtc::MessageHandler.
-  void OnMessage(rtc::Message* msg) override;
-
- protected:
-  // The constructor is protected because the class needs to be created as a
-  // reference counted object (for memory managment reasons). It could be
-  // exposed in which case the burden of proper instantiation would be put on
-  // the creator of a FakeAudioCaptureModule instance. To create an instance of
-  // this class use the Create(..) API.
-  explicit FakeAudioCaptureModule();
-  // The destructor is protected because it is reference counted and should not
-  // be deleted directly.
-  virtual ~FakeAudioCaptureModule();
-
- private:
-  // Initializes the state of the FakeAudioCaptureModule. This API is called on
-  // creation by the Create() API.
-  bool Initialize();
-  // SetBuffer() sets all samples in send_buffer_ to |value|.
-  void SetSendBuffer(int value);
-  // Resets rec_buffer_. I.e., sets all rec_buffer_ samples to 0.
-  void ResetRecBuffer();
-  // Returns true if rec_buffer_ contains one or more sample greater than or
-  // equal to |value|.
-  bool CheckRecBuffer(int value);
-
-  // Returns true/false depending on if recording or playback has been
-  // enabled/started.
-  bool ShouldStartProcessing();
-
-  // Starts or stops the pushing and pulling of audio frames.
-  void UpdateProcessing(bool start);
-
-  // Starts the periodic calling of ProcessFrame() in a thread safe way.
-  void StartProcessP();
-  // Periodcally called function that ensures that frames are pulled and pushed
-  // periodically if enabled/started.
-  void ProcessFrameP();
-  // Pulls frames from the registered webrtc::AudioTransport.
-  void ReceiveFrameP();
-  // Pushes frames to the registered webrtc::AudioTransport.
-  void SendFrameP();
-
-  // The time in milliseconds when Process() was last called or 0 if no call
-  // has been made.
-  int64_t last_process_time_ms_;
-
-  // Callback for playout and recording.
-  webrtc::AudioTransport* audio_callback_;
-
-  bool recording_; // True when audio is being pushed from the instance.
-  bool playing_; // True when audio is being pulled by the instance.
-
-  bool play_is_initialized_; // True when the instance is ready to pull audio.
-  bool rec_is_initialized_; // True when the instance is ready to push audio.
-
-  // Input to and output from RecordedDataIsAvailable(..) makes it possible to
-  // modify the current mic level. The implementation does not care about the
-  // mic level so it just feeds back what it receives.
-  uint32_t current_mic_level_;
-
-  // next_frame_time_ is updated in a non-drifting manner to indicate the next
-  // wall clock time the next frame should be generated and received. started_
-  // ensures that next_frame_time_ can be initialized properly on first call.
-  bool started_;
-  int64_t next_frame_time_;
-
-  std::unique_ptr<rtc::Thread> process_thread_;
-
-  // Buffer for storing samples received from the webrtc::AudioTransport.
-  char rec_buffer_[kNumberSamples * kNumberBytesPerSample];
-  // Buffer for samples to send to the webrtc::AudioTransport.
-  char send_buffer_[kNumberSamples * kNumberBytesPerSample];
-
-  // Counter of frames received that have samples of high enough amplitude to
-  // indicate that the frames are not faked somewhere in the audio pipeline
-  // (e.g. by a jitter buffer).
-  int frames_received_;
-
-  // Protects variables that are accessed from process_thread_ and
-  // the main thread.
-  rtc::CriticalSection crit_;
-  // Protects |audio_callback_| that is accessed from process_thread_ and
-  // the main thread.
-  rtc::CriticalSection crit_callback_;
-};
-
-#endif  // WEBRTC_PC_TEST_FAKEAUDIOCAPTUREMODULE_H_
diff --git a/pc/test/fakeaudiocapturemodule_unittest.cc b/pc/test/fakeaudiocapturemodule_unittest.cc
deleted file mode 100644
index 62885c2..0000000
--- a/pc/test/fakeaudiocapturemodule_unittest.cc
+++ /dev/null
@@ -1,214 +0,0 @@
-/*
- *  Copyright 2012 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/pc/test/fakeaudiocapturemodule.h"
-
-#include <algorithm>
-
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/gunit.h"
-#include "webrtc/rtc_base/scoped_ref_ptr.h"
-#include "webrtc/rtc_base/thread.h"
-
-using std::min;
-
-class FakeAdmTest : public testing::Test,
-                    public webrtc::AudioTransport {
- protected:
-  static const int kMsInSecond = 1000;
-
-  FakeAdmTest()
-      : push_iterations_(0),
-        pull_iterations_(0),
-        rec_buffer_bytes_(0) {
-    memset(rec_buffer_, 0, sizeof(rec_buffer_));
-  }
-
-  void SetUp() override {
-    fake_audio_capture_module_ = FakeAudioCaptureModule::Create();
-    EXPECT_TRUE(fake_audio_capture_module_.get() != NULL);
-  }
-
-  // Callbacks inherited from webrtc::AudioTransport.
-  // ADM is pushing data.
-  int32_t RecordedDataIsAvailable(const void* audioSamples,
-                                  const size_t nSamples,
-                                  const size_t nBytesPerSample,
-                                  const size_t nChannels,
-                                  const uint32_t samplesPerSec,
-                                  const uint32_t totalDelayMS,
-                                  const int32_t clockDrift,
-                                  const uint32_t currentMicLevel,
-                                  const bool keyPressed,
-                                  uint32_t& newMicLevel) override {
-    rtc::CritScope cs(&crit_);
-    rec_buffer_bytes_ = nSamples * nBytesPerSample;
-    if ((rec_buffer_bytes_ == 0) ||
-        (rec_buffer_bytes_ > FakeAudioCaptureModule::kNumberSamples *
-         FakeAudioCaptureModule::kNumberBytesPerSample)) {
-      ADD_FAILURE();
-      return -1;
-    }
-    memcpy(rec_buffer_, audioSamples, rec_buffer_bytes_);
-    ++push_iterations_;
-    newMicLevel = currentMicLevel;
-    return 0;
-  }
-
-  void PushCaptureData(int voe_channel,
-                       const void* audio_data,
-                       int bits_per_sample,
-                       int sample_rate,
-                       size_t number_of_channels,
-                       size_t number_of_frames) override {}
-
-  void PullRenderData(int bits_per_sample,
-                      int sample_rate,
-                      size_t number_of_channels,
-                      size_t number_of_frames,
-                      void* audio_data,
-                      int64_t* elapsed_time_ms,
-                      int64_t* ntp_time_ms) override {}
-
-  // ADM is pulling data.
-  int32_t NeedMorePlayData(const size_t nSamples,
-                           const size_t nBytesPerSample,
-                           const size_t nChannels,
-                           const uint32_t samplesPerSec,
-                           void* audioSamples,
-                           size_t& nSamplesOut,
-                           int64_t* elapsed_time_ms,
-                           int64_t* ntp_time_ms) override {
-    rtc::CritScope cs(&crit_);
-    ++pull_iterations_;
-    const size_t audio_buffer_size = nSamples * nBytesPerSample;
-    const size_t bytes_out = RecordedDataReceived() ?
-        CopyFromRecBuffer(audioSamples, audio_buffer_size):
-        GenerateZeroBuffer(audioSamples, audio_buffer_size);
-    nSamplesOut = bytes_out / nBytesPerSample;
-    *elapsed_time_ms = 0;
-    *ntp_time_ms = 0;
-    return 0;
-  }
-
-  int push_iterations() const {
-    rtc::CritScope cs(&crit_);
-    return push_iterations_;
-  }
-  int pull_iterations() const {
-    rtc::CritScope cs(&crit_);
-    return pull_iterations_;
-  }
-
-  rtc::scoped_refptr<FakeAudioCaptureModule> fake_audio_capture_module_;
-
- private:
-  bool RecordedDataReceived() const {
-    return rec_buffer_bytes_ != 0;
-  }
-  size_t GenerateZeroBuffer(void* audio_buffer, size_t audio_buffer_size) {
-    memset(audio_buffer, 0, audio_buffer_size);
-    return audio_buffer_size;
-  }
-  size_t CopyFromRecBuffer(void* audio_buffer, size_t audio_buffer_size) {
-    EXPECT_EQ(audio_buffer_size, rec_buffer_bytes_);
-    const size_t min_buffer_size = min(audio_buffer_size, rec_buffer_bytes_);
-    memcpy(audio_buffer, rec_buffer_, min_buffer_size);
-    return min_buffer_size;
-  }
-
-  rtc::CriticalSection crit_;
-
-  int push_iterations_;
-  int pull_iterations_;
-
-  char rec_buffer_[FakeAudioCaptureModule::kNumberSamples *
-                   FakeAudioCaptureModule::kNumberBytesPerSample];
-  size_t rec_buffer_bytes_;
-};
-
-TEST_F(FakeAdmTest, TestProcess) {
-  // Next process call must be some time in the future (or now).
-  EXPECT_LE(0, fake_audio_capture_module_->TimeUntilNextProcess());
-  // Process call updates TimeUntilNextProcess() but there are no guarantees on
-  // timing so just check that Process can be called successfully.
-  fake_audio_capture_module_->Process();
-}
-
-TEST_F(FakeAdmTest, PlayoutTest) {
-  EXPECT_EQ(0, fake_audio_capture_module_->RegisterAudioCallback(this));
-
-  bool stereo_available = false;
-  EXPECT_EQ(0,
-            fake_audio_capture_module_->StereoPlayoutIsAvailable(
-                &stereo_available));
-  EXPECT_TRUE(stereo_available);
-
-  EXPECT_NE(0, fake_audio_capture_module_->StartPlayout());
-  EXPECT_FALSE(fake_audio_capture_module_->PlayoutIsInitialized());
-  EXPECT_FALSE(fake_audio_capture_module_->Playing());
-  EXPECT_EQ(0, fake_audio_capture_module_->StopPlayout());
-
-  EXPECT_EQ(0, fake_audio_capture_module_->InitPlayout());
-  EXPECT_TRUE(fake_audio_capture_module_->PlayoutIsInitialized());
-  EXPECT_FALSE(fake_audio_capture_module_->Playing());
-
-  EXPECT_EQ(0, fake_audio_capture_module_->StartPlayout());
-  EXPECT_TRUE(fake_audio_capture_module_->Playing());
-
-  uint16_t delay_ms = 10;
-  EXPECT_EQ(0, fake_audio_capture_module_->PlayoutDelay(&delay_ms));
-  EXPECT_EQ(0, delay_ms);
-
-  EXPECT_TRUE_WAIT(pull_iterations() > 0, kMsInSecond);
-  EXPECT_GE(0, push_iterations());
-
-  EXPECT_EQ(0, fake_audio_capture_module_->StopPlayout());
-  EXPECT_FALSE(fake_audio_capture_module_->Playing());
-}
-
-TEST_F(FakeAdmTest, RecordTest) {
-  EXPECT_EQ(0, fake_audio_capture_module_->RegisterAudioCallback(this));
-
-  bool stereo_available = false;
-  EXPECT_EQ(0, fake_audio_capture_module_->StereoRecordingIsAvailable(
-      &stereo_available));
-  EXPECT_FALSE(stereo_available);
-
-  EXPECT_NE(0, fake_audio_capture_module_->StartRecording());
-  EXPECT_FALSE(fake_audio_capture_module_->Recording());
-  EXPECT_EQ(0, fake_audio_capture_module_->StopRecording());
-
-  EXPECT_EQ(0, fake_audio_capture_module_->InitRecording());
-  EXPECT_EQ(0, fake_audio_capture_module_->StartRecording());
-  EXPECT_TRUE(fake_audio_capture_module_->Recording());
-
-  EXPECT_TRUE_WAIT(push_iterations() > 0, kMsInSecond);
-  EXPECT_GE(0, pull_iterations());
-
-  EXPECT_EQ(0, fake_audio_capture_module_->StopRecording());
-  EXPECT_FALSE(fake_audio_capture_module_->Recording());
-}
-
-TEST_F(FakeAdmTest, DuplexTest) {
-  EXPECT_EQ(0, fake_audio_capture_module_->RegisterAudioCallback(this));
-
-  EXPECT_EQ(0, fake_audio_capture_module_->InitPlayout());
-  EXPECT_EQ(0, fake_audio_capture_module_->StartPlayout());
-
-  EXPECT_EQ(0, fake_audio_capture_module_->InitRecording());
-  EXPECT_EQ(0, fake_audio_capture_module_->StartRecording());
-
-  EXPECT_TRUE_WAIT(push_iterations() > 0, kMsInSecond);
-  EXPECT_TRUE_WAIT(pull_iterations() > 0, kMsInSecond);
-
-  EXPECT_EQ(0, fake_audio_capture_module_->StopPlayout());
-  EXPECT_EQ(0, fake_audio_capture_module_->StopRecording());
-}
diff --git a/pc/test/fakedatachannelprovider.h b/pc/test/fakedatachannelprovider.h
deleted file mode 100644
index ecc0aa6..0000000
--- a/pc/test/fakedatachannelprovider.h
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- *  Copyright 2013 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_PC_TEST_FAKEDATACHANNELPROVIDER_H_
-#define WEBRTC_PC_TEST_FAKEDATACHANNELPROVIDER_H_
-
-#include "webrtc/pc/datachannel.h"
-#include "webrtc/rtc_base/checks.h"
-
-class FakeDataChannelProvider : public webrtc::DataChannelProviderInterface {
- public:
-  FakeDataChannelProvider()
-      : send_blocked_(false),
-        transport_available_(false),
-        ready_to_send_(false),
-        transport_error_(false) {}
-  virtual ~FakeDataChannelProvider() {}
-
-  bool SendData(const cricket::SendDataParams& params,
-                const rtc::CopyOnWriteBuffer& payload,
-                cricket::SendDataResult* result) override {
-    RTC_CHECK(ready_to_send_);
-    RTC_CHECK(transport_available_);
-    if (send_blocked_) {
-      *result = cricket::SDR_BLOCK;
-      return false;
-    }
-
-    if (transport_error_ || payload.size() == 0) {
-      *result = cricket::SDR_ERROR;
-      return false;
-    }
-
-    last_send_data_params_ = params;
-    return true;
-  }
-
-  bool ConnectDataChannel(webrtc::DataChannel* data_channel) override {
-    RTC_CHECK(connected_channels_.find(data_channel) ==
-              connected_channels_.end());
-    if (!transport_available_) {
-      return false;
-    }
-    LOG(LS_INFO) << "DataChannel connected " << data_channel;
-    connected_channels_.insert(data_channel);
-    return true;
-  }
-
-  void DisconnectDataChannel(webrtc::DataChannel* data_channel) override {
-    RTC_CHECK(connected_channels_.find(data_channel) !=
-              connected_channels_.end());
-    LOG(LS_INFO) << "DataChannel disconnected " << data_channel;
-    connected_channels_.erase(data_channel);
-  }
-
-  void AddSctpDataStream(int sid) override {
-    RTC_CHECK(sid >= 0);
-    if (!transport_available_) {
-      return;
-    }
-    send_ssrcs_.insert(sid);
-    recv_ssrcs_.insert(sid);
-  }
-
-  void RemoveSctpDataStream(int sid) override {
-    RTC_CHECK(sid >= 0);
-    send_ssrcs_.erase(sid);
-    recv_ssrcs_.erase(sid);
-  }
-
-  bool ReadyToSendData() const override { return ready_to_send_; }
-
-  // Set true to emulate the SCTP stream being blocked by congestion control.
-  void set_send_blocked(bool blocked) {
-    send_blocked_ = blocked;
-    if (!blocked) {
-      // Take a snapshot of the connected channels and check to see whether
-      // each value is still in connected_channels_ before calling
-      // OnChannelReady().  This avoids problems where the set gets modified
-      // in response to OnChannelReady().
-      for (webrtc::DataChannel *ch : std::set<webrtc::DataChannel*>(
-               connected_channels_.begin(), connected_channels_.end())) {
-        if (connected_channels_.count(ch)) {
-          ch->OnChannelReady(true);
-        }
-      }
-    }
-  }
-
-  // Set true to emulate the transport channel creation, e.g. after
-  // setLocalDescription/setRemoteDescription called with data content.
-  void set_transport_available(bool available) {
-    transport_available_ = available;
-  }
-
-  // Set true to emulate the transport ReadyToSendData signal when the transport
-  // becomes writable for the first time.
-  void set_ready_to_send(bool ready) {
-    RTC_CHECK(transport_available_);
-    ready_to_send_ = ready;
-    if (ready) {
-      std::set<webrtc::DataChannel*>::iterator it;
-      for (it = connected_channels_.begin();
-           it != connected_channels_.end();
-           ++it) {
-        (*it)->OnChannelReady(true);
-      }
-    }
-  }
-
-  void set_transport_error() {
-    transport_error_ = true;
-  }
-
-  cricket::SendDataParams last_send_data_params() const {
-    return last_send_data_params_;
-  }
-
-  bool IsConnected(webrtc::DataChannel* data_channel) const {
-    return connected_channels_.find(data_channel) != connected_channels_.end();
-  }
-
-  bool IsSendStreamAdded(uint32_t stream) const {
-    return send_ssrcs_.find(stream) != send_ssrcs_.end();
-  }
-
-  bool IsRecvStreamAdded(uint32_t stream) const {
-    return recv_ssrcs_.find(stream) != recv_ssrcs_.end();
-  }
-
- private:
-  cricket::SendDataParams last_send_data_params_;
-  bool send_blocked_;
-  bool transport_available_;
-  bool ready_to_send_;
-  bool transport_error_;
-  std::set<webrtc::DataChannel*> connected_channels_;
-  std::set<uint32_t> send_ssrcs_;
-  std::set<uint32_t> recv_ssrcs_;
-};
-#endif  // WEBRTC_PC_TEST_FAKEDATACHANNELPROVIDER_H_
diff --git a/pc/test/fakeperiodicvideocapturer.h b/pc/test/fakeperiodicvideocapturer.h
deleted file mode 100644
index 02b4e4b..0000000
--- a/pc/test/fakeperiodicvideocapturer.h
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- *  Copyright 2012 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.
- */
-
-// FakePeriodicVideoCapturer implements a fake cricket::VideoCapturer that
-// creates video frames periodically after it has been started.
-
-#ifndef WEBRTC_PC_TEST_FAKEPERIODICVIDEOCAPTURER_H_
-#define WEBRTC_PC_TEST_FAKEPERIODICVIDEOCAPTURER_H_
-
-#include <vector>
-
-#include "webrtc/media/base/fakevideocapturer.h"
-#include "webrtc/rtc_base/thread.h"
-
-namespace webrtc {
-
-class FakePeriodicVideoCapturer : public cricket::FakeVideoCapturer,
-                                  public rtc::MessageHandler {
- public:
-  FakePeriodicVideoCapturer() {
-    std::vector<cricket::VideoFormat> formats;
-    formats.push_back(cricket::VideoFormat(1280, 720,
-            cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420));
-    formats.push_back(cricket::VideoFormat(640, 480,
-        cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420));
-    formats.push_back(cricket::VideoFormat(640, 360,
-            cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420));
-    formats.push_back(cricket::VideoFormat(320, 240,
-        cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420));
-    formats.push_back(cricket::VideoFormat(160, 120,
-        cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420));
-    ResetSupportedFormats(formats);
-  }
-
-  virtual cricket::CaptureState Start(const cricket::VideoFormat& format) {
-    cricket::CaptureState state = FakeVideoCapturer::Start(format);
-    if (state != cricket::CS_FAILED) {
-      rtc::Thread::Current()->Post(RTC_FROM_HERE, this, MSG_CREATEFRAME);
-    }
-    return state;
-  }
-  virtual void Stop() {
-    rtc::Thread::Current()->Clear(this);
-  }
-  // Inherited from MesageHandler.
-  virtual void OnMessage(rtc::Message* msg) {
-    if (msg->message_id == MSG_CREATEFRAME) {
-      if (IsRunning()) {
-        CaptureFrame();
-        rtc::Thread::Current()->PostDelayed(
-            RTC_FROM_HERE, static_cast<int>(GetCaptureFormat()->interval /
-                                            rtc::kNumNanosecsPerMillisec),
-            this, MSG_CREATEFRAME);
-        }
-    }
-  }
-
- private:
-  enum {
-    // Offset  0xFF to make sure this don't collide with base class messages.
-    MSG_CREATEFRAME = 0xFF
-  };
-};
-
-}  // namespace webrtc
-
-#endif  //  WEBRTC_PC_TEST_FAKEPERIODICVIDEOCAPTURER_H_
diff --git a/pc/test/fakertccertificategenerator.h b/pc/test/fakertccertificategenerator.h
deleted file mode 100644
index 7b47378..0000000
--- a/pc/test/fakertccertificategenerator.h
+++ /dev/null
@@ -1,231 +0,0 @@
-/*
- *  Copyright 2013 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_PC_TEST_FAKERTCCERTIFICATEGENERATOR_H_
-#define WEBRTC_PC_TEST_FAKERTCCERTIFICATEGENERATOR_H_
-
-#include <memory>
-#include <string>
-#include <utility>
-
-#include "webrtc/api/peerconnectioninterface.h"
-#include "webrtc/rtc_base/rtccertificate.h"
-#include "webrtc/rtc_base/rtccertificategenerator.h"
-
-// RSA with mod size 1024, pub exp 0x10001.
-static const rtc::RTCCertificatePEM kRsaPems[] = {
-    rtc::RTCCertificatePEM(
-        "-----BEGIN RSA PRIVATE KEY-----\n"
-         "MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAMYRkbhmI7kVA/rM\n"
-         "czsZ+6JDhDvnkF+vn6yCAGuRPV03zuRqZtDy4N4to7PZu9PjqrRl7nDMXrG3YG9y\n"
-         "rlIAZ72KjcKKFAJxQyAKLCIdawKRyp8RdK3LEySWEZb0AV58IadqPZDTNHHRX8dz\n"
-         "5aTSMsbbkZ+C/OzTnbiMqLL/vg6jAgMBAAECgYAvgOs4FJcgvp+TuREx7YtiYVsH\n"
-         "mwQPTum2z/8VzWGwR8BBHBvIpVe1MbD/Y4seyI2aco/7UaisatSgJhsU46/9Y4fq\n"
-         "2TwXH9QANf4at4d9n/R6rzwpAJOpgwZgKvdQjkfrKTtgLV+/dawvpxUYkRH4JZM1\n"
-         "CVGukMfKNrSVH4Ap4QJBAOJmGV1ASPnB4r4nc99at7JuIJmd7fmuVUwUgYi4XgaR\n"
-         "WhScBsgYwZ/JoywdyZJgnbcrTDuVcWG56B3vXbhdpMsCQQDf9zeJrjnPZ3Cqm79y\n"
-         "kdqANep0uwZciiNiWxsQrCHztywOvbFhdp8iYVFG9EK8DMY41Y5TxUwsHD+67zao\n"
-         "ZNqJAkEA1suLUP/GvL8IwuRneQd2tWDqqRQ/Td3qq03hP7e77XtF/buya3Ghclo5\n"
-         "54czUR89QyVfJEC6278nzA7n2h1uVQJAcG6mztNL6ja/dKZjYZye2CY44QjSlLo0\n"
-         "MTgTSjdfg/28fFn2Jjtqf9Pi/X+50LWI/RcYMC2no606wRk9kyOuIQJBAK6VSAim\n"
-         "1pOEjsYQn0X5KEIrz1G3bfCbB848Ime3U2/FWlCHMr6ch8kCZ5d1WUeJD3LbwMNG\n"
-         "UCXiYxSsu20QNVw=\n"
-         "-----END RSA PRIVATE KEY-----\n",
-         "-----BEGIN CERTIFICATE-----\n"
-         "MIIBmTCCAQKgAwIBAgIEbzBSAjANBgkqhkiG9w0BAQsFADARMQ8wDQYDVQQDEwZX\n"
-         "ZWJSVEMwHhcNMTQwMTAyMTgyNDQ3WhcNMTQwMjAxMTgyNDQ3WjARMQ8wDQYDVQQD\n"
-         "EwZXZWJSVEMwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMYRkbhmI7kVA/rM\n"
-         "czsZ+6JDhDvnkF+vn6yCAGuRPV03zuRqZtDy4N4to7PZu9PjqrRl7nDMXrG3YG9y\n"
-         "rlIAZ72KjcKKFAJxQyAKLCIdawKRyp8RdK3LEySWEZb0AV58IadqPZDTNHHRX8dz\n"
-         "5aTSMsbbkZ+C/OzTnbiMqLL/vg6jAgMBAAEwDQYJKoZIhvcNAQELBQADgYEAUflI\n"
-         "VUe5Krqf5RVa5C3u/UTAOAUJBiDS3VANTCLBxjuMsvqOG0WvaYWP3HYPgrz0jXK2\n"
-         "LJE/mGw3MyFHEqi81jh95J+ypl6xKW6Rm8jKLR87gUvCaVYn/Z4/P3AqcQTB7wOv\n"
-         "UD0A8qfhfDM+LK6rPAnCsVN0NRDY3jvd6rzix9M=\n"
-         "-----END CERTIFICATE-----\n"),
-    rtc::RTCCertificatePEM(
-         "-----BEGIN RSA PRIVATE KEY-----\n"
-         "MIICXQIBAAKBgQDeYqlyJ1wuiMsi905e3X81/WA/G3ym50PIDZBVtSwZi7JVQPgj\n"
-         "Bl8CPZMvDh9EwB4Ji9ytA8dZZbQ4WbJWPr73zPpJSCvQqz6sOXSlenBRi72acNaQ\n"
-         "sOR/qPvviJx5I6Hqo4qemfnjZhAW85a5BpgrAwKgMLIQTHCTLWwVSyrDrwIDAQAB\n"
-         "AoGARni9eY8/hv+SX+I+05EdXt6MQXNUbQ+cSykBNCfVccLzIFEWUQMT2IHqwl6X\n"
-         "ShIXcq7/n1QzOAEiuzixauM3YHg4xZ1Um2Ha9a7ig5Xg4v6b43bmMkNE6LkoAtYs\n"
-         "qnQdfMh442b1liDud6IMb1Qk0amt3fSrgRMc547TZQVx4QECQQDxUeDm94r3p4ng\n"
-         "5rCLLC1K5/6HSTZsh7jatKPlz7GfP/IZlYV7iE5784/n0wRiCjZOS7hQRy/8m2Gp\n"
-         "pf4aZq+DAkEA6+np4d36FYikydvUrupLT3FkdRHGn/v83qOll/VmeNh+L1xMZlIP\n"
-         "tM26hAXCcQb7O5+J9y3cx2CAQsBS11ZXZQJAfGgTo76WG9p5UEJdXUInD2jOZPwv\n"
-         "XIATolxh6kXKcijLLLlSmT7KB0inNYIpzkkpee+7U1d/u6B3FriGaSHq9QJBAM/J\n"
-         "ICnDdLCgwNvWVraVQC3BpwSB2pswvCFwq7py94V60XFvbw80Ogc6qIv98qvQxVlX\n"
-         "hJIEgA/PjEi+0ng94Q0CQQDm8XSDby35gmjO+6eRmJtAjtB7nguLvrPXM6CPXRmD\n"
-         "sRoBocpHw6j9UdzZ6qYG0FkdXZghezXFY58ro2BYYRR3\n"
-         "-----END RSA PRIVATE KEY-----\n",
-         "-----BEGIN CERTIFICATE-----\n"
-         "MIICWDCCAcGgAwIBAgIJALgDjxMbBOhbMA0GCSqGSIb3DQEBCwUAMEUxCzAJBgNV\n"
-         "BAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBX\n"
-         "aWRnaXRzIFB0eSBMdGQwHhcNMTUxMTEzMjIzMjEzWhcNMTYxMTEyMjIzMjEzWjBF\n"
-         "MQswCQYDVQQGEwJBVTETMBEGA1UECAwKU29tZS1TdGF0ZTEhMB8GA1UECgwYSW50\n"
-         "ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKB\n"
-         "gQDeYqlyJ1wuiMsi905e3X81/WA/G3ym50PIDZBVtSwZi7JVQPgjBl8CPZMvDh9E\n"
-         "wB4Ji9ytA8dZZbQ4WbJWPr73zPpJSCvQqz6sOXSlenBRi72acNaQsOR/qPvviJx5\n"
-         "I6Hqo4qemfnjZhAW85a5BpgrAwKgMLIQTHCTLWwVSyrDrwIDAQABo1AwTjAdBgNV\n"
-         "HQ4EFgQUx2tbJdlcSTCepn09UdYORXKuSTAwHwYDVR0jBBgwFoAUx2tbJdlcSTCe\n"
-         "pn09UdYORXKuSTAwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQsFAAOBgQAmp9Id\n"
-         "E716gHMqeBG4S2FCgVFCr0a0ugkaneQAN/c2L9CbMemEN9W6jvucUIVOtYd90dDW\n"
-         "lXuowWmT/JctPe3D2qt4yvYW3puECHk2tVQmrJOZiZiTRtWm6HxkmoUYHYp/DtaS\n"
-         "1Xe29gSTnZtI5sQCrGMzk3SGRSSs7ejLKiVDBQ==\n"
-         "-----END CERTIFICATE-----\n")
-};
-
-// ECDSA with EC_NIST_P256.
-// These PEM strings were created by generating an identity with
-// |SSLIdentity::Generate| and invoking |identity->PrivateKeyToPEMString()|,
-// |identity->PublicKeyToPEMString()| and
-// |identity->certificate().ToPEMString()|.
-static const rtc::RTCCertificatePEM kEcdsaPems[] = {
-    rtc::RTCCertificatePEM(
-        "-----BEGIN PRIVATE KEY-----\n"
-        "MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQg+qaRsR5uHtqG689M\n"
-        "A3PHSJNeVpyi5wUKCft62h0UWy+hRANCAAS5Mjc85q9fVq4ln+zOPlaEC/Rzj5Pb\n"
-        "MVZtf1x/8k2KsbmyZoAMDX2yer/atEuXmItMe3yd6/DXnvboU//D3Lyt\n"
-        "-----END PRIVATE KEY-----\n",
-        "-----BEGIN CERTIFICATE-----\n"
-        "MIIBFTCBu6ADAgECAgkA30tGY5XG7oowCgYIKoZIzj0EAwIwEDEOMAwGA1UEAwwF\n"
-        "dGVzdDMwHhcNMTYwNTA5MDkxODA4WhcNMTYwNjA5MDkxODA4WjAQMQ4wDAYDVQQD\n"
-        "DAV0ZXN0MzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABLkyNzzmr19WriWf7M4+\n"
-        "VoQL9HOPk9sxVm1/XH/yTYqxubJmgAwNfbJ6v9q0S5eYi0x7fJ3r8Nee9uhT/8Pc\n"
-        "vK0wCgYIKoZIzj0EAwIDSQAwRgIhAIIc3+CqfkZ9lLwTj1PvUtt3KhnqF2kD0War\n"
-        "cCoTBbCxAiEAyp9Cn4vo2ZBhRIVDKyoxmwak8Z0PAVhJAQaWCgoY2D4=\n"
-        "-----END CERTIFICATE-----\n"),
-    rtc::RTCCertificatePEM(
-        "-----BEGIN PRIVATE KEY-----\n"
-        "MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQghL/G4JRYnuDNbQuh\n"
-        "LqkytcE39Alsq6FItDVFgOesfCmhRANCAATd53FjPLyVUcwYguEPbSJM03fP6Rx5\n"
-        "GY1dEZ00+ZykjJI83VfDAyvmpRuGahNtBH0hc+7xkDCbeo6TM0tN35xr\n"
-        "-----END PRIVATE KEY-----\n",
-        "-----BEGIN CERTIFICATE-----\n"
-        "MIIBFDCBu6ADAgECAgkArZYdXMyJ5rswCgYIKoZIzj0EAwIwEDEOMAwGA1UEAwwF\n"
-        "dGVzdDQwHhcNMTYwNTA5MDkxODA4WhcNMTYwNjA5MDkxODA4WjAQMQ4wDAYDVQQD\n"
-        "DAV0ZXN0NDBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABN3ncWM8vJVRzBiC4Q9t\n"
-        "IkzTd8/pHHkZjV0RnTT5nKSMkjzdV8MDK+alG4ZqE20EfSFz7vGQMJt6jpMzS03f\n"
-        "nGswCgYIKoZIzj0EAwIDSAAwRQIgb/LBc8OtsC5lEDyjCP6M9xt5mwzUNrQBOFWZ\n"
-        "1fE/g68CIQD7uoFfbiq6dTp8ZwzbwQ8jJf08KjriamqA9OW/4268Dw==\n"
-        "-----END CERTIFICATE-----\n")
-};
-
-class FakeRTCCertificateGenerator
-    : public rtc::RTCCertificateGeneratorInterface,
-      public rtc::MessageHandler {
- public:
-  typedef rtc::TypedMessageData<rtc::scoped_refptr<
-      rtc::RTCCertificateGeneratorCallback> > MessageData;
-
-  FakeRTCCertificateGenerator() : should_fail_(false) {}
-
-  void set_should_fail(bool should_fail) {
-    should_fail_ = should_fail;
-  }
-
-  void use_original_key() { key_index_ = 0; }
-  void use_alternate_key() { key_index_ = 1; }
-
-  int generated_certificates() { return generated_certificates_; }
-
-  void GenerateCertificateAsync(
-      const rtc::KeyParams& key_params,
-      const rtc::Optional<uint64_t>& expires_ms,
-      const rtc::scoped_refptr<rtc::RTCCertificateGeneratorCallback>&
-          callback) override {
-    // The certificates are created from constant PEM strings and use its coded
-    // expiration time, we do not support modifying it.
-    RTC_DCHECK(!expires_ms);
-    MessageData* msg = new MessageData(
-        rtc::scoped_refptr<rtc::RTCCertificateGeneratorCallback>(callback));
-    uint32_t msg_id;
-    // Only supports RSA-1024-0x10001 and ECDSA-P256.
-    if (should_fail_) {
-      msg_id = MSG_FAILURE;
-    } else if (key_params.type() == rtc::KT_RSA) {
-      RTC_DCHECK_EQ(key_params.rsa_params().mod_size, 1024);
-      RTC_DCHECK_EQ(key_params.rsa_params().pub_exp, 0x10001);
-      msg_id = MSG_SUCCESS_RSA;
-    } else {
-      RTC_DCHECK_EQ(key_params.type(), rtc::KT_ECDSA);
-      RTC_DCHECK_EQ(key_params.ec_curve(), rtc::EC_NIST_P256);
-      msg_id = MSG_SUCCESS_ECDSA;
-    }
-    rtc::Thread::Current()->Post(RTC_FROM_HERE, this, msg_id, msg);
-  }
-
-  static rtc::scoped_refptr<rtc::RTCCertificate> GenerateCertificate() {
-    switch (rtc::KT_DEFAULT) {
-    case rtc::KT_RSA:
-      return rtc::RTCCertificate::FromPEM(kRsaPems[0]);
-    case rtc::KT_ECDSA:
-      return rtc::RTCCertificate::FromPEM(kEcdsaPems[0]);
-    default:
-      RTC_NOTREACHED();
-      return nullptr;
-    }
-  }
-
- private:
-  enum {
-    MSG_SUCCESS_RSA,
-    MSG_SUCCESS_ECDSA,
-    MSG_FAILURE,
-  };
-
-  const rtc::RTCCertificatePEM& get_pem(const rtc::KeyType& key_type) const {
-    switch (key_type) {
-    case rtc::KT_RSA:
-      return kRsaPems[key_index_];
-    case rtc::KT_ECDSA:
-      return kEcdsaPems[key_index_];
-    default:
-      RTC_NOTREACHED();
-      return kEcdsaPems[key_index_];
-    }
-  }
-  const std::string& get_key(const rtc::KeyType& key_type) const {
-    return get_pem(key_type).private_key();
-  }
-  const std::string& get_cert(const rtc::KeyType& key_type) const {
-    return get_pem(key_type).certificate();
-  }
-
-  // rtc::MessageHandler implementation.
-  void OnMessage(rtc::Message* msg) override {
-    MessageData* message_data = static_cast<MessageData*>(msg->pdata);
-    rtc::scoped_refptr<rtc::RTCCertificateGeneratorCallback> callback =
-        message_data->data();
-    rtc::scoped_refptr<rtc::RTCCertificate> certificate;
-    switch (msg->message_id) {
-      case MSG_SUCCESS_RSA:
-      case MSG_SUCCESS_ECDSA: {
-        rtc::KeyType key_type =
-            msg->message_id == MSG_SUCCESS_RSA ? rtc::KT_RSA : rtc::KT_ECDSA;
-        certificate = rtc::RTCCertificate::FromPEM(get_pem(key_type));
-        RTC_DCHECK(certificate);
-        ++generated_certificates_;
-        callback->OnSuccess(certificate);
-        break;
-      }
-      case MSG_FAILURE:
-        callback->OnFailure();
-        break;
-    }
-    delete message_data;
-  }
-
-  bool should_fail_;
-  int key_index_ = 0;
-  int generated_certificates_ = 0;
-};
-
-#endif  // WEBRTC_PC_TEST_FAKERTCCERTIFICATEGENERATOR_H_
diff --git a/pc/test/fakevideotrackrenderer.h b/pc/test/fakevideotrackrenderer.h
deleted file mode 100644
index 9bf0b95..0000000
--- a/pc/test/fakevideotrackrenderer.h
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- *  Copyright 2012 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_PC_TEST_FAKEVIDEOTRACKRENDERER_H_
-#define WEBRTC_PC_TEST_FAKEVIDEOTRACKRENDERER_H_
-
-#include "webrtc/api/mediastreaminterface.h"
-#include "webrtc/media/base/fakevideorenderer.h"
-
-namespace webrtc {
-
-class FakeVideoTrackRenderer : public cricket::FakeVideoRenderer {
- public:
-  FakeVideoTrackRenderer(VideoTrackInterface* video_track)
-      : video_track_(video_track) {
-    video_track_->AddOrUpdateSink(this, rtc::VideoSinkWants());
-  }
-  ~FakeVideoTrackRenderer() { video_track_->RemoveSink(this); }
-
- private:
-  rtc::scoped_refptr<VideoTrackInterface> video_track_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_PC_TEST_FAKEVIDEOTRACKRENDERER_H_
diff --git a/pc/test/fakevideotracksource.h b/pc/test/fakevideotracksource.h
deleted file mode 100644
index aa5f3f5..0000000
--- a/pc/test/fakevideotracksource.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- *  Copyright 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_PC_TEST_FAKEVIDEOTRACKSOURCE_H_
-#define WEBRTC_PC_TEST_FAKEVIDEOTRACKSOURCE_H_
-
-#include "webrtc/api/mediastreaminterface.h"
-#include "webrtc/media/base/fakevideocapturer.h"
-#include "webrtc/pc/videotracksource.h"
-
-namespace webrtc {
-
-class FakeVideoTrackSource : public VideoTrackSource {
- public:
-  static rtc::scoped_refptr<FakeVideoTrackSource> Create(bool is_screencast) {
-    return new rtc::RefCountedObject<FakeVideoTrackSource>(is_screencast);
-  }
-
-  static rtc::scoped_refptr<FakeVideoTrackSource> Create() {
-    return Create(false);
-  }
-
-  cricket::FakeVideoCapturer* fake_video_capturer() {
-    return &fake_video_capturer_;
-  }
-
-  bool is_screencast() const override { return is_screencast_; }
-
- protected:
-  explicit FakeVideoTrackSource(bool is_screencast)
-      : VideoTrackSource(&fake_video_capturer_, false /* remote */),
-        is_screencast_(is_screencast) {}
-  virtual ~FakeVideoTrackSource() {}
-
- private:
-  cricket::FakeVideoCapturer fake_video_capturer_;
-  const bool is_screencast_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_PC_TEST_FAKEVIDEOTRACKSOURCE_H_
diff --git a/pc/test/mock_datachannel.h b/pc/test/mock_datachannel.h
deleted file mode 100644
index 105fcba..0000000
--- a/pc/test/mock_datachannel.h
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- *  Copyright 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_PC_TEST_MOCK_DATACHANNEL_H_
-#define WEBRTC_PC_TEST_MOCK_DATACHANNEL_H_
-
-#include "webrtc/pc/datachannel.h"
-#include "webrtc/test/gmock.h"
-
-namespace webrtc {
-
-class MockDataChannel : public rtc::RefCountedObject<DataChannel> {
- public:
-  MockDataChannel(int id, DataState state)
-      : MockDataChannel(id, "MockDataChannel", state, "udp", 0, 0, 0, 0) {
-  }
-  MockDataChannel(
-      int id,
-      const std::string& label,
-      DataState state,
-      const std::string& protocol,
-      uint32_t messages_sent,
-      uint64_t bytes_sent,
-      uint32_t messages_received,
-      uint64_t bytes_received)
-      : rtc::RefCountedObject<DataChannel>(
-            nullptr, cricket::DCT_NONE, label) {
-    EXPECT_CALL(*this, id()).WillRepeatedly(testing::Return(id));
-    EXPECT_CALL(*this, state()).WillRepeatedly(testing::Return(state));
-    EXPECT_CALL(*this, protocol()).WillRepeatedly(testing::Return(protocol));
-    EXPECT_CALL(*this, messages_sent()).WillRepeatedly(
-        testing::Return(messages_sent));
-    EXPECT_CALL(*this, bytes_sent()).WillRepeatedly(
-        testing::Return(bytes_sent));
-    EXPECT_CALL(*this, messages_received()).WillRepeatedly(
-        testing::Return(messages_received));
-    EXPECT_CALL(*this, bytes_received()).WillRepeatedly(
-        testing::Return(bytes_received));
-  }
-  MOCK_CONST_METHOD0(id, int());
-  MOCK_CONST_METHOD0(state, DataState());
-  MOCK_CONST_METHOD0(protocol, std::string());
-  MOCK_CONST_METHOD0(messages_sent, uint32_t());
-  MOCK_CONST_METHOD0(bytes_sent, uint64_t());
-  MOCK_CONST_METHOD0(messages_received, uint32_t());
-  MOCK_CONST_METHOD0(bytes_received, uint64_t());
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_PC_TEST_MOCK_DATACHANNEL_H_
diff --git a/pc/test/mock_peerconnection.h b/pc/test/mock_peerconnection.h
deleted file mode 100644
index e743cd8..0000000
--- a/pc/test/mock_peerconnection.h
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- *  Copyright 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_PC_TEST_MOCK_PEERCONNECTION_H_
-#define WEBRTC_PC_TEST_MOCK_PEERCONNECTION_H_
-
-#include <vector>
-
-#include "webrtc/call/call.h"
-#include "webrtc/logging/rtc_event_log/rtc_event_log.h"
-#include "webrtc/pc/peerconnection.h"
-#include "webrtc/rtc_base/thread.h"
-#include "webrtc/test/gmock.h"
-
-namespace webrtc {
-
-// The factory isn't really used; it just satisfies the base PeerConnection.
-class FakePeerConnectionFactory
-    : public rtc::RefCountedObject<webrtc::PeerConnectionFactory> {
- public:
-  FakePeerConnectionFactory()
-      : rtc::RefCountedObject<webrtc::PeerConnectionFactory>(
-            rtc::Thread::Current(),
-            rtc::Thread::Current(),
-            rtc::Thread::Current(),
-            nullptr,
-            nullptr,
-            nullptr,
-            nullptr,
-            nullptr,
-            nullptr,
-            std::unique_ptr<cricket::MediaEngineInterface>(),
-            std::unique_ptr<webrtc::CallFactoryInterface>(),
-            std::unique_ptr<RtcEventLogFactoryInterface>()) {}
-};
-
-class MockPeerConnection
-    : public rtc::RefCountedObject<webrtc::PeerConnection> {
- public:
-  MockPeerConnection()
-      : rtc::RefCountedObject<webrtc::PeerConnection>(
-            new FakePeerConnectionFactory(),
-            std::unique_ptr<RtcEventLog>(),
-            std::unique_ptr<Call>()) {}
-  MOCK_METHOD0(local_streams,
-               rtc::scoped_refptr<StreamCollectionInterface>());
-  MOCK_METHOD0(remote_streams,
-               rtc::scoped_refptr<StreamCollectionInterface>());
-  MOCK_METHOD0(session, WebRtcSession*());
-  MOCK_CONST_METHOD0(GetSenders,
-                     std::vector<rtc::scoped_refptr<RtpSenderInterface>>());
-  MOCK_CONST_METHOD0(GetReceivers,
-                     std::vector<rtc::scoped_refptr<RtpReceiverInterface>>());
-  MOCK_CONST_METHOD0(sctp_data_channels,
-                     const std::vector<rtc::scoped_refptr<DataChannel>>&());
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_PC_TEST_MOCK_PEERCONNECTION_H_
diff --git a/pc/test/mock_webrtcsession.h b/pc/test/mock_webrtcsession.h
deleted file mode 100644
index 75e3b87..0000000
--- a/pc/test/mock_webrtcsession.h
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- *  Copyright 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_PC_TEST_MOCK_WEBRTCSESSION_H_
-#define WEBRTC_PC_TEST_MOCK_WEBRTCSESSION_H_
-
-#include <memory>
-#include <string>
-
-#include "webrtc/pc/webrtcsession.h"
-#include "webrtc/media/sctp/sctptransportinternal.h"
-#include "webrtc/test/gmock.h"
-
-namespace webrtc {
-
-class MockWebRtcSession : public webrtc::WebRtcSession {
- public:
-  // TODO(nisse): Valid overrides commented out, because the gmock
-  // methods don't use any override declarations, and we want to avoid
-  // warnings from -Winconsistent-missing-override. See
-  // http://crbug.com/428099.
-  explicit MockWebRtcSession(cricket::ChannelManager* channel_manager,
-                             const cricket::MediaConfig& media_config)
-      : WebRtcSession(nullptr /* Call */,
-            channel_manager,
-            media_config,
-            nullptr, // event_log
-            rtc::Thread::Current(),
-            rtc::Thread::Current(),
-            rtc::Thread::Current(),
-            nullptr,
-            std::unique_ptr<cricket::TransportController>(
-                new cricket::TransportController(
-                    rtc::Thread::Current(),
-                    rtc::Thread::Current(),
-                    nullptr,
-                    /*redetermine_role_on_ice_restart=*/true,
-                    rtc::CryptoOptions())),
-            std::unique_ptr<cricket::SctpTransportInternalFactory>()) {}
-  MOCK_METHOD0(voice_channel, cricket::VoiceChannel*());
-  MOCK_METHOD0(video_channel, cricket::VideoChannel*());
-  // Libjingle uses "local" for a outgoing track, and "remote" for a incoming
-  // track.
-  MOCK_METHOD2(GetLocalTrackIdBySsrc, bool(uint32_t, std::string*));
-  MOCK_METHOD2(GetRemoteTrackIdBySsrc, bool(uint32_t, std::string*));
-  MOCK_METHOD0(GetCallStats, Call::Stats());
-  MOCK_METHOD1(GetStats,
-               std::unique_ptr<SessionStats>(const ChannelNamePairs&));
-  MOCK_METHOD2(GetLocalCertificate,
-               bool(const std::string& transport_name,
-                    rtc::scoped_refptr<rtc::RTCCertificate>* certificate));
-
-  // Workaround for gmock's inability to cope with move-only return values.
-  std::unique_ptr<rtc::SSLCertificate> GetRemoteSSLCertificate(
-      const std::string& transport_name) /* override */ {
-    return std::unique_ptr<rtc::SSLCertificate>(
-        GetRemoteSSLCertificate_ReturnsRawPointer(transport_name));
-  }
-  MOCK_METHOD1(GetRemoteSSLCertificate_ReturnsRawPointer,
-               rtc::SSLCertificate*(const std::string& transport_name));
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_PC_TEST_MOCK_WEBRTCSESSION_H_
diff --git a/pc/test/mockpeerconnectionobservers.h b/pc/test/mockpeerconnectionobservers.h
deleted file mode 100644
index 84c80f8..0000000
--- a/pc/test/mockpeerconnectionobservers.h
+++ /dev/null
@@ -1,269 +0,0 @@
-/*
- *  Copyright 2012 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.
- */
-
-// This file contains mock implementations of observers used in PeerConnection.
-
-#ifndef WEBRTC_PC_TEST_MOCKPEERCONNECTIONOBSERVERS_H_
-#define WEBRTC_PC_TEST_MOCKPEERCONNECTIONOBSERVERS_H_
-
-#include <memory>
-#include <string>
-
-#include "webrtc/api/datachannelinterface.h"
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-
-class MockCreateSessionDescriptionObserver
-    : public webrtc::CreateSessionDescriptionObserver {
- public:
-  MockCreateSessionDescriptionObserver()
-      : called_(false),
-        result_(false) {}
-  virtual ~MockCreateSessionDescriptionObserver() {}
-  virtual void OnSuccess(SessionDescriptionInterface* desc) {
-    called_ = true;
-    result_ = true;
-    desc_.reset(desc);
-  }
-  virtual void OnFailure(const std::string& error) {
-    called_ = true;
-    result_ = false;
-  }
-  bool called() const { return called_; }
-  bool result() const { return result_; }
-  std::unique_ptr<SessionDescriptionInterface> MoveDescription() {
-    return std::move(desc_);
-  }
-
- private:
-  bool called_;
-  bool result_;
-  std::unique_ptr<SessionDescriptionInterface> desc_;
-};
-
-class MockSetSessionDescriptionObserver
-    : public webrtc::SetSessionDescriptionObserver {
- public:
-  MockSetSessionDescriptionObserver()
-      : called_(false),
-        result_(false) {}
-  virtual ~MockSetSessionDescriptionObserver() {}
-  virtual void OnSuccess() {
-    called_ = true;
-    result_ = true;
-  }
-  virtual void OnFailure(const std::string& error) {
-    called_ = true;
-    result_ = false;
-  }
-  bool called() const { return called_; }
-  bool result() const { return result_; }
-
- private:
-  bool called_;
-  bool result_;
-};
-
-class MockDataChannelObserver : public webrtc::DataChannelObserver {
- public:
-  explicit MockDataChannelObserver(webrtc::DataChannelInterface* channel)
-      : channel_(channel) {
-    channel_->RegisterObserver(this);
-    state_ = channel_->state();
-  }
-  virtual ~MockDataChannelObserver() {
-    channel_->UnregisterObserver();
-  }
-
-  void OnBufferedAmountChange(uint64_t previous_amount) override {}
-
-  void OnStateChange() override { state_ = channel_->state(); }
-  void OnMessage(const DataBuffer& buffer) override {
-    messages_.push_back(
-        std::string(buffer.data.data<char>(), buffer.data.size()));
-  }
-
-  bool IsOpen() const { return state_ == DataChannelInterface::kOpen; }
-  std::vector<std::string> messages() const { return messages_; }
-  std::string last_message() const {
-    return messages_.empty() ? std::string() : messages_.back();
-  }
-  size_t received_message_count() const { return messages_.size(); }
-
- private:
-  rtc::scoped_refptr<webrtc::DataChannelInterface> channel_;
-  DataChannelInterface::DataState state_;
-  std::vector<std::string> messages_;
-};
-
-class MockStatsObserver : public webrtc::StatsObserver {
- public:
-  MockStatsObserver() : called_(false), stats_() {}
-  virtual ~MockStatsObserver() {}
-
-  virtual void OnComplete(const StatsReports& reports) {
-    RTC_CHECK(!called_);
-    called_ = true;
-    stats_.Clear();
-    stats_.number_of_reports = reports.size();
-    for (const auto* r : reports) {
-      if (r->type() == StatsReport::kStatsReportTypeSsrc) {
-        stats_.timestamp = r->timestamp();
-        GetIntValue(r, StatsReport::kStatsValueNameAudioOutputLevel,
-            &stats_.audio_output_level);
-        GetIntValue(r, StatsReport::kStatsValueNameAudioInputLevel,
-            &stats_.audio_input_level);
-        GetIntValue(r, StatsReport::kStatsValueNameBytesReceived,
-            &stats_.bytes_received);
-        GetIntValue(r, StatsReport::kStatsValueNameBytesSent,
-            &stats_.bytes_sent);
-        GetInt64Value(r, StatsReport::kStatsValueNameCaptureStartNtpTimeMs,
-            &stats_.capture_start_ntp_time);
-      } else if (r->type() == StatsReport::kStatsReportTypeBwe) {
-        stats_.timestamp = r->timestamp();
-        GetIntValue(r, StatsReport::kStatsValueNameAvailableReceiveBandwidth,
-            &stats_.available_receive_bandwidth);
-      } else if (r->type() == StatsReport::kStatsReportTypeComponent) {
-        stats_.timestamp = r->timestamp();
-        GetStringValue(r, StatsReport::kStatsValueNameDtlsCipher,
-            &stats_.dtls_cipher);
-        GetStringValue(r, StatsReport::kStatsValueNameSrtpCipher,
-            &stats_.srtp_cipher);
-      }
-    }
-  }
-
-  bool called() const { return called_; }
-  size_t number_of_reports() const { return stats_.number_of_reports; }
-  double timestamp() const { return stats_.timestamp; }
-
-  int AudioOutputLevel() const {
-    RTC_CHECK(called_);
-    return stats_.audio_output_level;
-  }
-
-  int AudioInputLevel() const {
-    RTC_CHECK(called_);
-    return stats_.audio_input_level;
-  }
-
-  int BytesReceived() const {
-    RTC_CHECK(called_);
-    return stats_.bytes_received;
-  }
-
-  int BytesSent() const {
-    RTC_CHECK(called_);
-    return stats_.bytes_sent;
-  }
-
-  int64_t CaptureStartNtpTime() const {
-    RTC_CHECK(called_);
-    return stats_.capture_start_ntp_time;
-  }
-
-  int AvailableReceiveBandwidth() const {
-    RTC_CHECK(called_);
-    return stats_.available_receive_bandwidth;
-  }
-
-  std::string DtlsCipher() const {
-    RTC_CHECK(called_);
-    return stats_.dtls_cipher;
-  }
-
-  std::string SrtpCipher() const {
-    RTC_CHECK(called_);
-    return stats_.srtp_cipher;
-  }
-
- private:
-  bool GetIntValue(const StatsReport* report,
-                   StatsReport::StatsValueName name,
-                   int* value) {
-    const StatsReport::Value* v = report->FindValue(name);
-    if (v) {
-      // TODO(tommi): We should really just be using an int here :-/
-      *value = rtc::FromString<int>(v->ToString());
-    }
-    return v != nullptr;
-  }
-
-  bool GetInt64Value(const StatsReport* report,
-                   StatsReport::StatsValueName name,
-                   int64_t* value) {
-    const StatsReport::Value* v = report->FindValue(name);
-    if (v) {
-      // TODO(tommi): We should really just be using an int here :-/
-      *value = rtc::FromString<int64_t>(v->ToString());
-    }
-    return v != nullptr;
-  }
-
-  bool GetStringValue(const StatsReport* report,
-                      StatsReport::StatsValueName name,
-                      std::string* value) {
-    const StatsReport::Value* v = report->FindValue(name);
-    if (v)
-      *value = v->ToString();
-    return v != nullptr;
-  }
-
-  bool called_;
-  struct {
-    void Clear() {
-      number_of_reports = 0;
-      timestamp = 0;
-      audio_output_level = 0;
-      audio_input_level = 0;
-      bytes_received = 0;
-      bytes_sent = 0;
-      capture_start_ntp_time = 0;
-      available_receive_bandwidth = 0;
-      dtls_cipher.clear();
-      srtp_cipher.clear();
-    }
-
-    size_t number_of_reports;
-    double timestamp;
-    int audio_output_level;
-    int audio_input_level;
-    int bytes_received;
-    int bytes_sent;
-    int64_t capture_start_ntp_time;
-    int available_receive_bandwidth;
-    std::string dtls_cipher;
-    std::string srtp_cipher;
-  } stats_;
-};
-
-// Helper class that just stores the report from the callback.
-class MockRTCStatsCollectorCallback : public webrtc::RTCStatsCollectorCallback {
- public:
-  rtc::scoped_refptr<const RTCStatsReport> report() { return report_; }
-
-  bool called() const { return called_; }
-
- protected:
-  void OnStatsDelivered(
-      const rtc::scoped_refptr<const RTCStatsReport>& report) override {
-    report_ = report;
-    called_ = true;
-  }
-
- private:
-  bool called_ = false;
-  rtc::scoped_refptr<const RTCStatsReport> report_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_PC_TEST_MOCKPEERCONNECTIONOBSERVERS_H_
diff --git a/pc/test/peerconnectiontestwrapper.cc b/pc/test/peerconnectiontestwrapper.cc
deleted file mode 100644
index 0cd2804..0000000
--- a/pc/test/peerconnectiontestwrapper.cc
+++ /dev/null
@@ -1,285 +0,0 @@
-/*
- *  Copyright 2013 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/p2p/base/fakeportallocator.h"
-#include "webrtc/pc/test/fakeperiodicvideocapturer.h"
-#include "webrtc/pc/test/fakertccertificategenerator.h"
-#include "webrtc/pc/test/mockpeerconnectionobservers.h"
-#include "webrtc/pc/test/peerconnectiontestwrapper.h"
-#include "webrtc/rtc_base/gunit.h"
-
-static const char kStreamLabelBase[] = "stream_label";
-static const char kVideoTrackLabelBase[] = "video_track";
-static const char kAudioTrackLabelBase[] = "audio_track";
-static const int kMaxWait = 10000;
-static const int kTestAudioFrameCount = 3;
-static const int kTestVideoFrameCount = 3;
-
-using webrtc::FakeConstraints;
-using webrtc::FakeVideoTrackRenderer;
-using webrtc::IceCandidateInterface;
-using webrtc::MediaConstraintsInterface;
-using webrtc::MediaStreamInterface;
-using webrtc::MockSetSessionDescriptionObserver;
-using webrtc::PeerConnectionInterface;
-using webrtc::SessionDescriptionInterface;
-using webrtc::VideoTrackInterface;
-
-void PeerConnectionTestWrapper::Connect(PeerConnectionTestWrapper* caller,
-                                        PeerConnectionTestWrapper* callee) {
-  caller->SignalOnIceCandidateReady.connect(
-      callee, &PeerConnectionTestWrapper::AddIceCandidate);
-  callee->SignalOnIceCandidateReady.connect(
-      caller, &PeerConnectionTestWrapper::AddIceCandidate);
-
-  caller->SignalOnSdpReady.connect(
-      callee, &PeerConnectionTestWrapper::ReceiveOfferSdp);
-  callee->SignalOnSdpReady.connect(
-      caller, &PeerConnectionTestWrapper::ReceiveAnswerSdp);
-}
-
-PeerConnectionTestWrapper::PeerConnectionTestWrapper(
-    const std::string& name,
-    rtc::Thread* network_thread,
-    rtc::Thread* worker_thread)
-    : name_(name),
-      network_thread_(network_thread),
-      worker_thread_(worker_thread) {}
-
-PeerConnectionTestWrapper::~PeerConnectionTestWrapper() {}
-
-bool PeerConnectionTestWrapper::CreatePc(
-    const MediaConstraintsInterface* constraints,
-    const webrtc::PeerConnectionInterface::RTCConfiguration& config,
-    rtc::scoped_refptr<webrtc::AudioEncoderFactory> audio_encoder_factory,
-    rtc::scoped_refptr<webrtc::AudioDecoderFactory> audio_decoder_factory) {
-  std::unique_ptr<cricket::PortAllocator> port_allocator(
-      new cricket::FakePortAllocator(network_thread_, nullptr));
-
-  fake_audio_capture_module_ = FakeAudioCaptureModule::Create();
-  if (fake_audio_capture_module_ == NULL) {
-    return false;
-  }
-
-  peer_connection_factory_ = webrtc::CreatePeerConnectionFactory(
-      network_thread_, worker_thread_, rtc::Thread::Current(),
-      fake_audio_capture_module_, audio_encoder_factory, audio_decoder_factory,
-      nullptr, nullptr);
-  if (!peer_connection_factory_) {
-    return false;
-  }
-
-  std::unique_ptr<rtc::RTCCertificateGeneratorInterface> cert_generator(
-      new FakeRTCCertificateGenerator());
-  peer_connection_ = peer_connection_factory_->CreatePeerConnection(
-      config, constraints, std::move(port_allocator), std::move(cert_generator),
-      this);
-
-  return peer_connection_.get() != NULL;
-}
-
-rtc::scoped_refptr<webrtc::DataChannelInterface>
-PeerConnectionTestWrapper::CreateDataChannel(
-    const std::string& label,
-    const webrtc::DataChannelInit& init) {
-  return peer_connection_->CreateDataChannel(label, &init);
-}
-
-void PeerConnectionTestWrapper::OnAddStream(
-    rtc::scoped_refptr<MediaStreamInterface> stream) {
-  LOG(LS_INFO) << "PeerConnectionTestWrapper " << name_
-               << ": OnAddStream";
-  // TODO(ronghuawu): support multiple streams.
-  if (stream->GetVideoTracks().size() > 0) {
-    renderer_.reset(new FakeVideoTrackRenderer(stream->GetVideoTracks()[0]));
-  }
-}
-
-void PeerConnectionTestWrapper::OnIceCandidate(
-    const IceCandidateInterface* candidate) {
-  std::string sdp;
-  EXPECT_TRUE(candidate->ToString(&sdp));
-  // Give the user a chance to modify sdp for testing.
-  SignalOnIceCandidateCreated(&sdp);
-  SignalOnIceCandidateReady(candidate->sdp_mid(), candidate->sdp_mline_index(),
-                            sdp);
-}
-
-void PeerConnectionTestWrapper::OnDataChannel(
-    rtc::scoped_refptr<webrtc::DataChannelInterface> data_channel) {
-  SignalOnDataChannel(data_channel);
-}
-
-void PeerConnectionTestWrapper::OnSuccess(SessionDescriptionInterface* desc) {
-  // This callback should take the ownership of |desc|.
-  std::unique_ptr<SessionDescriptionInterface> owned_desc(desc);
-  std::string sdp;
-  EXPECT_TRUE(desc->ToString(&sdp));
-
-  LOG(LS_INFO) << "PeerConnectionTestWrapper " << name_
-               << ": " << desc->type() << " sdp created: " << sdp;
-
-  // Give the user a chance to modify sdp for testing.
-  SignalOnSdpCreated(&sdp);
-
-  SetLocalDescription(desc->type(), sdp);
-
-  SignalOnSdpReady(sdp);
-}
-
-void PeerConnectionTestWrapper::CreateOffer(
-    const MediaConstraintsInterface* constraints) {
-  LOG(LS_INFO) << "PeerConnectionTestWrapper " << name_
-               << ": CreateOffer.";
-  peer_connection_->CreateOffer(this, constraints);
-}
-
-void PeerConnectionTestWrapper::CreateAnswer(
-    const MediaConstraintsInterface* constraints) {
-  LOG(LS_INFO) << "PeerConnectionTestWrapper " << name_
-               << ": CreateAnswer.";
-  peer_connection_->CreateAnswer(this, constraints);
-}
-
-void PeerConnectionTestWrapper::ReceiveOfferSdp(const std::string& sdp) {
-  SetRemoteDescription(SessionDescriptionInterface::kOffer, sdp);
-  CreateAnswer(NULL);
-}
-
-void PeerConnectionTestWrapper::ReceiveAnswerSdp(const std::string& sdp) {
-  SetRemoteDescription(SessionDescriptionInterface::kAnswer, sdp);
-}
-
-void PeerConnectionTestWrapper::SetLocalDescription(const std::string& type,
-                                                    const std::string& sdp) {
-  LOG(LS_INFO) << "PeerConnectionTestWrapper " << name_
-               << ": SetLocalDescription " << type << " " << sdp;
-
-  rtc::scoped_refptr<MockSetSessionDescriptionObserver>
-      observer(new rtc::RefCountedObject<
-                   MockSetSessionDescriptionObserver>());
-  peer_connection_->SetLocalDescription(
-      observer, webrtc::CreateSessionDescription(type, sdp, NULL));
-}
-
-void PeerConnectionTestWrapper::SetRemoteDescription(const std::string& type,
-                                                     const std::string& sdp) {
-  LOG(LS_INFO) << "PeerConnectionTestWrapper " << name_
-               << ": SetRemoteDescription " << type << " " << sdp;
-
-  rtc::scoped_refptr<MockSetSessionDescriptionObserver>
-      observer(new rtc::RefCountedObject<
-                   MockSetSessionDescriptionObserver>());
-  peer_connection_->SetRemoteDescription(
-      observer, webrtc::CreateSessionDescription(type, sdp, NULL));
-}
-
-void PeerConnectionTestWrapper::AddIceCandidate(const std::string& sdp_mid,
-                                                int sdp_mline_index,
-                                                const std::string& candidate) {
-  std::unique_ptr<webrtc::IceCandidateInterface> owned_candidate(
-      webrtc::CreateIceCandidate(sdp_mid, sdp_mline_index, candidate, NULL));
-  EXPECT_TRUE(peer_connection_->AddIceCandidate(owned_candidate.get()));
-}
-
-void PeerConnectionTestWrapper::WaitForCallEstablished() {
-  WaitForConnection();
-  WaitForAudio();
-  WaitForVideo();
-}
-
-void PeerConnectionTestWrapper::WaitForConnection() {
-  EXPECT_TRUE_WAIT(CheckForConnection(), kMaxWait);
-  LOG(LS_INFO) << "PeerConnectionTestWrapper " << name_
-               << ": Connected.";
-}
-
-bool PeerConnectionTestWrapper::CheckForConnection() {
-  return (peer_connection_->ice_connection_state() ==
-          PeerConnectionInterface::kIceConnectionConnected) ||
-         (peer_connection_->ice_connection_state() ==
-          PeerConnectionInterface::kIceConnectionCompleted);
-}
-
-void PeerConnectionTestWrapper::WaitForAudio() {
-  EXPECT_TRUE_WAIT(CheckForAudio(), kMaxWait);
-  LOG(LS_INFO) << "PeerConnectionTestWrapper " << name_
-               << ": Got enough audio frames.";
-}
-
-bool PeerConnectionTestWrapper::CheckForAudio() {
-  return (fake_audio_capture_module_->frames_received() >=
-          kTestAudioFrameCount);
-}
-
-void PeerConnectionTestWrapper::WaitForVideo() {
-  EXPECT_TRUE_WAIT(CheckForVideo(), kMaxWait);
-  LOG(LS_INFO) << "PeerConnectionTestWrapper " << name_
-               << ": Got enough video frames.";
-}
-
-bool PeerConnectionTestWrapper::CheckForVideo() {
-  if (!renderer_) {
-    return false;
-  }
-  return (renderer_->num_rendered_frames() >= kTestVideoFrameCount);
-}
-
-void PeerConnectionTestWrapper::GetAndAddUserMedia(
-    bool audio, const webrtc::FakeConstraints& audio_constraints,
-    bool video, const webrtc::FakeConstraints& video_constraints) {
-  rtc::scoped_refptr<webrtc::MediaStreamInterface> stream =
-      GetUserMedia(audio, audio_constraints, video, video_constraints);
-  EXPECT_TRUE(peer_connection_->AddStream(stream));
-}
-
-rtc::scoped_refptr<webrtc::MediaStreamInterface>
-    PeerConnectionTestWrapper::GetUserMedia(
-        bool audio, const webrtc::FakeConstraints& audio_constraints,
-        bool video, const webrtc::FakeConstraints& video_constraints) {
-  std::string label = kStreamLabelBase +
-      rtc::ToString<int>(
-          static_cast<int>(peer_connection_->local_streams()->count()));
-  rtc::scoped_refptr<webrtc::MediaStreamInterface> stream =
-      peer_connection_factory_->CreateLocalMediaStream(label);
-
-  if (audio) {
-    FakeConstraints constraints = audio_constraints;
-    // Disable highpass filter so that we can get all the test audio frames.
-    constraints.AddMandatory(
-        MediaConstraintsInterface::kHighpassFilter, false);
-    rtc::scoped_refptr<webrtc::AudioSourceInterface> source =
-        peer_connection_factory_->CreateAudioSource(&constraints);
-    rtc::scoped_refptr<webrtc::AudioTrackInterface> audio_track(
-        peer_connection_factory_->CreateAudioTrack(kAudioTrackLabelBase,
-                                                   source));
-    stream->AddTrack(audio_track);
-  }
-
-  if (video) {
-    // Set max frame rate to 10fps to reduce the risk of the tests to be flaky.
-    FakeConstraints constraints = video_constraints;
-    constraints.SetMandatoryMaxFrameRate(10);
-
-    rtc::scoped_refptr<webrtc::VideoTrackSourceInterface> source =
-        peer_connection_factory_->CreateVideoSource(
-            std::unique_ptr<cricket::VideoCapturer>(
-                new webrtc::FakePeriodicVideoCapturer()),
-            &constraints);
-    std::string videotrack_label = label + kVideoTrackLabelBase;
-    rtc::scoped_refptr<webrtc::VideoTrackInterface> video_track(
-        peer_connection_factory_->CreateVideoTrack(videotrack_label, source));
-
-    stream->AddTrack(video_track);
-  }
-  return stream;
-}
diff --git a/pc/test/peerconnectiontestwrapper.h b/pc/test/peerconnectiontestwrapper.h
deleted file mode 100644
index c0d1ea3..0000000
--- a/pc/test/peerconnectiontestwrapper.h
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- *  Copyright 2013 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_PC_TEST_PEERCONNECTIONTESTWRAPPER_H_
-#define WEBRTC_PC_TEST_PEERCONNECTIONTESTWRAPPER_H_
-
-#include <memory>
-
-#include "webrtc/api/peerconnectioninterface.h"
-#include "webrtc/api/test/fakeconstraints.h"
-#include "webrtc/pc/test/fakeaudiocapturemodule.h"
-#include "webrtc/pc/test/fakevideotrackrenderer.h"
-#include "webrtc/rtc_base/sigslot.h"
-
-class PeerConnectionTestWrapper
-    : public webrtc::PeerConnectionObserver,
-      public webrtc::CreateSessionDescriptionObserver,
-      public sigslot::has_slots<> {
- public:
-  static void Connect(PeerConnectionTestWrapper* caller,
-                      PeerConnectionTestWrapper* callee);
-
-  PeerConnectionTestWrapper(const std::string& name,
-                            rtc::Thread* network_thread,
-                            rtc::Thread* worker_thread);
-  virtual ~PeerConnectionTestWrapper();
-
-  bool CreatePc(
-      const webrtc::MediaConstraintsInterface* constraints,
-      const webrtc::PeerConnectionInterface::RTCConfiguration& config,
-      rtc::scoped_refptr<webrtc::AudioEncoderFactory> audio_encoder_factory,
-      rtc::scoped_refptr<webrtc::AudioDecoderFactory> audio_decoder_factory);
-
-  webrtc::PeerConnectionInterface* pc() { return peer_connection_.get(); }
-
-  rtc::scoped_refptr<webrtc::DataChannelInterface> CreateDataChannel(
-      const std::string& label,
-      const webrtc::DataChannelInit& init);
-
-  // Implements PeerConnectionObserver.
-  void OnSignalingChange(
-     webrtc::PeerConnectionInterface::SignalingState new_state) override {}
-  void OnAddStream(
-      rtc::scoped_refptr<webrtc::MediaStreamInterface> stream) override;
-  void OnRemoveStream(
-      rtc::scoped_refptr<webrtc::MediaStreamInterface> stream) override {}
-  void OnDataChannel(
-      rtc::scoped_refptr<webrtc::DataChannelInterface> data_channel) override ;
-  void OnRenegotiationNeeded() override {}
-  void OnIceConnectionChange(
-      webrtc::PeerConnectionInterface::IceConnectionState new_state) override {}
-  void OnIceGatheringChange(
-      webrtc::PeerConnectionInterface::IceGatheringState new_state) override {}
-  void OnIceCandidate(const webrtc::IceCandidateInterface* candidate) override;
-
-  // Implements CreateSessionDescriptionObserver.
-  void OnSuccess(webrtc::SessionDescriptionInterface* desc) override;
-  void OnFailure(const std::string& error) override {}
-
-  void CreateOffer(const webrtc::MediaConstraintsInterface* constraints);
-  void CreateAnswer(const webrtc::MediaConstraintsInterface* constraints);
-  void ReceiveOfferSdp(const std::string& sdp);
-  void ReceiveAnswerSdp(const std::string& sdp);
-  void AddIceCandidate(const std::string& sdp_mid, int sdp_mline_index,
-                       const std::string& candidate);
-  void WaitForCallEstablished();
-  void WaitForConnection();
-  void WaitForAudio();
-  void WaitForVideo();
-  void GetAndAddUserMedia(
-    bool audio, const webrtc::FakeConstraints& audio_constraints,
-    bool video, const webrtc::FakeConstraints& video_constraints);
-
-  // sigslots
-  sigslot::signal1<std::string*> SignalOnIceCandidateCreated;
-  sigslot::signal3<const std::string&,
-                   int,
-                   const std::string&> SignalOnIceCandidateReady;
-  sigslot::signal1<std::string*> SignalOnSdpCreated;
-  sigslot::signal1<const std::string&> SignalOnSdpReady;
-  sigslot::signal1<webrtc::DataChannelInterface*> SignalOnDataChannel;
-
- private:
-  void SetLocalDescription(const std::string& type, const std::string& sdp);
-  void SetRemoteDescription(const std::string& type, const std::string& sdp);
-  bool CheckForConnection();
-  bool CheckForAudio();
-  bool CheckForVideo();
-  rtc::scoped_refptr<webrtc::MediaStreamInterface> GetUserMedia(
-      bool audio, const webrtc::FakeConstraints& audio_constraints,
-      bool video, const webrtc::FakeConstraints& video_constraints);
-
-  std::string name_;
-  rtc::Thread* const network_thread_;
-  rtc::Thread* const worker_thread_;
-  rtc::scoped_refptr<webrtc::PeerConnectionInterface> peer_connection_;
-  rtc::scoped_refptr<webrtc::PeerConnectionFactoryInterface>
-      peer_connection_factory_;
-  rtc::scoped_refptr<FakeAudioCaptureModule> fake_audio_capture_module_;
-  std::unique_ptr<webrtc::FakeVideoTrackRenderer> renderer_;
-};
-
-#endif  // WEBRTC_PC_TEST_PEERCONNECTIONTESTWRAPPER_H_
diff --git a/pc/test/rtcstatsobtainer.h b/pc/test/rtcstatsobtainer.h
deleted file mode 100644
index 62e995e..0000000
--- a/pc/test/rtcstatsobtainer.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- *  Copyright 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_PC_TEST_RTCSTATSOBTAINER_H_
-#define WEBRTC_PC_TEST_RTCSTATSOBTAINER_H_
-
-#include "webrtc/api/stats/rtcstatsreport.h"
-#include "webrtc/rtc_base/gunit.h"
-
-namespace webrtc {
-
-class RTCStatsObtainer : public RTCStatsCollectorCallback {
- public:
-  static rtc::scoped_refptr<RTCStatsObtainer> Create(
-      rtc::scoped_refptr<const RTCStatsReport>* report_ptr = nullptr) {
-    return rtc::scoped_refptr<RTCStatsObtainer>(
-        new rtc::RefCountedObject<RTCStatsObtainer>(report_ptr));
-  }
-
-  void OnStatsDelivered(
-      const rtc::scoped_refptr<const RTCStatsReport>& report) override {
-    EXPECT_TRUE(thread_checker_.CalledOnValidThread());
-    report_ = report;
-    if (report_ptr_)
-      *report_ptr_ = report_;
-  }
-
-  rtc::scoped_refptr<const RTCStatsReport> report() const {
-    EXPECT_TRUE(thread_checker_.CalledOnValidThread());
-    return report_;
-  }
-
- protected:
-  explicit RTCStatsObtainer(
-      rtc::scoped_refptr<const RTCStatsReport>* report_ptr)
-      : report_ptr_(report_ptr) {}
-
- private:
-  rtc::ThreadChecker thread_checker_;
-  rtc::scoped_refptr<const RTCStatsReport> report_;
-  rtc::scoped_refptr<const RTCStatsReport>* report_ptr_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_PC_TEST_RTCSTATSOBTAINER_H_
diff --git a/pc/test/testsdpstrings.h b/pc/test/testsdpstrings.h
deleted file mode 100644
index ff097b2..0000000
--- a/pc/test/testsdpstrings.h
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- *  Copyright 2012 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.
- */
-
-// This file contain SDP strings used for testing.
-
-#ifndef WEBRTC_PC_TEST_TESTSDPSTRINGS_H_
-#define WEBRTC_PC_TEST_TESTSDPSTRINGS_H_
-
-namespace webrtc {
-
-// SDP offer string from a Nightly FireFox build.
-static const char kFireFoxSdpOffer[] =
-    "v=0\r\n"
-    "o=Mozilla-SIPUA 23551 0 IN IP4 0.0.0.0\r\n"
-    "s=SIP Call\r\n"
-    "t=0 0\r\n"
-    "a=ice-ufrag:e5785931\r\n"
-    "a=ice-pwd:36fb7878390db89481c1d46daa4278d8\r\n"
-    "a=fingerprint:sha-256 A7:24:72:CA:6E:02:55:39:BA:66:DF:6E:CC:4C:D8:B0:1A:"
-    "BF:1A:56:65:7D:F4:03:AD:7E:77:43:2A:29:EC:93\r\n"
-    "m=audio 36993 RTP/SAVPF 109 0 8 101\r\n"
-    "c=IN IP4 74.95.2.170\r\n"
-    "a=rtpmap:109 opus/48000/2\r\n"
-    "a=ptime:20\r\n"
-    "a=rtcp-mux\r\n"
-    "a=rtpmap:0 PCMU/8000\r\n"
-    "a=rtpmap:8 PCMA/8000\r\n"
-    "a=rtpmap:101 telephone-event/8000\r\n"
-    "a=fmtp:101 0-15\r\n"
-    "a=sendrecv\r\n"
-    "a=candidate:0 1 UDP 2112946431 172.16.191.1 61725 typ host\r\n"
-    "a=candidate:2 1 UDP 2112487679 172.16.131.1 58798 typ host\r\n"
-    "a=candidate:4 1 UDP 2113667327 10.0.254.2 58122 typ host\r\n"
-    "a=candidate:5 1 UDP 1694302207 74.95.2.170 36993 typ srflx raddr "
-    "10.0.254.2 rport 58122\r\n"
-    "a=candidate:0 2 UDP 2112946430 172.16.191.1 55025 typ host\r\n"
-    "a=candidate:2 2 UDP 2112487678 172.16.131.1 63576 typ host\r\n"
-    "a=candidate:4 2 UDP 2113667326 10.0.254.2 50962 typ host\r\n"
-    "a=candidate:5 2 UDP 1694302206 74.95.2.170 41028 typ srflx raddr"
-    " 10.0.254.2 rport 50962\r\n"
-    "m=video 38826 RTP/SAVPF 120\r\n"
-    "c=IN IP4 74.95.2.170\r\n"
-    "a=rtcp-mux\r\n"
-    "a=rtpmap:120 VP8/90000\r\n"
-    "a=sendrecv\r\n"
-    "a=candidate:0 1 UDP 2112946431 172.16.191.1 62017 typ host\r\n"
-    "a=candidate:2 1 UDP 2112487679 172.16.131.1 59741 typ host\r\n"
-    "a=candidate:4 1 UDP 2113667327 10.0.254.2 62652 typ host\r\n"
-    "a=candidate:5 1 UDP 1694302207 74.95.2.170 38826 typ srflx raddr"
-    " 10.0.254.2 rport 62652\r\n"
-    "a=candidate:0 2 UDP 2112946430 172.16.191.1 63440 typ host\r\n"
-    "a=candidate:2 2 UDP 2112487678 172.16.131.1 51847 typ host\r\n"
-    "a=candidate:4 2 UDP 2113667326 10.0.254.2 58890 typ host\r\n"
-    "a=candidate:5 2 UDP 1694302206 74.95.2.170 33611 typ srflx raddr"
-    " 10.0.254.2 rport 58890\r\n"
-#ifdef HAVE_SCTP
-    "m=application 45536 SCTP/DTLS 5000\r\n"
-    "c=IN IP4 74.95.2.170\r\n"
-    "a=fmtp:5000 protocol=webrtc-datachannel;streams=16\r\n"
-    "a=sendrecv\r\n"
-    "a=candidate:0 1 UDP 2112946431 172.16.191.1 60248 typ host\r\n"
-    "a=candidate:2 1 UDP 2112487679 172.16.131.1 55925 typ host\r\n"
-    "a=candidate:4 1 UDP 2113667327 10.0.254.2 65268 typ host\r\n"
-    "a=candidate:5 1 UDP 1694302207 74.95.2.170 45536 typ srflx raddr"
-    " 10.0.254.2 rport 65268\r\n"
-    "a=candidate:0 2 UDP 2112946430 172.16.191.1 49162 typ host\r\n"
-    "a=candidate:2 2 UDP 2112487678 172.16.131.1 59635 typ host\r\n"
-    "a=candidate:4 2 UDP 2113667326 10.0.254.2 61232 typ host\r\n"
-    "a=candidate:5 2 UDP 1694302206 74.95.2.170 45468 typ srflx raddr"
-    " 10.0.254.2 rport 61232\r\n"
-#endif
-    ;
-
-// Audio SDP with a limited set of audio codecs.
-static const char kAudioSdp[] =
-    "v=0\r\n"
-    "o=- 7859371131 2 IN IP4 192.168.30.208\r\n"
-    "s=-\r\n"
-    "c=IN IP4 192.168.30.208\r\n"
-    "t=0 0\r\n"
-    "m=audio 16000 RTP/SAVPF 0 8 126\r\n"
-    "a=rtpmap:0 PCMU/8000\r\n"
-    "a=rtpmap:8 PCMA/8000\r\n"
-    "a=rtpmap:126 telephone-event/8000\r\n"
-    "a=sendrecv\r\n"
-    "a=rtcp:16000 IN IP4 192.168.30.208\r\n"
-    "a=rtcp-mux\r\n"
-    "a=crypto:1 AES_CM_128_HMAC_SHA1_80 "
-    "inline:tvKIFjbMQ7W0/C2RzhwN0oQglj/7GJg+frdsNRxt\r\n"
-    "a=ice-ufrag:AI2sRT3r\r\n"
-    "a=ice-pwd:lByS9z2RSQlSE9XurlvjYmEm\r\n"
-    "a=ssrc:4227871655 cname:GeAAgb6XCPNLVMX5\r\n"
-    "a=ssrc:4227871655 msid:1NFAV3iD08ioO2339rQS9pfOI9mDf6GeG9F4 a0\r\n"
-    "a=ssrc:4227871655 mslabel:1NFAV3iD08ioO2339rQS9pfOI9mDf6GeG9F4\r\n"
-    "a=ssrc:4227871655 label:1NFAV3iD08ioO2339rQS9pfOI9mDf6GeG9F4a0\r\n"
-    "a=mid:audio\r\n";
-
-static const char kAudioSdpWithUnsupportedCodecs[] =
-    "v=0\r\n"
-    "o=- 6858750541 2 IN IP4 192.168.30.208\r\n"
-    "s=-\r\n"
-    "c=IN IP4 192.168.30.208\r\n"
-    "t=0 0\r\n"
-    "m=audio 16000 RTP/SAVPF 0 8 18 110 126\r\n"
-    "a=rtpmap:0 PCMU/8000\r\n"
-    "a=rtpmap:8 PCMA/8000\r\n"
-    "a=rtpmap:18 WeirdCodec1/8000\r\n"
-    "a=rtpmap:110 WeirdCodec2/8000\r\n"
-    "a=rtpmap:126 telephone-event/8000\r\n"
-    "a=sendonly\r\n"
-    "a=rtcp:16000 IN IP4 192.168.30.208\r\n"
-    "a=rtcp-mux\r\n"
-    "a=crypto:1 AES_CM_128_HMAC_SHA1_80 "
-    "inline:tvKIFjbMQ7W0/C2RzhwN0oQglj/7GJg+frdsNRxt\r\n"
-    "a=ice-ufrag:AI2sRT3r\r\n"
-    "a=ice-pwd:lByS9z2RSQlSE9XurlvjYmEm\r\n"
-    "a=ssrc:4227871655 cname:TsmD02HRfhkJBm4m\r\n"
-    "a=ssrc:4227871655 msid:7nU0TApbB-n4dfPlCplWT9QTEsbBDS1IlpW3 a0\r\n"
-    "a=ssrc:4227871655 mslabel:7nU0TApbB-n4dfPlCplWT9QTEsbBDS1IlpW3\r\n"
-    "a=ssrc:4227871655 label:7nU0TApbB-n4dfPlCplWT9QTEsbBDS1IlpW3a0\r\n"
-    "a=mid:audio\r\n";
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_PC_TEST_TESTSDPSTRINGS_H_
diff --git a/pc/trackmediainfomap.cc b/pc/trackmediainfomap.cc
deleted file mode 100644
index b5c5ac6..0000000
--- a/pc/trackmediainfomap.cc
+++ /dev/null
@@ -1,226 +0,0 @@
-/*
- *  Copyright 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/pc/trackmediainfomap.h"
-
-#include <utility>
-
-namespace webrtc {
-
-namespace {
-
-template <typename K, typename V>
-V FindValueOrNull(const std::map<K, V>& map, const K& key) {
-  auto it = map.find(key);
-  return (it != map.end()) ? it->second : nullptr;
-}
-
-template <typename K, typename V>
-const V* FindAddressOrNull(const std::map<K, V>& map, const K& key) {
-  auto it = map.find(key);
-  return (it != map.end()) ? &it->second : nullptr;
-}
-
-void GetAudioAndVideoTrackBySsrc(
-    const std::vector<rtc::scoped_refptr<RtpSenderInterface>>& rtp_senders,
-    const std::vector<rtc::scoped_refptr<RtpReceiverInterface>>& rtp_receivers,
-    std::map<uint32_t, AudioTrackInterface*>* local_audio_track_by_ssrc,
-    std::map<uint32_t, VideoTrackInterface*>* local_video_track_by_ssrc,
-    std::map<uint32_t, AudioTrackInterface*>* remote_audio_track_by_ssrc,
-    std::map<uint32_t, VideoTrackInterface*>* remote_video_track_by_ssrc,
-    AudioTrackInterface** unsignaled_audio_track,
-    VideoTrackInterface** unsignaled_video_track) {
-  RTC_DCHECK(local_audio_track_by_ssrc->empty());
-  RTC_DCHECK(local_video_track_by_ssrc->empty());
-  RTC_DCHECK(remote_audio_track_by_ssrc->empty());
-  RTC_DCHECK(remote_video_track_by_ssrc->empty());
-  // TODO(hbos): RTP senders/receivers uses a proxy to the signaling thread, and
-  // our sender/receiver implementations invokes on the worker thread. (This
-  // means one thread jump if on signaling thread and two thread jumps if on any
-  // other threads). Is there a way to avoid thread jump(s) on a per
-  // sender/receiver, per method basis?
-  for (const rtc::scoped_refptr<RtpSenderInterface>& rtp_sender : rtp_senders) {
-    cricket::MediaType media_type = rtp_sender->media_type();
-    MediaStreamTrackInterface* track = rtp_sender->track();
-    if (!track) {
-      continue;
-    }
-    RTC_DCHECK_EQ(track->kind(), media_type == cricket::MEDIA_TYPE_AUDIO
-                                     ? MediaStreamTrackInterface::kAudioKind
-                                     : MediaStreamTrackInterface::kVideoKind);
-    // TODO(deadbeef): |ssrc| should be removed in favor of |GetParameters|.
-    uint32_t ssrc = rtp_sender->ssrc();
-    if (ssrc != 0) {
-      if (media_type == cricket::MEDIA_TYPE_AUDIO) {
-        RTC_DCHECK(local_audio_track_by_ssrc->find(ssrc) ==
-                   local_audio_track_by_ssrc->end());
-        (*local_audio_track_by_ssrc)[ssrc] =
-            static_cast<AudioTrackInterface*>(track);
-      } else {
-        RTC_DCHECK(local_video_track_by_ssrc->find(ssrc) ==
-                   local_video_track_by_ssrc->end());
-        (*local_video_track_by_ssrc)[ssrc] =
-            static_cast<VideoTrackInterface*>(track);
-      }
-    }
-  }
-  for (const rtc::scoped_refptr<RtpReceiverInterface>& rtp_receiver :
-       rtp_receivers) {
-    cricket::MediaType media_type = rtp_receiver->media_type();
-    MediaStreamTrackInterface* track = rtp_receiver->track();
-    RTC_DCHECK(track);
-    RTC_DCHECK_EQ(track->kind(), media_type == cricket::MEDIA_TYPE_AUDIO
-                                     ? MediaStreamTrackInterface::kAudioKind
-                                     : MediaStreamTrackInterface::kVideoKind);
-    RtpParameters params = rtp_receiver->GetParameters();
-    for (const RtpEncodingParameters& encoding : params.encodings) {
-      if (!encoding.ssrc) {
-        if (media_type == cricket::MEDIA_TYPE_AUDIO) {
-          *unsignaled_audio_track = static_cast<AudioTrackInterface*>(track);
-        } else {
-          RTC_DCHECK(media_type == cricket::MEDIA_TYPE_VIDEO);
-          *unsignaled_video_track = static_cast<VideoTrackInterface*>(track);
-        }
-        continue;
-      }
-      if (media_type == cricket::MEDIA_TYPE_AUDIO) {
-        RTC_DCHECK(remote_audio_track_by_ssrc->find(*encoding.ssrc) ==
-                   remote_audio_track_by_ssrc->end());
-        (*remote_audio_track_by_ssrc)[*encoding.ssrc] =
-            static_cast<AudioTrackInterface*>(track);
-      } else {
-        RTC_DCHECK(remote_video_track_by_ssrc->find(*encoding.ssrc) ==
-                   remote_video_track_by_ssrc->end());
-        (*remote_video_track_by_ssrc)[*encoding.ssrc] =
-            static_cast<VideoTrackInterface*>(track);
-      }
-    }
-  }
-}
-
-}  // namespace
-
-TrackMediaInfoMap::TrackMediaInfoMap(
-    std::unique_ptr<cricket::VoiceMediaInfo> voice_media_info,
-    std::unique_ptr<cricket::VideoMediaInfo> video_media_info,
-    const std::vector<rtc::scoped_refptr<RtpSenderInterface>>& rtp_senders,
-    const std::vector<rtc::scoped_refptr<RtpReceiverInterface>>& rtp_receivers)
-    : voice_media_info_(std::move(voice_media_info)),
-      video_media_info_(std::move(video_media_info)) {
-  std::map<uint32_t, AudioTrackInterface*> local_audio_track_by_ssrc;
-  std::map<uint32_t, VideoTrackInterface*> local_video_track_by_ssrc;
-  std::map<uint32_t, AudioTrackInterface*> remote_audio_track_by_ssrc;
-  std::map<uint32_t, VideoTrackInterface*> remote_video_track_by_ssrc;
-  AudioTrackInterface* unsignaled_audio_track = nullptr;
-  VideoTrackInterface* unsignaled_video_track = nullptr;
-  GetAudioAndVideoTrackBySsrc(
-      rtp_senders, rtp_receivers, &local_audio_track_by_ssrc,
-      &local_video_track_by_ssrc, &remote_audio_track_by_ssrc,
-      &remote_video_track_by_ssrc, &unsignaled_audio_track,
-      &unsignaled_video_track);
-  if (voice_media_info_) {
-    for (auto& sender_info : voice_media_info_->senders) {
-      AudioTrackInterface* associated_track =
-          FindValueOrNull(local_audio_track_by_ssrc, sender_info.ssrc());
-      if (associated_track) {
-        // One sender is associated with at most one track.
-        // One track may be associated with multiple senders.
-        audio_track_by_sender_info_[&sender_info] = associated_track;
-        voice_infos_by_local_track_[associated_track].push_back(&sender_info);
-      }
-    }
-    for (auto& receiver_info : voice_media_info_->receivers) {
-      AudioTrackInterface* associated_track =
-          FindValueOrNull(remote_audio_track_by_ssrc, receiver_info.ssrc());
-      if (associated_track) {
-        // One receiver is associated with at most one track, which is uniquely
-        // associated with that receiver.
-        audio_track_by_receiver_info_[&receiver_info] = associated_track;
-        RTC_DCHECK(voice_info_by_remote_track_.find(associated_track) ==
-                   voice_info_by_remote_track_.end());
-        voice_info_by_remote_track_[associated_track] = &receiver_info;
-      } else if (unsignaled_audio_track) {
-        audio_track_by_receiver_info_[&receiver_info] = unsignaled_audio_track;
-        voice_info_by_remote_track_[unsignaled_audio_track] = &receiver_info;
-      }
-    }
-  }
-  if (video_media_info_) {
-    for (auto& sender_info : video_media_info_->senders) {
-      VideoTrackInterface* associated_track =
-          FindValueOrNull(local_video_track_by_ssrc, sender_info.ssrc());
-      if (associated_track) {
-        // One sender is associated with at most one track.
-        // One track may be associated with multiple senders.
-        video_track_by_sender_info_[&sender_info] = associated_track;
-        video_infos_by_local_track_[associated_track].push_back(&sender_info);
-      }
-    }
-    for (auto& receiver_info : video_media_info_->receivers) {
-      VideoTrackInterface* associated_track =
-          FindValueOrNull(remote_video_track_by_ssrc, receiver_info.ssrc());
-      if (associated_track) {
-        // One receiver is associated with at most one track, which is uniquely
-        // associated with that receiver.
-        video_track_by_receiver_info_[&receiver_info] = associated_track;
-        RTC_DCHECK(video_info_by_remote_track_.find(associated_track) ==
-                   video_info_by_remote_track_.end());
-        video_info_by_remote_track_[associated_track] = &receiver_info;
-      } else if (unsignaled_video_track) {
-        video_track_by_receiver_info_[&receiver_info] = unsignaled_video_track;
-        video_info_by_remote_track_[unsignaled_video_track] = &receiver_info;
-      }
-    }
-  }
-}
-
-const std::vector<cricket::VoiceSenderInfo*>*
-TrackMediaInfoMap::GetVoiceSenderInfos(
-    const AudioTrackInterface& local_audio_track) const {
-  return FindAddressOrNull(voice_infos_by_local_track_, &local_audio_track);
-}
-
-const cricket::VoiceReceiverInfo* TrackMediaInfoMap::GetVoiceReceiverInfo(
-    const AudioTrackInterface& remote_audio_track) const {
-  return FindValueOrNull(voice_info_by_remote_track_, &remote_audio_track);
-}
-
-const std::vector<cricket::VideoSenderInfo*>*
-TrackMediaInfoMap::GetVideoSenderInfos(
-    const VideoTrackInterface& local_video_track) const {
-  return FindAddressOrNull(video_infos_by_local_track_, &local_video_track);
-}
-
-const cricket::VideoReceiverInfo* TrackMediaInfoMap::GetVideoReceiverInfo(
-    const VideoTrackInterface& remote_video_track) const {
-  return FindValueOrNull(video_info_by_remote_track_, &remote_video_track);
-}
-
-rtc::scoped_refptr<AudioTrackInterface> TrackMediaInfoMap::GetAudioTrack(
-    const cricket::VoiceSenderInfo& voice_sender_info) const {
-  return FindValueOrNull(audio_track_by_sender_info_, &voice_sender_info);
-}
-
-rtc::scoped_refptr<AudioTrackInterface> TrackMediaInfoMap::GetAudioTrack(
-    const cricket::VoiceReceiverInfo& voice_receiver_info) const {
-  return FindValueOrNull(audio_track_by_receiver_info_, &voice_receiver_info);
-}
-
-rtc::scoped_refptr<VideoTrackInterface> TrackMediaInfoMap::GetVideoTrack(
-    const cricket::VideoSenderInfo& video_sender_info) const {
-  return FindValueOrNull(video_track_by_sender_info_, &video_sender_info);
-}
-
-rtc::scoped_refptr<VideoTrackInterface> TrackMediaInfoMap::GetVideoTrack(
-    const cricket::VideoReceiverInfo& video_receiver_info) const {
-  return FindValueOrNull(video_track_by_receiver_info_, &video_receiver_info);
-}
-
-}  // namespace webrtc
diff --git a/pc/trackmediainfomap.h b/pc/trackmediainfomap.h
deleted file mode 100644
index 174d331..0000000
--- a/pc/trackmediainfomap.h
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- *  Copyright 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_PC_TRACKMEDIAINFOMAP_H_
-#define WEBRTC_PC_TRACKMEDIAINFOMAP_H_
-
-#include <map>
-#include <memory>
-#include <vector>
-
-#include "webrtc/api/mediastreaminterface.h"
-#include "webrtc/api/rtpreceiverinterface.h"
-#include "webrtc/api/rtpsenderinterface.h"
-#include "webrtc/media/base/mediachannel.h"
-#include "webrtc/rtc_base/refcount.h"
-
-namespace webrtc {
-
-// Audio/video tracks and sender/receiver statistical information are associated
-// with each other based on attachments to RTP senders/receivers. This class
-// maps that relationship, in both directions, so that stats about a track can
-// be retrieved on a per-attachment basis.
-//
-// An RTP sender/receiver sends or receives media for a set of SSRCs. The media
-// comes from an audio/video track that is attached to it.
-// |[Voice/Video][Sender/Receiver]Info| has statistical information for a set of
-// SSRCs. Looking at the RTP senders and receivers uncovers the track <-> info
-// relationships, which this class does.
-class TrackMediaInfoMap {
- public:
-  TrackMediaInfoMap(
-      std::unique_ptr<cricket::VoiceMediaInfo> voice_media_info,
-      std::unique_ptr<cricket::VideoMediaInfo> video_media_info,
-      const std::vector<rtc::scoped_refptr<RtpSenderInterface>>& rtp_senders,
-      const std::vector<rtc::scoped_refptr<RtpReceiverInterface>>&
-          rtp_receivers);
-
-  const cricket::VoiceMediaInfo* voice_media_info() const {
-    return voice_media_info_.get();
-  }
-  const cricket::VideoMediaInfo* video_media_info() const {
-    return video_media_info_.get();
-  }
-
-  const std::vector<cricket::VoiceSenderInfo*>* GetVoiceSenderInfos(
-      const AudioTrackInterface& local_audio_track) const;
-  const cricket::VoiceReceiverInfo* GetVoiceReceiverInfo(
-      const AudioTrackInterface& remote_audio_track) const;
-  const std::vector<cricket::VideoSenderInfo*>* GetVideoSenderInfos(
-      const VideoTrackInterface& local_video_track) const;
-  const cricket::VideoReceiverInfo* GetVideoReceiverInfo(
-      const VideoTrackInterface& remote_video_track) const;
-
-  rtc::scoped_refptr<AudioTrackInterface> GetAudioTrack(
-      const cricket::VoiceSenderInfo& voice_sender_info) const;
-  rtc::scoped_refptr<AudioTrackInterface> GetAudioTrack(
-      const cricket::VoiceReceiverInfo& voice_receiver_info) const;
-  rtc::scoped_refptr<VideoTrackInterface> GetVideoTrack(
-      const cricket::VideoSenderInfo& video_sender_info) const;
-  rtc::scoped_refptr<VideoTrackInterface> GetVideoTrack(
-      const cricket::VideoReceiverInfo& video_receiver_info) const;
-
- private:
-  std::unique_ptr<cricket::VoiceMediaInfo> voice_media_info_;
-  std::unique_ptr<cricket::VideoMediaInfo> video_media_info_;
-  // These maps map tracks (identified by a pointer) to their corresponding info
-  // object of the correct kind. One track can map to multiple info objects.
-  std::map<const AudioTrackInterface*, std::vector<cricket::VoiceSenderInfo*>>
-      voice_infos_by_local_track_;
-  std::map<const AudioTrackInterface*, cricket::VoiceReceiverInfo*>
-      voice_info_by_remote_track_;
-  std::map<const VideoTrackInterface*, std::vector<cricket::VideoSenderInfo*>>
-      video_infos_by_local_track_;
-  std::map<const VideoTrackInterface*, cricket::VideoReceiverInfo*>
-      video_info_by_remote_track_;
-  // These maps map info objects to their corresponding tracks. They are always
-  // the inverse of the maps above. One info object always maps to only one
-  // track.
-  std::map<const cricket::VoiceSenderInfo*,
-           rtc::scoped_refptr<AudioTrackInterface>>
-      audio_track_by_sender_info_;
-  std::map<const cricket::VoiceReceiverInfo*,
-           rtc::scoped_refptr<AudioTrackInterface>>
-      audio_track_by_receiver_info_;
-  std::map<const cricket::VideoSenderInfo*,
-           rtc::scoped_refptr<VideoTrackInterface>>
-      video_track_by_sender_info_;
-  std::map<const cricket::VideoReceiverInfo*,
-           rtc::scoped_refptr<VideoTrackInterface>>
-      video_track_by_receiver_info_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_PC_TRACKMEDIAINFOMAP_H_
diff --git a/pc/trackmediainfomap_unittest.cc b/pc/trackmediainfomap_unittest.cc
deleted file mode 100644
index f0a3f1a..0000000
--- a/pc/trackmediainfomap_unittest.cc
+++ /dev/null
@@ -1,412 +0,0 @@
-/*
- *  Copyright 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/pc/trackmediainfomap.h"
-
-#include <initializer_list>
-#include <memory>
-#include <utility>
-#include <vector>
-
-#include "webrtc/api/rtpreceiverinterface.h"
-#include "webrtc/api/rtpsenderinterface.h"
-#include "webrtc/api/test/mock_rtpreceiver.h"
-#include "webrtc/api/test/mock_rtpsender.h"
-#include "webrtc/media/base/mediachannel.h"
-#include "webrtc/pc/audiotrack.h"
-#include "webrtc/pc/test/fakevideotracksource.h"
-#include "webrtc/pc/videotrack.h"
-#include "webrtc/rtc_base/refcount.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-namespace {
-
-RtpParameters CreateRtpParametersWithSsrcs(
-    std::initializer_list<uint32_t> ssrcs) {
-  RtpParameters params;
-  for (uint32_t ssrc : ssrcs) {
-    RtpEncodingParameters encoding_params;
-    encoding_params.ssrc = rtc::Optional<uint32_t>(ssrc);
-    params.encodings.push_back(encoding_params);
-  }
-  return params;
-}
-
-rtc::scoped_refptr<MockRtpSender> CreateMockRtpSender(
-    cricket::MediaType media_type,
-    std::initializer_list<uint32_t> ssrcs,
-    rtc::scoped_refptr<MediaStreamTrackInterface> track) {
-  uint32_t first_ssrc;
-  if (ssrcs.size()) {
-    first_ssrc = *ssrcs.begin();
-  } else {
-    first_ssrc = 0;
-  }
-  rtc::scoped_refptr<MockRtpSender> sender(
-      new rtc::RefCountedObject<MockRtpSender>());
-  EXPECT_CALL(*sender, track()).WillRepeatedly(testing::Return(track));
-  EXPECT_CALL(*sender, ssrc()).WillRepeatedly(testing::Return(first_ssrc));
-  EXPECT_CALL(*sender, media_type())
-      .WillRepeatedly(testing::Return(media_type));
-  EXPECT_CALL(*sender, GetParameters())
-      .WillRepeatedly(testing::Return(CreateRtpParametersWithSsrcs(ssrcs)));
-  return sender;
-}
-
-rtc::scoped_refptr<MockRtpReceiver> CreateMockRtpReceiver(
-    cricket::MediaType media_type,
-    std::initializer_list<uint32_t> ssrcs,
-    rtc::scoped_refptr<MediaStreamTrackInterface> track) {
-  rtc::scoped_refptr<MockRtpReceiver> receiver(
-      new rtc::RefCountedObject<MockRtpReceiver>());
-  EXPECT_CALL(*receiver, track()).WillRepeatedly(testing::Return(track));
-  EXPECT_CALL(*receiver, media_type())
-      .WillRepeatedly(testing::Return(media_type));
-  EXPECT_CALL(*receiver, GetParameters())
-      .WillRepeatedly(testing::Return(CreateRtpParametersWithSsrcs(ssrcs)));
-  return receiver;
-}
-
-class TrackMediaInfoMapTest : public testing::Test {
- public:
-  TrackMediaInfoMapTest()
-      : voice_media_info_(new cricket::VoiceMediaInfo()),
-        video_media_info_(new cricket::VideoMediaInfo()),
-        local_audio_track_(AudioTrack::Create("LocalAudioTrack", nullptr)),
-        remote_audio_track_(AudioTrack::Create("RemoteAudioTrack", nullptr)),
-        local_video_track_(
-            VideoTrack::Create("LocalVideoTrack",
-                               FakeVideoTrackSource::Create(false),
-                               rtc::Thread::Current())),
-        remote_video_track_(
-            VideoTrack::Create("RemoteVideoTrack",
-                               FakeVideoTrackSource::Create(false),
-                               rtc::Thread::Current())) {}
-
-  ~TrackMediaInfoMapTest() {
-    // If we have a map the ownership has been passed to the map, only delete if
-    // |CreateMap| has not been called.
-    if (!map_) {
-      delete voice_media_info_;
-      delete video_media_info_;
-    }
-  }
-
-  void AddRtpSenderWithSsrcs(std::initializer_list<uint32_t> ssrcs,
-                             MediaStreamTrackInterface* local_track) {
-    rtc::scoped_refptr<MockRtpSender> rtp_sender = CreateMockRtpSender(
-        local_track->kind() == MediaStreamTrackInterface::kAudioKind
-            ? cricket::MEDIA_TYPE_AUDIO
-            : cricket::MEDIA_TYPE_VIDEO,
-        ssrcs, local_track);
-    rtp_senders_.push_back(rtp_sender);
-
-    if (local_track->kind() == MediaStreamTrackInterface::kAudioKind) {
-      cricket::VoiceSenderInfo voice_sender_info;
-      size_t i = 0;
-      for (uint32_t ssrc : ssrcs) {
-        voice_sender_info.local_stats.push_back(cricket::SsrcSenderInfo());
-        voice_sender_info.local_stats[i++].ssrc = ssrc;
-      }
-      voice_media_info_->senders.push_back(voice_sender_info);
-    } else {
-      cricket::VideoSenderInfo video_sender_info;
-      size_t i = 0;
-      for (uint32_t ssrc : ssrcs) {
-        video_sender_info.local_stats.push_back(cricket::SsrcSenderInfo());
-        video_sender_info.local_stats[i++].ssrc = ssrc;
-      }
-      video_media_info_->senders.push_back(video_sender_info);
-    }
-  }
-
-  void AddRtpReceiverWithSsrcs(std::initializer_list<uint32_t> ssrcs,
-                               MediaStreamTrackInterface* remote_track) {
-    rtc::scoped_refptr<MockRtpReceiver> rtp_receiver = CreateMockRtpReceiver(
-        remote_track->kind() == MediaStreamTrackInterface::kAudioKind
-            ? cricket::MEDIA_TYPE_AUDIO
-            : cricket::MEDIA_TYPE_VIDEO,
-        ssrcs, remote_track);
-    rtp_receivers_.push_back(rtp_receiver);
-
-    if (remote_track->kind() == MediaStreamTrackInterface::kAudioKind) {
-      cricket::VoiceReceiverInfo voice_receiver_info;
-      size_t i = 0;
-      for (uint32_t ssrc : ssrcs) {
-        voice_receiver_info.local_stats.push_back(cricket::SsrcReceiverInfo());
-        voice_receiver_info.local_stats[i++].ssrc = ssrc;
-      }
-      voice_media_info_->receivers.push_back(voice_receiver_info);
-    } else {
-      cricket::VideoReceiverInfo video_receiver_info;
-      size_t i = 0;
-      for (uint32_t ssrc : ssrcs) {
-        video_receiver_info.local_stats.push_back(cricket::SsrcReceiverInfo());
-        video_receiver_info.local_stats[i++].ssrc = ssrc;
-      }
-      video_media_info_->receivers.push_back(video_receiver_info);
-    }
-  }
-
-  void CreateMap() {
-    RTC_DCHECK(!map_);
-    map_.reset(new TrackMediaInfoMap(
-        std::unique_ptr<cricket::VoiceMediaInfo>(voice_media_info_),
-        std::unique_ptr<cricket::VideoMediaInfo>(video_media_info_),
-        rtp_senders_, rtp_receivers_));
-  }
-
- protected:
-  cricket::VoiceMediaInfo* voice_media_info_;
-  cricket::VideoMediaInfo* video_media_info_;
-  std::vector<rtc::scoped_refptr<RtpSenderInterface>> rtp_senders_;
-  std::vector<rtc::scoped_refptr<RtpReceiverInterface>> rtp_receivers_;
-  std::unique_ptr<TrackMediaInfoMap> map_;
-  rtc::scoped_refptr<AudioTrack> local_audio_track_;
-  rtc::scoped_refptr<AudioTrack> remote_audio_track_;
-  rtc::scoped_refptr<VideoTrack> local_video_track_;
-  rtc::scoped_refptr<VideoTrack> remote_video_track_;
-};
-
-}  // namespace
-
-TEST_F(TrackMediaInfoMapTest, SingleSenderReceiverPerTrackWithOneSsrc) {
-  AddRtpSenderWithSsrcs({1}, local_audio_track_);
-  AddRtpReceiverWithSsrcs({2}, remote_audio_track_);
-  AddRtpSenderWithSsrcs({3}, local_video_track_);
-  AddRtpReceiverWithSsrcs({4}, remote_video_track_);
-  CreateMap();
-
-  // Local audio track <-> RTP audio sender
-  ASSERT_TRUE(map_->GetVoiceSenderInfos(*local_audio_track_));
-  EXPECT_EQ(
-      *map_->GetVoiceSenderInfos(*local_audio_track_),
-      std::vector<cricket::VoiceSenderInfo*>({&voice_media_info_->senders[0]}));
-  EXPECT_EQ(map_->GetAudioTrack(voice_media_info_->senders[0]),
-            local_audio_track_.get());
-
-  // Remote audio track <-> RTP audio receiver
-  EXPECT_EQ(map_->GetVoiceReceiverInfo(*remote_audio_track_),
-            &voice_media_info_->receivers[0]);
-  EXPECT_EQ(map_->GetAudioTrack(voice_media_info_->receivers[0]),
-            remote_audio_track_.get());
-
-  // Local video track <-> RTP video sender
-  ASSERT_TRUE(map_->GetVideoSenderInfos(*local_video_track_));
-  EXPECT_EQ(
-      *map_->GetVideoSenderInfos(*local_video_track_),
-      std::vector<cricket::VideoSenderInfo*>({&video_media_info_->senders[0]}));
-  EXPECT_EQ(map_->GetVideoTrack(video_media_info_->senders[0]),
-            local_video_track_.get());
-
-  // Remote video track <-> RTP video receiver
-  EXPECT_EQ(map_->GetVideoReceiverInfo(*remote_video_track_),
-            &video_media_info_->receivers[0]);
-  EXPECT_EQ(map_->GetVideoTrack(video_media_info_->receivers[0]),
-            remote_video_track_.get());
-}
-
-TEST_F(TrackMediaInfoMapTest, SingleSenderReceiverPerTrackWithMissingSsrc) {
-  AddRtpSenderWithSsrcs({}, local_audio_track_);
-  AddRtpSenderWithSsrcs({}, local_video_track_);
-  AddRtpReceiverWithSsrcs({}, remote_audio_track_);
-  AddRtpReceiverWithSsrcs({}, remote_video_track_);
-  CreateMap();
-
-  EXPECT_FALSE(map_->GetVoiceSenderInfos(*local_audio_track_));
-  EXPECT_FALSE(map_->GetVideoSenderInfos(*local_video_track_));
-  EXPECT_FALSE(map_->GetVoiceReceiverInfo(*remote_audio_track_));
-  EXPECT_FALSE(map_->GetVideoReceiverInfo(*remote_video_track_));
-}
-
-TEST_F(TrackMediaInfoMapTest,
-       SingleSenderReceiverPerTrackWithAudioAndVideoUseSameSsrc) {
-  AddRtpSenderWithSsrcs({1}, local_audio_track_);
-  AddRtpReceiverWithSsrcs({2}, remote_audio_track_);
-  AddRtpSenderWithSsrcs({1}, local_video_track_);
-  AddRtpReceiverWithSsrcs({2}, remote_video_track_);
-  CreateMap();
-
-  // Local audio track <-> RTP audio sender
-  ASSERT_TRUE(map_->GetVoiceSenderInfos(*local_audio_track_));
-  EXPECT_EQ(
-      *map_->GetVoiceSenderInfos(*local_audio_track_),
-      std::vector<cricket::VoiceSenderInfo*>({&voice_media_info_->senders[0]}));
-  EXPECT_EQ(map_->GetAudioTrack(voice_media_info_->senders[0]),
-            local_audio_track_.get());
-
-  // Remote audio track <-> RTP audio receiver
-  EXPECT_EQ(map_->GetVoiceReceiverInfo(*remote_audio_track_),
-            &voice_media_info_->receivers[0]);
-  EXPECT_EQ(map_->GetAudioTrack(voice_media_info_->receivers[0]),
-            remote_audio_track_.get());
-
-  // Local video track <-> RTP video sender
-  ASSERT_TRUE(map_->GetVideoSenderInfos(*local_video_track_));
-  EXPECT_EQ(
-      *map_->GetVideoSenderInfos(*local_video_track_),
-      std::vector<cricket::VideoSenderInfo*>({&video_media_info_->senders[0]}));
-  EXPECT_EQ(map_->GetVideoTrack(video_media_info_->senders[0]),
-            local_video_track_.get());
-
-  // Remote video track <-> RTP video receiver
-  EXPECT_EQ(map_->GetVideoReceiverInfo(*remote_video_track_),
-            &video_media_info_->receivers[0]);
-  EXPECT_EQ(map_->GetVideoTrack(video_media_info_->receivers[0]),
-            remote_video_track_.get());
-}
-
-TEST_F(TrackMediaInfoMapTest, SingleMultiSsrcSenderPerTrack) {
-  AddRtpSenderWithSsrcs({1, 2}, local_audio_track_);
-  AddRtpSenderWithSsrcs({3, 4}, local_video_track_);
-  CreateMap();
-
-  // Local audio track <-> RTP audio senders
-  ASSERT_TRUE(map_->GetVoiceSenderInfos(*local_audio_track_));
-  EXPECT_EQ(
-      *map_->GetVoiceSenderInfos(*local_audio_track_),
-      std::vector<cricket::VoiceSenderInfo*>({&voice_media_info_->senders[0]}));
-  EXPECT_EQ(map_->GetAudioTrack(voice_media_info_->senders[0]),
-            local_audio_track_.get());
-
-  // Local video track <-> RTP video senders
-  ASSERT_TRUE(map_->GetVideoSenderInfos(*local_video_track_));
-  EXPECT_EQ(
-      *map_->GetVideoSenderInfos(*local_video_track_),
-      std::vector<cricket::VideoSenderInfo*>({&video_media_info_->senders[0]}));
-  EXPECT_EQ(map_->GetVideoTrack(video_media_info_->senders[0]),
-            local_video_track_.get());
-}
-
-TEST_F(TrackMediaInfoMapTest, MultipleOneSsrcSendersPerTrack) {
-  AddRtpSenderWithSsrcs({1}, local_audio_track_);
-  AddRtpSenderWithSsrcs({2}, local_audio_track_);
-  AddRtpSenderWithSsrcs({3}, local_video_track_);
-  AddRtpSenderWithSsrcs({4}, local_video_track_);
-  CreateMap();
-
-  // Local audio track <-> RTP audio senders
-  ASSERT_TRUE(map_->GetVoiceSenderInfos(*local_audio_track_));
-  EXPECT_EQ(
-      *map_->GetVoiceSenderInfos(*local_audio_track_),
-      std::vector<cricket::VoiceSenderInfo*>(
-          {&voice_media_info_->senders[0], &voice_media_info_->senders[1]}));
-  EXPECT_EQ(map_->GetAudioTrack(voice_media_info_->senders[0]),
-            local_audio_track_.get());
-  EXPECT_EQ(map_->GetAudioTrack(voice_media_info_->senders[1]),
-            local_audio_track_.get());
-
-  // Local video track <-> RTP video senders
-  ASSERT_TRUE(map_->GetVideoSenderInfos(*local_video_track_));
-  EXPECT_EQ(
-      *map_->GetVideoSenderInfos(*local_video_track_),
-      std::vector<cricket::VideoSenderInfo*>(
-          {&video_media_info_->senders[0], &video_media_info_->senders[1]}));
-  EXPECT_EQ(map_->GetVideoTrack(video_media_info_->senders[0]),
-            local_video_track_.get());
-  EXPECT_EQ(map_->GetVideoTrack(video_media_info_->senders[1]),
-            local_video_track_.get());
-}
-
-TEST_F(TrackMediaInfoMapTest, MultipleMultiSsrcSendersPerTrack) {
-  AddRtpSenderWithSsrcs({1, 2}, local_audio_track_);
-  AddRtpSenderWithSsrcs({3, 4}, local_audio_track_);
-  AddRtpSenderWithSsrcs({5, 6}, local_video_track_);
-  AddRtpSenderWithSsrcs({7, 8}, local_video_track_);
-  CreateMap();
-
-  // Local audio track <-> RTP audio senders
-  ASSERT_TRUE(map_->GetVoiceSenderInfos(*local_audio_track_));
-  EXPECT_EQ(
-      *map_->GetVoiceSenderInfos(*local_audio_track_),
-      std::vector<cricket::VoiceSenderInfo*>(
-          {&voice_media_info_->senders[0], &voice_media_info_->senders[1]}));
-  EXPECT_EQ(map_->GetAudioTrack(voice_media_info_->senders[0]),
-            local_audio_track_.get());
-  EXPECT_EQ(map_->GetAudioTrack(voice_media_info_->senders[1]),
-            local_audio_track_.get());
-
-  // Local video track <-> RTP video senders
-  ASSERT_TRUE(map_->GetVideoSenderInfos(*local_video_track_));
-  EXPECT_EQ(
-      *map_->GetVideoSenderInfos(*local_video_track_),
-      std::vector<cricket::VideoSenderInfo*>(
-          {&video_media_info_->senders[0], &video_media_info_->senders[1]}));
-  EXPECT_EQ(map_->GetVideoTrack(video_media_info_->senders[0]),
-            local_video_track_.get());
-  EXPECT_EQ(map_->GetVideoTrack(video_media_info_->senders[1]),
-            local_video_track_.get());
-}
-
-// SSRCs can be reused for send and receive in loopback.
-TEST_F(TrackMediaInfoMapTest, SingleSenderReceiverPerTrackWithSsrcNotUnique) {
-  AddRtpSenderWithSsrcs({1}, local_audio_track_);
-  AddRtpReceiverWithSsrcs({1}, remote_audio_track_);
-  AddRtpSenderWithSsrcs({2}, local_video_track_);
-  AddRtpReceiverWithSsrcs({2}, remote_video_track_);
-  CreateMap();
-
-  // Local audio track <-> RTP audio senders
-  ASSERT_TRUE(map_->GetVoiceSenderInfos(*local_audio_track_));
-  EXPECT_EQ(
-      *map_->GetVoiceSenderInfos(*local_audio_track_),
-      std::vector<cricket::VoiceSenderInfo*>({&voice_media_info_->senders[0]}));
-  EXPECT_EQ(map_->GetAudioTrack(voice_media_info_->senders[0]),
-            local_audio_track_.get());
-
-  // Remote audio track <-> RTP audio receiver
-  EXPECT_EQ(map_->GetVoiceReceiverInfo(*remote_audio_track_),
-            &voice_media_info_->receivers[0]);
-  EXPECT_EQ(map_->GetAudioTrack(voice_media_info_->receivers[0]),
-            remote_audio_track_.get());
-
-  // Local video track <-> RTP video senders
-  ASSERT_TRUE(map_->GetVideoSenderInfos(*local_video_track_));
-  EXPECT_EQ(
-      *map_->GetVideoSenderInfos(*local_video_track_),
-      std::vector<cricket::VideoSenderInfo*>({&video_media_info_->senders[0]}));
-  EXPECT_EQ(map_->GetVideoTrack(video_media_info_->senders[0]),
-            local_video_track_.get());
-
-  // Remote video track <-> RTP video receiver
-  EXPECT_EQ(map_->GetVideoReceiverInfo(*remote_video_track_),
-            &video_media_info_->receivers[0]);
-  EXPECT_EQ(map_->GetVideoTrack(video_media_info_->receivers[0]),
-            remote_video_track_.get());
-}
-
-// Death tests.
-// Disabled on Android because death tests misbehave on Android, see
-// base/test/gtest_util.h.
-#if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
-
-class TrackMediaInfoMapDeathTest : public TrackMediaInfoMapTest {};
-
-TEST_F(TrackMediaInfoMapDeathTest, MultipleOneSsrcReceiversPerTrack) {
-  AddRtpReceiverWithSsrcs({1}, remote_audio_track_);
-  AddRtpReceiverWithSsrcs({2}, remote_audio_track_);
-  AddRtpReceiverWithSsrcs({3}, remote_video_track_);
-  AddRtpReceiverWithSsrcs({4}, remote_video_track_);
-  EXPECT_DEATH(CreateMap(), "");
-}
-
-TEST_F(TrackMediaInfoMapDeathTest, MultipleMultiSsrcReceiversPerTrack) {
-  AddRtpReceiverWithSsrcs({1, 2}, remote_audio_track_);
-  AddRtpReceiverWithSsrcs({3, 4}, remote_audio_track_);
-  AddRtpReceiverWithSsrcs({5, 6}, remote_video_track_);
-  AddRtpReceiverWithSsrcs({7, 8}, remote_video_track_);
-  EXPECT_DEATH(CreateMap(), "");
-}
-
-#endif  // RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
-
-}  // namespace webrtc
diff --git a/pc/videocapturertracksource.cc b/pc/videocapturertracksource.cc
deleted file mode 100644
index 4cddf7f..0000000
--- a/pc/videocapturertracksource.cc
+++ /dev/null
@@ -1,401 +0,0 @@
-/*
- *  Copyright 2012 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/pc/videocapturertracksource.h"
-
-#include <cstdlib>
-#include <string>
-#include <vector>
-
-#include "webrtc/api/mediaconstraintsinterface.h"
-#include "webrtc/rtc_base/arraysize.h"
-#include "webrtc/rtc_base/checks.h"
-
-using cricket::CaptureState;
-using webrtc::MediaConstraintsInterface;
-using webrtc::MediaSourceInterface;
-
-namespace {
-
-const double kRoundingTruncation = 0.0005;
-
-// Default resolution. If no constraint is specified, this is the resolution we
-// will use.
-static const cricket::VideoFormatPod kDefaultFormat = {
-    640, 480, FPS_TO_INTERVAL(30), cricket::FOURCC_ANY};
-
-// List of formats used if the camera doesn't support capability enumeration.
-static const cricket::VideoFormatPod kVideoFormats[] = {
-    {1920, 1080, FPS_TO_INTERVAL(30), cricket::FOURCC_ANY},
-    {1280, 720, FPS_TO_INTERVAL(30), cricket::FOURCC_ANY},
-    {960, 720, FPS_TO_INTERVAL(30), cricket::FOURCC_ANY},
-    {640, 360, FPS_TO_INTERVAL(30), cricket::FOURCC_ANY},
-    {640, 480, FPS_TO_INTERVAL(30), cricket::FOURCC_ANY},
-    {320, 240, FPS_TO_INTERVAL(30), cricket::FOURCC_ANY},
-    {320, 180, FPS_TO_INTERVAL(30), cricket::FOURCC_ANY}};
-
-MediaSourceInterface::SourceState GetReadyState(cricket::CaptureState state) {
-  switch (state) {
-    case cricket::CS_STARTING:
-      return MediaSourceInterface::kInitializing;
-    case cricket::CS_RUNNING:
-      return MediaSourceInterface::kLive;
-    case cricket::CS_FAILED:
-    case cricket::CS_STOPPED:
-      return MediaSourceInterface::kEnded;
-    default:
-      RTC_NOTREACHED() << "GetReadyState unknown state";
-  }
-  return MediaSourceInterface::kEnded;
-}
-
-void SetUpperLimit(int new_limit, int* original_limit) {
-  if (*original_limit < 0 || new_limit < *original_limit)
-    *original_limit = new_limit;
-}
-
-// Updates |format_upper_limit| from |constraint|.
-// If constraint.maxFoo is smaller than format_upper_limit.foo,
-// set format_upper_limit.foo to constraint.maxFoo.
-void SetUpperLimitFromConstraint(
-    const MediaConstraintsInterface::Constraint& constraint,
-    cricket::VideoFormat* format_upper_limit) {
-  if (constraint.key == MediaConstraintsInterface::kMaxWidth) {
-    int value = rtc::FromString<int>(constraint.value);
-    SetUpperLimit(value, &(format_upper_limit->width));
-  } else if (constraint.key == MediaConstraintsInterface::kMaxHeight) {
-    int value = rtc::FromString<int>(constraint.value);
-    SetUpperLimit(value, &(format_upper_limit->height));
-  }
-}
-
-// Fills |format_out| with the max width and height allowed by |constraints|.
-void FromConstraintsForScreencast(
-    const MediaConstraintsInterface::Constraints& constraints,
-    cricket::VideoFormat* format_out) {
-  typedef MediaConstraintsInterface::Constraints::const_iterator
-      ConstraintsIterator;
-
-  cricket::VideoFormat upper_limit(-1, -1, 0, 0);
-  for (ConstraintsIterator constraints_it = constraints.begin();
-       constraints_it != constraints.end(); ++constraints_it)
-    SetUpperLimitFromConstraint(*constraints_it, &upper_limit);
-
-  if (upper_limit.width >= 0)
-    format_out->width = upper_limit.width;
-  if (upper_limit.height >= 0)
-    format_out->height = upper_limit.height;
-}
-
-// Returns true if |constraint| is fulfilled. |format_out| can differ from
-// |format_in| if the format is changed by the constraint. Ie - the frame rate
-// can be changed by setting maxFrameRate.
-bool NewFormatWithConstraints(
-    const MediaConstraintsInterface::Constraint& constraint,
-    const cricket::VideoFormat& format_in,
-    bool mandatory,
-    cricket::VideoFormat* format_out) {
-  RTC_DCHECK(format_out != NULL);
-  *format_out = format_in;
-
-  if (constraint.key == MediaConstraintsInterface::kMinWidth) {
-    int value = rtc::FromString<int>(constraint.value);
-    return (value <= format_in.width);
-  } else if (constraint.key == MediaConstraintsInterface::kMaxWidth) {
-    int value = rtc::FromString<int>(constraint.value);
-    return (value >= format_in.width);
-  } else if (constraint.key == MediaConstraintsInterface::kMinHeight) {
-    int value = rtc::FromString<int>(constraint.value);
-    return (value <= format_in.height);
-  } else if (constraint.key == MediaConstraintsInterface::kMaxHeight) {
-    int value = rtc::FromString<int>(constraint.value);
-    return (value >= format_in.height);
-  } else if (constraint.key == MediaConstraintsInterface::kMinFrameRate) {
-    int value = rtc::FromString<int>(constraint.value);
-    return (value <= cricket::VideoFormat::IntervalToFps(format_in.interval));
-  } else if (constraint.key == MediaConstraintsInterface::kMaxFrameRate) {
-    int value = rtc::FromString<int>(constraint.value);
-    if (value == 0) {
-      if (mandatory) {
-        // TODO(ronghuawu): Convert the constraint value to float when sub-1fps
-        // is supported by the capturer.
-        return false;
-      } else {
-        value = 1;
-      }
-    }
-    if (value <= cricket::VideoFormat::IntervalToFps(format_in.interval))
-      format_out->interval = cricket::VideoFormat::FpsToInterval(value);
-    return true;
-  } else if (constraint.key == MediaConstraintsInterface::kMinAspectRatio) {
-    double value = rtc::FromString<double>(constraint.value);
-    // The aspect ratio in |constraint.value| has been converted to a string and
-    // back to a double, so it may have a rounding error.
-    // E.g if the value 1/3 is converted to a string, the string will not have
-    // infinite length.
-    // We add a margin of 0.0005 which is high enough to detect the same aspect
-    // ratio but small enough to avoid matching wrong aspect ratios.
-    double ratio = static_cast<double>(format_in.width) / format_in.height;
-    return (value <= ratio + kRoundingTruncation);
-  } else if (constraint.key == MediaConstraintsInterface::kMaxAspectRatio) {
-    double value = rtc::FromString<double>(constraint.value);
-    double ratio = static_cast<double>(format_in.width) / format_in.height;
-    // Subtract 0.0005 to avoid rounding problems. Same as above.
-    const double kRoundingTruncation = 0.0005;
-    return (value >= ratio - kRoundingTruncation);
-  } else if (constraint.key == MediaConstraintsInterface::kNoiseReduction) {
-    // These are actually options, not constraints, so they can be satisfied
-    // regardless of the format.
-    return true;
-  }
-  LOG(LS_WARNING) << "Found unknown MediaStream constraint. Name:"
-                  << constraint.key << " Value:" << constraint.value;
-  return false;
-}
-
-// Removes cricket::VideoFormats from |formats| that don't meet |constraint|.
-void FilterFormatsByConstraint(
-    const MediaConstraintsInterface::Constraint& constraint,
-    bool mandatory,
-    std::vector<cricket::VideoFormat>* formats) {
-  std::vector<cricket::VideoFormat>::iterator format_it = formats->begin();
-  while (format_it != formats->end()) {
-    // Modify the format_it to fulfill the constraint if possible.
-    // Delete it otherwise.
-    if (!NewFormatWithConstraints(constraint, (*format_it), mandatory,
-                                  &(*format_it))) {
-      format_it = formats->erase(format_it);
-    } else {
-      ++format_it;
-    }
-  }
-}
-
-// Returns a vector of cricket::VideoFormat that best match |constraints|.
-std::vector<cricket::VideoFormat> FilterFormats(
-    const MediaConstraintsInterface::Constraints& mandatory,
-    const MediaConstraintsInterface::Constraints& optional,
-    const std::vector<cricket::VideoFormat>& supported_formats) {
-  typedef MediaConstraintsInterface::Constraints::const_iterator
-      ConstraintsIterator;
-  std::vector<cricket::VideoFormat> candidates = supported_formats;
-
-  for (ConstraintsIterator constraints_it = mandatory.begin();
-       constraints_it != mandatory.end(); ++constraints_it)
-    FilterFormatsByConstraint(*constraints_it, true, &candidates);
-
-  if (candidates.size() == 0)
-    return candidates;
-
-  // Ok - all mandatory checked and we still have a candidate.
-  // Let's try filtering using the optional constraints.
-  for (ConstraintsIterator constraints_it = optional.begin();
-       constraints_it != optional.end(); ++constraints_it) {
-    std::vector<cricket::VideoFormat> current_candidates = candidates;
-    FilterFormatsByConstraint(*constraints_it, false, &current_candidates);
-    if (current_candidates.size() > 0) {
-      candidates = current_candidates;
-    }
-  }
-
-  // We have done as good as we can to filter the supported resolutions.
-  return candidates;
-}
-
-// Find the format that best matches the default video size.
-// Constraints are optional and since the performance of a video call
-// might be bad due to bitrate limitations, CPU, and camera performance,
-// it is better to select a resolution that is as close as possible to our
-// default and still meets the contraints.
-const cricket::VideoFormat& GetBestCaptureFormat(
-    const std::vector<cricket::VideoFormat>& formats) {
-  RTC_DCHECK(formats.size() > 0);
-
-  int default_area = kDefaultFormat.width * kDefaultFormat.height;
-
-  std::vector<cricket::VideoFormat>::const_iterator it = formats.begin();
-  std::vector<cricket::VideoFormat>::const_iterator best_it = formats.begin();
-  int best_diff_area = std::abs(default_area - it->width * it->height);
-  int64_t best_diff_interval = kDefaultFormat.interval;
-  for (; it != formats.end(); ++it) {
-    int diff_area = std::abs(default_area - it->width * it->height);
-    int64_t diff_interval = std::abs(kDefaultFormat.interval - it->interval);
-    if (diff_area < best_diff_area ||
-        (diff_area == best_diff_area && diff_interval < best_diff_interval)) {
-      best_diff_area = diff_area;
-      best_diff_interval = diff_interval;
-      best_it = it;
-    }
-  }
-  return *best_it;
-}
-
-// Set |option| to the highest-priority value of |key| in the constraints.
-// Return false if the key is mandatory, and the value is invalid.
-bool ExtractOption(const MediaConstraintsInterface* all_constraints,
-                   const std::string& key,
-                   rtc::Optional<bool>* option) {
-  size_t mandatory = 0;
-  bool value;
-  if (FindConstraint(all_constraints, key, &value, &mandatory)) {
-    *option = rtc::Optional<bool>(value);
-    return true;
-  }
-
-  return mandatory == 0;
-}
-
-}  // anonymous namespace
-
-namespace webrtc {
-
-rtc::scoped_refptr<VideoTrackSourceInterface> VideoCapturerTrackSource::Create(
-    rtc::Thread* worker_thread,
-    std::unique_ptr<cricket::VideoCapturer> capturer,
-    const webrtc::MediaConstraintsInterface* constraints,
-    bool remote) {
-  RTC_DCHECK(worker_thread != NULL);
-  RTC_DCHECK(capturer != nullptr);
-  rtc::scoped_refptr<VideoCapturerTrackSource> source(
-      new rtc::RefCountedObject<VideoCapturerTrackSource>(
-          worker_thread, std::move(capturer), remote));
-  source->Initialize(constraints);
-  return source;
-}
-
-rtc::scoped_refptr<VideoTrackSourceInterface> VideoCapturerTrackSource::Create(
-    rtc::Thread* worker_thread,
-    std::unique_ptr<cricket::VideoCapturer> capturer,
-    bool remote) {
-  RTC_DCHECK(worker_thread != NULL);
-  RTC_DCHECK(capturer != nullptr);
-  rtc::scoped_refptr<VideoCapturerTrackSource> source(
-      new rtc::RefCountedObject<VideoCapturerTrackSource>(
-          worker_thread, std::move(capturer), remote));
-  source->Initialize(nullptr);
-  return source;
-}
-
-VideoCapturerTrackSource::VideoCapturerTrackSource(
-    rtc::Thread* worker_thread,
-    std::unique_ptr<cricket::VideoCapturer> capturer,
-    bool remote)
-    : VideoTrackSource(capturer.get(), remote),
-      signaling_thread_(rtc::Thread::Current()),
-      worker_thread_(worker_thread),
-      video_capturer_(std::move(capturer)),
-      started_(false) {
-  video_capturer_->SignalStateChange.connect(
-      this, &VideoCapturerTrackSource::OnStateChange);
-}
-
-VideoCapturerTrackSource::~VideoCapturerTrackSource() {
-  video_capturer_->SignalStateChange.disconnect(this);
-  Stop();
-}
-
-void VideoCapturerTrackSource::Initialize(
-    const webrtc::MediaConstraintsInterface* constraints) {
-  std::vector<cricket::VideoFormat> formats =
-      *video_capturer_->GetSupportedFormats();
-  if (formats.empty()) {
-    if (video_capturer_->IsScreencast()) {
-      // The screen capturer can accept any resolution and we will derive the
-      // format from the constraints if any.
-      // Note that this only affects tab capturing, not desktop capturing,
-      // since the desktop capturer does not respect the VideoFormat passed in.
-      formats.push_back(cricket::VideoFormat(kDefaultFormat));
-    } else {
-      // The VideoCapturer implementation doesn't support capability
-      // enumeration. We need to guess what the camera supports.
-      for (uint32_t i = 0; i < arraysize(kVideoFormats); ++i) {
-        formats.push_back(cricket::VideoFormat(kVideoFormats[i]));
-      }
-    }
-  }
-
-  if (constraints) {
-    MediaConstraintsInterface::Constraints mandatory_constraints =
-        constraints->GetMandatory();
-    MediaConstraintsInterface::Constraints optional_constraints;
-    optional_constraints = constraints->GetOptional();
-
-    if (video_capturer_->IsScreencast()) {
-      // Use the maxWidth and maxHeight allowed by constraints for screencast.
-      FromConstraintsForScreencast(mandatory_constraints, &(formats[0]));
-    }
-
-    formats =
-        FilterFormats(mandatory_constraints, optional_constraints, formats);
-  }
-
-  if (formats.size() == 0) {
-    LOG(LS_WARNING) << "Failed to find a suitable video format.";
-    SetState(kEnded);
-    return;
-  }
-
-  if (!ExtractOption(constraints, MediaConstraintsInterface::kNoiseReduction,
-                     &needs_denoising_)) {
-    LOG(LS_WARNING) << "Invalid mandatory value for"
-                    << MediaConstraintsInterface::kNoiseReduction;
-    SetState(kEnded);
-    return;
-  }
-
-  format_ = GetBestCaptureFormat(formats);
-  // Start the camera with our best guess.
-  if (!worker_thread_->Invoke<bool>(
-          RTC_FROM_HERE, rtc::Bind(&cricket::VideoCapturer::StartCapturing,
-                                   video_capturer_.get(), format_))) {
-    SetState(kEnded);
-    return;
-  }
-  started_ = true;
-  // Initialize hasn't succeeded until a successful state change has occurred.
-}
-
-bool VideoCapturerTrackSource::GetStats(Stats* stats) {
-  return video_capturer_->GetInputSize(&stats->input_width,
-                                       &stats->input_height);
-}
-
-void VideoCapturerTrackSource::Stop() {
-  if (!started_) {
-    return;
-  }
-  started_ = false;
-  worker_thread_->Invoke<void>(
-      RTC_FROM_HERE,
-      rtc::Bind(&cricket::VideoCapturer::Stop, video_capturer_.get()));
-}
-
-// OnStateChange listens to the cricket::VideoCapturer::SignalStateChange.
-void VideoCapturerTrackSource::OnStateChange(
-    cricket::VideoCapturer* capturer,
-    cricket::CaptureState capture_state) {
-  if (rtc::Thread::Current() != signaling_thread_) {
-    // Use rtc::Unretained, because we don't want this to capture a reference
-    // to ourselves. If our destructor is called while this task is executing,
-    // that's fine; our AsyncInvoker destructor will wait for it to finish if
-    // it isn't simply canceled.
-    invoker_.AsyncInvoke<void>(
-        RTC_FROM_HERE, signaling_thread_,
-        rtc::Bind(&VideoCapturerTrackSource::OnStateChange,
-                  rtc::Unretained(this), capturer, capture_state));
-    return;
-  }
-
-  if (capturer == video_capturer_.get()) {
-    SetState(GetReadyState(capture_state));
-  }
-}
-
-}  // namespace webrtc
diff --git a/pc/videocapturertracksource.h b/pc/videocapturertracksource.h
deleted file mode 100644
index 0e6eb27..0000000
--- a/pc/videocapturertracksource.h
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- *  Copyright 2012 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_PC_VIDEOCAPTURERTRACKSOURCE_H_
-#define WEBRTC_PC_VIDEOCAPTURERTRACKSOURCE_H_
-
-#include <memory>
-
-#include "webrtc/api/mediastreaminterface.h"
-#include "webrtc/media/base/videocapturer.h"
-#include "webrtc/media/base/videocommon.h"
-#include "webrtc/pc/videotracksource.h"
-#include "webrtc/rtc_base/asyncinvoker.h"
-#include "webrtc/rtc_base/sigslot.h"
-
-// VideoCapturerTrackSource implements VideoTrackSourceInterface. It owns a
-// cricket::VideoCapturer and make sure the camera is started at a resolution
-// that honors the constraints.
-// The state is set depending on the result of starting the capturer.
-// If the constraint can't be met or the capturer fails to start, the state
-// transition to kEnded, otherwise it transitions to kLive.
-namespace webrtc {
-
-class MediaConstraintsInterface;
-
-class VideoCapturerTrackSource : public VideoTrackSource,
-                                 public sigslot::has_slots<> {
- public:
-  // Creates an instance of VideoCapturerTrackSource from |capturer|.
-  // |constraints| can be NULL and in that case the camera is opened using a
-  // default resolution.
-  static rtc::scoped_refptr<VideoTrackSourceInterface> Create(
-      rtc::Thread* worker_thread,
-      std::unique_ptr<cricket::VideoCapturer> capturer,
-      const webrtc::MediaConstraintsInterface* constraints,
-      bool remote);
-
-  static rtc::scoped_refptr<VideoTrackSourceInterface> Create(
-      rtc::Thread* worker_thread,
-      std::unique_ptr<cricket::VideoCapturer> capturer,
-      bool remote);
-
-  bool is_screencast() const final { return video_capturer_->IsScreencast(); }
-  rtc::Optional<bool> needs_denoising() const final { return needs_denoising_; }
-
-  bool GetStats(Stats* stats) final;
-
- protected:
-  VideoCapturerTrackSource(rtc::Thread* worker_thread,
-                           std::unique_ptr<cricket::VideoCapturer> capturer,
-                           bool remote);
-  virtual ~VideoCapturerTrackSource();
-  void Initialize(const webrtc::MediaConstraintsInterface* constraints);
-
- private:
-  void Stop();
-
-  void OnStateChange(cricket::VideoCapturer* capturer,
-                     cricket::CaptureState capture_state);
-
-  rtc::Thread* signaling_thread_;
-  rtc::Thread* worker_thread_;
-  rtc::AsyncInvoker invoker_;
-  std::unique_ptr<cricket::VideoCapturer> video_capturer_;
-  bool started_;
-  cricket::VideoFormat format_;
-  rtc::Optional<bool> needs_denoising_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_PC_VIDEOCAPTURERTRACKSOURCE_H_
diff --git a/pc/videocapturertracksource_unittest.cc b/pc/videocapturertracksource_unittest.cc
deleted file mode 100644
index b6e50ae..0000000
--- a/pc/videocapturertracksource_unittest.cc
+++ /dev/null
@@ -1,464 +0,0 @@
-/*
- *  Copyright 2012 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 <memory>
-#include <string>
-#include <vector>
-
-#include "webrtc/api/test/fakeconstraints.h"
-#include "webrtc/media/base/fakemediaengine.h"
-#include "webrtc/media/base/fakevideocapturer.h"
-#include "webrtc/media/base/fakevideorenderer.h"
-#include "webrtc/pc/videocapturertracksource.h"
-#include "webrtc/rtc_base/gunit.h"
-
-using webrtc::FakeConstraints;
-using webrtc::VideoCapturerTrackSource;
-using webrtc::MediaConstraintsInterface;
-using webrtc::MediaSourceInterface;
-using webrtc::ObserverInterface;
-using webrtc::VideoTrackSourceInterface;
-
-namespace {
-
-// Max wait time for a test.
-const int kMaxWaitMs = 100;
-
-}  // anonymous namespace
-
-// TestVideoCapturer extends cricket::FakeVideoCapturer so it can be used for
-// testing without known camera formats.
-// It keeps its own lists of cricket::VideoFormats for the unit tests in this
-// file.
-class TestVideoCapturer : public cricket::FakeVideoCapturer {
- public:
-  explicit TestVideoCapturer(bool is_screencast)
-      : FakeVideoCapturer(is_screencast), test_without_formats_(false) {
-    std::vector<cricket::VideoFormat> formats;
-    formats.push_back(
-        cricket::VideoFormat(1280, 720, cricket::VideoFormat::FpsToInterval(30),
-                             cricket::FOURCC_I420));
-    formats.push_back(
-        cricket::VideoFormat(640, 480, cricket::VideoFormat::FpsToInterval(30),
-                             cricket::FOURCC_I420));
-    formats.push_back(
-        cricket::VideoFormat(640, 400, cricket::VideoFormat::FpsToInterval(30),
-                             cricket::FOURCC_I420));
-    formats.push_back(
-        cricket::VideoFormat(320, 240, cricket::VideoFormat::FpsToInterval(30),
-                             cricket::FOURCC_I420));
-    formats.push_back(
-        cricket::VideoFormat(352, 288, cricket::VideoFormat::FpsToInterval(30),
-                             cricket::FOURCC_I420));
-    ResetSupportedFormats(formats);
-  }
-
-  // This function is used for resetting the supported capture formats and
-  // simulating a cricket::VideoCapturer implementation that don't support
-  // capture format enumeration. This is used to simulate the current
-  // Chrome implementation.
-  void TestWithoutCameraFormats() {
-    test_without_formats_ = true;
-    std::vector<cricket::VideoFormat> formats;
-    ResetSupportedFormats(formats);
-  }
-
-  virtual cricket::CaptureState Start(
-      const cricket::VideoFormat& capture_format) {
-    if (test_without_formats_) {
-      std::vector<cricket::VideoFormat> formats;
-      formats.push_back(capture_format);
-      ResetSupportedFormats(formats);
-    }
-    return FakeVideoCapturer::Start(capture_format);
-  }
-
-  virtual bool GetBestCaptureFormat(const cricket::VideoFormat& desired,
-                                    cricket::VideoFormat* best_format) {
-    if (test_without_formats_) {
-      *best_format = desired;
-      return true;
-    }
-    return FakeVideoCapturer::GetBestCaptureFormat(desired, best_format);
-  }
-
- private:
-  bool test_without_formats_;
-};
-
-class StateObserver : public ObserverInterface {
- public:
-  explicit StateObserver(VideoTrackSourceInterface* source)
-      : state_(source->state()), source_(source) {}
-  virtual void OnChanged() { state_ = source_->state(); }
-  MediaSourceInterface::SourceState state() const { return state_; }
-
- private:
-  MediaSourceInterface::SourceState state_;
-  rtc::scoped_refptr<VideoTrackSourceInterface> source_;
-};
-
-class VideoCapturerTrackSourceTest : public testing::Test {
- protected:
-  VideoCapturerTrackSourceTest() { InitCapturer(false); }
-  void InitCapturer(bool is_screencast) {
-    capturer_ = new TestVideoCapturer(is_screencast);
-    capturer_cleanup_.reset(capturer_);
-  }
-
-  void InitScreencast() { InitCapturer(true); }
-
-  void CreateVideoCapturerSource() { CreateVideoCapturerSource(NULL); }
-
-  void CreateVideoCapturerSource(
-      const webrtc::MediaConstraintsInterface* constraints) {
-    source_ = VideoCapturerTrackSource::Create(rtc::Thread::Current(),
-                                               std::move(capturer_cleanup_),
-                                               constraints, false);
-
-    ASSERT_TRUE(source_.get() != NULL);
-
-    state_observer_.reset(new StateObserver(source_));
-    source_->RegisterObserver(state_observer_.get());
-    source_->AddOrUpdateSink(&renderer_, rtc::VideoSinkWants());
-  }
-
-  std::unique_ptr<cricket::VideoCapturer> capturer_cleanup_;
-  TestVideoCapturer* capturer_;
-  cricket::FakeVideoRenderer renderer_;
-  std::unique_ptr<StateObserver> state_observer_;
-  rtc::scoped_refptr<VideoTrackSourceInterface> source_;
-};
-
-// Test that a VideoSource transition to kLive state when the capture
-// device have started and kEnded if it is stopped.
-// It also test that an output can receive video frames.
-TEST_F(VideoCapturerTrackSourceTest, CapturerStartStop) {
-  // Initialize without constraints.
-  CreateVideoCapturerSource();
-  EXPECT_EQ_WAIT(MediaSourceInterface::kLive, state_observer_->state(),
-                 kMaxWaitMs);
-
-  ASSERT_TRUE(capturer_->CaptureFrame());
-  EXPECT_EQ(1, renderer_.num_rendered_frames());
-
-  capturer_->Stop();
-  EXPECT_EQ_WAIT(MediaSourceInterface::kEnded, state_observer_->state(),
-                 kMaxWaitMs);
-}
-
-// Test that a VideoSource transition to kEnded if the capture device
-// fails.
-TEST_F(VideoCapturerTrackSourceTest, CameraFailed) {
-  CreateVideoCapturerSource();
-  EXPECT_EQ_WAIT(MediaSourceInterface::kLive, state_observer_->state(),
-                 kMaxWaitMs);
-
-  capturer_->SignalStateChange(capturer_, cricket::CS_FAILED);
-  EXPECT_EQ_WAIT(MediaSourceInterface::kEnded, state_observer_->state(),
-                 kMaxWaitMs);
-}
-
-// Test that the capture output is CIF if we set max constraints to CIF.
-// and the capture device support CIF.
-TEST_F(VideoCapturerTrackSourceTest, MandatoryConstraintCif5Fps) {
-  FakeConstraints constraints;
-  constraints.AddMandatory(MediaConstraintsInterface::kMaxWidth, 352);
-  constraints.AddMandatory(MediaConstraintsInterface::kMaxHeight, 288);
-  constraints.AddMandatory(MediaConstraintsInterface::kMaxFrameRate, 5);
-
-  CreateVideoCapturerSource(&constraints);
-  EXPECT_EQ_WAIT(MediaSourceInterface::kLive, state_observer_->state(),
-                 kMaxWaitMs);
-  const cricket::VideoFormat* format = capturer_->GetCaptureFormat();
-  ASSERT_TRUE(format != NULL);
-  EXPECT_EQ(352, format->width);
-  EXPECT_EQ(288, format->height);
-  EXPECT_EQ(5, format->framerate());
-}
-
-// Test that the capture output is 720P if the camera support it and the
-// optional constraint is set to 720P.
-TEST_F(VideoCapturerTrackSourceTest, MandatoryMinVgaOptional720P) {
-  FakeConstraints constraints;
-  constraints.AddMandatory(MediaConstraintsInterface::kMinWidth, 640);
-  constraints.AddMandatory(MediaConstraintsInterface::kMinHeight, 480);
-  constraints.AddOptional(MediaConstraintsInterface::kMinWidth, 1280);
-  constraints.AddOptional(MediaConstraintsInterface::kMinAspectRatio,
-                          1280.0 / 720);
-
-  CreateVideoCapturerSource(&constraints);
-  EXPECT_EQ_WAIT(MediaSourceInterface::kLive, state_observer_->state(),
-                 kMaxWaitMs);
-  const cricket::VideoFormat* format = capturer_->GetCaptureFormat();
-  ASSERT_TRUE(format != NULL);
-  EXPECT_EQ(1280, format->width);
-  EXPECT_EQ(720, format->height);
-  EXPECT_EQ(30, format->framerate());
-}
-
-// Test that the capture output have aspect ratio 4:3 if a mandatory constraint
-// require it even if an optional constraint request a higher resolution
-// that don't have this aspect ratio.
-TEST_F(VideoCapturerTrackSourceTest, MandatoryAspectRatio4To3) {
-  FakeConstraints constraints;
-  constraints.AddMandatory(MediaConstraintsInterface::kMinWidth, 640);
-  constraints.AddMandatory(MediaConstraintsInterface::kMinHeight, 480);
-  constraints.AddMandatory(MediaConstraintsInterface::kMaxAspectRatio,
-                           640.0 / 480);
-  constraints.AddOptional(MediaConstraintsInterface::kMinWidth, 1280);
-
-  CreateVideoCapturerSource(&constraints);
-  EXPECT_EQ_WAIT(MediaSourceInterface::kLive, state_observer_->state(),
-                 kMaxWaitMs);
-  const cricket::VideoFormat* format = capturer_->GetCaptureFormat();
-  ASSERT_TRUE(format != NULL);
-  EXPECT_EQ(640, format->width);
-  EXPECT_EQ(480, format->height);
-  EXPECT_EQ(30, format->framerate());
-}
-
-// Test that the source state transition to kEnded if the mandatory aspect ratio
-// is set higher than supported.
-TEST_F(VideoCapturerTrackSourceTest, MandatoryAspectRatioTooHigh) {
-  FakeConstraints constraints;
-  constraints.AddMandatory(MediaConstraintsInterface::kMinAspectRatio, 2);
-  CreateVideoCapturerSource(&constraints);
-  EXPECT_EQ_WAIT(MediaSourceInterface::kEnded, state_observer_->state(),
-                 kMaxWaitMs);
-}
-
-// Test that the source ignores an optional aspect ratio that is higher than
-// supported.
-TEST_F(VideoCapturerTrackSourceTest, OptionalAspectRatioTooHigh) {
-  FakeConstraints constraints;
-  constraints.AddOptional(MediaConstraintsInterface::kMinAspectRatio, 2);
-  CreateVideoCapturerSource(&constraints);
-  EXPECT_EQ_WAIT(MediaSourceInterface::kLive, state_observer_->state(),
-                 kMaxWaitMs);
-  const cricket::VideoFormat* format = capturer_->GetCaptureFormat();
-  ASSERT_TRUE(format != NULL);
-  double aspect_ratio = static_cast<double>(format->width) / format->height;
-  EXPECT_LT(aspect_ratio, 2);
-}
-
-// Test that the source starts video with the default resolution if the
-// camera doesn't support capability enumeration and there are no constraints.
-TEST_F(VideoCapturerTrackSourceTest, NoCameraCapability) {
-  capturer_->TestWithoutCameraFormats();
-
-  CreateVideoCapturerSource();
-  EXPECT_EQ_WAIT(MediaSourceInterface::kLive, state_observer_->state(),
-                 kMaxWaitMs);
-  const cricket::VideoFormat* format = capturer_->GetCaptureFormat();
-  ASSERT_TRUE(format != NULL);
-  EXPECT_EQ(640, format->width);
-  EXPECT_EQ(480, format->height);
-  EXPECT_EQ(30, format->framerate());
-}
-
-// Test that the source can start the video and get the requested aspect ratio
-// if the camera doesn't support capability enumeration and the aspect ratio is
-// set.
-TEST_F(VideoCapturerTrackSourceTest, NoCameraCapability16To9Ratio) {
-  capturer_->TestWithoutCameraFormats();
-
-  FakeConstraints constraints;
-  double requested_aspect_ratio = 640.0 / 360;
-  constraints.AddMandatory(MediaConstraintsInterface::kMinWidth, 640);
-  constraints.AddMandatory(MediaConstraintsInterface::kMinAspectRatio,
-                           requested_aspect_ratio);
-
-  CreateVideoCapturerSource(&constraints);
-  EXPECT_EQ_WAIT(MediaSourceInterface::kLive, state_observer_->state(),
-                 kMaxWaitMs);
-  const cricket::VideoFormat* format = capturer_->GetCaptureFormat();
-  double aspect_ratio = static_cast<double>(format->width) / format->height;
-  EXPECT_LE(requested_aspect_ratio, aspect_ratio);
-}
-
-// Test that the source state transitions to kEnded if an unknown mandatory
-// constraint is found.
-TEST_F(VideoCapturerTrackSourceTest, InvalidMandatoryConstraint) {
-  FakeConstraints constraints;
-  constraints.AddMandatory("weird key", 640);
-
-  CreateVideoCapturerSource(&constraints);
-  EXPECT_EQ_WAIT(MediaSourceInterface::kEnded, state_observer_->state(),
-                 kMaxWaitMs);
-}
-
-// Test that the source ignores an unknown optional constraint.
-TEST_F(VideoCapturerTrackSourceTest, InvalidOptionalConstraint) {
-  FakeConstraints constraints;
-  constraints.AddOptional("weird key", 640);
-
-  CreateVideoCapturerSource(&constraints);
-  EXPECT_EQ_WAIT(MediaSourceInterface::kLive, state_observer_->state(),
-                 kMaxWaitMs);
-}
-
-TEST_F(VideoCapturerTrackSourceTest, SetValidDenoisingConstraint) {
-  FakeConstraints constraints;
-  constraints.AddMandatory(MediaConstraintsInterface::kNoiseReduction, "false");
-
-  CreateVideoCapturerSource(&constraints);
-
-  EXPECT_EQ(rtc::Optional<bool>(false), source_->needs_denoising());
-}
-
-TEST_F(VideoCapturerTrackSourceTest, NoiseReductionConstraintNotSet) {
-  FakeConstraints constraints;
-  CreateVideoCapturerSource(&constraints);
-  EXPECT_EQ(rtc::Optional<bool>(), source_->needs_denoising());
-}
-
-TEST_F(VideoCapturerTrackSourceTest,
-       MandatoryDenoisingConstraintOverridesOptional) {
-  FakeConstraints constraints;
-  constraints.AddMandatory(MediaConstraintsInterface::kNoiseReduction, false);
-  constraints.AddOptional(MediaConstraintsInterface::kNoiseReduction, true);
-
-  CreateVideoCapturerSource(&constraints);
-
-  EXPECT_EQ(rtc::Optional<bool>(false), source_->needs_denoising());
-}
-
-TEST_F(VideoCapturerTrackSourceTest, NoiseReductionAndInvalidKeyOptional) {
-  FakeConstraints constraints;
-  constraints.AddOptional(MediaConstraintsInterface::kNoiseReduction, true);
-  constraints.AddOptional("invalidKey", false);
-
-  CreateVideoCapturerSource(&constraints);
-
-  EXPECT_EQ_WAIT(MediaSourceInterface::kLive, state_observer_->state(),
-                 kMaxWaitMs);
-  EXPECT_EQ(rtc::Optional<bool>(true), source_->needs_denoising());
-}
-
-TEST_F(VideoCapturerTrackSourceTest, NoiseReductionAndInvalidKeyMandatory) {
-  FakeConstraints constraints;
-  constraints.AddMandatory(MediaConstraintsInterface::kNoiseReduction, false);
-  constraints.AddMandatory("invalidKey", false);
-
-  CreateVideoCapturerSource(&constraints);
-
-  EXPECT_EQ_WAIT(MediaSourceInterface::kEnded, state_observer_->state(),
-                 kMaxWaitMs);
-  EXPECT_EQ(rtc::Optional<bool>(), source_->needs_denoising());
-}
-
-TEST_F(VideoCapturerTrackSourceTest, InvalidDenoisingValueOptional) {
-  FakeConstraints constraints;
-  constraints.AddOptional(MediaConstraintsInterface::kNoiseReduction,
-                          "not a boolean");
-
-  CreateVideoCapturerSource(&constraints);
-
-  EXPECT_EQ_WAIT(MediaSourceInterface::kLive, state_observer_->state(),
-                 kMaxWaitMs);
-
-  EXPECT_EQ(rtc::Optional<bool>(), source_->needs_denoising());
-}
-
-TEST_F(VideoCapturerTrackSourceTest, InvalidDenoisingValueMandatory) {
-  FakeConstraints constraints;
-  // Optional constraints should be ignored if the mandatory constraints fail.
-  constraints.AddOptional(MediaConstraintsInterface::kNoiseReduction, "false");
-  // Values are case-sensitive and must be all lower-case.
-  constraints.AddMandatory(MediaConstraintsInterface::kNoiseReduction, "True");
-
-  CreateVideoCapturerSource(&constraints);
-
-  EXPECT_EQ_WAIT(MediaSourceInterface::kEnded, state_observer_->state(),
-                 kMaxWaitMs);
-  EXPECT_EQ(rtc::Optional<bool>(), source_->needs_denoising());
-}
-
-TEST_F(VideoCapturerTrackSourceTest, MixedOptionsAndConstraints) {
-  FakeConstraints constraints;
-  constraints.AddMandatory(MediaConstraintsInterface::kMaxWidth, 352);
-  constraints.AddMandatory(MediaConstraintsInterface::kMaxHeight, 288);
-  constraints.AddOptional(MediaConstraintsInterface::kMaxFrameRate, 5);
-
-  constraints.AddMandatory(MediaConstraintsInterface::kNoiseReduction, false);
-  constraints.AddOptional(MediaConstraintsInterface::kNoiseReduction, true);
-
-  CreateVideoCapturerSource(&constraints);
-  EXPECT_EQ_WAIT(MediaSourceInterface::kLive, state_observer_->state(),
-                 kMaxWaitMs);
-  const cricket::VideoFormat* format = capturer_->GetCaptureFormat();
-  ASSERT_TRUE(format != NULL);
-  EXPECT_EQ(352, format->width);
-  EXPECT_EQ(288, format->height);
-  EXPECT_EQ(5, format->framerate());
-
-  EXPECT_EQ(rtc::Optional<bool>(false), source_->needs_denoising());
-}
-
-// Tests that the source starts video with the default resolution for
-// screencast if no constraint is set.
-TEST_F(VideoCapturerTrackSourceTest, ScreencastResolutionNoConstraint) {
-  InitScreencast();
-  capturer_->TestWithoutCameraFormats();
-
-  CreateVideoCapturerSource();
-  ASSERT_TRUE(source_->is_screencast());
-  EXPECT_EQ_WAIT(MediaSourceInterface::kLive, state_observer_->state(),
-                 kMaxWaitMs);
-  const cricket::VideoFormat* format = capturer_->GetCaptureFormat();
-  ASSERT_TRUE(format != NULL);
-  EXPECT_EQ(640, format->width);
-  EXPECT_EQ(480, format->height);
-  EXPECT_EQ(30, format->framerate());
-}
-
-// Tests that the source starts video with the max width and height set by
-// constraints for screencast.
-TEST_F(VideoCapturerTrackSourceTest, ScreencastResolutionWithConstraint) {
-  FakeConstraints constraints;
-  constraints.AddMandatory(MediaConstraintsInterface::kMaxWidth, 480);
-  constraints.AddMandatory(MediaConstraintsInterface::kMaxHeight, 270);
-
-  InitScreencast();
-  capturer_->TestWithoutCameraFormats();
-
-  CreateVideoCapturerSource(&constraints);
-  ASSERT_TRUE(source_->is_screencast());
-  EXPECT_EQ_WAIT(MediaSourceInterface::kLive, state_observer_->state(),
-                 kMaxWaitMs);
-  const cricket::VideoFormat* format = capturer_->GetCaptureFormat();
-  ASSERT_TRUE(format != NULL);
-  EXPECT_EQ(480, format->width);
-  EXPECT_EQ(270, format->height);
-  EXPECT_EQ(30, format->framerate());
-}
-
-TEST_F(VideoCapturerTrackSourceTest, MandatorySubOneFpsConstraints) {
-  FakeConstraints constraints;
-  constraints.AddMandatory(MediaConstraintsInterface::kMaxFrameRate, 0.5);
-
-  CreateVideoCapturerSource(&constraints);
-  EXPECT_EQ_WAIT(MediaSourceInterface::kEnded, state_observer_->state(),
-                 kMaxWaitMs);
-  ASSERT_TRUE(capturer_->GetCaptureFormat() == NULL);
-}
-
-TEST_F(VideoCapturerTrackSourceTest, OptionalSubOneFpsConstraints) {
-  FakeConstraints constraints;
-  constraints.AddOptional(MediaConstraintsInterface::kMaxFrameRate, 0.5);
-
-  CreateVideoCapturerSource(&constraints);
-  EXPECT_EQ_WAIT(MediaSourceInterface::kLive, state_observer_->state(),
-                 kMaxWaitMs);
-  const cricket::VideoFormat* format = capturer_->GetCaptureFormat();
-  ASSERT_TRUE(format != NULL);
-  EXPECT_EQ(1, format->framerate());
-}
diff --git a/pc/videotrack.cc b/pc/videotrack.cc
deleted file mode 100644
index f106460..0000000
--- a/pc/videotrack.cc
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- *  Copyright 2011 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/pc/videotrack.h"
-
-#include <string>
-
-namespace webrtc {
-
-VideoTrack::VideoTrack(const std::string& label,
-                       VideoTrackSourceInterface* video_source,
-                       rtc::Thread* worker_thread)
-    : MediaStreamTrack<VideoTrackInterface>(label),
-      worker_thread_(worker_thread),
-      video_source_(video_source),
-      content_hint_(ContentHint::kNone) {
-  video_source_->RegisterObserver(this);
-}
-
-VideoTrack::~VideoTrack() {
-  video_source_->UnregisterObserver(this);
-}
-
-std::string VideoTrack::kind() const {
-  return kVideoKind;
-}
-
-// AddOrUpdateSink and RemoveSink should be called on the worker
-// thread.
-void VideoTrack::AddOrUpdateSink(rtc::VideoSinkInterface<VideoFrame>* sink,
-                                 const rtc::VideoSinkWants& wants) {
-  RTC_DCHECK(worker_thread_->IsCurrent());
-  VideoSourceBase::AddOrUpdateSink(sink, wants);
-  rtc::VideoSinkWants modified_wants = wants;
-  modified_wants.black_frames = !enabled();
-  video_source_->AddOrUpdateSink(sink, modified_wants);
-}
-
-void VideoTrack::RemoveSink(rtc::VideoSinkInterface<VideoFrame>* sink) {
-  RTC_DCHECK(worker_thread_->IsCurrent());
-  VideoSourceBase::RemoveSink(sink);
-  video_source_->RemoveSink(sink);
-}
-
-VideoTrackInterface::ContentHint VideoTrack::content_hint() const {
-  RTC_DCHECK_RUN_ON(&signaling_thread_checker_);
-  return content_hint_;
-}
-
-void VideoTrack::set_content_hint(ContentHint hint) {
-  RTC_DCHECK_RUN_ON(&signaling_thread_checker_);
-  if (content_hint_ == hint)
-    return;
-  content_hint_ = hint;
-  Notifier<VideoTrackInterface>::FireOnChanged();
-}
-
-bool VideoTrack::set_enabled(bool enable) {
-  RTC_DCHECK(signaling_thread_checker_.CalledOnValidThread());
-  worker_thread_->Invoke<void>(RTC_FROM_HERE, [enable, this] {
-    RTC_DCHECK(worker_thread_->IsCurrent());
-    for (auto& sink_pair : sink_pairs()) {
-      rtc::VideoSinkWants modified_wants = sink_pair.wants;
-      modified_wants.black_frames = !enable;
-      video_source_->AddOrUpdateSink(sink_pair.sink, modified_wants);
-    }
-  });
-  return MediaStreamTrack<VideoTrackInterface>::set_enabled(enable);
-}
-
-void VideoTrack::OnChanged() {
-  RTC_DCHECK(signaling_thread_checker_.CalledOnValidThread());
-  if (video_source_->state() == MediaSourceInterface::kEnded) {
-    set_state(kEnded);
-  } else {
-    set_state(kLive);
-  }
-}
-
-rtc::scoped_refptr<VideoTrack> VideoTrack::Create(
-    const std::string& id,
-    VideoTrackSourceInterface* source,
-    rtc::Thread* worker_thread) {
-  rtc::RefCountedObject<VideoTrack>* track =
-      new rtc::RefCountedObject<VideoTrack>(id, source, worker_thread);
-  return track;
-}
-
-}  // namespace webrtc
diff --git a/pc/videotrack.h b/pc/videotrack.h
deleted file mode 100644
index d0f0618..0000000
--- a/pc/videotrack.h
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- *  Copyright 2012 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_PC_VIDEOTRACK_H_
-#define WEBRTC_PC_VIDEOTRACK_H_
-
-#include <string>
-#include <vector>
-
-#include "webrtc/media/base/videosourcebase.h"
-#include "webrtc/pc/mediastreamtrack.h"
-#include "webrtc/rtc_base/scoped_ref_ptr.h"
-#include "webrtc/rtc_base/thread_checker.h"
-
-namespace webrtc {
-
-class VideoTrack : public MediaStreamTrack<VideoTrackInterface>,
-                   public rtc::VideoSourceBase,
-                   public ObserverInterface {
- public:
-  static rtc::scoped_refptr<VideoTrack> Create(
-      const std::string& label,
-      VideoTrackSourceInterface* source,
-      rtc::Thread* worker_thread);
-
-  void AddOrUpdateSink(rtc::VideoSinkInterface<VideoFrame>* sink,
-                       const rtc::VideoSinkWants& wants) override;
-  void RemoveSink(rtc::VideoSinkInterface<VideoFrame>* sink) override;
-
-  VideoTrackSourceInterface* GetSource() const override {
-    return video_source_.get();
-  }
-  ContentHint content_hint() const override;
-  void set_content_hint(ContentHint hint) override;
-  bool set_enabled(bool enable) override;
-  std::string kind() const override;
-
- protected:
-  VideoTrack(const std::string& id,
-             VideoTrackSourceInterface* video_source,
-             rtc::Thread* worker_thread);
-  ~VideoTrack();
-
- private:
-  // Implements ObserverInterface. Observes |video_source_| state.
-  void OnChanged() override;
-
-  rtc::Thread* const worker_thread_;
-  rtc::ThreadChecker signaling_thread_checker_;
-  rtc::scoped_refptr<VideoTrackSourceInterface> video_source_;
-  ContentHint content_hint_ RTC_GUARDED_BY(signaling_thread_checker_);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_PC_VIDEOTRACK_H_
diff --git a/pc/videotrack_unittest.cc b/pc/videotrack_unittest.cc
deleted file mode 100644
index 1f569eb..0000000
--- a/pc/videotrack_unittest.cc
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- *  Copyright 2012 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 <memory>
-#include <string>
-
-#include "webrtc/media/base/fakemediaengine.h"
-#include "webrtc/media/base/fakevideocapturer.h"
-#include "webrtc/pc/test/fakevideotrackrenderer.h"
-#include "webrtc/pc/videocapturertracksource.h"
-#include "webrtc/pc/videotrack.h"
-#include "webrtc/rtc_base/gunit.h"
-
-using webrtc::FakeVideoTrackRenderer;
-using webrtc::MediaSourceInterface;
-using webrtc::MediaStreamTrackInterface;
-using webrtc::VideoTrackSource;
-using webrtc::VideoTrack;
-using webrtc::VideoTrackInterface;
-
-class VideoTrackTest : public testing::Test {
- public:
-  VideoTrackTest() {
-    static const char kVideoTrackId[] = "track_id";
-    video_track_source_ = new rtc::RefCountedObject<VideoTrackSource>(
-        &capturer_, true /* remote */);
-    video_track_ = VideoTrack::Create(kVideoTrackId, video_track_source_,
-                                      rtc::Thread::Current());
-    capturer_.Start(
-        cricket::VideoFormat(640, 480, cricket::VideoFormat::FpsToInterval(30),
-                             cricket::FOURCC_I420));
-  }
-
- protected:
-  cricket::FakeVideoCapturer capturer_;
-  rtc::scoped_refptr<VideoTrackSource> video_track_source_;
-  rtc::scoped_refptr<VideoTrackInterface> video_track_;
-};
-
-// Test changing the source state also changes the track state.
-TEST_F(VideoTrackTest, SourceStateChangeTrackState) {
-  EXPECT_EQ(MediaStreamTrackInterface::kLive, video_track_->state());
-  video_track_source_->SetState(MediaSourceInterface::kEnded);
-  EXPECT_EQ(MediaStreamTrackInterface::kEnded, video_track_->state());
-}
-
-// Test adding renderers to a video track and render to them by providing
-// frames to the source.
-TEST_F(VideoTrackTest, RenderVideo) {
-  // FakeVideoTrackRenderer register itself to |video_track_|
-  std::unique_ptr<FakeVideoTrackRenderer> renderer_1(
-      new FakeVideoTrackRenderer(video_track_.get()));
-
-  capturer_.CaptureFrame();
-  EXPECT_EQ(1, renderer_1->num_rendered_frames());
-
-  // FakeVideoTrackRenderer register itself to |video_track_|
-  std::unique_ptr<FakeVideoTrackRenderer> renderer_2(
-      new FakeVideoTrackRenderer(video_track_.get()));
-  capturer_.CaptureFrame();
-  EXPECT_EQ(2, renderer_1->num_rendered_frames());
-  EXPECT_EQ(1, renderer_2->num_rendered_frames());
-
-  renderer_1.reset(nullptr);
-  capturer_.CaptureFrame();
-  EXPECT_EQ(2, renderer_2->num_rendered_frames());
-}
-
-// Test that disabling the track results in blacked out frames.
-TEST_F(VideoTrackTest, DisableTrackBlackout) {
-  std::unique_ptr<FakeVideoTrackRenderer> renderer(
-      new FakeVideoTrackRenderer(video_track_.get()));
-
-  capturer_.CaptureFrame();
-  EXPECT_EQ(1, renderer->num_rendered_frames());
-  EXPECT_FALSE(renderer->black_frame());
-
-  video_track_->set_enabled(false);
-  capturer_.CaptureFrame();
-  EXPECT_EQ(2, renderer->num_rendered_frames());
-  EXPECT_TRUE(renderer->black_frame());
-
-  video_track_->set_enabled(true);
-  capturer_.CaptureFrame();
-  EXPECT_EQ(3, renderer->num_rendered_frames());
-  EXPECT_FALSE(renderer->black_frame());
-}
diff --git a/pc/videotracksource.cc b/pc/videotracksource.cc
deleted file mode 100644
index f3ca8d7..0000000
--- a/pc/videotracksource.cc
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- *  Copyright 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/pc/videotracksource.h"
-
-#include <string>
-
-namespace webrtc {
-
-VideoTrackSource::VideoTrackSource(
-    rtc::VideoSourceInterface<VideoFrame>* source,
-    bool remote)
-    : source_(source), state_(kInitializing), remote_(remote) {
-  worker_thread_checker_.DetachFromThread();
-}
-
-void VideoTrackSource::SetState(SourceState new_state) {
-  if (state_ != new_state) {
-    state_ = new_state;
-    FireOnChanged();
-  }
-}
-
-void VideoTrackSource::OnSourceDestroyed() {
-  source_ = nullptr;
-}
-
-void VideoTrackSource::AddOrUpdateSink(
-    rtc::VideoSinkInterface<VideoFrame>* sink,
-    const rtc::VideoSinkWants& wants) {
-  RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-  if (!source_) {
-    return;
-  }
-  source_->AddOrUpdateSink(sink, wants);
-}
-
-void VideoTrackSource::RemoveSink(rtc::VideoSinkInterface<VideoFrame>* sink) {
-  RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-  if (!source_) {
-    return;
-  }
-  source_->RemoveSink(sink);
-}
-
-}  //  namespace webrtc
diff --git a/pc/videotracksource.h b/pc/videotracksource.h
deleted file mode 100644
index 41252d8..0000000
--- a/pc/videotracksource.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- *  Copyright 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_PC_VIDEOTRACKSOURCE_H_
-#define WEBRTC_PC_VIDEOTRACKSOURCE_H_
-
-#include "webrtc/api/mediastreaminterface.h"
-#include "webrtc/api/notifier.h"
-#include "webrtc/media/base/mediachannel.h"
-#include "webrtc/media/base/videosinkinterface.h"
-#include "webrtc/rtc_base/thread_checker.h"
-
-// VideoTrackSource implements VideoTrackSourceInterface.
-namespace webrtc {
-
-class VideoTrackSource : public Notifier<VideoTrackSourceInterface> {
- public:
-  VideoTrackSource(rtc::VideoSourceInterface<VideoFrame>* source, bool remote);
-  void SetState(SourceState new_state);
-  // OnSourceDestroyed clears this instance pointer to |source_|. It is useful
-  // when the underlying rtc::VideoSourceInterface is destroyed before the
-  // reference counted VideoTrackSource.
-  void OnSourceDestroyed();
-
-  SourceState state() const override { return state_; }
-  bool remote() const override { return remote_; }
-
-  bool is_screencast() const override { return false; }
-  rtc::Optional<bool> needs_denoising() const override {
-    return rtc::Optional<bool>(); }
-
-  bool GetStats(Stats* stats) override { return false; }
-
-  void AddOrUpdateSink(rtc::VideoSinkInterface<VideoFrame>* sink,
-                       const rtc::VideoSinkWants& wants) override;
-  void RemoveSink(rtc::VideoSinkInterface<VideoFrame>* sink) override;
-
- private:
-  rtc::ThreadChecker worker_thread_checker_;
-  rtc::VideoSourceInterface<VideoFrame>* source_;
-  cricket::VideoOptions options_;
-  SourceState state_;
-  const bool remote_;
-};
-
-}  // namespace webrtc
-
-#endif  //  WEBRTC_PC_VIDEOTRACKSOURCE_H_
diff --git a/pc/voicechannel.h b/pc/voicechannel.h
deleted file mode 100644
index 78524ab..0000000
--- a/pc/voicechannel.h
+++ /dev/null
@@ -1,16 +0,0 @@
-/*
- *  Copyright 2004 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_PC_VOICECHANNEL_H_
-#define WEBRTC_PC_VOICECHANNEL_H_
-
-#include "webrtc/pc/channel.h"
-
-#endif  // WEBRTC_PC_VOICECHANNEL_H_
diff --git a/pc/webrtcsdp.cc b/pc/webrtcsdp.cc
deleted file mode 100644
index 7dc2605..0000000
--- a/pc/webrtcsdp.cc
+++ /dev/null
@@ -1,3336 +0,0 @@
-/*
- *  Copyright 2011 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/pc/webrtcsdp.h"
-
-#include <ctype.h>
-#include <limits.h>
-#include <stdio.h>
-
-#include <algorithm>
-#include <memory>
-#include <string>
-#include <unordered_map>
-#include <vector>
-
-#include "webrtc/api/jsepicecandidate.h"
-#include "webrtc/api/jsepsessiondescription.h"
-// for RtpExtension
-#include "webrtc/api/rtpparameters.h"
-#include "webrtc/media/base/codec.h"
-#include "webrtc/media/base/cryptoparams.h"
-#include "webrtc/media/base/mediaconstants.h"
-#include "webrtc/media/base/rtputils.h"
-#include "webrtc/media/sctp/sctptransportinternal.h"
-#include "webrtc/p2p/base/candidate.h"
-#include "webrtc/p2p/base/p2pconstants.h"
-#include "webrtc/p2p/base/port.h"
-#include "webrtc/pc/mediasession.h"
-#include "webrtc/rtc_base/arraysize.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/messagedigest.h"
-#include "webrtc/rtc_base/stringutils.h"
-
-using cricket::AudioContentDescription;
-using cricket::Candidate;
-using cricket::Candidates;
-using cricket::ContentDescription;
-using cricket::ContentInfo;
-using cricket::CryptoParams;
-using cricket::DataContentDescription;
-using cricket::ICE_CANDIDATE_COMPONENT_RTP;
-using cricket::ICE_CANDIDATE_COMPONENT_RTCP;
-using cricket::kCodecParamMaxBitrate;
-using cricket::kCodecParamMaxPTime;
-using cricket::kCodecParamMaxQuantization;
-using cricket::kCodecParamMinBitrate;
-using cricket::kCodecParamMinPTime;
-using cricket::kCodecParamPTime;
-using cricket::kCodecParamSPropStereo;
-using cricket::kCodecParamStartBitrate;
-using cricket::kCodecParamStereo;
-using cricket::kCodecParamUseInbandFec;
-using cricket::kCodecParamUseDtx;
-using cricket::kCodecParamSctpProtocol;
-using cricket::kCodecParamSctpStreams;
-using cricket::kCodecParamMaxAverageBitrate;
-using cricket::kCodecParamMaxPlaybackRate;
-using cricket::kCodecParamAssociatedPayloadType;
-using cricket::MediaContentDescription;
-using cricket::MediaType;
-using cricket::RtpHeaderExtensions;
-using cricket::SsrcGroup;
-using cricket::StreamParams;
-using cricket::StreamParamsVec;
-using cricket::TransportDescription;
-using cricket::TransportInfo;
-using cricket::VideoContentDescription;
-using rtc::SocketAddress;
-
-namespace cricket {
-class SessionDescription;
-}
-
-// TODO(deadbeef): Switch to using anonymous namespace rather than declaring
-// everything "static".
-namespace webrtc {
-
-// Line type
-// RFC 4566
-// An SDP session description consists of a number of lines of text of
-// the form:
-// <type>=<value>
-// where <type> MUST be exactly one case-significant character.
-static const int kLinePrefixLength = 2;  // Length of <type>=
-static const char kLineTypeVersion = 'v';
-static const char kLineTypeOrigin = 'o';
-static const char kLineTypeSessionName = 's';
-static const char kLineTypeSessionInfo = 'i';
-static const char kLineTypeSessionUri = 'u';
-static const char kLineTypeSessionEmail = 'e';
-static const char kLineTypeSessionPhone = 'p';
-static const char kLineTypeSessionBandwidth = 'b';
-static const char kLineTypeTiming = 't';
-static const char kLineTypeRepeatTimes = 'r';
-static const char kLineTypeTimeZone = 'z';
-static const char kLineTypeEncryptionKey = 'k';
-static const char kLineTypeMedia = 'm';
-static const char kLineTypeConnection = 'c';
-static const char kLineTypeAttributes = 'a';
-
-// Attributes
-static const char kAttributeGroup[] = "group";
-static const char kAttributeMid[] = "mid";
-static const char kAttributeMsid[] = "msid";
-static const char kAttributeBundleOnly[] = "bundle-only";
-static const char kAttributeRtcpMux[] = "rtcp-mux";
-static const char kAttributeRtcpReducedSize[] = "rtcp-rsize";
-static const char kAttributeSsrc[] = "ssrc";
-static const char kSsrcAttributeCname[] = "cname";
-static const char kAttributeExtmap[] = "extmap";
-// draft-alvestrand-mmusic-msid-01
-// a=msid-semantic: WMS
-static const char kAttributeMsidSemantics[] = "msid-semantic";
-static const char kMediaStreamSemantic[] = "WMS";
-static const char kSsrcAttributeMsid[] = "msid";
-static const char kDefaultMsid[] = "default";
-static const char kSsrcAttributeMslabel[] = "mslabel";
-static const char kSSrcAttributeLabel[] = "label";
-static const char kAttributeSsrcGroup[] = "ssrc-group";
-static const char kAttributeCrypto[] = "crypto";
-static const char kAttributeCandidate[] = "candidate";
-static const char kAttributeCandidateTyp[] = "typ";
-static const char kAttributeCandidateRaddr[] = "raddr";
-static const char kAttributeCandidateRport[] = "rport";
-static const char kAttributeCandidateUfrag[] = "ufrag";
-static const char kAttributeCandidatePwd[] = "pwd";
-static const char kAttributeCandidateGeneration[] = "generation";
-static const char kAttributeCandidateNetworkId[] = "network-id";
-static const char kAttributeCandidateNetworkCost[] = "network-cost";
-static const char kAttributeFingerprint[] = "fingerprint";
-static const char kAttributeSetup[] = "setup";
-static const char kAttributeFmtp[] = "fmtp";
-static const char kAttributeRtpmap[] = "rtpmap";
-static const char kAttributeSctpmap[] = "sctpmap";
-static const char kAttributeRtcp[] = "rtcp";
-static const char kAttributeIceUfrag[] = "ice-ufrag";
-static const char kAttributeIcePwd[] = "ice-pwd";
-static const char kAttributeIceLite[] = "ice-lite";
-static const char kAttributeIceOption[] = "ice-options";
-static const char kAttributeSendOnly[] = "sendonly";
-static const char kAttributeRecvOnly[] = "recvonly";
-static const char kAttributeRtcpFb[] = "rtcp-fb";
-static const char kAttributeSendRecv[] = "sendrecv";
-static const char kAttributeInactive[] = "inactive";
-// draft-ietf-mmusic-sctp-sdp-07
-// a=sctp-port
-static const char kAttributeSctpPort[] = "sctp-port";
-
-// Experimental flags
-static const char kAttributeXGoogleFlag[] = "x-google-flag";
-static const char kValueConference[] = "conference";
-
-// Candidate
-static const char kCandidateHost[] = "host";
-static const char kCandidateSrflx[] = "srflx";
-static const char kCandidatePrflx[] = "prflx";
-static const char kCandidateRelay[] = "relay";
-static const char kTcpCandidateType[] = "tcptype";
-
-static const char kSdpDelimiterEqual = '=';
-static const char kSdpDelimiterSpace = ' ';
-static const char kSdpDelimiterColon = ':';
-static const char kSdpDelimiterSemicolon = ';';
-static const char kSdpDelimiterSlash = '/';
-static const char kNewLine = '\n';
-static const char kReturn = '\r';
-static const char kLineBreak[] = "\r\n";
-
-// TODO: Generate the Session and Time description
-// instead of hardcoding.
-static const char kSessionVersion[] = "v=0";
-// RFC 4566
-static const char kSessionOriginUsername[] = "-";
-static const char kSessionOriginSessionId[] = "0";
-static const char kSessionOriginSessionVersion[] = "0";
-static const char kSessionOriginNettype[] = "IN";
-static const char kSessionOriginAddrtype[] = "IP4";
-static const char kSessionOriginAddress[] = "127.0.0.1";
-static const char kSessionName[] = "s=-";
-static const char kTimeDescription[] = "t=0 0";
-static const char kAttrGroup[] = "a=group:BUNDLE";
-static const char kConnectionNettype[] = "IN";
-static const char kConnectionIpv4Addrtype[] = "IP4";
-static const char kConnectionIpv6Addrtype[] = "IP6";
-static const char kMediaTypeVideo[] = "video";
-static const char kMediaTypeAudio[] = "audio";
-static const char kMediaTypeData[] = "application";
-static const char kMediaPortRejected[] = "0";
-// draft-ietf-mmusic-trickle-ice-01
-// When no candidates have been gathered, set the connection
-// address to IP6 ::.
-// TODO(perkj): FF can not parse IP6 ::. See http://crbug/430333
-// Use IPV4 per default.
-static const char kDummyAddress[] = "0.0.0.0";
-static const char kDummyPort[] = "9";
-// RFC 3556
-static const char kApplicationSpecificMaximum[] = "AS";
-
-static const char kDefaultSctpmapProtocol[] = "webrtc-datachannel";
-
-// RTP payload type is in the 0-127 range. Use -1 to indicate "all" payload
-// types.
-const int kWildcardPayloadType = -1;
-
-struct SsrcInfo {
-  uint32_t ssrc_id;
-  std::string cname;
-  std::string stream_id;
-  std::string track_id;
-
-  // For backward compatibility.
-  // TODO(ronghuawu): Remove below 2 fields once all the clients support msid.
-  std::string label;
-  std::string mslabel;
-};
-typedef std::vector<SsrcInfo> SsrcInfoVec;
-typedef std::vector<SsrcGroup> SsrcGroupVec;
-
-template <class T>
-static void AddFmtpLine(const T& codec, std::string* message);
-static void BuildMediaDescription(const ContentInfo* content_info,
-                                  const TransportInfo* transport_info,
-                                  const MediaType media_type,
-                                  const std::vector<Candidate>& candidates,
-                                  bool unified_plan_sdp,
-                                  std::string* message);
-static void BuildSctpContentAttributes(std::string* message,
-                                       int sctp_port,
-                                       bool use_sctpmap);
-static void BuildRtpContentAttributes(const MediaContentDescription* media_desc,
-                                      const MediaType media_type,
-                                      bool unified_plan_sdp,
-                                      std::string* message);
-static void BuildRtpMap(const MediaContentDescription* media_desc,
-                        const MediaType media_type,
-                        std::string* message);
-static void BuildCandidate(const std::vector<Candidate>& candidates,
-                           bool include_ufrag,
-                           std::string* message);
-static void BuildIceOptions(const std::vector<std::string>& transport_options,
-                            std::string* message);
-static bool IsRtp(const std::string& protocol);
-static bool IsDtlsSctp(const std::string& protocol);
-static bool ParseSessionDescription(const std::string& message,
-                                    size_t* pos,
-                                    std::string* session_id,
-                                    std::string* session_version,
-                                    TransportDescription* session_td,
-                                    RtpHeaderExtensions* session_extmaps,
-                                    rtc::SocketAddress* connection_addr,
-                                    cricket::SessionDescription* desc,
-                                    SdpParseError* error);
-static bool ParseGroupAttribute(const std::string& line,
-                                cricket::SessionDescription* desc,
-                                SdpParseError* error);
-static bool ParseMediaDescription(
-    const std::string& message,
-    const TransportDescription& session_td,
-    const RtpHeaderExtensions& session_extmaps,
-    size_t* pos,
-    const rtc::SocketAddress& session_connection_addr,
-    cricket::SessionDescription* desc,
-    std::vector<JsepIceCandidate*>* candidates,
-    SdpParseError* error);
-static bool ParseContent(const std::string& message,
-                         const MediaType media_type,
-                         int mline_index,
-                         const std::string& protocol,
-                         const std::vector<int>& payload_types,
-                         size_t* pos,
-                         std::string* content_name,
-                         bool* bundle_only,
-                         MediaContentDescription* media_desc,
-                         TransportDescription* transport,
-                         std::vector<JsepIceCandidate*>* candidates,
-                         SdpParseError* error);
-static bool ParseSsrcAttribute(const std::string& line,
-                               SsrcInfoVec* ssrc_infos,
-                               SdpParseError* error);
-static bool ParseSsrcGroupAttribute(const std::string& line,
-                                    SsrcGroupVec* ssrc_groups,
-                                    SdpParseError* error);
-static bool ParseCryptoAttribute(const std::string& line,
-                                 MediaContentDescription* media_desc,
-                                 SdpParseError* error);
-static bool ParseRtpmapAttribute(const std::string& line,
-                                 const MediaType media_type,
-                                 const std::vector<int>& payload_types,
-                                 MediaContentDescription* media_desc,
-                                 SdpParseError* error);
-static bool ParseFmtpAttributes(const std::string& line,
-                                const MediaType media_type,
-                                MediaContentDescription* media_desc,
-                                SdpParseError* error);
-static bool ParseFmtpParam(const std::string& line, std::string* parameter,
-                           std::string* value, SdpParseError* error);
-static bool ParseCandidate(const std::string& message, Candidate* candidate,
-                           SdpParseError* error, bool is_raw);
-static bool ParseRtcpFbAttribute(const std::string& line,
-                                 const MediaType media_type,
-                                 MediaContentDescription* media_desc,
-                                 SdpParseError* error);
-static bool ParseIceOptions(const std::string& line,
-                            std::vector<std::string>* transport_options,
-                            SdpParseError* error);
-static bool ParseExtmap(const std::string& line,
-                        RtpExtension* extmap,
-                        SdpParseError* error);
-static bool ParseFingerprintAttribute(const std::string& line,
-                                      rtc::SSLFingerprint** fingerprint,
-                                      SdpParseError* error);
-static bool ParseDtlsSetup(const std::string& line,
-                           cricket::ConnectionRole* role,
-                           SdpParseError* error);
-static bool ParseMsidAttribute(const std::string& line,
-                               std::string* stream_id,
-                               std::string* track_id,
-                               SdpParseError* error);
-
-// Helper functions
-
-// Below ParseFailed*** functions output the line that caused the parsing
-// failure and the detailed reason (|description|) of the failure to |error|.
-// The functions always return false so that they can be used directly in the
-// following way when error happens:
-// "return ParseFailed***(...);"
-
-// The line starting at |line_start| of |message| is the failing line.
-// The reason for the failure should be provided in the |description|.
-// An example of a description could be "unknown character".
-static bool ParseFailed(const std::string& message,
-                        size_t line_start,
-                        const std::string& description,
-                        SdpParseError* error) {
-  // Get the first line of |message| from |line_start|.
-  std::string first_line;
-  size_t line_end = message.find(kNewLine, line_start);
-  if (line_end != std::string::npos) {
-    if (line_end > 0 && (message.at(line_end - 1) == kReturn)) {
-      --line_end;
-    }
-    first_line = message.substr(line_start, (line_end - line_start));
-  } else {
-    first_line = message.substr(line_start);
-  }
-
-  if (error) {
-    error->line = first_line;
-    error->description = description;
-  }
-  LOG(LS_ERROR) << "Failed to parse: \"" << first_line
-                << "\". Reason: " << description;
-  return false;
-}
-
-// |line| is the failing line. The reason for the failure should be
-// provided in the |description|.
-static bool ParseFailed(const std::string& line,
-                        const std::string& description,
-                        SdpParseError* error) {
-  return ParseFailed(line, 0, description, error);
-}
-
-// Parses failure where the failing SDP line isn't know or there are multiple
-// failing lines.
-static bool ParseFailed(const std::string& description,
-                        SdpParseError* error) {
-  return ParseFailed("", description, error);
-}
-
-// |line| is the failing line. The failure is due to the fact that |line|
-// doesn't have |expected_fields| fields.
-static bool ParseFailedExpectFieldNum(const std::string& line,
-                                      int expected_fields,
-                                      SdpParseError* error) {
-  std::ostringstream description;
-  description << "Expects " << expected_fields << " fields.";
-  return ParseFailed(line, description.str(), error);
-}
-
-// |line| is the failing line. The failure is due to the fact that |line| has
-// less than |expected_min_fields| fields.
-static bool ParseFailedExpectMinFieldNum(const std::string& line,
-                                         int expected_min_fields,
-                                         SdpParseError* error) {
-  std::ostringstream description;
-  description << "Expects at least " << expected_min_fields << " fields.";
-  return ParseFailed(line, description.str(), error);
-}
-
-// |line| is the failing line. The failure is due to the fact that it failed to
-// get the value of |attribute|.
-static bool ParseFailedGetValue(const std::string& line,
-                                const std::string& attribute,
-                                SdpParseError* error) {
-  std::ostringstream description;
-  description << "Failed to get the value of attribute: " << attribute;
-  return ParseFailed(line, description.str(), error);
-}
-
-// The line starting at |line_start| of |message| is the failing line. The
-// failure is due to the line type (e.g. the "m" part of the "m-line")
-// not matching what is expected. The expected line type should be
-// provided as |line_type|.
-static bool ParseFailedExpectLine(const std::string& message,
-                                  size_t line_start,
-                                  const char line_type,
-                                  const std::string& line_value,
-                                  SdpParseError* error) {
-  std::ostringstream description;
-  description << "Expect line: " << line_type << "=" << line_value;
-  return ParseFailed(message, line_start, description.str(), error);
-}
-
-static bool AddLine(const std::string& line, std::string* message) {
-  if (!message)
-    return false;
-
-  message->append(line);
-  message->append(kLineBreak);
-  return true;
-}
-
-static bool GetLine(const std::string& message,
-                    size_t* pos,
-                    std::string* line) {
-  size_t line_begin = *pos;
-  size_t line_end = message.find(kNewLine, line_begin);
-  if (line_end == std::string::npos) {
-    return false;
-  }
-  // Update the new start position
-  *pos = line_end + 1;
-  if (line_end > 0 && (message.at(line_end - 1) == kReturn)) {
-    --line_end;
-  }
-  *line = message.substr(line_begin, (line_end - line_begin));
-  const char* cline = line->c_str();
-  // RFC 4566
-  // An SDP session description consists of a number of lines of text of
-  // the form:
-  // <type>=<value>
-  // where <type> MUST be exactly one case-significant character and
-  // <value> is structured text whose format depends on <type>.
-  // Whitespace MUST NOT be used on either side of the "=" sign.
-  if (line->length() < 3 ||
-      !islower(cline[0]) ||
-      cline[1] != kSdpDelimiterEqual ||
-      cline[2] == kSdpDelimiterSpace) {
-    *pos = line_begin;
-    return false;
-  }
-  return true;
-}
-
-// Init |os| to "|type|=|value|".
-static void InitLine(const char type,
-                     const std::string& value,
-                     std::ostringstream* os) {
-  os->str("");
-  *os << type << kSdpDelimiterEqual << value;
-}
-
-// Init |os| to "a=|attribute|".
-static void InitAttrLine(const std::string& attribute, std::ostringstream* os) {
-  InitLine(kLineTypeAttributes, attribute, os);
-}
-
-// Writes a SDP attribute line based on |attribute| and |value| to |message|.
-static void AddAttributeLine(const std::string& attribute, int value,
-                             std::string* message) {
-  std::ostringstream os;
-  InitAttrLine(attribute, &os);
-  os << kSdpDelimiterColon << value;
-  AddLine(os.str(), message);
-}
-
-static bool IsLineType(const std::string& message,
-                       const char type,
-                       size_t line_start) {
-  if (message.size() < line_start + kLinePrefixLength) {
-    return false;
-  }
-  const char* cmessage = message.c_str();
-  return (cmessage[line_start] == type &&
-          cmessage[line_start + 1] == kSdpDelimiterEqual);
-}
-
-static bool IsLineType(const std::string& line,
-                       const char type) {
-  return IsLineType(line, type, 0);
-}
-
-static bool GetLineWithType(const std::string& message, size_t* pos,
-                            std::string* line, const char type) {
-  if (!IsLineType(message, type, *pos)) {
-    return false;
-  }
-
-  if (!GetLine(message, pos, line))
-    return false;
-
-  return true;
-}
-
-static bool HasAttribute(const std::string& line,
-                         const std::string& attribute) {
-  return (line.compare(kLinePrefixLength, attribute.size(), attribute) == 0);
-}
-
-static bool AddSsrcLine(uint32_t ssrc_id,
-                        const std::string& attribute,
-                        const std::string& value,
-                        std::string* message) {
-  // RFC 5576
-  // a=ssrc:<ssrc-id> <attribute>:<value>
-  std::ostringstream os;
-  InitAttrLine(kAttributeSsrc, &os);
-  os << kSdpDelimiterColon << ssrc_id << kSdpDelimiterSpace
-     << attribute << kSdpDelimiterColon << value;
-  return AddLine(os.str(), message);
-}
-
-// Get value only from <attribute>:<value>.
-static bool GetValue(const std::string& message, const std::string& attribute,
-                     std::string* value, SdpParseError* error) {
-  std::string leftpart;
-  if (!rtc::tokenize_first(message, kSdpDelimiterColon, &leftpart, value)) {
-    return ParseFailedGetValue(message, attribute, error);
-  }
-  // The left part should end with the expected attribute.
-  if (leftpart.length() < attribute.length() ||
-      leftpart.compare(leftpart.length() - attribute.length(),
-                       attribute.length(), attribute) != 0) {
-    return ParseFailedGetValue(message, attribute, error);
-  }
-  return true;
-}
-
-static bool CaseInsensitiveFind(std::string str1, std::string str2) {
-  std::transform(str1.begin(), str1.end(), str1.begin(),
-                 ::tolower);
-  std::transform(str2.begin(), str2.end(), str2.begin(),
-                 ::tolower);
-  return str1.find(str2) != std::string::npos;
-}
-
-template <class T>
-static bool GetValueFromString(const std::string& line,
-                               const std::string& s,
-                               T* t,
-                               SdpParseError* error) {
-  if (!rtc::FromString(s, t)) {
-    std::ostringstream description;
-    description << "Invalid value: " << s << ".";
-    return ParseFailed(line, description.str(), error);
-  }
-  return true;
-}
-
-static bool GetPayloadTypeFromString(const std::string& line,
-                                     const std::string& s,
-                                     int* payload_type,
-                                     SdpParseError* error) {
-  return GetValueFromString(line, s, payload_type, error) &&
-      cricket::IsValidRtpPayloadType(*payload_type);
-}
-
-// |msid_stream_id| and |msid_track_id| represent the stream/track ID from the
-// "a=msid" attribute, if it exists. They are empty if the attribute does not
-// exist.
-void CreateTracksFromSsrcInfos(const SsrcInfoVec& ssrc_infos,
-                               const std::string& msid_stream_id,
-                               const std::string& msid_track_id,
-                               StreamParamsVec* tracks) {
-  RTC_DCHECK(tracks != NULL);
-  RTC_DCHECK(msid_stream_id.empty() == msid_track_id.empty());
-  for (SsrcInfoVec::const_iterator ssrc_info = ssrc_infos.begin();
-       ssrc_info != ssrc_infos.end(); ++ssrc_info) {
-    if (ssrc_info->cname.empty()) {
-      continue;
-    }
-
-    std::string stream_id;
-    std::string track_id;
-    if (ssrc_info->stream_id.empty() && !ssrc_info->mslabel.empty()) {
-      // If there's no msid and there's mslabel, we consider this is a sdp from
-      // a older version of client that doesn't support msid.
-      // In that case, we use the mslabel and label to construct the track.
-      stream_id = ssrc_info->mslabel;
-      track_id = ssrc_info->label;
-    } else if (ssrc_info->stream_id.empty() && !msid_stream_id.empty()) {
-      // If there's no msid in the SSRC attributes, but there's a global one
-      // (from a=msid), use that. This is the case with unified plan SDP.
-      stream_id = msid_stream_id;
-      track_id = msid_track_id;
-    } else {
-      stream_id = ssrc_info->stream_id;
-      track_id = ssrc_info->track_id;
-    }
-    // If a stream/track ID wasn't populated from the SSRC attributes OR the
-    // msid attribute, use default/random values.
-    if (stream_id.empty()) {
-      stream_id = kDefaultMsid;
-    }
-    if (track_id.empty()) {
-      // TODO(ronghuawu): What should we do if the track id doesn't appear?
-      // Create random string (which will be used as track label later)?
-      track_id = rtc::CreateRandomString(8);
-    }
-
-    StreamParamsVec::iterator track = tracks->begin();
-    for (; track != tracks->end(); ++track) {
-      if (track->id == track_id) {
-        break;
-      }
-    }
-    if (track == tracks->end()) {
-      // If we don't find an existing track, create a new one.
-      tracks->push_back(StreamParams());
-      track = tracks->end() - 1;
-    }
-    track->add_ssrc(ssrc_info->ssrc_id);
-    track->cname = ssrc_info->cname;
-    track->sync_label = stream_id;
-    track->id = track_id;
-  }
-}
-
-void GetMediaStreamLabels(const ContentInfo* content,
-                          std::set<std::string>* labels) {
-  const MediaContentDescription* media_desc =
-      static_cast<const MediaContentDescription*>(
-          content->description);
-  const cricket::StreamParamsVec& streams =  media_desc->streams();
-  for (cricket::StreamParamsVec::const_iterator it = streams.begin();
-       it != streams.end(); ++it) {
-    labels->insert(it->sync_label);
-  }
-}
-
-// RFC 5245
-// It is RECOMMENDED that default candidates be chosen based on the
-// likelihood of those candidates to work with the peer that is being
-// contacted.  It is RECOMMENDED that relayed > reflexive > host.
-static const int kPreferenceUnknown = 0;
-static const int kPreferenceHost = 1;
-static const int kPreferenceReflexive = 2;
-static const int kPreferenceRelayed = 3;
-
-static int GetCandidatePreferenceFromType(const std::string& type) {
-  int preference = kPreferenceUnknown;
-  if (type == cricket::LOCAL_PORT_TYPE) {
-    preference = kPreferenceHost;
-  } else if (type == cricket::STUN_PORT_TYPE) {
-    preference = kPreferenceReflexive;
-  } else if (type == cricket::RELAY_PORT_TYPE) {
-    preference = kPreferenceRelayed;
-  } else {
-    RTC_NOTREACHED();
-  }
-  return preference;
-}
-
-// Get ip and port of the default destination from the |candidates| with the
-// given value of |component_id|. The default candidate should be the one most
-// likely to work, typically IPv4 relay.
-// RFC 5245
-// The value of |component_id| currently supported are 1 (RTP) and 2 (RTCP).
-// TODO: Decide the default destination in webrtcsession and
-// pass it down via SessionDescription.
-static void GetDefaultDestination(
-    const std::vector<Candidate>& candidates,
-    int component_id, std::string* port,
-    std::string* ip, std::string* addr_type) {
-  *addr_type = kConnectionIpv4Addrtype;
-  *port = kDummyPort;
-  *ip = kDummyAddress;
-  int current_preference = kPreferenceUnknown;
-  int current_family = AF_UNSPEC;
-  for (std::vector<Candidate>::const_iterator it = candidates.begin();
-       it != candidates.end(); ++it) {
-    if (it->component() != component_id) {
-      continue;
-    }
-    // Default destination should be UDP only.
-    if (it->protocol() != cricket::UDP_PROTOCOL_NAME) {
-      continue;
-    }
-    const int preference = GetCandidatePreferenceFromType(it->type());
-    const int family = it->address().ipaddr().family();
-    // See if this candidate is more preferable then the current one if it's the
-    // same family. Or if the current family is IPv4 already so we could safely
-    // ignore all IPv6 ones. WebRTC bug 4269.
-    // http://code.google.com/p/webrtc/issues/detail?id=4269
-    if ((preference <= current_preference && current_family == family) ||
-        (current_family == AF_INET && family == AF_INET6)) {
-      continue;
-    }
-    if (family == AF_INET) {
-      addr_type->assign(kConnectionIpv4Addrtype);
-    } else if (family == AF_INET6) {
-      addr_type->assign(kConnectionIpv6Addrtype);
-    }
-    current_preference = preference;
-    current_family = family;
-    *port = it->address().PortAsString();
-    *ip = it->address().ipaddr().ToString();
-  }
-}
-
-// Gets "a=rtcp" line if found default RTCP candidate from |candidates|.
-static std::string GetRtcpLine(const std::vector<Candidate>& candidates) {
-  std::string rtcp_line, rtcp_port, rtcp_ip, addr_type;
-  GetDefaultDestination(candidates, ICE_CANDIDATE_COMPONENT_RTCP,
-                        &rtcp_port, &rtcp_ip, &addr_type);
-  // Found default RTCP candidate.
-  // RFC 5245
-  // If the agent is utilizing RTCP, it MUST encode the RTCP candidate
-  // using the a=rtcp attribute as defined in RFC 3605.
-
-  // RFC 3605
-  // rtcp-attribute =  "a=rtcp:" port  [nettype space addrtype space
-  // connection-address] CRLF
-  std::ostringstream os;
-  InitAttrLine(kAttributeRtcp, &os);
-  os << kSdpDelimiterColon
-     << rtcp_port << " "
-     << kConnectionNettype << " "
-     << addr_type << " "
-     << rtcp_ip;
-  rtcp_line = os.str();
-  return rtcp_line;
-}
-
-// Get candidates according to the mline index from SessionDescriptionInterface.
-static void GetCandidatesByMindex(const SessionDescriptionInterface& desci,
-                                  int mline_index,
-                                  std::vector<Candidate>* candidates) {
-  if (!candidates) {
-    return;
-  }
-  const IceCandidateCollection* cc = desci.candidates(mline_index);
-  for (size_t i = 0; i < cc->count(); ++i) {
-    const IceCandidateInterface* candidate = cc->at(i);
-    candidates->push_back(candidate->candidate());
-  }
-}
-
-static bool IsValidPort(int port) {
-  return port >= 0 && port <= 65535;
-}
-
-std::string SdpSerialize(const JsepSessionDescription& jdesc,
-                         bool unified_plan_sdp) {
-  const cricket::SessionDescription* desc = jdesc.description();
-  if (!desc) {
-    return "";
-  }
-
-  std::string message;
-
-  // Session Description.
-  AddLine(kSessionVersion, &message);
-  // Session Origin
-  // RFC 4566
-  // o=<username> <sess-id> <sess-version> <nettype> <addrtype>
-  // <unicast-address>
-  std::ostringstream os;
-  InitLine(kLineTypeOrigin, kSessionOriginUsername, &os);
-  const std::string& session_id = jdesc.session_id().empty() ?
-      kSessionOriginSessionId : jdesc.session_id();
-  const std::string& session_version = jdesc.session_version().empty() ?
-      kSessionOriginSessionVersion : jdesc.session_version();
-  os << " " << session_id << " " << session_version << " "
-     << kSessionOriginNettype << " " << kSessionOriginAddrtype << " "
-     << kSessionOriginAddress;
-  AddLine(os.str(), &message);
-  AddLine(kSessionName, &message);
-
-  // Time Description.
-  AddLine(kTimeDescription, &message);
-
-  // Group
-  if (desc->HasGroup(cricket::GROUP_TYPE_BUNDLE)) {
-    std::string group_line = kAttrGroup;
-    const cricket::ContentGroup* group =
-        desc->GetGroupByName(cricket::GROUP_TYPE_BUNDLE);
-    RTC_DCHECK(group != NULL);
-    const cricket::ContentNames& content_names = group->content_names();
-    for (cricket::ContentNames::const_iterator it = content_names.begin();
-         it != content_names.end(); ++it) {
-      group_line.append(" ");
-      group_line.append(*it);
-    }
-    AddLine(group_line, &message);
-  }
-
-  // MediaStream semantics
-  InitAttrLine(kAttributeMsidSemantics, &os);
-  os << kSdpDelimiterColon << " " << kMediaStreamSemantic;
-
-  std::set<std::string> media_stream_labels;
-  const ContentInfo* audio_content = GetFirstAudioContent(desc);
-  if (audio_content)
-    GetMediaStreamLabels(audio_content, &media_stream_labels);
-
-  const ContentInfo* video_content = GetFirstVideoContent(desc);
-  if (video_content)
-    GetMediaStreamLabels(video_content, &media_stream_labels);
-
-  for (std::set<std::string>::const_iterator it =
-      media_stream_labels.begin(); it != media_stream_labels.end(); ++it) {
-    os << " " << *it;
-  }
-  AddLine(os.str(), &message);
-
-  // Preserve the order of the media contents.
-  int mline_index = -1;
-  for (cricket::ContentInfos::const_iterator it = desc->contents().begin();
-       it != desc->contents().end(); ++it) {
-    const MediaContentDescription* mdesc =
-      static_cast<const MediaContentDescription*>(it->description);
-    std::vector<Candidate> candidates;
-    GetCandidatesByMindex(jdesc, ++mline_index, &candidates);
-    BuildMediaDescription(&*it, desc->GetTransportInfoByName(it->name),
-                          mdesc->type(), candidates, unified_plan_sdp,
-                          &message);
-  }
-  return message;
-}
-
-// Serializes the passed in IceCandidateInterface to a SDP string.
-// candidate - The candidate to be serialized.
-std::string SdpSerializeCandidate(const IceCandidateInterface& candidate) {
-  return SdpSerializeCandidate(candidate.candidate());
-}
-
-// Serializes a cricket Candidate.
-std::string SdpSerializeCandidate(const cricket::Candidate& candidate) {
-  std::string message;
-  std::vector<cricket::Candidate> candidates(1, candidate);
-  BuildCandidate(candidates, true, &message);
-  // From WebRTC draft section 4.8.1.1 candidate-attribute will be
-  // just candidate:<candidate> not a=candidate:<blah>CRLF
-  RTC_DCHECK(message.find("a=") == 0);
-  message.erase(0, 2);
-  RTC_DCHECK(message.find(kLineBreak) == message.size() - 2);
-  message.resize(message.size() - 2);
-  return message;
-}
-
-bool SdpDeserialize(const std::string& message,
-                    JsepSessionDescription* jdesc,
-                    SdpParseError* error) {
-  std::string session_id;
-  std::string session_version;
-  TransportDescription session_td("", "");
-  RtpHeaderExtensions session_extmaps;
-  rtc::SocketAddress session_connection_addr;
-  cricket::SessionDescription* desc = new cricket::SessionDescription();
-  std::vector<JsepIceCandidate*> candidates;
-  size_t current_pos = 0;
-
-  // Session Description
-  if (!ParseSessionDescription(message, &current_pos, &session_id,
-                               &session_version, &session_td, &session_extmaps,
-                               &session_connection_addr, desc, error)) {
-    delete desc;
-    return false;
-  }
-
-  // Media Description
-  if (!ParseMediaDescription(message, session_td, session_extmaps, &current_pos,
-                             session_connection_addr, desc, &candidates,
-                             error)) {
-    delete desc;
-    for (std::vector<JsepIceCandidate*>::const_iterator
-         it = candidates.begin(); it != candidates.end(); ++it) {
-      delete *it;
-    }
-    return false;
-  }
-
-  jdesc->Initialize(desc, session_id, session_version);
-
-  for (std::vector<JsepIceCandidate*>::const_iterator
-       it = candidates.begin(); it != candidates.end(); ++it) {
-    jdesc->AddCandidate(*it);
-    delete *it;
-  }
-  return true;
-}
-
-bool SdpDeserializeCandidate(const std::string& message,
-                             JsepIceCandidate* jcandidate,
-                             SdpParseError* error) {
-  RTC_DCHECK(jcandidate != NULL);
-  Candidate candidate;
-  if (!ParseCandidate(message, &candidate, error, true)) {
-    return false;
-  }
-  jcandidate->SetCandidate(candidate);
-  return true;
-}
-
-bool SdpDeserializeCandidate(const std::string& transport_name,
-                             const std::string& message,
-                             cricket::Candidate* candidate,
-                             SdpParseError* error) {
-  RTC_DCHECK(candidate != nullptr);
-  if (!ParseCandidate(message, candidate, error, true)) {
-    return false;
-  }
-  candidate->set_transport_name(transport_name);
-  return true;
-}
-
-bool ParseCandidate(const std::string& message, Candidate* candidate,
-                    SdpParseError* error, bool is_raw) {
-  RTC_DCHECK(candidate != NULL);
-
-  // Get the first line from |message|.
-  std::string first_line = message;
-  size_t pos = 0;
-  GetLine(message, &pos, &first_line);
-
-  // Makes sure |message| contains only one line.
-  if (message.size() > first_line.size()) {
-    std::string left, right;
-    if (rtc::tokenize_first(message, kNewLine, &left, &right) &&
-        !right.empty()) {
-      return ParseFailed(message, 0, "Expect one line only", error);
-    }
-  }
-
-  // From WebRTC draft section 4.8.1.1 candidate-attribute should be
-  // candidate:<candidate> when trickled, but we still support
-  // a=candidate:<blah>CRLF for backward compatibility and for parsing a line
-  // from the SDP.
-  if (IsLineType(first_line, kLineTypeAttributes)) {
-    first_line = first_line.substr(kLinePrefixLength);
-  }
-
-  std::string attribute_candidate;
-  std::string candidate_value;
-
-  // |first_line| must be in the form of "candidate:<value>".
-  if (!rtc::tokenize_first(first_line, kSdpDelimiterColon, &attribute_candidate,
-                           &candidate_value) ||
-      attribute_candidate != kAttributeCandidate) {
-    if (is_raw) {
-      std::ostringstream description;
-      description << "Expect line: " << kAttributeCandidate
-                  << ":" << "<candidate-str>";
-      return ParseFailed(first_line, 0, description.str(), error);
-    } else {
-      return ParseFailedExpectLine(first_line, 0, kLineTypeAttributes,
-                                   kAttributeCandidate, error);
-    }
-  }
-
-  std::vector<std::string> fields;
-  rtc::split(candidate_value, kSdpDelimiterSpace, &fields);
-
-  // RFC 5245
-  // a=candidate:<foundation> <component-id> <transport> <priority>
-  // <connection-address> <port> typ <candidate-types>
-  // [raddr <connection-address>] [rport <port>]
-  // *(SP extension-att-name SP extension-att-value)
-  const size_t expected_min_fields = 8;
-  if (fields.size() < expected_min_fields ||
-      (fields[6] != kAttributeCandidateTyp)) {
-    return ParseFailedExpectMinFieldNum(first_line, expected_min_fields, error);
-  }
-  const std::string& foundation = fields[0];
-
-  int component_id = 0;
-  if (!GetValueFromString(first_line, fields[1], &component_id, error)) {
-    return false;
-  }
-  const std::string& transport = fields[2];
-  uint32_t priority = 0;
-  if (!GetValueFromString(first_line, fields[3], &priority, error)) {
-    return false;
-  }
-  const std::string& connection_address = fields[4];
-  int port = 0;
-  if (!GetValueFromString(first_line, fields[5], &port, error)) {
-    return false;
-  }
-  if (!IsValidPort(port)) {
-    return ParseFailed(first_line, "Invalid port number.", error);
-  }
-  SocketAddress address(connection_address, port);
-
-  cricket::ProtocolType protocol;
-  if (!StringToProto(transport.c_str(), &protocol)) {
-    return ParseFailed(first_line, "Unsupported transport type.", error);
-  }
-  switch (protocol) {
-    case cricket::PROTO_UDP:
-    case cricket::PROTO_TCP:
-    case cricket::PROTO_SSLTCP:
-      // Supported protocol.
-      break;
-    default:
-      return ParseFailed(first_line, "Unsupported transport type.", error);
-  }
-
-  std::string candidate_type;
-  const std::string& type = fields[7];
-  if (type == kCandidateHost) {
-    candidate_type = cricket::LOCAL_PORT_TYPE;
-  } else if (type == kCandidateSrflx) {
-    candidate_type = cricket::STUN_PORT_TYPE;
-  } else if (type == kCandidateRelay) {
-    candidate_type = cricket::RELAY_PORT_TYPE;
-  } else if (type == kCandidatePrflx) {
-    candidate_type = cricket::PRFLX_PORT_TYPE;
-  } else {
-    return ParseFailed(first_line, "Unsupported candidate type.", error);
-  }
-
-  size_t current_position = expected_min_fields;
-  SocketAddress related_address;
-  // The 2 optional fields for related address
-  // [raddr <connection-address>] [rport <port>]
-  if (fields.size() >= (current_position + 2) &&
-      fields[current_position] == kAttributeCandidateRaddr) {
-    related_address.SetIP(fields[++current_position]);
-    ++current_position;
-  }
-  if (fields.size() >= (current_position + 2) &&
-      fields[current_position] == kAttributeCandidateRport) {
-    int port = 0;
-    if (!GetValueFromString(
-        first_line, fields[++current_position], &port, error)) {
-      return false;
-    }
-    if (!IsValidPort(port)) {
-      return ParseFailed(first_line, "Invalid port number.", error);
-    }
-    related_address.SetPort(port);
-    ++current_position;
-  }
-
-  // If this is a TCP candidate, it has additional extension as defined in
-  // RFC 6544.
-  std::string tcptype;
-  if (fields.size() >= (current_position + 2) &&
-      fields[current_position] == kTcpCandidateType) {
-    tcptype = fields[++current_position];
-    ++current_position;
-
-    if (tcptype != cricket::TCPTYPE_ACTIVE_STR &&
-        tcptype != cricket::TCPTYPE_PASSIVE_STR &&
-        tcptype != cricket::TCPTYPE_SIMOPEN_STR) {
-      return ParseFailed(first_line, "Invalid TCP candidate type.", error);
-    }
-
-    if (protocol != cricket::PROTO_TCP) {
-      return ParseFailed(first_line, "Invalid non-TCP candidate", error);
-    }
-  }
-
-  // Extension
-  // Though non-standard, we support the ICE ufrag and pwd being signaled on
-  // the candidate to avoid issues with confusing which generation a candidate
-  // belongs to when trickling multiple generations at the same time.
-  std::string username;
-  std::string password;
-  uint32_t generation = 0;
-  uint16_t network_id = 0;
-  uint16_t network_cost = 0;
-  for (size_t i = current_position; i + 1 < fields.size(); ++i) {
-    // RFC 5245
-    // *(SP extension-att-name SP extension-att-value)
-    if (fields[i] == kAttributeCandidateGeneration) {
-      if (!GetValueFromString(first_line, fields[++i], &generation, error)) {
-        return false;
-      }
-    } else if (fields[i] == kAttributeCandidateUfrag) {
-      username = fields[++i];
-    } else if (fields[i] == kAttributeCandidatePwd) {
-      password = fields[++i];
-    } else if (fields[i] == kAttributeCandidateNetworkId) {
-      if (!GetValueFromString(first_line, fields[++i], &network_id, error)) {
-        return false;
-      }
-    } else if (fields[i] == kAttributeCandidateNetworkCost) {
-      if (!GetValueFromString(first_line, fields[++i], &network_cost, error)) {
-        return false;
-      }
-      network_cost = std::min(network_cost, rtc::kNetworkCostMax);
-    } else {
-      // Skip the unknown extension.
-      ++i;
-    }
-  }
-
-  *candidate = Candidate(component_id, cricket::ProtoToString(protocol),
-                         address, priority, username, password, candidate_type,
-                         generation, foundation, network_id, network_cost);
-  candidate->set_related_address(related_address);
-  candidate->set_tcptype(tcptype);
-  return true;
-}
-
-bool ParseIceOptions(const std::string& line,
-                     std::vector<std::string>* transport_options,
-                     SdpParseError* error) {
-  std::string ice_options;
-  if (!GetValue(line, kAttributeIceOption, &ice_options, error)) {
-    return false;
-  }
-  std::vector<std::string> fields;
-  rtc::split(ice_options, kSdpDelimiterSpace, &fields);
-  for (size_t i = 0; i < fields.size(); ++i) {
-    transport_options->push_back(fields[i]);
-  }
-  return true;
-}
-
-bool ParseSctpPort(const std::string& line,
-                   int* sctp_port,
-                   SdpParseError* error) {
-  // draft-ietf-mmusic-sctp-sdp-07
-  // a=sctp-port
-  std::vector<std::string> fields;
-  const size_t expected_min_fields = 2;
-  rtc::split(line.substr(kLinePrefixLength), kSdpDelimiterColon, &fields);
-  if (fields.size() < expected_min_fields) {
-    fields.resize(0);
-    rtc::split(line.substr(kLinePrefixLength), kSdpDelimiterSpace, &fields);
-  }
-  if (fields.size() < expected_min_fields) {
-    return ParseFailedExpectMinFieldNum(line, expected_min_fields, error);
-  }
-  if (!rtc::FromString(fields[1], sctp_port)) {
-    return ParseFailed(line, "Invalid sctp port value.", error);
-  }
-  return true;
-}
-
-bool ParseExtmap(const std::string& line,
-                 RtpExtension* extmap,
-                 SdpParseError* error) {
-  // RFC 5285
-  // a=extmap:<value>["/"<direction>] <URI> <extensionattributes>
-  std::vector<std::string> fields;
-  rtc::split(line.substr(kLinePrefixLength),
-                   kSdpDelimiterSpace, &fields);
-  const size_t expected_min_fields = 2;
-  if (fields.size() < expected_min_fields) {
-    return ParseFailedExpectMinFieldNum(line, expected_min_fields, error);
-  }
-  std::string uri = fields[1];
-
-  std::string value_direction;
-  if (!GetValue(fields[0], kAttributeExtmap, &value_direction, error)) {
-    return false;
-  }
-  std::vector<std::string> sub_fields;
-  rtc::split(value_direction, kSdpDelimiterSlash, &sub_fields);
-  int value = 0;
-  if (!GetValueFromString(line, sub_fields[0], &value, error)) {
-    return false;
-  }
-
-  bool encrypted = false;
-  if (uri == RtpExtension::kEncryptHeaderExtensionsUri) {
-    // RFC 6904
-    // a=extmap:<value["/"<direction>] urn:ietf:params:rtp-hdrext:encrypt <URI> <extensionattributes>
-    const size_t expected_min_fields_encrypted = expected_min_fields + 1;
-    if (fields.size() < expected_min_fields_encrypted) {
-      return ParseFailedExpectMinFieldNum(line, expected_min_fields_encrypted,
-          error);
-    }
-
-    encrypted = true;
-    uri = fields[2];
-    if (uri == RtpExtension::kEncryptHeaderExtensionsUri) {
-      return ParseFailed(line, "Recursive encrypted header.", error);
-    }
-  }
-
-  *extmap = RtpExtension(uri, value, encrypted);
-  return true;
-}
-
-void BuildMediaDescription(const ContentInfo* content_info,
-                           const TransportInfo* transport_info,
-                           const MediaType media_type,
-                           const std::vector<Candidate>& candidates,
-                           bool unified_plan_sdp,
-                           std::string* message) {
-  RTC_DCHECK(message != NULL);
-  if (content_info == NULL || message == NULL) {
-    return;
-  }
-  // TODO: Rethink if we should use sprintfn instead of stringstream.
-  // According to the style guide, streams should only be used for logging.
-  // http://google-styleguide.googlecode.com/svn/
-  // trunk/cppguide.xml?showone=Streams#Streams
-  std::ostringstream os;
-  const MediaContentDescription* media_desc =
-      static_cast<const MediaContentDescription*>(
-          content_info->description);
-  RTC_DCHECK(media_desc != NULL);
-
-  int sctp_port = cricket::kSctpDefaultPort;
-
-  // RFC 4566
-  // m=<media> <port> <proto> <fmt>
-  // fmt is a list of payload type numbers that MAY be used in the session.
-  const char* type = NULL;
-  if (media_type == cricket::MEDIA_TYPE_AUDIO)
-    type = kMediaTypeAudio;
-  else if (media_type == cricket::MEDIA_TYPE_VIDEO)
-    type = kMediaTypeVideo;
-  else if (media_type == cricket::MEDIA_TYPE_DATA)
-    type = kMediaTypeData;
-  else
-    RTC_NOTREACHED();
-
-  std::string fmt;
-  if (media_type == cricket::MEDIA_TYPE_VIDEO) {
-    const VideoContentDescription* video_desc =
-        static_cast<const VideoContentDescription*>(media_desc);
-    for (std::vector<cricket::VideoCodec>::const_iterator it =
-             video_desc->codecs().begin();
-         it != video_desc->codecs().end(); ++it) {
-      fmt.append(" ");
-      fmt.append(rtc::ToString<int>(it->id));
-    }
-  } else if (media_type == cricket::MEDIA_TYPE_AUDIO) {
-    const AudioContentDescription* audio_desc =
-        static_cast<const AudioContentDescription*>(media_desc);
-    for (std::vector<cricket::AudioCodec>::const_iterator it =
-             audio_desc->codecs().begin();
-         it != audio_desc->codecs().end(); ++it) {
-      fmt.append(" ");
-      fmt.append(rtc::ToString<int>(it->id));
-    }
-  } else if (media_type == cricket::MEDIA_TYPE_DATA) {
-    const DataContentDescription* data_desc =
-          static_cast<const DataContentDescription*>(media_desc);
-    if (IsDtlsSctp(media_desc->protocol())) {
-      fmt.append(" ");
-
-      if (data_desc->use_sctpmap()) {
-        for (std::vector<cricket::DataCodec>::const_iterator it =
-                 data_desc->codecs().begin();
-             it != data_desc->codecs().end(); ++it) {
-          if (cricket::CodecNamesEq(it->name,
-                                    cricket::kGoogleSctpDataCodecName) &&
-              it->GetParam(cricket::kCodecParamPort, &sctp_port)) {
-            break;
-          }
-        }
-
-        fmt.append(rtc::ToString<int>(sctp_port));
-      } else {
-        fmt.append(kDefaultSctpmapProtocol);
-      }
-    } else {
-      for (std::vector<cricket::DataCodec>::const_iterator it =
-           data_desc->codecs().begin();
-           it != data_desc->codecs().end(); ++it) {
-        fmt.append(" ");
-        fmt.append(rtc::ToString<int>(it->id));
-      }
-    }
-  }
-  // The fmt must never be empty. If no codecs are found, set the fmt attribute
-  // to 0.
-  if (fmt.empty()) {
-    fmt = " 0";
-  }
-
-  // The port number in the m line will be updated later when associated with
-  // the candidates.
-  //
-  // A port value of 0 indicates that the m= section is rejected.
-  // RFC 3264
-  // To reject an offered stream, the port number in the corresponding stream in
-  // the answer MUST be set to zero.
-  //
-  // However, the BUNDLE draft adds a new meaning to port zero, when used along
-  // with a=bundle-only.
-  std::string port = kDummyPort;
-  if (content_info->rejected || content_info->bundle_only) {
-    port = kMediaPortRejected;
-  } else if (!media_desc->connection_address().IsNil()) {
-    port = rtc::ToString(media_desc->connection_address().port());
-  }
-
-  rtc::SSLFingerprint* fp = (transport_info) ?
-      transport_info->description.identity_fingerprint.get() : NULL;
-
-  // Add the m and c lines.
-  InitLine(kLineTypeMedia, type, &os);
-  os << " " << port << " " << media_desc->protocol() << fmt;
-  AddLine(os.str(), message);
-
-  InitLine(kLineTypeConnection, kConnectionNettype, &os);
-  if (media_desc->connection_address().IsNil()) {
-    os << " " << kConnectionIpv4Addrtype << " " << kDummyAddress;
-  } else if (media_desc->connection_address().family() == AF_INET) {
-    os << " " << kConnectionIpv4Addrtype << " "
-       << media_desc->connection_address().ipaddr().ToString();
-  } else {
-    os << " " << kConnectionIpv6Addrtype << " "
-       << media_desc->connection_address().ipaddr().ToString();
-  }
-  AddLine(os.str(), message);
-
-  // RFC 4566
-  // b=AS:<bandwidth>
-  if (media_desc->bandwidth() >= 1000) {
-    InitLine(kLineTypeSessionBandwidth, kApplicationSpecificMaximum, &os);
-    os << kSdpDelimiterColon << (media_desc->bandwidth() / 1000);
-    AddLine(os.str(), message);
-  }
-
-  // Add the a=bundle-only line.
-  if (content_info->bundle_only) {
-    InitAttrLine(kAttributeBundleOnly, &os);
-    AddLine(os.str(), message);
-  }
-
-  // Add the a=rtcp line.
-  if (IsRtp(media_desc->protocol())) {
-    std::string rtcp_line = GetRtcpLine(candidates);
-    if (!rtcp_line.empty()) {
-      AddLine(rtcp_line, message);
-    }
-  }
-
-  // Build the a=candidate lines. We don't include ufrag and pwd in the
-  // candidates in the SDP to avoid redundancy.
-  BuildCandidate(candidates, false, message);
-
-  // Use the transport_info to build the media level ice-ufrag and ice-pwd.
-  if (transport_info) {
-    // RFC 5245
-    // ice-pwd-att           = "ice-pwd" ":" password
-    // ice-ufrag-att         = "ice-ufrag" ":" ufrag
-    // ice-ufrag
-    if (!transport_info->description.ice_ufrag.empty()) {
-      InitAttrLine(kAttributeIceUfrag, &os);
-      os << kSdpDelimiterColon << transport_info->description.ice_ufrag;
-      AddLine(os.str(), message);
-    }
-    // ice-pwd
-    if (!transport_info->description.ice_pwd.empty()) {
-      InitAttrLine(kAttributeIcePwd, &os);
-      os << kSdpDelimiterColon << transport_info->description.ice_pwd;
-      AddLine(os.str(), message);
-    }
-
-    // draft-petithuguenin-mmusic-ice-attributes-level-03
-    BuildIceOptions(transport_info->description.transport_options, message);
-
-    // RFC 4572
-    // fingerprint-attribute  =
-    //   "fingerprint" ":" hash-func SP fingerprint
-    if (fp) {
-      // Insert the fingerprint attribute.
-      InitAttrLine(kAttributeFingerprint, &os);
-      os << kSdpDelimiterColon
-         << fp->algorithm << kSdpDelimiterSpace
-         << fp->GetRfc4572Fingerprint();
-      AddLine(os.str(), message);
-
-      // Inserting setup attribute.
-      if (transport_info->description.connection_role !=
-              cricket::CONNECTIONROLE_NONE) {
-        // Making sure we are not using "passive" mode.
-        cricket::ConnectionRole role =
-            transport_info->description.connection_role;
-        std::string dtls_role_str;
-        const bool success =
-            cricket::ConnectionRoleToString(role, &dtls_role_str);
-        RTC_DCHECK(success);
-        InitAttrLine(kAttributeSetup, &os);
-        os << kSdpDelimiterColon << dtls_role_str;
-        AddLine(os.str(), message);
-      }
-    }
-  }
-
-  // RFC 3388
-  // mid-attribute      = "a=mid:" identification-tag
-  // identification-tag = token
-  // Use the content name as the mid identification-tag.
-  InitAttrLine(kAttributeMid, &os);
-  os << kSdpDelimiterColon << content_info->name;
-  AddLine(os.str(), message);
-
-  if (IsDtlsSctp(media_desc->protocol())) {
-    const DataContentDescription* data_desc =
-        static_cast<const DataContentDescription*>(media_desc);
-    bool use_sctpmap = data_desc->use_sctpmap();
-    BuildSctpContentAttributes(message, sctp_port, use_sctpmap);
-  } else if (IsRtp(media_desc->protocol())) {
-    BuildRtpContentAttributes(media_desc, media_type, unified_plan_sdp,
-                              message);
-  }
-}
-
-void BuildSctpContentAttributes(std::string* message,
-                                int sctp_port,
-                                bool use_sctpmap) {
-  std::ostringstream os;
-  if (use_sctpmap) {
-    // draft-ietf-mmusic-sctp-sdp-04
-    // a=sctpmap:sctpmap-number  protocol  [streams]
-    InitAttrLine(kAttributeSctpmap, &os);
-    os << kSdpDelimiterColon << sctp_port << kSdpDelimiterSpace
-       << kDefaultSctpmapProtocol << kSdpDelimiterSpace
-       << cricket::kMaxSctpStreams;
-  } else {
-    // draft-ietf-mmusic-sctp-sdp-23
-    // a=sctp-port:<port>
-    InitAttrLine(kAttributeSctpPort, &os);
-    os << kSdpDelimiterColon << sctp_port;
-    // TODO(zstein): emit max-message-size here
-  }
-  AddLine(os.str(), message);
-}
-
-// If unified_plan_sdp is true, will use "a=msid".
-void BuildRtpContentAttributes(const MediaContentDescription* media_desc,
-                               const MediaType media_type,
-                               bool unified_plan_sdp,
-                               std::string* message) {
-  std::ostringstream os;
-  // RFC 5285
-  // a=extmap:<value>["/"<direction>] <URI> <extensionattributes>
-  // The definitions MUST be either all session level or all media level. This
-  // implementation uses all media level.
-  for (size_t i = 0; i < media_desc->rtp_header_extensions().size(); ++i) {
-    const RtpExtension& extension = media_desc->rtp_header_extensions()[i];
-    InitAttrLine(kAttributeExtmap, &os);
-    os << kSdpDelimiterColon << extension.id;
-    if (extension.encrypt) {
-      os << kSdpDelimiterSpace << RtpExtension::kEncryptHeaderExtensionsUri;
-    }
-    os << kSdpDelimiterSpace << extension.uri;
-    AddLine(os.str(), message);
-  }
-
-  // RFC 3264
-  // a=sendrecv || a=sendonly || a=sendrecv || a=inactive
-  switch (media_desc->direction()) {
-    case cricket::MD_INACTIVE:
-      InitAttrLine(kAttributeInactive, &os);
-      break;
-    case cricket::MD_SENDONLY:
-      InitAttrLine(kAttributeSendOnly, &os);
-      break;
-    case cricket::MD_RECVONLY:
-      InitAttrLine(kAttributeRecvOnly, &os);
-      break;
-    case cricket::MD_SENDRECV:
-    default:
-      InitAttrLine(kAttributeSendRecv, &os);
-      break;
-  }
-  AddLine(os.str(), message);
-
-  // draft-ietf-mmusic-msid-11
-  // a=msid:<stream id> <track id>
-  if (unified_plan_sdp && !media_desc->streams().empty()) {
-    if (media_desc->streams().size() > 1u) {
-      LOG(LS_WARNING) << "Trying to serialize unified plan SDP with more than "
-                      << "one track in a media section. Omitting 'a=msid'.";
-    } else {
-      auto track = media_desc->streams().begin();
-      const std::string& stream_id = track->sync_label;
-      InitAttrLine(kAttributeMsid, &os);
-      os << kSdpDelimiterColon << stream_id << kSdpDelimiterSpace << track->id;
-      AddLine(os.str(), message);
-    }
-  }
-
-  // RFC 5761
-  // a=rtcp-mux
-  if (media_desc->rtcp_mux()) {
-    InitAttrLine(kAttributeRtcpMux, &os);
-    AddLine(os.str(), message);
-  }
-
-  // RFC 5506
-  // a=rtcp-rsize
-  if (media_desc->rtcp_reduced_size()) {
-    InitAttrLine(kAttributeRtcpReducedSize, &os);
-    AddLine(os.str(), message);
-  }
-
-  // RFC 4568
-  // a=crypto:<tag> <crypto-suite> <key-params> [<session-params>]
-  for (std::vector<CryptoParams>::const_iterator it =
-           media_desc->cryptos().begin();
-       it != media_desc->cryptos().end(); ++it) {
-    InitAttrLine(kAttributeCrypto, &os);
-    os << kSdpDelimiterColon << it->tag << " " << it->cipher_suite << " "
-       << it->key_params;
-    if (!it->session_params.empty()) {
-      os << " " << it->session_params;
-    }
-    AddLine(os.str(), message);
-  }
-
-  // RFC 4566
-  // a=rtpmap:<payload type> <encoding name>/<clock rate>
-  // [/<encodingparameters>]
-  BuildRtpMap(media_desc, media_type, message);
-
-  for (StreamParamsVec::const_iterator track = media_desc->streams().begin();
-       track != media_desc->streams().end(); ++track) {
-    // Require that the track belongs to a media stream,
-    // ie the sync_label is set. This extra check is necessary since the
-    // MediaContentDescription always contains a streamparam with an ssrc even
-    // if no track or media stream have been created.
-    if (track->sync_label.empty()) continue;
-
-    // Build the ssrc-group lines.
-    for (size_t i = 0; i < track->ssrc_groups.size(); ++i) {
-      // RFC 5576
-      // a=ssrc-group:<semantics> <ssrc-id> ...
-      if (track->ssrc_groups[i].ssrcs.empty()) {
-        continue;
-      }
-      InitAttrLine(kAttributeSsrcGroup, &os);
-      os << kSdpDelimiterColon << track->ssrc_groups[i].semantics;
-      std::vector<uint32_t>::const_iterator ssrc =
-          track->ssrc_groups[i].ssrcs.begin();
-      for (; ssrc != track->ssrc_groups[i].ssrcs.end(); ++ssrc) {
-        os << kSdpDelimiterSpace << rtc::ToString<uint32_t>(*ssrc);
-      }
-      AddLine(os.str(), message);
-    }
-    // Build the ssrc lines for each ssrc.
-    for (size_t i = 0; i < track->ssrcs.size(); ++i) {
-      uint32_t ssrc = track->ssrcs[i];
-      // RFC 5576
-      // a=ssrc:<ssrc-id> cname:<value>
-      AddSsrcLine(ssrc, kSsrcAttributeCname,
-                  track->cname, message);
-
-      // draft-alvestrand-mmusic-msid-00
-      // a=ssrc:<ssrc-id> msid:identifier [appdata]
-      // The appdata consists of the "id" attribute of a MediaStreamTrack,
-      // which corresponds to the "id" attribute of StreamParams.
-      const std::string& stream_id = track->sync_label;
-      InitAttrLine(kAttributeSsrc, &os);
-      os << kSdpDelimiterColon << ssrc << kSdpDelimiterSpace
-         << kSsrcAttributeMsid << kSdpDelimiterColon << stream_id
-         << kSdpDelimiterSpace << track->id;
-      AddLine(os.str(), message);
-
-      // TODO(ronghuawu): Remove below code which is for backward
-      // compatibility.
-      // draft-alvestrand-rtcweb-mid-01
-      // a=ssrc:<ssrc-id> mslabel:<value>
-      // The label isn't yet defined.
-      // a=ssrc:<ssrc-id> label:<value>
-      AddSsrcLine(ssrc, kSsrcAttributeMslabel, track->sync_label, message);
-      AddSsrcLine(ssrc, kSSrcAttributeLabel, track->id, message);
-    }
-  }
-}
-
-void WriteFmtpHeader(int payload_type, std::ostringstream* os) {
-  // fmtp header: a=fmtp:|payload_type| <parameters>
-  // Add a=fmtp
-  InitAttrLine(kAttributeFmtp, os);
-  // Add :|payload_type|
-  *os << kSdpDelimiterColon << payload_type;
-}
-
-void WriteRtcpFbHeader(int payload_type, std::ostringstream* os) {
-  // rtcp-fb header: a=rtcp-fb:|payload_type|
-  // <parameters>/<ccm <ccm_parameters>>
-  // Add a=rtcp-fb
-  InitAttrLine(kAttributeRtcpFb, os);
-  // Add :
-  *os << kSdpDelimiterColon;
-  if (payload_type == kWildcardPayloadType) {
-    *os << "*";
-  } else {
-    *os << payload_type;
-  }
-}
-
-void WriteFmtpParameter(const std::string& parameter_name,
-                        const std::string& parameter_value,
-                        std::ostringstream* os) {
-  // fmtp parameters: |parameter_name|=|parameter_value|
-  *os << parameter_name << kSdpDelimiterEqual << parameter_value;
-}
-
-void WriteFmtpParameters(const cricket::CodecParameterMap& parameters,
-                         std::ostringstream* os) {
-  for (cricket::CodecParameterMap::const_iterator fmtp = parameters.begin();
-       fmtp != parameters.end(); ++fmtp) {
-    // Parameters are a semicolon-separated list, no spaces.
-    // The list is separated from the header by a space.
-    if (fmtp == parameters.begin()) {
-      *os << kSdpDelimiterSpace;
-    } else {
-      *os << kSdpDelimiterSemicolon;
-    }
-    WriteFmtpParameter(fmtp->first, fmtp->second, os);
-  }
-}
-
-bool IsFmtpParam(const std::string& name) {
-  // RFC 4855, section 3 specifies the mapping of media format parameters to SDP
-  // parameters. Only ptime, maxptime, channels and rate are placed outside of
-  // the fmtp line. In WebRTC, channels and rate are already handled separately
-  // and thus not included in the CodecParameterMap.
-  return name != kCodecParamPTime && name != kCodecParamMaxPTime;
-}
-
-// Retreives fmtp parameters from |params|, which may contain other parameters
-// as well, and puts them in |fmtp_parameters|.
-void GetFmtpParams(const cricket::CodecParameterMap& params,
-                   cricket::CodecParameterMap* fmtp_parameters) {
-  for (cricket::CodecParameterMap::const_iterator iter = params.begin();
-       iter != params.end(); ++iter) {
-    if (IsFmtpParam(iter->first)) {
-      (*fmtp_parameters)[iter->first] = iter->second;
-    }
-  }
-}
-
-template <class T>
-void AddFmtpLine(const T& codec, std::string* message) {
-  cricket::CodecParameterMap fmtp_parameters;
-  GetFmtpParams(codec.params, &fmtp_parameters);
-  if (fmtp_parameters.empty()) {
-    // No need to add an fmtp if it will have no (optional) parameters.
-    return;
-  }
-  std::ostringstream os;
-  WriteFmtpHeader(codec.id, &os);
-  WriteFmtpParameters(fmtp_parameters, &os);
-  AddLine(os.str(), message);
-  return;
-}
-
-template <class T>
-void AddRtcpFbLines(const T& codec, std::string* message) {
-  for (std::vector<cricket::FeedbackParam>::const_iterator iter =
-           codec.feedback_params.params().begin();
-       iter != codec.feedback_params.params().end(); ++iter) {
-    std::ostringstream os;
-    WriteRtcpFbHeader(codec.id, &os);
-    os << " " << iter->id();
-    if (!iter->param().empty()) {
-      os << " " << iter->param();
-    }
-    AddLine(os.str(), message);
-  }
-}
-
-bool AddSctpDataCodec(DataContentDescription* media_desc,
-                      int sctp_port) {
-  for (const auto& codec : media_desc->codecs()) {
-    if (cricket::CodecNamesEq(codec.name, cricket::kGoogleSctpDataCodecName)) {
-      return ParseFailed("",
-                         "Can't have multiple sctp port attributes.",
-                         NULL);
-    }
-  }
-  // Add the SCTP Port number as a pseudo-codec "port" parameter
-  cricket::DataCodec codec_port(cricket::kGoogleSctpDataCodecPlType,
-                                cricket::kGoogleSctpDataCodecName);
-  codec_port.SetParam(cricket::kCodecParamPort, sctp_port);
-  LOG(INFO) << "AddSctpDataCodec: Got SCTP Port Number "
-            << sctp_port;
-  media_desc->AddCodec(codec_port);
-  return true;
-}
-
-bool GetMinValue(const std::vector<int>& values, int* value) {
-  if (values.empty()) {
-    return false;
-  }
-  std::vector<int>::const_iterator found =
-      std::min_element(values.begin(), values.end());
-  *value = *found;
-  return true;
-}
-
-bool GetParameter(const std::string& name,
-                  const cricket::CodecParameterMap& params, int* value) {
-  std::map<std::string, std::string>::const_iterator found =
-      params.find(name);
-  if (found == params.end()) {
-    return false;
-  }
-  if (!rtc::FromString(found->second, value)) {
-    return false;
-  }
-  return true;
-}
-
-void BuildRtpMap(const MediaContentDescription* media_desc,
-                 const MediaType media_type,
-                 std::string* message) {
-  RTC_DCHECK(message != NULL);
-  RTC_DCHECK(media_desc != NULL);
-  std::ostringstream os;
-  if (media_type == cricket::MEDIA_TYPE_VIDEO) {
-    const VideoContentDescription* video_desc =
-        static_cast<const VideoContentDescription*>(media_desc);
-    for (std::vector<cricket::VideoCodec>::const_iterator it =
-             video_desc->codecs().begin();
-         it != video_desc->codecs().end(); ++it) {
-      // RFC 4566
-      // a=rtpmap:<payload type> <encoding name>/<clock rate>
-      // [/<encodingparameters>]
-      if (it->id != kWildcardPayloadType) {
-        InitAttrLine(kAttributeRtpmap, &os);
-        os << kSdpDelimiterColon << it->id << " " << it->name << "/"
-           << cricket::kVideoCodecClockrate;
-        AddLine(os.str(), message);
-      }
-      AddRtcpFbLines(*it, message);
-      AddFmtpLine(*it, message);
-    }
-  } else if (media_type == cricket::MEDIA_TYPE_AUDIO) {
-    const AudioContentDescription* audio_desc =
-        static_cast<const AudioContentDescription*>(media_desc);
-    std::vector<int> ptimes;
-    std::vector<int> maxptimes;
-    int max_minptime = 0;
-    for (std::vector<cricket::AudioCodec>::const_iterator it =
-             audio_desc->codecs().begin();
-         it != audio_desc->codecs().end(); ++it) {
-      RTC_DCHECK(!it->name.empty());
-      // RFC 4566
-      // a=rtpmap:<payload type> <encoding name>/<clock rate>
-      // [/<encodingparameters>]
-      InitAttrLine(kAttributeRtpmap, &os);
-      os << kSdpDelimiterColon << it->id << " ";
-      os << it->name << "/" << it->clockrate;
-      if (it->channels != 1) {
-        os << "/" << it->channels;
-      }
-      AddLine(os.str(), message);
-      AddRtcpFbLines(*it, message);
-      AddFmtpLine(*it, message);
-      int minptime = 0;
-      if (GetParameter(kCodecParamMinPTime, it->params, &minptime)) {
-        max_minptime = std::max(minptime, max_minptime);
-      }
-      int ptime;
-      if (GetParameter(kCodecParamPTime, it->params, &ptime)) {
-        ptimes.push_back(ptime);
-      }
-      int maxptime;
-      if (GetParameter(kCodecParamMaxPTime, it->params, &maxptime)) {
-        maxptimes.push_back(maxptime);
-      }
-    }
-    // Populate the maxptime attribute with the smallest maxptime of all codecs
-    // under the same m-line.
-    int min_maxptime = INT_MAX;
-    if (GetMinValue(maxptimes, &min_maxptime)) {
-      AddAttributeLine(kCodecParamMaxPTime, min_maxptime, message);
-    }
-    RTC_DCHECK(min_maxptime > max_minptime);
-    // Populate the ptime attribute with the smallest ptime or the largest
-    // minptime, whichever is the largest, for all codecs under the same m-line.
-    int ptime = INT_MAX;
-    if (GetMinValue(ptimes, &ptime)) {
-      ptime = std::min(ptime, min_maxptime);
-      ptime = std::max(ptime, max_minptime);
-      AddAttributeLine(kCodecParamPTime, ptime, message);
-    }
-  } else if (media_type == cricket::MEDIA_TYPE_DATA) {
-    const DataContentDescription* data_desc =
-        static_cast<const DataContentDescription*>(media_desc);
-    for (std::vector<cricket::DataCodec>::const_iterator it =
-         data_desc->codecs().begin();
-         it != data_desc->codecs().end(); ++it) {
-      // RFC 4566
-      // a=rtpmap:<payload type> <encoding name>/<clock rate>
-      // [/<encodingparameters>]
-      InitAttrLine(kAttributeRtpmap, &os);
-      os << kSdpDelimiterColon << it->id << " "
-         << it->name << "/" << it->clockrate;
-      AddLine(os.str(), message);
-    }
-  }
-}
-
-void BuildCandidate(const std::vector<Candidate>& candidates,
-                    bool include_ufrag,
-                    std::string* message) {
-  std::ostringstream os;
-
-  for (std::vector<Candidate>::const_iterator it = candidates.begin();
-       it != candidates.end(); ++it) {
-    // RFC 5245
-    // a=candidate:<foundation> <component-id> <transport> <priority>
-    // <connection-address> <port> typ <candidate-types>
-    // [raddr <connection-address>] [rport <port>]
-    // *(SP extension-att-name SP extension-att-value)
-    std::string type;
-    // Map the cricket candidate type to "host" / "srflx" / "prflx" / "relay"
-    if (it->type() == cricket::LOCAL_PORT_TYPE) {
-      type = kCandidateHost;
-    } else if (it->type() == cricket::STUN_PORT_TYPE) {
-      type = kCandidateSrflx;
-    } else if (it->type() == cricket::RELAY_PORT_TYPE) {
-      type = kCandidateRelay;
-    } else if (it->type() == cricket::PRFLX_PORT_TYPE) {
-      type = kCandidatePrflx;
-      // Peer reflexive candidate may be signaled for being removed.
-    } else {
-      RTC_NOTREACHED();
-      // Never write out candidates if we don't know the type.
-      continue;
-    }
-
-    InitAttrLine(kAttributeCandidate, &os);
-    os << kSdpDelimiterColon
-       << it->foundation() << " "
-       << it->component() << " "
-       << it->protocol() << " "
-       << it->priority() << " "
-       << it->address().ipaddr().ToString() << " "
-       << it->address().PortAsString() << " "
-       << kAttributeCandidateTyp << " "
-       << type << " ";
-
-    // Related address
-    if (!it->related_address().IsNil()) {
-      os << kAttributeCandidateRaddr << " "
-         << it->related_address().ipaddr().ToString() << " "
-         << kAttributeCandidateRport << " "
-         << it->related_address().PortAsString() << " ";
-    }
-
-    if (it->protocol() == cricket::TCP_PROTOCOL_NAME) {
-      os << kTcpCandidateType << " " << it->tcptype() << " ";
-    }
-
-    // Extensions
-    os << kAttributeCandidateGeneration << " " << it->generation();
-    if (include_ufrag && !it->username().empty()) {
-      os << " " << kAttributeCandidateUfrag << " " << it->username();
-    }
-    if (it->network_id() > 0) {
-      os << " " << kAttributeCandidateNetworkId << " " << it->network_id();
-    }
-    if (it->network_cost() > 0) {
-      os << " " << kAttributeCandidateNetworkCost << " " << it->network_cost();
-    }
-
-    AddLine(os.str(), message);
-  }
-}
-
-void BuildIceOptions(const std::vector<std::string>& transport_options,
-                     std::string* message) {
-  if (!transport_options.empty()) {
-    std::ostringstream os;
-    InitAttrLine(kAttributeIceOption, &os);
-    os << kSdpDelimiterColon << transport_options[0];
-    for (size_t i = 1; i < transport_options.size(); ++i) {
-      os << kSdpDelimiterSpace << transport_options[i];
-    }
-    AddLine(os.str(), message);
-  }
-}
-
-bool IsRtp(const std::string& protocol) {
-  return protocol.empty() ||
-      (protocol.find(cricket::kMediaProtocolRtpPrefix) != std::string::npos);
-}
-
-bool IsDtlsSctp(const std::string& protocol) {
-  // This intentionally excludes "SCTP" and "SCTP/DTLS".
-  return protocol.find(cricket::kMediaProtocolDtlsSctp) != std::string::npos;
-}
-
-bool ParseConnectionData(const std::string& line,
-                         rtc::SocketAddress* addr,
-                         SdpParseError* error) {
-  // Parse the line from left to right.
-  std::string token;
-  std::string rightpart;
-  // RFC 4566
-  // c=<nettype> <addrtype> <connection-address>
-  // Skip the "c="
-  if (!rtc::tokenize_first(line, kSdpDelimiterEqual, &token, &rightpart)) {
-    return ParseFailed(line, "Failed to parse the network type.", error);
-  }
-
-  // Extract and verify the <nettype>
-  if (!rtc::tokenize_first(rightpart, kSdpDelimiterSpace, &token, &rightpart) ||
-      token != kConnectionNettype) {
-    return ParseFailed(line,
-                       "Failed to parse the connection data. The network type "
-                       "is not currently supported.",
-                       error);
-  }
-
-  // Extract the "<addrtype>" and "<connection-address>".
-  if (!rtc::tokenize_first(rightpart, kSdpDelimiterSpace, &token, &rightpart)) {
-    return ParseFailed(line, "Failed to parse the address type.", error);
-  }
-
-  // The rightpart part should be the IP address without the slash which is used
-  // for multicast.
-  if (rightpart.find('/') != std::string::npos) {
-    return ParseFailed(line,
-                       "Failed to parse the connection data. Multicast is not "
-                       "currently supported.",
-                       error);
-  }
-  addr->SetIP(rightpart);
-
-  // Verify that the addrtype matches the type of the parsed address.
-  if ((addr->family() == AF_INET && token != "IP4") ||
-      (addr->family() == AF_INET6 && token != "IP6")) {
-    addr->Clear();
-    return ParseFailed(
-        line,
-        "Failed to parse the connection data. The address type is mismatching.",
-        error);
-  }
-  return true;
-}
-
-bool ParseSessionDescription(const std::string& message,
-                             size_t* pos,
-                             std::string* session_id,
-                             std::string* session_version,
-                             TransportDescription* session_td,
-                             RtpHeaderExtensions* session_extmaps,
-                             rtc::SocketAddress* connection_addr,
-                             cricket::SessionDescription* desc,
-                             SdpParseError* error) {
-  std::string line;
-
-  desc->set_msid_supported(false);
-
-  // RFC 4566
-  // v=  (protocol version)
-  if (!GetLineWithType(message, pos, &line, kLineTypeVersion)) {
-    return ParseFailedExpectLine(message, *pos, kLineTypeVersion,
-                                 std::string(), error);
-  }
-  // RFC 4566
-  // o=<username> <sess-id> <sess-version> <nettype> <addrtype>
-  // <unicast-address>
-  if (!GetLineWithType(message, pos, &line, kLineTypeOrigin)) {
-    return ParseFailedExpectLine(message, *pos, kLineTypeOrigin,
-                                 std::string(), error);
-  }
-  std::vector<std::string> fields;
-  rtc::split(line.substr(kLinePrefixLength),
-                   kSdpDelimiterSpace, &fields);
-  const size_t expected_fields = 6;
-  if (fields.size() != expected_fields) {
-    return ParseFailedExpectFieldNum(line, expected_fields, error);
-  }
-  *session_id = fields[1];
-  *session_version = fields[2];
-
-  // RFC 4566
-  // s=  (session name)
-  if (!GetLineWithType(message, pos, &line, kLineTypeSessionName)) {
-    return ParseFailedExpectLine(message, *pos, kLineTypeSessionName,
-                                 std::string(), error);
-  }
-
-  // Optional lines
-  // Those are the optional lines, so shouldn't return false if not present.
-  // RFC 4566
-  // i=* (session information)
-  GetLineWithType(message, pos, &line, kLineTypeSessionInfo);
-
-  // RFC 4566
-  // u=* (URI of description)
-  GetLineWithType(message, pos, &line, kLineTypeSessionUri);
-
-  // RFC 4566
-  // e=* (email address)
-  GetLineWithType(message, pos, &line, kLineTypeSessionEmail);
-
-  // RFC 4566
-  // p=* (phone number)
-  GetLineWithType(message, pos, &line, kLineTypeSessionPhone);
-
-  // RFC 4566
-  // c=* (connection information -- not required if included in
-  //      all media)
-  if (GetLineWithType(message, pos, &line, kLineTypeConnection)) {
-    if (!ParseConnectionData(line, connection_addr, error)) {
-      return false;
-    }
-  }
-
-  // RFC 4566
-  // b=* (zero or more bandwidth information lines)
-  while (GetLineWithType(message, pos, &line, kLineTypeSessionBandwidth)) {
-    // By pass zero or more b lines.
-  }
-
-  // RFC 4566
-  // One or more time descriptions ("t=" and "r=" lines; see below)
-  // t=  (time the session is active)
-  // r=* (zero or more repeat times)
-  // Ensure there's at least one time description
-  if (!GetLineWithType(message, pos, &line, kLineTypeTiming)) {
-    return ParseFailedExpectLine(message, *pos, kLineTypeTiming, std::string(),
-                                 error);
-  }
-
-  while (GetLineWithType(message, pos, &line, kLineTypeRepeatTimes)) {
-    // By pass zero or more r lines.
-  }
-
-  // Go through the rest of the time descriptions
-  while (GetLineWithType(message, pos, &line, kLineTypeTiming)) {
-    while (GetLineWithType(message, pos, &line, kLineTypeRepeatTimes)) {
-      // By pass zero or more r lines.
-    }
-  }
-
-  // RFC 4566
-  // z=* (time zone adjustments)
-  GetLineWithType(message, pos, &line, kLineTypeTimeZone);
-
-  // RFC 4566
-  // k=* (encryption key)
-  GetLineWithType(message, pos, &line, kLineTypeEncryptionKey);
-
-  // RFC 4566
-  // a=* (zero or more session attribute lines)
-  while (GetLineWithType(message, pos, &line, kLineTypeAttributes)) {
-    if (HasAttribute(line, kAttributeGroup)) {
-      if (!ParseGroupAttribute(line, desc, error)) {
-        return false;
-      }
-    } else if (HasAttribute(line, kAttributeIceUfrag)) {
-      if (!GetValue(line, kAttributeIceUfrag,
-                    &(session_td->ice_ufrag), error)) {
-        return false;
-      }
-    } else if (HasAttribute(line, kAttributeIcePwd)) {
-      if (!GetValue(line, kAttributeIcePwd, &(session_td->ice_pwd), error)) {
-        return false;
-      }
-    } else if (HasAttribute(line, kAttributeIceLite)) {
-      session_td->ice_mode = cricket::ICEMODE_LITE;
-    } else if (HasAttribute(line, kAttributeIceOption)) {
-      if (!ParseIceOptions(line, &(session_td->transport_options), error)) {
-        return false;
-      }
-    } else if (HasAttribute(line, kAttributeFingerprint)) {
-      if (session_td->identity_fingerprint.get()) {
-        return ParseFailed(
-            line,
-            "Can't have multiple fingerprint attributes at the same level.",
-            error);
-      }
-      rtc::SSLFingerprint* fingerprint = NULL;
-      if (!ParseFingerprintAttribute(line, &fingerprint, error)) {
-        return false;
-      }
-      session_td->identity_fingerprint.reset(fingerprint);
-    } else if (HasAttribute(line, kAttributeSetup)) {
-      if (!ParseDtlsSetup(line, &(session_td->connection_role), error)) {
-        return false;
-      }
-    } else if (HasAttribute(line, kAttributeMsidSemantics)) {
-      std::string semantics;
-      if (!GetValue(line, kAttributeMsidSemantics, &semantics, error)) {
-        return false;
-      }
-      desc->set_msid_supported(
-          CaseInsensitiveFind(semantics, kMediaStreamSemantic));
-    } else if (HasAttribute(line, kAttributeExtmap)) {
-      RtpExtension extmap;
-      if (!ParseExtmap(line, &extmap, error)) {
-        return false;
-      }
-      session_extmaps->push_back(extmap);
-    }
-  }
-
-  return true;
-}
-
-bool ParseGroupAttribute(const std::string& line,
-                         cricket::SessionDescription* desc,
-                         SdpParseError* error) {
-  RTC_DCHECK(desc != NULL);
-
-  // RFC 5888 and draft-holmberg-mmusic-sdp-bundle-negotiation-00
-  // a=group:BUNDLE video voice
-  std::vector<std::string> fields;
-  rtc::split(line.substr(kLinePrefixLength),
-                   kSdpDelimiterSpace, &fields);
-  std::string semantics;
-  if (!GetValue(fields[0], kAttributeGroup, &semantics, error)) {
-    return false;
-  }
-  cricket::ContentGroup group(semantics);
-  for (size_t i = 1; i < fields.size(); ++i) {
-    group.AddContentName(fields[i]);
-  }
-  desc->AddGroup(group);
-  return true;
-}
-
-static bool ParseFingerprintAttribute(const std::string& line,
-                                      rtc::SSLFingerprint** fingerprint,
-                                      SdpParseError* error) {
-  if (!IsLineType(line, kLineTypeAttributes) ||
-      !HasAttribute(line, kAttributeFingerprint)) {
-    return ParseFailedExpectLine(line, 0, kLineTypeAttributes,
-                                 kAttributeFingerprint, error);
-  }
-
-  std::vector<std::string> fields;
-  rtc::split(line.substr(kLinePrefixLength),
-                   kSdpDelimiterSpace, &fields);
-  const size_t expected_fields = 2;
-  if (fields.size() != expected_fields) {
-    return ParseFailedExpectFieldNum(line, expected_fields, error);
-  }
-
-  // The first field here is "fingerprint:<hash>.
-  std::string algorithm;
-  if (!GetValue(fields[0], kAttributeFingerprint, &algorithm, error)) {
-    return false;
-  }
-
-  // Downcase the algorithm. Note that we don't need to downcase the
-  // fingerprint because hex_decode can handle upper-case.
-  std::transform(algorithm.begin(), algorithm.end(), algorithm.begin(),
-                 ::tolower);
-
-  // The second field is the digest value. De-hexify it.
-  *fingerprint = rtc::SSLFingerprint::CreateFromRfc4572(
-      algorithm, fields[1]);
-  if (!*fingerprint) {
-    return ParseFailed(line,
-                       "Failed to create fingerprint from the digest.",
-                       error);
-  }
-
-  return true;
-}
-
-static bool ParseDtlsSetup(const std::string& line,
-                           cricket::ConnectionRole* role,
-                           SdpParseError* error) {
-  // setup-attr           =  "a=setup:" role
-  // role                 =  "active" / "passive" / "actpass" / "holdconn"
-  std::vector<std::string> fields;
-  rtc::split(line.substr(kLinePrefixLength), kSdpDelimiterColon, &fields);
-  const size_t expected_fields = 2;
-  if (fields.size() != expected_fields) {
-    return ParseFailedExpectFieldNum(line, expected_fields, error);
-  }
-  std::string role_str = fields[1];
-  if (!cricket::StringToConnectionRole(role_str, role)) {
-    return ParseFailed(line, "Invalid attribute value.", error);
-  }
-  return true;
-}
-
-static bool ParseMsidAttribute(const std::string& line,
-                               std::string* stream_id,
-                               std::string* track_id,
-                               SdpParseError* error) {
-  // draft-ietf-mmusic-msid-11
-  // a=msid:<stream id> <track id>
-  // msid-value = msid-id [ SP msid-appdata ]
-  // msid-id = 1*64token-char ; see RFC 4566
-  // msid-appdata = 1*64token-char  ; see RFC 4566
-  std::string field1;
-  if (!rtc::tokenize_first(line.substr(kLinePrefixLength), kSdpDelimiterSpace,
-                           &field1, track_id)) {
-    const size_t expected_fields = 2;
-    return ParseFailedExpectFieldNum(line, expected_fields, error);
-  }
-
-  if (track_id->empty()) {
-    return ParseFailed(line, "Missing track ID in msid attribute.", error);
-  }
-
-  // msid:<msid-id>
-  if (!GetValue(field1, kAttributeMsid, stream_id, error)) {
-    return false;
-  }
-  if (stream_id->empty()) {
-    return ParseFailed(line, "Missing stream ID in msid attribute.", error);
-  }
-  return true;
-}
-
-// RFC 3551
-//  PT   encoding    media type  clock rate   channels
-//                      name                    (Hz)
-//  0    PCMU        A            8,000       1
-//  1    reserved    A
-//  2    reserved    A
-//  3    GSM         A            8,000       1
-//  4    G723        A            8,000       1
-//  5    DVI4        A            8,000       1
-//  6    DVI4        A           16,000       1
-//  7    LPC         A            8,000       1
-//  8    PCMA        A            8,000       1
-//  9    G722        A            8,000       1
-//  10   L16         A           44,100       2
-//  11   L16         A           44,100       1
-//  12   QCELP       A            8,000       1
-//  13   CN          A            8,000       1
-//  14   MPA         A           90,000       (see text)
-//  15   G728        A            8,000       1
-//  16   DVI4        A           11,025       1
-//  17   DVI4        A           22,050       1
-//  18   G729        A            8,000       1
-struct StaticPayloadAudioCodec {
-  const char* name;
-  int clockrate;
-  size_t channels;
-};
-static const StaticPayloadAudioCodec kStaticPayloadAudioCodecs[] = {
-  { "PCMU", 8000, 1 },
-  { "reserved", 0, 0 },
-  { "reserved", 0, 0 },
-  { "GSM", 8000, 1 },
-  { "G723", 8000, 1 },
-  { "DVI4", 8000, 1 },
-  { "DVI4", 16000, 1 },
-  { "LPC", 8000, 1 },
-  { "PCMA", 8000, 1 },
-  { "G722", 8000, 1 },
-  { "L16", 44100, 2 },
-  { "L16", 44100, 1 },
-  { "QCELP", 8000, 1 },
-  { "CN", 8000, 1 },
-  { "MPA", 90000, 1 },
-  { "G728", 8000, 1 },
-  { "DVI4", 11025, 1 },
-  { "DVI4", 22050, 1 },
-  { "G729", 8000, 1 },
-};
-
-void MaybeCreateStaticPayloadAudioCodecs(
-    const std::vector<int>& fmts, AudioContentDescription* media_desc) {
-  if (!media_desc) {
-    return;
-  }
-  RTC_DCHECK(media_desc->codecs().empty());
-  for (int payload_type : fmts) {
-    if (!media_desc->HasCodec(payload_type) &&
-        payload_type >= 0 &&
-        static_cast<uint32_t>(payload_type) <
-            arraysize(kStaticPayloadAudioCodecs)) {
-      std::string encoding_name = kStaticPayloadAudioCodecs[payload_type].name;
-      int clock_rate = kStaticPayloadAudioCodecs[payload_type].clockrate;
-      size_t channels = kStaticPayloadAudioCodecs[payload_type].channels;
-      media_desc->AddCodec(cricket::AudioCodec(payload_type, encoding_name,
-                                               clock_rate, 0, channels));
-    }
-  }
-}
-
-template <class C>
-static C* ParseContentDescription(const std::string& message,
-                                  const MediaType media_type,
-                                  int mline_index,
-                                  const std::string& protocol,
-                                  const std::vector<int>& payload_types,
-                                  size_t* pos,
-                                  std::string* content_name,
-                                  bool* bundle_only,
-                                  TransportDescription* transport,
-                                  std::vector<JsepIceCandidate*>* candidates,
-                                  webrtc::SdpParseError* error) {
-  C* media_desc = new C();
-  switch (media_type) {
-    case cricket::MEDIA_TYPE_AUDIO:
-      *content_name = cricket::CN_AUDIO;
-      break;
-    case cricket::MEDIA_TYPE_VIDEO:
-      *content_name = cricket::CN_VIDEO;
-      break;
-    case cricket::MEDIA_TYPE_DATA:
-      *content_name = cricket::CN_DATA;
-      break;
-    default:
-      RTC_NOTREACHED();
-      break;
-  }
-  if (!ParseContent(message, media_type, mline_index, protocol, payload_types,
-                    pos, content_name, bundle_only, media_desc, transport,
-                    candidates, error)) {
-    delete media_desc;
-    return nullptr;
-  }
-  // Sort the codecs according to the m-line fmt list.
-  std::unordered_map<int, int> payload_type_preferences;
-  // "size + 1" so that the lowest preference payload type has a preference of
-  // 1, which is greater than the default (0) for payload types not in the fmt
-  // list.
-  int preference = static_cast<int>(payload_types.size() + 1);
-  for (int pt : payload_types) {
-    payload_type_preferences[pt] = preference--;
-  }
-  std::vector<typename C::CodecType> codecs = media_desc->codecs();
-  std::sort(codecs.begin(), codecs.end(), [&payload_type_preferences](
-                                              const typename C::CodecType& a,
-                                              const typename C::CodecType& b) {
-    return payload_type_preferences[a.id] > payload_type_preferences[b.id];
-  });
-  media_desc->set_codecs(codecs);
-  return media_desc;
-}
-
-bool ParseMediaDescription(const std::string& message,
-                           const TransportDescription& session_td,
-                           const RtpHeaderExtensions& session_extmaps,
-                           size_t* pos,
-                           const rtc::SocketAddress& session_connection_addr,
-                           cricket::SessionDescription* desc,
-                           std::vector<JsepIceCandidate*>* candidates,
-                           SdpParseError* error) {
-  RTC_DCHECK(desc != NULL);
-  std::string line;
-  int mline_index = -1;
-
-  // Zero or more media descriptions
-  // RFC 4566
-  // m=<media> <port> <proto> <fmt>
-  while (GetLineWithType(message, pos, &line, kLineTypeMedia)) {
-    ++mline_index;
-
-    std::vector<std::string> fields;
-    rtc::split(line.substr(kLinePrefixLength),
-                     kSdpDelimiterSpace, &fields);
-
-    const size_t expected_min_fields = 4;
-    if (fields.size() < expected_min_fields) {
-      return ParseFailedExpectMinFieldNum(line, expected_min_fields, error);
-    }
-    bool port_rejected = false;
-    // RFC 3264
-    // To reject an offered stream, the port number in the corresponding stream
-    // in the answer MUST be set to zero.
-    if (fields[1] == kMediaPortRejected) {
-      port_rejected = true;
-    }
-
-    int port = 0;
-    if (!rtc::FromString<int>(fields[1], &port) || !IsValidPort(port)) {
-      return ParseFailed(line, "The port number is invalid", error);
-    }
-    std::string protocol = fields[2];
-
-    // <fmt>
-    std::vector<int> payload_types;
-    if (IsRtp(protocol)) {
-      for (size_t j = 3 ; j < fields.size(); ++j) {
-        // TODO(wu): Remove when below bug is fixed.
-        // https://bugzilla.mozilla.org/show_bug.cgi?id=996329
-        if (fields[j].empty() && j == fields.size() - 1) {
-          continue;
-        }
-
-        int pl = 0;
-        if (!GetPayloadTypeFromString(line, fields[j], &pl, error)) {
-          return false;
-        }
-        payload_types.push_back(pl);
-      }
-    }
-
-    // Make a temporary TransportDescription based on |session_td|.
-    // Some of this gets overwritten by ParseContent.
-    TransportDescription transport(
-        session_td.transport_options, session_td.ice_ufrag, session_td.ice_pwd,
-        session_td.ice_mode, session_td.connection_role,
-        session_td.identity_fingerprint.get());
-
-    std::unique_ptr<MediaContentDescription> content;
-    std::string content_name;
-    bool bundle_only = false;
-    if (HasAttribute(line, kMediaTypeVideo)) {
-      content.reset(ParseContentDescription<VideoContentDescription>(
-          message, cricket::MEDIA_TYPE_VIDEO, mline_index, protocol,
-          payload_types, pos, &content_name, &bundle_only, &transport,
-          candidates, error));
-    } else if (HasAttribute(line, kMediaTypeAudio)) {
-      content.reset(ParseContentDescription<AudioContentDescription>(
-          message, cricket::MEDIA_TYPE_AUDIO, mline_index, protocol,
-          payload_types, pos, &content_name, &bundle_only, &transport,
-          candidates, error));
-    } else if (HasAttribute(line, kMediaTypeData)) {
-      DataContentDescription* data_desc =
-          ParseContentDescription<DataContentDescription>(
-              message, cricket::MEDIA_TYPE_DATA, mline_index, protocol,
-              payload_types, pos, &content_name, &bundle_only, &transport,
-              candidates, error);
-      content.reset(data_desc);
-
-      if (data_desc && IsDtlsSctp(protocol)) {
-        int p;
-        if (rtc::FromString(fields[3], &p)) {
-          if (!AddSctpDataCodec(data_desc, p)) {
-            return false;
-          }
-        } else if (fields[3] == kDefaultSctpmapProtocol) {
-          data_desc->set_use_sctpmap(false);
-        }
-      }
-    } else {
-      LOG(LS_WARNING) << "Unsupported media type: " << line;
-      continue;
-    }
-    if (!content.get()) {
-      // ParseContentDescription returns NULL if failed.
-      return false;
-    }
-
-    bool content_rejected = false;
-    // A port of 0 is not interpreted as a rejected m= section when it's
-    // used along with a=bundle-only.
-    if (bundle_only) {
-      if (!port_rejected) {
-        // Usage of bundle-only with a nonzero port is unspecified. So just
-        // ignore bundle-only if we see this.
-        bundle_only = false;
-        LOG(LS_WARNING)
-            << "a=bundle-only attribute observed with a nonzero "
-            << "port; this usage is unspecified so the attribute is being "
-            << "ignored.";
-      }
-    } else {
-      // If not using bundle-only, interpret port 0 in the normal way; the m=
-      // section is being rejected.
-      content_rejected = port_rejected;
-    }
-
-    if (IsRtp(protocol)) {
-      // Set the extmap.
-      if (!session_extmaps.empty() &&
-          !content->rtp_header_extensions().empty()) {
-        return ParseFailed("",
-                           "The a=extmap MUST be either all session level or "
-                           "all media level.",
-                           error);
-      }
-      for (size_t i = 0; i < session_extmaps.size(); ++i) {
-        content->AddRtpHeaderExtension(session_extmaps[i]);
-      }
-    }
-    content->set_protocol(protocol);
-
-    // Use the session level connection address if the media level addresses are
-    // not specified.
-    rtc::SocketAddress address;
-    address = content->connection_address().IsNil()
-                  ? session_connection_addr
-                  : content->connection_address();
-    address.SetPort(port);
-    content->set_connection_address(address);
-
-    desc->AddContent(content_name,
-                     IsDtlsSctp(protocol) ? cricket::NS_JINGLE_DRAFT_SCTP
-                                          : cricket::NS_JINGLE_RTP,
-                     content_rejected, bundle_only, content.release());
-    // Create TransportInfo with the media level "ice-pwd" and "ice-ufrag".
-    TransportInfo transport_info(content_name, transport);
-
-    if (!desc->AddTransportInfo(transport_info)) {
-      std::ostringstream description;
-      description << "Failed to AddTransportInfo with content name: "
-                  << content_name;
-      return ParseFailed("", description.str(), error);
-    }
-  }
-
-  size_t end_of_message = message.size();
-  if (mline_index == -1 && *pos != end_of_message) {
-    ParseFailed(message, *pos, "Expects m line.", error);
-    return false;
-  }
-  return true;
-}
-
-bool VerifyCodec(const cricket::Codec& codec) {
-  // Codec has not been populated correctly unless the name has been set. This
-  // can happen if an SDP has an fmtp or rtcp-fb with a payload type but doesn't
-  // have a corresponding "rtpmap" line.
-  return !codec.name.empty();
-}
-
-bool VerifyAudioCodecs(const AudioContentDescription* audio_desc) {
-  const std::vector<cricket::AudioCodec>& codecs = audio_desc->codecs();
-  for (std::vector<cricket::AudioCodec>::const_iterator iter = codecs.begin();
-       iter != codecs.end(); ++iter) {
-    if (!VerifyCodec(*iter)) {
-      return false;
-    }
-  }
-  return true;
-}
-
-bool VerifyVideoCodecs(const VideoContentDescription* video_desc) {
-  const std::vector<cricket::VideoCodec>& codecs = video_desc->codecs();
-  for (std::vector<cricket::VideoCodec>::const_iterator iter = codecs.begin();
-       iter != codecs.end(); ++iter) {
-    if (!VerifyCodec(*iter)) {
-      return false;
-    }
-  }
-  return true;
-}
-
-void AddParameters(const cricket::CodecParameterMap& parameters,
-                   cricket::Codec* codec) {
-  for (cricket::CodecParameterMap::const_iterator iter =
-           parameters.begin(); iter != parameters.end(); ++iter) {
-    codec->SetParam(iter->first, iter->second);
-  }
-}
-
-void AddFeedbackParameter(const cricket::FeedbackParam& feedback_param,
-                          cricket::Codec* codec) {
-  codec->AddFeedbackParam(feedback_param);
-}
-
-void AddFeedbackParameters(const cricket::FeedbackParams& feedback_params,
-                           cricket::Codec* codec) {
-  for (std::vector<cricket::FeedbackParam>::const_iterator iter =
-           feedback_params.params().begin();
-       iter != feedback_params.params().end(); ++iter) {
-    codec->AddFeedbackParam(*iter);
-  }
-}
-
-// Gets the current codec setting associated with |payload_type|. If there
-// is no Codec associated with that payload type it returns an empty codec
-// with that payload type.
-template <class T>
-T GetCodecWithPayloadType(const std::vector<T>& codecs, int payload_type) {
-  const T* codec = FindCodecById(codecs, payload_type);
-  if (codec)
-    return *codec;
-  // Return empty codec with |payload_type|.
-  T ret_val;
-  ret_val.id = payload_type;
-  return ret_val;
-}
-
-// Updates or creates a new codec entry in the audio description.
-template <class T, class U>
-void AddOrReplaceCodec(MediaContentDescription* content_desc, const U& codec) {
-  T* desc = static_cast<T*>(content_desc);
-  std::vector<U> codecs = desc->codecs();
-  bool found = false;
-
-  typename std::vector<U>::iterator iter;
-  for (iter = codecs.begin(); iter != codecs.end(); ++iter) {
-    if (iter->id == codec.id) {
-      *iter = codec;
-      found = true;
-      break;
-    }
-  }
-  if (!found) {
-    desc->AddCodec(codec);
-    return;
-  }
-  desc->set_codecs(codecs);
-}
-
-// Adds or updates existing codec corresponding to |payload_type| according
-// to |parameters|.
-template <class T, class U>
-void UpdateCodec(MediaContentDescription* content_desc, int payload_type,
-                 const cricket::CodecParameterMap& parameters) {
-  // Codec might already have been populated (from rtpmap).
-  U new_codec = GetCodecWithPayloadType(static_cast<T*>(content_desc)->codecs(),
-                                        payload_type);
-  AddParameters(parameters, &new_codec);
-  AddOrReplaceCodec<T, U>(content_desc, new_codec);
-}
-
-// Adds or updates existing codec corresponding to |payload_type| according
-// to |feedback_param|.
-template <class T, class U>
-void UpdateCodec(MediaContentDescription* content_desc, int payload_type,
-                 const cricket::FeedbackParam& feedback_param) {
-  // Codec might already have been populated (from rtpmap).
-  U new_codec = GetCodecWithPayloadType(static_cast<T*>(content_desc)->codecs(),
-                                        payload_type);
-  AddFeedbackParameter(feedback_param, &new_codec);
-  AddOrReplaceCodec<T, U>(content_desc, new_codec);
-}
-
-template <class T>
-bool PopWildcardCodec(std::vector<T>* codecs, T* wildcard_codec) {
-  for (auto iter = codecs->begin(); iter != codecs->end(); ++iter) {
-    if (iter->id == kWildcardPayloadType) {
-      *wildcard_codec = *iter;
-      codecs->erase(iter);
-      return true;
-    }
-  }
-  return false;
-}
-
-template<class T>
-void UpdateFromWildcardCodecs(cricket::MediaContentDescriptionImpl<T>* desc) {
-  auto codecs = desc->codecs();
-  T wildcard_codec;
-  if (!PopWildcardCodec(&codecs, &wildcard_codec)) {
-    return;
-  }
-  for (auto& codec : codecs) {
-    AddFeedbackParameters(wildcard_codec.feedback_params, &codec);
-  }
-  desc->set_codecs(codecs);
-}
-
-void AddAudioAttribute(const std::string& name, const std::string& value,
-                       AudioContentDescription* audio_desc) {
-  if (value.empty()) {
-    return;
-  }
-  std::vector<cricket::AudioCodec> codecs = audio_desc->codecs();
-  for (std::vector<cricket::AudioCodec>::iterator iter = codecs.begin();
-       iter != codecs.end(); ++iter) {
-    iter->params[name] = value;
-  }
-  audio_desc->set_codecs(codecs);
-}
-
-bool ParseContent(const std::string& message,
-                  const MediaType media_type,
-                  int mline_index,
-                  const std::string& protocol,
-                  const std::vector<int>& payload_types,
-                  size_t* pos,
-                  std::string* content_name,
-                  bool* bundle_only,
-                  MediaContentDescription* media_desc,
-                  TransportDescription* transport,
-                  std::vector<JsepIceCandidate*>* candidates,
-                  SdpParseError* error) {
-  RTC_DCHECK(media_desc != NULL);
-  RTC_DCHECK(content_name != NULL);
-  RTC_DCHECK(transport != NULL);
-
-  if (media_type == cricket::MEDIA_TYPE_AUDIO) {
-    MaybeCreateStaticPayloadAudioCodecs(
-        payload_types, static_cast<AudioContentDescription*>(media_desc));
-  }
-
-  // The media level "ice-ufrag" and "ice-pwd".
-  // The candidates before update the media level "ice-pwd" and "ice-ufrag".
-  Candidates candidates_orig;
-  std::string line;
-  std::string mline_id;
-  // Tracks created out of the ssrc attributes.
-  StreamParamsVec tracks;
-  SsrcInfoVec ssrc_infos;
-  SsrcGroupVec ssrc_groups;
-  std::string maxptime_as_string;
-  std::string ptime_as_string;
-  std::string stream_id;
-  std::string track_id;
-
-  // Loop until the next m line
-  while (!IsLineType(message, kLineTypeMedia, *pos)) {
-    if (!GetLine(message, pos, &line)) {
-      if (*pos >= message.size()) {
-        break;  // Done parsing
-      } else {
-        return ParseFailed(message, *pos, "Invalid SDP line.", error);
-      }
-    }
-
-    // RFC 4566
-    // b=* (zero or more bandwidth information lines)
-    if (IsLineType(line, kLineTypeSessionBandwidth)) {
-      std::string bandwidth;
-      if (HasAttribute(line, kApplicationSpecificMaximum)) {
-        if (!GetValue(line, kApplicationSpecificMaximum, &bandwidth, error)) {
-          return false;
-        } else {
-          int b = 0;
-          if (!GetValueFromString(line, bandwidth, &b, error)) {
-            return false;
-          }
-          // TODO(deadbeef): Historically, applications may be setting a value
-          // of -1 to mean "unset any previously set bandwidth limit", even
-          // though ommitting the "b=AS" entirely will do just that. Once we've
-          // transitioned applications to doing the right thing, it would be
-          // better to treat this as a hard error instead of just ignoring it.
-          if (b == -1) {
-            LOG(LS_WARNING) << "Ignoring \"b=AS:-1\"; will be treated as \"no "
-                               "bandwidth limit\".";
-            continue;
-          }
-          if (b < 0) {
-            return ParseFailed(line, "b=AS value can't be negative.", error);
-          }
-          // We should never use more than the default bandwidth for RTP-based
-          // data channels. Don't allow SDP to set the bandwidth, because
-          // that would give JS the opportunity to "break the Internet".
-          // See: https://code.google.com/p/chromium/issues/detail?id=280726
-          if (media_type == cricket::MEDIA_TYPE_DATA && IsRtp(protocol) &&
-              b > cricket::kDataMaxBandwidth / 1000) {
-            std::ostringstream description;
-            description << "RTP-based data channels may not send more than "
-                        << cricket::kDataMaxBandwidth / 1000 << "kbps.";
-            return ParseFailed(line, description.str(), error);
-          }
-          // Prevent integer overflow.
-          b = std::min(b, INT_MAX / 1000);
-          media_desc->set_bandwidth(b * 1000);
-        }
-      }
-      continue;
-    }
-
-    // Parse the media level connection data.
-    if (IsLineType(line, kLineTypeConnection)) {
-      rtc::SocketAddress addr;
-      if (!ParseConnectionData(line, &addr, error)) {
-        return false;
-      }
-      media_desc->set_connection_address(addr);
-      continue;
-    }
-
-    if (!IsLineType(line, kLineTypeAttributes)) {
-      // TODO: Handle other lines if needed.
-      LOG(LS_INFO) << "Ignored line: " << line;
-      continue;
-    }
-
-    // Handle attributes common to SCTP and RTP.
-    if (HasAttribute(line, kAttributeMid)) {
-      // RFC 3388
-      // mid-attribute      = "a=mid:" identification-tag
-      // identification-tag = token
-      // Use the mid identification-tag as the content name.
-      if (!GetValue(line, kAttributeMid, &mline_id, error)) {
-        return false;
-      }
-      *content_name = mline_id;
-    } else if (HasAttribute(line, kAttributeBundleOnly)) {
-      *bundle_only = true;
-    } else if (HasAttribute(line, kAttributeCandidate)) {
-      Candidate candidate;
-      if (!ParseCandidate(line, &candidate, error, false)) {
-        return false;
-      }
-      // ParseCandidate will parse non-standard ufrag and password attributes,
-      // since it's used for candidate trickling, but we only want to process
-      // the "a=ice-ufrag"/"a=ice-pwd" values in a session description, so
-      // strip them off at this point.
-      candidate.set_username(std::string());
-      candidate.set_password(std::string());
-      candidates_orig.push_back(candidate);
-    } else if (HasAttribute(line, kAttributeIceUfrag)) {
-      if (!GetValue(line, kAttributeIceUfrag, &transport->ice_ufrag, error)) {
-        return false;
-      }
-    } else if (HasAttribute(line, kAttributeIcePwd)) {
-      if (!GetValue(line, kAttributeIcePwd, &transport->ice_pwd, error)) {
-        return false;
-      }
-    } else if (HasAttribute(line, kAttributeIceOption)) {
-      if (!ParseIceOptions(line, &transport->transport_options, error)) {
-        return false;
-      }
-    } else if (HasAttribute(line, kAttributeFmtp)) {
-      if (!ParseFmtpAttributes(line, media_type, media_desc, error)) {
-        return false;
-      }
-    } else if (HasAttribute(line, kAttributeFingerprint)) {
-      rtc::SSLFingerprint* fingerprint = NULL;
-
-      if (!ParseFingerprintAttribute(line, &fingerprint, error)) {
-        return false;
-      }
-      transport->identity_fingerprint.reset(fingerprint);
-    } else if (HasAttribute(line, kAttributeSetup)) {
-      if (!ParseDtlsSetup(line, &(transport->connection_role), error)) {
-        return false;
-      }
-    } else if (IsDtlsSctp(protocol) && HasAttribute(line, kAttributeSctpPort)) {
-      if (media_type != cricket::MEDIA_TYPE_DATA) {
-        return ParseFailed(
-            line, "sctp-port attribute found in non-data media description.",
-            error);
-      }
-      int sctp_port;
-      if (!ParseSctpPort(line, &sctp_port, error)) {
-        return false;
-      }
-      if (!AddSctpDataCodec(static_cast<DataContentDescription*>(media_desc),
-                            sctp_port)) {
-        return false;
-      }
-    } else if (IsRtp(protocol)) {
-      //
-      // RTP specific attrubtes
-      //
-      if (HasAttribute(line, kAttributeRtcpMux)) {
-        media_desc->set_rtcp_mux(true);
-      } else if (HasAttribute(line, kAttributeRtcpReducedSize)) {
-        media_desc->set_rtcp_reduced_size(true);
-      } else if (HasAttribute(line, kAttributeSsrcGroup)) {
-        if (!ParseSsrcGroupAttribute(line, &ssrc_groups, error)) {
-          return false;
-        }
-      } else if (HasAttribute(line, kAttributeSsrc)) {
-        if (!ParseSsrcAttribute(line, &ssrc_infos, error)) {
-          return false;
-        }
-      } else if (HasAttribute(line, kAttributeCrypto)) {
-        if (!ParseCryptoAttribute(line, media_desc, error)) {
-          return false;
-        }
-      } else if (HasAttribute(line, kAttributeRtpmap)) {
-        if (!ParseRtpmapAttribute(line, media_type, payload_types, media_desc,
-                                  error)) {
-          return false;
-        }
-      } else if (HasAttribute(line, kCodecParamMaxPTime)) {
-        if (!GetValue(line, kCodecParamMaxPTime, &maxptime_as_string, error)) {
-          return false;
-        }
-      } else if (HasAttribute(line, kAttributeRtcpFb)) {
-        if (!ParseRtcpFbAttribute(line, media_type, media_desc, error)) {
-          return false;
-        }
-      } else if (HasAttribute(line, kCodecParamPTime)) {
-        if (!GetValue(line, kCodecParamPTime, &ptime_as_string, error)) {
-          return false;
-        }
-      } else if (HasAttribute(line, kAttributeSendOnly)) {
-        media_desc->set_direction(cricket::MD_SENDONLY);
-      } else if (HasAttribute(line, kAttributeRecvOnly)) {
-        media_desc->set_direction(cricket::MD_RECVONLY);
-      } else if (HasAttribute(line, kAttributeInactive)) {
-        media_desc->set_direction(cricket::MD_INACTIVE);
-      } else if (HasAttribute(line, kAttributeSendRecv)) {
-        media_desc->set_direction(cricket::MD_SENDRECV);
-      } else if (HasAttribute(line, kAttributeExtmap)) {
-        RtpExtension extmap;
-        if (!ParseExtmap(line, &extmap, error)) {
-          return false;
-        }
-        media_desc->AddRtpHeaderExtension(extmap);
-      } else if (HasAttribute(line, kAttributeXGoogleFlag)) {
-        // Experimental attribute.  Conference mode activates more aggressive
-        // AEC and NS settings.
-        // TODO: expose API to set these directly.
-        std::string flag_value;
-        if (!GetValue(line, kAttributeXGoogleFlag, &flag_value, error)) {
-          return false;
-        }
-        if (flag_value.compare(kValueConference) == 0)
-          media_desc->set_conference_mode(true);
-      } else if (HasAttribute(line, kAttributeMsid)) {
-        if (!ParseMsidAttribute(line, &stream_id, &track_id, error)) {
-          return false;
-        }
-      }
-    } else {
-      // Only parse lines that we are interested of.
-      LOG(LS_INFO) << "Ignored line: " << line;
-      continue;
-    }
-  }
-
-  // Create tracks from the |ssrc_infos|.
-  // If the stream_id/track_id for all SSRCS are identical, one StreamParams
-  // will be created in CreateTracksFromSsrcInfos, containing all the SSRCs from
-  // the m= section.
-  CreateTracksFromSsrcInfos(ssrc_infos, stream_id, track_id, &tracks);
-
-  // Add the ssrc group to the track.
-  for (SsrcGroupVec::iterator ssrc_group = ssrc_groups.begin();
-       ssrc_group != ssrc_groups.end(); ++ssrc_group) {
-    if (ssrc_group->ssrcs.empty()) {
-      continue;
-    }
-    uint32_t ssrc = ssrc_group->ssrcs.front();
-    for (StreamParamsVec::iterator track = tracks.begin();
-         track != tracks.end(); ++track) {
-      if (track->has_ssrc(ssrc)) {
-        track->ssrc_groups.push_back(*ssrc_group);
-      }
-    }
-  }
-
-  // Add the new tracks to the |media_desc|.
-  for (StreamParams& track : tracks) {
-    media_desc->AddStream(track);
-  }
-
-  if (media_type == cricket::MEDIA_TYPE_AUDIO) {
-    AudioContentDescription* audio_desc =
-        static_cast<AudioContentDescription*>(media_desc);
-    UpdateFromWildcardCodecs(audio_desc);
-
-    // Verify audio codec ensures that no audio codec has been populated with
-    // only fmtp.
-    if (!VerifyAudioCodecs(audio_desc)) {
-      return ParseFailed("Failed to parse audio codecs correctly.", error);
-    }
-    AddAudioAttribute(kCodecParamMaxPTime, maxptime_as_string, audio_desc);
-    AddAudioAttribute(kCodecParamPTime, ptime_as_string, audio_desc);
-  }
-
-  if (media_type == cricket::MEDIA_TYPE_VIDEO) {
-    VideoContentDescription* video_desc =
-        static_cast<VideoContentDescription*>(media_desc);
-    UpdateFromWildcardCodecs(video_desc);
-    // Verify video codec ensures that no video codec has been populated with
-    // only rtcp-fb.
-    if (!VerifyVideoCodecs(video_desc)) {
-      return ParseFailed("Failed to parse video codecs correctly.", error);
-    }
-  }
-
-  // RFC 5245
-  // Update the candidates with the media level "ice-pwd" and "ice-ufrag".
-  for (Candidates::iterator it = candidates_orig.begin();
-       it != candidates_orig.end(); ++it) {
-    RTC_DCHECK((*it).username().empty() ||
-               (*it).username() == transport->ice_ufrag);
-    (*it).set_username(transport->ice_ufrag);
-    RTC_DCHECK((*it).password().empty());
-    (*it).set_password(transport->ice_pwd);
-    candidates->push_back(
-        new JsepIceCandidate(mline_id, mline_index, *it));
-  }
-  return true;
-}
-
-bool ParseSsrcAttribute(const std::string& line, SsrcInfoVec* ssrc_infos,
-                        SdpParseError* error) {
-  RTC_DCHECK(ssrc_infos != NULL);
-  // RFC 5576
-  // a=ssrc:<ssrc-id> <attribute>
-  // a=ssrc:<ssrc-id> <attribute>:<value>
-  std::string field1, field2;
-  if (!rtc::tokenize_first(line.substr(kLinePrefixLength), kSdpDelimiterSpace,
-                           &field1, &field2)) {
-    const size_t expected_fields = 2;
-    return ParseFailedExpectFieldNum(line, expected_fields, error);
-  }
-
-  // ssrc:<ssrc-id>
-  std::string ssrc_id_s;
-  if (!GetValue(field1, kAttributeSsrc, &ssrc_id_s, error)) {
-    return false;
-  }
-  uint32_t ssrc_id = 0;
-  if (!GetValueFromString(line, ssrc_id_s, &ssrc_id, error)) {
-    return false;
-  }
-
-  std::string attribute;
-  std::string value;
-  if (!rtc::tokenize_first(field2, kSdpDelimiterColon, &attribute, &value)) {
-    std::ostringstream description;
-    description << "Failed to get the ssrc attribute value from " << field2
-                << ". Expected format <attribute>:<value>.";
-    return ParseFailed(line, description.str(), error);
-  }
-
-  // Check if there's already an item for this |ssrc_id|. Create a new one if
-  // there isn't.
-  SsrcInfoVec::iterator ssrc_info = ssrc_infos->begin();
-  for (; ssrc_info != ssrc_infos->end(); ++ssrc_info) {
-    if (ssrc_info->ssrc_id == ssrc_id) {
-      break;
-    }
-  }
-  if (ssrc_info == ssrc_infos->end()) {
-    SsrcInfo info;
-    info.ssrc_id = ssrc_id;
-    ssrc_infos->push_back(info);
-    ssrc_info = ssrc_infos->end() - 1;
-  }
-
-  // Store the info to the |ssrc_info|.
-  if (attribute == kSsrcAttributeCname) {
-    // RFC 5576
-    // cname:<value>
-    ssrc_info->cname = value;
-  } else if (attribute == kSsrcAttributeMsid) {
-    // draft-alvestrand-mmusic-msid-00
-    // "msid:" identifier [ " " appdata ]
-    std::vector<std::string> fields;
-    rtc::split(value, kSdpDelimiterSpace, &fields);
-    if (fields.size() < 1 || fields.size() > 2) {
-      return ParseFailed(line,
-                         "Expected format \"msid:<identifier>[ <appdata>]\".",
-                         error);
-    }
-    ssrc_info->stream_id = fields[0];
-    if (fields.size() == 2) {
-      ssrc_info->track_id = fields[1];
-    }
-  } else if (attribute == kSsrcAttributeMslabel) {
-    // draft-alvestrand-rtcweb-mid-01
-    // mslabel:<value>
-    ssrc_info->mslabel = value;
-  } else if (attribute == kSSrcAttributeLabel) {
-    // The label isn't defined.
-    // label:<value>
-    ssrc_info->label = value;
-  }
-  return true;
-}
-
-bool ParseSsrcGroupAttribute(const std::string& line,
-                             SsrcGroupVec* ssrc_groups,
-                             SdpParseError* error) {
-  RTC_DCHECK(ssrc_groups != NULL);
-  // RFC 5576
-  // a=ssrc-group:<semantics> <ssrc-id> ...
-  std::vector<std::string> fields;
-  rtc::split(line.substr(kLinePrefixLength),
-                   kSdpDelimiterSpace, &fields);
-  const size_t expected_min_fields = 2;
-  if (fields.size() < expected_min_fields) {
-    return ParseFailedExpectMinFieldNum(line, expected_min_fields, error);
-  }
-  std::string semantics;
-  if (!GetValue(fields[0], kAttributeSsrcGroup, &semantics, error)) {
-    return false;
-  }
-  std::vector<uint32_t> ssrcs;
-  for (size_t i = 1; i < fields.size(); ++i) {
-    uint32_t ssrc = 0;
-    if (!GetValueFromString(line, fields[i], &ssrc, error)) {
-      return false;
-    }
-    ssrcs.push_back(ssrc);
-  }
-  ssrc_groups->push_back(SsrcGroup(semantics, ssrcs));
-  return true;
-}
-
-bool ParseCryptoAttribute(const std::string& line,
-                          MediaContentDescription* media_desc,
-                          SdpParseError* error) {
-  std::vector<std::string> fields;
-  rtc::split(line.substr(kLinePrefixLength),
-                   kSdpDelimiterSpace, &fields);
-  // RFC 4568
-  // a=crypto:<tag> <crypto-suite> <key-params> [<session-params>]
-  const size_t expected_min_fields = 3;
-  if (fields.size() < expected_min_fields) {
-    return ParseFailedExpectMinFieldNum(line, expected_min_fields, error);
-  }
-  std::string tag_value;
-  if (!GetValue(fields[0], kAttributeCrypto, &tag_value, error)) {
-    return false;
-  }
-  int tag = 0;
-  if (!GetValueFromString(line, tag_value, &tag, error)) {
-    return false;
-  }
-  const std::string& crypto_suite = fields[1];
-  const std::string& key_params = fields[2];
-  std::string session_params;
-  if (fields.size() > 3) {
-    session_params = fields[3];
-  }
-  media_desc->AddCrypto(CryptoParams(tag, crypto_suite, key_params,
-                                     session_params));
-  return true;
-}
-
-// Updates or creates a new codec entry in the audio description with according
-// to |name|, |clockrate|, |bitrate|, and |channels|.
-void UpdateCodec(int payload_type,
-                 const std::string& name,
-                 int clockrate,
-                 int bitrate,
-                 size_t channels,
-                 AudioContentDescription* audio_desc) {
-  // Codec may already be populated with (only) optional parameters
-  // (from an fmtp).
-  cricket::AudioCodec codec =
-      GetCodecWithPayloadType(audio_desc->codecs(), payload_type);
-  codec.name = name;
-  codec.clockrate = clockrate;
-  codec.bitrate = bitrate;
-  codec.channels = channels;
-  AddOrReplaceCodec<AudioContentDescription, cricket::AudioCodec>(audio_desc,
-                                                                  codec);
-}
-
-// Updates or creates a new codec entry in the video description according to
-// |name|, |width|, |height|, and |framerate|.
-void UpdateCodec(int payload_type,
-                 const std::string& name,
-                 VideoContentDescription* video_desc) {
-  // Codec may already be populated with (only) optional parameters
-  // (from an fmtp).
-  cricket::VideoCodec codec =
-      GetCodecWithPayloadType(video_desc->codecs(), payload_type);
-  codec.name = name;
-  AddOrReplaceCodec<VideoContentDescription, cricket::VideoCodec>(video_desc,
-                                                                  codec);
-}
-
-bool ParseRtpmapAttribute(const std::string& line,
-                          const MediaType media_type,
-                          const std::vector<int>& payload_types,
-                          MediaContentDescription* media_desc,
-                          SdpParseError* error) {
-  std::vector<std::string> fields;
-  rtc::split(line.substr(kLinePrefixLength),
-                   kSdpDelimiterSpace, &fields);
-  // RFC 4566
-  // a=rtpmap:<payload type> <encoding name>/<clock rate>[/<encodingparameters>]
-  const size_t expected_min_fields = 2;
-  if (fields.size() < expected_min_fields) {
-    return ParseFailedExpectMinFieldNum(line, expected_min_fields, error);
-  }
-  std::string payload_type_value;
-  if (!GetValue(fields[0], kAttributeRtpmap, &payload_type_value, error)) {
-    return false;
-  }
-  int payload_type = 0;
-  if (!GetPayloadTypeFromString(line, payload_type_value, &payload_type,
-                                error)) {
-    return false;
-  }
-
-  if (std::find(payload_types.begin(), payload_types.end(), payload_type) ==
-      payload_types.end()) {
-    LOG(LS_WARNING) << "Ignore rtpmap line that did not appear in the "
-                    << "<fmt> of the m-line: " << line;
-    return true;
-  }
-  const std::string& encoder = fields[1];
-  std::vector<std::string> codec_params;
-  rtc::split(encoder, '/', &codec_params);
-  // <encoding name>/<clock rate>[/<encodingparameters>]
-  // 2 mandatory fields
-  if (codec_params.size() < 2 || codec_params.size() > 3) {
-    return ParseFailed(line,
-                       "Expected format \"<encoding name>/<clock rate>"
-                       "[/<encodingparameters>]\".",
-                       error);
-  }
-  const std::string& encoding_name = codec_params[0];
-  int clock_rate = 0;
-  if (!GetValueFromString(line, codec_params[1], &clock_rate, error)) {
-    return false;
-  }
-  if (media_type == cricket::MEDIA_TYPE_VIDEO) {
-    VideoContentDescription* video_desc =
-        static_cast<VideoContentDescription*>(media_desc);
-    UpdateCodec(payload_type, encoding_name,
-                video_desc);
-  } else if (media_type == cricket::MEDIA_TYPE_AUDIO) {
-    // RFC 4566
-    // For audio streams, <encoding parameters> indicates the number
-    // of audio channels.  This parameter is OPTIONAL and may be
-    // omitted if the number of channels is one, provided that no
-    // additional parameters are needed.
-    size_t channels = 1;
-    if (codec_params.size() == 3) {
-      if (!GetValueFromString(line, codec_params[2], &channels, error)) {
-        return false;
-      }
-    }
-    AudioContentDescription* audio_desc =
-        static_cast<AudioContentDescription*>(media_desc);
-    UpdateCodec(payload_type, encoding_name, clock_rate, 0, channels,
-                audio_desc);
-  } else if (media_type == cricket::MEDIA_TYPE_DATA) {
-    DataContentDescription* data_desc =
-        static_cast<DataContentDescription*>(media_desc);
-    data_desc->AddCodec(cricket::DataCodec(payload_type, encoding_name));
-  }
-  return true;
-}
-
-bool ParseFmtpParam(const std::string& line, std::string* parameter,
-                    std::string* value, SdpParseError* error) {
-  if (!rtc::tokenize_first(line, kSdpDelimiterEqual, parameter, value)) {
-    ParseFailed(line, "Unable to parse fmtp parameter. \'=\' missing.", error);
-    return false;
-  }
-  // a=fmtp:<payload_type> <param1>=<value1>; <param2>=<value2>; ...
-  return true;
-}
-
-bool ParseFmtpAttributes(const std::string& line, const MediaType media_type,
-                         MediaContentDescription* media_desc,
-                         SdpParseError* error) {
-  if (media_type != cricket::MEDIA_TYPE_AUDIO &&
-      media_type != cricket::MEDIA_TYPE_VIDEO) {
-    return true;
-  }
-
-  std::string line_payload;
-  std::string line_params;
-
-  // RFC 5576
-  // a=fmtp:<format> <format specific parameters>
-  // At least two fields, whereas the second one is any of the optional
-  // parameters.
-  if (!rtc::tokenize_first(line.substr(kLinePrefixLength), kSdpDelimiterSpace,
-                           &line_payload, &line_params)) {
-    ParseFailedExpectMinFieldNum(line, 2, error);
-    return false;
-  }
-
-  // Parse out the payload information.
-  std::string payload_type_str;
-  if (!GetValue(line_payload, kAttributeFmtp, &payload_type_str, error)) {
-    return false;
-  }
-
-  int payload_type = 0;
-  if (!GetPayloadTypeFromString(line_payload, payload_type_str, &payload_type,
-                                error)) {
-    return false;
-  }
-
-  // Parse out format specific parameters.
-  std::vector<std::string> fields;
-  rtc::split(line_params, kSdpDelimiterSemicolon, &fields);
-
-  cricket::CodecParameterMap codec_params;
-  for (auto& iter : fields) {
-    if (iter.find(kSdpDelimiterEqual) == std::string::npos) {
-      // Only fmtps with equals are currently supported. Other fmtp types
-      // should be ignored. Unknown fmtps do not constitute an error.
-      continue;
-    }
-
-    std::string name;
-    std::string value;
-    if (!ParseFmtpParam(rtc::string_trim(iter), &name, &value, error)) {
-      return false;
-    }
-    codec_params[name] = value;
-  }
-
-  if (media_type == cricket::MEDIA_TYPE_AUDIO) {
-    UpdateCodec<AudioContentDescription, cricket::AudioCodec>(
-        media_desc, payload_type, codec_params);
-  } else if (media_type == cricket::MEDIA_TYPE_VIDEO) {
-    UpdateCodec<VideoContentDescription, cricket::VideoCodec>(
-        media_desc, payload_type, codec_params);
-  }
-  return true;
-}
-
-bool ParseRtcpFbAttribute(const std::string& line, const MediaType media_type,
-                          MediaContentDescription* media_desc,
-                          SdpParseError* error) {
-  if (media_type != cricket::MEDIA_TYPE_AUDIO &&
-      media_type != cricket::MEDIA_TYPE_VIDEO) {
-    return true;
-  }
-  std::vector<std::string> rtcp_fb_fields;
-  rtc::split(line.c_str(), kSdpDelimiterSpace, &rtcp_fb_fields);
-  if (rtcp_fb_fields.size() < 2) {
-    return ParseFailedGetValue(line, kAttributeRtcpFb, error);
-  }
-  std::string payload_type_string;
-  if (!GetValue(rtcp_fb_fields[0], kAttributeRtcpFb, &payload_type_string,
-                error)) {
-    return false;
-  }
-  int payload_type = kWildcardPayloadType;
-  if (payload_type_string != "*") {
-    if (!GetPayloadTypeFromString(line, payload_type_string, &payload_type,
-                                  error)) {
-      return false;
-    }
-  }
-  std::string id = rtcp_fb_fields[1];
-  std::string param = "";
-  for (std::vector<std::string>::iterator iter = rtcp_fb_fields.begin() + 2;
-       iter != rtcp_fb_fields.end(); ++iter) {
-    param.append(*iter);
-  }
-  const cricket::FeedbackParam feedback_param(id, param);
-
-  if (media_type == cricket::MEDIA_TYPE_AUDIO) {
-    UpdateCodec<AudioContentDescription, cricket::AudioCodec>(
-        media_desc, payload_type, feedback_param);
-  } else if (media_type == cricket::MEDIA_TYPE_VIDEO) {
-    UpdateCodec<VideoContentDescription, cricket::VideoCodec>(
-        media_desc, payload_type, feedback_param);
-  }
-  return true;
-}
-
-}  // namespace webrtc
diff --git a/pc/webrtcsdp.h b/pc/webrtcsdp.h
deleted file mode 100644
index beaf0c5..0000000
--- a/pc/webrtcsdp.h
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- *  Copyright 2011 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.
- */
-
-// This file contain functions for parsing and serializing SDP messages.
-// Related RFC/draft including:
-// * RFC 4566 - SDP
-// * RFC 5245 - ICE
-// * RFC 3388 - Grouping of Media Lines in SDP
-// * RFC 4568 - SDP Security Descriptions for Media Streams
-// * draft-lennox-mmusic-sdp-source-selection-02 -
-//   Mechanisms for Media Source Selection in SDP
-
-#ifndef WEBRTC_PC_WEBRTCSDP_H_
-#define WEBRTC_PC_WEBRTCSDP_H_
-
-#include <string>
-
-namespace cricket {
-class Candidate;
-}  // namespace cricket
-
-namespace webrtc {
-class IceCandidateInterface;
-class JsepIceCandidate;
-class JsepSessionDescription;
-struct SdpParseError;
-
-// Serializes the passed in JsepSessionDescription.
-// Serialize SessionDescription including candidates if
-// JsepSessionDescription has candidates.
-// jdesc - The JsepSessionDescription object to be serialized.
-// unified_plan_sdp - If set to true, include "a=msid" lines where appropriate.
-// return - SDP string serialized from the arguments.
-std::string SdpSerialize(const JsepSessionDescription& jdesc,
-                         bool unified_plan_sdp);
-
-// Serializes the passed in IceCandidateInterface to a SDP string.
-// candidate - The candidate to be serialized.
-std::string SdpSerializeCandidate(const IceCandidateInterface& candidate);
-
-// Serializes a cricket Candidate.
-// candidate - The candidate to be serialized.
-std::string SdpSerializeCandidate(const cricket::Candidate& candidate);
-
-// Deserializes the passed in SDP string to a JsepSessionDescription.
-// message - SDP string to be Deserialized.
-// jdesc - The JsepSessionDescription deserialized from the SDP string.
-// error - The detail error information when parsing fails.
-// return - true on success, false on failure.
-bool SdpDeserialize(const std::string& message,
-                    JsepSessionDescription* jdesc,
-                    SdpParseError* error);
-
-// Deserializes the passed in SDP string to one JsepIceCandidate.
-// The first line must be a=candidate line and only the first line will be
-// parsed.
-// message - The SDP string to be Deserialized.
-// candidates - The JsepIceCandidate from the SDP string.
-// error - The detail error information when parsing fails.
-// return - true on success, false on failure.
-bool SdpDeserializeCandidate(const std::string& message,
-                             JsepIceCandidate* candidate,
-                             SdpParseError* error);
-
-// Deserializes the passed in SDP string to a cricket Candidate.
-// The first line must be a=candidate line and only the first line will be
-// parsed.
-// transport_name - The transport name (MID) of the candidate.
-// message - The SDP string to be deserialized.
-// candidate - The cricket Candidate from the SDP string.
-// error - The detail error information when parsing fails.
-// return - true on success, false on failure.
-bool SdpDeserializeCandidate(const std::string& transport_name,
-                             const std::string& message,
-                             cricket::Candidate* candidate,
-                             SdpParseError* error);
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_PC_WEBRTCSDP_H_
diff --git a/pc/webrtcsdp_unittest.cc b/pc/webrtcsdp_unittest.cc
deleted file mode 100644
index 56066cf..0000000
--- a/pc/webrtcsdp_unittest.cc
+++ /dev/null
@@ -1,3585 +0,0 @@
-/*
- *  Copyright 2011 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 <memory>
-#include <set>
-#include <string>
-#include <vector>
-
-#include "webrtc/api/jsepsessiondescription.h"
-#include "webrtc/media/base/mediaconstants.h"
-#include "webrtc/media/engine/webrtcvideoengine.h"
-#include "webrtc/modules/video_coding/codecs/h264/include/h264.h"
-#include "webrtc/p2p/base/p2pconstants.h"
-#include "webrtc/pc/mediasession.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/gunit.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/messagedigest.h"
-#include "webrtc/rtc_base/sslfingerprint.h"
-#include "webrtc/rtc_base/stringencode.h"
-#include "webrtc/rtc_base/stringutils.h"
-#ifdef WEBRTC_ANDROID
-#include "webrtc/pc/test/androidtestinitializer.h"
-#endif
-#include "webrtc/pc/webrtcsdp.h"
-
-using cricket::AudioCodec;
-using cricket::AudioContentDescription;
-using cricket::Candidate;
-using cricket::ContentInfo;
-using cricket::CryptoParams;
-using cricket::ContentGroup;
-using cricket::DataCodec;
-using cricket::DataContentDescription;
-using cricket::ICE_CANDIDATE_COMPONENT_RTCP;
-using cricket::ICE_CANDIDATE_COMPONENT_RTP;
-using cricket::kFecSsrcGroupSemantics;
-using cricket::LOCAL_PORT_TYPE;
-using cricket::NS_JINGLE_DRAFT_SCTP;
-using cricket::NS_JINGLE_RTP;
-using cricket::RELAY_PORT_TYPE;
-using cricket::SessionDescription;
-using cricket::StreamParams;
-using cricket::STUN_PORT_TYPE;
-using cricket::TransportDescription;
-using cricket::TransportInfo;
-using cricket::VideoCodec;
-using cricket::VideoContentDescription;
-using webrtc::IceCandidateCollection;
-using webrtc::IceCandidateInterface;
-using webrtc::JsepIceCandidate;
-using webrtc::JsepSessionDescription;
-using webrtc::RtpExtension;
-using webrtc::SdpParseError;
-using webrtc::SessionDescriptionInterface;
-
-typedef std::vector<AudioCodec> AudioCodecs;
-typedef std::vector<Candidate> Candidates;
-
-static const uint32_t kDefaultSctpPort = 5000;
-static const char kDefaultSctpPortStr[] = "5000";
-static const uint16_t kUnusualSctpPort = 9556;
-static const char kUnusualSctpPortStr[] = "9556";
-static const char kSessionTime[] = "t=0 0\r\n";
-static const uint32_t kCandidatePriority = 2130706432U;  // pref = 1.0
-static const char kAttributeIceUfragVoice[] = "a=ice-ufrag:ufrag_voice\r\n";
-static const char kAttributeIcePwdVoice[] = "a=ice-pwd:pwd_voice\r\n";
-static const char kAttributeIceUfragVideo[] = "a=ice-ufrag:ufrag_video\r\n";
-static const char kAttributeIcePwdVideo[] = "a=ice-pwd:pwd_video\r\n";
-static const uint32_t kCandidateGeneration = 2;
-static const char kCandidateFoundation1[] = "a0+B/1";
-static const char kCandidateFoundation2[] = "a0+B/2";
-static const char kCandidateFoundation3[] = "a0+B/3";
-static const char kCandidateFoundation4[] = "a0+B/4";
-static const char kAttributeCryptoVoice[] =
-    "a=crypto:1 AES_CM_128_HMAC_SHA1_32 "
-    "inline:NzB4d1BINUAvLEw6UzF3WSJ+PSdFcGdUJShpX1Zj|2^20|1:32 "
-    "dummy_session_params\r\n";
-static const char kAttributeCryptoVideo[] =
-    "a=crypto:1 AES_CM_128_HMAC_SHA1_80 "
-    "inline:d0RmdmcmVCspeEc3QGZiNWpVLFJhQX1cfHAwJSoj|2^20|1:32\r\n";
-static const char kFingerprint[] = "a=fingerprint:sha-1 "
-    "4A:AD:B9:B1:3F:82:18:3B:54:02:12:DF:3E:5D:49:6B:19:E5:7C:AB\r\n";
-static const int kExtmapId = 1;
-static const char kExtmapUri[] = "http://example.com/082005/ext.htm#ttime";
-static const char kExtmap[] =
-    "a=extmap:1 http://example.com/082005/ext.htm#ttime\r\n";
-static const char kExtmapWithDirectionAndAttribute[] =
-    "a=extmap:1/sendrecv http://example.com/082005/ext.htm#ttime a1 a2\r\n";
-static const char kExtmapWithDirectionAndAttributeEncrypted[] =
-    "a=extmap:1/sendrecv urn:ietf:params:rtp-hdrext:encrypt "
-    "http://example.com/082005/ext.htm#ttime a1 a2\r\n";
-
-static const uint8_t kIdentityDigest[] = {
-    0x4A, 0xAD, 0xB9, 0xB1, 0x3F, 0x82, 0x18, 0x3B, 0x54, 0x02,
-    0x12, 0xDF, 0x3E, 0x5D, 0x49, 0x6B, 0x19, 0xE5, 0x7C, 0xAB};
-
-static const char kDtlsSctp[] = "DTLS/SCTP";
-static const char kUdpDtlsSctp[] = "UDP/DTLS/SCTP";
-static const char kTcpDtlsSctp[] = "TCP/DTLS/SCTP";
-
-struct CodecParams {
-  int max_ptime;
-  int ptime;
-  int min_ptime;
-  int sprop_stereo;
-  int stereo;
-  int useinband;
-  int maxaveragebitrate;
-};
-
-// TODO(deadbeef): In these reference strings, use "a=fingerprint" by default
-// instead of "a=crypto", and have an explicit test for adding "a=crypto".
-// Currently it's the other way around.
-
-// Reference sdp string
-static const char kSdpFullString[] =
-    "v=0\r\n"
-    "o=- 18446744069414584320 18446462598732840960 IN IP4 127.0.0.1\r\n"
-    "s=-\r\n"
-    "t=0 0\r\n"
-    "a=msid-semantic: WMS local_stream_1\r\n"
-    "m=audio 2345 RTP/SAVPF 111 103 104\r\n"
-    "c=IN IP4 74.125.127.126\r\n"
-    "a=rtcp:2347 IN IP4 74.125.127.126\r\n"
-    "a=candidate:a0+B/1 1 udp 2130706432 192.168.1.5 1234 typ host "
-    "generation 2\r\n"
-    "a=candidate:a0+B/1 2 udp 2130706432 192.168.1.5 1235 typ host "
-    "generation 2\r\n"
-    "a=candidate:a0+B/2 1 udp 2130706432 ::1 1238 typ host "
-    "generation 2\r\n"
-    "a=candidate:a0+B/2 2 udp 2130706432 ::1 1239 typ host "
-    "generation 2\r\n"
-    "a=candidate:a0+B/3 1 udp 2130706432 74.125.127.126 2345 typ srflx "
-    "raddr 192.168.1.5 rport 2346 "
-    "generation 2\r\n"
-    "a=candidate:a0+B/3 2 udp 2130706432 74.125.127.126 2347 typ srflx "
-    "raddr 192.168.1.5 rport 2348 "
-    "generation 2\r\n"
-    "a=ice-ufrag:ufrag_voice\r\na=ice-pwd:pwd_voice\r\n"
-    "a=mid:audio_content_name\r\n"
-    "a=sendrecv\r\n"
-    "a=rtcp-mux\r\n"
-    "a=rtcp-rsize\r\n"
-    "a=crypto:1 AES_CM_128_HMAC_SHA1_32 "
-    "inline:NzB4d1BINUAvLEw6UzF3WSJ+PSdFcGdUJShpX1Zj|2^20|1:32 "
-    "dummy_session_params\r\n"
-    "a=rtpmap:111 opus/48000/2\r\n"
-    "a=rtpmap:103 ISAC/16000\r\n"
-    "a=rtpmap:104 ISAC/32000\r\n"
-    "a=ssrc:1 cname:stream_1_cname\r\n"
-    "a=ssrc:1 msid:local_stream_1 audio_track_id_1\r\n"
-    "a=ssrc:1 mslabel:local_stream_1\r\n"
-    "a=ssrc:1 label:audio_track_id_1\r\n"
-    "m=video 3457 RTP/SAVPF 120\r\n"
-    "c=IN IP4 74.125.224.39\r\n"
-    "a=rtcp:3456 IN IP4 74.125.224.39\r\n"
-    "a=candidate:a0+B/1 2 udp 2130706432 192.168.1.5 1236 typ host "
-    "generation 2\r\n"
-    "a=candidate:a0+B/1 1 udp 2130706432 192.168.1.5 1237 typ host "
-    "generation 2\r\n"
-    "a=candidate:a0+B/2 2 udp 2130706432 ::1 1240 typ host "
-    "generation 2\r\n"
-    "a=candidate:a0+B/2 1 udp 2130706432 ::1 1241 typ host "
-    "generation 2\r\n"
-    "a=candidate:a0+B/4 2 udp 2130706432 74.125.224.39 3456 typ relay "
-    "generation 2\r\n"
-    "a=candidate:a0+B/4 1 udp 2130706432 74.125.224.39 3457 typ relay "
-    "generation 2\r\n"
-    "a=ice-ufrag:ufrag_video\r\na=ice-pwd:pwd_video\r\n"
-    "a=mid:video_content_name\r\n"
-    "a=sendrecv\r\n"
-    "a=crypto:1 AES_CM_128_HMAC_SHA1_80 "
-    "inline:d0RmdmcmVCspeEc3QGZiNWpVLFJhQX1cfHAwJSoj|2^20|1:32\r\n"
-    "a=rtpmap:120 VP8/90000\r\n"
-    "a=ssrc-group:FEC 2 3\r\n"
-    "a=ssrc:2 cname:stream_1_cname\r\n"
-    "a=ssrc:2 msid:local_stream_1 video_track_id_1\r\n"
-    "a=ssrc:2 mslabel:local_stream_1\r\n"
-    "a=ssrc:2 label:video_track_id_1\r\n"
-    "a=ssrc:3 cname:stream_1_cname\r\n"
-    "a=ssrc:3 msid:local_stream_1 video_track_id_1\r\n"
-    "a=ssrc:3 mslabel:local_stream_1\r\n"
-    "a=ssrc:3 label:video_track_id_1\r\n";
-
-// SDP reference string without the candidates.
-static const char kSdpString[] =
-    "v=0\r\n"
-    "o=- 18446744069414584320 18446462598732840960 IN IP4 127.0.0.1\r\n"
-    "s=-\r\n"
-    "t=0 0\r\n"
-    "a=msid-semantic: WMS local_stream_1\r\n"
-    "m=audio 9 RTP/SAVPF 111 103 104\r\n"
-    "c=IN IP4 0.0.0.0\r\n"
-    "a=rtcp:9 IN IP4 0.0.0.0\r\n"
-    "a=ice-ufrag:ufrag_voice\r\na=ice-pwd:pwd_voice\r\n"
-    "a=mid:audio_content_name\r\n"
-    "a=sendrecv\r\n"
-    "a=rtcp-mux\r\n"
-    "a=rtcp-rsize\r\n"
-    "a=crypto:1 AES_CM_128_HMAC_SHA1_32 "
-    "inline:NzB4d1BINUAvLEw6UzF3WSJ+PSdFcGdUJShpX1Zj|2^20|1:32 "
-    "dummy_session_params\r\n"
-    "a=rtpmap:111 opus/48000/2\r\n"
-    "a=rtpmap:103 ISAC/16000\r\n"
-    "a=rtpmap:104 ISAC/32000\r\n"
-    "a=ssrc:1 cname:stream_1_cname\r\n"
-    "a=ssrc:1 msid:local_stream_1 audio_track_id_1\r\n"
-    "a=ssrc:1 mslabel:local_stream_1\r\n"
-    "a=ssrc:1 label:audio_track_id_1\r\n"
-    "m=video 9 RTP/SAVPF 120\r\n"
-    "c=IN IP4 0.0.0.0\r\n"
-    "a=rtcp:9 IN IP4 0.0.0.0\r\n"
-    "a=ice-ufrag:ufrag_video\r\na=ice-pwd:pwd_video\r\n"
-    "a=mid:video_content_name\r\n"
-    "a=sendrecv\r\n"
-    "a=crypto:1 AES_CM_128_HMAC_SHA1_80 "
-    "inline:d0RmdmcmVCspeEc3QGZiNWpVLFJhQX1cfHAwJSoj|2^20|1:32\r\n"
-    "a=rtpmap:120 VP8/90000\r\n"
-    "a=ssrc-group:FEC 2 3\r\n"
-    "a=ssrc:2 cname:stream_1_cname\r\n"
-    "a=ssrc:2 msid:local_stream_1 video_track_id_1\r\n"
-    "a=ssrc:2 mslabel:local_stream_1\r\n"
-    "a=ssrc:2 label:video_track_id_1\r\n"
-    "a=ssrc:3 cname:stream_1_cname\r\n"
-    "a=ssrc:3 msid:local_stream_1 video_track_id_1\r\n"
-    "a=ssrc:3 mslabel:local_stream_1\r\n"
-    "a=ssrc:3 label:video_track_id_1\r\n";
-
-static const char kSdpRtpDataChannelString[] =
-    "m=application 9 RTP/SAVPF 101\r\n"
-    "c=IN IP4 0.0.0.0\r\n"
-    "a=rtcp:9 IN IP4 0.0.0.0\r\n"
-    "a=ice-ufrag:ufrag_data\r\n"
-    "a=ice-pwd:pwd_data\r\n"
-    "a=mid:data_content_name\r\n"
-    "a=sendrecv\r\n"
-    "a=crypto:1 AES_CM_128_HMAC_SHA1_80 "
-    "inline:FvLcvU2P3ZWmQxgPAgcDu7Zl9vftYElFOjEzhWs5\r\n"
-    "a=rtpmap:101 google-data/90000\r\n"
-    "a=ssrc:10 cname:data_channel_cname\r\n"
-    "a=ssrc:10 msid:data_channel data_channeld0\r\n"
-    "a=ssrc:10 mslabel:data_channel\r\n"
-    "a=ssrc:10 label:data_channeld0\r\n";
-
-static const char kSdpSctpDataChannelString[] =
-    "m=application 9 DTLS/SCTP 5000\r\n"
-    "c=IN IP4 0.0.0.0\r\n"
-    "a=ice-ufrag:ufrag_data\r\n"
-    "a=ice-pwd:pwd_data\r\n"
-    "a=mid:data_content_name\r\n"
-    "a=sctpmap:5000 webrtc-datachannel 1024\r\n";
-
-// draft-ietf-mmusic-sctp-sdp-12
-static const char kSdpSctpDataChannelStringWithSctpPort[] =
-    "m=application 9 DTLS/SCTP webrtc-datachannel\r\n"
-    "a=max-message-size=100000\r\n"
-    "a=sctp-port 5000\r\n"
-    "c=IN IP4 0.0.0.0\r\n"
-    "a=ice-ufrag:ufrag_data\r\n"
-    "a=ice-pwd:pwd_data\r\n"
-    "a=mid:data_content_name\r\n";
-
-static const char kSdpSctpDataChannelStringWithSctpColonPort[] =
-    "m=application 9 DTLS/SCTP webrtc-datachannel\r\n"
-    "a=max-message-size=100000\r\n"
-    "a=sctp-port:5000\r\n"
-    "c=IN IP4 0.0.0.0\r\n"
-    "a=ice-ufrag:ufrag_data\r\n"
-    "a=ice-pwd:pwd_data\r\n"
-    "a=mid:data_content_name\r\n";
-
-static const char kSdpSctpDataChannelWithCandidatesString[] =
-    "m=application 2345 DTLS/SCTP 5000\r\n"
-    "c=IN IP4 74.125.127.126\r\n"
-    "a=candidate:a0+B/1 1 udp 2130706432 192.168.1.5 1234 typ host "
-    "generation 2\r\n"
-    "a=candidate:a0+B/2 1 udp 2130706432 ::1 1238 typ host "
-    "generation 2\r\n"
-    "a=candidate:a0+B/3 1 udp 2130706432 74.125.127.126 2345 typ srflx "
-    "raddr 192.168.1.5 rport 2346 "
-    "generation 2\r\n"
-    "a=ice-ufrag:ufrag_data\r\n"
-    "a=ice-pwd:pwd_data\r\n"
-    "a=mid:data_content_name\r\n"
-    "a=sctpmap:5000 webrtc-datachannel 1024\r\n";
-
-static const char kSdpConferenceString[] =
-    "v=0\r\n"
-    "o=- 18446744069414584320 18446462598732840960 IN IP4 127.0.0.1\r\n"
-    "s=-\r\n"
-    "t=0 0\r\n"
-    "a=msid-semantic: WMS\r\n"
-    "m=audio 9 RTP/SAVPF 111 103 104\r\n"
-    "c=IN IP4 0.0.0.0\r\n"
-    "a=x-google-flag:conference\r\n"
-    "m=video 9 RTP/SAVPF 120\r\n"
-    "c=IN IP4 0.0.0.0\r\n"
-    "a=x-google-flag:conference\r\n";
-
-static const char kSdpSessionString[] =
-    "v=0\r\n"
-    "o=- 18446744069414584320 18446462598732840960 IN IP4 127.0.0.1\r\n"
-    "s=-\r\n"
-    "t=0 0\r\n"
-    "a=msid-semantic: WMS local_stream\r\n";
-
-static const char kSdpAudioString[] =
-    "m=audio 9 RTP/SAVPF 111\r\n"
-    "c=IN IP4 0.0.0.0\r\n"
-    "a=rtcp:9 IN IP4 0.0.0.0\r\n"
-    "a=ice-ufrag:ufrag_voice\r\na=ice-pwd:pwd_voice\r\n"
-    "a=mid:audio_content_name\r\n"
-    "a=sendrecv\r\n"
-    "a=rtpmap:111 opus/48000/2\r\n"
-    "a=ssrc:1 cname:stream_1_cname\r\n"
-    "a=ssrc:1 msid:local_stream audio_track_id_1\r\n"
-    "a=ssrc:1 mslabel:local_stream\r\n"
-    "a=ssrc:1 label:audio_track_id_1\r\n";
-
-static const char kSdpVideoString[] =
-    "m=video 9 RTP/SAVPF 120\r\n"
-    "c=IN IP4 0.0.0.0\r\n"
-    "a=rtcp:9 IN IP4 0.0.0.0\r\n"
-    "a=ice-ufrag:ufrag_video\r\na=ice-pwd:pwd_video\r\n"
-    "a=mid:video_content_name\r\n"
-    "a=sendrecv\r\n"
-    "a=rtpmap:120 VP8/90000\r\n"
-    "a=ssrc:2 cname:stream_1_cname\r\n"
-    "a=ssrc:2 msid:local_stream video_track_id_1\r\n"
-    "a=ssrc:2 mslabel:local_stream\r\n"
-    "a=ssrc:2 label:video_track_id_1\r\n";
-
-// Reference sdp string using bundle-only.
-static const char kBundleOnlySdpFullString[] =
-    "v=0\r\n"
-    "o=- 18446744069414584320 18446462598732840960 IN IP4 127.0.0.1\r\n"
-    "s=-\r\n"
-    "t=0 0\r\n"
-    "a=group:BUNDLE audio_content_name video_content_name\r\n"
-    "a=msid-semantic: WMS local_stream_1\r\n"
-    "m=audio 2345 RTP/SAVPF 111 103 104\r\n"
-    "c=IN IP4 74.125.127.126\r\n"
-    "a=rtcp:2347 IN IP4 74.125.127.126\r\n"
-    "a=candidate:a0+B/1 1 udp 2130706432 192.168.1.5 1234 typ host "
-    "generation 2\r\n"
-    "a=candidate:a0+B/1 2 udp 2130706432 192.168.1.5 1235 typ host "
-    "generation 2\r\n"
-    "a=candidate:a0+B/2 1 udp 2130706432 ::1 1238 typ host "
-    "generation 2\r\n"
-    "a=candidate:a0+B/2 2 udp 2130706432 ::1 1239 typ host "
-    "generation 2\r\n"
-    "a=candidate:a0+B/3 1 udp 2130706432 74.125.127.126 2345 typ srflx "
-    "raddr 192.168.1.5 rport 2346 "
-    "generation 2\r\n"
-    "a=candidate:a0+B/3 2 udp 2130706432 74.125.127.126 2347 typ srflx "
-    "raddr 192.168.1.5 rport 2348 "
-    "generation 2\r\n"
-    "a=ice-ufrag:ufrag_voice\r\na=ice-pwd:pwd_voice\r\n"
-    "a=mid:audio_content_name\r\n"
-    "a=sendrecv\r\n"
-    "a=rtcp-mux\r\n"
-    "a=rtcp-rsize\r\n"
-    "a=crypto:1 AES_CM_128_HMAC_SHA1_32 "
-    "inline:NzB4d1BINUAvLEw6UzF3WSJ+PSdFcGdUJShpX1Zj|2^20|1:32 "
-    "dummy_session_params\r\n"
-    "a=rtpmap:111 opus/48000/2\r\n"
-    "a=rtpmap:103 ISAC/16000\r\n"
-    "a=rtpmap:104 ISAC/32000\r\n"
-    "a=ssrc:1 cname:stream_1_cname\r\n"
-    "a=ssrc:1 msid:local_stream_1 audio_track_id_1\r\n"
-    "a=ssrc:1 mslabel:local_stream_1\r\n"
-    "a=ssrc:1 label:audio_track_id_1\r\n"
-    "m=video 0 RTP/SAVPF 120\r\n"
-    "c=IN IP4 0.0.0.0\r\n"
-    "a=rtcp:9 IN IP4 0.0.0.0\r\n"
-    "a=bundle-only\r\n"
-    "a=mid:video_content_name\r\n"
-    "a=sendrecv\r\n"
-    "a=crypto:1 AES_CM_128_HMAC_SHA1_80 "
-    "inline:d0RmdmcmVCspeEc3QGZiNWpVLFJhQX1cfHAwJSoj|2^20|1:32\r\n"
-    "a=rtpmap:120 VP8/90000\r\n"
-    "a=ssrc-group:FEC 2 3\r\n"
-    "a=ssrc:2 cname:stream_1_cname\r\n"
-    "a=ssrc:2 msid:local_stream_1 video_track_id_1\r\n"
-    "a=ssrc:2 mslabel:local_stream_1\r\n"
-    "a=ssrc:2 label:video_track_id_1\r\n"
-    "a=ssrc:3 cname:stream_1_cname\r\n"
-    "a=ssrc:3 msid:local_stream_1 video_track_id_1\r\n"
-    "a=ssrc:3 mslabel:local_stream_1\r\n"
-    "a=ssrc:3 label:video_track_id_1\r\n";
-
-// Plan B SDP reference string, with 2 streams, 2 audio tracks and 3 video
-// tracks.
-static const char kPlanBSdpFullString[] =
-    "v=0\r\n"
-    "o=- 18446744069414584320 18446462598732840960 IN IP4 127.0.0.1\r\n"
-    "s=-\r\n"
-    "t=0 0\r\n"
-    "a=msid-semantic: WMS local_stream_1 local_stream_2\r\n"
-    "m=audio 2345 RTP/SAVPF 111 103 104\r\n"
-    "c=IN IP4 74.125.127.126\r\n"
-    "a=rtcp:2347 IN IP4 74.125.127.126\r\n"
-    "a=candidate:a0+B/1 1 udp 2130706432 192.168.1.5 1234 typ host "
-    "generation 2\r\n"
-    "a=candidate:a0+B/1 2 udp 2130706432 192.168.1.5 1235 typ host "
-    "generation 2\r\n"
-    "a=candidate:a0+B/2 1 udp 2130706432 ::1 1238 typ host "
-    "generation 2\r\n"
-    "a=candidate:a0+B/2 2 udp 2130706432 ::1 1239 typ host "
-    "generation 2\r\n"
-    "a=candidate:a0+B/3 1 udp 2130706432 74.125.127.126 2345 typ srflx "
-    "raddr 192.168.1.5 rport 2346 "
-    "generation 2\r\n"
-    "a=candidate:a0+B/3 2 udp 2130706432 74.125.127.126 2347 typ srflx "
-    "raddr 192.168.1.5 rport 2348 "
-    "generation 2\r\n"
-    "a=ice-ufrag:ufrag_voice\r\na=ice-pwd:pwd_voice\r\n"
-    "a=mid:audio_content_name\r\n"
-    "a=sendrecv\r\n"
-    "a=rtcp-mux\r\n"
-    "a=rtcp-rsize\r\n"
-    "a=crypto:1 AES_CM_128_HMAC_SHA1_32 "
-    "inline:NzB4d1BINUAvLEw6UzF3WSJ+PSdFcGdUJShpX1Zj|2^20|1:32 "
-    "dummy_session_params\r\n"
-    "a=rtpmap:111 opus/48000/2\r\n"
-    "a=rtpmap:103 ISAC/16000\r\n"
-    "a=rtpmap:104 ISAC/32000\r\n"
-    "a=ssrc:1 cname:stream_1_cname\r\n"
-    "a=ssrc:1 msid:local_stream_1 audio_track_id_1\r\n"
-    "a=ssrc:1 mslabel:local_stream_1\r\n"
-    "a=ssrc:1 label:audio_track_id_1\r\n"
-    "a=ssrc:4 cname:stream_2_cname\r\n"
-    "a=ssrc:4 msid:local_stream_2 audio_track_id_2\r\n"
-    "a=ssrc:4 mslabel:local_stream_2\r\n"
-    "a=ssrc:4 label:audio_track_id_2\r\n"
-    "m=video 3457 RTP/SAVPF 120\r\n"
-    "c=IN IP4 74.125.224.39\r\n"
-    "a=rtcp:3456 IN IP4 74.125.224.39\r\n"
-    "a=candidate:a0+B/1 2 udp 2130706432 192.168.1.5 1236 typ host "
-    "generation 2\r\n"
-    "a=candidate:a0+B/1 1 udp 2130706432 192.168.1.5 1237 typ host "
-    "generation 2\r\n"
-    "a=candidate:a0+B/2 2 udp 2130706432 ::1 1240 typ host "
-    "generation 2\r\n"
-    "a=candidate:a0+B/2 1 udp 2130706432 ::1 1241 typ host "
-    "generation 2\r\n"
-    "a=candidate:a0+B/4 2 udp 2130706432 74.125.224.39 3456 typ relay "
-    "generation 2\r\n"
-    "a=candidate:a0+B/4 1 udp 2130706432 74.125.224.39 3457 typ relay "
-    "generation 2\r\n"
-    "a=ice-ufrag:ufrag_video\r\na=ice-pwd:pwd_video\r\n"
-    "a=mid:video_content_name\r\n"
-    "a=sendrecv\r\n"
-    "a=crypto:1 AES_CM_128_HMAC_SHA1_80 "
-    "inline:d0RmdmcmVCspeEc3QGZiNWpVLFJhQX1cfHAwJSoj|2^20|1:32\r\n"
-    "a=rtpmap:120 VP8/90000\r\n"
-    "a=ssrc-group:FEC 2 3\r\n"
-    "a=ssrc:2 cname:stream_1_cname\r\n"
-    "a=ssrc:2 msid:local_stream_1 video_track_id_1\r\n"
-    "a=ssrc:2 mslabel:local_stream_1\r\n"
-    "a=ssrc:2 label:video_track_id_1\r\n"
-    "a=ssrc:3 cname:stream_1_cname\r\n"
-    "a=ssrc:3 msid:local_stream_1 video_track_id_1\r\n"
-    "a=ssrc:3 mslabel:local_stream_1\r\n"
-    "a=ssrc:3 label:video_track_id_1\r\n"
-    "a=ssrc:5 cname:stream_2_cname\r\n"
-    "a=ssrc:5 msid:local_stream_2 video_track_id_2\r\n"
-    "a=ssrc:5 mslabel:local_stream_2\r\n"
-    "a=ssrc:5 label:video_track_id_2\r\n"
-    "a=ssrc:6 cname:stream_2_cname\r\n"
-    "a=ssrc:6 msid:local_stream_2 video_track_id_3\r\n"
-    "a=ssrc:6 mslabel:local_stream_2\r\n"
-    "a=ssrc:6 label:video_track_id_3\r\n";
-
-// Plan B SDP reference string, with 2 streams, 2 audio tracks and 3 video
-// tracks, but with the unified plan "a=msid" attribute.
-static const char kPlanBSdpFullStringWithMsid[] =
-    "v=0\r\n"
-    "o=- 18446744069414584320 18446462598732840960 IN IP4 127.0.0.1\r\n"
-    "s=-\r\n"
-    "t=0 0\r\n"
-    "a=msid-semantic: WMS local_stream_1 local_stream_2\r\n"
-    "m=audio 2345 RTP/SAVPF 111 103 104\r\n"
-    "c=IN IP4 74.125.127.126\r\n"
-    "a=rtcp:2347 IN IP4 74.125.127.126\r\n"
-    "a=candidate:a0+B/1 1 udp 2130706432 192.168.1.5 1234 typ host "
-    "generation 2\r\n"
-    "a=candidate:a0+B/1 2 udp 2130706432 192.168.1.5 1235 typ host "
-    "generation 2\r\n"
-    "a=candidate:a0+B/2 1 udp 2130706432 ::1 1238 typ host "
-    "generation 2\r\n"
-    "a=candidate:a0+B/2 2 udp 2130706432 ::1 1239 typ host "
-    "generation 2\r\n"
-    "a=candidate:a0+B/3 1 udp 2130706432 74.125.127.126 2345 typ srflx "
-    "raddr 192.168.1.5 rport 2346 "
-    "generation 2\r\n"
-    "a=candidate:a0+B/3 2 udp 2130706432 74.125.127.126 2347 typ srflx "
-    "raddr 192.168.1.5 rport 2348 "
-    "generation 2\r\n"
-    "a=ice-ufrag:ufrag_voice\r\na=ice-pwd:pwd_voice\r\n"
-    "a=mid:audio_content_name\r\n"
-    "a=msid:local_stream_1 audio_track_id_1\r\n"
-    "a=sendrecv\r\n"
-    "a=rtcp-mux\r\n"
-    "a=rtcp-rsize\r\n"
-    "a=crypto:1 AES_CM_128_HMAC_SHA1_32 "
-    "inline:NzB4d1BINUAvLEw6UzF3WSJ+PSdFcGdUJShpX1Zj|2^20|1:32 "
-    "dummy_session_params\r\n"
-    "a=rtpmap:111 opus/48000/2\r\n"
-    "a=rtpmap:103 ISAC/16000\r\n"
-    "a=rtpmap:104 ISAC/32000\r\n"
-    "a=ssrc:1 cname:stream_1_cname\r\n"
-    "a=ssrc:1 msid:local_stream_1 audio_track_id_1\r\n"
-    "a=ssrc:1 mslabel:local_stream_1\r\n"
-    "a=ssrc:1 label:audio_track_id_1\r\n"
-    "a=ssrc:4 cname:stream_2_cname\r\n"
-    "a=ssrc:4 msid:local_stream_2 audio_track_id_2\r\n"
-    "a=ssrc:4 mslabel:local_stream_2\r\n"
-    "a=ssrc:4 label:audio_track_id_2\r\n"
-    "m=video 3457 RTP/SAVPF 120\r\n"
-    "c=IN IP4 74.125.224.39\r\n"
-    "a=rtcp:3456 IN IP4 74.125.224.39\r\n"
-    "a=candidate:a0+B/1 2 udp 2130706432 192.168.1.5 1236 typ host "
-    "generation 2\r\n"
-    "a=candidate:a0+B/1 1 udp 2130706432 192.168.1.5 1237 typ host "
-    "generation 2\r\n"
-    "a=candidate:a0+B/2 2 udp 2130706432 ::1 1240 typ host "
-    "generation 2\r\n"
-    "a=candidate:a0+B/2 1 udp 2130706432 ::1 1241 typ host "
-    "generation 2\r\n"
-    "a=candidate:a0+B/4 2 udp 2130706432 74.125.224.39 3456 typ relay "
-    "generation 2\r\n"
-    "a=candidate:a0+B/4 1 udp 2130706432 74.125.224.39 3457 typ relay "
-    "generation 2\r\n"
-    "a=ice-ufrag:ufrag_video\r\na=ice-pwd:pwd_video\r\n"
-    "a=mid:video_content_name\r\n"
-    "a=msid:local_stream_1 video_track_id_1\r\n"
-    "a=sendrecv\r\n"
-    "a=crypto:1 AES_CM_128_HMAC_SHA1_80 "
-    "inline:d0RmdmcmVCspeEc3QGZiNWpVLFJhQX1cfHAwJSoj|2^20|1:32\r\n"
-    "a=rtpmap:120 VP8/90000\r\n"
-    "a=ssrc-group:FEC 2 3\r\n"
-    "a=ssrc:2 cname:stream_1_cname\r\n"
-    "a=ssrc:2 msid:local_stream_1 video_track_id_1\r\n"
-    "a=ssrc:2 mslabel:local_stream_1\r\n"
-    "a=ssrc:2 label:video_track_id_1\r\n"
-    "a=ssrc:3 cname:stream_1_cname\r\n"
-    "a=ssrc:3 msid:local_stream_1 video_track_id_1\r\n"
-    "a=ssrc:3 mslabel:local_stream_1\r\n"
-    "a=ssrc:3 label:video_track_id_1\r\n"
-    "a=ssrc:5 cname:stream_2_cname\r\n"
-    "a=ssrc:5 msid:local_stream_2 video_track_id_2\r\n"
-    "a=ssrc:5 mslabel:local_stream_2\r\n"
-    "a=ssrc:5 label:video_track_id_2\r\n"
-    "a=ssrc:6 cname:stream_2_cname\r\n"
-    "a=ssrc:6 msid:local_stream_2 video_track_id_3\r\n"
-    "a=ssrc:6 mslabel:local_stream_2\r\n"
-    "a=ssrc:6 label:video_track_id_3\r\n";
-
-// Unified Plan SDP reference string, with 2 streams, 2 audio tracks and 3 video
-// tracks.
-static const char kUnifiedPlanSdpFullString[] =
-    "v=0\r\n"
-    "o=- 18446744069414584320 18446462598732840960 IN IP4 127.0.0.1\r\n"
-    "s=-\r\n"
-    "t=0 0\r\n"
-    "a=msid-semantic: WMS local_stream_1\r\n"
-    // Audio track 1, stream 1 (with candidates).
-    "m=audio 2345 RTP/SAVPF 111 103 104\r\n"
-    "c=IN IP4 74.125.127.126\r\n"
-    "a=rtcp:2347 IN IP4 74.125.127.126\r\n"
-    "a=candidate:a0+B/1 1 udp 2130706432 192.168.1.5 1234 typ host "
-    "generation 2\r\n"
-    "a=candidate:a0+B/1 2 udp 2130706432 192.168.1.5 1235 typ host "
-    "generation 2\r\n"
-    "a=candidate:a0+B/2 1 udp 2130706432 ::1 1238 typ host "
-    "generation 2\r\n"
-    "a=candidate:a0+B/2 2 udp 2130706432 ::1 1239 typ host "
-    "generation 2\r\n"
-    "a=candidate:a0+B/3 1 udp 2130706432 74.125.127.126 2345 typ srflx "
-    "raddr 192.168.1.5 rport 2346 "
-    "generation 2\r\n"
-    "a=candidate:a0+B/3 2 udp 2130706432 74.125.127.126 2347 typ srflx "
-    "raddr 192.168.1.5 rport 2348 "
-    "generation 2\r\n"
-    "a=ice-ufrag:ufrag_voice\r\na=ice-pwd:pwd_voice\r\n"
-    "a=mid:audio_content_name\r\n"
-    "a=msid:local_stream_1 audio_track_id_1\r\n"
-    "a=sendrecv\r\n"
-    "a=rtcp-mux\r\n"
-    "a=rtcp-rsize\r\n"
-    "a=crypto:1 AES_CM_128_HMAC_SHA1_32 "
-    "inline:NzB4d1BINUAvLEw6UzF3WSJ+PSdFcGdUJShpX1Zj|2^20|1:32 "
-    "dummy_session_params\r\n"
-    "a=rtpmap:111 opus/48000/2\r\n"
-    "a=rtpmap:103 ISAC/16000\r\n"
-    "a=rtpmap:104 ISAC/32000\r\n"
-    "a=ssrc:1 cname:stream_1_cname\r\n"
-    // Video track 1, stream 1 (with candidates).
-    "m=video 3457 RTP/SAVPF 120\r\n"
-    "c=IN IP4 74.125.224.39\r\n"
-    "a=rtcp:3456 IN IP4 74.125.224.39\r\n"
-    "a=candidate:a0+B/1 2 udp 2130706432 192.168.1.5 1236 typ host "
-    "generation 2\r\n"
-    "a=candidate:a0+B/1 1 udp 2130706432 192.168.1.5 1237 typ host "
-    "generation 2\r\n"
-    "a=candidate:a0+B/2 2 udp 2130706432 ::1 1240 typ host "
-    "generation 2\r\n"
-    "a=candidate:a0+B/2 1 udp 2130706432 ::1 1241 typ host "
-    "generation 2\r\n"
-    "a=candidate:a0+B/4 2 udp 2130706432 74.125.224.39 3456 typ relay "
-    "generation 2\r\n"
-    "a=candidate:a0+B/4 1 udp 2130706432 74.125.224.39 3457 typ relay "
-    "generation 2\r\n"
-    "a=ice-ufrag:ufrag_video\r\na=ice-pwd:pwd_video\r\n"
-    "a=mid:video_content_name\r\n"
-    "a=msid:local_stream_1 video_track_id_1\r\n"
-    "a=sendrecv\r\n"
-    "a=crypto:1 AES_CM_128_HMAC_SHA1_80 "
-    "inline:d0RmdmcmVCspeEc3QGZiNWpVLFJhQX1cfHAwJSoj|2^20|1:32\r\n"
-    "a=rtpmap:120 VP8/90000\r\n"
-    "a=ssrc-group:FEC 2 3\r\n"
-    "a=ssrc:2 cname:stream_1_cname\r\n"
-    "a=ssrc:3 cname:stream_1_cname\r\n"
-    // Audio track 2, stream 2.
-    "m=audio 9 RTP/SAVPF 111 103 104\r\n"
-    "c=IN IP4 0.0.0.0\r\n"
-    "a=rtcp:9 IN IP4 0.0.0.0\r\n"
-    "a=ice-ufrag:ufrag_voice_2\r\na=ice-pwd:pwd_voice_2\r\n"
-    "a=mid:audio_content_name_2\r\n"
-    "a=msid:local_stream_2 audio_track_id_2\r\n"
-    "a=sendrecv\r\n"
-    "a=rtcp-mux\r\n"
-    "a=rtcp-rsize\r\n"
-    "a=crypto:1 AES_CM_128_HMAC_SHA1_32 "
-    "inline:NzB4d1BINUAvLEw6UzF3WSJ+PSdFcGdUJShpX1Zj|2^20|1:32 "
-    "dummy_session_params\r\n"
-    "a=rtpmap:111 opus/48000/2\r\n"
-    "a=rtpmap:103 ISAC/16000\r\n"
-    "a=rtpmap:104 ISAC/32000\r\n"
-    "a=ssrc:4 cname:stream_2_cname\r\n"
-    // Video track 2, stream 2.
-    "m=video 9 RTP/SAVPF 120\r\n"
-    "c=IN IP4 0.0.0.0\r\n"
-    "a=rtcp:9 IN IP4 0.0.0.0\r\n"
-    "a=ice-ufrag:ufrag_video_2\r\na=ice-pwd:pwd_video_2\r\n"
-    "a=mid:video_content_name_2\r\n"
-    "a=msid:local_stream_2 video_track_id_2\r\n"
-    "a=sendrecv\r\n"
-    "a=crypto:1 AES_CM_128_HMAC_SHA1_80 "
-    "inline:d0RmdmcmVCspeEc3QGZiNWpVLFJhQX1cfHAwJSoj|2^20|1:32\r\n"
-    "a=rtpmap:120 VP8/90000\r\n"
-    "a=ssrc:5 cname:stream_2_cname\r\n"
-    // Video track 3, stream 2.
-    "m=video 9 RTP/SAVPF 120\r\n"
-    "c=IN IP4 0.0.0.0\r\n"
-    "a=rtcp:9 IN IP4 0.0.0.0\r\n"
-    "a=ice-ufrag:ufrag_video_3\r\na=ice-pwd:pwd_video_3\r\n"
-    "a=mid:video_content_name_3\r\n"
-    "a=msid:local_stream_2 video_track_id_3\r\n"
-    "a=sendrecv\r\n"
-    "a=crypto:1 AES_CM_128_HMAC_SHA1_80 "
-    "inline:d0RmdmcmVCspeEc3QGZiNWpVLFJhQX1cfHAwJSoj|2^20|1:32\r\n"
-    "a=rtpmap:120 VP8/90000\r\n"
-    "a=ssrc:6 cname:stream_2_cname\r\n";
-
-// One candidate reference string as per W3c spec.
-// candidate:<blah> not a=candidate:<blah>CRLF
-static const char kRawCandidate[] =
-    "candidate:a0+B/1 1 udp 2130706432 192.168.1.5 1234 typ host generation 2";
-// One candidate reference string.
-static const char kSdpOneCandidate[] =
-    "a=candidate:a0+B/1 1 udp 2130706432 192.168.1.5 1234 typ host "
-    "generation 2\r\n";
-
-static const char kSdpTcpActiveCandidate[] =
-    "candidate:a0+B/1 1 tcp 2130706432 192.168.1.5 9 typ host "
-    "tcptype active generation 2";
-static const char kSdpTcpPassiveCandidate[] =
-    "candidate:a0+B/1 1 tcp 2130706432 192.168.1.5 9 typ host "
-    "tcptype passive generation 2";
-static const char kSdpTcpSOCandidate[] =
-    "candidate:a0+B/1 1 tcp 2130706432 192.168.1.5 9 typ host "
-    "tcptype so generation 2";
-static const char kSdpTcpInvalidCandidate[] =
-    "candidate:a0+B/1 1 tcp 2130706432 192.168.1.5 9 typ host "
-    "tcptype invalid generation 2";
-
-// One candidate reference string with IPV6 address.
-static const char kRawIPV6Candidate[] =
-    "candidate:a0+B/1 1 udp 2130706432 "
-    "abcd:abcd:abcd:abcd:abcd:abcd:abcd:abcd 1234 typ host generation 2";
-
-// One candidate reference string.
-static const char kSdpOneCandidateWithUfragPwd[] =
-    "a=candidate:a0+B/1 1 udp 2130706432 192.168.1.5 1234 typ host network_name"
-    " eth0 ufrag user_rtp pwd password_rtp generation 2\r\n";
-
-// Session id and version
-static const char kSessionId[] = "18446744069414584320";
-static const char kSessionVersion[] = "18446462598732840960";
-
-// ICE options.
-static const char kIceOption1[] = "iceoption1";
-static const char kIceOption2[] = "iceoption2";
-static const char kIceOption3[] = "iceoption3";
-
-// ICE ufrags/passwords.
-static const char kUfragVoice[] = "ufrag_voice";
-static const char kPwdVoice[] = "pwd_voice";
-static const char kUfragVideo[] = "ufrag_video";
-static const char kPwdVideo[] = "pwd_video";
-static const char kUfragData[] = "ufrag_data";
-static const char kPwdData[] = "pwd_data";
-
-// Extra ufrags/passwords for extra unified plan m= sections.
-static const char kUfragVoice2[] = "ufrag_voice_2";
-static const char kPwdVoice2[] = "pwd_voice_2";
-static const char kUfragVideo2[] = "ufrag_video_2";
-static const char kPwdVideo2[] = "pwd_video_2";
-static const char kUfragVideo3[] = "ufrag_video_3";
-static const char kPwdVideo3[] = "pwd_video_3";
-
-// Content name
-static const char kAudioContentName[] = "audio_content_name";
-static const char kVideoContentName[] = "video_content_name";
-static const char kDataContentName[] = "data_content_name";
-
-// Extra content names for extra unified plan m= sections.
-static const char kAudioContentName2[] = "audio_content_name_2";
-static const char kVideoContentName2[] = "video_content_name_2";
-static const char kVideoContentName3[] = "video_content_name_3";
-
-// MediaStream 1
-static const char kStreamLabel1[] = "local_stream_1";
-static const char kStream1Cname[] = "stream_1_cname";
-static const char kAudioTrackId1[] = "audio_track_id_1";
-static const uint32_t kAudioTrack1Ssrc = 1;
-static const char kVideoTrackId1[] = "video_track_id_1";
-static const uint32_t kVideoTrack1Ssrc1 = 2;
-static const uint32_t kVideoTrack1Ssrc2 = 3;
-
-// MediaStream 2
-static const char kStreamLabel2[] = "local_stream_2";
-static const char kStream2Cname[] = "stream_2_cname";
-static const char kAudioTrackId2[] = "audio_track_id_2";
-static const uint32_t kAudioTrack2Ssrc = 4;
-static const char kVideoTrackId2[] = "video_track_id_2";
-static const uint32_t kVideoTrack2Ssrc = 5;
-static const char kVideoTrackId3[] = "video_track_id_3";
-static const uint32_t kVideoTrack3Ssrc = 6;
-
-// DataChannel
-static const char kDataChannelLabel[] = "data_channel";
-static const char kDataChannelMsid[] = "data_channeld0";
-static const char kDataChannelCname[] = "data_channel_cname";
-static const uint32_t kDataChannelSsrc = 10;
-
-// Candidate
-static const char kDummyMid[] = "dummy_mid";
-static const int kDummyIndex = 123;
-
-// Misc
-static const char kDummyString[] = "dummy";
-
-// Helper functions
-
-static bool SdpDeserialize(const std::string& message,
-                           JsepSessionDescription* jdesc) {
-  return webrtc::SdpDeserialize(message, jdesc, NULL);
-}
-
-static bool SdpDeserializeCandidate(const std::string& message,
-                                    JsepIceCandidate* candidate) {
-  return webrtc::SdpDeserializeCandidate(message, candidate, NULL);
-}
-
-// Add some extra |newlines| to the |message| after |line|.
-static void InjectAfter(const std::string& line,
-                        const std::string& newlines,
-                        std::string* message) {
-  const std::string tmp = line + newlines;
-  rtc::replace_substrs(line.c_str(), line.length(),
-                             tmp.c_str(), tmp.length(), message);
-}
-
-static void Replace(const std::string& line,
-                    const std::string& newlines,
-                    std::string* message) {
-  rtc::replace_substrs(line.c_str(), line.length(),
-                             newlines.c_str(), newlines.length(), message);
-}
-
-// Expect fail to parase |bad_sdp| and expect |bad_part| be part of the error
-// message.
-static void ExpectParseFailure(const std::string& bad_sdp,
-                               const std::string& bad_part) {
-  JsepSessionDescription desc(kDummyString);
-  SdpParseError error;
-  bool ret = webrtc::SdpDeserialize(bad_sdp, &desc, &error);
-  EXPECT_FALSE(ret);
-  EXPECT_NE(std::string::npos, error.line.find(bad_part.c_str()));
-}
-
-// Expect fail to parse kSdpFullString if replace |good_part| with |bad_part|.
-static void ExpectParseFailure(const char* good_part, const char* bad_part) {
-  std::string bad_sdp = kSdpFullString;
-  Replace(good_part, bad_part, &bad_sdp);
-  ExpectParseFailure(bad_sdp, bad_part);
-}
-
-// Expect fail to parse kSdpFullString if add |newlines| after |injectpoint|.
-static void ExpectParseFailureWithNewLines(const std::string& injectpoint,
-                                           const std::string& newlines,
-                                           const std::string& bad_part) {
-  std::string bad_sdp = kSdpFullString;
-  InjectAfter(injectpoint, newlines, &bad_sdp);
-  ExpectParseFailure(bad_sdp, bad_part);
-}
-
-static void ReplaceDirection(cricket::MediaContentDirection direction,
-                             std::string* message) {
-  std::string new_direction;
-  switch (direction) {
-    case cricket::MD_INACTIVE:
-      new_direction = "a=inactive";
-      break;
-    case cricket::MD_SENDONLY:
-      new_direction = "a=sendonly";
-      break;
-    case cricket::MD_RECVONLY:
-      new_direction = "a=recvonly";
-      break;
-    case cricket::MD_SENDRECV:
-    default:
-      new_direction = "a=sendrecv";
-      break;
-  }
-  Replace("a=sendrecv", new_direction, message);
-}
-
-static void ReplaceRejected(bool audio_rejected, bool video_rejected,
-                            std::string* message) {
-  if (audio_rejected) {
-    Replace("m=audio 9", "m=audio 0", message);
-    Replace(kAttributeIceUfragVoice, "", message);
-    Replace(kAttributeIcePwdVoice, "", message);
-  }
-  if (video_rejected) {
-    Replace("m=video 9", "m=video 0", message);
-    Replace(kAttributeIceUfragVideo, "", message);
-    Replace(kAttributeIcePwdVideo, "", message);
-  }
-}
-
-// WebRtcSdpTest
-
-class WebRtcSdpTest : public testing::Test {
- public:
-  WebRtcSdpTest()
-     : jdesc_(kDummyString) {
-#ifdef WEBRTC_ANDROID
-    webrtc::InitializeAndroidObjects();
-#endif
-    // AudioContentDescription
-    audio_desc_ = CreateAudioContentDescription();
-    StreamParams audio_stream;
-    audio_stream.id = kAudioTrackId1;
-    audio_stream.cname = kStream1Cname;
-    audio_stream.sync_label = kStreamLabel1;
-    audio_stream.ssrcs.push_back(kAudioTrack1Ssrc);
-    audio_desc_->AddStream(audio_stream);
-    rtc::SocketAddress audio_addr("74.125.127.126", 2345);
-    audio_desc_->set_connection_address(audio_addr);
-    desc_.AddContent(kAudioContentName, NS_JINGLE_RTP, audio_desc_);
-
-    // VideoContentDescription
-    video_desc_ = CreateVideoContentDescription();
-    StreamParams video_stream;
-    video_stream.id = kVideoTrackId1;
-    video_stream.cname = kStream1Cname;
-    video_stream.sync_label = kStreamLabel1;
-    video_stream.ssrcs.push_back(kVideoTrack1Ssrc1);
-    video_stream.ssrcs.push_back(kVideoTrack1Ssrc2);
-    cricket::SsrcGroup ssrc_group(kFecSsrcGroupSemantics, video_stream.ssrcs);
-    video_stream.ssrc_groups.push_back(ssrc_group);
-    video_desc_->AddStream(video_stream);
-    rtc::SocketAddress video_addr("74.125.224.39", 3457);
-    video_desc_->set_connection_address(video_addr);
-    desc_.AddContent(kVideoContentName, NS_JINGLE_RTP, video_desc_);
-
-    // TransportInfo
-    EXPECT_TRUE(desc_.AddTransportInfo(TransportInfo(
-        kAudioContentName, TransportDescription(kUfragVoice, kPwdVoice))));
-    EXPECT_TRUE(desc_.AddTransportInfo(TransportInfo(
-        kVideoContentName, TransportDescription(kUfragVideo, kPwdVideo))));
-
-    // v4 host
-    int port = 1234;
-    rtc::SocketAddress address("192.168.1.5", port++);
-    Candidate candidate1(ICE_CANDIDATE_COMPONENT_RTP, "udp", address,
-                         kCandidatePriority, "", "", LOCAL_PORT_TYPE,
-                         kCandidateGeneration, kCandidateFoundation1);
-    address.SetPort(port++);
-    Candidate candidate2(ICE_CANDIDATE_COMPONENT_RTCP, "udp", address,
-                         kCandidatePriority, "", "", LOCAL_PORT_TYPE,
-                         kCandidateGeneration, kCandidateFoundation1);
-    address.SetPort(port++);
-    Candidate candidate3(ICE_CANDIDATE_COMPONENT_RTCP, "udp", address,
-                         kCandidatePriority, "", "", LOCAL_PORT_TYPE,
-                         kCandidateGeneration, kCandidateFoundation1);
-    address.SetPort(port++);
-    Candidate candidate4(ICE_CANDIDATE_COMPONENT_RTP, "udp", address,
-                         kCandidatePriority, "", "", LOCAL_PORT_TYPE,
-                         kCandidateGeneration, kCandidateFoundation1);
-
-    // v6 host
-    rtc::SocketAddress v6_address("::1", port++);
-    cricket::Candidate candidate5(cricket::ICE_CANDIDATE_COMPONENT_RTP, "udp",
-                                  v6_address, kCandidatePriority, "", "",
-                                  cricket::LOCAL_PORT_TYPE,
-                                  kCandidateGeneration, kCandidateFoundation2);
-    v6_address.SetPort(port++);
-    cricket::Candidate candidate6(cricket::ICE_CANDIDATE_COMPONENT_RTCP, "udp",
-                                  v6_address, kCandidatePriority, "", "",
-                                  cricket::LOCAL_PORT_TYPE,
-                                  kCandidateGeneration, kCandidateFoundation2);
-    v6_address.SetPort(port++);
-    cricket::Candidate candidate7(cricket::ICE_CANDIDATE_COMPONENT_RTCP, "udp",
-                                  v6_address, kCandidatePriority, "", "",
-                                  cricket::LOCAL_PORT_TYPE,
-                                  kCandidateGeneration, kCandidateFoundation2);
-    v6_address.SetPort(port++);
-    cricket::Candidate candidate8(cricket::ICE_CANDIDATE_COMPONENT_RTP, "udp",
-                                  v6_address, kCandidatePriority, "", "",
-                                  cricket::LOCAL_PORT_TYPE,
-                                  kCandidateGeneration, kCandidateFoundation2);
-
-    // stun
-    int port_stun = 2345;
-    rtc::SocketAddress address_stun("74.125.127.126", port_stun++);
-    rtc::SocketAddress rel_address_stun("192.168.1.5", port_stun++);
-    cricket::Candidate candidate9(cricket::ICE_CANDIDATE_COMPONENT_RTP, "udp",
-                                  address_stun, kCandidatePriority, "", "",
-                                  STUN_PORT_TYPE, kCandidateGeneration,
-                                  kCandidateFoundation3);
-    candidate9.set_related_address(rel_address_stun);
-
-    address_stun.SetPort(port_stun++);
-    rel_address_stun.SetPort(port_stun++);
-    cricket::Candidate candidate10(cricket::ICE_CANDIDATE_COMPONENT_RTCP, "udp",
-                                   address_stun, kCandidatePriority, "", "",
-                                   STUN_PORT_TYPE, kCandidateGeneration,
-                                   kCandidateFoundation3);
-    candidate10.set_related_address(rel_address_stun);
-
-    // relay
-    int port_relay = 3456;
-    rtc::SocketAddress address_relay("74.125.224.39", port_relay++);
-    cricket::Candidate candidate11(cricket::ICE_CANDIDATE_COMPONENT_RTCP, "udp",
-                                   address_relay, kCandidatePriority, "", "",
-                                   cricket::RELAY_PORT_TYPE,
-                                   kCandidateGeneration, kCandidateFoundation4);
-    address_relay.SetPort(port_relay++);
-    cricket::Candidate candidate12(cricket::ICE_CANDIDATE_COMPONENT_RTP, "udp",
-                                   address_relay, kCandidatePriority, "", "",
-                                   RELAY_PORT_TYPE, kCandidateGeneration,
-                                   kCandidateFoundation4);
-
-    // voice
-    candidates_.push_back(candidate1);
-    candidates_.push_back(candidate2);
-    candidates_.push_back(candidate5);
-    candidates_.push_back(candidate6);
-    candidates_.push_back(candidate9);
-    candidates_.push_back(candidate10);
-
-    // video
-    candidates_.push_back(candidate3);
-    candidates_.push_back(candidate4);
-    candidates_.push_back(candidate7);
-    candidates_.push_back(candidate8);
-    candidates_.push_back(candidate11);
-    candidates_.push_back(candidate12);
-
-    jcandidate_.reset(new JsepIceCandidate(std::string("audio_content_name"),
-                                           0, candidate1));
-
-    // Set up JsepSessionDescription.
-    jdesc_.Initialize(desc_.Copy(), kSessionId, kSessionVersion);
-    std::string mline_id;
-    int mline_index = 0;
-    for (size_t i = 0; i< candidates_.size(); ++i) {
-      // In this test, the audio m line index will be 0, and the video m line
-      // will be 1.
-      bool is_video = (i > 5);
-      mline_id = is_video ? "video_content_name" : "audio_content_name";
-      mline_index = is_video ? 1 : 0;
-      JsepIceCandidate jice(mline_id,
-                            mline_index,
-                            candidates_.at(i));
-      jdesc_.AddCandidate(&jice);
-    }
-  }
-
-  // Turns the existing reference description into a description using
-  // a=bundle-only. This means no transport attributes and a 0 port value on
-  // the m= sections not associated with the BUNDLE-tag.
-  void MakeBundleOnlyDescription() {
-    // Remove video candidates. JsepSessionDescription doesn't make it
-    // simple.
-    const IceCandidateCollection* video_candidates_collection =
-        jdesc_.candidates(1);
-    ASSERT_NE(nullptr, video_candidates_collection);
-    std::vector<cricket::Candidate> video_candidates;
-    for (size_t i = 0; i < video_candidates_collection->count(); ++i) {
-      cricket::Candidate c = video_candidates_collection->at(i)->candidate();
-      c.set_transport_name("video_content_name");
-      video_candidates.push_back(c);
-    }
-    jdesc_.RemoveCandidates(video_candidates);
-
-    // And the rest of the transport attributes.
-    desc_.transport_infos()[1].description.ice_ufrag.clear();
-    desc_.transport_infos()[1].description.ice_pwd.clear();
-    desc_.transport_infos()[1].description.connection_role =
-        cricket::CONNECTIONROLE_NONE;
-
-    // Set bundle-only flag.
-    desc_.contents()[1].bundle_only = true;
-
-    // Add BUNDLE group.
-    ContentGroup group(cricket::GROUP_TYPE_BUNDLE);
-    group.AddContentName(kAudioContentName);
-    group.AddContentName(kVideoContentName);
-    desc_.AddGroup(group);
-
-    ASSERT_TRUE(jdesc_.Initialize(desc_.Copy(), jdesc_.session_id(),
-                                  jdesc_.session_version()));
-  }
-
-  // Turns the existing reference description into a plan B description,
-  // with 2 audio tracks and 3 video tracks.
-  void MakePlanBDescription() {
-    audio_desc_ = static_cast<AudioContentDescription*>(audio_desc_->Copy());
-    video_desc_ = static_cast<VideoContentDescription*>(video_desc_->Copy());
-
-    StreamParams audio_track_2;
-    audio_track_2.id = kAudioTrackId2;
-    audio_track_2.cname = kStream2Cname;
-    audio_track_2.sync_label = kStreamLabel2;
-    audio_track_2.ssrcs.push_back(kAudioTrack2Ssrc);
-    audio_desc_->AddStream(audio_track_2);
-
-    StreamParams video_track_2;
-    video_track_2.id = kVideoTrackId2;
-    video_track_2.cname = kStream2Cname;
-    video_track_2.sync_label = kStreamLabel2;
-    video_track_2.ssrcs.push_back(kVideoTrack2Ssrc);
-    video_desc_->AddStream(video_track_2);
-
-    StreamParams video_track_3;
-    video_track_3.id = kVideoTrackId3;
-    video_track_3.cname = kStream2Cname;
-    video_track_3.sync_label = kStreamLabel2;
-    video_track_3.ssrcs.push_back(kVideoTrack3Ssrc);
-    video_desc_->AddStream(video_track_3);
-
-    desc_.RemoveContentByName(kAudioContentName);
-    desc_.RemoveContentByName(kVideoContentName);
-    desc_.AddContent(kAudioContentName, NS_JINGLE_RTP, audio_desc_);
-    desc_.AddContent(kVideoContentName, NS_JINGLE_RTP, video_desc_);
-
-    ASSERT_TRUE(jdesc_.Initialize(desc_.Copy(), jdesc_.session_id(),
-                                  jdesc_.session_version()));
-  }
-
-  // Turns the existing reference description into a unified plan description,
-  // with 2 audio tracks and 3 video tracks.
-  void MakeUnifiedPlanDescription() {
-    // Audio track 2.
-    AudioContentDescription* audio_desc_2 = CreateAudioContentDescription();
-    StreamParams audio_track_2;
-    audio_track_2.id = kAudioTrackId2;
-    audio_track_2.cname = kStream2Cname;
-    audio_track_2.sync_label = kStreamLabel2;
-    audio_track_2.ssrcs.push_back(kAudioTrack2Ssrc);
-    audio_desc_2->AddStream(audio_track_2);
-    desc_.AddContent(kAudioContentName2, NS_JINGLE_RTP, audio_desc_2);
-    EXPECT_TRUE(desc_.AddTransportInfo(TransportInfo(
-        kAudioContentName2, TransportDescription(kUfragVoice2, kPwdVoice2))));
-    // Video track 2, in stream 2.
-    VideoContentDescription* video_desc_2 = CreateVideoContentDescription();
-    StreamParams video_track_2;
-    video_track_2.id = kVideoTrackId2;
-    video_track_2.cname = kStream2Cname;
-    video_track_2.sync_label = kStreamLabel2;
-    video_track_2.ssrcs.push_back(kVideoTrack2Ssrc);
-    video_desc_2->AddStream(video_track_2);
-    desc_.AddContent(kVideoContentName2, NS_JINGLE_RTP, video_desc_2);
-    EXPECT_TRUE(desc_.AddTransportInfo(TransportInfo(
-        kVideoContentName2, TransportDescription(kUfragVideo2, kPwdVideo2))));
-
-    // Video track 3, in stream 2.
-    VideoContentDescription* video_desc_3 = CreateVideoContentDescription();
-    StreamParams video_track_3;
-    video_track_3.id = kVideoTrackId3;
-    video_track_3.cname = kStream2Cname;
-    video_track_3.sync_label = kStreamLabel2;
-    video_track_3.ssrcs.push_back(kVideoTrack3Ssrc);
-    video_desc_3->AddStream(video_track_3);
-    desc_.AddContent(kVideoContentName3, NS_JINGLE_RTP, video_desc_3);
-    EXPECT_TRUE(desc_.AddTransportInfo(TransportInfo(
-        kVideoContentName3, TransportDescription(kUfragVideo3, kPwdVideo3))));
-
-    ASSERT_TRUE(jdesc_.Initialize(desc_.Copy(), jdesc_.session_id(),
-                                  jdesc_.session_version()));
-  }
-
-  // Creates an audio content description with no streams, and some default
-  // configuration.
-  AudioContentDescription* CreateAudioContentDescription() {
-    AudioContentDescription* audio = new AudioContentDescription();
-    audio->set_rtcp_mux(true);
-    audio->set_rtcp_reduced_size(true);
-    audio->AddCrypto(CryptoParams(1, "AES_CM_128_HMAC_SHA1_32",
-        "inline:NzB4d1BINUAvLEw6UzF3WSJ+PSdFcGdUJShpX1Zj|2^20|1:32",
-        "dummy_session_params"));
-    audio->set_protocol(cricket::kMediaProtocolSavpf);
-    AudioCodec opus(111, "opus", 48000, 0, 2);
-    audio->AddCodec(opus);
-    audio->AddCodec(AudioCodec(103, "ISAC", 16000, 0, 1));
-    audio->AddCodec(AudioCodec(104, "ISAC", 32000, 0, 1));
-    return audio;
-  }
-
-  // Creates a video content description with no streams, and some default
-  // configuration.
-  VideoContentDescription* CreateVideoContentDescription() {
-    VideoContentDescription* video = new VideoContentDescription();
-    video->AddCrypto(CryptoParams(
-        1, "AES_CM_128_HMAC_SHA1_80",
-        "inline:d0RmdmcmVCspeEc3QGZiNWpVLFJhQX1cfHAwJSoj|2^20|1:32", ""));
-    video->set_protocol(cricket::kMediaProtocolSavpf);
-    video->AddCodec(
-        VideoCodec(120, JsepSessionDescription::kDefaultVideoCodecName));
-    return video;
-  }
-
-  template <class MCD>
-  void CompareMediaContentDescription(const MCD* cd1,
-                                      const MCD* cd2) {
-    // type
-    EXPECT_EQ(cd1->type(), cd1->type());
-
-    // content direction
-    EXPECT_EQ(cd1->direction(), cd2->direction());
-
-    // rtcp_mux
-    EXPECT_EQ(cd1->rtcp_mux(), cd2->rtcp_mux());
-
-    // rtcp_reduced_size
-    EXPECT_EQ(cd1->rtcp_reduced_size(), cd2->rtcp_reduced_size());
-
-    // cryptos
-    EXPECT_EQ(cd1->cryptos().size(), cd2->cryptos().size());
-    if (cd1->cryptos().size() != cd2->cryptos().size()) {
-      ADD_FAILURE();
-      return;
-    }
-    for (size_t i = 0; i< cd1->cryptos().size(); ++i) {
-      const CryptoParams c1 = cd1->cryptos().at(i);
-      const CryptoParams c2 = cd2->cryptos().at(i);
-      EXPECT_TRUE(c1.Matches(c2));
-      EXPECT_EQ(c1.key_params, c2.key_params);
-      EXPECT_EQ(c1.session_params, c2.session_params);
-    }
-
-    // protocol
-    // Use an equivalence class here, for old and new versions of the
-    // protocol description.
-    if (cd1->protocol() == cricket::kMediaProtocolDtlsSctp
-        || cd1->protocol() == cricket::kMediaProtocolUdpDtlsSctp
-        || cd1->protocol() == cricket::kMediaProtocolTcpDtlsSctp) {
-      const bool cd2_is_also_dtls_sctp =
-        cd2->protocol() == cricket::kMediaProtocolDtlsSctp
-        || cd2->protocol() == cricket::kMediaProtocolUdpDtlsSctp
-        || cd2->protocol() == cricket::kMediaProtocolTcpDtlsSctp;
-      EXPECT_TRUE(cd2_is_also_dtls_sctp);
-    } else {
-      EXPECT_EQ(cd1->protocol(), cd2->protocol());
-    }
-
-    // codecs
-    EXPECT_EQ(cd1->codecs(), cd2->codecs());
-
-    // bandwidth
-    EXPECT_EQ(cd1->bandwidth(), cd2->bandwidth());
-
-    // streams
-    EXPECT_EQ(cd1->streams(), cd2->streams());
-
-    // extmap
-    ASSERT_EQ(cd1->rtp_header_extensions().size(),
-              cd2->rtp_header_extensions().size());
-    for (size_t i = 0; i< cd1->rtp_header_extensions().size(); ++i) {
-      const RtpExtension ext1 = cd1->rtp_header_extensions().at(i);
-      const RtpExtension ext2 = cd2->rtp_header_extensions().at(i);
-      EXPECT_EQ(ext1.uri, ext2.uri);
-      EXPECT_EQ(ext1.id, ext2.id);
-      EXPECT_EQ(ext1.encrypt, ext2.encrypt);
-    }
-  }
-
-  void CompareDataContentDescription(const DataContentDescription* dcd1,
-                                     const DataContentDescription* dcd2) {
-    EXPECT_EQ(dcd1->use_sctpmap(), dcd2->use_sctpmap());
-    CompareMediaContentDescription<DataContentDescription>(dcd1, dcd2);
-  }
-
-  void CompareSessionDescription(const SessionDescription& desc1,
-                                 const SessionDescription& desc2) {
-    // Compare content descriptions.
-    if (desc1.contents().size() != desc2.contents().size()) {
-      ADD_FAILURE();
-      return;
-    }
-    for (size_t i = 0 ; i < desc1.contents().size(); ++i) {
-      const cricket::ContentInfo& c1 = desc1.contents().at(i);
-      const cricket::ContentInfo& c2 = desc2.contents().at(i);
-      // ContentInfo properties.
-      EXPECT_EQ(c1.name, c2.name);
-      EXPECT_EQ(c1.type, c2.type);
-      EXPECT_EQ(c1.rejected, c2.rejected);
-      EXPECT_EQ(c1.bundle_only, c2.bundle_only);
-
-      ASSERT_EQ(IsAudioContent(&c1), IsAudioContent(&c2));
-      if (IsAudioContent(&c1)) {
-        const AudioContentDescription* acd1 =
-            static_cast<const AudioContentDescription*>(c1.description);
-        const AudioContentDescription* acd2 =
-            static_cast<const AudioContentDescription*>(c2.description);
-        CompareMediaContentDescription<AudioContentDescription>(acd1, acd2);
-      }
-
-      ASSERT_EQ(IsVideoContent(&c1), IsVideoContent(&c2));
-      if (IsVideoContent(&c1)) {
-        const VideoContentDescription* vcd1 =
-            static_cast<const VideoContentDescription*>(c1.description);
-        const VideoContentDescription* vcd2 =
-            static_cast<const VideoContentDescription*>(c2.description);
-        CompareMediaContentDescription<VideoContentDescription>(vcd1, vcd2);
-      }
-
-      ASSERT_EQ(IsDataContent(&c1), IsDataContent(&c2));
-      if (IsDataContent(&c1)) {
-        const DataContentDescription* dcd1 =
-            static_cast<const DataContentDescription*>(c1.description);
-        const DataContentDescription* dcd2 =
-            static_cast<const DataContentDescription*>(c2.description);
-        CompareDataContentDescription(dcd1, dcd2);
-      }
-    }
-
-    // group
-    const cricket::ContentGroups groups1 = desc1.groups();
-    const cricket::ContentGroups groups2 = desc2.groups();
-    EXPECT_EQ(groups1.size(), groups1.size());
-    if (groups1.size() != groups2.size()) {
-      ADD_FAILURE();
-      return;
-    }
-    for (size_t i = 0; i < groups1.size(); ++i) {
-      const cricket::ContentGroup group1 = groups1.at(i);
-      const cricket::ContentGroup group2 = groups2.at(i);
-      EXPECT_EQ(group1.semantics(), group2.semantics());
-      const cricket::ContentNames names1 = group1.content_names();
-      const cricket::ContentNames names2 = group2.content_names();
-      EXPECT_EQ(names1.size(), names2.size());
-      if (names1.size() != names2.size()) {
-        ADD_FAILURE();
-        return;
-      }
-      cricket::ContentNames::const_iterator iter1 = names1.begin();
-      cricket::ContentNames::const_iterator iter2 = names2.begin();
-      while (iter1 != names1.end()) {
-        EXPECT_EQ(*iter1++, *iter2++);
-      }
-    }
-
-    // transport info
-    const cricket::TransportInfos transports1 = desc1.transport_infos();
-    const cricket::TransportInfos transports2 = desc2.transport_infos();
-    EXPECT_EQ(transports1.size(), transports2.size());
-    if (transports1.size() != transports2.size()) {
-      ADD_FAILURE();
-      return;
-    }
-    for (size_t i = 0; i < transports1.size(); ++i) {
-      const cricket::TransportInfo transport1 = transports1.at(i);
-      const cricket::TransportInfo transport2 = transports2.at(i);
-      EXPECT_EQ(transport1.content_name, transport2.content_name);
-      EXPECT_EQ(transport1.description.ice_ufrag,
-                transport2.description.ice_ufrag);
-      EXPECT_EQ(transport1.description.ice_pwd,
-                transport2.description.ice_pwd);
-      if (transport1.description.identity_fingerprint) {
-        EXPECT_EQ(*transport1.description.identity_fingerprint,
-                  *transport2.description.identity_fingerprint);
-      } else {
-        EXPECT_EQ(transport1.description.identity_fingerprint.get(),
-                  transport2.description.identity_fingerprint.get());
-      }
-      EXPECT_EQ(transport1.description.transport_options,
-                transport2.description.transport_options);
-    }
-
-    // global attributes
-    EXPECT_EQ(desc1.msid_supported(), desc2.msid_supported());
-  }
-
-  bool CompareSessionDescription(
-      const JsepSessionDescription& desc1,
-      const JsepSessionDescription& desc2) {
-    EXPECT_EQ(desc1.session_id(), desc2.session_id());
-    EXPECT_EQ(desc1.session_version(), desc2.session_version());
-    CompareSessionDescription(*desc1.description(), *desc2.description());
-    if (desc1.number_of_mediasections() != desc2.number_of_mediasections())
-      return false;
-    for (size_t i = 0; i < desc1.number_of_mediasections(); ++i) {
-      const IceCandidateCollection* cc1 = desc1.candidates(i);
-      const IceCandidateCollection* cc2 = desc2.candidates(i);
-      if (cc1->count() != cc2->count()) {
-        ADD_FAILURE();
-        return false;
-      }
-      for (size_t j = 0; j < cc1->count(); ++j) {
-        const IceCandidateInterface* c1 = cc1->at(j);
-        const IceCandidateInterface* c2 = cc2->at(j);
-        EXPECT_EQ(c1->sdp_mid(), c2->sdp_mid());
-        EXPECT_EQ(c1->sdp_mline_index(), c2->sdp_mline_index());
-        EXPECT_TRUE(c1->candidate().IsEquivalent(c2->candidate()));
-      }
-    }
-    return true;
-  }
-
-  // Disable the ice-ufrag and ice-pwd in given |sdp| message by replacing
-  // them with invalid keywords so that the parser will just ignore them.
-  bool RemoveCandidateUfragPwd(std::string* sdp) {
-    const char ice_ufrag[] = "a=ice-ufrag";
-    const char ice_ufragx[] = "a=xice-ufrag";
-    const char ice_pwd[] = "a=ice-pwd";
-    const char ice_pwdx[] = "a=xice-pwd";
-    rtc::replace_substrs(ice_ufrag, strlen(ice_ufrag),
-        ice_ufragx, strlen(ice_ufragx), sdp);
-    rtc::replace_substrs(ice_pwd, strlen(ice_pwd),
-        ice_pwdx, strlen(ice_pwdx), sdp);
-    return true;
-  }
-
-  // Update the candidates in |jdesc| to use the given |ufrag| and |pwd|.
-  bool UpdateCandidateUfragPwd(JsepSessionDescription* jdesc, int mline_index,
-      const std::string& ufrag, const std::string& pwd) {
-    std::string content_name;
-    if (mline_index == 0) {
-      content_name = kAudioContentName;
-    } else if (mline_index == 1) {
-      content_name = kVideoContentName;
-    } else {
-      RTC_NOTREACHED();
-    }
-    TransportInfo transport_info(
-        content_name, TransportDescription(ufrag, pwd));
-    SessionDescription* desc =
-        const_cast<SessionDescription*>(jdesc->description());
-    desc->RemoveTransportInfoByName(content_name);
-    EXPECT_TRUE(desc->AddTransportInfo(transport_info));
-    for (size_t i = 0; i < jdesc_.number_of_mediasections(); ++i) {
-      const IceCandidateCollection* cc = jdesc_.candidates(i);
-      for (size_t j = 0; j < cc->count(); ++j) {
-        if (cc->at(j)->sdp_mline_index() == mline_index) {
-          const_cast<Candidate&>(cc->at(j)->candidate()).set_username(
-              ufrag);
-          const_cast<Candidate&>(cc->at(j)->candidate()).set_password(
-              pwd);
-        }
-      }
-    }
-    return true;
-  }
-
-  void AddIceOptions(const std::string& content_name,
-                     const std::vector<std::string>& transport_options) {
-    ASSERT_TRUE(desc_.GetTransportInfoByName(content_name) != NULL);
-    cricket::TransportInfo transport_info =
-        *(desc_.GetTransportInfoByName(content_name));
-    desc_.RemoveTransportInfoByName(content_name);
-    transport_info.description.transport_options = transport_options;
-    desc_.AddTransportInfo(transport_info);
-  }
-
-  void SetIceUfragPwd(const std::string& content_name,
-                      const std::string& ice_ufrag,
-                      const std::string& ice_pwd) {
-    ASSERT_TRUE(desc_.GetTransportInfoByName(content_name) != NULL);
-    cricket::TransportInfo transport_info =
-        *(desc_.GetTransportInfoByName(content_name));
-    desc_.RemoveTransportInfoByName(content_name);
-    transport_info.description.ice_ufrag = ice_ufrag;
-    transport_info.description.ice_pwd = ice_pwd;
-    desc_.AddTransportInfo(transport_info);
-  }
-
-  void AddFingerprint() {
-    desc_.RemoveTransportInfoByName(kAudioContentName);
-    desc_.RemoveTransportInfoByName(kVideoContentName);
-    rtc::SSLFingerprint fingerprint(rtc::DIGEST_SHA_1,
-                                          kIdentityDigest,
-                                          sizeof(kIdentityDigest));
-    EXPECT_TRUE(desc_.AddTransportInfo(TransportInfo(
-        kAudioContentName,
-        TransportDescription(std::vector<std::string>(), kUfragVoice, kPwdVoice,
-                             cricket::ICEMODE_FULL,
-                             cricket::CONNECTIONROLE_NONE, &fingerprint))));
-    EXPECT_TRUE(desc_.AddTransportInfo(TransportInfo(
-        kVideoContentName,
-        TransportDescription(std::vector<std::string>(), kUfragVideo, kPwdVideo,
-                             cricket::ICEMODE_FULL,
-                             cricket::CONNECTIONROLE_NONE, &fingerprint))));
-  }
-
-  void AddExtmap(bool encrypted) {
-    audio_desc_ = static_cast<AudioContentDescription*>(
-        audio_desc_->Copy());
-    video_desc_ = static_cast<VideoContentDescription*>(
-        video_desc_->Copy());
-    audio_desc_->AddRtpHeaderExtension(
-        RtpExtension(kExtmapUri, kExtmapId, encrypted));
-    video_desc_->AddRtpHeaderExtension(
-        RtpExtension(kExtmapUri, kExtmapId, encrypted));
-    desc_.RemoveContentByName(kAudioContentName);
-    desc_.RemoveContentByName(kVideoContentName);
-    desc_.AddContent(kAudioContentName, NS_JINGLE_RTP, audio_desc_);
-    desc_.AddContent(kVideoContentName, NS_JINGLE_RTP, video_desc_);
-  }
-
-  void RemoveCryptos() {
-    audio_desc_->set_cryptos(std::vector<CryptoParams>());
-    video_desc_->set_cryptos(std::vector<CryptoParams>());
-  }
-
-  bool TestSerializeDirection(cricket::MediaContentDirection direction) {
-    audio_desc_->set_direction(direction);
-    video_desc_->set_direction(direction);
-    std::string new_sdp = kSdpFullString;
-    ReplaceDirection(direction, &new_sdp);
-
-    if (!jdesc_.Initialize(desc_.Copy(),
-                           jdesc_.session_id(),
-                           jdesc_.session_version())) {
-      return false;
-    }
-    std::string message = webrtc::SdpSerialize(jdesc_, false);
-    EXPECT_EQ(new_sdp, message);
-    return true;
-  }
-
-  bool TestSerializeRejected(bool audio_rejected, bool video_rejected) {
-    audio_desc_ = static_cast<AudioContentDescription*>(
-        audio_desc_->Copy());
-    video_desc_ = static_cast<VideoContentDescription*>(
-        video_desc_->Copy());
-
-    desc_.RemoveContentByName(kAudioContentName);
-    desc_.RemoveContentByName(kVideoContentName);
-    desc_.AddContent(kAudioContentName, NS_JINGLE_RTP, audio_rejected,
-                     audio_desc_);
-    desc_.AddContent(kVideoContentName, NS_JINGLE_RTP, video_rejected,
-                     video_desc_);
-    SetIceUfragPwd(kAudioContentName, audio_rejected ? "" : kUfragVoice,
-                   audio_rejected ? "" : kPwdVoice);
-    SetIceUfragPwd(kVideoContentName, video_rejected ? "" : kUfragVideo,
-                   video_rejected ? "" : kPwdVideo);
-
-    std::string new_sdp = kSdpString;
-    ReplaceRejected(audio_rejected, video_rejected, &new_sdp);
-
-    JsepSessionDescription jdesc_no_candidates(kDummyString);
-    MakeDescriptionWithoutCandidates(&jdesc_no_candidates);
-    std::string message = webrtc::SdpSerialize(jdesc_no_candidates, false);
-    EXPECT_EQ(new_sdp, message);
-    return true;
-  }
-
-  void AddSctpDataChannel(bool use_sctpmap) {
-    std::unique_ptr<DataContentDescription> data(new DataContentDescription());
-    data_desc_ = data.get();
-    data_desc_->set_use_sctpmap(use_sctpmap);
-    data_desc_->set_protocol(cricket::kMediaProtocolDtlsSctp);
-    DataCodec codec(cricket::kGoogleSctpDataCodecPlType,
-                    cricket::kGoogleSctpDataCodecName);
-    codec.SetParam(cricket::kCodecParamPort, kDefaultSctpPort);
-    data_desc_->AddCodec(codec);
-    desc_.AddContent(kDataContentName, NS_JINGLE_DRAFT_SCTP, data.release());
-    EXPECT_TRUE(desc_.AddTransportInfo(TransportInfo(
-        kDataContentName, TransportDescription(kUfragData, kPwdData))));
-  }
-
-  void AddRtpDataChannel() {
-    std::unique_ptr<DataContentDescription> data(new DataContentDescription());
-    data_desc_ = data.get();
-
-    data_desc_->AddCodec(DataCodec(101, "google-data"));
-    StreamParams data_stream;
-    data_stream.id = kDataChannelMsid;
-    data_stream.cname = kDataChannelCname;
-    data_stream.sync_label = kDataChannelLabel;
-    data_stream.ssrcs.push_back(kDataChannelSsrc);
-    data_desc_->AddStream(data_stream);
-    data_desc_->AddCrypto(CryptoParams(
-        1, "AES_CM_128_HMAC_SHA1_80",
-        "inline:FvLcvU2P3ZWmQxgPAgcDu7Zl9vftYElFOjEzhWs5", ""));
-    data_desc_->set_protocol(cricket::kMediaProtocolSavpf);
-    desc_.AddContent(kDataContentName, NS_JINGLE_RTP, data.release());
-    EXPECT_TRUE(desc_.AddTransportInfo(TransportInfo(
-        kDataContentName, TransportDescription(kUfragData, kPwdData))));
-  }
-
-  bool TestDeserializeDirection(cricket::MediaContentDirection direction) {
-    std::string new_sdp = kSdpFullString;
-    ReplaceDirection(direction, &new_sdp);
-    JsepSessionDescription new_jdesc(kDummyString);
-
-    EXPECT_TRUE(SdpDeserialize(new_sdp, &new_jdesc));
-
-    audio_desc_->set_direction(direction);
-    video_desc_->set_direction(direction);
-    if (!jdesc_.Initialize(desc_.Copy(),
-                           jdesc_.session_id(),
-                           jdesc_.session_version())) {
-      return false;
-    }
-    EXPECT_TRUE(CompareSessionDescription(jdesc_, new_jdesc));
-    return true;
-  }
-
-  bool TestDeserializeRejected(bool audio_rejected, bool video_rejected) {
-    std::string new_sdp = kSdpString;
-    ReplaceRejected(audio_rejected, video_rejected, &new_sdp);
-    JsepSessionDescription new_jdesc(JsepSessionDescription::kOffer);
-    EXPECT_TRUE(SdpDeserialize(new_sdp, &new_jdesc));
-
-    audio_desc_ = static_cast<AudioContentDescription*>(
-        audio_desc_->Copy());
-    video_desc_ = static_cast<VideoContentDescription*>(
-        video_desc_->Copy());
-    desc_.RemoveContentByName(kAudioContentName);
-    desc_.RemoveContentByName(kVideoContentName);
-    desc_.AddContent(kAudioContentName, NS_JINGLE_RTP, audio_rejected,
-                     audio_desc_);
-    desc_.AddContent(kVideoContentName, NS_JINGLE_RTP, video_rejected,
-                     video_desc_);
-    SetIceUfragPwd(kAudioContentName, audio_rejected ? "" : kUfragVoice,
-                   audio_rejected ? "" : kPwdVoice);
-    SetIceUfragPwd(kVideoContentName, video_rejected ? "" : kUfragVideo,
-                   video_rejected ? "" : kPwdVideo);
-    JsepSessionDescription jdesc_no_candidates(kDummyString);
-    if (!jdesc_no_candidates.Initialize(desc_.Copy(), jdesc_.session_id(),
-                                        jdesc_.session_version())) {
-      return false;
-    }
-    EXPECT_TRUE(CompareSessionDescription(jdesc_no_candidates, new_jdesc));
-    return true;
-  }
-
-  void TestDeserializeExtmap(bool session_level, bool media_level,
-      bool encrypted) {
-    AddExtmap(encrypted);
-    JsepSessionDescription new_jdesc("dummy");
-    ASSERT_TRUE(new_jdesc.Initialize(desc_.Copy(),
-                                     jdesc_.session_id(),
-                                     jdesc_.session_version()));
-    JsepSessionDescription jdesc_with_extmap("dummy");
-    std::string sdp_with_extmap = kSdpString;
-    if (session_level) {
-      InjectAfter(kSessionTime,
-                  encrypted ? kExtmapWithDirectionAndAttributeEncrypted
-                            : kExtmapWithDirectionAndAttribute,
-                  &sdp_with_extmap);
-    }
-    if (media_level) {
-      InjectAfter(kAttributeIcePwdVoice,
-                  encrypted ? kExtmapWithDirectionAndAttributeEncrypted
-                            : kExtmapWithDirectionAndAttribute,
-                  &sdp_with_extmap);
-      InjectAfter(kAttributeIcePwdVideo,
-                  encrypted ? kExtmapWithDirectionAndAttributeEncrypted
-                            : kExtmapWithDirectionAndAttribute,
-                  &sdp_with_extmap);
-    }
-    // The extmap can't be present at the same time in both session level and
-    // media level.
-    if (session_level && media_level) {
-      SdpParseError error;
-      EXPECT_FALSE(webrtc::SdpDeserialize(sdp_with_extmap,
-                   &jdesc_with_extmap, &error));
-      EXPECT_NE(std::string::npos, error.description.find("a=extmap"));
-    } else {
-      EXPECT_TRUE(SdpDeserialize(sdp_with_extmap, &jdesc_with_extmap));
-      EXPECT_TRUE(CompareSessionDescription(jdesc_with_extmap, new_jdesc));
-    }
-  }
-
-  void VerifyCodecParameter(const cricket::CodecParameterMap& params,
-      const std::string& name, int expected_value) {
-    cricket::CodecParameterMap::const_iterator found = params.find(name);
-    ASSERT_TRUE(found != params.end());
-    EXPECT_EQ(found->second, rtc::ToString<int>(expected_value));
-  }
-
-  void TestDeserializeCodecParams(const CodecParams& params,
-                                  JsepSessionDescription* jdesc_output) {
-    std::string sdp =
-        "v=0\r\n"
-        "o=- 18446744069414584320 18446462598732840960 IN IP4 127.0.0.1\r\n"
-        "s=-\r\n"
-        "t=0 0\r\n"
-        // Include semantics for WebRTC Media Streams since it is supported by
-        // this parser, and will be added to the SDP when serializing a session
-        // description.
-        "a=msid-semantic: WMS\r\n"
-        // Pl type 111 preferred.
-        "m=audio 9 RTP/SAVPF 111 104 103\r\n"
-        // Pltype 111 listed before 103 and 104 in the map.
-        "a=rtpmap:111 opus/48000/2\r\n"
-        // Pltype 103 listed before 104.
-        "a=rtpmap:103 ISAC/16000\r\n"
-        "a=rtpmap:104 ISAC/32000\r\n"
-        "a=fmtp:111 0-15,66,70\r\n"
-        "a=fmtp:111 ";
-    std::ostringstream os;
-    os << "minptime=" << params.min_ptime << "; stereo=" << params.stereo
-       << "; sprop-stereo=" << params.sprop_stereo
-       << "; useinbandfec=" << params.useinband
-       << "; maxaveragebitrate=" << params.maxaveragebitrate << "\r\n"
-       << "a=ptime:" << params.ptime << "\r\n"
-       << "a=maxptime:" << params.max_ptime << "\r\n";
-    sdp += os.str();
-
-    os.clear();
-    os.str("");
-    // Pl type 100 preferred.
-    os << "m=video 9 RTP/SAVPF 99 95\r\n"
-       << "a=rtpmap:99 VP8/90000\r\n"
-       << "a=rtpmap:95 RTX/90000\r\n"
-       << "a=fmtp:95 apt=99;\r\n";
-    sdp += os.str();
-
-    // Deserialize
-    SdpParseError error;
-    EXPECT_TRUE(webrtc::SdpDeserialize(sdp, jdesc_output, &error));
-
-    const ContentInfo* ac = GetFirstAudioContent(jdesc_output->description());
-    ASSERT_TRUE(ac != NULL);
-    const AudioContentDescription* acd =
-        static_cast<const AudioContentDescription*>(ac->description);
-    ASSERT_FALSE(acd->codecs().empty());
-    cricket::AudioCodec opus = acd->codecs()[0];
-    EXPECT_EQ("opus", opus.name);
-    EXPECT_EQ(111, opus.id);
-    VerifyCodecParameter(opus.params, "minptime", params.min_ptime);
-    VerifyCodecParameter(opus.params, "stereo", params.stereo);
-    VerifyCodecParameter(opus.params, "sprop-stereo", params.sprop_stereo);
-    VerifyCodecParameter(opus.params, "useinbandfec", params.useinband);
-    VerifyCodecParameter(opus.params, "maxaveragebitrate",
-                         params.maxaveragebitrate);
-    for (size_t i = 0; i < acd->codecs().size(); ++i) {
-      cricket::AudioCodec codec = acd->codecs()[i];
-      VerifyCodecParameter(codec.params, "ptime", params.ptime);
-      VerifyCodecParameter(codec.params, "maxptime", params.max_ptime);
-    }
-
-    const ContentInfo* vc = GetFirstVideoContent(jdesc_output->description());
-    ASSERT_TRUE(vc != NULL);
-    const VideoContentDescription* vcd =
-        static_cast<const VideoContentDescription*>(vc->description);
-    ASSERT_FALSE(vcd->codecs().empty());
-    cricket::VideoCodec vp8 = vcd->codecs()[0];
-    EXPECT_EQ("VP8", vp8.name);
-    EXPECT_EQ(99, vp8.id);
-    cricket::VideoCodec rtx = vcd->codecs()[1];
-    EXPECT_EQ("RTX", rtx.name);
-    EXPECT_EQ(95, rtx.id);
-    VerifyCodecParameter(rtx.params, "apt", vp8.id);
-  }
-
-  void TestDeserializeRtcpFb(JsepSessionDescription* jdesc_output,
-                             bool use_wildcard) {
-    std::string sdp_session_and_audio =
-        "v=0\r\n"
-        "o=- 18446744069414584320 18446462598732840960 IN IP4 127.0.0.1\r\n"
-        "s=-\r\n"
-        "t=0 0\r\n"
-        // Include semantics for WebRTC Media Streams since it is supported by
-        // this parser, and will be added to the SDP when serializing a session
-        // description.
-        "a=msid-semantic: WMS\r\n"
-        "m=audio 9 RTP/SAVPF 111\r\n"
-        "a=rtpmap:111 opus/48000/2\r\n";
-    std::string sdp_video =
-        "m=video 3457 RTP/SAVPF 101\r\n"
-        "a=rtpmap:101 VP8/90000\r\n"
-        "a=rtcp-fb:101 nack\r\n"
-        "a=rtcp-fb:101 nack pli\r\n"
-        "a=rtcp-fb:101 goog-remb\r\n";
-    std::ostringstream os;
-    os << sdp_session_and_audio;
-    os << "a=rtcp-fb:" << (use_wildcard ? "*" : "111") <<  " nack\r\n";
-    os << sdp_video;
-    os << "a=rtcp-fb:" << (use_wildcard ? "*" : "101") <<  " ccm fir\r\n";
-    std::string sdp = os.str();
-    // Deserialize
-    SdpParseError error;
-    EXPECT_TRUE(webrtc::SdpDeserialize(sdp, jdesc_output, &error));
-    const ContentInfo* ac = GetFirstAudioContent(jdesc_output->description());
-    ASSERT_TRUE(ac != NULL);
-    const AudioContentDescription* acd =
-        static_cast<const AudioContentDescription*>(ac->description);
-    ASSERT_FALSE(acd->codecs().empty());
-    cricket::AudioCodec opus = acd->codecs()[0];
-    EXPECT_EQ(111, opus.id);
-    EXPECT_TRUE(opus.HasFeedbackParam(
-        cricket::FeedbackParam(cricket::kRtcpFbParamNack,
-                               cricket::kParamValueEmpty)));
-
-    const ContentInfo* vc = GetFirstVideoContent(jdesc_output->description());
-    ASSERT_TRUE(vc != NULL);
-    const VideoContentDescription* vcd =
-        static_cast<const VideoContentDescription*>(vc->description);
-    ASSERT_FALSE(vcd->codecs().empty());
-    cricket::VideoCodec vp8 = vcd->codecs()[0];
-    EXPECT_STREQ(webrtc::JsepSessionDescription::kDefaultVideoCodecName,
-                 vp8.name.c_str());
-    EXPECT_EQ(101, vp8.id);
-    EXPECT_TRUE(vp8.HasFeedbackParam(
-        cricket::FeedbackParam(cricket::kRtcpFbParamNack,
-                               cricket::kParamValueEmpty)));
-    EXPECT_TRUE(vp8.HasFeedbackParam(
-        cricket::FeedbackParam(cricket::kRtcpFbParamNack,
-                               cricket::kRtcpFbNackParamPli)));
-    EXPECT_TRUE(vp8.HasFeedbackParam(
-        cricket::FeedbackParam(cricket::kRtcpFbParamRemb,
-                               cricket::kParamValueEmpty)));
-    EXPECT_TRUE(vp8.HasFeedbackParam(
-        cricket::FeedbackParam(cricket::kRtcpFbParamCcm,
-                               cricket::kRtcpFbCcmParamFir)));
-  }
-
-  // Two SDP messages can mean the same thing but be different strings, e.g.
-  // some of the lines can be serialized in different order.
-  // However, a deserialized description can be compared field by field and has
-  // no order. If deserializer has already been tested, serializing then
-  // deserializing and comparing JsepSessionDescription will test
-  // the serializer sufficiently.
-  void TestSerialize(const JsepSessionDescription& jdesc,
-                     bool unified_plan_sdp) {
-    std::string message = webrtc::SdpSerialize(jdesc, unified_plan_sdp);
-    JsepSessionDescription jdesc_output_des(kDummyString);
-    SdpParseError error;
-    EXPECT_TRUE(webrtc::SdpDeserialize(message, &jdesc_output_des, &error));
-    EXPECT_TRUE(CompareSessionDescription(jdesc, jdesc_output_des));
-  }
-
-  // Calling 'Initialize' with a copy of the inner SessionDescription will
-  // create a copy of the JsepSessionDescription without candidates. The
-  // 'connection address' field, previously set from the candidates, must also
-  // be reset.
-  void MakeDescriptionWithoutCandidates(JsepSessionDescription* jdesc) {
-    rtc::SocketAddress audio_addr("0.0.0.0", 9);
-    rtc::SocketAddress video_addr("0.0.0.0", 9);
-    audio_desc_->set_connection_address(audio_addr);
-    video_desc_->set_connection_address(video_addr);
-    ASSERT_TRUE(jdesc->Initialize(desc_.Copy(), kSessionId, kSessionVersion));
-  }
-
- protected:
-  SessionDescription desc_;
-  AudioContentDescription* audio_desc_;
-  VideoContentDescription* video_desc_;
-  DataContentDescription* data_desc_;
-  Candidates candidates_;
-  std::unique_ptr<IceCandidateInterface> jcandidate_;
-  JsepSessionDescription jdesc_;
-};
-
-void TestMismatch(const std::string& string1, const std::string& string2) {
-  int position = 0;
-  for (size_t i = 0; i < string1.length() && i < string2.length(); ++i) {
-    if (string1.c_str()[i] != string2.c_str()[i]) {
-      position = static_cast<int>(i);
-      break;
-    }
-  }
-  EXPECT_EQ(0, position) << "Strings mismatch at the " << position
-                         << " character\n"
-                         << " 1: " << string1.substr(position, 20) << "\n"
-                         << " 2: " << string2.substr(position, 20) << "\n";
-}
-
-TEST_F(WebRtcSdpTest, SerializeSessionDescription) {
-  // SessionDescription with desc and candidates.
-  std::string message = webrtc::SdpSerialize(jdesc_, false);
-  TestMismatch(std::string(kSdpFullString), message);
-}
-
-TEST_F(WebRtcSdpTest, SerializeSessionDescriptionEmpty) {
-  JsepSessionDescription jdesc_empty(kDummyString);
-  EXPECT_EQ("", webrtc::SdpSerialize(jdesc_empty, false));
-}
-
-// This tests serialization of SDP with a=crypto and a=fingerprint, as would be
-// the case in a DTLS offer.
-TEST_F(WebRtcSdpTest, SerializeSessionDescriptionWithFingerprint) {
-  AddFingerprint();
-  JsepSessionDescription jdesc_with_fingerprint(kDummyString);
-  MakeDescriptionWithoutCandidates(&jdesc_with_fingerprint);
-  std::string message = webrtc::SdpSerialize(jdesc_with_fingerprint, false);
-
-  std::string sdp_with_fingerprint = kSdpString;
-  InjectAfter(kAttributeIcePwdVoice,
-              kFingerprint, &sdp_with_fingerprint);
-  InjectAfter(kAttributeIcePwdVideo,
-              kFingerprint, &sdp_with_fingerprint);
-
-  EXPECT_EQ(sdp_with_fingerprint, message);
-}
-
-// This tests serialization of SDP with a=fingerprint with no a=crypto, as would
-// be the case in a DTLS answer.
-TEST_F(WebRtcSdpTest, SerializeSessionDescriptionWithFingerprintNoCryptos) {
-  AddFingerprint();
-  RemoveCryptos();
-  JsepSessionDescription jdesc_with_fingerprint(kDummyString);
-  MakeDescriptionWithoutCandidates(&jdesc_with_fingerprint);
-  std::string message = webrtc::SdpSerialize(jdesc_with_fingerprint, false);
-
-  std::string sdp_with_fingerprint = kSdpString;
-  Replace(kAttributeCryptoVoice, "", &sdp_with_fingerprint);
-  Replace(kAttributeCryptoVideo, "", &sdp_with_fingerprint);
-  InjectAfter(kAttributeIcePwdVoice,
-              kFingerprint, &sdp_with_fingerprint);
-  InjectAfter(kAttributeIcePwdVideo,
-              kFingerprint, &sdp_with_fingerprint);
-
-  EXPECT_EQ(sdp_with_fingerprint, message);
-}
-
-TEST_F(WebRtcSdpTest, SerializeSessionDescriptionWithoutCandidates) {
-  // JsepSessionDescription with desc but without candidates.
-  JsepSessionDescription jdesc_no_candidates(kDummyString);
-  MakeDescriptionWithoutCandidates(&jdesc_no_candidates);
-  std::string message = webrtc::SdpSerialize(jdesc_no_candidates, false);
-  EXPECT_EQ(std::string(kSdpString), message);
-}
-
-TEST_F(WebRtcSdpTest, SerializeSessionDescriptionWithBundle) {
-  ContentGroup group(cricket::GROUP_TYPE_BUNDLE);
-  group.AddContentName(kAudioContentName);
-  group.AddContentName(kVideoContentName);
-  desc_.AddGroup(group);
-  ASSERT_TRUE(jdesc_.Initialize(desc_.Copy(),
-                                jdesc_.session_id(),
-                                jdesc_.session_version()));
-  std::string message = webrtc::SdpSerialize(jdesc_, false);
-  std::string sdp_with_bundle = kSdpFullString;
-  InjectAfter(kSessionTime,
-              "a=group:BUNDLE audio_content_name video_content_name\r\n",
-              &sdp_with_bundle);
-  EXPECT_EQ(sdp_with_bundle, message);
-}
-
-TEST_F(WebRtcSdpTest, SerializeSessionDescriptionWithBandwidth) {
-  VideoContentDescription* vcd = static_cast<VideoContentDescription*>(
-      GetFirstVideoContent(&desc_)->description);
-  vcd->set_bandwidth(100 * 1000);
-  AudioContentDescription* acd = static_cast<AudioContentDescription*>(
-      GetFirstAudioContent(&desc_)->description);
-  acd->set_bandwidth(50 * 1000);
-  ASSERT_TRUE(jdesc_.Initialize(desc_.Copy(),
-                                jdesc_.session_id(),
-                                jdesc_.session_version()));
-  std::string message = webrtc::SdpSerialize(jdesc_, false);
-  std::string sdp_with_bandwidth = kSdpFullString;
-  InjectAfter("c=IN IP4 74.125.224.39\r\n",
-              "b=AS:100\r\n",
-              &sdp_with_bandwidth);
-  InjectAfter("c=IN IP4 74.125.127.126\r\n",
-              "b=AS:50\r\n",
-              &sdp_with_bandwidth);
-  EXPECT_EQ(sdp_with_bandwidth, message);
-}
-
-TEST_F(WebRtcSdpTest, SerializeSessionDescriptionWithIceOptions) {
-  std::vector<std::string> transport_options;
-  transport_options.push_back(kIceOption1);
-  transport_options.push_back(kIceOption3);
-  AddIceOptions(kAudioContentName, transport_options);
-  transport_options.clear();
-  transport_options.push_back(kIceOption2);
-  transport_options.push_back(kIceOption3);
-  AddIceOptions(kVideoContentName, transport_options);
-  ASSERT_TRUE(jdesc_.Initialize(desc_.Copy(),
-                                jdesc_.session_id(),
-                                jdesc_.session_version()));
-  std::string message = webrtc::SdpSerialize(jdesc_, false);
-  std::string sdp_with_ice_options = kSdpFullString;
-  InjectAfter(kAttributeIcePwdVoice,
-              "a=ice-options:iceoption1 iceoption3\r\n",
-              &sdp_with_ice_options);
-  InjectAfter(kAttributeIcePwdVideo,
-              "a=ice-options:iceoption2 iceoption3\r\n",
-              &sdp_with_ice_options);
-  EXPECT_EQ(sdp_with_ice_options, message);
-}
-
-TEST_F(WebRtcSdpTest, SerializeSessionDescriptionWithRecvOnlyContent) {
-  EXPECT_TRUE(TestSerializeDirection(cricket::MD_RECVONLY));
-}
-
-TEST_F(WebRtcSdpTest, SerializeSessionDescriptionWithSendOnlyContent) {
-  EXPECT_TRUE(TestSerializeDirection(cricket::MD_SENDONLY));
-}
-
-TEST_F(WebRtcSdpTest, SerializeSessionDescriptionWithInactiveContent) {
-  EXPECT_TRUE(TestSerializeDirection(cricket::MD_INACTIVE));
-}
-
-TEST_F(WebRtcSdpTest, SerializeSessionDescriptionWithAudioRejected) {
-  EXPECT_TRUE(TestSerializeRejected(true, false));
-}
-
-TEST_F(WebRtcSdpTest, SerializeSessionDescriptionWithVideoRejected) {
-  EXPECT_TRUE(TestSerializeRejected(false, true));
-}
-
-TEST_F(WebRtcSdpTest, SerializeSessionDescriptionWithAudioVideoRejected) {
-  EXPECT_TRUE(TestSerializeRejected(true, true));
-}
-
-TEST_F(WebRtcSdpTest, SerializeSessionDescriptionWithRtpDataChannel) {
-  AddRtpDataChannel();
-  JsepSessionDescription jsep_desc(kDummyString);
-
-  MakeDescriptionWithoutCandidates(&jsep_desc);
-  std::string message = webrtc::SdpSerialize(jsep_desc, false);
-
-  std::string expected_sdp = kSdpString;
-  expected_sdp.append(kSdpRtpDataChannelString);
-  EXPECT_EQ(expected_sdp, message);
-}
-
-TEST_F(WebRtcSdpTest, SerializeSessionDescriptionWithSctpDataChannel) {
-  bool use_sctpmap = true;
-  AddSctpDataChannel(use_sctpmap);
-  JsepSessionDescription jsep_desc(kDummyString);
-
-  MakeDescriptionWithoutCandidates(&jsep_desc);
-  std::string message = webrtc::SdpSerialize(jsep_desc, false);
-
-  std::string expected_sdp = kSdpString;
-  expected_sdp.append(kSdpSctpDataChannelString);
-  EXPECT_EQ(message, expected_sdp);
-}
-
-TEST_F(WebRtcSdpTest, SerializeWithSctpDataChannelAndNewPort) {
-  bool use_sctpmap = true;
-  AddSctpDataChannel(use_sctpmap);
-  JsepSessionDescription jsep_desc(kDummyString);
-  MakeDescriptionWithoutCandidates(&jsep_desc);
-  DataContentDescription* dcdesc = static_cast<DataContentDescription*>(
-      jsep_desc.description()->GetContentDescriptionByName(kDataContentName));
-
-  const int kNewPort = 1234;
-  cricket::DataCodec codec(cricket::kGoogleSctpDataCodecPlType,
-                           cricket::kGoogleSctpDataCodecName);
-  codec.SetParam(cricket::kCodecParamPort, kNewPort);
-  dcdesc->AddOrReplaceCodec(codec);
-
-  std::string message = webrtc::SdpSerialize(jsep_desc, false);
-
-  std::string expected_sdp = kSdpString;
-  expected_sdp.append(kSdpSctpDataChannelString);
-
-  char default_portstr[16];
-  char new_portstr[16];
-  rtc::sprintfn(default_portstr, sizeof(default_portstr), "%d",
-                      kDefaultSctpPort);
-  rtc::sprintfn(new_portstr, sizeof(new_portstr), "%d", kNewPort);
-  rtc::replace_substrs(default_portstr, strlen(default_portstr),
-                             new_portstr, strlen(new_portstr),
-                             &expected_sdp);
-
-  EXPECT_EQ(expected_sdp, message);
-}
-
-TEST_F(WebRtcSdpTest, SerializeSessionDescriptionWithDataChannelAndBandwidth) {
-  JsepSessionDescription jsep_desc(kDummyString);
-  AddRtpDataChannel();
-  data_desc_->set_bandwidth(100*1000);
-  MakeDescriptionWithoutCandidates(&jsep_desc);
-  std::string message = webrtc::SdpSerialize(jsep_desc, false);
-
-  std::string expected_sdp = kSdpString;
-  expected_sdp.append(kSdpRtpDataChannelString);
-  // Serializing data content shouldn't ignore bandwidth settings.
-  InjectAfter("m=application 9 RTP/SAVPF 101\r\nc=IN IP4 0.0.0.0\r\n",
-              "b=AS:100\r\n",
-              &expected_sdp);
-  EXPECT_EQ(expected_sdp, message);
-}
-
-TEST_F(WebRtcSdpTest, SerializeSessionDescriptionWithExtmap) {
-  bool encrypted = false;
-  AddExtmap(encrypted);
-  JsepSessionDescription desc_with_extmap("dummy");
-  MakeDescriptionWithoutCandidates(&desc_with_extmap);
-  std::string message = webrtc::SdpSerialize(desc_with_extmap, false);
-
-  std::string sdp_with_extmap = kSdpString;
-  InjectAfter("a=mid:audio_content_name\r\n",
-              kExtmap, &sdp_with_extmap);
-  InjectAfter("a=mid:video_content_name\r\n",
-              kExtmap, &sdp_with_extmap);
-
-  EXPECT_EQ(sdp_with_extmap, message);
-}
-
-TEST_F(WebRtcSdpTest, SerializeSessionDescriptionWithExtmapEncrypted) {
-  bool encrypted = true;
-  AddExtmap(encrypted);
-  JsepSessionDescription desc_with_extmap("dummy");
-  ASSERT_TRUE(desc_with_extmap.Initialize(desc_.Copy(),
-                                          kSessionId, kSessionVersion));
-  TestSerialize(desc_with_extmap, false);
-}
-
-TEST_F(WebRtcSdpTest, SerializeCandidates) {
-  std::string message = webrtc::SdpSerializeCandidate(*jcandidate_);
-  EXPECT_EQ(std::string(kRawCandidate), message);
-
-  Candidate candidate_with_ufrag(candidates_.front());
-  candidate_with_ufrag.set_username("ABC");
-  jcandidate_.reset(new JsepIceCandidate(std::string("audio_content_name"), 0,
-                                         candidate_with_ufrag));
-  message = webrtc::SdpSerializeCandidate(*jcandidate_);
-  EXPECT_EQ(std::string(kRawCandidate) + " ufrag ABC", message);
-
-  Candidate candidate_with_network_info(candidates_.front());
-  candidate_with_network_info.set_network_id(1);
-  jcandidate_.reset(new JsepIceCandidate(std::string("audio"), 0,
-                                         candidate_with_network_info));
-  message = webrtc::SdpSerializeCandidate(*jcandidate_);
-  EXPECT_EQ(std::string(kRawCandidate) + " network-id 1", message);
-  candidate_with_network_info.set_network_cost(999);
-  jcandidate_.reset(new JsepIceCandidate(std::string("audio"), 0,
-                                         candidate_with_network_info));
-  message = webrtc::SdpSerializeCandidate(*jcandidate_);
-  EXPECT_EQ(std::string(kRawCandidate) + " network-id 1 network-cost 999",
-            message);
-}
-
-// TODO(mallinath) : Enable this test once WebRTCSdp capable of parsing
-// RFC 6544.
-TEST_F(WebRtcSdpTest, SerializeTcpCandidates) {
-  Candidate candidate(ICE_CANDIDATE_COMPONENT_RTP, "tcp",
-                      rtc::SocketAddress("192.168.1.5", 9), kCandidatePriority,
-                      "", "", LOCAL_PORT_TYPE, kCandidateGeneration,
-                      kCandidateFoundation1);
-  candidate.set_tcptype(cricket::TCPTYPE_ACTIVE_STR);
-  std::unique_ptr<IceCandidateInterface> jcandidate(
-      new JsepIceCandidate(std::string("audio_content_name"), 0, candidate));
-
-  std::string message = webrtc::SdpSerializeCandidate(*jcandidate);
-  EXPECT_EQ(std::string(kSdpTcpActiveCandidate), message);
-}
-
-TEST_F(WebRtcSdpTest, SerializeSessionDescriptionWithH264) {
-  cricket::VideoCodec h264_codec("H264");
-  h264_codec.SetParam("profile-level-id", "42e01f");
-  h264_codec.SetParam("level-asymmetry-allowed", "1");
-  h264_codec.SetParam("packetization-mode", "1");
-  video_desc_->AddCodec(h264_codec);
-
-  jdesc_.Initialize(desc_.Copy(), kSessionId, kSessionVersion);
-
-  std::string message = webrtc::SdpSerialize(jdesc_, false);
-  size_t after_pt = message.find(" H264/90000");
-  ASSERT_NE(after_pt, std::string::npos);
-  size_t before_pt = message.rfind("a=rtpmap:", after_pt);
-  ASSERT_NE(before_pt, std::string::npos);
-  before_pt += strlen("a=rtpmap:");
-  std::string pt = message.substr(before_pt, after_pt - before_pt);
-  // TODO(hta): Check if payload type |pt| occurs in the m=video line.
-  std::string to_find = "a=fmtp:" + pt + " ";
-  size_t fmtp_pos = message.find(to_find);
-  ASSERT_NE(std::string::npos, fmtp_pos) << "Failed to find " << to_find;
-  size_t fmtp_endpos = message.find("\n", fmtp_pos);
-  ASSERT_NE(std::string::npos, fmtp_endpos);
-  std::string fmtp_value = message.substr(fmtp_pos, fmtp_endpos);
-  EXPECT_NE(std::string::npos, fmtp_value.find("level-asymmetry-allowed=1"));
-  EXPECT_NE(std::string::npos, fmtp_value.find("packetization-mode=1"));
-  EXPECT_NE(std::string::npos, fmtp_value.find("profile-level-id=42e01f"));
-  // Check that there are no spaces after semicolons.
-  // https://bugs.webrtc.org/5793
-  EXPECT_EQ(std::string::npos, fmtp_value.find("; "));
-}
-
-TEST_F(WebRtcSdpTest, DeserializeSessionDescription) {
-  JsepSessionDescription jdesc(kDummyString);
-  // Deserialize
-  EXPECT_TRUE(SdpDeserialize(kSdpFullString, &jdesc));
-  // Verify
-  EXPECT_TRUE(CompareSessionDescription(jdesc_, jdesc));
-}
-
-TEST_F(WebRtcSdpTest, DeserializeSessionDescriptionWithoutMline) {
-  JsepSessionDescription jdesc(kDummyString);
-  const char kSdpWithoutMline[] =
-    "v=0\r\n"
-    "o=- 18446744069414584320 18446462598732840960 IN IP4 127.0.0.1\r\n"
-    "s=-\r\n"
-    "t=0 0\r\n"
-    "a=msid-semantic: WMS local_stream_1 local_stream_2\r\n";
-  // Deserialize
-  EXPECT_TRUE(SdpDeserialize(kSdpWithoutMline, &jdesc));
-  EXPECT_EQ(0u, jdesc.description()->contents().size());
-}
-
-TEST_F(WebRtcSdpTest, DeserializeSessionDescriptionWithoutCarriageReturn) {
-  JsepSessionDescription jdesc(kDummyString);
-  std::string sdp_without_carriage_return = kSdpFullString;
-  Replace("\r\n", "\n", &sdp_without_carriage_return);
-  // Deserialize
-  EXPECT_TRUE(SdpDeserialize(sdp_without_carriage_return, &jdesc));
-  // Verify
-  EXPECT_TRUE(CompareSessionDescription(jdesc_, jdesc));
-}
-
-TEST_F(WebRtcSdpTest, DeserializeSessionDescriptionWithoutCandidates) {
-  // SessionDescription with desc but without candidates.
-  JsepSessionDescription jdesc_no_candidates(kDummyString);
-  ASSERT_TRUE(jdesc_no_candidates.Initialize(desc_.Copy(),
-                                             kSessionId, kSessionVersion));
-  JsepSessionDescription new_jdesc(kDummyString);
-  EXPECT_TRUE(SdpDeserialize(kSdpString, &new_jdesc));
-  EXPECT_TRUE(CompareSessionDescription(jdesc_no_candidates, new_jdesc));
-}
-
-TEST_F(WebRtcSdpTest, DeserializeSessionDescriptionWithoutRtpmap) {
-  static const char kSdpNoRtpmapString[] =
-      "v=0\r\n"
-      "o=- 11 22 IN IP4 127.0.0.1\r\n"
-      "s=-\r\n"
-      "t=0 0\r\n"
-      "m=audio 49232 RTP/AVP 0 18 103\r\n"
-      // Codec that doesn't appear in the m= line will be ignored.
-      "a=rtpmap:104 ISAC/32000\r\n"
-      // The rtpmap line for static payload codec is optional.
-      "a=rtpmap:18 G729/16000\r\n"
-      "a=rtpmap:103 ISAC/16000\r\n";
-
-  JsepSessionDescription jdesc(kDummyString);
-  EXPECT_TRUE(SdpDeserialize(kSdpNoRtpmapString, &jdesc));
-  cricket::AudioContentDescription* audio =
-    static_cast<AudioContentDescription*>(
-        jdesc.description()->GetContentDescriptionByName(cricket::CN_AUDIO));
-  AudioCodecs ref_codecs;
-  // The codecs in the AudioContentDescription should be in the same order as
-  // the payload types (<fmt>s) on the m= line.
-  ref_codecs.push_back(AudioCodec(0, "PCMU", 8000, 0, 1));
-  ref_codecs.push_back(AudioCodec(18, "G729", 16000, 0, 1));
-  ref_codecs.push_back(AudioCodec(103, "ISAC", 16000, 0, 1));
-  EXPECT_EQ(ref_codecs, audio->codecs());
-}
-
-TEST_F(WebRtcSdpTest, DeserializeSessionDescriptionWithoutRtpmapButWithFmtp) {
-  static const char kSdpNoRtpmapString[] =
-      "v=0\r\n"
-      "o=- 11 22 IN IP4 127.0.0.1\r\n"
-      "s=-\r\n"
-      "t=0 0\r\n"
-      "m=audio 49232 RTP/AVP 18 103\r\n"
-      "a=fmtp:18 annexb=yes\r\n"
-      "a=rtpmap:103 ISAC/16000\r\n";
-
-  JsepSessionDescription jdesc(kDummyString);
-  EXPECT_TRUE(SdpDeserialize(kSdpNoRtpmapString, &jdesc));
-  cricket::AudioContentDescription* audio =
-    static_cast<AudioContentDescription*>(
-        jdesc.description()->GetContentDescriptionByName(cricket::CN_AUDIO));
-
-  cricket::AudioCodec g729 = audio->codecs()[0];
-  EXPECT_EQ("G729", g729.name);
-  EXPECT_EQ(8000, g729.clockrate);
-  EXPECT_EQ(18, g729.id);
-  cricket::CodecParameterMap::iterator found =
-      g729.params.find("annexb");
-  ASSERT_TRUE(found != g729.params.end());
-  EXPECT_EQ(found->second, "yes");
-
-  cricket::AudioCodec isac = audio->codecs()[1];
-  EXPECT_EQ("ISAC", isac.name);
-  EXPECT_EQ(103, isac.id);
-  EXPECT_EQ(16000, isac.clockrate);
-}
-
-// Ensure that we can deserialize SDP with a=fingerprint properly.
-TEST_F(WebRtcSdpTest, DeserializeJsepSessionDescriptionWithFingerprint) {
-  // Add a DTLS a=fingerprint attribute to our session description.
-  AddFingerprint();
-  JsepSessionDescription new_jdesc(kDummyString);
-  ASSERT_TRUE(new_jdesc.Initialize(desc_.Copy(),
-                                   jdesc_.session_id(),
-                                   jdesc_.session_version()));
-
-  JsepSessionDescription jdesc_with_fingerprint(kDummyString);
-  std::string sdp_with_fingerprint = kSdpString;
-  InjectAfter(kAttributeIcePwdVoice, kFingerprint, &sdp_with_fingerprint);
-  InjectAfter(kAttributeIcePwdVideo, kFingerprint, &sdp_with_fingerprint);
-  EXPECT_TRUE(SdpDeserialize(sdp_with_fingerprint, &jdesc_with_fingerprint));
-  EXPECT_TRUE(CompareSessionDescription(jdesc_with_fingerprint, new_jdesc));
-}
-
-TEST_F(WebRtcSdpTest, DeserializeSessionDescriptionWithBundle) {
-  JsepSessionDescription jdesc_with_bundle(kDummyString);
-  std::string sdp_with_bundle = kSdpFullString;
-  InjectAfter(kSessionTime,
-              "a=group:BUNDLE audio_content_name video_content_name\r\n",
-              &sdp_with_bundle);
-  EXPECT_TRUE(SdpDeserialize(sdp_with_bundle, &jdesc_with_bundle));
-  ContentGroup group(cricket::GROUP_TYPE_BUNDLE);
-  group.AddContentName(kAudioContentName);
-  group.AddContentName(kVideoContentName);
-  desc_.AddGroup(group);
-  ASSERT_TRUE(jdesc_.Initialize(desc_.Copy(),
-                                jdesc_.session_id(),
-                                jdesc_.session_version()));
-  EXPECT_TRUE(CompareSessionDescription(jdesc_, jdesc_with_bundle));
-}
-
-TEST_F(WebRtcSdpTest, DeserializeSessionDescriptionWithBandwidth) {
-  JsepSessionDescription jdesc_with_bandwidth(kDummyString);
-  std::string sdp_with_bandwidth = kSdpFullString;
-  InjectAfter("a=mid:video_content_name\r\na=sendrecv\r\n",
-              "b=AS:100\r\n",
-              &sdp_with_bandwidth);
-  InjectAfter("a=mid:audio_content_name\r\na=sendrecv\r\n",
-              "b=AS:50\r\n",
-              &sdp_with_bandwidth);
-  EXPECT_TRUE(
-      SdpDeserialize(sdp_with_bandwidth, &jdesc_with_bandwidth));
-  VideoContentDescription* vcd = static_cast<VideoContentDescription*>(
-      GetFirstVideoContent(&desc_)->description);
-  vcd->set_bandwidth(100 * 1000);
-  AudioContentDescription* acd = static_cast<AudioContentDescription*>(
-      GetFirstAudioContent(&desc_)->description);
-  acd->set_bandwidth(50 * 1000);
-  ASSERT_TRUE(jdesc_.Initialize(desc_.Copy(),
-                                jdesc_.session_id(),
-                                jdesc_.session_version()));
-  EXPECT_TRUE(CompareSessionDescription(jdesc_, jdesc_with_bandwidth));
-}
-
-TEST_F(WebRtcSdpTest, DeserializeSessionDescriptionWithIceOptions) {
-  JsepSessionDescription jdesc_with_ice_options(kDummyString);
-  std::string sdp_with_ice_options = kSdpFullString;
-  InjectAfter(kSessionTime,
-              "a=ice-options:iceoption3\r\n",
-              &sdp_with_ice_options);
-  InjectAfter(kAttributeIcePwdVoice,
-              "a=ice-options:iceoption1\r\n",
-              &sdp_with_ice_options);
-  InjectAfter(kAttributeIcePwdVideo,
-              "a=ice-options:iceoption2\r\n",
-              &sdp_with_ice_options);
-  EXPECT_TRUE(SdpDeserialize(sdp_with_ice_options, &jdesc_with_ice_options));
-  std::vector<std::string> transport_options;
-  transport_options.push_back(kIceOption3);
-  transport_options.push_back(kIceOption1);
-  AddIceOptions(kAudioContentName, transport_options);
-  transport_options.clear();
-  transport_options.push_back(kIceOption3);
-  transport_options.push_back(kIceOption2);
-  AddIceOptions(kVideoContentName, transport_options);
-  ASSERT_TRUE(jdesc_.Initialize(desc_.Copy(),
-                                jdesc_.session_id(),
-                                jdesc_.session_version()));
-  EXPECT_TRUE(CompareSessionDescription(jdesc_, jdesc_with_ice_options));
-}
-
-TEST_F(WebRtcSdpTest, DeserializeSessionDescriptionWithUfragPwd) {
-  // Remove the original ice-ufrag and ice-pwd
-  JsepSessionDescription jdesc_with_ufrag_pwd(kDummyString);
-  std::string sdp_with_ufrag_pwd = kSdpFullString;
-  EXPECT_TRUE(RemoveCandidateUfragPwd(&sdp_with_ufrag_pwd));
-  // Add session level ufrag and pwd
-  InjectAfter(kSessionTime,
-      "a=ice-pwd:session+level+icepwd\r\n"
-      "a=ice-ufrag:session+level+iceufrag\r\n",
-      &sdp_with_ufrag_pwd);
-  // Add media level ufrag and pwd for audio
-  InjectAfter("a=mid:audio_content_name\r\n",
-      "a=ice-pwd:media+level+icepwd\r\na=ice-ufrag:media+level+iceufrag\r\n",
-      &sdp_with_ufrag_pwd);
-  // Update the candidate ufrag and pwd to the expected ones.
-  EXPECT_TRUE(UpdateCandidateUfragPwd(&jdesc_, 0,
-      "media+level+iceufrag", "media+level+icepwd"));
-  EXPECT_TRUE(UpdateCandidateUfragPwd(&jdesc_, 1,
-      "session+level+iceufrag", "session+level+icepwd"));
-  EXPECT_TRUE(SdpDeserialize(sdp_with_ufrag_pwd, &jdesc_with_ufrag_pwd));
-  EXPECT_TRUE(CompareSessionDescription(jdesc_, jdesc_with_ufrag_pwd));
-}
-
-TEST_F(WebRtcSdpTest, DeserializeSessionDescriptionWithRecvOnlyContent) {
-  EXPECT_TRUE(TestDeserializeDirection(cricket::MD_RECVONLY));
-}
-
-TEST_F(WebRtcSdpTest, DeserializeSessionDescriptionWithSendOnlyContent) {
-  EXPECT_TRUE(TestDeserializeDirection(cricket::MD_SENDONLY));
-}
-
-TEST_F(WebRtcSdpTest, DeserializeSessionDescriptionWithInactiveContent) {
-  EXPECT_TRUE(TestDeserializeDirection(cricket::MD_INACTIVE));
-}
-
-TEST_F(WebRtcSdpTest, DeserializeSessionDescriptionWithRejectedAudio) {
-  EXPECT_TRUE(TestDeserializeRejected(true, false));
-}
-
-TEST_F(WebRtcSdpTest, DeserializeSessionDescriptionWithRejectedVideo) {
-  EXPECT_TRUE(TestDeserializeRejected(false, true));
-}
-
-TEST_F(WebRtcSdpTest, DeserializeSessionDescriptionWithRejectedAudioVideo) {
-  EXPECT_TRUE(TestDeserializeRejected(true, true));
-}
-
-// Tests that we can still handle the sdp uses mslabel and label instead of
-// msid for backward compatibility.
-TEST_F(WebRtcSdpTest, DeserializeSessionDescriptionWithoutMsid) {
-  jdesc_.description()->set_msid_supported(false);
-  JsepSessionDescription jdesc(kDummyString);
-  std::string sdp_without_msid = kSdpFullString;
-  Replace("msid", "xmsid", &sdp_without_msid);
-  // Deserialize
-  EXPECT_TRUE(SdpDeserialize(sdp_without_msid, &jdesc));
-  // Verify
-  EXPECT_TRUE(CompareSessionDescription(jdesc_, jdesc));
-}
-
-TEST_F(WebRtcSdpTest, DeserializeCandidate) {
-  JsepIceCandidate jcandidate(kDummyMid, kDummyIndex);
-
-  std::string sdp = kSdpOneCandidate;
-  EXPECT_TRUE(SdpDeserializeCandidate(sdp, &jcandidate));
-  EXPECT_EQ(kDummyMid, jcandidate.sdp_mid());
-  EXPECT_EQ(kDummyIndex, jcandidate.sdp_mline_index());
-  EXPECT_TRUE(jcandidate.candidate().IsEquivalent(jcandidate_->candidate()));
-  EXPECT_EQ(0, jcandidate.candidate().network_cost());
-
-  // Candidate line without generation extension.
-  sdp = kSdpOneCandidate;
-  Replace(" generation 2", "", &sdp);
-  EXPECT_TRUE(SdpDeserializeCandidate(sdp, &jcandidate));
-  EXPECT_EQ(kDummyMid, jcandidate.sdp_mid());
-  EXPECT_EQ(kDummyIndex, jcandidate.sdp_mline_index());
-  Candidate expected = jcandidate_->candidate();
-  expected.set_generation(0);
-  EXPECT_TRUE(jcandidate.candidate().IsEquivalent(expected));
-
-  // Candidate with network id and/or cost.
-  sdp = kSdpOneCandidate;
-  Replace(" generation 2", " generation 2 network-id 2", &sdp);
-  EXPECT_TRUE(SdpDeserializeCandidate(sdp, &jcandidate));
-  EXPECT_EQ(kDummyMid, jcandidate.sdp_mid());
-  EXPECT_EQ(kDummyIndex, jcandidate.sdp_mline_index());
-  expected = jcandidate_->candidate();
-  expected.set_network_id(2);
-  EXPECT_TRUE(jcandidate.candidate().IsEquivalent(expected));
-  EXPECT_EQ(0, jcandidate.candidate().network_cost());
-  // Add network cost
-  Replace(" network-id 2", " network-id 2 network-cost 9", &sdp);
-  EXPECT_TRUE(SdpDeserializeCandidate(sdp, &jcandidate));
-  EXPECT_TRUE(jcandidate.candidate().IsEquivalent(expected));
-  EXPECT_EQ(9, jcandidate.candidate().network_cost());
-
-  sdp = kSdpTcpActiveCandidate;
-  EXPECT_TRUE(SdpDeserializeCandidate(sdp, &jcandidate));
-  // Make a cricket::Candidate equivalent to kSdpTcpCandidate string.
-  Candidate candidate(ICE_CANDIDATE_COMPONENT_RTP, "tcp",
-                      rtc::SocketAddress("192.168.1.5", 9), kCandidatePriority,
-                      "", "", LOCAL_PORT_TYPE, kCandidateGeneration,
-                      kCandidateFoundation1);
-  std::unique_ptr<IceCandidateInterface> jcandidate_template(
-      new JsepIceCandidate(std::string("audio_content_name"), 0, candidate));
-  EXPECT_TRUE(jcandidate.candidate().IsEquivalent(
-                    jcandidate_template->candidate()));
-  sdp = kSdpTcpPassiveCandidate;
-  EXPECT_TRUE(SdpDeserializeCandidate(sdp, &jcandidate));
-  sdp = kSdpTcpSOCandidate;
-  EXPECT_TRUE(SdpDeserializeCandidate(sdp, &jcandidate));
-}
-
-// This test verifies the deserialization of candidate-attribute
-// as per RFC 5245. Candiate-attribute will be of the format
-// candidate:<blah>. This format will be used when candidates
-// are trickled.
-TEST_F(WebRtcSdpTest, DeserializeRawCandidateAttribute) {
-  JsepIceCandidate jcandidate(kDummyMid, kDummyIndex);
-
-  std::string candidate_attribute = kRawCandidate;
-  EXPECT_TRUE(SdpDeserializeCandidate(candidate_attribute, &jcandidate));
-  EXPECT_EQ(kDummyMid, jcandidate.sdp_mid());
-  EXPECT_EQ(kDummyIndex, jcandidate.sdp_mline_index());
-  EXPECT_TRUE(jcandidate.candidate().IsEquivalent(jcandidate_->candidate()));
-  EXPECT_EQ(2u, jcandidate.candidate().generation());
-
-  // Candidate line without generation extension.
-  candidate_attribute = kRawCandidate;
-  Replace(" generation 2", "", &candidate_attribute);
-  EXPECT_TRUE(SdpDeserializeCandidate(candidate_attribute, &jcandidate));
-  EXPECT_EQ(kDummyMid, jcandidate.sdp_mid());
-  EXPECT_EQ(kDummyIndex, jcandidate.sdp_mline_index());
-  Candidate expected = jcandidate_->candidate();
-  expected.set_generation(0);
-  EXPECT_TRUE(jcandidate.candidate().IsEquivalent(expected));
-
-  // Candidate line without candidate:
-  candidate_attribute = kRawCandidate;
-  Replace("candidate:", "", &candidate_attribute);
-  EXPECT_FALSE(SdpDeserializeCandidate(candidate_attribute, &jcandidate));
-
-  // Candidate line with IPV6 address.
-  EXPECT_TRUE(SdpDeserializeCandidate(kRawIPV6Candidate, &jcandidate));
-}
-
-// This test verifies that the deserialization of an invalid candidate string
-// fails.
-TEST_F(WebRtcSdpTest, DeserializeInvalidCandidiate) {
-    JsepIceCandidate jcandidate(kDummyMid, kDummyIndex);
-
-  std::string candidate_attribute = kRawCandidate;
-  candidate_attribute.replace(0, 1, "x");
-  EXPECT_FALSE(SdpDeserializeCandidate(candidate_attribute, &jcandidate));
-
-  candidate_attribute = kSdpOneCandidate;
-  candidate_attribute.replace(0, 1, "x");
-  EXPECT_FALSE(SdpDeserializeCandidate(candidate_attribute, &jcandidate));
-
-  candidate_attribute = kRawCandidate;
-  candidate_attribute.append("\r\n");
-  candidate_attribute.append(kRawCandidate);
-  EXPECT_FALSE(SdpDeserializeCandidate(candidate_attribute, &jcandidate));
-
-  EXPECT_FALSE(SdpDeserializeCandidate(kSdpTcpInvalidCandidate, &jcandidate));
-}
-
-TEST_F(WebRtcSdpTest, DeserializeSdpWithRtpDataChannels) {
-  AddRtpDataChannel();
-  JsepSessionDescription jdesc(kDummyString);
-  ASSERT_TRUE(jdesc.Initialize(desc_.Copy(), kSessionId, kSessionVersion));
-
-  std::string sdp_with_data = kSdpString;
-  sdp_with_data.append(kSdpRtpDataChannelString);
-  JsepSessionDescription jdesc_output(kDummyString);
-
-  // Deserialize
-  EXPECT_TRUE(SdpDeserialize(sdp_with_data, &jdesc_output));
-  // Verify
-  EXPECT_TRUE(CompareSessionDescription(jdesc, jdesc_output));
-}
-
-TEST_F(WebRtcSdpTest, DeserializeSdpWithSctpDataChannels) {
-  bool use_sctpmap = true;
-  AddSctpDataChannel(use_sctpmap);
-  JsepSessionDescription jdesc(kDummyString);
-  ASSERT_TRUE(jdesc.Initialize(desc_.Copy(), kSessionId, kSessionVersion));
-
-  std::string sdp_with_data = kSdpString;
-  sdp_with_data.append(kSdpSctpDataChannelString);
-  JsepSessionDescription jdesc_output(kDummyString);
-
-  // Verify with DTLS/SCTP (already in kSdpSctpDataChannelString).
-  EXPECT_TRUE(SdpDeserialize(sdp_with_data, &jdesc_output));
-  EXPECT_TRUE(CompareSessionDescription(jdesc, jdesc_output));
-
-  // Verify with UDP/DTLS/SCTP.
-  sdp_with_data.replace(sdp_with_data.find(kDtlsSctp),
-                        strlen(kDtlsSctp), kUdpDtlsSctp);
-  EXPECT_TRUE(SdpDeserialize(sdp_with_data, &jdesc_output));
-  EXPECT_TRUE(CompareSessionDescription(jdesc, jdesc_output));
-
-  // Verify with TCP/DTLS/SCTP.
-  sdp_with_data.replace(sdp_with_data.find(kUdpDtlsSctp),
-                        strlen(kUdpDtlsSctp), kTcpDtlsSctp);
-  EXPECT_TRUE(SdpDeserialize(sdp_with_data, &jdesc_output));
-  EXPECT_TRUE(CompareSessionDescription(jdesc, jdesc_output));
-}
-
-TEST_F(WebRtcSdpTest, DeserializeSdpWithSctpDataChannelsWithSctpPort) {
-  bool use_sctpmap = false;
-  AddSctpDataChannel(use_sctpmap);
-  JsepSessionDescription jdesc(kDummyString);
-  ASSERT_TRUE(jdesc.Initialize(desc_.Copy(), kSessionId, kSessionVersion));
-
-  std::string sdp_with_data = kSdpString;
-  sdp_with_data.append(kSdpSctpDataChannelStringWithSctpPort);
-  JsepSessionDescription jdesc_output(kDummyString);
-
-  // Verify with DTLS/SCTP (already in kSdpSctpDataChannelStringWithSctpPort).
-  EXPECT_TRUE(SdpDeserialize(sdp_with_data, &jdesc_output));
-  EXPECT_TRUE(CompareSessionDescription(jdesc, jdesc_output));
-
-  // Verify with UDP/DTLS/SCTP.
-  sdp_with_data.replace(sdp_with_data.find(kDtlsSctp),
-                        strlen(kDtlsSctp), kUdpDtlsSctp);
-  EXPECT_TRUE(SdpDeserialize(sdp_with_data, &jdesc_output));
-  EXPECT_TRUE(CompareSessionDescription(jdesc, jdesc_output));
-
-  // Verify with TCP/DTLS/SCTP.
-  sdp_with_data.replace(sdp_with_data.find(kUdpDtlsSctp),
-                        strlen(kUdpDtlsSctp), kTcpDtlsSctp);
-  EXPECT_TRUE(SdpDeserialize(sdp_with_data, &jdesc_output));
-  EXPECT_TRUE(CompareSessionDescription(jdesc, jdesc_output));
-}
-
-TEST_F(WebRtcSdpTest, DeserializeSdpWithSctpDataChannelsWithSctpColonPort) {
-  bool use_sctpmap = false;
-  AddSctpDataChannel(use_sctpmap);
-  JsepSessionDescription jdesc(kDummyString);
-  ASSERT_TRUE(jdesc.Initialize(desc_.Copy(), kSessionId, kSessionVersion));
-
-  std::string sdp_with_data = kSdpString;
-  sdp_with_data.append(kSdpSctpDataChannelStringWithSctpColonPort);
-  JsepSessionDescription jdesc_output(kDummyString);
-
-  // Verify with DTLS/SCTP.
-  EXPECT_TRUE(SdpDeserialize(sdp_with_data, &jdesc_output));
-  EXPECT_TRUE(CompareSessionDescription(jdesc, jdesc_output));
-
-  // Verify with UDP/DTLS/SCTP.
-  sdp_with_data.replace(sdp_with_data.find(kDtlsSctp),
-                        strlen(kDtlsSctp), kUdpDtlsSctp);
-  EXPECT_TRUE(SdpDeserialize(sdp_with_data, &jdesc_output));
-  EXPECT_TRUE(CompareSessionDescription(jdesc, jdesc_output));
-
-  // Verify with TCP/DTLS/SCTP.
-  sdp_with_data.replace(sdp_with_data.find(kUdpDtlsSctp),
-                        strlen(kUdpDtlsSctp), kTcpDtlsSctp);
-  EXPECT_TRUE(SdpDeserialize(sdp_with_data, &jdesc_output));
-  EXPECT_TRUE(CompareSessionDescription(jdesc, jdesc_output));
-}
-
-// Test to check the behaviour if sctp-port is specified
-// on the m= line and in a=sctp-port.
-TEST_F(WebRtcSdpTest, DeserializeSdpWithMultiSctpPort) {
-  bool use_sctpmap = true;
-  AddSctpDataChannel(use_sctpmap);
-  JsepSessionDescription jdesc(kDummyString);
-  ASSERT_TRUE(jdesc.Initialize(desc_.Copy(), kSessionId, kSessionVersion));
-
-  std::string sdp_with_data = kSdpString;
-  // Append m= attributes
-  sdp_with_data.append(kSdpSctpDataChannelString);
-  // Append a=sctp-port attribute
-  sdp_with_data.append("a=sctp-port 5000\r\n");
-  JsepSessionDescription jdesc_output(kDummyString);
-
-  EXPECT_FALSE(SdpDeserialize(sdp_with_data, &jdesc_output));
-}
-
-// For crbug/344475.
-TEST_F(WebRtcSdpTest, DeserializeSdpWithCorruptedSctpDataChannels) {
-  std::string sdp_with_data = kSdpString;
-  sdp_with_data.append(kSdpSctpDataChannelString);
-  // Remove the "\n" at the end.
-  sdp_with_data = sdp_with_data.substr(0, sdp_with_data.size() - 1);
-  JsepSessionDescription jdesc_output(kDummyString);
-
-  EXPECT_FALSE(SdpDeserialize(sdp_with_data, &jdesc_output));
-  // No crash is a pass.
-}
-
-void MutateJsepSctpPort(JsepSessionDescription& jdesc,
-                        const SessionDescription& desc) {
-  // take our pre-built session description and change the SCTP port.
-  cricket::SessionDescription* mutant = desc.Copy();
-  DataContentDescription* dcdesc = static_cast<DataContentDescription*>(
-      mutant->GetContentDescriptionByName(kDataContentName));
-  std::vector<cricket::DataCodec> codecs(dcdesc->codecs());
-  EXPECT_EQ(1U, codecs.size());
-  EXPECT_EQ(cricket::kGoogleSctpDataCodecPlType, codecs[0].id);
-  codecs[0].SetParam(cricket::kCodecParamPort, kUnusualSctpPort);
-  dcdesc->set_codecs(codecs);
-
-  // note: mutant's owned by jdesc now.
-  ASSERT_TRUE(jdesc.Initialize(mutant, kSessionId, kSessionVersion));
-  mutant = NULL;
-}
-
-TEST_F(WebRtcSdpTest, DeserializeSdpWithSctpDataChannelAndUnusualPort) {
-  bool use_sctpmap = true;
-  AddSctpDataChannel(use_sctpmap);
-
-  // First setup the expected JsepSessionDescription.
-  JsepSessionDescription jdesc(kDummyString);
-  MutateJsepSctpPort(jdesc, desc_);
-
-  // Then get the deserialized JsepSessionDescription.
-  std::string sdp_with_data = kSdpString;
-  sdp_with_data.append(kSdpSctpDataChannelString);
-  rtc::replace_substrs(kDefaultSctpPortStr, strlen(kDefaultSctpPortStr),
-                       kUnusualSctpPortStr, strlen(kUnusualSctpPortStr),
-                       &sdp_with_data);
-  JsepSessionDescription jdesc_output(kDummyString);
-
-  EXPECT_TRUE(SdpDeserialize(sdp_with_data, &jdesc_output));
-  EXPECT_TRUE(CompareSessionDescription(jdesc, jdesc_output));
-}
-
-TEST_F(WebRtcSdpTest,
-       DeserializeSdpWithSctpDataChannelAndUnusualPortInAttribute) {
-  bool use_sctpmap = false;
-  AddSctpDataChannel(use_sctpmap);
-
-  JsepSessionDescription jdesc(kDummyString);
-  MutateJsepSctpPort(jdesc, desc_);
-
-  // We need to test the deserialized JsepSessionDescription from
-  // kSdpSctpDataChannelStringWithSctpPort for
-  // draft-ietf-mmusic-sctp-sdp-07
-  // a=sctp-port
-  std::string sdp_with_data = kSdpString;
-  sdp_with_data.append(kSdpSctpDataChannelStringWithSctpPort);
-  rtc::replace_substrs(kDefaultSctpPortStr, strlen(kDefaultSctpPortStr),
-                       kUnusualSctpPortStr, strlen(kUnusualSctpPortStr),
-                       &sdp_with_data);
-  JsepSessionDescription jdesc_output(kDummyString);
-
-  EXPECT_TRUE(SdpDeserialize(sdp_with_data, &jdesc_output));
-  EXPECT_TRUE(CompareSessionDescription(jdesc, jdesc_output));
-}
-
-TEST_F(WebRtcSdpTest, DeserializeSdpWithRtpDataChannelsAndBandwidth) {
-  // We want to test that deserializing data content limits bandwidth
-  // settings (it should never be greater than the default).
-  // This should prevent someone from using unlimited data bandwidth through
-  // JS and "breaking the Internet".
-  // See: https://code.google.com/p/chromium/issues/detail?id=280726
-  std::string sdp_with_bandwidth = kSdpString;
-  sdp_with_bandwidth.append(kSdpRtpDataChannelString);
-  InjectAfter("a=mid:data_content_name\r\n",
-              "b=AS:100\r\n",
-              &sdp_with_bandwidth);
-  JsepSessionDescription jdesc_with_bandwidth(kDummyString);
-
-  EXPECT_FALSE(SdpDeserialize(sdp_with_bandwidth, &jdesc_with_bandwidth));
-}
-
-TEST_F(WebRtcSdpTest, DeserializeSdpWithSctpDataChannelsAndBandwidth) {
-  bool use_sctpmap = true;
-  AddSctpDataChannel(use_sctpmap);
-  JsepSessionDescription jdesc(kDummyString);
-  DataContentDescription* dcd = static_cast<DataContentDescription*>(
-     GetFirstDataContent(&desc_)->description);
-  dcd->set_bandwidth(100 * 1000);
-  ASSERT_TRUE(jdesc.Initialize(desc_.Copy(), kSessionId, kSessionVersion));
-
-  std::string sdp_with_bandwidth = kSdpString;
-  sdp_with_bandwidth.append(kSdpSctpDataChannelString);
-  InjectAfter("a=mid:data_content_name\r\n",
-              "b=AS:100\r\n",
-              &sdp_with_bandwidth);
-  JsepSessionDescription jdesc_with_bandwidth(kDummyString);
-
-  // SCTP has congestion control, so we shouldn't limit the bandwidth
-  // as we do for RTP.
-  EXPECT_TRUE(SdpDeserialize(sdp_with_bandwidth, &jdesc_with_bandwidth));
-  EXPECT_TRUE(CompareSessionDescription(jdesc, jdesc_with_bandwidth));
-}
-
-class WebRtcSdpExtmapTest
-  : public WebRtcSdpTest, public testing::WithParamInterface<bool> {
-};
-
-TEST_P(WebRtcSdpExtmapTest,
-    DeserializeSessionDescriptionWithSessionLevelExtmap) {
-  bool encrypted = GetParam();
-  TestDeserializeExtmap(true, false, encrypted);
-}
-
-TEST_P(WebRtcSdpExtmapTest,
-    DeserializeSessionDescriptionWithMediaLevelExtmap) {
-  bool encrypted = GetParam();
-  TestDeserializeExtmap(false, true, encrypted);
-}
-
-TEST_P(WebRtcSdpExtmapTest,
-    DeserializeSessionDescriptionWithInvalidExtmap) {
-  bool encrypted = GetParam();
-  TestDeserializeExtmap(true, true, encrypted);
-}
-
-INSTANTIATE_TEST_CASE_P(Encrypted,
-                        WebRtcSdpExtmapTest,
-                        ::testing::Values(false, true));
-
-TEST_F(WebRtcSdpTest, DeserializeSessionDescriptionWithoutEndLineBreak) {
-  JsepSessionDescription jdesc(kDummyString);
-  std::string sdp = kSdpFullString;
-  sdp = sdp.substr(0, sdp.size() - 2);  // Remove \r\n at the end.
-  // Deserialize
-  SdpParseError error;
-  EXPECT_FALSE(webrtc::SdpDeserialize(sdp, &jdesc, &error));
-  const std::string lastline = "a=ssrc:3 label:video_track_id_1";
-  EXPECT_EQ(lastline, error.line);
-  EXPECT_EQ("Invalid SDP line.", error.description);
-}
-
-TEST_F(WebRtcSdpTest, DeserializeCandidateWithDifferentTransport) {
-  JsepIceCandidate jcandidate(kDummyMid, kDummyIndex);
-  std::string new_sdp = kSdpOneCandidate;
-  Replace("udp", "unsupported_transport", &new_sdp);
-  EXPECT_FALSE(SdpDeserializeCandidate(new_sdp, &jcandidate));
-  new_sdp = kSdpOneCandidate;
-  Replace("udp", "uDP", &new_sdp);
-  EXPECT_TRUE(SdpDeserializeCandidate(new_sdp, &jcandidate));
-  EXPECT_EQ(kDummyMid, jcandidate.sdp_mid());
-  EXPECT_EQ(kDummyIndex, jcandidate.sdp_mline_index());
-  EXPECT_TRUE(jcandidate.candidate().IsEquivalent(jcandidate_->candidate()));
-}
-
-TEST_F(WebRtcSdpTest, DeserializeCandidateWithUfragPwd) {
-  JsepIceCandidate jcandidate(kDummyMid, kDummyIndex);
-  EXPECT_TRUE(
-      SdpDeserializeCandidate(kSdpOneCandidateWithUfragPwd, &jcandidate));
-  EXPECT_EQ(kDummyMid, jcandidate.sdp_mid());
-  EXPECT_EQ(kDummyIndex, jcandidate.sdp_mline_index());
-  Candidate ref_candidate = jcandidate_->candidate();
-  ref_candidate.set_username("user_rtp");
-  ref_candidate.set_password("password_rtp");
-  EXPECT_TRUE(jcandidate.candidate().IsEquivalent(ref_candidate));
-}
-
-TEST_F(WebRtcSdpTest, DeserializeSdpWithConferenceFlag) {
-  JsepSessionDescription jdesc(kDummyString);
-
-  // Deserialize
-  EXPECT_TRUE(SdpDeserialize(kSdpConferenceString, &jdesc));
-
-  // Verify
-  cricket::AudioContentDescription* audio =
-    static_cast<AudioContentDescription*>(
-      jdesc.description()->GetContentDescriptionByName(cricket::CN_AUDIO));
-  EXPECT_TRUE(audio->conference_mode());
-
-  cricket::VideoContentDescription* video =
-    static_cast<VideoContentDescription*>(
-      jdesc.description()->GetContentDescriptionByName(cricket::CN_VIDEO));
-  EXPECT_TRUE(video->conference_mode());
-}
-
-TEST_F(WebRtcSdpTest, DeserializeBrokenSdp) {
-  const char kSdpDestroyer[] = "!@#$%^&";
-  const char kSdpEmptyType[] = " =candidate";
-  const char kSdpEqualAsPlus[] = "a+candidate";
-  const char kSdpSpaceAfterEqual[] = "a= candidate";
-  const char kSdpUpperType[] = "A=candidate";
-  const char kSdpEmptyLine[] = "";
-  const char kSdpMissingValue[] = "a=";
-
-  const char kSdpBrokenFingerprint[] = "a=fingerprint:sha-1 "
-      "4AAD:B9:B1:3F:82:18:3B:54:02:12:DF:3E:5D:49:6B:19:E5:7C:AB";
-  const char kSdpExtraField[] = "a=fingerprint:sha-1 "
-      "4A:AD:B9:B1:3F:82:18:3B:54:02:12:DF:3E:5D:49:6B:19:E5:7C:AB XXX";
-  const char kSdpMissingSpace[] = "a=fingerprint:sha-1"
-      "4A:AD:B9:B1:3F:82:18:3B:54:02:12:DF:3E:5D:49:6B:19:E5:7C:AB";
-  // MD5 is not allowed in fingerprints.
-  const char kSdpMd5[] = "a=fingerprint:md5 "
-      "4A:AD:B9:B1:3F:82:18:3B:54:02:12:DF:3E:5D:49:6B";
-
-  // Broken session description
-  ExpectParseFailure("v=", kSdpDestroyer);
-  ExpectParseFailure("o=", kSdpDestroyer);
-  ExpectParseFailure("s=-", kSdpDestroyer);
-  // Broken time description
-  ExpectParseFailure("t=", kSdpDestroyer);
-
-  // Broken media description
-  ExpectParseFailure("m=audio", "c=IN IP4 74.125.224.39");
-  ExpectParseFailure("m=video", kSdpDestroyer);
-
-  // Invalid lines
-  ExpectParseFailure("a=candidate", kSdpEmptyType);
-  ExpectParseFailure("a=candidate", kSdpEqualAsPlus);
-  ExpectParseFailure("a=candidate", kSdpSpaceAfterEqual);
-  ExpectParseFailure("a=candidate", kSdpUpperType);
-
-  // Bogus fingerprint replacing a=sendrev. We selected this attribute
-  // because it's orthogonal to what we are replacing and hence
-  // safe.
-  ExpectParseFailure("a=sendrecv", kSdpBrokenFingerprint);
-  ExpectParseFailure("a=sendrecv", kSdpExtraField);
-  ExpectParseFailure("a=sendrecv", kSdpMissingSpace);
-  ExpectParseFailure("a=sendrecv", kSdpMd5);
-
-  // Empty Line
-  ExpectParseFailure("a=rtcp:2347 IN IP4 74.125.127.126", kSdpEmptyLine);
-  ExpectParseFailure("a=rtcp:2347 IN IP4 74.125.127.126", kSdpMissingValue);
-}
-
-TEST_F(WebRtcSdpTest, DeserializeSdpWithInvalidAttributeValue) {
-  // ssrc
-  ExpectParseFailure("a=ssrc:1", "a=ssrc:badvalue");
-  ExpectParseFailure("a=ssrc-group:FEC 2 3", "a=ssrc-group:FEC badvalue 3");
-  // crypto
-  ExpectParseFailure("a=crypto:1 ", "a=crypto:badvalue ");
-  // rtpmap
-  ExpectParseFailure("a=rtpmap:111 ", "a=rtpmap:badvalue ");
-  ExpectParseFailure("opus/48000/2", "opus/badvalue/2");
-  ExpectParseFailure("opus/48000/2", "opus/48000/badvalue");
-  // candidate
-  ExpectParseFailure("1 udp 2130706432", "badvalue udp 2130706432");
-  ExpectParseFailure("1 udp 2130706432", "1 udp badvalue");
-  ExpectParseFailure("192.168.1.5 1234", "192.168.1.5 badvalue");
-  ExpectParseFailure("rport 2346", "rport badvalue");
-  ExpectParseFailure("rport 2346 generation 2",
-                     "rport 2346 generation badvalue");
-  // m line
-  ExpectParseFailure("m=audio 2345 RTP/SAVPF 111 103 104",
-                     "m=audio 2345 RTP/SAVPF 111 badvalue 104");
-
-  // bandwidth
-  ExpectParseFailureWithNewLines("a=mid:video_content_name\r\n",
-                                 "b=AS:badvalue\r\n",
-                                 "b=AS:badvalue");
-  // rtcp-fb
-  ExpectParseFailureWithNewLines("a=mid:video_content_name\r\n",
-                                 "a=rtcp-fb:badvalue nack\r\n",
-                                 "a=rtcp-fb:badvalue nack");
-  // extmap
-  ExpectParseFailureWithNewLines("a=mid:video_content_name\r\n",
-                                 "a=extmap:badvalue http://example.com\r\n",
-                                 "a=extmap:badvalue http://example.com");
-}
-
-TEST_F(WebRtcSdpTest, DeserializeSdpWithReorderedPltypes) {
-  JsepSessionDescription jdesc_output(kDummyString);
-
-  const char kSdpWithReorderedPlTypesString[] =
-      "v=0\r\n"
-      "o=- 18446744069414584320 18446462598732840960 IN IP4 127.0.0.1\r\n"
-      "s=-\r\n"
-      "t=0 0\r\n"
-      "m=audio 9 RTP/SAVPF 104 103\r\n"  // Pl type 104 preferred.
-      "a=rtpmap:111 opus/48000/2\r\n"  // Pltype 111 listed before 103 and 104
-                                       // in the map.
-      "a=rtpmap:103 ISAC/16000\r\n"  // Pltype 103 listed before 104 in the map.
-      "a=rtpmap:104 ISAC/32000\r\n";
-
-  // Deserialize
-  EXPECT_TRUE(SdpDeserialize(kSdpWithReorderedPlTypesString, &jdesc_output));
-
-  const ContentInfo* ac = GetFirstAudioContent(jdesc_output.description());
-  ASSERT_TRUE(ac != NULL);
-  const AudioContentDescription* acd =
-      static_cast<const AudioContentDescription*>(ac->description);
-  ASSERT_FALSE(acd->codecs().empty());
-  EXPECT_EQ("ISAC", acd->codecs()[0].name);
-  EXPECT_EQ(32000, acd->codecs()[0].clockrate);
-  EXPECT_EQ(104, acd->codecs()[0].id);
-}
-
-TEST_F(WebRtcSdpTest, DeserializeSerializeCodecParams) {
-  JsepSessionDescription jdesc_output(kDummyString);
-  CodecParams params;
-  params.max_ptime = 40;
-  params.ptime = 30;
-  params.min_ptime = 10;
-  params.sprop_stereo = 1;
-  params.stereo = 1;
-  params.useinband = 1;
-  params.maxaveragebitrate = 128000;
-  TestDeserializeCodecParams(params, &jdesc_output);
-  TestSerialize(jdesc_output, false);
-}
-
-TEST_F(WebRtcSdpTest, DeserializeSerializeRtcpFb) {
-  const bool kUseWildcard = false;
-  JsepSessionDescription jdesc_output(kDummyString);
-  TestDeserializeRtcpFb(&jdesc_output, kUseWildcard);
-  TestSerialize(jdesc_output, false);
-}
-
-TEST_F(WebRtcSdpTest, DeserializeSerializeRtcpFbWildcard) {
-  const bool kUseWildcard = true;
-  JsepSessionDescription jdesc_output(kDummyString);
-  TestDeserializeRtcpFb(&jdesc_output, kUseWildcard);
-  TestSerialize(jdesc_output, false);
-}
-
-TEST_F(WebRtcSdpTest, DeserializeVideoFmtp) {
-  JsepSessionDescription jdesc_output(kDummyString);
-
-  const char kSdpWithFmtpString[] =
-      "v=0\r\n"
-      "o=- 18446744069414584320 18446462598732840960 IN IP4 127.0.0.1\r\n"
-      "s=-\r\n"
-      "t=0 0\r\n"
-      "m=video 3457 RTP/SAVPF 120\r\n"
-      "a=rtpmap:120 VP8/90000\r\n"
-      "a=fmtp:120 x-google-min-bitrate=10;x-google-max-quantization=40\r\n";
-
-  // Deserialize
-  SdpParseError error;
-  EXPECT_TRUE(
-      webrtc::SdpDeserialize(kSdpWithFmtpString, &jdesc_output, &error));
-
-  const ContentInfo* vc = GetFirstVideoContent(jdesc_output.description());
-  ASSERT_TRUE(vc != NULL);
-  const VideoContentDescription* vcd =
-      static_cast<const VideoContentDescription*>(vc->description);
-  ASSERT_FALSE(vcd->codecs().empty());
-  cricket::VideoCodec vp8 = vcd->codecs()[0];
-  EXPECT_EQ("VP8", vp8.name);
-  EXPECT_EQ(120, vp8.id);
-  cricket::CodecParameterMap::iterator found =
-      vp8.params.find("x-google-min-bitrate");
-  ASSERT_TRUE(found != vp8.params.end());
-  EXPECT_EQ(found->second, "10");
-  found = vp8.params.find("x-google-max-quantization");
-  ASSERT_TRUE(found != vp8.params.end());
-  EXPECT_EQ(found->second, "40");
-}
-
-TEST_F(WebRtcSdpTest, DeserializeVideoFmtpWithSprops) {
-  JsepSessionDescription jdesc_output(kDummyString);
-
-  const char kSdpWithFmtpString[] =
-      "v=0\r\n"
-      "o=- 18446744069414584320 18446462598732840960 IN IP4 127.0.0.1\r\n"
-      "s=-\r\n"
-      "t=0 0\r\n"
-      "m=video 49170 RTP/AVP 98\r\n"
-      "a=rtpmap:98 H264/90000\r\n"
-      "a=fmtp:98 profile-level-id=42A01E; "
-      "sprop-parameter-sets=Z0IACpZTBYmI,aMljiA==\r\n";
-
-  // Deserialize.
-  SdpParseError error;
-  EXPECT_TRUE(
-      webrtc::SdpDeserialize(kSdpWithFmtpString, &jdesc_output, &error));
-
-  const ContentInfo* vc = GetFirstVideoContent(jdesc_output.description());
-  ASSERT_TRUE(vc != NULL);
-  const VideoContentDescription* vcd =
-      static_cast<const VideoContentDescription*>(vc->description);
-  ASSERT_TRUE(vcd != NULL);
-  ASSERT_FALSE(vcd->codecs().empty());
-  cricket::VideoCodec h264 = vcd->codecs()[0];
-  EXPECT_EQ("H264", h264.name);
-  EXPECT_EQ(98, h264.id);
-  cricket::CodecParameterMap::const_iterator found =
-      h264.params.find("profile-level-id");
-  ASSERT_TRUE(found != h264.params.end());
-  EXPECT_EQ(found->second, "42A01E");
-  found = h264.params.find("sprop-parameter-sets");
-  ASSERT_TRUE(found != h264.params.end());
-  EXPECT_EQ(found->second, "Z0IACpZTBYmI,aMljiA==");
-}
-
-TEST_F(WebRtcSdpTest, DeserializeVideoFmtpWithSpace) {
-  JsepSessionDescription jdesc_output(kDummyString);
-
-  const char kSdpWithFmtpString[] =
-      "v=0\r\n"
-      "o=- 18446744069414584320 18446462598732840960 IN IP4 127.0.0.1\r\n"
-      "s=-\r\n"
-      "t=0 0\r\n"
-      "m=video 3457 RTP/SAVPF 120\r\n"
-      "a=rtpmap:120 VP8/90000\r\n"
-      "a=fmtp:120   x-google-min-bitrate=10;  x-google-max-quantization=40\r\n";
-
-  // Deserialize
-  SdpParseError error;
-  EXPECT_TRUE(webrtc::SdpDeserialize(kSdpWithFmtpString, &jdesc_output,
-                                     &error));
-
-  const ContentInfo* vc = GetFirstVideoContent(jdesc_output.description());
-  ASSERT_TRUE(vc != NULL);
-  const VideoContentDescription* vcd =
-      static_cast<const VideoContentDescription*>(vc->description);
-  ASSERT_FALSE(vcd->codecs().empty());
-  cricket::VideoCodec vp8 = vcd->codecs()[0];
-  EXPECT_EQ("VP8", vp8.name);
-  EXPECT_EQ(120, vp8.id);
-  cricket::CodecParameterMap::iterator found =
-      vp8.params.find("x-google-min-bitrate");
-  ASSERT_TRUE(found != vp8.params.end());
-  EXPECT_EQ(found->second, "10");
-  found = vp8.params.find("x-google-max-quantization");
-  ASSERT_TRUE(found != vp8.params.end());
-  EXPECT_EQ(found->second, "40");
-}
-
-TEST_F(WebRtcSdpTest, SerializeAudioFmtpWithUnknownParameter) {
-  AudioContentDescription* acd = static_cast<AudioContentDescription*>(
-      GetFirstAudioContent(&desc_)->description);
-
-  cricket::AudioCodecs codecs = acd->codecs();
-  codecs[0].params["unknown-future-parameter"] = "SomeFutureValue";
-  acd->set_codecs(codecs);
-
-  ASSERT_TRUE(jdesc_.Initialize(desc_.Copy(),
-                                jdesc_.session_id(),
-                                jdesc_.session_version()));
-  std::string message = webrtc::SdpSerialize(jdesc_, false);
-  std::string sdp_with_fmtp = kSdpFullString;
-  InjectAfter("a=rtpmap:111 opus/48000/2\r\n",
-              "a=fmtp:111 unknown-future-parameter=SomeFutureValue\r\n",
-              &sdp_with_fmtp);
-  EXPECT_EQ(sdp_with_fmtp, message);
-}
-
-TEST_F(WebRtcSdpTest, SerializeAudioFmtpWithKnownFmtpParameter) {
-  AudioContentDescription* acd = static_cast<AudioContentDescription*>(
-      GetFirstAudioContent(&desc_)->description);
-
-  cricket::AudioCodecs codecs = acd->codecs();
-  codecs[0].params["stereo"] = "1";
-  acd->set_codecs(codecs);
-
-  ASSERT_TRUE(jdesc_.Initialize(desc_.Copy(),
-                                jdesc_.session_id(),
-                                jdesc_.session_version()));
-  std::string message = webrtc::SdpSerialize(jdesc_, false);
-  std::string sdp_with_fmtp = kSdpFullString;
-  InjectAfter("a=rtpmap:111 opus/48000/2\r\n",
-              "a=fmtp:111 stereo=1\r\n",
-              &sdp_with_fmtp);
-  EXPECT_EQ(sdp_with_fmtp, message);
-}
-
-TEST_F(WebRtcSdpTest, SerializeAudioFmtpWithPTimeAndMaxPTime) {
-  AudioContentDescription* acd = static_cast<AudioContentDescription*>(
-      GetFirstAudioContent(&desc_)->description);
-
-  cricket::AudioCodecs codecs = acd->codecs();
-  codecs[0].params["ptime"] = "20";
-  codecs[0].params["maxptime"] = "120";
-  acd->set_codecs(codecs);
-
-  ASSERT_TRUE(jdesc_.Initialize(desc_.Copy(),
-                                jdesc_.session_id(),
-                                jdesc_.session_version()));
-  std::string message = webrtc::SdpSerialize(jdesc_, false);
-  std::string sdp_with_fmtp = kSdpFullString;
-  InjectAfter("a=rtpmap:104 ISAC/32000\r\n",
-              "a=maxptime:120\r\n"  // No comma here. String merging!
-              "a=ptime:20\r\n",
-              &sdp_with_fmtp);
-  EXPECT_EQ(sdp_with_fmtp, message);
-}
-
-TEST_F(WebRtcSdpTest, SerializeVideoFmtp) {
-  VideoContentDescription* vcd = static_cast<VideoContentDescription*>(
-      GetFirstVideoContent(&desc_)->description);
-
-  cricket::VideoCodecs codecs = vcd->codecs();
-  codecs[0].params["x-google-min-bitrate"] = "10";
-  vcd->set_codecs(codecs);
-
-  ASSERT_TRUE(jdesc_.Initialize(desc_.Copy(),
-                                jdesc_.session_id(),
-                                jdesc_.session_version()));
-  std::string message = webrtc::SdpSerialize(jdesc_, false);
-  std::string sdp_with_fmtp = kSdpFullString;
-  InjectAfter("a=rtpmap:120 VP8/90000\r\n",
-              "a=fmtp:120 x-google-min-bitrate=10\r\n",
-              &sdp_with_fmtp);
-  EXPECT_EQ(sdp_with_fmtp, message);
-}
-
-TEST_F(WebRtcSdpTest, DeserializeSdpWithIceLite) {
-  JsepSessionDescription jdesc_with_icelite(kDummyString);
-  std::string sdp_with_icelite = kSdpFullString;
-  EXPECT_TRUE(SdpDeserialize(sdp_with_icelite, &jdesc_with_icelite));
-  cricket::SessionDescription* desc = jdesc_with_icelite.description();
-  const cricket::TransportInfo* tinfo1 =
-      desc->GetTransportInfoByName("audio_content_name");
-  EXPECT_EQ(cricket::ICEMODE_FULL, tinfo1->description.ice_mode);
-  const cricket::TransportInfo* tinfo2 =
-      desc->GetTransportInfoByName("video_content_name");
-  EXPECT_EQ(cricket::ICEMODE_FULL, tinfo2->description.ice_mode);
-  InjectAfter(kSessionTime,
-              "a=ice-lite\r\n",
-              &sdp_with_icelite);
-  EXPECT_TRUE(SdpDeserialize(sdp_with_icelite, &jdesc_with_icelite));
-  desc = jdesc_with_icelite.description();
-  const cricket::TransportInfo* atinfo =
-      desc->GetTransportInfoByName("audio_content_name");
-  EXPECT_EQ(cricket::ICEMODE_LITE, atinfo->description.ice_mode);
-  const cricket::TransportInfo* vtinfo =
-        desc->GetTransportInfoByName("video_content_name");
-  EXPECT_EQ(cricket::ICEMODE_LITE, vtinfo->description.ice_mode);
-}
-
-// Verifies that the candidates in the input SDP are parsed and serialized
-// correctly in the output SDP.
-TEST_F(WebRtcSdpTest, RoundTripSdpWithSctpDataChannelsWithCandidates) {
-  std::string sdp_with_data = kSdpString;
-  sdp_with_data.append(kSdpSctpDataChannelWithCandidatesString);
-  JsepSessionDescription jdesc_output(kDummyString);
-
-  EXPECT_TRUE(SdpDeserialize(sdp_with_data, &jdesc_output));
-  EXPECT_EQ(sdp_with_data, webrtc::SdpSerialize(jdesc_output, false));
-}
-
-TEST_F(WebRtcSdpTest, SerializeDtlsSetupAttribute) {
-  AddFingerprint();
-  TransportInfo audio_transport_info =
-      *(desc_.GetTransportInfoByName(kAudioContentName));
-  EXPECT_EQ(cricket::CONNECTIONROLE_NONE,
-            audio_transport_info.description.connection_role);
-  audio_transport_info.description.connection_role =
-        cricket::CONNECTIONROLE_ACTIVE;
-
-  TransportInfo video_transport_info =
-      *(desc_.GetTransportInfoByName(kVideoContentName));
-  EXPECT_EQ(cricket::CONNECTIONROLE_NONE,
-            video_transport_info.description.connection_role);
-  video_transport_info.description.connection_role =
-        cricket::CONNECTIONROLE_ACTIVE;
-
-  desc_.RemoveTransportInfoByName(kAudioContentName);
-  desc_.RemoveTransportInfoByName(kVideoContentName);
-
-  desc_.AddTransportInfo(audio_transport_info);
-  desc_.AddTransportInfo(video_transport_info);
-
-  ASSERT_TRUE(jdesc_.Initialize(desc_.Copy(),
-                                jdesc_.session_id(),
-                                jdesc_.session_version()));
-  std::string message = webrtc::SdpSerialize(jdesc_, false);
-  std::string sdp_with_dtlssetup = kSdpFullString;
-
-  // Fingerprint attribute is necessary to add DTLS setup attribute.
-  InjectAfter(kAttributeIcePwdVoice,
-              kFingerprint, &sdp_with_dtlssetup);
-  InjectAfter(kAttributeIcePwdVideo,
-              kFingerprint, &sdp_with_dtlssetup);
-  // Now adding |setup| attribute.
-  InjectAfter(kFingerprint,
-              "a=setup:active\r\n", &sdp_with_dtlssetup);
-  EXPECT_EQ(sdp_with_dtlssetup, message);
-}
-
-TEST_F(WebRtcSdpTest, DeserializeDtlsSetupAttribute) {
-  JsepSessionDescription jdesc_with_dtlssetup(kDummyString);
-  std::string sdp_with_dtlssetup = kSdpFullString;
-  InjectAfter(kSessionTime,
-              "a=setup:actpass\r\n",
-              &sdp_with_dtlssetup);
-  EXPECT_TRUE(SdpDeserialize(sdp_with_dtlssetup, &jdesc_with_dtlssetup));
-  cricket::SessionDescription* desc = jdesc_with_dtlssetup.description();
-  const cricket::TransportInfo* atinfo =
-      desc->GetTransportInfoByName("audio_content_name");
-  EXPECT_EQ(cricket::CONNECTIONROLE_ACTPASS,
-            atinfo->description.connection_role);
-  const cricket::TransportInfo* vtinfo =
-        desc->GetTransportInfoByName("video_content_name");
-  EXPECT_EQ(cricket::CONNECTIONROLE_ACTPASS,
-            vtinfo->description.connection_role);
-}
-
-// Verifies that the order of the serialized m-lines follows the order of the
-// ContentInfo in SessionDescription, and vise versa for deserialization.
-TEST_F(WebRtcSdpTest, MediaContentOrderMaintainedRoundTrip) {
-  JsepSessionDescription jdesc(kDummyString);
-  const std::string media_content_sdps[3] = {
-    kSdpAudioString,
-    kSdpVideoString,
-    kSdpSctpDataChannelString
-  };
-  const cricket::MediaType media_types[3] = {
-    cricket::MEDIA_TYPE_AUDIO,
-    cricket::MEDIA_TYPE_VIDEO,
-    cricket::MEDIA_TYPE_DATA
-  };
-
-  // Verifies all 6 permutations.
-  for (size_t i = 0; i < 6; ++i) {
-    size_t media_content_in_sdp[3];
-    // The index of the first media content.
-    media_content_in_sdp[0] = i / 2;
-    // The index of the second media content.
-    media_content_in_sdp[1] = (media_content_in_sdp[0] + i % 2 + 1) % 3;
-    // The index of the third media content.
-    media_content_in_sdp[2] = (media_content_in_sdp[0] + (i + 1) % 2 + 1) % 3;
-
-    std::string sdp_string = kSdpSessionString;
-    for (size_t i = 0; i < 3; ++i)
-      sdp_string += media_content_sdps[media_content_in_sdp[i]];
-
-    EXPECT_TRUE(SdpDeserialize(sdp_string, &jdesc));
-    cricket::SessionDescription* desc = jdesc.description();
-    EXPECT_EQ(3u, desc->contents().size());
-
-    for (size_t i = 0; i < 3; ++i) {
-      const cricket::MediaContentDescription* mdesc =
-          static_cast<const cricket::MediaContentDescription*>(
-              desc->contents()[i].description);
-      EXPECT_EQ(media_types[media_content_in_sdp[i]], mdesc->type());
-    }
-
-    std::string serialized_sdp = webrtc::SdpSerialize(jdesc, false);
-    EXPECT_EQ(sdp_string, serialized_sdp);
-  }
-}
-
-TEST_F(WebRtcSdpTest, DeserializeBundleOnlyAttribute) {
-  MakeBundleOnlyDescription();
-  JsepSessionDescription deserialized_description(kDummyString);
-  ASSERT_TRUE(
-      SdpDeserialize(kBundleOnlySdpFullString, &deserialized_description));
-  EXPECT_TRUE(CompareSessionDescription(jdesc_, deserialized_description));
-}
-
-// The semantics of "a=bundle-only" are only defined when it's used in
-// combination with a 0 port on the m= line. We should ignore it if used with a
-// nonzero port.
-TEST_F(WebRtcSdpTest, IgnoreBundleOnlyWithNonzeroPort) {
-  // Make the base bundle-only description but unset the bundle-only flag.
-  MakeBundleOnlyDescription();
-  jdesc_.description()->contents()[1].bundle_only = false;
-
-  std::string modified_sdp = kBundleOnlySdpFullString;
-  Replace("m=video 0", "m=video 9", &modified_sdp);
-  JsepSessionDescription deserialized_description(kDummyString);
-  ASSERT_TRUE(SdpDeserialize(modified_sdp, &deserialized_description));
-  EXPECT_TRUE(CompareSessionDescription(jdesc_, deserialized_description));
-}
-
-TEST_F(WebRtcSdpTest, SerializeBundleOnlyAttribute) {
-  MakeBundleOnlyDescription();
-  TestSerialize(jdesc_, false);
-}
-
-TEST_F(WebRtcSdpTest, DeserializePlanBSessionDescription) {
-  MakePlanBDescription();
-
-  JsepSessionDescription deserialized_description(kDummyString);
-  EXPECT_TRUE(SdpDeserialize(kPlanBSdpFullString, &deserialized_description));
-
-  EXPECT_TRUE(CompareSessionDescription(jdesc_, deserialized_description));
-}
-
-TEST_F(WebRtcSdpTest, SerializePlanBSessionDescription) {
-  MakePlanBDescription();
-  TestSerialize(jdesc_, false);
-}
-
-// Some WebRTC endpoints include the msid in both the Plan B and Unified Plan
-// ways, to make SDP that's compatible with both Plan B and Unified Plan (to
-// some extent). If we parse this, the Plan B msid attribute (which is more
-// specific, since it's at the SSRC level) should take priority.
-TEST_F(WebRtcSdpTest, DeserializePlanBSessionDescriptionWithMsid) {
-  MakePlanBDescription();
-
-  JsepSessionDescription deserialized_description(kDummyString);
-  EXPECT_TRUE(
-      SdpDeserialize(kPlanBSdpFullStringWithMsid, &deserialized_description));
-
-  EXPECT_TRUE(CompareSessionDescription(jdesc_, deserialized_description));
-}
-
-TEST_F(WebRtcSdpTest, DeserializeUnifiedPlanSessionDescription) {
-  MakeUnifiedPlanDescription();
-
-  JsepSessionDescription deserialized_description(kDummyString);
-  EXPECT_TRUE(
-      SdpDeserialize(kUnifiedPlanSdpFullString, &deserialized_description));
-
-  EXPECT_TRUE(CompareSessionDescription(jdesc_, deserialized_description));
-}
-
-TEST_F(WebRtcSdpTest, SerializeUnifiedPlanSessionDescription) {
-  MakeUnifiedPlanDescription();
-  TestSerialize(jdesc_, true);
-}
-
-// Regression test for heap overflow bug:
-// https://bugs.chromium.org/p/chromium/issues/detail?id=647916
-TEST_F(WebRtcSdpTest, DeserializeSctpPortInVideoDescription) {
-  // The issue occurs when the sctp-port attribute is found in a video
-  // description. The actual heap overflow occurs when parsing the fmtp line.
-  static const char kSdpWithSctpPortInVideoDescription[] =
-      "v=0\r\n"
-      "o=- 18446744069414584320 18446462598732840960 IN IP4 127.0.0.1\r\n"
-      "s=-\r\n"
-      "t=0 0\r\n"
-      "m=video 9 UDP/DTLS/SCTP 120\r\n"
-      "a=sctp-port 5000\r\n"
-      "a=fmtp:108 foo=10\r\n";
-
-  ExpectParseFailure(std::string(kSdpWithSctpPortInVideoDescription),
-                     "sctp-port");
-}
-
-// Regression test for integer overflow bug:
-// https://bugs.chromium.org/p/chromium/issues/detail?id=648071
-TEST_F(WebRtcSdpTest, DeserializeLargeBandwidthLimit) {
-  // Bandwidth attribute is the max signed 32-bit int, which will get
-  // multiplied by 1000 and cause int overflow if not careful.
-  static const char kSdpWithLargeBandwidth[] =
-      "v=0\r\n"
-      "o=- 18446744069414584320 18446462598732840960 IN IP4 127.0.0.1\r\n"
-      "s=-\r\n"
-      "t=0 0\r\n"
-      "m=video 3457 RTP/SAVPF 120\r\n"
-      "b=AS:2147483647\r\n"
-      "foo=fail\r\n";
-
-  ExpectParseFailure(std::string(kSdpWithLargeBandwidth), "foo=fail");
-}
-
-// Similar to the above, except that negative values are illegal, not just
-// error-prone as large values are.
-// https://bugs.chromium.org/p/chromium/issues/detail?id=675361
-TEST_F(WebRtcSdpTest, DeserializingNegativeBandwidthLimitFails) {
-  static const char kSdpWithNegativeBandwidth[] =
-      "v=0\r\n"
-      "o=- 18446744069414584320 18446462598732840960 IN IP4 127.0.0.1\r\n"
-      "s=-\r\n"
-      "t=0 0\r\n"
-      "m=video 3457 RTP/SAVPF 120\r\n"
-      "b=AS:-1000\r\n";
-
-  ExpectParseFailure(std::string(kSdpWithNegativeBandwidth), "b=AS:-1000");
-}
-
-// An exception to the above rule: a value of -1 for b=AS should just be
-// ignored, resulting in "kAutoBandwidth" in the deserialized object.
-// Applications historically may be using "b=AS:-1" to mean "no bandwidth
-// limit", but this is now what ommitting the attribute entirely will do, so
-// ignoring it will have the intended effect.
-TEST_F(WebRtcSdpTest, BandwidthLimitOfNegativeOneIgnored) {
-  static const char kSdpWithBandwidthOfNegativeOne[] =
-      "v=0\r\n"
-      "o=- 18446744069414584320 18446462598732840960 IN IP4 127.0.0.1\r\n"
-      "s=-\r\n"
-      "t=0 0\r\n"
-      "m=video 3457 RTP/SAVPF 120\r\n"
-      "b=AS:-1\r\n";
-
-  JsepSessionDescription jdesc_output(kDummyString);
-  EXPECT_TRUE(SdpDeserialize(kSdpWithBandwidthOfNegativeOne, &jdesc_output));
-  const ContentInfo* vc = GetFirstVideoContent(jdesc_output.description());
-  ASSERT_NE(nullptr, vc);
-  const VideoContentDescription* vcd =
-      static_cast<const VideoContentDescription*>(vc->description);
-  EXPECT_EQ(cricket::kAutoBandwidth, vcd->bandwidth());
-}
-
-// Test that "ufrag"/"pwd" in the candidate line itself are ignored, and only
-// the "a=ice-ufrag"/"a=ice-pwd" attributes are used.
-// Regression test for:
-// https://bugs.chromium.org/p/chromium/issues/detail?id=681286
-TEST_F(WebRtcSdpTest, IceCredentialsInCandidateStringIgnored) {
-  // Important piece is "ufrag foo pwd bar".
-  static const char kSdpWithIceCredentialsInCandidateString[] =
-      "v=0\r\n"
-      "o=- 18446744069414584320 18446462598732840960 IN IP4 127.0.0.1\r\n"
-      "s=-\r\n"
-      "t=0 0\r\n"
-      "m=audio 9 RTP/SAVPF 111\r\n"
-      "c=IN IP4 0.0.0.0\r\n"
-      "a=rtcp:9 IN IP4 0.0.0.0\r\n"
-      "a=ice-ufrag:ufrag_voice\r\na=ice-pwd:pwd_voice\r\n"
-      "a=rtpmap:111 opus/48000/2\r\n"
-      "a=candidate:a0+B/1 1 udp 2130706432 192.168.1.5 1234 typ host "
-      "generation 2 ufrag foo pwd bar\r\n";
-
-  JsepSessionDescription jdesc_output(kDummyString);
-  EXPECT_TRUE(
-      SdpDeserialize(kSdpWithIceCredentialsInCandidateString, &jdesc_output));
-  const IceCandidateCollection* candidates = jdesc_output.candidates(0);
-  ASSERT_NE(nullptr, candidates);
-  ASSERT_EQ(1, candidates->count());
-  cricket::Candidate c = candidates->at(0)->candidate();
-  EXPECT_EQ("ufrag_voice", c.username());
-  EXPECT_EQ("pwd_voice", c.password());
-}
-
-// Test that SDP with an invalid port number in "a=candidate" lines is
-// rejected, without crashing.
-// Regression test for:
-// https://bugs.chromium.org/p/chromium/issues/detail?id=677029
-TEST_F(WebRtcSdpTest, DeserializeInvalidPortInCandidateAttribute) {
-  static const char kSdpWithInvalidCandidatePort[] =
-      "v=0\r\n"
-      "o=- 18446744069414584320 18446462598732840960 IN IP4 127.0.0.1\r\n"
-      "s=-\r\n"
-      "t=0 0\r\n"
-      "m=audio 9 RTP/SAVPF 111\r\n"
-      "c=IN IP4 0.0.0.0\r\n"
-      "a=rtcp:9 IN IP4 0.0.0.0\r\n"
-      "a=ice-ufrag:ufrag_voice\r\na=ice-pwd:pwd_voice\r\n"
-      "a=rtpmap:111 opus/48000/2\r\n"
-      "a=candidate:a0+B/1 1 udp 2130706432 192.168.1.5 12345678 typ host "
-      "generation 2 raddr 192.168.1.1 rport 87654321\r\n";
-
-  JsepSessionDescription jdesc_output(kDummyString);
-  EXPECT_FALSE(SdpDeserialize(kSdpWithInvalidCandidatePort, &jdesc_output));
-}
-
-// Test that "a=msid" with a missing track ID is rejected and doesn't crash.
-// Regression test for:
-// https://bugs.chromium.org/p/chromium/issues/detail?id=686405
-TEST_F(WebRtcSdpTest, DeserializeMsidAttributeWithMissingTrackId) {
-  static const char kSdpWithMissingTrackId[] =
-      "v=0\r\n"
-      "o=- 18446744069414584320 18446462598732840960 IN IP4 127.0.0.1\r\n"
-      "s=-\r\n"
-      "t=0 0\r\n"
-      "m=audio 9 RTP/SAVPF 111\r\n"
-      "c=IN IP4 0.0.0.0\r\n"
-      "a=rtpmap:111 opus/48000/2\r\n"
-      "a=msid:stream_id \r\n";
-
-  JsepSessionDescription jdesc_output(kDummyString);
-  EXPECT_FALSE(SdpDeserialize(kSdpWithMissingTrackId, &jdesc_output));
-}
-
-TEST_F(WebRtcSdpTest, DeserializeMsidAttributeWithMissingStreamId) {
-  static const char kSdpWithMissingStreamId[] =
-      "v=0\r\n"
-      "o=- 18446744069414584320 18446462598732840960 IN IP4 127.0.0.1\r\n"
-      "s=-\r\n"
-      "t=0 0\r\n"
-      "m=audio 9 RTP/SAVPF 111\r\n"
-      "c=IN IP4 0.0.0.0\r\n"
-      "a=rtpmap:111 opus/48000/2\r\n"
-      "a=msid: track_id\r\n";
-
-  JsepSessionDescription jdesc_output(kDummyString);
-  EXPECT_FALSE(SdpDeserialize(kSdpWithMissingStreamId, &jdesc_output));
-}
-
-// Tests that if both session-level address and media-level address exist, use
-// the media-level address.
-TEST_F(WebRtcSdpTest, ParseConnectionData) {
-  JsepSessionDescription jsep_desc(kDummyString);
-
-  // Sesssion-level address.
-  std::string sdp = kSdpFullString;
-  InjectAfter("s=-\r\n", "c=IN IP4 192.168.0.3\r\n", &sdp);
-  EXPECT_TRUE(SdpDeserialize(sdp, &jsep_desc));
-
-  const auto& content1 = jsep_desc.description()->contents()[0];
-  EXPECT_EQ("74.125.127.126:2345",
-            static_cast<cricket::MediaContentDescription*>(content1.description)
-                ->connection_address()
-                .ToString());
-  const auto& content2 = jsep_desc.description()->contents()[1];
-  EXPECT_EQ("74.125.224.39:3457",
-            static_cast<cricket::MediaContentDescription*>(content2.description)
-                ->connection_address()
-                .ToString());
-}
-
-// Tests that the session-level connection address will be used if the media
-// level-addresses are not specified.
-TEST_F(WebRtcSdpTest, ParseConnectionDataSessionLevelOnly) {
-  JsepSessionDescription jsep_desc(kDummyString);
-
-  // Sesssion-level address.
-  std::string sdp = kSdpString;
-  InjectAfter("s=-\r\n", "c=IN IP4 192.168.0.3\r\n", &sdp);
-  // Remove the media level addresses.
-  Replace("c=IN IP4 0.0.0.0\r\n", "", &sdp);
-  Replace("c=IN IP4 0.0.0.0\r\n", "", &sdp);
-  EXPECT_TRUE(SdpDeserialize(sdp, &jsep_desc));
-
-  const auto& content1 = jsep_desc.description()->contents()[0];
-  EXPECT_EQ("192.168.0.3:9",
-            static_cast<cricket::MediaContentDescription*>(content1.description)
-                ->connection_address()
-                .ToString());
-  const auto& content2 = jsep_desc.description()->contents()[1];
-  EXPECT_EQ("192.168.0.3:9",
-            static_cast<cricket::MediaContentDescription*>(content2.description)
-                ->connection_address()
-                .ToString());
-}
-
-TEST_F(WebRtcSdpTest, ParseConnectionDataIPv6) {
-  JsepSessionDescription jsep_desc(kDummyString);
-
-  std::string sdp = kSdpString;
-  EXPECT_TRUE(SdpDeserialize(sdp, &jsep_desc));
-  Replace("m=audio 9 RTP/SAVPF 111 103 104\r\nc=IN IP4 0.0.0.0\r\n",
-          "m=audio 9 RTP/SAVPF 111 103 104\r\nc=IN IP6 "
-          "2001:0db8:85a3:0000:0000:8a2e:0370:7335\r\n",
-          &sdp);
-  Replace("m=video 9 RTP/SAVPF 120\r\nc=IN IP4 0.0.0.0\r\n",
-          "m=video 9 RTP/SAVPF 120\r\nc=IN IP6 "
-          "2001:0db8:85a3:0000:0000:8a2e:0370:7336\r\n",
-          &sdp);
-  EXPECT_TRUE(SdpDeserialize(sdp, &jsep_desc));
-  const auto& content1 = jsep_desc.description()->contents()[0];
-  EXPECT_EQ("[2001:db8:85a3::8a2e:370:7335]:9",
-            static_cast<cricket::MediaContentDescription*>(content1.description)
-                ->connection_address()
-                .ToString());
-  const auto& content2 = jsep_desc.description()->contents()[1];
-  EXPECT_EQ("[2001:db8:85a3::8a2e:370:7336]:9",
-            static_cast<cricket::MediaContentDescription*>(content2.description)
-                ->connection_address()
-                .ToString());
-}
-
-// Test that the invalid or unsupprted connection data cannot be parsed.
-TEST_F(WebRtcSdpTest, ParseConnectionDataFailure) {
-  JsepSessionDescription jsep_desc(kDummyString);
-  std::string sdp = kSdpString;
-  EXPECT_TRUE(SdpDeserialize(sdp, &jsep_desc));
-
-  // Unsupported multicast IPv4 address.
-  sdp = kSdpFullString;
-  Replace("c=IN IP4 74.125.224.39\r\n", "c=IN IP4 74.125.224.39/127\r\n", &sdp);
-  EXPECT_FALSE(SdpDeserialize(sdp, &jsep_desc));
-
-  // Unsupported multicast IPv6 address.
-  sdp = kSdpFullString;
-  Replace("c=IN IP4 74.125.224.39\r\n", "c=IN IP6 ::1/3\r\n", &sdp);
-  EXPECT_FALSE(SdpDeserialize(sdp, &jsep_desc));
-
-  // Mismatched address type.
-  sdp = kSdpFullString;
-  Replace("c=IN IP4 74.125.224.39\r\n", "c=IN IP6 74.125.224.39\r\n", &sdp);
-  EXPECT_FALSE(SdpDeserialize(sdp, &jsep_desc));
-
-  sdp = kSdpFullString;
-  Replace("c=IN IP4 74.125.224.39\r\n",
-          "c=IN IP4 2001:0db8:85a3:0000:0000:8a2e:0370:7334\r\n", &sdp);
-  EXPECT_FALSE(SdpDeserialize(sdp, &jsep_desc));
-}
-
-TEST_F(WebRtcSdpTest, SerializeAndDeserializeWithConnectionAddress) {
-  JsepSessionDescription expected_jsep(kDummyString);
-  MakeDescriptionWithoutCandidates(&expected_jsep);
-  // Serialization.
-  std::string message = webrtc::SdpSerialize(expected_jsep, false);
-  // Deserialization.
-  JsepSessionDescription jdesc(kDummyString);
-  EXPECT_TRUE(SdpDeserialize(message, &jdesc));
-  auto audio_desc = static_cast<cricket::MediaContentDescription*>(
-      jdesc.description()->GetContentByName(kAudioContentName)->description);
-  auto video_desc = static_cast<cricket::MediaContentDescription*>(
-      jdesc.description()->GetContentByName(kVideoContentName)->description);
-  EXPECT_EQ(audio_desc_->connection_address().ToString(),
-            audio_desc->connection_address().ToString());
-  EXPECT_EQ(video_desc_->connection_address().ToString(),
-            video_desc->connection_address().ToString());
-}
diff --git a/pc/webrtcsession.cc b/pc/webrtcsession.cc
deleted file mode 100644
index 0753081..0000000
--- a/pc/webrtcsession.cc
+++ /dev/null
@@ -1,2513 +0,0 @@
-/*
- *  Copyright 2012 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/pc/webrtcsession.h"
-
-#include <limits.h>
-
-#include <algorithm>
-#include <set>
-#include <utility>
-#include <vector>
-
-#include "webrtc/api/call/audio_sink.h"
-#include "webrtc/api/jsepicecandidate.h"
-#include "webrtc/api/jsepsessiondescription.h"
-#include "webrtc/api/peerconnectioninterface.h"
-#include "webrtc/call/call.h"
-#include "webrtc/media/base/mediaconstants.h"
-#include "webrtc/media/sctp/sctptransportinternal.h"
-#include "webrtc/p2p/base/portallocator.h"
-#include "webrtc/pc/channel.h"
-#include "webrtc/pc/channelmanager.h"
-#include "webrtc/pc/mediasession.h"
-#include "webrtc/pc/sctputils.h"
-#include "webrtc/pc/webrtcsessiondescriptionfactory.h"
-#include "webrtc/rtc_base/basictypes.h"
-#include "webrtc/rtc_base/bind.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/helpers.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/stringencode.h"
-#include "webrtc/rtc_base/stringutils.h"
-
-#ifdef HAVE_QUIC
-#include "webrtc/p2p/quic/quictransportchannel.h"
-#endif  // HAVE_QUIC
-
-using cricket::ContentInfo;
-using cricket::ContentInfos;
-using cricket::MediaContentDescription;
-using cricket::SessionDescription;
-using cricket::TransportInfo;
-
-using cricket::LOCAL_PORT_TYPE;
-using cricket::STUN_PORT_TYPE;
-using cricket::RELAY_PORT_TYPE;
-using cricket::PRFLX_PORT_TYPE;
-
-namespace webrtc {
-
-// Error messages
-const char kBundleWithoutRtcpMux[] = "RTCP-MUX must be enabled when BUNDLE "
-                                     "is enabled.";
-const char kCreateChannelFailed[] = "Failed to create channels.";
-const char kInvalidCandidates[] = "Description contains invalid candidates.";
-const char kInvalidSdp[] = "Invalid session description.";
-const char kMlineMismatchInAnswer[] =
-    "The order of m-lines in answer doesn't match order in offer. Rejecting "
-    "answer.";
-const char kMlineMismatchInSubsequentOffer[] =
-    "The order of m-lines in subsequent offer doesn't match order from "
-    "previous offer/answer.";
-const char kPushDownTDFailed[] =
-    "Failed to push down transport description:";
-const char kSdpWithoutDtlsFingerprint[] =
-    "Called with SDP without DTLS fingerprint.";
-const char kSdpWithoutSdesCrypto[] =
-    "Called with SDP without SDES crypto.";
-const char kSdpWithoutIceUfragPwd[] =
-    "Called with SDP without ice-ufrag and ice-pwd.";
-const char kSessionError[] = "Session error code: ";
-const char kSessionErrorDesc[] = "Session error description: ";
-const char kDtlsSrtpSetupFailureRtp[] =
-    "Couldn't set up DTLS-SRTP on RTP channel.";
-const char kDtlsSrtpSetupFailureRtcp[] =
-    "Couldn't set up DTLS-SRTP on RTCP channel.";
-const char kEnableBundleFailed[] = "Failed to enable BUNDLE.";
-
-IceCandidatePairType GetIceCandidatePairCounter(
-    const cricket::Candidate& local,
-    const cricket::Candidate& remote) {
-  const auto& l = local.type();
-  const auto& r = remote.type();
-  const auto& host = LOCAL_PORT_TYPE;
-  const auto& srflx = STUN_PORT_TYPE;
-  const auto& relay = RELAY_PORT_TYPE;
-  const auto& prflx = PRFLX_PORT_TYPE;
-  if (l == host && r == host) {
-    bool local_private = IPIsPrivate(local.address().ipaddr());
-    bool remote_private = IPIsPrivate(remote.address().ipaddr());
-    if (local_private) {
-      if (remote_private) {
-        return kIceCandidatePairHostPrivateHostPrivate;
-      } else {
-        return kIceCandidatePairHostPrivateHostPublic;
-      }
-    } else {
-      if (remote_private) {
-        return kIceCandidatePairHostPublicHostPrivate;
-      } else {
-        return kIceCandidatePairHostPublicHostPublic;
-      }
-    }
-  }
-  if (l == host && r == srflx)
-    return kIceCandidatePairHostSrflx;
-  if (l == host && r == relay)
-    return kIceCandidatePairHostRelay;
-  if (l == host && r == prflx)
-    return kIceCandidatePairHostPrflx;
-  if (l == srflx && r == host)
-    return kIceCandidatePairSrflxHost;
-  if (l == srflx && r == srflx)
-    return kIceCandidatePairSrflxSrflx;
-  if (l == srflx && r == relay)
-    return kIceCandidatePairSrflxRelay;
-  if (l == srflx && r == prflx)
-    return kIceCandidatePairSrflxPrflx;
-  if (l == relay && r == host)
-    return kIceCandidatePairRelayHost;
-  if (l == relay && r == srflx)
-    return kIceCandidatePairRelaySrflx;
-  if (l == relay && r == relay)
-    return kIceCandidatePairRelayRelay;
-  if (l == relay && r == prflx)
-    return kIceCandidatePairRelayPrflx;
-  if (l == prflx && r == host)
-    return kIceCandidatePairPrflxHost;
-  if (l == prflx && r == srflx)
-    return kIceCandidatePairPrflxSrflx;
-  if (l == prflx && r == relay)
-    return kIceCandidatePairPrflxRelay;
-  return kIceCandidatePairMax;
-}
-
-// Verify that the order of media sections in |desc1| matches |desc2|. The
-// number of m= sections could be different.
-static bool MediaSectionsInSameOrder(const SessionDescription* desc1,
-                                     const SessionDescription* desc2) {
-  if (!desc1 || !desc2) {
-    return false;
-  }
-  for (size_t i = 0;
-       i < desc1->contents().size() && i < desc2->contents().size(); ++i) {
-    if ((desc2->contents()[i].name) != desc1->contents()[i].name) {
-      return false;
-    }
-    const MediaContentDescription* desc2_mdesc =
-        static_cast<const MediaContentDescription*>(
-            desc2->contents()[i].description);
-    const MediaContentDescription* desc1_mdesc =
-        static_cast<const MediaContentDescription*>(
-            desc1->contents()[i].description);
-    if (desc2_mdesc->type() != desc1_mdesc->type()) {
-      return false;
-    }
-  }
-  return true;
-}
-
-static bool MediaSectionsHaveSameCount(const SessionDescription* desc1,
-                                       const SessionDescription* desc2) {
-  if (!desc1 || !desc2) {
-    return false;
-  }
-  return desc1->contents().size() == desc2->contents().size();
-}
-
-// Checks that each non-rejected content has SDES crypto keys or a DTLS
-// fingerprint, unless it's in a BUNDLE group, in which case only the
-// BUNDLE-tag section (first media section/description in the BUNDLE group)
-// needs a ufrag and pwd. Mismatches, such as replying with a DTLS fingerprint
-// to SDES keys, will be caught in JsepTransport negotiation, and backstopped
-// by Channel's |srtp_required| check.
-static bool VerifyCrypto(const SessionDescription* desc,
-                         bool dtls_enabled,
-                         std::string* error) {
-  const cricket::ContentGroup* bundle =
-      desc->GetGroupByName(cricket::GROUP_TYPE_BUNDLE);
-  const ContentInfos& contents = desc->contents();
-  for (size_t index = 0; index < contents.size(); ++index) {
-    const ContentInfo* cinfo = &contents[index];
-    if (cinfo->rejected) {
-      continue;
-    }
-    if (bundle && bundle->HasContentName(cinfo->name) &&
-        cinfo->name != *(bundle->FirstContentName())) {
-      // This isn't the first media section in the BUNDLE group, so it's not
-      // required to have crypto attributes, since only the crypto attributes
-      // from the first section actually get used.
-      continue;
-    }
-
-    // If the content isn't rejected or bundled into another m= section, crypto
-    // must be present.
-    const MediaContentDescription* media =
-        static_cast<const MediaContentDescription*>(cinfo->description);
-    const TransportInfo* tinfo = desc->GetTransportInfoByName(cinfo->name);
-    if (!media || !tinfo) {
-      // Something is not right.
-      LOG(LS_ERROR) << kInvalidSdp;
-      *error = kInvalidSdp;
-      return false;
-    }
-    if (dtls_enabled) {
-      if (!tinfo->description.identity_fingerprint) {
-        LOG(LS_WARNING) <<
-            "Session description must have DTLS fingerprint if DTLS enabled.";
-        *error = kSdpWithoutDtlsFingerprint;
-        return false;
-      }
-    } else {
-      if (media->cryptos().empty()) {
-        LOG(LS_WARNING) <<
-            "Session description must have SDES when DTLS disabled.";
-        *error = kSdpWithoutSdesCrypto;
-        return false;
-      }
-    }
-  }
-
-  return true;
-}
-
-// Checks that each non-rejected content has ice-ufrag and ice-pwd set, unless
-// it's in a BUNDLE group, in which case only the BUNDLE-tag section (first
-// media section/description in the BUNDLE group) needs a ufrag and pwd.
-static bool VerifyIceUfragPwdPresent(const SessionDescription* desc) {
-  const cricket::ContentGroup* bundle =
-      desc->GetGroupByName(cricket::GROUP_TYPE_BUNDLE);
-  const ContentInfos& contents = desc->contents();
-  for (size_t index = 0; index < contents.size(); ++index) {
-    const ContentInfo* cinfo = &contents[index];
-    if (cinfo->rejected) {
-      continue;
-    }
-    if (bundle && bundle->HasContentName(cinfo->name) &&
-        cinfo->name != *(bundle->FirstContentName())) {
-      // This isn't the first media section in the BUNDLE group, so it's not
-      // required to have ufrag/password, since only the ufrag/password from
-      // the first section actually get used.
-      continue;
-    }
-
-    // If the content isn't rejected or bundled into another m= section,
-    // ice-ufrag and ice-pwd must be present.
-    const TransportInfo* tinfo = desc->GetTransportInfoByName(cinfo->name);
-    if (!tinfo) {
-      // Something is not right.
-      LOG(LS_ERROR) << kInvalidSdp;
-      return false;
-    }
-    if (tinfo->description.ice_ufrag.empty() ||
-        tinfo->description.ice_pwd.empty()) {
-      LOG(LS_ERROR) << "Session description must have ice ufrag and pwd.";
-      return false;
-    }
-  }
-  return true;
-}
-
-static bool GetTrackIdBySsrc(const SessionDescription* session_description,
-                             uint32_t ssrc,
-                             std::string* track_id) {
-  RTC_DCHECK(track_id != NULL);
-
-  const cricket::ContentInfo* audio_info =
-      cricket::GetFirstAudioContent(session_description);
-  if (audio_info) {
-    const cricket::MediaContentDescription* audio_content =
-        static_cast<const cricket::MediaContentDescription*>(
-            audio_info->description);
-
-    const auto* found =
-        cricket::GetStreamBySsrc(audio_content->streams(), ssrc);
-    if (found) {
-      *track_id = found->id;
-      return true;
-    }
-  }
-
-  const cricket::ContentInfo* video_info =
-      cricket::GetFirstVideoContent(session_description);
-  if (video_info) {
-    const cricket::MediaContentDescription* video_content =
-        static_cast<const cricket::MediaContentDescription*>(
-            video_info->description);
-
-    const auto* found =
-        cricket::GetStreamBySsrc(video_content->streams(), ssrc);
-    if (found) {
-      *track_id = found->id;
-      return true;
-    }
-  }
-  return false;
-}
-
-// Get the SCTP port out of a SessionDescription.
-// Return -1 if not found.
-static int GetSctpPort(const SessionDescription* session_description) {
-  const ContentInfo* content_info = GetFirstDataContent(session_description);
-  RTC_DCHECK(content_info);
-  if (!content_info) {
-    return -1;
-  }
-  const cricket::DataContentDescription* data =
-      static_cast<const cricket::DataContentDescription*>(
-          (content_info->description));
-  std::string value;
-  cricket::DataCodec match_pattern(cricket::kGoogleSctpDataCodecPlType,
-                                   cricket::kGoogleSctpDataCodecName);
-  for (const cricket::DataCodec& codec : data->codecs()) {
-    if (!codec.Matches(match_pattern)) {
-      continue;
-    }
-    if (codec.GetParam(cricket::kCodecParamPort, &value)) {
-      return rtc::FromString<int>(value);
-    }
-  }
-  return -1;
-}
-
-static bool BadSdp(const std::string& source,
-                   const std::string& type,
-                   const std::string& reason,
-                   std::string* err_desc) {
-  std::ostringstream desc;
-  desc << "Failed to set " << source;
-  if (!type.empty()) {
-    desc << " " << type;
-  }
-  desc << " sdp: " << reason;
-
-  if (err_desc) {
-    *err_desc = desc.str();
-  }
-  LOG(LS_ERROR) << desc.str();
-  return false;
-}
-
-static bool BadSdp(cricket::ContentSource source,
-                   const std::string& type,
-                   const std::string& reason,
-                   std::string* err_desc) {
-  if (source == cricket::CS_LOCAL) {
-    return BadSdp("local", type, reason, err_desc);
-  } else {
-    return BadSdp("remote", type, reason, err_desc);
-  }
-}
-
-static bool BadLocalSdp(const std::string& type,
-                        const std::string& reason,
-                        std::string* err_desc) {
-  return BadSdp(cricket::CS_LOCAL, type, reason, err_desc);
-}
-
-static bool BadRemoteSdp(const std::string& type,
-                         const std::string& reason,
-                         std::string* err_desc) {
-  return BadSdp(cricket::CS_REMOTE, type, reason, err_desc);
-}
-
-static bool BadOfferSdp(cricket::ContentSource source,
-                        const std::string& reason,
-                        std::string* err_desc) {
-  return BadSdp(source, SessionDescriptionInterface::kOffer, reason, err_desc);
-}
-
-static bool BadPranswerSdp(cricket::ContentSource source,
-                           const std::string& reason,
-                           std::string* err_desc) {
-  return BadSdp(source, SessionDescriptionInterface::kPrAnswer,
-                reason, err_desc);
-}
-
-static bool BadAnswerSdp(cricket::ContentSource source,
-                         const std::string& reason,
-                         std::string* err_desc) {
-  return BadSdp(source, SessionDescriptionInterface::kAnswer, reason, err_desc);
-}
-
-#define GET_STRING_OF_STATE(state)   \
-  case webrtc::WebRtcSession::state: \
-    result = #state;                 \
-    break;
-
-static std::string GetStateString(webrtc::WebRtcSession::State state) {
-  std::string result;
-  switch (state) {
-    GET_STRING_OF_STATE(STATE_INIT)
-    GET_STRING_OF_STATE(STATE_SENTOFFER)
-    GET_STRING_OF_STATE(STATE_RECEIVEDOFFER)
-    GET_STRING_OF_STATE(STATE_SENTPRANSWER)
-    GET_STRING_OF_STATE(STATE_RECEIVEDPRANSWER)
-    GET_STRING_OF_STATE(STATE_INPROGRESS)
-    GET_STRING_OF_STATE(STATE_CLOSED)
-    default:
-      RTC_NOTREACHED();
-      break;
-  }
-  return result;
-}
-
-#define GET_STRING_OF_ERROR_CODE(err) \
-  case webrtc::WebRtcSession::err:    \
-    result = #err;                    \
-    break;
-
-static std::string GetErrorCodeString(webrtc::WebRtcSession::Error err) {
-  std::string result;
-  switch (err) {
-    GET_STRING_OF_ERROR_CODE(ERROR_NONE)
-    GET_STRING_OF_ERROR_CODE(ERROR_CONTENT)
-    GET_STRING_OF_ERROR_CODE(ERROR_TRANSPORT)
-    default:
-      RTC_NOTREACHED();
-      break;
-  }
-  return result;
-}
-
-static std::string MakeErrorString(const std::string& error,
-                                   const std::string& desc) {
-  std::ostringstream ret;
-  ret << error << " " << desc;
-  return ret.str();
-}
-
-static std::string MakeTdErrorString(const std::string& desc) {
-  return MakeErrorString(kPushDownTDFailed, desc);
-}
-
-// Returns true if |new_desc| requests an ICE restart (i.e., new ufrag/pwd).
-bool CheckForRemoteIceRestart(const SessionDescriptionInterface* old_desc,
-                              const SessionDescriptionInterface* new_desc,
-                              const std::string& content_name) {
-  if (!old_desc) {
-    return false;
-  }
-  const SessionDescription* new_sd = new_desc->description();
-  const SessionDescription* old_sd = old_desc->description();
-  const ContentInfo* cinfo = new_sd->GetContentByName(content_name);
-  if (!cinfo || cinfo->rejected) {
-    return false;
-  }
-  // If the content isn't rejected, check if ufrag and password has changed.
-  const cricket::TransportDescription* new_transport_desc =
-      new_sd->GetTransportDescriptionByName(content_name);
-  const cricket::TransportDescription* old_transport_desc =
-      old_sd->GetTransportDescriptionByName(content_name);
-  if (!new_transport_desc || !old_transport_desc) {
-    // No transport description exists. This is not an ICE restart.
-    return false;
-  }
-  if (cricket::IceCredentialsChanged(
-          old_transport_desc->ice_ufrag, old_transport_desc->ice_pwd,
-          new_transport_desc->ice_ufrag, new_transport_desc->ice_pwd)) {
-    LOG(LS_INFO) << "Remote peer requests ICE restart for " << content_name
-                 << ".";
-    return true;
-  }
-  return false;
-}
-
-WebRtcSession::WebRtcSession(
-    Call* call,
-    cricket::ChannelManager* channel_manager,
-    const cricket::MediaConfig& media_config,
-    RtcEventLog* event_log,
-    rtc::Thread* network_thread,
-    rtc::Thread* worker_thread,
-    rtc::Thread* signaling_thread,
-    cricket::PortAllocator* port_allocator,
-    std::unique_ptr<cricket::TransportController> transport_controller,
-    std::unique_ptr<cricket::SctpTransportInternalFactory> sctp_factory)
-    : network_thread_(network_thread),
-      worker_thread_(worker_thread),
-      signaling_thread_(signaling_thread),
-      // RFC 3264: The numeric value of the session id and version in the
-      // o line MUST be representable with a "64 bit signed integer".
-      // Due to this constraint session id |sid_| is max limited to LLONG_MAX.
-      sid_(rtc::ToString(rtc::CreateRandomId64() & LLONG_MAX)),
-      transport_controller_(std::move(transport_controller)),
-      sctp_factory_(std::move(sctp_factory)),
-      media_config_(media_config),
-      event_log_(event_log),
-      call_(call),
-      channel_manager_(channel_manager),
-      ice_observer_(NULL),
-      ice_connection_state_(PeerConnectionInterface::kIceConnectionNew),
-      ice_connection_receiving_(true),
-      older_version_remote_peer_(false),
-      dtls_enabled_(false),
-      data_channel_type_(cricket::DCT_NONE),
-      metrics_observer_(NULL) {
-  transport_controller_->SetIceRole(cricket::ICEROLE_CONTROLLED);
-  transport_controller_->SignalConnectionState.connect(
-      this, &WebRtcSession::OnTransportControllerConnectionState);
-  transport_controller_->SignalReceiving.connect(
-      this, &WebRtcSession::OnTransportControllerReceiving);
-  transport_controller_->SignalGatheringState.connect(
-      this, &WebRtcSession::OnTransportControllerGatheringState);
-  transport_controller_->SignalCandidatesGathered.connect(
-      this, &WebRtcSession::OnTransportControllerCandidatesGathered);
-  transport_controller_->SignalCandidatesRemoved.connect(
-      this, &WebRtcSession::OnTransportControllerCandidatesRemoved);
-  transport_controller_->SignalDtlsHandshakeError.connect(
-      this, &WebRtcSession::OnTransportControllerDtlsHandshakeError);
-}
-
-WebRtcSession::~WebRtcSession() {
-  RTC_DCHECK(signaling_thread()->IsCurrent());
-  // Destroy video channels first since they may have a pointer to a voice
-  // channel.
-  for (auto* channel : video_channels_) {
-    DestroyVideoChannel(channel);
-  }
-  for (auto* channel : voice_channels_) {
-    DestroyVoiceChannel(channel);
-  }
-  if (rtp_data_channel_) {
-    DestroyDataChannel();
-  }
-  if (sctp_transport_) {
-    SignalDataChannelDestroyed();
-    network_thread_->Invoke<void>(
-        RTC_FROM_HERE, rtc::Bind(&WebRtcSession::DestroySctpTransport_n, this));
-  }
-#ifdef HAVE_QUIC
-  if (quic_data_transport_) {
-    quic_data_transport_.reset();
-  }
-#endif
-
-  LOG(LS_INFO) << "Session: " << id() << " is destroyed.";
-}
-
-bool WebRtcSession::Initialize(
-    const PeerConnectionFactoryInterface::Options& options,
-    std::unique_ptr<rtc::RTCCertificateGeneratorInterface> cert_generator,
-    const PeerConnectionInterface::RTCConfiguration& rtc_configuration) {
-  bundle_policy_ = rtc_configuration.bundle_policy;
-  rtcp_mux_policy_ = rtc_configuration.rtcp_mux_policy;
-  transport_controller_->SetSslMaxProtocolVersion(options.ssl_max_version);
-
-  // Obtain a certificate from RTCConfiguration if any were provided (optional).
-  rtc::scoped_refptr<rtc::RTCCertificate> certificate;
-  if (!rtc_configuration.certificates.empty()) {
-    // TODO(hbos,torbjorng): Decide on certificate-selection strategy instead of
-    // just picking the first one. The decision should be made based on the DTLS
-    // handshake. The DTLS negotiations need to know about all certificates.
-    certificate = rtc_configuration.certificates[0];
-  }
-
-  SetIceConfig(ParseIceConfig(rtc_configuration));
-
-  if (options.disable_encryption) {
-    dtls_enabled_ = false;
-  } else {
-    // Enable DTLS by default if we have an identity store or a certificate.
-    dtls_enabled_ = (cert_generator || certificate);
-    // |rtc_configuration| can override the default |dtls_enabled_| value.
-    if (rtc_configuration.enable_dtls_srtp) {
-      dtls_enabled_ = *(rtc_configuration.enable_dtls_srtp);
-    }
-  }
-
-  // Enable creation of RTP data channels if the kEnableRtpDataChannels is set.
-  // It takes precendence over the disable_sctp_data_channels
-  // PeerConnectionFactoryInterface::Options.
-  if (rtc_configuration.enable_rtp_data_channel) {
-    data_channel_type_ = cricket::DCT_RTP;
-  }
-#ifdef HAVE_QUIC
-  else if (rtc_configuration.enable_quic) {
-    // Use QUIC instead of DTLS when |enable_quic| is true.
-    data_channel_type_ = cricket::DCT_QUIC;
-    transport_controller_->use_quic();
-    if (dtls_enabled_) {
-      LOG(LS_INFO) << "Using QUIC instead of DTLS";
-    }
-    quic_data_transport_.reset(
-        new QuicDataTransport(signaling_thread(), worker_thread(),
-                              network_thread(), transport_controller_.get()));
-  }
-#endif  // HAVE_QUIC
-  else {
-    // DTLS has to be enabled to use SCTP.
-    if (!options.disable_sctp_data_channels && dtls_enabled_) {
-      data_channel_type_ = cricket::DCT_SCTP;
-    }
-  }
-
-  video_options_.screencast_min_bitrate_kbps =
-      rtc_configuration.screencast_min_bitrate;
-  audio_options_.combined_audio_video_bwe =
-      rtc_configuration.combined_audio_video_bwe;
-
-  audio_options_.audio_jitter_buffer_max_packets =
-      rtc::Optional<int>(rtc_configuration.audio_jitter_buffer_max_packets);
-
-  audio_options_.audio_jitter_buffer_fast_accelerate = rtc::Optional<bool>(
-      rtc_configuration.audio_jitter_buffer_fast_accelerate);
-
-  if (!dtls_enabled_) {
-    // Construct with DTLS disabled.
-    webrtc_session_desc_factory_.reset(new WebRtcSessionDescriptionFactory(
-        signaling_thread(), channel_manager_, this, id(),
-        std::unique_ptr<rtc::RTCCertificateGeneratorInterface>()));
-  } else {
-    // Construct with DTLS enabled.
-    if (!certificate) {
-      webrtc_session_desc_factory_.reset(new WebRtcSessionDescriptionFactory(
-          signaling_thread(), channel_manager_, this, id(),
-          std::move(cert_generator)));
-    } else {
-      // Use the already generated certificate.
-      webrtc_session_desc_factory_.reset(new WebRtcSessionDescriptionFactory(
-          signaling_thread(), channel_manager_, this, id(), certificate));
-    }
-  }
-
-  webrtc_session_desc_factory_->SignalCertificateReady.connect(
-      this, &WebRtcSession::OnCertificateReady);
-
-  if (options.disable_encryption) {
-    webrtc_session_desc_factory_->SetSdesPolicy(cricket::SEC_DISABLED);
-  }
-
-  webrtc_session_desc_factory_->set_enable_encrypted_rtp_header_extensions(
-      options.crypto_options.enable_encrypted_rtp_header_extensions);
-
-  return true;
-}
-
-void WebRtcSession::Close() {
-  SetState(STATE_CLOSED);
-  RemoveUnusedChannels(nullptr);
-  call_ = nullptr;
-  RTC_DCHECK(voice_channels_.empty());
-  RTC_DCHECK(video_channels_.empty());
-  RTC_DCHECK(!rtp_data_channel_);
-  RTC_DCHECK(!sctp_transport_);
-}
-
-cricket::BaseChannel* WebRtcSession::GetChannel(
-    const std::string& content_name) {
-  if (voice_channel() && voice_channel()->content_name() == content_name) {
-    return voice_channel();
-  }
-  if (video_channel() && video_channel()->content_name() == content_name) {
-    return video_channel();
-  }
-  if (rtp_data_channel() &&
-      rtp_data_channel()->content_name() == content_name) {
-    return rtp_data_channel();
-  }
-  return nullptr;
-}
-
-cricket::SecurePolicy WebRtcSession::SdesPolicy() const {
-  return webrtc_session_desc_factory_->SdesPolicy();
-}
-
-bool WebRtcSession::GetSctpSslRole(rtc::SSLRole* role) {
-  if (!local_description() || !remote_description()) {
-    LOG(LS_INFO) << "Local and Remote descriptions must be applied to get the "
-                 << "SSL Role of the SCTP transport.";
-    return false;
-  }
-  if (!sctp_transport_) {
-    LOG(LS_INFO) << "Non-rejected SCTP m= section is needed to get the "
-                 << "SSL Role of the SCTP transport.";
-    return false;
-  }
-
-  return transport_controller_->GetSslRole(*sctp_transport_name_, role);
-}
-
-bool WebRtcSession::GetSslRole(const std::string& content_name,
-                               rtc::SSLRole* role) {
-  if (!local_description() || !remote_description()) {
-    LOG(LS_INFO) << "Local and Remote descriptions must be applied to get the "
-                 << "SSL Role of the session.";
-    return false;
-  }
-
-  return transport_controller_->GetSslRole(GetTransportName(content_name),
-                                           role);
-}
-
-void WebRtcSession::CreateOffer(
-    CreateSessionDescriptionObserver* observer,
-    const PeerConnectionInterface::RTCOfferAnswerOptions& options,
-    const cricket::MediaSessionOptions& session_options) {
-  webrtc_session_desc_factory_->CreateOffer(observer, options, session_options);
-}
-
-void WebRtcSession::CreateAnswer(
-    CreateSessionDescriptionObserver* observer,
-    const cricket::MediaSessionOptions& session_options) {
-  webrtc_session_desc_factory_->CreateAnswer(observer, session_options);
-}
-
-bool WebRtcSession::SetLocalDescription(SessionDescriptionInterface* desc,
-                                        std::string* err_desc) {
-  RTC_DCHECK(signaling_thread()->IsCurrent());
-
-  // Takes the ownership of |desc| regardless of the result.
-  std::unique_ptr<SessionDescriptionInterface> desc_temp(desc);
-
-  // Validate SDP.
-  if (!ValidateSessionDescription(desc, cricket::CS_LOCAL, err_desc)) {
-    return false;
-  }
-
-  // Update the initial_offerer flag if this session is the initial_offerer.
-  Action action = GetAction(desc->type());
-  if (state() == STATE_INIT && action == kOffer) {
-    initial_offerer_ = true;
-    transport_controller_->SetIceRole(cricket::ICEROLE_CONTROLLING);
-  }
-
-  if (action == kAnswer) {
-    current_local_description_.reset(desc_temp.release());
-    pending_local_description_.reset(nullptr);
-    current_remote_description_.reset(pending_remote_description_.release());
-  } else {
-    pending_local_description_.reset(desc_temp.release());
-  }
-
-  // Transport and Media channels will be created only when offer is set.
-  if (action == kOffer && !CreateChannels(local_description()->description())) {
-    // TODO(mallinath) - Handle CreateChannel failure, as new local description
-    // is applied. Restore back to old description.
-    return BadLocalSdp(desc->type(), kCreateChannelFailed, err_desc);
-  }
-
-  // Remove unused channels if MediaContentDescription is rejected.
-  RemoveUnusedChannels(local_description()->description());
-
-  if (!UpdateSessionState(action, cricket::CS_LOCAL, err_desc)) {
-    return false;
-  }
-  if (remote_description()) {
-    // Now that we have a local description, we can push down remote candidates.
-    UseCandidatesInSessionDescription(remote_description());
-  }
-
-  pending_ice_restarts_.clear();
-  if (error() != ERROR_NONE) {
-    return BadLocalSdp(desc->type(), GetSessionErrorMsg(), err_desc);
-  }
-  return true;
-}
-
-bool WebRtcSession::SetRemoteDescription(SessionDescriptionInterface* desc,
-                                         std::string* err_desc) {
-  RTC_DCHECK(signaling_thread()->IsCurrent());
-
-  // Takes the ownership of |desc| regardless of the result.
-  std::unique_ptr<SessionDescriptionInterface> desc_temp(desc);
-
-  // Validate SDP.
-  if (!ValidateSessionDescription(desc, cricket::CS_REMOTE, err_desc)) {
-    return false;
-  }
-
-  const SessionDescriptionInterface* old_remote_description =
-      remote_description();
-  // Grab ownership of the description being replaced for the remainder of this
-  // method, since it's used below.
-  std::unique_ptr<SessionDescriptionInterface> replaced_remote_description;
-  Action action = GetAction(desc->type());
-  if (action == kAnswer) {
-    replaced_remote_description.reset(
-        pending_remote_description_ ? pending_remote_description_.release()
-                                    : current_remote_description_.release());
-    current_remote_description_.reset(desc_temp.release());
-    pending_remote_description_.reset(nullptr);
-    current_local_description_.reset(pending_local_description_.release());
-  } else {
-    replaced_remote_description.reset(pending_remote_description_.release());
-    pending_remote_description_.reset(desc_temp.release());
-  }
-
-  // Transport and Media channels will be created only when offer is set.
-  if (action == kOffer && !CreateChannels(desc->description())) {
-    // TODO(mallinath) - Handle CreateChannel failure, as new local description
-    // is applied. Restore back to old description.
-    return BadRemoteSdp(desc->type(), kCreateChannelFailed, err_desc);
-  }
-
-  // Remove unused channels if MediaContentDescription is rejected.
-  RemoveUnusedChannels(desc->description());
-
-  // NOTE: Candidates allocation will be initiated only when SetLocalDescription
-  // is called.
-  if (!UpdateSessionState(action, cricket::CS_REMOTE, err_desc)) {
-    return false;
-  }
-
-  if (local_description() && !UseCandidatesInSessionDescription(desc)) {
-    return BadRemoteSdp(desc->type(), kInvalidCandidates, err_desc);
-  }
-
-  if (old_remote_description) {
-    for (const cricket::ContentInfo& content :
-         old_remote_description->description()->contents()) {
-      // Check if this new SessionDescription contains new ICE ufrag and
-      // password that indicates the remote peer requests an ICE restart.
-      // TODO(deadbeef): When we start storing both the current and pending
-      // remote description, this should reset pending_ice_restarts and compare
-      // against the current description.
-      if (CheckForRemoteIceRestart(old_remote_description, desc,
-                                   content.name)) {
-        if (action == kOffer) {
-          pending_ice_restarts_.insert(content.name);
-        }
-      } else {
-        // We retain all received candidates only if ICE is not restarted.
-        // When ICE is restarted, all previous candidates belong to an old
-        // generation and should not be kept.
-        // TODO(deadbeef): This goes against the W3C spec which says the remote
-        // description should only contain candidates from the last set remote
-        // description plus any candidates added since then. We should remove
-        // this once we're sure it won't break anything.
-        WebRtcSessionDescriptionFactory::CopyCandidatesFromSessionDescription(
-            old_remote_description, content.name, desc);
-      }
-    }
-  }
-
-  if (error() != ERROR_NONE) {
-    return BadRemoteSdp(desc->type(), GetSessionErrorMsg(), err_desc);
-  }
-
-  // Set the the ICE connection state to connecting since the connection may
-  // become writable with peer reflexive candidates before any remote candidate
-  // is signaled.
-  // TODO(pthatcher): This is a short-term solution for crbug/446908. A real fix
-  // is to have a new signal the indicates a change in checking state from the
-  // transport and expose a new checking() member from transport that can be
-  // read to determine the current checking state. The existing SignalConnecting
-  // actually means "gathering candidates", so cannot be be used here.
-  if (desc->type() != SessionDescriptionInterface::kOffer &&
-      ice_connection_state_ == PeerConnectionInterface::kIceConnectionNew) {
-    SetIceConnectionState(PeerConnectionInterface::kIceConnectionChecking);
-  }
-  return true;
-}
-
-// TODO(steveanton): Eventually it'd be nice to store the channels as a single
-// vector of BaseChannel pointers instead of separate voice and video channel
-// vectors. At that point, this will become a simple getter.
-std::vector<cricket::BaseChannel*> WebRtcSession::Channels() const {
-  std::vector<cricket::BaseChannel*> channels;
-  channels.insert(channels.end(), voice_channels_.begin(),
-                  voice_channels_.end());
-  channels.insert(channels.end(), video_channels_.begin(),
-                  video_channels_.end());
-  if (rtp_data_channel_) {
-    channels.push_back(rtp_data_channel_.get());
-  }
-  return channels;
-}
-
-void WebRtcSession::LogState(State old_state, State new_state) {
-  LOG(LS_INFO) << "Session:" << id()
-               << " Old state:" << GetStateString(old_state)
-               << " New state:" << GetStateString(new_state);
-}
-
-void WebRtcSession::SetState(State state) {
-  RTC_DCHECK(signaling_thread_->IsCurrent());
-  if (state != state_) {
-    LogState(state_, state);
-    state_ = state;
-    SignalState(this, state_);
-  }
-}
-
-void WebRtcSession::SetError(Error error, const std::string& error_desc) {
-  RTC_DCHECK(signaling_thread_->IsCurrent());
-  if (error != error_) {
-    error_ = error;
-    error_desc_ = error_desc;
-  }
-}
-
-bool WebRtcSession::UpdateSessionState(
-    Action action, cricket::ContentSource source,
-    std::string* err_desc) {
-  RTC_DCHECK(signaling_thread()->IsCurrent());
-
-  // If there's already a pending error then no state transition should happen.
-  // But all call-sites should be verifying this before calling us!
-  RTC_DCHECK(error() == ERROR_NONE);
-  std::string td_err;
-  if (action == kOffer) {
-    if (!PushdownTransportDescription(source, cricket::CA_OFFER, &td_err)) {
-      return BadOfferSdp(source, MakeTdErrorString(td_err), err_desc);
-    }
-    SetState(source == cricket::CS_LOCAL ? STATE_SENTOFFER
-                                         : STATE_RECEIVEDOFFER);
-    if (!PushdownMediaDescription(cricket::CA_OFFER, source, err_desc)) {
-      SetError(ERROR_CONTENT, *err_desc);
-    }
-    if (error() != ERROR_NONE) {
-      return BadOfferSdp(source, GetSessionErrorMsg(), err_desc);
-    }
-  } else if (action == kPrAnswer) {
-    if (!PushdownTransportDescription(source, cricket::CA_PRANSWER, &td_err)) {
-      return BadPranswerSdp(source, MakeTdErrorString(td_err), err_desc);
-    }
-    EnableChannels();
-    SetState(source == cricket::CS_LOCAL ? STATE_SENTPRANSWER
-                                         : STATE_RECEIVEDPRANSWER);
-    if (!PushdownMediaDescription(cricket::CA_PRANSWER, source, err_desc)) {
-      SetError(ERROR_CONTENT, *err_desc);
-    }
-    if (error() != ERROR_NONE) {
-      return BadPranswerSdp(source, GetSessionErrorMsg(), err_desc);
-    }
-  } else if (action == kAnswer) {
-    const cricket::ContentGroup* local_bundle =
-        local_description()->description()->GetGroupByName(
-            cricket::GROUP_TYPE_BUNDLE);
-    const cricket::ContentGroup* remote_bundle =
-        remote_description()->description()->GetGroupByName(
-            cricket::GROUP_TYPE_BUNDLE);
-    if (local_bundle && remote_bundle) {
-      // The answerer decides the transport to bundle on.
-      const cricket::ContentGroup* answer_bundle =
-          (source == cricket::CS_LOCAL ? local_bundle : remote_bundle);
-      if (!EnableBundle(*answer_bundle)) {
-        LOG(LS_WARNING) << "Failed to enable BUNDLE.";
-        return BadAnswerSdp(source, kEnableBundleFailed, err_desc);
-      }
-    }
-    // Only push down the transport description after enabling BUNDLE; we don't
-    // want to push down a description on a transport about to be destroyed.
-    if (!PushdownTransportDescription(source, cricket::CA_ANSWER, &td_err)) {
-      return BadAnswerSdp(source, MakeTdErrorString(td_err), err_desc);
-    }
-    EnableChannels();
-    SetState(STATE_INPROGRESS);
-    if (!PushdownMediaDescription(cricket::CA_ANSWER, source, err_desc)) {
-      SetError(ERROR_CONTENT, *err_desc);
-    }
-    if (error() != ERROR_NONE) {
-      return BadAnswerSdp(source, GetSessionErrorMsg(), err_desc);
-    }
-  }
-  return true;
-}
-
-WebRtcSession::Action WebRtcSession::GetAction(const std::string& type) {
-  if (type == SessionDescriptionInterface::kOffer) {
-    return WebRtcSession::kOffer;
-  } else if (type == SessionDescriptionInterface::kPrAnswer) {
-    return WebRtcSession::kPrAnswer;
-  } else if (type == SessionDescriptionInterface::kAnswer) {
-    return WebRtcSession::kAnswer;
-  }
-  RTC_NOTREACHED() << "unknown action type";
-  return WebRtcSession::kOffer;
-}
-
-bool WebRtcSession::PushdownMediaDescription(
-    cricket::ContentAction action,
-    cricket::ContentSource source,
-    std::string* err) {
-  const SessionDescription* sdesc =
-      (source == cricket::CS_LOCAL ? local_description() : remote_description())
-          ->description();
-  RTC_DCHECK(sdesc);
-  bool all_success = true;
-  for (auto* channel : Channels()) {
-    // TODO(steveanton): Add support for multiple channels of the same type.
-    const ContentInfo* content_info =
-        cricket::GetFirstMediaContent(sdesc->contents(), channel->media_type());
-    if (!content_info) {
-      continue;
-    }
-    const MediaContentDescription* content_desc =
-        static_cast<const MediaContentDescription*>(content_info->description);
-    if (content_desc && !content_info->rejected) {
-      bool success = (source == cricket::CS_LOCAL)
-                         ? channel->SetLocalContent(content_desc, action, err)
-                         : channel->SetRemoteContent(content_desc, action, err);
-      if (!success) {
-        all_success = false;
-        break;
-      }
-    }
-  }
-  // Need complete offer/answer with an SCTP m= section before starting SCTP,
-  // according to https://tools.ietf.org/html/draft-ietf-mmusic-sctp-sdp-19
-  if (sctp_transport_ && local_description() && remote_description() &&
-      cricket::GetFirstDataContent(local_description()->description()) &&
-      cricket::GetFirstDataContent(remote_description()->description())) {
-    all_success &= network_thread_->Invoke<bool>(
-        RTC_FROM_HERE,
-        rtc::Bind(&WebRtcSession::PushdownSctpParameters_n, this, source));
-  }
-  return all_success;
-}
-
-bool WebRtcSession::PushdownSctpParameters_n(cricket::ContentSource source) {
-  RTC_DCHECK(network_thread_->IsCurrent());
-  RTC_DCHECK(local_description());
-  RTC_DCHECK(remote_description());
-  // Apply the SCTP port (which is hidden inside a DataCodec structure...)
-  // When we support "max-message-size", that would also be pushed down here.
-  return sctp_transport_->Start(
-      GetSctpPort(local_description()->description()),
-      GetSctpPort(remote_description()->description()));
-}
-
-bool WebRtcSession::PushdownTransportDescription(cricket::ContentSource source,
-                                                 cricket::ContentAction action,
-                                                 std::string* error_desc) {
-  RTC_DCHECK(signaling_thread()->IsCurrent());
-
-  if (source == cricket::CS_LOCAL) {
-    return PushdownLocalTransportDescription(local_description()->description(),
-                                             action, error_desc);
-  }
-  return PushdownRemoteTransportDescription(remote_description()->description(),
-                                            action, error_desc);
-}
-
-bool WebRtcSession::PushdownLocalTransportDescription(
-    const SessionDescription* sdesc,
-    cricket::ContentAction action,
-    std::string* err) {
-  RTC_DCHECK(signaling_thread()->IsCurrent());
-
-  if (!sdesc) {
-    return false;
-  }
-
-  for (const TransportInfo& tinfo : sdesc->transport_infos()) {
-    if (!transport_controller_->SetLocalTransportDescription(
-            tinfo.content_name, tinfo.description, action, err)) {
-      return false;
-    }
-  }
-
-  return true;
-}
-
-bool WebRtcSession::PushdownRemoteTransportDescription(
-    const SessionDescription* sdesc,
-    cricket::ContentAction action,
-    std::string* err) {
-  RTC_DCHECK(signaling_thread()->IsCurrent());
-
-  if (!sdesc) {
-    return false;
-  }
-
-  for (const TransportInfo& tinfo : sdesc->transport_infos()) {
-    if (!transport_controller_->SetRemoteTransportDescription(
-            tinfo.content_name, tinfo.description, action, err)) {
-      return false;
-    }
-  }
-
-  return true;
-}
-
-bool WebRtcSession::GetTransportDescription(
-    const SessionDescription* description,
-    const std::string& content_name,
-    cricket::TransportDescription* tdesc) {
-  if (!description || !tdesc) {
-    return false;
-  }
-  const TransportInfo* transport_info =
-      description->GetTransportInfoByName(content_name);
-  if (!transport_info) {
-    return false;
-  }
-  *tdesc = transport_info->description;
-  return true;
-}
-
-bool WebRtcSession::EnableBundle(const cricket::ContentGroup& bundle) {
-  const std::string* first_content_name = bundle.FirstContentName();
-  if (!first_content_name) {
-    LOG(LS_WARNING) << "Tried to BUNDLE with no contents.";
-    return false;
-  }
-  const std::string& transport_name = *first_content_name;
-
-#ifdef HAVE_QUIC
-  if (quic_data_transport_ &&
-      bundle.HasContentName(quic_data_transport_->content_name()) &&
-      quic_data_transport_->transport_name() != transport_name) {
-    LOG(LS_ERROR) << "Unable to BUNDLE " << quic_data_transport_->content_name()
-                  << " on " << transport_name << "with QUIC.";
-  }
-#endif
-  auto maybe_set_transport = [this, bundle,
-                              transport_name](cricket::BaseChannel* ch) {
-    if (!ch || !bundle.HasContentName(ch->content_name())) {
-      return true;
-    }
-
-    std::string old_transport_name = ch->transport_name();
-    if (old_transport_name == transport_name) {
-      LOG(LS_INFO) << "BUNDLE already enabled for " << ch->content_name()
-                   << " on " << transport_name << ".";
-      return true;
-    }
-
-    cricket::DtlsTransportInternal* rtp_dtls_transport =
-        transport_controller_->CreateDtlsTransport(
-            transport_name, cricket::ICE_CANDIDATE_COMPONENT_RTP);
-    bool need_rtcp = (ch->rtcp_dtls_transport() != nullptr);
-    cricket::DtlsTransportInternal* rtcp_dtls_transport = nullptr;
-    if (need_rtcp) {
-      rtcp_dtls_transport = transport_controller_->CreateDtlsTransport(
-          transport_name, cricket::ICE_CANDIDATE_COMPONENT_RTCP);
-    }
-
-    ch->SetTransports(rtp_dtls_transport, rtcp_dtls_transport);
-    LOG(LS_INFO) << "Enabled BUNDLE for " << ch->content_name() << " on "
-                 << transport_name << ".";
-    transport_controller_->DestroyDtlsTransport(
-        old_transport_name, cricket::ICE_CANDIDATE_COMPONENT_RTP);
-    // If the channel needs rtcp, it means that the channel used to have a
-    // rtcp transport which needs to be deleted now.
-    if (need_rtcp) {
-      transport_controller_->DestroyDtlsTransport(
-          old_transport_name, cricket::ICE_CANDIDATE_COMPONENT_RTCP);
-    }
-    return true;
-  };
-
-  if (!maybe_set_transport(voice_channel()) ||
-      !maybe_set_transport(video_channel()) ||
-      !maybe_set_transport(rtp_data_channel())) {
-    return false;
-  }
-  // For SCTP, transport creation/deletion happens here instead of in the
-  // object itself.
-  if (sctp_transport_) {
-    RTC_DCHECK(sctp_transport_name_);
-    RTC_DCHECK(sctp_content_name_);
-    if (transport_name != *sctp_transport_name_ &&
-        bundle.HasContentName(*sctp_content_name_)) {
-      network_thread_->Invoke<void>(
-          RTC_FROM_HERE, rtc::Bind(&WebRtcSession::ChangeSctpTransport_n, this,
-                                   transport_name));
-    }
-  }
-
-  return true;
-}
-
-bool WebRtcSession::ProcessIceMessage(const IceCandidateInterface* candidate) {
-  if (!remote_description()) {
-    LOG(LS_ERROR) << "ProcessIceMessage: ICE candidates can't be added "
-                  << "without any remote session description.";
-    return false;
-  }
-
-  if (!candidate) {
-    LOG(LS_ERROR) << "ProcessIceMessage: Candidate is NULL.";
-    return false;
-  }
-
-  bool valid = false;
-  bool ready = ReadyToUseRemoteCandidate(candidate, NULL, &valid);
-  if (!valid) {
-    return false;
-  }
-
-  // Add this candidate to the remote session description.
-  if (!mutable_remote_description()->AddCandidate(candidate)) {
-    LOG(LS_ERROR) << "ProcessIceMessage: Candidate cannot be used.";
-    return false;
-  }
-
-  if (ready) {
-    return UseCandidate(candidate);
-  } else {
-    LOG(LS_INFO) << "ProcessIceMessage: Not ready to use candidate.";
-    return true;
-  }
-}
-
-bool WebRtcSession::RemoveRemoteIceCandidates(
-    const std::vector<cricket::Candidate>& candidates) {
-  if (!remote_description()) {
-    LOG(LS_ERROR) << "RemoveRemoteIceCandidates: ICE candidates can't be "
-                  << "removed without any remote session description.";
-    return false;
-  }
-
-  if (candidates.empty()) {
-    LOG(LS_ERROR) << "RemoveRemoteIceCandidates: candidates are empty.";
-    return false;
-  }
-
-  size_t number_removed =
-      mutable_remote_description()->RemoveCandidates(candidates);
-  if (number_removed != candidates.size()) {
-    LOG(LS_ERROR) << "RemoveRemoteIceCandidates: Failed to remove candidates. "
-                  << "Requested " << candidates.size() << " but only "
-                  << number_removed << " are removed.";
-  }
-
-  // Remove the candidates from the transport controller.
-  std::string error;
-  bool res = transport_controller_->RemoveRemoteCandidates(candidates, &error);
-  if (!res && !error.empty()) {
-    LOG(LS_ERROR) << "Error when removing remote candidates: " << error;
-  }
-  return true;
-}
-
-cricket::IceConfig WebRtcSession::ParseIceConfig(
-    const PeerConnectionInterface::RTCConfiguration& config) const {
-  cricket::ContinualGatheringPolicy gathering_policy;
-  // TODO(honghaiz): Add the third continual gathering policy in
-  // PeerConnectionInterface and map it to GATHER_CONTINUALLY_AND_RECOVER.
-  switch (config.continual_gathering_policy) {
-    case PeerConnectionInterface::GATHER_ONCE:
-      gathering_policy = cricket::GATHER_ONCE;
-      break;
-    case PeerConnectionInterface::GATHER_CONTINUALLY:
-      gathering_policy = cricket::GATHER_CONTINUALLY;
-      break;
-    default:
-      RTC_NOTREACHED();
-      gathering_policy = cricket::GATHER_ONCE;
-  }
-  cricket::IceConfig ice_config;
-  ice_config.receiving_timeout = config.ice_connection_receiving_timeout;
-  ice_config.prioritize_most_likely_candidate_pairs =
-      config.prioritize_most_likely_ice_candidate_pairs;
-  ice_config.backup_connection_ping_interval =
-      config.ice_backup_candidate_pair_ping_interval;
-  ice_config.continual_gathering_policy = gathering_policy;
-  ice_config.presume_writable_when_fully_relayed =
-      config.presume_writable_when_fully_relayed;
-  ice_config.ice_check_min_interval = config.ice_check_min_interval;
-  ice_config.regather_all_networks_interval_range =
-      config.ice_regather_interval_range;
-  return ice_config;
-}
-
-void WebRtcSession::SetIceConfig(const cricket::IceConfig& config) {
-  transport_controller_->SetIceConfig(config);
-}
-
-void WebRtcSession::MaybeStartGathering() {
-  transport_controller_->MaybeStartGathering();
-}
-
-bool WebRtcSession::GetLocalTrackIdBySsrc(uint32_t ssrc,
-                                          std::string* track_id) {
-  if (!local_description()) {
-    return false;
-  }
-  return webrtc::GetTrackIdBySsrc(local_description()->description(), ssrc,
-                                  track_id);
-}
-
-bool WebRtcSession::GetRemoteTrackIdBySsrc(uint32_t ssrc,
-                                           std::string* track_id) {
-  if (!remote_description()) {
-    return false;
-  }
-  return webrtc::GetTrackIdBySsrc(remote_description()->description(), ssrc,
-                                  track_id);
-}
-
-std::string WebRtcSession::BadStateErrMsg(State state) {
-  std::ostringstream desc;
-  desc << "Called in wrong state: " << GetStateString(state);
-  return desc.str();
-}
-
-bool WebRtcSession::SendData(const cricket::SendDataParams& params,
-                             const rtc::CopyOnWriteBuffer& payload,
-                             cricket::SendDataResult* result) {
-  if (!rtp_data_channel_ && !sctp_transport_) {
-    LOG(LS_ERROR) << "SendData called when rtp_data_channel_ "
-                  << "and sctp_transport_ are NULL.";
-    return false;
-  }
-  return rtp_data_channel_
-             ? rtp_data_channel_->SendData(params, payload, result)
-             : network_thread_->Invoke<bool>(
-                   RTC_FROM_HERE,
-                   Bind(&cricket::SctpTransportInternal::SendData,
-                        sctp_transport_.get(), params, payload, result));
-}
-
-bool WebRtcSession::ConnectDataChannel(DataChannel* webrtc_data_channel) {
-  if (!rtp_data_channel_ && !sctp_transport_) {
-    // Don't log an error here, because DataChannels are expected to call
-    // ConnectDataChannel in this state. It's the only way to initially tell
-    // whether or not the underlying transport is ready.
-    return false;
-  }
-  if (rtp_data_channel_) {
-    rtp_data_channel_->SignalReadyToSendData.connect(
-        webrtc_data_channel, &DataChannel::OnChannelReady);
-    rtp_data_channel_->SignalDataReceived.connect(webrtc_data_channel,
-                                                  &DataChannel::OnDataReceived);
-  } else {
-    SignalSctpReadyToSendData.connect(webrtc_data_channel,
-                                      &DataChannel::OnChannelReady);
-    SignalSctpDataReceived.connect(webrtc_data_channel,
-                                   &DataChannel::OnDataReceived);
-    SignalSctpStreamClosedRemotely.connect(
-        webrtc_data_channel, &DataChannel::OnStreamClosedRemotely);
-  }
-  return true;
-}
-
-void WebRtcSession::DisconnectDataChannel(DataChannel* webrtc_data_channel) {
-  if (!rtp_data_channel_ && !sctp_transport_) {
-    LOG(LS_ERROR) << "DisconnectDataChannel called when rtp_data_channel_ and "
-                     "sctp_transport_ are NULL.";
-    return;
-  }
-  if (rtp_data_channel_) {
-    rtp_data_channel_->SignalReadyToSendData.disconnect(webrtc_data_channel);
-    rtp_data_channel_->SignalDataReceived.disconnect(webrtc_data_channel);
-  } else {
-    SignalSctpReadyToSendData.disconnect(webrtc_data_channel);
-    SignalSctpDataReceived.disconnect(webrtc_data_channel);
-    SignalSctpStreamClosedRemotely.disconnect(webrtc_data_channel);
-  }
-}
-
-void WebRtcSession::AddSctpDataStream(int sid) {
-  if (!sctp_transport_) {
-    LOG(LS_ERROR) << "AddSctpDataStream called when sctp_transport_ is NULL.";
-    return;
-  }
-  network_thread_->Invoke<void>(
-      RTC_FROM_HERE, rtc::Bind(&cricket::SctpTransportInternal::OpenStream,
-                               sctp_transport_.get(), sid));
-}
-
-void WebRtcSession::RemoveSctpDataStream(int sid) {
-  if (!sctp_transport_) {
-    LOG(LS_ERROR) << "RemoveSctpDataStream called when sctp_transport_ is "
-                  << "NULL.";
-    return;
-  }
-  network_thread_->Invoke<void>(
-      RTC_FROM_HERE, rtc::Bind(&cricket::SctpTransportInternal::ResetStream,
-                               sctp_transport_.get(), sid));
-}
-
-bool WebRtcSession::ReadyToSendData() const {
-  return (rtp_data_channel_ && rtp_data_channel_->ready_to_send_data()) ||
-         sctp_ready_to_send_data_;
-}
-
-std::unique_ptr<SessionStats> WebRtcSession::GetStats_s() {
-  RTC_DCHECK(signaling_thread()->IsCurrent());
-  ChannelNamePairs channel_name_pairs;
-  if (voice_channel()) {
-    channel_name_pairs.voice = rtc::Optional<ChannelNamePair>(ChannelNamePair(
-        voice_channel()->content_name(), voice_channel()->transport_name()));
-  }
-  if (video_channel()) {
-    channel_name_pairs.video = rtc::Optional<ChannelNamePair>(ChannelNamePair(
-        video_channel()->content_name(), video_channel()->transport_name()));
-  }
-  if (rtp_data_channel()) {
-    channel_name_pairs.data = rtc::Optional<ChannelNamePair>(
-        ChannelNamePair(rtp_data_channel()->content_name(),
-                        rtp_data_channel()->transport_name()));
-  }
-  if (sctp_transport_) {
-    RTC_DCHECK(sctp_content_name_);
-    RTC_DCHECK(sctp_transport_name_);
-    channel_name_pairs.data = rtc::Optional<ChannelNamePair>(
-        ChannelNamePair(*sctp_content_name_, *sctp_transport_name_));
-  }
-  return GetStats(channel_name_pairs);
-}
-
-std::unique_ptr<SessionStats> WebRtcSession::GetStats(
-    const ChannelNamePairs& channel_name_pairs) {
-  if (network_thread()->IsCurrent()) {
-    return GetStats_n(channel_name_pairs);
-  }
-  return network_thread()->Invoke<std::unique_ptr<SessionStats>>(
-      RTC_FROM_HERE,
-      rtc::Bind(&WebRtcSession::GetStats_n, this, channel_name_pairs));
-}
-
-bool WebRtcSession::GetLocalCertificate(
-    const std::string& transport_name,
-    rtc::scoped_refptr<rtc::RTCCertificate>* certificate) {
-  return transport_controller_->GetLocalCertificate(transport_name,
-                                                    certificate);
-}
-
-std::unique_ptr<rtc::SSLCertificate> WebRtcSession::GetRemoteSSLCertificate(
-    const std::string& transport_name) {
-  return transport_controller_->GetRemoteSSLCertificate(transport_name);
-}
-
-cricket::DataChannelType WebRtcSession::data_channel_type() const {
-  return data_channel_type_;
-}
-
-bool WebRtcSession::IceRestartPending(const std::string& content_name) const {
-  return pending_ice_restarts_.find(content_name) !=
-         pending_ice_restarts_.end();
-}
-
-void WebRtcSession::SetNeedsIceRestartFlag() {
-  transport_controller_->SetNeedsIceRestartFlag();
-}
-
-bool WebRtcSession::NeedsIceRestart(const std::string& content_name) const {
-  return transport_controller_->NeedsIceRestart(content_name);
-}
-
-void WebRtcSession::OnCertificateReady(
-    const rtc::scoped_refptr<rtc::RTCCertificate>& certificate) {
-  transport_controller_->SetLocalCertificate(certificate);
-}
-
-void WebRtcSession::OnDtlsSrtpSetupFailure(cricket::BaseChannel*, bool rtcp) {
-  SetError(ERROR_TRANSPORT,
-           rtcp ? kDtlsSrtpSetupFailureRtcp : kDtlsSrtpSetupFailureRtp);
-}
-
-bool WebRtcSession::waiting_for_certificate_for_testing() const {
-  return webrtc_session_desc_factory_->waiting_for_certificate_for_testing();
-}
-
-const rtc::scoped_refptr<rtc::RTCCertificate>&
-WebRtcSession::certificate_for_testing() {
-  return transport_controller_->certificate_for_testing();
-}
-
-void WebRtcSession::SetIceConnectionState(
-      PeerConnectionInterface::IceConnectionState state) {
-  if (ice_connection_state_ == state) {
-    return;
-  }
-
-  LOG(LS_INFO) << "Changing IceConnectionState " << ice_connection_state_
-               << " => " << state;
-  RTC_DCHECK(ice_connection_state_ !=
-             PeerConnectionInterface::kIceConnectionClosed);
-  ice_connection_state_ = state;
-  if (ice_observer_) {
-    ice_observer_->OnIceConnectionStateChange(ice_connection_state_);
-  }
-}
-
-void WebRtcSession::OnTransportControllerConnectionState(
-    cricket::IceConnectionState state) {
-  switch (state) {
-    case cricket::kIceConnectionConnecting:
-      // If the current state is Connected or Completed, then there were
-      // writable channels but now there are not, so the next state must
-      // be Disconnected.
-      // kIceConnectionConnecting is currently used as the default,
-      // un-connected state by the TransportController, so its only use is
-      // detecting disconnections.
-      if (ice_connection_state_ ==
-              PeerConnectionInterface::kIceConnectionConnected ||
-          ice_connection_state_ ==
-              PeerConnectionInterface::kIceConnectionCompleted) {
-        SetIceConnectionState(
-            PeerConnectionInterface::kIceConnectionDisconnected);
-      }
-      break;
-    case cricket::kIceConnectionFailed:
-      SetIceConnectionState(PeerConnectionInterface::kIceConnectionFailed);
-      break;
-    case cricket::kIceConnectionConnected:
-      LOG(LS_INFO) << "Changing to ICE connected state because "
-                   << "all transports are writable.";
-      SetIceConnectionState(PeerConnectionInterface::kIceConnectionConnected);
-      break;
-    case cricket::kIceConnectionCompleted:
-      LOG(LS_INFO) << "Changing to ICE completed state because "
-                   << "all transports are complete.";
-      if (ice_connection_state_ !=
-          PeerConnectionInterface::kIceConnectionConnected) {
-        // If jumping directly from "checking" to "connected",
-        // signal "connected" first.
-        SetIceConnectionState(PeerConnectionInterface::kIceConnectionConnected);
-      }
-      SetIceConnectionState(PeerConnectionInterface::kIceConnectionCompleted);
-      if (metrics_observer_) {
-        ReportTransportStats();
-      }
-      break;
-    default:
-      RTC_NOTREACHED();
-  }
-}
-
-void WebRtcSession::OnTransportControllerReceiving(bool receiving) {
-  SetIceConnectionReceiving(receiving);
-}
-
-void WebRtcSession::SetIceConnectionReceiving(bool receiving) {
-  if (ice_connection_receiving_ == receiving) {
-    return;
-  }
-  ice_connection_receiving_ = receiving;
-  if (ice_observer_) {
-    ice_observer_->OnIceConnectionReceivingChange(receiving);
-  }
-}
-
-void WebRtcSession::OnTransportControllerCandidatesGathered(
-    const std::string& transport_name,
-    const cricket::Candidates& candidates) {
-  RTC_DCHECK(signaling_thread()->IsCurrent());
-  int sdp_mline_index;
-  if (!GetLocalCandidateMediaIndex(transport_name, &sdp_mline_index)) {
-    LOG(LS_ERROR) << "OnTransportControllerCandidatesGathered: content name "
-                  << transport_name << " not found";
-    return;
-  }
-
-  for (cricket::Candidates::const_iterator citer = candidates.begin();
-       citer != candidates.end(); ++citer) {
-    // Use transport_name as the candidate media id.
-    std::unique_ptr<JsepIceCandidate> candidate(
-        new JsepIceCandidate(transport_name, sdp_mline_index, *citer));
-    if (local_description()) {
-      mutable_local_description()->AddCandidate(candidate.get());
-    }
-    if (ice_observer_) {
-      ice_observer_->OnIceCandidate(std::move(candidate));
-    }
-  }
-}
-
-void WebRtcSession::OnTransportControllerCandidatesRemoved(
-    const std::vector<cricket::Candidate>& candidates) {
-  RTC_DCHECK(signaling_thread()->IsCurrent());
-  // Sanity check.
-  for (const cricket::Candidate& candidate : candidates) {
-    if (candidate.transport_name().empty()) {
-      LOG(LS_ERROR) << "OnTransportControllerCandidatesRemoved: "
-                    << "empty content name in candidate "
-                    << candidate.ToString();
-      return;
-    }
-  }
-
-  if (local_description()) {
-    mutable_local_description()->RemoveCandidates(candidates);
-  }
-  if (ice_observer_) {
-    ice_observer_->OnIceCandidatesRemoved(candidates);
-  }
-}
-
-void WebRtcSession::OnTransportControllerDtlsHandshakeError(
-    rtc::SSLHandshakeError error) {
-  if (metrics_observer_) {
-    metrics_observer_->IncrementEnumCounter(
-        webrtc::kEnumCounterDtlsHandshakeError, static_cast<int>(error),
-        static_cast<int>(rtc::SSLHandshakeError::MAX_VALUE));
-  }
-}
-
-// Enabling voice and video (and RTP data) channels.
-void WebRtcSession::EnableChannels() {
-  for (cricket::VoiceChannel* voice_channel : voice_channels_) {
-    if (!voice_channel->enabled()) {
-      voice_channel->Enable(true);
-    }
-  }
-
-  for (cricket::VideoChannel* video_channel : video_channels_) {
-    if (!video_channel->enabled()) {
-      video_channel->Enable(true);
-    }
-  }
-
-  if (rtp_data_channel_ && !rtp_data_channel_->enabled())
-    rtp_data_channel_->Enable(true);
-}
-
-// Returns the media index for a local ice candidate given the content name.
-bool WebRtcSession::GetLocalCandidateMediaIndex(const std::string& content_name,
-                                                int* sdp_mline_index) {
-  if (!local_description() || !sdp_mline_index) {
-    return false;
-  }
-
-  bool content_found = false;
-  const ContentInfos& contents = local_description()->description()->contents();
-  for (size_t index = 0; index < contents.size(); ++index) {
-    if (contents[index].name == content_name) {
-      *sdp_mline_index = static_cast<int>(index);
-      content_found = true;
-      break;
-    }
-  }
-  return content_found;
-}
-
-bool WebRtcSession::UseCandidatesInSessionDescription(
-    const SessionDescriptionInterface* remote_desc) {
-  if (!remote_desc) {
-    return true;
-  }
-  bool ret = true;
-
-  for (size_t m = 0; m < remote_desc->number_of_mediasections(); ++m) {
-    const IceCandidateCollection* candidates = remote_desc->candidates(m);
-    for (size_t n = 0; n < candidates->count(); ++n) {
-      const IceCandidateInterface* candidate = candidates->at(n);
-      bool valid = false;
-      if (!ReadyToUseRemoteCandidate(candidate, remote_desc, &valid)) {
-        if (valid) {
-          LOG(LS_INFO) << "UseCandidatesInSessionDescription: Not ready to use "
-                       << "candidate.";
-        }
-        continue;
-      }
-      ret = UseCandidate(candidate);
-      if (!ret) {
-        break;
-      }
-    }
-  }
-  return ret;
-}
-
-bool WebRtcSession::UseCandidate(const IceCandidateInterface* candidate) {
-  size_t mediacontent_index = static_cast<size_t>(candidate->sdp_mline_index());
-  size_t remote_content_size =
-      remote_description()->description()->contents().size();
-  if (mediacontent_index >= remote_content_size) {
-    LOG(LS_ERROR) << "UseCandidate: Invalid candidate media index.";
-    return false;
-  }
-
-  cricket::ContentInfo content =
-      remote_description()->description()->contents()[mediacontent_index];
-  std::vector<cricket::Candidate> candidates;
-  candidates.push_back(candidate->candidate());
-  // Invoking BaseSession method to handle remote candidates.
-  std::string error;
-  if (transport_controller_->AddRemoteCandidates(content.name, candidates,
-                                                 &error)) {
-    // Candidates successfully submitted for checking.
-    if (ice_connection_state_ == PeerConnectionInterface::kIceConnectionNew ||
-        ice_connection_state_ ==
-            PeerConnectionInterface::kIceConnectionDisconnected) {
-      // If state is New, then the session has just gotten its first remote ICE
-      // candidates, so go to Checking.
-      // If state is Disconnected, the session is re-using old candidates or
-      // receiving additional ones, so go to Checking.
-      // If state is Connected, stay Connected.
-      // TODO(bemasc): If state is Connected, and the new candidates are for a
-      // newly added transport, then the state actually _should_ move to
-      // checking.  Add a way to distinguish that case.
-      SetIceConnectionState(PeerConnectionInterface::kIceConnectionChecking);
-    }
-    // TODO(bemasc): If state is Completed, go back to Connected.
-  } else {
-    if (!error.empty()) {
-      LOG(LS_WARNING) << error;
-    }
-  }
-  return true;
-}
-
-void WebRtcSession::RemoveUnusedChannels(const SessionDescription* desc) {
-  // TODO(steveanton): Add support for multiple audio/video channels.
-  // Destroy video channel first since it may have a pointer to the
-  // voice channel.
-  const cricket::ContentInfo* video_info = cricket::GetFirstVideoContent(desc);
-  if ((!video_info || video_info->rejected) && video_channel()) {
-    RemoveAndDestroyVideoChannel(video_channel());
-  }
-
-  const cricket::ContentInfo* voice_info = cricket::GetFirstAudioContent(desc);
-  if ((!voice_info || voice_info->rejected) && voice_channel()) {
-    RemoveAndDestroyVoiceChannel(voice_channel());
-  }
-
-  const cricket::ContentInfo* data_info =
-      cricket::GetFirstDataContent(desc);
-  if (!data_info || data_info->rejected) {
-    if (rtp_data_channel_) {
-      DestroyDataChannel();
-    }
-    if (sctp_transport_) {
-      SignalDataChannelDestroyed();
-      network_thread_->Invoke<void>(
-          RTC_FROM_HERE,
-          rtc::Bind(&WebRtcSession::DestroySctpTransport_n, this));
-    }
-#ifdef HAVE_QUIC
-    // Clean up the existing QuicDataTransport and its QuicTransportChannels.
-    if (quic_data_transport_) {
-      quic_data_transport_.reset();
-    }
-#endif
-  }
-}
-
-// Returns the name of the transport channel when BUNDLE is enabled, or nullptr
-// if the channel is not part of any bundle.
-const std::string* WebRtcSession::GetBundleTransportName(
-    const cricket::ContentInfo* content,
-    const cricket::ContentGroup* bundle) {
-  if (!bundle) {
-    return nullptr;
-  }
-  const std::string* first_content_name = bundle->FirstContentName();
-  if (!first_content_name) {
-    LOG(LS_WARNING) << "Tried to BUNDLE with no contents.";
-    return nullptr;
-  }
-  if (!bundle->HasContentName(content->name)) {
-    LOG(LS_WARNING) << content->name << " is not part of any bundle group";
-    return nullptr;
-  }
-  LOG(LS_INFO) << "Bundling " << content->name << " on " << *first_content_name;
-  return first_content_name;
-}
-
-bool WebRtcSession::CreateChannels(const SessionDescription* desc) {
-  // TODO(steveanton): Add support for multiple audio/video channels.
-  const cricket::ContentGroup* bundle_group = nullptr;
-  if (bundle_policy_ == PeerConnectionInterface::kBundlePolicyMaxBundle) {
-    bundle_group = desc->GetGroupByName(cricket::GROUP_TYPE_BUNDLE);
-    if (!bundle_group) {
-      LOG(LS_WARNING) << "max-bundle specified without BUNDLE specified";
-      return false;
-    }
-  }
-  // Creating the media channels and transport proxies.
-  const cricket::ContentInfo* voice = cricket::GetFirstAudioContent(desc);
-  if (voice && !voice->rejected && !voice_channel()) {
-    if (!CreateVoiceChannel(voice,
-                            GetBundleTransportName(voice, bundle_group))) {
-      LOG(LS_ERROR) << "Failed to create voice channel.";
-      return false;
-    }
-  }
-
-  const cricket::ContentInfo* video = cricket::GetFirstVideoContent(desc);
-  if (video && !video->rejected && !video_channel()) {
-    if (!CreateVideoChannel(video,
-                            GetBundleTransportName(video, bundle_group))) {
-      LOG(LS_ERROR) << "Failed to create video channel.";
-      return false;
-    }
-  }
-
-  const cricket::ContentInfo* data = cricket::GetFirstDataContent(desc);
-  if (data_channel_type_ != cricket::DCT_NONE && data && !data->rejected &&
-      !rtp_data_channel_ && !sctp_transport_) {
-    if (!CreateDataChannel(data, GetBundleTransportName(data, bundle_group))) {
-      LOG(LS_ERROR) << "Failed to create data channel.";
-      return false;
-    }
-  }
-
-  return true;
-}
-
-bool WebRtcSession::CreateVoiceChannel(const cricket::ContentInfo* content,
-                                       const std::string* bundle_transport) {
-  // TODO(steveanton): Check to see if it's safe to create multiple voice
-  // channels.
-  RTC_DCHECK(voice_channels_.empty());
-
-  bool require_rtcp_mux =
-      rtcp_mux_policy_ == PeerConnectionInterface::kRtcpMuxPolicyRequire;
-
-  std::string transport_name =
-      bundle_transport ? *bundle_transport : content->name;
-
-  cricket::DtlsTransportInternal* rtp_dtls_transport =
-      transport_controller_->CreateDtlsTransport(
-          transport_name, cricket::ICE_CANDIDATE_COMPONENT_RTP);
-  cricket::DtlsTransportInternal* rtcp_dtls_transport = nullptr;
-  if (!require_rtcp_mux) {
-    rtcp_dtls_transport = transport_controller_->CreateDtlsTransport(
-        transport_name, cricket::ICE_CANDIDATE_COMPONENT_RTCP);
-  }
-
-  cricket::VoiceChannel* voice_channel = channel_manager_->CreateVoiceChannel(
-      call_, media_config_, rtp_dtls_transport, rtcp_dtls_transport,
-      transport_controller_->signaling_thread(), content->name, SrtpRequired(),
-      audio_options_);
-  if (!voice_channel) {
-    transport_controller_->DestroyDtlsTransport(
-        transport_name, cricket::ICE_CANDIDATE_COMPONENT_RTP);
-    if (rtcp_dtls_transport) {
-      transport_controller_->DestroyDtlsTransport(
-          transport_name, cricket::ICE_CANDIDATE_COMPONENT_RTCP);
-    }
-    return false;
-  }
-
-  voice_channels_.push_back(voice_channel);
-
-  voice_channel->SignalRtcpMuxFullyActive.connect(
-      this, &WebRtcSession::DestroyRtcpTransport_n);
-  voice_channel->SignalDtlsSrtpSetupFailure.connect(
-      this, &WebRtcSession::OnDtlsSrtpSetupFailure);
-
-  // TODO(steveanton): This should signal which voice channel was created since
-  // we can have multiple.
-  SignalVoiceChannelCreated();
-  voice_channel->SignalSentPacket.connect(this, &WebRtcSession::OnSentPacket_w);
-  return true;
-}
-
-bool WebRtcSession::CreateVideoChannel(const cricket::ContentInfo* content,
-                                       const std::string* bundle_transport) {
-  // TODO(steveanton): Check to see if it's safe to create multiple video
-  // channels.
-  RTC_DCHECK(video_channels_.empty());
-
-  bool require_rtcp_mux =
-      rtcp_mux_policy_ == PeerConnectionInterface::kRtcpMuxPolicyRequire;
-
-  std::string transport_name =
-      bundle_transport ? *bundle_transport : content->name;
-
-  cricket::DtlsTransportInternal* rtp_dtls_transport =
-      transport_controller_->CreateDtlsTransport(
-          transport_name, cricket::ICE_CANDIDATE_COMPONENT_RTP);
-  cricket::DtlsTransportInternal* rtcp_dtls_transport = nullptr;
-  if (!require_rtcp_mux) {
-    rtcp_dtls_transport = transport_controller_->CreateDtlsTransport(
-        transport_name, cricket::ICE_CANDIDATE_COMPONENT_RTCP);
-  }
-
-  cricket::VideoChannel* video_channel = channel_manager_->CreateVideoChannel(
-      call_, media_config_, rtp_dtls_transport, rtcp_dtls_transport,
-      transport_controller_->signaling_thread(), content->name, SrtpRequired(),
-      video_options_);
-
-  if (!video_channel) {
-    transport_controller_->DestroyDtlsTransport(
-        transport_name, cricket::ICE_CANDIDATE_COMPONENT_RTP);
-    if (rtcp_dtls_transport) {
-      transport_controller_->DestroyDtlsTransport(
-          transport_name, cricket::ICE_CANDIDATE_COMPONENT_RTCP);
-    }
-    return false;
-  }
-
-  video_channels_.push_back(video_channel);
-
-  video_channel->SignalRtcpMuxFullyActive.connect(
-      this, &WebRtcSession::DestroyRtcpTransport_n);
-  video_channel->SignalDtlsSrtpSetupFailure.connect(
-      this, &WebRtcSession::OnDtlsSrtpSetupFailure);
-
-  // TODO(steveanton): This should signal which video channel was created since
-  // we can have multiple.
-  SignalVideoChannelCreated();
-  video_channel->SignalSentPacket.connect(this, &WebRtcSession::OnSentPacket_w);
-  return true;
-}
-
-bool WebRtcSession::CreateDataChannel(const cricket::ContentInfo* content,
-                                      const std::string* bundle_transport) {
-  const std::string transport_name =
-      bundle_transport ? *bundle_transport : content->name;
-#ifdef HAVE_QUIC
-  if (data_channel_type_ == cricket::DCT_QUIC) {
-    RTC_DCHECK(transport_controller_->quic());
-    quic_data_transport_->SetTransports(transport_name);
-    return true;
-  }
-#endif  // HAVE_QUIC
-  bool sctp = (data_channel_type_ == cricket::DCT_SCTP);
-  if (sctp) {
-    if (!sctp_factory_) {
-      LOG(LS_ERROR)
-          << "Trying to create SCTP transport, but didn't compile with "
-             "SCTP support (HAVE_SCTP)";
-      return false;
-    }
-    if (!network_thread_->Invoke<bool>(
-            RTC_FROM_HERE, rtc::Bind(&WebRtcSession::CreateSctpTransport_n,
-                                     this, content->name, transport_name))) {
-      return false;
-    };
-  } else {
-    bool require_rtcp_mux =
-        rtcp_mux_policy_ == PeerConnectionInterface::kRtcpMuxPolicyRequire;
-
-    std::string transport_name =
-        bundle_transport ? *bundle_transport : content->name;
-    cricket::DtlsTransportInternal* rtp_dtls_transport =
-        transport_controller_->CreateDtlsTransport(
-            transport_name, cricket::ICE_CANDIDATE_COMPONENT_RTP);
-    cricket::DtlsTransportInternal* rtcp_dtls_transport = nullptr;
-    if (!require_rtcp_mux) {
-      rtcp_dtls_transport = transport_controller_->CreateDtlsTransport(
-          transport_name, cricket::ICE_CANDIDATE_COMPONENT_RTCP);
-    }
-
-    rtp_data_channel_.reset(channel_manager_->CreateRtpDataChannel(
-        media_config_, rtp_dtls_transport, rtcp_dtls_transport,
-        transport_controller_->signaling_thread(), content->name,
-        SrtpRequired()));
-
-    if (!rtp_data_channel_) {
-      transport_controller_->DestroyDtlsTransport(
-          transport_name, cricket::ICE_CANDIDATE_COMPONENT_RTP);
-      if (rtcp_dtls_transport) {
-        transport_controller_->DestroyDtlsTransport(
-            transport_name, cricket::ICE_CANDIDATE_COMPONENT_RTCP);
-      }
-      return false;
-    }
-
-    rtp_data_channel_->SignalRtcpMuxFullyActive.connect(
-        this, &WebRtcSession::DestroyRtcpTransport_n);
-    rtp_data_channel_->SignalDtlsSrtpSetupFailure.connect(
-        this, &WebRtcSession::OnDtlsSrtpSetupFailure);
-    rtp_data_channel_->SignalSentPacket.connect(this,
-                                                &WebRtcSession::OnSentPacket_w);
-  }
-
-  SignalDataChannelCreated();
-
-  return true;
-}
-
-Call::Stats WebRtcSession::GetCallStats() {
-  if (!worker_thread()->IsCurrent()) {
-    return worker_thread()->Invoke<Call::Stats>(
-        RTC_FROM_HERE, rtc::Bind(&WebRtcSession::GetCallStats, this));
-  }
-  if (!call_)
-    return Call::Stats();
-  return call_->GetStats();
-}
-
-std::unique_ptr<SessionStats> WebRtcSession::GetStats_n(
-    const ChannelNamePairs& channel_name_pairs) {
-  RTC_DCHECK(network_thread()->IsCurrent());
-  std::unique_ptr<SessionStats> session_stats(new SessionStats());
-  for (const auto channel_name_pair : { &channel_name_pairs.voice,
-                                        &channel_name_pairs.video,
-                                        &channel_name_pairs.data }) {
-    if (*channel_name_pair) {
-      cricket::TransportStats transport_stats;
-      if (!transport_controller_->GetStats((*channel_name_pair)->transport_name,
-                                           &transport_stats)) {
-        return nullptr;
-      }
-      session_stats->proxy_to_transport[(*channel_name_pair)->content_name] =
-          (*channel_name_pair)->transport_name;
-      session_stats->transport_stats[(*channel_name_pair)->transport_name] =
-          std::move(transport_stats);
-    }
-  }
-  return session_stats;
-}
-
-bool WebRtcSession::CreateSctpTransport_n(const std::string& content_name,
-                                          const std::string& transport_name) {
-  RTC_DCHECK(network_thread_->IsCurrent());
-  RTC_DCHECK(sctp_factory_);
-  cricket::DtlsTransportInternal* tc =
-      transport_controller_->CreateDtlsTransport_n(
-          transport_name, cricket::ICE_CANDIDATE_COMPONENT_RTP);
-  sctp_transport_ = sctp_factory_->CreateSctpTransport(tc);
-  RTC_DCHECK(sctp_transport_);
-  sctp_invoker_.reset(new rtc::AsyncInvoker());
-  sctp_transport_->SignalReadyToSendData.connect(
-      this, &WebRtcSession::OnSctpTransportReadyToSendData_n);
-  sctp_transport_->SignalDataReceived.connect(
-      this, &WebRtcSession::OnSctpTransportDataReceived_n);
-  sctp_transport_->SignalStreamClosedRemotely.connect(
-      this, &WebRtcSession::OnSctpStreamClosedRemotely_n);
-  sctp_transport_name_ = rtc::Optional<std::string>(transport_name);
-  sctp_content_name_ = rtc::Optional<std::string>(content_name);
-  return true;
-}
-
-void WebRtcSession::ChangeSctpTransport_n(const std::string& transport_name) {
-  RTC_DCHECK(network_thread_->IsCurrent());
-  RTC_DCHECK(sctp_transport_);
-  RTC_DCHECK(sctp_transport_name_);
-  std::string old_sctp_transport_name = *sctp_transport_name_;
-  sctp_transport_name_ = rtc::Optional<std::string>(transport_name);
-  cricket::DtlsTransportInternal* tc =
-      transport_controller_->CreateDtlsTransport_n(
-          transport_name, cricket::ICE_CANDIDATE_COMPONENT_RTP);
-  sctp_transport_->SetTransportChannel(tc);
-  transport_controller_->DestroyDtlsTransport_n(
-      old_sctp_transport_name, cricket::ICE_CANDIDATE_COMPONENT_RTP);
-}
-
-void WebRtcSession::DestroySctpTransport_n() {
-  RTC_DCHECK(network_thread_->IsCurrent());
-  sctp_transport_.reset(nullptr);
-  sctp_content_name_.reset();
-  sctp_transport_name_.reset();
-  sctp_invoker_.reset(nullptr);
-  sctp_ready_to_send_data_ = false;
-}
-
-void WebRtcSession::OnSctpTransportReadyToSendData_n() {
-  RTC_DCHECK(data_channel_type_ == cricket::DCT_SCTP);
-  RTC_DCHECK(network_thread_->IsCurrent());
-  sctp_invoker_->AsyncInvoke<void>(
-      RTC_FROM_HERE, signaling_thread_,
-      rtc::Bind(&WebRtcSession::OnSctpTransportReadyToSendData_s, this, true));
-}
-
-void WebRtcSession::OnSctpTransportReadyToSendData_s(bool ready) {
-  RTC_DCHECK(signaling_thread_->IsCurrent());
-  sctp_ready_to_send_data_ = ready;
-  SignalSctpReadyToSendData(ready);
-}
-
-void WebRtcSession::OnSctpTransportDataReceived_n(
-    const cricket::ReceiveDataParams& params,
-    const rtc::CopyOnWriteBuffer& payload) {
-  RTC_DCHECK(data_channel_type_ == cricket::DCT_SCTP);
-  RTC_DCHECK(network_thread_->IsCurrent());
-  sctp_invoker_->AsyncInvoke<void>(
-      RTC_FROM_HERE, signaling_thread_,
-      rtc::Bind(&WebRtcSession::OnSctpTransportDataReceived_s, this, params,
-                payload));
-}
-
-void WebRtcSession::OnSctpTransportDataReceived_s(
-    const cricket::ReceiveDataParams& params,
-    const rtc::CopyOnWriteBuffer& payload) {
-  RTC_DCHECK(signaling_thread_->IsCurrent());
-  if (params.type == cricket::DMT_CONTROL && IsOpenMessage(payload)) {
-    // Received OPEN message; parse and signal that a new data channel should
-    // be created.
-    std::string label;
-    InternalDataChannelInit config;
-    config.id = params.ssrc;
-    if (!ParseDataChannelOpenMessage(payload, &label, &config)) {
-      LOG(LS_WARNING) << "Failed to parse the OPEN message for sid "
-                      << params.ssrc;
-      return;
-    }
-    config.open_handshake_role = InternalDataChannelInit::kAcker;
-    SignalDataChannelOpenMessage(label, config);
-  } else {
-    // Otherwise just forward the signal.
-    SignalSctpDataReceived(params, payload);
-  }
-}
-
-void WebRtcSession::OnSctpStreamClosedRemotely_n(int sid) {
-  RTC_DCHECK(data_channel_type_ == cricket::DCT_SCTP);
-  RTC_DCHECK(network_thread_->IsCurrent());
-  sctp_invoker_->AsyncInvoke<void>(
-      RTC_FROM_HERE, signaling_thread_,
-      rtc::Bind(&sigslot::signal1<int>::operator(),
-                &SignalSctpStreamClosedRemotely, sid));
-}
-
-// Returns false if bundle is enabled and rtcp_mux is disabled.
-bool WebRtcSession::ValidateBundleSettings(const SessionDescription* desc) {
-  bool bundle_enabled = desc->HasGroup(cricket::GROUP_TYPE_BUNDLE);
-  if (!bundle_enabled)
-    return true;
-
-  const cricket::ContentGroup* bundle_group =
-      desc->GetGroupByName(cricket::GROUP_TYPE_BUNDLE);
-  RTC_DCHECK(bundle_group != NULL);
-
-  const cricket::ContentInfos& contents = desc->contents();
-  for (cricket::ContentInfos::const_iterator citer = contents.begin();
-       citer != contents.end(); ++citer) {
-    const cricket::ContentInfo* content = (&*citer);
-    RTC_DCHECK(content != NULL);
-    if (bundle_group->HasContentName(content->name) &&
-        !content->rejected && content->type == cricket::NS_JINGLE_RTP) {
-      if (!HasRtcpMuxEnabled(content))
-        return false;
-    }
-  }
-  // RTCP-MUX is enabled in all the contents.
-  return true;
-}
-
-bool WebRtcSession::HasRtcpMuxEnabled(
-    const cricket::ContentInfo* content) {
-  const cricket::MediaContentDescription* description =
-      static_cast<cricket::MediaContentDescription*>(content->description);
-  return description->rtcp_mux();
-}
-
-bool WebRtcSession::ValidateSessionDescription(
-    const SessionDescriptionInterface* sdesc,
-    cricket::ContentSource source, std::string* err_desc) {
-  std::string type;
-  if (error() != ERROR_NONE) {
-    return BadSdp(source, type, GetSessionErrorMsg(), err_desc);
-  }
-
-  if (!sdesc || !sdesc->description()) {
-    return BadSdp(source, type, kInvalidSdp, err_desc);
-  }
-
-  type = sdesc->type();
-  Action action = GetAction(sdesc->type());
-  if (source == cricket::CS_LOCAL) {
-    if (!ExpectSetLocalDescription(action))
-      return BadLocalSdp(type, BadStateErrMsg(state()), err_desc);
-  } else {
-    if (!ExpectSetRemoteDescription(action))
-      return BadRemoteSdp(type, BadStateErrMsg(state()), err_desc);
-  }
-
-  // Verify crypto settings.
-  std::string crypto_error;
-  if ((webrtc_session_desc_factory_->SdesPolicy() == cricket::SEC_REQUIRED ||
-       dtls_enabled_) &&
-      !VerifyCrypto(sdesc->description(), dtls_enabled_, &crypto_error)) {
-    return BadSdp(source, type, crypto_error, err_desc);
-  }
-
-  // Verify ice-ufrag and ice-pwd.
-  if (!VerifyIceUfragPwdPresent(sdesc->description())) {
-    return BadSdp(source, type, kSdpWithoutIceUfragPwd, err_desc);
-  }
-
-  if (!ValidateBundleSettings(sdesc->description())) {
-    return BadSdp(source, type, kBundleWithoutRtcpMux, err_desc);
-  }
-
-  // TODO(skvlad): When the local rtcp-mux policy is Require, reject any
-  // m-lines that do not rtcp-mux enabled.
-
-  // Verify m-lines in Answer when compared against Offer.
-  if (action == kAnswer || action == kPrAnswer) {
-    const cricket::SessionDescription* offer_desc =
-        (source == cricket::CS_LOCAL) ? remote_description()->description()
-                                      : local_description()->description();
-    if (!MediaSectionsHaveSameCount(sdesc->description(), offer_desc) ||
-        !MediaSectionsInSameOrder(sdesc->description(), offer_desc)) {
-      return BadAnswerSdp(source, kMlineMismatchInAnswer, err_desc);
-    }
-  } else {
-    // The re-offers should respect the order of m= sections in current local
-    // description. See RFC3264 Section 8 paragraph 4 for more details.
-    if (local_description() &&
-        !MediaSectionsInSameOrder(sdesc->description(),
-                                  local_description()->description())) {
-      return BadOfferSdp(source, kMlineMismatchInSubsequentOffer, err_desc);
-    }
-  }
-
-  return true;
-}
-
-bool WebRtcSession::ExpectSetLocalDescription(Action action) {
-  return ((action == kOffer && state() == STATE_INIT) ||
-          // update local offer
-          (action == kOffer && state() == STATE_SENTOFFER) ||
-          // update the current ongoing session.
-          (action == kOffer && state() == STATE_INPROGRESS) ||
-          // accept remote offer
-          (action == kAnswer && state() == STATE_RECEIVEDOFFER) ||
-          (action == kAnswer && state() == STATE_SENTPRANSWER) ||
-          (action == kPrAnswer && state() == STATE_RECEIVEDOFFER) ||
-          (action == kPrAnswer && state() == STATE_SENTPRANSWER));
-}
-
-bool WebRtcSession::ExpectSetRemoteDescription(Action action) {
-  return ((action == kOffer && state() == STATE_INIT) ||
-          // update remote offer
-          (action == kOffer && state() == STATE_RECEIVEDOFFER) ||
-          // update the current ongoing session
-          (action == kOffer && state() == STATE_INPROGRESS) ||
-          // accept local offer
-          (action == kAnswer && state() == STATE_SENTOFFER) ||
-          (action == kAnswer && state() == STATE_RECEIVEDPRANSWER) ||
-          (action == kPrAnswer && state() == STATE_SENTOFFER) ||
-          (action == kPrAnswer && state() == STATE_RECEIVEDPRANSWER));
-}
-
-std::string WebRtcSession::GetSessionErrorMsg() {
-  std::ostringstream desc;
-  desc << kSessionError << GetErrorCodeString(error()) << ". ";
-  desc << kSessionErrorDesc << error_desc() << ".";
-  return desc.str();
-}
-
-// We need to check the local/remote description for the Transport instead of
-// the session, because a new Transport added during renegotiation may have
-// them unset while the session has them set from the previous negotiation.
-// Not doing so may trigger the auto generation of transport description and
-// mess up DTLS identity information, ICE credential, etc.
-bool WebRtcSession::ReadyToUseRemoteCandidate(
-    const IceCandidateInterface* candidate,
-    const SessionDescriptionInterface* remote_desc,
-    bool* valid) {
-  *valid = true;
-
-  const SessionDescriptionInterface* current_remote_desc =
-      remote_desc ? remote_desc : remote_description();
-
-  if (!current_remote_desc) {
-    return false;
-  }
-
-  size_t mediacontent_index =
-      static_cast<size_t>(candidate->sdp_mline_index());
-  size_t remote_content_size =
-      current_remote_desc->description()->contents().size();
-  if (mediacontent_index >= remote_content_size) {
-    LOG(LS_ERROR) << "ReadyToUseRemoteCandidate: Invalid candidate media index "
-                  << mediacontent_index;
-
-    *valid = false;
-    return false;
-  }
-
-  cricket::ContentInfo content =
-      current_remote_desc->description()->contents()[mediacontent_index];
-
-  const std::string transport_name = GetTransportName(content.name);
-  if (transport_name.empty()) {
-    return false;
-  }
-  return transport_controller_->ReadyForRemoteCandidates(transport_name);
-}
-
-bool WebRtcSession::SrtpRequired() const {
-  return dtls_enabled_ ||
-         webrtc_session_desc_factory_->SdesPolicy() == cricket::SEC_REQUIRED;
-}
-
-void WebRtcSession::OnTransportControllerGatheringState(
-    cricket::IceGatheringState state) {
-  RTC_DCHECK(signaling_thread()->IsCurrent());
-  if (state == cricket::kIceGatheringGathering) {
-    if (ice_observer_) {
-      ice_observer_->OnIceGatheringChange(
-          PeerConnectionInterface::kIceGatheringGathering);
-    }
-  } else if (state == cricket::kIceGatheringComplete) {
-    if (ice_observer_) {
-      ice_observer_->OnIceGatheringChange(
-          PeerConnectionInterface::kIceGatheringComplete);
-    }
-  }
-}
-
-void WebRtcSession::ReportTransportStats() {
-  // Use a set so we don't report the same stats twice if two channels share
-  // a transport.
-  std::set<std::string> transport_names;
-  if (voice_channel()) {
-    transport_names.insert(voice_channel()->transport_name());
-  }
-  if (video_channel()) {
-    transport_names.insert(video_channel()->transport_name());
-  }
-  if (rtp_data_channel()) {
-    transport_names.insert(rtp_data_channel()->transport_name());
-  }
-  if (sctp_transport_name_) {
-    transport_names.insert(*sctp_transport_name_);
-  }
-  for (const auto& name : transport_names) {
-    cricket::TransportStats stats;
-    if (transport_controller_->GetStats(name, &stats)) {
-      ReportBestConnectionState(stats);
-      ReportNegotiatedCiphers(stats);
-    }
-  }
-}
-// Walk through the ConnectionInfos to gather best connection usage
-// for IPv4 and IPv6.
-void WebRtcSession::ReportBestConnectionState(
-    const cricket::TransportStats& stats) {
-  RTC_DCHECK(metrics_observer_ != NULL);
-  for (cricket::TransportChannelStatsList::const_iterator it =
-         stats.channel_stats.begin();
-       it != stats.channel_stats.end(); ++it) {
-    for (cricket::ConnectionInfos::const_iterator it_info =
-           it->connection_infos.begin();
-         it_info != it->connection_infos.end(); ++it_info) {
-      if (!it_info->best_connection) {
-        continue;
-      }
-
-      PeerConnectionEnumCounterType type = kPeerConnectionEnumCounterMax;
-      const cricket::Candidate& local = it_info->local_candidate;
-      const cricket::Candidate& remote = it_info->remote_candidate;
-
-      // Increment the counter for IceCandidatePairType.
-      if (local.protocol() == cricket::TCP_PROTOCOL_NAME ||
-          (local.type() == RELAY_PORT_TYPE &&
-           local.relay_protocol() == cricket::TCP_PROTOCOL_NAME)) {
-        type = kEnumCounterIceCandidatePairTypeTcp;
-      } else if (local.protocol() == cricket::UDP_PROTOCOL_NAME) {
-        type = kEnumCounterIceCandidatePairTypeUdp;
-      } else {
-        RTC_CHECK(0);
-      }
-      metrics_observer_->IncrementEnumCounter(
-          type, GetIceCandidatePairCounter(local, remote),
-          kIceCandidatePairMax);
-
-      // Increment the counter for IP type.
-      if (local.address().family() == AF_INET) {
-        metrics_observer_->IncrementEnumCounter(
-            kEnumCounterAddressFamily, kBestConnections_IPv4,
-            kPeerConnectionAddressFamilyCounter_Max);
-
-      } else if (local.address().family() == AF_INET6) {
-        metrics_observer_->IncrementEnumCounter(
-            kEnumCounterAddressFamily, kBestConnections_IPv6,
-            kPeerConnectionAddressFamilyCounter_Max);
-      } else {
-        RTC_CHECK(0);
-      }
-
-      return;
-    }
-  }
-}
-
-void WebRtcSession::ReportNegotiatedCiphers(
-    const cricket::TransportStats& stats) {
-  RTC_DCHECK(metrics_observer_ != NULL);
-  if (!dtls_enabled_ || stats.channel_stats.empty()) {
-    return;
-  }
-
-  int srtp_crypto_suite = stats.channel_stats[0].srtp_crypto_suite;
-  int ssl_cipher_suite = stats.channel_stats[0].ssl_cipher_suite;
-  if (srtp_crypto_suite == rtc::SRTP_INVALID_CRYPTO_SUITE &&
-      ssl_cipher_suite == rtc::TLS_NULL_WITH_NULL_NULL) {
-    return;
-  }
-
-  PeerConnectionEnumCounterType srtp_counter_type;
-  PeerConnectionEnumCounterType ssl_counter_type;
-  if (stats.transport_name == cricket::CN_AUDIO) {
-    srtp_counter_type = kEnumCounterAudioSrtpCipher;
-    ssl_counter_type = kEnumCounterAudioSslCipher;
-  } else if (stats.transport_name == cricket::CN_VIDEO) {
-    srtp_counter_type = kEnumCounterVideoSrtpCipher;
-    ssl_counter_type = kEnumCounterVideoSslCipher;
-  } else if (stats.transport_name == cricket::CN_DATA) {
-    srtp_counter_type = kEnumCounterDataSrtpCipher;
-    ssl_counter_type = kEnumCounterDataSslCipher;
-  } else {
-    RTC_NOTREACHED();
-    return;
-  }
-
-  if (srtp_crypto_suite != rtc::SRTP_INVALID_CRYPTO_SUITE) {
-    metrics_observer_->IncrementSparseEnumCounter(srtp_counter_type,
-                                                  srtp_crypto_suite);
-  }
-  if (ssl_cipher_suite != rtc::TLS_NULL_WITH_NULL_NULL) {
-    metrics_observer_->IncrementSparseEnumCounter(ssl_counter_type,
-                                                  ssl_cipher_suite);
-  }
-}
-
-void WebRtcSession::OnSentPacket_w(const rtc::SentPacket& sent_packet) {
-  RTC_DCHECK(worker_thread()->IsCurrent());
-  RTC_DCHECK(call_);
-  call_->OnSentPacket(sent_packet);
-}
-
-const std::string WebRtcSession::GetTransportName(
-    const std::string& content_name) {
-  cricket::BaseChannel* channel = GetChannel(content_name);
-  if (!channel) {
-#ifdef HAVE_QUIC
-    if (data_channel_type_ == cricket::DCT_QUIC && quic_data_transport_ &&
-        content_name == quic_data_transport_->transport_name()) {
-      return quic_data_transport_->transport_name();
-    }
-#endif
-    if (sctp_transport_) {
-      RTC_DCHECK(sctp_content_name_);
-      RTC_DCHECK(sctp_transport_name_);
-      if (content_name == *sctp_content_name_) {
-        return *sctp_transport_name_;
-      }
-    }
-    // Return an empty string if failed to retrieve the transport name.
-    return "";
-  }
-  return channel->transport_name();
-}
-
-void WebRtcSession::DestroyRtcpTransport_n(const std::string& transport_name) {
-  RTC_DCHECK(network_thread()->IsCurrent());
-  transport_controller_->DestroyDtlsTransport_n(
-      transport_name, cricket::ICE_CANDIDATE_COMPONENT_RTCP);
-}
-
-void WebRtcSession::RemoveAndDestroyVideoChannel(
-    cricket::VideoChannel* video_channel) {
-  auto it =
-      std::find(video_channels_.begin(), video_channels_.end(), video_channel);
-  RTC_DCHECK(it != video_channels_.end());
-  if (it == video_channels_.end()) {
-    return;
-  }
-  video_channels_.erase(it);
-  DestroyVideoChannel(video_channel);
-}
-
-void WebRtcSession::DestroyVideoChannel(cricket::VideoChannel* video_channel) {
-  // TODO(steveanton): This should take an identifier for the video channel
-  // since we now support more than one.
-  SignalVideoChannelDestroyed();
-  RTC_DCHECK(video_channel->rtp_dtls_transport());
-  const std::string transport_name =
-      video_channel->rtp_dtls_transport()->transport_name();
-  const bool need_to_delete_rtcp =
-      (video_channel->rtcp_dtls_transport() != nullptr);
-  // The above need to be cached before destroying the video channel so that we
-  // do not access uninitialized memory.
-  channel_manager_->DestroyVideoChannel(video_channel);
-  transport_controller_->DestroyDtlsTransport(
-      transport_name, cricket::ICE_CANDIDATE_COMPONENT_RTP);
-  if (need_to_delete_rtcp) {
-    transport_controller_->DestroyDtlsTransport(
-        transport_name, cricket::ICE_CANDIDATE_COMPONENT_RTCP);
-  }
-}
-
-void WebRtcSession::RemoveAndDestroyVoiceChannel(
-    cricket::VoiceChannel* voice_channel) {
-  auto it =
-      std::find(voice_channels_.begin(), voice_channels_.end(), voice_channel);
-  RTC_DCHECK(it != voice_channels_.end());
-  if (it == voice_channels_.end()) {
-    return;
-  }
-  voice_channels_.erase(it);
-  DestroyVoiceChannel(voice_channel);
-}
-
-void WebRtcSession::DestroyVoiceChannel(cricket::VoiceChannel* voice_channel) {
-  // TODO(steveanton): This should take an identifier for the voice channel
-  // since we now support more than one.
-  SignalVoiceChannelDestroyed();
-  RTC_DCHECK(voice_channel->rtp_dtls_transport());
-  const std::string transport_name =
-      voice_channel->rtp_dtls_transport()->transport_name();
-  const bool need_to_delete_rtcp =
-      (voice_channel->rtcp_dtls_transport() != nullptr);
-  // The above need to be cached before destroying the video channel so that we
-  // do not access uninitialized memory.
-  channel_manager_->DestroyVoiceChannel(voice_channel);
-  transport_controller_->DestroyDtlsTransport(
-      transport_name, cricket::ICE_CANDIDATE_COMPONENT_RTP);
-  if (need_to_delete_rtcp) {
-    transport_controller_->DestroyDtlsTransport(
-        transport_name, cricket::ICE_CANDIDATE_COMPONENT_RTCP);
-  }
-}
-
-void WebRtcSession::DestroyDataChannel() {
-  SignalDataChannelDestroyed();
-  RTC_DCHECK(rtp_data_channel_->rtp_dtls_transport());
-  std::string transport_name;
-  transport_name = rtp_data_channel_->rtp_dtls_transport()->transport_name();
-  bool need_to_delete_rtcp =
-      (rtp_data_channel_->rtcp_dtls_transport() != nullptr);
-  channel_manager_->DestroyRtpDataChannel(rtp_data_channel_.release());
-  transport_controller_->DestroyDtlsTransport(
-      transport_name, cricket::ICE_CANDIDATE_COMPONENT_RTP);
-  if (need_to_delete_rtcp) {
-    transport_controller_->DestroyDtlsTransport(
-        transport_name, cricket::ICE_CANDIDATE_COMPONENT_RTCP);
-  }
-}
-}  // namespace webrtc
diff --git a/pc/webrtcsession.h b/pc/webrtcsession.h
deleted file mode 100644
index 8be828f..0000000
--- a/pc/webrtcsession.h
+++ /dev/null
@@ -1,680 +0,0 @@
-/*
- *  Copyright 2012 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_PC_WEBRTCSESSION_H_
-#define WEBRTC_PC_WEBRTCSESSION_H_
-
-#include <memory>
-#include <set>
-#include <string>
-#include <vector>
-
-#include "webrtc/api/optional.h"
-#include "webrtc/api/peerconnectioninterface.h"
-#include "webrtc/api/statstypes.h"
-#include "webrtc/call/call.h"
-#include "webrtc/p2p/base/candidate.h"
-#include "webrtc/p2p/base/transportcontroller.h"
-#include "webrtc/pc/datachannel.h"
-#include "webrtc/pc/mediasession.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/sigslot.h"
-#include "webrtc/rtc_base/sslidentity.h"
-#include "webrtc/rtc_base/thread.h"
-
-#ifdef HAVE_QUIC
-#include "webrtc/pc/quicdatatransport.h"
-#endif  // HAVE_QUIC
-
-namespace cricket {
-
-class ChannelManager;
-class RtpDataChannel;
-class SctpTransportInternal;
-class SctpTransportInternalFactory;
-class StatsReport;
-class VideoChannel;
-class VoiceChannel;
-
-#ifdef HAVE_QUIC
-class QuicTransportChannel;
-#endif  // HAVE_QUIC
-
-}  // namespace cricket
-
-namespace webrtc {
-
-class IceRestartAnswerLatch;
-class JsepIceCandidate;
-class MediaStreamSignaling;
-class RtcEventLog;
-class WebRtcSessionDescriptionFactory;
-
-extern const char kBundleWithoutRtcpMux[];
-extern const char kCreateChannelFailed[];
-extern const char kInvalidCandidates[];
-extern const char kInvalidSdp[];
-extern const char kMlineMismatchInAnswer[];
-extern const char kMlineMismatchInSubsequentOffer[];
-extern const char kPushDownTDFailed[];
-extern const char kSdpWithoutDtlsFingerprint[];
-extern const char kSdpWithoutSdesCrypto[];
-extern const char kSdpWithoutIceUfragPwd[];
-extern const char kSdpWithoutSdesAndDtlsDisabled[];
-extern const char kSessionError[];
-extern const char kSessionErrorDesc[];
-extern const char kDtlsSrtpSetupFailureRtp[];
-extern const char kDtlsSrtpSetupFailureRtcp[];
-extern const char kEnableBundleFailed[];
-
-// Maximum number of received video streams that will be processed by webrtc
-// even if they are not signalled beforehand.
-extern const int kMaxUnsignalledRecvStreams;
-
-// ICE state callback interface.
-class IceObserver {
- public:
-  IceObserver() {}
-  // Called any time the IceConnectionState changes
-  virtual void OnIceConnectionStateChange(
-      PeerConnectionInterface::IceConnectionState new_state) {}
-  // Called any time the IceGatheringState changes
-  virtual void OnIceGatheringChange(
-      PeerConnectionInterface::IceGatheringState new_state) {}
-  // New Ice candidate have been found.
-  virtual void OnIceCandidate(
-      std::unique_ptr<IceCandidateInterface> candidate) = 0;
-
-  // Some local ICE candidates have been removed.
-  virtual void OnIceCandidatesRemoved(
-      const std::vector<cricket::Candidate>& candidates) = 0;
-
-  // Called whenever the state changes between receiving and not receiving.
-  virtual void OnIceConnectionReceivingChange(bool receiving) {}
-
- protected:
-  ~IceObserver() {}
-
- private:
-  RTC_DISALLOW_COPY_AND_ASSIGN(IceObserver);
-};
-
-// Statistics for all the transports of the session.
-typedef std::map<std::string, cricket::TransportStats> TransportStatsMap;
-typedef std::map<std::string, std::string> ProxyTransportMap;
-
-// TODO(pthatcher): Think of a better name for this.  We already have
-// a TransportStats in transport.h.  Perhaps TransportsStats?
-struct SessionStats {
-  ProxyTransportMap proxy_to_transport;
-  TransportStatsMap transport_stats;
-};
-
-struct ChannelNamePair {
-  ChannelNamePair(
-      const std::string& content_name, const std::string& transport_name)
-      : content_name(content_name), transport_name(transport_name) {}
-  std::string content_name;
-  std::string transport_name;
-};
-
-struct ChannelNamePairs {
-  rtc::Optional<ChannelNamePair> voice;
-  rtc::Optional<ChannelNamePair> video;
-  rtc::Optional<ChannelNamePair> data;
-};
-
-// A WebRtcSession manages general session state. This includes negotiation
-// of both the application-level and network-level protocols:  the former
-// defines what will be sent and the latter defines how it will be sent.  Each
-// network-level protocol is represented by a Transport object.  Each Transport
-// participates in the network-level negotiation.  The individual streams of
-// packets are represented by TransportChannels.  The application-level protocol
-// is represented by SessionDecription objects.
-class WebRtcSession :
-    public DataChannelProviderInterface,
-    public sigslot::has_slots<> {
- public:
-  enum State {
-    STATE_INIT = 0,
-    STATE_SENTOFFER,         // Sent offer, waiting for answer.
-    STATE_RECEIVEDOFFER,     // Received an offer. Need to send answer.
-    STATE_SENTPRANSWER,      // Sent provisional answer. Need to send answer.
-    STATE_RECEIVEDPRANSWER,  // Received provisional answer, waiting for answer.
-    STATE_INPROGRESS,        // Offer/answer exchange completed.
-    STATE_CLOSED,            // Close() was called.
-  };
-
-  enum Error {
-    ERROR_NONE = 0,       // no error
-    ERROR_CONTENT = 1,    // channel errors in SetLocalContent/SetRemoteContent
-    ERROR_TRANSPORT = 2,  // transport error of some kind
-  };
-
-  // |sctp_factory| may be null, in which case SCTP is treated as unsupported.
-  WebRtcSession(
-      Call* call,
-      cricket::ChannelManager* channel_manager,
-      const cricket::MediaConfig& media_config,
-      RtcEventLog* event_log,
-      rtc::Thread* network_thread,
-      rtc::Thread* worker_thread,
-      rtc::Thread* signaling_thread,
-      cricket::PortAllocator* port_allocator,
-      std::unique_ptr<cricket::TransportController> transport_controller,
-      std::unique_ptr<cricket::SctpTransportInternalFactory> sctp_factory);
-  virtual ~WebRtcSession();
-
-  // These are const to allow them to be called from const methods.
-  rtc::Thread* network_thread() const { return network_thread_; }
-  rtc::Thread* worker_thread() const { return worker_thread_; }
-  rtc::Thread* signaling_thread() const { return signaling_thread_; }
-
-  // The ID of this session.
-  const std::string& id() const { return sid_; }
-
-  bool Initialize(
-      const PeerConnectionFactoryInterface::Options& options,
-      std::unique_ptr<rtc::RTCCertificateGeneratorInterface> cert_generator,
-      const PeerConnectionInterface::RTCConfiguration& rtc_configuration);
-  // Deletes the voice, video and data channel and changes the session state
-  // to STATE_CLOSED.
-  void Close();
-
-  // Returns true if we were the initial offerer.
-  bool initial_offerer() const { return initial_offerer_; }
-
-  // Returns the current state of the session. See the enum above for details.
-  // Each time the state changes, we will fire this signal.
-  State state() const { return state_; }
-  sigslot::signal2<WebRtcSession*, State> SignalState;
-
-  // Returns the last error in the session. See the enum above for details.
-  Error error() const { return error_; }
-  const std::string& error_desc() const { return error_desc_; }
-
-  void RegisterIceObserver(IceObserver* observer) {
-    ice_observer_ = observer;
-  }
-
-  // Exposed for stats collecting.
-  // TODO(steveanton): Switch callers to use the plural form and remove these.
-  virtual cricket::VoiceChannel* voice_channel() {
-    if (voice_channels_.empty()) {
-      return nullptr;
-    } else {
-      return voice_channels_[0];
-    }
-  }
-  virtual cricket::VideoChannel* video_channel() {
-    if (video_channels_.empty()) {
-      return nullptr;
-    } else {
-      return video_channels_[0];
-    }
-  }
-
-  virtual std::vector<cricket::VoiceChannel*> voice_channels() const {
-    return voice_channels_;
-  }
-  virtual std::vector<cricket::VideoChannel*> video_channels() const {
-    return video_channels_;
-  }
-
-  // Only valid when using deprecated RTP data channels.
-  virtual cricket::RtpDataChannel* rtp_data_channel() {
-    return rtp_data_channel_.get();
-  }
-  virtual rtc::Optional<std::string> sctp_content_name() const {
-    return sctp_content_name_;
-  }
-  virtual rtc::Optional<std::string> sctp_transport_name() const {
-    return sctp_transport_name_;
-  }
-
-  cricket::BaseChannel* GetChannel(const std::string& content_name);
-
-  cricket::SecurePolicy SdesPolicy() const;
-
-  // Get current SSL role used by SCTP's underlying transport.
-  bool GetSctpSslRole(rtc::SSLRole* role);
-  // Get SSL role for an arbitrary m= section (handles bundling correctly).
-  // TODO(deadbeef): This is only used internally by the session description
-  // factory, it shouldn't really be public).
-  bool GetSslRole(const std::string& content_name, rtc::SSLRole* role);
-
-  void CreateOffer(
-      CreateSessionDescriptionObserver* observer,
-      const PeerConnectionInterface::RTCOfferAnswerOptions& options,
-      const cricket::MediaSessionOptions& session_options);
-  void CreateAnswer(CreateSessionDescriptionObserver* observer,
-                    const cricket::MediaSessionOptions& session_options);
-  // The ownership of |desc| will be transferred after this call.
-  bool SetLocalDescription(SessionDescriptionInterface* desc,
-                           std::string* err_desc);
-  // The ownership of |desc| will be transferred after this call.
-  bool SetRemoteDescription(SessionDescriptionInterface* desc,
-                            std::string* err_desc);
-
-  bool ProcessIceMessage(const IceCandidateInterface* ice_candidate);
-
-  bool RemoveRemoteIceCandidates(
-      const std::vector<cricket::Candidate>& candidates);
-
-  cricket::IceConfig ParseIceConfig(
-      const PeerConnectionInterface::RTCConfiguration& config) const;
-
-  void SetIceConfig(const cricket::IceConfig& ice_config);
-
-  // Start gathering candidates for any new transports, or transports doing an
-  // ICE restart.
-  void MaybeStartGathering();
-
-  const SessionDescriptionInterface* local_description() const {
-    return pending_local_description_ ? pending_local_description_.get()
-                                      : current_local_description_.get();
-  }
-  const SessionDescriptionInterface* remote_description() const {
-    return pending_remote_description_ ? pending_remote_description_.get()
-                                       : current_remote_description_.get();
-  }
-  const SessionDescriptionInterface* current_local_description() const {
-    return current_local_description_.get();
-  }
-  const SessionDescriptionInterface* current_remote_description() const {
-    return current_remote_description_.get();
-  }
-  const SessionDescriptionInterface* pending_local_description() const {
-    return pending_local_description_.get();
-  }
-  const SessionDescriptionInterface* pending_remote_description() const {
-    return pending_remote_description_.get();
-  }
-
-  // Get the id used as a media stream track's "id" field from ssrc.
-  virtual bool GetLocalTrackIdBySsrc(uint32_t ssrc, std::string* track_id);
-  virtual bool GetRemoteTrackIdBySsrc(uint32_t ssrc, std::string* track_id);
-
-  // Implements DataChannelProviderInterface.
-  bool SendData(const cricket::SendDataParams& params,
-                const rtc::CopyOnWriteBuffer& payload,
-                cricket::SendDataResult* result) override;
-  bool ConnectDataChannel(DataChannel* webrtc_data_channel) override;
-  void DisconnectDataChannel(DataChannel* webrtc_data_channel) override;
-  void AddSctpDataStream(int sid) override;
-  void RemoveSctpDataStream(int sid) override;
-  bool ReadyToSendData() const override;
-
-  virtual Call::Stats GetCallStats();
-
-  // Returns stats for all channels of all transports.
-  // This avoids exposing the internal structures used to track them.
-  // The parameterless version creates |ChannelNamePairs| from |voice_channel|,
-  // |video_channel| and |voice_channel| if available - this requires it to be
-  // called on the signaling thread - and invokes the other |GetStats|. The
-  // other |GetStats| can be invoked on any thread; if not invoked on the
-  // network thread a thread hop will happen.
-  std::unique_ptr<SessionStats> GetStats_s();
-  virtual std::unique_ptr<SessionStats> GetStats(
-      const ChannelNamePairs& channel_name_pairs);
-
-  // virtual so it can be mocked in unit tests
-  virtual bool GetLocalCertificate(
-      const std::string& transport_name,
-      rtc::scoped_refptr<rtc::RTCCertificate>* certificate);
-
-  // Caller owns returned certificate
-  virtual std::unique_ptr<rtc::SSLCertificate> GetRemoteSSLCertificate(
-      const std::string& transport_name);
-
-  cricket::DataChannelType data_channel_type() const;
-
-  // Returns true if there was an ICE restart initiated by the remote offer.
-  bool IceRestartPending(const std::string& content_name) const;
-
-  // Set the "needs-ice-restart" flag as described in JSEP. After the flag is
-  // set, offers should generate new ufrags/passwords until an ICE restart
-  // occurs.
-  void SetNeedsIceRestartFlag();
-  // Returns true if the ICE restart flag above was set, and no ICE restart has
-  // occurred yet for this transport (by applying a local description with
-  // changed ufrag/password). If the transport has been deleted as a result of
-  // bundling, returns false.
-  bool NeedsIceRestart(const std::string& content_name) const;
-
-  // Called when an RTCCertificate is generated or retrieved by
-  // WebRTCSessionDescriptionFactory. Should happen before setLocalDescription.
-  void OnCertificateReady(
-      const rtc::scoped_refptr<rtc::RTCCertificate>& certificate);
-  void OnDtlsSrtpSetupFailure(cricket::BaseChannel*, bool rtcp);
-
-  // For unit test.
-  bool waiting_for_certificate_for_testing() const;
-  const rtc::scoped_refptr<rtc::RTCCertificate>& certificate_for_testing();
-
-  void set_metrics_observer(
-      webrtc::MetricsObserverInterface* metrics_observer) {
-    metrics_observer_ = metrics_observer;
-    transport_controller_->SetMetricsObserver(metrics_observer);
-  }
-
-  // Called when voice_channel_, video_channel_ and
-  // rtp_data_channel_/sctp_transport_ are created and destroyed. As a result
-  // of, for example, setting a new description.
-  sigslot::signal0<> SignalVoiceChannelCreated;
-  sigslot::signal0<> SignalVoiceChannelDestroyed;
-  sigslot::signal0<> SignalVideoChannelCreated;
-  sigslot::signal0<> SignalVideoChannelDestroyed;
-  sigslot::signal0<> SignalDataChannelCreated;
-  sigslot::signal0<> SignalDataChannelDestroyed;
-
-  // Called when a valid data channel OPEN message is received.
-  // std::string represents the data channel label.
-  sigslot::signal2<const std::string&, const InternalDataChannelInit&>
-      SignalDataChannelOpenMessage;
-#ifdef HAVE_QUIC
-  QuicDataTransport* quic_data_transport() {
-    return quic_data_transport_.get();
-  }
-#endif  // HAVE_QUIC
-
- private:
-  // Indicates the type of SessionDescription in a call to SetLocalDescription
-  // and SetRemoteDescription.
-  enum Action {
-    kOffer,
-    kPrAnswer,
-    kAnswer,
-  };
-
-  // Return all managed, non-null channels.
-  std::vector<cricket::BaseChannel*> Channels() const;
-
-  // Non-const versions of local_description()/remote_description(), for use
-  // internally.
-  SessionDescriptionInterface* mutable_local_description() {
-    return pending_local_description_ ? pending_local_description_.get()
-                                      : current_local_description_.get();
-  }
-  SessionDescriptionInterface* mutable_remote_description() {
-    return pending_remote_description_ ? pending_remote_description_.get()
-                                       : current_remote_description_.get();
-  }
-
-  // Log session state.
-  void LogState(State old_state, State new_state);
-
-  // Updates the state, signaling if necessary.
-  virtual void SetState(State state);
-
-  // Updates the error state, signaling if necessary.
-  // TODO(ronghuawu): remove the SetError method that doesn't take |error_desc|.
-  virtual void SetError(Error error, const std::string& error_desc);
-
-  bool UpdateSessionState(Action action, cricket::ContentSource source,
-                          std::string* err_desc);
-  static Action GetAction(const std::string& type);
-  // Push the media parts of the local or remote session description
-  // down to all of the channels.
-  bool PushdownMediaDescription(cricket::ContentAction action,
-                                cricket::ContentSource source,
-                                std::string* error_desc);
-  bool PushdownSctpParameters_n(cricket::ContentSource source);
-
-  bool PushdownTransportDescription(cricket::ContentSource source,
-                                    cricket::ContentAction action,
-                                    std::string* error_desc);
-
-  // Helper methods to push local and remote transport descriptions.
-  bool PushdownLocalTransportDescription(
-      const cricket::SessionDescription* sdesc,
-      cricket::ContentAction action,
-      std::string* error_desc);
-  bool PushdownRemoteTransportDescription(
-      const cricket::SessionDescription* sdesc,
-      cricket::ContentAction action,
-      std::string* error_desc);
-
-  // Returns true and the TransportInfo of the given |content_name|
-  // from |description|. Returns false if it's not available.
-  static bool GetTransportDescription(
-      const cricket::SessionDescription* description,
-      const std::string& content_name,
-      cricket::TransportDescription* info);
-
-  // Returns the name of the transport channel when BUNDLE is enabled, or
-  // nullptr if the channel is not part of any bundle.
-  const std::string* GetBundleTransportName(
-      const cricket::ContentInfo* content,
-      const cricket::ContentGroup* bundle);
-
-  // Cause all the BaseChannels in the bundle group to have the same
-  // transport channel.
-  bool EnableBundle(const cricket::ContentGroup& bundle);
-
-  // Enables media channels to allow sending of media.
-  void EnableChannels();
-  // Returns the media index for a local ice candidate given the content name.
-  // Returns false if the local session description does not have a media
-  // content called  |content_name|.
-  bool GetLocalCandidateMediaIndex(const std::string& content_name,
-                                   int* sdp_mline_index);
-  // Uses all remote candidates in |remote_desc| in this session.
-  bool UseCandidatesInSessionDescription(
-      const SessionDescriptionInterface* remote_desc);
-  // Uses |candidate| in this session.
-  bool UseCandidate(const IceCandidateInterface* candidate);
-  // Deletes the corresponding channel of contents that don't exist in |desc|.
-  // |desc| can be null. This means that all channels are deleted.
-  void RemoveUnusedChannels(const cricket::SessionDescription* desc);
-
-  // Allocates media channels based on the |desc|. If |desc| doesn't have
-  // the BUNDLE option, this method will disable BUNDLE in PortAllocator.
-  // This method will also delete any existing media channels before creating.
-  bool CreateChannels(const cricket::SessionDescription* desc);
-
-  // Helper methods to create media channels.
-  bool CreateVoiceChannel(const cricket::ContentInfo* content,
-                          const std::string* bundle_transport);
-  bool CreateVideoChannel(const cricket::ContentInfo* content,
-                          const std::string* bundle_transport);
-  bool CreateDataChannel(const cricket::ContentInfo* content,
-                         const std::string* bundle_transport);
-
-  std::unique_ptr<SessionStats> GetStats_n(
-      const ChannelNamePairs& channel_name_pairs);
-
-  bool CreateSctpTransport_n(const std::string& content_name,
-                             const std::string& transport_name);
-  // For bundling.
-  void ChangeSctpTransport_n(const std::string& transport_name);
-  void DestroySctpTransport_n();
-  // SctpTransport signal handlers. Needed to marshal signals from the network
-  // to signaling thread.
-  void OnSctpTransportReadyToSendData_n();
-  // This may be called with "false" if the direction of the m= section causes
-  // us to tear down the SCTP connection.
-  void OnSctpTransportReadyToSendData_s(bool ready);
-  void OnSctpTransportDataReceived_n(const cricket::ReceiveDataParams& params,
-                                     const rtc::CopyOnWriteBuffer& payload);
-  // Beyond just firing the signal to the signaling thread, listens to SCTP
-  // CONTROL messages on unused SIDs and processes them as OPEN messages.
-  void OnSctpTransportDataReceived_s(const cricket::ReceiveDataParams& params,
-                                     const rtc::CopyOnWriteBuffer& payload);
-  void OnSctpStreamClosedRemotely_n(int sid);
-
-  std::string BadStateErrMsg(State state);
-  void SetIceConnectionState(PeerConnectionInterface::IceConnectionState state);
-  void SetIceConnectionReceiving(bool receiving);
-
-  bool ValidateBundleSettings(const cricket::SessionDescription* desc);
-  bool HasRtcpMuxEnabled(const cricket::ContentInfo* content);
-  // Below methods are helper methods which verifies SDP.
-  bool ValidateSessionDescription(const SessionDescriptionInterface* sdesc,
-                                  cricket::ContentSource source,
-                                  std::string* err_desc);
-
-  // Check if a call to SetLocalDescription is acceptable with |action|.
-  bool ExpectSetLocalDescription(Action action);
-  // Check if a call to SetRemoteDescription is acceptable with |action|.
-  bool ExpectSetRemoteDescription(Action action);
-  // Verifies a=setup attribute as per RFC 5763.
-  bool ValidateDtlsSetupAttribute(const cricket::SessionDescription* desc,
-                                  Action action);
-
-  // Returns true if we are ready to push down the remote candidate.
-  // |remote_desc| is the new remote description, or NULL if the current remote
-  // description should be used. Output |valid| is true if the candidate media
-  // index is valid.
-  bool ReadyToUseRemoteCandidate(const IceCandidateInterface* candidate,
-                                 const SessionDescriptionInterface* remote_desc,
-                                 bool* valid);
-
-  // Returns true if SRTP (either using DTLS-SRTP or SDES) is required by
-  // this session.
-  bool SrtpRequired() const;
-
-  // TransportController signal handlers.
-  void OnTransportControllerConnectionState(cricket::IceConnectionState state);
-  void OnTransportControllerReceiving(bool receiving);
-  void OnTransportControllerGatheringState(cricket::IceGatheringState state);
-  void OnTransportControllerCandidatesGathered(
-      const std::string& transport_name,
-      const std::vector<cricket::Candidate>& candidates);
-  void OnTransportControllerCandidatesRemoved(
-      const std::vector<cricket::Candidate>& candidates);
-  void OnTransportControllerDtlsHandshakeError(rtc::SSLHandshakeError error);
-
-  std::string GetSessionErrorMsg();
-
-  // Invoked when TransportController connection completion is signaled.
-  // Reports stats for all transports in use.
-  void ReportTransportStats();
-
-  // Gather the usage of IPv4/IPv6 as best connection.
-  void ReportBestConnectionState(const cricket::TransportStats& stats);
-
-  void ReportNegotiatedCiphers(const cricket::TransportStats& stats);
-
-  void OnSentPacket_w(const rtc::SentPacket& sent_packet);
-
-  const std::string GetTransportName(const std::string& content_name);
-
-  void DestroyRtcpTransport_n(const std::string& transport_name);
-  void RemoveAndDestroyVideoChannel(cricket::VideoChannel* video_channel);
-  void DestroyVideoChannel(cricket::VideoChannel* video_channel);
-  void RemoveAndDestroyVoiceChannel(cricket::VoiceChannel* voice_channel);
-  void DestroyVoiceChannel(cricket::VoiceChannel* voice_channel);
-  void DestroyDataChannel();
-
-  rtc::Thread* const network_thread_;
-  rtc::Thread* const worker_thread_;
-  rtc::Thread* const signaling_thread_;
-
-  State state_ = STATE_INIT;
-  Error error_ = ERROR_NONE;
-  std::string error_desc_;
-
-  const std::string sid_;
-  bool initial_offerer_ = false;
-
-  const std::unique_ptr<cricket::TransportController> transport_controller_;
-  const std::unique_ptr<cricket::SctpTransportInternalFactory> sctp_factory_;
-  const cricket::MediaConfig media_config_;
-  RtcEventLog* event_log_;
-  Call* call_;
-  // TODO(steveanton): voice_channels_ and video_channels_ used to be a single
-  // VoiceChannel/VideoChannel respectively but are being changed to support
-  // multiple m= lines in unified plan. But until more work is done, these can
-  // only have 0 or 1 channel each.
-  // These channels are owned by ChannelManager.
-  std::vector<cricket::VoiceChannel*> voice_channels_;
-  std::vector<cricket::VideoChannel*> video_channels_;
-  // |rtp_data_channel_| is used if in RTP data channel mode, |sctp_transport_|
-  // when using SCTP.
-  // TODO(steveanton): This should be changed to a bare pointer because
-  // WebRtcSession doesn't actually own the RtpDataChannel
-  // (ChannelManager does).
-  std::unique_ptr<cricket::RtpDataChannel> rtp_data_channel_;
-
-  std::unique_ptr<cricket::SctpTransportInternal> sctp_transport_;
-  // |sctp_transport_name_| keeps track of what DTLS transport the SCTP
-  // transport is using (which can change due to bundling).
-  rtc::Optional<std::string> sctp_transport_name_;
-  // |sctp_content_name_| is the content name (MID) in SDP.
-  rtc::Optional<std::string> sctp_content_name_;
-  // Value cached on signaling thread. Only updated when SctpReadyToSendData
-  // fires on the signaling thread.
-  bool sctp_ready_to_send_data_ = false;
-  // Same as signals provided by SctpTransport, but these are guaranteed to
-  // fire on the signaling thread, whereas SctpTransport fires on the networking
-  // thread.
-  // |sctp_invoker_| is used so that any signals queued on the signaling thread
-  // from the network thread are immediately discarded if the SctpTransport is
-  // destroyed (due to m= section being rejected).
-  // TODO(deadbeef): Use a proxy object to ensure that method calls/signals
-  // are marshalled to the right thread. Could almost use proxy.h for this,
-  // but it doesn't have a mechanism for marshalling sigslot::signals
-  std::unique_ptr<rtc::AsyncInvoker> sctp_invoker_;
-  sigslot::signal1<bool> SignalSctpReadyToSendData;
-  sigslot::signal2<const cricket::ReceiveDataParams&,
-                   const rtc::CopyOnWriteBuffer&>
-      SignalSctpDataReceived;
-  sigslot::signal1<int> SignalSctpStreamClosedRemotely;
-
-  cricket::ChannelManager* channel_manager_;
-  IceObserver* ice_observer_;
-  PeerConnectionInterface::IceConnectionState ice_connection_state_;
-  bool ice_connection_receiving_;
-  std::unique_ptr<SessionDescriptionInterface> current_local_description_;
-  std::unique_ptr<SessionDescriptionInterface> pending_local_description_;
-  std::unique_ptr<SessionDescriptionInterface> current_remote_description_;
-  std::unique_ptr<SessionDescriptionInterface> pending_remote_description_;
-  // If the remote peer is using a older version of implementation.
-  bool older_version_remote_peer_;
-  bool dtls_enabled_;
-  // Specifies which kind of data channel is allowed. This is controlled
-  // by the chrome command-line flag and constraints:
-  // 1. If chrome command-line switch 'enable-sctp-data-channels' is enabled,
-  // constraint kEnableDtlsSrtp is true, and constaint kEnableRtpDataChannels is
-  // not set or false, SCTP is allowed (DCT_SCTP);
-  // 2. If constraint kEnableRtpDataChannels is true, RTP is allowed (DCT_RTP);
-  // 3. If both 1&2 are false, data channel is not allowed (DCT_NONE).
-  // The data channel type could be DCT_QUIC if the QUIC data channel is
-  // enabled.
-  cricket::DataChannelType data_channel_type_;
-  // List of content names for which the remote side triggered an ICE restart.
-  std::set<std::string> pending_ice_restarts_;
-
-  std::unique_ptr<WebRtcSessionDescriptionFactory> webrtc_session_desc_factory_;
-
-  // Member variables for caching global options.
-  cricket::AudioOptions audio_options_;
-  cricket::VideoOptions video_options_;
-  MetricsObserverInterface* metrics_observer_;
-
-  // Declares the bundle policy for the WebRTCSession.
-  PeerConnectionInterface::BundlePolicy bundle_policy_;
-
-  // Declares the RTCP mux policy for the WebRTCSession.
-  PeerConnectionInterface::RtcpMuxPolicy rtcp_mux_policy_;
-
-  bool received_first_video_packet_ = false;
-  bool received_first_audio_packet_ = false;
-
-#ifdef HAVE_QUIC
-  std::unique_ptr<QuicDataTransport> quic_data_transport_;
-#endif  // HAVE_QUIC
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(WebRtcSession);
-};
-}  // namespace webrtc
-
-#endif  // WEBRTC_PC_WEBRTCSESSION_H_
diff --git a/pc/webrtcsession_unittest.cc b/pc/webrtcsession_unittest.cc
deleted file mode 100644
index 497daff..0000000
--- a/pc/webrtcsession_unittest.cc
+++ /dev/null
@@ -1,4581 +0,0 @@
-/*
- *  Copyright 2012 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 <memory>
-#include <utility>
-#include <vector>
-
-#include "webrtc/api/fakemetricsobserver.h"
-#include "webrtc/api/jsepicecandidate.h"
-#include "webrtc/api/jsepsessiondescription.h"
-#include "webrtc/logging/rtc_event_log/rtc_event_log.h"
-#include "webrtc/media/base/fakemediaengine.h"
-#include "webrtc/media/base/fakevideorenderer.h"
-#include "webrtc/media/base/mediachannel.h"
-#include "webrtc/media/engine/fakewebrtccall.h"
-#include "webrtc/media/sctp/sctptransportinternal.h"
-#include "webrtc/p2p/base/packettransportinternal.h"
-#include "webrtc/p2p/base/stunserver.h"
-#include "webrtc/p2p/base/teststunserver.h"
-#include "webrtc/p2p/base/testturnserver.h"
-#include "webrtc/p2p/client/basicportallocator.h"
-#include "webrtc/pc/audiotrack.h"
-#include "webrtc/pc/channelmanager.h"
-#include "webrtc/pc/mediasession.h"
-#include "webrtc/pc/peerconnection.h"
-#include "webrtc/pc/sctputils.h"
-#include "webrtc/pc/test/fakertccertificategenerator.h"
-#include "webrtc/pc/videotrack.h"
-#include "webrtc/pc/webrtcsession.h"
-#include "webrtc/pc/webrtcsessiondescriptionfactory.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/fakenetwork.h"
-#include "webrtc/rtc_base/firewallsocketserver.h"
-#include "webrtc/rtc_base/gunit.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/network.h"
-#include "webrtc/rtc_base/ssladapter.h"
-#include "webrtc/rtc_base/sslidentity.h"
-#include "webrtc/rtc_base/sslstreamadapter.h"
-#include "webrtc/rtc_base/stringutils.h"
-#include "webrtc/rtc_base/thread.h"
-#include "webrtc/rtc_base/virtualsocketserver.h"
-
-using cricket::FakeVoiceMediaChannel;
-using cricket::TransportInfo;
-using rtc::SocketAddress;
-using rtc::Thread;
-using webrtc::CreateSessionDescription;
-using webrtc::CreateSessionDescriptionObserver;
-using webrtc::CreateSessionDescriptionRequest;
-using webrtc::DataChannel;
-using webrtc::FakeMetricsObserver;
-using webrtc::IceCandidateCollection;
-using webrtc::InternalDataChannelInit;
-using webrtc::JsepIceCandidate;
-using webrtc::JsepSessionDescription;
-using webrtc::PeerConnectionFactoryInterface;
-using webrtc::PeerConnectionInterface;
-using webrtc::SessionDescriptionInterface;
-using webrtc::SessionStats;
-using webrtc::StreamCollection;
-using webrtc::WebRtcSession;
-using webrtc::kBundleWithoutRtcpMux;
-using webrtc::kCreateChannelFailed;
-using webrtc::kInvalidSdp;
-using webrtc::kMlineMismatchInAnswer;
-using webrtc::kPushDownTDFailed;
-using webrtc::kSdpWithoutIceUfragPwd;
-using webrtc::kSdpWithoutDtlsFingerprint;
-using webrtc::kSdpWithoutSdesCrypto;
-using webrtc::kSessionError;
-using webrtc::kSessionErrorDesc;
-using webrtc::kMaxUnsignalledRecvStreams;
-
-typedef PeerConnectionInterface::RTCOfferAnswerOptions RTCOfferAnswerOptions;
-
-static const int kClientAddrPort = 0;
-static const char kClientAddrHost1[] = "11.11.11.11";
-static const char kClientIPv6AddrHost1[] =
-    "2620:0:aaaa:bbbb:cccc:dddd:eeee:ffff";
-static const char kClientAddrHost2[] = "22.22.22.22";
-static const char kStunAddrHost[] = "99.99.99.1";
-static const SocketAddress kTurnUdpIntAddr("99.99.99.4", 3478);
-static const SocketAddress kTurnUdpExtAddr("99.99.99.6", 0);
-static const char kTurnUsername[] = "test";
-static const char kTurnPassword[] = "test";
-
-static const char kSessionVersion[] = "1";
-
-// Media index of candidates belonging to the first media content.
-static const int kMediaContentIndex0 = 0;
-static const char kMediaContentName0[] = "audio";
-
-// Media index of candidates belonging to the second media content.
-static const int kMediaContentIndex1 = 1;
-static const char kMediaContentName1[] = "video";
-
-static const int kDefaultTimeout = 10000;  // 10 seconds.
-static const int kIceCandidatesTimeout = 10000;
-
-static const char kFakeDtlsFingerprint[] =
-    "BB:CD:72:F7:2F:D0:BA:43:F3:68:B1:0C:23:72:B6:4A:"
-    "0F:DE:34:06:BC:E0:FE:01:BC:73:C8:6D:F4:65:D5:24";
-
-static const char kTooLongIceUfragPwd[] =
-    "IceUfragIceUfragIceUfragIceUfragIceUfragIceUfragIceUfragIceUfragIceUfrag"
-    "IceUfragIceUfragIceUfragIceUfragIceUfragIceUfragIceUfragIceUfragIceUfrag"
-    "IceUfragIceUfragIceUfragIceUfragIceUfragIceUfragIceUfragIceUfragIceUfrag"
-    "IceUfragIceUfragIceUfragIceUfragIceUfragIceUfragIceUfragIceUfragIceUfrag";
-
-static const char kSdpWithRtx[] =
-    "v=0\r\n"
-    "o=- 4104004319237231850 2 IN IP4 127.0.0.1\r\n"
-    "s=-\r\n"
-    "t=0 0\r\n"
-    "a=msid-semantic: WMS stream1\r\n"
-    "m=video 9 RTP/SAVPF 0 96\r\n"
-    "c=IN IP4 0.0.0.0\r\n"
-    "a=rtcp:9 IN IP4 0.0.0.0\r\n"
-    "a=ice-ufrag:CerjGp19G7wpXwl7\r\n"
-    "a=ice-pwd:cMvOlFvQ6ochez1ZOoC2uBEC\r\n"
-    "a=mid:video\r\n"
-    "a=sendrecv\r\n"
-    "a=rtcp-mux\r\n"
-    "a=crypto:1 AES_CM_128_HMAC_SHA1_80 "
-    "inline:5/4N5CDvMiyDArHtBByUM71VIkguH17ZNoX60GrA\r\n"
-    "a=rtpmap:0 fake_video_codec/90000\r\n"
-    "a=rtpmap:96 rtx/90000\r\n"
-    "a=fmtp:96 apt=0\r\n";
-
-static const char kStream1[] = "stream1";
-static const char kVideoTrack1[] = "video1";
-static const char kAudioTrack1[] = "audio1";
-
-static const char kStream2[] = "stream2";
-static const char kVideoTrack2[] = "video2";
-static const char kAudioTrack2[] = "audio2";
-
-static constexpr bool kStopped = true;
-static constexpr bool kActive = false;
-
-enum RTCCertificateGenerationMethod { ALREADY_GENERATED, DTLS_IDENTITY_STORE };
-
-class MockIceObserver : public webrtc::IceObserver {
- public:
-  MockIceObserver()
-      : oncandidatesready_(false),
-        ice_connection_state_(PeerConnectionInterface::kIceConnectionNew),
-        ice_gathering_state_(PeerConnectionInterface::kIceGatheringNew) {
-  }
-
-  virtual ~MockIceObserver() = default;
-
-  void OnIceConnectionStateChange(
-      PeerConnectionInterface::IceConnectionState new_state) override {
-    ice_connection_state_ = new_state;
-    ice_connection_state_history_.push_back(new_state);
-  }
-  void OnIceGatheringChange(
-      PeerConnectionInterface::IceGatheringState new_state) override {
-    // We can never transition back to "new".
-    EXPECT_NE(PeerConnectionInterface::kIceGatheringNew, new_state);
-    ice_gathering_state_ = new_state;
-    oncandidatesready_ =
-        new_state == PeerConnectionInterface::kIceGatheringComplete;
-  }
-
-  // Found a new candidate.
-  void OnIceCandidate(
-      std::unique_ptr<webrtc::IceCandidateInterface> candidate) override {
-    switch (candidate->sdp_mline_index()) {
-      case kMediaContentIndex0:
-        mline_0_candidates_.push_back(candidate->candidate());
-        break;
-      case kMediaContentIndex1:
-        mline_1_candidates_.push_back(candidate->candidate());
-        break;
-      default:
-        RTC_NOTREACHED();
-    }
-
-    // The ICE gathering state should always be Gathering when a candidate is
-    // received (or possibly Completed in the case of the final candidate).
-    EXPECT_NE(PeerConnectionInterface::kIceGatheringNew, ice_gathering_state_);
-  }
-
-  // Some local candidates are removed.
-  void OnIceCandidatesRemoved(
-      const std::vector<cricket::Candidate>& candidates) override {
-    num_candidates_removed_ += candidates.size();
-  }
-
-  bool oncandidatesready_;
-  std::vector<cricket::Candidate> mline_0_candidates_;
-  std::vector<cricket::Candidate> mline_1_candidates_;
-  PeerConnectionInterface::IceConnectionState ice_connection_state_;
-  PeerConnectionInterface::IceGatheringState ice_gathering_state_;
-  std::vector<PeerConnectionInterface::IceConnectionState>
-      ice_connection_state_history_;
-  size_t num_candidates_removed_ = 0;
-};
-
-// Used for tests in this file to verify that WebRtcSession responds to signals
-// from the SctpTransport correctly, and calls Start with the correct
-// local/remote ports.
-class FakeSctpTransport : public cricket::SctpTransportInternal {
- public:
-  void SetTransportChannel(rtc::PacketTransportInternal* channel) override {}
-  bool Start(int local_port, int remote_port) override {
-    local_port_ = local_port;
-    remote_port_ = remote_port;
-    return true;
-  }
-  bool OpenStream(int sid) override { return true; }
-  bool ResetStream(int sid) override { return true; }
-  bool SendData(const cricket::SendDataParams& params,
-                const rtc::CopyOnWriteBuffer& payload,
-                cricket::SendDataResult* result = nullptr) override {
-    return true;
-  }
-  bool ReadyToSendData() override { return true; }
-  void set_debug_name_for_testing(const char* debug_name) override {}
-
-  int local_port() const { return local_port_; }
-  int remote_port() const { return remote_port_; }
-
- private:
-  int local_port_ = -1;
-  int remote_port_ = -1;
-};
-
-class FakeSctpTransportFactory : public cricket::SctpTransportInternalFactory {
- public:
-  std::unique_ptr<cricket::SctpTransportInternal> CreateSctpTransport(
-      rtc::PacketTransportInternal*) override {
-    last_fake_sctp_transport_ = new FakeSctpTransport();
-    return std::unique_ptr<cricket::SctpTransportInternal>(
-        last_fake_sctp_transport_);
-  }
-
-  FakeSctpTransport* last_fake_sctp_transport() {
-    return last_fake_sctp_transport_;
-  }
-
- private:
-  FakeSctpTransport* last_fake_sctp_transport_ = nullptr;
-};
-
-class WebRtcSessionForTest : public webrtc::WebRtcSession {
- public:
-  WebRtcSessionForTest(
-      webrtc::Call* fake_call,
-      cricket::ChannelManager* channel_manager,
-      const cricket::MediaConfig& media_config,
-      webrtc::RtcEventLog* event_log,
-      rtc::Thread* network_thread,
-      rtc::Thread* worker_thread,
-      rtc::Thread* signaling_thread,
-      cricket::PortAllocator* port_allocator,
-      webrtc::IceObserver* ice_observer,
-      std::unique_ptr<cricket::TransportController> transport_controller,
-      std::unique_ptr<FakeSctpTransportFactory> sctp_factory)
-      : WebRtcSession(fake_call, channel_manager, media_config, event_log,
-                      network_thread,
-                      worker_thread,
-                      signaling_thread,
-                      port_allocator,
-                      std::move(transport_controller),
-                      std::move(sctp_factory)) {
-    RegisterIceObserver(ice_observer);
-  }
-  virtual ~WebRtcSessionForTest() {}
-
-  // Note that these methods are only safe to use if the signaling thread
-  // is the same as the worker thread
-  rtc::PacketTransportInternal* voice_rtp_transport_channel() {
-    return rtp_transport_channel(voice_channel());
-  }
-
-  rtc::PacketTransportInternal* voice_rtcp_transport_channel() {
-    return rtcp_transport_channel(voice_channel());
-  }
-
-  rtc::PacketTransportInternal* video_rtp_transport_channel() {
-    return rtp_transport_channel(video_channel());
-  }
-
-  rtc::PacketTransportInternal* video_rtcp_transport_channel() {
-    return rtcp_transport_channel(video_channel());
-  }
-
- private:
-  rtc::PacketTransportInternal* rtp_transport_channel(
-      cricket::BaseChannel* ch) {
-    if (!ch) {
-      return nullptr;
-    }
-    return ch->rtp_dtls_transport();
-  }
-
-  rtc::PacketTransportInternal* rtcp_transport_channel(
-      cricket::BaseChannel* ch) {
-    if (!ch) {
-      return nullptr;
-    }
-    return ch->rtcp_dtls_transport();
-  }
-};
-
-class WebRtcSessionCreateSDPObserverForTest
-    : public rtc::RefCountedObject<CreateSessionDescriptionObserver> {
- public:
-  enum State {
-    kInit,
-    kFailed,
-    kSucceeded,
-  };
-  WebRtcSessionCreateSDPObserverForTest() : state_(kInit) {}
-
-  // CreateSessionDescriptionObserver implementation.
-  virtual void OnSuccess(SessionDescriptionInterface* desc) {
-    description_.reset(desc);
-    state_ = kSucceeded;
-  }
-  virtual void OnFailure(const std::string& error) {
-    state_ = kFailed;
-  }
-
-  SessionDescriptionInterface* description() { return description_.get(); }
-
-  SessionDescriptionInterface* ReleaseDescription() {
-    return description_.release();
-  }
-
-  State state() const { return state_; }
-
- protected:
-  ~WebRtcSessionCreateSDPObserverForTest() {}
-
- private:
-  std::unique_ptr<SessionDescriptionInterface> description_;
-  State state_;
-};
-
-class FakeAudioSource : public cricket::AudioSource {
- public:
-  FakeAudioSource() : sink_(NULL) {}
-  virtual ~FakeAudioSource() {
-    if (sink_)
-      sink_->OnClose();
-  }
-
-  void SetSink(Sink* sink) override { sink_ = sink; }
-
-  const cricket::AudioSource::Sink* sink() const { return sink_; }
-
- private:
-  cricket::AudioSource::Sink* sink_;
-};
-
-class WebRtcSessionTest
-    : public testing::TestWithParam<RTCCertificateGenerationMethod>,
-      public sigslot::has_slots<> {
- protected:
-  // TODO Investigate why ChannelManager crashes, if it's created
-  // after stun_server.
-  WebRtcSessionTest()
-      : vss_(new rtc::VirtualSocketServer()),
-        fss_(new rtc::FirewallSocketServer(vss_.get())),
-        thread_(fss_.get()),
-        media_engine_(new cricket::FakeMediaEngine()),
-        data_engine_(new cricket::FakeDataEngine()),
-        channel_manager_(new cricket::ChannelManager(
-            std::unique_ptr<cricket::MediaEngineInterface>(media_engine_),
-            std::unique_ptr<cricket::DataEngineInterface>(data_engine_),
-            rtc::Thread::Current())),
-        fake_call_(webrtc::Call::Config(&event_log_)),
-        tdesc_factory_(new cricket::TransportDescriptionFactory()),
-        desc_factory_(
-            new cricket::MediaSessionDescriptionFactory(channel_manager_.get(),
-                                                        tdesc_factory_.get())),
-        stun_socket_addr_(
-            rtc::SocketAddress(kStunAddrHost, cricket::STUN_SERVER_PORT)),
-        stun_server_(cricket::TestStunServer::Create(Thread::Current(),
-                                                     stun_socket_addr_)),
-        turn_server_(Thread::Current(), kTurnUdpIntAddr, kTurnUdpExtAddr),
-        metrics_observer_(new rtc::RefCountedObject<FakeMetricsObserver>()) {
-    cricket::ServerAddresses stun_servers;
-    stun_servers.insert(stun_socket_addr_);
-    allocator_.reset(new cricket::BasicPortAllocator(
-        &network_manager_,
-        stun_servers,
-        SocketAddress(), SocketAddress(), SocketAddress()));
-    allocator_->set_flags(cricket::PORTALLOCATOR_DISABLE_TCP |
-                          cricket::PORTALLOCATOR_DISABLE_RELAY);
-    EXPECT_TRUE(channel_manager_->Init());
-    allocator_->set_step_delay(cricket::kMinimumStepDelay);
-  }
-
-  void AddInterface(const SocketAddress& addr) {
-    network_manager_.AddInterface(addr);
-  }
-  void RemoveInterface(const SocketAddress& addr) {
-    network_manager_.RemoveInterface(addr);
-  }
-
-  // If |cert_generator| != null or |rtc_configuration| contains |certificates|
-  // then DTLS will be enabled unless explicitly disabled by |rtc_configuration|
-  // options. When DTLS is enabled a certificate will be used if provided,
-  // otherwise one will be generated using the |cert_generator|.
-  void Init(
-      std::unique_ptr<rtc::RTCCertificateGeneratorInterface> cert_generator,
-      PeerConnectionInterface::RtcpMuxPolicy rtcp_mux_policy,
-      const rtc::CryptoOptions& crypto_options) {
-    ASSERT_TRUE(session_.get() == NULL);
-    fake_sctp_transport_factory_ = new FakeSctpTransportFactory();
-    session_.reset(new WebRtcSessionForTest(&fake_call_,
-        channel_manager_.get(), cricket::MediaConfig(), &event_log_,
-        rtc::Thread::Current(), rtc::Thread::Current(),
-        rtc::Thread::Current(), allocator_.get(), &observer_,
-        std::unique_ptr<cricket::TransportController>(
-            new cricket::TransportController(
-                rtc::Thread::Current(), rtc::Thread::Current(),
-                allocator_.get(),
-                /*redetermine_role_on_ice_restart=*/true, crypto_options)),
-        std::unique_ptr<FakeSctpTransportFactory>(
-            fake_sctp_transport_factory_)));
-    session_->SignalDataChannelOpenMessage.connect(
-        this, &WebRtcSessionTest::OnDataChannelOpenMessage);
-
-    configuration_.rtcp_mux_policy = rtcp_mux_policy;
-    EXPECT_EQ(PeerConnectionInterface::kIceConnectionNew,
-        observer_.ice_connection_state_);
-    EXPECT_EQ(PeerConnectionInterface::kIceGatheringNew,
-        observer_.ice_gathering_state_);
-
-    EXPECT_TRUE(session_->Initialize(options_, std::move(cert_generator),
-                                     configuration_));
-    session_->set_metrics_observer(metrics_observer_);
-    crypto_options_ = crypto_options;
-  }
-
-  void OnDataChannelOpenMessage(const std::string& label,
-                                const InternalDataChannelInit& config) {
-    last_data_channel_label_ = label;
-    last_data_channel_config_ = config;
-  }
-
-  void Init() {
-    Init(nullptr, PeerConnectionInterface::kRtcpMuxPolicyNegotiate,
-         rtc::CryptoOptions());
-  }
-
-  void InitWithBundlePolicy(
-      PeerConnectionInterface::BundlePolicy bundle_policy) {
-    configuration_.bundle_policy = bundle_policy;
-    Init();
-  }
-
-  void InitWithRtcpMuxPolicy(
-      PeerConnectionInterface::RtcpMuxPolicy rtcp_mux_policy) {
-    PeerConnectionInterface::RTCConfiguration configuration;
-    Init(nullptr, rtcp_mux_policy, rtc::CryptoOptions());
-  }
-
-  void InitWithCryptoOptions(const rtc::CryptoOptions& crypto_options) {
-    Init(nullptr, PeerConnectionInterface::kRtcpMuxPolicyNegotiate,
-         crypto_options);
-  }
-
-  // Successfully init with DTLS; with a certificate generated and supplied or
-  // with a store that generates it for us.
-  void InitWithDtls(RTCCertificateGenerationMethod cert_gen_method) {
-    std::unique_ptr<FakeRTCCertificateGenerator> cert_generator;
-    if (cert_gen_method == ALREADY_GENERATED) {
-      configuration_.certificates.push_back(
-          FakeRTCCertificateGenerator::GenerateCertificate());
-    } else if (cert_gen_method == DTLS_IDENTITY_STORE) {
-      cert_generator.reset(new FakeRTCCertificateGenerator());
-      cert_generator->set_should_fail(false);
-    } else {
-      RTC_CHECK(false);
-    }
-    Init(std::move(cert_generator),
-         PeerConnectionInterface::kRtcpMuxPolicyNegotiate,
-         rtc::CryptoOptions());
-  }
-
-  // Init with DTLS with a store that will fail to generate a certificate.
-  void InitWithDtlsIdentityGenFail() {
-    std::unique_ptr<FakeRTCCertificateGenerator> cert_generator(
-        new FakeRTCCertificateGenerator());
-    cert_generator->set_should_fail(true);
-    Init(std::move(cert_generator),
-         PeerConnectionInterface::kRtcpMuxPolicyNegotiate,
-         rtc::CryptoOptions());
-  }
-
-  void InitWithGcm() {
-    rtc::CryptoOptions crypto_options;
-    crypto_options.enable_gcm_crypto_suites = true;
-    InitWithCryptoOptions(crypto_options);
-  }
-
-  // The following convenience functions can be applied for both local side and
-  // remote side. The flags can be overwritten for different use cases.
-  void SendAudioVideoStream1() {
-    send_stream_1_ = true;
-    send_stream_2_ = false;
-    local_send_audio_ = true;
-    local_send_video_ = true;
-    remote_send_audio_ = true;
-    remote_send_video_ = true;
-  }
-
-  void SendAudioVideoStream2() {
-    send_stream_1_ = false;
-    send_stream_2_ = true;
-    local_send_audio_ = true;
-    local_send_video_ = true;
-    remote_send_audio_ = true;
-    remote_send_video_ = true;
-  }
-
-  void SendAudioVideoStream1And2() {
-    send_stream_1_ = true;
-    send_stream_2_ = true;
-    local_send_audio_ = true;
-    local_send_video_ = true;
-    remote_send_audio_ = true;
-    remote_send_video_ = true;
-  }
-
-  void SendNothing() {
-    send_stream_1_ = false;
-    send_stream_2_ = false;
-    local_send_audio_ = false;
-    local_send_video_ = false;
-    remote_send_audio_ = false;
-    remote_send_video_ = false;
-  }
-
-  void SendAudioOnlyStream2() {
-    send_stream_1_ = false;
-    send_stream_2_ = true;
-    local_send_audio_ = true;
-    local_send_video_ = false;
-    remote_send_audio_ = true;
-    remote_send_video_ = false;
-  }
-
-  void SendVideoOnlyStream2() {
-    send_stream_1_ = false;
-    send_stream_2_ = true;
-    local_send_audio_ = false;
-    local_send_video_ = true;
-    remote_send_audio_ = false;
-    remote_send_video_ = true;
-  }
-
-  // Helper function used to add a specific media section to the
-  // |session_options|.
-  void AddMediaSection(cricket::MediaType type,
-                       const std::string& mid,
-                       cricket::MediaContentDirection direction,
-                       bool stopped,
-                       cricket::MediaSessionOptions* opts) {
-    opts->media_description_options.push_back(cricket::MediaDescriptionOptions(
-        type, mid,
-        cricket::RtpTransceiverDirection::FromMediaContentDirection(direction),
-        stopped));
-  }
-
-  // Add the media sections to the options from |offered_media_sections_| when
-  // creating an answer or a new offer.
-  // This duplicates a lot of logic from PeerConnection but this can be fixed
-  // when PeerConnection and WebRtcSession are merged.
-  void AddExistingMediaSectionsAndSendersToOptions(
-      cricket::MediaSessionOptions* session_options,
-      bool send_audio,
-      bool recv_audio,
-      bool send_video,
-      bool recv_video) {
-    int num_sim_layer = 1;
-    for (auto media_description_options : offered_media_sections_) {
-      if (media_description_options.type == cricket::MEDIA_TYPE_AUDIO) {
-        bool stopped = !send_audio && !recv_audio;
-        auto media_desc_options = cricket::MediaDescriptionOptions(
-            cricket::MEDIA_TYPE_AUDIO, media_description_options.mid,
-            cricket::RtpTransceiverDirection(send_audio, recv_audio), stopped);
-        if (send_stream_1_ && send_audio) {
-          media_desc_options.AddAudioSender(kAudioTrack1, {kStream1});
-        }
-        if (send_stream_2_ && send_audio) {
-          media_desc_options.AddAudioSender(kAudioTrack2, {kStream2});
-        }
-        session_options->media_description_options.push_back(
-            media_desc_options);
-      } else if (media_description_options.type == cricket::MEDIA_TYPE_VIDEO) {
-        bool stopped = !send_video && !recv_video;
-        auto media_desc_options = cricket::MediaDescriptionOptions(
-            cricket::MEDIA_TYPE_VIDEO, media_description_options.mid,
-            cricket::RtpTransceiverDirection(send_video, recv_video), stopped);
-        if (send_stream_1_ && send_video) {
-          media_desc_options.AddVideoSender(kVideoTrack1, {kStream1},
-                                            num_sim_layer);
-        }
-        if (send_stream_2_ && send_video) {
-          media_desc_options.AddVideoSender(kVideoTrack2, {kStream2},
-                                            num_sim_layer);
-        }
-        session_options->media_description_options.push_back(
-            media_desc_options);
-      } else if (media_description_options.type == cricket::MEDIA_TYPE_DATA) {
-        session_options->media_description_options.push_back(
-            cricket::MediaDescriptionOptions(
-                cricket::MEDIA_TYPE_DATA, media_description_options.mid,
-                // Direction for data sections is meaningless, but legacy
-                // endpoints might expect sendrecv.
-                cricket::RtpTransceiverDirection(true, true), false));
-      } else {
-        RTC_NOTREACHED();
-      }
-    }
-  }
-
-  // Add the existing media sections first and then add new media sections if
-  // needed.
-  void AddMediaSectionsAndSendersToOptions(
-      cricket::MediaSessionOptions* session_options,
-      bool send_audio,
-      bool recv_audio,
-      bool send_video,
-      bool recv_video) {
-    AddExistingMediaSectionsAndSendersToOptions(
-        session_options, send_audio, recv_audio, send_video, recv_video);
-
-    if (!session_options->has_audio() && (send_audio || recv_audio)) {
-      cricket::MediaDescriptionOptions media_desc_options =
-          cricket::MediaDescriptionOptions(
-              cricket::MEDIA_TYPE_AUDIO, cricket::CN_AUDIO,
-              cricket::RtpTransceiverDirection(send_audio, recv_audio),
-              kActive);
-      if (send_stream_1_ && send_audio) {
-        media_desc_options.AddAudioSender(kAudioTrack1, {kStream1});
-      }
-      if (send_stream_2_ && send_audio) {
-        media_desc_options.AddAudioSender(kAudioTrack2, {kStream2});
-      }
-      session_options->media_description_options.push_back(media_desc_options);
-      offered_media_sections_.push_back(media_desc_options);
-    }
-
-    if (!session_options->has_video() && (send_video || recv_video)) {
-      cricket::MediaDescriptionOptions media_desc_options =
-          cricket::MediaDescriptionOptions(
-              cricket::MEDIA_TYPE_VIDEO, cricket::CN_VIDEO,
-              cricket::RtpTransceiverDirection(send_video, recv_video),
-              kActive);
-      int num_sim_layer = 1;
-      if (send_stream_1_ && send_video) {
-        media_desc_options.AddVideoSender(kVideoTrack1, {kStream1},
-                                          num_sim_layer);
-      }
-      if (send_stream_2_ && send_video) {
-        media_desc_options.AddVideoSender(kVideoTrack2, {kStream2},
-                                          num_sim_layer);
-      }
-      session_options->media_description_options.push_back(media_desc_options);
-      offered_media_sections_.push_back(media_desc_options);
-    }
-
-    if (!session_options->has_data() &&
-        (data_channel_ ||
-         session_options->data_channel_type != cricket::DCT_NONE)) {
-      cricket::MediaDescriptionOptions media_desc_options =
-          cricket::MediaDescriptionOptions(
-              cricket::MEDIA_TYPE_DATA, cricket::CN_DATA,
-              cricket::RtpTransceiverDirection(true, true), kActive);
-      if (session_options->data_channel_type == cricket::DCT_RTP) {
-        media_desc_options.AddRtpDataChannel(data_channel_->label(),
-                                             data_channel_->label());
-      }
-      session_options->media_description_options.push_back(media_desc_options);
-      offered_media_sections_.push_back(media_desc_options);
-    }
-  }
-
-  void GetOptionsForOffer(
-      const PeerConnectionInterface::RTCOfferAnswerOptions& rtc_options,
-      cricket::MediaSessionOptions* session_options) {
-    ExtractSharedMediaSessionOptions(rtc_options, session_options);
-
-    // |recv_X| is true by default if |offer_to_receive_X| is undefined.
-    bool recv_audio = rtc_options.offer_to_receive_audio != 0;
-    bool recv_video = rtc_options.offer_to_receive_video != 0;
-
-    AddMediaSectionsAndSendersToOptions(session_options, local_send_audio_,
-                                        recv_audio, local_send_video_,
-                                        recv_video);
-    session_options->bundle_enabled =
-        session_options->bundle_enabled &&
-        (session_options->has_audio() || session_options->has_video() ||
-         session_options->has_data());
-
-    session_options->crypto_options = crypto_options_;
-  }
-
-  void GetOptionsForAnswer(cricket::MediaSessionOptions* session_options) {
-    AddExistingMediaSectionsAndSendersToOptions(
-        session_options, local_send_audio_, local_recv_audio_,
-        local_send_video_, local_recv_video_);
-
-    session_options->bundle_enabled =
-        session_options->bundle_enabled &&
-        (session_options->has_audio() || session_options->has_video() ||
-         session_options->has_data());
-
-    if (session_->data_channel_type() != cricket::DCT_RTP) {
-      session_options->data_channel_type = session_->data_channel_type();
-    }
-
-    session_options->crypto_options = crypto_options_;
-  }
-
-  void GetOptionsForRemoteAnswer(
-      cricket::MediaSessionOptions* session_options) {
-    bool recv_audio = local_send_audio_ || remote_recv_audio_;
-    bool recv_video = local_send_video_ || remote_recv_video_;
-    bool send_audio = false;
-    bool send_video = false;
-
-    AddExistingMediaSectionsAndSendersToOptions(
-        session_options, send_audio, recv_audio, send_video, recv_video);
-
-    session_options->bundle_enabled =
-        session_options->bundle_enabled &&
-        (session_options->has_audio() || session_options->has_video() ||
-         session_options->has_data());
-
-    if (session_->data_channel_type() != cricket::DCT_RTP) {
-      session_options->data_channel_type = session_->data_channel_type();
-    }
-
-    session_options->crypto_options = crypto_options_;
-  }
-
-  void GetOptionsForAudioOnlyRemoteOffer(
-      cricket::MediaSessionOptions* session_options) {
-    remote_recv_audio_ = true;
-    remote_recv_video_ = false;
-    GetOptionsForRemoteOffer(session_options);
-  }
-
-  void GetOptionsForRemoteOffer(cricket::MediaSessionOptions* session_options) {
-    AddMediaSectionsAndSendersToOptions(session_options, remote_send_audio_,
-                                        remote_recv_audio_, remote_send_video_,
-                                        remote_recv_video_);
-    session_options->bundle_enabled =
-        (session_options->has_audio() || session_options->has_video() ||
-         session_options->has_data());
-
-    if (session_->data_channel_type() != cricket::DCT_RTP) {
-      session_options->data_channel_type = session_->data_channel_type();
-    }
-
-    session_options->crypto_options = crypto_options_;
-  }
-
-  // Creates a local offer and applies it. Starts ICE.
-  // Call SendAudioVideoStreamX() before this function
-  // to decide which streams to create.
-  void InitiateCall() {
-    SessionDescriptionInterface* offer = CreateOffer();
-    SetLocalDescriptionWithoutError(offer);
-    EXPECT_TRUE_WAIT(PeerConnectionInterface::kIceGatheringNew !=
-        observer_.ice_gathering_state_,
-        kIceCandidatesTimeout);
-  }
-
-  SessionDescriptionInterface* CreateOffer() {
-    PeerConnectionInterface::RTCOfferAnswerOptions options;
-    options.offer_to_receive_audio =
-        RTCOfferAnswerOptions::kOfferToReceiveMediaTrue;
-    return CreateOffer(options);
-  }
-
-  SessionDescriptionInterface* CreateOffer(
-      const PeerConnectionInterface::RTCOfferAnswerOptions options) {
-    rtc::scoped_refptr<WebRtcSessionCreateSDPObserverForTest>
-        observer = new WebRtcSessionCreateSDPObserverForTest();
-    cricket::MediaSessionOptions session_options;
-    GetOptionsForOffer(options, &session_options);
-    session_->CreateOffer(observer, options, session_options);
-    EXPECT_TRUE_WAIT(
-        observer->state() != WebRtcSessionCreateSDPObserverForTest::kInit,
-        2000);
-    return observer->ReleaseDescription();
-  }
-
-  SessionDescriptionInterface* CreateAnswer(
-      const cricket::MediaSessionOptions& options) {
-    rtc::scoped_refptr<WebRtcSessionCreateSDPObserverForTest> observer
-        = new WebRtcSessionCreateSDPObserverForTest();
-    cricket::MediaSessionOptions session_options = options;
-    GetOptionsForAnswer(&session_options);
-    session_->CreateAnswer(observer, session_options);
-    EXPECT_TRUE_WAIT(
-        observer->state() != WebRtcSessionCreateSDPObserverForTest::kInit,
-        2000);
-    return observer->ReleaseDescription();
-  }
-
-  SessionDescriptionInterface* CreateAnswer() {
-    cricket::MediaSessionOptions options;
-    options.bundle_enabled = true;
-    return CreateAnswer(options);
-  }
-
-  bool ChannelsExist() const {
-    return (session_->voice_channel() != NULL &&
-            session_->video_channel() != NULL);
-  }
-
-  void VerifyCryptoParams(const cricket::SessionDescription* sdp,
-      bool gcm_enabled = false) {
-    ASSERT_TRUE(session_.get() != NULL);
-    const cricket::ContentInfo* content = cricket::GetFirstAudioContent(sdp);
-    ASSERT_TRUE(content != NULL);
-    const cricket::AudioContentDescription* audio_content =
-        static_cast<const cricket::AudioContentDescription*>(
-            content->description);
-    ASSERT_TRUE(audio_content != NULL);
-    if (!gcm_enabled) {
-      ASSERT_EQ(1U, audio_content->cryptos().size());
-      ASSERT_EQ(47U, audio_content->cryptos()[0].key_params.size());
-      ASSERT_EQ("AES_CM_128_HMAC_SHA1_80",
-                audio_content->cryptos()[0].cipher_suite);
-      EXPECT_EQ(std::string(cricket::kMediaProtocolSavpf),
-                audio_content->protocol());
-    } else {
-      // The offer contains 3 possible crypto suites, the answer 1.
-      EXPECT_LE(1U, audio_content->cryptos().size());
-      EXPECT_NE(2U, audio_content->cryptos().size());
-      EXPECT_GE(3U, audio_content->cryptos().size());
-      ASSERT_EQ(67U, audio_content->cryptos()[0].key_params.size());
-      ASSERT_EQ("AEAD_AES_256_GCM",
-                audio_content->cryptos()[0].cipher_suite);
-      EXPECT_EQ(std::string(cricket::kMediaProtocolSavpf),
-                audio_content->protocol());
-    }
-
-    content = cricket::GetFirstVideoContent(sdp);
-    ASSERT_TRUE(content != NULL);
-    const cricket::VideoContentDescription* video_content =
-        static_cast<const cricket::VideoContentDescription*>(
-            content->description);
-    ASSERT_TRUE(video_content != NULL);
-    if (!gcm_enabled) {
-      ASSERT_EQ(1U, video_content->cryptos().size());
-      ASSERT_EQ("AES_CM_128_HMAC_SHA1_80",
-                video_content->cryptos()[0].cipher_suite);
-      ASSERT_EQ(47U, video_content->cryptos()[0].key_params.size());
-      EXPECT_EQ(std::string(cricket::kMediaProtocolSavpf),
-                video_content->protocol());
-    } else {
-      // The offer contains 3 possible crypto suites, the answer 1.
-      EXPECT_LE(1U, video_content->cryptos().size());
-      EXPECT_NE(2U, video_content->cryptos().size());
-      EXPECT_GE(3U, video_content->cryptos().size());
-      ASSERT_EQ("AEAD_AES_256_GCM",
-                video_content->cryptos()[0].cipher_suite);
-      ASSERT_EQ(67U, video_content->cryptos()[0].key_params.size());
-      EXPECT_EQ(std::string(cricket::kMediaProtocolSavpf),
-                video_content->protocol());
-    }
-  }
-
-  void VerifyNoCryptoParams(const cricket::SessionDescription* sdp, bool dtls) {
-    const cricket::ContentInfo* content = cricket::GetFirstAudioContent(sdp);
-    ASSERT_TRUE(content != NULL);
-    const cricket::AudioContentDescription* audio_content =
-        static_cast<const cricket::AudioContentDescription*>(
-            content->description);
-    ASSERT_TRUE(audio_content != NULL);
-    ASSERT_EQ(0U, audio_content->cryptos().size());
-
-    content = cricket::GetFirstVideoContent(sdp);
-    ASSERT_TRUE(content != NULL);
-    const cricket::VideoContentDescription* video_content =
-        static_cast<const cricket::VideoContentDescription*>(
-            content->description);
-    ASSERT_TRUE(video_content != NULL);
-    ASSERT_EQ(0U, video_content->cryptos().size());
-
-    if (dtls) {
-      EXPECT_EQ(std::string(cricket::kMediaProtocolDtlsSavpf),
-                audio_content->protocol());
-      EXPECT_EQ(std::string(cricket::kMediaProtocolDtlsSavpf),
-                video_content->protocol());
-    } else {
-      EXPECT_EQ(std::string(cricket::kMediaProtocolAvpf),
-                audio_content->protocol());
-      EXPECT_EQ(std::string(cricket::kMediaProtocolAvpf),
-                video_content->protocol());
-    }
-  }
-
-  // Set the internal fake description factories to do DTLS-SRTP.
-  void SetFactoryDtlsSrtp() {
-    desc_factory_->set_secure(cricket::SEC_DISABLED);
-    std::string identity_name = "WebRTC" +
-        rtc::ToString(rtc::CreateRandomId());
-    // Confirmed to work with KT_RSA and KT_ECDSA.
-    tdesc_factory_->set_certificate(
-        rtc::RTCCertificate::Create(std::unique_ptr<rtc::SSLIdentity>(
-            rtc::SSLIdentity::Generate(identity_name, rtc::KT_DEFAULT))));
-    tdesc_factory_->set_secure(cricket::SEC_REQUIRED);
-  }
-
-  void VerifyFingerprintStatus(const cricket::SessionDescription* sdp,
-                               bool expected) {
-    const TransportInfo* audio = sdp->GetTransportInfoByName("audio");
-    ASSERT_TRUE(audio != NULL);
-    ASSERT_EQ(expected, audio->description.identity_fingerprint.get() != NULL);
-    const TransportInfo* video = sdp->GetTransportInfoByName("video");
-    ASSERT_TRUE(video != NULL);
-    ASSERT_EQ(expected, video->description.identity_fingerprint.get() != NULL);
-  }
-
-  void VerifyAnswerFromNonCryptoOffer() {
-    // Create an SDP without Crypto.
-    cricket::MediaSessionOptions options;
-    GetOptionsForRemoteOffer(&options);
-    JsepSessionDescription* offer(
-        CreateRemoteOffer(options, cricket::SEC_DISABLED));
-    ASSERT_TRUE(offer != NULL);
-    VerifyNoCryptoParams(offer->description(), false);
-    SetRemoteDescriptionOfferExpectError(kSdpWithoutSdesCrypto,
-                                         offer);
-    const webrtc::SessionDescriptionInterface* answer = CreateAnswer();
-    // Answer should be NULL as no crypto params in offer.
-    ASSERT_TRUE(answer == NULL);
-  }
-
-  void VerifyAnswerFromCryptoOffer() {
-    cricket::MediaSessionOptions options;
-    GetOptionsForRemoteOffer(&options);
-    options.bundle_enabled = true;
-    std::unique_ptr<JsepSessionDescription> offer(
-        CreateRemoteOffer(options, cricket::SEC_REQUIRED));
-    ASSERT_TRUE(offer.get() != NULL);
-    VerifyCryptoParams(offer->description());
-    SetRemoteDescriptionWithoutError(offer.release());
-    std::unique_ptr<SessionDescriptionInterface> answer(CreateAnswer());
-    ASSERT_TRUE(answer.get() != NULL);
-    VerifyCryptoParams(answer->description());
-  }
-
-  bool IceUfragPwdEqual(const cricket::SessionDescription* desc1,
-                        const cricket::SessionDescription* desc2) {
-    if (desc1->contents().size() != desc2->contents().size()) {
-      return false;
-    }
-
-    const cricket::ContentInfos& contents = desc1->contents();
-    cricket::ContentInfos::const_iterator it = contents.begin();
-
-    for (; it != contents.end(); ++it) {
-      const cricket::TransportDescription* transport_desc1 =
-          desc1->GetTransportDescriptionByName(it->name);
-      const cricket::TransportDescription* transport_desc2 =
-          desc2->GetTransportDescriptionByName(it->name);
-      if (!transport_desc1 || !transport_desc2) {
-        return false;
-      }
-      if (transport_desc1->ice_pwd != transport_desc2->ice_pwd ||
-          transport_desc1->ice_ufrag != transport_desc2->ice_ufrag) {
-        return false;
-      }
-    }
-    return true;
-  }
-
-  // Compares ufrag/password only for the specified |media_type|.
-  bool IceUfragPwdEqual(const cricket::SessionDescription* desc1,
-                        const cricket::SessionDescription* desc2,
-                        cricket::MediaType media_type) {
-    if (desc1->contents().size() != desc2->contents().size()) {
-      return false;
-    }
-
-    const cricket::ContentInfo* cinfo =
-        cricket::GetFirstMediaContent(desc1->contents(), media_type);
-    const cricket::TransportDescription* transport_desc1 =
-        desc1->GetTransportDescriptionByName(cinfo->name);
-    const cricket::TransportDescription* transport_desc2 =
-        desc2->GetTransportDescriptionByName(cinfo->name);
-    if (!transport_desc1 || !transport_desc2) {
-      return false;
-    }
-    if (transport_desc1->ice_pwd != transport_desc2->ice_pwd ||
-        transport_desc1->ice_ufrag != transport_desc2->ice_ufrag) {
-      return false;
-    }
-    return true;
-  }
-
-  void RemoveIceUfragPwdLines(const SessionDescriptionInterface* current_desc,
-                              std::string *sdp) {
-    const cricket::SessionDescription* desc = current_desc->description();
-    EXPECT_TRUE(current_desc->ToString(sdp));
-
-    const cricket::ContentInfos& contents = desc->contents();
-    cricket::ContentInfos::const_iterator it = contents.begin();
-    // Replace ufrag and pwd lines with empty strings.
-    for (; it != contents.end(); ++it) {
-      const cricket::TransportDescription* transport_desc =
-          desc->GetTransportDescriptionByName(it->name);
-      std::string ufrag_line = "a=ice-ufrag:" + transport_desc->ice_ufrag
-          + "\r\n";
-      std::string pwd_line = "a=ice-pwd:" + transport_desc->ice_pwd
-          + "\r\n";
-      rtc::replace_substrs(ufrag_line.c_str(), ufrag_line.length(),
-                                 "", 0,
-                                 sdp);
-      rtc::replace_substrs(pwd_line.c_str(), pwd_line.length(),
-                                 "", 0,
-                                 sdp);
-    }
-  }
-
-  void SetIceUfragPwd(SessionDescriptionInterface* current_desc,
-                      const std::string& ufrag,
-                      const std::string& pwd) {
-    cricket::SessionDescription* desc = current_desc->description();
-    for (TransportInfo& transport_info : desc->transport_infos()) {
-      cricket::TransportDescription& transport_desc =
-          transport_info.description;
-      transport_desc.ice_ufrag = ufrag;
-      transport_desc.ice_pwd = pwd;
-    }
-  }
-
-  // Sets ufrag/pwd for specified |media_type|.
-  void SetIceUfragPwd(SessionDescriptionInterface* current_desc,
-                      cricket::MediaType media_type,
-                      const std::string& ufrag,
-                      const std::string& pwd) {
-    cricket::SessionDescription* desc = current_desc->description();
-    const cricket::ContentInfo* cinfo =
-        cricket::GetFirstMediaContent(desc->contents(), media_type);
-    TransportInfo* transport_info = desc->GetTransportInfoByName(cinfo->name);
-    cricket::TransportDescription* transport_desc =
-        &transport_info->description;
-    transport_desc->ice_ufrag = ufrag;
-    transport_desc->ice_pwd = pwd;
-  }
-
-  // Creates a remote offer and and applies it as a remote description,
-  // creates a local answer and applies is as a local description.
-  // Call SendAudioVideoStreamX() before this function
-  // to decide which local and remote streams to create.
-  void CreateAndSetRemoteOfferAndLocalAnswer() {
-    SessionDescriptionInterface* offer = CreateRemoteOffer();
-    SetRemoteDescriptionWithoutError(offer);
-    SessionDescriptionInterface* answer = CreateAnswer();
-    SetLocalDescriptionWithoutError(answer);
-  }
-  void SetLocalDescriptionWithoutError(SessionDescriptionInterface* desc) {
-    ASSERT_TRUE(session_->SetLocalDescription(desc, nullptr));
-    session_->MaybeStartGathering();
-  }
-  void SetLocalDescriptionExpectState(SessionDescriptionInterface* desc,
-                                      WebRtcSession::State expected_state) {
-    SetLocalDescriptionWithoutError(desc);
-    EXPECT_EQ(expected_state, session_->state());
-  }
-  void SetLocalDescriptionExpectError(const std::string& action,
-                                      const std::string& expected_error,
-                                      SessionDescriptionInterface* desc) {
-    std::string error;
-    EXPECT_FALSE(session_->SetLocalDescription(desc, &error));
-    std::string sdp_type = "local ";
-    sdp_type.append(action);
-    EXPECT_NE(std::string::npos, error.find(sdp_type));
-    EXPECT_NE(std::string::npos, error.find(expected_error));
-  }
-  void SetLocalDescriptionOfferExpectError(const std::string& expected_error,
-                                           SessionDescriptionInterface* desc) {
-    SetLocalDescriptionExpectError(SessionDescriptionInterface::kOffer,
-                                   expected_error, desc);
-  }
-  void SetLocalDescriptionAnswerExpectError(const std::string& expected_error,
-                                            SessionDescriptionInterface* desc) {
-    SetLocalDescriptionExpectError(SessionDescriptionInterface::kAnswer,
-                                   expected_error, desc);
-  }
-  void SetRemoteDescriptionWithoutError(SessionDescriptionInterface* desc) {
-    ASSERT_TRUE(session_->SetRemoteDescription(desc, nullptr));
-  }
-  void SetRemoteDescriptionExpectState(SessionDescriptionInterface* desc,
-                                       WebRtcSession::State expected_state) {
-    SetRemoteDescriptionWithoutError(desc);
-    EXPECT_EQ(expected_state, session_->state());
-  }
-  void SetRemoteDescriptionExpectError(const std::string& action,
-                                       const std::string& expected_error,
-                                       SessionDescriptionInterface* desc) {
-    std::string error;
-    EXPECT_FALSE(session_->SetRemoteDescription(desc, &error));
-    std::string sdp_type = "remote ";
-    sdp_type.append(action);
-    EXPECT_NE(std::string::npos, error.find(sdp_type));
-    EXPECT_NE(std::string::npos, error.find(expected_error));
-  }
-  void SetRemoteDescriptionOfferExpectError(
-      const std::string& expected_error, SessionDescriptionInterface* desc) {
-    SetRemoteDescriptionExpectError(SessionDescriptionInterface::kOffer,
-                                    expected_error, desc);
-  }
-  void SetRemoteDescriptionPranswerExpectError(
-      const std::string& expected_error, SessionDescriptionInterface* desc) {
-    SetRemoteDescriptionExpectError(SessionDescriptionInterface::kPrAnswer,
-                                    expected_error, desc);
-  }
-  void SetRemoteDescriptionAnswerExpectError(
-      const std::string& expected_error, SessionDescriptionInterface* desc) {
-    SetRemoteDescriptionExpectError(SessionDescriptionInterface::kAnswer,
-                                    expected_error, desc);
-  }
-
-  void CreateCryptoOfferAndNonCryptoAnswer(SessionDescriptionInterface** offer,
-      SessionDescriptionInterface** nocrypto_answer) {
-    // Create a SDP without Crypto.
-    cricket::MediaSessionOptions options;
-    GetOptionsForRemoteOffer(&options);
-    options.bundle_enabled = true;
-    *offer = CreateRemoteOffer(options, cricket::SEC_ENABLED);
-    ASSERT_TRUE(*offer != NULL);
-    VerifyCryptoParams((*offer)->description());
-
-    cricket::MediaSessionOptions answer_options;
-    GetOptionsForRemoteAnswer(&answer_options);
-    *nocrypto_answer =
-        CreateRemoteAnswer(*offer, answer_options, cricket::SEC_DISABLED);
-    EXPECT_TRUE(*nocrypto_answer != NULL);
-  }
-
-  void CreateDtlsOfferAndNonDtlsAnswer(SessionDescriptionInterface** offer,
-      SessionDescriptionInterface** nodtls_answer) {
-    cricket::MediaSessionOptions options;
-    AddMediaSection(cricket::MEDIA_TYPE_AUDIO, cricket::CN_AUDIO,
-                    cricket::MD_RECVONLY, kActive, &options);
-    AddMediaSection(cricket::MEDIA_TYPE_VIDEO, cricket::CN_VIDEO,
-                    cricket::MD_RECVONLY, kActive, &options);
-    options.bundle_enabled = true;
-
-    std::unique_ptr<SessionDescriptionInterface> temp_offer(
-        CreateRemoteOffer(options, cricket::SEC_ENABLED));
-
-    *nodtls_answer =
-        CreateRemoteAnswer(temp_offer.get(), options, cricket::SEC_ENABLED);
-    EXPECT_TRUE(*nodtls_answer != NULL);
-    VerifyFingerprintStatus((*nodtls_answer)->description(), false);
-    VerifyCryptoParams((*nodtls_answer)->description());
-
-    SetFactoryDtlsSrtp();
-    *offer = CreateRemoteOffer(options, cricket::SEC_ENABLED);
-    ASSERT_TRUE(*offer != NULL);
-    VerifyFingerprintStatus((*offer)->description(), true);
-    VerifyCryptoParams((*offer)->description());
-  }
-
-  JsepSessionDescription* CreateRemoteOfferWithVersion(
-        cricket::MediaSessionOptions options,
-        cricket::SecurePolicy secure_policy,
-        const std::string& session_version,
-        const SessionDescriptionInterface* current_desc) {
-    std::string session_id = rtc::ToString(rtc::CreateRandomId64());
-    const cricket::SessionDescription* cricket_desc = NULL;
-    if (current_desc) {
-      cricket_desc = current_desc->description();
-      session_id = current_desc->session_id();
-    }
-
-    desc_factory_->set_secure(secure_policy);
-    JsepSessionDescription* offer(
-        new JsepSessionDescription(JsepSessionDescription::kOffer));
-    if (!offer->Initialize(desc_factory_->CreateOffer(options, cricket_desc),
-                           session_id, session_version)) {
-      delete offer;
-      offer = NULL;
-    }
-    return offer;
-  }
-  JsepSessionDescription* CreateRemoteOffer(
-      cricket::MediaSessionOptions options) {
-    return CreateRemoteOfferWithVersion(options, cricket::SEC_ENABLED,
-                                        kSessionVersion, NULL);
-  }
-  JsepSessionDescription* CreateRemoteOffer(
-      cricket::MediaSessionOptions options, cricket::SecurePolicy sdes_policy) {
-    return CreateRemoteOfferWithVersion(
-        options, sdes_policy, kSessionVersion, NULL);
-  }
-  JsepSessionDescription* CreateRemoteOffer(
-      cricket::MediaSessionOptions options,
-      const SessionDescriptionInterface* current_desc) {
-    return CreateRemoteOfferWithVersion(options, cricket::SEC_ENABLED,
-                                        kSessionVersion, current_desc);
-  }
-
-  SessionDescriptionInterface* CreateRemoteOfferWithSctpPort(
-      const char* sctp_stream_name,
-      int new_port,
-      cricket::MediaSessionOptions options) {
-    options.data_channel_type = cricket::DCT_SCTP;
-    GetOptionsForRemoteOffer(&options);
-    return ChangeSDPSctpPort(new_port, CreateRemoteOffer(options));
-  }
-
-  // Takes ownership of offer_basis (and deletes it).
-  SessionDescriptionInterface* ChangeSDPSctpPort(
-      int new_port,
-      webrtc::SessionDescriptionInterface* offer_basis) {
-    // Stringify the input SDP, swap the 5000 for 'new_port' and create a new
-    // SessionDescription from the mutated string.
-    const char* default_port_str = "5000";
-    char new_port_str[16];
-    rtc::sprintfn(new_port_str, sizeof(new_port_str), "%d", new_port);
-    std::string offer_str;
-    offer_basis->ToString(&offer_str);
-    rtc::replace_substrs(default_port_str, strlen(default_port_str),
-                               new_port_str, strlen(new_port_str),
-                               &offer_str);
-    SessionDescriptionInterface* offer =
-        CreateSessionDescription(offer_basis->type(), offer_str, nullptr);
-    delete offer_basis;
-    return offer;
-  }
-
-  // Create a remote offer. Call SendAudioVideoStreamX()
-  // before this function to decide which streams to create.
-  JsepSessionDescription* CreateRemoteOffer() {
-    cricket::MediaSessionOptions options;
-    GetOptionsForRemoteOffer(&options);
-    return CreateRemoteOffer(options, session_->remote_description());
-  }
-
-  JsepSessionDescription* CreateRemoteAnswer(
-      const SessionDescriptionInterface* offer,
-      cricket::MediaSessionOptions options,
-      cricket::SecurePolicy policy) {
-    desc_factory_->set_secure(policy);
-    const std::string session_id =
-        rtc::ToString(rtc::CreateRandomId64());
-    JsepSessionDescription* answer(
-        new JsepSessionDescription(JsepSessionDescription::kAnswer));
-    if (!answer->Initialize(desc_factory_->CreateAnswer(offer->description(),
-                                                        options, NULL),
-                            session_id, kSessionVersion)) {
-      delete answer;
-      answer = NULL;
-    }
-    return answer;
-  }
-
-  JsepSessionDescription* CreateRemoteAnswer(
-      const SessionDescriptionInterface* offer,
-      cricket::MediaSessionOptions options) {
-      return CreateRemoteAnswer(offer, options, cricket::SEC_REQUIRED);
-  }
-
-  // Creates an answer session description.
-  // Call SendAudioVideoStreamX() before this function
-  // to decide which streams to create.
-  JsepSessionDescription* CreateRemoteAnswer(
-      const SessionDescriptionInterface* offer) {
-    cricket::MediaSessionOptions options;
-    GetOptionsForAnswer(&options);
-    options.bundle_enabled = true;
-    return CreateRemoteAnswer(offer, options, cricket::SEC_REQUIRED);
-  }
-
-  void TestSessionCandidatesWithBundleRtcpMux(bool bundle, bool rtcp_mux) {
-    AddInterface(rtc::SocketAddress(kClientAddrHost1, kClientAddrPort));
-    Init();
-    SendAudioVideoStream1();
-
-    PeerConnectionInterface::RTCOfferAnswerOptions options;
-    options.use_rtp_mux = bundle;
-
-    SessionDescriptionInterface* offer = CreateOffer(options);
-    // SetLocalDescription and SetRemoteDescriptions takes ownership of offer
-    // and answer.
-    SetLocalDescriptionWithoutError(offer);
-
-    std::unique_ptr<SessionDescriptionInterface> answer(
-        CreateRemoteAnswer(session_->local_description()));
-    std::string sdp;
-    EXPECT_TRUE(answer->ToString(&sdp));
-
-    size_t expected_candidate_num = 2;
-    if (!rtcp_mux) {
-      // If rtcp_mux is enabled we should expect 4 candidates - host and srflex
-      // for rtp and rtcp.
-      expected_candidate_num = 4;
-      // Disable rtcp-mux from the answer
-      const std::string kRtcpMux = "a=rtcp-mux";
-      const std::string kXRtcpMux = "a=xrtcp-mux";
-      rtc::replace_substrs(kRtcpMux.c_str(), kRtcpMux.length(),
-                                 kXRtcpMux.c_str(), kXRtcpMux.length(),
-                                 &sdp);
-    }
-
-    SessionDescriptionInterface* new_answer = CreateSessionDescription(
-        JsepSessionDescription::kAnswer, sdp, NULL);
-
-    // SetRemoteDescription to enable rtcp mux.
-    SetRemoteDescriptionWithoutError(new_answer);
-    EXPECT_TRUE_WAIT(observer_.oncandidatesready_, kIceCandidatesTimeout);
-    EXPECT_EQ(expected_candidate_num, observer_.mline_0_candidates_.size());
-    if (bundle) {
-      EXPECT_EQ(0, observer_.mline_1_candidates_.size());
-    } else {
-      EXPECT_EQ(expected_candidate_num, observer_.mline_1_candidates_.size());
-    }
-  }
-
-  bool ContainsVideoCodecWithName(const SessionDescriptionInterface* desc,
-                                  const std::string& codec_name) {
-    for (const auto& content : desc->description()->contents()) {
-      if (static_cast<cricket::MediaContentDescription*>(content.description)
-              ->type() == cricket::MEDIA_TYPE_VIDEO) {
-        const auto* mdesc =
-            static_cast<cricket::VideoContentDescription*>(content.description);
-        for (const auto& codec : mdesc->codecs()) {
-          if (codec.name == codec_name) {
-            return true;
-          }
-        }
-      }
-    }
-    return false;
-  }
-  // Helper class to configure loopback network and verify Best
-  // Connection using right IP protocol for TestLoopbackCall
-  // method. LoopbackNetworkManager applies firewall rules to block
-  // all ping traffic once ICE completed, and remove them to observe
-  // ICE reconnected again. This LoopbackNetworkConfiguration struct
-  // verifies the best connection is using the right IP protocol after
-  // initial ICE convergences.
-
-  class LoopbackNetworkConfiguration {
-   public:
-    LoopbackNetworkConfiguration()
-        : test_ipv6_network_(false),
-          test_extra_ipv4_network_(false),
-          best_connection_after_initial_ice_converged_(1, 0) {}
-
-    // Used to track the expected best connection count in each IP protocol.
-    struct ExpectedBestConnection {
-      ExpectedBestConnection(int ipv4_count, int ipv6_count)
-          : ipv4_count_(ipv4_count),
-            ipv6_count_(ipv6_count) {}
-
-      int ipv4_count_;
-      int ipv6_count_;
-    };
-
-    bool test_ipv6_network_;
-    bool test_extra_ipv4_network_;
-    ExpectedBestConnection best_connection_after_initial_ice_converged_;
-
-    void VerifyBestConnectionAfterIceConverge(
-        const rtc::scoped_refptr<FakeMetricsObserver> metrics_observer) const {
-      Verify(metrics_observer, best_connection_after_initial_ice_converged_);
-    }
-
-   private:
-    void Verify(const rtc::scoped_refptr<FakeMetricsObserver> metrics_observer,
-                const ExpectedBestConnection& expected) const {
-      EXPECT_EQ(
-          metrics_observer->GetEnumCounter(webrtc::kEnumCounterAddressFamily,
-                                           webrtc::kBestConnections_IPv4),
-          expected.ipv4_count_);
-      EXPECT_EQ(
-          metrics_observer->GetEnumCounter(webrtc::kEnumCounterAddressFamily,
-                                           webrtc::kBestConnections_IPv6),
-          expected.ipv6_count_);
-      // This is used in the loopback call so there is only single host to host
-      // candidate pair.
-      EXPECT_EQ(metrics_observer->GetEnumCounter(
-                    webrtc::kEnumCounterIceCandidatePairTypeUdp,
-                    webrtc::kIceCandidatePairHostHost),
-                0);
-      EXPECT_EQ(metrics_observer->GetEnumCounter(
-                    webrtc::kEnumCounterIceCandidatePairTypeUdp,
-                    webrtc::kIceCandidatePairHostPublicHostPublic),
-                1);
-    }
-  };
-
-  class LoopbackNetworkManager {
-   public:
-    LoopbackNetworkManager(WebRtcSessionTest* session,
-                           const LoopbackNetworkConfiguration& config)
-        : config_(config) {
-      session->AddInterface(
-          rtc::SocketAddress(kClientAddrHost1, kClientAddrPort));
-      if (config_.test_extra_ipv4_network_) {
-        session->AddInterface(
-            rtc::SocketAddress(kClientAddrHost2, kClientAddrPort));
-      }
-      if (config_.test_ipv6_network_) {
-        session->AddInterface(
-            rtc::SocketAddress(kClientIPv6AddrHost1, kClientAddrPort));
-      }
-    }
-
-    void ApplyFirewallRules(rtc::FirewallSocketServer* fss) {
-      fss->AddRule(false, rtc::FP_ANY, rtc::FD_ANY,
-                   rtc::SocketAddress(kClientAddrHost1, kClientAddrPort));
-      if (config_.test_extra_ipv4_network_) {
-        fss->AddRule(false, rtc::FP_ANY, rtc::FD_ANY,
-                     rtc::SocketAddress(kClientAddrHost2, kClientAddrPort));
-      }
-      if (config_.test_ipv6_network_) {
-        fss->AddRule(false, rtc::FP_ANY, rtc::FD_ANY,
-                     rtc::SocketAddress(kClientIPv6AddrHost1, kClientAddrPort));
-      }
-    }
-
-    void ClearRules(rtc::FirewallSocketServer* fss) { fss->ClearRules(); }
-
-   private:
-    LoopbackNetworkConfiguration config_;
-  };
-
-  // The method sets up a call from the session to itself, in a loopback
-  // arrangement.  It also uses a firewall rule to create a temporary
-  // disconnection, and then a permanent disconnection.
-  // This code is placed in a method so that it can be invoked
-  // by multiple tests with different allocators (e.g. with and without BUNDLE).
-  // While running the call, this method also checks if the session goes through
-  // the correct sequence of ICE states when a connection is established,
-  // broken, and re-established.
-  // The Connection state should go:
-  // New -> Checking -> (Connected) -> Completed -> Disconnected -> Completed
-  //     -> Failed.
-  // The Gathering state should go: New -> Gathering -> Completed.
-
-  void SetupLoopbackCall() {
-    Init();
-    SendAudioVideoStream1();
-    SessionDescriptionInterface* offer = CreateOffer();
-
-    EXPECT_EQ(PeerConnectionInterface::kIceGatheringNew,
-              observer_.ice_gathering_state_);
-    SetLocalDescriptionWithoutError(offer);
-    EXPECT_EQ(PeerConnectionInterface::kIceConnectionNew,
-              observer_.ice_connection_state_);
-    EXPECT_EQ_WAIT(PeerConnectionInterface::kIceGatheringGathering,
-                   observer_.ice_gathering_state_, kIceCandidatesTimeout);
-    EXPECT_TRUE_WAIT(observer_.oncandidatesready_, kIceCandidatesTimeout);
-    EXPECT_EQ_WAIT(PeerConnectionInterface::kIceGatheringComplete,
-                   observer_.ice_gathering_state_, kIceCandidatesTimeout);
-
-    std::string sdp;
-    offer->ToString(&sdp);
-    SessionDescriptionInterface* desc = webrtc::CreateSessionDescription(
-        JsepSessionDescription::kAnswer, sdp, nullptr);
-    ASSERT_TRUE(desc != NULL);
-    SetRemoteDescriptionWithoutError(desc);
-
-    EXPECT_EQ_WAIT(PeerConnectionInterface::kIceConnectionChecking,
-                   observer_.ice_connection_state_, kIceCandidatesTimeout);
-
-    // The ice connection state is "Connected" too briefly to catch in a test.
-    EXPECT_EQ_WAIT(PeerConnectionInterface::kIceConnectionCompleted,
-                   observer_.ice_connection_state_, kIceCandidatesTimeout);
-  }
-
-  void TestLoopbackCall(const LoopbackNetworkConfiguration& config) {
-    LoopbackNetworkManager loopback_network_manager(this, config);
-    SetupLoopbackCall();
-    config.VerifyBestConnectionAfterIceConverge(metrics_observer_);
-    // Adding firewall rule to block ping requests, which should cause
-    // transport channel failure.
-
-    loopback_network_manager.ApplyFirewallRules(fss_.get());
-
-    LOG(LS_INFO) << "Firewall Rules applied";
-    EXPECT_EQ_WAIT(PeerConnectionInterface::kIceConnectionDisconnected,
-                   observer_.ice_connection_state_,
-                   kIceCandidatesTimeout);
-
-    metrics_observer_->Reset();
-
-    // Clearing the rules, session should move back to completed state.
-    loopback_network_manager.ClearRules(fss_.get());
-
-    LOG(LS_INFO) << "Firewall Rules cleared";
-    EXPECT_EQ_WAIT(PeerConnectionInterface::kIceConnectionCompleted,
-                   observer_.ice_connection_state_,
-                   kIceCandidatesTimeout);
-
-    // Now we block ping requests and wait until the ICE connection transitions
-    // to the Failed state.  This will take at least 30 seconds because it must
-    // wait for the Port to timeout.
-    int port_timeout = 30000;
-
-    loopback_network_manager.ApplyFirewallRules(fss_.get());
-    LOG(LS_INFO) << "Firewall Rules applied again";
-    EXPECT_EQ_WAIT(PeerConnectionInterface::kIceConnectionDisconnected,
-                   observer_.ice_connection_state_,
-                   kIceCandidatesTimeout + port_timeout);
-  }
-
-  void TestLoopbackCall() {
-    LoopbackNetworkConfiguration config;
-    TestLoopbackCall(config);
-  }
-
-  void TestPacketOptions() {
-    LoopbackNetworkConfiguration config;
-    LoopbackNetworkManager loopback_network_manager(this, config);
-
-    SetupLoopbackCall();
-
-    // Wait for channel to be ready for sending.
-    EXPECT_TRUE_WAIT(media_engine_->GetVideoChannel(0)->sending(), 100);
-    uint8_t test_packet[15] = {0};
-    rtc::PacketOptions options;
-    options.packet_id = 10;
-    media_engine_->GetVideoChannel(0)
-        ->SendRtp(test_packet, sizeof(test_packet), options);
-
-    const int kPacketTimeout = 2000;
-    EXPECT_EQ_WAIT(10, fake_call_.last_sent_nonnegative_packet_id(),
-                   kPacketTimeout);
-    EXPECT_GT(fake_call_.last_sent_packet().send_time_ms, -1);
-  }
-
-  // Adds CN codecs to FakeMediaEngine and MediaDescriptionFactory.
-  void AddCNCodecs() {
-    const cricket::AudioCodec kCNCodec1(102, "CN", 8000, 0, 1);
-    const cricket::AudioCodec kCNCodec2(103, "CN", 16000, 0, 1);
-
-    // Add kCNCodec for dtmf test.
-    std::vector<cricket::AudioCodec> codecs =
-        media_engine_->audio_send_codecs();
-    codecs.push_back(kCNCodec1);
-    codecs.push_back(kCNCodec2);
-    media_engine_->SetAudioCodecs(codecs);
-    desc_factory_->set_audio_codecs(codecs, codecs);
-  }
-
-  bool VerifyNoCNCodecs(const cricket::ContentInfo* content) {
-    const cricket::ContentDescription* description = content->description;
-    RTC_CHECK(description != NULL);
-    const cricket::AudioContentDescription* audio_content_desc =
-        static_cast<const cricket::AudioContentDescription*>(description);
-    RTC_CHECK(audio_content_desc != NULL);
-    for (size_t i = 0; i < audio_content_desc->codecs().size(); ++i) {
-      if (audio_content_desc->codecs()[i].name == "CN")
-        return false;
-    }
-    return true;
-  }
-
-  void CreateDataChannel() {
-    webrtc::InternalDataChannelInit dci;
-    RTC_CHECK(session_.get());
-    dci.reliable = session_->data_channel_type() == cricket::DCT_SCTP;
-    data_channel_ = DataChannel::Create(
-        session_.get(), session_->data_channel_type(), "datachannel", dci);
-  }
-
-  void SetLocalDescriptionWithDataChannel() {
-    CreateDataChannel();
-    SessionDescriptionInterface* offer = CreateOffer();
-    SetLocalDescriptionWithoutError(offer);
-  }
-
-  void VerifyMultipleAsyncCreateDescription(
-      RTCCertificateGenerationMethod cert_gen_method,
-      CreateSessionDescriptionRequest::Type type) {
-    InitWithDtls(cert_gen_method);
-    VerifyMultipleAsyncCreateDescriptionAfterInit(true, type);
-  }
-
-  void VerifyMultipleAsyncCreateDescriptionIdentityGenFailure(
-      CreateSessionDescriptionRequest::Type type) {
-    InitWithDtlsIdentityGenFail();
-    VerifyMultipleAsyncCreateDescriptionAfterInit(false, type);
-  }
-
-  void VerifyMultipleAsyncCreateDescriptionAfterInit(
-      bool success, CreateSessionDescriptionRequest::Type type) {
-    RTC_CHECK(session_);
-    SetFactoryDtlsSrtp();
-    if (type == CreateSessionDescriptionRequest::kAnswer) {
-      cricket::MediaSessionOptions options;
-      GetOptionsForRemoteOffer(&options);
-      std::unique_ptr<JsepSessionDescription> offer(
-          CreateRemoteOffer(options, cricket::SEC_DISABLED));
-      ASSERT_TRUE(offer.get() != NULL);
-      SetRemoteDescriptionWithoutError(offer.release());
-    }
-
-    PeerConnectionInterface::RTCOfferAnswerOptions options;
-    cricket::MediaSessionOptions offer_session_options;
-    cricket::MediaSessionOptions answer_session_options;
-    GetOptionsForOffer(options, &offer_session_options);
-    GetOptionsForAnswer(&answer_session_options);
-    const int kNumber = 3;
-    rtc::scoped_refptr<WebRtcSessionCreateSDPObserverForTest>
-        observers[kNumber];
-    for (int i = 0; i < kNumber; ++i) {
-      observers[i] = new WebRtcSessionCreateSDPObserverForTest();
-      if (type == CreateSessionDescriptionRequest::kOffer) {
-        session_->CreateOffer(observers[i], options, offer_session_options);
-      } else {
-        session_->CreateAnswer(observers[i], answer_session_options);
-      }
-    }
-
-    WebRtcSessionCreateSDPObserverForTest::State expected_state =
-        success ? WebRtcSessionCreateSDPObserverForTest::kSucceeded :
-                  WebRtcSessionCreateSDPObserverForTest::kFailed;
-
-    for (int i = 0; i < kNumber; ++i) {
-      EXPECT_EQ_WAIT(expected_state, observers[i]->state(), 1000);
-      if (success) {
-        EXPECT_TRUE(observers[i]->description() != NULL);
-      } else {
-        EXPECT_TRUE(observers[i]->description() == NULL);
-      }
-    }
-  }
-
-  void ConfigureAllocatorWithTurn() {
-    cricket::RelayServerConfig turn_server(cricket::RELAY_TURN);
-    cricket::RelayCredentials credentials(kTurnUsername, kTurnPassword);
-    turn_server.credentials = credentials;
-    turn_server.ports.push_back(
-        cricket::ProtocolAddress(kTurnUdpIntAddr, cricket::PROTO_UDP));
-    allocator_->AddTurnServer(turn_server);
-    allocator_->set_step_delay(cricket::kMinimumStepDelay);
-    allocator_->set_flags(cricket::PORTALLOCATOR_DISABLE_TCP);
-  }
-
-  webrtc::RtcEventLogNullImpl event_log_;
-  std::unique_ptr<rtc::VirtualSocketServer> vss_;
-  std::unique_ptr<rtc::FirewallSocketServer> fss_;
-  rtc::AutoSocketServerThread thread_;
-  // |media_engine_| and |data_engine_| are actually owned by
-  // |channel_manager_|.
-  cricket::FakeMediaEngine* media_engine_;
-  cricket::FakeDataEngine* data_engine_;
-  // Actually owned by session_.
-  FakeSctpTransportFactory* fake_sctp_transport_factory_ = nullptr;
-  std::unique_ptr<cricket::ChannelManager> channel_manager_;
-  cricket::FakeCall fake_call_;
-  std::unique_ptr<cricket::TransportDescriptionFactory> tdesc_factory_;
-  std::unique_ptr<cricket::MediaSessionDescriptionFactory> desc_factory_;
-  rtc::SocketAddress stun_socket_addr_;
-  std::unique_ptr<cricket::TestStunServer> stun_server_;
-  cricket::TestTurnServer turn_server_;
-  rtc::FakeNetworkManager network_manager_;
-  std::unique_ptr<cricket::BasicPortAllocator> allocator_;
-  PeerConnectionFactoryInterface::Options options_;
-  PeerConnectionInterface::RTCConfiguration configuration_;
-  std::unique_ptr<WebRtcSessionForTest> session_;
-  MockIceObserver observer_;
-  cricket::FakeVideoMediaChannel* video_channel_;
-  cricket::FakeVoiceMediaChannel* voice_channel_;
-  rtc::scoped_refptr<FakeMetricsObserver> metrics_observer_;
-  // The following flags affect options created for CreateOffer/CreateAnswer.
-  bool send_stream_1_ = false;
-  bool send_stream_2_ = false;
-  bool local_send_audio_ = false;
-  bool local_send_video_ = false;
-  bool local_recv_audio_ = true;
-  bool local_recv_video_ = true;
-  bool remote_send_audio_ = false;
-  bool remote_send_video_ = false;
-  bool remote_recv_audio_ = true;
-  bool remote_recv_video_ = true;
-  std::vector<cricket::MediaDescriptionOptions> offered_media_sections_;
-  rtc::scoped_refptr<DataChannel> data_channel_;
-  // Last values received from data channel creation signal.
-  std::string last_data_channel_label_;
-  InternalDataChannelInit last_data_channel_config_;
-  rtc::CryptoOptions crypto_options_;
-};
-
-TEST_P(WebRtcSessionTest, TestInitializeWithDtls) {
-  InitWithDtls(GetParam());
-  // SDES is disabled when DTLS is on.
-  EXPECT_EQ(cricket::SEC_DISABLED, session_->SdesPolicy());
-}
-
-TEST_F(WebRtcSessionTest, TestInitializeWithoutDtls) {
-  Init();
-  // SDES is required if DTLS is off.
-  EXPECT_EQ(cricket::SEC_REQUIRED, session_->SdesPolicy());
-}
-
-TEST_F(WebRtcSessionTest, TestSessionCandidates) {
-  TestSessionCandidatesWithBundleRtcpMux(false, false);
-}
-
-// Below test cases (TestSessionCandidatesWith*) verify the candidates gathered
-// with rtcp-mux and/or bundle.
-TEST_F(WebRtcSessionTest, TestSessionCandidatesWithRtcpMux) {
-  TestSessionCandidatesWithBundleRtcpMux(false, true);
-}
-
-TEST_F(WebRtcSessionTest, TestSessionCandidatesWithBundleRtcpMux) {
-  TestSessionCandidatesWithBundleRtcpMux(true, true);
-}
-
-TEST_F(WebRtcSessionTest, TestMultihomeCandidates) {
-  AddInterface(rtc::SocketAddress(kClientAddrHost1, kClientAddrPort));
-  AddInterface(rtc::SocketAddress(kClientAddrHost2, kClientAddrPort));
-  Init();
-  SendAudioVideoStream1();
-  InitiateCall();
-  EXPECT_TRUE_WAIT(observer_.oncandidatesready_, kIceCandidatesTimeout);
-  EXPECT_EQ(8u, observer_.mline_0_candidates_.size());
-  EXPECT_EQ(8u, observer_.mline_1_candidates_.size());
-}
-
-TEST_F(WebRtcSessionTest, TestStunError) {
-  rtc::ScopedFakeClock clock;
-
-  AddInterface(rtc::SocketAddress(kClientAddrHost1, kClientAddrPort));
-  AddInterface(rtc::SocketAddress(kClientAddrHost2, kClientAddrPort));
-  fss_->AddRule(false,
-                rtc::FP_UDP,
-                rtc::FD_ANY,
-                rtc::SocketAddress(kClientAddrHost1, kClientAddrPort));
-  Init();
-  SendAudioVideoStream1();
-  InitiateCall();
-  // Since kClientAddrHost1 is blocked, not expecting stun candidates for it.
-  EXPECT_TRUE_SIMULATED_WAIT(observer_.oncandidatesready_,
-                             cricket::STUN_TOTAL_TIMEOUT, clock);
-  EXPECT_EQ(6u, observer_.mline_0_candidates_.size());
-  EXPECT_EQ(6u, observer_.mline_1_candidates_.size());
-  // Destroy session before scoped fake clock goes out of scope to avoid TSan
-  // warning.
-  session_->Close();
-  session_.reset(nullptr);
-}
-
-TEST_F(WebRtcSessionTest, SetSdpFailedOnInvalidSdp) {
-  Init();
-  SessionDescriptionInterface* offer = NULL;
-  // Since |offer| is NULL, there's no way to tell if it's an offer or answer.
-  std::string unknown_action;
-  SetLocalDescriptionExpectError(unknown_action, kInvalidSdp, offer);
-  SetRemoteDescriptionExpectError(unknown_action, kInvalidSdp, offer);
-}
-
-// Test creating offers and receive answers and make sure the
-// media engine creates the expected send and receive streams.
-TEST_F(WebRtcSessionTest, TestCreateSdesOfferReceiveSdesAnswer) {
-  Init();
-  SendAudioVideoStream1();
-  SessionDescriptionInterface* offer = CreateOffer();
-  const std::string session_id_orig = offer->session_id();
-  const std::string session_version_orig = offer->session_version();
-  SetLocalDescriptionWithoutError(offer);
-
-  SendAudioVideoStream2();
-  SessionDescriptionInterface* answer =
-      CreateRemoteAnswer(session_->local_description());
-  SetRemoteDescriptionWithoutError(answer);
-
-  video_channel_ = media_engine_->GetVideoChannel(0);
-  voice_channel_ = media_engine_->GetVoiceChannel(0);
-
-  ASSERT_EQ(1u, video_channel_->recv_streams().size());
-  EXPECT_TRUE(kVideoTrack2 == video_channel_->recv_streams()[0].id);
-
-  ASSERT_EQ(1u, voice_channel_->recv_streams().size());
-  EXPECT_TRUE(kAudioTrack2 == voice_channel_->recv_streams()[0].id);
-
-  ASSERT_EQ(1u, video_channel_->send_streams().size());
-  EXPECT_TRUE(kVideoTrack1 == video_channel_->send_streams()[0].id);
-  ASSERT_EQ(1u, voice_channel_->send_streams().size());
-  EXPECT_TRUE(kAudioTrack1 == voice_channel_->send_streams()[0].id);
-
-  // Create new offer without send streams.
-  SendNothing();
-  offer = CreateOffer();
-
-  // Verify the session id is the same and the session version is
-  // increased.
-  EXPECT_EQ(session_id_orig, offer->session_id());
-  EXPECT_LT(rtc::FromString<uint64_t>(session_version_orig),
-            rtc::FromString<uint64_t>(offer->session_version()));
-
-  SetLocalDescriptionWithoutError(offer);
-  EXPECT_EQ(0u, video_channel_->send_streams().size());
-  EXPECT_EQ(0u, voice_channel_->send_streams().size());
-
-  SendAudioVideoStream2();
-  answer = CreateRemoteAnswer(session_->local_description());
-  SetRemoteDescriptionWithoutError(answer);
-
-  // Make sure the receive streams have not changed.
-  ASSERT_EQ(1u, video_channel_->recv_streams().size());
-  EXPECT_TRUE(kVideoTrack2 == video_channel_->recv_streams()[0].id);
-  ASSERT_EQ(1u, voice_channel_->recv_streams().size());
-  EXPECT_TRUE(kAudioTrack2 == voice_channel_->recv_streams()[0].id);
-}
-
-// Test receiving offers and creating answers and make sure the
-// media engine creates the expected send and receive streams.
-TEST_F(WebRtcSessionTest, TestReceiveSdesOfferCreateSdesAnswer) {
-  Init();
-  SendAudioVideoStream2();
-  SessionDescriptionInterface* offer = CreateOffer();
-  VerifyCryptoParams(offer->description());
-  SetRemoteDescriptionWithoutError(offer);
-
-  SendAudioVideoStream1();
-  SessionDescriptionInterface* answer = CreateAnswer();
-  VerifyCryptoParams(answer->description());
-  SetLocalDescriptionWithoutError(answer);
-
-  const std::string session_id_orig = answer->session_id();
-  const std::string session_version_orig = answer->session_version();
-
-  video_channel_ = media_engine_->GetVideoChannel(0);
-  voice_channel_ = media_engine_->GetVoiceChannel(0);
-
-  ASSERT_TRUE(video_channel_);
-  ASSERT_TRUE(voice_channel_);
-  ASSERT_EQ(1u, video_channel_->recv_streams().size());
-  EXPECT_TRUE(kVideoTrack2 == video_channel_->recv_streams()[0].id);
-
-  ASSERT_EQ(1u, voice_channel_->recv_streams().size());
-  EXPECT_TRUE(kAudioTrack2 == voice_channel_->recv_streams()[0].id);
-
-  ASSERT_EQ(1u, video_channel_->send_streams().size());
-  EXPECT_TRUE(kVideoTrack1 == video_channel_->send_streams()[0].id);
-  ASSERT_EQ(1u, voice_channel_->send_streams().size());
-  EXPECT_TRUE(kAudioTrack1 == voice_channel_->send_streams()[0].id);
-
-  SendAudioVideoStream1And2();
-  offer = CreateOffer();
-  SetRemoteDescriptionWithoutError(offer);
-
-  // Answer by turning off all send streams.
-  SendNothing();
-  answer = CreateAnswer();
-
-  // Verify the session id is the same and the session version is
-  // increased.
-  EXPECT_EQ(session_id_orig, answer->session_id());
-  EXPECT_LT(rtc::FromString<uint64_t>(session_version_orig),
-            rtc::FromString<uint64_t>(answer->session_version()));
-  SetLocalDescriptionWithoutError(answer);
-
-  ASSERT_EQ(2u, video_channel_->recv_streams().size());
-  EXPECT_TRUE(kVideoTrack1 == video_channel_->recv_streams()[0].id);
-  EXPECT_TRUE(kVideoTrack2 == video_channel_->recv_streams()[1].id);
-  ASSERT_EQ(2u, voice_channel_->recv_streams().size());
-  EXPECT_TRUE(kAudioTrack1 == voice_channel_->recv_streams()[0].id);
-  EXPECT_TRUE(kAudioTrack2 == voice_channel_->recv_streams()[1].id);
-
-  // Make sure we have no send streams.
-  EXPECT_EQ(0u, video_channel_->send_streams().size());
-  EXPECT_EQ(0u, voice_channel_->send_streams().size());
-}
-
-TEST_F(WebRtcSessionTest, SetLocalSdpFailedOnCreateChannel) {
-  Init();
-  media_engine_->set_fail_create_channel(true);
-
-  SessionDescriptionInterface* offer = CreateOffer();
-  ASSERT_TRUE(offer != NULL);
-  // SetRemoteDescription and SetLocalDescription will take the ownership of
-  // the offer.
-  SetRemoteDescriptionOfferExpectError(kCreateChannelFailed, offer);
-  offer = CreateOffer();
-  ASSERT_TRUE(offer != NULL);
-  SetLocalDescriptionOfferExpectError(kCreateChannelFailed, offer);
-}
-
-//
-// Tests for creating/setting SDP under different SDES/DTLS polices:
-//
-// --DTLS off and SDES on
-// TestCreateSdesOfferReceiveSdesAnswer/TestReceiveSdesOfferCreateSdesAnswer:
-//     set local/remote offer/answer with crypto --> success
-// TestSetNonSdesOfferWhenSdesOn: set local/remote offer without crypto --->
-//     failure
-// TestSetLocalNonSdesAnswerWhenSdesOn: set local answer without crypto -->
-//     failure
-// TestSetRemoteNonSdesAnswerWhenSdesOn: set remote answer without crypto -->
-//     failure
-//
-// --DTLS on and SDES off
-// TestCreateDtlsOfferReceiveDtlsAnswer/TestReceiveDtlsOfferCreateDtlsAnswer:
-//     set local/remote offer/answer with DTLS fingerprint --> success
-// TestReceiveNonDtlsOfferWhenDtlsOn: set local/remote offer without DTLS
-//     fingerprint --> failure
-// TestSetLocalNonDtlsAnswerWhenDtlsOn: set local answer without fingerprint
-//     --> failure
-// TestSetRemoteNonDtlsAnswerWhenDtlsOn: set remote answer without fingerprint
-//     --> failure
-//
-// --Encryption disabled: DTLS off and SDES off
-// TestCreateOfferReceiveAnswerWithoutEncryption: set local offer and remote
-//     answer without SDES or DTLS --> success
-// TestCreateAnswerReceiveOfferWithoutEncryption: set remote offer and local
-//     answer without SDES or DTLS --> success
-//
-
-// Test that we return a failure when applying a remote/local offer that doesn't
-// have cryptos enabled when DTLS is off.
-TEST_F(WebRtcSessionTest, TestSetNonSdesOfferWhenSdesOn) {
-  Init();
-  cricket::MediaSessionOptions options;
-  GetOptionsForRemoteOffer(&options);
-  JsepSessionDescription* offer = CreateRemoteOffer(
-      options, cricket::SEC_DISABLED);
-  ASSERT_TRUE(offer != NULL);
-  VerifyNoCryptoParams(offer->description(), false);
-  // SetRemoteDescription and SetLocalDescription will take the ownership of
-  // the offer.
-  SetRemoteDescriptionOfferExpectError(kSdpWithoutSdesCrypto, offer);
-  offer = CreateRemoteOffer(options, cricket::SEC_DISABLED);
-  ASSERT_TRUE(offer != NULL);
-  SetLocalDescriptionOfferExpectError(kSdpWithoutSdesCrypto, offer);
-}
-
-// Test that we return a failure when applying a local answer that doesn't have
-// cryptos enabled when DTLS is off.
-TEST_F(WebRtcSessionTest, TestSetLocalNonSdesAnswerWhenSdesOn) {
-  Init();
-  SessionDescriptionInterface* offer = NULL;
-  SessionDescriptionInterface* answer = NULL;
-  CreateCryptoOfferAndNonCryptoAnswer(&offer, &answer);
-  // SetRemoteDescription and SetLocalDescription will take the ownership of
-  // the offer.
-  SetRemoteDescriptionWithoutError(offer);
-  SetLocalDescriptionAnswerExpectError(kSdpWithoutSdesCrypto, answer);
-}
-
-// Test we will return fail when apply an remote answer that doesn't have
-// crypto enabled when DTLS is off.
-TEST_F(WebRtcSessionTest, TestSetRemoteNonSdesAnswerWhenSdesOn) {
-  Init();
-  SessionDescriptionInterface* offer = NULL;
-  SessionDescriptionInterface* answer = NULL;
-  CreateCryptoOfferAndNonCryptoAnswer(&offer, &answer);
-  // SetRemoteDescription and SetLocalDescription will take the ownership of
-  // the offer.
-  SetLocalDescriptionWithoutError(offer);
-  SetRemoteDescriptionAnswerExpectError(kSdpWithoutSdesCrypto, answer);
-}
-
-// Test that we accept an offer with a DTLS fingerprint when DTLS is on
-// and that we return an answer with a DTLS fingerprint.
-TEST_P(WebRtcSessionTest, TestReceiveDtlsOfferCreateDtlsAnswer) {
-  SendAudioVideoStream1();
-  InitWithDtls(GetParam());
-  SetFactoryDtlsSrtp();
-  cricket::MediaSessionOptions options;
-  GetOptionsForRemoteOffer(&options);
-  JsepSessionDescription* offer =
-      CreateRemoteOffer(options, cricket::SEC_DISABLED);
-  ASSERT_TRUE(offer != NULL);
-  VerifyFingerprintStatus(offer->description(), true);
-  VerifyNoCryptoParams(offer->description(), true);
-
-  // SetRemoteDescription will take the ownership of the offer.
-  SetRemoteDescriptionWithoutError(offer);
-
-  // Verify that we get a crypto fingerprint in the answer.
-  SessionDescriptionInterface* answer = CreateAnswer();
-  ASSERT_TRUE(answer != NULL);
-  VerifyFingerprintStatus(answer->description(), true);
-  // Check that we don't have an a=crypto line in the answer.
-  VerifyNoCryptoParams(answer->description(), true);
-
-  // Now set the local description, which should work, even without a=crypto.
-  SetLocalDescriptionWithoutError(answer);
-}
-
-// Test that we set a local offer with a DTLS fingerprint when DTLS is on
-// and then we accept a remote answer with a DTLS fingerprint successfully.
-TEST_P(WebRtcSessionTest, TestCreateDtlsOfferReceiveDtlsAnswer) {
-  SendAudioVideoStream1();
-  InitWithDtls(GetParam());
-  SetFactoryDtlsSrtp();
-
-  // Verify that we get a crypto fingerprint in the answer.
-  SessionDescriptionInterface* offer = CreateOffer();
-  ASSERT_TRUE(offer != NULL);
-  VerifyFingerprintStatus(offer->description(), true);
-  // Check that we don't have an a=crypto line in the offer.
-  VerifyNoCryptoParams(offer->description(), true);
-
-  // Now set the local description, which should work, even without a=crypto.
-  SetLocalDescriptionWithoutError(offer);
-
-  cricket::MediaSessionOptions options;
-  GetOptionsForAnswer(&options);
-  JsepSessionDescription* answer =
-      CreateRemoteAnswer(offer, options, cricket::SEC_DISABLED);
-  ASSERT_TRUE(answer != NULL);
-  VerifyFingerprintStatus(answer->description(), true);
-  VerifyNoCryptoParams(answer->description(), true);
-
-  // SetRemoteDescription will take the ownership of the answer.
-  SetRemoteDescriptionWithoutError(answer);
-}
-
-// Test that if we support DTLS and the other side didn't offer a fingerprint,
-// we will fail to set the remote description.
-TEST_P(WebRtcSessionTest, TestReceiveNonDtlsOfferWhenDtlsOn) {
-  InitWithDtls(GetParam());
-  cricket::MediaSessionOptions options;
-  GetOptionsForRemoteOffer(&options);
-  options.bundle_enabled = true;
-  JsepSessionDescription* offer = CreateRemoteOffer(
-      options, cricket::SEC_REQUIRED);
-  ASSERT_TRUE(offer != NULL);
-  VerifyFingerprintStatus(offer->description(), false);
-  VerifyCryptoParams(offer->description());
-
-  // SetRemoteDescription will take the ownership of the offer.
-  SetRemoteDescriptionOfferExpectError(
-      kSdpWithoutDtlsFingerprint, offer);
-
-  offer = CreateRemoteOffer(options, cricket::SEC_REQUIRED);
-  // SetLocalDescription will take the ownership of the offer.
-  SetLocalDescriptionOfferExpectError(
-      kSdpWithoutDtlsFingerprint, offer);
-}
-
-// Test that we return a failure when applying a local answer that doesn't have
-// a DTLS fingerprint when DTLS is required.
-TEST_P(WebRtcSessionTest, TestSetLocalNonDtlsAnswerWhenDtlsOn) {
-  InitWithDtls(GetParam());
-  SessionDescriptionInterface* offer = NULL;
-  SessionDescriptionInterface* answer = NULL;
-  CreateDtlsOfferAndNonDtlsAnswer(&offer, &answer);
-
-  // SetRemoteDescription and SetLocalDescription will take the ownership of
-  // the offer and answer.
-  SetRemoteDescriptionWithoutError(offer);
-  SetLocalDescriptionAnswerExpectError(
-      kSdpWithoutDtlsFingerprint, answer);
-}
-
-// Test that we return a failure when applying a remote answer that doesn't have
-// a DTLS fingerprint when DTLS is required.
-TEST_P(WebRtcSessionTest, TestSetRemoteNonDtlsAnswerWhenDtlsOn) {
-  InitWithDtls(GetParam());
-  SessionDescriptionInterface* offer = CreateOffer();
-  cricket::MediaSessionOptions offer_options;
-  GetOptionsForRemoteOffer(&offer_options);
-
-  std::unique_ptr<SessionDescriptionInterface> temp_offer(
-      CreateRemoteOffer(offer_options, cricket::SEC_ENABLED));
-
-  cricket::MediaSessionOptions answer_options;
-  GetOptionsForAnswer(&answer_options);
-  JsepSessionDescription* answer = CreateRemoteAnswer(
-      temp_offer.get(), answer_options, cricket::SEC_ENABLED);
-
-  // SetRemoteDescription and SetLocalDescription will take the ownership of
-  // the offer and answer.
-  SetLocalDescriptionWithoutError(offer);
-  SetRemoteDescriptionAnswerExpectError(
-      kSdpWithoutDtlsFingerprint, answer);
-}
-
-// Test that we create a local offer without SDES or DTLS and accept a remote
-// answer without SDES or DTLS when encryption is disabled.
-TEST_P(WebRtcSessionTest, TestCreateOfferReceiveAnswerWithoutEncryption) {
-  SendAudioVideoStream1();
-  options_.disable_encryption = true;
-  InitWithDtls(GetParam());
-
-  // Verify that we get a crypto fingerprint in the answer.
-  SessionDescriptionInterface* offer = CreateOffer();
-  ASSERT_TRUE(offer != NULL);
-  VerifyFingerprintStatus(offer->description(), false);
-  // Check that we don't have an a=crypto line in the offer.
-  VerifyNoCryptoParams(offer->description(), false);
-
-  // Now set the local description, which should work, even without a=crypto.
-  SetLocalDescriptionWithoutError(offer);
-
-  cricket::MediaSessionOptions options;
-  GetOptionsForAnswer(&options);
-  JsepSessionDescription* answer =
-      CreateRemoteAnswer(offer, options, cricket::SEC_DISABLED);
-  ASSERT_TRUE(answer != NULL);
-  VerifyFingerprintStatus(answer->description(), false);
-  VerifyNoCryptoParams(answer->description(), false);
-
-  // SetRemoteDescription will take the ownership of the answer.
-  SetRemoteDescriptionWithoutError(answer);
-}
-
-// Test that we create a local answer without SDES or DTLS and accept a remote
-// offer without SDES or DTLS when encryption is disabled.
-TEST_P(WebRtcSessionTest, TestCreateAnswerReceiveOfferWithoutEncryption) {
-  options_.disable_encryption = true;
-  InitWithDtls(GetParam());
-
-  cricket::MediaSessionOptions options;
-  GetOptionsForRemoteOffer(&options);
-  JsepSessionDescription* offer =
-      CreateRemoteOffer(options, cricket::SEC_DISABLED);
-  ASSERT_TRUE(offer != NULL);
-  VerifyFingerprintStatus(offer->description(), false);
-  VerifyNoCryptoParams(offer->description(), false);
-
-  // SetRemoteDescription will take the ownership of the offer.
-  SetRemoteDescriptionWithoutError(offer);
-
-  // Verify that we get a crypto fingerprint in the answer.
-  SessionDescriptionInterface* answer = CreateAnswer();
-  ASSERT_TRUE(answer != NULL);
-  VerifyFingerprintStatus(answer->description(), false);
-  // Check that we don't have an a=crypto line in the answer.
-  VerifyNoCryptoParams(answer->description(), false);
-
-  // Now set the local description, which should work, even without a=crypto.
-  SetLocalDescriptionWithoutError(answer);
-}
-
-// Test that we can create and set an answer correctly when different
-// SSL roles have been negotiated for different transports.
-// See: https://bugs.chromium.org/p/webrtc/issues/detail?id=4525
-TEST_P(WebRtcSessionTest, TestCreateAnswerWithDifferentSslRoles) {
-  SendAudioVideoStream1();
-  InitWithDtls(GetParam());
-  SetFactoryDtlsSrtp();
-
-  SessionDescriptionInterface* offer = CreateOffer();
-  SetLocalDescriptionWithoutError(offer);
-
-  cricket::MediaSessionOptions options;
-  GetOptionsForAnswer(&options);
-
-  // First, negotiate different SSL roles.
-  SessionDescriptionInterface* answer =
-      CreateRemoteAnswer(offer, options, cricket::SEC_DISABLED);
-  TransportInfo* audio_transport_info =
-      answer->description()->GetTransportInfoByName("audio");
-  audio_transport_info->description.connection_role =
-      cricket::CONNECTIONROLE_ACTIVE;
-  TransportInfo* video_transport_info =
-      answer->description()->GetTransportInfoByName("video");
-  video_transport_info->description.connection_role =
-      cricket::CONNECTIONROLE_PASSIVE;
-  SetRemoteDescriptionWithoutError(answer);
-
-  // Now create an offer in the reverse direction, and ensure the initial
-  // offerer responds with an answer with correct SSL roles.
-  offer = CreateRemoteOfferWithVersion(options, cricket::SEC_DISABLED,
-                                       kSessionVersion,
-                                       session_->remote_description());
-  SetRemoteDescriptionWithoutError(offer);
-
-  cricket::MediaSessionOptions answer_options;
-  answer_options.bundle_enabled = true;
-  answer = CreateAnswer(answer_options);
-  audio_transport_info = answer->description()->GetTransportInfoByName("audio");
-  EXPECT_EQ(cricket::CONNECTIONROLE_PASSIVE,
-            audio_transport_info->description.connection_role);
-  video_transport_info = answer->description()->GetTransportInfoByName("video");
-  EXPECT_EQ(cricket::CONNECTIONROLE_ACTIVE,
-            video_transport_info->description.connection_role);
-  SetLocalDescriptionWithoutError(answer);
-
-  // Lastly, start BUNDLE-ing on "audio", expecting that the "passive" role of
-  // audio is transferred over to video in the answer that completes the BUNDLE
-  // negotiation.
-  options.bundle_enabled = true;
-  offer = CreateRemoteOfferWithVersion(options, cricket::SEC_DISABLED,
-                                       kSessionVersion,
-                                       session_->remote_description());
-  SetRemoteDescriptionWithoutError(offer);
-  answer = CreateAnswer(answer_options);
-  audio_transport_info = answer->description()->GetTransportInfoByName("audio");
-  EXPECT_EQ(cricket::CONNECTIONROLE_PASSIVE,
-            audio_transport_info->description.connection_role);
-  video_transport_info = answer->description()->GetTransportInfoByName("video");
-  EXPECT_EQ(cricket::CONNECTIONROLE_PASSIVE,
-            video_transport_info->description.connection_role);
-  SetLocalDescriptionWithoutError(answer);
-}
-
-TEST_F(WebRtcSessionTest, TestSetLocalOfferTwice) {
-  Init();
-  SendNothing();
-  // SetLocalDescription take ownership of offer.
-  SessionDescriptionInterface* offer = CreateOffer();
-  SetLocalDescriptionWithoutError(offer);
-
-  // SetLocalDescription take ownership of offer.
-  SessionDescriptionInterface* offer2 = CreateOffer();
-  SetLocalDescriptionWithoutError(offer2);
-}
-
-TEST_F(WebRtcSessionTest, TestSetRemoteOfferTwice) {
-  Init();
-  SendNothing();
-  // SetLocalDescription take ownership of offer.
-  SessionDescriptionInterface* offer = CreateOffer();
-  SetRemoteDescriptionWithoutError(offer);
-
-  SessionDescriptionInterface* offer2 = CreateOffer();
-  SetRemoteDescriptionWithoutError(offer2);
-}
-
-TEST_F(WebRtcSessionTest, TestSetLocalAndRemoteOffer) {
-  Init();
-  SendNothing();
-  SessionDescriptionInterface* offer = CreateOffer();
-  SetLocalDescriptionWithoutError(offer);
-  offer = CreateOffer();
-  SetRemoteDescriptionOfferExpectError("Called in wrong state: STATE_SENTOFFER",
-                                       offer);
-}
-
-TEST_F(WebRtcSessionTest, TestSetRemoteAndLocalOffer) {
-  Init();
-  SendNothing();
-  SessionDescriptionInterface* offer = CreateOffer();
-  SetRemoteDescriptionWithoutError(offer);
-  offer = CreateOffer();
-  SetLocalDescriptionOfferExpectError(
-      "Called in wrong state: STATE_RECEIVEDOFFER", offer);
-}
-
-TEST_F(WebRtcSessionTest, TestSetLocalPrAnswer) {
-  Init();
-  SendNothing();
-  SessionDescriptionInterface* offer = CreateRemoteOffer();
-  SetRemoteDescriptionExpectState(offer, WebRtcSession::STATE_RECEIVEDOFFER);
-
-  JsepSessionDescription* pranswer =
-      static_cast<JsepSessionDescription*>(CreateAnswer());
-  pranswer->set_type(SessionDescriptionInterface::kPrAnswer);
-  SetLocalDescriptionExpectState(pranswer, WebRtcSession::STATE_SENTPRANSWER);
-
-  SendAudioVideoStream1();
-  JsepSessionDescription* pranswer2 =
-      static_cast<JsepSessionDescription*>(CreateAnswer());
-  pranswer2->set_type(SessionDescriptionInterface::kPrAnswer);
-
-  SetLocalDescriptionExpectState(pranswer2, WebRtcSession::STATE_SENTPRANSWER);
-
-  SendAudioVideoStream2();
-  SessionDescriptionInterface* answer = CreateAnswer();
-  SetLocalDescriptionExpectState(answer, WebRtcSession::STATE_INPROGRESS);
-}
-
-TEST_F(WebRtcSessionTest, TestSetRemotePrAnswer) {
-  Init();
-  SendNothing();
-  SessionDescriptionInterface* offer = CreateOffer();
-  SetLocalDescriptionExpectState(offer, WebRtcSession::STATE_SENTOFFER);
-
-  JsepSessionDescription* pranswer =
-      CreateRemoteAnswer(session_->local_description());
-  pranswer->set_type(SessionDescriptionInterface::kPrAnswer);
-
-  SetRemoteDescriptionExpectState(pranswer,
-                                  WebRtcSession::STATE_RECEIVEDPRANSWER);
-
-  SendAudioVideoStream1();
-  JsepSessionDescription* pranswer2 =
-      CreateRemoteAnswer(session_->local_description());
-  pranswer2->set_type(SessionDescriptionInterface::kPrAnswer);
-
-  SetRemoteDescriptionExpectState(pranswer2,
-                                  WebRtcSession::STATE_RECEIVEDPRANSWER);
-
-  SendAudioVideoStream2();
-  SessionDescriptionInterface* answer =
-      CreateRemoteAnswer(session_->local_description());
-  SetRemoteDescriptionExpectState(answer, WebRtcSession::STATE_INPROGRESS);
-}
-
-TEST_F(WebRtcSessionTest, TestSetLocalAnswerWithoutOffer) {
-  Init();
-  SendNothing();
-  std::unique_ptr<SessionDescriptionInterface> offer(CreateOffer());
-
-  SessionDescriptionInterface* answer =
-      CreateRemoteAnswer(offer.get());
-  SetLocalDescriptionAnswerExpectError("Called in wrong state: STATE_INIT",
-                                       answer);
-}
-
-TEST_F(WebRtcSessionTest, TestSetRemoteAnswerWithoutOffer) {
-  Init();
-  SendNothing();
-  std::unique_ptr<SessionDescriptionInterface> offer(CreateOffer());
-
-  SessionDescriptionInterface* answer =
-      CreateRemoteAnswer(offer.get());
-  SetRemoteDescriptionAnswerExpectError(
-      "Called in wrong state: STATE_INIT", answer);
-}
-
-// Tests that the remote candidates are added and removed successfully.
-TEST_F(WebRtcSessionTest, TestAddAndRemoveRemoteCandidates) {
-  Init();
-  SendAudioVideoStream1();
-
-  cricket::Candidate candidate(1, "udp", rtc::SocketAddress("1.1.1.1", 5000), 0,
-                               "", "", "local", 0, "");
-  candidate.set_transport_name("audio");
-  JsepIceCandidate ice_candidate1(kMediaContentName0, 0, candidate);
-
-  // Fail since we have not set a remote description.
-  EXPECT_FALSE(session_->ProcessIceMessage(&ice_candidate1));
-
-  SessionDescriptionInterface* offer = CreateOffer();
-  SetLocalDescriptionWithoutError(offer);
-
-  // Fail since we have not set a remote description.
-  EXPECT_FALSE(session_->ProcessIceMessage(&ice_candidate1));
-
-  SessionDescriptionInterface* answer = CreateRemoteAnswer(
-      session_->local_description());
-  SetRemoteDescriptionWithoutError(answer);
-
-  EXPECT_TRUE(session_->ProcessIceMessage(&ice_candidate1));
-  candidate.set_component(2);
-  candidate.set_address(rtc::SocketAddress("2.2.2.2", 6000));
-  JsepIceCandidate ice_candidate2(kMediaContentName0, 0, candidate);
-  EXPECT_TRUE(session_->ProcessIceMessage(&ice_candidate2));
-
-  // Verifying the candidates are copied properly from internal vector.
-  const SessionDescriptionInterface* remote_desc =
-      session_->remote_description();
-  ASSERT_TRUE(remote_desc != NULL);
-  ASSERT_EQ(2u, remote_desc->number_of_mediasections());
-  const IceCandidateCollection* candidates =
-      remote_desc->candidates(kMediaContentIndex0);
-  ASSERT_EQ(2u, candidates->count());
-  EXPECT_EQ(kMediaContentIndex0, candidates->at(0)->sdp_mline_index());
-  EXPECT_EQ(kMediaContentName0, candidates->at(0)->sdp_mid());
-  EXPECT_EQ(1, candidates->at(0)->candidate().component());
-  EXPECT_EQ(2, candidates->at(1)->candidate().component());
-
-  // |ice_candidate3| is identical to |ice_candidate2|.  It can be added
-  // successfully, but the total count of candidates will not increase.
-  candidate.set_component(2);
-  JsepIceCandidate ice_candidate3(kMediaContentName0, 0, candidate);
-  EXPECT_TRUE(session_->ProcessIceMessage(&ice_candidate3));
-  ASSERT_EQ(2u, candidates->count());
-
-  JsepIceCandidate bad_ice_candidate("bad content name", 99, candidate);
-  EXPECT_FALSE(session_->ProcessIceMessage(&bad_ice_candidate));
-
-  // Remove candidate1 and candidate2
-  std::vector<cricket::Candidate> remote_candidates;
-  remote_candidates.push_back(ice_candidate1.candidate());
-  remote_candidates.push_back(ice_candidate2.candidate());
-  EXPECT_TRUE(session_->RemoveRemoteIceCandidates(remote_candidates));
-  EXPECT_EQ(0u, candidates->count());
-}
-
-// Tests that a remote candidate is added to the remote session description and
-// that it is retained if the remote session description is changed.
-TEST_F(WebRtcSessionTest, TestRemoteCandidatesAddedToSessionDescription) {
-  Init();
-  cricket::Candidate candidate1;
-  candidate1.set_component(1);
-  JsepIceCandidate ice_candidate1(kMediaContentName0, kMediaContentIndex0,
-                                  candidate1);
-  SendAudioVideoStream1();
-  CreateAndSetRemoteOfferAndLocalAnswer();
-
-  EXPECT_TRUE(session_->ProcessIceMessage(&ice_candidate1));
-  const SessionDescriptionInterface* remote_desc =
-      session_->remote_description();
-  ASSERT_TRUE(remote_desc != NULL);
-  ASSERT_EQ(2u, remote_desc->number_of_mediasections());
-  const IceCandidateCollection* candidates =
-      remote_desc->candidates(kMediaContentIndex0);
-  ASSERT_EQ(1u, candidates->count());
-  EXPECT_EQ(kMediaContentIndex0, candidates->at(0)->sdp_mline_index());
-
-  // Update the RemoteSessionDescription with a new session description and
-  // a candidate and check that the new remote session description contains both
-  // candidates.
-  SessionDescriptionInterface* offer = CreateRemoteOffer();
-  cricket::Candidate candidate2;
-  JsepIceCandidate ice_candidate2(kMediaContentName0, kMediaContentIndex0,
-                                  candidate2);
-  EXPECT_TRUE(offer->AddCandidate(&ice_candidate2));
-  SetRemoteDescriptionWithoutError(offer);
-
-  remote_desc = session_->remote_description();
-  ASSERT_TRUE(remote_desc != NULL);
-  ASSERT_EQ(2u, remote_desc->number_of_mediasections());
-  candidates = remote_desc->candidates(kMediaContentIndex0);
-  ASSERT_EQ(2u, candidates->count());
-  EXPECT_EQ(kMediaContentIndex0, candidates->at(0)->sdp_mline_index());
-  // Username and password have be updated with the TransportInfo of the
-  // SessionDescription, won't be equal to the original one.
-  candidate2.set_username(candidates->at(0)->candidate().username());
-  candidate2.set_password(candidates->at(0)->candidate().password());
-  EXPECT_TRUE(candidate2.IsEquivalent(candidates->at(0)->candidate()));
-  EXPECT_EQ(kMediaContentIndex0, candidates->at(1)->sdp_mline_index());
-  // No need to verify the username and password.
-  candidate1.set_username(candidates->at(1)->candidate().username());
-  candidate1.set_password(candidates->at(1)->candidate().password());
-  EXPECT_TRUE(candidate1.IsEquivalent(candidates->at(1)->candidate()));
-
-  // Test that the candidate is ignored if we can add the same candidate again.
-  EXPECT_TRUE(session_->ProcessIceMessage(&ice_candidate2));
-}
-
-// Test that local candidates are added to the local session description and
-// that they are retained if the local session description is changed. And if
-// continual gathering is enabled, they are removed from the local session
-// description when the network is down.
-TEST_F(WebRtcSessionTest,
-       TestLocalCandidatesAddedAndRemovedIfGatherContinually) {
-  AddInterface(rtc::SocketAddress(kClientAddrHost1, kClientAddrPort));
-  Init();
-  // Enable Continual Gathering.
-  cricket::IceConfig config;
-  config.continual_gathering_policy = cricket::GATHER_CONTINUALLY;
-  session_->SetIceConfig(config);
-  SendAudioVideoStream1();
-  CreateAndSetRemoteOfferAndLocalAnswer();
-
-  const SessionDescriptionInterface* local_desc = session_->local_description();
-  const IceCandidateCollection* candidates =
-      local_desc->candidates(kMediaContentIndex0);
-  ASSERT_TRUE(candidates != NULL);
-  EXPECT_EQ(0u, candidates->count());
-
-  // Since we're using continual gathering, we won't get "gathering done".
-  EXPECT_EQ_WAIT(2u, candidates->count(), kIceCandidatesTimeout);
-
-  local_desc = session_->local_description();
-  candidates = local_desc->candidates(kMediaContentIndex0);
-  ASSERT_TRUE(candidates != NULL);
-  EXPECT_LT(0u, candidates->count());
-  candidates = local_desc->candidates(1);
-  ASSERT_TRUE(candidates != NULL);
-  EXPECT_EQ(0u, candidates->count());
-
-  // Update the session descriptions.
-  SendAudioVideoStream1();
-  CreateAndSetRemoteOfferAndLocalAnswer();
-
-  local_desc = session_->local_description();
-  candidates = local_desc->candidates(kMediaContentIndex0);
-  ASSERT_TRUE(candidates != NULL);
-  EXPECT_LT(0u, candidates->count());
-  candidates = local_desc->candidates(1);
-  ASSERT_TRUE(candidates != NULL);
-  EXPECT_EQ(0u, candidates->count());
-
-  candidates = local_desc->candidates(kMediaContentIndex0);
-  size_t num_local_candidates = candidates->count();
-  // Bring down the network interface to trigger candidate removals.
-  RemoveInterface(rtc::SocketAddress(kClientAddrHost1, kClientAddrPort));
-  // Verify that all local candidates are removed.
-  EXPECT_EQ(0, observer_.num_candidates_removed_);
-  EXPECT_EQ_WAIT(num_local_candidates, observer_.num_candidates_removed_,
-                 kIceCandidatesTimeout);
-  EXPECT_EQ_WAIT(0u, candidates->count(), kIceCandidatesTimeout);
-}
-
-// Tests that if continual gathering is disabled, local candidates won't be
-// removed when the interface is turned down.
-TEST_F(WebRtcSessionTest, TestLocalCandidatesNotRemovedIfNotGatherContinually) {
-  AddInterface(rtc::SocketAddress(kClientAddrHost1, kClientAddrPort));
-  Init();
-  SendAudioVideoStream1();
-  CreateAndSetRemoteOfferAndLocalAnswer();
-
-  const SessionDescriptionInterface* local_desc = session_->local_description();
-  const IceCandidateCollection* candidates =
-      local_desc->candidates(kMediaContentIndex0);
-  ASSERT_TRUE(candidates != NULL);
-  EXPECT_TRUE_WAIT(observer_.oncandidatesready_, kIceCandidatesTimeout);
-
-  size_t num_local_candidates = candidates->count();
-  EXPECT_LT(0u, num_local_candidates);
-  // By default, Continual Gathering is disabled.
-  // Bring down the network interface.
-  RemoveInterface(rtc::SocketAddress(kClientAddrHost1, kClientAddrPort));
-  // Verify that the local candidates are not removed.
-  rtc::Thread::Current()->ProcessMessages(1000);
-  EXPECT_EQ(0, observer_.num_candidates_removed_);
-  EXPECT_EQ(num_local_candidates, candidates->count());
-}
-
-// Test that we can set a remote session description with remote candidates.
-TEST_F(WebRtcSessionTest, TestSetRemoteSessionDescriptionWithCandidates) {
-  Init();
-
-  cricket::Candidate candidate1;
-  candidate1.set_component(1);
-  JsepIceCandidate ice_candidate(kMediaContentName0, kMediaContentIndex0,
-                                 candidate1);
-  SendAudioVideoStream1();
-  SessionDescriptionInterface* offer = CreateOffer();
-
-  EXPECT_TRUE(offer->AddCandidate(&ice_candidate));
-  SetRemoteDescriptionWithoutError(offer);
-
-  const SessionDescriptionInterface* remote_desc =
-      session_->remote_description();
-  ASSERT_TRUE(remote_desc != NULL);
-  ASSERT_EQ(2u, remote_desc->number_of_mediasections());
-  const IceCandidateCollection* candidates =
-      remote_desc->candidates(kMediaContentIndex0);
-  ASSERT_EQ(1u, candidates->count());
-  EXPECT_EQ(kMediaContentIndex0, candidates->at(0)->sdp_mline_index());
-
-  SessionDescriptionInterface* answer = CreateAnswer();
-  SetLocalDescriptionWithoutError(answer);
-}
-
-// Test that offers and answers contains ice candidates when Ice candidates have
-// been gathered.
-TEST_F(WebRtcSessionTest, TestSetLocalAndRemoteDescriptionWithCandidates) {
-  AddInterface(rtc::SocketAddress(kClientAddrHost1, kClientAddrPort));
-  Init();
-  SendAudioVideoStream1();
-  // Ice is started but candidates are not provided until SetLocalDescription
-  // is called.
-  EXPECT_EQ(0u, observer_.mline_0_candidates_.size());
-  EXPECT_EQ(0u, observer_.mline_1_candidates_.size());
-  CreateAndSetRemoteOfferAndLocalAnswer();
-  // Wait until at least one local candidate has been collected.
-  EXPECT_TRUE_WAIT(0u < observer_.mline_0_candidates_.size(),
-                   kIceCandidatesTimeout);
-
-  std::unique_ptr<SessionDescriptionInterface> local_offer(CreateOffer());
-
-  ASSERT_TRUE(local_offer);
-  ASSERT_TRUE(local_offer->candidates(kMediaContentIndex0) != NULL);
-  EXPECT_LT(0u, local_offer->candidates(kMediaContentIndex0)->count());
-
-  SessionDescriptionInterface* remote_offer(CreateRemoteOffer());
-  SetRemoteDescriptionWithoutError(remote_offer);
-  SessionDescriptionInterface* answer = CreateAnswer();
-  ASSERT_TRUE(answer->candidates(kMediaContentIndex0) != NULL);
-  EXPECT_LT(0u, answer->candidates(kMediaContentIndex0)->count());
-  SetLocalDescriptionWithoutError(answer);
-}
-
-// Verifies TransportProxy and media channels are created with content names
-// present in the SessionDescription.
-TEST_F(WebRtcSessionTest, TestChannelCreationsWithContentNames) {
-  Init();
-  SendAudioVideoStream1();
-  std::unique_ptr<SessionDescriptionInterface> offer(CreateOffer());
-
-  // CreateOffer creates session description with the content names "audio" and
-  // "video". Goal is to modify these content names and verify transport
-  // channels
-  // in the WebRtcSession, as channels are created with the content names
-  // present in SDP.
-  std::string sdp;
-  EXPECT_TRUE(offer->ToString(&sdp));
-
-  SessionDescriptionInterface* modified_offer =
-      CreateSessionDescription(JsepSessionDescription::kOffer, sdp, NULL);
-
-  SetRemoteDescriptionWithoutError(modified_offer);
-
-  cricket::MediaSessionOptions answer_options;
-  answer_options.bundle_enabled = false;
-  SessionDescriptionInterface* answer = CreateAnswer(answer_options);
-  SetLocalDescriptionWithoutError(answer);
-
-  rtc::PacketTransportInternal* voice_transport_channel =
-      session_->voice_rtp_transport_channel();
-  EXPECT_TRUE(voice_transport_channel != NULL);
-  EXPECT_EQ(voice_transport_channel->debug_name(),
-            "audio " + std::to_string(cricket::ICE_CANDIDATE_COMPONENT_RTP));
-  rtc::PacketTransportInternal* video_transport_channel =
-      session_->video_rtp_transport_channel();
-  ASSERT_TRUE(video_transport_channel != NULL);
-  EXPECT_EQ(video_transport_channel->debug_name(),
-            "video " + std::to_string(cricket::ICE_CANDIDATE_COMPONENT_RTP));
-  EXPECT_TRUE((video_channel_ = media_engine_->GetVideoChannel(0)) != NULL);
-  EXPECT_TRUE((voice_channel_ = media_engine_->GetVoiceChannel(0)) != NULL);
-}
-
-// Test that an offer contains the correct media content descriptions based on
-// the send streams when no constraints have been set.
-TEST_F(WebRtcSessionTest, CreateOfferWithoutConstraintsOrStreams) {
-  Init();
-  std::unique_ptr<SessionDescriptionInterface> offer(CreateOffer());
-
-  ASSERT_TRUE(offer != NULL);
-  const cricket::ContentInfo* content =
-      cricket::GetFirstAudioContent(offer->description());
-  ASSERT_TRUE(content != NULL);
-  EXPECT_EQ(
-      cricket::MD_RECVONLY,
-      static_cast<const cricket::AudioContentDescription*>(content->description)
-          ->direction());
-  content = cricket::GetFirstVideoContent(offer->description());
-  ASSERT_TRUE(content != NULL);
-  EXPECT_EQ(
-      cricket::MD_RECVONLY,
-      static_cast<const cricket::VideoContentDescription*>(content->description)
-          ->direction());
-}
-
-// Test that an offer contains the correct media content descriptions based on
-// the send streams when no constraints have been set.
-TEST_F(WebRtcSessionTest, CreateOfferWithoutConstraints) {
-  Init();
-  // Test Audio only offer.
-  SendAudioOnlyStream2();
-  std::unique_ptr<SessionDescriptionInterface> offer(CreateOffer());
-
-  const cricket::ContentInfo* content =
-      cricket::GetFirstAudioContent(offer->description());
-  ASSERT_TRUE(content != NULL);
-  EXPECT_EQ(
-      cricket::MD_SENDRECV,
-      static_cast<const cricket::AudioContentDescription*>(content->description)
-          ->direction());
-  content = cricket::GetFirstVideoContent(offer->description());
-  ASSERT_TRUE(content != NULL);
-  EXPECT_EQ(
-      cricket::MD_RECVONLY,
-      static_cast<const cricket::VideoContentDescription*>(content->description)
-          ->direction());
-
-  // Test Audio / Video offer.
-  SendAudioVideoStream1();
-  offer.reset(CreateOffer());
-  content = cricket::GetFirstAudioContent(offer->description());
-  ASSERT_TRUE(content != NULL);
-  EXPECT_EQ(
-      cricket::MD_SENDRECV,
-      static_cast<const cricket::AudioContentDescription*>(content->description)
-          ->direction());
-
-  content = cricket::GetFirstVideoContent(offer->description());
-  ASSERT_TRUE(content != NULL);
-  EXPECT_EQ(
-      cricket::MD_SENDRECV,
-      static_cast<const cricket::VideoContentDescription*>(content->description)
-          ->direction());
-}
-
-// Test that an offer contains no media content descriptions if
-// kOfferToReceiveVideo and kOfferToReceiveAudio constraints are set to false.
-TEST_F(WebRtcSessionTest, CreateOfferWithConstraintsWithoutStreams) {
-  Init();
-  PeerConnectionInterface::RTCOfferAnswerOptions options;
-  options.offer_to_receive_audio = 0;
-  options.offer_to_receive_video = 0;
-
-  std::unique_ptr<SessionDescriptionInterface> offer(CreateOffer(options));
-
-  ASSERT_TRUE(offer != NULL);
-  const cricket::ContentInfo* content =
-      cricket::GetFirstAudioContent(offer->description());
-  EXPECT_TRUE(content == NULL);
-  content = cricket::GetFirstVideoContent(offer->description());
-  EXPECT_TRUE(content == NULL);
-}
-
-// Test that an offer contains only audio media content descriptions if
-// kOfferToReceiveAudio constraints are set to true.
-TEST_F(WebRtcSessionTest, CreateAudioOnlyOfferWithConstraints) {
-  Init();
-  PeerConnectionInterface::RTCOfferAnswerOptions options;
-  options.offer_to_receive_audio =
-      RTCOfferAnswerOptions::kOfferToReceiveMediaTrue;
-  options.offer_to_receive_video = 0;
-
-  std::unique_ptr<SessionDescriptionInterface> offer(CreateOffer(options));
-
-  const cricket::ContentInfo* content =
-      cricket::GetFirstAudioContent(offer->description());
-  EXPECT_TRUE(content != NULL);
-  content = cricket::GetFirstVideoContent(offer->description());
-  EXPECT_TRUE(content == NULL);
-}
-
-// Test that an offer contains audio and video media content descriptions if
-// kOfferToReceiveAudio and kOfferToReceiveVideo constraints are set to true.
-TEST_F(WebRtcSessionTest, CreateOfferWithConstraints) {
-  Init();
-  // Test Audio / Video offer.
-  PeerConnectionInterface::RTCOfferAnswerOptions options;
-  options.offer_to_receive_audio =
-      RTCOfferAnswerOptions::kOfferToReceiveMediaTrue;
-  options.offer_to_receive_video =
-      RTCOfferAnswerOptions::kOfferToReceiveMediaTrue;
-
-  std::unique_ptr<SessionDescriptionInterface> offer(CreateOffer(options));
-
-  const cricket::ContentInfo* content =
-      cricket::GetFirstAudioContent(offer->description());
-  EXPECT_TRUE(content != NULL);
-
-  content = cricket::GetFirstVideoContent(offer->description());
-  EXPECT_TRUE(content != NULL);
-
-  // Sets constraints to false and verifies that audio/video contents are
-  // removed.
-  options.offer_to_receive_audio = 0;
-  options.offer_to_receive_video = 0;
-  // Remove the media sections added in previous offer.
-  offered_media_sections_.clear();
-  offer.reset(CreateOffer(options));
-
-  content = cricket::GetFirstAudioContent(offer->description());
-  EXPECT_TRUE(content == NULL);
-  content = cricket::GetFirstVideoContent(offer->description());
-  EXPECT_TRUE(content == NULL);
-}
-
-// Test that an answer can not be created if the last remote description is not
-// an offer.
-TEST_F(WebRtcSessionTest, CreateAnswerWithoutAnOffer) {
-  Init();
-  SessionDescriptionInterface* offer = CreateOffer();
-  SetLocalDescriptionWithoutError(offer);
-  SessionDescriptionInterface* answer = CreateRemoteAnswer(offer);
-  SetRemoteDescriptionWithoutError(answer);
-  EXPECT_TRUE(CreateAnswer() == NULL);
-}
-
-// Test that an answer contains the correct media content descriptions when no
-// constraints have been set.
-TEST_F(WebRtcSessionTest, CreateAnswerWithoutConstraintsOrStreams) {
-  Init();
-  // Create a remote offer with audio and video content.
-  std::unique_ptr<JsepSessionDescription> offer(CreateRemoteOffer());
-  SetRemoteDescriptionWithoutError(offer.release());
-  std::unique_ptr<SessionDescriptionInterface> answer(CreateAnswer());
-  const cricket::ContentInfo* content =
-      cricket::GetFirstAudioContent(answer->description());
-  ASSERT_TRUE(content != NULL);
-  EXPECT_FALSE(content->rejected);
-
-  content = cricket::GetFirstVideoContent(answer->description());
-  ASSERT_TRUE(content != NULL);
-  EXPECT_FALSE(content->rejected);
-}
-
-// Test that an answer contains the correct media content descriptions when no
-// constraints have been set and the offer only contain audio.
-TEST_F(WebRtcSessionTest, CreateAudioAnswerWithoutConstraintsOrStreams) {
-  Init();
-  // Create a remote offer with audio only.
-  cricket::MediaSessionOptions options;
-  GetOptionsForAudioOnlyRemoteOffer(&options);
-
-  std::unique_ptr<JsepSessionDescription> offer(CreateRemoteOffer(options));
-  ASSERT_TRUE(cricket::GetFirstVideoContent(offer->description()) == NULL);
-  ASSERT_TRUE(cricket::GetFirstAudioContent(offer->description()) != NULL);
-
-  SetRemoteDescriptionWithoutError(offer.release());
-  std::unique_ptr<SessionDescriptionInterface> answer(CreateAnswer());
-  const cricket::ContentInfo* content =
-      cricket::GetFirstAudioContent(answer->description());
-  ASSERT_TRUE(content != NULL);
-  EXPECT_FALSE(content->rejected);
-
-  EXPECT_TRUE(cricket::GetFirstVideoContent(answer->description()) == NULL);
-}
-
-// Test that an answer contains the correct media content descriptions when no
-// constraints have been set.
-TEST_F(WebRtcSessionTest, CreateAnswerWithoutConstraints) {
-  Init();
-  // Create a remote offer with audio and video content.
-  std::unique_ptr<JsepSessionDescription> offer(CreateRemoteOffer());
-  SetRemoteDescriptionWithoutError(offer.release());
-  // Test with a stream with tracks.
-  SendAudioVideoStream1();
-  std::unique_ptr<SessionDescriptionInterface> answer(CreateAnswer());
-  const cricket::ContentInfo* content =
-      cricket::GetFirstAudioContent(answer->description());
-  ASSERT_TRUE(content != NULL);
-  EXPECT_FALSE(content->rejected);
-
-  content = cricket::GetFirstVideoContent(answer->description());
-  ASSERT_TRUE(content != NULL);
-  EXPECT_FALSE(content->rejected);
-}
-
-// Test that an answer contains the correct media content descriptions when
-// constraints have been set but no stream is sent.
-TEST_F(WebRtcSessionTest, CreateAnswerWithConstraintsWithoutStreams) {
-  Init();
-  // Create a remote offer with audio and video content.
-  std::unique_ptr<JsepSessionDescription> offer(CreateRemoteOffer());
-  SetRemoteDescriptionWithoutError(offer.release());
-
-  cricket::MediaSessionOptions session_options;
-  remote_send_audio_ = false;
-  remote_send_video_ = false;
-  local_recv_audio_ = false;
-  local_recv_video_ = false;
-  std::unique_ptr<SessionDescriptionInterface> answer(
-      CreateAnswer(session_options));
-
-  const cricket::ContentInfo* content =
-      cricket::GetFirstAudioContent(answer->description());
-  ASSERT_TRUE(content != NULL);
-  EXPECT_TRUE(content->rejected);
-
-  content = cricket::GetFirstVideoContent(answer->description());
-  ASSERT_TRUE(content != NULL);
-  EXPECT_TRUE(content->rejected);
-}
-
-// Test that an answer contains the correct media content descriptions when
-// constraints have been set and streams are sent.
-TEST_F(WebRtcSessionTest, CreateAnswerWithConstraints) {
-  Init();
-  // Create a remote offer with audio and video content.
-  std::unique_ptr<JsepSessionDescription> offer(CreateRemoteOffer());
-  SetRemoteDescriptionWithoutError(offer.release());
-
-  cricket::MediaSessionOptions options;
-  // Test with a stream with tracks.
-  SendAudioVideoStream1();
-  std::unique_ptr<SessionDescriptionInterface> answer(CreateAnswer(options));
-
-  // TODO(perkj): Should the direction be set to SEND_ONLY?
-  const cricket::ContentInfo* content =
-      cricket::GetFirstAudioContent(answer->description());
-  ASSERT_TRUE(content != NULL);
-  EXPECT_FALSE(content->rejected);
-
-  // TODO(perkj): Should the direction be set to SEND_ONLY?
-  content = cricket::GetFirstVideoContent(answer->description());
-  ASSERT_TRUE(content != NULL);
-  EXPECT_FALSE(content->rejected);
-}
-
-TEST_F(WebRtcSessionTest, CreateOfferWithoutCNCodecs) {
-  AddCNCodecs();
-  Init();
-  PeerConnectionInterface::RTCOfferAnswerOptions options;
-  options.offer_to_receive_audio =
-      RTCOfferAnswerOptions::kOfferToReceiveMediaTrue;
-  options.voice_activity_detection = false;
-
-  std::unique_ptr<SessionDescriptionInterface> offer(CreateOffer(options));
-
-  const cricket::ContentInfo* content =
-      cricket::GetFirstAudioContent(offer->description());
-  EXPECT_TRUE(content != NULL);
-  EXPECT_TRUE(VerifyNoCNCodecs(content));
-}
-
-TEST_F(WebRtcSessionTest, CreateAnswerWithoutCNCodecs) {
-  AddCNCodecs();
-  Init();
-  // Create a remote offer with audio and video content.
-  std::unique_ptr<JsepSessionDescription> offer(CreateRemoteOffer());
-  SetRemoteDescriptionWithoutError(offer.release());
-
-  cricket::MediaSessionOptions options;
-  options.vad_enabled = false;
-  std::unique_ptr<SessionDescriptionInterface> answer(CreateAnswer(options));
-  const cricket::ContentInfo* content =
-      cricket::GetFirstAudioContent(answer->description());
-  ASSERT_TRUE(content != NULL);
-  EXPECT_TRUE(VerifyNoCNCodecs(content));
-}
-
-// This test verifies the call setup when remote answer with audio only and
-// later updates with video.
-TEST_F(WebRtcSessionTest, TestAVOfferWithAudioOnlyAnswer) {
-  Init();
-  EXPECT_TRUE(media_engine_->GetVideoChannel(0) == NULL);
-  EXPECT_TRUE(media_engine_->GetVoiceChannel(0) == NULL);
-
-  SendAudioVideoStream1();
-  SessionDescriptionInterface* offer = CreateOffer();
-
-  cricket::MediaSessionOptions options;
-  AddMediaSection(cricket::MEDIA_TYPE_AUDIO, cricket::CN_AUDIO,
-                  cricket::MD_RECVONLY, kActive, &options);
-  AddMediaSection(cricket::MEDIA_TYPE_VIDEO, cricket::CN_VIDEO,
-                  cricket::MD_INACTIVE, kStopped, &options);
-  local_recv_video_ = false;
-  SessionDescriptionInterface* answer = CreateRemoteAnswer(offer, options);
-
-  // SetLocalDescription and SetRemoteDescriptions takes ownership of offer
-  // and answer;
-  SetLocalDescriptionWithoutError(offer);
-  SetRemoteDescriptionWithoutError(answer);
-
-  video_channel_ = media_engine_->GetVideoChannel(0);
-  voice_channel_ = media_engine_->GetVoiceChannel(0);
-
-  ASSERT_TRUE(video_channel_ == nullptr);
-
-  ASSERT_EQ(0u, voice_channel_->recv_streams().size());
-  ASSERT_EQ(1u, voice_channel_->send_streams().size());
-  EXPECT_EQ(kAudioTrack1, voice_channel_->send_streams()[0].id);
-
-  // Let the remote end update the session descriptions, with Audio and Video.
-  SendAudioVideoStream2();
-  local_recv_video_ = true;
-  CreateAndSetRemoteOfferAndLocalAnswer();
-
-  video_channel_ = media_engine_->GetVideoChannel(0);
-  voice_channel_ = media_engine_->GetVoiceChannel(0);
-
-  ASSERT_TRUE(video_channel_ != nullptr);
-  ASSERT_TRUE(voice_channel_ != nullptr);
-
-  ASSERT_EQ(1u, video_channel_->recv_streams().size());
-  ASSERT_EQ(1u, video_channel_->send_streams().size());
-  EXPECT_EQ(kVideoTrack2, video_channel_->recv_streams()[0].id);
-  EXPECT_EQ(kVideoTrack2, video_channel_->send_streams()[0].id);
-  ASSERT_EQ(1u, voice_channel_->recv_streams().size());
-  ASSERT_EQ(1u, voice_channel_->send_streams().size());
-  EXPECT_EQ(kAudioTrack2, voice_channel_->recv_streams()[0].id);
-  EXPECT_EQ(kAudioTrack2, voice_channel_->send_streams()[0].id);
-
-  // Change session back to audio only.
-  // The remote side doesn't send and recv video.
-  SendAudioOnlyStream2();
-  remote_recv_video_ = false;
-  CreateAndSetRemoteOfferAndLocalAnswer();
-
-  video_channel_ = media_engine_->GetVideoChannel(0);
-  voice_channel_ = media_engine_->GetVoiceChannel(0);
-
-  // The audio is expected to be rejected.
-  EXPECT_TRUE(video_channel_ == nullptr);
-
-  ASSERT_EQ(1u, voice_channel_->recv_streams().size());
-  EXPECT_EQ(kAudioTrack2, voice_channel_->recv_streams()[0].id);
-  ASSERT_EQ(1u, voice_channel_->send_streams().size());
-  EXPECT_EQ(kAudioTrack2, voice_channel_->send_streams()[0].id);
-}
-
-// This test verifies the call setup when remote answer with video only and
-// later updates with audio.
-TEST_F(WebRtcSessionTest, TestAVOfferWithVideoOnlyAnswer) {
-  Init();
-  EXPECT_TRUE(media_engine_->GetVideoChannel(0) == NULL);
-  EXPECT_TRUE(media_engine_->GetVoiceChannel(0) == NULL);
-  SendAudioVideoStream1();
-  SessionDescriptionInterface* offer = CreateOffer();
-
-  cricket::MediaSessionOptions options;
-  AddMediaSection(cricket::MEDIA_TYPE_AUDIO, cricket::CN_AUDIO,
-                  cricket::MD_INACTIVE, kStopped, &options);
-  AddMediaSection(cricket::MEDIA_TYPE_VIDEO, cricket::CN_VIDEO,
-                  cricket::MD_RECVONLY, kActive, &options);
-  local_recv_audio_ = false;
-  SessionDescriptionInterface* answer =
-      CreateRemoteAnswer(offer, options, cricket::SEC_ENABLED);
-
-  // SetLocalDescription and SetRemoteDescriptions takes ownership of offer
-  // and answer.
-  SetLocalDescriptionWithoutError(offer);
-  SetRemoteDescriptionWithoutError(answer);
-
-  video_channel_ = media_engine_->GetVideoChannel(0);
-  voice_channel_ = media_engine_->GetVoiceChannel(0);
-
-  ASSERT_TRUE(voice_channel_ == NULL);
-  ASSERT_TRUE(video_channel_ != NULL);
-
-  EXPECT_EQ(0u, video_channel_->recv_streams().size());
-  ASSERT_EQ(1u, video_channel_->send_streams().size());
-  EXPECT_EQ(kVideoTrack1, video_channel_->send_streams()[0].id);
-
-  // Update the session descriptions, with Audio and Video.
-  SendAudioVideoStream2();
-  local_recv_audio_ = true;
-  SessionDescriptionInterface* offer2 = CreateRemoteOffer();
-  SetRemoteDescriptionWithoutError(offer2);
-  cricket::MediaSessionOptions answer_options;
-  // Disable the bundling here. If the media is bundled on audio
-  // transport, then we can't reject the audio because switching the bundled
-  // transport is not currently supported.
-  // (https://bugs.chromium.org/p/webrtc/issues/detail?id=6704)
-  answer_options.bundle_enabled = false;
-  SessionDescriptionInterface* answer2 = CreateAnswer(answer_options);
-  SetLocalDescriptionWithoutError(answer2);
-
-  voice_channel_ = media_engine_->GetVoiceChannel(0);
-
-  ASSERT_TRUE(voice_channel_ != NULL);
-  ASSERT_EQ(1u, voice_channel_->recv_streams().size());
-  ASSERT_EQ(1u, voice_channel_->send_streams().size());
-  EXPECT_EQ(kAudioTrack2, voice_channel_->recv_streams()[0].id);
-  EXPECT_EQ(kAudioTrack2, voice_channel_->send_streams()[0].id);
-
-  // Change session back to video only.
-  // The remote side doesn't send and recv audio.
-  SendVideoOnlyStream2();
-  remote_recv_audio_ = false;
-  SessionDescriptionInterface* offer3 = CreateRemoteOffer();
-  SetRemoteDescriptionWithoutError(offer3);
-  SessionDescriptionInterface* answer3 = CreateAnswer(answer_options);
-  SetLocalDescriptionWithoutError(answer3);
-
-  video_channel_ = media_engine_->GetVideoChannel(0);
-  voice_channel_ = media_engine_->GetVoiceChannel(0);
-
-  // The video is expected to be rejected.
-  EXPECT_TRUE(voice_channel_ == nullptr);
-
-  ASSERT_EQ(1u, video_channel_->recv_streams().size());
-  EXPECT_EQ(kVideoTrack2, video_channel_->recv_streams()[0].id);
-  ASSERT_EQ(1u, video_channel_->send_streams().size());
-  EXPECT_EQ(kVideoTrack2, video_channel_->send_streams()[0].id);
-}
-
-TEST_F(WebRtcSessionTest, VerifyCryptoParamsInSDP) {
-  Init();
-  SendAudioVideoStream1();
-  std::unique_ptr<SessionDescriptionInterface> offer(CreateOffer());
-  VerifyCryptoParams(offer->description());
-  SetRemoteDescriptionWithoutError(offer.release());
-  std::unique_ptr<SessionDescriptionInterface> answer(CreateAnswer());
-  VerifyCryptoParams(answer->description());
-}
-
-TEST_F(WebRtcSessionTest, VerifyCryptoParamsInSDPGcm) {
-  InitWithGcm();
-  SendAudioVideoStream1();
-  std::unique_ptr<SessionDescriptionInterface> offer(CreateOffer());
-  VerifyCryptoParams(offer->description(), true);
-  SetRemoteDescriptionWithoutError(offer.release());
-  std::unique_ptr<SessionDescriptionInterface> answer(CreateAnswer());
-  VerifyCryptoParams(answer->description(), true);
-}
-
-TEST_F(WebRtcSessionTest, VerifyNoCryptoParamsInSDP) {
-  options_.disable_encryption = true;
-  Init();
-  SendAudioVideoStream1();
-  std::unique_ptr<SessionDescriptionInterface> offer(CreateOffer());
-  VerifyNoCryptoParams(offer->description(), false);
-}
-
-TEST_F(WebRtcSessionTest, VerifyAnswerFromNonCryptoOffer) {
-  Init();
-  VerifyAnswerFromNonCryptoOffer();
-}
-
-TEST_F(WebRtcSessionTest, VerifyAnswerFromCryptoOffer) {
-  Init();
-  VerifyAnswerFromCryptoOffer();
-}
-
-// This test verifies that setLocalDescription fails if
-// no a=ice-ufrag and a=ice-pwd lines are present in the SDP.
-TEST_F(WebRtcSessionTest, TestSetLocalDescriptionWithoutIce) {
-  Init();
-  SendAudioVideoStream1();
-  std::unique_ptr<SessionDescriptionInterface> offer(CreateOffer());
-
-  std::string sdp;
-  RemoveIceUfragPwdLines(offer.get(), &sdp);
-  SessionDescriptionInterface* modified_offer =
-    CreateSessionDescription(JsepSessionDescription::kOffer, sdp, NULL);
-  SetLocalDescriptionOfferExpectError(kSdpWithoutIceUfragPwd, modified_offer);
-}
-
-// This test verifies that setRemoteDescription fails if
-// no a=ice-ufrag and a=ice-pwd lines are present in the SDP.
-TEST_F(WebRtcSessionTest, TestSetRemoteDescriptionWithoutIce) {
-  Init();
-  std::unique_ptr<SessionDescriptionInterface> offer(CreateRemoteOffer());
-  std::string sdp;
-  RemoveIceUfragPwdLines(offer.get(), &sdp);
-  SessionDescriptionInterface* modified_offer =
-    CreateSessionDescription(JsepSessionDescription::kOffer, sdp, NULL);
-  SetRemoteDescriptionOfferExpectError(kSdpWithoutIceUfragPwd, modified_offer);
-}
-
-// This test verifies that setLocalDescription fails if local offer has
-// too short ice ufrag and pwd strings.
-TEST_F(WebRtcSessionTest, TestSetLocalDescriptionInvalidIceCredentials) {
-  Init();
-  SendAudioVideoStream1();
-  std::unique_ptr<SessionDescriptionInterface> offer(CreateOffer());
-  // Modifying ice ufrag and pwd in local offer with strings smaller than the
-  // recommended values of 4 and 22 bytes respectively.
-  SetIceUfragPwd(offer.get(), "ice", "icepwd");
-  std::string error;
-  EXPECT_FALSE(session_->SetLocalDescription(offer.release(), &error));
-
-  // Test with string greater than 256.
-  offer.reset(CreateOffer());
-  SetIceUfragPwd(offer.get(), kTooLongIceUfragPwd, kTooLongIceUfragPwd);
-  EXPECT_FALSE(session_->SetLocalDescription(offer.release(), &error));
-}
-
-// This test verifies that setRemoteDescription fails if remote offer has
-// too short ice ufrag and pwd strings.
-TEST_F(WebRtcSessionTest, TestSetRemoteDescriptionInvalidIceCredentials) {
-  Init();
-  std::unique_ptr<SessionDescriptionInterface> offer(CreateRemoteOffer());
-  // Modifying ice ufrag and pwd in remote offer with strings smaller than the
-  // recommended values of 4 and 22 bytes respectively.
-  SetIceUfragPwd(offer.get(), "ice", "icepwd");
-  std::string error;
-  EXPECT_FALSE(session_->SetRemoteDescription(offer.release(), &error));
-
-  offer.reset(CreateRemoteOffer());
-  SetIceUfragPwd(offer.get(), kTooLongIceUfragPwd, kTooLongIceUfragPwd);
-  EXPECT_FALSE(session_->SetRemoteDescription(offer.release(), &error));
-}
-
-// Test that if the remote offer indicates the peer requested ICE restart (via
-// a new ufrag or pwd), the old ICE candidates are not copied, and vice versa.
-TEST_F(WebRtcSessionTest, TestSetRemoteOfferWithIceRestart) {
-  Init();
-
-  // Create the first offer.
-  std::unique_ptr<SessionDescriptionInterface> offer(CreateRemoteOffer());
-  SetIceUfragPwd(offer.get(), "0123456789012345", "abcdefghijklmnopqrstuvwx");
-  cricket::Candidate candidate1(1, "udp", rtc::SocketAddress("1.1.1.1", 5000),
-                                0, "", "", "relay", 0, "");
-  JsepIceCandidate ice_candidate1(kMediaContentName0, kMediaContentIndex0,
-                                  candidate1);
-  EXPECT_TRUE(offer->AddCandidate(&ice_candidate1));
-  SetRemoteDescriptionWithoutError(offer.release());
-  EXPECT_EQ(1, session_->remote_description()->candidates(0)->count());
-
-  // The second offer has the same ufrag and pwd but different address.
-  offer.reset(CreateRemoteOffer());
-  SetIceUfragPwd(offer.get(), "0123456789012345", "abcdefghijklmnopqrstuvwx");
-  candidate1.set_address(rtc::SocketAddress("1.1.1.1", 6000));
-  JsepIceCandidate ice_candidate2(kMediaContentName0, kMediaContentIndex0,
-                                  candidate1);
-  EXPECT_TRUE(offer->AddCandidate(&ice_candidate2));
-  SetRemoteDescriptionWithoutError(offer.release());
-  EXPECT_EQ(2, session_->remote_description()->candidates(0)->count());
-
-  // The third offer has a different ufrag and different address.
-  offer.reset(CreateRemoteOffer());
-  SetIceUfragPwd(offer.get(), "0123456789012333", "abcdefghijklmnopqrstuvwx");
-  candidate1.set_address(rtc::SocketAddress("1.1.1.1", 7000));
-  JsepIceCandidate ice_candidate3(kMediaContentName0, kMediaContentIndex0,
-                                  candidate1);
-  EXPECT_TRUE(offer->AddCandidate(&ice_candidate3));
-  SetRemoteDescriptionWithoutError(offer.release());
-  EXPECT_EQ(1, session_->remote_description()->candidates(0)->count());
-
-  // The fourth offer has no candidate but a different ufrag/pwd.
-  offer.reset(CreateRemoteOffer());
-  SetIceUfragPwd(offer.get(), "0123456789012444", "abcdefghijklmnopqrstuvyz");
-  SetRemoteDescriptionWithoutError(offer.release());
-  EXPECT_EQ(0, session_->remote_description()->candidates(0)->count());
-}
-
-// Test that if the remote answer indicates the peer requested ICE restart (via
-// a new ufrag or pwd), the old ICE candidates are not copied, and vice versa.
-TEST_F(WebRtcSessionTest, TestSetRemoteAnswerWithIceRestart) {
-  Init();
-  SessionDescriptionInterface* offer = CreateOffer();
-  SetLocalDescriptionWithoutError(offer);
-
-  // Create the first answer.
-  std::unique_ptr<JsepSessionDescription> answer(CreateRemoteAnswer(offer));
-  answer->set_type(JsepSessionDescription::kPrAnswer);
-  SetIceUfragPwd(answer.get(), "0123456789012345", "abcdefghijklmnopqrstuvwx");
-  cricket::Candidate candidate1(1, "udp", rtc::SocketAddress("1.1.1.1", 5000),
-                                0, "", "", "relay", 0, "");
-  JsepIceCandidate ice_candidate1(kMediaContentName0, kMediaContentIndex0,
-                                  candidate1);
-  EXPECT_TRUE(answer->AddCandidate(&ice_candidate1));
-  SetRemoteDescriptionWithoutError(answer.release());
-  EXPECT_EQ(1, session_->remote_description()->candidates(0)->count());
-
-  // The second answer has the same ufrag and pwd but different address.
-  answer.reset(CreateRemoteAnswer(offer));
-  answer->set_type(JsepSessionDescription::kPrAnswer);
-  SetIceUfragPwd(answer.get(), "0123456789012345", "abcdefghijklmnopqrstuvwx");
-  candidate1.set_address(rtc::SocketAddress("1.1.1.1", 6000));
-  JsepIceCandidate ice_candidate2(kMediaContentName0, kMediaContentIndex0,
-                                  candidate1);
-  EXPECT_TRUE(answer->AddCandidate(&ice_candidate2));
-  SetRemoteDescriptionWithoutError(answer.release());
-  EXPECT_EQ(2, session_->remote_description()->candidates(0)->count());
-
-  // The third answer has a different ufrag and different address.
-  answer.reset(CreateRemoteAnswer(offer));
-  answer->set_type(JsepSessionDescription::kPrAnswer);
-  SetIceUfragPwd(answer.get(), "0123456789012333", "abcdefghijklmnopqrstuvwx");
-  candidate1.set_address(rtc::SocketAddress("1.1.1.1", 7000));
-  JsepIceCandidate ice_candidate3(kMediaContentName0, kMediaContentIndex0,
-                                  candidate1);
-  EXPECT_TRUE(answer->AddCandidate(&ice_candidate3));
-  SetRemoteDescriptionWithoutError(answer.release());
-  EXPECT_EQ(1, session_->remote_description()->candidates(0)->count());
-
-  // The fourth answer has no candidate but a different ufrag/pwd.
-  answer.reset(CreateRemoteAnswer(offer));
-  answer->set_type(JsepSessionDescription::kPrAnswer);
-  SetIceUfragPwd(answer.get(), "0123456789012444", "abcdefghijklmnopqrstuvyz");
-  SetRemoteDescriptionWithoutError(answer.release());
-  EXPECT_EQ(0, session_->remote_description()->candidates(0)->count());
-}
-
-// Test that candidates sent to the "video" transport do not get pushed down to
-// the "audio" transport channel when bundling.
-TEST_F(WebRtcSessionTest, TestIgnoreCandidatesForUnusedTransportWhenBundling) {
-  AddInterface(rtc::SocketAddress(kClientAddrHost1, kClientAddrPort));
-
-  InitWithBundlePolicy(PeerConnectionInterface::kBundlePolicyBalanced);
-  SendAudioVideoStream1();
-
-  cricket::MediaSessionOptions offer_options;
-  GetOptionsForRemoteOffer(&offer_options);
-  offer_options.bundle_enabled = true;
-
-  SessionDescriptionInterface* offer = CreateRemoteOffer(offer_options);
-  SetRemoteDescriptionWithoutError(offer);
-
-  cricket::MediaSessionOptions answer_options;
-  answer_options.bundle_enabled = true;
-  SessionDescriptionInterface* answer = CreateAnswer(answer_options);
-  SetLocalDescriptionWithoutError(answer);
-
-  EXPECT_EQ(session_->voice_rtp_transport_channel(),
-            session_->video_rtp_transport_channel());
-
-  cricket::BaseChannel* voice_channel = session_->voice_channel();
-  ASSERT_TRUE(voice_channel != NULL);
-
-  // Checks if one of the transport channels contains a connection using a given
-  // port.
-  auto connection_with_remote_port = [this](int port) {
-    std::unique_ptr<webrtc::SessionStats> stats = session_->GetStats_s();
-    for (auto& kv : stats->transport_stats) {
-      for (auto& chan_stat : kv.second.channel_stats) {
-        for (auto& conn_info : chan_stat.connection_infos) {
-          if (conn_info.remote_candidate.address().port() == port) {
-            return true;
-          }
-        }
-      }
-    }
-    return false;
-  };
-
-  EXPECT_FALSE(connection_with_remote_port(5000));
-  EXPECT_FALSE(connection_with_remote_port(5001));
-  EXPECT_FALSE(connection_with_remote_port(6000));
-
-  // The way the *_WAIT checks work is they only wait if the condition fails,
-  // which does not help in the case where state is not changing. This is
-  // problematic in this test since we want to verify that adding a video
-  // candidate does _not_ change state. So we interleave candidates and assume
-  // that messages are executed in the order they were posted.
-
-  // First audio candidate.
-  cricket::Candidate candidate0;
-  candidate0.set_address(rtc::SocketAddress("1.1.1.1", 5000));
-  candidate0.set_component(1);
-  candidate0.set_protocol("udp");
-  candidate0.set_type("local");
-  JsepIceCandidate ice_candidate0(kMediaContentName0, kMediaContentIndex0,
-                                  candidate0);
-  EXPECT_TRUE(session_->ProcessIceMessage(&ice_candidate0));
-
-  // Video candidate.
-  cricket::Candidate candidate1;
-  candidate1.set_address(rtc::SocketAddress("1.1.1.1", 6000));
-  candidate1.set_component(1);
-  candidate1.set_protocol("udp");
-  candidate1.set_type("local");
-  JsepIceCandidate ice_candidate1(kMediaContentName1, kMediaContentIndex1,
-                                  candidate1);
-  EXPECT_TRUE(session_->ProcessIceMessage(&ice_candidate1));
-
-  // Second audio candidate.
-  cricket::Candidate candidate2;
-  candidate2.set_address(rtc::SocketAddress("1.1.1.1", 5001));
-  candidate2.set_component(1);
-  candidate2.set_protocol("udp");
-  candidate2.set_type("local");
-  JsepIceCandidate ice_candidate2(kMediaContentName0, kMediaContentIndex0,
-                                  candidate2);
-  EXPECT_TRUE(session_->ProcessIceMessage(&ice_candidate2));
-
-  EXPECT_TRUE_WAIT(connection_with_remote_port(5000), 1000);
-  EXPECT_TRUE_WAIT(connection_with_remote_port(5001), 1000);
-
-  // No need here for a _WAIT check since we are checking that state hasn't
-  // changed: if this is false we would be doing waits for nothing and if this
-  // is true then there will be no messages processed anyways.
-  EXPECT_FALSE(connection_with_remote_port(6000));
-}
-
-// kBundlePolicyBalanced BUNDLE policy and answer contains BUNDLE.
-TEST_F(WebRtcSessionTest, TestBalancedBundleInAnswer) {
-  InitWithBundlePolicy(PeerConnectionInterface::kBundlePolicyBalanced);
-  SendAudioVideoStream1();
-
-  PeerConnectionInterface::RTCOfferAnswerOptions options;
-  options.use_rtp_mux = true;
-
-  SessionDescriptionInterface* offer = CreateOffer(options);
-  SetLocalDescriptionWithoutError(offer);
-
-  EXPECT_NE(session_->voice_rtp_transport_channel(),
-            session_->video_rtp_transport_channel());
-
-  SendAudioVideoStream2();
-  SessionDescriptionInterface* answer =
-      CreateRemoteAnswer(session_->local_description());
-  SetRemoteDescriptionWithoutError(answer);
-
-  EXPECT_EQ(session_->voice_rtp_transport_channel(),
-            session_->video_rtp_transport_channel());
-}
-
-// kBundlePolicyBalanced BUNDLE policy but no BUNDLE in the answer.
-TEST_F(WebRtcSessionTest, TestBalancedNoBundleInAnswer) {
-  InitWithBundlePolicy(PeerConnectionInterface::kBundlePolicyBalanced);
-  SendAudioVideoStream1();
-
-  PeerConnectionInterface::RTCOfferAnswerOptions options;
-  options.use_rtp_mux = true;
-
-  SessionDescriptionInterface* offer = CreateOffer(options);
-  SetLocalDescriptionWithoutError(offer);
-
-  EXPECT_NE(session_->voice_rtp_transport_channel(),
-            session_->video_rtp_transport_channel());
-
-  SendAudioVideoStream2();
-
-  // Remove BUNDLE from the answer.
-  std::unique_ptr<SessionDescriptionInterface> answer(
-      CreateRemoteAnswer(session_->local_description()));
-  cricket::SessionDescription* answer_copy = answer->description()->Copy();
-  answer_copy->RemoveGroupByName(cricket::GROUP_TYPE_BUNDLE);
-  JsepSessionDescription* modified_answer =
-      new JsepSessionDescription(JsepSessionDescription::kAnswer);
-  modified_answer->Initialize(answer_copy, "1", "1");
-  SetRemoteDescriptionWithoutError(modified_answer);  //
-
-  EXPECT_NE(session_->voice_rtp_transport_channel(),
-            session_->video_rtp_transport_channel());
-}
-
-// kBundlePolicyMaxBundle policy with BUNDLE in the answer.
-TEST_F(WebRtcSessionTest, TestMaxBundleBundleInAnswer) {
-  InitWithBundlePolicy(PeerConnectionInterface::kBundlePolicyMaxBundle);
-  SendAudioVideoStream1();
-
-  PeerConnectionInterface::RTCOfferAnswerOptions options;
-  options.use_rtp_mux = true;
-
-  SessionDescriptionInterface* offer = CreateOffer(options);
-  SetLocalDescriptionWithoutError(offer);
-
-  EXPECT_EQ(session_->voice_rtp_transport_channel(),
-            session_->video_rtp_transport_channel());
-
-  SendAudioVideoStream2();
-  SessionDescriptionInterface* answer =
-      CreateRemoteAnswer(session_->local_description());
-  SetRemoteDescriptionWithoutError(answer);
-
-  EXPECT_EQ(session_->voice_rtp_transport_channel(),
-            session_->video_rtp_transport_channel());
-}
-
-// kBundlePolicyMaxBundle policy with BUNDLE in the answer, but no
-// audio content in the answer.
-TEST_F(WebRtcSessionTest, TestMaxBundleRejectAudio) {
-  InitWithBundlePolicy(PeerConnectionInterface::kBundlePolicyMaxBundle);
-  SendAudioVideoStream1();
-
-  PeerConnectionInterface::RTCOfferAnswerOptions options;
-  options.use_rtp_mux = true;
-
-  SessionDescriptionInterface* offer = CreateOffer(options);
-  SetLocalDescriptionWithoutError(offer);
-
-  EXPECT_EQ(session_->voice_rtp_transport_channel(),
-            session_->video_rtp_transport_channel());
-
-  SendVideoOnlyStream2();
-  local_send_audio_ = false;
-  remote_recv_audio_ = false;
-  cricket::MediaSessionOptions recv_options;
-  GetOptionsForRemoteAnswer(&recv_options);
-  SessionDescriptionInterface* answer =
-      CreateRemoteAnswer(session_->local_description(), recv_options);
-  SetRemoteDescriptionWithoutError(answer);
-
-  EXPECT_TRUE(nullptr == session_->voice_channel());
-  EXPECT_TRUE(nullptr != session_->video_rtp_transport_channel());
-
-  session_->Close();
-  EXPECT_TRUE(nullptr == session_->voice_rtp_transport_channel());
-  EXPECT_TRUE(nullptr == session_->voice_rtcp_transport_channel());
-  EXPECT_TRUE(nullptr == session_->video_rtp_transport_channel());
-  EXPECT_TRUE(nullptr == session_->video_rtcp_transport_channel());
-}
-
-// kBundlePolicyMaxBundle policy but no BUNDLE in the answer.
-TEST_F(WebRtcSessionTest, TestMaxBundleNoBundleInAnswer) {
-  InitWithBundlePolicy(PeerConnectionInterface::kBundlePolicyMaxBundle);
-  SendAudioVideoStream1();
-
-  PeerConnectionInterface::RTCOfferAnswerOptions options;
-  options.use_rtp_mux = true;
-
-  SessionDescriptionInterface* offer = CreateOffer(options);
-  SetLocalDescriptionWithoutError(offer);
-
-  EXPECT_EQ(session_->voice_rtp_transport_channel(),
-            session_->video_rtp_transport_channel());
-
-  SendAudioVideoStream2();
-
-  // Remove BUNDLE from the answer.
-  std::unique_ptr<SessionDescriptionInterface> answer(
-      CreateRemoteAnswer(session_->local_description()));
-  cricket::SessionDescription* answer_copy = answer->description()->Copy();
-  answer_copy->RemoveGroupByName(cricket::GROUP_TYPE_BUNDLE);
-  JsepSessionDescription* modified_answer =
-      new JsepSessionDescription(JsepSessionDescription::kAnswer);
-  modified_answer->Initialize(answer_copy, "1", "1");
-  SetRemoteDescriptionWithoutError(modified_answer);
-
-  EXPECT_EQ(session_->voice_rtp_transport_channel(),
-            session_->video_rtp_transport_channel());
-}
-
-// kBundlePolicyMaxBundle policy with BUNDLE in the remote offer.
-TEST_F(WebRtcSessionTest, TestMaxBundleBundleInRemoteOffer) {
-  InitWithBundlePolicy(PeerConnectionInterface::kBundlePolicyMaxBundle);
-  SendAudioVideoStream1();
-
-  SessionDescriptionInterface* offer = CreateRemoteOffer();
-  SetRemoteDescriptionWithoutError(offer);
-
-  EXPECT_EQ(session_->voice_rtp_transport_channel(),
-            session_->video_rtp_transport_channel());
-
-  SendAudioVideoStream2();
-  SessionDescriptionInterface* answer = CreateAnswer();
-  SetLocalDescriptionWithoutError(answer);
-
-  EXPECT_EQ(session_->voice_rtp_transport_channel(),
-            session_->video_rtp_transport_channel());
-}
-
-// kBundlePolicyMaxBundle policy but no BUNDLE in the remote offer.
-TEST_F(WebRtcSessionTest, TestMaxBundleNoBundleInRemoteOffer) {
-  InitWithBundlePolicy(PeerConnectionInterface::kBundlePolicyMaxBundle);
-  SendAudioVideoStream1();
-
-  // Remove BUNDLE from the offer.
-  std::unique_ptr<SessionDescriptionInterface> offer(CreateRemoteOffer());
-  cricket::SessionDescription* offer_copy = offer->description()->Copy();
-  offer_copy->RemoveGroupByName(cricket::GROUP_TYPE_BUNDLE);
-  JsepSessionDescription* modified_offer =
-      new JsepSessionDescription(JsepSessionDescription::kOffer);
-  modified_offer->Initialize(offer_copy, "1", "1");
-
-  // Expect an error when applying the remote description
-  SetRemoteDescriptionExpectError(JsepSessionDescription::kOffer,
-                                  kCreateChannelFailed, modified_offer);
-}
-
-// kBundlePolicyMaxCompat bundle policy and answer contains BUNDLE.
-TEST_F(WebRtcSessionTest, TestMaxCompatBundleInAnswer) {
-  InitWithBundlePolicy(PeerConnectionInterface::kBundlePolicyMaxCompat);
-  SendAudioVideoStream1();
-
-  PeerConnectionInterface::RTCOfferAnswerOptions rtc_options;
-  rtc_options.use_rtp_mux = true;
-
-  SessionDescriptionInterface* offer = CreateOffer(rtc_options);
-  SetLocalDescriptionWithoutError(offer);
-
-  EXPECT_NE(session_->voice_rtp_transport_channel(),
-            session_->video_rtp_transport_channel());
-
-  SendAudioVideoStream2();
-  SessionDescriptionInterface* answer =
-      CreateRemoteAnswer(session_->local_description());
-  SetRemoteDescriptionWithoutError(answer);
-
-  // This should lead to an audio-only call but isn't implemented
-  // correctly yet.
-  EXPECT_EQ(session_->voice_rtp_transport_channel(),
-            session_->video_rtp_transport_channel());
-}
-
-// kBundlePolicyMaxCompat BUNDLE policy but no BUNDLE in the answer.
-TEST_F(WebRtcSessionTest, TestMaxCompatNoBundleInAnswer) {
-  InitWithBundlePolicy(PeerConnectionInterface::kBundlePolicyMaxCompat);
-  SendAudioVideoStream1();
-  PeerConnectionInterface::RTCOfferAnswerOptions options;
-  options.use_rtp_mux = true;
-
-  SessionDescriptionInterface* offer = CreateOffer(options);
-  SetLocalDescriptionWithoutError(offer);
-
-  EXPECT_NE(session_->voice_rtp_transport_channel(),
-            session_->video_rtp_transport_channel());
-
-  SendAudioVideoStream2();
-
-  // Remove BUNDLE from the answer.
-  std::unique_ptr<SessionDescriptionInterface> answer(
-      CreateRemoteAnswer(session_->local_description()));
-  cricket::SessionDescription* answer_copy = answer->description()->Copy();
-  answer_copy->RemoveGroupByName(cricket::GROUP_TYPE_BUNDLE);
-  JsepSessionDescription* modified_answer =
-      new JsepSessionDescription(JsepSessionDescription::kAnswer);
-  modified_answer->Initialize(answer_copy, "1", "1");
-  SetRemoteDescriptionWithoutError(modified_answer);  //
-
-  EXPECT_NE(session_->voice_rtp_transport_channel(),
-            session_->video_rtp_transport_channel());
-}
-
-// kBundlePolicyMaxbundle and then we call SetRemoteDescription first.
-TEST_F(WebRtcSessionTest, TestMaxBundleWithSetRemoteDescriptionFirst) {
-  InitWithBundlePolicy(PeerConnectionInterface::kBundlePolicyMaxBundle);
-  SendAudioVideoStream1();
-
-  PeerConnectionInterface::RTCOfferAnswerOptions options;
-  options.use_rtp_mux = true;
-
-  SessionDescriptionInterface* offer = CreateOffer(options);
-  SetRemoteDescriptionWithoutError(offer);
-
-  EXPECT_EQ(session_->voice_rtp_transport_channel(),
-            session_->video_rtp_transport_channel());
-}
-
-// Adding a new channel to a BUNDLE which is already connected should directly
-// assign the bundle transport to the channel, without first setting a
-// disconnected non-bundle transport and then replacing it. The application
-// should not receive any changes in the ICE state.
-TEST_F(WebRtcSessionTest, TestAddChannelToConnectedBundle) {
-  LoopbackNetworkConfiguration config;
-  LoopbackNetworkManager loopback_network_manager(this, config);
-  // Both BUNDLE and RTCP-mux need to be enabled for the ICE state to remain
-  // connected. Disabling either of these two means that we need to wait for the
-  // answer to find out if more transports are needed.
-  configuration_.bundle_policy =
-      PeerConnectionInterface::kBundlePolicyMaxBundle;
-  options_.disable_encryption = true;
-  InitWithRtcpMuxPolicy(PeerConnectionInterface::kRtcpMuxPolicyRequire);
-
-  // Negotiate an audio channel with MAX_BUNDLE enabled.
-  SendAudioOnlyStream2();
-  SessionDescriptionInterface* offer = CreateOffer();
-  SetLocalDescriptionWithoutError(offer);
-  EXPECT_EQ_WAIT(PeerConnectionInterface::kIceGatheringComplete,
-                 observer_.ice_gathering_state_, kIceCandidatesTimeout);
-  std::string sdp;
-  offer->ToString(&sdp);
-  SessionDescriptionInterface* answer = webrtc::CreateSessionDescription(
-      JsepSessionDescription::kAnswer, sdp, nullptr);
-  ASSERT_TRUE(answer != NULL);
-  SetRemoteDescriptionWithoutError(answer);
-
-  // Wait for the ICE state to stabilize.
-  EXPECT_EQ_WAIT(PeerConnectionInterface::kIceConnectionCompleted,
-                 observer_.ice_connection_state_, kIceCandidatesTimeout);
-  observer_.ice_connection_state_history_.clear();
-
-  // Now add a video channel which should be using the same bundle transport.
-  SendAudioVideoStream2();
-  offer = CreateOffer();
-  offer->ToString(&sdp);
-  SetLocalDescriptionWithoutError(offer);
-  answer = webrtc::CreateSessionDescription(JsepSessionDescription::kAnswer,
-                                            sdp, nullptr);
-  ASSERT_TRUE(answer != NULL);
-  SetRemoteDescriptionWithoutError(answer);
-
-  // Wait for ICE state to stabilize
-  rtc::Thread::Current()->ProcessMessages(0);
-  EXPECT_EQ_WAIT(PeerConnectionInterface::kIceConnectionCompleted,
-                 observer_.ice_connection_state_, kIceCandidatesTimeout);
-
-  // No ICE state changes are expected to happen.
-  EXPECT_EQ(0, observer_.ice_connection_state_history_.size());
-}
-
-TEST_F(WebRtcSessionTest, TestRequireRtcpMux) {
-  InitWithRtcpMuxPolicy(PeerConnectionInterface::kRtcpMuxPolicyRequire);
-  SendAudioVideoStream1();
-
-  PeerConnectionInterface::RTCOfferAnswerOptions options;
-  SessionDescriptionInterface* offer = CreateOffer(options);
-  SetLocalDescriptionWithoutError(offer);
-
-  EXPECT_TRUE(session_->voice_rtcp_transport_channel() == NULL);
-  EXPECT_TRUE(session_->video_rtcp_transport_channel() == NULL);
-
-  SendAudioVideoStream2();
-  SessionDescriptionInterface* answer =
-      CreateRemoteAnswer(session_->local_description());
-  SetRemoteDescriptionWithoutError(answer);
-
-  EXPECT_TRUE(session_->voice_rtcp_transport_channel() == NULL);
-  EXPECT_TRUE(session_->video_rtcp_transport_channel() == NULL);
-}
-
-TEST_F(WebRtcSessionTest, TestNegotiateRtcpMux) {
-  InitWithRtcpMuxPolicy(PeerConnectionInterface::kRtcpMuxPolicyNegotiate);
-  SendAudioVideoStream1();
-
-  PeerConnectionInterface::RTCOfferAnswerOptions options;
-  SessionDescriptionInterface* offer = CreateOffer(options);
-  SetLocalDescriptionWithoutError(offer);
-
-  EXPECT_TRUE(session_->voice_rtcp_transport_channel() != NULL);
-  EXPECT_TRUE(session_->video_rtcp_transport_channel() != NULL);
-
-  SendAudioVideoStream2();
-  SessionDescriptionInterface* answer =
-      CreateRemoteAnswer(session_->local_description());
-  SetRemoteDescriptionWithoutError(answer);
-
-  EXPECT_TRUE(session_->voice_rtcp_transport_channel() == NULL);
-  EXPECT_TRUE(session_->video_rtcp_transport_channel() == NULL);
-}
-
-// This test verifies that SetLocalDescription and SetRemoteDescription fails
-// if BUNDLE is enabled but rtcp-mux is disabled in m-lines.
-TEST_F(WebRtcSessionTest, TestDisabledRtcpMuxWithBundleEnabled) {
-  Init();
-  SendAudioVideoStream1();
-
-  PeerConnectionInterface::RTCOfferAnswerOptions options;
-  options.use_rtp_mux = true;
-
-  SessionDescriptionInterface* offer = CreateOffer(options);
-  std::string offer_str;
-  offer->ToString(&offer_str);
-  // Disable rtcp-mux
-  const std::string rtcp_mux = "rtcp-mux";
-  const std::string xrtcp_mux = "xrtcp-mux";
-  rtc::replace_substrs(rtcp_mux.c_str(), rtcp_mux.length(),
-                             xrtcp_mux.c_str(), xrtcp_mux.length(),
-                             &offer_str);
-  SessionDescriptionInterface* local_offer = CreateSessionDescription(
-      SessionDescriptionInterface::kOffer, offer_str, nullptr);
-  ASSERT_TRUE(local_offer);
-  SetLocalDescriptionOfferExpectError(kBundleWithoutRtcpMux, local_offer);
-
-  SessionDescriptionInterface* remote_offer = CreateSessionDescription(
-      SessionDescriptionInterface::kOffer, offer_str, nullptr);
-  ASSERT_TRUE(remote_offer);
-  SetRemoteDescriptionOfferExpectError(kBundleWithoutRtcpMux, remote_offer);
-
-  // Trying unmodified SDP.
-  SetLocalDescriptionWithoutError(offer);
-}
-
-TEST_F(WebRtcSessionTest, SetSetupGcm) {
-  InitWithGcm();
-  SendAudioVideoStream1();
-  CreateAndSetRemoteOfferAndLocalAnswer();
-}
-
-// This test verifies the |initial_offerer| flag when session initiates the
-// call.
-TEST_F(WebRtcSessionTest, TestInitiatorFlagAsOriginator) {
-  Init();
-  EXPECT_FALSE(session_->initial_offerer());
-  SessionDescriptionInterface* offer = CreateOffer();
-  SessionDescriptionInterface* answer = CreateRemoteAnswer(offer);
-  SetLocalDescriptionWithoutError(offer);
-  EXPECT_TRUE(session_->initial_offerer());
-  SetRemoteDescriptionWithoutError(answer);
-  EXPECT_TRUE(session_->initial_offerer());
-}
-
-// This test verifies the |initial_offerer| flag when session receives the call.
-TEST_F(WebRtcSessionTest, TestInitiatorFlagAsReceiver) {
-  Init();
-  EXPECT_FALSE(session_->initial_offerer());
-  SessionDescriptionInterface* offer = CreateRemoteOffer();
-  SetRemoteDescriptionWithoutError(offer);
-  SessionDescriptionInterface* answer = CreateAnswer();
-
-  EXPECT_FALSE(session_->initial_offerer());
-  SetLocalDescriptionWithoutError(answer);
-  EXPECT_FALSE(session_->initial_offerer());
-}
-
-// Verifing local offer and remote answer have matching m-lines as per RFC 3264.
-TEST_F(WebRtcSessionTest, TestIncorrectMLinesInRemoteAnswer) {
-  Init();
-  SendAudioVideoStream1();
-  SessionDescriptionInterface* offer = CreateOffer();
-  SetLocalDescriptionWithoutError(offer);
-  std::unique_ptr<SessionDescriptionInterface> answer(
-      CreateRemoteAnswer(session_->local_description()));
-
-  cricket::SessionDescription* answer_copy = answer->description()->Copy();
-  answer_copy->RemoveContentByName("video");
-  JsepSessionDescription* modified_answer =
-      new JsepSessionDescription(JsepSessionDescription::kAnswer);
-
-  EXPECT_TRUE(modified_answer->Initialize(answer_copy,
-                                          answer->session_id(),
-                                          answer->session_version()));
-  SetRemoteDescriptionAnswerExpectError(kMlineMismatchInAnswer,
-                                        modified_answer);
-
-  // Different content names.
-  std::string sdp;
-  EXPECT_TRUE(answer->ToString(&sdp));
-  const std::string kAudioMid = "a=mid:audio";
-  const std::string kAudioMidReplaceStr = "a=mid:audio_content_name";
-  rtc::replace_substrs(kAudioMid.c_str(), kAudioMid.length(),
-                             kAudioMidReplaceStr.c_str(),
-                             kAudioMidReplaceStr.length(),
-                             &sdp);
-  SessionDescriptionInterface* modified_answer1 =
-      CreateSessionDescription(JsepSessionDescription::kAnswer, sdp, NULL);
-  SetRemoteDescriptionAnswerExpectError(kMlineMismatchInAnswer,
-                                        modified_answer1);
-
-  // Different media types.
-  EXPECT_TRUE(answer->ToString(&sdp));
-  const std::string kAudioMline = "m=audio";
-  const std::string kAudioMlineReplaceStr = "m=video";
-  rtc::replace_substrs(kAudioMline.c_str(), kAudioMline.length(),
-                             kAudioMlineReplaceStr.c_str(),
-                             kAudioMlineReplaceStr.length(),
-                             &sdp);
-  SessionDescriptionInterface* modified_answer2 =
-      CreateSessionDescription(JsepSessionDescription::kAnswer, sdp, NULL);
-  SetRemoteDescriptionAnswerExpectError(kMlineMismatchInAnswer,
-                                        modified_answer2);
-
-  SetRemoteDescriptionWithoutError(answer.release());
-}
-
-// Verifying remote offer and local answer have matching m-lines as per
-// RFC 3264.
-TEST_F(WebRtcSessionTest, TestIncorrectMLinesInLocalAnswer) {
-  Init();
-  SendAudioVideoStream1();
-  SessionDescriptionInterface* offer = CreateRemoteOffer();
-  SetRemoteDescriptionWithoutError(offer);
-  SessionDescriptionInterface* answer = CreateAnswer();
-
-  cricket::SessionDescription* answer_copy = answer->description()->Copy();
-  answer_copy->RemoveContentByName("video");
-  JsepSessionDescription* modified_answer =
-      new JsepSessionDescription(JsepSessionDescription::kAnswer);
-
-  EXPECT_TRUE(modified_answer->Initialize(answer_copy,
-                                          answer->session_id(),
-                                          answer->session_version()));
-  SetLocalDescriptionAnswerExpectError(kMlineMismatchInAnswer, modified_answer);
-  SetLocalDescriptionWithoutError(answer);
-}
-
-// This test verifies that WebRtcSession does not start candidate allocation
-// before SetLocalDescription is called.
-TEST_F(WebRtcSessionTest, TestIceStartAfterSetLocalDescriptionOnly) {
-  Init();
-  SendAudioVideoStream1();
-  SessionDescriptionInterface* offer = CreateRemoteOffer();
-  cricket::Candidate candidate;
-  candidate.set_component(1);
-  JsepIceCandidate ice_candidate(kMediaContentName0, kMediaContentIndex0,
-                                 candidate);
-  EXPECT_TRUE(offer->AddCandidate(&ice_candidate));
-  cricket::Candidate candidate1;
-  candidate1.set_component(1);
-  JsepIceCandidate ice_candidate1(kMediaContentName1, kMediaContentIndex1,
-                                  candidate1);
-  EXPECT_TRUE(offer->AddCandidate(&ice_candidate1));
-  SetRemoteDescriptionWithoutError(offer);
-  ASSERT_TRUE(session_->voice_rtp_transport_channel() != NULL);
-  ASSERT_TRUE(session_->video_rtp_transport_channel() != NULL);
-
-  // Pump for 1 second and verify that no candidates are generated.
-  rtc::Thread::Current()->ProcessMessages(1000);
-  EXPECT_TRUE(observer_.mline_0_candidates_.empty());
-  EXPECT_TRUE(observer_.mline_1_candidates_.empty());
-
-  SessionDescriptionInterface* answer = CreateAnswer();
-  SetLocalDescriptionWithoutError(answer);
-  EXPECT_TRUE_WAIT(observer_.oncandidatesready_, kIceCandidatesTimeout);
-}
-
-// This test verifies that crypto parameter is updated in local session
-// description as per security policy set in MediaSessionDescriptionFactory.
-TEST_F(WebRtcSessionTest, TestCryptoAfterSetLocalDescription) {
-  Init();
-  SendAudioVideoStream1();
-  std::unique_ptr<SessionDescriptionInterface> offer(CreateOffer());
-
-  // Making sure SetLocalDescription correctly sets crypto value in
-  // SessionDescription object after de-serialization of sdp string. The value
-  // will be set as per MediaSessionDescriptionFactory.
-  std::string offer_str;
-  offer->ToString(&offer_str);
-  SessionDescriptionInterface* jsep_offer_str =
-      CreateSessionDescription(JsepSessionDescription::kOffer, offer_str, NULL);
-  SetLocalDescriptionWithoutError(jsep_offer_str);
-  EXPECT_TRUE(session_->voice_channel()->srtp_required_for_testing());
-  EXPECT_TRUE(session_->video_channel()->srtp_required_for_testing());
-}
-
-// This test verifies the crypto parameter when security is disabled.
-TEST_F(WebRtcSessionTest, TestCryptoAfterSetLocalDescriptionWithDisabled) {
-  options_.disable_encryption = true;
-  Init();
-  SendAudioVideoStream1();
-  std::unique_ptr<SessionDescriptionInterface> offer(CreateOffer());
-
-  // Making sure SetLocalDescription correctly sets crypto value in
-  // SessionDescription object after de-serialization of sdp string. The value
-  // will be set as per MediaSessionDescriptionFactory.
-  std::string offer_str;
-  offer->ToString(&offer_str);
-  SessionDescriptionInterface* jsep_offer_str =
-      CreateSessionDescription(JsepSessionDescription::kOffer, offer_str, NULL);
-  SetLocalDescriptionWithoutError(jsep_offer_str);
-  EXPECT_FALSE(session_->voice_channel()->srtp_required_for_testing());
-  EXPECT_FALSE(session_->video_channel()->srtp_required_for_testing());
-}
-
-// This test verifies that an answer contains new ufrag and password if an offer
-// with new ufrag and password is received.
-TEST_F(WebRtcSessionTest, TestCreateAnswerWithNewUfragAndPassword) {
-  Init();
-  cricket::MediaSessionOptions options;
-  GetOptionsForRemoteOffer(&options);
-  std::unique_ptr<JsepSessionDescription> offer(CreateRemoteOffer(options));
-  SetRemoteDescriptionWithoutError(offer.release());
-
-  SendAudioVideoStream1();
-  std::unique_ptr<SessionDescriptionInterface> answer(CreateAnswer());
-  SetLocalDescriptionWithoutError(answer.release());
-
-  // Receive an offer with new ufrag and password.
-  for (size_t i = 0; i < options.media_description_options.size(); ++i) {
-    options.media_description_options[i].transport_options.ice_restart = true;
-  }
-
-  std::unique_ptr<JsepSessionDescription> updated_offer1(
-      CreateRemoteOffer(options, session_->remote_description()));
-  SetRemoteDescriptionWithoutError(updated_offer1.release());
-
-  std::unique_ptr<SessionDescriptionInterface> updated_answer1(CreateAnswer());
-
-  EXPECT_FALSE(IceUfragPwdEqual(updated_answer1->description(),
-                                session_->local_description()->description()));
-
-  // Even a second answer (created before the description is set) should have
-  // a new ufrag/password.
-  std::unique_ptr<SessionDescriptionInterface> updated_answer2(CreateAnswer());
-
-  EXPECT_FALSE(IceUfragPwdEqual(updated_answer2->description(),
-                                session_->local_description()->description()));
-
-  SetLocalDescriptionWithoutError(updated_answer2.release());
-}
-
-// This test verifies that an answer contains new ufrag and password if an offer
-// that changes either the ufrag or password (but not both) is received.
-// RFC 5245 says: "If the offer contained a change in the a=ice-ufrag or
-// a=ice-pwd attributes compared to the previous SDP from the peer, it
-// indicates that ICE is restarting for this media stream."
-TEST_F(WebRtcSessionTest, TestOfferChangingOnlyUfragOrPassword) {
-  Init();
-  cricket::MediaSessionOptions options;
-  GetOptionsForRemoteOffer(&options);
-  // Create an offer with audio and video.
-  std::unique_ptr<JsepSessionDescription> offer(CreateRemoteOffer(options));
-  SetIceUfragPwd(offer.get(), "original_ufrag", "original_password12345");
-  SetRemoteDescriptionWithoutError(offer.release());
-
-  SendAudioVideoStream1();
-  std::unique_ptr<SessionDescriptionInterface> answer(CreateAnswer());
-  SetLocalDescriptionWithoutError(answer.release());
-
-  // Receive an offer with a new ufrag but stale password.
-  std::unique_ptr<JsepSessionDescription> ufrag_changed_offer(
-      CreateRemoteOffer(options, session_->remote_description()));
-  SetIceUfragPwd(ufrag_changed_offer.get(), "modified_ufrag",
-                 "original_password12345");
-  SetRemoteDescriptionWithoutError(ufrag_changed_offer.release());
-
-  std::unique_ptr<SessionDescriptionInterface> updated_answer1(CreateAnswer());
-  EXPECT_FALSE(IceUfragPwdEqual(updated_answer1->description(),
-                                session_->local_description()->description()));
-  SetLocalDescriptionWithoutError(updated_answer1.release());
-
-  // Receive an offer with a new password but stale ufrag.
-  std::unique_ptr<JsepSessionDescription> password_changed_offer(
-      CreateRemoteOffer(options, session_->remote_description()));
-  SetIceUfragPwd(password_changed_offer.get(), "modified_ufrag",
-                 "modified_password12345");
-  SetRemoteDescriptionWithoutError(password_changed_offer.release());
-
-  std::unique_ptr<SessionDescriptionInterface> updated_answer2(CreateAnswer());
-  EXPECT_FALSE(IceUfragPwdEqual(updated_answer2->description(),
-                                session_->local_description()->description()));
-  SetLocalDescriptionWithoutError(updated_answer2.release());
-}
-
-// This test verifies that an answer contains old ufrag and password if an offer
-// with old ufrag and password is received.
-TEST_F(WebRtcSessionTest, TestCreateAnswerWithOldUfragAndPassword) {
-  Init();
-  cricket::MediaSessionOptions options;
-  GetOptionsForRemoteOffer(&options);
-  std::unique_ptr<JsepSessionDescription> offer(CreateRemoteOffer(options));
-  SetRemoteDescriptionWithoutError(offer.release());
-
-  SendAudioVideoStream1();
-  std::unique_ptr<SessionDescriptionInterface> answer(CreateAnswer());
-  SetLocalDescriptionWithoutError(answer.release());
-
-  // Receive an offer without changed ufrag or password.
-  std::unique_ptr<JsepSessionDescription> updated_offer2(
-      CreateRemoteOffer(options, session_->remote_description()));
-  SetRemoteDescriptionWithoutError(updated_offer2.release());
-
-  std::unique_ptr<SessionDescriptionInterface> updated_answer2(CreateAnswer());
-
-  EXPECT_TRUE(IceUfragPwdEqual(updated_answer2->description(),
-                               session_->local_description()->description()));
-
-  SetLocalDescriptionWithoutError(updated_answer2.release());
-}
-
-// This test verifies that if an offer does an ICE restart on some, but not all
-// media sections, the answer will change the ufrag/password in the correct
-// media sections.
-TEST_F(WebRtcSessionTest, TestCreateAnswerWithNewAndOldUfragAndPassword) {
-  Init();
-  cricket::MediaSessionOptions options;
-  GetOptionsForRemoteOffer(&options);
-  options.bundle_enabled = false;
-  std::unique_ptr<JsepSessionDescription> offer(CreateRemoteOffer(options));
-
-  SetIceUfragPwd(offer.get(), cricket::MEDIA_TYPE_AUDIO, "aaaa",
-                 "aaaaaaaaaaaaaaaaaaaaaa");
-  SetIceUfragPwd(offer.get(), cricket::MEDIA_TYPE_VIDEO, "bbbb",
-                 "bbbbbbbbbbbbbbbbbbbbbb");
-  SetRemoteDescriptionWithoutError(offer.release());
-
-  SendAudioVideoStream1();
-  std::unique_ptr<SessionDescriptionInterface> answer(CreateAnswer());
-  SetLocalDescriptionWithoutError(answer.release());
-
-  // Receive an offer with new ufrag and password, but only for the video media
-  // section.
-  std::unique_ptr<JsepSessionDescription> updated_offer(
-      CreateRemoteOffer(options, session_->remote_description()));
-  SetIceUfragPwd(updated_offer.get(), cricket::MEDIA_TYPE_VIDEO, "cccc",
-                 "cccccccccccccccccccccc");
-  SetRemoteDescriptionWithoutError(updated_offer.release());
-
-  std::unique_ptr<SessionDescriptionInterface> updated_answer(CreateAnswer());
-
-  EXPECT_TRUE(IceUfragPwdEqual(updated_answer->description(),
-                               session_->local_description()->description(),
-                               cricket::MEDIA_TYPE_AUDIO));
-
-  EXPECT_FALSE(IceUfragPwdEqual(updated_answer->description(),
-                                session_->local_description()->description(),
-                                cricket::MEDIA_TYPE_VIDEO));
-
-  SetLocalDescriptionWithoutError(updated_answer.release());
-}
-
-TEST_F(WebRtcSessionTest, TestSessionContentError) {
-  Init();
-  SendAudioVideoStream1();
-  SessionDescriptionInterface* offer = CreateOffer();
-  const std::string session_id_orig = offer->session_id();
-  const std::string session_version_orig = offer->session_version();
-  SetLocalDescriptionWithoutError(offer);
-
-  video_channel_ = media_engine_->GetVideoChannel(0);
-  video_channel_->set_fail_set_send_codecs(true);
-
-  SessionDescriptionInterface* answer =
-      CreateRemoteAnswer(session_->local_description());
-  SetRemoteDescriptionAnswerExpectError("ERROR_CONTENT", answer);
-
-  // Test that after a content error, setting any description will
-  // result in an error.
-  video_channel_->set_fail_set_send_codecs(false);
-  answer = CreateRemoteAnswer(session_->local_description());
-  SetRemoteDescriptionExpectError("", "ERROR_CONTENT", answer);
-  offer = CreateRemoteOffer();
-  SetLocalDescriptionExpectError("", "ERROR_CONTENT", offer);
-}
-
-// Runs the loopback call test with BUNDLE and STUN disabled.
-TEST_F(WebRtcSessionTest, TestIceStatesBasic) {
-  // Lets try with only UDP ports.
-  allocator_->set_flags(cricket::PORTALLOCATOR_DISABLE_TCP |
-                        cricket::PORTALLOCATOR_DISABLE_STUN |
-                        cricket::PORTALLOCATOR_DISABLE_RELAY);
-  TestLoopbackCall();
-}
-
-TEST_F(WebRtcSessionTest, TestIceStatesBasicIPv6) {
-  allocator_->set_flags(cricket::PORTALLOCATOR_DISABLE_TCP |
-                        cricket::PORTALLOCATOR_DISABLE_STUN |
-                        cricket::PORTALLOCATOR_ENABLE_IPV6 |
-                        cricket::PORTALLOCATOR_DISABLE_RELAY);
-
-  // best connection is IPv6 since it has higher network preference.
-  LoopbackNetworkConfiguration config;
-  config.test_ipv6_network_ = true;
-  config.best_connection_after_initial_ice_converged_ =
-      LoopbackNetworkConfiguration::ExpectedBestConnection(0, 1);
-
-  TestLoopbackCall(config);
-}
-
-// Runs the loopback call test with BUNDLE and STUN enabled.
-TEST_F(WebRtcSessionTest, TestIceStatesBundle) {
-  allocator_->set_flags(cricket::PORTALLOCATOR_DISABLE_TCP |
-                        cricket::PORTALLOCATOR_DISABLE_RELAY);
-  TestLoopbackCall();
-}
-
-TEST_F(WebRtcSessionTest, TestRtpDataChannel) {
-  configuration_.enable_rtp_data_channel = true;
-  Init();
-  SetLocalDescriptionWithDataChannel();
-  ASSERT_TRUE(data_engine_);
-  EXPECT_NE(nullptr, data_engine_->GetChannel(0));
-}
-
-TEST_P(WebRtcSessionTest, TestRtpDataChannelConstraintTakesPrecedence) {
-  configuration_.enable_rtp_data_channel = true;
-  options_.disable_sctp_data_channels = false;
-
-  InitWithDtls(GetParam());
-
-  SetLocalDescriptionWithDataChannel();
-  EXPECT_NE(nullptr, data_engine_->GetChannel(0));
-}
-
-// Test that sctp_content_name/sctp_transport_name (used for stats) are correct
-// before and after BUNDLE is negotiated.
-TEST_P(WebRtcSessionTest, SctpContentAndTransportName) {
-  SetFactoryDtlsSrtp();
-  InitWithDtls(GetParam());
-
-  // Initially these fields should be empty.
-  EXPECT_FALSE(session_->sctp_content_name());
-  EXPECT_FALSE(session_->sctp_transport_name());
-
-  // Create offer with audio/video/data.
-  // Default bundle policy is "balanced", so data should be using its own
-  // transport.
-  SendAudioVideoStream1();
-  CreateDataChannel();
-  InitiateCall();
-  ASSERT_TRUE(session_->sctp_content_name());
-  ASSERT_TRUE(session_->sctp_transport_name());
-  EXPECT_EQ("data", *session_->sctp_content_name());
-  EXPECT_EQ("data", *session_->sctp_transport_name());
-
-  // Create answer that finishes BUNDLE negotiation, which means everything
-  // should be bundled on the first transport (audio).
-  cricket::MediaSessionOptions answer_options;
-  answer_options.bundle_enabled = true;
-  answer_options.data_channel_type = cricket::DCT_SCTP;
-  GetOptionsForAnswer(&answer_options);
-  SetRemoteDescriptionWithoutError(CreateRemoteAnswer(
-      session_->local_description(), answer_options, cricket::SEC_DISABLED));
-  ASSERT_TRUE(session_->sctp_content_name());
-  ASSERT_TRUE(session_->sctp_transport_name());
-  EXPECT_EQ("data", *session_->sctp_content_name());
-  EXPECT_EQ("audio", *session_->sctp_transport_name());
-}
-
-TEST_P(WebRtcSessionTest, TestCreateOfferWithSctpEnabledWithoutStreams) {
-  InitWithDtls(GetParam());
-
-  std::unique_ptr<SessionDescriptionInterface> offer(CreateOffer());
-  EXPECT_TRUE(offer->description()->GetContentByName("data") == NULL);
-  EXPECT_TRUE(offer->description()->GetTransportInfoByName("data") == NULL);
-}
-
-TEST_P(WebRtcSessionTest, TestCreateAnswerWithSctpInOfferAndNoStreams) {
-  SetFactoryDtlsSrtp();
-  InitWithDtls(GetParam());
-
-  // Create remote offer with SCTP.
-  cricket::MediaSessionOptions options;
-  options.data_channel_type = cricket::DCT_SCTP;
-  GetOptionsForRemoteOffer(&options);
-  JsepSessionDescription* offer =
-      CreateRemoteOffer(options, cricket::SEC_DISABLED);
-  SetRemoteDescriptionWithoutError(offer);
-
-  // Verifies the answer contains SCTP.
-  std::unique_ptr<SessionDescriptionInterface> answer(CreateAnswer());
-  EXPECT_TRUE(answer != NULL);
-  EXPECT_TRUE(answer->description()->GetContentByName("data") != NULL);
-  EXPECT_TRUE(answer->description()->GetTransportInfoByName("data") != NULL);
-}
-
-// Test that if DTLS is disabled, we don't end up with an SctpTransport
-// created (or an RtpDataChannel).
-TEST_P(WebRtcSessionTest, TestSctpDataChannelWithoutDtls) {
-  configuration_.enable_dtls_srtp = rtc::Optional<bool>(false);
-  InitWithDtls(GetParam());
-
-  SetLocalDescriptionWithDataChannel();
-  EXPECT_EQ(nullptr, data_engine_->GetChannel(0));
-  EXPECT_EQ(nullptr, fake_sctp_transport_factory_->last_fake_sctp_transport());
-}
-
-// Test that if DTLS is enabled, we end up with an SctpTransport created
-// (and not an RtpDataChannel).
-TEST_P(WebRtcSessionTest, TestSctpDataChannelWithDtls) {
-  InitWithDtls(GetParam());
-
-  SetLocalDescriptionWithDataChannel();
-  EXPECT_EQ(nullptr, data_engine_->GetChannel(0));
-  EXPECT_NE(nullptr, fake_sctp_transport_factory_->last_fake_sctp_transport());
-}
-
-// Test that if SCTP is disabled, we don't end up with an SctpTransport
-// created (or an RtpDataChannel).
-TEST_P(WebRtcSessionTest, TestDisableSctpDataChannels) {
-  options_.disable_sctp_data_channels = true;
-  InitWithDtls(GetParam());
-
-  SetLocalDescriptionWithDataChannel();
-  EXPECT_EQ(nullptr, data_engine_->GetChannel(0));
-  EXPECT_EQ(nullptr, fake_sctp_transport_factory_->last_fake_sctp_transport());
-}
-
-TEST_P(WebRtcSessionTest, TestSctpDataChannelSendPortParsing) {
-  const int new_send_port = 9998;
-  const int new_recv_port = 7775;
-
-  InitWithDtls(GetParam());
-  SetFactoryDtlsSrtp();
-
-  // By default, don't actually add the codecs to desc_factory_; they don't
-  // actually get serialized for SCTP in BuildMediaDescription().  Instead,
-  // let the session description get parsed.  That'll get the proper codecs
-  // into the stream.
-  cricket::MediaSessionOptions options;
-  SessionDescriptionInterface* offer =
-      CreateRemoteOfferWithSctpPort("stream1", new_send_port, options);
-
-  // SetRemoteDescription will take the ownership of the offer.
-  SetRemoteDescriptionWithoutError(offer);
-
-  SessionDescriptionInterface* answer =
-      ChangeSDPSctpPort(new_recv_port, CreateAnswer());
-  ASSERT_TRUE(answer != NULL);
-
-  // Now set the local description, which'll take ownership of the answer.
-  SetLocalDescriptionWithoutError(answer);
-
-  // TEST PLAN: Set the port number to something new, set it in the SDP,
-  // and pass it all the way down.
-  EXPECT_EQ(nullptr, data_engine_->GetChannel(0));
-  CreateDataChannel();
-  ASSERT_NE(nullptr, fake_sctp_transport_factory_->last_fake_sctp_transport());
-  EXPECT_EQ(
-      new_recv_port,
-      fake_sctp_transport_factory_->last_fake_sctp_transport()->local_port());
-  EXPECT_EQ(
-      new_send_port,
-      fake_sctp_transport_factory_->last_fake_sctp_transport()->remote_port());
-}
-
-// Verifies that when a session's SctpTransport receives an OPEN message,
-// WebRtcSession signals the SctpTransport creation request with the expected
-// config.
-TEST_P(WebRtcSessionTest, TestSctpDataChannelOpenMessage) {
-  InitWithDtls(GetParam());
-
-  SetLocalDescriptionWithDataChannel();
-  EXPECT_EQ(nullptr, data_engine_->GetChannel(0));
-  ASSERT_NE(nullptr, fake_sctp_transport_factory_->last_fake_sctp_transport());
-
-  // Make the fake SCTP transport pretend it received an OPEN message.
-  webrtc::DataChannelInit config;
-  config.id = 1;
-  rtc::CopyOnWriteBuffer payload;
-  webrtc::WriteDataChannelOpenMessage("a", config, &payload);
-  cricket::ReceiveDataParams params;
-  params.ssrc = config.id;
-  params.type = cricket::DMT_CONTROL;
-  fake_sctp_transport_factory_->last_fake_sctp_transport()->SignalDataReceived(
-      params, payload);
-
-  EXPECT_EQ_WAIT("a", last_data_channel_label_, kDefaultTimeout);
-  EXPECT_EQ(config.id, last_data_channel_config_.id);
-  EXPECT_FALSE(last_data_channel_config_.negotiated);
-  EXPECT_EQ(webrtc::InternalDataChannelInit::kAcker,
-            last_data_channel_config_.open_handshake_role);
-}
-
-TEST_P(WebRtcSessionTest, TestUsesProvidedCertificate) {
-  rtc::scoped_refptr<rtc::RTCCertificate> certificate =
-      FakeRTCCertificateGenerator::GenerateCertificate();
-
-  configuration_.certificates.push_back(certificate);
-  Init();
-  EXPECT_TRUE_WAIT(!session_->waiting_for_certificate_for_testing(), 1000);
-
-  EXPECT_EQ(session_->certificate_for_testing(), certificate);
-}
-
-// Verifies that CreateOffer succeeds when CreateOffer is called before async
-// identity generation is finished (even if a certificate is provided this is
-// an async op).
-TEST_P(WebRtcSessionTest, TestCreateOfferBeforeIdentityRequestReturnSuccess) {
-  InitWithDtls(GetParam());
-
-  EXPECT_TRUE(session_->waiting_for_certificate_for_testing());
-  SendAudioVideoStream1();
-  std::unique_ptr<SessionDescriptionInterface> offer(CreateOffer());
-
-  EXPECT_TRUE(offer != NULL);
-  VerifyNoCryptoParams(offer->description(), true);
-  VerifyFingerprintStatus(offer->description(), true);
-}
-
-// Verifies that CreateAnswer succeeds when CreateOffer is called before async
-// identity generation is finished (even if a certificate is provided this is
-// an async op).
-TEST_P(WebRtcSessionTest, TestCreateAnswerBeforeIdentityRequestReturnSuccess) {
-  InitWithDtls(GetParam());
-  SetFactoryDtlsSrtp();
-
-  cricket::MediaSessionOptions options;
-  GetOptionsForRemoteOffer(&options);
-  std::unique_ptr<JsepSessionDescription> offer(
-      CreateRemoteOffer(options, cricket::SEC_DISABLED));
-  ASSERT_TRUE(offer.get() != NULL);
-  SetRemoteDescriptionWithoutError(offer.release());
-
-  std::unique_ptr<SessionDescriptionInterface> answer(CreateAnswer());
-  EXPECT_TRUE(answer != NULL);
-  VerifyNoCryptoParams(answer->description(), true);
-  VerifyFingerprintStatus(answer->description(), true);
-}
-
-// Verifies that CreateOffer succeeds when CreateOffer is called after async
-// identity generation is finished (even if a certificate is provided this is
-// an async op).
-TEST_P(WebRtcSessionTest, TestCreateOfferAfterIdentityRequestReturnSuccess) {
-  InitWithDtls(GetParam());
-
-  EXPECT_TRUE_WAIT(!session_->waiting_for_certificate_for_testing(), 1000);
-
-  std::unique_ptr<SessionDescriptionInterface> offer(CreateOffer());
-  EXPECT_TRUE(offer != NULL);
-}
-
-// Verifies that CreateOffer fails when CreateOffer is called after async
-// identity generation fails.
-TEST_F(WebRtcSessionTest, TestCreateOfferAfterIdentityRequestReturnFailure) {
-  InitWithDtlsIdentityGenFail();
-
-  EXPECT_TRUE_WAIT(!session_->waiting_for_certificate_for_testing(), 1000);
-
-  std::unique_ptr<SessionDescriptionInterface> offer(CreateOffer());
-  EXPECT_TRUE(offer == NULL);
-}
-
-// Verifies that CreateOffer succeeds when Multiple CreateOffer calls are made
-// before async identity generation is finished.
-TEST_P(WebRtcSessionTest,
-       TestMultipleCreateOfferBeforeIdentityRequestReturnSuccess) {
-  VerifyMultipleAsyncCreateDescription(GetParam(),
-                                       CreateSessionDescriptionRequest::kOffer);
-}
-
-// Verifies that CreateOffer fails when Multiple CreateOffer calls are made
-// before async identity generation fails.
-TEST_F(WebRtcSessionTest,
-       TestMultipleCreateOfferBeforeIdentityRequestReturnFailure) {
-  VerifyMultipleAsyncCreateDescriptionIdentityGenFailure(
-      CreateSessionDescriptionRequest::kOffer);
-}
-
-// Verifies that CreateAnswer succeeds when Multiple CreateAnswer calls are made
-// before async identity generation is finished.
-TEST_P(WebRtcSessionTest,
-       TestMultipleCreateAnswerBeforeIdentityRequestReturnSuccess) {
-  VerifyMultipleAsyncCreateDescription(
-      GetParam(), CreateSessionDescriptionRequest::kAnswer);
-}
-
-// Verifies that CreateAnswer fails when Multiple CreateAnswer calls are made
-// before async identity generation fails.
-TEST_F(WebRtcSessionTest,
-       TestMultipleCreateAnswerBeforeIdentityRequestReturnFailure) {
-  VerifyMultipleAsyncCreateDescriptionIdentityGenFailure(
-      CreateSessionDescriptionRequest::kAnswer);
-}
-
-// Verifies that setRemoteDescription fails when DTLS is disabled and the remote
-// offer has no SDES crypto but only DTLS fingerprint.
-TEST_F(WebRtcSessionTest, TestSetRemoteOfferFailIfDtlsDisabledAndNoCrypto) {
-  // Init without DTLS.
-  Init();
-  // Create a remote offer with secured transport disabled.
-  cricket::MediaSessionOptions options;
-  GetOptionsForRemoteOffer(&options);
-  JsepSessionDescription* offer(CreateRemoteOffer(
-      options, cricket::SEC_DISABLED));
-  // Adds a DTLS fingerprint to the remote offer.
-  cricket::SessionDescription* sdp = offer->description();
-  TransportInfo* audio = sdp->GetTransportInfoByName("audio");
-  ASSERT_TRUE(audio != NULL);
-  ASSERT_TRUE(audio->description.identity_fingerprint.get() == NULL);
-  audio->description.identity_fingerprint.reset(
-      rtc::SSLFingerprint::CreateFromRfc4572(
-          rtc::DIGEST_SHA_256, kFakeDtlsFingerprint));
-  SetRemoteDescriptionOfferExpectError(kSdpWithoutSdesCrypto,
-                                       offer);
-}
-
-TEST_F(WebRtcSessionTest, TestCombinedAudioVideoBweConstraint) {
-  configuration_.combined_audio_video_bwe = rtc::Optional<bool>(true);
-  Init();
-  SendAudioVideoStream1();
-  SessionDescriptionInterface* offer = CreateOffer();
-
-  SetLocalDescriptionWithoutError(offer);
-
-  voice_channel_ = media_engine_->GetVoiceChannel(0);
-
-  ASSERT_TRUE(voice_channel_ != NULL);
-  const cricket::AudioOptions& audio_options = voice_channel_->options();
-  EXPECT_EQ(rtc::Optional<bool>(true), audio_options.combined_audio_video_bwe);
-}
-
-// Tests that we can renegotiate new media content with ICE candidates in the
-// new remote SDP.
-TEST_P(WebRtcSessionTest, TestRenegotiateNewMediaWithCandidatesInSdp) {
-  InitWithDtls(GetParam());
-  SetFactoryDtlsSrtp();
-
-  SendAudioOnlyStream2();
-  SessionDescriptionInterface* offer = CreateOffer();
-  SetLocalDescriptionWithoutError(offer);
-
-  SessionDescriptionInterface* answer = CreateRemoteAnswer(offer);
-  SetRemoteDescriptionWithoutError(answer);
-
-  cricket::MediaSessionOptions options;
-  GetOptionsForRemoteOffer(&options);
-  offer = CreateRemoteOffer(options, cricket::SEC_DISABLED);
-
-  cricket::Candidate candidate1;
-  candidate1.set_address(rtc::SocketAddress("1.1.1.1", 5000));
-  candidate1.set_component(1);
-  JsepIceCandidate ice_candidate(kMediaContentName1, kMediaContentIndex1,
-                                 candidate1);
-  EXPECT_TRUE(offer->AddCandidate(&ice_candidate));
-  SetRemoteDescriptionWithoutError(offer);
-
-  answer = CreateAnswer();
-  SetLocalDescriptionWithoutError(answer);
-}
-
-// Tests that we can renegotiate new media content with ICE candidates separated
-// from the remote SDP.
-TEST_P(WebRtcSessionTest, TestRenegotiateNewMediaWithCandidatesSeparated) {
-  InitWithDtls(GetParam());
-  SetFactoryDtlsSrtp();
-
-  SendAudioOnlyStream2();
-  SessionDescriptionInterface* offer = CreateOffer();
-  SetLocalDescriptionWithoutError(offer);
-
-  SessionDescriptionInterface* answer = CreateRemoteAnswer(offer);
-  SetRemoteDescriptionWithoutError(answer);
-
-  cricket::MediaSessionOptions options;
-  GetOptionsForRemoteOffer(&options);
-  offer = CreateRemoteOffer(options, cricket::SEC_DISABLED);
-  SetRemoteDescriptionWithoutError(offer);
-
-  cricket::Candidate candidate1;
-  candidate1.set_address(rtc::SocketAddress("1.1.1.1", 5000));
-  candidate1.set_component(1);
-  JsepIceCandidate ice_candidate(kMediaContentName1, kMediaContentIndex1,
-                                 candidate1);
-  EXPECT_TRUE(session_->ProcessIceMessage(&ice_candidate));
-
-  answer = CreateAnswer();
-  SetLocalDescriptionWithoutError(answer);
-}
-
-#ifdef HAVE_QUIC
-TEST_P(WebRtcSessionTest, TestNegotiateQuic) {
-  configuration_.enable_quic = true;
-  InitWithDtls(GetParam());
-  EXPECT_TRUE(session_->data_channel_type() == cricket::DCT_QUIC);
-  SessionDescriptionInterface* offer = CreateOffer();
-  ASSERT_TRUE(offer);
-  ASSERT_TRUE(offer->description());
-  SetLocalDescriptionWithoutError(offer);
-  cricket::MediaSessionOptions options;
-  GetOptionsForAnswer(&options);
-  SessionDescriptionInterface* answer =
-      CreateRemoteAnswer(offer, options, cricket::SEC_DISABLED);
-  ASSERT_TRUE(answer);
-  ASSERT_TRUE(answer->description());
-  SetRemoteDescriptionWithoutError(answer);
-}
-#endif  // HAVE_QUIC
-
-// Tests that RTX codec is removed from the answer when it isn't supported
-// by local side.
-TEST_F(WebRtcSessionTest, TestRtxRemovedByCreateAnswer) {
-  Init();
-  // Send video only to match the |kSdpWithRtx|.
-  SendVideoOnlyStream2();
-  std::string offer_sdp(kSdpWithRtx);
-
-  SessionDescriptionInterface* offer =
-      CreateSessionDescription(JsepSessionDescription::kOffer, offer_sdp, NULL);
-  EXPECT_TRUE(offer->ToString(&offer_sdp));
-
-  // Offer SDP contains the RTX codec.
-  EXPECT_TRUE(ContainsVideoCodecWithName(offer, "rtx"));
-  SetRemoteDescriptionWithoutError(offer);
-
-  // |offered_media_sections_| is used when creating answer.
-  offered_media_sections_.push_back(cricket::MediaDescriptionOptions(
-      cricket::MEDIA_TYPE_VIDEO, cricket::CN_VIDEO,
-      cricket::RtpTransceiverDirection(true, true), false));
-  // Don't create media section for audio in the answer.
-  SessionDescriptionInterface* answer = CreateAnswer();
-  // Answer SDP does not contain the RTX codec.
-  EXPECT_FALSE(ContainsVideoCodecWithName(answer, "rtx"));
-  SetLocalDescriptionWithoutError(answer);
-}
-
-// This verifies that the voice channel after bundle has both options from video
-// and voice channels.
-TEST_F(WebRtcSessionTest, TestSetSocketOptionBeforeBundle) {
-  InitWithBundlePolicy(PeerConnectionInterface::kBundlePolicyBalanced);
-  SendAudioVideoStream1();
-
-  PeerConnectionInterface::RTCOfferAnswerOptions options;
-  options.use_rtp_mux = true;
-
-  SessionDescriptionInterface* offer = CreateOffer(options);
-  SetLocalDescriptionWithoutError(offer);
-
-  session_->video_channel()->SetOption(cricket::BaseChannel::ST_RTP,
-                                       rtc::Socket::Option::OPT_SNDBUF, 4000);
-
-  session_->voice_channel()->SetOption(cricket::BaseChannel::ST_RTP,
-                                       rtc::Socket::Option::OPT_RCVBUF, 8000);
-
-  int option_val;
-  EXPECT_TRUE(session_->video_rtp_transport_channel()->GetOption(
-      rtc::Socket::Option::OPT_SNDBUF, &option_val));
-  EXPECT_EQ(4000, option_val);
-  EXPECT_FALSE(session_->voice_rtp_transport_channel()->GetOption(
-      rtc::Socket::Option::OPT_SNDBUF, &option_val));
-
-  EXPECT_TRUE(session_->voice_rtp_transport_channel()->GetOption(
-      rtc::Socket::Option::OPT_RCVBUF, &option_val));
-  EXPECT_EQ(8000, option_val);
-  EXPECT_FALSE(session_->video_rtp_transport_channel()->GetOption(
-      rtc::Socket::Option::OPT_RCVBUF, &option_val));
-
-  EXPECT_NE(session_->voice_rtp_transport_channel(),
-            session_->video_rtp_transport_channel());
-
-  SendAudioVideoStream2();
-  SessionDescriptionInterface* answer =
-      CreateRemoteAnswer(session_->local_description());
-  SetRemoteDescriptionWithoutError(answer);
-
-  EXPECT_TRUE(session_->voice_rtp_transport_channel()->GetOption(
-      rtc::Socket::Option::OPT_SNDBUF, &option_val));
-  EXPECT_EQ(4000, option_val);
-
-  EXPECT_TRUE(session_->voice_rtp_transport_channel()->GetOption(
-      rtc::Socket::Option::OPT_RCVBUF, &option_val));
-  EXPECT_EQ(8000, option_val);
-}
-
-// Test creating a session, request multiple offers, destroy the session
-// and make sure we got success/failure callbacks for all of the requests.
-// Background: crbug.com/507307
-TEST_F(WebRtcSessionTest, CreateOffersAndShutdown) {
-  Init();
-
-  rtc::scoped_refptr<WebRtcSessionCreateSDPObserverForTest> observers[100];
-  PeerConnectionInterface::RTCOfferAnswerOptions options;
-  options.offer_to_receive_audio =
-      RTCOfferAnswerOptions::kOfferToReceiveMediaTrue;
-  cricket::MediaSessionOptions session_options;
-  GetOptionsForOffer(options, &session_options);
-  for (auto& o : observers) {
-    o = new WebRtcSessionCreateSDPObserverForTest();
-    session_->CreateOffer(o, options, session_options);
-  }
-
-  session_.reset();
-
-  for (auto& o : observers) {
-    // We expect to have received a notification now even if the session was
-    // terminated.  The offer creation may or may not have succeeded, but we
-    // must have received a notification which, so the only invalid state
-    // is kInit.
-    EXPECT_NE(WebRtcSessionCreateSDPObserverForTest::kInit, o->state());
-  }
-}
-
-TEST_F(WebRtcSessionTest, TestPacketOptionsAndOnPacketSent) {
-  TestPacketOptions();
-}
-
-// TODO(bemasc): Add a TestIceStatesBundle with BUNDLE enabled.  That test
-// currently fails because upon disconnection and reconnection OnIceComplete is
-// called more than once without returning to IceGatheringGathering.
-
-INSTANTIATE_TEST_CASE_P(WebRtcSessionTests,
-                        WebRtcSessionTest,
-                        testing::Values(ALREADY_GENERATED,
-                                        DTLS_IDENTITY_STORE));
diff --git a/pc/webrtcsessiondescriptionfactory.cc b/pc/webrtcsessiondescriptionfactory.cc
deleted file mode 100644
index beb8d1e..0000000
--- a/pc/webrtcsessiondescriptionfactory.cc
+++ /dev/null
@@ -1,512 +0,0 @@
-/*
- *  Copyright 2013 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/pc/webrtcsessiondescriptionfactory.h"
-
-#include <utility>
-
-#include "webrtc/api/jsep.h"
-#include "webrtc/api/jsepsessiondescription.h"
-#include "webrtc/api/mediaconstraintsinterface.h"
-#include "webrtc/pc/webrtcsession.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/sslidentity.h"
-
-using cricket::MediaSessionOptions;
-
-namespace webrtc {
-namespace {
-static const char kFailedDueToIdentityFailed[] =
-    " failed because DTLS identity request failed";
-static const char kFailedDueToSessionShutdown[] =
-    " failed because the session was shut down";
-
-static const uint64_t kInitSessionVersion = 2;
-
-static bool CompareSenderOptions(const cricket::SenderOptions& sender1,
-                                 const cricket::SenderOptions& sender2) {
-  return sender1.track_id < sender2.track_id;
-}
-
-static bool SameId(const cricket::SenderOptions& sender1,
-                   const cricket::SenderOptions& sender2) {
-  return sender1.track_id == sender2.track_id;
-}
-
-// Check that each sender has a unique ID.
-static bool ValidMediaSessionOptions(
-    const cricket::MediaSessionOptions& session_options) {
-  std::vector<cricket::SenderOptions> sorted_senders;
-  for (const cricket::MediaDescriptionOptions& media_description_options :
-       session_options.media_description_options) {
-    sorted_senders.insert(sorted_senders.end(),
-                          media_description_options.sender_options.begin(),
-                          media_description_options.sender_options.end());
-  }
-  std::sort(sorted_senders.begin(), sorted_senders.end(), CompareSenderOptions);
-  std::vector<cricket::SenderOptions>::iterator it =
-      std::adjacent_find(sorted_senders.begin(), sorted_senders.end(), SameId);
-  return it == sorted_senders.end();
-}
-
-enum {
-  MSG_CREATE_SESSIONDESCRIPTION_SUCCESS,
-  MSG_CREATE_SESSIONDESCRIPTION_FAILED,
-  MSG_USE_CONSTRUCTOR_CERTIFICATE
-};
-
-struct CreateSessionDescriptionMsg : public rtc::MessageData {
-  explicit CreateSessionDescriptionMsg(
-      webrtc::CreateSessionDescriptionObserver* observer)
-      : observer(observer) {
-  }
-
-  rtc::scoped_refptr<webrtc::CreateSessionDescriptionObserver> observer;
-  std::string error;
-  std::unique_ptr<webrtc::SessionDescriptionInterface> description;
-};
-}  // namespace
-
-void WebRtcCertificateGeneratorCallback::OnFailure() {
-  SignalRequestFailed();
-}
-
-void WebRtcCertificateGeneratorCallback::OnSuccess(
-    const rtc::scoped_refptr<rtc::RTCCertificate>& certificate) {
-  SignalCertificateReady(certificate);
-}
-
-// static
-void WebRtcSessionDescriptionFactory::CopyCandidatesFromSessionDescription(
-    const SessionDescriptionInterface* source_desc,
-    const std::string& content_name,
-    SessionDescriptionInterface* dest_desc) {
-  if (!source_desc) {
-    return;
-  }
-  const cricket::ContentInfos& contents =
-      source_desc->description()->contents();
-  const cricket::ContentInfo* cinfo =
-      source_desc->description()->GetContentByName(content_name);
-  if (!cinfo) {
-    return;
-  }
-  size_t mediasection_index = static_cast<int>(cinfo - &contents[0]);
-  const IceCandidateCollection* source_candidates =
-      source_desc->candidates(mediasection_index);
-  const IceCandidateCollection* dest_candidates =
-      dest_desc->candidates(mediasection_index);
-  if (!source_candidates || !dest_candidates) {
-    return;
-  }
-  for (size_t n = 0; n < source_candidates->count(); ++n) {
-    const IceCandidateInterface* new_candidate = source_candidates->at(n);
-    if (!dest_candidates->HasCandidate(new_candidate)) {
-      dest_desc->AddCandidate(source_candidates->at(n));
-    }
-  }
-}
-
-// Private constructor called by other constructors.
-WebRtcSessionDescriptionFactory::WebRtcSessionDescriptionFactory(
-    rtc::Thread* signaling_thread,
-    cricket::ChannelManager* channel_manager,
-    WebRtcSession* session,
-    const std::string& session_id,
-    std::unique_ptr<rtc::RTCCertificateGeneratorInterface> cert_generator,
-    const rtc::scoped_refptr<rtc::RTCCertificate>& certificate)
-    : signaling_thread_(signaling_thread),
-      session_desc_factory_(channel_manager, &transport_desc_factory_),
-      // RFC 4566 suggested a Network Time Protocol (NTP) format timestamp
-      // as the session id and session version. To simplify, it should be fine
-      // to just use a random number as session id and start version from
-      // |kInitSessionVersion|.
-      session_version_(kInitSessionVersion),
-      cert_generator_(std::move(cert_generator)),
-      session_(session),
-      session_id_(session_id),
-      certificate_request_state_(CERTIFICATE_NOT_NEEDED) {
-  RTC_DCHECK(signaling_thread_);
-  bool dtls_enabled = cert_generator_ || certificate;
-  // SRTP-SDES is disabled if DTLS is on.
-  SetSdesPolicy(dtls_enabled ? cricket::SEC_DISABLED : cricket::SEC_REQUIRED);
-  if (!dtls_enabled) {
-    LOG(LS_VERBOSE) << "DTLS-SRTP disabled.";
-    return;
-  }
-
-  if (certificate) {
-    // Use |certificate|.
-    certificate_request_state_ = CERTIFICATE_WAITING;
-
-    LOG(LS_VERBOSE) << "DTLS-SRTP enabled; has certificate parameter.";
-    // We already have a certificate but we wait to do |SetIdentity|; if we do
-    // it in the constructor then the caller has not had a chance to connect to
-    // |SignalCertificateReady|.
-    signaling_thread_->Post(
-        RTC_FROM_HERE, this, MSG_USE_CONSTRUCTOR_CERTIFICATE,
-        new rtc::ScopedRefMessageData<rtc::RTCCertificate>(certificate));
-  } else {
-    // Generate certificate.
-    certificate_request_state_ = CERTIFICATE_WAITING;
-
-    rtc::scoped_refptr<WebRtcCertificateGeneratorCallback> callback(
-        new rtc::RefCountedObject<WebRtcCertificateGeneratorCallback>());
-    callback->SignalRequestFailed.connect(
-        this, &WebRtcSessionDescriptionFactory::OnCertificateRequestFailed);
-    callback->SignalCertificateReady.connect(
-        this, &WebRtcSessionDescriptionFactory::SetCertificate);
-
-    rtc::KeyParams key_params = rtc::KeyParams();
-    LOG(LS_VERBOSE) << "DTLS-SRTP enabled; sending DTLS identity request (key "
-                    << "type: " << key_params.type() << ").";
-
-    // Request certificate. This happens asynchronously, so that the caller gets
-    // a chance to connect to |SignalCertificateReady|.
-    cert_generator_->GenerateCertificateAsync(
-        key_params, rtc::Optional<uint64_t>(), callback);
-  }
-}
-
-WebRtcSessionDescriptionFactory::WebRtcSessionDescriptionFactory(
-    rtc::Thread* signaling_thread,
-    cricket::ChannelManager* channel_manager,
-    WebRtcSession* session,
-    const std::string& session_id,
-    std::unique_ptr<rtc::RTCCertificateGeneratorInterface> cert_generator)
-    : WebRtcSessionDescriptionFactory(
-          signaling_thread,
-          channel_manager,
-          session,
-          session_id,
-          std::move(cert_generator),
-          nullptr) {
-}
-
-WebRtcSessionDescriptionFactory::WebRtcSessionDescriptionFactory(
-    rtc::Thread* signaling_thread,
-    cricket::ChannelManager* channel_manager,
-    WebRtcSession* session,
-    const std::string& session_id,
-    const rtc::scoped_refptr<rtc::RTCCertificate>& certificate)
-    : WebRtcSessionDescriptionFactory(signaling_thread,
-                                      channel_manager,
-                                      session,
-                                      session_id,
-                                      nullptr,
-                                      certificate) {
-  RTC_DCHECK(certificate);
-}
-
-WebRtcSessionDescriptionFactory::~WebRtcSessionDescriptionFactory() {
-  RTC_DCHECK(signaling_thread_->IsCurrent());
-
-  // Fail any requests that were asked for before identity generation completed.
-  FailPendingRequests(kFailedDueToSessionShutdown);
-
-  // Process all pending notifications in the message queue.  If we don't do
-  // this, requests will linger and not know they succeeded or failed.
-  rtc::MessageList list;
-  signaling_thread_->Clear(this, rtc::MQID_ANY, &list);
-  for (auto& msg : list) {
-    if (msg.message_id != MSG_USE_CONSTRUCTOR_CERTIFICATE) {
-      OnMessage(&msg);
-    } else {
-      // Skip MSG_USE_CONSTRUCTOR_CERTIFICATE because we don't want to trigger
-      // SetIdentity-related callbacks in the destructor. This can be a problem
-      // when WebRtcSession listens to the callback but it was the WebRtcSession
-      // destructor that caused WebRtcSessionDescriptionFactory's destruction.
-      // The callback is then ignored, leaking memory allocated by OnMessage for
-      // MSG_USE_CONSTRUCTOR_CERTIFICATE.
-      delete msg.pdata;
-    }
-  }
-}
-
-void WebRtcSessionDescriptionFactory::CreateOffer(
-    CreateSessionDescriptionObserver* observer,
-    const PeerConnectionInterface::RTCOfferAnswerOptions& options,
-    const cricket::MediaSessionOptions& session_options) {
-  std::string error = "CreateOffer";
-  if (certificate_request_state_ == CERTIFICATE_FAILED) {
-    error += kFailedDueToIdentityFailed;
-    LOG(LS_ERROR) << error;
-    PostCreateSessionDescriptionFailed(observer, error);
-    return;
-  }
-
-  if (!ValidMediaSessionOptions(session_options)) {
-    error += " called with invalid session options";
-    LOG(LS_ERROR) << error;
-    PostCreateSessionDescriptionFailed(observer, error);
-    return;
-  }
-
-  CreateSessionDescriptionRequest request(
-      CreateSessionDescriptionRequest::kOffer, observer, session_options);
-  if (certificate_request_state_ == CERTIFICATE_WAITING) {
-    create_session_description_requests_.push(request);
-  } else {
-    RTC_DCHECK(certificate_request_state_ == CERTIFICATE_SUCCEEDED ||
-               certificate_request_state_ == CERTIFICATE_NOT_NEEDED);
-    InternalCreateOffer(request);
-  }
-}
-
-void WebRtcSessionDescriptionFactory::CreateAnswer(
-    CreateSessionDescriptionObserver* observer,
-    const cricket::MediaSessionOptions& session_options) {
-  std::string error = "CreateAnswer";
-  if (certificate_request_state_ == CERTIFICATE_FAILED) {
-    error += kFailedDueToIdentityFailed;
-    LOG(LS_ERROR) << error;
-    PostCreateSessionDescriptionFailed(observer, error);
-    return;
-  }
-  if (!session_->remote_description()) {
-    error += " can't be called before SetRemoteDescription.";
-    LOG(LS_ERROR) << error;
-    PostCreateSessionDescriptionFailed(observer, error);
-    return;
-  }
-  if (session_->remote_description()->type() !=
-      JsepSessionDescription::kOffer) {
-    error += " failed because remote_description is not an offer.";
-    LOG(LS_ERROR) << error;
-    PostCreateSessionDescriptionFailed(observer, error);
-    return;
-  }
-
-  if (!ValidMediaSessionOptions(session_options)) {
-    error += " called with invalid session options.";
-    LOG(LS_ERROR) << error;
-    PostCreateSessionDescriptionFailed(observer, error);
-    return;
-  }
-
-  CreateSessionDescriptionRequest request(
-      CreateSessionDescriptionRequest::kAnswer, observer, session_options);
-  if (certificate_request_state_ == CERTIFICATE_WAITING) {
-    create_session_description_requests_.push(request);
-  } else {
-    RTC_DCHECK(certificate_request_state_ == CERTIFICATE_SUCCEEDED ||
-               certificate_request_state_ == CERTIFICATE_NOT_NEEDED);
-    InternalCreateAnswer(request);
-  }
-}
-
-void WebRtcSessionDescriptionFactory::SetSdesPolicy(
-    cricket::SecurePolicy secure_policy) {
-  session_desc_factory_.set_secure(secure_policy);
-}
-
-cricket::SecurePolicy WebRtcSessionDescriptionFactory::SdesPolicy() const {
-  return session_desc_factory_.secure();
-}
-
-void WebRtcSessionDescriptionFactory::OnMessage(rtc::Message* msg) {
-  switch (msg->message_id) {
-    case MSG_CREATE_SESSIONDESCRIPTION_SUCCESS: {
-      CreateSessionDescriptionMsg* param =
-          static_cast<CreateSessionDescriptionMsg*>(msg->pdata);
-      param->observer->OnSuccess(param->description.release());
-      delete param;
-      break;
-    }
-    case MSG_CREATE_SESSIONDESCRIPTION_FAILED: {
-      CreateSessionDescriptionMsg* param =
-          static_cast<CreateSessionDescriptionMsg*>(msg->pdata);
-      param->observer->OnFailure(param->error);
-      delete param;
-      break;
-    }
-    case MSG_USE_CONSTRUCTOR_CERTIFICATE: {
-      rtc::ScopedRefMessageData<rtc::RTCCertificate>* param =
-          static_cast<rtc::ScopedRefMessageData<rtc::RTCCertificate>*>(
-              msg->pdata);
-      LOG(LS_INFO) << "Using certificate supplied to the constructor.";
-      SetCertificate(param->data());
-      delete param;
-      break;
-    }
-    default:
-      RTC_NOTREACHED();
-      break;
-  }
-}
-
-void WebRtcSessionDescriptionFactory::InternalCreateOffer(
-    CreateSessionDescriptionRequest request) {
-  if (session_->local_description()) {
-    // If the needs-ice-restart flag is set as described by JSEP, we should
-    // generate an offer with a new ufrag/password to trigger an ICE restart.
-    for (cricket::MediaDescriptionOptions& options :
-         request.options.media_description_options) {
-      if (session_->NeedsIceRestart(options.mid)) {
-        options.transport_options.ice_restart = true;
-      }
-    }
-  }
-
-  cricket::SessionDescription* desc(session_desc_factory_.CreateOffer(
-      request.options, session_->local_description()
-                           ? session_->local_description()->description()
-                           : nullptr));
-  // RFC 3264
-  // When issuing an offer that modifies the session,
-  // the "o=" line of the new SDP MUST be identical to that in the
-  // previous SDP, except that the version in the origin field MUST
-  // increment by one from the previous SDP.
-
-  // Just increase the version number by one each time when a new offer
-  // is created regardless if it's identical to the previous one or not.
-  // The |session_version_| is a uint64_t, the wrap around should not happen.
-  RTC_DCHECK(session_version_ + 1 > session_version_);
-  JsepSessionDescription* offer(new JsepSessionDescription(
-      JsepSessionDescription::kOffer));
-  if (!offer->Initialize(desc, session_id_,
-                         rtc::ToString(session_version_++))) {
-    delete offer;
-    PostCreateSessionDescriptionFailed(request.observer,
-                                       "Failed to initialize the offer.");
-    return;
-  }
-  if (session_->local_description()) {
-    for (const cricket::MediaDescriptionOptions& options :
-         request.options.media_description_options) {
-      if (!options.transport_options.ice_restart) {
-        CopyCandidatesFromSessionDescription(session_->local_description(),
-                                             options.mid, offer);
-      }
-    }
-  }
-  PostCreateSessionDescriptionSucceeded(request.observer, offer);
-}
-
-void WebRtcSessionDescriptionFactory::InternalCreateAnswer(
-    CreateSessionDescriptionRequest request) {
-  if (session_->remote_description()) {
-    for (cricket::MediaDescriptionOptions& options :
-         request.options.media_description_options) {
-      // According to http://tools.ietf.org/html/rfc5245#section-9.2.1.1
-      // an answer should also contain new ICE ufrag and password if an offer
-      // has been received with new ufrag and password.
-      options.transport_options.ice_restart =
-          session_->IceRestartPending(options.mid);
-      // We should pass the current SSL role to the transport description
-      // factory, if there is already an existing ongoing session.
-      rtc::SSLRole ssl_role;
-      if (session_->GetSslRole(options.mid, &ssl_role)) {
-        options.transport_options.prefer_passive_role =
-            (rtc::SSL_SERVER == ssl_role);
-      }
-    }
-  }
-
-  cricket::SessionDescription* desc(session_desc_factory_.CreateAnswer(
-      session_->remote_description()
-          ? session_->remote_description()->description()
-          : nullptr,
-      request.options, session_->local_description()
-                           ? session_->local_description()->description()
-                           : nullptr));
-  // RFC 3264
-  // If the answer is different from the offer in any way (different IP
-  // addresses, ports, etc.), the origin line MUST be different in the answer.
-  // In that case, the version number in the "o=" line of the answer is
-  // unrelated to the version number in the o line of the offer.
-  // Get a new version number by increasing the |session_version_answer_|.
-  // The |session_version_| is a uint64_t, the wrap around should not happen.
-  RTC_DCHECK(session_version_ + 1 > session_version_);
-  JsepSessionDescription* answer(new JsepSessionDescription(
-      JsepSessionDescription::kAnswer));
-  if (!answer->Initialize(desc, session_id_,
-                          rtc::ToString(session_version_++))) {
-    delete answer;
-    PostCreateSessionDescriptionFailed(request.observer,
-                                       "Failed to initialize the answer.");
-    return;
-  }
-  if (session_->local_description()) {
-    // Include all local ICE candidates in the SessionDescription unless
-    // the remote peer has requested an ICE restart.
-    for (const cricket::MediaDescriptionOptions& options :
-         request.options.media_description_options) {
-      if (!options.transport_options.ice_restart) {
-        CopyCandidatesFromSessionDescription(session_->local_description(),
-                                             options.mid, answer);
-      }
-    }
-  }
-  PostCreateSessionDescriptionSucceeded(request.observer, answer);
-}
-
-void WebRtcSessionDescriptionFactory::FailPendingRequests(
-    const std::string& reason) {
-  RTC_DCHECK(signaling_thread_->IsCurrent());
-  while (!create_session_description_requests_.empty()) {
-    const CreateSessionDescriptionRequest& request =
-        create_session_description_requests_.front();
-    PostCreateSessionDescriptionFailed(request.observer,
-        ((request.type == CreateSessionDescriptionRequest::kOffer) ?
-            "CreateOffer" : "CreateAnswer") + reason);
-    create_session_description_requests_.pop();
-  }
-}
-
-void WebRtcSessionDescriptionFactory::PostCreateSessionDescriptionFailed(
-    CreateSessionDescriptionObserver* observer, const std::string& error) {
-  CreateSessionDescriptionMsg* msg = new CreateSessionDescriptionMsg(observer);
-  msg->error = error;
-  signaling_thread_->Post(RTC_FROM_HERE, this,
-                          MSG_CREATE_SESSIONDESCRIPTION_FAILED, msg);
-  LOG(LS_ERROR) << "Create SDP failed: " << error;
-}
-
-void WebRtcSessionDescriptionFactory::PostCreateSessionDescriptionSucceeded(
-    CreateSessionDescriptionObserver* observer,
-    SessionDescriptionInterface* description) {
-  CreateSessionDescriptionMsg* msg = new CreateSessionDescriptionMsg(observer);
-  msg->description.reset(description);
-  signaling_thread_->Post(RTC_FROM_HERE, this,
-                          MSG_CREATE_SESSIONDESCRIPTION_SUCCESS, msg);
-}
-
-void WebRtcSessionDescriptionFactory::OnCertificateRequestFailed() {
-  RTC_DCHECK(signaling_thread_->IsCurrent());
-
-  LOG(LS_ERROR) << "Asynchronous certificate generation request failed.";
-  certificate_request_state_ = CERTIFICATE_FAILED;
-
-  FailPendingRequests(kFailedDueToIdentityFailed);
-}
-
-void WebRtcSessionDescriptionFactory::SetCertificate(
-    const rtc::scoped_refptr<rtc::RTCCertificate>& certificate) {
-  RTC_DCHECK(certificate);
-  LOG(LS_VERBOSE) << "Setting new certificate.";
-
-  certificate_request_state_ = CERTIFICATE_SUCCEEDED;
-  SignalCertificateReady(certificate);
-
-  transport_desc_factory_.set_certificate(certificate);
-  transport_desc_factory_.set_secure(cricket::SEC_ENABLED);
-
-  while (!create_session_description_requests_.empty()) {
-    if (create_session_description_requests_.front().type ==
-        CreateSessionDescriptionRequest::kOffer) {
-      InternalCreateOffer(create_session_description_requests_.front());
-    } else {
-      InternalCreateAnswer(create_session_description_requests_.front());
-    }
-    create_session_description_requests_.pop();
-  }
-}
-}  // namespace webrtc
diff --git a/pc/webrtcsessiondescriptionfactory.h b/pc/webrtcsessiondescriptionfactory.h
deleted file mode 100644
index 04a4fd8..0000000
--- a/pc/webrtcsessiondescriptionfactory.h
+++ /dev/null
@@ -1,173 +0,0 @@
-/*
- *  Copyright 2013 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_PC_WEBRTCSESSIONDESCRIPTIONFACTORY_H_
-#define WEBRTC_PC_WEBRTCSESSIONDESCRIPTIONFACTORY_H_
-
-#include <memory>
-
-#include "webrtc/api/peerconnectioninterface.h"
-#include "webrtc/p2p/base/transportdescriptionfactory.h"
-#include "webrtc/pc/mediasession.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/messagehandler.h"
-#include "webrtc/rtc_base/rtccertificate.h"
-#include "webrtc/rtc_base/rtccertificategenerator.h"
-
-namespace cricket {
-class ChannelManager;
-class TransportDescriptionFactory;
-}  // namespace cricket
-
-namespace webrtc {
-class CreateSessionDescriptionObserver;
-class MediaConstraintsInterface;
-class SessionDescriptionInterface;
-class WebRtcSession;
-
-// DTLS certificate request callback class.
-class WebRtcCertificateGeneratorCallback
-    : public rtc::RTCCertificateGeneratorCallback,
-      public sigslot::has_slots<> {
- public:
-  // |rtc::RTCCertificateGeneratorCallback| overrides.
-  void OnSuccess(
-      const rtc::scoped_refptr<rtc::RTCCertificate>& certificate) override;
-  void OnFailure() override;
-
-  sigslot::signal0<> SignalRequestFailed;
-  sigslot::signal1<const rtc::scoped_refptr<rtc::RTCCertificate>&>
-      SignalCertificateReady;
-};
-
-struct CreateSessionDescriptionRequest {
-  enum Type {
-    kOffer,
-    kAnswer,
-  };
-
-  CreateSessionDescriptionRequest(
-      Type type,
-      CreateSessionDescriptionObserver* observer,
-      const cricket::MediaSessionOptions& options)
-      : type(type),
-        observer(observer),
-        options(options) {}
-
-  Type type;
-  rtc::scoped_refptr<CreateSessionDescriptionObserver> observer;
-  cricket::MediaSessionOptions options;
-};
-
-// This class is used to create offer/answer session description. Certificates
-// for WebRtcSession/DTLS are either supplied at construction or generated
-// asynchronously. It queues the create offer/answer request until the
-// certificate generation has completed, i.e. when OnCertificateRequestFailed or
-// OnCertificateReady is called.
-class WebRtcSessionDescriptionFactory : public rtc::MessageHandler,
-                                        public sigslot::has_slots<> {
- public:
-  // If |certificate_generator| is not null, DTLS is enabled and a default
-  // certificate is generated asynchronously; otherwise DTLS is disabled.
-  WebRtcSessionDescriptionFactory(
-      rtc::Thread* signaling_thread,
-      cricket::ChannelManager* channel_manager,
-      WebRtcSession* session,
-      const std::string& session_id,
-      std::unique_ptr<rtc::RTCCertificateGeneratorInterface> cert_generator);
-  // Construct with DTLS enabled using the specified |certificate|.
-  WebRtcSessionDescriptionFactory(
-      rtc::Thread* signaling_thread,
-      cricket::ChannelManager* channel_manager,
-      WebRtcSession* session,
-      const std::string& session_id,
-      const rtc::scoped_refptr<rtc::RTCCertificate>& certificate);
-  virtual ~WebRtcSessionDescriptionFactory();
-
-  static void CopyCandidatesFromSessionDescription(
-      const SessionDescriptionInterface* source_desc,
-      const std::string& content_name,
-      SessionDescriptionInterface* dest_desc);
-
-  void CreateOffer(
-      CreateSessionDescriptionObserver* observer,
-      const PeerConnectionInterface::RTCOfferAnswerOptions& options,
-      const cricket::MediaSessionOptions& session_options);
-  void CreateAnswer(CreateSessionDescriptionObserver* observer,
-                    const cricket::MediaSessionOptions& session_options);
-
-  void SetSdesPolicy(cricket::SecurePolicy secure_policy);
-  cricket::SecurePolicy SdesPolicy() const;
-
-  void set_enable_encrypted_rtp_header_extensions(bool enable) {
-    session_desc_factory_.set_enable_encrypted_rtp_header_extensions(enable);
-  }
-
-  sigslot::signal1<const rtc::scoped_refptr<rtc::RTCCertificate>&>
-      SignalCertificateReady;
-
-  // For testing.
-  bool waiting_for_certificate_for_testing() const {
-    return certificate_request_state_ == CERTIFICATE_WAITING;
-  }
-
- private:
-  enum CertificateRequestState {
-    CERTIFICATE_NOT_NEEDED,
-    CERTIFICATE_WAITING,
-    CERTIFICATE_SUCCEEDED,
-    CERTIFICATE_FAILED,
-  };
-
-  // If |certificate_generator| or |certificate| is not null DTLS is enabled,
-  // otherwise DTLS is disabled.
-  WebRtcSessionDescriptionFactory(
-      rtc::Thread* signaling_thread,
-      cricket::ChannelManager* channel_manager,
-      WebRtcSession* session,
-      const std::string& session_id,
-      std::unique_ptr<rtc::RTCCertificateGeneratorInterface> cert_generator,
-      const rtc::scoped_refptr<rtc::RTCCertificate>& certificate);
-
-  // MessageHandler implementation.
-  virtual void OnMessage(rtc::Message* msg);
-
-  void InternalCreateOffer(CreateSessionDescriptionRequest request);
-  void InternalCreateAnswer(CreateSessionDescriptionRequest request);
-  // Posts failure notifications for all pending session description requests.
-  void FailPendingRequests(const std::string& reason);
-  void PostCreateSessionDescriptionFailed(
-      CreateSessionDescriptionObserver* observer,
-      const std::string& error);
-  void PostCreateSessionDescriptionSucceeded(
-      CreateSessionDescriptionObserver* observer,
-      SessionDescriptionInterface* description);
-
-  void OnCertificateRequestFailed();
-  void SetCertificate(
-      const rtc::scoped_refptr<rtc::RTCCertificate>& certificate);
-
-  std::queue<CreateSessionDescriptionRequest>
-      create_session_description_requests_;
-  rtc::Thread* const signaling_thread_;
-  cricket::TransportDescriptionFactory transport_desc_factory_;
-  cricket::MediaSessionDescriptionFactory session_desc_factory_;
-  uint64_t session_version_;
-  const std::unique_ptr<rtc::RTCCertificateGeneratorInterface> cert_generator_;
-  // TODO(jiayl): remove the dependency on session once bug 2264 is fixed.
-  WebRtcSession* const session_;
-  const std::string session_id_;
-  CertificateRequestState certificate_request_state_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(WebRtcSessionDescriptionFactory);
-};
-}  // namespace webrtc
-
-#endif  // WEBRTC_PC_WEBRTCSESSIONDESCRIPTIONFACTORY_H_
diff --git a/rtc_base/BUILD.gn b/rtc_base/BUILD.gn
deleted file mode 100644
index 9120292..0000000
--- a/rtc_base/BUILD.gn
+++ /dev/null
@@ -1,1132 +0,0 @@
-# Copyright (c) 2014 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.
-
-import("//build/config/crypto.gni")
-import("//build/config/ui.gni")
-import("../webrtc.gni")
-
-if (is_android) {
-  import("//build/config/android/config.gni")
-  import("//build/config/android/rules.gni")
-}
-if (is_win) {
-  import("//build/config/clang/clang.gni")
-}
-
-group("base") {
-  public_deps = [
-    ":rtc_base",
-    ":rtc_base_approved",
-    ":rtc_task_queue",
-    ":sequenced_task_checker",
-    ":weak_ptr",
-  ]
-  if (is_android) {
-    public_deps += [ ":base_java" ]
-  }
-}
-
-config("rtc_base_chromium_config") {
-  defines = [ "NO_MAIN_THREAD_WRAPPING" ]
-}
-
-config("rtc_base_all_dependent_config") {
-  if (is_ios) {
-    libs = [
-      "CFNetwork.framework",
-      "Security.framework",
-      "SystemConfiguration.framework",
-      "UIKit.framework",
-    ]
-  }
-  if (is_mac) {
-    libs = [
-      "Cocoa.framework",
-      "Foundation.framework",
-      "IOKit.framework",
-      "Security.framework",
-      "SystemConfiguration.framework",
-    ]
-  }
-}
-
-if (!rtc_build_ssl) {
-  config("external_ssl_library") {
-    assert(rtc_ssl_root != "",
-           "You must specify rtc_ssl_root when rtc_build_ssl==0.")
-    include_dirs = [ rtc_ssl_root ]
-  }
-}
-
-source_set("protobuf_utils") {
-  sources = [
-    "protobuf_utils.h",
-  ]
-  if (rtc_enable_protobuf) {
-    public_deps = [
-      "//third_party/protobuf:protobuf_lite",
-    ]
-  }
-}
-
-source_set("compile_assert_c") {
-  sources = [
-    "compile_assert_c.h",
-  ]
-}
-
-rtc_source_set("rtc_base_approved") {
-  public_deps = [
-    ":rtc_base_approved_generic",
-  ]
-  if (is_mac && !build_with_chromium) {
-    public_deps += [ ":rtc_base_approved_objc" ]
-  }
-}
-
-# The subset of rtc_base approved for use outside of libjingle.
-rtc_source_set("rtc_base_approved_generic") {
-  visibility = [
-    ":rtc_base_approved",
-    ":rtc_base_approved_objc",
-  ]
-
-  # TODO(kjellander): Remove (bugs.webrtc.org/7480)
-  # Enabling GN check triggers a cyclic dependency caused by rate_limiter.cc:
-  #   :rtc_base_approved -> ../system_wrappers -> :rtc_base_approved
-  check_includes = false
-  defines = []
-  libs = []
-  deps = []
-
-  sources = [
-    "array_view.h",
-    "arraysize.h",
-    "atomicops.h",
-    "base64.cc",
-    "base64.h",
-    "basictypes.h",
-    "bind.h",
-    "bitbuffer.cc",
-    "bitbuffer.h",
-    "buffer.h",
-    "bufferqueue.cc",
-    "bufferqueue.h",
-    "bytebuffer.cc",
-    "bytebuffer.h",
-    "byteorder.h",
-    "checks.cc",
-    "checks.h",
-    "constructormagic.h",
-    "copyonwritebuffer.cc",
-    "copyonwritebuffer.h",
-    "criticalsection.cc",
-    "criticalsection.h",
-    "deprecation.h",
-    "event.cc",
-    "event.h",
-    "event_tracer.cc",
-    "event_tracer.h",
-    "file.cc",
-    "file.h",
-    "flags.cc",
-    "flags.h",
-    "format_macros.h",
-    "function_view.h",
-    "ignore_wundef.h",
-    "location.cc",
-    "location.h",
-    "mod_ops.h",
-    "moving_max_counter.h",
-    "onetimeevent.h",
-    "pathutils.cc",
-    "pathutils.h",
-    "platform_file.cc",
-    "platform_file.h",
-    "platform_thread.cc",
-    "platform_thread.h",
-    "platform_thread_types.h",
-    "ptr_util.h",
-    "race_checker.cc",
-    "race_checker.h",
-    "random.cc",
-    "random.h",
-    "rate_limiter.cc",
-    "rate_limiter.h",
-    "rate_statistics.cc",
-    "rate_statistics.h",
-    "ratetracker.cc",
-    "ratetracker.h",
-    "refcount.h",
-    "refcountedobject.h",
-    "safe_compare.h",
-    "safe_conversions.h",
-    "safe_conversions_impl.h",
-    "safe_minmax.h",
-    "sanitizer.h",
-    "scoped_ref_ptr.h",
-    "string_to_number.cc",
-    "string_to_number.h",
-    "stringencode.cc",
-    "stringencode.h",
-    "stringize_macros.h",
-    "stringutils.cc",
-    "stringutils.h",
-    "swap_queue.h",
-    "template_util.h",
-    "thread_annotations.h",
-    "thread_checker.h",
-    "thread_checker_impl.cc",
-    "thread_checker_impl.h",
-    "timestampaligner.cc",
-    "timestampaligner.h",
-    "timeutils.cc",
-    "timeutils.h",
-    "trace_event.h",
-    "type_traits.h",
-  ]
-
-  deps += [ "..:webrtc_common" ]
-
-  if (is_android) {
-    libs += [ "log" ]
-  }
-
-  if (is_posix) {
-    sources += [ "file_posix.cc" ]
-  }
-
-  if (is_win) {
-    sources += [ "file_win.cc" ]
-  }
-
-  if (build_with_chromium) {
-    # Dependency on chromium's logging (in //base).
-    deps += [ "//base:base" ]
-    sources += [
-      "../../webrtc_overrides/webrtc/rtc_base/logging.cc",
-      "../../webrtc_overrides/webrtc/rtc_base/logging.h",
-    ]
-  } else {
-    sources += [
-      "logging.cc",
-      "logging.h",
-    ]
-  }
-  if (is_component_build && is_win) {
-    # Copy the VS runtime DLLs into the isolate so that they don't have to be
-    # preinstalled on the target machine. The debug runtimes have a "d" at
-    # the end.
-    # This is a copy of https://codereview.chromium.org/1783973002.
-    # TODO(ehmaldonado): We'd like Chromium to make this changes easier to use,
-    # so we don't have to copy their changes and risk breakages.
-    # See http://crbug.com/653569
-    if (is_debug) {
-      vcrt_suffix = "d"
-    } else {
-      vcrt_suffix = ""
-    }
-
-    # These runtime files are copied to the output directory by the
-    # vs_toolchain script that runs as part of toolchain configuration.
-    data = [
-      "$root_out_dir/msvcp140${vcrt_suffix}.dll",
-      "$root_out_dir/vccorlib140${vcrt_suffix}.dll",
-      "$root_out_dir/vcruntime140${vcrt_suffix}.dll",
-
-      # Universal Windows 10 CRT files
-      "$root_out_dir/api-ms-win-core-console-l1-1-0.dll",
-      "$root_out_dir/api-ms-win-core-datetime-l1-1-0.dll",
-      "$root_out_dir/api-ms-win-core-debug-l1-1-0.dll",
-      "$root_out_dir/api-ms-win-core-errorhandling-l1-1-0.dll",
-      "$root_out_dir/api-ms-win-core-file-l1-1-0.dll",
-      "$root_out_dir/api-ms-win-core-file-l1-2-0.dll",
-      "$root_out_dir/api-ms-win-core-file-l2-1-0.dll",
-      "$root_out_dir/api-ms-win-core-handle-l1-1-0.dll",
-      "$root_out_dir/api-ms-win-core-heap-l1-1-0.dll",
-      "$root_out_dir/api-ms-win-core-interlocked-l1-1-0.dll",
-      "$root_out_dir/api-ms-win-core-libraryloader-l1-1-0.dll",
-      "$root_out_dir/api-ms-win-core-localization-l1-2-0.dll",
-      "$root_out_dir/api-ms-win-core-memory-l1-1-0.dll",
-      "$root_out_dir/api-ms-win-core-namedpipe-l1-1-0.dll",
-      "$root_out_dir/api-ms-win-core-processenvironment-l1-1-0.dll",
-      "$root_out_dir/api-ms-win-core-processthreads-l1-1-0.dll",
-      "$root_out_dir/api-ms-win-core-processthreads-l1-1-1.dll",
-      "$root_out_dir/api-ms-win-core-profile-l1-1-0.dll",
-      "$root_out_dir/api-ms-win-core-rtlsupport-l1-1-0.dll",
-      "$root_out_dir/api-ms-win-core-string-l1-1-0.dll",
-      "$root_out_dir/api-ms-win-core-synch-l1-1-0.dll",
-      "$root_out_dir/api-ms-win-core-synch-l1-2-0.dll",
-      "$root_out_dir/api-ms-win-core-sysinfo-l1-1-0.dll",
-      "$root_out_dir/api-ms-win-core-timezone-l1-1-0.dll",
-      "$root_out_dir/api-ms-win-core-util-l1-1-0.dll",
-      "$root_out_dir/api-ms-win-crt-conio-l1-1-0.dll",
-      "$root_out_dir/api-ms-win-crt-convert-l1-1-0.dll",
-      "$root_out_dir/api-ms-win-crt-environment-l1-1-0.dll",
-      "$root_out_dir/api-ms-win-crt-filesystem-l1-1-0.dll",
-      "$root_out_dir/api-ms-win-crt-heap-l1-1-0.dll",
-      "$root_out_dir/api-ms-win-crt-locale-l1-1-0.dll",
-      "$root_out_dir/api-ms-win-crt-math-l1-1-0.dll",
-      "$root_out_dir/api-ms-win-crt-multibyte-l1-1-0.dll",
-      "$root_out_dir/api-ms-win-crt-private-l1-1-0.dll",
-      "$root_out_dir/api-ms-win-crt-process-l1-1-0.dll",
-      "$root_out_dir/api-ms-win-crt-runtime-l1-1-0.dll",
-      "$root_out_dir/api-ms-win-crt-stdio-l1-1-0.dll",
-      "$root_out_dir/api-ms-win-crt-string-l1-1-0.dll",
-      "$root_out_dir/api-ms-win-crt-time-l1-1-0.dll",
-      "$root_out_dir/api-ms-win-crt-utility-l1-1-0.dll",
-      "$root_out_dir/ucrtbase${vcrt_suffix}.dll",
-    ]
-    if (is_asan) {
-      if (current_cpu == "x64") {
-        data += [ "$clang_base_path/lib/clang/$clang_version/lib/windows/clang_rt.asan_dynamic-x86_64.dll" ]
-      } else {
-        data += [ "$clang_base_path/lib/clang/$clang_version/lib/windows/clang_rt.asan_dynamic-i386.dll" ]
-      }
-    }
-  }
-  if (is_nacl) {
-    deps += [ "//native_client_sdk/src/libraries/nacl_io" ]
-  }
-}
-
-if (is_mac && !build_with_chromium) {
-  config("rtc_base_approved_objc_all_dependent_config") {
-    visibility = [ ":rtc_base_approved_objc" ]
-    libs = [ "Foundation.framework" ]  # needed for logging_mac.mm
-  }
-
-  rtc_source_set("rtc_base_approved_objc") {
-    visibility = [ ":rtc_base_approved" ]
-    all_dependent_configs = [ ":rtc_base_approved_objc_all_dependent_config" ]
-    sources = [
-      "logging_mac.mm",
-    ]
-    deps = [
-      ":rtc_base_approved_generic",
-    ]
-  }
-}
-
-rtc_source_set("rtc_task_queue") {
-  deps = [
-    ":rtc_base_approved",
-  ]
-  public_deps = [
-    ":rtc_task_queue_api",
-  ]
-
-  if (rtc_link_task_queue_impl) {
-    deps += [ ":rtc_task_queue_impl" ]
-  }
-}
-
-# WebRTC targets must not directly depend on rtc_task_queue_api or
-# rtc_task_queue_impl. Instead, depend on rtc_task_queue.
-# The build flag |rtc_link_task_queue_impl| decides if WebRTC targets will link
-# to the default implemenation in rtc_task_queue_impl or if an externally
-# provided implementation should be used. An external implementation should
-# depend on rtc_task_queue_api.
-rtc_source_set("rtc_task_queue_api") {
-  if (build_with_chromium) {
-    sources = [
-      "../../webrtc_overrides/webrtc/rtc_base/task_queue.h",
-    ]
-  } else {
-    sources = [
-      "task_queue.h",
-    ]
-  }
-  deps = [
-    ":rtc_base_approved",
-  ]
-}
-
-rtc_source_set("rtc_task_queue_impl") {
-  deps = [
-    ":rtc_base_approved",
-    ":rtc_task_queue_api",
-  ]
-  if (build_with_chromium) {
-    sources = [
-      "../../webrtc_overrides/webrtc/rtc_base/task_queue.cc",
-    ]
-  } else {
-    if (rtc_build_libevent) {
-      deps += [ "//base/third_party/libevent" ]
-    }
-    if (rtc_enable_libevent) {
-      sources = [
-        "task_queue_libevent.cc",
-        "task_queue_posix.cc",
-        "task_queue_posix.h",
-      ]
-    } else {
-      if (is_mac || is_ios) {
-        sources = [
-          "task_queue_gcd.cc",
-          "task_queue_posix.cc",
-        ]
-      }
-      if (is_win) {
-        sources = [
-          "task_queue_win.cc",
-        ]
-      }
-    }
-  }
-}
-
-rtc_static_library("sequenced_task_checker") {
-  sources = [
-    "sequenced_task_checker.h",
-    "sequenced_task_checker_impl.cc",
-    "sequenced_task_checker_impl.h",
-  ]
-  deps = [
-    ":rtc_base_approved",
-    ":rtc_task_queue",
-  ]
-}
-
-rtc_static_library("weak_ptr") {
-  sources = [
-    "weak_ptr.cc",
-    "weak_ptr.h",
-  ]
-  deps = [
-    ":rtc_base_approved",
-    ":sequenced_task_checker",
-  ]
-}
-
-rtc_static_library("rtc_numerics") {
-  sources = [
-    "numerics/exp_filter.cc",
-    "numerics/exp_filter.h",
-    "numerics/percentile_filter.h",
-  ]
-  deps = [
-    ":rtc_base_approved",
-  ]
-}
-
-config("rtc_base_warnings_config") {
-  if (is_win && is_clang) {
-    cflags = [
-      # Disable warnings failing when compiling with Clang on Windows.
-      # https://bugs.chromium.org/p/webrtc/issues/detail?id=5366
-      "-Wno-sign-compare",
-      "-Wno-missing-braces",
-    ]
-  }
-}
-
-rtc_source_set("rtc_json") {
-  defines = []
-  sources = [
-    "json.cc",
-    "json.h",
-  ]
-  if (rtc_build_json) {
-    public_deps = [
-      "//third_party/jsoncpp",
-    ]
-  } else {
-    include_dirs = [ "$rtc_jsoncpp_root" ]
-
-    # When defined changes the include path for json.h to where it is
-    # expected to be when building json outside of the standalone build.
-    defines += [ "WEBRTC_EXTERNAL_JSON" ]
-  }
-}
-
-rtc_static_library("rtc_base") {
-  public_deps = [
-    ":rtc_base_generic",
-  ]
-  if (is_win) {
-    sources = [
-      "noop.cc",
-    ]
-  }
-  if (is_ios || is_mac) {
-    sources = [
-      "noop.mm",
-    ]
-    public_deps += [ ":rtc_base_objc" ]
-  }
-}
-
-if (is_ios || is_mac) {
-  rtc_source_set("rtc_base_objc") {
-    sources = [
-      "thread_darwin.mm",
-    ]
-    deps = [
-      ":rtc_base_generic",
-    ]
-    visibility = [ ":rtc_base" ]
-  }
-}
-
-rtc_static_library("rtc_base_generic") {
-  cflags = []
-  cflags_cc = []
-  libs = []
-  defines = []
-  deps = [
-    "..:webrtc_common",
-    "../api:optional",
-  ]
-  public_deps = [
-    ":rtc_base_approved",
-  ]
-  public_configs = []
-
-  all_dependent_configs = [ ":rtc_base_all_dependent_config" ]
-
-  sources = [
-    "asyncinvoker-inl.h",
-    "asyncinvoker.cc",
-    "asyncinvoker.h",
-    "asyncpacketsocket.cc",
-    "asyncpacketsocket.h",
-    "asyncresolverinterface.cc",
-    "asyncresolverinterface.h",
-    "asyncsocket.cc",
-    "asyncsocket.h",
-    "asynctcpsocket.cc",
-    "asynctcpsocket.h",
-    "asyncudpsocket.cc",
-    "asyncudpsocket.h",
-    "crc32.cc",
-    "crc32.h",
-    "cryptstring.cc",
-    "cryptstring.h",
-    "filerotatingstream.cc",
-    "filerotatingstream.h",
-    "fileutils.cc",
-    "fileutils.h",
-    "gunit_prod.h",
-    "helpers.cc",
-    "helpers.h",
-    "httpbase.cc",
-    "httpbase.h",
-    "httpcommon-inl.h",
-    "httpcommon.cc",
-    "httpcommon.h",
-    "ipaddress.cc",
-    "ipaddress.h",
-    "messagedigest.cc",
-    "messagedigest.h",
-    "messagehandler.cc",
-    "messagehandler.h",
-    "messagequeue.cc",
-    "messagequeue.h",
-    "nethelpers.cc",
-    "nethelpers.h",
-    "network.cc",
-    "network.h",
-    "networkmonitor.cc",
-    "networkmonitor.h",
-    "nullsocketserver.cc",
-    "nullsocketserver.h",
-    "openssl.h",
-    "openssladapter.cc",
-    "openssladapter.h",
-    "openssldigest.cc",
-    "openssldigest.h",
-    "opensslidentity.cc",
-    "opensslidentity.h",
-    "opensslstreamadapter.cc",
-    "opensslstreamadapter.h",
-    "physicalsocketserver.cc",
-    "physicalsocketserver.h",
-    "proxyinfo.cc",
-    "proxyinfo.h",
-    "ratelimiter.cc",
-    "ratelimiter.h",
-    "rtccertificate.cc",
-    "rtccertificate.h",
-    "rtccertificategenerator.cc",
-    "rtccertificategenerator.h",
-    "signalthread.cc",
-    "signalthread.h",
-    "sigslot.cc",
-    "sigslot.h",
-    "socket.h",
-    "socketadapters.cc",
-    "socketadapters.h",
-    "socketaddress.cc",
-    "socketaddress.h",
-    "socketaddresspair.cc",
-    "socketaddresspair.h",
-    "socketfactory.h",
-    "socketserver.h",
-    "socketstream.cc",
-    "socketstream.h",
-    "ssladapter.cc",
-    "ssladapter.h",
-    "sslfingerprint.cc",
-    "sslfingerprint.h",
-    "sslidentity.cc",
-    "sslidentity.h",
-    "sslstreamadapter.cc",
-    "sslstreamadapter.h",
-    "stream.cc",
-    "stream.h",
-    "thread.cc",
-    "thread.h",
-  ]
-
-  visibility = [
-    ":rtc_base",
-    ":rtc_base_objc",
-  ]
-
-  # TODO(henrike): issue 3307, make rtc_base build with the Chromium default
-  # compiler settings.
-  suppressed_configs += [ "//build/config/compiler:chromium_code" ]
-  configs += [ "//build/config/compiler:no_chromium_code" ]
-  if (!is_win) {
-    cflags += [ "-Wno-uninitialized" ]
-  }
-
-  if (build_with_chromium) {
-    if (is_win) {
-      sources += [ "../../webrtc_overrides/webrtc/rtc_base/win32socketinit.cc" ]
-    }
-    include_dirs = [ "../../boringssl/src/include" ]
-    public_configs += [ ":rtc_base_chromium_config" ]
-  } else {
-    configs += [ ":rtc_base_warnings_config" ]
-    sources += [
-      "callback.h",
-      "logsinks.cc",
-      "logsinks.h",
-      "mathutils.h",
-      "optionsfile.cc",
-      "optionsfile.h",
-      "rollingaccumulator.h",
-      "sslroots.h",
-      "transformadapter.cc",
-      "transformadapter.h",
-      "window.h",
-    ]
-
-    if (is_win) {
-      sources += [
-        "win32socketinit.cc",
-        "win32socketinit.h",
-        "win32socketserver.cc",
-        "win32socketserver.h",
-      ]
-    }
-  }  # !build_with_chromium
-
-  if (rtc_build_ssl) {
-    deps += [ "//third_party/boringssl" ]
-  } else {
-    configs += [ ":external_ssl_library" ]
-  }
-
-  if (is_android) {
-    sources += [
-      "ifaddrs-android.cc",
-      "ifaddrs-android.h",
-    ]
-
-    libs += [
-      "log",
-      "GLESv2",
-    ]
-  }
-
-  if (is_ios || is_mac) {
-    sources += [ "macifaddrs_converter.cc" ]
-  }
-
-  if (use_x11) {
-    libs += [
-      "dl",
-      "rt",
-      "Xext",
-      "X11",
-      "Xcomposite",
-      "Xrender",
-    ]
-  }
-
-  if (is_linux) {
-    libs += [
-      "dl",
-      "rt",
-    ]
-  }
-
-  if (is_mac) {
-    sources += [
-      "macutils.cc",
-      "macutils.h",
-    ]
-    libs += [
-      # For ProcessInformationCopyDictionary in unixfilesystem.cc.
-      "ApplicationServices.framework",
-    ]
-  }
-
-  if (is_win) {
-    sources += [
-      "win32.cc",
-      "win32.h",
-      "win32filesystem.cc",
-      "win32filesystem.h",
-      "win32securityerrors.cc",
-      "win32window.cc",
-      "win32window.h",
-    ]
-
-    libs += [
-      "crypt32.lib",
-      "iphlpapi.lib",
-      "secur32.lib",
-    ]
-
-    cflags += [
-      # Suppress warnings about WIN32_LEAN_AND_MEAN.
-      "/wd4005",
-      "/wd4703",
-    ]
-
-    defines += [ "_CRT_NONSTDC_NO_DEPRECATE" ]
-  }
-
-  if (is_posix) {
-    sources += [
-      "ifaddrs_converter.cc",
-      "ifaddrs_converter.h",
-      "unixfilesystem.cc",
-      "unixfilesystem.h",
-    ]
-  }
-
-  if (is_nacl) {
-    deps += [ "//native_client_sdk/src/libraries/nacl_io" ]
-    defines += [ "timezone=_timezone" ]
-    sources -= [ "ifaddrs_converter.cc" ]
-  }
-  if (is_win && is_clang) {
-    # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-    suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-  }
-}
-
-rtc_source_set("gtest_prod") {
-  sources = [
-    "gtest_prod_util.h",
-  ]
-}
-
-config("rtc_base_tests_utils_exported_config") {
-  defines = [ "GTEST_RELATIVE_PATH" ]
-}
-
-config("rtc_base_tests_utils_warnings_config") {
-  if (is_win && is_clang) {
-    cflags = [
-      # See https://bugs.chromium.org/p/webrtc/issues/detail?id=6270
-      "-Wno-reorder",
-      "-Wno-sign-compare",
-    ]
-  }
-}
-
-rtc_source_set("rtc_base_tests_utils") {
-  testonly = true
-  sources = [
-    # Also use this as a convenient dumping ground for misc files that are
-    # included by multiple targets below.
-    "cpu_time.cc",
-    "cpu_time.h",
-    "fakeclock.cc",
-    "fakeclock.h",
-    "fakenetwork.h",
-    "fakesslidentity.h",
-    "firewallsocketserver.cc",
-    "firewallsocketserver.h",
-    "gunit.h",
-    "httpserver.cc",
-    "httpserver.h",
-    "md5.cc",
-    "md5.h",
-    "md5digest.cc",
-    "md5digest.h",
-    "memory_usage.cc",
-    "memory_usage.h",
-    "natserver.cc",
-    "natserver.h",
-    "natsocketfactory.cc",
-    "natsocketfactory.h",
-    "nattypes.cc",
-    "nattypes.h",
-    "proxyserver.cc",
-    "proxyserver.h",
-    "sha1.cc",
-    "sha1.h",
-    "sha1digest.cc",
-    "sha1digest.h",
-    "sigslottester.h",
-    "sigslottester.h.pump",
-    "testbase64.h",
-    "testclient.cc",
-    "testclient.h",
-    "testechoserver.h",
-    "testutils.h",
-    "timedelta.h",
-    "virtualsocketserver.cc",
-    "virtualsocketserver.h",
-  ]
-  configs += [ ":rtc_base_tests_utils_warnings_config" ]
-  public_configs = [ ":rtc_base_tests_utils_exported_config" ]
-  deps = [
-    ":rtc_base",
-    "../test:field_trial",
-    "../test:test_support",
-  ]
-  public_deps = [
-    "//testing/gmock",
-    "//testing/gtest",
-  ]
-
-  if (!build_with_chromium && is_clang) {
-    # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-    suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-  }
-}
-
-if (rtc_include_tests) {
-  rtc_source_set("rtc_base_tests_main") {
-    testonly = true
-    sources = [
-      "unittest_main.cc",
-    ]
-    public_configs = [ ":rtc_base_tests_utils_exported_config" ]
-    deps = [
-      ":rtc_base",
-      ":rtc_base_approved",
-      ":rtc_base_tests_utils",
-      "../test:field_trial",
-      "../test:test_support",
-    ]
-
-    public_deps = [
-      "//testing/gmock",
-      "//testing/gtest",
-    ]
-
-    if (!build_with_chromium && is_clang) {
-      # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-    }
-  }
-
-  rtc_source_set("rtc_base_nonparallel_tests") {
-    testonly = true
-
-    # Skip restricting visibility on mobile platforms since the tests on those
-    # gets additional generated targets which would require many lines here to
-    # cover (which would be confusing to read and hard to maintain).
-    if (!is_android && !is_ios) {
-      # TODO(kjellander): Reenable after finishing https://bugs.webrtc.org/7634.
-      #visibility = [ "..:webrtc_nonparallel_tests" ]
-    }
-    sources = [
-      "cpu_time_unittest.cc",
-      "filerotatingstream_unittest.cc",
-      "nullsocketserver_unittest.cc",
-      "physicalsocketserver_unittest.cc",
-      "socket_unittest.cc",
-      "socket_unittest.h",
-      "socketaddress_unittest.cc",
-    ]
-    deps = [
-      ":rtc_base",
-      ":rtc_base_tests_main",
-      ":rtc_base_tests_utils",
-      "../system_wrappers:system_wrappers",
-      "../test:test_support",
-      "//testing/gtest",
-    ]
-    if (is_win) {
-      sources += [ "win32socketserver_unittest.cc" ]
-    }
-
-    if (!build_with_chromium && is_clang) {
-      # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-    }
-  }
-
-  rtc_source_set("rtc_base_approved_unittests") {
-    testonly = true
-
-    # Skip restricting visibility on mobile platforms since the tests on those
-    # gets additional generated targets which would require many lines here to
-    # cover (which would be confusing to read and hard to maintain).
-    if (!is_android && !is_ios) {
-      # TODO(kjellander): Reenable after finishing https://bugs.webrtc.org/7634.
-      #visibility = [ "..:rtc_unittests" ]
-    }
-    sources = [
-      "atomicops_unittest.cc",
-      "base64_unittest.cc",
-      "basictypes_unittest.cc",
-      "bind_unittest.cc",
-      "bitbuffer_unittest.cc",
-      "buffer_unittest.cc",
-      "bufferqueue_unittest.cc",
-      "bytebuffer_unittest.cc",
-      "byteorder_unittest.cc",
-      "copyonwritebuffer_unittest.cc",
-      "criticalsection_unittest.cc",
-      "event_tracer_unittest.cc",
-      "event_unittest.cc",
-      "file_unittest.cc",
-      "function_view_unittest.cc",
-      "logging_unittest.cc",
-      "md5digest_unittest.cc",
-      "mod_ops_unittest.cc",
-      "moving_max_counter_unittest.cc",
-      "onetimeevent_unittest.cc",
-      "pathutils_unittest.cc",
-      "platform_thread_unittest.cc",
-      "random_unittest.cc",
-      "rate_limiter_unittest.cc",
-      "rate_statistics_unittest.cc",
-      "ratetracker_unittest.cc",
-      "refcountedobject_unittest.cc",
-      "safe_compare_unittest.cc",
-      "safe_minmax_unittest.cc",
-      "string_to_number_unittest.cc",
-      "stringencode_unittest.cc",
-      "stringize_macros_unittest.cc",
-      "stringutils_unittest.cc",
-      "swap_queue_unittest.cc",
-      "thread_annotations_unittest.cc",
-      "thread_checker_unittest.cc",
-      "timestampaligner_unittest.cc",
-      "timeutils_unittest.cc",
-      "virtualsocket_unittest.cc",
-    ]
-    deps = [
-      ":rtc_base",
-      ":rtc_base_approved",
-      ":rtc_base_tests_main",
-      ":rtc_base_tests_utils",
-      ":rtc_task_queue",
-      "../api:array_view",
-      "../system_wrappers:system_wrappers",
-      "../test:test_support",
-    ]
-    if (!build_with_chromium && is_clang) {
-      # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-    }
-  }
-
-  rtc_source_set("rtc_task_queue_unittests") {
-    testonly = true
-
-    # Skip restricting visibility on mobile platforms since the tests on those
-    # gets additional generated targets which would require many lines here to
-    # cover (which would be confusing to read and hard to maintain).
-    if (!is_android && !is_ios) {
-      # TODO(kjellander): Reenable after finishing https://bugs.webrtc.org/7634.
-      #visibility = [ "..:rtc_unittests" ]
-    }
-    sources = [
-      "task_queue_unittest.cc",
-    ]
-    deps = [
-      ":rtc_base_approved",
-      ":rtc_base_tests_main",
-      ":rtc_base_tests_utils",
-      ":rtc_task_queue",
-      "../test:test_support",
-    ]
-    if (!build_with_chromium && is_clang) {
-      # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-    }
-  }
-
-  rtc_source_set("sequenced_task_checker_unittests") {
-    testonly = true
-
-    # Skip restricting visibility on mobile platforms since the tests on those
-    # gets additional generated targets which would require many lines here to
-    # cover (which would be confusing to read and hard to maintain).
-    if (!is_android && !is_ios) {
-      # TODO(kjellander): Reenable after finishing https://bugs.webrtc.org/7634.
-      #visibility = [ "..:rtc_unittests" ]
-    }
-    sources = [
-      "sequenced_task_checker_unittest.cc",
-    ]
-    deps = [
-      ":rtc_base_approved",
-      ":rtc_base_tests_main",
-      ":rtc_task_queue",
-      ":sequenced_task_checker",
-      "../test:test_support",
-    ]
-  }
-
-  rtc_source_set("weak_ptr_unittests") {
-    testonly = true
-
-    # Skip restricting visibility on mobile platforms since the tests on those
-    # gets additional generated targets which would require many lines here to
-    # cover (which would be confusing to read and hard to maintain).
-    if (!is_android && !is_ios) {
-      # TODO(kjellander): Reenable after finishing https://bugs.webrtc.org/7634.
-      #visibility = [ "..:rtc_unittests" ]
-    }
-    sources = [
-      "weak_ptr_unittest.cc",
-    ]
-    deps = [
-      ":rtc_base_tests_main",
-      ":rtc_base_tests_utils",
-      ":rtc_task_queue",
-      ":weak_ptr",
-      "../test:test_support",
-    ]
-  }
-
-  rtc_source_set("rtc_numerics_unittests") {
-    testonly = true
-
-    # Skip restricting visibility on mobile platforms since the tests on those
-    # gets additional generated targets which would require many lines here to
-    # cover (which would be confusing to read and hard to maintain).
-    if (!is_android && !is_ios) {
-      # TODO(kjellander): Reenable after finishing https://bugs.webrtc.org/7634.
-      #visibility = [ "..:rtc_unittests" ]
-    }
-    sources = [
-      "numerics/exp_filter_unittest.cc",
-      "numerics/percentile_filter_unittest.cc",
-    ]
-    deps = [
-      ":rtc_base_approved",
-      ":rtc_base_tests_main",
-      ":rtc_numerics",
-      "../test:test_support",
-    ]
-  }
-
-  config("rtc_base_unittests_config") {
-    if (is_clang) {
-      cflags = [ "-Wno-unused-const-variable" ]
-    }
-  }
-  rtc_source_set("rtc_base_unittests") {
-    testonly = true
-
-    # Skip restricting visibility on mobile platforms since the tests on those
-    # gets additional generated targets which would require many lines here to
-    # cover (which would be confusing to read and hard to maintain).
-    if (!is_android && !is_ios) {
-      # TODO(kjellander): Reenable after finishing https://bugs.webrtc.org/7634.
-      #visibility = [ "..:rtc_unittests" ]
-    }
-    sources = [
-      "callback_unittest.cc",
-      "crc32_unittest.cc",
-      "helpers_unittest.cc",
-      "httpbase_unittest.cc",
-      "httpcommon_unittest.cc",
-      "httpserver_unittest.cc",
-      "ipaddress_unittest.cc",
-      "memory_usage_unittest.cc",
-      "messagedigest_unittest.cc",
-      "messagequeue_unittest.cc",
-      "nat_unittest.cc",
-      "network_unittest.cc",
-      "optionsfile_unittest.cc",
-      "proxy_unittest.cc",
-      "ptr_util_unittest.cc",
-      "ratelimiter_unittest.cc",
-      "rollingaccumulator_unittest.cc",
-      "rtccertificate_unittest.cc",
-      "rtccertificategenerator_unittest.cc",
-      "sha1digest_unittest.cc",
-      "signalthread_unittest.cc",
-      "sigslot_unittest.cc",
-      "sigslottester_unittest.cc",
-      "stream_unittest.cc",
-      "testclient_unittest.cc",
-      "thread_unittest.cc",
-    ]
-    if (is_win) {
-      sources += [
-        "win32_unittest.cc",
-        "win32window_unittest.cc",
-      ]
-    }
-    if (is_mac) {
-      sources += [ "macutils_unittest.cc" ]
-    }
-    if (is_posix) {
-      sources += [
-        "openssladapter_unittest.cc",
-        "ssladapter_unittest.cc",
-        "sslidentity_unittest.cc",
-        "sslstreamadapter_unittest.cc",
-      ]
-    }
-    deps = [
-      ":rtc_base_tests_main",
-      ":rtc_base_tests_utils",
-      "../api:optional",
-      "../test:test_support",
-    ]
-    public_deps = [
-      ":rtc_base",
-    ]
-    configs += [ ":rtc_base_unittests_config" ]
-    if (!build_with_chromium && is_clang) {
-      # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-    }
-    if (build_with_chromium) {
-      include_dirs = [ "../../boringssl/src/include" ]
-    }
-    if (rtc_build_ssl) {
-      deps += [ "//third_party/boringssl" ]
-    } else {
-      configs += [ ":external_ssl_library" ]
-    }
-  }
-}
-
-if (is_android) {
-  android_library("base_java") {
-    java_files = [
-      "java/src/org/webrtc/ContextUtils.java",
-      "java/src/org/webrtc/Logging.java",
-      "java/src/org/webrtc/Size.java",
-      "java/src/org/webrtc/ThreadUtils.java",
-    ]
-
-    # TODO(sakal): Fix build hooks crbug.com/webrtc/8148
-    no_build_hooks = true
-  }
-}
diff --git a/rtc_base/DEPS b/rtc_base/DEPS
deleted file mode 100644
index cfc5286..0000000
--- a/rtc_base/DEPS
+++ /dev/null
@@ -1,19 +0,0 @@
-include_rules = [
-  "+base/third_party/libevent",
-  "+json",
-  "+third_party/jsoncpp",
-  "+webrtc/system_wrappers",
-]
-
-specific_include_rules = {
-  "gunit_prod.h": [
-    "+gtest",
-    "+testing/base/gunit_prod.h",
-  ],
-  "protobuf_utils.h": [
-    "+third_party/protobuf",
-  ],
-  "gunit\.h": [
-    "+testing/base/public/gunit.h"
-  ],
-}
diff --git a/rtc_base/Dummy.java b/rtc_base/Dummy.java
deleted file mode 100644
index d8f02c9..0000000
--- a/rtc_base/Dummy.java
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- *  Copyright 2017 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.
- */
-
-/**
- * This class only exists as glue in a transition.
- * TODO(kjellander): Remove.
- * See https://bugs.webrtc.org/7634 for more details.
- */
-class Dummy {
-  Dummy() {
-  }
-}
diff --git a/rtc_base/OWNERS b/rtc_base/OWNERS
deleted file mode 100644
index f7e8d2a..0000000
--- a/rtc_base/OWNERS
+++ /dev/null
@@ -1,19 +0,0 @@
-henrika@webrtc.org
-henrikg@webrtc.org
-hta@webrtc.org
-juberti@webrtc.org
-mflodman@webrtc.org
-perkj@webrtc.org
-pthatcher@webrtc.org
-sergeyu@chromium.org
-tommi@webrtc.org
-deadbeef@webrtc.org
-kwiberg@webrtc.org
-
-# These are for the common case of adding or renaming files. If you're doing
-# structural changes, please get a review from a reviewer in this file.
-per-file *.gn=*
-per-file *.gni=*
-
-per-file rate_statistics*=sprang@webrtc.org
-per-file rate_statistics*=stefan@webrtc.org
diff --git a/rtc_base/array_view.h b/rtc_base/array_view.h
deleted file mode 100644
index 23c7b5b..0000000
--- a/rtc_base/array_view.h
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-// This header is for backwards compatibility only, and will be removed soon.
-// Include webrtc/api/array_view.h instead.
-
-#ifndef WEBRTC_RTC_BASE_ARRAY_VIEW_H_
-#define WEBRTC_RTC_BASE_ARRAY_VIEW_H_
-
-#include "webrtc/api/array_view.h"
-
-#endif  // WEBRTC_RTC_BASE_ARRAY_VIEW_H_
diff --git a/rtc_base/arraysize.h b/rtc_base/arraysize.h
deleted file mode 100644
index f395514..0000000
--- a/rtc_base/arraysize.h
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- *  Copyright (c) 2015 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_RTC_BASE_ARRAYSIZE_H_
-#define WEBRTC_RTC_BASE_ARRAYSIZE_H_
-
-#include <stddef.h>
-
-// This file defines the arraysize() macro and is derived from Chromium's
-// base/macros.h.
-
-// The arraysize(arr) macro returns the # of elements in an array arr.
-// The expression is a compile-time constant, and therefore can be
-// used in defining new arrays, for example.  If you use arraysize on
-// a pointer by mistake, you will get a compile-time error.
-
-// This template function declaration is used in defining arraysize.
-// Note that the function doesn't need an implementation, as we only
-// use its type.
-template <typename T, size_t N> char (&ArraySizeHelper(T (&array)[N]))[N];
-
-#define arraysize(array) (sizeof(ArraySizeHelper(array)))
-
-#endif  // WEBRTC_RTC_BASE_ARRAYSIZE_H_
diff --git a/rtc_base/asyncinvoker-inl.h b/rtc_base/asyncinvoker-inl.h
deleted file mode 100644
index 7878b15..0000000
--- a/rtc_base/asyncinvoker-inl.h
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- *  Copyright 2014 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_RTC_BASE_ASYNCINVOKER_INL_H_
-#define WEBRTC_RTC_BASE_ASYNCINVOKER_INL_H_
-
-#include "webrtc/rtc_base/bind.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/event.h"
-#include "webrtc/rtc_base/messagehandler.h"
-#include "webrtc/rtc_base/refcountedobject.h"
-#include "webrtc/rtc_base/scoped_ref_ptr.h"
-#include "webrtc/rtc_base/sigslot.h"
-#include "webrtc/rtc_base/thread.h"
-#include "webrtc/rtc_base/thread_annotations.h"
-
-namespace rtc {
-
-class AsyncInvoker;
-
-// Helper class for AsyncInvoker. Runs a task and triggers a callback
-// on the calling thread if necessary.
-class AsyncClosure {
- public:
-  explicit AsyncClosure(AsyncInvoker* invoker);
-  virtual ~AsyncClosure();
-  // Runs the asynchronous task, and triggers a callback to the calling
-  // thread if needed. Should be called from the target thread.
-  virtual void Execute() = 0;
-
- protected:
-  AsyncInvoker* invoker_;
-  // Reference counted so that if the AsyncInvoker destructor finishes before
-  // an AsyncClosure's destructor that's about to call
-  // "invocation_complete_->Set()", it's not dereferenced after being
-  // destroyed.
-  scoped_refptr<RefCountedObject<Event>> invocation_complete_;
-};
-
-// Simple closure that doesn't trigger a callback for the calling thread.
-template <class FunctorT>
-class FireAndForgetAsyncClosure : public AsyncClosure {
- public:
-  explicit FireAndForgetAsyncClosure(AsyncInvoker* invoker,
-                                     const FunctorT& functor)
-      : AsyncClosure(invoker), functor_(functor) {}
-  virtual void Execute() {
-    functor_();
-  }
- private:
-  FunctorT functor_;
-};
-
-}  // namespace rtc
-
-#endif  // WEBRTC_RTC_BASE_ASYNCINVOKER_INL_H_
diff --git a/rtc_base/asyncinvoker.cc b/rtc_base/asyncinvoker.cc
deleted file mode 100644
index 89e4e77..0000000
--- a/rtc_base/asyncinvoker.cc
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- *  Copyright 2014 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/rtc_base/asyncinvoker.h"
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-
-namespace rtc {
-
-AsyncInvoker::AsyncInvoker()
-    : pending_invocations_(0),
-      invocation_complete_(new RefCountedObject<Event>(false, false)),
-      destroying_(false) {}
-
-AsyncInvoker::~AsyncInvoker() {
-  destroying_.store(true, std::memory_order_relaxed);
-  // Messages for this need to be cleared *before* our destructor is complete.
-  MessageQueueManager::Clear(this);
-  // And we need to wait for any invocations that are still in progress on
-  // other threads. Using memory_order_acquire for synchronization with
-  // AsyncClosure destructors.
-  while (pending_invocations_.load(std::memory_order_acquire) > 0) {
-    // If the destructor was called while AsyncInvoke was being called by
-    // another thread, WITHIN an AsyncInvoked functor, it may do another
-    // Thread::Post even after we called MessageQueueManager::Clear(this). So
-    // we need to keep calling Clear to discard these posts.
-    Thread::Current()->Clear(this);
-    invocation_complete_->Wait(Event::kForever);
-  }
-}
-
-void AsyncInvoker::OnMessage(Message* msg) {
-  // Get the AsyncClosure shared ptr from this message's data.
-  ScopedMessageData<AsyncClosure>* data =
-      static_cast<ScopedMessageData<AsyncClosure>*>(msg->pdata);
-  // Execute the closure and trigger the return message if needed.
-  data->inner_data().Execute();
-  delete data;
-}
-
-void AsyncInvoker::Flush(Thread* thread, uint32_t id /*= MQID_ANY*/) {
-  // If the destructor is waiting for invocations to finish, don't start
-  // running even more tasks.
-  if (destroying_.load(std::memory_order_relaxed))
-    return;
-
-  // Run this on |thread| to reduce the number of context switches.
-  if (Thread::Current() != thread) {
-    thread->Invoke<void>(RTC_FROM_HERE,
-                         Bind(&AsyncInvoker::Flush, this, thread, id));
-    return;
-  }
-
-  MessageList removed;
-  thread->Clear(this, id, &removed);
-  for (MessageList::iterator it = removed.begin(); it != removed.end(); ++it) {
-    // This message was pending on this thread, so run it now.
-    thread->Send(it->posted_from, it->phandler, it->message_id, it->pdata);
-  }
-}
-
-void AsyncInvoker::DoInvoke(const Location& posted_from,
-                            Thread* thread,
-                            std::unique_ptr<AsyncClosure> closure,
-                            uint32_t id) {
-  if (destroying_.load(std::memory_order_relaxed)) {
-    // Note that this may be expected, if the application is AsyncInvoking
-    // tasks that AsyncInvoke other tasks. But otherwise it indicates a race
-    // between a thread destroying the AsyncInvoker and a thread still trying
-    // to use it.
-    LOG(LS_WARNING) << "Tried to invoke while destroying the invoker.";
-    return;
-  }
-  thread->Post(posted_from, this, id,
-               new ScopedMessageData<AsyncClosure>(std::move(closure)));
-}
-
-void AsyncInvoker::DoInvokeDelayed(const Location& posted_from,
-                                   Thread* thread,
-                                   std::unique_ptr<AsyncClosure> closure,
-                                   uint32_t delay_ms,
-                                   uint32_t id) {
-  if (destroying_.load(std::memory_order_relaxed)) {
-    // See above comment.
-    LOG(LS_WARNING) << "Tried to invoke while destroying the invoker.";
-    return;
-  }
-  thread->PostDelayed(posted_from, delay_ms, this, id,
-                      new ScopedMessageData<AsyncClosure>(std::move(closure)));
-}
-
-GuardedAsyncInvoker::GuardedAsyncInvoker() : thread_(Thread::Current()) {
-  thread_->SignalQueueDestroyed.connect(this,
-                                        &GuardedAsyncInvoker::ThreadDestroyed);
-}
-
-GuardedAsyncInvoker::~GuardedAsyncInvoker() {
-}
-
-bool GuardedAsyncInvoker::Flush(uint32_t id) {
-  CritScope cs(&crit_);
-  if (thread_ == nullptr)
-    return false;
-  invoker_.Flush(thread_, id);
-  return true;
-}
-
-void GuardedAsyncInvoker::ThreadDestroyed() {
-  CritScope cs(&crit_);
-  // We should never get more than one notification about the thread dying.
-  RTC_DCHECK(thread_ != nullptr);
-  thread_ = nullptr;
-}
-
-AsyncClosure::AsyncClosure(AsyncInvoker* invoker)
-    : invoker_(invoker), invocation_complete_(invoker_->invocation_complete_) {
-  invoker_->pending_invocations_.fetch_add(1, std::memory_order_relaxed);
-}
-
-AsyncClosure::~AsyncClosure() {
-  // Using memory_order_release for synchronization with the AsyncInvoker
-  // destructor.
-  invoker_->pending_invocations_.fetch_sub(1, std::memory_order_release);
-
-  // After |pending_invocations_| is decremented, we may need to signal
-  // |invocation_complete_| in case the AsyncInvoker is being destroyed and
-  // waiting for pending tasks to complete.
-  //
-  // It's also possible that the destructor finishes before "Set()" is called,
-  // which is safe because the event is reference counted (and in a thread-safe
-  // way).
-  invocation_complete_->Set();
-}
-
-}  // namespace rtc
diff --git a/rtc_base/asyncinvoker.h b/rtc_base/asyncinvoker.h
deleted file mode 100644
index 0b14e91..0000000
--- a/rtc_base/asyncinvoker.h
+++ /dev/null
@@ -1,257 +0,0 @@
-/*
- *  Copyright 2014 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_RTC_BASE_ASYNCINVOKER_H_
-#define WEBRTC_RTC_BASE_ASYNCINVOKER_H_
-
-#include <atomic>
-#include <memory>
-#include <utility>
-
-#include "webrtc/rtc_base/asyncinvoker-inl.h"
-#include "webrtc/rtc_base/bind.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/event.h"
-#include "webrtc/rtc_base/refcountedobject.h"
-#include "webrtc/rtc_base/scoped_ref_ptr.h"
-#include "webrtc/rtc_base/sigslot.h"
-#include "webrtc/rtc_base/thread.h"
-
-namespace rtc {
-
-// Invokes function objects (aka functors) asynchronously on a Thread, and
-// owns the lifetime of calls (ie, when this object is destroyed, calls in
-// flight are cancelled). AsyncInvoker can optionally execute a user-specified
-// function when the asynchronous call is complete, or operates in
-// fire-and-forget mode otherwise.
-//
-// AsyncInvoker does not own the thread it calls functors on.
-//
-// A note about async calls and object lifetimes: users should
-// be mindful of object lifetimes when calling functions asynchronously and
-// ensure objects used by the function _cannot_ be deleted between the
-// invocation and execution of the functor. AsyncInvoker is designed to
-// help: any calls in flight will be cancelled when the AsyncInvoker used to
-// make the call is destructed, and any calls executing will be allowed to
-// complete before AsyncInvoker destructs.
-//
-// The easiest way to ensure lifetimes are handled correctly is to create a
-// class that owns the Thread and AsyncInvoker objects, and then call its
-// methods asynchronously as needed.
-//
-// Example:
-//   class MyClass {
-//    public:
-//     void FireAsyncTaskWithResult(Thread* thread, int x) {
-//       // Specify a callback to get the result upon completion.
-//       invoker_.AsyncInvoke<int>(RTC_FROM_HERE,
-//           thread, Bind(&MyClass::AsyncTaskWithResult, this, x),
-//           &MyClass::OnTaskComplete, this);
-//     }
-//     void FireAnotherAsyncTask(Thread* thread) {
-//       // No callback specified means fire-and-forget.
-//       invoker_.AsyncInvoke<void>(RTC_FROM_HERE,
-//           thread, Bind(&MyClass::AnotherAsyncTask, this));
-//
-//    private:
-//     int AsyncTaskWithResult(int x) {
-//       // Some long running process...
-//       return x * x;
-//     }
-//     void AnotherAsyncTask() {
-//       // Some other long running process...
-//     }
-//     void OnTaskComplete(int result) { result_ = result; }
-//
-//     AsyncInvoker invoker_;
-//     int result_;
-//   };
-//
-// More details about threading:
-// - It's safe to construct/destruct AsyncInvoker on different threads.
-// - It's safe to call AsyncInvoke from different threads.
-// - It's safe to call AsyncInvoke recursively from *within* a functor that's
-//   being AsyncInvoked.
-// - However, it's *not* safe to call AsyncInvoke from *outside* a functor
-//   that's being AsyncInvoked while the AsyncInvoker is being destroyed on
-//   another thread. This is just inherently unsafe and there's no way to
-//   prevent that. So, the user of this class should ensure that the start of
-//   each "chain" of invocations is synchronized somehow with the AsyncInvoker's
-//   destruction. This can be done by starting each chain of invocations on the
-//   same thread on which it will be destroyed, or by using some other
-//   synchronization method.
-class AsyncInvoker : public MessageHandler {
- public:
-  AsyncInvoker();
-  ~AsyncInvoker() override;
-
-  // Call |functor| asynchronously on |thread|, with no callback upon
-  // completion. Returns immediately.
-  template <class ReturnT, class FunctorT>
-  void AsyncInvoke(const Location& posted_from,
-                   Thread* thread,
-                   const FunctorT& functor,
-                   uint32_t id = 0) {
-    std::unique_ptr<AsyncClosure> closure(
-        new FireAndForgetAsyncClosure<FunctorT>(this, functor));
-    DoInvoke(posted_from, thread, std::move(closure), id);
-  }
-
-  // Call |functor| asynchronously on |thread| with |delay_ms|, with no callback
-  // upon completion. Returns immediately.
-  template <class ReturnT, class FunctorT>
-  void AsyncInvokeDelayed(const Location& posted_from,
-                          Thread* thread,
-                          const FunctorT& functor,
-                          uint32_t delay_ms,
-                          uint32_t id = 0) {
-    std::unique_ptr<AsyncClosure> closure(
-        new FireAndForgetAsyncClosure<FunctorT>(this, functor));
-    DoInvokeDelayed(posted_from, thread, std::move(closure), delay_ms, id);
-  }
-
-  // Synchronously execute on |thread| all outstanding calls we own
-  // that are pending on |thread|, and wait for calls to complete
-  // before returning. Optionally filter by message id.
-  // The destructor will not wait for outstanding calls, so if that
-  // behavior is desired, call Flush() before destroying this object.
-  void Flush(Thread* thread, uint32_t id = MQID_ANY);
-
- private:
-  void OnMessage(Message* msg) override;
-  void DoInvoke(const Location& posted_from,
-                Thread* thread,
-                std::unique_ptr<AsyncClosure> closure,
-                uint32_t id);
-  void DoInvokeDelayed(const Location& posted_from,
-                       Thread* thread,
-                       std::unique_ptr<AsyncClosure> closure,
-                       uint32_t delay_ms,
-                       uint32_t id);
-
-  // Used to keep track of how many invocations (AsyncClosures) are still
-  // alive, so that the destructor can wait for them to finish, as described in
-  // the class documentation.
-  //
-  // TODO(deadbeef): Using a raw std::atomic like this is prone to error and
-  // difficult to maintain. We should try to wrap this functionality in a
-  // separate class to reduce the chance of errors being introduced in the
-  // future.
-  std::atomic<int> pending_invocations_;
-
-  // Reference counted so that if the AsyncInvoker destructor finishes before
-  // an AsyncClosure's destructor that's about to call
-  // "invocation_complete_->Set()", it's not dereferenced after being
-  // destroyed.
-  scoped_refptr<RefCountedObject<Event>> invocation_complete_;
-
-  // This flag is used to ensure that if an application AsyncInvokes tasks that
-  // recursively AsyncInvoke other tasks ad infinitum, the cycle eventually
-  // terminates.
-  std::atomic<bool> destroying_;
-
-  friend class AsyncClosure;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(AsyncInvoker);
-};
-
-// Similar to AsyncInvoker, but guards against the Thread being destroyed while
-// there are outstanding dangling pointers to it. It will connect to the current
-// thread in the constructor, and will get notified when that thread is
-// destroyed. After GuardedAsyncInvoker is constructed, it can be used from
-// other threads to post functors to the thread it was constructed on. If that
-// thread dies, any further calls to AsyncInvoke() will be safely ignored.
-class GuardedAsyncInvoker : public sigslot::has_slots<> {
- public:
-  GuardedAsyncInvoker();
-  ~GuardedAsyncInvoker() override;
-
-  // Synchronously execute all outstanding calls we own, and wait for calls to
-  // complete before returning. Optionally filter by message id. The destructor
-  // will not wait for outstanding calls, so if that behavior is desired, call
-  // Flush() first. Returns false if the thread has died.
-  bool Flush(uint32_t id = MQID_ANY);
-
-  // Call |functor| asynchronously with no callback upon completion. Returns
-  // immediately. Returns false if the thread has died.
-  template <class ReturnT, class FunctorT>
-  bool AsyncInvoke(const Location& posted_from,
-                   const FunctorT& functor,
-                   uint32_t id = 0) {
-    CritScope cs(&crit_);
-    if (thread_ == nullptr)
-      return false;
-    invoker_.AsyncInvoke<ReturnT, FunctorT>(posted_from, thread_, functor, id);
-    return true;
-  }
-
-  // Call |functor| asynchronously with |delay_ms|, with no callback upon
-  // completion. Returns immediately. Returns false if the thread has died.
-  template <class ReturnT, class FunctorT>
-  bool AsyncInvokeDelayed(const Location& posted_from,
-                          const FunctorT& functor,
-                          uint32_t delay_ms,
-                          uint32_t id = 0) {
-    CritScope cs(&crit_);
-    if (thread_ == nullptr)
-      return false;
-    invoker_.AsyncInvokeDelayed<ReturnT, FunctorT>(posted_from, thread_,
-                                                   functor, delay_ms, id);
-    return true;
-  }
-
-  // Call |functor| asynchronously, calling |callback| when done. Returns false
-  // if the thread has died.
-  template <class ReturnT, class FunctorT, class HostT>
-  bool AsyncInvoke(const Location& posted_from,
-                   const Location& callback_posted_from,
-                   const FunctorT& functor,
-                   void (HostT::*callback)(ReturnT),
-                   HostT* callback_host,
-                   uint32_t id = 0) {
-    CritScope cs(&crit_);
-    if (thread_ == nullptr)
-      return false;
-    invoker_.AsyncInvoke<ReturnT, FunctorT, HostT>(
-        posted_from, callback_posted_from, thread_, functor, callback,
-        callback_host, id);
-    return true;
-  }
-
-  // Call |functor| asynchronously calling |callback| when done. Overloaded for
-  // void return. Returns false if the thread has died.
-  template <class ReturnT, class FunctorT, class HostT>
-  bool AsyncInvoke(const Location& posted_from,
-                   const Location& callback_posted_from,
-                   const FunctorT& functor,
-                   void (HostT::*callback)(),
-                   HostT* callback_host,
-                   uint32_t id = 0) {
-    CritScope cs(&crit_);
-    if (thread_ == nullptr)
-      return false;
-    invoker_.AsyncInvoke<ReturnT, FunctorT, HostT>(
-        posted_from, callback_posted_from, thread_, functor, callback,
-        callback_host, id);
-    return true;
-  }
-
- private:
-  // Callback when |thread_| is destroyed.
-  void ThreadDestroyed();
-
-  CriticalSection crit_;
-  Thread* thread_ RTC_GUARDED_BY(crit_);
-  AsyncInvoker invoker_ RTC_GUARDED_BY(crit_);
-};
-
-}  // namespace rtc
-
-#endif  // WEBRTC_RTC_BASE_ASYNCINVOKER_H_
diff --git a/rtc_base/asyncpacketsocket.cc b/rtc_base/asyncpacketsocket.cc
deleted file mode 100644
index 5c9bcbb..0000000
--- a/rtc_base/asyncpacketsocket.cc
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- *  Copyright 2015 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/rtc_base/asyncpacketsocket.h"
-
-namespace rtc {
-
-PacketTimeUpdateParams::PacketTimeUpdateParams()
-    : rtp_sendtime_extension_id(-1),
-      srtp_auth_tag_len(-1),
-      srtp_packet_index(-1) {
-}
-
-PacketTimeUpdateParams::~PacketTimeUpdateParams() = default;
-
-AsyncPacketSocket::AsyncPacketSocket() {
-}
-
-AsyncPacketSocket::~AsyncPacketSocket() {
-}
-
-};  // namespace rtc
diff --git a/rtc_base/asyncpacketsocket.h b/rtc_base/asyncpacketsocket.h
deleted file mode 100644
index 596812d..0000000
--- a/rtc_base/asyncpacketsocket.h
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- *  Copyright 2004 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_RTC_BASE_ASYNCPACKETSOCKET_H_
-#define WEBRTC_RTC_BASE_ASYNCPACKETSOCKET_H_
-
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/dscp.h"
-#include "webrtc/rtc_base/sigslot.h"
-#include "webrtc/rtc_base/socket.h"
-#include "webrtc/rtc_base/timeutils.h"
-
-namespace rtc {
-
-// This structure holds the info needed to update the packet send time header
-// extension, including the information needed to update the authentication tag
-// after changing the value.
-struct PacketTimeUpdateParams {
-  PacketTimeUpdateParams();
-  ~PacketTimeUpdateParams();
-
-  int rtp_sendtime_extension_id;    // extension header id present in packet.
-  std::vector<char> srtp_auth_key;  // Authentication key.
-  int srtp_auth_tag_len;            // Authentication tag length.
-  int64_t srtp_packet_index;        // Required for Rtp Packet authentication.
-};
-
-// This structure holds meta information for the packet which is about to send
-// over network.
-struct PacketOptions {
-  PacketOptions() : dscp(DSCP_NO_CHANGE), packet_id(-1) {}
-  explicit PacketOptions(DiffServCodePoint dscp) : dscp(dscp), packet_id(-1) {}
-
-  DiffServCodePoint dscp;
-  int packet_id;  // 16 bits, -1 represents "not set".
-  PacketTimeUpdateParams packet_time_params;
-};
-
-// This structure will have the information about when packet is actually
-// received by socket.
-struct PacketTime {
-  PacketTime() : timestamp(-1), not_before(-1) {}
-  PacketTime(int64_t timestamp, int64_t not_before)
-      : timestamp(timestamp), not_before(not_before) {}
-
-  int64_t timestamp;   // Receive time after socket delivers the data.
-
-  // Earliest possible time the data could have arrived, indicating the
-  // potential error in the |timestamp| value, in case the system, is busy. For
-  // example, the time of the last select() call.
-  // If unknown, this value will be set to zero.
-  int64_t not_before;
-};
-
-inline PacketTime CreatePacketTime(int64_t not_before) {
-  return PacketTime(TimeMicros(), not_before);
-}
-
-// Provides the ability to receive packets asynchronously. Sends are not
-// buffered since it is acceptable to drop packets under high load.
-class AsyncPacketSocket : public sigslot::has_slots<> {
- public:
-  enum State {
-    STATE_CLOSED,
-    STATE_BINDING,
-    STATE_BOUND,
-    STATE_CONNECTING,
-    STATE_CONNECTED
-  };
-
-  AsyncPacketSocket();
-  ~AsyncPacketSocket() override;
-
-  // Returns current local address. Address may be set to null if the
-  // socket is not bound yet (GetState() returns STATE_BINDING).
-  virtual SocketAddress GetLocalAddress() const = 0;
-
-  // Returns remote address. Returns zeroes if this is not a client TCP socket.
-  virtual SocketAddress GetRemoteAddress() const = 0;
-
-  // Send a packet.
-  virtual int Send(const void *pv, size_t cb, const PacketOptions& options) = 0;
-  virtual int SendTo(const void *pv, size_t cb, const SocketAddress& addr,
-                     const PacketOptions& options) = 0;
-
-  // Close the socket.
-  virtual int Close() = 0;
-
-  // Returns current state of the socket.
-  virtual State GetState() const = 0;
-
-  // Get/set options.
-  virtual int GetOption(Socket::Option opt, int* value) = 0;
-  virtual int SetOption(Socket::Option opt, int value) = 0;
-
-  // Get/Set current error.
-  // TODO: Remove SetError().
-  virtual int GetError() const = 0;
-  virtual void SetError(int error) = 0;
-
-  // Emitted each time a packet is read. Used only for UDP and
-  // connected TCP sockets.
-  sigslot::signal5<AsyncPacketSocket*, const char*, size_t,
-                   const SocketAddress&,
-                   const PacketTime&> SignalReadPacket;
-
-  // Emitted each time a packet is sent.
-  sigslot::signal2<AsyncPacketSocket*, const SentPacket&> SignalSentPacket;
-
-  // Emitted when the socket is currently able to send.
-  sigslot::signal1<AsyncPacketSocket*> SignalReadyToSend;
-
-  // Emitted after address for the socket is allocated, i.e. binding
-  // is finished. State of the socket is changed from BINDING to BOUND
-  // (for UDP and server TCP sockets) or CONNECTING (for client TCP
-  // sockets).
-  sigslot::signal2<AsyncPacketSocket*, const SocketAddress&> SignalAddressReady;
-
-  // Emitted for client TCP sockets when state is changed from
-  // CONNECTING to CONNECTED.
-  sigslot::signal1<AsyncPacketSocket*> SignalConnect;
-
-  // Emitted for client TCP sockets when state is changed from
-  // CONNECTED to CLOSED.
-  sigslot::signal2<AsyncPacketSocket*, int> SignalClose;
-
-  // Used only for listening TCP sockets.
-  sigslot::signal2<AsyncPacketSocket*, AsyncPacketSocket*> SignalNewConnection;
-
- private:
-  RTC_DISALLOW_COPY_AND_ASSIGN(AsyncPacketSocket);
-};
-
-}  // namespace rtc
-
-#endif  // WEBRTC_RTC_BASE_ASYNCPACKETSOCKET_H_
diff --git a/rtc_base/asyncresolverinterface.cc b/rtc_base/asyncresolverinterface.cc
deleted file mode 100644
index b6f2c48..0000000
--- a/rtc_base/asyncresolverinterface.cc
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- *  Copyright 2015 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/rtc_base/asyncresolverinterface.h"
-
-namespace rtc {
-
-AsyncResolverInterface::AsyncResolverInterface() {
-}
-
-AsyncResolverInterface::~AsyncResolverInterface() = default;
-
-};  // namespace rtc
diff --git a/rtc_base/asyncresolverinterface.h b/rtc_base/asyncresolverinterface.h
deleted file mode 100644
index 7b8c533..0000000
--- a/rtc_base/asyncresolverinterface.h
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- *  Copyright 2013 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_RTC_BASE_ASYNCRESOLVERINTERFACE_H_
-#define WEBRTC_RTC_BASE_ASYNCRESOLVERINTERFACE_H_
-
-#include "webrtc/rtc_base/sigslot.h"
-#include "webrtc/rtc_base/socketaddress.h"
-
-namespace rtc {
-
-// This interface defines the methods to resolve the address asynchronously.
-class AsyncResolverInterface {
- public:
-  AsyncResolverInterface();
-  virtual ~AsyncResolverInterface();
-
-  // Start address resolve process.
-  virtual void Start(const SocketAddress& addr) = 0;
-  // Returns top most resolved address of |family|
-  virtual bool GetResolvedAddress(int family, SocketAddress* addr) const = 0;
-  // Returns error from resolver.
-  virtual int GetError() const = 0;
-  // Delete the resolver.
-  virtual void Destroy(bool wait) = 0;
-  // Returns top most resolved IPv4 address if address is resolved successfully.
-  // Otherwise returns address set in SetAddress.
-  SocketAddress address() const {
-    SocketAddress addr;
-    GetResolvedAddress(AF_INET, &addr);
-    return addr;
-  }
-
-  // This signal is fired when address resolve process is completed.
-  sigslot::signal1<AsyncResolverInterface*> SignalDone;
-};
-
-}  // namespace rtc
-
-#endif
diff --git a/rtc_base/asyncsocket.cc b/rtc_base/asyncsocket.cc
deleted file mode 100644
index 7cb76cc..0000000
--- a/rtc_base/asyncsocket.cc
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- *  Copyright 2010 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/rtc_base/asyncsocket.h"
-#include "webrtc/rtc_base/checks.h"
-
-namespace rtc {
-
-AsyncSocket::AsyncSocket() {
-}
-
-AsyncSocket::~AsyncSocket() {
-}
-
-AsyncSocketAdapter::AsyncSocketAdapter(AsyncSocket* socket) : socket_(nullptr) {
-  Attach(socket);
-}
-
-AsyncSocketAdapter::~AsyncSocketAdapter() {
-  delete socket_;
-}
-
-void AsyncSocketAdapter::Attach(AsyncSocket* socket) {
-  RTC_DCHECK(!socket_);
-  socket_ = socket;
-  if (socket_) {
-    socket_->SignalConnectEvent.connect(this,
-                                        &AsyncSocketAdapter::OnConnectEvent);
-    socket_->SignalReadEvent.connect(this, &AsyncSocketAdapter::OnReadEvent);
-    socket_->SignalWriteEvent.connect(this, &AsyncSocketAdapter::OnWriteEvent);
-    socket_->SignalCloseEvent.connect(this, &AsyncSocketAdapter::OnCloseEvent);
-  }
-}
-
-SocketAddress AsyncSocketAdapter::GetLocalAddress() const {
-  return socket_->GetLocalAddress();
-}
-
-SocketAddress AsyncSocketAdapter::GetRemoteAddress() const {
-  return socket_->GetRemoteAddress();
-}
-
-int AsyncSocketAdapter::Bind(const SocketAddress& addr) {
-  return socket_->Bind(addr);
-}
-
-int AsyncSocketAdapter::Connect(const SocketAddress& addr) {
-  return socket_->Connect(addr);
-}
-
-int AsyncSocketAdapter::Send(const void* pv, size_t cb) {
-  return socket_->Send(pv, cb);
-}
-
-int AsyncSocketAdapter::SendTo(const void* pv,
-                               size_t cb,
-                               const SocketAddress& addr) {
-  return socket_->SendTo(pv, cb, addr);
-}
-
-int AsyncSocketAdapter::Recv(void* pv, size_t cb, int64_t* timestamp) {
-  return socket_->Recv(pv, cb, timestamp);
-}
-
-int AsyncSocketAdapter::RecvFrom(void* pv,
-                                 size_t cb,
-                                 SocketAddress* paddr,
-                                 int64_t* timestamp) {
-  return socket_->RecvFrom(pv, cb, paddr, timestamp);
-}
-
-int AsyncSocketAdapter::Listen(int backlog) {
-  return socket_->Listen(backlog);
-}
-
-AsyncSocket* AsyncSocketAdapter::Accept(SocketAddress* paddr) {
-  return socket_->Accept(paddr);
-}
-
-int AsyncSocketAdapter::Close() {
-  return socket_->Close();
-}
-
-int AsyncSocketAdapter::GetError() const {
-  return socket_->GetError();
-}
-
-void AsyncSocketAdapter::SetError(int error) {
-  return socket_->SetError(error);
-}
-
-AsyncSocket::ConnState AsyncSocketAdapter::GetState() const {
-  return socket_->GetState();
-}
-
-int AsyncSocketAdapter::GetOption(Option opt, int* value) {
-  return socket_->GetOption(opt, value);
-}
-
-int AsyncSocketAdapter::SetOption(Option opt, int value) {
-  return socket_->SetOption(opt, value);
-}
-
-void AsyncSocketAdapter::OnConnectEvent(AsyncSocket* socket) {
-  SignalConnectEvent(this);
-}
-
-void AsyncSocketAdapter::OnReadEvent(AsyncSocket* socket) {
-  SignalReadEvent(this);
-}
-
-void AsyncSocketAdapter::OnWriteEvent(AsyncSocket* socket) {
-  SignalWriteEvent(this);
-}
-
-void AsyncSocketAdapter::OnCloseEvent(AsyncSocket* socket, int err) {
-  SignalCloseEvent(this, err);
-}
-
-}  // namespace rtc
diff --git a/rtc_base/asyncsocket.h b/rtc_base/asyncsocket.h
deleted file mode 100644
index 7284506..0000000
--- a/rtc_base/asyncsocket.h
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- *  Copyright 2004 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_RTC_BASE_ASYNCSOCKET_H_
-#define WEBRTC_RTC_BASE_ASYNCSOCKET_H_
-
-#include "webrtc/rtc_base/sigslot.h"
-#include "webrtc/rtc_base/socket.h"
-
-namespace rtc {
-
-// TODO: Remove Socket and rename AsyncSocket to Socket.
-
-// Provides the ability to perform socket I/O asynchronously.
-class AsyncSocket : public Socket {
- public:
-  AsyncSocket();
-  ~AsyncSocket() override;
-
-  AsyncSocket* Accept(SocketAddress* paddr) override = 0;
-
-  // SignalReadEvent and SignalWriteEvent use multi_threaded_local to allow
-  // access concurrently from different thread.
-  // For example SignalReadEvent::connect will be called in AsyncUDPSocket ctor
-  // but at the same time the SocketDispatcher maybe signaling the read event.
-  // ready to read
-  sigslot::signal1<AsyncSocket*,
-                   sigslot::multi_threaded_local> SignalReadEvent;
-  // ready to write
-  sigslot::signal1<AsyncSocket*,
-                   sigslot::multi_threaded_local> SignalWriteEvent;
-  sigslot::signal1<AsyncSocket*> SignalConnectEvent;     // connected
-  sigslot::signal2<AsyncSocket*, int> SignalCloseEvent;  // closed
-};
-
-class AsyncSocketAdapter : public AsyncSocket, public sigslot::has_slots<> {
- public:
-  // The adapted socket may explicitly be null, and later assigned using Attach.
-  // However, subclasses which support detached mode must override any methods
-  // that will be called during the detached period (usually GetState()), to
-  // avoid dereferencing a null pointer.
-  explicit AsyncSocketAdapter(AsyncSocket* socket);
-  ~AsyncSocketAdapter() override;
-  void Attach(AsyncSocket* socket);
-  SocketAddress GetLocalAddress() const override;
-  SocketAddress GetRemoteAddress() const override;
-  int Bind(const SocketAddress& addr) override;
-  int Connect(const SocketAddress& addr) override;
-  int Send(const void* pv, size_t cb) override;
-  int SendTo(const void* pv, size_t cb, const SocketAddress& addr) override;
-  int Recv(void* pv, size_t cb, int64_t* timestamp) override;
-  int RecvFrom(void* pv,
-               size_t cb,
-               SocketAddress* paddr,
-               int64_t* timestamp) override;
-  int Listen(int backlog) override;
-  AsyncSocket* Accept(SocketAddress* paddr) override;
-  int Close() override;
-  int GetError() const override;
-  void SetError(int error) override;
-  ConnState GetState() const override;
-  int GetOption(Option opt, int* value) override;
-  int SetOption(Option opt, int value) override;
-
- protected:
-  virtual void OnConnectEvent(AsyncSocket* socket);
-  virtual void OnReadEvent(AsyncSocket* socket);
-  virtual void OnWriteEvent(AsyncSocket* socket);
-  virtual void OnCloseEvent(AsyncSocket* socket, int err);
-
-  AsyncSocket* socket_;
-};
-
-}  // namespace rtc
-
-#endif  // WEBRTC_RTC_BASE_ASYNCSOCKET_H_
diff --git a/rtc_base/asynctcpsocket.cc b/rtc_base/asynctcpsocket.cc
deleted file mode 100644
index 1da70df..0000000
--- a/rtc_base/asynctcpsocket.cc
+++ /dev/null
@@ -1,331 +0,0 @@
-/*
- *  Copyright 2004 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/rtc_base/asynctcpsocket.h"
-
-#include <string.h>
-
-#include <algorithm>
-#include <memory>
-
-#include "webrtc/rtc_base/byteorder.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-
-#if defined(WEBRTC_POSIX)
-#include <errno.h>
-#endif  // WEBRTC_POSIX
-
-namespace rtc {
-
-static const size_t kMaxPacketSize = 64 * 1024;
-
-typedef uint16_t PacketLength;
-static const size_t kPacketLenSize = sizeof(PacketLength);
-
-static const size_t kBufSize = kMaxPacketSize + kPacketLenSize;
-
-// The input buffer will be resized so that at least kMinimumRecvSize bytes can
-// be received (but it will not grow above the maximum size passed to the
-// constructor).
-static const size_t kMinimumRecvSize = 128;
-
-static const int kListenBacklog = 5;
-
-// Binds and connects |socket|
-AsyncSocket* AsyncTCPSocketBase::ConnectSocket(
-    rtc::AsyncSocket* socket,
-    const rtc::SocketAddress& bind_address,
-    const rtc::SocketAddress& remote_address) {
-  std::unique_ptr<rtc::AsyncSocket> owned_socket(socket);
-  if (socket->Bind(bind_address) < 0) {
-    LOG(LS_ERROR) << "Bind() failed with error " << socket->GetError();
-    return nullptr;
-  }
-  if (socket->Connect(remote_address) < 0) {
-    LOG(LS_ERROR) << "Connect() failed with error " << socket->GetError();
-    return nullptr;
-  }
-  return owned_socket.release();
-}
-
-AsyncTCPSocketBase::AsyncTCPSocketBase(AsyncSocket* socket, bool listen,
-                                       size_t max_packet_size)
-    : socket_(socket),
-      listen_(listen),
-      max_insize_(max_packet_size),
-      max_outsize_(max_packet_size) {
-  if (!listen_) {
-    // Listening sockets don't send/receive data, so they don't need buffers.
-    inbuf_.EnsureCapacity(kMinimumRecvSize);
-  }
-
-  RTC_DCHECK(socket_.get() != nullptr);
-  socket_->SignalConnectEvent.connect(
-      this, &AsyncTCPSocketBase::OnConnectEvent);
-  socket_->SignalReadEvent.connect(this, &AsyncTCPSocketBase::OnReadEvent);
-  socket_->SignalWriteEvent.connect(this, &AsyncTCPSocketBase::OnWriteEvent);
-  socket_->SignalCloseEvent.connect(this, &AsyncTCPSocketBase::OnCloseEvent);
-
-  if (listen_) {
-    if (socket_->Listen(kListenBacklog) < 0) {
-      LOG(LS_ERROR) << "Listen() failed with error " << socket_->GetError();
-    }
-  }
-}
-
-AsyncTCPSocketBase::~AsyncTCPSocketBase() {}
-
-SocketAddress AsyncTCPSocketBase::GetLocalAddress() const {
-  return socket_->GetLocalAddress();
-}
-
-SocketAddress AsyncTCPSocketBase::GetRemoteAddress() const {
-  return socket_->GetRemoteAddress();
-}
-
-int AsyncTCPSocketBase::Close() {
-  return socket_->Close();
-}
-
-AsyncTCPSocket::State AsyncTCPSocketBase::GetState() const {
-  switch (socket_->GetState()) {
-    case Socket::CS_CLOSED:
-      return STATE_CLOSED;
-    case Socket::CS_CONNECTING:
-      if (listen_) {
-        return STATE_BOUND;
-      } else {
-        return STATE_CONNECTING;
-      }
-    case Socket::CS_CONNECTED:
-      return STATE_CONNECTED;
-    default:
-      RTC_NOTREACHED();
-      return STATE_CLOSED;
-  }
-}
-
-int AsyncTCPSocketBase::GetOption(Socket::Option opt, int* value) {
-  return socket_->GetOption(opt, value);
-}
-
-int AsyncTCPSocketBase::SetOption(Socket::Option opt, int value) {
-  return socket_->SetOption(opt, value);
-}
-
-int AsyncTCPSocketBase::GetError() const {
-  return socket_->GetError();
-}
-
-void AsyncTCPSocketBase::SetError(int error) {
-  return socket_->SetError(error);
-}
-
-int AsyncTCPSocketBase::SendTo(const void *pv, size_t cb,
-                               const SocketAddress& addr,
-                               const rtc::PacketOptions& options) {
-  const SocketAddress& remote_address = GetRemoteAddress();
-  if (addr == remote_address)
-    return Send(pv, cb, options);
-  // Remote address may be empty if there is a sudden network change.
-  RTC_DCHECK(remote_address.IsNil());
-  socket_->SetError(ENOTCONN);
-  return -1;
-}
-
-int AsyncTCPSocketBase::SendRaw(const void * pv, size_t cb) {
-  if (outbuf_.size() + cb > max_outsize_) {
-    socket_->SetError(EMSGSIZE);
-    return -1;
-  }
-
-  RTC_DCHECK(!listen_);
-  outbuf_.AppendData(static_cast<const uint8_t*>(pv), cb);
-
-  return FlushOutBuffer();
-}
-
-int AsyncTCPSocketBase::FlushOutBuffer() {
-  RTC_DCHECK(!listen_);
-  int res = socket_->Send(outbuf_.data(), outbuf_.size());
-  if (res <= 0) {
-    return res;
-  }
-  if (static_cast<size_t>(res) > outbuf_.size()) {
-    RTC_NOTREACHED();
-    return -1;
-  }
-  size_t new_size = outbuf_.size() - res;
-  if (new_size > 0) {
-    memmove(outbuf_.data(), outbuf_.data() + res, new_size);
-  }
-  outbuf_.SetSize(new_size);
-  return res;
-}
-
-void AsyncTCPSocketBase::AppendToOutBuffer(const void* pv, size_t cb) {
-  RTC_DCHECK(outbuf_.size() + cb <= max_outsize_);
-  RTC_DCHECK(!listen_);
-  outbuf_.AppendData(static_cast<const uint8_t*>(pv), cb);
-}
-
-void AsyncTCPSocketBase::OnConnectEvent(AsyncSocket* socket) {
-  SignalConnect(this);
-}
-
-void AsyncTCPSocketBase::OnReadEvent(AsyncSocket* socket) {
-  RTC_DCHECK(socket_.get() == socket);
-
-  if (listen_) {
-    rtc::SocketAddress address;
-    rtc::AsyncSocket* new_socket = socket->Accept(&address);
-    if (!new_socket) {
-      // TODO(stefan): Do something better like forwarding the error
-      // to the user.
-      LOG(LS_ERROR) << "TCP accept failed with error " << socket_->GetError();
-      return;
-    }
-
-    HandleIncomingConnection(new_socket);
-
-    // Prime a read event in case data is waiting.
-    new_socket->SignalReadEvent(new_socket);
-  } else {
-    size_t total_recv = 0;
-    while (true) {
-      size_t free_size = inbuf_.capacity() - inbuf_.size();
-      if (free_size < kMinimumRecvSize && inbuf_.capacity() < max_insize_) {
-        inbuf_.EnsureCapacity(std::min(max_insize_, inbuf_.capacity() * 2));
-        free_size = inbuf_.capacity() - inbuf_.size();
-      }
-
-      int len =
-          socket_->Recv(inbuf_.data() + inbuf_.size(), free_size, nullptr);
-      if (len < 0) {
-        // TODO(stefan): Do something better like forwarding the error to the
-        // user.
-        if (!socket_->IsBlocking()) {
-          LOG(LS_ERROR) << "Recv() returned error: " << socket_->GetError();
-        }
-        break;
-      }
-
-      total_recv += len;
-      inbuf_.SetSize(inbuf_.size() + len);
-      if (!len || static_cast<size_t>(len) < free_size) {
-        break;
-      }
-    }
-
-    if (!total_recv) {
-      return;
-    }
-
-    size_t size = inbuf_.size();
-    ProcessInput(inbuf_.data<char>(), &size);
-
-    if (size > inbuf_.size()) {
-      LOG(LS_ERROR) << "input buffer overflow";
-      RTC_NOTREACHED();
-      inbuf_.Clear();
-    } else {
-      inbuf_.SetSize(size);
-    }
-  }
-}
-
-void AsyncTCPSocketBase::OnWriteEvent(AsyncSocket* socket) {
-  RTC_DCHECK(socket_.get() == socket);
-
-  if (outbuf_.size() > 0) {
-    FlushOutBuffer();
-  }
-
-  if (outbuf_.size() == 0) {
-    SignalReadyToSend(this);
-  }
-}
-
-void AsyncTCPSocketBase::OnCloseEvent(AsyncSocket* socket, int error) {
-  SignalClose(this, error);
-}
-
-// AsyncTCPSocket
-// Binds and connects |socket| and creates AsyncTCPSocket for
-// it. Takes ownership of |socket|. Returns null if bind() or
-// connect() fail (|socket| is destroyed in that case).
-AsyncTCPSocket* AsyncTCPSocket::Create(
-    AsyncSocket* socket,
-    const SocketAddress& bind_address,
-    const SocketAddress& remote_address) {
-  return new AsyncTCPSocket(AsyncTCPSocketBase::ConnectSocket(
-      socket, bind_address, remote_address), false);
-}
-
-AsyncTCPSocket::AsyncTCPSocket(AsyncSocket* socket, bool listen)
-    : AsyncTCPSocketBase(socket, listen, kBufSize) {
-}
-
-int AsyncTCPSocket::Send(const void *pv, size_t cb,
-                         const rtc::PacketOptions& options) {
-  if (cb > kBufSize) {
-    SetError(EMSGSIZE);
-    return -1;
-  }
-
-  // If we are blocking on send, then silently drop this packet
-  if (!IsOutBufferEmpty())
-    return static_cast<int>(cb);
-
-  PacketLength pkt_len = HostToNetwork16(static_cast<PacketLength>(cb));
-  AppendToOutBuffer(&pkt_len, kPacketLenSize);
-  AppendToOutBuffer(pv, cb);
-
-  int res = FlushOutBuffer();
-  if (res <= 0) {
-    // drop packet if we made no progress
-    ClearOutBuffer();
-    return res;
-  }
-
-  rtc::SentPacket sent_packet(options.packet_id, rtc::TimeMillis());
-  SignalSentPacket(this, sent_packet);
-
-  // We claim to have sent the whole thing, even if we only sent partial
-  return static_cast<int>(cb);
-}
-
-void AsyncTCPSocket::ProcessInput(char * data, size_t* len) {
-  SocketAddress remote_addr(GetRemoteAddress());
-
-  while (true) {
-    if (*len < kPacketLenSize)
-      return;
-
-    PacketLength pkt_len = rtc::GetBE16(data);
-    if (*len < kPacketLenSize + pkt_len)
-      return;
-
-    SignalReadPacket(this, data + kPacketLenSize, pkt_len, remote_addr,
-                     CreatePacketTime(0));
-
-    *len -= kPacketLenSize + pkt_len;
-    if (*len > 0) {
-      memmove(data, data + kPacketLenSize + pkt_len, *len);
-    }
-  }
-}
-
-void AsyncTCPSocket::HandleIncomingConnection(AsyncSocket* socket) {
-  SignalNewConnection(this, new AsyncTCPSocket(socket, false));
-}
-
-}  // namespace rtc
diff --git a/rtc_base/asynctcpsocket.h b/rtc_base/asynctcpsocket.h
deleted file mode 100644
index 1fee4fe..0000000
--- a/rtc_base/asynctcpsocket.h
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- *  Copyright 2004 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_RTC_BASE_ASYNCTCPSOCKET_H_
-#define WEBRTC_RTC_BASE_ASYNCTCPSOCKET_H_
-
-#include <memory>
-
-#include "webrtc/rtc_base/asyncpacketsocket.h"
-#include "webrtc/rtc_base/buffer.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/socketfactory.h"
-
-namespace rtc {
-
-// Simulates UDP semantics over TCP.  Send and Recv packet sizes
-// are preserved, and drops packets silently on Send, rather than
-// buffer them in user space.
-class AsyncTCPSocketBase : public AsyncPacketSocket {
- public:
-  AsyncTCPSocketBase(AsyncSocket* socket, bool listen, size_t max_packet_size);
-  ~AsyncTCPSocketBase() override;
-
-  // Pure virtual methods to send and recv data.
-  int Send(const void *pv, size_t cb,
-                   const rtc::PacketOptions& options) override = 0;
-  virtual void ProcessInput(char* data, size_t* len) = 0;
-  // Signals incoming connection.
-  virtual void HandleIncomingConnection(AsyncSocket* socket) = 0;
-
-  SocketAddress GetLocalAddress() const override;
-  SocketAddress GetRemoteAddress() const override;
-  int SendTo(const void* pv,
-             size_t cb,
-             const SocketAddress& addr,
-             const rtc::PacketOptions& options) override;
-  int Close() override;
-
-  State GetState() const override;
-  int GetOption(Socket::Option opt, int* value) override;
-  int SetOption(Socket::Option opt, int value) override;
-  int GetError() const override;
-  void SetError(int error) override;
-
- protected:
-  // Binds and connects |socket| and creates AsyncTCPSocket for
-  // it. Takes ownership of |socket|. Returns null if bind() or
-  // connect() fail (|socket| is destroyed in that case).
-  static AsyncSocket* ConnectSocket(AsyncSocket* socket,
-                                    const SocketAddress& bind_address,
-                                    const SocketAddress& remote_address);
-  virtual int SendRaw(const void* pv, size_t cb);
-  int FlushOutBuffer();
-  // Add data to |outbuf_|.
-  void AppendToOutBuffer(const void* pv, size_t cb);
-
-  // Helper methods for |outpos_|.
-  bool IsOutBufferEmpty() const { return outbuf_.size() == 0; }
-  void ClearOutBuffer() { outbuf_.Clear(); }
-
- private:
-  // Called by the underlying socket
-  void OnConnectEvent(AsyncSocket* socket);
-  void OnReadEvent(AsyncSocket* socket);
-  void OnWriteEvent(AsyncSocket* socket);
-  void OnCloseEvent(AsyncSocket* socket, int error);
-
-  std::unique_ptr<AsyncSocket> socket_;
-  bool listen_;
-  Buffer inbuf_;
-  Buffer outbuf_;
-  size_t max_insize_;
-  size_t max_outsize_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(AsyncTCPSocketBase);
-};
-
-class AsyncTCPSocket : public AsyncTCPSocketBase {
- public:
-  // Binds and connects |socket| and creates AsyncTCPSocket for
-  // it. Takes ownership of |socket|. Returns null if bind() or
-  // connect() fail (|socket| is destroyed in that case).
-  static AsyncTCPSocket* Create(AsyncSocket* socket,
-                                const SocketAddress& bind_address,
-                                const SocketAddress& remote_address);
-  AsyncTCPSocket(AsyncSocket* socket, bool listen);
-  ~AsyncTCPSocket() override {}
-
-  int Send(const void* pv,
-           size_t cb,
-           const rtc::PacketOptions& options) override;
-  void ProcessInput(char* data, size_t* len) override;
-  void HandleIncomingConnection(AsyncSocket* socket) override;
-
- private:
-  RTC_DISALLOW_COPY_AND_ASSIGN(AsyncTCPSocket);
-};
-
-}  // namespace rtc
-
-#endif  // WEBRTC_RTC_BASE_ASYNCTCPSOCKET_H_
diff --git a/rtc_base/asynctcpsocket_unittest.cc b/rtc_base/asynctcpsocket_unittest.cc
deleted file mode 100644
index f120db0..0000000
--- a/rtc_base/asynctcpsocket_unittest.cc
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- *  Copyright 2004 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 <memory>
-#include <string>
-
-#include "webrtc/rtc_base/asynctcpsocket.h"
-#include "webrtc/rtc_base/gunit.h"
-#include "webrtc/rtc_base/virtualsocketserver.h"
-
-namespace rtc {
-
-class AsyncTCPSocketTest
-    : public testing::Test,
-      public sigslot::has_slots<> {
- public:
-  AsyncTCPSocketTest()
-      : vss_(new rtc::VirtualSocketServer()),
-        socket_(vss_->CreateAsyncSocket(SOCK_STREAM)),
-        tcp_socket_(new AsyncTCPSocket(socket_, true)),
-        ready_to_send_(false) {
-    tcp_socket_->SignalReadyToSend.connect(this,
-                                           &AsyncTCPSocketTest::OnReadyToSend);
-  }
-
-  void OnReadyToSend(rtc::AsyncPacketSocket* socket) {
-    ready_to_send_ = true;
-  }
-
- protected:
-  std::unique_ptr<VirtualSocketServer> vss_;
-  AsyncSocket* socket_;
-  std::unique_ptr<AsyncTCPSocket> tcp_socket_;
-  bool ready_to_send_;
-};
-
-TEST_F(AsyncTCPSocketTest, OnWriteEvent) {
-  EXPECT_FALSE(ready_to_send_);
-  socket_->SignalWriteEvent(socket_);
-  EXPECT_TRUE(ready_to_send_);
-}
-
-}  // namespace rtc
diff --git a/rtc_base/asyncudpsocket.cc b/rtc_base/asyncudpsocket.cc
deleted file mode 100644
index c5068a6..0000000
--- a/rtc_base/asyncudpsocket.cc
+++ /dev/null
@@ -1,130 +0,0 @@
-/*
- *  Copyright 2004 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/rtc_base/asyncudpsocket.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-
-namespace rtc {
-
-static const int BUF_SIZE = 64 * 1024;
-
-AsyncUDPSocket* AsyncUDPSocket::Create(
-    AsyncSocket* socket,
-    const SocketAddress& bind_address) {
-  std::unique_ptr<AsyncSocket> owned_socket(socket);
-  if (socket->Bind(bind_address) < 0) {
-    LOG(LS_ERROR) << "Bind() failed with error " << socket->GetError();
-    return nullptr;
-  }
-  return new AsyncUDPSocket(owned_socket.release());
-}
-
-AsyncUDPSocket* AsyncUDPSocket::Create(SocketFactory* factory,
-                                       const SocketAddress& bind_address) {
-  AsyncSocket* socket =
-      factory->CreateAsyncSocket(bind_address.family(), SOCK_DGRAM);
-  if (!socket)
-    return nullptr;
-  return Create(socket, bind_address);
-}
-
-AsyncUDPSocket::AsyncUDPSocket(AsyncSocket* socket)
-    : socket_(socket) {
-  size_ = BUF_SIZE;
-  buf_ = new char[size_];
-
-  // The socket should start out readable but not writable.
-  socket_->SignalReadEvent.connect(this, &AsyncUDPSocket::OnReadEvent);
-  socket_->SignalWriteEvent.connect(this, &AsyncUDPSocket::OnWriteEvent);
-}
-
-AsyncUDPSocket::~AsyncUDPSocket() {
-  delete [] buf_;
-}
-
-SocketAddress AsyncUDPSocket::GetLocalAddress() const {
-  return socket_->GetLocalAddress();
-}
-
-SocketAddress AsyncUDPSocket::GetRemoteAddress() const {
-  return socket_->GetRemoteAddress();
-}
-
-int AsyncUDPSocket::Send(const void *pv, size_t cb,
-                         const rtc::PacketOptions& options) {
-  rtc::SentPacket sent_packet(options.packet_id, rtc::TimeMillis());
-  int ret = socket_->Send(pv, cb);
-  SignalSentPacket(this, sent_packet);
-  return ret;
-}
-
-int AsyncUDPSocket::SendTo(const void *pv, size_t cb,
-                           const SocketAddress& addr,
-                           const rtc::PacketOptions& options) {
-  rtc::SentPacket sent_packet(options.packet_id, rtc::TimeMillis());
-  int ret = socket_->SendTo(pv, cb, addr);
-  SignalSentPacket(this, sent_packet);
-  return ret;
-}
-
-int AsyncUDPSocket::Close() {
-  return socket_->Close();
-}
-
-AsyncUDPSocket::State AsyncUDPSocket::GetState() const {
-  return STATE_BOUND;
-}
-
-int AsyncUDPSocket::GetOption(Socket::Option opt, int* value) {
-  return socket_->GetOption(opt, value);
-}
-
-int AsyncUDPSocket::SetOption(Socket::Option opt, int value) {
-  return socket_->SetOption(opt, value);
-}
-
-int AsyncUDPSocket::GetError() const {
-  return socket_->GetError();
-}
-
-void AsyncUDPSocket::SetError(int error) {
-  return socket_->SetError(error);
-}
-
-void AsyncUDPSocket::OnReadEvent(AsyncSocket* socket) {
-  RTC_DCHECK(socket_.get() == socket);
-
-  SocketAddress remote_addr;
-  int64_t timestamp;
-  int len = socket_->RecvFrom(buf_, size_, &remote_addr, &timestamp);
-  if (len < 0) {
-    // An error here typically means we got an ICMP error in response to our
-    // send datagram, indicating the remote address was unreachable.
-    // When doing ICE, this kind of thing will often happen.
-    // TODO: Do something better like forwarding the error to the user.
-    SocketAddress local_addr = socket_->GetLocalAddress();
-    LOG(LS_INFO) << "AsyncUDPSocket[" << local_addr.ToSensitiveString() << "] "
-                 << "receive failed with error " << socket_->GetError();
-    return;
-  }
-
-  // TODO: Make sure that we got all of the packet.
-  // If we did not, then we should resize our buffer to be large enough.
-  SignalReadPacket(
-      this, buf_, static_cast<size_t>(len), remote_addr,
-      (timestamp > -1 ? PacketTime(timestamp, 0) : CreatePacketTime(0)));
-}
-
-void AsyncUDPSocket::OnWriteEvent(AsyncSocket* socket) {
-  SignalReadyToSend(this);
-}
-
-}  // namespace rtc
diff --git a/rtc_base/asyncudpsocket.h b/rtc_base/asyncudpsocket.h
deleted file mode 100644
index 15c1e76..0000000
--- a/rtc_base/asyncudpsocket.h
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- *  Copyright 2004 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_RTC_BASE_ASYNCUDPSOCKET_H_
-#define WEBRTC_RTC_BASE_ASYNCUDPSOCKET_H_
-
-#include <memory>
-
-#include "webrtc/rtc_base/asyncpacketsocket.h"
-#include "webrtc/rtc_base/socketfactory.h"
-
-namespace rtc {
-
-// Provides the ability to receive packets asynchronously.  Sends are not
-// buffered since it is acceptable to drop packets under high load.
-class AsyncUDPSocket : public AsyncPacketSocket {
- public:
-  // Binds |socket| and creates AsyncUDPSocket for it. Takes ownership
-  // of |socket|. Returns null if bind() fails (|socket| is destroyed
-  // in that case).
-  static AsyncUDPSocket* Create(AsyncSocket* socket,
-                                const SocketAddress& bind_address);
-  // Creates a new socket for sending asynchronous UDP packets using an
-  // asynchronous socket from the given factory.
-  static AsyncUDPSocket* Create(SocketFactory* factory,
-                                const SocketAddress& bind_address);
-  explicit AsyncUDPSocket(AsyncSocket* socket);
-  ~AsyncUDPSocket() override;
-
-  SocketAddress GetLocalAddress() const override;
-  SocketAddress GetRemoteAddress() const override;
-  int Send(const void* pv,
-           size_t cb,
-           const rtc::PacketOptions& options) override;
-  int SendTo(const void* pv,
-             size_t cb,
-             const SocketAddress& addr,
-             const rtc::PacketOptions& options) override;
-  int Close() override;
-
-  State GetState() const override;
-  int GetOption(Socket::Option opt, int* value) override;
-  int SetOption(Socket::Option opt, int value) override;
-  int GetError() const override;
-  void SetError(int error) override;
-
- private:
-  // Called when the underlying socket is ready to be read from.
-  void OnReadEvent(AsyncSocket* socket);
-  // Called when the underlying socket is ready to send.
-  void OnWriteEvent(AsyncSocket* socket);
-
-  std::unique_ptr<AsyncSocket> socket_;
-  char* buf_;
-  size_t size_;
-};
-
-}  // namespace rtc
-
-#endif  // WEBRTC_RTC_BASE_ASYNCUDPSOCKET_H_
diff --git a/rtc_base/asyncudpsocket_unittest.cc b/rtc_base/asyncudpsocket_unittest.cc
deleted file mode 100644
index c16c59d..0000000
--- a/rtc_base/asyncudpsocket_unittest.cc
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- *  Copyright 2004 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 <memory>
-#include <string>
-
-#include "webrtc/rtc_base/asyncudpsocket.h"
-#include "webrtc/rtc_base/gunit.h"
-#include "webrtc/rtc_base/physicalsocketserver.h"
-#include "webrtc/rtc_base/virtualsocketserver.h"
-
-namespace rtc {
-
-class AsyncUdpSocketTest
-    : public testing::Test,
-      public sigslot::has_slots<> {
- public:
-  AsyncUdpSocketTest()
-      : pss_(new rtc::PhysicalSocketServer),
-        vss_(new rtc::VirtualSocketServer(pss_.get())),
-        socket_(vss_->CreateAsyncSocket(SOCK_DGRAM)),
-        udp_socket_(new AsyncUDPSocket(socket_)),
-        ready_to_send_(false) {
-    udp_socket_->SignalReadyToSend.connect(this,
-                                           &AsyncUdpSocketTest::OnReadyToSend);
-  }
-
-  void OnReadyToSend(rtc::AsyncPacketSocket* socket) {
-    ready_to_send_ = true;
-  }
-
- protected:
-  std::unique_ptr<PhysicalSocketServer> pss_;
-  std::unique_ptr<VirtualSocketServer> vss_;
-  AsyncSocket* socket_;
-  std::unique_ptr<AsyncUDPSocket> udp_socket_;
-  bool ready_to_send_;
-};
-
-TEST_F(AsyncUdpSocketTest, OnWriteEvent) {
-  EXPECT_FALSE(ready_to_send_);
-  socket_->SignalWriteEvent(socket_);
-  EXPECT_TRUE(ready_to_send_);
-}
-
-}  // namespace rtc
diff --git a/rtc_base/atomicops.h b/rtc_base/atomicops.h
deleted file mode 100644
index c9e1a93..0000000
--- a/rtc_base/atomicops.h
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- *  Copyright 2011 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_RTC_BASE_ATOMICOPS_H_
-#define WEBRTC_RTC_BASE_ATOMICOPS_H_
-
-#if defined(WEBRTC_WIN)
-// Include winsock2.h before including <windows.h> to maintain consistency with
-// win32.h.  We can't include win32.h directly here since it pulls in
-// headers such as basictypes.h which causes problems in Chromium where webrtc
-// exists as two separate projects, webrtc and libjingle.
-#include <winsock2.h>
-#include <windows.h>
-#endif  // defined(WEBRTC_WIN)
-
-namespace rtc {
-class AtomicOps {
- public:
-#if defined(WEBRTC_WIN)
-  // Assumes sizeof(int) == sizeof(LONG), which it is on Win32 and Win64.
-  static int Increment(volatile int* i) {
-    return ::InterlockedIncrement(reinterpret_cast<volatile LONG*>(i));
-  }
-  static int Decrement(volatile int* i) {
-    return ::InterlockedDecrement(reinterpret_cast<volatile LONG*>(i));
-  }
-  static int AcquireLoad(volatile const int* i) {
-    return *i;
-  }
-  static void ReleaseStore(volatile int* i, int value) {
-    *i = value;
-  }
-  static int CompareAndSwap(volatile int* i, int old_value, int new_value) {
-    return ::InterlockedCompareExchange(reinterpret_cast<volatile LONG*>(i),
-                                        new_value,
-                                        old_value);
-  }
-  // Pointer variants.
-  template <typename T>
-  static T* AcquireLoadPtr(T* volatile* ptr) {
-    return *ptr;
-  }
-  template <typename T>
-  static T* CompareAndSwapPtr(T* volatile* ptr, T* old_value, T* new_value) {
-    return static_cast<T*>(::InterlockedCompareExchangePointer(
-        reinterpret_cast<PVOID volatile*>(ptr), new_value, old_value));
-  }
-#else
-  static int Increment(volatile int* i) {
-    return __sync_add_and_fetch(i, 1);
-  }
-  static int Decrement(volatile int* i) {
-    return __sync_sub_and_fetch(i, 1);
-  }
-  static int AcquireLoad(volatile const int* i) {
-    return __atomic_load_n(i, __ATOMIC_ACQUIRE);
-  }
-  static void ReleaseStore(volatile int* i, int value) {
-    __atomic_store_n(i, value, __ATOMIC_RELEASE);
-  }
-  static int CompareAndSwap(volatile int* i, int old_value, int new_value) {
-    return __sync_val_compare_and_swap(i, old_value, new_value);
-  }
-  // Pointer variants.
-  template <typename T>
-  static T* AcquireLoadPtr(T* volatile* ptr) {
-    return __atomic_load_n(ptr, __ATOMIC_ACQUIRE);
-  }
-  template <typename T>
-  static T* CompareAndSwapPtr(T* volatile* ptr, T* old_value, T* new_value) {
-    return __sync_val_compare_and_swap(ptr, old_value, new_value);
-  }
-#endif
-};
-
-
-
-}
-
-#endif  // WEBRTC_RTC_BASE_ATOMICOPS_H_
diff --git a/rtc_base/atomicops_unittest.cc b/rtc_base/atomicops_unittest.cc
deleted file mode 100644
index d5a1105..0000000
--- a/rtc_base/atomicops_unittest.cc
+++ /dev/null
@@ -1,12 +0,0 @@
-/*
- *  Copyright 2011 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.
- */
-
-// TODO(pbos): Move AtomicOps tests to here from
-// webrtc/rtc_base/criticalsection_unittest.cc.
diff --git a/rtc_base/base64.cc b/rtc_base/base64.cc
deleted file mode 100644
index 5fe424d..0000000
--- a/rtc_base/base64.cc
+++ /dev/null
@@ -1,278 +0,0 @@
-
-//*********************************************************************
-//* Base64 - a simple base64 encoder and decoder.
-//*
-//*     Copyright (c) 1999, Bob Withers - bwit@pobox.com
-//*
-//* This code may be freely used for any purpose, either personal
-//* or commercial, provided the authors copyright notice remains
-//* intact.
-//*
-//* Enhancements by Stanley Yamane:
-//*     o reverse lookup table for the decode function
-//*     o reserve string buffer space in advance
-//*
-//*********************************************************************
-
-#include "webrtc/rtc_base/base64.h"
-
-#include <string.h>
-
-#include "webrtc/rtc_base/checks.h"
-
-using std::vector;
-
-namespace rtc {
-
-static const char kPad = '=';
-static const unsigned char pd = 0xFD;  // Padding
-static const unsigned char sp = 0xFE;  // Whitespace
-static const unsigned char il = 0xFF;  // Illegal base64 character
-
-const char Base64::Base64Table[] =
-    // 0000000000111111111122222222223333333333444444444455555555556666
-    // 0123456789012345678901234567890123456789012345678901234567890123
-    "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
-
-// Decode Table gives the index of any valid base64 character in the
-// Base64 table
-// 65 == A, 97 == a, 48 == 0, 43 == +, 47 == /
-
-const unsigned char Base64::DecodeTable[] = {
-    // 0  1  2  3  4  5  6  7  8  9
-    il, il, il, il, il, il, il, il, il, sp,  //   0 -   9
-    sp, sp, sp, sp, il, il, il, il, il, il,  //  10 -  19
-    il, il, il, il, il, il, il, il, il, il,  //  20 -  29
-    il, il, sp, il, il, il, il, il, il, il,  //  30 -  39
-    il, il, il, 62, il, il, il, 63, 52, 53,  //  40 -  49
-    54, 55, 56, 57, 58, 59, 60, 61, il, il,  //  50 -  59
-    il, pd, il, il, il, 0,  1,  2,  3,  4,   //  60 -  69
-    5,  6,  7,  8,  9,  10, 11, 12, 13, 14,  //  70 -  79
-    15, 16, 17, 18, 19, 20, 21, 22, 23, 24,  //  80 -  89
-    25, il, il, il, il, il, il, 26, 27, 28,  //  90 -  99
-    29, 30, 31, 32, 33, 34, 35, 36, 37, 38,  // 100 - 109
-    39, 40, 41, 42, 43, 44, 45, 46, 47, 48,  // 110 - 119
-    49, 50, 51, il, il, il, il, il, il, il,  // 120 - 129
-    il, il, il, il, il, il, il, il, il, il,  // 130 - 139
-    il, il, il, il, il, il, il, il, il, il,  // 140 - 149
-    il, il, il, il, il, il, il, il, il, il,  // 150 - 159
-    il, il, il, il, il, il, il, il, il, il,  // 160 - 169
-    il, il, il, il, il, il, il, il, il, il,  // 170 - 179
-    il, il, il, il, il, il, il, il, il, il,  // 180 - 189
-    il, il, il, il, il, il, il, il, il, il,  // 190 - 199
-    il, il, il, il, il, il, il, il, il, il,  // 200 - 209
-    il, il, il, il, il, il, il, il, il, il,  // 210 - 219
-    il, il, il, il, il, il, il, il, il, il,  // 220 - 229
-    il, il, il, il, il, il, il, il, il, il,  // 230 - 239
-    il, il, il, il, il, il, il, il, il, il,  // 240 - 249
-    il, il, il, il, il, il                   // 250 - 255
-};
-
-bool Base64::IsBase64Char(char ch) {
-  return (('A' <= ch) && (ch <= 'Z')) || (('a' <= ch) && (ch <= 'z')) ||
-         (('0' <= ch) && (ch <= '9')) || (ch == '+') || (ch == '/');
-}
-
-bool Base64::GetNextBase64Char(char ch, char* next_ch) {
-  if (next_ch == nullptr) {
-    return false;
-  }
-  const char* p = strchr(Base64Table, ch);
-  if (!p)
-    return false;
-  ++p;
-  *next_ch = (*p) ? *p : Base64Table[0];
-  return true;
-}
-
-bool Base64::IsBase64Encoded(const std::string& str) {
-  for (size_t i = 0; i < str.size(); ++i) {
-    if (!IsBase64Char(str.at(i)))
-      return false;
-  }
-  return true;
-}
-
-void Base64::EncodeFromArray(const void* data,
-                             size_t len,
-                             std::string* result) {
-  RTC_DCHECK(nullptr != result);
-  result->clear();
-  result->resize(((len + 2) / 3) * 4);
-  const unsigned char* byte_data = static_cast<const unsigned char*>(data);
-
-  unsigned char c;
-  size_t i = 0;
-  size_t dest_ix = 0;
-  while (i < len) {
-    c = (byte_data[i] >> 2) & 0x3f;
-    (*result)[dest_ix++] = Base64Table[c];
-
-    c = (byte_data[i] << 4) & 0x3f;
-    if (++i < len) {
-      c |= (byte_data[i] >> 4) & 0x0f;
-    }
-    (*result)[dest_ix++] = Base64Table[c];
-
-    if (i < len) {
-      c = (byte_data[i] << 2) & 0x3f;
-      if (++i < len) {
-        c |= (byte_data[i] >> 6) & 0x03;
-      }
-      (*result)[dest_ix++] = Base64Table[c];
-    } else {
-      (*result)[dest_ix++] = kPad;
-    }
-
-    if (i < len) {
-      c = byte_data[i] & 0x3f;
-      (*result)[dest_ix++] = Base64Table[c];
-      ++i;
-    } else {
-      (*result)[dest_ix++] = kPad;
-    }
-  }
-}
-
-size_t Base64::GetNextQuantum(DecodeFlags parse_flags,
-                              bool illegal_pads,
-                              const char* data,
-                              size_t len,
-                              size_t* dpos,
-                              unsigned char qbuf[4],
-                              bool* padded) {
-  size_t byte_len = 0, pad_len = 0, pad_start = 0;
-  for (; (byte_len < 4) && (*dpos < len); ++*dpos) {
-    qbuf[byte_len] = DecodeTable[static_cast<unsigned char>(data[*dpos])];
-    if ((il == qbuf[byte_len]) || (illegal_pads && (pd == qbuf[byte_len]))) {
-      if (parse_flags != DO_PARSE_ANY)
-        break;
-      // Ignore illegal characters
-    } else if (sp == qbuf[byte_len]) {
-      if (parse_flags == DO_PARSE_STRICT)
-        break;
-      // Ignore spaces
-    } else if (pd == qbuf[byte_len]) {
-      if (byte_len < 2) {
-        if (parse_flags != DO_PARSE_ANY)
-          break;
-        // Ignore unexpected padding
-      } else if (byte_len + pad_len >= 4) {
-        if (parse_flags != DO_PARSE_ANY)
-          break;
-        // Ignore extra pads
-      } else {
-        if (1 == ++pad_len) {
-          pad_start = *dpos;
-        }
-      }
-    } else {
-      if (pad_len > 0) {
-        if (parse_flags != DO_PARSE_ANY)
-          break;
-        // Ignore pads which are followed by data
-        pad_len = 0;
-      }
-      ++byte_len;
-    }
-  }
-  for (size_t i = byte_len; i < 4; ++i) {
-    qbuf[i] = 0;
-  }
-  if (4 == byte_len + pad_len) {
-    *padded = true;
-  } else {
-    *padded = false;
-    if (pad_len) {
-      // Roll back illegal padding
-      *dpos = pad_start;
-    }
-  }
-  return byte_len;
-}
-
-bool Base64::DecodeFromArray(const char* data,
-                             size_t len,
-                             DecodeFlags flags,
-                             std::string* result,
-                             size_t* data_used) {
-  return DecodeFromArrayTemplate<std::string>(data, len, flags, result,
-                                              data_used);
-}
-
-bool Base64::DecodeFromArray(const char* data,
-                             size_t len,
-                             DecodeFlags flags,
-                             vector<char>* result,
-                             size_t* data_used) {
-  return DecodeFromArrayTemplate<vector<char>>(data, len, flags, result,
-                                               data_used);
-}
-
-bool Base64::DecodeFromArray(const char* data,
-                             size_t len,
-                             DecodeFlags flags,
-                             vector<uint8_t>* result,
-                             size_t* data_used) {
-  return DecodeFromArrayTemplate<vector<uint8_t>>(data, len, flags, result,
-                                                  data_used);
-}
-
-template <typename T>
-bool Base64::DecodeFromArrayTemplate(const char* data,
-                                     size_t len,
-                                     DecodeFlags flags,
-                                     T* result,
-                                     size_t* data_used) {
-  RTC_DCHECK(nullptr != result);
-  RTC_DCHECK(flags <= (DO_PARSE_MASK | DO_PAD_MASK | DO_TERM_MASK));
-
-  const DecodeFlags parse_flags = flags & DO_PARSE_MASK;
-  const DecodeFlags pad_flags = flags & DO_PAD_MASK;
-  const DecodeFlags term_flags = flags & DO_TERM_MASK;
-  RTC_DCHECK(0 != parse_flags);
-  RTC_DCHECK(0 != pad_flags);
-  RTC_DCHECK(0 != term_flags);
-
-  result->clear();
-  result->reserve(len);
-
-  size_t dpos = 0;
-  bool success = true, padded;
-  unsigned char c, qbuf[4];
-  while (dpos < len) {
-    size_t qlen = GetNextQuantum(parse_flags, (DO_PAD_NO == pad_flags), data,
-                                 len, &dpos, qbuf, &padded);
-    c = (qbuf[0] << 2) | ((qbuf[1] >> 4) & 0x3);
-    if (qlen >= 2) {
-      result->push_back(c);
-      c = ((qbuf[1] << 4) & 0xf0) | ((qbuf[2] >> 2) & 0xf);
-      if (qlen >= 3) {
-        result->push_back(c);
-        c = ((qbuf[2] << 6) & 0xc0) | qbuf[3];
-        if (qlen >= 4) {
-          result->push_back(c);
-          c = 0;
-        }
-      }
-    }
-    if (qlen < 4) {
-      if ((DO_TERM_ANY != term_flags) && (0 != c)) {
-        success = false;  // unused bits
-      }
-      if ((DO_PAD_YES == pad_flags) && !padded) {
-        success = false;  // expected padding
-      }
-      break;
-    }
-  }
-  if ((DO_TERM_BUFFER == term_flags) && (dpos != len)) {
-    success = false;  // unused chars
-  }
-  if (data_used) {
-    *data_used = dpos;
-  }
-  return success;
-}
-
-}  // namespace rtc
diff --git a/rtc_base/base64.h b/rtc_base/base64.h
deleted file mode 100644
index 80f65c1..0000000
--- a/rtc_base/base64.h
+++ /dev/null
@@ -1,123 +0,0 @@
-
-//*********************************************************************
-//* C_Base64 - a simple base64 encoder and decoder.
-//*
-//*     Copyright (c) 1999, Bob Withers - bwit@pobox.com
-//*
-//* This code may be freely used for any purpose, either personal
-//* or commercial, provided the authors copyright notice remains
-//* intact.
-//*********************************************************************
-
-#ifndef WEBRTC_RTC_BASE_BASE64_H_
-#define WEBRTC_RTC_BASE_BASE64_H_
-
-#include <string>
-#include <vector>
-
-namespace rtc {
-
-class Base64 {
- public:
-  enum DecodeOption {
-    DO_PARSE_STRICT = 1,  // Parse only base64 characters
-    DO_PARSE_WHITE = 2,   // Parse only base64 and whitespace characters
-    DO_PARSE_ANY = 3,     // Parse all characters
-    DO_PARSE_MASK = 3,
-
-    DO_PAD_YES = 4,  // Padding is required
-    DO_PAD_ANY = 8,  // Padding is optional
-    DO_PAD_NO = 12,  // Padding is disallowed
-    DO_PAD_MASK = 12,
-
-    DO_TERM_BUFFER = 16,  // Must termiante at end of buffer
-    DO_TERM_CHAR = 32,    // May terminate at any character boundary
-    DO_TERM_ANY = 48,     // May terminate at a sub-character bit offset
-    DO_TERM_MASK = 48,
-
-    // Strictest interpretation
-    DO_STRICT = DO_PARSE_STRICT | DO_PAD_YES | DO_TERM_BUFFER,
-
-    DO_LAX = DO_PARSE_ANY | DO_PAD_ANY | DO_TERM_CHAR,
-  };
-  typedef int DecodeFlags;
-
-  static bool IsBase64Char(char ch);
-
-  // Get the char next to the |ch| from the Base64Table.
-  // If the |ch| is the last one in the Base64Table then returns
-  // the first one from the table.
-  // Expects the |ch| be a base64 char.
-  // The result will be saved in |next_ch|.
-  // Returns true on success.
-  static bool GetNextBase64Char(char ch, char* next_ch);
-
-  // Determines whether the given string consists entirely of valid base64
-  // encoded characters.
-  static bool IsBase64Encoded(const std::string& str);
-
-  static void EncodeFromArray(const void* data,
-                              size_t len,
-                              std::string* result);
-  static bool DecodeFromArray(const char* data,
-                              size_t len,
-                              DecodeFlags flags,
-                              std::string* result,
-                              size_t* data_used);
-  static bool DecodeFromArray(const char* data,
-                              size_t len,
-                              DecodeFlags flags,
-                              std::vector<char>* result,
-                              size_t* data_used);
-  static bool DecodeFromArray(const char* data,
-                              size_t len,
-                              DecodeFlags flags,
-                              std::vector<uint8_t>* result,
-                              size_t* data_used);
-
-  // Convenience Methods
-  static inline std::string Encode(const std::string& data) {
-    std::string result;
-    EncodeFromArray(data.data(), data.size(), &result);
-    return result;
-  }
-  static inline std::string Decode(const std::string& data, DecodeFlags flags) {
-    std::string result;
-    DecodeFromArray(data.data(), data.size(), flags, &result, nullptr);
-    return result;
-  }
-  static inline bool Decode(const std::string& data,
-                            DecodeFlags flags,
-                            std::string* result,
-                            size_t* data_used) {
-    return DecodeFromArray(data.data(), data.size(), flags, result, data_used);
-  }
-  static inline bool Decode(const std::string& data,
-                            DecodeFlags flags,
-                            std::vector<char>* result,
-                            size_t* data_used) {
-    return DecodeFromArray(data.data(), data.size(), flags, result, data_used);
-  }
-
- private:
-  static const char Base64Table[];
-  static const unsigned char DecodeTable[];
-
-  static size_t GetNextQuantum(DecodeFlags parse_flags,
-                               bool illegal_pads,
-                               const char* data,
-                               size_t len,
-                               size_t* dpos,
-                               unsigned char qbuf[4],
-                               bool* padded);
-  template <typename T>
-  static bool DecodeFromArrayTemplate(const char* data,
-                                      size_t len,
-                                      DecodeFlags flags,
-                                      T* result,
-                                      size_t* data_used);
-};
-
-}  // namespace rtc
-
-#endif  // WEBRTC_RTC_BASE_BASE64_H_
diff --git a/rtc_base/base64_unittest.cc b/rtc_base/base64_unittest.cc
deleted file mode 100644
index c418c6f..0000000
--- a/rtc_base/base64_unittest.cc
+++ /dev/null
@@ -1,999 +0,0 @@
-/*
- *  Copyright 2011 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/rtc_base/base64.h"
-#include "webrtc/rtc_base/gunit.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/stringutils.h"
-
-#include "webrtc/rtc_base/testbase64.h"
-
-using namespace std;
-using namespace rtc;
-
-static struct {
-  size_t plain_length;
-  const char* plaintext;
-  const char* cyphertext;
-} base64_tests[] = {
-
-  // Basic bit patterns;
-  // values obtained with "echo -n '...' | uuencode -m test"
-
-  { 1, "\000", "AA==" },
-  { 1, "\001", "AQ==" },
-  { 1, "\002", "Ag==" },
-  { 1, "\004", "BA==" },
-  { 1, "\010", "CA==" },
-  { 1, "\020", "EA==" },
-  { 1, "\040", "IA==" },
-  { 1, "\100", "QA==" },
-  { 1, "\200", "gA==" },
-
-  { 1, "\377", "/w==" },
-  { 1, "\376", "/g==" },
-  { 1, "\375", "/Q==" },
-  { 1, "\373", "+w==" },
-  { 1, "\367", "9w==" },
-  { 1, "\357", "7w==" },
-  { 1, "\337", "3w==" },
-  { 1, "\277", "vw==" },
-  { 1, "\177", "fw==" },
-  { 2, "\000\000", "AAA=" },
-  { 2, "\000\001", "AAE=" },
-  { 2, "\000\002", "AAI=" },
-  { 2, "\000\004", "AAQ=" },
-  { 2, "\000\010", "AAg=" },
-  { 2, "\000\020", "ABA=" },
-  { 2, "\000\040", "ACA=" },
-  { 2, "\000\100", "AEA=" },
-  { 2, "\000\200", "AIA=" },
-  { 2, "\001\000", "AQA=" },
-  { 2, "\002\000", "AgA=" },
-  { 2, "\004\000", "BAA=" },
-  { 2, "\010\000", "CAA=" },
-  { 2, "\020\000", "EAA=" },
-  { 2, "\040\000", "IAA=" },
-  { 2, "\100\000", "QAA=" },
-  { 2, "\200\000", "gAA=" },
-
-  { 2, "\377\377", "//8=" },
-  { 2, "\377\376", "//4=" },
-  { 2, "\377\375", "//0=" },
-  { 2, "\377\373", "//s=" },
-  { 2, "\377\367", "//c=" },
-  { 2, "\377\357", "/+8=" },
-  { 2, "\377\337", "/98=" },
-  { 2, "\377\277", "/78=" },
-  { 2, "\377\177", "/38=" },
-  { 2, "\376\377", "/v8=" },
-  { 2, "\375\377", "/f8=" },
-  { 2, "\373\377", "+/8=" },
-  { 2, "\367\377", "9/8=" },
-  { 2, "\357\377", "7/8=" },
-  { 2, "\337\377", "3/8=" },
-  { 2, "\277\377", "v/8=" },
-  { 2, "\177\377", "f/8=" },
-
-  { 3, "\000\000\000", "AAAA" },
-  { 3, "\000\000\001", "AAAB" },
-  { 3, "\000\000\002", "AAAC" },
-  { 3, "\000\000\004", "AAAE" },
-  { 3, "\000\000\010", "AAAI" },
-  { 3, "\000\000\020", "AAAQ" },
-  { 3, "\000\000\040", "AAAg" },
-  { 3, "\000\000\100", "AABA" },
-  { 3, "\000\000\200", "AACA" },
-  { 3, "\000\001\000", "AAEA" },
-  { 3, "\000\002\000", "AAIA" },
-  { 3, "\000\004\000", "AAQA" },
-  { 3, "\000\010\000", "AAgA" },
-  { 3, "\000\020\000", "ABAA" },
-  { 3, "\000\040\000", "ACAA" },
-  { 3, "\000\100\000", "AEAA" },
-  { 3, "\000\200\000", "AIAA" },
-  { 3, "\001\000\000", "AQAA" },
-  { 3, "\002\000\000", "AgAA" },
-  { 3, "\004\000\000", "BAAA" },
-  { 3, "\010\000\000", "CAAA" },
-  { 3, "\020\000\000", "EAAA" },
-  { 3, "\040\000\000", "IAAA" },
-  { 3, "\100\000\000", "QAAA" },
-  { 3, "\200\000\000", "gAAA" },
-
-  { 3, "\377\377\377", "////" },
-  { 3, "\377\377\376", "///+" },
-  { 3, "\377\377\375", "///9" },
-  { 3, "\377\377\373", "///7" },
-  { 3, "\377\377\367", "///3" },
-  { 3, "\377\377\357", "///v" },
-  { 3, "\377\377\337", "///f" },
-  { 3, "\377\377\277", "//+/" },
-  { 3, "\377\377\177", "//9/" },
-  { 3, "\377\376\377", "//7/" },
-  { 3, "\377\375\377", "//3/" },
-  { 3, "\377\373\377", "//v/" },
-  { 3, "\377\367\377", "//f/" },
-  { 3, "\377\357\377", "/+//" },
-  { 3, "\377\337\377", "/9//" },
-  { 3, "\377\277\377", "/7//" },
-  { 3, "\377\177\377", "/3//" },
-  { 3, "\376\377\377", "/v//" },
-  { 3, "\375\377\377", "/f//" },
-  { 3, "\373\377\377", "+///" },
-  { 3, "\367\377\377", "9///" },
-  { 3, "\357\377\377", "7///" },
-  { 3, "\337\377\377", "3///" },
-  { 3, "\277\377\377", "v///" },
-  { 3, "\177\377\377", "f///" },
-
-  // Random numbers: values obtained with
-  //
-  //  #! /bin/bash
-  //  dd bs=$1 count=1 if=/dev/random of=/tmp/bar.random
-  //  od -N $1 -t o1 /tmp/bar.random
-  //  uuencode -m test < /tmp/bar.random
-  //
-  // where $1 is the number of bytes (2, 3)
-
-  { 2, "\243\361", "o/E=" },
-  { 2, "\024\167", "FHc=" },
-  { 2, "\313\252", "y6o=" },
-  { 2, "\046\041", "JiE=" },
-  { 2, "\145\236", "ZZ4=" },
-  { 2, "\254\325", "rNU=" },
-  { 2, "\061\330", "Mdg=" },
-  { 2, "\245\032", "pRo=" },
-  { 2, "\006\000", "BgA=" },
-  { 2, "\375\131", "/Vk=" },
-  { 2, "\303\210", "w4g=" },
-  { 2, "\040\037", "IB8=" },
-  { 2, "\261\372", "sfo=" },
-  { 2, "\335\014", "3Qw=" },
-  { 2, "\233\217", "m48=" },
-  { 2, "\373\056", "+y4=" },
-  { 2, "\247\232", "p5o=" },
-  { 2, "\107\053", "Rys=" },
-  { 2, "\204\077", "hD8=" },
-  { 2, "\276\211", "vok=" },
-  { 2, "\313\110", "y0g=" },
-  { 2, "\363\376", "8/4=" },
-  { 2, "\251\234", "qZw=" },
-  { 2, "\103\262", "Q7I=" },
-  { 2, "\142\312", "Yso=" },
-  { 2, "\067\211", "N4k=" },
-  { 2, "\220\001", "kAE=" },
-  { 2, "\152\240", "aqA=" },
-  { 2, "\367\061", "9zE=" },
-  { 2, "\133\255", "W60=" },
-  { 2, "\176\035", "fh0=" },
-  { 2, "\032\231", "Gpk=" },
-
-  { 3, "\013\007\144", "Cwdk" },
-  { 3, "\030\112\106", "GEpG" },
-  { 3, "\047\325\046", "J9Um" },
-  { 3, "\310\160\022", "yHAS" },
-  { 3, "\131\100\237", "WUCf" },
-  { 3, "\064\342\134", "NOJc" },
-  { 3, "\010\177\004", "CH8E" },
-  { 3, "\345\147\205", "5WeF" },
-  { 3, "\300\343\360", "wOPw" },
-  { 3, "\061\240\201", "MaCB" },
-  { 3, "\225\333\044", "ldsk" },
-  { 3, "\215\137\352", "jV/q" },
-  { 3, "\371\147\160", "+Wdw" },
-  { 3, "\030\320\051", "GNAp" },
-  { 3, "\044\174\241", "JHyh" },
-  { 3, "\260\127\037", "sFcf" },
-  { 3, "\111\045\033", "SSUb" },
-  { 3, "\202\114\107", "gkxH" },
-  { 3, "\057\371\042", "L/ki" },
-  { 3, "\223\247\244", "k6ek" },
-  { 3, "\047\216\144", "J45k" },
-  { 3, "\203\070\327", "gzjX" },
-  { 3, "\247\140\072", "p2A6" },
-  { 3, "\124\115\116", "VE1O" },
-  { 3, "\157\162\050", "b3Io" },
-  { 3, "\357\223\004", "75ME" },
-  { 3, "\052\117\156", "Kk9u" },
-  { 3, "\347\154\000", "52wA" },
-  { 3, "\303\012\142", "wwpi" },
-  { 3, "\060\035\362", "MB3y" },
-  { 3, "\130\226\361", "WJbx" },
-  { 3, "\173\013\071", "ews5" },
-  { 3, "\336\004\027", "3gQX" },
-  { 3, "\357\366\234", "7/ac" },
-  { 3, "\353\304\111", "68RJ" },
-  { 3, "\024\264\131", "FLRZ" },
-  { 3, "\075\114\251", "PUyp" },
-  { 3, "\315\031\225", "zRmV" },
-  { 3, "\154\201\276", "bIG+" },
-  { 3, "\200\066\072", "gDY6" },
-  { 3, "\142\350\267", "Yui3" },
-  { 3, "\033\000\166", "GwB2" },
-  { 3, "\210\055\077", "iC0/" },
-  { 3, "\341\037\124", "4R9U" },
-  { 3, "\161\103\152", "cUNq" },
-  { 3, "\270\142\131", "uGJZ" },
-  { 3, "\337\076\074", "3z48" },
-  { 3, "\375\106\362", "/Uby" },
-  { 3, "\227\301\127", "l8FX" },
-  { 3, "\340\002\234", "4AKc" },
-  { 3, "\121\064\033", "UTQb" },
-  { 3, "\157\134\143", "b1xj" },
-  { 3, "\247\055\327", "py3X" },
-  { 3, "\340\142\005", "4GIF" },
-  { 3, "\060\260\143", "MLBj" },
-  { 3, "\075\203\170", "PYN4" },
-  { 3, "\143\160\016", "Y3AO" },
-  { 3, "\313\013\063", "ywsz" },
-  { 3, "\174\236\135", "fJ5d" },
-  { 3, "\103\047\026", "QycW" },
-  { 3, "\365\005\343", "9QXj" },
-  { 3, "\271\160\223", "uXCT" },
-  { 3, "\362\255\172", "8q16" },
-  { 3, "\113\012\015", "SwoN" },
-
-  // various lengths, generated by this python script:
-  //
-  // from string import lowercase as lc
-  // for i in range(27):
-  //   print '{ %2d, "%s",%s "%s" },' % (i, lc[:i], ' ' * (26-i),
-  //                                     lc[:i].encode('base64').strip())
-
-  {  0, "abcdefghijklmnopqrstuvwxyz", "" },
-  {  1, "abcdefghijklmnopqrstuvwxyz", "YQ==" },
-  {  2, "abcdefghijklmnopqrstuvwxyz", "YWI=" },
-  {  3, "abcdefghijklmnopqrstuvwxyz", "YWJj" },
-  {  4, "abcdefghijklmnopqrstuvwxyz", "YWJjZA==" },
-  {  5, "abcdefghijklmnopqrstuvwxyz", "YWJjZGU=" },
-  {  6, "abcdefghijklmnopqrstuvwxyz", "YWJjZGVm" },
-  {  7, "abcdefghijklmnopqrstuvwxyz", "YWJjZGVmZw==" },
-  {  8, "abcdefghijklmnopqrstuvwxyz", "YWJjZGVmZ2g=" },
-  {  9, "abcdefghijklmnopqrstuvwxyz", "YWJjZGVmZ2hp" },
-  { 10, "abcdefghijklmnopqrstuvwxyz", "YWJjZGVmZ2hpag==" },
-  { 11, "abcdefghijklmnopqrstuvwxyz", "YWJjZGVmZ2hpams=" },
-  { 12, "abcdefghijklmnopqrstuvwxyz", "YWJjZGVmZ2hpamts" },
-  { 13, "abcdefghijklmnopqrstuvwxyz", "YWJjZGVmZ2hpamtsbQ==" },
-  { 14, "abcdefghijklmnopqrstuvwxyz", "YWJjZGVmZ2hpamtsbW4=" },
-  { 15, "abcdefghijklmnopqrstuvwxyz", "YWJjZGVmZ2hpamtsbW5v" },
-  { 16, "abcdefghijklmnopqrstuvwxyz", "YWJjZGVmZ2hpamtsbW5vcA==" },
-  { 17, "abcdefghijklmnopqrstuvwxyz", "YWJjZGVmZ2hpamtsbW5vcHE=" },
-  { 18, "abcdefghijklmnopqrstuvwxyz", "YWJjZGVmZ2hpamtsbW5vcHFy" },
-  { 19, "abcdefghijklmnopqrstuvwxyz", "YWJjZGVmZ2hpamtsbW5vcHFycw==" },
-  { 20, "abcdefghijklmnopqrstuvwxyz", "YWJjZGVmZ2hpamtsbW5vcHFyc3Q=" },
-  { 21, "abcdefghijklmnopqrstuvwxyz", "YWJjZGVmZ2hpamtsbW5vcHFyc3R1" },
-  { 22, "abcdefghijklmnopqrstuvwxyz", "YWJjZGVmZ2hpamtsbW5vcHFyc3R1dg==" },
-  { 23, "abcdefghijklmnopqrstuvwxyz", "YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnc=" },
-  { 24, "abcdefghijklmnopqrstuvwxyz", "YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4" },
-  { 25, "abcdefghijklmnopqrstuvwxy",  "YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eQ==" },
-  { 26, "abcdefghijklmnopqrstuvwxyz", "YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXo=" },
-};
-#if 0
-static struct {
-  const char* plaintext;
-  const char* cyphertext;
-} base64_strings[] = {
-
-  // The first few Google quotes
-  // Cyphertext created with "uuencode - GNU sharutils 4.2.1"
-  {
-    "Everyone!  We're teetering on the brink of disaster."
-    " - Sergey Brin, 6/24/99, regarding the company's state "
-    "after the unleashing of Netscape/Google search",
-
-    "RXZlcnlvbmUhICBXZSdyZSB0ZWV0ZXJpbmcgb24gdGhlIGJyaW5rIG9mIGRp"
-    "c2FzdGVyLiAtIFNlcmdleSBCcmluLCA2LzI0Lzk5LCByZWdhcmRpbmcgdGhl"
-    "IGNvbXBhbnkncyBzdGF0ZSBhZnRlciB0aGUgdW5sZWFzaGluZyBvZiBOZXRz"
-    "Y2FwZS9Hb29nbGUgc2VhcmNo" },
-
-  {
-    "I'm not sure why we're still alive, but we seem to be."
-    " - Larry Page, 6/24/99, while hiding in the kitchenette "
-    "during the Netscape traffic overflow",
-
-    "SSdtIG5vdCBzdXJlIHdoeSB3ZSdyZSBzdGlsbCBhbGl2ZSwgYnV0IHdlIHNl"
-    "ZW0gdG8gYmUuIC0gTGFycnkgUGFnZSwgNi8yNC85OSwgd2hpbGUgaGlkaW5n"
-    "IGluIHRoZSBraXRjaGVuZXR0ZSBkdXJpbmcgdGhlIE5ldHNjYXBlIHRyYWZm"
-    "aWMgb3ZlcmZsb3c" },
-
-  {
-    "I think kids want porn."
-    " - Sergey Brin, 6/99, on why Google shouldn't prioritize a "
-    "filtered search for children and families",
-
-    "SSB0aGluayBraWRzIHdhbnQgcG9ybi4gLSBTZXJnZXkgQnJpbiwgNi85OSwg"
-    "b24gd2h5IEdvb2dsZSBzaG91bGRuJ3QgcHJpb3JpdGl6ZSBhIGZpbHRlcmVk"
-    "IHNlYXJjaCBmb3IgY2hpbGRyZW4gYW5kIGZhbWlsaWVz" },
-};
-#endif
-// Compare bytes 0..len-1 of x and y.  If not equal, abort with verbose error
-// message showing position and numeric value that differed.
-// Handles embedded nulls just like any other byte.
-// Only added because string.compare() in gcc-3.3.3 seems to misbehave with
-// embedded nulls.
-// TODO: switch back to string.compare() if/when gcc is fixed
-#define EXPECT_EQ_ARRAY(len, x, y, msg)                      \
-  for (size_t j = 0; j < len; ++j) {                           \
-    if (x[j] != y[j]) {                                     \
-        LOG(LS_ERROR) << "" # x << " != " # y                  \
-                   << " byte " << j << " msg: " << msg;     \
-      }                                                     \
-    }
-
-size_t Base64Escape(const unsigned char *src, size_t szsrc, char *dest,
-                    size_t szdest) {
-  std::string escaped;
-  Base64::EncodeFromArray((const char *)src, szsrc, &escaped);
-  memcpy(dest, escaped.data(), min(escaped.size(), szdest));
-  return escaped.size();
-}
-
-size_t Base64Unescape(const char *src, size_t szsrc, char *dest,
-                      size_t szdest) {
-  std::string unescaped;
-  EXPECT_TRUE(
-      Base64::DecodeFromArray(src, szsrc, Base64::DO_LAX, &unescaped, nullptr));
-  memcpy(dest, unescaped.data(), min(unescaped.size(), szdest));
-  return unescaped.size();
-}
-
-size_t Base64Unescape(const char *src, size_t szsrc, std::string *s) {
-  EXPECT_TRUE(Base64::DecodeFromArray(src, szsrc, Base64::DO_LAX, s, nullptr));
-  return s->size();
-}
-
-TEST(Base64, EncodeDecodeBattery) {
-  LOG(LS_VERBOSE) << "Testing base-64";
-
-  size_t i;
-
-  // Check the short strings; this tests the math (and boundaries)
-  for( i = 0; i < sizeof(base64_tests) / sizeof(base64_tests[0]); ++i ) {
-    char encode_buffer[100];
-    size_t encode_length;
-    char decode_buffer[100];
-    size_t decode_length;
-    size_t cypher_length;
-
-    LOG(LS_VERBOSE) << "B64: " << base64_tests[i].cyphertext;
-
-    const unsigned char* unsigned_plaintext =
-      reinterpret_cast<const unsigned char*>(base64_tests[i].plaintext);
-
-    cypher_length = strlen(base64_tests[i].cyphertext);
-
-    // The basic escape function:
-    memset(encode_buffer, 0, sizeof(encode_buffer));
-    encode_length = Base64Escape(unsigned_plaintext,
-                                 base64_tests[i].plain_length,
-                                 encode_buffer,
-                                 sizeof(encode_buffer));
-    //    Is it of the expected length?
-    EXPECT_EQ(encode_length, cypher_length);
-
-    //    Is it the expected encoded value?
-    EXPECT_STREQ(encode_buffer, base64_tests[i].cyphertext);
-
-    // If we encode it into a buffer of exactly the right length...
-    memset(encode_buffer, 0, sizeof(encode_buffer));
-    encode_length = Base64Escape(unsigned_plaintext,
-                                 base64_tests[i].plain_length,
-                                 encode_buffer,
-                                 cypher_length);
-    //    Is it still of the expected length?
-    EXPECT_EQ(encode_length, cypher_length);
-
-    //    And is the value still correct?  (i.e., not losing the last byte)
-    EXPECT_STREQ(encode_buffer, base64_tests[i].cyphertext);
-
-    // If we decode it back:
-    memset(decode_buffer, 0, sizeof(decode_buffer));
-    decode_length = Base64Unescape(encode_buffer,
-                                   cypher_length,
-                                   decode_buffer,
-                                   sizeof(decode_buffer));
-
-    //    Is it of the expected length?
-    EXPECT_EQ(decode_length, base64_tests[i].plain_length);
-
-    //    Is it the expected decoded value?
-    EXPECT_EQ(0,  memcmp(decode_buffer, base64_tests[i].plaintext, decode_length));
-
-    // Our decoder treats the padding '=' characters at the end as
-    // optional.  If encode_buffer has any, run some additional
-    // tests that fiddle with them.
-    char* first_equals = strchr(encode_buffer, '=');
-    if (first_equals) {
-      // How many equals signs does the string start with?
-      int equals = (*(first_equals+1) == '=') ? 2 : 1;
-
-      // Try chopping off the equals sign(s) entirely.  The decoder
-      // should still be okay with this.
-      std::string decoded2("this junk should also be ignored");
-      *first_equals = '\0';
-      EXPECT_NE(0U, Base64Unescape(encode_buffer, first_equals-encode_buffer,
-                           &decoded2));
-      EXPECT_EQ(decoded2.size(), base64_tests[i].plain_length);
-      EXPECT_EQ_ARRAY(decoded2.size(), decoded2.data(), base64_tests[i].plaintext, i);
-
-      size_t len;
-
-      // try putting some extra stuff after the equals signs, or in between them
-      if (equals == 2) {
-        sprintfn(first_equals, 6, " = = ");
-        len = first_equals - encode_buffer + 5;
-      } else {
-        sprintfn(first_equals, 6, " = ");
-        len = first_equals - encode_buffer + 3;
-      }
-      decoded2.assign("this junk should be ignored");
-      EXPECT_NE(0U, Base64Unescape(encode_buffer, len, &decoded2));
-      EXPECT_EQ(decoded2.size(), base64_tests[i].plain_length);
-      EXPECT_EQ_ARRAY(decoded2.size(), decoded2, base64_tests[i].plaintext, i);
-    }
-  }
-}
-
-// here's a weird case: a giant base64 encoded stream which broke our base64
-// decoding.  Let's test it explicitly.
-const char SpecificTest[] =
-  "/9j/4AAQSkZJRgABAgEASABIAAD/4Q0HRXhpZgAATU0AKgAAAAgADAEOAAIAAAAgAAAAngEPAAI\n"
-  "AAAAFAAAAvgEQAAIAAAAJAAAAwwESAAMAAAABAAEAAAEaAAUAAAABAAAAzAEbAAUAAAABAAAA1A\n"
-  "EoAAMAAAABAAIAAAExAAIAAAAUAAAA3AEyAAIAAAAUAAAA8AE8AAIAAAAQAAABBAITAAMAAAABA\n"
-  "AIAAIdpAAQAAAABAAABFAAAAsQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgAFNPTlkA\n"
-  "RFNDLVAyMDAAAAAASAAAAAEAAABIAAAAAUFkb2JlIFBob3Rvc2hvcCA3LjAAMjAwNzowMTozMCA\n"
-  "yMzoxMDowNABNYWMgT1MgWCAxMC40LjgAAByCmgAFAAAAAQAAAmqCnQAFAAAAAQAAAnKIIgADAA\n"
-  "AAAQACAACIJwADAAAAAQBkAACQAAAHAAAABDAyMjCQAwACAAAAFAAAAnqQBAACAAAAFAAAAo6RA\n"
-  "QAHAAAABAECAwCRAgAFAAAAAQAAAqKSBAAKAAAAAQAAAqqSBQAFAAAAAQAAArKSBwADAAAAAQAF\n"
-  "AACSCAADAAAAAQAAAACSCQADAAAAAQAPAACSCgAFAAAAAQAAArqgAAAHAAAABDAxMDCgAQADAAA\n"
-  "AAf//AACgAgAEAAAAAQAAAGSgAwAEAAAAAQAAAGSjAAAHAAAAAQMAAACjAQAHAAAAAQEAAACkAQ\n"
-  "ADAAAAAQAAAACkAgADAAAAAQAAAACkAwADAAAAAQAAAACkBgADAAAAAQAAAACkCAADAAAAAQAAA\n"
-  "ACkCQADAAAAAQAAAACkCgADAAAAAQAAAAAAAAAAAAAACgAAAZAAAAAcAAAACjIwMDc6MDE6MjAg\n"
-  "MjM6MDU6NTIAMjAwNzowMToyMCAyMzowNTo1MgAAAAAIAAAAAQAAAAAAAAAKAAAAMAAAABAAAAB\n"
-  "PAAAACgAAAAYBAwADAAAAAQAGAAABGgAFAAAAAQAAAxIBGwAFAAAAAQAAAxoBKAADAAAAAQACAA\n"
-  "ACAQAEAAAAAQAAAyICAgAEAAAAAQAACd0AAAAAAAAASAAAAAEAAABIAAAAAf/Y/+AAEEpGSUYAA\n"
-  "QIBAEgASAAA/+0ADEFkb2JlX0NNAAL/7gAOQWRvYmUAZIAAAAAB/9sAhAAMCAgICQgMCQkMEQsK\n"
-  "CxEVDwwMDxUYExMVExMYEQwMDAwMDBEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAQ0LCw0\n"
-  "ODRAODhAUDg4OFBQODg4OFBEMDAwMDBERDAwMDAwMEQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA\n"
-  "wMDAz/wAARCABkAGQDASIAAhEBAxEB/90ABAAH/8QBPwAAAQUBAQEBAQEAAAAAAAAAAwABAgQFB\n"
-  "gcICQoLAQABBQEBAQEBAQAAAAAAAAABAAIDBAUGBwgJCgsQAAEEAQMCBAIFBwYIBQMMMwEAAhED\n"
-  "BCESMQVBUWETInGBMgYUkaGxQiMkFVLBYjM0coLRQwclklPw4fFjczUWorKDJkSTVGRFwqN0Nhf\n"
-  "SVeJl8rOEw9N14/NGJ5SkhbSVxNTk9KW1xdXl9VZmdoaWprbG1ub2N0dXZ3eHl6e3x9fn9xEAAg\n"
-  "IBAgQEAwQFBgcHBgU1AQACEQMhMRIEQVFhcSITBTKBkRShsUIjwVLR8DMkYuFygpJDUxVjczTxJ\n"
-  "QYWorKDByY1wtJEk1SjF2RFVTZ0ZeLys4TD03Xj80aUpIW0lcTU5PSltcXV5fVWZnaGlqa2xtbm\n"
-  "9ic3R1dnd4eXp7fH/9oADAMBAAIRAxEAPwDy7bKNTUXNLz9EaJPDWMjxH4ozhtpYwaACT8ShaaW\n"
-  "bW0uEc9/JFfjj0Q4Hk/PRDxwX7y47W9z/AN9Cv4+O3ILK2DcRqT2CaSvEbcl1Jbz37KG1dBldLo\n"
-  "qaS4l9xGjG9v6yoDAdYIaIjUk+AREgo4y5sapirb8Yl0NHHdKvBNm4yA1o5Pc+SPEFvCWqB3HZF\n"
-  "Hj2SbWQ/afGFP0bHP8ATY0uc4w1o1JPkkimGiS2KvqlnmBkOZQTyydzgPMM9v8A0lp4v1Nx9gF1\n"
-  "tpdqJaGtH/S3I0i3lISXW/8AMqnd/O2bfg2eUkqVYf/Q8zuncO4Bj7lZ+n7f5Mj5KsJcY8NUZ4d\n"
-  "uEDVo1HkeU0rg3Om4H2rabCWUN7DQuK1n5FWKW4uCwG92gDRJBS6exhxmMboQI+Cv4WFTQ42Bs2\n"
-  "fvnkkqEmy2YxoMMbpVzaz6jt+RbpHZs8lzkHqrasKkYOKP0jgDfZ4N/wDM1tNrcWfSPmRyq9uNV\n"
-  "DnFg2s97i7UkjxKVrq0eVz3spZsja+ASDzwsh9jnOk/JFzb3XZD3v1c4yT8UACTCniKDUnKz5Nj\n"
-  "G33XV1DV73BrT8dF23SejV4zg9g33cOsPb+SxVvqv9ViwNy8vS0iWs/daf8A0Y5dpTi1sADGxCR\n"
-  "K1o0YBEmInlXWYbDBcDLdPJXa8f71Yrx2jnUoAqLnfZK5hJaW2vdwEk5a/wD/0fN6Ia/e76IiVf\n"
-  "xavUL7CPpnT4LNbYXAVjuQt/AqDmNYO/Kjnoy4hr5J8SwMhrRMaeSvbsxrfUazcOw4UX0Cisem2\n"
-  "SBoD4+Kz8nC6llbSLCRrubJA8kwUWbUDa29X1PMa7aQWjuDC0MXMdbDbhI7eazBiUfZ6GOYRe1s\n"
-  "WvGgJ8Vbw2+m4Bx9s6JpNHuuGo1FF53r/SHYua61gLse0lzXeBP5rkvqx0o5vVWz7WY49QkiQSP\n"
-  "oN/tLoevW/ogxv0HA7tJ0AnhT+pdDGYVl/wCdcTPkGn2NU0JWNWvlgAbHV6fEqdu2gR/r2WlWwt\n"
-  "AA5VXAEsLXTqJafArQY5rRr9LiPBJiZsZCI1pJjxCi0j4oncSICSkWwzwkjeaSch//0vO7sP7Lm\n"
-  "enO9ogtd5FbPT3Q5pCpZVc4ld3Lmn3O8j9EI2BYdunKjOobMQIyI+rusc2wx4d0eutwGnHh/uQc\n"
-  "Ha7ladj6mVANGvcqOgz0Go7HJ12/GEHcwvB/dPY6ImbbaMaASGuIBjkN7qofs9Ubg9g7OI9p/t/\n"
-  "RTSmhTHr0v6eSz6UgCPP2/wAVu9Ex2V49dVY2iACB4BZeVXQ/AJ3gzGnnOi2+kACpru8flUsNmt\n"
-  "zHRf6xfWCnoeAfTh2ZaQKazx/Ke7+QxcKz61fWA2uuObaC4zGhaPJrXBL64ZFmR124O09ENraPK\n"
-  "N3/AH5GqxIrZVUyp2K2vfdkENsDnxuex9m4Ox9n82xSgNd9D+p/XR1npgseR9ppOy4Dx/NfH/CL\n"
-  "oQJGunmvMv8AFq3KHVcq3HkYQbD2nuSf0I/rMavSg6TLjLigQhJ7Z58v9QkmlsTOqSCn/9PzL7R\n"
-  "d6Qq3n0wZ2zotXpT9xLfFYvkr/S7jXeB8E0jRkhKpC3q8LcJ/kmCrTnkuAPCq4do9Q/ytVbuAeY\n"
-  "Gg5lQybQK+82GBqEQUA1kOHPYf3LLsoyN36G5w8iUfHxepbXE2l0cApALgLHzBq9UxhTXU5hMC1\n"
-  "ktnSCup6S4Ctk+C5XqVGcaHPfuiuHkeTTuWz0+9zaKiH6CC0/yXBSQ2a/MxojV57634rq+v2PLY\n"
-  "be1r2nsYG13/AFKxbfCBMcr0brGAzrGEwCG31ncx0SfBzf7S4+zoHUWWsJq3hz9oLfcBH77R9H+\n"
-  "0pA13u/qPgDp/Q6ri39JlfpXkDx+h/msWn1L6wdO6bSbcrIbU2Q0xLnSe21kuVejJspbVS5+4bd\n"
-  "ocBAkD/orG+tP1ar67Wy7GtZTm1SCXfRsb+a18fRe38x6SG3/44H1Z3f0y2I+l6DoSXD/8xPrDs\n"
-  "3enVu3bdnqN3R+//USSVo//1PLohhce+gRWS0Nsby3lRgFkKxQyW7SgUh3em5Tbq2uB9wWw1wey\n"
-  "J1XGV2XYdm5k7e4WzidXY9oMwo5RZ4T6Hd1ixwfp96PWbAJBVTHzK7O6Ky5oJB1HZMqmUEFlkGy\n"
-  "xpa4zI1Hkq31dy7bMN9BAc3HeWAnnbyxEycmuup1jiAGglZ31PyrmZ9tQg1WtNj54EHR3/S2qTH\n"
-  "1Yc5GgD1FFtzPdWGkd2AyflogZmRmsz6PSrbXbdo+txOrP337f3fzVo15DK2uyrTtqpBOnBKx6b\n"
-  "7MjJsz7tHWOAYP3WD6LU6cqGjFCNl1MmvLcxv6YtDTLSAqP27LrdtYHXFnJZI+Tp3MWg68OpDPv\n"
-  "UMUM2lkQBoouKQ6swjE9Nml+1sz1PW+z6xt27zuj+skrX2ZvqR5z8kkuOfdPt43/1fMm/grFG6f\n"
-  "Lss9JA7JG7tnZs/SfJUrfS3foJ9TvHCopJsV8nWx/t24bJn8Fo/5TjWJXMJIS+i+G36TsZ/7Q9P\n"
-  "8ATfzfeOFofVSZv2/zvt+O3X/v65dJPjt/BiyfN1/wn0zre79nVej/ADG8ep4x2/6Srjd6TdviF\n"
-  "52ko8m6/Ht9X1KnftEo+POwxzK8mSTF46vrH6T1/OEl5Okkl//Z/+0uHFBob3Rvc2hvcCAzLjAA\n"
-  "OEJJTQQEAAAAAAArHAIAAAIAAhwCeAAfICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAA\n"
-  "4QklNBCUAAAAAABD7Caa9B0wqNp2P4sxXqayFOEJJTQPqAAAAAB2wPD94bWwgdmVyc2lvbj0iMS\n"
-  "4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPCFET0NUWVBFIHBsaXN0IFBVQkxJQyAiLS8vQXBwbGUgQ\n"
-  "29tcHV0ZXIvL0RURCBQTElTVCAxLjAvL0VOIiAiaHR0cDovL3d3dy5hcHBsZS5jb20vRFREcy9Q\n"
-  "cm9wZXJ0eUxpc3QtMS4wLmR0ZCI+CjxwbGlzdCB2ZXJzaW9uPSIxLjAiPgo8ZGljdD4KCTxrZXk\n"
-  "+Y29tLmFwcGxlLnByaW50LlBhZ2VGb3JtYXQuUE1Ib3Jpem9udGFsUmVzPC9rZXk+Cgk8ZGljdD\n"
-  "4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCTxzdHJpbmc+Y\n"
-  "29tLmFwcGxlLnByaW50aW5nbWFuYWdlcjwvc3RyaW5nPgoJCTxrZXk+Y29tLmFwcGxlLnByaW50\n"
-  "LnRpY2tldC5pdGVtQXJyYXk8L2tleT4KCQk8YXJyYXk+CgkJCTxkaWN0PgoJCQkJPGtleT5jb20\n"
-  "uYXBwbGUucHJpbnQuUGFnZUZvcm1hdC5QTUhvcml6b250YWxSZXM8L2tleT4KCQkJCTxyZWFsPj\n"
-  "cyPC9yZWFsPgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNsaWVudDwva2V5PgoJC\n"
-  "QkJPHN0cmluZz5jb20uYXBwbGUucHJpbnRpbmdtYW5hZ2VyPC9zdHJpbmc+CgkJCQk8a2V5PmNv\n"
-  "bS5hcHBsZS5wcmludC50aWNrZXQubW9kRGF0ZTwva2V5PgoJCQkJPGRhdGU+MjAwNy0wMS0zMFQ\n"
-  "yMjowODo0MVo8L2RhdGU+CgkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuc3RhdGVGbG\n"
-  "FnPC9rZXk+CgkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgoJCQk8L2RpY3Q+CgkJPC9hcnJheT4KC\n"
-  "TwvZGljdD4KCTxrZXk+Y29tLmFwcGxlLnByaW50LlBhZ2VGb3JtYXQuUE1PcmllbnRhdGlvbjwv\n"
-  "a2V5PgoJPGRpY3Q+CgkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0b3I8L2tleT4\n"
-  "KCQk8c3RyaW5nPmNvbS5hcHBsZS5wcmludGluZ21hbmFnZXI8L3N0cmluZz4KCQk8a2V5PmNvbS\n"
-  "5hcHBsZS5wcmludC50aWNrZXQuaXRlbUFycmF5PC9rZXk+CgkJPGFycmF5PgoJCQk8ZGljdD4KC\n"
-  "QkJCTxrZXk+Y29tLmFwcGxlLnByaW50LlBhZ2VGb3JtYXQuUE1PcmllbnRhdGlvbjwva2V5PgoJ\n"
-  "CQkJPGludGVnZXI+MTwvaW50ZWdlcj4KCQkJCTxrZXk+Y29tLmFwcGxlLnByaW50LnRpY2tldC5\n"
-  "jbGllbnQ8L2tleT4KCQkJCTxzdHJpbmc+Y29tLmFwcGxlLnByaW50aW5nbWFuYWdlcjwvc3RyaW\n"
-  "5nPgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lm1vZERhdGU8L2tleT4KCQkJCTxkY\n"
-  "XRlPjIwMDctMDEtMzBUMjI6MDg6NDFaPC9kYXRlPgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQu\n"
-  "dGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJPGludGVnZXI+MDwvaW50ZWdlcj4KCQkJPC9kaWN\n"
-  "0PgoJCTwvYXJyYXk+Cgk8L2RpY3Q+Cgk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0Ll\n"
-  "BNU2NhbGluZzwva2V5PgoJPGRpY3Q+CgkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZ\n"
-  "WF0b3I8L2tleT4KCQk8c3RyaW5nPmNvbS5hcHBsZS5wcmludGluZ21hbmFnZXI8L3N0cmluZz4K\n"
-  "CQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuaXRlbUFycmF5PC9rZXk+CgkJPGFycmF5Pgo\n"
-  "JCQk8ZGljdD4KCQkJCTxrZXk+Y29tLmFwcGxlLnByaW50LlBhZ2VGb3JtYXQuUE1TY2FsaW5nPC\n"
-  "9rZXk+CgkJCQk8cmVhbD4xPC9yZWFsPgoJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0L\n"
-  "mNsaWVudDwva2V5PgoJCQkJPHN0cmluZz5jb20uYXBwbGUucHJpbnRpbmdtYW5hZ2VyPC9zdHJp\n"
-  "bmc+CgkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQubW9kRGF0ZTwva2V5PgoJCQkJPGR\n"
-  "hdGU+MjAwNy0wMS0zMFQyMjowODo0MVo8L2RhdGU+CgkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC\n"
-  "50aWNrZXQuc3RhdGVGbGFnPC9rZXk+CgkJCQk8aW50ZWdlcj4wPC9pbnRlZ2VyPgoJCQk8L2RpY\n"
-  "3Q+CgkJPC9hcnJheT4KCTwvZGljdD4KCTxrZXk+Y29tLmFwcGxlLnByaW50LlBhZ2VGb3JtYXQu\n"
-  "UE1WZXJ0aWNhbFJlczwva2V5PgoJPGRpY3Q+CgkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V\n"
-  "0LmNyZWF0b3I8L2tleT4KCQk8c3RyaW5nPmNvbS5hcHBsZS5wcmludGluZ21hbmFnZXI8L3N0cm\n"
-  "luZz4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuaXRlbUFycmF5PC9rZXk+CgkJPGFyc\n"
-  "mF5PgoJCQk8ZGljdD4KCQkJCTxrZXk+Y29tLmFwcGxlLnByaW50LlBhZ2VGb3JtYXQuUE1WZXJ0\n"
-  "aWNhbFJlczwva2V5PgoJCQkJPHJlYWw+NzI8L3JlYWw+CgkJCQk8a2V5PmNvbS5hcHBsZS5wcml\n"
-  "udC50aWNrZXQuY2xpZW50PC9rZXk+CgkJCQk8c3RyaW5nPmNvbS5hcHBsZS5wcmludGluZ21hbm\n"
-  "FnZXI8L3N0cmluZz4KCQkJCTxrZXk+Y29tLmFwcGxlLnByaW50LnRpY2tldC5tb2REYXRlPC9rZ\n"
-  "Xk+CgkJCQk8ZGF0ZT4yMDA3LTAxLTMwVDIyOjA4OjQxWjwvZGF0ZT4KCQkJCTxrZXk+Y29tLmFw\n"
-  "cGxlLnByaW50LnRpY2tldC5zdGF0ZUZsYWc8L2tleT4KCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI\n"
-  "+CgkJCTwvZGljdD4KCQk8L2FycmF5PgoJPC9kaWN0PgoJPGtleT5jb20uYXBwbGUucHJpbnQuUG\n"
-  "FnZUZvcm1hdC5QTVZlcnRpY2FsU2NhbGluZzwva2V5PgoJPGRpY3Q+CgkJPGtleT5jb20uYXBwb\n"
-  "GUucHJpbnQudGlja2V0LmNyZWF0b3I8L2tleT4KCQk8c3RyaW5nPmNvbS5hcHBsZS5wcmludGlu\n"
-  "Z21hbmFnZXI8L3N0cmluZz4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuaXRlbUFycmF\n"
-  "5PC9rZXk+CgkJPGFycmF5PgoJCQk8ZGljdD4KCQkJCTxrZXk+Y29tLmFwcGxlLnByaW50LlBhZ2\n"
-  "VGb3JtYXQuUE1WZXJ0aWNhbFNjYWxpbmc8L2tleT4KCQkJCTxyZWFsPjE8L3JlYWw+CgkJCQk8a\n"
-  "2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY2xpZW50PC9rZXk+CgkJCQk8c3RyaW5nPmNvbS5h\n"
-  "cHBsZS5wcmludGluZ21hbmFnZXI8L3N0cmluZz4KCQkJCTxrZXk+Y29tLmFwcGxlLnByaW50LnR\n"
-  "pY2tldC5tb2REYXRlPC9rZXk+CgkJCQk8ZGF0ZT4yMDA3LTAxLTMwVDIyOjA4OjQxWjwvZGF0ZT\n"
-  "4KCQkJCTxrZXk+Y29tLmFwcGxlLnByaW50LnRpY2tldC5zdGF0ZUZsYWc8L2tleT4KCQkJCTxpb\n"
-  "nRlZ2VyPjA8L2ludGVnZXI+CgkJCTwvZGljdD4KCQk8L2FycmF5PgoJPC9kaWN0PgoJPGtleT5j\n"
-  "b20uYXBwbGUucHJpbnQuc3ViVGlja2V0LnBhcGVyX2luZm9fdGlja2V0PC9rZXk+Cgk8ZGljdD4\n"
-  "KCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNQWRqdXN0ZWRQYWdlUmVjdDwva2\n"
-  "V5PgoJCTxkaWN0PgoJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY3JlYXRvcjwva2V5P\n"
-  "goJCQk8c3RyaW5nPmNvbS5hcHBsZS5wcmludGluZ21hbmFnZXI8L3N0cmluZz4KCQkJPGtleT5j\n"
-  "b20uYXBwbGUucHJpbnQudGlja2V0Lml0ZW1BcnJheTwva2V5PgoJCQk8YXJyYXk+CgkJCQk8ZGl\n"
-  "jdD4KCQkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYWdlRm9ybWF0LlBNQWRqdXN0ZWRQYWdlUm\n"
-  "VjdDwva2V5PgoJCQkJCTxhcnJheT4KCQkJCQkJPHJlYWw+MC4wPC9yZWFsPgoJCQkJCQk8cmVhb\n"
-  "D4wLjA8L3JlYWw+CgkJCQkJCTxyZWFsPjczNDwvcmVhbD4KCQkJCQkJPHJlYWw+NTc2PC9yZWFs\n"
-  "PgoJCQkJCTwvYXJyYXk+CgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNsaWVudDw\n"
-  "va2V5PgoJCQkJCTxzdHJpbmc+Y29tLmFwcGxlLnByaW50aW5nbWFuYWdlcjwvc3RyaW5nPgoJCQ\n"
-  "kJCTxrZXk+Y29tLmFwcGxlLnByaW50LnRpY2tldC5tb2REYXRlPC9rZXk+CgkJCQkJPGRhdGU+M\n"
-  "jAwNy0wMS0zMFQyMjowODo0MVo8L2RhdGU+CgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlj\n"
-  "a2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CgkJCQk8L2RpY3Q\n"
-  "+CgkJCTwvYXJyYXk+CgkJPC9kaWN0PgoJCTxrZXk+Y29tLmFwcGxlLnByaW50LlBhZ2VGb3JtYX\n"
-  "QuUE1BZGp1c3RlZFBhcGVyUmVjdDwva2V5PgoJCTxkaWN0PgoJCQk8a2V5PmNvbS5hcHBsZS5wc\n"
-  "mludC50aWNrZXQuY3JlYXRvcjwva2V5PgoJCQk8c3RyaW5nPmNvbS5hcHBsZS5wcmludGluZ21h\n"
-  "bmFnZXI8L3N0cmluZz4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0Lml0ZW1BcnJheTw\n"
-  "va2V5PgoJCQk8YXJyYXk+CgkJCQk8ZGljdD4KCQkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC5QYW\n"
-  "dlRm9ybWF0LlBNQWRqdXN0ZWRQYXBlclJlY3Q8L2tleT4KCQkJCQk8YXJyYXk+CgkJCQkJCTxyZ\n"
-  "WFsPi0xODwvcmVhbD4KCQkJCQkJPHJlYWw+LTE4PC9yZWFsPgoJCQkJCQk8cmVhbD43NzQ8L3Jl\n"
-  "YWw+CgkJCQkJCTxyZWFsPjU5NDwvcmVhbD4KCQkJCQk8L2FycmF5PgoJCQkJCTxrZXk+Y29tLmF\n"
-  "wcGxlLnByaW50LnRpY2tldC5jbGllbnQ8L2tleT4KCQkJCQk8c3RyaW5nPmNvbS5hcHBsZS5wcm\n"
-  "ludGluZ21hbmFnZXI8L3N0cmluZz4KCQkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQub\n"
-  "W9kRGF0ZTwva2V5PgoJCQkJCTxkYXRlPjIwMDctMDEtMzBUMjI6MDg6NDFaPC9kYXRlPgoJCQkJ\n"
-  "CTxrZXk+Y29tLmFwcGxlLnByaW50LnRpY2tldC5zdGF0ZUZsYWc8L2tleT4KCQkJCQk8aW50ZWd\n"
-  "lcj4wPC9pbnRlZ2VyPgoJCQkJPC9kaWN0PgoJCQk8L2FycmF5PgoJCTwvZGljdD4KCQk8a2V5Pm\n"
-  "NvbS5hcHBsZS5wcmludC5QYXBlckluZm8uUE1QYXBlck5hbWU8L2tleT4KCQk8ZGljdD4KCQkJP\n"
-  "GtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0b3I8L2tleT4KCQkJPHN0cmluZz5jb20u\n"
-  "YXBwbGUucHJpbnQucG0uUG9zdFNjcmlwdDwvc3RyaW5nPgoJCQk8a2V5PmNvbS5hcHBsZS5wcml\n"
-  "udC50aWNrZXQuaXRlbUFycmF5PC9rZXk+CgkJCTxhcnJheT4KCQkJCTxkaWN0PgoJCQkJCTxrZX\n"
-  "k+Y29tLmFwcGxlLnByaW50LlBhcGVySW5mby5QTVBhcGVyTmFtZTwva2V5PgoJCQkJCTxzdHJpb\n"
-  "mc+bmEtbGV0dGVyPC9zdHJpbmc+CgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNs\n"
-  "aWVudDwva2V5PgoJCQkJCTxzdHJpbmc+Y29tLmFwcGxlLnByaW50LnBtLlBvc3RTY3JpcHQ8L3N\n"
-  "0cmluZz4KCQkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQubW9kRGF0ZTwva2V5PgoJCQ\n"
-  "kJCTxkYXRlPjIwMDMtMDctMDFUMTc6NDk6MzZaPC9kYXRlPgoJCQkJCTxrZXk+Y29tLmFwcGxlL\n"
-  "nByaW50LnRpY2tldC5zdGF0ZUZsYWc8L2tleT4KCQkJCQk8aW50ZWdlcj4xPC9pbnRlZ2VyPgoJ\n"
-  "CQkJPC9kaWN0PgoJCQk8L2FycmF5PgoJCTwvZGljdD4KCQk8a2V5PmNvbS5hcHBsZS5wcmludC5\n"
-  "QYXBlckluZm8uUE1VbmFkanVzdGVkUGFnZVJlY3Q8L2tleT4KCQk8ZGljdD4KCQkJPGtleT5jb2\n"
-  "0uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0b3I8L2tleT4KCQkJPHN0cmluZz5jb20uYXBwbGUuc\n"
-  "HJpbnQucG0uUG9zdFNjcmlwdDwvc3RyaW5nPgoJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNr\n"
-  "ZXQuaXRlbUFycmF5PC9rZXk+CgkJCTxhcnJheT4KCQkJCTxkaWN0PgoJCQkJCTxrZXk+Y29tLmF\n"
-  "wcGxlLnByaW50LlBhcGVySW5mby5QTVVuYWRqdXN0ZWRQYWdlUmVjdDwva2V5PgoJCQkJCTxhcn\n"
-  "JheT4KCQkJCQkJPHJlYWw+MC4wPC9yZWFsPgoJCQkJCQk8cmVhbD4wLjA8L3JlYWw+CgkJCQkJC\n"
-  "TxyZWFsPjczNDwvcmVhbD4KCQkJCQkJPHJlYWw+NTc2PC9yZWFsPgoJCQkJCTwvYXJyYXk+CgkJ\n"
-  "CQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNsaWVudDwva2V5PgoJCQkJCTxzdHJpbmc\n"
-  "+Y29tLmFwcGxlLnByaW50aW5nbWFuYWdlcjwvc3RyaW5nPgoJCQkJCTxrZXk+Y29tLmFwcGxlLn\n"
-  "ByaW50LnRpY2tldC5tb2REYXRlPC9rZXk+CgkJCQkJPGRhdGU+MjAwNy0wMS0zMFQyMjowODo0M\n"
-  "Vo8L2RhdGU+CgkJCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LnN0YXRlRmxhZzwva2V5\n"
-  "PgoJCQkJCTxpbnRlZ2VyPjA8L2ludGVnZXI+CgkJCQk8L2RpY3Q+CgkJCTwvYXJyYXk+CgkJPC9\n"
-  "kaWN0PgoJCTxrZXk+Y29tLmFwcGxlLnByaW50LlBhcGVySW5mby5QTVVuYWRqdXN0ZWRQYXBlcl\n"
-  "JlY3Q8L2tleT4KCQk8ZGljdD4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V0LmNyZWF0b\n"
-  "3I8L2tleT4KCQkJPHN0cmluZz5jb20uYXBwbGUucHJpbnQucG0uUG9zdFNjcmlwdDwvc3RyaW5n\n"
-  "PgoJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuaXRlbUFycmF5PC9rZXk+CgkJCTxhcnJ\n"
-  "heT4KCQkJCTxkaWN0PgoJCQkJCTxrZXk+Y29tLmFwcGxlLnByaW50LlBhcGVySW5mby5QTVVuYW\n"
-  "RqdXN0ZWRQYXBlclJlY3Q8L2tleT4KCQkJCQk8YXJyYXk+CgkJCQkJCTxyZWFsPi0xODwvcmVhb\n"
-  "D4KCQkJCQkJPHJlYWw+LTE4PC9yZWFsPgoJCQkJCQk8cmVhbD43NzQ8L3JlYWw+CgkJCQkJCTxy\n"
-  "ZWFsPjU5NDwvcmVhbD4KCQkJCQk8L2FycmF5PgoJCQkJCTxrZXk+Y29tLmFwcGxlLnByaW50LnR\n"
-  "pY2tldC5jbGllbnQ8L2tleT4KCQkJCQk8c3RyaW5nPmNvbS5hcHBsZS5wcmludGluZ21hbmFnZX\n"
-  "I8L3N0cmluZz4KCQkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQubW9kRGF0ZTwva2V5P\n"
-  "goJCQkJCTxkYXRlPjIwMDctMDEtMzBUMjI6MDg6NDFaPC9kYXRlPgoJCQkJCTxrZXk+Y29tLmFw\n"
-  "cGxlLnByaW50LnRpY2tldC5zdGF0ZUZsYWc8L2tleT4KCQkJCQk8aW50ZWdlcj4wPC9pbnRlZ2V\n"
-  "yPgoJCQkJPC9kaWN0PgoJCQk8L2FycmF5PgoJCTwvZGljdD4KCQk8a2V5PmNvbS5hcHBsZS5wcm\n"
-  "ludC5QYXBlckluZm8ucHBkLlBNUGFwZXJOYW1lPC9rZXk+CgkJPGRpY3Q+CgkJCTxrZXk+Y29tL\n"
-  "mFwcGxlLnByaW50LnRpY2tldC5jcmVhdG9yPC9rZXk+CgkJCTxzdHJpbmc+Y29tLmFwcGxlLnBy\n"
-  "aW50LnBtLlBvc3RTY3JpcHQ8L3N0cmluZz4KCQkJPGtleT5jb20uYXBwbGUucHJpbnQudGlja2V\n"
-  "0Lml0ZW1BcnJheTwva2V5PgoJCQk8YXJyYXk+CgkJCQk8ZGljdD4KCQkJCQk8a2V5PmNvbS5hcH\n"
-  "BsZS5wcmludC5QYXBlckluZm8ucHBkLlBNUGFwZXJOYW1lPC9rZXk+CgkJCQkJPHN0cmluZz5VU\n"
-  "yBMZXR0ZXI8L3N0cmluZz4KCQkJCQk8a2V5PmNvbS5hcHBsZS5wcmludC50aWNrZXQuY2xpZW50\n"
-  "PC9rZXk+CgkJCQkJPHN0cmluZz5jb20uYXBwbGUucHJpbnQucG0uUG9zdFNjcmlwdDwvc3RyaW5\n"
-  "nPgoJCQkJCTxrZXk+Y29tLmFwcGxlLnByaW50LnRpY2tldC5tb2REYXRlPC9rZXk+CgkJCQkJPG\n"
-  "RhdGU+MjAwMy0wNy0wMVQxNzo0OTozNlo8L2RhdGU+CgkJCQkJPGtleT5jb20uYXBwbGUucHJpb\n"
-  "nQudGlja2V0LnN0YXRlRmxhZzwva2V5PgoJCQkJCTxpbnRlZ2VyPjE8L2ludGVnZXI+CgkJCQk8\n"
-  "L2RpY3Q+CgkJCTwvYXJyYXk+CgkJPC9kaWN0PgoJCTxrZXk+Y29tLmFwcGxlLnByaW50LnRpY2t\n"
-  "ldC5BUElWZXJzaW9uPC9rZXk+CgkJPHN0cmluZz4wMC4yMDwvc3RyaW5nPgoJCTxrZXk+Y29tLm\n"
-  "FwcGxlLnByaW50LnRpY2tldC5wcml2YXRlTG9jazwva2V5PgoJCTxmYWxzZS8+CgkJPGtleT5jb\n"
-  "20uYXBwbGUucHJpbnQudGlja2V0LnR5cGU8L2tleT4KCQk8c3RyaW5nPmNvbS5hcHBsZS5wcmlu\n"
-  "dC5QYXBlckluZm9UaWNrZXQ8L3N0cmluZz4KCTwvZGljdD4KCTxrZXk+Y29tLmFwcGxlLnByaW5\n"
-  "0LnRpY2tldC5BUElWZXJzaW9uPC9rZXk+Cgk8c3RyaW5nPjAwLjIwPC9zdHJpbmc+Cgk8a2V5Pm\n"
-  "NvbS5hcHBsZS5wcmludC50aWNrZXQucHJpdmF0ZUxvY2s8L2tleT4KCTxmYWxzZS8+Cgk8a2V5P\n"
-  "mNvbS5hcHBsZS5wcmludC50aWNrZXQudHlwZTwva2V5PgoJPHN0cmluZz5jb20uYXBwbGUucHJp\n"
-  "bnQuUGFnZUZvcm1hdFRpY2tldDwvc3RyaW5nPgo8L2RpY3Q+CjwvcGxpc3Q+CjhCSU0D6QAAAAA\n"
-  "AeAADAAAASABIAAAAAALeAkD/7v/uAwYCUgNnBSgD/AACAAAASABIAAAAAALYAigAAQAAAGQAAA\n"
-  "ABAAMDAwAAAAF//wABAAEAAAAAAAAAAAAAAABoCAAZAZAAAAAAACAAAAAAAAAAAAAAAAAAAAAAA\n"
-  "AAAAAAAAAAAADhCSU0D7QAAAAAAEABIAAAAAQABAEgAAAABAAE4QklNBCYAAAAAAA4AAAAAAAAA\n"
-  "AAAAP4AAADhCSU0EDQAAAAAABAAAAB44QklNBBkAAAAAAAQAAAAeOEJJTQPzAAAAAAAJAAAAAAA\n"
-  "AAAABADhCSU0ECgAAAAAAAQAAOEJJTScQAAAAAAAKAAEAAAAAAAAAAThCSU0D9QAAAAAASAAvZm\n"
-  "YAAQBsZmYABgAAAAAAAQAvZmYAAQChmZoABgAAAAAAAQAyAAAAAQBaAAAABgAAAAAAAQA1AAAAA\n"
-  "QAtAAAABgAAAAAAAThCSU0D+AAAAAAAcAAA/////////////////////////////wPoAAAAAP//\n"
-  "//////////////////////////8D6AAAAAD/////////////////////////////A+gAAAAA///\n"
-  "//////////////////////////wPoAAA4QklNBAgAAAAAABAAAAABAAACQAAAAkAAAAAAOEJJTQ\n"
-  "QeAAAAAAAEAAAAADhCSU0EGgAAAAADRQAAAAYAAAAAAAAAAAAAAGQAAABkAAAACABEAFMAQwAwA\n"
-  "DIAMwAyADUAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAGQAAABkAAAAAAAAAAAA\n"
-  "AAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAEAAAAAAABudWxsAAAAAgAAAAZib3VuZHN\n"
-  "PYmpjAAAAAQAAAAAAAFJjdDEAAAAEAAAAAFRvcCBsb25nAAAAAAAAAABMZWZ0bG9uZwAAAAAAAA\n"
-  "AAQnRvbWxvbmcAAABkAAAAAFJnaHRsb25nAAAAZAAAAAZzbGljZXNWbExzAAAAAU9iamMAAAABA\n"
-  "AAAAAAFc2xpY2UAAAASAAAAB3NsaWNlSURsb25nAAAAAAAAAAdncm91cElEbG9uZwAAAAAAAAAG\n"
-  "b3JpZ2luZW51bQAAAAxFU2xpY2VPcmlnaW4AAAANYXV0b0dlbmVyYXRlZAAAAABUeXBlZW51bQA\n"
-  "AAApFU2xpY2VUeXBlAAAAAEltZyAAAAAGYm91bmRzT2JqYwAAAAEAAAAAAABSY3QxAAAABAAAAA\n"
-  "BUb3AgbG9uZwAAAAAAAAAATGVmdGxvbmcAAAAAAAAAAEJ0b21sb25nAAAAZAAAAABSZ2h0bG9uZ\n"
-  "wAAAGQAAAADdXJsVEVYVAAAAAEAAAAAAABudWxsVEVYVAAAAAEAAAAAAABNc2dlVEVYVAAAAAEA\n"
-  "AAAAAAZhbHRUYWdURVhUAAAAAQAAAAAADmNlbGxUZXh0SXNIVE1MYm9vbAEAAAAIY2VsbFRleHR\n"
-  "URVhUAAAAAQAAAAAACWhvcnpBbGlnbmVudW0AAAAPRVNsaWNlSG9yekFsaWduAAAAB2RlZmF1bH\n"
-  "QAAAAJdmVydEFsaWduZW51bQAAAA9FU2xpY2VWZXJ0QWxpZ24AAAAHZGVmYXVsdAAAAAtiZ0Nvb\n"
-  "G9yVHlwZWVudW0AAAARRVNsaWNlQkdDb2xvclR5cGUAAAAATm9uZQAAAAl0b3BPdXRzZXRsb25n\n"
-  "AAAAAAAAAApsZWZ0T3V0c2V0bG9uZwAAAAAAAAAMYm90dG9tT3V0c2V0bG9uZwAAAAAAAAALcml\n"
-  "naHRPdXRzZXRsb25nAAAAAAA4QklNBBEAAAAAAAEBADhCSU0EFAAAAAAABAAAAAE4QklNBAwAAA\n"
-  "AACfkAAAABAAAAZAAAAGQAAAEsAAB1MAAACd0AGAAB/9j/4AAQSkZJRgABAgEASABIAAD/7QAMQ\n"
-  "WRvYmVfQ00AAv/uAA5BZG9iZQBkgAAAAAH/2wCEAAwICAgJCAwJCQwRCwoLERUPDAwPFRgTExUT\n"
-  "ExgRDAwMDAwMEQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwBDQsLDQ4NEA4OEBQODg4UFA4\n"
-  "ODg4UEQwMDAwMEREMDAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP/AABEIAGQAZA\n"
-  "MBIgACEQEDEQH/3QAEAAf/xAE/AAABBQEBAQEBAQAAAAAAAAADAAECBAUGBwgJCgsBAAEFAQEBA\n"
-  "QEBAAAAAAAAAAEAAgMEBQYHCAkKCxAAAQQBAwIEAgUHBggFAwwzAQACEQMEIRIxBUFRYRMicYEy\n"
-  "BhSRobFCIyQVUsFiMzRygtFDByWSU/Dh8WNzNRaisoMmRJNUZEXCo3Q2F9JV4mXys4TD03Xj80Y\n"
-  "nlKSFtJXE1OT0pbXF1eX1VmZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3EQACAgECBAQDBAUGBwcGBT\n"
-  "UBAAIRAyExEgRBUWFxIhMFMoGRFKGxQiPBUtHwMyRi4XKCkkNTFWNzNPElBhaisoMHJjXC0kSTV\n"
-  "KMXZEVVNnRl4vKzhMPTdePzRpSkhbSVxNTk9KW1xdXl9VZmdoaWprbG1ub2JzdHV2d3h5ent8f/\n"
-  "2gAMAwEAAhEDEQA/APLtso1NRc0vP0Rok8NYyPEfijOG2ljBoAJPxKFppZtbS4Rz38kV+OPRDge\n"
-  "T89EPHBfvLjtb3P8A30K/j47cgsrYNxGpPYJpK8RtyXUlvPfsobV0GV0uippLiX3EaMb2/rKgMB\n"
-  "1ghoiNST4BESCjjLmxqmKtvxiXQ0cd0q8E2bjIDWjk9z5I8QW8JaoHcdkUePZJtZD9p8YU/Rsc/\n"
-  "wBNjS5zjDWjUk+SSKYaJLYq+qWeYGQ5lBPLJ3OA8wz2/wDSWni/U3H2AXW2l2oloa0f9LcjSLeU\n"
-  "hJdb/wAyqd387Zt+DZ5SSpVh/9DzO6dw7gGPuVn6ft/kyPkqwlxjw1Rnh24QNWjUeR5TSuDc6bg\n"
-  "fatpsJZQ3sNC4rWfkVYpbi4LAb3aANEkFLp7GHGYxuhAj4K/hYVNDjYGzZ++eSSoSbLZjGgwxul\n"
-  "XNrPqO35FukdmzyXOQeqtqwqRg4o/SOAN9ng3/AMzW02txZ9I+ZHKr241UOcWDaz3uLtSSPEpWu\n"
-  "rR5XPeylmyNr4BIPPCyH2Oc6T8kXNvddkPe/VzjJPxQAJMKeIoNScrPk2MbfddXUNXvcGtPx0Xb\n"
-  "dJ6NXjOD2Dfdw6w9v5LFW+q/1WLA3Ly9LSJaz91p/wDRjl2lOLWwAMbEJErWjRgESYieVdZhsMF\n"
-  "wMt08ldrx/vVivHaOdSgCoud9krmElpba93ASTlr/AP/R83ohr97voiJV/Fq9QvsI+mdPgs1thc\n"
-  "BWO5C38CoOY1g78qOejLiGvknxLAyGtExp5K9uzGt9RrNw7DhRfQKKx6bZIGgPj4rPycLqWVtIs\n"
-  "JGu5skDyTBRZtQNrb1fU8xrtpBaO4MLQxcx1sNuEjt5rMGJR9noY5hF7Wxa8aAnxVvDb6bgHH2z\n"
-  "omk0e64ajUUXnev9Idi5rrWAux7SXNd4E/muS+rHSjm9VbPtZjj1CSJBI+g3+0uh69b+iDG/QcD\n"
-  "u0nQCeFP6l0MZhWX/AJ1xM+QafY1TQlY1a+WABsdXp8Sp27aBH+vZaVbC0ADlVcASwtdOolp8Ct\n"
-  "BjmtGv0uI8EmJmxkIjWkmPEKLSPiidxIgJKRbDPCSN5pJyH//S87uw/suZ6c72iC13kVs9PdDmk\n"
-  "KllVziV3cuafc7yP0QjYFh26cqM6hsxAjIj6u6xzbDHh3R663AaceH+5BwdruVp2PqZUA0a9yo6\n"
-  "DPQajscnXb8YQdzC8H909joiZttoxoBIa4gGOQ3uqh+z1RuD2Ds4j2n+39FNKaFMevS/p5LPpSA\n"
-  "I8/b/ABW70THZXj11VjaIAIHgFl5VdD8AneDMaec6Lb6QAKmu7x+VSw2a3MdF/rF9YKeh4B9OHZ\n"
-  "lpAprPH8p7v5DFwrPrV9YDa645toLjMaFo8mtcEvrhkWZHXbg7T0Q2to8o3f8AfkarEitlVTKnY\n"
-  "ra992QQ2wOfG57H2bg7H2fzbFKA130P6n9dHWemCx5H2mk7LgPH818f8IuhAka6ea8y/wAWrcod\n"
-  "VyrceRhBsPae5J/Qj+sxq9KDpMuMuKBCEntnny/1CSaWxM6pIKf/0/MvtF3pCrefTBnbOi1elP3\n"
-  "Et8Vi+Sv9LuNd4HwTSNGSEqkLerwtwn+SYKtOeS4A8Krh2j1D/K1Vu4B5gaDmVDJtAr7zYYGoRB\n"
-  "QDWQ4c9h/csuyjI3fobnDyJR8fF6ltcTaXRwCkAuAsfMGr1TGFNdTmEwLWS2dIK6npLgK2T4Lle\n"
-  "pUZxoc9+6K4eR5NO5bPT73NoqIfoILT/JcFJDZr8zGiNXnvrfiur6/Y8tht7WvaexgbXf8AUrFt\n"
-  "8IExyvRusYDOsYTAIbfWdzHRJ8HN/tLj7OgdRZawmreHP2gt9wEfvtH0f7SkDXe7+o+AOn9DquL\n"
-  "f0mV+leQPH6H+axafUvrB07ptJtyshtTZDTEudJ7bWS5V6MmyltVLn7ht2hwECQP+isb60/Vqvr\n"
-  "tbLsa1lObVIJd9Gxv5rXx9F7fzHpIbf/jgfVnd/TLYj6XoOhJcP/zE+sOzd6dW7dt2eo3dH7/9R\n"
-  "JJWj//U8uiGFx76BFZLQ2xvLeVGAWQrFDJbtKBSHd6blNura4H3BbDXB7InVcZXZdh2bmTt7hbO\n"
-  "J1dj2gzCjlFnhPod3WLHB+n3o9ZsAkFVMfMrs7orLmgkHUdkyqZQQWWQbLGlrjMjUeSrfV3Ltsw\n"
-  "30EBzcd5YCedvLETJya66nWOIAaCVnfU/KuZn21CDVa02PngQdHf9LapMfVhzkaAPUUW3M91YaR\n"
-  "3YDJ+WiBmZGazPo9Kttdt2j63E6s/fft/d/NWjXkMra7KtO2qkE6cErHpvsyMmzPu0dY4Bg/dYP\n"
-  "otTpyoaMUI2XUya8tzG/pi0NMtICo/bsut21gdcWclkj5OncxaDrw6kM+9QxQzaWRAGii4pDqzC\n"
-  "MT02aX7WzPU9b7PrG3bvO6P6yStfZm+pHnPySS4590+3jf/V8yb+CsUbp8uyz0kDskbu2dmz9J8\n"
-  "lSt9Ld+gn1O8cKikmxXydbH+3bhsmfwWj/lONYlcwkhL6L4bfpOxn/tD0/wBN/N944Wh9VJm/b/\n"
-  "O+347df+/rl0k+O38GLJ83X/CfTOt7v2dV6P8AMbx6njHb/pKuN3pN2+IXnaSjybr8e31fUqd+0\n"
-  "Sj487DHMryZJMXjq+sfpPX84SXk6SSX/9kAOEJJTQQhAAAAAABVAAAAAQEAAAAPAEEAZABvAGIA\n"
-  "ZQAgAFAAaABvAHQAbwBzAGgAbwBwAAAAEwBBAGQAbwBiAGUAIABQAGgAbwB0AG8AcwBoAG8AcAA\n"
-  "gADcALgAwAAAAAQA4QklNBAYAAAAAAAcABQAAAAEBAP/hFWdodHRwOi8vbnMuYWRvYmUuY29tL3\n"
-  "hhcC8xLjAvADw/eHBhY2tldCBiZWdpbj0n77u/JyBpZD0nVzVNME1wQ2VoaUh6cmVTek5UY3prY\n"
-  "zlkJz8+Cjw/YWRvYmUteGFwLWZpbHRlcnMgZXNjPSJDUiI/Pgo8eDp4YXBtZXRhIHhtbG5zOng9\n"
-  "J2Fkb2JlOm5zOm1ldGEvJyB4OnhhcHRrPSdYTVAgdG9vbGtpdCAyLjguMi0zMywgZnJhbWV3b3J\n"
-  "rIDEuNSc+CjxyZGY6UkRGIHhtbG5zOnJkZj0naHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi\n"
-  "1yZGYtc3ludGF4LW5zIycgeG1sbnM6aVg9J2h0dHA6Ly9ucy5hZG9iZS5jb20vaVgvMS4wLyc+C\n"
-  "gogPHJkZjpEZXNjcmlwdGlvbiBhYm91dD0ndXVpZDoyMmQwMmIwYS1iMjQ5LTExZGItOGFmOC05\n"
-  "MWQ1NDAzZjkyZjknCiAgeG1sbnM6cGRmPSdodHRwOi8vbnMuYWRvYmUuY29tL3BkZi8xLjMvJz4\n"
-  "KICA8IS0tIHBkZjpTdWJqZWN0IGlzIGFsaWFzZWQgLS0+CiA8L3JkZjpEZXNjcmlwdGlvbj4KCi\n"
-  "A8cmRmOkRlc2NyaXB0aW9uIGFib3V0PSd1dWlkOjIyZDAyYjBhLWIyNDktMTFkYi04YWY4LTkxZ\n"
-  "DU0MDNmOTJmOScKICB4bWxuczpwaG90b3Nob3A9J2h0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9z\n"
-  "aG9wLzEuMC8nPgogIDwhLS0gcGhvdG9zaG9wOkNhcHRpb24gaXMgYWxpYXNlZCAtLT4KIDwvcmR\n"
-  "mOkRlc2NyaXB0aW9uPgoKIDxyZGY6RGVzY3JpcHRpb24gYWJvdXQ9J3V1aWQ6MjJkMDJiMGEtYj\n"
-  "I0OS0xMWRiLThhZjgtOTFkNTQwM2Y5MmY5JwogIHhtbG5zOnhhcD0naHR0cDovL25zLmFkb2JlL\n"
-  "mNvbS94YXAvMS4wLyc+CiAgPCEtLSB4YXA6RGVzY3JpcHRpb24gaXMgYWxpYXNlZCAtLT4KIDwv\n"
-  "cmRmOkRlc2NyaXB0aW9uPgoKIDxyZGY6RGVzY3JpcHRpb24gYWJvdXQ9J3V1aWQ6MjJkMDJiMGE\n"
-  "tYjI0OS0xMWRiLThhZjgtOTFkNTQwM2Y5MmY5JwogIHhtbG5zOnhhcE1NPSdodHRwOi8vbnMuYW\n"
-  "RvYmUuY29tL3hhcC8xLjAvbW0vJz4KICA8eGFwTU06RG9jdW1lbnRJRD5hZG9iZTpkb2NpZDpwa\n"
-  "G90b3Nob3A6MjJkMDJiMDYtYjI0OS0xMWRiLThhZjgtOTFkNTQwM2Y5MmY5PC94YXBNTTpEb2N1\n"
-  "bWVudElEPgogPC9yZGY6RGVzY3JpcHRpb24+CgogPHJkZjpEZXNjcmlwdGlvbiBhYm91dD0ndXV\n"
-  "pZDoyMmQwMmIwYS1iMjQ5LTExZGItOGFmOC05MWQ1NDAzZjkyZjknCiAgeG1sbnM6ZGM9J2h0dH\n"
-  "A6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvJz4KICA8ZGM6ZGVzY3JpcHRpb24+CiAgIDxyZ\n"
-  "GY6QWx0PgogICAgPHJkZjpsaSB4bWw6bGFuZz0neC1kZWZhdWx0Jz4gICAgICAgICAgICAgICAg\n"
-  "ICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgIDwvcmRmOkFsdD4KICA8L2RjOmRlc2NyaXB0aW9\n"
-  "uPgogPC9yZGY6RGVzY3JpcHRpb24+Cgo8L3JkZjpSREY+CjwveDp4YXBtZXRhPgogICAgICAgIC\n"
-  "AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI\n"
-  "CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAg\n"
-  "ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA\n"
-  "gICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC\n"
-  "AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI\n"
-  "CAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\n"
-  "ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA\n"
-  "gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC\n"
-  "AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgI\n"
-  "CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\n"
-  "ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICA\n"
-  "gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC\n"
-  "AgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI\n"
-  "CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\n"
-  "ICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA\n"
-  "gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA\n"
-  "ogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI\n"
-  "CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAg\n"
-  "ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA\n"
-  "gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgIC\n"
-  "AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI\n"
-  "CAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\n"
-  "ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA\n"
-  "gICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC\n"
-  "AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKI\n"
-  "CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\n"
-  "ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICA\n"
-  "gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC\n"
-  "AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgI\n"
-  "CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\n"
-  "ICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA\n"
-  "gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC\n"
-  "AgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI\n"
-  "CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAg\n"
-  "ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA\n"
-  "gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgIC\n"
-  "AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI\n"
-  "CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAg\n"
-  "ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA\n"
-  "gICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC\n"
-  "AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI\n"
-  "CAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\n"
-  "ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICA\n"
-  "gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC\n"
-  "AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgI\n"
-  "CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\n"
-  "ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICA\n"
-  "gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC\n"
-  "AgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI\n"
-  "CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\n"
-  "ICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA\n"
-  "gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgIC\n"
-  "AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI\n"
-  "CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAg\n"
-  "ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA\n"
-  "gICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIC\n"
-  "AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI\n"
-  "CAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\n"
-  "ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA\n"
-  "gICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC\n"
-  "AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgI\n"
-  "CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\n"
-  "ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICA\n"
-  "gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC\n"
-  "AgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgI\n"
-  "CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\n"
-  "ICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA\n"
-  "gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC\n"
-  "AgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI\n"
-  "CAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAg\n"
-  "ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA\n"
-  "gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgIC\n"
-  "AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKPD94cGFja2V0IGVuZD0ndyc/P\n"
-  "v/uAA5BZG9iZQBkQAAAAAH/2wCEAAQDAwMDAwQDAwQGBAMEBgcFBAQFBwgGBgcGBggKCAkJCQkI\n"
-  "CgoMDAwMDAoMDAwMDAwMDAwMDAwMDAwMDAwMDAwBBAUFCAcIDwoKDxQODg4UFA4ODg4UEQwMDAw\n"
-  "MEREMDAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDP/AABEIAGQAZAMBEQACEQEDEQ\n"
-  "H/3QAEAA3/xAGiAAAABwEBAQEBAAAAAAAAAAAEBQMCBgEABwgJCgsBAAICAwEBAQEBAAAAAAAAA\n"
-  "AEAAgMEBQYHCAkKCxAAAgEDAwIEAgYHAwQCBgJzAQIDEQQABSESMUFRBhNhInGBFDKRoQcVsUIj\n"
-  "wVLR4TMWYvAkcoLxJUM0U5KismNzwjVEJ5OjszYXVGR0w9LiCCaDCQoYGYSURUaktFbTVSga8uP\n"
-  "zxNTk9GV1hZWltcXV5fVmdoaWprbG1ub2N0dXZ3eHl6e3x9fn9zhIWGh4iJiouMjY6PgpOUlZaX\n"
-  "mJmam5ydnp+So6SlpqeoqaqrrK2ur6EQACAgECAwUFBAUGBAgDA20BAAIRAwQhEjFBBVETYSIGc\n"
-  "YGRMqGx8BTB0eEjQhVSYnLxMyQ0Q4IWklMlomOywgdz0jXiRIMXVJMICQoYGSY2RRonZHRVN/Kj\n"
-  "s8MoKdPj84SUpLTE1OT0ZXWFlaW1xdXl9UZWZnaGlqa2xtbm9kdXZ3eHl6e3x9fn9zhIWGh4iJi\n"
-  "ouMjY6Pg5SVlpeYmZqbnJ2en5KjpKWmp6ipqqusra6vr/2gAMAwEAAhEDEQA/APBnplwPAdR+GB\n"
-  "KY6dYtNG1w39yh4+xb+zIksgEfFaRSSoIx8f7RPRRkSWQimM+lRmwWVXFWYigHxUUVoMiJM+Fj0\n"
-  "tg0RBegLE0Wu+3c+GTBazFCGI7HtSp9slbFYYzyoBsegw2hY1Afl3wqqRqahk+0tDgKpgu4DAUU\n"
-  "+HY+GRS2ePiMKtUB3G+KGuONq//Q8OzpFbW5WnxMop4k9crG5ZnZNJkEOn21utVRYw7HxZtz+OR\n"
-  "vdsrZ2lRtci4aVxFEQA0neg/ZXxJpTITNNuOFss0vSotYNvZ2qGRkPKSTqiU8Sdqk5SZU5Ix8XJ\n"
-  "NNZ8k6bp8TtM73OputUtYq0Unux/hkRkJOzZLCAN2KR+VpbtSkCBaDnIzdlWu59u+XeJTjeASk8\n"
-  "+juZOESEAVqx8BvU/PJibScTrTy09560hkWOGFd2YgFnPQKD19zhOSkxw2l8Vm6XAiYb8gg+k5O\n"
-  "9mnhoon9H3cs5s7WF5pp29OGGMFndyaAKBuTiEEPQLD8h/NDmNdYlttNkYjlbFjcXCr3LLH8II8\n"
-  "C2WUGviZvon/OPWkm3RNSv72SYllMkKxQRV67CQMSKYQAxMkR/wBC56d61P0heel4cYuVOXWvTp\n"
-  "h4Qjjf/9Hw5qBYyISaqjBV+QpvkAzKcki4HomnIxck/wBhtlR2bhunvlDywddMUl4zW+kQ9FQ8X\n"
-  "nfuSewrtmPkycPvc/DhMhvyegXOrWWhmLQPKlsj6xIAiLCoZkY96nv7npmJvI2XOjQFMl0fyRqM\n"
-  "NoxvZvrGt33wlATwiMnVnY1LEdSfuyXF3KIDmUu88w2XlnTl8raAlb2ZFfVL0jdYRtQnxc7BfDC\n"
-  "OaJR7nm3me5tdOtjbMvp3ZRXkV6chVQRX79hmVjgZG+jgZ5jHGhzecXF5LPL6jEjstSSaDM51Ka\n"
-  "6MZ9S1C0sEBe8uZo4YCBXdjxGw60wEWyEqfUHkT8vLXRJFuLdTcaqfhlvWUErtukZ3ABPUjIXTE\n"
-  "m3rGmeV2Tk5UKz/AG/E/wAcgZKya20C3b02kjYtH8AqCygbkUH0nLYlgUb+gbWtPbpXt/n2ybB/\n"
-  "/9Lw4oaVxGd+PxH3qBkGaY3KyiSP01IkiUclH8sg+LKydm6INvZvKsFu+kWtvD8LRoFNRup6moO\n"
-  "aqd277HsGW+XPLmn6XM17FF6l7vW4fd2Zuu+RFls2tmUNrLJb7TSBertGQGqetDkxE0na0pvtHs\n"
-  "QkszWyiGAG5laYlnkeMVHJj8sA5rPk+SvMepTalqlxd3B5zTOXdj/MxqafLpm5xioh5nPK5kpRG\n"
-  "pkcKAST0A6k5NpfUP5K/ki1ssHmHzF+71KRQ8Nud/Qibb/kYw6/yjbrXISlSH07YaHbWyxx2kXE\n"
-  "KACB2zHJtLI7XSelBRvH2xCpvaaTDHXkOTVBPcUG2479RlsdmJVPRtvV+ylenQ0y62FP/9PxRpo\n"
-  "WG5FxKKxKFDA+GVS5NsebLdFsRePc3siVW4f4QR0QVAGYeSXR2unhtZ6s60K6jt+MMSFwtF2+xX\n"
-  "wr7eGUGLlRPQMsE2vxQm7itxKg3VCfT2+nb8cDYaCDtfOXmCCcROrQrUhkkCHYn6emRMqZxjbLd\n"
-  "F1+W/4xajHzjNCtQKMffETWUdngX5p+QZ9A8xS6hbo0ui37NNDPT7DOalHpsCD08Rmyw5ARTpdV\n"
-  "gIPEF35MeRn80ed4S5EdrpKm9kZ15K0iH92hB7Me/tmS60vt/QrCYyekiBdgSTXcjqV9q9MokFD\n"
-  "N7S3aFVVR8RoK9zldqndvAY6nffr/AGYQqLhjdpCoIAZW22HavU/LJBUP9WblX0xTw7fOmWsX/9\n"
-  "Tw7FdvMqWkQ3Z1qfED+mQIbI77PX/LFis9vBajZm2Y+x65rMh3t30Bsze400aVaIbSLk6r8CMRT\n"
-  "l/NmOcllnGDD9Y8uecNfEEiXrMgDGWAyGOOu5WlB+vMrHODTlxZCdjsyFdB006VpVtLasurQxBL\n"
-  "64WiLI4/aFT1ANOXemV5piR2b9NiljB4yyHy9CLOVI5GJhB+CvXY9R8xmINzs5HNZ+Z96BZpbxA\n"
-  "fVJo39UFefwopYgL4nMiMd2qZoIn/AJx00u3t/Lt7qpp9Yv5GLf5MUTERqfbvmzBeezjd9H+VlL\n"
-  "wSQzBqsvOGQD7L12rXsemPNxmXQSxxIPU2nFV4HYqR1xEUWj4ZAxBryr2G+J2VGDZlLrxUH6KZA\n"
-  "Fkqb15VFelfwy+2FP8A/9Xxlf6AdA182Yk9eFeLxSjoVfcfSMo4uIOfkweFOnpvlWYrLEwNFAA+\n"
-  "nMOYdrhFvQLeSO7coBXiK8iKiv07Zj8Ac4QtNrW1njUcKcT+yAR/xGmR4WcsStLpTuPU9IFaEsV\n"
-  "BP3k4m2AgBzSwyQNcIwNTE1aI3wnam9O2Ug7s5Ckk/NDndeVXa2H78MqqV6jmeBp9+ZWKXqDjZ4\n"
-  "+gvVvy30qCy0qzsLRBCnBI2VdgUTqPvOZ7y+Q7pz+bn5q6d+VflZxZlJ/NN4ypptk5qtB9qRwDX\n"
-  "gn/AAx2y2ItpfKFv+eH5qNeTajJ5ovVaVywSqvEtTUKqupAA6D2y0BNPtv/AJx//M5PzL8mJeXT\n"
-  "L+ndPf6rqarSpkAqsnEAAeoN6DpkJRYci9lROSgSUUH9o9K5Tw0ztfSHnXkOtK9q+PHwydq//9b\n"
-  "yxrVoZNBtNSA5zRMPXmH8j0CLXuBmHE+qneamHpEuqYeV7pzFVTRgQK5XMNmnlb1vyyY5QA1OwJ\n"
-  "+eUF2seTOLu5s7azVIVAkpVn/hhnIALG73Yz5jvb1dICqzpDNIqyFD8SxH7R28cxibZCiWOsdJs\n"
-  "PTM6XNstPhnkjIhcHuJBVfvOCiUSn0TfWrTTLjyw8guA/PifTO3xcxxA8a5ZAbimvJP0m3p/kFF\n"
-  "WxhmpWQJ9NW3zZPHz5vlb/nIDVbrWfzO1RJhxGnpDaRL/khA1T7ktmSOTAJhZaAUtLawsbayl8v\n"
-  "xWi3Gpay0cF3HPcFRJJHJMXVrcJ8UaAFG5LWjF8tAYW9H/wCcOo9bTzxrt/owkTyksZW5gkIKvI\n"
-  "7k26nvyReRJHyyBWT7dWQyOWlbnK2526e1O1MqIUFE84uPLkOdK9RXI0E2/wD/1/DA1bURZLY/W\n"
-  "ZDZqwb0eXw7dMgIi7bjllVXsz7yNcfWC0Vd3Ip92Y2UOz0cnsPlwyx8xQ/u24sMxCadoJp9LOXk\n"
-  "VX/uwRUE0BI8cokbLMyoKouHu2MaKGXw7fLDwgoGSkbHpaNZyLLHRSKcFFQQRvUdMlwUFOQyLzr\n"
-  "ztpCaba6fPau4ijv4OURY8AjVFKV7ZZiO+7Vnh6XvXkSWNbW2WTb92KDxIFMzwHlZc3zX+fuizW\n"
-  "f5p3ty8XGDU4YLmCQiisyII3+4rvl8UB5ffEghRGvOm7AbnvWvjk1fen/ONPldPKP5aWOpPCfr2\n"
-  "uE31y6q2wbaMEn+VAMDSdyzrzj+avlHyTp0l/r2rxWFuHWJuIeacu4qFCRgsajfBwsty89/6Gr/\n"
-  "ACa9an+JL/hSnrfoubhXwpXpjwhaL//Q8E1AqtcAZMs8l6i1nqMa1oSVP0VynKLDmaWdSfQXl69\n"
-  "jF1Jv8MhDb5rpB3AO7INRRLhhGp4R05FgaGvTMU8200xS70zVDMRp2pTIOvBmB3PgQP15kxIcnD\n"
-  "LH/EEz0rRvOJhldr9pQtCqyd6VrShGTqw5d4ARv9jHfOGl+ZJNMluLkyenaFbiRdqFYW5nrWuwO\n"
-  "MKB5MdSMRxnhlu9N8p6lLFpti63FUjCtFJTrDKvse2bEDZ4XJ9RZB+YPli2/Mjy5bxoUi1a0YS2\n"
-  "85UOwIXiy9jRu+TBppfOF1+V3m22vrdpNPM8cs/oo0VJlUqQPjValR3+IZNNvtLS9Yu9Mi0/TJr\n"
-  "kyp6QhWVVCIWRATsKBemwwFrDzT87fybs/wA1bW21PRb+DTvNlgGSRp6iC8i3KJJx+y6n7D0Pwm\n"
-  "hxBZXT55/6Fi/Nf0PW+qWXq+t6X1X67F6vD/ftK04V/wBl344U8b//0fBapxheVh9ocV+nviqY2\n"
-  "/qQJDew/bioWHiuQ8m0bbvaPKGtQ6jaxSo9JloCK75gZI0Xb4sgkHo8MouoAvP94BsRmGY7uWJU\n"
-  "gzbypOQpNOvIdK4Nw2WCE2tXulTkjEEbdafgclxMhFBas93dwyQzsWDghlJFONKHJCZtjOFBJfy\n"
-  "j1y9vPL9zpbIs0WkXL2sUjA8hDXlGCRXtt07ZuYvL5KJeo6bfajbkzWkcToR8dqshZ6in2fhNK/\n"
-  "PDTUlXmHVvMdr5o0v9H2kdrqGpfu7m0nkY87Uf7tkKAU4/s03ynLkEBbfihx7dGT6va67LbRMNR\n"
-  "aKOBuUTKgIBXoK1BOYR1M3aQ0mOt9yxUeZNdtJhFapLqMluSXkg5oxJrUMW5KevQ9MmNXXNqOiH\n"
-  "Rr/Hmv8A1r9I/oj95w+r+j9Yf1+NP5+nXtTD+dF8tkfkOlv/0vC3ph7f0/alcVTbS4A8QibuKb5\n"
-  "RI05EBYRFpdX3ly79a2qYCavH/EY7TCYyMD5PSdD8+wXUSn1ArDqOhBzFlipz4ZwWbaV5htbsgF\n"
-  "qg9crMXKErGyYwajFGzxyHlGSePbbwyqg5UZlCaxrFpaWU95LIqrEjMAT4Dp9OShGy1ZslBhv/A\n"
-  "Dj9rd/a+aL+xUK+m38L3d0HrxRo2HFtu5D8c27y8t30raarbWkU+u6g4gsNORn+EcUaSh2Pc0/4\n"
-  "lgtAjezzbT9SutY1i782al8Nxdyotqh6xWybIg+jc5q8s+I27bFDgFPQp9RE+nrag70+L6crrZu\n"
-  "4jajokdv6LW/Dii1Wo61PXKQN3KPK0L+h4/rnD/K5V78a5LhXxd3/0/DMXXtwxVNtL9Xkaf3f7N\n"
-  "etfbKMjdjtkZ9D6ufrlK0+HpX8coF9HJ26sXvfqXrf7i/U+uften/d/wCyrmQL6uOav0pvpP8Ai\n"
-  "b1F+rV59+vH6a5XLhcjH4nRmY/xpxHP0/UptWvT6Mx/RbmjxWK+aP8AFf1M/pCv1Kvxen9inavf\n"
-  "MrFwXtzcLUeLXq5Mv/I3nz1b0v8AjofuKVry9KrUpTanOlf9jmQ68va/zH9b/COn/o7/AI431mP\n"
-  "65SvLh+zWvbl9rMfNfC34K4kmj9T6lD6FKclp/DNYXZx5srsPrHor6nXvkgxTPS/U+rv6dPU5mt\n"
-  "fngFN5ulv+l/pL/Lp/scerHo//2Q==\n";
-
-static std::string gCommandLine;
-
-TEST(Base64, LargeSample) {
-  LOG(LS_VERBOSE) << "Testing specific base64 file";
-
-  char unescaped[64 * 1024];
-
-  // unescape that massive blob above
-  size_t size = Base64Unescape(SpecificTest,
-                            sizeof(SpecificTest),
-                            unescaped,
-                            sizeof(unescaped));
-
-  EXPECT_EQ(size, sizeof(testbase64));
-  EXPECT_EQ(0, memcmp(testbase64, unescaped, sizeof(testbase64)));
-}
-
-bool DecodeTest(const char* encoded, size_t expect_unparsed,
-                const char* decoded, Base64::DecodeFlags flags)
-{
-  std::string result;
-  size_t consumed = 0, encoded_len = strlen(encoded);
-  bool success = Base64::DecodeFromArray(encoded, encoded_len, flags,
-                                         &result, &consumed);
-  size_t unparsed = encoded_len - consumed;
-  EXPECT_EQ(expect_unparsed, unparsed) << "\"" << encoded
-                                       << "\" -> \"" << decoded
-                                       << "\"";
-  EXPECT_STREQ(decoded, result.c_str());
-  return success;
-}
-
-#define Flags(x,y,z) \
-  Base64::DO_PARSE_##x | Base64::DO_PAD_##y | Base64::DO_TERM_##z
-
-TEST(Base64, DecodeParseOptions) {
-  // Trailing whitespace
-  EXPECT_TRUE (DecodeTest("YWJjZA== ", 1, "abcd", Flags(STRICT, YES, CHAR)));
-  EXPECT_TRUE (DecodeTest("YWJjZA== ", 0, "abcd", Flags(WHITE,  YES, CHAR)));
-  EXPECT_TRUE (DecodeTest("YWJjZA== ", 0, "abcd", Flags(ANY,    YES, CHAR)));
-
-  // Embedded whitespace
-  EXPECT_FALSE(DecodeTest("YWJjZA= =", 3, "abcd", Flags(STRICT, YES, CHAR)));
-  EXPECT_TRUE (DecodeTest("YWJjZA= =", 0, "abcd", Flags(WHITE,  YES, CHAR)));
-  EXPECT_TRUE (DecodeTest("YWJjZA= =", 0, "abcd", Flags(ANY,    YES, CHAR)));
-
-  // Embedded non-base64 characters
-  EXPECT_FALSE(DecodeTest("YWJjZA=*=", 3, "abcd", Flags(STRICT, YES, CHAR)));
-  EXPECT_FALSE(DecodeTest("YWJjZA=*=", 3, "abcd", Flags(WHITE,  YES, CHAR)));
-  EXPECT_TRUE (DecodeTest("YWJjZA=*=", 0, "abcd", Flags(ANY,    YES, CHAR)));
-
-  // Unexpected padding characters
-  EXPECT_FALSE(DecodeTest("YW=JjZA==", 7, "a",    Flags(STRICT, YES, CHAR)));
-  EXPECT_FALSE(DecodeTest("YW=JjZA==", 7, "a",    Flags(WHITE,  YES, CHAR)));
-  EXPECT_TRUE (DecodeTest("YW=JjZA==", 0, "abcd", Flags(ANY,    YES, CHAR)));
-}
-
-TEST(Base64, DecodePadOptions) {
-  // Padding
-  EXPECT_TRUE (DecodeTest("YWJjZA==",  0, "abcd", Flags(STRICT, YES, CHAR)));
-  EXPECT_TRUE (DecodeTest("YWJjZA==",  0, "abcd", Flags(STRICT, ANY, CHAR)));
-  EXPECT_TRUE (DecodeTest("YWJjZA==",  2, "abcd", Flags(STRICT, NO,  CHAR)));
-
-  // Incomplete padding
-  EXPECT_FALSE(DecodeTest("YWJjZA=",   1, "abcd", Flags(STRICT, YES, CHAR)));
-  EXPECT_TRUE (DecodeTest("YWJjZA=",   1, "abcd", Flags(STRICT, ANY, CHAR)));
-  EXPECT_TRUE (DecodeTest("YWJjZA=",   1, "abcd", Flags(STRICT, NO,  CHAR)));
-
-  // No padding
-  EXPECT_FALSE(DecodeTest("YWJjZA",    0, "abcd", Flags(STRICT, YES, CHAR)));
-  EXPECT_TRUE (DecodeTest("YWJjZA",    0, "abcd", Flags(STRICT, ANY, CHAR)));
-  EXPECT_TRUE (DecodeTest("YWJjZA",    0, "abcd", Flags(STRICT, NO,  CHAR)));
-}
-
-TEST(Base64, DecodeTerminateOptions) {
-  // Complete quantum
-  EXPECT_TRUE (DecodeTest("YWJj",      0, "abc",  Flags(STRICT, NO,  BUFFER)));
-  EXPECT_TRUE (DecodeTest("YWJj",      0, "abc",  Flags(STRICT, NO,  CHAR)));
-  EXPECT_TRUE (DecodeTest("YWJj",      0, "abc",  Flags(STRICT, NO,  ANY)));
-
-  // Complete quantum with trailing data
-  EXPECT_FALSE(DecodeTest("YWJj*",     1, "abc",  Flags(STRICT, NO,  BUFFER)));
-  EXPECT_TRUE (DecodeTest("YWJj*",     1, "abc",  Flags(STRICT, NO,  CHAR)));
-  EXPECT_TRUE (DecodeTest("YWJj*",     1, "abc",  Flags(STRICT, NO,  ANY)));
-
-  // Incomplete quantum
-  EXPECT_FALSE(DecodeTest("YWJ",       0, "ab",   Flags(STRICT, NO,  BUFFER)));
-  EXPECT_FALSE(DecodeTest("YWJ",       0, "ab",   Flags(STRICT, NO,  CHAR)));
-  EXPECT_TRUE (DecodeTest("YWJ",       0, "ab",   Flags(STRICT, NO,  ANY)));
-}
-
-TEST(Base64, GetNextBase64Char) {
-  // The table looks like this:
-  // "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
-  char next_char;
-  EXPECT_TRUE(Base64::GetNextBase64Char('A', &next_char));
-  EXPECT_EQ('B', next_char);
-  EXPECT_TRUE(Base64::GetNextBase64Char('Z', &next_char));
-  EXPECT_EQ('a', next_char);
-  EXPECT_TRUE(Base64::GetNextBase64Char('/', &next_char));
-  EXPECT_EQ('A', next_char);
-  EXPECT_FALSE(Base64::GetNextBase64Char('&', &next_char));
-  EXPECT_FALSE(Base64::GetNextBase64Char('Z', nullptr));
-}
diff --git a/rtc_base/basictypes.h b/rtc_base/basictypes.h
deleted file mode 100644
index d76dbf9..0000000
--- a/rtc_base/basictypes.h
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- *  Copyright 2004 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_RTC_BASE_BASICTYPES_H_
-#define WEBRTC_RTC_BASE_BASICTYPES_H_
-
-#include <stddef.h>  // for NULL, size_t
-#include <stdint.h>  // for uintptr_t and (u)int_t types.
-
-// Detect compiler is for x86 or x64.
-#if defined(__x86_64__) || defined(_M_X64) || \
-    defined(__i386__) || defined(_M_IX86)
-#define CPU_X86 1
-#endif
-
-// Detect compiler is for arm.
-#if defined(__arm__) || defined(_M_ARM)
-#define CPU_ARM 1
-#endif
-
-#if defined(CPU_X86) && defined(CPU_ARM)
-#error CPU_X86 and CPU_ARM both defined.
-#endif
-
-#if !defined(RTC_ARCH_CPU_BIG_ENDIAN) && !defined(RTC_ARCH_CPU_LITTLE_ENDIAN)
-// x86, arm or GCC provided __BYTE_ORDER__ macros
-#if defined(CPU_X86) || defined(CPU_ARM) ||                             \
-  (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)
-#define RTC_ARCH_CPU_LITTLE_ENDIAN
-#elif defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
-#define RTC_ARCH_CPU_BIG_ENDIAN
-#else
-#error RTC_ARCH_CPU_BIG_ENDIAN or RTC_ARCH_CPU_LITTLE_ENDIAN should be defined.
-#endif
-#endif
-
-#if defined(RTC_ARCH_CPU_BIG_ENDIAN) && defined(RTC_ARCH_CPU_LITTLE_ENDIAN)
-#error RTC_ARCH_CPU_BIG_ENDIAN and RTC_ARCH_CPU_LITTLE_ENDIAN both defined.
-#endif
-
-#if defined(WEBRTC_WIN)
-typedef int socklen_t;
-#endif
-
-// The following only works for C++
-#ifdef __cplusplus
-
-#ifndef ALIGNP
-#define ALIGNP(p, t)                                             \
-  (reinterpret_cast<uint8_t*>(((reinterpret_cast<uintptr_t>(p) + \
-  ((t) - 1)) & ~((t) - 1))))
-#endif
-
-#define RTC_IS_ALIGNED(p, a) (!((uintptr_t)(p) & ((a) - 1)))
-
-// Use these to declare and define a static local variable that gets leaked so
-// that its destructors are not called at exit.
-#define RTC_DEFINE_STATIC_LOCAL(type, name, arguments) \
-  static type& name = *new type arguments
-
-#endif  // __cplusplus
-
-#endif  // WEBRTC_RTC_BASE_BASICTYPES_H_
diff --git a/rtc_base/basictypes_unittest.cc b/rtc_base/basictypes_unittest.cc
deleted file mode 100644
index 550e61d..0000000
--- a/rtc_base/basictypes_unittest.cc
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- *  Copyright 2012 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/rtc_base/basictypes.h"
-
-#include "webrtc/rtc_base/gunit.h"
-
-namespace rtc {
-
-TEST(BasicTypesTest, Endian) {
-  uint16_t v16 = 0x1234u;
-  uint8_t first_byte = *reinterpret_cast<uint8_t*>(&v16);
-#if defined(RTC_ARCH_CPU_LITTLE_ENDIAN)
-  EXPECT_EQ(0x34u, first_byte);
-#elif defined(RTC_ARCH_CPU_BIG_ENDIAN)
-  EXPECT_EQ(0x12u, first_byte);
-#endif
-}
-
-TEST(BasicTypesTest, SizeOfConstants) {
-  EXPECT_EQ(8u, sizeof(INT64_C(0)));
-  EXPECT_EQ(8u, sizeof(UINT64_C(0)));
-  EXPECT_EQ(8u, sizeof(INT64_C(0x1234567887654321)));
-  EXPECT_EQ(8u, sizeof(UINT64_C(0x8765432112345678)));
-}
-
-// Test CPU_ macros
-#if !defined(CPU_ARM) && defined(__arm__)
-#error expected CPU_ARM to be defined.
-#endif
-#if !defined(CPU_X86) && (defined(WEBRTC_WIN) || defined(WEBRTC_MAC) && !defined(WEBRTC_IOS))
-#error expected CPU_X86 to be defined.
-#endif
-#if !defined(RTC_ARCH_CPU_LITTLE_ENDIAN) && \
-  (defined(WEBRTC_WIN) || defined(WEBRTC_MAC) && !defined(WEBRTC_IOS) || defined(CPU_X86))
-#error expected RTC_ARCH_CPU_LITTLE_ENDIAN to be defined.
-#endif
-
-// TODO(fbarchard): Test all macros in basictypes.h
-
-}  // namespace rtc
diff --git a/rtc_base/bind.h b/rtc_base/bind.h
deleted file mode 100644
index 0918fbc..0000000
--- a/rtc_base/bind.h
+++ /dev/null
@@ -1,284 +0,0 @@
-/*
- *  Copyright 2012 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.
- */
-
-// Bind() is an overloaded function that converts method calls into function
-// objects (aka functors). The method object is captured as a scoped_refptr<> if
-// possible, and as a raw pointer otherwise. Any arguments to the method are
-// captured by value. The return value of Bind is a stateful, nullary function
-// object. Care should be taken about the lifetime of objects captured by
-// Bind(); the returned functor knows nothing about the lifetime of a non
-// ref-counted method object or any arguments passed by pointer, and calling the
-// functor with a destroyed object will surely do bad things.
-//
-// To prevent the method object from being captured as a scoped_refptr<>, you
-// can use Unretained. But this should only be done when absolutely necessary,
-// and when the caller knows the extra reference isn't needed.
-//
-// Example usage:
-//   struct Foo {
-//     int Test1() { return 42; }
-//     int Test2() const { return 52; }
-//     int Test3(int x) { return x*x; }
-//     float Test4(int x, float y) { return x + y; }
-//   };
-//
-//   int main() {
-//     Foo foo;
-//     cout << rtc::Bind(&Foo::Test1, &foo)() << endl;
-//     cout << rtc::Bind(&Foo::Test2, &foo)() << endl;
-//     cout << rtc::Bind(&Foo::Test3, &foo, 3)() << endl;
-//     cout << rtc::Bind(&Foo::Test4, &foo, 7, 8.5f)() << endl;
-//   }
-//
-// Example usage of ref counted objects:
-//   struct Bar {
-//     int AddRef();
-//     int Release();
-//
-//     void Test() {}
-//     void BindThis() {
-//       // The functor passed to AsyncInvoke() will keep this object alive.
-//       invoker.AsyncInvoke(RTC_FROM_HERE,rtc::Bind(&Bar::Test, this));
-//     }
-//   };
-//
-//   int main() {
-//     rtc::scoped_refptr<Bar> bar = new rtc::RefCountedObject<Bar>();
-//     auto functor = rtc::Bind(&Bar::Test, bar);
-//     bar = nullptr;
-//     // The functor stores an internal scoped_refptr<Bar>, so this is safe.
-//     functor();
-//   }
-//
-
-#ifndef WEBRTC_RTC_BASE_BIND_H_
-#define WEBRTC_RTC_BASE_BIND_H_
-
-#include <tuple>
-#include <type_traits>
-
-#include "webrtc/rtc_base/scoped_ref_ptr.h"
-#include "webrtc/rtc_base/template_util.h"
-
-#define NONAME
-
-namespace rtc {
-namespace detail {
-// This is needed because the template parameters in Bind can't be resolved
-// if they're used both as parameters of the function pointer type and as
-// parameters to Bind itself: the function pointer parameters are exact
-// matches to the function prototype, but the parameters to bind have
-// references stripped. This trick allows the compiler to dictate the Bind
-// parameter types rather than deduce them.
-template <class T> struct identity { typedef T type; };
-
-// IsRefCounted<T>::value will be true for types that can be used in
-// rtc::scoped_refptr<T>, i.e. types that implements nullary functions AddRef()
-// and Release(), regardless of their return types. AddRef() and Release() can
-// be defined in T or any superclass of T.
-template <typename T>
-class IsRefCounted {
-  // This is a complex implementation detail done with SFINAE.
-
-  // Define types such that sizeof(Yes) != sizeof(No).
-  struct Yes { char dummy[1]; };
-  struct No { char dummy[2]; };
-  // Define two overloaded template functions with return types of different
-  // size. This way, we can use sizeof() on the return type to determine which
-  // function the compiler would have chosen. One function will be preferred
-  // over the other if it is possible to create it without compiler errors,
-  // otherwise the compiler will simply remove it, and default to the less
-  // preferred function.
-  template <typename R>
-  static Yes test(R* r, decltype(r->AddRef(), r->Release(), 42));
-  template <typename C> static No test(...);
-
-public:
-  // Trick the compiler to tell if it's possible to call AddRef() and Release().
-  static const bool value = sizeof(test<T>((T*)nullptr, 42)) == sizeof(Yes);
-};
-
-// TernaryTypeOperator is a helper class to select a type based on a static bool
-// value.
-template <bool condition, typename IfTrueT, typename IfFalseT>
-struct TernaryTypeOperator {};
-
-template <typename IfTrueT, typename IfFalseT>
-struct TernaryTypeOperator<true, IfTrueT, IfFalseT> {
-  typedef IfTrueT type;
-};
-
-template <typename IfTrueT, typename IfFalseT>
-struct TernaryTypeOperator<false, IfTrueT, IfFalseT> {
-  typedef IfFalseT type;
-};
-
-// PointerType<T>::type will be scoped_refptr<T> for ref counted types, and T*
-// otherwise.
-template <class T>
-struct PointerType {
-  typedef typename TernaryTypeOperator<IsRefCounted<T>::value,
-                                       scoped_refptr<T>,
-                                       T*>::type type;
-};
-
-template <typename T>
-class UnretainedWrapper {
- public:
-  explicit UnretainedWrapper(T* o) : ptr_(o) {}
-  T* get() const { return ptr_; }
-
- private:
-  T* ptr_;
-};
-
-}  // namespace detail
-
-template <typename T>
-static inline detail::UnretainedWrapper<T> Unretained(T* o) {
-  return detail::UnretainedWrapper<T>(o);
-}
-
-template <class ObjectT, class MethodT, class R, typename... Args>
-class MethodFunctor {
- public:
-  MethodFunctor(MethodT method, ObjectT* object, Args... args)
-      : method_(method), object_(object), args_(args...) {}
-  R operator()() const {
-    return CallMethod(typename sequence_generator<sizeof...(Args)>::type());
-  }
-
- private:
-  // Use sequence_generator (see template_util.h) to expand a MethodFunctor
-  // with 2 arguments to (std::get<0>(args_), std::get<1>(args_)), for
-  // instance.
-  template <int... S>
-  R CallMethod(sequence<S...>) const {
-    return (object_->*method_)(std::get<S>(args_)...);
-  }
-
-  MethodT method_;
-  typename detail::PointerType<ObjectT>::type object_;
-  typename std::tuple<typename std::remove_reference<Args>::type...> args_;
-};
-
-template <class ObjectT, class MethodT, class R, typename... Args>
-class UnretainedMethodFunctor {
- public:
-  UnretainedMethodFunctor(MethodT method,
-                          detail::UnretainedWrapper<ObjectT> object,
-                          Args... args)
-      : method_(method), object_(object.get()), args_(args...) {}
-  R operator()() const {
-    return CallMethod(typename sequence_generator<sizeof...(Args)>::type());
-  }
-
- private:
-  // Use sequence_generator (see template_util.h) to expand an
-  // UnretainedMethodFunctor with 2 arguments to (std::get<0>(args_),
-  // std::get<1>(args_)), for instance.
-  template <int... S>
-  R CallMethod(sequence<S...>) const {
-    return (object_->*method_)(std::get<S>(args_)...);
-  }
-
-  MethodT method_;
-  ObjectT* object_;
-  typename std::tuple<typename std::remove_reference<Args>::type...> args_;
-};
-
-template <class FunctorT, class R, typename... Args>
-class Functor {
- public:
-  Functor(const FunctorT& functor, Args... args)
-      : functor_(functor), args_(args...) {}
-  R operator()() const {
-    return CallFunction(typename sequence_generator<sizeof...(Args)>::type());
-  }
-
- private:
-  // Use sequence_generator (see template_util.h) to expand a Functor
-  // with 2 arguments to (std::get<0>(args_), std::get<1>(args_)), for
-  // instance.
-  template <int... S>
-  R CallFunction(sequence<S...>) const {
-    return functor_(std::get<S>(args_)...);
-  }
-
-  FunctorT functor_;
-  typename std::tuple<typename std::remove_reference<Args>::type...> args_;
-};
-
-#define FP_T(x) R (ObjectT::*x)(Args...)
-
-template <class ObjectT, class R, typename... Args>
-MethodFunctor<ObjectT, FP_T(NONAME), R, Args...> Bind(
-    FP_T(method),
-    ObjectT* object,
-    typename detail::identity<Args>::type... args) {
-  return MethodFunctor<ObjectT, FP_T(NONAME), R, Args...>(method, object,
-                                                          args...);
-}
-
-template <class ObjectT, class R, typename... Args>
-MethodFunctor<ObjectT, FP_T(NONAME), R, Args...> Bind(
-    FP_T(method),
-    const scoped_refptr<ObjectT>& object,
-    typename detail::identity<Args>::type... args) {
-  return MethodFunctor<ObjectT, FP_T(NONAME), R, Args...>(method, object.get(),
-                                                          args...);
-}
-
-template <class ObjectT, class R, typename... Args>
-UnretainedMethodFunctor<ObjectT, FP_T(NONAME), R, Args...> Bind(
-    FP_T(method),
-    detail::UnretainedWrapper<ObjectT> object,
-    typename detail::identity<Args>::type... args) {
-  return UnretainedMethodFunctor<ObjectT, FP_T(NONAME), R, Args...>(
-      method, object, args...);
-}
-
-#undef FP_T
-#define FP_T(x) R (ObjectT::*x)(Args...) const
-
-template <class ObjectT, class R, typename... Args>
-MethodFunctor<const ObjectT, FP_T(NONAME), R, Args...> Bind(
-    FP_T(method),
-    const ObjectT* object,
-    typename detail::identity<Args>::type... args) {
-  return MethodFunctor<const ObjectT, FP_T(NONAME), R, Args...>(method, object,
-                                                                args...);
-}
-template <class ObjectT, class R, typename... Args>
-UnretainedMethodFunctor<const ObjectT, FP_T(NONAME), R, Args...> Bind(
-    FP_T(method),
-    detail::UnretainedWrapper<const ObjectT> object,
-    typename detail::identity<Args>::type... args) {
-  return UnretainedMethodFunctor<const ObjectT, FP_T(NONAME), R, Args...>(
-      method, object, args...);
-}
-
-#undef FP_T
-#define FP_T(x) R (*x)(Args...)
-
-template <class R, typename... Args>
-Functor<FP_T(NONAME), R, Args...> Bind(
-    FP_T(function),
-    typename detail::identity<Args>::type... args) {
-  return Functor<FP_T(NONAME), R, Args...>(function, args...);
-}
-
-#undef FP_T
-
-}  // namespace rtc
-
-#undef NONAME
-
-#endif  // WEBRTC_RTC_BASE_BIND_H_
diff --git a/rtc_base/bind_unittest.cc b/rtc_base/bind_unittest.cc
deleted file mode 100644
index 64d6ee4..0000000
--- a/rtc_base/bind_unittest.cc
+++ /dev/null
@@ -1,222 +0,0 @@
-/*
- *  Copyright 2004 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 <type_traits>
-
-#include "webrtc/rtc_base/bind.h"
-#include "webrtc/rtc_base/gunit.h"
-
-#include "webrtc/rtc_base/refcount.h"
-
-namespace rtc {
-
-namespace {
-
-struct LifeTimeCheck;
-
-struct MethodBindTester {
-  void NullaryVoid() { ++call_count; }
-  int NullaryInt() { ++call_count; return 1; }
-  int NullaryConst() const { ++call_count; return 2; }
-  void UnaryVoid(int dummy) { ++call_count; }
-  template <class T> T Identity(T value) { ++call_count; return value; }
-  int UnaryByPointer(int* value) const {
-    ++call_count;
-    return ++(*value);
-  }
-  int UnaryByRef(const int& value) const {
-    ++call_count;
-    return ++const_cast<int&>(value);
-  }
-  int Multiply(int a, int b) const { ++call_count; return a * b; }
-  void RefArgument(const scoped_refptr<LifeTimeCheck>& object) {
-    EXPECT_TRUE(object.get() != nullptr);
-  }
-
-  mutable int call_count;
-};
-
-struct A { int dummy; };
-struct B: public RefCountInterface { int dummy; };
-struct C: public A, B {};
-struct D {
-  int AddRef();
-};
-struct E: public D {
-  int Release();
-};
-struct F {
-  void AddRef();
-  void Release();
-};
-
-struct LifeTimeCheck {
-  LifeTimeCheck() : ref_count_(0) {}
-  void AddRef() { ++ref_count_; }
-  void Release() { --ref_count_; }
-  void NullaryVoid() {}
-  int ref_count_;
-};
-
-int Return42() { return 42; }
-int Negate(int a) { return -a; }
-int Multiply(int a, int b) { return a * b; }
-
-}  // namespace
-
-// Try to catch any problem with scoped_refptr type deduction in rtc::Bind at
-// compile time.
-#define EXPECT_IS_CAPTURED_AS_PTR(T)                              \
-  static_assert(is_same<detail::PointerType<T>::type, T*>::value, \
-                "PointerType")
-#define EXPECT_IS_CAPTURED_AS_SCOPED_REFPTR(T)                        \
-  static_assert(                                                      \
-      is_same<detail::PointerType<T>::type, scoped_refptr<T>>::value, \
-      "PointerType")
-
-EXPECT_IS_CAPTURED_AS_PTR(void);
-EXPECT_IS_CAPTURED_AS_PTR(int);
-EXPECT_IS_CAPTURED_AS_PTR(double);
-EXPECT_IS_CAPTURED_AS_PTR(A);
-EXPECT_IS_CAPTURED_AS_PTR(D);
-EXPECT_IS_CAPTURED_AS_PTR(RefCountInterface*);
-EXPECT_IS_CAPTURED_AS_PTR(
-    decltype(Unretained<RefCountedObject<RefCountInterface>>));
-
-EXPECT_IS_CAPTURED_AS_SCOPED_REFPTR(RefCountInterface);
-EXPECT_IS_CAPTURED_AS_SCOPED_REFPTR(B);
-EXPECT_IS_CAPTURED_AS_SCOPED_REFPTR(C);
-EXPECT_IS_CAPTURED_AS_SCOPED_REFPTR(E);
-EXPECT_IS_CAPTURED_AS_SCOPED_REFPTR(F);
-EXPECT_IS_CAPTURED_AS_SCOPED_REFPTR(RefCountedObject<RefCountInterface>);
-EXPECT_IS_CAPTURED_AS_SCOPED_REFPTR(RefCountedObject<B>);
-EXPECT_IS_CAPTURED_AS_SCOPED_REFPTR(RefCountedObject<C>);
-EXPECT_IS_CAPTURED_AS_SCOPED_REFPTR(const RefCountedObject<RefCountInterface>);
-
-TEST(BindTest, BindToMethod) {
-  MethodBindTester object = {0};
-  EXPECT_EQ(0, object.call_count);
-  Bind(&MethodBindTester::NullaryVoid, &object)();
-  EXPECT_EQ(1, object.call_count);
-  EXPECT_EQ(1, Bind(&MethodBindTester::NullaryInt, &object)());
-  EXPECT_EQ(2, object.call_count);
-  EXPECT_EQ(2, Bind(&MethodBindTester::NullaryConst,
-                    static_cast<const MethodBindTester*>(&object))());
-  EXPECT_EQ(3, object.call_count);
-  Bind(&MethodBindTester::UnaryVoid, &object, 5)();
-  EXPECT_EQ(4, object.call_count);
-  EXPECT_EQ(100, Bind(&MethodBindTester::Identity<int>, &object, 100)());
-  EXPECT_EQ(5, object.call_count);
-  const std::string string_value("test string");
-  EXPECT_EQ(string_value, Bind(&MethodBindTester::Identity<std::string>,
-                               &object, string_value)());
-  EXPECT_EQ(6, object.call_count);
-  int value = 11;
-  // Bind binds by value, even if the method signature is by reference, so
-  // "reference" binds require pointers.
-  EXPECT_EQ(12, Bind(&MethodBindTester::UnaryByPointer, &object, &value)());
-  EXPECT_EQ(12, value);
-  EXPECT_EQ(7, object.call_count);
-  // It's possible to bind to a function that takes a const reference, though
-  // the capture will be a copy. See UnaryByRef hackery above where it removes
-  // the const to make sure the underlying storage is, in fact, a copy.
-  EXPECT_EQ(13, Bind(&MethodBindTester::UnaryByRef, &object, value)());
-  // But the original value is unmodified.
-  EXPECT_EQ(12, value);
-  EXPECT_EQ(8, object.call_count);
-  EXPECT_EQ(56, Bind(&MethodBindTester::Multiply, &object, 7, 8)());
-  EXPECT_EQ(9, object.call_count);
-}
-
-TEST(BindTest, BindToFunction) {
-  EXPECT_EQ(42, Bind(&Return42)());
-  EXPECT_EQ(3, Bind(&Negate, -3)());
-  EXPECT_EQ(56, Bind(&Multiply, 8, 7)());
-}
-
-// Test Bind where method object implements RefCountInterface and is passed as a
-// pointer.
-TEST(BindTest, CapturePointerAsScopedRefPtr) {
-  LifeTimeCheck object;
-  EXPECT_EQ(object.ref_count_, 0);
-  scoped_refptr<LifeTimeCheck> scoped_object(&object);
-  EXPECT_EQ(object.ref_count_, 1);
-  {
-    auto functor = Bind(&LifeTimeCheck::NullaryVoid, &object);
-    EXPECT_EQ(object.ref_count_, 2);
-    scoped_object = nullptr;
-    EXPECT_EQ(object.ref_count_, 1);
-  }
-  EXPECT_EQ(object.ref_count_, 0);
-}
-
-// Test Bind where method object implements RefCountInterface and is passed as a
-// scoped_refptr<>.
-TEST(BindTest, CaptureScopedRefPtrAsScopedRefPtr) {
-  LifeTimeCheck object;
-  EXPECT_EQ(object.ref_count_, 0);
-  scoped_refptr<LifeTimeCheck> scoped_object(&object);
-  EXPECT_EQ(object.ref_count_, 1);
-  {
-    auto functor = Bind(&LifeTimeCheck::NullaryVoid, scoped_object);
-    EXPECT_EQ(object.ref_count_, 2);
-    scoped_object = nullptr;
-    EXPECT_EQ(object.ref_count_, 1);
-  }
-  EXPECT_EQ(object.ref_count_, 0);
-}
-
-// Test Bind where method object is captured as scoped_refptr<> and the functor
-// dies while there are references left.
-TEST(BindTest, FunctorReleasesObjectOnDestruction) {
-  LifeTimeCheck object;
-  EXPECT_EQ(object.ref_count_, 0);
-  scoped_refptr<LifeTimeCheck> scoped_object(&object);
-  EXPECT_EQ(object.ref_count_, 1);
-  Bind(&LifeTimeCheck::NullaryVoid, &object)();
-  EXPECT_EQ(object.ref_count_, 1);
-  scoped_object = nullptr;
-  EXPECT_EQ(object.ref_count_, 0);
-}
-
-// Test Bind with scoped_refptr<> argument.
-TEST(BindTest, ScopedRefPointerArgument) {
-  LifeTimeCheck object;
-  EXPECT_EQ(object.ref_count_, 0);
-  scoped_refptr<LifeTimeCheck> scoped_object(&object);
-  EXPECT_EQ(object.ref_count_, 1);
-  {
-    MethodBindTester bind_tester;
-    auto functor =
-        Bind(&MethodBindTester::RefArgument, &bind_tester, scoped_object);
-    EXPECT_EQ(object.ref_count_, 2);
-  }
-  EXPECT_EQ(object.ref_count_, 1);
-  scoped_object = nullptr;
-  EXPECT_EQ(object.ref_count_, 0);
-}
-
-namespace {
-
-const int* Ref(const int& a) { return &a; }
-
-}  // anonymous namespace
-
-// Test Bind with non-scoped_refptr<> reference argument, which should be
-// modified to a non-reference capture.
-TEST(BindTest, RefArgument) {
-  const int x = 42;
-  EXPECT_EQ(&x, Ref(x));
-  // Bind() should make a copy of |x|, i.e. the pointers should be different.
-  auto functor = Bind(&Ref, x);
-  EXPECT_NE(&x, functor());
-}
-
-}  // namespace rtc
diff --git a/rtc_base/bitbuffer.cc b/rtc_base/bitbuffer.cc
deleted file mode 100644
index fec64e6..0000000
--- a/rtc_base/bitbuffer.cc
+++ /dev/null
@@ -1,310 +0,0 @@
-/*
- *  Copyright 2015 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/rtc_base/bitbuffer.h"
-
-#include <algorithm>
-#include <limits>
-
-#include "webrtc/rtc_base/checks.h"
-
-namespace {
-
-// Returns the lowest (right-most) |bit_count| bits in |byte|.
-uint8_t LowestBits(uint8_t byte, size_t bit_count) {
-  RTC_DCHECK_LE(bit_count, 8);
-  return byte & ((1 << bit_count) - 1);
-}
-
-// Returns the highest (left-most) |bit_count| bits in |byte|, shifted to the
-// lowest bits (to the right).
-uint8_t HighestBits(uint8_t byte, size_t bit_count) {
-  RTC_DCHECK_LE(bit_count, 8);
-  uint8_t shift = 8 - static_cast<uint8_t>(bit_count);
-  uint8_t mask = 0xFF << shift;
-  return (byte & mask) >> shift;
-}
-
-// Returns the highest byte of |val| in a uint8_t.
-uint8_t HighestByte(uint64_t val) {
-  return static_cast<uint8_t>(val >> 56);
-}
-
-// Returns the result of writing partial data from |source|, of
-// |source_bit_count| size in the highest bits, to |target| at
-// |target_bit_offset| from the highest bit.
-uint8_t WritePartialByte(uint8_t source,
-                         size_t source_bit_count,
-                         uint8_t target,
-                         size_t target_bit_offset) {
-  RTC_DCHECK(target_bit_offset < 8);
-  RTC_DCHECK(source_bit_count < 9);
-  RTC_DCHECK(source_bit_count <= (8 - target_bit_offset));
-  // Generate a mask for just the bits we're going to overwrite, so:
-  uint8_t mask =
-      // The number of bits we want, in the most significant bits...
-      static_cast<uint8_t>(0xFF << (8 - source_bit_count))
-      // ...shifted over to the target offset from the most signficant bit.
-      >> target_bit_offset;
-
-  // We want the target, with the bits we'll overwrite masked off, or'ed with
-  // the bits from the source we want.
-  return (target & ~mask) | (source >> target_bit_offset);
-}
-
-// Counts the number of bits used in the binary representation of val.
-size_t CountBits(uint64_t val) {
-  size_t bit_count = 0;
-  while (val != 0) {
-    bit_count++;
-    val >>= 1;
-  }
-  return bit_count;
-}
-
-}  // namespace
-
-namespace rtc {
-
-BitBuffer::BitBuffer(const uint8_t* bytes, size_t byte_count)
-    : bytes_(bytes), byte_count_(byte_count), byte_offset_(), bit_offset_() {
-  RTC_DCHECK(static_cast<uint64_t>(byte_count_) <=
-             std::numeric_limits<uint32_t>::max());
-}
-
-uint64_t BitBuffer::RemainingBitCount() const {
-  return (static_cast<uint64_t>(byte_count_) - byte_offset_) * 8 - bit_offset_;
-}
-
-bool BitBuffer::ReadUInt8(uint8_t* val) {
-  uint32_t bit_val;
-  if (!ReadBits(&bit_val, sizeof(uint8_t) * 8)) {
-    return false;
-  }
-  RTC_DCHECK(bit_val <= std::numeric_limits<uint8_t>::max());
-  *val = static_cast<uint8_t>(bit_val);
-  return true;
-}
-
-bool BitBuffer::ReadUInt16(uint16_t* val) {
-  uint32_t bit_val;
-  if (!ReadBits(&bit_val, sizeof(uint16_t) * 8)) {
-    return false;
-  }
-  RTC_DCHECK(bit_val <= std::numeric_limits<uint16_t>::max());
-  *val = static_cast<uint16_t>(bit_val);
-  return true;
-}
-
-bool BitBuffer::ReadUInt32(uint32_t* val) {
-  return ReadBits(val, sizeof(uint32_t) * 8);
-}
-
-bool BitBuffer::PeekBits(uint32_t* val, size_t bit_count) {
-  if (!val || bit_count > RemainingBitCount() || bit_count > 32) {
-    return false;
-  }
-  const uint8_t* bytes = bytes_ + byte_offset_;
-  size_t remaining_bits_in_current_byte = 8 - bit_offset_;
-  uint32_t bits = LowestBits(*bytes++, remaining_bits_in_current_byte);
-  // If we're reading fewer bits than what's left in the current byte, just
-  // return the portion of this byte that we need.
-  if (bit_count < remaining_bits_in_current_byte) {
-    *val = HighestBits(bits, bit_offset_ + bit_count);
-    return true;
-  }
-  // Otherwise, subtract what we've read from the bit count and read as many
-  // full bytes as we can into bits.
-  bit_count -= remaining_bits_in_current_byte;
-  while (bit_count >= 8) {
-    bits = (bits << 8) | *bytes++;
-    bit_count -= 8;
-  }
-  // Whatever we have left is smaller than a byte, so grab just the bits we need
-  // and shift them into the lowest bits.
-  if (bit_count > 0) {
-    bits <<= bit_count;
-    bits |= HighestBits(*bytes, bit_count);
-  }
-  *val = bits;
-  return true;
-}
-
-bool BitBuffer::ReadBits(uint32_t* val, size_t bit_count) {
-  return PeekBits(val, bit_count) && ConsumeBits(bit_count);
-}
-
-bool BitBuffer::ConsumeBytes(size_t byte_count) {
-  return ConsumeBits(byte_count * 8);
-}
-
-bool BitBuffer::ConsumeBits(size_t bit_count) {
-  if (bit_count > RemainingBitCount()) {
-    return false;
-  }
-
-  byte_offset_ += (bit_offset_ + bit_count) / 8;
-  bit_offset_ = (bit_offset_ + bit_count) % 8;
-  return true;
-}
-
-bool BitBuffer::ReadExponentialGolomb(uint32_t* val) {
-  if (!val) {
-    return false;
-  }
-  // Store off the current byte/bit offset, in case we want to restore them due
-  // to a failed parse.
-  size_t original_byte_offset = byte_offset_;
-  size_t original_bit_offset = bit_offset_;
-
-  // Count the number of leading 0 bits by peeking/consuming them one at a time.
-  size_t zero_bit_count = 0;
-  uint32_t peeked_bit;
-  while (PeekBits(&peeked_bit, 1) && peeked_bit == 0) {
-    zero_bit_count++;
-    ConsumeBits(1);
-  }
-
-  // We should either be at the end of the stream, or the next bit should be 1.
-  RTC_DCHECK(!PeekBits(&peeked_bit, 1) || peeked_bit == 1);
-
-  // The bit count of the value is the number of zeros + 1. Make sure that many
-  // bits fits in a uint32_t and that we have enough bits left for it, and then
-  // read the value.
-  size_t value_bit_count = zero_bit_count + 1;
-  if (value_bit_count > 32 || !ReadBits(val, value_bit_count)) {
-    RTC_CHECK(Seek(original_byte_offset, original_bit_offset));
-    return false;
-  }
-  *val -= 1;
-  return true;
-}
-
-bool BitBuffer::ReadSignedExponentialGolomb(int32_t* val) {
-  uint32_t unsigned_val;
-  if (!ReadExponentialGolomb(&unsigned_val)) {
-    return false;
-  }
-  if ((unsigned_val & 1) == 0) {
-    *val = -static_cast<int32_t>(unsigned_val / 2);
-  } else {
-    *val = (unsigned_val + 1) / 2;
-  }
-  return true;
-}
-
-void BitBuffer::GetCurrentOffset(
-    size_t* out_byte_offset, size_t* out_bit_offset) {
-  RTC_CHECK(out_byte_offset != nullptr);
-  RTC_CHECK(out_bit_offset != nullptr);
-  *out_byte_offset = byte_offset_;
-  *out_bit_offset = bit_offset_;
-}
-
-bool BitBuffer::Seek(size_t byte_offset, size_t bit_offset) {
-  if (byte_offset > byte_count_ || bit_offset > 7 ||
-      (byte_offset == byte_count_ && bit_offset > 0)) {
-    return false;
-  }
-  byte_offset_ = byte_offset;
-  bit_offset_ = bit_offset;
-  return true;
-}
-
-BitBufferWriter::BitBufferWriter(uint8_t* bytes, size_t byte_count)
-    : BitBuffer(bytes, byte_count), writable_bytes_(bytes) {
-}
-
-bool BitBufferWriter::WriteUInt8(uint8_t val) {
-  return WriteBits(val, sizeof(uint8_t) * 8);
-}
-
-bool BitBufferWriter::WriteUInt16(uint16_t val) {
-  return WriteBits(val, sizeof(uint16_t) * 8);
-}
-
-bool BitBufferWriter::WriteUInt32(uint32_t val) {
-  return WriteBits(val, sizeof(uint32_t) * 8);
-}
-
-bool BitBufferWriter::WriteBits(uint64_t val, size_t bit_count) {
-  if (bit_count > RemainingBitCount()) {
-    return false;
-  }
-  size_t total_bits = bit_count;
-
-  // For simplicity, push the bits we want to read from val to the highest bits.
-  val <<= (sizeof(uint64_t) * 8 - bit_count);
-
-  uint8_t* bytes = writable_bytes_ + byte_offset_;
-
-  // The first byte is relatively special; the bit offset to write to may put us
-  // in the middle of the byte, and the total bit count to write may require we
-  // save the bits at the end of the byte.
-  size_t remaining_bits_in_current_byte = 8 - bit_offset_;
-  size_t bits_in_first_byte =
-      std::min(bit_count, remaining_bits_in_current_byte);
-  *bytes = WritePartialByte(
-      HighestByte(val), bits_in_first_byte, *bytes, bit_offset_);
-  if (bit_count <= remaining_bits_in_current_byte) {
-    // Nothing left to write, so quit early.
-    return ConsumeBits(total_bits);
-  }
-
-  // Subtract what we've written from the bit count, shift it off the value, and
-  // write the remaining full bytes.
-  val <<= bits_in_first_byte;
-  bytes++;
-  bit_count -= bits_in_first_byte;
-  while (bit_count >= 8) {
-    *bytes++ = HighestByte(val);
-    val <<= 8;
-    bit_count -= 8;
-  }
-
-  // Last byte may also be partial, so write the remaining bits from the top of
-  // val.
-  if (bit_count > 0) {
-    *bytes = WritePartialByte(HighestByte(val), bit_count, *bytes, 0);
-  }
-
-  // All done! Consume the bits we've written.
-  return ConsumeBits(total_bits);
-}
-
-bool BitBufferWriter::WriteExponentialGolomb(uint32_t val) {
-  // We don't support reading UINT32_MAX, because it doesn't fit in a uint32_t
-  // when encoded, so don't support writing it either.
-  if (val == std::numeric_limits<uint32_t>::max()) {
-    return false;
-  }
-  uint64_t val_to_encode = static_cast<uint64_t>(val) + 1;
-
-  // We need to write CountBits(val+1) 0s and then val+1. Since val (as a
-  // uint64_t) has leading zeros, we can just write the total golomb encoded
-  // size worth of bits, knowing the value will appear last.
-  return WriteBits(val_to_encode, CountBits(val_to_encode) * 2 - 1);
-}
-
-bool BitBufferWriter::WriteSignedExponentialGolomb(int32_t val) {
-  if (val == 0) {
-    return WriteExponentialGolomb(0);
-  } else if (val > 0) {
-    uint32_t signed_val = val;
-    return WriteExponentialGolomb((signed_val * 2) - 1);
-  } else {
-    if (val == std::numeric_limits<int32_t>::min())
-      return false;  // Not supported, would cause overflow.
-    uint32_t signed_val = -val;
-    return WriteExponentialGolomb(signed_val * 2);
-  }
-}
-
-}  // namespace rtc
diff --git a/rtc_base/bitbuffer.h b/rtc_base/bitbuffer.h
deleted file mode 100644
index 03e8ff9..0000000
--- a/rtc_base/bitbuffer.h
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
- *  Copyright 2015 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_RTC_BASE_BITBUFFER_H_
-#define WEBRTC_RTC_BASE_BITBUFFER_H_
-
-#include <stdint.h>  // For integer types.
-#include <stddef.h>  // For size_t.
-
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace rtc {
-
-// A class, similar to ByteBuffer, that can parse bit-sized data out of a set of
-// bytes. Has a similar API to ByteBuffer, plus methods for reading bit-sized
-// and exponential golomb encoded data. For a writable version, use
-// BitBufferWriter. Unlike ByteBuffer, this class doesn't make a copy of the
-// source bytes, so it can be used on read-only data.
-// Sizes/counts specify bits/bytes, for clarity.
-// Byte order is assumed big-endian/network.
-class BitBuffer {
- public:
-  BitBuffer(const uint8_t* bytes, size_t byte_count);
-
-  // Gets the current offset, in bytes/bits, from the start of the buffer. The
-  // bit offset is the offset into the current byte, in the range [0,7].
-  void GetCurrentOffset(size_t* out_byte_offset, size_t* out_bit_offset);
-
-  // The remaining bits in the byte buffer.
-  uint64_t RemainingBitCount() const;
-
-  // Reads byte-sized values from the buffer. Returns false if there isn't
-  // enough data left for the specified type.
-  bool ReadUInt8(uint8_t* val);
-  bool ReadUInt16(uint16_t* val);
-  bool ReadUInt32(uint32_t* val);
-
-  // Reads bit-sized values from the buffer. Returns false if there isn't enough
-  // data left for the specified bit count..
-  bool ReadBits(uint32_t* val, size_t bit_count);
-
-  // Peeks bit-sized values from the buffer. Returns false if there isn't enough
-  // data left for the specified number of bits. Doesn't move the current
-  // offset.
-  bool PeekBits(uint32_t* val, size_t bit_count);
-
-  // Reads the exponential golomb encoded value at the current offset.
-  // Exponential golomb values are encoded as:
-  // 1) x = source val + 1
-  // 2) In binary, write [countbits(x) - 1] 0s, then x
-  // To decode, we count the number of leading 0 bits, read that many + 1 bits,
-  // and increment the result by 1.
-  // Returns false if there isn't enough data left for the specified type, or if
-  // the value wouldn't fit in a uint32_t.
-  bool ReadExponentialGolomb(uint32_t* val);
-  // Reads signed exponential golomb values at the current offset. Signed
-  // exponential golomb values are just the unsigned values mapped to the
-  // sequence 0, 1, -1, 2, -2, etc. in order.
-  bool ReadSignedExponentialGolomb(int32_t* val);
-
-  // Moves current position |byte_count| bytes forward. Returns false if
-  // there aren't enough bytes left in the buffer.
-  bool ConsumeBytes(size_t byte_count);
-  // Moves current position |bit_count| bits forward. Returns false if
-  // there aren't enough bits left in the buffer.
-  bool ConsumeBits(size_t bit_count);
-
-  // Sets the current offset to the provied byte/bit offsets. The bit
-  // offset is from the given byte, in the range [0,7].
-  bool Seek(size_t byte_offset, size_t bit_offset);
-
- protected:
-  const uint8_t* const bytes_;
-  // The total size of |bytes_|.
-  size_t byte_count_;
-  // The current offset, in bytes, from the start of |bytes_|.
-  size_t byte_offset_;
-  // The current offset, in bits, into the current byte.
-  size_t bit_offset_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(BitBuffer);
-};
-
-// A BitBuffer API for write operations. Supports symmetric write APIs to the
-// reading APIs of BitBuffer. Note that the read/write offset is shared with the
-// BitBuffer API, so both reading and writing will consume bytes/bits.
-class BitBufferWriter : public BitBuffer {
- public:
-  // Constructs a bit buffer for the writable buffer of |bytes|.
-  BitBufferWriter(uint8_t* bytes, size_t byte_count);
-
-  // Writes byte-sized values from the buffer. Returns false if there isn't
-  // enough data left for the specified type.
-  bool WriteUInt8(uint8_t val);
-  bool WriteUInt16(uint16_t val);
-  bool WriteUInt32(uint32_t val);
-
-  // Writes bit-sized values to the buffer. Returns false if there isn't enough
-  // room left for the specified number of bits.
-  bool WriteBits(uint64_t val, size_t bit_count);
-
-  // Writes the exponential golomb encoded version of the supplied value.
-  // Returns false if there isn't enough room left for the value.
-  bool WriteExponentialGolomb(uint32_t val);
-  // Writes the signed exponential golomb version of the supplied value.
-  // Signed exponential golomb values are just the unsigned values mapped to the
-  // sequence 0, 1, -1, 2, -2, etc. in order.
-  bool WriteSignedExponentialGolomb(int32_t val);
-
- private:
-  // The buffer, as a writable array.
-  uint8_t* const writable_bytes_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(BitBufferWriter);
-};
-
-}  // namespace rtc
-
-#endif  // WEBRTC_RTC_BASE_BITBUFFER_H_
diff --git a/rtc_base/bitbuffer_unittest.cc b/rtc_base/bitbuffer_unittest.cc
deleted file mode 100644
index b9d6155..0000000
--- a/rtc_base/bitbuffer_unittest.cc
+++ /dev/null
@@ -1,329 +0,0 @@
-/*
- *  Copyright 2015 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/rtc_base/bitbuffer.h"
-#include "webrtc/rtc_base/arraysize.h"
-#include "webrtc/rtc_base/bytebuffer.h"
-#include "webrtc/rtc_base/gunit.h"
-
-namespace rtc {
-
-TEST(BitBufferTest, ConsumeBits) {
-  const uint8_t bytes[64] = {0};
-  BitBuffer buffer(bytes, 32);
-  uint64_t total_bits = 32 * 8;
-  EXPECT_EQ(total_bits, buffer.RemainingBitCount());
-  EXPECT_TRUE(buffer.ConsumeBits(3));
-  total_bits -= 3;
-  EXPECT_EQ(total_bits, buffer.RemainingBitCount());
-  EXPECT_TRUE(buffer.ConsumeBits(3));
-  total_bits -= 3;
-  EXPECT_EQ(total_bits, buffer.RemainingBitCount());
-  EXPECT_TRUE(buffer.ConsumeBits(15));
-  total_bits -= 15;
-  EXPECT_EQ(total_bits, buffer.RemainingBitCount());
-  EXPECT_TRUE(buffer.ConsumeBits(37));
-  total_bits -= 37;
-  EXPECT_EQ(total_bits, buffer.RemainingBitCount());
-
-  EXPECT_FALSE(buffer.ConsumeBits(32 * 8));
-  EXPECT_EQ(total_bits, buffer.RemainingBitCount());
-}
-
-TEST(BitBufferTest, ReadBytesAligned) {
-  const uint8_t bytes[] = {0x0A, 0xBC, 0xDE, 0xF1, 0x23, 0x45, 0x67, 0x89};
-  uint8_t val8;
-  uint16_t val16;
-  uint32_t val32;
-  BitBuffer buffer(bytes, 8);
-  EXPECT_TRUE(buffer.ReadUInt8(&val8));
-  EXPECT_EQ(0x0Au, val8);
-  EXPECT_TRUE(buffer.ReadUInt8(&val8));
-  EXPECT_EQ(0xBCu, val8);
-  EXPECT_TRUE(buffer.ReadUInt16(&val16));
-  EXPECT_EQ(0xDEF1u, val16);
-  EXPECT_TRUE(buffer.ReadUInt32(&val32));
-  EXPECT_EQ(0x23456789u, val32);
-}
-
-TEST(BitBufferTest, ReadBytesOffset4) {
-  const uint8_t bytes[] = {0x0A, 0xBC, 0xDE, 0xF1, 0x23,
-                           0x45, 0x67, 0x89, 0x0A};
-  uint8_t val8;
-  uint16_t val16;
-  uint32_t val32;
-  BitBuffer buffer(bytes, 9);
-  EXPECT_TRUE(buffer.ConsumeBits(4));
-
-  EXPECT_TRUE(buffer.ReadUInt8(&val8));
-  EXPECT_EQ(0xABu, val8);
-  EXPECT_TRUE(buffer.ReadUInt8(&val8));
-  EXPECT_EQ(0xCDu, val8);
-  EXPECT_TRUE(buffer.ReadUInt16(&val16));
-  EXPECT_EQ(0xEF12u, val16);
-  EXPECT_TRUE(buffer.ReadUInt32(&val32));
-  EXPECT_EQ(0x34567890u, val32);
-}
-
-TEST(BitBufferTest, ReadBytesOffset3) {
-  // The pattern we'll check against is counting down from 0b1111. It looks
-  // weird here because it's all offset by 3.
-  // Byte pattern is:
-  //    56701234
-  //  0b00011111,
-  //  0b11011011,
-  //  0b10010111,
-  //  0b01010011,
-  //  0b00001110,
-  //  0b11001010,
-  //  0b10000110,
-  //  0b01000010
-  //       xxxxx <-- last 5 bits unused.
-
-  // The bytes. It almost looks like counting down by two at a time, except the
-  // jump at 5->3->0, since that's when the high bit is turned off.
-  const uint8_t bytes[] = {0x1F, 0xDB, 0x97, 0x53, 0x0E, 0xCA, 0x86, 0x42};
-
-  uint8_t val8;
-  uint16_t val16;
-  uint32_t val32;
-  BitBuffer buffer(bytes, 8);
-  EXPECT_TRUE(buffer.ConsumeBits(3));
-  EXPECT_TRUE(buffer.ReadUInt8(&val8));
-  EXPECT_EQ(0xFEu, val8);
-  EXPECT_TRUE(buffer.ReadUInt16(&val16));
-  EXPECT_EQ(0xDCBAu, val16);
-  EXPECT_TRUE(buffer.ReadUInt32(&val32));
-  EXPECT_EQ(0x98765432u, val32);
-  // 5 bits left unread. Not enough to read a uint8_t.
-  EXPECT_EQ(5u, buffer.RemainingBitCount());
-  EXPECT_FALSE(buffer.ReadUInt8(&val8));
-}
-
-TEST(BitBufferTest, ReadBits) {
-  // Bit values are:
-  //  0b01001101,
-  //  0b00110010
-  const uint8_t bytes[] = {0x4D, 0x32};
-  uint32_t val;
-  BitBuffer buffer(bytes, 2);
-  EXPECT_TRUE(buffer.ReadBits(&val, 3));
-  // 0b010
-  EXPECT_EQ(0x2u, val);
-  EXPECT_TRUE(buffer.ReadBits(&val, 2));
-  // 0b01
-  EXPECT_EQ(0x1u, val);
-  EXPECT_TRUE(buffer.ReadBits(&val, 7));
-  // 0b1010011
-  EXPECT_EQ(0x53u, val);
-  EXPECT_TRUE(buffer.ReadBits(&val, 2));
-  // 0b00
-  EXPECT_EQ(0x0u, val);
-  EXPECT_TRUE(buffer.ReadBits(&val, 1));
-  // 0b1
-  EXPECT_EQ(0x1u, val);
-  EXPECT_TRUE(buffer.ReadBits(&val, 1));
-  // 0b0
-  EXPECT_EQ(0x0u, val);
-
-  EXPECT_FALSE(buffer.ReadBits(&val, 1));
-}
-
-TEST(BitBufferTest, SetOffsetValues) {
-  uint8_t bytes[4] = {0};
-  BitBufferWriter buffer(bytes, 4);
-
-  size_t byte_offset, bit_offset;
-  // Bit offsets are [0,7].
-  EXPECT_TRUE(buffer.Seek(0, 0));
-  EXPECT_TRUE(buffer.Seek(0, 7));
-  buffer.GetCurrentOffset(&byte_offset, &bit_offset);
-  EXPECT_EQ(0u, byte_offset);
-  EXPECT_EQ(7u, bit_offset);
-  EXPECT_FALSE(buffer.Seek(0, 8));
-  buffer.GetCurrentOffset(&byte_offset, &bit_offset);
-  EXPECT_EQ(0u, byte_offset);
-  EXPECT_EQ(7u, bit_offset);
-  // Byte offsets are [0,length]. At byte offset length, the bit offset must be
-  // 0.
-  EXPECT_TRUE(buffer.Seek(0, 0));
-  EXPECT_TRUE(buffer.Seek(2, 4));
-  buffer.GetCurrentOffset(&byte_offset, &bit_offset);
-  EXPECT_EQ(2u, byte_offset);
-  EXPECT_EQ(4u, bit_offset);
-  EXPECT_TRUE(buffer.Seek(4, 0));
-  EXPECT_FALSE(buffer.Seek(5, 0));
-  buffer.GetCurrentOffset(&byte_offset, &bit_offset);
-  EXPECT_EQ(4u, byte_offset);
-  EXPECT_EQ(0u, bit_offset);
-  EXPECT_FALSE(buffer.Seek(4, 1));
-
-  // Disable death test on Android because it relies on fork() and doesn't play
-  // nicely.
-#if GTEST_HAS_DEATH_TEST
-#if !defined(WEBRTC_ANDROID)
-  // Passing a null out parameter is death.
-  EXPECT_DEATH(buffer.GetCurrentOffset(&byte_offset, nullptr), "");
-#endif
-#endif
-}
-
-uint64_t GolombEncoded(uint32_t val) {
-  val++;
-  uint32_t bit_counter = val;
-  uint64_t bit_count = 0;
-  while (bit_counter > 0) {
-    bit_count++;
-    bit_counter >>= 1;
-  }
-  return static_cast<uint64_t>(val) << (64 - (bit_count * 2 - 1));
-}
-
-TEST(BitBufferTest, GolombUint32Values) {
-  ByteBufferWriter byteBuffer;
-  byteBuffer.Resize(16);
-  BitBuffer buffer(reinterpret_cast<const uint8_t*>(byteBuffer.Data()),
-                   byteBuffer.Capacity());
-  // Test over the uint32_t range with a large enough step that the test doesn't
-  // take forever. Around 20,000 iterations should do.
-  const int kStep = std::numeric_limits<uint32_t>::max() / 20000;
-  for (uint32_t i = 0; i < std::numeric_limits<uint32_t>::max() - kStep;
-       i += kStep) {
-    uint64_t encoded_val = GolombEncoded(i);
-    byteBuffer.Clear();
-    byteBuffer.WriteUInt64(encoded_val);
-    uint32_t decoded_val;
-    EXPECT_TRUE(buffer.Seek(0, 0));
-    EXPECT_TRUE(buffer.ReadExponentialGolomb(&decoded_val));
-    EXPECT_EQ(i, decoded_val);
-  }
-}
-
-TEST(BitBufferTest, SignedGolombValues) {
-  uint8_t golomb_bits[] = {
-      0x80,  // 1
-      0x40,  // 010
-      0x60,  // 011
-      0x20,  // 00100
-      0x38,  // 00111
-  };
-  int32_t expected[] = {0, 1, -1, 2, -3};
-  for (size_t i = 0; i < sizeof(golomb_bits); ++i) {
-    BitBuffer buffer(&golomb_bits[i], 1);
-    int32_t decoded_val;
-    ASSERT_TRUE(buffer.ReadSignedExponentialGolomb(&decoded_val));
-    EXPECT_EQ(expected[i], decoded_val)
-        << "Mismatch in expected/decoded value for golomb_bits[" << i
-        << "]: " << static_cast<int>(golomb_bits[i]);
-  }
-}
-
-TEST(BitBufferTest, NoGolombOverread) {
-  const uint8_t bytes[] = {0x00, 0xFF, 0xFF};
-  // Make sure the bit buffer correctly enforces byte length on golomb reads.
-  // If it didn't, the above buffer would be valid at 3 bytes.
-  BitBuffer buffer(bytes, 1);
-  uint32_t decoded_val;
-  EXPECT_FALSE(buffer.ReadExponentialGolomb(&decoded_val));
-
-  BitBuffer longer_buffer(bytes, 2);
-  EXPECT_FALSE(longer_buffer.ReadExponentialGolomb(&decoded_val));
-
-  BitBuffer longest_buffer(bytes, 3);
-  EXPECT_TRUE(longest_buffer.ReadExponentialGolomb(&decoded_val));
-  // Golomb should have read 9 bits, so 0x01FF, and since it is golomb, the
-  // result is 0x01FF - 1 = 0x01FE.
-  EXPECT_EQ(0x01FEu, decoded_val);
-}
-
-TEST(BitBufferWriterTest, SymmetricReadWrite) {
-  uint8_t bytes[16] = {0};
-  BitBufferWriter buffer(bytes, 4);
-
-  // Write some bit data at various sizes.
-  EXPECT_TRUE(buffer.WriteBits(0x2u, 3));
-  EXPECT_TRUE(buffer.WriteBits(0x1u, 2));
-  EXPECT_TRUE(buffer.WriteBits(0x53u, 7));
-  EXPECT_TRUE(buffer.WriteBits(0x0u, 2));
-  EXPECT_TRUE(buffer.WriteBits(0x1u, 1));
-  EXPECT_TRUE(buffer.WriteBits(0x1ABCDu, 17));
-  // That should be all that fits in the buffer.
-  EXPECT_FALSE(buffer.WriteBits(1, 1));
-
-  EXPECT_TRUE(buffer.Seek(0, 0));
-  uint32_t val;
-  EXPECT_TRUE(buffer.ReadBits(&val, 3));
-  EXPECT_EQ(0x2u, val);
-  EXPECT_TRUE(buffer.ReadBits(&val, 2));
-  EXPECT_EQ(0x1u, val);
-  EXPECT_TRUE(buffer.ReadBits(&val, 7));
-  EXPECT_EQ(0x53u, val);
-  EXPECT_TRUE(buffer.ReadBits(&val, 2));
-  EXPECT_EQ(0x0u, val);
-  EXPECT_TRUE(buffer.ReadBits(&val, 1));
-  EXPECT_EQ(0x1u, val);
-  EXPECT_TRUE(buffer.ReadBits(&val, 17));
-  EXPECT_EQ(0x1ABCDu, val);
-  // And there should be nothing left.
-  EXPECT_FALSE(buffer.ReadBits(&val, 1));
-}
-
-TEST(BitBufferWriterTest, SymmetricBytesMisaligned) {
-  uint8_t bytes[16] = {0};
-  BitBufferWriter buffer(bytes, 16);
-
-  // Offset 3, to get things misaligned.
-  EXPECT_TRUE(buffer.ConsumeBits(3));
-  EXPECT_TRUE(buffer.WriteUInt8(0x12u));
-  EXPECT_TRUE(buffer.WriteUInt16(0x3456u));
-  EXPECT_TRUE(buffer.WriteUInt32(0x789ABCDEu));
-
-  buffer.Seek(0, 3);
-  uint8_t val8;
-  uint16_t val16;
-  uint32_t val32;
-  EXPECT_TRUE(buffer.ReadUInt8(&val8));
-  EXPECT_EQ(0x12u, val8);
-  EXPECT_TRUE(buffer.ReadUInt16(&val16));
-  EXPECT_EQ(0x3456u, val16);
-  EXPECT_TRUE(buffer.ReadUInt32(&val32));
-  EXPECT_EQ(0x789ABCDEu, val32);
-}
-
-TEST(BitBufferWriterTest, SymmetricGolomb) {
-  char test_string[] = "my precious";
-  uint8_t bytes[64] = {0};
-  BitBufferWriter buffer(bytes, 64);
-  for (size_t i = 0; i < arraysize(test_string); ++i) {
-    EXPECT_TRUE(buffer.WriteExponentialGolomb(test_string[i]));
-  }
-  buffer.Seek(0, 0);
-  for (size_t i = 0; i < arraysize(test_string); ++i) {
-    uint32_t val;
-    EXPECT_TRUE(buffer.ReadExponentialGolomb(&val));
-    EXPECT_LE(val, std::numeric_limits<uint8_t>::max());
-    EXPECT_EQ(test_string[i], static_cast<char>(val));
-  }
-}
-
-TEST(BitBufferWriterTest, WriteClearsBits) {
-  uint8_t bytes[] = {0xFF, 0xFF};
-  BitBufferWriter buffer(bytes, 2);
-  EXPECT_TRUE(buffer.ConsumeBits(3));
-  EXPECT_TRUE(buffer.WriteBits(0, 1));
-  EXPECT_EQ(0xEFu, bytes[0]);
-  EXPECT_TRUE(buffer.WriteBits(0, 3));
-  EXPECT_EQ(0xE1u, bytes[0]);
-  EXPECT_TRUE(buffer.WriteBits(0, 2));
-  EXPECT_EQ(0xE0u, bytes[0]);
-  EXPECT_EQ(0x7F, bytes[1]);
-}
-
-}  // namespace rtc
diff --git a/rtc_base/buffer.h b/rtc_base/buffer.h
deleted file mode 100644
index b8fe98c..0000000
--- a/rtc_base/buffer.h
+++ /dev/null
@@ -1,383 +0,0 @@
-/*
- *  Copyright 2004 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_RTC_BASE_BUFFER_H_
-#define WEBRTC_RTC_BASE_BUFFER_H_
-
-#include <algorithm>
-#include <cstring>
-#include <memory>
-#include <type_traits>
-#include <utility>
-
-#include "webrtc/api/array_view.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/type_traits.h"
-
-namespace rtc {
-
-namespace internal {
-
-// (Internal; please don't use outside this file.) Determines if elements of
-// type U are compatible with a BufferT<T>. For most types, we just ignore
-// top-level const and forbid top-level volatile and require T and U to be
-// otherwise equal, but all byte-sized integers (notably char, int8_t, and
-// uint8_t) are compatible with each other. (Note: We aim to get rid of this
-// behavior, and treat all types the same.)
-template <typename T, typename U>
-struct BufferCompat {
-  static constexpr bool value =
-      !std::is_volatile<U>::value &&
-      ((std::is_integral<T>::value && sizeof(T) == 1)
-           ? (std::is_integral<U>::value && sizeof(U) == 1)
-           : (std::is_same<T, typename std::remove_const<U>::type>::value));
-};
-
-}  // namespace internal
-
-// Basic buffer class, can be grown and shrunk dynamically.
-// Unlike std::string/vector, does not initialize data when increasing size.
-template <typename T>
-class BufferT {
-  // We want T's destructor and default constructor to be trivial, i.e. perform
-  // no action, so that we don't have to touch the memory we allocate and
-  // deallocate. And we want T to be trivially copyable, so that we can copy T
-  // instances with std::memcpy. This is precisely the definition of a trivial
-  // type.
-  static_assert(std::is_trivial<T>::value, "T must be a trivial type.");
-
-  // This class relies heavily on being able to mutate its data.
-  static_assert(!std::is_const<T>::value, "T may not be const");
-
- public:
-  using value_type = T;
-
-  // An empty BufferT.
-  BufferT() : size_(0), capacity_(0), data_(nullptr) {
-    RTC_DCHECK(IsConsistent());
-  }
-
-  // Disable copy construction and copy assignment, since copying a buffer is
-  // expensive enough that we want to force the user to be explicit about it.
-  BufferT(const BufferT&) = delete;
-  BufferT& operator=(const BufferT&) = delete;
-
-  BufferT(BufferT&& buf)
-      : size_(buf.size()),
-        capacity_(buf.capacity()),
-        data_(std::move(buf.data_)) {
-    RTC_DCHECK(IsConsistent());
-    buf.OnMovedFrom();
-  }
-
-  // Construct a buffer with the specified number of uninitialized elements.
-  explicit BufferT(size_t size) : BufferT(size, size) {}
-
-  BufferT(size_t size, size_t capacity)
-      : size_(size),
-        capacity_(std::max(size, capacity)),
-        data_(new T[capacity_]) {
-    RTC_DCHECK(IsConsistent());
-  }
-
-  // Construct a buffer and copy the specified number of elements into it.
-  template <typename U,
-            typename std::enable_if<
-                internal::BufferCompat<T, U>::value>::type* = nullptr>
-  BufferT(const U* data, size_t size) : BufferT(data, size, size) {}
-
-  template <typename U,
-            typename std::enable_if<
-                internal::BufferCompat<T, U>::value>::type* = nullptr>
-  BufferT(U* data, size_t size, size_t capacity) : BufferT(size, capacity) {
-    static_assert(sizeof(T) == sizeof(U), "");
-    std::memcpy(data_.get(), data, size * sizeof(U));
-  }
-
-  // Construct a buffer from the contents of an array.
-  template <typename U,
-            size_t N,
-            typename std::enable_if<
-                internal::BufferCompat<T, U>::value>::type* = nullptr>
-  BufferT(U (&array)[N]) : BufferT(array, N) {}
-
-  // Get a pointer to the data. Just .data() will give you a (const) T*, but if
-  // T is a byte-sized integer, you may also use .data<U>() for any other
-  // byte-sized integer U.
-  template <typename U = T,
-            typename std::enable_if<
-                internal::BufferCompat<T, U>::value>::type* = nullptr>
-  const U* data() const {
-    RTC_DCHECK(IsConsistent());
-    return reinterpret_cast<U*>(data_.get());
-  }
-
-  template <typename U = T,
-            typename std::enable_if<
-                internal::BufferCompat<T, U>::value>::type* = nullptr>
-  U* data() {
-    RTC_DCHECK(IsConsistent());
-    return reinterpret_cast<U*>(data_.get());
-  }
-
-  bool empty() const {
-    RTC_DCHECK(IsConsistent());
-    return size_ == 0;
-  }
-
-  size_t size() const {
-    RTC_DCHECK(IsConsistent());
-    return size_;
-  }
-
-  size_t capacity() const {
-    RTC_DCHECK(IsConsistent());
-    return capacity_;
-  }
-
-  BufferT& operator=(BufferT&& buf) {
-    RTC_DCHECK(IsConsistent());
-    RTC_DCHECK(buf.IsConsistent());
-    size_ = buf.size_;
-    capacity_ = buf.capacity_;
-    data_ = std::move(buf.data_);
-    buf.OnMovedFrom();
-    return *this;
-  }
-
-  bool operator==(const BufferT& buf) const {
-    RTC_DCHECK(IsConsistent());
-    if (size_ != buf.size_) {
-      return false;
-    }
-    if (std::is_integral<T>::value) {
-      // Optimization.
-      return std::memcmp(data_.get(), buf.data_.get(), size_ * sizeof(T)) == 0;
-    }
-    for (size_t i = 0; i < size_; ++i) {
-      if (data_[i] != buf.data_[i]) {
-        return false;
-      }
-    }
-    return true;
-  }
-
-  bool operator!=(const BufferT& buf) const { return !(*this == buf); }
-
-  T& operator[](size_t index) {
-    RTC_DCHECK_LT(index, size_);
-    return data()[index];
-  }
-
-  T operator[](size_t index) const {
-    RTC_DCHECK_LT(index, size_);
-    return data()[index];
-  }
-
-  T* begin() { return data(); }
-  T* end() { return data() + size(); }
-  const T* begin() const { return data(); }
-  const T* end() const { return data() + size(); }
-  const T* cbegin() const { return data(); }
-  const T* cend() const { return data() + size(); }
-
-  // The SetData functions replace the contents of the buffer. They accept the
-  // same input types as the constructors.
-  template <typename U,
-            typename std::enable_if<
-                internal::BufferCompat<T, U>::value>::type* = nullptr>
-  void SetData(const U* data, size_t size) {
-    RTC_DCHECK(IsConsistent());
-    size_ = 0;
-    AppendData(data, size);
-  }
-
-  template <typename U,
-            size_t N,
-            typename std::enable_if<
-                internal::BufferCompat<T, U>::value>::type* = nullptr>
-  void SetData(const U (&array)[N]) {
-    SetData(array, N);
-  }
-
-  template <typename W,
-            typename std::enable_if<
-                HasDataAndSize<const W, const T>::value>::type* = nullptr>
-  void SetData(const W& w) {
-    SetData(w.data(), w.size());
-  }
-
-  // Replace the data in the buffer with at most |max_elements| of data, using
-  // the function |setter|, which should have the following signature:
-  //   size_t setter(ArrayView<U> view)
-  // |setter| is given an appropriately typed ArrayView of the area in which to
-  // write the data (i.e. starting at the beginning of the buffer) and should
-  // return the number of elements actually written. This number must be <=
-  // |max_elements|.
-  template <typename U = T,
-            typename F,
-            typename std::enable_if<
-                internal::BufferCompat<T, U>::value>::type* = nullptr>
-  size_t SetData(size_t max_elements, F&& setter) {
-    RTC_DCHECK(IsConsistent());
-    size_ = 0;
-    return AppendData<U>(max_elements, std::forward<F>(setter));
-  }
-
-  // The AppendData functions add data to the end of the buffer. They accept
-  // the same input types as the constructors.
-  template <typename U,
-            typename std::enable_if<
-                internal::BufferCompat<T, U>::value>::type* = nullptr>
-  void AppendData(const U* data, size_t size) {
-    RTC_DCHECK(IsConsistent());
-    const size_t new_size = size_ + size;
-    EnsureCapacityWithHeadroom(new_size, true);
-    static_assert(sizeof(T) == sizeof(U), "");
-    std::memcpy(data_.get() + size_, data, size * sizeof(U));
-    size_ = new_size;
-    RTC_DCHECK(IsConsistent());
-  }
-
-  template <typename U,
-            size_t N,
-            typename std::enable_if<
-                internal::BufferCompat<T, U>::value>::type* = nullptr>
-  void AppendData(const U (&array)[N]) {
-    AppendData(array, N);
-  }
-
-  template <typename W,
-            typename std::enable_if<
-                HasDataAndSize<const W, const T>::value>::type* = nullptr>
-  void AppendData(const W& w) {
-    AppendData(w.data(), w.size());
-  }
-
-  template <typename U,
-            typename std::enable_if<
-                internal::BufferCompat<T, U>::value>::type* = nullptr>
-  void AppendData(const U& item) {
-    AppendData(&item, 1);
-  }
-
-  // Append at most |max_elements| to the end of the buffer, using the function
-  // |setter|, which should have the following signature:
-  //   size_t setter(ArrayView<U> view)
-  // |setter| is given an appropriately typed ArrayView of the area in which to
-  // write the data (i.e. starting at the former end of the buffer) and should
-  // return the number of elements actually written. This number must be <=
-  // |max_elements|.
-  template <typename U = T,
-            typename F,
-            typename std::enable_if<
-                internal::BufferCompat<T, U>::value>::type* = nullptr>
-  size_t AppendData(size_t max_elements, F&& setter) {
-    RTC_DCHECK(IsConsistent());
-    const size_t old_size = size_;
-    SetSize(old_size + max_elements);
-    U* base_ptr = data<U>() + old_size;
-    size_t written_elements = setter(rtc::ArrayView<U>(base_ptr, max_elements));
-
-    RTC_CHECK_LE(written_elements, max_elements);
-    size_ = old_size + written_elements;
-    RTC_DCHECK(IsConsistent());
-    return written_elements;
-  }
-
-  // Sets the size of the buffer. If the new size is smaller than the old, the
-  // buffer contents will be kept but truncated; if the new size is greater,
-  // the existing contents will be kept and the new space will be
-  // uninitialized.
-  void SetSize(size_t size) {
-    EnsureCapacityWithHeadroom(size, true);
-    size_ = size;
-  }
-
-  // Ensure that the buffer size can be increased to at least capacity without
-  // further reallocation. (Of course, this operation might need to reallocate
-  // the buffer.)
-  void EnsureCapacity(size_t capacity) {
-    // Don't allocate extra headroom, since the user is asking for a specific
-    // capacity.
-    EnsureCapacityWithHeadroom(capacity, false);
-  }
-
-  // Resets the buffer to zero size without altering capacity. Works even if the
-  // buffer has been moved from.
-  void Clear() {
-    size_ = 0;
-    RTC_DCHECK(IsConsistent());
-  }
-
-  // Swaps two buffers. Also works for buffers that have been moved from.
-  friend void swap(BufferT& a, BufferT& b) {
-    using std::swap;
-    swap(a.size_, b.size_);
-    swap(a.capacity_, b.capacity_);
-    swap(a.data_, b.data_);
-  }
-
- private:
-  void EnsureCapacityWithHeadroom(size_t capacity, bool extra_headroom) {
-    RTC_DCHECK(IsConsistent());
-    if (capacity <= capacity_)
-      return;
-
-    // If the caller asks for extra headroom, ensure that the new capacity is
-    // >= 1.5 times the old capacity. Any constant > 1 is sufficient to prevent
-    // quadratic behavior; as to why we pick 1.5 in particular, see
-    // https://github.com/facebook/folly/blob/master/folly/docs/FBVector.md and
-    // http://www.gahcep.com/cpp-internals-stl-vector-part-1/.
-    const size_t new_capacity =
-        extra_headroom ? std::max(capacity, capacity_ + capacity_ / 2)
-                       : capacity;
-
-    std::unique_ptr<T[]> new_data(new T[new_capacity]);
-    std::memcpy(new_data.get(), data_.get(), size_ * sizeof(T));
-    data_ = std::move(new_data);
-    capacity_ = new_capacity;
-    RTC_DCHECK(IsConsistent());
-  }
-
-  // Precondition for all methods except Clear and the destructor.
-  // Postcondition for all methods except move construction and move
-  // assignment, which leave the moved-from object in a possibly inconsistent
-  // state.
-  bool IsConsistent() const {
-    return (data_ || capacity_ == 0) && capacity_ >= size_;
-  }
-
-  // Called when *this has been moved from. Conceptually it's a no-op, but we
-  // can mutate the state slightly to help subsequent sanity checks catch bugs.
-  void OnMovedFrom() {
-#if RTC_DCHECK_IS_ON
-    // Make *this consistent and empty. Shouldn't be necessary, but better safe
-    // than sorry.
-    size_ = 0;
-    capacity_ = 0;
-#else
-    // Ensure that *this is always inconsistent, to provoke bugs.
-    size_ = 1;
-    capacity_ = 0;
-#endif
-  }
-
-  size_t size_;
-  size_t capacity_;
-  std::unique_ptr<T[]> data_;
-};
-
-// By far the most common sort of buffer.
-using Buffer = BufferT<uint8_t>;
-
-}  // namespace rtc
-
-#endif  // WEBRTC_RTC_BASE_BUFFER_H_
diff --git a/rtc_base/buffer_unittest.cc b/rtc_base/buffer_unittest.cc
deleted file mode 100644
index 7bf1b5b..0000000
--- a/rtc_base/buffer_unittest.cc
+++ /dev/null
@@ -1,437 +0,0 @@
-/*
- *  Copyright 2004 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/rtc_base/buffer.h"
-
-#include "webrtc/api/array_view.h"
-#include "webrtc/rtc_base/gunit.h"
-
-#include <type_traits>
-#include <utility>
-
-namespace rtc {
-
-namespace {
-
-// clang-format off
-const uint8_t kTestData[] = {0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7,
-                             0x8, 0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf};
-// clang-format on
-
-void TestBuf(const Buffer& b1, size_t size, size_t capacity) {
-  EXPECT_EQ(b1.size(), size);
-  EXPECT_EQ(b1.capacity(), capacity);
-}
-
-}  // namespace
-
-TEST(BufferTest, TestConstructEmpty) {
-  TestBuf(Buffer(), 0, 0);
-  TestBuf(Buffer(Buffer()), 0, 0);
-  TestBuf(Buffer(0), 0, 0);
-
-  // We can't use a literal 0 for the first argument, because C++ will allow
-  // that to be considered a null pointer, which makes the call ambiguous.
-  TestBuf(Buffer(0 + 0, 10), 0, 10);
-
-  TestBuf(Buffer(kTestData, 0), 0, 0);
-  TestBuf(Buffer(kTestData, 0, 20), 0, 20);
-}
-
-TEST(BufferTest, TestConstructData) {
-  Buffer buf(kTestData, 7);
-  EXPECT_EQ(buf.size(), 7u);
-  EXPECT_EQ(buf.capacity(), 7u);
-  EXPECT_FALSE(buf.empty());
-  EXPECT_EQ(0, memcmp(buf.data(), kTestData, 7));
-}
-
-TEST(BufferTest, TestConstructDataWithCapacity) {
-  Buffer buf(kTestData, 7, 14);
-  EXPECT_EQ(buf.size(), 7u);
-  EXPECT_EQ(buf.capacity(), 14u);
-  EXPECT_FALSE(buf.empty());
-  EXPECT_EQ(0, memcmp(buf.data(), kTestData, 7));
-}
-
-TEST(BufferTest, TestConstructArray) {
-  Buffer buf(kTestData);
-  EXPECT_EQ(buf.size(), 16u);
-  EXPECT_EQ(buf.capacity(), 16u);
-  EXPECT_FALSE(buf.empty());
-  EXPECT_EQ(0, memcmp(buf.data(), kTestData, 16));
-}
-
-TEST(BufferTest, TestSetData) {
-  Buffer buf(kTestData + 4, 7);
-  buf.SetData(kTestData, 9);
-  EXPECT_EQ(buf.size(), 9u);
-  EXPECT_EQ(buf.capacity(), 7u * 3 / 2);
-  EXPECT_FALSE(buf.empty());
-  EXPECT_EQ(0, memcmp(buf.data(), kTestData, 9));
-  Buffer buf2;
-  buf2.SetData(buf);
-  EXPECT_EQ(buf.size(), 9u);
-  EXPECT_EQ(buf.capacity(), 7u * 3 / 2);
-  EXPECT_EQ(0, memcmp(buf.data(), kTestData, 9));
-}
-
-TEST(BufferTest, TestAppendData) {
-  Buffer buf(kTestData + 4, 3);
-  buf.AppendData(kTestData + 10, 2);
-  const int8_t exp[] = {0x4, 0x5, 0x6, 0xa, 0xb};
-  EXPECT_EQ(buf, Buffer(exp));
-  Buffer buf2;
-  buf2.AppendData(buf);
-  buf2.AppendData(rtc::ArrayView<uint8_t>(buf));
-  const int8_t exp2[] = {0x4, 0x5, 0x6, 0xa, 0xb, 0x4, 0x5, 0x6, 0xa, 0xb};
-  EXPECT_EQ(buf2, Buffer(exp2));
-}
-
-TEST(BufferTest, TestSetAndAppendWithUnknownArg) {
-  struct TestDataContainer {
-    size_t size() const { return 3; }
-    const uint8_t* data() const { return kTestData; }
-  };
-  Buffer buf;
-  buf.SetData(TestDataContainer());
-  EXPECT_EQ(3u, buf.size());
-  EXPECT_EQ(Buffer(kTestData, 3), buf);
-  buf.AppendData(TestDataContainer());
-  EXPECT_EQ(6u, buf.size());
-  EXPECT_EQ(0, memcmp(buf.data(), kTestData, 3));
-  EXPECT_EQ(0, memcmp(buf.data() + 3, kTestData, 3));
-}
-
-TEST(BufferTest, TestSetSizeSmaller) {
-  Buffer buf;
-  buf.SetData(kTestData, 15);
-  buf.SetSize(10);
-  EXPECT_EQ(buf.size(), 10u);
-  EXPECT_EQ(buf.capacity(), 15u);  // Hasn't shrunk.
-  EXPECT_FALSE(buf.empty());
-  EXPECT_EQ(buf, Buffer(kTestData, 10));
-}
-
-TEST(BufferTest, TestSetSizeLarger) {
-  Buffer buf;
-  buf.SetData(kTestData, 15);
-  EXPECT_EQ(buf.size(), 15u);
-  EXPECT_EQ(buf.capacity(), 15u);
-  EXPECT_FALSE(buf.empty());
-  buf.SetSize(20);
-  EXPECT_EQ(buf.size(), 20u);
-  EXPECT_EQ(buf.capacity(), 15u * 3 / 2);  // Has grown.
-  EXPECT_FALSE(buf.empty());
-  EXPECT_EQ(0, memcmp(buf.data(), kTestData, 15));
-}
-
-TEST(BufferTest, TestEnsureCapacitySmaller) {
-  Buffer buf(kTestData);
-  const char* data = buf.data<char>();
-  buf.EnsureCapacity(4);
-  EXPECT_EQ(buf.capacity(), 16u);     // Hasn't shrunk.
-  EXPECT_EQ(buf.data<char>(), data);  // No reallocation.
-  EXPECT_FALSE(buf.empty());
-  EXPECT_EQ(buf, Buffer(kTestData));
-}
-
-TEST(BufferTest, TestEnsureCapacityLarger) {
-  Buffer buf(kTestData, 5);
-  buf.EnsureCapacity(10);
-  const int8_t* data = buf.data<int8_t>();
-  EXPECT_EQ(buf.capacity(), 10u);
-  buf.AppendData(kTestData + 5, 5);
-  EXPECT_EQ(buf.data<int8_t>(), data);  // No reallocation.
-  EXPECT_FALSE(buf.empty());
-  EXPECT_EQ(buf, Buffer(kTestData, 10));
-}
-
-TEST(BufferTest, TestMoveConstruct) {
-  Buffer buf1(kTestData, 3, 40);
-  const uint8_t* data = buf1.data();
-  Buffer buf2(std::move(buf1));
-  EXPECT_EQ(buf2.size(), 3u);
-  EXPECT_EQ(buf2.capacity(), 40u);
-  EXPECT_EQ(buf2.data(), data);
-  EXPECT_FALSE(buf2.empty());
-  buf1.Clear();
-  EXPECT_EQ(buf1.size(), 0u);
-  EXPECT_EQ(buf1.capacity(), 0u);
-  EXPECT_EQ(buf1.data(), nullptr);
-  EXPECT_TRUE(buf1.empty());
-}
-
-TEST(BufferTest, TestMoveAssign) {
-  Buffer buf1(kTestData, 3, 40);
-  const uint8_t* data = buf1.data();
-  Buffer buf2(kTestData);
-  buf2 = std::move(buf1);
-  EXPECT_EQ(buf2.size(), 3u);
-  EXPECT_EQ(buf2.capacity(), 40u);
-  EXPECT_EQ(buf2.data(), data);
-  EXPECT_FALSE(buf2.empty());
-  buf1.Clear();
-  EXPECT_EQ(buf1.size(), 0u);
-  EXPECT_EQ(buf1.capacity(), 0u);
-  EXPECT_EQ(buf1.data(), nullptr);
-  EXPECT_TRUE(buf1.empty());
-}
-
-TEST(BufferTest, TestSwap) {
-  Buffer buf1(kTestData, 3);
-  Buffer buf2(kTestData, 6, 40);
-  uint8_t* data1 = buf1.data();
-  uint8_t* data2 = buf2.data();
-  using std::swap;
-  swap(buf1, buf2);
-  EXPECT_EQ(buf1.size(), 6u);
-  EXPECT_EQ(buf1.capacity(), 40u);
-  EXPECT_EQ(buf1.data(), data2);
-  EXPECT_FALSE(buf1.empty());
-  EXPECT_EQ(buf2.size(), 3u);
-  EXPECT_EQ(buf2.capacity(), 3u);
-  EXPECT_EQ(buf2.data(), data1);
-  EXPECT_FALSE(buf2.empty());
-}
-
-TEST(BufferTest, TestClear) {
-  Buffer buf;
-  buf.SetData(kTestData, 15);
-  EXPECT_EQ(buf.size(), 15u);
-  EXPECT_EQ(buf.capacity(), 15u);
-  EXPECT_FALSE(buf.empty());
-  const char *data = buf.data<char>();
-  buf.Clear();
-  EXPECT_EQ(buf.size(), 0u);
-  EXPECT_EQ(buf.capacity(), 15u);  // Hasn't shrunk.
-  EXPECT_EQ(buf.data<char>(), data); // No reallocation.
-  EXPECT_TRUE(buf.empty());
-}
-
-TEST(BufferTest, TestLambdaSetAppend) {
-  auto setter = [] (rtc::ArrayView<uint8_t> av) {
-    for (int i = 0; i != 15; ++i)
-      av[i] = kTestData[i];
-    return 15;
-  };
-
-  Buffer buf1;
-  buf1.SetData(kTestData, 15);
-  buf1.AppendData(kTestData, 15);
-
-  Buffer buf2;
-  EXPECT_EQ(buf2.SetData(15, setter), 15u);
-  EXPECT_EQ(buf2.AppendData(15, setter), 15u);
-  EXPECT_EQ(buf1, buf2);
-  EXPECT_EQ(buf1.capacity(), buf2.capacity());
-  EXPECT_FALSE(buf1.empty());
-  EXPECT_FALSE(buf2.empty());
-}
-
-TEST(BufferTest, TestLambdaSetAppendSigned) {
-  auto setter = [] (rtc::ArrayView<int8_t> av) {
-    for (int i = 0; i != 15; ++i)
-      av[i] = kTestData[i];
-    return 15;
-  };
-
-  Buffer buf1;
-  buf1.SetData(kTestData, 15);
-  buf1.AppendData(kTestData, 15);
-
-  Buffer buf2;
-  EXPECT_EQ(buf2.SetData<int8_t>(15, setter), 15u);
-  EXPECT_EQ(buf2.AppendData<int8_t>(15, setter), 15u);
-  EXPECT_EQ(buf1, buf2);
-  EXPECT_EQ(buf1.capacity(), buf2.capacity());
-  EXPECT_FALSE(buf1.empty());
-  EXPECT_FALSE(buf2.empty());
-}
-
-TEST(BufferTest, TestLambdaAppendEmpty) {
-  auto setter = [] (rtc::ArrayView<uint8_t> av) {
-    for (int i = 0; i != 15; ++i)
-      av[i] = kTestData[i];
-    return 15;
-  };
-
-  Buffer buf1;
-  buf1.SetData(kTestData, 15);
-
-  Buffer buf2;
-  EXPECT_EQ(buf2.AppendData(15, setter), 15u);
-  EXPECT_EQ(buf1, buf2);
-  EXPECT_EQ(buf1.capacity(), buf2.capacity());
-  EXPECT_FALSE(buf1.empty());
-  EXPECT_FALSE(buf2.empty());
-}
-
-TEST(BufferTest, TestLambdaAppendPartial) {
-  auto setter = [] (rtc::ArrayView<uint8_t> av) {
-    for (int i = 0; i != 7; ++i)
-      av[i] = kTestData[i];
-    return 7;
-  };
-
-  Buffer buf;
-  EXPECT_EQ(buf.AppendData(15, setter), 7u);
-  EXPECT_EQ(buf.size(), 7u);            // Size is exactly what we wrote.
-  EXPECT_GE(buf.capacity(), 7u);        // Capacity is valid.
-  EXPECT_NE(buf.data<char>(), nullptr); // Data is actually stored.
-  EXPECT_FALSE(buf.empty());
-}
-
-TEST(BufferTest, TestMutableLambdaSetAppend) {
-  uint8_t magic_number = 17;
-  auto setter = [magic_number] (rtc::ArrayView<uint8_t> av) mutable {
-    for (int i = 0; i != 15; ++i) {
-      av[i] = magic_number;
-      ++magic_number;
-    }
-    return 15;
-  };
-
-  EXPECT_EQ(magic_number, 17);
-
-  Buffer buf;
-  EXPECT_EQ(buf.SetData(15, setter), 15u);
-  EXPECT_EQ(buf.AppendData(15, setter), 15u);
-  EXPECT_EQ(buf.size(), 30u);           // Size is exactly what we wrote.
-  EXPECT_GE(buf.capacity(), 30u);       // Capacity is valid.
-  EXPECT_NE(buf.data<char>(), nullptr); // Data is actually stored.
-  EXPECT_FALSE(buf.empty());
-
-  for (uint8_t i = 0; i != buf.size(); ++i) {
-    EXPECT_EQ(buf.data()[i], magic_number + i);
-  }
-}
-
-TEST(BufferTest, TestBracketRead) {
-  Buffer buf(kTestData, 7);
-  EXPECT_EQ(buf.size(), 7u);
-  EXPECT_EQ(buf.capacity(), 7u);
-  EXPECT_NE(buf.data(), nullptr);
-  EXPECT_FALSE(buf.empty());
-
-  for (size_t i = 0; i != 7u; ++i) {
-    EXPECT_EQ(buf[i], kTestData[i]);
-  }
-}
-
-TEST(BufferTest, TestBracketReadConst) {
-  Buffer buf(kTestData, 7);
-  EXPECT_EQ(buf.size(), 7u);
-  EXPECT_EQ(buf.capacity(), 7u);
-  EXPECT_NE(buf.data(), nullptr);
-  EXPECT_FALSE(buf.empty());
-
-  const Buffer& cbuf = buf;
-
-  for (size_t i = 0; i != 7u; ++i) {
-    EXPECT_EQ(cbuf[i], kTestData[i]);
-  }
-}
-
-TEST(BufferTest, TestBracketWrite) {
-  Buffer buf(7);
-  EXPECT_EQ(buf.size(), 7u);
-  EXPECT_EQ(buf.capacity(), 7u);
-  EXPECT_NE(buf.data(), nullptr);
-  EXPECT_FALSE(buf.empty());
-
-  for (size_t i = 0; i != 7u; ++i) {
-    buf[i] = kTestData[i];
-  }
-
-  for (size_t i = 0; i != 7u; ++i) {
-    EXPECT_EQ(buf[i], kTestData[i]);
-  }
-}
-
-TEST(BufferTest, TestBeginEnd) {
-  const Buffer cbuf(kTestData);
-  Buffer buf(kTestData);
-  auto b1 = cbuf.begin();
-  for (auto& x : buf) {
-    EXPECT_EQ(*b1, x);
-    ++b1;
-    ++x;
-  }
-  EXPECT_EQ(cbuf.end(), b1);
-  auto b2 = buf.begin();
-  for (auto& y : cbuf) {
-    EXPECT_EQ(*b2, y + 1);
-    ++b2;
-  }
-  EXPECT_EQ(buf.end(), b2);
-}
-
-TEST(BufferTest, TestInt16) {
-  static constexpr int16_t test_data[] = {14, 15, 16, 17, 18};
-  BufferT<int16_t> buf(test_data);
-  EXPECT_EQ(buf.size(), 5u);
-  EXPECT_EQ(buf.capacity(), 5u);
-  EXPECT_NE(buf.data(), nullptr);
-  EXPECT_FALSE(buf.empty());
-  for (size_t i = 0; i != buf.size(); ++i) {
-    EXPECT_EQ(test_data[i], buf[i]);
-  }
-  BufferT<int16_t> buf2(test_data);
-  EXPECT_EQ(buf, buf2);
-  buf2[0] = 9;
-  EXPECT_NE(buf, buf2);
-}
-
-TEST(BufferTest, TestFloat) {
-  static constexpr float test_data[] = {14, 15, 16, 17, 18};
-  BufferT<float> buf;
-  EXPECT_EQ(buf.size(), 0u);
-  EXPECT_EQ(buf.capacity(), 0u);
-  EXPECT_EQ(buf.data(), nullptr);
-  EXPECT_TRUE(buf.empty());
-  buf.SetData(test_data);
-  EXPECT_EQ(buf.size(), 5u);
-  EXPECT_EQ(buf.capacity(), 5u);
-  EXPECT_NE(buf.data(), nullptr);
-  EXPECT_FALSE(buf.empty());
-  float* p1 = buf.data();
-  while (buf.data() == p1) {
-    buf.AppendData(test_data);
-  }
-  EXPECT_EQ(buf.size(), buf.capacity());
-  EXPECT_GT(buf.size(), 5u);
-  EXPECT_EQ(buf.size() % 5, 0u);
-  EXPECT_NE(buf.data(), nullptr);
-  for (size_t i = 0; i != buf.size(); ++i) {
-    EXPECT_EQ(test_data[i % 5], buf[i]);
-  }
-}
-
-TEST(BufferTest, TestStruct) {
-  struct BloodStone {
-    bool blood;
-    const char* stone;
-  };
-  BufferT<BloodStone> buf(4);
-  EXPECT_EQ(buf.size(), 4u);
-  EXPECT_EQ(buf.capacity(), 4u);
-  EXPECT_NE(buf.data(), nullptr);
-  EXPECT_FALSE(buf.empty());
-  BufferT<BloodStone*> buf2(4);
-  for (size_t i = 0; i < buf2.size(); ++i) {
-    buf2[i] = &buf[i];
-  }
-  static const char kObsidian[] = "obsidian";
-  buf2[2]->stone = kObsidian;
-  EXPECT_EQ(kObsidian, buf[2].stone);
-}
-
-}  // namespace rtc
diff --git a/rtc_base/bufferqueue.cc b/rtc_base/bufferqueue.cc
deleted file mode 100644
index 9072043..0000000
--- a/rtc_base/bufferqueue.cc
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- *  Copyright 2015 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/rtc_base/bufferqueue.h"
-
-#include <algorithm>
-
-namespace rtc {
-
-BufferQueue::BufferQueue(size_t capacity, size_t default_size)
-    : capacity_(capacity), default_size_(default_size) {
-}
-
-BufferQueue::~BufferQueue() {
-  CritScope cs(&crit_);
-
-  for (Buffer* buffer : queue_) {
-    delete buffer;
-  }
-  for (Buffer* buffer : free_list_) {
-    delete buffer;
-  }
-}
-
-size_t BufferQueue::size() const {
-  CritScope cs(&crit_);
-  return queue_.size();
-}
-
-void BufferQueue::Clear() {
-  CritScope cs(&crit_);
-  while (!queue_.empty()) {
-    free_list_.push_back(queue_.front());
-    queue_.pop_front();
-  }
-}
-
-bool BufferQueue::ReadFront(void* buffer, size_t bytes, size_t* bytes_read) {
-  CritScope cs(&crit_);
-  if (queue_.empty()) {
-    return false;
-  }
-
-  bool was_writable = queue_.size() < capacity_;
-  Buffer* packet = queue_.front();
-  queue_.pop_front();
-
-  bytes = std::min(bytes, packet->size());
-  memcpy(buffer, packet->data(), bytes);
-  if (bytes_read) {
-    *bytes_read = bytes;
-  }
-  free_list_.push_back(packet);
-  if (!was_writable) {
-    NotifyWritableForTest();
-  }
-  return true;
-}
-
-bool BufferQueue::WriteBack(const void* buffer, size_t bytes,
-                            size_t* bytes_written) {
-  CritScope cs(&crit_);
-  if (queue_.size() == capacity_) {
-    return false;
-  }
-
-  bool was_readable = !queue_.empty();
-  Buffer* packet;
-  if (!free_list_.empty()) {
-    packet = free_list_.back();
-    free_list_.pop_back();
-  } else {
-    packet = new Buffer(bytes, default_size_);
-  }
-
-  packet->SetData(static_cast<const uint8_t*>(buffer), bytes);
-  if (bytes_written) {
-    *bytes_written = bytes;
-  }
-  queue_.push_back(packet);
-  if (!was_readable) {
-    NotifyReadableForTest();
-  }
-  return true;
-}
-
-}  // namespace rtc
diff --git a/rtc_base/bufferqueue.h b/rtc_base/bufferqueue.h
deleted file mode 100644
index 82f1ac1..0000000
--- a/rtc_base/bufferqueue.h
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- *  Copyright 2015 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_RTC_BASE_BUFFERQUEUE_H_
-#define WEBRTC_RTC_BASE_BUFFERQUEUE_H_
-
-#include <deque>
-#include <vector>
-
-#include "webrtc/rtc_base/buffer.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/criticalsection.h"
-
-namespace rtc {
-
-class BufferQueue {
- public:
-  // Creates a buffer queue with a given capacity and default buffer size.
-  BufferQueue(size_t capacity, size_t default_size);
-  virtual ~BufferQueue();
-
-  // Return number of queued buffers.
-  size_t size() const;
-
-  // Clear the BufferQueue by moving all Buffers from |queue_| to |free_list_|.
-  void Clear();
-
-  // ReadFront will only read one buffer at a time and will truncate buffers
-  // that don't fit in the passed memory.
-  // Returns true unless no data could be returned.
-  bool ReadFront(void* data, size_t bytes, size_t* bytes_read);
-
-  // WriteBack always writes either the complete memory or nothing.
-  // Returns true unless no data could be written.
-  bool WriteBack(const void* data, size_t bytes, size_t* bytes_written);
-
- protected:
-  // These methods are called when the state of the queue changes.
-  virtual void NotifyReadableForTest() {}
-  virtual void NotifyWritableForTest() {}
-
- private:
-  size_t capacity_;
-  size_t default_size_;
-  CriticalSection crit_;
-  std::deque<Buffer*> queue_ RTC_GUARDED_BY(crit_);
-  std::vector<Buffer*> free_list_ RTC_GUARDED_BY(crit_);
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(BufferQueue);
-};
-
-}  // namespace rtc
-
-#endif  // WEBRTC_RTC_BASE_BUFFERQUEUE_H_
diff --git a/rtc_base/bufferqueue_unittest.cc b/rtc_base/bufferqueue_unittest.cc
deleted file mode 100644
index 23d1751..0000000
--- a/rtc_base/bufferqueue_unittest.cc
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- *  Copyright 2015 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/rtc_base/bufferqueue.h"
-#include "webrtc/rtc_base/gunit.h"
-
-namespace rtc {
-
-TEST(BufferQueueTest, TestAll) {
-  const size_t kSize = 16;
-  const char in[kSize * 2 + 1] = "0123456789ABCDEFGHIJKLMNOPQRSTUV";
-  char out[kSize * 2];
-  size_t bytes;
-  BufferQueue queue1(1, kSize);
-  BufferQueue queue2(2, kSize);
-
-  // The queue is initially empty.
-  EXPECT_EQ(0u, queue1.size());
-  EXPECT_FALSE(queue1.ReadFront(out, kSize, &bytes));
-
-  // A write should succeed.
-  EXPECT_TRUE(queue1.WriteBack(in, kSize, &bytes));
-  EXPECT_EQ(kSize, bytes);
-  EXPECT_EQ(1u, queue1.size());
-
-  // The queue is full now (only one buffer allowed).
-  EXPECT_FALSE(queue1.WriteBack(in, kSize, &bytes));
-  EXPECT_EQ(1u, queue1.size());
-
-  // Reading previously written buffer.
-  EXPECT_TRUE(queue1.ReadFront(out, kSize, &bytes));
-  EXPECT_EQ(kSize, bytes);
-  EXPECT_EQ(0, memcmp(in, out, kSize));
-
-  // The queue is empty again now.
-  EXPECT_FALSE(queue1.ReadFront(out, kSize, &bytes));
-  EXPECT_EQ(0u, queue1.size());
-
-  // Reading only returns available data.
-  EXPECT_TRUE(queue1.WriteBack(in, kSize, &bytes));
-  EXPECT_EQ(kSize, bytes);
-  EXPECT_EQ(1u, queue1.size());
-  EXPECT_TRUE(queue1.ReadFront(out, kSize * 2, &bytes));
-  EXPECT_EQ(kSize, bytes);
-  EXPECT_EQ(0, memcmp(in, out, kSize));
-  EXPECT_EQ(0u, queue1.size());
-
-  // Reading maintains buffer boundaries.
-  EXPECT_TRUE(queue2.WriteBack(in, kSize / 2, &bytes));
-  EXPECT_EQ(1u, queue2.size());
-  EXPECT_TRUE(queue2.WriteBack(in + kSize / 2, kSize / 2, &bytes));
-  EXPECT_EQ(2u, queue2.size());
-  EXPECT_TRUE(queue2.ReadFront(out, kSize, &bytes));
-  EXPECT_EQ(kSize / 2, bytes);
-  EXPECT_EQ(0, memcmp(in, out, kSize / 2));
-  EXPECT_EQ(1u, queue2.size());
-  EXPECT_TRUE(queue2.ReadFront(out, kSize, &bytes));
-  EXPECT_EQ(kSize / 2, bytes);
-  EXPECT_EQ(0, memcmp(in + kSize / 2, out, kSize / 2));
-  EXPECT_EQ(0u, queue2.size());
-
-  // Reading truncates buffers.
-  EXPECT_TRUE(queue2.WriteBack(in, kSize / 2, &bytes));
-  EXPECT_EQ(1u, queue2.size());
-  EXPECT_TRUE(queue2.WriteBack(in + kSize / 2, kSize / 2, &bytes));
-  EXPECT_EQ(2u, queue2.size());
-  // Read first packet partially in too-small buffer.
-  EXPECT_TRUE(queue2.ReadFront(out, kSize / 4, &bytes));
-  EXPECT_EQ(kSize / 4, bytes);
-  EXPECT_EQ(0, memcmp(in, out, kSize / 4));
-  EXPECT_EQ(1u, queue2.size());
-  // Remainder of first packet is truncated, reading starts with next packet.
-  EXPECT_TRUE(queue2.ReadFront(out, kSize, &bytes));
-  EXPECT_EQ(kSize / 2, bytes);
-  EXPECT_EQ(0, memcmp(in + kSize / 2, out, kSize / 2));
-  EXPECT_EQ(0u, queue2.size());
-}
-
-}  // namespace rtc
diff --git a/rtc_base/bytebuffer.cc b/rtc_base/bytebuffer.cc
deleted file mode 100644
index 6bee27f..0000000
--- a/rtc_base/bytebuffer.cc
+++ /dev/null
@@ -1,283 +0,0 @@
-/*
- *  Copyright 2004 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/rtc_base/bytebuffer.h"
-
-#include <string.h>
-
-#include <algorithm>
-
-#include "webrtc/rtc_base/basictypes.h"
-#include "webrtc/rtc_base/byteorder.h"
-
-namespace rtc {
-
-static const int DEFAULT_SIZE = 4096;
-
-ByteBufferWriter::ByteBufferWriter()
-    : ByteBuffer(ORDER_NETWORK) {
-  Construct(nullptr, DEFAULT_SIZE);
-}
-
-ByteBufferWriter::ByteBufferWriter(ByteOrder byte_order)
-    : ByteBuffer(byte_order) {
-  Construct(nullptr, DEFAULT_SIZE);
-}
-
-ByteBufferWriter::ByteBufferWriter(const char* bytes, size_t len)
-    : ByteBuffer(ORDER_NETWORK) {
-  Construct(bytes, len);
-}
-
-ByteBufferWriter::ByteBufferWriter(const char* bytes, size_t len,
-                                   ByteOrder byte_order)
-    : ByteBuffer(byte_order) {
-  Construct(bytes, len);
-}
-
-void ByteBufferWriter::Construct(const char* bytes, size_t len) {
-  size_ = len;
-  bytes_ = new char[size_];
-
-  if (bytes) {
-    end_ = len;
-    memcpy(bytes_, bytes, end_);
-  } else {
-    end_ = 0;
-  }
-}
-
-ByteBufferWriter::~ByteBufferWriter() {
-  delete[] bytes_;
-}
-
-void ByteBufferWriter::WriteUInt8(uint8_t val) {
-  WriteBytes(reinterpret_cast<const char*>(&val), 1);
-}
-
-void ByteBufferWriter::WriteUInt16(uint16_t val) {
-  uint16_t v = (Order() == ORDER_NETWORK) ? HostToNetwork16(val) : val;
-  WriteBytes(reinterpret_cast<const char*>(&v), 2);
-}
-
-void ByteBufferWriter::WriteUInt24(uint32_t val) {
-  uint32_t v = (Order() == ORDER_NETWORK) ? HostToNetwork32(val) : val;
-  char* start = reinterpret_cast<char*>(&v);
-  if (Order() == ORDER_NETWORK || IsHostBigEndian()) {
-    ++start;
-  }
-  WriteBytes(start, 3);
-}
-
-void ByteBufferWriter::WriteUInt32(uint32_t val) {
-  uint32_t v = (Order() == ORDER_NETWORK) ? HostToNetwork32(val) : val;
-  WriteBytes(reinterpret_cast<const char*>(&v), 4);
-}
-
-void ByteBufferWriter::WriteUInt64(uint64_t val) {
-  uint64_t v = (Order() == ORDER_NETWORK) ? HostToNetwork64(val) : val;
-  WriteBytes(reinterpret_cast<const char*>(&v), 8);
-}
-
-// Serializes an unsigned varint in the format described by
-// https://developers.google.com/protocol-buffers/docs/encoding#varints
-// with the caveat that integers are 64-bit, not 128-bit.
-void ByteBufferWriter::WriteUVarint(uint64_t val) {
-  while (val >= 0x80) {
-    // Write 7 bits at a time, then set the msb to a continuation byte (msb=1).
-    char byte = static_cast<char>(val) | 0x80;
-    WriteBytes(&byte, 1);
-    val >>= 7;
-  }
-  char last_byte = static_cast<char>(val);
-  WriteBytes(&last_byte, 1);
-}
-
-void ByteBufferWriter::WriteString(const std::string& val) {
-  WriteBytes(val.c_str(), val.size());
-}
-
-void ByteBufferWriter::WriteBytes(const char* val, size_t len) {
-  memcpy(ReserveWriteBuffer(len), val, len);
-}
-
-char* ByteBufferWriter::ReserveWriteBuffer(size_t len) {
-  if (Length() + len > Capacity())
-    Resize(Length() + len);
-
-  char* start = bytes_ + end_;
-  end_ += len;
-  return start;
-}
-
-void ByteBufferWriter::Resize(size_t size) {
-  size_t len = std::min(end_, size);
-  if (size > size_) {
-    // Reallocate a larger buffer.
-    size_ = std::max(size, 3 * size_ / 2);
-    char* new_bytes = new char[size_];
-    memcpy(new_bytes, bytes_, len);
-    delete [] bytes_;
-    bytes_ = new_bytes;
-  }
-  end_ = len;
-}
-
-void ByteBufferWriter::Clear() {
-  memset(bytes_, 0, size_);
-  end_ = 0;
-}
-
-
-ByteBufferReader::ByteBufferReader(const char* bytes, size_t len)
-    : ByteBuffer(ORDER_NETWORK) {
-  Construct(bytes, len);
-}
-
-ByteBufferReader::ByteBufferReader(const char* bytes, size_t len,
-                                   ByteOrder byte_order)
-    : ByteBuffer(byte_order) {
-  Construct(bytes, len);
-}
-
-ByteBufferReader::ByteBufferReader(const char* bytes)
-    : ByteBuffer(ORDER_NETWORK) {
-  Construct(bytes, strlen(bytes));
-}
-
-ByteBufferReader::ByteBufferReader(const Buffer& buf)
-    : ByteBuffer(ORDER_NETWORK) {
-  Construct(buf.data<char>(), buf.size());
-}
-
-ByteBufferReader::ByteBufferReader(const ByteBufferWriter& buf)
-    : ByteBuffer(buf.Order()) {
-  Construct(buf.Data(), buf.Length());
-}
-
-void ByteBufferReader::Construct(const char* bytes, size_t len) {
-  bytes_ = bytes;
-  size_ = len;
-  start_ = 0;
-  end_ = len;
-}
-
-bool ByteBufferReader::ReadUInt8(uint8_t* val) {
-  if (!val) return false;
-
-  return ReadBytes(reinterpret_cast<char*>(val), 1);
-}
-
-bool ByteBufferReader::ReadUInt16(uint16_t* val) {
-  if (!val) return false;
-
-  uint16_t v;
-  if (!ReadBytes(reinterpret_cast<char*>(&v), 2)) {
-    return false;
-  } else {
-    *val = (Order() == ORDER_NETWORK) ? NetworkToHost16(v) : v;
-    return true;
-  }
-}
-
-bool ByteBufferReader::ReadUInt24(uint32_t* val) {
-  if (!val) return false;
-
-  uint32_t v = 0;
-  char* read_into = reinterpret_cast<char*>(&v);
-  if (Order() == ORDER_NETWORK || IsHostBigEndian()) {
-    ++read_into;
-  }
-
-  if (!ReadBytes(read_into, 3)) {
-    return false;
-  } else {
-    *val = (Order() == ORDER_NETWORK) ? NetworkToHost32(v) : v;
-    return true;
-  }
-}
-
-bool ByteBufferReader::ReadUInt32(uint32_t* val) {
-  if (!val) return false;
-
-  uint32_t v;
-  if (!ReadBytes(reinterpret_cast<char*>(&v), 4)) {
-    return false;
-  } else {
-    *val = (Order() == ORDER_NETWORK) ? NetworkToHost32(v) : v;
-    return true;
-  }
-}
-
-bool ByteBufferReader::ReadUInt64(uint64_t* val) {
-  if (!val) return false;
-
-  uint64_t v;
-  if (!ReadBytes(reinterpret_cast<char*>(&v), 8)) {
-    return false;
-  } else {
-    *val = (Order() == ORDER_NETWORK) ? NetworkToHost64(v) : v;
-    return true;
-  }
-}
-
-bool ByteBufferReader::ReadUVarint(uint64_t* val) {
-  if (!val) {
-    return false;
-  }
-  // Integers are deserialized 7 bits at a time, with each byte having a
-  // continuation byte (msb=1) if there are more bytes to be read.
-  uint64_t v = 0;
-  for (int i = 0; i < 64; i += 7) {
-    char byte;
-    if (!ReadBytes(&byte, 1)) {
-      return false;
-    }
-    // Read the first 7 bits of the byte, then offset by bits read so far.
-    v |= (static_cast<uint64_t>(byte) & 0x7F) << i;
-    // True if the msb is not a continuation byte.
-    if (static_cast<uint64_t>(byte) < 0x80) {
-      *val = v;
-      return true;
-    }
-  }
-  return false;
-}
-
-bool ByteBufferReader::ReadString(std::string* val, size_t len) {
-  if (!val) return false;
-
-  if (len > Length()) {
-    return false;
-  } else {
-    val->append(bytes_ + start_, len);
-    start_ += len;
-    return true;
-  }
-}
-
-bool ByteBufferReader::ReadBytes(char* val, size_t len) {
-  if (len > Length()) {
-    return false;
-  } else {
-    memcpy(val, bytes_ + start_, len);
-    start_ += len;
-    return true;
-  }
-}
-
-bool ByteBufferReader::Consume(size_t size) {
-  if (size > Length())
-    return false;
-  start_ += size;
-  return true;
-}
-
-}  // namespace rtc
diff --git a/rtc_base/bytebuffer.h b/rtc_base/bytebuffer.h
deleted file mode 100644
index 36b18d2..0000000
--- a/rtc_base/bytebuffer.h
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- *  Copyright 2004 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_RTC_BASE_BYTEBUFFER_H_
-#define WEBRTC_RTC_BASE_BYTEBUFFER_H_
-
-#include <string>
-
-#include "webrtc/rtc_base/basictypes.h"
-#include "webrtc/rtc_base/buffer.h"
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace rtc {
-
-class ByteBuffer {
- public:
-  enum ByteOrder {
-    ORDER_NETWORK = 0,  // Default, use network byte order (big endian).
-    ORDER_HOST,         // Use the native order of the host.
-  };
-
-  explicit ByteBuffer(ByteOrder byte_order) : byte_order_(byte_order) {}
-
-  ByteOrder Order() const { return byte_order_; }
-
- private:
-  ByteOrder byte_order_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(ByteBuffer);
-};
-
-class ByteBufferWriter : public ByteBuffer {
- public:
-  // |byte_order| defines order of bytes in the buffer.
-  ByteBufferWriter();
-  explicit ByteBufferWriter(ByteOrder byte_order);
-  ByteBufferWriter(const char* bytes, size_t len);
-  ByteBufferWriter(const char* bytes, size_t len, ByteOrder byte_order);
-
-  ~ByteBufferWriter();
-
-  const char* Data() const { return bytes_; }
-  size_t Length() const { return end_; }
-  size_t Capacity() const { return size_; }
-
-  // Write value to the buffer. Resizes the buffer when it is
-  // neccessary.
-  void WriteUInt8(uint8_t val);
-  void WriteUInt16(uint16_t val);
-  void WriteUInt24(uint32_t val);
-  void WriteUInt32(uint32_t val);
-  void WriteUInt64(uint64_t val);
-  void WriteUVarint(uint64_t val);
-  void WriteString(const std::string& val);
-  void WriteBytes(const char* val, size_t len);
-
-  // Reserves the given number of bytes and returns a char* that can be written
-  // into. Useful for functions that require a char* buffer and not a
-  // ByteBufferWriter.
-  char* ReserveWriteBuffer(size_t len);
-
-  // Resize the buffer to the specified |size|.
-  void Resize(size_t size);
-
-  // Clears the contents of the buffer. After this, Length() will be 0.
-  void Clear();
-
- private:
-  void Construct(const char* bytes, size_t size);
-
-  char* bytes_;
-  size_t size_;
-  size_t end_;
-
-  // There are sensible ways to define these, but they aren't needed in our code
-  // base.
-  RTC_DISALLOW_COPY_AND_ASSIGN(ByteBufferWriter);
-};
-
-// The ByteBufferReader references the passed data, i.e. the pointer must be
-// valid during the lifetime of the reader.
-class ByteBufferReader : public ByteBuffer {
- public:
-  ByteBufferReader(const char* bytes, size_t len);
-  ByteBufferReader(const char* bytes, size_t len, ByteOrder byte_order);
-
-  // Initializes buffer from a zero-terminated string.
-  explicit ByteBufferReader(const char* bytes);
-
-  explicit ByteBufferReader(const Buffer& buf);
-
-  explicit ByteBufferReader(const ByteBufferWriter& buf);
-
-  // Returns start of unprocessed data.
-  const char* Data() const { return bytes_ + start_; }
-  // Returns number of unprocessed bytes.
-  size_t Length() const { return end_ - start_; }
-
-  // Read a next value from the buffer. Return false if there isn't
-  // enough data left for the specified type.
-  bool ReadUInt8(uint8_t* val);
-  bool ReadUInt16(uint16_t* val);
-  bool ReadUInt24(uint32_t* val);
-  bool ReadUInt32(uint32_t* val);
-  bool ReadUInt64(uint64_t* val);
-  bool ReadUVarint(uint64_t* val);
-  bool ReadBytes(char* val, size_t len);
-
-  // Appends next |len| bytes from the buffer to |val|. Returns false
-  // if there is less than |len| bytes left.
-  bool ReadString(std::string* val, size_t len);
-
-  // Moves current position |size| bytes forward. Returns false if
-  // there is less than |size| bytes left in the buffer. Consume doesn't
-  // permanently remove data, so remembered read positions are still valid
-  // after this call.
-  bool Consume(size_t size);
-
- private:
-  void Construct(const char* bytes, size_t size);
-
-  const char* bytes_;
-  size_t size_;
-  size_t start_;
-  size_t end_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(ByteBufferReader);
-};
-
-}  // namespace rtc
-
-#endif  // WEBRTC_RTC_BASE_BYTEBUFFER_H_
diff --git a/rtc_base/bytebuffer_unittest.cc b/rtc_base/bytebuffer_unittest.cc
deleted file mode 100644
index afca353..0000000
--- a/rtc_base/bytebuffer_unittest.cc
+++ /dev/null
@@ -1,258 +0,0 @@
-/*
- *  Copyright 2004 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/rtc_base/bytebuffer.h"
-#include "webrtc/rtc_base/arraysize.h"
-#include "webrtc/rtc_base/byteorder.h"
-#include "webrtc/rtc_base/gunit.h"
-
-namespace rtc {
-
-TEST(ByteBufferTest, TestByteOrder) {
-  uint16_t n16 = 1;
-  uint32_t n32 = 1;
-  uint64_t n64 = 1;
-
-  EXPECT_EQ(n16, NetworkToHost16(HostToNetwork16(n16)));
-  EXPECT_EQ(n32, NetworkToHost32(HostToNetwork32(n32)));
-  EXPECT_EQ(n64, NetworkToHost64(HostToNetwork64(n64)));
-
-  if (IsHostBigEndian()) {
-    // The host is the network (big) endian.
-    EXPECT_EQ(n16, HostToNetwork16(n16));
-    EXPECT_EQ(n32, HostToNetwork32(n32));
-    EXPECT_EQ(n64, HostToNetwork64(n64));
-
-    // GetBE converts big endian to little endian here.
-    EXPECT_EQ(n16 >> 8, GetBE16(&n16));
-    EXPECT_EQ(n32 >> 24, GetBE32(&n32));
-    EXPECT_EQ(n64 >> 56, GetBE64(&n64));
-  } else {
-    // The host is little endian.
-    EXPECT_NE(n16, HostToNetwork16(n16));
-    EXPECT_NE(n32, HostToNetwork32(n32));
-    EXPECT_NE(n64, HostToNetwork64(n64));
-
-    // GetBE converts little endian to big endian here.
-    EXPECT_EQ(GetBE16(&n16), HostToNetwork16(n16));
-    EXPECT_EQ(GetBE32(&n32), HostToNetwork32(n32));
-    EXPECT_EQ(GetBE64(&n64), HostToNetwork64(n64));
-
-    // GetBE converts little endian to big endian here.
-    EXPECT_EQ(n16 << 8, GetBE16(&n16));
-    EXPECT_EQ(n32 << 24, GetBE32(&n32));
-    EXPECT_EQ(n64 << 56, GetBE64(&n64));
-  }
-}
-
-TEST(ByteBufferTest, TestBufferLength) {
-  ByteBufferWriter buffer;
-  size_t size = 0;
-  EXPECT_EQ(size, buffer.Length());
-
-  buffer.WriteUInt8(1);
-  ++size;
-  EXPECT_EQ(size, buffer.Length());
-
-  buffer.WriteUInt16(1);
-  size += 2;
-  EXPECT_EQ(size, buffer.Length());
-
-  buffer.WriteUInt24(1);
-  size += 3;
-  EXPECT_EQ(size, buffer.Length());
-
-  buffer.WriteUInt32(1);
-  size += 4;
-  EXPECT_EQ(size, buffer.Length());
-
-  buffer.WriteUInt64(1);
-  size += 8;
-  EXPECT_EQ(size, buffer.Length());
-}
-
-TEST(ByteBufferTest, TestReadWriteBuffer) {
-  ByteBufferWriter::ByteOrder orders[2] = { ByteBufferWriter::ORDER_HOST,
-                                            ByteBufferWriter::ORDER_NETWORK };
-  for (size_t i = 0; i < arraysize(orders); i++) {
-    ByteBufferWriter buffer(orders[i]);
-    EXPECT_EQ(orders[i], buffer.Order());
-    ByteBufferReader read_buf(nullptr, 0, orders[i]);
-    EXPECT_EQ(orders[i], read_buf.Order());
-    uint8_t ru8;
-    EXPECT_FALSE(read_buf.ReadUInt8(&ru8));
-
-    // Write and read uint8_t.
-    uint8_t wu8 = 1;
-    buffer.WriteUInt8(wu8);
-    ByteBufferReader read_buf1(buffer.Data(), buffer.Length(), orders[i]);
-    EXPECT_TRUE(read_buf1.ReadUInt8(&ru8));
-    EXPECT_EQ(wu8, ru8);
-    EXPECT_EQ(0U, read_buf1.Length());
-    buffer.Clear();
-
-    // Write and read uint16_t.
-    uint16_t wu16 = (1 << 8) + 1;
-    buffer.WriteUInt16(wu16);
-    ByteBufferReader read_buf2(buffer.Data(), buffer.Length(), orders[i]);
-    uint16_t ru16;
-    EXPECT_TRUE(read_buf2.ReadUInt16(&ru16));
-    EXPECT_EQ(wu16, ru16);
-    EXPECT_EQ(0U, read_buf2.Length());
-    buffer.Clear();
-
-    // Write and read uint24.
-    uint32_t wu24 = (3 << 16) + (2 << 8) + 1;
-    buffer.WriteUInt24(wu24);
-    ByteBufferReader read_buf3(buffer.Data(), buffer.Length(), orders[i]);
-    uint32_t ru24;
-    EXPECT_TRUE(read_buf3.ReadUInt24(&ru24));
-    EXPECT_EQ(wu24, ru24);
-    EXPECT_EQ(0U, read_buf3.Length());
-    buffer.Clear();
-
-    // Write and read uint32_t.
-    uint32_t wu32 = (4 << 24) + (3 << 16) + (2 << 8) + 1;
-    buffer.WriteUInt32(wu32);
-    ByteBufferReader read_buf4(buffer.Data(), buffer.Length(), orders[i]);
-    uint32_t ru32;
-    EXPECT_TRUE(read_buf4.ReadUInt32(&ru32));
-    EXPECT_EQ(wu32, ru32);
-    EXPECT_EQ(0U, read_buf3.Length());
-    buffer.Clear();
-
-    // Write and read uint64_t.
-    uint32_t another32 = (8 << 24) + (7 << 16) + (6 << 8) + 5;
-    uint64_t wu64 = (static_cast<uint64_t>(another32) << 32) + wu32;
-    buffer.WriteUInt64(wu64);
-    ByteBufferReader read_buf5(buffer.Data(), buffer.Length(), orders[i]);
-    uint64_t ru64;
-    EXPECT_TRUE(read_buf5.ReadUInt64(&ru64));
-    EXPECT_EQ(wu64, ru64);
-    EXPECT_EQ(0U, read_buf5.Length());
-    buffer.Clear();
-
-    // Write and read string.
-    std::string write_string("hello");
-    buffer.WriteString(write_string);
-    ByteBufferReader read_buf6(buffer.Data(), buffer.Length(), orders[i]);
-    std::string read_string;
-    EXPECT_TRUE(read_buf6.ReadString(&read_string, write_string.size()));
-    EXPECT_EQ(write_string, read_string);
-    EXPECT_EQ(0U, read_buf6.Length());
-    buffer.Clear();
-
-    // Write and read bytes
-    char write_bytes[] = "foo";
-    buffer.WriteBytes(write_bytes, 3);
-    ByteBufferReader read_buf7(buffer.Data(), buffer.Length(), orders[i]);
-    char read_bytes[3];
-    EXPECT_TRUE(read_buf7.ReadBytes(read_bytes, 3));
-    for (int i = 0; i < 3; ++i) {
-      EXPECT_EQ(write_bytes[i], read_bytes[i]);
-    }
-    EXPECT_EQ(0U, read_buf7.Length());
-    buffer.Clear();
-
-    // Write and read reserved buffer space
-    char* write_dst = buffer.ReserveWriteBuffer(3);
-    memcpy(write_dst, write_bytes, 3);
-    ByteBufferReader read_buf8(buffer.Data(), buffer.Length(), orders[i]);
-    memset(read_bytes, 0, 3);
-    EXPECT_TRUE(read_buf8.ReadBytes(read_bytes, 3));
-    for (int i = 0; i < 3; ++i) {
-      EXPECT_EQ(write_bytes[i], read_bytes[i]);
-    }
-    EXPECT_EQ(0U, read_buf8.Length());
-    buffer.Clear();
-
-    // Write and read in order.
-    buffer.WriteUInt8(wu8);
-    buffer.WriteUInt16(wu16);
-    buffer.WriteUInt24(wu24);
-    buffer.WriteUInt32(wu32);
-    buffer.WriteUInt64(wu64);
-    ByteBufferReader read_buf9(buffer.Data(), buffer.Length(), orders[i]);
-    EXPECT_TRUE(read_buf9.ReadUInt8(&ru8));
-    EXPECT_EQ(wu8, ru8);
-    EXPECT_TRUE(read_buf9.ReadUInt16(&ru16));
-    EXPECT_EQ(wu16, ru16);
-    EXPECT_TRUE(read_buf9.ReadUInt24(&ru24));
-    EXPECT_EQ(wu24, ru24);
-    EXPECT_TRUE(read_buf9.ReadUInt32(&ru32));
-    EXPECT_EQ(wu32, ru32);
-    EXPECT_TRUE(read_buf9.ReadUInt64(&ru64));
-    EXPECT_EQ(wu64, ru64);
-    EXPECT_EQ(0U, read_buf9.Length());
-    buffer.Clear();
-  }
-}
-
-TEST(ByteBufferTest, TestReadWriteUVarint) {
-  ByteBufferWriter::ByteOrder orders[2] = {ByteBufferWriter::ORDER_HOST,
-                                           ByteBufferWriter::ORDER_NETWORK};
-  for (ByteBufferWriter::ByteOrder& order : orders) {
-    ByteBufferWriter write_buffer(order);
-    size_t size = 0;
-    EXPECT_EQ(size, write_buffer.Length());
-
-    write_buffer.WriteUVarint(1u);
-    ++size;
-    EXPECT_EQ(size, write_buffer.Length());
-
-    write_buffer.WriteUVarint(2u);
-    ++size;
-    EXPECT_EQ(size, write_buffer.Length());
-
-    write_buffer.WriteUVarint(27u);
-    ++size;
-    EXPECT_EQ(size, write_buffer.Length());
-
-    write_buffer.WriteUVarint(149u);
-    size += 2;
-    EXPECT_EQ(size, write_buffer.Length());
-
-    write_buffer.WriteUVarint(68719476736u);
-    size += 6;
-    EXPECT_EQ(size, write_buffer.Length());
-
-    ByteBufferReader read_buffer(write_buffer.Data(), write_buffer.Length(),
-                                 order);
-    EXPECT_EQ(size, read_buffer.Length());
-    uint64_t val1, val2, val3, val4, val5;
-
-    ASSERT_TRUE(read_buffer.ReadUVarint(&val1));
-    EXPECT_EQ(1u, val1);
-    --size;
-    EXPECT_EQ(size, read_buffer.Length());
-
-    ASSERT_TRUE(read_buffer.ReadUVarint(&val2));
-    EXPECT_EQ(2u, val2);
-    --size;
-    EXPECT_EQ(size, read_buffer.Length());
-
-    ASSERT_TRUE(read_buffer.ReadUVarint(&val3));
-    EXPECT_EQ(27u, val3);
-    --size;
-    EXPECT_EQ(size, read_buffer.Length());
-
-    ASSERT_TRUE(read_buffer.ReadUVarint(&val4));
-    EXPECT_EQ(149u, val4);
-    size -= 2;
-    EXPECT_EQ(size, read_buffer.Length());
-
-    ASSERT_TRUE(read_buffer.ReadUVarint(&val5));
-    EXPECT_EQ(68719476736u, val5);
-    size -= 6;
-    EXPECT_EQ(size, read_buffer.Length());
-  }
-}
-
-}  // namespace rtc
diff --git a/rtc_base/byteorder.h b/rtc_base/byteorder.h
deleted file mode 100644
index 760ea06..0000000
--- a/rtc_base/byteorder.h
+++ /dev/null
@@ -1,178 +0,0 @@
-/*
- *  Copyright 2004 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_RTC_BASE_BYTEORDER_H_
-#define WEBRTC_RTC_BASE_BYTEORDER_H_
-
-#if defined(WEBRTC_POSIX) && !defined(__native_client__)
-#include <arpa/inet.h>
-#endif
-
-#include "webrtc/rtc_base/basictypes.h"
-
-#if defined(WEBRTC_MAC)
-#include <libkern/OSByteOrder.h>
-
-#define htobe16(v) OSSwapHostToBigInt16(v)
-#define htobe32(v) OSSwapHostToBigInt32(v)
-#define htobe64(v) OSSwapHostToBigInt64(v)
-#define be16toh(v) OSSwapBigToHostInt16(v)
-#define be32toh(v) OSSwapBigToHostInt32(v)
-#define be64toh(v) OSSwapBigToHostInt64(v)
-
-#define htole16(v) OSSwapHostToLittleInt16(v)
-#define htole32(v) OSSwapHostToLittleInt32(v)
-#define htole64(v) OSSwapHostToLittleInt64(v)
-#define le16toh(v) OSSwapLittleToHostInt16(v)
-#define le32toh(v) OSSwapLittleToHostInt32(v)
-#define le64toh(v) OSSwapLittleToHostInt64(v)
-#elif defined(WEBRTC_WIN) || defined(__native_client__)
-
-#if defined(WEBRTC_WIN)
-#include <stdlib.h>
-#include <winsock2.h>
-#else
-#include <netinet/in.h>
-#endif
-
-#define htobe16(v) htons(v)
-#define htobe32(v) htonl(v)
-#define be16toh(v) ntohs(v)
-#define be32toh(v) ntohl(v)
-#if defined(WEBRTC_WIN)
-#define htobe64(v) htonll(v)
-#define be64toh(v) ntohll(v)
-#endif
-
-#if defined(RTC_ARCH_CPU_LITTLE_ENDIAN)
-#define htole16(v) (v)
-#define htole32(v) (v)
-#define htole64(v) (v)
-#define le16toh(v) (v)
-#define le32toh(v) (v)
-#define le64toh(v) (v)
-#if defined(__native_client__)
-#define htobe64(v) __builtin_bswap64(v)
-#define be64toh(v) __builtin_bswap64(v)
-#endif
-#elif defined(RTC_ARCH_CPU_BIG_ENDIAN)
-#define htole16(v) __builtin_bswap16(v)
-#define htole32(v) __builtin_bswap32(v)
-#define htole64(v) __builtin_bswap64(v)
-#define le16toh(v) __builtin_bswap16(v)
-#define le32toh(v) __builtin_bswap32(v)
-#define le64toh(v) __builtin_bswap64(v)
-#if defined(__native_client__)
-#define htobe64(v) (v)
-#define be64toh(v) (v)
-#endif
-#else
-#error RTC_ARCH_CPU_BIG_ENDIAN or RTC_ARCH_CPU_LITTLE_ENDIAN must be defined.
-#endif  // defined(RTC_ARCH_CPU_LITTLE_ENDIAN)
-#elif defined(WEBRTC_POSIX)
-#include <endian.h>
-#endif
-
-namespace rtc {
-
-// Reading and writing of little and big-endian numbers from memory
-
-inline void Set8(void* memory, size_t offset, uint8_t v) {
-  static_cast<uint8_t*>(memory)[offset] = v;
-}
-
-inline uint8_t Get8(const void* memory, size_t offset) {
-  return static_cast<const uint8_t*>(memory)[offset];
-}
-
-inline void SetBE16(void* memory, uint16_t v) {
-  *static_cast<uint16_t*>(memory) = htobe16(v);
-}
-
-inline void SetBE32(void* memory, uint32_t v) {
-  *static_cast<uint32_t*>(memory) = htobe32(v);
-}
-
-inline void SetBE64(void* memory, uint64_t v) {
-  *static_cast<uint64_t*>(memory) = htobe64(v);
-}
-
-inline uint16_t GetBE16(const void* memory) {
-  return be16toh(*static_cast<const uint16_t*>(memory));
-}
-
-inline uint32_t GetBE32(const void* memory) {
-  return be32toh(*static_cast<const uint32_t*>(memory));
-}
-
-inline uint64_t GetBE64(const void* memory) {
-  return be64toh(*static_cast<const uint64_t*>(memory));
-}
-
-inline void SetLE16(void* memory, uint16_t v) {
-  *static_cast<uint16_t*>(memory) = htole16(v);
-}
-
-inline void SetLE32(void* memory, uint32_t v) {
-  *static_cast<uint32_t*>(memory) = htole32(v);
-}
-
-inline void SetLE64(void* memory, uint64_t v) {
-  *static_cast<uint64_t*>(memory) = htole64(v);
-}
-
-inline uint16_t GetLE16(const void* memory) {
-  return le16toh(*static_cast<const uint16_t*>(memory));
-}
-
-inline uint32_t GetLE32(const void* memory) {
-  return le32toh(*static_cast<const uint32_t*>(memory));
-}
-
-inline uint64_t GetLE64(const void* memory) {
-  return le64toh(*static_cast<const uint64_t*>(memory));
-}
-
-// Check if the current host is big endian.
-inline bool IsHostBigEndian() {
-#if defined(RTC_ARCH_CPU_BIG_ENDIAN)
-  return true;
-#else
-  return false;
-#endif
-}
-
-inline uint16_t HostToNetwork16(uint16_t n) {
-  return htobe16(n);
-}
-
-inline uint32_t HostToNetwork32(uint32_t n) {
-  return htobe32(n);
-}
-
-inline uint64_t HostToNetwork64(uint64_t n) {
-  return htobe64(n);
-}
-
-inline uint16_t NetworkToHost16(uint16_t n) {
-  return be16toh(n);
-}
-
-inline uint32_t NetworkToHost32(uint32_t n) {
-  return be32toh(n);
-}
-
-inline uint64_t NetworkToHost64(uint64_t n) {
-  return be64toh(n);
-}
-
-}  // namespace rtc
-
-#endif  // WEBRTC_RTC_BASE_BYTEORDER_H_
diff --git a/rtc_base/byteorder_unittest.cc b/rtc_base/byteorder_unittest.cc
deleted file mode 100644
index aba8e9f..0000000
--- a/rtc_base/byteorder_unittest.cc
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- *  Copyright 2012 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 <stdint.h>
-
-#include "webrtc/rtc_base/byteorder.h"
-#include "webrtc/rtc_base/gunit.h"
-
-namespace rtc {
-
-// Test memory set functions put values into memory in expected order.
-TEST(ByteOrderTest, TestSet) {
-  uint8_t buf[8] = {0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u};
-  Set8(buf, 0, 0xfb);
-  Set8(buf, 1, 0x12);
-  EXPECT_EQ(0xfb, buf[0]);
-  EXPECT_EQ(0x12, buf[1]);
-  SetBE16(buf, 0x1234);
-  EXPECT_EQ(0x12, buf[0]);
-  EXPECT_EQ(0x34, buf[1]);
-  SetLE16(buf, 0x1234);
-  EXPECT_EQ(0x34, buf[0]);
-  EXPECT_EQ(0x12, buf[1]);
-  SetBE32(buf, 0x12345678);
-  EXPECT_EQ(0x12, buf[0]);
-  EXPECT_EQ(0x34, buf[1]);
-  EXPECT_EQ(0x56, buf[2]);
-  EXPECT_EQ(0x78, buf[3]);
-  SetLE32(buf, 0x12345678);
-  EXPECT_EQ(0x78, buf[0]);
-  EXPECT_EQ(0x56, buf[1]);
-  EXPECT_EQ(0x34, buf[2]);
-  EXPECT_EQ(0x12, buf[3]);
-  SetBE64(buf, UINT64_C(0x0123456789abcdef));
-  EXPECT_EQ(0x01, buf[0]);
-  EXPECT_EQ(0x23, buf[1]);
-  EXPECT_EQ(0x45, buf[2]);
-  EXPECT_EQ(0x67, buf[3]);
-  EXPECT_EQ(0x89, buf[4]);
-  EXPECT_EQ(0xab, buf[5]);
-  EXPECT_EQ(0xcd, buf[6]);
-  EXPECT_EQ(0xef, buf[7]);
-  SetLE64(buf, UINT64_C(0x0123456789abcdef));
-  EXPECT_EQ(0xef, buf[0]);
-  EXPECT_EQ(0xcd, buf[1]);
-  EXPECT_EQ(0xab, buf[2]);
-  EXPECT_EQ(0x89, buf[3]);
-  EXPECT_EQ(0x67, buf[4]);
-  EXPECT_EQ(0x45, buf[5]);
-  EXPECT_EQ(0x23, buf[6]);
-  EXPECT_EQ(0x01, buf[7]);
-}
-
-// Test memory get functions get values from memory in expected order.
-TEST(ByteOrderTest, TestGet) {
-  uint8_t buf[8];
-  buf[0] = 0x01u;
-  buf[1] = 0x23u;
-  buf[2] = 0x45u;
-  buf[3] = 0x67u;
-  buf[4] = 0x89u;
-  buf[5] = 0xabu;
-  buf[6] = 0xcdu;
-  buf[7] = 0xefu;
-  EXPECT_EQ(0x01u, Get8(buf, 0));
-  EXPECT_EQ(0x23u, Get8(buf, 1));
-  EXPECT_EQ(0x0123u, GetBE16(buf));
-  EXPECT_EQ(0x2301u, GetLE16(buf));
-  EXPECT_EQ(0x01234567u, GetBE32(buf));
-  EXPECT_EQ(0x67452301u, GetLE32(buf));
-  EXPECT_EQ(UINT64_C(0x0123456789abcdef), GetBE64(buf));
-  EXPECT_EQ(UINT64_C(0xefcdab8967452301), GetLE64(buf));
-}
-
-}  // namespace rtc
-
diff --git a/rtc_base/callback.h b/rtc_base/callback.h
deleted file mode 100644
index 41077e8..0000000
--- a/rtc_base/callback.h
+++ /dev/null
@@ -1,260 +0,0 @@
-// This file was GENERATED by command:
-//     pump.py callback.h.pump
-// DO NOT EDIT BY HAND!!!
-
-/*
- *  Copyright 2012 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.
- */
-
-// To generate callback.h from callback.h.pump, execute:
-// /home/build/google3/third_party/gtest/scripts/pump.py callback.h.pump
-
-// Callbacks are callable object containers. They can hold a function pointer
-// or a function object and behave like a value type. Internally, data is
-// reference-counted, making copies and pass-by-value inexpensive.
-//
-// Callbacks are typed using template arguments.  The format is:
-//   CallbackN<ReturnType, ParamType1, ..., ParamTypeN>
-// where N is the number of arguments supplied to the callable object.
-// Callbacks are invoked using operator(), just like a function or a function
-// object. Default-constructed callbacks are "empty," and executing an empty
-// callback does nothing. A callback can be made empty by assigning it from
-// a default-constructed callback.
-//
-// Callbacks are similar in purpose to std::function (which isn't available on
-// all platforms we support) and a lightweight alternative to sigslots. Since
-// they effectively hide the type of the object they call, they're useful in
-// breaking dependencies between objects that need to interact with one another.
-// Notably, they can hold the results of Bind(), std::bind*, etc, without
-// needing
-// to know the resulting object type of those calls.
-//
-// Sigslots, on the other hand, provide a fuller feature set, such as multiple
-// subscriptions to a signal, optional thread-safety, and lifetime tracking of
-// slots. When these features are needed, choose sigslots.
-//
-// Example:
-//   int sqr(int x) { return x * x; }
-//   struct AddK {
-//     int k;
-//     int operator()(int x) const { return x + k; }
-//   } add_k = {5};
-//
-//   Callback1<int, int> my_callback;
-//   cout << my_callback.empty() << endl;  // true
-//
-//   my_callback = Callback1<int, int>(&sqr);
-//   cout << my_callback.empty() << endl;  // false
-//   cout << my_callback(3) << endl;  // 9
-//
-//   my_callback = Callback1<int, int>(add_k);
-//   cout << my_callback(10) << endl;  // 15
-//
-//   my_callback = Callback1<int, int>();
-//   cout << my_callback.empty() << endl;  // true
-
-#ifndef WEBRTC_RTC_BASE_CALLBACK_H_
-#define WEBRTC_RTC_BASE_CALLBACK_H_
-
-#include "webrtc/rtc_base/refcount.h"
-#include "webrtc/rtc_base/scoped_ref_ptr.h"
-
-namespace rtc {
-
-template <class R>
-class Callback0 {
- public:
-  // Default copy operations are appropriate for this class.
-  Callback0() {}
-  template <class T> Callback0(const T& functor)
-      : helper_(new RefCountedObject< HelperImpl<T> >(functor)) {}
-  R operator()() {
-    if (empty())
-      return R();
-    return helper_->Run();
-  }
-  bool empty() const { return !helper_; }
-
- private:
-  struct Helper : RefCountInterface {
-    virtual ~Helper() {}
-    virtual R Run() = 0;
-  };
-  template <class T> struct HelperImpl : Helper {
-    explicit HelperImpl(const T& functor) : functor_(functor) {}
-    virtual R Run() {
-      return functor_();
-    }
-    T functor_;
-  };
-  scoped_refptr<Helper> helper_;
-};
-
-template <class R,
-          class P1>
-class Callback1 {
- public:
-  // Default copy operations are appropriate for this class.
-  Callback1() {}
-  template <class T> Callback1(const T& functor)
-      : helper_(new RefCountedObject< HelperImpl<T> >(functor)) {}
-  R operator()(P1 p1) {
-    if (empty())
-      return R();
-    return helper_->Run(p1);
-  }
-  bool empty() const { return !helper_; }
-
- private:
-  struct Helper : RefCountInterface {
-    virtual ~Helper() {}
-    virtual R Run(P1 p1) = 0;
-  };
-  template <class T> struct HelperImpl : Helper {
-    explicit HelperImpl(const T& functor) : functor_(functor) {}
-    virtual R Run(P1 p1) {
-      return functor_(p1);
-    }
-    T functor_;
-  };
-  scoped_refptr<Helper> helper_;
-};
-
-template <class R,
-          class P1,
-          class P2>
-class Callback2 {
- public:
-  // Default copy operations are appropriate for this class.
-  Callback2() {}
-  template <class T> Callback2(const T& functor)
-      : helper_(new RefCountedObject< HelperImpl<T> >(functor)) {}
-  R operator()(P1 p1, P2 p2) {
-    if (empty())
-      return R();
-    return helper_->Run(p1, p2);
-  }
-  bool empty() const { return !helper_; }
-
- private:
-  struct Helper : RefCountInterface {
-    virtual ~Helper() {}
-    virtual R Run(P1 p1, P2 p2) = 0;
-  };
-  template <class T> struct HelperImpl : Helper {
-    explicit HelperImpl(const T& functor) : functor_(functor) {}
-    virtual R Run(P1 p1, P2 p2) {
-      return functor_(p1, p2);
-    }
-    T functor_;
-  };
-  scoped_refptr<Helper> helper_;
-};
-
-template <class R,
-          class P1,
-          class P2,
-          class P3>
-class Callback3 {
- public:
-  // Default copy operations are appropriate for this class.
-  Callback3() {}
-  template <class T> Callback3(const T& functor)
-      : helper_(new RefCountedObject< HelperImpl<T> >(functor)) {}
-  R operator()(P1 p1, P2 p2, P3 p3) {
-    if (empty())
-      return R();
-    return helper_->Run(p1, p2, p3);
-  }
-  bool empty() const { return !helper_; }
-
- private:
-  struct Helper : RefCountInterface {
-    virtual ~Helper() {}
-    virtual R Run(P1 p1, P2 p2, P3 p3) = 0;
-  };
-  template <class T> struct HelperImpl : Helper {
-    explicit HelperImpl(const T& functor) : functor_(functor) {}
-    virtual R Run(P1 p1, P2 p2, P3 p3) {
-      return functor_(p1, p2, p3);
-    }
-    T functor_;
-  };
-  scoped_refptr<Helper> helper_;
-};
-
-template <class R,
-          class P1,
-          class P2,
-          class P3,
-          class P4>
-class Callback4 {
- public:
-  // Default copy operations are appropriate for this class.
-  Callback4() {}
-  template <class T> Callback4(const T& functor)
-      : helper_(new RefCountedObject< HelperImpl<T> >(functor)) {}
-  R operator()(P1 p1, P2 p2, P3 p3, P4 p4) {
-    if (empty())
-      return R();
-    return helper_->Run(p1, p2, p3, p4);
-  }
-  bool empty() const { return !helper_; }
-
- private:
-  struct Helper : RefCountInterface {
-    virtual ~Helper() {}
-    virtual R Run(P1 p1, P2 p2, P3 p3, P4 p4) = 0;
-  };
-  template <class T> struct HelperImpl : Helper {
-    explicit HelperImpl(const T& functor) : functor_(functor) {}
-    virtual R Run(P1 p1, P2 p2, P3 p3, P4 p4) {
-      return functor_(p1, p2, p3, p4);
-    }
-    T functor_;
-  };
-  scoped_refptr<Helper> helper_;
-};
-
-template <class R,
-          class P1,
-          class P2,
-          class P3,
-          class P4,
-          class P5>
-class Callback5 {
- public:
-  // Default copy operations are appropriate for this class.
-  Callback5() {}
-  template <class T> Callback5(const T& functor)
-      : helper_(new RefCountedObject< HelperImpl<T> >(functor)) {}
-  R operator()(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5) {
-    if (empty())
-      return R();
-    return helper_->Run(p1, p2, p3, p4, p5);
-  }
-  bool empty() const { return !helper_; }
-
- private:
-  struct Helper : RefCountInterface {
-    virtual ~Helper() {}
-    virtual R Run(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5) = 0;
-  };
-  template <class T> struct HelperImpl : Helper {
-    explicit HelperImpl(const T& functor) : functor_(functor) {}
-    virtual R Run(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5) {
-      return functor_(p1, p2, p3, p4, p5);
-    }
-    T functor_;
-  };
-  scoped_refptr<Helper> helper_;
-};
-}  // namespace rtc
-
-#endif  // WEBRTC_RTC_BASE_CALLBACK_H_
diff --git a/rtc_base/callback.h.pump b/rtc_base/callback.h.pump
deleted file mode 100644
index cceddf7..0000000
--- a/rtc_base/callback.h.pump
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- *  Copyright 2012 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.
- */
-
-// To generate callback.h from callback.h.pump, execute:
-// /home/build/google3/third_party/gtest/scripts/pump.py callback.h.pump
-
-// Callbacks are callable object containers. They can hold a function pointer
-// or a function object and behave like a value type. Internally, data is
-// reference-counted, making copies and pass-by-value inexpensive.
-//
-// Callbacks are typed using template arguments.  The format is:
-//   CallbackN<ReturnType, ParamType1, ..., ParamTypeN>
-// where N is the number of arguments supplied to the callable object.
-// Callbacks are invoked using operator(), just like a function or a function
-// object. Default-constructed callbacks are "empty," and executing an empty
-// callback does nothing. A callback can be made empty by assigning it from
-// a default-constructed callback.
-//
-// Callbacks are similar in purpose to std::function (which isn't available on
-// all platforms we support) and a lightweight alternative to sigslots. Since
-// they effectively hide the type of the object they call, they're useful in
-// breaking dependencies between objects that need to interact with one another.
-// Notably, they can hold the results of Bind(), std::bind*, etc, without needing
-// to know the resulting object type of those calls.
-//
-// Sigslots, on the other hand, provide a fuller feature set, such as multiple
-// subscriptions to a signal, optional thread-safety, and lifetime tracking of
-// slots. When these features are needed, choose sigslots.
-//
-// Example:
-//   int sqr(int x) { return x * x; }
-//   struct AddK {
-//     int k;
-//     int operator()(int x) const { return x + k; }
-//   } add_k = {5};
-//
-//   Callback1<int, int> my_callback;
-//   cout << my_callback.empty() << endl;  // true
-//
-//   my_callback = Callback1<int, int>(&sqr);
-//   cout << my_callback.empty() << endl;  // false
-//   cout << my_callback(3) << endl;  // 9
-//
-//   my_callback = Callback1<int, int>(add_k);
-//   cout << my_callback(10) << endl;  // 15
-//
-//   my_callback = Callback1<int, int>();
-//   cout << my_callback.empty() << endl;  // true
-
-#ifndef WEBRTC_RTC_BASE_CALLBACK_H_
-#define WEBRTC_RTC_BASE_CALLBACK_H_
-
-#include "webrtc/rtc_base/refcount.h"
-#include "webrtc/rtc_base/scoped_ref_ptr.h"
-
-namespace rtc {
-
-$var n = 5
-$range i 0..n
-$for i [[
-$range j 1..i
-
-template <class R$for j [[,
-          class P$j]]>
-class Callback$i {
- public:
-  // Default copy operations are appropriate for this class.
-  Callback$i() {}
-  template <class T> Callback$i(const T& functor)
-      : helper_(new RefCountedObject< HelperImpl<T> >(functor)) {}
-  R operator()($for j , [[P$j p$j]]) {
-    if (empty())
-      return R();
-    return helper_->Run($for j , [[p$j]]);
-  }
-  bool empty() const { return !helper_; }
-
- private:
-  struct Helper : RefCountInterface {
-    virtual ~Helper() {}
-    virtual R Run($for j , [[P$j p$j]]) = 0;
-  };
-  template <class T> struct HelperImpl : Helper {
-    explicit HelperImpl(const T& functor) : functor_(functor) {}
-    virtual R Run($for j , [[P$j p$j]]) {
-      return functor_($for j , [[p$j]]);
-    }
-    T functor_;
-  };
-  scoped_refptr<Helper> helper_;
-};
-
-]]
-}  // namespace rtc
-
-#endif  // WEBRTC_RTC_BASE_CALLBACK_H_
diff --git a/rtc_base/callback_unittest.cc b/rtc_base/callback_unittest.cc
deleted file mode 100644
index 0628686..0000000
--- a/rtc_base/callback_unittest.cc
+++ /dev/null
@@ -1,140 +0,0 @@
-/*
- *  Copyright 2004 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/rtc_base/callback.h"
-#include "webrtc/rtc_base/bind.h"
-#include "webrtc/rtc_base/gunit.h"
-#include "webrtc/rtc_base/keep_ref_until_done.h"
-#include "webrtc/rtc_base/refcount.h"
-
-namespace rtc {
-
-namespace {
-
-void f() {}
-int g() { return 42; }
-int h(int x) { return x * x; }
-void i(int& x) { x *= x; }  // NOLINT: Testing refs
-
-struct BindTester {
-  int a() { return 24; }
-  int b(int x) const { return x * x; }
-};
-
-class RefCountedBindTester : public RefCountInterface {
- public:
-  RefCountedBindTester() : count_(0) {}
-  int AddRef() const override {
-    return ++count_;
-  }
-  int Release() const override {
-    return --count_;
-  }
-  int RefCount() const { return count_; }
-
- private:
-  mutable int count_;
-};
-
-}  // namespace
-
-TEST(CallbackTest, VoidReturn) {
-  Callback0<void> cb;
-  EXPECT_TRUE(cb.empty());
-  cb();  // Executing an empty callback should not crash.
-  cb = Callback0<void>(&f);
-  EXPECT_FALSE(cb.empty());
-  cb();
-}
-
-TEST(CallbackTest, IntReturn) {
-  Callback0<int> cb;
-  EXPECT_TRUE(cb.empty());
-  cb = Callback0<int>(&g);
-  EXPECT_FALSE(cb.empty());
-  EXPECT_EQ(42, cb());
-  EXPECT_EQ(42, cb());
-}
-
-TEST(CallbackTest, OneParam) {
-  Callback1<int, int> cb1(&h);
-  EXPECT_FALSE(cb1.empty());
-  EXPECT_EQ(9, cb1(-3));
-  EXPECT_EQ(100, cb1(10));
-
-  // Try clearing a callback.
-  cb1 = Callback1<int, int>();
-  EXPECT_TRUE(cb1.empty());
-
-  // Try a callback with a ref parameter.
-  Callback1<void, int&> cb2(&i);
-  int x = 3;
-  cb2(x);
-  EXPECT_EQ(9, x);
-  cb2(x);
-  EXPECT_EQ(81, x);
-}
-
-TEST(CallbackTest, WithBind) {
-  BindTester t;
-  Callback0<int> cb1 = Bind(&BindTester::a, &t);
-  EXPECT_EQ(24, cb1());
-  EXPECT_EQ(24, cb1());
-  cb1 = Bind(&BindTester::b, &t, 10);
-  EXPECT_EQ(100, cb1());
-  EXPECT_EQ(100, cb1());
-  cb1 = Bind(&BindTester::b, &t, 5);
-  EXPECT_EQ(25, cb1());
-  EXPECT_EQ(25, cb1());
-}
-
-TEST(KeepRefUntilDoneTest, simple) {
-  RefCountedBindTester t;
-  EXPECT_EQ(0, t.RefCount());
-  {
-    Callback0<void> cb = KeepRefUntilDone(&t);
-    EXPECT_EQ(1, t.RefCount());
-    cb();
-    EXPECT_EQ(1, t.RefCount());
-    cb();
-    EXPECT_EQ(1, t.RefCount());
-  }
-  EXPECT_EQ(0, t.RefCount());
-}
-
-TEST(KeepRefUntilDoneTest, copy) {
-  RefCountedBindTester t;
-  EXPECT_EQ(0, t.RefCount());
-  Callback0<void> cb2;
-  {
-    Callback0<void> cb = KeepRefUntilDone(&t);
-    EXPECT_EQ(1, t.RefCount());
-    cb2 = cb;
-  }
-  EXPECT_EQ(1, t.RefCount());
-  cb2 = Callback0<void>();
-  EXPECT_EQ(0, t.RefCount());
-}
-
-TEST(KeepRefUntilDoneTest, scopedref) {
-  RefCountedBindTester t;
-  EXPECT_EQ(0, t.RefCount());
-  {
-    scoped_refptr<RefCountedBindTester> t_scoped_ref(&t);
-    Callback0<void> cb = KeepRefUntilDone(t_scoped_ref);
-    t_scoped_ref = nullptr;
-    EXPECT_EQ(1, t.RefCount());
-    cb();
-    EXPECT_EQ(1, t.RefCount());
-  }
-  EXPECT_EQ(0, t.RefCount());
-}
-
-}  // namespace rtc
diff --git a/rtc_base/checks.cc b/rtc_base/checks.cc
deleted file mode 100644
index 533240f..0000000
--- a/rtc_base/checks.cc
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- *  Copyright 2006 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.
- */
-
-// Most of this was borrowed (with minor modifications) from V8's and Chromium's
-// src/base/logging.cc.
-
-// Use the C++ version to provide __GLIBCXX__.
-#include <cstdarg>
-#include <cstdio>
-#include <cstdlib>
-
-#if defined(__GLIBCXX__) && !defined(__UCLIBC__)
-#include <cxxabi.h>
-#include <execinfo.h>
-#endif
-
-#if defined(WEBRTC_ANDROID)
-#define RTC_LOG_TAG "rtc"
-#include <android/log.h>  // NOLINT
-#endif
-
-#if defined(WEBRTC_WIN)
-#include <windows.h>
-#endif
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-
-#if defined(_MSC_VER)
-// Warning C4722: destructor never returns, potential memory leak.
-// FatalMessage's dtor very intentionally aborts.
-#pragma warning(disable:4722)
-#endif
-
-namespace rtc {
-
-void VPrintError(const char* format, va_list args) {
-#if defined(WEBRTC_ANDROID)
-  __android_log_vprint(ANDROID_LOG_ERROR, RTC_LOG_TAG, format, args);
-#else
-  vfprintf(stderr, format, args);
-#endif
-}
-
-void PrintError(const char* format, ...) {
-  va_list args;
-  va_start(args, format);
-  VPrintError(format, args);
-  va_end(args);
-}
-
-// TODO(ajm): This works on Mac (although the parsing fails) but I don't seem
-// to get usable symbols on Linux. This is copied from V8. Chromium has a more
-// advanced stace trace system; also more difficult to copy.
-void DumpBacktrace() {
-#if defined(__GLIBCXX__) && !defined(__UCLIBC__)
-  void* trace[100];
-  int size = backtrace(trace, sizeof(trace) / sizeof(*trace));
-  char** symbols = backtrace_symbols(trace, size);
-  PrintError("\n==== C stack trace ===============================\n\n");
-  if (size == 0) {
-    PrintError("(empty)\n");
-  } else if (symbols == nullptr) {
-    PrintError("(no symbols)\n");
-  } else {
-    for (int i = 1; i < size; ++i) {
-      char mangled[201];
-      if (sscanf(symbols[i], "%*[^(]%*[(]%200[^)+]", mangled) == 1) {  // NOLINT
-        PrintError("%2d: ", i);
-        int status;
-        size_t length;
-        char* demangled =
-            abi::__cxa_demangle(mangled, nullptr, &length, &status);
-        PrintError("%s\n", demangled != nullptr ? demangled : mangled);
-        free(demangled);
-      } else {
-        // If parsing failed, at least print the unparsed symbol.
-        PrintError("%s\n", symbols[i]);
-      }
-    }
-  }
-  free(symbols);
-#endif
-}
-
-FatalMessage::FatalMessage(const char* file, int line) {
-  Init(file, line);
-}
-
-FatalMessage::FatalMessage(const char* file, int line, std::string* result) {
-  Init(file, line);
-  stream_ << "Check failed: " << *result << std::endl << "# ";
-  delete result;
-}
-
-NO_RETURN FatalMessage::~FatalMessage() {
-  fflush(stdout);
-  fflush(stderr);
-  stream_ << std::endl << "#" << std::endl;
-  PrintError(stream_.str().c_str());
-  DumpBacktrace();
-  fflush(stderr);
-  abort();
-}
-
-void FatalMessage::Init(const char* file, int line) {
-  stream_ << std::endl << std::endl
-          << "#" << std::endl
-          << "# Fatal error in " << file << ", line " << line << std::endl
-          << "# last system error: " << LAST_SYSTEM_ERROR << std::endl
-          << "# ";
-}
-
-// MSVC doesn't like complex extern templates and DLLs.
-#if !defined(COMPILER_MSVC)
-// Explicit instantiations for commonly used comparisons.
-template std::string* MakeCheckOpString<int, int>(
-    const int&, const int&, const char* names);
-template std::string* MakeCheckOpString<unsigned long, unsigned long>(
-    const unsigned long&, const unsigned long&, const char* names);
-template std::string* MakeCheckOpString<unsigned long, unsigned int>(
-    const unsigned long&, const unsigned int&, const char* names);
-template std::string* MakeCheckOpString<unsigned int, unsigned long>(
-    const unsigned int&, const unsigned long&, const char* names);
-template std::string* MakeCheckOpString<std::string, std::string>(
-    const std::string&, const std::string&, const char* name);
-#endif
-
-}  // namespace rtc
-
-// Function to call from the C version of the RTC_CHECK and RTC_DCHECK macros.
-NO_RETURN void rtc_FatalMessage(const char* file, int line, const char* msg) {
-  rtc::FatalMessage(file, line).stream() << msg;
-}
diff --git a/rtc_base/checks.h b/rtc_base/checks.h
deleted file mode 100644
index f9507e2..0000000
--- a/rtc_base/checks.h
+++ /dev/null
@@ -1,289 +0,0 @@
-/*
- *  Copyright 2006 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_RTC_BASE_CHECKS_H_
-#define WEBRTC_RTC_BASE_CHECKS_H_
-
-#include "webrtc/typedefs.h"
-
-// If you for some reson need to know if DCHECKs are on, test the value of
-// RTC_DCHECK_IS_ON. (Test its value, not if it's defined; it'll always be
-// defined, to either a true or a false value.)
-#if !defined(NDEBUG) || defined(DCHECK_ALWAYS_ON)
-#define RTC_DCHECK_IS_ON 1
-#else
-#define RTC_DCHECK_IS_ON 0
-#endif
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-NO_RETURN void rtc_FatalMessage(const char* file, int line, const char* msg);
-#ifdef __cplusplus
-}  // extern "C"
-#endif
-
-#ifdef __cplusplus
-// C++ version.
-
-#include <sstream>
-#include <string>
-
-#include "webrtc/rtc_base/safe_compare.h"
-
-// The macros here print a message to stderr and abort under various
-// conditions. All will accept additional stream messages. For example:
-// RTC_DCHECK_EQ(foo, bar) << "I'm printed when foo != bar.";
-//
-// - RTC_CHECK(x) is an assertion that x is always true, and that if it isn't,
-//   it's better to terminate the process than to continue. During development,
-//   the reason that it's better to terminate might simply be that the error
-//   handling code isn't in place yet; in production, the reason might be that
-//   the author of the code truly believes that x will always be true, but that
-//   she recognizes that if she is wrong, abrupt and unpleasant process
-//   termination is still better than carrying on with the assumption violated.
-//
-//   RTC_CHECK always evaluates its argument, so it's OK for x to have side
-//   effects.
-//
-// - RTC_DCHECK(x) is the same as RTC_CHECK(x)---an assertion that x is always
-//   true---except that x will only be evaluated in debug builds; in production
-//   builds, x is simply assumed to be true. This is useful if evaluating x is
-//   expensive and the expected cost of failing to detect the violated
-//   assumption is acceptable. You should not handle cases where a production
-//   build fails to spot a violated condition, even those that would result in
-//   crashes. If the code needs to cope with the error, make it cope, but don't
-//   call RTC_DCHECK; if the condition really can't occur, but you'd sleep
-//   better at night knowing that the process will suicide instead of carrying
-//   on in case you were wrong, use RTC_CHECK instead of RTC_DCHECK.
-//
-//   RTC_DCHECK only evaluates its argument in debug builds, so if x has visible
-//   side effects, you need to write e.g.
-//     bool w = x; RTC_DCHECK(w);
-//
-// - RTC_CHECK_EQ, _NE, _GT, ..., and RTC_DCHECK_EQ, _NE, _GT, ... are
-//   specialized variants of RTC_CHECK and RTC_DCHECK that print prettier
-//   messages if the condition doesn't hold. Prefer them to raw RTC_CHECK and
-//   RTC_DCHECK.
-//
-// - FATAL() aborts unconditionally.
-//
-// TODO(ajm): Ideally, checks.h would be combined with logging.h, but
-// consolidation with system_wrappers/logging.h should happen first.
-
-namespace rtc {
-
-// Helper macro which avoids evaluating the arguments to a stream if
-// the condition doesn't hold.
-#define RTC_LAZY_STREAM(stream, condition)                                    \
-  !(condition) ? static_cast<void>(0) : rtc::FatalMessageVoidify() & (stream)
-
-// The actual stream used isn't important. We reference |ignored| in the code
-// but don't evaluate it; this is to avoid "unused variable" warnings (we do so
-// in a particularly convoluted way with an extra ?: because that appears to be
-// the simplest construct that keeps Visual Studio from complaining about
-// condition being unused).
-#define RTC_EAT_STREAM_PARAMETERS(ignored) \
-  (true ? true : ((void)(ignored), true))  \
-      ? static_cast<void>(0)               \
-      : rtc::FatalMessageVoidify() & rtc::FatalMessage("", 0).stream()
-
-// Call RTC_EAT_STREAM_PARAMETERS with an argument that fails to compile if
-// values of the same types as |a| and |b| can't be compared with the given
-// operation, and that would evaluate |a| and |b| if evaluated.
-#define RTC_EAT_STREAM_PARAMETERS_OP(op, a, b) \
-  RTC_EAT_STREAM_PARAMETERS(((void)rtc::Safe##op(a, b)))
-
-// RTC_CHECK dies with a fatal error if condition is not true. It is *not*
-// controlled by NDEBUG or anything else, so the check will be executed
-// regardless of compilation mode.
-//
-// We make sure RTC_CHECK et al. always evaluates their arguments, as
-// doing RTC_CHECK(FunctionWithSideEffect()) is a common idiom.
-#define RTC_CHECK(condition)                                      \
-  RTC_LAZY_STREAM(rtc::FatalMessage(__FILE__, __LINE__).stream(), \
-                  !(condition))                                   \
-      << "Check failed: " #condition << std::endl << "# "
-
-// Helper macro for binary operators.
-// Don't use this macro directly in your code, use RTC_CHECK_EQ et al below.
-//
-// TODO(akalin): Rewrite this so that constructs like if (...)
-// RTC_CHECK_EQ(...) else { ... } work properly.
-#define RTC_CHECK_OP(name, op, val1, val2)                                 \
-  if (std::string* _result =                                               \
-          rtc::Check##name##Impl((val1), (val2), #val1 " " #op " " #val2)) \
-    rtc::FatalMessage(__FILE__, __LINE__, _result).stream()
-
-// Build the error message string.  This is separate from the "Impl"
-// function template because it is not performance critical and so can
-// be out of line, while the "Impl" code should be inline.  Caller
-// takes ownership of the returned string.
-template<class t1, class t2>
-std::string* MakeCheckOpString(const t1& v1, const t2& v2, const char* names) {
-  std::ostringstream ss;
-  ss << names << " (" << v1 << " vs. " << v2 << ")";
-  std::string* msg = new std::string(ss.str());
-  return msg;
-}
-
-// MSVC doesn't like complex extern templates and DLLs.
-#if !defined(COMPILER_MSVC)
-// Commonly used instantiations of MakeCheckOpString<>. Explicitly instantiated
-// in logging.cc.
-extern template std::string* MakeCheckOpString<int, int>(
-    const int&, const int&, const char* names);
-extern template
-std::string* MakeCheckOpString<unsigned long, unsigned long>(
-    const unsigned long&, const unsigned long&, const char* names);
-extern template
-std::string* MakeCheckOpString<unsigned long, unsigned int>(
-    const unsigned long&, const unsigned int&, const char* names);
-extern template
-std::string* MakeCheckOpString<unsigned int, unsigned long>(
-    const unsigned int&, const unsigned long&, const char* names);
-extern template
-std::string* MakeCheckOpString<std::string, std::string>(
-    const std::string&, const std::string&, const char* name);
-#endif
-
-// Helper functions for RTC_CHECK_OP macro.
-// The (int, int) specialization works around the issue that the compiler
-// will not instantiate the template version of the function on values of
-// unnamed enum type - see comment below.
-#define DEFINE_RTC_CHECK_OP_IMPL(name)                                       \
-  template <class t1, class t2>                                              \
-  inline std::string* Check##name##Impl(const t1& v1, const t2& v2,          \
-                                        const char* names) {                 \
-    if (rtc::Safe##name(v1, v2))                                             \
-      return nullptr;                                                        \
-    else                                                                     \
-      return rtc::MakeCheckOpString(v1, v2, names);                          \
-  }                                                                          \
-  inline std::string* Check##name##Impl(int v1, int v2, const char* names) { \
-    if (rtc::Safe##name(v1, v2))                                             \
-      return nullptr;                                                        \
-    else                                                                     \
-      return rtc::MakeCheckOpString(v1, v2, names);                          \
-  }
-DEFINE_RTC_CHECK_OP_IMPL(Eq)
-DEFINE_RTC_CHECK_OP_IMPL(Ne)
-DEFINE_RTC_CHECK_OP_IMPL(Le)
-DEFINE_RTC_CHECK_OP_IMPL(Lt)
-DEFINE_RTC_CHECK_OP_IMPL(Ge)
-DEFINE_RTC_CHECK_OP_IMPL(Gt)
-#undef DEFINE_RTC_CHECK_OP_IMPL
-
-#define RTC_CHECK_EQ(val1, val2) RTC_CHECK_OP(Eq, ==, val1, val2)
-#define RTC_CHECK_NE(val1, val2) RTC_CHECK_OP(Ne, !=, val1, val2)
-#define RTC_CHECK_LE(val1, val2) RTC_CHECK_OP(Le, <=, val1, val2)
-#define RTC_CHECK_LT(val1, val2) RTC_CHECK_OP(Lt, <, val1, val2)
-#define RTC_CHECK_GE(val1, val2) RTC_CHECK_OP(Ge, >=, val1, val2)
-#define RTC_CHECK_GT(val1, val2) RTC_CHECK_OP(Gt, >, val1, val2)
-
-// The RTC_DCHECK macro is equivalent to RTC_CHECK except that it only generates
-// code in debug builds. It does reference the condition parameter in all cases,
-// though, so callers won't risk getting warnings about unused variables.
-#if RTC_DCHECK_IS_ON
-#define RTC_DCHECK(condition) RTC_CHECK(condition)
-#define RTC_DCHECK_EQ(v1, v2) RTC_CHECK_EQ(v1, v2)
-#define RTC_DCHECK_NE(v1, v2) RTC_CHECK_NE(v1, v2)
-#define RTC_DCHECK_LE(v1, v2) RTC_CHECK_LE(v1, v2)
-#define RTC_DCHECK_LT(v1, v2) RTC_CHECK_LT(v1, v2)
-#define RTC_DCHECK_GE(v1, v2) RTC_CHECK_GE(v1, v2)
-#define RTC_DCHECK_GT(v1, v2) RTC_CHECK_GT(v1, v2)
-#else
-#define RTC_DCHECK(condition) RTC_EAT_STREAM_PARAMETERS(condition)
-#define RTC_DCHECK_EQ(v1, v2) RTC_EAT_STREAM_PARAMETERS_OP(Eq, v1, v2)
-#define RTC_DCHECK_NE(v1, v2) RTC_EAT_STREAM_PARAMETERS_OP(Ne, v1, v2)
-#define RTC_DCHECK_LE(v1, v2) RTC_EAT_STREAM_PARAMETERS_OP(Le, v1, v2)
-#define RTC_DCHECK_LT(v1, v2) RTC_EAT_STREAM_PARAMETERS_OP(Lt, v1, v2)
-#define RTC_DCHECK_GE(v1, v2) RTC_EAT_STREAM_PARAMETERS_OP(Ge, v1, v2)
-#define RTC_DCHECK_GT(v1, v2) RTC_EAT_STREAM_PARAMETERS_OP(Gt, v1, v2)
-#endif
-
-// This is identical to LogMessageVoidify but in name.
-class FatalMessageVoidify {
- public:
-  FatalMessageVoidify() { }
-  // This has to be an operator with a precedence lower than << but
-  // higher than ?:
-  void operator&(std::ostream&) { }
-};
-
-#define RTC_UNREACHABLE_CODE_HIT false
-#define RTC_NOTREACHED() RTC_DCHECK(RTC_UNREACHABLE_CODE_HIT)
-
-#define FATAL() rtc::FatalMessage(__FILE__, __LINE__).stream()
-// TODO(ajm): Consider adding RTC_NOTIMPLEMENTED macro when
-// base/logging.h and system_wrappers/logging.h are consolidated such that we
-// can match the Chromium behavior.
-
-// Like a stripped-down LogMessage from logging.h, except that it aborts.
-class FatalMessage {
- public:
-  FatalMessage(const char* file, int line);
-  // Used for RTC_CHECK_EQ(), etc. Takes ownership of the given string.
-  FatalMessage(const char* file, int line, std::string* result);
-  NO_RETURN ~FatalMessage();
-
-  std::ostream& stream() { return stream_; }
-
- private:
-  void Init(const char* file, int line);
-
-  std::ostringstream stream_;
-};
-
-// Performs the integer division a/b and returns the result. CHECKs that the
-// remainder is zero.
-template <typename T>
-inline T CheckedDivExact(T a, T b) {
-  RTC_CHECK_EQ(a % b, 0) << a << " is not evenly divisible by " << b;
-  return a / b;
-}
-
-}  // namespace rtc
-
-#else  // __cplusplus not defined
-// C version. Lacks many features compared to the C++ version, but usage
-// guidelines are the same.
-
-#define RTC_CHECK(condition)                                             \
-  do {                                                                   \
-    if (!(condition)) {                                                  \
-      rtc_FatalMessage(__FILE__, __LINE__, "CHECK failed: " #condition); \
-    }                                                                    \
-  } while (0)
-
-#define RTC_CHECK_EQ(a, b) RTC_CHECK((a) == (b))
-#define RTC_CHECK_NE(a, b) RTC_CHECK((a) != (b))
-#define RTC_CHECK_LE(a, b) RTC_CHECK((a) <= (b))
-#define RTC_CHECK_LT(a, b) RTC_CHECK((a) < (b))
-#define RTC_CHECK_GE(a, b) RTC_CHECK((a) >= (b))
-#define RTC_CHECK_GT(a, b) RTC_CHECK((a) > (b))
-
-#define RTC_DCHECK(condition)                                             \
-  do {                                                                    \
-    if (RTC_DCHECK_IS_ON && !(condition)) {                               \
-      rtc_FatalMessage(__FILE__, __LINE__, "DCHECK failed: " #condition); \
-    }                                                                     \
-  } while (0)
-
-#define RTC_DCHECK_EQ(a, b) RTC_DCHECK((a) == (b))
-#define RTC_DCHECK_NE(a, b) RTC_DCHECK((a) != (b))
-#define RTC_DCHECK_LE(a, b) RTC_DCHECK((a) <= (b))
-#define RTC_DCHECK_LT(a, b) RTC_DCHECK((a) < (b))
-#define RTC_DCHECK_GE(a, b) RTC_DCHECK((a) >= (b))
-#define RTC_DCHECK_GT(a, b) RTC_DCHECK((a) > (b))
-
-#endif  // __cplusplus
-
-#endif  // WEBRTC_RTC_BASE_CHECKS_H_
diff --git a/rtc_base/compile_assert_c.h b/rtc_base/compile_assert_c.h
deleted file mode 100644
index 591eda1..0000000
--- a/rtc_base/compile_assert_c.h
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- *  Copyright (c) 2012 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_RTC_BASE_COMPILE_ASSERT_C_H_
-#define WEBRTC_RTC_BASE_COMPILE_ASSERT_C_H_
-
-// Use this macro to verify at compile time that certain restrictions are met.
-// The argument is the boolean expression to evaluate.
-// Example:
-//   RTC_COMPILE_ASSERT(sizeof(foo) < 128);
-// Note: In C++, use static_assert instead!
-#define RTC_COMPILE_ASSERT(expression) switch (0) {case 0: case expression:;}
-
-#endif  // WEBRTC_RTC_BASE_COMPILE_ASSERT_C_H_
diff --git a/rtc_base/constructormagic.h b/rtc_base/constructormagic.h
deleted file mode 100644
index 14de7e8..0000000
--- a/rtc_base/constructormagic.h
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- *  Copyright 2004 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_RTC_BASE_CONSTRUCTORMAGIC_H_
-#define WEBRTC_RTC_BASE_CONSTRUCTORMAGIC_H_
-
-// Put this in the declarations for a class to be unassignable.
-#define RTC_DISALLOW_ASSIGN(TypeName) \
-  void operator=(const TypeName&) = delete
-
-// A macro to disallow the copy constructor and operator= functions. This should
-// be used in the declarations for a class.
-#define RTC_DISALLOW_COPY_AND_ASSIGN(TypeName) \
-  TypeName(const TypeName&) = delete;          \
-  RTC_DISALLOW_ASSIGN(TypeName)
-
-// A macro to disallow all the implicit constructors, namely the default
-// constructor, copy constructor and operator= functions.
-//
-// This should be used in the declarations for a class that wants to prevent
-// anyone from instantiating it. This is especially useful for classes
-// containing only static methods.
-#define RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(TypeName) \
-  TypeName() = delete;                               \
-  RTC_DISALLOW_COPY_AND_ASSIGN(TypeName)
-
-#endif  // WEBRTC_RTC_BASE_CONSTRUCTORMAGIC_H_
diff --git a/rtc_base/copyonwritebuffer.cc b/rtc_base/copyonwritebuffer.cc
deleted file mode 100644
index 76db6f5..0000000
--- a/rtc_base/copyonwritebuffer.cc
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- *  Copyright 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/rtc_base/copyonwritebuffer.h"
-
-namespace rtc {
-
-CopyOnWriteBuffer::CopyOnWriteBuffer() {
-  RTC_DCHECK(IsConsistent());
-}
-
-CopyOnWriteBuffer::CopyOnWriteBuffer(const CopyOnWriteBuffer& buf)
-    : buffer_(buf.buffer_) {
-}
-
-CopyOnWriteBuffer::CopyOnWriteBuffer(CopyOnWriteBuffer&& buf)
-    : buffer_(std::move(buf.buffer_)) {
-}
-
-CopyOnWriteBuffer::CopyOnWriteBuffer(size_t size)
-    : buffer_(size > 0 ? new RefCountedObject<Buffer>(size) : nullptr) {
-  RTC_DCHECK(IsConsistent());
-}
-
-CopyOnWriteBuffer::CopyOnWriteBuffer(size_t size, size_t capacity)
-    : buffer_(size > 0 || capacity > 0
-          ? new RefCountedObject<Buffer>(size, capacity)
-          : nullptr) {
-  RTC_DCHECK(IsConsistent());
-}
-
-CopyOnWriteBuffer::~CopyOnWriteBuffer() = default;
-
-bool CopyOnWriteBuffer::operator==(const CopyOnWriteBuffer& buf) const {
-  // Must either use the same buffer internally or have the same contents.
-  RTC_DCHECK(IsConsistent());
-  RTC_DCHECK(buf.IsConsistent());
-  return buffer_.get() == buf.buffer_.get() ||
-      (buffer_.get() && buf.buffer_.get() &&
-      *buffer_.get() == *buf.buffer_.get());
-}
-
-void CopyOnWriteBuffer::SetSize(size_t size) {
-  RTC_DCHECK(IsConsistent());
-  if (!buffer_) {
-    if (size > 0) {
-      buffer_ = new RefCountedObject<Buffer>(size);
-    }
-    RTC_DCHECK(IsConsistent());
-    return;
-  }
-
-  // Clone data if referenced.
-  if (!buffer_->HasOneRef()) {
-    buffer_ = new RefCountedObject<Buffer>(
-        buffer_->data(),
-        std::min(buffer_->size(), size),
-        std::max(buffer_->capacity(), size));
-  }
-  buffer_->SetSize(size);
-  RTC_DCHECK(IsConsistent());
-}
-
-void CopyOnWriteBuffer::EnsureCapacity(size_t capacity) {
-  RTC_DCHECK(IsConsistent());
-  if (!buffer_) {
-    if (capacity > 0) {
-      buffer_ = new RefCountedObject<Buffer>(0, capacity);
-    }
-    RTC_DCHECK(IsConsistent());
-    return;
-  } else if (capacity <= buffer_->capacity()) {
-    return;
-  }
-
-  CloneDataIfReferenced(std::max(buffer_->capacity(), capacity));
-  buffer_->EnsureCapacity(capacity);
-  RTC_DCHECK(IsConsistent());
-}
-
-void CopyOnWriteBuffer::Clear() {
-  if (!buffer_)
-    return;
-
-  if (buffer_->HasOneRef()) {
-    buffer_->Clear();
-  } else {
-    buffer_ = new RefCountedObject<Buffer>(0, buffer_->capacity());
-  }
-  RTC_DCHECK(IsConsistent());
-}
-
-void CopyOnWriteBuffer::CloneDataIfReferenced(size_t new_capacity) {
-  if (buffer_->HasOneRef()) {
-    return;
-  }
-
-  buffer_ = new RefCountedObject<Buffer>(buffer_->data(), buffer_->size(),
-      new_capacity);
-  RTC_DCHECK(IsConsistent());
-}
-
-
-
-}  // namespace rtc
diff --git a/rtc_base/copyonwritebuffer.h b/rtc_base/copyonwritebuffer.h
deleted file mode 100644
index a247917..0000000
--- a/rtc_base/copyonwritebuffer.h
+++ /dev/null
@@ -1,241 +0,0 @@
-/*
- *  Copyright 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_RTC_BASE_COPYONWRITEBUFFER_H_
-#define WEBRTC_RTC_BASE_COPYONWRITEBUFFER_H_
-
-#include <algorithm>
-#include <utility>
-
-#include "webrtc/rtc_base/buffer.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/refcount.h"
-#include "webrtc/rtc_base/scoped_ref_ptr.h"
-
-namespace rtc {
-
-class CopyOnWriteBuffer {
- public:
-  // An empty buffer.
-  CopyOnWriteBuffer();
-  // Copy size and contents of an existing buffer.
-  CopyOnWriteBuffer(const CopyOnWriteBuffer& buf);
-  // Move contents from an existing buffer.
-  CopyOnWriteBuffer(CopyOnWriteBuffer&& buf);
-
-  // Construct a buffer with the specified number of uninitialized bytes.
-  explicit CopyOnWriteBuffer(size_t size);
-  CopyOnWriteBuffer(size_t size, size_t capacity);
-
-  // Construct a buffer and copy the specified number of bytes into it. The
-  // source array may be (const) uint8_t*, int8_t*, or char*.
-  template <typename T,
-            typename std::enable_if<
-                internal::BufferCompat<uint8_t, T>::value>::type* = nullptr>
-  CopyOnWriteBuffer(const T* data, size_t size)
-      : CopyOnWriteBuffer(data, size, size) {}
-  template <typename T,
-            typename std::enable_if<
-                internal::BufferCompat<uint8_t, T>::value>::type* = nullptr>
-  CopyOnWriteBuffer(const T* data, size_t size, size_t capacity)
-      : CopyOnWriteBuffer(size, capacity) {
-    if (buffer_) {
-      std::memcpy(buffer_->data(), data, size);
-    }
-  }
-
-  // Construct a buffer from the contents of an array.
-  template <typename T,
-            size_t N,
-            typename std::enable_if<
-                internal::BufferCompat<uint8_t, T>::value>::type* = nullptr>
-  CopyOnWriteBuffer(const T (&array)[N])  // NOLINT: runtime/explicit
-      : CopyOnWriteBuffer(array, N) {}
-
-  ~CopyOnWriteBuffer();
-
-  // Get a pointer to the data. Just .data() will give you a (const) uint8_t*,
-  // but you may also use .data<int8_t>() and .data<char>().
-  template <typename T = uint8_t,
-            typename std::enable_if<
-                internal::BufferCompat<uint8_t, T>::value>::type* = nullptr>
-  const T* data() const {
-    return cdata<T>();
-  }
-
-  // Get writable pointer to the data. This will create a copy of the underlying
-  // data if it is shared with other buffers.
-  template <typename T = uint8_t,
-            typename std::enable_if<
-                internal::BufferCompat<uint8_t, T>::value>::type* = nullptr>
-  T* data() {
-    RTC_DCHECK(IsConsistent());
-    if (!buffer_) {
-      return nullptr;
-    }
-    CloneDataIfReferenced(buffer_->capacity());
-    return buffer_->data<T>();
-  }
-
-  // Get const pointer to the data. This will not create a copy of the
-  // underlying data if it is shared with other buffers.
-  template <typename T = uint8_t,
-            typename std::enable_if<
-                internal::BufferCompat<uint8_t, T>::value>::type* = nullptr>
-  const T* cdata() const {
-    RTC_DCHECK(IsConsistent());
-    if (!buffer_) {
-      return nullptr;
-    }
-    return buffer_->data<T>();
-  }
-
-  size_t size() const {
-    RTC_DCHECK(IsConsistent());
-    return buffer_ ? buffer_->size() : 0;
-  }
-
-  size_t capacity() const {
-    RTC_DCHECK(IsConsistent());
-    return buffer_ ? buffer_->capacity() : 0;
-  }
-
-  CopyOnWriteBuffer& operator=(const CopyOnWriteBuffer& buf) {
-    RTC_DCHECK(IsConsistent());
-    RTC_DCHECK(buf.IsConsistent());
-    if (&buf != this) {
-      buffer_ = buf.buffer_;
-    }
-    return *this;
-  }
-
-  CopyOnWriteBuffer& operator=(CopyOnWriteBuffer&& buf) {
-    RTC_DCHECK(IsConsistent());
-    RTC_DCHECK(buf.IsConsistent());
-    buffer_ = std::move(buf.buffer_);
-    return *this;
-  }
-
-  bool operator==(const CopyOnWriteBuffer& buf) const;
-
-  bool operator!=(const CopyOnWriteBuffer& buf) const {
-    return !(*this == buf);
-  }
-
-  uint8_t& operator[](size_t index) {
-    RTC_DCHECK_LT(index, size());
-    return data()[index];
-  }
-
-  uint8_t operator[](size_t index) const {
-    RTC_DCHECK_LT(index, size());
-    return cdata()[index];
-  }
-
-  // Replace the contents of the buffer. Accepts the same types as the
-  // constructors.
-  template <typename T,
-            typename std::enable_if<
-                internal::BufferCompat<uint8_t, T>::value>::type* = nullptr>
-  void SetData(const T* data, size_t size) {
-    RTC_DCHECK(IsConsistent());
-    if (!buffer_) {
-      buffer_ = size > 0 ? new RefCountedObject<Buffer>(data, size) : nullptr;
-    } else if (!buffer_->HasOneRef()) {
-      buffer_ = new RefCountedObject<Buffer>(data, size, buffer_->capacity());
-    } else {
-      buffer_->SetData(data, size);
-    }
-    RTC_DCHECK(IsConsistent());
-  }
-
-  template <typename T,
-            size_t N,
-            typename std::enable_if<
-                internal::BufferCompat<uint8_t, T>::value>::type* = nullptr>
-  void SetData(const T (&array)[N]) {
-    SetData(array, N);
-  }
-
-  void SetData(const CopyOnWriteBuffer& buf) {
-    RTC_DCHECK(IsConsistent());
-    RTC_DCHECK(buf.IsConsistent());
-    if (&buf != this) {
-      buffer_ = buf.buffer_;
-    }
-  }
-
-  // Append data to the buffer. Accepts the same types as the constructors.
-  template <typename T,
-            typename std::enable_if<
-                internal::BufferCompat<uint8_t, T>::value>::type* = nullptr>
-  void AppendData(const T* data, size_t size) {
-    RTC_DCHECK(IsConsistent());
-    if (!buffer_) {
-      buffer_ = new RefCountedObject<Buffer>(data, size);
-      RTC_DCHECK(IsConsistent());
-      return;
-    }
-
-    CloneDataIfReferenced(std::max(buffer_->capacity(),
-        buffer_->size() + size));
-    buffer_->AppendData(data, size);
-    RTC_DCHECK(IsConsistent());
-  }
-
-  template <typename T,
-            size_t N,
-            typename std::enable_if<
-                internal::BufferCompat<uint8_t, T>::value>::type* = nullptr>
-  void AppendData(const T (&array)[N]) {
-    AppendData(array, N);
-  }
-
-  void AppendData(const CopyOnWriteBuffer& buf) {
-    AppendData(buf.data(), buf.size());
-  }
-
-  // Sets the size of the buffer. If the new size is smaller than the old, the
-  // buffer contents will be kept but truncated; if the new size is greater,
-  // the existing contents will be kept and the new space will be
-  // uninitialized.
-  void SetSize(size_t size);
-
-  // Ensure that the buffer size can be increased to at least capacity without
-  // further reallocation. (Of course, this operation might need to reallocate
-  // the buffer.)
-  void EnsureCapacity(size_t capacity);
-
-  // Resets the buffer to zero size without altering capacity. Works even if the
-  // buffer has been moved from.
-  void Clear();
-
-  // Swaps two buffers.
-  friend void swap(CopyOnWriteBuffer& a, CopyOnWriteBuffer& b) {
-    std::swap(a.buffer_, b.buffer_);
-  }
-
- private:
-  // Create a copy of the underlying data if it is referenced from other Buffer
-  // objects.
-  void CloneDataIfReferenced(size_t new_capacity);
-
-  // Pre- and postcondition of all methods.
-  bool IsConsistent() const {
-    return (!buffer_ || buffer_->capacity() > 0);
-  }
-
-  // buffer_ is either null, or points to an rtc::Buffer with capacity > 0.
-  scoped_refptr<RefCountedObject<Buffer>> buffer_;
-};
-
-}  // namespace rtc
-
-#endif  // WEBRTC_RTC_BASE_COPYONWRITEBUFFER_H_
diff --git a/rtc_base/copyonwritebuffer_unittest.cc b/rtc_base/copyonwritebuffer_unittest.cc
deleted file mode 100644
index 2845248..0000000
--- a/rtc_base/copyonwritebuffer_unittest.cc
+++ /dev/null
@@ -1,319 +0,0 @@
-/*
- *  Copyright 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/rtc_base/copyonwritebuffer.h"
-#include "webrtc/rtc_base/gunit.h"
-
-namespace rtc {
-
-namespace {
-
-// clang-format off
-const uint8_t kTestData[] = {0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7,
-                             0x8, 0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf};
-// clang-format on
-
-}  // namespace
-
-void EnsureBuffersShareData(const CopyOnWriteBuffer& buf1,
-                            const CopyOnWriteBuffer& buf2) {
-  // Data is shared between buffers.
-  EXPECT_EQ(buf1.size(), buf2.size());
-  EXPECT_EQ(buf1.capacity(), buf2.capacity());
-  const uint8_t* data1 = buf1.data();
-  const uint8_t* data2 = buf2.data();
-  EXPECT_EQ(data1, data2);
-  EXPECT_EQ(buf1, buf2);
-}
-
-void EnsureBuffersDontShareData(const CopyOnWriteBuffer& buf1,
-                                const CopyOnWriteBuffer& buf2) {
-  // Data is not shared between buffers.
-  const uint8_t* data1 = buf1.cdata();
-  const uint8_t* data2 = buf2.cdata();
-  EXPECT_NE(data1, data2);
-}
-
-TEST(CopyOnWriteBufferTest, TestCreateEmptyData) {
-  CopyOnWriteBuffer buf(static_cast<const uint8_t*>(nullptr), 0);
-  EXPECT_EQ(buf.size(), 0u);
-  EXPECT_EQ(buf.capacity(), 0u);
-  EXPECT_EQ(buf.data(), nullptr);
-}
-
-TEST(CopyOnWriteBufferTest, TestMoveConstruct) {
-  CopyOnWriteBuffer buf1(kTestData, 3, 10);
-  size_t buf1_size = buf1.size();
-  size_t buf1_capacity = buf1.capacity();
-  const uint8_t* buf1_data = buf1.cdata();
-
-  CopyOnWriteBuffer buf2(std::move(buf1));
-  EXPECT_EQ(buf1.size(), 0u);
-  EXPECT_EQ(buf1.capacity(), 0u);
-  EXPECT_EQ(buf1.data(), nullptr);
-  EXPECT_EQ(buf2.size(), buf1_size);
-  EXPECT_EQ(buf2.capacity(), buf1_capacity);
-  EXPECT_EQ(buf2.data(), buf1_data);
-}
-
-TEST(CopyOnWriteBufferTest, TestMoveAssign) {
-  CopyOnWriteBuffer buf1(kTestData, 3, 10);
-  size_t buf1_size = buf1.size();
-  size_t buf1_capacity = buf1.capacity();
-  const uint8_t* buf1_data = buf1.cdata();
-
-  CopyOnWriteBuffer buf2;
-  buf2 = std::move(buf1);
-  EXPECT_EQ(buf1.size(), 0u);
-  EXPECT_EQ(buf1.capacity(), 0u);
-  EXPECT_EQ(buf1.data(), nullptr);
-  EXPECT_EQ(buf2.size(), buf1_size);
-  EXPECT_EQ(buf2.capacity(), buf1_capacity);
-  EXPECT_EQ(buf2.data(), buf1_data);
-}
-
-TEST(CopyOnWriteBufferTest, TestSwap) {
-  CopyOnWriteBuffer buf1(kTestData, 3, 10);
-  size_t buf1_size = buf1.size();
-  size_t buf1_capacity = buf1.capacity();
-  const uint8_t* buf1_data = buf1.cdata();
-
-  CopyOnWriteBuffer buf2(kTestData, 6, 20);
-  size_t buf2_size = buf2.size();
-  size_t buf2_capacity = buf2.capacity();
-  const uint8_t* buf2_data = buf2.cdata();
-
-  std::swap(buf1, buf2);
-  EXPECT_EQ(buf1.size(), buf2_size);
-  EXPECT_EQ(buf1.capacity(), buf2_capacity);
-  EXPECT_EQ(buf1.data(), buf2_data);
-  EXPECT_EQ(buf2.size(), buf1_size);
-  EXPECT_EQ(buf2.capacity(), buf1_capacity);
-  EXPECT_EQ(buf2.data(), buf1_data);
-}
-
-TEST(CopyOnWriteBufferTest, TestAppendData) {
-  CopyOnWriteBuffer buf1(kTestData, 3, 10);
-  CopyOnWriteBuffer buf2(buf1);
-
-  EnsureBuffersShareData(buf1, buf2);
-
-  // AppendData copies the underlying buffer.
-  buf2.AppendData("foo");
-  EXPECT_EQ(buf2.size(), buf1.size() + 4);  // "foo" + trailing 0x00
-  EXPECT_EQ(buf2.capacity(), buf1.capacity());
-  EXPECT_NE(buf2.data(), buf1.data());
-
-  EXPECT_EQ(buf1, CopyOnWriteBuffer(kTestData, 3));
-  const int8_t exp[] = {0x0, 0x1, 0x2, 'f', 'o', 'o', 0x0};
-  EXPECT_EQ(buf2, CopyOnWriteBuffer(exp));
-}
-
-TEST(CopyOnWriteBufferTest, SetEmptyData) {
-  CopyOnWriteBuffer buf(10);
-
-  buf.SetData<uint8_t>(nullptr, 0);
-
-  EXPECT_EQ(0u, buf.size());
-}
-
-TEST(CopyOnWriteBufferTest, SetDataNoMoreThanCapacityDoesntCauseReallocation) {
-  CopyOnWriteBuffer buf1(3, 10);
-  const uint8_t* const original_allocation = buf1.cdata();
-
-  buf1.SetData(kTestData, 10);
-
-  EXPECT_EQ(original_allocation, buf1.cdata());
-  EXPECT_EQ(buf1, CopyOnWriteBuffer(kTestData, 10));
-}
-
-TEST(CopyOnWriteBufferTest, SetDataMakeReferenceCopy) {
-  CopyOnWriteBuffer buf1(kTestData, 3, 10);
-  CopyOnWriteBuffer buf2;
-
-  buf2.SetData(buf1);
-
-  EnsureBuffersShareData(buf1, buf2);
-}
-
-TEST(CopyOnWriteBufferTest, SetDataOnSharedKeepsOriginal) {
-  const uint8_t data[] = "foo";
-  CopyOnWriteBuffer buf1(kTestData, 3, 10);
-  const uint8_t* const original_allocation = buf1.cdata();
-  CopyOnWriteBuffer buf2(buf1);
-
-  buf2.SetData(data);
-
-  EnsureBuffersDontShareData(buf1, buf2);
-  EXPECT_EQ(original_allocation, buf1.cdata());
-  EXPECT_EQ(buf1, CopyOnWriteBuffer(kTestData, 3));
-  EXPECT_EQ(buf2, CopyOnWriteBuffer(data));
-}
-
-TEST(CopyOnWriteBufferTest, SetDataOnSharedKeepsCapacity) {
-  CopyOnWriteBuffer buf1(kTestData, 3, 10);
-  CopyOnWriteBuffer buf2(buf1);
-  EnsureBuffersShareData(buf1, buf2);
-
-  buf2.SetData(kTestData, 2);
-
-  EnsureBuffersDontShareData(buf1, buf2);
-  EXPECT_EQ(2u, buf2.size());
-  EXPECT_EQ(10u, buf2.capacity());
-}
-
-TEST(CopyOnWriteBufferTest, TestEnsureCapacity) {
-  CopyOnWriteBuffer buf1(kTestData, 3, 10);
-  CopyOnWriteBuffer buf2(buf1);
-
-  // Smaller than existing capacity -> no change and still same contents.
-  buf2.EnsureCapacity(8);
-  EnsureBuffersShareData(buf1, buf2);
-  EXPECT_EQ(buf1.size(), 3u);
-  EXPECT_EQ(buf1.capacity(), 10u);
-  EXPECT_EQ(buf2.size(), 3u);
-  EXPECT_EQ(buf2.capacity(), 10u);
-
-  // Lager than existing capacity -> data is cloned.
-  buf2.EnsureCapacity(16);
-  EnsureBuffersDontShareData(buf1, buf2);
-  EXPECT_EQ(buf1.size(), 3u);
-  EXPECT_EQ(buf1.capacity(), 10u);
-  EXPECT_EQ(buf2.size(), 3u);
-  EXPECT_EQ(buf2.capacity(), 16u);
-  // The size and contents are still the same.
-  EXPECT_EQ(buf1, buf2);
-}
-
-TEST(CopyOnWriteBufferTest, SetSizeDoesntChangeOriginal) {
-  CopyOnWriteBuffer buf1(kTestData, 3, 10);
-  const uint8_t* const original_allocation = buf1.cdata();
-  CopyOnWriteBuffer buf2(buf1);
-
-  buf2.SetSize(16);
-
-  EnsureBuffersDontShareData(buf1, buf2);
-  EXPECT_EQ(original_allocation, buf1.cdata());
-  EXPECT_EQ(3u, buf1.size());
-  EXPECT_EQ(10u, buf1.capacity());
-}
-
-TEST(CopyOnWriteBufferTest, SetSizeCloneContent) {
-  CopyOnWriteBuffer buf1(kTestData, 3, 10);
-  CopyOnWriteBuffer buf2(buf1);
-
-  buf2.SetSize(16);
-
-  EXPECT_EQ(buf2.size(), 16u);
-  EXPECT_EQ(0, memcmp(buf2.data(), kTestData, 3));
-}
-
-TEST(CopyOnWriteBufferTest, SetSizeMayIncreaseCapacity) {
-  CopyOnWriteBuffer buf(kTestData, 3, 10);
-
-  buf.SetSize(16);
-
-  EXPECT_EQ(16u, buf.size());
-  EXPECT_EQ(16u, buf.capacity());
-}
-
-TEST(CopyOnWriteBufferTest, SetSizeDoesntDecreaseCapacity) {
-  CopyOnWriteBuffer buf1(kTestData, 5, 10);
-  CopyOnWriteBuffer buf2(buf1);
-
-  buf2.SetSize(2);
-
-  EXPECT_EQ(2u, buf2.size());
-  EXPECT_EQ(10u, buf2.capacity());
-}
-
-TEST(CopyOnWriteBufferTest, ClearDoesntChangeOriginal) {
-  CopyOnWriteBuffer buf1(kTestData, 3, 10);
-  const uint8_t* const original_allocation = buf1.cdata();
-  CopyOnWriteBuffer buf2(buf1);
-
-  buf2.Clear();
-
-  EnsureBuffersDontShareData(buf1, buf2);
-  EXPECT_EQ(3u, buf1.size());
-  EXPECT_EQ(10u, buf1.capacity());
-  EXPECT_EQ(original_allocation, buf1.cdata());
-  EXPECT_EQ(0u, buf2.size());
-}
-
-TEST(CopyOnWriteBufferTest, ClearDoesntChangeCapacity) {
-  CopyOnWriteBuffer buf1(kTestData, 3, 10);
-  CopyOnWriteBuffer buf2(buf1);
-
-  buf2.Clear();
-
-  EXPECT_EQ(0u, buf2.size());
-  EXPECT_EQ(10u, buf2.capacity());
-}
-
-TEST(CopyOnWriteBufferTest, TestConstDataAccessor) {
-  CopyOnWriteBuffer buf1(kTestData, 3, 10);
-  CopyOnWriteBuffer buf2(buf1);
-
-  // .cdata() doesn't clone data.
-  const uint8_t* cdata1 = buf1.cdata();
-  const uint8_t* cdata2 = buf2.cdata();
-  EXPECT_EQ(cdata1, cdata2);
-
-  // Non-const .data() clones data if shared.
-  const uint8_t* data1 = buf1.data();
-  const uint8_t* data2 = buf2.data();
-  EXPECT_NE(data1, data2);
-  // buf1 was cloned above.
-  EXPECT_NE(data1, cdata1);
-  // Therefore buf2 was no longer sharing data and was not cloned.
-  EXPECT_EQ(data2, cdata1);
-}
-
-TEST(CopyOnWriteBufferTest, TestBacketRead) {
-  CopyOnWriteBuffer buf1(kTestData, 3, 10);
-  CopyOnWriteBuffer buf2(buf1);
-
-  EnsureBuffersShareData(buf1, buf2);
-  // Non-const reads clone the data if shared.
-  for (size_t i = 0; i != 3u; ++i) {
-    EXPECT_EQ(buf1[i], kTestData[i]);
-  }
-  EnsureBuffersDontShareData(buf1, buf2);
-}
-
-TEST(CopyOnWriteBufferTest, TestBacketReadConst) {
-  CopyOnWriteBuffer buf1(kTestData, 3, 10);
-  CopyOnWriteBuffer buf2(buf1);
-
-  EnsureBuffersShareData(buf1, buf2);
-  const CopyOnWriteBuffer& cbuf1 = buf1;
-  for (size_t i = 0; i != 3u; ++i) {
-    EXPECT_EQ(cbuf1[i], kTestData[i]);
-  }
-  EnsureBuffersShareData(buf1, buf2);
-}
-
-TEST(CopyOnWriteBufferTest, TestBacketWrite) {
-  CopyOnWriteBuffer buf1(kTestData, 3, 10);
-  CopyOnWriteBuffer buf2(buf1);
-
-  EnsureBuffersShareData(buf1, buf2);
-  for (size_t i = 0; i != 3u; ++i) {
-    buf1[i] = kTestData[i] + 1;
-  }
-  EXPECT_EQ(buf1.size(), 3u);
-  EXPECT_EQ(buf1.capacity(), 10u);
-  EXPECT_EQ(buf2.size(), 3u);
-  EXPECT_EQ(buf2.capacity(), 10u);
-  EXPECT_EQ(0, memcmp(buf2.cdata(), kTestData, 3));
-}
-
-}  // namespace rtc
diff --git a/rtc_base/cpu_time.cc b/rtc_base/cpu_time.cc
deleted file mode 100644
index 41ac4ca..0000000
--- a/rtc_base/cpu_time.cc
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- *  Copyright (c) 2017 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/rtc_base/cpu_time.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/timeutils.h"
-
-#if defined(WEBRTC_LINUX)
-#include <time.h>
-#elif defined(WEBRTC_MAC)
-#include <sys/resource.h>
-#include <sys/types.h>
-#include <sys/times.h>
-#include <mach/thread_info.h>
-#include <mach/thread_act.h>
-#include <mach/mach_init.h>
-#include <unistd.h>
-#elif defined(WEBRTC_WIN)
-#include <windows.h>
-#endif
-
-#if defined(WEBRTC_WIN)
-namespace {
-// FILETIME resolution is 100 nanosecs.
-const int64_t kNanosecsPerFiletime = 100;
-}  // namespace
-#endif
-
-namespace rtc {
-
-int64_t GetProcessCpuTimeNanos() {
-#if defined(WEBRTC_LINUX)
-  struct timespec ts;
-  if (clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &ts) == 0) {
-    return ts.tv_sec * kNumNanosecsPerSec + ts.tv_nsec;
-  } else {
-    LOG_ERR(LS_ERROR) << "clock_gettime() failed.";
-  }
-#elif defined(WEBRTC_MAC)
-  struct rusage rusage;
-  if (getrusage(RUSAGE_SELF, &rusage) == 0) {
-    return rusage.ru_utime.tv_sec * kNumNanosecsPerSec +
-           rusage.ru_utime.tv_usec * kNumNanosecsPerMicrosec;
-  } else {
-    LOG_ERR(LS_ERROR) << "getrusage() failed.";
-  }
-#elif defined(WEBRTC_WIN)
-  FILETIME createTime;
-  FILETIME exitTime;
-  FILETIME kernelTime;
-  FILETIME userTime;
-  if (GetProcessTimes(GetCurrentProcess(), &createTime, &exitTime, &kernelTime,
-                      &userTime) != 0) {
-    return ((static_cast<uint64_t>(userTime.dwHighDateTime) << 32) +
-            userTime.dwLowDateTime) *
-           kNanosecsPerFiletime;
-  } else {
-    LOG_ERR(LS_ERROR) << "GetProcessTimes() failed.";
-  }
-#else
-  // Not implemented yet.
-  static_assert(
-      false, "GetProcessCpuTimeNanos() platform support not yet implemented.");
-#endif
-  return -1;
-}
-
-int64_t GetThreadCpuTimeNanos() {
-#if defined(WEBRTC_LINUX)
-  struct timespec ts;
-  if (clock_gettime(CLOCK_THREAD_CPUTIME_ID, &ts) == 0) {
-    return ts.tv_sec * kNumNanosecsPerSec + ts.tv_nsec;
-  } else {
-    LOG_ERR(LS_ERROR) << "clock_gettime() failed.";
-  }
-#elif defined(WEBRTC_MAC)
-  thread_basic_info_data_t info;
-  mach_msg_type_number_t count = THREAD_BASIC_INFO_COUNT;
-  if (thread_info(mach_thread_self(), THREAD_BASIC_INFO, (thread_info_t)&info,
-                  &count) == KERN_SUCCESS) {
-    return info.user_time.seconds * kNumNanosecsPerSec +
-           info.user_time.microseconds * kNumNanosecsPerMicrosec;
-  } else {
-    LOG_ERR(LS_ERROR) << "thread_info() failed.";
-  }
-#elif defined(WEBRTC_WIN)
-  FILETIME createTime;
-  FILETIME exitTime;
-  FILETIME kernelTime;
-  FILETIME userTime;
-  if (GetThreadTimes(GetCurrentThread(), &createTime, &exitTime, &kernelTime,
-                     &userTime) != 0) {
-    return ((static_cast<uint64_t>(userTime.dwHighDateTime) << 32) +
-            userTime.dwLowDateTime) *
-           kNanosecsPerFiletime;
-  } else {
-    LOG_ERR(LS_ERROR) << "GetThreadTimes() failed.";
-  }
-#else
-  // Not implemented yet.
-  static_assert(
-      false, "GetProcessCpuTimeNanos() platform support not yet implemented.");
-#endif
-  return -1;
-}
-
-}  // namespace rtc
diff --git a/rtc_base/cpu_time.h b/rtc_base/cpu_time.h
deleted file mode 100644
index 2d431dc..0000000
--- a/rtc_base/cpu_time.h
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- *  Copyright (c) 2017 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_RTC_BASE_CPU_TIME_H_
-#define WEBRTC_RTC_BASE_CPU_TIME_H_
-
-#include <stdint.h>
-
-namespace rtc {
-
-// Returns total CPU time of a current process in nanoseconds.
-// Time base is unknown, therefore use only to calculate deltas.
-int64_t GetProcessCpuTimeNanos();
-
-// Returns total CPU time of a current thread in nanoseconds.
-// Time base is unknown, therefore use only to calculate deltas.
-int64_t GetThreadCpuTimeNanos();
-
-}  // namespace rtc
-
-#endif  // WEBRTC_RTC_BASE_CPU_TIME_H_
diff --git a/rtc_base/cpu_time_unittest.cc b/rtc_base/cpu_time_unittest.cc
deleted file mode 100644
index a9af7ba..0000000
--- a/rtc_base/cpu_time_unittest.cc
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- *  Copyright (c) 2017 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/rtc_base/cpu_time.h"
-#include <algorithm>
-#include <memory>
-#include "webrtc/rtc_base/platform_thread.h"
-#include "webrtc/rtc_base/timeutils.h"
-#include "webrtc/system_wrappers/include/cpu_info.h"
-#include "webrtc/system_wrappers/include/sleep.h"
-#include "webrtc/test/gtest.h"
-
-// Only run these tests on non-instrumented builds, because timing on
-// instrumented builds is unreliable, causing the test to be flaky.
-#if defined(THREAD_SANITIZER) || defined(MEMORY_SANITIZER) || \
-    defined(ADDRESS_SANITIZER)
-#define MAYBE_TEST(test_name) DISABLED_##test_name
-#else
-#define MAYBE_TEST(test_name) test_name
-#endif
-
-namespace {
-const int kAllowedErrorMillisecs = 30;
-const int kProcessingTimeMillisecs = 300;
-const int kWorkingThreads = 2;
-
-// Consumes approximately kProcessingTimeMillisecs of CPU time in single thread.
-bool WorkingFunction(void* counter_pointer) {
-  int64_t* counter = reinterpret_cast<int64_t*>(counter_pointer);
-  *counter = 0;
-  int64_t stop_cpu_time =
-      rtc::GetThreadCpuTimeNanos() +
-      kProcessingTimeMillisecs * rtc::kNumNanosecsPerMillisec;
-  while (rtc::GetThreadCpuTimeNanos() < stop_cpu_time) {
-    (*counter)++;
-  }
-  return false;
-}
-}  // namespace
-
-namespace rtc {
-
-// A minimal test which can be run on instrumented builds, so that they're at
-// least exercising the code to check for memory leaks/etc.
-TEST(CpuTimeTest, BasicTest) {
-  int64_t process_start_time_nanos = GetProcessCpuTimeNanos();
-  int64_t thread_start_time_nanos = GetThreadCpuTimeNanos();
-  int64_t process_duration_nanos =
-      GetProcessCpuTimeNanos() - process_start_time_nanos;
-  int64_t thread_duration_nanos =
-      GetThreadCpuTimeNanos() - thread_start_time_nanos;
-  EXPECT_GE(process_duration_nanos, 0);
-  EXPECT_GE(thread_duration_nanos, 0);
-}
-
-TEST(CpuTimeTest, MAYBE_TEST(TwoThreads)) {
-  int64_t process_start_time_nanos = GetProcessCpuTimeNanos();
-  int64_t thread_start_time_nanos = GetThreadCpuTimeNanos();
-  int64_t counter1;
-  int64_t counter2;
-  PlatformThread thread1(WorkingFunction, reinterpret_cast<void*>(&counter1),
-                         "Thread1");
-  PlatformThread thread2(WorkingFunction, reinterpret_cast<void*>(&counter2),
-                         "Thread2");
-  thread1.Start();
-  thread2.Start();
-  thread1.Stop();
-  thread2.Stop();
-
-  EXPECT_GE(counter1, 0);
-  EXPECT_GE(counter2, 0);
-  int64_t process_duration_nanos =
-      GetProcessCpuTimeNanos() - process_start_time_nanos;
-  int64_t thread_duration_nanos =
-      GetThreadCpuTimeNanos() - thread_start_time_nanos;
-  // This thread did almost nothing.
-  // Therefore GetThreadCpuTime is not a wall clock.
-  EXPECT_LE(thread_duration_nanos,
-            kAllowedErrorMillisecs * kNumNanosecsPerMillisec);
-  // Total process time is at least twice working threads' CPU time.
-  // Therefore process and thread times are correctly related.
-  EXPECT_GE(
-      process_duration_nanos,
-      kWorkingThreads * (kProcessingTimeMillisecs - kAllowedErrorMillisecs)
-      * kNumNanosecsPerMillisec);
-}
-
-TEST(CpuTimeTest, MAYBE_TEST(Sleeping)) {
-  int64_t process_start_time_nanos = GetProcessCpuTimeNanos();
-  webrtc::SleepMs(kProcessingTimeMillisecs);
-  int64_t process_duration_nanos =
-      GetProcessCpuTimeNanos() - process_start_time_nanos;
-  // Sleeping should not introduce any additional CPU time.
-  // Therefore GetProcessCpuTime is not a wall clock.
-  EXPECT_LE(process_duration_nanos,
-            kWorkingThreads * kAllowedErrorMillisecs * kNumNanosecsPerMillisec);
-}
-
-}  // namespace rtc
diff --git a/rtc_base/crc32.cc b/rtc_base/crc32.cc
deleted file mode 100644
index 3db6b1b..0000000
--- a/rtc_base/crc32.cc
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- *  Copyright 2012 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/rtc_base/crc32.h"
-
-#include "webrtc/rtc_base/arraysize.h"
-
-namespace rtc {
-
-// This implementation is based on the sample implementation in RFC 1952.
-
-// CRC32 polynomial, in reversed form.
-// See RFC 1952, or http://en.wikipedia.org/wiki/Cyclic_redundancy_check
-static const uint32_t kCrc32Polynomial = 0xEDB88320;
-static uint32_t kCrc32Table[256] = {0};
-
-static void EnsureCrc32TableInited() {
-  if (kCrc32Table[arraysize(kCrc32Table) - 1])
-    return;  // already inited
-  for (uint32_t i = 0; i < arraysize(kCrc32Table); ++i) {
-    uint32_t c = i;
-    for (size_t j = 0; j < 8; ++j) {
-      if (c & 1) {
-        c = kCrc32Polynomial ^ (c >> 1);
-      } else {
-        c >>= 1;
-      }
-    }
-    kCrc32Table[i] = c;
-  }
-}
-
-uint32_t UpdateCrc32(uint32_t start, const void* buf, size_t len) {
-  EnsureCrc32TableInited();
-
-  uint32_t c = start ^ 0xFFFFFFFF;
-  const uint8_t* u = static_cast<const uint8_t*>(buf);
-  for (size_t i = 0; i < len; ++i) {
-    c = kCrc32Table[(c ^ u[i]) & 0xFF] ^ (c >> 8);
-  }
-  return c ^ 0xFFFFFFFF;
-}
-
-}  // namespace rtc
-
diff --git a/rtc_base/crc32.h b/rtc_base/crc32.h
deleted file mode 100644
index d8b121d..0000000
--- a/rtc_base/crc32.h
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- *  Copyright 2012 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_RTC_BASE_CRC32_H_
-#define WEBRTC_RTC_BASE_CRC32_H_
-
-#include <string>
-
-#include "webrtc/rtc_base/basictypes.h"
-
-namespace rtc {
-
-// Updates a CRC32 checksum with |len| bytes from |buf|. |initial| holds the
-// checksum result from the previous update; for the first call, it should be 0.
-uint32_t UpdateCrc32(uint32_t initial, const void* buf, size_t len);
-
-// Computes a CRC32 checksum using |len| bytes from |buf|.
-inline uint32_t ComputeCrc32(const void* buf, size_t len) {
-  return UpdateCrc32(0, buf, len);
-}
-inline uint32_t ComputeCrc32(const std::string& str) {
-  return ComputeCrc32(str.c_str(), str.size());
-}
-
-}  // namespace rtc
-
-#endif  // WEBRTC_RTC_BASE_CRC32_H_
diff --git a/rtc_base/crc32_unittest.cc b/rtc_base/crc32_unittest.cc
deleted file mode 100644
index 49c5600..0000000
--- a/rtc_base/crc32_unittest.cc
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- *  Copyright 2012 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/rtc_base/crc32.h"
-#include "webrtc/rtc_base/gunit.h"
-
-#include <string>
-
-namespace rtc {
-
-TEST(Crc32Test, TestBasic) {
-  EXPECT_EQ(0U, ComputeCrc32(""));
-  EXPECT_EQ(0x352441C2U, ComputeCrc32("abc"));
-  EXPECT_EQ(0x171A3F5FU,
-      ComputeCrc32("abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"));
-}
-
-TEST(Crc32Test, TestMultipleUpdates) {
-  std::string input =
-      "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq";
-  uint32_t c = 0;
-  for (size_t i = 0; i < input.size(); ++i) {
-    c = UpdateCrc32(c, &input[i], 1);
-  }
-  EXPECT_EQ(0x171A3F5FU, c);
-}
-
-}  // namespace rtc
diff --git a/rtc_base/criticalsection.cc b/rtc_base/criticalsection.cc
deleted file mode 100644
index e73b23c..0000000
--- a/rtc_base/criticalsection.cc
+++ /dev/null
@@ -1,252 +0,0 @@
-/*
- *  Copyright 2015 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/rtc_base/criticalsection.h"
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/platform_thread.h"
-
-// TODO(tommi): Split this file up to per-platform implementation files.
-
-namespace rtc {
-
-CriticalSection::CriticalSection() {
-#if defined(WEBRTC_WIN)
-  InitializeCriticalSection(&crit_);
-#elif defined(WEBRTC_POSIX)
-# if defined(WEBRTC_MAC) && !USE_NATIVE_MUTEX_ON_MAC
-  lock_queue_ = 0;
-  owning_thread_ = 0;
-  recursion_ = 0;
-  semaphore_ = dispatch_semaphore_create(0);
-# else
-  pthread_mutexattr_t mutex_attribute;
-  pthread_mutexattr_init(&mutex_attribute);
-  pthread_mutexattr_settype(&mutex_attribute, PTHREAD_MUTEX_RECURSIVE);
-  pthread_mutex_init(&mutex_, &mutex_attribute);
-  pthread_mutexattr_destroy(&mutex_attribute);
-# endif
-  CS_DEBUG_CODE(thread_ = 0);
-  CS_DEBUG_CODE(recursion_count_ = 0);
-  RTC_UNUSED(thread_);
-  RTC_UNUSED(recursion_count_);
-#else
-# error Unsupported platform.
-#endif
-}
-
-CriticalSection::~CriticalSection() {
-#if defined(WEBRTC_WIN)
-  DeleteCriticalSection(&crit_);
-#elif defined(WEBRTC_POSIX)
-# if defined(WEBRTC_MAC) && !USE_NATIVE_MUTEX_ON_MAC
-  dispatch_release(semaphore_);
-# else
-  pthread_mutex_destroy(&mutex_);
-# endif
-#else
-# error Unsupported platform.
-#endif
-}
-
-void CriticalSection::Enter() const RTC_EXCLUSIVE_LOCK_FUNCTION() {
-#if defined(WEBRTC_WIN)
-  EnterCriticalSection(&crit_);
-#elif defined(WEBRTC_POSIX)
-# if defined(WEBRTC_MAC) && !USE_NATIVE_MUTEX_ON_MAC
-  int spin = 3000;
-  PlatformThreadRef self = CurrentThreadRef();
-  bool have_lock = false;
-  do {
-    // Instead of calling TryEnter() in this loop, we do two interlocked
-    // operations, first a read-only one in order to avoid affecting the lock
-    // cache-line while spinning, in case another thread is using the lock.
-    if (!IsThreadRefEqual(owning_thread_, self)) {
-      if (AtomicOps::AcquireLoad(&lock_queue_) == 0) {
-        if (AtomicOps::CompareAndSwap(&lock_queue_, 0, 1) == 0) {
-          have_lock = true;
-          break;
-        }
-      }
-    } else {
-      AtomicOps::Increment(&lock_queue_);
-      have_lock = true;
-      break;
-    }
-
-    sched_yield();
-  } while (--spin);
-
-  if (!have_lock && AtomicOps::Increment(&lock_queue_) > 1) {
-    // Owning thread cannot be the current thread since TryEnter() would
-    // have succeeded.
-    RTC_DCHECK(!IsThreadRefEqual(owning_thread_, self));
-    // Wait for the lock to become available.
-    dispatch_semaphore_wait(semaphore_, DISPATCH_TIME_FOREVER);
-    RTC_DCHECK(owning_thread_ == 0);
-    RTC_DCHECK(!recursion_);
-  }
-
-  owning_thread_ = self;
-  ++recursion_;
-
-# else
-  pthread_mutex_lock(&mutex_);
-# endif
-
-# if CS_DEBUG_CHECKS
-  if (!recursion_count_) {
-    RTC_DCHECK(!thread_);
-    thread_ = CurrentThreadRef();
-  } else {
-    RTC_DCHECK(CurrentThreadIsOwner());
-  }
-  ++recursion_count_;
-# endif
-#else
-# error Unsupported platform.
-#endif
-}
-
-bool CriticalSection::TryEnter() const RTC_EXCLUSIVE_TRYLOCK_FUNCTION(true) {
-#if defined(WEBRTC_WIN)
-  return TryEnterCriticalSection(&crit_) != FALSE;
-#elif defined(WEBRTC_POSIX)
-# if defined(WEBRTC_MAC) && !USE_NATIVE_MUTEX_ON_MAC
-  if (!IsThreadRefEqual(owning_thread_, CurrentThreadRef())) {
-    if (AtomicOps::CompareAndSwap(&lock_queue_, 0, 1) != 0)
-      return false;
-    owning_thread_ = CurrentThreadRef();
-    RTC_DCHECK(!recursion_);
-  } else {
-    AtomicOps::Increment(&lock_queue_);
-  }
-  ++recursion_;
-# else
-  if (pthread_mutex_trylock(&mutex_) != 0)
-    return false;
-# endif
-# if CS_DEBUG_CHECKS
-  if (!recursion_count_) {
-    RTC_DCHECK(!thread_);
-    thread_ = CurrentThreadRef();
-  } else {
-    RTC_DCHECK(CurrentThreadIsOwner());
-  }
-  ++recursion_count_;
-# endif
-  return true;
-#else
-# error Unsupported platform.
-#endif
-}
-
-void CriticalSection::Leave() const RTC_UNLOCK_FUNCTION() {
-  RTC_DCHECK(CurrentThreadIsOwner());
-#if defined(WEBRTC_WIN)
-  LeaveCriticalSection(&crit_);
-#elif defined(WEBRTC_POSIX)
-# if CS_DEBUG_CHECKS
-  --recursion_count_;
-  RTC_DCHECK(recursion_count_ >= 0);
-  if (!recursion_count_)
-    thread_ = 0;
-# endif
-# if defined(WEBRTC_MAC) && !USE_NATIVE_MUTEX_ON_MAC
-  RTC_DCHECK(IsThreadRefEqual(owning_thread_, CurrentThreadRef()));
-  RTC_DCHECK_GE(recursion_, 0);
-  --recursion_;
-  if (!recursion_)
-    owning_thread_ = 0;
-
-  if (AtomicOps::Decrement(&lock_queue_) > 0 && !recursion_)
-    dispatch_semaphore_signal(semaphore_);
-# else
-  pthread_mutex_unlock(&mutex_);
-# endif
-#else
-# error Unsupported platform.
-#endif
-}
-
-bool CriticalSection::CurrentThreadIsOwner() const {
-#if defined(WEBRTC_WIN)
-  // OwningThread has type HANDLE but actually contains the Thread ID:
-  // http://stackoverflow.com/questions/12675301/why-is-the-owningthread-member-of-critical-section-of-type-handle-when-it-is-de
-  // Converting through size_t avoids the VS 2015 warning C4312: conversion from
-  // 'type1' to 'type2' of greater size
-  return crit_.OwningThread ==
-         reinterpret_cast<HANDLE>(static_cast<size_t>(GetCurrentThreadId()));
-#elif defined(WEBRTC_POSIX)
-# if CS_DEBUG_CHECKS
-  return IsThreadRefEqual(thread_, CurrentThreadRef());
-# else
-  return true;
-# endif  // CS_DEBUG_CHECKS
-#else
-# error Unsupported platform.
-#endif
-}
-
-CritScope::CritScope(const CriticalSection* cs) : cs_(cs) { cs_->Enter(); }
-CritScope::~CritScope() { cs_->Leave(); }
-
-TryCritScope::TryCritScope(const CriticalSection* cs)
-    : cs_(cs), locked_(cs->TryEnter()) {
-  CS_DEBUG_CODE(lock_was_called_ = false);
-  RTC_UNUSED(lock_was_called_);
-}
-
-TryCritScope::~TryCritScope() {
-  CS_DEBUG_CODE(RTC_DCHECK(lock_was_called_));
-  if (locked_)
-    cs_->Leave();
-}
-
-bool TryCritScope::locked() const {
-  CS_DEBUG_CODE(lock_was_called_ = true);
-  return locked_;
-}
-
-void GlobalLockPod::Lock() {
-#if !defined(WEBRTC_WIN) && (!defined(WEBRTC_MAC) || USE_NATIVE_MUTEX_ON_MAC)
-  const struct timespec ts_null = {0};
-#endif
-
-  while (AtomicOps::CompareAndSwap(&lock_acquired, 0, 1)) {
-#if defined(WEBRTC_WIN)
-    ::Sleep(0);
-#elif defined(WEBRTC_MAC) && !USE_NATIVE_MUTEX_ON_MAC
-    sched_yield();
-#else
-    nanosleep(&ts_null, nullptr);
-#endif
-  }
-}
-
-void GlobalLockPod::Unlock() {
-  int old_value = AtomicOps::CompareAndSwap(&lock_acquired, 1, 0);
-  RTC_DCHECK_EQ(1, old_value) << "Unlock called without calling Lock first";
-}
-
-GlobalLock::GlobalLock() {
-  lock_acquired = 0;
-}
-
-GlobalLockScope::GlobalLockScope(GlobalLockPod* lock)
-    : lock_(lock) {
-  lock_->Lock();
-}
-
-GlobalLockScope::~GlobalLockScope() {
-  lock_->Unlock();
-}
-
-}  // namespace rtc
diff --git a/rtc_base/criticalsection.h b/rtc_base/criticalsection.h
deleted file mode 100644
index fb55aaf..0000000
--- a/rtc_base/criticalsection.h
+++ /dev/null
@@ -1,159 +0,0 @@
-/*
- *  Copyright 2004 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_RTC_BASE_CRITICALSECTION_H_
-#define WEBRTC_RTC_BASE_CRITICALSECTION_H_
-
-#include "webrtc/rtc_base/atomicops.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/platform_thread_types.h"
-#include "webrtc/rtc_base/thread_annotations.h"
-#include "webrtc/typedefs.h"
-
-#if defined(WEBRTC_WIN)
-// Include winsock2.h before including <windows.h> to maintain consistency with
-// win32.h.  We can't include win32.h directly here since it pulls in
-// headers such as basictypes.h which causes problems in Chromium where webrtc
-// exists as two separate projects, webrtc and libjingle.
-#include <winsock2.h>
-#include <windows.h>
-#include <sal.h>  // must come after windows headers.
-#endif  // defined(WEBRTC_WIN)
-
-#if defined(WEBRTC_POSIX)
-#include <pthread.h>
-#endif
-
-// See notes in the 'Performance' unit test for the effects of this flag.
-#define USE_NATIVE_MUTEX_ON_MAC 0
-
-#if defined(WEBRTC_MAC) && !USE_NATIVE_MUTEX_ON_MAC
-#include <dispatch/dispatch.h>
-#endif
-
-#define CS_DEBUG_CHECKS RTC_DCHECK_IS_ON
-
-#if CS_DEBUG_CHECKS
-#define CS_DEBUG_CODE(x) x
-#else  // !CS_DEBUG_CHECKS
-#define CS_DEBUG_CODE(x)
-#endif  // !CS_DEBUG_CHECKS
-
-namespace rtc {
-
-// Locking methods (Enter, TryEnter, Leave)are const to permit protecting
-// members inside a const context without requiring mutable CriticalSections
-// everywhere.
-class RTC_LOCKABLE CriticalSection {
- public:
-  CriticalSection();
-  ~CriticalSection();
-
-  void Enter() const RTC_EXCLUSIVE_LOCK_FUNCTION();
-  bool TryEnter() const RTC_EXCLUSIVE_TRYLOCK_FUNCTION(true);
-  void Leave() const RTC_UNLOCK_FUNCTION();
-
- private:
-  // Use only for RTC_DCHECKing.
-  bool CurrentThreadIsOwner() const;
-
-#if defined(WEBRTC_WIN)
-  mutable CRITICAL_SECTION crit_;
-#elif defined(WEBRTC_POSIX)
-# if defined(WEBRTC_MAC) && !USE_NATIVE_MUTEX_ON_MAC
-  // Number of times the lock has been locked + number of threads waiting.
-  // TODO(tommi): We could use this number and subtract the recursion count
-  // to find places where we have multiple threads contending on the same lock.
-  mutable volatile int lock_queue_;
-  // |recursion_| represents the recursion count + 1 for the thread that owns
-  // the lock. Only modified by the thread that owns the lock.
-  mutable int recursion_;
-  // Used to signal a single waiting thread when the lock becomes available.
-  mutable dispatch_semaphore_t semaphore_;
-  // The thread that currently holds the lock. Required to handle recursion.
-  mutable PlatformThreadRef owning_thread_;
-# else
-  mutable pthread_mutex_t mutex_;
-# endif
-  mutable PlatformThreadRef thread_;  // Only used by RTC_DCHECKs.
-  mutable int recursion_count_;       // Only used by RTC_DCHECKs.
-#else  // !defined(WEBRTC_WIN) && !defined(WEBRTC_POSIX)
-# error Unsupported platform.
-#endif
-};
-
-// CritScope, for serializing execution through a scope.
-class RTC_SCOPED_LOCKABLE CritScope {
- public:
-  explicit CritScope(const CriticalSection* cs) RTC_EXCLUSIVE_LOCK_FUNCTION(cs);
-  ~CritScope() RTC_UNLOCK_FUNCTION();
-
- private:
-  const CriticalSection* const cs_;
-  RTC_DISALLOW_COPY_AND_ASSIGN(CritScope);
-};
-
-// Tries to lock a critical section on construction via
-// CriticalSection::TryEnter, and unlocks on destruction if the
-// lock was taken. Never blocks.
-//
-// IMPORTANT: Unlike CritScope, the lock may not be owned by this thread in
-// subsequent code. Users *must* check locked() to determine if the
-// lock was taken. If you're not calling locked(), you're doing it wrong!
-class TryCritScope {
- public:
-  explicit TryCritScope(const CriticalSection* cs);
-  ~TryCritScope();
-#if defined(WEBRTC_WIN)
-  _Check_return_ bool locked() const;
-#elif defined(WEBRTC_POSIX)
-  bool locked() const __attribute__ ((__warn_unused_result__));
-#else  // !defined(WEBRTC_WIN) && !defined(WEBRTC_POSIX)
-# error Unsupported platform.
-#endif
- private:
-  const CriticalSection* const cs_;
-  const bool locked_;
-  mutable bool lock_was_called_;  // Only used by RTC_DCHECKs.
-  RTC_DISALLOW_COPY_AND_ASSIGN(TryCritScope);
-};
-
-// A POD lock used to protect global variables. Do NOT use for other purposes.
-// No custom constructor or private data member should be added.
-class RTC_LOCKABLE GlobalLockPod {
- public:
-  void Lock() RTC_EXCLUSIVE_LOCK_FUNCTION();
-
-  void Unlock() RTC_UNLOCK_FUNCTION();
-
-  volatile int lock_acquired;
-};
-
-class GlobalLock : public GlobalLockPod {
- public:
-  GlobalLock();
-};
-
-// GlobalLockScope, for serializing execution through a scope.
-class RTC_SCOPED_LOCKABLE GlobalLockScope {
- public:
-  explicit GlobalLockScope(GlobalLockPod* lock)
-      RTC_EXCLUSIVE_LOCK_FUNCTION(lock);
-  ~GlobalLockScope() RTC_UNLOCK_FUNCTION();
-
- private:
-  GlobalLockPod* const lock_;
-  RTC_DISALLOW_COPY_AND_ASSIGN(GlobalLockScope);
-};
-
-} // namespace rtc
-
-#endif // WEBRTC_RTC_BASE_CRITICALSECTION_H_
diff --git a/rtc_base/criticalsection_unittest.cc b/rtc_base/criticalsection_unittest.cc
deleted file mode 100644
index c264e44..0000000
--- a/rtc_base/criticalsection_unittest.cc
+++ /dev/null
@@ -1,409 +0,0 @@
-/*
- *  Copyright 2014 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 <memory>
-#include <set>
-#include <vector>
-
-#include "webrtc/rtc_base/arraysize.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/event.h"
-#include "webrtc/rtc_base/gunit.h"
-#include "webrtc/rtc_base/platform_thread.h"
-#include "webrtc/rtc_base/thread.h"
-
-namespace rtc {
-
-namespace {
-
-const int kLongTime = 10000;  // 10 seconds
-const int kNumThreads = 16;
-const int kOperationsToRun = 1000;
-
-class UniqueValueVerifier {
- public:
-  void Verify(const std::vector<int>& values) {
-    for (size_t i = 0; i < values.size(); ++i) {
-      std::pair<std::set<int>::iterator, bool> result =
-          all_values_.insert(values[i]);
-      // Each value should only be taken by one thread, so if this value
-      // has already been added, something went wrong.
-      EXPECT_TRUE(result.second)
-          << " Thread=" << Thread::Current() << " value=" << values[i];
-    }
-  }
-
-  void Finalize() {}
-
- private:
-  std::set<int> all_values_;
-};
-
-class CompareAndSwapVerifier {
- public:
-  CompareAndSwapVerifier() : zero_count_(0) {}
-
-  void Verify(const std::vector<int>& values) {
-    for (auto v : values) {
-      if (v == 0) {
-        EXPECT_EQ(0, zero_count_) << "Thread=" << Thread::Current();
-        ++zero_count_;
-      } else {
-        EXPECT_EQ(1, v) << " Thread=" << Thread::Current();
-      }
-    }
-  }
-
-  void Finalize() {
-    EXPECT_EQ(1, zero_count_);
-  }
- private:
-  int zero_count_;
-};
-
-class RunnerBase : public MessageHandler {
- public:
-  explicit RunnerBase(int value)
-      : threads_active_(0),
-        start_event_(true, false),
-        done_event_(true, false),
-        shared_value_(value) {}
-
-  bool Run() {
-    // Signal all threads to start.
-    start_event_.Set();
-
-    // Wait for all threads to finish.
-    return done_event_.Wait(kLongTime);
-  }
-
-  void SetExpectedThreadCount(int count) {
-    threads_active_ = count;
-  }
-
-  int shared_value() const { return shared_value_; }
-
- protected:
-  // Derived classes must override OnMessage, and call BeforeStart and AfterEnd
-  // at the beginning and the end of OnMessage respectively.
-  void BeforeStart() {
-    ASSERT_TRUE(start_event_.Wait(kLongTime));
-  }
-
-  // Returns true if all threads have finished.
-  bool AfterEnd() {
-    if (AtomicOps::Decrement(&threads_active_) == 0) {
-      done_event_.Set();
-      return true;
-    }
-    return false;
-  }
-
-  int threads_active_;
-  Event start_event_;
-  Event done_event_;
-  int shared_value_;
-};
-
-class RTC_LOCKABLE CriticalSectionLock {
- public:
-  void Lock() RTC_EXCLUSIVE_LOCK_FUNCTION() { cs_.Enter(); }
-  void Unlock() RTC_UNLOCK_FUNCTION() { cs_.Leave(); }
-
- private:
-  CriticalSection cs_;
-};
-
-template <class Lock>
-class LockRunner : public RunnerBase {
- public:
-  LockRunner() : RunnerBase(0) {}
-
-  void OnMessage(Message* msg) override {
-    BeforeStart();
-
-    lock_.Lock();
-
-    EXPECT_EQ(0, shared_value_);
-    int old = shared_value_;
-
-    // Use a loop to increase the chance of race.
-    for (int i = 0; i < kOperationsToRun; ++i) {
-      ++shared_value_;
-    }
-    EXPECT_EQ(old + kOperationsToRun, shared_value_);
-    shared_value_ = 0;
-
-    lock_.Unlock();
-
-    AfterEnd();
-  }
-
- private:
-  Lock lock_;
-};
-
-template <class Op, class Verifier>
-class AtomicOpRunner : public RunnerBase {
- public:
-  explicit AtomicOpRunner(int initial_value) : RunnerBase(initial_value) {}
-
-  void OnMessage(Message* msg) override {
-    BeforeStart();
-
-    std::vector<int> values;
-    values.reserve(kOperationsToRun);
-
-    // Generate a bunch of values by updating shared_value_ atomically.
-    for (int i = 0; i < kOperationsToRun; ++i) {
-      values.push_back(Op::AtomicOp(&shared_value_));
-    }
-
-    { // Add them all to the set.
-      CritScope cs(&all_values_crit_);
-      verifier_.Verify(values);
-    }
-
-    if (AfterEnd()) {
-      verifier_.Finalize();
-    }
-  }
-
- private:
-  CriticalSection all_values_crit_;
-  Verifier verifier_;
-};
-
-struct IncrementOp {
-  static int AtomicOp(int* i) { return AtomicOps::Increment(i); }
-};
-
-struct DecrementOp {
-  static int AtomicOp(int* i) { return AtomicOps::Decrement(i); }
-};
-
-struct CompareAndSwapOp {
-  static int AtomicOp(int* i) { return AtomicOps::CompareAndSwap(i, 0, 1); }
-};
-
-void StartThreads(std::vector<std::unique_ptr<Thread>>* threads,
-                  MessageHandler* handler) {
-  for (int i = 0; i < kNumThreads; ++i) {
-    std::unique_ptr<Thread> thread(Thread::Create());
-    thread->Start();
-    thread->Post(RTC_FROM_HERE, handler);
-    threads->push_back(std::move(thread));
-  }
-}
-
-}  // namespace
-
-TEST(AtomicOpsTest, Simple) {
-  int value = 0;
-  EXPECT_EQ(1, AtomicOps::Increment(&value));
-  EXPECT_EQ(1, value);
-  EXPECT_EQ(2, AtomicOps::Increment(&value));
-  EXPECT_EQ(2, value);
-  EXPECT_EQ(1, AtomicOps::Decrement(&value));
-  EXPECT_EQ(1, value);
-  EXPECT_EQ(0, AtomicOps::Decrement(&value));
-  EXPECT_EQ(0, value);
-}
-
-TEST(AtomicOpsTest, SimplePtr) {
-  class Foo {};
-  Foo* volatile foo = nullptr;
-  std::unique_ptr<Foo> a(new Foo());
-  std::unique_ptr<Foo> b(new Foo());
-  // Reading the initial value should work as expected.
-  EXPECT_TRUE(rtc::AtomicOps::AcquireLoadPtr(&foo) == nullptr);
-  // Setting using compare and swap should work.
-  EXPECT_TRUE(rtc::AtomicOps::CompareAndSwapPtr(
-                  &foo, static_cast<Foo*>(nullptr), a.get()) == nullptr);
-  EXPECT_TRUE(rtc::AtomicOps::AcquireLoadPtr(&foo) == a.get());
-  // Setting another value but with the wrong previous pointer should fail
-  // (remain a).
-  EXPECT_TRUE(rtc::AtomicOps::CompareAndSwapPtr(
-                  &foo, static_cast<Foo*>(nullptr), b.get()) == a.get());
-  EXPECT_TRUE(rtc::AtomicOps::AcquireLoadPtr(&foo) == a.get());
-  // Replacing a with b should work.
-  EXPECT_TRUE(rtc::AtomicOps::CompareAndSwapPtr(&foo, a.get(), b.get()) ==
-              a.get());
-  EXPECT_TRUE(rtc::AtomicOps::AcquireLoadPtr(&foo) == b.get());
-}
-
-TEST(AtomicOpsTest, Increment) {
-  // Create and start lots of threads.
-  AtomicOpRunner<IncrementOp, UniqueValueVerifier> runner(0);
-  std::vector<std::unique_ptr<Thread>> threads;
-  StartThreads(&threads, &runner);
-  runner.SetExpectedThreadCount(kNumThreads);
-
-  // Release the hounds!
-  EXPECT_TRUE(runner.Run());
-  EXPECT_EQ(kOperationsToRun * kNumThreads, runner.shared_value());
-}
-
-TEST(AtomicOpsTest, Decrement) {
-  // Create and start lots of threads.
-  AtomicOpRunner<DecrementOp, UniqueValueVerifier> runner(
-      kOperationsToRun * kNumThreads);
-  std::vector<std::unique_ptr<Thread>> threads;
-  StartThreads(&threads, &runner);
-  runner.SetExpectedThreadCount(kNumThreads);
-
-  // Release the hounds!
-  EXPECT_TRUE(runner.Run());
-  EXPECT_EQ(0, runner.shared_value());
-}
-
-TEST(AtomicOpsTest, CompareAndSwap) {
-  // Create and start lots of threads.
-  AtomicOpRunner<CompareAndSwapOp, CompareAndSwapVerifier> runner(0);
-  std::vector<std::unique_ptr<Thread>> threads;
-  StartThreads(&threads, &runner);
-  runner.SetExpectedThreadCount(kNumThreads);
-
-  // Release the hounds!
-  EXPECT_TRUE(runner.Run());
-  EXPECT_EQ(1, runner.shared_value());
-}
-
-TEST(GlobalLockTest, Basic) {
-  // Create and start lots of threads.
-  LockRunner<GlobalLock> runner;
-  std::vector<std::unique_ptr<Thread>> threads;
-  StartThreads(&threads, &runner);
-  runner.SetExpectedThreadCount(kNumThreads);
-
-  // Release the hounds!
-  EXPECT_TRUE(runner.Run());
-  EXPECT_EQ(0, runner.shared_value());
-}
-
-TEST(CriticalSectionTest, Basic) {
-  // Create and start lots of threads.
-  LockRunner<CriticalSectionLock> runner;
-  std::vector<std::unique_ptr<Thread>> threads;
-  StartThreads(&threads, &runner);
-  runner.SetExpectedThreadCount(kNumThreads);
-
-  // Release the hounds!
-  EXPECT_TRUE(runner.Run());
-  EXPECT_EQ(0, runner.shared_value());
-}
-
-class PerfTestData {
- public:
-  PerfTestData(int expected_count, Event* event)
-      : cache_line_barrier_1_(), cache_line_barrier_2_(),
-        expected_count_(expected_count), event_(event) {
-    cache_line_barrier_1_[0]++;  // Avoid 'is not used'.
-    cache_line_barrier_2_[0]++;  // Avoid 'is not used'.
-  }
-  ~PerfTestData() {}
-
-  void AddToCounter(int add) {
-    rtc::CritScope cs(&lock_);
-    my_counter_ += add;
-    if (my_counter_ == expected_count_)
-      event_->Set();
-  }
-
-  int64_t total() const {
-    // Assume that only one thread is running now.
-    return my_counter_;
-  }
-
- private:
-  uint8_t cache_line_barrier_1_[64];
-  CriticalSection lock_;
-  uint8_t cache_line_barrier_2_[64];
-  int64_t my_counter_ = 0;
-  const int expected_count_;
-  Event* const event_;
-};
-
-class PerfTestThread {
- public:
-  PerfTestThread() : thread_(&ThreadFunc, this, "CsPerf") {}
-
-  void Start(PerfTestData* data, int repeats, int id) {
-    RTC_DCHECK(!thread_.IsRunning());
-    RTC_DCHECK(!data_);
-    data_ = data;
-    repeats_ = repeats;
-    my_id_ = id;
-    thread_.Start();
-  }
-
-  void Stop() {
-    RTC_DCHECK(thread_.IsRunning());
-    RTC_DCHECK(data_);
-    thread_.Stop();
-    repeats_ = 0;
-    data_ = nullptr;
-    my_id_ = 0;
-  }
-
- private:
-  static bool ThreadFunc(void* param) {
-    PerfTestThread* me = static_cast<PerfTestThread*>(param);
-    for (int i = 0; i < me->repeats_; ++i)
-      me->data_->AddToCounter(me->my_id_);
-    return false;
-  }
-
-  PlatformThread thread_;
-  PerfTestData* data_ = nullptr;
-  int repeats_ = 0;
-  int my_id_ = 0;
-};
-
-// Comparison of output of this test as tested on a MacBook Pro Retina, 15-inch,
-// Mid 2014, 2,8 GHz Intel Core i7, 16 GB 1600 MHz DDR3,
-// running OS X El Capitan, 10.11.2.
-//
-// Native mutex implementation:
-// Approximate CPU usage:
-//   System: ~16%
-//   User mode: ~1.3%
-//   Idle: ~82%
-// Unit test output:
-// [       OK ] CriticalSectionTest.Performance (234545 ms)
-//
-// Special partially spin lock based implementation:
-// Approximate CPU usage:
-//   System: ~75%
-//   User mode: ~16%
-//   Idle: ~8%
-// Unit test output:
-// [       OK ] CriticalSectionTest.Performance (2107 ms)
-//
-// The test is disabled by default to avoid unecessarily loading the bots.
-TEST(CriticalSectionTest, DISABLED_Performance) {
-  PerfTestThread threads[8];
-  Event event(false, false);
-
-  static const int kThreadRepeats = 10000000;
-  static const int kExpectedCount = kThreadRepeats * arraysize(threads);
-  PerfTestData test_data(kExpectedCount, &event);
-
-  for (auto& t : threads)
-    t.Start(&test_data, kThreadRepeats, 1);
-
-  event.Wait(Event::kForever);
-
-  for (auto& t : threads)
-    t.Stop();
-}
-
-}  // namespace rtc
diff --git a/rtc_base/cryptstring.cc b/rtc_base/cryptstring.cc
deleted file mode 100644
index 1df5407..0000000
--- a/rtc_base/cryptstring.cc
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- *  Copyright 2015 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/rtc_base/cryptstring.h"
-
-namespace rtc {
-
-size_t EmptyCryptStringImpl::GetLength() const {
-  return 0;
-}
-
-void EmptyCryptStringImpl::CopyTo(char* dest, bool nullterminate) const {
-  if (nullterminate) {
-    *dest = '\0';
-  }
-}
-
-std::string EmptyCryptStringImpl::UrlEncode() const {
-  return "";
-}
-
-CryptStringImpl* EmptyCryptStringImpl::Copy() const {
-  return new EmptyCryptStringImpl();
-}
-
-void EmptyCryptStringImpl::CopyRawTo(std::vector<unsigned char>* dest) const {
-  dest->clear();
-}
-
-CryptString::CryptString() : impl_(new EmptyCryptStringImpl()) {
-}
-
-CryptString::CryptString(const CryptString& other)
-    : impl_(other.impl_->Copy()) {
-}
-
-CryptString::CryptString(const CryptStringImpl& impl) : impl_(impl.Copy()) {
-}
-
-CryptString::~CryptString() = default;
-
-size_t InsecureCryptStringImpl::GetLength() const {
-  return password_.size();
-}
-
-void InsecureCryptStringImpl::CopyTo(char* dest, bool nullterminate) const {
-  memcpy(dest, password_.data(), password_.size());
-  if (nullterminate)
-    dest[password_.size()] = 0;
-}
-
-std::string InsecureCryptStringImpl::UrlEncode() const {
-  return password_;
-}
-
-CryptStringImpl* InsecureCryptStringImpl::Copy() const {
-  InsecureCryptStringImpl* copy = new InsecureCryptStringImpl;
-  copy->password() = password_;
-  return copy;
-}
-
-void InsecureCryptStringImpl::CopyRawTo(
-    std::vector<unsigned char>* dest) const {
-  dest->resize(password_.size());
-  memcpy(&dest->front(), password_.data(), password_.size());
-}
-
-};  // namespace rtc
diff --git a/rtc_base/cryptstring.h b/rtc_base/cryptstring.h
deleted file mode 100644
index b7b6694..0000000
--- a/rtc_base/cryptstring.h
+++ /dev/null
@@ -1,167 +0,0 @@
-/*
- *  Copyright 2004 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_RTC_BASE_CRYPTSTRING_H_
-#define WEBRTC_RTC_BASE_CRYPTSTRING_H_
-
-#include <string.h>
-
-#include <memory>
-#include <string>
-#include <vector>
-
-namespace rtc {
-
-class CryptStringImpl {
-public:
-  virtual ~CryptStringImpl() {}
-  virtual size_t GetLength() const = 0;
-  virtual void CopyTo(char * dest, bool nullterminate) const = 0;
-  virtual std::string UrlEncode() const = 0;
-  virtual CryptStringImpl * Copy() const = 0;
-  virtual void CopyRawTo(std::vector<unsigned char> * dest) const = 0;
-};
-
-class EmptyCryptStringImpl : public CryptStringImpl {
-public:
-  ~EmptyCryptStringImpl() override {}
-  size_t GetLength() const override;
-  void CopyTo(char* dest, bool nullterminate) const override;
-  std::string UrlEncode() const override;
-  CryptStringImpl* Copy() const override;
-  void CopyRawTo(std::vector<unsigned char>* dest) const override;
-};
-
-class CryptString {
- public:
-  CryptString();
-  size_t GetLength() const { return impl_->GetLength(); }
-  void CopyTo(char * dest, bool nullterminate) const { impl_->CopyTo(dest, nullterminate); }
-  CryptString(const CryptString& other);
-  explicit CryptString(const CryptStringImpl& impl);
-  ~CryptString();
-  CryptString & operator=(const CryptString & other) {
-    if (this != &other) {
-      impl_.reset(other.impl_->Copy());
-    }
-    return *this;
-  }
-  void Clear() { impl_.reset(new EmptyCryptStringImpl()); }
-  std::string UrlEncode() const { return impl_->UrlEncode(); }
-  void CopyRawTo(std::vector<unsigned char> * dest) const {
-    return impl_->CopyRawTo(dest);
-  }
-
- private:
-  std::unique_ptr<const CryptStringImpl> impl_;
-};
-
-
-// Used for constructing strings where a password is involved and we
-// need to ensure that we zero memory afterwards
-class FormatCryptString {
-public:
-  FormatCryptString() {
-    storage_ = new char[32];
-    capacity_ = 32;
-    length_ = 0;
-    storage_[0] = 0;
-  }
-
-  void Append(const std::string & text) {
-    Append(text.data(), text.length());
-  }
-
-  void Append(const char * data, size_t length) {
-    EnsureStorage(length_ + length + 1);
-    memcpy(storage_ + length_, data, length);
-    length_ += length;
-    storage_[length_] = '\0';
-  }
-
-  void Append(const CryptString * password) {
-    size_t len = password->GetLength();
-    EnsureStorage(length_ + len + 1);
-    password->CopyTo(storage_ + length_, true);
-    length_ += len;
-  }
-
-  size_t GetLength() {
-    return length_;
-  }
-
-  const char * GetData() {
-    return storage_;
-  }
-
-
-  // Ensures storage of at least n bytes
-  void EnsureStorage(size_t n) {
-    if (capacity_ >= n) {
-      return;
-    }
-
-    size_t old_capacity = capacity_;
-    char * old_storage = storage_;
-
-    for (;;) {
-      capacity_ *= 2;
-      if (capacity_ >= n)
-        break;
-    }
-
-    storage_ = new char[capacity_];
-
-    if (old_capacity) {
-      memcpy(storage_, old_storage, length_);
-
-      // zero memory in a way that an optimizer won't optimize it out
-      old_storage[0] = 0;
-      for (size_t i = 1; i < old_capacity; i++) {
-        old_storage[i] = old_storage[i - 1];
-      }
-      delete[] old_storage;
-    }
-  }
-
-  ~FormatCryptString() {
-    if (capacity_) {
-      storage_[0] = 0;
-      for (size_t i = 1; i < capacity_; i++) {
-        storage_[i] = storage_[i - 1];
-      }
-    }
-    delete[] storage_;
-  }
-private:
-  char * storage_;
-  size_t capacity_;
-  size_t length_;
-};
-
-class InsecureCryptStringImpl : public CryptStringImpl {
- public:
-  std::string& password() { return password_; }
-  const std::string& password() const { return password_; }
-
-  ~InsecureCryptStringImpl() override = default;
-  size_t GetLength() const override;
-  void CopyTo(char* dest, bool nullterminate) const override;
-  std::string UrlEncode() const override;
-  CryptStringImpl* Copy() const override;
-  void CopyRawTo(std::vector<unsigned char>* dest) const override;
-
- private:
-  std::string password_;
-};
-
-}
-
-#endif  // WEBRTC_RTC_BASE_CRYPTSTRING_H_
diff --git a/rtc_base/deprecation.h b/rtc_base/deprecation.h
deleted file mode 100644
index e02629a..0000000
--- a/rtc_base/deprecation.h
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- *  Copyright (c) 2015 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_RTC_BASE_DEPRECATION_H_
-#define WEBRTC_RTC_BASE_DEPRECATION_H_
-
-// Annotate the declarations of deprecated functions with this to cause a
-// compiler warning when they're used. Like so:
-//
-//   RTC_DEPRECATED std::pony PonyPlz(const std::pony_spec& ps);
-//
-// NOTE 1: The annotation goes on the declaration in the .h file, not the
-// definition in the .cc file!
-//
-// NOTE 2: In order to keep unit testing the deprecated function without
-// getting warnings, do something like this:
-//
-//   std::pony DEPRECATED_PonyPlz(const std::pony_spec& ps);
-//   RTC_DEPRECATED inline std::pony PonyPlz(const std::pony_spec& ps) {
-//     return DEPRECATED_PonyPlz(ps);
-//   }
-//
-// In other words, rename the existing function, and provide an inline wrapper
-// using the original name that calls it. That way, callers who are willing to
-// call it using the DEPRECATED_-prefixed name don't get the warning.
-//
-// TODO(kwiberg): Remove this when we can use [[deprecated]] from C++14.
-#if defined(_MSC_VER)
-// Note: Deprecation warnings seem to fail to trigger on Windows
-// (https://bugs.chromium.org/p/webrtc/issues/detail?id=5368).
-#define RTC_DEPRECATED __declspec(deprecated)
-#elif defined(__GNUC__)
-#define RTC_DEPRECATED __attribute__ ((__deprecated__))
-#else
-#define RTC_DEPRECATED
-#endif
-
-#endif  // WEBRTC_RTC_BASE_DEPRECATION_H_
diff --git a/rtc_base/dscp.h b/rtc_base/dscp.h
deleted file mode 100644
index e65ed77..0000000
--- a/rtc_base/dscp.h
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- *  Copyright 2013 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_RTC_BASE_DSCP_H_
-#define WEBRTC_RTC_BASE_DSCP_H_
-
-namespace rtc {
-// Differentiated Services Code Point.
-// See http://tools.ietf.org/html/rfc2474 for details.
-enum DiffServCodePoint {
-  DSCP_NO_CHANGE = -1,
-  DSCP_DEFAULT = 0,  // Same as DSCP_CS0
-  DSCP_CS0  = 0,   // The default
-  DSCP_CS1  = 8,   // Bulk/background traffic
-  DSCP_AF11 = 10,
-  DSCP_AF12 = 12,
-  DSCP_AF13 = 14,
-  DSCP_CS2  = 16,
-  DSCP_AF21 = 18,
-  DSCP_AF22 = 20,
-  DSCP_AF23 = 22,
-  DSCP_CS3  = 24,
-  DSCP_AF31 = 26,
-  DSCP_AF32 = 28,
-  DSCP_AF33 = 30,
-  DSCP_CS4  = 32,
-  DSCP_AF41 = 34,  // Video
-  DSCP_AF42 = 36,  // Video
-  DSCP_AF43 = 38,  // Video
-  DSCP_CS5  = 40,  // Video
-  DSCP_EF   = 46,  // Voice
-  DSCP_CS6  = 48,  // Voice
-  DSCP_CS7  = 56,  // Control messages
-};
-
-}  // namespace rtc
-
- #endif  // WEBRTC_RTC_BASE_DSCP_H_
diff --git a/rtc_base/event.cc b/rtc_base/event.cc
deleted file mode 100644
index cddf677..0000000
--- a/rtc_base/event.cc
+++ /dev/null
@@ -1,136 +0,0 @@
-/*
- *  Copyright 2004 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/rtc_base/event.h"
-
-#if defined(WEBRTC_WIN)
-#include <windows.h>
-#elif defined(WEBRTC_POSIX)
-#include <pthread.h>
-#include <sys/time.h>
-#include <time.h>
-#else
-#error "Must define either WEBRTC_WIN or WEBRTC_POSIX."
-#endif
-
-#include "webrtc/rtc_base/checks.h"
-
-namespace rtc {
-
-#if defined(WEBRTC_WIN)
-
-Event::Event(bool manual_reset, bool initially_signaled) {
-  event_handle_ = ::CreateEvent(nullptr,  // Security attributes.
-                                manual_reset, initially_signaled,
-                                nullptr);  // Name.
-  RTC_CHECK(event_handle_);
-}
-
-Event::~Event() {
-  CloseHandle(event_handle_);
-}
-
-void Event::Set() {
-  SetEvent(event_handle_);
-}
-
-void Event::Reset() {
-  ResetEvent(event_handle_);
-}
-
-bool Event::Wait(int milliseconds) {
-  DWORD ms = (milliseconds == kForever) ? INFINITE : milliseconds;
-  return (WaitForSingleObject(event_handle_, ms) == WAIT_OBJECT_0);
-}
-
-#elif defined(WEBRTC_POSIX)
-
-Event::Event(bool manual_reset, bool initially_signaled)
-    : is_manual_reset_(manual_reset),
-      event_status_(initially_signaled) {
-  RTC_CHECK(pthread_mutex_init(&event_mutex_, nullptr) == 0);
-  RTC_CHECK(pthread_cond_init(&event_cond_, nullptr) == 0);
-}
-
-Event::~Event() {
-  pthread_mutex_destroy(&event_mutex_);
-  pthread_cond_destroy(&event_cond_);
-}
-
-void Event::Set() {
-  pthread_mutex_lock(&event_mutex_);
-  event_status_ = true;
-  pthread_cond_broadcast(&event_cond_);
-  pthread_mutex_unlock(&event_mutex_);
-}
-
-void Event::Reset() {
-  pthread_mutex_lock(&event_mutex_);
-  event_status_ = false;
-  pthread_mutex_unlock(&event_mutex_);
-}
-
-bool Event::Wait(int milliseconds) {
-  int error = 0;
-
-  struct timespec ts;
-  if (milliseconds != kForever) {
-    // Converting from seconds and microseconds (1e-6) plus
-    // milliseconds (1e-3) to seconds and nanoseconds (1e-9).
-
-#ifdef HAVE_PTHREAD_COND_TIMEDWAIT_RELATIVE
-    // Use relative time version, which tends to be more efficient for
-    // pthread implementations where provided (like on Android).
-    ts.tv_sec = milliseconds / 1000;
-    ts.tv_nsec = (milliseconds % 1000) * 1000000;
-#else
-    struct timeval tv;
-    gettimeofday(&tv, nullptr);
-
-    ts.tv_sec = tv.tv_sec + (milliseconds / 1000);
-    ts.tv_nsec = tv.tv_usec * 1000 + (milliseconds % 1000) * 1000000;
-
-    // Handle overflow.
-    if (ts.tv_nsec >= 1000000000) {
-      ts.tv_sec++;
-      ts.tv_nsec -= 1000000000;
-    }
-#endif
-  }
-
-  pthread_mutex_lock(&event_mutex_);
-  if (milliseconds != kForever) {
-    while (!event_status_ && error == 0) {
-#ifdef HAVE_PTHREAD_COND_TIMEDWAIT_RELATIVE
-      error = pthread_cond_timedwait_relative_np(
-          &event_cond_, &event_mutex_, &ts);
-#else
-      error = pthread_cond_timedwait(&event_cond_, &event_mutex_, &ts);
-#endif
-    }
-  } else {
-    while (!event_status_ && error == 0)
-      error = pthread_cond_wait(&event_cond_, &event_mutex_);
-  }
-
-  // NOTE(liulk): Exactly one thread will auto-reset this event. All
-  // the other threads will think it's unsignaled.  This seems to be
-  // consistent with auto-reset events in WEBRTC_WIN
-  if (error == 0 && !is_manual_reset_)
-    event_status_ = false;
-
-  pthread_mutex_unlock(&event_mutex_);
-
-  return (error == 0);
-}
-
-#endif
-
-}  // namespace rtc
diff --git a/rtc_base/event.h b/rtc_base/event.h
deleted file mode 100644
index b3c0e7c..0000000
--- a/rtc_base/event.h
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- *  Copyright 2004 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_RTC_BASE_EVENT_H_
-#define WEBRTC_RTC_BASE_EVENT_H_
-
-#include "webrtc/rtc_base/constructormagic.h"
-#if defined(WEBRTC_WIN)
-#include "webrtc/rtc_base/win32.h"  // NOLINT: consider this a system header.
-#elif defined(WEBRTC_POSIX)
-#include <pthread.h>
-#else
-#error "Must define either WEBRTC_WIN or WEBRTC_POSIX."
-#endif
-
-namespace rtc {
-
-class Event {
- public:
-  static const int kForever = -1;
-
-  Event(bool manual_reset, bool initially_signaled);
-  ~Event();
-
-  void Set();
-  void Reset();
-
-  // Wait for the event to become signaled, for the specified number of
-  // |milliseconds|.  To wait indefinetly, pass kForever.
-  bool Wait(int milliseconds);
-
- private:
-#if defined(WEBRTC_WIN)
-  HANDLE event_handle_;
-#elif defined(WEBRTC_POSIX)
-  pthread_mutex_t event_mutex_;
-  pthread_cond_t event_cond_;
-  const bool is_manual_reset_;
-  bool event_status_;
-#endif
-
-  RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(Event);
-};
-
-}  // namespace rtc
-
-#endif  // WEBRTC_RTC_BASE_EVENT_H_
diff --git a/rtc_base/event_tracer.cc b/rtc_base/event_tracer.cc
deleted file mode 100644
index c3b459f..0000000
--- a/rtc_base/event_tracer.cc
+++ /dev/null
@@ -1,414 +0,0 @@
-/*
- *  Copyright (c) 2012 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/rtc_base/event_tracer.h"
-
-#include <inttypes.h>
-
-#include <string>
-#include <vector>
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/event.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/platform_thread.h"
-#include "webrtc/rtc_base/stringutils.h"
-#include "webrtc/rtc_base/timeutils.h"
-#include "webrtc/rtc_base/trace_event.h"
-
-// This is a guesstimate that should be enough in most cases.
-static const size_t kEventLoggerArgsStrBufferInitialSize = 256;
-static const size_t kTraceArgBufferLength = 32;
-
-namespace webrtc {
-
-namespace {
-
-GetCategoryEnabledPtr g_get_category_enabled_ptr = nullptr;
-AddTraceEventPtr g_add_trace_event_ptr = nullptr;
-
-}  // namespace
-
-void SetupEventTracer(GetCategoryEnabledPtr get_category_enabled_ptr,
-                      AddTraceEventPtr add_trace_event_ptr) {
-  g_get_category_enabled_ptr = get_category_enabled_ptr;
-  g_add_trace_event_ptr = add_trace_event_ptr;
-}
-
-const unsigned char* EventTracer::GetCategoryEnabled(const char* name) {
-  if (g_get_category_enabled_ptr)
-    return g_get_category_enabled_ptr(name);
-
-  // A string with null terminator means category is disabled.
-  return reinterpret_cast<const unsigned char*>("\0");
-}
-
-// Arguments to this function (phase, etc.) are as defined in
-// webrtc/rtc_base/trace_event.h.
-void EventTracer::AddTraceEvent(char phase,
-                                const unsigned char* category_enabled,
-                                const char* name,
-                                unsigned long long id,
-                                int num_args,
-                                const char** arg_names,
-                                const unsigned char* arg_types,
-                                const unsigned long long* arg_values,
-                                unsigned char flags) {
-  if (g_add_trace_event_ptr) {
-    g_add_trace_event_ptr(phase,
-                          category_enabled,
-                          name,
-                          id,
-                          num_args,
-                          arg_names,
-                          arg_types,
-                          arg_values,
-                          flags);
-  }
-}
-
-}  // namespace webrtc
-
-namespace rtc {
-namespace tracing {
-namespace {
-
-static void EventTracingThreadFunc(void* params);
-
-// Atomic-int fast path for avoiding logging when disabled.
-static volatile int g_event_logging_active = 0;
-
-// TODO(pbos): Log metadata for all threads, etc.
-class EventLogger final {
- public:
-  EventLogger()
-      : logging_thread_(EventTracingThreadFunc,
-                        this,
-                        "EventTracingThread",
-                        kLowPriority),
-        shutdown_event_(false, false) {}
-  ~EventLogger() { RTC_DCHECK(thread_checker_.CalledOnValidThread()); }
-
-  void AddTraceEvent(const char* name,
-                     const unsigned char* category_enabled,
-                     char phase,
-                     int num_args,
-                     const char** arg_names,
-                     const unsigned char* arg_types,
-                     const unsigned long long* arg_values,
-                     uint64_t timestamp,
-                     int pid,
-                     rtc::PlatformThreadId thread_id) {
-    std::vector<TraceArg> args(num_args);
-    for (int i = 0; i < num_args; ++i) {
-      TraceArg& arg = args[i];
-      arg.name = arg_names[i];
-      arg.type = arg_types[i];
-      arg.value.as_uint = arg_values[i];
-
-      // Value is a pointer to a temporary string, so we have to make a copy.
-      if (arg.type == TRACE_VALUE_TYPE_COPY_STRING) {
-        // Space for the string and for the terminating null character.
-        size_t str_length = strlen(arg.value.as_string) + 1;
-        char* str_copy = new char[str_length];
-        memcpy(str_copy, arg.value.as_string, str_length);
-        arg.value.as_string = str_copy;
-      }
-    }
-    rtc::CritScope lock(&crit_);
-    trace_events_.push_back(
-        {name, category_enabled, phase, args, timestamp, 1, thread_id});
-  }
-
-// The TraceEvent format is documented here:
-// https://docs.google.com/document/d/1CvAClvFfyA5R-PhYUmn5OOQtYMH4h6I0nSsKchNAySU/preview
-  void Log() {
-    RTC_DCHECK(output_file_);
-    static const int kLoggingIntervalMs = 100;
-    fprintf(output_file_, "{ \"traceEvents\": [\n");
-    bool has_logged_event = false;
-    while (true) {
-      bool shutting_down = shutdown_event_.Wait(kLoggingIntervalMs);
-      std::vector<TraceEvent> events;
-      {
-        rtc::CritScope lock(&crit_);
-        trace_events_.swap(events);
-      }
-      std::string args_str;
-      args_str.reserve(kEventLoggerArgsStrBufferInitialSize);
-      for (TraceEvent& e : events) {
-        args_str.clear();
-        if (!e.args.empty()) {
-          args_str += ", \"args\": {";
-          bool is_first_argument = true;
-          for (TraceArg& arg : e.args) {
-            if (!is_first_argument)
-              args_str += ",";
-            is_first_argument = false;
-            args_str += " \"";
-            args_str += arg.name;
-            args_str += "\": ";
-            args_str += TraceArgValueAsString(arg);
-
-            // Delete our copy of the string.
-            if (arg.type == TRACE_VALUE_TYPE_COPY_STRING) {
-              delete[] arg.value.as_string;
-              arg.value.as_string = nullptr;
-            }
-          }
-          args_str += " }";
-        }
-        fprintf(output_file_,
-                "%s{ \"name\": \"%s\""
-                ", \"cat\": \"%s\""
-                ", \"ph\": \"%c\""
-                ", \"ts\": %" PRIu64
-                ", \"pid\": %d"
-#if defined(WEBRTC_WIN)
-                ", \"tid\": %lu"
-#else
-                ", \"tid\": %d"
-#endif  // defined(WEBRTC_WIN)
-                "%s"
-                "}\n",
-                has_logged_event ? "," : " ", e.name, e.category_enabled,
-                e.phase, e.timestamp, e.pid, e.tid, args_str.c_str());
-        has_logged_event = true;
-      }
-      if (shutting_down)
-        break;
-    }
-    fprintf(output_file_, "]}\n");
-    if (output_file_owned_)
-      fclose(output_file_);
-    output_file_ = nullptr;
-  }
-
-  void Start(FILE* file, bool owned) {
-    RTC_DCHECK(thread_checker_.CalledOnValidThread());
-    RTC_DCHECK(file);
-    RTC_DCHECK(!output_file_);
-    output_file_ = file;
-    output_file_owned_ = owned;
-    {
-      rtc::CritScope lock(&crit_);
-      // Since the atomic fast-path for adding events to the queue can be
-      // bypassed while the logging thread is shutting down there may be some
-      // stale events in the queue, hence the vector needs to be cleared to not
-      // log events from a previous logging session (which may be days old).
-      trace_events_.clear();
-    }
-    // Enable event logging (fast-path). This should be disabled since starting
-    // shouldn't be done twice.
-    RTC_CHECK_EQ(0,
-                 rtc::AtomicOps::CompareAndSwap(&g_event_logging_active, 0, 1));
-
-    // Finally start, everything should be set up now.
-    logging_thread_.Start();
-    TRACE_EVENT_INSTANT0("webrtc", "EventLogger::Start");
-  }
-
-  void Stop() {
-    RTC_DCHECK(thread_checker_.CalledOnValidThread());
-    TRACE_EVENT_INSTANT0("webrtc", "EventLogger::Stop");
-    // Try to stop. Abort if we're not currently logging.
-    if (rtc::AtomicOps::CompareAndSwap(&g_event_logging_active, 1, 0) == 0)
-      return;
-
-    // Wake up logging thread to finish writing.
-    shutdown_event_.Set();
-    // Join the logging thread.
-    logging_thread_.Stop();
-  }
-
- private:
-  struct TraceArg {
-    const char* name;
-    unsigned char type;
-    // Copied from webrtc/rtc_base/trace_event.h TraceValueUnion.
-    union TraceArgValue {
-      bool as_bool;
-      unsigned long long as_uint;
-      long long as_int;
-      double as_double;
-      const void* as_pointer;
-      const char* as_string;
-    } value;
-
-    // Assert that the size of the union is equal to the size of the as_uint
-    // field since we are assigning to arbitrary types using it.
-    static_assert(sizeof(TraceArgValue) == sizeof(unsigned long long),
-                  "Size of TraceArg value union is not equal to the size of "
-                  "the uint field of that union.");
-  };
-
-  struct TraceEvent {
-    const char* name;
-    const unsigned char* category_enabled;
-    char phase;
-    std::vector<TraceArg> args;
-    uint64_t timestamp;
-    int pid;
-    rtc::PlatformThreadId tid;
-  };
-
-  static std::string TraceArgValueAsString(TraceArg arg) {
-    std::string output;
-
-    if (arg.type == TRACE_VALUE_TYPE_STRING ||
-        arg.type == TRACE_VALUE_TYPE_COPY_STRING) {
-      // Space for every character to be an espaced character + two for
-      // quatation marks.
-      output.reserve(strlen(arg.value.as_string) * 2 + 2);
-      output += '\"';
-      const char* c = arg.value.as_string;
-      do {
-        if (*c == '"' || *c == '\\') {
-          output += '\\';
-          output += *c;
-        } else {
-          output += *c;
-        }
-      } while (*++c);
-      output += '\"';
-    } else {
-      output.resize(kTraceArgBufferLength);
-      size_t print_length = 0;
-      switch (arg.type) {
-        case TRACE_VALUE_TYPE_BOOL:
-          if (arg.value.as_bool) {
-            strcpy(&output[0], "true");
-            print_length = 4;
-          } else {
-            strcpy(&output[0], "false");
-            print_length = 5;
-          }
-          break;
-        case TRACE_VALUE_TYPE_UINT:
-          print_length = sprintfn(&output[0], kTraceArgBufferLength, "%llu",
-                                  arg.value.as_uint);
-          break;
-        case TRACE_VALUE_TYPE_INT:
-          print_length = sprintfn(&output[0], kTraceArgBufferLength, "%lld",
-                                  arg.value.as_int);
-          break;
-        case TRACE_VALUE_TYPE_DOUBLE:
-          print_length = sprintfn(&output[0], kTraceArgBufferLength, "%f",
-                                  arg.value.as_double);
-          break;
-        case TRACE_VALUE_TYPE_POINTER:
-          print_length = sprintfn(&output[0], kTraceArgBufferLength, "\"%p\"",
-                                  arg.value.as_pointer);
-          break;
-      }
-      size_t output_length = print_length < kTraceArgBufferLength
-                                 ? print_length
-                                 : kTraceArgBufferLength - 1;
-      // This will hopefully be very close to nop. On most implementations, it
-      // just writes null byte and sets the length field of the string.
-      output.resize(output_length);
-    }
-
-    return output;
-  }
-
-  rtc::CriticalSection crit_;
-  std::vector<TraceEvent> trace_events_ RTC_GUARDED_BY(crit_);
-  rtc::PlatformThread logging_thread_;
-  rtc::Event shutdown_event_;
-  rtc::ThreadChecker thread_checker_;
-  FILE* output_file_ = nullptr;
-  bool output_file_owned_ = false;
-};
-
-static void EventTracingThreadFunc(void* params) {
-  static_cast<EventLogger*>(params)->Log();
-}
-
-static EventLogger* volatile g_event_logger = nullptr;
-static const char* const kDisabledTracePrefix = TRACE_DISABLED_BY_DEFAULT("");
-const unsigned char* InternalGetCategoryEnabled(const char* name) {
-  const char* prefix_ptr = &kDisabledTracePrefix[0];
-  const char* name_ptr = name;
-  // Check whether name contains the default-disabled prefix.
-  while (*prefix_ptr == *name_ptr && *prefix_ptr != '\0') {
-    ++prefix_ptr;
-    ++name_ptr;
-  }
-  return reinterpret_cast<const unsigned char*>(*prefix_ptr == '\0' ? ""
-                                                                    : name);
-}
-
-void InternalAddTraceEvent(char phase,
-                           const unsigned char* category_enabled,
-                           const char* name,
-                           unsigned long long id,
-                           int num_args,
-                           const char** arg_names,
-                           const unsigned char* arg_types,
-                           const unsigned long long* arg_values,
-                           unsigned char flags) {
-  // Fast path for when event tracing is inactive.
-  if (rtc::AtomicOps::AcquireLoad(&g_event_logging_active) == 0)
-    return;
-
-  g_event_logger->AddTraceEvent(name, category_enabled, phase, num_args,
-                                arg_names, arg_types, arg_values,
-                                rtc::TimeMicros(), 1, rtc::CurrentThreadId());
-}
-
-}  // namespace
-
-void SetupInternalTracer() {
-  RTC_CHECK(rtc::AtomicOps::CompareAndSwapPtr(
-                &g_event_logger, static_cast<EventLogger*>(nullptr),
-                new EventLogger()) == nullptr);
-  webrtc::SetupEventTracer(InternalGetCategoryEnabled, InternalAddTraceEvent);
-}
-
-void StartInternalCaptureToFile(FILE* file) {
-  if (g_event_logger) {
-    g_event_logger->Start(file, false);
-  }
-}
-
-bool StartInternalCapture(const char* filename) {
-  if (!g_event_logger)
-    return false;
-
-  FILE* file = fopen(filename, "w");
-  if (!file) {
-    LOG(LS_ERROR) << "Failed to open trace file '" << filename
-                  << "' for writing.";
-    return false;
-  }
-  g_event_logger->Start(file, true);
-  return true;
-}
-
-void StopInternalCapture() {
-  if (g_event_logger) {
-    g_event_logger->Stop();
-  }
-}
-
-void ShutdownInternalTracer() {
-  StopInternalCapture();
-  EventLogger* old_logger = rtc::AtomicOps::AcquireLoadPtr(&g_event_logger);
-  RTC_DCHECK(old_logger);
-  RTC_CHECK(rtc::AtomicOps::CompareAndSwapPtr(
-                &g_event_logger, old_logger,
-                static_cast<EventLogger*>(nullptr)) == old_logger);
-  delete old_logger;
-  webrtc::SetupEventTracer(nullptr, nullptr);
-}
-
-}  // namespace tracing
-}  // namespace rtc
diff --git a/rtc_base/event_tracer.h b/rtc_base/event_tracer.h
deleted file mode 100644
index e0136ab..0000000
--- a/rtc_base/event_tracer.h
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- *  Copyright (c) 2012 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.
- */
-
-// This file defines the interface for event tracing in WebRTC.
-//
-// Event log handlers are set through SetupEventTracer(). User of this API will
-// provide two function pointers to handle event tracing calls.
-//
-// * GetCategoryEnabledPtr
-//   Event tracing system calls this function to determine if a particular
-//   event category is enabled.
-//
-// * AddTraceEventPtr
-//   Adds a tracing event. It is the user's responsibility to log the data
-//   provided.
-//
-// Parameters for the above two functions are described in trace_event.h.
-
-#ifndef WEBRTC_RTC_BASE_EVENT_TRACER_H_
-#define WEBRTC_RTC_BASE_EVENT_TRACER_H_
-
-#include <stdio.h>
-
-namespace webrtc {
-
-typedef const unsigned char* (*GetCategoryEnabledPtr)(const char* name);
-typedef void (*AddTraceEventPtr)(char phase,
-                                 const unsigned char* category_enabled,
-                                 const char* name,
-                                 unsigned long long id,
-                                 int num_args,
-                                 const char** arg_names,
-                                 const unsigned char* arg_types,
-                                 const unsigned long long* arg_values,
-                                 unsigned char flags);
-
-// User of WebRTC can call this method to setup event tracing.
-//
-// This method must be called before any WebRTC methods. Functions
-// provided should be thread-safe.
-void SetupEventTracer(
-    GetCategoryEnabledPtr get_category_enabled_ptr,
-    AddTraceEventPtr add_trace_event_ptr);
-
-// This class defines interface for the event tracing system to call
-// internally. Do not call these methods directly.
-class EventTracer {
- public:
-  static const unsigned char* GetCategoryEnabled(
-      const char* name);
-
-  static void AddTraceEvent(
-      char phase,
-      const unsigned char* category_enabled,
-      const char* name,
-      unsigned long long id,
-      int num_args,
-      const char** arg_names,
-      const unsigned char* arg_types,
-      const unsigned long long* arg_values,
-      unsigned char flags);
-};
-
-}  // namespace webrtc
-
-namespace rtc {
-namespace tracing {
-// Set up internal event tracer.
-void SetupInternalTracer();
-bool StartInternalCapture(const char* filename);
-void StartInternalCaptureToFile(FILE* file);
-void StopInternalCapture();
-// Make sure we run this, this will tear down the internal tracing.
-void ShutdownInternalTracer();
-}  // namespace tracing
-}  // namespace rtc
-
-#endif  // WEBRTC_RTC_BASE_EVENT_TRACER_H_
diff --git a/rtc_base/event_tracer_unittest.cc b/rtc_base/event_tracer_unittest.cc
deleted file mode 100644
index 527b4eb..0000000
--- a/rtc_base/event_tracer_unittest.cc
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- *  Copyright (c) 2012 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/rtc_base/event_tracer.h"
-
-#include "webrtc/rtc_base/trace_event.h"
-#include "webrtc/system_wrappers/include/static_instance.h"
-#include "webrtc/test/gtest.h"
-
-namespace {
-
-class TestStatistics {
- public:
-  TestStatistics() : events_logged_(0) {
-  }
-
-  void Reset() {
-    events_logged_ = 0;
-  }
-
-  void Increment() {
-    ++events_logged_;
-  }
-
-  int Count() const { return events_logged_; }
-
-  static TestStatistics* Get() {
-    static TestStatistics* test_stats = nullptr;
-    if (!test_stats)
-      test_stats = new TestStatistics();
-    return test_stats;
-  }
-
- private:
-  int events_logged_;
-};
-
-static const unsigned char* GetCategoryEnabledHandler(const char* name) {
-  return reinterpret_cast<const unsigned char*>("test");
-}
-
-static void AddTraceEventHandler(char phase,
-                                 const unsigned char* category_enabled,
-                                 const char* name,
-                                 unsigned long long id,
-                                 int num_args,
-                                 const char** arg_names,
-                                 const unsigned char* arg_types,
-                                 const unsigned long long* arg_values,
-                                 unsigned char flags) {
-  TestStatistics::Get()->Increment();
-}
-
-}  // namespace
-
-namespace webrtc {
-
-TEST(EventTracerTest, EventTracerDisabled) {
-  {
-    TRACE_EVENT0("test", "EventTracerDisabled");
-  }
-  EXPECT_FALSE(TestStatistics::Get()->Count());
-  TestStatistics::Get()->Reset();
-}
-
-TEST(EventTracerTest, ScopedTraceEvent) {
-  SetupEventTracer(&GetCategoryEnabledHandler, &AddTraceEventHandler);
-  {
-    TRACE_EVENT0("test", "ScopedTraceEvent");
-  }
-  EXPECT_EQ(2, TestStatistics::Get()->Count());
-  TestStatistics::Get()->Reset();
-}
-
-}  // namespace webrtc
diff --git a/rtc_base/event_unittest.cc b/rtc_base/event_unittest.cc
deleted file mode 100644
index 02da66f..0000000
--- a/rtc_base/event_unittest.cc
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- *  Copyright 2004 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/rtc_base/event.h"
-#include "webrtc/rtc_base/gunit.h"
-
-namespace rtc {
-
-TEST(EventTest, InitiallySignaled) {
-  Event event(false, true);
-  ASSERT_TRUE(event.Wait(0));
-}
-
-TEST(EventTest, ManualReset) {
-  Event event(true, false);
-  ASSERT_FALSE(event.Wait(0));
-
-  event.Set();
-  ASSERT_TRUE(event.Wait(0));
-  ASSERT_TRUE(event.Wait(0));
-
-  event.Reset();
-  ASSERT_FALSE(event.Wait(0));
-}
-
-TEST(EventTest, AutoReset) {
-  Event event(false, false);
-  ASSERT_FALSE(event.Wait(0));
-
-  event.Set();
-  ASSERT_TRUE(event.Wait(0));
-  ASSERT_FALSE(event.Wait(0));
-}
-
-}  // namespace rtc
diff --git a/rtc_base/fakeclock.cc b/rtc_base/fakeclock.cc
deleted file mode 100644
index e9c3e9b..0000000
--- a/rtc_base/fakeclock.cc
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- *  Copyright 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/rtc_base/fakeclock.h"
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/messagequeue.h"
-
-namespace rtc {
-
-int64_t FakeClock::TimeNanos() const {
-  CritScope cs(&lock_);
-  return time_;
-}
-
-void FakeClock::SetTimeNanos(int64_t nanos) {
-  {
-    CritScope cs(&lock_);
-    RTC_DCHECK(nanos >= time_);
-    time_ = nanos;
-  }
-  // If message queues are waiting in a socket select() with a timeout provided
-  // by the OS, they should wake up and dispatch all messages that are ready.
-  MessageQueueManager::ProcessAllMessageQueues();
-}
-
-void FakeClock::AdvanceTime(TimeDelta delta) {
-  {
-    CritScope cs(&lock_);
-    time_ += delta.ToNanoseconds();
-  }
-  MessageQueueManager::ProcessAllMessageQueues();
-}
-
-ScopedFakeClock::ScopedFakeClock() {
-  prev_clock_ = SetClockForTesting(this);
-}
-
-ScopedFakeClock::~ScopedFakeClock() {
-  SetClockForTesting(prev_clock_);
-}
-
-}  // namespace rtc
diff --git a/rtc_base/fakeclock.h b/rtc_base/fakeclock.h
deleted file mode 100644
index b6a84e6..0000000
--- a/rtc_base/fakeclock.h
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- *  Copyright 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_RTC_BASE_FAKECLOCK_H_
-#define WEBRTC_RTC_BASE_FAKECLOCK_H_
-
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/timedelta.h"
-#include "webrtc/rtc_base/timeutils.h"
-
-namespace rtc {
-
-// Fake clock for use with unit tests, which does not tick on its own.
-// Starts at time 0.
-//
-// TODO(deadbeef): Unify with webrtc::SimulatedClock.
-class FakeClock : public ClockInterface {
- public:
-  ~FakeClock() override {}
-
-  // ClockInterface implementation.
-  int64_t TimeNanos() const override;
-
-  // Methods that can be used by the test to control the time.
-
-  // Should only be used to set a time in the future.
-  void SetTimeNanos(int64_t nanos);
-  void SetTimeMicros(int64_t micros) {
-    SetTimeNanos(kNumNanosecsPerMicrosec * micros);
-  }
-
-  void AdvanceTime(TimeDelta delta);
-  void AdvanceTimeMicros(int64_t micros) {
-    AdvanceTime(rtc::TimeDelta::FromMicroseconds(micros));
-  }
- private:
-  CriticalSection lock_;
-  int64_t time_ RTC_GUARDED_BY(lock_) = 0;
-};
-
-// Helper class that sets itself as the global clock in its constructor and
-// unsets it in its destructor.
-class ScopedFakeClock : public FakeClock {
- public:
-  ScopedFakeClock();
-  ~ScopedFakeClock() override;
-
- private:
-  ClockInterface* prev_clock_;
-};
-
-// Helper class to "undo" the fake clock temporarily.
-class ScopedRealClock {
- public:
-  ScopedRealClock();
-  ~ScopedRealClock();
-
- private:
-  ClockInterface* prev_clock_;
-};
-
-}  // namespace rtc
-
-#endif  // WEBRTC_RTC_BASE_FAKECLOCK_H_
diff --git a/rtc_base/fakenetwork.h b/rtc_base/fakenetwork.h
deleted file mode 100644
index 479540d..0000000
--- a/rtc_base/fakenetwork.h
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- *  Copyright 2009 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_RTC_BASE_FAKENETWORK_H_
-#define WEBRTC_RTC_BASE_FAKENETWORK_H_
-
-#include <memory>
-#include <string>
-#include <utility>
-#include <vector>
-
-#include "webrtc/rtc_base/messagehandler.h"
-#include "webrtc/rtc_base/network.h"
-#include "webrtc/rtc_base/socketaddress.h"
-#include "webrtc/rtc_base/stringencode.h"
-#include "webrtc/rtc_base/thread.h"
-
-namespace rtc {
-
-const int kFakeIPv4NetworkPrefixLength = 24;
-const int kFakeIPv6NetworkPrefixLength = 64;
-
-// Fake network manager that allows us to manually specify the IPs to use.
-class FakeNetworkManager : public NetworkManagerBase,
-                           public MessageHandler {
- public:
-  FakeNetworkManager() {}
-
-  typedef std::vector<std::pair<SocketAddress, AdapterType>> IfaceList;
-
-  void AddInterface(const SocketAddress& iface) {
-    // Ensure a unique name for the interface if its name is not given.
-    AddInterface(iface, "test" + rtc::ToString(next_index_++));
-  }
-
-  void AddInterface(const SocketAddress& iface, const std::string& if_name) {
-    AddInterface(iface, if_name, ADAPTER_TYPE_UNKNOWN);
-  }
-
-  void AddInterface(const SocketAddress& iface,
-                    const std::string& if_name,
-                    AdapterType type) {
-    SocketAddress address(if_name, 0);
-    address.SetResolvedIP(iface.ipaddr());
-    ifaces_.push_back(std::make_pair(address, type));
-    DoUpdateNetworks();
-  }
-
-  void RemoveInterface(const SocketAddress& iface) {
-    for (IfaceList::iterator it = ifaces_.begin();
-         it != ifaces_.end(); ++it) {
-      if (it->first.EqualIPs(iface)) {
-        ifaces_.erase(it);
-        break;
-      }
-    }
-    DoUpdateNetworks();
-  }
-
-  virtual void StartUpdating() {
-    ++start_count_;
-    if (start_count_ == 1) {
-      sent_first_update_ = false;
-      rtc::Thread::Current()->Post(RTC_FROM_HERE, this);
-    } else {
-      if (sent_first_update_) {
-        SignalNetworksChanged();
-      }
-    }
-  }
-
-  virtual void StopUpdating() { --start_count_; }
-
-  // MessageHandler interface.
-  virtual void OnMessage(Message* msg) {
-    DoUpdateNetworks();
-  }
-
-  using NetworkManagerBase::set_enumeration_permission;
-  using NetworkManagerBase::set_default_local_addresses;
-
- private:
-  void DoUpdateNetworks() {
-    if (start_count_ == 0)
-      return;
-    std::vector<Network*> networks;
-    for (IfaceList::iterator it = ifaces_.begin();
-         it != ifaces_.end(); ++it) {
-      int prefix_length = 0;
-      if (it->first.ipaddr().family() == AF_INET) {
-        prefix_length = kFakeIPv4NetworkPrefixLength;
-      } else if (it->first.ipaddr().family() == AF_INET6) {
-        prefix_length = kFakeIPv6NetworkPrefixLength;
-      }
-      IPAddress prefix = TruncateIP(it->first.ipaddr(), prefix_length);
-      std::unique_ptr<Network> net(new Network(it->first.hostname(),
-                                               it->first.hostname(), prefix,
-                                               prefix_length, it->second));
-      net->set_default_local_address_provider(this);
-      net->AddIP(it->first.ipaddr());
-      networks.push_back(net.release());
-    }
-    bool changed;
-    MergeNetworkList(networks, &changed);
-    if (changed || !sent_first_update_) {
-      SignalNetworksChanged();
-      sent_first_update_ = true;
-    }
-  }
-
-  IfaceList ifaces_;
-  int next_index_ = 0;
-  int start_count_ = 0;
-  bool sent_first_update_ = false;
-
-  IPAddress default_local_ipv4_address_;
-  IPAddress default_local_ipv6_address_;
-};
-
-}  // namespace rtc
-
-#endif  // WEBRTC_RTC_BASE_FAKENETWORK_H_
diff --git a/rtc_base/fakesslidentity.h b/rtc_base/fakesslidentity.h
deleted file mode 100644
index ae9eeb1..0000000
--- a/rtc_base/fakesslidentity.h
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- *  Copyright 2012 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_RTC_BASE_FAKESSLIDENTITY_H_
-#define WEBRTC_RTC_BASE_FAKESSLIDENTITY_H_
-
-#include <algorithm>
-#include <memory>
-#include <vector>
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/messagedigest.h"
-#include "webrtc/rtc_base/sslidentity.h"
-
-namespace rtc {
-
-class FakeSSLCertificate : public rtc::SSLCertificate {
- public:
-  // SHA-1 is the default digest algorithm because it is available in all build
-  // configurations used for unit testing.
-  explicit FakeSSLCertificate(const std::string& data)
-      : data_(data), digest_algorithm_(DIGEST_SHA_1), expiration_time_(-1) {}
-  explicit FakeSSLCertificate(const std::vector<std::string>& certs)
-      : data_(certs.front()),
-        digest_algorithm_(DIGEST_SHA_1),
-        expiration_time_(-1) {
-    std::vector<std::string>::const_iterator it;
-    // Skip certs[0].
-    for (it = certs.begin() + 1; it != certs.end(); ++it) {
-      certs_.push_back(FakeSSLCertificate(*it));
-    }
-  }
-  FakeSSLCertificate* GetReference() const override {
-    return new FakeSSLCertificate(*this);
-  }
-  std::string ToPEMString() const override {
-    return data_;
-  }
-  void ToDER(Buffer* der_buffer) const override {
-    std::string der_string;
-    RTC_CHECK(SSLIdentity::PemToDer(kPemTypeCertificate, data_, &der_string));
-    der_buffer->SetData(der_string.c_str(), der_string.size());
-  }
-  int64_t CertificateExpirationTime() const override {
-    return expiration_time_;
-  }
-  void SetCertificateExpirationTime(int64_t expiration_time) {
-    expiration_time_ = expiration_time;
-  }
-  void set_digest_algorithm(const std::string& algorithm) {
-    digest_algorithm_ = algorithm;
-  }
-  bool GetSignatureDigestAlgorithm(std::string* algorithm) const override {
-    *algorithm = digest_algorithm_;
-    return true;
-  }
-  bool ComputeDigest(const std::string& algorithm,
-                     unsigned char* digest,
-                     size_t size,
-                     size_t* length) const override {
-    *length = rtc::ComputeDigest(algorithm, data_.c_str(), data_.size(),
-                                       digest, size);
-    return (*length != 0);
-  }
-  std::unique_ptr<SSLCertChain> GetChain() const override {
-    if (certs_.empty())
-      return nullptr;
-    std::vector<SSLCertificate*> new_certs(certs_.size());
-    std::transform(certs_.begin(), certs_.end(), new_certs.begin(), DupCert);
-    std::unique_ptr<SSLCertChain> chain(new SSLCertChain(new_certs));
-    std::for_each(new_certs.begin(), new_certs.end(), DeleteCert);
-    return chain;
-  }
-
- private:
-  static FakeSSLCertificate* DupCert(FakeSSLCertificate cert) {
-    return cert.GetReference();
-  }
-  static void DeleteCert(SSLCertificate* cert) { delete cert; }
-  std::string data_;
-  std::vector<FakeSSLCertificate> certs_;
-  std::string digest_algorithm_;
-  // Expiration time in seconds relative to epoch, 1970-01-01T00:00:00Z (UTC).
-  int64_t expiration_time_;
-};
-
-class FakeSSLIdentity : public rtc::SSLIdentity {
- public:
-  explicit FakeSSLIdentity(const std::string& data) : cert_(data) {}
-  explicit FakeSSLIdentity(const FakeSSLCertificate& cert) : cert_(cert) {}
-  virtual FakeSSLIdentity* GetReference() const {
-    return new FakeSSLIdentity(*this);
-  }
-  virtual const FakeSSLCertificate& certificate() const { return cert_; }
-  virtual std::string PrivateKeyToPEMString() const {
-    RTC_NOTREACHED();  // Not implemented.
-    return "";
-  }
-  virtual std::string PublicKeyToPEMString() const {
-    RTC_NOTREACHED();  // Not implemented.
-    return "";
-  }
-  virtual bool operator==(const SSLIdentity& other) const {
-    RTC_NOTREACHED();  // Not implemented.
-    return false;
-  }
- private:
-  FakeSSLCertificate cert_;
-};
-
-}  // namespace rtc
-
-#endif  // WEBRTC_RTC_BASE_FAKESSLIDENTITY_H_
diff --git a/rtc_base/file.cc b/rtc_base/file.cc
deleted file mode 100644
index c4c5e5a..0000000
--- a/rtc_base/file.cc
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- *  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/rtc_base/file.h"
-
-#include <utility>
-
-namespace rtc {
-
-namespace {
-
-std::string NormalizePathname(Pathname&& path) {
-  path.Normalize();
-  return path.pathname();
-}
-
-}  // namespace
-
-File::File(PlatformFile file) : file_(file) {}
-
-File::File() : file_(kInvalidPlatformFileValue) {}
-
-File::~File() {
-  Close();
-}
-
-// static
-File File::Open(const std::string& path) {
-  return File(OpenPlatformFile(path));
-}
-
-// static
-File File::Open(Pathname&& path) {
-  return Open(NormalizePathname(std::move(path)));
-}
-
-// static
-File File::Open(const Pathname& path) {
-  return Open(Pathname(path));
-}
-
-// static
-File File::Create(const std::string& path) {
-  return File(CreatePlatformFile(path));
-}
-
-// static
-File File::Create(Pathname&& path) {
-  return Create(NormalizePathname(std::move(path)));
-}
-
-// static
-File File::Create(const Pathname& path) {
-  return Create(Pathname(path));
-}
-
-// static
-bool File::Remove(const std::string& path) {
-  return RemoveFile(path);
-}
-
-// static
-bool File::Remove(Pathname&& path) {
-  return Remove(NormalizePathname(std::move(path)));
-}
-
-// static
-bool File::Remove(const Pathname& path) {
-  return Remove(Pathname(path));
-}
-
-File::File(File&& other) : file_(other.file_) {
-  other.file_ = kInvalidPlatformFileValue;
-}
-
-File& File::operator=(File&& other) {
-  Close();
-  file_ = other.file_;
-  other.file_ = kInvalidPlatformFileValue;
-  return *this;
-}
-
-bool File::IsOpen() {
-  return file_ != kInvalidPlatformFileValue;
-}
-
-}  // namespace rtc
diff --git a/rtc_base/file.h b/rtc_base/file.h
deleted file mode 100644
index 50639c4..0000000
--- a/rtc_base/file.h
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- *  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_RTC_BASE_FILE_H_
-#define WEBRTC_RTC_BASE_FILE_H_
-
-#include <stdint.h>
-
-#include <string>
-
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/pathutils.h"
-#include "webrtc/rtc_base/platform_file.h"
-
-namespace rtc {
-
-// This class wraps the platform specific APIs for simple file interactions.
-//
-// The various read and write methods are best effort, i.e. if an underlying
-// call does not manage to read/write all the data more calls will be performed,
-// until an error is detected or all data is read/written.
-class File {
- public:
-  // Wraps the given PlatformFile. This class is then responsible for closing
-  // the file, which will be done in the destructor if Close is never called.
-  explicit File(PlatformFile);
-  // The default constructor produces a closed file.
-  File();
-  ~File();
-
-  File(File&& other);
-  File& operator=(File&& other);
-
-  // Open and Create give files with both reading and writing enabled.
-  static File Open(const std::string& path);
-  static File Open(Pathname&& path);
-  static File Open(const Pathname& path);
-  // If the file already exists it will be overwritten.
-  static File Create(const std::string& path);
-  static File Create(Pathname&& path);
-  static File Create(const Pathname& path);
-
-  // Remove a file in the file system.
-  static bool Remove(const std::string& path);
-  static bool Remove(Pathname&& path);
-  static bool Remove(const Pathname& path);
-
-  size_t Write(const uint8_t* data, size_t length);
-  size_t Read(uint8_t* buffer, size_t length);
-
-  // The current position in the file after a call to these methods is platform
-  // dependent (MSVC gives position offset+length, most other
-  // compilers/platforms do not alter the position), i.e. do not depend on it,
-  // do a Seek before any subsequent Read/Write.
-  size_t WriteAt(const uint8_t* data, size_t length, size_t offset);
-  size_t ReadAt(uint8_t* buffer, size_t length, size_t offset);
-
-  // Attempt to position the file at the given offset from the start.
-  // Returns true if successful, false otherwise.
-  bool Seek(size_t offset);
-
-  // Attempt to close the file. Returns true if successful, false otherwise,
-  // most notably when the file is already closed.
-  bool Close();
-
-  bool IsOpen();
-
- private:
-  PlatformFile file_;
-  RTC_DISALLOW_COPY_AND_ASSIGN(File);
-};
-
-}  // namespace rtc
-
-#endif  // WEBRTC_RTC_BASE_FILE_H_
diff --git a/rtc_base/file_posix.cc b/rtc_base/file_posix.cc
deleted file mode 100644
index fab6dd3..0000000
--- a/rtc_base/file_posix.cc
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- *  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/rtc_base/file.h"
-
-#include <errno.h>
-#include <fcntl.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-#include <unistd.h>
-
-#include <limits>
-
-#include "webrtc/rtc_base/checks.h"
-
-namespace rtc {
-
-size_t File::Write(const uint8_t* data, size_t length) {
-  size_t total_written = 0;
-  do {
-    ssize_t written;
-    do {
-      written = ::write(file_, data + total_written, length - total_written);
-    } while (written == -1 && errno == EINTR);
-    if (written == -1)
-      break;
-    total_written += written;
-  } while (total_written < length);
-  return total_written;
-}
-
-size_t File::Read(uint8_t* buffer, size_t length) {
-  size_t total_read = 0;
-  do {
-    ssize_t read;
-    do {
-      read = ::read(file_, buffer + total_read, length - total_read);
-    } while (read == -1 && errno == EINTR);
-    if (read == -1)
-      break;
-    total_read += read;
-  } while (total_read < length);
-  return total_read;
-}
-
-size_t File::WriteAt(const uint8_t* data, size_t length, size_t offset) {
-  size_t total_written = 0;
-  do {
-    ssize_t written;
-    do {
-      written = ::pwrite(file_, data + total_written, length - total_written,
-                         offset + total_written);
-    } while (written == -1 && errno == EINTR);
-    if (written == -1)
-      break;
-    total_written += written;
-  } while (total_written < length);
-  return total_written;
-}
-
-size_t File::ReadAt(uint8_t* buffer, size_t length, size_t offset) {
-  size_t total_read = 0;
-  do {
-    ssize_t read;
-    do {
-      read = ::pread(file_, buffer + total_read, length - total_read,
-                     offset + total_read);
-    } while (read == -1 && errno == EINTR);
-    if (read == -1)
-      break;
-    total_read += read;
-  } while (total_read < length);
-  return total_read;
-}
-
-bool File::Seek(size_t offset) {
-  RTC_DCHECK_LE(offset, std::numeric_limits<off_t>::max());
-  return lseek(file_, static_cast<off_t>(offset), SEEK_SET) != -1;
-}
-
-bool File::Close() {
-  if (file_ == rtc::kInvalidPlatformFileValue)
-    return false;
-  bool ret = close(file_) == 0;
-  file_ = rtc::kInvalidPlatformFileValue;
-  return ret;
-}
-
-}  // namespace rtc
diff --git a/rtc_base/file_unittest.cc b/rtc_base/file_unittest.cc
deleted file mode 100644
index a052a6e..0000000
--- a/rtc_base/file_unittest.cc
+++ /dev/null
@@ -1,201 +0,0 @@
-/*
- *  Copyright 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 <limits>
-#include <memory>
-#include <string>
-
-#include "webrtc/rtc_base/file.h"
-#include "webrtc/rtc_base/gunit.h"
-#include "webrtc/test/testsupport/fileutils.h"
-
-#if defined(WEBRTC_WIN)
-
-#include "webrtc/rtc_base/win32.h"
-
-#else  // if defined(WEBRTC_WIN)
-
-#include <errno.h>
-
-#endif
-
-namespace rtc {
-
-int LastError() {
-#if defined(WEBRTC_WIN)
-  return ::GetLastError();
-#else
-  return errno;
-#endif
-}
-
-bool VerifyBuffer(uint8_t* buffer, size_t length, uint8_t start_value) {
-  for (size_t i = 0; i < length; ++i) {
-    uint8_t val = start_value++;
-    EXPECT_EQ(val, buffer[i]);
-    if (buffer[i] != val)
-      return false;
-  }
-  // Prevent the same buffer from being verified multiple times simply
-  // because some operation that should have written to it failed
-  memset(buffer, 0, length);
-  return true;
-}
-
-class FileTest : public ::testing::Test {
- protected:
-  std::string path_;
-  void SetUp() override {
-    path_ = webrtc::test::TempFilename(webrtc::test::OutputPath(), "test_file");
-    ASSERT_FALSE(path_.empty());
-  }
-  void TearDown() override { RemoveFile(path_); }
-};
-
-TEST_F(FileTest, DefaultConstructor) {
-  File file;
-  uint8_t buffer[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
-
-  EXPECT_FALSE(file.IsOpen());
-  EXPECT_EQ(0u, file.Write(buffer, 10));
-  EXPECT_FALSE(file.Seek(0));
-  EXPECT_EQ(0u, file.Read(buffer, 10));
-  EXPECT_EQ(0u, file.WriteAt(buffer, 10, 0));
-  EXPECT_EQ(0u, file.ReadAt(buffer, 10, 0));
-  EXPECT_FALSE(file.Close());
-}
-
-TEST_F(FileTest, DoubleClose) {
-  File file = File::Open(path_);
-  ASSERT_TRUE(file.IsOpen()) << "Error: " << LastError();
-
-  EXPECT_TRUE(file.Close());
-  EXPECT_FALSE(file.Close());
-}
-
-TEST_F(FileTest, SimpleReadWrite) {
-  File file = File::Open(path_);
-  ASSERT_TRUE(file.IsOpen()) << "Error: " << LastError();
-
-  uint8_t data[100] = {0};
-  uint8_t out[100] = {0};
-  for (int i = 0; i < 100; ++i) {
-    data[i] = i;
-  }
-
-  EXPECT_EQ(10u, file.Write(data, 10));
-
-  EXPECT_TRUE(file.Seek(0));
-  EXPECT_EQ(10u, file.Read(out, 10));
-  EXPECT_TRUE(VerifyBuffer(out, 10, 0));
-
-  EXPECT_TRUE(file.Seek(0));
-  EXPECT_EQ(100u, file.Write(data, 100));
-
-  EXPECT_TRUE(file.Seek(0));
-  EXPECT_EQ(100u, file.Read(out, 100));
-  EXPECT_TRUE(VerifyBuffer(out, 100, 0));
-
-  EXPECT_TRUE(file.Seek(1));
-  EXPECT_EQ(50u, file.Write(data, 50));
-  EXPECT_EQ(50u, file.Write(data + 50, 50));
-
-  EXPECT_TRUE(file.Seek(1));
-  EXPECT_EQ(100u, file.Read(out, 100));
-  EXPECT_TRUE(VerifyBuffer(out, 100, 0));
-}
-
-TEST_F(FileTest, ReadWriteClose) {
-  File file = File::Open(path_);
-  ASSERT_TRUE(file.IsOpen()) << "Error: " << LastError();
-
-  uint8_t data[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
-  uint8_t out[10] = {0};
-  EXPECT_EQ(10u, file.Write(data, 10));
-  EXPECT_TRUE(file.Close());
-
-  File file2 = File::Open(path_);
-  ASSERT_TRUE(file2.IsOpen()) << "Error: " << LastError();
-  EXPECT_EQ(10u, file2.Read(out, 10));
-  EXPECT_TRUE(VerifyBuffer(out, 10, 0));
-}
-
-TEST_F(FileTest, RandomAccessRead) {
-  File file = File::Open(path_);
-  ASSERT_TRUE(file.IsOpen()) << "Error: " << LastError();
-
-  uint8_t data[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
-  uint8_t out[10] = {0};
-  EXPECT_EQ(10u, file.Write(data, 10));
-
-  EXPECT_EQ(4u, file.ReadAt(out, 4, 0));
-  EXPECT_TRUE(VerifyBuffer(out, 4, 0));
-
-  EXPECT_EQ(4u, file.ReadAt(out, 4, 4));
-  EXPECT_TRUE(VerifyBuffer(out, 4, 4));
-
-  EXPECT_EQ(5u, file.ReadAt(out, 5, 5));
-  EXPECT_TRUE(VerifyBuffer(out, 5, 5));
-}
-
-TEST_F(FileTest, RandomAccessReadWrite) {
-  File file = File::Open(path_);
-  ASSERT_TRUE(file.IsOpen()) << "Error: " << LastError();
-
-  uint8_t data[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
-  uint8_t out[10] = {0};
-  EXPECT_EQ(10u, file.Write(data, 10));
-  EXPECT_TRUE(file.Seek(4));
-
-  EXPECT_EQ(4u, file.WriteAt(data, 4, 4));
-  EXPECT_EQ(4u, file.ReadAt(out, 4, 4));
-  EXPECT_TRUE(VerifyBuffer(out, 4, 0));
-
-  EXPECT_EQ(2u, file.WriteAt(data, 2, 8));
-  EXPECT_EQ(2u, file.ReadAt(out, 2, 8));
-  EXPECT_TRUE(VerifyBuffer(out, 2, 0));
-}
-
-TEST_F(FileTest, OpenFromPathname) {
-  {
-    File file = File::Open(Pathname(path_));
-    ASSERT_TRUE(file.IsOpen()) << "Error: " << LastError();
-  }
-
-  {
-    Pathname path(path_);
-    File file = File::Open(path);
-    ASSERT_TRUE(file.IsOpen()) << "Error: " << LastError();
-  }
-}
-
-TEST_F(FileTest, CreateFromPathname) {
-  {
-    File file = File::Create(Pathname(path_));
-    ASSERT_TRUE(file.IsOpen()) << "Error: " << LastError();
-  }
-
-  {
-    Pathname path(path_);
-    File file = File::Create(path);
-    ASSERT_TRUE(file.IsOpen()) << "Error: " << LastError();
-  }
-}
-
-TEST_F(FileTest, ShouldBeAbleToRemoveFile) {
-  {
-    File file = File::Open(Pathname(path_));
-    ASSERT_TRUE(file.IsOpen()) << "Error: " << LastError();
-  }
-
-  ASSERT_TRUE(File::Remove(Pathname(path_))) << "Error: " << LastError();
-}
-
-}  // namespace rtc
diff --git a/rtc_base/file_win.cc b/rtc_base/file_win.cc
deleted file mode 100644
index 6cb259a..0000000
--- a/rtc_base/file_win.cc
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- *  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/rtc_base/file.h"
-
-#include <io.h>
-#include "webrtc/rtc_base/win32.h"
-
-#include <limits>  // NOLINT: win32.h should be considered a system header
-
-#include "webrtc/rtc_base/checks.h"
-
-namespace rtc {
-
-size_t File::Write(const uint8_t* data, size_t length) {
-  RTC_DCHECK_LT(length, std::numeric_limits<DWORD>::max());
-  size_t total_written = 0;
-  do {
-    DWORD written;
-    if (!::WriteFile(file_, data + total_written,
-                     static_cast<DWORD>(length - total_written), &written,
-                     nullptr)) {
-      break;
-    }
-    total_written += written;
-  } while (total_written < length);
-  return total_written;
-}
-
-size_t File::Read(uint8_t* buffer, size_t length) {
-  RTC_DCHECK_LT(length, std::numeric_limits<DWORD>::max());
-  size_t total_read = 0;
-  do {
-    DWORD read;
-    if (!::ReadFile(file_, buffer + total_read,
-                    static_cast<DWORD>(length - total_read), &read, nullptr)) {
-      break;
-    }
-    total_read += read;
-  } while (total_read < length);
-  return total_read;
-}
-
-size_t File::WriteAt(const uint8_t* data, size_t length, size_t offset) {
-  RTC_DCHECK_LT(length, std::numeric_limits<DWORD>::max());
-  size_t total_written = 0;
-  do {
-    DWORD written;
-
-    LARGE_INTEGER offset_li;
-    offset_li.QuadPart = offset + total_written;
-
-    OVERLAPPED overlapped = {0};
-    overlapped.Offset = offset_li.LowPart;
-    overlapped.OffsetHigh = offset_li.HighPart;
-
-    if (!::WriteFile(file_, data + total_written,
-                     static_cast<DWORD>(length - total_written), &written,
-                     &overlapped)) {
-      break;
-    }
-
-    total_written += written;
-  } while (total_written < length);
-  return total_written;
-}
-
-size_t File::ReadAt(uint8_t* buffer, size_t length, size_t offset) {
-  RTC_DCHECK_LT(length, std::numeric_limits<DWORD>::max());
-  size_t total_read = 0;
-  do {
-    DWORD read;
-
-    LARGE_INTEGER offset_li;
-    offset_li.QuadPart = offset + total_read;
-
-    OVERLAPPED overlapped = {0};
-    overlapped.Offset = offset_li.LowPart;
-    overlapped.OffsetHigh = offset_li.HighPart;
-
-    if (!::ReadFile(file_, buffer + total_read,
-                    static_cast<DWORD>(length - total_read), &read,
-                    &overlapped)) {
-      break;
-    }
-
-    total_read += read;
-  } while (total_read < length);
-  return total_read;
-}
-
-bool File::Seek(size_t offset) {
-  LARGE_INTEGER distance;
-  distance.QuadPart = offset;
-  return SetFilePointerEx(file_, distance, nullptr, FILE_BEGIN) != 0;
-}
-
-bool File::Close() {
-  if (file_ == kInvalidPlatformFileValue)
-    return false;
-  bool ret = CloseHandle(file_) != 0;
-  file_ = kInvalidPlatformFileValue;
-  return ret;
-}
-
-}  // namespace rtc
diff --git a/rtc_base/filerotatingstream.cc b/rtc_base/filerotatingstream.cc
deleted file mode 100644
index 37cd607..0000000
--- a/rtc_base/filerotatingstream.cc
+++ /dev/null
@@ -1,400 +0,0 @@
-/*
- *  Copyright 2015 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/rtc_base/filerotatingstream.h"
-
-#include <algorithm>
-#include <iostream>
-#include <string>
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/fileutils.h"
-#include "webrtc/rtc_base/pathutils.h"
-
-// Note: We use std::cerr for logging in the write paths of this stream to avoid
-// infinite loops when logging.
-
-namespace rtc {
-
-FileRotatingStream::FileRotatingStream(const std::string& dir_path,
-                                       const std::string& file_prefix)
-    : FileRotatingStream(dir_path, file_prefix, 0, 0, kRead) {
-}
-
-FileRotatingStream::FileRotatingStream(const std::string& dir_path,
-                                       const std::string& file_prefix,
-                                       size_t max_file_size,
-                                       size_t num_files)
-    : FileRotatingStream(dir_path,
-                         file_prefix,
-                         max_file_size,
-                         num_files,
-                         kWrite) {
-  RTC_DCHECK_GT(max_file_size, 0);
-  RTC_DCHECK_GT(num_files, 1);
-}
-
-FileRotatingStream::FileRotatingStream(const std::string& dir_path,
-                                       const std::string& file_prefix,
-                                       size_t max_file_size,
-                                       size_t num_files,
-                                       Mode mode)
-    : dir_path_(dir_path),
-      file_prefix_(file_prefix),
-      mode_(mode),
-      file_stream_(nullptr),
-      max_file_size_(max_file_size),
-      current_file_index_(0),
-      rotation_index_(0),
-      current_bytes_written_(0),
-      disable_buffering_(false) {
-  RTC_DCHECK(Filesystem::IsFolder(dir_path));
-  switch (mode) {
-    case kWrite: {
-      file_names_.clear();
-      for (size_t i = 0; i < num_files; ++i) {
-        file_names_.push_back(GetFilePath(i, num_files));
-      }
-      rotation_index_ = num_files - 1;
-      break;
-    }
-    case kRead: {
-      file_names_ = GetFilesWithPrefix();
-      std::sort(file_names_.begin(), file_names_.end());
-      if (file_names_.size() > 0) {
-        // |file_names_| is sorted newest first, so read from the end.
-        current_file_index_ = file_names_.size() - 1;
-      }
-      break;
-    }
-  }
-}
-
-FileRotatingStream::~FileRotatingStream() {
-}
-
-StreamState FileRotatingStream::GetState() const {
-  if (mode_ == kRead && current_file_index_ < file_names_.size()) {
-    return SS_OPEN;
-  }
-  if (!file_stream_) {
-    return SS_CLOSED;
-  }
-  return file_stream_->GetState();
-}
-
-StreamResult FileRotatingStream::Read(void* buffer,
-                                      size_t buffer_len,
-                                      size_t* read,
-                                      int* error) {
-  RTC_DCHECK(buffer);
-  if (mode_ != kRead) {
-    return SR_EOS;
-  }
-  if (current_file_index_ >= file_names_.size()) {
-    return SR_EOS;
-  }
-  // We will have no file stream initially, and when we are finished with the
-  // previous file.
-  if (!file_stream_) {
-    if (!OpenCurrentFile()) {
-      return SR_ERROR;
-    }
-  }
-  int local_error = 0;
-  if (!error) {
-    error = &local_error;
-  }
-  StreamResult result = file_stream_->Read(buffer, buffer_len, read, error);
-  if (result == SR_EOS || result == SR_ERROR) {
-    if (result == SR_ERROR) {
-      LOG(LS_ERROR) << "Failed to read from: "
-                    << file_names_[current_file_index_] << "Error: " << error;
-    }
-    // Reached the end of the file, read next file. If there is an error return
-    // the error status but allow for a next read by reading next file.
-    CloseCurrentFile();
-    if (current_file_index_ == 0) {
-      // Just finished reading the last file, signal EOS by setting index.
-      current_file_index_ = file_names_.size();
-    } else {
-      --current_file_index_;
-    }
-    if (read) {
-      *read = 0;
-    }
-    return result == SR_EOS ? SR_SUCCESS : result;
-  } else if (result == SR_SUCCESS) {
-    // Succeeded, continue reading from this file.
-    return SR_SUCCESS;
-  } else {
-    RTC_NOTREACHED();
-  }
-  return result;
-}
-
-StreamResult FileRotatingStream::Write(const void* data,
-                                       size_t data_len,
-                                       size_t* written,
-                                       int* error) {
-  if (mode_ != kWrite) {
-    return SR_EOS;
-  }
-  if (!file_stream_) {
-    std::cerr << "Open() must be called before Write." << std::endl;
-    return SR_ERROR;
-  }
-  // Write as much as will fit in to the current file.
-  RTC_DCHECK_LT(current_bytes_written_, max_file_size_);
-  size_t remaining_bytes = max_file_size_ - current_bytes_written_;
-  size_t write_length = std::min(data_len, remaining_bytes);
-  size_t local_written = 0;
-  if (!written) {
-    written = &local_written;
-  }
-  StreamResult result = file_stream_->Write(data, write_length, written, error);
-  current_bytes_written_ += *written;
-
-  // If we're done with this file, rotate it out.
-  if (current_bytes_written_ >= max_file_size_) {
-    RTC_DCHECK_EQ(current_bytes_written_, max_file_size_);
-    RotateFiles();
-  }
-  return result;
-}
-
-bool FileRotatingStream::Flush() {
-  if (!file_stream_) {
-    return false;
-  }
-  return file_stream_->Flush();
-}
-
-bool FileRotatingStream::GetSize(size_t* size) const {
-  if (mode_ != kRead) {
-    // Not possible to get accurate size on disk when writing because of
-    // potential buffering.
-    return false;
-  }
-  RTC_DCHECK(size);
-  *size = 0;
-  size_t total_size = 0;
-  for (auto file_name : file_names_) {
-    Pathname pathname(file_name);
-    size_t file_size = 0;
-    if (Filesystem::GetFileSize(file_name, &file_size)) {
-      total_size += file_size;
-    }
-  }
-  *size = total_size;
-  return true;
-}
-
-void FileRotatingStream::Close() {
-  CloseCurrentFile();
-}
-
-bool FileRotatingStream::Open() {
-  switch (mode_) {
-    case kRead:
-      // Defer opening to when we first read since we want to return read error
-      // if we fail to open next file.
-      return true;
-    case kWrite: {
-      // Delete existing files when opening for write.
-      std::vector<std::string> matching_files = GetFilesWithPrefix();
-      for (auto matching_file : matching_files) {
-        if (!Filesystem::DeleteFile(matching_file)) {
-          std::cerr << "Failed to delete: " << matching_file << std::endl;
-        }
-      }
-      return OpenCurrentFile();
-    }
-  }
-  return false;
-}
-
-bool FileRotatingStream::DisableBuffering() {
-  disable_buffering_ = true;
-  if (!file_stream_) {
-    std::cerr << "Open() must be called before DisableBuffering()."
-              << std::endl;
-    return false;
-  }
-  return file_stream_->DisableBuffering();
-}
-
-std::string FileRotatingStream::GetFilePath(size_t index) const {
-  RTC_DCHECK_LT(index, file_names_.size());
-  return file_names_[index];
-}
-
-bool FileRotatingStream::OpenCurrentFile() {
-  CloseCurrentFile();
-
-  // Opens the appropriate file in the appropriate mode.
-  RTC_DCHECK_LT(current_file_index_, file_names_.size());
-  std::string file_path = file_names_[current_file_index_];
-  file_stream_.reset(new FileStream());
-  const char* mode = nullptr;
-  switch (mode_) {
-    case kWrite:
-      mode = "w+";
-      // We should always we writing to the zero-th file.
-      RTC_DCHECK_EQ(current_file_index_, 0);
-      break;
-    case kRead:
-      mode = "r";
-      break;
-  }
-  int error = 0;
-  if (!file_stream_->Open(file_path, mode, &error)) {
-    std::cerr << "Failed to open: " << file_path << "Error: " << error
-              << std::endl;
-    file_stream_.reset();
-    return false;
-  }
-  if (disable_buffering_) {
-    file_stream_->DisableBuffering();
-  }
-  return true;
-}
-
-void FileRotatingStream::CloseCurrentFile() {
-  if (!file_stream_) {
-    return;
-  }
-  current_bytes_written_ = 0;
-  file_stream_.reset();
-}
-
-void FileRotatingStream::RotateFiles() {
-  RTC_DCHECK_EQ(mode_, kWrite);
-  CloseCurrentFile();
-  // Rotates the files by deleting the file at |rotation_index_|, which is the
-  // oldest file and then renaming the newer files to have an incremented index.
-  // See header file comments for example.
-  RTC_DCHECK_LT(rotation_index_, file_names_.size());
-  std::string file_to_delete = file_names_[rotation_index_];
-  if (Filesystem::IsFile(file_to_delete)) {
-    if (!Filesystem::DeleteFile(file_to_delete)) {
-      std::cerr << "Failed to delete: " << file_to_delete << std::endl;
-    }
-  }
-  for (auto i = rotation_index_; i > 0; --i) {
-    std::string rotated_name = file_names_[i];
-    std::string unrotated_name = file_names_[i - 1];
-    if (Filesystem::IsFile(unrotated_name)) {
-      if (!Filesystem::MoveFile(unrotated_name, rotated_name)) {
-        std::cerr << "Failed to move: " << unrotated_name << " to "
-                  << rotated_name << std::endl;
-      }
-    }
-  }
-  // Create a new file for 0th index.
-  OpenCurrentFile();
-  OnRotation();
-}
-
-std::vector<std::string> FileRotatingStream::GetFilesWithPrefix() const {
-  std::vector<std::string> files;
-  // Iterate over the files in the directory.
-  DirectoryIterator it;
-  Pathname dir_path;
-  dir_path.SetFolder(dir_path_);
-  if (!it.Iterate(dir_path)) {
-    return files;
-  }
-  do {
-    std::string current_name = it.Name();
-    if (current_name.size() && !it.IsDirectory() &&
-        current_name.compare(0, file_prefix_.size(), file_prefix_) == 0) {
-      Pathname path(dir_path_, current_name);
-      files.push_back(path.pathname());
-    }
-  } while (it.Next());
-  return files;
-}
-
-std::string FileRotatingStream::GetFilePath(size_t index,
-                                            size_t num_files) const {
-  RTC_DCHECK_LT(index, num_files);
-  std::ostringstream file_name;
-  // The format will be "_%<num_digits>zu". We want to zero pad the index so
-  // that it will sort nicely.
-  size_t max_digits = ((num_files - 1) / 10) + 1;
-  size_t num_digits = (index / 10) + 1;
-  RTC_DCHECK_LE(num_digits, max_digits);
-  size_t padding = max_digits - num_digits;
-
-  file_name << file_prefix_ << "_";
-  for (size_t i = 0; i < padding; ++i) {
-    file_name << "0";
-  }
-  file_name << index;
-
-  Pathname file_path(dir_path_, file_name.str());
-  return file_path.pathname();
-}
-
-CallSessionFileRotatingStream::CallSessionFileRotatingStream(
-    const std::string& dir_path)
-    : FileRotatingStream(dir_path, kLogPrefix),
-      max_total_log_size_(0),
-      num_rotations_(0) {
-}
-
-CallSessionFileRotatingStream::CallSessionFileRotatingStream(
-    const std::string& dir_path,
-    size_t max_total_log_size)
-    : FileRotatingStream(dir_path,
-                         kLogPrefix,
-                         max_total_log_size / 2,
-                         GetNumRotatingLogFiles(max_total_log_size) + 1),
-      max_total_log_size_(max_total_log_size),
-      num_rotations_(0) {
-  RTC_DCHECK_GE(max_total_log_size, 4);
-}
-
-const char* CallSessionFileRotatingStream::kLogPrefix = "webrtc_log";
-const size_t CallSessionFileRotatingStream::kRotatingLogFileDefaultSize =
-    1024 * 1024;
-
-void CallSessionFileRotatingStream::OnRotation() {
-  ++num_rotations_;
-  if (num_rotations_ == 1) {
-    // On the first rotation adjust the max file size so subsequent files after
-    // the first are smaller.
-    SetMaxFileSize(GetRotatingLogSize(max_total_log_size_));
-  } else if (num_rotations_ == (GetNumFiles() - 1)) {
-    // On the next rotation the very first file is going to be deleted. Change
-    // the rotation index so this doesn't happen.
-    SetRotationIndex(GetRotationIndex() - 1);
-  }
-}
-
-size_t CallSessionFileRotatingStream::GetRotatingLogSize(
-    size_t max_total_log_size) {
-  size_t num_rotating_log_files = GetNumRotatingLogFiles(max_total_log_size);
-  size_t rotating_log_size = num_rotating_log_files > 2
-                                 ? kRotatingLogFileDefaultSize
-                                 : max_total_log_size / 4;
-  return rotating_log_size;
-}
-
-size_t CallSessionFileRotatingStream::GetNumRotatingLogFiles(
-    size_t max_total_log_size) {
-  // At minimum have two rotating files. Otherwise split the available log size
-  // evenly across 1MB files.
-  return std::max((size_t)2,
-                  (max_total_log_size / 2) / kRotatingLogFileDefaultSize);
-}
-
-}  // namespace rtc
diff --git a/rtc_base/filerotatingstream.h b/rtc_base/filerotatingstream.h
deleted file mode 100644
index db8d1ac..0000000
--- a/rtc_base/filerotatingstream.h
+++ /dev/null
@@ -1,173 +0,0 @@
-/*
- *  Copyright 2015 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_RTC_BASE_FILEROTATINGSTREAM_H_
-#define WEBRTC_RTC_BASE_FILEROTATINGSTREAM_H_
-
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/stream.h"
-
-namespace rtc {
-
-// FileRotatingStream writes to a file in the directory specified in the
-// constructor. It rotates the files once the current file is full. The
-// individual file size and the number of files used is configurable in the
-// constructor. Open() must be called before using this stream.
-class FileRotatingStream : public StreamInterface {
- public:
-  // Use this constructor for reading a directory previously written to with
-  // this stream.
-  FileRotatingStream(const std::string& dir_path,
-                     const std::string& file_prefix);
-
-  // Use this constructor for writing to a directory. Files in the directory
-  // matching the prefix will be deleted on open.
-  FileRotatingStream(const std::string& dir_path,
-                     const std::string& file_prefix,
-                     size_t max_file_size,
-                     size_t num_files);
-
-  ~FileRotatingStream() override;
-
-  // StreamInterface methods.
-  StreamState GetState() const override;
-  StreamResult Read(void* buffer,
-                    size_t buffer_len,
-                    size_t* read,
-                    int* error) override;
-  StreamResult Write(const void* data,
-                     size_t data_len,
-                     size_t* written,
-                     int* error) override;
-  bool Flush() override;
-  // Returns the total file size currently used on disk.
-  bool GetSize(size_t* size) const override;
-  void Close() override;
-
-  // Opens the appropriate file(s). Call this before using the stream.
-  bool Open();
-
-  // Disabling buffering causes writes to block until disk is updated. This is
-  // enabled by default for performance.
-  bool DisableBuffering();
-
-  // Returns the path used for the i-th newest file, where the 0th file is the
-  // newest file. The file may or may not exist, this is just used for
-  // formatting. Index must be less than GetNumFiles().
-  std::string GetFilePath(size_t index) const;
-
-  // Returns the number of files that will used by this stream.
-  size_t GetNumFiles() const { return file_names_.size(); }
-
- protected:
-  size_t GetMaxFileSize() const { return max_file_size_; }
-
-  void SetMaxFileSize(size_t size) { max_file_size_ = size; }
-
-  size_t GetRotationIndex() const { return rotation_index_; }
-
-  void SetRotationIndex(size_t index) { rotation_index_ = index; }
-
-  virtual void OnRotation() {}
-
- private:
-  enum Mode { kRead, kWrite };
-
-  FileRotatingStream(const std::string& dir_path,
-                     const std::string& file_prefix,
-                     size_t max_file_size,
-                     size_t num_files,
-                     Mode mode);
-
-  bool OpenCurrentFile();
-  void CloseCurrentFile();
-
-  // Rotates the files by creating a new current file, renaming the
-  // existing files, and deleting the oldest one. e.g.
-  // file_0 -> file_1
-  // file_1 -> file_2
-  // file_2 -> delete
-  // create new file_0
-  void RotateFiles();
-
-  // Returns a list of file names in the directory beginning with the prefix.
-  std::vector<std::string> GetFilesWithPrefix() const;
-  // Private version of GetFilePath.
-  std::string GetFilePath(size_t index, size_t num_files) const;
-
-  const std::string dir_path_;
-  const std::string file_prefix_;
-  const Mode mode_;
-
-  // FileStream is used to write to the current file.
-  std::unique_ptr<FileStream> file_stream_;
-  // Convenience storage for file names so we don't generate them over and over.
-  std::vector<std::string> file_names_;
-  size_t max_file_size_;
-  size_t current_file_index_;
-  // The rotation index indicates the index of the file that will be
-  // deleted first on rotation. Indices lower than this index will be rotated.
-  size_t rotation_index_;
-  // Number of bytes written to current file. We need this because with
-  // buffering the file size read from disk might not be accurate.
-  size_t current_bytes_written_;
-  bool disable_buffering_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(FileRotatingStream);
-};
-
-// CallSessionFileRotatingStream is meant to be used in situations where we will
-// have limited disk space. Its purpose is to read and write logs up to a
-// maximum size. Once the maximum size is exceeded, logs from the middle are
-// deleted whereas logs from the beginning and end are preserved. The reason for
-// this is because we anticipate that in WebRTC the beginning and end of the
-// logs are most useful for call diagnostics.
-//
-// This implementation simply writes to a single file until
-// |max_total_log_size| / 2 bytes are written to it, and subsequently writes to
-// a set of rotating files. We do this by inheriting FileRotatingStream and
-// setting the appropriate internal variables so that we don't delete the last
-// (earliest) file on rotate, and that that file's size is bigger.
-//
-// Open() must be called before using this stream.
-class CallSessionFileRotatingStream : public FileRotatingStream {
- public:
-  // Use this constructor for reading a directory previously written to with
-  // this stream.
-  explicit CallSessionFileRotatingStream(const std::string& dir_path);
-  // Use this constructor for writing to a directory. Files in the directory
-  // matching what's used by the stream will be deleted. |max_total_log_size|
-  // must be at least 4.
-  CallSessionFileRotatingStream(const std::string& dir_path,
-                                size_t max_total_log_size);
-  ~CallSessionFileRotatingStream() override {}
-
- protected:
-  void OnRotation() override;
-
- private:
-  static size_t GetRotatingLogSize(size_t max_total_log_size);
-  static size_t GetNumRotatingLogFiles(size_t max_total_log_size);
-  static const char* kLogPrefix;
-  static const size_t kRotatingLogFileDefaultSize;
-
-  const size_t max_total_log_size_;
-  size_t num_rotations_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(CallSessionFileRotatingStream);
-};
-
-}  // namespace rtc
-
-#endif  // WEBRTC_RTC_BASE_FILEROTATINGSTREAM_H_
diff --git a/rtc_base/filerotatingstream_unittest.cc b/rtc_base/filerotatingstream_unittest.cc
deleted file mode 100644
index b5fcefb..0000000
--- a/rtc_base/filerotatingstream_unittest.cc
+++ /dev/null
@@ -1,345 +0,0 @@
-/*
- *  Copyright 2015 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 <memory>
-
-#include "webrtc/rtc_base/arraysize.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/filerotatingstream.h"
-#include "webrtc/rtc_base/fileutils.h"
-#include "webrtc/rtc_base/gunit.h"
-#include "webrtc/rtc_base/pathutils.h"
-#include "webrtc/test/testsupport/fileutils.h"
-
-namespace rtc {
-
-namespace {
-
-void CleanupLogDirectory(const FileRotatingStream& stream) {
-  for (size_t i = 0; i < stream.GetNumFiles(); ++i) {
-    // Ignore return value, not all files are expected to exist.
-    webrtc::test::RemoveFile(stream.GetFilePath(i));
-  }
-}
-
-}  // namespace
-
-#if defined (WEBRTC_ANDROID)
-// Fails on Android: https://bugs.chromium.org/p/webrtc/issues/detail?id=4364.
-#define MAYBE_FileRotatingStreamTest DISABLED_FileRotatingStreamTest
-#else
-#define MAYBE_FileRotatingStreamTest FileRotatingStreamTest
-#endif
-
-class MAYBE_FileRotatingStreamTest : public ::testing::Test {
- protected:
-  static const char* kFilePrefix;
-  static const size_t kMaxFileSize;
-
-  void Init(const std::string& dir_name,
-            const std::string& file_prefix,
-            size_t max_file_size,
-            size_t num_log_files) {
-    dir_path_ = webrtc::test::OutputPath();
-
-    // Append per-test output path in order to run within gtest parallel.
-    dir_path_.append(dir_name);
-    dir_path_.push_back(Pathname::DefaultFolderDelimiter());
-    ASSERT_TRUE(webrtc::test::CreateDir(dir_path_));
-    stream_.reset(new FileRotatingStream(dir_path_, file_prefix, max_file_size,
-                                         num_log_files));
-  }
-
-  void TearDown() override {
-    // On windows, open files can't be removed.
-    stream_->Close();
-    CleanupLogDirectory(*stream_);
-    EXPECT_TRUE(webrtc::test::RemoveDir(dir_path_));
-
-    stream_.reset();
-  }
-
-  // Writes the data to the stream and flushes it.
-  void WriteAndFlush(const void* data, const size_t data_len) {
-    EXPECT_EQ(SR_SUCCESS, stream_->WriteAll(data, data_len, nullptr, nullptr));
-    EXPECT_TRUE(stream_->Flush());
-  }
-
-  // Checks that the stream reads in the expected contents and then returns an
-  // end of stream result.
-  void VerifyStreamRead(const char* expected_contents,
-                        const size_t expected_length,
-                        const std::string& dir_path,
-                        const char* file_prefix) {
-    std::unique_ptr<FileRotatingStream> stream;
-    stream.reset(new FileRotatingStream(dir_path, file_prefix));
-    ASSERT_TRUE(stream->Open());
-    size_t read = 0;
-    size_t stream_size = 0;
-    EXPECT_TRUE(stream->GetSize(&stream_size));
-    std::unique_ptr<uint8_t[]> buffer(new uint8_t[expected_length]);
-    EXPECT_EQ(SR_SUCCESS,
-              stream->ReadAll(buffer.get(), expected_length, &read, nullptr));
-    EXPECT_EQ(0, memcmp(expected_contents, buffer.get(), expected_length));
-    EXPECT_EQ(SR_EOS, stream->ReadAll(buffer.get(), 1, nullptr, nullptr));
-    EXPECT_EQ(stream_size, read);
-  }
-
-  void VerifyFileContents(const char* expected_contents,
-                          const size_t expected_length,
-                          const std::string& file_path) {
-    std::unique_ptr<uint8_t[]> buffer(new uint8_t[expected_length]);
-    FileStream stream;
-    ASSERT_TRUE(stream.Open(file_path, "r", nullptr));
-    EXPECT_EQ(rtc::SR_SUCCESS,
-              stream.ReadAll(buffer.get(), expected_length, nullptr, nullptr));
-    EXPECT_EQ(0, memcmp(expected_contents, buffer.get(), expected_length));
-    size_t file_size = 0;
-    EXPECT_TRUE(stream.GetSize(&file_size));
-    EXPECT_EQ(file_size, expected_length);
-  }
-
-  std::unique_ptr<FileRotatingStream> stream_;
-  std::string dir_path_;
-};
-
-const char* MAYBE_FileRotatingStreamTest::kFilePrefix =
-    "FileRotatingStreamTest";
-const size_t MAYBE_FileRotatingStreamTest::kMaxFileSize = 2;
-
-// Tests that stream state is correct before and after Open / Close.
-TEST_F(MAYBE_FileRotatingStreamTest, State) {
-  Init("FileRotatingStreamTestState", kFilePrefix, kMaxFileSize, 3);
-
-  EXPECT_EQ(SS_CLOSED, stream_->GetState());
-  ASSERT_TRUE(stream_->Open());
-  EXPECT_EQ(SS_OPEN, stream_->GetState());
-  stream_->Close();
-  EXPECT_EQ(SS_CLOSED, stream_->GetState());
-}
-
-// Tests that nothing is written to file when data of length zero is written.
-TEST_F(MAYBE_FileRotatingStreamTest, EmptyWrite) {
-  Init("FileRotatingStreamTestEmptyWrite", kFilePrefix, kMaxFileSize, 3);
-
-  ASSERT_TRUE(stream_->Open());
-  WriteAndFlush("a", 0);
-
-  std::string logfile_path = stream_->GetFilePath(0);
-  FileStream stream;
-  ASSERT_TRUE(stream.Open(logfile_path, "r", nullptr));
-  size_t file_size = 0;
-  EXPECT_TRUE(stream.GetSize(&file_size));
-  EXPECT_EQ(0u, file_size);
-}
-
-// Tests that a write operation followed by a read returns the expected data
-// and writes to the expected files.
-TEST_F(MAYBE_FileRotatingStreamTest, WriteAndRead) {
-  Init("FileRotatingStreamTestWriteAndRead", kFilePrefix, kMaxFileSize, 3);
-
-  ASSERT_TRUE(stream_->Open());
-  // The test is set up to create three log files of length 2. Write and check
-  // contents.
-  std::string messages[3] = {"aa", "bb", "cc"};
-  for (size_t i = 0; i < arraysize(messages); ++i) {
-    const std::string& message = messages[i];
-    WriteAndFlush(message.c_str(), message.size());
-    // Since the max log size is 2, we will be causing rotation. Read from the
-    // next file.
-    VerifyFileContents(message.c_str(), message.size(),
-                       stream_->GetFilePath(1));
-  }
-  // Check that exactly three files exist.
-  for (size_t i = 0; i < arraysize(messages); ++i) {
-    EXPECT_TRUE(Filesystem::IsFile(stream_->GetFilePath(i)));
-  }
-  std::string message("d");
-  WriteAndFlush(message.c_str(), message.size());
-  for (size_t i = 0; i < arraysize(messages); ++i) {
-    EXPECT_TRUE(Filesystem::IsFile(stream_->GetFilePath(i)));
-  }
-  // TODO(tkchin): Maybe check all the files in the dir.
-
-  // Reopen for read.
-  std::string expected_contents("bbccd");
-  VerifyStreamRead(expected_contents.c_str(), expected_contents.size(),
-                   dir_path_, kFilePrefix);
-}
-
-// Tests that writing data greater than the total capacity of the files
-// overwrites the files correctly and is read correctly after.
-TEST_F(MAYBE_FileRotatingStreamTest, WriteOverflowAndRead) {
-  Init("FileRotatingStreamTestWriteOverflowAndRead", kFilePrefix, kMaxFileSize,
-       3);
-  ASSERT_TRUE(stream_->Open());
-  // This should cause overflow across all three files, such that the first file
-  // we wrote to also gets overwritten.
-  std::string message("foobarbaz");
-  WriteAndFlush(message.c_str(), message.size());
-  std::string expected_file_contents("z");
-  VerifyFileContents(expected_file_contents.c_str(),
-                     expected_file_contents.size(), stream_->GetFilePath(0));
-  std::string expected_stream_contents("arbaz");
-  VerifyStreamRead(expected_stream_contents.c_str(),
-                   expected_stream_contents.size(), dir_path_, kFilePrefix);
-}
-
-// Tests that the returned file paths have the right folder and prefix.
-TEST_F(MAYBE_FileRotatingStreamTest, GetFilePath) {
-  Init("FileRotatingStreamTestGetFilePath", kFilePrefix, kMaxFileSize, 20);
-  for (auto i = 0; i < 20; ++i) {
-    Pathname path(stream_->GetFilePath(i));
-    EXPECT_EQ(0, path.folder().compare(dir_path_));
-    EXPECT_EQ(0, path.filename().compare(0, strlen(kFilePrefix), kFilePrefix));
-  }
-}
-
-#if defined (WEBRTC_ANDROID)
-// Fails on Android: https://bugs.chromium.org/p/webrtc/issues/detail?id=4364.
-#define MAYBE_CallSessionFileRotatingStreamTest \
-    DISABLED_CallSessionFileRotatingStreamTest
-#else
-#define MAYBE_CallSessionFileRotatingStreamTest \
-    CallSessionFileRotatingStreamTest
-#endif
-
-class MAYBE_CallSessionFileRotatingStreamTest : public ::testing::Test {
- protected:
-  void Init(const std::string& dir_name, size_t max_total_log_size) {
-    dir_path_ = webrtc::test::OutputPath();
-
-    // Append per-test output path in order to run within gtest parallel.
-    dir_path_.append(dir_name);
-    dir_path_.push_back(Pathname::DefaultFolderDelimiter());
-    ASSERT_TRUE(webrtc::test::CreateDir(dir_path_));
-    stream_.reset(
-        new CallSessionFileRotatingStream(dir_path_, max_total_log_size));
-  }
-
-  virtual void TearDown() {
-    // On windows, open files can't be removed.
-    stream_->Close();
-    CleanupLogDirectory(*stream_);
-    EXPECT_TRUE(webrtc::test::RemoveDir(dir_path_));
-
-    stream_.reset();
-  }
-
-  // Writes the data to the stream and flushes it.
-  void WriteAndFlush(const void* data, const size_t data_len) {
-    EXPECT_EQ(SR_SUCCESS, stream_->WriteAll(data, data_len, nullptr, nullptr));
-    EXPECT_TRUE(stream_->Flush());
-  }
-
-  // Checks that the stream reads in the expected contents and then returns an
-  // end of stream result.
-  void VerifyStreamRead(const char* expected_contents,
-                        const size_t expected_length,
-                        const std::string& dir_path) {
-    std::unique_ptr<CallSessionFileRotatingStream> stream(
-        new CallSessionFileRotatingStream(dir_path));
-    ASSERT_TRUE(stream->Open());
-    size_t read = 0;
-    size_t stream_size = 0;
-    EXPECT_TRUE(stream->GetSize(&stream_size));
-    std::unique_ptr<uint8_t[]> buffer(new uint8_t[expected_length]);
-    EXPECT_EQ(SR_SUCCESS,
-              stream->ReadAll(buffer.get(), expected_length, &read, nullptr));
-    EXPECT_EQ(0, memcmp(expected_contents, buffer.get(), expected_length));
-    EXPECT_EQ(SR_EOS, stream->ReadAll(buffer.get(), 1, nullptr, nullptr));
-    EXPECT_EQ(stream_size, read);
-  }
-
-  std::unique_ptr<CallSessionFileRotatingStream> stream_;
-  std::string dir_path_;
-};
-
-// Tests that writing and reading to a stream with the smallest possible
-// capacity works.
-TEST_F(MAYBE_CallSessionFileRotatingStreamTest, WriteAndReadSmallest) {
-  Init("CallSessionFileRotatingStreamTestWriteAndReadSmallest", 4);
-
-  ASSERT_TRUE(stream_->Open());
-  std::string message("abcde");
-  WriteAndFlush(message.c_str(), message.size());
-  std::string expected_contents("abe");
-  VerifyStreamRead(expected_contents.c_str(), expected_contents.size(),
-                   dir_path_);
-}
-
-// Tests that writing and reading to a stream with capacity lesser than 4MB
-// behaves correctly.
-TEST_F(MAYBE_CallSessionFileRotatingStreamTest, WriteAndReadSmall) {
-  Init("CallSessionFileRotatingStreamTestWriteAndReadSmall", 8);
-
-  ASSERT_TRUE(stream_->Open());
-  std::string message("123456789");
-  WriteAndFlush(message.c_str(), message.size());
-  std::string expected_contents("1234789");
-  VerifyStreamRead(expected_contents.c_str(), expected_contents.size(),
-                   dir_path_);
-}
-
-// Tests that writing and reading to a stream with capacity greater than 4MB
-// behaves correctly.
-TEST_F(MAYBE_CallSessionFileRotatingStreamTest, WriteAndReadLarge) {
-  Init("CallSessionFileRotatingStreamTestWriteAndReadLarge", 6 * 1024 * 1024);
-
-  ASSERT_TRUE(stream_->Open());
-  const size_t buffer_size = 1024 * 1024;
-  std::unique_ptr<uint8_t[]> buffer(new uint8_t[buffer_size]);
-  for (int i = 0; i < 8; i++) {
-    memset(buffer.get(), i, buffer_size);
-    EXPECT_EQ(SR_SUCCESS,
-              stream_->WriteAll(buffer.get(), buffer_size, nullptr, nullptr));
-  }
-
-  stream_.reset(new CallSessionFileRotatingStream(dir_path_));
-  ASSERT_TRUE(stream_->Open());
-  std::unique_ptr<uint8_t[]> expected_buffer(new uint8_t[buffer_size]);
-  int expected_vals[] = {0, 1, 2, 6, 7};
-  for (size_t i = 0; i < arraysize(expected_vals); ++i) {
-    memset(expected_buffer.get(), expected_vals[i], buffer_size);
-    EXPECT_EQ(SR_SUCCESS,
-              stream_->ReadAll(buffer.get(), buffer_size, nullptr, nullptr));
-    EXPECT_EQ(0, memcmp(buffer.get(), expected_buffer.get(), buffer_size));
-  }
-  EXPECT_EQ(SR_EOS, stream_->ReadAll(buffer.get(), 1, nullptr, nullptr));
-}
-
-// Tests that writing and reading to a stream where only the first file is
-// written to behaves correctly.
-TEST_F(MAYBE_CallSessionFileRotatingStreamTest, WriteAndReadFirstHalf) {
-  Init("CallSessionFileRotatingStreamTestWriteAndReadFirstHalf",
-       6 * 1024 * 1024);
-  ASSERT_TRUE(stream_->Open());
-  const size_t buffer_size = 1024 * 1024;
-  std::unique_ptr<uint8_t[]> buffer(new uint8_t[buffer_size]);
-  for (int i = 0; i < 2; i++) {
-    memset(buffer.get(), i, buffer_size);
-    EXPECT_EQ(SR_SUCCESS,
-              stream_->WriteAll(buffer.get(), buffer_size, nullptr, nullptr));
-  }
-
-  stream_.reset(new CallSessionFileRotatingStream(dir_path_));
-  ASSERT_TRUE(stream_->Open());
-  std::unique_ptr<uint8_t[]> expected_buffer(new uint8_t[buffer_size]);
-  int expected_vals[] = {0, 1};
-  for (size_t i = 0; i < arraysize(expected_vals); ++i) {
-    memset(expected_buffer.get(), expected_vals[i], buffer_size);
-    EXPECT_EQ(SR_SUCCESS,
-              stream_->ReadAll(buffer.get(), buffer_size, nullptr, nullptr));
-    EXPECT_EQ(0, memcmp(buffer.get(), expected_buffer.get(), buffer_size));
-  }
-  EXPECT_EQ(SR_EOS, stream_->ReadAll(buffer.get(), 1, nullptr, nullptr));
-}
-
-}  // namespace rtc
diff --git a/rtc_base/fileutils.cc b/rtc_base/fileutils.cc
deleted file mode 100644
index 9a97cda..0000000
--- a/rtc_base/fileutils.cc
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- *  Copyright 2004 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/rtc_base/fileutils.h"
-
-#include "webrtc/rtc_base/arraysize.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/pathutils.h"
-#include "webrtc/rtc_base/stringutils.h"
-
-#if defined(WEBRTC_WIN)
-#include "webrtc/rtc_base/win32filesystem.h"
-#else
-#include "webrtc/rtc_base/unixfilesystem.h"
-#endif
-
-#if !defined(WEBRTC_WIN)
-#define MAX_PATH 260
-#endif
-
-namespace rtc {
-
-//////////////////////////
-// Directory Iterator   //
-//////////////////////////
-
-// A DirectoryIterator is created with a given directory. It originally points
-// to the first file in the directory, and can be advanecd with Next(). This
-// allows you to get information about each file.
-
-  // Constructor
-DirectoryIterator::DirectoryIterator()
-#ifdef WEBRTC_WIN
-    : handle_(INVALID_HANDLE_VALUE) {
-#else
-    : dir_(nullptr),
-      dirent_(nullptr){
-#endif
-}
-
-  // Destructor
-DirectoryIterator::~DirectoryIterator() {
-#if defined(WEBRTC_WIN)
-  if (handle_ != INVALID_HANDLE_VALUE)
-    ::FindClose(handle_);
-#else
-  if (dir_)
-    closedir(dir_);
-#endif
-}
-
-  // Starts traversing a directory.
-  // dir is the directory to traverse
-  // returns true if the directory exists and is valid
-bool DirectoryIterator::Iterate(const Pathname &dir) {
-  directory_ = dir.pathname();
-#if defined(WEBRTC_WIN)
-  if (handle_ != INVALID_HANDLE_VALUE)
-    ::FindClose(handle_);
-  std::string d = dir.pathname() + '*';
-  handle_ = ::FindFirstFile(ToUtf16(d).c_str(), &data_);
-  if (handle_ == INVALID_HANDLE_VALUE)
-    return false;
-#else
-  if (dir_ != nullptr)
-    closedir(dir_);
-  dir_ = ::opendir(directory_.c_str());
-  if (dir_ == nullptr)
-    return false;
-  dirent_ = readdir(dir_);
-  if (dirent_ == nullptr)
-    return false;
-
-  if (::stat(std::string(directory_ + Name()).c_str(), &stat_) != 0)
-    return false;
-#endif
-  return true;
-}
-
-  // Advances to the next file
-  // returns true if there were more files in the directory.
-bool DirectoryIterator::Next() {
-#if defined(WEBRTC_WIN)
-  return ::FindNextFile(handle_, &data_) == TRUE;
-#else
-  dirent_ = ::readdir(dir_);
-  if (dirent_ == nullptr)
-    return false;
-
-  return ::stat(std::string(directory_ + Name()).c_str(), &stat_) == 0;
-#endif
-}
-
-  // returns true if the file currently pointed to is a directory
-bool DirectoryIterator::IsDirectory() const {
-#if defined(WEBRTC_WIN)
-  return (data_.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != FALSE;
-#else
-  return S_ISDIR(stat_.st_mode);
-#endif
-}
-
-  // returns the name of the file currently pointed to
-std::string DirectoryIterator::Name() const {
-#if defined(WEBRTC_WIN)
-  return ToUtf8(data_.cFileName);
-#else
-  RTC_DCHECK(dirent_);
-  return dirent_->d_name;
-#endif
-}
-
-FilesystemInterface* Filesystem::default_filesystem_ = nullptr;
-
-FilesystemInterface *Filesystem::EnsureDefaultFilesystem() {
-  if (!default_filesystem_) {
-#if defined(WEBRTC_WIN)
-    default_filesystem_ = new Win32Filesystem();
-#else
-    default_filesystem_ = new UnixFilesystem();
-#endif
-  }
-  return default_filesystem_;
-}
-
-}  // namespace rtc
diff --git a/rtc_base/fileutils.h b/rtc_base/fileutils.h
deleted file mode 100644
index 8c6f1e8..0000000
--- a/rtc_base/fileutils.h
+++ /dev/null
@@ -1,156 +0,0 @@
-/*
- *  Copyright 2004 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_RTC_BASE_FILEUTILS_H_
-#define WEBRTC_RTC_BASE_FILEUTILS_H_
-
-#include <string>
-
-#if !defined(WEBRTC_WIN)
-#include <dirent.h>
-#include <stdio.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-#include <unistd.h>
-#endif
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/platform_file.h"
-
-namespace rtc {
-
-class FileStream;
-class Pathname;
-
-//////////////////////////
-// Directory Iterator   //
-//////////////////////////
-
-// A DirectoryIterator is created with a given directory. It originally points
-// to the first file in the directory, and can be advanecd with Next(). This
-// allows you to get information about each file.
-
-class DirectoryIterator {
-  friend class Filesystem;
- public:
-  // Constructor
-  DirectoryIterator();
-  // Destructor
-  virtual ~DirectoryIterator();
-
-  // Starts traversing a directory
-  // dir is the directory to traverse
-  // returns true if the directory exists and is valid
-  // The iterator will point to the first entry in the directory
-  virtual bool Iterate(const Pathname &path);
-
-  // Advances to the next file
-  // returns true if there were more files in the directory.
-  virtual bool Next();
-
-  // returns true if the file currently pointed to is a directory
-  virtual bool IsDirectory() const;
-
-  // returns the name of the file currently pointed to
-  virtual std::string Name() const;
-
- private:
-  std::string directory_;
-#if defined(WEBRTC_WIN)
-  WIN32_FIND_DATA data_;
-  HANDLE handle_;
-#else
-  DIR *dir_;
-  struct dirent *dirent_;
-  struct stat stat_;
-#endif
-};
-
-class FilesystemInterface {
- public:
-  virtual ~FilesystemInterface() {}
-
-  // This will attempt to delete the path located at filename.
-  // It DCHECKs and returns false if the path points to a folder or a
-  // non-existent file.
-  virtual bool DeleteFile(const Pathname &filename) = 0;
-
-  // This moves a file from old_path to new_path, where "old_path" is a
-  // plain file. This DCHECKs and returns false if old_path points to a
-  // directory, and returns true if the function succeeds.
-  virtual bool MoveFile(const Pathname &old_path, const Pathname &new_path) = 0;
-
-  // Returns true if pathname refers to a directory
-  virtual bool IsFolder(const Pathname& pathname) = 0;
-
-  // Returns true if pathname refers to a file
-  virtual bool IsFile(const Pathname& pathname) = 0;
-
-  virtual std::string TempFilename(const Pathname &dir,
-                                   const std::string &prefix) = 0;
-
-  // Determines the size of the file indicated by path.
-  virtual bool GetFileSize(const Pathname& path, size_t* size) = 0;
-};
-
-class Filesystem {
- public:
-  static FilesystemInterface *default_filesystem() {
-    RTC_DCHECK(default_filesystem_);
-    return default_filesystem_;
-  }
-
-  static void set_default_filesystem(FilesystemInterface *filesystem) {
-    default_filesystem_ = filesystem;
-  }
-
-  static FilesystemInterface *swap_default_filesystem(
-      FilesystemInterface *filesystem) {
-    FilesystemInterface *cur = default_filesystem_;
-    default_filesystem_ = filesystem;
-    return cur;
-  }
-
-  static bool DeleteFile(const Pathname &filename) {
-    return EnsureDefaultFilesystem()->DeleteFile(filename);
-  }
-
-  static bool MoveFile(const Pathname &old_path, const Pathname &new_path) {
-    return EnsureDefaultFilesystem()->MoveFile(old_path, new_path);
-  }
-
-  static bool IsFolder(const Pathname& pathname) {
-    return EnsureDefaultFilesystem()->IsFolder(pathname);
-  }
-
-  static bool IsFile(const Pathname &pathname) {
-    return EnsureDefaultFilesystem()->IsFile(pathname);
-  }
-
-  static std::string TempFilename(const Pathname &dir,
-                                  const std::string &prefix) {
-    return EnsureDefaultFilesystem()->TempFilename(dir, prefix);
-  }
-
-  static bool GetFileSize(const Pathname& path, size_t* size) {
-    return EnsureDefaultFilesystem()->GetFileSize(path, size);
-  }
-
- private:
-  static FilesystemInterface* default_filesystem_;
-
-  static FilesystemInterface *EnsureDefaultFilesystem();
-  RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(Filesystem);
-};
-
-}  // namespace rtc
-
-#endif  // WEBRTC_RTC_BASE_FILEUTILS_H_
diff --git a/rtc_base/firewallsocketserver.cc b/rtc_base/firewallsocketserver.cc
deleted file mode 100644
index b60a943..0000000
--- a/rtc_base/firewallsocketserver.cc
+++ /dev/null
@@ -1,271 +0,0 @@
-/*
- *  Copyright 2004 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/rtc_base/firewallsocketserver.h"
-
-#include <algorithm>
-
-#include "webrtc/rtc_base/asyncsocket.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-
-namespace rtc {
-
-class FirewallSocket : public AsyncSocketAdapter {
- public:
-  FirewallSocket(FirewallSocketServer* server, AsyncSocket* socket, int type)
-    : AsyncSocketAdapter(socket), server_(server), type_(type) {
-  }
-
-  int Bind(const SocketAddress& addr) override {
-    if (!server_->IsBindableIp(addr.ipaddr())) {
-      SetError(EINVAL);
-      return SOCKET_ERROR;
-    }
-    return AsyncSocketAdapter::Bind(addr);
-  }
-
-  int Connect(const SocketAddress& addr) override {
-    if (type_ == SOCK_STREAM) {
-      if (!server_->Check(FP_TCP, GetLocalAddress(), addr)) {
-        LOG(LS_VERBOSE) << "FirewallSocket outbound TCP connection from "
-                        << GetLocalAddress().ToSensitiveString() << " to "
-                        << addr.ToSensitiveString() << " denied";
-        // TODO: Handle this asynchronously.
-        SetError(EHOSTUNREACH);
-        return SOCKET_ERROR;
-      }
-    }
-    return AsyncSocketAdapter::Connect(addr);
-  }
-  int Send(const void* pv, size_t cb) override {
-    return SendTo(pv, cb, GetRemoteAddress());
-  }
-  int SendTo(const void* pv, size_t cb, const SocketAddress& addr) override {
-    RTC_DCHECK(type_ == SOCK_DGRAM || type_ == SOCK_STREAM);
-    FirewallProtocol protocol = (type_ == SOCK_DGRAM) ? FP_UDP : FP_TCP;
-    if (!server_->Check(protocol, GetLocalAddress(), addr)) {
-      LOG(LS_VERBOSE) << "FirewallSocket outbound packet with type " << type_
-                      << " from " << GetLocalAddress().ToSensitiveString()
-                      << " to " << addr.ToSensitiveString() << " dropped";
-      return static_cast<int>(cb);
-    }
-    return AsyncSocketAdapter::SendTo(pv, cb, addr);
-  }
-  int Recv(void* pv, size_t cb, int64_t* timestamp) override {
-    SocketAddress addr;
-    return RecvFrom(pv, cb, &addr, timestamp);
-  }
-  int RecvFrom(void* pv,
-               size_t cb,
-               SocketAddress* paddr,
-               int64_t* timestamp) override {
-    if (type_ == SOCK_DGRAM) {
-      while (true) {
-        int res = AsyncSocketAdapter::RecvFrom(pv, cb, paddr, timestamp);
-        if (res <= 0)
-          return res;
-        if (server_->Check(FP_UDP, *paddr, GetLocalAddress()))
-          return res;
-        LOG(LS_VERBOSE) << "FirewallSocket inbound UDP packet from "
-                        << paddr->ToSensitiveString() << " to "
-                        << GetLocalAddress().ToSensitiveString() << " dropped";
-      }
-    }
-    return AsyncSocketAdapter::RecvFrom(pv, cb, paddr, timestamp);
-  }
-
-  int Listen(int backlog) override {
-    if (!server_->tcp_listen_enabled()) {
-      LOG(LS_VERBOSE) << "FirewallSocket listen attempt denied";
-      return -1;
-    }
-
-    return AsyncSocketAdapter::Listen(backlog);
-  }
-  AsyncSocket* Accept(SocketAddress* paddr) override {
-    SocketAddress addr;
-    while (AsyncSocket* sock = AsyncSocketAdapter::Accept(&addr)) {
-      if (server_->Check(FP_TCP, addr, GetLocalAddress())) {
-        if (paddr)
-          *paddr = addr;
-        return sock;
-      }
-      sock->Close();
-      delete sock;
-      LOG(LS_VERBOSE) << "FirewallSocket inbound TCP connection from "
-                      << addr.ToSensitiveString() << " to "
-                      << GetLocalAddress().ToSensitiveString() << " denied";
-    }
-    return 0;
-  }
-
- private:
-  FirewallSocketServer* server_;
-  int type_;
-};
-
-FirewallSocketServer::FirewallSocketServer(SocketServer* server,
-                                           FirewallManager* manager,
-                                           bool should_delete_server)
-    : server_(server), manager_(manager),
-      should_delete_server_(should_delete_server),
-      udp_sockets_enabled_(true), tcp_sockets_enabled_(true),
-      tcp_listen_enabled_(true) {
-  if (manager_)
-    manager_->AddServer(this);
-}
-
-FirewallSocketServer::~FirewallSocketServer() {
-  if (manager_)
-    manager_->RemoveServer(this);
-
-  if (server_ && should_delete_server_) {
-    delete server_;
-    server_ = nullptr;
-  }
-}
-
-void FirewallSocketServer::AddRule(bool allow, FirewallProtocol p,
-                                   FirewallDirection d,
-                                   const SocketAddress& addr) {
-  SocketAddress any;
-  if (d == FD_IN || d == FD_ANY) {
-    AddRule(allow, p, any, addr);
-  }
-  if (d == FD_OUT || d == FD_ANY) {
-    AddRule(allow, p, addr, any);
-  }
-}
-
-
-void FirewallSocketServer::AddRule(bool allow, FirewallProtocol p,
-                                   const SocketAddress& src,
-                                   const SocketAddress& dst) {
-  Rule r;
-  r.allow = allow;
-  r.p = p;
-  r.src = src;
-  r.dst = dst;
-  CritScope scope(&crit_);
-  rules_.push_back(r);
-}
-
-void FirewallSocketServer::ClearRules() {
-  CritScope scope(&crit_);
-  rules_.clear();
-}
-
-bool FirewallSocketServer::Check(FirewallProtocol p,
-                                 const SocketAddress& src,
-                                 const SocketAddress& dst) {
-  CritScope scope(&crit_);
-  for (size_t i = 0; i < rules_.size(); ++i) {
-    const Rule& r = rules_[i];
-    if ((r.p != p) && (r.p != FP_ANY))
-      continue;
-    if ((r.src.ipaddr() != src.ipaddr()) && !r.src.IsNil())
-      continue;
-    if ((r.src.port() != src.port()) && (r.src.port() != 0))
-      continue;
-    if ((r.dst.ipaddr() != dst.ipaddr()) && !r.dst.IsNil())
-      continue;
-    if ((r.dst.port() != dst.port()) && (r.dst.port() != 0))
-      continue;
-    return r.allow;
-  }
-  return true;
-}
-
-void FirewallSocketServer::SetUnbindableIps(
-    const std::vector<rtc::IPAddress>& unbindable_ips) {
-  unbindable_ips_ = unbindable_ips;
-}
-
-bool FirewallSocketServer::IsBindableIp(const rtc::IPAddress& ip) {
-  return std::find(unbindable_ips_.begin(), unbindable_ips_.end(), ip) ==
-         unbindable_ips_.end();
-}
-
-Socket* FirewallSocketServer::CreateSocket(int type) {
-  return CreateSocket(AF_INET, type);
-}
-
-Socket* FirewallSocketServer::CreateSocket(int family, int type) {
-  return WrapSocket(server_->CreateAsyncSocket(family, type), type);
-}
-
-AsyncSocket* FirewallSocketServer::CreateAsyncSocket(int type) {
-  return CreateAsyncSocket(AF_INET, type);
-}
-
-AsyncSocket* FirewallSocketServer::CreateAsyncSocket(int family, int type) {
-  return WrapSocket(server_->CreateAsyncSocket(family, type), type);
-}
-
-void FirewallSocketServer::SetMessageQueue(MessageQueue* queue) {
-  server_->SetMessageQueue(queue);
-}
-
-bool FirewallSocketServer::Wait(int cms, bool process_io) {
-  return server_->Wait(cms, process_io);
-}
-
-void FirewallSocketServer::WakeUp() {
-  return server_->WakeUp();
-}
-
-AsyncSocket* FirewallSocketServer::WrapSocket(AsyncSocket* sock, int type) {
-  if (!sock ||
-      (type == SOCK_STREAM && !tcp_sockets_enabled_) ||
-      (type == SOCK_DGRAM && !udp_sockets_enabled_)) {
-    LOG(LS_VERBOSE) << "FirewallSocketServer socket creation denied";
-    delete sock;
-    return nullptr;
-  }
-  return new FirewallSocket(this, sock, type);
-}
-
-FirewallManager::FirewallManager() {
-}
-
-FirewallManager::~FirewallManager() {
-  RTC_DCHECK(servers_.empty());
-}
-
-void FirewallManager::AddServer(FirewallSocketServer* server) {
-  CritScope scope(&crit_);
-  servers_.push_back(server);
-}
-
-void FirewallManager::RemoveServer(FirewallSocketServer* server) {
-  CritScope scope(&crit_);
-  servers_.erase(std::remove(servers_.begin(), servers_.end(), server),
-                 servers_.end());
-}
-
-void FirewallManager::AddRule(bool allow, FirewallProtocol p,
-                              FirewallDirection d, const SocketAddress& addr) {
-  CritScope scope(&crit_);
-  for (std::vector<FirewallSocketServer*>::const_iterator it =
-      servers_.begin(); it != servers_.end(); ++it) {
-    (*it)->AddRule(allow, p, d, addr);
-  }
-}
-
-void FirewallManager::ClearRules() {
-  CritScope scope(&crit_);
-  for (std::vector<FirewallSocketServer*>::const_iterator it =
-      servers_.begin(); it != servers_.end(); ++it) {
-    (*it)->ClearRules();
-  }
-}
-
-}  // namespace rtc
diff --git a/rtc_base/firewallsocketserver.h b/rtc_base/firewallsocketserver.h
deleted file mode 100644
index d78a241..0000000
--- a/rtc_base/firewallsocketserver.h
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- *  Copyright 2004 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_RTC_BASE_FIREWALLSOCKETSERVER_H_
-#define WEBRTC_RTC_BASE_FIREWALLSOCKETSERVER_H_
-
-#include <vector>
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/socketserver.h"
-
-namespace rtc {
-
-class FirewallManager;
-
-// This SocketServer shim simulates a rule-based firewall server.
-
-enum FirewallProtocol { FP_UDP, FP_TCP, FP_ANY };
-enum FirewallDirection { FD_IN, FD_OUT, FD_ANY };
-
-class FirewallSocketServer : public SocketServer {
- public:
-  FirewallSocketServer(SocketServer* server,
-                       FirewallManager* manager = nullptr,
-                       bool should_delete_server = false);
-  ~FirewallSocketServer() override;
-
-  SocketServer* socketserver() const { return server_; }
-  void set_socketserver(SocketServer* server) {
-    if (server_ && should_delete_server_) {
-      delete server_;
-      server_ = nullptr;
-      should_delete_server_ = false;
-    }
-    server_ = server;
-  }
-
-  // Settings to control whether CreateSocket or Socket::Listen succeed.
-  void set_udp_sockets_enabled(bool enabled) { udp_sockets_enabled_ = enabled; }
-  void set_tcp_sockets_enabled(bool enabled) { tcp_sockets_enabled_ = enabled; }
-  bool tcp_listen_enabled() const { return tcp_listen_enabled_; }
-  void set_tcp_listen_enabled(bool enabled) { tcp_listen_enabled_ = enabled; }
-
-  // Rules govern the behavior of Connect/Accept/Send/Recv attempts.
-  void AddRule(bool allow, FirewallProtocol p = FP_ANY,
-               FirewallDirection d = FD_ANY,
-               const SocketAddress& addr = SocketAddress());
-  void AddRule(bool allow, FirewallProtocol p,
-               const SocketAddress& src, const SocketAddress& dst);
-  void ClearRules();
-
-  bool Check(FirewallProtocol p,
-             const SocketAddress& src, const SocketAddress& dst);
-
-  // Set the IP addresses for which Bind will fail. By default this list is
-  // empty. This can be used to simulate a real OS that refuses to bind to
-  // addresses under various circumstances.
-  //
-  // No matter how many addresses are added (including INADDR_ANY), the server
-  // will still allow creating outgoing TCP connections, since they don't
-  // require explicitly binding a socket.
-  void SetUnbindableIps(const std::vector<rtc::IPAddress>& unbindable_ips);
-  bool IsBindableIp(const rtc::IPAddress& ip);
-
-  Socket* CreateSocket(int type) override;
-  Socket* CreateSocket(int family, int type) override;
-
-  AsyncSocket* CreateAsyncSocket(int type) override;
-  AsyncSocket* CreateAsyncSocket(int family, int type) override;
-
-  void SetMessageQueue(MessageQueue* queue) override;
-  bool Wait(int cms, bool process_io) override;
-  void WakeUp() override;
-
-  Socket * WrapSocket(Socket * sock, int type);
-  AsyncSocket * WrapSocket(AsyncSocket * sock, int type);
-
- private:
-  SocketServer * server_;
-  FirewallManager * manager_;
-  CriticalSection crit_;
-  struct Rule {
-    bool allow;
-    FirewallProtocol p;
-    FirewallDirection d;
-    SocketAddress src;
-    SocketAddress dst;
-  };
-  std::vector<Rule> rules_;
-  std::vector<rtc::IPAddress> unbindable_ips_;
-  bool should_delete_server_;
-  bool udp_sockets_enabled_;
-  bool tcp_sockets_enabled_;
-  bool tcp_listen_enabled_;
-};
-
-// FirewallManager allows you to manage firewalls in multiple threads together
-
-class FirewallManager {
- public:
-  FirewallManager();
-  ~FirewallManager();
-
-  void AddServer(FirewallSocketServer * server);
-  void RemoveServer(FirewallSocketServer * server);
-
-  void AddRule(bool allow, FirewallProtocol p = FP_ANY,
-               FirewallDirection d = FD_ANY,
-               const SocketAddress& addr = SocketAddress());
-  void ClearRules();
-
- private:
-  CriticalSection crit_;
-  std::vector<FirewallSocketServer *> servers_;
-};
-
-}  // namespace rtc
-
-#endif  // WEBRTC_RTC_BASE_FIREWALLSOCKETSERVER_H_
diff --git a/rtc_base/flags.cc b/rtc_base/flags.cc
deleted file mode 100644
index b5697f1..0000000
--- a/rtc_base/flags.cc
+++ /dev/null
@@ -1,299 +0,0 @@
-/*
- *  Copyright 2006 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/rtc_base/flags.h"
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "webrtc/rtc_base/checks.h"
-
-#if defined(WEBRTC_WIN)
-#include "webrtc/rtc_base/win32.h"
-#include <shellapi.h>
-#endif
-
-namespace rtc {
-// -----------------------------------------------------------------------------
-// Implementation of Flag
-
-Flag::Flag(const char* file, const char* name, const char* comment,
-           Type type, void* variable, FlagValue default__)
-    : file_(file),
-      name_(name),
-      comment_(comment),
-      type_(type),
-      variable_(reinterpret_cast<FlagValue*>(variable)),
-      default_(default__) {
-  FlagList::Register(this);
-}
-
-
-void Flag::SetToDefault() {
-  // Note that we cannot simply do '*variable_ = default_;' since
-  // flag variables are not really of type FlagValue and thus may
-  // be smaller! The FlagValue union is simply 'overlayed' on top
-  // of a flag variable for convenient access. Since union members
-  // are guarantee to be aligned at the beginning, this works.
-  switch (type_) {
-    case Flag::BOOL:
-      variable_->b = default_.b;
-      return;
-    case Flag::INT:
-      variable_->i = default_.i;
-      return;
-    case Flag::FLOAT:
-      variable_->f = default_.f;
-      return;
-    case Flag::STRING:
-      variable_->s = default_.s;
-      return;
-  }
-  FATAL() << "unreachable code";
-}
-
-
-static const char* Type2String(Flag::Type type) {
-  switch (type) {
-    case Flag::BOOL: return "bool";
-    case Flag::INT: return "int";
-    case Flag::FLOAT: return "float";
-    case Flag::STRING: return "string";
-  }
-  FATAL() << "unreachable code";
-}
-
-
-static void PrintFlagValue(Flag::Type type, FlagValue* p) {
-  switch (type) {
-    case Flag::BOOL:
-      printf("%s", (p->b ? "true" : "false"));
-      return;
-    case Flag::INT:
-      printf("%d", p->i);
-      return;
-    case Flag::FLOAT:
-      printf("%f", p->f);
-      return;
-    case Flag::STRING:
-      printf("%s", p->s);
-      return;
-  }
-  FATAL() << "unreachable code";
-}
-
-
-void Flag::Print(bool print_current_value) {
-  printf("  --%s (%s)  type: %s  default: ", name_, comment_,
-          Type2String(type_));
-  PrintFlagValue(type_, &default_);
-  if (print_current_value) {
-    printf("  current value: ");
-    PrintFlagValue(type_, variable_);
-  }
-  printf("\n");
-}
-
-
-// -----------------------------------------------------------------------------
-// Implementation of FlagList
-
-Flag* FlagList::list_ = nullptr;
-
-FlagList::FlagList() {
-  list_ = nullptr;
-}
-
-void FlagList::Print(const char* file, bool print_current_value) {
-  // Since flag registration is likely by file (= C++ file),
-  // we don't need to sort by file and still get grouped output.
-  const char* current = nullptr;
-  for (Flag* f = list_; f != nullptr; f = f->next()) {
-    if (file == nullptr || file == f->file()) {
-      if (current != f->file()) {
-        printf("Flags from %s:\n", f->file());
-        current = f->file();
-      }
-      f->Print(print_current_value);
-    }
-  }
-}
-
-
-Flag* FlagList::Lookup(const char* name) {
-  Flag* f = list_;
-  while (f != nullptr && strcmp(name, f->name()) != 0)
-    f = f->next();
-  return f;
-}
-
-
-void FlagList::SplitArgument(const char* arg,
-                             char* buffer, int buffer_size,
-                             const char** name, const char** value,
-                             bool* is_bool) {
-  *name = nullptr;
-  *value = nullptr;
-  *is_bool = false;
-
-  if (*arg == '-') {
-    // find the begin of the flag name
-    arg++;  // remove 1st '-'
-    if (*arg == '-')
-      arg++;  // remove 2nd '-'
-    if (arg[0] == 'n' && arg[1] == 'o' && Lookup(arg + 2)) {
-      arg += 2;  // remove "no"
-      *is_bool = true;
-    }
-    *name = arg;
-
-    // find the end of the flag name
-    while (*arg != '\0' && *arg != '=')
-      arg++;
-
-    // get the value if any
-    if (*arg == '=') {
-      // make a copy so we can NUL-terminate flag name
-      int n = static_cast<int>(arg - *name);
-      RTC_CHECK_LT(n, buffer_size);
-      memcpy(buffer, *name, n * sizeof(char));
-      buffer[n] = '\0';
-      *name = buffer;
-      // get the value
-      *value = arg + 1;
-    }
-  }
-}
-
-
-int FlagList::SetFlagsFromCommandLine(int* argc, const char** argv,
-                                      bool remove_flags) {
-  // parse arguments
-  for (int i = 1; i < *argc; /* see below */) {
-    int j = i;  // j > 0
-    const char* arg = argv[i++];
-
-    // split arg into flag components
-    char buffer[1024];
-    const char* name;
-    const char* value;
-    bool is_bool;
-    SplitArgument(arg, buffer, sizeof buffer, &name, &value, &is_bool);
-
-    if (name != nullptr) {
-      // lookup the flag
-      Flag* flag = Lookup(name);
-      if (flag == nullptr) {
-        fprintf(stderr, "Error: unrecognized flag %s\n", arg);
-        return j;
-      }
-
-      // if we still need a flag value, use the next argument if available
-      if (flag->type() != Flag::BOOL && value == nullptr) {
-        if (i < *argc) {
-          value = argv[i++];
-        } else {
-          fprintf(stderr, "Error: missing value for flag %s of type %s\n",
-            arg, Type2String(flag->type()));
-          return j;
-        }
-      }
-
-      // set the flag
-      char empty[] = { '\0' };
-      char* endp = empty;
-      switch (flag->type()) {
-        case Flag::BOOL:
-          *flag->bool_variable() = !is_bool;
-          break;
-        case Flag::INT:
-          *flag->int_variable() = strtol(value, &endp, 10);
-          break;
-        case Flag::FLOAT:
-          *flag->float_variable() = strtod(value, &endp);
-          break;
-        case Flag::STRING:
-          *flag->string_variable() = value;
-          break;
-      }
-
-      // handle errors
-      if ((flag->type() == Flag::BOOL && value != nullptr) ||
-          (flag->type() != Flag::BOOL && is_bool) || *endp != '\0') {
-        fprintf(stderr, "Error: illegal value for flag %s of type %s\n",
-          arg, Type2String(flag->type()));
-        return j;
-      }
-
-      // remove the flag & value from the command
-      if (remove_flags)
-        while (j < i)
-          argv[j++] = nullptr;
-    }
-  }
-
-  // shrink the argument list
-  if (remove_flags) {
-    int j = 1;
-    for (int i = 1; i < *argc; i++) {
-      if (argv[i] != nullptr)
-        argv[j++] = argv[i];
-    }
-    *argc = j;
-  }
-
-  // parsed all flags successfully
-  return 0;
-}
-
-void FlagList::Register(Flag* flag) {
-  RTC_DCHECK(flag);
-  RTC_DCHECK_GT(strlen(flag->name()), 0);
-  // NOTE: Don't call Lookup() within Register because it accesses the name_
-  // of other flags in list_, and if the flags are coming from two different
-  // compilation units, the initialization order between them is undefined, and
-  // this will trigger an asan initialization-order-fiasco error.
-  flag->next_ = list_;
-  list_ = flag;
-}
-
-#if defined(WEBRTC_WIN)
-WindowsCommandLineArguments::WindowsCommandLineArguments() {
-  // start by getting the command line.
-  LPTSTR command_line = ::GetCommandLine();
-   // now, convert it to a list of wide char strings.
-  LPWSTR *wide_argv = ::CommandLineToArgvW(command_line, &argc_);
-  // now allocate an array big enough to hold that many string pointers.
-  argv_ = new char*[argc_];
-
-  // iterate over the returned wide strings;
-  for(int i = 0; i < argc_; ++i) {
-    std::string s = rtc::ToUtf8(wide_argv[i], wcslen(wide_argv[i]));
-    char *buffer = new char[s.length() + 1];
-    rtc::strcpyn(buffer, s.length() + 1, s.c_str());
-
-    // make sure the argv array has the right string at this point.
-    argv_[i] = buffer;
-  }
-  LocalFree(wide_argv);
-}
-
-WindowsCommandLineArguments::~WindowsCommandLineArguments() {
-  // need to free each string in the array, and then the array.
-  for(int i = 0; i < argc_; i++) {
-    delete[] argv_[i];
-  }
-
-  delete[] argv_;
-}
-#endif  // WEBRTC_WIN
-
-}  // namespace rtc
diff --git a/rtc_base/flags.h b/rtc_base/flags.h
deleted file mode 100644
index b2d8b76..0000000
--- a/rtc_base/flags.h
+++ /dev/null
@@ -1,268 +0,0 @@
-/*
- *  Copyright 2006 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.
- */
-
-
-// Originally comes from shared/commandlineflags/flags.h
-
-// Flags are defined and declared using DEFINE_xxx and DECLARE_xxx macros,
-// where xxx is the flag type. Flags are referred to via FLAG_yyy,
-// where yyy is the flag name. For intialization and iteration of flags,
-// see the FlagList class. For full programmatic access to any
-// flag, see the Flag class.
-//
-// The implementation only relies and basic C++ functionality
-// and needs no special library or STL support.
-
-#ifndef WEBRTC_RTC_BASE_FLAGS_H_
-#define WEBRTC_RTC_BASE_FLAGS_H_
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace rtc {
-
-// Internal use only.
-union FlagValue {
-  // Note: Because in C++ non-bool values are silently converted into
-  // bool values ('bool b = "false";' results in b == true!), we pass
-  // and int argument to New_BOOL as this appears to be safer - sigh.
-  // In particular, it prevents the (not uncommon!) bug where a bool
-  // flag is defined via: DEFINE_bool(flag, "false", "some comment");.
-  static FlagValue New_BOOL(int b) {
-    FlagValue v;
-    v.b = (b != 0);
-    return v;
-  }
-
-  static FlagValue New_INT(int i) {
-    FlagValue v;
-    v.i = i;
-    return v;
-  }
-
-  static FlagValue New_FLOAT(float f) {
-    FlagValue v;
-    v.f = f;
-    return v;
-  }
-
-  static FlagValue New_STRING(const char* s) {
-    FlagValue v;
-    v.s = s;
-    return v;
-  }
-
-  bool b;
-  int i;
-  double f;
-  const char* s;
-};
-
-
-// Each flag can be accessed programmatically via a Flag object.
-class Flag {
- public:
-  enum Type { BOOL, INT, FLOAT, STRING };
-
-  // Internal use only.
-  Flag(const char* file, const char* name, const char* comment,
-       Type type, void* variable, FlagValue default_);
-
-  // General flag information
-  const char* file() const  { return file_; }
-  const char* name() const  { return name_; }
-  const char* comment() const  { return comment_; }
-
-  // Flag type
-  Type type() const  { return type_; }
-
-  // Flag variables
-  bool* bool_variable() const {
-    RTC_DCHECK_EQ(BOOL, type_);
-    return &variable_->b;
-  }
-
-  int* int_variable() const {
-    RTC_DCHECK_EQ(INT, type_);
-    return &variable_->i;
-  }
-
-  double* float_variable() const {
-    RTC_DCHECK_EQ(FLOAT, type_);
-    return &variable_->f;
-  }
-
-  const char** string_variable() const {
-    RTC_DCHECK_EQ(STRING, type_);
-    return &variable_->s;
-  }
-
-  // Default values
-  bool bool_default() const {
-    RTC_DCHECK_EQ(BOOL, type_);
-    return default_.b;
-  }
-
-  int int_default() const {
-    RTC_DCHECK_EQ(INT, type_);
-    return default_.i;
-  }
-
-  double float_default() const {
-    RTC_DCHECK_EQ(FLOAT, type_);
-    return default_.f;
-  }
-
-  const char* string_default() const {
-    RTC_DCHECK_EQ(STRING, type_);
-    return default_.s;
-  }
-
-  // Resets a flag to its default value
-  void SetToDefault();
-
-  // Iteration support
-  Flag* next() const  { return next_; }
-
-  // Prints flag information. The current flag value is only printed
-  // if print_current_value is set.
-  void Print(bool print_current_value);
-
- private:
-  const char* file_;
-  const char* name_;
-  const char* comment_;
-
-  Type type_;
-  FlagValue* variable_;
-  FlagValue default_;
-
-  Flag* next_;
-
-  friend class FlagList;  // accesses next_
-};
-
-
-// Internal use only.
-#define DEFINE_FLAG(type, c_type, name, default, comment) \
-  /* define and initialize the flag */                    \
-  c_type FLAG_##name = (default);                         \
-  /* register the flag */                                 \
-  static rtc::Flag Flag_##name(__FILE__, #name, (comment),      \
-                               rtc::Flag::type, &FLAG_##name,   \
-                               rtc::FlagValue::New_##type(default))
-
-
-// Internal use only.
-#define DECLARE_FLAG(c_type, name)              \
-  /* declare the external flag */               \
-  extern c_type FLAG_##name
-
-
-// Use the following macros to define a new flag:
-#define DEFINE_bool(name, default, comment) \
-  DEFINE_FLAG(BOOL, bool, name, default, comment)
-#define DEFINE_int(name, default, comment) \
-  DEFINE_FLAG(INT, int, name, default, comment)
-#define DEFINE_float(name, default, comment) \
-  DEFINE_FLAG(FLOAT, double, name, default, comment)
-#define DEFINE_string(name, default, comment) \
-  DEFINE_FLAG(STRING, const char*, name, default, comment)
-
-
-// Use the following macros to declare a flag defined elsewhere:
-#define DECLARE_bool(name)  DECLARE_FLAG(bool, name)
-#define DECLARE_int(name)  DECLARE_FLAG(int, name)
-#define DECLARE_float(name)  DECLARE_FLAG(double, name)
-#define DECLARE_string(name)  DECLARE_FLAG(const char*, name)
-
-
-// The global list of all flags.
-class FlagList {
- public:
-  FlagList();
-
-  // The null-terminated list of all flags. Traverse with Flag::next().
-  static Flag* list()  { return list_; }
-
-  // If file != nullptr, prints information for all flags defined in file;
-  // otherwise prints information for all flags in all files. The current flag
-  // value is only printed if print_current_value is set.
-  static void Print(const char* file, bool print_current_value);
-
-  // Lookup a flag by name. Returns the matching flag or null.
-  static Flag* Lookup(const char* name);
-
-  // Helper function to parse flags: Takes an argument arg and splits it into
-  // a flag name and flag value (or null if they are missing). is_bool is set
-  // if the arg started with "-no" or "--no". The buffer may be used to NUL-
-  // terminate the name, it must be large enough to hold any possible name.
-  static void SplitArgument(const char* arg,
-                            char* buffer, int buffer_size,
-                            const char** name, const char** value,
-                            bool* is_bool);
-
-  // Set the flag values by parsing the command line. If remove_flags
-  // is set, the flags and associated values are removed from (argc,
-  // argv). Returns 0 if no error occurred. Otherwise, returns the
-  // argv index > 0 for the argument where an error occurred. In that
-  // case, (argc, argv) will remain unchanged indepdendent of the
-  // remove_flags value, and no assumptions about flag settings should
-  // be made.
-  //
-  // The following syntax for flags is accepted (both '-' and '--' are ok):
-  //
-  //   --flag        (bool flags only)
-  //   --noflag      (bool flags only)
-  //   --flag=value  (non-bool flags only, no spaces around '=')
-  //   --flag value  (non-bool flags only)
-  static int SetFlagsFromCommandLine(int* argc,
-                                     const char** argv,
-                                     bool remove_flags);
-  static inline int SetFlagsFromCommandLine(int* argc,
-                                            char** argv,
-                                            bool remove_flags) {
-    return SetFlagsFromCommandLine(argc, const_cast<const char**>(argv),
-                                   remove_flags);
-  }
-
-  // Registers a new flag. Called during program initialization. Not
-  // thread-safe.
-  static void Register(Flag* flag);
-
- private:
-  static Flag* list_;
-};
-
-#if defined(WEBRTC_WIN)
-// A helper class to translate Windows command line arguments into UTF8,
-// which then allows us to just pass them to the flags system.
-// This encapsulates all the work of getting the command line and translating
-// it to an array of 8-bit strings; all you have to do is create one of these,
-// and then call argc() and argv().
-class WindowsCommandLineArguments {
- public:
-  WindowsCommandLineArguments();
-  ~WindowsCommandLineArguments();
-
-  int argc() { return argc_; }
-  char **argv() { return argv_; }
- private:
-  int argc_;
-  char **argv_;
-
- private:
-  RTC_DISALLOW_COPY_AND_ASSIGN(WindowsCommandLineArguments);
-};
-#endif  // WEBRTC_WIN
-
-}  // namespace rtc
-
-#endif  // SHARED_COMMANDLINEFLAGS_FLAGS_H_
diff --git a/rtc_base/format_macros.h b/rtc_base/format_macros.h
deleted file mode 100644
index 3c28127..0000000
--- a/rtc_base/format_macros.h
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- *  Copyright (c) 2014 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_RTC_BASE_FORMAT_MACROS_H_
-#define WEBRTC_RTC_BASE_FORMAT_MACROS_H_
-
-// This file defines the format macros for some integer types and is derived
-// from Chromium's base/format_macros.h.
-
-// To print a 64-bit value in a portable way:
-//   int64_t value;
-//   printf("xyz:%" PRId64, value);
-// The "d" in the macro corresponds to %d; you can also use PRIu64 etc.
-//
-// To print a size_t value in a portable way:
-//   size_t size;
-//   printf("xyz: %" PRIuS, size);
-// The "u" in the macro corresponds to %u, and S is for "size".
-
-#include "webrtc/typedefs.h"
-
-#if defined(WEBRTC_POSIX)
-
-#if (defined(_INTTYPES_H) || defined(_INTTYPES_H_)) && !defined(PRId64)
-#error "inttypes.h has already been included before this header file, but "
-#error "without __STDC_FORMAT_MACROS defined."
-#endif
-
-#if !defined(__STDC_FORMAT_MACROS)
-#define __STDC_FORMAT_MACROS
-#endif
-
-#include <inttypes.h>
-
-#if !defined(PRIuS)
-#define PRIuS "zu"
-#endif
-
-// The size of NSInteger and NSUInteger varies between 32-bit and 64-bit
-// architectures and Apple does not provides standard format macros and
-// recommends casting. This has many drawbacks, so instead define macros
-// for formatting those types.
-#if defined(WEBRTC_MAC)
-#if defined(WEBRTC_ARCH_64_BITS)
-#if !defined(PRIdNS)
-#define PRIdNS "ld"
-#endif
-#if !defined(PRIuNS)
-#define PRIuNS "lu"
-#endif
-#if !defined(PRIxNS)
-#define PRIxNS "lx"
-#endif
-#else  // defined(WEBRTC_ARCH_64_BITS)
-#if !defined(PRIdNS)
-#define PRIdNS "d"
-#endif
-#if !defined(PRIuNS)
-#define PRIuNS "u"
-#endif
-#if !defined(PRIxNS)
-#define PRIxNS "x"
-#endif
-#endif
-#endif  // defined(WEBRTC_MAC)
-
-#else  // WEBRTC_WIN
-
-#include <inttypes.h>
-
-#if !defined(PRId64)
-#define PRId64 "I64d"
-#endif
-
-#if !defined(PRIu64)
-#define PRIu64 "I64u"
-#endif
-
-#if !defined(PRIx64)
-#define PRIx64 "I64x"
-#endif
-
-#if !defined(PRIuS)
-#define PRIuS "Iu"
-#endif
-
-#endif
-
-#endif  // WEBRTC_RTC_BASE_FORMAT_MACROS_H_
diff --git a/rtc_base/function_view.h b/rtc_base/function_view.h
deleted file mode 100644
index a187d55..0000000
--- a/rtc_base/function_view.h
+++ /dev/null
@@ -1,130 +0,0 @@
-/*
- *  Copyright 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_RTC_BASE_FUNCTION_VIEW_H_
-#define WEBRTC_RTC_BASE_FUNCTION_VIEW_H_
-
-#include <type_traits>
-#include <utility>
-
-#include "webrtc/rtc_base/checks.h"
-
-// Just like std::function, FunctionView will wrap any callable and hide its
-// actual type, exposing only its signature. But unlike std::function,
-// FunctionView doesn't own its callable---it just points to it. Thus, it's a
-// good choice mainly as a function argument when the callable argument will
-// not be called again once the function has returned.
-//
-// Its constructors are implicit, so that callers won't have to convert lambdas
-// and other callables to FunctionView<Blah(Blah, Blah)> explicitly. This is
-// safe because FunctionView is only a reference to the real callable.
-//
-// Example use:
-//
-//   void SomeFunction(rtc::FunctionView<int(int)> index_transform);
-//   ...
-//   SomeFunction([](int i) { return 2 * i + 1; });
-//
-// Note: FunctionView is tiny (essentially just two pointers) and trivially
-// copyable, so it's probably cheaper to pass it by value than by const
-// reference.
-
-namespace rtc {
-
-template <typename T>
-class FunctionView;  // Undefined.
-
-template <typename RetT, typename... ArgT>
-class FunctionView<RetT(ArgT...)> final {
- public:
-  // Constructor for lambdas and other callables; it accepts every type of
-  // argument except those noted in its enable_if call.
-  template <
-      typename F,
-      typename std::enable_if<
-          // Not for function pointers; we have another constructor for that
-          // below.
-          !std::is_function<typename std::remove_pointer<
-              typename std::remove_reference<F>::type>::type>::value &&
-
-          // Not for nullptr; we have another constructor for that below.
-          !std::is_same<std::nullptr_t,
-                        typename std::remove_cv<F>::type>::value &&
-
-          // Not for FunctionView objects; we have another constructor for that
-          // (the implicitly declared copy constructor).
-          !std::is_same<FunctionView,
-                        typename std::remove_cv<typename std::remove_reference<
-                            F>::type>::type>::value>::type* = nullptr>
-  FunctionView(F&& f)
-      : call_(CallVoidPtr<typename std::remove_reference<F>::type>) {
-    f_.void_ptr = &f;
-  }
-
-  // Constructor that accepts function pointers. If the argument is null, the
-  // result is an empty FunctionView.
-  template <
-      typename F,
-      typename std::enable_if<std::is_function<typename std::remove_pointer<
-          typename std::remove_reference<F>::type>::type>::value>::type* =
-          nullptr>
-  FunctionView(F&& f)
-      : call_(f ? CallFunPtr<typename std::remove_pointer<F>::type> : nullptr) {
-    f_.fun_ptr = reinterpret_cast<void (*)()>(f);
-  }
-
-  // Constructor that accepts nullptr. It creates an empty FunctionView.
-  template <typename F,
-            typename std::enable_if<std::is_same<
-                std::nullptr_t,
-                typename std::remove_cv<F>::type>::value>::type* = nullptr>
-  FunctionView(F&& f) : call_(nullptr) {}
-
-  // Default constructor. Creates an empty FunctionView.
-  FunctionView() : call_(nullptr) {}
-
-  RetT operator()(ArgT... args) const {
-    RTC_DCHECK(call_);
-    return call_(f_, std::forward<ArgT>(args)...);
-  }
-
-  // Returns true if we have a function, false if we don't (i.e., we're null).
-  explicit operator bool() const { return !!call_; }
-
- private:
-  union VoidUnion {
-    void* void_ptr;
-    void (*fun_ptr)();
-  };
-
-  template <typename F>
-  static RetT CallVoidPtr(VoidUnion vu, ArgT... args) {
-    return (*static_cast<F*>(vu.void_ptr))(std::forward<ArgT>(args)...);
-  }
-  template <typename F>
-  static RetT CallFunPtr(VoidUnion vu, ArgT... args) {
-    return (reinterpret_cast<typename std::add_pointer<F>::type>(vu.fun_ptr))(
-        std::forward<ArgT>(args)...);
-  }
-
-  // A pointer to the callable thing, with type information erased. It's a
-  // union because we have to use separate types depending on if the callable
-  // thing is a function pointer or something else.
-  VoidUnion f_;
-
-  // Pointer to a dispatch function that knows the type of the callable thing
-  // that's stored in f_, and how to call it. A FunctionView object is empty
-  // (null) iff call_ is null.
-  RetT (*call_)(VoidUnion, ArgT...);
-};
-
-}  // namespace rtc
-
-#endif  // WEBRTC_RTC_BASE_FUNCTION_VIEW_H_
diff --git a/rtc_base/function_view_unittest.cc b/rtc_base/function_view_unittest.cc
deleted file mode 100644
index 00a8714..0000000
--- a/rtc_base/function_view_unittest.cc
+++ /dev/null
@@ -1,175 +0,0 @@
-/*
- *  Copyright 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 <memory>
-#include <utility>
-
-#include "webrtc/rtc_base/function_view.h"
-#include "webrtc/rtc_base/gunit.h"
-
-namespace rtc {
-
-namespace {
-
-int CallWith33(rtc::FunctionView<int(int)> fv) {
-  return fv ? fv(33) : -1;
-}
-
-int Add33(int x) {
-  return x + 33;
-}
-
-}  // namespace
-
-// Test the main use case of FunctionView: implicitly converting a callable
-// argument.
-TEST(FunctionViewTest, ImplicitConversion) {
-  EXPECT_EQ(38, CallWith33([](int x) { return x + 5; }));
-  EXPECT_EQ(66, CallWith33(Add33));
-  EXPECT_EQ(-1, CallWith33(nullptr));
-}
-
-TEST(FunctionViewTest, IntIntLambdaWithoutState) {
-  auto f = [](int x) { return x + 1; };
-  EXPECT_EQ(18, f(17));
-  rtc::FunctionView<int(int)> fv(f);
-  EXPECT_TRUE(fv);
-  EXPECT_EQ(18, fv(17));
-}
-
-TEST(FunctionViewTest, IntVoidLambdaWithState) {
-  int x = 13;
-  auto f = [x]() mutable { return ++x; };
-  rtc::FunctionView<int()> fv(f);
-  EXPECT_TRUE(fv);
-  EXPECT_EQ(14, f());
-  EXPECT_EQ(15, fv());
-  EXPECT_EQ(16, f());
-  EXPECT_EQ(17, fv());
-}
-
-TEST(FunctionViewTest, IntIntFunction) {
-  rtc::FunctionView<int(int)> fv(Add33);
-  EXPECT_TRUE(fv);
-  EXPECT_EQ(50, fv(17));
-}
-
-TEST(FunctionViewTest, IntIntFunctionPointer) {
-  rtc::FunctionView<int(int)> fv(&Add33);
-  EXPECT_TRUE(fv);
-  EXPECT_EQ(50, fv(17));
-}
-
-TEST(FunctionViewTest, Null) {
-  // These two call constructors that statically construct null FunctionViews.
-  EXPECT_FALSE(rtc::FunctionView<int()>());
-  EXPECT_FALSE(rtc::FunctionView<int()>(nullptr));
-
-  // This calls the constructor for function pointers.
-  EXPECT_FALSE(rtc::FunctionView<int()>(reinterpret_cast<int(*)()>(0)));
-}
-
-// Ensure that FunctionView handles move-only arguments and return values.
-TEST(FunctionViewTest, UniquePtrPassthrough) {
-  auto f = [](std::unique_ptr<int> x) { return x; };
-  rtc::FunctionView<std::unique_ptr<int>(std::unique_ptr<int>)> fv(f);
-  std::unique_ptr<int> x(new int);
-  int* x_addr = x.get();
-  auto y = fv(std::move(x));
-  EXPECT_EQ(x_addr, y.get());
-}
-
-TEST(FunctionViewTest, CopyConstructor) {
-  auto f17 = [] { return 17; };
-  rtc::FunctionView<int()> fv1(f17);
-  rtc::FunctionView<int()> fv2(fv1);
-  EXPECT_EQ(17, fv1());
-  EXPECT_EQ(17, fv2());
-}
-
-TEST(FunctionViewTest, MoveConstructorIsCopy) {
-  auto f17 = [] { return 17; };
-  rtc::FunctionView<int()> fv1(f17);
-  rtc::FunctionView<int()> fv2(std::move(fv1));
-  EXPECT_EQ(17, fv1());
-  EXPECT_EQ(17, fv2());
-}
-
-TEST(FunctionViewTest, CopyAssignment) {
-  auto f17 = [] { return 17; };
-  rtc::FunctionView<int()> fv1(f17);
-  auto f23 = [] { return 23; };
-  rtc::FunctionView<int()> fv2(f23);
-  EXPECT_EQ(17, fv1());
-  EXPECT_EQ(23, fv2());
-  fv2 = fv1;
-  EXPECT_EQ(17, fv1());
-  EXPECT_EQ(17, fv2());
-}
-
-TEST(FunctionViewTest, MoveAssignmentIsCopy) {
-  auto f17 = [] { return 17; };
-  rtc::FunctionView<int()> fv1(f17);
-  auto f23 = [] { return 23; };
-  rtc::FunctionView<int()> fv2(f23);
-  EXPECT_EQ(17, fv1());
-  EXPECT_EQ(23, fv2());
-  fv2 = std::move(fv1);
-  EXPECT_EQ(17, fv1());
-  EXPECT_EQ(17, fv2());
-}
-
-TEST(FunctionViewTest, Swap) {
-  auto f17 = [] { return 17; };
-  rtc::FunctionView<int()> fv1(f17);
-  auto f23 = [] { return 23; };
-  rtc::FunctionView<int()> fv2(f23);
-  EXPECT_EQ(17, fv1());
-  EXPECT_EQ(23, fv2());
-  using std::swap;
-  swap(fv1, fv2);
-  EXPECT_EQ(23, fv1());
-  EXPECT_EQ(17, fv2());
-}
-
-// Ensure that when you copy-construct a FunctionView, the new object points to
-// the same function as the old one (as opposed to the new object pointing to
-// the old one).
-TEST(FunctionViewTest, CopyConstructorChaining) {
-  auto f17 = [] { return 17; };
-  rtc::FunctionView<int()> fv1(f17);
-  rtc::FunctionView<int()> fv2(fv1);
-  EXPECT_EQ(17, fv1());
-  EXPECT_EQ(17, fv2());
-  auto f23 = [] { return 23; };
-  fv1 = f23;
-  EXPECT_EQ(23, fv1());
-  EXPECT_EQ(17, fv2());
-}
-
-// Ensure that when you assign one FunctionView to another, we actually make a
-// copy (as opposed to making the second FunctionView point to the first one).
-TEST(FunctionViewTest, CopyAssignmentChaining) {
-  auto f17 = [] { return 17; };
-  rtc::FunctionView<int()> fv1(f17);
-  rtc::FunctionView<int()> fv2;
-  EXPECT_TRUE(fv1);
-  EXPECT_EQ(17, fv1());
-  EXPECT_FALSE(fv2);
-  fv2 = fv1;
-  EXPECT_EQ(17, fv1());
-  EXPECT_EQ(17, fv2());
-  auto f23 = [] { return 23; };
-  fv1 = f23;
-  EXPECT_EQ(23, fv1());
-  EXPECT_EQ(17, fv2());
-}
-
-}  // namespace rtc
diff --git a/rtc_base/gtest_prod_util.h b/rtc_base/gtest_prod_util.h
deleted file mode 100644
index 4837604..0000000
--- a/rtc_base/gtest_prod_util.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- *  Copyright (c) 2012 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_RTC_BASE_GTEST_PROD_UTIL_H_
-#define WEBRTC_RTC_BASE_GTEST_PROD_UTIL_H_
-
-// Define our own version of FRIEND_TEST here rather than including
-// gtest_prod.h to avoid depending on any part of GTest in production code.
-#define FRIEND_TEST_WEBRTC(test_case_name, test_name)\
-friend class test_case_name##_##test_name##_Test
-
-// This file is a plain copy of Chromium's base/gtest_prod_util.h.
-//
-// This is a wrapper for gtest's FRIEND_TEST macro that friends
-// test with all possible prefixes. This is very helpful when changing the test
-// prefix, because the friend declarations don't need to be updated.
-//
-// Example usage:
-//
-// class MyClass {
-//  private:
-//   void MyMethod();
-//   FRIEND_TEST_ALL_PREFIXES(MyClassTest, MyMethod);
-// };
-#define FRIEND_TEST_ALL_PREFIXES(test_case_name, test_name) \
-  FRIEND_TEST_WEBRTC(test_case_name, test_name); \
-  FRIEND_TEST_WEBRTC(test_case_name, DISABLED_##test_name); \
-  FRIEND_TEST_WEBRTC(test_case_name, FLAKY_##test_name); \
-  FRIEND_TEST_WEBRTC(test_case_name, FAILS_##test_name)
-
-#endif  // WEBRTC_RTC_BASE_GTEST_PROD_UTIL_H_
diff --git a/rtc_base/gunit.h b/rtc_base/gunit.h
deleted file mode 100644
index 6f4e419..0000000
--- a/rtc_base/gunit.h
+++ /dev/null
@@ -1,160 +0,0 @@
-/*
- *  Copyright 2004 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_RTC_BASE_GUNIT_H_
-#define WEBRTC_RTC_BASE_GUNIT_H_
-
-#include "webrtc/rtc_base/fakeclock.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/thread.h"
-#if defined(GTEST_RELATIVE_PATH)
-#include "webrtc/test/gtest.h"
-#else
-#include "testing/base/public/gunit.h"
-#endif
-
-// Wait until "ex" is true, or "timeout" expires.
-#define WAIT(ex, timeout)                                       \
-  for (int64_t start = rtc::SystemTimeMillis();                 \
-       !(ex) && rtc::SystemTimeMillis() < start + (timeout);) { \
-    rtc::Thread::Current()->ProcessMessages(0);                 \
-    rtc::Thread::Current()->SleepMs(1);                         \
-  }
-
-// This returns the result of the test in res, so that we don't re-evaluate
-// the expression in the XXXX_WAIT macros below, since that causes problems
-// when the expression is only true the first time you check it.
-#define WAIT_(ex, timeout, res)                                   \
-  do {                                                            \
-    int64_t start = rtc::SystemTimeMillis();                      \
-    res = (ex);                                                   \
-    while (!res && rtc::SystemTimeMillis() < start + (timeout)) { \
-      rtc::Thread::Current()->ProcessMessages(0);                 \
-      rtc::Thread::Current()->SleepMs(1);                         \
-      res = (ex);                                                 \
-    }                                                             \
-  } while (0)
-
-// The typical EXPECT_XXXX and ASSERT_XXXXs, but done until true or a timeout.
-// One can add failure message by appending "<< msg".
-#define EXPECT_TRUE_WAIT(ex, timeout)                   \
-  GTEST_AMBIGUOUS_ELSE_BLOCKER_                         \
-  if (bool res = true) {                                \
-    WAIT_(ex, timeout, res);                            \
-    if (!res)                                           \
-      goto GTEST_CONCAT_TOKEN_(gunit_label_, __LINE__); \
-  } else                                                \
-    GTEST_CONCAT_TOKEN_(gunit_label_, __LINE__) : EXPECT_TRUE(ex)
-
-#define EXPECT_EQ_WAIT(v1, v2, timeout)                 \
-  GTEST_AMBIGUOUS_ELSE_BLOCKER_                         \
-  if (bool res = true) {                                \
-    WAIT_(v1 == v2, timeout, res);                      \
-    if (!res)                                           \
-      goto GTEST_CONCAT_TOKEN_(gunit_label_, __LINE__); \
-  } else                                                \
-    GTEST_CONCAT_TOKEN_(gunit_label_, __LINE__) : EXPECT_EQ(v1, v2)
-
-#define ASSERT_TRUE_WAIT(ex, timeout)                   \
-  GTEST_AMBIGUOUS_ELSE_BLOCKER_                         \
-  if (bool res = true) {                                \
-    WAIT_(ex, timeout, res);                            \
-    if (!res)                                           \
-      goto GTEST_CONCAT_TOKEN_(gunit_label_, __LINE__); \
-  } else                                                \
-    GTEST_CONCAT_TOKEN_(gunit_label_, __LINE__) : ASSERT_TRUE(ex)
-
-#define ASSERT_EQ_WAIT(v1, v2, timeout)                 \
-  GTEST_AMBIGUOUS_ELSE_BLOCKER_                         \
-  if (bool res = true) {                                \
-    WAIT_(v1 == v2, timeout, res);                      \
-    if (!res)                                           \
-      goto GTEST_CONCAT_TOKEN_(gunit_label_, __LINE__); \
-  } else                                                \
-    GTEST_CONCAT_TOKEN_(gunit_label_, __LINE__) : ASSERT_EQ(v1, v2)
-
-// Version with a "soft" timeout and a margin. This logs if the timeout is
-// exceeded, but it only fails if the expression still isn't true after the
-// margin time passes.
-#define EXPECT_TRUE_WAIT_MARGIN(ex, timeout, margin)                       \
-  GTEST_AMBIGUOUS_ELSE_BLOCKER_                                            \
-  if (bool res = true) {                                                   \
-    WAIT_(ex, timeout, res);                                               \
-    if (res)                                                               \
-      break;                                                               \
-    LOG(LS_WARNING) << "Expression " << #ex << " still not true after "    \
-                    << (timeout) << "ms; waiting an additional " << margin \
-                    << "ms";                                               \
-    WAIT_(ex, margin, res);                                                \
-    if (!res)                                                              \
-      goto GTEST_CONCAT_TOKEN_(gunit_label_, __LINE__);                    \
-  } else                                                                   \
-    GTEST_CONCAT_TOKEN_(gunit_label_, __LINE__) : EXPECT_TRUE(ex)
-
-// Wait until "ex" is true, or "timeout" expires, using fake clock where
-// messages are processed every millisecond.
-// TODO(pthatcher): Allow tests to control how many milliseconds to advance.
-#define SIMULATED_WAIT(ex, timeout, clock)                    \
-  for (int64_t start = rtc::TimeMillis();                     \
-       !(ex) && rtc::TimeMillis() < start + (timeout);) {     \
-    (clock).AdvanceTime(rtc::TimeDelta::FromMilliseconds(1)); \
-  }
-
-// This returns the result of the test in res, so that we don't re-evaluate
-// the expression in the XXXX_WAIT macros below, since that causes problems
-// when the expression is only true the first time you check it.
-#define SIMULATED_WAIT_(ex, timeout, res, clock)                \
-  do {                                                          \
-    int64_t start = rtc::TimeMillis();                          \
-    res = (ex);                                                 \
-    while (!res && rtc::TimeMillis() < start + (timeout)) {     \
-      (clock).AdvanceTime(rtc::TimeDelta::FromMilliseconds(1)); \
-      res = (ex);                                               \
-    }                                                           \
-  } while (0)
-
-// The typical EXPECT_XXXX, but done until true or a timeout with a fake clock.
-#define EXPECT_TRUE_SIMULATED_WAIT(ex, timeout, clock) \
-  do {                                                 \
-    bool res;                                          \
-    SIMULATED_WAIT_(ex, timeout, res, clock);          \
-    if (!res) {                                        \
-      EXPECT_TRUE(ex);                                 \
-    }                                                  \
-  } while (0)
-
-#define EXPECT_EQ_SIMULATED_WAIT(v1, v2, timeout, clock) \
-  GTEST_AMBIGUOUS_ELSE_BLOCKER_                          \
-  if (bool res = true) {                                 \
-    SIMULATED_WAIT_(v1 == v2, timeout, res, clock);      \
-    if (!res)                                            \
-      goto GTEST_CONCAT_TOKEN_(gunit_label_, __LINE__);  \
-  } else                                                 \
-    GTEST_CONCAT_TOKEN_(gunit_label_, __LINE__) : EXPECT_EQ(v1, v2)
-
-#define ASSERT_TRUE_SIMULATED_WAIT(ex, timeout, clock)  \
-  GTEST_AMBIGUOUS_ELSE_BLOCKER_                         \
-  if (bool res = true) {                                \
-    SIMULATED_WAIT_(ex, timeout, res, clock);           \
-    if (!res)                                           \
-      goto GTEST_CONCAT_TOKEN_(gunit_label_, __LINE__); \
-  } else                                                \
-    GTEST_CONCAT_TOKEN_(gunit_label_, __LINE__) : ASSERT_TRUE(ex)
-
-#define ASSERT_EQ_SIMULATED_WAIT(v1, v2, timeout, clock) \
-  GTEST_AMBIGUOUS_ELSE_BLOCKER_                          \
-  if (bool res = true) {                                 \
-    SIMULATED_WAIT_(v1 == v2, timeout, res, clock);      \
-    if (!res)                                            \
-      goto GTEST_CONCAT_TOKEN_(gunit_label_, __LINE__);  \
-  } else                                                 \
-    GTEST_CONCAT_TOKEN_(gunit_label_, __LINE__) : ASSERT_EQ(v1, v2)
-
-#endif  // WEBRTC_RTC_BASE_GUNIT_H_
diff --git a/rtc_base/gunit_prod.h b/rtc_base/gunit_prod.h
deleted file mode 100644
index 789f11b..0000000
--- a/rtc_base/gunit_prod.h
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- *  Copyright 2012 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_RTC_BASE_GUNIT_PROD_H_
-#define WEBRTC_RTC_BASE_GUNIT_PROD_H_
-
-#if defined(WEBRTC_ANDROID)
-// Android doesn't use gtest at all, so anything that relies on gtest should
-// check this define first.
-#define NO_GTEST
-#elif defined (GTEST_RELATIVE_PATH)
-#include "gtest/gtest_prod.h"
-#else
-#include "testing/base/gunit_prod.h"
-#endif
-
-#endif  // WEBRTC_RTC_BASE_GUNIT_PROD_H_
diff --git a/rtc_base/helpers.cc b/rtc_base/helpers.cc
deleted file mode 100644
index f7b1fa8..0000000
--- a/rtc_base/helpers.cc
+++ /dev/null
@@ -1,218 +0,0 @@
-/*
- *  Copyright 2004 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/rtc_base/helpers.h"
-
-#include <limits>
-#include <memory>
-
-#include <openssl/rand.h>
-
-#include "webrtc/rtc_base/base64.h"
-#include "webrtc/rtc_base/basictypes.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/timeutils.h"
-
-// Protect against max macro inclusion.
-#undef max
-
-namespace rtc {
-
-// Base class for RNG implementations.
-class RandomGenerator {
- public:
-  virtual ~RandomGenerator() {}
-  virtual bool Init(const void* seed, size_t len) = 0;
-  virtual bool Generate(void* buf, size_t len) = 0;
-};
-
-// The OpenSSL RNG.
-class SecureRandomGenerator : public RandomGenerator {
- public:
-  SecureRandomGenerator() {}
-  ~SecureRandomGenerator() override {}
-  bool Init(const void* seed, size_t len) override { return true; }
-  bool Generate(void* buf, size_t len) override {
-    return (RAND_bytes(reinterpret_cast<unsigned char*>(buf), len) > 0);
-  }
-};
-
-// A test random generator, for predictable output.
-class TestRandomGenerator : public RandomGenerator {
- public:
-  TestRandomGenerator() : seed_(7) {
-  }
-  ~TestRandomGenerator() override {
-  }
-  bool Init(const void* seed, size_t len) override { return true; }
-  bool Generate(void* buf, size_t len) override {
-    for (size_t i = 0; i < len; ++i) {
-      static_cast<uint8_t*>(buf)[i] = static_cast<uint8_t>(GetRandom());
-    }
-    return true;
-  }
-
- private:
-  int GetRandom() {
-    return ((seed_ = seed_ * 214013L + 2531011L) >> 16) & 0x7fff;
-  }
-  int seed_;
-};
-
-namespace {
-
-// TODO: Use Base64::Base64Table instead.
-static const char kBase64[64] = {
-    'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
-    'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
-    'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
-    'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
-    '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/'};
-
-static const char kHex[16] = {'0', '1', '2', '3', '4', '5', '6', '7',
-                              '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
-
-static const char kUuidDigit17[4] = {'8', '9', 'a', 'b'};
-
-// This round about way of creating a global RNG is to safe-guard against
-// indeterminant static initialization order.
-std::unique_ptr<RandomGenerator>& GetGlobalRng() {
-  RTC_DEFINE_STATIC_LOCAL(std::unique_ptr<RandomGenerator>, global_rng,
-                          (new SecureRandomGenerator()));
-  return global_rng;
-}
-
-RandomGenerator& Rng() {
-  return *GetGlobalRng();
-}
-
-}  // namespace
-
-void SetRandomTestMode(bool test) {
-  if (!test) {
-    GetGlobalRng().reset(new SecureRandomGenerator());
-  } else {
-    GetGlobalRng().reset(new TestRandomGenerator());
-  }
-}
-
-bool InitRandom(int seed) {
-  return InitRandom(reinterpret_cast<const char*>(&seed), sizeof(seed));
-}
-
-bool InitRandom(const char* seed, size_t len) {
-  if (!Rng().Init(seed, len)) {
-    LOG(LS_ERROR) << "Failed to init random generator!";
-    return false;
-  }
-  return true;
-}
-
-std::string CreateRandomString(size_t len) {
-  std::string str;
-  RTC_CHECK(CreateRandomString(len, &str));
-  return str;
-}
-
-static bool CreateRandomString(size_t len,
-                        const char* table, int table_size,
-                        std::string* str) {
-  str->clear();
-  // Avoid biased modulo division below.
-  if (256 % table_size) {
-    LOG(LS_ERROR) << "Table size must divide 256 evenly!";
-    return false;
-  }
-  std::unique_ptr<uint8_t[]> bytes(new uint8_t[len]);
-  if (!Rng().Generate(bytes.get(), len)) {
-    LOG(LS_ERROR) << "Failed to generate random string!";
-    return false;
-  }
-  str->reserve(len);
-  for (size_t i = 0; i < len; ++i) {
-    str->push_back(table[bytes[i] % table_size]);
-  }
-  return true;
-}
-
-bool CreateRandomString(size_t len, std::string* str) {
-  return CreateRandomString(len, kBase64, 64, str);
-}
-
-bool CreateRandomString(size_t len, const std::string& table,
-                        std::string* str) {
-  return CreateRandomString(len, table.c_str(),
-                            static_cast<int>(table.size()), str);
-}
-
-bool CreateRandomData(size_t length, std::string* data) {
-  data->resize(length);
-  // std::string is guaranteed to use contiguous memory in c++11 so we can
-  // safely write directly to it.
-  return Rng().Generate(&data->at(0), length);
-}
-
-// Version 4 UUID is of the form:
-// xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx
-// Where 'x' is a hex digit, and 'y' is 8, 9, a or b.
-std::string CreateRandomUuid() {
-  std::string str;
-  std::unique_ptr<uint8_t[]> bytes(new uint8_t[31]);
-  RTC_CHECK(Rng().Generate(bytes.get(), 31));
-  str.reserve(36);
-  for (size_t i = 0; i < 8; ++i) {
-    str.push_back(kHex[bytes[i] % 16]);
-  }
-  str.push_back('-');
-  for (size_t i = 8; i < 12; ++i) {
-    str.push_back(kHex[bytes[i] % 16]);
-  }
-  str.push_back('-');
-  str.push_back('4');
-  for (size_t i = 12; i < 15; ++i) {
-    str.push_back(kHex[bytes[i] % 16]);
-  }
-  str.push_back('-');
-  str.push_back(kUuidDigit17[bytes[15] % 4]);
-  for (size_t i = 16; i < 19; ++i) {
-    str.push_back(kHex[bytes[i] % 16]);
-  }
-  str.push_back('-');
-  for (size_t i = 19; i < 31; ++i) {
-    str.push_back(kHex[bytes[i] % 16]);
-  }
-  return str;
-}
-
-uint32_t CreateRandomId() {
-  uint32_t id;
-  RTC_CHECK(Rng().Generate(&id, sizeof(id)));
-  return id;
-}
-
-uint64_t CreateRandomId64() {
-  return static_cast<uint64_t>(CreateRandomId()) << 32 | CreateRandomId();
-}
-
-uint32_t CreateRandomNonZeroId() {
-  uint32_t id;
-  do {
-    id = CreateRandomId();
-  } while (id == 0);
-  return id;
-}
-
-double CreateRandomDouble() {
-  return CreateRandomId() / (std::numeric_limits<uint32_t>::max() +
-                             std::numeric_limits<double>::epsilon());
-}
-
-}  // namespace rtc
diff --git a/rtc_base/helpers.h b/rtc_base/helpers.h
deleted file mode 100644
index fac2653..0000000
--- a/rtc_base/helpers.h
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- *  Copyright 2004 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_RTC_BASE_HELPERS_H_
-#define WEBRTC_RTC_BASE_HELPERS_H_
-
-#include <string>
-#include "webrtc/rtc_base/basictypes.h"
-
-namespace rtc {
-
-// For testing, we can return predictable data.
-void SetRandomTestMode(bool test);
-
-// Initializes the RNG, and seeds it with the specified entropy.
-bool InitRandom(int seed);
-bool InitRandom(const char* seed, size_t len);
-
-// Generates a (cryptographically) random string of the given length.
-// We generate base64 values so that they will be printable.
-std::string CreateRandomString(size_t length);
-
-// Generates a (cryptographically) random string of the given length.
-// We generate base64 values so that they will be printable.
-// Return false if the random number generator failed.
-bool CreateRandomString(size_t length, std::string* str);
-
-// Generates a (cryptographically) random string of the given length,
-// with characters from the given table. Return false if the random
-// number generator failed.
-// For ease of implementation, the function requires that the table
-// size evenly divide 256; otherwise, it returns false.
-bool CreateRandomString(size_t length, const std::string& table,
-                        std::string* str);
-
-// Generates (cryptographically) random data of the given length.
-// Return false if the random number generator failed.
-bool CreateRandomData(size_t length, std::string* data);
-
-// Generates a (cryptographically) random UUID version 4 string.
-std::string CreateRandomUuid();
-
-// Generates a random id.
-uint32_t CreateRandomId();
-
-// Generates a 64 bit random id.
-uint64_t CreateRandomId64();
-
-// Generates a random id > 0.
-uint32_t CreateRandomNonZeroId();
-
-// Generates a random double between 0.0 (inclusive) and 1.0 (exclusive).
-double CreateRandomDouble();
-
-}  // namespace rtc
-
-#endif  // WEBRTC_RTC_BASE_HELPERS_H_
diff --git a/rtc_base/helpers_unittest.cc b/rtc_base/helpers_unittest.cc
deleted file mode 100644
index d5c0cea..0000000
--- a/rtc_base/helpers_unittest.cc
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- *  Copyright 2004 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 <string>
-
-#include "webrtc/rtc_base/buffer.h"
-#include "webrtc/rtc_base/gunit.h"
-#include "webrtc/rtc_base/helpers.h"
-#include "webrtc/rtc_base/ssladapter.h"
-
-namespace rtc {
-
-class RandomTest : public testing::Test {};
-
-TEST_F(RandomTest, TestCreateRandomId) {
-  CreateRandomId();
-}
-
-TEST_F(RandomTest, TestCreateRandomDouble) {
-  for (int i = 0; i < 100; ++i) {
-    double r = CreateRandomDouble();
-    EXPECT_GE(r, 0.0);
-    EXPECT_LT(r, 1.0);
-  }
-}
-
-TEST_F(RandomTest, TestCreateNonZeroRandomId) {
-  EXPECT_NE(0U, CreateRandomNonZeroId());
-}
-
-TEST_F(RandomTest, TestCreateRandomString) {
-  std::string random = CreateRandomString(256);
-  EXPECT_EQ(256U, random.size());
-  std::string random2;
-  EXPECT_TRUE(CreateRandomString(256, &random2));
-  EXPECT_NE(random, random2);
-  EXPECT_EQ(256U, random2.size());
-}
-
-TEST_F(RandomTest, TestCreateRandomData) {
-  static size_t kRandomDataLength = 32;
-  std::string random1;
-  std::string random2;
-  EXPECT_TRUE(CreateRandomData(kRandomDataLength, &random1));
-  EXPECT_EQ(kRandomDataLength, random1.size());
-  EXPECT_TRUE(CreateRandomData(kRandomDataLength, &random2));
-  EXPECT_EQ(kRandomDataLength, random2.size());
-  EXPECT_NE(0, memcmp(random1.data(), random2.data(), kRandomDataLength));
-}
-
-TEST_F(RandomTest, TestCreateRandomStringEvenlyDivideTable) {
-  static std::string kUnbiasedTable("01234567");
-  std::string random;
-  EXPECT_TRUE(CreateRandomString(256, kUnbiasedTable, &random));
-  EXPECT_EQ(256U, random.size());
-
-  static std::string kBiasedTable("0123456789");
-  EXPECT_FALSE(CreateRandomString(256, kBiasedTable, &random));
-  EXPECT_EQ(0U, random.size());
-}
-
-TEST_F(RandomTest, TestCreateRandomUuid) {
-  std::string random = CreateRandomUuid();
-  EXPECT_EQ(36U, random.size());
-}
-
-TEST_F(RandomTest, TestCreateRandomForTest) {
-  // Make sure we get the output we expect.
-  SetRandomTestMode(true);
-  EXPECT_EQ(2154761789U, CreateRandomId());
-  EXPECT_EQ("h0ISP4S5SJKH/9EY", CreateRandomString(16));
-  EXPECT_EQ("41706e92-cdd3-46d9-a22d-8ff1737ffb11", CreateRandomUuid());
-  static size_t kRandomDataLength = 32;
-  std::string random;
-  EXPECT_TRUE(CreateRandomData(kRandomDataLength, &random));
-  EXPECT_EQ(kRandomDataLength, random.size());
-  Buffer expected("\xbd\x52\x2a\x4b\x97\x93\x2f\x1c"
-      "\xc4\x72\xab\xa2\x88\x68\x3e\xcc"
-      "\xa3\x8d\xaf\x13\x3b\xbc\x83\xbb"
-      "\x16\xf1\xcf\x56\x0c\xf5\x4a\x8b", kRandomDataLength);
-  EXPECT_EQ(0, memcmp(expected.data(), random.data(), kRandomDataLength));
-
-  // Reset and make sure we get the same output.
-  SetRandomTestMode(true);
-  EXPECT_EQ(2154761789U, CreateRandomId());
-  EXPECT_EQ("h0ISP4S5SJKH/9EY", CreateRandomString(16));
-  EXPECT_EQ("41706e92-cdd3-46d9-a22d-8ff1737ffb11", CreateRandomUuid());
-  EXPECT_TRUE(CreateRandomData(kRandomDataLength, &random));
-  EXPECT_EQ(kRandomDataLength, random.size());
-  EXPECT_EQ(0, memcmp(expected.data(), random.data(), kRandomDataLength));
-
-  // Test different character sets.
-  SetRandomTestMode(true);
-  std::string str;
-  EXPECT_TRUE(CreateRandomString(16, "a", &str));
-  EXPECT_EQ("aaaaaaaaaaaaaaaa", str);
-  EXPECT_TRUE(CreateRandomString(16, "abcd", &str));
-  EXPECT_EQ("dbaaabdaccbcabbd", str);
-
-  // Turn off test mode for other tests.
-  SetRandomTestMode(false);
-}
-
-}  // namespace rtc
diff --git a/rtc_base/httpbase.cc b/rtc_base/httpbase.cc
deleted file mode 100644
index 64cb5d9..0000000
--- a/rtc_base/httpbase.cc
+++ /dev/null
@@ -1,886 +0,0 @@
-/*
- *  Copyright 2004 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 <memory>
-
-#if defined(WEBRTC_WIN)
-#include "webrtc/rtc_base/win32.h"
-#else  // !WEBRTC_WIN
-#define SEC_E_CERT_EXPIRED (-2146893016)
-#endif  // !WEBRTC_WIN
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/httpbase.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/socket.h"
-#include "webrtc/rtc_base/stringutils.h"
-#include "webrtc/rtc_base/thread.h"
-
-namespace rtc {
-
-//////////////////////////////////////////////////////////////////////
-// Helpers
-//////////////////////////////////////////////////////////////////////
-
-bool MatchHeader(const char* str, size_t len, HttpHeader header) {
-  const char* const header_str = ToString(header);
-  const size_t header_len = strlen(header_str);
-  return (len == header_len) && (_strnicmp(str, header_str, header_len) == 0);
-}
-
-enum {
-  MSG_READ
-};
-
-//////////////////////////////////////////////////////////////////////
-// HttpParser
-//////////////////////////////////////////////////////////////////////
-
-HttpParser::HttpParser() {
-  reset();
-}
-
-HttpParser::~HttpParser() {
-}
-
-void
-HttpParser::reset() {
-  state_ = ST_LEADER;
-  chunked_ = false;
-  data_size_ = SIZE_UNKNOWN;
-}
-
-HttpParser::ProcessResult
-HttpParser::Process(const char* buffer, size_t len, size_t* processed,
-                    HttpError* error) {
-  *processed = 0;
-  *error = HE_NONE;
-
-  if (state_ >= ST_COMPLETE) {
-    RTC_NOTREACHED();
-    return PR_COMPLETE;
-  }
-
-  while (true) {
-    if (state_ < ST_DATA) {
-      size_t pos = *processed;
-      while ((pos < len) && (buffer[pos] != '\n')) {
-        pos += 1;
-      }
-      if (pos >= len) {
-        break;  // don't have a full header
-      }
-      const char* line = buffer + *processed;
-      size_t len = (pos - *processed);
-      *processed = pos + 1;
-      while ((len > 0) && isspace(static_cast<unsigned char>(line[len-1]))) {
-        len -= 1;
-      }
-      ProcessResult result = ProcessLine(line, len, error);
-      LOG(LS_VERBOSE) << "Processed line, result=" << result;
-
-      if (PR_CONTINUE != result) {
-        return result;
-      }
-    } else if (data_size_ == 0) {
-      if (chunked_) {
-        state_ = ST_CHUNKTERM;
-      } else {
-        return PR_COMPLETE;
-      }
-    } else {
-      size_t available = len - *processed;
-      if (available <= 0) {
-        break; // no more data
-      }
-      if ((data_size_ != SIZE_UNKNOWN) && (available > data_size_)) {
-        available = data_size_;
-      }
-      size_t read = 0;
-      ProcessResult result = ProcessData(buffer + *processed, available, read,
-                                         error);
-      LOG(LS_VERBOSE) << "Processed data, result: " << result << " read: "
-                      << read << " err: " << error;
-
-      if (PR_CONTINUE != result) {
-        return result;
-      }
-      *processed += read;
-      if (data_size_ != SIZE_UNKNOWN) {
-        data_size_ -= read;
-      }
-    }
-  }
-
-  return PR_CONTINUE;
-}
-
-HttpParser::ProcessResult
-HttpParser::ProcessLine(const char* line, size_t len, HttpError* error) {
-  LOG_F(LS_VERBOSE) << " state: " << state_ << " line: "
-                    << std::string(line, len) << " len: " << len << " err: "
-                    << error;
-
-  switch (state_) {
-  case ST_LEADER:
-    state_ = ST_HEADERS;
-    return ProcessLeader(line, len, error);
-
-  case ST_HEADERS:
-    if (len > 0) {
-      const char* value = strchrn(line, len, ':');
-      if (!value) {
-        *error = HE_PROTOCOL;
-        return PR_COMPLETE;
-      }
-      size_t nlen = (value - line);
-      const char* eol = line + len;
-      do {
-        value += 1;
-      } while ((value < eol) && isspace(static_cast<unsigned char>(*value)));
-      size_t vlen = eol - value;
-      if (MatchHeader(line, nlen, HH_CONTENT_LENGTH)) {
-        // sscanf isn't safe with strings that aren't null-terminated, and there
-        // is no guarantee that |value| is.
-        // Create a local copy that is null-terminated.
-        std::string value_str(value, vlen);
-        unsigned int temp_size;
-        if (sscanf(value_str.c_str(), "%u", &temp_size) != 1) {
-          *error = HE_PROTOCOL;
-          return PR_COMPLETE;
-        }
-        data_size_ = static_cast<size_t>(temp_size);
-      } else if (MatchHeader(line, nlen, HH_TRANSFER_ENCODING)) {
-        if ((vlen == 7) && (_strnicmp(value, "chunked", 7) == 0)) {
-          chunked_ = true;
-        } else if ((vlen == 8) && (_strnicmp(value, "identity", 8) == 0)) {
-          chunked_ = false;
-        } else {
-          *error = HE_PROTOCOL;
-          return PR_COMPLETE;
-        }
-      }
-      return ProcessHeader(line, nlen, value, vlen, error);
-    } else {
-      state_ = chunked_ ? ST_CHUNKSIZE : ST_DATA;
-      return ProcessHeaderComplete(chunked_, data_size_, error);
-    }
-    break;
-
-  case ST_CHUNKSIZE:
-    if (len > 0) {
-      char* ptr = nullptr;
-      data_size_ = strtoul(line, &ptr, 16);
-      if (ptr != line + len) {
-        *error = HE_PROTOCOL;
-        return PR_COMPLETE;
-      }
-      state_ = (data_size_ == 0) ? ST_TRAILERS : ST_DATA;
-    } else {
-      *error = HE_PROTOCOL;
-      return PR_COMPLETE;
-    }
-    break;
-
-  case ST_CHUNKTERM:
-    if (len > 0) {
-      *error = HE_PROTOCOL;
-      return PR_COMPLETE;
-    } else {
-      state_ = chunked_ ? ST_CHUNKSIZE : ST_DATA;
-    }
-    break;
-
-  case ST_TRAILERS:
-    if (len == 0) {
-      return PR_COMPLETE;
-    }
-    // *error = onHttpRecvTrailer();
-    break;
-
-  default:
-    RTC_NOTREACHED();
-    break;
-  }
-
-  return PR_CONTINUE;
-}
-
-bool
-HttpParser::is_valid_end_of_input() const {
-  return (state_ == ST_DATA) && (data_size_ == SIZE_UNKNOWN);
-}
-
-void
-HttpParser::complete(HttpError error) {
-  if (state_ < ST_COMPLETE) {
-    state_ = ST_COMPLETE;
-    OnComplete(error);
-  }
-}
-
-//////////////////////////////////////////////////////////////////////
-// HttpBase::DocumentStream
-//////////////////////////////////////////////////////////////////////
-
-class BlockingMemoryStream : public ExternalMemoryStream {
-public:
-  BlockingMemoryStream(char* buffer, size_t size)
-  : ExternalMemoryStream(buffer, size) { }
-
-  StreamResult DoReserve(size_t size, int* error) override {
-    return (buffer_length_ >= size) ? SR_SUCCESS : SR_BLOCK;
-  }
-};
-
-class HttpBase::DocumentStream : public StreamInterface {
-public:
-  DocumentStream(HttpBase* base) : base_(base), error_(HE_DEFAULT) { }
-
-  StreamState GetState() const override {
-    if (nullptr == base_)
-      return SS_CLOSED;
-    if (HM_RECV == base_->mode_)
-      return SS_OPEN;
-    return SS_OPENING;
-  }
-
-  StreamResult Read(void* buffer,
-                    size_t buffer_len,
-                    size_t* read,
-                    int* error) override {
-    if (!base_) {
-      if (error) *error = error_;
-      return (HE_NONE == error_) ? SR_EOS : SR_ERROR;
-    }
-
-    if (HM_RECV != base_->mode_) {
-      return SR_BLOCK;
-    }
-
-    // DoReceiveLoop writes http document data to the StreamInterface* document
-    // member of HttpData.  In this case, we want this data to be written
-    // directly to our buffer.  To accomplish this, we wrap our buffer with a
-    // StreamInterface, and replace the existing document with our wrapper.
-    // When the method returns, we restore the old document.  Ideally, we would
-    // pass our StreamInterface* to DoReceiveLoop, but due to the callbacks
-    // of HttpParser, we would still need to store the pointer temporarily.
-    std::unique_ptr<StreamInterface> stream(
-        new BlockingMemoryStream(reinterpret_cast<char*>(buffer), buffer_len));
-
-    // Replace the existing document with our wrapped buffer.
-    base_->data_->document.swap(stream);
-
-    // Pump the I/O loop.  DoReceiveLoop is guaranteed not to attempt to
-    // complete the I/O process, which means that our wrapper is not in danger
-    // of being deleted.  To ensure this, DoReceiveLoop returns true when it
-    // wants complete to be called.  We make sure to uninstall our wrapper
-    // before calling complete().
-    HttpError http_error;
-    bool complete = base_->DoReceiveLoop(&http_error);
-
-    // Reinstall the original output document.
-    base_->data_->document.swap(stream);
-
-    // If we reach the end of the receive stream, we disconnect our stream
-    // adapter from the HttpBase, and further calls to read will either return
-    // EOS or ERROR, appropriately.  Finally, we call complete().
-    StreamResult result = SR_BLOCK;
-    if (complete) {
-      HttpBase* base = Disconnect(http_error);
-      if (error) *error = error_;
-      result = (HE_NONE == error_) ? SR_EOS : SR_ERROR;
-      base->complete(http_error);
-    }
-
-    // Even if we are complete, if some data was read we must return SUCCESS.
-    // Future Reads will return EOS or ERROR based on the error_ variable.
-    size_t position;
-    stream->GetPosition(&position);
-    if (position > 0) {
-      if (read) *read = position;
-      result = SR_SUCCESS;
-    }
-    return result;
-  }
-
-  StreamResult Write(const void* data,
-                     size_t data_len,
-                     size_t* written,
-                     int* error) override {
-    if (error) *error = -1;
-    return SR_ERROR;
-  }
-
-  void Close() override {
-    if (base_) {
-      HttpBase* base = Disconnect(HE_NONE);
-      if (HM_RECV == base->mode_ && base->http_stream_) {
-        // Read I/O could have been stalled on the user of this DocumentStream,
-        // so restart the I/O process now that we've removed ourselves.
-        base->http_stream_->PostEvent(SE_READ, 0);
-      }
-    }
-  }
-
-  bool GetAvailable(size_t* size) const override {
-    if (!base_ || HM_RECV != base_->mode_)
-      return false;
-    size_t data_size = base_->GetDataRemaining();
-    if (SIZE_UNKNOWN == data_size)
-      return false;
-    if (size)
-      *size = data_size;
-    return true;
-  }
-
-  HttpBase* Disconnect(HttpError error) {
-    RTC_DCHECK(nullptr != base_);
-    RTC_DCHECK(nullptr != base_->doc_stream_);
-    HttpBase* base = base_;
-    base_->doc_stream_ = nullptr;
-    base_ = nullptr;
-    error_ = error;
-    return base;
-  }
-
-private:
-  HttpBase* base_;
-  HttpError error_;
-};
-
-//////////////////////////////////////////////////////////////////////
-// HttpBase
-//////////////////////////////////////////////////////////////////////
-
-HttpBase::HttpBase()
-    : mode_(HM_NONE),
-      data_(nullptr),
-      notify_(nullptr),
-      http_stream_(nullptr),
-      doc_stream_(nullptr) {}
-
-HttpBase::~HttpBase() {
-  RTC_DCHECK(HM_NONE == mode_);
-}
-
-bool
-HttpBase::isConnected() const {
-  return (http_stream_ != nullptr) && (http_stream_->GetState() == SS_OPEN);
-}
-
-bool
-HttpBase::attach(StreamInterface* stream) {
-  if ((mode_ != HM_NONE) || (http_stream_ != nullptr) || (stream == nullptr)) {
-    RTC_NOTREACHED();
-    return false;
-  }
-  http_stream_ = stream;
-  http_stream_->SignalEvent.connect(this, &HttpBase::OnHttpStreamEvent);
-  mode_ = (http_stream_->GetState() == SS_OPENING) ? HM_CONNECT : HM_NONE;
-  return true;
-}
-
-StreamInterface*
-HttpBase::detach() {
-  RTC_DCHECK(HM_NONE == mode_);
-  if (mode_ != HM_NONE) {
-    return nullptr;
-  }
-  StreamInterface* stream = http_stream_;
-  http_stream_ = nullptr;
-  if (stream) {
-    stream->SignalEvent.disconnect(this);
-  }
-  return stream;
-}
-
-void
-HttpBase::send(HttpData* data) {
-  RTC_DCHECK(HM_NONE == mode_);
-  if (mode_ != HM_NONE) {
-    return;
-  } else if (!isConnected()) {
-    OnHttpStreamEvent(http_stream_, SE_CLOSE, HE_DISCONNECTED);
-    return;
-  }
-
-  mode_ = HM_SEND;
-  data_ = data;
-  len_ = 0;
-  ignore_data_ = chunk_data_ = false;
-
-  if (data_->document) {
-    data_->document->SignalEvent.connect(this, &HttpBase::OnDocumentEvent);
-  }
-
-  std::string encoding;
-  if (data_->hasHeader(HH_TRANSFER_ENCODING, &encoding)
-      && (encoding == "chunked")) {
-    chunk_data_ = true;
-  }
-
-  len_ = data_->formatLeader(buffer_, sizeof(buffer_));
-  len_ += strcpyn(buffer_ + len_, sizeof(buffer_) - len_, "\r\n");
-
-  header_ = data_->begin();
-  if (header_ == data_->end()) {
-    // We must call this at least once, in the case where there are no headers.
-    queue_headers();
-  }
-
-  flush_data();
-}
-
-void
-HttpBase::recv(HttpData* data) {
-  RTC_DCHECK(HM_NONE == mode_);
-  if (mode_ != HM_NONE) {
-    return;
-  } else if (!isConnected()) {
-    OnHttpStreamEvent(http_stream_, SE_CLOSE, HE_DISCONNECTED);
-    return;
-  }
-
-  mode_ = HM_RECV;
-  data_ = data;
-  len_ = 0;
-  ignore_data_ = chunk_data_ = false;
-
-  reset();
-  if (doc_stream_) {
-    doc_stream_->SignalEvent(doc_stream_, SE_OPEN | SE_READ, 0);
-  } else {
-    read_and_process_data();
-  }
-}
-
-void
-HttpBase::abort(HttpError err) {
-  if (mode_ != HM_NONE) {
-    if (http_stream_ != nullptr) {
-      http_stream_->Close();
-    }
-    do_complete(err);
-  }
-}
-
-StreamInterface* HttpBase::GetDocumentStream() {
-  if (doc_stream_)
-    return nullptr;
-  doc_stream_ = new DocumentStream(this);
-  return doc_stream_;
-}
-
-HttpError HttpBase::HandleStreamClose(int error) {
-  if (http_stream_ != nullptr) {
-    http_stream_->Close();
-  }
-  if (error == 0) {
-    if ((mode_ == HM_RECV) && is_valid_end_of_input()) {
-      return HE_NONE;
-    } else {
-      return HE_DISCONNECTED;
-    }
-  } else if (error == SOCKET_EACCES) {
-    return HE_AUTH;
-  } else if (error == SEC_E_CERT_EXPIRED) {
-    return HE_CERTIFICATE_EXPIRED;
-  }
-  LOG_F(LS_ERROR) << "(" << error << ")";
-  return (HM_CONNECT == mode_) ? HE_CONNECT_FAILED : HE_SOCKET_ERROR;
-}
-
-bool HttpBase::DoReceiveLoop(HttpError* error) {
-  RTC_DCHECK(HM_RECV == mode_);
-  RTC_DCHECK(nullptr != error);
-
-  // Do to the latency between receiving read notifications from
-  // pseudotcpchannel, we rely on repeated calls to read in order to acheive
-  // ideal throughput.  The number of reads is limited to prevent starving
-  // the caller.
-
-  size_t loop_count = 0;
-  const size_t kMaxReadCount = 20;
-  bool process_requires_more_data = false;
-  do {
-    // The most frequent use of this function is response to new data available
-    // on http_stream_.  Therefore, we optimize by attempting to read from the
-    // network first (as opposed to processing existing data first).
-
-    if (len_ < sizeof(buffer_)) {
-      // Attempt to buffer more data.
-      size_t read;
-      int read_error;
-      StreamResult read_result = http_stream_->Read(buffer_ + len_,
-                                                    sizeof(buffer_) - len_,
-                                                    &read, &read_error);
-      switch (read_result) {
-      case SR_SUCCESS:
-        RTC_DCHECK(len_ + read <= sizeof(buffer_));
-        len_ += read;
-        break;
-      case SR_BLOCK:
-        if (process_requires_more_data) {
-          // We're can't make progress until more data is available.
-          return false;
-        }
-        // Attempt to process the data already in our buffer.
-        break;
-      case SR_EOS:
-        // Clean close, with no error.
-        read_error = 0;
-        FALLTHROUGH();  // Fall through to HandleStreamClose.
-      case SR_ERROR:
-        *error = HandleStreamClose(read_error);
-        return true;
-      }
-    } else if (process_requires_more_data) {
-      // We have too much unprocessed data in our buffer.  This should only
-      // occur when a single HTTP header is longer than the buffer size (32K).
-      // Anything longer than that is almost certainly an error.
-      *error = HE_OVERFLOW;
-      return true;
-    }
-
-    // Process data in our buffer.  Process is not guaranteed to process all
-    // the buffered data.  In particular, it will wait until a complete
-    // protocol element (such as http header, or chunk size) is available,
-    // before processing it in its entirety.  Also, it is valid and sometimes
-    // necessary to call Process with an empty buffer, since the state machine
-    // may have interrupted state transitions to complete.
-    size_t processed;
-    ProcessResult process_result = Process(buffer_, len_, &processed,
-                                            error);
-    RTC_DCHECK(processed <= len_);
-    len_ -= processed;
-    memmove(buffer_, buffer_ + processed, len_);
-    switch (process_result) {
-    case PR_CONTINUE:
-      // We need more data to make progress.
-      process_requires_more_data = true;
-      break;
-    case PR_BLOCK:
-      // We're stalled on writing the processed data.
-      return false;
-    case PR_COMPLETE:
-      // *error already contains the correct code.
-      return true;
-    }
-  } while (++loop_count <= kMaxReadCount);
-
-  LOG_F(LS_WARNING) << "danger of starvation";
-  return false;
-}
-
-void
-HttpBase::read_and_process_data() {
-  HttpError error;
-  if (DoReceiveLoop(&error)) {
-    complete(error);
-  }
-}
-
-void
-HttpBase::flush_data() {
-  RTC_DCHECK(HM_SEND == mode_);
-
-  // When send_required is true, no more buffering can occur without a network
-  // write.
-  bool send_required = (len_ >= sizeof(buffer_));
-
-  while (true) {
-    RTC_DCHECK(len_ <= sizeof(buffer_));
-
-    // HTTP is inherently sensitive to round trip latency, since a frequent use
-    // case is for small requests and responses to be sent back and forth, and
-    // the lack of pipelining forces a single request to take a minimum of the
-    // round trip time.  As a result, it is to our benefit to pack as much data
-    // into each packet as possible.  Thus, we defer network writes until we've
-    // buffered as much data as possible.
-
-    if (!send_required && (header_ != data_->end())) {
-      // First, attempt to queue more header data.
-      send_required = queue_headers();
-    }
-
-    if (!send_required && data_->document) {
-      // Next, attempt to queue document data.
-
-      const size_t kChunkDigits = 8;
-      size_t offset, reserve;
-      if (chunk_data_) {
-        // Reserve characters at the start for X-byte hex value and \r\n
-        offset = len_ + kChunkDigits + 2;
-        // ... and 2 characters at the end for \r\n
-        reserve = offset + 2;
-      } else {
-        offset = len_;
-        reserve = offset;
-      }
-
-      if (reserve >= sizeof(buffer_)) {
-        send_required = true;
-      } else {
-        size_t read;
-        int error;
-        StreamResult result = data_->document->Read(buffer_ + offset,
-                                                    sizeof(buffer_) - reserve,
-                                                    &read, &error);
-        if (result == SR_SUCCESS) {
-          RTC_DCHECK(reserve + read <= sizeof(buffer_));
-          if (chunk_data_) {
-            // Prepend the chunk length in hex.
-            // Note: sprintfn appends a null terminator, which is why we can't
-            // combine it with the line terminator.
-            sprintfn(buffer_ + len_, kChunkDigits + 1, "%.*x",
-                     kChunkDigits, read);
-            // Add line terminator to the chunk length.
-            memcpy(buffer_ + len_ + kChunkDigits, "\r\n", 2);
-            // Add line terminator to the end of the chunk.
-            memcpy(buffer_ + offset + read, "\r\n", 2);
-          }
-          len_ = reserve + read;
-        } else if (result == SR_BLOCK) {
-          // Nothing to do but flush data to the network.
-          send_required = true;
-        } else if (result == SR_EOS) {
-          if (chunk_data_) {
-            // Append the empty chunk and empty trailers, then turn off
-            // chunking.
-            RTC_DCHECK(len_ + 5 <= sizeof(buffer_));
-            memcpy(buffer_ + len_, "0\r\n\r\n", 5);
-            len_ += 5;
-            chunk_data_ = false;
-          } else if (0 == len_) {
-            // No more data to read, and no more data to write.
-            do_complete();
-            return;
-          }
-          // Although we are done reading data, there is still data which needs
-          // to be flushed to the network.
-          send_required = true;
-        } else {
-          LOG_F(LS_ERROR) << "Read error: " << error;
-          do_complete(HE_STREAM);
-          return;
-        }
-      }
-    }
-
-    if (0 == len_) {
-      // No data currently available to send.
-      if (!data_->document) {
-        // If there is no source document, that means we're done.
-        do_complete();
-      }
-      return;
-    }
-
-    size_t written;
-    int error;
-    StreamResult result = http_stream_->Write(buffer_, len_, &written, &error);
-    if (result == SR_SUCCESS) {
-      RTC_DCHECK(written <= len_);
-      len_ -= written;
-      memmove(buffer_, buffer_ + written, len_);
-      send_required = false;
-    } else if (result == SR_BLOCK) {
-      if (send_required) {
-        // Nothing more we can do until network is writeable.
-        return;
-      }
-    } else {
-      RTC_DCHECK(result == SR_ERROR);
-      LOG_F(LS_ERROR) << "error";
-      OnHttpStreamEvent(http_stream_, SE_CLOSE, error);
-      return;
-    }
-  }
-
-  RTC_NOTREACHED();
-}
-
-bool
-HttpBase::queue_headers() {
-  RTC_DCHECK(HM_SEND == mode_);
-  while (header_ != data_->end()) {
-    size_t len = sprintfn(buffer_ + len_, sizeof(buffer_) - len_,
-                          "%.*s: %.*s\r\n",
-                          header_->first.size(), header_->first.data(),
-                          header_->second.size(), header_->second.data());
-    if (len_ + len < sizeof(buffer_) - 3) {
-      len_ += len;
-      ++header_;
-    } else if (len_ == 0) {
-      LOG(WARNING) << "discarding header that is too long: " << header_->first;
-      ++header_;
-    } else {
-      // Not enough room for the next header, write to network first.
-      return true;
-    }
-  }
-  // End of headers
-  len_ += strcpyn(buffer_ + len_, sizeof(buffer_) - len_, "\r\n");
-  return false;
-}
-
-void
-HttpBase::do_complete(HttpError err) {
-  RTC_DCHECK(mode_ != HM_NONE);
-  HttpMode mode = mode_;
-  mode_ = HM_NONE;
-  if (data_ && data_->document) {
-    data_->document->SignalEvent.disconnect(this);
-  }
-  data_ = nullptr;
-  if ((HM_RECV == mode) && doc_stream_) {
-    RTC_DCHECK(HE_NONE !=
-               err);  // We should have Disconnected doc_stream_ already.
-    DocumentStream* ds = doc_stream_;
-    ds->Disconnect(err);
-    ds->SignalEvent(ds, SE_CLOSE, err);
-  }
-  if (notify_) {
-    notify_->onHttpComplete(mode, err);
-  }
-}
-
-//
-// Stream Signals
-//
-
-void
-HttpBase::OnHttpStreamEvent(StreamInterface* stream, int events, int error) {
-  RTC_DCHECK(stream == http_stream_);
-  if ((events & SE_OPEN) && (mode_ == HM_CONNECT)) {
-    do_complete();
-    return;
-  }
-
-  if ((events & SE_WRITE) && (mode_ == HM_SEND)) {
-    flush_data();
-    return;
-  }
-
-  if ((events & SE_READ) && (mode_ == HM_RECV)) {
-    if (doc_stream_) {
-      doc_stream_->SignalEvent(doc_stream_, SE_READ, 0);
-    } else {
-      read_and_process_data();
-    }
-    return;
-  }
-
-  if ((events & SE_CLOSE) == 0)
-    return;
-
-  HttpError http_error = HandleStreamClose(error);
-  if (mode_ == HM_RECV) {
-    complete(http_error);
-  } else if (mode_ != HM_NONE) {
-    do_complete(http_error);
-  } else if (notify_) {
-    notify_->onHttpClosed(http_error);
-  }
-}
-
-void
-HttpBase::OnDocumentEvent(StreamInterface* stream, int events, int error) {
-  RTC_DCHECK(stream == data_->document.get());
-  if ((events & SE_WRITE) && (mode_ == HM_RECV)) {
-    read_and_process_data();
-    return;
-  }
-
-  if ((events & SE_READ) && (mode_ == HM_SEND)) {
-    flush_data();
-    return;
-  }
-
-  if (events & SE_CLOSE) {
-    LOG_F(LS_ERROR) << "Read error: " << error;
-    do_complete(HE_STREAM);
-    return;
-  }
-}
-
-//
-// HttpParser Implementation
-//
-
-HttpParser::ProcessResult
-HttpBase::ProcessLeader(const char* line, size_t len, HttpError* error) {
-  *error = data_->parseLeader(line, len);
-  return (HE_NONE == *error) ? PR_CONTINUE : PR_COMPLETE;
-}
-
-HttpParser::ProcessResult
-HttpBase::ProcessHeader(const char* name, size_t nlen, const char* value,
-                        size_t vlen, HttpError* error) {
-  std::string sname(name, nlen), svalue(value, vlen);
-  data_->addHeader(sname, svalue);
-  return PR_CONTINUE;
-}
-
-HttpParser::ProcessResult
-HttpBase::ProcessHeaderComplete(bool chunked, size_t& data_size,
-                                HttpError* error) {
-  StreamInterface* old_docstream = doc_stream_;
-  if (notify_) {
-    *error = notify_->onHttpHeaderComplete(chunked, data_size);
-    // The request must not be aborted as a result of this callback.
-    RTC_DCHECK(nullptr != data_);
-  }
-  if ((HE_NONE == *error) && data_->document) {
-    data_->document->SignalEvent.connect(this, &HttpBase::OnDocumentEvent);
-  }
-  if (HE_NONE != *error) {
-    return PR_COMPLETE;
-  }
-  if (old_docstream != doc_stream_) {
-    // Break out of Process loop, since our I/O model just changed.
-    return PR_BLOCK;
-  }
-  return PR_CONTINUE;
-}
-
-HttpParser::ProcessResult
-HttpBase::ProcessData(const char* data, size_t len, size_t& read,
-                      HttpError* error) {
-  if (ignore_data_ || !data_->document) {
-    read = len;
-    return PR_CONTINUE;
-  }
-  int write_error = 0;
-  switch (data_->document->Write(data, len, &read, &write_error)) {
-  case SR_SUCCESS:
-    return PR_CONTINUE;
-  case SR_BLOCK:
-    return PR_BLOCK;
-  case SR_EOS:
-    LOG_F(LS_ERROR) << "Unexpected EOS";
-    *error = HE_STREAM;
-    return PR_COMPLETE;
-  case SR_ERROR:
-  default:
-    LOG_F(LS_ERROR) << "Write error: " << write_error;
-    *error = HE_STREAM;
-    return PR_COMPLETE;
-  }
-}
-
-void
-HttpBase::OnComplete(HttpError err) {
-  LOG_F(LS_VERBOSE);
-  do_complete(err);
-}
-
-} // namespace rtc
diff --git a/rtc_base/httpbase.h b/rtc_base/httpbase.h
deleted file mode 100644
index 5086502..0000000
--- a/rtc_base/httpbase.h
+++ /dev/null
@@ -1,187 +0,0 @@
-/*
- *  Copyright 2004 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_RTC_BASE_HTTPBASE_H_
-#define WEBRTC_RTC_BASE_HTTPBASE_H_
-
-#include "webrtc/rtc_base/httpcommon.h"
-
-namespace rtc {
-
-class StreamInterface;
-
-///////////////////////////////////////////////////////////////////////////////
-// HttpParser - Parses an HTTP stream provided via Process and end_of_input, and
-// generates events for:
-//  Structural Elements: Leader, Headers, Document Data
-//  Events: End of Headers, End of Document, Errors
-///////////////////////////////////////////////////////////////////////////////
-
-class HttpParser {
-public:
-  enum ProcessResult { PR_CONTINUE, PR_BLOCK, PR_COMPLETE };
-  HttpParser();
-  virtual ~HttpParser();
-
-  void reset();
-  ProcessResult Process(const char* buffer, size_t len, size_t* processed,
-                        HttpError* error);
-  bool is_valid_end_of_input() const;
-  void complete(HttpError err);
-
-  size_t GetDataRemaining() const { return data_size_; }
-
-protected:
-  ProcessResult ProcessLine(const char* line, size_t len, HttpError* error);
-
-  // HttpParser Interface
-  virtual ProcessResult ProcessLeader(const char* line, size_t len,
-                                      HttpError* error) = 0;
-  virtual ProcessResult ProcessHeader(const char* name, size_t nlen,
-                                      const char* value, size_t vlen,
-                                      HttpError* error) = 0;
-  virtual ProcessResult ProcessHeaderComplete(bool chunked, size_t& data_size,
-                                              HttpError* error) = 0;
-  virtual ProcessResult ProcessData(const char* data, size_t len, size_t& read,
-                                    HttpError* error) = 0;
-  virtual void OnComplete(HttpError err) = 0;
-
-private:
-  enum State {
-    ST_LEADER, ST_HEADERS,
-    ST_CHUNKSIZE, ST_CHUNKTERM, ST_TRAILERS,
-    ST_DATA, ST_COMPLETE
-  } state_;
-  bool chunked_;
-  size_t data_size_;
-};
-
-///////////////////////////////////////////////////////////////////////////////
-// IHttpNotify
-///////////////////////////////////////////////////////////////////////////////
-
-enum HttpMode { HM_NONE, HM_CONNECT, HM_RECV, HM_SEND };
-
-class IHttpNotify {
-public:
-  virtual ~IHttpNotify() {}
-  virtual HttpError onHttpHeaderComplete(bool chunked, size_t& data_size) = 0;
-  virtual void onHttpComplete(HttpMode mode, HttpError err) = 0;
-  virtual void onHttpClosed(HttpError err) = 0;
-};
-
-///////////////////////////////////////////////////////////////////////////////
-// HttpBase - Provides a state machine for implementing HTTP-based components.
-// Attach HttpBase to a StreamInterface which represents a bidirectional HTTP
-// stream, and then call send() or recv() to initiate sending or receiving one
-// side of an HTTP transaction.  By default, HttpBase operates as an I/O pump,
-// moving data from the HTTP stream to the HttpData object and vice versa.
-// However, it can also operate in stream mode, in which case the user of the
-// stream interface drives I/O via calls to Read().
-///////////////////////////////////////////////////////////////////////////////
-
-class HttpBase
-: private HttpParser,
-  public sigslot::has_slots<>
-{
-public:
-  HttpBase();
-  ~HttpBase() override;
-
-  void notify(IHttpNotify* notify) { notify_ = notify; }
-  bool attach(StreamInterface* stream);
-  StreamInterface* stream() { return http_stream_; }
-  StreamInterface* detach();
-  bool isConnected() const;
-
-  void send(HttpData* data);
-  void recv(HttpData* data);
-  void abort(HttpError err);
-
-  HttpMode mode() const { return mode_; }
-
-  void set_ignore_data(bool ignore) { ignore_data_ = ignore; }
-  bool ignore_data() const { return ignore_data_; }
-
-  // Obtaining this stream puts HttpBase into stream mode until the stream
-  // is closed.  HttpBase can only expose one open stream interface at a time.
-  // Further calls will return null.
-  StreamInterface* GetDocumentStream();
-
-protected:
-  // Do cleanup when the http stream closes (error may be 0 for a clean
-  // shutdown), and return the error code to signal.
-  HttpError HandleStreamClose(int error);
-
-  // DoReceiveLoop acts as a data pump, pulling data from the http stream,
-  // pushing it through the HttpParser, and then populating the HttpData object
-  // based on the callbacks from the parser.  One of the most interesting
-  // callbacks is ProcessData, which provides the actual http document body.
-  // This data is then written to the HttpData::document.  As a result, data
-  // flows from the network to the document, with some incidental protocol
-  // parsing in between.
-  // Ideally, we would pass in the document* to DoReceiveLoop, to more easily
-  // support GetDocumentStream().  However, since the HttpParser is callback
-  // driven, we are forced to store the pointer somewhere until the callback
-  // is triggered.
-  // Returns true if the received document has finished, and
-  // HttpParser::complete should be called.
-  bool DoReceiveLoop(HttpError* err);
-
-  void read_and_process_data();
-  void flush_data();
-  bool queue_headers();
-  void do_complete(HttpError err = HE_NONE);
-
-  void OnHttpStreamEvent(StreamInterface* stream, int events, int error);
-  void OnDocumentEvent(StreamInterface* stream, int events, int error);
-
-  // HttpParser Interface
-  ProcessResult ProcessLeader(const char* line,
-                              size_t len,
-                              HttpError* error) override;
-  ProcessResult ProcessHeader(const char* name,
-                              size_t nlen,
-                              const char* value,
-                              size_t vlen,
-                              HttpError* error) override;
-  ProcessResult ProcessHeaderComplete(bool chunked,
-                                      size_t& data_size,
-                                      HttpError* error) override;
-  ProcessResult ProcessData(const char* data,
-                            size_t len,
-                            size_t& read,
-                            HttpError* error) override;
-  void OnComplete(HttpError err) override;
-
-private:
-  class DocumentStream;
-  friend class DocumentStream;
-
-  enum { kBufferSize = 32 * 1024 };
-
-  HttpMode mode_;
-  HttpData* data_;
-  IHttpNotify* notify_;
-  StreamInterface* http_stream_;
-  DocumentStream* doc_stream_;
-  char buffer_[kBufferSize];
-  size_t len_;
-
-  bool ignore_data_, chunk_data_;
-  HttpData::const_iterator header_;
-};
-
-///////////////////////////////////////////////////////////////////////////////
-
-} // namespace rtc
-
-#endif // WEBRTC_RTC_BASE_HTTPBASE_H_
diff --git a/rtc_base/httpbase_unittest.cc b/rtc_base/httpbase_unittest.cc
deleted file mode 100644
index 37a6b26..0000000
--- a/rtc_base/httpbase_unittest.cc
+++ /dev/null
@@ -1,526 +0,0 @@
-/*
- *  Copyright 2004 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 <algorithm>
-
-#include "webrtc/rtc_base/gunit.h"
-#include "webrtc/rtc_base/httpbase.h"
-#include "webrtc/rtc_base/testutils.h"
-
-namespace rtc {
-
-const char* const kHttpResponse =
-  "HTTP/1.1 200\r\n"
-  "Connection: Keep-Alive\r\n"
-  "Content-Type: text/plain\r\n"
-  "Proxy-Authorization: 42\r\n"
-  "Transfer-Encoding: chunked\r\n"
-  "\r\n"
-  "00000008\r\n"
-  "Goodbye!\r\n"
-  "0\r\n\r\n";
-
-const char* const kHttpEmptyResponse =
-  "HTTP/1.1 200\r\n"
-  "Connection: Keep-Alive\r\n"
-  "Content-Length: 0\r\n"
-  "Proxy-Authorization: 42\r\n"
-  "\r\n";
-
-const char* const kHttpResponsePrefix =
-  "HTTP/1.1 200\r\n"
-  "Connection: Keep-Alive\r\n"
-  "Content-Type: text/plain\r\n"
-  "Proxy-Authorization: 42\r\n"
-  "Transfer-Encoding: chunked\r\n"
-  "\r\n"
-  "8\r\n"
-  "Goodbye!\r\n";
-
-class HttpBaseTest : public testing::Test, public IHttpNotify {
-public:
-  enum EventType { E_HEADER_COMPLETE, E_COMPLETE, E_CLOSED };
-  struct Event {
-    EventType event;
-    bool chunked;
-    size_t data_size;
-    HttpMode mode;
-    HttpError err;
-  };
-  HttpBaseTest() : mem(nullptr), obtain_stream(false), http_stream(nullptr) {}
-
-  virtual void SetUp() { }
-  virtual void TearDown() {
-    delete http_stream;
-    // Avoid an ASSERT, in case a test doesn't clean up properly
-    base.abort(HE_NONE);
-  }
-
-  virtual HttpError onHttpHeaderComplete(bool chunked, size_t& data_size) {
-    LOG_F(LS_VERBOSE) << "chunked: " << chunked << " size: " << data_size;
-    Event e = { E_HEADER_COMPLETE, chunked, data_size, HM_NONE, HE_NONE};
-    events.push_back(e);
-    if (obtain_stream) {
-      ObtainDocumentStream();
-    }
-    return HE_NONE;
-  }
-  virtual void onHttpComplete(HttpMode mode, HttpError err) {
-    LOG_F(LS_VERBOSE) << "mode: " << mode << " err: " << err;
-    Event e = { E_COMPLETE, false, 0, mode, err };
-    events.push_back(e);
-  }
-  virtual void onHttpClosed(HttpError err) {
-    LOG_F(LS_VERBOSE) << "err: " << err;
-    Event e = { E_CLOSED, false, 0, HM_NONE, err };
-    events.push_back(e);
-  }
-
-  void SetupSource(const char* response);
-
-  void VerifyHeaderComplete(size_t event_count, bool empty_doc);
-  void VerifyDocumentContents(const char* expected_data,
-                              size_t expected_length = SIZE_UNKNOWN);
-
-  void ObtainDocumentStream();
-  void VerifyDocumentStreamIsOpening();
-  void VerifyDocumentStreamOpenEvent();
-  void ReadDocumentStreamData(const char* expected_data);
-  void VerifyDocumentStreamIsEOS();
-
-  void SetupDocument(const char* response);
-  void VerifySourceContents(const char* expected_data,
-                            size_t expected_length = SIZE_UNKNOWN);
-
-  void VerifyTransferComplete(HttpMode mode, HttpError error);
-
-  HttpBase base;
-  MemoryStream* mem;
-  HttpResponseData data;
-
-  // The source of http data, and source events
-  webrtc::testing::StreamSource src;
-  std::vector<Event> events;
-
-  // Document stream, and stream events
-  bool obtain_stream;
-  StreamInterface* http_stream;
-  webrtc::testing::StreamSink sink;
-};
-
-void HttpBaseTest::SetupSource(const char* http_data) {
-  LOG_F(LS_VERBOSE) << "Enter";
-
-  src.SetState(SS_OPENING);
-  src.QueueString(http_data);
-
-  base.notify(this);
-  base.attach(&src);
-  EXPECT_TRUE(events.empty());
-
-  src.SetState(SS_OPEN);
-  ASSERT_EQ(1U, events.size());
-  EXPECT_EQ(E_COMPLETE, events[0].event);
-  EXPECT_EQ(HM_CONNECT, events[0].mode);
-  EXPECT_EQ(HE_NONE, events[0].err);
-  events.clear();
-
-  mem = new MemoryStream;
-  data.document.reset(mem);
-  LOG_F(LS_VERBOSE) << "Exit";
-}
-
-void HttpBaseTest::VerifyHeaderComplete(size_t event_count, bool empty_doc) {
-  LOG_F(LS_VERBOSE) << "Enter";
-
-  ASSERT_EQ(event_count, events.size());
-  EXPECT_EQ(E_HEADER_COMPLETE, events[0].event);
-
-  std::string header;
-  EXPECT_EQ(HVER_1_1, data.version);
-  EXPECT_EQ(static_cast<uint32_t>(HC_OK), data.scode);
-  EXPECT_TRUE(data.hasHeader(HH_PROXY_AUTHORIZATION, &header));
-  EXPECT_EQ("42", header);
-  EXPECT_TRUE(data.hasHeader(HH_CONNECTION, &header));
-  EXPECT_EQ("Keep-Alive", header);
-
-  if (empty_doc) {
-    EXPECT_FALSE(events[0].chunked);
-    EXPECT_EQ(0U, events[0].data_size);
-
-    EXPECT_TRUE(data.hasHeader(HH_CONTENT_LENGTH, &header));
-    EXPECT_EQ("0", header);
-  } else {
-    EXPECT_TRUE(events[0].chunked);
-    EXPECT_EQ(SIZE_UNKNOWN, events[0].data_size);
-
-    EXPECT_TRUE(data.hasHeader(HH_CONTENT_TYPE, &header));
-    EXPECT_EQ("text/plain", header);
-    EXPECT_TRUE(data.hasHeader(HH_TRANSFER_ENCODING, &header));
-    EXPECT_EQ("chunked", header);
-  }
-  LOG_F(LS_VERBOSE) << "Exit";
-}
-
-void HttpBaseTest::VerifyDocumentContents(const char* expected_data,
-                                          size_t expected_length) {
-  LOG_F(LS_VERBOSE) << "Enter";
-
-  if (SIZE_UNKNOWN == expected_length) {
-    expected_length = strlen(expected_data);
-  }
-  EXPECT_EQ(mem, data.document.get());
-
-  size_t length;
-  mem->GetSize(&length);
-  EXPECT_EQ(expected_length, length);
-  EXPECT_TRUE(0 == memcmp(expected_data, mem->GetBuffer(), length));
-  LOG_F(LS_VERBOSE) << "Exit";
-}
-
-void HttpBaseTest::ObtainDocumentStream() {
-  LOG_F(LS_VERBOSE) << "Enter";
-  EXPECT_FALSE(http_stream);
-  http_stream = base.GetDocumentStream();
-  ASSERT_TRUE(nullptr != http_stream);
-  sink.Monitor(http_stream);
-  LOG_F(LS_VERBOSE) << "Exit";
-}
-
-void HttpBaseTest::VerifyDocumentStreamIsOpening() {
-  LOG_F(LS_VERBOSE) << "Enter";
-  ASSERT_TRUE(nullptr != http_stream);
-  EXPECT_EQ(0, sink.Events(http_stream));
-  EXPECT_EQ(SS_OPENING, http_stream->GetState());
-
-  size_t read = 0;
-  char buffer[5] = { 0 };
-  EXPECT_EQ(SR_BLOCK,
-            http_stream->Read(buffer, sizeof(buffer), &read, nullptr));
-  LOG_F(LS_VERBOSE) << "Exit";
-}
-
-void HttpBaseTest::VerifyDocumentStreamOpenEvent() {
-  LOG_F(LS_VERBOSE) << "Enter";
-
-  ASSERT_TRUE(nullptr != http_stream);
-  EXPECT_EQ(SE_OPEN | SE_READ, sink.Events(http_stream));
-  EXPECT_EQ(SS_OPEN, http_stream->GetState());
-
-  // HTTP headers haven't arrived yet
-  EXPECT_EQ(0U, events.size());
-  EXPECT_EQ(static_cast<uint32_t>(HC_INTERNAL_SERVER_ERROR), data.scode);
-  LOG_F(LS_VERBOSE) << "Exit";
-}
-
-void HttpBaseTest::ReadDocumentStreamData(const char* expected_data) {
-  LOG_F(LS_VERBOSE) << "Enter";
-
-  ASSERT_TRUE(nullptr != http_stream);
-  EXPECT_EQ(SS_OPEN, http_stream->GetState());
-
-  // Pump the HTTP I/O using Read, and verify the results.
-  size_t verified_length = 0;
-  const size_t expected_length = strlen(expected_data);
-  while (verified_length < expected_length) {
-    size_t read = 0;
-    char buffer[5] = { 0 };
-    size_t amt_to_read =
-        std::min(expected_length - verified_length, sizeof(buffer));
-    EXPECT_EQ(SR_SUCCESS,
-              http_stream->Read(buffer, amt_to_read, &read, nullptr));
-    EXPECT_EQ(amt_to_read, read);
-    EXPECT_TRUE(0 == memcmp(expected_data + verified_length, buffer, read));
-    verified_length += read;
-  }
-  LOG_F(LS_VERBOSE) << "Exit";
-}
-
-void HttpBaseTest::VerifyDocumentStreamIsEOS() {
-  LOG_F(LS_VERBOSE) << "Enter";
-
-  ASSERT_TRUE(nullptr != http_stream);
-  size_t read = 0;
-  char buffer[5] = { 0 };
-  EXPECT_EQ(SR_EOS, http_stream->Read(buffer, sizeof(buffer), &read, nullptr));
-  EXPECT_EQ(SS_CLOSED, http_stream->GetState());
-
-  // When EOS is caused by Read, we don't expect SE_CLOSE
-  EXPECT_EQ(0, sink.Events(http_stream));
-  LOG_F(LS_VERBOSE) << "Exit";
-}
-
-void HttpBaseTest::SetupDocument(const char* document_data) {
-  LOG_F(LS_VERBOSE) << "Enter";
-  src.SetState(SS_OPEN);
-
-  base.notify(this);
-  base.attach(&src);
-  EXPECT_TRUE(events.empty());
-
-  if (document_data) {
-    // Note: we could just call data.set_success("text/plain", mem), but that
-    // won't allow us to use the chunked transfer encoding.
-    mem = new MemoryStream(document_data);
-    data.document.reset(mem);
-    data.setHeader(HH_CONTENT_TYPE, "text/plain");
-    data.setHeader(HH_TRANSFER_ENCODING, "chunked");
-  } else {
-    data.setHeader(HH_CONTENT_LENGTH, "0");
-  }
-  data.scode = HC_OK;
-  data.setHeader(HH_PROXY_AUTHORIZATION, "42");
-  data.setHeader(HH_CONNECTION, "Keep-Alive");
-  LOG_F(LS_VERBOSE) << "Exit";
-}
-
-void HttpBaseTest::VerifySourceContents(const char* expected_data,
-                                        size_t expected_length) {
-  LOG_F(LS_VERBOSE) << "Enter";
-  if (SIZE_UNKNOWN == expected_length) {
-    expected_length = strlen(expected_data);
-  }
-  std::string contents = src.ReadData();
-  EXPECT_EQ(expected_length, contents.length());
-  EXPECT_TRUE(0 == memcmp(expected_data, contents.data(), expected_length));
-  LOG_F(LS_VERBOSE) << "Exit";
-}
-
-void HttpBaseTest::VerifyTransferComplete(HttpMode mode, HttpError error) {
-  LOG_F(LS_VERBOSE) << "Enter";
-  // Verify that http operation has completed
-  ASSERT_TRUE(events.size() > 0);
-  size_t last_event = events.size() - 1;
-  EXPECT_EQ(E_COMPLETE, events[last_event].event);
-  EXPECT_EQ(mode, events[last_event].mode);
-  EXPECT_EQ(error, events[last_event].err);
-  LOG_F(LS_VERBOSE) << "Exit";
-}
-
-//
-// Tests
-//
-
-TEST_F(HttpBaseTest, SupportsSend) {
-  // Queue response document
-  SetupDocument("Goodbye!");
-
-  // Begin send
-  base.send(&data);
-
-  // Send completed successfully
-  VerifyTransferComplete(HM_SEND, HE_NONE);
-  VerifySourceContents(kHttpResponse);
-}
-
-TEST_F(HttpBaseTest, SupportsSendNoDocument) {
-  // Queue response document
-  SetupDocument(nullptr);
-
-  // Begin send
-  base.send(&data);
-
-  // Send completed successfully
-  VerifyTransferComplete(HM_SEND, HE_NONE);
-  VerifySourceContents(kHttpEmptyResponse);
-}
-
-TEST_F(HttpBaseTest, SignalsCompleteOnInterruptedSend) {
-  // This test is attempting to expose a bug that occurs when a particular
-  // base objects is used for receiving, and then used for sending.  In
-  // particular, the HttpParser state is different after receiving.  Simulate
-  // that here.
-  SetupSource(kHttpResponse);
-  base.recv(&data);
-  VerifyTransferComplete(HM_RECV, HE_NONE);
-
-  src.Clear();
-  data.clear(true);
-  events.clear();
-  base.detach();
-
-  // Queue response document
-  SetupDocument("Goodbye!");
-
-  // Prevent entire response from being sent
-  const size_t kInterruptedLength = strlen(kHttpResponse) - 1;
-  src.SetWriteBlock(kInterruptedLength);
-
-  // Begin send
-  base.send(&data);
-
-  // Document is mostly complete, but no completion signal yet.
-  EXPECT_TRUE(events.empty());
-  VerifySourceContents(kHttpResponse, kInterruptedLength);
-
-  src.SetState(SS_CLOSED);
-
-  // Send completed with disconnect error, and no additional data.
-  VerifyTransferComplete(HM_SEND, HE_DISCONNECTED);
-  EXPECT_TRUE(src.ReadData().empty());
-}
-
-TEST_F(HttpBaseTest, SupportsReceiveViaDocumentPush) {
-  // Queue response document
-  SetupSource(kHttpResponse);
-
-  // Begin receive
-  base.recv(&data);
-
-  // Document completed successfully
-  VerifyHeaderComplete(2, false);
-  VerifyTransferComplete(HM_RECV, HE_NONE);
-  VerifyDocumentContents("Goodbye!");
-}
-
-TEST_F(HttpBaseTest, SupportsReceiveViaStreamPull) {
-  // Switch to pull mode
-  ObtainDocumentStream();
-  VerifyDocumentStreamIsOpening();
-
-  // Queue response document
-  SetupSource(kHttpResponse);
-  VerifyDocumentStreamIsOpening();
-
-  // Begin receive
-  base.recv(&data);
-
-  // Pull document data
-  VerifyDocumentStreamOpenEvent();
-  ReadDocumentStreamData("Goodbye!");
-  VerifyDocumentStreamIsEOS();
-
-  // Document completed successfully
-  VerifyHeaderComplete(2, false);
-  VerifyTransferComplete(HM_RECV, HE_NONE);
-  VerifyDocumentContents("");
-}
-
-TEST_F(HttpBaseTest, DISABLED_AllowsCloseStreamBeforeDocumentIsComplete) {
-
-  // TODO: Remove extra logging once test failure is understood
-  LoggingSeverity old_sev = rtc::LogMessage::GetLogToDebug();
-  rtc::LogMessage::LogToDebug(LS_VERBOSE);
-
-
-  // Switch to pull mode
-  ObtainDocumentStream();
-  VerifyDocumentStreamIsOpening();
-
-  // Queue response document
-  SetupSource(kHttpResponse);
-  VerifyDocumentStreamIsOpening();
-
-  // Begin receive
-  base.recv(&data);
-
-  // Pull some of the data
-  VerifyDocumentStreamOpenEvent();
-  ReadDocumentStreamData("Goodb");
-
-  // We've seen the header by now
-  VerifyHeaderComplete(1, false);
-
-  // Close the pull stream, this will transition back to push I/O.
-  http_stream->Close();
-  Thread::Current()->ProcessMessages(0);
-
-  // Remainder of document completed successfully
-  VerifyTransferComplete(HM_RECV, HE_NONE);
-  VerifyDocumentContents("ye!");
-
-  rtc::LogMessage::LogToDebug(old_sev);
-}
-
-TEST_F(HttpBaseTest, AllowsGetDocumentStreamInResponseToHttpHeader) {
-  // Queue response document
-  SetupSource(kHttpResponse);
-
-  // Switch to pull mode in response to header arrival
-  obtain_stream = true;
-
-  // Begin receive
-  base.recv(&data);
-
-  // We've already seen the header, but not data has arrived
-  VerifyHeaderComplete(1, false);
-  VerifyDocumentContents("");
-
-  // Pull the document data
-  ReadDocumentStreamData("Goodbye!");
-  VerifyDocumentStreamIsEOS();
-
-  // Document completed successfully
-  VerifyTransferComplete(HM_RECV, HE_NONE);
-  VerifyDocumentContents("");
-}
-
-TEST_F(HttpBaseTest, AllowsGetDocumentStreamWithEmptyDocumentBody) {
-  // Queue empty response document
-  SetupSource(kHttpEmptyResponse);
-
-  // Switch to pull mode in response to header arrival
-  obtain_stream = true;
-
-  // Begin receive
-  base.recv(&data);
-
-  // We've already seen the header, but not data has arrived
-  VerifyHeaderComplete(1, true);
-  VerifyDocumentContents("");
-
-  // The document is still open, until we attempt to read
-  ASSERT_TRUE(nullptr != http_stream);
-  EXPECT_EQ(SS_OPEN, http_stream->GetState());
-
-  // Attempt to read data, and discover EOS
-  VerifyDocumentStreamIsEOS();
-
-  // Document completed successfully
-  VerifyTransferComplete(HM_RECV, HE_NONE);
-  VerifyDocumentContents("");
-}
-
-TEST_F(HttpBaseTest, SignalsDocumentStreamCloseOnUnexpectedClose) {
-  // Switch to pull mode
-  ObtainDocumentStream();
-  VerifyDocumentStreamIsOpening();
-
-  // Queue response document
-  SetupSource(kHttpResponsePrefix);
-  VerifyDocumentStreamIsOpening();
-
-  // Begin receive
-  base.recv(&data);
-
-  // Pull document data
-  VerifyDocumentStreamOpenEvent();
-  ReadDocumentStreamData("Goodbye!");
-
-  // Simulate unexpected close
-  src.SetState(SS_CLOSED);
-
-  // Observe error event on document stream
-  EXPECT_EQ(webrtc::testing::SSE_ERROR, sink.Events(http_stream));
-
-  // Future reads give an error
-  int error = 0;
-  char buffer[5] = { 0 };
-  EXPECT_EQ(SR_ERROR,
-            http_stream->Read(buffer, sizeof(buffer), nullptr, &error));
-  EXPECT_EQ(HE_DISCONNECTED, error);
-
-  // Document completed with error
-  VerifyHeaderComplete(2, false);
-  VerifyTransferComplete(HM_RECV, HE_DISCONNECTED);
-  VerifyDocumentContents("");
-}
-
-} // namespace rtc
diff --git a/rtc_base/httpcommon-inl.h b/rtc_base/httpcommon-inl.h
deleted file mode 100644
index f0b0242..0000000
--- a/rtc_base/httpcommon-inl.h
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- *  Copyright 2004 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_RTC_BASE_HTTPCOMMON_INL_H_
-#define WEBRTC_RTC_BASE_HTTPCOMMON_INL_H_
-
-#include "webrtc/rtc_base/arraysize.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/httpcommon.h"
-
-namespace rtc {
-
-///////////////////////////////////////////////////////////////////////////////
-// Url
-///////////////////////////////////////////////////////////////////////////////
-
-template<class CTYPE>
-void Url<CTYPE>::do_set_url(const CTYPE* val, size_t len) {
-  if (ascnicmp(val, "http://", 7) == 0) {
-    val += 7; len -= 7;
-    secure_ = false;
-  } else if (ascnicmp(val, "https://", 8) == 0) {
-    val += 8; len -= 8;
-    secure_ = true;
-  } else {
-    clear();
-    return;
-  }
-  const CTYPE* path = strchrn(val, len, static_cast<CTYPE>('/'));
-  if (!path) {
-    path = val + len;
-  }
-  size_t address_length = (path - val);
-  do_set_address(val, address_length);
-  do_set_full_path(path, len - address_length);
-}
-
-template<class CTYPE>
-void Url<CTYPE>::do_set_address(const CTYPE* val, size_t len) {
-  if (const CTYPE* at = strchrn(val, len, static_cast<CTYPE>('@'))) {
-    // Everything before the @ is a user:password combo, so skip it.
-    len -= at - val + 1;
-    val = at + 1;
-  }
-  if (const CTYPE* colon = strchrn(val, len, static_cast<CTYPE>(':'))) {
-    host_.assign(val, colon - val);
-    // Note: In every case, we're guaranteed that colon is followed by a null,
-    // or non-numeric character.
-    port_ = static_cast<uint16_t>(::strtoul(colon + 1, nullptr, 10));
-    // TODO: Consider checking for invalid data following port number.
-  } else {
-    host_.assign(val, len);
-    port_ = HttpDefaultPort(secure_);
-  }
-}
-
-template<class CTYPE>
-void Url<CTYPE>::do_set_full_path(const CTYPE* val, size_t len) {
-  const CTYPE* query = strchrn(val, len, static_cast<CTYPE>('?'));
-  if (!query) {
-    query = val + len;
-  }
-  size_t path_length = (query - val);
-  if (0 == path_length) {
-    // TODO: consider failing in this case.
-    path_.assign(1, static_cast<CTYPE>('/'));
-  } else {
-    RTC_DCHECK(val[0] == static_cast<CTYPE>('/'));
-    path_.assign(val, path_length);
-  }
-  query_.assign(query, len - path_length);
-}
-
-template<class CTYPE>
-void Url<CTYPE>::do_get_url(string* val) const {
-  CTYPE protocol[9];
-  asccpyn(protocol, arraysize(protocol), secure_ ? "https://" : "http://");
-  val->append(protocol);
-  do_get_address(val);
-  do_get_full_path(val);
-}
-
-template<class CTYPE>
-void Url<CTYPE>::do_get_address(string* val) const {
-  val->append(host_);
-  if (port_ != HttpDefaultPort(secure_)) {
-    CTYPE format[5], port[32];
-    asccpyn(format, arraysize(format), ":%hu");
-    sprintfn(port, arraysize(port), format, port_);
-    val->append(port);
-  }
-}
-
-template<class CTYPE>
-void Url<CTYPE>::do_get_full_path(string* val) const {
-  val->append(path_);
-  val->append(query_);
-}
-
-template<class CTYPE>
-bool Url<CTYPE>::get_attribute(const string& name, string* value) const {
-  if (query_.empty())
-    return false;
-
-  std::string::size_type pos = query_.find(name, 1);
-  if (std::string::npos == pos)
-    return false;
-
-  pos += name.length() + 1;
-  if ((pos > query_.length()) || (static_cast<CTYPE>('=') != query_[pos-1]))
-    return false;
-
-  std::string::size_type end = query_.find(static_cast<CTYPE>('&'), pos);
-  if (std::string::npos == end) {
-    end = query_.length();
-  }
-  value->assign(query_.substr(pos, end - pos));
-  return true;
-}
-
-///////////////////////////////////////////////////////////////////////////////
-
-}  // namespace rtc
-
-#endif  // WEBRTC_RTC_BASE_HTTPCOMMON_INL_H_
diff --git a/rtc_base/httpcommon.cc b/rtc_base/httpcommon.cc
deleted file mode 100644
index a45d922..0000000
--- a/rtc_base/httpcommon.cc
+++ /dev/null
@@ -1,1009 +0,0 @@
-/*
- *  Copyright 2004 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 <time.h>
-
-#if defined(WEBRTC_WIN)
-#define WIN32_LEAN_AND_MEAN
-#include <windows.h>
-#include <winsock2.h>
-#include <ws2tcpip.h>
-#define SECURITY_WIN32
-#include <security.h>
-#endif
-
-#include <algorithm>
-
-#include "webrtc/rtc_base/arraysize.h"
-#include "webrtc/rtc_base/base64.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/cryptstring.h"
-#include "webrtc/rtc_base/httpcommon-inl.h"
-#include "webrtc/rtc_base/httpcommon.h"
-#include "webrtc/rtc_base/messagedigest.h"
-#include "webrtc/rtc_base/socketaddress.h"
-#include "webrtc/rtc_base/stringencode.h"
-#include "webrtc/rtc_base/stringutils.h"
-
-namespace rtc {
-
-#if defined(WEBRTC_WIN)
-extern const ConstantLabel SECURITY_ERRORS[];
-#endif
-
-//////////////////////////////////////////////////////////////////////
-// Enum - TODO: expose globally later?
-//////////////////////////////////////////////////////////////////////
-
-bool find_string(size_t& index, const std::string& needle,
-                 const char* const haystack[], size_t max_index) {
-  for (index=0; index<max_index; ++index) {
-    if (_stricmp(needle.c_str(), haystack[index]) == 0) {
-      return true;
-    }
-  }
-  return false;
-}
-
-template<class E>
-struct Enum {
-  static const char** Names;
-  static size_t Size;
-
-  static inline const char* Name(E val) { return Names[val]; }
-  static inline bool Parse(E& val, const std::string& name) {
-    size_t index;
-    if (!find_string(index, name, Names, Size))
-      return false;
-    val = static_cast<E>(index);
-    return true;
-  }
-
-  E val;
-
-  inline operator E&() { return val; }
-  inline Enum& operator=(E rhs) { val = rhs; return *this; }
-
-  inline const char* name() const { return Name(val); }
-  inline bool assign(const std::string& name) { return Parse(val, name); }
-  inline Enum& operator=(const std::string& rhs) { assign(rhs); return *this; }
-};
-
-#define ENUM(e,n) \
-  template<> const char** Enum<e>::Names = n; \
-  template<> size_t Enum<e>::Size = sizeof(n)/sizeof(n[0])
-
-//////////////////////////////////////////////////////////////////////
-// HttpCommon
-//////////////////////////////////////////////////////////////////////
-
-static const char* kHttpVersions[HVER_LAST+1] = {
-  "1.0", "1.1", "Unknown"
-};
-ENUM(HttpVersion, kHttpVersions);
-
-static const char* kHttpVerbs[HV_LAST+1] = {
-  "GET", "POST", "PUT", "DELETE", "CONNECT", "HEAD"
-};
-ENUM(HttpVerb, kHttpVerbs);
-
-static const char* kHttpHeaders[HH_LAST+1] = {
-  "Age",
-  "Cache-Control",
-  "Connection",
-  "Content-Disposition",
-  "Content-Length",
-  "Content-Range",
-  "Content-Type",
-  "Cookie",
-  "Date",
-  "ETag",
-  "Expires",
-  "Host",
-  "If-Modified-Since",
-  "If-None-Match",
-  "Keep-Alive",
-  "Last-Modified",
-  "Location",
-  "Proxy-Authenticate",
-  "Proxy-Authorization",
-  "Proxy-Connection",
-  "Range",
-  "Set-Cookie",
-  "TE",
-  "Trailers",
-  "Transfer-Encoding",
-  "Upgrade",
-  "User-Agent",
-  "WWW-Authenticate",
-};
-ENUM(HttpHeader, kHttpHeaders);
-
-const char* ToString(HttpVersion version) {
-  return Enum<HttpVersion>::Name(version);
-}
-
-bool FromString(HttpVersion& version, const std::string& str) {
-  return Enum<HttpVersion>::Parse(version, str);
-}
-
-const char* ToString(HttpVerb verb) {
-  return Enum<HttpVerb>::Name(verb);
-}
-
-bool FromString(HttpVerb& verb, const std::string& str) {
-  return Enum<HttpVerb>::Parse(verb, str);
-}
-
-const char* ToString(HttpHeader header) {
-  return Enum<HttpHeader>::Name(header);
-}
-
-bool FromString(HttpHeader& header, const std::string& str) {
-  return Enum<HttpHeader>::Parse(header, str);
-}
-
-bool HttpCodeHasBody(uint32_t code) {
-  return !HttpCodeIsInformational(code)
-         && (code != HC_NO_CONTENT) && (code != HC_NOT_MODIFIED);
-}
-
-bool HttpCodeIsCacheable(uint32_t code) {
-  switch (code) {
-  case HC_OK:
-  case HC_NON_AUTHORITATIVE:
-  case HC_PARTIAL_CONTENT:
-  case HC_MULTIPLE_CHOICES:
-  case HC_MOVED_PERMANENTLY:
-  case HC_GONE:
-    return true;
-  default:
-    return false;
-  }
-}
-
-bool HttpHeaderIsEndToEnd(HttpHeader header) {
-  switch (header) {
-  case HH_CONNECTION:
-  case HH_KEEP_ALIVE:
-  case HH_PROXY_AUTHENTICATE:
-  case HH_PROXY_AUTHORIZATION:
-  case HH_PROXY_CONNECTION:  // Note part of RFC... this is non-standard header
-  case HH_TE:
-  case HH_TRAILERS:
-  case HH_TRANSFER_ENCODING:
-  case HH_UPGRADE:
-    return false;
-  default:
-    return true;
-  }
-}
-
-bool HttpHeaderIsCollapsible(HttpHeader header) {
-  switch (header) {
-  case HH_SET_COOKIE:
-  case HH_PROXY_AUTHENTICATE:
-  case HH_WWW_AUTHENTICATE:
-    return false;
-  default:
-    return true;
-  }
-}
-
-bool HttpShouldKeepAlive(const HttpData& data) {
-  std::string connection;
-  if ((data.hasHeader(HH_PROXY_CONNECTION, &connection)
-      || data.hasHeader(HH_CONNECTION, &connection))) {
-    return (_stricmp(connection.c_str(), "Keep-Alive") == 0);
-  }
-  return (data.version >= HVER_1_1);
-}
-
-namespace {
-
-inline bool IsEndOfAttributeName(size_t pos, size_t len, const char * data) {
-  if (pos >= len)
-    return true;
-  if (isspace(static_cast<unsigned char>(data[pos])))
-    return true;
-  // The reason for this complexity is that some attributes may contain trailing
-  // equal signs (like base64 tokens in Negotiate auth headers)
-  if ((pos+1 < len) && (data[pos] == '=') &&
-      !isspace(static_cast<unsigned char>(data[pos+1])) &&
-      (data[pos+1] != '=')) {
-    return true;
-  }
-  return false;
-}
-
-// TODO: unittest for EscapeAttribute and HttpComposeAttributes.
-
-std::string EscapeAttribute(const std::string& attribute) {
-  const size_t kMaxLength = attribute.length() * 2 + 1;
-  char* buffer = STACK_ARRAY(char, kMaxLength);
-  size_t len = escape(buffer, kMaxLength, attribute.data(), attribute.length(),
-                      "\"", '\\');
-  return std::string(buffer, len);
-}
-
-}  // anonymous namespace
-
-void HttpComposeAttributes(const HttpAttributeList& attributes, char separator,
-                           std::string* composed) {
-  std::stringstream ss;
-  for (size_t i=0; i<attributes.size(); ++i) {
-    if (i > 0) {
-      ss << separator << " ";
-    }
-    ss << attributes[i].first;
-    if (!attributes[i].second.empty()) {
-      ss << "=\"" << EscapeAttribute(attributes[i].second) << "\"";
-    }
-  }
-  *composed = ss.str();
-}
-
-void HttpParseAttributes(const char * data, size_t len,
-                         HttpAttributeList& attributes) {
-  size_t pos = 0;
-  while (true) {
-    // Skip leading whitespace
-    while ((pos < len) && isspace(static_cast<unsigned char>(data[pos]))) {
-      ++pos;
-    }
-
-    // End of attributes?
-    if (pos >= len)
-      return;
-
-    // Find end of attribute name
-    size_t start = pos;
-    while (!IsEndOfAttributeName(pos, len, data)) {
-      ++pos;
-    }
-
-    HttpAttribute attribute;
-    attribute.first.assign(data + start, data + pos);
-
-    // Attribute has value?
-    if ((pos < len) && (data[pos] == '=')) {
-      ++pos; // Skip '='
-      // Check if quoted value
-      if ((pos < len) && (data[pos] == '"')) {
-        while (++pos < len) {
-          if (data[pos] == '"') {
-            ++pos;
-            break;
-          }
-          if ((data[pos] == '\\') && (pos + 1 < len))
-            ++pos;
-          attribute.second.append(1, data[pos]);
-        }
-      } else {
-        while ((pos < len) &&
-            !isspace(static_cast<unsigned char>(data[pos])) &&
-            (data[pos] != ',')) {
-          attribute.second.append(1, data[pos++]);
-        }
-      }
-    }
-
-    attributes.push_back(attribute);
-    if ((pos < len) && (data[pos] == ',')) ++pos; // Skip ','
-  }
-}
-
-bool HttpHasAttribute(const HttpAttributeList& attributes,
-                      const std::string& name,
-                      std::string* value) {
-  for (HttpAttributeList::const_iterator it = attributes.begin();
-       it != attributes.end(); ++it) {
-    if (it->first == name) {
-      if (value) {
-        *value = it->second;
-      }
-      return true;
-    }
-  }
-  return false;
-}
-
-bool HttpHasNthAttribute(HttpAttributeList& attributes,
-                         size_t index,
-                         std::string* name,
-                         std::string* value) {
-  if (index >= attributes.size())
-    return false;
-
-  if (name)
-    *name = attributes[index].first;
-  if (value)
-    *value = attributes[index].second;
-  return true;
-}
-
-bool HttpDateToSeconds(const std::string& date, time_t* seconds) {
-  const char* const kTimeZones[] = {
-    "UT", "GMT", "EST", "EDT", "CST", "CDT", "MST", "MDT", "PST", "PDT",
-    "A", "B", "C", "D", "E", "F", "G", "H", "I", "K", "L", "M",
-    "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y"
-  };
-  const int kTimeZoneOffsets[] = {
-     0,  0, -5, -4, -6, -5, -7, -6, -8, -7,
-    -1, -2, -3, -4, -5, -6, -7, -8, -9, -10, -11, -12,
-     1,  2,  3,  4,  5,  6,  7,  8,  9,  10,  11,  12
-  };
-
-  RTC_DCHECK(nullptr != seconds);
-  struct tm tval;
-  memset(&tval, 0, sizeof(tval));
-  char month[4], zone[6];
-  memset(month, 0, sizeof(month));
-  memset(zone, 0, sizeof(zone));
-
-  if (7 != sscanf(date.c_str(), "%*3s, %d %3s %d %d:%d:%d %5c",
-                  &tval.tm_mday, month, &tval.tm_year,
-                  &tval.tm_hour, &tval.tm_min, &tval.tm_sec, zone)) {
-    return false;
-  }
-  switch (toupper(month[2])) {
-  case 'N': tval.tm_mon = (month[1] == 'A') ? 0 : 5; break;
-  case 'B': tval.tm_mon = 1; break;
-  case 'R': tval.tm_mon = (month[0] == 'M') ? 2 : 3; break;
-  case 'Y': tval.tm_mon = 4; break;
-  case 'L': tval.tm_mon = 6; break;
-  case 'G': tval.tm_mon = 7; break;
-  case 'P': tval.tm_mon = 8; break;
-  case 'T': tval.tm_mon = 9; break;
-  case 'V': tval.tm_mon = 10; break;
-  case 'C': tval.tm_mon = 11; break;
-  }
-  tval.tm_year -= 1900;
-  time_t gmt, non_gmt = mktime(&tval);
-  if ((zone[0] == '+') || (zone[0] == '-')) {
-    if (!isdigit(zone[1]) || !isdigit(zone[2])
-        || !isdigit(zone[3]) || !isdigit(zone[4])) {
-      return false;
-    }
-    int hours = (zone[1] - '0') * 10 + (zone[2] - '0');
-    int minutes = (zone[3] - '0') * 10 + (zone[4] - '0');
-    int offset = (hours * 60 + minutes) * 60;
-    gmt = non_gmt + ((zone[0] == '+') ? offset : -offset);
-  } else {
-    size_t zindex;
-    if (!find_string(zindex, zone, kTimeZones, arraysize(kTimeZones))) {
-      return false;
-    }
-    gmt = non_gmt + kTimeZoneOffsets[zindex] * 60 * 60;
-  }
-  // TODO: Android should support timezone, see b/2441195
-#if defined(WEBRTC_MAC) && !defined(WEBRTC_IOS) || defined(WEBRTC_ANDROID) || defined(BSD)
-  tm *tm_for_timezone = localtime(&gmt);
-  *seconds = gmt + tm_for_timezone->tm_gmtoff;
-#else
-#if defined(_MSC_VER) && _MSC_VER >= 1900
-  long timezone = 0;
-  _get_timezone(&timezone);
-#endif
-  *seconds = gmt - timezone;
-#endif
-  return true;
-}
-
-std::string HttpAddress(const SocketAddress& address, bool secure) {
-  return (address.port() == HttpDefaultPort(secure))
-          ? address.hostname() : address.ToString();
-}
-
-//////////////////////////////////////////////////////////////////////
-// HttpData
-//////////////////////////////////////////////////////////////////////
-
-HttpData::HttpData() : version(HVER_1_1) {
-}
-
-HttpData::~HttpData() = default;
-
-void
-HttpData::clear(bool release_document) {
-  // Clear headers first, since releasing a document may have far-reaching
-  // effects.
-  headers_.clear();
-  if (release_document) {
-    document.reset();
-  }
-}
-
-void
-HttpData::copy(const HttpData& src) {
-  headers_ = src.headers_;
-}
-
-void
-HttpData::changeHeader(const std::string& name, const std::string& value,
-                       HeaderCombine combine) {
-  if (combine == HC_AUTO) {
-    HttpHeader header;
-    // Unrecognized headers are collapsible
-    combine = !FromString(header, name) || HttpHeaderIsCollapsible(header)
-              ? HC_YES : HC_NO;
-  } else if (combine == HC_REPLACE) {
-    headers_.erase(name);
-    combine = HC_NO;
-  }
-  // At this point, combine is one of (YES, NO, NEW)
-  if (combine != HC_NO) {
-    HeaderMap::iterator it = headers_.find(name);
-    if (it != headers_.end()) {
-      if (combine == HC_YES) {
-        it->second.append(",");
-        it->second.append(value);
-      }
-      return;
-    }
-  }
-  headers_.insert(HeaderMap::value_type(name, value));
-}
-
-size_t HttpData::clearHeader(const std::string& name) {
-  return headers_.erase(name);
-}
-
-HttpData::iterator HttpData::clearHeader(iterator header) {
-  iterator deprecated = header++;
-  headers_.erase(deprecated);
-  return header;
-}
-
-bool
-HttpData::hasHeader(const std::string& name, std::string* value) const {
-  HeaderMap::const_iterator it = headers_.find(name);
-  if (it == headers_.end()) {
-    return false;
-  } else if (value) {
-    *value = it->second;
-  }
-  return true;
-}
-
-void HttpData::setContent(const std::string& content_type,
-                          StreamInterface* document) {
-  setHeader(HH_CONTENT_TYPE, content_type);
-  setDocumentAndLength(document);
-}
-
-void HttpData::setDocumentAndLength(StreamInterface* document) {
-  // TODO: Consider calling Rewind() here?
-  RTC_DCHECK(!hasHeader(HH_CONTENT_LENGTH, nullptr));
-  RTC_DCHECK(!hasHeader(HH_TRANSFER_ENCODING, nullptr));
-  RTC_DCHECK(document != nullptr);
-  this->document.reset(document);
-  size_t content_length = 0;
-  if (this->document->GetAvailable(&content_length)) {
-    char buffer[32];
-    sprintfn(buffer, sizeof(buffer), "%d", content_length);
-    setHeader(HH_CONTENT_LENGTH, buffer);
-  } else {
-    setHeader(HH_TRANSFER_ENCODING, "chunked");
-  }
-}
-
-//
-// HttpRequestData
-//
-
-void
-HttpRequestData::clear(bool release_document) {
-  verb = HV_GET;
-  path.clear();
-  HttpData::clear(release_document);
-}
-
-void
-HttpRequestData::copy(const HttpRequestData& src) {
-  verb = src.verb;
-  path = src.path;
-  HttpData::copy(src);
-}
-
-size_t
-HttpRequestData::formatLeader(char* buffer, size_t size) const {
-  RTC_DCHECK(path.find(' ') == std::string::npos);
-  return sprintfn(buffer, size, "%s %.*s HTTP/%s", ToString(verb), path.size(),
-                  path.data(), ToString(version));
-}
-
-HttpError
-HttpRequestData::parseLeader(const char* line, size_t len) {
-  unsigned int vmajor, vminor;
-  int vend, dstart, dend;
-  // sscanf isn't safe with strings that aren't null-terminated, and there is
-  // no guarantee that |line| is. Create a local copy that is null-terminated.
-  std::string line_str(line, len);
-  line = line_str.c_str();
-  if ((sscanf(line, "%*s%n %n%*s%n HTTP/%u.%u",
-              &vend, &dstart, &dend, &vmajor, &vminor) != 2)
-      || (vmajor != 1)) {
-    return HE_PROTOCOL;
-  }
-  if (vminor == 0) {
-    version = HVER_1_0;
-  } else if (vminor == 1) {
-    version = HVER_1_1;
-  } else {
-    return HE_PROTOCOL;
-  }
-  std::string sverb(line, vend);
-  if (!FromString(verb, sverb.c_str())) {
-    return HE_PROTOCOL; // !?! HC_METHOD_NOT_SUPPORTED?
-  }
-  path.assign(line + dstart, line + dend);
-  return HE_NONE;
-}
-
-bool HttpRequestData::getAbsoluteUri(std::string* uri) const {
-  if (HV_CONNECT == verb)
-    return false;
-  Url<char> url(path);
-  if (url.valid()) {
-    uri->assign(path);
-    return true;
-  }
-  std::string host;
-  if (!hasHeader(HH_HOST, &host))
-    return false;
-  url.set_address(host);
-  url.set_full_path(path);
-  uri->assign(url.url());
-  return url.valid();
-}
-
-bool HttpRequestData::getRelativeUri(std::string* host,
-                                     std::string* path) const
-{
-  if (HV_CONNECT == verb)
-    return false;
-  Url<char> url(this->path);
-  if (url.valid()) {
-    host->assign(url.address());
-    path->assign(url.full_path());
-    return true;
-  }
-  if (!hasHeader(HH_HOST, host))
-    return false;
-  path->assign(this->path);
-  return true;
-}
-
-//
-// HttpResponseData
-//
-
-void
-HttpResponseData::clear(bool release_document) {
-  scode = HC_INTERNAL_SERVER_ERROR;
-  message.clear();
-  HttpData::clear(release_document);
-}
-
-void
-HttpResponseData::copy(const HttpResponseData& src) {
-  scode = src.scode;
-  message = src.message;
-  HttpData::copy(src);
-}
-
-void HttpResponseData::set_success(uint32_t scode) {
-  this->scode = scode;
-  message.clear();
-  setHeader(HH_CONTENT_LENGTH, "0", false);
-}
-
-void HttpResponseData::set_success(const std::string& content_type,
-                                   StreamInterface* document,
-                                   uint32_t scode) {
-  this->scode = scode;
-  message.erase(message.begin(), message.end());
-  setContent(content_type, document);
-}
-
-void HttpResponseData::set_redirect(const std::string& location,
-                                    uint32_t scode) {
-  this->scode = scode;
-  message.clear();
-  setHeader(HH_LOCATION, location);
-  setHeader(HH_CONTENT_LENGTH, "0", false);
-}
-
-void HttpResponseData::set_error(uint32_t scode) {
-  this->scode = scode;
-  message.clear();
-  setHeader(HH_CONTENT_LENGTH, "0", false);
-}
-
-size_t
-HttpResponseData::formatLeader(char* buffer, size_t size) const {
-  size_t len = sprintfn(buffer, size, "HTTP/%s %lu", ToString(version), scode);
-  if (!message.empty()) {
-    len += sprintfn(buffer + len, size - len, " %.*s",
-                    message.size(), message.data());
-  }
-  return len;
-}
-
-HttpError
-HttpResponseData::parseLeader(const char* line, size_t len) {
-  size_t pos = 0;
-  unsigned int vmajor, vminor, temp_scode;
-  int temp_pos;
-  // sscanf isn't safe with strings that aren't null-terminated, and there is
-  // no guarantee that |line| is. Create a local copy that is null-terminated.
-  std::string line_str(line, len);
-  line = line_str.c_str();
-  if (sscanf(line, "HTTP %u%n",
-             &temp_scode, &temp_pos) == 1) {
-    // This server's response has no version. :( NOTE: This happens for every
-    // response to requests made from Chrome plugins, regardless of the server's
-    // behaviour.
-    LOG(LS_VERBOSE) << "HTTP version missing from response";
-    version = HVER_UNKNOWN;
-  } else if ((sscanf(line, "HTTP/%u.%u %u%n",
-                     &vmajor, &vminor, &temp_scode, &temp_pos) == 3)
-             && (vmajor == 1)) {
-    // This server's response does have a version.
-    if (vminor == 0) {
-      version = HVER_1_0;
-    } else if (vminor == 1) {
-      version = HVER_1_1;
-    } else {
-      return HE_PROTOCOL;
-    }
-  } else {
-    return HE_PROTOCOL;
-  }
-  scode = temp_scode;
-  pos = static_cast<size_t>(temp_pos);
-  while ((pos < len) && isspace(static_cast<unsigned char>(line[pos]))) ++pos;
-  message.assign(line + pos, len - pos);
-  return HE_NONE;
-}
-
-//////////////////////////////////////////////////////////////////////
-// Http Authentication
-//////////////////////////////////////////////////////////////////////
-
-std::string quote(const std::string& str) {
-  std::string result;
-  result.push_back('"');
-  for (size_t i=0; i<str.size(); ++i) {
-    if ((str[i] == '"') || (str[i] == '\\'))
-      result.push_back('\\');
-    result.push_back(str[i]);
-  }
-  result.push_back('"');
-  return result;
-}
-
-#if defined(WEBRTC_WIN)
-struct NegotiateAuthContext : public HttpAuthContext {
-  CredHandle cred;
-  CtxtHandle ctx;
-  size_t steps;
-  bool specified_credentials;
-
-  NegotiateAuthContext(const std::string& auth, CredHandle c1, CtxtHandle c2)
-  : HttpAuthContext(auth), cred(c1), ctx(c2), steps(0),
-    specified_credentials(false)
-  { }
-
-  virtual ~NegotiateAuthContext() {
-    DeleteSecurityContext(&ctx);
-    FreeCredentialsHandle(&cred);
-  }
-};
-#endif // WEBRTC_WIN
-
-HttpAuthResult HttpAuthenticate(
-  const char * challenge, size_t len,
-  const SocketAddress& server,
-  const std::string& method, const std::string& uri,
-  const std::string& username, const CryptString& password,
-  HttpAuthContext *& context, std::string& response, std::string& auth_method)
-{
-  HttpAttributeList args;
-  HttpParseAttributes(challenge, len, args);
-  HttpHasNthAttribute(args, 0, &auth_method, nullptr);
-
-  if (context && (context->auth_method != auth_method))
-    return HAR_IGNORE;
-
-  // BASIC
-  if (_stricmp(auth_method.c_str(), "basic") == 0) {
-    if (context)
-      return HAR_CREDENTIALS; // Bad credentials
-    if (username.empty())
-      return HAR_CREDENTIALS; // Missing credentials
-
-    context = new HttpAuthContext(auth_method);
-
-    // TODO: convert sensitive to a secure buffer that gets securely deleted
-    //std::string decoded = username + ":" + password;
-    size_t len = username.size() + password.GetLength() + 2;
-    char * sensitive = new char[len];
-    size_t pos = strcpyn(sensitive, len, username.data(), username.size());
-    pos += strcpyn(sensitive + pos, len - pos, ":");
-    password.CopyTo(sensitive + pos, true);
-
-    response = auth_method;
-    response.append(" ");
-    // TODO: create a sensitive-source version of Base64::encode
-    response.append(Base64::Encode(sensitive));
-    memset(sensitive, 0, len);
-    delete [] sensitive;
-    return HAR_RESPONSE;
-  }
-
-  // DIGEST
-  if (_stricmp(auth_method.c_str(), "digest") == 0) {
-    if (context)
-      return HAR_CREDENTIALS; // Bad credentials
-    if (username.empty())
-      return HAR_CREDENTIALS; // Missing credentials
-
-    context = new HttpAuthContext(auth_method);
-
-    std::string cnonce, ncount;
-    char buffer[256];
-    sprintf(buffer, "%d", static_cast<int>(time(0)));
-    cnonce = MD5(buffer);
-    ncount = "00000001";
-
-    std::string realm, nonce, qop, opaque;
-    HttpHasAttribute(args, "realm", &realm);
-    HttpHasAttribute(args, "nonce", &nonce);
-    bool has_qop = HttpHasAttribute(args, "qop", &qop);
-    bool has_opaque = HttpHasAttribute(args, "opaque", &opaque);
-
-    // TODO: convert sensitive to be secure buffer
-    //std::string A1 = username + ":" + realm + ":" + password;
-    size_t len = username.size() + realm.size() + password.GetLength() + 3;
-    char * sensitive = new char[len];  // A1
-    size_t pos = strcpyn(sensitive, len, username.data(), username.size());
-    pos += strcpyn(sensitive + pos, len - pos, ":");
-    pos += strcpyn(sensitive + pos, len - pos, realm.c_str());
-    pos += strcpyn(sensitive + pos, len - pos, ":");
-    password.CopyTo(sensitive + pos, true);
-
-    std::string A2 = method + ":" + uri;
-    std::string middle;
-    if (has_qop) {
-      qop = "auth";
-      middle = nonce + ":" + ncount + ":" + cnonce + ":" + qop;
-    } else {
-      middle = nonce;
-    }
-    std::string HA1 = MD5(sensitive);
-    memset(sensitive, 0, len);
-    delete [] sensitive;
-    std::string HA2 = MD5(A2);
-    std::string dig_response = MD5(HA1 + ":" + middle + ":" + HA2);
-
-    std::stringstream ss;
-    ss << auth_method;
-    ss << " username=" << quote(username);
-    ss << ", realm=" << quote(realm);
-    ss << ", nonce=" << quote(nonce);
-    ss << ", uri=" << quote(uri);
-    if (has_qop) {
-      ss << ", qop=" << qop;
-      ss << ", nc="  << ncount;
-      ss << ", cnonce=" << quote(cnonce);
-    }
-    ss << ", response=\"" << dig_response << "\"";
-    if (has_opaque) {
-      ss << ", opaque=" << quote(opaque);
-    }
-    response = ss.str();
-    return HAR_RESPONSE;
-  }
-
-#if defined(WEBRTC_WIN)
-#if 1
-  bool want_negotiate = (_stricmp(auth_method.c_str(), "negotiate") == 0);
-  bool want_ntlm = (_stricmp(auth_method.c_str(), "ntlm") == 0);
-  // SPNEGO & NTLM
-  if (want_negotiate || want_ntlm) {
-    const size_t MAX_MESSAGE = 12000, MAX_SPN = 256;
-    char out_buf[MAX_MESSAGE], spn[MAX_SPN];
-
-#if 0 // Requires funky windows versions
-    DWORD len = MAX_SPN;
-    if (DsMakeSpn("HTTP", server.HostAsURIString().c_str(), nullptr,
-                  server.port(),
-                  0, &len, spn) != ERROR_SUCCESS) {
-      LOG_F(WARNING) << "(Negotiate) - DsMakeSpn failed";
-      return HAR_IGNORE;
-    }
-#else
-    sprintfn(spn, MAX_SPN, "HTTP/%s", server.ToString().c_str());
-#endif
-
-    SecBuffer out_sec;
-    out_sec.pvBuffer   = out_buf;
-    out_sec.cbBuffer   = sizeof(out_buf);
-    out_sec.BufferType = SECBUFFER_TOKEN;
-
-    SecBufferDesc out_buf_desc;
-    out_buf_desc.ulVersion = 0;
-    out_buf_desc.cBuffers  = 1;
-    out_buf_desc.pBuffers  = &out_sec;
-
-    const ULONG NEG_FLAGS_DEFAULT =
-      //ISC_REQ_ALLOCATE_MEMORY
-      ISC_REQ_CONFIDENTIALITY
-      //| ISC_REQ_EXTENDED_ERROR
-      //| ISC_REQ_INTEGRITY
-      | ISC_REQ_REPLAY_DETECT
-      | ISC_REQ_SEQUENCE_DETECT
-      //| ISC_REQ_STREAM
-      //| ISC_REQ_USE_SUPPLIED_CREDS
-      ;
-
-    ::TimeStamp lifetime;
-    SECURITY_STATUS ret = S_OK;
-    ULONG ret_flags = 0, flags = NEG_FLAGS_DEFAULT;
-
-    bool specify_credentials = !username.empty();
-    size_t steps = 0;
-
-    // uint32_t now = Time();
-
-    NegotiateAuthContext * neg = static_cast<NegotiateAuthContext *>(context);
-    if (neg) {
-      const size_t max_steps = 10;
-      if (++neg->steps >= max_steps) {
-        LOG(WARNING) << "AsyncHttpsProxySocket::Authenticate(Negotiate) too many retries";
-        return HAR_ERROR;
-      }
-      steps = neg->steps;
-
-      std::string challenge, decoded_challenge;
-      if (HttpHasNthAttribute(args, 1, &challenge, nullptr) &&
-          Base64::Decode(challenge, Base64::DO_STRICT, &decoded_challenge,
-                         nullptr)) {
-        SecBuffer in_sec;
-        in_sec.pvBuffer   = const_cast<char *>(decoded_challenge.data());
-        in_sec.cbBuffer   = static_cast<unsigned long>(decoded_challenge.size());
-        in_sec.BufferType = SECBUFFER_TOKEN;
-
-        SecBufferDesc in_buf_desc;
-        in_buf_desc.ulVersion = 0;
-        in_buf_desc.cBuffers  = 1;
-        in_buf_desc.pBuffers  = &in_sec;
-
-        ret = InitializeSecurityContextA(&neg->cred, &neg->ctx, spn, flags, 0, SECURITY_NATIVE_DREP, &in_buf_desc, 0, &neg->ctx, &out_buf_desc, &ret_flags, &lifetime);
-        //LOG(INFO) << "$$$ InitializeSecurityContext @ " << TimeSince(now);
-        if (FAILED(ret)) {
-          LOG(LS_ERROR) << "InitializeSecurityContext returned: "
-                      << ErrorName(ret, SECURITY_ERRORS);
-          return HAR_ERROR;
-        }
-      } else if (neg->specified_credentials) {
-        // Try again with default credentials
-        specify_credentials = false;
-        delete context;
-        context = neg = 0;
-      } else {
-        return HAR_CREDENTIALS;
-      }
-    }
-
-    if (!neg) {
-      unsigned char userbuf[256], passbuf[256], domainbuf[16];
-      SEC_WINNT_AUTH_IDENTITY_A auth_id, * pauth_id = 0;
-      if (specify_credentials) {
-        memset(&auth_id, 0, sizeof(auth_id));
-        size_t len = password.GetLength()+1;
-        char * sensitive = new char[len];
-        password.CopyTo(sensitive, true);
-        std::string::size_type pos = username.find('\\');
-        if (pos == std::string::npos) {
-          auth_id.UserLength = static_cast<unsigned long>(
-              std::min(sizeof(userbuf) - 1, username.size()));
-          memcpy(userbuf, username.c_str(), auth_id.UserLength);
-          userbuf[auth_id.UserLength] = 0;
-          auth_id.DomainLength = 0;
-          domainbuf[auth_id.DomainLength] = 0;
-          auth_id.PasswordLength = static_cast<unsigned long>(
-              std::min(sizeof(passbuf) - 1, password.GetLength()));
-          memcpy(passbuf, sensitive, auth_id.PasswordLength);
-          passbuf[auth_id.PasswordLength] = 0;
-        } else {
-          auth_id.UserLength = static_cast<unsigned long>(
-              std::min(sizeof(userbuf) - 1, username.size() - pos - 1));
-          memcpy(userbuf, username.c_str() + pos + 1, auth_id.UserLength);
-          userbuf[auth_id.UserLength] = 0;
-          auth_id.DomainLength =
-              static_cast<unsigned long>(std::min(sizeof(domainbuf) - 1, pos));
-          memcpy(domainbuf, username.c_str(), auth_id.DomainLength);
-          domainbuf[auth_id.DomainLength] = 0;
-          auth_id.PasswordLength = static_cast<unsigned long>(
-              std::min(sizeof(passbuf) - 1, password.GetLength()));
-          memcpy(passbuf, sensitive, auth_id.PasswordLength);
-          passbuf[auth_id.PasswordLength] = 0;
-        }
-        memset(sensitive, 0, len);
-        delete [] sensitive;
-        auth_id.User = userbuf;
-        auth_id.Domain = domainbuf;
-        auth_id.Password = passbuf;
-        auth_id.Flags = SEC_WINNT_AUTH_IDENTITY_ANSI;
-        pauth_id = &auth_id;
-        LOG(LS_VERBOSE) << "Negotiate protocol: Using specified credentials";
-      } else {
-        LOG(LS_VERBOSE) << "Negotiate protocol: Using default credentials";
-      }
-
-      CredHandle cred;
-      ret = AcquireCredentialsHandleA(
-          0, const_cast<char*>(want_negotiate ? NEGOSSP_NAME_A : NTLMSP_NAME_A),
-          SECPKG_CRED_OUTBOUND, 0, pauth_id, 0, 0, &cred, &lifetime);
-      //LOG(INFO) << "$$$ AcquireCredentialsHandle @ " << TimeSince(now);
-      if (ret != SEC_E_OK) {
-        LOG(LS_ERROR) << "AcquireCredentialsHandle error: "
-                    << ErrorName(ret, SECURITY_ERRORS);
-        return HAR_IGNORE;
-      }
-
-      //CSecBufferBundle<5, CSecBufferBase::FreeSSPI> sb_out;
-
-      CtxtHandle ctx;
-      ret = InitializeSecurityContextA(&cred, 0, spn, flags, 0, SECURITY_NATIVE_DREP, 0, 0, &ctx, &out_buf_desc, &ret_flags, &lifetime);
-      //LOG(INFO) << "$$$ InitializeSecurityContext @ " << TimeSince(now);
-      if (FAILED(ret)) {
-        LOG(LS_ERROR) << "InitializeSecurityContext returned: "
-                    << ErrorName(ret, SECURITY_ERRORS);
-        FreeCredentialsHandle(&cred);
-        return HAR_IGNORE;
-      }
-
-      RTC_DCHECK(!context);
-      context = neg = new NegotiateAuthContext(auth_method, cred, ctx);
-      neg->specified_credentials = specify_credentials;
-      neg->steps = steps;
-    }
-
-    if ((ret == SEC_I_COMPLETE_NEEDED) || (ret == SEC_I_COMPLETE_AND_CONTINUE)) {
-      ret = CompleteAuthToken(&neg->ctx, &out_buf_desc);
-      //LOG(INFO) << "$$$ CompleteAuthToken @ " << TimeSince(now);
-      LOG(LS_VERBOSE) << "CompleteAuthToken returned: "
-                      << ErrorName(ret, SECURITY_ERRORS);
-      if (FAILED(ret)) {
-        return HAR_ERROR;
-      }
-    }
-
-    //LOG(INFO) << "$$$ NEGOTIATE took " << TimeSince(now) << "ms";
-
-    std::string decoded(out_buf, out_buf + out_sec.cbBuffer);
-    response = auth_method;
-    response.append(" ");
-    response.append(Base64::Encode(decoded));
-    return HAR_RESPONSE;
-  }
-#endif
-#endif // WEBRTC_WIN
-
-  return HAR_IGNORE;
-}
-
-//////////////////////////////////////////////////////////////////////
-
-} // namespace rtc
diff --git a/rtc_base/httpcommon.h b/rtc_base/httpcommon.h
deleted file mode 100644
index bb96f98..0000000
--- a/rtc_base/httpcommon.h
+++ /dev/null
@@ -1,458 +0,0 @@
-/*
- *  Copyright 2004 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_RTC_BASE_HTTPCOMMON_H_
-#define WEBRTC_RTC_BASE_HTTPCOMMON_H_
-
-#include <map>
-#include <memory>
-#include <string>
-#include <vector>
-#include "webrtc/rtc_base/basictypes.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/stream.h"
-#include "webrtc/rtc_base/stringutils.h"
-
-namespace rtc {
-
-class CryptString;
-class SocketAddress;
-
-//////////////////////////////////////////////////////////////////////
-// Constants
-//////////////////////////////////////////////////////////////////////
-
-enum HttpCode {
-  HC_OK = 200,
-  HC_NON_AUTHORITATIVE = 203,
-  HC_NO_CONTENT = 204,
-  HC_PARTIAL_CONTENT = 206,
-
-  HC_MULTIPLE_CHOICES = 300,
-  HC_MOVED_PERMANENTLY = 301,
-  HC_FOUND = 302,
-  HC_SEE_OTHER = 303,
-  HC_NOT_MODIFIED = 304,
-  HC_MOVED_TEMPORARILY = 307,
-
-  HC_BAD_REQUEST = 400,
-  HC_UNAUTHORIZED = 401,
-  HC_FORBIDDEN = 403,
-  HC_NOT_FOUND = 404,
-  HC_PROXY_AUTHENTICATION_REQUIRED = 407,
-  HC_GONE = 410,
-
-  HC_INTERNAL_SERVER_ERROR = 500,
-  HC_NOT_IMPLEMENTED = 501,
-  HC_SERVICE_UNAVAILABLE = 503,
-};
-
-enum HttpVersion {
-  HVER_1_0, HVER_1_1, HVER_UNKNOWN,
-  HVER_LAST = HVER_UNKNOWN
-};
-
-enum HttpVerb {
-  HV_GET, HV_POST, HV_PUT, HV_DELETE, HV_CONNECT, HV_HEAD,
-  HV_LAST = HV_HEAD
-};
-
-enum HttpError {
-  HE_NONE,
-  HE_PROTOCOL,            // Received non-valid HTTP data
-  HE_DISCONNECTED,        // Connection closed unexpectedly
-  HE_OVERFLOW,            // Received too much data for internal buffers
-  HE_CONNECT_FAILED,      // The socket failed to connect.
-  HE_SOCKET_ERROR,        // An error occurred on a connected socket
-  HE_SHUTDOWN,            // Http object is being destroyed
-  HE_OPERATION_CANCELLED, // Connection aborted locally
-  HE_AUTH,                // Proxy Authentication Required
-  HE_CERTIFICATE_EXPIRED, // During SSL negotiation
-  HE_STREAM,              // Problem reading or writing to the document
-  HE_CACHE,               // Problem reading from cache
-  HE_DEFAULT
-};
-
-enum HttpHeader {
-  HH_AGE,
-  HH_CACHE_CONTROL,
-  HH_CONNECTION,
-  HH_CONTENT_DISPOSITION,
-  HH_CONTENT_LENGTH,
-  HH_CONTENT_RANGE,
-  HH_CONTENT_TYPE,
-  HH_COOKIE,
-  HH_DATE,
-  HH_ETAG,
-  HH_EXPIRES,
-  HH_HOST,
-  HH_IF_MODIFIED_SINCE,
-  HH_IF_NONE_MATCH,
-  HH_KEEP_ALIVE,
-  HH_LAST_MODIFIED,
-  HH_LOCATION,
-  HH_PROXY_AUTHENTICATE,
-  HH_PROXY_AUTHORIZATION,
-  HH_PROXY_CONNECTION,
-  HH_RANGE,
-  HH_SET_COOKIE,
-  HH_TE,
-  HH_TRAILERS,
-  HH_TRANSFER_ENCODING,
-  HH_UPGRADE,
-  HH_USER_AGENT,
-  HH_WWW_AUTHENTICATE,
-  HH_LAST = HH_WWW_AUTHENTICATE
-};
-
-const uint16_t HTTP_DEFAULT_PORT = 80;
-const uint16_t HTTP_SECURE_PORT = 443;
-
-//////////////////////////////////////////////////////////////////////
-// Utility Functions
-//////////////////////////////////////////////////////////////////////
-
-inline HttpError mkerr(HttpError err, HttpError def_err = HE_DEFAULT) {
-  return (err != HE_NONE) ? err : def_err;
-}
-
-const char* ToString(HttpVersion version);
-bool FromString(HttpVersion& version, const std::string& str);
-
-const char* ToString(HttpVerb verb);
-bool FromString(HttpVerb& verb, const std::string& str);
-
-const char* ToString(HttpHeader header);
-bool FromString(HttpHeader& header, const std::string& str);
-
-inline bool HttpCodeIsInformational(uint32_t code) {
-  return ((code / 100) == 1);
-}
-inline bool HttpCodeIsSuccessful(uint32_t code) {
-  return ((code / 100) == 2);
-}
-inline bool HttpCodeIsRedirection(uint32_t code) {
-  return ((code / 100) == 3);
-}
-inline bool HttpCodeIsClientError(uint32_t code) {
-  return ((code / 100) == 4);
-}
-inline bool HttpCodeIsServerError(uint32_t code) {
-  return ((code / 100) == 5);
-}
-
-bool HttpCodeHasBody(uint32_t code);
-bool HttpCodeIsCacheable(uint32_t code);
-bool HttpHeaderIsEndToEnd(HttpHeader header);
-bool HttpHeaderIsCollapsible(HttpHeader header);
-
-struct HttpData;
-bool HttpShouldKeepAlive(const HttpData& data);
-
-typedef std::pair<std::string, std::string> HttpAttribute;
-typedef std::vector<HttpAttribute> HttpAttributeList;
-void HttpComposeAttributes(const HttpAttributeList& attributes, char separator,
-                           std::string* composed);
-void HttpParseAttributes(const char * data, size_t len,
-                         HttpAttributeList& attributes);
-bool HttpHasAttribute(const HttpAttributeList& attributes,
-                      const std::string& name,
-                      std::string* value);
-bool HttpHasNthAttribute(HttpAttributeList& attributes,
-                         size_t index,
-                         std::string* name,
-                         std::string* value);
-
-// Convert RFC1123 date (DoW, DD Mon YYYY HH:MM:SS TZ) to unix timestamp
-bool HttpDateToSeconds(const std::string& date, time_t* seconds);
-
-inline uint16_t HttpDefaultPort(bool secure) {
-  return secure ? HTTP_SECURE_PORT : HTTP_DEFAULT_PORT;
-}
-
-// Returns the http server notation for a given address
-std::string HttpAddress(const SocketAddress& address, bool secure);
-
-// functional for insensitive std::string compare
-struct iless {
-  bool operator()(const std::string& lhs, const std::string& rhs) const {
-    return (::_stricmp(lhs.c_str(), rhs.c_str()) < 0);
-  }
-};
-
-// put quotes around a string and escape any quotes inside it
-std::string quote(const std::string& str);
-
-//////////////////////////////////////////////////////////////////////
-// Url
-//////////////////////////////////////////////////////////////////////
-
-template<class CTYPE>
-class Url {
-public:
-  typedef typename Traits<CTYPE>::string string;
-
-  // TODO: Implement Encode/Decode
-  static int Encode(const CTYPE* source, CTYPE* destination, size_t len);
-  static int Encode(const string& source, string& destination);
-  static int Decode(const CTYPE* source, CTYPE* destination, size_t len);
-  static int Decode(const string& source, string& destination);
-
-  Url(const string& url) { do_set_url(url.c_str(), url.size()); }
-  Url(const string& path, const string& host, uint16_t port = HTTP_DEFAULT_PORT)
-      : host_(host), port_(port), secure_(HTTP_SECURE_PORT == port) {
-    set_full_path(path);
-  }
-
-  bool valid() const { return !host_.empty(); }
-  void clear() {
-    host_.clear();
-    port_ = HTTP_DEFAULT_PORT;
-    secure_ = false;
-    path_.assign(1, static_cast<CTYPE>('/'));
-    query_.clear();
-  }
-
-  void set_url(const string& val) {
-    do_set_url(val.c_str(), val.size());
-  }
-  string url() const {
-    string val; do_get_url(&val); return val;
-  }
-
-  void set_address(const string& val) {
-    do_set_address(val.c_str(), val.size());
-  }
-  string address() const {
-    string val; do_get_address(&val); return val;
-  }
-
-  void set_full_path(const string& val) {
-    do_set_full_path(val.c_str(), val.size());
-  }
-  string full_path() const {
-    string val; do_get_full_path(&val); return val;
-  }
-
-  void set_host(const string& val) { host_ = val; }
-  const string& host() const { return host_; }
-
-  void set_port(uint16_t val) { port_ = val; }
-  uint16_t port() const { return port_; }
-
-  void set_secure(bool val) { secure_ = val; }
-  bool secure() const { return secure_; }
-
-  void set_path(const string& val) {
-    if (val.empty()) {
-      path_.assign(1, static_cast<CTYPE>('/'));
-    } else {
-      RTC_DCHECK(val[0] == static_cast<CTYPE>('/'));
-      path_ = val;
-    }
-  }
-  const string& path() const { return path_; }
-
-  void set_query(const string& val) {
-    RTC_DCHECK(val.empty() || (val[0] == static_cast<CTYPE>('?')));
-    query_ = val;
-  }
-  const string& query() const { return query_; }
-
-  bool get_attribute(const string& name, string* value) const;
-
-private:
-  void do_set_url(const CTYPE* val, size_t len);
-  void do_set_address(const CTYPE* val, size_t len);
-  void do_set_full_path(const CTYPE* val, size_t len);
-
-  void do_get_url(string* val) const;
-  void do_get_address(string* val) const;
-  void do_get_full_path(string* val) const;
-
-  string host_, path_, query_;
-  uint16_t port_;
-  bool secure_;
-};
-
-//////////////////////////////////////////////////////////////////////
-// HttpData
-//////////////////////////////////////////////////////////////////////
-
-struct HttpData {
-  typedef std::multimap<std::string, std::string, iless> HeaderMap;
-  typedef HeaderMap::const_iterator const_iterator;
-  typedef HeaderMap::iterator iterator;
-
-  HttpVersion version;
-  std::unique_ptr<StreamInterface> document;
-
-  HttpData();
-
-  enum HeaderCombine { HC_YES, HC_NO, HC_AUTO, HC_REPLACE, HC_NEW };
-  void changeHeader(const std::string& name, const std::string& value,
-                    HeaderCombine combine);
-  inline void addHeader(const std::string& name, const std::string& value,
-                        bool append = true) {
-    changeHeader(name, value, append ? HC_AUTO : HC_NO);
-  }
-  inline void setHeader(const std::string& name, const std::string& value,
-                        bool overwrite = true) {
-    changeHeader(name, value, overwrite ? HC_REPLACE : HC_NEW);
-  }
-  // Returns count of erased headers
-  size_t clearHeader(const std::string& name);
-  // Returns iterator to next header
-  iterator clearHeader(iterator header);
-
-  // keep in mind, this may not do what you want in the face of multiple headers
-  bool hasHeader(const std::string& name, std::string* value) const;
-
-  inline const_iterator begin() const {
-    return headers_.begin();
-  }
-  inline const_iterator end() const {
-    return headers_.end();
-  }
-  inline iterator begin() {
-    return headers_.begin();
-  }
-  inline iterator end() {
-    return headers_.end();
-  }
-  inline const_iterator begin(const std::string& name) const {
-    return headers_.lower_bound(name);
-  }
-  inline const_iterator end(const std::string& name) const {
-    return headers_.upper_bound(name);
-  }
-  inline iterator begin(const std::string& name) {
-    return headers_.lower_bound(name);
-  }
-  inline iterator end(const std::string& name) {
-    return headers_.upper_bound(name);
-  }
-
-  // Convenience methods using HttpHeader
-  inline void changeHeader(HttpHeader header, const std::string& value,
-                           HeaderCombine combine) {
-    changeHeader(ToString(header), value, combine);
-  }
-  inline void addHeader(HttpHeader header, const std::string& value,
-                        bool append = true) {
-    addHeader(ToString(header), value, append);
-  }
-  inline void setHeader(HttpHeader header, const std::string& value,
-                        bool overwrite = true) {
-    setHeader(ToString(header), value, overwrite);
-  }
-  inline void clearHeader(HttpHeader header) {
-    clearHeader(ToString(header));
-  }
-  inline bool hasHeader(HttpHeader header, std::string* value) const {
-    return hasHeader(ToString(header), value);
-  }
-  inline const_iterator begin(HttpHeader header) const {
-    return headers_.lower_bound(ToString(header));
-  }
-  inline const_iterator end(HttpHeader header) const {
-    return headers_.upper_bound(ToString(header));
-  }
-  inline iterator begin(HttpHeader header) {
-    return headers_.lower_bound(ToString(header));
-  }
-  inline iterator end(HttpHeader header) {
-    return headers_.upper_bound(ToString(header));
-  }
-
-  void setContent(const std::string& content_type, StreamInterface* document);
-  void setDocumentAndLength(StreamInterface* document);
-
-  virtual size_t formatLeader(char* buffer, size_t size) const = 0;
-  virtual HttpError parseLeader(const char* line, size_t len) = 0;
-
-protected:
- virtual ~HttpData();
-  void clear(bool release_document);
-  void copy(const HttpData& src);
-
-private:
-  HeaderMap headers_;
-};
-
-struct HttpRequestData : public HttpData {
-  HttpVerb verb;
-  std::string path;
-
-  HttpRequestData() : verb(HV_GET) { }
-
-  void clear(bool release_document);
-  void copy(const HttpRequestData& src);
-
-  size_t formatLeader(char* buffer, size_t size) const override;
-  HttpError parseLeader(const char* line, size_t len) override;
-
-  bool getAbsoluteUri(std::string* uri) const;
-  bool getRelativeUri(std::string* host, std::string* path) const;
-};
-
-struct HttpResponseData : public HttpData {
-  uint32_t scode;
-  std::string message;
-
-  HttpResponseData() : scode(HC_INTERNAL_SERVER_ERROR) { }
-  void clear(bool release_document);
-  void copy(const HttpResponseData& src);
-
-  // Convenience methods
-  void set_success(uint32_t scode = HC_OK);
-  void set_success(const std::string& content_type,
-                   StreamInterface* document,
-                   uint32_t scode = HC_OK);
-  void set_redirect(const std::string& location,
-                    uint32_t scode = HC_MOVED_TEMPORARILY);
-  void set_error(uint32_t scode);
-
-  size_t formatLeader(char* buffer, size_t size) const override;
-  HttpError parseLeader(const char* line, size_t len) override;
-};
-
-struct HttpTransaction {
-  HttpRequestData request;
-  HttpResponseData response;
-};
-
-//////////////////////////////////////////////////////////////////////
-// Http Authentication
-//////////////////////////////////////////////////////////////////////
-
-struct HttpAuthContext {
-  std::string auth_method;
-  HttpAuthContext(const std::string& auth) : auth_method(auth) { }
-  virtual ~HttpAuthContext() { }
-};
-
-enum HttpAuthResult { HAR_RESPONSE, HAR_IGNORE, HAR_CREDENTIALS, HAR_ERROR };
-
-// 'context' is used by this function to record information between calls.
-// Start by passing a null pointer, then pass the same pointer each additional
-// call.  When the authentication attempt is finished, delete the context.
-HttpAuthResult HttpAuthenticate(
-  const char * challenge, size_t len,
-  const SocketAddress& server,
-  const std::string& method, const std::string& uri,
-  const std::string& username, const CryptString& password,
-  HttpAuthContext *& context, std::string& response, std::string& auth_method);
-
-//////////////////////////////////////////////////////////////////////
-
-} // namespace rtc
-
-#endif // WEBRTC_RTC_BASE_HTTPCOMMON_H_
diff --git a/rtc_base/httpcommon_unittest.cc b/rtc_base/httpcommon_unittest.cc
deleted file mode 100644
index 2a4fe65..0000000
--- a/rtc_base/httpcommon_unittest.cc
+++ /dev/null
@@ -1,165 +0,0 @@
-/*
- *  Copyright 2004 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/rtc_base/httpcommon.h"
-#include "webrtc/rtc_base/gunit.h"
-#include "webrtc/rtc_base/httpcommon-inl.h"
-
-namespace rtc {
-
-#define TEST_PROTOCOL "http://"
-#define TEST_HOST "www.google.com"
-#define TEST_PATH "/folder/file.html"
-#define TEST_QUERY "?query=x&attr=y"
-#define TEST_URL TEST_PROTOCOL TEST_HOST TEST_PATH TEST_QUERY
-
-TEST(Url, DecomposesUrls) {
-  Url<char> url(TEST_URL);
-  EXPECT_TRUE(url.valid());
-  EXPECT_FALSE(url.secure());
-  EXPECT_STREQ(TEST_HOST, url.host().c_str());
-  EXPECT_EQ(80, url.port());
-  EXPECT_STREQ(TEST_PATH, url.path().c_str());
-  EXPECT_STREQ(TEST_QUERY, url.query().c_str());
-  EXPECT_STREQ(TEST_HOST, url.address().c_str());
-  EXPECT_STREQ(TEST_PATH TEST_QUERY, url.full_path().c_str());
-  EXPECT_STREQ(TEST_URL, url.url().c_str());
-}
-
-TEST(Url, ComposesUrls) {
-  // Set in constructor
-  Url<char> url(TEST_PATH TEST_QUERY, TEST_HOST, 80);
-  EXPECT_TRUE(url.valid());
-  EXPECT_FALSE(url.secure());
-  EXPECT_STREQ(TEST_HOST, url.host().c_str());
-  EXPECT_EQ(80, url.port());
-  EXPECT_STREQ(TEST_PATH, url.path().c_str());
-  EXPECT_STREQ(TEST_QUERY, url.query().c_str());
-  EXPECT_STREQ(TEST_HOST, url.address().c_str());
-  EXPECT_STREQ(TEST_PATH TEST_QUERY, url.full_path().c_str());
-  EXPECT_STREQ(TEST_URL, url.url().c_str());
-
-  url.clear();
-  EXPECT_FALSE(url.valid());
-  EXPECT_FALSE(url.secure());
-  EXPECT_STREQ("", url.host().c_str());
-  EXPECT_EQ(80, url.port());
-  EXPECT_STREQ("/", url.path().c_str());
-  EXPECT_STREQ("", url.query().c_str());
-
-  // Set component-wise
-  url.set_host(TEST_HOST);
-  url.set_port(80);
-  url.set_path(TEST_PATH);
-  url.set_query(TEST_QUERY);
-  EXPECT_TRUE(url.valid());
-  EXPECT_FALSE(url.secure());
-  EXPECT_STREQ(TEST_HOST, url.host().c_str());
-  EXPECT_EQ(80, url.port());
-  EXPECT_STREQ(TEST_PATH, url.path().c_str());
-  EXPECT_STREQ(TEST_QUERY, url.query().c_str());
-  EXPECT_STREQ(TEST_HOST, url.address().c_str());
-  EXPECT_STREQ(TEST_PATH TEST_QUERY, url.full_path().c_str());
-  EXPECT_STREQ(TEST_URL, url.url().c_str());
-}
-
-TEST(Url, EnsuresNonEmptyPath) {
-  Url<char> url(TEST_PROTOCOL TEST_HOST);
-  EXPECT_TRUE(url.valid());
-  EXPECT_STREQ("/", url.path().c_str());
-
-  url.clear();
-  EXPECT_STREQ("/", url.path().c_str());
-  url.set_path("");
-  EXPECT_STREQ("/", url.path().c_str());
-
-  url.clear();
-  EXPECT_STREQ("/", url.path().c_str());
-  url.set_full_path("");
-  EXPECT_STREQ("/", url.path().c_str());
-}
-
-TEST(Url, GetQueryAttributes) {
-  Url<char> url(TEST_URL);
-  std::string value;
-  EXPECT_TRUE(url.get_attribute("query", &value));
-  EXPECT_STREQ("x", value.c_str());
-  value.clear();
-  EXPECT_TRUE(url.get_attribute("attr", &value));
-  EXPECT_STREQ("y", value.c_str());
-  value.clear();
-  EXPECT_FALSE(url.get_attribute("Query", &value));
-  EXPECT_TRUE(value.empty());
-}
-
-TEST(Url, SkipsUserAndPassword) {
-  Url<char> url("https://mail.google.com:pwd@badsite.com:12345/asdf");
-  EXPECT_TRUE(url.valid());
-  EXPECT_TRUE(url.secure());
-  EXPECT_STREQ("badsite.com", url.host().c_str());
-  EXPECT_EQ(12345, url.port());
-  EXPECT_STREQ("/asdf", url.path().c_str());
-  EXPECT_STREQ("badsite.com:12345", url.address().c_str());
-}
-
-TEST(Url, SkipsUser) {
-  Url<char> url("https://mail.google.com@badsite.com:12345/asdf");
-  EXPECT_TRUE(url.valid());
-  EXPECT_TRUE(url.secure());
-  EXPECT_STREQ("badsite.com", url.host().c_str());
-  EXPECT_EQ(12345, url.port());
-  EXPECT_STREQ("/asdf", url.path().c_str());
-  EXPECT_STREQ("badsite.com:12345", url.address().c_str());
-}
-
-TEST(HttpResponseData, parseLeaderHttp1_0) {
-  static const char kResponseString[] = "HTTP/1.0 200 OK";
-  HttpResponseData response;
-  EXPECT_EQ(HE_NONE, response.parseLeader(kResponseString,
-                                          sizeof(kResponseString) - 1));
-  EXPECT_EQ(HVER_1_0, response.version);
-  EXPECT_EQ(200U, response.scode);
-}
-
-TEST(HttpResponseData, parseLeaderHttp1_1) {
-  static const char kResponseString[] = "HTTP/1.1 200 OK";
-  HttpResponseData response;
-  EXPECT_EQ(HE_NONE, response.parseLeader(kResponseString,
-                                          sizeof(kResponseString) - 1));
-  EXPECT_EQ(HVER_1_1, response.version);
-  EXPECT_EQ(200U, response.scode);
-}
-
-TEST(HttpResponseData, parseLeaderHttpUnknown) {
-  static const char kResponseString[] = "HTTP 200 OK";
-  HttpResponseData response;
-  EXPECT_EQ(HE_NONE, response.parseLeader(kResponseString,
-                                          sizeof(kResponseString) - 1));
-  EXPECT_EQ(HVER_UNKNOWN, response.version);
-  EXPECT_EQ(200U, response.scode);
-}
-
-TEST(HttpResponseData, parseLeaderHttpFailure) {
-  static const char kResponseString[] = "HTTP/1.1 503 Service Unavailable";
-  HttpResponseData response;
-  EXPECT_EQ(HE_NONE, response.parseLeader(kResponseString,
-                                          sizeof(kResponseString) - 1));
-  EXPECT_EQ(HVER_1_1, response.version);
-  EXPECT_EQ(503U, response.scode);
-}
-
-TEST(HttpResponseData, parseLeaderHttpInvalid) {
-  static const char kResponseString[] = "Durrrrr, what's HTTP?";
-  HttpResponseData response;
-  EXPECT_EQ(HE_PROTOCOL, response.parseLeader(kResponseString,
-                                              sizeof(kResponseString) - 1));
-}
-
-} // namespace rtc
diff --git a/rtc_base/httpserver.cc b/rtc_base/httpserver.cc
deleted file mode 100644
index 9d7aafd..0000000
--- a/rtc_base/httpserver.cc
+++ /dev/null
@@ -1,288 +0,0 @@
-/*
- *  Copyright 2004 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 <algorithm>
-
-#include "webrtc/rtc_base/httpcommon-inl.h"
-
-#include "webrtc/rtc_base/asyncsocket.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/httpserver.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/socketstream.h"
-#include "webrtc/rtc_base/thread.h"
-
-namespace rtc {
-
-///////////////////////////////////////////////////////////////////////////////
-// HttpServer
-///////////////////////////////////////////////////////////////////////////////
-
-HttpServer::HttpServer() : next_connection_id_(1), closing_(false) {
-}
-
-HttpServer::~HttpServer() {
-  if (closing_) {
-    LOG(LS_WARNING) << "HttpServer::CloseAll has not completed";
-  }
-  for (ConnectionMap::iterator it = connections_.begin();
-       it != connections_.end();
-       ++it) {
-    StreamInterface* stream = it->second->EndProcess();
-    delete stream;
-    delete it->second;
-  }
-}
-
-int
-HttpServer::HandleConnection(StreamInterface* stream) {
-  int connection_id = next_connection_id_++;
-  RTC_DCHECK(connection_id != HTTP_INVALID_CONNECTION_ID);
-  Connection* connection = new Connection(connection_id, this);
-  connections_.insert(ConnectionMap::value_type(connection_id, connection));
-  connection->BeginProcess(stream);
-  return connection_id;
-}
-
-void
-HttpServer::Respond(HttpServerTransaction* transaction) {
-  int connection_id = transaction->connection_id();
-  if (Connection* connection = Find(connection_id)) {
-    connection->Respond(transaction);
-  } else {
-    delete transaction;
-    // We may be tempted to SignalHttpComplete, but that implies that a
-    // connection still exists.
-  }
-}
-
-void
-HttpServer::Close(int connection_id, bool force) {
-  if (Connection* connection = Find(connection_id)) {
-    connection->InitiateClose(force);
-  }
-}
-
-void
-HttpServer::CloseAll(bool force) {
-  if (connections_.empty()) {
-    SignalCloseAllComplete(this);
-    return;
-  }
-  closing_ = true;
-  std::list<Connection*> connections;
-  for (ConnectionMap::const_iterator it = connections_.begin();
-       it != connections_.end(); ++it) {
-    connections.push_back(it->second);
-  }
-  for (std::list<Connection*>::const_iterator it = connections.begin();
-      it != connections.end(); ++it) {
-    (*it)->InitiateClose(force);
-  }
-}
-
-HttpServer::Connection*
-HttpServer::Find(int connection_id) {
-  ConnectionMap::iterator it = connections_.find(connection_id);
-  if (it == connections_.end())
-    return nullptr;
-  return it->second;
-}
-
-void
-HttpServer::Remove(int connection_id) {
-  ConnectionMap::iterator it = connections_.find(connection_id);
-  if (it == connections_.end()) {
-    RTC_NOTREACHED();
-    return;
-  }
-  Connection* connection = it->second;
-  connections_.erase(it);
-  SignalConnectionClosed(this, connection_id, connection->EndProcess());
-  delete connection;
-  if (closing_ && connections_.empty()) {
-    closing_ = false;
-    SignalCloseAllComplete(this);
-  }
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// HttpServer::Connection
-///////////////////////////////////////////////////////////////////////////////
-
-HttpServer::Connection::Connection(int connection_id, HttpServer* server)
-    : connection_id_(connection_id),
-      server_(server),
-      current_(nullptr),
-      signalling_(false),
-      close_(false) {}
-
-HttpServer::Connection::~Connection() {
-  // It's possible that an object hosted inside this transaction signalled
-  // an event which caused the connection to close.
-  Thread::Current()->Dispose(current_);
-}
-
-void
-HttpServer::Connection::BeginProcess(StreamInterface* stream) {
-  base_.notify(this);
-  base_.attach(stream);
-  current_ = new HttpServerTransaction(connection_id_);
-  if (base_.mode() != HM_CONNECT)
-    base_.recv(&current_->request);
-}
-
-StreamInterface*
-HttpServer::Connection::EndProcess() {
-  base_.notify(nullptr);
-  base_.abort(HE_DISCONNECTED);
-  return base_.detach();
-}
-
-void
-HttpServer::Connection::Respond(HttpServerTransaction* transaction) {
-  RTC_DCHECK(current_ == nullptr);
-  current_ = transaction;
-  if (current_->response.begin() == current_->response.end()) {
-    current_->response.set_error(HC_INTERNAL_SERVER_ERROR);
-  }
-  bool keep_alive = HttpShouldKeepAlive(current_->request);
-  current_->response.setHeader(HH_CONNECTION,
-                               keep_alive ? "Keep-Alive" : "Close",
-                               false);
-  close_ = !HttpShouldKeepAlive(current_->response);
-  base_.send(&current_->response);
-}
-
-void
-HttpServer::Connection::InitiateClose(bool force) {
-  bool request_in_progress = (HM_SEND == base_.mode()) || (nullptr == current_);
-  if (!signalling_ && (force || !request_in_progress)) {
-    server_->Remove(connection_id_);
-  } else {
-    close_ = true;
-  }
-}
-
-//
-// IHttpNotify Implementation
-//
-
-HttpError
-HttpServer::Connection::onHttpHeaderComplete(bool chunked, size_t& data_size) {
-  if (data_size == SIZE_UNKNOWN) {
-    data_size = 0;
-  }
-  RTC_DCHECK(current_ != nullptr);
-  bool custom_document = false;
-  server_->SignalHttpRequestHeader(server_, current_, &custom_document);
-  if (!custom_document) {
-    current_->request.document.reset(new MemoryStream);
-  }
-  return HE_NONE;
-}
-
-void
-HttpServer::Connection::onHttpComplete(HttpMode mode, HttpError err) {
-  if (mode == HM_SEND) {
-    RTC_DCHECK(current_ != nullptr);
-    signalling_ = true;
-    server_->SignalHttpRequestComplete(server_, current_, err);
-    signalling_ = false;
-    if (close_) {
-      // Force a close
-      err = HE_DISCONNECTED;
-    }
-  }
-  if (err != HE_NONE) {
-    server_->Remove(connection_id_);
-  } else if (mode == HM_CONNECT) {
-    base_.recv(&current_->request);
-  } else if (mode == HM_RECV) {
-    RTC_DCHECK(current_ != nullptr);
-    // TODO: do we need this?
-    //request_.document_->rewind();
-    HttpServerTransaction* transaction = current_;
-    current_ = nullptr;
-    server_->SignalHttpRequest(server_, transaction);
-  } else if (mode == HM_SEND) {
-    Thread::Current()->Dispose(current_->response.document.release());
-    current_->request.clear(true);
-    current_->response.clear(true);
-    base_.recv(&current_->request);
-  } else {
-    RTC_NOTREACHED();
-  }
-}
-
-void
-HttpServer::Connection::onHttpClosed(HttpError err) {
-  server_->Remove(connection_id_);
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// HttpListenServer
-///////////////////////////////////////////////////////////////////////////////
-
-HttpListenServer::HttpListenServer() {
-  SignalConnectionClosed.connect(this, &HttpListenServer::OnConnectionClosed);
-}
-
-HttpListenServer::~HttpListenServer() {
-}
-
-int HttpListenServer::Listen(const SocketAddress& address) {
-  AsyncSocket* sock =
-      Thread::Current()->socketserver()->CreateAsyncSocket(address.family(),
-                                                           SOCK_STREAM);
-  if (!sock) {
-    return SOCKET_ERROR;
-  }
-  listener_.reset(sock);
-  listener_->SignalReadEvent.connect(this, &HttpListenServer::OnReadEvent);
-  if ((listener_->Bind(address) != SOCKET_ERROR) &&
-      (listener_->Listen(5) != SOCKET_ERROR))
-    return 0;
-  return listener_->GetError();
-}
-
-bool HttpListenServer::GetAddress(SocketAddress* address) const {
-  if (!listener_) {
-    return false;
-  }
-  *address = listener_->GetLocalAddress();
-  return !address->IsNil();
-}
-
-void HttpListenServer::StopListening() {
-  if (listener_) {
-    listener_->Close();
-  }
-}
-
-void HttpListenServer::OnReadEvent(AsyncSocket* socket) {
-  RTC_DCHECK(socket == listener_.get());
-  AsyncSocket* incoming = listener_->Accept(nullptr);
-  if (incoming) {
-    StreamInterface* stream = new SocketStream(incoming);
-    //stream = new LoggingAdapter(stream, LS_VERBOSE, "HttpServer", false);
-    HandleConnection(stream);
-  }
-}
-
-void HttpListenServer::OnConnectionClosed(HttpServer* server,
-                                          int connection_id,
-                                          StreamInterface* stream) {
-  Thread::Current()->Dispose(stream);
-}
-
-///////////////////////////////////////////////////////////////////////////////
-
-}  // namespace rtc
diff --git a/rtc_base/httpserver.h b/rtc_base/httpserver.h
deleted file mode 100644
index 0db78dd..0000000
--- a/rtc_base/httpserver.h
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- *  Copyright 2004 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_RTC_BASE_HTTPSERVER_H_
-#define WEBRTC_RTC_BASE_HTTPSERVER_H_
-
-#include <map>
-#include <memory>
-
-#include "webrtc/rtc_base/httpbase.h"
-
-namespace rtc {
-
-class AsyncSocket;
-class HttpServer;
-class SocketAddress;
-
-//////////////////////////////////////////////////////////////////////
-// HttpServer
-//////////////////////////////////////////////////////////////////////
-
-const int HTTP_INVALID_CONNECTION_ID = 0;
-
-struct HttpServerTransaction : public HttpTransaction {
-public:
-  HttpServerTransaction(int id) : connection_id_(id) { }
-  int connection_id() const { return connection_id_; }
-
-private:
-  int connection_id_;
-};
-
-class HttpServer {
-public:
-  HttpServer();
-  virtual ~HttpServer();
-
-  int HandleConnection(StreamInterface* stream);
-  // Due to sigslot issues, we can't destroy some streams at an arbitrary time.
-  sigslot::signal3<HttpServer*, int, StreamInterface*> SignalConnectionClosed;
-
-  // This signal occurs when the HTTP request headers have been received, but
-  // before the request body is written to the request document.  By default,
-  // the request document is a MemoryStream.  By handling this signal, the
-  // document can be overridden, in which case the third signal argument should
-  // be set to true.  In the case where the request body should be ignored,
-  // the document can be set to null.  Note that the transaction object is still
-  // owened by the HttpServer at this point.
-  sigslot::signal3<HttpServer*, HttpServerTransaction*, bool*>
-    SignalHttpRequestHeader;
-
-  // An HTTP request has been made, and is available in the transaction object.
-  // Populate the transaction's response, and then return the object via the
-  // Respond method.  Note that during this time, ownership of the transaction
-  // object is transferred, so it may be passed between threads, although
-  // respond must be called on the server's active thread.
-  sigslot::signal2<HttpServer*, HttpServerTransaction*> SignalHttpRequest;
-  void Respond(HttpServerTransaction* transaction);
-
-  // If you want to know when a request completes, listen to this event.
-  sigslot::signal3<HttpServer*, HttpServerTransaction*, int>
-    SignalHttpRequestComplete;
-
-  // Stop processing the connection indicated by connection_id.
-  // Unless force is true, the server will complete sending a response that is
-  // in progress.
-  void Close(int connection_id, bool force);
-  void CloseAll(bool force);
-
-  // After calling CloseAll, this event is signalled to indicate that all
-  // outstanding connections have closed.
-  sigslot::signal1<HttpServer*> SignalCloseAllComplete;
-
-private:
-  class Connection : private IHttpNotify {
-  public:
-    Connection(int connection_id, HttpServer* server);
-    ~Connection() override;
-
-    void BeginProcess(StreamInterface* stream);
-    StreamInterface* EndProcess();
-
-    void Respond(HttpServerTransaction* transaction);
-    void InitiateClose(bool force);
-
-    // IHttpNotify Interface
-    HttpError onHttpHeaderComplete(bool chunked, size_t& data_size) override;
-    void onHttpComplete(HttpMode mode, HttpError err) override;
-    void onHttpClosed(HttpError err) override;
-
-    int connection_id_;
-    HttpServer* server_;
-    HttpBase base_;
-    HttpServerTransaction* current_;
-    bool signalling_, close_;
-  };
-
-  Connection* Find(int connection_id);
-  void Remove(int connection_id);
-
-  friend class Connection;
-  typedef std::map<int,Connection*> ConnectionMap;
-
-  ConnectionMap connections_;
-  int next_connection_id_;
-  bool closing_;
-};
-
-//////////////////////////////////////////////////////////////////////
-
-class HttpListenServer : public HttpServer, public sigslot::has_slots<> {
-public:
-  HttpListenServer();
-  ~HttpListenServer() override;
-
-  int Listen(const SocketAddress& address);
-  bool GetAddress(SocketAddress* address) const;
-  void StopListening();
-
-private:
-  void OnReadEvent(AsyncSocket* socket);
-  void OnConnectionClosed(HttpServer* server, int connection_id,
-                          StreamInterface* stream);
-
-  std::unique_ptr<AsyncSocket> listener_;
-};
-
-//////////////////////////////////////////////////////////////////////
-
-}  // namespace rtc
-
-#endif // WEBRTC_RTC_BASE_HTTPSERVER_H_
diff --git a/rtc_base/httpserver_unittest.cc b/rtc_base/httpserver_unittest.cc
deleted file mode 100644
index 1e5e0ff..0000000
--- a/rtc_base/httpserver_unittest.cc
+++ /dev/null
@@ -1,130 +0,0 @@
-/*
- *  Copyright 2007 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/rtc_base/httpserver.h"
-#include "webrtc/rtc_base/gunit.h"
-#include "webrtc/rtc_base/testutils.h"
-
-using namespace webrtc::testing;
-
-namespace rtc {
-
-namespace {
-  const char* const kRequest =
-    "GET /index.html HTTP/1.1\r\n"
-    "Host: localhost\r\n"
-    "\r\n";
-
-  struct HttpServerMonitor : public sigslot::has_slots<> {
-    HttpServerTransaction* transaction;
-    bool server_closed, connection_closed;
-
-    HttpServerMonitor(HttpServer* server)
-        : transaction(nullptr), server_closed(false), connection_closed(false) {
-      server->SignalCloseAllComplete.connect(this,
-        &HttpServerMonitor::OnClosed);
-      server->SignalHttpRequest.connect(this, &HttpServerMonitor::OnRequest);
-      server->SignalHttpRequestComplete.connect(this,
-        &HttpServerMonitor::OnRequestComplete);
-      server->SignalConnectionClosed.connect(this,
-        &HttpServerMonitor::OnConnectionClosed);
-    }
-    void OnRequest(HttpServer*, HttpServerTransaction* t) {
-      ASSERT_FALSE(transaction);
-      transaction = t;
-      transaction->response.set_success();
-      transaction->response.setHeader(HH_CONNECTION, "Close");
-    }
-    void OnRequestComplete(HttpServer*, HttpServerTransaction* t, int) {
-      ASSERT_EQ(transaction, t);
-      transaction = nullptr;
-    }
-    void OnClosed(HttpServer*) {
-      server_closed = true;
-    }
-    void OnConnectionClosed(HttpServer*, int, StreamInterface* stream) {
-      connection_closed = true;
-      delete stream;
-    }
-  };
-
-  void CreateClientConnection(HttpServer& server,
-                              HttpServerMonitor& monitor,
-                              bool send_request) {
-    StreamSource* client = new StreamSource;
-    client->SetState(SS_OPEN);
-    server.HandleConnection(client);
-    EXPECT_FALSE(monitor.server_closed);
-    EXPECT_FALSE(monitor.transaction);
-
-    if (send_request) {
-      // Simulate a request
-      client->QueueString(kRequest);
-      EXPECT_FALSE(monitor.server_closed);
-    }
-  }
-}  // anonymous namespace
-
-TEST(HttpServer, DoesNotSignalCloseUnlessCloseAllIsCalled) {
-  HttpServer server;
-  HttpServerMonitor monitor(&server);
-  // Add an active client connection
-  CreateClientConnection(server, monitor, true);
-  // Simulate a response
-  ASSERT_TRUE(nullptr != monitor.transaction);
-  server.Respond(monitor.transaction);
-  EXPECT_FALSE(monitor.transaction);
-  // Connection has closed, but no server close signal
-  EXPECT_FALSE(monitor.server_closed);
-  EXPECT_TRUE(monitor.connection_closed);
-}
-
-TEST(HttpServer, SignalsCloseWhenNoConnectionsAreActive) {
-  HttpServer server;
-  HttpServerMonitor monitor(&server);
-  // Add an idle client connection
-  CreateClientConnection(server, monitor, false);
-  // Perform graceful close
-  server.CloseAll(false);
-  // Connections have all closed
-  EXPECT_TRUE(monitor.server_closed);
-  EXPECT_TRUE(monitor.connection_closed);
-}
-
-TEST(HttpServer, SignalsCloseAfterGracefulCloseAll) {
-  HttpServer server;
-  HttpServerMonitor monitor(&server);
-  // Add an active client connection
-  CreateClientConnection(server, monitor, true);
-  // Initiate a graceful close
-  server.CloseAll(false);
-  EXPECT_FALSE(monitor.server_closed);
-  // Simulate a response
-  ASSERT_TRUE(nullptr != monitor.transaction);
-  server.Respond(monitor.transaction);
-  EXPECT_FALSE(monitor.transaction);
-  // Connections have all closed
-  EXPECT_TRUE(monitor.server_closed);
-  EXPECT_TRUE(monitor.connection_closed);
-}
-
-TEST(HttpServer, SignalsCloseAfterForcedCloseAll) {
-  HttpServer server;
-  HttpServerMonitor monitor(&server);
-  // Add an active client connection
-  CreateClientConnection(server, monitor, true);
-  // Initiate a forceful close
-  server.CloseAll(true);
-  // Connections have all closed
-  EXPECT_TRUE(monitor.server_closed);
-  EXPECT_TRUE(monitor.connection_closed);
-}
-
-} // namespace rtc
diff --git a/rtc_base/ifaddrs-android.cc b/rtc_base/ifaddrs-android.cc
deleted file mode 100644
index d225457..0000000
--- a/rtc_base/ifaddrs-android.cc
+++ /dev/null
@@ -1,223 +0,0 @@
-/*
- *  Copyright 2012 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.
- */
-
-#if defined(WEBRTC_ANDROID)
-#include "webrtc/rtc_base/ifaddrs-android.h"
-#include <errno.h>
-#include <linux/netlink.h>
-#include <linux/rtnetlink.h>
-#include <net/if.h>
-#include <netinet/in.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/ioctl.h>
-#include <sys/socket.h>
-#include <sys/types.h>
-#include <sys/utsname.h>
-#include <unistd.h>
-
-namespace {
-
-struct netlinkrequest {
-  nlmsghdr header;
-  ifaddrmsg msg;
-};
-
-const int kMaxReadSize = 4096;
-
-}  // namespace
-
-namespace rtc {
-
-int set_ifname(struct ifaddrs* ifaddr, int interface) {
-  char buf[IFNAMSIZ] = {0};
-  char* name = if_indextoname(interface, buf);
-  if (name == nullptr) {
-    return -1;
-  }
-  ifaddr->ifa_name = new char[strlen(name) + 1];
-  strncpy(ifaddr->ifa_name, name, strlen(name) + 1);
-  return 0;
-}
-
-int set_flags(struct ifaddrs* ifaddr) {
-  int fd = socket(AF_INET, SOCK_DGRAM, 0);
-  if (fd == -1) {
-    return -1;
-  }
-  ifreq ifr;
-  memset(&ifr, 0, sizeof(ifr));
-  strncpy(ifr.ifr_name, ifaddr->ifa_name, IFNAMSIZ - 1);
-  int rc = ioctl(fd, SIOCGIFFLAGS, &ifr);
-  close(fd);
-  if (rc == -1) {
-    return -1;
-  }
-  ifaddr->ifa_flags = ifr.ifr_flags;
-  return 0;
-}
-
-int set_addresses(struct ifaddrs* ifaddr, ifaddrmsg* msg, void* data,
-                  size_t len) {
-  if (msg->ifa_family == AF_INET) {
-    sockaddr_in* sa = new sockaddr_in;
-    sa->sin_family = AF_INET;
-    memcpy(&sa->sin_addr, data, len);
-    ifaddr->ifa_addr = reinterpret_cast<sockaddr*>(sa);
-  } else if (msg->ifa_family == AF_INET6) {
-    sockaddr_in6* sa = new sockaddr_in6;
-    sa->sin6_family = AF_INET6;
-    sa->sin6_scope_id = msg->ifa_index;
-    memcpy(&sa->sin6_addr, data, len);
-    ifaddr->ifa_addr = reinterpret_cast<sockaddr*>(sa);
-  } else {
-    return -1;
-  }
-  return 0;
-}
-
-int make_prefixes(struct ifaddrs* ifaddr, int family, int prefixlen) {
-  char* prefix = nullptr;
-  if (family == AF_INET) {
-    sockaddr_in* mask = new sockaddr_in;
-    mask->sin_family = AF_INET;
-    memset(&mask->sin_addr, 0, sizeof(in_addr));
-    ifaddr->ifa_netmask = reinterpret_cast<sockaddr*>(mask);
-    if (prefixlen > 32) {
-      prefixlen = 32;
-    }
-    prefix = reinterpret_cast<char*>(&mask->sin_addr);
-  } else if (family == AF_INET6) {
-    sockaddr_in6* mask = new sockaddr_in6;
-    mask->sin6_family = AF_INET6;
-    memset(&mask->sin6_addr, 0, sizeof(in6_addr));
-    ifaddr->ifa_netmask = reinterpret_cast<sockaddr*>(mask);
-    if (prefixlen > 128) {
-      prefixlen = 128;
-    }
-    prefix = reinterpret_cast<char*>(&mask->sin6_addr);
-  } else {
-    return -1;
-  }
-  for (int i = 0; i < (prefixlen / 8); i++) {
-    *prefix++ = 0xFF;
-  }
-  char remainder = 0xff;
-  remainder <<= (8 - prefixlen % 8);
-  *prefix = remainder;
-  return 0;
-}
-
-int populate_ifaddrs(struct ifaddrs* ifaddr, ifaddrmsg* msg, void* bytes,
-                     size_t len) {
-  if (set_ifname(ifaddr, msg->ifa_index) != 0) {
-    return -1;
-  }
-  if (set_flags(ifaddr) != 0) {
-    return -1;
-  }
-  if (set_addresses(ifaddr, msg, bytes, len) != 0) {
-    return -1;
-  }
-  if (make_prefixes(ifaddr, msg->ifa_family, msg->ifa_prefixlen) != 0) {
-    return -1;
-  }
-  return 0;
-}
-
-int getifaddrs(struct ifaddrs** result) {
-  int fd = socket(PF_NETLINK, SOCK_RAW, NETLINK_ROUTE);
-  if (fd < 0) {
-    return -1;
-  }
-
-  netlinkrequest ifaddr_request;
-  memset(&ifaddr_request, 0, sizeof(ifaddr_request));
-  ifaddr_request.header.nlmsg_flags = NLM_F_ROOT | NLM_F_REQUEST;
-  ifaddr_request.header.nlmsg_type = RTM_GETADDR;
-  ifaddr_request.header.nlmsg_len = NLMSG_LENGTH(sizeof(ifaddrmsg));
-
-  ssize_t count = send(fd, &ifaddr_request, ifaddr_request.header.nlmsg_len, 0);
-  if (static_cast<size_t>(count) != ifaddr_request.header.nlmsg_len) {
-    close(fd);
-    return -1;
-  }
-  struct ifaddrs* start = nullptr;
-  struct ifaddrs* current = nullptr;
-  char buf[kMaxReadSize];
-  ssize_t amount_read = recv(fd, &buf, kMaxReadSize, 0);
-  while (amount_read > 0) {
-    nlmsghdr* header = reinterpret_cast<nlmsghdr*>(&buf[0]);
-    size_t header_size = static_cast<size_t>(amount_read);
-    for ( ; NLMSG_OK(header, header_size);
-          header = NLMSG_NEXT(header, header_size)) {
-      switch (header->nlmsg_type) {
-        case NLMSG_DONE:
-          // Success. Return.
-          *result = start;
-          close(fd);
-          return 0;
-        case NLMSG_ERROR:
-          close(fd);
-          freeifaddrs(start);
-          return -1;
-        case RTM_NEWADDR: {
-          ifaddrmsg* address_msg =
-              reinterpret_cast<ifaddrmsg*>(NLMSG_DATA(header));
-          rtattr* rta = IFA_RTA(address_msg);
-          ssize_t payload_len = IFA_PAYLOAD(header);
-          while (RTA_OK(rta, payload_len)) {
-            if (rta->rta_type == IFA_ADDRESS) {
-              int family = address_msg->ifa_family;
-              if (family == AF_INET || family == AF_INET6) {
-                ifaddrs* newest = new ifaddrs;
-                memset(newest, 0, sizeof(ifaddrs));
-                if (current) {
-                  current->ifa_next = newest;
-                } else {
-                  start = newest;
-                }
-                if (populate_ifaddrs(newest, address_msg, RTA_DATA(rta),
-                                     RTA_PAYLOAD(rta)) != 0) {
-                  freeifaddrs(start);
-                  *result = nullptr;
-                  return -1;
-                }
-                current = newest;
-              }
-            }
-            rta = RTA_NEXT(rta, payload_len);
-          }
-          break;
-        }
-      }
-    }
-    amount_read = recv(fd, &buf, kMaxReadSize, 0);
-  }
-  close(fd);
-  freeifaddrs(start);
-  return -1;
-}
-
-void freeifaddrs(struct ifaddrs* addrs) {
-  struct ifaddrs* last = nullptr;
-  struct ifaddrs* cursor = addrs;
-  while (cursor) {
-    delete[] cursor->ifa_name;
-    delete cursor->ifa_addr;
-    delete cursor->ifa_netmask;
-    last = cursor;
-    cursor = cursor->ifa_next;
-    delete last;
-  }
-}
-
-}  // namespace rtc
-#endif  // defined(WEBRTC_ANDROID)
diff --git a/rtc_base/ifaddrs-android.h b/rtc_base/ifaddrs-android.h
deleted file mode 100644
index 2c171f0..0000000
--- a/rtc_base/ifaddrs-android.h
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- *  Copyright 2013 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_RTC_BASE_IFADDRS_ANDROID_H_
-#define WEBRTC_RTC_BASE_IFADDRS_ANDROID_H_
-
-#include <stdio.h>
-#include <sys/socket.h>
-
-
-// Implementation of getifaddrs for Android.
-// Fills out a list of ifaddr structs (see below) which contain information
-// about every network interface available on the host.
-// See 'man getifaddrs' on Linux or OS X (nb: it is not a POSIX function).
-struct ifaddrs {
-  struct ifaddrs* ifa_next;
-  char* ifa_name;
-  unsigned int ifa_flags;
-  struct sockaddr* ifa_addr;
-  struct sockaddr* ifa_netmask;
-  // Real ifaddrs has broadcast, point to point and data members.
-  // We don't need them (yet?).
-};
-
-namespace rtc {
-
-int getifaddrs(struct ifaddrs** result);
-void freeifaddrs(struct ifaddrs* addrs);
-
-}  // namespace rtc
-
-#endif  // WEBRTC_RTC_BASE_IFADDRS_ANDROID_H_
diff --git a/rtc_base/ifaddrs_converter.cc b/rtc_base/ifaddrs_converter.cc
deleted file mode 100644
index b9660e0..0000000
--- a/rtc_base/ifaddrs_converter.cc
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- *  Copyright 2015 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/rtc_base/ifaddrs_converter.h"
-
-namespace rtc {
-
-IfAddrsConverter::IfAddrsConverter() {}
-
-IfAddrsConverter::~IfAddrsConverter() {}
-
-bool IfAddrsConverter::ConvertIfAddrsToIPAddress(
-    const struct ifaddrs* interface,
-    InterfaceAddress* ip,
-    IPAddress* mask) {
-  switch (interface->ifa_addr->sa_family) {
-    case AF_INET: {
-      *ip = IPAddress(
-          reinterpret_cast<sockaddr_in*>(interface->ifa_addr)->sin_addr);
-      *mask = IPAddress(
-          reinterpret_cast<sockaddr_in*>(interface->ifa_netmask)->sin_addr);
-      return true;
-    }
-    case AF_INET6: {
-      int ip_attributes = IPV6_ADDRESS_FLAG_NONE;
-      if (!ConvertNativeAttributesToIPAttributes(interface, &ip_attributes)) {
-        return false;
-      }
-      *ip = InterfaceAddress(
-          reinterpret_cast<sockaddr_in6*>(interface->ifa_addr)->sin6_addr,
-          ip_attributes);
-      *mask = IPAddress(
-          reinterpret_cast<sockaddr_in6*>(interface->ifa_netmask)->sin6_addr);
-      return true;
-    }
-    default: { return false; }
-  }
-}
-
-bool IfAddrsConverter::ConvertNativeAttributesToIPAttributes(
-    const struct ifaddrs* interface,
-    int* ip_attributes) {
-  *ip_attributes = IPV6_ADDRESS_FLAG_NONE;
-  return true;
-}
-
-#if !defined(WEBRTC_MAC)
-// For MAC and IOS, it's defined in macifaddrs_converter.cc
-IfAddrsConverter* CreateIfAddrsConverter() {
-  return new IfAddrsConverter();
-}
-#endif
-}  // namespace rtc
diff --git a/rtc_base/ifaddrs_converter.h b/rtc_base/ifaddrs_converter.h
deleted file mode 100644
index 8a1fe69..0000000
--- a/rtc_base/ifaddrs_converter.h
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- *  Copyright 2015 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_RTC_BASE_IFADDRS_CONVERTER_H_
-#define WEBRTC_RTC_BASE_IFADDRS_CONVERTER_H_
-
-#if defined(WEBRTC_ANDROID)
-#include "webrtc/rtc_base/ifaddrs-android.h"
-#else
-#include <ifaddrs.h>
-#endif  // WEBRTC_ANDROID
-
-#include "webrtc/rtc_base/ipaddress.h"
-
-namespace rtc {
-
-// This class converts native interface addresses to our internal IPAddress
-// class. Subclasses should override ConvertNativeToIPAttributes to implement
-// the different ways of retrieving IPv6 attributes for various POSIX platforms.
-class IfAddrsConverter {
- public:
-  IfAddrsConverter();
-  virtual ~IfAddrsConverter();
-  virtual bool ConvertIfAddrsToIPAddress(const struct ifaddrs* interface,
-                                         InterfaceAddress* ipaddress,
-                                         IPAddress* mask);
-
- protected:
-  virtual bool ConvertNativeAttributesToIPAttributes(
-      const struct ifaddrs* interface,
-      int* ip_attributes);
-};
-
-IfAddrsConverter* CreateIfAddrsConverter();
-
-}  // namespace rtc
-
-#endif  // WEBRTC_RTC_BASE_IFADDRS_CONVERTER_H_
diff --git a/rtc_base/ignore_wundef.h b/rtc_base/ignore_wundef.h
deleted file mode 100644
index 77da2b9..0000000
--- a/rtc_base/ignore_wundef.h
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- *  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_RTC_BASE_IGNORE_WUNDEF_H_
-#define WEBRTC_RTC_BASE_IGNORE_WUNDEF_H_
-
-// If a header file uses #if on possibly undefined macros (and it's for some
-// reason not possible to just fix the header file), include it like this:
-//
-//   RTC_PUSH_IGNORING_WUNDEF()
-//   #include "misbehaving_header.h"
-//   RTC_POP_IGNORING_WUNDEF()
-//
-// This will cause the compiler to not emit -Wundef warnings for that file.
-
-#ifdef __clang__
-#define RTC_PUSH_IGNORING_WUNDEF() \
-  _Pragma("clang diagnostic push") \
-      _Pragma("clang diagnostic ignored \"-Wundef\"")
-#define RTC_POP_IGNORING_WUNDEF() _Pragma("clang diagnostic pop")
-#else
-#define RTC_PUSH_IGNORING_WUNDEF()
-#define RTC_POP_IGNORING_WUNDEF()
-#endif  // __clang__
-
-#endif  // WEBRTC_RTC_BASE_IGNORE_WUNDEF_H_
diff --git a/rtc_base/ipaddress.cc b/rtc_base/ipaddress.cc
deleted file mode 100644
index fa24bef..0000000
--- a/rtc_base/ipaddress.cc
+++ /dev/null
@@ -1,527 +0,0 @@
-/*
- *  Copyright 2004 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.
- */
-
-#if defined(WEBRTC_POSIX)
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#ifdef OPENBSD
-#include <netinet/in_systm.h>
-#endif
-#ifndef __native_client__
-#include <netinet/ip.h>
-#endif
-#include <arpa/inet.h>
-#include <netdb.h>
-#include <unistd.h>
-#endif
-
-#include <stdio.h>
-
-#include "webrtc/rtc_base/byteorder.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/ipaddress.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/nethelpers.h"
-#include "webrtc/rtc_base/stringutils.h"
-#include "webrtc/rtc_base/win32.h"
-
-namespace rtc {
-
-// Prefixes used for categorizing IPv6 addresses.
-static const in6_addr kV4MappedPrefix = {{{0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-                                           0xFF, 0xFF, 0}}};
-static const in6_addr k6To4Prefix = {{{0x20, 0x02, 0}}};
-static const in6_addr kTeredoPrefix = {{{0x20, 0x01, 0x00, 0x00}}};
-static const in6_addr kV4CompatibilityPrefix = {{{0}}};
-static const in6_addr k6BonePrefix = {{{0x3f, 0xfe, 0}}};
-
-static bool IsPrivateV4(uint32_t ip);
-static in_addr ExtractMappedAddress(const in6_addr& addr);
-
-uint32_t IPAddress::v4AddressAsHostOrderInteger() const {
-  if (family_ == AF_INET) {
-    return NetworkToHost32(u_.ip4.s_addr);
-  } else {
-    return 0;
-  }
-}
-
-bool IPAddress::IsNil() const {
-  return IPIsUnspec(*this);
-}
-
-size_t IPAddress::Size() const {
-  switch (family_) {
-    case AF_INET:
-      return sizeof(in_addr);
-    case AF_INET6:
-      return sizeof(in6_addr);
-  }
-  return 0;
-}
-
-
-bool IPAddress::operator==(const IPAddress &other) const {
-  if (family_ != other.family_) {
-    return false;
-  }
-  if (family_ == AF_INET) {
-    return memcmp(&u_.ip4, &other.u_.ip4, sizeof(u_.ip4)) == 0;
-  }
-  if (family_ == AF_INET6) {
-    return memcmp(&u_.ip6, &other.u_.ip6, sizeof(u_.ip6)) == 0;
-  }
-  return family_ == AF_UNSPEC;
-}
-
-bool IPAddress::operator!=(const IPAddress &other) const {
-  return !((*this) == other);
-}
-
-bool IPAddress::operator >(const IPAddress &other) const {
-  return (*this) != other && !((*this) < other);
-}
-
-bool IPAddress::operator <(const IPAddress &other) const {
-  // IPv4 is 'less than' IPv6
-  if (family_ != other.family_) {
-    if (family_ == AF_UNSPEC) {
-      return true;
-    }
-    if (family_ == AF_INET && other.family_ == AF_INET6) {
-      return true;
-    }
-    return false;
-  }
-  // Comparing addresses of the same family.
-  switch (family_) {
-    case AF_INET: {
-      return NetworkToHost32(u_.ip4.s_addr) <
-          NetworkToHost32(other.u_.ip4.s_addr);
-    }
-    case AF_INET6: {
-      return memcmp(&u_.ip6.s6_addr, &other.u_.ip6.s6_addr, 16) < 0;
-    }
-  }
-  // Catches AF_UNSPEC and invalid addresses.
-  return false;
-}
-
-std::ostream& operator<<(std::ostream& os, const IPAddress& ip) {
-  os << ip.ToString();
-  return os;
-}
-
-in6_addr IPAddress::ipv6_address() const {
-  return u_.ip6;
-}
-
-in_addr IPAddress::ipv4_address() const {
-  return u_.ip4;
-}
-
-std::string IPAddress::ToString() const {
-  if (family_ != AF_INET && family_ != AF_INET6) {
-    return std::string();
-  }
-  char buf[INET6_ADDRSTRLEN] = {0};
-  const void* src = &u_.ip4;
-  if (family_ == AF_INET6) {
-    src = &u_.ip6;
-  }
-  if (!rtc::inet_ntop(family_, src, buf, sizeof(buf))) {
-    return std::string();
-  }
-  return std::string(buf);
-}
-
-std::string IPAddress::ToSensitiveString() const {
-#if !defined(NDEBUG)
-  // Return non-stripped in debug.
-  return ToString();
-#else
-  switch (family_) {
-    case AF_INET: {
-      std::string address = ToString();
-      size_t find_pos = address.rfind('.');
-      if (find_pos == std::string::npos)
-        return std::string();
-      address.resize(find_pos);
-      address += ".x";
-      return address;
-    }
-    case AF_INET6: {
-      std::string result;
-      result.resize(INET6_ADDRSTRLEN);
-      in6_addr addr = ipv6_address();
-      size_t len =
-          rtc::sprintfn(&(result[0]), result.size(), "%x:%x:%x:x:x:x:x:x",
-                        (addr.s6_addr[0] << 8) + addr.s6_addr[1],
-                        (addr.s6_addr[2] << 8) + addr.s6_addr[3],
-                        (addr.s6_addr[4] << 8) + addr.s6_addr[5]);
-      result.resize(len);
-      return result;
-    }
-  }
-  return std::string();
-#endif
-}
-
-IPAddress IPAddress::Normalized() const {
-  if (family_ != AF_INET6) {
-    return *this;
-  }
-  if (!IPIsV4Mapped(*this)) {
-    return *this;
-  }
-  in_addr addr = ExtractMappedAddress(u_.ip6);
-  return IPAddress(addr);
-}
-
-IPAddress IPAddress::AsIPv6Address() const {
-  if (family_ != AF_INET) {
-    return *this;
-  }
-  in6_addr v6addr = kV4MappedPrefix;
-  ::memcpy(&v6addr.s6_addr[12], &u_.ip4.s_addr, sizeof(u_.ip4.s_addr));
-  return IPAddress(v6addr);
-}
-
-bool InterfaceAddress::operator==(const InterfaceAddress &other) const {
-  return ipv6_flags_ == other.ipv6_flags() &&
-    static_cast<const IPAddress&>(*this) == other;
-}
-
-bool InterfaceAddress::operator!=(const InterfaceAddress &other) const {
-  return !((*this) == other);
-}
-
-const InterfaceAddress& InterfaceAddress::operator=(
-  const InterfaceAddress& other) {
-  ipv6_flags_ = other.ipv6_flags_;
-  static_cast<IPAddress&>(*this) = other;
-  return *this;
-}
-
-std::ostream& operator<<(std::ostream& os, const InterfaceAddress& ip) {
-  os << static_cast<const IPAddress&>(ip);
-
-  if (ip.family() == AF_INET6)
-    os << "|flags:0x" << std::hex << ip.ipv6_flags();
-
-  return os;
-}
-
-bool IsPrivateV4(uint32_t ip_in_host_order) {
-  return ((ip_in_host_order >> 24) == 127) ||
-      ((ip_in_host_order >> 24) == 10) ||
-      ((ip_in_host_order >> 20) == ((172 << 4) | 1)) ||
-      ((ip_in_host_order >> 16) == ((192 << 8) | 168)) ||
-      ((ip_in_host_order >> 16) == ((169 << 8) | 254));
-}
-
-in_addr ExtractMappedAddress(const in6_addr& in6) {
-  in_addr ipv4;
-  ::memcpy(&ipv4.s_addr, &in6.s6_addr[12], sizeof(ipv4.s_addr));
-  return ipv4;
-}
-
-bool IPFromAddrInfo(struct addrinfo* info, IPAddress* out) {
-  if (!info || !info->ai_addr) {
-    return false;
-  }
-  if (info->ai_addr->sa_family == AF_INET) {
-    sockaddr_in* addr = reinterpret_cast<sockaddr_in*>(info->ai_addr);
-    *out = IPAddress(addr->sin_addr);
-    return true;
-  } else if (info->ai_addr->sa_family == AF_INET6) {
-    sockaddr_in6* addr = reinterpret_cast<sockaddr_in6*>(info->ai_addr);
-    *out = IPAddress(addr->sin6_addr);
-    return true;
-  }
-  return false;
-}
-
-bool IPFromString(const std::string& str, IPAddress* out) {
-  if (!out) {
-    return false;
-  }
-  in_addr addr;
-  if (rtc::inet_pton(AF_INET, str.c_str(), &addr) == 0) {
-    in6_addr addr6;
-    if (rtc::inet_pton(AF_INET6, str.c_str(), &addr6) == 0) {
-      *out = IPAddress();
-      return false;
-    }
-    *out = IPAddress(addr6);
-  } else {
-    *out = IPAddress(addr);
-  }
-  return true;
-}
-
-bool IPFromString(const std::string& str, int flags,
-                  InterfaceAddress* out) {
-  IPAddress ip;
-  if (!IPFromString(str, &ip)) {
-    return false;
-  }
-
-  *out = InterfaceAddress(ip, flags);
-  return true;
-}
-
-bool IPIsAny(const IPAddress& ip) {
-  switch (ip.family()) {
-    case AF_INET:
-      return ip == IPAddress(INADDR_ANY);
-    case AF_INET6:
-      return ip == IPAddress(in6addr_any) || ip == IPAddress(kV4MappedPrefix);
-    case AF_UNSPEC:
-      return false;
-  }
-  return false;
-}
-
-bool IPIsLoopback(const IPAddress& ip) {
-  switch (ip.family()) {
-    case AF_INET: {
-      return (ip.v4AddressAsHostOrderInteger() >> 24) == 127;
-    }
-    case AF_INET6: {
-      return ip == IPAddress(in6addr_loopback);
-    }
-  }
-  return false;
-}
-
-bool IPIsPrivate(const IPAddress& ip) {
-  switch (ip.family()) {
-    case AF_INET: {
-      return IsPrivateV4(ip.v4AddressAsHostOrderInteger());
-    }
-    case AF_INET6: {
-      return IPIsLinkLocal(ip) || IPIsLoopback(ip);
-    }
-  }
-  return false;
-}
-
-bool IPIsUnspec(const IPAddress& ip) {
-  return ip.family() == AF_UNSPEC;
-}
-
-size_t HashIP(const IPAddress& ip) {
-  switch (ip.family()) {
-    case AF_INET: {
-      return ip.ipv4_address().s_addr;
-    }
-    case AF_INET6: {
-      in6_addr v6addr = ip.ipv6_address();
-      const uint32_t* v6_as_ints =
-          reinterpret_cast<const uint32_t*>(&v6addr.s6_addr);
-      return v6_as_ints[0] ^ v6_as_ints[1] ^ v6_as_ints[2] ^ v6_as_ints[3];
-    }
-  }
-  return 0;
-}
-
-IPAddress TruncateIP(const IPAddress& ip, int length) {
-  if (length < 0) {
-    return IPAddress();
-  }
-  if (ip.family() == AF_INET) {
-    if (length > 31) {
-      return ip;
-    }
-    if (length == 0) {
-      return IPAddress(INADDR_ANY);
-    }
-    int mask = (0xFFFFFFFF << (32 - length));
-    uint32_t host_order_ip = NetworkToHost32(ip.ipv4_address().s_addr);
-    in_addr masked;
-    masked.s_addr = HostToNetwork32(host_order_ip & mask);
-    return IPAddress(masked);
-  } else if (ip.family() == AF_INET6) {
-    if (length > 127) {
-      return ip;
-    }
-    if (length == 0) {
-      return IPAddress(in6addr_any);
-    }
-    in6_addr v6addr = ip.ipv6_address();
-    int position = length / 32;
-    int inner_length = 32 - (length - (position * 32));
-    // Note: 64bit mask constant needed to allow possible 32-bit left shift.
-    uint32_t inner_mask = 0xFFFFFFFFLL << inner_length;
-    uint32_t* v6_as_ints = reinterpret_cast<uint32_t*>(&v6addr.s6_addr);
-    for (int i = 0; i < 4; ++i) {
-      if (i == position) {
-        uint32_t host_order_inner = NetworkToHost32(v6_as_ints[i]);
-        v6_as_ints[i] = HostToNetwork32(host_order_inner & inner_mask);
-      } else if (i > position) {
-        v6_as_ints[i] = 0;
-      }
-    }
-    return IPAddress(v6addr);
-  }
-  return IPAddress();
-}
-
-int CountIPMaskBits(IPAddress mask) {
-  uint32_t word_to_count = 0;
-  int bits = 0;
-  switch (mask.family()) {
-    case AF_INET: {
-      word_to_count = NetworkToHost32(mask.ipv4_address().s_addr);
-      break;
-    }
-    case AF_INET6: {
-      in6_addr v6addr = mask.ipv6_address();
-      const uint32_t* v6_as_ints =
-          reinterpret_cast<const uint32_t*>(&v6addr.s6_addr);
-      int i = 0;
-      for (; i < 4; ++i) {
-        if (v6_as_ints[i] != 0xFFFFFFFF) {
-          break;
-        }
-      }
-      if (i < 4) {
-        word_to_count = NetworkToHost32(v6_as_ints[i]);
-      }
-      bits = (i * 32);
-      break;
-    }
-    default: {
-      return 0;
-    }
-  }
-  if (word_to_count == 0) {
-    return bits;
-  }
-
-  // Public domain bit-twiddling hack from:
-  // http://graphics.stanford.edu/~seander/bithacks.html
-  // Counts the trailing 0s in the word.
-  unsigned int zeroes = 32;
-  // This could also be written word_to_count &= -word_to_count, but
-  // MSVC emits warning C4146 when negating an unsigned number.
-  word_to_count &= ~word_to_count + 1;  // Isolate lowest set bit.
-  if (word_to_count) zeroes--;
-  if (word_to_count & 0x0000FFFF) zeroes -= 16;
-  if (word_to_count & 0x00FF00FF) zeroes -= 8;
-  if (word_to_count & 0x0F0F0F0F) zeroes -= 4;
-  if (word_to_count & 0x33333333) zeroes -= 2;
-  if (word_to_count & 0x55555555) zeroes -= 1;
-
-  return bits + (32 - zeroes);
-}
-
-bool IPIsHelper(const IPAddress& ip, const in6_addr& tomatch, int length) {
-  // Helper method for checking IP prefix matches (but only on whole byte
-  // lengths). Length is in bits.
-  in6_addr addr = ip.ipv6_address();
-  return ::memcmp(&addr, &tomatch, (length >> 3)) == 0;
-}
-
-bool IPIs6Bone(const IPAddress& ip) {
-  return IPIsHelper(ip, k6BonePrefix, 16);
-}
-
-bool IPIs6To4(const IPAddress& ip) {
-  return IPIsHelper(ip, k6To4Prefix, 16);
-}
-
-bool IPIsLinkLocal(const IPAddress& ip) {
-  // Can't use the helper because the prefix is 10 bits.
-  in6_addr addr = ip.ipv6_address();
-  return addr.s6_addr[0] == 0xFE && addr.s6_addr[1] == 0x80;
-}
-
-// According to http://www.ietf.org/rfc/rfc2373.txt, Appendix A, page 19.  An
-// address which contains MAC will have its 11th and 12th bytes as FF:FE as well
-// as the U/L bit as 1.
-bool IPIsMacBased(const IPAddress& ip) {
-  in6_addr addr = ip.ipv6_address();
-  return ((addr.s6_addr[8] & 0x02) && addr.s6_addr[11] == 0xFF &&
-          addr.s6_addr[12] == 0xFE);
-}
-
-bool IPIsSiteLocal(const IPAddress& ip) {
-  // Can't use the helper because the prefix is 10 bits.
-  in6_addr addr = ip.ipv6_address();
-  return addr.s6_addr[0] == 0xFE && (addr.s6_addr[1] & 0xC0) == 0xC0;
-}
-
-bool IPIsULA(const IPAddress& ip) {
-  // Can't use the helper because the prefix is 7 bits.
-  in6_addr addr = ip.ipv6_address();
-  return (addr.s6_addr[0] & 0xFE) == 0xFC;
-}
-
-bool IPIsTeredo(const IPAddress& ip) {
-  return IPIsHelper(ip, kTeredoPrefix, 32);
-}
-
-bool IPIsV4Compatibility(const IPAddress& ip) {
-  return IPIsHelper(ip, kV4CompatibilityPrefix, 96);
-}
-
-bool IPIsV4Mapped(const IPAddress& ip) {
-  return IPIsHelper(ip, kV4MappedPrefix, 96);
-}
-
-int IPAddressPrecedence(const IPAddress& ip) {
-  // Precedence values from RFC 3484-bis. Prefers native v4 over 6to4/Teredo.
-  if (ip.family() == AF_INET) {
-    return 30;
-  } else if (ip.family() == AF_INET6) {
-    if (IPIsLoopback(ip)) {
-      return 60;
-    } else if (IPIsULA(ip)) {
-      return 50;
-    } else if (IPIsV4Mapped(ip)) {
-      return 30;
-    } else if (IPIs6To4(ip)) {
-      return 20;
-    } else if (IPIsTeredo(ip)) {
-      return 10;
-    } else if (IPIsV4Compatibility(ip) || IPIsSiteLocal(ip) || IPIs6Bone(ip)) {
-      return 1;
-    } else {
-      // A 'normal' IPv6 address.
-      return 40;
-    }
-  }
-  return 0;
-}
-
-IPAddress GetLoopbackIP(int family) {
-  if (family == AF_INET) {
-    return rtc::IPAddress(INADDR_LOOPBACK);
-  }
-  if (family == AF_INET6) {
-    return rtc::IPAddress(in6addr_loopback);
-  }
-  return rtc::IPAddress();
-}
-
-IPAddress GetAnyIP(int family) {
-  if (family == AF_INET) {
-    return rtc::IPAddress(INADDR_ANY);
-  }
-  if (family == AF_INET6) {
-    return rtc::IPAddress(in6addr_any);
-  }
-  return rtc::IPAddress();
-}
-
-}  // namespace rtc
diff --git a/rtc_base/ipaddress.h b/rtc_base/ipaddress.h
deleted file mode 100644
index 7ccea2d..0000000
--- a/rtc_base/ipaddress.h
+++ /dev/null
@@ -1,188 +0,0 @@
-/*
- *  Copyright 2011 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_RTC_BASE_IPADDRESS_H_
-#define WEBRTC_RTC_BASE_IPADDRESS_H_
-
-#if defined(WEBRTC_POSIX)
-#include <netinet/in.h>
-#include <sys/socket.h>
-#include <arpa/inet.h>
-#include <netdb.h>
-#endif
-#if defined(WEBRTC_WIN)
-#include <winsock2.h>
-#include <ws2tcpip.h>
-#endif
-#include <string.h>
-#include <string>
-#include <vector>
-
-#include "webrtc/rtc_base/basictypes.h"
-#include "webrtc/rtc_base/byteorder.h"
-#if defined(WEBRTC_WIN)
-#include "webrtc/rtc_base/win32.h"
-#endif
-
-namespace rtc {
-
-enum IPv6AddressFlag {
-  IPV6_ADDRESS_FLAG_NONE =           0x00,
-
-  // Temporary address is dynamic by nature and will not carry MAC
-  // address.
-  IPV6_ADDRESS_FLAG_TEMPORARY =      1 << 0,
-
-  // Temporary address could become deprecated once the preferred
-  // lifetime is reached. It is still valid but just shouldn't be used
-  // to create new connection.
-  IPV6_ADDRESS_FLAG_DEPRECATED =     1 << 1,
-};
-
-// Version-agnostic IP address class, wraps a union of in_addr and in6_addr.
-class IPAddress {
- public:
-  IPAddress() : family_(AF_UNSPEC) {
-    ::memset(&u_, 0, sizeof(u_));
-  }
-
-  explicit IPAddress(const in_addr& ip4) : family_(AF_INET) {
-    memset(&u_, 0, sizeof(u_));
-    u_.ip4 = ip4;
-  }
-
-  explicit IPAddress(const in6_addr& ip6) : family_(AF_INET6) {
-    u_.ip6 = ip6;
-  }
-
-  explicit IPAddress(uint32_t ip_in_host_byte_order) : family_(AF_INET) {
-    memset(&u_, 0, sizeof(u_));
-    u_.ip4.s_addr = HostToNetwork32(ip_in_host_byte_order);
-  }
-
-  IPAddress(const IPAddress& other) : family_(other.family_) {
-    ::memcpy(&u_, &other.u_, sizeof(u_));
-  }
-
-  virtual ~IPAddress() {}
-
-  const IPAddress & operator=(const IPAddress& other) {
-    family_ = other.family_;
-    ::memcpy(&u_, &other.u_, sizeof(u_));
-    return *this;
-  }
-
-  bool operator==(const IPAddress& other) const;
-  bool operator!=(const IPAddress& other) const;
-  bool operator <(const IPAddress& other) const;
-  bool operator >(const IPAddress& other) const;
-  friend std::ostream& operator<<(std::ostream& os, const IPAddress& addr);
-
-  int family() const { return family_; }
-  in_addr ipv4_address() const;
-  in6_addr ipv6_address() const;
-
-  // Returns the number of bytes needed to store the raw address.
-  size_t Size() const;
-
-  // Wraps inet_ntop.
-  std::string ToString() const;
-
-  // Same as ToString but anonymizes it by hiding the last part.
-  std::string ToSensitiveString() const;
-
-  // Returns an unmapped address from a possibly-mapped address.
-  // Returns the same address if this isn't a mapped address.
-  IPAddress Normalized() const;
-
-  // Returns this address as an IPv6 address.
-  // Maps v4 addresses (as ::ffff:a.b.c.d), returns v6 addresses unchanged.
-  IPAddress AsIPv6Address() const;
-
-  // For socketaddress' benefit. Returns the IP in host byte order.
-  uint32_t v4AddressAsHostOrderInteger() const;
-
-  // Whether this is an unspecified IP address.
-  bool IsNil() const;
-
- private:
-  int family_;
-  union {
-    in_addr ip4;
-    in6_addr ip6;
-  } u_;
-};
-
-// IP class which could represent IPv6 address flags which is only
-// meaningful in IPv6 case.
-class InterfaceAddress : public IPAddress {
- public:
-  InterfaceAddress() : ipv6_flags_(IPV6_ADDRESS_FLAG_NONE) {}
-
-  InterfaceAddress(IPAddress ip)
-    : IPAddress(ip), ipv6_flags_(IPV6_ADDRESS_FLAG_NONE) {}
-
-  InterfaceAddress(IPAddress addr, int ipv6_flags)
-    : IPAddress(addr), ipv6_flags_(ipv6_flags) {}
-
-  InterfaceAddress(const in6_addr& ip6, int ipv6_flags)
-    : IPAddress(ip6), ipv6_flags_(ipv6_flags) {}
-
-  const InterfaceAddress & operator=(const InterfaceAddress& other);
-
-  bool operator==(const InterfaceAddress& other) const;
-  bool operator!=(const InterfaceAddress& other) const;
-
-  int ipv6_flags() const { return ipv6_flags_; }
-  friend std::ostream& operator<<(std::ostream& os,
-                                  const InterfaceAddress& addr);
-
- private:
-  int ipv6_flags_;
-};
-
-bool IPFromAddrInfo(struct addrinfo* info, IPAddress* out);
-bool IPFromString(const std::string& str, IPAddress* out);
-bool IPFromString(const std::string& str, int flags,
-                  InterfaceAddress* out);
-bool IPIsAny(const IPAddress& ip);
-bool IPIsLoopback(const IPAddress& ip);
-bool IPIsPrivate(const IPAddress& ip);
-bool IPIsUnspec(const IPAddress& ip);
-size_t HashIP(const IPAddress& ip);
-
-// These are only really applicable for IPv6 addresses.
-bool IPIs6Bone(const IPAddress& ip);
-bool IPIs6To4(const IPAddress& ip);
-bool IPIsLinkLocal(const IPAddress& ip);
-bool IPIsMacBased(const IPAddress& ip);
-bool IPIsSiteLocal(const IPAddress& ip);
-bool IPIsTeredo(const IPAddress& ip);
-bool IPIsULA(const IPAddress& ip);
-bool IPIsV4Compatibility(const IPAddress& ip);
-bool IPIsV4Mapped(const IPAddress& ip);
-
-// Returns the precedence value for this IP as given in RFC3484.
-int IPAddressPrecedence(const IPAddress& ip);
-
-// Returns 'ip' truncated to be 'length' bits long.
-IPAddress TruncateIP(const IPAddress& ip, int length);
-
-IPAddress GetLoopbackIP(int family);
-IPAddress GetAnyIP(int family);
-
-// Returns the number of contiguously set bits, counting from the MSB in network
-// byte order, in this IPAddress. Bits after the first 0 encountered are not
-// counted.
-int CountIPMaskBits(IPAddress mask);
-
-}  // namespace rtc
-
-#endif  // WEBRTC_RTC_BASE_IPADDRESS_H_
diff --git a/rtc_base/ipaddress_unittest.cc b/rtc_base/ipaddress_unittest.cc
deleted file mode 100644
index 61a067f..0000000
--- a/rtc_base/ipaddress_unittest.cc
+++ /dev/null
@@ -1,956 +0,0 @@
-/*
- *  Copyright 2004 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/rtc_base/ipaddress.h"
-#include "webrtc/rtc_base/gunit.h"
-
-namespace rtc {
-
-static const unsigned int kIPv4AddrSize = 4;
-static const unsigned int kIPv6AddrSize = 16;
-static const unsigned int kIPv4RFC1918Addr = 0xC0A80701;
-static const unsigned int kIPv4PublicAddr = 0x01020304;
-static const in6_addr kIPv6LinkLocalAddr = {{{0xfe, 0x80, 0x00, 0x00,
-                                              0x00, 0x00, 0x00, 0x00,
-                                              0xbe, 0x30, 0x5b, 0xff,
-                                              0xfe, 0xe5, 0x00, 0xc3}}};
-static const in6_addr kIPv6PublicAddr = {{{0x24, 0x01, 0xfa, 0x00,
-                                           0x00, 0x04, 0x10, 0x00,
-                                           0xbe, 0x30, 0x5b, 0xff,
-                                           0xfe, 0xe5, 0x00, 0xc3}}};
-static const in6_addr kIPv6PublicAddr2 = {{{0x24, 0x01, 0x00, 0x00,
-                                            0x00, 0x00, 0x10, 0x00,
-                                            0xbe, 0x30, 0x5b, 0xff,
-                                            0xfe, 0xe5, 0x00, 0xc3}}};
-static const in6_addr kIPv4MappedAnyAddr = {{{0x00, 0x00, 0x00, 0x00,
-                                              0x00, 0x00, 0x00, 0x00,
-                                              0x00, 0x00, 0xff, 0xff,
-                                              0x00, 0x00, 0x00, 0x00}}};
-static const in6_addr kIPv4MappedRFC1918Addr = {{{0x00, 0x00, 0x00, 0x00,
-                                                  0x00, 0x00, 0x00, 0x00,
-                                                  0x00, 0x00, 0xff, 0xff,
-                                                  0xc0, 0xa8, 0x07, 0x01}}};
-static const in6_addr kIPv4MappedPublicAddr = {{{0x00, 0x00, 0x00, 0x00,
-                                                 0x00, 0x00, 0x00, 0x00,
-                                                 0x00, 0x00, 0xff, 0xff,
-                                                 0x01, 0x02, 0x03, 0x04}}};
-
-static const std::string kIPv4AnyAddrString = "0.0.0.0";
-static const std::string kIPv4LoopbackAddrString = "127.0.0.1";
-static const std::string kIPv4RFC1918AddrString = "192.168.7.1";
-static const std::string kIPv4PublicAddrString = "1.2.3.4";
-static const std::string kIPv4PublicAddrAnonymizedString = "1.2.3.x";
-static const std::string kIPv6AnyAddrString = "::";
-static const std::string kIPv6LoopbackAddrString = "::1";
-static const std::string kIPv6LinkLocalAddrString = "fe80::be30:5bff:fee5:c3";
-static const std::string kIPv6EuiAddrString =
-    "2620:0:1008:1201:a248:1cff:fe98:360";
-static const std::string kIPv6TemporaryAddrString =
-    "2620:0:1008:1201:2089:6dda:385e:80c0";
-static const std::string kIPv6PublicAddrString =
-    "2401:fa00:4:1000:be30:5bff:fee5:c3";
-static const std::string kIPv6PublicAddr2String =
-    "2401::1000:be30:5bff:fee5:c3";
-static const std::string kIPv6PublicAddrAnonymizedString =
-    "2401:fa00:4:x:x:x:x:x";
-static const std::string kIPv6PublicAddr2AnonymizedString =
-    "2401:0:0:x:x:x:x:x";
-static const std::string kIPv4MappedAnyAddrString = "::ffff:0:0";
-static const std::string kIPv4MappedRFC1918AddrString = "::ffff:c0a8:701";
-static const std::string kIPv4MappedLoopbackAddrString = "::ffff:7f00:1";
-static const std::string kIPv4MappedPublicAddrString = "::ffff:102:0304";
-static const std::string kIPv4MappedV4StyleAddrString = "::ffff:192.168.7.1";
-
-static const std::string kIPv4BrokenString1 = "192.168.7.";
-static const std::string kIPv4BrokenString2 = "192.168.7.1.1";
-static const std::string kIPv4BrokenString3 = "192.168.7.1:80";
-static const std::string kIPv4BrokenString4 = "192.168.7.ONE";
-static const std::string kIPv4BrokenString5 = "-192.168.7.1";
-static const std::string kIPv4BrokenString6 = "256.168.7.1";
-static const std::string kIPv6BrokenString1 = "2401:fa00:4:1000:be30";
-static const std::string kIPv6BrokenString2 =
-    "2401:fa00:4:1000:be30:5bff:fee5:c3:1";
-static const std::string kIPv6BrokenString3 =
-    "[2401:fa00:4:1000:be30:5bff:fee5:c3]:1";
-static const std::string kIPv6BrokenString4 =
-    "2401::4::be30";
-static const std::string kIPv6BrokenString5 =
-    "2401:::4:fee5:be30";
-static const std::string kIPv6BrokenString6 =
-    "2401f:fa00:4:1000:be30:5bff:fee5:c3";
-static const std::string kIPv6BrokenString7 =
-    "2401:ga00:4:1000:be30:5bff:fee5:c3";
-static const std::string kIPv6BrokenString8 =
-    "2401:fa000:4:1000:be30:5bff:fee5:c3";
-static const std::string kIPv6BrokenString9 =
-    "2401:fal0:4:1000:be30:5bff:fee5:c3";
-static const std::string kIPv6BrokenString10 =
-    "::ffff:192.168.7.";
-static const std::string kIPv6BrokenString11 =
-    "::ffff:192.168.7.1.1.1";
-static const std::string kIPv6BrokenString12 =
-    "::fffe:192.168.7.1";
-static const std::string kIPv6BrokenString13 =
-    "::ffff:192.168.7.ff";
-static const std::string kIPv6BrokenString14 =
-    "0x2401:fa00:4:1000:be30:5bff:fee5:c3";
-
-bool AreEqual(const IPAddress& addr,
-              const IPAddress& addr2) {
-  if ((IPIsAny(addr) != IPIsAny(addr2)) ||
-      (IPIsLoopback(addr) != IPIsLoopback(addr2)) ||
-      (IPIsPrivate(addr) != IPIsPrivate(addr2)) ||
-      (HashIP(addr) != HashIP(addr2)) ||
-      (addr.Size() != addr2.Size()) ||
-      (addr.family() != addr2.family()) ||
-      (addr.ToString() != addr2.ToString())) {
-    return false;
-  }
-  in_addr v4addr, v4addr2;
-  v4addr = addr.ipv4_address();
-  v4addr2 = addr2.ipv4_address();
-  if (0 != memcmp(&v4addr, &v4addr2, sizeof(v4addr))) {
-    return false;
-  }
-  in6_addr v6addr, v6addr2;
-  v6addr = addr.ipv6_address();
-  v6addr2 = addr2.ipv6_address();
-  if (0 != memcmp(&v6addr, &v6addr2, sizeof(v6addr))) {
-    return false;
-  }
-  return true;
-}
-
-bool BrokenIPStringFails(const std::string& broken) {
-  IPAddress addr(0);   // Intentionally make it v4.
-  if (IPFromString(kIPv4BrokenString1, &addr)) {
-    return false;
-  }
-  return addr.family() == AF_UNSPEC;
-}
-
-bool CheckMaskCount(const std::string& mask, int expected_length) {
-  IPAddress addr;
-  return IPFromString(mask, &addr) &&
-      (expected_length == CountIPMaskBits(addr));
-}
-
-bool TryInvalidMaskCount(const std::string& mask) {
-  // We don't care about the result at all, but we do want to know if
-  // CountIPMaskBits is going to crash or infinite loop or something.
-  IPAddress addr;
-  if (!IPFromString(mask, &addr)) {
-    return false;
-  }
-  CountIPMaskBits(addr);
-  return true;
-}
-
-bool CheckTruncateIP(const std::string& initial, int truncate_length,
-                     const std::string& expected_result) {
-  IPAddress addr, expected;
-  IPFromString(initial, &addr);
-  IPFromString(expected_result, &expected);
-  IPAddress truncated = TruncateIP(addr, truncate_length);
-  return truncated == expected;
-}
-
-TEST(IPAddressTest, TestDefaultCtor) {
-  IPAddress addr;
-  EXPECT_FALSE(IPIsAny(addr));
-  EXPECT_FALSE(IPIsLoopback(addr));
-  EXPECT_FALSE(IPIsPrivate(addr));
-
-  EXPECT_EQ(0U, addr.Size());
-  EXPECT_EQ(AF_UNSPEC, addr.family());
-  EXPECT_EQ("", addr.ToString());
-}
-
-TEST(IPAddressTest, TestInAddrCtor) {
-  in_addr v4addr;
-
-  // Test V4 Any address.
-  v4addr.s_addr = INADDR_ANY;
-  IPAddress addr(v4addr);
-  EXPECT_TRUE(IPIsAny(addr));
-  EXPECT_FALSE(IPIsLoopback(addr));
-  EXPECT_FALSE(IPIsPrivate(addr));
-  EXPECT_EQ(kIPv4AddrSize, addr.Size());
-  EXPECT_EQ(kIPv4AnyAddrString, addr.ToString());
-
-  // Test a V4 loopback address.
-  v4addr.s_addr = htonl(INADDR_LOOPBACK);
-  addr = IPAddress(v4addr);
-  EXPECT_FALSE(IPIsAny(addr));
-  EXPECT_TRUE(IPIsLoopback(addr));
-  EXPECT_TRUE(IPIsPrivate(addr));
-  EXPECT_EQ(kIPv4AddrSize, addr.Size());
-  EXPECT_EQ(kIPv4LoopbackAddrString, addr.ToString());
-
-  // Test an RFC1918 address.
-  v4addr.s_addr = htonl(kIPv4RFC1918Addr);
-  addr = IPAddress(v4addr);
-  EXPECT_FALSE(IPIsAny(addr));
-  EXPECT_FALSE(IPIsLoopback(addr));
-  EXPECT_TRUE(IPIsPrivate(addr));
-  EXPECT_EQ(kIPv4AddrSize, addr.Size());
-  EXPECT_EQ(kIPv4RFC1918AddrString, addr.ToString());
-
-  // Test a 'normal' v4 address.
-  v4addr.s_addr = htonl(kIPv4PublicAddr);
-  addr = IPAddress(v4addr);
-  EXPECT_FALSE(IPIsAny(addr));
-  EXPECT_FALSE(IPIsLoopback(addr));
-  EXPECT_FALSE(IPIsPrivate(addr));
-  EXPECT_EQ(kIPv4AddrSize, addr.Size());
-  EXPECT_EQ(kIPv4PublicAddrString, addr.ToString());
-}
-
-TEST(IPAddressTest, TestInAddr6Ctor) {
-  // Test v6 empty.
-  IPAddress addr(in6addr_any);
-  EXPECT_TRUE(IPIsAny(addr));
-  EXPECT_FALSE(IPIsLoopback(addr));
-  EXPECT_FALSE(IPIsPrivate(addr));
-  EXPECT_EQ(kIPv6AddrSize, addr.Size());
-  EXPECT_EQ(kIPv6AnyAddrString, addr.ToString());
-
-  // Test v6 loopback.
-  addr = IPAddress(in6addr_loopback);
-  EXPECT_FALSE(IPIsAny(addr));
-  EXPECT_TRUE(IPIsLoopback(addr));
-  EXPECT_TRUE(IPIsPrivate(addr));
-  EXPECT_EQ(kIPv6AddrSize, addr.Size());
-  EXPECT_EQ(kIPv6LoopbackAddrString, addr.ToString());
-
-  // Test v6 link-local.
-  addr = IPAddress(kIPv6LinkLocalAddr);
-  EXPECT_FALSE(IPIsAny(addr));
-  EXPECT_FALSE(IPIsLoopback(addr));
-  EXPECT_TRUE(IPIsPrivate(addr));
-  EXPECT_EQ(kIPv6AddrSize, addr.Size());
-  EXPECT_EQ(kIPv6LinkLocalAddrString, addr.ToString());
-
-  // Test v6 global address.
-  addr = IPAddress(kIPv6PublicAddr);
-  EXPECT_FALSE(IPIsAny(addr));
-  EXPECT_FALSE(IPIsLoopback(addr));
-  EXPECT_FALSE(IPIsPrivate(addr));
-  EXPECT_EQ(kIPv6AddrSize, addr.Size());
-  EXPECT_EQ(kIPv6PublicAddrString, addr.ToString());
-}
-
-TEST(IPAddressTest, TestUint32Ctor) {
-  // Test V4 Any address.
-  IPAddress addr(0);
-  EXPECT_TRUE(IPIsAny(addr));
-  EXPECT_FALSE(IPIsLoopback(addr));
-  EXPECT_FALSE(IPIsPrivate(addr));
-  EXPECT_EQ(kIPv4AddrSize, addr.Size());
-  EXPECT_EQ(kIPv4AnyAddrString, addr.ToString());
-
-  // Test a V4 loopback address.
-  addr = IPAddress(INADDR_LOOPBACK);
-  EXPECT_FALSE(IPIsAny(addr));
-  EXPECT_TRUE(IPIsLoopback(addr));
-  EXPECT_TRUE(IPIsPrivate(addr));
-  EXPECT_EQ(kIPv4AddrSize, addr.Size());
-  EXPECT_EQ(kIPv4LoopbackAddrString, addr.ToString());
-
-  // Test an RFC1918 address.
-  addr = IPAddress(kIPv4RFC1918Addr);
-  EXPECT_FALSE(IPIsAny(addr));
-  EXPECT_FALSE(IPIsLoopback(addr));
-  EXPECT_TRUE(IPIsPrivate(addr));
-  EXPECT_EQ(kIPv4AddrSize, addr.Size());
-  EXPECT_EQ(kIPv4RFC1918AddrString, addr.ToString());
-
-  // Test a 'normal' v4 address.
-  addr = IPAddress(kIPv4PublicAddr);
-  EXPECT_FALSE(IPIsAny(addr));
-  EXPECT_FALSE(IPIsLoopback(addr));
-  EXPECT_FALSE(IPIsPrivate(addr));
-  EXPECT_EQ(kIPv4AddrSize, addr.Size());
-  EXPECT_EQ(kIPv4PublicAddrString, addr.ToString());
-}
-
-TEST(IPAddressTest, TestCopyCtor) {
-  in_addr v4addr;
-  v4addr.s_addr = htonl(kIPv4PublicAddr);
-  IPAddress addr(v4addr);
-  IPAddress addr2(addr);
-
-  EXPECT_PRED2(AreEqual, addr, addr2);
-
-  addr = IPAddress(INADDR_ANY);
-  addr2 = IPAddress(addr);
-  EXPECT_PRED2(AreEqual, addr, addr2);
-
-  addr = IPAddress(INADDR_LOOPBACK);
-  addr2 = IPAddress(addr);
-  EXPECT_PRED2(AreEqual, addr, addr2);
-
-  addr = IPAddress(kIPv4PublicAddr);
-  addr2 = IPAddress(addr);
-  EXPECT_PRED2(AreEqual, addr, addr2);
-
-  addr = IPAddress(kIPv4RFC1918Addr);
-  addr2 = IPAddress(addr);
-  EXPECT_PRED2(AreEqual, addr, addr2);
-
-  addr = IPAddress(in6addr_any);
-  addr2 = IPAddress(addr);
-  EXPECT_PRED2(AreEqual, addr, addr2);
-
-  addr = IPAddress(in6addr_loopback);
-  addr2 = IPAddress(addr);
-  EXPECT_PRED2(AreEqual, addr, addr2);
-
-  addr = IPAddress(kIPv6LinkLocalAddr);
-  addr2 = IPAddress(addr);
-  EXPECT_PRED2(AreEqual, addr, addr2);
-
-  addr = IPAddress(kIPv6PublicAddr);
-  addr2 = IPAddress(addr);
-  EXPECT_PRED2(AreEqual, addr, addr2);
-}
-
-TEST(IPAddressTest, TestEquality) {
-  // Check v4 equality
-  in_addr v4addr, v4addr2;
-  v4addr.s_addr = htonl(kIPv4PublicAddr);
-  v4addr2.s_addr = htonl(kIPv4PublicAddr + 1);
-  IPAddress addr(v4addr);
-  IPAddress addr2(v4addr2);
-  IPAddress addr3(v4addr);
-
-  EXPECT_TRUE(addr == addr);
-  EXPECT_TRUE(addr2 == addr2);
-  EXPECT_TRUE(addr3 == addr3);
-  EXPECT_TRUE(addr == addr3);
-  EXPECT_TRUE(addr3 == addr);
-  EXPECT_FALSE(addr2 == addr);
-  EXPECT_FALSE(addr2 == addr3);
-  EXPECT_FALSE(addr == addr2);
-  EXPECT_FALSE(addr3 == addr2);
-
-  // Check v6 equality
-  IPAddress addr4(kIPv6PublicAddr);
-  IPAddress addr5(kIPv6LinkLocalAddr);
-  IPAddress addr6(kIPv6PublicAddr);
-
-  EXPECT_TRUE(addr4 == addr4);
-  EXPECT_TRUE(addr5 == addr5);
-  EXPECT_TRUE(addr4 == addr6);
-  EXPECT_TRUE(addr6 == addr4);
-  EXPECT_FALSE(addr4 == addr5);
-  EXPECT_FALSE(addr5 == addr4);
-  EXPECT_FALSE(addr6 == addr5);
-  EXPECT_FALSE(addr5 == addr6);
-
-  // Check v4/v6 cross-equality
-  EXPECT_FALSE(addr == addr4);
-  EXPECT_FALSE(addr == addr5);
-  EXPECT_FALSE(addr == addr6);
-  EXPECT_FALSE(addr4 == addr);
-  EXPECT_FALSE(addr5 == addr);
-  EXPECT_FALSE(addr6 == addr);
-  EXPECT_FALSE(addr2 == addr4);
-  EXPECT_FALSE(addr2 == addr5);
-  EXPECT_FALSE(addr2 == addr6);
-  EXPECT_FALSE(addr4 == addr2);
-  EXPECT_FALSE(addr5 == addr2);
-  EXPECT_FALSE(addr6 == addr2);
-  EXPECT_FALSE(addr3 == addr4);
-  EXPECT_FALSE(addr3 == addr5);
-  EXPECT_FALSE(addr3 == addr6);
-  EXPECT_FALSE(addr4 == addr3);
-  EXPECT_FALSE(addr5 == addr3);
-  EXPECT_FALSE(addr6 == addr3);
-
-  // Special cases: loopback and any.
-  // They're special but they're still not equal.
-  IPAddress v4loopback(htonl(INADDR_LOOPBACK));
-  IPAddress v6loopback(in6addr_loopback);
-  EXPECT_FALSE(v4loopback == v6loopback);
-
-  IPAddress v4any(0);
-  IPAddress v6any(in6addr_any);
-  EXPECT_FALSE(v4any == v6any);
-}
-
-TEST(IPAddressTest, TestComparison) {
-  // Defined in 'ascending' order.
-  // v6 > v4, and intra-family sorting is purely numerical
-  IPAddress addr0;  // AF_UNSPEC
-  IPAddress addr1(INADDR_ANY);  // 0.0.0.0
-  IPAddress addr2(kIPv4PublicAddr);  // 1.2.3.4
-  IPAddress addr3(INADDR_LOOPBACK);  // 127.0.0.1
-  IPAddress addr4(kIPv4RFC1918Addr);  // 192.168.7.1.
-  IPAddress addr5(in6addr_any);  // ::
-  IPAddress addr6(in6addr_loopback);  // ::1
-  IPAddress addr7(kIPv6PublicAddr);  // 2401....
-  IPAddress addr8(kIPv6LinkLocalAddr);  // fe80....
-
-  EXPECT_TRUE(addr0 < addr1);
-  EXPECT_TRUE(addr1 < addr2);
-  EXPECT_TRUE(addr2 < addr3);
-  EXPECT_TRUE(addr3 < addr4);
-  EXPECT_TRUE(addr4 < addr5);
-  EXPECT_TRUE(addr5 < addr6);
-  EXPECT_TRUE(addr6 < addr7);
-  EXPECT_TRUE(addr7 < addr8);
-
-  EXPECT_FALSE(addr0 > addr1);
-  EXPECT_FALSE(addr1 > addr2);
-  EXPECT_FALSE(addr2 > addr3);
-  EXPECT_FALSE(addr3 > addr4);
-  EXPECT_FALSE(addr4 > addr5);
-  EXPECT_FALSE(addr5 > addr6);
-  EXPECT_FALSE(addr6 > addr7);
-  EXPECT_FALSE(addr7 > addr8);
-
-  EXPECT_FALSE(addr0 > addr0);
-  EXPECT_FALSE(addr1 > addr1);
-  EXPECT_FALSE(addr2 > addr2);
-  EXPECT_FALSE(addr3 > addr3);
-  EXPECT_FALSE(addr4 > addr4);
-  EXPECT_FALSE(addr5 > addr5);
-  EXPECT_FALSE(addr6 > addr6);
-  EXPECT_FALSE(addr7 > addr7);
-  EXPECT_FALSE(addr8 > addr8);
-
-  EXPECT_FALSE(addr0 < addr0);
-  EXPECT_FALSE(addr1 < addr1);
-  EXPECT_FALSE(addr2 < addr2);
-  EXPECT_FALSE(addr3 < addr3);
-  EXPECT_FALSE(addr4 < addr4);
-  EXPECT_FALSE(addr5 < addr5);
-  EXPECT_FALSE(addr6 < addr6);
-  EXPECT_FALSE(addr7 < addr7);
-  EXPECT_FALSE(addr8 < addr8);
-}
-
-TEST(IPAddressTest, TestFromString) {
-  IPAddress addr;
-  IPAddress addr2;
-  addr2 = IPAddress(INADDR_ANY);
-
-  EXPECT_TRUE(IPFromString(kIPv4AnyAddrString, &addr));
-  EXPECT_EQ(addr.ToString(), kIPv4AnyAddrString);
-  EXPECT_PRED2(AreEqual, addr, addr2);
-
-  addr2 = IPAddress(INADDR_LOOPBACK);
-  EXPECT_TRUE(IPFromString(kIPv4LoopbackAddrString, &addr));
-  EXPECT_EQ(addr.ToString(), kIPv4LoopbackAddrString);
-  EXPECT_PRED2(AreEqual, addr, addr2);
-
-  addr2 = IPAddress(kIPv4RFC1918Addr);
-  EXPECT_TRUE(IPFromString(kIPv4RFC1918AddrString, &addr));
-  EXPECT_EQ(addr.ToString(), kIPv4RFC1918AddrString);
-  EXPECT_PRED2(AreEqual, addr, addr2);
-
-  addr2 = IPAddress(kIPv4PublicAddr);
-  EXPECT_TRUE(IPFromString(kIPv4PublicAddrString, &addr));
-  EXPECT_EQ(addr.ToString(), kIPv4PublicAddrString);
-  EXPECT_PRED2(AreEqual, addr, addr2);
-
-  addr2 = IPAddress(in6addr_any);
-  EXPECT_TRUE(IPFromString(kIPv6AnyAddrString, &addr));
-  EXPECT_EQ(addr.ToString(), kIPv6AnyAddrString);
-  EXPECT_PRED2(AreEqual, addr, addr2);
-
-  addr2 = IPAddress(in6addr_loopback);
-  EXPECT_TRUE(IPFromString(kIPv6LoopbackAddrString, &addr));
-  EXPECT_EQ(addr.ToString(), kIPv6LoopbackAddrString);
-  EXPECT_PRED2(AreEqual, addr, addr2);
-
-  addr2 = IPAddress(kIPv6LinkLocalAddr);
-  EXPECT_TRUE(IPFromString(kIPv6LinkLocalAddrString, &addr));
-  EXPECT_EQ(addr.ToString(), kIPv6LinkLocalAddrString);
-  EXPECT_PRED2(AreEqual, addr, addr2);
-
-  addr2 = IPAddress(kIPv6PublicAddr);
-  EXPECT_TRUE(IPFromString(kIPv6PublicAddrString, &addr));
-  EXPECT_EQ(addr.ToString(), kIPv6PublicAddrString);
-  EXPECT_PRED2(AreEqual, addr, addr2);
-
-  addr2 = IPAddress(kIPv4MappedRFC1918Addr);
-  EXPECT_TRUE(IPFromString(kIPv4MappedV4StyleAddrString, &addr));
-  EXPECT_PRED2(AreEqual, addr, addr2);
-
-  // Broken cases, should set addr to AF_UNSPEC.
-  EXPECT_PRED1(BrokenIPStringFails, kIPv4BrokenString1);
-  EXPECT_PRED1(BrokenIPStringFails, kIPv4BrokenString2);
-  EXPECT_PRED1(BrokenIPStringFails, kIPv4BrokenString3);
-  EXPECT_PRED1(BrokenIPStringFails, kIPv4BrokenString4);
-  EXPECT_PRED1(BrokenIPStringFails, kIPv4BrokenString5);
-  EXPECT_PRED1(BrokenIPStringFails, kIPv4BrokenString6);
-  EXPECT_PRED1(BrokenIPStringFails, kIPv6BrokenString1);
-  EXPECT_PRED1(BrokenIPStringFails, kIPv6BrokenString2);
-  EXPECT_PRED1(BrokenIPStringFails, kIPv6BrokenString3);
-  EXPECT_PRED1(BrokenIPStringFails, kIPv6BrokenString4);
-  EXPECT_PRED1(BrokenIPStringFails, kIPv6BrokenString5);
-  EXPECT_PRED1(BrokenIPStringFails, kIPv6BrokenString6);
-  EXPECT_PRED1(BrokenIPStringFails, kIPv6BrokenString7);
-  EXPECT_PRED1(BrokenIPStringFails, kIPv6BrokenString8);
-  EXPECT_PRED1(BrokenIPStringFails, kIPv6BrokenString9);
-  EXPECT_PRED1(BrokenIPStringFails, kIPv6BrokenString10);
-  EXPECT_PRED1(BrokenIPStringFails, kIPv6BrokenString11);
-  EXPECT_PRED1(BrokenIPStringFails, kIPv6BrokenString12);
-  EXPECT_PRED1(BrokenIPStringFails, kIPv6BrokenString13);
-  EXPECT_PRED1(BrokenIPStringFails, kIPv6BrokenString14);
-}
-
-TEST(IPAddressTest, TestIPFromAddrInfo) {
-  struct sockaddr_in expected4;
-  struct sockaddr_in6 expected6;
-  struct addrinfo test_info;
-  struct addrinfo next_info;
-  memset(&next_info, 'A', sizeof(next_info));
-  test_info.ai_next = &next_info;
-  // Check that we can get an IPv4 address out.
-  test_info.ai_addr = reinterpret_cast<struct sockaddr*>(&expected4);
-  expected4.sin_addr.s_addr = HostToNetwork32(kIPv4PublicAddr);
-  expected4.sin_family = AF_INET;
-  IPAddress expected(kIPv4PublicAddr);
-  IPAddress addr;
-  EXPECT_TRUE(IPFromAddrInfo(&test_info, &addr));
-  EXPECT_EQ(expected, addr);
-  // Check that we can get an IPv6 address out.
-  expected6.sin6_addr = kIPv6PublicAddr;
-  expected6.sin6_family = AF_INET6;
-  expected = IPAddress(kIPv6PublicAddr);
-  test_info.ai_addr = reinterpret_cast<struct sockaddr*>(&expected6);
-  EXPECT_TRUE(IPFromAddrInfo(&test_info, &addr));
-  EXPECT_EQ(expected, addr);
-  // Check that unspec fails.
-  expected6.sin6_family = AF_UNSPEC;
-  EXPECT_FALSE(IPFromAddrInfo(&test_info, &addr));
-  // Check a zeroed out addrinfo doesn't crash us.
-  memset(&next_info, 0, sizeof(next_info));
-  EXPECT_FALSE(IPFromAddrInfo(&next_info, &addr));
-}
-
-TEST(IPAddressTest, TestIsPrivate) {
-  EXPECT_FALSE(IPIsPrivate(IPAddress(INADDR_ANY)));
-  EXPECT_FALSE(IPIsPrivate(IPAddress(kIPv4PublicAddr)));
-  EXPECT_FALSE(IPIsPrivate(IPAddress(in6addr_any)));
-  EXPECT_FALSE(IPIsPrivate(IPAddress(kIPv6PublicAddr)));
-  EXPECT_FALSE(IPIsPrivate(IPAddress(kIPv4MappedAnyAddr)));
-  EXPECT_FALSE(IPIsPrivate(IPAddress(kIPv4MappedPublicAddr)));
-
-  EXPECT_TRUE(IPIsPrivate(IPAddress(kIPv4RFC1918Addr)));
-  EXPECT_TRUE(IPIsPrivate(IPAddress(INADDR_LOOPBACK)));
-  EXPECT_TRUE(IPIsPrivate(IPAddress(in6addr_loopback)));
-  EXPECT_TRUE(IPIsPrivate(IPAddress(kIPv6LinkLocalAddr)));
-}
-
-TEST(IPAddressTest, TestIsNil) {
-  IPAddress addr;
-  EXPECT_TRUE(IPAddress().IsNil());
-
-  EXPECT_TRUE(IPFromString(kIPv6AnyAddrString, &addr));
-  EXPECT_FALSE(addr.IsNil());
-
-  EXPECT_TRUE(IPFromString(kIPv4AnyAddrString, &addr));
-  EXPECT_FALSE(addr.IsNil());
-
-  EXPECT_FALSE(IPAddress(kIPv4PublicAddr).IsNil());
-}
-
-TEST(IPAddressTest, TestIsLoopback) {
-  EXPECT_FALSE(IPIsLoopback(IPAddress(INADDR_ANY)));
-  EXPECT_FALSE(IPIsLoopback(IPAddress(kIPv4PublicAddr)));
-  EXPECT_FALSE(IPIsLoopback(IPAddress(in6addr_any)));
-  EXPECT_FALSE(IPIsLoopback(IPAddress(kIPv6PublicAddr)));
-  EXPECT_FALSE(IPIsLoopback(IPAddress(kIPv4MappedAnyAddr)));
-  EXPECT_FALSE(IPIsLoopback(IPAddress(kIPv4MappedPublicAddr)));
-
-  EXPECT_TRUE(IPIsLoopback(IPAddress(INADDR_LOOPBACK)));
-  // Try an address in the loopback range (127.0.0.0/8) other than the typical
-  // 127.0.0.1.
-  EXPECT_TRUE(IPIsLoopback(IPAddress(0x7f010203)));
-  EXPECT_TRUE(IPIsLoopback(IPAddress(in6addr_loopback)));
-}
-
-// Verify that IPIsAny catches all cases of "any" address.
-TEST(IPAddressTest, TestIsAny) {
-  IPAddress addr;
-
-  EXPECT_TRUE(IPFromString(kIPv6AnyAddrString, &addr));
-  EXPECT_TRUE(IPIsAny(addr));
-
-  EXPECT_TRUE(IPFromString(kIPv4AnyAddrString, &addr));
-  EXPECT_TRUE(IPIsAny(addr));
-
-  EXPECT_TRUE(IPIsAny(IPAddress(kIPv4MappedAnyAddr)));
-}
-
-TEST(IPAddressTest, TestIsEui64) {
-  IPAddress addr;
-  EXPECT_TRUE(IPFromString(kIPv6EuiAddrString, &addr));
-  EXPECT_TRUE(IPIsMacBased(addr));
-
-  EXPECT_TRUE(IPFromString(kIPv6TemporaryAddrString, &addr));
-  EXPECT_FALSE(IPIsMacBased(addr));
-
-  EXPECT_TRUE(IPFromString(kIPv6LinkLocalAddrString, &addr));
-  EXPECT_TRUE(IPIsMacBased(addr));
-
-  EXPECT_TRUE(IPFromString(kIPv6AnyAddrString, &addr));
-  EXPECT_FALSE(IPIsMacBased(addr));
-
-  EXPECT_TRUE(IPFromString(kIPv6LoopbackAddrString, &addr));
-  EXPECT_FALSE(IPIsMacBased(addr));
-}
-
-TEST(IPAddressTest, TestNormalized) {
-  // Check normalizing a ::ffff:a.b.c.d address.
-  IPAddress addr;
-  EXPECT_TRUE(IPFromString(kIPv4MappedV4StyleAddrString, &addr));
-  IPAddress addr2(kIPv4RFC1918Addr);
-  addr = addr.Normalized();
-  EXPECT_EQ(addr2, addr);
-
-  // Check normalizing a ::ffff:aabb:ccdd address.
-  addr = IPAddress(kIPv4MappedPublicAddr);
-  addr2 = IPAddress(kIPv4PublicAddr);
-  addr = addr.Normalized();
-  EXPECT_EQ(addr, addr2);
-
-  // Check that a non-mapped v6 addresses isn't altered.
-  addr = IPAddress(kIPv6PublicAddr);
-  addr2 = IPAddress(kIPv6PublicAddr);
-  addr = addr.Normalized();
-  EXPECT_EQ(addr, addr2);
-
-  // Check that addresses that look a bit like mapped addresses aren't altered
-  EXPECT_TRUE(IPFromString("fe80::ffff:0102:0304", &addr));
-  addr2 = addr;
-  addr = addr.Normalized();
-  EXPECT_EQ(addr, addr2);
-  EXPECT_TRUE(IPFromString("::0102:0304", &addr));
-  addr2 = addr;
-  addr = addr.Normalized();
-  EXPECT_EQ(addr, addr2);
-  // This string should 'work' as an IP address but is not a mapped address,
-  // so it shouldn't change on normalization.
-  EXPECT_TRUE(IPFromString("::192.168.7.1", &addr));
-  addr2 = addr;
-  addr = addr.Normalized();
-  EXPECT_EQ(addr, addr2);
-
-  // Check that v4 addresses aren't altered.
-  addr = IPAddress(htonl(kIPv4PublicAddr));
-  addr2 = IPAddress(htonl(kIPv4PublicAddr));
-  addr = addr.Normalized();
-  EXPECT_EQ(addr, addr2);
-}
-
-TEST(IPAddressTest, TestAsIPv6Address) {
-  IPAddress addr(kIPv4PublicAddr);
-  IPAddress addr2(kIPv4MappedPublicAddr);
-  addr = addr.AsIPv6Address();
-  EXPECT_EQ(addr, addr2);
-
-  addr = IPAddress(kIPv4MappedPublicAddr);
-  addr2 = IPAddress(kIPv4MappedPublicAddr);
-  addr = addr.AsIPv6Address();
-  EXPECT_EQ(addr, addr2);
-
-  addr = IPAddress(kIPv6PublicAddr);
-  addr2 = IPAddress(kIPv6PublicAddr);
-  addr = addr.AsIPv6Address();
-  EXPECT_EQ(addr, addr2);
-}
-
-TEST(IPAddressTest, TestCountIPMaskBits) {
-  IPAddress mask;
-  // IPv4 on byte boundaries
-  EXPECT_PRED2(CheckMaskCount, "255.255.255.255", 32);
-  EXPECT_PRED2(CheckMaskCount, "255.255.255.0", 24);
-  EXPECT_PRED2(CheckMaskCount, "255.255.0.0", 16);
-  EXPECT_PRED2(CheckMaskCount, "255.0.0.0", 8);
-  EXPECT_PRED2(CheckMaskCount, "0.0.0.0", 0);
-
-  // IPv4 not on byte boundaries
-  EXPECT_PRED2(CheckMaskCount, "128.0.0.0", 1);
-  EXPECT_PRED2(CheckMaskCount, "224.0.0.0", 3);
-  EXPECT_PRED2(CheckMaskCount, "255.248.0.0", 13);
-  EXPECT_PRED2(CheckMaskCount, "255.255.224.0", 19);
-  EXPECT_PRED2(CheckMaskCount, "255.255.255.252", 30);
-
-  // V6 on byte boundaries
-  EXPECT_PRED2(CheckMaskCount, "::", 0);
-  EXPECT_PRED2(CheckMaskCount, "ff00::", 8);
-  EXPECT_PRED2(CheckMaskCount, "ffff::", 16);
-  EXPECT_PRED2(CheckMaskCount, "ffff:ff00::", 24);
-  EXPECT_PRED2(CheckMaskCount, "ffff:ffff::", 32);
-  EXPECT_PRED2(CheckMaskCount, "ffff:ffff:ff00::", 40);
-  EXPECT_PRED2(CheckMaskCount, "ffff:ffff:ffff::", 48);
-  EXPECT_PRED2(CheckMaskCount, "ffff:ffff:ffff:ff00::", 56);
-  EXPECT_PRED2(CheckMaskCount, "ffff:ffff:ffff:ffff::", 64);
-  EXPECT_PRED2(CheckMaskCount, "ffff:ffff:ffff:ffff:ff00::", 72);
-  EXPECT_PRED2(CheckMaskCount, "ffff:ffff:ffff:ffff:ffff::", 80);
-  EXPECT_PRED2(CheckMaskCount, "ffff:ffff:ffff:ffff:ffff:ff00::", 88);
-  EXPECT_PRED2(CheckMaskCount, "ffff:ffff:ffff:ffff:ffff:ffff::", 96);
-  EXPECT_PRED2(CheckMaskCount, "ffff:ffff:ffff:ffff:ffff:ffff:ff00:0000", 104);
-  EXPECT_PRED2(CheckMaskCount, "ffff:ffff:ffff:ffff:ffff:ffff:ffff:0000", 112);
-  EXPECT_PRED2(CheckMaskCount, "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ff00", 120);
-  EXPECT_PRED2(CheckMaskCount, "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff", 128);
-
-  // V6 not on byte boundaries.
-  EXPECT_PRED2(CheckMaskCount, "8000::", 1);
-  EXPECT_PRED2(CheckMaskCount, "ff80::", 9);
-  EXPECT_PRED2(CheckMaskCount, "ffff:fe00::", 23);
-  EXPECT_PRED2(CheckMaskCount, "ffff:fffe::", 31);
-  EXPECT_PRED2(CheckMaskCount, "ffff:ffff:e000::", 35);
-  EXPECT_PRED2(CheckMaskCount, "ffff:ffff:ffe0::", 43);
-  EXPECT_PRED2(CheckMaskCount, "ffff:ffff:ffff:f800::", 53);
-  EXPECT_PRED2(CheckMaskCount, "ffff:ffff:ffff:fff8::", 61);
-  EXPECT_PRED2(CheckMaskCount, "ffff:ffff:ffff:ffff:fc00::", 70);
-  EXPECT_PRED2(CheckMaskCount, "ffff:ffff:ffff:ffff:fffc::", 78);
-  EXPECT_PRED2(CheckMaskCount, "ffff:ffff:ffff:ffff:ffff:8000::", 81);
-  EXPECT_PRED2(CheckMaskCount, "ffff:ffff:ffff:ffff:ffff:ff80::", 89);
-  EXPECT_PRED2(CheckMaskCount, "ffff:ffff:ffff:ffff:ffff:ffff:fe00::", 103);
-  EXPECT_PRED2(CheckMaskCount, "ffff:ffff:ffff:ffff:ffff:ffff:fffe:0000", 111);
-  EXPECT_PRED2(CheckMaskCount, "ffff:ffff:ffff:ffff:ffff:ffff:ffff:fc00", 118);
-  EXPECT_PRED2(CheckMaskCount, "ffff:ffff:ffff:ffff:ffff:ffff:ffff:fffc", 126);
-
-  // Non-contiguous ranges. These are invalid but lets test them
-  // to make sure they don't crash anything or infinite loop or something.
-  EXPECT_PRED1(TryInvalidMaskCount, "217.0.0.0");
-  EXPECT_PRED1(TryInvalidMaskCount, "255.185.0.0");
-  EXPECT_PRED1(TryInvalidMaskCount, "255.255.251.0");
-  EXPECT_PRED1(TryInvalidMaskCount, "255.255.251.255");
-  EXPECT_PRED1(TryInvalidMaskCount, "255.255.254.201");
-  EXPECT_PRED1(TryInvalidMaskCount, "::1");
-  EXPECT_PRED1(TryInvalidMaskCount, "fe80::1");
-  EXPECT_PRED1(TryInvalidMaskCount, "ff80::1");
-  EXPECT_PRED1(TryInvalidMaskCount, "ffff::1");
-  EXPECT_PRED1(TryInvalidMaskCount, "ffff:ff00:1::1");
-  EXPECT_PRED1(TryInvalidMaskCount, "ffff:ffff::ffff:1");
-  EXPECT_PRED1(TryInvalidMaskCount, "ffff:ffff:ff00:1::");
-  EXPECT_PRED1(TryInvalidMaskCount, "ffff:ffff:ffff::ff00");
-  EXPECT_PRED1(TryInvalidMaskCount, "ffff:ffff:ffff:ff00:1234::");
-  EXPECT_PRED1(TryInvalidMaskCount, "ffff:ffff:ffff:ffff:0012::ffff");
-  EXPECT_PRED1(TryInvalidMaskCount, "ffff:ffff:ffff:ffff:ff01::");
-  EXPECT_PRED1(TryInvalidMaskCount, "ffff:ffff:ffff:ffff:ffff:7f00::");
-  EXPECT_PRED1(TryInvalidMaskCount, "ffff:ffff:ffff:ffff:ffff:ff7a::");
-  EXPECT_PRED1(TryInvalidMaskCount, "ffff:ffff:ffff:ffff:ffff:ffff:7f00:0000");
-  EXPECT_PRED1(TryInvalidMaskCount, "ffff:ffff:ffff:ffff:ffff:ffff:ff70:0000");
-  EXPECT_PRED1(TryInvalidMaskCount, "ffff:ffff:ffff:ffff:ffff:ffff:ffff:0211");
-  EXPECT_PRED1(TryInvalidMaskCount, "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ff7f");
-}
-
-TEST(IPAddressTest, TestTruncateIP) {
-  EXPECT_PRED3(CheckTruncateIP, "255.255.255.255", 24, "255.255.255.0");
-  EXPECT_PRED3(CheckTruncateIP, "255.255.255.255", 16, "255.255.0.0");
-  EXPECT_PRED3(CheckTruncateIP, "255.255.255.255", 8, "255.0.0.0");
-  EXPECT_PRED3(CheckTruncateIP, "202.67.7.255", 24, "202.67.7.0");
-  EXPECT_PRED3(CheckTruncateIP, "202.129.65.205", 16, "202.129.0.0");
-  EXPECT_PRED3(CheckTruncateIP, "55.25.2.77", 8, "55.0.0.0");
-  EXPECT_PRED3(CheckTruncateIP, "74.128.99.254", 1, "0.0.0.0");
-  EXPECT_PRED3(CheckTruncateIP, "106.55.99.254", 3, "96.0.0.0");
-  EXPECT_PRED3(CheckTruncateIP, "172.167.53.222", 13, "172.160.0.0");
-  EXPECT_PRED3(CheckTruncateIP, "255.255.224.0", 18, "255.255.192.0");
-  EXPECT_PRED3(CheckTruncateIP, "255.255.255.252", 28, "255.255.255.240");
-
-  EXPECT_PRED3(CheckTruncateIP, "fe80:1111:2222:3333:4444:5555:6666:7777", 1,
-               "8000::");
-  EXPECT_PRED3(CheckTruncateIP, "fff0:1111:2222:3333:4444:5555:6666:7777", 9,
-               "ff80::");
-  EXPECT_PRED3(CheckTruncateIP, "ffff:ff80:1111:2222:3333:4444:5555:6666", 23,
-               "ffff:fe00::");
-  EXPECT_PRED3(CheckTruncateIP, "ffff:ff80:1111:2222:3333:4444:5555:6666", 32,
-               "ffff:ff80::");
-  EXPECT_PRED3(CheckTruncateIP, "2400:f9af:e456:1111:2222:3333:4444:5555", 35,
-               "2400:f9af:e000::");
-  EXPECT_PRED3(CheckTruncateIP, "9999:1111:2233:4444:5555:6666:7777:8888", 53,
-               "9999:1111:2233:4000::");
-  EXPECT_PRED3(CheckTruncateIP, "9999:1111:2233:4567:5555:6666:7777:8888", 64,
-               "9999:1111:2233:4567::");
-  EXPECT_PRED3(CheckTruncateIP, "1111:2222:3333:4444:5555:6666:7777:8888", 68,
-               "1111:2222:3333:4444:5000::");
-  EXPECT_PRED3(CheckTruncateIP, "1111:2222:3333:4444:5555:6666:7777:8888", 92,
-               "1111:2222:3333:4444:5555:6660::");
-  EXPECT_PRED3(CheckTruncateIP, "1111:2222:3333:4444:5555:6666:7777:8888", 96,
-               "1111:2222:3333:4444:5555:6666::");
-  EXPECT_PRED3(CheckTruncateIP, "1111:2222:3333:4444:5555:6666:7777:8888", 105,
-               "1111:2222:3333:4444:5555:6666:7700::");
-  EXPECT_PRED3(CheckTruncateIP, "1111:2222:3333:4444:5555:6666:7777:8888", 124,
-               "1111:2222:3333:4444:5555:6666:7777:8880");
-
-  // Slightly degenerate cases
-  EXPECT_PRED3(CheckTruncateIP, "202.165.33.127", 32, "202.165.33.127");
-  EXPECT_PRED3(CheckTruncateIP, "235.105.77.12", 0, "0.0.0.0");
-  EXPECT_PRED3(CheckTruncateIP, "1111:2222:3333:4444:5555:6666:7777:8888", 128,
-               "1111:2222:3333:4444:5555:6666:7777:8888");
-  EXPECT_PRED3(CheckTruncateIP, "1111:2222:3333:4444:5555:6666:7777:8888", 0,
-               "::");
-}
-
-TEST(IPAddressTest, TestCategorizeIPv6) {
-  // Test determining if an IPAddress is 6Bone/6To4/Teredo/etc.
-  // IPv4 address, should be none of these (not even v4compat/v4mapped).
-  IPAddress v4_addr(kIPv4PublicAddr);
-  EXPECT_FALSE(IPIs6Bone(v4_addr));
-  EXPECT_FALSE(IPIs6To4(v4_addr));
-  EXPECT_FALSE(IPIsSiteLocal(v4_addr));
-  EXPECT_FALSE(IPIsTeredo(v4_addr));
-  EXPECT_FALSE(IPIsULA(v4_addr));
-  EXPECT_FALSE(IPIsV4Compatibility(v4_addr));
-  EXPECT_FALSE(IPIsV4Mapped(v4_addr));
-  // Linklocal (fe80::/16) adddress; should be none of these.
-  IPAddress linklocal_addr(kIPv6LinkLocalAddr);
-  EXPECT_FALSE(IPIs6Bone(linklocal_addr));
-  EXPECT_FALSE(IPIs6To4(linklocal_addr));
-  EXPECT_FALSE(IPIsSiteLocal(linklocal_addr));
-  EXPECT_FALSE(IPIsTeredo(linklocal_addr));
-  EXPECT_FALSE(IPIsULA(linklocal_addr));
-  EXPECT_FALSE(IPIsV4Compatibility(linklocal_addr));
-  EXPECT_FALSE(IPIsV4Mapped(linklocal_addr));
-  // 'Normal' IPv6 address, should also be none of these.
-  IPAddress normal_addr(kIPv6PublicAddr);
-  EXPECT_FALSE(IPIs6Bone(normal_addr));
-  EXPECT_FALSE(IPIs6To4(normal_addr));
-  EXPECT_FALSE(IPIsSiteLocal(normal_addr));
-  EXPECT_FALSE(IPIsTeredo(normal_addr));
-  EXPECT_FALSE(IPIsULA(normal_addr));
-  EXPECT_FALSE(IPIsV4Compatibility(normal_addr));
-  EXPECT_FALSE(IPIsV4Mapped(normal_addr));
-  // IPv4 mapped address (::ffff:123.123.123.123)
-  IPAddress v4mapped_addr(kIPv4MappedPublicAddr);
-  EXPECT_TRUE(IPIsV4Mapped(v4mapped_addr));
-  EXPECT_FALSE(IPIsV4Compatibility(v4mapped_addr));
-  EXPECT_FALSE(IPIs6Bone(v4mapped_addr));
-  EXPECT_FALSE(IPIs6To4(v4mapped_addr));
-  EXPECT_FALSE(IPIsSiteLocal(v4mapped_addr));
-  EXPECT_FALSE(IPIsTeredo(v4mapped_addr));
-  EXPECT_FALSE(IPIsULA(v4mapped_addr));
-  // IPv4 compatibility address (::123.123.123.123)
-  IPAddress v4compat_addr;
-  IPFromString("::192.168.7.1", &v4compat_addr);
-  EXPECT_TRUE(IPIsV4Compatibility(v4compat_addr));
-  EXPECT_FALSE(IPIs6Bone(v4compat_addr));
-  EXPECT_FALSE(IPIs6To4(v4compat_addr));
-  EXPECT_FALSE(IPIsSiteLocal(v4compat_addr));
-  EXPECT_FALSE(IPIsTeredo(v4compat_addr));
-  EXPECT_FALSE(IPIsULA(v4compat_addr));
-  EXPECT_FALSE(IPIsV4Mapped(v4compat_addr));
-  // 6Bone address (3FFE::/16)
-  IPAddress sixbone_addr;
-  IPFromString("3FFE:123:456::789:123", &sixbone_addr);
-  EXPECT_TRUE(IPIs6Bone(sixbone_addr));
-  EXPECT_FALSE(IPIs6To4(sixbone_addr));
-  EXPECT_FALSE(IPIsSiteLocal(sixbone_addr));
-  EXPECT_FALSE(IPIsTeredo(sixbone_addr));
-  EXPECT_FALSE(IPIsULA(sixbone_addr));
-  EXPECT_FALSE(IPIsV4Mapped(sixbone_addr));
-  EXPECT_FALSE(IPIsV4Compatibility(sixbone_addr));
-  // Unique Local Address (FC::/7)
-  IPAddress ula_addr;
-  IPFromString("FC00:123:456::789:123", &ula_addr);
-  EXPECT_TRUE(IPIsULA(ula_addr));
-  EXPECT_FALSE(IPIs6Bone(ula_addr));
-  EXPECT_FALSE(IPIs6To4(ula_addr));
-  EXPECT_FALSE(IPIsSiteLocal(ula_addr));
-  EXPECT_FALSE(IPIsTeredo(ula_addr));
-  EXPECT_FALSE(IPIsV4Mapped(ula_addr));
-  EXPECT_FALSE(IPIsV4Compatibility(ula_addr));
-  // 6To4 Address (2002::/16)
-  IPAddress sixtofour_addr;
-  IPFromString("2002:123:456::789:123", &sixtofour_addr);
-  EXPECT_TRUE(IPIs6To4(sixtofour_addr));
-  EXPECT_FALSE(IPIs6Bone(sixtofour_addr));
-  EXPECT_FALSE(IPIsSiteLocal(sixtofour_addr));
-  EXPECT_FALSE(IPIsTeredo(sixtofour_addr));
-  EXPECT_FALSE(IPIsULA(sixtofour_addr));
-  EXPECT_FALSE(IPIsV4Compatibility(sixtofour_addr));
-  EXPECT_FALSE(IPIsV4Mapped(sixtofour_addr));
-  // Site Local address (FEC0::/10)
-  IPAddress sitelocal_addr;
-  IPFromString("FEC0:123:456::789:123", &sitelocal_addr);
-  EXPECT_TRUE(IPIsSiteLocal(sitelocal_addr));
-  EXPECT_FALSE(IPIs6Bone(sitelocal_addr));
-  EXPECT_FALSE(IPIs6To4(sitelocal_addr));
-  EXPECT_FALSE(IPIsTeredo(sitelocal_addr));
-  EXPECT_FALSE(IPIsULA(sitelocal_addr));
-  EXPECT_FALSE(IPIsV4Compatibility(sitelocal_addr));
-  EXPECT_FALSE(IPIsV4Mapped(sitelocal_addr));
-  // Teredo Address (2001:0000::/32)
-  IPAddress teredo_addr;
-  IPFromString("2001:0000:123:456::789:123", &teredo_addr);
-  EXPECT_TRUE(IPIsTeredo(teredo_addr));
-  EXPECT_FALSE(IPIsSiteLocal(teredo_addr));
-  EXPECT_FALSE(IPIs6Bone(teredo_addr));
-  EXPECT_FALSE(IPIs6To4(teredo_addr));
-  EXPECT_FALSE(IPIsULA(teredo_addr));
-  EXPECT_FALSE(IPIsV4Compatibility(teredo_addr));
-  EXPECT_FALSE(IPIsV4Mapped(teredo_addr));
-}
-
-TEST(IPAddressTest, TestToSensitiveString) {
-  IPAddress addr_v4 = IPAddress(kIPv4PublicAddr);
-  IPAddress addr_v6 = IPAddress(kIPv6PublicAddr);
-  IPAddress addr_v6_2 = IPAddress(kIPv6PublicAddr2);
-  EXPECT_EQ(kIPv4PublicAddrString, addr_v4.ToString());
-  EXPECT_EQ(kIPv6PublicAddrString, addr_v6.ToString());
-  EXPECT_EQ(kIPv6PublicAddr2String, addr_v6_2.ToString());
-#if defined(NDEBUG)
-  EXPECT_EQ(kIPv4PublicAddrAnonymizedString, addr_v4.ToSensitiveString());
-  EXPECT_EQ(kIPv6PublicAddrAnonymizedString, addr_v6.ToSensitiveString());
-  EXPECT_EQ(kIPv6PublicAddr2AnonymizedString, addr_v6_2.ToSensitiveString());
-#else
-  EXPECT_EQ(kIPv4PublicAddrString, addr_v4.ToSensitiveString());
-  EXPECT_EQ(kIPv6PublicAddrString, addr_v6.ToSensitiveString());
-  EXPECT_EQ(kIPv6PublicAddr2String, addr_v6_2.ToSensitiveString());
-#endif  // defined(NDEBUG)
-}
-
-TEST(IPAddressTest, TestInterfaceAddress) {
-  in6_addr addr;
-  InterfaceAddress addr1(kIPv6PublicAddr,
-                         IPV6_ADDRESS_FLAG_TEMPORARY);
-  EXPECT_EQ(addr1.ipv6_flags(), IPV6_ADDRESS_FLAG_TEMPORARY);
-  EXPECT_EQ(addr1.family(), AF_INET6);
-
-  addr = addr1.ipv6_address();
-  EXPECT_TRUE(IN6_ARE_ADDR_EQUAL(&addr, &kIPv6PublicAddr));
-
-  InterfaceAddress addr2 = addr1;
-  EXPECT_EQ(addr1, addr2);
-  EXPECT_EQ(addr2.ipv6_flags(), IPV6_ADDRESS_FLAG_TEMPORARY);
-  addr = addr2.ipv6_address();
-  EXPECT_TRUE(IN6_ARE_ADDR_EQUAL(&addr, &kIPv6PublicAddr));
-
-  InterfaceAddress addr3(addr1);
-  EXPECT_EQ(addr1, addr3);
-  EXPECT_EQ(addr3.ipv6_flags(), IPV6_ADDRESS_FLAG_TEMPORARY);
-  addr = addr3.ipv6_address();
-  EXPECT_TRUE(IN6_ARE_ADDR_EQUAL(&addr, &kIPv6PublicAddr));
-
-  InterfaceAddress addr4(kIPv6PublicAddr,
-                         IPV6_ADDRESS_FLAG_DEPRECATED);
-  EXPECT_NE(addr1, addr4);
-
-  // When you compare them as IPAddress, since operator==
-  // is not virtual, it'll be equal.
-  IPAddress *paddr1 = &addr1;
-  IPAddress *paddr4 = &addr4;
-  EXPECT_EQ(*paddr1, *paddr4);
-
-  InterfaceAddress addr5(kIPv6LinkLocalAddr,
-                         IPV6_ADDRESS_FLAG_TEMPORARY);
-  EXPECT_NE(addr1, addr5);
-}
-
-}  // namespace rtc
diff --git a/rtc_base/java/src/org/webrtc/ContextUtils.java b/rtc_base/java/src/org/webrtc/ContextUtils.java
deleted file mode 100644
index ec9af93..0000000
--- a/rtc_base/java/src/org/webrtc/ContextUtils.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- *  Copyright 2017 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.
- */
-
-package org.webrtc;
-
-import android.content.Context;
-import org.webrtc.Logging;
-
-/**
- * Class for storing the application context and retrieving it in a static context. Similar to
- * org.chromium.base.ContextUtils.
- */
-public class ContextUtils {
-  private static final String TAG = "ContextUtils";
-  private static Context applicationContext;
-
-  /**
-   * Stores the application context that will be returned by getApplicationContext. This is called
-   * by PeerConnectionFactory.initializeAndroidGlobals.
-   */
-  public static void initialize(Context applicationContext) {
-    if (ContextUtils.applicationContext != null) {
-      // TODO(sakal): Re-enable after the migration period.
-      // throw new RuntimeException("Multiple ContextUtils.initialize calls.");
-      Logging.e(
-          TAG, "Calling ContextUtils.initialize multiple times, this will crash in the future!");
-    }
-    if (applicationContext == null) {
-      throw new RuntimeException("Application context cannot be null for ContextUtils.initialize.");
-    }
-    ContextUtils.applicationContext = applicationContext;
-  }
-
-  /**
-   * Returns the stored application context.
-   */
-  public static Context getApplicationContext() {
-    return applicationContext;
-  }
-}
diff --git a/rtc_base/java/src/org/webrtc/Logging.java b/rtc_base/java/src/org/webrtc/Logging.java
deleted file mode 100644
index 827ecc6..0000000
--- a/rtc_base/java/src/org/webrtc/Logging.java
+++ /dev/null
@@ -1,200 +0,0 @@
-/*
- *  Copyright (c) 2015 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.
- */
-
-package org.webrtc;
-
-import java.io.PrintWriter;
-import java.io.StringWriter;
-import java.util.EnumSet;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-/**
- * Java wrapper for WebRTC logging. Logging defaults to java.util.logging.Logger, but will switch to
- * native logging (rtc::LogMessage) if one of the following static functions are called from the
- * app:
- * - Logging.enableLogThreads
- * - Logging.enableLogTimeStamps
- * - Logging.enableTracing
- * - Logging.enableLogToDebugOutput
- * Using native logging requires the presence of the jingle_peerconnection_so library.
- */
-public class Logging {
-  private static final Logger fallbackLogger = createFallbackLogger();
-  private static volatile boolean tracingEnabled;
-  private static volatile boolean loggingEnabled;
-  private static enum NativeLibStatus { UNINITIALIZED, LOADED, FAILED }
-  private static volatile NativeLibStatus nativeLibStatus = NativeLibStatus.UNINITIALIZED;
-
-  private static Logger createFallbackLogger() {
-    final Logger fallbackLogger = Logger.getLogger("org.webrtc.Logging");
-    fallbackLogger.setLevel(Level.ALL);
-    return fallbackLogger;
-  }
-
-  private static boolean loadNativeLibrary() {
-    if (nativeLibStatus == NativeLibStatus.UNINITIALIZED) {
-      try {
-        System.loadLibrary("jingle_peerconnection_so");
-        nativeLibStatus = NativeLibStatus.LOADED;
-      } catch (UnsatisfiedLinkError t) {
-        nativeLibStatus = NativeLibStatus.FAILED;
-        fallbackLogger.log(Level.WARNING, "Failed to load jingle_peerconnection_so: ", t);
-      }
-    }
-    return nativeLibStatus == NativeLibStatus.LOADED;
-  }
-
-  // Keep in sync with webrtc/common_types.h:TraceLevel.
-  public enum TraceLevel {
-    TRACE_NONE(0x0000),
-    TRACE_STATEINFO(0x0001),
-    TRACE_WARNING(0x0002),
-    TRACE_ERROR(0x0004),
-    TRACE_CRITICAL(0x0008),
-    TRACE_APICALL(0x0010),
-    TRACE_DEFAULT(0x00ff),
-    TRACE_MODULECALL(0x0020),
-    TRACE_MEMORY(0x0100),
-    TRACE_TIMER(0x0200),
-    TRACE_STREAM(0x0400),
-    TRACE_DEBUG(0x0800),
-    TRACE_INFO(0x1000),
-    TRACE_TERSEINFO(0x2000),
-    TRACE_ALL(0xffff);
-
-    public final int level;
-    TraceLevel(int level) {
-      this.level = level;
-    }
-  }
-
-  // Keep in sync with webrtc/rtc_base/logging.h:LoggingSeverity.
-  public enum Severity { LS_SENSITIVE, LS_VERBOSE, LS_INFO, LS_WARNING, LS_ERROR, LS_NONE }
-
-  public static void enableLogThreads() {
-    if (!loadNativeLibrary()) {
-      fallbackLogger.log(Level.WARNING, "Cannot enable log thread because native lib not loaded.");
-      return;
-    }
-    nativeEnableLogThreads();
-  }
-
-  public static void enableLogTimeStamps() {
-    if (!loadNativeLibrary()) {
-      fallbackLogger.log(
-          Level.WARNING, "Cannot enable log timestamps because native lib not loaded.");
-      return;
-    }
-    nativeEnableLogTimeStamps();
-  }
-
-  // Enable tracing to |path| of messages of |levels|.
-  // On Android, use "logcat:" for |path| to send output there.
-  // Note: this function controls the output of the WEBRTC_TRACE() macros.
-  public static synchronized void enableTracing(String path, EnumSet<TraceLevel> levels) {
-    if (!loadNativeLibrary()) {
-      fallbackLogger.log(Level.WARNING, "Cannot enable tracing because native lib not loaded.");
-      return;
-    }
-
-    if (tracingEnabled) {
-      return;
-    }
-    int nativeLevel = 0;
-    for (TraceLevel level : levels) {
-      nativeLevel |= level.level;
-    }
-    nativeEnableTracing(path, nativeLevel);
-    tracingEnabled = true;
-  }
-
-  // Enable diagnostic logging for messages of |severity| to the platform debug
-  // output. On Android, the output will be directed to Logcat.
-  // Note: this function starts collecting the output of the LOG() macros.
-  public static synchronized void enableLogToDebugOutput(Severity severity) {
-    if (!loadNativeLibrary()) {
-      fallbackLogger.log(Level.WARNING, "Cannot enable logging because native lib not loaded.");
-      return;
-    }
-    nativeEnableLogToDebugOutput(severity.ordinal());
-    loggingEnabled = true;
-  }
-
-  public static void log(Severity severity, String tag, String message) {
-    if (loggingEnabled) {
-      nativeLog(severity.ordinal(), tag, message);
-      return;
-    }
-
-    // Fallback to system log.
-    Level level;
-    switch (severity) {
-      case LS_ERROR:
-        level = Level.SEVERE;
-        break;
-      case LS_WARNING:
-        level = Level.WARNING;
-        break;
-      case LS_INFO:
-        level = Level.INFO;
-        break;
-      default:
-        level = Level.FINE;
-        break;
-    }
-    fallbackLogger.log(level, tag + ": " + message);
-  }
-
-  public static void d(String tag, String message) {
-    log(Severity.LS_INFO, tag, message);
-  }
-
-  public static void e(String tag, String message) {
-    log(Severity.LS_ERROR, tag, message);
-  }
-
-  public static void w(String tag, String message) {
-    log(Severity.LS_WARNING, tag, message);
-  }
-
-  public static void e(String tag, String message, Throwable e) {
-    log(Severity.LS_ERROR, tag, message);
-    log(Severity.LS_ERROR, tag, e.toString());
-    log(Severity.LS_ERROR, tag, getStackTraceString(e));
-  }
-
-  public static void w(String tag, String message, Throwable e) {
-    log(Severity.LS_WARNING, tag, message);
-    log(Severity.LS_WARNING, tag, e.toString());
-    log(Severity.LS_WARNING, tag, getStackTraceString(e));
-  }
-
-  public static void v(String tag, String message) {
-    log(Severity.LS_VERBOSE, tag, message);
-  }
-
-  private static String getStackTraceString(Throwable e) {
-    if (e == null) {
-      return "";
-    }
-
-    StringWriter sw = new StringWriter();
-    PrintWriter pw = new PrintWriter(sw);
-    e.printStackTrace(pw);
-    return sw.toString();
-  }
-
-  private static native void nativeEnableTracing(String path, int nativeLevels);
-  private static native void nativeEnableLogToDebugOutput(int nativeSeverity);
-  private static native void nativeEnableLogThreads();
-  private static native void nativeEnableLogTimeStamps();
-  private static native void nativeLog(int severity, String tag, String message);
-}
diff --git a/rtc_base/java/src/org/webrtc/OWNERS b/rtc_base/java/src/org/webrtc/OWNERS
deleted file mode 100644
index 4d31ffb..0000000
--- a/rtc_base/java/src/org/webrtc/OWNERS
+++ /dev/null
@@ -1 +0,0 @@
-magjed@webrtc.org
diff --git a/rtc_base/java/src/org/webrtc/Size.java b/rtc_base/java/src/org/webrtc/Size.java
deleted file mode 100644
index a711b5d..0000000
--- a/rtc_base/java/src/org/webrtc/Size.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- *  Copyright 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.
- */
-
-package org.webrtc;
-
-/**
- * Class for representing size of an object. Very similar to android.util.Size but available on all
- * devices.
- */
-public class Size {
-  public int width;
-  public int height;
-
-  public Size(int width, int height) {
-    this.width = width;
-    this.height = height;
-  }
-
-  @Override
-  public String toString() {
-    return width + "x" + height;
-  }
-
-  @Override
-  public boolean equals(Object other) {
-    if (!(other instanceof Size)) {
-      return false;
-    }
-    final Size otherSize = (Size) other;
-    return width == otherSize.width && height == otherSize.height;
-  }
-
-  @Override
-  public int hashCode() {
-    // Use prime close to 2^16 to avoid collisions for normal values less than 2^16.
-    return 1 + 65537 * width + height;
-  }
-}
diff --git a/rtc_base/java/src/org/webrtc/ThreadUtils.java b/rtc_base/java/src/org/webrtc/ThreadUtils.java
deleted file mode 100644
index df2c2d0..0000000
--- a/rtc_base/java/src/org/webrtc/ThreadUtils.java
+++ /dev/null
@@ -1,220 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-package org.webrtc;
-
-import android.os.Handler;
-import android.os.Looper;
-import android.os.SystemClock;
-import java.util.concurrent.Callable;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
-
-public class ThreadUtils {
-  /**
-   * Utility class to be used for checking that a method is called on the correct thread.
-   */
-  public static class ThreadChecker {
-    private Thread thread = Thread.currentThread();
-
-    public void checkIsOnValidThread() {
-      if (thread == null) {
-        thread = Thread.currentThread();
-      }
-      if (Thread.currentThread() != thread) {
-        throw new IllegalStateException("Wrong thread");
-      }
-    }
-
-    public void detachThread() {
-      thread = null;
-    }
-  }
-
-  /**
-   * Throws exception if called from other than main thread.
-   */
-  public static void checkIsOnMainThread() {
-    if (Thread.currentThread() != Looper.getMainLooper().getThread()) {
-      throw new IllegalStateException("Not on main thread!");
-    }
-  }
-
-  /**
-   * Utility interface to be used with executeUninterruptibly() to wait for blocking operations
-   * to complete without getting interrupted..
-   */
-  public interface BlockingOperation { void run() throws InterruptedException; }
-
-  /**
-   * Utility method to make sure a blocking operation is executed to completion without getting
-   * interrupted. This should be used in cases where the operation is waiting for some critical
-   * work, e.g. cleanup, that must complete before returning. If the thread is interrupted during
-   * the blocking operation, this function will re-run the operation until completion, and only then
-   * re-interrupt the thread.
-   */
-  public static void executeUninterruptibly(BlockingOperation operation) {
-    boolean wasInterrupted = false;
-    while (true) {
-      try {
-        operation.run();
-        break;
-      } catch (InterruptedException e) {
-        // Someone is asking us to return early at our convenience. We can't cancel this operation,
-        // but we should preserve the information and pass it along.
-        wasInterrupted = true;
-      }
-    }
-    // Pass interruption information along.
-    if (wasInterrupted) {
-      Thread.currentThread().interrupt();
-    }
-  }
-
-  public static boolean joinUninterruptibly(final Thread thread, long timeoutMs) {
-    final long startTimeMs = SystemClock.elapsedRealtime();
-    long timeRemainingMs = timeoutMs;
-    boolean wasInterrupted = false;
-    while (timeRemainingMs > 0) {
-      try {
-        thread.join(timeRemainingMs);
-        break;
-      } catch (InterruptedException e) {
-        // Someone is asking us to return early at our convenience. We can't cancel this operation,
-        // but we should preserve the information and pass it along.
-        wasInterrupted = true;
-        final long elapsedTimeMs = SystemClock.elapsedRealtime() - startTimeMs;
-        timeRemainingMs = timeoutMs - elapsedTimeMs;
-      }
-    }
-    // Pass interruption information along.
-    if (wasInterrupted) {
-      Thread.currentThread().interrupt();
-    }
-    return !thread.isAlive();
-  }
-
-  public static void joinUninterruptibly(final Thread thread) {
-    executeUninterruptibly(new BlockingOperation() {
-      @Override
-      public void run() throws InterruptedException {
-        thread.join();
-      }
-    });
-  }
-
-  public static void awaitUninterruptibly(final CountDownLatch latch) {
-    executeUninterruptibly(new BlockingOperation() {
-      @Override
-      public void run() throws InterruptedException {
-        latch.await();
-      }
-    });
-  }
-
-  public static boolean awaitUninterruptibly(CountDownLatch barrier, long timeoutMs) {
-    final long startTimeMs = SystemClock.elapsedRealtime();
-    long timeRemainingMs = timeoutMs;
-    boolean wasInterrupted = false;
-    boolean result = false;
-    do {
-      try {
-        result = barrier.await(timeRemainingMs, TimeUnit.MILLISECONDS);
-        break;
-      } catch (InterruptedException e) {
-        // Someone is asking us to return early at our convenience. We can't cancel this operation,
-        // but we should preserve the information and pass it along.
-        wasInterrupted = true;
-        final long elapsedTimeMs = SystemClock.elapsedRealtime() - startTimeMs;
-        timeRemainingMs = timeoutMs - elapsedTimeMs;
-      }
-    } while (timeRemainingMs > 0);
-    // Pass interruption information along.
-    if (wasInterrupted) {
-      Thread.currentThread().interrupt();
-    }
-    return result;
-  }
-
-  public static void waitUninterruptibly(final Object object) {
-    executeUninterruptibly(new BlockingOperation() {
-      @Override
-      public void run() throws InterruptedException {
-        object.wait();
-      }
-    });
-  }
-
-  /**
-   * Post |callable| to |handler| and wait for the result.
-   */
-  public static <V> V invokeAtFrontUninterruptibly(
-      final Handler handler, final Callable<V> callable) {
-    if (handler.getLooper().getThread() == Thread.currentThread()) {
-      try {
-        return callable.call();
-      } catch (Exception e) {
-        throw new RuntimeException(e);
-      }
-    }
-    // Place-holder classes that are assignable inside nested class.
-    class CaughtException {
-      Exception e;
-    }
-    class Result {
-      public V value;
-    }
-    final Result result = new Result();
-    final CaughtException caughtException = new CaughtException();
-    final CountDownLatch barrier = new CountDownLatch(1);
-    handler.post(new Runnable() {
-      @Override
-      public void run() {
-        try {
-          result.value = callable.call();
-        } catch (Exception e) {
-          caughtException.e = e;
-        }
-        barrier.countDown();
-      }
-    });
-    awaitUninterruptibly(barrier);
-    // Re-throw any runtime exception caught inside the other thread. Since this is an invoke, add
-    // stack trace for the waiting thread as well.
-    if (caughtException.e != null) {
-      final RuntimeException runtimeException = new RuntimeException(caughtException.e);
-      runtimeException.setStackTrace(
-          concatStackTraces(caughtException.e.getStackTrace(), runtimeException.getStackTrace()));
-      throw runtimeException;
-    }
-    return result.value;
-  }
-
-  /**
-   * Post |runner| to |handler|, at the front, and wait for completion.
-   */
-  public static void invokeAtFrontUninterruptibly(final Handler handler, final Runnable runner) {
-    invokeAtFrontUninterruptibly(handler, new Callable<Void>() {
-      @Override
-      public Void call() {
-        runner.run();
-        return null;
-      }
-    });
-  }
-
-  static StackTraceElement[] concatStackTraces(
-      StackTraceElement[] inner, StackTraceElement[] outer) {
-    final StackTraceElement[] combined = new StackTraceElement[inner.length + outer.length];
-    System.arraycopy(inner, 0, combined, 0, inner.length);
-    System.arraycopy(outer, 0, combined, inner.length, outer.length);
-    return combined;
-  }
-}
diff --git a/rtc_base/json.cc b/rtc_base/json.cc
deleted file mode 100644
index 9a9968a..0000000
--- a/rtc_base/json.cc
+++ /dev/null
@@ -1,300 +0,0 @@
-/*
- *  Copyright 2004 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/rtc_base/json.h"
-
-#include <errno.h>
-#include <limits.h>
-#include <stdlib.h>
-
-#include <sstream>
-
-namespace rtc {
-
-bool GetStringFromJson(const Json::Value& in, std::string* out) {
-  if (!in.isString()) {
-    std::ostringstream s;
-    if (in.isBool()) {
-      s << std::boolalpha << in.asBool();
-    } else if (in.isInt()) {
-      s << in.asInt();
-    } else if (in.isUInt()) {
-      s << in.asUInt();
-    } else if (in.isDouble()) {
-      s << in.asDouble();
-    } else {
-      return false;
-    }
-    *out = s.str();
-  } else {
-    *out = in.asString();
-  }
-  return true;
-}
-
-bool GetIntFromJson(const Json::Value& in, int* out) {
-  bool ret;
-  if (!in.isString()) {
-    ret = in.isConvertibleTo(Json::intValue);
-    if (ret) {
-      *out = in.asInt();
-    }
-  } else {
-    long val;  // NOLINT
-    const char* c_str = in.asCString();
-    char* end_ptr;
-    errno = 0;
-    val = strtol(c_str, &end_ptr, 10);  // NOLINT
-    ret = (end_ptr != c_str && *end_ptr == '\0' && !errno &&
-           val >= INT_MIN && val <= INT_MAX);
-    *out = val;
-  }
-  return ret;
-}
-
-bool GetUIntFromJson(const Json::Value& in, unsigned int* out) {
-  bool ret;
-  if (!in.isString()) {
-    ret = in.isConvertibleTo(Json::uintValue);
-    if (ret) {
-      *out = in.asUInt();
-    }
-  } else {
-    unsigned long val;  // NOLINT
-    const char* c_str = in.asCString();
-    char* end_ptr;
-    errno = 0;
-    val = strtoul(c_str, &end_ptr, 10);  // NOLINT
-    ret = (end_ptr != c_str && *end_ptr == '\0' && !errno &&
-           val <= UINT_MAX);
-    *out = val;
-  }
-  return ret;
-}
-
-bool GetBoolFromJson(const Json::Value& in, bool* out) {
-  bool ret;
-  if (!in.isString()) {
-    ret = in.isConvertibleTo(Json::booleanValue);
-    if (ret) {
-      *out = in.asBool();
-    }
-  } else {
-    if (in.asString() == "true") {
-      *out = true;
-      ret = true;
-    } else if (in.asString() == "false") {
-      *out = false;
-      ret = true;
-    } else {
-      ret = false;
-    }
-  }
-  return ret;
-}
-
-bool GetDoubleFromJson(const Json::Value& in, double* out) {
-  bool ret;
-  if (!in.isString()) {
-    ret = in.isConvertibleTo(Json::realValue);
-    if (ret) {
-      *out = in.asDouble();
-    }
-  } else {
-    double val;
-    const char* c_str = in.asCString();
-    char* end_ptr;
-    errno = 0;
-    val = strtod(c_str, &end_ptr);
-    ret = (end_ptr != c_str && *end_ptr == '\0' && !errno);
-    *out = val;
-  }
-  return ret;
-}
-
-namespace {
-template<typename T>
-bool JsonArrayToVector(const Json::Value& value,
-                       bool (*getter)(const Json::Value& in, T* out),
-                       std::vector<T> *vec) {
-  vec->clear();
-  if (!value.isArray()) {
-    return false;
-  }
-
-  for (Json::Value::ArrayIndex i = 0; i < value.size(); ++i) {
-    T val;
-    if (!getter(value[i], &val)) {
-      return false;
-    }
-    vec->push_back(val);
-  }
-
-  return true;
-}
-// Trivial getter helper
-bool GetValueFromJson(const Json::Value& in, Json::Value* out) {
-  *out = in;
-  return true;
-}
-}  // unnamed namespace
-
-bool JsonArrayToValueVector(const Json::Value& in,
-                            std::vector<Json::Value>* out) {
-  return JsonArrayToVector(in, GetValueFromJson, out);
-}
-
-bool JsonArrayToIntVector(const Json::Value& in,
-                          std::vector<int>* out) {
-  return JsonArrayToVector(in, GetIntFromJson, out);
-}
-
-bool JsonArrayToUIntVector(const Json::Value& in,
-                           std::vector<unsigned int>* out) {
-  return JsonArrayToVector(in, GetUIntFromJson, out);
-}
-
-bool JsonArrayToStringVector(const Json::Value& in,
-                             std::vector<std::string>* out) {
-  return JsonArrayToVector(in, GetStringFromJson, out);
-}
-
-bool JsonArrayToBoolVector(const Json::Value& in,
-                           std::vector<bool>* out) {
-  return JsonArrayToVector(in, GetBoolFromJson, out);
-}
-
-bool JsonArrayToDoubleVector(const Json::Value& in,
-                             std::vector<double>* out) {
-  return JsonArrayToVector(in, GetDoubleFromJson, out);
-}
-
-namespace {
-template<typename T>
-Json::Value VectorToJsonArray(const std::vector<T>& vec) {
-  Json::Value result(Json::arrayValue);
-  for (size_t i = 0; i < vec.size(); ++i) {
-    result.append(Json::Value(vec[i]));
-  }
-  return result;
-}
-}  // unnamed namespace
-
-Json::Value ValueVectorToJsonArray(const std::vector<Json::Value>& in) {
-  return VectorToJsonArray(in);
-}
-
-Json::Value IntVectorToJsonArray(const std::vector<int>& in) {
-  return VectorToJsonArray(in);
-}
-
-Json::Value UIntVectorToJsonArray(const std::vector<unsigned int>& in) {
-  return VectorToJsonArray(in);
-}
-
-Json::Value StringVectorToJsonArray(const std::vector<std::string>& in) {
-  return VectorToJsonArray(in);
-}
-
-Json::Value BoolVectorToJsonArray(const std::vector<bool>& in) {
-  return VectorToJsonArray(in);
-}
-
-Json::Value DoubleVectorToJsonArray(const std::vector<double>& in) {
-  return VectorToJsonArray(in);
-}
-
-bool GetValueFromJsonArray(const Json::Value& in, size_t n,
-                           Json::Value* out) {
-  if (!in.isArray() || !in.isValidIndex(static_cast<int>(n))) {
-    return false;
-  }
-
-  *out = in[static_cast<Json::Value::ArrayIndex>(n)];
-  return true;
-}
-
-bool GetIntFromJsonArray(const Json::Value& in, size_t n,
-                         int* out) {
-  Json::Value x;
-  return GetValueFromJsonArray(in, n, &x) && GetIntFromJson(x, out);
-}
-
-bool GetUIntFromJsonArray(const Json::Value& in, size_t n,
-                          unsigned int* out)  {
-  Json::Value x;
-  return GetValueFromJsonArray(in, n, &x) && GetUIntFromJson(x, out);
-}
-
-bool GetStringFromJsonArray(const Json::Value& in, size_t n,
-                            std::string* out) {
-  Json::Value x;
-  return GetValueFromJsonArray(in, n, &x) && GetStringFromJson(x, out);
-}
-
-bool GetBoolFromJsonArray(const Json::Value& in, size_t n,
-                          bool* out) {
-  Json::Value x;
-  return GetValueFromJsonArray(in, n, &x) && GetBoolFromJson(x, out);
-}
-
-bool GetDoubleFromJsonArray(const Json::Value& in, size_t n,
-                            double* out) {
-  Json::Value x;
-  return GetValueFromJsonArray(in, n, &x) && GetDoubleFromJson(x, out);
-}
-
-bool GetValueFromJsonObject(const Json::Value& in, const std::string& k,
-                            Json::Value* out) {
-  if (!in.isObject() || !in.isMember(k)) {
-    return false;
-  }
-
-  *out = in[k];
-  return true;
-}
-
-bool GetIntFromJsonObject(const Json::Value& in, const std::string& k,
-                          int* out) {
-  Json::Value x;
-  return GetValueFromJsonObject(in, k, &x) && GetIntFromJson(x, out);
-}
-
-bool GetUIntFromJsonObject(const Json::Value& in, const std::string& k,
-                           unsigned int* out)  {
-  Json::Value x;
-  return GetValueFromJsonObject(in, k, &x) && GetUIntFromJson(x, out);
-}
-
-bool GetStringFromJsonObject(const Json::Value& in, const std::string& k,
-                             std::string* out)  {
-  Json::Value x;
-  return GetValueFromJsonObject(in, k, &x) && GetStringFromJson(x, out);
-}
-
-bool GetBoolFromJsonObject(const Json::Value& in, const std::string& k,
-                           bool* out) {
-  Json::Value x;
-  return GetValueFromJsonObject(in, k, &x) && GetBoolFromJson(x, out);
-}
-
-bool GetDoubleFromJsonObject(const Json::Value& in, const std::string& k,
-                             double* out) {
-  Json::Value x;
-  return GetValueFromJsonObject(in, k, &x) && GetDoubleFromJson(x, out);
-}
-
-std::string JsonValueToString(const Json::Value& json) {
-  Json::FastWriter w;
-  std::string value = w.write(json);
-  return value.substr(0, value.size() - 1);  // trim trailing newline
-}
-
-}  // namespace rtc
diff --git a/rtc_base/json.h b/rtc_base/json.h
deleted file mode 100644
index 7e1050e..0000000
--- a/rtc_base/json.h
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- *  Copyright 2004 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_RTC_BASE_JSON_H_
-#define WEBRTC_RTC_BASE_JSON_H_
-
-#include <string>
-#include <vector>
-
-#if !defined(WEBRTC_EXTERNAL_JSON)
-#include "json/json.h"
-#else
-#include "third_party/jsoncpp/json.h"
-#endif
-
-namespace rtc {
-
-///////////////////////////////////////////////////////////////////////////////
-// JSON Helpers
-///////////////////////////////////////////////////////////////////////////////
-
-// Robust conversion operators, better than the ones in JsonCpp.
-bool GetIntFromJson(const Json::Value& in, int* out);
-bool GetUIntFromJson(const Json::Value& in, unsigned int* out);
-bool GetStringFromJson(const Json::Value& in, std::string* out);
-bool GetBoolFromJson(const Json::Value& in, bool* out);
-bool GetDoubleFromJson(const Json::Value& in, double* out);
-
-// Pull values out of a JSON array.
-bool GetValueFromJsonArray(const Json::Value& in, size_t n,
-                           Json::Value* out);
-bool GetIntFromJsonArray(const Json::Value& in, size_t n,
-                         int* out);
-bool GetUIntFromJsonArray(const Json::Value& in, size_t n,
-                          unsigned int* out);
-bool GetStringFromJsonArray(const Json::Value& in, size_t n,
-                            std::string* out);
-bool GetBoolFromJsonArray(const Json::Value& in, size_t n,
-                          bool* out);
-bool GetDoubleFromJsonArray(const Json::Value& in, size_t n,
-                            double* out);
-
-// Convert json arrays to std::vector
-bool JsonArrayToValueVector(const Json::Value& in,
-                            std::vector<Json::Value>* out);
-bool JsonArrayToIntVector(const Json::Value& in,
-                          std::vector<int>* out);
-bool JsonArrayToUIntVector(const Json::Value& in,
-                           std::vector<unsigned int>* out);
-bool JsonArrayToStringVector(const Json::Value& in,
-                             std::vector<std::string>* out);
-bool JsonArrayToBoolVector(const Json::Value& in,
-                           std::vector<bool>* out);
-bool JsonArrayToDoubleVector(const Json::Value& in,
-                             std::vector<double>* out);
-
-// Convert std::vector to json array
-Json::Value ValueVectorToJsonArray(const std::vector<Json::Value>& in);
-Json::Value IntVectorToJsonArray(const std::vector<int>& in);
-Json::Value UIntVectorToJsonArray(const std::vector<unsigned int>& in);
-Json::Value StringVectorToJsonArray(const std::vector<std::string>& in);
-Json::Value BoolVectorToJsonArray(const std::vector<bool>& in);
-Json::Value DoubleVectorToJsonArray(const std::vector<double>& in);
-
-// Pull values out of a JSON object.
-bool GetValueFromJsonObject(const Json::Value& in, const std::string& k,
-                            Json::Value* out);
-bool GetIntFromJsonObject(const Json::Value& in, const std::string& k,
-                          int* out);
-bool GetUIntFromJsonObject(const Json::Value& in, const std::string& k,
-                           unsigned int* out);
-bool GetStringFromJsonObject(const Json::Value& in, const std::string& k,
-                             std::string* out);
-bool GetBoolFromJsonObject(const Json::Value& in, const std::string& k,
-                           bool* out);
-bool GetDoubleFromJsonObject(const Json::Value& in, const std::string& k,
-                             double* out);
-
-// Writes out a Json value as a string.
-std::string JsonValueToString(const Json::Value& json);
-
-}  // namespace rtc
-
-#endif  // WEBRTC_RTC_BASE_JSON_H_
diff --git a/rtc_base/json_unittest.cc b/rtc_base/json_unittest.cc
deleted file mode 100644
index 5b65bc8..0000000
--- a/rtc_base/json_unittest.cc
+++ /dev/null
@@ -1,283 +0,0 @@
-/*
- *  Copyright 2009 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/rtc_base/json.h"
-
-#include <vector>
-
-#include "webrtc/rtc_base/gunit.h"
-
-namespace rtc {
-
-static Json::Value in_s("foo");
-static Json::Value in_sn("99");
-static Json::Value in_si("-99");
-static Json::Value in_sb("true");
-static Json::Value in_sd("1.2");
-static Json::Value in_n(12);
-static Json::Value in_i(-12);
-static Json::Value in_u(34U);
-static Json::Value in_b(true);
-static Json::Value in_d(1.2);
-static Json::Value big_sn("12345678901234567890");
-static Json::Value big_si("-12345678901234567890");
-static Json::Value big_u(0xFFFFFFFF);
-static Json::Value bad_a(Json::arrayValue);
-static Json::Value bad_o(Json::objectValue);
-
-TEST(JsonTest, GetString) {
-  std::string out;
-  EXPECT_TRUE(GetStringFromJson(in_s, &out));
-  EXPECT_EQ("foo", out);
-  EXPECT_TRUE(GetStringFromJson(in_sn, &out));
-  EXPECT_EQ("99", out);
-  EXPECT_TRUE(GetStringFromJson(in_si, &out));
-  EXPECT_EQ("-99", out);
-  EXPECT_TRUE(GetStringFromJson(in_i, &out));
-  EXPECT_EQ("-12", out);
-  EXPECT_TRUE(GetStringFromJson(in_n, &out));
-  EXPECT_EQ("12", out);
-  EXPECT_TRUE(GetStringFromJson(in_u, &out));
-  EXPECT_EQ("34", out);
-  EXPECT_TRUE(GetStringFromJson(in_b, &out));
-  EXPECT_EQ("true", out);
-  // Not supported here yet.
-  EXPECT_FALSE(GetStringFromJson(bad_a, &out));
-  EXPECT_FALSE(GetStringFromJson(bad_o, &out));
-}
-
-TEST(JsonTest, GetInt) {
-  int out;
-  EXPECT_TRUE(GetIntFromJson(in_sn, &out));
-  EXPECT_EQ(99, out);
-  EXPECT_TRUE(GetIntFromJson(in_si, &out));
-  EXPECT_EQ(-99, out);
-  EXPECT_TRUE(GetIntFromJson(in_n, &out));
-  EXPECT_EQ(12, out);
-  EXPECT_TRUE(GetIntFromJson(in_i, &out));
-  EXPECT_EQ(-12, out);
-  EXPECT_TRUE(GetIntFromJson(in_u, &out));
-  EXPECT_EQ(34, out);
-  EXPECT_TRUE(GetIntFromJson(in_b, &out));
-  EXPECT_EQ(1, out);
-  EXPECT_FALSE(GetIntFromJson(in_s, &out));
-  EXPECT_FALSE(GetIntFromJson(big_sn, &out));
-  EXPECT_FALSE(GetIntFromJson(big_si, &out));
-  EXPECT_FALSE(GetIntFromJson(big_u, &out));
-  EXPECT_FALSE(GetIntFromJson(bad_a, &out));
-  EXPECT_FALSE(GetIntFromJson(bad_o, &out));
-}
-
-TEST(JsonTest, GetUInt) {
-  unsigned int out;
-  EXPECT_TRUE(GetUIntFromJson(in_sn, &out));
-  EXPECT_EQ(99U, out);
-  EXPECT_TRUE(GetUIntFromJson(in_n, &out));
-  EXPECT_EQ(12U, out);
-  EXPECT_TRUE(GetUIntFromJson(in_u, &out));
-  EXPECT_EQ(34U, out);
-  EXPECT_TRUE(GetUIntFromJson(in_b, &out));
-  EXPECT_EQ(1U, out);
-  EXPECT_TRUE(GetUIntFromJson(big_u, &out));
-  EXPECT_EQ(0xFFFFFFFFU, out);
-  EXPECT_FALSE(GetUIntFromJson(in_s, &out));
-  // TODO: Fail reading negative strings.
-  // EXPECT_FALSE(GetUIntFromJson(in_si, &out));
-  EXPECT_FALSE(GetUIntFromJson(in_i, &out));
-  EXPECT_FALSE(GetUIntFromJson(big_sn, &out));
-  EXPECT_FALSE(GetUIntFromJson(big_si, &out));
-  EXPECT_FALSE(GetUIntFromJson(bad_a, &out));
-  EXPECT_FALSE(GetUIntFromJson(bad_o, &out));
-}
-
-TEST(JsonTest, GetBool) {
-  bool out;
-  EXPECT_TRUE(GetBoolFromJson(in_sb, &out));
-  EXPECT_EQ(true, out);
-  EXPECT_TRUE(GetBoolFromJson(in_n, &out));
-  EXPECT_EQ(true, out);
-  EXPECT_TRUE(GetBoolFromJson(in_i, &out));
-  EXPECT_EQ(true, out);
-  EXPECT_TRUE(GetBoolFromJson(in_u, &out));
-  EXPECT_EQ(true, out);
-  EXPECT_TRUE(GetBoolFromJson(in_b, &out));
-  EXPECT_EQ(true, out);
-  EXPECT_TRUE(GetBoolFromJson(big_u, &out));
-  EXPECT_EQ(true, out);
-  EXPECT_FALSE(GetBoolFromJson(in_s, &out));
-  EXPECT_FALSE(GetBoolFromJson(in_sn, &out));
-  EXPECT_FALSE(GetBoolFromJson(in_si, &out));
-  EXPECT_FALSE(GetBoolFromJson(big_sn, &out));
-  EXPECT_FALSE(GetBoolFromJson(big_si, &out));
-  EXPECT_FALSE(GetBoolFromJson(bad_a, &out));
-  EXPECT_FALSE(GetBoolFromJson(bad_o, &out));
-}
-
-TEST(JsonTest, GetDouble) {
-  double out;
-  EXPECT_TRUE(GetDoubleFromJson(in_sn, &out));
-  EXPECT_EQ(99, out);
-  EXPECT_TRUE(GetDoubleFromJson(in_si, &out));
-  EXPECT_EQ(-99, out);
-  EXPECT_TRUE(GetDoubleFromJson(in_sd, &out));
-  EXPECT_EQ(1.2, out);
-  EXPECT_TRUE(GetDoubleFromJson(in_n, &out));
-  EXPECT_EQ(12, out);
-  EXPECT_TRUE(GetDoubleFromJson(in_i, &out));
-  EXPECT_EQ(-12, out);
-  EXPECT_TRUE(GetDoubleFromJson(in_u, &out));
-  EXPECT_EQ(34, out);
-  EXPECT_TRUE(GetDoubleFromJson(in_b, &out));
-  EXPECT_EQ(1, out);
-  EXPECT_TRUE(GetDoubleFromJson(in_d, &out));
-  EXPECT_EQ(1.2, out);
-  EXPECT_FALSE(GetDoubleFromJson(in_s, &out));
-}
-
-TEST(JsonTest, GetFromArray) {
-  Json::Value a, out;
-  a.append(in_s);
-  a.append(in_i);
-  a.append(in_u);
-  a.append(in_b);
-  EXPECT_TRUE(GetValueFromJsonArray(a, 0, &out));
-  EXPECT_TRUE(GetValueFromJsonArray(a, 3, &out));
-  EXPECT_FALSE(GetValueFromJsonArray(a, 99, &out));
-  EXPECT_FALSE(GetValueFromJsonArray(a, 0xFFFFFFFF, &out));
-}
-
-TEST(JsonTest, GetFromObject) {
-  Json::Value o, out;
-  o["string"] = in_s;
-  o["int"] = in_i;
-  o["uint"] = in_u;
-  o["bool"] = in_b;
-  EXPECT_TRUE(GetValueFromJsonObject(o, "int", &out));
-  EXPECT_TRUE(GetValueFromJsonObject(o, "bool", &out));
-  EXPECT_FALSE(GetValueFromJsonObject(o, "foo", &out));
-  EXPECT_FALSE(GetValueFromJsonObject(o, "", &out));
-}
-
-namespace {
-template <typename T>
-std::vector<T> VecOf3(const T& a, const T& b, const T& c) {
-  std::vector<T> in;
-  in.push_back(a);
-  in.push_back(b);
-  in.push_back(c);
-  return in;
-}
-template <typename T>
-Json::Value JsonVecOf3(const T& a, const T& b, const T& c) {
-  Json::Value in(Json::arrayValue);
-  in.append(a);
-  in.append(b);
-  in.append(c);
-  return in;
-}
-}  // unnamed namespace
-
-TEST(JsonTest, ValueVectorToFromArray) {
-  std::vector<Json::Value> in = VecOf3<Json::Value>("a", "b", "c");
-  Json::Value out = ValueVectorToJsonArray(in);
-  EXPECT_EQ(in.size(), out.size());
-  for (Json::Value::ArrayIndex i = 0; i < in.size(); ++i) {
-    EXPECT_EQ(in[i].asString(), out[i].asString());
-  }
-  Json::Value inj = JsonVecOf3<Json::Value>("a", "b", "c");
-  EXPECT_EQ(inj, out);
-  std::vector<Json::Value> outj;
-  EXPECT_TRUE(JsonArrayToValueVector(inj, &outj));
-  for (Json::Value::ArrayIndex i = 0; i < in.size(); i++) {
-    EXPECT_EQ(in[i], outj[i]);
-  }
-}
-
-TEST(JsonTest, IntVectorToFromArray) {
-  std::vector<int> in = VecOf3<int>(1, 2, 3);
-  Json::Value out = IntVectorToJsonArray(in);
-  EXPECT_EQ(in.size(), out.size());
-  for (Json::Value::ArrayIndex i = 0; i < in.size(); ++i) {
-    EXPECT_EQ(in[i], out[i].asInt());
-  }
-  Json::Value inj = JsonVecOf3<int>(1, 2, 3);
-  EXPECT_EQ(inj, out);
-  std::vector<int> outj;
-  EXPECT_TRUE(JsonArrayToIntVector(inj, &outj));
-  for (Json::Value::ArrayIndex i = 0; i < in.size(); i++) {
-    EXPECT_EQ(in[i], outj[i]);
-  }
-}
-
-TEST(JsonTest, UIntVectorToFromArray) {
-  std::vector<unsigned int> in = VecOf3<unsigned int>(1, 2, 3);
-  Json::Value out = UIntVectorToJsonArray(in);
-  EXPECT_EQ(in.size(), out.size());
-  for (Json::Value::ArrayIndex i = 0; i < in.size(); ++i) {
-    EXPECT_EQ(in[i], out[i].asUInt());
-  }
-  Json::Value inj = JsonVecOf3<unsigned int>(1, 2, 3);
-  EXPECT_EQ(inj, out);
-  std::vector<unsigned int> outj;
-  EXPECT_TRUE(JsonArrayToUIntVector(inj, &outj));
-  for (Json::Value::ArrayIndex i = 0; i < in.size(); i++) {
-    EXPECT_EQ(in[i], outj[i]);
-  }
-}
-
-TEST(JsonTest, StringVectorToFromArray) {
-  std::vector<std::string> in = VecOf3<std::string>("a", "b", "c");
-  Json::Value out = StringVectorToJsonArray(in);
-  EXPECT_EQ(in.size(), out.size());
-  for (Json::Value::ArrayIndex i = 0; i < in.size(); ++i) {
-    EXPECT_EQ(in[i], out[i].asString());
-  }
-  Json::Value inj = JsonVecOf3<std::string>("a", "b", "c");
-  EXPECT_EQ(inj, out);
-  std::vector<std::string> outj;
-  EXPECT_TRUE(JsonArrayToStringVector(inj, &outj));
-  for (Json::Value::ArrayIndex i = 0; i < in.size(); i++) {
-    EXPECT_EQ(in[i], outj[i]);
-  }
-}
-
-TEST(JsonTest, BoolVectorToFromArray) {
-  std::vector<bool> in = VecOf3<bool>(false, true, false);
-  Json::Value out = BoolVectorToJsonArray(in);
-  EXPECT_EQ(in.size(), out.size());
-  for (Json::Value::ArrayIndex i = 0; i < in.size(); ++i) {
-    EXPECT_EQ(in[i], out[i].asBool());
-  }
-  Json::Value inj = JsonVecOf3<bool>(false, true, false);
-  EXPECT_EQ(inj, out);
-  std::vector<bool> outj;
-  EXPECT_TRUE(JsonArrayToBoolVector(inj, &outj));
-  for (Json::Value::ArrayIndex i = 0; i < in.size(); i++) {
-    EXPECT_EQ(in[i], outj[i]);
-  }
-}
-
-TEST(JsonTest, DoubleVectorToFromArray) {
-  std::vector<double> in = VecOf3<double>(1.0, 2.0, 3.0);
-  Json::Value out = DoubleVectorToJsonArray(in);
-  EXPECT_EQ(in.size(), out.size());
-  for (Json::Value::ArrayIndex i = 0; i < in.size(); ++i) {
-    EXPECT_EQ(in[i], out[i].asDouble());
-  }
-  Json::Value inj = JsonVecOf3<double>(1.0, 2.0, 3.0);
-  EXPECT_EQ(inj, out);
-  std::vector<double> outj;
-  EXPECT_TRUE(JsonArrayToDoubleVector(inj, &outj));
-  for (Json::Value::ArrayIndex i = 0; i < in.size(); i++) {
-    EXPECT_EQ(in[i], outj[i]);
-  }
-}
-
-}  // namespace rtc
diff --git a/rtc_base/keep_ref_until_done.h b/rtc_base/keep_ref_until_done.h
deleted file mode 100644
index 79f361c..0000000
--- a/rtc_base/keep_ref_until_done.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- *  Copyright 2015 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_RTC_BASE_KEEP_REF_UNTIL_DONE_H_
-#define WEBRTC_RTC_BASE_KEEP_REF_UNTIL_DONE_H_
-
-#include "webrtc/rtc_base/bind.h"
-#include "webrtc/rtc_base/callback.h"
-#include "webrtc/rtc_base/refcount.h"
-#include "webrtc/rtc_base/scoped_ref_ptr.h"
-
-namespace rtc {
-
-namespace impl {
-template <class T>
-static inline void DoNothing(const scoped_refptr<T>& object) {}
-}  // namespace impl
-
-// KeepRefUntilDone keeps a reference to |object| until the returned
-// callback goes out of scope. If the returned callback is copied, the
-// reference will be released when the last callback goes out of scope.
-template <class ObjectT>
-static inline Callback0<void> KeepRefUntilDone(ObjectT* object) {
-  return rtc::Bind(&impl::DoNothing<ObjectT>, scoped_refptr<ObjectT>(object));
-}
-
-template <class ObjectT>
-static inline Callback0<void> KeepRefUntilDone(
-    const scoped_refptr<ObjectT>& object) {
-  return rtc::Bind(&impl::DoNothing<ObjectT>, object);
-}
-
-}  // namespace rtc
-
-
-#endif  // WEBRTC_RTC_BASE_KEEP_REF_UNTIL_DONE_H_
diff --git a/rtc_base/location.cc b/rtc_base/location.cc
deleted file mode 100644
index 9b0a5f6..0000000
--- a/rtc_base/location.cc
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- *  Copyright 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/rtc_base/location.h"
-
-#include "webrtc/rtc_base/stringutils.h"
-
-namespace rtc {
-
-Location::Location(const char* function_name, const char* file_and_line)
-    : function_name_(function_name), file_and_line_(file_and_line) {}
-
-Location::Location() : function_name_("Unknown"), file_and_line_("Unknown") {}
-
-Location::Location(const Location& other)
-    : function_name_(other.function_name_),
-      file_and_line_(other.file_and_line_) {}
-
-Location& Location::operator=(const Location& other) {
-  function_name_ = other.function_name_;
-  file_and_line_ = other.file_and_line_;
-  return *this;
-}
-
-std::string Location::ToString() const {
-  char buf[256];
-  sprintfn(buf, sizeof(buf), "%s@%s", function_name_, file_and_line_);
-  return buf;
-}
-
-}  // namespace rtc
diff --git a/rtc_base/location.h b/rtc_base/location.h
deleted file mode 100644
index dd1b1ca..0000000
--- a/rtc_base/location.h
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- *  Copyright 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_RTC_BASE_LOCATION_H_
-#define WEBRTC_RTC_BASE_LOCATION_H_
-
-#include <string>
-
-#include "webrtc/rtc_base/stringize_macros.h"
-
-namespace rtc {
-
-// Location provides basic info where of an object was constructed, or was
-// significantly brought to life.
-// This is a stripped down version of:
-// https://code.google.com/p/chromium/codesearch#chromium/src/base/location.h
-class Location {
- public:
-  // Constructor should be called with a long-lived char*, such as __FILE__.
-  // It assumes the provided value will persist as a global constant, and it
-  // will not make a copy of it.
-  //
-  // TODO(deadbeef): Tracing is currently limited to 2 arguments, which is
-  // why the file name and line number are combined into one argument.
-  //
-  // Once TracingV2 is available, separate the file name and line number.
-  Location(const char* function_name, const char* file_and_line);
-  Location();
-  Location(const Location& other);
-  Location& operator=(const Location& other);
-
-  const char* function_name() const { return function_name_; }
-  const char* file_and_line() const { return file_and_line_; }
-
-  std::string ToString() const;
-
- private:
-  const char* function_name_;
-  const char* file_and_line_;
-};
-
-// Define a macro to record the current source location.
-#define RTC_FROM_HERE RTC_FROM_HERE_WITH_FUNCTION(__FUNCTION__)
-
-#define RTC_FROM_HERE_WITH_FUNCTION(function_name) \
-  ::rtc::Location(function_name, __FILE__ ":" STRINGIZE(__LINE__))
-
-}  // namespace rtc
-
-#endif  // WEBRTC_RTC_BASE_LOCATION_H_
diff --git a/rtc_base/logging.cc b/rtc_base/logging.cc
deleted file mode 100644
index d52bd7a..0000000
--- a/rtc_base/logging.cc
+++ /dev/null
@@ -1,562 +0,0 @@
-/*
- *  Copyright 2004 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.
- */
-
-#if defined(WEBRTC_WIN)
-#if !defined(WIN32_LEAN_AND_MEAN)
-#define WIN32_LEAN_AND_MEAN
-#endif
-#include <windows.h>
-#if _MSC_VER < 1900
-#define snprintf _snprintf
-#endif
-#undef ERROR  // wingdi.h
-#endif
-
-#if defined(WEBRTC_MAC) && !defined(WEBRTC_IOS)
-#include <CoreServices/CoreServices.h>
-#elif defined(WEBRTC_ANDROID)
-#include <android/log.h>
-// Android has a 1024 limit on log inputs. We use 60 chars as an
-// approx for the header/tag portion.
-// See android/system/core/liblog/logd_write.c
-static const int kMaxLogLineSize = 1024 - 60;
-#endif  // WEBRTC_MAC && !defined(WEBRTC_IOS) || WEBRTC_ANDROID
-
-static const char kLibjingle[] = "libjingle";
-
-#include <time.h>
-#include <limits.h>
-
-#include <algorithm>
-#include <iomanip>
-#include <ostream>
-#include <vector>
-
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/platform_thread.h"
-#include "webrtc/rtc_base/stringencode.h"
-#include "webrtc/rtc_base/stringutils.h"
-#include "webrtc/rtc_base/timeutils.h"
-
-namespace rtc {
-namespace {
-
-// Return the filename portion of the string (that following the last slash).
-const char* FilenameFromPath(const char* file) {
-  const char* end1 = ::strrchr(file, '/');
-  const char* end2 = ::strrchr(file, '\\');
-  if (!end1 && !end2)
-    return file;
-  else
-    return (end1 > end2) ? end1 + 1 : end2 + 1;
-}
-
-}  // namespace
-
-/////////////////////////////////////////////////////////////////////////////
-// Constant Labels
-/////////////////////////////////////////////////////////////////////////////
-
-const char* FindLabel(int value, const ConstantLabel entries[]) {
-  for (int i = 0; entries[i].label; ++i) {
-    if (value == entries[i].value) {
-      return entries[i].label;
-    }
-  }
-  return 0;
-}
-
-std::string ErrorName(int err, const ConstantLabel* err_table) {
-  if (err == 0)
-    return "No error";
-
-  if (err_table != 0) {
-    if (const char* value = FindLabel(err, err_table))
-      return value;
-  }
-
-  char buffer[16];
-  snprintf(buffer, sizeof(buffer), "0x%08x", err);
-  return buffer;
-}
-
-/////////////////////////////////////////////////////////////////////////////
-// LogMessage
-/////////////////////////////////////////////////////////////////////////////
-
-// By default, release builds don't log, debug builds at info level
-#if !defined(NDEBUG)
-LoggingSeverity LogMessage::min_sev_ = LS_INFO;
-LoggingSeverity LogMessage::dbg_sev_ = LS_INFO;
-#else
-LoggingSeverity LogMessage::min_sev_ = LS_NONE;
-LoggingSeverity LogMessage::dbg_sev_ = LS_NONE;
-#endif
-bool LogMessage::log_to_stderr_ = true;
-
-namespace {
-// Global lock for log subsystem, only needed to serialize access to streams_.
-CriticalSection g_log_crit;
-}  // namespace
-
-// The list of logging streams currently configured.
-// Note: we explicitly do not clean this up, because of the uncertain ordering
-// of destructors at program exit.  Let the person who sets the stream trigger
-// cleanup by setting to null, or let it leak (safe at program exit).
-LogMessage::StreamList LogMessage::streams_ RTC_GUARDED_BY(g_log_crit);
-
-// Boolean options default to false (0)
-bool LogMessage::thread_, LogMessage::timestamp_;
-
-LogMessage::LogMessage(const char* file,
-                       int line,
-                       LoggingSeverity sev,
-                       LogErrorContext err_ctx,
-                       int err,
-                       const char* module)
-    : severity_(sev), tag_(kLibjingle) {
-  if (timestamp_) {
-    // Use SystemTimeMillis so that even if tests use fake clocks, the timestamp
-    // in log messages represents the real system time.
-    int64_t time = TimeDiff(SystemTimeMillis(), LogStartTime());
-    // Also ensure WallClockStartTime is initialized, so that it matches
-    // LogStartTime.
-    WallClockStartTime();
-    print_stream_ << "[" << std::setfill('0') << std::setw(3) << (time / 1000)
-                  << ":" << std::setw(3) << (time % 1000) << std::setfill(' ')
-                  << "] ";
-  }
-
-  if (thread_) {
-    PlatformThreadId id = CurrentThreadId();
-    print_stream_ << "[" << std::dec << id << "] ";
-  }
-
-  if (file != nullptr)
-    print_stream_ << "(" << FilenameFromPath(file)  << ":" << line << "): ";
-
-  if (err_ctx != ERRCTX_NONE) {
-    std::ostringstream tmp;
-    tmp << "[0x" << std::setfill('0') << std::hex << std::setw(8) << err << "]";
-    switch (err_ctx) {
-      case ERRCTX_ERRNO:
-        tmp << " " << strerror(err);
-        break;
-#ifdef WEBRTC_WIN
-      case ERRCTX_HRESULT: {
-        char msgbuf[256];
-        DWORD flags = FORMAT_MESSAGE_FROM_SYSTEM;
-        HMODULE hmod = GetModuleHandleA(module);
-        if (hmod)
-          flags |= FORMAT_MESSAGE_FROM_HMODULE;
-        if (DWORD len = FormatMessageA(
-                flags, hmod, err, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
-                msgbuf, sizeof(msgbuf) / sizeof(msgbuf[0]), nullptr)) {
-          while ((len > 0) &&
-              isspace(static_cast<unsigned char>(msgbuf[len-1]))) {
-            msgbuf[--len] = 0;
-          }
-          tmp << " " << msgbuf;
-        }
-        break;
-      }
-#endif  // WEBRTC_WIN
-#if defined(WEBRTC_MAC) && !defined(WEBRTC_IOS)
-      case ERRCTX_OSSTATUS: {
-        std::string desc(DescriptionFromOSStatus(err));
-        tmp << " " << (desc.empty() ? "Unknown error" : desc.c_str());
-        break;
-      }
-#endif  // WEBRTC_MAC && !defined(WEBRTC_IOS)
-      default:
-        break;
-    }
-    extra_ = tmp.str();
-  }
-}
-
-LogMessage::LogMessage(const char* file,
-                       int line,
-                       LoggingSeverity sev,
-                       const std::string& tag)
-    : LogMessage(file,
-                 line,
-                 sev,
-                 ERRCTX_NONE,
-                 0 /* err */,
-                 nullptr /* module */) {
-  tag_ = tag;
-  print_stream_ << tag << ": ";
-}
-
-LogMessage::~LogMessage() {
-  if (!extra_.empty())
-    print_stream_ << " : " << extra_;
-  print_stream_ << std::endl;
-
-  const std::string& str = print_stream_.str();
-  if (severity_ >= dbg_sev_) {
-    OutputToDebug(str, severity_, tag_);
-  }
-
-  CritScope cs(&g_log_crit);
-  for (auto& kv : streams_) {
-    if (severity_ >= kv.second) {
-      kv.first->OnLogMessage(str);
-    }
-  }
-}
-
-int64_t LogMessage::LogStartTime() {
-  static const int64_t g_start = SystemTimeMillis();
-  return g_start;
-}
-
-uint32_t LogMessage::WallClockStartTime() {
-  static const uint32_t g_start_wallclock = time(nullptr);
-  return g_start_wallclock;
-}
-
-void LogMessage::LogThreads(bool on) {
-  thread_ = on;
-}
-
-void LogMessage::LogTimestamps(bool on) {
-  timestamp_ = on;
-}
-
-void LogMessage::LogToDebug(LoggingSeverity min_sev) {
-  dbg_sev_ = min_sev;
-  CritScope cs(&g_log_crit);
-  UpdateMinLogSeverity();
-}
-
-void LogMessage::SetLogToStderr(bool log_to_stderr) {
-  log_to_stderr_ = log_to_stderr;
-}
-
-int LogMessage::GetLogToStream(LogSink* stream) {
-  CritScope cs(&g_log_crit);
-  LoggingSeverity sev = LS_NONE;
-  for (auto& kv : streams_) {
-    if (!stream || stream == kv.first) {
-      sev = std::min(sev, kv.second);
-    }
-  }
-  return sev;
-}
-
-void LogMessage::AddLogToStream(LogSink* stream, LoggingSeverity min_sev) {
-  CritScope cs(&g_log_crit);
-  streams_.push_back(std::make_pair(stream, min_sev));
-  UpdateMinLogSeverity();
-}
-
-void LogMessage::RemoveLogToStream(LogSink* stream) {
-  CritScope cs(&g_log_crit);
-  for (StreamList::iterator it = streams_.begin(); it != streams_.end(); ++it) {
-    if (stream == it->first) {
-      streams_.erase(it);
-      break;
-    }
-  }
-  UpdateMinLogSeverity();
-}
-
-void LogMessage::ConfigureLogging(const char* params) {
-  LoggingSeverity current_level = LS_VERBOSE;
-  LoggingSeverity debug_level = GetLogToDebug();
-
-  std::vector<std::string> tokens;
-  tokenize(params, ' ', &tokens);
-
-  for (const std::string& token : tokens) {
-    if (token.empty())
-      continue;
-
-    // Logging features
-    if (token == "tstamp") {
-      LogTimestamps();
-    } else if (token == "thread") {
-      LogThreads();
-
-    // Logging levels
-    } else if (token == "sensitive") {
-      current_level = LS_SENSITIVE;
-    } else if (token == "verbose") {
-      current_level = LS_VERBOSE;
-    } else if (token == "info") {
-      current_level = LS_INFO;
-    } else if (token == "warning") {
-      current_level = LS_WARNING;
-    } else if (token == "error") {
-      current_level = LS_ERROR;
-    } else if (token == "none") {
-      current_level = LS_NONE;
-
-    // Logging targets
-    } else if (token == "debug") {
-      debug_level = current_level;
-    }
-  }
-
-#if defined(WEBRTC_WIN)
-  if ((LS_NONE != debug_level) && !::IsDebuggerPresent()) {
-    // First, attempt to attach to our parent's console... so if you invoke
-    // from the command line, we'll see the output there.  Otherwise, create
-    // our own console window.
-    // Note: These methods fail if a console already exists, which is fine.
-    bool success = false;
-    typedef BOOL (WINAPI* PFN_AttachConsole)(DWORD);
-    if (HINSTANCE kernel32 = ::LoadLibrary(L"kernel32.dll")) {
-      // AttachConsole is defined on WinXP+.
-      if (PFN_AttachConsole attach_console = reinterpret_cast<PFN_AttachConsole>
-            (::GetProcAddress(kernel32, "AttachConsole"))) {
-        success = (FALSE != attach_console(ATTACH_PARENT_PROCESS));
-      }
-      ::FreeLibrary(kernel32);
-    }
-    if (!success) {
-      ::AllocConsole();
-    }
-  }
-#endif  // WEBRTC_WIN
-
-  LogToDebug(debug_level);
-}
-
-void LogMessage::UpdateMinLogSeverity()
-    RTC_EXCLUSIVE_LOCKS_REQUIRED(g_log_crit) {
-  LoggingSeverity min_sev = dbg_sev_;
-  for (auto& kv : streams_) {
-    min_sev = std::min(dbg_sev_, kv.second);
-  }
-  min_sev_ = min_sev;
-}
-
-void LogMessage::OutputToDebug(const std::string& str,
-                               LoggingSeverity severity,
-                               const std::string& tag) {
-  bool log_to_stderr = log_to_stderr_;
-#if defined(WEBRTC_MAC) && !defined(WEBRTC_IOS) && defined(NDEBUG)
-  // On the Mac, all stderr output goes to the Console log and causes clutter.
-  // So in opt builds, don't log to stderr unless the user specifically sets
-  // a preference to do so.
-  CFStringRef key = CFStringCreateWithCString(kCFAllocatorDefault,
-                                              "logToStdErr",
-                                              kCFStringEncodingUTF8);
-  CFStringRef domain = CFBundleGetIdentifier(CFBundleGetMainBundle());
-  if (key != nullptr && domain != nullptr) {
-    Boolean exists_and_is_valid;
-    Boolean should_log =
-        CFPreferencesGetAppBooleanValue(key, domain, &exists_and_is_valid);
-    // If the key doesn't exist or is invalid or is false, we will not log to
-    // stderr.
-    log_to_stderr = exists_and_is_valid && should_log;
-  }
-  if (key != nullptr) {
-    CFRelease(key);
-  }
-#endif
-#if defined(WEBRTC_WIN)
-  // Always log to the debugger.
-  // Perhaps stderr should be controlled by a preference, as on Mac?
-  OutputDebugStringA(str.c_str());
-  if (log_to_stderr) {
-    // This handles dynamically allocated consoles, too.
-    if (HANDLE error_handle = ::GetStdHandle(STD_ERROR_HANDLE)) {
-      log_to_stderr = false;
-      DWORD written = 0;
-      ::WriteFile(error_handle, str.data(), static_cast<DWORD>(str.size()),
-                  &written, 0);
-    }
-  }
-#endif  // WEBRTC_WIN
-#if defined(WEBRTC_ANDROID)
-  // Android's logging facility uses severity to log messages but we
-  // need to map libjingle's severity levels to Android ones first.
-  // Also write to stderr which maybe available to executable started
-  // from the shell.
-  int prio;
-  switch (severity) {
-    case LS_SENSITIVE:
-      __android_log_write(ANDROID_LOG_INFO, tag.c_str(), "SENSITIVE");
-      if (log_to_stderr) {
-        fprintf(stderr, "SENSITIVE");
-        fflush(stderr);
-      }
-      return;
-    case LS_VERBOSE:
-      prio = ANDROID_LOG_VERBOSE;
-      break;
-    case LS_INFO:
-      prio = ANDROID_LOG_INFO;
-      break;
-    case LS_WARNING:
-      prio = ANDROID_LOG_WARN;
-      break;
-    case LS_ERROR:
-      prio = ANDROID_LOG_ERROR;
-      break;
-    default:
-      prio = ANDROID_LOG_UNKNOWN;
-  }
-
-  int size = str.size();
-  int line = 0;
-  int idx = 0;
-  const int max_lines = size / kMaxLogLineSize + 1;
-  if (max_lines == 1) {
-    __android_log_print(prio, tag.c_str(), "%.*s", size, str.c_str());
-  } else {
-    while (size > 0) {
-      const int len = std::min(size, kMaxLogLineSize);
-      // Use the size of the string in the format (str may have \0 in the
-      // middle).
-      __android_log_print(prio, tag.c_str(), "[%d/%d] %.*s",
-                          line + 1, max_lines,
-                          len, str.c_str() + idx);
-      idx += len;
-      size -= len;
-      ++line;
-    }
-  }
-#endif  // WEBRTC_ANDROID
-  if (log_to_stderr) {
-    fprintf(stderr, "%s", str.c_str());
-    fflush(stderr);
-  }
-}
-
-//////////////////////////////////////////////////////////////////////
-// Logging Helpers
-//////////////////////////////////////////////////////////////////////
-
-void LogMultiline(LoggingSeverity level, const char* label, bool input,
-                  const void* data, size_t len, bool hex_mode,
-                  LogMultilineState* state) {
-  if (!LOG_CHECK_LEVEL_V(level))
-    return;
-
-  const char * direction = (input ? " << " : " >> ");
-
-  // null data means to flush our count of unprintable characters.
-  if (!data) {
-    if (state && state->unprintable_count_[input]) {
-      LOG_V(level) << label << direction << "## "
-                   << state->unprintable_count_[input]
-                   << " consecutive unprintable ##";
-      state->unprintable_count_[input] = 0;
-    }
-    return;
-  }
-
-  // The ctype classification functions want unsigned chars.
-  const unsigned char* udata = static_cast<const unsigned char*>(data);
-
-  if (hex_mode) {
-    const size_t LINE_SIZE = 24;
-    char hex_line[LINE_SIZE * 9 / 4 + 2], asc_line[LINE_SIZE + 1];
-    while (len > 0) {
-      memset(asc_line, ' ', sizeof(asc_line));
-      memset(hex_line, ' ', sizeof(hex_line));
-      size_t line_len = std::min(len, LINE_SIZE);
-      for (size_t i = 0; i < line_len; ++i) {
-        unsigned char ch = udata[i];
-        asc_line[i] = isprint(ch) ? ch : '.';
-        hex_line[i*2 + i/4] = hex_encode(ch >> 4);
-        hex_line[i*2 + i/4 + 1] = hex_encode(ch & 0xf);
-      }
-      asc_line[sizeof(asc_line)-1] = 0;
-      hex_line[sizeof(hex_line)-1] = 0;
-      LOG_V(level) << label << direction
-                   << asc_line << " " << hex_line << " ";
-      udata += line_len;
-      len -= line_len;
-    }
-    return;
-  }
-
-  size_t consecutive_unprintable = state ? state->unprintable_count_[input] : 0;
-
-  const unsigned char* end = udata + len;
-  while (udata < end) {
-    const unsigned char* line = udata;
-    const unsigned char* end_of_line = strchrn<unsigned char>(udata,
-                                                              end - udata,
-                                                              '\n');
-    if (!end_of_line) {
-      udata = end_of_line = end;
-    } else {
-      udata = end_of_line + 1;
-    }
-
-    bool is_printable = true;
-
-    // If we are in unprintable mode, we need to see a line of at least
-    // kMinPrintableLine characters before we'll switch back.
-    const ptrdiff_t kMinPrintableLine = 4;
-    if (consecutive_unprintable && ((end_of_line - line) < kMinPrintableLine)) {
-      is_printable = false;
-    } else {
-      // Determine if the line contains only whitespace and printable
-      // characters.
-      bool is_entirely_whitespace = true;
-      for (const unsigned char* pos = line; pos < end_of_line; ++pos) {
-        if (isspace(*pos))
-          continue;
-        is_entirely_whitespace = false;
-        if (!isprint(*pos)) {
-          is_printable = false;
-          break;
-        }
-      }
-      // Treat an empty line following unprintable data as unprintable.
-      if (consecutive_unprintable && is_entirely_whitespace) {
-        is_printable = false;
-      }
-    }
-    if (!is_printable) {
-      consecutive_unprintable += (udata - line);
-      continue;
-    }
-    // Print out the current line, but prefix with a count of prior unprintable
-    // characters.
-    if (consecutive_unprintable) {
-      LOG_V(level) << label << direction << "## " << consecutive_unprintable
-                  << " consecutive unprintable ##";
-      consecutive_unprintable = 0;
-    }
-    // Strip off trailing whitespace.
-    while ((end_of_line > line) && isspace(*(end_of_line-1))) {
-      --end_of_line;
-    }
-    // Filter out any private data
-    std::string substr(reinterpret_cast<const char*>(line), end_of_line - line);
-    std::string::size_type pos_private = substr.find("Email");
-    if (pos_private == std::string::npos) {
-      pos_private = substr.find("Passwd");
-    }
-    if (pos_private == std::string::npos) {
-      LOG_V(level) << label << direction << substr;
-    } else {
-      LOG_V(level) << label << direction << "## omitted for privacy ##";
-    }
-  }
-
-  if (state) {
-    state->unprintable_count_[input] = consecutive_unprintable;
-  }
-}
-
-//////////////////////////////////////////////////////////////////////
-
-}  // namespace rtc
diff --git a/rtc_base/logging.h b/rtc_base/logging.h
deleted file mode 100644
index 345e0d3..0000000
--- a/rtc_base/logging.h
+++ /dev/null
@@ -1,370 +0,0 @@
-/*
- *  Copyright 2004 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.
- */
-
-//   LOG(...) an ostream target that can be used to send formatted
-// output to a variety of logging targets, such as debugger console, stderr,
-// or any LogSink.
-//   The severity level passed as the first argument to the LOGging
-// functions is used as a filter, to limit the verbosity of the logging.
-//   Static members of LogMessage documented below are used to control the
-// verbosity and target of the output.
-//   There are several variations on the LOG macro which facilitate logging
-// of common error conditions, detailed below.
-
-// LOG(sev) logs the given stream at severity "sev", which must be a
-//     compile-time constant of the LoggingSeverity type, without the namespace
-//     prefix.
-// LOG_V(sev) Like LOG(), but sev is a run-time variable of the LoggingSeverity
-//     type (basically, it just doesn't prepend the namespace).
-// LOG_F(sev) Like LOG(), but includes the name of the current function.
-// LOG_T(sev) Like LOG(), but includes the this pointer.
-// LOG_T_F(sev) Like LOG_F(), but includes the this pointer.
-// LOG_GLE(M)(sev [, mod]) attempt to add a string description of the
-//     HRESULT returned by GetLastError.  The "M" variant allows searching of a
-//     DLL's string table for the error description.
-// LOG_ERRNO(sev) attempts to add a string description of an errno-derived
-//     error. errno and associated facilities exist on both Windows and POSIX,
-//     but on Windows they only apply to the C/C++ runtime.
-// LOG_ERR(sev) is an alias for the platform's normal error system, i.e. _GLE on
-//     Windows and _ERRNO on POSIX.
-// (The above three also all have _EX versions that let you specify the error
-// code, rather than using the last one.)
-// LOG_E(sev, ctx, err, ...) logs a detailed error interpreted using the
-//     specified context.
-// LOG_CHECK_LEVEL(sev) (and LOG_CHECK_LEVEL_V(sev)) can be used as a test
-//     before performing expensive or sensitive operations whose sole purpose is
-//     to output logging data at the desired level.
-// Lastly, PLOG(sev, err) is an alias for LOG_ERR_EX.
-
-#ifndef WEBRTC_RTC_BASE_LOGGING_H_
-#define WEBRTC_RTC_BASE_LOGGING_H_
-
-#include <errno.h>
-
-#include <list>
-#include <sstream>
-#include <string>
-#include <utility>
-
-#if defined(WEBRTC_MAC) && !defined(WEBRTC_IOS)
-#include <CoreServices/CoreServices.h>
-#endif
-
-#include "webrtc/rtc_base/basictypes.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/thread_annotations.h"
-
-namespace rtc {
-
-///////////////////////////////////////////////////////////////////////////////
-// ConstantLabel can be used to easily generate string names from constant
-// values.  This can be useful for logging descriptive names of error messages.
-// Usage:
-//   const ConstantLabel LIBRARY_ERRORS[] = {
-//     KLABEL(SOME_ERROR),
-//     KLABEL(SOME_OTHER_ERROR),
-//     ...
-//     LASTLABEL
-//   }
-//
-//   int err = LibraryFunc();
-//   LOG(LS_ERROR) << "LibraryFunc returned: "
-//                 << ErrorName(err, LIBRARY_ERRORS);
-
-struct ConstantLabel { int value; const char * label; };
-#define KLABEL(x) { x, #x }
-#define TLABEL(x, y) { x, y }
-#define LASTLABEL { 0, 0 }
-
-const char* FindLabel(int value, const ConstantLabel entries[]);
-std::string ErrorName(int err, const ConstantLabel* err_table);
-
-#if defined(WEBRTC_MAC) && !defined(WEBRTC_IOS)
-// Returns a UTF8 description from an OS X Status error.
-std::string DescriptionFromOSStatus(OSStatus err);
-#endif
-
-//////////////////////////////////////////////////////////////////////
-
-// Note that the non-standard LoggingSeverity aliases exist because they are
-// still in broad use.  The meanings of the levels are:
-//  LS_SENSITIVE: Information which should only be logged with the consent
-//   of the user, due to privacy concerns.
-//  LS_VERBOSE: This level is for data which we do not want to appear in the
-//   normal debug log, but should appear in diagnostic logs.
-//  LS_INFO: Chatty level used in debugging for all sorts of things, the default
-//   in debug builds.
-//  LS_WARNING: Something that may warrant investigation.
-//  LS_ERROR: Something that should not have occurred.
-//  LS_NONE: Don't log.
-enum LoggingSeverity {
-  LS_SENSITIVE,
-  LS_VERBOSE,
-  LS_INFO,
-  LS_WARNING,
-  LS_ERROR,
-  LS_NONE,
-  INFO = LS_INFO,
-  WARNING = LS_WARNING,
-  LERROR = LS_ERROR
-};
-
-// LogErrorContext assists in interpreting the meaning of an error value.
-enum LogErrorContext {
-  ERRCTX_NONE,
-  ERRCTX_ERRNO,     // System-local errno
-  ERRCTX_HRESULT,   // Windows HRESULT
-  ERRCTX_OSSTATUS,  // MacOS OSStatus
-
-  // Abbreviations for LOG_E macro
-  ERRCTX_EN = ERRCTX_ERRNO,     // LOG_E(sev, EN, x)
-  ERRCTX_HR = ERRCTX_HRESULT,   // LOG_E(sev, HR, x)
-  ERRCTX_OS = ERRCTX_OSSTATUS,  // LOG_E(sev, OS, x)
-};
-
-// Virtual sink interface that can receive log messages.
-class LogSink {
- public:
-  LogSink() {}
-  virtual ~LogSink() {}
-  virtual void OnLogMessage(const std::string& message) = 0;
-};
-
-class LogMessage {
- public:
-  LogMessage(const char* file,
-             int line,
-             LoggingSeverity sev,
-             LogErrorContext err_ctx = ERRCTX_NONE,
-             int err = 0,
-             const char* module = nullptr);
-
-  LogMessage(const char* file,
-             int line,
-             LoggingSeverity sev,
-             const std::string& tag);
-
-  ~LogMessage();
-
-  static inline bool Loggable(LoggingSeverity sev) { return (sev >= min_sev_); }
-  std::ostream& stream() { return print_stream_; }
-
-  // Returns the time at which this function was called for the first time.
-  // The time will be used as the logging start time.
-  // If this is not called externally, the LogMessage ctor also calls it, in
-  // which case the logging start time will be the time of the first LogMessage
-  // instance is created.
-  static int64_t LogStartTime();
-
-  // Returns the wall clock equivalent of |LogStartTime|, in seconds from the
-  // epoch.
-  static uint32_t WallClockStartTime();
-
-  //  LogThreads: Display the thread identifier of the current thread
-  static void LogThreads(bool on = true);
-
-  //  LogTimestamps: Display the elapsed time of the program
-  static void LogTimestamps(bool on = true);
-
-  // These are the available logging channels
-  //  Debug: Debug console on Windows, otherwise stderr
-  static void LogToDebug(LoggingSeverity min_sev);
-  static LoggingSeverity GetLogToDebug() { return dbg_sev_; }
-
-  // Sets whether logs will be directed to stderr in debug mode.
-  static void SetLogToStderr(bool log_to_stderr);
-
-  //  Stream: Any non-blocking stream interface.  LogMessage takes ownership of
-  //   the stream. Multiple streams may be specified by using AddLogToStream.
-  //   LogToStream is retained for backwards compatibility; when invoked, it
-  //   will discard any previously set streams and install the specified stream.
-  //   GetLogToStream gets the severity for the specified stream, of if none
-  //   is specified, the minimum stream severity.
-  //   RemoveLogToStream removes the specified stream, without destroying it.
-  static int GetLogToStream(LogSink* stream = nullptr);
-  static void AddLogToStream(LogSink* stream, LoggingSeverity min_sev);
-  static void RemoveLogToStream(LogSink* stream);
-
-  // Testing against MinLogSeverity allows code to avoid potentially expensive
-  // logging operations by pre-checking the logging level.
-  static int GetMinLogSeverity() { return min_sev_; }
-
-  // Parses the provided parameter stream to configure the options above.
-  // Useful for configuring logging from the command line.
-  static void ConfigureLogging(const char* params);
-
- private:
-  typedef std::pair<LogSink*, LoggingSeverity> StreamAndSeverity;
-  typedef std::list<StreamAndSeverity> StreamList;
-
-  // Updates min_sev_ appropriately when debug sinks change.
-  static void UpdateMinLogSeverity();
-
-  // These write out the actual log messages.
-  static void OutputToDebug(const std::string& msg,
-                            LoggingSeverity severity,
-                            const std::string& tag);
-
-  // The ostream that buffers the formatted message before output
-  std::ostringstream print_stream_;
-
-  // The severity level of this message
-  LoggingSeverity severity_;
-
-  // The Android debug output tag.
-  std::string tag_;
-
-  // String data generated in the constructor, that should be appended to
-  // the message before output.
-  std::string extra_;
-
-  // dbg_sev_ is the thresholds for those output targets
-  // min_sev_ is the minimum (most verbose) of those levels, and is used
-  //  as a short-circuit in the logging macros to identify messages that won't
-  //  be logged.
-  // ctx_sev_ is the minimum level at which file context is displayed
-  static LoggingSeverity min_sev_, dbg_sev_, ctx_sev_;
-
-  // The output streams and their associated severities
-  static StreamList streams_;
-
-  // Flags for formatting options
-  static bool thread_, timestamp_;
-
-  // Determines if logs will be directed to stderr in debug mode.
-  static bool log_to_stderr_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(LogMessage);
-};
-
-//////////////////////////////////////////////////////////////////////
-// Logging Helpers
-//////////////////////////////////////////////////////////////////////
-
-class LogMultilineState {
- public:
-  size_t unprintable_count_[2];
-  LogMultilineState() {
-    unprintable_count_[0] = unprintable_count_[1] = 0;
-  }
-};
-
-// When possible, pass optional state variable to track various data across
-// multiple calls to LogMultiline.  Otherwise, pass null.
-void LogMultiline(LoggingSeverity level, const char* label, bool input,
-                  const void* data, size_t len, bool hex_mode,
-                  LogMultilineState* state);
-
-#ifndef LOG
-
-// The following non-obvious technique for implementation of a
-// conditional log stream was stolen from google3/base/logging.h.
-
-// This class is used to explicitly ignore values in the conditional
-// logging macros.  This avoids compiler warnings like "value computed
-// is not used" and "statement has no effect".
-
-class LogMessageVoidify {
- public:
-  LogMessageVoidify() { }
-  // This has to be an operator with a precedence lower than << but
-  // higher than ?:
-  void operator&(std::ostream&) { }
-};
-
-#define LOG_SEVERITY_PRECONDITION(sev) \
-  !(rtc::LogMessage::Loggable(sev)) \
-    ? (void) 0 \
-    : rtc::LogMessageVoidify() &
-
-#define LOG(sev) \
-  LOG_SEVERITY_PRECONDITION(rtc::sev) \
-    rtc::LogMessage(__FILE__, __LINE__, rtc::sev).stream()
-
-// The _V version is for when a variable is passed in.  It doesn't do the
-// namespace concatination.
-#define LOG_V(sev) \
-  LOG_SEVERITY_PRECONDITION(sev) \
-    rtc::LogMessage(__FILE__, __LINE__, sev).stream()
-
-// The _F version prefixes the message with the current function name.
-#if (defined(__GNUC__) && !defined(NDEBUG)) || defined(WANT_PRETTY_LOG_F)
-#define LOG_F(sev) LOG(sev) << __PRETTY_FUNCTION__ << ": "
-#define LOG_T_F(sev) LOG(sev) << this << ": " << __PRETTY_FUNCTION__ << ": "
-#else
-#define LOG_F(sev) LOG(sev) << __FUNCTION__ << ": "
-#define LOG_T_F(sev) LOG(sev) << this << ": " << __FUNCTION__ << ": "
-#endif
-
-#define LOG_CHECK_LEVEL(sev) \
-  rtc::LogCheckLevel(rtc::sev)
-#define LOG_CHECK_LEVEL_V(sev) \
-  rtc::LogCheckLevel(sev)
-
-inline bool LogCheckLevel(LoggingSeverity sev) {
-  return (LogMessage::GetMinLogSeverity() <= sev);
-}
-
-#define LOG_E(sev, ctx, err, ...) \
-  LOG_SEVERITY_PRECONDITION(rtc::sev) \
-    rtc::LogMessage(__FILE__, __LINE__, rtc::sev, \
-                          rtc::ERRCTX_ ## ctx, err , ##__VA_ARGS__) \
-        .stream()
-
-#define LOG_T(sev) LOG(sev) << this << ": "
-
-#define LOG_ERRNO_EX(sev, err) \
-  LOG_E(sev, ERRNO, err)
-#define LOG_ERRNO(sev) \
-  LOG_ERRNO_EX(sev, errno)
-
-#if defined(WEBRTC_WIN)
-#define LOG_GLE_EX(sev, err) \
-  LOG_E(sev, HRESULT, err)
-#define LOG_GLE(sev) \
-  LOG_GLE_EX(sev, GetLastError())
-#define LOG_GLEM(sev, mod) \
-  LOG_E(sev, HRESULT, GetLastError(), mod)
-#define LOG_ERR_EX(sev, err) \
-  LOG_GLE_EX(sev, err)
-#define LOG_ERR(sev) \
-  LOG_GLE(sev)
-#define LAST_SYSTEM_ERROR \
-  (::GetLastError())
-#elif defined(__native_client__) && __native_client__
-#define LOG_ERR_EX(sev, err) \
-  LOG(sev)
-#define LOG_ERR(sev) \
-  LOG(sev)
-#define LAST_SYSTEM_ERROR \
-  (0)
-#elif defined(WEBRTC_POSIX)
-#define LOG_ERR_EX(sev, err) \
-  LOG_ERRNO_EX(sev, err)
-#define LOG_ERR(sev) \
-  LOG_ERRNO(sev)
-#define LAST_SYSTEM_ERROR \
-  (errno)
-#endif  // WEBRTC_WIN
-
-#define LOG_TAG(sev, tag)        \
-  LOG_SEVERITY_PRECONDITION(sev) \
-  rtc::LogMessage(nullptr, 0, sev, tag).stream()
-
-#define PLOG(sev, err) \
-  LOG_ERR_EX(sev, err)
-
-// TODO(?): Add an "assert" wrapper that logs in the same manner.
-
-#endif  // LOG
-
-}  // namespace rtc
-
-#endif  // WEBRTC_RTC_BASE_LOGGING_H_
diff --git a/rtc_base/logging_mac.mm b/rtc_base/logging_mac.mm
deleted file mode 100644
index 5b5e4c7..0000000
--- a/rtc_base/logging_mac.mm
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- *  Copyright 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/rtc_base/logging.h"
-
-#import <Foundation/Foundation.h>
-
-
-namespace rtc {
-std::string DescriptionFromOSStatus(OSStatus err) {
-  NSError* error =
-      [NSError errorWithDomain:NSOSStatusErrorDomain code:err userInfo:nil];
-  return error.description.UTF8String;
-}
-}  // namespace rtc
diff --git a/rtc_base/logging_unittest.cc b/rtc_base/logging_unittest.cc
deleted file mode 100644
index 940b9c1..0000000
--- a/rtc_base/logging_unittest.cc
+++ /dev/null
@@ -1,163 +0,0 @@
-/*
- *  Copyright 2004 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/rtc_base/gunit.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/nullsocketserver.h"
-#include "webrtc/rtc_base/stream.h"
-#include "webrtc/rtc_base/thread.h"
-#include "webrtc/test/testsupport/fileutils.h"
-
-namespace rtc {
-
-template <typename Base>
-class LogSinkImpl
-    : public LogSink,
-      public Base {
- public:
-  LogSinkImpl() {}
-
-  template<typename P>
-  explicit LogSinkImpl(P* p) : Base(p) {}
-
- private:
-  void OnLogMessage(const std::string& message) override {
-    static_cast<Base*>(this)->WriteAll(
-        message.data(), message.size(), nullptr, nullptr);
-  }
-};
-
-// Test basic logging operation. We should get the INFO log but not the VERBOSE.
-// We should restore the correct global state at the end.
-TEST(LogTest, SingleStream) {
-  int sev = LogMessage::GetLogToStream(nullptr);
-
-  std::string str;
-  LogSinkImpl<StringStream> stream(&str);
-  LogMessage::AddLogToStream(&stream, LS_INFO);
-  EXPECT_EQ(LS_INFO, LogMessage::GetLogToStream(&stream));
-
-  LOG(LS_INFO) << "INFO";
-  LOG(LS_VERBOSE) << "VERBOSE";
-  EXPECT_NE(std::string::npos, str.find("INFO"));
-  EXPECT_EQ(std::string::npos, str.find("VERBOSE"));
-
-  LogMessage::RemoveLogToStream(&stream);
-  EXPECT_EQ(LS_NONE, LogMessage::GetLogToStream(&stream));
-
-  EXPECT_EQ(sev, LogMessage::GetLogToStream(nullptr));
-}
-
-// Test using multiple log streams. The INFO stream should get the INFO message,
-// the VERBOSE stream should get the INFO and the VERBOSE.
-// We should restore the correct global state at the end.
-TEST(LogTest, MultipleStreams) {
-  int sev = LogMessage::GetLogToStream(nullptr);
-
-  std::string str1, str2;
-  LogSinkImpl<StringStream> stream1(&str1), stream2(&str2);
-  LogMessage::AddLogToStream(&stream1, LS_INFO);
-  LogMessage::AddLogToStream(&stream2, LS_VERBOSE);
-  EXPECT_EQ(LS_INFO, LogMessage::GetLogToStream(&stream1));
-  EXPECT_EQ(LS_VERBOSE, LogMessage::GetLogToStream(&stream2));
-
-  LOG(LS_INFO) << "INFO";
-  LOG(LS_VERBOSE) << "VERBOSE";
-
-  EXPECT_NE(std::string::npos, str1.find("INFO"));
-  EXPECT_EQ(std::string::npos, str1.find("VERBOSE"));
-  EXPECT_NE(std::string::npos, str2.find("INFO"));
-  EXPECT_NE(std::string::npos, str2.find("VERBOSE"));
-
-  LogMessage::RemoveLogToStream(&stream2);
-  LogMessage::RemoveLogToStream(&stream1);
-  EXPECT_EQ(LS_NONE, LogMessage::GetLogToStream(&stream2));
-  EXPECT_EQ(LS_NONE, LogMessage::GetLogToStream(&stream1));
-
-  EXPECT_EQ(sev, LogMessage::GetLogToStream(nullptr));
-}
-
-// Ensure we don't crash when adding/removing streams while threads are going.
-// We should restore the correct global state at the end.
-class LogThread : public Thread {
- public:
-  LogThread() : Thread(std::unique_ptr<SocketServer>(new NullSocketServer())) {}
-
-  ~LogThread() override {
-    Stop();
-  }
-
- private:
-  void Run() override {
-    // LS_SENSITIVE to avoid cluttering up any real logging going on
-    LOG(LS_SENSITIVE) << "LOG";
-  }
-};
-
-TEST(LogTest, MultipleThreads) {
-  int sev = LogMessage::GetLogToStream(nullptr);
-
-  LogThread thread1, thread2, thread3;
-  thread1.Start();
-  thread2.Start();
-  thread3.Start();
-
-  LogSinkImpl<NullStream> stream1, stream2, stream3;
-  for (int i = 0; i < 1000; ++i) {
-    LogMessage::AddLogToStream(&stream1, LS_INFO);
-    LogMessage::AddLogToStream(&stream2, LS_VERBOSE);
-    LogMessage::AddLogToStream(&stream3, LS_SENSITIVE);
-    LogMessage::RemoveLogToStream(&stream1);
-    LogMessage::RemoveLogToStream(&stream2);
-    LogMessage::RemoveLogToStream(&stream3);
-  }
-
-  EXPECT_EQ(sev, LogMessage::GetLogToStream(nullptr));
-}
-
-
-TEST(LogTest, WallClockStartTime) {
-  uint32_t time = LogMessage::WallClockStartTime();
-  // Expect the time to be in a sensible range, e.g. > 2012-01-01.
-  EXPECT_GT(time, 1325376000u);
-}
-
-// Test the time required to write 1000 80-character logs to an unbuffered file.
-#if defined (WEBRTC_ANDROID)
-// Fails on Android: https://bugs.chromium.org/p/webrtc/issues/detail?id=4364.
-#define MAYBE_Perf DISABLED_Perf
-#else
-#define MAYBE_Perf Perf
-#endif
-
-TEST(LogTest, MAYBE_Perf) {
-  std::string path =
-      webrtc::test::TempFilename(webrtc::test::OutputPath(), "ut");
-
-  LogSinkImpl<FileStream> stream;
-  EXPECT_TRUE(stream.Open(path, "wb", nullptr));
-  stream.DisableBuffering();
-  LogMessage::AddLogToStream(&stream, LS_SENSITIVE);
-
-  int64_t start = TimeMillis(), finish;
-  std::string message('X', 80);
-  for (int i = 0; i < 1000; ++i) {
-    LOG(LS_SENSITIVE) << message;
-  }
-  finish = TimeMillis();
-
-  LogMessage::RemoveLogToStream(&stream);
-  stream.Close();
-  webrtc::test::RemoveFile(path);
-
-  LOG(LS_INFO) << "Average log time: " << TimeDiff(finish, start) << " ms";
-}
-
-}  // namespace rtc
diff --git a/rtc_base/logsinks.cc b/rtc_base/logsinks.cc
deleted file mode 100644
index ba0b5a5..0000000
--- a/rtc_base/logsinks.cc
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- *  Copyright 2015 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/rtc_base/logsinks.h"
-
-#include <iostream>
-#include <string>
-
-#include "webrtc/rtc_base/checks.h"
-
-namespace rtc {
-
-FileRotatingLogSink::FileRotatingLogSink(const std::string& log_dir_path,
-                                         const std::string& log_prefix,
-                                         size_t max_log_size,
-                                         size_t num_log_files)
-    : FileRotatingLogSink(new FileRotatingStream(log_dir_path,
-                                                 log_prefix,
-                                                 max_log_size,
-                                                 num_log_files)) {
-}
-
-FileRotatingLogSink::FileRotatingLogSink(FileRotatingStream* stream)
-    : stream_(stream) {
-  RTC_DCHECK(stream);
-}
-
-FileRotatingLogSink::~FileRotatingLogSink() {
-}
-
-void FileRotatingLogSink::OnLogMessage(const std::string& message) {
-  if (stream_->GetState() != SS_OPEN) {
-    std::cerr << "Init() must be called before adding this sink." << std::endl;
-    return;
-  }
-  stream_->WriteAll(message.c_str(), message.size(), nullptr, nullptr);
-}
-
-bool FileRotatingLogSink::Init() {
-  return stream_->Open();
-}
-
-bool FileRotatingLogSink::DisableBuffering() {
-  return stream_->DisableBuffering();
-}
-
-CallSessionFileRotatingLogSink::CallSessionFileRotatingLogSink(
-    const std::string& log_dir_path,
-    size_t max_total_log_size)
-    : FileRotatingLogSink(
-          new CallSessionFileRotatingStream(log_dir_path, max_total_log_size)) {
-}
-
-CallSessionFileRotatingLogSink::~CallSessionFileRotatingLogSink() {
-}
-
-}  // namespace rtc
diff --git a/rtc_base/logsinks.h b/rtc_base/logsinks.h
deleted file mode 100644
index e54d6ef..0000000
--- a/rtc_base/logsinks.h
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- *  Copyright 2015 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_RTC_BASE_LOGSINKS_H_
-#define WEBRTC_RTC_BASE_LOGSINKS_H_
-
-#include <memory>
-#include <string>
-
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/filerotatingstream.h"
-#include "webrtc/rtc_base/logging.h"
-
-namespace rtc {
-
-// Log sink that uses a FileRotatingStream to write to disk.
-// Init() must be called before adding this sink.
-class FileRotatingLogSink : public LogSink {
- public:
-  // |num_log_files| must be greater than 1 and |max_log_size| must be greater
-  // than 0.
-  FileRotatingLogSink(const std::string& log_dir_path,
-                      const std::string& log_prefix,
-                      size_t max_log_size,
-                      size_t num_log_files);
-  ~FileRotatingLogSink() override;
-
-  // Writes the message to the current file. It will spill over to the next
-  // file if needed.
-  void OnLogMessage(const std::string& message) override;
-
-  // Deletes any existing files in the directory and creates a new log file.
-  virtual bool Init();
-
-  // Disables buffering on the underlying stream.
-  bool DisableBuffering();
-
- protected:
-  explicit FileRotatingLogSink(FileRotatingStream* stream);
-
- private:
-  std::unique_ptr<FileRotatingStream> stream_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(FileRotatingLogSink);
-};
-
-// Log sink that uses a CallSessionFileRotatingStream to write to disk.
-// Init() must be called before adding this sink.
-class CallSessionFileRotatingLogSink : public FileRotatingLogSink {
- public:
-  CallSessionFileRotatingLogSink(const std::string& log_dir_path,
-                                 size_t max_total_log_size);
-  ~CallSessionFileRotatingLogSink() override;
-
- private:
-  RTC_DISALLOW_COPY_AND_ASSIGN(CallSessionFileRotatingLogSink);
-};
-
-}  // namespace rtc
-
-#endif  // WEBRTC_RTC_BASE_LOGSINKS_H_
diff --git a/rtc_base/macifaddrs_converter.cc b/rtc_base/macifaddrs_converter.cc
deleted file mode 100644
index 44e1087..0000000
--- a/rtc_base/macifaddrs_converter.cc
+++ /dev/null
@@ -1,282 +0,0 @@
-/*
- *  Copyright 2015 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 <memory>
-
-#include <net/if.h>
-#include <sys/ioctl.h>
-#include <unistd.h>
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/ifaddrs_converter.h"
-#include "webrtc/rtc_base/logging.h"
-
-#if !defined(WEBRTC_IOS)
-#include <net/if_media.h>
-#include <netinet/in_var.h>
-#else  // WEBRTC_IOS
-#define SCOPE6_ID_MAX 16
-
-struct in6_addrlifetime {
-  time_t ia6t_expire;    /* valid lifetime expiration time */
-  time_t ia6t_preferred; /* preferred lifetime expiration time */
-  u_int32_t ia6t_vltime; /* valid lifetime */
-  u_int32_t ia6t_pltime; /* prefix lifetime */
-};
-
-struct in6_ifstat {
-  u_quad_t ifs6_in_receive;      /* # of total input datagram */
-  u_quad_t ifs6_in_hdrerr;       /* # of datagrams with invalid hdr */
-  u_quad_t ifs6_in_toobig;       /* # of datagrams exceeded MTU */
-  u_quad_t ifs6_in_noroute;      /* # of datagrams with no route */
-  u_quad_t ifs6_in_addrerr;      /* # of datagrams with invalid dst */
-  u_quad_t ifs6_in_protounknown; /* # of datagrams with unknown proto */
-                                 /* NOTE: increment on final dst if */
-  u_quad_t ifs6_in_truncated;    /* # of truncated datagrams */
-  u_quad_t ifs6_in_discard;      /* # of discarded datagrams */
-                                 /* NOTE: fragment timeout is not here */
-  u_quad_t ifs6_in_deliver;      /* # of datagrams delivered to ULP */
-                                 /* NOTE: increment on final dst if */
-  u_quad_t ifs6_out_forward;     /* # of datagrams forwarded */
-                                 /* NOTE: increment on outgoing if */
-  u_quad_t ifs6_out_request;     /* # of outgoing datagrams from ULP */
-                                 /* NOTE: does not include forwrads */
-  u_quad_t ifs6_out_discard;     /* # of discarded datagrams */
-  u_quad_t ifs6_out_fragok;      /* # of datagrams fragmented */
-  u_quad_t ifs6_out_fragfail;    /* # of datagrams failed on fragment */
-  u_quad_t ifs6_out_fragcreat;   /* # of fragment datagrams */
-                                 /* NOTE: this is # after fragment */
-  u_quad_t ifs6_reass_reqd;      /* # of incoming fragmented packets */
-                                 /* NOTE: increment on final dst if */
-  u_quad_t ifs6_reass_ok;        /* # of reassembled packets */
-                                 /* NOTE: this is # after reass */
-                                 /* NOTE: increment on final dst if */
-  u_quad_t ifs6_reass_fail;      /* # of reass failures */
-                                 /* NOTE: may not be packet count */
-                                 /* NOTE: increment on final dst if */
-  u_quad_t ifs6_in_mcast;        /* # of inbound multicast datagrams */
-  u_quad_t ifs6_out_mcast;       /* # of outbound multicast datagrams */
-};
-struct icmp6_ifstat {
-  /*
-   * Input statistics
-   */
-  /* ipv6IfIcmpInMsgs, total # of input messages */
-  u_quad_t ifs6_in_msg;
-  /* ipv6IfIcmpInErrors, # of input error messages */
-  u_quad_t ifs6_in_error;
-  /* ipv6IfIcmpInDestUnreachs, # of input dest unreach errors */
-  u_quad_t ifs6_in_dstunreach;
-  /* ipv6IfIcmpInAdminProhibs, # of input admin. prohibited errs */
-  u_quad_t ifs6_in_adminprohib;
-  /* ipv6IfIcmpInTimeExcds, # of input time exceeded errors */
-  u_quad_t ifs6_in_timeexceed;
-  /* ipv6IfIcmpInParmProblems, # of input parameter problem errors */
-  u_quad_t ifs6_in_paramprob;
-  /* ipv6IfIcmpInPktTooBigs, # of input packet too big errors */
-  u_quad_t ifs6_in_pkttoobig;
-  /* ipv6IfIcmpInEchos, # of input echo requests */
-  u_quad_t ifs6_in_echo;
-  /* ipv6IfIcmpInEchoReplies, # of input echo replies */
-  u_quad_t ifs6_in_echoreply;
-  /* ipv6IfIcmpInRouterSolicits, # of input router solicitations */
-  u_quad_t ifs6_in_routersolicit;
-  /* ipv6IfIcmpInRouterAdvertisements, # of input router advertisements */
-  u_quad_t ifs6_in_routeradvert;
-  /* ipv6IfIcmpInNeighborSolicits, # of input neighbor solicitations */
-  u_quad_t ifs6_in_neighborsolicit;
-  /* ipv6IfIcmpInNeighborAdvertisements, # of input neighbor advs. */
-  u_quad_t ifs6_in_neighboradvert;
-  /* ipv6IfIcmpInRedirects, # of input redirects */
-  u_quad_t ifs6_in_redirect;
-  /* ipv6IfIcmpInGroupMembQueries, # of input MLD queries */
-  u_quad_t ifs6_in_mldquery;
-  /* ipv6IfIcmpInGroupMembResponses, # of input MLD reports */
-  u_quad_t ifs6_in_mldreport;
-  /* ipv6IfIcmpInGroupMembReductions, # of input MLD done */
-  u_quad_t ifs6_in_mlddone;
-
-  /*
-   * Output statistics. We should solve unresolved routing problem...
-   */
-  /* ipv6IfIcmpOutMsgs, total # of output messages */
-  u_quad_t ifs6_out_msg;
-  /* ipv6IfIcmpOutErrors, # of output error messages */
-  u_quad_t ifs6_out_error;
-  /* ipv6IfIcmpOutDestUnreachs, # of output dest unreach errors */
-  u_quad_t ifs6_out_dstunreach;
-  /* ipv6IfIcmpOutAdminProhibs, # of output admin. prohibited errs */
-  u_quad_t ifs6_out_adminprohib;
-  /* ipv6IfIcmpOutTimeExcds, # of output time exceeded errors */
-  u_quad_t ifs6_out_timeexceed;
-  /* ipv6IfIcmpOutParmProblems, # of output parameter problem errors */
-  u_quad_t ifs6_out_paramprob;
-  /* ipv6IfIcmpOutPktTooBigs, # of output packet too big errors */
-  u_quad_t ifs6_out_pkttoobig;
-  /* ipv6IfIcmpOutEchos, # of output echo requests */
-  u_quad_t ifs6_out_echo;
-  /* ipv6IfIcmpOutEchoReplies, # of output echo replies */
-  u_quad_t ifs6_out_echoreply;
-  /* ipv6IfIcmpOutRouterSolicits, # of output router solicitations */
-  u_quad_t ifs6_out_routersolicit;
-  /* ipv6IfIcmpOutRouterAdvertisements, # of output router advs. */
-  u_quad_t ifs6_out_routeradvert;
-  /* ipv6IfIcmpOutNeighborSolicits, # of output neighbor solicitations */
-  u_quad_t ifs6_out_neighborsolicit;
-  /* ipv6IfIcmpOutNeighborAdvertisements, # of output neighbor advs. */
-  u_quad_t ifs6_out_neighboradvert;
-  /* ipv6IfIcmpOutRedirects, # of output redirects */
-  u_quad_t ifs6_out_redirect;
-  /* ipv6IfIcmpOutGroupMembQueries, # of output MLD queries */
-  u_quad_t ifs6_out_mldquery;
-  /* ipv6IfIcmpOutGroupMembResponses, # of output MLD reports */
-  u_quad_t ifs6_out_mldreport;
-  /* ipv6IfIcmpOutGroupMembReductions, # of output MLD done */
-  u_quad_t ifs6_out_mlddone;
-};
-
-struct in6_ifreq {
-  char ifr_name[IFNAMSIZ];
-  union {
-    struct sockaddr_in6 ifru_addr;
-    struct sockaddr_in6 ifru_dstaddr;
-    int ifru_flags;
-    int ifru_flags6;
-    int ifru_metric;
-    int ifru_intval;
-    caddr_t ifru_data;
-    struct in6_addrlifetime ifru_lifetime;
-    struct in6_ifstat ifru_stat;
-    struct icmp6_ifstat ifru_icmp6stat;
-    u_int32_t ifru_scope_id[SCOPE6_ID_MAX];
-  } ifr_ifru;
-};
-
-#define SIOCGIFAFLAG_IN6 _IOWR('i', 73, struct in6_ifreq)
-
-#define IN6_IFF_ANYCAST 0x0001    /* anycast address */
-#define IN6_IFF_TENTATIVE 0x0002  /* tentative address */
-#define IN6_IFF_DUPLICATED 0x0004 /* DAD detected duplicate */
-#define IN6_IFF_DETACHED 0x0008   /* may be detached from the link */
-#define IN6_IFF_DEPRECATED 0x0010 /* deprecated address */
-#define IN6_IFF_TEMPORARY 0x0080  /* temporary (anonymous) address. */
-
-#endif  // WEBRTC_IOS
-
-namespace rtc {
-
-namespace {
-
-class IPv6AttributesGetter {
- public:
-  IPv6AttributesGetter();
-  virtual ~IPv6AttributesGetter();
-  bool IsInitialized() const;
-  bool GetIPAttributes(const char* ifname,
-                       const sockaddr* sock_addr,
-                       int* native_attributes);
-
- private:
-  // on MAC or IOS, we have to use ioctl with a socket to query an IPv6
-  // interface's attribute.
-  int ioctl_socket_;
-};
-
-IPv6AttributesGetter::IPv6AttributesGetter()
-    : ioctl_socket_(
-          socket(AF_INET6, SOCK_DGRAM, 0 /* unspecified protocol */)) {
-  RTC_DCHECK_GE(ioctl_socket_, 0);
-}
-
-bool IPv6AttributesGetter::IsInitialized() const {
-  return ioctl_socket_ >= 0;
-}
-
-IPv6AttributesGetter::~IPv6AttributesGetter() {
-  if (!IsInitialized()) {
-    return;
-  }
-  close(ioctl_socket_);
-}
-
-bool IPv6AttributesGetter::GetIPAttributes(const char* ifname,
-                                           const sockaddr* sock_addr,
-                                           int* native_attributes) {
-  if (!IsInitialized()) {
-    return false;
-  }
-
-  struct in6_ifreq ifr = {};
-  strncpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name) - 1);
-  memcpy(&ifr.ifr_ifru.ifru_addr, sock_addr, sock_addr->sa_len);
-  int rv = ioctl(ioctl_socket_, SIOCGIFAFLAG_IN6, &ifr);
-  if (rv >= 0) {
-    *native_attributes = ifr.ifr_ifru.ifru_flags;
-  } else {
-    LOG(LS_ERROR) << "ioctl returns " << errno;
-  }
-  return (rv >= 0);
-}
-
-// Converts native IPv6 address attributes to net IPv6 address attributes.  If
-// it returns false, the IP address isn't suitable for one-to-one communications
-// applications and should be ignored.
-bool ConvertNativeToIPAttributes(int native_attributes, int* net_attributes) {
-  // For MacOSX, we disallow addresses with attributes IN6_IFF_ANYCASE,
-  // IN6_IFF_DUPLICATED, IN6_IFF_TENTATIVE, and IN6_IFF_DETACHED as these are
-  // still progressing through duplicated address detection (DAD) or are not
-  // suitable for one-to-one communication applications.
-  if (native_attributes & (IN6_IFF_ANYCAST | IN6_IFF_DUPLICATED |
-                           IN6_IFF_TENTATIVE | IN6_IFF_DETACHED)) {
-    return false;
-  }
-
-  if (native_attributes & IN6_IFF_TEMPORARY) {
-    *net_attributes |= IPV6_ADDRESS_FLAG_TEMPORARY;
-  }
-
-  if (native_attributes & IN6_IFF_DEPRECATED) {
-    *net_attributes |= IPV6_ADDRESS_FLAG_DEPRECATED;
-  }
-
-  return true;
-}
-
-class MacIfAddrsConverter : public IfAddrsConverter {
- public:
-  MacIfAddrsConverter() : ip_attribute_getter_(new IPv6AttributesGetter()) {}
-  ~MacIfAddrsConverter() override {}
-
-  bool ConvertNativeAttributesToIPAttributes(const struct ifaddrs* interface,
-                                             int* ip_attributes) override {
-    int native_attributes;
-    if (!ip_attribute_getter_->GetIPAttributes(
-            interface->ifa_name, interface->ifa_addr, &native_attributes)) {
-      return false;
-    }
-
-    if (!ConvertNativeToIPAttributes(native_attributes, ip_attributes)) {
-      return false;
-    }
-
-    return true;
-  }
-
- private:
-  std::unique_ptr<IPv6AttributesGetter> ip_attribute_getter_;
-};
-
-}  // namespace
-
-IfAddrsConverter* CreateIfAddrsConverter() {
-  return new MacIfAddrsConverter();
-}
-
-}  // namespace rtc
diff --git a/rtc_base/macutils.cc b/rtc_base/macutils.cc
deleted file mode 100644
index 2e5e1fb..0000000
--- a/rtc_base/macutils.cc
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- *  Copyright 2007 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 <cstring>
-#include <memory>
-#include <sstream>
-
-#include <sys/utsname.h>
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/macutils.h"
-#include "webrtc/rtc_base/stringutils.h"
-
-namespace rtc {
-
-///////////////////////////////////////////////////////////////////////////////
-
-bool ToUtf8(const CFStringRef str16, std::string* str8) {
-  if ((nullptr == str16) || (nullptr == str8)) {
-    return false;
-  }
-  size_t maxlen = CFStringGetMaximumSizeForEncoding(CFStringGetLength(str16),
-                                                    kCFStringEncodingUTF8) + 1;
-  std::unique_ptr<char[]> buffer(new char[maxlen]);
-  if (!buffer || !CFStringGetCString(str16, buffer.get(), maxlen,
-                                     kCFStringEncodingUTF8)) {
-    return false;
-  }
-  str8->assign(buffer.get());
-  return true;
-}
-
-bool ToUtf16(const std::string& str8, CFStringRef* str16) {
-  if (nullptr == str16) {
-    return false;
-  }
-  *str16 = CFStringCreateWithBytes(kCFAllocatorDefault,
-                                   reinterpret_cast<const UInt8*>(str8.data()),
-                                   str8.length(), kCFStringEncodingUTF8,
-                                   false);
-  return nullptr != *str16;
-}
-
-void DecodeFourChar(UInt32 fc, std::string* out) {
-  std::stringstream ss;
-  ss << '\'';
-  bool printable = true;
-  for (int i = 3; i >= 0; --i) {
-    char ch = (fc >> (8 * i)) & 0xFF;
-    if (isprint(static_cast<unsigned char>(ch))) {
-      ss << ch;
-    } else {
-      printable = false;
-      break;
-    }
-  }
-  if (printable) {
-    ss << '\'';
-  } else {
-    ss.str("");
-    ss << "0x" << std::hex << fc;
-  }
-  out->append(ss.str());
-}
-
-static bool GetOSVersion(int* major, int* minor, int* bugfix) {
-  RTC_DCHECK(major);
-  RTC_DCHECK(minor);
-  RTC_DCHECK(bugfix);
-  struct utsname uname_info;
-  if (uname(&uname_info) != 0)
-    return false;
-
-  if (strcmp(uname_info.sysname, "Darwin") != 0)
-    return false;
-  *major = 10;
-
-  // The market version of macOS is always 4 lower than the internal version.
-  int minor_version = atoi(uname_info.release);
-  RTC_CHECK(minor_version >= 6);
-  *minor = minor_version - 4;
-
-  const char* dot = ::strchr(uname_info.release, '.');
-  if (!dot)
-    return false;
-  *bugfix = atoi(dot + 1);
-  return true;
-}
-
-MacOSVersionName GetOSVersionName() {
-  int major = 0, minor = 0, bugfix = 0;
-  if (!GetOSVersion(&major, &minor, &bugfix)) {
-    return kMacOSUnknown;
-  }
-  if (major > 10) {
-    return kMacOSNewer;
-  }
-  if ((major < 10) || (minor < 3)) {
-    return kMacOSOlder;
-  }
-  switch (minor) {
-    case 3:
-      return kMacOSPanther;
-    case 4:
-      return kMacOSTiger;
-    case 5:
-      return kMacOSLeopard;
-    case 6:
-      return kMacOSSnowLeopard;
-    case 7:
-      return kMacOSLion;
-    case 8:
-      return kMacOSMountainLion;
-    case 9:
-      return kMacOSMavericks;
-  }
-  return kMacOSNewer;
-}
-}  // namespace rtc
diff --git a/rtc_base/macutils.h b/rtc_base/macutils.h
deleted file mode 100644
index 5b4021b..0000000
--- a/rtc_base/macutils.h
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- *  Copyright 2007 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_RTC_BASE_MACUTILS_H_
-#define WEBRTC_RTC_BASE_MACUTILS_H_
-
-#include <CoreFoundation/CoreFoundation.h>
-#include <string>
-
-namespace rtc {
-
-///////////////////////////////////////////////////////////////////////////////
-
-// Note that some of these functions work for both iOS and Mac OS X.  The ones
-// that are specific to Mac are #ifdef'ed as such.
-
-bool ToUtf8(const CFStringRef str16, std::string* str8);
-bool ToUtf16(const std::string& str8, CFStringRef* str16);
-
-#if defined(WEBRTC_MAC) && !defined(WEBRTC_IOS)
-void DecodeFourChar(UInt32 fc, std::string* out);
-
-enum MacOSVersionName {
-  kMacOSUnknown,       // ???
-  kMacOSOlder,         // 10.2-
-  kMacOSPanther,       // 10.3
-  kMacOSTiger,         // 10.4
-  kMacOSLeopard,       // 10.5
-  kMacOSSnowLeopard,   // 10.6
-  kMacOSLion,          // 10.7
-  kMacOSMountainLion,  // 10.8
-  kMacOSMavericks,     // 10.9
-  kMacOSNewer,         // 10.10+
-};
-
-MacOSVersionName GetOSVersionName();
-#endif
-
-///////////////////////////////////////////////////////////////////////////////
-
-}  // namespace rtc
-
-#endif  // WEBRTC_RTC_BASE_MACUTILS_H_
diff --git a/rtc_base/macutils_unittest.cc b/rtc_base/macutils_unittest.cc
deleted file mode 100644
index f5f4b8d..0000000
--- a/rtc_base/macutils_unittest.cc
+++ /dev/null
@@ -1,18 +0,0 @@
-/*
- *  Copyright 2009 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/rtc_base/macutils.h"
-#include "webrtc/rtc_base/gunit.h"
-
-TEST(MacUtilsTest, GetOsVersionName) {
-  rtc::MacOSVersionName ver = rtc::GetOSVersionName();
-  LOG(LS_INFO) << "GetOsVersionName " << ver;
-  EXPECT_NE(rtc::kMacOSUnknown, ver);
-}
diff --git a/rtc_base/mathutils.h b/rtc_base/mathutils.h
deleted file mode 100644
index e57697c..0000000
--- a/rtc_base/mathutils.h
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- *  Copyright 2005 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_RTC_BASE_MATHUTILS_H_
-#define WEBRTC_RTC_BASE_MATHUTILS_H_
-
-#include <math.h>
-#include <type_traits>
-
-#include "webrtc/rtc_base/checks.h"
-
-#ifndef M_PI
-#define M_PI 3.14159265359f
-#endif
-
-// Given two numbers |x| and |y| such that x >= y, computes the difference
-// x - y without causing undefined behavior due to signed overflow.
-template <typename T>
-typename std::make_unsigned<T>::type unsigned_difference(T x, T y) {
-  static_assert(
-      std::is_signed<T>::value,
-      "Function unsigned_difference is only meaningful for signed types.");
-  RTC_DCHECK_GE(x, y);
-  typedef typename std::make_unsigned<T>::type unsigned_type;
-  // int -> unsigned conversion repeatedly adds UINT_MAX + 1 until the number
-  // can be represented as an unsigned. Since we know that the actual
-  // difference x - y can be represented as an unsigned, it is sufficient to
-  // compute the difference modulo UINT_MAX + 1, i.e using unsigned arithmetic.
-  return static_cast<unsigned_type>(x) - static_cast<unsigned_type>(y);
-}
-
-#endif  // WEBRTC_RTC_BASE_MATHUTILS_H_
diff --git a/rtc_base/md5.cc b/rtc_base/md5.cc
deleted file mode 100644
index be4cac9..0000000
--- a/rtc_base/md5.cc
+++ /dev/null
@@ -1,222 +0,0 @@
-/*
- * This code implements the MD5 message-digest algorithm.
- * The algorithm is due to Ron Rivest.  This code was
- * written by Colin Plumb in 1993, no copyright is claimed.
- * This code is in the public domain; do with it what you wish.
- *
- * Equivalent code is available from RSA Data Security, Inc.
- * This code has been tested against that, and is equivalent,
- * except that you don't need to include two pages of legalese
- * with every copy.
- *
- * To compute the message digest of a chunk of bytes, declare an
- * MD5Context structure, pass it to MD5Init, call MD5Update as
- * needed on buffers full of bytes, and then call MD5Final, which
- * will fill a supplied 16-byte array with the digest.
- */
-
-// Changes from original C code:
-// Ported to C++, type casting, Google code style.
-
-#include "webrtc/rtc_base/md5.h"
-
-// TODO: Avoid memcmpy - hash directly from memory.
-#include <string.h>  // for memcpy().
-
-#include "webrtc/rtc_base/byteorder.h"  // for RTC_ARCH_CPU_LITTLE_ENDIAN.
-
-namespace rtc {
-
-#ifdef RTC_ARCH_CPU_LITTLE_ENDIAN
-#define ByteReverse(buf, len)  // Nothing.
-#else  // RTC_ARCH_CPU_BIG_ENDIAN
-static void ByteReverse(uint32_t* buf, int len) {
-  for (int i = 0; i < len; ++i) {
-    buf[i] = rtc::GetLE32(&buf[i]);
-  }
-}
-#endif
-
-// Start MD5 accumulation.  Set bit count to 0 and buffer to mysterious
-// initialization constants.
-void MD5Init(MD5Context* ctx) {
-  ctx->buf[0] = 0x67452301;
-  ctx->buf[1] = 0xefcdab89;
-  ctx->buf[2] = 0x98badcfe;
-  ctx->buf[3] = 0x10325476;
-  ctx->bits[0] = 0;
-  ctx->bits[1] = 0;
-}
-
-// Update context to reflect the concatenation of another buffer full of bytes.
-void MD5Update(MD5Context* ctx, const uint8_t* buf, size_t len) {
-  // Update bitcount.
-  uint32_t t = ctx->bits[0];
-  if ((ctx->bits[0] = t + (static_cast<uint32_t>(len) << 3)) < t) {
-    ctx->bits[1]++;  // Carry from low to high.
-  }
-  ctx->bits[1] += static_cast<uint32_t>(len >> 29);
-  t = (t >> 3) & 0x3f;  // Bytes already in shsInfo->data.
-
-  // Handle any leading odd-sized chunks.
-  if (t) {
-    uint8_t* p = reinterpret_cast<uint8_t*>(ctx->in) + t;
-
-    t = 64-t;
-    if (len < t) {
-      memcpy(p, buf, len);
-      return;
-    }
-    memcpy(p, buf, t);
-    ByteReverse(ctx->in, 16);
-    MD5Transform(ctx->buf, ctx->in);
-    buf += t;
-    len -= t;
-  }
-
-  // Process data in 64-byte chunks.
-  while (len >= 64) {
-    memcpy(ctx->in, buf, 64);
-    ByteReverse(ctx->in, 16);
-    MD5Transform(ctx->buf, ctx->in);
-    buf += 64;
-    len -= 64;
-  }
-
-  // Handle any remaining bytes of data.
-  memcpy(ctx->in, buf, len);
-}
-
-// Final wrapup - pad to 64-byte boundary with the bit pattern.
-// 1 0* (64-bit count of bits processed, MSB-first)
-void MD5Final(MD5Context* ctx, uint8_t digest[16]) {
-  // Compute number of bytes mod 64.
-  uint32_t count = (ctx->bits[0] >> 3) & 0x3F;
-
-  // Set the first char of padding to 0x80.  This is safe since there is
-  // always at least one byte free.
-  uint8_t* p = reinterpret_cast<uint8_t*>(ctx->in) + count;
-  *p++ = 0x80;
-
-  // Bytes of padding needed to make 64 bytes.
-  count = 64 - 1 - count;
-
-  // Pad out to 56 mod 64.
-  if (count < 8) {
-    // Two lots of padding:  Pad the first block to 64 bytes.
-    memset(p, 0, count);
-    ByteReverse(ctx->in, 16);
-    MD5Transform(ctx->buf, ctx->in);
-
-    // Now fill the next block with 56 bytes.
-    memset(ctx->in, 0, 56);
-  } else {
-    // Pad block to 56 bytes.
-    memset(p, 0, count - 8);
-  }
-  ByteReverse(ctx->in, 14);
-
-  // Append length in bits and transform.
-  ctx->in[14] = ctx->bits[0];
-  ctx->in[15] = ctx->bits[1];
-
-  MD5Transform(ctx->buf, ctx->in);
-  ByteReverse(ctx->buf, 4);
-  memcpy(digest, ctx->buf, 16);
-  memset(ctx, 0, sizeof(*ctx));  // In case it's sensitive.
-}
-
-// The four core functions - F1 is optimized somewhat.
-// #define F1(x, y, z) (x & y | ~x & z)
-#define F1(x, y, z) (z ^ (x & (y ^ z)))
-#define F2(x, y, z) F1(z, x, y)
-#define F3(x, y, z) (x ^ y ^ z)
-#define F4(x, y, z) (y ^ (x | ~z))
-
-// This is the central step in the MD5 algorithm.
-#define MD5STEP(f, w, x, y, z, data, s) \
-    (w += f(x, y, z) + data, w = w << s | w >> (32 - s), w += x)
-
-// The core of the MD5 algorithm, this alters an existing MD5 hash to
-// reflect the addition of 16 longwords of new data.  MD5Update blocks
-// the data and converts bytes into longwords for this routine.
-void MD5Transform(uint32_t buf[4], const uint32_t in[16]) {
-  uint32_t a = buf[0];
-  uint32_t b = buf[1];
-  uint32_t c = buf[2];
-  uint32_t d = buf[3];
-
-  MD5STEP(F1, a, b, c, d, in[ 0] + 0xd76aa478, 7);
-  MD5STEP(F1, d, a, b, c, in[ 1] + 0xe8c7b756, 12);
-  MD5STEP(F1, c, d, a, b, in[ 2] + 0x242070db, 17);
-  MD5STEP(F1, b, c, d, a, in[ 3] + 0xc1bdceee, 22);
-  MD5STEP(F1, a, b, c, d, in[ 4] + 0xf57c0faf, 7);
-  MD5STEP(F1, d, a, b, c, in[ 5] + 0x4787c62a, 12);
-  MD5STEP(F1, c, d, a, b, in[ 6] + 0xa8304613, 17);
-  MD5STEP(F1, b, c, d, a, in[ 7] + 0xfd469501, 22);
-  MD5STEP(F1, a, b, c, d, in[ 8] + 0x698098d8, 7);
-  MD5STEP(F1, d, a, b, c, in[ 9] + 0x8b44f7af, 12);
-  MD5STEP(F1, c, d, a, b, in[10] + 0xffff5bb1, 17);
-  MD5STEP(F1, b, c, d, a, in[11] + 0x895cd7be, 22);
-  MD5STEP(F1, a, b, c, d, in[12] + 0x6b901122, 7);
-  MD5STEP(F1, d, a, b, c, in[13] + 0xfd987193, 12);
-  MD5STEP(F1, c, d, a, b, in[14] + 0xa679438e, 17);
-  MD5STEP(F1, b, c, d, a, in[15] + 0x49b40821, 22);
-
-  MD5STEP(F2, a, b, c, d, in[ 1] + 0xf61e2562, 5);
-  MD5STEP(F2, d, a, b, c, in[ 6] + 0xc040b340, 9);
-  MD5STEP(F2, c, d, a, b, in[11] + 0x265e5a51, 14);
-  MD5STEP(F2, b, c, d, a, in[ 0] + 0xe9b6c7aa, 20);
-  MD5STEP(F2, a, b, c, d, in[ 5] + 0xd62f105d, 5);
-  MD5STEP(F2, d, a, b, c, in[10] + 0x02441453, 9);
-  MD5STEP(F2, c, d, a, b, in[15] + 0xd8a1e681, 14);
-  MD5STEP(F2, b, c, d, a, in[ 4] + 0xe7d3fbc8, 20);
-  MD5STEP(F2, a, b, c, d, in[ 9] + 0x21e1cde6, 5);
-  MD5STEP(F2, d, a, b, c, in[14] + 0xc33707d6, 9);
-  MD5STEP(F2, c, d, a, b, in[ 3] + 0xf4d50d87, 14);
-  MD5STEP(F2, b, c, d, a, in[ 8] + 0x455a14ed, 20);
-  MD5STEP(F2, a, b, c, d, in[13] + 0xa9e3e905, 5);
-  MD5STEP(F2, d, a, b, c, in[ 2] + 0xfcefa3f8, 9);
-  MD5STEP(F2, c, d, a, b, in[ 7] + 0x676f02d9, 14);
-  MD5STEP(F2, b, c, d, a, in[12] + 0x8d2a4c8a, 20);
-
-  MD5STEP(F3, a, b, c, d, in[ 5] + 0xfffa3942, 4);
-  MD5STEP(F3, d, a, b, c, in[ 8] + 0x8771f681, 11);
-  MD5STEP(F3, c, d, a, b, in[11] + 0x6d9d6122, 16);
-  MD5STEP(F3, b, c, d, a, in[14] + 0xfde5380c, 23);
-  MD5STEP(F3, a, b, c, d, in[ 1] + 0xa4beea44, 4);
-  MD5STEP(F3, d, a, b, c, in[ 4] + 0x4bdecfa9, 11);
-  MD5STEP(F3, c, d, a, b, in[ 7] + 0xf6bb4b60, 16);
-  MD5STEP(F3, b, c, d, a, in[10] + 0xbebfbc70, 23);
-  MD5STEP(F3, a, b, c, d, in[13] + 0x289b7ec6, 4);
-  MD5STEP(F3, d, a, b, c, in[ 0] + 0xeaa127fa, 11);
-  MD5STEP(F3, c, d, a, b, in[ 3] + 0xd4ef3085, 16);
-  MD5STEP(F3, b, c, d, a, in[ 6] + 0x04881d05, 23);
-  MD5STEP(F3, a, b, c, d, in[ 9] + 0xd9d4d039, 4);
-  MD5STEP(F3, d, a, b, c, in[12] + 0xe6db99e5, 11);
-  MD5STEP(F3, c, d, a, b, in[15] + 0x1fa27cf8, 16);
-  MD5STEP(F3, b, c, d, a, in[ 2] + 0xc4ac5665, 23);
-
-  MD5STEP(F4, a, b, c, d, in[ 0] + 0xf4292244, 6);
-  MD5STEP(F4, d, a, b, c, in[ 7] + 0x432aff97, 10);
-  MD5STEP(F4, c, d, a, b, in[14] + 0xab9423a7, 15);
-  MD5STEP(F4, b, c, d, a, in[ 5] + 0xfc93a039, 21);
-  MD5STEP(F4, a, b, c, d, in[12] + 0x655b59c3, 6);
-  MD5STEP(F4, d, a, b, c, in[ 3] + 0x8f0ccc92, 10);
-  MD5STEP(F4, c, d, a, b, in[10] + 0xffeff47d, 15);
-  MD5STEP(F4, b, c, d, a, in[ 1] + 0x85845dd1, 21);
-  MD5STEP(F4, a, b, c, d, in[ 8] + 0x6fa87e4f, 6);
-  MD5STEP(F4, d, a, b, c, in[15] + 0xfe2ce6e0, 10);
-  MD5STEP(F4, c, d, a, b, in[ 6] + 0xa3014314, 15);
-  MD5STEP(F4, b, c, d, a, in[13] + 0x4e0811a1, 21);
-  MD5STEP(F4, a, b, c, d, in[ 4] + 0xf7537e82, 6);
-  MD5STEP(F4, d, a, b, c, in[11] + 0xbd3af235, 10);
-  MD5STEP(F4, c, d, a, b, in[ 2] + 0x2ad7d2bb, 15);
-  MD5STEP(F4, b, c, d, a, in[ 9] + 0xeb86d391, 21);
-  buf[0] += a;
-  buf[1] += b;
-  buf[2] += c;
-  buf[3] += d;
-}
-
-}  // namespace rtc
diff --git a/rtc_base/md5.h b/rtc_base/md5.h
deleted file mode 100644
index 9326d53..0000000
--- a/rtc_base/md5.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * This is the header file for the MD5 message-digest algorithm.
- * The algorithm is due to Ron Rivest.  This code was
- * written by Colin Plumb in 1993, no copyright is claimed.
- * This code is in the public domain; do with it what you wish.
- *
- * Equivalent code is available from RSA Data Security, Inc.
- * This code has been tested against that, and is equivalent,
- * except that you don't need to include two pages of legalese
- * with every copy.
- * To compute the message digest of a chunk of bytes, declare an
- * MD5Context structure, pass it to MD5Init, call MD5Update as
- * needed on buffers full of bytes, and then call MD5Final, which
- * will fill a supplied 16-byte array with the digest.
- *
- */
-
-// Changes(fbarchard): Ported to C++ and Google style guide.
-// Made context first parameter in MD5Final for consistency with Sha1.
-// Changes(hellner): added rtc namespace
-// Changes(pbos): Reverted types back to uint32(8)_t with _t suffix.
-
-#ifndef WEBRTC_RTC_BASE_MD5_H_
-#define WEBRTC_RTC_BASE_MD5_H_
-
-#include <stdint.h>
-#include <stdlib.h>
-
-namespace rtc {
-
-struct MD5Context {
-  uint32_t buf[4];
-  uint32_t bits[2];
-  uint32_t in[16];
-};
-
-void MD5Init(MD5Context* context);
-void MD5Update(MD5Context* context, const uint8_t* data, size_t len);
-void MD5Final(MD5Context* context, uint8_t digest[16]);
-void MD5Transform(uint32_t buf[4], const uint32_t in[16]);
-
-}  // namespace rtc
-
-#endif  // WEBRTC_RTC_BASE_MD5_H_
diff --git a/rtc_base/md5digest.cc b/rtc_base/md5digest.cc
deleted file mode 100644
index 543de7d..0000000
--- a/rtc_base/md5digest.cc
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- *  Copyright 2015 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/rtc_base/md5digest.h"
-
-namespace rtc {
-
-size_t Md5Digest::Size() const {
-  return kSize;
-}
-
-void Md5Digest::Update(const void* buf, size_t len) {
-  MD5Update(&ctx_, static_cast<const uint8_t*>(buf), len);
-}
-
-size_t Md5Digest::Finish(void* buf, size_t len) {
-  if (len < kSize) {
-    return 0;
-  }
-  MD5Final(&ctx_, static_cast<uint8_t*>(buf));
-  MD5Init(&ctx_);  // Reset for next use.
-  return kSize;
-}
-
-};  // namespace rtc
diff --git a/rtc_base/md5digest.h b/rtc_base/md5digest.h
deleted file mode 100644
index 2e7426d..0000000
--- a/rtc_base/md5digest.h
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- *  Copyright 2012 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_RTC_BASE_MD5DIGEST_H_
-#define WEBRTC_RTC_BASE_MD5DIGEST_H_
-
-#include "webrtc/rtc_base/md5.h"
-#include "webrtc/rtc_base/messagedigest.h"
-
-namespace rtc {
-
-// A simple wrapper for our MD5 implementation.
-class Md5Digest : public MessageDigest {
- public:
-  enum { kSize = 16 };
-  Md5Digest() {
-    MD5Init(&ctx_);
-  }
-  size_t Size() const override;
-  void Update(const void* buf, size_t len) override;
-  size_t Finish(void* buf, size_t len) override;
-
- private:
-  MD5Context ctx_;
-};
-
-}  // namespace rtc
-
-#endif  // WEBRTC_RTC_BASE_MD5DIGEST_H_
diff --git a/rtc_base/md5digest_unittest.cc b/rtc_base/md5digest_unittest.cc
deleted file mode 100644
index f2f5eca..0000000
--- a/rtc_base/md5digest_unittest.cc
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- *  Copyright 2012 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/rtc_base/md5digest.h"
-#include "webrtc/rtc_base/gunit.h"
-#include "webrtc/rtc_base/stringencode.h"
-
-namespace rtc {
-
-std::string Md5(const std::string& input) {
-  Md5Digest md5;
-  return ComputeDigest(&md5, input);
-}
-
-TEST(Md5DigestTest, TestSize) {
-  Md5Digest md5;
-  EXPECT_EQ(16, static_cast<int>(Md5Digest::kSize));
-  EXPECT_EQ(16U, md5.Size());
-}
-
-TEST(Md5DigestTest, TestBasic) {
-  // These are the standard MD5 test vectors from RFC 1321.
-  EXPECT_EQ("d41d8cd98f00b204e9800998ecf8427e", Md5(""));
-  EXPECT_EQ("0cc175b9c0f1b6a831c399e269772661", Md5("a"));
-  EXPECT_EQ("900150983cd24fb0d6963f7d28e17f72", Md5("abc"));
-  EXPECT_EQ("f96b697d7cb7938d525a2f31aaf161d0", Md5("message digest"));
-  EXPECT_EQ("c3fcd3d76192e4007dfb496cca67e13b",
-            Md5("abcdefghijklmnopqrstuvwxyz"));
-}
-
-TEST(Md5DigestTest, TestMultipleUpdates) {
-  Md5Digest md5;
-  std::string input = "abcdefghijklmnopqrstuvwxyz";
-  char output[Md5Digest::kSize];
-  for (size_t i = 0; i < input.size(); ++i) {
-    md5.Update(&input[i], 1);
-  }
-  EXPECT_EQ(md5.Size(), md5.Finish(output, sizeof(output)));
-  EXPECT_EQ("c3fcd3d76192e4007dfb496cca67e13b",
-            hex_encode(output, sizeof(output)));
-}
-
-TEST(Md5DigestTest, TestReuse) {
-  Md5Digest md5;
-  std::string input = "message digest";
-  EXPECT_EQ("f96b697d7cb7938d525a2f31aaf161d0", ComputeDigest(&md5, input));
-  input = "abcdefghijklmnopqrstuvwxyz";
-  EXPECT_EQ("c3fcd3d76192e4007dfb496cca67e13b", ComputeDigest(&md5, input));
-}
-
-TEST(Md5DigestTest, TestBufferTooSmall) {
-  Md5Digest md5;
-  std::string input = "abcdefghijklmnopqrstuvwxyz";
-  char output[Md5Digest::kSize - 1];
-  md5.Update(input.c_str(), input.size());
-  EXPECT_EQ(0U, md5.Finish(output, sizeof(output)));
-}
-
-TEST(Md5DigestTest, TestBufferConst) {
-  Md5Digest md5;
-  const int kLongSize = 1000000;
-  std::string input(kLongSize, '\0');
-  for (int i = 0; i < kLongSize; ++i) {
-    input[i] = static_cast<char>(i);
-  }
-  md5.Update(input.c_str(), input.size());
-  for (int i = 0; i < kLongSize; ++i) {
-    EXPECT_EQ(static_cast<char>(i), input[i]);
-  }
-}
-
-}  // namespace rtc
diff --git a/rtc_base/memory_usage.cc b/rtc_base/memory_usage.cc
deleted file mode 100644
index 34fb910..0000000
--- a/rtc_base/memory_usage.cc
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- *  Copyright (c) 2017 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/rtc_base/memory_usage.h"
-
-#if defined(WEBRTC_LINUX)
-#include <unistd.h>
-#include <cstdlib>
-#include <cstdio>
-#include <cstring>
-#elif defined(WEBRTC_MAC)
-#include <mach/mach.h>
-#elif defined(WEBRTC_WIN)
-#include <windows.h>
-#include <psapi.h>
-#endif
-
-#include "webrtc/rtc_base/logging.h"
-
-namespace rtc {
-
-int64_t GetProcessResidentSizeBytes() {
-#if defined(WEBRTC_LINUX)
-  FILE* file = fopen("/proc/self/statm", "r");
-  if (file == nullptr) {
-    LOG(LS_ERROR) << "Failed to open /proc/self/statm";
-    return -1;
-  }
-  int result = -1;
-  if (fscanf(file, "%*s%d", &result) != 1) {
-    fclose(file);
-    LOG(LS_ERROR) << "Failed to parse /proc/self/statm";
-    return -1;
-  }
-  fclose(file);
-  return static_cast<int64_t>(result) * sysconf(_SC_PAGESIZE);
-#elif defined(WEBRTC_MAC)
-  task_basic_info_64 info;
-  mach_msg_type_number_t info_count = TASK_BASIC_INFO_64_COUNT;
-  if (task_info(mach_task_self(), TASK_BASIC_INFO_64,
-                reinterpret_cast<task_info_t>(&info),
-                &info_count) != KERN_SUCCESS) {
-    LOG_ERR(LS_ERROR) << "task_info() failed";
-    return -1;
-  }
-  return info.resident_size;
-#elif defined(WEBRTC_WIN)
-  PROCESS_MEMORY_COUNTERS pmc;
-  if (GetProcessMemoryInfo(GetCurrentProcess(), &pmc, sizeof(pmc)) == 0) {
-    LOG_ERR(LS_ERROR) << "GetProcessMemoryInfo() failed";
-    return -1;
-  }
-  return pmc.WorkingSetSize;
-#else
-  // Not implemented yet.
-  static_assert(false,
-                "GetProcessVirtualMemoryUsageBytes() platform support not yet "
-                "implemented.");
-#endif
-}
-
-}  // namespace rtc
diff --git a/rtc_base/memory_usage.h b/rtc_base/memory_usage.h
deleted file mode 100644
index 4cb8231..0000000
--- a/rtc_base/memory_usage.h
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- *  Copyright (c) 2017 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_RTC_BASE_MEMORY_USAGE_H_
-#define WEBRTC_RTC_BASE_MEMORY_USAGE_H_
-
-#include <stdint.h>
-
-namespace rtc {
-
-// Returns current memory used by the process in bytes (working set size on
-// Windows and resident set size on other platforms).
-// Returns -1 on failure.
-int64_t GetProcessResidentSizeBytes();
-
-}  // namespace rtc
-
-#endif  // WEBRTC_RTC_BASE_MEMORY_USAGE_H_
diff --git a/rtc_base/memory_usage_unittest.cc b/rtc_base/memory_usage_unittest.cc
deleted file mode 100644
index 5b6224f..0000000
--- a/rtc_base/memory_usage_unittest.cc
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- *  Copyright (c) 2017 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/rtc_base/memory_usage.h"
-#include <cstdio>
-#include "webrtc/test/gtest.h"
-
-namespace rtc {
-
-TEST(GetMemoryUsage, SimpleTest) {
-  int64_t used_bytes = GetProcessResidentSizeBytes();
-  EXPECT_GE(used_bytes, 0);
-}
-
-}  // namespace rtc
-
diff --git a/rtc_base/messagedigest.cc b/rtc_base/messagedigest.cc
deleted file mode 100644
index a72ae40..0000000
--- a/rtc_base/messagedigest.cc
+++ /dev/null
@@ -1,167 +0,0 @@
-/*
- *  Copyright 2011 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/rtc_base/messagedigest.h"
-
-#include <memory>
-
-#include <string.h>
-
-#include "webrtc/rtc_base/basictypes.h"
-#include "webrtc/rtc_base/openssldigest.h"
-#include "webrtc/rtc_base/stringencode.h"
-
-namespace rtc {
-
-// From RFC 4572.
-const char DIGEST_MD5[]     = "md5";
-const char DIGEST_SHA_1[]   = "sha-1";
-const char DIGEST_SHA_224[] = "sha-224";
-const char DIGEST_SHA_256[] = "sha-256";
-const char DIGEST_SHA_384[] = "sha-384";
-const char DIGEST_SHA_512[] = "sha-512";
-
-static const size_t kBlockSize = 64;  // valid for SHA-256 and down
-
-MessageDigest* MessageDigestFactory::Create(const std::string& alg) {
-  MessageDigest* digest = new OpenSSLDigest(alg);
-  if (digest->Size() == 0) {  // invalid algorithm
-    delete digest;
-    digest = nullptr;
-  }
-  return digest;
-}
-
-bool IsFips180DigestAlgorithm(const std::string& alg) {
-  // These are the FIPS 180 algorithms.  According to RFC 4572 Section 5,
-  // "Self-signed certificates (for which legacy certificates are not a
-  // consideration) MUST use one of the FIPS 180 algorithms (SHA-1,
-  // SHA-224, SHA-256, SHA-384, or SHA-512) as their signature algorithm,
-  // and thus also MUST use it to calculate certificate fingerprints."
-  return alg == DIGEST_SHA_1 ||
-         alg == DIGEST_SHA_224 ||
-         alg == DIGEST_SHA_256 ||
-         alg == DIGEST_SHA_384 ||
-         alg == DIGEST_SHA_512;
-}
-
-size_t ComputeDigest(MessageDigest* digest, const void* input, size_t in_len,
-                     void* output, size_t out_len) {
-  digest->Update(input, in_len);
-  return digest->Finish(output, out_len);
-}
-
-size_t ComputeDigest(const std::string& alg, const void* input, size_t in_len,
-                     void* output, size_t out_len) {
-  std::unique_ptr<MessageDigest> digest(MessageDigestFactory::Create(alg));
-  return (digest) ?
-      ComputeDigest(digest.get(), input, in_len, output, out_len) :
-      0;
-}
-
-std::string ComputeDigest(MessageDigest* digest, const std::string& input) {
-  std::unique_ptr<char[]> output(new char[digest->Size()]);
-  ComputeDigest(digest, input.data(), input.size(),
-                output.get(), digest->Size());
-  return hex_encode(output.get(), digest->Size());
-}
-
-bool ComputeDigest(const std::string& alg, const std::string& input,
-                   std::string* output) {
-  std::unique_ptr<MessageDigest> digest(MessageDigestFactory::Create(alg));
-  if (!digest) {
-    return false;
-  }
-  *output = ComputeDigest(digest.get(), input);
-  return true;
-}
-
-std::string ComputeDigest(const std::string& alg, const std::string& input) {
-  std::string output;
-  ComputeDigest(alg, input, &output);
-  return output;
-}
-
-// Compute a RFC 2104 HMAC: H(K XOR opad, H(K XOR ipad, text))
-size_t ComputeHmac(MessageDigest* digest,
-                   const void* key, size_t key_len,
-                   const void* input, size_t in_len,
-                   void* output, size_t out_len) {
-  // We only handle algorithms with a 64-byte blocksize.
-  // TODO: Add BlockSize() method to MessageDigest.
-  size_t block_len = kBlockSize;
-  if (digest->Size() > 32) {
-    return 0;
-  }
-  // Copy the key to a block-sized buffer to simplify padding.
-  // If the key is longer than a block, hash it and use the result instead.
-  std::unique_ptr<uint8_t[]> new_key(new uint8_t[block_len]);
-  if (key_len > block_len) {
-    ComputeDigest(digest, key, key_len, new_key.get(), block_len);
-    memset(new_key.get() + digest->Size(), 0, block_len - digest->Size());
-  } else {
-    memcpy(new_key.get(), key, key_len);
-    memset(new_key.get() + key_len, 0, block_len - key_len);
-  }
-  // Set up the padding from the key, salting appropriately for each padding.
-  std::unique_ptr<uint8_t[]> o_pad(new uint8_t[block_len]);
-  std::unique_ptr<uint8_t[]> i_pad(new uint8_t[block_len]);
-  for (size_t i = 0; i < block_len; ++i) {
-    o_pad[i] = 0x5c ^ new_key[i];
-    i_pad[i] = 0x36 ^ new_key[i];
-  }
-  // Inner hash; hash the inner padding, and then the input buffer.
-  std::unique_ptr<uint8_t[]> inner(new uint8_t[digest->Size()]);
-  digest->Update(i_pad.get(), block_len);
-  digest->Update(input, in_len);
-  digest->Finish(inner.get(), digest->Size());
-  // Outer hash; hash the outer padding, and then the result of the inner hash.
-  digest->Update(o_pad.get(), block_len);
-  digest->Update(inner.get(), digest->Size());
-  return digest->Finish(output, out_len);
-}
-
-size_t ComputeHmac(const std::string& alg, const void* key, size_t key_len,
-                   const void* input, size_t in_len,
-                   void* output, size_t out_len) {
-  std::unique_ptr<MessageDigest> digest(MessageDigestFactory::Create(alg));
-  if (!digest) {
-    return 0;
-  }
-  return ComputeHmac(digest.get(), key, key_len,
-                     input, in_len, output, out_len);
-}
-
-std::string ComputeHmac(MessageDigest* digest, const std::string& key,
-                        const std::string& input) {
-  std::unique_ptr<char[]> output(new char[digest->Size()]);
-  ComputeHmac(digest, key.data(), key.size(),
-              input.data(), input.size(), output.get(), digest->Size());
-  return hex_encode(output.get(), digest->Size());
-}
-
-bool ComputeHmac(const std::string& alg, const std::string& key,
-                 const std::string& input, std::string* output) {
-  std::unique_ptr<MessageDigest> digest(MessageDigestFactory::Create(alg));
-  if (!digest) {
-    return false;
-  }
-  *output = ComputeHmac(digest.get(), key, input);
-  return true;
-}
-
-std::string ComputeHmac(const std::string& alg, const std::string& key,
-                        const std::string& input) {
-  std::string output;
-  ComputeHmac(alg, key, input, &output);
-  return output;
-}
-
-}  // namespace rtc
diff --git a/rtc_base/messagedigest.h b/rtc_base/messagedigest.h
deleted file mode 100644
index 12e4287..0000000
--- a/rtc_base/messagedigest.h
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- *  Copyright 2004 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_RTC_BASE_MESSAGEDIGEST_H_
-#define WEBRTC_RTC_BASE_MESSAGEDIGEST_H_
-
-#include <string>
-
-namespace rtc {
-
-// Definitions for the digest algorithms.
-extern const char DIGEST_MD5[];
-extern const char DIGEST_SHA_1[];
-extern const char DIGEST_SHA_224[];
-extern const char DIGEST_SHA_256[];
-extern const char DIGEST_SHA_384[];
-extern const char DIGEST_SHA_512[];
-
-// A general class for computing hashes.
-class MessageDigest {
- public:
-  enum { kMaxSize = 64 };  // Maximum known size (SHA-512)
-  virtual ~MessageDigest() {}
-  // Returns the digest output size (e.g. 16 bytes for MD5).
-  virtual size_t Size() const = 0;
-  // Updates the digest with |len| bytes from |buf|.
-  virtual void Update(const void* buf, size_t len) = 0;
-  // Outputs the digest value to |buf| with length |len|.
-  // Returns the number of bytes written, i.e., Size().
-  virtual size_t Finish(void* buf, size_t len) = 0;
-};
-
-// A factory class for creating digest objects.
-class MessageDigestFactory {
- public:
-  static MessageDigest* Create(const std::string& alg);
-};
-
-// A whitelist of approved digest algorithms from RFC 4572 (FIPS 180).
-bool IsFips180DigestAlgorithm(const std::string& alg);
-
-// Functions to create hashes.
-
-// Computes the hash of |in_len| bytes of |input|, using the |digest| hash
-// implementation, and outputs the hash to the buffer |output|, which is
-// |out_len| bytes long. Returns the number of bytes written to |output| if
-// successful, or 0 if |out_len| was too small.
-size_t ComputeDigest(MessageDigest* digest, const void* input, size_t in_len,
-                     void* output, size_t out_len);
-// Like the previous function, but creates a digest implementation based on
-// the desired digest name |alg|, e.g. DIGEST_SHA_1. Returns 0 if there is no
-// digest with the given name.
-size_t ComputeDigest(const std::string& alg, const void* input, size_t in_len,
-                     void* output, size_t out_len);
-// Computes the hash of |input| using the |digest| hash implementation, and
-// returns it as a hex-encoded string.
-std::string ComputeDigest(MessageDigest* digest, const std::string& input);
-// Like the previous function, but creates a digest implementation based on
-// the desired digest name |alg|, e.g. DIGEST_SHA_1. Returns empty string if
-// there is no digest with the given name.
-std::string ComputeDigest(const std::string& alg, const std::string& input);
-// Like the previous function, but returns an explicit result code.
-bool ComputeDigest(const std::string& alg, const std::string& input,
-                   std::string* output);
-
-// Shorthand way to compute a hex-encoded hash using MD5.
-inline std::string MD5(const std::string& input) {
-  return ComputeDigest(DIGEST_MD5, input);
-}
-
-// Functions to compute RFC 2104 HMACs.
-
-// Computes the HMAC of |in_len| bytes of |input|, using the |digest| hash
-// implementation and |key_len| bytes of |key| to key the HMAC, and outputs
-// the HMAC to the buffer |output|, which is |out_len| bytes long. Returns the
-// number of bytes written to |output| if successful, or 0 if |out_len| was too
-// small.
-size_t ComputeHmac(MessageDigest* digest, const void* key, size_t key_len,
-                   const void* input, size_t in_len,
-                   void* output, size_t out_len);
-// Like the previous function, but creates a digest implementation based on
-// the desired digest name |alg|, e.g. DIGEST_SHA_1. Returns 0 if there is no
-// digest with the given name.
-size_t ComputeHmac(const std::string& alg, const void* key, size_t key_len,
-                   const void* input, size_t in_len,
-                   void* output, size_t out_len);
-// Computes the HMAC of |input| using the |digest| hash implementation and |key|
-// to key the HMAC, and returns it as a hex-encoded string.
-std::string ComputeHmac(MessageDigest* digest, const std::string& key,
-                        const std::string& input);
-// Like the previous function, but creates a digest implementation based on
-// the desired digest name |alg|, e.g. DIGEST_SHA_1. Returns empty string if
-// there is no digest with the given name.
-std::string ComputeHmac(const std::string& alg, const std::string& key,
-                        const std::string& input);
-// Like the previous function, but returns an explicit result code.
-bool ComputeHmac(const std::string& alg, const std::string& key,
-                 const std::string& input, std::string* output);
-
-}  // namespace rtc
-
-#endif  // WEBRTC_RTC_BASE_MESSAGEDIGEST_H_
diff --git a/rtc_base/messagedigest_unittest.cc b/rtc_base/messagedigest_unittest.cc
deleted file mode 100644
index ebc091a..0000000
--- a/rtc_base/messagedigest_unittest.cc
+++ /dev/null
@@ -1,151 +0,0 @@
-/*
- *  Copyright 2012 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/rtc_base/messagedigest.h"
-#include "webrtc/rtc_base/gunit.h"
-#include "webrtc/rtc_base/stringencode.h"
-
-namespace rtc {
-
-// Test vectors from RFC 1321.
-TEST(MessageDigestTest, TestMd5Digest) {
-  // Test the string versions of the APIs.
-  EXPECT_EQ("d41d8cd98f00b204e9800998ecf8427e",
-      ComputeDigest(DIGEST_MD5, ""));
-  EXPECT_EQ("900150983cd24fb0d6963f7d28e17f72",
-      ComputeDigest(DIGEST_MD5, "abc"));
-  EXPECT_EQ("c3fcd3d76192e4007dfb496cca67e13b",
-      ComputeDigest(DIGEST_MD5, "abcdefghijklmnopqrstuvwxyz"));
-
-  // Test the raw buffer versions of the APIs; also check output buffer size.
-  char output[16];
-  EXPECT_EQ(sizeof(output),
-      ComputeDigest(DIGEST_MD5, "abc", 3, output, sizeof(output)));
-  EXPECT_EQ("900150983cd24fb0d6963f7d28e17f72",
-      hex_encode(output, sizeof(output)));
-  EXPECT_EQ(0U,
-      ComputeDigest(DIGEST_MD5, "abc", 3, output, sizeof(output) - 1));
-}
-
-// Test vectors from RFC 3174.
-TEST(MessageDigestTest, TestSha1Digest) {
-  // Test the string versions of the APIs.
-  EXPECT_EQ("da39a3ee5e6b4b0d3255bfef95601890afd80709",
-      ComputeDigest(DIGEST_SHA_1, ""));
-  EXPECT_EQ("a9993e364706816aba3e25717850c26c9cd0d89d",
-      ComputeDigest(DIGEST_SHA_1, "abc"));
-  EXPECT_EQ("84983e441c3bd26ebaae4aa1f95129e5e54670f1",
-      ComputeDigest(DIGEST_SHA_1,
-          "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"));
-
-  // Test the raw buffer versions of the APIs; also check output buffer size.
-  char output[20];
-  EXPECT_EQ(sizeof(output),
-      ComputeDigest(DIGEST_SHA_1, "abc", 3, output, sizeof(output)));
-  EXPECT_EQ("a9993e364706816aba3e25717850c26c9cd0d89d",
-      hex_encode(output, sizeof(output)));
-  EXPECT_EQ(0U,
-      ComputeDigest(DIGEST_SHA_1, "abc", 3, output, sizeof(output) - 1));
-}
-
-// Test that we fail properly if a bad digest algorithm is specified.
-TEST(MessageDigestTest, TestBadDigest) {
-  std::string output;
-  EXPECT_FALSE(ComputeDigest("sha-9000", "abc", &output));
-  EXPECT_EQ("", ComputeDigest("sha-9000", "abc"));
-}
-
-// Test vectors from RFC 2202.
-TEST(MessageDigestTest, TestMd5Hmac) {
-  // Test the string versions of the APIs.
-  EXPECT_EQ("9294727a3638bb1c13f48ef8158bfc9d",
-      ComputeHmac(DIGEST_MD5, std::string(16, '\x0b'), "Hi There"));
-  EXPECT_EQ("750c783e6ab0b503eaa86e310a5db738",
-      ComputeHmac(DIGEST_MD5, "Jefe", "what do ya want for nothing?"));
-  EXPECT_EQ("56be34521d144c88dbb8c733f0e8b3f6",
-      ComputeHmac(DIGEST_MD5, std::string(16, '\xaa'),
-          std::string(50, '\xdd')));
-  EXPECT_EQ("697eaf0aca3a3aea3a75164746ffaa79",
-      ComputeHmac(DIGEST_MD5,
-          "\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
-          "\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19",
-          std::string(50, '\xcd')));
-  EXPECT_EQ("56461ef2342edc00f9bab995690efd4c",
-      ComputeHmac(DIGEST_MD5, std::string(16, '\x0c'),
-          "Test With Truncation"));
-  EXPECT_EQ("6b1ab7fe4bd7bf8f0b62e6ce61b9d0cd",
-      ComputeHmac(DIGEST_MD5, std::string(80, '\xaa'),
-          "Test Using Larger Than Block-Size Key - Hash Key First"));
-  EXPECT_EQ("6f630fad67cda0ee1fb1f562db3aa53e",
-      ComputeHmac(DIGEST_MD5, std::string(80, '\xaa'),
-          "Test Using Larger Than Block-Size Key and Larger "
-          "Than One Block-Size Data"));
-
-  // Test the raw buffer versions of the APIs; also check output buffer size.
-  std::string key(16, '\x0b');
-  std::string input("Hi There");
-  char output[16];
-  EXPECT_EQ(sizeof(output),
-      ComputeHmac(DIGEST_MD5, key.c_str(), key.size(),
-          input.c_str(), input.size(), output, sizeof(output)));
-  EXPECT_EQ("9294727a3638bb1c13f48ef8158bfc9d",
-      hex_encode(output, sizeof(output)));
-  EXPECT_EQ(0U,
-      ComputeHmac(DIGEST_MD5, key.c_str(), key.size(),
-          input.c_str(), input.size(), output, sizeof(output) - 1));
-}
-
-// Test vectors from RFC 2202.
-TEST(MessageDigestTest, TestSha1Hmac) {
-  // Test the string versions of the APIs.
-  EXPECT_EQ("b617318655057264e28bc0b6fb378c8ef146be00",
-      ComputeHmac(DIGEST_SHA_1, std::string(20, '\x0b'), "Hi There"));
-  EXPECT_EQ("effcdf6ae5eb2fa2d27416d5f184df9c259a7c79",
-      ComputeHmac(DIGEST_SHA_1, "Jefe", "what do ya want for nothing?"));
-  EXPECT_EQ("125d7342b9ac11cd91a39af48aa17b4f63f175d3",
-      ComputeHmac(DIGEST_SHA_1, std::string(20, '\xaa'),
-          std::string(50, '\xdd')));
-  EXPECT_EQ("4c9007f4026250c6bc8414f9bf50c86c2d7235da",
-      ComputeHmac(DIGEST_SHA_1,
-          "\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
-          "\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19",
-          std::string(50, '\xcd')));
-  EXPECT_EQ("4c1a03424b55e07fe7f27be1d58bb9324a9a5a04",
-      ComputeHmac(DIGEST_SHA_1, std::string(20, '\x0c'),
-          "Test With Truncation"));
-  EXPECT_EQ("aa4ae5e15272d00e95705637ce8a3b55ed402112",
-      ComputeHmac(DIGEST_SHA_1, std::string(80, '\xaa'),
-          "Test Using Larger Than Block-Size Key - Hash Key First"));
-  EXPECT_EQ("e8e99d0f45237d786d6bbaa7965c7808bbff1a91",
-      ComputeHmac(DIGEST_SHA_1, std::string(80, '\xaa'),
-          "Test Using Larger Than Block-Size Key and Larger "
-          "Than One Block-Size Data"));
-
-  // Test the raw buffer versions of the APIs; also check output buffer size.
-  std::string key(20, '\x0b');
-  std::string input("Hi There");
-  char output[20];
-  EXPECT_EQ(sizeof(output),
-      ComputeHmac(DIGEST_SHA_1, key.c_str(), key.size(),
-          input.c_str(), input.size(), output, sizeof(output)));
-  EXPECT_EQ("b617318655057264e28bc0b6fb378c8ef146be00",
-      hex_encode(output, sizeof(output)));
-  EXPECT_EQ(0U,
-      ComputeHmac(DIGEST_SHA_1, key.c_str(), key.size(),
-          input.c_str(), input.size(), output, sizeof(output) - 1));
-}
-
-TEST(MessageDigestTest, TestBadHmac) {
-  std::string output;
-  EXPECT_FALSE(ComputeHmac("sha-9000", "key", "abc", &output));
-  EXPECT_EQ("", ComputeHmac("sha-9000", "key", "abc"));
-}
-
-}  // namespace rtc
diff --git a/rtc_base/messagehandler.cc b/rtc_base/messagehandler.cc
deleted file mode 100644
index 741049a..0000000
--- a/rtc_base/messagehandler.cc
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- *  Copyright 2004 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/rtc_base/messagehandler.h"
-#include "webrtc/rtc_base/messagequeue.h"
-
-namespace rtc {
-
-MessageHandler::~MessageHandler() {
-  MessageQueueManager::Clear(this);
-}
-
-} // namespace rtc
diff --git a/rtc_base/messagehandler.h b/rtc_base/messagehandler.h
deleted file mode 100644
index 04e4b10..0000000
--- a/rtc_base/messagehandler.h
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- *  Copyright 2004 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_RTC_BASE_MESSAGEHANDLER_H_
-#define WEBRTC_RTC_BASE_MESSAGEHANDLER_H_
-
-#include <memory>
-#include <utility>
-
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace rtc {
-
-struct Message;
-
-// Messages get dispatched to a MessageHandler
-
-class MessageHandler {
- public:
-  virtual ~MessageHandler();
-  virtual void OnMessage(Message* msg) = 0;
-
- protected:
-  MessageHandler() {}
-
- private:
-  RTC_DISALLOW_COPY_AND_ASSIGN(MessageHandler);
-};
-
-// Helper class to facilitate executing a functor on a thread.
-template <class ReturnT, class FunctorT>
-class FunctorMessageHandler : public MessageHandler {
- public:
-  explicit FunctorMessageHandler(const FunctorT& functor)
-      : functor_(functor) {}
-  virtual void OnMessage(Message* msg) {
-    result_ = functor_();
-  }
-  const ReturnT& result() const { return result_; }
-
-  // Returns moved result. Should not call result() or MoveResult() again
-  // after this.
-  ReturnT MoveResult() { return std::move(result_); }
-
- private:
-  FunctorT functor_;
-  ReturnT result_;
-};
-
-// Specialization for ReturnT of void.
-template <class FunctorT>
-class FunctorMessageHandler<void, FunctorT> : public MessageHandler {
- public:
-  explicit FunctorMessageHandler(const FunctorT& functor)
-      : functor_(functor) {}
-  virtual void OnMessage(Message* msg) {
-    functor_();
-  }
-  void result() const {}
-  void MoveResult() {}
-
- private:
-  FunctorT functor_;
-};
-
-} // namespace rtc
-
-#endif // WEBRTC_RTC_BASE_MESSAGEHANDLER_H_
diff --git a/rtc_base/messagequeue.cc b/rtc_base/messagequeue.cc
deleted file mode 100644
index 3dd1142..0000000
--- a/rtc_base/messagequeue.cc
+++ /dev/null
@@ -1,539 +0,0 @@
-/*
- *  Copyright 2004 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 <algorithm>
-
-#include "webrtc/rtc_base/atomicops.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/messagequeue.h"
-#include "webrtc/rtc_base/stringencode.h"
-#include "webrtc/rtc_base/thread.h"
-#include "webrtc/rtc_base/trace_event.h"
-
-namespace rtc {
-namespace {
-
-const int kMaxMsgLatency = 150;  // 150 ms
-const int kSlowDispatchLoggingThreshold = 50;  // 50 ms
-
-class RTC_SCOPED_LOCKABLE MarkProcessingCritScope {
- public:
-  MarkProcessingCritScope(const CriticalSection* cs, size_t* processing)
-      RTC_EXCLUSIVE_LOCK_FUNCTION(cs)
-      : cs_(cs), processing_(processing) {
-    cs_->Enter();
-    *processing_ += 1;
-  }
-
-  ~MarkProcessingCritScope() RTC_UNLOCK_FUNCTION() {
-    *processing_ -= 1;
-    cs_->Leave();
-  }
-
- private:
-  const CriticalSection* const cs_;
-  size_t* processing_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(MarkProcessingCritScope);
-};
-}  // namespace
-
-//------------------------------------------------------------------
-// MessageQueueManager
-
-MessageQueueManager* MessageQueueManager::instance_ = nullptr;
-
-MessageQueueManager* MessageQueueManager::Instance() {
-  // Note: This is not thread safe, but it is first called before threads are
-  // spawned.
-  if (!instance_)
-    instance_ = new MessageQueueManager;
-  return instance_;
-}
-
-bool MessageQueueManager::IsInitialized() {
-  return instance_ != nullptr;
-}
-
-MessageQueueManager::MessageQueueManager() : processing_(0) {}
-
-MessageQueueManager::~MessageQueueManager() {
-}
-
-void MessageQueueManager::Add(MessageQueue *message_queue) {
-  return Instance()->AddInternal(message_queue);
-}
-void MessageQueueManager::AddInternal(MessageQueue *message_queue) {
-  CritScope cs(&crit_);
-  // Prevent changes while the list of message queues is processed.
-  RTC_DCHECK_EQ(processing_, 0);
-  message_queues_.push_back(message_queue);
-}
-
-void MessageQueueManager::Remove(MessageQueue *message_queue) {
-  // If there isn't a message queue manager instance, then there isn't a queue
-  // to remove.
-  if (!instance_) return;
-  return Instance()->RemoveInternal(message_queue);
-}
-void MessageQueueManager::RemoveInternal(MessageQueue *message_queue) {
-  // If this is the last MessageQueue, destroy the manager as well so that
-  // we don't leak this object at program shutdown. As mentioned above, this is
-  // not thread-safe, but this should only happen at program termination (when
-  // the ThreadManager is destroyed, and threads are no longer active).
-  bool destroy = false;
-  {
-    CritScope cs(&crit_);
-    // Prevent changes while the list of message queues is processed.
-    RTC_DCHECK_EQ(processing_, 0);
-    std::vector<MessageQueue *>::iterator iter;
-    iter = std::find(message_queues_.begin(), message_queues_.end(),
-                     message_queue);
-    if (iter != message_queues_.end()) {
-      message_queues_.erase(iter);
-    }
-    destroy = message_queues_.empty();
-  }
-  if (destroy) {
-    instance_ = nullptr;
-    delete this;
-  }
-}
-
-void MessageQueueManager::Clear(MessageHandler *handler) {
-  // If there isn't a message queue manager instance, then there aren't any
-  // queues to remove this handler from.
-  if (!instance_) return;
-  return Instance()->ClearInternal(handler);
-}
-void MessageQueueManager::ClearInternal(MessageHandler *handler) {
-  // Deleted objects may cause re-entrant calls to ClearInternal. This is
-  // allowed as the list of message queues does not change while queues are
-  // cleared.
-  MarkProcessingCritScope cs(&crit_, &processing_);
-  std::vector<MessageQueue *>::iterator iter;
-  for (MessageQueue* queue : message_queues_) {
-    queue->Clear(handler);
-  }
-}
-
-void MessageQueueManager::ProcessAllMessageQueues() {
-  if (!instance_) {
-    return;
-  }
-  return Instance()->ProcessAllMessageQueuesInternal();
-}
-
-void MessageQueueManager::ProcessAllMessageQueuesInternal() {
-  // This works by posting a delayed message at the current time and waiting
-  // for it to be dispatched on all queues, which will ensure that all messages
-  // that came before it were also dispatched.
-  volatile int queues_not_done = 0;
-
-  // This class is used so that whether the posted message is processed, or the
-  // message queue is simply cleared, queues_not_done gets decremented.
-  class ScopedIncrement : public MessageData {
-   public:
-    ScopedIncrement(volatile int* value) : value_(value) {
-      AtomicOps::Increment(value_);
-    }
-    ~ScopedIncrement() override { AtomicOps::Decrement(value_); }
-
-   private:
-    volatile int* value_;
-  };
-
-  {
-    MarkProcessingCritScope cs(&crit_, &processing_);
-    for (MessageQueue* queue : message_queues_) {
-      if (!queue->IsProcessingMessages()) {
-        // If the queue is not processing messages, it can
-        // be ignored. If we tried to post a message to it, it would be dropped
-        // or ignored.
-        continue;
-      }
-      queue->PostDelayed(RTC_FROM_HERE, 0, nullptr, MQID_DISPOSE,
-                         new ScopedIncrement(&queues_not_done));
-    }
-  }
-  // Note: One of the message queues may have been on this thread, which is why
-  // we can't synchronously wait for queues_not_done to go to 0; we need to
-  // process messages as well.
-  while (AtomicOps::AcquireLoad(&queues_not_done) > 0) {
-    rtc::Thread::Current()->ProcessMessages(0);
-  }
-}
-
-//------------------------------------------------------------------
-// MessageQueue
-MessageQueue::MessageQueue(SocketServer* ss, bool init_queue)
-    : fPeekKeep_(false),
-      dmsgq_next_num_(0),
-      fInitialized_(false),
-      fDestroyed_(false),
-      stop_(0),
-      ss_(ss) {
-  RTC_DCHECK(ss);
-  // Currently, MessageQueue holds a socket server, and is the base class for
-  // Thread.  It seems like it makes more sense for Thread to hold the socket
-  // server, and provide it to the MessageQueue, since the Thread controls
-  // the I/O model, and MQ is agnostic to those details.  Anyway, this causes
-  // messagequeue_unittest to depend on network libraries... yuck.
-  ss_->SetMessageQueue(this);
-  if (init_queue) {
-    DoInit();
-  }
-}
-
-MessageQueue::MessageQueue(std::unique_ptr<SocketServer> ss, bool init_queue)
-    : MessageQueue(ss.get(), init_queue) {
-  own_ss_ = std::move(ss);
-}
-
-MessageQueue::~MessageQueue() {
-  DoDestroy();
-}
-
-void MessageQueue::DoInit() {
-  if (fInitialized_) {
-    return;
-  }
-
-  fInitialized_ = true;
-  MessageQueueManager::Add(this);
-}
-
-void MessageQueue::DoDestroy() {
-  if (fDestroyed_) {
-    return;
-  }
-
-  fDestroyed_ = true;
-  // The signal is done from here to ensure
-  // that it always gets called when the queue
-  // is going away.
-  SignalQueueDestroyed();
-  MessageQueueManager::Remove(this);
-  Clear(nullptr);
-
-  if (ss_) {
-    ss_->SetMessageQueue(nullptr);
-  }
-}
-
-SocketServer* MessageQueue::socketserver() {
-  return ss_;
-}
-
-void MessageQueue::WakeUpSocketServer() {
-  ss_->WakeUp();
-}
-
-void MessageQueue::Quit() {
-  AtomicOps::ReleaseStore(&stop_, 1);
-  WakeUpSocketServer();
-}
-
-bool MessageQueue::IsQuitting() {
-  return AtomicOps::AcquireLoad(&stop_) != 0;
-}
-
-bool MessageQueue::IsProcessingMessages() {
-  return !IsQuitting();
-}
-
-void MessageQueue::Restart() {
-  AtomicOps::ReleaseStore(&stop_, 0);
-}
-
-bool MessageQueue::Peek(Message *pmsg, int cmsWait) {
-  if (fPeekKeep_) {
-    *pmsg = msgPeek_;
-    return true;
-  }
-  if (!Get(pmsg, cmsWait))
-    return false;
-  msgPeek_ = *pmsg;
-  fPeekKeep_ = true;
-  return true;
-}
-
-bool MessageQueue::Get(Message *pmsg, int cmsWait, bool process_io) {
-  // Return and clear peek if present
-  // Always return the peek if it exists so there is Peek/Get symmetry
-
-  if (fPeekKeep_) {
-    *pmsg = msgPeek_;
-    fPeekKeep_ = false;
-    return true;
-  }
-
-  // Get w/wait + timer scan / dispatch + socket / event multiplexer dispatch
-
-  int64_t cmsTotal = cmsWait;
-  int64_t cmsElapsed = 0;
-  int64_t msStart = TimeMillis();
-  int64_t msCurrent = msStart;
-  while (true) {
-    // Check for sent messages
-    ReceiveSends();
-
-    // Check for posted events
-    int64_t cmsDelayNext = kForever;
-    bool first_pass = true;
-    while (true) {
-      // All queue operations need to be locked, but nothing else in this loop
-      // (specifically handling disposed message) can happen inside the crit.
-      // Otherwise, disposed MessageHandlers will cause deadlocks.
-      {
-        CritScope cs(&crit_);
-        // On the first pass, check for delayed messages that have been
-        // triggered and calculate the next trigger time.
-        if (first_pass) {
-          first_pass = false;
-          while (!dmsgq_.empty()) {
-            if (msCurrent < dmsgq_.top().msTrigger_) {
-              cmsDelayNext = TimeDiff(dmsgq_.top().msTrigger_, msCurrent);
-              break;
-            }
-            msgq_.push_back(dmsgq_.top().msg_);
-            dmsgq_.pop();
-          }
-        }
-        // Pull a message off the message queue, if available.
-        if (msgq_.empty()) {
-          break;
-        } else {
-          *pmsg = msgq_.front();
-          msgq_.pop_front();
-        }
-      }  // crit_ is released here.
-
-      // Log a warning for time-sensitive messages that we're late to deliver.
-      if (pmsg->ts_sensitive) {
-        int64_t delay = TimeDiff(msCurrent, pmsg->ts_sensitive);
-        if (delay > 0) {
-          LOG_F(LS_WARNING) << "id: " << pmsg->message_id << "  delay: "
-                            << (delay + kMaxMsgLatency) << "ms";
-        }
-      }
-      // If this was a dispose message, delete it and skip it.
-      if (MQID_DISPOSE == pmsg->message_id) {
-        RTC_DCHECK(nullptr == pmsg->phandler);
-        delete pmsg->pdata;
-        *pmsg = Message();
-        continue;
-      }
-      return true;
-    }
-
-    if (IsQuitting())
-      break;
-
-    // Which is shorter, the delay wait or the asked wait?
-
-    int64_t cmsNext;
-    if (cmsWait == kForever) {
-      cmsNext = cmsDelayNext;
-    } else {
-      cmsNext = std::max<int64_t>(0, cmsTotal - cmsElapsed);
-      if ((cmsDelayNext != kForever) && (cmsDelayNext < cmsNext))
-        cmsNext = cmsDelayNext;
-    }
-
-    {
-      // Wait and multiplex in the meantime
-      if (!ss_->Wait(static_cast<int>(cmsNext), process_io))
-        return false;
-    }
-
-    // If the specified timeout expired, return
-
-    msCurrent = TimeMillis();
-    cmsElapsed = TimeDiff(msCurrent, msStart);
-    if (cmsWait != kForever) {
-      if (cmsElapsed >= cmsWait)
-        return false;
-    }
-  }
-  return false;
-}
-
-void MessageQueue::ReceiveSends() {
-}
-
-void MessageQueue::Post(const Location& posted_from,
-                        MessageHandler* phandler,
-                        uint32_t id,
-                        MessageData* pdata,
-                        bool time_sensitive) {
-  if (IsQuitting())
-    return;
-
-  // Keep thread safe
-  // Add the message to the end of the queue
-  // Signal for the multiplexer to return
-
-  {
-    CritScope cs(&crit_);
-    Message msg;
-    msg.posted_from = posted_from;
-    msg.phandler = phandler;
-    msg.message_id = id;
-    msg.pdata = pdata;
-    if (time_sensitive) {
-      msg.ts_sensitive = TimeMillis() + kMaxMsgLatency;
-    }
-    msgq_.push_back(msg);
-  }
-  WakeUpSocketServer();
-}
-
-void MessageQueue::PostDelayed(const Location& posted_from,
-                               int cmsDelay,
-                               MessageHandler* phandler,
-                               uint32_t id,
-                               MessageData* pdata) {
-  return DoDelayPost(posted_from, cmsDelay, TimeAfter(cmsDelay), phandler, id,
-                     pdata);
-}
-
-void MessageQueue::PostAt(const Location& posted_from,
-                          uint32_t tstamp,
-                          MessageHandler* phandler,
-                          uint32_t id,
-                          MessageData* pdata) {
-  // This should work even if it is used (unexpectedly).
-  int64_t delay = static_cast<uint32_t>(TimeMillis()) - tstamp;
-  return DoDelayPost(posted_from, delay, tstamp, phandler, id, pdata);
-}
-
-void MessageQueue::PostAt(const Location& posted_from,
-                          int64_t tstamp,
-                          MessageHandler* phandler,
-                          uint32_t id,
-                          MessageData* pdata) {
-  return DoDelayPost(posted_from, TimeUntil(tstamp), tstamp, phandler, id,
-                     pdata);
-}
-
-void MessageQueue::DoDelayPost(const Location& posted_from,
-                               int64_t cmsDelay,
-                               int64_t tstamp,
-                               MessageHandler* phandler,
-                               uint32_t id,
-                               MessageData* pdata) {
-  if (IsQuitting()) {
-    return;
-  }
-
-  // Keep thread safe
-  // Add to the priority queue. Gets sorted soonest first.
-  // Signal for the multiplexer to return.
-
-  {
-    CritScope cs(&crit_);
-    Message msg;
-    msg.posted_from = posted_from;
-    msg.phandler = phandler;
-    msg.message_id = id;
-    msg.pdata = pdata;
-    DelayedMessage dmsg(cmsDelay, tstamp, dmsgq_next_num_, msg);
-    dmsgq_.push(dmsg);
-    // If this message queue processes 1 message every millisecond for 50 days,
-    // we will wrap this number.  Even then, only messages with identical times
-    // will be misordered, and then only briefly.  This is probably ok.
-    ++dmsgq_next_num_;
-    RTC_DCHECK_NE(0, dmsgq_next_num_);
-  }
-  WakeUpSocketServer();
-}
-
-int MessageQueue::GetDelay() {
-  CritScope cs(&crit_);
-
-  if (!msgq_.empty())
-    return 0;
-
-  if (!dmsgq_.empty()) {
-    int delay = TimeUntil(dmsgq_.top().msTrigger_);
-    if (delay < 0)
-      delay = 0;
-    return delay;
-  }
-
-  return kForever;
-}
-
-void MessageQueue::Clear(MessageHandler* phandler,
-                         uint32_t id,
-                         MessageList* removed) {
-  CritScope cs(&crit_);
-
-  // Remove messages with phandler
-
-  if (fPeekKeep_ && msgPeek_.Match(phandler, id)) {
-    if (removed) {
-      removed->push_back(msgPeek_);
-    } else {
-      delete msgPeek_.pdata;
-    }
-    fPeekKeep_ = false;
-  }
-
-  // Remove from ordered message queue
-
-  for (MessageList::iterator it = msgq_.begin(); it != msgq_.end();) {
-    if (it->Match(phandler, id)) {
-      if (removed) {
-        removed->push_back(*it);
-      } else {
-        delete it->pdata;
-      }
-      it = msgq_.erase(it);
-    } else {
-      ++it;
-    }
-  }
-
-  // Remove from priority queue. Not directly iterable, so use this approach
-
-  PriorityQueue::container_type::iterator new_end = dmsgq_.container().begin();
-  for (PriorityQueue::container_type::iterator it = new_end;
-       it != dmsgq_.container().end(); ++it) {
-    if (it->msg_.Match(phandler, id)) {
-      if (removed) {
-        removed->push_back(it->msg_);
-      } else {
-        delete it->msg_.pdata;
-      }
-    } else {
-      *new_end++ = *it;
-    }
-  }
-  dmsgq_.container().erase(new_end, dmsgq_.container().end());
-  dmsgq_.reheap();
-}
-
-void MessageQueue::Dispatch(Message *pmsg) {
-  TRACE_EVENT2("webrtc", "MessageQueue::Dispatch", "src_file_and_line",
-               pmsg->posted_from.file_and_line(), "src_func",
-               pmsg->posted_from.function_name());
-  int64_t start_time = TimeMillis();
-  pmsg->phandler->OnMessage(pmsg);
-  int64_t end_time = TimeMillis();
-  int64_t diff = TimeDiff(end_time, start_time);
-  if (diff >= kSlowDispatchLoggingThreshold) {
-    LOG(LS_INFO) << "Message took " << diff << "ms to dispatch. Posted from: "
-                 << pmsg->posted_from.ToString();
-  }
-}
-
-}  // namespace rtc
diff --git a/rtc_base/messagequeue.h b/rtc_base/messagequeue.h
deleted file mode 100644
index 79217fb..0000000
--- a/rtc_base/messagequeue.h
+++ /dev/null
@@ -1,329 +0,0 @@
-/*
- *  Copyright 2004 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_RTC_BASE_MESSAGEQUEUE_H_
-#define WEBRTC_RTC_BASE_MESSAGEQUEUE_H_
-
-#include <string.h>
-
-#include <algorithm>
-#include <list>
-#include <memory>
-#include <queue>
-#include <utility>
-#include <vector>
-
-#include "webrtc/rtc_base/basictypes.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/location.h"
-#include "webrtc/rtc_base/messagehandler.h"
-#include "webrtc/rtc_base/scoped_ref_ptr.h"
-#include "webrtc/rtc_base/sigslot.h"
-#include "webrtc/rtc_base/socketserver.h"
-#include "webrtc/rtc_base/thread_annotations.h"
-#include "webrtc/rtc_base/timeutils.h"
-
-namespace rtc {
-
-struct Message;
-class MessageQueue;
-
-// MessageQueueManager does cleanup of of message queues
-
-class MessageQueueManager {
- public:
-  static void Add(MessageQueue *message_queue);
-  static void Remove(MessageQueue *message_queue);
-  static void Clear(MessageHandler *handler);
-
-  // For testing purposes, we expose whether or not the MessageQueueManager
-  // instance has been initialized. It has no other use relative to the rest of
-  // the functions of this class, which auto-initialize the underlying
-  // MessageQueueManager instance when necessary.
-  static bool IsInitialized();
-
-  // Mainly for testing purposes, for use with a simulated clock.
-  // Ensures that all message queues have processed delayed messages
-  // up until the current point in time.
-  static void ProcessAllMessageQueues();
-
- private:
-  static MessageQueueManager* Instance();
-
-  MessageQueueManager();
-  ~MessageQueueManager();
-
-  void AddInternal(MessageQueue *message_queue);
-  void RemoveInternal(MessageQueue *message_queue);
-  void ClearInternal(MessageHandler *handler);
-  void ProcessAllMessageQueuesInternal();
-
-  static MessageQueueManager* instance_;
-  // This list contains all live MessageQueues.
-  std::vector<MessageQueue*> message_queues_ RTC_GUARDED_BY(crit_);
-
-  // Methods that don't modify the list of message queues may be called in a
-  // re-entrant fashion. "processing_" keeps track of the depth of re-entrant
-  // calls.
-  CriticalSection crit_;
-  size_t processing_ RTC_GUARDED_BY(crit_);
-};
-
-// Derive from this for specialized data
-// App manages lifetime, except when messages are purged
-
-class MessageData {
- public:
-  MessageData() {}
-  virtual ~MessageData() {}
-};
-
-template <class T>
-class TypedMessageData : public MessageData {
- public:
-  explicit TypedMessageData(const T& data) : data_(data) { }
-  const T& data() const { return data_; }
-  T& data() { return data_; }
- private:
-  T data_;
-};
-
-// Like TypedMessageData, but for pointers that require a delete.
-template <class T>
-class ScopedMessageData : public MessageData {
- public:
-  explicit ScopedMessageData(std::unique_ptr<T> data)
-      : data_(std::move(data)) {}
-  // Deprecated.
-  // TODO(deadbeef): Remove this once downstream applications stop using it.
-  explicit ScopedMessageData(T* data) : data_(data) {}
-  // Deprecated.
-  // TODO(deadbeef): Returning a reference to a unique ptr? Why. Get rid of
-  // this once downstream applications stop using it, then rename inner_data to
-  // just data.
-  const std::unique_ptr<T>& data() const { return data_; }
-  std::unique_ptr<T>& data() { return data_; }
-
-  const T& inner_data() const { return *data_; }
-  T& inner_data() { return *data_; }
-
- private:
-  std::unique_ptr<T> data_;
-};
-
-// Like ScopedMessageData, but for reference counted pointers.
-template <class T>
-class ScopedRefMessageData : public MessageData {
- public:
-  explicit ScopedRefMessageData(T* data) : data_(data) { }
-  const scoped_refptr<T>& data() const { return data_; }
-  scoped_refptr<T>& data() { return data_; }
- private:
-  scoped_refptr<T> data_;
-};
-
-template<class T>
-inline MessageData* WrapMessageData(const T& data) {
-  return new TypedMessageData<T>(data);
-}
-
-template<class T>
-inline const T& UseMessageData(MessageData* data) {
-  return static_cast< TypedMessageData<T>* >(data)->data();
-}
-
-template<class T>
-class DisposeData : public MessageData {
- public:
-  explicit DisposeData(T* data) : data_(data) { }
-  virtual ~DisposeData() { delete data_; }
- private:
-  T* data_;
-};
-
-const uint32_t MQID_ANY = static_cast<uint32_t>(-1);
-const uint32_t MQID_DISPOSE = static_cast<uint32_t>(-2);
-
-// No destructor
-
-struct Message {
-  Message()
-      : phandler(nullptr), message_id(0), pdata(nullptr), ts_sensitive(0) {}
-  inline bool Match(MessageHandler* handler, uint32_t id) const {
-    return (handler == nullptr || handler == phandler) &&
-           (id == MQID_ANY || id == message_id);
-  }
-  Location posted_from;
-  MessageHandler *phandler;
-  uint32_t message_id;
-  MessageData *pdata;
-  int64_t ts_sensitive;
-};
-
-typedef std::list<Message> MessageList;
-
-// DelayedMessage goes into a priority queue, sorted by trigger time.  Messages
-// with the same trigger time are processed in num_ (FIFO) order.
-
-class DelayedMessage {
- public:
-  DelayedMessage(int64_t delay,
-                 int64_t trigger,
-                 uint32_t num,
-                 const Message& msg)
-      : cmsDelay_(delay), msTrigger_(trigger), num_(num), msg_(msg) {}
-
-  bool operator< (const DelayedMessage& dmsg) const {
-    return (dmsg.msTrigger_ < msTrigger_)
-           || ((dmsg.msTrigger_ == msTrigger_) && (dmsg.num_ < num_));
-  }
-
-  int64_t cmsDelay_;  // for debugging
-  int64_t msTrigger_;
-  uint32_t num_;
-  Message msg_;
-};
-
-class MessageQueue {
- public:
-  static const int kForever = -1;
-
-  // Create a new MessageQueue and optionally assign it to the passed
-  // SocketServer. Subclasses that override Clear should pass false for
-  // init_queue and call DoInit() from their constructor to prevent races
-  // with the MessageQueueManager using the object while the vtable is still
-  // being created.
-  MessageQueue(SocketServer* ss, bool init_queue);
-  MessageQueue(std::unique_ptr<SocketServer> ss, bool init_queue);
-
-  // NOTE: SUBCLASSES OF MessageQueue THAT OVERRIDE Clear MUST CALL
-  // DoDestroy() IN THEIR DESTRUCTORS! This is required to avoid a data race
-  // between the destructor modifying the vtable, and the MessageQueueManager
-  // calling Clear on the object from a different thread.
-  virtual ~MessageQueue();
-
-  SocketServer* socketserver();
-
-  // Note: The behavior of MessageQueue has changed.  When a MQ is stopped,
-  // futher Posts and Sends will fail.  However, any pending Sends and *ready*
-  // Posts (as opposed to unexpired delayed Posts) will be delivered before
-  // Get (or Peek) returns false.  By guaranteeing delivery of those messages,
-  // we eliminate the race condition when an MessageHandler and MessageQueue
-  // may be destroyed independently of each other.
-  virtual void Quit();
-  virtual bool IsQuitting();
-  virtual void Restart();
-  // Not all message queues actually process messages (such as SignalThread).
-  // In those cases, it's important to know, before posting, that it won't be
-  // Processed.  Normally, this would be true until IsQuitting() is true.
-  virtual bool IsProcessingMessages();
-
-  // Get() will process I/O until:
-  //  1) A message is available (returns true)
-  //  2) cmsWait seconds have elapsed (returns false)
-  //  3) Stop() is called (returns false)
-  virtual bool Get(Message *pmsg, int cmsWait = kForever,
-                   bool process_io = true);
-  virtual bool Peek(Message *pmsg, int cmsWait = 0);
-  virtual void Post(const Location& posted_from,
-                    MessageHandler* phandler,
-                    uint32_t id = 0,
-                    MessageData* pdata = nullptr,
-                    bool time_sensitive = false);
-  virtual void PostDelayed(const Location& posted_from,
-                           int cmsDelay,
-                           MessageHandler* phandler,
-                           uint32_t id = 0,
-                           MessageData* pdata = nullptr);
-  virtual void PostAt(const Location& posted_from,
-                      int64_t tstamp,
-                      MessageHandler* phandler,
-                      uint32_t id = 0,
-                      MessageData* pdata = nullptr);
-  // TODO(honghaiz): Remove this when all the dependencies are removed.
-  virtual void PostAt(const Location& posted_from,
-                      uint32_t tstamp,
-                      MessageHandler* phandler,
-                      uint32_t id = 0,
-                      MessageData* pdata = nullptr);
-  virtual void Clear(MessageHandler* phandler,
-                     uint32_t id = MQID_ANY,
-                     MessageList* removed = nullptr);
-  virtual void Dispatch(Message *pmsg);
-  virtual void ReceiveSends();
-
-  // Amount of time until the next message can be retrieved
-  virtual int GetDelay();
-
-  bool empty() const { return size() == 0u; }
-  size_t size() const {
-    CritScope cs(&crit_);  // msgq_.size() is not thread safe.
-    return msgq_.size() + dmsgq_.size() + (fPeekKeep_ ? 1u : 0u);
-  }
-
-  // Internally posts a message which causes the doomed object to be deleted
-  template<class T> void Dispose(T* doomed) {
-    if (doomed) {
-      Post(RTC_FROM_HERE, nullptr, MQID_DISPOSE, new DisposeData<T>(doomed));
-    }
-  }
-
-  // When this signal is sent out, any references to this queue should
-  // no longer be used.
-  sigslot::signal0<> SignalQueueDestroyed;
-
- protected:
-  class PriorityQueue : public std::priority_queue<DelayedMessage> {
-   public:
-    container_type& container() { return c; }
-    void reheap() { make_heap(c.begin(), c.end(), comp); }
-  };
-
-  void DoDelayPost(const Location& posted_from,
-                   int64_t cmsDelay,
-                   int64_t tstamp,
-                   MessageHandler* phandler,
-                   uint32_t id,
-                   MessageData* pdata);
-
-  // Perform initialization, subclasses must call this from their constructor
-  // if false was passed as init_queue to the MessageQueue constructor.
-  void DoInit();
-
-  // Perform cleanup, subclasses that override Clear must call this from the
-  // destructor.
-  void DoDestroy();
-
-  void WakeUpSocketServer();
-
-  bool fPeekKeep_;
-  Message msgPeek_;
-  MessageList msgq_ RTC_GUARDED_BY(crit_);
-  PriorityQueue dmsgq_ RTC_GUARDED_BY(crit_);
-  uint32_t dmsgq_next_num_ RTC_GUARDED_BY(crit_);
-  CriticalSection crit_;
-  bool fInitialized_;
-  bool fDestroyed_;
-
- private:
-  volatile int stop_;
-
-  // The SocketServer might not be owned by MessageQueue.
-  SocketServer* const ss_;
-  // Used if SocketServer ownership lies with |this|.
-  std::unique_ptr<SocketServer> own_ss_;
-
-  RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(MessageQueue);
-};
-
-}  // namespace rtc
-
-#endif  // WEBRTC_RTC_BASE_MESSAGEQUEUE_H_
diff --git a/rtc_base/messagequeue_unittest.cc b/rtc_base/messagequeue_unittest.cc
deleted file mode 100644
index 4003e2d..0000000
--- a/rtc_base/messagequeue_unittest.cc
+++ /dev/null
@@ -1,248 +0,0 @@
-/*
- *  Copyright 2004 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/rtc_base/messagequeue.h"
-
-#include <functional>
-
-#include "webrtc/rtc_base/atomicops.h"
-#include "webrtc/rtc_base/bind.h"
-#include "webrtc/rtc_base/event.h"
-#include "webrtc/rtc_base/gunit.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/nullsocketserver.h"
-#include "webrtc/rtc_base/refcount.h"
-#include "webrtc/rtc_base/refcountedobject.h"
-#include "webrtc/rtc_base/thread.h"
-#include "webrtc/rtc_base/timeutils.h"
-
-using namespace rtc;
-
-class MessageQueueTest: public testing::Test, public MessageQueue {
- public:
-  MessageQueueTest() : MessageQueue(SocketServer::CreateDefault(), true) {}
-  bool IsLocked_Worker() {
-    if (!crit_.TryEnter()) {
-      return true;
-    }
-    crit_.Leave();
-    return false;
-  }
-  bool IsLocked() {
-    // We have to do this on a worker thread, or else the TryEnter will
-    // succeed, since our critical sections are reentrant.
-    std::unique_ptr<Thread> worker(Thread::CreateWithSocketServer());
-    worker->Start();
-    return worker->Invoke<bool>(
-        RTC_FROM_HERE, rtc::Bind(&MessageQueueTest::IsLocked_Worker, this));
-  }
-};
-
-struct DeletedLockChecker {
-  DeletedLockChecker(MessageQueueTest* test, bool* was_locked, bool* deleted)
-      : test(test), was_locked(was_locked), deleted(deleted) { }
-  ~DeletedLockChecker() {
-    *deleted = true;
-    *was_locked = test->IsLocked();
-  }
-  MessageQueueTest* test;
-  bool* was_locked;
-  bool* deleted;
-};
-
-static void DelayedPostsWithIdenticalTimesAreProcessedInFifoOrder(
-    MessageQueue* q) {
-  EXPECT_TRUE(q != nullptr);
-  int64_t now = TimeMillis();
-  q->PostAt(RTC_FROM_HERE, now, nullptr, 3);
-  q->PostAt(RTC_FROM_HERE, now - 2, nullptr, 0);
-  q->PostAt(RTC_FROM_HERE, now - 1, nullptr, 1);
-  q->PostAt(RTC_FROM_HERE, now, nullptr, 4);
-  q->PostAt(RTC_FROM_HERE, now - 1, nullptr, 2);
-
-  Message msg;
-  for (size_t i=0; i<5; ++i) {
-    memset(&msg, 0, sizeof(msg));
-    EXPECT_TRUE(q->Get(&msg, 0));
-    EXPECT_EQ(i, msg.message_id);
-  }
-
-  EXPECT_FALSE(q->Get(&msg, 0));  // No more messages
-}
-
-TEST_F(MessageQueueTest,
-       DelayedPostsWithIdenticalTimesAreProcessedInFifoOrder) {
-  MessageQueue q(SocketServer::CreateDefault(), true);
-  DelayedPostsWithIdenticalTimesAreProcessedInFifoOrder(&q);
-
-  NullSocketServer nullss;
-  MessageQueue q_nullss(&nullss, true);
-  DelayedPostsWithIdenticalTimesAreProcessedInFifoOrder(&q_nullss);
-}
-
-TEST_F(MessageQueueTest, DisposeNotLocked) {
-  bool was_locked = true;
-  bool deleted = false;
-  DeletedLockChecker* d = new DeletedLockChecker(this, &was_locked, &deleted);
-  Dispose(d);
-  Message msg;
-  EXPECT_FALSE(Get(&msg, 0));
-  EXPECT_TRUE(deleted);
-  EXPECT_FALSE(was_locked);
-}
-
-class DeletedMessageHandler : public MessageHandler {
- public:
-  explicit DeletedMessageHandler(bool* deleted) : deleted_(deleted) { }
-  ~DeletedMessageHandler() {
-    *deleted_ = true;
-  }
-  void OnMessage(Message* msg) { }
- private:
-  bool* deleted_;
-};
-
-TEST_F(MessageQueueTest, DiposeHandlerWithPostedMessagePending) {
-  bool deleted = false;
-  DeletedMessageHandler *handler = new DeletedMessageHandler(&deleted);
-  // First, post a dispose.
-  Dispose(handler);
-  // Now, post a message, which should *not* be returned by Get().
-  Post(RTC_FROM_HERE, handler, 1);
-  Message msg;
-  EXPECT_FALSE(Get(&msg, 0));
-  EXPECT_TRUE(deleted);
-}
-
-struct UnwrapMainThreadScope {
-  UnwrapMainThreadScope() : rewrap_(Thread::Current() != nullptr) {
-    if (rewrap_) ThreadManager::Instance()->UnwrapCurrentThread();
-  }
-  ~UnwrapMainThreadScope() {
-    if (rewrap_) ThreadManager::Instance()->WrapCurrentThread();
-  }
- private:
-  bool rewrap_;
-};
-
-TEST(MessageQueueManager, Clear) {
-  UnwrapMainThreadScope s;
-  if (MessageQueueManager::IsInitialized()) {
-    LOG(LS_INFO) << "Unable to run MessageQueueManager::Clear test, since the "
-                 << "MessageQueueManager was already initialized by some "
-                 << "other test in this run.";
-    return;
-  }
-  bool deleted = false;
-  DeletedMessageHandler* handler = new DeletedMessageHandler(&deleted);
-  delete handler;
-  EXPECT_TRUE(deleted);
-  EXPECT_FALSE(MessageQueueManager::IsInitialized());
-}
-
-// Ensure that ProcessAllMessageQueues does its essential function; process
-// all messages (both delayed and non delayed) up until the current time, on
-// all registered message queues.
-TEST(MessageQueueManager, ProcessAllMessageQueues) {
-  Event entered_process_all_message_queues(true, false);
-  auto a = Thread::CreateWithSocketServer();
-  auto b = Thread::CreateWithSocketServer();
-  a->Start();
-  b->Start();
-
-  volatile int messages_processed = 0;
-  FunctorMessageHandler<void, std::function<void()>> incrementer(
-      [&messages_processed, &entered_process_all_message_queues] {
-        // Wait for event as a means to ensure Increment doesn't occur outside
-        // of ProcessAllMessageQueues. The event is set by a message posted to
-        // the main thread, which is guaranteed to be handled inside
-        // ProcessAllMessageQueues.
-        entered_process_all_message_queues.Wait(Event::kForever);
-        AtomicOps::Increment(&messages_processed);
-      });
-  FunctorMessageHandler<void, std::function<void()>> event_signaler(
-      [&entered_process_all_message_queues] {
-        entered_process_all_message_queues.Set();
-      });
-
-  // Post messages (both delayed and non delayed) to both threads.
-  a->Post(RTC_FROM_HERE, &incrementer);
-  b->Post(RTC_FROM_HERE, &incrementer);
-  a->PostDelayed(RTC_FROM_HERE, 0, &incrementer);
-  b->PostDelayed(RTC_FROM_HERE, 0, &incrementer);
-  rtc::Thread::Current()->Post(RTC_FROM_HERE, &event_signaler);
-
-  MessageQueueManager::ProcessAllMessageQueues();
-  EXPECT_EQ(4, AtomicOps::AcquireLoad(&messages_processed));
-}
-
-// Test that ProcessAllMessageQueues doesn't hang if a thread is quitting.
-TEST(MessageQueueManager, ProcessAllMessageQueuesWithQuittingThread) {
-  auto t = Thread::CreateWithSocketServer();
-  t->Start();
-  t->Quit();
-  MessageQueueManager::ProcessAllMessageQueues();
-}
-
-// Test that ProcessAllMessageQueues doesn't hang if a queue clears its
-// messages.
-TEST(MessageQueueManager, ProcessAllMessageQueuesWithClearedQueue) {
-  Event entered_process_all_message_queues(true, false);
-  auto t = Thread::CreateWithSocketServer();
-  t->Start();
-
-  FunctorMessageHandler<void, std::function<void()>> clearer(
-      [&entered_process_all_message_queues] {
-        // Wait for event as a means to ensure Clear doesn't occur outside of
-        // ProcessAllMessageQueues. The event is set by a message posted to the
-        // main thread, which is guaranteed to be handled inside
-        // ProcessAllMessageQueues.
-        entered_process_all_message_queues.Wait(Event::kForever);
-        rtc::Thread::Current()->Clear(nullptr);
-      });
-  FunctorMessageHandler<void, std::function<void()>> event_signaler(
-      [&entered_process_all_message_queues] {
-        entered_process_all_message_queues.Set();
-      });
-
-  // Post messages (both delayed and non delayed) to both threads.
-  t->Post(RTC_FROM_HERE, &clearer);
-  rtc::Thread::Current()->Post(RTC_FROM_HERE, &event_signaler);
-  MessageQueueManager::ProcessAllMessageQueues();
-}
-
-class RefCountedHandler
-  : public MessageHandler,
-    public rtc::RefCountInterface {
- public:
-  void OnMessage(Message* msg) override {}
-};
-
-class EmptyHandler : public MessageHandler {
- public:
-  void OnMessage(Message* msg) override {}
-};
-
-TEST(MessageQueueManager, ClearReentrant) {
-  std::unique_ptr<Thread> t(Thread::Create());
-  EmptyHandler handler;
-  RefCountedHandler* inner_handler(
-      new rtc::RefCountedObject<RefCountedHandler>());
-  // When the empty handler is destroyed, it will clear messages queued for
-  // itself. The message to be cleared itself wraps a MessageHandler object
-  // (RefCountedHandler) so this will cause the message queue to be cleared
-  // again in a re-entrant fashion, which previously triggered a DCHECK.
-  // The inner handler will be removed in a re-entrant fashion from the
-  // message queue of the thread while the outer handler is removed, verifying
-  // that the iterator is not invalidated in "MessageQueue::Clear".
-  t->Post(RTC_FROM_HERE, inner_handler, 0);
-  t->Post(RTC_FROM_HERE, &handler, 0,
-          new ScopedRefMessageData<RefCountedHandler>(inner_handler));
-}
diff --git a/rtc_base/mod_ops.h b/rtc_base/mod_ops.h
deleted file mode 100644
index f8cb951..0000000
--- a/rtc_base/mod_ops.h
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- *  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_RTC_BASE_MOD_OPS_H_
-#define WEBRTC_RTC_BASE_MOD_OPS_H_
-
-#include <limits>
-#include <type_traits>
-
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-
-template <unsigned long M>                                    // NOLINT
-inline unsigned long Add(unsigned long a, unsigned long b) {  // NOLINT
-  RTC_DCHECK_LT(a, M);
-  unsigned long t = M - b % M;  // NOLINT
-  unsigned long res = a - t;    // NOLINT
-  if (t > a)
-    return res + M;
-  return res;
-}
-
-template <unsigned long M>                                         // NOLINT
-inline unsigned long Subtract(unsigned long a, unsigned long b) {  // NOLINT
-  RTC_DCHECK_LT(a, M);
-  unsigned long sub = b % M;  // NOLINT
-  if (a < sub)
-    return M - (sub - a);
-  return a - sub;
-}
-
-// Calculates the forward difference between two wrapping numbers.
-//
-// Example:
-// uint8_t x = 253;
-// uint8_t y = 2;
-//
-// ForwardDiff(x, y) == 5
-//
-//   252   253   254   255    0     1     2     3
-// #################################################
-// |     |  x  |     |     |     |     |  y  |     |
-// #################################################
-//          |----->----->----->----->----->
-//
-// ForwardDiff(y, x) == 251
-//
-//   252   253   254   255    0     1     2     3
-// #################################################
-// |     |  x  |     |     |     |     |  y  |     |
-// #################################################
-// -->----->                              |----->---
-//
-// If M > 0 then wrapping occurs at M, if M == 0 then wrapping occurs at the
-// largest value representable by T.
-template <typename T, T M>
-inline typename std::enable_if<(M > 0), T>::type ForwardDiff(T a, T b) {
-  static_assert(std::is_unsigned<T>::value,
-                "Type must be an unsigned integer.");
-  RTC_DCHECK_LT(a, M);
-  RTC_DCHECK_LT(b, M);
-  return a <= b ? b - a : M - (a - b);
-}
-
-template <typename T, T M>
-inline typename std::enable_if<(M == 0), T>::type ForwardDiff(T a, T b) {
-  static_assert(std::is_unsigned<T>::value,
-                "Type must be an unsigned integer.");
-  return b - a;
-}
-
-template <typename T>
-inline T ForwardDiff(T a, T b) {
-  return ForwardDiff<T, 0>(a, b);
-}
-
-// Calculates the reverse difference between two wrapping numbers.
-//
-// Example:
-// uint8_t x = 253;
-// uint8_t y = 2;
-//
-// ReverseDiff(y, x) == 5
-//
-//   252   253   254   255    0     1     2     3
-// #################################################
-// |     |  x  |     |     |     |     |  y  |     |
-// #################################################
-//          <-----<-----<-----<-----<-----|
-//
-// ReverseDiff(x, y) == 251
-//
-//   252   253   254   255    0     1     2     3
-// #################################################
-// |     |  x  |     |     |     |     |  y  |     |
-// #################################################
-// ---<-----|                             |<-----<--
-//
-// If M > 0 then wrapping occurs at M, if M == 0 then wrapping occurs at the
-// largest value representable by T.
-template <typename T, T M>
-inline typename std::enable_if<(M > 0), T>::type ReverseDiff(T a, T b) {
-  static_assert(std::is_unsigned<T>::value,
-                "Type must be an unsigned integer.");
-  RTC_DCHECK_LT(a, M);
-  RTC_DCHECK_LT(b, M);
-  return b <= a ? a - b : M - (b - a);
-}
-
-template <typename T, T M>
-inline typename std::enable_if<(M == 0), T>::type ReverseDiff(T a, T b) {
-  static_assert(std::is_unsigned<T>::value,
-                "Type must be an unsigned integer.");
-  return a - b;
-}
-
-template <typename T>
-inline T ReverseDiff(T a, T b) {
-  return ReverseDiff<T, 0>(a, b);
-}
-
-// Calculates the minimum distance between to wrapping numbers.
-//
-// The minimum distance is defined as min(ForwardDiff(a, b), ReverseDiff(a, b))
-template <typename T, T M = 0>
-inline T MinDiff(T a, T b) {
-  static_assert(std::is_unsigned<T>::value,
-                "Type must be an unsigned integer.");
-  return std::min(ForwardDiff<T, M>(a, b), ReverseDiff<T, M>(a, b));
-}
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_RTC_BASE_MOD_OPS_H_
diff --git a/rtc_base/mod_ops_unittest.cc b/rtc_base/mod_ops_unittest.cc
deleted file mode 100644
index d39ea06..0000000
--- a/rtc_base/mod_ops_unittest.cc
+++ /dev/null
@@ -1,156 +0,0 @@
-/*
- *  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/rtc_base/mod_ops.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-class TestModOps : public ::testing::Test {
- protected:
-  // Can't use std::numeric_limits<unsigned long>::max() since
-  // MSVC doesn't support constexpr.
-  static const unsigned long ulmax = ~0ul;  // NOLINT
-};
-
-TEST_F(TestModOps, Add) {
-  const int D = 100;
-  ASSERT_EQ(1u, Add<D>(0, 1));
-  ASSERT_EQ(0u, Add<D>(0, D));
-  for (int i = 0; i < D; ++i)
-    ASSERT_EQ(0u, Add<D>(i, D - i));
-
-  int t = 37;
-  uint8_t a = t;
-  for (int i = 0; i < 256; ++i) {
-    ASSERT_EQ(a, static_cast<uint8_t>(t));
-    t = Add<256>(t, 1);
-    ++a;
-  }
-}
-
-TEST_F(TestModOps, AddLarge) {
-  const unsigned long D = ulmax - 10ul;  // NOLINT
-  unsigned long l = D - 1ul;             // NOLINT
-  ASSERT_EQ(D - 2ul, Add<D>(l, l));
-  ASSERT_EQ(9ul, Add<D>(l, ulmax));
-  ASSERT_EQ(10ul, Add<D>(0ul, ulmax));
-}
-
-TEST_F(TestModOps, Subtract) {
-  const int D = 100;
-  ASSERT_EQ(99u, Subtract<D>(0, 1));
-  ASSERT_EQ(0u, Subtract<D>(0, D));
-  for (int i = 0; i < D; ++i)
-    ASSERT_EQ(0u, Subtract<D>(i, D + i));
-
-  int t = 37;
-  uint8_t a = t;
-  for (int i = 0; i < 256; ++i) {
-    ASSERT_EQ(a, static_cast<uint8_t>(t));
-    t = Subtract<256>(t, 1);
-    --a;
-  }
-}
-
-TEST_F(TestModOps, SubtractLarge) {
-  // NOLINTNEXTLINE
-  const unsigned long D = ulmax - 10ul;  // NOLINT
-  unsigned long l = D - 1ul;             // NOLINT
-  ASSERT_EQ(0ul, Subtract<D>(l, l));
-  ASSERT_EQ(D - 11ul, Subtract<D>(l, ulmax));
-  ASSERT_EQ(D - 10ul, Subtract<D>(0ul, ulmax));
-}
-
-TEST_F(TestModOps, ForwardDiff) {
-  ASSERT_EQ(0u, ForwardDiff(4711u, 4711u));
-
-  uint8_t x = 0;
-  uint8_t y = 255;
-  for (int i = 0; i < 256; ++i) {
-    ASSERT_EQ(255u, ForwardDiff(x, y));
-    ++x;
-    ++y;
-  }
-
-  int yi = 255;
-  for (int i = 0; i < 256; ++i) {
-    ASSERT_EQ(255u, ForwardDiff<uint8_t>(x, yi));
-    ++x;
-    ++yi;
-  }
-}
-
-TEST_F(TestModOps, ForwardDiffWithDivisor) {
-  ASSERT_EQ(122, (ForwardDiff<uint8_t, 123>(0, 122)));
-  ASSERT_EQ(0, (ForwardDiff<uint8_t, 123>(122, 122)));
-  ASSERT_EQ(122, (ForwardDiff<uint8_t, 123>(1, 0)));
-  ASSERT_EQ(0, (ForwardDiff<uint8_t, 123>(0, 0)));
-  ASSERT_EQ(1, (ForwardDiff<uint8_t, 123>(122, 0)));
-}
-
-TEST_F(TestModOps, ReverseDiff) {
-  ASSERT_EQ(0u, ReverseDiff(4711u, 4711u));
-
-  uint8_t x = 0;
-  uint8_t y = 255;
-  for (int i = 0; i < 256; ++i) {
-    ASSERT_EQ(1u, ReverseDiff(x, y));
-    ++x;
-    ++y;
-  }
-
-  int yi = 255;
-  for (int i = 0; i < 256; ++i) {
-    ASSERT_EQ(1u, ReverseDiff<uint8_t>(x, yi));
-    ++x;
-    ++yi;
-  }
-}
-
-TEST_F(TestModOps, ReverseDiffWithDivisor) {
-  ASSERT_EQ(1, (ReverseDiff<uint8_t, 123>(0, 122)));
-  ASSERT_EQ(0, (ReverseDiff<uint8_t, 123>(122, 122)));
-  ASSERT_EQ(1, (ReverseDiff<uint8_t, 123>(1, 0)));
-  ASSERT_EQ(0, (ReverseDiff<uint8_t, 123>(0, 0)));
-  ASSERT_EQ(122, (ReverseDiff<uint8_t, 123>(122, 0)));
-}
-
-TEST_F(TestModOps, MinDiff) {
-  for (uint16_t i = 0; i < 256; ++i) {
-    ASSERT_EQ(0, MinDiff<uint8_t>(i, i));
-    ASSERT_EQ(1, MinDiff<uint8_t>(i - 1, i));
-    ASSERT_EQ(1, MinDiff<uint8_t>(i + 1, i));
-  }
-
-  for (uint8_t i = 0; i < 128; ++i)
-    ASSERT_EQ(i, MinDiff<uint8_t>(0, i));
-
-  for (uint8_t i = 0; i < 128; ++i)
-    ASSERT_EQ(128 - i, MinDiff<uint8_t>(0, 128 + i));
-}
-
-TEST_F(TestModOps, MinDiffWitDivisor) {
-  ASSERT_EQ(5u, (MinDiff<uint8_t, 11>(0, 5)));
-  ASSERT_EQ(5u, (MinDiff<uint8_t, 11>(0, 6)));
-  ASSERT_EQ(5u, (MinDiff<uint8_t, 11>(5, 0)));
-  ASSERT_EQ(5u, (MinDiff<uint8_t, 11>(6, 0)));
-
-  const uint16_t D = 4711;
-
-  for (uint16_t i = 0; i < D / 2; ++i)
-    ASSERT_EQ(i, (MinDiff<uint16_t, D>(0, i)));
-
-  ASSERT_EQ(D / 2, (MinDiff<uint16_t, D>(0, D / 2)));
-
-  for (uint16_t i = 0; i < D / 2; ++i)
-    ASSERT_EQ(D / 2 - i, (MinDiff<uint16_t, D>(0, D / 2 - i)));
-}
-
-}  // namespace webrtc
diff --git a/rtc_base/moving_max_counter.h b/rtc_base/moving_max_counter.h
deleted file mode 100644
index 190b7b8..0000000
--- a/rtc_base/moving_max_counter.h
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- *  Copyright (c) 2017 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_RTC_BASE_MOVING_MAX_COUNTER_H_
-#define WEBRTC_RTC_BASE_MOVING_MAX_COUNTER_H_
-
-#include <stdint.h>
-
-#include <deque>
-#include <limits>
-#include <utility>
-
-#include "webrtc/api/optional.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace rtc {
-
-// Implements moving max: can add samples to it and calculate maximum over some
-// fixed moving window.
-//
-// Window size is configured at constructor.
-// Samples can be added with |Add()| and max over current window is returned by
-// |MovingMax|. |current_time_ms| in successive calls to Add and MovingMax
-// should never decrease as if it's a wallclock time.
-template <class T>
-class MovingMaxCounter {
- public:
-  explicit MovingMaxCounter(int64_t window_length_ms);
-  // Advances the current time, and adds a new sample. The new current time must
-  // be at least as large as the old current time.
-  void Add(const T& sample, int64_t current_time_ms);
-  // Advances the current time, and returns the maximum sample in the time
-  // window ending at the current time. The new current time must be at least as
-  // large as the old current time.
-  rtc::Optional<T> Max(int64_t current_time_ms);
-  void Reset();
-
- private:
-  // Throws out obsolete samples.
-  void RollWindow(int64_t new_time_ms);
-  const int64_t window_length_ms_;
-  // This deque stores (timestamp, sample) pairs in chronological order; new
-  // pairs are only ever added at the end. However, because they can't affect
-  // the Max() calculation, pairs older than window_length_ms_ are discarded,
-  // and if an older pair has a sample that's smaller than that of a younger
-  // pair, the older pair is discarded. As a result, the sequence of timestamps
-  // is strictly increasing, and the sequence of samples is strictly decreasing.
-  std::deque<std::pair<int64_t, T>> samples_;
-#if RTC_DCHECK_IS_ON
-  int64_t last_call_time_ms_ = std::numeric_limits<int64_t>::min();
-#endif
-  RTC_DISALLOW_COPY_AND_ASSIGN(MovingMaxCounter);
-};
-
-template <class T>
-MovingMaxCounter<T>::MovingMaxCounter(int64_t window_length_ms)
-    : window_length_ms_(window_length_ms) {}
-
-template <class T>
-void MovingMaxCounter<T>::Add(const T& sample, int64_t current_time_ms) {
-  RollWindow(current_time_ms);
-  // Remove samples that will never be maximum in any window: newly added sample
-  // will always be in all windows the previous samples are. Thus, smaller or
-  // equal samples could be removed. This will maintain the invariant - deque
-  // contains strictly decreasing sequence of values.
-  while (!samples_.empty() && samples_.back().second <= sample) {
-    samples_.pop_back();
-  }
-  // Add the new sample but only if there's no existing sample at the same time.
-  // Due to checks above, the already existing element will be larger, so the
-  // new sample will never be the maximum in any window.
-  if (samples_.empty() || samples_.back().first < current_time_ms) {
-    samples_.emplace_back(std::make_pair(current_time_ms, sample));
-  }
-}
-
-template <class T>
-rtc::Optional<T> MovingMaxCounter<T>::Max(int64_t current_time_ms) {
-  RollWindow(current_time_ms);
-  rtc::Optional<T> res;
-  if (!samples_.empty()) {
-    res.emplace(samples_.front().second);
-  }
-  return res;
-}
-
-template <class T>
-void MovingMaxCounter<T>::Reset() {
-  samples_.clear();
-}
-
-template <class T>
-void MovingMaxCounter<T>::RollWindow(int64_t new_time_ms) {
-#if RTC_DCHECK_IS_ON
-  RTC_DCHECK_GE(new_time_ms, last_call_time_ms_);
-  last_call_time_ms_ = new_time_ms;
-#endif
-  const int64_t window_begin_ms = new_time_ms - window_length_ms_;
-  auto it = samples_.begin();
-  while (it != samples_.end() && it->first < window_begin_ms) {
-    ++it;
-  }
-  samples_.erase(samples_.begin(), it);
-}
-
-}  // namespace rtc
-
-#endif  // WEBRTC_RTC_BASE_MOVING_MAX_COUNTER_H_
diff --git a/rtc_base/moving_max_counter_unittest.cc b/rtc_base/moving_max_counter_unittest.cc
deleted file mode 100644
index 54dbe7e..0000000
--- a/rtc_base/moving_max_counter_unittest.cc
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- *  Copyright (c) 2017 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/rtc_base/moving_max_counter.h"
-#include "webrtc/test/gtest.h"
-
-TEST(MovingMaxCounter, ReportsMaximumInTheWindow) {
-  rtc::MovingMaxCounter<int> counter(100);
-  counter.Add(1, 1);
-  EXPECT_EQ(counter.Max(1), rtc::Optional<int>(1));
-  counter.Add(2, 30);
-  EXPECT_EQ(counter.Max(30), rtc::Optional<int>(2));
-  counter.Add(100, 60);
-  EXPECT_EQ(counter.Max(60), rtc::Optional<int>(100));
-  counter.Add(4, 70);
-  EXPECT_EQ(counter.Max(70), rtc::Optional<int>(100));
-  counter.Add(5, 90);
-  EXPECT_EQ(counter.Max(90), rtc::Optional<int>(100));
-}
-
-TEST(MovingMaxCounter, IgnoresOldElements) {
-  rtc::MovingMaxCounter<int> counter(100);
-  counter.Add(1, 1);
-  counter.Add(2, 30);
-  counter.Add(100, 60);
-  counter.Add(4, 70);
-  counter.Add(5, 90);
-  EXPECT_EQ(counter.Max(160), rtc::Optional<int>(100));
-  // 100 is now out of the window. Next maximum is 5.
-  EXPECT_EQ(counter.Max(161), rtc::Optional<int>(5));
-}
-
-TEST(MovingMaxCounter, HandlesEmptyWindow) {
-  rtc::MovingMaxCounter<int> counter(100);
-  counter.Add(123, 1);
-  EXPECT_TRUE(counter.Max(101).has_value());
-  EXPECT_FALSE(counter.Max(102).has_value());
-}
-
-TEST(MovingMaxCounter, HandlesSamplesWithEqualTimestamps) {
-  rtc::MovingMaxCounter<int> counter(100);
-  counter.Add(2, 30);
-  EXPECT_EQ(counter.Max(30), rtc::Optional<int>(2));
-  counter.Add(5, 30);
-  EXPECT_EQ(counter.Max(30), rtc::Optional<int>(5));
-  counter.Add(4, 30);
-  EXPECT_EQ(counter.Max(30), rtc::Optional<int>(5));
-  counter.Add(1, 90);
-  EXPECT_EQ(counter.Max(150), rtc::Optional<int>(1));
-}
diff --git a/rtc_base/nat_unittest.cc b/rtc_base/nat_unittest.cc
deleted file mode 100644
index 7454028..0000000
--- a/rtc_base/nat_unittest.cc
+++ /dev/null
@@ -1,389 +0,0 @@
-/*
- *  Copyright 2004 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 <algorithm>
-#include <memory>
-#include <string>
-
-#include "webrtc/rtc_base/asynctcpsocket.h"
-#include "webrtc/rtc_base/gunit.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/natserver.h"
-#include "webrtc/rtc_base/natsocketfactory.h"
-#include "webrtc/rtc_base/nethelpers.h"
-#include "webrtc/rtc_base/network.h"
-#include "webrtc/rtc_base/physicalsocketserver.h"
-#include "webrtc/rtc_base/ptr_util.h"
-#include "webrtc/rtc_base/testclient.h"
-#include "webrtc/rtc_base/virtualsocketserver.h"
-
-using namespace rtc;
-
-bool CheckReceive(
-    TestClient* client, bool should_receive, const char* buf, size_t size) {
-  return (should_receive) ?
-      client->CheckNextPacket(buf, size, 0) :
-      client->CheckNoPacket();
-}
-
-TestClient* CreateTestClient(
-      SocketFactory* factory, const SocketAddress& local_addr) {
-  return new TestClient(
-      WrapUnique(AsyncUDPSocket::Create(factory, local_addr)));
-}
-
-TestClient* CreateTCPTestClient(AsyncSocket* socket) {
-  return new TestClient(MakeUnique<AsyncTCPSocket>(socket, false));
-}
-
-// Tests that when sending from internal_addr to external_addrs through the
-// NAT type specified by nat_type, all external addrs receive the sent packet
-// and, if exp_same is true, all use the same mapped-address on the NAT.
-void TestSend(
-      SocketServer* internal, const SocketAddress& internal_addr,
-      SocketServer* external, const SocketAddress external_addrs[4],
-      NATType nat_type, bool exp_same) {
-  Thread th_int(internal);
-  Thread th_ext(external);
-
-  SocketAddress server_addr = internal_addr;
-  server_addr.SetPort(0);  // Auto-select a port
-  NATServer* nat = new NATServer(nat_type, internal, server_addr, server_addr,
-                                 external, external_addrs[0]);
-  NATSocketFactory* natsf = new NATSocketFactory(internal,
-                                                 nat->internal_udp_address(),
-                                                 nat->internal_tcp_address());
-
-  TestClient* in = CreateTestClient(natsf, internal_addr);
-  TestClient* out[4];
-  for (int i = 0; i < 4; i++)
-    out[i] = CreateTestClient(external, external_addrs[i]);
-
-  th_int.Start();
-  th_ext.Start();
-
-  const char* buf = "filter_test";
-  size_t len = strlen(buf);
-
-  in->SendTo(buf, len, out[0]->address());
-  SocketAddress trans_addr;
-  EXPECT_TRUE(out[0]->CheckNextPacket(buf, len, &trans_addr));
-
-  for (int i = 1; i < 4; i++) {
-    in->SendTo(buf, len, out[i]->address());
-    SocketAddress trans_addr2;
-    EXPECT_TRUE(out[i]->CheckNextPacket(buf, len, &trans_addr2));
-    bool are_same = (trans_addr == trans_addr2);
-    ASSERT_EQ(are_same, exp_same) << "same translated address";
-    ASSERT_NE(AF_UNSPEC, trans_addr.family());
-    ASSERT_NE(AF_UNSPEC, trans_addr2.family());
-  }
-
-  th_int.Stop();
-  th_ext.Stop();
-
-  delete nat;
-  delete natsf;
-  delete in;
-  for (int i = 0; i < 4; i++)
-    delete out[i];
-}
-
-// Tests that when sending from external_addrs to internal_addr, the packet
-// is delivered according to the specified filter_ip and filter_port rules.
-void TestRecv(
-      SocketServer* internal, const SocketAddress& internal_addr,
-      SocketServer* external, const SocketAddress external_addrs[4],
-      NATType nat_type, bool filter_ip, bool filter_port) {
-  Thread th_int(internal);
-  Thread th_ext(external);
-
-  SocketAddress server_addr = internal_addr;
-  server_addr.SetPort(0);  // Auto-select a port
-  NATServer* nat = new NATServer(nat_type, internal, server_addr, server_addr,
-                                 external, external_addrs[0]);
-  NATSocketFactory* natsf = new NATSocketFactory(internal,
-                                                 nat->internal_udp_address(),
-                                                 nat->internal_tcp_address());
-
-  TestClient* in = CreateTestClient(natsf, internal_addr);
-  TestClient* out[4];
-  for (int i = 0; i < 4; i++)
-    out[i] = CreateTestClient(external, external_addrs[i]);
-
-  th_int.Start();
-  th_ext.Start();
-
-  const char* buf = "filter_test";
-  size_t len = strlen(buf);
-
-  in->SendTo(buf, len, out[0]->address());
-  SocketAddress trans_addr;
-  EXPECT_TRUE(out[0]->CheckNextPacket(buf, len, &trans_addr));
-
-  out[1]->SendTo(buf, len, trans_addr);
-  EXPECT_TRUE(CheckReceive(in, !filter_ip, buf, len));
-
-  out[2]->SendTo(buf, len, trans_addr);
-  EXPECT_TRUE(CheckReceive(in, !filter_port, buf, len));
-
-  out[3]->SendTo(buf, len, trans_addr);
-  EXPECT_TRUE(CheckReceive(in, !filter_ip && !filter_port, buf, len));
-
-  th_int.Stop();
-  th_ext.Stop();
-
-  delete nat;
-  delete natsf;
-  delete in;
-  for (int i = 0; i < 4; i++)
-    delete out[i];
-}
-
-// Tests that NATServer allocates bindings properly.
-void TestBindings(
-    SocketServer* internal, const SocketAddress& internal_addr,
-    SocketServer* external, const SocketAddress external_addrs[4]) {
-  TestSend(internal, internal_addr, external, external_addrs,
-           NAT_OPEN_CONE, true);
-  TestSend(internal, internal_addr, external, external_addrs,
-           NAT_ADDR_RESTRICTED, true);
-  TestSend(internal, internal_addr, external, external_addrs,
-           NAT_PORT_RESTRICTED, true);
-  TestSend(internal, internal_addr, external, external_addrs,
-           NAT_SYMMETRIC, false);
-}
-
-// Tests that NATServer filters packets properly.
-void TestFilters(
-    SocketServer* internal, const SocketAddress& internal_addr,
-    SocketServer* external, const SocketAddress external_addrs[4]) {
-  TestRecv(internal, internal_addr, external, external_addrs,
-           NAT_OPEN_CONE, false, false);
-  TestRecv(internal, internal_addr, external, external_addrs,
-           NAT_ADDR_RESTRICTED, true, false);
-  TestRecv(internal, internal_addr, external, external_addrs,
-           NAT_PORT_RESTRICTED, true, true);
-  TestRecv(internal, internal_addr, external, external_addrs,
-           NAT_SYMMETRIC, true, true);
-}
-
-bool TestConnectivity(const SocketAddress& src, const IPAddress& dst) {
-  // The physical NAT tests require connectivity to the selected ip from the
-  // internal address used for the NAT. Things like firewalls can break that, so
-  // check to see if it's worth even trying with this ip.
-  std::unique_ptr<PhysicalSocketServer> pss(new PhysicalSocketServer());
-  std::unique_ptr<AsyncSocket> client(
-      pss->CreateAsyncSocket(src.family(), SOCK_DGRAM));
-  std::unique_ptr<AsyncSocket> server(
-      pss->CreateAsyncSocket(src.family(), SOCK_DGRAM));
-  if (client->Bind(SocketAddress(src.ipaddr(), 0)) != 0 ||
-      server->Bind(SocketAddress(dst, 0)) != 0) {
-    return false;
-  }
-  const char* buf = "hello other socket";
-  size_t len = strlen(buf);
-  int sent = client->SendTo(buf, len, server->GetLocalAddress());
-  SocketAddress addr;
-  const size_t kRecvBufSize = 64;
-  char recvbuf[kRecvBufSize];
-  Thread::Current()->SleepMs(100);
-  int received = server->RecvFrom(recvbuf, kRecvBufSize, &addr, nullptr);
-  return received == sent && ::memcmp(buf, recvbuf, len) == 0;
-}
-
-void TestPhysicalInternal(const SocketAddress& int_addr) {
-  BasicNetworkManager network_manager;
-  network_manager.set_ipv6_enabled(true);
-  network_manager.StartUpdating();
-  // Process pending messages so the network list is updated.
-  Thread::Current()->ProcessMessages(0);
-
-  std::vector<Network*> networks;
-  network_manager.GetNetworks(&networks);
-  networks.erase(std::remove_if(networks.begin(), networks.end(),
-                                [](rtc::Network* network) {
-                                  return rtc::kDefaultNetworkIgnoreMask &
-                                         network->type();
-                                }),
-                 networks.end());
-  if (networks.empty()) {
-    LOG(LS_WARNING) << "Not enough network adapters for test.";
-    return;
-  }
-
-  SocketAddress ext_addr1(int_addr);
-  SocketAddress ext_addr2;
-  // Find an available IP with matching family. The test breaks if int_addr
-  // can't talk to ip, so check for connectivity as well.
-  for (std::vector<Network*>::iterator it = networks.begin();
-      it != networks.end(); ++it) {
-    const IPAddress& ip = (*it)->GetBestIP();
-    if (ip.family() == int_addr.family() && TestConnectivity(int_addr, ip)) {
-      ext_addr2.SetIP(ip);
-      break;
-    }
-  }
-  if (ext_addr2.IsNil()) {
-    LOG(LS_WARNING) << "No available IP of same family as " << int_addr;
-    return;
-  }
-
-  LOG(LS_INFO) << "selected ip " << ext_addr2.ipaddr();
-
-  SocketAddress ext_addrs[4] = {
-      SocketAddress(ext_addr1),
-      SocketAddress(ext_addr2),
-      SocketAddress(ext_addr1),
-      SocketAddress(ext_addr2)
-  };
-
-  std::unique_ptr<PhysicalSocketServer> int_pss(new PhysicalSocketServer());
-  std::unique_ptr<PhysicalSocketServer> ext_pss(new PhysicalSocketServer());
-
-  TestBindings(int_pss.get(), int_addr, ext_pss.get(), ext_addrs);
-  TestFilters(int_pss.get(), int_addr, ext_pss.get(), ext_addrs);
-}
-
-TEST(NatTest, TestPhysicalIPv4) {
-  TestPhysicalInternal(SocketAddress("127.0.0.1", 0));
-}
-
-TEST(NatTest, TestPhysicalIPv6) {
-  if (HasIPv6Enabled()) {
-    TestPhysicalInternal(SocketAddress("::1", 0));
-  } else {
-    LOG(LS_WARNING) << "No IPv6, skipping";
-  }
-}
-
-namespace {
-
-class TestVirtualSocketServer : public VirtualSocketServer {
- public:
-  // Expose this publicly
-  IPAddress GetNextIP(int af) { return VirtualSocketServer::GetNextIP(af); }
-};
-
-}  // namespace
-
-void TestVirtualInternal(int family) {
-  std::unique_ptr<TestVirtualSocketServer> int_vss(
-      new TestVirtualSocketServer());
-  std::unique_ptr<TestVirtualSocketServer> ext_vss(
-      new TestVirtualSocketServer());
-
-  SocketAddress int_addr;
-  SocketAddress ext_addrs[4];
-  int_addr.SetIP(int_vss->GetNextIP(family));
-  ext_addrs[0].SetIP(ext_vss->GetNextIP(int_addr.family()));
-  ext_addrs[1].SetIP(ext_vss->GetNextIP(int_addr.family()));
-  ext_addrs[2].SetIP(ext_addrs[0].ipaddr());
-  ext_addrs[3].SetIP(ext_addrs[1].ipaddr());
-
-  TestBindings(int_vss.get(), int_addr, ext_vss.get(), ext_addrs);
-  TestFilters(int_vss.get(), int_addr, ext_vss.get(), ext_addrs);
-}
-
-TEST(NatTest, TestVirtualIPv4) {
-  TestVirtualInternal(AF_INET);
-}
-
-TEST(NatTest, TestVirtualIPv6) {
-  if (HasIPv6Enabled()) {
-    TestVirtualInternal(AF_INET6);
-  } else {
-    LOG(LS_WARNING) << "No IPv6, skipping";
-  }
-}
-
-class NatTcpTest : public testing::Test, public sigslot::has_slots<> {
- public:
-  NatTcpTest()
-      : int_addr_("192.168.0.1", 0),
-        ext_addr_("10.0.0.1", 0),
-        connected_(false),
-        int_vss_(new TestVirtualSocketServer()),
-        ext_vss_(new TestVirtualSocketServer()),
-        int_thread_(new Thread(int_vss_.get())),
-        ext_thread_(new Thread(ext_vss_.get())),
-        nat_(new NATServer(NAT_OPEN_CONE,
-                           int_vss_.get(),
-                           int_addr_,
-                           int_addr_,
-                           ext_vss_.get(),
-                           ext_addr_)),
-        natsf_(new NATSocketFactory(int_vss_.get(),
-                                    nat_->internal_udp_address(),
-                                    nat_->internal_tcp_address())) {
-    int_thread_->Start();
-    ext_thread_->Start();
-  }
-
-  void OnConnectEvent(AsyncSocket* socket) {
-    connected_ = true;
-  }
-
-  void OnAcceptEvent(AsyncSocket* socket) {
-    accepted_.reset(server_->Accept(nullptr));
-  }
-
-  void OnCloseEvent(AsyncSocket* socket, int error) {
-  }
-
-  void ConnectEvents() {
-    server_->SignalReadEvent.connect(this, &NatTcpTest::OnAcceptEvent);
-    client_->SignalConnectEvent.connect(this, &NatTcpTest::OnConnectEvent);
-  }
-
-  SocketAddress int_addr_;
-  SocketAddress ext_addr_;
-  bool connected_;
-  std::unique_ptr<TestVirtualSocketServer> int_vss_;
-  std::unique_ptr<TestVirtualSocketServer> ext_vss_;
-  std::unique_ptr<Thread> int_thread_;
-  std::unique_ptr<Thread> ext_thread_;
-  std::unique_ptr<NATServer> nat_;
-  std::unique_ptr<NATSocketFactory> natsf_;
-  std::unique_ptr<AsyncSocket> client_;
-  std::unique_ptr<AsyncSocket> server_;
-  std::unique_ptr<AsyncSocket> accepted_;
-};
-
-TEST_F(NatTcpTest, DISABLED_TestConnectOut) {
-  server_.reset(ext_vss_->CreateAsyncSocket(SOCK_STREAM));
-  server_->Bind(ext_addr_);
-  server_->Listen(5);
-
-  client_.reset(natsf_->CreateAsyncSocket(SOCK_STREAM));
-  EXPECT_GE(0, client_->Bind(int_addr_));
-  EXPECT_GE(0, client_->Connect(server_->GetLocalAddress()));
-
-  ConnectEvents();
-
-  EXPECT_TRUE_WAIT(connected_, 1000);
-  EXPECT_EQ(client_->GetRemoteAddress(), server_->GetLocalAddress());
-  EXPECT_EQ(accepted_->GetRemoteAddress().ipaddr(), ext_addr_.ipaddr());
-
-  std::unique_ptr<rtc::TestClient> in(CreateTCPTestClient(client_.release()));
-  std::unique_ptr<rtc::TestClient> out(
-      CreateTCPTestClient(accepted_.release()));
-
-  const char* buf = "test_packet";
-  size_t len = strlen(buf);
-
-  in->Send(buf, len);
-  SocketAddress trans_addr;
-  EXPECT_TRUE(out->CheckNextPacket(buf, len, &trans_addr));
-
-  out->Send(buf, len);
-  EXPECT_TRUE(in->CheckNextPacket(buf, len, &trans_addr));
-}
-// #endif
diff --git a/rtc_base/natserver.cc b/rtc_base/natserver.cc
deleted file mode 100644
index d3d1e14..0000000
--- a/rtc_base/natserver.cc
+++ /dev/null
@@ -1,252 +0,0 @@
-/*
- *  Copyright 2004 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 <memory>
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/natserver.h"
-#include "webrtc/rtc_base/natsocketfactory.h"
-#include "webrtc/rtc_base/socketadapters.h"
-
-namespace rtc {
-
-RouteCmp::RouteCmp(NAT* nat) : symmetric(nat->IsSymmetric()) {
-}
-
-size_t RouteCmp::operator()(const SocketAddressPair& r) const {
-  size_t h = r.source().Hash();
-  if (symmetric)
-    h ^= r.destination().Hash();
-  return h;
-}
-
-bool RouteCmp::operator()(
-      const SocketAddressPair& r1, const SocketAddressPair& r2) const {
-  if (r1.source() < r2.source())
-    return true;
-  if (r2.source() < r1.source())
-    return false;
-  if (symmetric && (r1.destination() < r2.destination()))
-    return true;
-  if (symmetric && (r2.destination() < r1.destination()))
-    return false;
-  return false;
-}
-
-AddrCmp::AddrCmp(NAT* nat)
-    : use_ip(nat->FiltersIP()), use_port(nat->FiltersPort()) {
-}
-
-size_t AddrCmp::operator()(const SocketAddress& a) const {
-  size_t h = 0;
-  if (use_ip)
-    h ^= HashIP(a.ipaddr());
-  if (use_port)
-    h ^= a.port() | (a.port() << 16);
-  return h;
-}
-
-bool AddrCmp::operator()(
-      const SocketAddress& a1, const SocketAddress& a2) const {
-  if (use_ip && (a1.ipaddr() < a2.ipaddr()))
-    return true;
-  if (use_ip && (a2.ipaddr() < a1.ipaddr()))
-    return false;
-  if (use_port && (a1.port() < a2.port()))
-    return true;
-  if (use_port && (a2.port() < a1.port()))
-    return false;
-  return false;
-}
-
-// Proxy socket that will capture the external destination address intended for
-// a TCP connection to the NAT server.
-class NATProxyServerSocket : public AsyncProxyServerSocket {
- public:
-  NATProxyServerSocket(AsyncSocket* socket)
-      : AsyncProxyServerSocket(socket, kNATEncodedIPv6AddressSize) {
-    BufferInput(true);
-  }
-
-  void SendConnectResult(int err, const SocketAddress& addr) override {
-    char code = err ? 1 : 0;
-    BufferedReadAdapter::DirectSend(&code, sizeof(char));
-  }
-
- protected:
-  void ProcessInput(char* data, size_t* len) override {
-    if (*len < 2) {
-      return;
-    }
-
-    int family = data[1];
-    RTC_DCHECK(family == AF_INET || family == AF_INET6);
-    if ((family == AF_INET && *len < kNATEncodedIPv4AddressSize) ||
-        (family == AF_INET6 && *len < kNATEncodedIPv6AddressSize)) {
-      return;
-    }
-
-    SocketAddress dest_addr;
-    size_t address_length = UnpackAddressFromNAT(data, *len, &dest_addr);
-
-    *len -= address_length;
-    if (*len > 0) {
-      memmove(data, data + address_length, *len);
-    }
-
-    bool remainder = (*len > 0);
-    BufferInput(false);
-    SignalConnectRequest(this, dest_addr);
-    if (remainder) {
-      SignalReadEvent(this);
-    }
-  }
-
-};
-
-class NATProxyServer : public ProxyServer {
- public:
-  NATProxyServer(SocketFactory* int_factory, const SocketAddress& int_addr,
-                 SocketFactory* ext_factory, const SocketAddress& ext_ip)
-      : ProxyServer(int_factory, int_addr, ext_factory, ext_ip) {
-  }
-
- protected:
-  AsyncProxyServerSocket* WrapSocket(AsyncSocket* socket) override {
-    return new NATProxyServerSocket(socket);
-  }
-};
-
-NATServer::NATServer(
-    NATType type, SocketFactory* internal,
-    const SocketAddress& internal_udp_addr,
-    const SocketAddress& internal_tcp_addr,
-    SocketFactory* external, const SocketAddress& external_ip)
-    : external_(external), external_ip_(external_ip.ipaddr(), 0) {
-  nat_ = NAT::Create(type);
-
-  udp_server_socket_ = AsyncUDPSocket::Create(internal, internal_udp_addr);
-  udp_server_socket_->SignalReadPacket.connect(this,
-                                               &NATServer::OnInternalUDPPacket);
-  tcp_proxy_server_ = new NATProxyServer(internal, internal_tcp_addr, external,
-                                         external_ip);
-
-  int_map_ = new InternalMap(RouteCmp(nat_));
-  ext_map_ = new ExternalMap();
-}
-
-NATServer::~NATServer() {
-  for (InternalMap::iterator iter = int_map_->begin();
-       iter != int_map_->end();
-       iter++)
-    delete iter->second;
-
-  delete nat_;
-  delete udp_server_socket_;
-  delete tcp_proxy_server_;
-  delete int_map_;
-  delete ext_map_;
-}
-
-void NATServer::OnInternalUDPPacket(
-    AsyncPacketSocket* socket, const char* buf, size_t size,
-    const SocketAddress& addr, const PacketTime& packet_time) {
-  // Read the intended destination from the wire.
-  SocketAddress dest_addr;
-  size_t length = UnpackAddressFromNAT(buf, size, &dest_addr);
-
-  // Find the translation for these addresses (allocating one if necessary).
-  SocketAddressPair route(addr, dest_addr);
-  InternalMap::iterator iter = int_map_->find(route);
-  if (iter == int_map_->end()) {
-    Translate(route);
-    iter = int_map_->find(route);
-  }
-  RTC_DCHECK(iter != int_map_->end());
-
-  // Allow the destination to send packets back to the source.
-  iter->second->WhitelistInsert(dest_addr);
-
-  // Send the packet to its intended destination.
-  rtc::PacketOptions options;
-  iter->second->socket->SendTo(buf + length, size - length, dest_addr, options);
-}
-
-void NATServer::OnExternalUDPPacket(
-    AsyncPacketSocket* socket, const char* buf, size_t size,
-    const SocketAddress& remote_addr, const PacketTime& packet_time) {
-  SocketAddress local_addr = socket->GetLocalAddress();
-
-  // Find the translation for this addresses.
-  ExternalMap::iterator iter = ext_map_->find(local_addr);
-  RTC_DCHECK(iter != ext_map_->end());
-
-  // Allow the NAT to reject this packet.
-  if (ShouldFilterOut(iter->second, remote_addr)) {
-    LOG(LS_INFO) << "Packet from " << remote_addr.ToSensitiveString()
-                 << " was filtered out by the NAT.";
-    return;
-  }
-
-  // Forward this packet to the internal address.
-  // First prepend the address in a quasi-STUN format.
-  std::unique_ptr<char[]> real_buf(new char[size + kNATEncodedIPv6AddressSize]);
-  size_t addrlength = PackAddressForNAT(real_buf.get(),
-                                        size + kNATEncodedIPv6AddressSize,
-                                        remote_addr);
-  // Copy the data part after the address.
-  rtc::PacketOptions options;
-  memcpy(real_buf.get() + addrlength, buf, size);
-  udp_server_socket_->SendTo(real_buf.get(), size + addrlength,
-                             iter->second->route.source(), options);
-}
-
-void NATServer::Translate(const SocketAddressPair& route) {
-  AsyncUDPSocket* socket = AsyncUDPSocket::Create(external_, external_ip_);
-
-  if (!socket) {
-    LOG(LS_ERROR) << "Couldn't find a free port!";
-    return;
-  }
-
-  TransEntry* entry = new TransEntry(route, socket, nat_);
-  (*int_map_)[route] = entry;
-  (*ext_map_)[socket->GetLocalAddress()] = entry;
-  socket->SignalReadPacket.connect(this, &NATServer::OnExternalUDPPacket);
-}
-
-bool NATServer::ShouldFilterOut(TransEntry* entry,
-                                const SocketAddress& ext_addr) {
-  return entry->WhitelistContains(ext_addr);
-}
-
-NATServer::TransEntry::TransEntry(
-    const SocketAddressPair& r, AsyncUDPSocket* s, NAT* nat)
-    : route(r), socket(s) {
-  whitelist = new AddressSet(AddrCmp(nat));
-}
-
-NATServer::TransEntry::~TransEntry() {
-  delete whitelist;
-  delete socket;
-}
-
-void NATServer::TransEntry::WhitelistInsert(const SocketAddress& addr) {
-  CritScope cs(&crit_);
-  whitelist->insert(addr);
-}
-
-bool NATServer::TransEntry::WhitelistContains(const SocketAddress& ext_addr) {
-  CritScope cs(&crit_);
-  return whitelist->find(ext_addr) == whitelist->end();
-}
-
-}  // namespace rtc
diff --git a/rtc_base/natserver.h b/rtc_base/natserver.h
deleted file mode 100644
index fe901f9..0000000
--- a/rtc_base/natserver.h
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- *  Copyright 2004 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_RTC_BASE_NATSERVER_H_
-#define WEBRTC_RTC_BASE_NATSERVER_H_
-
-#include <map>
-#include <set>
-
-#include "webrtc/rtc_base/asyncudpsocket.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/nattypes.h"
-#include "webrtc/rtc_base/proxyserver.h"
-#include "webrtc/rtc_base/socketaddresspair.h"
-#include "webrtc/rtc_base/socketfactory.h"
-#include "webrtc/rtc_base/thread.h"
-
-namespace rtc {
-
-// Change how routes (socketaddress pairs) are compared based on the type of
-// NAT.  The NAT server maintains a hashtable of the routes that it knows
-// about.  So these affect which routes are treated the same.
-struct RouteCmp {
-  explicit RouteCmp(NAT* nat);
-  size_t operator()(const SocketAddressPair& r) const;
-  bool operator()(
-      const SocketAddressPair& r1, const SocketAddressPair& r2) const;
-
-  bool symmetric;
-};
-
-// Changes how addresses are compared based on the filtering rules of the NAT.
-struct AddrCmp {
-  explicit AddrCmp(NAT* nat);
-  size_t operator()(const SocketAddress& r) const;
-  bool operator()(const SocketAddress& r1, const SocketAddress& r2) const;
-
-  bool use_ip;
-  bool use_port;
-};
-
-// Implements the NAT device.  It listens for packets on the internal network,
-// translates them, and sends them out over the external network.
-//
-// TCP connections initiated from the internal side of the NAT server are
-// also supported, by making a connection to the NAT server's TCP address and
-// then sending the remote address in quasi-STUN format. The connection status
-// will be indicated back to the client as a 1 byte status code, where '0'
-// indicates success.
-
-const int NAT_SERVER_UDP_PORT = 4237;
-const int NAT_SERVER_TCP_PORT = 4238;
-
-class NATServer : public sigslot::has_slots<> {
- public:
-  NATServer(
-      NATType type, SocketFactory* internal,
-      const SocketAddress& internal_udp_addr,
-      const SocketAddress& internal_tcp_addr,
-      SocketFactory* external, const SocketAddress& external_ip);
-  ~NATServer() override;
-
-  SocketAddress internal_udp_address() const {
-    return udp_server_socket_->GetLocalAddress();
-  }
-
-  SocketAddress internal_tcp_address() const {
-    return tcp_proxy_server_->GetServerAddress();
-  }
-
-  // Packets received on one of the networks.
-  void OnInternalUDPPacket(AsyncPacketSocket* socket, const char* buf,
-                           size_t size, const SocketAddress& addr,
-                           const PacketTime& packet_time);
-  void OnExternalUDPPacket(AsyncPacketSocket* socket, const char* buf,
-                           size_t size, const SocketAddress& remote_addr,
-                           const PacketTime& packet_time);
-
- private:
-  typedef std::set<SocketAddress, AddrCmp> AddressSet;
-
-  /* Records a translation and the associated external socket. */
-  struct TransEntry {
-    TransEntry(const SocketAddressPair& r, AsyncUDPSocket* s, NAT* nat);
-    ~TransEntry();
-
-    void WhitelistInsert(const SocketAddress& addr);
-    bool WhitelistContains(const SocketAddress& ext_addr);
-
-    SocketAddressPair route;
-    AsyncUDPSocket* socket;
-    AddressSet* whitelist;
-    CriticalSection crit_;
-  };
-
-  typedef std::map<SocketAddressPair, TransEntry*, RouteCmp> InternalMap;
-  typedef std::map<SocketAddress, TransEntry*> ExternalMap;
-
-  /* Creates a new entry that translates the given route. */
-  void Translate(const SocketAddressPair& route);
-
-  /* Determines whether the NAT would filter out a packet from this address. */
-  bool ShouldFilterOut(TransEntry* entry, const SocketAddress& ext_addr);
-
-  NAT* nat_;
-  SocketFactory* external_;
-  SocketAddress external_ip_;
-  AsyncUDPSocket* udp_server_socket_;
-  ProxyServer* tcp_proxy_server_;
-  InternalMap* int_map_;
-  ExternalMap* ext_map_;
-  RTC_DISALLOW_COPY_AND_ASSIGN(NATServer);
-};
-
-}  // namespace rtc
-
-#endif  // WEBRTC_RTC_BASE_NATSERVER_H_
diff --git a/rtc_base/natsocketfactory.cc b/rtc_base/natsocketfactory.cc
deleted file mode 100644
index ad746d7..0000000
--- a/rtc_base/natsocketfactory.cc
+++ /dev/null
@@ -1,530 +0,0 @@
-/*
- *  Copyright 2004 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/rtc_base/natsocketfactory.h"
-
-#include "webrtc/rtc_base/arraysize.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/natserver.h"
-#include "webrtc/rtc_base/virtualsocketserver.h"
-
-namespace rtc {
-
-// Packs the given socketaddress into the buffer in buf, in the quasi-STUN
-// format that the natserver uses.
-// Returns 0 if an invalid address is passed.
-size_t PackAddressForNAT(char* buf, size_t buf_size,
-                         const SocketAddress& remote_addr) {
-  const IPAddress& ip = remote_addr.ipaddr();
-  int family = ip.family();
-  buf[0] = 0;
-  buf[1] = family;
-  // Writes the port.
-  *(reinterpret_cast<uint16_t*>(&buf[2])) = HostToNetwork16(remote_addr.port());
-  if (family == AF_INET) {
-    RTC_DCHECK(buf_size >= kNATEncodedIPv4AddressSize);
-    in_addr v4addr = ip.ipv4_address();
-    memcpy(&buf[4], &v4addr, kNATEncodedIPv4AddressSize - 4);
-    return kNATEncodedIPv4AddressSize;
-  } else if (family == AF_INET6) {
-    RTC_DCHECK(buf_size >= kNATEncodedIPv6AddressSize);
-    in6_addr v6addr = ip.ipv6_address();
-    memcpy(&buf[4], &v6addr, kNATEncodedIPv6AddressSize - 4);
-    return kNATEncodedIPv6AddressSize;
-  }
-  return 0U;
-}
-
-// Decodes the remote address from a packet that has been encoded with the nat's
-// quasi-STUN format. Returns the length of the address (i.e., the offset into
-// data where the original packet starts).
-size_t UnpackAddressFromNAT(const char* buf, size_t buf_size,
-                            SocketAddress* remote_addr) {
-  RTC_DCHECK(buf_size >= 8);
-  RTC_DCHECK(buf[0] == 0);
-  int family = buf[1];
-  uint16_t port =
-      NetworkToHost16(*(reinterpret_cast<const uint16_t*>(&buf[2])));
-  if (family == AF_INET) {
-    const in_addr* v4addr = reinterpret_cast<const in_addr*>(&buf[4]);
-    *remote_addr = SocketAddress(IPAddress(*v4addr), port);
-    return kNATEncodedIPv4AddressSize;
-  } else if (family == AF_INET6) {
-    RTC_DCHECK(buf_size >= 20);
-    const in6_addr* v6addr = reinterpret_cast<const in6_addr*>(&buf[4]);
-    *remote_addr = SocketAddress(IPAddress(*v6addr), port);
-    return kNATEncodedIPv6AddressSize;
-  }
-  return 0U;
-}
-
-
-// NATSocket
-class NATSocket : public AsyncSocket, public sigslot::has_slots<> {
- public:
-  explicit NATSocket(NATInternalSocketFactory* sf, int family, int type)
-      : sf_(sf),
-        family_(family),
-        type_(type),
-        connected_(false),
-        socket_(nullptr),
-        buf_(nullptr),
-        size_(0) {}
-
-  ~NATSocket() override {
-    delete socket_;
-    delete[] buf_;
-  }
-
-  SocketAddress GetLocalAddress() const override {
-    return (socket_) ? socket_->GetLocalAddress() : SocketAddress();
-  }
-
-  SocketAddress GetRemoteAddress() const override {
-    return remote_addr_;  // will be NIL if not connected
-  }
-
-  int Bind(const SocketAddress& addr) override {
-    if (socket_) {  // already bound, bubble up error
-      return -1;
-    }
-
-    return BindInternal(addr);
-  }
-
-  int Connect(const SocketAddress& addr) override {
-    int result = 0;
-    // If we're not already bound (meaning |socket_| is null), bind to ANY
-    // address.
-    if (!socket_) {
-      result = BindInternal(SocketAddress(GetAnyIP(family_), 0));
-      if (result < 0) {
-        return result;
-      }
-    }
-
-    if (type_ == SOCK_STREAM) {
-      result = socket_->Connect(server_addr_.IsNil() ? addr : server_addr_);
-    } else {
-      connected_ = true;
-    }
-
-    if (result >= 0) {
-      remote_addr_ = addr;
-    }
-
-    return result;
-  }
-
-  int Send(const void* data, size_t size) override {
-    RTC_DCHECK(connected_);
-    return SendTo(data, size, remote_addr_);
-  }
-
-  int SendTo(const void* data,
-             size_t size,
-             const SocketAddress& addr) override {
-    RTC_DCHECK(!connected_ || addr == remote_addr_);
-    if (server_addr_.IsNil() || type_ == SOCK_STREAM) {
-      return socket_->SendTo(data, size, addr);
-    }
-    // This array will be too large for IPv4 packets, but only by 12 bytes.
-    std::unique_ptr<char[]> buf(new char[size + kNATEncodedIPv6AddressSize]);
-    size_t addrlength = PackAddressForNAT(buf.get(),
-                                          size + kNATEncodedIPv6AddressSize,
-                                          addr);
-    size_t encoded_size = size + addrlength;
-    memcpy(buf.get() + addrlength, data, size);
-    int result = socket_->SendTo(buf.get(), encoded_size, server_addr_);
-    if (result >= 0) {
-      RTC_DCHECK(result == static_cast<int>(encoded_size));
-      result = result - static_cast<int>(addrlength);
-    }
-    return result;
-  }
-
-  int Recv(void* data, size_t size, int64_t* timestamp) override {
-    SocketAddress addr;
-    return RecvFrom(data, size, &addr, timestamp);
-  }
-
-  int RecvFrom(void* data,
-               size_t size,
-               SocketAddress* out_addr,
-               int64_t* timestamp) override {
-    if (server_addr_.IsNil() || type_ == SOCK_STREAM) {
-      return socket_->RecvFrom(data, size, out_addr, timestamp);
-    }
-    // Make sure we have enough room to read the requested amount plus the
-    // largest possible header address.
-    SocketAddress remote_addr;
-    Grow(size + kNATEncodedIPv6AddressSize);
-
-    // Read the packet from the socket.
-    int result = socket_->RecvFrom(buf_, size_, &remote_addr, timestamp);
-    if (result >= 0) {
-      RTC_DCHECK(remote_addr == server_addr_);
-
-      // TODO: we need better framing so we know how many bytes we can
-      // return before we need to read the next address. For UDP, this will be
-      // fine as long as the reader always reads everything in the packet.
-      RTC_DCHECK((size_t)result < size_);
-
-      // Decode the wire packet into the actual results.
-      SocketAddress real_remote_addr;
-      size_t addrlength = UnpackAddressFromNAT(buf_, result, &real_remote_addr);
-      memcpy(data, buf_ + addrlength, result - addrlength);
-
-      // Make sure this packet should be delivered before returning it.
-      if (!connected_ || (real_remote_addr == remote_addr_)) {
-        if (out_addr)
-          *out_addr = real_remote_addr;
-        result = result - static_cast<int>(addrlength);
-      } else {
-        LOG(LS_ERROR) << "Dropping packet from unknown remote address: "
-                      << real_remote_addr.ToString();
-        result = 0;  // Tell the caller we didn't read anything
-      }
-    }
-
-    return result;
-  }
-
-  int Close() override {
-    int result = 0;
-    if (socket_) {
-      result = socket_->Close();
-      if (result >= 0) {
-        connected_ = false;
-        remote_addr_ = SocketAddress();
-        delete socket_;
-        socket_ = nullptr;
-      }
-    }
-    return result;
-  }
-
-  int Listen(int backlog) override { return socket_->Listen(backlog); }
-  AsyncSocket* Accept(SocketAddress* paddr) override {
-    return socket_->Accept(paddr);
-  }
-  int GetError() const override {
-    return socket_ ? socket_->GetError() : error_;
-  }
-  void SetError(int error) override {
-    if (socket_) {
-      socket_->SetError(error);
-    } else {
-      error_ = error;
-    }
-  }
-  ConnState GetState() const override {
-    return connected_ ? CS_CONNECTED : CS_CLOSED;
-  }
-  int GetOption(Option opt, int* value) override {
-    return socket_->GetOption(opt, value);
-  }
-  int SetOption(Option opt, int value) override {
-    return socket_->SetOption(opt, value);
-  }
-
-  void OnConnectEvent(AsyncSocket* socket) {
-    // If we're NATed, we need to send a message with the real addr to use.
-    RTC_DCHECK(socket == socket_);
-    if (server_addr_.IsNil()) {
-      connected_ = true;
-      SignalConnectEvent(this);
-    } else {
-      SendConnectRequest();
-    }
-  }
-  void OnReadEvent(AsyncSocket* socket) {
-    // If we're NATed, we need to process the connect reply.
-    RTC_DCHECK(socket == socket_);
-    if (type_ == SOCK_STREAM && !server_addr_.IsNil() && !connected_) {
-      HandleConnectReply();
-    } else {
-      SignalReadEvent(this);
-    }
-  }
-  void OnWriteEvent(AsyncSocket* socket) {
-    RTC_DCHECK(socket == socket_);
-    SignalWriteEvent(this);
-  }
-  void OnCloseEvent(AsyncSocket* socket, int error) {
-    RTC_DCHECK(socket == socket_);
-    SignalCloseEvent(this, error);
-  }
-
- private:
-  int BindInternal(const SocketAddress& addr) {
-    RTC_DCHECK(!socket_);
-
-    int result;
-    socket_ = sf_->CreateInternalSocket(family_, type_, addr, &server_addr_);
-    result = (socket_) ? socket_->Bind(addr) : -1;
-    if (result >= 0) {
-      socket_->SignalConnectEvent.connect(this, &NATSocket::OnConnectEvent);
-      socket_->SignalReadEvent.connect(this, &NATSocket::OnReadEvent);
-      socket_->SignalWriteEvent.connect(this, &NATSocket::OnWriteEvent);
-      socket_->SignalCloseEvent.connect(this, &NATSocket::OnCloseEvent);
-    } else {
-      server_addr_.Clear();
-      delete socket_;
-      socket_ = nullptr;
-    }
-
-    return result;
-  }
-
-  // Makes sure the buffer is at least the given size.
-  void Grow(size_t new_size) {
-    if (size_ < new_size) {
-      delete[] buf_;
-      size_ = new_size;
-      buf_ = new char[size_];
-    }
-  }
-
-  // Sends the destination address to the server to tell it to connect.
-  void SendConnectRequest() {
-    char buf[kNATEncodedIPv6AddressSize];
-    size_t length = PackAddressForNAT(buf, arraysize(buf), remote_addr_);
-    socket_->Send(buf, length);
-  }
-
-  // Handles the byte sent back from the server and fires the appropriate event.
-  void HandleConnectReply() {
-    char code;
-    socket_->Recv(&code, sizeof(code), nullptr);
-    if (code == 0) {
-      connected_ = true;
-      SignalConnectEvent(this);
-    } else {
-      Close();
-      SignalCloseEvent(this, code);
-    }
-  }
-
-  NATInternalSocketFactory* sf_;
-  int family_;
-  int type_;
-  bool connected_;
-  SocketAddress remote_addr_;
-  SocketAddress server_addr_;  // address of the NAT server
-  AsyncSocket* socket_;
-  // Need to hold error in case it occurs before the socket is created.
-  int error_ = 0;
-  char* buf_;
-  size_t size_;
-};
-
-// NATSocketFactory
-NATSocketFactory::NATSocketFactory(SocketFactory* factory,
-                                   const SocketAddress& nat_udp_addr,
-                                   const SocketAddress& nat_tcp_addr)
-    : factory_(factory), nat_udp_addr_(nat_udp_addr),
-      nat_tcp_addr_(nat_tcp_addr) {
-}
-
-Socket* NATSocketFactory::CreateSocket(int type) {
-  return CreateSocket(AF_INET, type);
-}
-
-Socket* NATSocketFactory::CreateSocket(int family, int type) {
-  return new NATSocket(this, family, type);
-}
-
-AsyncSocket* NATSocketFactory::CreateAsyncSocket(int type) {
-  return CreateAsyncSocket(AF_INET, type);
-}
-
-AsyncSocket* NATSocketFactory::CreateAsyncSocket(int family, int type) {
-  return new NATSocket(this, family, type);
-}
-
-AsyncSocket* NATSocketFactory::CreateInternalSocket(int family, int type,
-    const SocketAddress& local_addr, SocketAddress* nat_addr) {
-  if (type == SOCK_STREAM) {
-    *nat_addr = nat_tcp_addr_;
-  } else {
-    *nat_addr = nat_udp_addr_;
-  }
-  return factory_->CreateAsyncSocket(family, type);
-}
-
-// NATSocketServer
-NATSocketServer::NATSocketServer(SocketServer* server)
-    : server_(server), msg_queue_(nullptr) {}
-
-NATSocketServer::Translator* NATSocketServer::GetTranslator(
-    const SocketAddress& ext_ip) {
-  return nats_.Get(ext_ip);
-}
-
-NATSocketServer::Translator* NATSocketServer::AddTranslator(
-    const SocketAddress& ext_ip, const SocketAddress& int_ip, NATType type) {
-  // Fail if a translator already exists with this extternal address.
-  if (nats_.Get(ext_ip))
-    return nullptr;
-
-  return nats_.Add(ext_ip, new Translator(this, type, int_ip, server_, ext_ip));
-}
-
-void NATSocketServer::RemoveTranslator(
-    const SocketAddress& ext_ip) {
-  nats_.Remove(ext_ip);
-}
-
-Socket* NATSocketServer::CreateSocket(int type) {
-  return CreateSocket(AF_INET, type);
-}
-
-Socket* NATSocketServer::CreateSocket(int family, int type) {
-  return new NATSocket(this, family, type);
-}
-
-AsyncSocket* NATSocketServer::CreateAsyncSocket(int type) {
-  return CreateAsyncSocket(AF_INET, type);
-}
-
-AsyncSocket* NATSocketServer::CreateAsyncSocket(int family, int type) {
-  return new NATSocket(this, family, type);
-}
-
-void NATSocketServer::SetMessageQueue(MessageQueue* queue) {
-  msg_queue_ = queue;
-  server_->SetMessageQueue(queue);
-}
-
-bool NATSocketServer::Wait(int cms, bool process_io) {
-  return server_->Wait(cms, process_io);
-}
-
-void NATSocketServer::WakeUp() {
-  server_->WakeUp();
-}
-
-AsyncSocket* NATSocketServer::CreateInternalSocket(int family, int type,
-    const SocketAddress& local_addr, SocketAddress* nat_addr) {
-  AsyncSocket* socket = nullptr;
-  Translator* nat = nats_.FindClient(local_addr);
-  if (nat) {
-    socket = nat->internal_factory()->CreateAsyncSocket(family, type);
-    *nat_addr = (type == SOCK_STREAM) ?
-        nat->internal_tcp_address() : nat->internal_udp_address();
-  } else {
-    socket = server_->CreateAsyncSocket(family, type);
-  }
-  return socket;
-}
-
-// NATSocketServer::Translator
-NATSocketServer::Translator::Translator(
-    NATSocketServer* server, NATType type, const SocketAddress& int_ip,
-    SocketFactory* ext_factory, const SocketAddress& ext_ip)
-    : server_(server) {
-  // Create a new private network, and a NATServer running on the private
-  // network that bridges to the external network. Also tell the private
-  // network to use the same message queue as us.
-  VirtualSocketServer* internal_server = new VirtualSocketServer();
-  internal_server->SetMessageQueue(server_->queue());
-  internal_factory_.reset(internal_server);
-  nat_server_.reset(new NATServer(type, internal_server, int_ip, int_ip,
-                                  ext_factory, ext_ip));
-}
-
-NATSocketServer::Translator::~Translator() = default;
-
-NATSocketServer::Translator* NATSocketServer::Translator::GetTranslator(
-    const SocketAddress& ext_ip) {
-  return nats_.Get(ext_ip);
-}
-
-NATSocketServer::Translator* NATSocketServer::Translator::AddTranslator(
-    const SocketAddress& ext_ip, const SocketAddress& int_ip, NATType type) {
-  // Fail if a translator already exists with this extternal address.
-  if (nats_.Get(ext_ip))
-    return nullptr;
-
-  AddClient(ext_ip);
-  return nats_.Add(ext_ip,
-                   new Translator(server_, type, int_ip, server_, ext_ip));
-}
-void NATSocketServer::Translator::RemoveTranslator(
-    const SocketAddress& ext_ip) {
-  nats_.Remove(ext_ip);
-  RemoveClient(ext_ip);
-}
-
-bool NATSocketServer::Translator::AddClient(
-    const SocketAddress& int_ip) {
-  // Fail if a client already exists with this internal address.
-  if (clients_.find(int_ip) != clients_.end())
-    return false;
-
-  clients_.insert(int_ip);
-  return true;
-}
-
-void NATSocketServer::Translator::RemoveClient(
-    const SocketAddress& int_ip) {
-  std::set<SocketAddress>::iterator it = clients_.find(int_ip);
-  if (it != clients_.end()) {
-    clients_.erase(it);
-  }
-}
-
-NATSocketServer::Translator* NATSocketServer::Translator::FindClient(
-    const SocketAddress& int_ip) {
-  // See if we have the requested IP, or any of our children do.
-  return (clients_.find(int_ip) != clients_.end()) ?
-      this : nats_.FindClient(int_ip);
-}
-
-// NATSocketServer::TranslatorMap
-NATSocketServer::TranslatorMap::~TranslatorMap() {
-  for (TranslatorMap::iterator it = begin(); it != end(); ++it) {
-    delete it->second;
-  }
-}
-
-NATSocketServer::Translator* NATSocketServer::TranslatorMap::Get(
-    const SocketAddress& ext_ip) {
-  TranslatorMap::iterator it = find(ext_ip);
-  return (it != end()) ? it->second : nullptr;
-}
-
-NATSocketServer::Translator* NATSocketServer::TranslatorMap::Add(
-    const SocketAddress& ext_ip, Translator* nat) {
-  (*this)[ext_ip] = nat;
-  return nat;
-}
-
-void NATSocketServer::TranslatorMap::Remove(
-    const SocketAddress& ext_ip) {
-  TranslatorMap::iterator it = find(ext_ip);
-  if (it != end()) {
-    delete it->second;
-    erase(it);
-  }
-}
-
-NATSocketServer::Translator* NATSocketServer::TranslatorMap::FindClient(
-    const SocketAddress& int_ip) {
-  Translator* nat = nullptr;
-  for (TranslatorMap::iterator it = begin(); it != end() && !nat; ++it) {
-    nat = it->second->FindClient(int_ip);
-  }
-  return nat;
-}
-
-}  // namespace rtc
diff --git a/rtc_base/natsocketfactory.h b/rtc_base/natsocketfactory.h
deleted file mode 100644
index 9e7cce0..0000000
--- a/rtc_base/natsocketfactory.h
+++ /dev/null
@@ -1,168 +0,0 @@
-/*
- *  Copyright 2004 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_RTC_BASE_NATSOCKETFACTORY_H_
-#define WEBRTC_RTC_BASE_NATSOCKETFACTORY_H_
-
-#include <string>
-#include <map>
-#include <memory>
-#include <set>
-
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/natserver.h"
-#include "webrtc/rtc_base/socketaddress.h"
-#include "webrtc/rtc_base/socketserver.h"
-
-namespace rtc {
-
-const size_t kNATEncodedIPv4AddressSize = 8U;
-const size_t kNATEncodedIPv6AddressSize = 20U;
-
-// Used by the NAT socket implementation.
-class NATInternalSocketFactory {
- public:
-  virtual ~NATInternalSocketFactory() {}
-  virtual AsyncSocket* CreateInternalSocket(int family, int type,
-      const SocketAddress& local_addr, SocketAddress* nat_addr) = 0;
-};
-
-// Creates sockets that will send all traffic through a NAT, using an existing
-// NATServer instance running at nat_addr. The actual data is sent using sockets
-// from a socket factory, given to the constructor.
-class NATSocketFactory : public SocketFactory, public NATInternalSocketFactory {
- public:
-  NATSocketFactory(SocketFactory* factory, const SocketAddress& nat_udp_addr,
-                   const SocketAddress& nat_tcp_addr);
-
-  // SocketFactory implementation
-  Socket* CreateSocket(int type) override;
-  Socket* CreateSocket(int family, int type) override;
-  AsyncSocket* CreateAsyncSocket(int type) override;
-  AsyncSocket* CreateAsyncSocket(int family, int type) override;
-
-  // NATInternalSocketFactory implementation
-  AsyncSocket* CreateInternalSocket(int family,
-                                    int type,
-                                    const SocketAddress& local_addr,
-                                    SocketAddress* nat_addr) override;
-
- private:
-  SocketFactory* factory_;
-  SocketAddress nat_udp_addr_;
-  SocketAddress nat_tcp_addr_;
-  RTC_DISALLOW_COPY_AND_ASSIGN(NATSocketFactory);
-};
-
-// Creates sockets that will send traffic through a NAT depending on what
-// address they bind to. This can be used to simulate a client on a NAT sending
-// to a client that is not behind a NAT.
-// Note that the internal addresses of clients must be unique. This is because
-// there is only one socketserver per thread, and the Bind() address is used to
-// figure out which NAT (if any) the socket should talk to.
-//
-// Example with 3 NATs (2 cascaded), and 3 clients.
-// ss->AddTranslator("1.2.3.4", "192.168.0.1", NAT_ADDR_RESTRICTED);
-// ss->AddTranslator("99.99.99.99", "10.0.0.1", NAT_SYMMETRIC)->
-//     AddTranslator("10.0.0.2", "192.168.1.1", NAT_OPEN_CONE);
-// ss->GetTranslator("1.2.3.4")->AddClient("1.2.3.4", "192.168.0.2");
-// ss->GetTranslator("99.99.99.99")->AddClient("10.0.0.3");
-// ss->GetTranslator("99.99.99.99")->GetTranslator("10.0.0.2")->
-//     AddClient("192.168.1.2");
-class NATSocketServer : public SocketServer, public NATInternalSocketFactory {
- public:
-  class Translator;
-  // holds a list of NATs
-  class TranslatorMap : private std::map<SocketAddress, Translator*> {
-   public:
-    ~TranslatorMap();
-    Translator* Get(const SocketAddress& ext_ip);
-    Translator* Add(const SocketAddress& ext_ip, Translator*);
-    void Remove(const SocketAddress& ext_ip);
-    Translator* FindClient(const SocketAddress& int_ip);
-  };
-
-  // a specific NAT
-  class Translator {
-   public:
-    Translator(NATSocketServer* server, NATType type,
-               const SocketAddress& int_addr, SocketFactory* ext_factory,
-               const SocketAddress& ext_addr);
-    ~Translator();
-
-    SocketFactory* internal_factory() { return internal_factory_.get(); }
-    SocketAddress internal_udp_address() const {
-      return nat_server_->internal_udp_address();
-    }
-    SocketAddress internal_tcp_address() const {
-      return SocketAddress();  // nat_server_->internal_tcp_address();
-    }
-
-    Translator* GetTranslator(const SocketAddress& ext_ip);
-    Translator* AddTranslator(const SocketAddress& ext_ip,
-                              const SocketAddress& int_ip, NATType type);
-    void RemoveTranslator(const SocketAddress& ext_ip);
-
-    bool AddClient(const SocketAddress& int_ip);
-    void RemoveClient(const SocketAddress& int_ip);
-
-    // Looks for the specified client in this or a child NAT.
-    Translator* FindClient(const SocketAddress& int_ip);
-
-   private:
-    NATSocketServer* server_;
-    std::unique_ptr<SocketFactory> internal_factory_;
-    std::unique_ptr<NATServer> nat_server_;
-    TranslatorMap nats_;
-    std::set<SocketAddress> clients_;
-  };
-
-  explicit NATSocketServer(SocketServer* ss);
-
-  SocketServer* socketserver() { return server_; }
-  MessageQueue* queue() { return msg_queue_; }
-
-  Translator* GetTranslator(const SocketAddress& ext_ip);
-  Translator* AddTranslator(const SocketAddress& ext_ip,
-                            const SocketAddress& int_ip, NATType type);
-  void RemoveTranslator(const SocketAddress& ext_ip);
-
-  // SocketServer implementation
-  Socket* CreateSocket(int type) override;
-  Socket* CreateSocket(int family, int type) override;
-
-  AsyncSocket* CreateAsyncSocket(int type) override;
-  AsyncSocket* CreateAsyncSocket(int family, int type) override;
-
-  void SetMessageQueue(MessageQueue* queue) override;
-  bool Wait(int cms, bool process_io) override;
-  void WakeUp() override;
-
-  // NATInternalSocketFactory implementation
-  AsyncSocket* CreateInternalSocket(int family,
-                                    int type,
-                                    const SocketAddress& local_addr,
-                                    SocketAddress* nat_addr) override;
-
- private:
-  SocketServer* server_;
-  MessageQueue* msg_queue_;
-  TranslatorMap nats_;
-  RTC_DISALLOW_COPY_AND_ASSIGN(NATSocketServer);
-};
-
-// Free-standing NAT helper functions.
-size_t PackAddressForNAT(char* buf, size_t buf_size,
-                         const SocketAddress& remote_addr);
-size_t UnpackAddressFromNAT(const char* buf, size_t buf_size,
-                            SocketAddress* remote_addr);
-}  // namespace rtc
-
-#endif  // WEBRTC_RTC_BASE_NATSOCKETFACTORY_H_
diff --git a/rtc_base/nattypes.cc b/rtc_base/nattypes.cc
deleted file mode 100644
index 973569b..0000000
--- a/rtc_base/nattypes.cc
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- *  Copyright 2004 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/rtc_base/nattypes.h"
-
-#include "webrtc/rtc_base/checks.h"
-
-namespace rtc {
-
-class SymmetricNAT : public NAT {
-public:
- bool IsSymmetric() override { return true; }
- bool FiltersIP() override { return true; }
- bool FiltersPort() override { return true; }
-};
-
-class OpenConeNAT : public NAT {
-public:
- bool IsSymmetric() override { return false; }
- bool FiltersIP() override { return false; }
- bool FiltersPort() override { return false; }
-};
-
-class AddressRestrictedNAT : public NAT {
-public:
- bool IsSymmetric() override { return false; }
- bool FiltersIP() override { return true; }
- bool FiltersPort() override { return false; }
-};
-
-class PortRestrictedNAT : public NAT {
-public:
- bool IsSymmetric() override { return false; }
- bool FiltersIP() override { return true; }
- bool FiltersPort() override { return true; }
-};
-
-NAT* NAT::Create(NATType type) {
-  switch (type) {
-    case NAT_OPEN_CONE:
-      return new OpenConeNAT();
-    case NAT_ADDR_RESTRICTED:
-      return new AddressRestrictedNAT();
-    case NAT_PORT_RESTRICTED:
-      return new PortRestrictedNAT();
-    case NAT_SYMMETRIC:
-      return new SymmetricNAT();
-    default:
-      RTC_NOTREACHED();
-      return 0;
-  }
-}
-
-} // namespace rtc
diff --git a/rtc_base/nattypes.h b/rtc_base/nattypes.h
deleted file mode 100644
index cc846c0..0000000
--- a/rtc_base/nattypes.h
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- *  Copyright 2004 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_RTC_BASE_NATTYPES_H_
-#define WEBRTC_RTC_BASE_NATTYPES_H_
-
-namespace rtc {
-
-/* Identifies each type of NAT that can be simulated. */
-enum NATType {
-  NAT_OPEN_CONE,
-  NAT_ADDR_RESTRICTED,
-  NAT_PORT_RESTRICTED,
-  NAT_SYMMETRIC
-};
-
-// Implements the rules for each specific type of NAT.
-class NAT {
-public:
-  virtual ~NAT() { }
-
-  // Determines whether this NAT uses both source and destination address when
-  // checking whether a mapping already exists.
-  virtual bool IsSymmetric() = 0;
-
-  // Determines whether this NAT drops packets received from a different IP
-  // the one last sent to.
-  virtual bool FiltersIP() = 0;
-
-  // Determines whether this NAT drops packets received from a different port
-  // the one last sent to.
-  virtual bool FiltersPort() = 0;
-
-  // Returns an implementation of the given type of NAT.
-  static NAT* Create(NATType type);
-};
-
-} // namespace rtc
-
-#endif // WEBRTC_RTC_BASE_NATTYPES_H_
diff --git a/rtc_base/nethelpers.cc b/rtc_base/nethelpers.cc
deleted file mode 100644
index 8489970..0000000
--- a/rtc_base/nethelpers.cc
+++ /dev/null
@@ -1,219 +0,0 @@
-/*
- *  Copyright 2008 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/rtc_base/nethelpers.h"
-
-#include <memory>
-
-#if defined(WEBRTC_WIN)
-#include <ws2spi.h>
-#include <ws2tcpip.h>
-#include "webrtc/rtc_base/win32.h"
-#endif
-#if defined(WEBRTC_POSIX) && !defined(__native_client__)
-#if defined(WEBRTC_ANDROID)
-#include "webrtc/rtc_base/ifaddrs-android.h"
-#else
-#include <ifaddrs.h>
-#endif
-#endif  // defined(WEBRTC_POSIX) && !defined(__native_client__)
-
-#include "webrtc/rtc_base/byteorder.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/signalthread.h"
-
-namespace rtc {
-
-int ResolveHostname(const std::string& hostname, int family,
-                    std::vector<IPAddress>* addresses) {
-#ifdef __native_client__
-  RTC_NOTREACHED();
-  LOG(LS_WARNING) << "ResolveHostname() is not implemented for NaCl";
-  return -1;
-#else  // __native_client__
-  if (!addresses) {
-    return -1;
-  }
-  addresses->clear();
-  struct addrinfo* result = nullptr;
-  struct addrinfo hints = {0};
-  hints.ai_family = family;
-  // |family| here will almost always be AF_UNSPEC, because |family| comes from
-  // AsyncResolver::addr_.family(), which comes from a SocketAddress constructed
-  // with a hostname. When a SocketAddress is constructed with a hostname, its
-  // family is AF_UNSPEC. However, if someday in the future we construct
-  // a SocketAddress with both a hostname and a family other than AF_UNSPEC,
-  // then it would be possible to get a specific family value here.
-
-  // The behavior of AF_UNSPEC is roughly "get both ipv4 and ipv6", as
-  // documented by the various operating systems:
-  // Linux: http://man7.org/linux/man-pages/man3/getaddrinfo.3.html
-  // Windows: https://msdn.microsoft.com/en-us/library/windows/desktop/
-  // ms738520(v=vs.85).aspx
-  // Mac: https://developer.apple.com/legacy/library/documentation/Darwin/
-  // Reference/ManPages/man3/getaddrinfo.3.html
-  // Android (source code, not documentation):
-  // https://android.googlesource.com/platform/bionic/+/
-  // 7e0bfb511e85834d7c6cb9631206b62f82701d60/libc/netbsd/net/getaddrinfo.c#1657
-  hints.ai_flags = AI_ADDRCONFIG;
-  int ret = getaddrinfo(hostname.c_str(), nullptr, &hints, &result);
-  if (ret != 0) {
-    return ret;
-  }
-  struct addrinfo* cursor = result;
-  for (; cursor; cursor = cursor->ai_next) {
-    if (family == AF_UNSPEC || cursor->ai_family == family) {
-      IPAddress ip;
-      if (IPFromAddrInfo(cursor, &ip)) {
-        addresses->push_back(ip);
-      }
-    }
-  }
-  freeaddrinfo(result);
-  return 0;
-#endif  // !__native_client__
-}
-
-// AsyncResolver
-AsyncResolver::AsyncResolver()
-    : SignalThread(false /* use_socket_server */), error_(-1) {}
-
-AsyncResolver::~AsyncResolver() = default;
-
-void AsyncResolver::Start(const SocketAddress& addr) {
-  addr_ = addr;
-  // SignalThred Start will kickoff the resolve process.
-  SignalThread::Start();
-}
-
-bool AsyncResolver::GetResolvedAddress(int family, SocketAddress* addr) const {
-  if (error_ != 0 || addresses_.empty())
-    return false;
-
-  *addr = addr_;
-  for (size_t i = 0; i < addresses_.size(); ++i) {
-    if (family == addresses_[i].family()) {
-      addr->SetResolvedIP(addresses_[i]);
-      return true;
-    }
-  }
-  return false;
-}
-
-int AsyncResolver::GetError() const {
-  return error_;
-}
-
-void AsyncResolver::Destroy(bool wait) {
-  SignalThread::Destroy(wait);
-}
-
-void AsyncResolver::DoWork() {
-  error_ = ResolveHostname(addr_.hostname().c_str(), addr_.family(),
-                           &addresses_);
-}
-
-void AsyncResolver::OnWorkDone() {
-  SignalDone(this);
-}
-
-const char* inet_ntop(int af, const void *src, char* dst, socklen_t size) {
-#if defined(WEBRTC_WIN)
-  return win32_inet_ntop(af, src, dst, size);
-#else
-  return ::inet_ntop(af, src, dst, size);
-#endif
-}
-
-int inet_pton(int af, const char* src, void *dst) {
-#if defined(WEBRTC_WIN)
-  return win32_inet_pton(af, src, dst);
-#else
-  return ::inet_pton(af, src, dst);
-#endif
-}
-
-bool HasIPv4Enabled() {
-#if defined(WEBRTC_POSIX) && !defined(__native_client__)
-  bool has_ipv4 = false;
-  struct ifaddrs* ifa;
-  if (getifaddrs(&ifa) < 0) {
-    return false;
-  }
-  for (struct ifaddrs* cur = ifa; cur != nullptr; cur = cur->ifa_next) {
-    if (cur->ifa_addr->sa_family == AF_INET) {
-      has_ipv4 = true;
-      break;
-    }
-  }
-  freeifaddrs(ifa);
-  return has_ipv4;
-#else
-  return true;
-#endif
-}
-
-bool HasIPv6Enabled() {
-#if defined(WEBRTC_WIN)
-  if (IsWindowsVistaOrLater()) {
-    return true;
-  }
-  if (!IsWindowsXpOrLater()) {
-    return false;
-  }
-  DWORD protbuff_size = 4096;
-  std::unique_ptr<char[]> protocols;
-  LPWSAPROTOCOL_INFOW protocol_infos = nullptr;
-  int requested_protocols[2] = {AF_INET6, 0};
-
-  int err = 0;
-  int ret = 0;
-  // Check for protocols in a do-while loop until we provide a buffer large
-  // enough. (WSCEnumProtocols sets protbuff_size to its desired value).
-  // It is extremely unlikely that this will loop more than once.
-  do {
-    protocols.reset(new char[protbuff_size]);
-    protocol_infos = reinterpret_cast<LPWSAPROTOCOL_INFOW>(protocols.get());
-    ret = WSCEnumProtocols(requested_protocols, protocol_infos,
-                           &protbuff_size, &err);
-  } while (ret == SOCKET_ERROR && err == WSAENOBUFS);
-
-  if (ret == SOCKET_ERROR) {
-    return false;
-  }
-
-  // Even if ret is positive, check specifically for IPv6.
-  // Non-IPv6 enabled WinXP will still return a RAW protocol.
-  for (int i = 0; i < ret; ++i) {
-    if (protocol_infos[i].iAddressFamily == AF_INET6) {
-      return true;
-    }
-  }
-  return false;
-#elif defined(WEBRTC_POSIX) && !defined(__native_client__)
-  bool has_ipv6 = false;
-  struct ifaddrs* ifa;
-  if (getifaddrs(&ifa) < 0) {
-    return false;
-  }
-  for (struct ifaddrs* cur = ifa; cur != nullptr; cur = cur->ifa_next) {
-    if (cur->ifa_addr->sa_family == AF_INET6) {
-      has_ipv6 = true;
-      break;
-    }
-  }
-  freeifaddrs(ifa);
-  return has_ipv6;
-#else
-  return true;
-#endif
-}
-}  // namespace rtc
diff --git a/rtc_base/nethelpers.h b/rtc_base/nethelpers.h
deleted file mode 100644
index d25879e..0000000
--- a/rtc_base/nethelpers.h
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- *  Copyright 2008 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_RTC_BASE_NETHELPERS_H_
-#define WEBRTC_RTC_BASE_NETHELPERS_H_
-
-#if defined(WEBRTC_POSIX)
-#include <netdb.h>
-#include <stddef.h>
-#elif WEBRTC_WIN
-#include <winsock2.h>  // NOLINT
-#endif
-
-#include <list>
-
-#include "webrtc/rtc_base/asyncresolverinterface.h"
-#include "webrtc/rtc_base/signalthread.h"
-#include "webrtc/rtc_base/sigslot.h"
-#include "webrtc/rtc_base/socketaddress.h"
-
-namespace rtc {
-
-class AsyncResolverTest;
-
-// AsyncResolver will perform async DNS resolution, signaling the result on
-// the SignalDone from AsyncResolverInterface when the operation completes.
-class AsyncResolver : public SignalThread, public AsyncResolverInterface {
- public:
-  AsyncResolver();
-  ~AsyncResolver() override;
-
-  void Start(const SocketAddress& addr) override;
-  bool GetResolvedAddress(int family, SocketAddress* addr) const override;
-  int GetError() const override;
-  void Destroy(bool wait) override;
-
-  const std::vector<IPAddress>& addresses() const { return addresses_; }
-  void set_error(int error) { error_ = error; }
-
- protected:
-  void DoWork() override;
-  void OnWorkDone() override;
-
- private:
-  SocketAddress addr_;
-  std::vector<IPAddress> addresses_;
-  int error_;
-};
-
-// rtc namespaced wrappers for inet_ntop and inet_pton so we can avoid
-// the windows-native versions of these.
-const char* inet_ntop(int af, const void *src, char* dst, socklen_t size);
-int inet_pton(int af, const char* src, void *dst);
-
-bool HasIPv4Enabled();
-bool HasIPv6Enabled();
-}  // namespace rtc
-
-#endif  // WEBRTC_RTC_BASE_NETHELPERS_H_
diff --git a/rtc_base/network.cc b/rtc_base/network.cc
deleted file mode 100644
index f2a1b87..0000000
--- a/rtc_base/network.cc
+++ /dev/null
@@ -1,979 +0,0 @@
-/*
- *  Copyright 2004 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/rtc_base/network.h"
-
-#if defined(WEBRTC_POSIX)
-// linux/if.h can't be included at the same time as the posix sys/if.h, and
-// it's transitively required by linux/route.h, so include that version on
-// linux instead of the standard posix one.
-#if defined(WEBRTC_LINUX)
-#include <linux/if.h>
-#include <linux/route.h>
-#elif !defined(__native_client__)
-#include <net/if.h>
-#endif
-#endif  // WEBRTC_POSIX
-
-#if defined(WEBRTC_WIN)
-#include "webrtc/rtc_base/win32.h"
-#include <Iphlpapi.h>
-#elif !defined(__native_client__)
-#include "webrtc/rtc_base/ifaddrs_converter.h"
-#endif
-
-#include <stdio.h>
-
-#include <algorithm>
-#include <memory>
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/networkmonitor.h"
-#include "webrtc/rtc_base/socket.h"  // includes something that makes windows happy
-#include "webrtc/rtc_base/stream.h"
-#include "webrtc/rtc_base/stringencode.h"
-#include "webrtc/rtc_base/thread.h"
-
-namespace rtc {
-namespace {
-
-const uint32_t kUpdateNetworksMessage = 1;
-const uint32_t kSignalNetworksMessage = 2;
-
-// Fetch list of networks every two seconds.
-const int kNetworksUpdateIntervalMs = 2000;
-
-const int kHighestNetworkPreference = 127;
-
-typedef struct {
-  Network* net;
-  std::vector<InterfaceAddress> ips;
-} AddressList;
-
-bool CompareNetworks(const Network* a, const Network* b) {
-  if (a->prefix_length() == b->prefix_length()) {
-    if (a->name() == b->name()) {
-      return a->prefix() < b->prefix();
-    }
-  }
-  return a->name() < b->name();
-}
-
-bool SortNetworks(const Network* a, const Network* b) {
-  // Network types will be preferred above everything else while sorting
-  // Networks.
-
-  // Networks are sorted first by type.
-  if (a->type() != b->type()) {
-    return a->type() < b->type();
-  }
-
-  IPAddress ip_a = a->GetBestIP();
-  IPAddress ip_b = b->GetBestIP();
-
-  // After type, networks are sorted by IP address precedence values
-  // from RFC 3484-bis
-  if (IPAddressPrecedence(ip_a) != IPAddressPrecedence(ip_b)) {
-    return IPAddressPrecedence(ip_a) > IPAddressPrecedence(ip_b);
-  }
-
-  // TODO(mallinath) - Add VPN and Link speed conditions while sorting.
-
-  // Networks are sorted last by key.
-  return a->key() < b->key();
-}
-
-std::string AdapterTypeToString(AdapterType type) {
-  switch (type) {
-    case ADAPTER_TYPE_UNKNOWN:
-      return "Unknown";
-    case ADAPTER_TYPE_ETHERNET:
-      return "Ethernet";
-    case ADAPTER_TYPE_WIFI:
-      return "Wifi";
-    case ADAPTER_TYPE_CELLULAR:
-      return "Cellular";
-    case ADAPTER_TYPE_VPN:
-      return "VPN";
-    case ADAPTER_TYPE_LOOPBACK:
-      return "Loopback";
-    default:
-      RTC_NOTREACHED() << "Invalid type " << type;
-      return std::string();
-  }
-}
-
-#if !defined(__native_client__)
-bool IsIgnoredIPv6(const InterfaceAddress& ip) {
-  if (ip.family() != AF_INET6) {
-    return false;
-  }
-
-  // Link-local addresses require scope id to be bound successfully.
-  // However, our IPAddress structure doesn't carry that so the
-  // information is lost and causes binding failure.
-  if (IPIsLinkLocal(ip)) {
-    return true;
-  }
-
-  // Any MAC based IPv6 should be avoided to prevent the MAC tracking.
-  if (IPIsMacBased(ip)) {
-    return true;
-  }
-
-  // Ignore deprecated IPv6.
-  if (ip.ipv6_flags() & IPV6_ADDRESS_FLAG_DEPRECATED) {
-    return true;
-  }
-
-  return false;
-}
-#endif  // !defined(__native_client__)
-
-}  // namespace
-
-// These addresses are used as the targets to find out the default local address
-// on a multi-homed endpoint. They are actually DNS servers.
-const char kPublicIPv4Host[] = "8.8.8.8";
-const char kPublicIPv6Host[] = "2001:4860:4860::8888";
-const int kPublicPort = 53;  // DNS port.
-
-std::string MakeNetworkKey(const std::string& name, const IPAddress& prefix,
-                           int prefix_length) {
-  std::ostringstream ost;
-  ost << name << "%" << prefix.ToString() << "/" << prefix_length;
-  return ost.str();
-}
-
-NetworkManager::NetworkManager() {
-}
-
-NetworkManager::~NetworkManager() {
-}
-
-NetworkManager::EnumerationPermission NetworkManager::enumeration_permission()
-    const {
-  return ENUMERATION_ALLOWED;
-}
-
-bool NetworkManager::GetDefaultLocalAddress(int family, IPAddress* addr) const {
-  return false;
-}
-
-NetworkManagerBase::NetworkManagerBase()
-    : enumeration_permission_(NetworkManager::ENUMERATION_ALLOWED),
-      ipv6_enabled_(true) {
-}
-
-NetworkManagerBase::~NetworkManagerBase() {
-  for (const auto& kv : networks_map_) {
-    delete kv.second;
-  }
-}
-
-NetworkManager::EnumerationPermission
-NetworkManagerBase::enumeration_permission() const {
-  return enumeration_permission_;
-}
-
-void NetworkManagerBase::GetAnyAddressNetworks(NetworkList* networks) {
-  if (!ipv4_any_address_network_) {
-    const rtc::IPAddress ipv4_any_address(INADDR_ANY);
-    ipv4_any_address_network_.reset(
-        new rtc::Network("any", "any", ipv4_any_address, 0));
-    ipv4_any_address_network_->set_default_local_address_provider(this);
-    ipv4_any_address_network_->AddIP(ipv4_any_address);
-  }
-  networks->push_back(ipv4_any_address_network_.get());
-
-  if (ipv6_enabled()) {
-    if (!ipv6_any_address_network_) {
-      const rtc::IPAddress ipv6_any_address(in6addr_any);
-      ipv6_any_address_network_.reset(
-          new rtc::Network("any", "any", ipv6_any_address, 0));
-      ipv6_any_address_network_->set_default_local_address_provider(this);
-      ipv6_any_address_network_->AddIP(ipv6_any_address);
-    }
-    networks->push_back(ipv6_any_address_network_.get());
-  }
-}
-
-void NetworkManagerBase::GetNetworks(NetworkList* result) const {
-  result->clear();
-  result->insert(result->begin(), networks_.begin(), networks_.end());
-}
-
-void NetworkManagerBase::MergeNetworkList(const NetworkList& new_networks,
-                                          bool* changed) {
-  NetworkManager::Stats stats;
-  MergeNetworkList(new_networks, changed, &stats);
-}
-
-void NetworkManagerBase::MergeNetworkList(const NetworkList& new_networks,
-                                          bool* changed,
-                                          NetworkManager::Stats* stats) {
-  *changed = false;
-  // AddressList in this map will track IP addresses for all Networks
-  // with the same key.
-  std::map<std::string, AddressList> consolidated_address_list;
-  NetworkList list(new_networks);
-  std::sort(list.begin(), list.end(), CompareNetworks);
-  // First, build a set of network-keys to the ipaddresses.
-  for (Network* network : list) {
-    bool might_add_to_merged_list = false;
-    std::string key = MakeNetworkKey(network->name(),
-                                     network->prefix(),
-                                     network->prefix_length());
-    if (consolidated_address_list.find(key) ==
-        consolidated_address_list.end()) {
-      AddressList addrlist;
-      addrlist.net = network;
-      consolidated_address_list[key] = addrlist;
-      might_add_to_merged_list = true;
-    }
-    const std::vector<InterfaceAddress>& addresses = network->GetIPs();
-    AddressList& current_list = consolidated_address_list[key];
-    for (const InterfaceAddress& address : addresses) {
-      current_list.ips.push_back(address);
-    }
-    if (!might_add_to_merged_list) {
-      delete network;
-    } else {
-      if (current_list.ips[0].family() == AF_INET) {
-        stats->ipv4_network_count++;
-      } else {
-        RTC_DCHECK(current_list.ips[0].family() == AF_INET6);
-        stats->ipv6_network_count++;
-      }
-    }
-  }
-
-  // Next, look for existing network objects to re-use.
-  // Result of Network merge. Element in this list should have unique key.
-  NetworkList merged_list;
-  for (const auto& kv : consolidated_address_list) {
-    const std::string& key = kv.first;
-    Network* net = kv.second.net;
-    auto existing = networks_map_.find(key);
-    if (existing == networks_map_.end()) {
-      // This network is new. Place it in the network map.
-      merged_list.push_back(net);
-      networks_map_[key] = net;
-      net->set_id(next_available_network_id_++);
-      // Also, we might have accumulated IPAddresses from the first
-      // step, set it here.
-      net->SetIPs(kv.second.ips, true);
-      *changed = true;
-    } else {
-      // This network exists in the map already. Reset its IP addresses.
-      Network* existing_net = existing->second;
-      *changed = existing_net->SetIPs(kv.second.ips, *changed);
-      merged_list.push_back(existing_net);
-      if (net->type() != ADAPTER_TYPE_UNKNOWN &&
-          net->type() != existing_net->type()) {
-        existing_net->set_type(net->type());
-        *changed = true;
-      }
-      // If the existing network was not active, networks have changed.
-      if (!existing_net->active()) {
-        *changed = true;
-      }
-      RTC_DCHECK(net->active());
-      if (existing_net != net) {
-        delete net;
-      }
-    }
-  }
-  // It may still happen that the merged list is a subset of |networks_|.
-  // To detect this change, we compare their sizes.
-  if (merged_list.size() != networks_.size()) {
-    *changed = true;
-  }
-
-  // If the network list changes, we re-assign |networks_| to the merged list
-  // and re-sort it.
-  if (*changed) {
-    networks_ = merged_list;
-    // Reset the active states of all networks.
-    for (const auto& kv : networks_map_) {
-      Network* network = kv.second;
-      // If |network| is in the newly generated |networks_|, it is active.
-      bool found = std::find(networks_.begin(), networks_.end(), network) !=
-                   networks_.end();
-      network->set_active(found);
-    }
-    std::sort(networks_.begin(), networks_.end(), SortNetworks);
-    // Now network interfaces are sorted, we should set the preference value
-    // for each of the interfaces we are planning to use.
-    // Preference order of network interfaces might have changed from previous
-    // sorting due to addition of higher preference network interface.
-    // Since we have already sorted the network interfaces based on our
-    // requirements, we will just assign a preference value starting with 127,
-    // in decreasing order.
-    int pref = kHighestNetworkPreference;
-    for (Network* network : networks_) {
-      network->set_preference(pref);
-      if (pref > 0) {
-        --pref;
-      } else {
-        LOG(LS_ERROR) << "Too many network interfaces to handle!";
-        break;
-      }
-    }
-  }
-}
-
-void NetworkManagerBase::set_default_local_addresses(const IPAddress& ipv4,
-                                                     const IPAddress& ipv6) {
-  if (ipv4.family() == AF_INET) {
-    default_local_ipv4_address_ = ipv4;
-  }
-  if (ipv6.family() == AF_INET6) {
-    default_local_ipv6_address_ = ipv6;
-  }
-}
-
-bool NetworkManagerBase::GetDefaultLocalAddress(int family,
-                                                IPAddress* ipaddr) const {
-  if (family == AF_INET && !default_local_ipv4_address_.IsNil()) {
-    *ipaddr = default_local_ipv4_address_;
-    return true;
-  } else if (family == AF_INET6 && !default_local_ipv6_address_.IsNil()) {
-    Network* ipv6_network = GetNetworkFromAddress(default_local_ipv6_address_);
-    if (ipv6_network) {
-      // If the default ipv6 network's BestIP is different than
-      // default_local_ipv6_address_, use it instead.
-      // This is to prevent potential IP address leakage. See WebRTC bug 5376.
-      *ipaddr = ipv6_network->GetBestIP();
-    } else {
-      *ipaddr = default_local_ipv6_address_;
-    }
-    return true;
-  }
-  return false;
-}
-
-Network* NetworkManagerBase::GetNetworkFromAddress(
-    const rtc::IPAddress& ip) const {
-  for (Network* network : networks_) {
-    const auto& ips = network->GetIPs();
-    if (std::find_if(ips.begin(), ips.end(),
-                     [ip](const InterfaceAddress& existing_ip) {
-                       return ip == static_cast<rtc::IPAddress>(existing_ip);
-                     }) != ips.end()) {
-      return network;
-    }
-  }
-  return nullptr;
-}
-
-BasicNetworkManager::BasicNetworkManager()
-    : thread_(nullptr),
-      sent_first_update_(false),
-      start_count_(0),
-      ignore_non_default_routes_(false) {}
-
-BasicNetworkManager::~BasicNetworkManager() {
-}
-
-void BasicNetworkManager::OnNetworksChanged() {
-  LOG(LS_INFO) << "Network change was observed";
-  UpdateNetworksOnce();
-}
-
-#if defined(__native_client__)
-
-bool BasicNetworkManager::CreateNetworks(bool include_ignored,
-                                         NetworkList* networks) const {
-  RTC_NOTREACHED();
-  LOG(LS_WARNING) << "BasicNetworkManager doesn't work on NaCl yet";
-  return false;
-}
-
-#elif defined(WEBRTC_POSIX)
-void BasicNetworkManager::ConvertIfAddrs(struct ifaddrs* interfaces,
-                                         IfAddrsConverter* ifaddrs_converter,
-                                         bool include_ignored,
-                                         NetworkList* networks) const {
-  NetworkMap current_networks;
-
-  for (struct ifaddrs* cursor = interfaces; cursor != nullptr;
-       cursor = cursor->ifa_next) {
-    IPAddress prefix;
-    IPAddress mask;
-    InterfaceAddress ip;
-    int scope_id = 0;
-
-    // Some interfaces may not have address assigned.
-    if (!cursor->ifa_addr || !cursor->ifa_netmask) {
-      continue;
-    }
-    // Skip ones which are down.
-    if (!(cursor->ifa_flags & IFF_RUNNING)) {
-      continue;
-    }
-    // Skip unknown family.
-    if (cursor->ifa_addr->sa_family != AF_INET &&
-        cursor->ifa_addr->sa_family != AF_INET6) {
-      continue;
-    }
-    // Skip IPv6 if not enabled.
-    if (cursor->ifa_addr->sa_family == AF_INET6 && !ipv6_enabled()) {
-      continue;
-    }
-    // Convert to InterfaceAddress.
-    if (!ifaddrs_converter->ConvertIfAddrsToIPAddress(cursor, &ip, &mask)) {
-      continue;
-    }
-
-    // Special case for IPv6 address.
-    if (cursor->ifa_addr->sa_family == AF_INET6) {
-      if (IsIgnoredIPv6(ip)) {
-        continue;
-      }
-      scope_id =
-          reinterpret_cast<sockaddr_in6*>(cursor->ifa_addr)->sin6_scope_id;
-    }
-
-    AdapterType adapter_type = ADAPTER_TYPE_UNKNOWN;
-    if (cursor->ifa_flags & IFF_LOOPBACK) {
-      adapter_type = ADAPTER_TYPE_LOOPBACK;
-    } else {
-      adapter_type = GetAdapterTypeFromName(cursor->ifa_name);
-    }
-    int prefix_length = CountIPMaskBits(mask);
-    prefix = TruncateIP(ip, prefix_length);
-    std::string key = MakeNetworkKey(std::string(cursor->ifa_name),
-                                     prefix, prefix_length);
-    auto iter = current_networks.find(key);
-    if (iter == current_networks.end()) {
-      // TODO(phoglund): Need to recognize other types as well.
-      std::unique_ptr<Network> network(
-          new Network(cursor->ifa_name, cursor->ifa_name, prefix, prefix_length,
-                      adapter_type));
-      network->set_default_local_address_provider(this);
-      network->set_scope_id(scope_id);
-      network->AddIP(ip);
-      network->set_ignored(IsIgnoredNetwork(*network));
-      if (include_ignored || !network->ignored()) {
-        current_networks[key] = network.get();
-        networks->push_back(network.release());
-      }
-    } else {
-      Network* existing_network = iter->second;
-      existing_network->AddIP(ip);
-      if (adapter_type != ADAPTER_TYPE_UNKNOWN) {
-        existing_network->set_type(adapter_type);
-      }
-    }
-  }
-}
-
-bool BasicNetworkManager::CreateNetworks(bool include_ignored,
-                                         NetworkList* networks) const {
-  struct ifaddrs* interfaces;
-  int error = getifaddrs(&interfaces);
-  if (error != 0) {
-    LOG_ERR(LERROR) << "getifaddrs failed to gather interface data: " << error;
-    return false;
-  }
-
-  std::unique_ptr<IfAddrsConverter> ifaddrs_converter(CreateIfAddrsConverter());
-  ConvertIfAddrs(interfaces, ifaddrs_converter.get(), include_ignored,
-                 networks);
-
-  freeifaddrs(interfaces);
-  return true;
-}
-
-#elif defined(WEBRTC_WIN)
-
-unsigned int GetPrefix(PIP_ADAPTER_PREFIX prefixlist,
-              const IPAddress& ip, IPAddress* prefix) {
-  IPAddress current_prefix;
-  IPAddress best_prefix;
-  unsigned int best_length = 0;
-  while (prefixlist) {
-    // Look for the longest matching prefix in the prefixlist.
-    if (prefixlist->Address.lpSockaddr == nullptr ||
-        prefixlist->Address.lpSockaddr->sa_family != ip.family()) {
-      prefixlist = prefixlist->Next;
-      continue;
-    }
-    switch (prefixlist->Address.lpSockaddr->sa_family) {
-      case AF_INET: {
-        sockaddr_in* v4_addr =
-            reinterpret_cast<sockaddr_in*>(prefixlist->Address.lpSockaddr);
-        current_prefix = IPAddress(v4_addr->sin_addr);
-        break;
-      }
-      case AF_INET6: {
-          sockaddr_in6* v6_addr =
-              reinterpret_cast<sockaddr_in6*>(prefixlist->Address.lpSockaddr);
-          current_prefix = IPAddress(v6_addr->sin6_addr);
-          break;
-      }
-      default: {
-        prefixlist = prefixlist->Next;
-        continue;
-      }
-    }
-    if (TruncateIP(ip, prefixlist->PrefixLength) == current_prefix &&
-        prefixlist->PrefixLength > best_length) {
-      best_prefix = current_prefix;
-      best_length = prefixlist->PrefixLength;
-    }
-    prefixlist = prefixlist->Next;
-  }
-  *prefix = best_prefix;
-  return best_length;
-}
-
-bool BasicNetworkManager::CreateNetworks(bool include_ignored,
-                                         NetworkList* networks) const {
-  NetworkMap current_networks;
-  // MSDN recommends a 15KB buffer for the first try at GetAdaptersAddresses.
-  size_t buffer_size = 16384;
-  std::unique_ptr<char[]> adapter_info(new char[buffer_size]);
-  PIP_ADAPTER_ADDRESSES adapter_addrs =
-      reinterpret_cast<PIP_ADAPTER_ADDRESSES>(adapter_info.get());
-  int adapter_flags = (GAA_FLAG_SKIP_DNS_SERVER | GAA_FLAG_SKIP_ANYCAST |
-                       GAA_FLAG_SKIP_MULTICAST | GAA_FLAG_INCLUDE_PREFIX);
-  int ret = 0;
-  do {
-    adapter_info.reset(new char[buffer_size]);
-    adapter_addrs = reinterpret_cast<PIP_ADAPTER_ADDRESSES>(adapter_info.get());
-    ret = GetAdaptersAddresses(AF_UNSPEC, adapter_flags,
-                               0, adapter_addrs,
-                               reinterpret_cast<PULONG>(&buffer_size));
-  } while (ret == ERROR_BUFFER_OVERFLOW);
-  if (ret != ERROR_SUCCESS) {
-    return false;
-  }
-  int count = 0;
-  while (adapter_addrs) {
-    if (adapter_addrs->OperStatus == IfOperStatusUp) {
-      PIP_ADAPTER_UNICAST_ADDRESS address = adapter_addrs->FirstUnicastAddress;
-      PIP_ADAPTER_PREFIX prefixlist = adapter_addrs->FirstPrefix;
-      std::string name;
-      std::string description;
-#if !defined(NDEBUG)
-      name = ToUtf8(adapter_addrs->FriendlyName,
-                    wcslen(adapter_addrs->FriendlyName));
-#endif
-      description = ToUtf8(adapter_addrs->Description,
-                           wcslen(adapter_addrs->Description));
-      for (; address; address = address->Next) {
-#if defined(NDEBUG)
-        name = rtc::ToString(count);
-#endif
-
-        IPAddress ip;
-        int scope_id = 0;
-        std::unique_ptr<Network> network;
-        switch (address->Address.lpSockaddr->sa_family) {
-          case AF_INET: {
-            sockaddr_in* v4_addr =
-                reinterpret_cast<sockaddr_in*>(address->Address.lpSockaddr);
-            ip = IPAddress(v4_addr->sin_addr);
-            break;
-          }
-          case AF_INET6: {
-            if (ipv6_enabled()) {
-              sockaddr_in6* v6_addr =
-                  reinterpret_cast<sockaddr_in6*>(address->Address.lpSockaddr);
-              scope_id = v6_addr->sin6_scope_id;
-              ip = IPAddress(v6_addr->sin6_addr);
-
-              if (IsIgnoredIPv6(ip)) {
-                continue;
-              }
-
-              break;
-            } else {
-              continue;
-            }
-          }
-          default: {
-            continue;
-          }
-        }
-
-        IPAddress prefix;
-        int prefix_length = GetPrefix(prefixlist, ip, &prefix);
-        std::string key = MakeNetworkKey(name, prefix, prefix_length);
-        auto existing_network = current_networks.find(key);
-        if (existing_network == current_networks.end()) {
-          AdapterType adapter_type = ADAPTER_TYPE_UNKNOWN;
-          if (adapter_addrs->IfType == IF_TYPE_SOFTWARE_LOOPBACK) {
-            // TODO(phoglund): Need to recognize other types as well.
-            adapter_type = ADAPTER_TYPE_LOOPBACK;
-          }
-          std::unique_ptr<Network> network(new Network(
-              name, description, prefix, prefix_length, adapter_type));
-          network->set_default_local_address_provider(this);
-          network->set_scope_id(scope_id);
-          network->AddIP(ip);
-          bool ignored = IsIgnoredNetwork(*network);
-          network->set_ignored(ignored);
-          if (include_ignored || !network->ignored()) {
-            current_networks[key] = network.get();
-            networks->push_back(network.release());
-          }
-        } else {
-          (*existing_network).second->AddIP(ip);
-        }
-      }
-      // Count is per-adapter - all 'Networks' created from the same
-      // adapter need to have the same name.
-      ++count;
-    }
-    adapter_addrs = adapter_addrs->Next;
-  }
-  return true;
-}
-#endif  // WEBRTC_WIN
-
-#if defined(WEBRTC_LINUX)
-bool IsDefaultRoute(const std::string& network_name) {
-  FileStream fs;
-  if (!fs.Open("/proc/net/route", "r", nullptr)) {
-    LOG(LS_WARNING) << "Couldn't read /proc/net/route, skipping default "
-                    << "route check (assuming everything is a default route).";
-    return true;
-  } else {
-    std::string line;
-    while (fs.ReadLine(&line) == SR_SUCCESS) {
-      char iface_name[256];
-      unsigned int iface_ip, iface_gw, iface_mask, iface_flags;
-      if (sscanf(line.c_str(),
-                 "%255s %8X %8X %4X %*d %*u %*d %8X",
-                 iface_name, &iface_ip, &iface_gw,
-                 &iface_flags, &iface_mask) == 5 &&
-          network_name == iface_name &&
-          iface_mask == 0 &&
-          (iface_flags & (RTF_UP | RTF_HOST)) == RTF_UP) {
-        return true;
-      }
-    }
-  }
-  return false;
-}
-#endif
-
-bool BasicNetworkManager::IsIgnoredNetwork(const Network& network) const {
-  // Ignore networks on the explicit ignore list.
-  for (const std::string& ignored_name : network_ignore_list_) {
-    if (network.name() == ignored_name) {
-      return true;
-    }
-  }
-
-#if defined(WEBRTC_POSIX)
-  // Filter out VMware/VirtualBox interfaces, typically named vmnet1,
-  // vmnet8, or vboxnet0.
-  if (strncmp(network.name().c_str(), "vmnet", 5) == 0 ||
-      strncmp(network.name().c_str(), "vnic", 4) == 0 ||
-      strncmp(network.name().c_str(), "vboxnet", 7) == 0) {
-    return true;
-  }
-#if defined(WEBRTC_LINUX)
-  // Make sure this is a default route, if we're ignoring non-defaults.
-  if (ignore_non_default_routes_ && !IsDefaultRoute(network.name())) {
-    return true;
-  }
-#endif
-#elif defined(WEBRTC_WIN)
-  // Ignore any HOST side vmware adapters with a description like:
-  // VMware Virtual Ethernet Adapter for VMnet1
-  // but don't ignore any GUEST side adapters with a description like:
-  // VMware Accelerated AMD PCNet Adapter #2
-  if (strstr(network.description().c_str(), "VMnet") != nullptr) {
-    return true;
-  }
-#endif
-
-  // Ignore any networks with a 0.x.y.z IP
-  if (network.prefix().family() == AF_INET) {
-    return (network.prefix().v4AddressAsHostOrderInteger() < 0x01000000);
-  }
-
-  return false;
-}
-
-void BasicNetworkManager::StartUpdating() {
-  thread_ = Thread::Current();
-  if (start_count_) {
-    // If network interfaces are already discovered and signal is sent,
-    // we should trigger network signal immediately for the new clients
-    // to start allocating ports.
-    if (sent_first_update_)
-      thread_->Post(RTC_FROM_HERE, this, kSignalNetworksMessage);
-  } else {
-    thread_->Post(RTC_FROM_HERE, this, kUpdateNetworksMessage);
-    StartNetworkMonitor();
-  }
-  ++start_count_;
-}
-
-void BasicNetworkManager::StopUpdating() {
-  RTC_DCHECK(Thread::Current() == thread_);
-  if (!start_count_)
-    return;
-
-  --start_count_;
-  if (!start_count_) {
-    thread_->Clear(this);
-    sent_first_update_ = false;
-    StopNetworkMonitor();
-  }
-}
-
-void BasicNetworkManager::StartNetworkMonitor() {
-  NetworkMonitorFactory* factory = NetworkMonitorFactory::GetFactory();
-  if (factory == nullptr) {
-    return;
-  }
-  if (!network_monitor_) {
-    network_monitor_.reset(factory->CreateNetworkMonitor());
-    if (!network_monitor_) {
-      return;
-    }
-    network_monitor_->SignalNetworksChanged.connect(
-        this, &BasicNetworkManager::OnNetworksChanged);
-  }
-  network_monitor_->Start();
-}
-
-void BasicNetworkManager::StopNetworkMonitor() {
-  if (!network_monitor_) {
-    return;
-  }
-  network_monitor_->Stop();
-}
-
-void BasicNetworkManager::OnMessage(Message* msg) {
-  switch (msg->message_id) {
-    case kUpdateNetworksMessage: {
-      UpdateNetworksContinually();
-      break;
-    }
-    case kSignalNetworksMessage:  {
-      SignalNetworksChanged();
-      break;
-    }
-    default:
-      RTC_NOTREACHED();
-  }
-}
-
-AdapterType BasicNetworkManager::GetAdapterTypeFromName(
-    const char* network_name) const {
-  // If there is a network_monitor, use it to get the adapter type.
-  // Otherwise, get the adapter type based on a few name matching rules.
-  if (network_monitor_) {
-    AdapterType type = network_monitor_->GetAdapterType(network_name);
-    if (type != ADAPTER_TYPE_UNKNOWN) {
-      return type;
-    }
-  }
-  if (strncmp(network_name, "ipsec", 5) == 0) {
-    return ADAPTER_TYPE_VPN;
-  }
-#if defined(WEBRTC_IOS)
-  // Cell networks are pdp_ipN on iOS.
-  if (strncmp(network_name, "pdp_ip", 6) == 0) {
-    return ADAPTER_TYPE_CELLULAR;
-  }
-  if (strncmp(network_name, "en", 2) == 0) {
-    // This may not be most accurate because sometimes Ethernet interface
-    // name also starts with "en" but it is better than showing it as
-    // "unknown" type.
-    // TODO(honghaiz): Write a proper IOS network manager.
-    return ADAPTER_TYPE_WIFI;
-  }
-#elif defined(WEBRTC_ANDROID)
-  if (strncmp(network_name, "rmnet", 5) == 0 ||
-      strncmp(network_name, "v4-rmnet", 8) == 0) {
-    return ADAPTER_TYPE_CELLULAR;
-  }
-  if (strncmp(network_name, "wlan", 4) == 0) {
-    return ADAPTER_TYPE_WIFI;
-  }
-#endif
-
-  return ADAPTER_TYPE_UNKNOWN;
-}
-
-IPAddress BasicNetworkManager::QueryDefaultLocalAddress(int family) const {
-  RTC_DCHECK(thread_ == Thread::Current());
-  RTC_DCHECK(thread_->socketserver() != nullptr);
-  RTC_DCHECK(family == AF_INET || family == AF_INET6);
-
-  std::unique_ptr<AsyncSocket> socket(
-      thread_->socketserver()->CreateAsyncSocket(family, SOCK_DGRAM));
-  if (!socket) {
-    LOG_ERR(LERROR) << "Socket creation failed";
-    return IPAddress();
-  }
-
-  if (socket->Connect(SocketAddress(
-          family == AF_INET ? kPublicIPv4Host : kPublicIPv6Host, kPublicPort)) <
-      0) {
-    if (socket->GetError() != ENETUNREACH
-        && socket->GetError() != EHOSTUNREACH) {
-      // Ignore the expected case of "host/net unreachable" - which happens if
-      // the network is V4- or V6-only.
-      LOG(LS_INFO) << "Connect failed with " << socket->GetError();
-    }
-    return IPAddress();
-  }
-  return socket->GetLocalAddress().ipaddr();
-}
-
-void BasicNetworkManager::UpdateNetworksOnce() {
-  if (!start_count_)
-    return;
-
-  RTC_DCHECK(Thread::Current() == thread_);
-
-  NetworkList list;
-  if (!CreateNetworks(false, &list)) {
-    SignalError();
-  } else {
-    bool changed;
-    NetworkManager::Stats stats;
-    MergeNetworkList(list, &changed, &stats);
-    set_default_local_addresses(QueryDefaultLocalAddress(AF_INET),
-                                QueryDefaultLocalAddress(AF_INET6));
-    if (changed || !sent_first_update_) {
-      SignalNetworksChanged();
-      sent_first_update_ = true;
-    }
-  }
-}
-
-void BasicNetworkManager::UpdateNetworksContinually() {
-  UpdateNetworksOnce();
-  thread_->PostDelayed(RTC_FROM_HERE, kNetworksUpdateIntervalMs, this,
-                       kUpdateNetworksMessage);
-}
-
-void BasicNetworkManager::DumpNetworks() {
-  NetworkList list;
-  GetNetworks(&list);
-  LOG(LS_INFO) << "NetworkManager detected " << list.size() << " networks:";
-  for (const Network* network : list) {
-    LOG(LS_INFO) << network->ToString() << ": " << network->description()
-                 << ", active ? " << network->active()
-                 << ((network->ignored()) ? ", Ignored" : "");
-  }
-}
-
-Network::Network(const std::string& name,
-                 const std::string& desc,
-                 const IPAddress& prefix,
-                 int prefix_length)
-    : name_(name),
-      description_(desc),
-      prefix_(prefix),
-      prefix_length_(prefix_length),
-      key_(MakeNetworkKey(name, prefix, prefix_length)),
-      scope_id_(0),
-      ignored_(false),
-      type_(ADAPTER_TYPE_UNKNOWN),
-      preference_(0) {}
-
-Network::Network(const std::string& name,
-                 const std::string& desc,
-                 const IPAddress& prefix,
-                 int prefix_length,
-                 AdapterType type)
-    : name_(name),
-      description_(desc),
-      prefix_(prefix),
-      prefix_length_(prefix_length),
-      key_(MakeNetworkKey(name, prefix, prefix_length)),
-      scope_id_(0),
-      ignored_(false),
-      type_(type),
-      preference_(0) {}
-
-Network::~Network() = default;
-
-// Sets the addresses of this network. Returns true if the address set changed.
-// Change detection is short circuited if the changed argument is true.
-bool Network::SetIPs(const std::vector<InterfaceAddress>& ips, bool changed) {
-  // Detect changes with a nested loop; n-squared but we expect on the order
-  // of 2-3 addresses per network.
-  changed = changed || ips.size() != ips_.size();
-  if (!changed) {
-    for (const InterfaceAddress& ip : ips) {
-      if (std::find(ips_.begin(), ips_.end(), ip) == ips_.end()) {
-        changed = true;
-        break;
-      }
-    }
-  }
-
-  ips_ = ips;
-  return changed;
-}
-
-// Select the best IP address to use from this Network.
-IPAddress Network::GetBestIP() const {
-  if (ips_.size() == 0) {
-    return IPAddress();
-  }
-
-  if (prefix_.family() == AF_INET) {
-    return static_cast<IPAddress>(ips_.at(0));
-  }
-
-  InterfaceAddress selected_ip, ula_ip;
-
-  for (const InterfaceAddress& ip : ips_) {
-    // Ignore any address which has been deprecated already.
-    if (ip.ipv6_flags() & IPV6_ADDRESS_FLAG_DEPRECATED)
-      continue;
-
-    // ULA address should only be returned when we have no other
-    // global IP.
-    if (IPIsULA(static_cast<const IPAddress&>(ip))) {
-      ula_ip = ip;
-      continue;
-    }
-    selected_ip = ip;
-
-    // Search could stop once a temporary non-deprecated one is found.
-    if (ip.ipv6_flags() & IPV6_ADDRESS_FLAG_TEMPORARY)
-      break;
-  }
-
-  // No proper global IPv6 address found, use ULA instead.
-  if (IPIsUnspec(selected_ip) && !IPIsUnspec(ula_ip)) {
-    selected_ip = ula_ip;
-  }
-
-  return static_cast<IPAddress>(selected_ip);
-}
-
-std::string Network::ToString() const {
-  std::stringstream ss;
-  // Print out the first space-terminated token of the network desc, plus
-  // the IP address.
-  ss << "Net[" << description_.substr(0, description_.find(' '))
-     << ":" << prefix_.ToSensitiveString() << "/" << prefix_length_
-     << ":" << AdapterTypeToString(type_) << "]";
-  return ss.str();
-}
-
-}  // namespace rtc
diff --git a/rtc_base/network.h b/rtc_base/network.h
deleted file mode 100644
index ceb96c4..0000000
--- a/rtc_base/network.h
+++ /dev/null
@@ -1,434 +0,0 @@
-/*
- *  Copyright 2004 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_RTC_BASE_NETWORK_H_
-#define WEBRTC_RTC_BASE_NETWORK_H_
-
-#include <stdint.h>
-
-#include <deque>
-#include <map>
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "webrtc/rtc_base/ipaddress.h"
-#include "webrtc/rtc_base/messagehandler.h"
-#include "webrtc/rtc_base/networkmonitor.h"
-#include "webrtc/rtc_base/sigslot.h"
-
-#if defined(WEBRTC_POSIX)
-struct ifaddrs;
-#endif  // defined(WEBRTC_POSIX)
-
-namespace rtc {
-
-extern const char kPublicIPv4Host[];
-extern const char kPublicIPv6Host[];
-
-class IfAddrsConverter;
-class Network;
-class NetworkMonitorInterface;
-class Thread;
-
-static const uint16_t kNetworkCostMax = 999;
-static const uint16_t kNetworkCostHigh = 900;
-static const uint16_t kNetworkCostUnknown = 50;
-static const uint16_t kNetworkCostLow = 10;
-static const uint16_t kNetworkCostMin = 0;
-
-// By default, ignore loopback interfaces on the host.
-const int kDefaultNetworkIgnoreMask = ADAPTER_TYPE_LOOPBACK;
-
-// Makes a string key for this network. Used in the network manager's maps.
-// Network objects are keyed on interface name, network prefix and the
-// length of that prefix.
-std::string MakeNetworkKey(const std::string& name, const IPAddress& prefix,
-                           int prefix_length);
-
-class DefaultLocalAddressProvider {
- public:
-  virtual ~DefaultLocalAddressProvider() = default;
-  // The default local address is the local address used in multi-homed endpoint
-  // when the any address (0.0.0.0 or ::) is used as the local address. It's
-  // important to check the return value as a IP family may not be enabled.
-  virtual bool GetDefaultLocalAddress(int family, IPAddress* ipaddr) const = 0;
-};
-
-// Generic network manager interface. It provides list of local
-// networks.
-//
-// Every method of NetworkManager (including the destructor) must be called on
-// the same thread, except for the constructor which may be called on any
-// thread.
-//
-// This allows constructing a NetworkManager subclass on one thread and
-// passing it into an object that uses it on a different thread.
-class NetworkManager : public DefaultLocalAddressProvider {
- public:
-  typedef std::vector<Network*> NetworkList;
-
-  // This enum indicates whether adapter enumeration is allowed.
-  enum EnumerationPermission {
-    ENUMERATION_ALLOWED,  // Adapter enumeration is allowed. Getting 0 network
-                          // from GetNetworks means that there is no network
-                          // available.
-    ENUMERATION_BLOCKED,  // Adapter enumeration is disabled.
-                          // GetAnyAddressNetworks() should be used instead.
-  };
-
-  NetworkManager();
-  ~NetworkManager() override;
-
-  // Called when network list is updated.
-  sigslot::signal0<> SignalNetworksChanged;
-
-  // Indicates a failure when getting list of network interfaces.
-  sigslot::signal0<> SignalError;
-
-  // This should be called on the NetworkManager's thread before the
-  // NetworkManager is used. Subclasses may override this if necessary.
-  virtual void Initialize() {}
-
-  // Start/Stop monitoring of network interfaces
-  // list. SignalNetworksChanged or SignalError is emitted immediately
-  // after StartUpdating() is called. After that SignalNetworksChanged
-  // is emitted whenever list of networks changes.
-  virtual void StartUpdating() = 0;
-  virtual void StopUpdating() = 0;
-
-  // Returns the current list of networks available on this machine.
-  // StartUpdating() must be called before this method is called.
-  // It makes sure that repeated calls return the same object for a
-  // given network, so that quality is tracked appropriately. Does not
-  // include ignored networks.
-  virtual void GetNetworks(NetworkList* networks) const = 0;
-
-  // return the current permission state of GetNetworks()
-  virtual EnumerationPermission enumeration_permission() const;
-
-  // "AnyAddressNetwork" is a network which only contains single "any address"
-  // IP address.  (i.e. INADDR_ANY for IPv4 or in6addr_any for IPv6). This is
-  // useful as binding to such interfaces allow default routing behavior like
-  // http traffic.
-  //
-  // This method appends the "any address" networks to the list, such that this
-  // can optionally be called after GetNetworks.
-  //
-  // TODO(guoweis): remove this body when chromium implements this.
-  virtual void GetAnyAddressNetworks(NetworkList* networks) {}
-
-  // Dumps the current list of networks in the network manager.
-  virtual void DumpNetworks() {}
-  bool GetDefaultLocalAddress(int family, IPAddress* ipaddr) const override;
-
-  struct Stats {
-    int ipv4_network_count;
-    int ipv6_network_count;
-    Stats() {
-      ipv4_network_count = 0;
-      ipv6_network_count = 0;
-    }
-  };
-};
-
-// Base class for NetworkManager implementations.
-class NetworkManagerBase : public NetworkManager {
- public:
-  NetworkManagerBase();
-  ~NetworkManagerBase() override;
-
-  void GetNetworks(NetworkList* networks) const override;
-  void GetAnyAddressNetworks(NetworkList* networks) override;
-
-  // Defaults to true.
-  // TODO(deadbeef): Remove this. Nothing but tests use this; IPv6 is enabled
-  // by default everywhere else.
-  bool ipv6_enabled() const { return ipv6_enabled_; }
-  void set_ipv6_enabled(bool enabled) { ipv6_enabled_ = enabled; }
-
-  EnumerationPermission enumeration_permission() const override;
-
-  bool GetDefaultLocalAddress(int family, IPAddress* ipaddr) const override;
-
- protected:
-  typedef std::map<std::string, Network*> NetworkMap;
-  // Updates |networks_| with the networks listed in |list|. If
-  // |network_map_| already has a Network object for a network listed
-  // in the |list| then it is reused. Accept ownership of the Network
-  // objects in the |list|. |changed| will be set to true if there is
-  // any change in the network list.
-  void MergeNetworkList(const NetworkList& list, bool* changed);
-
-  // |stats| will be populated even if |*changed| is false.
-  void MergeNetworkList(const NetworkList& list,
-                        bool* changed,
-                        NetworkManager::Stats* stats);
-
-  void set_enumeration_permission(EnumerationPermission state) {
-    enumeration_permission_ = state;
-  }
-
-  void set_default_local_addresses(const IPAddress& ipv4,
-                                   const IPAddress& ipv6);
-
- private:
-  friend class NetworkTest;
-
-  Network* GetNetworkFromAddress(const rtc::IPAddress& ip) const;
-
-  EnumerationPermission enumeration_permission_;
-
-  NetworkList networks_;
-
-  NetworkMap networks_map_;
-  bool ipv6_enabled_;
-
-  std::unique_ptr<rtc::Network> ipv4_any_address_network_;
-  std::unique_ptr<rtc::Network> ipv6_any_address_network_;
-
-  IPAddress default_local_ipv4_address_;
-  IPAddress default_local_ipv6_address_;
-  // We use 16 bits to save the bandwidth consumption when sending the network
-  // id over the Internet. It is OK that the 16-bit integer overflows to get a
-  // network id 0 because we only compare the network ids in the old and the new
-  // best connections in the transport channel.
-  uint16_t next_available_network_id_ = 1;
-};
-
-// Basic implementation of the NetworkManager interface that gets list
-// of networks using OS APIs.
-class BasicNetworkManager : public NetworkManagerBase,
-                            public MessageHandler,
-                            public sigslot::has_slots<> {
- public:
-  BasicNetworkManager();
-  ~BasicNetworkManager() override;
-
-  void StartUpdating() override;
-  void StopUpdating() override;
-
-  void DumpNetworks() override;
-
-  // MessageHandler interface.
-  void OnMessage(Message* msg) override;
-  bool started() { return start_count_ > 0; }
-
-  // Sets the network ignore list, which is empty by default. Any network on the
-  // ignore list will be filtered from network enumeration results.
-  void set_network_ignore_list(const std::vector<std::string>& list) {
-    network_ignore_list_ = list;
-  }
-
-#if defined(WEBRTC_LINUX)
-  // Sets the flag for ignoring non-default routes.
-  // Defaults to false.
-  void set_ignore_non_default_routes(bool value) {
-    ignore_non_default_routes_ = value;
-  }
-#endif
-
- protected:
-#if defined(WEBRTC_POSIX)
-  // Separated from CreateNetworks for tests.
-  void ConvertIfAddrs(ifaddrs* interfaces,
-                      IfAddrsConverter* converter,
-                      bool include_ignored,
-                      NetworkList* networks) const;
-#endif  // defined(WEBRTC_POSIX)
-
-  // Creates a network object for each network available on the machine.
-  bool CreateNetworks(bool include_ignored, NetworkList* networks) const;
-
-  // Determines if a network should be ignored. This should only be determined
-  // based on the network's property instead of any individual IP.
-  bool IsIgnoredNetwork(const Network& network) const;
-
-  // This function connects a UDP socket to a public address and returns the
-  // local address associated it. Since it binds to the "any" address
-  // internally, it returns the default local address on a multi-homed endpoint.
-  IPAddress QueryDefaultLocalAddress(int family) const;
-
- private:
-  friend class NetworkTest;
-
-  // Creates a network monitor and listens for network updates.
-  void StartNetworkMonitor();
-  // Stops and removes the network monitor.
-  void StopNetworkMonitor();
-  // Called when it receives updates from the network monitor.
-  void OnNetworksChanged();
-
-  // Updates the networks and reschedules the next update.
-  void UpdateNetworksContinually();
-  // Only updates the networks; does not reschedule the next update.
-  void UpdateNetworksOnce();
-
-  AdapterType GetAdapterTypeFromName(const char* network_name) const;
-
-  Thread* thread_;
-  bool sent_first_update_;
-  int start_count_;
-  std::vector<std::string> network_ignore_list_;
-  bool ignore_non_default_routes_;
-  std::unique_ptr<NetworkMonitorInterface> network_monitor_;
-};
-
-// Represents a Unix-type network interface, with a name and single address.
-class Network {
- public:
-  Network(const std::string& name,
-          const std::string& description,
-          const IPAddress& prefix,
-          int prefix_length);
-
-  Network(const std::string& name,
-          const std::string& description,
-          const IPAddress& prefix,
-          int prefix_length,
-          AdapterType type);
-  ~Network();
-
-  sigslot::signal1<const Network*> SignalTypeChanged;
-
-  const DefaultLocalAddressProvider* default_local_address_provider() {
-    return default_local_address_provider_;
-  }
-  void set_default_local_address_provider(
-      const DefaultLocalAddressProvider* provider) {
-    default_local_address_provider_ = provider;
-  }
-
-  // Returns the name of the interface this network is associated wtih.
-  const std::string& name() const { return name_; }
-
-  // Returns the OS-assigned name for this network. This is useful for
-  // debugging but should not be sent over the wire (for privacy reasons).
-  const std::string& description() const { return description_; }
-
-  // Returns the prefix for this network.
-  const IPAddress& prefix() const { return prefix_; }
-  // Returns the length, in bits, of this network's prefix.
-  int prefix_length() const { return prefix_length_; }
-
-  // |key_| has unique value per network interface. Used in sorting network
-  // interfaces. Key is derived from interface name and it's prefix.
-  std::string key() const { return key_; }
-
-  // Returns the Network's current idea of the 'best' IP it has.
-  // Or return an unset IP if this network has no active addresses.
-  // Here is the rule on how we mark the IPv6 address as ignorable for WebRTC.
-  // 1) return all global temporary dynamic and non-deprecrated ones.
-  // 2) if #1 not available, return global ones.
-  // 3) if #2 not available, use ULA ipv6 as last resort. (ULA stands
-  // for unique local address, which is not route-able in open
-  // internet but might be useful for a close WebRTC deployment.
-
-  // TODO(guoweis): rule #3 actually won't happen at current
-  // implementation. The reason being that ULA address starting with
-  // 0xfc 0r 0xfd will be grouped into its own Network. The result of
-  // that is WebRTC will have one extra Network to generate candidates
-  // but the lack of rule #3 shouldn't prevent turning on IPv6 since
-  // ULA should only be tried in a close deployment anyway.
-
-  // Note that when not specifying any flag, it's treated as case global
-  // IPv6 address
-  IPAddress GetBestIP() const;
-
-  // Keep the original function here for now.
-  // TODO(guoweis): Remove this when all callers are migrated to GetBestIP().
-  IPAddress ip() const { return GetBestIP(); }
-
-  // Adds an active IP address to this network. Does not check for duplicates.
-  void AddIP(const InterfaceAddress& ip) { ips_.push_back(ip); }
-
-  // Sets the network's IP address list. Returns true if new IP addresses were
-  // detected. Passing true to already_changed skips this check.
-  bool SetIPs(const std::vector<InterfaceAddress>& ips, bool already_changed);
-  // Get the list of IP Addresses associated with this network.
-  const std::vector<InterfaceAddress>& GetIPs() const { return ips_;}
-  // Clear the network's list of addresses.
-  void ClearIPs() { ips_.clear(); }
-
-  // Returns the scope-id of the network's address.
-  // Should only be relevant for link-local IPv6 addresses.
-  int scope_id() const { return scope_id_; }
-  void set_scope_id(int id) { scope_id_ = id; }
-
-  // Indicates whether this network should be ignored, perhaps because
-  // the IP is 0, or the interface is one we know is invalid.
-  bool ignored() const { return ignored_; }
-  void set_ignored(bool ignored) { ignored_ = ignored; }
-
-  AdapterType type() const { return type_; }
-  void set_type(AdapterType type) {
-    if (type_ == type) {
-      return;
-    }
-    type_ = type;
-    SignalTypeChanged(this);
-  }
-
-  uint16_t GetCost() const {
-    switch (type_) {
-      case rtc::ADAPTER_TYPE_ETHERNET:
-      case rtc::ADAPTER_TYPE_LOOPBACK:
-        return kNetworkCostMin;
-      case rtc::ADAPTER_TYPE_WIFI:
-      case rtc::ADAPTER_TYPE_VPN:
-        return kNetworkCostLow;
-      case rtc::ADAPTER_TYPE_CELLULAR:
-        return kNetworkCostHigh;
-      default:
-        return kNetworkCostUnknown;
-    }
-  }
-  // A unique id assigned by the network manager, which may be signaled
-  // to the remote side in the candidate.
-  uint16_t id() const { return id_; }
-  void set_id(uint16_t id) { id_ = id; }
-
-  int preference() const { return preference_; }
-  void set_preference(int preference) { preference_ = preference; }
-
-  // When we enumerate networks and find a previously-seen network is missing,
-  // we do not remove it (because it may be used elsewhere). Instead, we mark
-  // it inactive, so that we can detect network changes properly.
-  bool active() const { return active_; }
-  void set_active(bool active) {
-    if (active_ != active) {
-      active_ = active;
-    }
-  }
-
-  // Debugging description of this network
-  std::string ToString() const;
-
- private:
-  const DefaultLocalAddressProvider* default_local_address_provider_ = nullptr;
-  std::string name_;
-  std::string description_;
-  IPAddress prefix_;
-  int prefix_length_;
-  std::string key_;
-  std::vector<InterfaceAddress> ips_;
-  int scope_id_;
-  bool ignored_;
-  AdapterType type_;
-  int preference_;
-  bool active_ = true;
-  uint16_t id_ = 0;
-
-  friend class NetworkManager;
-};
-
-}  // namespace rtc
-
-#endif  // WEBRTC_RTC_BASE_NETWORK_H_
diff --git a/rtc_base/network_unittest.cc b/rtc_base/network_unittest.cc
deleted file mode 100644
index 9af9294..0000000
--- a/rtc_base/network_unittest.cc
+++ /dev/null
@@ -1,1149 +0,0 @@
-/*
- *  Copyright 2004 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/rtc_base/network.h"
-
-#include <stdlib.h>
-
-#include <memory>
-#include <vector>
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/nethelpers.h"
-#include "webrtc/rtc_base/networkmonitor.h"
-#if defined(WEBRTC_POSIX)
-#include <sys/types.h>
-#include <net/if.h>
-#include "webrtc/rtc_base/ifaddrs_converter.h"
-#endif  // defined(WEBRTC_POSIX)
-#include "webrtc/rtc_base/gunit.h"
-#if defined(WEBRTC_WIN)
-#include "webrtc/rtc_base/logging.h"  // For LOG_GLE
-#endif
-
-namespace rtc {
-
-namespace {
-
-class FakeNetworkMonitor : public NetworkMonitorBase {
- public:
-  void Start() override { started_ = true; }
-  void Stop() override { started_ = false; }
-  bool started() { return started_; }
-  AdapterType GetAdapterType(const std::string& if_name) override {
-    // Note that the name matching rules are different from the
-    // GetAdapterTypeFromName in NetworkManager.
-    if (if_name.find("wifi") == 0) {
-      return ADAPTER_TYPE_WIFI;
-    }
-    if (if_name.find("cellular") == 0) {
-      return ADAPTER_TYPE_CELLULAR;
-    }
-    return ADAPTER_TYPE_UNKNOWN;
-  }
-
- private:
-  bool started_ = false;
-};
-
-class FakeNetworkMonitorFactory : public NetworkMonitorFactory {
- public:
-  FakeNetworkMonitorFactory() {}
-  NetworkMonitorInterface* CreateNetworkMonitor() override {
-    return new FakeNetworkMonitor();
-  }
-};
-
-}  // namespace
-
-class NetworkTest : public testing::Test, public sigslot::has_slots<>  {
- public:
-  NetworkTest() : callback_called_(false) {}
-
-  void OnNetworksChanged() {
-    callback_called_ = true;
-  }
-
-  NetworkManager::Stats MergeNetworkList(
-      BasicNetworkManager& network_manager,
-      const NetworkManager::NetworkList& list,
-      bool* changed) {
-    NetworkManager::Stats stats;
-    network_manager.MergeNetworkList(list, changed, &stats);
-    return stats;
-  }
-
-  bool IsIgnoredNetwork(BasicNetworkManager& network_manager,
-                        const Network& network) {
-    return network_manager.IsIgnoredNetwork(network);
-  }
-
-  NetworkManager::NetworkList GetNetworks(
-      const BasicNetworkManager& network_manager, bool include_ignored) {
-    NetworkManager::NetworkList list;
-    network_manager.CreateNetworks(include_ignored, &list);
-    return list;
-  }
-
-  FakeNetworkMonitor* GetNetworkMonitor(BasicNetworkManager& network_manager) {
-    return static_cast<FakeNetworkMonitor*>(
-        network_manager.network_monitor_.get());
-  }
-  void ClearNetworks(BasicNetworkManager& network_manager) {
-    for (const auto& kv : network_manager.networks_map_) {
-      delete kv.second;
-    }
-    network_manager.networks_.clear();
-    network_manager.networks_map_.clear();
-  }
-
-  AdapterType GetAdapterType(BasicNetworkManager& network_manager) {
-    BasicNetworkManager::NetworkList list;
-    network_manager.GetNetworks(&list);
-    RTC_CHECK_EQ(1, list.size());
-    return list[0]->type();
-  }
-
-#if defined(WEBRTC_POSIX)
-  // Separated from CreateNetworks for tests.
-  static void CallConvertIfAddrs(const BasicNetworkManager& network_manager,
-                                 struct ifaddrs* interfaces,
-                                 bool include_ignored,
-                                 NetworkManager::NetworkList* networks) {
-    // Use the base IfAddrsConverter for test cases.
-    std::unique_ptr<IfAddrsConverter> ifaddrs_converter(new IfAddrsConverter());
-    network_manager.ConvertIfAddrs(interfaces, ifaddrs_converter.get(),
-                                   include_ignored, networks);
-  }
-
-  struct sockaddr_in6* CreateIpv6Addr(const std::string& ip_string,
-                                      uint32_t scope_id) {
-    struct sockaddr_in6* ipv6_addr = static_cast<struct sockaddr_in6*>(
-        malloc(sizeof(struct sockaddr_in6)));
-    memset(ipv6_addr, 0, sizeof(struct sockaddr_in6));
-    ipv6_addr->sin6_family = AF_INET6;
-    ipv6_addr->sin6_scope_id = scope_id;
-    IPAddress ip;
-    IPFromString(ip_string, &ip);
-    ipv6_addr->sin6_addr = ip.ipv6_address();
-    return ipv6_addr;
-  }
-
-  // Pointers created here need to be released via ReleaseIfAddrs.
-  struct ifaddrs* AddIpv6Address(struct ifaddrs* list,
-                                 char* if_name,
-                                 const std::string& ipv6_address,
-                                 const std::string& ipv6_netmask,
-                                 uint32_t scope_id) {
-    struct ifaddrs* if_addr = new struct ifaddrs;
-    memset(if_addr, 0, sizeof(struct ifaddrs));
-    if_addr->ifa_name = if_name;
-    if_addr->ifa_addr = reinterpret_cast<struct sockaddr*>(
-        CreateIpv6Addr(ipv6_address, scope_id));
-    if_addr->ifa_netmask =
-        reinterpret_cast<struct sockaddr*>(CreateIpv6Addr(ipv6_netmask, 0));
-    if_addr->ifa_next = list;
-    if_addr->ifa_flags = IFF_RUNNING;
-    return if_addr;
-  }
-
-  struct ifaddrs* InstallIpv6Network(char* if_name,
-                                     const std::string& ipv6_address,
-                                     const std::string& ipv6_mask,
-                                     BasicNetworkManager& network_manager) {
-    ifaddrs* addr_list = nullptr;
-    addr_list = AddIpv6Address(addr_list, if_name, ipv6_address, ipv6_mask, 0);
-    NetworkManager::NetworkList result;
-    bool changed;
-    NetworkManager::Stats stats;
-    CallConvertIfAddrs(network_manager, addr_list, true, &result);
-    network_manager.MergeNetworkList(result, &changed, &stats);
-    return addr_list;
-  }
-
-  void ReleaseIfAddrs(struct ifaddrs* list) {
-    struct ifaddrs* if_addr = list;
-    while (if_addr != nullptr) {
-      struct ifaddrs* next_addr = if_addr->ifa_next;
-      free(if_addr->ifa_addr);
-      free(if_addr->ifa_netmask);
-      delete if_addr;
-      if_addr = next_addr;
-    }
-  }
-#endif  // defined(WEBRTC_POSIX)
-
- protected:
-  bool callback_called_;
-};
-
-class TestBasicNetworkManager : public BasicNetworkManager {
- public:
-  using BasicNetworkManager::QueryDefaultLocalAddress;
-  using BasicNetworkManager::set_default_local_addresses;
-};
-
-// Test that the Network ctor works properly.
-TEST_F(NetworkTest, TestNetworkConstruct) {
-  Network ipv4_network1("test_eth0", "Test Network Adapter 1",
-                        IPAddress(0x12345600U), 24);
-  EXPECT_EQ("test_eth0", ipv4_network1.name());
-  EXPECT_EQ("Test Network Adapter 1", ipv4_network1.description());
-  EXPECT_EQ(IPAddress(0x12345600U), ipv4_network1.prefix());
-  EXPECT_EQ(24, ipv4_network1.prefix_length());
-  EXPECT_FALSE(ipv4_network1.ignored());
-}
-
-TEST_F(NetworkTest, TestIsIgnoredNetworkIgnoresIPsStartingWith0) {
-  Network ipv4_network1("test_eth0", "Test Network Adapter 1",
-                        IPAddress(0x12345600U), 24, ADAPTER_TYPE_ETHERNET);
-  Network ipv4_network2("test_eth1", "Test Network Adapter 2",
-                        IPAddress(0x010000U), 24, ADAPTER_TYPE_ETHERNET);
-  BasicNetworkManager network_manager;
-  EXPECT_FALSE(IsIgnoredNetwork(network_manager, ipv4_network1));
-  EXPECT_TRUE(IsIgnoredNetwork(network_manager, ipv4_network2));
-}
-
-// TODO(phoglund): Remove when ignore list goes away.
-TEST_F(NetworkTest, TestIgnoreList) {
-  Network ignore_me("ignore_me", "Ignore me please!",
-                    IPAddress(0x12345600U), 24);
-  Network include_me("include_me", "Include me please!",
-                     IPAddress(0x12345600U), 24);
-  BasicNetworkManager network_manager;
-  EXPECT_FALSE(IsIgnoredNetwork(network_manager, ignore_me));
-  EXPECT_FALSE(IsIgnoredNetwork(network_manager, include_me));
-  std::vector<std::string> ignore_list;
-  ignore_list.push_back("ignore_me");
-  network_manager.set_network_ignore_list(ignore_list);
-  EXPECT_TRUE(IsIgnoredNetwork(network_manager, ignore_me));
-  EXPECT_FALSE(IsIgnoredNetwork(network_manager, include_me));
-}
-
-// Test is failing on Windows opt: b/11288214
-TEST_F(NetworkTest, DISABLED_TestCreateNetworks) {
-  BasicNetworkManager manager;
-  NetworkManager::NetworkList result = GetNetworks(manager, true);
-  // We should be able to bind to any addresses we find.
-  NetworkManager::NetworkList::iterator it;
-  for (it = result.begin();
-       it != result.end();
-       ++it) {
-    sockaddr_storage storage;
-    memset(&storage, 0, sizeof(storage));
-    IPAddress ip = (*it)->GetBestIP();
-    SocketAddress bindaddress(ip, 0);
-    bindaddress.SetScopeID((*it)->scope_id());
-    // TODO(thaloun): Use rtc::AsyncSocket once it supports IPv6.
-    int fd = static_cast<int>(socket(ip.family(), SOCK_STREAM, IPPROTO_TCP));
-    if (fd > 0) {
-      size_t ipsize = bindaddress.ToSockAddrStorage(&storage);
-      EXPECT_GE(ipsize, 0U);
-      int success = ::bind(fd,
-                           reinterpret_cast<sockaddr*>(&storage),
-                           static_cast<int>(ipsize));
-#if defined(WEBRTC_WIN)
-      if (success) LOG_GLE(LS_ERROR) << "Socket bind failed.";
-#endif
-      EXPECT_EQ(0, success);
-#if defined(WEBRTC_WIN)
-      closesocket(fd);
-#else
-      close(fd);
-#endif
-    }
-    delete (*it);
-  }
-}
-
-// Test StartUpdating() and StopUpdating(). network_permission_state starts with
-// ALLOWED.
-TEST_F(NetworkTest, TestUpdateNetworks) {
-  BasicNetworkManager manager;
-  manager.SignalNetworksChanged.connect(
-      static_cast<NetworkTest*>(this), &NetworkTest::OnNetworksChanged);
-  EXPECT_EQ(NetworkManager::ENUMERATION_ALLOWED,
-            manager.enumeration_permission());
-  manager.StartUpdating();
-  Thread::Current()->ProcessMessages(0);
-  EXPECT_TRUE(callback_called_);
-  callback_called_ = false;
-  // Callback should be triggered immediately when StartUpdating
-  // is called, after network update signal is already sent.
-  manager.StartUpdating();
-  EXPECT_TRUE(manager.started());
-  Thread::Current()->ProcessMessages(0);
-  EXPECT_TRUE(callback_called_);
-  manager.StopUpdating();
-  EXPECT_TRUE(manager.started());
-  manager.StopUpdating();
-  EXPECT_EQ(NetworkManager::ENUMERATION_ALLOWED,
-            manager.enumeration_permission());
-  EXPECT_FALSE(manager.started());
-  manager.StopUpdating();
-  EXPECT_FALSE(manager.started());
-  callback_called_ = false;
-  // Callback should be triggered immediately after StartUpdating is called
-  // when start_count_ is reset to 0.
-  manager.StartUpdating();
-  Thread::Current()->ProcessMessages(0);
-  EXPECT_TRUE(callback_called_);
-}
-
-// Verify that MergeNetworkList() merges network lists properly.
-TEST_F(NetworkTest, TestBasicMergeNetworkList) {
-  Network ipv4_network1("test_eth0", "Test Network Adapter 1",
-                        IPAddress(0x12345600U), 24);
-  Network ipv4_network2("test_eth1", "Test Network Adapter 2",
-                        IPAddress(0x00010000U), 16);
-  ipv4_network1.AddIP(IPAddress(0x12345678));
-  ipv4_network2.AddIP(IPAddress(0x00010004));
-  BasicNetworkManager manager;
-
-  // Add ipv4_network1 to the list of networks.
-  NetworkManager::NetworkList list;
-  list.push_back(new Network(ipv4_network1));
-  bool changed;
-  NetworkManager::Stats stats = MergeNetworkList(manager, list, &changed);
-  EXPECT_TRUE(changed);
-  EXPECT_EQ(stats.ipv6_network_count, 0);
-  EXPECT_EQ(stats.ipv4_network_count, 1);
-  list.clear();
-
-  manager.GetNetworks(&list);
-  EXPECT_EQ(1U, list.size());
-  EXPECT_EQ(ipv4_network1.ToString(), list[0]->ToString());
-  Network* net1 = list[0];
-  uint16_t net_id1 = net1->id();
-  EXPECT_EQ(1, net_id1);
-  list.clear();
-
-  // Replace ipv4_network1 with ipv4_network2.
-  list.push_back(new Network(ipv4_network2));
-  stats = MergeNetworkList(manager, list, &changed);
-  EXPECT_TRUE(changed);
-  EXPECT_EQ(stats.ipv6_network_count, 0);
-  EXPECT_EQ(stats.ipv4_network_count, 1);
-  list.clear();
-
-  manager.GetNetworks(&list);
-  EXPECT_EQ(1U, list.size());
-  EXPECT_EQ(ipv4_network2.ToString(), list[0]->ToString());
-  Network* net2 = list[0];
-  uint16_t net_id2 = net2->id();
-  // Network id will increase.
-  EXPECT_LT(net_id1, net_id2);
-  list.clear();
-
-  // Add Network2 back.
-  list.push_back(new Network(ipv4_network1));
-  list.push_back(new Network(ipv4_network2));
-  stats = MergeNetworkList(manager, list, &changed);
-  EXPECT_TRUE(changed);
-  EXPECT_EQ(stats.ipv6_network_count, 0);
-  EXPECT_EQ(stats.ipv4_network_count, 2);
-  list.clear();
-
-  // Verify that we get previous instances of Network objects.
-  manager.GetNetworks(&list);
-  EXPECT_EQ(2U, list.size());
-  EXPECT_TRUE((net1 == list[0] && net2 == list[1]) ||
-              (net1 == list[1] && net2 == list[0]));
-  EXPECT_TRUE((net_id1 == list[0]->id() && net_id2 == list[1]->id()) ||
-              (net_id1 == list[1]->id() && net_id2 == list[0]->id()));
-  list.clear();
-
-  // Call MergeNetworkList() again and verify that we don't get update
-  // notification.
-  list.push_back(new Network(ipv4_network2));
-  list.push_back(new Network(ipv4_network1));
-  stats = MergeNetworkList(manager, list, &changed);
-  EXPECT_FALSE(changed);
-  EXPECT_EQ(stats.ipv6_network_count, 0);
-  EXPECT_EQ(stats.ipv4_network_count, 2);
-  list.clear();
-
-  // Verify that we get previous instances of Network objects.
-  manager.GetNetworks(&list);
-  EXPECT_EQ(2U, list.size());
-  EXPECT_TRUE((net1 == list[0] && net2 == list[1]) ||
-              (net1 == list[1] && net2 == list[0]));
-  EXPECT_TRUE((net_id1 == list[0]->id() && net_id2 == list[1]->id()) ||
-              (net_id1 == list[1]->id() && net_id2 == list[0]->id()));
-  list.clear();
-}
-
-// Sets up some test IPv6 networks and appends them to list.
-// Four networks are added - public and link local, for two interfaces.
-void SetupNetworks(NetworkManager::NetworkList* list) {
-  IPAddress ip;
-  IPAddress prefix;
-  EXPECT_TRUE(IPFromString("abcd::1234:5678:abcd:ef12", &ip));
-  EXPECT_TRUE(IPFromString("abcd::", &prefix));
-  // First, fake link-locals.
-  Network ipv6_eth0_linklocalnetwork("test_eth0", "Test NetworkAdapter 1",
-                                     prefix, 64);
-  ipv6_eth0_linklocalnetwork.AddIP(ip);
-  EXPECT_TRUE(IPFromString("abcd::5678:abcd:ef12:3456", &ip));
-  Network ipv6_eth1_linklocalnetwork("test_eth1", "Test NetworkAdapter 2",
-                                     prefix, 64);
-  ipv6_eth1_linklocalnetwork.AddIP(ip);
-  // Public networks:
-  EXPECT_TRUE(IPFromString("2401:fa00:4:1000:be30:5bff:fee5:c3", &ip));
-  prefix = TruncateIP(ip, 64);
-  Network ipv6_eth0_publicnetwork1_ip1("test_eth0", "Test NetworkAdapter 1",
-                                       prefix, 64);
-  ipv6_eth0_publicnetwork1_ip1.AddIP(ip);
-  EXPECT_TRUE(IPFromString("2400:4030:1:2c00:be30:abcd:efab:cdef", &ip));
-  prefix = TruncateIP(ip, 64);
-  Network ipv6_eth1_publicnetwork1_ip1("test_eth1", "Test NetworkAdapter 1",
-                                       prefix, 64);
-  ipv6_eth1_publicnetwork1_ip1.AddIP(ip);
-  list->push_back(new Network(ipv6_eth0_linklocalnetwork));
-  list->push_back(new Network(ipv6_eth1_linklocalnetwork));
-  list->push_back(new Network(ipv6_eth0_publicnetwork1_ip1));
-  list->push_back(new Network(ipv6_eth1_publicnetwork1_ip1));
-}
-
-// Test that the basic network merging case works.
-TEST_F(NetworkTest, TestIPv6MergeNetworkList) {
-  BasicNetworkManager manager;
-  manager.SignalNetworksChanged.connect(
-      static_cast<NetworkTest*>(this), &NetworkTest::OnNetworksChanged);
-  NetworkManager::NetworkList original_list;
-  SetupNetworks(&original_list);
-  bool changed = false;
-  NetworkManager::Stats stats =
-      MergeNetworkList(manager, original_list, &changed);
-  EXPECT_TRUE(changed);
-  EXPECT_EQ(stats.ipv6_network_count, 4);
-  EXPECT_EQ(stats.ipv4_network_count, 0);
-  NetworkManager::NetworkList list;
-  manager.GetNetworks(&list);
-  EXPECT_EQ(original_list.size(), list.size());
-  // Verify that the original members are in the merged list.
-  for (NetworkManager::NetworkList::iterator it = original_list.begin();
-       it != original_list.end(); ++it) {
-    EXPECT_NE(list.end(), std::find(list.begin(), list.end(), *it));
-  }
-}
-
-// Tests that when two network lists that describe the same set of networks are
-// merged, that the changed callback is not called, and that the original
-// objects remain in the result list.
-TEST_F(NetworkTest, TestNoChangeMerge) {
-  BasicNetworkManager manager;
-  manager.SignalNetworksChanged.connect(
-      static_cast<NetworkTest*>(this), &NetworkTest::OnNetworksChanged);
-  NetworkManager::NetworkList original_list;
-  SetupNetworks(&original_list);
-  bool changed = false;
-  MergeNetworkList(manager, original_list, &changed);
-  EXPECT_TRUE(changed);
-  // Second list that describes the same networks but with new objects.
-  NetworkManager::NetworkList second_list;
-  SetupNetworks(&second_list);
-  changed = false;
-  MergeNetworkList(manager, second_list, &changed);
-  EXPECT_FALSE(changed);
-  NetworkManager::NetworkList resulting_list;
-  manager.GetNetworks(&resulting_list);
-  EXPECT_EQ(original_list.size(), resulting_list.size());
-  // Verify that the original members are in the merged list.
-  for (NetworkManager::NetworkList::iterator it = original_list.begin();
-       it != original_list.end(); ++it) {
-    EXPECT_NE(resulting_list.end(),
-              std::find(resulting_list.begin(), resulting_list.end(), *it));
-  }
-  // Doublecheck that the new networks aren't in the list.
-  for (NetworkManager::NetworkList::iterator it = second_list.begin();
-       it != second_list.end(); ++it) {
-    EXPECT_EQ(resulting_list.end(),
-              std::find(resulting_list.begin(), resulting_list.end(), *it));
-  }
-}
-
-// Test that we can merge a network that is the same as another network but with
-// a different IP. The original network should remain in the list, but have its
-// IP changed.
-TEST_F(NetworkTest, MergeWithChangedIP) {
-  BasicNetworkManager manager;
-  manager.SignalNetworksChanged.connect(
-      static_cast<NetworkTest*>(this), &NetworkTest::OnNetworksChanged);
-  NetworkManager::NetworkList original_list;
-  SetupNetworks(&original_list);
-  // Make a network that we're going to change.
-  IPAddress ip;
-  EXPECT_TRUE(IPFromString("2401:fa01:4:1000:be30:faa:fee:faa", &ip));
-  IPAddress prefix = TruncateIP(ip, 64);
-  Network* network_to_change = new Network("test_eth0",
-                                          "Test Network Adapter 1",
-                                          prefix, 64);
-  Network* changed_network = new Network(*network_to_change);
-  network_to_change->AddIP(ip);
-  IPAddress changed_ip;
-  EXPECT_TRUE(IPFromString("2401:fa01:4:1000:be30:f00:f00:f00", &changed_ip));
-  changed_network->AddIP(changed_ip);
-  original_list.push_back(network_to_change);
-  bool changed = false;
-  MergeNetworkList(manager, original_list, &changed);
-  NetworkManager::NetworkList second_list;
-  SetupNetworks(&second_list);
-  second_list.push_back(changed_network);
-  changed = false;
-  MergeNetworkList(manager, second_list, &changed);
-  EXPECT_TRUE(changed);
-  NetworkManager::NetworkList list;
-  manager.GetNetworks(&list);
-  EXPECT_EQ(original_list.size(), list.size());
-  // Make sure the original network is still in the merged list.
-  EXPECT_NE(list.end(),
-            std::find(list.begin(), list.end(), network_to_change));
-  EXPECT_EQ(changed_ip, network_to_change->GetIPs().at(0));
-}
-
-// Testing a similar case to above, but checking that a network can be updated
-// with additional IPs (not just a replacement).
-TEST_F(NetworkTest, TestMultipleIPMergeNetworkList) {
-  BasicNetworkManager manager;
-  manager.SignalNetworksChanged.connect(
-      static_cast<NetworkTest*>(this), &NetworkTest::OnNetworksChanged);
-  NetworkManager::NetworkList original_list;
-  SetupNetworks(&original_list);
-  bool changed = false;
-  MergeNetworkList(manager, original_list, &changed);
-  EXPECT_TRUE(changed);
-  IPAddress ip;
-  IPAddress check_ip;
-  IPAddress prefix;
-  // Add a second IP to the public network on eth0 (2401:fa00:4:1000/64).
-  EXPECT_TRUE(IPFromString("2401:fa00:4:1000:be30:5bff:fee5:c6", &ip));
-  prefix = TruncateIP(ip, 64);
-  Network ipv6_eth0_publicnetwork1_ip2("test_eth0", "Test NetworkAdapter 1",
-                                       prefix, 64);
-  // This is the IP that already existed in the public network on eth0.
-  EXPECT_TRUE(IPFromString("2401:fa00:4:1000:be30:5bff:fee5:c3", &check_ip));
-  ipv6_eth0_publicnetwork1_ip2.AddIP(ip);
-  original_list.push_back(new Network(ipv6_eth0_publicnetwork1_ip2));
-  changed = false;
-  MergeNetworkList(manager, original_list, &changed);
-  EXPECT_TRUE(changed);
-  // There should still be four networks.
-  NetworkManager::NetworkList list;
-  manager.GetNetworks(&list);
-  EXPECT_EQ(4U, list.size());
-  // Check the gathered IPs.
-  int matchcount = 0;
-  for (NetworkManager::NetworkList::iterator it = list.begin();
-       it != list.end(); ++it) {
-    if ((*it)->ToString() == original_list[2]->ToString()) {
-      ++matchcount;
-      EXPECT_EQ(1, matchcount);
-      // This should be the same network object as before.
-      EXPECT_EQ((*it), original_list[2]);
-      // But with two addresses now.
-      EXPECT_EQ(2U, (*it)->GetIPs().size());
-      EXPECT_NE((*it)->GetIPs().end(),
-                std::find((*it)->GetIPs().begin(),
-                          (*it)->GetIPs().end(),
-                          check_ip));
-      EXPECT_NE((*it)->GetIPs().end(),
-                std::find((*it)->GetIPs().begin(),
-                          (*it)->GetIPs().end(),
-                          ip));
-    } else {
-      // Check the IP didn't get added anywhere it wasn't supposed to.
-      EXPECT_EQ((*it)->GetIPs().end(),
-                std::find((*it)->GetIPs().begin(),
-                          (*it)->GetIPs().end(),
-                          ip));
-    }
-  }
-}
-
-// Test that merge correctly distinguishes multiple networks on an interface.
-TEST_F(NetworkTest, TestMultiplePublicNetworksOnOneInterfaceMerge) {
-  BasicNetworkManager manager;
-  manager.SignalNetworksChanged.connect(
-      static_cast<NetworkTest*>(this), &NetworkTest::OnNetworksChanged);
-  NetworkManager::NetworkList original_list;
-  SetupNetworks(&original_list);
-  bool changed = false;
-  MergeNetworkList(manager, original_list, &changed);
-  EXPECT_TRUE(changed);
-  IPAddress ip;
-  IPAddress prefix;
-  // A second network for eth0.
-  EXPECT_TRUE(IPFromString("2400:4030:1:2c00:be30:5bff:fee5:c3", &ip));
-  prefix = TruncateIP(ip, 64);
-  Network ipv6_eth0_publicnetwork2_ip1("test_eth0", "Test NetworkAdapter 1",
-                                       prefix, 64);
-  ipv6_eth0_publicnetwork2_ip1.AddIP(ip);
-  original_list.push_back(new Network(ipv6_eth0_publicnetwork2_ip1));
-  changed = false;
-  MergeNetworkList(manager, original_list, &changed);
-  EXPECT_TRUE(changed);
-  // There should be five networks now.
-  NetworkManager::NetworkList list;
-  manager.GetNetworks(&list);
-  EXPECT_EQ(5U, list.size());
-  // Check the resulting addresses.
-  for (NetworkManager::NetworkList::iterator it = list.begin();
-       it != list.end(); ++it) {
-    if ((*it)->prefix() == ipv6_eth0_publicnetwork2_ip1.prefix() &&
-        (*it)->name() == ipv6_eth0_publicnetwork2_ip1.name()) {
-      // Check the new network has 1 IP and that it's the correct one.
-      EXPECT_EQ(1U, (*it)->GetIPs().size());
-      EXPECT_EQ(ip, (*it)->GetIPs().at(0));
-    } else {
-      // Check the IP didn't get added anywhere it wasn't supposed to.
-      EXPECT_EQ((*it)->GetIPs().end(),
-                std::find((*it)->GetIPs().begin(),
-                          (*it)->GetIPs().end(),
-                          ip));
-    }
-  }
-}
-
-// Test that DumpNetworks does not crash.
-TEST_F(NetworkTest, TestCreateAndDumpNetworks) {
-  BasicNetworkManager manager;
-  NetworkManager::NetworkList list = GetNetworks(manager, true);
-  bool changed;
-  MergeNetworkList(manager, list, &changed);
-  manager.DumpNetworks();
-}
-
-// Test that we can toggle IPv6 on and off.
-// Crashes on Linux. See webrtc:4923.
-#if defined(WEBRTC_LINUX)
-#define MAYBE_TestIPv6Toggle DISABLED_TestIPv6Toggle
-#else
-#define MAYBE_TestIPv6Toggle TestIPv6Toggle
-#endif
-TEST_F(NetworkTest, MAYBE_TestIPv6Toggle) {
-  BasicNetworkManager manager;
-  bool ipv6_found = false;
-  NetworkManager::NetworkList list;
-#if !defined(WEBRTC_WIN)
-  // There should be at least one IPv6 network (fe80::/64 should be in there).
-  // TODO(thaloun): Disabling this test on windows for the moment as the test
-  // machines don't seem to have IPv6 installed on them at all.
-  manager.set_ipv6_enabled(true);
-  list = GetNetworks(manager, true);
-  for (NetworkManager::NetworkList::iterator it = list.begin();
-       it != list.end(); ++it) {
-    if ((*it)->prefix().family() == AF_INET6) {
-      ipv6_found = true;
-      break;
-    }
-  }
-  EXPECT_TRUE(ipv6_found);
-  for (NetworkManager::NetworkList::iterator it = list.begin();
-       it != list.end(); ++it) {
-    delete (*it);
-  }
-#endif
-  ipv6_found = false;
-  manager.set_ipv6_enabled(false);
-  list = GetNetworks(manager, true);
-  for (NetworkManager::NetworkList::iterator it = list.begin();
-       it != list.end(); ++it) {
-    if ((*it)->prefix().family() == AF_INET6) {
-      ipv6_found = true;
-      break;
-    }
-  }
-  EXPECT_FALSE(ipv6_found);
-  for (NetworkManager::NetworkList::iterator it = list.begin();
-       it != list.end(); ++it) {
-    delete (*it);
-  }
-}
-
-// Test that when network interfaces are sorted and given preference values,
-// IPv6 comes first.
-TEST_F(NetworkTest, IPv6NetworksPreferredOverIPv4) {
-  BasicNetworkManager manager;
-  Network ipv4_network1("test_eth0", "Test Network Adapter 1",
-                        IPAddress(0x12345600U), 24);
-  ipv4_network1.AddIP(IPAddress(0x12345600U));
-
-  IPAddress ip;
-  IPAddress prefix;
-  EXPECT_TRUE(IPFromString("2400:4030:1:2c00:be30:abcd:efab:cdef", &ip));
-  prefix = TruncateIP(ip, 64);
-  Network ipv6_eth1_publicnetwork1_ip1("test_eth1", "Test NetworkAdapter 2",
-                                       prefix, 64);
-  ipv6_eth1_publicnetwork1_ip1.AddIP(ip);
-
-  NetworkManager::NetworkList list;
-  list.push_back(new Network(ipv4_network1));
-  list.push_back(new Network(ipv6_eth1_publicnetwork1_ip1));
-  Network* net1 = list[0];
-  Network* net2 = list[1];
-
-  bool changed = false;
-  MergeNetworkList(manager, list, &changed);
-  ASSERT_TRUE(changed);
-  // After sorting IPv6 network should be higher order than IPv4 networks.
-  EXPECT_TRUE(net1->preference() < net2->preference());
-}
-
-// When two interfaces are equivalent in everything but name, they're expected
-// to be preference-ordered by name. For example, "eth0" before "eth1".
-TEST_F(NetworkTest, NetworksSortedByInterfaceName) {
-  BasicNetworkManager manager;
-  Network* eth0 = new Network("test_eth0", "Test Network Adapter 1",
-                              IPAddress(0x65432100U), 24);
-  eth0->AddIP(IPAddress(0x65432100U));
-  Network* eth1 = new Network("test_eth1", "Test Network Adapter 2",
-                              IPAddress(0x12345600U), 24);
-  eth1->AddIP(IPAddress(0x12345600U));
-  NetworkManager::NetworkList list;
-  // Add them to the list in the opposite of the expected sorted order, to
-  // ensure sorting actually occurs.
-  list.push_back(eth1);
-  list.push_back(eth0);
-
-  bool changed = false;
-  MergeNetworkList(manager, list, &changed);
-  ASSERT_TRUE(changed);
-  // "test_eth0" should be preferred over "test_eth1".
-  EXPECT_TRUE(eth0->preference() > eth1->preference());
-}
-
-TEST_F(NetworkTest, TestNetworkAdapterTypes) {
-  Network wifi("wlan0", "Wireless Adapter", IPAddress(0x12345600U), 24,
-               ADAPTER_TYPE_WIFI);
-  EXPECT_EQ(ADAPTER_TYPE_WIFI, wifi.type());
-  Network ethernet("eth0", "Ethernet", IPAddress(0x12345600U), 24,
-                   ADAPTER_TYPE_ETHERNET);
-  EXPECT_EQ(ADAPTER_TYPE_ETHERNET, ethernet.type());
-  Network cellular("test_cell", "Cellular Adapter", IPAddress(0x12345600U), 24,
-                   ADAPTER_TYPE_CELLULAR);
-  EXPECT_EQ(ADAPTER_TYPE_CELLULAR, cellular.type());
-  Network vpn("bridge_test", "VPN Adapter", IPAddress(0x12345600U), 24,
-              ADAPTER_TYPE_VPN);
-  EXPECT_EQ(ADAPTER_TYPE_VPN, vpn.type());
-  Network unknown("test", "Test Adapter", IPAddress(0x12345600U), 24,
-                  ADAPTER_TYPE_UNKNOWN);
-  EXPECT_EQ(ADAPTER_TYPE_UNKNOWN, unknown.type());
-}
-
-#if defined(WEBRTC_POSIX)
-// Verify that we correctly handle interfaces with no address.
-TEST_F(NetworkTest, TestConvertIfAddrsNoAddress) {
-  ifaddrs list;
-  memset(&list, 0, sizeof(list));
-  list.ifa_name = const_cast<char*>("test_iface");
-
-  NetworkManager::NetworkList result;
-  BasicNetworkManager manager;
-  CallConvertIfAddrs(manager, &list, true, &result);
-  EXPECT_TRUE(result.empty());
-}
-
-// Verify that if there are two addresses on one interface, only one network
-// is generated.
-TEST_F(NetworkTest, TestConvertIfAddrsMultiAddressesOnOneInterface) {
-  char if_name[20] = "rmnet0";
-  ifaddrs* list = nullptr;
-  list = AddIpv6Address(list, if_name, "1000:2000:3000:4000:0:0:0:1",
-                        "FFFF:FFFF:FFFF:FFFF::", 0);
-  list = AddIpv6Address(list, if_name, "1000:2000:3000:4000:0:0:0:2",
-                        "FFFF:FFFF:FFFF:FFFF::", 0);
-  NetworkManager::NetworkList result;
-  BasicNetworkManager manager;
-  CallConvertIfAddrs(manager, list, true, &result);
-  EXPECT_EQ(1U, result.size());
-  bool changed;
-  // This ensures we release the objects created in CallConvertIfAddrs.
-  MergeNetworkList(manager, result, &changed);
-  ReleaseIfAddrs(list);
-}
-
-TEST_F(NetworkTest, TestConvertIfAddrsNotRunning) {
-  ifaddrs list;
-  memset(&list, 0, sizeof(list));
-  list.ifa_name = const_cast<char*>("test_iface");
-  sockaddr ifa_addr;
-  sockaddr ifa_netmask;
-  list.ifa_addr = &ifa_addr;
-  list.ifa_netmask = &ifa_netmask;
-
-  NetworkManager::NetworkList result;
-  BasicNetworkManager manager;
-  CallConvertIfAddrs(manager, &list, true, &result);
-  EXPECT_TRUE(result.empty());
-}
-
-// Tests that the network type can be updated after the network monitor is
-// started.
-TEST_F(NetworkTest, TestGetAdapterTypeFromNetworkMonitor) {
-  char if_name1[20] = "wifi0";
-  std::string ipv6_address1 = "1000:2000:3000:4000:0:0:0:1";
-  std::string ipv6_address2 = "1000:2000:3000:8000:0:0:0:1";
-  std::string ipv6_mask = "FFFF:FFFF:FFFF:FFFF::";
-  BasicNetworkManager manager;
-  // A network created before the network monitor is started will get
-  // UNKNOWN type.
-  ifaddrs* addr_list =
-      InstallIpv6Network(if_name1, ipv6_address1, ipv6_mask, manager);
-  EXPECT_EQ(ADAPTER_TYPE_UNKNOWN, GetAdapterType(manager));
-  ReleaseIfAddrs(addr_list);
-  // Note: Do not call ClearNetworks here in order to test that the type
-  // of an existing network can be changed after the network monitor starts
-  // and detects the network type correctly.
-
-  // After the network monitor starts, the type will be updated.
-  FakeNetworkMonitorFactory* factory = new FakeNetworkMonitorFactory();
-  NetworkMonitorFactory::SetFactory(factory);
-  // This brings up the hook with the network monitor.
-  manager.StartUpdating();
-  // Add the same ipv6 address as before but it has the right network type
-  // detected by the network monitor now.
-  addr_list = InstallIpv6Network(if_name1, ipv6_address1, ipv6_mask, manager);
-  EXPECT_EQ(ADAPTER_TYPE_WIFI, GetAdapterType(manager));
-  ReleaseIfAddrs(addr_list);
-  ClearNetworks(manager);
-
-  // Add another network with the type inferred from the network monitor.
-  char if_name2[20] = "cellular0";
-  addr_list = InstallIpv6Network(if_name2, ipv6_address2, ipv6_mask, manager);
-  EXPECT_EQ(ADAPTER_TYPE_CELLULAR, GetAdapterType(manager));
-  ReleaseIfAddrs(addr_list);
-  ClearNetworks(manager);
-}
-
-// Test that the network type can be determined based on name matching in
-// a few cases. Note that UNKNOWN type for non-matching strings has been tested
-// in the above test.
-TEST_F(NetworkTest, TestGetAdapterTypeFromNameMatching) {
-  std::string ipv6_address1 = "1000:2000:3000:4000:0:0:0:1";
-  std::string ipv6_address2 = "1000:2000:3000:8000:0:0:0:1";
-  std::string ipv6_mask = "FFFF:FFFF:FFFF:FFFF::";
-  BasicNetworkManager manager;
-
-  // IPSec interface; name is in form "ipsec<index>".
-  char if_name[20] = "ipsec11";
-  ifaddrs* addr_list =
-      InstallIpv6Network(if_name, ipv6_address1, ipv6_mask, manager);
-  EXPECT_EQ(ADAPTER_TYPE_VPN, GetAdapterType(manager));
-  ClearNetworks(manager);
-  ReleaseIfAddrs(addr_list);
-
-#if defined(WEBRTC_IOS)
-  strcpy(if_name, "pdp_ip0");
-  addr_list = InstallIpv6Network(if_name, ipv6_address1, ipv6_mask, manager);
-  EXPECT_EQ(ADAPTER_TYPE_CELLULAR, GetAdapterType(manager));
-  ClearNetworks(manager);
-  ReleaseIfAddrs(addr_list);
-
-  strcpy(if_name, "en0");
-  addr_list = InstallIpv6Network(if_name, ipv6_address1, ipv6_mask, manager);
-  EXPECT_EQ(ADAPTER_TYPE_WIFI, GetAdapterType(manager));
-  ClearNetworks(manager);
-  ReleaseIfAddrs(addr_list);
-
-#elif defined(WEBRTC_ANDROID)
-  strcpy(if_name, "rmnet0");
-  addr_list = InstallIpv6Network(if_name, ipv6_address1, ipv6_mask, manager);
-  EXPECT_EQ(ADAPTER_TYPE_CELLULAR, GetAdapterType(manager));
-  ClearNetworks(manager);
-  ReleaseIfAddrs(addr_list);
-
-  strcpy(if_name, "wlan1");
-  addr_list = InstallIpv6Network(if_name, ipv6_address2, ipv6_mask, manager);
-  EXPECT_EQ(ADAPTER_TYPE_WIFI, GetAdapterType(manager));
-  ClearNetworks(manager);
-  ReleaseIfAddrs(addr_list);
-
-  strcpy(if_name, "v4-rmnet_data0");
-  addr_list = InstallIpv6Network(if_name, ipv6_address2, ipv6_mask, manager);
-  EXPECT_EQ(ADAPTER_TYPE_CELLULAR, GetAdapterType(manager));
-  ClearNetworks(manager);
-  ReleaseIfAddrs(addr_list);
-#else
-  // TODO(deadbeef): If not iOS or Android, "wlan0" should be treated as
-  // "unknown"? Why? This should be fixed if there's no good reason.
-  strcpy(if_name, "wlan0");
-  addr_list = InstallIpv6Network(if_name, ipv6_address1, ipv6_mask, manager);
-
-  EXPECT_EQ(ADAPTER_TYPE_UNKNOWN, GetAdapterType(manager));
-  ClearNetworks(manager);
-  ReleaseIfAddrs(addr_list);
-#endif
-}
-#endif  // defined(WEBRTC_POSIX)
-
-#if defined(WEBRTC_LINUX) && !defined(WEBRTC_ANDROID)
-// If you want to test non-default routes, you can do the following on a linux
-// machine:
-// 1) Load the dummy network driver:
-// sudo modprobe dummy
-// sudo ifconfig dummy0 127.0.0.1
-// 2) Run this test and confirm the output says it found a dummy route (and
-// passes).
-// 3) When done:
-// sudo rmmmod dummy
-TEST_F(NetworkTest, TestIgnoreNonDefaultRoutes) {
-  BasicNetworkManager manager;
-  NetworkManager::NetworkList list;
-  list = GetNetworks(manager, false);
-  bool found_dummy = false;
-  LOG(LS_INFO) << "Looking for dummy network: ";
-  for (NetworkManager::NetworkList::iterator it = list.begin();
-       it != list.end(); ++it) {
-    LOG(LS_INFO) << "  Network name: " << (*it)->name();
-    found_dummy |= (*it)->name().find("dummy0") != std::string::npos;
-  }
-  for (NetworkManager::NetworkList::iterator it = list.begin();
-       it != list.end(); ++it) {
-    delete (*it);
-  }
-  if (!found_dummy) {
-    LOG(LS_INFO) << "No dummy found, quitting.";
-    return;
-  }
-  LOG(LS_INFO) << "Found dummy, running again while ignoring non-default "
-               << "routes.";
-  manager.set_ignore_non_default_routes(true);
-  list = GetNetworks(manager, false);
-  for (NetworkManager::NetworkList::iterator it = list.begin();
-       it != list.end(); ++it) {
-    LOG(LS_INFO) << "  Network name: " << (*it)->name();
-    EXPECT_TRUE((*it)->name().find("dummy0") == std::string::npos);
-  }
-  for (NetworkManager::NetworkList::iterator it = list.begin();
-       it != list.end(); ++it) {
-    delete (*it);
-  }
-}
-#endif
-
-// Test MergeNetworkList successfully combines all IPs for the same
-// prefix/length into a single Network.
-TEST_F(NetworkTest, TestMergeNetworkList) {
-  BasicNetworkManager manager;
-  NetworkManager::NetworkList list;
-
-  // Create 2 IPAddress classes with only last digit different.
-  IPAddress ip1, ip2;
-  EXPECT_TRUE(IPFromString("2400:4030:1:2c00:be30:0:0:1", &ip1));
-  EXPECT_TRUE(IPFromString("2400:4030:1:2c00:be30:0:0:2", &ip2));
-
-  // Create 2 networks with the same prefix and length.
-  Network* net1 = new Network("em1", "em1", TruncateIP(ip1, 64), 64);
-  Network* net2 = new Network("em1", "em1", TruncateIP(ip1, 64), 64);
-
-  // Add different IP into each.
-  net1->AddIP(ip1);
-  net2->AddIP(ip2);
-
-  list.push_back(net1);
-  list.push_back(net2);
-  bool changed;
-  MergeNetworkList(manager, list, &changed);
-  EXPECT_TRUE(changed);
-
-  NetworkManager::NetworkList list2;
-  manager.GetNetworks(&list2);
-
-  // Make sure the resulted networklist has only 1 element and 2
-  // IPAddresses.
-  EXPECT_EQ(list2.size(), 1uL);
-  EXPECT_EQ(list2[0]->GetIPs().size(), 2uL);
-  EXPECT_EQ(list2[0]->GetIPs()[0], ip1);
-  EXPECT_EQ(list2[0]->GetIPs()[1], ip2);
-}
-
-// Test that MergeNetworkList successfully detects the change if
-// a network becomes inactive and then active again.
-TEST_F(NetworkTest, TestMergeNetworkListWithInactiveNetworks) {
-  BasicNetworkManager manager;
-  Network network1("test_wifi", "Test Network Adapter 1",
-                   IPAddress(0x12345600U), 24);
-  Network network2("test_eth0", "Test Network Adapter 2",
-                   IPAddress(0x00010000U), 16);
-  network1.AddIP(IPAddress(0x12345678));
-  network2.AddIP(IPAddress(0x00010004));
-  NetworkManager::NetworkList list;
-  Network* net1 = new Network(network1);
-  list.push_back(net1);
-  bool changed;
-  MergeNetworkList(manager, list, &changed);
-  EXPECT_TRUE(changed);
-  list.clear();
-  manager.GetNetworks(&list);
-  ASSERT_EQ(1U, list.size());
-  EXPECT_EQ(net1, list[0]);
-
-  list.clear();
-  Network* net2 = new Network(network2);
-  list.push_back(net2);
-  MergeNetworkList(manager, list, &changed);
-  EXPECT_TRUE(changed);
-  list.clear();
-  manager.GetNetworks(&list);
-  ASSERT_EQ(1U, list.size());
-  EXPECT_EQ(net2, list[0]);
-
-  // Now network1 is inactive. Try to merge it again.
-  list.clear();
-  list.push_back(new Network(network1));
-  MergeNetworkList(manager, list, &changed);
-  EXPECT_TRUE(changed);
-  list.clear();
-  manager.GetNetworks(&list);
-  ASSERT_EQ(1U, list.size());
-  EXPECT_TRUE(list[0]->active());
-  EXPECT_EQ(net1, list[0]);
-}
-
-// Test that the filtering logic follows the defined ruleset in network.h.
-TEST_F(NetworkTest, TestIPv6Selection) {
-  InterfaceAddress ip;
-  std::string ipstr;
-
-  ipstr = "2401:fa00:4:1000:be30:5bff:fee5:c3";
-  ASSERT_TRUE(IPFromString(ipstr, IPV6_ADDRESS_FLAG_DEPRECATED, &ip));
-
-  // Create a network with this prefix.
-  Network ipv6_network(
-      "test_eth0", "Test NetworkAdapter", TruncateIP(ip, 64), 64);
-
-  // When there is no address added, it should return an unspecified
-  // address.
-  EXPECT_EQ(ipv6_network.GetBestIP(), IPAddress());
-  EXPECT_TRUE(IPIsUnspec(ipv6_network.GetBestIP()));
-
-  // Deprecated one should not be returned.
-  ipv6_network.AddIP(ip);
-  EXPECT_EQ(ipv6_network.GetBestIP(), IPAddress());
-
-  // Add ULA one. ULA is unique local address which is starting either
-  // with 0xfc or 0xfd.
-  ipstr = "fd00:fa00:4:1000:be30:5bff:fee5:c4";
-  ASSERT_TRUE(IPFromString(ipstr, IPV6_ADDRESS_FLAG_NONE, &ip));
-  ipv6_network.AddIP(ip);
-  EXPECT_EQ(ipv6_network.GetBestIP(), static_cast<IPAddress>(ip));
-
-  // Add global one.
-  ipstr = "2401:fa00:4:1000:be30:5bff:fee5:c5";
-  ASSERT_TRUE(IPFromString(ipstr, IPV6_ADDRESS_FLAG_NONE, &ip));
-  ipv6_network.AddIP(ip);
-  EXPECT_EQ(ipv6_network.GetBestIP(), static_cast<IPAddress>(ip));
-
-  // Add global dynamic temporary one.
-  ipstr = "2401:fa00:4:1000:be30:5bff:fee5:c6";
-  ASSERT_TRUE(IPFromString(ipstr, IPV6_ADDRESS_FLAG_TEMPORARY, &ip));
-  ipv6_network.AddIP(ip);
-  EXPECT_EQ(ipv6_network.GetBestIP(), static_cast<IPAddress>(ip));
-}
-
-TEST_F(NetworkTest, TestNetworkMonitoring) {
-  BasicNetworkManager manager;
-  manager.SignalNetworksChanged.connect(static_cast<NetworkTest*>(this),
-                                        &NetworkTest::OnNetworksChanged);
-  FakeNetworkMonitorFactory* factory = new FakeNetworkMonitorFactory();
-  NetworkMonitorFactory::SetFactory(factory);
-  manager.StartUpdating();
-  FakeNetworkMonitor* network_monitor = GetNetworkMonitor(manager);
-  EXPECT_TRUE(network_monitor && network_monitor->started());
-  EXPECT_TRUE_WAIT(callback_called_, 1000);
-  callback_called_ = false;
-
-  // Clear the networks so that there will be network changes below.
-  ClearNetworks(manager);
-  // Network manager is started, so the callback is called when the network
-  // monitor fires the network-change event.
-  network_monitor->OnNetworksChanged();
-  EXPECT_TRUE_WAIT(callback_called_, 1000);
-
-  // Network manager is stopped.
-  manager.StopUpdating();
-  EXPECT_FALSE(GetNetworkMonitor(manager)->started());
-
-  NetworkMonitorFactory::ReleaseFactory(factory);
-}
-
-// Fails on Android: https://bugs.chromium.org/p/webrtc/issues/detail?id=4364.
-#if defined(WEBRTC_ANDROID)
-#define MAYBE_DefaultLocalAddress DISABLED_DefaultLocalAddress
-#else
-#define MAYBE_DefaultLocalAddress DefaultLocalAddress
-#endif
-TEST_F(NetworkTest, MAYBE_DefaultLocalAddress) {
-  IPAddress ip;
-  TestBasicNetworkManager manager;
-  manager.SignalNetworksChanged.connect(static_cast<NetworkTest*>(this),
-                                        &NetworkTest::OnNetworksChanged);
-  FakeNetworkMonitorFactory* factory = new FakeNetworkMonitorFactory();
-  NetworkMonitorFactory::SetFactory(factory);
-  manager.StartUpdating();
-  EXPECT_TRUE_WAIT(callback_called_, 1000);
-
-  // Make sure we can query default local address when an address for such
-  // address family exists.
-  std::vector<Network*> networks;
-  manager.GetNetworks(&networks);
-  EXPECT_TRUE(!networks.empty());
-  for (auto& network : networks) {
-    if (network->GetBestIP().family() == AF_INET) {
-      EXPECT_TRUE(manager.QueryDefaultLocalAddress(AF_INET) != IPAddress());
-    } else if (network->GetBestIP().family() == AF_INET6 &&
-               !IPIsLoopback(network->GetBestIP())) {
-      // Existence of an IPv6 loopback address doesn't mean it has IPv6 network
-      // enabled.
-      EXPECT_TRUE(manager.QueryDefaultLocalAddress(AF_INET6) != IPAddress());
-    }
-  }
-
-  // GetDefaultLocalAddress should return the valid default address after set.
-  manager.set_default_local_addresses(GetLoopbackIP(AF_INET),
-                                      GetLoopbackIP(AF_INET6));
-  EXPECT_TRUE(manager.GetDefaultLocalAddress(AF_INET, &ip));
-  EXPECT_EQ(ip, GetLoopbackIP(AF_INET));
-  EXPECT_TRUE(manager.GetDefaultLocalAddress(AF_INET6, &ip));
-  EXPECT_EQ(ip, GetLoopbackIP(AF_INET6));
-
-  // More tests on GetDefaultLocalAddress with ipv6 addresses where the set
-  // default address may be different from the best IP address of any network.
-  InterfaceAddress ip1;
-  EXPECT_TRUE(IPFromString("abcd::1234:5678:abcd:1111",
-                           IPV6_ADDRESS_FLAG_TEMPORARY, &ip1));
-  // Create a network with a prefix of ip1.
-  Network ipv6_network("test_eth0", "Test NetworkAdapter", TruncateIP(ip1, 64),
-                       64);
-  IPAddress ip2;
-  EXPECT_TRUE(IPFromString("abcd::1234:5678:abcd:2222", &ip2));
-  ipv6_network.AddIP(ip1);
-  ipv6_network.AddIP(ip2);
-  BasicNetworkManager::NetworkList list(1, new Network(ipv6_network));
-  bool changed;
-  MergeNetworkList(manager, list, &changed);
-  // If the set default address is not in any network, GetDefaultLocalAddress
-  // should return it.
-  IPAddress ip3;
-  EXPECT_TRUE(IPFromString("abcd::1234:5678:abcd:3333", &ip3));
-  manager.set_default_local_addresses(GetLoopbackIP(AF_INET), ip3);
-  EXPECT_TRUE(manager.GetDefaultLocalAddress(AF_INET6, &ip));
-  EXPECT_EQ(ip3, ip);
-  // If the set default address is in a network, GetDefaultLocalAddress will
-  // return the best IP in that network.
-  manager.set_default_local_addresses(GetLoopbackIP(AF_INET), ip2);
-  EXPECT_TRUE(manager.GetDefaultLocalAddress(AF_INET6, &ip));
-  EXPECT_EQ(static_cast<IPAddress>(ip1), ip);
-
-  manager.StopUpdating();
-}
-
-}  // namespace rtc
diff --git a/rtc_base/networkmonitor.cc b/rtc_base/networkmonitor.cc
deleted file mode 100644
index a23cc77..0000000
--- a/rtc_base/networkmonitor.cc
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- *  Copyright 2015 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/rtc_base/networkmonitor.h"
-
-#include "webrtc/rtc_base/checks.h"
-
-namespace {
-const uint32_t UPDATE_NETWORKS_MESSAGE = 1;
-
-// This is set by NetworkMonitorFactory::SetFactory and the caller of
-// NetworkMonitorFactory::SetFactory must be responsible for calling
-// ReleaseFactory to destroy the factory.
-rtc::NetworkMonitorFactory* network_monitor_factory = nullptr;
-}  // namespace
-
-namespace rtc {
-NetworkMonitorInterface::NetworkMonitorInterface() {}
-
-NetworkMonitorInterface::~NetworkMonitorInterface() {}
-
-NetworkMonitorBase::NetworkMonitorBase() : worker_thread_(Thread::Current()) {}
-NetworkMonitorBase::~NetworkMonitorBase() {}
-
-void NetworkMonitorBase::OnNetworksChanged() {
-  LOG(LS_VERBOSE) << "Network change is received at the network monitor";
-  worker_thread_->Post(RTC_FROM_HERE, this, UPDATE_NETWORKS_MESSAGE);
-}
-
-void NetworkMonitorBase::OnMessage(Message* msg) {
-  RTC_DCHECK(msg->message_id == UPDATE_NETWORKS_MESSAGE);
-  SignalNetworksChanged();
-}
-
-NetworkMonitorFactory::NetworkMonitorFactory() {}
-NetworkMonitorFactory::~NetworkMonitorFactory() {}
-
-void NetworkMonitorFactory::SetFactory(NetworkMonitorFactory* factory) {
-  if (network_monitor_factory != nullptr) {
-    delete network_monitor_factory;
-  }
-  network_monitor_factory = factory;
-}
-
-void NetworkMonitorFactory::ReleaseFactory(NetworkMonitorFactory* factory) {
-  if (factory == network_monitor_factory) {
-    SetFactory(nullptr);
-  }
-}
-
-NetworkMonitorFactory* NetworkMonitorFactory::GetFactory() {
-  return network_monitor_factory;
-}
-
-}  // namespace rtc
diff --git a/rtc_base/networkmonitor.h b/rtc_base/networkmonitor.h
deleted file mode 100644
index f7cef1b..0000000
--- a/rtc_base/networkmonitor.h
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- *  Copyright 2015 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_RTC_BASE_NETWORKMONITOR_H_
-#define WEBRTC_RTC_BASE_NETWORKMONITOR_H_
-
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/sigslot.h"
-#include "webrtc/rtc_base/thread.h"
-
-namespace rtc {
-
-class IPAddress;
-
-enum class NetworkBindingResult {
-  SUCCESS = 0,   // No error
-  FAILURE = -1,  // Generic error
-  NOT_IMPLEMENTED = -2,
-  ADDRESS_NOT_FOUND = -3,
-  NETWORK_CHANGED = -4
-};
-
-enum AdapterType {
-  // This enum resembles the one in Chromium net::ConnectionType.
-  ADAPTER_TYPE_UNKNOWN = 0,
-  ADAPTER_TYPE_ETHERNET = 1 << 0,
-  ADAPTER_TYPE_WIFI = 1 << 1,
-  ADAPTER_TYPE_CELLULAR = 1 << 2,
-  ADAPTER_TYPE_VPN = 1 << 3,
-  ADAPTER_TYPE_LOOPBACK = 1 << 4
-};
-
-class NetworkBinderInterface {
- public:
-  // Binds a socket to the network that is attached to |address| so that all
-  // packets on the socket |socket_fd| will be sent via that network.
-  // This is needed because some operating systems (like Android) require a
-  // special bind call to put packets on a non-default network interface.
-  virtual NetworkBindingResult BindSocketToNetwork(
-      int socket_fd,
-      const IPAddress& address) = 0;
-  virtual ~NetworkBinderInterface() {}
-};
-
-/*
- * Receives network-change events via |OnNetworksChanged| and signals the
- * networks changed event.
- *
- * Threading consideration:
- * It is expected that all upstream operations (from native to Java) are
- * performed from the worker thread. This includes creating, starting and
- * stopping the monitor. This avoids the potential race condition when creating
- * the singleton Java NetworkMonitor class. Downstream operations can be from
- * any thread, but this class will forward all the downstream operations onto
- * the worker thread.
- *
- * Memory consideration:
- * NetworkMonitor is owned by the caller (NetworkManager). The global network
- * monitor factory is owned by the factory itself but needs to be released from
- * the factory creator.
- */
-// Generic network monitor interface. It starts and stops monitoring network
-// changes, and fires the SignalNetworksChanged event when networks change.
-class NetworkMonitorInterface {
- public:
-  NetworkMonitorInterface();
-  virtual ~NetworkMonitorInterface();
-
-  sigslot::signal0<> SignalNetworksChanged;
-
-  virtual void Start() = 0;
-  virtual void Stop() = 0;
-
-  // Implementations should call this method on the base when networks change,
-  // and the base will fire SignalNetworksChanged on the right thread.
-  virtual void OnNetworksChanged() = 0;
-
-  virtual AdapterType GetAdapterType(const std::string& interface_name) = 0;
-};
-
-class NetworkMonitorBase : public NetworkMonitorInterface,
-                           public MessageHandler,
-                           public sigslot::has_slots<> {
- public:
-  NetworkMonitorBase();
-  ~NetworkMonitorBase() override;
-
-  void OnNetworksChanged() override;
-
-  void OnMessage(Message* msg) override;
-
- protected:
-  Thread* worker_thread() { return worker_thread_; }
-
- private:
-  Thread* worker_thread_;
-};
-
-/*
- * NetworkMonitorFactory creates NetworkMonitors.
- */
-class NetworkMonitorFactory {
- public:
-  // This is not thread-safe; it should be called once (or once per audio/video
-  // call) during the call initialization.
-  static void SetFactory(NetworkMonitorFactory* factory);
-
-  static void ReleaseFactory(NetworkMonitorFactory* factory);
-  static NetworkMonitorFactory* GetFactory();
-
-  virtual NetworkMonitorInterface* CreateNetworkMonitor() = 0;
-
-  virtual ~NetworkMonitorFactory();
-
- protected:
-  NetworkMonitorFactory();
-};
-
-}  // namespace rtc
-
-#endif  // WEBRTC_RTC_BASE_NETWORKMONITOR_H_
diff --git a/rtc_base/networkroute.h b/rtc_base/networkroute.h
deleted file mode 100644
index c43f5fc..0000000
--- a/rtc_base/networkroute.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- *  Copyright 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_RTC_BASE_NETWORKROUTE_H_
-#define WEBRTC_RTC_BASE_NETWORKROUTE_H_
-
-// TODO(honghaiz): Make a directory that describes the interfaces and structs
-// 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 rtc {
-
-struct NetworkRoute {
-  bool connected;
-  uint16_t local_network_id;
-  uint16_t remote_network_id;
-  int last_sent_packet_id;  // Last packet id sent on the PREVIOUS route.
-
-  NetworkRoute()
-      : connected(false),
-        local_network_id(0),
-        remote_network_id(0),
-        last_sent_packet_id(-1) {}
-
-  // The route is connected if the local and remote network ids are provided.
-  NetworkRoute(bool connected,
-               uint16_t local_net_id,
-               uint16_t remote_net_id,
-               int last_packet_id)
-      : connected(connected),
-        local_network_id(local_net_id),
-        remote_network_id(remote_net_id),
-        last_sent_packet_id(last_packet_id) {}
-
-  // |last_sent_packet_id| does not affect the NetworkRoute comparison.
-  bool operator==(const NetworkRoute& nr) const {
-    return connected == nr.connected &&
-           local_network_id == nr.local_network_id &&
-           remote_network_id == nr.remote_network_id;
-  }
-
-  bool operator!=(const NetworkRoute& nr) const { return !(*this == nr); }
-};
-}  // namespace rtc
-
-#endif  // WEBRTC_RTC_BASE_NETWORKROUTE_H_
diff --git a/rtc_base/noop.cc b/rtc_base/noop.cc
deleted file mode 100644
index 16a8e6d..0000000
--- a/rtc_base/noop.cc
+++ /dev/null
@@ -1,13 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-// This file is only needed to make ninja happy on some platforms.
-// On some platforms it is not possible to link an rtc_static_library
-// without any source file listed in the GN target.
diff --git a/rtc_base/noop.mm b/rtc_base/noop.mm
deleted file mode 100644
index 16a8e6d..0000000
--- a/rtc_base/noop.mm
+++ /dev/null
@@ -1,13 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-// This file is only needed to make ninja happy on some platforms.
-// On some platforms it is not possible to link an rtc_static_library
-// without any source file listed in the GN target.
diff --git a/rtc_base/nullsocketserver.cc b/rtc_base/nullsocketserver.cc
deleted file mode 100644
index 5c65386..0000000
--- a/rtc_base/nullsocketserver.cc
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- *  Copyright 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/rtc_base/nullsocketserver.h"
-#include "webrtc/rtc_base/checks.h"
-
-namespace rtc {
-
-NullSocketServer::NullSocketServer() : event_(false, false) {}
-NullSocketServer::~NullSocketServer() {}
-
-bool NullSocketServer::Wait(int cms, bool process_io) {
-  event_.Wait(cms);
-  return true;
-}
-
-void NullSocketServer::WakeUp() {
-  event_.Set();
-}
-
-rtc::Socket* NullSocketServer::CreateSocket(int /* type */) {
-  RTC_NOTREACHED();
-  return nullptr;
-}
-
-rtc::Socket* NullSocketServer::CreateSocket(int /* family */, int /* type */) {
-  RTC_NOTREACHED();
-  return nullptr;
-}
-
-rtc::AsyncSocket* NullSocketServer::CreateAsyncSocket(int /* type */) {
-  RTC_NOTREACHED();
-  return nullptr;
-}
-
-rtc::AsyncSocket* NullSocketServer::CreateAsyncSocket(int /* family */,
-                                                      int /* type */) {
-  RTC_NOTREACHED();
-  return nullptr;
-}
-
-}  // namespace rtc
diff --git a/rtc_base/nullsocketserver.h b/rtc_base/nullsocketserver.h
deleted file mode 100644
index 997a416..0000000
--- a/rtc_base/nullsocketserver.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- *  Copyright 2012 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_RTC_BASE_NULLSOCKETSERVER_H_
-#define WEBRTC_RTC_BASE_NULLSOCKETSERVER_H_
-
-#include "webrtc/rtc_base/event.h"
-#include "webrtc/rtc_base/socketserver.h"
-
-namespace rtc {
-
-class NullSocketServer : public SocketServer {
- public:
-  NullSocketServer();
-  ~NullSocketServer() override;
-
-  bool Wait(int cms, bool process_io) override;
-  void WakeUp() override;
-
-  Socket* CreateSocket(int type) override;
-  Socket* CreateSocket(int family, int type) override;
-  AsyncSocket* CreateAsyncSocket(int type) override;
-  AsyncSocket* CreateAsyncSocket(int family, int type) override;
-
- private:
-  Event event_;
-};
-
-}  // namespace rtc
-
-#endif  // WEBRTC_RTC_BASE_NULLSOCKETSERVER_H_
diff --git a/rtc_base/nullsocketserver_unittest.cc b/rtc_base/nullsocketserver_unittest.cc
deleted file mode 100644
index 5538322..0000000
--- a/rtc_base/nullsocketserver_unittest.cc
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- *  Copyright 2012 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/rtc_base/nullsocketserver.h"
-#include "webrtc/rtc_base/gunit.h"
-
-namespace rtc {
-
-static const uint32_t kTimeout = 5000U;
-
-class NullSocketServerTest
-    : public testing::Test,
-      public MessageHandler {
- public:
-  NullSocketServerTest() {}
- protected:
-  virtual void OnMessage(Message* message) {
-    ss_.WakeUp();
-  }
-  NullSocketServer ss_;
-};
-
-TEST_F(NullSocketServerTest, WaitAndSet) {
-  auto thread = Thread::Create();
-  EXPECT_TRUE(thread->Start());
-  thread->Post(RTC_FROM_HERE, this, 0);
-  // The process_io will be ignored.
-  const bool process_io = true;
-  EXPECT_TRUE_WAIT(ss_.Wait(SocketServer::kForever, process_io), kTimeout);
-}
-
-TEST_F(NullSocketServerTest, TestWait) {
-  int64_t start = TimeMillis();
-  ss_.Wait(200, true);
-  // The actual wait time is dependent on the resolution of the timer used by
-  // the Event class. Allow for the event to signal ~20ms early.
-  EXPECT_GE(TimeSince(start), 180);
-}
-
-}  // namespace rtc
diff --git a/rtc_base/numerics/exp_filter.cc b/rtc_base/numerics/exp_filter.cc
deleted file mode 100644
index b3d9610..0000000
--- a/rtc_base/numerics/exp_filter.cc
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- *  Copyright (c) 2011 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/rtc_base/numerics/exp_filter.h"
-
-#include <math.h>
-
-namespace rtc {
-
-const float ExpFilter::kValueUndefined = -1.0f;
-
-void ExpFilter::Reset(float alpha) {
-  alpha_ = alpha;
-  filtered_ = kValueUndefined;
-}
-
-float ExpFilter::Apply(float exp, float sample) {
-  if (filtered_ == kValueUndefined) {
-    // Initialize filtered value.
-    filtered_ = sample;
-  } else if (exp == 1.0) {
-    filtered_ = alpha_ * filtered_ + (1 - alpha_) * sample;
-  } else {
-    float alpha = pow(alpha_, exp);
-    filtered_ = alpha * filtered_ + (1 - alpha) * sample;
-  }
-  if (max_ != kValueUndefined && filtered_ > max_) {
-    filtered_ = max_;
-  }
-  return filtered_;
-}
-
-void ExpFilter::UpdateBase(float alpha) {
-  alpha_ = alpha;
-}
-}  // namespace rtc
diff --git a/rtc_base/numerics/exp_filter.h b/rtc_base/numerics/exp_filter.h
deleted file mode 100644
index 24b8151..0000000
--- a/rtc_base/numerics/exp_filter.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- *  Copyright (c) 2011 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_RTC_BASE_NUMERICS_EXP_FILTER_H_
-#define WEBRTC_RTC_BASE_NUMERICS_EXP_FILTER_H_
-
-namespace rtc {
-
-// This class can be used, for example, for smoothing the result of bandwidth
-// estimation and packet loss estimation.
-
-class ExpFilter {
- public:
-  static const float kValueUndefined;
-
-  explicit ExpFilter(float alpha, float max = kValueUndefined) : max_(max) {
-    Reset(alpha);
-  }
-
-  // Resets the filter to its initial state, and resets filter factor base to
-  // the given value |alpha|.
-  void Reset(float alpha);
-
-  // Applies the filter with a given exponent on the provided sample:
-  // y(k) = min(alpha_^ exp * y(k-1) + (1 - alpha_^ exp) * sample, max_).
-  float Apply(float exp, float sample);
-
-  // Returns current filtered value.
-  float filtered() const { return filtered_; }
-
-  // Changes the filter factor base to the given value |alpha|.
-  void UpdateBase(float alpha);
-
- private:
-  float alpha_;     // Filter factor base.
-  float filtered_;  // Current filter output.
-  const float max_;
-};
-}  // namespace rtc
-
-#endif  // WEBRTC_RTC_BASE_NUMERICS_EXP_FILTER_H_
diff --git a/rtc_base/numerics/exp_filter_unittest.cc b/rtc_base/numerics/exp_filter_unittest.cc
deleted file mode 100644
index 892db1e..0000000
--- a/rtc_base/numerics/exp_filter_unittest.cc
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- *  Copyright 2014 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 <math.h>
-
-#include "webrtc/rtc_base/numerics/exp_filter.h"
-#include "webrtc/test/gtest.h"
-
-namespace rtc {
-
-TEST(ExpFilterTest, FirstTimeOutputEqualInput) {
-  // No max value defined.
-  ExpFilter filter = ExpFilter(0.9f);
-  filter.Apply(100.0f, 10.0f);
-
-  // First time, first argument no effect.
-  double value = 10.0f;
-  EXPECT_FLOAT_EQ(value, filter.filtered());
-}
-
-TEST(ExpFilterTest, SecondTime) {
-  double value;
-
-  ExpFilter filter = ExpFilter(0.9f);
-  filter.Apply(100.0f, 10.0f);
-
-  // First time, first argument no effect.
-  value = 10.0f;
-
-  filter.Apply(10.0f, 20.0f);
-  double alpha = pow(0.9f, 10.0f);
-  value = alpha * value + (1.0f - alpha) * 20.0f;
-  EXPECT_FLOAT_EQ(value, filter.filtered());
-}
-
-TEST(ExpFilterTest, Reset) {
-  ExpFilter filter = ExpFilter(0.9f);
-  filter.Apply(100.0f, 10.0f);
-
-  filter.Reset(0.8f);
-  filter.Apply(100.0f, 1.0f);
-
-  // Become first time after a reset.
-  double value = 1.0f;
-  EXPECT_FLOAT_EQ(value, filter.filtered());
-}
-
-TEST(ExpfilterTest, OutputLimitedByMax) {
-  double value;
-
-  // Max value defined.
-  ExpFilter filter = ExpFilter(0.9f, 1.0f);
-  filter.Apply(100.0f, 10.0f);
-
-  // Limited to max value.
-  value = 1.0f;
-  EXPECT_EQ(value, filter.filtered());
-
-  filter.Apply(1.0f, 0.0f);
-  value = 0.9f * value;
-  EXPECT_FLOAT_EQ(value, filter.filtered());
-}
-
-}  // namespace rtc
diff --git a/rtc_base/numerics/percentile_filter.h b/rtc_base/numerics/percentile_filter.h
deleted file mode 100644
index b514aab..0000000
--- a/rtc_base/numerics/percentile_filter.h
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- *  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_RTC_BASE_NUMERICS_PERCENTILE_FILTER_H_
-#define WEBRTC_RTC_BASE_NUMERICS_PERCENTILE_FILTER_H_
-
-#include <stdint.h>
-
-#include <iterator>
-#include <set>
-
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-
-// Class to efficiently get the percentile value from a group of observations.
-// The percentile is the value below which a given percentage of the
-// observations fall.
-template <typename T>
-class PercentileFilter {
- public:
-  // Construct filter. |percentile| should be between 0 and 1.
-  explicit PercentileFilter(float percentile);
-
-  // Insert one observation. The complexity of this operation is logarithmic in
-  // the size of the container.
-  void Insert(const T& value);
-
-  // Remove one observation or return false if |value| doesn't exist in the
-  // container. The complexity of this operation is logarithmic in the size of
-  // the container.
-  bool Erase(const T& value);
-
-  // Get the percentile value. The complexity of this operation is constant.
-  T GetPercentileValue() const;
-
- private:
-  // Update iterator and index to point at target percentile value.
-  void UpdatePercentileIterator();
-
-  const float percentile_;
-  std::multiset<T> set_;
-  // Maintain iterator and index of current target percentile value.
-  typename std::multiset<T>::iterator percentile_it_;
-  int64_t percentile_index_;
-};
-
-template <typename T>
-PercentileFilter<T>::PercentileFilter(float percentile)
-    : percentile_(percentile),
-      percentile_it_(set_.begin()),
-      percentile_index_(0) {
-  RTC_CHECK_GE(percentile, 0.0f);
-  RTC_CHECK_LE(percentile, 1.0f);
-}
-
-template <typename T>
-void PercentileFilter<T>::Insert(const T& value) {
-  // Insert element at the upper bound.
-  set_.insert(value);
-  if (set_.size() == 1u) {
-    // First element inserted - initialize percentile iterator and index.
-    percentile_it_ = set_.begin();
-    percentile_index_ = 0;
-  } else if (value < *percentile_it_) {
-    // If new element is before us, increment |percentile_index_|.
-    ++percentile_index_;
-  }
-  UpdatePercentileIterator();
-}
-
-template <typename T>
-bool PercentileFilter<T>::Erase(const T& value) {
-  typename std::multiset<T>::const_iterator it = set_.lower_bound(value);
-  // Ignore erase operation if the element is not present in the current set.
-  if (it == set_.end() || *it != value)
-    return false;
-  if (it == percentile_it_) {
-    // If same iterator, update to the following element. Index is not
-    // affected.
-    percentile_it_ = set_.erase(it);
-  } else {
-    set_.erase(it);
-    // If erased element was before us, decrement |percentile_index_|.
-    if (value <= *percentile_it_)
-      --percentile_index_;
-  }
-  UpdatePercentileIterator();
-  return true;
-}
-
-template <typename T>
-void PercentileFilter<T>::UpdatePercentileIterator() {
-  if (set_.empty())
-    return;
-  const int64_t index = static_cast<int64_t>(percentile_ * (set_.size() - 1));
-  std::advance(percentile_it_, index - percentile_index_);
-  percentile_index_ = index;
-}
-
-template <typename T>
-T PercentileFilter<T>::GetPercentileValue() const {
-  return set_.empty() ? 0 : *percentile_it_;
-}
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_RTC_BASE_NUMERICS_PERCENTILE_FILTER_H_
diff --git a/rtc_base/numerics/percentile_filter_unittest.cc b/rtc_base/numerics/percentile_filter_unittest.cc
deleted file mode 100644
index 22d2085..0000000
--- a/rtc_base/numerics/percentile_filter_unittest.cc
+++ /dev/null
@@ -1,138 +0,0 @@
-/*
- *  Copyright 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 <algorithm>
-#include <climits>
-
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/numerics/percentile_filter.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-class PercentileFilterTest : public ::testing::TestWithParam<float> {
- public:
-  PercentileFilterTest() : filter_(GetParam()) {
-    // Make sure the tests are deterministic by seeding with a constant.
-    srand(42);
-  }
-
- protected:
-  PercentileFilter<int64_t> filter_;
-
- private:
-  RTC_DISALLOW_COPY_AND_ASSIGN(PercentileFilterTest);
-};
-
-INSTANTIATE_TEST_CASE_P(PercentileFilterTests,
-                        PercentileFilterTest,
-                        ::testing::Values(0.0f, 0.1f, 0.5f, 0.9f, 1.0f));
-
-TEST(PercentileFilterTest, MinFilter) {
-  PercentileFilter<int64_t> filter(0.0f);
-  filter.Insert(4);
-  EXPECT_EQ(4, filter.GetPercentileValue());
-  filter.Insert(3);
-  EXPECT_EQ(3, filter.GetPercentileValue());
-}
-
-TEST(PercentileFilterTest, MaxFilter) {
-  PercentileFilter<int64_t> filter(1.0f);
-  filter.Insert(3);
-  EXPECT_EQ(3, filter.GetPercentileValue());
-  filter.Insert(4);
-  EXPECT_EQ(4, filter.GetPercentileValue());
-}
-
-TEST(PercentileFilterTest, MedianFilterDouble) {
-  PercentileFilter<double> filter(0.5f);
-  filter.Insert(2.71828);
-  filter.Insert(3.14159);
-  filter.Insert(1.41421);
-  EXPECT_EQ(2.71828, filter.GetPercentileValue());
-}
-
-TEST(PercentileFilterTest, MedianFilterInt) {
-  PercentileFilter<int> filter(0.5f);
-  filter.Insert(INT_MIN);
-  filter.Insert(1);
-  filter.Insert(2);
-  EXPECT_EQ(1, filter.GetPercentileValue());
-  filter.Insert(INT_MAX);
-  filter.Erase(INT_MIN);
-  EXPECT_EQ(2, filter.GetPercentileValue());
-}
-
-TEST(PercentileFilterTest, MedianFilterUnsigned) {
-  PercentileFilter<unsigned> filter(0.5f);
-  filter.Insert(UINT_MAX);
-  filter.Insert(2u);
-  filter.Insert(1u);
-  EXPECT_EQ(2u, filter.GetPercentileValue());
-  filter.Insert(0u);
-  filter.Erase(UINT_MAX);
-  EXPECT_EQ(1u, filter.GetPercentileValue());
-}
-
-TEST_P(PercentileFilterTest, EmptyFilter) {
-  EXPECT_EQ(0, filter_.GetPercentileValue());
-  filter_.Insert(3);
-  bool success = filter_.Erase(3);
-  EXPECT_TRUE(success);
-  EXPECT_EQ(0, filter_.GetPercentileValue());
-}
-
-TEST_P(PercentileFilterTest, EraseNonExistingElement) {
-  bool success = filter_.Erase(3);
-  EXPECT_FALSE(success);
-  EXPECT_EQ(0, filter_.GetPercentileValue());
-  filter_.Insert(4);
-  success = filter_.Erase(3);
-  EXPECT_FALSE(success);
-  EXPECT_EQ(4, filter_.GetPercentileValue());
-}
-
-TEST_P(PercentileFilterTest, DuplicateElements) {
-  filter_.Insert(3);
-  filter_.Insert(3);
-  filter_.Erase(3);
-  EXPECT_EQ(3, filter_.GetPercentileValue());
-}
-
-TEST_P(PercentileFilterTest, InsertAndEraseTenValuesInRandomOrder) {
-  int64_t zero_to_nine[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
-  // The percentile value of the ten values above.
-  const int64_t expected_value = static_cast<int64_t>(GetParam() * 9);
-
-  // Insert two sets of |zero_to_nine| in random order.
-  for (int i = 0; i < 2; ++i) {
-    std::random_shuffle(zero_to_nine, zero_to_nine + 10);
-    for (int64_t value : zero_to_nine)
-      filter_.Insert(value);
-    // After inserting a full set of |zero_to_nine|, the percentile should
-    // stay constant.
-    EXPECT_EQ(expected_value, filter_.GetPercentileValue());
-  }
-
-  // Insert and erase sets of |zero_to_nine| in random order a few times.
-  for (int i = 0; i < 3; ++i) {
-    std::random_shuffle(zero_to_nine, zero_to_nine + 10);
-    for (int64_t value : zero_to_nine)
-      filter_.Erase(value);
-    EXPECT_EQ(expected_value, filter_.GetPercentileValue());
-
-    std::random_shuffle(zero_to_nine, zero_to_nine + 10);
-    for (int64_t value : zero_to_nine)
-      filter_.Insert(value);
-    EXPECT_EQ(expected_value, filter_.GetPercentileValue());
-  }
-}
-
-}  // namespace webrtc
diff --git a/rtc_base/onetimeevent.h b/rtc_base/onetimeevent.h
deleted file mode 100644
index 37afba2..0000000
--- a/rtc_base/onetimeevent.h
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- *  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_RTC_BASE_ONETIMEEVENT_H_
-#define WEBRTC_RTC_BASE_ONETIMEEVENT_H_
-
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-// Provides a simple way to perform an operation (such as logging) one
-// time in a certain scope.
-// Example:
-//   OneTimeEvent firstFrame;
-//   ...
-//   if (firstFrame()) {
-//     LOG(LS_INFO) << "This is the first frame".
-//   }
-class OneTimeEvent {
- public:
-  OneTimeEvent() {}
-  bool operator()() {
-    rtc::CritScope cs(&critsect_);
-    if (happened_) {
-      return false;
-    }
-    happened_ = true;
-    return true;
-  }
-
- private:
-  bool happened_ = false;
-  rtc::CriticalSection critsect_;
-};
-
-// A non-thread-safe, ligher-weight version of the OneTimeEvent class.
-class ThreadUnsafeOneTimeEvent {
- public:
-  ThreadUnsafeOneTimeEvent() {}
-  bool operator()() {
-    if (happened_) {
-      return false;
-    }
-    happened_ = true;
-    return true;
-  }
-
- private:
-  bool happened_ = false;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_RTC_BASE_ONETIMEEVENT_H_
diff --git a/rtc_base/onetimeevent_unittest.cc b/rtc_base/onetimeevent_unittest.cc
deleted file mode 100644
index e4984e2..0000000
--- a/rtc_base/onetimeevent_unittest.cc
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- *  Copyright 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/rtc_base/onetimeevent.h"
-#include "webrtc/rtc_base/gunit.h"
-
-namespace webrtc {
-
-TEST(OneTimeEventTest, ThreadSafe) {
-  OneTimeEvent ot;
-
-  // The one time event is expected to evaluate to true only the first time.
-  EXPECT_TRUE(ot());
-  EXPECT_FALSE(ot());
-  EXPECT_FALSE(ot());
-}
-
-TEST(OneTimeEventTest, ThreadUnsafe) {
-  ThreadUnsafeOneTimeEvent ot;
-
-  EXPECT_TRUE(ot());
-  EXPECT_FALSE(ot());
-  EXPECT_FALSE(ot());
-}
-
-}  // namespace webrtc
diff --git a/rtc_base/openssl.h b/rtc_base/openssl.h
deleted file mode 100644
index 4c89c94..0000000
--- a/rtc_base/openssl.h
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- *  Copyright 2013 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_RTC_BASE_OPENSSL_H_
-#define WEBRTC_RTC_BASE_OPENSSL_H_
-
-#include <openssl/ssl.h>
-
-#if (OPENSSL_VERSION_NUMBER < 0x10000000L)
-#error OpenSSL is older than 1.0.0, which is the minimum supported version.
-#endif
-
-#endif  // WEBRTC_RTC_BASE_OPENSSL_H_
diff --git a/rtc_base/openssladapter.cc b/rtc_base/openssladapter.cc
deleted file mode 100644
index d944fa0..0000000
--- a/rtc_base/openssladapter.cc
+++ /dev/null
@@ -1,1189 +0,0 @@
-/*
- *  Copyright 2008 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/rtc_base/openssladapter.h"
-
-#if defined(WEBRTC_POSIX)
-#include <unistd.h>
-#endif
-
-// Must be included first before openssl headers.
-#include "webrtc/rtc_base/win32.h"  // NOLINT
-
-#include <openssl/bio.h>
-#include <openssl/crypto.h>
-#include <openssl/err.h>
-#include <openssl/opensslv.h>
-#include <openssl/rand.h>
-#include <openssl/x509.h>
-#include <openssl/x509v3.h>
-
-#include "webrtc/rtc_base/arraysize.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/openssl.h"
-#include "webrtc/rtc_base/safe_conversions.h"
-#include "webrtc/rtc_base/sslroots.h"
-#include "webrtc/rtc_base/stringencode.h"
-#include "webrtc/rtc_base/stringutils.h"
-#include "webrtc/rtc_base/thread.h"
-
-#ifndef OPENSSL_IS_BORINGSSL
-
-// TODO: Use a nicer abstraction for mutex.
-
-#if defined(WEBRTC_WIN)
-  #define MUTEX_TYPE HANDLE
-#define MUTEX_SETUP(x) (x) = CreateMutex(nullptr, FALSE, nullptr)
-#define MUTEX_CLEANUP(x) CloseHandle(x)
-#define MUTEX_LOCK(x) WaitForSingleObject((x), INFINITE)
-#define MUTEX_UNLOCK(x) ReleaseMutex(x)
-#define THREAD_ID GetCurrentThreadId()
-#elif defined(WEBRTC_POSIX)
-  #define MUTEX_TYPE pthread_mutex_t
-  #define MUTEX_SETUP(x) pthread_mutex_init(&(x), nullptr)
-  #define MUTEX_CLEANUP(x) pthread_mutex_destroy(&(x))
-  #define MUTEX_LOCK(x) pthread_mutex_lock(&(x))
-  #define MUTEX_UNLOCK(x) pthread_mutex_unlock(&(x))
-  #define THREAD_ID pthread_self()
-#else
-  #error You must define mutex operations appropriate for your platform!
-#endif
-
-struct CRYPTO_dynlock_value {
-  MUTEX_TYPE mutex;
-};
-
-#endif  // #ifndef OPENSSL_IS_BORINGSSL
-
-//////////////////////////////////////////////////////////////////////
-// SocketBIO
-//////////////////////////////////////////////////////////////////////
-
-static int socket_write(BIO* h, const char* buf, int num);
-static int socket_read(BIO* h, char* buf, int size);
-static int socket_puts(BIO* h, const char* str);
-static long socket_ctrl(BIO* h, int cmd, long arg1, void* arg2);
-static int socket_new(BIO* h);
-static int socket_free(BIO* data);
-
-// TODO(davidben): This should be const once BoringSSL is assumed.
-static BIO_METHOD methods_socket = {
-    BIO_TYPE_BIO, "socket",   socket_write, socket_read, socket_puts, 0,
-    socket_ctrl,  socket_new, socket_free,  nullptr,
-};
-
-static BIO_METHOD* BIO_s_socket2() { return(&methods_socket); }
-
-static BIO* BIO_new_socket(rtc::AsyncSocket* socket) {
-  BIO* ret = BIO_new(BIO_s_socket2());
-  if (ret == nullptr) {
-    return nullptr;
-  }
-  ret->ptr = socket;
-  return ret;
-}
-
-static int socket_new(BIO* b) {
-  b->shutdown = 0;
-  b->init = 1;
-  b->num = 0; // 1 means socket closed
-  b->ptr = 0;
-  return 1;
-}
-
-static int socket_free(BIO* b) {
-  if (b == nullptr)
-    return 0;
-  return 1;
-}
-
-static int socket_read(BIO* b, char* out, int outl) {
-  if (!out)
-    return -1;
-  rtc::AsyncSocket* socket = static_cast<rtc::AsyncSocket*>(b->ptr);
-  BIO_clear_retry_flags(b);
-  int result = socket->Recv(out, outl, nullptr);
-  if (result > 0) {
-    return result;
-  } else if (result == 0) {
-    b->num = 1;
-  } else if (socket->IsBlocking()) {
-    BIO_set_retry_read(b);
-  }
-  return -1;
-}
-
-static int socket_write(BIO* b, const char* in, int inl) {
-  if (!in)
-    return -1;
-  rtc::AsyncSocket* socket = static_cast<rtc::AsyncSocket*>(b->ptr);
-  BIO_clear_retry_flags(b);
-  int result = socket->Send(in, inl);
-  if (result > 0) {
-    return result;
-  } else if (socket->IsBlocking()) {
-    BIO_set_retry_write(b);
-  }
-  return -1;
-}
-
-static int socket_puts(BIO* b, const char* str) {
-  return socket_write(b, str, rtc::checked_cast<int>(strlen(str)));
-}
-
-static long socket_ctrl(BIO* b, int cmd, long num, void* ptr) {
-  switch (cmd) {
-  case BIO_CTRL_RESET:
-    return 0;
-  case BIO_CTRL_EOF:
-    return b->num;
-  case BIO_CTRL_WPENDING:
-  case BIO_CTRL_PENDING:
-    return 0;
-  case BIO_CTRL_FLUSH:
-    return 1;
-  default:
-    return 0;
-  }
-}
-
-static void LogSslError() {
-  // Walk down the error stack to find the SSL error.
-  uint32_t error_code;
-  const char* file;
-  int line;
-  do {
-    error_code = ERR_get_error_line(&file, &line);
-    if (ERR_GET_LIB(error_code) == ERR_LIB_SSL) {
-      LOG(LS_ERROR) << "ERR_LIB_SSL: " << error_code << ", " << file << ":"
-                    << line;
-      break;
-    }
-  } while (error_code != 0);
-}
-
-/////////////////////////////////////////////////////////////////////////////
-// OpenSSLAdapter
-/////////////////////////////////////////////////////////////////////////////
-
-namespace rtc {
-
-#ifndef OPENSSL_IS_BORINGSSL
-
-// This array will store all of the mutexes available to OpenSSL.
-static MUTEX_TYPE* mutex_buf = nullptr;
-
-static void locking_function(int mode, int n, const char * file, int line) {
-  if (mode & CRYPTO_LOCK) {
-    MUTEX_LOCK(mutex_buf[n]);
-  } else {
-    MUTEX_UNLOCK(mutex_buf[n]);
-  }
-}
-
-static unsigned long id_function() {  // NOLINT
-  // Use old-style C cast because THREAD_ID's type varies with the platform,
-  // in some cases requiring static_cast, and in others requiring
-  // reinterpret_cast.
-  return (unsigned long)THREAD_ID; // NOLINT
-}
-
-static CRYPTO_dynlock_value* dyn_create_function(const char* file, int line) {
-  CRYPTO_dynlock_value* value = new CRYPTO_dynlock_value;
-  if (!value)
-    return nullptr;
-  MUTEX_SETUP(value->mutex);
-  return value;
-}
-
-static void dyn_lock_function(int mode, CRYPTO_dynlock_value* l,
-                              const char* file, int line) {
-  if (mode & CRYPTO_LOCK) {
-    MUTEX_LOCK(l->mutex);
-  } else {
-    MUTEX_UNLOCK(l->mutex);
-  }
-}
-
-static void dyn_destroy_function(CRYPTO_dynlock_value* l,
-                                 const char* file, int line) {
-  MUTEX_CLEANUP(l->mutex);
-  delete l;
-}
-
-#endif  // #ifndef OPENSSL_IS_BORINGSSL
-
-VerificationCallback OpenSSLAdapter::custom_verify_callback_ = nullptr;
-
-bool OpenSSLAdapter::InitializeSSL(VerificationCallback callback) {
-  if (!InitializeSSLThread() || !SSL_library_init())
-      return false;
-#if !defined(ADDRESS_SANITIZER) || !defined(WEBRTC_MAC) || defined(WEBRTC_IOS)
-  // Loading the error strings crashes mac_asan.  Omit this debugging aid there.
-  SSL_load_error_strings();
-#endif
-  ERR_load_BIO_strings();
-  OpenSSL_add_all_algorithms();
-  RAND_poll();
-  custom_verify_callback_ = callback;
-  return true;
-}
-
-bool OpenSSLAdapter::InitializeSSLThread() {
-  // BoringSSL is doing the locking internally, so the callbacks are not used
-  // in this case (and are no-ops anyways).
-#ifndef OPENSSL_IS_BORINGSSL
-  mutex_buf = new MUTEX_TYPE[CRYPTO_num_locks()];
-  if (!mutex_buf)
-    return false;
-  for (int i = 0; i < CRYPTO_num_locks(); ++i)
-    MUTEX_SETUP(mutex_buf[i]);
-
-  // we need to cast our id_function to return an unsigned long -- pthread_t is
-  // a pointer
-  CRYPTO_set_id_callback(id_function);
-  CRYPTO_set_locking_callback(locking_function);
-  CRYPTO_set_dynlock_create_callback(dyn_create_function);
-  CRYPTO_set_dynlock_lock_callback(dyn_lock_function);
-  CRYPTO_set_dynlock_destroy_callback(dyn_destroy_function);
-#endif  // #ifndef OPENSSL_IS_BORINGSSL
-  return true;
-}
-
-bool OpenSSLAdapter::CleanupSSL() {
-#ifndef OPENSSL_IS_BORINGSSL
-  if (!mutex_buf)
-    return false;
-  CRYPTO_set_id_callback(nullptr);
-  CRYPTO_set_locking_callback(nullptr);
-  CRYPTO_set_dynlock_create_callback(nullptr);
-  CRYPTO_set_dynlock_lock_callback(nullptr);
-  CRYPTO_set_dynlock_destroy_callback(nullptr);
-  for (int i = 0; i < CRYPTO_num_locks(); ++i)
-    MUTEX_CLEANUP(mutex_buf[i]);
-  delete [] mutex_buf;
-  mutex_buf = nullptr;
-#endif  // #ifndef OPENSSL_IS_BORINGSSL
-  return true;
-}
-
-OpenSSLAdapter::OpenSSLAdapter(AsyncSocket* socket,
-                               OpenSSLAdapterFactory* factory)
-    : SSLAdapter(socket),
-      factory_(factory),
-      state_(SSL_NONE),
-      role_(SSL_CLIENT),
-      ssl_read_needs_write_(false),
-      ssl_write_needs_read_(false),
-      restartable_(false),
-      ssl_(nullptr),
-      ssl_ctx_(nullptr),
-      ssl_mode_(SSL_MODE_TLS),
-      ignore_bad_cert_(false),
-      custom_verification_succeeded_(false) {
-  // If a factory is used, take a reference on the factory's SSL_CTX.
-  // Otherwise, we'll create our own later.
-  // Either way, we'll release our reference via SSL_CTX_free() in Cleanup().
-  if (factory_) {
-    ssl_ctx_ = factory_->ssl_ctx();
-    RTC_DCHECK(ssl_ctx_);
-    // Note: if using OpenSSL, requires version 1.1.0 or later.
-    SSL_CTX_up_ref(ssl_ctx_);
-  }
-}
-
-OpenSSLAdapter::~OpenSSLAdapter() {
-  Cleanup();
-}
-
-void OpenSSLAdapter::SetIgnoreBadCert(bool ignore) {
-  ignore_bad_cert_ = ignore;
-}
-
-void OpenSSLAdapter::SetAlpnProtocols(const std::vector<std::string>& protos) {
-  alpn_protocols_ = protos;
-}
-
-void OpenSSLAdapter::SetEllipticCurves(const std::vector<std::string>& curves) {
-  elliptic_curves_ = curves;
-}
-
-void OpenSSLAdapter::SetMode(SSLMode mode) {
-  RTC_DCHECK(!ssl_ctx_);
-  RTC_DCHECK(state_ == SSL_NONE);
-  ssl_mode_ = mode;
-}
-
-void OpenSSLAdapter::SetIdentity(SSLIdentity* identity) {
-  RTC_DCHECK(!identity_);
-  identity_.reset(static_cast<OpenSSLIdentity*>(identity));
-}
-
-void OpenSSLAdapter::SetRole(SSLRole role) {
-  role_ = role;
-}
-
-AsyncSocket* OpenSSLAdapter::Accept(SocketAddress* paddr) {
-  RTC_DCHECK(role_ == SSL_SERVER);
-  AsyncSocket* socket = SSLAdapter::Accept(paddr);
-  if (!socket) {
-    return nullptr;
-  }
-
-  SSLAdapter* adapter = SSLAdapter::Create(socket);
-  adapter->SetIdentity(identity_->GetReference());
-  adapter->SetRole(rtc::SSL_SERVER);
-  adapter->SetIgnoreBadCert(ignore_bad_cert_);
-  adapter->StartSSL("", false);
-  return adapter;
-}
-
-int OpenSSLAdapter::StartSSL(const char* hostname, bool restartable) {
-  if (state_ != SSL_NONE)
-    return -1;
-
-  ssl_host_name_ = hostname;
-  restartable_ = restartable;
-
-  if (socket_->GetState() != Socket::CS_CONNECTED) {
-    state_ = SSL_WAIT;
-    return 0;
-  }
-
-  state_ = SSL_CONNECTING;
-  if (int err = BeginSSL()) {
-    Error("BeginSSL", err, false);
-    return err;
-  }
-
-  return 0;
-}
-
-int OpenSSLAdapter::BeginSSL() {
-  LOG(LS_INFO) << "OpenSSLAdapter::BeginSSL: " << ssl_host_name_;
-  RTC_DCHECK(state_ == SSL_CONNECTING);
-
-  int err = 0;
-  BIO* bio = nullptr;
-
-  // First set up the context. We should either have a factory, with its own
-  // pre-existing context, or be running standalone, in which case we will
-  // need to create one, and specify |false| to disable session caching.
-  if (!factory_) {
-    RTC_DCHECK(!ssl_ctx_);
-    ssl_ctx_ = CreateContext(ssl_mode_, false);
-  }
-  if (!ssl_ctx_) {
-    err = -1;
-    goto ssl_error;
-  }
-
-  if (identity_ && !identity_->ConfigureIdentity(ssl_ctx_)) {
-    SSL_CTX_free(ssl_ctx_);
-    err = -1;
-    goto ssl_error;
-  }
-
-  bio = BIO_new_socket(socket_);
-  if (!bio) {
-    err = -1;
-    goto ssl_error;
-  }
-
-  ssl_ = SSL_new(ssl_ctx_);
-  if (!ssl_) {
-    err = -1;
-    goto ssl_error;
-  }
-
-  SSL_set_app_data(ssl_, this);
-
-  // SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER allows different buffers to be passed
-  // into SSL_write when a record could only be partially transmitted (and thus
-  // requires another call to SSL_write to finish transmission). This allows us
-  // to copy the data into our own buffer when this occurs, since the original
-  // buffer can't safely be accessed after control exits Send.
-  // TODO(deadbeef): Do we want SSL_MODE_ENABLE_PARTIAL_WRITE? It doesn't
-  // appear Send handles partial writes properly, though maybe we never notice
-  // since we never send more than 16KB at once..
-  SSL_set_mode(ssl_, SSL_MODE_ENABLE_PARTIAL_WRITE |
-                     SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER);
-
-  // Enable SNI, if a hostname is supplied.
-  if (!ssl_host_name_.empty()) {
-    SSL_set_tlsext_host_name(ssl_, ssl_host_name_.c_str());
-
-    // Enable session caching, if configured and a hostname is supplied.
-    if (factory_) {
-      SSL_SESSION* cached = factory_->LookupSession(ssl_host_name_);
-      if (cached) {
-        if (SSL_set_session(ssl_, cached) == 0) {
-          LOG(LS_WARNING) << "Failed to apply SSL session from cache";
-          err = -1;
-          goto ssl_error;
-        }
-
-        LOG(LS_INFO) << "Attempting to resume SSL session to "
-                     << ssl_host_name_;
-      }
-    }
-  }
-
-  // Set a couple common TLS extensions; even though we don't use them yet.
-  SSL_enable_ocsp_stapling(ssl_);
-  SSL_enable_signed_cert_timestamps(ssl_);
-
-  if (!alpn_protocols_.empty()) {
-    std::string tls_alpn_string = TransformAlpnProtocols(alpn_protocols_);
-    if (!tls_alpn_string.empty()) {
-      SSL_set_alpn_protos(
-          ssl_, reinterpret_cast<const unsigned char*>(tls_alpn_string.data()),
-          tls_alpn_string.size());
-    }
-  }
-
-  if (!elliptic_curves_.empty()) {
-    SSL_set1_curves_list(ssl_, rtc::join(elliptic_curves_, ':').c_str());
-  }
-
-  // Now that the initial config is done, transfer ownership of |bio| to the
-  // SSL object. If ContinueSSL() fails, the bio will be freed in Cleanup().
-  SSL_set_bio(ssl_, bio, bio);
-  bio = nullptr;
-
-  // Do the connect.
-  err = ContinueSSL();
-  if (err != 0)
-    goto ssl_error;
-
-  return err;
-
-ssl_error:
-  Cleanup();
-  if (bio)
-    BIO_free(bio);
-
-  return err;
-}
-
-int OpenSSLAdapter::ContinueSSL() {
-  RTC_DCHECK(state_ == SSL_CONNECTING);
-
-  // Clear the DTLS timer
-  Thread::Current()->Clear(this, MSG_TIMEOUT);
-
-  int code = (role_ == SSL_CLIENT) ? SSL_connect(ssl_) : SSL_accept(ssl_);
-  switch (SSL_get_error(ssl_, code)) {
-  case SSL_ERROR_NONE:
-    if (!SSLPostConnectionCheck(ssl_, ssl_host_name_.c_str())) {
-      LOG(LS_ERROR) << "TLS post connection check failed";
-      // make sure we close the socket
-      Cleanup();
-      // The connect failed so return -1 to shut down the socket
-      return -1;
-    }
-
-    state_ = SSL_CONNECTED;
-    AsyncSocketAdapter::OnConnectEvent(this);
-#if 0  // TODO: worry about this
-    // Don't let ourselves go away during the callbacks
-    PRefPtr<OpenSSLAdapter> lock(this);
-    LOG(LS_INFO) << " -- onStreamReadable";
-    AsyncSocketAdapter::OnReadEvent(this);
-    LOG(LS_INFO) << " -- onStreamWriteable";
-    AsyncSocketAdapter::OnWriteEvent(this);
-#endif
-    break;
-
-  case SSL_ERROR_WANT_READ:
-    LOG(LS_VERBOSE) << " -- error want read";
-    struct timeval timeout;
-    if (DTLSv1_get_timeout(ssl_, &timeout)) {
-      int delay = timeout.tv_sec * 1000 + timeout.tv_usec/1000;
-
-      Thread::Current()->PostDelayed(RTC_FROM_HERE, delay, this, MSG_TIMEOUT,
-                                     0);
-    }
-    break;
-
-  case SSL_ERROR_WANT_WRITE:
-    break;
-
-  case SSL_ERROR_ZERO_RETURN:
-  default:
-    LOG(LS_WARNING) << "ContinueSSL -- error " << code;
-    return (code != 0) ? code : -1;
-  }
-
-  return 0;
-}
-
-void OpenSSLAdapter::Error(const char* context, int err, bool signal) {
-  LOG(LS_WARNING) << "OpenSSLAdapter::Error("
-                  << context << ", " << err << ")";
-  state_ = SSL_ERROR;
-  SetError(err);
-  if (signal)
-    AsyncSocketAdapter::OnCloseEvent(this, err);
-}
-
-void OpenSSLAdapter::Cleanup() {
-  LOG(LS_INFO) << "OpenSSLAdapter::Cleanup";
-
-  state_ = SSL_NONE;
-  ssl_read_needs_write_ = false;
-  ssl_write_needs_read_ = false;
-  custom_verification_succeeded_ = false;
-  pending_data_.Clear();
-
-  if (ssl_) {
-    SSL_free(ssl_);
-    ssl_ = nullptr;
-  }
-
-  if (ssl_ctx_) {
-    SSL_CTX_free(ssl_ctx_);
-    ssl_ctx_ = nullptr;
-  }
-  identity_.reset();
-
-  // Clear the DTLS timer
-  Thread::Current()->Clear(this, MSG_TIMEOUT);
-}
-
-int OpenSSLAdapter::DoSslWrite(const void* pv, size_t cb, int* error) {
-  // If we have pending data (that was previously only partially written by
-  // SSL_write), we shouldn't be attempting to write anything else.
-  RTC_DCHECK(pending_data_.empty() || pv == pending_data_.data());
-  RTC_DCHECK(error != nullptr);
-
-  ssl_write_needs_read_ = false;
-  int ret = SSL_write(ssl_, pv, checked_cast<int>(cb));
-  *error = SSL_get_error(ssl_, ret);
-  switch (*error) {
-    case SSL_ERROR_NONE:
-      // Success!
-      return ret;
-    case SSL_ERROR_WANT_READ:
-      LOG(LS_INFO) << " -- error want read";
-      ssl_write_needs_read_ = true;
-      SetError(EWOULDBLOCK);
-      break;
-    case SSL_ERROR_WANT_WRITE:
-      LOG(LS_INFO) << " -- error want write";
-      SetError(EWOULDBLOCK);
-      break;
-    case SSL_ERROR_ZERO_RETURN:
-      // LOG(LS_INFO) << " -- remote side closed";
-      SetError(EWOULDBLOCK);
-      // do we need to signal closure?
-      break;
-    case SSL_ERROR_SSL:
-      LogSslError();
-      Error("SSL_write", ret ? ret : -1, false);
-      break;
-    default:
-      LOG(LS_WARNING) << "Unknown error from SSL_write: " << *error;
-      Error("SSL_write", ret ? ret : -1, false);
-      break;
-  }
-
-  return SOCKET_ERROR;
-}
-
-//
-// AsyncSocket Implementation
-//
-
-int OpenSSLAdapter::Send(const void* pv, size_t cb) {
-  //LOG(LS_INFO) << "OpenSSLAdapter::Send(" << cb << ")";
-
-  switch (state_) {
-  case SSL_NONE:
-    return AsyncSocketAdapter::Send(pv, cb);
-
-  case SSL_WAIT:
-  case SSL_CONNECTING:
-    SetError(ENOTCONN);
-    return SOCKET_ERROR;
-
-  case SSL_CONNECTED:
-    break;
-
-  case SSL_ERROR:
-  default:
-    return SOCKET_ERROR;
-  }
-
-  int ret;
-  int error;
-
-  if (!pending_data_.empty()) {
-    ret = DoSslWrite(pending_data_.data(), pending_data_.size(), &error);
-    if (ret != static_cast<int>(pending_data_.size())) {
-      // We couldn't finish sending the pending data, so we definitely can't
-      // send any more data. Return with an EWOULDBLOCK error.
-      SetError(EWOULDBLOCK);
-      return SOCKET_ERROR;
-    }
-    // We completed sending the data previously passed into SSL_write! Now
-    // we're allowed to send more data.
-    pending_data_.Clear();
-  }
-
-  // OpenSSL will return an error if we try to write zero bytes
-  if (cb == 0)
-    return 0;
-
-  ret = DoSslWrite(pv, cb, &error);
-
-  // If SSL_write fails with SSL_ERROR_WANT_READ or SSL_ERROR_WANT_WRITE, this
-  // means the underlying socket is blocked on reading or (more typically)
-  // writing. When this happens, OpenSSL requires that the next call to
-  // SSL_write uses the same arguments (though, with
-  // SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER, the actual buffer pointer may be
-  // different).
-  //
-  // However, after Send exits, we will have lost access to data the user of
-  // this class is trying to send, and there's no guarantee that the user of
-  // this class will call Send with the same arguements when it fails. So, we
-  // buffer the data ourselves. When we know the underlying socket is writable
-  // again from OnWriteEvent (or if Send is called again before that happens),
-  // we'll retry sending this buffered data.
-  if (error == SSL_ERROR_WANT_READ || error == SSL_ERROR_WANT_WRITE) {
-    // Shouldn't be able to get to this point if we already have pending data.
-    RTC_DCHECK(pending_data_.empty());
-    LOG(LS_WARNING)
-        << "SSL_write couldn't write to the underlying socket; buffering data.";
-    pending_data_.SetData(static_cast<const uint8_t*>(pv), cb);
-    // Since we're taking responsibility for sending this data, return its full
-    // size. The user of this class can consider it sent.
-    return cb;
-  }
-
-  return ret;
-}
-
-int OpenSSLAdapter::SendTo(const void* pv,
-                           size_t cb,
-                           const SocketAddress& addr) {
-  if (socket_->GetState() == Socket::CS_CONNECTED &&
-      addr == socket_->GetRemoteAddress()) {
-    return Send(pv, cb);
-  }
-
-  SetError(ENOTCONN);
-
-  return SOCKET_ERROR;
-}
-
-int OpenSSLAdapter::Recv(void* pv, size_t cb, int64_t* timestamp) {
-  //LOG(LS_INFO) << "OpenSSLAdapter::Recv(" << cb << ")";
-  switch (state_) {
-
-  case SSL_NONE:
-    return AsyncSocketAdapter::Recv(pv, cb, timestamp);
-
-  case SSL_WAIT:
-  case SSL_CONNECTING:
-    SetError(ENOTCONN);
-    return SOCKET_ERROR;
-
-  case SSL_CONNECTED:
-    break;
-
-  case SSL_ERROR:
-  default:
-    return SOCKET_ERROR;
-  }
-
-  // Don't trust OpenSSL with zero byte reads
-  if (cb == 0)
-    return 0;
-
-  ssl_read_needs_write_ = false;
-
-  int code = SSL_read(ssl_, pv, checked_cast<int>(cb));
-  int error = SSL_get_error(ssl_, code);
-  switch (error) {
-    case SSL_ERROR_NONE:
-      // LOG(LS_INFO) << " -- success";
-      return code;
-    case SSL_ERROR_WANT_READ:
-      // LOG(LS_INFO) << " -- error want read";
-      SetError(EWOULDBLOCK);
-      break;
-    case SSL_ERROR_WANT_WRITE:
-      // LOG(LS_INFO) << " -- error want write";
-      ssl_read_needs_write_ = true;
-      SetError(EWOULDBLOCK);
-      break;
-    case SSL_ERROR_ZERO_RETURN:
-      // LOG(LS_INFO) << " -- remote side closed";
-      SetError(EWOULDBLOCK);
-      // do we need to signal closure?
-      break;
-    case SSL_ERROR_SSL:
-      LogSslError();
-      Error("SSL_read", (code ? code : -1), false);
-      break;
-    default:
-      LOG(LS_WARNING) << "Unknown error from SSL_read: " << error;
-      Error("SSL_read", (code ? code : -1), false);
-      break;
-  }
-
-  return SOCKET_ERROR;
-}
-
-int OpenSSLAdapter::RecvFrom(void* pv,
-                             size_t cb,
-                             SocketAddress* paddr,
-                             int64_t* timestamp) {
-  if (socket_->GetState() == Socket::CS_CONNECTED) {
-    int ret = Recv(pv, cb, timestamp);
-
-    *paddr = GetRemoteAddress();
-
-    return ret;
-  }
-
-  SetError(ENOTCONN);
-
-  return SOCKET_ERROR;
-}
-
-int OpenSSLAdapter::Close() {
-  Cleanup();
-  state_ = restartable_ ? SSL_WAIT : SSL_NONE;
-  return AsyncSocketAdapter::Close();
-}
-
-Socket::ConnState OpenSSLAdapter::GetState() const {
-  //if (signal_close_)
-  //  return CS_CONNECTED;
-  ConnState state = socket_->GetState();
-  if ((state == CS_CONNECTED)
-      && ((state_ == SSL_WAIT) || (state_ == SSL_CONNECTING)))
-    state = CS_CONNECTING;
-  return state;
-}
-
-bool OpenSSLAdapter::IsResumedSession() {
-  return (ssl_ && SSL_session_reused(ssl_) == 1);
-}
-
-void OpenSSLAdapter::OnMessage(Message* msg) {
-  if (MSG_TIMEOUT == msg->message_id) {
-    LOG(LS_INFO) << "DTLS timeout expired";
-    DTLSv1_handle_timeout(ssl_);
-    ContinueSSL();
-  }
-}
-
-void OpenSSLAdapter::OnConnectEvent(AsyncSocket* socket) {
-  LOG(LS_INFO) << "OpenSSLAdapter::OnConnectEvent";
-  if (state_ != SSL_WAIT) {
-    RTC_DCHECK(state_ == SSL_NONE);
-    AsyncSocketAdapter::OnConnectEvent(socket);
-    return;
-  }
-
-  state_ = SSL_CONNECTING;
-  if (int err = BeginSSL()) {
-    AsyncSocketAdapter::OnCloseEvent(socket, err);
-  }
-}
-
-void OpenSSLAdapter::OnReadEvent(AsyncSocket* socket) {
-  //LOG(LS_INFO) << "OpenSSLAdapter::OnReadEvent";
-
-  if (state_ == SSL_NONE) {
-    AsyncSocketAdapter::OnReadEvent(socket);
-    return;
-  }
-
-  if (state_ == SSL_CONNECTING) {
-    if (int err = ContinueSSL()) {
-      Error("ContinueSSL", err);
-    }
-    return;
-  }
-
-  if (state_ != SSL_CONNECTED)
-    return;
-
-  // Don't let ourselves go away during the callbacks
-  //PRefPtr<OpenSSLAdapter> lock(this); // TODO: fix this
-  if (ssl_write_needs_read_)  {
-    //LOG(LS_INFO) << " -- onStreamWriteable";
-    AsyncSocketAdapter::OnWriteEvent(socket);
-  }
-
-  //LOG(LS_INFO) << " -- onStreamReadable";
-  AsyncSocketAdapter::OnReadEvent(socket);
-}
-
-void OpenSSLAdapter::OnWriteEvent(AsyncSocket* socket) {
-  //LOG(LS_INFO) << "OpenSSLAdapter::OnWriteEvent";
-
-  if (state_ == SSL_NONE) {
-    AsyncSocketAdapter::OnWriteEvent(socket);
-    return;
-  }
-
-  if (state_ == SSL_CONNECTING) {
-    if (int err = ContinueSSL()) {
-      Error("ContinueSSL", err);
-    }
-    return;
-  }
-
-  if (state_ != SSL_CONNECTED)
-    return;
-
-  // Don't let ourselves go away during the callbacks
-  //PRefPtr<OpenSSLAdapter> lock(this); // TODO: fix this
-
-  if (ssl_read_needs_write_)  {
-    //LOG(LS_INFO) << " -- onStreamReadable";
-    AsyncSocketAdapter::OnReadEvent(socket);
-  }
-
-  // If a previous SSL_write failed due to the underlying socket being blocked,
-  // this will attempt finishing the write operation.
-  if (!pending_data_.empty()) {
-    int error;
-    if (DoSslWrite(pending_data_.data(), pending_data_.size(), &error) ==
-        static_cast<int>(pending_data_.size())) {
-      pending_data_.Clear();
-    }
-  }
-
-  //LOG(LS_INFO) << " -- onStreamWriteable";
-  AsyncSocketAdapter::OnWriteEvent(socket);
-}
-
-void OpenSSLAdapter::OnCloseEvent(AsyncSocket* socket, int err) {
-  LOG(LS_INFO) << "OpenSSLAdapter::OnCloseEvent(" << err << ")";
-  AsyncSocketAdapter::OnCloseEvent(socket, err);
-}
-
-bool OpenSSLAdapter::VerifyServerName(SSL* ssl, const char* host,
-                                      bool ignore_bad_cert) {
-  if (!host)
-    return false;
-
-  // Checking the return from SSL_get_peer_certificate here is not strictly
-  // necessary.  With our setup, it is not possible for it to return
-  // null.  However, it is good form to check the return.
-  X509* certificate = SSL_get_peer_certificate(ssl);
-  if (!certificate)
-    return false;
-
-  // Logging certificates is extremely verbose. So it is disabled by default.
-#ifdef LOG_CERTIFICATES
-  {
-    LOG(LS_INFO) << "Certificate from server:";
-    BIO* mem = BIO_new(BIO_s_mem());
-    X509_print_ex(mem, certificate, XN_FLAG_SEP_CPLUS_SPC, X509_FLAG_NO_HEADER);
-    BIO_write(mem, "\0", 1);
-    char* buffer;
-    BIO_get_mem_data(mem, &buffer);
-    LOG(LS_INFO) << buffer;
-    BIO_free(mem);
-
-    char* cipher_description =
-        SSL_CIPHER_description(SSL_get_current_cipher(ssl), nullptr, 128);
-    LOG(LS_INFO) << "Cipher: " << cipher_description;
-    OPENSSL_free(cipher_description);
-  }
-#endif
-
-  bool ok = false;
-  GENERAL_NAMES* names = reinterpret_cast<GENERAL_NAMES*>(
-      X509_get_ext_d2i(certificate, NID_subject_alt_name, nullptr, nullptr));
-  if (names) {
-    for (size_t i = 0; i < sk_GENERAL_NAME_num(names); i++) {
-      const GENERAL_NAME* name = sk_GENERAL_NAME_value(names, i);
-      if (name->type != GEN_DNS)
-        continue;
-      std::string value(
-          reinterpret_cast<const char*>(ASN1_STRING_data(name->d.dNSName)),
-          ASN1_STRING_length(name->d.dNSName));
-      // string_match takes NUL-terminated strings, so check for embedded NULs.
-      if (value.find('\0') != std::string::npos)
-        continue;
-      if (string_match(host, value.c_str())) {
-        ok = true;
-        break;
-      }
-    }
-    GENERAL_NAMES_free(names);
-  }
-
-  char data[256];
-  X509_NAME* subject;
-  if (!ok && ((subject = X509_get_subject_name(certificate)) != nullptr) &&
-      (X509_NAME_get_text_by_NID(subject, NID_commonName, data, sizeof(data)) >
-       0)) {
-    data[sizeof(data)-1] = 0;
-    if (_stricmp(data, host) == 0)
-      ok = true;
-  }
-
-  X509_free(certificate);
-
-  // This should only ever be turned on for debugging and development.
-  if (!ok && ignore_bad_cert) {
-    LOG(LS_WARNING) << "TLS certificate check FAILED.  "
-      << "Allowing connection anyway.";
-    ok = true;
-  }
-
-  return ok;
-}
-
-bool OpenSSLAdapter::SSLPostConnectionCheck(SSL* ssl, const char* host) {
-  bool ok = VerifyServerName(ssl, host, ignore_bad_cert_);
-
-  if (ok) {
-    ok = (SSL_get_verify_result(ssl) == X509_V_OK ||
-          custom_verification_succeeded_);
-  }
-
-  if (!ok && ignore_bad_cert_) {
-    LOG(LS_INFO) << "Other TLS post connection checks failed.";
-    ok = true;
-  }
-
-  return ok;
-}
-
-#if !defined(NDEBUG)
-
-// We only use this for tracing and so it is only needed in debug mode
-
-void OpenSSLAdapter::SSLInfoCallback(const SSL* s, int where, int ret) {
-  const char* str = "undefined";
-  int w = where & ~SSL_ST_MASK;
-  if (w & SSL_ST_CONNECT) {
-    str = "SSL_connect";
-  } else if (w & SSL_ST_ACCEPT) {
-    str = "SSL_accept";
-  }
-  if (where & SSL_CB_LOOP) {
-    LOG(LS_INFO) <<  str << ":" << SSL_state_string_long(s);
-  } else if (where & SSL_CB_ALERT) {
-    str = (where & SSL_CB_READ) ? "read" : "write";
-    LOG(LS_INFO) <<  "SSL3 alert " << str
-      << ":" << SSL_alert_type_string_long(ret)
-      << ":" << SSL_alert_desc_string_long(ret);
-  } else if (where & SSL_CB_EXIT) {
-    if (ret == 0) {
-      LOG(LS_INFO) << str << ":failed in " << SSL_state_string_long(s);
-    } else if (ret < 0) {
-      LOG(LS_INFO) << str << ":error in " << SSL_state_string_long(s);
-    }
-  }
-}
-
-#endif
-
-int OpenSSLAdapter::SSLVerifyCallback(int ok, X509_STORE_CTX* store) {
-#if !defined(NDEBUG)
-  if (!ok) {
-    char data[256];
-    X509* cert = X509_STORE_CTX_get_current_cert(store);
-    int depth = X509_STORE_CTX_get_error_depth(store);
-    int err = X509_STORE_CTX_get_error(store);
-
-    LOG(LS_INFO) << "Error with certificate at depth: " << depth;
-    X509_NAME_oneline(X509_get_issuer_name(cert), data, sizeof(data));
-    LOG(LS_INFO) << "  issuer  = " << data;
-    X509_NAME_oneline(X509_get_subject_name(cert), data, sizeof(data));
-    LOG(LS_INFO) << "  subject = " << data;
-    LOG(LS_INFO) << "  err     = " << err
-      << ":" << X509_verify_cert_error_string(err);
-  }
-#endif
-
-  // Get our stream pointer from the store
-  SSL* ssl = reinterpret_cast<SSL*>(
-                X509_STORE_CTX_get_ex_data(store,
-                  SSL_get_ex_data_X509_STORE_CTX_idx()));
-
-  OpenSSLAdapter* stream =
-    reinterpret_cast<OpenSSLAdapter*>(SSL_get_app_data(ssl));
-
-  if (!ok && custom_verify_callback_) {
-    void* cert =
-        reinterpret_cast<void*>(X509_STORE_CTX_get_current_cert(store));
-    if (custom_verify_callback_(cert)) {
-      stream->custom_verification_succeeded_ = true;
-      LOG(LS_INFO) << "validated certificate using custom callback";
-      ok = true;
-    }
-  }
-
-  // Should only be used for debugging and development.
-  if (!ok && stream->ignore_bad_cert_) {
-    LOG(LS_WARNING) << "Ignoring cert error while verifying cert chain";
-    ok = 1;
-  }
-
-  return ok;
-}
-
-int OpenSSLAdapter::NewSSLSessionCallback(SSL* ssl, SSL_SESSION* session) {
-  OpenSSLAdapter* stream =
-      reinterpret_cast<OpenSSLAdapter*>(SSL_get_app_data(ssl));
-  RTC_DCHECK(stream->factory_);
-  LOG(LS_INFO) << "Caching SSL session for " << stream->ssl_host_name_;
-  stream->factory_->AddSession(stream->ssl_host_name_, session);
-  return 1;  // We've taken ownership of the session; OpenSSL shouldn't free it.
-}
-
-bool OpenSSLAdapter::ConfigureTrustedRootCertificates(SSL_CTX* ctx) {
-  // Add the root cert that we care about to the SSL context
-  int count_of_added_certs = 0;
-  for (size_t i = 0; i < arraysize(kSSLCertCertificateList); i++) {
-    const unsigned char* cert_buffer = kSSLCertCertificateList[i];
-    size_t cert_buffer_len = kSSLCertCertificateSizeList[i];
-    X509* cert =
-        d2i_X509(nullptr, &cert_buffer, checked_cast<long>(cert_buffer_len));
-    if (cert) {
-      int return_value = X509_STORE_add_cert(SSL_CTX_get_cert_store(ctx), cert);
-      if (return_value == 0) {
-        LOG(LS_WARNING) << "Unable to add certificate.";
-      } else {
-        count_of_added_certs++;
-      }
-      X509_free(cert);
-    }
-  }
-  return count_of_added_certs > 0;
-}
-
-SSL_CTX* OpenSSLAdapter::CreateContext(SSLMode mode, bool enable_cache) {
-  // Use (D)TLS 1.2.
-  // Note: BoringSSL supports a range of versions by setting max/min version
-  // (Default V1.0 to V1.2). However (D)TLSv1_2_client_method functions used
-  // below in OpenSSL only support V1.2.
-  SSL_CTX* ctx = nullptr;
-#ifdef OPENSSL_IS_BORINGSSL
-  ctx = SSL_CTX_new(mode == SSL_MODE_DTLS ? DTLS_method() : TLS_method());
-#else
-  ctx = SSL_CTX_new(mode == SSL_MODE_DTLS ? DTLSv1_2_client_method()
-                                          : TLSv1_2_client_method());
-#endif  // OPENSSL_IS_BORINGSSL
-  if (ctx == nullptr) {
-    unsigned long error = ERR_get_error();  // NOLINT: type used by OpenSSL.
-    LOG(LS_WARNING) << "SSL_CTX creation failed: "
-                    << '"' << ERR_reason_error_string(error) << "\" "
-                    << "(error=" << error << ')';
-    return nullptr;
-  }
-  if (!ConfigureTrustedRootCertificates(ctx)) {
-    SSL_CTX_free(ctx);
-    return nullptr;
-  }
-
-#if !defined(NDEBUG)
-  SSL_CTX_set_info_callback(ctx, SSLInfoCallback);
-#endif
-
-  SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER, SSLVerifyCallback);
-  SSL_CTX_set_verify_depth(ctx, 4);
-  // Use defaults, but disable HMAC-SHA256 and HMAC-SHA384 ciphers
-  // (note that SHA256 and SHA384 only select legacy CBC ciphers).
-  // Additionally disable HMAC-SHA1 ciphers in ECDSA. These are the remaining
-  // CBC-mode ECDSA ciphers.
-  SSL_CTX_set_cipher_list(
-      ctx, "ALL:!SHA256:!SHA384:!aPSK:!ECDSA+SHA1:!ADH:!LOW:!EXP:!MD5");
-
-  if (mode == SSL_MODE_DTLS) {
-    SSL_CTX_set_read_ahead(ctx, 1);
-  }
-
-  if (enable_cache) {
-    SSL_CTX_set_session_cache_mode(ctx, SSL_SESS_CACHE_CLIENT);
-    SSL_CTX_sess_set_new_cb(ctx, &OpenSSLAdapter::NewSSLSessionCallback);
-  }
-
-  return ctx;
-}
-
-std::string TransformAlpnProtocols(
-    const std::vector<std::string>& alpn_protocols) {
-  // Transforms the alpn_protocols list to the format expected by
-  // Open/BoringSSL. This requires joining the protocols into a single string
-  // and prepending a character with the size of the protocol string before
-  // each protocol.
-  std::string transformed_alpn;
-  for (const std::string& proto : alpn_protocols) {
-    if (proto.size() == 0 || proto.size() > 0xFF) {
-      LOG(LS_ERROR) << "OpenSSLAdapter::Error("
-                    << "TransformAlpnProtocols received proto with size "
-                    << proto.size() << ")";
-      return "";
-    }
-    transformed_alpn += static_cast<char>(proto.size());
-    transformed_alpn += proto;
-    LOG(LS_VERBOSE) << "TransformAlpnProtocols: Adding proto: " << proto;
-  }
-  return transformed_alpn;
-}
-
-//////////////////////////////////////////////////////////////////////
-// OpenSSLAdapterFactory
-//////////////////////////////////////////////////////////////////////
-
-OpenSSLAdapterFactory::OpenSSLAdapterFactory()
-    : ssl_mode_(SSL_MODE_TLS), ssl_ctx_(nullptr) {}
-
-OpenSSLAdapterFactory::~OpenSSLAdapterFactory() {
-  for (auto it : sessions_) {
-    SSL_SESSION_free(it.second);
-  }
-  SSL_CTX_free(ssl_ctx_);
-}
-
-void OpenSSLAdapterFactory::SetMode(SSLMode mode) {
-  RTC_DCHECK(!ssl_ctx_);
-  ssl_mode_ = mode;
-}
-
-OpenSSLAdapter* OpenSSLAdapterFactory::CreateAdapter(AsyncSocket* socket) {
-  if (!ssl_ctx_) {
-    bool enable_cache = true;
-    ssl_ctx_ = OpenSSLAdapter::CreateContext(ssl_mode_, enable_cache);
-    if (!ssl_ctx_) {
-      return nullptr;
-    }
-  }
-
-  return new OpenSSLAdapter(socket, this);
-}
-
-SSL_SESSION* OpenSSLAdapterFactory::LookupSession(const std::string& hostname) {
-  auto it = sessions_.find(hostname);
-  return (it != sessions_.end()) ? it->second : nullptr;
-}
-
-void OpenSSLAdapterFactory::AddSession(const std::string& hostname,
-                                       SSL_SESSION* new_session) {
-  SSL_SESSION* old_session = LookupSession(hostname);
-  SSL_SESSION_free(old_session);
-  sessions_[hostname] = new_session;
-}
-
-} // namespace rtc
diff --git a/rtc_base/openssladapter.h b/rtc_base/openssladapter.h
deleted file mode 100644
index 6409c76..0000000
--- a/rtc_base/openssladapter.h
+++ /dev/null
@@ -1,179 +0,0 @@
-/*
- *  Copyright 2004 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_RTC_BASE_OPENSSLADAPTER_H_
-#define WEBRTC_RTC_BASE_OPENSSLADAPTER_H_
-
-#include <map>
-#include <string>
-#include "webrtc/rtc_base/buffer.h"
-#include "webrtc/rtc_base/messagehandler.h"
-#include "webrtc/rtc_base/messagequeue.h"
-#include "webrtc/rtc_base/opensslidentity.h"
-#include "webrtc/rtc_base/ssladapter.h"
-
-typedef struct ssl_st SSL;
-typedef struct ssl_ctx_st SSL_CTX;
-typedef struct x509_store_ctx_st X509_STORE_CTX;
-typedef struct ssl_session_st SSL_SESSION;
-
-namespace rtc {
-
-class OpenSSLAdapterFactory;
-
-class OpenSSLAdapter : public SSLAdapter, public MessageHandler {
- public:
-  static bool InitializeSSL(VerificationCallback callback);
-  static bool InitializeSSLThread();
-  static bool CleanupSSL();
-
-  explicit OpenSSLAdapter(AsyncSocket* socket,
-                          OpenSSLAdapterFactory* factory = nullptr);
-  ~OpenSSLAdapter() override;
-
-  void SetIgnoreBadCert(bool ignore) override;
-  void SetAlpnProtocols(const std::vector<std::string>& protos) override;
-  void SetEllipticCurves(const std::vector<std::string>& curves) override;
-
-  void SetMode(SSLMode mode) override;
-  void SetIdentity(SSLIdentity* identity) override;
-  void SetRole(SSLRole role) override;
-  AsyncSocket* Accept(SocketAddress* paddr) override;
-  int StartSSL(const char* hostname, bool restartable) override;
-  int Send(const void* pv, size_t cb) override;
-  int SendTo(const void* pv, size_t cb, const SocketAddress& addr) override;
-  int Recv(void* pv, size_t cb, int64_t* timestamp) override;
-  int RecvFrom(void* pv,
-               size_t cb,
-               SocketAddress* paddr,
-               int64_t* timestamp) override;
-  int Close() override;
-
-  // Note that the socket returns ST_CONNECTING while SSL is being negotiated.
-  ConnState GetState() const override;
-  bool IsResumedSession() override;
-
-  // Creates a new SSL_CTX object, configured for client-to-server usage
-  // with SSLMode |mode|, and if |enable_cache| is true, with support for
-  // storing successful sessions so that they can be later resumed.
-  // OpenSSLAdapterFactory will call this method to create its own internal
-  // SSL_CTX, and OpenSSLAdapter will also call this when used without a
-  // factory.
-  static SSL_CTX* CreateContext(SSLMode mode, bool enable_cache);
-
- protected:
-  void OnConnectEvent(AsyncSocket* socket) override;
-  void OnReadEvent(AsyncSocket* socket) override;
-  void OnWriteEvent(AsyncSocket* socket) override;
-  void OnCloseEvent(AsyncSocket* socket, int err) override;
-
- private:
-  enum SSLState {
-    SSL_NONE, SSL_WAIT, SSL_CONNECTING, SSL_CONNECTED, SSL_ERROR
-  };
-
-  enum { MSG_TIMEOUT };
-
-  int BeginSSL();
-  int ContinueSSL();
-  void Error(const char* context, int err, bool signal = true);
-  void Cleanup();
-
-  // Return value and arguments have the same meanings as for Send; |error| is
-  // an output parameter filled with the result of SSL_get_error.
-  int DoSslWrite(const void* pv, size_t cb, int* error);
-
-  void OnMessage(Message* msg) override;
-
-  static bool VerifyServerName(SSL* ssl, const char* host,
-                               bool ignore_bad_cert);
-  bool SSLPostConnectionCheck(SSL* ssl, const char* host);
-#if !defined(NDEBUG)
-  // In debug builds, logs info about the state of the SSL connection.
-  static void SSLInfoCallback(const SSL* ssl, int where, int ret);
-#endif
-  static int SSLVerifyCallback(int ok, X509_STORE_CTX* store);
-  static VerificationCallback custom_verify_callback_;
-  friend class OpenSSLStreamAdapter;  // for custom_verify_callback_;
-
-  // If the SSL_CTX was created with |enable_cache| set to true, this callback
-  // will be called when a SSL session has been successfully established,
-  // to allow its SSL_SESSION* to be cached for later resumption.
-  static int NewSSLSessionCallback(SSL* ssl, SSL_SESSION* session);
-
-  static bool ConfigureTrustedRootCertificates(SSL_CTX* ctx);
-
-  // Parent object that maintains shared state.
-  // Can be null if state sharing is not needed.
-  OpenSSLAdapterFactory* factory_;
-
-  SSLState state_;
-  std::unique_ptr<OpenSSLIdentity> identity_;
-  SSLRole role_;
-  bool ssl_read_needs_write_;
-  bool ssl_write_needs_read_;
-  // If true, socket will retain SSL configuration after Close.
-  // TODO(juberti): Remove this unused flag.
-  bool restartable_;
-
-  // This buffer is used if SSL_write fails with SSL_ERROR_WANT_WRITE, which
-  // means we need to keep retrying with *the same exact data* until it
-  // succeeds. Afterwards it will be cleared.
-  Buffer pending_data_;
-
-  SSL* ssl_;
-  SSL_CTX* ssl_ctx_;
-  std::string ssl_host_name_;
-  // Do DTLS or not
-  SSLMode ssl_mode_;
-  // If true, the server certificate need not match the configured hostname.
-  bool ignore_bad_cert_;
-  // List of protocols to be used in the TLS ALPN extension.
-  std::vector<std::string> alpn_protocols_;
-  // List of elliptic curves to be used in the TLS elliptic curves extension.
-  std::vector<std::string> elliptic_curves_;
-
-  bool custom_verification_succeeded_;
-};
-
-std::string TransformAlpnProtocols(const std::vector<std::string>& protos);
-
-/////////////////////////////////////////////////////////////////////////////
-class OpenSSLAdapterFactory : public SSLAdapterFactory {
- public:
-  OpenSSLAdapterFactory();
-  ~OpenSSLAdapterFactory() override;
-
-  void SetMode(SSLMode mode) override;
-  OpenSSLAdapter* CreateAdapter(AsyncSocket* socket) override;
-
-  static OpenSSLAdapterFactory* Create();
-
- private:
-  SSL_CTX* ssl_ctx() { return ssl_ctx_; }
-  // Looks up a session by hostname. The returned SSL_SESSION is not up_refed.
-  SSL_SESSION* LookupSession(const std::string& hostname);
-  // Adds a session to the cache, and up_refs it. Any existing session with the
-  // same hostname is replaced.
-  void AddSession(const std::string& hostname, SSL_SESSION* session);
-  friend class OpenSSLAdapter;
-
-  SSLMode ssl_mode_;
-  // Holds the shared SSL_CTX for all created adapters.
-  SSL_CTX* ssl_ctx_;
-  // Map of hostnames to SSL_SESSIONs; holds references to the SSL_SESSIONs,
-  // which are cleaned up when the factory is destroyed.
-  // TODO(juberti): Add LRU eviction to keep the cache from growing forever.
-  std::map<std::string, SSL_SESSION*> sessions_;
-};
-
-}  // namespace rtc
-
-#endif  // WEBRTC_RTC_BASE_OPENSSLADAPTER_H_
diff --git a/rtc_base/openssladapter_unittest.cc b/rtc_base/openssladapter_unittest.cc
deleted file mode 100644
index e443266..0000000
--- a/rtc_base/openssladapter_unittest.cc
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- *  Copyright 2017 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 <sstream>
-#include <string>
-#include <vector>
-
-#include "webrtc/rtc_base/gunit.h"
-#include "webrtc/rtc_base/openssladapter.h"
-
-namespace rtc {
-
-TEST(OpenSSLAdapterTest, TestTransformAlpnProtocols) {
-  EXPECT_EQ("", TransformAlpnProtocols(std::vector<std::string>()));
-
-  // Protocols larger than 255 characters (whose size can't be fit in a byte),
-  // can't be converted, and an empty string will be returned.
-  std::string large_protocol(256, 'a');
-  EXPECT_EQ("",
-            TransformAlpnProtocols(std::vector<std::string>{large_protocol}));
-
-  // One protocol test.
-  std::vector<std::string> alpn_protos{"h2"};
-  std::stringstream expected_response;
-  expected_response << static_cast<char>(2) << "h2";
-  EXPECT_EQ(expected_response.str(), TransformAlpnProtocols(alpn_protos));
-
-  // Standard protocols test (h2,http/1.1).
-  alpn_protos.push_back("http/1.1");
-  expected_response << static_cast<char>(8) << "http/1.1";
-  EXPECT_EQ(expected_response.str(), TransformAlpnProtocols(alpn_protos));
-}
-
-}  // namespace rtc
diff --git a/rtc_base/openssldigest.cc b/rtc_base/openssldigest.cc
deleted file mode 100644
index fa27a46..0000000
--- a/rtc_base/openssldigest.cc
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- *  Copyright 2004 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/rtc_base/openssldigest.h"
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/openssl.h"
-
-namespace rtc {
-
-OpenSSLDigest::OpenSSLDigest(const std::string& algorithm) {
-  EVP_MD_CTX_init(&ctx_);
-  if (GetDigestEVP(algorithm, &md_)) {
-    EVP_DigestInit_ex(&ctx_, md_, nullptr);
-  } else {
-    md_ = nullptr;
-  }
-}
-
-OpenSSLDigest::~OpenSSLDigest() {
-  EVP_MD_CTX_cleanup(&ctx_);
-}
-
-size_t OpenSSLDigest::Size() const {
-  if (!md_) {
-    return 0;
-  }
-  return EVP_MD_size(md_);
-}
-
-void OpenSSLDigest::Update(const void* buf, size_t len) {
-  if (!md_) {
-    return;
-  }
-  EVP_DigestUpdate(&ctx_, buf, len);
-}
-
-size_t OpenSSLDigest::Finish(void* buf, size_t len) {
-  if (!md_ || len < Size()) {
-    return 0;
-  }
-  unsigned int md_len;
-  EVP_DigestFinal_ex(&ctx_, static_cast<unsigned char*>(buf), &md_len);
-  EVP_DigestInit_ex(&ctx_, md_, nullptr);  // prepare for future Update()s
-  RTC_DCHECK(md_len == Size());
-  return md_len;
-}
-
-bool OpenSSLDigest::GetDigestEVP(const std::string& algorithm,
-                                 const EVP_MD** mdp) {
-  const EVP_MD* md;
-  if (algorithm == DIGEST_MD5) {
-    md = EVP_md5();
-  } else if (algorithm == DIGEST_SHA_1) {
-    md = EVP_sha1();
-  } else if (algorithm == DIGEST_SHA_224) {
-    md = EVP_sha224();
-  } else if (algorithm == DIGEST_SHA_256) {
-    md = EVP_sha256();
-  } else if (algorithm == DIGEST_SHA_384) {
-    md = EVP_sha384();
-  } else if (algorithm == DIGEST_SHA_512) {
-    md = EVP_sha512();
-  } else {
-    return false;
-  }
-
-  // Can't happen
-  RTC_DCHECK(EVP_MD_size(md) >= 16);
-  *mdp = md;
-  return true;
-}
-
-bool OpenSSLDigest::GetDigestName(const EVP_MD* md,
-                                  std::string* algorithm) {
-  RTC_DCHECK(md != nullptr);
-  RTC_DCHECK(algorithm != nullptr);
-
-  int md_type = EVP_MD_type(md);
-  if (md_type == NID_md5) {
-    *algorithm = DIGEST_MD5;
-  } else if (md_type == NID_sha1) {
-    *algorithm = DIGEST_SHA_1;
-  } else if (md_type == NID_sha224) {
-    *algorithm = DIGEST_SHA_224;
-  } else if (md_type == NID_sha256) {
-    *algorithm = DIGEST_SHA_256;
-  } else if (md_type == NID_sha384) {
-    *algorithm = DIGEST_SHA_384;
-  } else if (md_type == NID_sha512) {
-    *algorithm = DIGEST_SHA_512;
-  } else {
-    algorithm->clear();
-    return false;
-  }
-
-  return true;
-}
-
-bool OpenSSLDigest::GetDigestSize(const std::string& algorithm,
-                                  size_t* length) {
-  const EVP_MD *md;
-  if (!GetDigestEVP(algorithm, &md))
-    return false;
-
-  *length = EVP_MD_size(md);
-  return true;
-}
-
-}  // namespace rtc
diff --git a/rtc_base/openssldigest.h b/rtc_base/openssldigest.h
deleted file mode 100644
index ab4ca16..0000000
--- a/rtc_base/openssldigest.h
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- *  Copyright 2004 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_RTC_BASE_OPENSSLDIGEST_H_
-#define WEBRTC_RTC_BASE_OPENSSLDIGEST_H_
-
-#include <openssl/evp.h>
-
-#include "webrtc/rtc_base/messagedigest.h"
-
-namespace rtc {
-
-// An implementation of the digest class that uses OpenSSL.
-class OpenSSLDigest : public MessageDigest {
- public:
-  // Creates an OpenSSLDigest with |algorithm| as the hash algorithm.
-  explicit OpenSSLDigest(const std::string& algorithm);
-  ~OpenSSLDigest() override;
-  // Returns the digest output size (e.g. 16 bytes for MD5).
-  size_t Size() const override;
-  // Updates the digest with |len| bytes from |buf|.
-  void Update(const void* buf, size_t len) override;
-  // Outputs the digest value to |buf| with length |len|.
-  size_t Finish(void* buf, size_t len) override;
-
-  // Helper function to look up a digest's EVP by name.
-  static bool GetDigestEVP(const std::string &algorithm,
-                           const EVP_MD** md);
-  // Helper function to look up a digest's name by EVP.
-  static bool GetDigestName(const EVP_MD* md,
-                            std::string* algorithm);
-  // Helper function to get the length of a digest.
-  static bool GetDigestSize(const std::string &algorithm,
-                            size_t* len);
-
- private:
-  EVP_MD_CTX ctx_;
-  const EVP_MD* md_;
-};
-
-}  // namespace rtc
-
-#endif  // WEBRTC_RTC_BASE_OPENSSLDIGEST_H_
diff --git a/rtc_base/opensslidentity.cc b/rtc_base/opensslidentity.cc
deleted file mode 100644
index a6b6e1c..0000000
--- a/rtc_base/opensslidentity.cc
+++ /dev/null
@@ -1,576 +0,0 @@
-/*
- *  Copyright 2004 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/rtc_base/opensslidentity.h"
-
-#include <memory>
-
-// Must be included first before openssl headers.
-#include "webrtc/rtc_base/win32.h"  // NOLINT
-
-#include <openssl/bio.h>
-#include <openssl/err.h>
-#include <openssl/pem.h>
-#include <openssl/bn.h>
-#include <openssl/rsa.h>
-#include <openssl/crypto.h>
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/helpers.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/openssl.h"
-#include "webrtc/rtc_base/openssldigest.h"
-
-namespace rtc {
-
-// We could have exposed a myriad of parameters for the crypto stuff,
-// but keeping it simple seems best.
-
-// Random bits for certificate serial number
-static const int SERIAL_RAND_BITS = 64;
-
-// Generate a key pair. Caller is responsible for freeing the returned object.
-static EVP_PKEY* MakeKey(const KeyParams& key_params) {
-  LOG(LS_INFO) << "Making key pair";
-  EVP_PKEY* pkey = EVP_PKEY_new();
-  if (key_params.type() == KT_RSA) {
-    int key_length = key_params.rsa_params().mod_size;
-    BIGNUM* exponent = BN_new();
-    RSA* rsa = RSA_new();
-    if (!pkey || !exponent || !rsa ||
-        !BN_set_word(exponent, key_params.rsa_params().pub_exp) ||
-        !RSA_generate_key_ex(rsa, key_length, exponent, nullptr) ||
-        !EVP_PKEY_assign_RSA(pkey, rsa)) {
-      EVP_PKEY_free(pkey);
-      BN_free(exponent);
-      RSA_free(rsa);
-      LOG(LS_ERROR) << "Failed to make RSA key pair";
-      return nullptr;
-    }
-    // ownership of rsa struct was assigned, don't free it.
-    BN_free(exponent);
-  } else if (key_params.type() == KT_ECDSA) {
-    if (key_params.ec_curve() == EC_NIST_P256) {
-      EC_KEY* ec_key = EC_KEY_new_by_curve_name(NID_X9_62_prime256v1);
-
-      // Ensure curve name is included when EC key is serialized.
-      // Without this call, OpenSSL versions before 1.1.0 will create
-      // certificates that don't work for TLS.
-      // This is a no-op for BoringSSL and OpenSSL 1.1.0+
-      EC_KEY_set_asn1_flag(ec_key, OPENSSL_EC_NAMED_CURVE);
-
-      if (!pkey || !ec_key || !EC_KEY_generate_key(ec_key) ||
-          !EVP_PKEY_assign_EC_KEY(pkey, ec_key)) {
-        EVP_PKEY_free(pkey);
-        EC_KEY_free(ec_key);
-        LOG(LS_ERROR) << "Failed to make EC key pair";
-        return nullptr;
-      }
-      // ownership of ec_key struct was assigned, don't free it.
-    } else {
-      // Add generation of any other curves here.
-      EVP_PKEY_free(pkey);
-      LOG(LS_ERROR) << "ECDSA key requested for unknown curve";
-      return nullptr;
-    }
-  } else {
-    EVP_PKEY_free(pkey);
-    LOG(LS_ERROR) << "Key type requested not understood";
-    return nullptr;
-  }
-
-  LOG(LS_INFO) << "Returning key pair";
-  return pkey;
-}
-
-// Generate a self-signed certificate, with the public key from the
-// given key pair. Caller is responsible for freeing the returned object.
-static X509* MakeCertificate(EVP_PKEY* pkey, const SSLIdentityParams& params) {
-  LOG(LS_INFO) << "Making certificate for " << params.common_name;
-  X509* x509 = nullptr;
-  BIGNUM* serial_number = nullptr;
-  X509_NAME* name = nullptr;
-  time_t epoch_off = 0;  // Time offset since epoch.
-
-  if ((x509 = X509_new()) == nullptr)
-    goto error;
-
-  if (!X509_set_pubkey(x509, pkey))
-    goto error;
-
-  // serial number
-  // temporary reference to serial number inside x509 struct
-  ASN1_INTEGER* asn1_serial_number;
-  if ((serial_number = BN_new()) == nullptr ||
-      !BN_pseudo_rand(serial_number, SERIAL_RAND_BITS, 0, 0) ||
-      (asn1_serial_number = X509_get_serialNumber(x509)) == nullptr ||
-      !BN_to_ASN1_INTEGER(serial_number, asn1_serial_number))
-    goto error;
-
-  if (!X509_set_version(x509, 2L))  // version 3
-    goto error;
-
-  // There are a lot of possible components for the name entries. In
-  // our P2P SSL mode however, the certificates are pre-exchanged
-  // (through the secure XMPP channel), and so the certificate
-  // identification is arbitrary. It can't be empty, so we set some
-  // arbitrary common_name. Note that this certificate goes out in
-  // clear during SSL negotiation, so there may be a privacy issue in
-  // putting anything recognizable here.
-  if ((name = X509_NAME_new()) == nullptr ||
-      !X509_NAME_add_entry_by_NID(name, NID_commonName, MBSTRING_UTF8,
-                                  (unsigned char*)params.common_name.c_str(),
-                                  -1, -1, 0) ||
-      !X509_set_subject_name(x509, name) || !X509_set_issuer_name(x509, name))
-    goto error;
-
-  if (!X509_time_adj(X509_get_notBefore(x509), params.not_before, &epoch_off) ||
-      !X509_time_adj(X509_get_notAfter(x509), params.not_after, &epoch_off))
-    goto error;
-
-  if (!X509_sign(x509, pkey, EVP_sha256()))
-    goto error;
-
-  BN_free(serial_number);
-  X509_NAME_free(name);
-  LOG(LS_INFO) << "Returning certificate";
-  return x509;
-
- error:
-  BN_free(serial_number);
-  X509_NAME_free(name);
-  X509_free(x509);
-  return nullptr;
-}
-
-// This dumps the SSL error stack to the log.
-static void LogSSLErrors(const std::string& prefix) {
-  char error_buf[200];
-  unsigned long err;
-
-  while ((err = ERR_get_error()) != 0) {
-    ERR_error_string_n(err, error_buf, sizeof(error_buf));
-    LOG(LS_ERROR) << prefix << ": " << error_buf << "\n";
-  }
-}
-
-OpenSSLKeyPair* OpenSSLKeyPair::Generate(const KeyParams& key_params) {
-  EVP_PKEY* pkey = MakeKey(key_params);
-  if (!pkey) {
-    LogSSLErrors("Generating key pair");
-    return nullptr;
-  }
-  return new OpenSSLKeyPair(pkey);
-}
-
-OpenSSLKeyPair* OpenSSLKeyPair::FromPrivateKeyPEMString(
-    const std::string& pem_string) {
-  BIO* bio = BIO_new_mem_buf(const_cast<char*>(pem_string.c_str()), -1);
-  if (!bio) {
-    LOG(LS_ERROR) << "Failed to create a new BIO buffer.";
-    return nullptr;
-  }
-  BIO_set_mem_eof_return(bio, 0);
-  EVP_PKEY* pkey =
-      PEM_read_bio_PrivateKey(bio, nullptr, nullptr, const_cast<char*>("\0"));
-  BIO_free(bio);  // Frees the BIO, but not the pointed-to string.
-  if (!pkey) {
-    LOG(LS_ERROR) << "Failed to create the private key from PEM string.";
-    return nullptr;
-  }
-  if (EVP_PKEY_missing_parameters(pkey) != 0) {
-    LOG(LS_ERROR) << "The resulting key pair is missing public key parameters.";
-    EVP_PKEY_free(pkey);
-    return nullptr;
-  }
-  return new OpenSSLKeyPair(pkey);
-}
-
-OpenSSLKeyPair::~OpenSSLKeyPair() {
-  EVP_PKEY_free(pkey_);
-}
-
-OpenSSLKeyPair* OpenSSLKeyPair::GetReference() {
-  AddReference();
-  return new OpenSSLKeyPair(pkey_);
-}
-
-void OpenSSLKeyPair::AddReference() {
-#if defined(OPENSSL_IS_BORINGSSL)
-  EVP_PKEY_up_ref(pkey_);
-#else
-  CRYPTO_add(&pkey_->references, 1, CRYPTO_LOCK_EVP_PKEY);
-#endif
-}
-
-std::string OpenSSLKeyPair::PrivateKeyToPEMString() const {
-  BIO* temp_memory_bio = BIO_new(BIO_s_mem());
-  if (!temp_memory_bio) {
-    LOG_F(LS_ERROR) << "Failed to allocate temporary memory bio";
-    RTC_NOTREACHED();
-    return "";
-  }
-  if (!PEM_write_bio_PrivateKey(
-      temp_memory_bio, pkey_, nullptr, nullptr, 0, nullptr, nullptr)) {
-    LOG_F(LS_ERROR) << "Failed to write private key";
-    BIO_free(temp_memory_bio);
-    RTC_NOTREACHED();
-    return "";
-  }
-  BIO_write(temp_memory_bio, "\0", 1);
-  char* buffer;
-  BIO_get_mem_data(temp_memory_bio, &buffer);
-  std::string priv_key_str = buffer;
-  BIO_free(temp_memory_bio);
-  return priv_key_str;
-}
-
-std::string OpenSSLKeyPair::PublicKeyToPEMString() const {
-  BIO* temp_memory_bio = BIO_new(BIO_s_mem());
-  if (!temp_memory_bio) {
-    LOG_F(LS_ERROR) << "Failed to allocate temporary memory bio";
-    RTC_NOTREACHED();
-    return "";
-  }
-  if (!PEM_write_bio_PUBKEY(temp_memory_bio, pkey_)) {
-    LOG_F(LS_ERROR) << "Failed to write public key";
-    BIO_free(temp_memory_bio);
-    RTC_NOTREACHED();
-    return "";
-  }
-  BIO_write(temp_memory_bio, "\0", 1);
-  char* buffer;
-  BIO_get_mem_data(temp_memory_bio, &buffer);
-  std::string pub_key_str = buffer;
-  BIO_free(temp_memory_bio);
-  return pub_key_str;
-}
-
-bool OpenSSLKeyPair::operator==(const OpenSSLKeyPair& other) const {
-  return EVP_PKEY_cmp(this->pkey_, other.pkey_) == 1;
-}
-
-bool OpenSSLKeyPair::operator!=(const OpenSSLKeyPair& other) const {
-  return !(*this == other);
-}
-
-#if !defined(NDEBUG)
-// Print a certificate to the log, for debugging.
-static void PrintCert(X509* x509) {
-  BIO* temp_memory_bio = BIO_new(BIO_s_mem());
-  if (!temp_memory_bio) {
-    LOG_F(LS_ERROR) << "Failed to allocate temporary memory bio";
-    return;
-  }
-  X509_print_ex(temp_memory_bio, x509, XN_FLAG_SEP_CPLUS_SPC, 0);
-  BIO_write(temp_memory_bio, "\0", 1);
-  char* buffer;
-  BIO_get_mem_data(temp_memory_bio, &buffer);
-  LOG(LS_VERBOSE) << buffer;
-  BIO_free(temp_memory_bio);
-}
-#endif
-
-OpenSSLCertificate* OpenSSLCertificate::Generate(
-    OpenSSLKeyPair* key_pair, const SSLIdentityParams& params) {
-  SSLIdentityParams actual_params(params);
-  if (actual_params.common_name.empty()) {
-    // Use a random string, arbitrarily 8chars long.
-    actual_params.common_name = CreateRandomString(8);
-  }
-  X509* x509 = MakeCertificate(key_pair->pkey(), actual_params);
-  if (!x509) {
-    LogSSLErrors("Generating certificate");
-    return nullptr;
-  }
-#if !defined(NDEBUG)
-  PrintCert(x509);
-#endif
-  OpenSSLCertificate* ret = new OpenSSLCertificate(x509);
-  X509_free(x509);
-  return ret;
-}
-
-OpenSSLCertificate* OpenSSLCertificate::FromPEMString(
-    const std::string& pem_string) {
-  BIO* bio = BIO_new_mem_buf(const_cast<char*>(pem_string.c_str()), -1);
-  if (!bio)
-    return nullptr;
-  BIO_set_mem_eof_return(bio, 0);
-  X509* x509 =
-      PEM_read_bio_X509(bio, nullptr, nullptr, const_cast<char*>("\0"));
-  BIO_free(bio);  // Frees the BIO, but not the pointed-to string.
-
-  if (!x509)
-    return nullptr;
-
-  OpenSSLCertificate* ret = new OpenSSLCertificate(x509);
-  X509_free(x509);
-  return ret;
-}
-
-// NOTE: This implementation only functions correctly after InitializeSSL
-// and before CleanupSSL.
-bool OpenSSLCertificate::GetSignatureDigestAlgorithm(
-    std::string* algorithm) const {
-  int nid = OBJ_obj2nid(x509_->sig_alg->algorithm);
-  switch (nid) {
-    case NID_md5WithRSA:
-    case NID_md5WithRSAEncryption:
-      *algorithm = DIGEST_MD5;
-      break;
-    case NID_ecdsa_with_SHA1:
-    case NID_dsaWithSHA1:
-    case NID_dsaWithSHA1_2:
-    case NID_sha1WithRSA:
-    case NID_sha1WithRSAEncryption:
-      *algorithm = DIGEST_SHA_1;
-      break;
-    case NID_ecdsa_with_SHA224:
-    case NID_sha224WithRSAEncryption:
-    case NID_dsa_with_SHA224:
-      *algorithm = DIGEST_SHA_224;
-      break;
-    case NID_ecdsa_with_SHA256:
-    case NID_sha256WithRSAEncryption:
-    case NID_dsa_with_SHA256:
-      *algorithm = DIGEST_SHA_256;
-      break;
-    case NID_ecdsa_with_SHA384:
-    case NID_sha384WithRSAEncryption:
-      *algorithm = DIGEST_SHA_384;
-      break;
-    case NID_ecdsa_with_SHA512:
-    case NID_sha512WithRSAEncryption:
-      *algorithm = DIGEST_SHA_512;
-      break;
-    default:
-      // Unknown algorithm.  There are several unhandled options that are less
-      // common and more complex.
-      LOG(LS_ERROR) << "Unknown signature algorithm NID: " << nid;
-      algorithm->clear();
-      return false;
-  }
-  return true;
-}
-
-std::unique_ptr<SSLCertChain> OpenSSLCertificate::GetChain() const {
-  // Chains are not yet supported when using OpenSSL.
-  // OpenSSLStreamAdapter::SSLVerifyCallback currently requires the remote
-  // certificate to be self-signed.
-  return nullptr;
-}
-
-bool OpenSSLCertificate::ComputeDigest(const std::string& algorithm,
-                                       unsigned char* digest,
-                                       size_t size,
-                                       size_t* length) const {
-  return ComputeDigest(x509_, algorithm, digest, size, length);
-}
-
-bool OpenSSLCertificate::ComputeDigest(const X509* x509,
-                                       const std::string& algorithm,
-                                       unsigned char* digest,
-                                       size_t size,
-                                       size_t* length) {
-  const EVP_MD* md;
-  unsigned int n;
-
-  if (!OpenSSLDigest::GetDigestEVP(algorithm, &md))
-    return false;
-
-  if (size < static_cast<size_t>(EVP_MD_size(md)))
-    return false;
-
-  X509_digest(x509, md, digest, &n);
-
-  *length = n;
-
-  return true;
-}
-
-OpenSSLCertificate::~OpenSSLCertificate() {
-  X509_free(x509_);
-}
-
-OpenSSLCertificate* OpenSSLCertificate::GetReference() const {
-  return new OpenSSLCertificate(x509_);
-}
-
-std::string OpenSSLCertificate::ToPEMString() const {
-  BIO* bio = BIO_new(BIO_s_mem());
-  if (!bio) {
-    FATAL() << "unreachable code";
-  }
-  if (!PEM_write_bio_X509(bio, x509_)) {
-    BIO_free(bio);
-    FATAL() << "unreachable code";
-  }
-  BIO_write(bio, "\0", 1);
-  char* buffer;
-  BIO_get_mem_data(bio, &buffer);
-  std::string ret(buffer);
-  BIO_free(bio);
-  return ret;
-}
-
-void OpenSSLCertificate::ToDER(Buffer* der_buffer) const {
-  // In case of failure, make sure to leave the buffer empty.
-  der_buffer->SetSize(0);
-
-  // Calculates the DER representation of the certificate, from scratch.
-  BIO* bio = BIO_new(BIO_s_mem());
-  if (!bio) {
-    FATAL() << "unreachable code";
-  }
-  if (!i2d_X509_bio(bio, x509_)) {
-    BIO_free(bio);
-    FATAL() << "unreachable code";
-  }
-  char* data;
-  size_t length = BIO_get_mem_data(bio, &data);
-  der_buffer->SetData(data, length);
-  BIO_free(bio);
-}
-
-void OpenSSLCertificate::AddReference() const {
-  RTC_DCHECK(x509_ != nullptr);
-#if defined(OPENSSL_IS_BORINGSSL)
-  X509_up_ref(x509_);
-#else
-  CRYPTO_add(&x509_->references, 1, CRYPTO_LOCK_X509);
-#endif
-}
-
-bool OpenSSLCertificate::operator==(const OpenSSLCertificate& other) const {
-  return X509_cmp(this->x509_, other.x509_) == 0;
-}
-
-bool OpenSSLCertificate::operator!=(const OpenSSLCertificate& other) const {
-  return !(*this == other);
-}
-
-// Documented in sslidentity.h.
-int64_t OpenSSLCertificate::CertificateExpirationTime() const {
-  ASN1_TIME* expire_time = X509_get_notAfter(x509_);
-  bool long_format;
-
-  if (expire_time->type == V_ASN1_UTCTIME) {
-    long_format = false;
-  } else if (expire_time->type == V_ASN1_GENERALIZEDTIME) {
-    long_format = true;
-  } else {
-    return -1;
-  }
-
-  return ASN1TimeToSec(expire_time->data, expire_time->length, long_format);
-}
-
-OpenSSLIdentity::OpenSSLIdentity(OpenSSLKeyPair* key_pair,
-                                 OpenSSLCertificate* certificate)
-    : key_pair_(key_pair), certificate_(certificate) {
-  RTC_DCHECK(key_pair != nullptr);
-  RTC_DCHECK(certificate != nullptr);
-}
-
-OpenSSLIdentity::~OpenSSLIdentity() = default;
-
-OpenSSLIdentity* OpenSSLIdentity::GenerateInternal(
-    const SSLIdentityParams& params) {
-  OpenSSLKeyPair* key_pair = OpenSSLKeyPair::Generate(params.key_params);
-  if (key_pair) {
-    OpenSSLCertificate* certificate =
-        OpenSSLCertificate::Generate(key_pair, params);
-    if (certificate)
-      return new OpenSSLIdentity(key_pair, certificate);
-    delete key_pair;
-  }
-  LOG(LS_INFO) << "Identity generation failed";
-  return nullptr;
-}
-
-OpenSSLIdentity* OpenSSLIdentity::GenerateWithExpiration(
-    const std::string& common_name,
-    const KeyParams& key_params,
-    time_t certificate_lifetime) {
-  SSLIdentityParams params;
-  params.key_params = key_params;
-  params.common_name = common_name;
-  time_t now = time(nullptr);
-  params.not_before = now + kCertificateWindowInSeconds;
-  params.not_after = now + certificate_lifetime;
-  if (params.not_before > params.not_after)
-    return nullptr;
-  return GenerateInternal(params);
-}
-
-OpenSSLIdentity* OpenSSLIdentity::GenerateForTest(
-    const SSLIdentityParams& params) {
-  return GenerateInternal(params);
-}
-
-SSLIdentity* OpenSSLIdentity::FromPEMStrings(
-    const std::string& private_key,
-    const std::string& certificate) {
-  std::unique_ptr<OpenSSLCertificate> cert(
-      OpenSSLCertificate::FromPEMString(certificate));
-  if (!cert) {
-    LOG(LS_ERROR) << "Failed to create OpenSSLCertificate from PEM string.";
-    return nullptr;
-  }
-
-  OpenSSLKeyPair* key_pair =
-      OpenSSLKeyPair::FromPrivateKeyPEMString(private_key);
-  if (!key_pair) {
-    LOG(LS_ERROR) << "Failed to create key pair from PEM string.";
-    return nullptr;
-  }
-
-  return new OpenSSLIdentity(key_pair,
-                             cert.release());
-}
-
-const OpenSSLCertificate& OpenSSLIdentity::certificate() const {
-  return *certificate_;
-}
-
-OpenSSLIdentity* OpenSSLIdentity::GetReference() const {
-  return new OpenSSLIdentity(key_pair_->GetReference(),
-                             certificate_->GetReference());
-}
-
-bool OpenSSLIdentity::ConfigureIdentity(SSL_CTX* ctx) {
-  // 1 is the documented success return code.
-  if (SSL_CTX_use_certificate(ctx, certificate_->x509()) != 1 ||
-     SSL_CTX_use_PrivateKey(ctx, key_pair_->pkey()) != 1) {
-    LogSSLErrors("Configuring key and certificate");
-    return false;
-  }
-  return true;
-}
-
-std::string OpenSSLIdentity::PrivateKeyToPEMString() const {
-  return key_pair_->PrivateKeyToPEMString();
-}
-
-std::string OpenSSLIdentity::PublicKeyToPEMString() const {
-  return key_pair_->PublicKeyToPEMString();
-}
-
-bool OpenSSLIdentity::operator==(const OpenSSLIdentity& other) const {
-  return *this->key_pair_ == *other.key_pair_ &&
-         *this->certificate_ == *other.certificate_;
-}
-
-bool OpenSSLIdentity::operator!=(const OpenSSLIdentity& other) const {
-  return !(*this == other);
-}
-
-}  // namespace rtc
diff --git a/rtc_base/opensslidentity.h b/rtc_base/opensslidentity.h
deleted file mode 100644
index ed7c072..0000000
--- a/rtc_base/opensslidentity.h
+++ /dev/null
@@ -1,147 +0,0 @@
-/*
- *  Copyright 2004 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_RTC_BASE_OPENSSLIDENTITY_H_
-#define WEBRTC_RTC_BASE_OPENSSLIDENTITY_H_
-
-#include <openssl/evp.h>
-#include <openssl/x509.h>
-
-#include <memory>
-#include <string>
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/sslidentity.h"
-
-typedef struct ssl_ctx_st SSL_CTX;
-
-namespace rtc {
-
-// OpenSSLKeyPair encapsulates an OpenSSL EVP_PKEY* keypair object,
-// which is reference counted inside the OpenSSL library.
-class OpenSSLKeyPair {
- public:
-  explicit OpenSSLKeyPair(EVP_PKEY* pkey) : pkey_(pkey) {
-    RTC_DCHECK(pkey_ != nullptr);
-  }
-
-  static OpenSSLKeyPair* Generate(const KeyParams& key_params);
-  // Constructs a key pair from the private key PEM string. This must not result
-  // in missing public key parameters. Returns null on error.
-  static OpenSSLKeyPair* FromPrivateKeyPEMString(
-      const std::string& pem_string);
-
-  virtual ~OpenSSLKeyPair();
-
-  virtual OpenSSLKeyPair* GetReference();
-
-  EVP_PKEY* pkey() const { return pkey_; }
-  std::string PrivateKeyToPEMString() const;
-  std::string PublicKeyToPEMString() const;
-  bool operator==(const OpenSSLKeyPair& other) const;
-  bool operator!=(const OpenSSLKeyPair& other) const;
-
- private:
-  void AddReference();
-
-  EVP_PKEY* pkey_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(OpenSSLKeyPair);
-};
-
-// OpenSSLCertificate encapsulates an OpenSSL X509* certificate object,
-// which is also reference counted inside the OpenSSL library.
-class OpenSSLCertificate : public SSLCertificate {
- public:
-  // Caller retains ownership of the X509 object.
-  explicit OpenSSLCertificate(X509* x509) : x509_(x509) {
-    AddReference();
-  }
-
-  static OpenSSLCertificate* Generate(OpenSSLKeyPair* key_pair,
-                                      const SSLIdentityParams& params);
-  static OpenSSLCertificate* FromPEMString(const std::string& pem_string);
-
-  ~OpenSSLCertificate() override;
-
-  OpenSSLCertificate* GetReference() const override;
-
-  X509* x509() const { return x509_; }
-
-  std::string ToPEMString() const override;
-  void ToDER(Buffer* der_buffer) const override;
-  bool operator==(const OpenSSLCertificate& other) const;
-  bool operator!=(const OpenSSLCertificate& other) const;
-
-  // Compute the digest of the certificate given algorithm
-  bool ComputeDigest(const std::string& algorithm,
-                     unsigned char* digest,
-                     size_t size,
-                     size_t* length) const override;
-
-  // Compute the digest of a certificate as an X509 *
-  static bool ComputeDigest(const X509* x509,
-                            const std::string& algorithm,
-                            unsigned char* digest,
-                            size_t size,
-                            size_t* length);
-
-  bool GetSignatureDigestAlgorithm(std::string* algorithm) const override;
-  std::unique_ptr<SSLCertChain> GetChain() const override;
-
-  int64_t CertificateExpirationTime() const override;
-
- private:
-  void AddReference() const;
-
-  X509* x509_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(OpenSSLCertificate);
-};
-
-// Holds a keypair and certificate together, and a method to generate
-// them consistently.
-class OpenSSLIdentity : public SSLIdentity {
- public:
-  static OpenSSLIdentity* GenerateWithExpiration(const std::string& common_name,
-                                                 const KeyParams& key_params,
-                                                 time_t certificate_lifetime);
-  static OpenSSLIdentity* GenerateForTest(const SSLIdentityParams& params);
-  static SSLIdentity* FromPEMStrings(const std::string& private_key,
-                                     const std::string& certificate);
-  ~OpenSSLIdentity() override;
-
-  const OpenSSLCertificate& certificate() const override;
-  OpenSSLIdentity* GetReference() const override;
-
-  // Configure an SSL context object to use our key and certificate.
-  bool ConfigureIdentity(SSL_CTX* ctx);
-
-  std::string PrivateKeyToPEMString() const override;
-  std::string PublicKeyToPEMString() const override;
-  bool operator==(const OpenSSLIdentity& other) const;
-  bool operator!=(const OpenSSLIdentity& other) const;
-
- private:
-  OpenSSLIdentity(OpenSSLKeyPair* key_pair, OpenSSLCertificate* certificate);
-
-  static OpenSSLIdentity* GenerateInternal(const SSLIdentityParams& params);
-
-  std::unique_ptr<OpenSSLKeyPair> key_pair_;
-  std::unique_ptr<OpenSSLCertificate> certificate_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(OpenSSLIdentity);
-};
-
-
-}  // namespace rtc
-
-#endif  // WEBRTC_RTC_BASE_OPENSSLIDENTITY_H_
diff --git a/rtc_base/opensslstreamadapter.cc b/rtc_base/opensslstreamadapter.cc
deleted file mode 100644
index 53f35fc..0000000
--- a/rtc_base/opensslstreamadapter.cc
+++ /dev/null
@@ -1,1221 +0,0 @@
-/*
- *  Copyright 2004 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/rtc_base/opensslstreamadapter.h"
-
-#include <openssl/bio.h>
-#include <openssl/crypto.h>
-#include <openssl/err.h>
-#include <openssl/rand.h>
-#include <openssl/tls1.h>
-#include <openssl/x509v3.h>
-#ifndef OPENSSL_IS_BORINGSSL
-#include <openssl/dtls1.h>
-#include <openssl/ssl.h>
-#endif
-
-#include <memory>
-#include <vector>
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/openssl.h"
-#include "webrtc/rtc_base/openssladapter.h"
-#include "webrtc/rtc_base/openssldigest.h"
-#include "webrtc/rtc_base/opensslidentity.h"
-#include "webrtc/rtc_base/safe_conversions.h"
-#include "webrtc/rtc_base/stream.h"
-#include "webrtc/rtc_base/stringutils.h"
-#include "webrtc/rtc_base/thread.h"
-#include "webrtc/rtc_base/timeutils.h"
-
-namespace {
-  bool g_use_time_callback_for_testing = false;
-}
-
-namespace rtc {
-
-#if (OPENSSL_VERSION_NUMBER < 0x10001000L)
-#error "webrtc requires at least OpenSSL version 1.0.1, to support DTLS-SRTP"
-#endif
-
-// SRTP cipher suite table. |internal_name| is used to construct a
-// colon-separated profile strings which is needed by
-// SSL_CTX_set_tlsext_use_srtp().
-struct SrtpCipherMapEntry {
-  const char* internal_name;
-  const int id;
-};
-
-// This isn't elegant, but it's better than an external reference
-static SrtpCipherMapEntry SrtpCipherMap[] = {
-    {"SRTP_AES128_CM_SHA1_80", SRTP_AES128_CM_SHA1_80},
-    {"SRTP_AES128_CM_SHA1_32", SRTP_AES128_CM_SHA1_32},
-    {"SRTP_AEAD_AES_128_GCM", SRTP_AEAD_AES_128_GCM},
-    {"SRTP_AEAD_AES_256_GCM", SRTP_AEAD_AES_256_GCM},
-    {nullptr, 0}};
-
-#ifdef OPENSSL_IS_BORINGSSL
-// Not used in production code. Actual time should be relative to Jan 1, 1970.
-static void TimeCallbackForTesting(const SSL* ssl, struct timeval* out_clock) {
-  int64_t time = TimeNanos();
-  out_clock->tv_sec = time / kNumNanosecsPerSec;
-  out_clock->tv_usec = (time % kNumNanosecsPerSec) / kNumNanosecsPerMicrosec;
-}
-#else  // #ifdef OPENSSL_IS_BORINGSSL
-
-// Cipher name table. Maps internal OpenSSL cipher ids to the RFC name.
-struct SslCipherMapEntry {
-  uint32_t openssl_id;
-  const char* rfc_name;
-};
-
-#define DEFINE_CIPHER_ENTRY_SSL3(name)  {SSL3_CK_##name, "TLS_"#name}
-#define DEFINE_CIPHER_ENTRY_TLS1(name)  {TLS1_CK_##name, "TLS_"#name}
-
-// There currently is no method available to get a RFC-compliant name for a
-// cipher suite from BoringSSL, so we need to define the mapping manually here.
-// This should go away once BoringSSL supports "SSL_CIPHER_standard_name"
-// (as available in OpenSSL if compiled with tracing enabled) or a similar
-// method.
-static const SslCipherMapEntry kSslCipherMap[] = {
-    // TLS v1.0 ciphersuites from RFC2246.
-    DEFINE_CIPHER_ENTRY_SSL3(RSA_RC4_128_SHA),
-    {SSL3_CK_RSA_DES_192_CBC3_SHA, "TLS_RSA_WITH_3DES_EDE_CBC_SHA"},
-
-    // AES ciphersuites from RFC3268.
-    {TLS1_CK_RSA_WITH_AES_128_SHA, "TLS_RSA_WITH_AES_128_CBC_SHA"},
-    {TLS1_CK_DHE_RSA_WITH_AES_128_SHA, "TLS_DHE_RSA_WITH_AES_128_CBC_SHA"},
-    {TLS1_CK_RSA_WITH_AES_256_SHA, "TLS_RSA_WITH_AES_256_CBC_SHA"},
-    {TLS1_CK_DHE_RSA_WITH_AES_256_SHA, "TLS_DHE_RSA_WITH_AES_256_CBC_SHA"},
-
-    // ECC ciphersuites from RFC4492.
-    DEFINE_CIPHER_ENTRY_TLS1(ECDHE_ECDSA_WITH_RC4_128_SHA),
-    {TLS1_CK_ECDHE_ECDSA_WITH_DES_192_CBC3_SHA,
-     "TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA"},
-    DEFINE_CIPHER_ENTRY_TLS1(ECDHE_ECDSA_WITH_AES_128_CBC_SHA),
-    DEFINE_CIPHER_ENTRY_TLS1(ECDHE_ECDSA_WITH_AES_256_CBC_SHA),
-
-    DEFINE_CIPHER_ENTRY_TLS1(ECDHE_RSA_WITH_RC4_128_SHA),
-    {TLS1_CK_ECDHE_RSA_WITH_DES_192_CBC3_SHA,
-     "TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA"},
-    DEFINE_CIPHER_ENTRY_TLS1(ECDHE_RSA_WITH_AES_128_CBC_SHA),
-    DEFINE_CIPHER_ENTRY_TLS1(ECDHE_RSA_WITH_AES_256_CBC_SHA),
-
-    // TLS v1.2 ciphersuites.
-    {TLS1_CK_RSA_WITH_AES_128_SHA256, "TLS_RSA_WITH_AES_128_CBC_SHA256"},
-    {TLS1_CK_RSA_WITH_AES_256_SHA256, "TLS_RSA_WITH_AES_256_CBC_SHA256"},
-    {TLS1_CK_DHE_RSA_WITH_AES_128_SHA256,
-     "TLS_DHE_RSA_WITH_AES_128_CBC_SHA256"},
-    {TLS1_CK_DHE_RSA_WITH_AES_256_SHA256,
-     "TLS_DHE_RSA_WITH_AES_256_CBC_SHA256"},
-
-    // TLS v1.2 GCM ciphersuites from RFC5288.
-    DEFINE_CIPHER_ENTRY_TLS1(RSA_WITH_AES_128_GCM_SHA256),
-    DEFINE_CIPHER_ENTRY_TLS1(RSA_WITH_AES_256_GCM_SHA384),
-    DEFINE_CIPHER_ENTRY_TLS1(DHE_RSA_WITH_AES_128_GCM_SHA256),
-    DEFINE_CIPHER_ENTRY_TLS1(DHE_RSA_WITH_AES_256_GCM_SHA384),
-    DEFINE_CIPHER_ENTRY_TLS1(DH_RSA_WITH_AES_128_GCM_SHA256),
-    DEFINE_CIPHER_ENTRY_TLS1(DH_RSA_WITH_AES_256_GCM_SHA384),
-
-    // ECDH HMAC based ciphersuites from RFC5289.
-    {TLS1_CK_ECDHE_ECDSA_WITH_AES_128_SHA256,
-     "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256"},
-    {TLS1_CK_ECDHE_ECDSA_WITH_AES_256_SHA384,
-     "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384"},
-    {TLS1_CK_ECDHE_RSA_WITH_AES_128_SHA256,
-     "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256"},
-    {TLS1_CK_ECDHE_RSA_WITH_AES_256_SHA384,
-     "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384"},
-
-    // ECDH GCM based ciphersuites from RFC5289.
-    DEFINE_CIPHER_ENTRY_TLS1(ECDHE_ECDSA_WITH_AES_128_GCM_SHA256),
-    DEFINE_CIPHER_ENTRY_TLS1(ECDHE_ECDSA_WITH_AES_256_GCM_SHA384),
-    DEFINE_CIPHER_ENTRY_TLS1(ECDHE_RSA_WITH_AES_128_GCM_SHA256),
-    DEFINE_CIPHER_ENTRY_TLS1(ECDHE_RSA_WITH_AES_256_GCM_SHA384),
-
-    {0, nullptr}};
-#endif  // #ifndef OPENSSL_IS_BORINGSSL
-
-#if defined(_MSC_VER)
-#pragma warning(push)
-#pragma warning(disable : 4309)
-#pragma warning(disable : 4310)
-#endif  // defined(_MSC_VER)
-
-#if defined(_MSC_VER)
-#pragma warning(pop)
-#endif  // defined(_MSC_VER)
-
-//////////////////////////////////////////////////////////////////////
-// StreamBIO
-//////////////////////////////////////////////////////////////////////
-
-static int stream_write(BIO* h, const char* buf, int num);
-static int stream_read(BIO* h, char* buf, int size);
-static int stream_puts(BIO* h, const char* str);
-static long stream_ctrl(BIO* h, int cmd, long arg1, void* arg2);
-static int stream_new(BIO* h);
-static int stream_free(BIO* data);
-
-// TODO(davidben): This should be const once BoringSSL is assumed.
-static BIO_METHOD methods_stream = {
-    BIO_TYPE_BIO, "stream",   stream_write, stream_read, stream_puts, 0,
-    stream_ctrl,  stream_new, stream_free,  nullptr,
-};
-
-static BIO_METHOD* BIO_s_stream() { return(&methods_stream); }
-
-static BIO* BIO_new_stream(StreamInterface* stream) {
-  BIO* ret = BIO_new(BIO_s_stream());
-  if (ret == nullptr)
-    return nullptr;
-  ret->ptr = stream;
-  return ret;
-}
-
-// bio methods return 1 (or at least non-zero) on success and 0 on failure.
-
-static int stream_new(BIO* b) {
-  b->shutdown = 0;
-  b->init = 1;
-  b->num = 0;  // 1 means end-of-stream
-  b->ptr = 0;
-  return 1;
-}
-
-static int stream_free(BIO* b) {
-  if (b == nullptr)
-    return 0;
-  return 1;
-}
-
-static int stream_read(BIO* b, char* out, int outl) {
-  if (!out)
-    return -1;
-  StreamInterface* stream = static_cast<StreamInterface*>(b->ptr);
-  BIO_clear_retry_flags(b);
-  size_t read;
-  int error;
-  StreamResult result = stream->Read(out, outl, &read, &error);
-  if (result == SR_SUCCESS) {
-    return checked_cast<int>(read);
-  } else if (result == SR_EOS) {
-    b->num = 1;
-  } else if (result == SR_BLOCK) {
-    BIO_set_retry_read(b);
-  }
-  return -1;
-}
-
-static int stream_write(BIO* b, const char* in, int inl) {
-  if (!in)
-    return -1;
-  StreamInterface* stream = static_cast<StreamInterface*>(b->ptr);
-  BIO_clear_retry_flags(b);
-  size_t written;
-  int error;
-  StreamResult result = stream->Write(in, inl, &written, &error);
-  if (result == SR_SUCCESS) {
-    return checked_cast<int>(written);
-  } else if (result == SR_BLOCK) {
-    BIO_set_retry_write(b);
-  }
-  return -1;
-}
-
-static int stream_puts(BIO* b, const char* str) {
-  return stream_write(b, str, checked_cast<int>(strlen(str)));
-}
-
-static long stream_ctrl(BIO* b, int cmd, long num, void* ptr) {
-  switch (cmd) {
-    case BIO_CTRL_RESET:
-      return 0;
-    case BIO_CTRL_EOF:
-      return b->num;
-    case BIO_CTRL_WPENDING:
-    case BIO_CTRL_PENDING:
-      return 0;
-    case BIO_CTRL_FLUSH:
-      return 1;
-    case BIO_CTRL_DGRAM_QUERY_MTU:
-      // openssl defaults to mtu=256 unless we return something here.
-      // The handshake doesn't actually need to send packets above 1k,
-      // so this seems like a sensible value that should work in most cases.
-      // Webrtc uses the same value for video packets.
-      return 1200;
-    default:
-      return 0;
-  }
-}
-
-/////////////////////////////////////////////////////////////////////////////
-// OpenSSLStreamAdapter
-/////////////////////////////////////////////////////////////////////////////
-
-OpenSSLStreamAdapter::OpenSSLStreamAdapter(StreamInterface* stream)
-    : SSLStreamAdapter(stream),
-      state_(SSL_NONE),
-      role_(SSL_CLIENT),
-      ssl_read_needs_write_(false),
-      ssl_write_needs_read_(false),
-      ssl_(nullptr),
-      ssl_ctx_(nullptr),
-      ssl_mode_(SSL_MODE_TLS),
-      ssl_max_version_(SSL_PROTOCOL_TLS_12) {}
-
-OpenSSLStreamAdapter::~OpenSSLStreamAdapter() {
-  Cleanup(0);
-}
-
-void OpenSSLStreamAdapter::SetIdentity(SSLIdentity* identity) {
-  RTC_DCHECK(!identity_);
-  identity_.reset(static_cast<OpenSSLIdentity*>(identity));
-}
-
-void OpenSSLStreamAdapter::SetServerRole(SSLRole role) {
-  role_ = role;
-}
-
-std::unique_ptr<SSLCertificate> OpenSSLStreamAdapter::GetPeerCertificate()
-    const {
-  return peer_certificate_ ? std::unique_ptr<SSLCertificate>(
-                                 peer_certificate_->GetReference())
-                           : nullptr;
-}
-
-bool OpenSSLStreamAdapter::SetPeerCertificateDigest(
-    const std::string& digest_alg,
-    const unsigned char* digest_val,
-    size_t digest_len,
-    SSLPeerCertificateDigestError* error) {
-  RTC_DCHECK(!peer_certificate_verified_);
-  RTC_DCHECK(!has_peer_certificate_digest());
-  size_t expected_len;
-  if (error) {
-    *error = SSLPeerCertificateDigestError::NONE;
-  }
-
-  if (!OpenSSLDigest::GetDigestSize(digest_alg, &expected_len)) {
-    LOG(LS_WARNING) << "Unknown digest algorithm: " << digest_alg;
-    if (error) {
-      *error = SSLPeerCertificateDigestError::UNKNOWN_ALGORITHM;
-    }
-    return false;
-  }
-  if (expected_len != digest_len) {
-    if (error) {
-      *error = SSLPeerCertificateDigestError::INVALID_LENGTH;
-    }
-    return false;
-  }
-
-  peer_certificate_digest_value_.SetData(digest_val, digest_len);
-  peer_certificate_digest_algorithm_ = digest_alg;
-
-  if (!peer_certificate_) {
-    // Normal case, where the digest is set before we obtain the certificate
-    // from the handshake.
-    return true;
-  }
-
-  if (!VerifyPeerCertificate()) {
-    Error("SetPeerCertificateDigest", -1, SSL_AD_BAD_CERTIFICATE, false);
-    if (error) {
-      *error = SSLPeerCertificateDigestError::VERIFICATION_FAILED;
-    }
-    return false;
-  }
-
-  if (state_ == SSL_CONNECTED) {
-    // Post the event asynchronously to unwind the stack. The caller
-    // of ContinueSSL may be the same object listening for these
-    // events and may not be prepared for reentrancy.
-    PostEvent(SE_OPEN | SE_READ | SE_WRITE, 0);
-  }
-
-  return true;
-}
-
-std::string OpenSSLStreamAdapter::SslCipherSuiteToName(int cipher_suite) {
-#ifdef OPENSSL_IS_BORINGSSL
-  const SSL_CIPHER* ssl_cipher = SSL_get_cipher_by_value(cipher_suite);
-  if (!ssl_cipher) {
-    return std::string();
-  }
-  char* cipher_name = SSL_CIPHER_get_rfc_name(ssl_cipher);
-  std::string rfc_name = std::string(cipher_name);
-  OPENSSL_free(cipher_name);
-  return rfc_name;
-#else
-  for (const SslCipherMapEntry* entry = kSslCipherMap; entry->rfc_name;
-       ++entry) {
-    if (cipher_suite == static_cast<int>(entry->openssl_id)) {
-      return entry->rfc_name;
-    }
-  }
-  return std::string();
-#endif
-}
-
-bool OpenSSLStreamAdapter::GetSslCipherSuite(int* cipher_suite) {
-  if (state_ != SSL_CONNECTED)
-    return false;
-
-  const SSL_CIPHER* current_cipher = SSL_get_current_cipher(ssl_);
-  if (current_cipher == nullptr) {
-    return false;
-  }
-
-  *cipher_suite = static_cast<uint16_t>(SSL_CIPHER_get_id(current_cipher));
-  return true;
-}
-
-int OpenSSLStreamAdapter::GetSslVersion() const {
-  if (state_ != SSL_CONNECTED)
-    return -1;
-
-  int ssl_version = SSL_version(ssl_);
-  if (ssl_mode_ == SSL_MODE_DTLS) {
-    if (ssl_version == DTLS1_VERSION)
-      return SSL_PROTOCOL_DTLS_10;
-    else if (ssl_version == DTLS1_2_VERSION)
-      return SSL_PROTOCOL_DTLS_12;
-  } else {
-    if (ssl_version == TLS1_VERSION)
-      return SSL_PROTOCOL_TLS_10;
-    else if (ssl_version == TLS1_1_VERSION)
-      return SSL_PROTOCOL_TLS_11;
-    else if (ssl_version == TLS1_2_VERSION)
-      return SSL_PROTOCOL_TLS_12;
-  }
-
-  return -1;
-}
-
-// Key Extractor interface
-bool OpenSSLStreamAdapter::ExportKeyingMaterial(const std::string& label,
-                                                const uint8_t* context,
-                                                size_t context_len,
-                                                bool use_context,
-                                                uint8_t* result,
-                                                size_t result_len) {
-  int i;
-
-  i = SSL_export_keying_material(ssl_, result, result_len, label.c_str(),
-                                 label.length(), const_cast<uint8_t*>(context),
-                                 context_len, use_context);
-
-  if (i != 1)
-    return false;
-
-  return true;
-}
-
-bool OpenSSLStreamAdapter::SetDtlsSrtpCryptoSuites(
-    const std::vector<int>& ciphers) {
-  std::string internal_ciphers;
-
-  if (state_ != SSL_NONE)
-    return false;
-
-  for (std::vector<int>::const_iterator cipher = ciphers.begin();
-       cipher != ciphers.end(); ++cipher) {
-    bool found = false;
-    for (SrtpCipherMapEntry* entry = SrtpCipherMap; entry->internal_name;
-         ++entry) {
-      if (*cipher == entry->id) {
-        found = true;
-        if (!internal_ciphers.empty())
-          internal_ciphers += ":";
-        internal_ciphers += entry->internal_name;
-        break;
-      }
-    }
-
-    if (!found) {
-      LOG(LS_ERROR) << "Could not find cipher: " << *cipher;
-      return false;
-    }
-  }
-
-  if (internal_ciphers.empty())
-    return false;
-
-  srtp_ciphers_ = internal_ciphers;
-  return true;
-}
-
-bool OpenSSLStreamAdapter::GetDtlsSrtpCryptoSuite(int* crypto_suite) {
-  RTC_DCHECK(state_ == SSL_CONNECTED);
-  if (state_ != SSL_CONNECTED)
-    return false;
-
-  const SRTP_PROTECTION_PROFILE *srtp_profile =
-      SSL_get_selected_srtp_profile(ssl_);
-
-  if (!srtp_profile)
-    return false;
-
-  *crypto_suite = srtp_profile->id;
-  RTC_DCHECK(!SrtpCryptoSuiteToName(*crypto_suite).empty());
-  return true;
-}
-
-bool OpenSSLStreamAdapter::IsTlsConnected() {
-  return state_ == SSL_CONNECTED;
-}
-
-int OpenSSLStreamAdapter::StartSSL() {
-  if (state_ != SSL_NONE) {
-    // Don't allow StartSSL to be called twice.
-    return -1;
-  }
-
-  if (StreamAdapterInterface::GetState() != SS_OPEN) {
-    state_ = SSL_WAIT;
-    return 0;
-  }
-
-  state_ = SSL_CONNECTING;
-  if (int err = BeginSSL()) {
-    Error("BeginSSL", err, 0, false);
-    return err;
-  }
-
-  return 0;
-}
-
-void OpenSSLStreamAdapter::SetMode(SSLMode mode) {
-  RTC_DCHECK(state_ == SSL_NONE);
-  ssl_mode_ = mode;
-}
-
-void OpenSSLStreamAdapter::SetMaxProtocolVersion(SSLProtocolVersion version) {
-  RTC_DCHECK(ssl_ctx_ == nullptr);
-  ssl_max_version_ = version;
-}
-
-void OpenSSLStreamAdapter::SetInitialRetransmissionTimeout(
-    int timeout_ms) {
-  RTC_DCHECK(ssl_ctx_ == nullptr);
-  dtls_handshake_timeout_ms_ = timeout_ms;
-}
-
-//
-// StreamInterface Implementation
-//
-
-StreamResult OpenSSLStreamAdapter::Write(const void* data, size_t data_len,
-                                         size_t* written, int* error) {
-  LOG(LS_VERBOSE) << "OpenSSLStreamAdapter::Write(" << data_len << ")";
-
-  switch (state_) {
-  case SSL_NONE:
-    // pass-through in clear text
-    return StreamAdapterInterface::Write(data, data_len, written, error);
-
-  case SSL_WAIT:
-  case SSL_CONNECTING:
-    return SR_BLOCK;
-
-  case SSL_CONNECTED:
-    if (waiting_to_verify_peer_certificate()) {
-      return SR_BLOCK;
-    }
-    break;
-
-  case SSL_ERROR:
-  case SSL_CLOSED:
-  default:
-    if (error)
-      *error = ssl_error_code_;
-    return SR_ERROR;
-  }
-
-  // OpenSSL will return an error if we try to write zero bytes
-  if (data_len == 0) {
-    if (written)
-      *written = 0;
-    return SR_SUCCESS;
-  }
-
-  ssl_write_needs_read_ = false;
-
-  int code = SSL_write(ssl_, data, checked_cast<int>(data_len));
-  int ssl_error = SSL_get_error(ssl_, code);
-  switch (ssl_error) {
-  case SSL_ERROR_NONE:
-    LOG(LS_VERBOSE) << " -- success";
-    RTC_DCHECK_GT(code, 0);
-    RTC_DCHECK_LE(code, data_len);
-    if (written)
-      *written = code;
-    return SR_SUCCESS;
-  case SSL_ERROR_WANT_READ:
-    LOG(LS_VERBOSE) << " -- error want read";
-    ssl_write_needs_read_ = true;
-    return SR_BLOCK;
-  case SSL_ERROR_WANT_WRITE:
-    LOG(LS_VERBOSE) << " -- error want write";
-    return SR_BLOCK;
-
-  case SSL_ERROR_ZERO_RETURN:
-  default:
-    Error("SSL_write", (ssl_error ? ssl_error : -1), 0, false);
-    if (error)
-      *error = ssl_error_code_;
-    return SR_ERROR;
-  }
-  // not reached
-}
-
-StreamResult OpenSSLStreamAdapter::Read(void* data, size_t data_len,
-                                        size_t* read, int* error) {
-  LOG(LS_VERBOSE) << "OpenSSLStreamAdapter::Read(" << data_len << ")";
-  switch (state_) {
-    case SSL_NONE:
-      // pass-through in clear text
-      return StreamAdapterInterface::Read(data, data_len, read, error);
-
-    case SSL_WAIT:
-    case SSL_CONNECTING:
-      return SR_BLOCK;
-
-    case SSL_CONNECTED:
-      if (waiting_to_verify_peer_certificate()) {
-        return SR_BLOCK;
-      }
-      break;
-
-    case SSL_CLOSED:
-      return SR_EOS;
-
-    case SSL_ERROR:
-    default:
-      if (error)
-        *error = ssl_error_code_;
-      return SR_ERROR;
-  }
-
-  // Don't trust OpenSSL with zero byte reads
-  if (data_len == 0) {
-    if (read)
-      *read = 0;
-    return SR_SUCCESS;
-  }
-
-  ssl_read_needs_write_ = false;
-
-  int code = SSL_read(ssl_, data, checked_cast<int>(data_len));
-  int ssl_error = SSL_get_error(ssl_, code);
-  switch (ssl_error) {
-    case SSL_ERROR_NONE:
-      LOG(LS_VERBOSE) << " -- success";
-      RTC_DCHECK_GT(code, 0);
-      RTC_DCHECK_LE(code, data_len);
-      if (read)
-        *read = code;
-
-      if (ssl_mode_ == SSL_MODE_DTLS) {
-        // Enforce atomic reads -- this is a short read
-        unsigned int pending = SSL_pending(ssl_);
-
-        if (pending) {
-          LOG(LS_INFO) << " -- short DTLS read. flushing";
-          FlushInput(pending);
-          if (error)
-            *error = SSE_MSG_TRUNC;
-          return SR_ERROR;
-        }
-      }
-      return SR_SUCCESS;
-    case SSL_ERROR_WANT_READ:
-      LOG(LS_VERBOSE) << " -- error want read";
-      return SR_BLOCK;
-    case SSL_ERROR_WANT_WRITE:
-      LOG(LS_VERBOSE) << " -- error want write";
-      ssl_read_needs_write_ = true;
-      return SR_BLOCK;
-    case SSL_ERROR_ZERO_RETURN:
-      LOG(LS_VERBOSE) << " -- remote side closed";
-      Close();
-      return SR_EOS;
-      break;
-    default:
-      LOG(LS_VERBOSE) << " -- error " << code;
-      Error("SSL_read", (ssl_error ? ssl_error : -1), 0, false);
-      if (error)
-        *error = ssl_error_code_;
-      return SR_ERROR;
-  }
-  // not reached
-}
-
-void OpenSSLStreamAdapter::FlushInput(unsigned int left) {
-  unsigned char buf[2048];
-
-  while (left) {
-    // This should always succeed
-    int toread = (sizeof(buf) < left) ? sizeof(buf) : left;
-    int code = SSL_read(ssl_, buf, toread);
-
-    int ssl_error = SSL_get_error(ssl_, code);
-    RTC_DCHECK(ssl_error == SSL_ERROR_NONE);
-
-    if (ssl_error != SSL_ERROR_NONE) {
-      LOG(LS_VERBOSE) << " -- error " << code;
-      Error("SSL_read", (ssl_error ? ssl_error : -1), 0, false);
-      return;
-    }
-
-    LOG(LS_VERBOSE) << " -- flushed " << code << " bytes";
-    left -= code;
-  }
-}
-
-void OpenSSLStreamAdapter::Close() {
-  Cleanup(0);
-  RTC_DCHECK(state_ == SSL_CLOSED || state_ == SSL_ERROR);
-  // When we're closed at SSL layer, also close the stream level which
-  // performs necessary clean up. Otherwise, a new incoming packet after
-  // this could overflow the stream buffer.
-  StreamAdapterInterface::Close();
-}
-
-StreamState OpenSSLStreamAdapter::GetState() const {
-  switch (state_) {
-    case SSL_WAIT:
-    case SSL_CONNECTING:
-      return SS_OPENING;
-    case SSL_CONNECTED:
-      if (waiting_to_verify_peer_certificate()) {
-        return SS_OPENING;
-      }
-      return SS_OPEN;
-    default:
-      return SS_CLOSED;
-  };
-  // not reached
-}
-
-void OpenSSLStreamAdapter::OnEvent(StreamInterface* stream, int events,
-                                   int err) {
-  int events_to_signal = 0;
-  int signal_error = 0;
-  RTC_DCHECK(stream == this->stream());
-  if ((events & SE_OPEN)) {
-    LOG(LS_VERBOSE) << "OpenSSLStreamAdapter::OnEvent SE_OPEN";
-    if (state_ != SSL_WAIT) {
-      RTC_DCHECK(state_ == SSL_NONE);
-      events_to_signal |= SE_OPEN;
-    } else {
-      state_ = SSL_CONNECTING;
-      if (int err = BeginSSL()) {
-        Error("BeginSSL", err, 0, true);
-        return;
-      }
-    }
-  }
-  if ((events & (SE_READ|SE_WRITE))) {
-    LOG(LS_VERBOSE) << "OpenSSLStreamAdapter::OnEvent"
-                 << ((events & SE_READ) ? " SE_READ" : "")
-                 << ((events & SE_WRITE) ? " SE_WRITE" : "");
-    if (state_ == SSL_NONE) {
-      events_to_signal |= events & (SE_READ|SE_WRITE);
-    } else if (state_ == SSL_CONNECTING) {
-      if (int err = ContinueSSL()) {
-        Error("ContinueSSL", err, 0, true);
-        return;
-      }
-    } else if (state_ == SSL_CONNECTED) {
-      if (((events & SE_READ) && ssl_write_needs_read_) ||
-          (events & SE_WRITE)) {
-        LOG(LS_VERBOSE) << " -- onStreamWriteable";
-        events_to_signal |= SE_WRITE;
-      }
-      if (((events & SE_WRITE) && ssl_read_needs_write_) ||
-          (events & SE_READ)) {
-        LOG(LS_VERBOSE) << " -- onStreamReadable";
-        events_to_signal |= SE_READ;
-      }
-    }
-  }
-  if ((events & SE_CLOSE)) {
-    LOG(LS_VERBOSE) << "OpenSSLStreamAdapter::OnEvent(SE_CLOSE, " << err << ")";
-    Cleanup(0);
-    events_to_signal |= SE_CLOSE;
-    // SE_CLOSE is the only event that uses the final parameter to OnEvent().
-    RTC_DCHECK(signal_error == 0);
-    signal_error = err;
-  }
-  if (events_to_signal)
-    StreamAdapterInterface::OnEvent(stream, events_to_signal, signal_error);
-}
-
-int OpenSSLStreamAdapter::BeginSSL() {
-  RTC_DCHECK(state_ == SSL_CONNECTING);
-  // The underlying stream has opened.
-  LOG(LS_INFO) << "BeginSSL with peer.";
-
-  BIO* bio = nullptr;
-
-  // First set up the context.
-  RTC_DCHECK(ssl_ctx_ == nullptr);
-  ssl_ctx_ = SetupSSLContext();
-  if (!ssl_ctx_)
-    return -1;
-
-  bio = BIO_new_stream(static_cast<StreamInterface*>(stream()));
-  if (!bio)
-    return -1;
-
-  ssl_ = SSL_new(ssl_ctx_);
-  if (!ssl_) {
-    BIO_free(bio);
-    return -1;
-  }
-
-  SSL_set_app_data(ssl_, this);
-
-  SSL_set_bio(ssl_, bio, bio);  // the SSL object owns the bio now.
-  if (ssl_mode_ == SSL_MODE_DTLS) {
-#ifdef OPENSSL_IS_BORINGSSL
-    DTLSv1_set_initial_timeout_duration(ssl_, dtls_handshake_timeout_ms_);
-#else
-    // Enable read-ahead for DTLS so whole packets are read from internal BIO
-    // before parsing. This is done internally by BoringSSL for DTLS.
-    SSL_set_read_ahead(ssl_, 1);
-#endif
-  }
-
-  SSL_set_mode(ssl_, SSL_MODE_ENABLE_PARTIAL_WRITE |
-               SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER);
-
-#if !defined(OPENSSL_IS_BORINGSSL)
-  // Specify an ECDH group for ECDHE ciphers, otherwise OpenSSL cannot
-  // negotiate them when acting as the server. Use NIST's P-256 which is
-  // commonly supported. BoringSSL doesn't need explicit configuration and has
-  // a reasonable default set.
-  EC_KEY* ecdh = EC_KEY_new_by_curve_name(NID_X9_62_prime256v1);
-  if (ecdh == nullptr)
-    return -1;
-  SSL_set_options(ssl_, SSL_OP_SINGLE_ECDH_USE);
-  SSL_set_tmp_ecdh(ssl_, ecdh);
-  EC_KEY_free(ecdh);
-#endif
-
-  // Do the connect
-  return ContinueSSL();
-}
-
-int OpenSSLStreamAdapter::ContinueSSL() {
-  LOG(LS_VERBOSE) << "ContinueSSL";
-  RTC_DCHECK(state_ == SSL_CONNECTING);
-
-  // Clear the DTLS timer
-  Thread::Current()->Clear(this, MSG_TIMEOUT);
-
-  int code = (role_ == SSL_CLIENT) ? SSL_connect(ssl_) : SSL_accept(ssl_);
-  int ssl_error;
-  switch (ssl_error = SSL_get_error(ssl_, code)) {
-    case SSL_ERROR_NONE:
-      LOG(LS_VERBOSE) << " -- success";
-      // By this point, OpenSSL should have given us a certificate, or errored
-      // out if one was missing.
-      RTC_DCHECK(peer_certificate_ || !client_auth_enabled());
-
-      state_ = SSL_CONNECTED;
-      if (!waiting_to_verify_peer_certificate()) {
-        // We have everything we need to start the connection, so signal
-        // SE_OPEN. If we need a client certificate fingerprint and don't have
-        // it yet, we'll instead signal SE_OPEN in SetPeerCertificateDigest.
-        //
-        // TODO(deadbeef): Post this event asynchronously to unwind the stack.
-        // The caller of ContinueSSL may be the same object listening for these
-        // events and may not be prepared for reentrancy.
-        // PostEvent(SE_OPEN | SE_READ | SE_WRITE, 0);
-        StreamAdapterInterface::OnEvent(stream(), SE_OPEN | SE_READ | SE_WRITE,
-                                        0);
-      }
-      break;
-
-    case SSL_ERROR_WANT_READ: {
-        LOG(LS_VERBOSE) << " -- error want read";
-        struct timeval timeout;
-        if (DTLSv1_get_timeout(ssl_, &timeout)) {
-          int delay = timeout.tv_sec * 1000 + timeout.tv_usec/1000;
-
-          Thread::Current()->PostDelayed(RTC_FROM_HERE, delay, this,
-                                         MSG_TIMEOUT, 0);
-        }
-      }
-      break;
-
-    case SSL_ERROR_WANT_WRITE:
-      LOG(LS_VERBOSE) << " -- error want write";
-      break;
-
-    case SSL_ERROR_ZERO_RETURN:
-    default:
-      LOG(LS_VERBOSE) << " -- error " << code;
-      SSLHandshakeError ssl_handshake_err = SSLHandshakeError::UNKNOWN;
-      int err_code = ERR_peek_last_error();
-      if (err_code != 0 && ERR_GET_REASON(err_code) == SSL_R_NO_SHARED_CIPHER) {
-        ssl_handshake_err = SSLHandshakeError::INCOMPATIBLE_CIPHERSUITE;
-      }
-      SignalSSLHandshakeError(ssl_handshake_err);
-      return (ssl_error != 0) ? ssl_error : -1;
-  }
-
-  return 0;
-}
-
-void OpenSSLStreamAdapter::Error(const char* context,
-                                 int err,
-                                 uint8_t alert,
-                                 bool signal) {
-  LOG(LS_WARNING) << "OpenSSLStreamAdapter::Error(" << context << ", " << err
-                  << ", " << static_cast<int>(alert) << ")";
-  state_ = SSL_ERROR;
-  ssl_error_code_ = err;
-  Cleanup(alert);
-  if (signal)
-    StreamAdapterInterface::OnEvent(stream(), SE_CLOSE, err);
-}
-
-void OpenSSLStreamAdapter::Cleanup(uint8_t alert) {
-  LOG(LS_INFO) << "Cleanup";
-
-  if (state_ != SSL_ERROR) {
-    state_ = SSL_CLOSED;
-    ssl_error_code_ = 0;
-  }
-
-  if (ssl_) {
-    int ret;
-// SSL_send_fatal_alert is only available in BoringSSL.
-#ifdef OPENSSL_IS_BORINGSSL
-    if (alert) {
-      ret = SSL_send_fatal_alert(ssl_, alert);
-      if (ret < 0) {
-        LOG(LS_WARNING) << "SSL_send_fatal_alert failed, error = "
-                        << SSL_get_error(ssl_, ret);
-      }
-    } else {
-#endif
-      ret = SSL_shutdown(ssl_);
-      if (ret < 0) {
-        LOG(LS_WARNING) << "SSL_shutdown failed, error = "
-                        << SSL_get_error(ssl_, ret);
-      }
-#ifdef OPENSSL_IS_BORINGSSL
-    }
-#endif
-    SSL_free(ssl_);
-    ssl_ = nullptr;
-  }
-  if (ssl_ctx_) {
-    SSL_CTX_free(ssl_ctx_);
-    ssl_ctx_ = nullptr;
-  }
-  identity_.reset();
-  peer_certificate_.reset();
-
-  // Clear the DTLS timer
-  Thread::Current()->Clear(this, MSG_TIMEOUT);
-}
-
-
-void OpenSSLStreamAdapter::OnMessage(Message* msg) {
-  // Process our own messages and then pass others to the superclass
-  if (MSG_TIMEOUT == msg->message_id) {
-    LOG(LS_INFO) << "DTLS timeout expired";
-    DTLSv1_handle_timeout(ssl_);
-    ContinueSSL();
-  } else {
-    StreamInterface::OnMessage(msg);
-  }
-}
-
-SSL_CTX* OpenSSLStreamAdapter::SetupSSLContext() {
-  SSL_CTX* ctx = nullptr;
-
-#ifdef OPENSSL_IS_BORINGSSL
-    ctx = SSL_CTX_new(ssl_mode_ == SSL_MODE_DTLS ?
-        DTLS_method() : TLS_method());
-    // Version limiting for BoringSSL will be done below.
-#else
-  const SSL_METHOD* method;
-  switch (ssl_max_version_) {
-    case SSL_PROTOCOL_TLS_10:
-    case SSL_PROTOCOL_TLS_11:
-      // OpenSSL doesn't support setting min/max versions, so we always use
-      // (D)TLS 1.0 if a max. version below the max. available is requested.
-      if (ssl_mode_ == SSL_MODE_DTLS) {
-        if (role_ == SSL_CLIENT) {
-          method = DTLSv1_client_method();
-        } else {
-          method = DTLSv1_server_method();
-        }
-      } else {
-        if (role_ == SSL_CLIENT) {
-          method = TLSv1_client_method();
-        } else {
-          method = TLSv1_server_method();
-        }
-      }
-      break;
-    case SSL_PROTOCOL_TLS_12:
-    default:
-      if (ssl_mode_ == SSL_MODE_DTLS) {
-#if (OPENSSL_VERSION_NUMBER >= 0x10002000L)
-        // DTLS 1.2 only available starting from OpenSSL 1.0.2
-        if (role_ == SSL_CLIENT) {
-          method = DTLS_client_method();
-        } else {
-          method = DTLS_server_method();
-        }
-#else
-        if (role_ == SSL_CLIENT) {
-          method = DTLSv1_client_method();
-        } else {
-          method = DTLSv1_server_method();
-        }
-#endif
-      } else {
-#if (OPENSSL_VERSION_NUMBER >= 0x10100000L)
-        // New API only available starting from OpenSSL 1.1.0
-        if (role_ == SSL_CLIENT) {
-          method = TLS_client_method();
-        } else {
-          method = TLS_server_method();
-        }
-#else
-        if (role_ == SSL_CLIENT) {
-          method = SSLv23_client_method();
-        } else {
-          method = SSLv23_server_method();
-        }
-#endif
-      }
-      break;
-  }
-  ctx = SSL_CTX_new(method);
-#endif  // OPENSSL_IS_BORINGSSL
-
-  if (ctx == nullptr)
-    return nullptr;
-
-#ifdef OPENSSL_IS_BORINGSSL
-  SSL_CTX_set_min_proto_version(ctx, ssl_mode_ == SSL_MODE_DTLS ?
-      DTLS1_VERSION : TLS1_VERSION);
-  switch (ssl_max_version_) {
-    case SSL_PROTOCOL_TLS_10:
-      SSL_CTX_set_max_proto_version(ctx, ssl_mode_ == SSL_MODE_DTLS ?
-          DTLS1_VERSION : TLS1_VERSION);
-      break;
-    case SSL_PROTOCOL_TLS_11:
-      SSL_CTX_set_max_proto_version(ctx, ssl_mode_ == SSL_MODE_DTLS ?
-          DTLS1_VERSION : TLS1_1_VERSION);
-      break;
-    case SSL_PROTOCOL_TLS_12:
-    default:
-      SSL_CTX_set_max_proto_version(ctx, ssl_mode_ == SSL_MODE_DTLS ?
-          DTLS1_2_VERSION : TLS1_2_VERSION);
-      break;
-  }
-  if (g_use_time_callback_for_testing) {
-    SSL_CTX_set_current_time_cb(ctx, &TimeCallbackForTesting);
-  }
-#endif
-
-  if (identity_ && !identity_->ConfigureIdentity(ctx)) {
-    SSL_CTX_free(ctx);
-    return nullptr;
-  }
-
-#if !defined(NDEBUG)
-  SSL_CTX_set_info_callback(ctx, OpenSSLAdapter::SSLInfoCallback);
-#endif
-
-  int mode = SSL_VERIFY_PEER;
-  if (client_auth_enabled()) {
-    // Require a certificate from the client.
-    // Note: Normally this is always true in production, but it may be disabled
-    // for testing purposes (e.g. SSLAdapter unit tests).
-    mode |= SSL_VERIFY_FAIL_IF_NO_PEER_CERT;
-  }
-
-  SSL_CTX_set_verify(ctx, mode, SSLVerifyCallback);
-  SSL_CTX_set_verify_depth(ctx, 4);
-  // Select list of available ciphers. Note that !SHA256 and !SHA384 only
-  // remove HMAC-SHA256 and HMAC-SHA384 cipher suites, not GCM cipher suites
-  // with SHA256 or SHA384 as the handshake hash.
-  // This matches the list of SSLClientSocketOpenSSL in Chromium.
-  SSL_CTX_set_cipher_list(
-      ctx, "DEFAULT:!NULL:!aNULL:!SHA256:!SHA384:!aECDH:!AESGCM+AES256:!aPSK");
-
-  if (!srtp_ciphers_.empty()) {
-    if (SSL_CTX_set_tlsext_use_srtp(ctx, srtp_ciphers_.c_str())) {
-      SSL_CTX_free(ctx);
-      return nullptr;
-    }
-  }
-
-  return ctx;
-}
-
-bool OpenSSLStreamAdapter::VerifyPeerCertificate() {
-  if (!has_peer_certificate_digest() || !peer_certificate_) {
-    LOG(LS_WARNING) << "Missing digest or peer certificate.";
-    return false;
-  }
-
-  unsigned char digest[EVP_MAX_MD_SIZE];
-  size_t digest_length;
-  if (!OpenSSLCertificate::ComputeDigest(
-          peer_certificate_->x509(), peer_certificate_digest_algorithm_, digest,
-          sizeof(digest), &digest_length)) {
-    LOG(LS_WARNING) << "Failed to compute peer cert digest.";
-    return false;
-  }
-
-  Buffer computed_digest(digest, digest_length);
-  if (computed_digest != peer_certificate_digest_value_) {
-    LOG(LS_WARNING) << "Rejected peer certificate due to mismatched digest.";
-    return false;
-  }
-  // Ignore any verification error if the digest matches, since there is no
-  // value in checking the validity of a self-signed cert issued by untrusted
-  // sources.
-  LOG(LS_INFO) << "Accepted peer certificate.";
-  peer_certificate_verified_ = true;
-  return true;
-}
-
-int OpenSSLStreamAdapter::SSLVerifyCallback(int ok, X509_STORE_CTX* store) {
-  // Get our SSL structure from the store
-  SSL* ssl = reinterpret_cast<SSL*>(
-      X509_STORE_CTX_get_ex_data(store, SSL_get_ex_data_X509_STORE_CTX_idx()));
-  X509* cert = X509_STORE_CTX_get_current_cert(store);
-  int depth = X509_STORE_CTX_get_error_depth(store);
-
-  // For now we ignore the parent certificates and verify the leaf against
-  // the digest.
-  //
-  // TODO(jiayl): Verify the chain is a proper chain and report the chain to
-  // |stream->peer_certificate_|.
-  if (depth > 0) {
-    LOG(LS_INFO) << "Ignored chained certificate at depth " << depth;
-    return 1;
-  }
-
-  OpenSSLStreamAdapter* stream =
-      reinterpret_cast<OpenSSLStreamAdapter*>(SSL_get_app_data(ssl));
-
-  // Record the peer's certificate.
-  stream->peer_certificate_.reset(new OpenSSLCertificate(cert));
-
-  // If the peer certificate digest isn't known yet, we'll wait to verify
-  // until it's known, and for now just return a success status.
-  if (stream->peer_certificate_digest_algorithm_.empty()) {
-    LOG(LS_INFO) << "Waiting to verify certificate until digest is known.";
-    return 1;
-  }
-
-  return stream->VerifyPeerCertificate();
-}
-
-bool OpenSSLStreamAdapter::IsBoringSsl() {
-#ifdef OPENSSL_IS_BORINGSSL
-  return true;
-#else
-  return false;
-#endif
-}
-
-#define CDEF(X) \
-  { static_cast<uint16_t>(TLS1_CK_##X & 0xffff), "TLS_" #X }
-
-struct cipher_list {
-  uint16_t cipher;
-  const char* cipher_str;
-};
-
-// TODO(torbjorng): Perhaps add more cipher suites to these lists.
-static const cipher_list OK_RSA_ciphers[] = {
-  CDEF(ECDHE_RSA_WITH_AES_128_CBC_SHA),
-  CDEF(ECDHE_RSA_WITH_AES_256_CBC_SHA),
-  CDEF(ECDHE_RSA_WITH_AES_128_GCM_SHA256),
-#ifdef TLS1_CK_ECDHE_RSA_WITH_AES_256_GCM_SHA256
-  CDEF(ECDHE_RSA_WITH_AES_256_GCM_SHA256),
-#endif
-#ifdef TLS1_CK_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256
-  CDEF(ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256),
-#endif
-};
-
-static const cipher_list OK_ECDSA_ciphers[] = {
-  CDEF(ECDHE_ECDSA_WITH_AES_128_CBC_SHA),
-  CDEF(ECDHE_ECDSA_WITH_AES_256_CBC_SHA),
-  CDEF(ECDHE_ECDSA_WITH_AES_128_GCM_SHA256),
-#ifdef TLS1_CK_ECDHE_ECDSA_WITH_AES_256_GCM_SHA256
-  CDEF(ECDHE_ECDSA_WITH_AES_256_GCM_SHA256),
-#endif
-#ifdef TLS1_CK_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256
-  CDEF(ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256),
-#endif
-};
-#undef CDEF
-
-bool OpenSSLStreamAdapter::IsAcceptableCipher(int cipher, KeyType key_type) {
-  if (key_type == KT_RSA) {
-    for (const cipher_list& c : OK_RSA_ciphers) {
-      if (cipher == c.cipher)
-        return true;
-    }
-  }
-
-  if (key_type == KT_ECDSA) {
-    for (const cipher_list& c : OK_ECDSA_ciphers) {
-      if (cipher == c.cipher)
-        return true;
-    }
-  }
-
-  return false;
-}
-
-bool OpenSSLStreamAdapter::IsAcceptableCipher(const std::string& cipher,
-                                              KeyType key_type) {
-  if (key_type == KT_RSA) {
-    for (const cipher_list& c : OK_RSA_ciphers) {
-      if (cipher == c.cipher_str)
-        return true;
-    }
-  }
-
-  if (key_type == KT_ECDSA) {
-    for (const cipher_list& c : OK_ECDSA_ciphers) {
-      if (cipher == c.cipher_str)
-        return true;
-    }
-  }
-
-  return false;
-}
-
-void OpenSSLStreamAdapter::enable_time_callback_for_testing() {
-  g_use_time_callback_for_testing = true;
-}
-
-}  // namespace rtc
diff --git a/rtc_base/opensslstreamadapter.h b/rtc_base/opensslstreamadapter.h
deleted file mode 100644
index 32518ce..0000000
--- a/rtc_base/opensslstreamadapter.h
+++ /dev/null
@@ -1,226 +0,0 @@
-/*
- *  Copyright 2004 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_RTC_BASE_OPENSSLSTREAMADAPTER_H_
-#define WEBRTC_RTC_BASE_OPENSSLSTREAMADAPTER_H_
-
-#include <string>
-#include <memory>
-#include <vector>
-
-#include "webrtc/rtc_base/buffer.h"
-#include "webrtc/rtc_base/opensslidentity.h"
-#include "webrtc/rtc_base/sslstreamadapter.h"
-
-typedef struct ssl_st SSL;
-typedef struct ssl_ctx_st SSL_CTX;
-typedef struct ssl_cipher_st SSL_CIPHER;
-typedef struct x509_store_ctx_st X509_STORE_CTX;
-
-namespace rtc {
-
-// This class was written with OpenSSLAdapter (a socket adapter) as a
-// starting point. It has similar structure and functionality, but uses a
-// "peer-to-peer" mode, verifying the peer's certificate using a digest
-// sent over a secure signaling channel.
-//
-// Static methods to initialize and deinit the SSL library are in
-// OpenSSLAdapter. These should probably be moved out to a neutral class.
-//
-// In a few cases I have factored out some OpenSSLAdapter code into static
-// methods so it can be reused from this class. Eventually that code should
-// probably be moved to a common support class. Unfortunately there remain a
-// few duplicated sections of code. I have not done more restructuring because
-// I did not want to affect existing code that uses OpenSSLAdapter.
-//
-// This class does not support the SSL connection restart feature present in
-// OpenSSLAdapter. I am not entirely sure how the feature is useful and I am
-// not convinced that it works properly.
-//
-// This implementation is careful to disallow data exchange after an SSL error,
-// and it has an explicit SSL_CLOSED state. It should not be possible to send
-// any data in clear after one of the StartSSL methods has been called.
-
-// Look in sslstreamadapter.h for documentation of the methods.
-
-class OpenSSLIdentity;
-
-///////////////////////////////////////////////////////////////////////////////
-
-class OpenSSLStreamAdapter : public SSLStreamAdapter {
- public:
-  explicit OpenSSLStreamAdapter(StreamInterface* stream);
-  ~OpenSSLStreamAdapter() override;
-
-  void SetIdentity(SSLIdentity* identity) override;
-
-  // Default argument is for compatibility
-  void SetServerRole(SSLRole role = SSL_SERVER) override;
-  bool SetPeerCertificateDigest(
-      const std::string& digest_alg,
-      const unsigned char* digest_val,
-      size_t digest_len,
-      SSLPeerCertificateDigestError* error = nullptr) override;
-
-  std::unique_ptr<SSLCertificate> GetPeerCertificate() const override;
-
-  // Goes from state SSL_NONE to either SSL_CONNECTING or SSL_WAIT, depending
-  // on whether the underlying stream is already open or not.
-  int StartSSL() override;
-  void SetMode(SSLMode mode) override;
-  void SetMaxProtocolVersion(SSLProtocolVersion version) override;
-  void SetInitialRetransmissionTimeout(int timeout_ms) override;
-
-  StreamResult Read(void* data,
-                    size_t data_len,
-                    size_t* read,
-                    int* error) override;
-  StreamResult Write(const void* data,
-                     size_t data_len,
-                     size_t* written,
-                     int* error) override;
-  void Close() override;
-  StreamState GetState() const override;
-
-  // TODO(guoweis): Move this away from a static class method.
-  static std::string SslCipherSuiteToName(int crypto_suite);
-
-  bool GetSslCipherSuite(int* cipher) override;
-
-  int GetSslVersion() const override;
-
-  // Key Extractor interface
-  bool ExportKeyingMaterial(const std::string& label,
-                            const uint8_t* context,
-                            size_t context_len,
-                            bool use_context,
-                            uint8_t* result,
-                            size_t result_len) override;
-
-  // DTLS-SRTP interface
-  bool SetDtlsSrtpCryptoSuites(const std::vector<int>& crypto_suites) override;
-  bool GetDtlsSrtpCryptoSuite(int* crypto_suite) override;
-
-  bool IsTlsConnected() override;
-
-  // Capabilities interfaces.
-  static bool IsBoringSsl();
-
-  static bool IsAcceptableCipher(int cipher, KeyType key_type);
-  static bool IsAcceptableCipher(const std::string& cipher, KeyType key_type);
-
-  // Use our timeutils.h source of timing in BoringSSL, allowing us to test
-  // using a fake clock.
-  static void enable_time_callback_for_testing();
-
- protected:
-  void OnEvent(StreamInterface* stream, int events, int err) override;
-
- private:
-  enum SSLState {
-    // Before calling one of the StartSSL methods, data flows
-    // in clear text.
-    SSL_NONE,
-    SSL_WAIT,  // waiting for the stream to open to start SSL negotiation
-    SSL_CONNECTING,  // SSL negotiation in progress
-    SSL_CONNECTED,  // SSL stream successfully established
-    SSL_ERROR,  // some SSL error occurred, stream is closed
-    SSL_CLOSED  // Clean close
-  };
-
-  enum { MSG_TIMEOUT = MSG_MAX+1};
-
-  // The following three methods return 0 on success and a negative
-  // error code on failure. The error code may be from OpenSSL or -1
-  // on some other error cases, so it can't really be interpreted
-  // unfortunately.
-
-  // Prepare SSL library, state is SSL_CONNECTING.
-  int BeginSSL();
-  // Perform SSL negotiation steps.
-  int ContinueSSL();
-
-  // Error handler helper. signal is given as true for errors in
-  // asynchronous contexts (when an error method was not returned
-  // through some other method), and in that case an SE_CLOSE event is
-  // raised on the stream with the specified error.
-  // A 0 error means a graceful close, otherwise there is not really enough
-  // context to interpret the error code.
-  // |alert| indicates an alert description (one of the SSL_AD constants) to
-  // send to the remote endpoint when closing the association. If 0, a normal
-  // shutdown will be performed.
-  void Error(const char* context, int err, uint8_t alert, bool signal);
-  void Cleanup(uint8_t alert);
-
-  // Override MessageHandler
-  void OnMessage(Message* msg) override;
-
-  // Flush the input buffers by reading left bytes (for DTLS)
-  void FlushInput(unsigned int left);
-
-  // SSL library configuration
-  SSL_CTX* SetupSSLContext();
-  // Verify the peer certificate matches the signaled digest.
-  bool VerifyPeerCertificate();
-  // SSL certification verification error handler, called back from
-  // the openssl library. Returns an int interpreted as a boolean in
-  // the C style: zero means verification failure, non-zero means
-  // passed.
-  static int SSLVerifyCallback(int ok, X509_STORE_CTX* store);
-
-  bool waiting_to_verify_peer_certificate() const {
-    return client_auth_enabled() && !peer_certificate_verified_;
-  }
-
-  bool has_peer_certificate_digest() const {
-    return !peer_certificate_digest_algorithm_.empty() &&
-           !peer_certificate_digest_value_.empty();
-  }
-
-  SSLState state_;
-  SSLRole role_;
-  int ssl_error_code_;  // valid when state_ == SSL_ERROR or SSL_CLOSED
-  // Whether the SSL negotiation is blocked on needing to read or
-  // write to the wrapped stream.
-  bool ssl_read_needs_write_;
-  bool ssl_write_needs_read_;
-
-  SSL* ssl_;
-  SSL_CTX* ssl_ctx_;
-
-  // Our key and certificate.
-  std::unique_ptr<OpenSSLIdentity> identity_;
-  // The certificate that the peer presented. Initially null, until the
-  // connection is established.
-  std::unique_ptr<OpenSSLCertificate> peer_certificate_;
-  bool peer_certificate_verified_ = false;
-  // The digest of the certificate that the peer must present.
-  Buffer peer_certificate_digest_value_;
-  std::string peer_certificate_digest_algorithm_;
-
-  // The DtlsSrtp ciphers
-  std::string srtp_ciphers_;
-
-  // Do DTLS or not
-  SSLMode ssl_mode_;
-
-  // Max. allowed protocol version
-  SSLProtocolVersion ssl_max_version_;
-
-  // A 50-ms initial timeout ensures rapid setup on fast connections, but may
-  // be too aggressive for low bandwidth links.
-  int dtls_handshake_timeout_ms_ = 50;
-};
-
-/////////////////////////////////////////////////////////////////////////////
-
-}  // namespace rtc
-
-#endif  // WEBRTC_RTC_BASE_OPENSSLSTREAMADAPTER_H_
diff --git a/rtc_base/optional.h b/rtc_base/optional.h
deleted file mode 100644
index b707746..0000000
--- a/rtc_base/optional.h
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-// This header is for backwards compatibility only, and will be removed soon.
-// Include webrtc/api/optional.h instead.
-
-#ifndef WEBRTC_RTC_BASE_OPTIONAL_H_
-#define WEBRTC_RTC_BASE_OPTIONAL_H_
-
-#include "webrtc/api/optional.h"
-
-#endif  // WEBRTC_RTC_BASE_OPTIONAL_H_
diff --git a/rtc_base/optionsfile.cc b/rtc_base/optionsfile.cc
deleted file mode 100644
index e8401fb..0000000
--- a/rtc_base/optionsfile.cc
+++ /dev/null
@@ -1,186 +0,0 @@
-/*
- *  Copyright 2008 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/rtc_base/optionsfile.h"
-
-#include <ctype.h>
-
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/stream.h"
-#include "webrtc/rtc_base/stringencode.h"
-
-namespace rtc {
-
-OptionsFile::OptionsFile(const std::string &path) : path_(path) {
-}
-
-OptionsFile::~OptionsFile() = default;
-
-bool OptionsFile::Load() {
-  options_.clear();
-  // Open file.
-  FileStream stream;
-  int err;
-  if (!stream.Open(path_, "r", &err)) {
-    LOG_F(LS_WARNING) << "Could not open file, err=" << err;
-    // We do not consider this an error because we expect there to be no file
-    // until the user saves a setting.
-    return true;
-  }
-  // Read in all its data.
-  std::string line;
-  StreamResult res;
-  for (;;) {
-    res = stream.ReadLine(&line);
-    if (res != SR_SUCCESS) {
-      break;
-    }
-    size_t equals_pos = line.find('=');
-    if (equals_pos == std::string::npos) {
-      // We do not consider this an error. Instead we ignore the line and
-      // keep going.
-      LOG_F(LS_WARNING) << "Ignoring malformed line in " << path_;
-      continue;
-    }
-    std::string key(line, 0, equals_pos);
-    std::string value(line, equals_pos + 1, line.length() - (equals_pos + 1));
-    options_[key] = value;
-  }
-  if (res != SR_EOS) {
-    LOG_F(LS_ERROR) << "Error when reading from file";
-    return false;
-  } else {
-    return true;
-  }
-}
-
-bool OptionsFile::Save() {
-  // Open file.
-  FileStream stream;
-  int err;
-  if (!stream.Open(path_, "w", &err)) {
-    LOG_F(LS_ERROR) << "Could not open file, err=" << err;
-    return false;
-  }
-  // Write out all the data.
-  StreamResult res = SR_SUCCESS;
-  size_t written;
-  int error;
-  for (OptionsMap::const_iterator i = options_.begin(); i != options_.end();
-       ++i) {
-    res = stream.WriteAll(i->first.c_str(), i->first.length(), &written,
-        &error);
-    if (res != SR_SUCCESS) {
-      break;
-    }
-    res = stream.WriteAll("=", 1, &written, &error);
-    if (res != SR_SUCCESS) {
-      break;
-    }
-    res = stream.WriteAll(i->second.c_str(), i->second.length(), &written,
-        &error);
-    if (res != SR_SUCCESS) {
-      break;
-    }
-    res = stream.WriteAll("\n", 1, &written, &error);
-    if (res != SR_SUCCESS) {
-      break;
-    }
-  }
-  if (res != SR_SUCCESS) {
-    LOG_F(LS_ERROR) << "Unable to write to file";
-    return false;
-  } else {
-    return true;
-  }
-}
-
-bool OptionsFile::IsLegalName(const std::string &name) {
-  for (size_t pos = 0; pos < name.length(); ++pos) {
-    if (name[pos] == '\n' || name[pos] == '\\' || name[pos] == '=') {
-      // Illegal character.
-      LOG(LS_WARNING) << "Ignoring operation for illegal option " << name;
-      return false;
-    }
-  }
-  return true;
-}
-
-bool OptionsFile::IsLegalValue(const std::string &value) {
-  for (size_t pos = 0; pos < value.length(); ++pos) {
-    if (value[pos] == '\n' || value[pos] == '\\') {
-      // Illegal character.
-      LOG(LS_WARNING) << "Ignoring operation for illegal value " << value;
-      return false;
-    }
-  }
-  return true;
-}
-
-bool OptionsFile::GetStringValue(const std::string& option,
-                                 std::string *out_val) const {
-  LOG(LS_VERBOSE) << "OptionsFile::GetStringValue "
-                  << option;
-  if (!IsLegalName(option)) {
-    return false;
-  }
-  OptionsMap::const_iterator i = options_.find(option);
-  if (i == options_.end()) {
-    return false;
-  }
-  *out_val = i->second;
-  return true;
-}
-
-bool OptionsFile::GetIntValue(const std::string& option,
-                              int *out_val) const {
-  LOG(LS_VERBOSE) << "OptionsFile::GetIntValue "
-                  << option;
-  if (!IsLegalName(option)) {
-    return false;
-  }
-  OptionsMap::const_iterator i = options_.find(option);
-  if (i == options_.end()) {
-    return false;
-  }
-  return FromString(i->second, out_val);
-}
-
-bool OptionsFile::SetStringValue(const std::string& option,
-                                 const std::string& value) {
-  LOG(LS_VERBOSE) << "OptionsFile::SetStringValue "
-                  << option << ":" << value;
-  if (!IsLegalName(option) || !IsLegalValue(value)) {
-    return false;
-  }
-  options_[option] = value;
-  return true;
-}
-
-bool OptionsFile::SetIntValue(const std::string& option,
-                              int value) {
-  LOG(LS_VERBOSE) << "OptionsFile::SetIntValue "
-                  << option << ":" << value;
-  if (!IsLegalName(option)) {
-    return false;
-  }
-  return ToString(value, &options_[option]);
-}
-
-bool OptionsFile::RemoveValue(const std::string& option) {
-  LOG(LS_VERBOSE) << "OptionsFile::RemoveValue " << option;
-  if (!IsLegalName(option)) {
-    return false;
-  }
-  options_.erase(option);
-  return true;
-}
-
-}  // namespace rtc
diff --git a/rtc_base/optionsfile.h b/rtc_base/optionsfile.h
deleted file mode 100644
index 778ffaf..0000000
--- a/rtc_base/optionsfile.h
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- *  Copyright 2008 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_RTC_BASE_OPTIONSFILE_H_
-#define WEBRTC_RTC_BASE_OPTIONSFILE_H_
-
-#include <map>
-#include <string>
-
-namespace rtc {
-
-// Implements storage of simple options in a text file on disk. This is
-// cross-platform, but it is intended mostly for Linux where there is no
-// first-class options storage system.
-class OptionsFile {
- public:
-  OptionsFile(const std::string &path);
-  ~OptionsFile();
-
-  // Loads the file from disk, overwriting the in-memory values.
-  bool Load();
-  // Saves the contents in memory, overwriting the on-disk values.
-  bool Save();
-
-  bool GetStringValue(const std::string& option, std::string* out_val) const;
-  bool GetIntValue(const std::string& option, int* out_val) const;
-  bool SetStringValue(const std::string& option, const std::string& val);
-  bool SetIntValue(const std::string& option, int val);
-  bool RemoveValue(const std::string& option);
-
- private:
-  typedef std::map<std::string, std::string> OptionsMap;
-
-  static bool IsLegalName(const std::string &name);
-  static bool IsLegalValue(const std::string &value);
-
-  std::string path_;
-  OptionsMap options_;
-};
-
-}  // namespace rtc
-
-#endif  // WEBRTC_RTC_BASE_OPTIONSFILE_H_
diff --git a/rtc_base/optionsfile_unittest.cc b/rtc_base/optionsfile_unittest.cc
deleted file mode 100644
index b4f14db..0000000
--- a/rtc_base/optionsfile_unittest.cc
+++ /dev/null
@@ -1,180 +0,0 @@
-/*
- *  Copyright 2008 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 <memory>
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/gunit.h"
-#include "webrtc/rtc_base/optionsfile.h"
-#include "webrtc/test/testsupport/fileutils.h"
-
-namespace rtc {
-
-static const std::string kTestOptionA = "test-option-a";
-static const std::string kTestOptionB = "test-option-b";
-static const std::string kTestString1 = "a string";
-static const std::string kTestString2 = "different string";
-static const std::string kOptionWithEquals = "foo=bar";
-static const std::string kOptionWithNewline = "foo\nbar";
-static const std::string kValueWithEquals = "baz=quux";
-static const std::string kValueWithNewline = "baz\nquux";
-static const std::string kEmptyString = "";
-static const char kOptionWithUtf8[] = {'O', 'p', 't', '\302', '\256', 'i', 'o',
-    'n', '\342', '\204', '\242', '\0'};  // Opt(R)io(TM).
-static const char kValueWithUtf8[] = {'V', 'a', 'l', '\302', '\256', 'v', 'e',
-    '\342', '\204', '\242', '\0'};  // Val(R)ue(TM).
-static int kTestInt1 = 12345;
-static int kTestInt2 = 67890;
-static int kNegInt = -634;
-static int kZero = 0;
-
-#if defined (WEBRTC_ANDROID)
-// Fails on Android: https://bugs.chromium.org/p/webrtc/issues/detail?id=4364.
-#define MAYBE_OptionsFileTest DISABLED_OptionsFileTest
-#else
-#define MAYBE_OptionsFileTest OptionsFileTest
-#endif
-
-class MAYBE_OptionsFileTest : public testing::Test {
- public:
-  MAYBE_OptionsFileTest() {
-    test_file_ =
-        webrtc::test::TempFilename(webrtc::test::OutputPath(), ".testfile");
-    OpenStore();
-  }
-
-  ~MAYBE_OptionsFileTest() override {
-    webrtc::test::RemoveFile(test_file_);
-  }
-
- protected:
-  void OpenStore() {
-    store_.reset(new OptionsFile(test_file_));
-  }
-
-  std::unique_ptr<OptionsFile> store_;
-
- private:
-  std::string test_file_;
-};
-
-TEST_F(MAYBE_OptionsFileTest, GetSetString) {
-  // Clear contents of the file on disk.
-  EXPECT_TRUE(store_->Save());
-  std::string out1, out2;
-  EXPECT_FALSE(store_->GetStringValue(kTestOptionA, &out1));
-  EXPECT_FALSE(store_->GetStringValue(kTestOptionB, &out2));
-  EXPECT_TRUE(store_->SetStringValue(kTestOptionA, kTestString1));
-  EXPECT_TRUE(store_->Save());
-  EXPECT_TRUE(store_->Load());
-  EXPECT_TRUE(store_->SetStringValue(kTestOptionB, kTestString2));
-  EXPECT_TRUE(store_->Save());
-  EXPECT_TRUE(store_->Load());
-  EXPECT_TRUE(store_->GetStringValue(kTestOptionA, &out1));
-  EXPECT_TRUE(store_->GetStringValue(kTestOptionB, &out2));
-  EXPECT_EQ(kTestString1, out1);
-  EXPECT_EQ(kTestString2, out2);
-  EXPECT_TRUE(store_->RemoveValue(kTestOptionA));
-  EXPECT_TRUE(store_->Save());
-  EXPECT_TRUE(store_->Load());
-  EXPECT_TRUE(store_->RemoveValue(kTestOptionB));
-  EXPECT_TRUE(store_->Save());
-  EXPECT_TRUE(store_->Load());
-  EXPECT_FALSE(store_->GetStringValue(kTestOptionA, &out1));
-  EXPECT_FALSE(store_->GetStringValue(kTestOptionB, &out2));
-}
-
-TEST_F(MAYBE_OptionsFileTest, GetSetInt) {
-  // Clear contents of the file on disk.
-  EXPECT_TRUE(store_->Save());
-  int out1, out2;
-  EXPECT_FALSE(store_->GetIntValue(kTestOptionA, &out1));
-  EXPECT_FALSE(store_->GetIntValue(kTestOptionB, &out2));
-  EXPECT_TRUE(store_->SetIntValue(kTestOptionA, kTestInt1));
-  EXPECT_TRUE(store_->Save());
-  EXPECT_TRUE(store_->Load());
-  EXPECT_TRUE(store_->SetIntValue(kTestOptionB, kTestInt2));
-  EXPECT_TRUE(store_->Save());
-  EXPECT_TRUE(store_->Load());
-  EXPECT_TRUE(store_->GetIntValue(kTestOptionA, &out1));
-  EXPECT_TRUE(store_->GetIntValue(kTestOptionB, &out2));
-  EXPECT_EQ(kTestInt1, out1);
-  EXPECT_EQ(kTestInt2, out2);
-  EXPECT_TRUE(store_->RemoveValue(kTestOptionA));
-  EXPECT_TRUE(store_->Save());
-  EXPECT_TRUE(store_->Load());
-  EXPECT_TRUE(store_->RemoveValue(kTestOptionB));
-  EXPECT_TRUE(store_->Save());
-  EXPECT_TRUE(store_->Load());
-  EXPECT_FALSE(store_->GetIntValue(kTestOptionA, &out1));
-  EXPECT_FALSE(store_->GetIntValue(kTestOptionB, &out2));
-  EXPECT_TRUE(store_->SetIntValue(kTestOptionA, kNegInt));
-  EXPECT_TRUE(store_->GetIntValue(kTestOptionA, &out1));
-  EXPECT_EQ(kNegInt, out1);
-  EXPECT_TRUE(store_->SetIntValue(kTestOptionA, kZero));
-  EXPECT_TRUE(store_->GetIntValue(kTestOptionA, &out1));
-  EXPECT_EQ(kZero, out1);
-}
-
-TEST_F(MAYBE_OptionsFileTest, Persist) {
-  // Clear contents of the file on disk.
-  EXPECT_TRUE(store_->Save());
-  EXPECT_TRUE(store_->SetStringValue(kTestOptionA, kTestString1));
-  EXPECT_TRUE(store_->SetIntValue(kTestOptionB, kNegInt));
-  EXPECT_TRUE(store_->Save());
-
-  // Load the saved contents from above.
-  OpenStore();
-  EXPECT_TRUE(store_->Load());
-  std::string out1;
-  int out2;
-  EXPECT_TRUE(store_->GetStringValue(kTestOptionA, &out1));
-  EXPECT_TRUE(store_->GetIntValue(kTestOptionB, &out2));
-  EXPECT_EQ(kTestString1, out1);
-  EXPECT_EQ(kNegInt, out2);
-}
-
-TEST_F(MAYBE_OptionsFileTest, SpecialCharacters) {
-  // Clear contents of the file on disk.
-  EXPECT_TRUE(store_->Save());
-  std::string out;
-  EXPECT_FALSE(store_->SetStringValue(kOptionWithEquals, kTestString1));
-  EXPECT_FALSE(store_->GetStringValue(kOptionWithEquals, &out));
-  EXPECT_FALSE(store_->SetStringValue(kOptionWithNewline, kTestString1));
-  EXPECT_FALSE(store_->GetStringValue(kOptionWithNewline, &out));
-  EXPECT_TRUE(store_->SetStringValue(kOptionWithUtf8, kValueWithUtf8));
-  EXPECT_TRUE(store_->SetStringValue(kTestOptionA, kTestString1));
-  EXPECT_TRUE(store_->Save());
-  EXPECT_TRUE(store_->Load());
-  EXPECT_TRUE(store_->GetStringValue(kTestOptionA, &out));
-  EXPECT_EQ(kTestString1, out);
-  EXPECT_TRUE(store_->GetStringValue(kOptionWithUtf8, &out));
-  EXPECT_EQ(kValueWithUtf8, out);
-  EXPECT_FALSE(store_->SetStringValue(kTestOptionA, kValueWithNewline));
-  EXPECT_TRUE(store_->GetStringValue(kTestOptionA, &out));
-  EXPECT_EQ(kTestString1, out);
-  EXPECT_TRUE(store_->SetStringValue(kTestOptionA, kValueWithEquals));
-  EXPECT_TRUE(store_->Save());
-  EXPECT_TRUE(store_->Load());
-  EXPECT_TRUE(store_->GetStringValue(kTestOptionA, &out));
-  EXPECT_EQ(kValueWithEquals, out);
-  EXPECT_TRUE(store_->SetStringValue(kEmptyString, kTestString2));
-  EXPECT_TRUE(store_->Save());
-  EXPECT_TRUE(store_->Load());
-  EXPECT_TRUE(store_->GetStringValue(kEmptyString, &out));
-  EXPECT_EQ(kTestString2, out);
-  EXPECT_TRUE(store_->SetStringValue(kTestOptionB, kEmptyString));
-  EXPECT_TRUE(store_->Save());
-  EXPECT_TRUE(store_->Load());
-  EXPECT_TRUE(store_->GetStringValue(kTestOptionB, &out));
-  EXPECT_EQ(kEmptyString, out);
-}
-
-}  // namespace rtc
diff --git a/rtc_base/pathutils.cc b/rtc_base/pathutils.cc
deleted file mode 100644
index 0ce052e..0000000
--- a/rtc_base/pathutils.cc
+++ /dev/null
@@ -1,189 +0,0 @@
-/*
- *  Copyright 2004 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.
- */
-
-#if defined(WEBRTC_WIN)
-#include "webrtc/rtc_base/win32.h"
-#include <shellapi.h>
-#include <shlobj.h>
-#include <tchar.h>
-#endif  // WEBRTC_WIN
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/pathutils.h"
-#include "webrtc/rtc_base/stringutils.h"
-
-namespace rtc {
-
-static const char EMPTY_STR[] = "";
-
-// EXT_DELIM separates a file basename from extension
-const char EXT_DELIM = '.';
-
-// FOLDER_DELIMS separate folder segments and the filename
-const char* const FOLDER_DELIMS = "/\\";
-
-// DEFAULT_FOLDER_DELIM is the preferred delimiter for this platform
-#ifdef WEBRTC_WIN
-const char DEFAULT_FOLDER_DELIM = '\\';
-#else  // !WEBRTC_WIN
-const char DEFAULT_FOLDER_DELIM = '/';
-#endif  // !WEBRTC_WIN
-
-///////////////////////////////////////////////////////////////////////////////
-// Pathname - parsing of pathnames into components, and vice versa
-///////////////////////////////////////////////////////////////////////////////
-
-bool Pathname::IsFolderDelimiter(char ch) {
-  return (nullptr != ::strchr(FOLDER_DELIMS, ch));
-}
-
-char Pathname::DefaultFolderDelimiter() {
-  return DEFAULT_FOLDER_DELIM;
-}
-
-Pathname::Pathname()
-    : folder_delimiter_(DEFAULT_FOLDER_DELIM) {
-}
-
-Pathname::Pathname(const Pathname&) = default;
-Pathname::Pathname(Pathname&&) = default;
-
-Pathname::Pathname(const std::string& pathname)
-    : folder_delimiter_(DEFAULT_FOLDER_DELIM) {
-  SetPathname(pathname);
-}
-
-Pathname::Pathname(const std::string& folder, const std::string& filename)
-    : folder_delimiter_(DEFAULT_FOLDER_DELIM) {
-  SetPathname(folder, filename);
-}
-
-Pathname& Pathname::operator=(const Pathname&) = default;
-Pathname& Pathname::operator=(Pathname&&) = default;
-
-void Pathname::Normalize() {
-  for (size_t i=0; i<folder_.length(); ++i) {
-    if (IsFolderDelimiter(folder_[i])) {
-      folder_[i] = folder_delimiter_;
-    }
-  }
-}
-
-void Pathname::clear() {
-  folder_.clear();
-  basename_.clear();
-  extension_.clear();
-}
-
-bool Pathname::empty() const {
-  return folder_.empty() && basename_.empty() && extension_.empty();
-}
-
-std::string Pathname::pathname() const {
-  std::string pathname(folder_);
-  pathname.append(basename_);
-  pathname.append(extension_);
-  if (pathname.empty()) {
-    // Instead of the empty pathname, return the current working directory.
-    pathname.push_back('.');
-    pathname.push_back(folder_delimiter_);
-  }
-  return pathname;
-}
-
-void Pathname::SetPathname(const std::string& pathname) {
-  std::string::size_type pos = pathname.find_last_of(FOLDER_DELIMS);
-  if (pos != std::string::npos) {
-    SetFolder(pathname.substr(0, pos + 1));
-    SetFilename(pathname.substr(pos + 1));
-  } else {
-    SetFolder(EMPTY_STR);
-    SetFilename(pathname);
-  }
-}
-
-void Pathname::SetPathname(const std::string& folder,
-                           const std::string& filename) {
-  SetFolder(folder);
-  SetFilename(filename);
-}
-
-std::string Pathname::folder() const {
-  return folder_;
-}
-
-std::string Pathname::parent_folder() const {
-  std::string::size_type pos = std::string::npos;
-  if (folder_.size() >= 2) {
-    pos = folder_.find_last_of(FOLDER_DELIMS, folder_.length() - 2);
-  }
-  if (pos != std::string::npos) {
-    return folder_.substr(0, pos + 1);
-  } else {
-    return EMPTY_STR;
-  }
-}
-
-void Pathname::SetFolder(const std::string& folder) {
-  folder_.assign(folder);
-  // Ensure folder ends in a path delimiter
-  if (!folder_.empty() && !IsFolderDelimiter(folder_[folder_.length()-1])) {
-    folder_.push_back(folder_delimiter_);
-  }
-}
-
-void Pathname::AppendFolder(const std::string& folder) {
-  folder_.append(folder);
-  // Ensure folder ends in a path delimiter
-  if (!folder_.empty() && !IsFolderDelimiter(folder_[folder_.length()-1])) {
-    folder_.push_back(folder_delimiter_);
-  }
-}
-
-bool Pathname::SetBasename(const std::string& basename) {
-  if(basename.find_first_of(FOLDER_DELIMS) != std::string::npos) {
-    return false;
-  }
-  basename_.assign(basename);
-  return true;
-}
-
-bool Pathname::SetExtension(const std::string& extension) {
-  if (extension.find_first_of(FOLDER_DELIMS) != std::string::npos ||
-    extension.find_first_of(EXT_DELIM, 1) != std::string::npos) {
-      return false;
-  }
-  extension_.assign(extension);
-  // Ensure extension begins with the extension delimiter
-  if (!extension_.empty() && (extension_[0] != EXT_DELIM)) {
-    extension_.insert(extension_.begin(), EXT_DELIM);
-  }
-  return true;
-}
-
-std::string Pathname::filename() const {
-  std::string filename(basename_);
-  filename.append(extension_);
-  return filename;
-}
-
-bool Pathname::SetFilename(const std::string& filename) {
-  std::string::size_type pos = filename.rfind(EXT_DELIM);
-  if ((pos == std::string::npos) || (pos == 0)) {
-    return SetExtension(EMPTY_STR) && SetBasename(filename);
-  } else {
-    return SetExtension(filename.substr(pos)) && SetBasename(filename.substr(0, pos));
-  }
-}
-
-///////////////////////////////////////////////////////////////////////////////
-
-} // namespace rtc
diff --git a/rtc_base/pathutils.h b/rtc_base/pathutils.h
deleted file mode 100644
index bce5add..0000000
--- a/rtc_base/pathutils.h
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- *  Copyright 2004 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_RTC_BASE_PATHUTILS_H_
-#define WEBRTC_RTC_BASE_PATHUTILS_H_
-
-#include <string>
-
-#include "webrtc/rtc_base/checks.h"
-
-namespace rtc {
-
-///////////////////////////////////////////////////////////////////////////////
-// Pathname - parsing of pathnames into components, and vice versa.
-//
-// To establish consistent terminology, a filename never contains a folder
-// component.  A folder never contains a filename.  A pathname may include
-// a folder and/or filename component.  Here are some examples:
-//
-//   pathname()      /home/john/example.txt
-//   folder()        /home/john/
-//   filename()                 example.txt
-//   parent_folder() /home/
-//   folder_name()         john/
-//   basename()                 example
-//   extension()                       .txt
-//
-// Basename may begin, end, and/or include periods, but no folder delimiters.
-// If extension exists, it consists of a period followed by zero or more
-// non-period/non-delimiter characters, and basename is non-empty.
-///////////////////////////////////////////////////////////////////////////////
-
-class Pathname {
-public:
-  // Folder delimiters are slash and backslash
-  static bool IsFolderDelimiter(char ch);
-  static char DefaultFolderDelimiter();
-
-  Pathname();
-  Pathname(const Pathname&);
-  Pathname(Pathname&&);
-  Pathname(const std::string& pathname);
-  Pathname(const std::string& folder, const std::string& filename);
-
-  Pathname& operator=(const Pathname&);
-  Pathname& operator=(Pathname&&);
-
-  // Normalize changes all folder delimiters to folder_delimiter()
-  void Normalize();
-
-  // Reset to the empty pathname
-  void clear();
-
-  // Returns true if the pathname is empty.  Note: this->pathname().empty()
-  // is always false.
-  bool empty() const;
-
-  // Returns the folder and filename components.  If the pathname is empty,
-  // returns a string representing the current directory (as a relative path,
-  // i.e., ".").
-  std::string pathname() const;
-  void SetPathname(const std::string& pathname);
-  void SetPathname(const std::string& folder, const std::string& filename);
-
-  std::string folder() const;
-  std::string parent_folder() const;
-  // SetFolder and AppendFolder will append a folder delimiter, if needed.
-  void SetFolder(const std::string& folder);
-  void AppendFolder(const std::string& folder);
-
-  bool SetBasename(const std::string& basename);
-
-  // SetExtension will prefix a period, if needed.
-  bool SetExtension(const std::string& extension);
-
-  std::string filename() const;
-  bool SetFilename(const std::string& filename);
-
-private:
-  std::string folder_, basename_, extension_;
-  char folder_delimiter_;
-};
-
-}  // namespace rtc
-
-#endif // WEBRTC_RTC_BASE_PATHUTILS_H_
diff --git a/rtc_base/pathutils_unittest.cc b/rtc_base/pathutils_unittest.cc
deleted file mode 100644
index 390ae8a..0000000
--- a/rtc_base/pathutils_unittest.cc
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- *  Copyright 2007 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/rtc_base/pathutils.h"
-#include "webrtc/rtc_base/gunit.h"
-
-TEST(Pathname, ReturnsDotForEmptyPathname) {
-  const std::string kCWD =
-      std::string(".") + rtc::Pathname::DefaultFolderDelimiter();
-
-  rtc::Pathname path("/", "");
-  EXPECT_FALSE(path.empty());
-  EXPECT_FALSE(path.folder().empty());
-  EXPECT_TRUE (path.filename().empty());
-  EXPECT_FALSE(path.pathname().empty());
-  EXPECT_EQ(std::string("/"), path.pathname());
-
-  path.SetPathname("", "foo");
-  EXPECT_FALSE(path.empty());
-  EXPECT_TRUE (path.folder().empty());
-  EXPECT_FALSE(path.filename().empty());
-  EXPECT_FALSE(path.pathname().empty());
-  EXPECT_EQ(std::string("foo"), path.pathname());
-
-  path.SetPathname("", "");
-  EXPECT_TRUE (path.empty());
-  EXPECT_TRUE (path.folder().empty());
-  EXPECT_TRUE (path.filename().empty());
-  EXPECT_FALSE(path.pathname().empty());
-  EXPECT_EQ(kCWD, path.pathname());
-
-  path.SetPathname(kCWD, "");
-  EXPECT_FALSE(path.empty());
-  EXPECT_FALSE(path.folder().empty());
-  EXPECT_TRUE (path.filename().empty());
-  EXPECT_FALSE(path.pathname().empty());
-  EXPECT_EQ(kCWD, path.pathname());
-}
diff --git a/rtc_base/physicalsocketserver.cc b/rtc_base/physicalsocketserver.cc
deleted file mode 100644
index 8c6c7dd..0000000
--- a/rtc_base/physicalsocketserver.cc
+++ /dev/null
@@ -1,1996 +0,0 @@
-/*
- *  Copyright 2004 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/rtc_base/physicalsocketserver.h"
-
-#if defined(_MSC_VER) && _MSC_VER < 1300
-#pragma warning(disable:4786)
-#endif
-
-#ifdef MEMORY_SANITIZER
-#include <sanitizer/msan_interface.h>
-#endif
-
-#if defined(WEBRTC_POSIX)
-#include <string.h>
-#include <errno.h>
-#include <fcntl.h>
-#if defined(WEBRTC_USE_EPOLL)
-// "poll" will be used to wait for the signal dispatcher.
-#include <poll.h>
-#endif
-#include <sys/ioctl.h>
-#include <sys/time.h>
-#include <sys/select.h>
-#include <unistd.h>
-#include <signal.h>
-#endif
-
-#if defined(WEBRTC_WIN)
-#define WIN32_LEAN_AND_MEAN
-#include <windows.h>
-#include <winsock2.h>
-#include <ws2tcpip.h>
-#undef SetPort
-#endif
-
-#include <algorithm>
-#include <map>
-
-#include "webrtc/rtc_base/arraysize.h"
-#include "webrtc/rtc_base/basictypes.h"
-#include "webrtc/rtc_base/byteorder.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/networkmonitor.h"
-#include "webrtc/rtc_base/nullsocketserver.h"
-#include "webrtc/rtc_base/timeutils.h"
-#include "webrtc/rtc_base/win32socketinit.h"
-
-#if defined(WEBRTC_POSIX)
-#include <netinet/tcp.h>  // for TCP_NODELAY
-#define IP_MTU 14 // Until this is integrated from linux/in.h to netinet/in.h
-typedef void* SockOptArg;
-
-#endif  // WEBRTC_POSIX
-
-#if defined(WEBRTC_POSIX) && !defined(WEBRTC_MAC) && !defined(__native_client__)
-
-int64_t GetSocketRecvTimestamp(int socket) {
-  struct timeval tv_ioctl;
-  int ret = ioctl(socket, SIOCGSTAMP, &tv_ioctl);
-  if (ret != 0)
-    return -1;
-  int64_t timestamp =
-      rtc::kNumMicrosecsPerSec * static_cast<int64_t>(tv_ioctl.tv_sec) +
-      static_cast<int64_t>(tv_ioctl.tv_usec);
-  return timestamp;
-}
-
-#else
-
-int64_t GetSocketRecvTimestamp(int socket) {
-  return -1;
-}
-#endif
-
-#if defined(WEBRTC_WIN)
-typedef char* SockOptArg;
-#endif
-
-#if defined(WEBRTC_USE_EPOLL)
-// POLLRDHUP / EPOLLRDHUP are only defined starting with Linux 2.6.17.
-#if !defined(POLLRDHUP)
-#define POLLRDHUP 0x2000
-#endif
-#if !defined(EPOLLRDHUP)
-#define EPOLLRDHUP 0x2000
-#endif
-#endif
-
-namespace rtc {
-
-std::unique_ptr<SocketServer> SocketServer::CreateDefault() {
-#if defined(__native_client__)
-  return std::unique_ptr<SocketServer>(new rtc::NullSocketServer);
-#else
-  return std::unique_ptr<SocketServer>(new rtc::PhysicalSocketServer);
-#endif
-}
-
-#if defined(WEBRTC_WIN)
-// Standard MTUs, from RFC 1191
-const uint16_t PACKET_MAXIMUMS[] = {
-    65535,  // Theoretical maximum, Hyperchannel
-    32000,  // Nothing
-    17914,  // 16Mb IBM Token Ring
-    8166,   // IEEE 802.4
-    // 4464,   // IEEE 802.5 (4Mb max)
-    4352,   // FDDI
-    // 2048,   // Wideband Network
-    2002,   // IEEE 802.5 (4Mb recommended)
-    // 1536,   // Expermental Ethernet Networks
-    // 1500,   // Ethernet, Point-to-Point (default)
-    1492,   // IEEE 802.3
-    1006,   // SLIP, ARPANET
-    // 576,    // X.25 Networks
-    // 544,    // DEC IP Portal
-    // 512,    // NETBIOS
-    508,    // IEEE 802/Source-Rt Bridge, ARCNET
-    296,    // Point-to-Point (low delay)
-    68,     // Official minimum
-    0,      // End of list marker
-};
-
-static const int IP_HEADER_SIZE = 20u;
-static const int IPV6_HEADER_SIZE = 40u;
-static const int ICMP_HEADER_SIZE = 8u;
-static const int ICMP_PING_TIMEOUT_MILLIS = 10000u;
-#endif
-
-PhysicalSocket::PhysicalSocket(PhysicalSocketServer* ss, SOCKET s)
-  : ss_(ss), s_(s), error_(0),
-    state_((s == INVALID_SOCKET) ? CS_CLOSED : CS_CONNECTED),
-    resolver_(nullptr) {
-#if defined(WEBRTC_WIN)
-  // EnsureWinsockInit() ensures that winsock is initialized. The default
-  // version of this function doesn't do anything because winsock is
-  // initialized by constructor of a static object. If neccessary libjingle
-  // users can link it with a different version of this function by replacing
-  // win32socketinit.cc. See win32socketinit.cc for more details.
-  EnsureWinsockInit();
-#endif
-  if (s_ != INVALID_SOCKET) {
-    SetEnabledEvents(DE_READ | DE_WRITE);
-
-    int type = SOCK_STREAM;
-    socklen_t len = sizeof(type);
-    const int res =
-        getsockopt(s_, SOL_SOCKET, SO_TYPE, (SockOptArg)&type, &len);
-    RTC_DCHECK_EQ(0, res);
-    udp_ = (SOCK_DGRAM == type);
-  }
-}
-
-PhysicalSocket::~PhysicalSocket() {
-  Close();
-}
-
-bool PhysicalSocket::Create(int family, int type) {
-  Close();
-  s_ = ::socket(family, type, 0);
-  udp_ = (SOCK_DGRAM == type);
-  UpdateLastError();
-  if (udp_) {
-    SetEnabledEvents(DE_READ | DE_WRITE);
-  }
-  return s_ != INVALID_SOCKET;
-}
-
-SocketAddress PhysicalSocket::GetLocalAddress() const {
-  sockaddr_storage addr_storage = {0};
-  socklen_t addrlen = sizeof(addr_storage);
-  sockaddr* addr = reinterpret_cast<sockaddr*>(&addr_storage);
-  int result = ::getsockname(s_, addr, &addrlen);
-  SocketAddress address;
-  if (result >= 0) {
-    SocketAddressFromSockAddrStorage(addr_storage, &address);
-  } else {
-    LOG(LS_WARNING) << "GetLocalAddress: unable to get local addr, socket="
-                    << s_;
-  }
-  return address;
-}
-
-SocketAddress PhysicalSocket::GetRemoteAddress() const {
-  sockaddr_storage addr_storage = {0};
-  socklen_t addrlen = sizeof(addr_storage);
-  sockaddr* addr = reinterpret_cast<sockaddr*>(&addr_storage);
-  int result = ::getpeername(s_, addr, &addrlen);
-  SocketAddress address;
-  if (result >= 0) {
-    SocketAddressFromSockAddrStorage(addr_storage, &address);
-  } else {
-    LOG(LS_WARNING) << "GetRemoteAddress: unable to get remote addr, socket="
-                    << s_;
-  }
-  return address;
-}
-
-int PhysicalSocket::Bind(const SocketAddress& bind_addr) {
-  SocketAddress copied_bind_addr = bind_addr;
-  // If a network binder is available, use it to bind a socket to an interface
-  // instead of bind(), since this is more reliable on an OS with a weak host
-  // model.
-  if (ss_->network_binder() && !bind_addr.IsAnyIP()) {
-    NetworkBindingResult result =
-        ss_->network_binder()->BindSocketToNetwork(s_, bind_addr.ipaddr());
-    if (result == NetworkBindingResult::SUCCESS) {
-      // Since the network binder handled binding the socket to the desired
-      // network interface, we don't need to (and shouldn't) include an IP in
-      // the bind() call; bind() just needs to assign a port.
-      copied_bind_addr.SetIP(GetAnyIP(copied_bind_addr.ipaddr().family()));
-    } else if (result == NetworkBindingResult::NOT_IMPLEMENTED) {
-      LOG(LS_INFO) << "Can't bind socket to network because "
-                      "network binding is not implemented for this OS.";
-    } else {
-      if (bind_addr.IsLoopbackIP()) {
-        // If we couldn't bind to a loopback IP (which should only happen in
-        // test scenarios), continue on. This may be expected behavior.
-        LOG(LS_VERBOSE) << "Binding socket to loopback address "
-                        << bind_addr.ipaddr().ToString()
-                        << " failed; result: " << static_cast<int>(result);
-      } else {
-        LOG(LS_WARNING) << "Binding socket to network address "
-                        << bind_addr.ipaddr().ToString()
-                        << " failed; result: " << static_cast<int>(result);
-        // If a network binding was attempted and failed, we should stop here
-        // and not try to use the socket. Otherwise, we may end up sending
-        // packets with an invalid source address.
-        // See: https://bugs.chromium.org/p/webrtc/issues/detail?id=7026
-        return -1;
-      }
-    }
-  }
-  sockaddr_storage addr_storage;
-  size_t len = copied_bind_addr.ToSockAddrStorage(&addr_storage);
-  sockaddr* addr = reinterpret_cast<sockaddr*>(&addr_storage);
-  int err = ::bind(s_, addr, static_cast<int>(len));
-  UpdateLastError();
-#if !defined(NDEBUG)
-  if (0 == err) {
-    dbg_addr_ = "Bound @ ";
-    dbg_addr_.append(GetLocalAddress().ToString());
-  }
-#endif
-  return err;
-}
-
-int PhysicalSocket::Connect(const SocketAddress& addr) {
-  // TODO(pthatcher): Implicit creation is required to reconnect...
-  // ...but should we make it more explicit?
-  if (state_ != CS_CLOSED) {
-    SetError(EALREADY);
-    return SOCKET_ERROR;
-  }
-  if (addr.IsUnresolvedIP()) {
-    LOG(LS_VERBOSE) << "Resolving addr in PhysicalSocket::Connect";
-    resolver_ = new AsyncResolver();
-    resolver_->SignalDone.connect(this, &PhysicalSocket::OnResolveResult);
-    resolver_->Start(addr);
-    state_ = CS_CONNECTING;
-    return 0;
-  }
-
-  return DoConnect(addr);
-}
-
-int PhysicalSocket::DoConnect(const SocketAddress& connect_addr) {
-  if ((s_ == INVALID_SOCKET) &&
-      !Create(connect_addr.family(), SOCK_STREAM)) {
-    return SOCKET_ERROR;
-  }
-  sockaddr_storage addr_storage;
-  size_t len = connect_addr.ToSockAddrStorage(&addr_storage);
-  sockaddr* addr = reinterpret_cast<sockaddr*>(&addr_storage);
-  int err = ::connect(s_, addr, static_cast<int>(len));
-  UpdateLastError();
-  uint8_t events = DE_READ | DE_WRITE;
-  if (err == 0) {
-    state_ = CS_CONNECTED;
-  } else if (IsBlockingError(GetError())) {
-    state_ = CS_CONNECTING;
-    events |= DE_CONNECT;
-  } else {
-    return SOCKET_ERROR;
-  }
-
-  EnableEvents(events);
-  return 0;
-}
-
-int PhysicalSocket::GetError() const {
-  CritScope cs(&crit_);
-  return error_;
-}
-
-void PhysicalSocket::SetError(int error) {
-  CritScope cs(&crit_);
-  error_ = error;
-}
-
-AsyncSocket::ConnState PhysicalSocket::GetState() const {
-  return state_;
-}
-
-int PhysicalSocket::GetOption(Option opt, int* value) {
-  int slevel;
-  int sopt;
-  if (TranslateOption(opt, &slevel, &sopt) == -1)
-    return -1;
-  socklen_t optlen = sizeof(*value);
-  int ret = ::getsockopt(s_, slevel, sopt, (SockOptArg)value, &optlen);
-  if (ret != -1 && opt == OPT_DONTFRAGMENT) {
-#if defined(WEBRTC_LINUX) && !defined(WEBRTC_ANDROID)
-    *value = (*value != IP_PMTUDISC_DONT) ? 1 : 0;
-#endif
-  }
-  return ret;
-}
-
-int PhysicalSocket::SetOption(Option opt, int value) {
-  int slevel;
-  int sopt;
-  if (TranslateOption(opt, &slevel, &sopt) == -1)
-    return -1;
-  if (opt == OPT_DONTFRAGMENT) {
-#if defined(WEBRTC_LINUX) && !defined(WEBRTC_ANDROID)
-    value = (value) ? IP_PMTUDISC_DO : IP_PMTUDISC_DONT;
-#endif
-  }
-  return ::setsockopt(s_, slevel, sopt, (SockOptArg)&value, sizeof(value));
-}
-
-int PhysicalSocket::Send(const void* pv, size_t cb) {
-  int sent = DoSend(s_, reinterpret_cast<const char *>(pv),
-      static_cast<int>(cb),
-#if defined(WEBRTC_LINUX) && !defined(WEBRTC_ANDROID)
-      // Suppress SIGPIPE. Without this, attempting to send on a socket whose
-      // other end is closed will result in a SIGPIPE signal being raised to
-      // our process, which by default will terminate the process, which we
-      // don't want. By specifying this flag, we'll just get the error EPIPE
-      // instead and can handle the error gracefully.
-      MSG_NOSIGNAL
-#else
-      0
-#endif
-      );
-  UpdateLastError();
-  MaybeRemapSendError();
-  // We have seen minidumps where this may be false.
-  RTC_DCHECK(sent <= static_cast<int>(cb));
-  if ((sent > 0 && sent < static_cast<int>(cb)) ||
-      (sent < 0 && IsBlockingError(GetError()))) {
-    EnableEvents(DE_WRITE);
-  }
-  return sent;
-}
-
-int PhysicalSocket::SendTo(const void* buffer,
-                           size_t length,
-                           const SocketAddress& addr) {
-  sockaddr_storage saddr;
-  size_t len = addr.ToSockAddrStorage(&saddr);
-  int sent = DoSendTo(
-      s_, static_cast<const char *>(buffer), static_cast<int>(length),
-#if defined(WEBRTC_LINUX) && !defined(WEBRTC_ANDROID)
-      // Suppress SIGPIPE. See above for explanation.
-      MSG_NOSIGNAL,
-#else
-      0,
-#endif
-      reinterpret_cast<sockaddr*>(&saddr), static_cast<int>(len));
-  UpdateLastError();
-  MaybeRemapSendError();
-  // We have seen minidumps where this may be false.
-  RTC_DCHECK(sent <= static_cast<int>(length));
-  if ((sent > 0 && sent < static_cast<int>(length)) ||
-      (sent < 0 && IsBlockingError(GetError()))) {
-    EnableEvents(DE_WRITE);
-  }
-  return sent;
-}
-
-int PhysicalSocket::Recv(void* buffer, size_t length, int64_t* timestamp) {
-  int received = ::recv(s_, static_cast<char*>(buffer),
-                        static_cast<int>(length), 0);
-  if ((received == 0) && (length != 0)) {
-    // Note: on graceful shutdown, recv can return 0.  In this case, we
-    // pretend it is blocking, and then signal close, so that simplifying
-    // assumptions can be made about Recv.
-    LOG(LS_WARNING) << "EOF from socket; deferring close event";
-    // Must turn this back on so that the select() loop will notice the close
-    // event.
-    EnableEvents(DE_READ);
-    SetError(EWOULDBLOCK);
-    return SOCKET_ERROR;
-  }
-  if (timestamp) {
-    *timestamp = GetSocketRecvTimestamp(s_);
-  }
-  UpdateLastError();
-  int error = GetError();
-  bool success = (received >= 0) || IsBlockingError(error);
-  if (udp_ || success) {
-    EnableEvents(DE_READ);
-  }
-  if (!success) {
-    LOG_F(LS_VERBOSE) << "Error = " << error;
-  }
-  return received;
-}
-
-int PhysicalSocket::RecvFrom(void* buffer,
-                             size_t length,
-                             SocketAddress* out_addr,
-                             int64_t* timestamp) {
-  sockaddr_storage addr_storage;
-  socklen_t addr_len = sizeof(addr_storage);
-  sockaddr* addr = reinterpret_cast<sockaddr*>(&addr_storage);
-  int received = ::recvfrom(s_, static_cast<char*>(buffer),
-                            static_cast<int>(length), 0, addr, &addr_len);
-  if (timestamp) {
-    *timestamp = GetSocketRecvTimestamp(s_);
-  }
-  UpdateLastError();
-  if ((received >= 0) && (out_addr != nullptr))
-    SocketAddressFromSockAddrStorage(addr_storage, out_addr);
-  int error = GetError();
-  bool success = (received >= 0) || IsBlockingError(error);
-  if (udp_ || success) {
-    EnableEvents(DE_READ);
-  }
-  if (!success) {
-    LOG_F(LS_VERBOSE) << "Error = " << error;
-  }
-  return received;
-}
-
-int PhysicalSocket::Listen(int backlog) {
-  int err = ::listen(s_, backlog);
-  UpdateLastError();
-  if (err == 0) {
-    state_ = CS_CONNECTING;
-    EnableEvents(DE_ACCEPT);
-#if !defined(NDEBUG)
-    dbg_addr_ = "Listening @ ";
-    dbg_addr_.append(GetLocalAddress().ToString());
-#endif
-  }
-  return err;
-}
-
-AsyncSocket* PhysicalSocket::Accept(SocketAddress* out_addr) {
-  // Always re-subscribe DE_ACCEPT to make sure new incoming connections will
-  // trigger an event even if DoAccept returns an error here.
-  EnableEvents(DE_ACCEPT);
-  sockaddr_storage addr_storage;
-  socklen_t addr_len = sizeof(addr_storage);
-  sockaddr* addr = reinterpret_cast<sockaddr*>(&addr_storage);
-  SOCKET s = DoAccept(s_, addr, &addr_len);
-  UpdateLastError();
-  if (s == INVALID_SOCKET)
-    return nullptr;
-  if (out_addr != nullptr)
-    SocketAddressFromSockAddrStorage(addr_storage, out_addr);
-  return ss_->WrapSocket(s);
-}
-
-int PhysicalSocket::Close() {
-  if (s_ == INVALID_SOCKET)
-    return 0;
-  int err = ::closesocket(s_);
-  UpdateLastError();
-  s_ = INVALID_SOCKET;
-  state_ = CS_CLOSED;
-  SetEnabledEvents(0);
-  if (resolver_) {
-    resolver_->Destroy(false);
-    resolver_ = nullptr;
-  }
-  return err;
-}
-
-SOCKET PhysicalSocket::DoAccept(SOCKET socket,
-                                sockaddr* addr,
-                                socklen_t* addrlen) {
-  return ::accept(socket, addr, addrlen);
-}
-
-int PhysicalSocket::DoSend(SOCKET socket, const char* buf, int len, int flags) {
-  return ::send(socket, buf, len, flags);
-}
-
-int PhysicalSocket::DoSendTo(SOCKET socket,
-                             const char* buf,
-                             int len,
-                             int flags,
-                             const struct sockaddr* dest_addr,
-                             socklen_t addrlen) {
-  return ::sendto(socket, buf, len, flags, dest_addr, addrlen);
-}
-
-void PhysicalSocket::OnResolveResult(AsyncResolverInterface* resolver) {
-  if (resolver != resolver_) {
-    return;
-  }
-
-  int error = resolver_->GetError();
-  if (error == 0) {
-    error = DoConnect(resolver_->address());
-  } else {
-    Close();
-  }
-
-  if (error) {
-    SetError(error);
-    SignalCloseEvent(this, error);
-  }
-}
-
-void PhysicalSocket::UpdateLastError() {
-  SetError(LAST_SYSTEM_ERROR);
-}
-
-void PhysicalSocket::MaybeRemapSendError() {
-#if defined(WEBRTC_MAC)
-  // https://developer.apple.com/library/mac/documentation/Darwin/
-  // Reference/ManPages/man2/sendto.2.html
-  // ENOBUFS - The output queue for a network interface is full.
-  // This generally indicates that the interface has stopped sending,
-  // but may be caused by transient congestion.
-  if (GetError() == ENOBUFS) {
-    SetError(EWOULDBLOCK);
-  }
-#endif
-}
-
-void PhysicalSocket::SetEnabledEvents(uint8_t events) {
-  enabled_events_ = events;
-}
-
-void PhysicalSocket::EnableEvents(uint8_t events) {
-  enabled_events_ |= events;
-}
-
-void PhysicalSocket::DisableEvents(uint8_t events) {
-  enabled_events_ &= ~events;
-}
-
-int PhysicalSocket::TranslateOption(Option opt, int* slevel, int* sopt) {
-  switch (opt) {
-    case OPT_DONTFRAGMENT:
-#if defined(WEBRTC_WIN)
-      *slevel = IPPROTO_IP;
-      *sopt = IP_DONTFRAGMENT;
-      break;
-#elif defined(WEBRTC_MAC) || defined(BSD) || defined(__native_client__)
-      LOG(LS_WARNING) << "Socket::OPT_DONTFRAGMENT not supported.";
-      return -1;
-#elif defined(WEBRTC_POSIX)
-      *slevel = IPPROTO_IP;
-      *sopt = IP_MTU_DISCOVER;
-      break;
-#endif
-    case OPT_RCVBUF:
-      *slevel = SOL_SOCKET;
-      *sopt = SO_RCVBUF;
-      break;
-    case OPT_SNDBUF:
-      *slevel = SOL_SOCKET;
-      *sopt = SO_SNDBUF;
-      break;
-    case OPT_NODELAY:
-      *slevel = IPPROTO_TCP;
-      *sopt = TCP_NODELAY;
-      break;
-    case OPT_DSCP:
-      LOG(LS_WARNING) << "Socket::OPT_DSCP not supported.";
-      return -1;
-    case OPT_RTP_SENDTIME_EXTN_ID:
-      return -1;  // No logging is necessary as this not a OS socket option.
-    default:
-      RTC_NOTREACHED();
-      return -1;
-  }
-  return 0;
-}
-
-SocketDispatcher::SocketDispatcher(PhysicalSocketServer *ss)
-#if defined(WEBRTC_WIN)
-  : PhysicalSocket(ss), id_(0), signal_close_(false)
-#else
-  : PhysicalSocket(ss)
-#endif
-{
-}
-
-SocketDispatcher::SocketDispatcher(SOCKET s, PhysicalSocketServer *ss)
-#if defined(WEBRTC_WIN)
-  : PhysicalSocket(ss, s), id_(0), signal_close_(false)
-#else
-  : PhysicalSocket(ss, s)
-#endif
-{
-}
-
-SocketDispatcher::~SocketDispatcher() {
-  Close();
-}
-
-bool SocketDispatcher::Initialize() {
-  RTC_DCHECK(s_ != INVALID_SOCKET);
-  // Must be a non-blocking
-#if defined(WEBRTC_WIN)
-  u_long argp = 1;
-  ioctlsocket(s_, FIONBIO, &argp);
-#elif defined(WEBRTC_POSIX)
-  fcntl(s_, F_SETFL, fcntl(s_, F_GETFL, 0) | O_NONBLOCK);
-#endif
-#if defined(WEBRTC_IOS)
-  // iOS may kill sockets when the app is moved to the background
-  // (specifically, if the app doesn't use the "voip" UIBackgroundMode). When
-  // we attempt to write to such a socket, SIGPIPE will be raised, which by
-  // default will terminate the process, which we don't want. By specifying
-  // this socket option, SIGPIPE will be disabled for the socket.
-  int value = 1;
-  ::setsockopt(s_, SOL_SOCKET, SO_NOSIGPIPE, &value, sizeof(value));
-#endif
-  ss_->Add(this);
-  return true;
-}
-
-bool SocketDispatcher::Create(int type) {
-  return Create(AF_INET, type);
-}
-
-bool SocketDispatcher::Create(int family, int type) {
-  // Change the socket to be non-blocking.
-  if (!PhysicalSocket::Create(family, type))
-    return false;
-
-  if (!Initialize())
-    return false;
-
-#if defined(WEBRTC_WIN)
-  do { id_ = ++next_id_; } while (id_ == 0);
-#endif
-  return true;
-}
-
-#if defined(WEBRTC_WIN)
-
-WSAEVENT SocketDispatcher::GetWSAEvent() {
-  return WSA_INVALID_EVENT;
-}
-
-SOCKET SocketDispatcher::GetSocket() {
-  return s_;
-}
-
-bool SocketDispatcher::CheckSignalClose() {
-  if (!signal_close_)
-    return false;
-
-  char ch;
-  if (recv(s_, &ch, 1, MSG_PEEK) > 0)
-    return false;
-
-  state_ = CS_CLOSED;
-  signal_close_ = false;
-  SignalCloseEvent(this, signal_err_);
-  return true;
-}
-
-int SocketDispatcher::next_id_ = 0;
-
-#elif defined(WEBRTC_POSIX)
-
-int SocketDispatcher::GetDescriptor() {
-  return s_;
-}
-
-bool SocketDispatcher::IsDescriptorClosed() {
-  if (udp_) {
-    // The MSG_PEEK trick doesn't work for UDP, since (at least in some
-    // circumstances) it requires reading an entire UDP packet, which would be
-    // bad for performance here. So, just check whether |s_| has been closed,
-    // which should be sufficient.
-    return s_ == INVALID_SOCKET;
-  }
-  // We don't have a reliable way of distinguishing end-of-stream
-  // from readability.  So test on each readable call.  Is this
-  // inefficient?  Probably.
-  char ch;
-  ssize_t res = ::recv(s_, &ch, 1, MSG_PEEK);
-  if (res > 0) {
-    // Data available, so not closed.
-    return false;
-  } else if (res == 0) {
-    // EOF, so closed.
-    return true;
-  } else {  // error
-    switch (errno) {
-      // Returned if we've already closed s_.
-      case EBADF:
-      // Returned during ungraceful peer shutdown.
-      case ECONNRESET:
-        return true;
-      // The normal blocking error; don't log anything.
-      case EWOULDBLOCK:
-      // Interrupted system call.
-      case EINTR:
-        return false;
-      default:
-        // Assume that all other errors are just blocking errors, meaning the
-        // connection is still good but we just can't read from it right now.
-        // This should only happen when connecting (and at most once), because
-        // in all other cases this function is only called if the file
-        // descriptor is already known to be in the readable state. However,
-        // it's not necessary a problem if we spuriously interpret a
-        // "connection lost"-type error as a blocking error, because typically
-        // the next recv() will get EOF, so we'll still eventually notice that
-        // the socket is closed.
-        LOG_ERR(LS_WARNING) << "Assuming benign blocking error";
-        return false;
-    }
-  }
-}
-
-#endif // WEBRTC_POSIX
-
-uint32_t SocketDispatcher::GetRequestedEvents() {
-  return enabled_events();
-}
-
-void SocketDispatcher::OnPreEvent(uint32_t ff) {
-  if ((ff & DE_CONNECT) != 0)
-    state_ = CS_CONNECTED;
-
-#if defined(WEBRTC_WIN)
-  // We set CS_CLOSED from CheckSignalClose.
-#elif defined(WEBRTC_POSIX)
-  if ((ff & DE_CLOSE) != 0)
-    state_ = CS_CLOSED;
-#endif
-}
-
-#if defined(WEBRTC_WIN)
-
-void SocketDispatcher::OnEvent(uint32_t ff, int err) {
-  int cache_id = id_;
-  // Make sure we deliver connect/accept first. Otherwise, consumers may see
-  // something like a READ followed by a CONNECT, which would be odd.
-  if (((ff & DE_CONNECT) != 0) && (id_ == cache_id)) {
-    if (ff != DE_CONNECT)
-      LOG(LS_VERBOSE) << "Signalled with DE_CONNECT: " << ff;
-    DisableEvents(DE_CONNECT);
-#if !defined(NDEBUG)
-    dbg_addr_ = "Connected @ ";
-    dbg_addr_.append(GetRemoteAddress().ToString());
-#endif
-    SignalConnectEvent(this);
-  }
-  if (((ff & DE_ACCEPT) != 0) && (id_ == cache_id)) {
-    DisableEvents(DE_ACCEPT);
-    SignalReadEvent(this);
-  }
-  if ((ff & DE_READ) != 0) {
-    DisableEvents(DE_READ);
-    SignalReadEvent(this);
-  }
-  if (((ff & DE_WRITE) != 0) && (id_ == cache_id)) {
-    DisableEvents(DE_WRITE);
-    SignalWriteEvent(this);
-  }
-  if (((ff & DE_CLOSE) != 0) && (id_ == cache_id)) {
-    signal_close_ = true;
-    signal_err_ = err;
-  }
-}
-
-#elif defined(WEBRTC_POSIX)
-
-void SocketDispatcher::OnEvent(uint32_t ff, int err) {
-#if defined(WEBRTC_USE_EPOLL)
-  // Remember currently enabled events so we can combine multiple changes
-  // into one update call later.
-  // The signal handlers might re-enable events disabled here, so we can't
-  // keep a list of events to disable at the end of the method. This list
-  // would not be updated with the events enabled by the signal handlers.
-  StartBatchedEventUpdates();
-#endif
-  // Make sure we deliver connect/accept first. Otherwise, consumers may see
-  // something like a READ followed by a CONNECT, which would be odd.
-  if ((ff & DE_CONNECT) != 0) {
-    DisableEvents(DE_CONNECT);
-    SignalConnectEvent(this);
-  }
-  if ((ff & DE_ACCEPT) != 0) {
-    DisableEvents(DE_ACCEPT);
-    SignalReadEvent(this);
-  }
-  if ((ff & DE_READ) != 0) {
-    DisableEvents(DE_READ);
-    SignalReadEvent(this);
-  }
-  if ((ff & DE_WRITE) != 0) {
-    DisableEvents(DE_WRITE);
-    SignalWriteEvent(this);
-  }
-  if ((ff & DE_CLOSE) != 0) {
-    // The socket is now dead to us, so stop checking it.
-    SetEnabledEvents(0);
-    SignalCloseEvent(this, err);
-  }
-#if defined(WEBRTC_USE_EPOLL)
-  FinishBatchedEventUpdates();
-#endif
-}
-
-#endif // WEBRTC_POSIX
-
-#if defined(WEBRTC_USE_EPOLL)
-
-static int GetEpollEvents(uint32_t ff) {
-  int events = 0;
-  if (ff & (DE_READ | DE_ACCEPT)) {
-    events |= EPOLLIN;
-  }
-  if (ff & (DE_WRITE | DE_CONNECT)) {
-    events |= EPOLLOUT;
-  }
-  return events;
-}
-
-void SocketDispatcher::StartBatchedEventUpdates() {
-  RTC_DCHECK_EQ(saved_enabled_events_, -1);
-  saved_enabled_events_ = enabled_events();
-}
-
-void SocketDispatcher::FinishBatchedEventUpdates() {
-  RTC_DCHECK_NE(saved_enabled_events_, -1);
-  uint8_t old_events = static_cast<uint8_t>(saved_enabled_events_);
-  saved_enabled_events_ = -1;
-  MaybeUpdateDispatcher(old_events);
-}
-
-void SocketDispatcher::MaybeUpdateDispatcher(uint8_t old_events) {
-  if (GetEpollEvents(enabled_events()) != GetEpollEvents(old_events) &&
-      saved_enabled_events_ == -1) {
-    ss_->Update(this);
-  }
-}
-
-void SocketDispatcher::SetEnabledEvents(uint8_t events) {
-  uint8_t old_events = enabled_events();
-  PhysicalSocket::SetEnabledEvents(events);
-  MaybeUpdateDispatcher(old_events);
-}
-
-void SocketDispatcher::EnableEvents(uint8_t events) {
-  uint8_t old_events = enabled_events();
-  PhysicalSocket::EnableEvents(events);
-  MaybeUpdateDispatcher(old_events);
-}
-
-void SocketDispatcher::DisableEvents(uint8_t events) {
-  uint8_t old_events = enabled_events();
-  PhysicalSocket::DisableEvents(events);
-  MaybeUpdateDispatcher(old_events);
-}
-
-#endif  // WEBRTC_USE_EPOLL
-
-int SocketDispatcher::Close() {
-  if (s_ == INVALID_SOCKET)
-    return 0;
-
-#if defined(WEBRTC_WIN)
-  id_ = 0;
-  signal_close_ = false;
-#endif
-  ss_->Remove(this);
-  return PhysicalSocket::Close();
-}
-
-#if defined(WEBRTC_POSIX)
-class EventDispatcher : public Dispatcher {
- public:
-  EventDispatcher(PhysicalSocketServer* ss) : ss_(ss), fSignaled_(false) {
-    if (pipe(afd_) < 0)
-      LOG(LERROR) << "pipe failed";
-    ss_->Add(this);
-  }
-
-  ~EventDispatcher() override {
-    ss_->Remove(this);
-    close(afd_[0]);
-    close(afd_[1]);
-  }
-
-  virtual void Signal() {
-    CritScope cs(&crit_);
-    if (!fSignaled_) {
-      const uint8_t b[1] = {0};
-      const ssize_t res = write(afd_[1], b, sizeof(b));
-      RTC_DCHECK_EQ(1, res);
-      fSignaled_ = true;
-    }
-  }
-
-  uint32_t GetRequestedEvents() override { return DE_READ; }
-
-  void OnPreEvent(uint32_t ff) override {
-    // It is not possible to perfectly emulate an auto-resetting event with
-    // pipes.  This simulates it by resetting before the event is handled.
-
-    CritScope cs(&crit_);
-    if (fSignaled_) {
-      uint8_t b[4];  // Allow for reading more than 1 byte, but expect 1.
-      const ssize_t res = read(afd_[0], b, sizeof(b));
-      RTC_DCHECK_EQ(1, res);
-      fSignaled_ = false;
-    }
-  }
-
-  void OnEvent(uint32_t ff, int err) override { RTC_NOTREACHED(); }
-
-  int GetDescriptor() override { return afd_[0]; }
-
-  bool IsDescriptorClosed() override { return false; }
-
- private:
-  PhysicalSocketServer *ss_;
-  int afd_[2];
-  bool fSignaled_;
-  CriticalSection crit_;
-};
-
-// These two classes use the self-pipe trick to deliver POSIX signals to our
-// select loop. This is the only safe, reliable, cross-platform way to do
-// non-trivial things with a POSIX signal in an event-driven program (until
-// proper pselect() implementations become ubiquitous).
-
-class PosixSignalHandler {
- public:
-  // POSIX only specifies 32 signals, but in principle the system might have
-  // more and the programmer might choose to use them, so we size our array
-  // for 128.
-  static const int kNumPosixSignals = 128;
-
-  // There is just a single global instance. (Signal handlers do not get any
-  // sort of user-defined void * parameter, so they can't access anything that
-  // isn't global.)
-  static PosixSignalHandler* Instance() {
-    RTC_DEFINE_STATIC_LOCAL(PosixSignalHandler, instance, ());
-    return &instance;
-  }
-
-  // Returns true if the given signal number is set.
-  bool IsSignalSet(int signum) const {
-    RTC_DCHECK(signum < static_cast<int>(arraysize(received_signal_)));
-    if (signum < static_cast<int>(arraysize(received_signal_))) {
-      return received_signal_[signum];
-    } else {
-      return false;
-    }
-  }
-
-  // Clears the given signal number.
-  void ClearSignal(int signum) {
-    RTC_DCHECK(signum < static_cast<int>(arraysize(received_signal_)));
-    if (signum < static_cast<int>(arraysize(received_signal_))) {
-      received_signal_[signum] = false;
-    }
-  }
-
-  // Returns the file descriptor to monitor for signal events.
-  int GetDescriptor() const {
-    return afd_[0];
-  }
-
-  // This is called directly from our real signal handler, so it must be
-  // signal-handler-safe. That means it cannot assume anything about the
-  // user-level state of the process, since the handler could be executed at any
-  // time on any thread.
-  void OnPosixSignalReceived(int signum) {
-    if (signum >= static_cast<int>(arraysize(received_signal_))) {
-      // We don't have space in our array for this.
-      return;
-    }
-    // Set a flag saying we've seen this signal.
-    received_signal_[signum] = true;
-    // Notify application code that we got a signal.
-    const uint8_t b[1] = {0};
-    if (-1 == write(afd_[1], b, sizeof(b))) {
-      // Nothing we can do here. If there's an error somehow then there's
-      // nothing we can safely do from a signal handler.
-      // No, we can't even safely log it.
-      // But, we still have to check the return value here. Otherwise,
-      // GCC 4.4.1 complains ignoring return value. Even (void) doesn't help.
-      return;
-    }
-  }
-
- private:
-  PosixSignalHandler() {
-    if (pipe(afd_) < 0) {
-      LOG_ERR(LS_ERROR) << "pipe failed";
-      return;
-    }
-    if (fcntl(afd_[0], F_SETFL, O_NONBLOCK) < 0) {
-      LOG_ERR(LS_WARNING) << "fcntl #1 failed";
-    }
-    if (fcntl(afd_[1], F_SETFL, O_NONBLOCK) < 0) {
-      LOG_ERR(LS_WARNING) << "fcntl #2 failed";
-    }
-    memset(const_cast<void *>(static_cast<volatile void *>(received_signal_)),
-           0,
-           sizeof(received_signal_));
-  }
-
-  ~PosixSignalHandler() {
-    int fd1 = afd_[0];
-    int fd2 = afd_[1];
-    // We clobber the stored file descriptor numbers here or else in principle
-    // a signal that happens to be delivered during application termination
-    // could erroneously write a zero byte to an unrelated file handle in
-    // OnPosixSignalReceived() if some other file happens to be opened later
-    // during shutdown and happens to be given the same file descriptor number
-    // as our pipe had. Unfortunately even with this precaution there is still a
-    // race where that could occur if said signal happens to be handled
-    // concurrently with this code and happens to have already read the value of
-    // afd_[1] from memory before we clobber it, but that's unlikely.
-    afd_[0] = -1;
-    afd_[1] = -1;
-    close(fd1);
-    close(fd2);
-  }
-
-  int afd_[2];
-  // These are boolean flags that will be set in our signal handler and read
-  // and cleared from Wait(). There is a race involved in this, but it is
-  // benign. The signal handler sets the flag before signaling the pipe, so
-  // we'll never end up blocking in select() while a flag is still true.
-  // However, if two of the same signal arrive close to each other then it's
-  // possible that the second time the handler may set the flag while it's still
-  // true, meaning that signal will be missed. But the first occurrence of it
-  // will still be handled, so this isn't a problem.
-  // Volatile is not necessary here for correctness, but this data _is_ volatile
-  // so I've marked it as such.
-  volatile uint8_t received_signal_[kNumPosixSignals];
-};
-
-class PosixSignalDispatcher : public Dispatcher {
- public:
-  PosixSignalDispatcher(PhysicalSocketServer *owner) : owner_(owner) {
-    owner_->Add(this);
-  }
-
-  ~PosixSignalDispatcher() override {
-    owner_->Remove(this);
-  }
-
-  uint32_t GetRequestedEvents() override { return DE_READ; }
-
-  void OnPreEvent(uint32_t ff) override {
-    // Events might get grouped if signals come very fast, so we read out up to
-    // 16 bytes to make sure we keep the pipe empty.
-    uint8_t b[16];
-    ssize_t ret = read(GetDescriptor(), b, sizeof(b));
-    if (ret < 0) {
-      LOG_ERR(LS_WARNING) << "Error in read()";
-    } else if (ret == 0) {
-      LOG(LS_WARNING) << "Should have read at least one byte";
-    }
-  }
-
-  void OnEvent(uint32_t ff, int err) override {
-    for (int signum = 0; signum < PosixSignalHandler::kNumPosixSignals;
-         ++signum) {
-      if (PosixSignalHandler::Instance()->IsSignalSet(signum)) {
-        PosixSignalHandler::Instance()->ClearSignal(signum);
-        HandlerMap::iterator i = handlers_.find(signum);
-        if (i == handlers_.end()) {
-          // This can happen if a signal is delivered to our process at around
-          // the same time as we unset our handler for it. It is not an error
-          // condition, but it's unusual enough to be worth logging.
-          LOG(LS_INFO) << "Received signal with no handler: " << signum;
-        } else {
-          // Otherwise, execute our handler.
-          (*i->second)(signum);
-        }
-      }
-    }
-  }
-
-  int GetDescriptor() override {
-    return PosixSignalHandler::Instance()->GetDescriptor();
-  }
-
-  bool IsDescriptorClosed() override { return false; }
-
-  void SetHandler(int signum, void (*handler)(int)) {
-    handlers_[signum] = handler;
-  }
-
-  void ClearHandler(int signum) {
-    handlers_.erase(signum);
-  }
-
-  bool HasHandlers() {
-    return !handlers_.empty();
-  }
-
- private:
-  typedef std::map<int, void (*)(int)> HandlerMap;
-
-  HandlerMap handlers_;
-  // Our owner.
-  PhysicalSocketServer *owner_;
-};
-
-#endif // WEBRTC_POSIX
-
-#if defined(WEBRTC_WIN)
-static uint32_t FlagsToEvents(uint32_t events) {
-  uint32_t ffFD = FD_CLOSE;
-  if (events & DE_READ)
-    ffFD |= FD_READ;
-  if (events & DE_WRITE)
-    ffFD |= FD_WRITE;
-  if (events & DE_CONNECT)
-    ffFD |= FD_CONNECT;
-  if (events & DE_ACCEPT)
-    ffFD |= FD_ACCEPT;
-  return ffFD;
-}
-
-class EventDispatcher : public Dispatcher {
- public:
-  EventDispatcher(PhysicalSocketServer *ss) : ss_(ss) {
-    hev_ = WSACreateEvent();
-    if (hev_) {
-      ss_->Add(this);
-    }
-  }
-
-  ~EventDispatcher() {
-    if (hev_ != nullptr) {
-      ss_->Remove(this);
-      WSACloseEvent(hev_);
-      hev_ = nullptr;
-    }
-  }
-
-  virtual void Signal() {
-    if (hev_ != nullptr)
-      WSASetEvent(hev_);
-  }
-
-  virtual uint32_t GetRequestedEvents() { return 0; }
-
-  virtual void OnPreEvent(uint32_t ff) { WSAResetEvent(hev_); }
-
-  virtual void OnEvent(uint32_t ff, int err) {}
-
-  virtual WSAEVENT GetWSAEvent() {
-    return hev_;
-  }
-
-  virtual SOCKET GetSocket() {
-    return INVALID_SOCKET;
-  }
-
-  virtual bool CheckSignalClose() { return false; }
-
-private:
-  PhysicalSocketServer* ss_;
-  WSAEVENT hev_;
-};
-#endif  // WEBRTC_WIN
-
-// Sets the value of a boolean value to false when signaled.
-class Signaler : public EventDispatcher {
- public:
-  Signaler(PhysicalSocketServer* ss, bool* pf)
-      : EventDispatcher(ss), pf_(pf) {
-  }
-  ~Signaler() override { }
-
-  void OnEvent(uint32_t ff, int err) override {
-    if (pf_)
-      *pf_ = false;
-  }
-
- private:
-  bool *pf_;
-};
-
-PhysicalSocketServer::PhysicalSocketServer()
-    : fWait_(false) {
-#if defined(WEBRTC_USE_EPOLL)
-  // Since Linux 2.6.8, the size argument is ignored, but must be greater than
-  // zero. Before that the size served as hint to the kernel for the amount of
-  // space to initially allocate in internal data structures.
-  epoll_fd_ = epoll_create(FD_SETSIZE);
-  if (epoll_fd_ == -1) {
-    // Not an error, will fall back to "select" below.
-    LOG_E(LS_WARNING, EN, errno) << "epoll_create";
-    epoll_fd_ = INVALID_SOCKET;
-  }
-#endif
-  signal_wakeup_ = new Signaler(this, &fWait_);
-#if defined(WEBRTC_WIN)
-  socket_ev_ = WSACreateEvent();
-#endif
-}
-
-PhysicalSocketServer::~PhysicalSocketServer() {
-#if defined(WEBRTC_WIN)
-  WSACloseEvent(socket_ev_);
-#endif
-#if defined(WEBRTC_POSIX)
-  signal_dispatcher_.reset();
-#endif
-  delete signal_wakeup_;
-#if defined(WEBRTC_USE_EPOLL)
-  if (epoll_fd_ != INVALID_SOCKET) {
-    close(epoll_fd_);
-  }
-#endif
-  RTC_DCHECK(dispatchers_.empty());
-}
-
-void PhysicalSocketServer::WakeUp() {
-  signal_wakeup_->Signal();
-}
-
-Socket* PhysicalSocketServer::CreateSocket(int type) {
-  return CreateSocket(AF_INET, type);
-}
-
-Socket* PhysicalSocketServer::CreateSocket(int family, int type) {
-  PhysicalSocket* socket = new PhysicalSocket(this);
-  if (socket->Create(family, type)) {
-    return socket;
-  } else {
-    delete socket;
-    return nullptr;
-  }
-}
-
-AsyncSocket* PhysicalSocketServer::CreateAsyncSocket(int type) {
-  return CreateAsyncSocket(AF_INET, type);
-}
-
-AsyncSocket* PhysicalSocketServer::CreateAsyncSocket(int family, int type) {
-  SocketDispatcher* dispatcher = new SocketDispatcher(this);
-  if (dispatcher->Create(family, type)) {
-    return dispatcher;
-  } else {
-    delete dispatcher;
-    return nullptr;
-  }
-}
-
-AsyncSocket* PhysicalSocketServer::WrapSocket(SOCKET s) {
-  SocketDispatcher* dispatcher = new SocketDispatcher(s, this);
-  if (dispatcher->Initialize()) {
-    return dispatcher;
-  } else {
-    delete dispatcher;
-    return nullptr;
-  }
-}
-
-void PhysicalSocketServer::Add(Dispatcher *pdispatcher) {
-  CritScope cs(&crit_);
-  if (processing_dispatchers_) {
-    // A dispatcher is being added while a "Wait" call is processing the
-    // list of socket events.
-    // Defer adding to "dispatchers_" set until processing is done to avoid
-    // invalidating the iterator in "Wait".
-    pending_remove_dispatchers_.erase(pdispatcher);
-    pending_add_dispatchers_.insert(pdispatcher);
-  } else {
-    dispatchers_.insert(pdispatcher);
-  }
-#if defined(WEBRTC_USE_EPOLL)
-  if (epoll_fd_ != INVALID_SOCKET) {
-    AddEpoll(pdispatcher);
-  }
-#endif  // WEBRTC_USE_EPOLL
-}
-
-void PhysicalSocketServer::Remove(Dispatcher *pdispatcher) {
-  CritScope cs(&crit_);
-  if (processing_dispatchers_) {
-    // A dispatcher is being removed while a "Wait" call is processing the
-    // list of socket events.
-    // Defer removal from "dispatchers_" set until processing is done to avoid
-    // invalidating the iterator in "Wait".
-    if (!pending_add_dispatchers_.erase(pdispatcher) &&
-        dispatchers_.find(pdispatcher) == dispatchers_.end()) {
-      LOG(LS_WARNING) << "PhysicalSocketServer asked to remove a unknown "
-                      << "dispatcher, potentially from a duplicate call to "
-                      << "Add.";
-      return;
-    }
-
-    pending_remove_dispatchers_.insert(pdispatcher);
-  } else if (!dispatchers_.erase(pdispatcher)) {
-    LOG(LS_WARNING) << "PhysicalSocketServer asked to remove a unknown "
-                    << "dispatcher, potentially from a duplicate call to Add.";
-    return;
-  }
-#if defined(WEBRTC_USE_EPOLL)
-  if (epoll_fd_ != INVALID_SOCKET) {
-    RemoveEpoll(pdispatcher);
-  }
-#endif  // WEBRTC_USE_EPOLL
-}
-
-void PhysicalSocketServer::Update(Dispatcher* pdispatcher) {
-#if defined(WEBRTC_USE_EPOLL)
-  if (epoll_fd_ == INVALID_SOCKET) {
-    return;
-  }
-
-  CritScope cs(&crit_);
-  if (dispatchers_.find(pdispatcher) == dispatchers_.end()) {
-    return;
-  }
-
-  UpdateEpoll(pdispatcher);
-#endif
-}
-
-void PhysicalSocketServer::AddRemovePendingDispatchers() {
-  if (!pending_add_dispatchers_.empty()) {
-    for (Dispatcher* pdispatcher : pending_add_dispatchers_) {
-      dispatchers_.insert(pdispatcher);
-    }
-    pending_add_dispatchers_.clear();
-  }
-
-  if (!pending_remove_dispatchers_.empty()) {
-    for (Dispatcher* pdispatcher : pending_remove_dispatchers_) {
-      dispatchers_.erase(pdispatcher);
-    }
-    pending_remove_dispatchers_.clear();
-  }
-}
-
-#if defined(WEBRTC_POSIX)
-
-bool PhysicalSocketServer::Wait(int cmsWait, bool process_io) {
-#if defined(WEBRTC_USE_EPOLL)
-  // We don't keep a dedicated "epoll" descriptor containing only the non-IO
-  // (i.e. signaling) dispatcher, so "poll" will be used instead of the default
-  // "select" to support sockets larger than FD_SETSIZE.
-  if (!process_io) {
-    return WaitPoll(cmsWait, signal_wakeup_);
-  } else if (epoll_fd_ != INVALID_SOCKET) {
-    return WaitEpoll(cmsWait);
-  }
-#endif
-  return WaitSelect(cmsWait, process_io);
-}
-
-static void ProcessEvents(Dispatcher* dispatcher,
-                          bool readable,
-                          bool writable,
-                          bool check_error) {
-  int errcode = 0;
-  // TODO(pthatcher): Should we set errcode if getsockopt fails?
-  if (check_error) {
-    socklen_t len = sizeof(errcode);
-    ::getsockopt(dispatcher->GetDescriptor(), SOL_SOCKET, SO_ERROR, &errcode,
-                 &len);
-  }
-
-  uint32_t ff = 0;
-
-  // Check readable descriptors. If we're waiting on an accept, signal
-  // that. Otherwise we're waiting for data, check to see if we're
-  // readable or really closed.
-  // TODO(pthatcher): Only peek at TCP descriptors.
-  if (readable) {
-    if (dispatcher->GetRequestedEvents() & DE_ACCEPT) {
-      ff |= DE_ACCEPT;
-    } else if (errcode || dispatcher->IsDescriptorClosed()) {
-      ff |= DE_CLOSE;
-    } else {
-      ff |= DE_READ;
-    }
-  }
-
-  // Check writable descriptors. If we're waiting on a connect, detect
-  // success versus failure by the reaped error code.
-  if (writable) {
-    if (dispatcher->GetRequestedEvents() & DE_CONNECT) {
-      if (!errcode) {
-        ff |= DE_CONNECT;
-      } else {
-        ff |= DE_CLOSE;
-      }
-    } else {
-      ff |= DE_WRITE;
-    }
-  }
-
-  // Tell the descriptor about the event.
-  if (ff != 0) {
-    dispatcher->OnPreEvent(ff);
-    dispatcher->OnEvent(ff, errcode);
-  }
-}
-
-bool PhysicalSocketServer::WaitSelect(int cmsWait, bool process_io) {
-  // Calculate timing information
-
-  struct timeval* ptvWait = nullptr;
-  struct timeval tvWait;
-  struct timeval tvStop;
-  if (cmsWait != kForever) {
-    // Calculate wait timeval
-    tvWait.tv_sec = cmsWait / 1000;
-    tvWait.tv_usec = (cmsWait % 1000) * 1000;
-    ptvWait = &tvWait;
-
-    // Calculate when to return in a timeval
-    gettimeofday(&tvStop, nullptr);
-    tvStop.tv_sec += tvWait.tv_sec;
-    tvStop.tv_usec += tvWait.tv_usec;
-    if (tvStop.tv_usec >= 1000000) {
-      tvStop.tv_usec -= 1000000;
-      tvStop.tv_sec += 1;
-    }
-  }
-
-  // Zero all fd_sets. Don't need to do this inside the loop since
-  // select() zeros the descriptors not signaled
-
-  fd_set fdsRead;
-  FD_ZERO(&fdsRead);
-  fd_set fdsWrite;
-  FD_ZERO(&fdsWrite);
-  // Explicitly unpoison these FDs on MemorySanitizer which doesn't handle the
-  // inline assembly in FD_ZERO.
-  // http://crbug.com/344505
-#ifdef MEMORY_SANITIZER
-  __msan_unpoison(&fdsRead, sizeof(fdsRead));
-  __msan_unpoison(&fdsWrite, sizeof(fdsWrite));
-#endif
-
-  fWait_ = true;
-
-  while (fWait_) {
-    int fdmax = -1;
-    {
-      CritScope cr(&crit_);
-      // TODO(jbauch): Support re-entrant waiting.
-      RTC_DCHECK(!processing_dispatchers_);
-      for (Dispatcher* pdispatcher : dispatchers_) {
-        // Query dispatchers for read and write wait state
-        RTC_DCHECK(pdispatcher);
-        if (!process_io && (pdispatcher != signal_wakeup_))
-          continue;
-        int fd = pdispatcher->GetDescriptor();
-        // "select"ing a file descriptor that is equal to or larger than
-        // FD_SETSIZE will result in undefined behavior.
-        RTC_DCHECK_LT(fd, FD_SETSIZE);
-        if (fd > fdmax)
-          fdmax = fd;
-
-        uint32_t ff = pdispatcher->GetRequestedEvents();
-        if (ff & (DE_READ | DE_ACCEPT))
-          FD_SET(fd, &fdsRead);
-        if (ff & (DE_WRITE | DE_CONNECT))
-          FD_SET(fd, &fdsWrite);
-      }
-    }
-
-    // Wait then call handlers as appropriate
-    // < 0 means error
-    // 0 means timeout
-    // > 0 means count of descriptors ready
-    int n = select(fdmax + 1, &fdsRead, &fdsWrite, nullptr, ptvWait);
-
-    // If error, return error.
-    if (n < 0) {
-      if (errno != EINTR) {
-        LOG_E(LS_ERROR, EN, errno) << "select";
-        return false;
-      }
-      // Else ignore the error and keep going. If this EINTR was for one of the
-      // signals managed by this PhysicalSocketServer, the
-      // PosixSignalDeliveryDispatcher will be in the signaled state in the next
-      // iteration.
-    } else if (n == 0) {
-      // If timeout, return success
-      return true;
-    } else {
-      // We have signaled descriptors
-      CritScope cr(&crit_);
-      processing_dispatchers_ = true;
-      for (Dispatcher* pdispatcher : dispatchers_) {
-        int fd = pdispatcher->GetDescriptor();
-
-        bool readable = FD_ISSET(fd, &fdsRead);
-        if (readable) {
-          FD_CLR(fd, &fdsRead);
-        }
-
-        bool writable = FD_ISSET(fd, &fdsWrite);
-        if (writable) {
-          FD_CLR(fd, &fdsWrite);
-        }
-
-        // The error code can be signaled through reads or writes.
-        ProcessEvents(pdispatcher, readable, writable, readable || writable);
-      }
-
-      processing_dispatchers_ = false;
-      // Process deferred dispatchers that have been added/removed while the
-      // events were handled above.
-      AddRemovePendingDispatchers();
-    }
-
-    // Recalc the time remaining to wait. Doing it here means it doesn't get
-    // calced twice the first time through the loop
-    if (ptvWait) {
-      ptvWait->tv_sec = 0;
-      ptvWait->tv_usec = 0;
-      struct timeval tvT;
-      gettimeofday(&tvT, nullptr);
-      if ((tvStop.tv_sec > tvT.tv_sec)
-          || ((tvStop.tv_sec == tvT.tv_sec)
-              && (tvStop.tv_usec > tvT.tv_usec))) {
-        ptvWait->tv_sec = tvStop.tv_sec - tvT.tv_sec;
-        ptvWait->tv_usec = tvStop.tv_usec - tvT.tv_usec;
-        if (ptvWait->tv_usec < 0) {
-          RTC_DCHECK(ptvWait->tv_sec > 0);
-          ptvWait->tv_usec += 1000000;
-          ptvWait->tv_sec -= 1;
-        }
-      }
-    }
-  }
-
-  return true;
-}
-
-#if defined(WEBRTC_USE_EPOLL)
-
-// Initial number of events to process with one call to "epoll_wait".
-static const size_t kInitialEpollEvents = 128;
-
-// Maximum number of events to process with one call to "epoll_wait".
-static const size_t kMaxEpollEvents = 8192;
-
-void PhysicalSocketServer::AddEpoll(Dispatcher* pdispatcher) {
-  RTC_DCHECK(epoll_fd_ != INVALID_SOCKET);
-  int fd = pdispatcher->GetDescriptor();
-  RTC_DCHECK(fd != INVALID_SOCKET);
-  if (fd == INVALID_SOCKET) {
-    return;
-  }
-
-  struct epoll_event event = {0};
-  event.events = GetEpollEvents(pdispatcher->GetRequestedEvents());
-  event.data.ptr = pdispatcher;
-  int err = epoll_ctl(epoll_fd_, EPOLL_CTL_ADD, fd, &event);
-  RTC_DCHECK_EQ(err, 0);
-  if (err == -1) {
-    LOG_E(LS_ERROR, EN, errno) << "epoll_ctl EPOLL_CTL_ADD";
-  }
-}
-
-void PhysicalSocketServer::RemoveEpoll(Dispatcher* pdispatcher) {
-  RTC_DCHECK(epoll_fd_ != INVALID_SOCKET);
-  int fd = pdispatcher->GetDescriptor();
-  RTC_DCHECK(fd != INVALID_SOCKET);
-  if (fd == INVALID_SOCKET) {
-    return;
-  }
-
-  struct epoll_event event = {0};
-  int err = epoll_ctl(epoll_fd_, EPOLL_CTL_DEL, fd, &event);
-  RTC_DCHECK(err == 0 || errno == ENOENT);
-  if (err == -1) {
-    if (errno == ENOENT) {
-      // Socket has already been closed.
-      LOG_E(LS_VERBOSE, EN, errno) << "epoll_ctl EPOLL_CTL_DEL";
-    } else {
-      LOG_E(LS_ERROR, EN, errno) << "epoll_ctl EPOLL_CTL_DEL";
-    }
-  }
-}
-
-void PhysicalSocketServer::UpdateEpoll(Dispatcher* pdispatcher) {
-  RTC_DCHECK(epoll_fd_ != INVALID_SOCKET);
-  int fd = pdispatcher->GetDescriptor();
-  RTC_DCHECK(fd != INVALID_SOCKET);
-  if (fd == INVALID_SOCKET) {
-    return;
-  }
-
-  struct epoll_event event = {0};
-  event.events = GetEpollEvents(pdispatcher->GetRequestedEvents());
-  event.data.ptr = pdispatcher;
-  int err = epoll_ctl(epoll_fd_, EPOLL_CTL_MOD, fd, &event);
-  RTC_DCHECK_EQ(err, 0);
-  if (err == -1) {
-    LOG_E(LS_ERROR, EN, errno) << "epoll_ctl EPOLL_CTL_MOD";
-  }
-}
-
-bool PhysicalSocketServer::WaitEpoll(int cmsWait) {
-  RTC_DCHECK(epoll_fd_ != INVALID_SOCKET);
-  int64_t tvWait = -1;
-  int64_t tvStop = -1;
-  if (cmsWait != kForever) {
-    tvWait = cmsWait;
-    tvStop = TimeAfter(cmsWait);
-  }
-
-  if (epoll_events_.empty()) {
-    // The initial space to receive events is created only if epoll is used.
-    epoll_events_.resize(kInitialEpollEvents);
-  }
-
-  fWait_ = true;
-
-  while (fWait_) {
-    // Wait then call handlers as appropriate
-    // < 0 means error
-    // 0 means timeout
-    // > 0 means count of descriptors ready
-    int n = epoll_wait(epoll_fd_, &epoll_events_[0],
-                       static_cast<int>(epoll_events_.size()),
-                       static_cast<int>(tvWait));
-    if (n < 0) {
-      if (errno != EINTR) {
-        LOG_E(LS_ERROR, EN, errno) << "epoll";
-        return false;
-      }
-      // Else ignore the error and keep going. If this EINTR was for one of the
-      // signals managed by this PhysicalSocketServer, the
-      // PosixSignalDeliveryDispatcher will be in the signaled state in the next
-      // iteration.
-    } else if (n == 0) {
-      // If timeout, return success
-      return true;
-    } else {
-      // We have signaled descriptors
-      CritScope cr(&crit_);
-      for (int i = 0; i < n; ++i) {
-        const epoll_event& event = epoll_events_[i];
-        Dispatcher* pdispatcher = static_cast<Dispatcher*>(event.data.ptr);
-        if (dispatchers_.find(pdispatcher) == dispatchers_.end()) {
-          // The dispatcher for this socket no longer exists.
-          continue;
-        }
-
-        bool readable = (event.events & (EPOLLIN | EPOLLPRI));
-        bool writable = (event.events & EPOLLOUT);
-        bool check_error = (event.events & (EPOLLRDHUP | EPOLLERR | EPOLLHUP));
-
-        ProcessEvents(pdispatcher, readable, writable, check_error);
-      }
-    }
-
-    if (static_cast<size_t>(n) == epoll_events_.size() &&
-        epoll_events_.size() < kMaxEpollEvents) {
-      // We used the complete space to receive events, increase size for future
-      // iterations.
-      epoll_events_.resize(std::max(epoll_events_.size() * 2, kMaxEpollEvents));
-    }
-
-    if (cmsWait != kForever) {
-      tvWait = TimeDiff(tvStop, TimeMillis());
-      if (tvWait < 0) {
-        // Return success on timeout.
-        return true;
-      }
-    }
-  }
-
-  return true;
-}
-
-bool PhysicalSocketServer::WaitPoll(int cmsWait, Dispatcher* dispatcher) {
-  RTC_DCHECK(dispatcher);
-  int64_t tvWait = -1;
-  int64_t tvStop = -1;
-  if (cmsWait != kForever) {
-    tvWait = cmsWait;
-    tvStop = TimeAfter(cmsWait);
-  }
-
-  fWait_ = true;
-
-  struct pollfd fds = {0};
-  int fd = dispatcher->GetDescriptor();
-  fds.fd = fd;
-
-  while (fWait_) {
-    uint32_t ff = dispatcher->GetRequestedEvents();
-    fds.events = 0;
-    if (ff & (DE_READ | DE_ACCEPT)) {
-      fds.events |= POLLIN;
-    }
-    if (ff & (DE_WRITE | DE_CONNECT)) {
-      fds.events |= POLLOUT;
-    }
-    fds.revents = 0;
-
-    // Wait then call handlers as appropriate
-    // < 0 means error
-    // 0 means timeout
-    // > 0 means count of descriptors ready
-    int n = poll(&fds, 1, static_cast<int>(tvWait));
-    if (n < 0) {
-      if (errno != EINTR) {
-        LOG_E(LS_ERROR, EN, errno) << "poll";
-        return false;
-      }
-      // Else ignore the error and keep going. If this EINTR was for one of the
-      // signals managed by this PhysicalSocketServer, the
-      // PosixSignalDeliveryDispatcher will be in the signaled state in the next
-      // iteration.
-    } else if (n == 0) {
-      // If timeout, return success
-      return true;
-    } else {
-      // We have signaled descriptors (should only be the passed dispatcher).
-      RTC_DCHECK_EQ(n, 1);
-      RTC_DCHECK_EQ(fds.fd, fd);
-
-      bool readable = (fds.revents & (POLLIN | POLLPRI));
-      bool writable = (fds.revents & POLLOUT);
-      bool check_error = (fds.revents & (POLLRDHUP | POLLERR | POLLHUP));
-
-      ProcessEvents(dispatcher, readable, writable, check_error);
-    }
-
-    if (cmsWait != kForever) {
-      tvWait = TimeDiff(tvStop, TimeMillis());
-      if (tvWait < 0) {
-        // Return success on timeout.
-        return true;
-      }
-    }
-  }
-
-  return true;
-}
-
-#endif  // WEBRTC_USE_EPOLL
-
-static void GlobalSignalHandler(int signum) {
-  PosixSignalHandler::Instance()->OnPosixSignalReceived(signum);
-}
-
-bool PhysicalSocketServer::SetPosixSignalHandler(int signum,
-                                                 void (*handler)(int)) {
-  // If handler is SIG_IGN or SIG_DFL then clear our user-level handler,
-  // otherwise set one.
-  if (handler == SIG_IGN || handler == SIG_DFL) {
-    if (!InstallSignal(signum, handler)) {
-      return false;
-    }
-    if (signal_dispatcher_) {
-      signal_dispatcher_->ClearHandler(signum);
-      if (!signal_dispatcher_->HasHandlers()) {
-        signal_dispatcher_.reset();
-      }
-    }
-  } else {
-    if (!signal_dispatcher_) {
-      signal_dispatcher_.reset(new PosixSignalDispatcher(this));
-    }
-    signal_dispatcher_->SetHandler(signum, handler);
-    if (!InstallSignal(signum, &GlobalSignalHandler)) {
-      return false;
-    }
-  }
-  return true;
-}
-
-Dispatcher* PhysicalSocketServer::signal_dispatcher() {
-  return signal_dispatcher_.get();
-}
-
-bool PhysicalSocketServer::InstallSignal(int signum, void (*handler)(int)) {
-  struct sigaction act;
-  // It doesn't really matter what we set this mask to.
-  if (sigemptyset(&act.sa_mask) != 0) {
-    LOG_ERR(LS_ERROR) << "Couldn't set mask";
-    return false;
-  }
-  act.sa_handler = handler;
-#if !defined(__native_client__)
-  // Use SA_RESTART so that our syscalls don't get EINTR, since we don't need it
-  // and it's a nuisance. Though some syscalls still return EINTR and there's no
-  // real standard for which ones. :(
-  act.sa_flags = SA_RESTART;
-#else
-  act.sa_flags = 0;
-#endif
-  if (sigaction(signum, &act, nullptr) != 0) {
-    LOG_ERR(LS_ERROR) << "Couldn't set sigaction";
-    return false;
-  }
-  return true;
-}
-#endif  // WEBRTC_POSIX
-
-#if defined(WEBRTC_WIN)
-bool PhysicalSocketServer::Wait(int cmsWait, bool process_io) {
-  int64_t cmsTotal = cmsWait;
-  int64_t cmsElapsed = 0;
-  int64_t msStart = Time();
-
-  fWait_ = true;
-  while (fWait_) {
-    std::vector<WSAEVENT> events;
-    std::vector<Dispatcher *> event_owners;
-
-    events.push_back(socket_ev_);
-
-    {
-      CritScope cr(&crit_);
-      // TODO(jbauch): Support re-entrant waiting.
-      RTC_DCHECK(!processing_dispatchers_);
-
-      // Calling "CheckSignalClose" might remove a closed dispatcher from the
-      // set. This must be deferred to prevent invalidating the iterator.
-      processing_dispatchers_ = true;
-      for (Dispatcher* disp : dispatchers_) {
-        if (!process_io && (disp != signal_wakeup_))
-          continue;
-        SOCKET s = disp->GetSocket();
-        if (disp->CheckSignalClose()) {
-          // We just signalled close, don't poll this socket
-        } else if (s != INVALID_SOCKET) {
-          WSAEventSelect(s,
-                         events[0],
-                         FlagsToEvents(disp->GetRequestedEvents()));
-        } else {
-          events.push_back(disp->GetWSAEvent());
-          event_owners.push_back(disp);
-        }
-      }
-
-      processing_dispatchers_ = false;
-      // Process deferred dispatchers that have been added/removed while the
-      // events were handled above.
-      AddRemovePendingDispatchers();
-    }
-
-    // Which is shorter, the delay wait or the asked wait?
-
-    int64_t cmsNext;
-    if (cmsWait == kForever) {
-      cmsNext = cmsWait;
-    } else {
-      cmsNext = std::max<int64_t>(0, cmsTotal - cmsElapsed);
-    }
-
-    // Wait for one of the events to signal
-    DWORD dw = WSAWaitForMultipleEvents(static_cast<DWORD>(events.size()),
-                                        &events[0],
-                                        false,
-                                        static_cast<DWORD>(cmsNext),
-                                        false);
-
-    if (dw == WSA_WAIT_FAILED) {
-      // Failed?
-      // TODO(pthatcher): need a better strategy than this!
-      WSAGetLastError();
-      RTC_NOTREACHED();
-      return false;
-    } else if (dw == WSA_WAIT_TIMEOUT) {
-      // Timeout?
-      return true;
-    } else {
-      // Figure out which one it is and call it
-      CritScope cr(&crit_);
-      int index = dw - WSA_WAIT_EVENT_0;
-      if (index > 0) {
-        --index; // The first event is the socket event
-        Dispatcher* disp = event_owners[index];
-        // The dispatcher could have been removed while waiting for events.
-        if (dispatchers_.find(disp) != dispatchers_.end()) {
-          disp->OnPreEvent(0);
-          disp->OnEvent(0, 0);
-        }
-      } else if (process_io) {
-        processing_dispatchers_ = true;
-        for (Dispatcher* disp : dispatchers_) {
-          SOCKET s = disp->GetSocket();
-          if (s == INVALID_SOCKET)
-            continue;
-
-          WSANETWORKEVENTS wsaEvents;
-          int err = WSAEnumNetworkEvents(s, events[0], &wsaEvents);
-          if (err == 0) {
-            {
-              if ((wsaEvents.lNetworkEvents & FD_READ) &&
-                  wsaEvents.iErrorCode[FD_READ_BIT] != 0) {
-                LOG(WARNING) << "PhysicalSocketServer got FD_READ_BIT error "
-                             << wsaEvents.iErrorCode[FD_READ_BIT];
-              }
-              if ((wsaEvents.lNetworkEvents & FD_WRITE) &&
-                  wsaEvents.iErrorCode[FD_WRITE_BIT] != 0) {
-                LOG(WARNING) << "PhysicalSocketServer got FD_WRITE_BIT error "
-                             << wsaEvents.iErrorCode[FD_WRITE_BIT];
-              }
-              if ((wsaEvents.lNetworkEvents & FD_CONNECT) &&
-                  wsaEvents.iErrorCode[FD_CONNECT_BIT] != 0) {
-                LOG(WARNING) << "PhysicalSocketServer got FD_CONNECT_BIT error "
-                             << wsaEvents.iErrorCode[FD_CONNECT_BIT];
-              }
-              if ((wsaEvents.lNetworkEvents & FD_ACCEPT) &&
-                  wsaEvents.iErrorCode[FD_ACCEPT_BIT] != 0) {
-                LOG(WARNING) << "PhysicalSocketServer got FD_ACCEPT_BIT error "
-                             << wsaEvents.iErrorCode[FD_ACCEPT_BIT];
-              }
-              if ((wsaEvents.lNetworkEvents & FD_CLOSE) &&
-                  wsaEvents.iErrorCode[FD_CLOSE_BIT] != 0) {
-                LOG(WARNING) << "PhysicalSocketServer got FD_CLOSE_BIT error "
-                             << wsaEvents.iErrorCode[FD_CLOSE_BIT];
-              }
-            }
-            uint32_t ff = 0;
-            int errcode = 0;
-            if (wsaEvents.lNetworkEvents & FD_READ)
-              ff |= DE_READ;
-            if (wsaEvents.lNetworkEvents & FD_WRITE)
-              ff |= DE_WRITE;
-            if (wsaEvents.lNetworkEvents & FD_CONNECT) {
-              if (wsaEvents.iErrorCode[FD_CONNECT_BIT] == 0) {
-                ff |= DE_CONNECT;
-              } else {
-                ff |= DE_CLOSE;
-                errcode = wsaEvents.iErrorCode[FD_CONNECT_BIT];
-              }
-            }
-            if (wsaEvents.lNetworkEvents & FD_ACCEPT)
-              ff |= DE_ACCEPT;
-            if (wsaEvents.lNetworkEvents & FD_CLOSE) {
-              ff |= DE_CLOSE;
-              errcode = wsaEvents.iErrorCode[FD_CLOSE_BIT];
-            }
-            if (ff != 0) {
-              disp->OnPreEvent(ff);
-              disp->OnEvent(ff, errcode);
-            }
-          }
-        }
-
-        processing_dispatchers_ = false;
-        // Process deferred dispatchers that have been added/removed while the
-        // events were handled above.
-        AddRemovePendingDispatchers();
-      }
-
-      // Reset the network event until new activity occurs
-      WSAResetEvent(socket_ev_);
-    }
-
-    // Break?
-    if (!fWait_)
-      break;
-    cmsElapsed = TimeSince(msStart);
-    if ((cmsWait != kForever) && (cmsElapsed >= cmsWait)) {
-       break;
-    }
-  }
-
-  // Done
-  return true;
-}
-#endif  // WEBRTC_WIN
-
-}  // namespace rtc
diff --git a/rtc_base/physicalsocketserver.h b/rtc_base/physicalsocketserver.h
deleted file mode 100644
index c91e14e..0000000
--- a/rtc_base/physicalsocketserver.h
+++ /dev/null
@@ -1,270 +0,0 @@
-/*
- *  Copyright 2004 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_RTC_BASE_PHYSICALSOCKETSERVER_H_
-#define WEBRTC_RTC_BASE_PHYSICALSOCKETSERVER_H_
-
-#if defined(WEBRTC_POSIX) && defined(WEBRTC_LINUX)
-#include <sys/epoll.h>
-#define WEBRTC_USE_EPOLL 1
-#endif
-
-#include <memory>
-#include <set>
-#include <vector>
-
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/nethelpers.h"
-#include "webrtc/rtc_base/socketserver.h"
-
-#if defined(WEBRTC_POSIX)
-typedef int SOCKET;
-#endif // WEBRTC_POSIX
-
-namespace rtc {
-
-// Event constants for the Dispatcher class.
-enum DispatcherEvent {
-  DE_READ    = 0x0001,
-  DE_WRITE   = 0x0002,
-  DE_CONNECT = 0x0004,
-  DE_CLOSE   = 0x0008,
-  DE_ACCEPT  = 0x0010,
-};
-
-class Signaler;
-#if defined(WEBRTC_POSIX)
-class PosixSignalDispatcher;
-#endif
-
-class Dispatcher {
- public:
-  virtual ~Dispatcher() {}
-  virtual uint32_t GetRequestedEvents() = 0;
-  virtual void OnPreEvent(uint32_t ff) = 0;
-  virtual void OnEvent(uint32_t ff, int err) = 0;
-#if defined(WEBRTC_WIN)
-  virtual WSAEVENT GetWSAEvent() = 0;
-  virtual SOCKET GetSocket() = 0;
-  virtual bool CheckSignalClose() = 0;
-#elif defined(WEBRTC_POSIX)
-  virtual int GetDescriptor() = 0;
-  virtual bool IsDescriptorClosed() = 0;
-#endif
-};
-
-// A socket server that provides the real sockets of the underlying OS.
-class PhysicalSocketServer : public SocketServer {
- public:
-  PhysicalSocketServer();
-  ~PhysicalSocketServer() override;
-
-  // SocketFactory:
-  Socket* CreateSocket(int type) override;
-  Socket* CreateSocket(int family, int type) override;
-
-  AsyncSocket* CreateAsyncSocket(int type) override;
-  AsyncSocket* CreateAsyncSocket(int family, int type) override;
-
-  // Internal Factory for Accept (virtual so it can be overwritten in tests).
-  virtual AsyncSocket* WrapSocket(SOCKET s);
-
-  // SocketServer:
-  bool Wait(int cms, bool process_io) override;
-  void WakeUp() override;
-
-  void Add(Dispatcher* dispatcher);
-  void Remove(Dispatcher* dispatcher);
-  void Update(Dispatcher* dispatcher);
-
-#if defined(WEBRTC_POSIX)
-  // Sets the function to be executed in response to the specified POSIX signal.
-  // The function is executed from inside Wait() using the "self-pipe trick"--
-  // regardless of which thread receives the signal--and hence can safely
-  // manipulate user-level data structures.
-  // "handler" may be SIG_IGN, SIG_DFL, or a user-specified function, just like
-  // with signal(2).
-  // Only one PhysicalSocketServer should have user-level signal handlers.
-  // Dispatching signals on multiple PhysicalSocketServers is not reliable.
-  // The signal mask is not modified. It is the caller's responsibily to
-  // maintain it as desired.
-  virtual bool SetPosixSignalHandler(int signum, void (*handler)(int));
-
- protected:
-  Dispatcher* signal_dispatcher();
-#endif
-
- private:
-  typedef std::set<Dispatcher*> DispatcherSet;
-
-  void AddRemovePendingDispatchers();
-
-#if defined(WEBRTC_POSIX)
-  bool WaitSelect(int cms, bool process_io);
-  static bool InstallSignal(int signum, void (*handler)(int));
-
-  std::unique_ptr<PosixSignalDispatcher> signal_dispatcher_;
-#endif  // WEBRTC_POSIX
-#if defined(WEBRTC_USE_EPOLL)
-  void AddEpoll(Dispatcher* dispatcher);
-  void RemoveEpoll(Dispatcher* dispatcher);
-  void UpdateEpoll(Dispatcher* dispatcher);
-  bool WaitEpoll(int cms);
-  bool WaitPoll(int cms, Dispatcher* dispatcher);
-
-  int epoll_fd_ = INVALID_SOCKET;
-  std::vector<struct epoll_event> epoll_events_;
-#endif  // WEBRTC_USE_EPOLL
-  DispatcherSet dispatchers_;
-  DispatcherSet pending_add_dispatchers_;
-  DispatcherSet pending_remove_dispatchers_;
-  bool processing_dispatchers_ = false;
-  Signaler* signal_wakeup_;
-  CriticalSection crit_;
-  bool fWait_;
-#if defined(WEBRTC_WIN)
-  WSAEVENT socket_ev_;
-#endif
-};
-
-class PhysicalSocket : public AsyncSocket, public sigslot::has_slots<> {
- public:
-  PhysicalSocket(PhysicalSocketServer* ss, SOCKET s = INVALID_SOCKET);
-  ~PhysicalSocket() override;
-
-  // Creates the underlying OS socket (same as the "socket" function).
-  virtual bool Create(int family, int type);
-
-  SocketAddress GetLocalAddress() const override;
-  SocketAddress GetRemoteAddress() const override;
-
-  int Bind(const SocketAddress& bind_addr) override;
-  int Connect(const SocketAddress& addr) override;
-
-  int GetError() const override;
-  void SetError(int error) override;
-
-  ConnState GetState() const override;
-
-  int GetOption(Option opt, int* value) override;
-  int SetOption(Option opt, int value) override;
-
-  int Send(const void* pv, size_t cb) override;
-  int SendTo(const void* buffer,
-             size_t length,
-             const SocketAddress& addr) override;
-
-  int Recv(void* buffer, size_t length, int64_t* timestamp) override;
-  int RecvFrom(void* buffer,
-               size_t length,
-               SocketAddress* out_addr,
-               int64_t* timestamp) override;
-
-  int Listen(int backlog) override;
-  AsyncSocket* Accept(SocketAddress* out_addr) override;
-
-  int Close() override;
-
-  SocketServer* socketserver() { return ss_; }
-
- protected:
-  int DoConnect(const SocketAddress& connect_addr);
-
-  // Make virtual so ::accept can be overwritten in tests.
-  virtual SOCKET DoAccept(SOCKET socket, sockaddr* addr, socklen_t* addrlen);
-
-  // Make virtual so ::send can be overwritten in tests.
-  virtual int DoSend(SOCKET socket, const char* buf, int len, int flags);
-
-  // Make virtual so ::sendto can be overwritten in tests.
-  virtual int DoSendTo(SOCKET socket, const char* buf, int len, int flags,
-                       const struct sockaddr* dest_addr, socklen_t addrlen);
-
-  void OnResolveResult(AsyncResolverInterface* resolver);
-
-  void UpdateLastError();
-  void MaybeRemapSendError();
-
-  uint8_t enabled_events() const { return enabled_events_; }
-  virtual void SetEnabledEvents(uint8_t events);
-  virtual void EnableEvents(uint8_t events);
-  virtual void DisableEvents(uint8_t events);
-
-  static int TranslateOption(Option opt, int* slevel, int* sopt);
-
-  PhysicalSocketServer* ss_;
-  SOCKET s_;
-  bool udp_;
-  CriticalSection crit_;
-  int error_ RTC_GUARDED_BY(crit_);
-  ConnState state_;
-  AsyncResolver* resolver_;
-
-#if !defined(NDEBUG)
-  std::string dbg_addr_;
-#endif
-
- private:
-  uint8_t enabled_events_ = 0;
-};
-
-class SocketDispatcher : public Dispatcher, public PhysicalSocket {
- public:
-  explicit SocketDispatcher(PhysicalSocketServer *ss);
-  SocketDispatcher(SOCKET s, PhysicalSocketServer *ss);
-  ~SocketDispatcher() override;
-
-  bool Initialize();
-
-  virtual bool Create(int type);
-  bool Create(int family, int type) override;
-
-#if defined(WEBRTC_WIN)
-  WSAEVENT GetWSAEvent() override;
-  SOCKET GetSocket() override;
-  bool CheckSignalClose() override;
-#elif defined(WEBRTC_POSIX)
-  int GetDescriptor() override;
-  bool IsDescriptorClosed() override;
-#endif
-
-  uint32_t GetRequestedEvents() override;
-  void OnPreEvent(uint32_t ff) override;
-  void OnEvent(uint32_t ff, int err) override;
-
-  int Close() override;
-
-#if defined(WEBRTC_USE_EPOLL)
- protected:
-  void StartBatchedEventUpdates();
-  void FinishBatchedEventUpdates();
-
-  void SetEnabledEvents(uint8_t events) override;
-  void EnableEvents(uint8_t events) override;
-  void DisableEvents(uint8_t events) override;
-#endif
-
- private:
-#if defined(WEBRTC_WIN)
-  static int next_id_;
-  int id_;
-  bool signal_close_;
-  int signal_err_;
-#endif // WEBRTC_WIN
-#if defined(WEBRTC_USE_EPOLL)
-  void MaybeUpdateDispatcher(uint8_t old_events);
-
-  int saved_enabled_events_ = -1;
-#endif
-};
-
-} // namespace rtc
-
-#endif // WEBRTC_RTC_BASE_PHYSICALSOCKETSERVER_H_
diff --git a/rtc_base/physicalsocketserver_unittest.cc b/rtc_base/physicalsocketserver_unittest.cc
deleted file mode 100644
index 34ba027..0000000
--- a/rtc_base/physicalsocketserver_unittest.cc
+++ /dev/null
@@ -1,624 +0,0 @@
-/*
- *  Copyright 2004 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 <memory>
-#include <signal.h>
-#include <stdarg.h>
-
-#include "webrtc/rtc_base/gunit.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/networkmonitor.h"
-#include "webrtc/rtc_base/physicalsocketserver.h"
-#include "webrtc/rtc_base/socket_unittest.h"
-#include "webrtc/rtc_base/testutils.h"
-#include "webrtc/rtc_base/thread.h"
-
-namespace rtc {
-
-#define MAYBE_SKIP_IPV4                    \
-  if (!HasIPv4Enabled()) {                 \
-    LOG(LS_INFO) << "No IPv4... skipping"; \
-    return;                                \
-  }
-
-#define MAYBE_SKIP_IPV6                    \
-  if (!HasIPv6Enabled()) {                 \
-    LOG(LS_INFO) << "No IPv6... skipping"; \
-    return;                                \
-  }
-
-class PhysicalSocketTest;
-
-class FakeSocketDispatcher : public SocketDispatcher {
- public:
-  explicit FakeSocketDispatcher(PhysicalSocketServer* ss)
-    : SocketDispatcher(ss) {
-  }
-
-  FakeSocketDispatcher(SOCKET s, PhysicalSocketServer* ss)
-    : SocketDispatcher(s, ss) {
-  }
-
- protected:
-  SOCKET DoAccept(SOCKET socket, sockaddr* addr, socklen_t* addrlen) override;
-  int DoSend(SOCKET socket, const char* buf, int len, int flags) override;
-  int DoSendTo(SOCKET socket, const char* buf, int len, int flags,
-               const struct sockaddr* dest_addr, socklen_t addrlen) override;
-};
-
-class FakePhysicalSocketServer : public PhysicalSocketServer {
- public:
-  explicit FakePhysicalSocketServer(PhysicalSocketTest* test)
-    : test_(test) {
-  }
-
-  AsyncSocket* CreateAsyncSocket(int type) override {
-    SocketDispatcher* dispatcher = new FakeSocketDispatcher(this);
-    if (!dispatcher->Create(type)) {
-      delete dispatcher;
-      return nullptr;
-    }
-    return dispatcher;
-  }
-
-  AsyncSocket* CreateAsyncSocket(int family, int type) override {
-    SocketDispatcher* dispatcher = new FakeSocketDispatcher(this);
-    if (!dispatcher->Create(family, type)) {
-      delete dispatcher;
-      return nullptr;
-    }
-    return dispatcher;
-  }
-
-  AsyncSocket* WrapSocket(SOCKET s) override {
-    SocketDispatcher* dispatcher = new FakeSocketDispatcher(s, this);
-    if (!dispatcher->Initialize()) {
-      delete dispatcher;
-      return nullptr;
-    }
-    return dispatcher;
-  }
-
-  PhysicalSocketTest* GetTest() const { return test_; }
-
- private:
-  PhysicalSocketTest* test_;
-};
-
-class FakeNetworkBinder : public NetworkBinderInterface {
- public:
-  NetworkBindingResult BindSocketToNetwork(int, const IPAddress&) override {
-    ++num_binds_;
-    return result_;
-  }
-
-  void set_result(NetworkBindingResult result) { result_ = result; }
-
-  int num_binds() { return num_binds_; }
-
- private:
-  NetworkBindingResult result_ = NetworkBindingResult::SUCCESS;
-  int num_binds_ = 0;
-};
-
-class PhysicalSocketTest : public SocketTest {
- public:
-  // Set flag to simluate failures when calling "::accept" on a AsyncSocket.
-  void SetFailAccept(bool fail) { fail_accept_ = fail; }
-  bool FailAccept() const { return fail_accept_; }
-
-  // Maximum size to ::send to a socket. Set to < 0 to disable limiting.
-  void SetMaxSendSize(int max_size) { max_send_size_ = max_size; }
-  int MaxSendSize() const { return max_send_size_; }
-
- protected:
-  PhysicalSocketTest()
-    : server_(new FakePhysicalSocketServer(this)),
-      thread_(server_.get()),
-      fail_accept_(false),
-      max_send_size_(-1) {}
-
-  void ConnectInternalAcceptError(const IPAddress& loopback);
-  void WritableAfterPartialWrite(const IPAddress& loopback);
-
-  std::unique_ptr<FakePhysicalSocketServer> server_;
-  rtc::AutoSocketServerThread thread_;
-  bool fail_accept_;
-  int max_send_size_;
-};
-
-SOCKET FakeSocketDispatcher::DoAccept(SOCKET socket,
-                                      sockaddr* addr,
-                                      socklen_t* addrlen) {
-  FakePhysicalSocketServer* ss =
-      static_cast<FakePhysicalSocketServer*>(socketserver());
-  if (ss->GetTest()->FailAccept()) {
-    return INVALID_SOCKET;
-  }
-
-  return SocketDispatcher::DoAccept(socket, addr, addrlen);
-}
-
-int FakeSocketDispatcher::DoSend(SOCKET socket, const char* buf, int len,
-    int flags) {
-  FakePhysicalSocketServer* ss =
-      static_cast<FakePhysicalSocketServer*>(socketserver());
-  if (ss->GetTest()->MaxSendSize() >= 0) {
-    len = std::min(len, ss->GetTest()->MaxSendSize());
-  }
-
-  return SocketDispatcher::DoSend(socket, buf, len, flags);
-}
-
-int FakeSocketDispatcher::DoSendTo(SOCKET socket, const char* buf, int len,
-    int flags, const struct sockaddr* dest_addr, socklen_t addrlen) {
-  FakePhysicalSocketServer* ss =
-      static_cast<FakePhysicalSocketServer*>(socketserver());
-  if (ss->GetTest()->MaxSendSize() >= 0) {
-    len = std::min(len, ss->GetTest()->MaxSendSize());
-  }
-
-  return SocketDispatcher::DoSendTo(socket, buf, len, flags, dest_addr,
-      addrlen);
-}
-
-TEST_F(PhysicalSocketTest, TestConnectIPv4) {
-  MAYBE_SKIP_IPV4;
-  SocketTest::TestConnectIPv4();
-}
-
-TEST_F(PhysicalSocketTest, TestConnectIPv6) {
-  SocketTest::TestConnectIPv6();
-}
-
-TEST_F(PhysicalSocketTest, TestConnectWithDnsLookupIPv4) {
-  MAYBE_SKIP_IPV4;
-  SocketTest::TestConnectWithDnsLookupIPv4();
-}
-
-TEST_F(PhysicalSocketTest, TestConnectWithDnsLookupIPv6) {
-  SocketTest::TestConnectWithDnsLookupIPv6();
-}
-
-TEST_F(PhysicalSocketTest, TestConnectFailIPv4) {
-  MAYBE_SKIP_IPV4;
-  SocketTest::TestConnectFailIPv4();
-}
-
-void PhysicalSocketTest::ConnectInternalAcceptError(const IPAddress& loopback) {
-  webrtc::testing::StreamSink sink;
-  SocketAddress accept_addr;
-
-  // Create two clients.
-  std::unique_ptr<AsyncSocket> client1(
-      server_->CreateAsyncSocket(loopback.family(), SOCK_STREAM));
-  sink.Monitor(client1.get());
-  EXPECT_EQ(AsyncSocket::CS_CLOSED, client1->GetState());
-  EXPECT_PRED1(IsUnspecOrEmptyIP, client1->GetLocalAddress().ipaddr());
-
-  std::unique_ptr<AsyncSocket> client2(
-      server_->CreateAsyncSocket(loopback.family(), SOCK_STREAM));
-  sink.Monitor(client2.get());
-  EXPECT_EQ(AsyncSocket::CS_CLOSED, client2->GetState());
-  EXPECT_PRED1(IsUnspecOrEmptyIP, client2->GetLocalAddress().ipaddr());
-
-  // Create server and listen.
-  std::unique_ptr<AsyncSocket> server(
-      server_->CreateAsyncSocket(loopback.family(), SOCK_STREAM));
-  sink.Monitor(server.get());
-  EXPECT_EQ(0, server->Bind(SocketAddress(loopback, 0)));
-  EXPECT_EQ(0, server->Listen(5));
-  EXPECT_EQ(AsyncSocket::CS_CONNECTING, server->GetState());
-
-  // Ensure no pending server connections, since we haven't done anything yet.
-  EXPECT_FALSE(sink.Check(server.get(), webrtc::testing::SSE_READ));
-  EXPECT_TRUE(nullptr == server->Accept(&accept_addr));
-  EXPECT_TRUE(accept_addr.IsNil());
-
-  // Attempt first connect to listening socket.
-  EXPECT_EQ(0, client1->Connect(server->GetLocalAddress()));
-  EXPECT_FALSE(client1->GetLocalAddress().IsNil());
-  EXPECT_NE(server->GetLocalAddress(), client1->GetLocalAddress());
-
-  // Client is connecting, outcome not yet determined.
-  EXPECT_EQ(AsyncSocket::CS_CONNECTING, client1->GetState());
-  EXPECT_FALSE(sink.Check(client1.get(), webrtc::testing::SSE_OPEN));
-  EXPECT_FALSE(sink.Check(client1.get(), webrtc::testing::SSE_CLOSE));
-
-  // Server has pending connection, try to accept it (will fail).
-  EXPECT_TRUE_WAIT((sink.Check(server.get(), webrtc::testing::SSE_READ)),
-                   kTimeout);
-  // Simulate "::accept" returning an error.
-  SetFailAccept(true);
-  std::unique_ptr<AsyncSocket> accepted(server->Accept(&accept_addr));
-  EXPECT_FALSE(accepted);
-  ASSERT_TRUE(accept_addr.IsNil());
-
-  // Ensure no more pending server connections.
-  EXPECT_FALSE(sink.Check(server.get(), webrtc::testing::SSE_READ));
-  EXPECT_TRUE(nullptr == server->Accept(&accept_addr));
-  EXPECT_TRUE(accept_addr.IsNil());
-
-  // Attempt second connect to listening socket.
-  EXPECT_EQ(0, client2->Connect(server->GetLocalAddress()));
-  EXPECT_FALSE(client2->GetLocalAddress().IsNil());
-  EXPECT_NE(server->GetLocalAddress(), client2->GetLocalAddress());
-
-  // Client is connecting, outcome not yet determined.
-  EXPECT_EQ(AsyncSocket::CS_CONNECTING, client2->GetState());
-  EXPECT_FALSE(sink.Check(client2.get(), webrtc::testing::SSE_OPEN));
-  EXPECT_FALSE(sink.Check(client2.get(), webrtc::testing::SSE_CLOSE));
-
-  // Server has pending connection, try to accept it (will succeed).
-  EXPECT_TRUE_WAIT((sink.Check(server.get(), webrtc::testing::SSE_READ)),
-                   kTimeout);
-  SetFailAccept(false);
-  std::unique_ptr<AsyncSocket> accepted2(server->Accept(&accept_addr));
-  ASSERT_TRUE(accepted2);
-  EXPECT_FALSE(accept_addr.IsNil());
-  EXPECT_EQ(accepted2->GetRemoteAddress(), accept_addr);
-}
-
-TEST_F(PhysicalSocketTest, TestConnectAcceptErrorIPv4) {
-  MAYBE_SKIP_IPV4;
-  ConnectInternalAcceptError(kIPv4Loopback);
-}
-
-TEST_F(PhysicalSocketTest, TestConnectAcceptErrorIPv6) {
-  MAYBE_SKIP_IPV6;
-  ConnectInternalAcceptError(kIPv6Loopback);
-}
-
-void PhysicalSocketTest::WritableAfterPartialWrite(const IPAddress& loopback) {
-  // Simulate a really small maximum send size.
-  const int kMaxSendSize = 128;
-  SetMaxSendSize(kMaxSendSize);
-
-  // Run the default send/receive socket tests with a smaller amount of data
-  // to avoid long running times due to the small maximum send size.
-  const size_t kDataSize = 128 * 1024;
-  TcpInternal(loopback, kDataSize, kMaxSendSize);
-}
-
-// https://bugs.chromium.org/p/webrtc/issues/detail?id=6167
-#if defined(WEBRTC_WIN)
-#define MAYBE_TestWritableAfterPartialWriteIPv4 DISABLED_TestWritableAfterPartialWriteIPv4
-#else
-#define MAYBE_TestWritableAfterPartialWriteIPv4 TestWritableAfterPartialWriteIPv4
-#endif
-TEST_F(PhysicalSocketTest, MAYBE_TestWritableAfterPartialWriteIPv4) {
-  MAYBE_SKIP_IPV4;
-  WritableAfterPartialWrite(kIPv4Loopback);
-}
-
-// https://bugs.chromium.org/p/webrtc/issues/detail?id=6167
-#if defined(WEBRTC_WIN)
-#define MAYBE_TestWritableAfterPartialWriteIPv6 DISABLED_TestWritableAfterPartialWriteIPv6
-#else
-#define MAYBE_TestWritableAfterPartialWriteIPv6 TestWritableAfterPartialWriteIPv6
-#endif
-TEST_F(PhysicalSocketTest, MAYBE_TestWritableAfterPartialWriteIPv6) {
-  MAYBE_SKIP_IPV6;
-  WritableAfterPartialWrite(kIPv6Loopback);
-}
-
-TEST_F(PhysicalSocketTest, TestConnectFailIPv6) {
-  SocketTest::TestConnectFailIPv6();
-}
-
-TEST_F(PhysicalSocketTest, TestConnectWithDnsLookupFailIPv4) {
-  MAYBE_SKIP_IPV4;
-  SocketTest::TestConnectWithDnsLookupFailIPv4();
-}
-
-TEST_F(PhysicalSocketTest, TestConnectWithDnsLookupFailIPv6) {
-  SocketTest::TestConnectWithDnsLookupFailIPv6();
-}
-
-
-TEST_F(PhysicalSocketTest, TestConnectWithClosedSocketIPv4) {
-  MAYBE_SKIP_IPV4;
-  SocketTest::TestConnectWithClosedSocketIPv4();
-}
-
-TEST_F(PhysicalSocketTest, TestConnectWithClosedSocketIPv6) {
-  SocketTest::TestConnectWithClosedSocketIPv6();
-}
-
-TEST_F(PhysicalSocketTest, TestConnectWhileNotClosedIPv4) {
-  MAYBE_SKIP_IPV4;
-  SocketTest::TestConnectWhileNotClosedIPv4();
-}
-
-TEST_F(PhysicalSocketTest, TestConnectWhileNotClosedIPv6) {
-  SocketTest::TestConnectWhileNotClosedIPv6();
-}
-
-TEST_F(PhysicalSocketTest, TestServerCloseDuringConnectIPv4) {
-  MAYBE_SKIP_IPV4;
-  SocketTest::TestServerCloseDuringConnectIPv4();
-}
-
-TEST_F(PhysicalSocketTest, TestServerCloseDuringConnectIPv6) {
-  SocketTest::TestServerCloseDuringConnectIPv6();
-}
-
-TEST_F(PhysicalSocketTest, TestClientCloseDuringConnectIPv4) {
-  MAYBE_SKIP_IPV4;
-  SocketTest::TestClientCloseDuringConnectIPv4();
-}
-
-TEST_F(PhysicalSocketTest, TestClientCloseDuringConnectIPv6) {
-  SocketTest::TestClientCloseDuringConnectIPv6();
-}
-
-TEST_F(PhysicalSocketTest, TestServerCloseIPv4) {
-  MAYBE_SKIP_IPV4;
-  SocketTest::TestServerCloseIPv4();
-}
-
-TEST_F(PhysicalSocketTest, TestServerCloseIPv6) {
-  SocketTest::TestServerCloseIPv6();
-}
-
-TEST_F(PhysicalSocketTest, TestCloseInClosedCallbackIPv4) {
-  MAYBE_SKIP_IPV4;
-  SocketTest::TestCloseInClosedCallbackIPv4();
-}
-
-TEST_F(PhysicalSocketTest, TestCloseInClosedCallbackIPv6) {
-  SocketTest::TestCloseInClosedCallbackIPv6();
-}
-
-TEST_F(PhysicalSocketTest, TestSocketServerWaitIPv4) {
-  MAYBE_SKIP_IPV4;
-  SocketTest::TestSocketServerWaitIPv4();
-}
-
-TEST_F(PhysicalSocketTest, TestSocketServerWaitIPv6) {
-  SocketTest::TestSocketServerWaitIPv6();
-}
-
-TEST_F(PhysicalSocketTest, TestTcpIPv4) {
-  MAYBE_SKIP_IPV4;
-  SocketTest::TestTcpIPv4();
-}
-
-TEST_F(PhysicalSocketTest, TestTcpIPv6) {
-  SocketTest::TestTcpIPv6();
-}
-
-TEST_F(PhysicalSocketTest, TestUdpIPv4) {
-  MAYBE_SKIP_IPV4;
-  SocketTest::TestUdpIPv4();
-}
-
-TEST_F(PhysicalSocketTest, TestUdpIPv6) {
-  SocketTest::TestUdpIPv6();
-}
-
-// Disable for TSan v2, see
-// https://code.google.com/p/webrtc/issues/detail?id=3498 for details.
-// Also disable for MSan, see:
-// https://code.google.com/p/webrtc/issues/detail?id=4958
-// TODO(deadbeef): Enable again once test is reimplemented to be unflaky.
-// Also disable for ASan.
-// Disabled on Android: https://code.google.com/p/webrtc/issues/detail?id=4364
-// Disabled on Linux: https://bugs.chromium.org/p/webrtc/issues/detail?id=5233
-#if defined(THREAD_SANITIZER) || defined(MEMORY_SANITIZER) || \
-    defined(ADDRESS_SANITIZER) || defined(WEBRTC_ANDROID) ||  \
-    defined(WEBRTC_LINUX)
-#define MAYBE_TestUdpReadyToSendIPv4 DISABLED_TestUdpReadyToSendIPv4
-#else
-#define MAYBE_TestUdpReadyToSendIPv4 TestUdpReadyToSendIPv4
-#endif
-TEST_F(PhysicalSocketTest, MAYBE_TestUdpReadyToSendIPv4) {
-  MAYBE_SKIP_IPV4;
-  SocketTest::TestUdpReadyToSendIPv4();
-}
-
-// https://bugs.chromium.org/p/webrtc/issues/detail?id=6167
-#if defined(WEBRTC_WIN)
-#define MAYBE_TestUdpReadyToSendIPv6 DISABLED_TestUdpReadyToSendIPv6
-#else
-#define MAYBE_TestUdpReadyToSendIPv6 TestUdpReadyToSendIPv6
-#endif
-TEST_F(PhysicalSocketTest, MAYBE_TestUdpReadyToSendIPv6) {
-  SocketTest::TestUdpReadyToSendIPv6();
-}
-
-TEST_F(PhysicalSocketTest, TestGetSetOptionsIPv4) {
-  MAYBE_SKIP_IPV4;
-  SocketTest::TestGetSetOptionsIPv4();
-}
-
-TEST_F(PhysicalSocketTest, TestGetSetOptionsIPv6) {
-  SocketTest::TestGetSetOptionsIPv6();
-}
-
-#if defined(WEBRTC_POSIX)
-
-// We don't get recv timestamps on Mac.
-#if !defined(WEBRTC_MAC)
-TEST_F(PhysicalSocketTest, TestSocketRecvTimestampIPv4) {
-  MAYBE_SKIP_IPV4;
-  SocketTest::TestSocketRecvTimestampIPv4();
-}
-
-TEST_F(PhysicalSocketTest, TestSocketRecvTimestampIPv6) {
-  SocketTest::TestSocketRecvTimestampIPv6();
-}
-#endif
-
-// Verify that if the socket was unable to be bound to a real network interface
-// (not loopback), Bind will return an error.
-TEST_F(PhysicalSocketTest,
-       BindFailsIfNetworkBinderFailsForNonLoopbackInterface) {
-  MAYBE_SKIP_IPV4;
-  FakeNetworkBinder fake_network_binder;
-  server_->set_network_binder(&fake_network_binder);
-  std::unique_ptr<AsyncSocket> socket(
-      server_->CreateAsyncSocket(AF_INET, SOCK_DGRAM));
-  fake_network_binder.set_result(NetworkBindingResult::FAILURE);
-  EXPECT_EQ(-1, socket->Bind(SocketAddress("192.168.0.1", 0)));
-  server_->set_network_binder(nullptr);
-}
-
-// Network binder shouldn't be used if the socket is bound to the "any" IP.
-TEST_F(PhysicalSocketTest,
-       NetworkBinderIsNotUsedForAnyIp) {
-  MAYBE_SKIP_IPV4;
-  FakeNetworkBinder fake_network_binder;
-  server_->set_network_binder(&fake_network_binder);
-  std::unique_ptr<AsyncSocket> socket(
-      server_->CreateAsyncSocket(AF_INET, SOCK_DGRAM));
-  EXPECT_EQ(0, socket->Bind(SocketAddress("0.0.0.0", 0)));
-  EXPECT_EQ(0, fake_network_binder.num_binds());
-  server_->set_network_binder(nullptr);
-}
-
-// For a loopback interface, failures to bind to the interface should be
-// tolerated.
-TEST_F(PhysicalSocketTest,
-       BindSucceedsIfNetworkBinderFailsForLoopbackInterface) {
-  MAYBE_SKIP_IPV4;
-  FakeNetworkBinder fake_network_binder;
-  server_->set_network_binder(&fake_network_binder);
-  std::unique_ptr<AsyncSocket> socket(
-      server_->CreateAsyncSocket(AF_INET, SOCK_DGRAM));
-  fake_network_binder.set_result(NetworkBindingResult::FAILURE);
-  EXPECT_EQ(0, socket->Bind(SocketAddress(kIPv4Loopback, 0)));
-  server_->set_network_binder(nullptr);
-}
-
-class PosixSignalDeliveryTest : public testing::Test {
- public:
-  static void RecordSignal(int signum) {
-    signals_received_.push_back(signum);
-    signaled_thread_ = Thread::Current();
-  }
-
- protected:
-  void SetUp() {
-    ss_.reset(new PhysicalSocketServer());
-  }
-
-  void TearDown() {
-    ss_.reset(nullptr);
-    signals_received_.clear();
-    signaled_thread_ = nullptr;
-  }
-
-  bool ExpectSignal(int signum) {
-    if (signals_received_.empty()) {
-      LOG(LS_ERROR) << "ExpectSignal(): No signal received";
-      return false;
-    }
-    if (signals_received_[0] != signum) {
-      LOG(LS_ERROR) << "ExpectSignal(): Received signal " <<
-          signals_received_[0] << ", expected " << signum;
-      return false;
-    }
-    signals_received_.erase(signals_received_.begin());
-    return true;
-  }
-
-  bool ExpectNone() {
-    bool ret = signals_received_.empty();
-    if (!ret) {
-      LOG(LS_ERROR) << "ExpectNone(): Received signal " << signals_received_[0]
-          << ", expected none";
-    }
-    return ret;
-  }
-
-  static std::vector<int> signals_received_;
-  static Thread *signaled_thread_;
-
-  std::unique_ptr<PhysicalSocketServer> ss_;
-};
-
-std::vector<int> PosixSignalDeliveryTest::signals_received_;
-Thread* PosixSignalDeliveryTest::signaled_thread_ = nullptr;
-
-// Test receiving a synchronous signal while not in Wait() and then entering
-// Wait() afterwards.
-TEST_F(PosixSignalDeliveryTest, RaiseThenWait) {
-  ASSERT_TRUE(ss_->SetPosixSignalHandler(SIGTERM, &RecordSignal));
-  raise(SIGTERM);
-  EXPECT_TRUE(ss_->Wait(0, true));
-  EXPECT_TRUE(ExpectSignal(SIGTERM));
-  EXPECT_TRUE(ExpectNone());
-}
-
-// Test that we can handle getting tons of repeated signals and that we see all
-// the different ones.
-TEST_F(PosixSignalDeliveryTest, InsanelyManySignals) {
-  ss_->SetPosixSignalHandler(SIGTERM, &RecordSignal);
-  ss_->SetPosixSignalHandler(SIGINT, &RecordSignal);
-  for (int i = 0; i < 10000; ++i) {
-    raise(SIGTERM);
-  }
-  raise(SIGINT);
-  EXPECT_TRUE(ss_->Wait(0, true));
-  // Order will be lowest signal numbers first.
-  EXPECT_TRUE(ExpectSignal(SIGINT));
-  EXPECT_TRUE(ExpectSignal(SIGTERM));
-  EXPECT_TRUE(ExpectNone());
-}
-
-// Test that a signal during a Wait() call is detected.
-TEST_F(PosixSignalDeliveryTest, SignalDuringWait) {
-  ss_->SetPosixSignalHandler(SIGALRM, &RecordSignal);
-  alarm(1);
-  EXPECT_TRUE(ss_->Wait(1500, true));
-  EXPECT_TRUE(ExpectSignal(SIGALRM));
-  EXPECT_TRUE(ExpectNone());
-}
-
-class RaiseSigTermRunnable : public Runnable {
-  void Run(Thread *thread) {
-    thread->socketserver()->Wait(1000, false);
-
-    // Allow SIGTERM. This will be the only thread with it not masked so it will
-    // be delivered to us.
-    sigset_t mask;
-    sigemptyset(&mask);
-    pthread_sigmask(SIG_SETMASK, &mask, nullptr);
-
-    // Raise it.
-    raise(SIGTERM);
-  }
-};
-
-// Test that it works no matter what thread the kernel chooses to give the
-// signal to (since it's not guaranteed to be the one that Wait() runs on).
-TEST_F(PosixSignalDeliveryTest, SignalOnDifferentThread) {
-  ss_->SetPosixSignalHandler(SIGTERM, &RecordSignal);
-  // Mask out SIGTERM so that it can't be delivered to this thread.
-  sigset_t mask;
-  sigemptyset(&mask);
-  sigaddset(&mask, SIGTERM);
-  EXPECT_EQ(0, pthread_sigmask(SIG_SETMASK, &mask, nullptr));
-  // Start a new thread that raises it. It will have to be delivered to that
-  // thread. Our implementation should safely handle it and dispatch
-  // RecordSignal() on this thread.
-  std::unique_ptr<Thread> thread(Thread::CreateWithSocketServer());
-  std::unique_ptr<RaiseSigTermRunnable> runnable(new RaiseSigTermRunnable());
-  thread->Start(runnable.get());
-  EXPECT_TRUE(ss_->Wait(1500, true));
-  EXPECT_TRUE(ExpectSignal(SIGTERM));
-  EXPECT_EQ(Thread::Current(), signaled_thread_);
-  EXPECT_TRUE(ExpectNone());
-}
-
-#endif
-
-}  // namespace rtc
diff --git a/rtc_base/platform_file.cc b/rtc_base/platform_file.cc
deleted file mode 100644
index acbac6f..0000000
--- a/rtc_base/platform_file.cc
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- *  Copyright 2014 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/rtc_base/platform_file.h"
-
-#if defined(WEBRTC_WIN)
-#include <io.h>
-#else
-#include <fcntl.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-#include <unistd.h>
-#endif
-
-namespace rtc {
-
-#if defined(WEBRTC_WIN)
-const PlatformFile kInvalidPlatformFileValue = INVALID_HANDLE_VALUE;
-
-FILE* FdopenPlatformFileForWriting(PlatformFile file) {
-  if (file == kInvalidPlatformFileValue)
-    return nullptr;
-  int fd = _open_osfhandle(reinterpret_cast<intptr_t>(file), 0);
-  if (fd < 0)
-    return nullptr;
-
-  return _fdopen(fd, "w");
-}
-
-bool ClosePlatformFile(PlatformFile file) {
-  return CloseHandle(file) != 0;
-}
-
-bool RemoveFile(const std::string& path) {
-  return ::DeleteFile(ToUtf16(path).c_str()) != 0;
-}
-
-PlatformFile OpenPlatformFile(const std::string& path) {
-  return ::CreateFile(ToUtf16(path).c_str(), GENERIC_READ | GENERIC_WRITE, 0,
-                      nullptr, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, nullptr);
-}
-
-PlatformFile CreatePlatformFile(const std::string& path) {
-  return ::CreateFile(ToUtf16(path).c_str(), GENERIC_READ | GENERIC_WRITE, 0,
-                      nullptr, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, nullptr);
-}
-
-#else  // defined(WEBRTC_WIN)
-
-const PlatformFile kInvalidPlatformFileValue = -1;
-
-FILE* FdopenPlatformFileForWriting(PlatformFile file) {
-  return fdopen(file, "w");
-}
-
-bool ClosePlatformFile(PlatformFile file) {
-  return close(file);
-}
-
-bool RemoveFile(const std::string& path) {
-  return ::unlink(path.c_str()) == 0;
-}
-
-PlatformFile OpenPlatformFile(const std::string& path) {
-  return ::open(path.c_str(), O_RDWR);
-}
-
-PlatformFile CreatePlatformFile(const std::string& path) {
-  return ::open(path.c_str(), O_CREAT | O_TRUNC | O_RDWR, S_IRUSR | S_IWUSR);
-}
-
-#endif
-
-}  // namespace rtc
diff --git a/rtc_base/platform_file.h b/rtc_base/platform_file.h
deleted file mode 100644
index 2a5f6ed..0000000
--- a/rtc_base/platform_file.h
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- *  Copyright 2014 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_RTC_BASE_PLATFORM_FILE_H_
-#define WEBRTC_RTC_BASE_PLATFORM_FILE_H_
-
-#include <stdio.h>
-#include <string>
-
-#if defined(WEBRTC_WIN)
-#include "webrtc/rtc_base/win32.h"
-#endif
-
-namespace rtc {
-
-#if defined(WEBRTC_WIN)
-typedef HANDLE PlatformFile;
-#elif defined(WEBRTC_POSIX)
-typedef int PlatformFile;
-#else
-#error Unsupported platform
-#endif
-
-extern const PlatformFile kInvalidPlatformFileValue;
-
-// Associates a standard FILE stream with an existing PlatformFile.
-// Note that after this function has returned a valid FILE stream,
-// the PlatformFile should no longer be used.
-FILE* FdopenPlatformFileForWriting(PlatformFile file);
-
-// Closes a PlatformFile.
-// Don't use ClosePlatformFile to close a file opened with FdopenPlatformFile.
-// Use fclose instead.
-bool ClosePlatformFile(PlatformFile file);
-
-// Removes a file in the filesystem.
-bool RemoveFile(const std::string& path);
-
-// Opens a file for reading and writing. You might want to use base/file.h
-// instead.
-PlatformFile OpenPlatformFile(const std::string& path);
-
-// Creates a new file for reading and writing. If the file already exists it
-// will be overwritten. You might want to use base/file.h instead.
-PlatformFile CreatePlatformFile(const std::string& path);
-
-}  // namespace rtc
-
-#endif  // WEBRTC_RTC_BASE_PLATFORM_FILE_H_
diff --git a/rtc_base/platform_thread.cc b/rtc_base/platform_thread.cc
deleted file mode 100644
index da5089a..0000000
--- a/rtc_base/platform_thread.cc
+++ /dev/null
@@ -1,352 +0,0 @@
-/*
- *  Copyright (c) 2015 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/rtc_base/platform_thread.h"
-
-#include "webrtc/rtc_base/atomicops.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/timeutils.h"
-#include "webrtc/rtc_base/trace_event.h"
-
-#if defined(WEBRTC_LINUX)
-#include <sys/prctl.h>
-#include <sys/syscall.h>
-#endif
-
-namespace rtc {
-
-PlatformThreadId CurrentThreadId() {
-  PlatformThreadId ret;
-#if defined(WEBRTC_WIN)
-  ret = GetCurrentThreadId();
-#elif defined(WEBRTC_POSIX)
-#if defined(WEBRTC_MAC) || defined(WEBRTC_IOS)
-  ret = pthread_mach_thread_np(pthread_self());
-#elif defined(WEBRTC_ANDROID)
-  ret = gettid();
-#elif defined(WEBRTC_LINUX)
-  ret =  syscall(__NR_gettid);
-#else
-  // Default implementation for nacl and solaris.
-  ret = reinterpret_cast<pid_t>(pthread_self());
-#endif
-#endif  // defined(WEBRTC_POSIX)
-  RTC_DCHECK(ret);
-  return ret;
-}
-
-PlatformThreadRef CurrentThreadRef() {
-#if defined(WEBRTC_WIN)
-  return GetCurrentThreadId();
-#elif defined(WEBRTC_POSIX)
-  return pthread_self();
-#endif
-}
-
-bool IsThreadRefEqual(const PlatformThreadRef& a, const PlatformThreadRef& b) {
-#if defined(WEBRTC_WIN)
-  return a == b;
-#elif defined(WEBRTC_POSIX)
-  return pthread_equal(a, b);
-#endif
-}
-
-void SetCurrentThreadName(const char* name) {
-#if defined(WEBRTC_WIN)
-  struct {
-    DWORD dwType;
-    LPCSTR szName;
-    DWORD dwThreadID;
-    DWORD dwFlags;
-  } threadname_info = {0x1000, name, static_cast<DWORD>(-1), 0};
-
-  __try {
-    ::RaiseException(0x406D1388, 0, sizeof(threadname_info) / sizeof(DWORD),
-                     reinterpret_cast<ULONG_PTR*>(&threadname_info));
-  } __except (EXCEPTION_EXECUTE_HANDLER) {
-  }
-#elif defined(WEBRTC_LINUX) || defined(WEBRTC_ANDROID)
-  prctl(PR_SET_NAME, reinterpret_cast<unsigned long>(name));
-#elif defined(WEBRTC_MAC) || defined(WEBRTC_IOS)
-  pthread_setname_np(name);
-#endif
-}
-
-namespace {
-#if defined(WEBRTC_WIN)
-void CALLBACK RaiseFlag(ULONG_PTR param) {
-  *reinterpret_cast<bool*>(param) = true;
-}
-#else
-struct ThreadAttributes {
-  ThreadAttributes() { pthread_attr_init(&attr); }
-  ~ThreadAttributes() { pthread_attr_destroy(&attr); }
-  pthread_attr_t* operator&() { return &attr; }
-  pthread_attr_t attr;
-};
-#endif  // defined(WEBRTC_WIN)
-}
-
-PlatformThread::PlatformThread(ThreadRunFunctionDeprecated func,
-                               void* obj,
-                               const char* thread_name)
-    : run_function_deprecated_(func),
-      obj_(obj),
-      name_(thread_name ? thread_name : "webrtc") {
-  RTC_DCHECK(func);
-  RTC_DCHECK(name_.length() < 64);
-  spawned_thread_checker_.DetachFromThread();
-}
-
-PlatformThread::PlatformThread(ThreadRunFunction func,
-                               void* obj,
-                               const char* thread_name,
-                               ThreadPriority priority /*= kNormalPriority*/)
-    : run_function_(func), priority_(priority), obj_(obj), name_(thread_name) {
-  RTC_DCHECK(func);
-  RTC_DCHECK(!name_.empty());
-  // TODO(tommi): Consider lowering the limit to 15 (limit on Linux).
-  RTC_DCHECK(name_.length() < 64);
-  spawned_thread_checker_.DetachFromThread();
-}
-
-PlatformThread::~PlatformThread() {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-#if defined(WEBRTC_WIN)
-  RTC_DCHECK(!thread_);
-  RTC_DCHECK(!thread_id_);
-#endif  // defined(WEBRTC_WIN)
-}
-
-#if defined(WEBRTC_WIN)
-DWORD WINAPI PlatformThread::StartThread(void* param) {
-  // The GetLastError() function only returns valid results when it is called
-  // after a Win32 API function that returns a "failed" result. A crash dump
-  // contains the result from GetLastError() and to make sure it does not
-  // falsely report a Windows error we call SetLastError here.
-  ::SetLastError(ERROR_SUCCESS);
-  static_cast<PlatformThread*>(param)->Run();
-  return 0;
-}
-#else
-void* PlatformThread::StartThread(void* param) {
-  static_cast<PlatformThread*>(param)->Run();
-  return 0;
-}
-#endif  // defined(WEBRTC_WIN)
-
-void PlatformThread::Start() {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  RTC_DCHECK(!thread_) << "Thread already started?";
-#if defined(WEBRTC_WIN)
-  stop_ = false;
-
-  // See bug 2902 for background on STACK_SIZE_PARAM_IS_A_RESERVATION.
-  // Set the reserved stack stack size to 1M, which is the default on Windows
-  // and Linux.
-  thread_ = ::CreateThread(nullptr, 1024 * 1024, &StartThread, this,
-                           STACK_SIZE_PARAM_IS_A_RESERVATION, &thread_id_);
-  RTC_CHECK(thread_) << "CreateThread failed";
-  RTC_DCHECK(thread_id_);
-#else
-  ThreadAttributes attr;
-  // Set the stack stack size to 1M.
-  pthread_attr_setstacksize(&attr, 1024 * 1024);
-  RTC_CHECK_EQ(0, pthread_create(&thread_, &attr, &StartThread, this));
-#endif  // defined(WEBRTC_WIN)
-}
-
-bool PlatformThread::IsRunning() const {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-#if defined(WEBRTC_WIN)
-  return thread_ != nullptr;
-#else
-  return thread_ != 0;
-#endif  // defined(WEBRTC_WIN)
-}
-
-PlatformThreadRef PlatformThread::GetThreadRef() const {
-#if defined(WEBRTC_WIN)
-  return thread_id_;
-#else
-  return thread_;
-#endif  // defined(WEBRTC_WIN)
-}
-
-void PlatformThread::Stop() {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  if (!IsRunning())
-    return;
-
-#if defined(WEBRTC_WIN)
-  // Set stop_ to |true| on the worker thread.
-  bool queued = QueueAPC(&RaiseFlag, reinterpret_cast<ULONG_PTR>(&stop_));
-  // Queuing the APC can fail if the thread is being terminated.
-  RTC_CHECK(queued || GetLastError() == ERROR_GEN_FAILURE);
-  WaitForSingleObject(thread_, INFINITE);
-  CloseHandle(thread_);
-  thread_ = nullptr;
-  thread_id_ = 0;
-#else
-  if (!run_function_)
-    RTC_CHECK_EQ(1, AtomicOps::Increment(&stop_flag_));
-  RTC_CHECK_EQ(0, pthread_join(thread_, nullptr));
-  if (!run_function_)
-    AtomicOps::ReleaseStore(&stop_flag_, 0);
-  thread_ = 0;
-#endif  // defined(WEBRTC_WIN)
-  spawned_thread_checker_.DetachFromThread();
-}
-
-// TODO(tommi): Deprecate the loop behavior in PlatformThread.
-// * Introduce a new callback type that returns void.
-// * Remove potential for a busy loop in PlatformThread.
-// * Delegate the responsibility for how to stop the thread, to the
-//   implementation that actually uses the thread.
-// All implementations will need to be aware of how the thread should be stopped
-// and encouraging a busy polling loop, can be costly in terms of power and cpu.
-void PlatformThread::Run() {
-  // Attach the worker thread checker to this thread.
-  RTC_DCHECK(spawned_thread_checker_.CalledOnValidThread());
-  rtc::SetCurrentThreadName(name_.c_str());
-
-  if (run_function_) {
-    SetPriority(priority_);
-    run_function_(obj_);
-    return;
-  }
-
-// TODO(tommi): Delete the rest of this function when looping isn't supported.
-#if RTC_DCHECK_IS_ON
-  // These constants control the busy loop detection algorithm below.
-  // |kMaxLoopCount| controls the limit for how many times we allow the loop
-  // to run within a period, before DCHECKing.
-  // |kPeriodToMeasureMs| controls how long that period is.
-  static const int kMaxLoopCount = 1000;
-  static const int kPeriodToMeasureMs = 100;
-  int64_t loop_stamps[kMaxLoopCount] = {};
-  int64_t sequence_nr = 0;
-#endif
-
-  do {
-    TRACE_EVENT1("webrtc", "PlatformThread::Run", "name", name_.c_str());
-
-    // The interface contract of Start/Stop is that for a successful call to
-    // Start, there should be at least one call to the run function.  So we
-    // call the function before checking |stop_|.
-    if (!run_function_deprecated_(obj_))
-      break;
-#if RTC_DCHECK_IS_ON
-    auto id = sequence_nr % kMaxLoopCount;
-    loop_stamps[id] = rtc::TimeMillis();
-    if (sequence_nr > kMaxLoopCount) {
-      auto compare_id = (id + 1) % kMaxLoopCount;
-      auto diff = loop_stamps[id] - loop_stamps[compare_id];
-      RTC_DCHECK_GE(diff, 0);
-      if (diff < kPeriodToMeasureMs) {
-        RTC_NOTREACHED() << "This thread is too busy: " << name_ << " " << diff
-                         << "ms sequence=" << sequence_nr << " "
-                         << loop_stamps[id] << " vs " << loop_stamps[compare_id]
-                         << ", " << id << " vs " << compare_id;
-      }
-    }
-    ++sequence_nr;
-#endif
-#if defined(WEBRTC_WIN)
-    // Alertable sleep to permit RaiseFlag to run and update |stop_|.
-    SleepEx(0, true);
-  } while (!stop_);
-#else
-#if defined(WEBRTC_MAC)
-    sched_yield();
-#else
-    static const struct timespec ts_null = {0};
-    nanosleep(&ts_null, nullptr);
-#endif
-  } while (!AtomicOps::AcquireLoad(&stop_flag_));
-#endif  // defined(WEBRTC_WIN)
-}
-
-bool PlatformThread::SetPriority(ThreadPriority priority) {
-#if RTC_DCHECK_IS_ON
-  if (run_function_) {
-    // The non-deprecated way of how this function gets called, is that it must
-    // be called on the worker thread itself.
-    RTC_DCHECK(!thread_checker_.CalledOnValidThread());
-    RTC_DCHECK(spawned_thread_checker_.CalledOnValidThread());
-  } else {
-    // In the case of deprecated use of this method, it must be called on the
-    // same thread as the PlatformThread object is constructed on.
-    RTC_DCHECK(thread_checker_.CalledOnValidThread());
-    RTC_DCHECK(IsRunning());
-  }
-#endif
-
-#if defined(WEBRTC_WIN)
-  return SetThreadPriority(thread_, priority) != FALSE;
-#elif defined(__native_client__)
-  // Setting thread priorities is not supported in NaCl.
-  return true;
-#elif defined(WEBRTC_CHROMIUM_BUILD) && defined(WEBRTC_LINUX)
-  // TODO(tommi): Switch to the same mechanism as Chromium uses for changing
-  // thread priorities.
-  return true;
-#else
-#ifdef WEBRTC_THREAD_RR
-  const int policy = SCHED_RR;
-#else
-  const int policy = SCHED_FIFO;
-#endif
-  const int min_prio = sched_get_priority_min(policy);
-  const int max_prio = sched_get_priority_max(policy);
-  if (min_prio == -1 || max_prio == -1) {
-    return false;
-  }
-
-  if (max_prio - min_prio <= 2)
-    return false;
-
-  // Convert webrtc priority to system priorities:
-  sched_param param;
-  const int top_prio = max_prio - 1;
-  const int low_prio = min_prio + 1;
-  switch (priority) {
-    case kLowPriority:
-      param.sched_priority = low_prio;
-      break;
-    case kNormalPriority:
-      // The -1 ensures that the kHighPriority is always greater or equal to
-      // kNormalPriority.
-      param.sched_priority = (low_prio + top_prio - 1) / 2;
-      break;
-    case kHighPriority:
-      param.sched_priority = std::max(top_prio - 2, low_prio);
-      break;
-    case kHighestPriority:
-      param.sched_priority = std::max(top_prio - 1, low_prio);
-      break;
-    case kRealtimePriority:
-      param.sched_priority = top_prio;
-      break;
-  }
-  return pthread_setschedparam(thread_, policy, &param) == 0;
-#endif  // defined(WEBRTC_WIN)
-}
-
-#if defined(WEBRTC_WIN)
-bool PlatformThread::QueueAPC(PAPCFUNC function, ULONG_PTR data) {
-  RTC_DCHECK(thread_checker_.CalledOnValidThread());
-  RTC_DCHECK(IsRunning());
-
-  return QueueUserAPC(function, thread_, data) != FALSE;
-}
-#endif
-
-}  // namespace rtc
diff --git a/rtc_base/platform_thread.h b/rtc_base/platform_thread.h
deleted file mode 100644
index 4121c97..0000000
--- a/rtc_base/platform_thread.h
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- *  Copyright (c) 2015 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_RTC_BASE_PLATFORM_THREAD_H_
-#define WEBRTC_RTC_BASE_PLATFORM_THREAD_H_
-
-#include <string>
-
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/event.h"
-#include "webrtc/rtc_base/platform_thread_types.h"
-#include "webrtc/rtc_base/thread_checker.h"
-
-namespace rtc {
-
-PlatformThreadId CurrentThreadId();
-PlatformThreadRef CurrentThreadRef();
-
-// Compares two thread identifiers for equality.
-bool IsThreadRefEqual(const PlatformThreadRef& a, const PlatformThreadRef& b);
-
-// Sets the current thread name.
-void SetCurrentThreadName(const char* name);
-
-// Callback function that the spawned thread will enter once spawned.
-// A return value of false is interpreted as that the function has no
-// more work to do and that the thread can be released.
-typedef bool (*ThreadRunFunctionDeprecated)(void*);
-typedef void (*ThreadRunFunction)(void*);
-
-enum ThreadPriority {
-#ifdef WEBRTC_WIN
-  kLowPriority = THREAD_PRIORITY_BELOW_NORMAL,
-  kNormalPriority = THREAD_PRIORITY_NORMAL,
-  kHighPriority = THREAD_PRIORITY_ABOVE_NORMAL,
-  kHighestPriority = THREAD_PRIORITY_HIGHEST,
-  kRealtimePriority = THREAD_PRIORITY_TIME_CRITICAL
-#else
-  kLowPriority = 1,
-  kNormalPriority = 2,
-  kHighPriority = 3,
-  kHighestPriority = 4,
-  kRealtimePriority = 5
-#endif
-};
-
-// Represents a simple worker thread.  The implementation must be assumed
-// to be single threaded, meaning that all methods of the class, must be
-// called from the same thread, including instantiation.
-class PlatformThread {
- public:
-  PlatformThread(ThreadRunFunctionDeprecated func,
-                 void* obj,
-                 const char* thread_name);
-  PlatformThread(ThreadRunFunction func,
-                 void* obj,
-                 const char* thread_name,
-                 ThreadPriority priority = kNormalPriority);
-  virtual ~PlatformThread();
-
-  const std::string& name() const { return name_; }
-
-  // Spawns a thread and tries to set thread priority according to the priority
-  // from when CreateThread was called.
-  void Start();
-
-  bool IsRunning() const;
-
-  // Returns an identifier for the worker thread that can be used to do
-  // thread checks.
-  PlatformThreadRef GetThreadRef() const;
-
-  // Stops (joins) the spawned thread.
-  void Stop();
-
-  // Set the priority of the thread. Must be called when thread is running.
-  // TODO(tommi): Make private and only allow public support via ctor.
-  bool SetPriority(ThreadPriority priority);
-
- protected:
-#if defined(WEBRTC_WIN)
-  // Exposed to derived classes to allow for special cases specific to Windows.
-  bool QueueAPC(PAPCFUNC apc_function, ULONG_PTR data);
-#endif
-
- private:
-  void Run();
-
-  ThreadRunFunctionDeprecated const run_function_deprecated_ = nullptr;
-  ThreadRunFunction const run_function_ = nullptr;
-  const ThreadPriority priority_ = kNormalPriority;
-  void* const obj_;
-  // TODO(pbos): Make sure call sites use string literals and update to a const
-  // char* instead of a std::string.
-  const std::string name_;
-  rtc::ThreadChecker thread_checker_;
-  rtc::ThreadChecker spawned_thread_checker_;
-#if defined(WEBRTC_WIN)
-  static DWORD WINAPI StartThread(void* param);
-
-  bool stop_ = false;
-  HANDLE thread_ = nullptr;
-  DWORD thread_id_ = 0;
-#else
-  static void* StartThread(void* param);
-
-  // An atomic flag that we use to stop the thread. Only modified on the
-  // controlling thread and checked on the worker thread.
-  volatile int stop_flag_ = 0;
-  pthread_t thread_ = 0;
-#endif  // defined(WEBRTC_WIN)
-  RTC_DISALLOW_COPY_AND_ASSIGN(PlatformThread);
-};
-
-}  // namespace rtc
-
-#endif  // WEBRTC_RTC_BASE_PLATFORM_THREAD_H_
diff --git a/rtc_base/platform_thread_types.h b/rtc_base/platform_thread_types.h
deleted file mode 100644
index 705d6ca..0000000
--- a/rtc_base/platform_thread_types.h
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- *  Copyright (c) 2015 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_RTC_BASE_PLATFORM_THREAD_TYPES_H_
-#define WEBRTC_RTC_BASE_PLATFORM_THREAD_TYPES_H_
-
-#if defined(WEBRTC_WIN)
-#include <winsock2.h>
-#include <windows.h>
-#elif defined(WEBRTC_POSIX)
-#include <pthread.h>
-#include <unistd.h>
-#endif
-
-namespace rtc {
-#if defined(WEBRTC_WIN)
-typedef DWORD PlatformThreadId;
-typedef DWORD PlatformThreadRef;
-#elif defined(WEBRTC_POSIX)
-typedef pid_t PlatformThreadId;
-typedef pthread_t PlatformThreadRef;
-#endif
-}  // namespace rtc
-
-#endif  // WEBRTC_RTC_BASE_PLATFORM_THREAD_TYPES_H_
diff --git a/rtc_base/platform_thread_unittest.cc b/rtc_base/platform_thread_unittest.cc
deleted file mode 100644
index ae1a1d0..0000000
--- a/rtc_base/platform_thread_unittest.cc
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- *  Copyright (c) 2012 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/rtc_base/platform_thread.h"
-
-#include "webrtc/system_wrappers/include/sleep.h"
-#include "webrtc/test/gtest.h"
-
-namespace rtc {
-namespace {
-// Function that does nothing, and reports success.
-bool NullRunFunctionDeprecated(void* obj) {
-  webrtc::SleepMs(2);  // Hand over timeslice, prevents busy looping.
-  return true;
-}
-
-bool TooBusyRunFunction(void* obj) {
-  // Indentionally busy looping.
-  return true;
-}
-
-void NullRunFunction(void* obj) {}
-
-// Function that sets a boolean.
-bool SetFlagRunFunctionDeprecated(void* obj) {
-  bool* obj_as_bool = static_cast<bool*>(obj);
-  *obj_as_bool = true;
-  webrtc::SleepMs(0);  // Hand over timeslice, prevents busy looping.
-  return true;
-}
-
-void SetFlagRunFunction(void* obj) {
-  bool* obj_as_bool = static_cast<bool*>(obj);
-  *obj_as_bool = true;
-}
-
-}  // namespace
-
-TEST(PlatformThreadTest, StartStopDeprecated) {
-  PlatformThread thread(&NullRunFunctionDeprecated, nullptr,
-                        "PlatformThreadTest");
-  EXPECT_TRUE(thread.name() == "PlatformThreadTest");
-  EXPECT_TRUE(thread.GetThreadRef() == 0);
-  thread.Start();
-  EXPECT_TRUE(thread.GetThreadRef() != 0);
-  thread.Stop();
-  EXPECT_TRUE(thread.GetThreadRef() == 0);
-}
-
-TEST(PlatformThreadTest, StartStop2Deprecated) {
-  PlatformThread thread1(&NullRunFunctionDeprecated, nullptr,
-                         "PlatformThreadTest1");
-  PlatformThread thread2(&NullRunFunctionDeprecated, nullptr,
-                         "PlatformThreadTest2");
-  EXPECT_TRUE(thread1.GetThreadRef() == thread2.GetThreadRef());
-  thread1.Start();
-  thread2.Start();
-  EXPECT_TRUE(thread1.GetThreadRef() != thread2.GetThreadRef());
-  thread2.Stop();
-  thread1.Stop();
-}
-
-TEST(PlatformThreadTest, RunFunctionIsCalledDeprecated) {
-  bool flag = false;
-  PlatformThread thread(&SetFlagRunFunctionDeprecated, &flag,
-                        "RunFunctionIsCalled");
-  thread.Start();
-
-  // At this point, the flag may be either true or false.
-  thread.Stop();
-
-  // We expect the thread to have run at least once.
-  EXPECT_TRUE(flag);
-}
-
-TEST(PlatformThreadTest, StartStop) {
-  PlatformThread thread(&NullRunFunction, nullptr, "PlatformThreadTest");
-  EXPECT_TRUE(thread.name() == "PlatformThreadTest");
-  EXPECT_TRUE(thread.GetThreadRef() == 0);
-  thread.Start();
-  EXPECT_TRUE(thread.GetThreadRef() != 0);
-  thread.Stop();
-  EXPECT_TRUE(thread.GetThreadRef() == 0);
-}
-
-TEST(PlatformThreadTest, StartStop2) {
-  PlatformThread thread1(&NullRunFunction, nullptr, "PlatformThreadTest1");
-  PlatformThread thread2(&NullRunFunction, nullptr, "PlatformThreadTest2");
-  EXPECT_TRUE(thread1.GetThreadRef() == thread2.GetThreadRef());
-  thread1.Start();
-  thread2.Start();
-  EXPECT_TRUE(thread1.GetThreadRef() != thread2.GetThreadRef());
-  thread2.Stop();
-  thread1.Stop();
-}
-
-TEST(PlatformThreadTest, RunFunctionIsCalled) {
-  bool flag = false;
-  PlatformThread thread(&SetFlagRunFunction, &flag, "RunFunctionIsCalled");
-  thread.Start();
-
-  // At this point, the flag may be either true or false.
-  thread.Stop();
-
-  // We expect the thread to have run at least once.
-  EXPECT_TRUE(flag);
-}
-
-// This test is disabled since it will cause a crash.
-// There might be a way to implement this as a death test, but it looks like
-// a death test requires an expression to be checked but does not allow a
-// flag to be raised that says "some thread will crash after this point".
-// TODO(tommi): Look into ways to enable the test by default.
-TEST(PlatformThreadTest, DISABLED_TooBusyDeprecated) {
-  PlatformThread thread(&TooBusyRunFunction, nullptr, "BusyThread");
-  thread.Start();
-  webrtc::SleepMs(1000);
-  thread.Stop();
-}
-
-}  // rtc
diff --git a/rtc_base/protobuf_utils.h b/rtc_base/protobuf_utils.h
deleted file mode 100644
index c8c98b0..0000000
--- a/rtc_base/protobuf_utils.h
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- *  Copyright (c) 2017 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 <string>
-
-#ifndef WEBRTC_RTC_BASE_PROTOBUF_UTILS_H_
-#define WEBRTC_RTC_BASE_PROTOBUF_UTILS_H_
-
-namespace webrtc {
-
-using ProtoString = std::string;
-
-}  // namespace webrtc
-
-#if WEBRTC_ENABLE_PROTOBUF
-
-#include "third_party/protobuf/src/google/protobuf/message_lite.h"
-#include "third_party/protobuf/src/google/protobuf/repeated_field.h"
-
-namespace webrtc {
-
-using google::protobuf::MessageLite;
-using google::protobuf::RepeatedPtrField;
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_ENABLE_PROTOBUF
-
-#endif  // WEBRTC_RTC_BASE_PROTOBUF_UTILS_H_
diff --git a/rtc_base/proxy_unittest.cc b/rtc_base/proxy_unittest.cc
deleted file mode 100644
index f4b51ad..0000000
--- a/rtc_base/proxy_unittest.cc
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- *  Copyright 2009 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 <memory>
-#include <string>
-#include "webrtc/rtc_base/gunit.h"
-#include "webrtc/rtc_base/httpserver.h"
-#include "webrtc/rtc_base/proxyserver.h"
-#include "webrtc/rtc_base/socketadapters.h"
-#include "webrtc/rtc_base/testclient.h"
-#include "webrtc/rtc_base/testechoserver.h"
-#include "webrtc/rtc_base/virtualsocketserver.h"
-
-using rtc::Socket;
-using rtc::Thread;
-using rtc::SocketAddress;
-
-static const SocketAddress kSocksProxyIntAddr("1.2.3.4", 1080);
-static const SocketAddress kSocksProxyExtAddr("1.2.3.5", 0);
-static const SocketAddress kHttpsProxyIntAddr("1.2.3.4", 443);
-static const SocketAddress kHttpsProxyExtAddr("1.2.3.5", 0);
-static const SocketAddress kBogusProxyIntAddr("1.2.3.4", 999);
-
-// Sets up a virtual socket server and HTTPS/SOCKS5 proxy servers.
-class ProxyTest : public testing::Test {
- public:
-  ProxyTest() : ss_(new rtc::VirtualSocketServer()), thread_(ss_.get()) {
-    socks_.reset(new rtc::SocksProxyServer(
-        ss_.get(), kSocksProxyIntAddr, ss_.get(), kSocksProxyExtAddr));
-    https_.reset(new rtc::HttpListenServer());
-    https_->Listen(kHttpsProxyIntAddr);
-  }
-  ~ProxyTest() {}
-
-  rtc::SocketServer* ss() { return ss_.get(); }
-
- private:
-  std::unique_ptr<rtc::SocketServer> ss_;
-  rtc::AutoSocketServerThread thread_;
-  std::unique_ptr<rtc::SocksProxyServer> socks_;
-  // TODO: Make this a real HTTPS proxy server.
-  std::unique_ptr<rtc::HttpListenServer> https_;
-};
-
-// Tests whether we can use a SOCKS5 proxy to connect to a server.
-TEST_F(ProxyTest, TestSocks5Connect) {
-  rtc::AsyncSocket* socket =
-      ss()->CreateAsyncSocket(kSocksProxyIntAddr.family(), SOCK_STREAM);
-  rtc::AsyncSocksProxySocket* proxy_socket =
-      new rtc::AsyncSocksProxySocket(socket, kSocksProxyIntAddr,
-                                           "", rtc::CryptString());
-  // TODO: IPv6-ize these tests when proxy supports IPv6.
-
-  rtc::TestEchoServer server(Thread::Current(),
-                                   SocketAddress(INADDR_ANY, 0));
-
-  std::unique_ptr<rtc::AsyncTCPSocket> packet_socket(
-      rtc::AsyncTCPSocket::Create(proxy_socket, SocketAddress(INADDR_ANY, 0),
-                                  server.address()));
-  EXPECT_TRUE(packet_socket != nullptr);
-  rtc::TestClient client(std::move(packet_socket));
-
-  EXPECT_EQ(Socket::CS_CONNECTING, proxy_socket->GetState());
-  EXPECT_TRUE(client.CheckConnected());
-  EXPECT_EQ(Socket::CS_CONNECTED, proxy_socket->GetState());
-  EXPECT_EQ(server.address(), client.remote_address());
-  client.Send("foo", 3);
-  EXPECT_TRUE(client.CheckNextPacket("foo", 3, nullptr));
-  EXPECT_TRUE(client.CheckNoPacket());
-}
diff --git a/rtc_base/proxyinfo.cc b/rtc_base/proxyinfo.cc
deleted file mode 100644
index 8603f21..0000000
--- a/rtc_base/proxyinfo.cc
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- *  Copyright 2004 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/rtc_base/proxyinfo.h"
-
-namespace rtc {
-
-const char * ProxyToString(ProxyType proxy) {
-  const char * const PROXY_NAMES[] = { "none", "https", "socks5", "unknown" };
-  return PROXY_NAMES[proxy];
-}
-
-ProxyInfo::ProxyInfo() : type(PROXY_NONE), autodetect(false) {
-}
-ProxyInfo::~ProxyInfo() = default;
-
-} // namespace rtc
diff --git a/rtc_base/proxyinfo.h b/rtc_base/proxyinfo.h
deleted file mode 100644
index 9b70642..0000000
--- a/rtc_base/proxyinfo.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- *  Copyright 2004 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_RTC_BASE_PROXYINFO_H_
-#define WEBRTC_RTC_BASE_PROXYINFO_H_
-
-#include <string>
-#include "webrtc/rtc_base/cryptstring.h"
-#include "webrtc/rtc_base/socketaddress.h"
-
-namespace rtc {
-
-enum ProxyType {
-  PROXY_NONE,
-  PROXY_HTTPS,
-  PROXY_SOCKS5,
-  PROXY_UNKNOWN
-};
-const char * ProxyToString(ProxyType proxy);
-
-struct ProxyInfo {
-  ProxyType type;
-  SocketAddress address;
-  std::string autoconfig_url;
-  bool autodetect;
-  std::string bypass_list;
-  std::string username;
-  CryptString password;
-
-  ProxyInfo();
-  ~ProxyInfo();
-};
-
-} // namespace rtc
-
-#endif // WEBRTC_RTC_BASE_PROXYINFO_H_
diff --git a/rtc_base/proxyserver.cc b/rtc_base/proxyserver.cc
deleted file mode 100644
index c00e243..0000000
--- a/rtc_base/proxyserver.cc
+++ /dev/null
@@ -1,158 +0,0 @@
-/*
- *  Copyright 2004 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/rtc_base/proxyserver.h"
-
-#include <algorithm>
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/socketfactory.h"
-
-namespace rtc {
-
-// ProxyServer
-ProxyServer::ProxyServer(
-    SocketFactory* int_factory, const SocketAddress& int_addr,
-    SocketFactory* ext_factory, const SocketAddress& ext_ip)
-    : ext_factory_(ext_factory), ext_ip_(ext_ip.ipaddr(), 0),  // strip off port
-      server_socket_(int_factory->CreateAsyncSocket(int_addr.family(),
-                                                    SOCK_STREAM)) {
-  RTC_DCHECK(server_socket_.get() != nullptr);
-  RTC_DCHECK(int_addr.family() == AF_INET || int_addr.family() == AF_INET6);
-  server_socket_->Bind(int_addr);
-  server_socket_->Listen(5);
-  server_socket_->SignalReadEvent.connect(this, &ProxyServer::OnAcceptEvent);
-}
-
-ProxyServer::~ProxyServer() {
-  for (BindingList::iterator it = bindings_.begin();
-       it != bindings_.end(); ++it) {
-    delete (*it);
-  }
-}
-
-SocketAddress ProxyServer::GetServerAddress() {
-  return server_socket_->GetLocalAddress();
-}
-
-void ProxyServer::OnAcceptEvent(AsyncSocket* socket) {
-  RTC_DCHECK(socket);
-  RTC_DCHECK_EQ(socket, server_socket_.get());
-  AsyncSocket* int_socket = socket->Accept(nullptr);
-  AsyncProxyServerSocket* wrapped_socket = WrapSocket(int_socket);
-  AsyncSocket* ext_socket = ext_factory_->CreateAsyncSocket(ext_ip_.family(),
-                                                            SOCK_STREAM);
-  if (ext_socket) {
-    ext_socket->Bind(ext_ip_);
-    bindings_.push_back(new ProxyBinding(wrapped_socket, ext_socket));
-  } else {
-    LOG(LS_ERROR) << "Unable to create external socket on proxy accept event";
-  }
-}
-
-void ProxyServer::OnBindingDestroyed(ProxyBinding* binding) {
-  BindingList::iterator it =
-      std::find(bindings_.begin(), bindings_.end(), binding);
-  delete (*it);
-  bindings_.erase(it);
-}
-
-// ProxyBinding
-ProxyBinding::ProxyBinding(AsyncProxyServerSocket* int_socket,
-                           AsyncSocket* ext_socket)
-    : int_socket_(int_socket), ext_socket_(ext_socket), connected_(false),
-      out_buffer_(kBufferSize), in_buffer_(kBufferSize) {
-  int_socket_->SignalConnectRequest.connect(this,
-                                            &ProxyBinding::OnConnectRequest);
-  int_socket_->SignalReadEvent.connect(this, &ProxyBinding::OnInternalRead);
-  int_socket_->SignalWriteEvent.connect(this, &ProxyBinding::OnInternalWrite);
-  int_socket_->SignalCloseEvent.connect(this, &ProxyBinding::OnInternalClose);
-  ext_socket_->SignalConnectEvent.connect(this,
-                                          &ProxyBinding::OnExternalConnect);
-  ext_socket_->SignalReadEvent.connect(this, &ProxyBinding::OnExternalRead);
-  ext_socket_->SignalWriteEvent.connect(this, &ProxyBinding::OnExternalWrite);
-  ext_socket_->SignalCloseEvent.connect(this, &ProxyBinding::OnExternalClose);
-}
-
-ProxyBinding::~ProxyBinding() = default;
-
-void ProxyBinding::OnConnectRequest(AsyncProxyServerSocket* socket,
-                                   const SocketAddress& addr) {
-  RTC_DCHECK(!connected_);
-  RTC_DCHECK(ext_socket_);
-  ext_socket_->Connect(addr);
-  // TODO: handle errors here
-}
-
-void ProxyBinding::OnInternalRead(AsyncSocket* socket) {
-  Read(int_socket_.get(), &out_buffer_);
-  Write(ext_socket_.get(), &out_buffer_);
-}
-
-void ProxyBinding::OnInternalWrite(AsyncSocket* socket) {
-  Write(int_socket_.get(), &in_buffer_);
-}
-
-void ProxyBinding::OnInternalClose(AsyncSocket* socket, int err) {
-  Destroy();
-}
-
-void ProxyBinding::OnExternalConnect(AsyncSocket* socket) {
-  RTC_DCHECK(socket != nullptr);
-  connected_ = true;
-  int_socket_->SendConnectResult(0, socket->GetRemoteAddress());
-}
-
-void ProxyBinding::OnExternalRead(AsyncSocket* socket) {
-  Read(ext_socket_.get(), &in_buffer_);
-  Write(int_socket_.get(), &in_buffer_);
-}
-
-void ProxyBinding::OnExternalWrite(AsyncSocket* socket) {
-  Write(ext_socket_.get(), &out_buffer_);
-}
-
-void ProxyBinding::OnExternalClose(AsyncSocket* socket, int err) {
-  if (!connected_) {
-    int_socket_->SendConnectResult(err, SocketAddress());
-  }
-  Destroy();
-}
-
-void ProxyBinding::Read(AsyncSocket* socket, FifoBuffer* buffer) {
-  // Only read if the buffer is empty.
-  RTC_DCHECK(socket != nullptr);
-  size_t size;
-  int read;
-  if (buffer->GetBuffered(&size) && size == 0) {
-    void* p = buffer->GetWriteBuffer(&size);
-    read = socket->Recv(p, size, nullptr);
-    buffer->ConsumeWriteBuffer(std::max(read, 0));
-  }
-}
-
-void ProxyBinding::Write(AsyncSocket* socket, FifoBuffer* buffer) {
-  RTC_DCHECK(socket != nullptr);
-  size_t size;
-  int written;
-  const void* p = buffer->GetReadData(&size);
-  written = socket->Send(p, size);
-  buffer->ConsumeReadData(std::max(written, 0));
-}
-
-void ProxyBinding::Destroy() {
-  SignalDestroyed(this);
-}
-
-AsyncProxyServerSocket* SocksProxyServer::WrapSocket(AsyncSocket* socket) {
-  return new AsyncSocksProxyServerSocket(socket);
-}
-
-}  // namespace rtc
diff --git a/rtc_base/proxyserver.h b/rtc_base/proxyserver.h
deleted file mode 100644
index 218d5b3..0000000
--- a/rtc_base/proxyserver.h
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- *  Copyright 2004 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_RTC_BASE_PROXYSERVER_H_
-#define WEBRTC_RTC_BASE_PROXYSERVER_H_
-
-#include <list>
-#include <memory>
-#include "webrtc/rtc_base/asyncsocket.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/socketadapters.h"
-#include "webrtc/rtc_base/socketaddress.h"
-#include "webrtc/rtc_base/stream.h"
-
-namespace rtc {
-
-class SocketFactory;
-
-// ProxyServer is a base class that allows for easy construction of proxy
-// servers. With its helper class ProxyBinding, it contains all the necessary
-// logic for receiving and bridging connections. The specific client-server
-// proxy protocol is implemented by an instance of the AsyncProxyServerSocket
-// class; children of ProxyServer implement WrapSocket appropriately to return
-// the correct protocol handler.
-
-class ProxyBinding : public sigslot::has_slots<> {
- public:
-  ProxyBinding(AsyncProxyServerSocket* in_socket, AsyncSocket* out_socket);
-  ~ProxyBinding() override;
-  sigslot::signal1<ProxyBinding*> SignalDestroyed;
-
- private:
-  void OnConnectRequest(AsyncProxyServerSocket* socket,
-                        const SocketAddress& addr);
-  void OnInternalRead(AsyncSocket* socket);
-  void OnInternalWrite(AsyncSocket* socket);
-  void OnInternalClose(AsyncSocket* socket, int err);
-  void OnExternalConnect(AsyncSocket* socket);
-  void OnExternalRead(AsyncSocket* socket);
-  void OnExternalWrite(AsyncSocket* socket);
-  void OnExternalClose(AsyncSocket* socket, int err);
-
-  static void Read(AsyncSocket* socket, FifoBuffer* buffer);
-  static void Write(AsyncSocket* socket, FifoBuffer* buffer);
-  void Destroy();
-
-  static const int kBufferSize = 4096;
-  std::unique_ptr<AsyncProxyServerSocket> int_socket_;
-  std::unique_ptr<AsyncSocket> ext_socket_;
-  bool connected_;
-  FifoBuffer out_buffer_;
-  FifoBuffer in_buffer_;
-  RTC_DISALLOW_COPY_AND_ASSIGN(ProxyBinding);
-};
-
-class ProxyServer : public sigslot::has_slots<> {
- public:
-  ProxyServer(SocketFactory* int_factory, const SocketAddress& int_addr,
-              SocketFactory* ext_factory, const SocketAddress& ext_ip);
-  ~ProxyServer() override;
-
-  // Returns the address to which the proxy server is bound
-  SocketAddress GetServerAddress();
-
- protected:
-  void OnAcceptEvent(AsyncSocket* socket);
-  virtual AsyncProxyServerSocket* WrapSocket(AsyncSocket* socket) = 0;
-  void OnBindingDestroyed(ProxyBinding* binding);
-
- private:
-  typedef std::list<ProxyBinding*> BindingList;
-  SocketFactory* ext_factory_;
-  SocketAddress ext_ip_;
-  std::unique_ptr<AsyncSocket> server_socket_;
-  BindingList bindings_;
-  RTC_DISALLOW_COPY_AND_ASSIGN(ProxyServer);
-};
-
-// SocksProxyServer is a simple extension of ProxyServer to implement SOCKS.
-class SocksProxyServer : public ProxyServer {
- public:
-  SocksProxyServer(SocketFactory* int_factory, const SocketAddress& int_addr,
-                   SocketFactory* ext_factory, const SocketAddress& ext_ip)
-      : ProxyServer(int_factory, int_addr, ext_factory, ext_ip) {
-  }
- protected:
-  AsyncProxyServerSocket* WrapSocket(AsyncSocket* socket) override;
-  RTC_DISALLOW_COPY_AND_ASSIGN(SocksProxyServer);
-};
-
-}  // namespace rtc
-
-#endif  // WEBRTC_RTC_BASE_PROXYSERVER_H_
diff --git a/rtc_base/ptr_util.h b/rtc_base/ptr_util.h
deleted file mode 100644
index 9276133..0000000
--- a/rtc_base/ptr_util.h
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- *  Copyright 2017 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.
- */
-
-// This implementation is borrowed from chromium.
-
-#ifndef WEBRTC_RTC_BASE_PTR_UTIL_H_
-#define WEBRTC_RTC_BASE_PTR_UTIL_H_
-
-#include <memory>
-#include <utility>
-
-namespace rtc {
-
-// Helper to transfer ownership of a raw pointer to a std::unique_ptr<T>.
-// Note that std::unique_ptr<T> has very different semantics from
-// std::unique_ptr<T[]>: do not use this helper for array allocations.
-template <typename T>
-std::unique_ptr<T> WrapUnique(T* ptr) {
-  return std::unique_ptr<T>(ptr);
-}
-
-namespace internal {
-
-template <typename T>
-struct MakeUniqueResult {
-  using Scalar = std::unique_ptr<T>;
-};
-
-template <typename T>
-struct MakeUniqueResult<T[]> {
-  using Array = std::unique_ptr<T[]>;
-};
-
-template <typename T, size_t N>
-struct MakeUniqueResult<T[N]> {
-  using Invalid = void;
-};
-
-}  // namespace internal
-
-// Helper to construct an object wrapped in a std::unique_ptr. This is an
-// implementation of C++14's std::make_unique that can be used in Chrome.
-//
-// MakeUnique<T>(args) should be preferred over WrapUnique(new T(args)): bare
-// calls to `new` should be treated with scrutiny.
-//
-// Usage:
-//   // ptr is a std::unique_ptr<std::string>
-//   auto ptr = MakeUnique<std::string>("hello world!");
-//
-//   // arr is a std::unique_ptr<int[]>
-//   auto arr = MakeUnique<int[]>(5);
-
-// Overload for non-array types. Arguments are forwarded to T's constructor.
-template <typename T, typename... Args>
-typename internal::MakeUniqueResult<T>::Scalar MakeUnique(Args&&... args) {
-  return std::unique_ptr<T>(new T(std::forward<Args>(args)...));
-}
-
-// Overload for array types of unknown bound, e.g. T[]. The array is allocated
-// with `new T[n]()` and value-initialized: note that this is distinct from
-// `new T[n]`, which default-initializes.
-template <typename T>
-typename internal::MakeUniqueResult<T>::Array MakeUnique(size_t size) {
-  return std::unique_ptr<T>(new typename std::remove_extent<T>::type[size]());
-}
-
-// Overload to reject array types of known bound, e.g. T[n].
-template <typename T, typename... Args>
-typename internal::MakeUniqueResult<T>::Invalid MakeUnique(Args&&... args) =
-    delete;
-
-}  // namespace rtc
-
-#endif  // WEBRTC_RTC_BASE_PTR_UTIL_H_
diff --git a/rtc_base/ptr_util_unittest.cc b/rtc_base/ptr_util_unittest.cc
deleted file mode 100644
index 5948c39..0000000
--- a/rtc_base/ptr_util_unittest.cc
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- *  Copyright 2017 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/rtc_base/ptr_util.h"
-
-#include <stddef.h>
-#include <string>
-
-#include "webrtc/rtc_base/gunit.h"
-
-namespace rtc {
-
-namespace {
-
-class DeleteCounter {
- public:
-  DeleteCounter() { ++count_; }
-  ~DeleteCounter() { --count_; }
-
-  static size_t count() { return count_; }
-
- private:
-  static size_t count_;
-};
-
-size_t DeleteCounter::count_ = 0;
-
-}  // namespace
-
-TEST(PtrUtilTest, WrapUnique) {
-  EXPECT_EQ(0u, DeleteCounter::count());
-  DeleteCounter* counter = new DeleteCounter;
-  EXPECT_EQ(1u, DeleteCounter::count());
-  std::unique_ptr<DeleteCounter> owned_counter = WrapUnique(counter);
-  EXPECT_EQ(1u, DeleteCounter::count());
-  owned_counter.reset();
-  EXPECT_EQ(0u, DeleteCounter::count());
-}
-
-TEST(PtrUtilTest, MakeUniqueScalar) {
-  auto s = MakeUnique<std::string>();
-  EXPECT_EQ("", *s);
-
-  auto s2 = MakeUnique<std::string>("test");
-  EXPECT_EQ("test", *s2);
-}
-
-TEST(PtrUtilTest, MakeUniqueScalarWithMoveOnlyType) {
-  using MoveOnly = std::unique_ptr<std::string>;
-  auto p = MakeUnique<MoveOnly>(MakeUnique<std::string>("test"));
-  EXPECT_EQ("test", **p);
-}
-
-TEST(PtrUtilTest, MakeUniqueArray) {
-  EXPECT_EQ(0u, DeleteCounter::count());
-  auto a = MakeUnique<DeleteCounter[]>(5);
-  EXPECT_EQ(5u, DeleteCounter::count());
-  a.reset();
-  EXPECT_EQ(0u, DeleteCounter::count());
-}
-
-}  // namespace rtc
diff --git a/rtc_base/race_checker.cc b/rtc_base/race_checker.cc
deleted file mode 100644
index 93d563b..0000000
--- a/rtc_base/race_checker.cc
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- *  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/rtc_base/race_checker.h"
-
-namespace rtc {
-
-RaceChecker::RaceChecker() {}
-
-// Note that the implementation here is in itself racy, but we pretend it does
-// not matter because we want this useful in release builds without having to
-// pay the cost of using atomics. A race hitting the race checker is likely to
-// cause access_count_ to diverge from zero and therefore cause the ThreadRef
-// comparison to fail, signaling a race, although it may not be in the exact
-// spot where a race *first* appeared in the code we're trying to protect. There
-// is also a chance that an actual race is missed, however the probability of
-// that has been considered small enough to be an acceptable trade off.
-bool RaceChecker::Acquire() const {
-  const PlatformThreadRef current_thread = CurrentThreadRef();
-  // Set new accessing thread if this is a new use.
-  if (access_count_++ == 0)
-    accessing_thread_ = current_thread;
-  // If this is being used concurrently this check will fail for the second
-  // thread entering since it won't set the thread. Recursive use of checked
-  // methods are OK since the accessing thread remains the same.
-  const PlatformThreadRef accessing_thread = accessing_thread_;
-  return IsThreadRefEqual(accessing_thread, current_thread);
-}
-
-void RaceChecker::Release() const {
-  --access_count_;
-}
-
-namespace internal {
-RaceCheckerScope::RaceCheckerScope(const RaceChecker* race_checker)
-    : race_checker_(race_checker), race_check_ok_(race_checker->Acquire()) {}
-
-bool RaceCheckerScope::RaceDetected() const {
-  return !race_check_ok_;
-}
-
-RaceCheckerScope::~RaceCheckerScope() {
-  race_checker_->Release();
-}
-
-}  // namespace internal
-}  // namespace rtc
diff --git a/rtc_base/race_checker.h b/rtc_base/race_checker.h
deleted file mode 100644
index f0506c8..0000000
--- a/rtc_base/race_checker.h
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- *  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_RTC_BASE_RACE_CHECKER_H_
-#define WEBRTC_RTC_BASE_RACE_CHECKER_H_
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/platform_thread.h"
-#include "webrtc/rtc_base/thread_annotations.h"
-
-namespace rtc {
-
-namespace internal {
-class RaceCheckerScope;
-}  // namespace internal
-
-// Best-effort race-checking implementation. This primitive uses no
-// synchronization at all to be as-fast-as-possible in the non-racy case.
-class RTC_LOCKABLE RaceChecker {
- public:
-  friend class internal::RaceCheckerScope;
-  RaceChecker();
-
- private:
-  bool Acquire() const RTC_EXCLUSIVE_LOCK_FUNCTION();
-  void Release() const RTC_UNLOCK_FUNCTION();
-
-  // Volatile to prevent code being optimized away in Acquire()/Release().
-  mutable volatile int access_count_ = 0;
-  mutable volatile PlatformThreadRef accessing_thread_;
-};
-
-namespace internal {
-class RTC_SCOPED_LOCKABLE RaceCheckerScope {
- public:
-  explicit RaceCheckerScope(const RaceChecker* race_checker)
-      RTC_EXCLUSIVE_LOCK_FUNCTION(race_checker);
-
-  bool RaceDetected() const;
-  ~RaceCheckerScope() RTC_UNLOCK_FUNCTION();
-
- private:
-  const RaceChecker* const race_checker_;
-  const bool race_check_ok_;
-};
-
-class RTC_SCOPED_LOCKABLE RaceCheckerScopeDoNothing {
- public:
-  explicit RaceCheckerScopeDoNothing(const RaceChecker* race_checker)
-      RTC_EXCLUSIVE_LOCK_FUNCTION(race_checker) {}
-
-  ~RaceCheckerScopeDoNothing() RTC_UNLOCK_FUNCTION() {}
-};
-
-}  // namespace internal
-}  // namespace rtc
-
-#define RTC_CHECK_RUNS_SERIALIZED(x)               \
-  rtc::internal::RaceCheckerScope race_checker(x); \
-  RTC_CHECK(!race_checker.RaceDetected())
-
-#if RTC_DCHECK_IS_ON
-#define RTC_DCHECK_RUNS_SERIALIZED(x)              \
-  rtc::internal::RaceCheckerScope race_checker(x); \
-  RTC_DCHECK(!race_checker.RaceDetected())
-#else
-#define RTC_DCHECK_RUNS_SERIALIZED(x) \
-  rtc::internal::RaceCheckerScopeDoNothing race_checker(x)
-#endif
-
-#endif  // WEBRTC_RTC_BASE_RACE_CHECKER_H_
diff --git a/rtc_base/random.cc b/rtc_base/random.cc
deleted file mode 100644
index f6bfc08..0000000
--- a/rtc_base/random.cc
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- *  Copyright (c) 2015 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/rtc_base/random.h"
-
-#include <math.h>
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/safe_conversions.h"
-
-namespace webrtc {
-
-Random::Random(uint64_t seed) {
-  RTC_DCHECK(seed != 0x0ull);
-  state_ = seed;
-}
-
-uint32_t Random::Rand(uint32_t t) {
-  // Casting the output to 32 bits will give an almost uniform number.
-  // Pr[x=0] = (2^32-1) / (2^64-1)
-  // Pr[x=k] = 2^32 / (2^64-1) for k!=0
-  // Uniform would be Pr[x=k] = 2^32 / 2^64 for all 32-bit integers k.
-  uint32_t x = NextOutput();
-  // If x / 2^32 is uniform on [0,1), then x / 2^32 * (t+1) is uniform on
-  // the interval [0,t+1), so the integer part is uniform on [0,t].
-  uint64_t result = x * (static_cast<uint64_t>(t) + 1);
-  result >>= 32;
-  return result;
-}
-
-uint32_t Random::Rand(uint32_t low, uint32_t high) {
-  RTC_DCHECK(low <= high);
-  return Rand(high - low) + low;
-}
-
-int32_t Random::Rand(int32_t low, int32_t high) {
-  RTC_DCHECK(low <= high);
-  const int64_t low_i64{low};
-  return rtc::dchecked_cast<int32_t>(
-      Rand(rtc::dchecked_cast<uint32_t>(high - low_i64)) + low_i64);
-}
-
-template <>
-float Random::Rand<float>() {
-  double result = NextOutput() - 1;
-  result = result / 0xFFFFFFFFFFFFFFFEull;
-  return static_cast<float>(result);
-}
-
-template <>
-double Random::Rand<double>() {
-  double result = NextOutput() - 1;
-  result = result / 0xFFFFFFFFFFFFFFFEull;
-  return result;
-}
-
-template <>
-bool Random::Rand<bool>() {
-  return Rand(0, 1) == 1;
-}
-
-double Random::Gaussian(double mean, double standard_deviation) {
-  // Creating a Normal distribution variable from two independent uniform
-  // variables based on the Box-Muller transform, which is defined on the
-  // interval (0, 1]. Note that we rely on NextOutput to generate integers
-  // in the range [1, 2^64-1]. Normally this behavior is a bit frustrating,
-  // but here it is exactly what we need.
-  const double kPi = 3.14159265358979323846;
-  double u1 = static_cast<double>(NextOutput()) / 0xFFFFFFFFFFFFFFFFull;
-  double u2 = static_cast<double>(NextOutput()) / 0xFFFFFFFFFFFFFFFFull;
-  return mean + standard_deviation * sqrt(-2 * log(u1)) * cos(2 * kPi * u2);
-}
-
-double Random::Exponential(double lambda) {
-  double uniform = Rand<double>();
-  return -log(uniform) / lambda;
-}
-
-}  // namespace webrtc
diff --git a/rtc_base/random.h b/rtc_base/random.h
deleted file mode 100644
index 1ee6e74..0000000
--- a/rtc_base/random.h
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- *  Copyright (c) 2015 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_RTC_BASE_RANDOM_H_
-#define WEBRTC_RTC_BASE_RANDOM_H_
-
-#include <limits>
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-class Random {
- public:
-  // TODO(tommi): Change this so that the seed can be initialized internally,
-  // e.g. by offering two ways of constructing or offer a static method that
-  // returns a seed that's suitable for initialization.
-  // The problem now is that callers are calling clock_->TimeInMicroseconds()
-  // which calls TickTime::Now().Ticks(), which can return a very low value on
-  // Mac and can result in a seed of 0 after conversion to microseconds.
-  // Besides the quality of the random seed being poor, this also requires
-  // the client to take on extra dependencies to generate a seed.
-  // If we go for a static seed generator in Random, we can use something from
-  // webrtc/rtc_base and make sure that it works the same way across platforms.
-  // See also discussion here: https://codereview.webrtc.org/1623543002/
-  explicit Random(uint64_t seed);
-
-  // Return pseudo-random integer of the specified type.
-  // We need to limit the size to 32 bits to keep the output close to uniform.
-  template <typename T>
-  T Rand() {
-    static_assert(std::numeric_limits<T>::is_integer &&
-                      std::numeric_limits<T>::radix == 2 &&
-                      std::numeric_limits<T>::digits <= 32,
-                  "Rand is only supported for built-in integer types that are "
-                  "32 bits or smaller.");
-    return static_cast<T>(NextOutput());
-  }
-
-  // Uniformly distributed pseudo-random number in the interval [0, t].
-  uint32_t Rand(uint32_t t);
-
-  // Uniformly distributed pseudo-random number in the interval [low, high].
-  uint32_t Rand(uint32_t low, uint32_t high);
-
-  // Uniformly distributed pseudo-random number in the interval [low, high].
-  int32_t Rand(int32_t low, int32_t high);
-
-  // Normal Distribution.
-  double Gaussian(double mean, double standard_deviation);
-
-  // Exponential Distribution.
-  double Exponential(double lambda);
-
- private:
-  // Outputs a nonzero 64-bit random number.
-  uint64_t NextOutput() {
-    state_ ^= state_ >> 12;
-    state_ ^= state_ << 25;
-    state_ ^= state_ >> 27;
-    RTC_DCHECK(state_ != 0x0ULL);
-    return state_ * 2685821657736338717ull;
-  }
-
-  uint64_t state_;
-
-  RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(Random);
-};
-
-// Return pseudo-random number in the interval [0.0, 1.0).
-template <>
-float Random::Rand<float>();
-
-// Return pseudo-random number in the interval [0.0, 1.0).
-template <>
-double Random::Rand<double>();
-
-// Return pseudo-random boolean value.
-template <>
-bool Random::Rand<bool>();
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_RTC_BASE_RANDOM_H_
diff --git a/rtc_base/random_unittest.cc b/rtc_base/random_unittest.cc
deleted file mode 100644
index 12d17ad..0000000
--- a/rtc_base/random_unittest.cc
+++ /dev/null
@@ -1,303 +0,0 @@
-/*
- *  Copyright (c) 2015 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 <math.h>
-
-#include <limits>
-#include <vector>
-
-#include "webrtc/rtc_base/mathutils.h"  // unsigned difference
-#include "webrtc/rtc_base/random.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-namespace {
-// Computes the positive remainder of x/n.
-template <typename T>
-T fdiv_remainder(T x, T n) {
-  RTC_CHECK_GE(n, 0);
-  T remainder = x % n;
-  if (remainder < 0)
-    remainder += n;
-  return remainder;
-}
-}  // namespace
-
-// Sample a number of random integers of type T. Divide them into buckets
-// based on the remainder when dividing by bucket_count and check that each
-// bucket gets roughly the expected number of elements.
-template <typename T>
-void UniformBucketTest(T bucket_count, int samples, Random* prng) {
-  std::vector<int> buckets(bucket_count, 0);
-
-  uint64_t total_values = 1ull << (std::numeric_limits<T>::digits +
-                                   std::numeric_limits<T>::is_signed);
-  T upper_limit =
-      std::numeric_limits<T>::max() -
-      static_cast<T>(total_values % static_cast<uint64_t>(bucket_count));
-  ASSERT_GT(upper_limit, std::numeric_limits<T>::max() / 2);
-
-  for (int i = 0; i < samples; i++) {
-    T sample;
-    do {
-      // We exclude a few numbers from the range so that it is divisible by
-      // the number of buckets. If we are unlucky and hit one of the excluded
-      // numbers we just resample. Note that if the number of buckets is a
-      // power of 2, then we don't have to exclude anything.
-      sample = prng->Rand<T>();
-    } while (sample > upper_limit);
-    buckets[fdiv_remainder(sample, bucket_count)]++;
-  }
-
-  for (T i = 0; i < bucket_count; i++) {
-    // Expect the result to be within 3 standard deviations of the mean.
-    EXPECT_NEAR(buckets[i], samples / bucket_count,
-                3 * sqrt(samples / bucket_count));
-  }
-}
-
-TEST(RandomNumberGeneratorTest, BucketTestSignedChar) {
-  Random prng(7297352569824ull);
-  UniformBucketTest<signed char>(64, 640000, &prng);
-  UniformBucketTest<signed char>(11, 440000, &prng);
-  UniformBucketTest<signed char>(3, 270000, &prng);
-}
-
-TEST(RandomNumberGeneratorTest, BucketTestUnsignedChar) {
-  Random prng(7297352569824ull);
-  UniformBucketTest<unsigned char>(64, 640000, &prng);
-  UniformBucketTest<unsigned char>(11, 440000, &prng);
-  UniformBucketTest<unsigned char>(3, 270000, &prng);
-}
-
-TEST(RandomNumberGeneratorTest, BucketTestSignedShort) {
-  Random prng(7297352569824ull);
-  UniformBucketTest<int16_t>(64, 640000, &prng);
-  UniformBucketTest<int16_t>(11, 440000, &prng);
-  UniformBucketTest<int16_t>(3, 270000, &prng);
-}
-
-TEST(RandomNumberGeneratorTest, BucketTestUnsignedShort) {
-  Random prng(7297352569824ull);
-  UniformBucketTest<uint16_t>(64, 640000, &prng);
-  UniformBucketTest<uint16_t>(11, 440000, &prng);
-  UniformBucketTest<uint16_t>(3, 270000, &prng);
-}
-
-TEST(RandomNumberGeneratorTest, BucketTestSignedInt) {
-  Random prng(7297352569824ull);
-  UniformBucketTest<signed int>(64, 640000, &prng);
-  UniformBucketTest<signed int>(11, 440000, &prng);
-  UniformBucketTest<signed int>(3, 270000, &prng);
-}
-
-TEST(RandomNumberGeneratorTest, BucketTestUnsignedInt) {
-  Random prng(7297352569824ull);
-  UniformBucketTest<unsigned int>(64, 640000, &prng);
-  UniformBucketTest<unsigned int>(11, 440000, &prng);
-  UniformBucketTest<unsigned int>(3, 270000, &prng);
-}
-
-// The range of the random numbers is divided into bucket_count intervals
-// of consecutive numbers. Check that approximately equally many numbers
-// from each inteval are generated.
-void BucketTestSignedInterval(unsigned int bucket_count,
-                              unsigned int samples,
-                              int32_t low,
-                              int32_t high,
-                              int sigma_level,
-                              Random* prng) {
-  std::vector<unsigned int> buckets(bucket_count, 0);
-
-  ASSERT_GE(high, low);
-  ASSERT_GE(bucket_count, 2u);
-  uint32_t interval = unsigned_difference<int32_t>(high, low) + 1;
-  uint32_t numbers_per_bucket;
-  if (interval == 0) {
-    // The computation high - low + 1 should be 2^32 but overflowed
-    // Hence, bucket_count must be a power of 2
-    ASSERT_EQ(bucket_count & (bucket_count - 1), 0u);
-    numbers_per_bucket = (0x80000000u / bucket_count) * 2;
-  } else {
-    ASSERT_EQ(interval % bucket_count, 0u);
-    numbers_per_bucket = interval / bucket_count;
-  }
-
-  for (unsigned int i = 0; i < samples; i++) {
-    int32_t sample = prng->Rand(low, high);
-    EXPECT_LE(low, sample);
-    EXPECT_GE(high, sample);
-    buckets[unsigned_difference<int32_t>(sample, low) / numbers_per_bucket]++;
-  }
-
-  for (unsigned int i = 0; i < bucket_count; i++) {
-    // Expect the result to be within 3 standard deviations of the mean,
-    // or more generally, within sigma_level standard deviations of the mean.
-    double mean = static_cast<double>(samples) / bucket_count;
-    EXPECT_NEAR(buckets[i], mean, sigma_level * sqrt(mean));
-  }
-}
-
-// The range of the random numbers is divided into bucket_count intervals
-// of consecutive numbers. Check that approximately equally many numbers
-// from each inteval are generated.
-void BucketTestUnsignedInterval(unsigned int bucket_count,
-                                unsigned int samples,
-                                uint32_t low,
-                                uint32_t high,
-                                int sigma_level,
-                                Random* prng) {
-  std::vector<unsigned int> buckets(bucket_count, 0);
-
-  ASSERT_GE(high, low);
-  ASSERT_GE(bucket_count, 2u);
-  uint32_t interval = high - low + 1;
-  uint32_t numbers_per_bucket;
-  if (interval == 0) {
-    // The computation high - low + 1 should be 2^32 but overflowed
-    // Hence, bucket_count must be a power of 2
-    ASSERT_EQ(bucket_count & (bucket_count - 1), 0u);
-    numbers_per_bucket = (0x80000000u / bucket_count) * 2;
-  } else {
-    ASSERT_EQ(interval % bucket_count, 0u);
-    numbers_per_bucket = interval / bucket_count;
-  }
-
-  for (unsigned int i = 0; i < samples; i++) {
-    uint32_t sample = prng->Rand(low, high);
-    EXPECT_LE(low, sample);
-    EXPECT_GE(high, sample);
-    buckets[(sample - low) / numbers_per_bucket]++;
-  }
-
-  for (unsigned int i = 0; i < bucket_count; i++) {
-    // Expect the result to be within 3 standard deviations of the mean,
-    // or more generally, within sigma_level standard deviations of the mean.
-    double mean = static_cast<double>(samples) / bucket_count;
-    EXPECT_NEAR(buckets[i], mean, sigma_level * sqrt(mean));
-  }
-}
-
-TEST(RandomNumberGeneratorTest, UniformUnsignedInterval) {
-  Random prng(299792458ull);
-  BucketTestUnsignedInterval(2, 100000, 0, 1, 3, &prng);
-  BucketTestUnsignedInterval(7, 100000, 1, 14, 3, &prng);
-  BucketTestUnsignedInterval(11, 100000, 1000, 1010, 3, &prng);
-  BucketTestUnsignedInterval(100, 100000, 0, 99, 3, &prng);
-  BucketTestUnsignedInterval(2, 100000, 0, 4294967295, 3, &prng);
-  BucketTestUnsignedInterval(17, 100000, 455, 2147484110, 3, &prng);
-  // 99.7% of all samples will be within 3 standard deviations of the mean,
-  // but since we test 1000 buckets we allow an interval of 4 sigma.
-  BucketTestUnsignedInterval(1000, 1000000, 0, 2147483999, 4, &prng);
-}
-
-TEST(RandomNumberGeneratorTest, UniformSignedInterval) {
-  Random prng(66260695729ull);
-  BucketTestSignedInterval(2, 100000, 0, 1, 3, &prng);
-  BucketTestSignedInterval(7, 100000, -2, 4, 3, &prng);
-  BucketTestSignedInterval(11, 100000, 1000, 1010, 3, &prng);
-  BucketTestSignedInterval(100, 100000, 0, 99, 3, &prng);
-  BucketTestSignedInterval(2, 100000, std::numeric_limits<int32_t>::min(),
-                           std::numeric_limits<int32_t>::max(), 3, &prng);
-  BucketTestSignedInterval(17, 100000, -1073741826, 1073741829, 3, &prng);
-  // 99.7% of all samples will be within 3 standard deviations of the mean,
-  // but since we test 1000 buckets we allow an interval of 4 sigma.
-  BucketTestSignedInterval(1000, 1000000, -352, 2147483647, 4, &prng);
-}
-
-// The range of the random numbers is divided into bucket_count intervals
-// of consecutive numbers. Check that approximately equally many numbers
-// from each inteval are generated.
-void BucketTestFloat(unsigned int bucket_count,
-                     unsigned int samples,
-                     int sigma_level,
-                     Random* prng) {
-  ASSERT_GE(bucket_count, 2u);
-  std::vector<unsigned int> buckets(bucket_count, 0);
-
-  for (unsigned int i = 0; i < samples; i++) {
-    uint32_t sample = bucket_count * prng->Rand<float>();
-    EXPECT_LE(0u, sample);
-    EXPECT_GE(bucket_count - 1, sample);
-    buckets[sample]++;
-  }
-
-  for (unsigned int i = 0; i < bucket_count; i++) {
-    // Expect the result to be within 3 standard deviations of the mean,
-    // or more generally, within sigma_level standard deviations of the mean.
-    double mean = static_cast<double>(samples) / bucket_count;
-    EXPECT_NEAR(buckets[i], mean, sigma_level * sqrt(mean));
-  }
-}
-
-TEST(RandomNumberGeneratorTest, UniformFloatInterval) {
-  Random prng(1380648813ull);
-  BucketTestFloat(100, 100000, 3, &prng);
-  // 99.7% of all samples will be within 3 standard deviations of the mean,
-  // but since we test 1000 buckets we allow an interval of 4 sigma.
-  // BucketTestSignedInterval(1000, 1000000, -352, 2147483647, 4, &prng);
-}
-
-TEST(RandomNumberGeneratorTest, SignedHasSameBitPattern) {
-  Random prng_signed(66738480ull), prng_unsigned(66738480ull);
-
-  for (int i = 0; i < 1000; i++) {
-    signed int s = prng_signed.Rand<signed int>();
-    unsigned int u = prng_unsigned.Rand<unsigned int>();
-    EXPECT_EQ(u, static_cast<unsigned int>(s));
-  }
-
-  for (int i = 0; i < 1000; i++) {
-    int16_t s = prng_signed.Rand<int16_t>();
-    uint16_t u = prng_unsigned.Rand<uint16_t>();
-    EXPECT_EQ(u, static_cast<uint16_t>(s));
-  }
-
-  for (int i = 0; i < 1000; i++) {
-    signed char s = prng_signed.Rand<signed char>();
-    unsigned char u = prng_unsigned.Rand<unsigned char>();
-    EXPECT_EQ(u, static_cast<unsigned char>(s));
-  }
-}
-
-TEST(RandomNumberGeneratorTest, Gaussian) {
-  const int kN = 100000;
-  const int kBuckets = 100;
-  const double kMean = 49;
-  const double kStddev = 10;
-
-  Random prng(1256637061);
-
-  std::vector<unsigned int> buckets(kBuckets, 0);
-  for (int i = 0; i < kN; i++) {
-    int index = prng.Gaussian(kMean, kStddev) + 0.5;
-    if (index >= 0 && index < kBuckets) {
-      buckets[index]++;
-    }
-  }
-
-  const double kPi = 3.14159265358979323846;
-  const double kScale = 1 / (kStddev * sqrt(2.0 * kPi));
-  const double kDiv = -2.0 * kStddev * kStddev;
-  for (int n = 0; n < kBuckets; ++n) {
-    // Use Simpsons rule to estimate the probability that a random gaussian
-    // sample is in the interval [n-0.5, n+0.5].
-    double f_left = kScale * exp((n - kMean - 0.5) * (n - kMean - 0.5) / kDiv);
-    double f_mid = kScale * exp((n - kMean) * (n - kMean) / kDiv);
-    double f_right = kScale * exp((n - kMean + 0.5) * (n - kMean + 0.5) / kDiv);
-    double normal_dist = (f_left + 4 * f_mid + f_right) / 6;
-    // Expect the number of samples to be within 3 standard deviations
-    // (rounded up) of the expected number of samples in the bucket.
-    EXPECT_NEAR(buckets[n], kN * normal_dist, 3 * sqrt(kN * normal_dist) + 1);
-  }
-}
-
-}  // namespace webrtc
diff --git a/rtc_base/rate_limiter.cc b/rtc_base/rate_limiter.cc
deleted file mode 100644
index b2ee2c0..0000000
--- a/rtc_base/rate_limiter.cc
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- *  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/rtc_base/rate_limiter.h"
-#include "webrtc/system_wrappers/include/clock.h"
-
-namespace webrtc {
-
-RateLimiter::RateLimiter(const Clock* clock, int64_t max_window_ms)
-    : clock_(clock),
-      current_rate_(max_window_ms, RateStatistics::kBpsScale),
-      window_size_ms_(max_window_ms),
-      max_rate_bps_(std::numeric_limits<uint32_t>::max()) {}
-
-RateLimiter::~RateLimiter() {}
-
-// Usage note: This class is intended be usable in a scenario where different
-// threads may call each of the the different method. For instance, a network
-// thread trying to send data calling TryUseRate(), the bandwidth estimator
-// calling SetMaxRate() and a timed maintenance thread periodically updating
-// the RTT.
-bool RateLimiter::TryUseRate(size_t packet_size_bytes) {
-  rtc::CritScope cs(&lock_);
-  int64_t now_ms = clock_->TimeInMilliseconds();
-  rtc::Optional<uint32_t> current_rate = current_rate_.Rate(now_ms);
-  if (current_rate) {
-    // If there is a current rate, check if adding bytes would cause maximum
-    // bitrate target to be exceeded. If there is NOT a valid current rate,
-    // allow allocating rate even if target is exceeded. This prevents
-    // problems
-    // at very low rates, where for instance retransmissions would never be
-    // allowed due to too high bitrate caused by a single packet.
-
-    size_t bitrate_addition_bps =
-        (packet_size_bytes * 8 * 1000) / window_size_ms_;
-    if (*current_rate + bitrate_addition_bps > max_rate_bps_)
-      return false;
-  }
-
-  current_rate_.Update(packet_size_bytes, now_ms);
-  return true;
-}
-
-void RateLimiter::SetMaxRate(uint32_t max_rate_bps) {
-  rtc::CritScope cs(&lock_);
-  max_rate_bps_ = max_rate_bps;
-}
-
-// Set the window size over which to measure the current bitrate.
-// For retransmissions, this is typically the RTT.
-bool RateLimiter::SetWindowSize(int64_t window_size_ms) {
-  rtc::CritScope cs(&lock_);
-  window_size_ms_ = window_size_ms;
-  return current_rate_.SetWindowSize(window_size_ms,
-                                     clock_->TimeInMilliseconds());
-}
-
-}  // namespace webrtc
diff --git a/rtc_base/rate_limiter.h b/rtc_base/rate_limiter.h
deleted file mode 100644
index e3f6249..0000000
--- a/rtc_base/rate_limiter.h
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- *  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_RTC_BASE_RATE_LIMITER_H_
-#define WEBRTC_RTC_BASE_RATE_LIMITER_H_
-
-#include <limits>
-
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/rate_statistics.h"
-
-namespace webrtc {
-
-class Clock;
-
-// Class used to limit a bitrate, making sure the average does not exceed a
-// maximum as measured over a sliding window. This class is thread safe; all
-// methods will acquire (the same) lock befeore executing.
-class RateLimiter {
- public:
-  RateLimiter(const Clock* clock, int64_t max_window_ms);
-  ~RateLimiter();
-
-  // Try to use rate to send bytes. Returns true on success and if so updates
-  // current rate.
-  bool TryUseRate(size_t packet_size_bytes);
-
-  // Set the maximum bitrate, in bps, that this limiter allows to send.
-  void SetMaxRate(uint32_t max_rate_bps);
-
-  // Set the window size over which to measure the current bitrate.
-  // For example, irt retransmissions, this is typically the RTT.
-  // Returns true on success and false if window_size_ms is out of range.
-  bool SetWindowSize(int64_t window_size_ms);
-
- private:
-  const Clock* const clock_;
-  rtc::CriticalSection lock_;
-  RateStatistics current_rate_ RTC_GUARDED_BY(lock_);
-  int64_t window_size_ms_ RTC_GUARDED_BY(lock_);
-  uint32_t max_rate_bps_ RTC_GUARDED_BY(lock_);
-
-  RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(RateLimiter);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_RTC_BASE_RATE_LIMITER_H_
diff --git a/rtc_base/rate_limiter_unittest.cc b/rtc_base/rate_limiter_unittest.cc
deleted file mode 100644
index 6478399..0000000
--- a/rtc_base/rate_limiter_unittest.cc
+++ /dev/null
@@ -1,203 +0,0 @@
-/*
- *  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 <algorithm>
-#include <memory>
-
-#include "webrtc/rtc_base/event.h"
-#include "webrtc/rtc_base/platform_thread.h"
-#include "webrtc/rtc_base/rate_limiter.h"
-#include "webrtc/rtc_base/task_queue.h"
-#include "webrtc/system_wrappers/include/clock.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-class RateLimitTest : public ::testing::Test {
- public:
-  RateLimitTest()
-      : clock_(0), rate_limiter(new RateLimiter(&clock_, kWindowSizeMs)) {}
-  ~RateLimitTest() override {}
-
-  void SetUp() override { rate_limiter->SetMaxRate(kMaxRateBps); }
-
- protected:
-  static constexpr int64_t kWindowSizeMs = 1000;
-  static constexpr uint32_t kMaxRateBps = 100000;
-  // Bytes needed to completely saturate the rate limiter.
-  static constexpr size_t kRateFillingBytes =
-      (kMaxRateBps * kWindowSizeMs) / (8 * 1000);
-  SimulatedClock clock_;
-  std::unique_ptr<RateLimiter> rate_limiter;
-};
-
-TEST_F(RateLimitTest, IncreasingMaxRate) {
-  // Fill rate, extend window to full size.
-  EXPECT_TRUE(rate_limiter->TryUseRate(kRateFillingBytes / 2));
-  clock_.AdvanceTimeMilliseconds(kWindowSizeMs - 1);
-  EXPECT_TRUE(rate_limiter->TryUseRate(kRateFillingBytes / 2));
-
-  // All rate consumed.
-  EXPECT_FALSE(rate_limiter->TryUseRate(1));
-
-  // Double the available rate and fill that too.
-  rate_limiter->SetMaxRate(kMaxRateBps * 2);
-  EXPECT_TRUE(rate_limiter->TryUseRate(kRateFillingBytes));
-
-  // All rate consumed again.
-  EXPECT_FALSE(rate_limiter->TryUseRate(1));
-}
-
-TEST_F(RateLimitTest, DecreasingMaxRate) {
-  // Fill rate, extend window to full size.
-  EXPECT_TRUE(rate_limiter->TryUseRate(kRateFillingBytes / 2));
-  clock_.AdvanceTimeMilliseconds(kWindowSizeMs - 1);
-  EXPECT_TRUE(rate_limiter->TryUseRate(kRateFillingBytes / 2));
-
-  // All rate consumed.
-  EXPECT_FALSE(rate_limiter->TryUseRate(1));
-
-  // Halve the available rate and move window so half of the data falls out.
-  rate_limiter->SetMaxRate(kMaxRateBps / 2);
-  clock_.AdvanceTimeMilliseconds(1);
-
-  // All rate still consumed.
-  EXPECT_FALSE(rate_limiter->TryUseRate(1));
-}
-
-TEST_F(RateLimitTest, ChangingWindowSize) {
-  // Fill rate, extend window to full size.
-  EXPECT_TRUE(rate_limiter->TryUseRate(kRateFillingBytes / 2));
-  clock_.AdvanceTimeMilliseconds(kWindowSizeMs - 1);
-  EXPECT_TRUE(rate_limiter->TryUseRate(kRateFillingBytes / 2));
-
-  // All rate consumed.
-  EXPECT_FALSE(rate_limiter->TryUseRate(1));
-
-  // Decrease window size so half of the data falls out.
-  rate_limiter->SetWindowSize(kWindowSizeMs / 2);
-  // Average rate should still be the same, so rate is still all consumed.
-  EXPECT_FALSE(rate_limiter->TryUseRate(1));
-
-  // Increase window size again. Now the rate is only half used (removed data
-  // points don't come back to life).
-  rate_limiter->SetWindowSize(kWindowSizeMs);
-  EXPECT_TRUE(rate_limiter->TryUseRate(kRateFillingBytes / 2));
-
-  // All rate consumed again.
-  EXPECT_FALSE(rate_limiter->TryUseRate(1));
-}
-
-TEST_F(RateLimitTest, SingleUsageAlwaysOk) {
-  // Using more bytes than can fit in a window is OK for a single packet.
-  EXPECT_TRUE(rate_limiter->TryUseRate(kRateFillingBytes + 1));
-}
-
-TEST_F(RateLimitTest, WindowSizeLimits) {
-  EXPECT_TRUE(rate_limiter->SetWindowSize(1));
-  EXPECT_FALSE(rate_limiter->SetWindowSize(0));
-  EXPECT_TRUE(rate_limiter->SetWindowSize(kWindowSizeMs));
-  EXPECT_FALSE(rate_limiter->SetWindowSize(kWindowSizeMs + 1));
-}
-
-static const int64_t kMaxTimeoutMs = 30000;
-
-class ThreadTask {
- public:
-  explicit ThreadTask(RateLimiter* rate_limiter)
-      : rate_limiter_(rate_limiter),
-        start_signal_(false, false),
-        end_signal_(false, false) {}
-  virtual ~ThreadTask() {}
-
-  void Run() {
-    start_signal_.Wait(kMaxTimeoutMs);
-    DoRun();
-    end_signal_.Set();
-  }
-
-  virtual void DoRun() = 0;
-
-  RateLimiter* const rate_limiter_;
-  rtc::Event start_signal_;
-  rtc::Event end_signal_;
-};
-
-void RunTask(void* thread_task) {
-  reinterpret_cast<ThreadTask*>(thread_task)->Run();
-}
-
-TEST_F(RateLimitTest, MultiThreadedUsage) {
-  // Simple sanity test, with different threads calling the various methods.
-  // Runs a few simple tasks, each on its own thread, but coordinated with
-  // events so that they run in a serialized order. Intended to catch data
-  // races when run with tsan et al.
-
-  // Half window size, double rate -> same amount of bytes needed to fill rate.
-
-  class SetWindowSizeTask : public ThreadTask {
-   public:
-    explicit SetWindowSizeTask(RateLimiter* rate_limiter)
-        : ThreadTask(rate_limiter) {}
-    ~SetWindowSizeTask() override {}
-
-    void DoRun() override {
-      EXPECT_TRUE(rate_limiter_->SetWindowSize(kWindowSizeMs / 2));
-    }
-  } set_window_size_task(rate_limiter.get());
-  rtc::PlatformThread thread1(RunTask, &set_window_size_task, "Thread1");
-  thread1.Start();
-
-  class SetMaxRateTask : public ThreadTask {
-   public:
-    explicit SetMaxRateTask(RateLimiter* rate_limiter)
-        : ThreadTask(rate_limiter) {}
-    ~SetMaxRateTask() override {}
-
-    void DoRun() override { rate_limiter_->SetMaxRate(kMaxRateBps * 2); }
-  } set_max_rate_task(rate_limiter.get());
-  rtc::PlatformThread thread2(RunTask, &set_max_rate_task, "Thread2");
-  thread2.Start();
-
-  class UseRateTask : public ThreadTask {
-   public:
-    UseRateTask(RateLimiter* rate_limiter, SimulatedClock* clock)
-        : ThreadTask(rate_limiter), clock_(clock) {}
-    ~UseRateTask() override {}
-
-    void DoRun() override {
-      EXPECT_TRUE(rate_limiter_->TryUseRate(kRateFillingBytes / 2));
-      clock_->AdvanceTimeMilliseconds((kWindowSizeMs / 2) - 1);
-      EXPECT_TRUE(rate_limiter_->TryUseRate(kRateFillingBytes / 2));
-    }
-
-    SimulatedClock* const clock_;
-  } use_rate_task(rate_limiter.get(), &clock_);
-  rtc::PlatformThread thread3(RunTask, &use_rate_task, "Thread3");
-  thread3.Start();
-
-  set_window_size_task.start_signal_.Set();
-  EXPECT_TRUE(set_window_size_task.end_signal_.Wait(kMaxTimeoutMs));
-
-  set_max_rate_task.start_signal_.Set();
-  EXPECT_TRUE(set_max_rate_task.end_signal_.Wait(kMaxTimeoutMs));
-
-  use_rate_task.start_signal_.Set();
-  EXPECT_TRUE(use_rate_task.end_signal_.Wait(kMaxTimeoutMs));
-
-  // All rate consumed.
-  EXPECT_FALSE(rate_limiter->TryUseRate(1));
-
-  thread1.Stop();
-  thread2.Stop();
-  thread3.Stop();
-}
-
-}  // namespace webrtc
diff --git a/rtc_base/rate_statistics.cc b/rtc_base/rate_statistics.cc
deleted file mode 100644
index a218540..0000000
--- a/rtc_base/rate_statistics.cc
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- *  Copyright (c) 2013 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/rtc_base/rate_statistics.h"
-
-#include <algorithm>
-
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-
-RateStatistics::RateStatistics(int64_t window_size_ms, float scale)
-    : buckets_(new Bucket[window_size_ms]()),
-      accumulated_count_(0),
-      num_samples_(0),
-      oldest_time_(-window_size_ms),
-      oldest_index_(0),
-      scale_(scale),
-      max_window_size_ms_(window_size_ms),
-      current_window_size_ms_(max_window_size_ms_) {}
-
-RateStatistics::~RateStatistics() {}
-
-void RateStatistics::Reset() {
-  accumulated_count_ = 0;
-  num_samples_ = 0;
-  oldest_time_ = -max_window_size_ms_;
-  oldest_index_ = 0;
-  current_window_size_ms_ = max_window_size_ms_;
-  for (int64_t i = 0; i < max_window_size_ms_; i++)
-    buckets_[i] = Bucket();
-}
-
-void RateStatistics::Update(size_t count, int64_t now_ms) {
-  if (now_ms < oldest_time_) {
-    // Too old data is ignored.
-    return;
-  }
-
-  EraseOld(now_ms);
-
-  // First ever sample, reset window to start now.
-  if (!IsInitialized())
-    oldest_time_ = now_ms;
-
-  uint32_t now_offset = static_cast<uint32_t>(now_ms - oldest_time_);
-  RTC_DCHECK_LT(now_offset, max_window_size_ms_);
-  uint32_t index = oldest_index_ + now_offset;
-  if (index >= max_window_size_ms_)
-    index -= max_window_size_ms_;
-  buckets_[index].sum += count;
-  ++buckets_[index].samples;
-  accumulated_count_ += count;
-  ++num_samples_;
-}
-
-rtc::Optional<uint32_t> RateStatistics::Rate(int64_t now_ms) const {
-  // Yeah, this const_cast ain't pretty, but the alternative is to declare most
-  // of the members as mutable...
-  const_cast<RateStatistics*>(this)->EraseOld(now_ms);
-
-  // If window is a single bucket or there is only one sample in a data set that
-  // has not grown to the full window size, treat this as rate unavailable.
-  int64_t active_window_size = now_ms - oldest_time_ + 1;
-  if (num_samples_ == 0 || active_window_size <= 1 ||
-      (num_samples_ <= 1 && active_window_size < current_window_size_ms_)) {
-    return rtc::Optional<uint32_t>();
-  }
-
-  float scale = scale_ / active_window_size;
-  return rtc::Optional<uint32_t>(
-      static_cast<uint32_t>(accumulated_count_ * scale + 0.5f));
-}
-
-void RateStatistics::EraseOld(int64_t now_ms) {
-  if (!IsInitialized())
-    return;
-
-  // New oldest time that is included in data set.
-  int64_t new_oldest_time = now_ms - current_window_size_ms_ + 1;
-
-  // New oldest time is older than the current one, no need to cull data.
-  if (new_oldest_time <= oldest_time_)
-    return;
-
-  // Loop over buckets and remove too old data points.
-  while (num_samples_ > 0 && oldest_time_ < new_oldest_time) {
-    const Bucket& oldest_bucket = buckets_[oldest_index_];
-    RTC_DCHECK_GE(accumulated_count_, oldest_bucket.sum);
-    RTC_DCHECK_GE(num_samples_, oldest_bucket.samples);
-    accumulated_count_ -= oldest_bucket.sum;
-    num_samples_ -= oldest_bucket.samples;
-    buckets_[oldest_index_] = Bucket();
-    if (++oldest_index_ >= max_window_size_ms_)
-      oldest_index_ = 0;
-    ++oldest_time_;
-  }
-  oldest_time_ = new_oldest_time;
-}
-
-bool RateStatistics::SetWindowSize(int64_t window_size_ms, int64_t now_ms) {
-  if (window_size_ms <= 0 || window_size_ms > max_window_size_ms_)
-    return false;
-
-  current_window_size_ms_ = window_size_ms;
-  EraseOld(now_ms);
-  return true;
-}
-
-bool RateStatistics::IsInitialized() const {
-  return oldest_time_ != -max_window_size_ms_;
-}
-
-}  // namespace webrtc
diff --git a/rtc_base/rate_statistics.h b/rtc_base/rate_statistics.h
deleted file mode 100644
index 87f6c35..0000000
--- a/rtc_base/rate_statistics.h
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- *  Copyright (c) 2013 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_RTC_BASE_RATE_STATISTICS_H_
-#define WEBRTC_RTC_BASE_RATE_STATISTICS_H_
-
-#include <memory>
-
-#include "webrtc/api/optional.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-class RateStatistics {
- public:
-  static constexpr float kBpsScale = 8000.0f;
-
-  // max_window_size_ms = Maximum window size in ms for the rate estimation.
-  //                      Initial window size is set to this, but may be changed
-  //                      to something lower by calling SetWindowSize().
-  // scale = coefficient to convert counts/ms to desired unit
-  //         ex: kBpsScale (8000) for bits/s if count represents bytes.
-  RateStatistics(int64_t max_window_size_ms, float scale);
-  ~RateStatistics();
-
-  // Reset instance to original state.
-  void Reset();
-
-  // Update rate with a new data point, moving averaging window as needed.
-  void Update(size_t count, int64_t now_ms);
-
-  // Note that despite this being a const method, it still updates the internal
-  // state (moves averaging window), but it doesn't make any alterations that
-  // are observable from the other methods, as long as supplied timestamps are
-  // from a monotonic clock. Ie, it doesn't matter if this call moves the
-  // window, since any subsequent call to Update or Rate would still have moved
-  // the window as much or more.
-  rtc::Optional<uint32_t> Rate(int64_t now_ms) const;
-
-  // Update the size of the averaging window. The maximum allowed value for
-  // window_size_ms is max_window_size_ms as supplied in the constructor.
-  bool SetWindowSize(int64_t window_size_ms, int64_t now_ms);
-
- private:
-  void EraseOld(int64_t now_ms);
-  bool IsInitialized() const;
-
-  // Counters are kept in buckets (circular buffer), with one bucket
-  // per millisecond.
-  struct Bucket {
-    size_t sum;      // Sum of all samples in this bucket.
-    size_t samples;  // Number of samples in this bucket.
-  };
-  std::unique_ptr<Bucket[]> buckets_;
-
-  // Total count recorded in buckets.
-  size_t accumulated_count_;
-
-  // The total number of samples in the buckets.
-  size_t num_samples_;
-
-  // Oldest time recorded in buckets.
-  int64_t oldest_time_;
-
-  // Bucket index of oldest counter recorded in buckets.
-  uint32_t oldest_index_;
-
-  // To convert counts/ms to desired units
-  const float scale_;
-
-  // The window sizes, in ms, over which the rate is calculated.
-  const int64_t max_window_size_ms_;
-  int64_t current_window_size_ms_;
-};
-}  // namespace webrtc
-
-#endif  // WEBRTC_RTC_BASE_RATE_STATISTICS_H_
diff --git a/rtc_base/rate_statistics_unittest.cc b/rtc_base/rate_statistics_unittest.cc
deleted file mode 100644
index 23d1a3c..0000000
--- a/rtc_base/rate_statistics_unittest.cc
+++ /dev/null
@@ -1,280 +0,0 @@
-/*
- *  Copyright (c) 2012 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 <algorithm>
-
-#include "webrtc/rtc_base/rate_statistics.h"
-#include "webrtc/test/gtest.h"
-
-namespace {
-
-using webrtc::RateStatistics;
-
-const int64_t kWindowMs = 500;
-
-class RateStatisticsTest : public ::testing::Test {
- protected:
-  RateStatisticsTest() : stats_(kWindowMs, 8000) {}
-  RateStatistics stats_;
-};
-
-TEST_F(RateStatisticsTest, TestStrictMode) {
-  int64_t now_ms = 0;
-  EXPECT_FALSE(static_cast<bool>(stats_.Rate(now_ms)));
-
-  const uint32_t kPacketSize = 1500u;
-  const uint32_t kExpectedRateBps = kPacketSize * 1000 * 8;
-
-  // Single data point is not enough for valid estimate.
-  stats_.Update(kPacketSize, now_ms++);
-  EXPECT_FALSE(static_cast<bool>(stats_.Rate(now_ms)));
-
-  // Expecting 1200 kbps since the window is initially kept small and grows as
-  // we have more data.
-  stats_.Update(kPacketSize, now_ms);
-  EXPECT_EQ(kExpectedRateBps, *stats_.Rate(now_ms));
-
-  stats_.Reset();
-  // Expecting 0 after init.
-  EXPECT_FALSE(static_cast<bool>(stats_.Rate(now_ms)));
-
-  const int kInterval = 10;
-  for (int i = 0; i < 100000; ++i) {
-    if (i % kInterval == 0)
-      stats_.Update(kPacketSize, now_ms);
-
-    // Approximately 1200 kbps expected. Not exact since when packets
-    // are removed we will jump 10 ms to the next packet.
-    if (i > kInterval) {
-      rtc::Optional<uint32_t> rate = stats_.Rate(now_ms);
-      EXPECT_TRUE(static_cast<bool>(rate));
-      uint32_t samples = i / kInterval + 1;
-      uint64_t total_bits = samples * kPacketSize * 8;
-      uint32_t rate_bps = static_cast<uint32_t>((1000 * total_bits) / (i + 1));
-      EXPECT_NEAR(rate_bps, *rate, 22000u);
-    }
-    now_ms += 1;
-  }
-  now_ms += kWindowMs;
-  // The window is 2 seconds. If nothing has been received for that time
-  // the estimate should be 0.
-  EXPECT_FALSE(static_cast<bool>(stats_.Rate(now_ms)));
-}
-
-TEST_F(RateStatisticsTest, IncreasingThenDecreasingBitrate) {
-  int64_t now_ms = 0;
-  stats_.Reset();
-  // Expecting 0 after init.
-  EXPECT_FALSE(static_cast<bool>(stats_.Rate(now_ms)));
-
-  stats_.Update(1000, ++now_ms);
-  const uint32_t kExpectedBitrate = 8000000;
-  // 1000 bytes per millisecond until plateau is reached.
-  int prev_error = kExpectedBitrate;
-  rtc::Optional<uint32_t> bitrate;
-  while (++now_ms < 10000) {
-    stats_.Update(1000, now_ms);
-    bitrate = stats_.Rate(now_ms);
-    EXPECT_TRUE(static_cast<bool>(bitrate));
-    int error = kExpectedBitrate - *bitrate;
-    error = std::abs(error);
-    // Expect the estimation error to decrease as the window is extended.
-    EXPECT_LE(error, prev_error + 1);
-    prev_error = error;
-  }
-  // Window filled, expect to be close to 8000000.
-  EXPECT_EQ(kExpectedBitrate, *bitrate);
-
-  // 1000 bytes per millisecond until 10-second mark, 8000 kbps expected.
-  while (++now_ms < 10000) {
-    stats_.Update(1000, now_ms);
-    bitrate = stats_.Rate(now_ms);
-    EXPECT_EQ(kExpectedBitrate, *bitrate);
-  }
-
-  // Zero bytes per millisecond until 0 is reached.
-  while (++now_ms < 20000) {
-    stats_.Update(0, now_ms);
-    rtc::Optional<uint32_t> new_bitrate = stats_.Rate(now_ms);
-    if (static_cast<bool>(new_bitrate) && *new_bitrate != *bitrate) {
-      // New bitrate must be lower than previous one.
-      EXPECT_LT(*new_bitrate, *bitrate);
-    } else {
-      // 0 kbps expected.
-      EXPECT_EQ(0u, *new_bitrate);
-      break;
-    }
-    bitrate = new_bitrate;
-  }
-
-  // Zero bytes per millisecond until 20-second mark, 0 kbps expected.
-  while (++now_ms < 20000) {
-    stats_.Update(0, now_ms);
-    EXPECT_EQ(0u, *stats_.Rate(now_ms));
-  }
-}
-
-TEST_F(RateStatisticsTest, ResetAfterSilence) {
-  int64_t now_ms = 0;
-  stats_.Reset();
-  // Expecting 0 after init.
-  EXPECT_FALSE(static_cast<bool>(stats_.Rate(now_ms)));
-
-  const uint32_t kExpectedBitrate = 8000000;
-  // 1000 bytes per millisecond until the window has been filled.
-  int prev_error = kExpectedBitrate;
-  rtc::Optional<uint32_t> bitrate;
-  while (++now_ms < 10000) {
-    stats_.Update(1000, now_ms);
-    bitrate = stats_.Rate(now_ms);
-    if (bitrate) {
-      int error = kExpectedBitrate - *bitrate;
-      error = std::abs(error);
-      // Expect the estimation error to decrease as the window is extended.
-      EXPECT_LE(error, prev_error + 1);
-      prev_error = error;
-    }
-  }
-  // Window filled, expect to be close to 8000000.
-  EXPECT_EQ(kExpectedBitrate, *bitrate);
-
-  now_ms += kWindowMs + 1;
-  EXPECT_FALSE(static_cast<bool>(stats_.Rate(now_ms)));
-  stats_.Update(1000, now_ms);
-  ++now_ms;
-  stats_.Update(1000, now_ms);
-  // We expect two samples of 1000 bytes, and that the bitrate is measured over
-  // 500 ms, i.e. 2 * 8 * 1000 / 0.500 = 32000.
-  EXPECT_EQ(32000u, *stats_.Rate(now_ms));
-
-  // Reset, add the same samples again.
-  stats_.Reset();
-  EXPECT_FALSE(static_cast<bool>(stats_.Rate(now_ms)));
-  stats_.Update(1000, now_ms);
-  ++now_ms;
-  stats_.Update(1000, now_ms);
-  // We expect two samples of 1000 bytes, and that the bitrate is measured over
-  // 2 ms (window size has been reset) i.e. 2 * 8 * 1000 / 0.002 = 8000000.
-  EXPECT_EQ(kExpectedBitrate, *stats_.Rate(now_ms));
-}
-
-TEST_F(RateStatisticsTest, HandlesChangingWindowSize) {
-  int64_t now_ms = 0;
-  stats_.Reset();
-
-  // Sanity test window size.
-  EXPECT_TRUE(stats_.SetWindowSize(kWindowMs, now_ms));
-  EXPECT_FALSE(stats_.SetWindowSize(kWindowMs + 1, now_ms));
-  EXPECT_FALSE(stats_.SetWindowSize(0, now_ms));
-  EXPECT_TRUE(stats_.SetWindowSize(1, now_ms));
-  EXPECT_TRUE(stats_.SetWindowSize(kWindowMs, now_ms));
-
-  // Fill the buffer at a rate of 1 byte / millisecond (8 kbps).
-  const int kBatchSize = 10;
-  for (int i = 0; i <= kWindowMs; i += kBatchSize)
-    stats_.Update(kBatchSize, now_ms += kBatchSize);
-  EXPECT_EQ(static_cast<uint32_t>(8000), *stats_.Rate(now_ms));
-
-  // Halve the window size, rate should stay the same.
-  EXPECT_TRUE(stats_.SetWindowSize(kWindowMs / 2, now_ms));
-  EXPECT_EQ(static_cast<uint32_t>(8000), *stats_.Rate(now_ms));
-
-  // Double the window size again, rate should stay the same. (As the window
-  // won't actually expand until new bit and bobs fall into it.
-  EXPECT_TRUE(stats_.SetWindowSize(kWindowMs, now_ms));
-  EXPECT_EQ(static_cast<uint32_t>(8000), *stats_.Rate(now_ms));
-
-  // Fill the now empty half with bits it twice the rate.
-  for (int i = 0; i < kWindowMs / 2; i += kBatchSize)
-    stats_.Update(kBatchSize * 2, now_ms += kBatchSize);
-
-  // Rate should have increase be 50%.
-  EXPECT_EQ(static_cast<uint32_t>((8000 * 3) / 2), *stats_.Rate(now_ms));
-}
-
-TEST_F(RateStatisticsTest, RespectsWindowSizeEdges) {
-  int64_t now_ms = 0;
-  stats_.Reset();
-  // Expecting 0 after init.
-  EXPECT_FALSE(static_cast<bool>(stats_.Rate(now_ms)));
-
-  // One byte per ms, using one big sample.
-  stats_.Update(kWindowMs, now_ms);
-  now_ms += kWindowMs - 2;
-  // Shouldn't work! (Only one sample, not full window size.)
-  EXPECT_FALSE(static_cast<bool>(stats_.Rate(now_ms)));
-
-  // Window size should be full, and the single data point should be accepted.
-  ++now_ms;
-  rtc::Optional<uint32_t> bitrate = stats_.Rate(now_ms);
-  EXPECT_TRUE(static_cast<bool>(bitrate));
-  EXPECT_EQ(1000 * 8u, *bitrate);
-
-  // Add another, now we have twice the bitrate.
-  stats_.Update(kWindowMs, now_ms);
-  bitrate = stats_.Rate(now_ms);
-  EXPECT_TRUE(static_cast<bool>(bitrate));
-  EXPECT_EQ(2 * 1000 * 8u, *bitrate);
-
-  // Now that first sample should drop out...
-  now_ms += 1;
-  bitrate = stats_.Rate(now_ms);
-  EXPECT_TRUE(static_cast<bool>(bitrate));
-  EXPECT_EQ(1000 * 8u, *bitrate);
-}
-
-TEST_F(RateStatisticsTest, HandlesZeroCounts) {
-  int64_t now_ms = 0;
-  stats_.Reset();
-  // Expecting 0 after init.
-  EXPECT_FALSE(static_cast<bool>(stats_.Rate(now_ms)));
-
-  stats_.Update(kWindowMs, now_ms);
-  now_ms += kWindowMs - 1;
-  stats_.Update(0, now_ms);
-  rtc::Optional<uint32_t> bitrate = stats_.Rate(now_ms);
-  EXPECT_TRUE(static_cast<bool>(bitrate));
-  EXPECT_EQ(1000 * 8u, *bitrate);
-
-  // Move window along so first data point falls out.
-  ++now_ms;
-  bitrate = stats_.Rate(now_ms);
-  EXPECT_TRUE(static_cast<bool>(bitrate));
-  EXPECT_EQ(0u, *bitrate);
-
-  // Move window so last data point falls out.
-  now_ms += kWindowMs;
-  EXPECT_FALSE(static_cast<bool>(stats_.Rate(now_ms)));
-}
-
-TEST_F(RateStatisticsTest, HandlesQuietPeriods) {
-  int64_t now_ms = 0;
-  stats_.Reset();
-  // Expecting 0 after init.
-  EXPECT_FALSE(static_cast<bool>(stats_.Rate(now_ms)));
-
-  stats_.Update(0, now_ms);
-  now_ms += kWindowMs - 1;
-  rtc::Optional<uint32_t> bitrate = stats_.Rate(now_ms);
-  EXPECT_TRUE(static_cast<bool>(bitrate));
-  EXPECT_EQ(0u, *bitrate);
-
-  // Move window along so first data point falls out.
-  ++now_ms;
-  EXPECT_FALSE(static_cast<bool>(stats_.Rate(now_ms)));
-
-  // Move window a long way out.
-  now_ms += 2 * kWindowMs;
-  stats_.Update(0, now_ms);
-  bitrate = stats_.Rate(now_ms);
-  EXPECT_TRUE(static_cast<bool>(bitrate));
-  EXPECT_EQ(0u, *bitrate);
-}
-}  // namespace
diff --git a/rtc_base/ratelimiter.cc b/rtc_base/ratelimiter.cc
deleted file mode 100644
index 7bf954f..0000000
--- a/rtc_base/ratelimiter.cc
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- *  Copyright 2012 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/rtc_base/ratelimiter.h"
-
-namespace rtc {
-
-bool RateLimiter::CanUse(size_t desired, double time) {
-  return ((time > period_end_ && desired <= max_per_period_) ||
-          (used_in_period_ + desired) <= max_per_period_);
-}
-
-void RateLimiter::Use(size_t used, double time) {
-  if (time > period_end_) {
-    period_start_ = time;
-    period_end_ = time + period_length_;
-    used_in_period_ = 0;
-  }
-  used_in_period_ += used;
-}
-
-}  // namespace rtc
diff --git a/rtc_base/ratelimiter.h b/rtc_base/ratelimiter.h
deleted file mode 100644
index 24ed1ad..0000000
--- a/rtc_base/ratelimiter.h
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- *  Copyright 2012 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_RTC_BASE_RATELIMITER_H_
-#define WEBRTC_RTC_BASE_RATELIMITER_H_
-
-#include <stddef.h>
-
-namespace rtc {
-
-// Limits the rate of use to a certain maximum quantity per period of
-// time.  Use, for example, for simple bandwidth throttling.
-//
-// It's implemented like a diet plan: You have so many calories per
-// day.  If you hit the limit, you can't eat any more until the next
-// day.
-class RateLimiter {
- public:
-  // For example, 100kb per second.
-  RateLimiter(size_t max, double period)
-      : max_per_period_(max),
-        period_length_(period),
-        used_in_period_(0),
-        period_start_(0.0),
-        period_end_(period) {
-  }
-  virtual ~RateLimiter() {}
-
-  // Returns true if if the desired quantity is available in the
-  // current period (< (max - used)).  Once the given time passes the
-  // end of the period, used is set to zero and more use is available.
-  bool CanUse(size_t desired, double time);
-  // Increment the quantity used this period.  If past the end of a
-  // period, a new period is started.
-  void Use(size_t used, double time);
-
-  size_t used_in_period() const {
-    return used_in_period_;
-  }
-
-  size_t max_per_period() const {
-    return max_per_period_;
-  }
-
- private:
-  size_t max_per_period_;
-  double period_length_;
-  size_t used_in_period_;
-  double period_start_;
-  double period_end_;
-};
-
-}  // namespace rtc
-
-#endif  // WEBRTC_RTC_BASE_RATELIMITER_H_
diff --git a/rtc_base/ratelimiter_unittest.cc b/rtc_base/ratelimiter_unittest.cc
deleted file mode 100644
index 3962ea3..0000000
--- a/rtc_base/ratelimiter_unittest.cc
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- *  Copyright 2012 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/rtc_base/ratelimiter.h"
-#include "webrtc/rtc_base/gunit.h"
-
-namespace rtc {
-
-TEST(RateLimiterTest, TestCanUse) {
-  // Diet: Can eat 2,000 calories per day.
-  RateLimiter limiter = RateLimiter(2000, 1.0);
-
-  double monday = 1.0;
-  double tuesday = 2.0;
-  double thursday = 4.0;
-
-  EXPECT_TRUE(limiter.CanUse(0, monday));
-  EXPECT_TRUE(limiter.CanUse(1000, monday));
-  EXPECT_TRUE(limiter.CanUse(1999, monday));
-  EXPECT_TRUE(limiter.CanUse(2000, monday));
-  EXPECT_FALSE(limiter.CanUse(2001, monday));
-
-  limiter.Use(1000, monday);
-
-  EXPECT_TRUE(limiter.CanUse(0, monday));
-  EXPECT_TRUE(limiter.CanUse(999, monday));
-  EXPECT_TRUE(limiter.CanUse(1000, monday));
-  EXPECT_FALSE(limiter.CanUse(1001, monday));
-
-  limiter.Use(1000, monday);
-
-  EXPECT_TRUE(limiter.CanUse(0, monday));
-  EXPECT_FALSE(limiter.CanUse(1, monday));
-
-  EXPECT_TRUE(limiter.CanUse(0, tuesday));
-  EXPECT_TRUE(limiter.CanUse(1, tuesday));
-  EXPECT_TRUE(limiter.CanUse(1999, tuesday));
-  EXPECT_TRUE(limiter.CanUse(2000, tuesday));
-  EXPECT_FALSE(limiter.CanUse(2001, tuesday));
-
-  limiter.Use(1000, tuesday);
-
-  EXPECT_TRUE(limiter.CanUse(1000, tuesday));
-  EXPECT_FALSE(limiter.CanUse(1001, tuesday));
-
-  limiter.Use(1000, thursday);
-
-  EXPECT_TRUE(limiter.CanUse(1000, tuesday));
-  EXPECT_FALSE(limiter.CanUse(1001, tuesday));
-}
-
-}  // namespace rtc
diff --git a/rtc_base/ratetracker.cc b/rtc_base/ratetracker.cc
deleted file mode 100644
index 731de8e..0000000
--- a/rtc_base/ratetracker.cc
+++ /dev/null
@@ -1,154 +0,0 @@
-/*
- *  Copyright 2015 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/rtc_base/ratetracker.h"
-
-#include <stddef.h>
-
-#include <algorithm>
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/timeutils.h"
-
-namespace rtc {
-
-static const int64_t kTimeUnset = -1;
-
-RateTracker::RateTracker(int64_t bucket_milliseconds, size_t bucket_count)
-    : bucket_milliseconds_(bucket_milliseconds),
-      bucket_count_(bucket_count),
-      sample_buckets_(new size_t[bucket_count + 1]),
-      total_sample_count_(0u),
-      bucket_start_time_milliseconds_(kTimeUnset) {
-  RTC_CHECK(bucket_milliseconds > 0);
-  RTC_CHECK(bucket_count > 0);
-}
-
-RateTracker::~RateTracker() {
-  delete[] sample_buckets_;
-}
-
-double RateTracker::ComputeRateForInterval(
-    int64_t interval_milliseconds) const {
-  if (bucket_start_time_milliseconds_ == kTimeUnset) {
-    return 0.0;
-  }
-  int64_t current_time = Time();
-  // Calculate which buckets to sum up given the current time.  If the time
-  // has passed to a new bucket then we have to skip some of the oldest buckets.
-  int64_t available_interval_milliseconds =
-      std::min(interval_milliseconds,
-               bucket_milliseconds_ * static_cast<int64_t>(bucket_count_));
-  // number of old buckets (i.e. after the current bucket in the ring buffer)
-  // that are expired given our current time interval.
-  size_t buckets_to_skip;
-  // Number of milliseconds of the first bucket that are not a portion of the
-  // current interval.
-  int64_t milliseconds_to_skip;
-  if (current_time >
-      initialization_time_milliseconds_ + available_interval_milliseconds) {
-    int64_t time_to_skip =
-        current_time - bucket_start_time_milliseconds_ +
-        static_cast<int64_t>(bucket_count_) * bucket_milliseconds_ -
-        available_interval_milliseconds;
-    buckets_to_skip = time_to_skip / bucket_milliseconds_;
-    milliseconds_to_skip = time_to_skip % bucket_milliseconds_;
-  } else {
-    buckets_to_skip = bucket_count_ - current_bucket_;
-    milliseconds_to_skip = 0;
-    available_interval_milliseconds =
-        TimeDiff(current_time, initialization_time_milliseconds_);
-    // Let one bucket interval pass after initialization before reporting.
-    if (available_interval_milliseconds < bucket_milliseconds_) {
-      return 0.0;
-    }
-  }
-  // If we're skipping all buckets that means that there have been no samples
-  // within the sampling interval so report 0.
-  if (buckets_to_skip > bucket_count_ || available_interval_milliseconds == 0) {
-    return 0.0;
-  }
-  size_t start_bucket = NextBucketIndex(current_bucket_ + buckets_to_skip);
-  // Only count a portion of the first bucket according to how much of the
-  // first bucket is within the current interval.
-  size_t total_samples = ((sample_buckets_[start_bucket] *
-      (bucket_milliseconds_ - milliseconds_to_skip)) +
-      (bucket_milliseconds_ >> 1)) /
-      bucket_milliseconds_;
-  // All other buckets in the interval are counted in their entirety.
-  for (size_t i = NextBucketIndex(start_bucket);
-      i != NextBucketIndex(current_bucket_);
-      i = NextBucketIndex(i)) {
-    total_samples += sample_buckets_[i];
-  }
-  // Convert to samples per second.
-  return static_cast<double>(total_samples * 1000) /
-         static_cast<double>(available_interval_milliseconds);
-}
-
-double RateTracker::ComputeTotalRate() const {
-  if (bucket_start_time_milliseconds_ == kTimeUnset) {
-    return 0.0;
-  }
-  int64_t current_time = Time();
-  if (current_time <= initialization_time_milliseconds_) {
-    return 0.0;
-  }
-  return static_cast<double>(total_sample_count_ * 1000) /
-         static_cast<double>(
-             TimeDiff(current_time, initialization_time_milliseconds_));
-}
-
-size_t RateTracker::TotalSampleCount() const {
-  return total_sample_count_;
-}
-
-void RateTracker::AddSamples(size_t sample_count) {
-  EnsureInitialized();
-  int64_t current_time = Time();
-  // Advance the current bucket as needed for the current time, and reset
-  // bucket counts as we advance.
-  for (size_t i = 0;
-       i <= bucket_count_ &&
-       current_time >= bucket_start_time_milliseconds_ + bucket_milliseconds_;
-       ++i) {
-    bucket_start_time_milliseconds_ += bucket_milliseconds_;
-    current_bucket_ = NextBucketIndex(current_bucket_);
-    sample_buckets_[current_bucket_] = 0;
-  }
-  // Ensure that bucket_start_time_milliseconds_ is updated appropriately if
-  // the entire buffer of samples has been expired.
-  bucket_start_time_milliseconds_ += bucket_milliseconds_ *
-      ((current_time - bucket_start_time_milliseconds_) / bucket_milliseconds_);
-  // Add all samples in the bucket that includes the current time.
-  sample_buckets_[current_bucket_] += sample_count;
-  total_sample_count_ += sample_count;
-}
-
-int64_t RateTracker::Time() const {
-  return rtc::TimeMillis();
-}
-
-void RateTracker::EnsureInitialized() {
-  if (bucket_start_time_milliseconds_ == kTimeUnset) {
-    initialization_time_milliseconds_ = Time();
-    bucket_start_time_milliseconds_ = initialization_time_milliseconds_;
-    current_bucket_ = 0;
-    // We only need to initialize the first bucket because we reset buckets when
-    // current_bucket_ increments.
-    sample_buckets_[current_bucket_] = 0;
-  }
-}
-
-size_t RateTracker::NextBucketIndex(size_t bucket_index) const {
-  return (bucket_index + 1u) % (bucket_count_ + 1u);
-}
-
-}  // namespace rtc
diff --git a/rtc_base/ratetracker.h b/rtc_base/ratetracker.h
deleted file mode 100644
index 3731600..0000000
--- a/rtc_base/ratetracker.h
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- *  Copyright 2015 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_RTC_BASE_RATETRACKER_H_
-#define WEBRTC_RTC_BASE_RATETRACKER_H_
-
-#include <stdlib.h>
-#include "webrtc/rtc_base/basictypes.h"
-
-namespace rtc {
-
-// Computes units per second over a given interval by tracking the units over
-// each bucket of a given size and calculating the instantaneous rate assuming
-// that over each bucket the rate was constant.
-class RateTracker {
- public:
-  RateTracker(int64_t bucket_milliseconds, size_t bucket_count);
-  virtual ~RateTracker();
-
-  // Computes the average rate over the most recent interval_milliseconds,
-  // or if the first sample was added within this period, computes the rate
-  // since the first sample was added.
-  double ComputeRateForInterval(int64_t interval_milliseconds) const;
-
-  // Computes the average rate over the rate tracker's recording interval
-  // of bucket_milliseconds * bucket_count.
-  double ComputeRate() const {
-    return ComputeRateForInterval(bucket_milliseconds_ *
-                                  static_cast<int64_t>(bucket_count_));
-  }
-
-  // Computes the average rate since the first sample was added to the
-  // rate tracker.
-  double ComputeTotalRate() const;
-
-  // The total number of samples added.
-  size_t TotalSampleCount() const;
-
-  // Reads the current time in order to determine the appropriate bucket for
-  // these samples, and increments the count for that bucket by sample_count.
-  void AddSamples(size_t sample_count);
-
- protected:
-  // overrideable for tests
-  virtual int64_t Time() const;
-
- private:
-  void EnsureInitialized();
-  size_t NextBucketIndex(size_t bucket_index) const;
-
-  const int64_t bucket_milliseconds_;
-  const size_t bucket_count_;
-  size_t* sample_buckets_;
-  size_t total_sample_count_;
-  size_t current_bucket_;
-  int64_t bucket_start_time_milliseconds_;
-  int64_t initialization_time_milliseconds_;
-};
-
-}  // namespace rtc
-
-#endif  // WEBRTC_RTC_BASE_RATETRACKER_H_
diff --git a/rtc_base/ratetracker_unittest.cc b/rtc_base/ratetracker_unittest.cc
deleted file mode 100644
index 27aa3a9..0000000
--- a/rtc_base/ratetracker_unittest.cc
+++ /dev/null
@@ -1,168 +0,0 @@
-/*
- *  Copyright 2015 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/rtc_base/ratetracker.h"
-#include "webrtc/rtc_base/gunit.h"
-
-namespace rtc {
-namespace {
-  const uint32_t kBucketIntervalMs = 100;
-}  // namespace
-
-class RateTrackerForTest : public RateTracker {
- public:
-  RateTrackerForTest() : RateTracker(kBucketIntervalMs, 10u), time_(0) {}
-  int64_t Time() const override { return time_; }
-  void AdvanceTime(int delta) { time_ += delta; }
-
- private:
-  int64_t time_;
-};
-
-TEST(RateTrackerTest, Test30FPS) {
-  RateTrackerForTest tracker;
-
-  for (int i = 0; i < 300; ++i) {
-    tracker.AddSamples(1);
-    tracker.AdvanceTime(33);
-    if (i % 3 == 0) {
-      tracker.AdvanceTime(1);
-    }
-  }
-  EXPECT_DOUBLE_EQ(30.0, tracker.ComputeRateForInterval(50000));
-}
-
-TEST(RateTrackerTest, Test60FPS) {
-  RateTrackerForTest tracker;
-
-  for (int i = 0; i < 300; ++i) {
-    tracker.AddSamples(1);
-    tracker.AdvanceTime(16);
-    if (i % 3 != 0) {
-      tracker.AdvanceTime(1);
-    }
-  }
-  EXPECT_DOUBLE_EQ(60.0, tracker.ComputeRateForInterval(1000));
-}
-
-TEST(RateTrackerTest, TestRateTrackerBasics) {
-  RateTrackerForTest tracker;
-  EXPECT_DOUBLE_EQ(0.0, tracker.ComputeRateForInterval(1000));
-
-  // Add a sample.
-  tracker.AddSamples(1234);
-  // Advance the clock by less than one bucket interval (no rate returned).
-  tracker.AdvanceTime(kBucketIntervalMs - 1);
-  EXPECT_DOUBLE_EQ(0.0, tracker.ComputeRate());
-  // Advance the clock by 100 ms (one bucket interval).
-  tracker.AdvanceTime(1);
-  EXPECT_DOUBLE_EQ(12340.0, tracker.ComputeRateForInterval(1000));
-  EXPECT_DOUBLE_EQ(12340.0, tracker.ComputeRate());
-  EXPECT_EQ(1234U, tracker.TotalSampleCount());
-  EXPECT_DOUBLE_EQ(12340.0, tracker.ComputeTotalRate());
-
-  // Repeat.
-  tracker.AddSamples(1234);
-  tracker.AdvanceTime(100);
-  EXPECT_DOUBLE_EQ(12340.0, tracker.ComputeRateForInterval(1000));
-  EXPECT_DOUBLE_EQ(12340.0, tracker.ComputeRate());
-  EXPECT_EQ(1234U * 2, tracker.TotalSampleCount());
-  EXPECT_DOUBLE_EQ(12340.0, tracker.ComputeTotalRate());
-
-  // Advance the clock by 800 ms, so we've elapsed a full second.
-  // units_second should now be filled in properly.
-  tracker.AdvanceTime(800);
-  EXPECT_DOUBLE_EQ(1234.0 * 2.0, tracker.ComputeRateForInterval(1000));
-  EXPECT_DOUBLE_EQ(1234.0 * 2.0, tracker.ComputeRate());
-  EXPECT_EQ(1234U * 2, tracker.TotalSampleCount());
-  EXPECT_DOUBLE_EQ(1234.0 * 2.0, tracker.ComputeTotalRate());
-
-  // Poll the tracker again immediately. The reported rate should stay the same.
-  EXPECT_DOUBLE_EQ(1234.0 * 2.0, tracker.ComputeRateForInterval(1000));
-  EXPECT_DOUBLE_EQ(1234.0 * 2.0, tracker.ComputeRate());
-  EXPECT_EQ(1234U * 2, tracker.TotalSampleCount());
-  EXPECT_DOUBLE_EQ(1234.0 * 2.0, tracker.ComputeTotalRate());
-
-  // Do nothing and advance by a second. We should drop down to zero.
-  tracker.AdvanceTime(1000);
-  EXPECT_DOUBLE_EQ(0.0, tracker.ComputeRateForInterval(1000));
-  EXPECT_DOUBLE_EQ(0.0, tracker.ComputeRate());
-  EXPECT_EQ(1234U * 2, tracker.TotalSampleCount());
-  EXPECT_DOUBLE_EQ(1234.0, tracker.ComputeTotalRate());
-
-  // Send a bunch of data at a constant rate for 5.5 "seconds".
-  // We should report the rate properly.
-  for (int i = 0; i < 5500; i += 100) {
-    tracker.AddSamples(9876U);
-    tracker.AdvanceTime(100);
-  }
-  EXPECT_DOUBLE_EQ(9876.0 * 10.0, tracker.ComputeRateForInterval(1000));
-  EXPECT_DOUBLE_EQ(9876.0 * 10.0, tracker.ComputeRate());
-  EXPECT_EQ(1234U * 2 + 9876U * 55, tracker.TotalSampleCount());
-  EXPECT_DOUBLE_EQ((1234.0 * 2.0 + 9876.0 * 55.0) / 7.5,
-      tracker.ComputeTotalRate());
-
-  // Advance the clock by 500 ms. Since we sent nothing over this half-second,
-  // the reported rate should be reduced by half.
-  tracker.AdvanceTime(500);
-  EXPECT_DOUBLE_EQ(9876.0 * 5.0, tracker.ComputeRateForInterval(1000));
-  EXPECT_DOUBLE_EQ(9876.0 * 5.0, tracker.ComputeRate());
-  EXPECT_EQ(1234U * 2 + 9876U * 55, tracker.TotalSampleCount());
-  EXPECT_DOUBLE_EQ((1234.0 * 2.0 + 9876.0 * 55.0) / 8.0,
-      tracker.ComputeTotalRate());
-
-  // Rate over the last half second should be zero.
-  EXPECT_DOUBLE_EQ(0.0, tracker.ComputeRateForInterval(500));
-}
-
-TEST(RateTrackerTest, TestLongPeriodBetweenSamples) {
-  RateTrackerForTest tracker;
-  tracker.AddSamples(1);
-  tracker.AdvanceTime(1000);
-  EXPECT_DOUBLE_EQ(1.0, tracker.ComputeRate());
-
-  tracker.AdvanceTime(2000);
-  EXPECT_DOUBLE_EQ(0.0, tracker.ComputeRate());
-
-  tracker.AdvanceTime(2000);
-  tracker.AddSamples(1);
-  EXPECT_DOUBLE_EQ(1.0, tracker.ComputeRate());
-}
-
-TEST(RateTrackerTest, TestRolloff) {
-  RateTrackerForTest tracker;
-  for (int i = 0; i < 10; ++i) {
-    tracker.AddSamples(1U);
-    tracker.AdvanceTime(100);
-  }
-  EXPECT_DOUBLE_EQ(10.0, tracker.ComputeRate());
-
-  for (int i = 0; i < 10; ++i) {
-    tracker.AddSamples(1U);
-    tracker.AdvanceTime(50);
-  }
-  EXPECT_DOUBLE_EQ(15.0, tracker.ComputeRate());
-  EXPECT_DOUBLE_EQ(20.0, tracker.ComputeRateForInterval(500));
-
-  for (int i = 0; i < 10; ++i) {
-    tracker.AddSamples(1U);
-    tracker.AdvanceTime(50);
-  }
-  EXPECT_DOUBLE_EQ(20.0, tracker.ComputeRate());
-}
-
-TEST(RateTrackerTest, TestGetUnitSecondsAfterInitialValue) {
-  RateTrackerForTest tracker;
-  tracker.AddSamples(1234);
-  tracker.AdvanceTime(1000);
-  EXPECT_DOUBLE_EQ(1234.0, tracker.ComputeRateForInterval(1000));
-}
-
-}  // namespace rtc
diff --git a/rtc_base/refcount.h b/rtc_base/refcount.h
deleted file mode 100644
index c3744d0..0000000
--- a/rtc_base/refcount.h
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- *  Copyright 2011 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_RTC_BASE_REFCOUNT_H_
-#define WEBRTC_RTC_BASE_REFCOUNT_H_
-
-#include "webrtc/rtc_base/refcountedobject.h"
-
-namespace rtc {
-
-// Reference count interface.
-class RefCountInterface {
- public:
-  virtual int AddRef() const = 0;
-  virtual int Release() const = 0;
-
- protected:
-  virtual ~RefCountInterface() {}
-};
-
-}  // namespace rtc
-
-#endif  // WEBRTC_RTC_BASE_REFCOUNT_H_
diff --git a/rtc_base/refcountedobject.h b/rtc_base/refcountedobject.h
deleted file mode 100644
index bf66af2..0000000
--- a/rtc_base/refcountedobject.h
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- *  Copyright 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_RTC_BASE_REFCOUNTEDOBJECT_H_
-#define WEBRTC_RTC_BASE_REFCOUNTEDOBJECT_H_
-
-#include <utility>
-
-#include "webrtc/rtc_base/atomicops.h"
-
-namespace rtc {
-
-template <class T>
-class RefCountedObject : public T {
- public:
-  RefCountedObject() {}
-
-  template <class P0>
-  explicit RefCountedObject(P0&& p0) : T(std::forward<P0>(p0)) {}
-
-  template <class P0, class P1, class... Args>
-  RefCountedObject(P0&& p0, P1&& p1, Args&&... args)
-      : T(std::forward<P0>(p0),
-          std::forward<P1>(p1),
-          std::forward<Args>(args)...) {}
-
-  virtual int AddRef() const { return AtomicOps::Increment(&ref_count_); }
-
-  virtual int Release() const {
-    int count = AtomicOps::Decrement(&ref_count_);
-    if (!count) {
-      delete this;
-    }
-    return count;
-  }
-
-  // Return whether the reference count is one. If the reference count is used
-  // in the conventional way, a reference count of 1 implies that the current
-  // thread owns the reference and no other thread shares it. This call
-  // performs the test for a reference count of one, and performs the memory
-  // barrier needed for the owning thread to act on the object, knowing that it
-  // has exclusive access to the object.
-  virtual bool HasOneRef() const {
-    return AtomicOps::AcquireLoad(&ref_count_) == 1;
-  }
-
- protected:
-  virtual ~RefCountedObject() {}
-
-  mutable volatile int ref_count_ = 0;
-};
-
-}  // namespace rtc
-
-#endif  // WEBRTC_RTC_BASE_REFCOUNTEDOBJECT_H_
diff --git a/rtc_base/refcountedobject_unittest.cc b/rtc_base/refcountedobject_unittest.cc
deleted file mode 100644
index 8b27e71..0000000
--- a/rtc_base/refcountedobject_unittest.cc
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- *  Copyright 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 <string>
-
-#include "webrtc/rtc_base/gunit.h"
-#include "webrtc/rtc_base/refcount.h"
-
-namespace rtc {
-
-namespace {
-
-class A {
- public:
-  A() {}
-
- private:
-  RTC_DISALLOW_COPY_AND_ASSIGN(A);
-};
-
-class RefClass : public RefCountInterface {
- public:
-  RefClass() {}
-
- protected:
-  ~RefClass() override {}
-};
-
-class RefClassWithRvalue : public RefCountInterface {
- public:
-  explicit RefClassWithRvalue(std::unique_ptr<A> a) : a_(std::move(a)) {}
-
- protected:
-  ~RefClassWithRvalue() override {}
-
- public:
-  std::unique_ptr<A> a_;
-};
-
-class RefClassWithMixedValues : public RefCountInterface {
- public:
-  RefClassWithMixedValues(std::unique_ptr<A> a, int b, const std::string& c)
-      : a_(std::move(a)), b_(b), c_(c) {}
-
- protected:
-  ~RefClassWithMixedValues() override {}
-
- public:
-  std::unique_ptr<A> a_;
-  int b_;
-  std::string c_;
-};
-
-}  // namespace
-
-TEST(RefCountedObject, Basic) {
-  scoped_refptr<RefCountedObject<RefClass>> aref(
-      new RefCountedObject<RefClass>());
-  EXPECT_TRUE(aref->HasOneRef());
-  EXPECT_EQ(2, aref->AddRef());
-  EXPECT_EQ(1, aref->Release());
-}
-
-TEST(RefCountedObject, SupportRValuesInCtor) {
-  std::unique_ptr<A> a(new A());
-  scoped_refptr<RefClassWithRvalue> ref(
-      new RefCountedObject<RefClassWithRvalue>(std::move(a)));
-  EXPECT_TRUE(ref->a_.get() != nullptr);
-  EXPECT_TRUE(a.get() == nullptr);
-}
-
-TEST(RefCountedObject, SupportMixedTypesInCtor) {
-  std::unique_ptr<A> a(new A());
-  int b = 9;
-  std::string c = "hello";
-  scoped_refptr<RefClassWithMixedValues> ref(
-      new RefCountedObject<RefClassWithMixedValues>(std::move(a), b, c));
-  EXPECT_TRUE(ref->a_.get() != nullptr);
-  EXPECT_TRUE(a.get() == nullptr);
-  EXPECT_EQ(b, ref->b_);
-  EXPECT_EQ(c, ref->c_);
-}
-
-}  // namespace rtc
diff --git a/rtc_base/rollingaccumulator.h b/rtc_base/rollingaccumulator.h
deleted file mode 100644
index 9008db6..0000000
--- a/rtc_base/rollingaccumulator.h
+++ /dev/null
@@ -1,174 +0,0 @@
-/*
- *  Copyright 2011 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_RTC_BASE_ROLLINGACCUMULATOR_H_
-#define WEBRTC_RTC_BASE_ROLLINGACCUMULATOR_H_
-
-#include <algorithm>
-#include <vector>
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace rtc {
-
-// RollingAccumulator stores and reports statistics
-// over N most recent samples.
-//
-// T is assumed to be an int, long, double or float.
-template<typename T>
-class RollingAccumulator {
- public:
-  explicit RollingAccumulator(size_t max_count)
-    : samples_(max_count) {
-    Reset();
-  }
-  ~RollingAccumulator() {
-  }
-
-  size_t max_count() const {
-    return samples_.size();
-  }
-
-  size_t count() const {
-    return count_;
-  }
-
-  void Reset() {
-    count_ = 0U;
-    next_index_ = 0U;
-    sum_ = 0.0;
-    sum_2_ = 0.0;
-    max_ = T();
-    max_stale_ = false;
-    min_ = T();
-    min_stale_ = false;
-  }
-
-  void AddSample(T sample) {
-    if (count_ == max_count()) {
-      // Remove oldest sample.
-      T sample_to_remove = samples_[next_index_];
-      sum_ -= sample_to_remove;
-      sum_2_ -= static_cast<double>(sample_to_remove) * sample_to_remove;
-      if (sample_to_remove >= max_) {
-        max_stale_ = true;
-      }
-      if (sample_to_remove <= min_) {
-        min_stale_ = true;
-      }
-    } else {
-      // Increase count of samples.
-      ++count_;
-    }
-    // Add new sample.
-    samples_[next_index_] = sample;
-    sum_ += sample;
-    sum_2_ += static_cast<double>(sample) * sample;
-    if (count_ == 1 || sample >= max_) {
-      max_ = sample;
-      max_stale_ = false;
-    }
-    if (count_ == 1 || sample <= min_) {
-      min_ = sample;
-      min_stale_ = false;
-    }
-    // Update next_index_.
-    next_index_ = (next_index_ + 1) % max_count();
-  }
-
-  T ComputeSum() const {
-    return static_cast<T>(sum_);
-  }
-
-  double ComputeMean() const {
-    if (count_ == 0) {
-      return 0.0;
-    }
-    return sum_ / count_;
-  }
-
-  T ComputeMax() const {
-    if (max_stale_) {
-      RTC_DCHECK(count_ > 0) <<
-                 "It shouldn't be possible for max_stale_ && count_ == 0";
-      max_ = samples_[next_index_];
-      for (size_t i = 1u; i < count_; i++) {
-        max_ = std::max(max_, samples_[(next_index_ + i) % max_count()]);
-      }
-      max_stale_ = false;
-    }
-    return max_;
-  }
-
-  T ComputeMin() const {
-    if (min_stale_) {
-      RTC_DCHECK(count_ > 0) <<
-                 "It shouldn't be possible for min_stale_ && count_ == 0";
-      min_ = samples_[next_index_];
-      for (size_t i = 1u; i < count_; i++) {
-        min_ = std::min(min_, samples_[(next_index_ + i) % max_count()]);
-      }
-      min_stale_ = false;
-    }
-    return min_;
-  }
-
-  // O(n) time complexity.
-  // Weights nth sample with weight (learning_rate)^n. Learning_rate should be
-  // between (0.0, 1.0], otherwise the non-weighted mean is returned.
-  double ComputeWeightedMean(double learning_rate) const {
-    if (count_ < 1 || learning_rate <= 0.0 || learning_rate >= 1.0) {
-      return ComputeMean();
-    }
-    double weighted_mean = 0.0;
-    double current_weight = 1.0;
-    double weight_sum = 0.0;
-    const size_t max_size = max_count();
-    for (size_t i = 0; i < count_; ++i) {
-      current_weight *= learning_rate;
-      weight_sum += current_weight;
-      // Add max_size to prevent underflow.
-      size_t index = (next_index_ + max_size - i - 1) % max_size;
-      weighted_mean += current_weight * samples_[index];
-    }
-    return weighted_mean / weight_sum;
-  }
-
-  // Compute estimated variance.  Estimation is more accurate
-  // as the number of samples grows.
-  double ComputeVariance() const {
-    if (count_ == 0) {
-      return 0.0;
-    }
-    // Var = E[x^2] - (E[x])^2
-    double count_inv = 1.0 / count_;
-    double mean_2 = sum_2_ * count_inv;
-    double mean = sum_ * count_inv;
-    return mean_2 - (mean * mean);
-  }
-
- private:
-  size_t count_;
-  size_t next_index_;
-  double sum_;    // Sum(x) - double to avoid overflow
-  double sum_2_;  // Sum(x*x) - double to avoid overflow
-  mutable T max_;
-  mutable bool max_stale_;
-  mutable T min_;
-  mutable bool min_stale_;
-  std::vector<T> samples_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(RollingAccumulator);
-};
-
-}  // namespace rtc
-
-#endif  // WEBRTC_RTC_BASE_ROLLINGACCUMULATOR_H_
diff --git a/rtc_base/rollingaccumulator_unittest.cc b/rtc_base/rollingaccumulator_unittest.cc
deleted file mode 100644
index ce4b4df..0000000
--- a/rtc_base/rollingaccumulator_unittest.cc
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- *  Copyright 2011 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/rtc_base/rollingaccumulator.h"
-#include "webrtc/rtc_base/gunit.h"
-
-namespace rtc {
-
-namespace {
-
-const double kLearningRate = 0.5;
-
-}  // namespace
-
-TEST(RollingAccumulatorTest, ZeroSamples) {
-  RollingAccumulator<int> accum(10);
-
-  EXPECT_EQ(0U, accum.count());
-  EXPECT_DOUBLE_EQ(0.0, accum.ComputeMean());
-  EXPECT_DOUBLE_EQ(0.0, accum.ComputeVariance());
-  EXPECT_EQ(0, accum.ComputeMin());
-  EXPECT_EQ(0, accum.ComputeMax());
-}
-
-TEST(RollingAccumulatorTest, SomeSamples) {
-  RollingAccumulator<int> accum(10);
-  for (int i = 0; i < 4; ++i) {
-    accum.AddSample(i);
-  }
-
-  EXPECT_EQ(4U, accum.count());
-  EXPECT_EQ(6, accum.ComputeSum());
-  EXPECT_DOUBLE_EQ(1.5, accum.ComputeMean());
-  EXPECT_NEAR(2.26666, accum.ComputeWeightedMean(kLearningRate), 0.01);
-  EXPECT_DOUBLE_EQ(1.25, accum.ComputeVariance());
-  EXPECT_EQ(0, accum.ComputeMin());
-  EXPECT_EQ(3, accum.ComputeMax());
-}
-
-TEST(RollingAccumulatorTest, RollingSamples) {
-  RollingAccumulator<int> accum(10);
-  for (int i = 0; i < 12; ++i) {
-    accum.AddSample(i);
-  }
-
-  EXPECT_EQ(10U, accum.count());
-  EXPECT_EQ(65, accum.ComputeSum());
-  EXPECT_DOUBLE_EQ(6.5, accum.ComputeMean());
-  EXPECT_NEAR(10.0, accum.ComputeWeightedMean(kLearningRate), 0.01);
-  EXPECT_NEAR(9.0, accum.ComputeVariance(), 1.0);
-  EXPECT_EQ(2, accum.ComputeMin());
-  EXPECT_EQ(11, accum.ComputeMax());
-}
-
-TEST(RollingAccumulatorTest, ResetSamples) {
-  RollingAccumulator<int> accum(10);
-
-  for (int i = 0; i < 10; ++i) {
-    accum.AddSample(100);
-  }
-  EXPECT_EQ(10U, accum.count());
-  EXPECT_DOUBLE_EQ(100.0, accum.ComputeMean());
-  EXPECT_EQ(100, accum.ComputeMin());
-  EXPECT_EQ(100, accum.ComputeMax());
-
-  accum.Reset();
-  EXPECT_EQ(0U, accum.count());
-
-  for (int i = 0; i < 5; ++i) {
-    accum.AddSample(i);
-  }
-
-  EXPECT_EQ(5U, accum.count());
-  EXPECT_EQ(10, accum.ComputeSum());
-  EXPECT_DOUBLE_EQ(2.0, accum.ComputeMean());
-  EXPECT_EQ(0, accum.ComputeMin());
-  EXPECT_EQ(4, accum.ComputeMax());
-}
-
-TEST(RollingAccumulatorTest, RollingSamplesDouble) {
-  RollingAccumulator<double> accum(10);
-  for (int i = 0; i < 23; ++i) {
-    accum.AddSample(5 * i);
-  }
-
-  EXPECT_EQ(10u, accum.count());
-  EXPECT_DOUBLE_EQ(875.0, accum.ComputeSum());
-  EXPECT_DOUBLE_EQ(87.5, accum.ComputeMean());
-  EXPECT_NEAR(105.049, accum.ComputeWeightedMean(kLearningRate), 0.1);
-  EXPECT_NEAR(229.166667, accum.ComputeVariance(), 25);
-  EXPECT_DOUBLE_EQ(65.0, accum.ComputeMin());
-  EXPECT_DOUBLE_EQ(110.0, accum.ComputeMax());
-}
-
-TEST(RollingAccumulatorTest, ComputeWeightedMeanCornerCases) {
-  RollingAccumulator<int> accum(10);
-  EXPECT_DOUBLE_EQ(0.0, accum.ComputeWeightedMean(kLearningRate));
-  EXPECT_DOUBLE_EQ(0.0, accum.ComputeWeightedMean(0.0));
-  EXPECT_DOUBLE_EQ(0.0, accum.ComputeWeightedMean(1.1));
-
-  for (int i = 0; i < 8; ++i) {
-    accum.AddSample(i);
-  }
-
-  EXPECT_DOUBLE_EQ(3.5, accum.ComputeMean());
-  EXPECT_DOUBLE_EQ(3.5, accum.ComputeWeightedMean(0));
-  EXPECT_DOUBLE_EQ(3.5, accum.ComputeWeightedMean(1.1));
-  EXPECT_NEAR(6.0, accum.ComputeWeightedMean(kLearningRate), 0.1);
-}
-
-}  // namespace rtc
diff --git a/rtc_base/rtccertificate.cc b/rtc_base/rtccertificate.cc
deleted file mode 100644
index f5af47e..0000000
--- a/rtc_base/rtccertificate.cc
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- *  Copyright 2015 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 <memory>
-
-#include "webrtc/rtc_base/rtccertificate.h"
-
-#include "webrtc/rtc_base/checks.h"
-
-namespace rtc {
-
-scoped_refptr<RTCCertificate> RTCCertificate::Create(
-    std::unique_ptr<SSLIdentity> identity) {
-  return new RefCountedObject<RTCCertificate>(identity.release());
-}
-
-RTCCertificate::RTCCertificate(SSLIdentity* identity)
-    : identity_(identity) {
-  RTC_DCHECK(identity_);
-}
-
-RTCCertificate::~RTCCertificate() {
-}
-
-uint64_t RTCCertificate::Expires() const {
-  int64_t expires = ssl_certificate().CertificateExpirationTime();
-  if (expires != -1)
-    return static_cast<uint64_t>(expires) * kNumMillisecsPerSec;
-  // If the expiration time could not be retrieved return an expired timestamp.
-  return 0;  // = 1970-01-01
-}
-
-bool RTCCertificate::HasExpired(uint64_t now) const {
-  return Expires() <= now;
-}
-
-const SSLCertificate& RTCCertificate::ssl_certificate() const {
-  return identity_->certificate();
-}
-
-RTCCertificatePEM RTCCertificate::ToPEM() const {
-  return RTCCertificatePEM(identity_->PrivateKeyToPEMString(),
-                           ssl_certificate().ToPEMString());
-}
-
-scoped_refptr<RTCCertificate> RTCCertificate::FromPEM(
-    const RTCCertificatePEM& pem) {
-  std::unique_ptr<SSLIdentity> identity(SSLIdentity::FromPEMStrings(
-      pem.private_key(), pem.certificate()));
-  if (!identity)
-    return nullptr;
-  return new RefCountedObject<RTCCertificate>(identity.release());
-}
-
-bool RTCCertificate::operator==(const RTCCertificate& certificate) const {
-  return *this->identity_ == *certificate.identity_;
-}
-
-bool RTCCertificate::operator!=(const RTCCertificate& certificate) const {
-  return !(*this == certificate);
-}
-
-}  // namespace rtc
diff --git a/rtc_base/rtccertificate.h b/rtc_base/rtccertificate.h
deleted file mode 100644
index 141023f..0000000
--- a/rtc_base/rtccertificate.h
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- *  Copyright 2015 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_RTC_BASE_RTCCERTIFICATE_H_
-#define WEBRTC_RTC_BASE_RTCCERTIFICATE_H_
-
-#include <stdint.h>
-
-#include <memory>
-
-#include "webrtc/rtc_base/refcount.h"
-#include "webrtc/rtc_base/scoped_ref_ptr.h"
-#include "webrtc/rtc_base/sslidentity.h"
-
-namespace rtc {
-
-// This class contains PEM strings of an RTCCertificate's private key and
-// certificate and acts as a text representation of RTCCertificate. Certificates
-// can be serialized and deserialized to and from this format, which allows for
-// cloning and storing of certificates to disk. The PEM format is that of
-// |SSLIdentity::PrivateKeyToPEMString| and |SSLCertificate::ToPEMString|, e.g.
-// the string representations used by OpenSSL.
-class RTCCertificatePEM {
- public:
-  RTCCertificatePEM(
-      const std::string& private_key,
-      const std::string& certificate)
-      : private_key_(private_key),
-        certificate_(certificate) {}
-
-  const std::string& private_key() const { return private_key_; }
-  const std::string& certificate() const { return certificate_; }
-
- private:
-  std::string private_key_;
-  std::string certificate_;
-};
-
-// A thin abstraction layer between "lower level crypto stuff" like
-// SSLCertificate and WebRTC usage. Takes ownership of some lower level objects,
-// reference counting protects these from premature destruction.
-class RTCCertificate : public RefCountInterface {
- public:
-  // Takes ownership of |identity|.
-  static scoped_refptr<RTCCertificate> Create(
-      std::unique_ptr<SSLIdentity> identity);
-
-  // Returns the expiration time in ms relative to epoch, 1970-01-01T00:00:00Z.
-  uint64_t Expires() const;
-  // Checks if the certificate has expired, where |now| is expressed in ms
-  // relative to epoch, 1970-01-01T00:00:00Z.
-  bool HasExpired(uint64_t now) const;
-  const SSLCertificate& ssl_certificate() const;
-
-  // TODO(hbos): If possible, remove once RTCCertificate and its
-  // ssl_certificate() is used in all relevant places. Should not pass around
-  // raw SSLIdentity* for the sake of accessing SSLIdentity::certificate().
-  // However, some places might need SSLIdentity* for its public/private key...
-  SSLIdentity* identity() const { return identity_.get(); }
-
-  // To/from PEM, a text representation of the RTCCertificate.
-  RTCCertificatePEM ToPEM() const;
-  // Can return nullptr if the certificate is invalid.
-  static scoped_refptr<RTCCertificate> FromPEM(const RTCCertificatePEM& pem);
-  bool operator==(const RTCCertificate& certificate) const;
-  bool operator!=(const RTCCertificate& certificate) const;
-
- protected:
-  explicit RTCCertificate(SSLIdentity* identity);
-  ~RTCCertificate() override;
-
- private:
-  // The SSLIdentity is the owner of the SSLCertificate. To protect our
-  // ssl_certificate() we take ownership of |identity_|.
-  std::unique_ptr<SSLIdentity> identity_;
-};
-
-}  // namespace rtc
-
-#endif  // WEBRTC_RTC_BASE_RTCCERTIFICATE_H_
diff --git a/rtc_base/rtccertificate_unittest.cc b/rtc_base/rtccertificate_unittest.cc
deleted file mode 100644
index 348364d..0000000
--- a/rtc_base/rtccertificate_unittest.cc
+++ /dev/null
@@ -1,146 +0,0 @@
-/*
- *  Copyright 2015 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 <memory>
-#include <utility>
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/fakesslidentity.h"
-#include "webrtc/rtc_base/gunit.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/rtccertificate.h"
-#include "webrtc/rtc_base/safe_conversions.h"
-#include "webrtc/rtc_base/sslidentity.h"
-#include "webrtc/rtc_base/thread.h"
-#include "webrtc/rtc_base/timeutils.h"
-
-namespace rtc {
-
-namespace {
-
-static const char* kTestCertCommonName = "RTCCertificateTest's certificate";
-
-}  // namespace
-
-class RTCCertificateTest : public testing::Test {
- public:
-  RTCCertificateTest() {}
-  ~RTCCertificateTest() {}
-
- protected:
-  scoped_refptr<RTCCertificate> GenerateECDSA() {
-    std::unique_ptr<SSLIdentity> identity(
-        SSLIdentity::Generate(kTestCertCommonName, KeyParams::ECDSA()));
-    RTC_CHECK(identity);
-    return RTCCertificate::Create(std::move(identity));
-  }
-
-  // Timestamp note:
-  //   All timestamps in this unittest are expressed in number of seconds since
-  // epoch, 1970-01-01T00:00:00Z (UTC). The RTCCertificate interface uses ms,
-  // but only seconds-precision is supported by SSLCertificate. To make the
-  // tests clearer we convert everything to seconds since the precision matters
-  // when generating certificates or comparing timestamps.
-  //   As a result, ExpiresSeconds and HasExpiredSeconds are used instead of
-  // RTCCertificate::Expires and ::HasExpired for ms -> s conversion.
-
-  uint64_t NowSeconds() const {
-    return TimeNanos() / kNumNanosecsPerSec;
-  }
-
-  uint64_t ExpiresSeconds(const scoped_refptr<RTCCertificate>& cert) const {
-    uint64_t exp_ms = cert->Expires();
-    uint64_t exp_s = exp_ms / kNumMillisecsPerSec;
-    // Make sure this did not result in loss of precision.
-    RTC_CHECK_EQ(exp_s * kNumMillisecsPerSec, exp_ms);
-    return exp_s;
-  }
-
-  bool HasExpiredSeconds(const scoped_refptr<RTCCertificate>& cert,
-                         uint64_t now_s) const {
-    return cert->HasExpired(now_s * kNumMillisecsPerSec);
-  }
-
-  // An RTC_CHECK ensures that |expires_s| this is in valid range of time_t as
-  // is required by SSLIdentityParams. On some 32-bit systems time_t is limited
-  // to < 2^31. On such systems this will fail for expiration times of year 2038
-  // or later.
-  scoped_refptr<RTCCertificate> GenerateCertificateWithExpires(
-      uint64_t expires_s) const {
-    RTC_CHECK(IsValueInRangeForNumericType<time_t>(expires_s));
-
-    SSLIdentityParams params;
-    params.common_name = kTestCertCommonName;
-    params.not_before = 0;
-    params.not_after = static_cast<time_t>(expires_s);
-    // Certificate type does not matter for our purposes, using ECDSA because it
-    // is fast to generate.
-    params.key_params = KeyParams::ECDSA();
-
-    std::unique_ptr<SSLIdentity> identity(SSLIdentity::GenerateForTest(params));
-    return RTCCertificate::Create(std::move(identity));
-  }
-};
-
-TEST_F(RTCCertificateTest, NewCertificateNotExpired) {
-  // Generate a real certificate without specifying the expiration time.
-  // Certificate type doesn't matter, using ECDSA because it's fast to generate.
-  scoped_refptr<RTCCertificate> certificate = GenerateECDSA();
-
-  uint64_t now = NowSeconds();
-  EXPECT_FALSE(HasExpiredSeconds(certificate, now));
-  // Even without specifying the expiration time we would expect it to be valid
-  // for at least half an hour.
-  EXPECT_FALSE(HasExpiredSeconds(certificate, now + 30*60));
-}
-
-TEST_F(RTCCertificateTest, UsesExpiresAskedFor) {
-  uint64_t now = NowSeconds();
-  scoped_refptr<RTCCertificate> certificate =
-      GenerateCertificateWithExpires(now);
-  EXPECT_EQ(now, ExpiresSeconds(certificate));
-}
-
-TEST_F(RTCCertificateTest, ExpiresInOneSecond) {
-  // Generate a certificate that expires in 1s.
-  uint64_t now = NowSeconds();
-  scoped_refptr<RTCCertificate> certificate =
-      GenerateCertificateWithExpires(now + 1);
-  // Now it should not have expired.
-  EXPECT_FALSE(HasExpiredSeconds(certificate, now));
-  // In 2s it should have expired.
-  EXPECT_TRUE(HasExpiredSeconds(certificate, now + 2));
-}
-
-TEST_F(RTCCertificateTest, DifferentCertificatesNotEqual) {
-  scoped_refptr<RTCCertificate> a = GenerateECDSA();
-  scoped_refptr<RTCCertificate> b = GenerateECDSA();
-  EXPECT_TRUE(*a != *b);
-}
-
-TEST_F(RTCCertificateTest, CloneWithPEMSerialization) {
-  scoped_refptr<RTCCertificate> orig = GenerateECDSA();
-
-  // To PEM.
-  RTCCertificatePEM orig_pem = orig->ToPEM();
-  // Clone from PEM.
-  scoped_refptr<RTCCertificate> clone = RTCCertificate::FromPEM(orig_pem);
-  EXPECT_TRUE(clone);
-  EXPECT_TRUE(*orig == *clone);
-  EXPECT_EQ(orig->Expires(), clone->Expires());
-}
-
-TEST_F(RTCCertificateTest, FromPEMWithInvalidPEM) {
-  RTCCertificatePEM pem("not a valid PEM", "not a valid PEM");
-  scoped_refptr<RTCCertificate> certificate = RTCCertificate::FromPEM(pem);
-  EXPECT_FALSE(certificate);
-}
-
-}  // namespace rtc
diff --git a/rtc_base/rtccertificategenerator.cc b/rtc_base/rtccertificategenerator.cc
deleted file mode 100644
index 037babd..0000000
--- a/rtc_base/rtccertificategenerator.cc
+++ /dev/null
@@ -1,160 +0,0 @@
-/*
- *  Copyright 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/rtc_base/rtccertificategenerator.h"
-
-#include <algorithm>
-#include <memory>
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/sslidentity.h"
-
-namespace rtc {
-
-namespace {
-
-// A certificates' subject and issuer name.
-const char kIdentityName[] = "WebRTC";
-
-const uint64_t kYearInSeconds = 365 * 24 * 60 * 60;
-
-enum {
-  MSG_GENERATE,
-  MSG_GENERATE_DONE,
-};
-
-// Helper class for generating certificates asynchronously; a single task
-// instance is responsible for a single asynchronous certificate generation
-// request. We are using a separate helper class so that a generation request
-// can outlive the |RTCCertificateGenerator| that spawned it.
-class RTCCertificateGenerationTask : public RefCountInterface,
-                                     public MessageHandler {
- public:
-  RTCCertificateGenerationTask(
-      Thread* signaling_thread,
-      Thread* worker_thread,
-      const KeyParams& key_params,
-      const Optional<uint64_t>& expires_ms,
-      const scoped_refptr<RTCCertificateGeneratorCallback>& callback)
-      : signaling_thread_(signaling_thread),
-        worker_thread_(worker_thread),
-        key_params_(key_params),
-        expires_ms_(expires_ms),
-        callback_(callback) {
-    RTC_DCHECK(signaling_thread_);
-    RTC_DCHECK(worker_thread_);
-    RTC_DCHECK(callback_);
-  }
-  ~RTCCertificateGenerationTask() override {}
-
-  // Handles |MSG_GENERATE| and its follow-up |MSG_GENERATE_DONE|.
-  void OnMessage(Message* msg) override {
-    switch (msg->message_id) {
-      case MSG_GENERATE:
-        RTC_DCHECK(worker_thread_->IsCurrent());
-
-        // Perform the certificate generation work here on the worker thread.
-        certificate_ = RTCCertificateGenerator::GenerateCertificate(
-            key_params_, expires_ms_);
-
-        // Handle callbacks on signaling thread. Pass on the |msg->pdata|
-        // (which references |this| with ref counting) to that thread.
-        signaling_thread_->Post(RTC_FROM_HERE, this, MSG_GENERATE_DONE,
-                                msg->pdata);
-        break;
-      case MSG_GENERATE_DONE:
-        RTC_DCHECK(signaling_thread_->IsCurrent());
-
-        // Perform callback with result here on the signaling thread.
-        if (certificate_) {
-          callback_->OnSuccess(certificate_);
-        } else {
-          callback_->OnFailure();
-        }
-
-        // Destroy |msg->pdata| which references |this| with ref counting. This
-        // may result in |this| being deleted - do not touch member variables
-        // after this line.
-        delete msg->pdata;
-        return;
-      default:
-        RTC_NOTREACHED();
-    }
-  }
-
- private:
-  Thread* const signaling_thread_;
-  Thread* const worker_thread_;
-  const KeyParams key_params_;
-  const Optional<uint64_t> expires_ms_;
-  const scoped_refptr<RTCCertificateGeneratorCallback> callback_;
-  scoped_refptr<RTCCertificate> certificate_;
-};
-
-}  // namespace
-
-// static
-scoped_refptr<RTCCertificate>
-RTCCertificateGenerator::GenerateCertificate(
-    const KeyParams& key_params,
-    const Optional<uint64_t>& expires_ms) {
-  if (!key_params.IsValid())
-    return nullptr;
-  SSLIdentity* identity;
-  if (!expires_ms) {
-    identity = SSLIdentity::Generate(kIdentityName, key_params);
-  } else {
-    uint64_t expires_s = *expires_ms / 1000;
-    // Limit the expiration time to something reasonable (a year). This was
-    // somewhat arbitrarily chosen. It also ensures that the value is not too
-    // large for the unspecified |time_t|.
-    expires_s = std::min(expires_s, kYearInSeconds);
-    // TODO(torbjorng): Stop using |time_t|, its type is unspecified. It it safe
-    // to assume it can hold up to a year's worth of seconds (and more), but
-    // |SSLIdentity::Generate| should stop relying on |time_t|.
-    // See bugs.webrtc.org/5720.
-    time_t cert_lifetime_s = static_cast<time_t>(expires_s);
-    identity = SSLIdentity::GenerateWithExpiration(
-        kIdentityName, key_params, cert_lifetime_s);
-  }
-  if (!identity)
-    return nullptr;
-  std::unique_ptr<SSLIdentity> identity_sptr(identity);
-  return RTCCertificate::Create(std::move(identity_sptr));
-}
-
-RTCCertificateGenerator::RTCCertificateGenerator(
-    Thread* signaling_thread, Thread* worker_thread)
-    : signaling_thread_(signaling_thread),
-      worker_thread_(worker_thread) {
-  RTC_DCHECK(signaling_thread_);
-  RTC_DCHECK(worker_thread_);
-}
-
-void RTCCertificateGenerator::GenerateCertificateAsync(
-    const KeyParams& key_params,
-    const Optional<uint64_t>& expires_ms,
-    const scoped_refptr<RTCCertificateGeneratorCallback>& callback) {
-  RTC_DCHECK(signaling_thread_->IsCurrent());
-  RTC_DCHECK(callback);
-
-  // Create a new |RTCCertificateGenerationTask| for this generation request. It
-  // is reference counted and referenced by the message data, ensuring it lives
-  // until the task has completed (independent of |RTCCertificateGenerator|).
-  ScopedRefMessageData<RTCCertificateGenerationTask>* msg_data =
-      new ScopedRefMessageData<RTCCertificateGenerationTask>(
-          new RefCountedObject<RTCCertificateGenerationTask>(
-              signaling_thread_, worker_thread_, key_params, expires_ms,
-              callback));
-  worker_thread_->Post(RTC_FROM_HERE, msg_data->data().get(), MSG_GENERATE,
-                       msg_data);
-}
-
-}  // namespace rtc
diff --git a/rtc_base/rtccertificategenerator.h b/rtc_base/rtccertificategenerator.h
deleted file mode 100644
index 4e0437c..0000000
--- a/rtc_base/rtccertificategenerator.h
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- *  Copyright 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_RTC_BASE_RTCCERTIFICATEGENERATOR_H_
-#define WEBRTC_RTC_BASE_RTCCERTIFICATEGENERATOR_H_
-
-#include "webrtc/api/optional.h"
-#include "webrtc/rtc_base/refcount.h"
-#include "webrtc/rtc_base/rtccertificate.h"
-#include "webrtc/rtc_base/scoped_ref_ptr.h"
-#include "webrtc/rtc_base/sslidentity.h"
-#include "webrtc/rtc_base/thread.h"
-
-namespace rtc {
-
-// See |RTCCertificateGeneratorInterface::GenerateCertificateAsync|.
-class RTCCertificateGeneratorCallback : public RefCountInterface {
- public:
-  virtual void OnSuccess(
-    const scoped_refptr<RTCCertificate>& certificate) = 0;
-  virtual void OnFailure() = 0;
-
- protected:
-  ~RTCCertificateGeneratorCallback() override {}
-};
-
-// Generates |RTCCertificate|s.
-// See |RTCCertificateGenerator| for the WebRTC repo's implementation.
-class RTCCertificateGeneratorInterface {
- public:
-  virtual ~RTCCertificateGeneratorInterface() {}
-
-  // Generates a certificate asynchronously on the worker thread.
-  // Must be called on the signaling thread. The |callback| is invoked with the
-  // result on the signaling thread. |exipres_ms| optionally specifies for how
-  // long we want the certificate to be valid, but the implementation may choose
-  // its own restrictions on the expiration time.
-  virtual void GenerateCertificateAsync(
-      const KeyParams& key_params,
-      const Optional<uint64_t>& expires_ms,
-      const scoped_refptr<RTCCertificateGeneratorCallback>& callback) = 0;
-};
-
-// Standard implementation of |RTCCertificateGeneratorInterface|.
-// The static function |GenerateCertificate| generates a certificate on the
-// current thread. The |RTCCertificateGenerator| instance generates certificates
-// asynchronously on the worker thread with |GenerateCertificateAsync|.
-class RTCCertificateGenerator : public RTCCertificateGeneratorInterface {
- public:
-  // Generates a certificate on the current thread. Returns null on failure.
-  // If |expires_ms| is specified, the certificate will expire in approximately
-  // that many milliseconds from now. |expires_ms| is limited to a year, a
-  // larger value than that is clamped down to a year. If |expires_ms| is not
-  // specified, a default expiration time is used.
-  static scoped_refptr<RTCCertificate> GenerateCertificate(
-      const KeyParams& key_params,
-      const Optional<uint64_t>& expires_ms);
-
-  RTCCertificateGenerator(Thread* signaling_thread, Thread* worker_thread);
-  ~RTCCertificateGenerator() override {}
-
-  // |RTCCertificateGeneratorInterface| overrides.
-  // If |expires_ms| is specified, the certificate will expire in approximately
-  // that many milliseconds from now. |expires_ms| is limited to a year, a
-  // larger value than that is clamped down to a year. If |expires_ms| is not
-  // specified, a default expiration time is used.
-  void GenerateCertificateAsync(
-      const KeyParams& key_params,
-      const Optional<uint64_t>& expires_ms,
-      const scoped_refptr<RTCCertificateGeneratorCallback>& callback) override;
-
- private:
-  Thread* const signaling_thread_;
-  Thread* const worker_thread_;
-};
-
-}  // namespace rtc
-
-#endif  // WEBRTC_RTC_BASE_RTCCERTIFICATEGENERATOR_H_
diff --git a/rtc_base/rtccertificategenerator_unittest.cc b/rtc_base/rtccertificategenerator_unittest.cc
deleted file mode 100644
index 829a6ee..0000000
--- a/rtc_base/rtccertificategenerator_unittest.cc
+++ /dev/null
@@ -1,152 +0,0 @@
-/*
- *  Copyright 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/rtc_base/rtccertificategenerator.h"
-
-#include <memory>
-
-#include "webrtc/api/optional.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/gunit.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/thread.h"
-
-namespace rtc {
-
-class RTCCertificateGeneratorFixture : public RTCCertificateGeneratorCallback {
- public:
-  RTCCertificateGeneratorFixture()
-      : signaling_thread_(Thread::Current()),
-        worker_thread_(Thread::Create()),
-        generate_async_completed_(false) {
-    RTC_CHECK(signaling_thread_);
-    RTC_CHECK(worker_thread_->Start());
-    generator_.reset(
-      new RTCCertificateGenerator(signaling_thread_, worker_thread_.get()));
-  }
-  ~RTCCertificateGeneratorFixture() override {}
-
-  RTCCertificateGenerator* generator() const { return generator_.get(); }
-  RTCCertificate* certificate() const { return certificate_.get(); }
-
-  void OnSuccess(const scoped_refptr<RTCCertificate>& certificate) override {
-    RTC_CHECK(signaling_thread_->IsCurrent());
-    RTC_CHECK(certificate);
-    certificate_ = certificate;
-    generate_async_completed_ = true;
-  }
-  void OnFailure() override {
-    RTC_CHECK(signaling_thread_->IsCurrent());
-    certificate_ = nullptr;
-    generate_async_completed_ = true;
-  }
-
-  bool GenerateAsyncCompleted() {
-    RTC_CHECK(signaling_thread_->IsCurrent());
-    if (generate_async_completed_) {
-      // Reset flag so that future generation requests are not considered done.
-      generate_async_completed_ = false;
-      return true;
-    }
-    return false;
-  }
-
- protected:
-  Thread* const signaling_thread_;
-  std::unique_ptr<Thread> worker_thread_;
-  std::unique_ptr<RTCCertificateGenerator> generator_;
-  scoped_refptr<RTCCertificate> certificate_;
-  bool generate_async_completed_;
-};
-
-class RTCCertificateGeneratorTest
-    : public testing::Test {
- public:
-  RTCCertificateGeneratorTest()
-      : fixture_(new RefCountedObject<RTCCertificateGeneratorFixture>()) {}
-  ~RTCCertificateGeneratorTest() {}
-
- protected:
-  static const int kGenerationTimeoutMs = 10000;
-
-  scoped_refptr<RTCCertificateGeneratorFixture> fixture_;
-};
-
-TEST_F(RTCCertificateGeneratorTest, GenerateECDSA) {
-  EXPECT_TRUE(RTCCertificateGenerator::GenerateCertificate(
-      KeyParams::ECDSA(),
-      Optional<uint64_t>()));
-}
-
-TEST_F(RTCCertificateGeneratorTest, GenerateRSA) {
-  EXPECT_TRUE(RTCCertificateGenerator::GenerateCertificate(
-      KeyParams::RSA(),
-      Optional<uint64_t>()));
-}
-
-TEST_F(RTCCertificateGeneratorTest, GenerateAsyncECDSA) {
-  EXPECT_FALSE(fixture_->certificate());
-  fixture_->generator()->GenerateCertificateAsync(
-      KeyParams::ECDSA(),
-      Optional<uint64_t>(),
-      fixture_);
-  // Until generation has completed, the certificate is null. Since this is an
-  // async call, generation must not have completed until we process messages
-  // posted to this thread (which is done by |EXPECT_TRUE_WAIT|).
-  EXPECT_FALSE(fixture_->GenerateAsyncCompleted());
-  EXPECT_FALSE(fixture_->certificate());
-  EXPECT_TRUE_WAIT(fixture_->GenerateAsyncCompleted(), kGenerationTimeoutMs);
-  EXPECT_TRUE(fixture_->certificate());
-}
-
-TEST_F(RTCCertificateGeneratorTest, GenerateWithExpires) {
-  // By generating two certificates with different expiration we can compare the
-  // two expiration times relative to each other without knowing the current
-  // time relative to epoch, 1970-01-01T00:00:00Z. This verifies that the
-  // expiration parameter is correctly used relative to the generator's clock,
-  // but does not verify that this clock is relative to epoch.
-
-  // Generate a certificate that expires immediately.
-  scoped_refptr<RTCCertificate> cert_a =
-      RTCCertificateGenerator::GenerateCertificate(
-          KeyParams::ECDSA(), Optional<uint64_t>(0));
-  EXPECT_TRUE(cert_a);
-
-  // Generate a certificate that expires in one minute.
-  const uint64_t kExpiresMs = 60000;
-  scoped_refptr<RTCCertificate> cert_b =
-      RTCCertificateGenerator::GenerateCertificate(
-          KeyParams::ECDSA(), Optional<uint64_t>(kExpiresMs));
-  EXPECT_TRUE(cert_b);
-
-  // Verify that |cert_b| expires approximately |kExpiresMs| after |cert_a|
-  // (allowing a +/- 1 second plus maximum generation time difference).
-  EXPECT_GT(cert_b->Expires(), cert_a->Expires());
-  uint64_t expires_diff = cert_b->Expires() - cert_a->Expires();
-  EXPECT_GE(expires_diff, kExpiresMs);
-  EXPECT_LE(expires_diff, kExpiresMs + 2*kGenerationTimeoutMs + 1000);
-}
-
-TEST_F(RTCCertificateGeneratorTest, GenerateWithInvalidParamsShouldFail) {
-  KeyParams invalid_params = KeyParams::RSA(0, 0);
-  EXPECT_FALSE(invalid_params.IsValid());
-
-  EXPECT_FALSE(RTCCertificateGenerator::GenerateCertificate(
-      invalid_params, Optional<uint64_t>()));
-
-  fixture_->generator()->GenerateCertificateAsync(
-      invalid_params,
-      Optional<uint64_t>(),
-      fixture_);
-  EXPECT_TRUE_WAIT(fixture_->GenerateAsyncCompleted(), kGenerationTimeoutMs);
-  EXPECT_FALSE(fixture_->certificate());
-}
-
-}  // namespace rtc
diff --git a/rtc_base/safe_compare.h b/rtc_base/safe_compare.h
deleted file mode 100644
index e9c622b..0000000
--- a/rtc_base/safe_compare.h
+++ /dev/null
@@ -1,176 +0,0 @@
-/*
- *  Copyright 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.
- */
-
-// This file defines six constexpr functions:
-//
-//   rtc::SafeEq  // ==
-//   rtc::SafeNe  // !=
-//   rtc::SafeLt  // <
-//   rtc::SafeLe  // <=
-//   rtc::SafeGt  // >
-//   rtc::SafeGe  // >=
-//
-// They each accept two arguments of arbitrary types, and in almost all cases,
-// they simply call the appropriate comparison operator. However, if both
-// arguments are integers, they don't compare them using C++'s quirky rules,
-// but instead adhere to the true mathematical definitions. It is as if the
-// arguments were first converted to infinite-range signed integers, and then
-// compared, although of course nothing expensive like that actually takes
-// place. In practice, for signed/signed and unsigned/unsigned comparisons and
-// some mixed-signed comparisons with a compile-time constant, the overhead is
-// zero; in the remaining cases, it is just a few machine instructions (no
-// branches).
-
-#ifndef WEBRTC_RTC_BASE_SAFE_COMPARE_H_
-#define WEBRTC_RTC_BASE_SAFE_COMPARE_H_
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include <type_traits>
-#include <utility>
-
-#include "webrtc/rtc_base/type_traits.h"
-
-namespace rtc {
-
-namespace safe_cmp_impl {
-
-template <size_t N>
-struct LargerIntImpl : std::false_type {};
-template <>
-struct LargerIntImpl<sizeof(int8_t)> : std::true_type {
-  using type = int16_t;
-};
-template <>
-struct LargerIntImpl<sizeof(int16_t)> : std::true_type {
-  using type = int32_t;
-};
-template <>
-struct LargerIntImpl<sizeof(int32_t)> : std::true_type {
-  using type = int64_t;
-};
-
-// LargerInt<T1, T2>::value is true iff there's a signed type that's larger
-// than T1 (and no larger than the larger of T2 and int*, for performance
-// reasons); and if there is such a type, LargerInt<T1, T2>::type is an alias
-// for it.
-template <typename T1, typename T2>
-struct LargerInt
-    : LargerIntImpl<sizeof(T1) < sizeof(T2) || sizeof(T1) < sizeof(int*)
-                        ? sizeof(T1)
-                        : 0> {};
-
-template <typename T>
-constexpr typename std::make_unsigned<T>::type MakeUnsigned(T a) {
-  return static_cast<typename std::make_unsigned<T>::type>(a);
-}
-
-// Overload for when both T1 and T2 have the same signedness.
-template <typename Op,
-          typename T1,
-          typename T2,
-          typename std::enable_if<std::is_signed<T1>::value ==
-                                  std::is_signed<T2>::value>::type* = nullptr>
-constexpr bool Cmp(T1 a, T2 b) {
-  return Op::Op(a, b);
-}
-
-// Overload for signed - unsigned comparison that can be promoted to a bigger
-// signed type.
-template <typename Op,
-          typename T1,
-          typename T2,
-          typename std::enable_if<std::is_signed<T1>::value &&
-                                  std::is_unsigned<T2>::value &&
-                                  LargerInt<T2, T1>::value>::type* = nullptr>
-constexpr bool Cmp(T1 a, T2 b) {
-  return Op::Op(a, static_cast<typename LargerInt<T2, T1>::type>(b));
-}
-
-// Overload for unsigned - signed comparison that can be promoted to a bigger
-// signed type.
-template <typename Op,
-          typename T1,
-          typename T2,
-          typename std::enable_if<std::is_unsigned<T1>::value &&
-                                  std::is_signed<T2>::value &&
-                                  LargerInt<T1, T2>::value>::type* = nullptr>
-constexpr bool Cmp(T1 a, T2 b) {
-  return Op::Op(static_cast<typename LargerInt<T1, T2>::type>(a), b);
-}
-
-// Overload for signed - unsigned comparison that can't be promoted to a bigger
-// signed type.
-template <typename Op,
-          typename T1,
-          typename T2,
-          typename std::enable_if<std::is_signed<T1>::value &&
-                                  std::is_unsigned<T2>::value &&
-                                  !LargerInt<T2, T1>::value>::type* = nullptr>
-constexpr bool Cmp(T1 a, T2 b) {
-  return a < 0 ? Op::Op(-1, 0) : Op::Op(safe_cmp_impl::MakeUnsigned(a), b);
-}
-
-// Overload for unsigned - signed comparison that can't be promoted to a bigger
-// signed type.
-template <typename Op,
-          typename T1,
-          typename T2,
-          typename std::enable_if<std::is_unsigned<T1>::value &&
-                                  std::is_signed<T2>::value &&
-                                  !LargerInt<T1, T2>::value>::type* = nullptr>
-constexpr bool Cmp(T1 a, T2 b) {
-  return b < 0 ? Op::Op(0, -1) : Op::Op(a, safe_cmp_impl::MakeUnsigned(b));
-}
-
-#define RTC_SAFECMP_MAKE_OP(name, op)      \
-  struct name {                            \
-    template <typename T1, typename T2>    \
-    static constexpr bool Op(T1 a, T2 b) { \
-      return a op b;                       \
-    }                                      \
-  };
-RTC_SAFECMP_MAKE_OP(EqOp, ==)
-RTC_SAFECMP_MAKE_OP(NeOp, !=)
-RTC_SAFECMP_MAKE_OP(LtOp, <)
-RTC_SAFECMP_MAKE_OP(LeOp, <=)
-RTC_SAFECMP_MAKE_OP(GtOp, >)
-RTC_SAFECMP_MAKE_OP(GeOp, >=)
-#undef RTC_SAFECMP_MAKE_OP
-
-}  // namespace safe_cmp_impl
-
-#define RTC_SAFECMP_MAKE_FUN(name)                                            \
-  template <typename T1, typename T2>                                         \
-  constexpr                                                                   \
-      typename std::enable_if<IsIntlike<T1>::value && IsIntlike<T2>::value,   \
-                              bool>::type Safe##name(T1 a, T2 b) {            \
-    /* Unary plus here turns enums into real integral types. */               \
-    return safe_cmp_impl::Cmp<safe_cmp_impl::name##Op>(+a, +b);               \
-  }                                                                           \
-  template <typename T1, typename T2>                                         \
-  constexpr                                                                   \
-      typename std::enable_if<!IsIntlike<T1>::value || !IsIntlike<T2>::value, \
-                              bool>::type Safe##name(const T1& a,             \
-                                                     const T2& b) {           \
-    return safe_cmp_impl::name##Op::Op(a, b);                                 \
-  }
-RTC_SAFECMP_MAKE_FUN(Eq)
-RTC_SAFECMP_MAKE_FUN(Ne)
-RTC_SAFECMP_MAKE_FUN(Lt)
-RTC_SAFECMP_MAKE_FUN(Le)
-RTC_SAFECMP_MAKE_FUN(Gt)
-RTC_SAFECMP_MAKE_FUN(Ge)
-#undef RTC_SAFECMP_MAKE_FUN
-
-}  // namespace rtc
-
-#endif  // WEBRTC_RTC_BASE_SAFE_COMPARE_H_
diff --git a/rtc_base/safe_compare_unittest.cc b/rtc_base/safe_compare_unittest.cc
deleted file mode 100644
index 2a135a1..0000000
--- a/rtc_base/safe_compare_unittest.cc
+++ /dev/null
@@ -1,394 +0,0 @@
-/*
- *  Copyright 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 <limits>
-
-#include "webrtc/rtc_base/safe_compare.h"
-#include "webrtc/test/gtest.h"
-
-namespace rtc {
-
-namespace {
-
-constexpr std::uintmax_t umax = std::numeric_limits<std::uintmax_t>::max();
-constexpr std::intmax_t imin = std::numeric_limits<std::intmax_t>::min();
-constexpr std::intmax_t m1 = -1;
-
-// m1 and umax have the same representation because we use 2's complement
-// arithmetic, so naive casting will confuse them.
-static_assert(static_cast<std::uintmax_t>(m1) == umax, "");
-static_assert(m1 == static_cast<std::intmax_t>(umax), "");
-
-static const std::pair<int, int> p1(1, 1);
-static const std::pair<int, int> p2(1, 2);
-
-}  // namespace
-
-// clang-format off
-
-// These functions aren't used in the tests, but it's useful to look at the
-// compiler output for them, and verify that (1) the same-signedness *Safe
-// functions result in exactly the same code as their *Ref counterparts, and
-// that (2) the mixed-signedness *Safe functions have just a few extra
-// arithmetic and logic instructions (but no extra control flow instructions).
-bool TestLessThanRef(      int a,      int b) { return a < b; }
-bool TestLessThanRef( unsigned a, unsigned b) { return a < b; }
-bool TestLessThanSafe(     int a,      int b) { return SafeLt(a, b); }
-bool TestLessThanSafe(unsigned a, unsigned b) { return SafeLt(a, b); }
-bool TestLessThanSafe(unsigned a,      int b) { return SafeLt(a, b); }
-bool TestLessThanSafe(     int a, unsigned b) { return SafeLt(a, b); }
-
-// For these, we expect the *Ref and *Safe functions to result in identical
-// code, except for the ones that compare a signed variable with an unsigned
-// constant; in that case, the *Ref function does an unsigned comparison (fast
-// but incorrect) and the *Safe function spends a few extra instructions on
-// doing it right.
-bool TestLessThan17Ref(       int a) { return a < 17; }
-bool TestLessThan17Ref(  unsigned a) { return a < 17; }
-bool TestLessThan17uRef(      int a) { return static_cast<unsigned>(a) < 17u; }
-bool TestLessThan17uRef( unsigned a) { return a < 17u; }
-bool TestLessThan17Safe(      int a) { return SafeLt(a, 17); }
-bool TestLessThan17Safe( unsigned a) { return SafeLt(a, 17); }
-bool TestLessThan17uSafe(     int a) { return SafeLt(a, 17u); }
-bool TestLessThan17uSafe(unsigned a) { return SafeLt(a, 17u); }
-
-// Cases where we can't convert to a larger signed type.
-bool TestLessThanMax( intmax_t a, uintmax_t b) { return SafeLt(a, b); }
-bool TestLessThanMax(uintmax_t a,  intmax_t b) { return SafeLt(a, b); }
-bool TestLessThanMax17u( intmax_t a) { return SafeLt(a, uintmax_t{17}); }
-bool TestLessThanMax17( uintmax_t a) { return SafeLt(a,  intmax_t{17}); }
-
-// Cases where the compiler should be able to compute the result at compile
-// time.
-bool TestLessThanConst1() { return SafeLt(  -1,    1); }
-bool TestLessThanConst2() { return SafeLt(  m1, umax); }
-bool TestLessThanConst3() { return SafeLt(umax, imin); }
-bool TestLessThanConst4(unsigned a) { return SafeLt( a, -1); }
-bool TestLessThanConst5(unsigned a) { return SafeLt(-1,  a); }
-bool TestLessThanConst6(unsigned a) { return SafeLt( a,  a); }
-
-// clang-format on
-
-TEST(SafeCmpTest, Eq) {
-  static_assert(!SafeEq(-1, 2), "");
-  static_assert(!SafeEq(-1, 2u), "");
-  static_assert(!SafeEq(2, -1), "");
-  static_assert(!SafeEq(2u, -1), "");
-
-  static_assert(!SafeEq(1, 2), "");
-  static_assert(!SafeEq(1, 2u), "");
-  static_assert(!SafeEq(1u, 2), "");
-  static_assert(!SafeEq(1u, 2u), "");
-  static_assert(!SafeEq(2, 1), "");
-  static_assert(!SafeEq(2, 1u), "");
-  static_assert(!SafeEq(2u, 1), "");
-  static_assert(!SafeEq(2u, 1u), "");
-
-  static_assert(SafeEq(2, 2), "");
-  static_assert(SafeEq(2, 2u), "");
-  static_assert(SafeEq(2u, 2), "");
-  static_assert(SafeEq(2u, 2u), "");
-
-  static_assert(SafeEq(imin, imin), "");
-  static_assert(!SafeEq(imin, umax), "");
-  static_assert(!SafeEq(umax, imin), "");
-  static_assert(SafeEq(umax, umax), "");
-
-  static_assert(SafeEq(m1, m1), "");
-  static_assert(!SafeEq(m1, umax), "");
-  static_assert(!SafeEq(umax, m1), "");
-  static_assert(SafeEq(umax, umax), "");
-
-  static_assert(!SafeEq(1, 2), "");
-  static_assert(!SafeEq(1, 2.0), "");
-  static_assert(!SafeEq(1.0, 2), "");
-  static_assert(!SafeEq(1.0, 2.0), "");
-  static_assert(!SafeEq(2, 1), "");
-  static_assert(!SafeEq(2, 1.0), "");
-  static_assert(!SafeEq(2.0, 1), "");
-  static_assert(!SafeEq(2.0, 1.0), "");
-
-  static_assert(SafeEq(2, 2), "");
-  static_assert(SafeEq(2, 2.0), "");
-  static_assert(SafeEq(2.0, 2), "");
-  static_assert(SafeEq(2.0, 2.0), "");
-
-  EXPECT_TRUE(SafeEq(p1, p1));
-  EXPECT_FALSE(SafeEq(p1, p2));
-  EXPECT_FALSE(SafeEq(p2, p1));
-  EXPECT_TRUE(SafeEq(p2, p2));
-}
-
-TEST(SafeCmpTest, Ne) {
-  static_assert(SafeNe(-1, 2), "");
-  static_assert(SafeNe(-1, 2u), "");
-  static_assert(SafeNe(2, -1), "");
-  static_assert(SafeNe(2u, -1), "");
-
-  static_assert(SafeNe(1, 2), "");
-  static_assert(SafeNe(1, 2u), "");
-  static_assert(SafeNe(1u, 2), "");
-  static_assert(SafeNe(1u, 2u), "");
-  static_assert(SafeNe(2, 1), "");
-  static_assert(SafeNe(2, 1u), "");
-  static_assert(SafeNe(2u, 1), "");
-  static_assert(SafeNe(2u, 1u), "");
-
-  static_assert(!SafeNe(2, 2), "");
-  static_assert(!SafeNe(2, 2u), "");
-  static_assert(!SafeNe(2u, 2), "");
-  static_assert(!SafeNe(2u, 2u), "");
-
-  static_assert(!SafeNe(imin, imin), "");
-  static_assert(SafeNe(imin, umax), "");
-  static_assert(SafeNe(umax, imin), "");
-  static_assert(!SafeNe(umax, umax), "");
-
-  static_assert(!SafeNe(m1, m1), "");
-  static_assert(SafeNe(m1, umax), "");
-  static_assert(SafeNe(umax, m1), "");
-  static_assert(!SafeNe(umax, umax), "");
-
-  static_assert(SafeNe(1, 2), "");
-  static_assert(SafeNe(1, 2.0), "");
-  static_assert(SafeNe(1.0, 2), "");
-  static_assert(SafeNe(1.0, 2.0), "");
-  static_assert(SafeNe(2, 1), "");
-  static_assert(SafeNe(2, 1.0), "");
-  static_assert(SafeNe(2.0, 1), "");
-  static_assert(SafeNe(2.0, 1.0), "");
-
-  static_assert(!SafeNe(2, 2), "");
-  static_assert(!SafeNe(2, 2.0), "");
-  static_assert(!SafeNe(2.0, 2), "");
-  static_assert(!SafeNe(2.0, 2.0), "");
-
-  EXPECT_FALSE(SafeNe(p1, p1));
-  EXPECT_TRUE(SafeNe(p1, p2));
-  EXPECT_TRUE(SafeNe(p2, p1));
-  EXPECT_FALSE(SafeNe(p2, p2));
-}
-
-TEST(SafeCmpTest, Lt) {
-  static_assert(SafeLt(-1, 2), "");
-  static_assert(SafeLt(-1, 2u), "");
-  static_assert(!SafeLt(2, -1), "");
-  static_assert(!SafeLt(2u, -1), "");
-
-  static_assert(SafeLt(1, 2), "");
-  static_assert(SafeLt(1, 2u), "");
-  static_assert(SafeLt(1u, 2), "");
-  static_assert(SafeLt(1u, 2u), "");
-  static_assert(!SafeLt(2, 1), "");
-  static_assert(!SafeLt(2, 1u), "");
-  static_assert(!SafeLt(2u, 1), "");
-  static_assert(!SafeLt(2u, 1u), "");
-
-  static_assert(!SafeLt(2, 2), "");
-  static_assert(!SafeLt(2, 2u), "");
-  static_assert(!SafeLt(2u, 2), "");
-  static_assert(!SafeLt(2u, 2u), "");
-
-  static_assert(!SafeLt(imin, imin), "");
-  static_assert(SafeLt(imin, umax), "");
-  static_assert(!SafeLt(umax, imin), "");
-  static_assert(!SafeLt(umax, umax), "");
-
-  static_assert(!SafeLt(m1, m1), "");
-  static_assert(SafeLt(m1, umax), "");
-  static_assert(!SafeLt(umax, m1), "");
-  static_assert(!SafeLt(umax, umax), "");
-
-  static_assert(SafeLt(1, 2), "");
-  static_assert(SafeLt(1, 2.0), "");
-  static_assert(SafeLt(1.0, 2), "");
-  static_assert(SafeLt(1.0, 2.0), "");
-  static_assert(!SafeLt(2, 1), "");
-  static_assert(!SafeLt(2, 1.0), "");
-  static_assert(!SafeLt(2.0, 1), "");
-  static_assert(!SafeLt(2.0, 1.0), "");
-
-  static_assert(!SafeLt(2, 2), "");
-  static_assert(!SafeLt(2, 2.0), "");
-  static_assert(!SafeLt(2.0, 2), "");
-  static_assert(!SafeLt(2.0, 2.0), "");
-
-  EXPECT_FALSE(SafeLt(p1, p1));
-  EXPECT_TRUE(SafeLt(p1, p2));
-  EXPECT_FALSE(SafeLt(p2, p1));
-  EXPECT_FALSE(SafeLt(p2, p2));
-}
-
-TEST(SafeCmpTest, Le) {
-  static_assert(SafeLe(-1, 2), "");
-  static_assert(SafeLe(-1, 2u), "");
-  static_assert(!SafeLe(2, -1), "");
-  static_assert(!SafeLe(2u, -1), "");
-
-  static_assert(SafeLe(1, 2), "");
-  static_assert(SafeLe(1, 2u), "");
-  static_assert(SafeLe(1u, 2), "");
-  static_assert(SafeLe(1u, 2u), "");
-  static_assert(!SafeLe(2, 1), "");
-  static_assert(!SafeLe(2, 1u), "");
-  static_assert(!SafeLe(2u, 1), "");
-  static_assert(!SafeLe(2u, 1u), "");
-
-  static_assert(SafeLe(2, 2), "");
-  static_assert(SafeLe(2, 2u), "");
-  static_assert(SafeLe(2u, 2), "");
-  static_assert(SafeLe(2u, 2u), "");
-
-  static_assert(SafeLe(imin, imin), "");
-  static_assert(SafeLe(imin, umax), "");
-  static_assert(!SafeLe(umax, imin), "");
-  static_assert(SafeLe(umax, umax), "");
-
-  static_assert(SafeLe(m1, m1), "");
-  static_assert(SafeLe(m1, umax), "");
-  static_assert(!SafeLe(umax, m1), "");
-  static_assert(SafeLe(umax, umax), "");
-
-  static_assert(SafeLe(1, 2), "");
-  static_assert(SafeLe(1, 2.0), "");
-  static_assert(SafeLe(1.0, 2), "");
-  static_assert(SafeLe(1.0, 2.0), "");
-  static_assert(!SafeLe(2, 1), "");
-  static_assert(!SafeLe(2, 1.0), "");
-  static_assert(!SafeLe(2.0, 1), "");
-  static_assert(!SafeLe(2.0, 1.0), "");
-
-  static_assert(SafeLe(2, 2), "");
-  static_assert(SafeLe(2, 2.0), "");
-  static_assert(SafeLe(2.0, 2), "");
-  static_assert(SafeLe(2.0, 2.0), "");
-
-  EXPECT_TRUE(SafeLe(p1, p1));
-  EXPECT_TRUE(SafeLe(p1, p2));
-  EXPECT_FALSE(SafeLe(p2, p1));
-  EXPECT_TRUE(SafeLe(p2, p2));
-}
-
-TEST(SafeCmpTest, Gt) {
-  static_assert(!SafeGt(-1, 2), "");
-  static_assert(!SafeGt(-1, 2u), "");
-  static_assert(SafeGt(2, -1), "");
-  static_assert(SafeGt(2u, -1), "");
-
-  static_assert(!SafeGt(1, 2), "");
-  static_assert(!SafeGt(1, 2u), "");
-  static_assert(!SafeGt(1u, 2), "");
-  static_assert(!SafeGt(1u, 2u), "");
-  static_assert(SafeGt(2, 1), "");
-  static_assert(SafeGt(2, 1u), "");
-  static_assert(SafeGt(2u, 1), "");
-  static_assert(SafeGt(2u, 1u), "");
-
-  static_assert(!SafeGt(2, 2), "");
-  static_assert(!SafeGt(2, 2u), "");
-  static_assert(!SafeGt(2u, 2), "");
-  static_assert(!SafeGt(2u, 2u), "");
-
-  static_assert(!SafeGt(imin, imin), "");
-  static_assert(!SafeGt(imin, umax), "");
-  static_assert(SafeGt(umax, imin), "");
-  static_assert(!SafeGt(umax, umax), "");
-
-  static_assert(!SafeGt(m1, m1), "");
-  static_assert(!SafeGt(m1, umax), "");
-  static_assert(SafeGt(umax, m1), "");
-  static_assert(!SafeGt(umax, umax), "");
-
-  static_assert(!SafeGt(1, 2), "");
-  static_assert(!SafeGt(1, 2.0), "");
-  static_assert(!SafeGt(1.0, 2), "");
-  static_assert(!SafeGt(1.0, 2.0), "");
-  static_assert(SafeGt(2, 1), "");
-  static_assert(SafeGt(2, 1.0), "");
-  static_assert(SafeGt(2.0, 1), "");
-  static_assert(SafeGt(2.0, 1.0), "");
-
-  static_assert(!SafeGt(2, 2), "");
-  static_assert(!SafeGt(2, 2.0), "");
-  static_assert(!SafeGt(2.0, 2), "");
-  static_assert(!SafeGt(2.0, 2.0), "");
-
-  EXPECT_FALSE(SafeGt(p1, p1));
-  EXPECT_FALSE(SafeGt(p1, p2));
-  EXPECT_TRUE(SafeGt(p2, p1));
-  EXPECT_FALSE(SafeGt(p2, p2));
-}
-
-TEST(SafeCmpTest, Ge) {
-  static_assert(!SafeGe(-1, 2), "");
-  static_assert(!SafeGe(-1, 2u), "");
-  static_assert(SafeGe(2, -1), "");
-  static_assert(SafeGe(2u, -1), "");
-
-  static_assert(!SafeGe(1, 2), "");
-  static_assert(!SafeGe(1, 2u), "");
-  static_assert(!SafeGe(1u, 2), "");
-  static_assert(!SafeGe(1u, 2u), "");
-  static_assert(SafeGe(2, 1), "");
-  static_assert(SafeGe(2, 1u), "");
-  static_assert(SafeGe(2u, 1), "");
-  static_assert(SafeGe(2u, 1u), "");
-
-  static_assert(SafeGe(2, 2), "");
-  static_assert(SafeGe(2, 2u), "");
-  static_assert(SafeGe(2u, 2), "");
-  static_assert(SafeGe(2u, 2u), "");
-
-  static_assert(SafeGe(imin, imin), "");
-  static_assert(!SafeGe(imin, umax), "");
-  static_assert(SafeGe(umax, imin), "");
-  static_assert(SafeGe(umax, umax), "");
-
-  static_assert(SafeGe(m1, m1), "");
-  static_assert(!SafeGe(m1, umax), "");
-  static_assert(SafeGe(umax, m1), "");
-  static_assert(SafeGe(umax, umax), "");
-
-  static_assert(!SafeGe(1, 2), "");
-  static_assert(!SafeGe(1, 2.0), "");
-  static_assert(!SafeGe(1.0, 2), "");
-  static_assert(!SafeGe(1.0, 2.0), "");
-  static_assert(SafeGe(2, 1), "");
-  static_assert(SafeGe(2, 1.0), "");
-  static_assert(SafeGe(2.0, 1), "");
-  static_assert(SafeGe(2.0, 1.0), "");
-
-  static_assert(SafeGe(2, 2), "");
-  static_assert(SafeGe(2, 2.0), "");
-  static_assert(SafeGe(2.0, 2), "");
-  static_assert(SafeGe(2.0, 2.0), "");
-
-  EXPECT_TRUE(SafeGe(p1, p1));
-  EXPECT_FALSE(SafeGe(p1, p2));
-  EXPECT_TRUE(SafeGe(p2, p1));
-  EXPECT_TRUE(SafeGe(p2, p2));
-}
-
-TEST(SafeCmpTest, Enum) {
-  enum E1 { e1 = 13 };
-  enum { e2 = 13 };
-  enum E3 : unsigned { e3 = 13 };
-  enum : unsigned { e4 = 13 };
-  static_assert(SafeEq(13, e1), "");
-  static_assert(SafeEq(13u, e1), "");
-  static_assert(SafeEq(13, e2), "");
-  static_assert(SafeEq(13u, e2), "");
-  static_assert(SafeEq(13, e3), "");
-  static_assert(SafeEq(13u, e3), "");
-  static_assert(SafeEq(13, e4), "");
-  static_assert(SafeEq(13u, e4), "");
-}
-
-}  // namespace rtc
diff --git a/rtc_base/safe_conversions.h b/rtc_base/safe_conversions.h
deleted file mode 100644
index 877f28a..0000000
--- a/rtc_base/safe_conversions.h
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- *  Copyright 2014 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.
- */
-
-// Borrowed from Chromium's src/base/numerics/safe_conversions.h.
-
-#ifndef WEBRTC_RTC_BASE_SAFE_CONVERSIONS_H_
-#define WEBRTC_RTC_BASE_SAFE_CONVERSIONS_H_
-
-#include <limits>
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/safe_conversions_impl.h"
-
-namespace rtc {
-
-// Convenience function that returns true if the supplied value is in range
-// for the destination type.
-template <typename Dst, typename Src>
-inline bool IsValueInRangeForNumericType(Src value) {
-  return internal::RangeCheck<Dst>(value) == internal::TYPE_VALID;
-}
-
-// checked_cast<> and dchecked_cast<> are analogous to static_cast<> for
-// numeric types, except that they [D]CHECK that the specified numeric
-// conversion will not overflow or underflow. NaN source will always trigger
-// the [D]CHECK.
-template <typename Dst, typename Src>
-inline Dst checked_cast(Src value) {
-  RTC_CHECK(IsValueInRangeForNumericType<Dst>(value));
-  return static_cast<Dst>(value);
-}
-template <typename Dst, typename Src>
-inline Dst dchecked_cast(Src value) {
-  RTC_DCHECK(IsValueInRangeForNumericType<Dst>(value));
-  return static_cast<Dst>(value);
-}
-
-// saturated_cast<> is analogous to static_cast<> for numeric types, except
-// that the specified numeric conversion will saturate rather than overflow or
-// underflow. NaN assignment to an integral will trigger a RTC_CHECK condition.
-template <typename Dst, typename Src>
-inline Dst saturated_cast(Src value) {
-  // Optimization for floating point values, which already saturate.
-  if (std::numeric_limits<Dst>::is_iec559)
-    return static_cast<Dst>(value);
-
-  switch (internal::RangeCheck<Dst>(value)) {
-    case internal::TYPE_VALID:
-      return static_cast<Dst>(value);
-
-    case internal::TYPE_UNDERFLOW:
-      return std::numeric_limits<Dst>::min();
-
-    case internal::TYPE_OVERFLOW:
-      return std::numeric_limits<Dst>::max();
-
-    // Should fail only on attempting to assign NaN to a saturated integer.
-    case internal::TYPE_INVALID:
-      FATAL();
-      return std::numeric_limits<Dst>::max();
-  }
-
-  FATAL();
-  return static_cast<Dst>(value);
-}
-
-}  // namespace rtc
-
-#endif  // WEBRTC_RTC_BASE_SAFE_CONVERSIONS_H_
diff --git a/rtc_base/safe_conversions_impl.h b/rtc_base/safe_conversions_impl.h
deleted file mode 100644
index ef116cd..0000000
--- a/rtc_base/safe_conversions_impl.h
+++ /dev/null
@@ -1,188 +0,0 @@
-/*
- *  Copyright 2014 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.
- */
-
-// Borrowed from Chromium's src/base/numerics/safe_conversions_impl.h.
-
-#ifndef WEBRTC_RTC_BASE_SAFE_CONVERSIONS_IMPL_H_
-#define WEBRTC_RTC_BASE_SAFE_CONVERSIONS_IMPL_H_
-
-#include <limits>
-
-namespace rtc {
-namespace internal {
-
-enum DstSign {
-  DST_UNSIGNED,
-  DST_SIGNED
-};
-
-enum SrcSign {
-  SRC_UNSIGNED,
-  SRC_SIGNED
-};
-
-enum DstRange {
-  OVERLAPS_RANGE,
-  CONTAINS_RANGE
-};
-
-// Helper templates to statically determine if our destination type can contain
-// all values represented by the source type.
-
-template <typename Dst, typename Src,
-          DstSign IsDstSigned = std::numeric_limits<Dst>::is_signed ?
-                                DST_SIGNED : DST_UNSIGNED,
-          SrcSign IsSrcSigned = std::numeric_limits<Src>::is_signed ?
-                                SRC_SIGNED : SRC_UNSIGNED>
-struct StaticRangeCheck {};
-
-template <typename Dst, typename Src>
-struct StaticRangeCheck<Dst, Src, DST_SIGNED, SRC_SIGNED> {
-  typedef std::numeric_limits<Dst> DstLimits;
-  typedef std::numeric_limits<Src> SrcLimits;
-  // Compare based on max_exponent, which we must compute for integrals.
-  static const size_t kDstMaxExponent = DstLimits::is_iec559 ?
-                                        DstLimits::max_exponent :
-                                        (sizeof(Dst) * 8 - 1);
-  static const size_t kSrcMaxExponent = SrcLimits::is_iec559 ?
-                                        SrcLimits::max_exponent :
-                                        (sizeof(Src) * 8 - 1);
-  static const DstRange value = kDstMaxExponent >= kSrcMaxExponent ?
-                                CONTAINS_RANGE : OVERLAPS_RANGE;
-};
-
-template <typename Dst, typename Src>
-struct StaticRangeCheck<Dst, Src, DST_UNSIGNED, SRC_UNSIGNED> {
-  static const DstRange value = sizeof(Dst) >= sizeof(Src) ?
-                                CONTAINS_RANGE : OVERLAPS_RANGE;
-};
-
-template <typename Dst, typename Src>
-struct StaticRangeCheck<Dst, Src, DST_SIGNED, SRC_UNSIGNED> {
-  typedef std::numeric_limits<Dst> DstLimits;
-  typedef std::numeric_limits<Src> SrcLimits;
-  // Compare based on max_exponent, which we must compute for integrals.
-  static const size_t kDstMaxExponent = DstLimits::is_iec559 ?
-                                        DstLimits::max_exponent :
-                                        (sizeof(Dst) * 8 - 1);
-  static const size_t kSrcMaxExponent = sizeof(Src) * 8;
-  static const DstRange value = kDstMaxExponent >= kSrcMaxExponent ?
-                                CONTAINS_RANGE : OVERLAPS_RANGE;
-};
-
-template <typename Dst, typename Src>
-struct StaticRangeCheck<Dst, Src, DST_UNSIGNED, SRC_SIGNED> {
-  static const DstRange value = OVERLAPS_RANGE;
-};
-
-
-enum RangeCheckResult {
-  TYPE_VALID = 0,      // Value can be represented by the destination type.
-  TYPE_UNDERFLOW = 1,  // Value would overflow.
-  TYPE_OVERFLOW = 2,   // Value would underflow.
-  TYPE_INVALID = 3     // Source value is invalid (i.e. NaN).
-};
-
-// This macro creates a RangeCheckResult from an upper and lower bound
-// check by taking advantage of the fact that only NaN can be out of range in
-// both directions at once.
-#define BASE_NUMERIC_RANGE_CHECK_RESULT(is_in_upper_bound, is_in_lower_bound) \
-    RangeCheckResult(((is_in_upper_bound) ? 0 : TYPE_OVERFLOW) | \
-                            ((is_in_lower_bound) ? 0 : TYPE_UNDERFLOW))
-
-template <typename Dst,
-          typename Src,
-          DstSign IsDstSigned = std::numeric_limits<Dst>::is_signed ?
-                                DST_SIGNED : DST_UNSIGNED,
-          SrcSign IsSrcSigned = std::numeric_limits<Src>::is_signed ?
-                                SRC_SIGNED : SRC_UNSIGNED,
-          DstRange IsSrcRangeContained = StaticRangeCheck<Dst, Src>::value>
-struct RangeCheckImpl {};
-
-// The following templates are for ranges that must be verified at runtime. We
-// split it into checks based on signedness to avoid confusing casts and
-// compiler warnings on signed an unsigned comparisons.
-
-// Dst range always contains the result: nothing to check.
-template <typename Dst, typename Src, DstSign IsDstSigned, SrcSign IsSrcSigned>
-struct RangeCheckImpl<Dst, Src, IsDstSigned, IsSrcSigned, CONTAINS_RANGE> {
-  static RangeCheckResult Check(Src value) {
-    return TYPE_VALID;
-  }
-};
-
-// Signed to signed narrowing.
-template <typename Dst, typename Src>
-struct RangeCheckImpl<Dst, Src, DST_SIGNED, SRC_SIGNED, OVERLAPS_RANGE> {
-  static RangeCheckResult Check(Src value) {
-    typedef std::numeric_limits<Dst> DstLimits;
-    return DstLimits::is_iec559 ?
-           BASE_NUMERIC_RANGE_CHECK_RESULT(
-               value <= static_cast<Src>(DstLimits::max()),
-               value >= static_cast<Src>(DstLimits::max() * -1)) :
-           BASE_NUMERIC_RANGE_CHECK_RESULT(
-               value <= static_cast<Src>(DstLimits::max()),
-               value >= static_cast<Src>(DstLimits::min()));
-  }
-};
-
-// Unsigned to unsigned narrowing.
-template <typename Dst, typename Src>
-struct RangeCheckImpl<Dst, Src, DST_UNSIGNED, SRC_UNSIGNED, OVERLAPS_RANGE> {
-  static RangeCheckResult Check(Src value) {
-    typedef std::numeric_limits<Dst> DstLimits;
-    return BASE_NUMERIC_RANGE_CHECK_RESULT(
-               value <= static_cast<Src>(DstLimits::max()), true);
-  }
-};
-
-// Unsigned to signed.
-template <typename Dst, typename Src>
-struct RangeCheckImpl<Dst, Src, DST_SIGNED, SRC_UNSIGNED, OVERLAPS_RANGE> {
-  static RangeCheckResult Check(Src value) {
-    typedef std::numeric_limits<Dst> DstLimits;
-    return sizeof(Dst) > sizeof(Src) ? TYPE_VALID :
-           BASE_NUMERIC_RANGE_CHECK_RESULT(
-               value <= static_cast<Src>(DstLimits::max()), true);
-  }
-};
-
-// Signed to unsigned.
-template <typename Dst, typename Src>
-struct RangeCheckImpl<Dst, Src, DST_UNSIGNED, SRC_SIGNED, OVERLAPS_RANGE> {
-  static RangeCheckResult Check(Src value) {
-    typedef std::numeric_limits<Dst> DstLimits;
-    typedef std::numeric_limits<Src> SrcLimits;
-    // Compare based on max_exponent, which we must compute for integrals.
-    static const size_t kDstMaxExponent = sizeof(Dst) * 8;
-    static const size_t kSrcMaxExponent = SrcLimits::is_iec559 ?
-                                          SrcLimits::max_exponent :
-                                          (sizeof(Src) * 8 - 1);
-    return (kDstMaxExponent >= kSrcMaxExponent) ?
-           BASE_NUMERIC_RANGE_CHECK_RESULT(true, value >= static_cast<Src>(0)) :
-           BASE_NUMERIC_RANGE_CHECK_RESULT(
-               value <= static_cast<Src>(DstLimits::max()),
-               value >= static_cast<Src>(0));
-  }
-};
-
-template <typename Dst, typename Src>
-inline RangeCheckResult RangeCheck(Src value) {
-  static_assert(std::numeric_limits<Src>::is_specialized,
-                "argument must be numeric");
-  static_assert(std::numeric_limits<Dst>::is_specialized,
-                "result must be numeric");
-  return RangeCheckImpl<Dst, Src>::Check(value);
-}
-
-}  // namespace internal
-}  // namespace rtc
-
-#endif  // WEBRTC_RTC_BASE_SAFE_CONVERSIONS_IMPL_H_
diff --git a/rtc_base/safe_minmax.h b/rtc_base/safe_minmax.h
deleted file mode 100644
index 77d75a1..0000000
--- a/rtc_base/safe_minmax.h
+++ /dev/null
@@ -1,335 +0,0 @@
-/*
- *  Copyright 2017 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.
- */
-
-// Minimum and maximum
-// ===================
-//
-//   rtc::SafeMin(x, y)
-//   rtc::SafeMax(x, y)
-//
-// (These are both constexpr.)
-//
-// Accept two arguments of either any two integral or any two floating-point
-// types, and return the smaller and larger value, respectively, with no
-// truncation or wrap-around. If only one of the input types is statically
-// guaranteed to be able to represent the result, the return type is that type;
-// if either one would do, the result type is the smaller type. (One of these
-// two cases always applies.)
-//
-//   * The case with one floating-point and one integral type is not allowed,
-//     because the floating-point type will have greater range, but may not
-//     have sufficient precision to represent the integer value exactly.)
-//
-// Clamp (a.k.a. constrain to a given interval)
-// ============================================
-//
-//   rtc::SafeClamp(x, a, b)
-//
-// Accepts three arguments of any mix of integral types or any mix of
-// floating-point types, and returns the value in the closed interval [a, b]
-// that is closest to x (that is, if x < a it returns a; if x > b it returns b;
-// and if a <= x <= b it returns x). As for SafeMin() and SafeMax(), there is
-// no truncation or wrap-around. The result type
-//
-//   1. is statically guaranteed to be able to represent the result;
-//
-//   2. is no larger than the largest of the three argument types; and
-//
-//   3. has the same signedness as the type of the third argument, if this is
-//      possible without violating the First or Second Law.
-//
-// There is always at least one type that meets criteria 1 and 2. If more than
-// one type meets these criteria equally well, the result type is one of the
-// types that is smallest. Note that unlike SafeMin() and SafeMax(),
-// SafeClamp() will sometimes pick a return type that isn't the type of any of
-// its arguments.
-//
-//   * In this context, a type A is smaller than a type B if it has a smaller
-//     range; that is, if A::max() - A::min() < B::max() - B::min(). For
-//     example, int8_t < int16_t == uint16_t < int32_t, and all integral types
-//     are smaller than all floating-point types.)
-//
-//   * As for SafeMin and SafeMax, mixing integer and floating-point arguments
-//     is not allowed, because floating-point types have greater range than
-//     integer types, but do not have sufficient precision to represent the
-//     values of most integer types exactly.
-//
-// Requesting a specific return type
-// =================================
-//
-// All three functions allow callers to explicitly specify the return type as a
-// template parameter, overriding the default return type. E.g.
-//
-//   rtc::SafeMin<int>(x, y)  // returns an int
-//
-// If the requested type is statically guaranteed to be able to represent the
-// result, then everything's fine, and the return type is as requested. But if
-// the requested type is too small, a static_assert is triggered.
-
-#ifndef WEBRTC_RTC_BASE_SAFE_MINMAX_H_
-#define WEBRTC_RTC_BASE_SAFE_MINMAX_H_
-
-#include <limits>
-#include <type_traits>
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/safe_compare.h"
-#include "webrtc/rtc_base/type_traits.h"
-
-namespace rtc {
-
-namespace safe_minmax_impl {
-
-// Make the range of a type available via something other than a constexpr
-// function, to work around MSVC limitations. See
-// https://blogs.msdn.microsoft.com/vcblog/2015/12/02/partial-support-for-expression-sfinae-in-vs-2015-update-1/
-template <typename T>
-struct Limits {
-  static constexpr T lowest = std::numeric_limits<T>::lowest();
-  static constexpr T max = std::numeric_limits<T>::max();
-};
-
-template <typename T, bool is_enum = std::is_enum<T>::value>
-struct UnderlyingType;
-
-template <typename T>
-struct UnderlyingType<T, false> {
-  using type = T;
-};
-
-template <typename T>
-struct UnderlyingType<T, true> {
-  using type = typename std::underlying_type<T>::type;
-};
-
-// Given two types T1 and T2, find types that can hold the smallest (in
-// ::min_t) and the largest (in ::max_t) of the two values.
-template <typename T1,
-          typename T2,
-          bool int1 = IsIntlike<T1>::value,
-          bool int2 = IsIntlike<T2>::value>
-struct MType {
-  static_assert(int1 == int2,
-                "You may not mix integral and floating-point arguments");
-};
-
-// Specialization for when neither type is integral (and therefore presumably
-// floating-point).
-template <typename T1, typename T2>
-struct MType<T1, T2, false, false> {
-  using min_t = typename std::common_type<T1, T2>::type;
-  static_assert(std::is_same<min_t, T1>::value ||
-                    std::is_same<min_t, T2>::value,
-                "");
-
-  using max_t = typename std::common_type<T1, T2>::type;
-  static_assert(std::is_same<max_t, T1>::value ||
-                    std::is_same<max_t, T2>::value,
-                "");
-};
-
-// Specialization for when both types are integral.
-template <typename T1, typename T2>
-struct MType<T1, T2, true, true> {
-  // The type with the lowest minimum value. In case of a tie, the type with
-  // the lowest maximum value. In case that too is a tie, the types have the
-  // same range, and we arbitrarily pick T1.
-  using min_t = typename std::conditional<
-      SafeLt(Limits<T1>::lowest, Limits<T2>::lowest),
-      T1,
-      typename std::conditional<
-          SafeGt(Limits<T1>::lowest, Limits<T2>::lowest),
-          T2,
-          typename std::conditional<SafeLe(Limits<T1>::max, Limits<T2>::max),
-                                    T1,
-                                    T2>::type>::type>::type;
-  static_assert(std::is_same<min_t, T1>::value ||
-                    std::is_same<min_t, T2>::value,
-                "");
-
-  // The type with the highest maximum value. In case of a tie, the types have
-  // the same range (because in C++, integer types with the same maximum also
-  // have the same minimum).
-  static_assert(SafeNe(Limits<T1>::max, Limits<T2>::max) ||
-                    SafeEq(Limits<T1>::lowest, Limits<T2>::lowest),
-                "integer types with the same max should have the same min");
-  using max_t = typename std::
-      conditional<SafeGe(Limits<T1>::max, Limits<T2>::max), T1, T2>::type;
-  static_assert(std::is_same<max_t, T1>::value ||
-                    std::is_same<max_t, T2>::value,
-                "");
-};
-
-// A dummy type that we pass around at compile time but never actually use.
-// Declared but not defined.
-struct DefaultType;
-
-// ::type is A, except we fall back to B if A is DefaultType. We static_assert
-// that the chosen type can hold all values that B can hold.
-template <typename A, typename B>
-struct TypeOr {
-  using type = typename std::
-      conditional<std::is_same<A, DefaultType>::value, B, A>::type;
-  static_assert(SafeLe(Limits<type>::lowest, Limits<B>::lowest) &&
-                    SafeGe(Limits<type>::max, Limits<B>::max),
-                "The specified type isn't large enough");
-  static_assert(IsIntlike<type>::value == IsIntlike<B>::value &&
-                    std::is_floating_point<type>::value ==
-                        std::is_floating_point<type>::value,
-                "float<->int conversions not allowed");
-};
-
-}  // namespace safe_minmax_impl
-
-template <
-    typename R = safe_minmax_impl::DefaultType,
-    typename T1 = safe_minmax_impl::DefaultType,
-    typename T2 = safe_minmax_impl::DefaultType,
-    typename R2 = typename safe_minmax_impl::TypeOr<
-        R,
-        typename safe_minmax_impl::MType<
-            typename safe_minmax_impl::UnderlyingType<T1>::type,
-            typename safe_minmax_impl::UnderlyingType<T2>::type>::min_t>::type>
-constexpr R2 SafeMin(T1 a, T2 b) {
-  static_assert(IsIntlike<T1>::value || std::is_floating_point<T1>::value,
-                "The first argument must be integral or floating-point");
-  static_assert(IsIntlike<T2>::value || std::is_floating_point<T2>::value,
-                "The second argument must be integral or floating-point");
-  return SafeLt(a, b) ? static_cast<R2>(a) : static_cast<R2>(b);
-}
-
-template <
-    typename R = safe_minmax_impl::DefaultType,
-    typename T1 = safe_minmax_impl::DefaultType,
-    typename T2 = safe_minmax_impl::DefaultType,
-    typename R2 = typename safe_minmax_impl::TypeOr<
-        R,
-        typename safe_minmax_impl::MType<
-            typename safe_minmax_impl::UnderlyingType<T1>::type,
-            typename safe_minmax_impl::UnderlyingType<T2>::type>::max_t>::type>
-constexpr R2 SafeMax(T1 a, T2 b) {
-  static_assert(IsIntlike<T1>::value || std::is_floating_point<T1>::value,
-                "The first argument must be integral or floating-point");
-  static_assert(IsIntlike<T2>::value || std::is_floating_point<T2>::value,
-                "The second argument must be integral or floating-point");
-  return SafeGt(a, b) ? static_cast<R2>(a) : static_cast<R2>(b);
-}
-
-namespace safe_minmax_impl {
-
-// Given three types T, L, and H, let ::type be a suitable return value for
-// SafeClamp(T, L, H). See the docs at the top of this file for details.
-template <typename T,
-          typename L,
-          typename H,
-          bool int1 = IsIntlike<T>::value,
-          bool int2 = IsIntlike<L>::value,
-          bool int3 = IsIntlike<H>::value>
-struct ClampType {
-  static_assert(int1 == int2 && int1 == int3,
-                "You may not mix integral and floating-point arguments");
-};
-
-// Specialization for when all three types are floating-point.
-template <typename T, typename L, typename H>
-struct ClampType<T, L, H, false, false, false> {
-  using type = typename std::common_type<T, L, H>::type;
-};
-
-// Specialization for when all three types are integral.
-template <typename T, typename L, typename H>
-struct ClampType<T, L, H, true, true, true> {
- private:
-  // Range of the return value. The return type must be able to represent this
-  // full range.
-  static constexpr auto r_min =
-      SafeMax(Limits<L>::lowest, SafeMin(Limits<H>::lowest, Limits<T>::lowest));
-  static constexpr auto r_max =
-      SafeMin(Limits<H>::max, SafeMax(Limits<L>::max, Limits<T>::max));
-
-  // Is the given type an acceptable return type? (That is, can it represent
-  // all possible return values, and is it no larger than the largest of the
-  // input types?)
-  template <typename A>
-  struct AcceptableType {
-   private:
-    static constexpr bool not_too_large = sizeof(A) <= sizeof(L) ||
-                                          sizeof(A) <= sizeof(H) ||
-                                          sizeof(A) <= sizeof(T);
-    static constexpr bool range_contained =
-        SafeLe(Limits<A>::lowest, r_min) && SafeLe(r_max, Limits<A>::max);
-
-   public:
-    static constexpr bool value = not_too_large && range_contained;
-  };
-
-  using best_signed_type = typename std::conditional<
-      AcceptableType<int8_t>::value,
-      int8_t,
-      typename std::conditional<
-          AcceptableType<int16_t>::value,
-          int16_t,
-          typename std::conditional<AcceptableType<int32_t>::value,
-                                    int32_t,
-                                    int64_t>::type>::type>::type;
-
-  using best_unsigned_type = typename std::conditional<
-      AcceptableType<uint8_t>::value,
-      uint8_t,
-      typename std::conditional<
-          AcceptableType<uint16_t>::value,
-          uint16_t,
-          typename std::conditional<AcceptableType<uint32_t>::value,
-                                    uint32_t,
-                                    uint64_t>::type>::type>::type;
-
- public:
-  // Pick the best type, preferring the same signedness as T but falling back
-  // to the other one if necessary.
-  using type = typename std::conditional<
-      std::is_signed<T>::value,
-      typename std::conditional<AcceptableType<best_signed_type>::value,
-                                best_signed_type,
-                                best_unsigned_type>::type,
-      typename std::conditional<AcceptableType<best_unsigned_type>::value,
-                                best_unsigned_type,
-                                best_signed_type>::type>::type;
-  static_assert(AcceptableType<type>::value, "");
-};
-
-}  // namespace safe_minmax_impl
-
-template <
-    typename R = safe_minmax_impl::DefaultType,
-    typename T = safe_minmax_impl::DefaultType,
-    typename L = safe_minmax_impl::DefaultType,
-    typename H = safe_minmax_impl::DefaultType,
-    typename R2 = typename safe_minmax_impl::TypeOr<
-        R,
-        typename safe_minmax_impl::ClampType<
-            typename safe_minmax_impl::UnderlyingType<T>::type,
-            typename safe_minmax_impl::UnderlyingType<L>::type,
-            typename safe_minmax_impl::UnderlyingType<H>::type>::type>::type>
-R2 SafeClamp(T x, L min, H max) {
-  static_assert(IsIntlike<H>::value || std::is_floating_point<H>::value,
-                "The first argument must be integral or floating-point");
-  static_assert(IsIntlike<T>::value || std::is_floating_point<T>::value,
-                "The second argument must be integral or floating-point");
-  static_assert(IsIntlike<L>::value || std::is_floating_point<L>::value,
-                "The third argument must be integral or floating-point");
-  RTC_DCHECK_LE(min, max);
-  return SafeLe(x, min)
-             ? static_cast<R2>(min)
-             : SafeGe(x, max) ? static_cast<R2>(max) : static_cast<R2>(x);
-}
-
-}  // namespace rtc
-
-#endif  // WEBRTC_RTC_BASE_SAFE_MINMAX_H_
diff --git a/rtc_base/safe_minmax_unittest.cc b/rtc_base/safe_minmax_unittest.cc
deleted file mode 100644
index a75b16d..0000000
--- a/rtc_base/safe_minmax_unittest.cc
+++ /dev/null
@@ -1,344 +0,0 @@
-/*
- *  Copyright 2017 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 <algorithm>
-#include <limits>
-
-#include "webrtc/rtc_base/safe_minmax.h"
-#include "webrtc/test/gtest.h"
-
-namespace rtc {
-
-namespace {
-
-// Functions that check that SafeMin(), SafeMax(), and SafeClamp() return the
-// specified type. The functions that end in "R" use an explicitly given return
-// type.
-
-template <typename T1, typename T2, typename Tmin, typename Tmax>
-constexpr bool TypeCheckMinMax() {
-  return std::is_same<decltype(SafeMin(std::declval<T1>(), std::declval<T2>())),
-                      Tmin>::value &&
-         std::is_same<decltype(SafeMax(std::declval<T1>(), std::declval<T2>())),
-                      Tmax>::value;
-}
-
-template <typename T1, typename T2, typename R>
-constexpr bool TypeCheckMinR() {
-  return std::is_same<
-      decltype(SafeMin<R>(std::declval<T1>(), std::declval<T2>())), R>::value;
-}
-
-template <typename T1, typename T2, typename R>
-constexpr bool TypeCheckMaxR() {
-  return std::is_same<
-      decltype(SafeMax<R>(std::declval<T1>(), std::declval<T2>())), R>::value;
-}
-
-template <typename T, typename L, typename H, typename R>
-constexpr bool TypeCheckClamp() {
-  return std::is_same<decltype(SafeClamp(std::declval<T>(), std::declval<L>(),
-                                         std::declval<H>())),
-                      R>::value;
-}
-
-template <typename T, typename L, typename H, typename R>
-constexpr bool TypeCheckClampR() {
-  return std::is_same<decltype(SafeClamp<R>(std::declval<T>(),
-                                            std::declval<L>(),
-                                            std::declval<H>())),
-                      R>::value;
-}
-
-// clang-format off
-
-// SafeMin/SafeMax: Check that all combinations of signed/unsigned 8/64 bits
-// give the correct default result type.
-static_assert(TypeCheckMinMax<  int8_t,   int8_t,   int8_t,   int8_t>(), "");
-static_assert(TypeCheckMinMax<  int8_t,  uint8_t,   int8_t,  uint8_t>(), "");
-static_assert(TypeCheckMinMax<  int8_t,  int64_t,  int64_t,  int64_t>(), "");
-static_assert(TypeCheckMinMax<  int8_t, uint64_t,   int8_t, uint64_t>(), "");
-static_assert(TypeCheckMinMax< uint8_t,   int8_t,   int8_t,  uint8_t>(), "");
-static_assert(TypeCheckMinMax< uint8_t,  uint8_t,  uint8_t,  uint8_t>(), "");
-static_assert(TypeCheckMinMax< uint8_t,  int64_t,  int64_t,  int64_t>(), "");
-static_assert(TypeCheckMinMax< uint8_t, uint64_t,  uint8_t, uint64_t>(), "");
-static_assert(TypeCheckMinMax< int64_t,   int8_t,  int64_t,  int64_t>(), "");
-static_assert(TypeCheckMinMax< int64_t,  uint8_t,  int64_t,  int64_t>(), "");
-static_assert(TypeCheckMinMax< int64_t,  int64_t,  int64_t,  int64_t>(), "");
-static_assert(TypeCheckMinMax< int64_t, uint64_t,  int64_t, uint64_t>(), "");
-static_assert(TypeCheckMinMax<uint64_t,   int8_t,   int8_t, uint64_t>(), "");
-static_assert(TypeCheckMinMax<uint64_t,  uint8_t,  uint8_t, uint64_t>(), "");
-static_assert(TypeCheckMinMax<uint64_t,  int64_t,  int64_t, uint64_t>(), "");
-static_assert(TypeCheckMinMax<uint64_t, uint64_t, uint64_t, uint64_t>(), "");
-
-// SafeClamp: Check that all combinations of signed/unsigned 8/64 bits give the
-// correct result type.
-static_assert(TypeCheckClamp<  int8_t,   int8_t,   int8_t,   int8_t>(), "");
-static_assert(TypeCheckClamp<  int8_t,   int8_t,  uint8_t,   int8_t>(), "");
-static_assert(TypeCheckClamp<  int8_t,   int8_t,  int64_t,   int8_t>(), "");
-static_assert(TypeCheckClamp<  int8_t,   int8_t, uint64_t,   int8_t>(), "");
-static_assert(TypeCheckClamp<  int8_t,  uint8_t,   int8_t,   int8_t>(), "");
-static_assert(TypeCheckClamp<  int8_t,  uint8_t,  uint8_t,  uint8_t>(), "");
-static_assert(TypeCheckClamp<  int8_t,  uint8_t,  int64_t,  int16_t>(), "");
-static_assert(TypeCheckClamp<  int8_t,  uint8_t, uint64_t,  int16_t>(), "");
-static_assert(TypeCheckClamp<  int8_t,  int64_t,   int8_t,   int8_t>(), "");
-static_assert(TypeCheckClamp<  int8_t,  int64_t,  uint8_t,  int16_t>(), "");
-static_assert(TypeCheckClamp<  int8_t,  int64_t,  int64_t,  int64_t>(), "");
-static_assert(TypeCheckClamp<  int8_t,  int64_t, uint64_t,  int64_t>(), "");
-static_assert(TypeCheckClamp<  int8_t, uint64_t,   int8_t,   int8_t>(), "");
-static_assert(TypeCheckClamp<  int8_t, uint64_t,  uint8_t,  int16_t>(), "");
-static_assert(TypeCheckClamp<  int8_t, uint64_t,  int64_t,  int64_t>(), "");
-static_assert(TypeCheckClamp<  int8_t, uint64_t, uint64_t, uint64_t>(), "");
-static_assert(TypeCheckClamp< uint8_t,   int8_t,   int8_t,   int8_t>(), "");
-static_assert(TypeCheckClamp< uint8_t,   int8_t,  uint8_t,  uint8_t>(), "");
-static_assert(TypeCheckClamp< uint8_t,   int8_t,  int64_t,  int16_t>(), "");
-static_assert(TypeCheckClamp< uint8_t,   int8_t, uint64_t,  uint8_t>(), "");
-static_assert(TypeCheckClamp< uint8_t,  uint8_t,   int8_t,  uint8_t>(), "");
-static_assert(TypeCheckClamp< uint8_t,  uint8_t,  uint8_t,  uint8_t>(), "");
-static_assert(TypeCheckClamp< uint8_t,  uint8_t,  int64_t,  uint8_t>(), "");
-static_assert(TypeCheckClamp< uint8_t,  uint8_t, uint64_t,  uint8_t>(), "");
-static_assert(TypeCheckClamp< uint8_t,  int64_t,   int8_t,   int8_t>(), "");
-static_assert(TypeCheckClamp< uint8_t,  int64_t,  uint8_t,  uint8_t>(), "");
-static_assert(TypeCheckClamp< uint8_t,  int64_t,  int64_t,  int64_t>(), "");
-static_assert(TypeCheckClamp< uint8_t,  int64_t, uint64_t, uint64_t>(), "");
-static_assert(TypeCheckClamp< uint8_t, uint64_t,   int8_t,  uint8_t>(), "");
-static_assert(TypeCheckClamp< uint8_t, uint64_t,  uint8_t,  uint8_t>(), "");
-static_assert(TypeCheckClamp< uint8_t, uint64_t,  int64_t, uint64_t>(), "");
-static_assert(TypeCheckClamp< uint8_t, uint64_t, uint64_t, uint64_t>(), "");
-static_assert(TypeCheckClamp< int64_t,   int8_t,   int8_t,   int8_t>(), "");
-static_assert(TypeCheckClamp< int64_t,   int8_t,  uint8_t,  int16_t>(), "");
-static_assert(TypeCheckClamp< int64_t,   int8_t,  int64_t,  int64_t>(), "");
-static_assert(TypeCheckClamp< int64_t,   int8_t, uint64_t,  int64_t>(), "");
-static_assert(TypeCheckClamp< int64_t,  uint8_t,   int8_t,   int8_t>(), "");
-static_assert(TypeCheckClamp< int64_t,  uint8_t,  uint8_t,  int16_t>(), "");
-static_assert(TypeCheckClamp< int64_t,  uint8_t,  int64_t,  int64_t>(), "");
-static_assert(TypeCheckClamp< int64_t,  uint8_t, uint64_t,  int64_t>(), "");
-static_assert(TypeCheckClamp< int64_t,  int64_t,   int8_t,  int64_t>(), "");
-static_assert(TypeCheckClamp< int64_t,  int64_t,  uint8_t,  int64_t>(), "");
-static_assert(TypeCheckClamp< int64_t,  int64_t,  int64_t,  int64_t>(), "");
-static_assert(TypeCheckClamp< int64_t,  int64_t, uint64_t,  int64_t>(), "");
-static_assert(TypeCheckClamp< int64_t, uint64_t,   int8_t,   int8_t>(), "");
-static_assert(TypeCheckClamp< int64_t, uint64_t,  uint8_t,  int16_t>(), "");
-static_assert(TypeCheckClamp< int64_t, uint64_t,  int64_t,  int64_t>(), "");
-static_assert(TypeCheckClamp< int64_t, uint64_t, uint64_t, uint64_t>(), "");
-static_assert(TypeCheckClamp<uint64_t,   int8_t,   int8_t,   int8_t>(), "");
-static_assert(TypeCheckClamp<uint64_t,   int8_t,  uint8_t,  uint8_t>(), "");
-static_assert(TypeCheckClamp<uint64_t,   int8_t,  int64_t,  int64_t>(), "");
-static_assert(TypeCheckClamp<uint64_t,   int8_t, uint64_t, uint64_t>(), "");
-static_assert(TypeCheckClamp<uint64_t,  uint8_t,   int8_t,  uint8_t>(), "");
-static_assert(TypeCheckClamp<uint64_t,  uint8_t,  uint8_t,  uint8_t>(), "");
-static_assert(TypeCheckClamp<uint64_t,  uint8_t,  int64_t, uint64_t>(), "");
-static_assert(TypeCheckClamp<uint64_t,  uint8_t, uint64_t, uint64_t>(), "");
-static_assert(TypeCheckClamp<uint64_t,  int64_t,   int8_t,   int8_t>(), "");
-static_assert(TypeCheckClamp<uint64_t,  int64_t,  uint8_t,  uint8_t>(), "");
-static_assert(TypeCheckClamp<uint64_t,  int64_t,  int64_t,  int64_t>(), "");
-static_assert(TypeCheckClamp<uint64_t,  int64_t, uint64_t, uint64_t>(), "");
-static_assert(TypeCheckClamp<uint64_t, uint64_t,   int8_t,  uint8_t>(), "");
-static_assert(TypeCheckClamp<uint64_t, uint64_t,  uint8_t,  uint8_t>(), "");
-static_assert(TypeCheckClamp<uint64_t, uint64_t,  int64_t, uint64_t>(), "");
-static_assert(TypeCheckClamp<uint64_t, uint64_t, uint64_t, uint64_t>(), "");
-
-enum DefaultE { kFoo = -17 };
-enum UInt8E : uint8_t { kBar = 17 };
-
-// SafeMin/SafeMax: Check that we can use enum types.
-static_assert(TypeCheckMinMax<unsigned, unsigned, unsigned, unsigned>(), "");
-static_assert(TypeCheckMinMax<unsigned, DefaultE,      int, unsigned>(), "");
-static_assert(TypeCheckMinMax<unsigned,   UInt8E,  uint8_t, unsigned>(), "");
-static_assert(TypeCheckMinMax<DefaultE, unsigned,      int, unsigned>(), "");
-static_assert(TypeCheckMinMax<DefaultE, DefaultE,      int,      int>(), "");
-static_assert(TypeCheckMinMax<DefaultE,   UInt8E,      int,      int>(), "");
-static_assert(TypeCheckMinMax<  UInt8E, unsigned,  uint8_t, unsigned>(), "");
-static_assert(TypeCheckMinMax<  UInt8E, DefaultE,     int,       int>(), "");
-static_assert(TypeCheckMinMax<  UInt8E,   UInt8E,  uint8_t,  uint8_t>(), "");
-
-// SafeClamp: Check that we can use enum types.
-static_assert(TypeCheckClamp<unsigned, unsigned, unsigned, unsigned>(), "");
-static_assert(TypeCheckClamp<unsigned, unsigned, DefaultE, unsigned>(), "");
-static_assert(TypeCheckClamp<unsigned, unsigned,   UInt8E,  uint8_t>(), "");
-static_assert(TypeCheckClamp<unsigned, DefaultE, unsigned, unsigned>(), "");
-static_assert(TypeCheckClamp<unsigned, DefaultE, DefaultE,      int>(), "");
-static_assert(TypeCheckClamp<unsigned, DefaultE,   UInt8E,  uint8_t>(), "");
-static_assert(TypeCheckClamp<unsigned,   UInt8E, unsigned, unsigned>(), "");
-static_assert(TypeCheckClamp<unsigned,   UInt8E, DefaultE, unsigned>(), "");
-static_assert(TypeCheckClamp<unsigned,   UInt8E,   UInt8E,  uint8_t>(), "");
-static_assert(TypeCheckClamp<DefaultE, unsigned, unsigned, unsigned>(), "");
-static_assert(TypeCheckClamp<DefaultE, unsigned, DefaultE,      int>(), "");
-static_assert(TypeCheckClamp<DefaultE, unsigned,   UInt8E,  int16_t>(), "");
-static_assert(TypeCheckClamp<DefaultE, DefaultE, unsigned,      int>(), "");
-static_assert(TypeCheckClamp<DefaultE, DefaultE, DefaultE,      int>(), "");
-static_assert(TypeCheckClamp<DefaultE, DefaultE,   UInt8E,      int>(), "");
-static_assert(TypeCheckClamp<DefaultE,   UInt8E, unsigned,      int>(), "");
-static_assert(TypeCheckClamp<DefaultE,   UInt8E, DefaultE,      int>(), "");
-static_assert(TypeCheckClamp<DefaultE,   UInt8E,   UInt8E,  int16_t>(), "");
-static_assert(TypeCheckClamp<  UInt8E, unsigned, unsigned, unsigned>(), "");
-static_assert(TypeCheckClamp<  UInt8E, unsigned, DefaultE, unsigned>(), "");
-static_assert(TypeCheckClamp<  UInt8E, unsigned,   UInt8E,  uint8_t>(), "");
-static_assert(TypeCheckClamp<  UInt8E, DefaultE, unsigned, unsigned>(), "");
-static_assert(TypeCheckClamp<  UInt8E, DefaultE, DefaultE,      int>(), "");
-static_assert(TypeCheckClamp<  UInt8E, DefaultE,   UInt8E,  uint8_t>(), "");
-static_assert(TypeCheckClamp<  UInt8E,   UInt8E, unsigned,  uint8_t>(), "");
-static_assert(TypeCheckClamp<  UInt8E,   UInt8E, DefaultE,  uint8_t>(), "");
-static_assert(TypeCheckClamp<  UInt8E,   UInt8E,   UInt8E,  uint8_t>(), "");
-
-using ld = long double;
-
-// SafeMin/SafeMax: Check that all floating-point combinations give the
-// correct result type.
-static_assert(TypeCheckMinMax< float,  float,  float,  float>(), "");
-static_assert(TypeCheckMinMax< float, double, double, double>(), "");
-static_assert(TypeCheckMinMax< float,     ld,     ld,     ld>(), "");
-static_assert(TypeCheckMinMax<double,  float, double, double>(), "");
-static_assert(TypeCheckMinMax<double, double, double, double>(), "");
-static_assert(TypeCheckMinMax<double,     ld,     ld,     ld>(), "");
-static_assert(TypeCheckMinMax<    ld,  float,     ld,     ld>(), "");
-static_assert(TypeCheckMinMax<    ld, double,     ld,     ld>(), "");
-static_assert(TypeCheckMinMax<    ld,     ld,     ld,     ld>(), "");
-
-// SafeClamp: Check that all floating-point combinations give the correct
-// result type.
-static_assert(TypeCheckClamp< float,  float,  float,  float>(), "");
-static_assert(TypeCheckClamp< float,  float, double, double>(), "");
-static_assert(TypeCheckClamp< float,  float,     ld,     ld>(), "");
-static_assert(TypeCheckClamp< float, double,  float, double>(), "");
-static_assert(TypeCheckClamp< float, double, double, double>(), "");
-static_assert(TypeCheckClamp< float, double,     ld,     ld>(), "");
-static_assert(TypeCheckClamp< float,     ld,  float,     ld>(), "");
-static_assert(TypeCheckClamp< float,     ld, double,     ld>(), "");
-static_assert(TypeCheckClamp< float,     ld,     ld,     ld>(), "");
-static_assert(TypeCheckClamp<double,  float,  float, double>(), "");
-static_assert(TypeCheckClamp<double,  float, double, double>(), "");
-static_assert(TypeCheckClamp<double,  float,     ld,     ld>(), "");
-static_assert(TypeCheckClamp<double, double,  float, double>(), "");
-static_assert(TypeCheckClamp<double, double, double, double>(), "");
-static_assert(TypeCheckClamp<double, double,     ld,     ld>(), "");
-static_assert(TypeCheckClamp<double,     ld,  float,     ld>(), "");
-static_assert(TypeCheckClamp<double,     ld, double,     ld>(), "");
-static_assert(TypeCheckClamp<double,     ld,     ld,     ld>(), "");
-static_assert(TypeCheckClamp<    ld,  float,  float,     ld>(), "");
-static_assert(TypeCheckClamp<    ld,  float, double,     ld>(), "");
-static_assert(TypeCheckClamp<    ld,  float,     ld,     ld>(), "");
-static_assert(TypeCheckClamp<    ld, double,  float,     ld>(), "");
-static_assert(TypeCheckClamp<    ld, double, double,     ld>(), "");
-static_assert(TypeCheckClamp<    ld, double,     ld,     ld>(), "");
-static_assert(TypeCheckClamp<    ld,     ld,  float,     ld>(), "");
-static_assert(TypeCheckClamp<    ld,     ld, double,     ld>(), "");
-static_assert(TypeCheckClamp<    ld,     ld,     ld,     ld>(), "");
-
-// clang-format on
-
-// SafeMin/SafeMax: Check some cases of explicitly specified return type. The
-// commented-out lines give compilation errors due to the requested return type
-// being too small or requiring an int<->float conversion.
-static_assert(TypeCheckMinR<int8_t, int8_t, int16_t>(), "");
-// static_assert(TypeCheckMinR<int8_t, int8_t, float>(), "");
-static_assert(TypeCheckMinR<uint32_t, uint64_t, uint32_t>(), "");
-// static_assert(TypeCheckMaxR<uint64_t, float, float>(), "");
-// static_assert(TypeCheckMaxR<uint64_t, double, float>(), "");
-static_assert(TypeCheckMaxR<uint32_t, int32_t, uint32_t>(), "");
-// static_assert(TypeCheckMaxR<uint32_t, int32_t, int32_t>(), "");
-
-// SafeClamp: Check some cases of explicitly specified return type. The
-// commented-out lines give compilation errors due to the requested return type
-// being too small.
-static_assert(TypeCheckClampR<int16_t, int8_t, uint8_t, int16_t>(), "");
-static_assert(TypeCheckClampR<int16_t, int8_t, uint8_t, int32_t>(), "");
-// static_assert(TypeCheckClampR<int16_t, int8_t, uint8_t, uint32_t>(), "");
-
-template <typename T1, typename T2, typename Tmin, typename Tmax>
-constexpr bool CheckMinMax(T1 a, T2 b, Tmin min, Tmax max) {
-  return TypeCheckMinMax<T1, T2, Tmin, Tmax>() && SafeMin(a, b) == min &&
-         SafeMax(a, b) == max;
-}
-
-template <typename T, typename L, typename H, typename R>
-bool CheckClamp(T x, L min, H max, R clamped) {
-  return TypeCheckClamp<T, L, H, R>() && SafeClamp(x, min, max) == clamped;
-}
-
-// SafeMin/SafeMax: Check a few values.
-static_assert(CheckMinMax(int8_t{1}, int8_t{-1}, int8_t{-1}, int8_t{1}), "");
-static_assert(CheckMinMax(uint8_t{1}, int8_t{-1}, int8_t{-1}, uint8_t{1}), "");
-static_assert(CheckMinMax(uint8_t{5}, uint64_t{2}, uint8_t{2}, uint64_t{5}),
-              "");
-static_assert(CheckMinMax(std::numeric_limits<int32_t>::min(),
-                          std::numeric_limits<uint32_t>::max(),
-                          std::numeric_limits<int32_t>::min(),
-                          std::numeric_limits<uint32_t>::max()),
-              "");
-static_assert(CheckMinMax(std::numeric_limits<int32_t>::min(),
-                          std::numeric_limits<uint16_t>::max(),
-                          std::numeric_limits<int32_t>::min(),
-                          int32_t{std::numeric_limits<uint16_t>::max()}),
-              "");
-// static_assert(CheckMinMax(1.f, 2, 1.f, 2.f), "");
-static_assert(CheckMinMax(1.f, 0.0, 0.0, 1.0), "");
-
-// SafeClamp: Check a few values.
-TEST(SafeMinmaxTest, Clamp) {
-  EXPECT_TRUE(CheckClamp(int32_t{-1000000}, std::numeric_limits<int16_t>::min(),
-                         std::numeric_limits<int16_t>::max(),
-                         std::numeric_limits<int16_t>::min()));
-  EXPECT_TRUE(CheckClamp(uint32_t{1000000}, std::numeric_limits<int16_t>::min(),
-                         std::numeric_limits<int16_t>::max(),
-                         std::numeric_limits<int16_t>::max()));
-  EXPECT_TRUE(CheckClamp(3.f, -1.0, 1.f, 1.0));
-  EXPECT_TRUE(CheckClamp(3.0, -1.f, 1.f, 1.0));
-}
-
-}  // namespace
-
-// These functions aren't used in the tests, but it's useful to look at the
-// compiler output for them, and verify that (1) the same-signedness Test*Safe
-// functions result in exactly the same code as their Test*Ref counterparts,
-// and that (2) the mixed-signedness Test*Safe functions have just a few extra
-// arithmetic and logic instructions (but no extra control flow instructions).
-
-// clang-format off
-int32_t  TestMinRef(  int32_t a,  int32_t b) { return std::min(a, b); }
-uint32_t TestMinRef( uint32_t a, uint32_t b) { return std::min(a, b); }
-int32_t  TestMinSafe( int32_t a,  int32_t b) { return SafeMin(a, b); }
-int32_t  TestMinSafe( int32_t a, uint32_t b) { return SafeMin(a, b); }
-int32_t  TestMinSafe(uint32_t a,  int32_t b) { return SafeMin(a, b); }
-uint32_t TestMinSafe(uint32_t a, uint32_t b) { return SafeMin(a, b); }
-// clang-format on
-
-int32_t TestClampRef(int32_t x, int32_t a, int32_t b) {
-  return std::max(a, std::min(x, b));
-}
-uint32_t TestClampRef(uint32_t x, uint32_t a, uint32_t b) {
-  return std::max(a, std::min(x, b));
-}
-int32_t TestClampSafe(int32_t x, int32_t a, int32_t b) {
-  return SafeClamp(x, a, b);
-}
-int32_t TestClampSafe(int32_t x, int32_t a, uint32_t b) {
-  return SafeClamp(x, a, b);
-}
-int32_t TestClampSafe(int32_t x, uint32_t a, int32_t b) {
-  return SafeClamp(x, a, b);
-}
-uint32_t TestClampSafe(int32_t x, uint32_t a, uint32_t b) {
-  return SafeClamp(x, a, b);
-}
-int32_t TestClampSafe(uint32_t x, int32_t a, int32_t b) {
-  return SafeClamp(x, a, b);
-}
-uint32_t TestClampSafe(uint32_t x, int32_t a, uint32_t b) {
-  return SafeClamp(x, a, b);
-}
-int32_t TestClampSafe(uint32_t x, uint32_t a, int32_t b) {
-  return SafeClamp(x, a, b);
-}
-uint32_t TestClampSafe(uint32_t x, uint32_t a, uint32_t b) {
-  return SafeClamp(x, a, b);
-}
-
-}  // namespace rtc
diff --git a/rtc_base/sanitizer.h b/rtc_base/sanitizer.h
deleted file mode 100644
index 73099ac..0000000
--- a/rtc_base/sanitizer.h
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- *  Copyright 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_RTC_BASE_SANITIZER_H_
-#define WEBRTC_RTC_BASE_SANITIZER_H_
-
-#include <stddef.h>  // for size_t
-
-#if defined(__has_feature)
-#if __has_feature(address_sanitizer)
-#define RTC_HAS_ASAN 1
-#endif
-#if __has_feature(memory_sanitizer)
-#define RTC_HAS_MSAN 1
-#endif
-#endif
-#ifndef RTC_HAS_ASAN
-#define RTC_HAS_ASAN 0
-#endif
-#ifndef RTC_HAS_MSAN
-#define RTC_HAS_MSAN 0
-#endif
-
-#if RTC_HAS_ASAN
-#include <sanitizer/asan_interface.h>
-#endif
-#if RTC_HAS_MSAN
-#include <sanitizer/msan_interface.h>
-#endif
-
-#ifdef __has_attribute
-#if __has_attribute(no_sanitize)
-#define RTC_NO_SANITIZE(what) __attribute__((no_sanitize(what)))
-#endif
-#endif
-#ifndef RTC_NO_SANITIZE
-#define RTC_NO_SANITIZE(what)
-#endif
-
-// Ask ASan to mark the memory range [ptr, ptr + element_size * num_elements)
-// as being unaddressable, so that reads and writes are not allowed. ASan may
-// narrow the range to the nearest alignment boundaries.
-static inline void rtc_AsanPoison(const volatile void* ptr,
-                                  size_t element_size,
-                                  size_t num_elements) {
-#if RTC_HAS_ASAN
-  ASAN_POISON_MEMORY_REGION(ptr, element_size * num_elements);
-#endif
-}
-
-// Ask ASan to mark the memory range [ptr, ptr + element_size * num_elements)
-// as being addressable, so that reads and writes are allowed. ASan may widen
-// the range to the nearest alignment boundaries.
-static inline void rtc_AsanUnpoison(const volatile void* ptr,
-                                    size_t element_size,
-                                    size_t num_elements) {
-#if RTC_HAS_ASAN
-  ASAN_UNPOISON_MEMORY_REGION(ptr, element_size * num_elements);
-#endif
-}
-
-// Ask MSan to mark the memory range [ptr, ptr + element_size * num_elements)
-// as being uninitialized.
-static inline void rtc_MsanMarkUninitialized(const volatile void* ptr,
-                                             size_t element_size,
-                                             size_t num_elements) {
-#if RTC_HAS_MSAN
-  __msan_poison(ptr, element_size * num_elements);
-#endif
-}
-
-// Force an MSan check (if any bits in the memory range [ptr, ptr +
-// element_size * num_elements) are uninitialized the call will crash with an
-// MSan report).
-static inline void rtc_MsanCheckInitialized(const volatile void* ptr,
-                                            size_t element_size,
-                                            size_t num_elements) {
-#if RTC_HAS_MSAN
-  __msan_check_mem_is_initialized(ptr, element_size * num_elements);
-#endif
-}
-
-#ifdef __cplusplus
-
-namespace rtc {
-
-template <typename T>
-inline void AsanPoison(const T& mem) {
-  rtc_AsanPoison(mem.data(), sizeof(mem.data()[0]), mem.size());
-}
-
-template <typename T>
-inline void AsanUnpoison(const T& mem) {
-  rtc_AsanUnpoison(mem.data(), sizeof(mem.data()[0]), mem.size());
-}
-
-template <typename T>
-inline void MsanMarkUninitialized(const T& mem) {
-  rtc_MsanMarkUninitialized(mem.data(), sizeof(mem.data()[0]), mem.size());
-}
-
-template <typename T>
-inline void MsanCheckInitialized(const T& mem) {
-  rtc_MsanCheckInitialized(mem.data(), sizeof(mem.data()[0]), mem.size());
-}
-
-}  // namespace rtc
-
-#endif  // __cplusplus
-
-#endif  // WEBRTC_RTC_BASE_SANITIZER_H_
diff --git a/rtc_base/scoped_ref_ptr.h b/rtc_base/scoped_ref_ptr.h
deleted file mode 100644
index 69086db..0000000
--- a/rtc_base/scoped_ref_ptr.h
+++ /dev/null
@@ -1,163 +0,0 @@
-/*
- *  Copyright 2011 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.
- */
-
-// Originally these classes are from Chromium.
-// http://src.chromium.org/viewvc/chrome/trunk/src/base/memory/ref_counted.h?view=markup
-
-//
-// A smart pointer class for reference counted objects.  Use this class instead
-// of calling AddRef and Release manually on a reference counted object to
-// avoid common memory leaks caused by forgetting to Release an object
-// reference.  Sample usage:
-//
-//   class MyFoo : public RefCounted<MyFoo> {
-//    ...
-//   };
-//
-//   void some_function() {
-//     scoped_refptr<MyFoo> foo = new MyFoo();
-//     foo->Method(param);
-//     // |foo| is released when this function returns
-//   }
-//
-//   void some_other_function() {
-//     scoped_refptr<MyFoo> foo = new MyFoo();
-//     ...
-//     foo = nullptr;  // explicitly releases |foo|
-//     ...
-//     if (foo)
-//       foo->Method(param);
-//   }
-//
-// The above examples show how scoped_refptr<T> acts like a pointer to T.
-// Given two scoped_refptr<T> classes, it is also possible to exchange
-// references between the two objects, like so:
-//
-//   {
-//     scoped_refptr<MyFoo> a = new MyFoo();
-//     scoped_refptr<MyFoo> b;
-//
-//     b.swap(a);
-//     // now, |b| references the MyFoo object, and |a| references null.
-//   }
-//
-// To make both |a| and |b| in the above example reference the same MyFoo
-// object, simply use the assignment operator:
-//
-//   {
-//     scoped_refptr<MyFoo> a = new MyFoo();
-//     scoped_refptr<MyFoo> b;
-//
-//     b = a;
-//     // now, |a| and |b| each own a reference to the same MyFoo object.
-//   }
-//
-
-#ifndef WEBRTC_RTC_BASE_SCOPED_REF_PTR_H_
-#define WEBRTC_RTC_BASE_SCOPED_REF_PTR_H_
-
-#include <memory>
-
-namespace rtc {
-
-template <class T>
-class scoped_refptr {
- public:
-  scoped_refptr() : ptr_(nullptr) {}
-
-  scoped_refptr(T* p) : ptr_(p) {
-    if (ptr_)
-      ptr_->AddRef();
-  }
-
-  scoped_refptr(const scoped_refptr<T>& r) : ptr_(r.ptr_) {
-    if (ptr_)
-      ptr_->AddRef();
-  }
-
-  template <typename U>
-  scoped_refptr(const scoped_refptr<U>& r) : ptr_(r.get()) {
-    if (ptr_)
-      ptr_->AddRef();
-  }
-
-  // Move constructors.
-  scoped_refptr(scoped_refptr<T>&& r) : ptr_(r.release()) {}
-
-  template <typename U>
-  scoped_refptr(scoped_refptr<U>&& r) : ptr_(r.release()) {}
-
-  ~scoped_refptr() {
-    if (ptr_)
-      ptr_->Release();
-  }
-
-  T* get() const { return ptr_; }
-  operator T*() const { return ptr_; }
-  T* operator->() const { return ptr_; }
-
-  // Release a pointer.
-  // The return value is the current pointer held by this object.
-  // If this object holds a null pointer, the return value is null.
-  // After this operation, this object will hold a null pointer,
-  // and will not own the object any more.
-  T* release() {
-    T* retVal = ptr_;
-    ptr_ = nullptr;
-    return retVal;
-  }
-
-  scoped_refptr<T>& operator=(T* p) {
-    // AddRef first so that self assignment should work
-    if (p)
-      p->AddRef();
-    if (ptr_ )
-      ptr_ ->Release();
-    ptr_ = p;
-    return *this;
-  }
-
-  scoped_refptr<T>& operator=(const scoped_refptr<T>& r) {
-    return *this = r.ptr_;
-  }
-
-  template <typename U>
-  scoped_refptr<T>& operator=(const scoped_refptr<U>& r) {
-    return *this = r.get();
-  }
-
-  scoped_refptr<T>& operator=(scoped_refptr<T>&& r) {
-    scoped_refptr<T>(std::move(r)).swap(*this);
-    return *this;
-  }
-
-  template <typename U>
-  scoped_refptr<T>& operator=(scoped_refptr<U>&& r) {
-    scoped_refptr<T>(std::move(r)).swap(*this);
-    return *this;
-  }
-
-  void swap(T** pp) {
-    T* p = ptr_;
-    ptr_ = *pp;
-    *pp = p;
-  }
-
-  void swap(scoped_refptr<T>& r) {
-    swap(&r.ptr_);
-  }
-
- protected:
-  T* ptr_;
-};
-
-}  // namespace rtc
-
-#endif  // WEBRTC_RTC_BASE_SCOPED_REF_PTR_H_
diff --git a/rtc_base/sequenced_task_checker.h b/rtc_base/sequenced_task_checker.h
deleted file mode 100644
index 35bd3cd..0000000
--- a/rtc_base/sequenced_task_checker.h
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- *  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_RTC_BASE_SEQUENCED_TASK_CHECKER_H_
-#define WEBRTC_RTC_BASE_SEQUENCED_TASK_CHECKER_H_
-
-// Apart from debug builds, we also enable the sequence checker in
-// builds with RTC_DCHECK_IS_ON so that trybots and waterfall bots
-// with this define will get the same level of checking as debug bots.
-#define ENABLE_SEQUENCED_TASK_CHECKER RTC_DCHECK_IS_ON
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/sequenced_task_checker_impl.h"
-#include "webrtc/rtc_base/thread_annotations.h"
-
-namespace rtc {
-
-// Do nothing implementation, for use in release mode.
-//
-// Note: You should almost always use the SequencedTaskChecker class to get the
-// right version for your build configuration.
-class SequencedTaskCheckerDoNothing {
- public:
-  bool CalledSequentially() const { return true; }
-
-  void Detach() {}
-};
-
-// SequencedTaskChecker is a helper class used to help verify that some methods
-// of a class are called on the same task queue or thread. A
-// SequencedTaskChecker is bound to a a task queue if the object is
-// created on a task queue, or a thread otherwise.
-//
-//
-// Example:
-// class MyClass {
-//  public:
-//   void Foo() {
-//     RTC_DCHECK(sequence_checker_.CalledSequentially());
-//     ... (do stuff) ...
-//   }
-//
-//  private:
-//   SequencedTaskChecker sequence_checker_;
-// }
-//
-// In Release mode, CalledOnValidThread will always return true.
-#if ENABLE_SEQUENCED_TASK_CHECKER
-class RTC_LOCKABLE SequencedTaskChecker : public SequencedTaskCheckerImpl {};
-#else
-class RTC_LOCKABLE SequencedTaskChecker : public SequencedTaskCheckerDoNothing {
-};
-#endif  // ENABLE_SEQUENCED_TASK_CHECKER_H_
-
-namespace internal {
-class RTC_SCOPED_LOCKABLE SequencedTaskCheckerScope {
- public:
-  explicit SequencedTaskCheckerScope(const SequencedTaskChecker* checker)
-      RTC_EXCLUSIVE_LOCK_FUNCTION(checker);
-  ~SequencedTaskCheckerScope() RTC_UNLOCK_FUNCTION();
-};
-
-}  // namespace internal
-
-#define RTC_DCHECK_CALLED_SEQUENTIALLY(x) \
-  rtc::internal::SequencedTaskCheckerScope checker(x)
-
-#undef ENABLE_SEQUENCED_TASK_CHECKER
-
-}  // namespace rtc
-#endif  // WEBRTC_RTC_BASE_SEQUENCED_TASK_CHECKER_H_
diff --git a/rtc_base/sequenced_task_checker_impl.cc b/rtc_base/sequenced_task_checker_impl.cc
deleted file mode 100644
index 0d2ae3e..0000000
--- a/rtc_base/sequenced_task_checker_impl.cc
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- *  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/rtc_base/sequenced_task_checker_impl.h"
-
-#if defined(WEBRTC_MAC)
-#include <dispatch/dispatch.h>
-#endif
-
-#include "webrtc/rtc_base/platform_thread.h"
-#include "webrtc/rtc_base/sequenced_task_checker.h"
-#include "webrtc/rtc_base/task_queue.h"
-
-namespace rtc {
-
-SequencedTaskCheckerImpl::SequencedTaskCheckerImpl()
-    : attached_(true), valid_queue_(TaskQueue::Current()) {}
-
-SequencedTaskCheckerImpl::~SequencedTaskCheckerImpl() {}
-
-bool SequencedTaskCheckerImpl::CalledSequentially() const {
-  QueueId current_queue = TaskQueue::Current();
-#if defined(WEBRTC_MAC)
-  // If we're not running on a TaskQueue, use the system dispatch queue
-  // label as an identifier.
-  if (current_queue == nullptr)
-    current_queue = dispatch_queue_get_label(DISPATCH_CURRENT_QUEUE_LABEL);
-#endif
-  CritScope scoped_lock(&lock_);
-  if (!attached_) {  // true if previously detached.
-    valid_queue_ = current_queue;
-    attached_ = true;
-  }
-  if (!valid_queue_)
-    return thread_checker_.CalledOnValidThread();
-  return valid_queue_ == current_queue;
-}
-
-void SequencedTaskCheckerImpl::Detach() {
-  CritScope scoped_lock(&lock_);
-  attached_ = false;
-  valid_queue_ = nullptr;
-  thread_checker_.DetachFromThread();
-}
-
-namespace internal {
-
-SequencedTaskCheckerScope::SequencedTaskCheckerScope(
-    const SequencedTaskChecker* checker) {
-  RTC_DCHECK(checker->CalledSequentially());
-}
-
-SequencedTaskCheckerScope::~SequencedTaskCheckerScope() {}
-
-}  // namespace internal
-}  // namespace rtc
diff --git a/rtc_base/sequenced_task_checker_impl.h b/rtc_base/sequenced_task_checker_impl.h
deleted file mode 100644
index ac43030..0000000
--- a/rtc_base/sequenced_task_checker_impl.h
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- *  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_RTC_BASE_SEQUENCED_TASK_CHECKER_IMPL_H_
-#define WEBRTC_RTC_BASE_SEQUENCED_TASK_CHECKER_IMPL_H_
-
-#include "webrtc/rtc_base/thread_checker.h"
-
-namespace rtc {
-
-class TaskQueue;
-// Real implementation of SequencedTaskChecker, for use in debug mode, or
-// for temporary use in release mode.
-//
-// Note: You should almost always use the SequencedTaskChecker class to get the
-// right version for your build configuration.
-class SequencedTaskCheckerImpl {
- public:
-  SequencedTaskCheckerImpl();
-  ~SequencedTaskCheckerImpl();
-
-  bool CalledSequentially() const;
-
-  // Changes the task queue or thread that is checked for in IsCurrent.  This
-  // may be useful when an object may be created on one task queue / thread and
-  // then used exclusively on another thread.
-  void Detach();
-
- private:
-  typedef const void* QueueId;
-  CriticalSection lock_;
-  ThreadChecker thread_checker_;
-  mutable bool attached_;
-  mutable QueueId valid_queue_;
-};
-
-}  // namespace rtc
-#endif  // WEBRTC_RTC_BASE_SEQUENCED_TASK_CHECKER_IMPL_H_
diff --git a/rtc_base/sequenced_task_checker_unittest.cc b/rtc_base/sequenced_task_checker_unittest.cc
deleted file mode 100644
index 73bc8ea..0000000
--- a/rtc_base/sequenced_task_checker_unittest.cc
+++ /dev/null
@@ -1,273 +0,0 @@
-/*
- *  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/rtc_base/sequenced_task_checker.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/platform_thread.h"
-#include "webrtc/rtc_base/task_queue.h"
-#include "webrtc/test/gtest.h"
-
-namespace rtc {
-
-namespace {
-// Calls SequencedTaskChecker::CalledSequentially on another thread.
-class CallCalledSequentiallyOnThread {
- public:
-  CallCalledSequentiallyOnThread(bool expect_true,
-                                 SequencedTaskChecker* sequenced_task_checker)
-      : expect_true_(expect_true),
-        thread_has_run_event_(false, false),
-        thread_(&Run, this, "call_do_stuff_on_thread"),
-        sequenced_task_checker_(sequenced_task_checker) {
-    thread_.Start();
-  }
-  ~CallCalledSequentiallyOnThread() {
-    EXPECT_TRUE(thread_has_run_event_.Wait(1000));
-    thread_.Stop();
-  }
-
- private:
-  static void Run(void* obj) {
-    CallCalledSequentiallyOnThread* call_stuff_on_thread =
-        static_cast<CallCalledSequentiallyOnThread*>(obj);
-    EXPECT_EQ(
-        call_stuff_on_thread->expect_true_,
-        call_stuff_on_thread->sequenced_task_checker_->CalledSequentially());
-    call_stuff_on_thread->thread_has_run_event_.Set();
-  }
-
-  const bool expect_true_;
-  Event thread_has_run_event_;
-  PlatformThread thread_;
-  SequencedTaskChecker* const sequenced_task_checker_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(CallCalledSequentiallyOnThread);
-};
-
-// Deletes SequencedTaskChecker on a different thread.
-class DeleteSequencedCheckerOnThread {
- public:
-  explicit DeleteSequencedCheckerOnThread(
-      std::unique_ptr<SequencedTaskChecker> sequenced_task_checker)
-      : thread_(&Run, this, "delete_sequenced_task_checker_on_thread"),
-        thread_has_run_event_(false, false),
-        sequenced_task_checker_(std::move(sequenced_task_checker)) {
-    thread_.Start();
-  }
-
-  ~DeleteSequencedCheckerOnThread() {
-    EXPECT_TRUE(thread_has_run_event_.Wait(1000));
-    thread_.Stop();
-  }
-
- private:
-  static bool Run(void* obj) {
-    DeleteSequencedCheckerOnThread* instance =
-        static_cast<DeleteSequencedCheckerOnThread*>(obj);
-    instance->sequenced_task_checker_.reset();
-    instance->thread_has_run_event_.Set();
-    return false;
-  }
-
- private:
-  PlatformThread thread_;
-  Event thread_has_run_event_;
-  std::unique_ptr<SequencedTaskChecker> sequenced_task_checker_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(DeleteSequencedCheckerOnThread);
-};
-
-void RunMethodOnDifferentThread(bool expect_true) {
-  std::unique_ptr<SequencedTaskChecker> sequenced_task_checker(
-      new SequencedTaskChecker());
-
-  CallCalledSequentiallyOnThread call_on_thread(expect_true,
-                                                sequenced_task_checker.get());
-}
-
-void RunMethodOnDifferentTaskQueue(bool expect_true) {
-  std::unique_ptr<SequencedTaskChecker> sequenced_task_checker(
-      new SequencedTaskChecker());
-
-  static const char kQueueName[] = "MethodNotAllowedOnDifferentTq";
-  TaskQueue queue(kQueueName);
-  Event done_event(false, false);
-  queue.PostTask([&sequenced_task_checker, &done_event, expect_true] {
-    if (expect_true)
-      EXPECT_TRUE(sequenced_task_checker->CalledSequentially());
-    else
-      EXPECT_FALSE(sequenced_task_checker->CalledSequentially());
-    done_event.Set();
-  });
-  EXPECT_TRUE(done_event.Wait(1000));
-}
-
-void DetachThenCallFromDifferentTaskQueue(bool expect_true) {
-  std::unique_ptr<SequencedTaskChecker> sequenced_task_checker(
-      new SequencedTaskChecker());
-
-  sequenced_task_checker->Detach();
-
-  Event done_event(false, false);
-  TaskQueue queue1("DetachThenCallFromDifferentTaskQueueImpl1");
-  queue1.PostTask([&sequenced_task_checker, &done_event] {
-    EXPECT_TRUE(sequenced_task_checker->CalledSequentially());
-    done_event.Set();
-  });
-  EXPECT_TRUE(done_event.Wait(1000));
-
-  // CalledSequentially should return false in debug builds after moving to
-  // another task queue.
-  TaskQueue queue2("DetachThenCallFromDifferentTaskQueueImpl2");
-  queue2.PostTask([&sequenced_task_checker, &done_event, expect_true] {
-    if (expect_true)
-      EXPECT_TRUE(sequenced_task_checker->CalledSequentially());
-    else
-      EXPECT_FALSE(sequenced_task_checker->CalledSequentially());
-    done_event.Set();
-  });
-  EXPECT_TRUE(done_event.Wait(1000));
-}
-}  // namespace
-
-TEST(SequencedTaskCheckerTest, CallsAllowedOnSameThread) {
-  std::unique_ptr<SequencedTaskChecker> sequenced_task_checker(
-      new SequencedTaskChecker());
-
-  EXPECT_TRUE(sequenced_task_checker->CalledSequentially());
-
-  // Verify that the destructor doesn't assert.
-  sequenced_task_checker.reset();
-}
-
-TEST(SequencedTaskCheckerTest, DestructorAllowedOnDifferentThread) {
-  std::unique_ptr<SequencedTaskChecker> sequenced_task_checker(
-      new SequencedTaskChecker());
-
-  // Verify that the destructor doesn't assert when called on a different
-  // thread.
-  DeleteSequencedCheckerOnThread delete_on_thread(
-      std::move(sequenced_task_checker));
-}
-
-TEST(SequencedTaskCheckerTest, DetachFromThread) {
-  std::unique_ptr<SequencedTaskChecker> sequenced_task_checker(
-      new SequencedTaskChecker());
-
-  sequenced_task_checker->Detach();
-  CallCalledSequentiallyOnThread call_on_thread(true,
-                                                sequenced_task_checker.get());
-}
-
-TEST(SequencedTaskCheckerTest, DetachFromThreadAndUseOnTaskQueue) {
-  std::unique_ptr<SequencedTaskChecker> sequenced_task_checker(
-      new SequencedTaskChecker());
-
-  sequenced_task_checker->Detach();
-  static const char kQueueName[] = "DetachFromThreadAndUseOnTaskQueue";
-  TaskQueue queue(kQueueName);
-  Event done_event(false, false);
-  queue.PostTask([&sequenced_task_checker, &done_event] {
-    EXPECT_TRUE(sequenced_task_checker->CalledSequentially());
-    done_event.Set();
-  });
-  EXPECT_TRUE(done_event.Wait(1000));
-}
-
-TEST(SequencedTaskCheckerTest, DetachFromTaskQueueAndUseOnThread) {
-  TaskQueue queue("DetachFromTaskQueueAndUseOnThread");
-  Event done_event(false, false);
-  queue.PostTask([&done_event] {
-    std::unique_ptr<SequencedTaskChecker> sequenced_task_checker(
-        new SequencedTaskChecker());
-
-    sequenced_task_checker->Detach();
-    CallCalledSequentiallyOnThread call_on_thread(true,
-                                                  sequenced_task_checker.get());
-    done_event.Set();
-  });
-  EXPECT_TRUE(done_event.Wait(1000));
-}
-
-#if RTC_DCHECK_IS_ON
-TEST(SequencedTaskCheckerTest, MethodNotAllowedOnDifferentThreadInDebug) {
-  RunMethodOnDifferentThread(false);
-}
-#else
-TEST(SequencedTaskCheckerTest, MethodAllowedOnDifferentThreadInRelease) {
-  RunMethodOnDifferentThread(true);
-}
-#endif
-
-#if RTC_DCHECK_IS_ON
-TEST(SequencedTaskCheckerTest, MethodNotAllowedOnDifferentTaskQueueInDebug) {
-  RunMethodOnDifferentTaskQueue(false);
-}
-#else
-TEST(SequencedTaskCheckerTest, MethodAllowedOnDifferentTaskQueueInRelease) {
-  RunMethodOnDifferentTaskQueue(true);
-}
-#endif
-
-#if RTC_DCHECK_IS_ON
-TEST(SequencedTaskCheckerTest, DetachFromTaskQueueInDebug) {
-  DetachThenCallFromDifferentTaskQueue(false);
-}
-#else
-TEST(SequencedTaskCheckerTest, DetachFromTaskQueueInRelease) {
-  DetachThenCallFromDifferentTaskQueue(true);
-}
-#endif
-
-class TestAnnotations {
- public:
-  TestAnnotations() : test_var_(false) {}
-
-  void ModifyTestVar() {
-    RTC_DCHECK_CALLED_SEQUENTIALLY(&checker_);
-    test_var_ = true;
-  }
-
- private:
-  bool test_var_ RTC_GUARDED_BY(&checker_);
-  SequencedTaskChecker checker_;
-};
-
-TEST(SequencedTaskCheckerTest, TestAnnotations) {
-  TestAnnotations annotations;
-  annotations.ModifyTestVar();
-}
-
-#if GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
-
-void TestAnnotationsOnWrongQueue() {
-  TestAnnotations annotations;
-  static const char kQueueName[] = "TestAnnotationsOnWrongQueueDebug";
-  TaskQueue queue(kQueueName);
-  Event done_event(false, false);
-  queue.PostTask([&annotations, &done_event] {
-    annotations.ModifyTestVar();
-    done_event.Set();
-  });
-  EXPECT_TRUE(done_event.Wait(1000));
-}
-
-#if RTC_DCHECK_IS_ON
-TEST(SequencedTaskCheckerTest, TestAnnotationsOnWrongQueueDebug) {
-  ASSERT_DEATH({ TestAnnotationsOnWrongQueue(); }, "");
-}
-#else
-TEST(SequencedTaskCheckerTest, TestAnnotationsOnWrongQueueRelease) {
-  TestAnnotationsOnWrongQueue();
-}
-#endif
-#endif  // GTEST_HAS_DEATH_TEST
-}  // namespace rtc
diff --git a/rtc_base/sha1.cc b/rtc_base/sha1.cc
deleted file mode 100644
index c12ebe0..0000000
--- a/rtc_base/sha1.cc
+++ /dev/null
@@ -1,298 +0,0 @@
-/*
- * SHA-1 in C
- * By Steve Reid <sreid@sea-to-sky.net>
- * 100% Public Domain
- *
- * -----------------
- * Modified 7/98
- * By James H. Brown <jbrown@burgoyne.com>
- * Still 100% Public Domain
- *
- * Corrected a problem which generated improper hash values on 16 bit machines
- * Routine SHA1Update changed from
- *   void SHA1Update(SHA1_CTX* context, unsigned char* data, unsigned int
- * len)
- * to
- *   void SHA1Update(SHA1_CTX* context, unsigned char* data, unsigned
- * long len)
- *
- * The 'len' parameter was declared an int which works fine on 32 bit machines.
- * However, on 16 bit machines an int is too small for the shifts being done
- * against
- * it.  This caused the hash function to generate incorrect values if len was
- * greater than 8191 (8K - 1) due to the 'len << 3' on line 3 of SHA1Update().
- *
- * Since the file IO in main() reads 16K at a time, any file 8K or larger would
- * be guaranteed to generate the wrong hash (e.g. Test Vector #3, a million
- * "a"s).
- *
- * I also changed the declaration of variables i & j in SHA1Update to
- * unsigned long from unsigned int for the same reason.
- *
- * These changes should make no difference to any 32 bit implementations since
- * an
- * int and a long are the same size in those environments.
- *
- * --
- * I also corrected a few compiler warnings generated by Borland C.
- * 1. Added #include <process.h> for exit() prototype
- * 2. Removed unused variable 'j' in SHA1Final
- * 3. Changed exit(0) to return(0) at end of main.
- *
- * ALL changes I made can be located by searching for comments containing 'JHB'
- * -----------------
- * Modified 8/98
- * By Steve Reid <sreid@sea-to-sky.net>
- * Still 100% public domain
- *
- * 1- Removed #include <process.h> and used return() instead of exit()
- * 2- Fixed overwriting of finalcount in SHA1Final() (discovered by Chris Hall)
- * 3- Changed email address from steve@edmweb.com to sreid@sea-to-sky.net
- *
- * -----------------
- * Modified 4/01
- * By Saul Kravitz <Saul.Kravitz@celera.com>
- * Still 100% PD
- * Modified to run on Compaq Alpha hardware.
- *
- * -----------------
- * Modified 07/2002
- * By Ralph Giles <giles@ghostscript.com>
- * Still 100% public domain
- * modified for use with stdint types, autoconf
- * code cleanup, removed attribution comments
- * switched SHA1Final() argument order for consistency
- * use SHA1_ prefix for public api
- * move public api to sha1.h
- *
- * -----------------
- * Modified 02/2012
- * By Justin Uberti <juberti@google.com>
- * Remove underscore from SHA1 prefix to avoid conflict with OpenSSL
- * Remove test code
- * Untabify
- *
- * -----------------
- * Modified 03/2012
- * By Ronghua Wu <ronghuawu@google.com>
- * Change the typedef of uint32(8)_t to uint32(8). We need this because in the
- * chromium android build, the stdio.h will include stdint.h which already
- * defined uint32(8)_t.
- *
- * -----------------
- * Modified 04/2012
- * By Frank Barchard <fbarchard@google.com>
- * Ported to C++, Google style, change len to size_t, enable SHA1HANDSOFF
- *
- * Test Vectors (from FIPS PUB 180-1)
- * "abc"
- *   A9993E36 4706816A BA3E2571 7850C26C 9CD0D89D
- * "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"
- *   84983E44 1C3BD26E BAAE4AA1 F95129E5 E54670F1
- * A million repetitions of "a"
- *   34AA973C D4C4DAA4 F61EEB2B DBAD2731 6534016F
- *
- * -----------------
- * Modified 05/2015
- * By Sergey Ulanov <sergeyu@chromium.org>
- * Removed static buffer to make computation thread-safe.
- *
- * -----------------
- * Modified 10/2015
- * By Peter Boström <pbos@webrtc.org>
- * Change uint32(8) back to uint32(8)_t (undoes (03/2012) change).
- */
-
-// Enabling SHA1HANDSOFF preserves the caller's data buffer.
-// Disabling SHA1HANDSOFF the buffer will be modified (end swapped).
-#define SHA1HANDSOFF
-
-#include "webrtc/rtc_base/sha1.h"
-
-#include <stdio.h>
-#include <string.h>
-
-namespace rtc {
-
-namespace {
-
-#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
-
-// blk0() and blk() perform the initial expand.
-// I got the idea of expanding during the round function from SSLeay
-// FIXME: can we do this in an endian-proof way?
-#ifdef RTC_ARCH_CPU_BIG_ENDIAN
-#define blk0(i) block->l[i]
-#else
-#define blk0(i) (block->l[i] = (rol(block->l[i], 24) & 0xFF00FF00) | \
-    (rol(block->l[i], 8) & 0x00FF00FF))
-#endif
-#define blk(i) (block->l[i & 15] = rol(block->l[(i + 13) & 15] ^ \
-    block->l[(i + 8) & 15] ^ block->l[(i + 2) & 15] ^ block->l[i & 15], 1))
-
-// (R0+R1), R2, R3, R4 are the different operations used in SHA1.
-#define R0(v, w, x, y, z, i) \
-    z += ((w & (x ^ y)) ^ y) + blk0(i) + 0x5A827999 + rol(v, 5); \
-    w = rol(w, 30);
-#define R1(v, w, x, y, z, i) \
-    z += ((w & (x ^ y)) ^ y) + blk(i) + 0x5A827999 + rol(v, 5); \
-    w = rol(w, 30);
-#define R2(v, w, x, y, z, i) \
-    z += (w ^ x ^ y) + blk(i) + 0x6ED9EBA1 + rol(v, 5);\
-    w = rol(w, 30);
-#define R3(v, w, x, y, z, i) \
-    z += (((w | x) & y) | (w & x)) + blk(i) + 0x8F1BBCDC + rol(v, 5); \
-    w = rol(w, 30);
-#define R4(v, w, x, y, z, i) \
-    z += (w ^ x ^ y) + blk(i) + 0xCA62C1D6 + rol(v, 5); \
-    w = rol(w, 30);
-
-#ifdef VERBOSE  // SAK
-void SHAPrintContext(SHA1_CTX *context, char *msg) {
-  printf("%s (%d,%d) %x %x %x %x %x\n",
-         msg,
-         context->count[0], context->count[1],
-         context->state[0],
-         context->state[1],
-         context->state[2],
-         context->state[3],
-         context->state[4]);
-}
-#endif /* VERBOSE */
-
-// Hash a single 512-bit block. This is the core of the algorithm.
-void SHA1Transform(uint32_t state[5], const uint8_t buffer[64]) {
-  union CHAR64LONG16 {
-    uint8_t c[64];
-    uint32_t l[16];
-  };
-#ifdef SHA1HANDSOFF
-  uint8_t workspace[64];
-  memcpy(workspace, buffer, 64);
-  CHAR64LONG16* block = reinterpret_cast<CHAR64LONG16*>(workspace);
-#else
-  // Note(fbarchard): This option does modify the user's data buffer.
-  CHAR64LONG16* block = const_cast<CHAR64LONG16*>(
-      reinterpret_cast<const CHAR64LONG16*>(buffer));
-#endif
-
-  // Copy context->state[] to working vars.
-  uint32_t a = state[0];
-  uint32_t b = state[1];
-  uint32_t c = state[2];
-  uint32_t d = state[3];
-  uint32_t e = state[4];
-
-  // 4 rounds of 20 operations each. Loop unrolled.
-  // Note(fbarchard): The following has lint warnings for multiple ; on
-  // a line and no space after , but is left as-is to be similar to the
-  // original code.
-  R0(a,b,c,d,e,0); R0(e,a,b,c,d,1); R0(d,e,a,b,c,2); R0(c,d,e,a,b,3);
-  R0(b,c,d,e,a,4); R0(a,b,c,d,e,5); R0(e,a,b,c,d,6); R0(d,e,a,b,c,7);
-  R0(c,d,e,a,b,8); R0(b,c,d,e,a,9); R0(a,b,c,d,e,10); R0(e,a,b,c,d,11);
-  R0(d,e,a,b,c,12); R0(c,d,e,a,b,13); R0(b,c,d,e,a,14); R0(a,b,c,d,e,15);
-  R1(e,a,b,c,d,16); R1(d,e,a,b,c,17); R1(c,d,e,a,b,18); R1(b,c,d,e,a,19);
-  R2(a,b,c,d,e,20); R2(e,a,b,c,d,21); R2(d,e,a,b,c,22); R2(c,d,e,a,b,23);
-  R2(b,c,d,e,a,24); R2(a,b,c,d,e,25); R2(e,a,b,c,d,26); R2(d,e,a,b,c,27);
-  R2(c,d,e,a,b,28); R2(b,c,d,e,a,29); R2(a,b,c,d,e,30); R2(e,a,b,c,d,31);
-  R2(d,e,a,b,c,32); R2(c,d,e,a,b,33); R2(b,c,d,e,a,34); R2(a,b,c,d,e,35);
-  R2(e,a,b,c,d,36); R2(d,e,a,b,c,37); R2(c,d,e,a,b,38); R2(b,c,d,e,a,39);
-  R3(a,b,c,d,e,40); R3(e,a,b,c,d,41); R3(d,e,a,b,c,42); R3(c,d,e,a,b,43);
-  R3(b,c,d,e,a,44); R3(a,b,c,d,e,45); R3(e,a,b,c,d,46); R3(d,e,a,b,c,47);
-  R3(c,d,e,a,b,48); R3(b,c,d,e,a,49); R3(a,b,c,d,e,50); R3(e,a,b,c,d,51);
-  R3(d,e,a,b,c,52); R3(c,d,e,a,b,53); R3(b,c,d,e,a,54); R3(a,b,c,d,e,55);
-  R3(e,a,b,c,d,56); R3(d,e,a,b,c,57); R3(c,d,e,a,b,58); R3(b,c,d,e,a,59);
-  R4(a,b,c,d,e,60); R4(e,a,b,c,d,61); R4(d,e,a,b,c,62); R4(c,d,e,a,b,63);
-  R4(b,c,d,e,a,64); R4(a,b,c,d,e,65); R4(e,a,b,c,d,66); R4(d,e,a,b,c,67);
-  R4(c,d,e,a,b,68); R4(b,c,d,e,a,69); R4(a,b,c,d,e,70); R4(e,a,b,c,d,71);
-  R4(d,e,a,b,c,72); R4(c,d,e,a,b,73); R4(b,c,d,e,a,74); R4(a,b,c,d,e,75);
-  R4(e,a,b,c,d,76); R4(d,e,a,b,c,77); R4(c,d,e,a,b,78); R4(b,c,d,e,a,79);
-
-  // Add the working vars back into context.state[].
-  state[0] += a;
-  state[1] += b;
-  state[2] += c;
-  state[3] += d;
-  state[4] += e;
-}
-
-}  // namespace
-
-// SHA1Init - Initialize new context.
-void SHA1Init(SHA1_CTX* context) {
-  // SHA1 initialization constants.
-  context->state[0] = 0x67452301;
-  context->state[1] = 0xEFCDAB89;
-  context->state[2] = 0x98BADCFE;
-  context->state[3] = 0x10325476;
-  context->state[4] = 0xC3D2E1F0;
-  context->count[0] = context->count[1] = 0;
-}
-
-// Run your data through this.
-void SHA1Update(SHA1_CTX* context, const uint8_t* data, size_t input_len) {
-  size_t i = 0;
-
-#ifdef VERBOSE
-  SHAPrintContext(context, "before");
-#endif
-
-  // Compute number of bytes mod 64.
-  size_t index = (context->count[0] >> 3) & 63;
-
-  // Update number of bits.
-  // TODO: Use uint64_t instead of 2 uint32_t for count.
-  // count[0] has low 29 bits for byte count + 3 pad 0's making 32 bits for
-  // bit count.
-  // Add bit count to low uint32_t
-  context->count[0] += static_cast<uint32_t>(input_len << 3);
-  if (context->count[0] < static_cast<uint32_t>(input_len << 3)) {
-    ++context->count[1];  // if overlow (carry), add one to high word
-  }
-  context->count[1] += static_cast<uint32_t>(input_len >> 29);
-  if ((index + input_len) > 63) {
-    i = 64 - index;
-    memcpy(&context->buffer[index], data, i);
-    SHA1Transform(context->state, context->buffer);
-    for (; i + 63 < input_len; i += 64) {
-      SHA1Transform(context->state, data + i);
-    }
-    index = 0;
-  }
-  memcpy(&context->buffer[index], &data[i], input_len - i);
-
-#ifdef VERBOSE
-  SHAPrintContext(context, "after ");
-#endif
-}
-
-// Add padding and return the message digest.
-void SHA1Final(SHA1_CTX* context, uint8_t digest[SHA1_DIGEST_SIZE]) {
-  uint8_t finalcount[8];
-  for (int i = 0; i < 8; ++i) {
-    // Endian independent
-    finalcount[i] = static_cast<uint8_t>(
-        (context->count[(i >= 4 ? 0 : 1)] >> ((3 - (i & 3)) * 8)) & 255);
-  }
-  SHA1Update(context, reinterpret_cast<const uint8_t*>("\200"), 1);
-  while ((context->count[0] & 504) != 448) {
-    SHA1Update(context, reinterpret_cast<const uint8_t*>("\0"), 1);
-  }
-  SHA1Update(context, finalcount, 8);  // Should cause a SHA1Transform().
-  for (int i = 0; i < SHA1_DIGEST_SIZE; ++i) {
-    digest[i] = static_cast<uint8_t>(
-        (context->state[i >> 2] >> ((3 - (i & 3)) * 8)) & 255);
-  }
-
-  // Wipe variables.
-  memset(context->buffer, 0, 64);
-  memset(context->state, 0, 20);
-  memset(context->count, 0, 8);
-  memset(finalcount, 0, 8);   // SWR
-
-#ifdef SHA1HANDSOFF  // Make SHA1Transform overwrite its own static vars.
-  SHA1Transform(context->state, context->buffer);
-#endif
-}
-
-}  // namespace rtc
diff --git a/rtc_base/sha1.h b/rtc_base/sha1.h
deleted file mode 100644
index e4db148..0000000
--- a/rtc_base/sha1.h
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * SHA-1 in C
- * By Steve Reid <sreid@sea-to-sky.net>
- * 100% Public Domain
- *
-*/
-
-// Ported to C++, Google style, under namespace rtc.
-
-#ifndef WEBRTC_RTC_BASE_SHA1_H_
-#define WEBRTC_RTC_BASE_SHA1_H_
-
-#include <stdint.h>
-#include <stdlib.h>
-
-namespace rtc {
-
-struct SHA1_CTX {
-  uint32_t state[5];
-  // TODO: Change bit count to uint64_t.
-  uint32_t count[2];  // Bit count of input.
-  uint8_t buffer[64];
-};
-
-#define SHA1_DIGEST_SIZE 20
-
-void SHA1Init(SHA1_CTX* context);
-void SHA1Update(SHA1_CTX* context, const uint8_t* data, size_t len);
-void SHA1Final(SHA1_CTX* context, uint8_t digest[SHA1_DIGEST_SIZE]);
-
-}  // namespace rtc
-
-#endif  // WEBRTC_RTC_BASE_SHA1_H_
diff --git a/rtc_base/sha1digest.cc b/rtc_base/sha1digest.cc
deleted file mode 100644
index cf4de93..0000000
--- a/rtc_base/sha1digest.cc
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- *  Copyright 2015 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/rtc_base/sha1digest.h"
-
-namespace rtc {
-
-size_t Sha1Digest::Size() const {
-  return kSize;
-}
-
-void Sha1Digest::Update(const void* buf, size_t len) {
-  SHA1Update(&ctx_, static_cast<const uint8_t*>(buf), len);
-}
-
-size_t Sha1Digest::Finish(void* buf, size_t len) {
-  if (len < kSize) {
-    return 0;
-  }
-  SHA1Final(&ctx_, static_cast<uint8_t*>(buf));
-  SHA1Init(&ctx_);  // Reset for next use.
-  return kSize;
-}
-
-}  // namespace rtc
diff --git a/rtc_base/sha1digest.h b/rtc_base/sha1digest.h
deleted file mode 100644
index 2f939ce..0000000
--- a/rtc_base/sha1digest.h
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- *  Copyright 2012 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_RTC_BASE_SHA1DIGEST_H_
-#define WEBRTC_RTC_BASE_SHA1DIGEST_H_
-
-#include "webrtc/rtc_base/messagedigest.h"
-#include "webrtc/rtc_base/sha1.h"
-
-namespace rtc {
-
-// A simple wrapper for our SHA-1 implementation.
-class Sha1Digest : public MessageDigest {
- public:
-  enum { kSize = SHA1_DIGEST_SIZE };
-  Sha1Digest() {
-    SHA1Init(&ctx_);
-  }
-  size_t Size() const override;
-  void Update(const void* buf, size_t len) override;
-  size_t Finish(void* buf, size_t len) override;
-
- private:
-  SHA1_CTX ctx_;
-};
-
-}  // namespace rtc
-
-#endif  // WEBRTC_RTC_BASE_SHA1DIGEST_H_
diff --git a/rtc_base/sha1digest_unittest.cc b/rtc_base/sha1digest_unittest.cc
deleted file mode 100644
index 24c30fa..0000000
--- a/rtc_base/sha1digest_unittest.cc
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- *  Copyright 2012 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/rtc_base/sha1digest.h"
-#include "webrtc/rtc_base/gunit.h"
-#include "webrtc/rtc_base/stringencode.h"
-
-namespace rtc {
-
-std::string Sha1(const std::string& input) {
-  Sha1Digest sha1;
-  return ComputeDigest(&sha1, input);
-}
-
-TEST(Sha1DigestTest, TestSize) {
-  Sha1Digest sha1;
-  EXPECT_EQ(20, static_cast<int>(Sha1Digest::kSize));
-  EXPECT_EQ(20U, sha1.Size());
-}
-
-TEST(Sha1DigestTest, TestBasic) {
-  // Test vectors from sha1.c.
-  EXPECT_EQ("da39a3ee5e6b4b0d3255bfef95601890afd80709", Sha1(""));
-  EXPECT_EQ("a9993e364706816aba3e25717850c26c9cd0d89d", Sha1("abc"));
-  EXPECT_EQ("84983e441c3bd26ebaae4aa1f95129e5e54670f1",
-            Sha1("abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"));
-  std::string a_million_as(1000000, 'a');
-  EXPECT_EQ("34aa973cd4c4daa4f61eeb2bdbad27316534016f", Sha1(a_million_as));
-}
-
-TEST(Sha1DigestTest, TestMultipleUpdates) {
-  Sha1Digest sha1;
-  std::string input =
-      "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq";
-  char output[Sha1Digest::kSize];
-  for (size_t i = 0; i < input.size(); ++i) {
-    sha1.Update(&input[i], 1);
-  }
-  EXPECT_EQ(sha1.Size(), sha1.Finish(output, sizeof(output)));
-  EXPECT_EQ("84983e441c3bd26ebaae4aa1f95129e5e54670f1",
-            hex_encode(output, sizeof(output)));
-}
-
-TEST(Sha1DigestTest, TestReuse) {
-  Sha1Digest sha1;
-  std::string input = "abc";
-  EXPECT_EQ("a9993e364706816aba3e25717850c26c9cd0d89d",
-            ComputeDigest(&sha1, input));
-  input = "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq";
-  EXPECT_EQ("84983e441c3bd26ebaae4aa1f95129e5e54670f1",
-            ComputeDigest(&sha1, input));
-}
-
-TEST(Sha1DigestTest, TestBufferTooSmall) {
-  Sha1Digest sha1;
-  std::string input = "abcdefghijklmnopqrstuvwxyz";
-  char output[Sha1Digest::kSize - 1];
-  sha1.Update(input.c_str(), input.size());
-  EXPECT_EQ(0U, sha1.Finish(output, sizeof(output)));
-}
-
-TEST(Sha1DigestTest, TestBufferConst) {
-  Sha1Digest sha1;
-  const int kLongSize = 1000000;
-  std::string input(kLongSize, '\0');
-  for (int i = 0; i < kLongSize; ++i) {
-    input[i] = static_cast<char>(i);
-  }
-  sha1.Update(input.c_str(), input.size());
-  for (int i = 0; i < kLongSize; ++i) {
-    EXPECT_EQ(static_cast<char>(i), input[i]);
-  }
-}
-
-}  // namespace rtc
diff --git a/rtc_base/signalthread.cc b/rtc_base/signalthread.cc
deleted file mode 100644
index 93fa73d..0000000
--- a/rtc_base/signalthread.cc
+++ /dev/null
@@ -1,154 +0,0 @@
-/*
- *  Copyright 2004 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/rtc_base/signalthread.h"
-
-#include "webrtc/rtc_base/checks.h"
-
-namespace rtc {
-
-///////////////////////////////////////////////////////////////////////////////
-// SignalThread
-///////////////////////////////////////////////////////////////////////////////
-
-SignalThread::SignalThread(bool use_socket_server)
-    : main_(Thread::Current()),
-      worker_(this, use_socket_server),
-      state_(kInit),
-      refcount_(1) {
-  main_->SignalQueueDestroyed.connect(this,
-                                      &SignalThread::OnMainThreadDestroyed);
-  worker_.SetName("SignalThread", this);
-}
-
-SignalThread::~SignalThread() {
-  RTC_DCHECK(refcount_ == 0);
-}
-
-bool SignalThread::SetName(const std::string& name, const void* obj) {
-  EnterExit ee(this);
-  RTC_DCHECK(main_->IsCurrent());
-  RTC_DCHECK(kInit == state_);
-  return worker_.SetName(name, obj);
-}
-
-void SignalThread::Start() {
-  EnterExit ee(this);
-  RTC_DCHECK(main_->IsCurrent());
-  if (kInit == state_ || kComplete == state_) {
-    state_ = kRunning;
-    OnWorkStart();
-    worker_.Start();
-  } else {
-    RTC_NOTREACHED();
-  }
-}
-
-void SignalThread::Destroy(bool wait) {
-  EnterExit ee(this);
-  RTC_DCHECK(main_->IsCurrent());
-  if ((kInit == state_) || (kComplete == state_)) {
-    refcount_--;
-  } else if (kRunning == state_ || kReleasing == state_) {
-    state_ = kStopping;
-    // OnWorkStop() must follow Quit(), so that when the thread wakes up due to
-    // OWS(), ContinueWork() will return false.
-    worker_.Quit();
-    OnWorkStop();
-    if (wait) {
-      // Release the thread's lock so that it can return from ::Run.
-      cs_.Leave();
-      worker_.Stop();
-      cs_.Enter();
-      refcount_--;
-    }
-  } else {
-    RTC_NOTREACHED();
-  }
-}
-
-void SignalThread::Release() {
-  EnterExit ee(this);
-  RTC_DCHECK(main_->IsCurrent());
-  if (kComplete == state_) {
-    refcount_--;
-  } else if (kRunning == state_) {
-    state_ = kReleasing;
-  } else {
-    // if (kInit == state_) use Destroy()
-    RTC_NOTREACHED();
-  }
-}
-
-bool SignalThread::ContinueWork() {
-  EnterExit ee(this);
-  RTC_DCHECK(worker_.IsCurrent());
-  return worker_.ProcessMessages(0);
-}
-
-void SignalThread::OnMessage(Message *msg) {
-  EnterExit ee(this);
-  if (ST_MSG_WORKER_DONE == msg->message_id) {
-    RTC_DCHECK(main_->IsCurrent());
-    OnWorkDone();
-    bool do_delete = false;
-    if (kRunning == state_) {
-      state_ = kComplete;
-    } else {
-      do_delete = true;
-    }
-    if (kStopping != state_) {
-      // Before signaling that the work is done, make sure that the worker
-      // thread actually is done. We got here because DoWork() finished and
-      // Run() posted the ST_MSG_WORKER_DONE message. This means the worker
-      // thread is about to go away anyway, but sometimes it doesn't actually
-      // finish before SignalWorkDone is processed, and for a reusable
-      // SignalThread this makes an assert in thread.cc fire.
-      //
-      // Calling Stop() on the worker ensures that the OS thread that underlies
-      // the worker will finish, and will be set to null, enabling us to call
-      // Start() again.
-      worker_.Stop();
-      SignalWorkDone(this);
-    }
-    if (do_delete) {
-      refcount_--;
-    }
-  }
-}
-
-SignalThread::Worker::~Worker() {
-  Stop();
-}
-
-void SignalThread::Worker::Run() {
-  parent_->Run();
-}
-
-void SignalThread::Run() {
-  DoWork();
-  {
-    EnterExit ee(this);
-    if (main_) {
-      main_->Post(RTC_FROM_HERE, this, ST_MSG_WORKER_DONE);
-    }
-  }
-}
-
-void SignalThread::OnMainThreadDestroyed() {
-  EnterExit ee(this);
-  main_ = nullptr;
-}
-
-bool SignalThread::Worker::IsProcessingMessages() {
-  return false;
-}
-
-}  // namespace rtc
diff --git a/rtc_base/signalthread.h b/rtc_base/signalthread.h
deleted file mode 100644
index 1c6c876..0000000
--- a/rtc_base/signalthread.h
+++ /dev/null
@@ -1,161 +0,0 @@
-/*
- *  Copyright 2004 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_RTC_BASE_SIGNALTHREAD_H_
-#define WEBRTC_RTC_BASE_SIGNALTHREAD_H_
-
-#include <string>
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/nullsocketserver.h"
-#include "webrtc/rtc_base/sigslot.h"
-#include "webrtc/rtc_base/thread.h"
-
-namespace rtc {
-
-///////////////////////////////////////////////////////////////////////////////
-// SignalThread - Base class for worker threads.  The main thread should call
-//  Start() to begin work, and then follow one of these models:
-//   Normal: Wait for SignalWorkDone, and then call Release to destroy.
-//   Cancellation: Call Release(true), to abort the worker thread.
-//   Fire-and-forget: Call Release(false), which allows the thread to run to
-//    completion, and then self-destruct without further notification.
-//   Periodic tasks: Wait for SignalWorkDone, then eventually call Start()
-//    again to repeat the task. When the instance isn't needed anymore,
-//    call Release. DoWork, OnWorkStart and OnWorkStop are called again,
-//    on a new thread.
-//  The subclass should override DoWork() to perform the background task.  By
-//   periodically calling ContinueWork(), it can check for cancellation.
-//   OnWorkStart and OnWorkDone can be overridden to do pre- or post-work
-//   tasks in the context of the main thread.
-///////////////////////////////////////////////////////////////////////////////
-
-class SignalThread
-    : public sigslot::has_slots<>,
-      protected MessageHandler {
- public:
-  explicit SignalThread(bool use_socket_server = true);
-
-  // Context: Main Thread.  Call before Start to change the worker's name.
-  bool SetName(const std::string& name, const void* obj);
-
-  // Context: Main Thread.  Call to begin the worker thread.
-  void Start();
-
-  // Context: Main Thread.  If the worker thread is not running, deletes the
-  // object immediately.  Otherwise, asks the worker thread to abort processing,
-  // and schedules the object to be deleted once the worker exits.
-  // SignalWorkDone will not be signalled.  If wait is true, does not return
-  // until the thread is deleted.
-  void Destroy(bool wait);
-
-  // Context: Main Thread.  If the worker thread is complete, deletes the
-  // object immediately.  Otherwise, schedules the object to be deleted once
-  // the worker thread completes.  SignalWorkDone will be signalled.
-  void Release();
-
-  // Context: Main Thread.  Signalled when work is complete.
-  sigslot::signal1<SignalThread *> SignalWorkDone;
-
-  enum { ST_MSG_WORKER_DONE, ST_MSG_FIRST_AVAILABLE };
-
- protected:
-  ~SignalThread() override;
-
-  Thread* worker() { return &worker_; }
-
-  // Context: Main Thread.  Subclass should override to do pre-work setup.
-  virtual void OnWorkStart() { }
-
-  // Context: Worker Thread.  Subclass should override to do work.
-  virtual void DoWork() = 0;
-
-  // Context: Worker Thread.  Subclass should call periodically to
-  // dispatch messages and determine if the thread should terminate.
-  bool ContinueWork();
-
-  // Context: Worker Thread.  Subclass should override when extra work is
-  // needed to abort the worker thread.
-  virtual void OnWorkStop() { }
-
-  // Context: Main Thread.  Subclass should override to do post-work cleanup.
-  virtual void OnWorkDone() { }
-
-  // Context: Any Thread.  If subclass overrides, be sure to call the base
-  // implementation.  Do not use (message_id < ST_MSG_FIRST_AVAILABLE)
-  void OnMessage(Message* msg) override;
-
- private:
-  enum State {
-    kInit,            // Initialized, but not started
-    kRunning,         // Started and doing work
-    kReleasing,       // Same as running, but to be deleted when work is done
-    kComplete,        // Work is done
-    kStopping,        // Work is being interrupted
-  };
-
-  class Worker : public Thread {
-   public:
-    explicit Worker(SignalThread* parent, bool use_socket_server)
-        : Thread(use_socket_server
-                     ? SocketServer::CreateDefault()
-                     : std::unique_ptr<SocketServer>(new NullSocketServer())),
-          parent_(parent) {}
-    ~Worker() override;
-    void Run() override;
-    bool IsProcessingMessages() override;
-
-   private:
-    SignalThread* parent_;
-
-    RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(Worker);
-  };
-
-  class RTC_SCOPED_LOCKABLE EnterExit {
-   public:
-    explicit EnterExit(SignalThread* t) RTC_EXCLUSIVE_LOCK_FUNCTION(t->cs_)
-        : t_(t) {
-      t_->cs_.Enter();
-      // If refcount_ is zero then the object has already been deleted and we
-      // will be double-deleting it in ~EnterExit()! (shouldn't happen)
-      RTC_DCHECK_NE(0, t_->refcount_);
-      ++t_->refcount_;
-    }
-    ~EnterExit() RTC_UNLOCK_FUNCTION() {
-      bool d = (0 == --t_->refcount_);
-      t_->cs_.Leave();
-      if (d)
-        delete t_;
-    }
-
-   private:
-    SignalThread* t_;
-
-    RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(EnterExit);
-  };
-
-  void Run();
-  void OnMainThreadDestroyed();
-
-  Thread* main_;
-  Worker worker_;
-  CriticalSection cs_;
-  State state_;
-  int refcount_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(SignalThread);
-};
-
-///////////////////////////////////////////////////////////////////////////////
-
-}  // namespace rtc
-
-#endif  // WEBRTC_RTC_BASE_SIGNALTHREAD_H_
diff --git a/rtc_base/signalthread_unittest.cc b/rtc_base/signalthread_unittest.cc
deleted file mode 100644
index 99d3206..0000000
--- a/rtc_base/signalthread_unittest.cc
+++ /dev/null
@@ -1,210 +0,0 @@
-/*
- *  Copyright 2004 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 <memory>
-
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/gunit.h"
-#include "webrtc/rtc_base/signalthread.h"
-#include "webrtc/rtc_base/thread.h"
-
-using namespace rtc;
-
-// 10 seconds.
-static const int kTimeout = 10000;
-
-class SignalThreadTest : public testing::Test, public sigslot::has_slots<> {
- public:
-  class SlowSignalThread : public SignalThread {
-   public:
-    SlowSignalThread(SignalThreadTest* harness) : harness_(harness) {}
-
-    virtual ~SlowSignalThread() {
-      EXPECT_EQ(harness_->main_thread_, Thread::Current());
-      ++harness_->thread_deleted_;
-    }
-
-    const SignalThreadTest* harness() { return harness_; }
-
-   protected:
-    virtual void OnWorkStart() {
-      ASSERT_TRUE(harness_ != nullptr);
-      ++harness_->thread_started_;
-      EXPECT_EQ(harness_->main_thread_, Thread::Current());
-      EXPECT_FALSE(worker()->RunningForTest());  // not started yet
-    }
-
-    virtual void OnWorkStop() {
-      ++harness_->thread_stopped_;
-      EXPECT_EQ(harness_->main_thread_, Thread::Current());
-      EXPECT_TRUE(worker()->RunningForTest());  // not stopped yet
-    }
-
-    virtual void OnWorkDone() {
-      ++harness_->thread_done_;
-      EXPECT_EQ(harness_->main_thread_, Thread::Current());
-      EXPECT_TRUE(worker()->RunningForTest());  // not stopped yet
-    }
-
-    virtual void DoWork() {
-      EXPECT_NE(harness_->main_thread_, Thread::Current());
-      EXPECT_EQ(worker(), Thread::Current());
-      Thread::Current()->socketserver()->Wait(250, false);
-    }
-
-   private:
-    SignalThreadTest* harness_;
-    RTC_DISALLOW_COPY_AND_ASSIGN(SlowSignalThread);
-  };
-
-  void OnWorkComplete(rtc::SignalThread* thread) {
-    SlowSignalThread* t = static_cast<SlowSignalThread*>(thread);
-    EXPECT_EQ(t->harness(), this);
-    EXPECT_EQ(main_thread_, Thread::Current());
-
-    ++thread_completed_;
-    if (!called_release_) {
-      thread->Release();
-    }
-  }
-
-  virtual void SetUp() {
-    main_thread_ = Thread::Current();
-    thread_ = new SlowSignalThread(this);
-    thread_->SignalWorkDone.connect(this, &SignalThreadTest::OnWorkComplete);
-    called_release_ = false;
-    thread_started_ = 0;
-    thread_done_ = 0;
-    thread_completed_ = 0;
-    thread_stopped_ = 0;
-    thread_deleted_ = 0;
-  }
-
-  virtual void TearDown() {}
-
-  void ExpectState(int started,
-                   int done,
-                   int completed,
-                   int stopped,
-                   int deleted) {
-    EXPECT_EQ(started, thread_started_);
-    EXPECT_EQ(done, thread_done_);
-    EXPECT_EQ(completed, thread_completed_);
-    EXPECT_EQ(stopped, thread_stopped_);
-    EXPECT_EQ(deleted, thread_deleted_);
-  }
-
-  void ExpectStateWait(int started,
-                       int done,
-                       int completed,
-                       int stopped,
-                       int deleted,
-                       int timeout) {
-    EXPECT_EQ_WAIT(started, thread_started_, timeout);
-    EXPECT_EQ_WAIT(done, thread_done_, timeout);
-    EXPECT_EQ_WAIT(completed, thread_completed_, timeout);
-    EXPECT_EQ_WAIT(stopped, thread_stopped_, timeout);
-    EXPECT_EQ_WAIT(deleted, thread_deleted_, timeout);
-  }
-
-  Thread* main_thread_;
-  SlowSignalThread* thread_;
-  bool called_release_;
-
-  int thread_started_;
-  int thread_done_;
-  int thread_completed_;
-  int thread_stopped_;
-  int thread_deleted_;
-};
-
-class OwnerThread : public Thread, public sigslot::has_slots<> {
- public:
-  explicit OwnerThread(SignalThreadTest* harness)
-      : harness_(harness), has_run_(false) {}
-
-  virtual ~OwnerThread() { Stop(); }
-
-  virtual void Run() {
-    SignalThreadTest::SlowSignalThread* signal_thread =
-        new SignalThreadTest::SlowSignalThread(harness_);
-    signal_thread->SignalWorkDone.connect(this, &OwnerThread::OnWorkDone);
-    signal_thread->Start();
-    Thread::Current()->socketserver()->Wait(100, false);
-    signal_thread->Release();
-    // Delete |signal_thread|.
-    signal_thread->Destroy(true);
-    has_run_ = true;
-  }
-
-  bool has_run() { return has_run_; }
-  void OnWorkDone(SignalThread* signal_thread) {
-    FAIL() << " This shouldn't get called.";
-  }
-
- private:
-  SignalThreadTest* harness_;
-  bool has_run_;
-  RTC_DISALLOW_COPY_AND_ASSIGN(OwnerThread);
-};
-
-// Test for when the main thread goes away while the
-// signal thread is still working.  This may happen
-// when shutting down the process.
-TEST_F(SignalThreadTest, OwnerThreadGoesAway) {
-  // We don't use |thread_| for this test, so destroy it.
-  thread_->Destroy(true);
-
-  {
-    std::unique_ptr<OwnerThread> owner(new OwnerThread(this));
-    main_thread_ = owner.get();
-    owner->Start();
-    while (!owner->has_run()) {
-      Thread::Current()->socketserver()->Wait(10, false);
-    }
-  }
-  // At this point the main thread has gone away.
-  // Give the SignalThread a little time to do its callback,
-  // which will crash if the signal thread doesn't handle
-  // this situation well.
-  Thread::Current()->socketserver()->Wait(500, false);
-}
-
-TEST_F(SignalThreadTest, ThreadFinishes) {
-  thread_->Start();
-  ExpectState(1, 0, 0, 0, 0);
-  ExpectStateWait(1, 1, 1, 0, 1, kTimeout);
-}
-
-TEST_F(SignalThreadTest, ReleasedThreadFinishes) {
-  thread_->Start();
-  ExpectState(1, 0, 0, 0, 0);
-  thread_->Release();
-  called_release_ = true;
-  ExpectState(1, 0, 0, 0, 0);
-  ExpectStateWait(1, 1, 1, 0, 1, kTimeout);
-}
-
-TEST_F(SignalThreadTest, DestroyedThreadCleansUp) {
-  thread_->Start();
-  ExpectState(1, 0, 0, 0, 0);
-  thread_->Destroy(true);
-  ExpectState(1, 0, 0, 1, 1);
-  Thread::Current()->ProcessMessages(0);
-  ExpectState(1, 0, 0, 1, 1);
-}
-
-TEST_F(SignalThreadTest, DeferredDestroyedThreadCleansUp) {
-  thread_->Start();
-  ExpectState(1, 0, 0, 0, 0);
-  thread_->Destroy(false);
-  ExpectState(1, 0, 0, 1, 0);
-  ExpectStateWait(1, 1, 0, 1, 1, kTimeout);
-}
diff --git a/rtc_base/sigslot.cc b/rtc_base/sigslot.cc
deleted file mode 100644
index 3f22af1..0000000
--- a/rtc_base/sigslot.cc
+++ /dev/null
@@ -1,22 +0,0 @@
-// sigslot.h: Signal/Slot classes
-//
-// Written by Sarah Thompson (sarah@telergy.com) 2002.
-//
-// License: Public domain. You are free to use this code however you like, with
-// the proviso that the author takes on no responsibility or liability for any
-// use.
-
-#include "webrtc/rtc_base/sigslot.h"
-
-namespace sigslot {
-
-#ifdef _SIGSLOT_HAS_POSIX_THREADS
-
-pthread_mutex_t* multi_threaded_global::get_mutex() {
-  static pthread_mutex_t g_mutex = PTHREAD_MUTEX_INITIALIZER;
-  return &g_mutex;
-}
-
-#endif  // _SIGSLOT_HAS_POSIX_THREADS
-
-}  // namespace sigslot
diff --git a/rtc_base/sigslot.h b/rtc_base/sigslot.h
deleted file mode 100644
index ec4232c..0000000
--- a/rtc_base/sigslot.h
+++ /dev/null
@@ -1,647 +0,0 @@
-// sigslot.h: Signal/Slot classes
-//
-// Written by Sarah Thompson (sarah@telergy.com) 2002.
-//
-// License: Public domain. You are free to use this code however you like, with
-// the proviso that the author takes on no responsibility or liability for any
-// use.
-//
-// QUICK DOCUMENTATION
-//
-//        (see also the full documentation at http://sigslot.sourceforge.net/)
-//
-//    #define switches
-//      SIGSLOT_PURE_ISO:
-//        Define this to force ISO C++ compliance. This also disables all of
-//        the thread safety support on platforms where it is available.
-//
-//      SIGSLOT_USE_POSIX_THREADS:
-//        Force use of Posix threads when using a C++ compiler other than gcc
-//        on a platform that supports Posix threads. (When using gcc, this is
-//        the default - use SIGSLOT_PURE_ISO to disable this if necessary)
-//
-//      SIGSLOT_DEFAULT_MT_POLICY:
-//        Where thread support is enabled, this defaults to
-//        multi_threaded_global. Otherwise, the default is single_threaded.
-//        #define this yourself to override the default. In pure ISO mode,
-//        anything other than single_threaded will cause a compiler error.
-//
-//    PLATFORM NOTES
-//
-//      Win32:
-//        On Win32, the WEBRTC_WIN symbol must be #defined. Most mainstream
-//        compilers do this by default, but you may need to define it yourself
-//        if your build environment is less standard. This causes the Win32
-//        thread support to be compiled in and used automatically.
-//
-//      Unix/Linux/BSD, etc.:
-//        If you're using gcc, it is assumed that you have Posix threads
-//        available, so they are used automatically. You can override this (as
-//        under Windows) with the SIGSLOT_PURE_ISO switch. If you're using
-//        something other than gcc but still want to use Posix threads, you
-//        need to #define SIGSLOT_USE_POSIX_THREADS.
-//
-//      ISO C++:
-//        If none of the supported platforms are detected, or if
-//        SIGSLOT_PURE_ISO is defined, all multithreading support is turned
-//        off, along with any code that might cause a pure ISO C++ environment
-//        to complain. Before you ask, gcc -ansi -pedantic won't compile this
-//        library, but gcc -ansi is fine. Pedantic mode seems to throw a lot of
-//        errors that aren't really there. If you feel like investigating this,
-//        please contact the author.
-//
-//
-//    THREADING MODES
-//
-//      single_threaded:
-//        Your program is assumed to be single threaded from the point of view
-//        of signal/slot usage (i.e. all objects using signals and slots are
-//        created and destroyed from a single thread). Behaviour if objects are
-//        destroyed concurrently is undefined (i.e. you'll get the occasional
-//        segmentation fault/memory exception).
-//
-//      multi_threaded_global:
-//        Your program is assumed to be multi threaded. Objects using signals
-//        and slots can be safely created and destroyed from any thread, even
-//        when connections exist. In multi_threaded_global mode, this is
-//        achieved by a single global mutex (actually a critical section on
-//        Windows because they are faster). This option uses less OS resources,
-//        but results in more opportunities for contention, possibly resulting
-//        in more context switches than are strictly necessary.
-//
-//      multi_threaded_local:
-//        Behaviour in this mode is essentially the same as
-//        multi_threaded_global, except that each signal, and each object that
-//        inherits has_slots, all have their own mutex/critical section. In
-//        practice, this means that mutex collisions (and hence context
-//        switches) only happen if they are absolutely essential. However, on
-//        some platforms, creating a lot of mutexes can slow down the whole OS,
-//        so use this option with care.
-//
-//    USING THE LIBRARY
-//
-//      See the full documentation at http://sigslot.sourceforge.net/
-//
-// Libjingle specific:
-//
-// This file has been modified such that has_slots and signalx do not have to be
-// using the same threading requirements. E.g. it is possible to connect a
-// has_slots<single_threaded> and signal0<multi_threaded_local> or
-// has_slots<multi_threaded_local> and signal0<single_threaded>.
-// If has_slots is single threaded the user must ensure that it is not trying
-// to connect or disconnect to signalx concurrently or data race may occur.
-// If signalx is single threaded the user must ensure that disconnect, connect
-// or signal is not happening concurrently or data race may occur.
-
-#ifndef WEBRTC_RTC_BASE_SIGSLOT_H_
-#define WEBRTC_RTC_BASE_SIGSLOT_H_
-
-#include <stdlib.h>
-#include <cstring>
-#include <list>
-#include <set>
-
-// On our copy of sigslot.h, we set single threading as default.
-#define SIGSLOT_DEFAULT_MT_POLICY single_threaded
-
-#if defined(SIGSLOT_PURE_ISO) ||                   \
-    (!defined(WEBRTC_WIN) && !defined(__GNUG__) && \
-     !defined(SIGSLOT_USE_POSIX_THREADS))
-#define _SIGSLOT_SINGLE_THREADED
-#elif defined(WEBRTC_WIN)
-#define _SIGSLOT_HAS_WIN32_THREADS
-#if !defined(WIN32_LEAN_AND_MEAN)
-#define WIN32_LEAN_AND_MEAN
-#endif
-#include "webrtc/rtc_base/win32.h"
-#elif defined(__GNUG__) || defined(SIGSLOT_USE_POSIX_THREADS)
-#define _SIGSLOT_HAS_POSIX_THREADS
-#include <pthread.h>
-#else
-#define _SIGSLOT_SINGLE_THREADED
-#endif
-
-#ifndef SIGSLOT_DEFAULT_MT_POLICY
-#ifdef _SIGSLOT_SINGLE_THREADED
-#define SIGSLOT_DEFAULT_MT_POLICY single_threaded
-#else
-#define SIGSLOT_DEFAULT_MT_POLICY multi_threaded_local
-#endif
-#endif
-
-// TODO: change this namespace to rtc?
-namespace sigslot {
-
-class single_threaded {
- public:
-  void lock() {}
-  void unlock() {}
-};
-
-#ifdef _SIGSLOT_HAS_WIN32_THREADS
-// The multi threading policies only get compiled in if they are enabled.
-class multi_threaded_global {
- public:
-  multi_threaded_global() {
-    static bool isinitialised = false;
-
-    if (!isinitialised) {
-      InitializeCriticalSection(get_critsec());
-      isinitialised = true;
-    }
-  }
-
-  void lock() { EnterCriticalSection(get_critsec()); }
-
-  void unlock() { LeaveCriticalSection(get_critsec()); }
-
- private:
-  CRITICAL_SECTION* get_critsec() {
-    static CRITICAL_SECTION g_critsec;
-    return &g_critsec;
-  }
-};
-
-class multi_threaded_local {
- public:
-  multi_threaded_local() { InitializeCriticalSection(&m_critsec); }
-
-  multi_threaded_local(const multi_threaded_local&) {
-    InitializeCriticalSection(&m_critsec);
-  }
-
-  ~multi_threaded_local() { DeleteCriticalSection(&m_critsec); }
-
-  void lock() { EnterCriticalSection(&m_critsec); }
-
-  void unlock() { LeaveCriticalSection(&m_critsec); }
-
- private:
-  CRITICAL_SECTION m_critsec;
-};
-#endif  // _SIGSLOT_HAS_WIN32_THREADS
-
-#ifdef _SIGSLOT_HAS_POSIX_THREADS
-// The multi threading policies only get compiled in if they are enabled.
-class multi_threaded_global {
- public:
-  void lock() { pthread_mutex_lock(get_mutex()); }
-  void unlock() { pthread_mutex_unlock(get_mutex()); }
-
- private:
-  static pthread_mutex_t* get_mutex();
-};
-
-class multi_threaded_local {
- public:
-  multi_threaded_local() { pthread_mutex_init(&m_mutex, nullptr); }
-  multi_threaded_local(const multi_threaded_local&) {
-    pthread_mutex_init(&m_mutex, nullptr);
-  }
-  ~multi_threaded_local() { pthread_mutex_destroy(&m_mutex); }
-  void lock() { pthread_mutex_lock(&m_mutex); }
-  void unlock() { pthread_mutex_unlock(&m_mutex); }
-
- private:
-  pthread_mutex_t m_mutex;
-};
-#endif  // _SIGSLOT_HAS_POSIX_THREADS
-
-template <class mt_policy>
-class lock_block {
- public:
-  mt_policy* m_mutex;
-
-  lock_block(mt_policy* mtx) : m_mutex(mtx) { m_mutex->lock(); }
-
-  ~lock_block() { m_mutex->unlock(); }
-};
-
-class _signal_base_interface;
-
-class has_slots_interface {
- private:
-  typedef void (*signal_connect_t)(has_slots_interface* self,
-                                   _signal_base_interface* sender);
-  typedef void (*signal_disconnect_t)(has_slots_interface* self,
-                                      _signal_base_interface* sender);
-  typedef void (*disconnect_all_t)(has_slots_interface* self);
-
-  const signal_connect_t m_signal_connect;
-  const signal_disconnect_t m_signal_disconnect;
-  const disconnect_all_t m_disconnect_all;
-
- protected:
-  has_slots_interface(signal_connect_t conn,
-                      signal_disconnect_t disc,
-                      disconnect_all_t disc_all)
-      : m_signal_connect(conn),
-        m_signal_disconnect(disc),
-        m_disconnect_all(disc_all) {}
-
-  // Doesn't really need to be virtual, but is for backwards compatibility
-  // (it was virtual in a previous version of sigslot).
-  virtual ~has_slots_interface() {}
-
- public:
-  void signal_connect(_signal_base_interface* sender) {
-    m_signal_connect(this, sender);
-  }
-
-  void signal_disconnect(_signal_base_interface* sender) {
-    m_signal_disconnect(this, sender);
-  }
-
-  void disconnect_all() { m_disconnect_all(this); }
-};
-
-class _signal_base_interface {
- private:
-  typedef void (*slot_disconnect_t)(_signal_base_interface* self,
-                                    has_slots_interface* pslot);
-  typedef void (*slot_duplicate_t)(_signal_base_interface* self,
-                                   const has_slots_interface* poldslot,
-                                   has_slots_interface* pnewslot);
-
-  const slot_disconnect_t m_slot_disconnect;
-  const slot_duplicate_t m_slot_duplicate;
-
- protected:
-  _signal_base_interface(slot_disconnect_t disc, slot_duplicate_t dupl)
-      : m_slot_disconnect(disc), m_slot_duplicate(dupl) {}
-
-  ~_signal_base_interface() {}
-
- public:
-  void slot_disconnect(has_slots_interface* pslot) {
-    m_slot_disconnect(this, pslot);
-  }
-
-  void slot_duplicate(const has_slots_interface* poldslot,
-                      has_slots_interface* pnewslot) {
-    m_slot_duplicate(this, poldslot, pnewslot);
-  }
-};
-
-class _opaque_connection {
- private:
-  typedef void (*emit_t)(const _opaque_connection*);
-  template <typename FromT, typename ToT>
-  union union_caster {
-    FromT from;
-    ToT to;
-  };
-
-  emit_t pemit;
-  has_slots_interface* pdest;
-  // Pointers to member functions may be up to 16 bytes for virtual classes,
-  // so make sure we have enough space to store it.
-  unsigned char pmethod[16];
-
- public:
-  template <typename DestT, typename... Args>
-  _opaque_connection(DestT* pd, void (DestT::*pm)(Args...)) : pdest(pd) {
-    typedef void (DestT::*pm_t)(Args...);
-    static_assert(sizeof(pm_t) <= sizeof(pmethod),
-                  "Size of slot function pointer too large.");
-
-    std::memcpy(pmethod, &pm, sizeof(pm_t));
-
-    typedef void (*em_t)(const _opaque_connection* self, Args...);
-    union_caster<em_t, emit_t> caster2;
-    caster2.from = &_opaque_connection::emitter<DestT, Args...>;
-    pemit = caster2.to;
-  }
-
-  has_slots_interface* getdest() const { return pdest; }
-
-  _opaque_connection duplicate(has_slots_interface* newtarget) const {
-    _opaque_connection res = *this;
-    res.pdest = newtarget;
-    return res;
-  }
-
-  // Just calls the stored "emitter" function pointer stored at construction
-  // time.
-  template <typename... Args>
-  void emit(Args... args) const {
-    typedef void (*em_t)(const _opaque_connection*, Args...);
-    union_caster<emit_t, em_t> caster;
-    caster.from = pemit;
-    (caster.to)(this, args...);
-  }
-
- private:
-  template <typename DestT, typename... Args>
-  static void emitter(const _opaque_connection* self, Args... args) {
-    typedef void (DestT::*pm_t)(Args...);
-    pm_t pm;
-    std::memcpy(&pm, self->pmethod, sizeof(pm_t));
-    (static_cast<DestT*>(self->pdest)->*(pm))(args...);
-  }
-};
-
-template <class mt_policy>
-class _signal_base : public _signal_base_interface, public mt_policy {
- protected:
-  typedef std::list<_opaque_connection> connections_list;
-
-  _signal_base()
-      : _signal_base_interface(&_signal_base::do_slot_disconnect,
-                               &_signal_base::do_slot_duplicate),
-        m_current_iterator(m_connected_slots.end()) {}
-
-  ~_signal_base() { disconnect_all(); }
-
- private:
-  _signal_base& operator=(_signal_base const& that);
-
- public:
-  _signal_base(const _signal_base& o)
-      : _signal_base_interface(&_signal_base::do_slot_disconnect,
-                               &_signal_base::do_slot_duplicate),
-        m_current_iterator(m_connected_slots.end()) {
-    lock_block<mt_policy> lock(this);
-    for (const auto& connection : o.m_connected_slots) {
-      connection.getdest()->signal_connect(this);
-      m_connected_slots.push_back(connection);
-    }
-  }
-
-  bool is_empty() {
-    lock_block<mt_policy> lock(this);
-    return m_connected_slots.empty();
-  }
-
-  void disconnect_all() {
-    lock_block<mt_policy> lock(this);
-
-    while (!m_connected_slots.empty()) {
-      has_slots_interface* pdest = m_connected_slots.front().getdest();
-      m_connected_slots.pop_front();
-      pdest->signal_disconnect(static_cast<_signal_base_interface*>(this));
-    }
-    // If disconnect_all is called while the signal is firing, advance the
-    // current slot iterator to the end to avoid an invalidated iterator from
-    // being dereferenced.
-    m_current_iterator = m_connected_slots.end();
-  }
-
-#if !defined(NDEBUG)
-  bool connected(has_slots_interface* pclass) {
-    lock_block<mt_policy> lock(this);
-    connections_list::const_iterator it = m_connected_slots.begin();
-    connections_list::const_iterator itEnd = m_connected_slots.end();
-    while (it != itEnd) {
-      if (it->getdest() == pclass)
-        return true;
-      ++it;
-    }
-    return false;
-  }
-#endif
-
-  void disconnect(has_slots_interface* pclass) {
-    lock_block<mt_policy> lock(this);
-    connections_list::iterator it = m_connected_slots.begin();
-    connections_list::iterator itEnd = m_connected_slots.end();
-
-    while (it != itEnd) {
-      if (it->getdest() == pclass) {
-        // If we're currently using this iterator because the signal is firing,
-        // advance it to avoid it being invalidated.
-        if (m_current_iterator == it) {
-          m_current_iterator = m_connected_slots.erase(it);
-        } else {
-          m_connected_slots.erase(it);
-        }
-        pclass->signal_disconnect(static_cast<_signal_base_interface*>(this));
-        return;
-      }
-      ++it;
-    }
-  }
-
- private:
-  static void do_slot_disconnect(_signal_base_interface* p,
-                                 has_slots_interface* pslot) {
-    _signal_base* const self = static_cast<_signal_base*>(p);
-    lock_block<mt_policy> lock(self);
-    connections_list::iterator it = self->m_connected_slots.begin();
-    connections_list::iterator itEnd = self->m_connected_slots.end();
-
-    while (it != itEnd) {
-      connections_list::iterator itNext = it;
-      ++itNext;
-
-      if (it->getdest() == pslot) {
-        // If we're currently using this iterator because the signal is firing,
-        // advance it to avoid it being invalidated.
-        if (self->m_current_iterator == it) {
-          self->m_current_iterator = self->m_connected_slots.erase(it);
-        } else {
-          self->m_connected_slots.erase(it);
-        }
-      }
-
-      it = itNext;
-    }
-  }
-
-  static void do_slot_duplicate(_signal_base_interface* p,
-                                const has_slots_interface* oldtarget,
-                                has_slots_interface* newtarget) {
-    _signal_base* const self = static_cast<_signal_base*>(p);
-    lock_block<mt_policy> lock(self);
-    connections_list::iterator it = self->m_connected_slots.begin();
-    connections_list::iterator itEnd = self->m_connected_slots.end();
-
-    while (it != itEnd) {
-      if (it->getdest() == oldtarget) {
-        self->m_connected_slots.push_back(it->duplicate(newtarget));
-      }
-
-      ++it;
-    }
-  }
-
- protected:
-  connections_list m_connected_slots;
-
-  // Used to handle a slot being disconnected while a signal is
-  // firing (iterating m_connected_slots).
-  connections_list::iterator m_current_iterator;
-  bool m_erase_current_iterator = false;
-};
-
-template <class mt_policy = SIGSLOT_DEFAULT_MT_POLICY>
-class has_slots : public has_slots_interface, public mt_policy {
- private:
-  typedef std::set<_signal_base_interface*> sender_set;
-  typedef sender_set::const_iterator const_iterator;
-
- public:
-  has_slots()
-      : has_slots_interface(&has_slots::do_signal_connect,
-                            &has_slots::do_signal_disconnect,
-                            &has_slots::do_disconnect_all) {}
-
-  has_slots(has_slots const& o)
-      : has_slots_interface(&has_slots::do_signal_connect,
-                            &has_slots::do_signal_disconnect,
-                            &has_slots::do_disconnect_all) {
-    lock_block<mt_policy> lock(this);
-    for (auto* sender : o.m_senders) {
-      sender->slot_duplicate(&o, this);
-      m_senders.insert(sender);
-    }
-  }
-
-  ~has_slots() { this->disconnect_all(); }
-
- private:
-  has_slots& operator=(has_slots const&);
-
-  static void do_signal_connect(has_slots_interface* p,
-                                _signal_base_interface* sender) {
-    has_slots* const self = static_cast<has_slots*>(p);
-    lock_block<mt_policy> lock(self);
-    self->m_senders.insert(sender);
-  }
-
-  static void do_signal_disconnect(has_slots_interface* p,
-                                   _signal_base_interface* sender) {
-    has_slots* const self = static_cast<has_slots*>(p);
-    lock_block<mt_policy> lock(self);
-    self->m_senders.erase(sender);
-  }
-
-  static void do_disconnect_all(has_slots_interface* p) {
-    has_slots* const self = static_cast<has_slots*>(p);
-    lock_block<mt_policy> lock(self);
-    while (!self->m_senders.empty()) {
-      std::set<_signal_base_interface*> senders;
-      senders.swap(self->m_senders);
-      const_iterator it = senders.begin();
-      const_iterator itEnd = senders.end();
-
-      while (it != itEnd) {
-        _signal_base_interface* s = *it;
-        ++it;
-        s->slot_disconnect(p);
-      }
-    }
-  }
-
- private:
-  sender_set m_senders;
-};
-
-template <class mt_policy, typename... Args>
-class signal_with_thread_policy : public _signal_base<mt_policy> {
- private:
-  typedef _signal_base<mt_policy> base;
-
- protected:
-  typedef typename base::connections_list connections_list;
-
- public:
-  signal_with_thread_policy() {}
-
-  template <class desttype>
-  void connect(desttype* pclass, void (desttype::*pmemfun)(Args...)) {
-    lock_block<mt_policy> lock(this);
-    this->m_connected_slots.push_back(_opaque_connection(pclass, pmemfun));
-    pclass->signal_connect(static_cast<_signal_base_interface*>(this));
-  }
-
-  void emit(Args... args) {
-    lock_block<mt_policy> lock(this);
-    this->m_current_iterator = this->m_connected_slots.begin();
-    while (this->m_current_iterator != this->m_connected_slots.end()) {
-      _opaque_connection const& conn = *this->m_current_iterator;
-      ++(this->m_current_iterator);
-      conn.emit<Args...>(args...);
-    }
-  }
-
-  void operator()(Args... args) { emit(args...); }
-};
-
-// Alias with default thread policy. Needed because both default arguments
-// and variadic template arguments must go at the end of the list, so we
-// can't have both at once.
-template <typename... Args>
-using signal = signal_with_thread_policy<SIGSLOT_DEFAULT_MT_POLICY, Args...>;
-
-// The previous verion of sigslot didn't use variadic templates, so you would
-// need to write "sigslot::signal2<Arg1, Arg2>", for example.
-// Now you can just write "sigslot::signal<Arg1, Arg2>", but these aliases
-// exist for backwards compatibility.
-template <typename mt_policy = SIGSLOT_DEFAULT_MT_POLICY>
-using signal0 = signal_with_thread_policy<mt_policy>;
-
-template <typename A1, typename mt_policy = SIGSLOT_DEFAULT_MT_POLICY>
-using signal1 = signal_with_thread_policy<mt_policy, A1>;
-
-template <typename A1,
-          typename A2,
-          typename mt_policy = SIGSLOT_DEFAULT_MT_POLICY>
-using signal2 = signal_with_thread_policy<mt_policy, A1, A2>;
-
-template <typename A1,
-          typename A2,
-          typename A3,
-          typename mt_policy = SIGSLOT_DEFAULT_MT_POLICY>
-using signal3 = signal_with_thread_policy<mt_policy, A1, A2, A3>;
-
-template <typename A1,
-          typename A2,
-          typename A3,
-          typename A4,
-          typename mt_policy = SIGSLOT_DEFAULT_MT_POLICY>
-using signal4 = signal_with_thread_policy<mt_policy, A1, A2, A3, A4>;
-
-template <typename A1,
-          typename A2,
-          typename A3,
-          typename A4,
-          typename A5,
-          typename mt_policy = SIGSLOT_DEFAULT_MT_POLICY>
-using signal5 = signal_with_thread_policy<mt_policy, A1, A2, A3, A4, A5>;
-
-template <typename A1,
-          typename A2,
-          typename A3,
-          typename A4,
-          typename A5,
-          typename A6,
-          typename mt_policy = SIGSLOT_DEFAULT_MT_POLICY>
-using signal6 = signal_with_thread_policy<mt_policy, A1, A2, A3, A4, A5, A6>;
-
-template <typename A1,
-          typename A2,
-          typename A3,
-          typename A4,
-          typename A5,
-          typename A6,
-          typename A7,
-          typename mt_policy = SIGSLOT_DEFAULT_MT_POLICY>
-using signal7 =
-    signal_with_thread_policy<mt_policy, A1, A2, A3, A4, A5, A6, A7>;
-
-template <typename A1,
-          typename A2,
-          typename A3,
-          typename A4,
-          typename A5,
-          typename A6,
-          typename A7,
-          typename A8,
-          typename mt_policy = SIGSLOT_DEFAULT_MT_POLICY>
-using signal8 =
-    signal_with_thread_policy<mt_policy, A1, A2, A3, A4, A5, A6, A7, A8>;
-
-}  // namespace sigslot
-
-#endif  // WEBRTC_RTC_BASE_SIGSLOT_H_
diff --git a/rtc_base/sigslot_unittest.cc b/rtc_base/sigslot_unittest.cc
deleted file mode 100644
index d538b0f..0000000
--- a/rtc_base/sigslot_unittest.cc
+++ /dev/null
@@ -1,357 +0,0 @@
-/*
- *  Copyright 2012 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/rtc_base/sigslot.h"
-
-#include "webrtc/rtc_base/gunit.h"
-
-// This function, when passed a has_slots or signalx, will break the build if
-// its threading requirement is not single threaded
-static bool TemplateIsST(const sigslot::single_threaded* p) {
-  return true;
-}
-// This function, when passed a has_slots or signalx, will break the build if
-// its threading requirement is not multi threaded
-static bool TemplateIsMT(const sigslot::multi_threaded_local* p) {
-  return true;
-}
-
-class SigslotDefault : public testing::Test, public sigslot::has_slots<> {
- protected:
-  sigslot::signal0<> signal_;
-};
-
-template<class slot_policy = sigslot::single_threaded,
-         class signal_policy = sigslot::single_threaded>
-class SigslotReceiver : public sigslot::has_slots<slot_policy> {
- public:
-  SigslotReceiver() : signal_(nullptr), signal_count_(0) {}
-  ~SigslotReceiver() {
-  }
-
-  // Provide copy constructor so that tests can exercise the has_slots copy
-  // constructor.
-  SigslotReceiver(const SigslotReceiver&) = default;
-
-  void Connect(sigslot::signal0<signal_policy>* signal) {
-    if (!signal) return;
-    Disconnect();
-    signal_ = signal;
-    signal->connect(this,
-                    &SigslotReceiver<slot_policy, signal_policy>::OnSignal);
-  }
-  void Disconnect() {
-    if (!signal_) return;
-    signal_->disconnect(this);
-    signal_ = nullptr;
-  }
-  void OnSignal() {
-    ++signal_count_;
-  }
-  int signal_count() { return signal_count_; }
-
- private:
-  sigslot::signal0<signal_policy>* signal_;
-  int signal_count_;
-};
-
-template<class slot_policy = sigslot::single_threaded,
-         class mt_signal_policy = sigslot::multi_threaded_local>
-class SigslotSlotTest : public testing::Test {
- protected:
-  SigslotSlotTest() {
-    mt_signal_policy mt_policy;
-    TemplateIsMT(&mt_policy);
-  }
-
-  virtual void SetUp() {
-    Connect();
-  }
-  virtual void TearDown() {
-    Disconnect();
-  }
-
-  void Disconnect() {
-    st_receiver_.Disconnect();
-    mt_receiver_.Disconnect();
-  }
-
-  void Connect() {
-    st_receiver_.Connect(&SignalSTLoopback);
-    mt_receiver_.Connect(&SignalMTLoopback);
-  }
-
-  int st_loop_back_count() { return st_receiver_.signal_count(); }
-  int mt_loop_back_count() { return mt_receiver_.signal_count(); }
-
-  sigslot::signal0<> SignalSTLoopback;
-  SigslotReceiver<slot_policy, sigslot::single_threaded> st_receiver_;
-  sigslot::signal0<mt_signal_policy> SignalMTLoopback;
-  SigslotReceiver<slot_policy, mt_signal_policy> mt_receiver_;
-};
-
-typedef SigslotSlotTest<> SigslotSTSlotTest;
-typedef SigslotSlotTest<sigslot::multi_threaded_local,
-                        sigslot::multi_threaded_local> SigslotMTSlotTest;
-
-class multi_threaded_local_fake : public sigslot::multi_threaded_local {
- public:
-  multi_threaded_local_fake() : lock_count_(0), unlock_count_(0) {
-  }
-
-  void lock() { ++lock_count_; }
-  void unlock() { ++unlock_count_; }
-
-  int lock_count() { return lock_count_; }
-
-  bool InCriticalSection() { return lock_count_ != unlock_count_; }
-
- protected:
-  int lock_count_;
-  int unlock_count_;
-};
-
-typedef SigslotSlotTest<multi_threaded_local_fake,
-                        multi_threaded_local_fake> SigslotMTLockBase;
-
-class SigslotMTLockTest : public SigslotMTLockBase {
- protected:
-  SigslotMTLockTest() {}
-
-  virtual void SetUp() {
-    EXPECT_EQ(0, SlotLockCount());
-    SigslotMTLockBase::SetUp();
-    // Connects to two signals (ST and MT). However,
-    // SlotLockCount() only gets the count for the
-    // MT signal (there are two separate SigslotReceiver which
-    // keep track of their own count).
-    EXPECT_EQ(1, SlotLockCount());
-  }
-  virtual void TearDown() {
-    const int previous_lock_count = SlotLockCount();
-    SigslotMTLockBase::TearDown();
-    // Disconnects from two signals. Note analogous to SetUp().
-    EXPECT_EQ(previous_lock_count + 1, SlotLockCount());
-  }
-
-  int SlotLockCount() { return mt_receiver_.lock_count(); }
-  void Signal() { SignalMTLoopback(); }
-  int SignalLockCount() { return SignalMTLoopback.lock_count(); }
-  int signal_count() { return mt_loop_back_count(); }
-  bool InCriticalSection() { return SignalMTLoopback.InCriticalSection(); }
-};
-
-// This test will always succeed. However, if the default template instantiation
-// changes from single threaded to multi threaded it will break the build here.
-TEST_F(SigslotDefault, DefaultIsST) {
-  EXPECT_TRUE(TemplateIsST(this));
-  EXPECT_TRUE(TemplateIsST(&signal_));
-}
-
-// ST slot, ST signal
-TEST_F(SigslotSTSlotTest, STLoopbackTest) {
-  SignalSTLoopback();
-  EXPECT_EQ(1, st_loop_back_count());
-  EXPECT_EQ(0, mt_loop_back_count());
-}
-
-// ST slot, MT signal
-TEST_F(SigslotSTSlotTest, MTLoopbackTest) {
-  SignalMTLoopback();
-  EXPECT_EQ(1, mt_loop_back_count());
-  EXPECT_EQ(0, st_loop_back_count());
-}
-
-// ST slot, both ST and MT (separate) signal
-TEST_F(SigslotSTSlotTest, AllLoopbackTest) {
-  SignalSTLoopback();
-  SignalMTLoopback();
-  EXPECT_EQ(1, mt_loop_back_count());
-  EXPECT_EQ(1, st_loop_back_count());
-}
-
-TEST_F(SigslotSTSlotTest, Reconnect) {
-  SignalSTLoopback();
-  SignalMTLoopback();
-  EXPECT_EQ(1, mt_loop_back_count());
-  EXPECT_EQ(1, st_loop_back_count());
-  Disconnect();
-  SignalSTLoopback();
-  SignalMTLoopback();
-  EXPECT_EQ(1, mt_loop_back_count());
-  EXPECT_EQ(1, st_loop_back_count());
-  Connect();
-  SignalSTLoopback();
-  SignalMTLoopback();
-  EXPECT_EQ(2, mt_loop_back_count());
-  EXPECT_EQ(2, st_loop_back_count());
-}
-
-// MT slot, ST signal
-TEST_F(SigslotMTSlotTest, STLoopbackTest) {
-  SignalSTLoopback();
-  EXPECT_EQ(1, st_loop_back_count());
-  EXPECT_EQ(0, mt_loop_back_count());
-}
-
-// MT slot, MT signal
-TEST_F(SigslotMTSlotTest, MTLoopbackTest) {
-  SignalMTLoopback();
-  EXPECT_EQ(1, mt_loop_back_count());
-  EXPECT_EQ(0, st_loop_back_count());
-}
-
-// MT slot, both ST and MT (separate) signal
-TEST_F(SigslotMTSlotTest, AllLoopbackTest) {
-  SignalMTLoopback();
-  SignalSTLoopback();
-  EXPECT_EQ(1, st_loop_back_count());
-  EXPECT_EQ(1, mt_loop_back_count());
-}
-
-// Test that locks are acquired and released correctly.
-TEST_F(SigslotMTLockTest, LockSanity) {
-  const int lock_count = SignalLockCount();
-  Signal();
-  EXPECT_FALSE(InCriticalSection());
-  EXPECT_EQ(lock_count + 1, SignalLockCount());
-  EXPECT_EQ(1, signal_count());
-}
-
-// Destroy signal and slot in different orders.
-TEST(SigslotDestructionOrder, SignalFirst) {
-  sigslot::signal0<>* signal = new sigslot::signal0<>;
-  SigslotReceiver<>* receiver = new SigslotReceiver<>();
-  receiver->Connect(signal);
-  (*signal)();
-  EXPECT_EQ(1, receiver->signal_count());
-  delete signal;
-  delete receiver;
-}
-
-TEST(SigslotDestructionOrder, SlotFirst) {
-  sigslot::signal0<>* signal = new sigslot::signal0<>;
-  SigslotReceiver<>* receiver = new SigslotReceiver<>();
-  receiver->Connect(signal);
-  (*signal)();
-  EXPECT_EQ(1, receiver->signal_count());
-
-  delete receiver;
-  (*signal)();
-  delete signal;
-}
-
-// Test that if a signal is copied, its slot connections are copied as well.
-TEST(SigslotTest, CopyConnectedSignal) {
-  sigslot::signal<> signal;
-  SigslotReceiver<> receiver;
-  receiver.Connect(&signal);
-
-  // Fire the copied signal, expecting the receiver to be notified.
-  sigslot::signal<> copied_signal(signal);
-  copied_signal();
-  EXPECT_EQ(1, receiver.signal_count());
-}
-
-// Test that if a slot is copied, its signal connections are copied as well.
-TEST(SigslotTest, CopyConnectedSlot) {
-  sigslot::signal<> signal;
-  SigslotReceiver<> receiver;
-  receiver.Connect(&signal);
-
-  // Fire the signal after copying the receiver, expecting the copied receiver
-  // to be notified.
-  SigslotReceiver<> copied_receiver(receiver);
-  signal();
-  EXPECT_EQ(1, copied_receiver.signal_count());
-}
-
-// Just used for the test below.
-class Disconnector : public sigslot::has_slots<> {
- public:
-  Disconnector(SigslotReceiver<>* receiver1, SigslotReceiver<>* receiver2)
-      : receiver1_(receiver1), receiver2_(receiver2) {}
-
-  void Connect(sigslot::signal<>* signal) {
-    signal_ = signal;
-    signal->connect(this, &Disconnector::Disconnect);
-  }
-
- private:
-  void Disconnect() {
-    receiver1_->Disconnect();
-    receiver2_->Disconnect();
-    signal_->disconnect(this);
-  }
-
-  sigslot::signal<>* signal_;
-  SigslotReceiver<>* receiver1_;
-  SigslotReceiver<>* receiver2_;
-};
-
-// Test that things work as expected if a signal is disconnected from a slot
-// while it's firing.
-TEST(SigslotTest, DisconnectFromSignalWhileFiring) {
-  sigslot::signal<> signal;
-  SigslotReceiver<> receiver1;
-  SigslotReceiver<> receiver2;
-  SigslotReceiver<> receiver3;
-  Disconnector disconnector(&receiver1, &receiver2);
-
-  // From this ordering, receiver1 should receive the signal, then the
-  // disconnector will be invoked, causing receiver2 to be disconnected before
-  // it receives the signal. And receiver3 should also receive the signal,
-  // since it was never disconnected.
-  receiver1.Connect(&signal);
-  disconnector.Connect(&signal);
-  receiver2.Connect(&signal);
-  receiver3.Connect(&signal);
-  signal();
-
-  EXPECT_EQ(1, receiver1.signal_count());
-  EXPECT_EQ(0, receiver2.signal_count());
-  EXPECT_EQ(1, receiver3.signal_count());
-}
-
-// Uses disconnect_all instead of disconnect.
-class Disconnector2 : public sigslot::has_slots<> {
- public:
-  void Connect(sigslot::signal<>* signal) {
-    signal_ = signal;
-    signal->connect(this, &Disconnector2::Disconnect);
-  }
-
- private:
-  void Disconnect() {
-    signal_->disconnect_all();
-  }
-
-  sigslot::signal<>* signal_;
-};
-
-// Test that things work as expected if a signal is disconnected from a slot
-// while it's firing using disconnect_all.
-TEST(SigslotTest, CallDisconnectAllWhileSignalFiring) {
-  sigslot::signal<> signal;
-  SigslotReceiver<> receiver1;
-  SigslotReceiver<> receiver2;
-  Disconnector2 disconnector;
-
-  // From this ordering, receiver1 should receive the signal, then the
-  // disconnector will be invoked, causing receiver2 to be disconnected before
-  // it receives the signal.
-  receiver1.Connect(&signal);
-  disconnector.Connect(&signal);
-  receiver2.Connect(&signal);
-  signal();
-
-  EXPECT_EQ(1, receiver1.signal_count());
-  EXPECT_EQ(0, receiver2.signal_count());
-}
diff --git a/rtc_base/sigslottester.h b/rtc_base/sigslottester.h
deleted file mode 100755
index ed6dadc..0000000
--- a/rtc_base/sigslottester.h
+++ /dev/null
@@ -1,216 +0,0 @@
-// This file was GENERATED by command:
-//     pump.py sigslottester.h.pump
-// DO NOT EDIT BY HAND!!!
-
-/*
- *  Copyright 2014 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_RTC_BASE_SIGSLOTTESTER_H_
-#define WEBRTC_RTC_BASE_SIGSLOTTESTER_H_
-
-// To generate sigslottester.h from sigslottester.h.pump, execute:
-// /home/build/google3/third_party/gtest/scripts/pump.py sigslottester.h.pump
-
-
-// SigslotTester(s) are utility classes to check if signals owned by an
-// object are being invoked at the right time and with the right arguments.
-// They are meant to be used in tests. Tests must provide "capture" pointers
-// (i.e. address of variables) where the arguments from the signal callback
-// can be stored.
-//
-// Example:
-//   /* Some signal */
-//   sigslot::signal1<const std::string&> foo;
-//
-//   /* We want to monitor foo in some test. Note how signal argument is
-//      const std::string&, but capture-type is std::string. Capture type
-//      must be type that can be assigned to. */
-//   std::string capture;
-//   SigslotTester1<const std::string&, std::string> slot(&foo, &capture);
-//   foo.emit("hello");
-//   EXPECT_EQ(1, slot.callback_count());
-//   EXPECT_EQ("hello", capture);
-//   /* See unit-tests for more examples */
-
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/sigslot.h"
-
-namespace rtc {
-
-// Base version for testing signals that passes no arguments.
-class SigslotTester0 : public sigslot::has_slots<> {
- public:
-  explicit SigslotTester0(sigslot::signal0<>* signal) : callback_count_(0) {
-    signal->connect(this, &SigslotTester0::OnSignalCallback);
-  }
-
-  int callback_count() const { return callback_count_; }
-
- private:
-  void OnSignalCallback() { callback_count_++; }
-  int callback_count_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(SigslotTester0);
-};
-
-// Versions below are for testing signals that pass arguments. For all the
-// templates below:
-// - A1-A5 is the type of the argument i in the callback. Signals may and often
-//   do use const-references here for efficiency.
-// - C1-C5 is the type of the variable to capture argument i. These should be
-//   non-const value types suitable for use as lvalues.
-
-template <class A1, class C1>
-class SigslotTester1 : public sigslot::has_slots<> {
- public:
-  SigslotTester1(sigslot::signal1<A1>* signal,
-                C1* capture1)
-      : callback_count_(0),
-      capture1_(capture1) {
-    signal->connect(this, &SigslotTester1::OnSignalCallback);
-  }
-
-  int callback_count() const { return callback_count_; }
-
- private:
-  void OnSignalCallback(A1 arg1) {
-    callback_count_++;
-    *capture1_ = arg1;
-  }
-
-  int callback_count_;
-  C1* capture1_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(SigslotTester1);
-};
-
-template <class A1, class A2, class C1, class C2>
-class SigslotTester2 : public sigslot::has_slots<> {
- public:
-  SigslotTester2(sigslot::signal2<A1, A2>* signal,
-                C1* capture1, C2* capture2)
-      : callback_count_(0),
-      capture1_(capture1), capture2_(capture2) {
-    signal->connect(this, &SigslotTester2::OnSignalCallback);
-  }
-
-  int callback_count() const { return callback_count_; }
-
- private:
-  void OnSignalCallback(A1 arg1, A2 arg2) {
-    callback_count_++;
-    *capture1_ = arg1;
-    *capture2_ = arg2;
-  }
-
-  int callback_count_;
-  C1* capture1_;
-  C2* capture2_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(SigslotTester2);
-};
-
-template <class A1, class A2, class A3, class C1, class C2, class C3>
-class SigslotTester3 : public sigslot::has_slots<> {
- public:
-  SigslotTester3(sigslot::signal3<A1, A2, A3>* signal,
-                C1* capture1, C2* capture2, C3* capture3)
-      : callback_count_(0),
-      capture1_(capture1), capture2_(capture2), capture3_(capture3) {
-    signal->connect(this, &SigslotTester3::OnSignalCallback);
-  }
-
-  int callback_count() const { return callback_count_; }
-
- private:
-  void OnSignalCallback(A1 arg1, A2 arg2, A3 arg3) {
-    callback_count_++;
-    *capture1_ = arg1;
-    *capture2_ = arg2;
-    *capture3_ = arg3;
-  }
-
-  int callback_count_;
-  C1* capture1_;
-  C2* capture2_;
-  C3* capture3_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(SigslotTester3);
-};
-
-template <class A1, class A2, class A3, class A4, class C1, class C2, class C3,
-    class C4>
-class SigslotTester4 : public sigslot::has_slots<> {
- public:
-  SigslotTester4(sigslot::signal4<A1, A2, A3, A4>* signal,
-                C1* capture1, C2* capture2, C3* capture3, C4* capture4)
-      : callback_count_(0),
-      capture1_(capture1), capture2_(capture2), capture3_(capture3),
-          capture4_(capture4) {
-    signal->connect(this, &SigslotTester4::OnSignalCallback);
-  }
-
-  int callback_count() const { return callback_count_; }
-
- private:
-  void OnSignalCallback(A1 arg1, A2 arg2, A3 arg3, A4 arg4) {
-    callback_count_++;
-    *capture1_ = arg1;
-    *capture2_ = arg2;
-    *capture3_ = arg3;
-    *capture4_ = arg4;
-  }
-
-  int callback_count_;
-  C1* capture1_;
-  C2* capture2_;
-  C3* capture3_;
-  C4* capture4_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(SigslotTester4);
-};
-
-template <class A1, class A2, class A3, class A4, class A5, class C1, class C2,
-    class C3, class C4, class C5>
-class SigslotTester5 : public sigslot::has_slots<> {
- public:
-  SigslotTester5(sigslot::signal5<A1, A2, A3, A4, A5>* signal,
-                C1* capture1, C2* capture2, C3* capture3, C4* capture4,
-                    C5* capture5)
-      : callback_count_(0),
-      capture1_(capture1), capture2_(capture2), capture3_(capture3),
-          capture4_(capture4), capture5_(capture5) {
-    signal->connect(this, &SigslotTester5::OnSignalCallback);
-  }
-
-  int callback_count() const { return callback_count_; }
-
- private:
-  void OnSignalCallback(A1 arg1, A2 arg2, A3 arg3, A4 arg4, A5 arg5) {
-    callback_count_++;
-    *capture1_ = arg1;
-    *capture2_ = arg2;
-    *capture3_ = arg3;
-    *capture4_ = arg4;
-    *capture5_ = arg5;
-  }
-
-  int callback_count_;
-  C1* capture1_;
-  C2* capture2_;
-  C3* capture3_;
-  C4* capture4_;
-  C5* capture5_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(SigslotTester5);
-};
-}  // namespace rtc
-
-#endif  // WEBRTC_RTC_BASE_SIGSLOTTESTER_H_
diff --git a/rtc_base/sigslottester.h.pump b/rtc_base/sigslottester.h.pump
deleted file mode 100755
index 381b791..0000000
--- a/rtc_base/sigslottester.h.pump
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- *  Copyright 2014 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_RTC_BASE_SIGSLOTTESTER_H_
-#define WEBRTC_RTC_BASE_SIGSLOTTESTER_H_
-
-// To generate sigslottester.h from sigslottester.h.pump, execute:
-// /home/build/google3/third_party/gtest/scripts/pump.py sigslottester.h.pump
-
-
-// SigslotTester(s) are utility classes to check if signals owned by an
-// object are being invoked at the right time and with the right arguments.
-// They are meant to be used in tests. Tests must provide "capture" pointers
-// (i.e. address of variables) where the arguments from the signal callback
-// can be stored.
-//
-// Example:
-//   /* Some signal */
-//   sigslot::signal1<const std::string&> foo;
-//
-//   /* We want to monitor foo in some test. Note how signal argument is
-//      const std::string&, but capture-type is std::string. Capture type
-//      must be type that can be assigned to. */
-//   std::string capture;
-//   SigslotTester1<const std::string&, std::string> slot(&foo, &capture);
-//   foo.emit("hello");
-//   EXPECT_EQ(1, slot.callback_count());
-//   EXPECT_EQ("hello", capture);
-//   /* See unit-tests for more examples */
-
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/sigslot.h"
-
-namespace rtc {
-
-// Base version for testing signals that passes no arguments.
-class SigslotTester0 : public sigslot::has_slots<> {
- public:
-  explicit SigslotTester0(sigslot::signal0<>* signal) : callback_count_(0) {
-    signal->connect(this, &SigslotTester0::OnSignalCallback);
-  }
-
-  int callback_count() const { return callback_count_; }
-
- private:
-  void OnSignalCallback() { callback_count_++; }
-  int callback_count_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(SigslotTester0);
-};
-
-// Versions below are for testing signals that pass arguments. For all the
-// templates below:
-// - A1-A5 is the type of the argument i in the callback. Signals may and often
-//   do use const-references here for efficiency.
-// - C1-C5 is the type of the variable to capture argument i. These should be
-//   non-const value types suitable for use as lvalues.
-
-$var n = 5
-$range i 1..n
-$for i [[
-$range j 1..i
-
-template <$for j , [[class A$j]], $for j , [[class C$j]]>
-class SigslotTester$i : public sigslot::has_slots<> {
- public:
-  SigslotTester$i(sigslot::signal$i<$for j , [[A$j]]>* signal,
-                $for j , [[C$j* capture$j]])
-      : callback_count_(0),
-      $for j , [[capture$j[[]]_(capture$j)]] {
-    signal->connect(this, &SigslotTester$i::OnSignalCallback);
-  }
-
-  int callback_count() const { return callback_count_; }
-
- private:
-  void OnSignalCallback($for j , [[A$j arg$j]]) {
-    callback_count_++;$for j [[
-
-    *capture$j[[]]_ = arg$j;]]
-
-  }
-
-  int callback_count_;$for j [[
-
-  C$j* capture$j[[]]_;]]
-
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(SigslotTester$i);
-};
-
-]]
-}  // namespace rtc
-
-#endif  // WEBRTC_RTC_BASE_SIGSLOTTESTER_H_
diff --git a/rtc_base/sigslottester_unittest.cc b/rtc_base/sigslottester_unittest.cc
deleted file mode 100755
index e0861d7..0000000
--- a/rtc_base/sigslottester_unittest.cc
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- *  Copyright 2014 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/rtc_base/sigslottester.h"
-
-#include <string>
-
-#include "webrtc/rtc_base/gunit.h"
-#include "webrtc/rtc_base/sigslot.h"
-
-namespace rtc {
-
-TEST(SigslotTester, TestSignal1Arg) {
-  sigslot::signal1<int> source1;
-  int capture1;
-  SigslotTester1<int, int> slot1(&source1, &capture1);
-  EXPECT_EQ(0, slot1.callback_count());
-
-  source1.emit(10);
-  EXPECT_EQ(1, slot1.callback_count());
-  EXPECT_EQ(10, capture1);
-
-  source1.emit(20);
-  EXPECT_EQ(2, slot1.callback_count());
-  EXPECT_EQ(20, capture1);
-}
-
-TEST(SigslotTester, TestSignal2Args) {
-  sigslot::signal2<int, char> source2;
-  int capture1;
-  char capture2;
-  SigslotTester2<int, char, int, char> slot2(&source2, &capture1, &capture2);
-  EXPECT_EQ(0, slot2.callback_count());
-
-  source2.emit(10, 'x');
-  EXPECT_EQ(1, slot2.callback_count());
-  EXPECT_EQ(10, capture1);
-  EXPECT_EQ('x', capture2);
-
-  source2.emit(20, 'y');
-  EXPECT_EQ(2, slot2.callback_count());
-  EXPECT_EQ(20, capture1);
-  EXPECT_EQ('y', capture2);
-}
-
-// Since it applies for 1 and 2 args, we assume it will work for up to 5 args.
-
-TEST(SigslotTester, TestSignalWithConstReferenceArgs) {
-  sigslot::signal1<const std::string&> source1;
-  std::string capture1;
-  SigslotTester1<const std::string&, std::string> slot1(&source1, &capture1);
-  EXPECT_EQ(0, slot1.callback_count());
-  source1.emit("hello");
-  EXPECT_EQ(1, slot1.callback_count());
-  EXPECT_EQ("hello", capture1);
-}
-
-TEST(SigslotTester, TestSignalWithPointerToConstArgs) {
-  sigslot::signal1<const std::string*> source1;
-  const std::string* capture1;
-  SigslotTester1<const std::string*, const std::string*> slot1(&source1,
-                                                               &capture1);
-  EXPECT_EQ(0, slot1.callback_count());
-  source1.emit(nullptr);
-  EXPECT_EQ(1, slot1.callback_count());
-  EXPECT_EQ(nullptr, capture1);
-}
-
-TEST(SigslotTester, TestSignalWithConstPointerArgs) {
-  sigslot::signal1<std::string* const> source1;
-  std::string* capture1;
-  SigslotTester1<std::string* const, std::string*> slot1(&source1, &capture1);
-  EXPECT_EQ(0, slot1.callback_count());
-  source1.emit(nullptr);
-  EXPECT_EQ(1, slot1.callback_count());
-  EXPECT_EQ(nullptr, capture1);
-}
-
-}  // namespace rtc
diff --git a/rtc_base/socket.h b/rtc_base/socket.h
deleted file mode 100644
index 2b2161d..0000000
--- a/rtc_base/socket.h
+++ /dev/null
@@ -1,197 +0,0 @@
-/*
- *  Copyright 2004 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_RTC_BASE_SOCKET_H_
-#define WEBRTC_RTC_BASE_SOCKET_H_
-
-#include <errno.h>
-
-#if defined(WEBRTC_POSIX)
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <arpa/inet.h>
-#include <netinet/in.h>
-#define SOCKET_EACCES EACCES
-#endif
-
-#if defined(WEBRTC_WIN)
-#include "webrtc/rtc_base/win32.h"
-#endif
-
-#include "webrtc/rtc_base/basictypes.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/socketaddress.h"
-
-// Rather than converting errors into a private namespace,
-// Reuse the POSIX socket api errors. Note this depends on
-// Win32 compatibility.
-
-#if defined(WEBRTC_WIN)
-#undef EWOULDBLOCK  // Remove errno.h's definition for each macro below.
-#define EWOULDBLOCK WSAEWOULDBLOCK
-#undef EINPROGRESS
-#define EINPROGRESS WSAEINPROGRESS
-#undef EALREADY
-#define EALREADY WSAEALREADY
-#undef ENOTSOCK
-#define ENOTSOCK WSAENOTSOCK
-#undef EDESTADDRREQ
-#define EDESTADDRREQ WSAEDESTADDRREQ
-#undef EMSGSIZE
-#define EMSGSIZE WSAEMSGSIZE
-#undef EPROTOTYPE
-#define EPROTOTYPE WSAEPROTOTYPE
-#undef ENOPROTOOPT
-#define ENOPROTOOPT WSAENOPROTOOPT
-#undef EPROTONOSUPPORT
-#define EPROTONOSUPPORT WSAEPROTONOSUPPORT
-#undef ESOCKTNOSUPPORT
-#define ESOCKTNOSUPPORT WSAESOCKTNOSUPPORT
-#undef EOPNOTSUPP
-#define EOPNOTSUPP WSAEOPNOTSUPP
-#undef EPFNOSUPPORT
-#define EPFNOSUPPORT WSAEPFNOSUPPORT
-#undef EAFNOSUPPORT
-#define EAFNOSUPPORT WSAEAFNOSUPPORT
-#undef EADDRINUSE
-#define EADDRINUSE WSAEADDRINUSE
-#undef EADDRNOTAVAIL
-#define EADDRNOTAVAIL WSAEADDRNOTAVAIL
-#undef ENETDOWN
-#define ENETDOWN WSAENETDOWN
-#undef ENETUNREACH
-#define ENETUNREACH WSAENETUNREACH
-#undef ENETRESET
-#define ENETRESET WSAENETRESET
-#undef ECONNABORTED
-#define ECONNABORTED WSAECONNABORTED
-#undef ECONNRESET
-#define ECONNRESET WSAECONNRESET
-#undef ENOBUFS
-#define ENOBUFS WSAENOBUFS
-#undef EISCONN
-#define EISCONN WSAEISCONN
-#undef ENOTCONN
-#define ENOTCONN WSAENOTCONN
-#undef ESHUTDOWN
-#define ESHUTDOWN WSAESHUTDOWN
-#undef ETOOMANYREFS
-#define ETOOMANYREFS WSAETOOMANYREFS
-#undef ETIMEDOUT
-#define ETIMEDOUT WSAETIMEDOUT
-#undef ECONNREFUSED
-#define ECONNREFUSED WSAECONNREFUSED
-#undef ELOOP
-#define ELOOP WSAELOOP
-#undef ENAMETOOLONG
-#define ENAMETOOLONG WSAENAMETOOLONG
-#undef EHOSTDOWN
-#define EHOSTDOWN WSAEHOSTDOWN
-#undef EHOSTUNREACH
-#define EHOSTUNREACH WSAEHOSTUNREACH
-#undef ENOTEMPTY
-#define ENOTEMPTY WSAENOTEMPTY
-#undef EPROCLIM
-#define EPROCLIM WSAEPROCLIM
-#undef EUSERS
-#define EUSERS WSAEUSERS
-#undef EDQUOT
-#define EDQUOT WSAEDQUOT
-#undef ESTALE
-#define ESTALE WSAESTALE
-#undef EREMOTE
-#define EREMOTE WSAEREMOTE
-#undef EACCES
-#define SOCKET_EACCES WSAEACCES
-#endif  // WEBRTC_WIN
-
-#if defined(WEBRTC_POSIX)
-#define INVALID_SOCKET (-1)
-#define SOCKET_ERROR (-1)
-#define closesocket(s) close(s)
-#endif  // WEBRTC_POSIX
-
-namespace rtc {
-
-inline bool IsBlockingError(int e) {
-  return (e == EWOULDBLOCK) || (e == EAGAIN) || (e == EINPROGRESS);
-}
-
-struct SentPacket {
-  SentPacket() : packet_id(-1), send_time_ms(-1) {}
-  SentPacket(int packet_id, int64_t send_time_ms)
-      : packet_id(packet_id), send_time_ms(send_time_ms) {}
-
-  int packet_id;
-  int64_t send_time_ms;
-};
-
-// General interface for the socket implementations of various networks.  The
-// methods match those of normal UNIX sockets very closely.
-class Socket {
- public:
-  virtual ~Socket() {}
-
-  // Returns the address to which the socket is bound.  If the socket is not
-  // bound, then the any-address is returned.
-  virtual SocketAddress GetLocalAddress() const = 0;
-
-  // Returns the address to which the socket is connected.  If the socket is
-  // not connected, then the any-address is returned.
-  virtual SocketAddress GetRemoteAddress() const = 0;
-
-  virtual int Bind(const SocketAddress& addr) = 0;
-  virtual int Connect(const SocketAddress& addr) = 0;
-  virtual int Send(const void *pv, size_t cb) = 0;
-  virtual int SendTo(const void *pv, size_t cb, const SocketAddress& addr) = 0;
-  // |timestamp| is in units of microseconds.
-  virtual int Recv(void* pv, size_t cb, int64_t* timestamp) = 0;
-  virtual int RecvFrom(void* pv,
-                       size_t cb,
-                       SocketAddress* paddr,
-                       int64_t* timestamp) = 0;
-  virtual int Listen(int backlog) = 0;
-  virtual Socket *Accept(SocketAddress *paddr) = 0;
-  virtual int Close() = 0;
-  virtual int GetError() const = 0;
-  virtual void SetError(int error) = 0;
-  inline bool IsBlocking() const { return IsBlockingError(GetError()); }
-
-  enum ConnState {
-    CS_CLOSED,
-    CS_CONNECTING,
-    CS_CONNECTED
-  };
-  virtual ConnState GetState() const = 0;
-
-  enum Option {
-    OPT_DONTFRAGMENT,
-    OPT_RCVBUF,      // receive buffer size
-    OPT_SNDBUF,      // send buffer size
-    OPT_NODELAY,     // whether Nagle algorithm is enabled
-    OPT_IPV6_V6ONLY, // Whether the socket is IPv6 only.
-    OPT_DSCP,        // DSCP code
-    OPT_RTP_SENDTIME_EXTN_ID,  // This is a non-traditional socket option param.
-                               // This is specific to libjingle and will be used
-                               // if SendTime option is needed at socket level.
-  };
-  virtual int GetOption(Option opt, int* value) = 0;
-  virtual int SetOption(Option opt, int value) = 0;
-
- protected:
-  Socket() {}
-
- private:
-  RTC_DISALLOW_COPY_AND_ASSIGN(Socket);
-};
-
-}  // namespace rtc
-
-#endif  // WEBRTC_RTC_BASE_SOCKET_H_
diff --git a/rtc_base/socket_unittest.cc b/rtc_base/socket_unittest.cc
deleted file mode 100644
index 5ef0167..0000000
--- a/rtc_base/socket_unittest.cc
+++ /dev/null
@@ -1,1046 +0,0 @@
-/*
- *  Copyright 2007 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 <memory>
-
-#include "webrtc/rtc_base/socket_unittest.h"
-
-#include "webrtc/rtc_base/arraysize.h"
-#include "webrtc/rtc_base/asyncudpsocket.h"
-#include "webrtc/rtc_base/buffer.h"
-#include "webrtc/rtc_base/gunit.h"
-#include "webrtc/rtc_base/nethelpers.h"
-#include "webrtc/rtc_base/ptr_util.h"
-#include "webrtc/rtc_base/socketserver.h"
-#include "webrtc/rtc_base/testclient.h"
-#include "webrtc/rtc_base/testutils.h"
-#include "webrtc/rtc_base/thread.h"
-
-namespace rtc {
-
-using webrtc::testing::SSE_CLOSE;
-using webrtc::testing::SSE_ERROR;
-using webrtc::testing::SSE_OPEN;
-using webrtc::testing::SSE_READ;
-using webrtc::testing::SSE_WRITE;
-using webrtc::testing::StreamSink;
-
-#define MAYBE_SKIP_IPV6                             \
-  if (!HasIPv6Enabled()) {                          \
-    LOG(LS_INFO) << "No IPv6... skipping";          \
-    return;                                         \
-  }
-
-// Data size to be used in TcpInternal tests.
-static const size_t kTcpInternalDataSize = 1024 * 1024;  // bytes
-
-void SocketTest::TestConnectIPv4() {
-  ConnectInternal(kIPv4Loopback);
-}
-
-void SocketTest::TestConnectIPv6() {
-  MAYBE_SKIP_IPV6;
-  ConnectInternal(kIPv6Loopback);
-}
-
-void SocketTest::TestConnectWithDnsLookupIPv4() {
-  ConnectWithDnsLookupInternal(kIPv4Loopback, "localhost");
-}
-
-void SocketTest::TestConnectWithDnsLookupIPv6() {
-  // TODO: Enable this when DNS resolution supports IPv6.
-  LOG(LS_INFO) << "Skipping IPv6 DNS test";
-  // ConnectWithDnsLookupInternal(kIPv6Loopback, "localhost6");
-}
-
-void SocketTest::TestConnectFailIPv4() {
-  ConnectFailInternal(kIPv4Loopback);
-}
-
-void SocketTest::TestConnectFailIPv6() {
-  MAYBE_SKIP_IPV6;
-  ConnectFailInternal(kIPv6Loopback);
-}
-
-void SocketTest::TestConnectWithDnsLookupFailIPv4() {
-  ConnectWithDnsLookupFailInternal(kIPv4Loopback);
-}
-
-void SocketTest::TestConnectWithDnsLookupFailIPv6() {
-  MAYBE_SKIP_IPV6;
-  ConnectWithDnsLookupFailInternal(kIPv6Loopback);
-}
-
-void SocketTest::TestConnectWithClosedSocketIPv4() {
-  ConnectWithClosedSocketInternal(kIPv4Loopback);
-}
-
-void SocketTest::TestConnectWithClosedSocketIPv6() {
-  MAYBE_SKIP_IPV6;
-  ConnectWithClosedSocketInternal(kIPv6Loopback);
-}
-
-void SocketTest::TestConnectWhileNotClosedIPv4() {
-  ConnectWhileNotClosedInternal(kIPv4Loopback);
-}
-
-void SocketTest::TestConnectWhileNotClosedIPv6() {
-  MAYBE_SKIP_IPV6;
-  ConnectWhileNotClosedInternal(kIPv6Loopback);
-}
-
-void SocketTest::TestServerCloseDuringConnectIPv4() {
-  ServerCloseDuringConnectInternal(kIPv4Loopback);
-}
-
-void SocketTest::TestServerCloseDuringConnectIPv6() {
-  MAYBE_SKIP_IPV6;
-  ServerCloseDuringConnectInternal(kIPv6Loopback);
-}
-
-void SocketTest::TestClientCloseDuringConnectIPv4() {
-  ClientCloseDuringConnectInternal(kIPv4Loopback);
-}
-
-void SocketTest::TestClientCloseDuringConnectIPv6() {
-  MAYBE_SKIP_IPV6;
-  ClientCloseDuringConnectInternal(kIPv6Loopback);
-}
-
-void SocketTest::TestServerCloseIPv4() {
-  ServerCloseInternal(kIPv4Loopback);
-}
-
-void SocketTest::TestServerCloseIPv6() {
-  MAYBE_SKIP_IPV6;
-  ServerCloseInternal(kIPv6Loopback);
-}
-
-void SocketTest::TestCloseInClosedCallbackIPv4() {
-  CloseInClosedCallbackInternal(kIPv4Loopback);
-}
-
-void SocketTest::TestCloseInClosedCallbackIPv6() {
-  MAYBE_SKIP_IPV6;
-  CloseInClosedCallbackInternal(kIPv6Loopback);
-}
-
-void SocketTest::TestSocketServerWaitIPv4() {
-  SocketServerWaitInternal(kIPv4Loopback);
-}
-
-void SocketTest::TestSocketServerWaitIPv6() {
-  MAYBE_SKIP_IPV6;
-  SocketServerWaitInternal(kIPv6Loopback);
-}
-
-void SocketTest::TestTcpIPv4() {
-  TcpInternal(kIPv4Loopback, kTcpInternalDataSize, -1);
-}
-
-void SocketTest::TestTcpIPv6() {
-  MAYBE_SKIP_IPV6;
-  TcpInternal(kIPv6Loopback, kTcpInternalDataSize, -1);
-}
-
-void SocketTest::TestSingleFlowControlCallbackIPv4() {
-  SingleFlowControlCallbackInternal(kIPv4Loopback);
-}
-
-void SocketTest::TestSingleFlowControlCallbackIPv6() {
-  MAYBE_SKIP_IPV6;
-  SingleFlowControlCallbackInternal(kIPv6Loopback);
-}
-
-void SocketTest::TestUdpIPv4() {
-  UdpInternal(kIPv4Loopback);
-}
-
-void SocketTest::TestUdpIPv6() {
-  MAYBE_SKIP_IPV6;
-  UdpInternal(kIPv6Loopback);
-}
-
-void SocketTest::TestUdpReadyToSendIPv4() {
-#if !defined(WEBRTC_MAC)
-  // TODO(ronghuawu): Enable this test on mac/ios.
-  UdpReadyToSend(kIPv4Loopback);
-#endif
-}
-
-void SocketTest::TestUdpReadyToSendIPv6() {
-#if defined(WEBRTC_WIN)
-  // TODO(ronghuawu): Enable this test (currently flakey) on mac and linux.
-  MAYBE_SKIP_IPV6;
-  UdpReadyToSend(kIPv6Loopback);
-#endif
-}
-
-void SocketTest::TestGetSetOptionsIPv4() {
-  GetSetOptionsInternal(kIPv4Loopback);
-}
-
-void SocketTest::TestGetSetOptionsIPv6() {
-  MAYBE_SKIP_IPV6;
-  GetSetOptionsInternal(kIPv6Loopback);
-}
-
-void SocketTest::TestSocketRecvTimestampIPv4() {
-  SocketRecvTimestamp(kIPv4Loopback);
-}
-
-void SocketTest::TestSocketRecvTimestampIPv6() {
-  MAYBE_SKIP_IPV6;
-  SocketRecvTimestamp(kIPv6Loopback);
-}
-
-// For unbound sockets, GetLocalAddress / GetRemoteAddress return AF_UNSPEC
-// values on Windows, but an empty address of the same family on Linux/MacOS X.
-bool IsUnspecOrEmptyIP(const IPAddress& address) {
-#if !defined(WEBRTC_WIN)
-  return IPIsAny(address);
-#else
-  return address.family() == AF_UNSPEC;
-#endif
-}
-
-void SocketTest::ConnectInternal(const IPAddress& loopback) {
-  StreamSink sink;
-  SocketAddress accept_addr;
-
-  // Create client.
-  std::unique_ptr<AsyncSocket> client(
-      ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM));
-  sink.Monitor(client.get());
-  EXPECT_EQ(AsyncSocket::CS_CLOSED, client->GetState());
-  EXPECT_PRED1(IsUnspecOrEmptyIP, client->GetLocalAddress().ipaddr());
-
-  // Create server and listen.
-  std::unique_ptr<AsyncSocket> server(
-      ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM));
-  sink.Monitor(server.get());
-  EXPECT_EQ(0, server->Bind(SocketAddress(loopback, 0)));
-  EXPECT_EQ(0, server->Listen(5));
-  EXPECT_EQ(AsyncSocket::CS_CONNECTING, server->GetState());
-
-  // Ensure no pending server connections, since we haven't done anything yet.
-  EXPECT_FALSE(sink.Check(server.get(), SSE_READ));
-  EXPECT_TRUE(nullptr == server->Accept(&accept_addr));
-  EXPECT_TRUE(accept_addr.IsNil());
-
-  // Attempt connect to listening socket.
-  EXPECT_EQ(0, client->Connect(server->GetLocalAddress()));
-  EXPECT_FALSE(client->GetLocalAddress().IsNil());
-  EXPECT_NE(server->GetLocalAddress(), client->GetLocalAddress());
-
-  // Client is connecting, outcome not yet determined.
-  EXPECT_EQ(AsyncSocket::CS_CONNECTING, client->GetState());
-  EXPECT_FALSE(sink.Check(client.get(), SSE_OPEN));
-  EXPECT_FALSE(sink.Check(client.get(), SSE_CLOSE));
-
-  // Server has pending connection, accept it.
-  EXPECT_TRUE_WAIT((sink.Check(server.get(), SSE_READ)), kTimeout);
-  std::unique_ptr<AsyncSocket> accepted(server->Accept(&accept_addr));
-  ASSERT_TRUE(accepted);
-  EXPECT_FALSE(accept_addr.IsNil());
-  EXPECT_EQ(accepted->GetRemoteAddress(), accept_addr);
-
-  // Connected from server perspective, check the addresses are correct.
-  EXPECT_EQ(AsyncSocket::CS_CONNECTED, accepted->GetState());
-  EXPECT_EQ(server->GetLocalAddress(), accepted->GetLocalAddress());
-  EXPECT_EQ(client->GetLocalAddress(), accepted->GetRemoteAddress());
-
-  // Connected from client perspective, check the addresses are correct.
-  EXPECT_EQ_WAIT(AsyncSocket::CS_CONNECTED, client->GetState(), kTimeout);
-  EXPECT_TRUE(sink.Check(client.get(), SSE_OPEN));
-  EXPECT_FALSE(sink.Check(client.get(), SSE_CLOSE));
-  EXPECT_EQ(client->GetRemoteAddress(), server->GetLocalAddress());
-  EXPECT_EQ(client->GetRemoteAddress(), accepted->GetLocalAddress());
-}
-
-void SocketTest::ConnectWithDnsLookupInternal(const IPAddress& loopback,
-                                              const std::string& host) {
-  StreamSink sink;
-  SocketAddress accept_addr;
-
-  // Create client.
-  std::unique_ptr<AsyncSocket> client(
-      ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM));
-  sink.Monitor(client.get());
-
-  // Create server and listen.
-  std::unique_ptr<AsyncSocket> server(
-      ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM));
-  sink.Monitor(server.get());
-  EXPECT_EQ(0, server->Bind(SocketAddress(loopback, 0)));
-  EXPECT_EQ(0, server->Listen(5));
-
-  // Attempt connect to listening socket.
-  SocketAddress dns_addr(server->GetLocalAddress());
-  dns_addr.SetIP(host);
-  EXPECT_EQ(0, client->Connect(dns_addr));
-  // TODO: Bind when doing DNS lookup.
-  //EXPECT_NE(kEmptyAddr, client->GetLocalAddress());  // Implicit Bind
-
-  // Client is connecting, outcome not yet determined.
-  EXPECT_EQ(AsyncSocket::CS_CONNECTING, client->GetState());
-  EXPECT_FALSE(sink.Check(client.get(), SSE_OPEN));
-  EXPECT_FALSE(sink.Check(client.get(), SSE_CLOSE));
-
-  // Server has pending connection, accept it.
-  EXPECT_TRUE_WAIT((sink.Check(server.get(), SSE_READ)), kTimeout);
-  std::unique_ptr<AsyncSocket> accepted(server->Accept(&accept_addr));
-  ASSERT_TRUE(accepted);
-  EXPECT_FALSE(accept_addr.IsNil());
-  EXPECT_EQ(accepted->GetRemoteAddress(), accept_addr);
-
-  // Connected from server perspective, check the addresses are correct.
-  EXPECT_EQ(AsyncSocket::CS_CONNECTED, accepted->GetState());
-  EXPECT_EQ(server->GetLocalAddress(), accepted->GetLocalAddress());
-  EXPECT_EQ(client->GetLocalAddress(), accepted->GetRemoteAddress());
-
-  // Connected from client perspective, check the addresses are correct.
-  EXPECT_EQ_WAIT(AsyncSocket::CS_CONNECTED, client->GetState(), kTimeout);
-  EXPECT_TRUE(sink.Check(client.get(), SSE_OPEN));
-  EXPECT_FALSE(sink.Check(client.get(), SSE_CLOSE));
-  EXPECT_EQ(client->GetRemoteAddress(), server->GetLocalAddress());
-  EXPECT_EQ(client->GetRemoteAddress(), accepted->GetLocalAddress());
-}
-
-void SocketTest::ConnectFailInternal(const IPAddress& loopback) {
-  StreamSink sink;
-  SocketAddress accept_addr;
-
-  // Create client.
-  std::unique_ptr<AsyncSocket> client(
-      ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM));
-  sink.Monitor(client.get());
-
-  // Create server, but don't listen yet.
-  std::unique_ptr<AsyncSocket> server(
-      ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM));
-  sink.Monitor(server.get());
-  EXPECT_EQ(0, server->Bind(SocketAddress(loopback, 0)));
-
-  // Attempt connect to a non-existent socket.
-  // We don't connect to the server socket created above, since on
-  // MacOS it takes about 75 seconds to get back an error!
-  SocketAddress bogus_addr(loopback, 65535);
-  EXPECT_EQ(0, client->Connect(bogus_addr));
-
-  // Wait for connection to fail (ECONNREFUSED).
-  EXPECT_EQ_WAIT(AsyncSocket::CS_CLOSED, client->GetState(), kTimeout);
-  EXPECT_FALSE(sink.Check(client.get(), SSE_OPEN));
-  EXPECT_TRUE(sink.Check(client.get(), SSE_ERROR));
-  EXPECT_TRUE(client->GetRemoteAddress().IsNil());
-
-  // Should be no pending server connections.
-  EXPECT_FALSE(sink.Check(server.get(), SSE_READ));
-  EXPECT_TRUE(nullptr == server->Accept(&accept_addr));
-  EXPECT_EQ(IPAddress(), accept_addr.ipaddr());
-}
-
-void SocketTest::ConnectWithDnsLookupFailInternal(const IPAddress& loopback) {
-  StreamSink sink;
-  SocketAddress accept_addr;
-
-  // Create client.
-  std::unique_ptr<AsyncSocket> client(
-      ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM));
-  sink.Monitor(client.get());
-
-  // Create server, but don't listen yet.
-  std::unique_ptr<AsyncSocket> server(
-      ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM));
-  sink.Monitor(server.get());
-  EXPECT_EQ(0, server->Bind(SocketAddress(loopback, 0)));
-
-  // Attempt connect to a non-existent host.
-  // We don't connect to the server socket created above, since on
-  // MacOS it takes about 75 seconds to get back an error!
-  SocketAddress bogus_dns_addr("not-a-real-hostname", 65535);
-  EXPECT_EQ(0, client->Connect(bogus_dns_addr));
-
-  // Wait for connection to fail (EHOSTNOTFOUND).
-  bool dns_lookup_finished = false;
-  WAIT_(client->GetState() == AsyncSocket::CS_CLOSED, kTimeout,
-        dns_lookup_finished);
-  if (!dns_lookup_finished) {
-    LOG(LS_WARNING) << "Skipping test; DNS resolution took longer than 5 "
-                    << "seconds.";
-    return;
-  }
-
-  EXPECT_EQ_WAIT(AsyncSocket::CS_CLOSED, client->GetState(), kTimeout);
-  EXPECT_FALSE(sink.Check(client.get(), SSE_OPEN));
-  EXPECT_TRUE(sink.Check(client.get(), SSE_ERROR));
-  EXPECT_TRUE(client->GetRemoteAddress().IsNil());
-  // Should be no pending server connections.
-  EXPECT_FALSE(sink.Check(server.get(), SSE_READ));
-  EXPECT_TRUE(nullptr == server->Accept(&accept_addr));
-  EXPECT_TRUE(accept_addr.IsNil());
-}
-
-void SocketTest::ConnectWithClosedSocketInternal(const IPAddress& loopback) {
-  // Create server and listen.
-  std::unique_ptr<AsyncSocket> server(
-      ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM));
-  EXPECT_EQ(0, server->Bind(SocketAddress(loopback, 0)));
-  EXPECT_EQ(0, server->Listen(5));
-
-  // Create a client and put in to CS_CLOSED state.
-  std::unique_ptr<AsyncSocket> client(
-      ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM));
-  EXPECT_EQ(0, client->Close());
-  EXPECT_EQ(AsyncSocket::CS_CLOSED, client->GetState());
-
-  // Connect() should reinitialize the socket, and put it in to CS_CONNECTING.
-  EXPECT_EQ(0, client->Connect(SocketAddress(server->GetLocalAddress())));
-  EXPECT_EQ(AsyncSocket::CS_CONNECTING, client->GetState());
-}
-
-void SocketTest::ConnectWhileNotClosedInternal(const IPAddress& loopback) {
-  // Create server and listen.
-  StreamSink sink;
-  std::unique_ptr<AsyncSocket> server(
-      ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM));
-  sink.Monitor(server.get());
-  EXPECT_EQ(0, server->Bind(SocketAddress(loopback, 0)));
-  EXPECT_EQ(0, server->Listen(5));
-  // Create client, connect.
-  std::unique_ptr<AsyncSocket> client(
-      ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM));
-  EXPECT_EQ(0, client->Connect(SocketAddress(server->GetLocalAddress())));
-  EXPECT_EQ(AsyncSocket::CS_CONNECTING, client->GetState());
-  // Try to connect again. Should fail, but not interfere with original attempt.
-  EXPECT_EQ(SOCKET_ERROR,
-            client->Connect(SocketAddress(server->GetLocalAddress())));
-
-  // Accept the original connection.
-  SocketAddress accept_addr;
-  EXPECT_TRUE_WAIT((sink.Check(server.get(), SSE_READ)), kTimeout);
-  std::unique_ptr<AsyncSocket> accepted(server->Accept(&accept_addr));
-  ASSERT_TRUE(accepted);
-  EXPECT_FALSE(accept_addr.IsNil());
-
-  // Check the states and addresses.
-  EXPECT_EQ(AsyncSocket::CS_CONNECTED, accepted->GetState());
-  EXPECT_EQ(server->GetLocalAddress(), accepted->GetLocalAddress());
-  EXPECT_EQ(client->GetLocalAddress(), accepted->GetRemoteAddress());
-  EXPECT_EQ_WAIT(AsyncSocket::CS_CONNECTED, client->GetState(), kTimeout);
-  EXPECT_EQ(client->GetRemoteAddress(), server->GetLocalAddress());
-  EXPECT_EQ(client->GetRemoteAddress(), accepted->GetLocalAddress());
-
-  // Try to connect again, to an unresolved hostname.
-  // Shouldn't break anything.
-  EXPECT_EQ(SOCKET_ERROR,
-            client->Connect(SocketAddress("localhost",
-                                          server->GetLocalAddress().port())));
-  EXPECT_EQ(AsyncSocket::CS_CONNECTED, accepted->GetState());
-  EXPECT_EQ(AsyncSocket::CS_CONNECTED, client->GetState());
-  EXPECT_EQ(client->GetRemoteAddress(), server->GetLocalAddress());
-  EXPECT_EQ(client->GetRemoteAddress(), accepted->GetLocalAddress());
-}
-
-void SocketTest::ServerCloseDuringConnectInternal(const IPAddress& loopback) {
-  StreamSink sink;
-
-  // Create client.
-  std::unique_ptr<AsyncSocket> client(
-      ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM));
-  sink.Monitor(client.get());
-
-  // Create server and listen.
-  std::unique_ptr<AsyncSocket> server(
-      ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM));
-  sink.Monitor(server.get());
-  EXPECT_EQ(0, server->Bind(SocketAddress(loopback, 0)));
-  EXPECT_EQ(0, server->Listen(5));
-
-  // Attempt connect to listening socket.
-  EXPECT_EQ(0, client->Connect(server->GetLocalAddress()));
-
-  // Close down the server while the socket is in the accept queue.
-  EXPECT_TRUE_WAIT(sink.Check(server.get(), SSE_READ), kTimeout);
-  server->Close();
-
-  // This should fail the connection for the client. Clean up.
-  EXPECT_EQ_WAIT(AsyncSocket::CS_CLOSED, client->GetState(), kTimeout);
-  EXPECT_TRUE(sink.Check(client.get(), SSE_ERROR));
-  client->Close();
-}
-
-void SocketTest::ClientCloseDuringConnectInternal(const IPAddress& loopback) {
-  StreamSink sink;
-  SocketAddress accept_addr;
-
-  // Create client.
-  std::unique_ptr<AsyncSocket> client(
-      ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM));
-  sink.Monitor(client.get());
-
-  // Create server and listen.
-  std::unique_ptr<AsyncSocket> server(
-      ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM));
-  sink.Monitor(server.get());
-  EXPECT_EQ(0, server->Bind(SocketAddress(loopback, 0)));
-  EXPECT_EQ(0, server->Listen(5));
-
-  // Attempt connect to listening socket.
-  EXPECT_EQ(0, client->Connect(server->GetLocalAddress()));
-
-  // Close down the client while the socket is in the accept queue.
-  EXPECT_TRUE_WAIT(sink.Check(server.get(), SSE_READ), kTimeout);
-  client->Close();
-
-  // The connection should still be able to be accepted.
-  std::unique_ptr<AsyncSocket> accepted(server->Accept(&accept_addr));
-  ASSERT_TRUE(accepted);
-  sink.Monitor(accepted.get());
-  EXPECT_EQ(AsyncSocket::CS_CONNECTED, accepted->GetState());
-
-  // The accepted socket should then close (possibly with err, timing-related)
-  EXPECT_EQ_WAIT(AsyncSocket::CS_CLOSED, accepted->GetState(), kTimeout);
-  EXPECT_TRUE(sink.Check(accepted.get(), SSE_CLOSE) ||
-              sink.Check(accepted.get(), SSE_ERROR));
-
-  // The client should not get a close event.
-  EXPECT_FALSE(sink.Check(client.get(), SSE_CLOSE));
-}
-
-void SocketTest::ServerCloseInternal(const IPAddress& loopback) {
-  StreamSink sink;
-  SocketAddress accept_addr;
-
-  // Create client.
-  std::unique_ptr<AsyncSocket> client(
-      ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM));
-  sink.Monitor(client.get());
-
-  // Create server and listen.
-  std::unique_ptr<AsyncSocket> server(
-      ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM));
-  sink.Monitor(server.get());
-  EXPECT_EQ(0, server->Bind(SocketAddress(loopback, 0)));
-  EXPECT_EQ(0, server->Listen(5));
-
-  // Attempt connection.
-  EXPECT_EQ(0, client->Connect(server->GetLocalAddress()));
-
-  // Accept connection.
-  EXPECT_TRUE_WAIT((sink.Check(server.get(), SSE_READ)), kTimeout);
-  std::unique_ptr<AsyncSocket> accepted(server->Accept(&accept_addr));
-  ASSERT_TRUE(accepted);
-  sink.Monitor(accepted.get());
-
-  // Both sides are now connected.
-  EXPECT_EQ_WAIT(AsyncSocket::CS_CONNECTED, client->GetState(), kTimeout);
-  EXPECT_TRUE(sink.Check(client.get(), SSE_OPEN));
-  EXPECT_EQ(client->GetRemoteAddress(), accepted->GetLocalAddress());
-  EXPECT_EQ(accepted->GetRemoteAddress(), client->GetLocalAddress());
-
-  // Send data to the client, and then close the connection.
-  EXPECT_EQ(1, accepted->Send("a", 1));
-  accepted->Close();
-  EXPECT_EQ(AsyncSocket::CS_CLOSED, accepted->GetState());
-
-  // Expect that the client is notified, and has not yet closed.
-  EXPECT_TRUE_WAIT(sink.Check(client.get(), SSE_READ), kTimeout);
-  EXPECT_FALSE(sink.Check(client.get(), SSE_CLOSE));
-  EXPECT_EQ(AsyncSocket::CS_CONNECTED, client->GetState());
-
-  // Ensure the data can be read.
-  char buffer[10];
-  EXPECT_EQ(1, client->Recv(buffer, sizeof(buffer), nullptr));
-  EXPECT_EQ('a', buffer[0]);
-
-  // Now we should close, but the remote address will remain.
-  EXPECT_EQ_WAIT(AsyncSocket::CS_CLOSED, client->GetState(), kTimeout);
-  EXPECT_TRUE(sink.Check(client.get(), SSE_CLOSE));
-  EXPECT_FALSE(client->GetRemoteAddress().IsAnyIP());
-
-  // The closer should not get a close signal.
-  EXPECT_FALSE(sink.Check(accepted.get(), SSE_CLOSE));
-  EXPECT_TRUE(accepted->GetRemoteAddress().IsNil());
-
-  // And the closee should only get a single signal.
-  Thread::Current()->ProcessMessages(0);
-  EXPECT_FALSE(sink.Check(client.get(), SSE_CLOSE));
-
-  // Close down the client and ensure all is good.
-  client->Close();
-  EXPECT_FALSE(sink.Check(client.get(), SSE_CLOSE));
-  EXPECT_TRUE(client->GetRemoteAddress().IsNil());
-}
-
-class SocketCloser : public sigslot::has_slots<> {
- public:
-  void OnClose(AsyncSocket* socket, int error) {
-    socket->Close();  // Deleting here would blow up the vector of handlers
-                      // for the socket's signal.
-  }
-};
-
-void SocketTest::CloseInClosedCallbackInternal(const IPAddress& loopback) {
-  StreamSink sink;
-  SocketCloser closer;
-  SocketAddress accept_addr;
-
-  // Create client.
-  std::unique_ptr<AsyncSocket> client(
-      ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM));
-  sink.Monitor(client.get());
-  client->SignalCloseEvent.connect(&closer, &SocketCloser::OnClose);
-
-  // Create server and listen.
-  std::unique_ptr<AsyncSocket> server(
-      ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM));
-  sink.Monitor(server.get());
-  EXPECT_EQ(0, server->Bind(SocketAddress(loopback, 0)));
-  EXPECT_EQ(0, server->Listen(5));
-
-  // Attempt connection.
-  EXPECT_EQ(0, client->Connect(server->GetLocalAddress()));
-
-  // Accept connection.
-  EXPECT_TRUE_WAIT((sink.Check(server.get(), SSE_READ)), kTimeout);
-  std::unique_ptr<AsyncSocket> accepted(server->Accept(&accept_addr));
-  ASSERT_TRUE(accepted);
-  sink.Monitor(accepted.get());
-
-  // Both sides are now connected.
-  EXPECT_EQ_WAIT(AsyncSocket::CS_CONNECTED, client->GetState(), kTimeout);
-  EXPECT_TRUE(sink.Check(client.get(), SSE_OPEN));
-  EXPECT_EQ(client->GetRemoteAddress(), accepted->GetLocalAddress());
-  EXPECT_EQ(accepted->GetRemoteAddress(), client->GetLocalAddress());
-
-  // Send data to the client, and then close the connection.
-  accepted->Close();
-  EXPECT_EQ(AsyncSocket::CS_CLOSED, accepted->GetState());
-
-  // Expect that the client is notified, and has not yet closed.
-  EXPECT_FALSE(sink.Check(client.get(), SSE_CLOSE));
-  EXPECT_EQ(AsyncSocket::CS_CONNECTED, client->GetState());
-
-  // Now we should be closed and invalidated
-  EXPECT_EQ_WAIT(AsyncSocket::CS_CLOSED, client->GetState(), kTimeout);
-  EXPECT_TRUE(sink.Check(client.get(), SSE_CLOSE));
-  EXPECT_TRUE(Socket::CS_CLOSED == client->GetState());
-}
-
-class Sleeper : public MessageHandler {
- public:
-  Sleeper() {}
-  void OnMessage(Message* msg) {
-    Thread::Current()->SleepMs(500);
-  }
-};
-
-void SocketTest::SocketServerWaitInternal(const IPAddress& loopback) {
-  StreamSink sink;
-  SocketAddress accept_addr;
-
-  // Create & connect server and client sockets.
-  std::unique_ptr<AsyncSocket> client(
-      ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM));
-  std::unique_ptr<AsyncSocket> server(
-      ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM));
-  sink.Monitor(client.get());
-  sink.Monitor(server.get());
-  EXPECT_EQ(0, server->Bind(SocketAddress(loopback, 0)));
-  EXPECT_EQ(0, server->Listen(5));
-
-  EXPECT_EQ(0, client->Connect(server->GetLocalAddress()));
-  EXPECT_TRUE_WAIT((sink.Check(server.get(), SSE_READ)), kTimeout);
-
-  std::unique_ptr<AsyncSocket> accepted(server->Accept(&accept_addr));
-  ASSERT_TRUE(accepted);
-  sink.Monitor(accepted.get());
-  EXPECT_EQ(AsyncSocket::CS_CONNECTED, accepted->GetState());
-  EXPECT_EQ(server->GetLocalAddress(), accepted->GetLocalAddress());
-  EXPECT_EQ(client->GetLocalAddress(), accepted->GetRemoteAddress());
-
-  EXPECT_EQ_WAIT(AsyncSocket::CS_CONNECTED, client->GetState(), kTimeout);
-  EXPECT_TRUE(sink.Check(client.get(), SSE_OPEN));
-  EXPECT_FALSE(sink.Check(client.get(), SSE_CLOSE));
-  EXPECT_EQ(client->GetRemoteAddress(), server->GetLocalAddress());
-  EXPECT_EQ(client->GetRemoteAddress(), accepted->GetLocalAddress());
-
-  // Do an i/o operation, triggering an eventual callback.
-  EXPECT_FALSE(sink.Check(accepted.get(), SSE_READ));
-  char buf[1024] = {0};
-
-  EXPECT_EQ(1024, client->Send(buf, 1024));
-  EXPECT_FALSE(sink.Check(accepted.get(), SSE_READ));
-
-  // Shouldn't signal when blocked in a thread Send, where process_io is false.
-  std::unique_ptr<Thread> thread(Thread::CreateWithSocketServer());
-  thread->Start();
-  Sleeper sleeper;
-  TypedMessageData<AsyncSocket*> data(client.get());
-  thread->Send(RTC_FROM_HERE, &sleeper, 0, &data);
-  EXPECT_FALSE(sink.Check(accepted.get(), SSE_READ));
-
-  // But should signal when process_io is true.
-  EXPECT_TRUE_WAIT((sink.Check(accepted.get(), SSE_READ)), kTimeout);
-  EXPECT_LT(0, accepted->Recv(buf, 1024, nullptr));
-}
-
-void SocketTest::TcpInternal(const IPAddress& loopback, size_t data_size,
-    ptrdiff_t max_send_size) {
-  StreamSink sink;
-  SocketAddress accept_addr;
-
-  // Create receiving client.
-  std::unique_ptr<AsyncSocket> receiver(
-      ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM));
-  sink.Monitor(receiver.get());
-
-  // Create server and listen.
-  std::unique_ptr<AsyncSocket> server(
-      ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM));
-  sink.Monitor(server.get());
-  EXPECT_EQ(0, server->Bind(SocketAddress(loopback, 0)));
-  EXPECT_EQ(0, server->Listen(5));
-
-  // Attempt connection.
-  EXPECT_EQ(0, receiver->Connect(server->GetLocalAddress()));
-
-  // Accept connection which will be used for sending.
-  EXPECT_TRUE_WAIT((sink.Check(server.get(), SSE_READ)), kTimeout);
-  std::unique_ptr<AsyncSocket> sender(server->Accept(&accept_addr));
-  ASSERT_TRUE(sender);
-  sink.Monitor(sender.get());
-
-  // Both sides are now connected.
-  EXPECT_EQ_WAIT(AsyncSocket::CS_CONNECTED, receiver->GetState(), kTimeout);
-  EXPECT_TRUE(sink.Check(receiver.get(), SSE_OPEN));
-  EXPECT_EQ(receiver->GetRemoteAddress(), sender->GetLocalAddress());
-  EXPECT_EQ(sender->GetRemoteAddress(), receiver->GetLocalAddress());
-
-  // Create test data.
-  rtc::Buffer send_buffer(0, data_size);
-  rtc::Buffer recv_buffer(0, data_size);
-  for (size_t i = 0; i < data_size; ++i) {
-    char ch = static_cast<char>(i % 256);
-    send_buffer.AppendData(&ch, sizeof(ch));
-  }
-  rtc::Buffer recved_data(0, data_size);
-
-  // Send and receive a bunch of data.
-  size_t sent_size = 0;
-  bool writable = true;
-  bool send_called = false;
-  bool readable = false;
-  bool recv_called = false;
-  while (recv_buffer.size() < send_buffer.size()) {
-    // Send as much as we can while we're cleared to send.
-    while (writable && sent_size < send_buffer.size()) {
-      int unsent_size = static_cast<int>(send_buffer.size() - sent_size);
-      int sent = sender->Send(send_buffer.data() + sent_size, unsent_size);
-      if (!send_called) {
-        // The first Send() after connecting or getting writability should
-        // succeed and send some data.
-        EXPECT_GT(sent, 0);
-        send_called = true;
-      }
-      if (sent >= 0) {
-        EXPECT_LE(sent, unsent_size);
-        sent_size += sent;
-        if (max_send_size >= 0) {
-          EXPECT_LE(static_cast<ptrdiff_t>(sent), max_send_size);
-          if (sent < unsent_size) {
-            // If max_send_size is limiting the amount to send per call such
-            // that the sent amount is less than the unsent amount, we simulate
-            // that the socket is no longer writable.
-            writable = false;
-          }
-        }
-      } else {
-        ASSERT_TRUE(sender->IsBlocking());
-        writable = false;
-      }
-    }
-
-    // Read all the sent data.
-    while (recv_buffer.size() < sent_size) {
-      if (!readable) {
-        // Wait until data is available.
-        EXPECT_TRUE_WAIT(sink.Check(receiver.get(), SSE_READ), kTimeout);
-        readable = true;
-        recv_called = false;
-      }
-
-      // Receive as much as we can get in a single recv call.
-      int recved_size = receiver->Recv(recved_data.data(), data_size, nullptr);
-
-      if (!recv_called) {
-        // The first Recv() after getting readability should succeed and receive
-        // some data.
-        // TODO: The following line is disabled due to flakey pulse
-        //     builds.  Re-enable if/when possible.
-        // EXPECT_GT(recved_size, 0);
-        recv_called = true;
-      }
-      if (recved_size >= 0) {
-        EXPECT_LE(static_cast<size_t>(recved_size),
-            sent_size - recv_buffer.size());
-        recv_buffer.AppendData(recved_data.data(), recved_size);
-      } else {
-        ASSERT_TRUE(receiver->IsBlocking());
-        readable = false;
-      }
-    }
-
-    // Once all that we've sent has been received, expect to be able to send
-    // again.
-    if (!writable) {
-      ASSERT_TRUE_WAIT(sink.Check(sender.get(), SSE_WRITE), kTimeout);
-      writable = true;
-      send_called = false;
-    }
-  }
-
-  // The received data matches the sent data.
-  EXPECT_EQ(data_size, sent_size);
-  EXPECT_EQ(data_size, recv_buffer.size());
-  EXPECT_EQ(recv_buffer, send_buffer);
-
-  // Close down.
-  sender->Close();
-  EXPECT_EQ_WAIT(AsyncSocket::CS_CLOSED, receiver->GetState(), kTimeout);
-  EXPECT_TRUE(sink.Check(receiver.get(), SSE_CLOSE));
-  receiver->Close();
-}
-
-void SocketTest::SingleFlowControlCallbackInternal(const IPAddress& loopback) {
-  StreamSink sink;
-  SocketAddress accept_addr;
-
-  // Create client.
-  std::unique_ptr<AsyncSocket> client(
-      ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM));
-  sink.Monitor(client.get());
-
-  // Create server and listen.
-  std::unique_ptr<AsyncSocket> server(
-      ss_->CreateAsyncSocket(loopback.family(), SOCK_STREAM));
-  sink.Monitor(server.get());
-  EXPECT_EQ(0, server->Bind(SocketAddress(loopback, 0)));
-  EXPECT_EQ(0, server->Listen(5));
-
-  // Attempt connection.
-  EXPECT_EQ(0, client->Connect(server->GetLocalAddress()));
-
-  // Accept connection.
-  EXPECT_TRUE_WAIT((sink.Check(server.get(), SSE_READ)), kTimeout);
-  std::unique_ptr<AsyncSocket> accepted(server->Accept(&accept_addr));
-  ASSERT_TRUE(accepted);
-  sink.Monitor(accepted.get());
-
-  // Both sides are now connected.
-  EXPECT_EQ_WAIT(AsyncSocket::CS_CONNECTED, client->GetState(), kTimeout);
-  EXPECT_TRUE(sink.Check(client.get(), SSE_OPEN));
-  EXPECT_EQ(client->GetRemoteAddress(), accepted->GetLocalAddress());
-  EXPECT_EQ(accepted->GetRemoteAddress(), client->GetLocalAddress());
-
-  // Expect a writable callback from the connect.
-  EXPECT_TRUE_WAIT(sink.Check(accepted.get(), SSE_WRITE), kTimeout);
-
-  // Fill the socket buffer.
-  char buf[1024 * 16] = {0};
-  int sends = 0;
-  while (++sends && accepted->Send(&buf, arraysize(buf)) != -1) {}
-  EXPECT_TRUE(accepted->IsBlocking());
-
-  // Wait until data is available.
-  EXPECT_TRUE_WAIT(sink.Check(client.get(), SSE_READ), kTimeout);
-
-  // Pull data.
-  for (int i = 0; i < sends; ++i) {
-    client->Recv(buf, arraysize(buf), nullptr);
-  }
-
-  // Expect at least one additional writable callback.
-  EXPECT_TRUE_WAIT(sink.Check(accepted.get(), SSE_WRITE), kTimeout);
-
-  // Adding data in response to the writeable callback shouldn't cause infinite
-  // callbacks.
-  int extras = 0;
-  for (int i = 0; i < 100; ++i) {
-    accepted->Send(&buf, arraysize(buf));
-    rtc::Thread::Current()->ProcessMessages(1);
-    if (sink.Check(accepted.get(), SSE_WRITE)) {
-      extras++;
-    }
-  }
-  EXPECT_LT(extras, 2);
-
-  // Close down.
-  accepted->Close();
-  client->Close();
-}
-
-void SocketTest::UdpInternal(const IPAddress& loopback) {
-  SocketAddress empty = EmptySocketAddressWithFamily(loopback.family());
-  // Test basic bind and connect behavior.
-  AsyncSocket* socket =
-      ss_->CreateAsyncSocket(loopback.family(), SOCK_DGRAM);
-  EXPECT_EQ(AsyncSocket::CS_CLOSED, socket->GetState());
-  EXPECT_EQ(0, socket->Bind(SocketAddress(loopback, 0)));
-  SocketAddress addr1 = socket->GetLocalAddress();
-  EXPECT_EQ(0, socket->Connect(addr1));
-  EXPECT_EQ(AsyncSocket::CS_CONNECTED, socket->GetState());
-  socket->Close();
-  EXPECT_EQ(AsyncSocket::CS_CLOSED, socket->GetState());
-  delete socket;
-
-  // Test send/receive behavior.
-  std::unique_ptr<TestClient> client1(
-      new TestClient(WrapUnique(AsyncUDPSocket::Create(ss_, addr1))));
-  std::unique_ptr<TestClient> client2(
-      new TestClient(WrapUnique(AsyncUDPSocket::Create(ss_, empty))));
-
-  SocketAddress addr2;
-  EXPECT_EQ(3, client2->SendTo("foo", 3, addr1));
-  EXPECT_TRUE(client1->CheckNextPacket("foo", 3, &addr2));
-
-  SocketAddress addr3;
-  EXPECT_EQ(6, client1->SendTo("bizbaz", 6, addr2));
-  EXPECT_TRUE(client2->CheckNextPacket("bizbaz", 6, &addr3));
-  EXPECT_EQ(addr3, addr1);
-  // TODO: figure out what the intent is here
-  for (int i = 0; i < 10; ++i) {
-    client2.reset(
-        new TestClient(WrapUnique(AsyncUDPSocket::Create(ss_, empty))));
-
-    SocketAddress addr4;
-    EXPECT_EQ(3, client2->SendTo("foo", 3, addr1));
-    EXPECT_TRUE(client1->CheckNextPacket("foo", 3, &addr4));
-    EXPECT_EQ(addr4.ipaddr(), addr2.ipaddr());
-
-    SocketAddress addr5;
-    EXPECT_EQ(6, client1->SendTo("bizbaz", 6, addr4));
-    EXPECT_TRUE(client2->CheckNextPacket("bizbaz", 6, &addr5));
-    EXPECT_EQ(addr5, addr1);
-
-    addr2 = addr4;
-  }
-}
-
-void SocketTest::UdpReadyToSend(const IPAddress& loopback) {
-  SocketAddress empty = EmptySocketAddressWithFamily(loopback.family());
-  // RFC 5737 - The blocks 192.0.2.0/24 (TEST-NET-1) ... are provided for use in
-  // documentation.
-  // RFC 3849 - 2001:DB8::/32 as a documentation-only prefix.
-  std::string dest = (loopback.family() == AF_INET6) ?
-      "2001:db8::1" : "192.0.2.0";
-  SocketAddress test_addr(dest, 2345);
-
-  // Test send
-  std::unique_ptr<TestClient> client(
-      new TestClient(WrapUnique(AsyncUDPSocket::Create(ss_, empty))));
-  int test_packet_size = 1200;
-  std::unique_ptr<char[]> test_packet(new char[test_packet_size]);
-  // Init the test packet just to avoid memcheck warning.
-  memset(test_packet.get(), 0, test_packet_size);
-  // Set the send buffer size to the same size as the test packet to have a
-  // better chance to get EWOULDBLOCK.
-  int send_buffer_size = test_packet_size;
-#if defined(WEBRTC_LINUX) && !defined(WEBRTC_ANDROID)
-  send_buffer_size /= 2;
-#endif
-  client->SetOption(rtc::Socket::OPT_SNDBUF, send_buffer_size);
-
-  int error = 0;
-  uint32_t start_ms = Time();
-  int sent_packet_num = 0;
-  int expected_error = EWOULDBLOCK;
-  while (start_ms + kTimeout > Time()) {
-    int ret = client->SendTo(test_packet.get(), test_packet_size, test_addr);
-    ++sent_packet_num;
-    if (ret != test_packet_size) {
-      error = client->GetError();
-      if (error == expected_error) {
-        LOG(LS_INFO) << "Got expected error code after sending "
-                     << sent_packet_num << " packets.";
-        break;
-      }
-    }
-  }
-  EXPECT_EQ(expected_error, error);
-  EXPECT_FALSE(client->ready_to_send());
-  EXPECT_TRUE_WAIT(client->ready_to_send(), kTimeout);
-  LOG(LS_INFO) << "Got SignalReadyToSend";
-}
-
-void SocketTest::GetSetOptionsInternal(const IPAddress& loopback) {
-  std::unique_ptr<AsyncSocket> socket(
-      ss_->CreateAsyncSocket(loopback.family(), SOCK_DGRAM));
-  socket->Bind(SocketAddress(loopback, 0));
-
-  // Check SNDBUF/RCVBUF.
-  const int desired_size = 12345;
-#if defined(WEBRTC_LINUX)
-  // Yes, really.  It's in the kernel source.
-  const int expected_size = desired_size * 2;
-#else   // !WEBRTC_LINUX
-  const int expected_size = desired_size;
-#endif  // !WEBRTC_LINUX
-  int recv_size = 0;
-  int send_size = 0;
-  // get the initial sizes
-  ASSERT_NE(-1, socket->GetOption(Socket::OPT_RCVBUF, &recv_size));
-  ASSERT_NE(-1, socket->GetOption(Socket::OPT_SNDBUF, &send_size));
-  // set our desired sizes
-  ASSERT_NE(-1, socket->SetOption(Socket::OPT_RCVBUF, desired_size));
-  ASSERT_NE(-1, socket->SetOption(Socket::OPT_SNDBUF, desired_size));
-  // get the sizes again
-  ASSERT_NE(-1, socket->GetOption(Socket::OPT_RCVBUF, &recv_size));
-  ASSERT_NE(-1, socket->GetOption(Socket::OPT_SNDBUF, &send_size));
-  // make sure they are right
-  ASSERT_EQ(expected_size, recv_size);
-  ASSERT_EQ(expected_size, send_size);
-
-  // Check that we can't set NODELAY on a UDP socket.
-  int current_nd, desired_nd = 1;
-  ASSERT_EQ(-1, socket->GetOption(Socket::OPT_NODELAY, &current_nd));
-  ASSERT_EQ(-1, socket->SetOption(Socket::OPT_NODELAY, desired_nd));
-}
-
-void SocketTest::SocketRecvTimestamp(const IPAddress& loopback) {
-  std::unique_ptr<Socket> socket(
-      ss_->CreateSocket(loopback.family(), SOCK_DGRAM));
-  EXPECT_EQ(0, socket->Bind(SocketAddress(loopback, 0)));
-  SocketAddress address = socket->GetLocalAddress();
-
-  int64_t send_time_1 = TimeMicros();
-  socket->SendTo("foo", 3, address);
-  int64_t recv_timestamp_1;
-  char buffer[3];
-  socket->RecvFrom(buffer, 3, nullptr, &recv_timestamp_1);
-  EXPECT_GT(recv_timestamp_1, -1);
-
-  const int64_t kTimeBetweenPacketsMs = 100;
-  Thread::SleepMs(kTimeBetweenPacketsMs);
-
-  int64_t send_time_2 = TimeMicros();
-  socket->SendTo("bar", 3, address);
-  int64_t recv_timestamp_2;
-  socket->RecvFrom(buffer, 3, nullptr, &recv_timestamp_2);
-
-  int64_t system_time_diff = send_time_2 - send_time_1;
-  int64_t recv_timestamp_diff = recv_timestamp_2 - recv_timestamp_1;
-  // Compare against the system time at the point of sending, because
-  // SleepMs may not sleep for exactly the requested time.
-  EXPECT_NEAR(system_time_diff, recv_timestamp_diff, 10000);
-}
-
-}  // namespace rtc
diff --git a/rtc_base/socket_unittest.h b/rtc_base/socket_unittest.h
deleted file mode 100644
index c236339..0000000
--- a/rtc_base/socket_unittest.h
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- *  Copyright 2009 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_RTC_BASE_SOCKET_UNITTEST_H_
-#define WEBRTC_RTC_BASE_SOCKET_UNITTEST_H_
-
-#include "webrtc/rtc_base/gunit.h"
-#include "webrtc/rtc_base/thread.h"
-
-namespace rtc {
-
-// Generic socket tests, to be used when testing individual socketservers.
-// Derive your specific test class from SocketTest, install your
-// socketserver, and call the SocketTest test methods.
-class SocketTest : public testing::Test {
- protected:
-  SocketTest() : kIPv4Loopback(INADDR_LOOPBACK),
-                 kIPv6Loopback(in6addr_loopback),
-                 ss_(nullptr) {}
-  virtual void SetUp() { ss_ = Thread::Current()->socketserver(); }
-  void TestConnectIPv4();
-  void TestConnectIPv6();
-  void TestConnectWithDnsLookupIPv4();
-  void TestConnectWithDnsLookupIPv6();
-  void TestConnectFailIPv4();
-  void TestConnectFailIPv6();
-  void TestConnectWithDnsLookupFailIPv4();
-  void TestConnectWithDnsLookupFailIPv6();
-  void TestConnectWithClosedSocketIPv4();
-  void TestConnectWithClosedSocketIPv6();
-  void TestConnectWhileNotClosedIPv4();
-  void TestConnectWhileNotClosedIPv6();
-  void TestServerCloseDuringConnectIPv4();
-  void TestServerCloseDuringConnectIPv6();
-  void TestClientCloseDuringConnectIPv4();
-  void TestClientCloseDuringConnectIPv6();
-  void TestServerCloseIPv4();
-  void TestServerCloseIPv6();
-  void TestCloseInClosedCallbackIPv4();
-  void TestCloseInClosedCallbackIPv6();
-  void TestSocketServerWaitIPv4();
-  void TestSocketServerWaitIPv6();
-  void TestTcpIPv4();
-  void TestTcpIPv6();
-  void TestSingleFlowControlCallbackIPv4();
-  void TestSingleFlowControlCallbackIPv6();
-  void TestUdpIPv4();
-  void TestUdpIPv6();
-  void TestUdpReadyToSendIPv4();
-  void TestUdpReadyToSendIPv6();
-  void TestGetSetOptionsIPv4();
-  void TestGetSetOptionsIPv6();
-  void TestSocketRecvTimestampIPv4();
-  void TestSocketRecvTimestampIPv6();
-
-  static const int kTimeout = 5000;  // ms
-  const IPAddress kIPv4Loopback;
-  const IPAddress kIPv6Loopback;
-
- protected:
-  void TcpInternal(const IPAddress& loopback, size_t data_size,
-      ptrdiff_t max_send_size);
-
- private:
-  void ConnectInternal(const IPAddress& loopback);
-  void ConnectWithDnsLookupInternal(const IPAddress& loopback,
-                                    const std::string& host);
-  void ConnectFailInternal(const IPAddress& loopback);
-
-  void ConnectWithDnsLookupFailInternal(const IPAddress& loopback);
-  void ConnectWithClosedSocketInternal(const IPAddress& loopback);
-  void ConnectWhileNotClosedInternal(const IPAddress& loopback);
-  void ServerCloseDuringConnectInternal(const IPAddress& loopback);
-  void ClientCloseDuringConnectInternal(const IPAddress& loopback);
-  void ServerCloseInternal(const IPAddress& loopback);
-  void CloseInClosedCallbackInternal(const IPAddress& loopback);
-  void SocketServerWaitInternal(const IPAddress& loopback);
-  void SingleFlowControlCallbackInternal(const IPAddress& loopback);
-  void UdpInternal(const IPAddress& loopback);
-  void UdpReadyToSend(const IPAddress& loopback);
-  void GetSetOptionsInternal(const IPAddress& loopback);
-  void SocketRecvTimestamp(const IPAddress& loopback);
-
-  SocketServer* ss_;
-};
-
-// For unbound sockets, GetLocalAddress / GetRemoteAddress return AF_UNSPEC
-// values on Windows, but an empty address of the same family on Linux/MacOS X.
-bool IsUnspecOrEmptyIP(const IPAddress& address);
-
-}  // namespace rtc
-
-#endif  // WEBRTC_RTC_BASE_SOCKET_UNITTEST_H_
diff --git a/rtc_base/socketadapters.cc b/rtc_base/socketadapters.cc
deleted file mode 100644
index 8519b89..0000000
--- a/rtc_base/socketadapters.cc
+++ /dev/null
@@ -1,848 +0,0 @@
-/*
- *  Copyright 2004 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.
- */
-
-#if defined(_MSC_VER) && _MSC_VER < 1300
-#pragma warning(disable:4786)
-#endif
-
-#include <time.h>
-#include <errno.h>
-
-#if defined(WEBRTC_WIN)
-#define WIN32_LEAN_AND_MEAN
-#include <windows.h>
-#include <winsock2.h>
-#include <ws2tcpip.h>
-#define SECURITY_WIN32
-#include <security.h>
-#endif
-
-#include <algorithm>
-
-#include "webrtc/rtc_base/bytebuffer.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/httpcommon.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/socketadapters.h"
-#include "webrtc/rtc_base/stringencode.h"
-#include "webrtc/rtc_base/stringutils.h"
-
-namespace rtc {
-
-BufferedReadAdapter::BufferedReadAdapter(AsyncSocket* socket, size_t size)
-    : AsyncSocketAdapter(socket), buffer_size_(size),
-      data_len_(0), buffering_(false) {
-  buffer_ = new char[buffer_size_];
-}
-
-BufferedReadAdapter::~BufferedReadAdapter() {
-  delete [] buffer_;
-}
-
-int BufferedReadAdapter::Send(const void *pv, size_t cb) {
-  if (buffering_) {
-    // TODO: Spoof error better; Signal Writeable
-    socket_->SetError(EWOULDBLOCK);
-    return -1;
-  }
-  return AsyncSocketAdapter::Send(pv, cb);
-}
-
-int BufferedReadAdapter::Recv(void* pv, size_t cb, int64_t* timestamp) {
-  if (buffering_) {
-    socket_->SetError(EWOULDBLOCK);
-    return -1;
-  }
-
-  size_t read = 0;
-
-  if (data_len_) {
-    read = std::min(cb, data_len_);
-    memcpy(pv, buffer_, read);
-    data_len_ -= read;
-    if (data_len_ > 0) {
-      memmove(buffer_, buffer_ + read, data_len_);
-    }
-    pv = static_cast<char *>(pv) + read;
-    cb -= read;
-  }
-
-  // FIX: If cb == 0, we won't generate another read event
-
-  int res = AsyncSocketAdapter::Recv(pv, cb, timestamp);
-  if (res >= 0) {
-    // Read from socket and possibly buffer; return combined length
-    return res + static_cast<int>(read);
-  }
-
-  if (read > 0) {
-    // Failed to read from socket, but still read something from buffer
-    return static_cast<int>(read);
-  }
-
-  // Didn't read anything; return error from socket
-  return res;
-}
-
-void BufferedReadAdapter::BufferInput(bool on) {
-  buffering_ = on;
-}
-
-void BufferedReadAdapter::OnReadEvent(AsyncSocket * socket) {
-  RTC_DCHECK(socket == socket_);
-
-  if (!buffering_) {
-    AsyncSocketAdapter::OnReadEvent(socket);
-    return;
-  }
-
-  if (data_len_ >= buffer_size_) {
-    LOG(INFO) << "Input buffer overflow";
-    RTC_NOTREACHED();
-    data_len_ = 0;
-  }
-
-  int len =
-      socket_->Recv(buffer_ + data_len_, buffer_size_ - data_len_, nullptr);
-  if (len < 0) {
-    // TODO: Do something better like forwarding the error to the user.
-    LOG_ERR(INFO) << "Recv";
-    return;
-  }
-
-  data_len_ += len;
-
-  ProcessInput(buffer_, &data_len_);
-}
-
-AsyncProxyServerSocket::AsyncProxyServerSocket(AsyncSocket* socket,
-                                               size_t buffer_size)
-    : BufferedReadAdapter(socket, buffer_size) {
-}
-
-AsyncProxyServerSocket::~AsyncProxyServerSocket() = default;
-
-///////////////////////////////////////////////////////////////////////////////
-
-// This is a SSL v2 CLIENT_HELLO message.
-// TODO: Should this have a session id? The response doesn't have a
-// certificate, so the hello should have a session id.
-static const uint8_t kSslClientHello[] = {
-    0x80, 0x46,                                            // msg len
-    0x01,                                                  // CLIENT_HELLO
-    0x03, 0x01,                                            // SSL 3.1
-    0x00, 0x2d,                                            // ciphersuite len
-    0x00, 0x00,                                            // session id len
-    0x00, 0x10,                                            // challenge len
-    0x01, 0x00, 0x80, 0x03, 0x00, 0x80, 0x07, 0x00, 0xc0,  // ciphersuites
-    0x06, 0x00, 0x40, 0x02, 0x00, 0x80, 0x04, 0x00, 0x80,  //
-    0x00, 0x00, 0x04, 0x00, 0xfe, 0xff, 0x00, 0x00, 0x0a,  //
-    0x00, 0xfe, 0xfe, 0x00, 0x00, 0x09, 0x00, 0x00, 0x64,  //
-    0x00, 0x00, 0x62, 0x00, 0x00, 0x03, 0x00, 0x00, 0x06,  //
-    0x1f, 0x17, 0x0c, 0xa6, 0x2f, 0x00, 0x78, 0xfc,        // challenge
-    0x46, 0x55, 0x2e, 0xb1, 0x83, 0x39, 0xf1, 0xea         //
-};
-
-// This is a TLSv1 SERVER_HELLO message.
-static const uint8_t kSslServerHello[] = {
-    0x16,                                            // handshake message
-    0x03, 0x01,                                      // SSL 3.1
-    0x00, 0x4a,                                      // message len
-    0x02,                                            // SERVER_HELLO
-    0x00, 0x00, 0x46,                                // handshake len
-    0x03, 0x01,                                      // SSL 3.1
-    0x42, 0x85, 0x45, 0xa7, 0x27, 0xa9, 0x5d, 0xa0,  // server random
-    0xb3, 0xc5, 0xe7, 0x53, 0xda, 0x48, 0x2b, 0x3f,  //
-    0xc6, 0x5a, 0xca, 0x89, 0xc1, 0x58, 0x52, 0xa1,  //
-    0x78, 0x3c, 0x5b, 0x17, 0x46, 0x00, 0x85, 0x3f,  //
-    0x20,                                            // session id len
-    0x0e, 0xd3, 0x06, 0x72, 0x5b, 0x5b, 0x1b, 0x5f,  // session id
-    0x15, 0xac, 0x13, 0xf9, 0x88, 0x53, 0x9d, 0x9b,  //
-    0xe8, 0x3d, 0x7b, 0x0c, 0x30, 0x32, 0x6e, 0x38,  //
-    0x4d, 0xa2, 0x75, 0x57, 0x41, 0x6c, 0x34, 0x5c,  //
-    0x00, 0x04,                                      // RSA/RC4-128/MD5
-    0x00                                             // null compression
-};
-
-AsyncSSLSocket::AsyncSSLSocket(AsyncSocket* socket)
-    : BufferedReadAdapter(socket, 1024) {
-}
-
-int AsyncSSLSocket::Connect(const SocketAddress& addr) {
-  // Begin buffering before we connect, so that there isn't a race condition
-  // between potential senders and receiving the OnConnectEvent signal
-  BufferInput(true);
-  return BufferedReadAdapter::Connect(addr);
-}
-
-void AsyncSSLSocket::OnConnectEvent(AsyncSocket * socket) {
-  RTC_DCHECK(socket == socket_);
-  // TODO: we could buffer output too...
-  const int res = DirectSend(kSslClientHello, sizeof(kSslClientHello));
-  RTC_DCHECK_EQ(sizeof(kSslClientHello), res);
-}
-
-void AsyncSSLSocket::ProcessInput(char* data, size_t* len) {
-  if (*len < sizeof(kSslServerHello))
-    return;
-
-  if (memcmp(kSslServerHello, data, sizeof(kSslServerHello)) != 0) {
-    Close();
-    SignalCloseEvent(this, 0);  // TODO: error code?
-    return;
-  }
-
-  *len -= sizeof(kSslServerHello);
-  if (*len > 0) {
-    memmove(data, data + sizeof(kSslServerHello), *len);
-  }
-
-  bool remainder = (*len > 0);
-  BufferInput(false);
-  SignalConnectEvent(this);
-
-  // FIX: if SignalConnect causes the socket to be destroyed, we are in trouble
-  if (remainder)
-    SignalReadEvent(this);
-}
-
-AsyncSSLServerSocket::AsyncSSLServerSocket(AsyncSocket* socket)
-     : BufferedReadAdapter(socket, 1024) {
-  BufferInput(true);
-}
-
-void AsyncSSLServerSocket::ProcessInput(char* data, size_t* len) {
-  // We only accept client hello messages.
-  if (*len < sizeof(kSslClientHello)) {
-    return;
-  }
-
-  if (memcmp(kSslClientHello, data, sizeof(kSslClientHello)) != 0) {
-    Close();
-    SignalCloseEvent(this, 0);
-    return;
-  }
-
-  *len -= sizeof(kSslClientHello);
-
-  // Clients should not send more data until the handshake is completed.
-  RTC_DCHECK(*len == 0);
-
-  // Send a server hello back to the client.
-  DirectSend(kSslServerHello, sizeof(kSslServerHello));
-
-  // Handshake completed for us, redirect input to our parent.
-  BufferInput(false);
-}
-
-///////////////////////////////////////////////////////////////////////////////
-
-AsyncHttpsProxySocket::AsyncHttpsProxySocket(AsyncSocket* socket,
-                                             const std::string& user_agent,
-                                             const SocketAddress& proxy,
-                                             const std::string& username,
-                                             const CryptString& password)
-  : BufferedReadAdapter(socket, 1024), proxy_(proxy), agent_(user_agent),
-    user_(username), pass_(password), force_connect_(false), state_(PS_ERROR),
-    context_(0) {
-}
-
-AsyncHttpsProxySocket::~AsyncHttpsProxySocket() {
-  delete context_;
-}
-
-int AsyncHttpsProxySocket::Connect(const SocketAddress& addr) {
-  int ret;
-  LOG(LS_VERBOSE) << "AsyncHttpsProxySocket::Connect("
-                  << proxy_.ToSensitiveString() << ")";
-  dest_ = addr;
-  state_ = PS_INIT;
-  if (ShouldIssueConnect()) {
-    BufferInput(true);
-  }
-  ret = BufferedReadAdapter::Connect(proxy_);
-  // TODO: Set state_ appropriately if Connect fails.
-  return ret;
-}
-
-SocketAddress AsyncHttpsProxySocket::GetRemoteAddress() const {
-  return dest_;
-}
-
-int AsyncHttpsProxySocket::Close() {
-  headers_.clear();
-  state_ = PS_ERROR;
-  dest_.Clear();
-  delete context_;
-  context_ = nullptr;
-  return BufferedReadAdapter::Close();
-}
-
-Socket::ConnState AsyncHttpsProxySocket::GetState() const {
-  if (state_ < PS_TUNNEL) {
-    return CS_CONNECTING;
-  } else if (state_ == PS_TUNNEL) {
-    return CS_CONNECTED;
-  } else {
-    return CS_CLOSED;
-  }
-}
-
-void AsyncHttpsProxySocket::OnConnectEvent(AsyncSocket * socket) {
-  LOG(LS_VERBOSE) << "AsyncHttpsProxySocket::OnConnectEvent";
-  if (!ShouldIssueConnect()) {
-    state_ = PS_TUNNEL;
-    BufferedReadAdapter::OnConnectEvent(socket);
-    return;
-  }
-  SendRequest();
-}
-
-void AsyncHttpsProxySocket::OnCloseEvent(AsyncSocket * socket, int err) {
-  LOG(LS_VERBOSE) << "AsyncHttpsProxySocket::OnCloseEvent(" << err << ")";
-  if ((state_ == PS_WAIT_CLOSE) && (err == 0)) {
-    state_ = PS_ERROR;
-    Connect(dest_);
-  } else {
-    BufferedReadAdapter::OnCloseEvent(socket, err);
-  }
-}
-
-void AsyncHttpsProxySocket::ProcessInput(char* data, size_t* len) {
-  size_t start = 0;
-  for (size_t pos = start; state_ < PS_TUNNEL && pos < *len;) {
-    if (state_ == PS_SKIP_BODY) {
-      size_t consume = std::min(*len - pos, content_length_);
-      pos += consume;
-      start = pos;
-      content_length_ -= consume;
-      if (content_length_ == 0) {
-        EndResponse();
-      }
-      continue;
-    }
-
-    if (data[pos++] != '\n')
-      continue;
-
-    size_t len = pos - start - 1;
-    if ((len > 0) && (data[start + len - 1] == '\r'))
-      --len;
-
-    data[start + len] = 0;
-    ProcessLine(data + start, len);
-    start = pos;
-  }
-
-  *len -= start;
-  if (*len > 0) {
-    memmove(data, data + start, *len);
-  }
-
-  if (state_ != PS_TUNNEL)
-    return;
-
-  bool remainder = (*len > 0);
-  BufferInput(false);
-  SignalConnectEvent(this);
-
-  // FIX: if SignalConnect causes the socket to be destroyed, we are in trouble
-  if (remainder)
-    SignalReadEvent(this);  // TODO: signal this??
-}
-
-bool AsyncHttpsProxySocket::ShouldIssueConnect() const {
-  // TODO: Think about whether a more sophisticated test
-  // than dest port == 80 is needed.
-  return force_connect_ || (dest_.port() != 80);
-}
-
-void AsyncHttpsProxySocket::SendRequest() {
-  std::stringstream ss;
-  ss << "CONNECT " << dest_.ToString() << " HTTP/1.0\r\n";
-  ss << "User-Agent: " << agent_ << "\r\n";
-  ss << "Host: " << dest_.HostAsURIString() << "\r\n";
-  ss << "Content-Length: 0\r\n";
-  ss << "Proxy-Connection: Keep-Alive\r\n";
-  ss << headers_;
-  ss << "\r\n";
-  std::string str = ss.str();
-  DirectSend(str.c_str(), str.size());
-  state_ = PS_LEADER;
-  expect_close_ = true;
-  content_length_ = 0;
-  headers_.clear();
-
-  LOG(LS_VERBOSE) << "AsyncHttpsProxySocket >> " << str;
-}
-
-void AsyncHttpsProxySocket::ProcessLine(char * data, size_t len) {
-  LOG(LS_VERBOSE) << "AsyncHttpsProxySocket << " << data;
-
-  if (len == 0) {
-    if (state_ == PS_TUNNEL_HEADERS) {
-      state_ = PS_TUNNEL;
-    } else if (state_ == PS_ERROR_HEADERS) {
-      Error(defer_error_);
-      return;
-    } else if (state_ == PS_SKIP_HEADERS) {
-      if (content_length_) {
-        state_ = PS_SKIP_BODY;
-      } else {
-        EndResponse();
-        return;
-      }
-    } else {
-      static bool report = false;
-      if (!unknown_mechanisms_.empty() && !report) {
-        report = true;
-        std::string msg(
-          "Unable to connect to the Google Talk service due to an incompatibility "
-          "with your proxy.\r\nPlease help us resolve this issue by submitting the "
-          "following information to us using our technical issue submission form "
-          "at:\r\n\r\n"
-          "http://www.google.com/support/talk/bin/request.py\r\n\r\n"
-          "We apologize for the inconvenience.\r\n\r\n"
-          "Information to submit to Google: "
-          );
-        //std::string msg("Please report the following information to foo@bar.com:\r\nUnknown methods: ");
-        msg.append(unknown_mechanisms_);
-#if defined(WEBRTC_WIN)
-        MessageBoxA(0, msg.c_str(), "Oops!", MB_OK);
-#endif
-#if defined(WEBRTC_POSIX)
-        // TODO: Raise a signal so the UI can be separated.
-        LOG(LS_ERROR) << "Oops!\n\n" << msg;
-#endif
-      }
-      // Unexpected end of headers
-      Error(0);
-      return;
-    }
-  } else if (state_ == PS_LEADER) {
-    unsigned int code;
-    if (sscanf(data, "HTTP/%*u.%*u %u", &code) != 1) {
-      Error(0);
-      return;
-    }
-    switch (code) {
-    case 200:
-      // connection good!
-      state_ = PS_TUNNEL_HEADERS;
-      return;
-#if defined(HTTP_STATUS_PROXY_AUTH_REQ) && (HTTP_STATUS_PROXY_AUTH_REQ != 407)
-#error Wrong code for HTTP_STATUS_PROXY_AUTH_REQ
-#endif
-    case 407:  // HTTP_STATUS_PROXY_AUTH_REQ
-      state_ = PS_AUTHENTICATE;
-      return;
-    default:
-      defer_error_ = 0;
-      state_ = PS_ERROR_HEADERS;
-      return;
-    }
-  } else if ((state_ == PS_AUTHENTICATE)
-             && (_strnicmp(data, "Proxy-Authenticate:", 19) == 0)) {
-    std::string response, auth_method;
-    switch (HttpAuthenticate(data + 19, len - 19,
-                             proxy_, "CONNECT", "/",
-                             user_, pass_, context_, response, auth_method)) {
-    case HAR_IGNORE:
-      LOG(LS_VERBOSE) << "Ignoring Proxy-Authenticate: " << auth_method;
-      if (!unknown_mechanisms_.empty())
-        unknown_mechanisms_.append(", ");
-      unknown_mechanisms_.append(auth_method);
-      break;
-    case HAR_RESPONSE:
-      headers_ = "Proxy-Authorization: ";
-      headers_.append(response);
-      headers_.append("\r\n");
-      state_ = PS_SKIP_HEADERS;
-      unknown_mechanisms_.clear();
-      break;
-    case HAR_CREDENTIALS:
-      defer_error_ = SOCKET_EACCES;
-      state_ = PS_ERROR_HEADERS;
-      unknown_mechanisms_.clear();
-      break;
-    case HAR_ERROR:
-      defer_error_ = 0;
-      state_ = PS_ERROR_HEADERS;
-      unknown_mechanisms_.clear();
-      break;
-    }
-  } else if (_strnicmp(data, "Content-Length:", 15) == 0) {
-    content_length_ = strtoul(data + 15, 0, 0);
-  } else if (_strnicmp(data, "Proxy-Connection: Keep-Alive", 28) == 0) {
-    expect_close_ = false;
-    /*
-  } else if (_strnicmp(data, "Connection: close", 17) == 0) {
-    expect_close_ = true;
-    */
-  }
-}
-
-void AsyncHttpsProxySocket::EndResponse() {
-  if (!expect_close_) {
-    SendRequest();
-    return;
-  }
-
-  // No point in waiting for the server to close... let's close now
-  // TODO: Refactor out PS_WAIT_CLOSE
-  state_ = PS_WAIT_CLOSE;
-  BufferedReadAdapter::Close();
-  OnCloseEvent(this, 0);
-}
-
-void AsyncHttpsProxySocket::Error(int error) {
-  BufferInput(false);
-  Close();
-  SetError(error);
-  SignalCloseEvent(this, error);
-}
-
-///////////////////////////////////////////////////////////////////////////////
-
-AsyncSocksProxySocket::AsyncSocksProxySocket(AsyncSocket* socket,
-                                             const SocketAddress& proxy,
-                                             const std::string& username,
-                                             const CryptString& password)
-    : BufferedReadAdapter(socket, 1024), state_(SS_ERROR), proxy_(proxy),
-      user_(username), pass_(password) {
-}
-
-AsyncSocksProxySocket::~AsyncSocksProxySocket() = default;
-
-int AsyncSocksProxySocket::Connect(const SocketAddress& addr) {
-  int ret;
-  dest_ = addr;
-  state_ = SS_INIT;
-  BufferInput(true);
-  ret = BufferedReadAdapter::Connect(proxy_);
-  // TODO: Set state_ appropriately if Connect fails.
-  return ret;
-}
-
-SocketAddress AsyncSocksProxySocket::GetRemoteAddress() const {
-  return dest_;
-}
-
-int AsyncSocksProxySocket::Close() {
-  state_ = SS_ERROR;
-  dest_.Clear();
-  return BufferedReadAdapter::Close();
-}
-
-Socket::ConnState AsyncSocksProxySocket::GetState() const {
-  if (state_ < SS_TUNNEL) {
-    return CS_CONNECTING;
-  } else if (state_ == SS_TUNNEL) {
-    return CS_CONNECTED;
-  } else {
-    return CS_CLOSED;
-  }
-}
-
-void AsyncSocksProxySocket::OnConnectEvent(AsyncSocket* socket) {
-  SendHello();
-}
-
-void AsyncSocksProxySocket::ProcessInput(char* data, size_t* len) {
-  RTC_DCHECK(state_ < SS_TUNNEL);
-
-  ByteBufferReader response(data, *len);
-
-  if (state_ == SS_HELLO) {
-    uint8_t ver, method;
-    if (!response.ReadUInt8(&ver) ||
-        !response.ReadUInt8(&method))
-      return;
-
-    if (ver != 5) {
-      Error(0);
-      return;
-    }
-
-    if (method == 0) {
-      SendConnect();
-    } else if (method == 2) {
-      SendAuth();
-    } else {
-      Error(0);
-      return;
-    }
-  } else if (state_ == SS_AUTH) {
-    uint8_t ver, status;
-    if (!response.ReadUInt8(&ver) ||
-        !response.ReadUInt8(&status))
-      return;
-
-    if ((ver != 1) || (status != 0)) {
-      Error(SOCKET_EACCES);
-      return;
-    }
-
-    SendConnect();
-  } else if (state_ == SS_CONNECT) {
-    uint8_t ver, rep, rsv, atyp;
-    if (!response.ReadUInt8(&ver) ||
-        !response.ReadUInt8(&rep) ||
-        !response.ReadUInt8(&rsv) ||
-        !response.ReadUInt8(&atyp))
-      return;
-
-    if ((ver != 5) || (rep != 0)) {
-      Error(0);
-      return;
-    }
-
-    uint16_t port;
-    if (atyp == 1) {
-      uint32_t addr;
-      if (!response.ReadUInt32(&addr) ||
-          !response.ReadUInt16(&port))
-        return;
-      LOG(LS_VERBOSE) << "Bound on " << addr << ":" << port;
-    } else if (atyp == 3) {
-      uint8_t len;
-      std::string addr;
-      if (!response.ReadUInt8(&len) ||
-          !response.ReadString(&addr, len) ||
-          !response.ReadUInt16(&port))
-        return;
-      LOG(LS_VERBOSE) << "Bound on " << addr << ":" << port;
-    } else if (atyp == 4) {
-      std::string addr;
-      if (!response.ReadString(&addr, 16) ||
-          !response.ReadUInt16(&port))
-        return;
-      LOG(LS_VERBOSE) << "Bound on <IPV6>:" << port;
-    } else {
-      Error(0);
-      return;
-    }
-
-    state_ = SS_TUNNEL;
-  }
-
-  // Consume parsed data
-  *len = response.Length();
-  memmove(data, response.Data(), *len);
-
-  if (state_ != SS_TUNNEL)
-    return;
-
-  bool remainder = (*len > 0);
-  BufferInput(false);
-  SignalConnectEvent(this);
-
-  // FIX: if SignalConnect causes the socket to be destroyed, we are in trouble
-  if (remainder)
-    SignalReadEvent(this);  // TODO: signal this??
-}
-
-void AsyncSocksProxySocket::SendHello() {
-  ByteBufferWriter request;
-  request.WriteUInt8(5);    // Socks Version
-  if (user_.empty()) {
-    request.WriteUInt8(1);  // Authentication Mechanisms
-    request.WriteUInt8(0);  // No authentication
-  } else {
-    request.WriteUInt8(2);  // Authentication Mechanisms
-    request.WriteUInt8(0);  // No authentication
-    request.WriteUInt8(2);  // Username/Password
-  }
-  DirectSend(request.Data(), request.Length());
-  state_ = SS_HELLO;
-}
-
-void AsyncSocksProxySocket::SendAuth() {
-  ByteBufferWriter request;
-  request.WriteUInt8(1);           // Negotiation Version
-  request.WriteUInt8(static_cast<uint8_t>(user_.size()));
-  request.WriteString(user_);      // Username
-  request.WriteUInt8(static_cast<uint8_t>(pass_.GetLength()));
-  size_t len = pass_.GetLength() + 1;
-  char * sensitive = new char[len];
-  pass_.CopyTo(sensitive, true);
-  request.WriteString(sensitive);  // Password
-  memset(sensitive, 0, len);
-  delete [] sensitive;
-  DirectSend(request.Data(), request.Length());
-  state_ = SS_AUTH;
-}
-
-void AsyncSocksProxySocket::SendConnect() {
-  ByteBufferWriter request;
-  request.WriteUInt8(5);              // Socks Version
-  request.WriteUInt8(1);              // CONNECT
-  request.WriteUInt8(0);              // Reserved
-  if (dest_.IsUnresolvedIP()) {
-    std::string hostname = dest_.hostname();
-    request.WriteUInt8(3);            // DOMAINNAME
-    request.WriteUInt8(static_cast<uint8_t>(hostname.size()));
-    request.WriteString(hostname);    // Destination Hostname
-  } else {
-    request.WriteUInt8(1);            // IPV4
-    request.WriteUInt32(dest_.ip());  // Destination IP
-  }
-  request.WriteUInt16(dest_.port());  // Destination Port
-  DirectSend(request.Data(), request.Length());
-  state_ = SS_CONNECT;
-}
-
-void AsyncSocksProxySocket::Error(int error) {
-  state_ = SS_ERROR;
-  BufferInput(false);
-  Close();
-  SetError(SOCKET_EACCES);
-  SignalCloseEvent(this, error);
-}
-
-AsyncSocksProxyServerSocket::AsyncSocksProxyServerSocket(AsyncSocket* socket)
-    : AsyncProxyServerSocket(socket, kBufferSize), state_(SS_HELLO) {
-  BufferInput(true);
-}
-
-void AsyncSocksProxyServerSocket::ProcessInput(char* data, size_t* len) {
-  // TODO: See if the whole message has arrived
-  RTC_DCHECK(state_ < SS_CONNECT_PENDING);
-
-  ByteBufferReader response(data, *len);
-  if (state_ == SS_HELLO) {
-    HandleHello(&response);
-  } else if (state_ == SS_AUTH) {
-    HandleAuth(&response);
-  } else if (state_ == SS_CONNECT) {
-    HandleConnect(&response);
-  }
-
-  // Consume parsed data
-  *len = response.Length();
-  memmove(data, response.Data(), *len);
-}
-
-void AsyncSocksProxyServerSocket::DirectSend(const ByteBufferWriter& buf) {
-  BufferedReadAdapter::DirectSend(buf.Data(), buf.Length());
-}
-
-void AsyncSocksProxyServerSocket::HandleHello(ByteBufferReader* request) {
-  uint8_t ver, num_methods;
-  if (!request->ReadUInt8(&ver) ||
-      !request->ReadUInt8(&num_methods)) {
-    Error(0);
-    return;
-  }
-
-  if (ver != 5) {
-    Error(0);
-    return;
-  }
-
-  // Handle either no-auth (0) or user/pass auth (2)
-  uint8_t method = 0xFF;
-  if (num_methods > 0 && !request->ReadUInt8(&method)) {
-    Error(0);
-    return;
-  }
-
-  // TODO: Ask the server which method to use.
-  SendHelloReply(method);
-  if (method == 0) {
-    state_ = SS_CONNECT;
-  } else if (method == 2) {
-    state_ = SS_AUTH;
-  } else {
-    state_ = SS_ERROR;
-  }
-}
-
-void AsyncSocksProxyServerSocket::SendHelloReply(uint8_t method) {
-  ByteBufferWriter response;
-  response.WriteUInt8(5);  // Socks Version
-  response.WriteUInt8(method);  // Auth method
-  DirectSend(response);
-}
-
-void AsyncSocksProxyServerSocket::HandleAuth(ByteBufferReader* request) {
-  uint8_t ver, user_len, pass_len;
-  std::string user, pass;
-  if (!request->ReadUInt8(&ver) ||
-      !request->ReadUInt8(&user_len) ||
-      !request->ReadString(&user, user_len) ||
-      !request->ReadUInt8(&pass_len) ||
-      !request->ReadString(&pass, pass_len)) {
-    Error(0);
-    return;
-  }
-
-  // TODO: Allow for checking of credentials.
-  SendAuthReply(0);
-  state_ = SS_CONNECT;
-}
-
-void AsyncSocksProxyServerSocket::SendAuthReply(uint8_t result) {
-  ByteBufferWriter response;
-  response.WriteUInt8(1);  // Negotiation Version
-  response.WriteUInt8(result);
-  DirectSend(response);
-}
-
-void AsyncSocksProxyServerSocket::HandleConnect(ByteBufferReader* request) {
-  uint8_t ver, command, reserved, addr_type;
-  uint32_t ip;
-  uint16_t port;
-  if (!request->ReadUInt8(&ver) ||
-      !request->ReadUInt8(&command) ||
-      !request->ReadUInt8(&reserved) ||
-      !request->ReadUInt8(&addr_type) ||
-      !request->ReadUInt32(&ip) ||
-      !request->ReadUInt16(&port)) {
-      Error(0);
-      return;
-  }
-
-  if (ver != 5 || command != 1 ||
-      reserved != 0 || addr_type != 1) {
-      Error(0);
-      return;
-  }
-
-  SignalConnectRequest(this, SocketAddress(ip, port));
-  state_ = SS_CONNECT_PENDING;
-}
-
-void AsyncSocksProxyServerSocket::SendConnectResult(int result,
-                                                    const SocketAddress& addr) {
-  if (state_ != SS_CONNECT_PENDING)
-    return;
-
-  ByteBufferWriter response;
-  response.WriteUInt8(5);  // Socks version
-  response.WriteUInt8((result != 0));  // 0x01 is generic error
-  response.WriteUInt8(0);  // reserved
-  response.WriteUInt8(1);  // IPv4 address
-  response.WriteUInt32(addr.ip());
-  response.WriteUInt16(addr.port());
-  DirectSend(response);
-  BufferInput(false);
-  state_ = SS_TUNNEL;
-}
-
-void AsyncSocksProxyServerSocket::Error(int error) {
-  state_ = SS_ERROR;
-  BufferInput(false);
-  Close();
-  SetError(SOCKET_EACCES);
-  SignalCloseEvent(this, error);
-}
-
-}  // namespace rtc
diff --git a/rtc_base/socketadapters.h b/rtc_base/socketadapters.h
deleted file mode 100644
index 34dd19b..0000000
--- a/rtc_base/socketadapters.h
+++ /dev/null
@@ -1,207 +0,0 @@
-/*
- *  Copyright 2004 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_RTC_BASE_SOCKETADAPTERS_H_
-#define WEBRTC_RTC_BASE_SOCKETADAPTERS_H_
-
-#include <map>
-#include <string>
-
-#include "webrtc/rtc_base/asyncsocket.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/cryptstring.h"
-#include "webrtc/rtc_base/logging.h"
-
-namespace rtc {
-
-struct HttpAuthContext;
-class ByteBufferReader;
-class ByteBufferWriter;
-
-///////////////////////////////////////////////////////////////////////////////
-
-// Implements a socket adapter that can buffer and process data internally,
-// as in the case of connecting to a proxy, where you must speak the proxy
-// protocol before commencing normal socket behavior.
-class BufferedReadAdapter : public AsyncSocketAdapter {
- public:
-  BufferedReadAdapter(AsyncSocket* socket, size_t buffer_size);
-  ~BufferedReadAdapter() override;
-
-  int Send(const void* pv, size_t cb) override;
-  int Recv(void* pv, size_t cb, int64_t* timestamp) override;
-
- protected:
-  int DirectSend(const void* pv, size_t cb) {
-    return AsyncSocketAdapter::Send(pv, cb);
-  }
-
-  void BufferInput(bool on = true);
-  virtual void ProcessInput(char* data, size_t* len) = 0;
-
-  void OnReadEvent(AsyncSocket* socket) override;
-
- private:
-  char * buffer_;
-  size_t buffer_size_, data_len_;
-  bool buffering_;
-  RTC_DISALLOW_COPY_AND_ASSIGN(BufferedReadAdapter);
-};
-
-///////////////////////////////////////////////////////////////////////////////
-
-// Interface for implementing proxy server sockets.
-class AsyncProxyServerSocket : public BufferedReadAdapter {
- public:
-  AsyncProxyServerSocket(AsyncSocket* socket, size_t buffer_size);
-  ~AsyncProxyServerSocket() override;
-  sigslot::signal2<AsyncProxyServerSocket*,
-                   const SocketAddress&>  SignalConnectRequest;
-  virtual void SendConnectResult(int err, const SocketAddress& addr) = 0;
-};
-
-///////////////////////////////////////////////////////////////////////////////
-
-// Implements a socket adapter that performs the client side of a
-// fake SSL handshake. Used for "ssltcp" P2P functionality.
-class AsyncSSLSocket : public BufferedReadAdapter {
- public:
-  explicit AsyncSSLSocket(AsyncSocket* socket);
-
-  int Connect(const SocketAddress& addr) override;
-
- protected:
-  void OnConnectEvent(AsyncSocket* socket) override;
-  void ProcessInput(char* data, size_t* len) override;
-  RTC_DISALLOW_COPY_AND_ASSIGN(AsyncSSLSocket);
-};
-
-// Implements a socket adapter that performs the server side of a
-// fake SSL handshake. Used when implementing a relay server that does "ssltcp".
-class AsyncSSLServerSocket : public BufferedReadAdapter {
- public:
-  explicit AsyncSSLServerSocket(AsyncSocket* socket);
-
- protected:
-  void ProcessInput(char* data, size_t* len) override;
-  RTC_DISALLOW_COPY_AND_ASSIGN(AsyncSSLServerSocket);
-};
-
-///////////////////////////////////////////////////////////////////////////////
-
-// Implements a socket adapter that speaks the HTTP/S proxy protocol.
-class AsyncHttpsProxySocket : public BufferedReadAdapter {
- public:
-  AsyncHttpsProxySocket(AsyncSocket* socket, const std::string& user_agent,
-    const SocketAddress& proxy,
-    const std::string& username, const CryptString& password);
-  ~AsyncHttpsProxySocket() override;
-
-  // If connect is forced, the adapter will always issue an HTTP CONNECT to the
-  // target address.  Otherwise, it will connect only if the destination port
-  // is not port 80.
-  void SetForceConnect(bool force) { force_connect_ = force; }
-
-  int Connect(const SocketAddress& addr) override;
-  SocketAddress GetRemoteAddress() const override;
-  int Close() override;
-  ConnState GetState() const override;
-
- protected:
-  void OnConnectEvent(AsyncSocket* socket) override;
-  void OnCloseEvent(AsyncSocket* socket, int err) override;
-  void ProcessInput(char* data, size_t* len) override;
-
-  bool ShouldIssueConnect() const;
-  void SendRequest();
-  void ProcessLine(char* data, size_t len);
-  void EndResponse();
-  void Error(int error);
-
- private:
-  SocketAddress proxy_, dest_;
-  std::string agent_, user_, headers_;
-  CryptString pass_;
-  bool force_connect_;
-  size_t content_length_;
-  int defer_error_;
-  bool expect_close_;
-  enum ProxyState {
-    PS_INIT, PS_LEADER, PS_AUTHENTICATE, PS_SKIP_HEADERS, PS_ERROR_HEADERS,
-    PS_TUNNEL_HEADERS, PS_SKIP_BODY, PS_TUNNEL, PS_WAIT_CLOSE, PS_ERROR
-  } state_;
-  HttpAuthContext * context_;
-  std::string unknown_mechanisms_;
-  RTC_DISALLOW_COPY_AND_ASSIGN(AsyncHttpsProxySocket);
-};
-
-///////////////////////////////////////////////////////////////////////////////
-
-// Implements a socket adapter that speaks the SOCKS proxy protocol.
-class AsyncSocksProxySocket : public BufferedReadAdapter {
- public:
-  AsyncSocksProxySocket(AsyncSocket* socket, const SocketAddress& proxy,
-    const std::string& username, const CryptString& password);
-  ~AsyncSocksProxySocket() override;
-
-  int Connect(const SocketAddress& addr) override;
-  SocketAddress GetRemoteAddress() const override;
-  int Close() override;
-  ConnState GetState() const override;
-
- protected:
-  void OnConnectEvent(AsyncSocket* socket) override;
-  void ProcessInput(char* data, size_t* len) override;
-
-  void SendHello();
-  void SendConnect();
-  void SendAuth();
-  void Error(int error);
-
- private:
-  enum State {
-    SS_INIT, SS_HELLO, SS_AUTH, SS_CONNECT, SS_TUNNEL, SS_ERROR
-  };
-  State state_;
-  SocketAddress proxy_, dest_;
-  std::string user_;
-  CryptString pass_;
-  RTC_DISALLOW_COPY_AND_ASSIGN(AsyncSocksProxySocket);
-};
-
-// Implements a proxy server socket for the SOCKS protocol.
-class AsyncSocksProxyServerSocket : public AsyncProxyServerSocket {
- public:
-  explicit AsyncSocksProxyServerSocket(AsyncSocket* socket);
-
- private:
-  void ProcessInput(char* data, size_t* len) override;
-  void DirectSend(const ByteBufferWriter& buf);
-
-  void HandleHello(ByteBufferReader* request);
-  void SendHelloReply(uint8_t method);
-  void HandleAuth(ByteBufferReader* request);
-  void SendAuthReply(uint8_t result);
-  void HandleConnect(ByteBufferReader* request);
-  void SendConnectResult(int result, const SocketAddress& addr) override;
-
-  void Error(int error);
-
-  static const int kBufferSize = 1024;
-  enum State {
-    SS_HELLO, SS_AUTH, SS_CONNECT, SS_CONNECT_PENDING, SS_TUNNEL, SS_ERROR
-  };
-  State state_;
-  RTC_DISALLOW_COPY_AND_ASSIGN(AsyncSocksProxyServerSocket);
-};
-
-}  // namespace rtc
-
-#endif  // WEBRTC_RTC_BASE_SOCKETADAPTERS_H_
diff --git a/rtc_base/socketaddress.cc b/rtc_base/socketaddress.cc
deleted file mode 100644
index 8808414..0000000
--- a/rtc_base/socketaddress.cc
+++ /dev/null
@@ -1,339 +0,0 @@
-/*
- *  Copyright 2004 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/rtc_base/socketaddress.h"
-#include "webrtc/rtc_base/safe_conversions.h"
-
-#if defined(WEBRTC_POSIX)
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#if defined(OPENBSD)
-#include <netinet/in_systm.h>
-#endif
-#if !defined(__native_client__)
-#include <netinet/ip.h>
-#endif
-#include <arpa/inet.h>
-#include <netdb.h>
-#include <unistd.h>
-#endif
-
-#include <sstream>
-
-#include "webrtc/rtc_base/byteorder.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/nethelpers.h"
-
-#if defined(WEBRTC_WIN)
-#include "webrtc/rtc_base/win32.h"
-#endif
-
-namespace rtc {
-
-SocketAddress::SocketAddress() {
-  Clear();
-}
-
-SocketAddress::SocketAddress(const std::string& hostname, int port) {
-  SetIP(hostname);
-  SetPort(port);
-}
-
-SocketAddress::SocketAddress(uint32_t ip_as_host_order_integer, int port) {
-  SetIP(IPAddress(ip_as_host_order_integer));
-  SetPort(port);
-}
-
-SocketAddress::SocketAddress(const IPAddress& ip, int port) {
-  SetIP(ip);
-  SetPort(port);
-}
-
-SocketAddress::SocketAddress(const SocketAddress& addr) {
-  this->operator=(addr);
-}
-
-void SocketAddress::Clear() {
-  hostname_.clear();
-  literal_ = false;
-  ip_ = IPAddress();
-  port_ = 0;
-  scope_id_ = 0;
-}
-
-bool SocketAddress::IsNil() const {
-  return hostname_.empty() && IPIsUnspec(ip_) && 0 == port_;
-}
-
-bool SocketAddress::IsComplete() const {
-  return (!IPIsAny(ip_)) && (0 != port_);
-}
-
-SocketAddress& SocketAddress::operator=(const SocketAddress& addr) {
-  hostname_ = addr.hostname_;
-  ip_ = addr.ip_;
-  port_ = addr.port_;
-  literal_ = addr.literal_;
-  scope_id_ = addr.scope_id_;
-  return *this;
-}
-
-void SocketAddress::SetIP(uint32_t ip_as_host_order_integer) {
-  hostname_.clear();
-  literal_ = false;
-  ip_ = IPAddress(ip_as_host_order_integer);
-  scope_id_ = 0;
-}
-
-void SocketAddress::SetIP(const IPAddress& ip) {
-  hostname_.clear();
-  literal_ = false;
-  ip_ = ip;
-  scope_id_ = 0;
-}
-
-void SocketAddress::SetIP(const std::string& hostname) {
-  hostname_ = hostname;
-  literal_ = IPFromString(hostname, &ip_);
-  if (!literal_) {
-    ip_ = IPAddress();
-  }
-  scope_id_ = 0;
-}
-
-void SocketAddress::SetResolvedIP(uint32_t ip_as_host_order_integer) {
-  ip_ = IPAddress(ip_as_host_order_integer);
-  scope_id_ = 0;
-}
-
-void SocketAddress::SetResolvedIP(const IPAddress& ip) {
-  ip_ = ip;
-  scope_id_ = 0;
-}
-
-void SocketAddress::SetPort(int port) {
-  port_ = rtc::dchecked_cast<uint16_t>(port);
-}
-
-uint32_t SocketAddress::ip() const {
-  return ip_.v4AddressAsHostOrderInteger();
-}
-
-const IPAddress& SocketAddress::ipaddr() const {
-  return ip_;
-}
-
-uint16_t SocketAddress::port() const {
-  return port_;
-}
-
-std::string SocketAddress::HostAsURIString() const {
-  // If the hostname was a literal IP string, it may need to have square
-  // brackets added (for SocketAddress::ToString()).
-  if (!literal_ && !hostname_.empty())
-    return hostname_;
-  if (ip_.family() == AF_INET6) {
-    return "[" + ip_.ToString() + "]";
-  } else {
-    return ip_.ToString();
-  }
-}
-
-std::string SocketAddress::HostAsSensitiveURIString() const {
-  // If the hostname was a literal IP string, it may need to have square
-  // brackets added (for SocketAddress::ToString()).
-  if (!literal_ && !hostname_.empty())
-    return hostname_;
-  if (ip_.family() == AF_INET6) {
-    return "[" + ip_.ToSensitiveString() + "]";
-  } else {
-    return ip_.ToSensitiveString();
-  }
-}
-
-std::string SocketAddress::PortAsString() const {
-  std::ostringstream ost;
-  ost << port_;
-  return ost.str();
-}
-
-std::string SocketAddress::ToString() const {
-  std::ostringstream ost;
-  ost << *this;
-  return ost.str();
-}
-
-std::string SocketAddress::ToSensitiveString() const {
-  std::ostringstream ost;
-  ost << HostAsSensitiveURIString() << ":" << port();
-  return ost.str();
-}
-
-bool SocketAddress::FromString(const std::string& str) {
-  if (str.at(0) == '[') {
-    std::string::size_type closebracket = str.rfind(']');
-    if (closebracket != std::string::npos) {
-      std::string::size_type colon = str.find(':', closebracket);
-      if (colon != std::string::npos && colon > closebracket) {
-        SetPort(strtoul(str.substr(colon + 1).c_str(), nullptr, 10));
-        SetIP(str.substr(1, closebracket - 1));
-      } else {
-        return false;
-      }
-    }
-  } else {
-    std::string::size_type pos = str.find(':');
-    if (std::string::npos == pos)
-      return false;
-    SetPort(strtoul(str.substr(pos + 1).c_str(), nullptr, 10));
-    SetIP(str.substr(0, pos));
-  }
-  return true;
-}
-
-std::ostream& operator<<(std::ostream& os, const SocketAddress& addr) {
-  os << addr.HostAsURIString() << ":" << addr.port();
-  return os;
-}
-
-bool SocketAddress::IsAnyIP() const {
-  return IPIsAny(ip_);
-}
-
-bool SocketAddress::IsLoopbackIP() const {
-  return IPIsLoopback(ip_) || (IPIsAny(ip_) &&
-                               0 == strcmp(hostname_.c_str(), "localhost"));
-}
-
-bool SocketAddress::IsPrivateIP() const {
-  return IPIsPrivate(ip_);
-}
-
-bool SocketAddress::IsUnresolvedIP() const {
-  return IPIsUnspec(ip_) && !literal_ && !hostname_.empty();
-}
-
-bool SocketAddress::operator==(const SocketAddress& addr) const {
-  return EqualIPs(addr) && EqualPorts(addr);
-}
-
-bool SocketAddress::operator<(const SocketAddress& addr) const {
-  if (ip_ != addr.ip_)
-    return ip_ < addr.ip_;
-
-  // We only check hostnames if both IPs are ANY or unspecified.  This matches
-  // EqualIPs().
-  if ((IPIsAny(ip_) || IPIsUnspec(ip_)) && hostname_ != addr.hostname_)
-    return hostname_ < addr.hostname_;
-
-  return port_ < addr.port_;
-}
-
-bool SocketAddress::EqualIPs(const SocketAddress& addr) const {
-  return (ip_ == addr.ip_) &&
-      ((!IPIsAny(ip_) && !IPIsUnspec(ip_)) || (hostname_ == addr.hostname_));
-}
-
-bool SocketAddress::EqualPorts(const SocketAddress& addr) const {
-  return (port_ == addr.port_);
-}
-
-size_t SocketAddress::Hash() const {
-  size_t h = 0;
-  h ^= HashIP(ip_);
-  h ^= port_ | (port_ << 16);
-  return h;
-}
-
-void SocketAddress::ToSockAddr(sockaddr_in* saddr) const {
-  memset(saddr, 0, sizeof(*saddr));
-  if (ip_.family() != AF_INET) {
-    saddr->sin_family = AF_UNSPEC;
-    return;
-  }
-  saddr->sin_family = AF_INET;
-  saddr->sin_port = HostToNetwork16(port_);
-  if (IPIsAny(ip_)) {
-    saddr->sin_addr.s_addr = INADDR_ANY;
-  } else {
-    saddr->sin_addr = ip_.ipv4_address();
-  }
-}
-
-bool SocketAddress::FromSockAddr(const sockaddr_in& saddr) {
-  if (saddr.sin_family != AF_INET)
-    return false;
-  SetIP(NetworkToHost32(saddr.sin_addr.s_addr));
-  SetPort(NetworkToHost16(saddr.sin_port));
-  literal_ = false;
-  return true;
-}
-
-static size_t ToSockAddrStorageHelper(sockaddr_storage* addr,
-                                      IPAddress ip,
-                                      uint16_t port,
-                                      int scope_id) {
-  memset(addr, 0, sizeof(sockaddr_storage));
-  addr->ss_family = static_cast<unsigned short>(ip.family());
-  if (addr->ss_family == AF_INET6) {
-    sockaddr_in6* saddr = reinterpret_cast<sockaddr_in6*>(addr);
-    saddr->sin6_addr = ip.ipv6_address();
-    saddr->sin6_port = HostToNetwork16(port);
-    saddr->sin6_scope_id = scope_id;
-    return sizeof(sockaddr_in6);
-  } else if (addr->ss_family == AF_INET) {
-    sockaddr_in* saddr = reinterpret_cast<sockaddr_in*>(addr);
-    saddr->sin_addr = ip.ipv4_address();
-    saddr->sin_port = HostToNetwork16(port);
-    return sizeof(sockaddr_in);
-  }
-  return 0;
-}
-
-size_t SocketAddress::ToDualStackSockAddrStorage(sockaddr_storage *addr) const {
-  return ToSockAddrStorageHelper(addr, ip_.AsIPv6Address(), port_, scope_id_);
-}
-
-size_t SocketAddress::ToSockAddrStorage(sockaddr_storage* addr) const {
-  return ToSockAddrStorageHelper(addr, ip_, port_, scope_id_);
-}
-
-bool SocketAddressFromSockAddrStorage(const sockaddr_storage& addr,
-                                      SocketAddress* out) {
-  if (!out) {
-    return false;
-  }
-  if (addr.ss_family == AF_INET) {
-    const sockaddr_in* saddr = reinterpret_cast<const sockaddr_in*>(&addr);
-    *out = SocketAddress(IPAddress(saddr->sin_addr),
-                         NetworkToHost16(saddr->sin_port));
-    return true;
-  } else if (addr.ss_family == AF_INET6) {
-    const sockaddr_in6* saddr = reinterpret_cast<const sockaddr_in6*>(&addr);
-    *out = SocketAddress(IPAddress(saddr->sin6_addr),
-                         NetworkToHost16(saddr->sin6_port));
-    out->SetScopeID(saddr->sin6_scope_id);
-    return true;
-  }
-  return false;
-}
-
-SocketAddress EmptySocketAddressWithFamily(int family) {
-  if (family == AF_INET) {
-    return SocketAddress(IPAddress(INADDR_ANY), 0);
-  } else if (family == AF_INET6) {
-    return SocketAddress(IPAddress(in6addr_any), 0);
-  }
-  return SocketAddress();
-}
-
-}  // namespace rtc
diff --git a/rtc_base/socketaddress.h b/rtc_base/socketaddress.h
deleted file mode 100644
index 617e355..0000000
--- a/rtc_base/socketaddress.h
+++ /dev/null
@@ -1,197 +0,0 @@
-/*
- *  Copyright 2004 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_RTC_BASE_SOCKETADDRESS_H_
-#define WEBRTC_RTC_BASE_SOCKETADDRESS_H_
-
-#include <iosfwd>
-#include <string>
-#include <vector>
-#include "webrtc/rtc_base/basictypes.h"
-#include "webrtc/rtc_base/ipaddress.h"
-
-#undef SetPort
-
-struct sockaddr_in;
-struct sockaddr_storage;
-
-namespace rtc {
-
-// Records an IP address and port.
-class SocketAddress {
- public:
-  // Creates a nil address.
-  SocketAddress();
-
-  // Creates the address with the given host and port. Host may be a
-  // literal IP string or a hostname to be resolved later.
-  // DCHECKs that port is in valid range (0 to 2^16-1).
-  SocketAddress(const std::string& hostname, int port);
-
-  // Creates the address with the given IP and port.
-  // IP is given as an integer in host byte order. V4 only, to be deprecated.
-  // DCHECKs that port is in valid range (0 to 2^16-1).
-  SocketAddress(uint32_t ip_as_host_order_integer, int port);
-
-  // Creates the address with the given IP and port.
-  // DCHECKs that port is in valid range (0 to 2^16-1).
-  SocketAddress(const IPAddress& ip, int port);
-
-  // Creates a copy of the given address.
-  SocketAddress(const SocketAddress& addr);
-
-  // Resets to the nil address.
-  void Clear();
-
-  // Determines if this is a nil address (empty hostname, any IP, null port)
-  bool IsNil() const;
-
-  // Returns true if ip and port are set.
-  bool IsComplete() const;
-
-  // Replaces our address with the given one.
-  SocketAddress& operator=(const SocketAddress& addr);
-
-  // Changes the IP of this address to the given one, and clears the hostname
-  // IP is given as an integer in host byte order. V4 only, to be deprecated..
-  void SetIP(uint32_t ip_as_host_order_integer);
-
-  // Changes the IP of this address to the given one, and clears the hostname.
-  void SetIP(const IPAddress& ip);
-
-  // Changes the hostname of this address to the given one.
-  // Does not resolve the address; use Resolve to do so.
-  void SetIP(const std::string& hostname);
-
-  // Sets the IP address while retaining the hostname.  Useful for bypassing
-  // DNS for a pre-resolved IP.
-  // IP is given as an integer in host byte order. V4 only, to be deprecated.
-  void SetResolvedIP(uint32_t ip_as_host_order_integer);
-
-  // Sets the IP address while retaining the hostname.  Useful for bypassing
-  // DNS for a pre-resolved IP.
-  void SetResolvedIP(const IPAddress& ip);
-
-  // Changes the port of this address to the given one.
-  // DCHECKs that port is in valid range (0 to 2^16-1).
-  void SetPort(int port);
-
-  // Returns the hostname.
-  const std::string& hostname() const { return hostname_; }
-
-  // Returns the IP address as a host byte order integer.
-  // Returns 0 for non-v4 addresses.
-  uint32_t ip() const;
-
-  const IPAddress& ipaddr() const;
-
-  int family() const {return ip_.family(); }
-
-  // Returns the port part of this address.
-  uint16_t port() const;
-
-  // Returns the scope ID associated with this address. Scope IDs are a
-  // necessary addition to IPv6 link-local addresses, with different network
-  // interfaces having different scope-ids for their link-local addresses.
-  // IPv4 address do not have scope_ids and sockaddr_in structures do not have
-  // a field for them.
-  int scope_id() const {return scope_id_; }
-  void SetScopeID(int id) { scope_id_ = id; }
-
-  // Returns the 'host' portion of the address (hostname or IP) in a form
-  // suitable for use in a URI. If both IP and hostname are present, hostname
-  // is preferred. IPv6 addresses are enclosed in square brackets ('[' and ']').
-  std::string HostAsURIString() const;
-
-  // Same as HostAsURIString but anonymizes IP addresses by hiding the last
-  // part.
-  std::string HostAsSensitiveURIString() const;
-
-  // Returns the port as a string.
-  std::string PortAsString() const;
-
-  // Returns hostname:port or [hostname]:port.
-  std::string ToString() const;
-
-  // Same as ToString but anonymizes it by hiding the last part.
-  std::string ToSensitiveString() const;
-
-  // Parses hostname:port and [hostname]:port.
-  bool FromString(const std::string& str);
-
-  friend std::ostream& operator<<(std::ostream& os, const SocketAddress& addr);
-
-  // Determines whether this represents a missing / any IP address.
-  // That is, 0.0.0.0 or ::.
-  // Hostname and/or port may be set.
-  bool IsAnyIP() const;
-
-  // Determines whether the IP address refers to a loopback address.
-  // For v4 addresses this means the address is in the range 127.0.0.0/8.
-  // For v6 addresses this means the address is ::1.
-  bool IsLoopbackIP() const;
-
-  // Determines whether the IP address is in one of the private ranges:
-  // For v4: 127.0.0.0/8 10.0.0.0/8 192.168.0.0/16 172.16.0.0/12.
-  // For v6: FE80::/16 and ::1.
-  bool IsPrivateIP() const;
-
-  // Determines whether the hostname has been resolved to an IP.
-  bool IsUnresolvedIP() const;
-
-  // Determines whether this address is identical to the given one.
-  bool operator ==(const SocketAddress& addr) const;
-  inline bool operator !=(const SocketAddress& addr) const {
-    return !this->operator ==(addr);
-  }
-
-  // Compares based on IP and then port.
-  bool operator <(const SocketAddress& addr) const;
-
-  // Determines whether this address has the same IP as the one given.
-  bool EqualIPs(const SocketAddress& addr) const;
-
-  // Determines whether this address has the same port as the one given.
-  bool EqualPorts(const SocketAddress& addr) const;
-
-  // Hashes this address into a small number.
-  size_t Hash() const;
-
-  // Write this address to a sockaddr_in.
-  // If IPv6, will zero out the sockaddr_in and sets family to AF_UNSPEC.
-  void ToSockAddr(sockaddr_in* saddr) const;
-
-  // Read this address from a sockaddr_in.
-  bool FromSockAddr(const sockaddr_in& saddr);
-
-  // Read and write the address to/from a sockaddr_storage.
-  // Dual stack version always sets family to AF_INET6, and maps v4 addresses.
-  // The other version doesn't map, and outputs an AF_INET address for
-  // v4 or mapped addresses, and AF_INET6 addresses for others.
-  // Returns the size of the sockaddr_in or sockaddr_in6 structure that is
-  // written to the sockaddr_storage, or zero on failure.
-  size_t ToDualStackSockAddrStorage(sockaddr_storage* saddr) const;
-  size_t ToSockAddrStorage(sockaddr_storage* saddr) const;
-
- private:
-  std::string hostname_;
-  IPAddress ip_;
-  uint16_t port_;
-  int scope_id_;
-  bool literal_;  // Indicates that 'hostname_' contains a literal IP string.
-};
-
-bool SocketAddressFromSockAddrStorage(const sockaddr_storage& saddr,
-                                      SocketAddress* out);
-SocketAddress EmptySocketAddressWithFamily(int family);
-
-}  // namespace rtc
-
-#endif  // WEBRTC_RTC_BASE_SOCKETADDRESS_H_
diff --git a/rtc_base/socketaddress_unittest.cc b/rtc_base/socketaddress_unittest.cc
deleted file mode 100644
index 19fbc50..0000000
--- a/rtc_base/socketaddress_unittest.cc
+++ /dev/null
@@ -1,351 +0,0 @@
-/*
- *  Copyright 2004 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.
- */
-
-#if defined(WEBRTC_POSIX)
-#include <netinet/in.h>  // for sockaddr_in
-#endif
-
-#include "webrtc/rtc_base/gunit.h"
-#include "webrtc/rtc_base/ipaddress.h"
-#include "webrtc/rtc_base/socketaddress.h"
-
-namespace rtc {
-
-const in6_addr kTestV6Addr =  { { {0x20, 0x01, 0x0d, 0xb8,
-                                   0x10, 0x20, 0x30, 0x40,
-                                   0x50, 0x60, 0x70, 0x80,
-                                   0x90, 0xA0, 0xB0, 0xC0} } };
-const in6_addr kMappedV4Addr = { { {0x00, 0x00, 0x00, 0x00,
-                                    0x00, 0x00, 0x00, 0x00,
-                                    0x00, 0x00, 0xFF, 0xFF,
-                                    0x01, 0x02, 0x03, 0x04} } };
-const std::string kTestV6AddrString = "2001:db8:1020:3040:5060:7080:90a0:b0c0";
-const std::string kTestV6AddrAnonymizedString = "2001:db8:1020:x:x:x:x:x";
-const std::string kTestV6AddrFullString =
-    "[2001:db8:1020:3040:5060:7080:90a0:b0c0]:5678";
-const std::string kTestV6AddrFullAnonymizedString =
-    "[2001:db8:1020:x:x:x:x:x]:5678";
-
-TEST(SocketAddressTest, TestDefaultCtor) {
-  SocketAddress addr;
-  EXPECT_FALSE(addr.IsUnresolvedIP());
-  EXPECT_EQ(IPAddress(), addr.ipaddr());
-  EXPECT_EQ(0, addr.port());
-  EXPECT_EQ("", addr.hostname());
-}
-
-TEST(SocketAddressTest, TestIPPortCtor) {
-  SocketAddress addr(IPAddress(0x01020304), 5678);
-  EXPECT_FALSE(addr.IsUnresolvedIP());
-  EXPECT_EQ(IPAddress(0x01020304U), addr.ipaddr());
-  EXPECT_EQ(5678, addr.port());
-  EXPECT_EQ("", addr.hostname());
-  EXPECT_EQ("1.2.3.4:5678", addr.ToString());
-}
-
-TEST(SocketAddressTest, TestIPv4StringPortCtor) {
-  SocketAddress addr("1.2.3.4", 5678);
-  EXPECT_FALSE(addr.IsUnresolvedIP());
-  EXPECT_EQ(IPAddress(0x01020304U), addr.ipaddr());
-  EXPECT_EQ(5678, addr.port());
-  EXPECT_EQ("1.2.3.4", addr.hostname());
-  EXPECT_EQ("1.2.3.4:5678", addr.ToString());
-}
-
-TEST(SocketAddressTest, TestIPv6StringPortCtor) {
-  SocketAddress addr2(kTestV6AddrString, 1234);
-  IPAddress tocheck(kTestV6Addr);
-
-  EXPECT_FALSE(addr2.IsUnresolvedIP());
-  EXPECT_EQ(tocheck, addr2.ipaddr());
-  EXPECT_EQ(1234, addr2.port());
-  EXPECT_EQ(kTestV6AddrString, addr2.hostname());
-  EXPECT_EQ("[" + kTestV6AddrString + "]:1234", addr2.ToString());
-}
-
-TEST(SocketAddressTest, TestSpecialStringPortCtor) {
-  // inet_addr doesn't handle this address properly.
-  SocketAddress addr("255.255.255.255", 5678);
-  EXPECT_FALSE(addr.IsUnresolvedIP());
-  EXPECT_EQ(IPAddress(0xFFFFFFFFU), addr.ipaddr());
-  EXPECT_EQ(5678, addr.port());
-  EXPECT_EQ("255.255.255.255", addr.hostname());
-  EXPECT_EQ("255.255.255.255:5678", addr.ToString());
-}
-
-TEST(SocketAddressTest, TestHostnamePortCtor) {
-  SocketAddress addr("a.b.com", 5678);
-  EXPECT_TRUE(addr.IsUnresolvedIP());
-  EXPECT_EQ(IPAddress(), addr.ipaddr());
-  EXPECT_EQ(5678, addr.port());
-  EXPECT_EQ("a.b.com", addr.hostname());
-  EXPECT_EQ("a.b.com:5678", addr.ToString());
-}
-
-TEST(SocketAddressTest, TestCopyCtor) {
-  SocketAddress from("1.2.3.4", 5678);
-  SocketAddress addr(from);
-  EXPECT_FALSE(addr.IsUnresolvedIP());
-  EXPECT_EQ(IPAddress(0x01020304U), addr.ipaddr());
-  EXPECT_EQ(5678, addr.port());
-  EXPECT_EQ("1.2.3.4", addr.hostname());
-  EXPECT_EQ("1.2.3.4:5678", addr.ToString());
-}
-
-TEST(SocketAddressTest, TestAssign) {
-  SocketAddress from("1.2.3.4", 5678);
-  SocketAddress addr(IPAddress(0x88888888), 9999);
-  addr = from;
-  EXPECT_FALSE(addr.IsUnresolvedIP());
-  EXPECT_EQ(IPAddress(0x01020304U), addr.ipaddr());
-  EXPECT_EQ(5678, addr.port());
-  EXPECT_EQ("1.2.3.4", addr.hostname());
-  EXPECT_EQ("1.2.3.4:5678", addr.ToString());
-}
-
-TEST(SocketAddressTest, TestSetIPPort) {
-  SocketAddress addr(IPAddress(0x88888888), 9999);
-  addr.SetIP(IPAddress(0x01020304));
-  addr.SetPort(5678);
-  EXPECT_FALSE(addr.IsUnresolvedIP());
-  EXPECT_EQ(IPAddress(0x01020304U), addr.ipaddr());
-  EXPECT_EQ(5678, addr.port());
-  EXPECT_EQ("", addr.hostname());
-  EXPECT_EQ("1.2.3.4:5678", addr.ToString());
-}
-
-TEST(SocketAddressTest, TestSetIPFromString) {
-  SocketAddress addr(IPAddress(0x88888888), 9999);
-  addr.SetIP("1.2.3.4");
-  addr.SetPort(5678);
-  EXPECT_FALSE(addr.IsUnresolvedIP());
-  EXPECT_EQ(IPAddress(0x01020304U), addr.ipaddr());
-  EXPECT_EQ(5678, addr.port());
-  EXPECT_EQ("1.2.3.4", addr.hostname());
-  EXPECT_EQ("1.2.3.4:5678", addr.ToString());
-}
-
-TEST(SocketAddressTest, TestSetIPFromHostname) {
-  SocketAddress addr(IPAddress(0x88888888), 9999);
-  addr.SetIP("a.b.com");
-  addr.SetPort(5678);
-  EXPECT_TRUE(addr.IsUnresolvedIP());
-  EXPECT_EQ(IPAddress(), addr.ipaddr());
-  EXPECT_EQ(5678, addr.port());
-  EXPECT_EQ("a.b.com", addr.hostname());
-  EXPECT_EQ("a.b.com:5678", addr.ToString());
-  addr.SetResolvedIP(IPAddress(0x01020304));
-  EXPECT_FALSE(addr.IsUnresolvedIP());
-  EXPECT_EQ(IPAddress(0x01020304U), addr.ipaddr());
-  EXPECT_EQ("a.b.com", addr.hostname());
-  EXPECT_EQ("a.b.com:5678", addr.ToString());
-}
-
-TEST(SocketAddressTest, TestFromIPv4String) {
-  SocketAddress addr;
-  EXPECT_TRUE(addr.FromString("1.2.3.4:5678"));
-  EXPECT_FALSE(addr.IsUnresolvedIP());
-  EXPECT_EQ(IPAddress(0x01020304U), addr.ipaddr());
-  EXPECT_EQ(5678, addr.port());
-  EXPECT_EQ("1.2.3.4", addr.hostname());
-  EXPECT_EQ("1.2.3.4:5678", addr.ToString());
-}
-
-TEST(SocketAddressTest, TestFromIPv6String) {
-  SocketAddress addr;
-  EXPECT_TRUE(addr.FromString(kTestV6AddrFullString));
-  EXPECT_FALSE(addr.IsUnresolvedIP());
-  EXPECT_EQ(5678, addr.port());
-  EXPECT_EQ(kTestV6AddrString, addr.hostname());
-  EXPECT_EQ(kTestV6AddrFullString, addr.ToString());
-}
-
-TEST(SocketAddressTest, TestFromHostname) {
-  SocketAddress addr;
-  EXPECT_TRUE(addr.FromString("a.b.com:5678"));
-  EXPECT_TRUE(addr.IsUnresolvedIP());
-  EXPECT_EQ(IPAddress(), addr.ipaddr());
-  EXPECT_EQ(5678, addr.port());
-  EXPECT_EQ("a.b.com", addr.hostname());
-  EXPECT_EQ("a.b.com:5678", addr.ToString());
-}
-
-TEST(SocketAddressTest, TestToFromSockAddr) {
-  SocketAddress from("1.2.3.4", 5678), addr;
-  sockaddr_in addr_in;
-  from.ToSockAddr(&addr_in);
-  EXPECT_TRUE(addr.FromSockAddr(addr_in));
-  EXPECT_FALSE(addr.IsUnresolvedIP());
-  EXPECT_EQ(IPAddress(0x01020304U), addr.ipaddr());
-  EXPECT_EQ(5678, addr.port());
-  EXPECT_EQ("", addr.hostname());
-  EXPECT_EQ("1.2.3.4:5678", addr.ToString());
-}
-
-TEST(SocketAddressTest, TestToFromSockAddrStorage) {
-  SocketAddress from("1.2.3.4", 5678), addr;
-  sockaddr_storage addr_storage;
-  from.ToSockAddrStorage(&addr_storage);
-  EXPECT_TRUE(SocketAddressFromSockAddrStorage(addr_storage, &addr));
-  EXPECT_FALSE(addr.IsUnresolvedIP());
-  EXPECT_EQ(IPAddress(0x01020304U), addr.ipaddr());
-  EXPECT_EQ(5678, addr.port());
-  EXPECT_EQ("", addr.hostname());
-  EXPECT_EQ("1.2.3.4:5678", addr.ToString());
-
-  addr.Clear();
-  from.ToDualStackSockAddrStorage(&addr_storage);
-  EXPECT_TRUE(SocketAddressFromSockAddrStorage(addr_storage, &addr));
-  EXPECT_FALSE(addr.IsUnresolvedIP());
-  EXPECT_EQ(IPAddress(kMappedV4Addr), addr.ipaddr());
-  EXPECT_EQ(5678, addr.port());
-  EXPECT_EQ("", addr.hostname());
-  EXPECT_EQ("[::ffff:1.2.3.4]:5678", addr.ToString());
-
-  addr.Clear();
-  memset(&addr_storage, 0, sizeof(sockaddr_storage));
-  from = SocketAddress(kTestV6AddrString, 5678);
-  from.SetScopeID(6);
-  from.ToSockAddrStorage(&addr_storage);
-  EXPECT_TRUE(SocketAddressFromSockAddrStorage(addr_storage, &addr));
-  EXPECT_FALSE(addr.IsUnresolvedIP());
-  EXPECT_EQ(IPAddress(kTestV6Addr), addr.ipaddr());
-  EXPECT_EQ(5678, addr.port());
-  EXPECT_EQ("", addr.hostname());
-  EXPECT_EQ(kTestV6AddrFullString, addr.ToString());
-  EXPECT_EQ(6, addr.scope_id());
-
-  addr.Clear();
-  from.ToDualStackSockAddrStorage(&addr_storage);
-  EXPECT_TRUE(SocketAddressFromSockAddrStorage(addr_storage, &addr));
-  EXPECT_FALSE(addr.IsUnresolvedIP());
-  EXPECT_EQ(IPAddress(kTestV6Addr), addr.ipaddr());
-  EXPECT_EQ(5678, addr.port());
-  EXPECT_EQ("", addr.hostname());
-  EXPECT_EQ(kTestV6AddrFullString, addr.ToString());
-  EXPECT_EQ(6, addr.scope_id());
-
-  addr = from;
-  addr_storage.ss_family = AF_UNSPEC;
-  EXPECT_FALSE(SocketAddressFromSockAddrStorage(addr_storage, &addr));
-  EXPECT_EQ(from, addr);
-
-  EXPECT_FALSE(SocketAddressFromSockAddrStorage(addr_storage, nullptr));
-}
-
-bool AreEqual(const SocketAddress& addr1,
-              const SocketAddress& addr2) {
-  return addr1 == addr2 && addr2 == addr1 &&
-      !(addr1 != addr2) && !(addr2 != addr1);
-}
-
-bool AreUnequal(const SocketAddress& addr1,
-                const SocketAddress& addr2) {
-  return !(addr1 == addr2) && !(addr2 == addr1) &&
-      addr1 != addr2 && addr2 != addr1;
-}
-
-TEST(SocketAddressTest, TestEqualityOperators) {
-  SocketAddress addr1("1.2.3.4", 5678);
-  SocketAddress addr2("1.2.3.4", 5678);
-  EXPECT_PRED2(AreEqual, addr1, addr2);
-
-  addr2 = SocketAddress("0.0.0.1", 5678);
-  EXPECT_PRED2(AreUnequal, addr1, addr2);
-
-  addr2 = SocketAddress("1.2.3.4", 1234);
-  EXPECT_PRED2(AreUnequal, addr1, addr2);
-
-  addr2 = SocketAddress(kTestV6AddrString, 5678);
-  EXPECT_PRED2(AreUnequal, addr1, addr2);
-
-  addr1 = SocketAddress(kTestV6AddrString, 5678);
-  EXPECT_PRED2(AreEqual, addr1, addr2);
-
-  addr2 = SocketAddress(kTestV6AddrString, 1234);
-  EXPECT_PRED2(AreUnequal, addr1, addr2);
-
-  addr2 = SocketAddress("fe80::1", 5678);
-  EXPECT_PRED2(AreUnequal, addr1, addr2);
-
-  SocketAddress addr3("a.b.c.d", 1);
-  SocketAddress addr4("b.b.c.d", 1);
-  EXPECT_PRED2(AreUnequal, addr3, addr4);
-  EXPECT_PRED2(AreEqual, addr3, addr3);
-
-  addr3.SetIP(addr1.ip());
-  addr4.SetIP(addr1.ip());
-  EXPECT_PRED2(AreEqual,addr3, addr4);
-}
-
-bool IsLessThan(const SocketAddress& addr1, const SocketAddress& addr2) {
-  return addr1 < addr2 &&
-      !(addr2 < addr1) &&
-      !(addr1 == addr2);
-}
-
-TEST(SocketAddressTest, TestComparisonOperator) {
-  SocketAddress addr1("1.2.3.4", 5678);
-  SocketAddress addr2("1.2.3.4", 5678);
-
-  EXPECT_FALSE(addr1 < addr2);
-  EXPECT_FALSE(addr2 < addr1);
-
-  addr2 = SocketAddress("1.2.3.4", 5679);
-  EXPECT_PRED2(IsLessThan, addr1, addr2);
-
-  addr2 = SocketAddress("2.2.3.4", 49152);
-  EXPECT_PRED2(IsLessThan, addr1, addr2);
-
-  addr2 = SocketAddress(kTestV6AddrString, 5678);
-  EXPECT_PRED2(IsLessThan, addr1, addr2);
-
-  addr1 = SocketAddress("fe80::1", 5678);
-  EXPECT_PRED2(IsLessThan, addr2, addr1);
-
-  addr2 = SocketAddress("fe80::1", 5679);
-  EXPECT_PRED2(IsLessThan, addr1, addr2);
-
-  addr2 = SocketAddress("fe80::1", 5678);
-  EXPECT_FALSE(addr1 < addr2);
-  EXPECT_FALSE(addr2 < addr1);
-
-  SocketAddress addr3("a.b.c.d", 1);
-  SocketAddress addr4("b.b.c.d", 1);
-  EXPECT_PRED2(IsLessThan, addr3, addr4);
-}
-
-TEST(SocketAddressTest, TestToSensitiveString) {
-  SocketAddress addr_v4("1.2.3.4", 5678);
-  EXPECT_EQ("1.2.3.4", addr_v4.HostAsURIString());
-  EXPECT_EQ("1.2.3.4:5678", addr_v4.ToString());
-
-#if defined(NDEBUG)
-  EXPECT_EQ("1.2.3.x", addr_v4.HostAsSensitiveURIString());
-  EXPECT_EQ("1.2.3.x:5678", addr_v4.ToSensitiveString());
-#else
-  EXPECT_EQ("1.2.3.4", addr_v4.HostAsSensitiveURIString());
-  EXPECT_EQ("1.2.3.4:5678", addr_v4.ToSensitiveString());
-#endif  // defined(NDEBUG)
-
-  SocketAddress addr_v6(kTestV6AddrString, 5678);
-  EXPECT_EQ("[" + kTestV6AddrString + "]", addr_v6.HostAsURIString());
-  EXPECT_EQ(kTestV6AddrFullString, addr_v6.ToString());
-#if defined(NDEBUG)
-  EXPECT_EQ("[" + kTestV6AddrAnonymizedString + "]",
-            addr_v6.HostAsSensitiveURIString());
-  EXPECT_EQ(kTestV6AddrFullAnonymizedString, addr_v6.ToSensitiveString());
-#else
-  EXPECT_EQ("[" + kTestV6AddrString + "]", addr_v6.HostAsSensitiveURIString());
-  EXPECT_EQ(kTestV6AddrFullString, addr_v6.ToSensitiveString());
-#endif  // defined(NDEBUG)
-}
-
-}  // namespace rtc
diff --git a/rtc_base/socketaddresspair.cc b/rtc_base/socketaddresspair.cc
deleted file mode 100644
index 2be718f..0000000
--- a/rtc_base/socketaddresspair.cc
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- *  Copyright 2004 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/rtc_base/socketaddresspair.h"
-
-namespace rtc {
-
-SocketAddressPair::SocketAddressPair(
-    const SocketAddress& src, const SocketAddress& dest)
-    : src_(src), dest_(dest) {
-}
-
-
-bool SocketAddressPair::operator ==(const SocketAddressPair& p) const {
-  return (src_ == p.src_) && (dest_ == p.dest_);
-}
-
-bool SocketAddressPair::operator <(const SocketAddressPair& p) const {
-  if (src_ < p.src_)
-    return true;
-  if (p.src_ < src_)
-    return false;
-  if (dest_ < p.dest_)
-    return true;
-  if (p.dest_ < dest_)
-    return false;
-  return false;
-}
-
-size_t SocketAddressPair::Hash() const {
-  return src_.Hash() ^ dest_.Hash();
-}
-
-} // namespace rtc
diff --git a/rtc_base/socketaddresspair.h b/rtc_base/socketaddresspair.h
deleted file mode 100644
index cec84a7..0000000
--- a/rtc_base/socketaddresspair.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- *  Copyright 2004 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_RTC_BASE_SOCKETADDRESSPAIR_H_
-#define WEBRTC_RTC_BASE_SOCKETADDRESSPAIR_H_
-
-#include "webrtc/rtc_base/socketaddress.h"
-
-namespace rtc {
-
-// Records a pair (source,destination) of socket addresses.  The two addresses
-// identify a connection between two machines.  (For UDP, this "connection" is
-// not maintained explicitly in a socket.)
-class SocketAddressPair {
-public:
-  SocketAddressPair() {}
-  SocketAddressPair(const SocketAddress& srs, const SocketAddress& dest);
-
-  const SocketAddress& source() const { return src_; }
-  const SocketAddress& destination() const { return dest_; }
-
-  bool operator ==(const SocketAddressPair& r) const;
-  bool operator <(const SocketAddressPair& r) const;
-
-  size_t Hash() const;
-
-private:
-  SocketAddress src_;
-  SocketAddress dest_;
-};
-
-} // namespace rtc
-
-#endif // WEBRTC_RTC_BASE_SOCKETADDRESSPAIR_H_
diff --git a/rtc_base/socketfactory.h b/rtc_base/socketfactory.h
deleted file mode 100644
index 749eb17..0000000
--- a/rtc_base/socketfactory.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- *  Copyright 2004 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_RTC_BASE_SOCKETFACTORY_H_
-#define WEBRTC_RTC_BASE_SOCKETFACTORY_H_
-
-#include "webrtc/rtc_base/asyncsocket.h"
-#include "webrtc/rtc_base/socket.h"
-
-namespace rtc {
-
-class SocketFactory {
-public:
-  virtual ~SocketFactory() {}
-
-  // Returns a new socket for blocking communication.  The type can be
-  // SOCK_DGRAM and SOCK_STREAM.
-  // TODO: C++ inheritance rules mean that all users must have both
-  // CreateSocket(int) and CreateSocket(int,int). Will remove CreateSocket(int)
-  // (and CreateAsyncSocket(int) when all callers are changed.
-  virtual Socket* CreateSocket(int type) = 0;
-  virtual Socket* CreateSocket(int family, int type) = 0;
-  // Returns a new socket for nonblocking communication.  The type can be
-  // SOCK_DGRAM and SOCK_STREAM.
-  virtual AsyncSocket* CreateAsyncSocket(int type) = 0;
-  virtual AsyncSocket* CreateAsyncSocket(int family, int type) = 0;
-};
-
-} // namespace rtc
-
-#endif // WEBRTC_RTC_BASE_SOCKETFACTORY_H_
diff --git a/rtc_base/socketserver.h b/rtc_base/socketserver.h
deleted file mode 100644
index dc99c2b..0000000
--- a/rtc_base/socketserver.h
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- *  Copyright 2004 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_RTC_BASE_SOCKETSERVER_H_
-#define WEBRTC_RTC_BASE_SOCKETSERVER_H_
-
-#include <memory>
-#include "webrtc/rtc_base/socketfactory.h"
-
-namespace rtc {
-
-class MessageQueue;
-// Needs to be forward declared because there's a circular dependency between
-// NetworkMonitor and Thread.
-// TODO(deadbeef): Fix this.
-class NetworkBinderInterface;
-
-// Provides the ability to wait for activity on a set of sockets.  The Thread
-// class provides a nice wrapper on a socket server.
-//
-// The server is also a socket factory.  The sockets it creates will be
-// notified of asynchronous I/O from this server's Wait method.
-class SocketServer : public SocketFactory {
- public:
-  static const int kForever = -1;
-
-  static std::unique_ptr<SocketServer> CreateDefault();
-  // When the socket server is installed into a Thread, this function is
-  // called to allow the socket server to use the thread's message queue for
-  // any messaging that it might need to perform.
-  virtual void SetMessageQueue(MessageQueue* queue) {}
-
-  // Sleeps until:
-  //  1) cms milliseconds have elapsed (unless cms == kForever)
-  //  2) WakeUp() is called
-  // While sleeping, I/O is performed if process_io is true.
-  virtual bool Wait(int cms, bool process_io) = 0;
-
-  // Causes the current wait (if one is in progress) to wake up.
-  virtual void WakeUp() = 0;
-
-  // A network binder will bind the created sockets to a network.
-  // It is only used in PhysicalSocketServer.
-  void set_network_binder(NetworkBinderInterface* binder) {
-    network_binder_ = binder;
-  }
-  NetworkBinderInterface* network_binder() const { return network_binder_; }
-
- private:
-  NetworkBinderInterface* network_binder_ = nullptr;
-};
-
-}  // namespace rtc
-
-#endif  // WEBRTC_RTC_BASE_SOCKETSERVER_H_
diff --git a/rtc_base/socketstream.cc b/rtc_base/socketstream.cc
deleted file mode 100644
index 2c09fcf..0000000
--- a/rtc_base/socketstream.cc
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- *  Copyright 2010 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/rtc_base/socketstream.h"
-
-#include "webrtc/rtc_base/checks.h"
-
-namespace rtc {
-
-SocketStream::SocketStream(AsyncSocket* socket) : socket_(nullptr) {
-  Attach(socket);
-}
-
-SocketStream::~SocketStream() {
-  delete socket_;
-}
-
-void SocketStream::Attach(AsyncSocket* socket) {
-  if (socket_)
-    delete socket_;
-  socket_ = socket;
-  if (socket_) {
-    socket_->SignalConnectEvent.connect(this, &SocketStream::OnConnectEvent);
-    socket_->SignalReadEvent.connect(this,    &SocketStream::OnReadEvent);
-    socket_->SignalWriteEvent.connect(this,   &SocketStream::OnWriteEvent);
-    socket_->SignalCloseEvent.connect(this,   &SocketStream::OnCloseEvent);
-  }
-}
-
-AsyncSocket* SocketStream::Detach() {
-  AsyncSocket* socket = socket_;
-  if (socket_) {
-    socket_->SignalConnectEvent.disconnect(this);
-    socket_->SignalReadEvent.disconnect(this);
-    socket_->SignalWriteEvent.disconnect(this);
-    socket_->SignalCloseEvent.disconnect(this);
-    socket_ = nullptr;
-  }
-  return socket;
-}
-
-StreamState SocketStream::GetState() const {
-  RTC_DCHECK(socket_ != nullptr);
-  switch (socket_->GetState()) {
-    case Socket::CS_CONNECTED:
-      return SS_OPEN;
-    case Socket::CS_CONNECTING:
-      return SS_OPENING;
-    case Socket::CS_CLOSED:
-    default:
-      return SS_CLOSED;
-  }
-}
-
-StreamResult SocketStream::Read(void* buffer, size_t buffer_len,
-                                size_t* read, int* error) {
-  RTC_DCHECK(socket_ != nullptr);
-  int result = socket_->Recv(buffer, buffer_len, nullptr);
-  if (result < 0) {
-    if (socket_->IsBlocking())
-      return SR_BLOCK;
-    if (error)
-      *error = socket_->GetError();
-    return SR_ERROR;
-  }
-  if ((result > 0) || (buffer_len == 0)) {
-    if (read)
-      *read = result;
-    return SR_SUCCESS;
-  }
-  return SR_EOS;
-}
-
-StreamResult SocketStream::Write(const void* data, size_t data_len,
-                                 size_t* written, int* error) {
-  RTC_DCHECK(socket_ != nullptr);
-  int result = socket_->Send(data, data_len);
-  if (result < 0) {
-    if (socket_->IsBlocking())
-      return SR_BLOCK;
-    if (error)
-      *error = socket_->GetError();
-    return SR_ERROR;
-  }
-  if (written)
-    *written = result;
-  return SR_SUCCESS;
-}
-
-void SocketStream::Close() {
-  RTC_DCHECK(socket_ != nullptr);
-  socket_->Close();
-}
-
-void SocketStream::OnConnectEvent(AsyncSocket* socket) {
-  RTC_DCHECK(socket == socket_);
-  SignalEvent(this, SE_OPEN | SE_READ | SE_WRITE, 0);
-}
-
-void SocketStream::OnReadEvent(AsyncSocket* socket) {
-  RTC_DCHECK(socket == socket_);
-  SignalEvent(this, SE_READ, 0);
-}
-
-void SocketStream::OnWriteEvent(AsyncSocket* socket) {
-  RTC_DCHECK(socket == socket_);
-  SignalEvent(this, SE_WRITE, 0);
-}
-
-void SocketStream::OnCloseEvent(AsyncSocket* socket, int err) {
-  RTC_DCHECK(socket == socket_);
-  SignalEvent(this, SE_CLOSE, err);
-}
-
-
-}  // namespace rtc
diff --git a/rtc_base/socketstream.h b/rtc_base/socketstream.h
deleted file mode 100644
index e78c876..0000000
--- a/rtc_base/socketstream.h
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- *  Copyright 2005 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_RTC_BASE_SOCKETSTREAM_H_
-#define WEBRTC_RTC_BASE_SOCKETSTREAM_H_
-
-#include "webrtc/rtc_base/asyncsocket.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/stream.h"
-
-namespace rtc {
-
-///////////////////////////////////////////////////////////////////////////////
-
-class SocketStream : public StreamInterface, public sigslot::has_slots<> {
- public:
-  explicit SocketStream(AsyncSocket* socket);
-  ~SocketStream() override;
-
-  void Attach(AsyncSocket* socket);
-  AsyncSocket* Detach();
-
-  AsyncSocket* GetSocket() { return socket_; }
-
-  StreamState GetState() const override;
-
-  StreamResult Read(void* buffer,
-                    size_t buffer_len,
-                    size_t* read,
-                    int* error) override;
-
-  StreamResult Write(const void* data,
-                     size_t data_len,
-                     size_t* written,
-                     int* error) override;
-
-  void Close() override;
-
- private:
-  void OnConnectEvent(AsyncSocket* socket);
-  void OnReadEvent(AsyncSocket* socket);
-  void OnWriteEvent(AsyncSocket* socket);
-  void OnCloseEvent(AsyncSocket* socket, int err);
-
-  AsyncSocket* socket_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(SocketStream);
-};
-
-///////////////////////////////////////////////////////////////////////////////
-
-}  // namespace rtc
-
-#endif  // WEBRTC_RTC_BASE_SOCKETSTREAM_H_
diff --git a/rtc_base/ssladapter.cc b/rtc_base/ssladapter.cc
deleted file mode 100644
index f26ebda..0000000
--- a/rtc_base/ssladapter.cc
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- *  Copyright 2004 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/rtc_base/ssladapter.h"
-
-#include "webrtc/rtc_base/openssladapter.h"
-
-///////////////////////////////////////////////////////////////////////////////
-
-namespace rtc {
-
-SSLAdapterFactory* SSLAdapterFactory::Create() {
-  return new OpenSSLAdapterFactory();
-}
-
-SSLAdapter* SSLAdapter::Create(AsyncSocket* socket) {
-  return new OpenSSLAdapter(socket);
-}
-
-///////////////////////////////////////////////////////////////////////////////
-
-bool InitializeSSL(VerificationCallback callback) {
-  return OpenSSLAdapter::InitializeSSL(callback);
-}
-
-bool InitializeSSLThread() {
-  return OpenSSLAdapter::InitializeSSLThread();
-}
-
-bool CleanupSSL() {
-  return OpenSSLAdapter::CleanupSSL();
-}
-
-///////////////////////////////////////////////////////////////////////////////
-
-}  // namespace rtc
diff --git a/rtc_base/ssladapter.h b/rtc_base/ssladapter.h
deleted file mode 100644
index 922f42e..0000000
--- a/rtc_base/ssladapter.h
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- *  Copyright 2004 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_RTC_BASE_SSLADAPTER_H_
-#define WEBRTC_RTC_BASE_SSLADAPTER_H_
-
-#include "webrtc/rtc_base/asyncsocket.h"
-#include "webrtc/rtc_base/sslstreamadapter.h"
-
-namespace rtc {
-
-class SSLAdapter;
-
-// Class for creating SSL adapters with shared state, e.g., a session cache,
-// which allows clients to resume SSL sessions to previously-contacted hosts.
-// Clients should create the factory using Create(), set up the factory as
-// needed using SetMode, and then call CreateAdapter to create adapters when
-// needed.
-class SSLAdapterFactory {
- public:
-  virtual ~SSLAdapterFactory() {}
-  // Specifies whether TLS or DTLS is to be used for the SSL adapters.
-  virtual void SetMode(SSLMode mode) = 0;
-  // Creates a new SSL adapter, but from a shared context.
-  virtual SSLAdapter* CreateAdapter(AsyncSocket* socket) = 0;
-
-  static SSLAdapterFactory* Create();
-};
-
-// Class that abstracts a client-to-server SSL session. It can be created
-// standalone, via SSLAdapter::Create, or through a factory as described above,
-// in which case it will share state with other SSLAdapters created from the
-// same factory.
-// After creation, call StartSSL to initiate the SSL handshake to the server.
-class SSLAdapter : public AsyncSocketAdapter {
- public:
-  explicit SSLAdapter(AsyncSocket* socket) : AsyncSocketAdapter(socket) {}
-
-  // Methods that control server certificate verification, used in unit tests.
-  // Do not call these methods in production code.
-  // TODO(juberti): Remove the opportunistic encryption mechanism in
-  // BasicPacketSocketFactory that uses this function.
-  virtual void SetIgnoreBadCert(bool ignore) = 0;
-
-  virtual void SetAlpnProtocols(const std::vector<std::string>& protos) = 0;
-  virtual void SetEllipticCurves(const std::vector<std::string>& curves) = 0;
-
-  // Do DTLS or TLS (default is TLS, if unspecified)
-  virtual void SetMode(SSLMode mode) = 0;
-
-  // Set the certificate this socket will present to incoming clients.
-  virtual void SetIdentity(SSLIdentity* identity) = 0;
-
-  // Choose whether the socket acts as a server socket or client socket.
-  virtual void SetRole(SSLRole role) = 0;
-
-  // StartSSL returns 0 if successful.
-  // If StartSSL is called while the socket is closed or connecting, the SSL
-  // negotiation will begin as soon as the socket connects.
-  // TODO(juberti): Remove |restartable|.
-  virtual int StartSSL(const char* hostname, bool restartable = false) = 0;
-
-  // When an SSLAdapterFactory is used, an SSLAdapter may be used to resume
-  // a previous SSL session, which results in an abbreviated handshake.
-  // This method, if called after SSL has been established for this adapter,
-  // indicates whether the current session is a resumption of a previous
-  // session.
-  virtual bool IsResumedSession() = 0;
-
-  // Create the default SSL adapter for this platform. On failure, returns null
-  // and deletes |socket|. Otherwise, the returned SSLAdapter takes ownership
-  // of |socket|.
-  static SSLAdapter* Create(AsyncSocket* socket);
-};
-
-///////////////////////////////////////////////////////////////////////////////
-
-typedef bool (*VerificationCallback)(void* cert);
-
-// Call this on the main thread, before using SSL.
-// Call CleanupSSLThread when finished with SSL.
-bool InitializeSSL(VerificationCallback callback = nullptr);
-
-// Call to initialize additional threads.
-bool InitializeSSLThread();
-
-// Call to cleanup additional threads, and also the main thread.
-bool CleanupSSL();
-
-}  // namespace rtc
-
-#endif  // WEBRTC_RTC_BASE_SSLADAPTER_H_
diff --git a/rtc_base/ssladapter_unittest.cc b/rtc_base/ssladapter_unittest.cc
deleted file mode 100644
index 8e5d322..0000000
--- a/rtc_base/ssladapter_unittest.cc
+++ /dev/null
@@ -1,491 +0,0 @@
-/*
- *  Copyright 2014 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 <memory>
-#include <string>
-
-#include "webrtc/rtc_base/gunit.h"
-#include "webrtc/rtc_base/ipaddress.h"
-#include "webrtc/rtc_base/socketstream.h"
-#include "webrtc/rtc_base/ssladapter.h"
-#include "webrtc/rtc_base/sslidentity.h"
-#include "webrtc/rtc_base/sslstreamadapter.h"
-#include "webrtc/rtc_base/stream.h"
-#include "webrtc/rtc_base/stringencode.h"
-#include "webrtc/rtc_base/virtualsocketserver.h"
-
-static const int kTimeout = 5000;
-
-static rtc::AsyncSocket* CreateSocket(const rtc::SSLMode& ssl_mode) {
-  rtc::SocketAddress address(rtc::IPAddress(INADDR_ANY), 0);
-
-  rtc::AsyncSocket* socket = rtc::Thread::Current()->
-      socketserver()->CreateAsyncSocket(
-      address.family(), (ssl_mode == rtc::SSL_MODE_DTLS) ?
-      SOCK_DGRAM : SOCK_STREAM);
-  socket->Bind(address);
-
-  return socket;
-}
-
-static std::string GetSSLProtocolName(const rtc::SSLMode& ssl_mode) {
-  return (ssl_mode == rtc::SSL_MODE_DTLS) ? "DTLS" : "TLS";
-}
-
-class SSLAdapterTestDummyClient : public sigslot::has_slots<> {
- public:
-  explicit SSLAdapterTestDummyClient(const rtc::SSLMode& ssl_mode)
-      : ssl_mode_(ssl_mode) {
-    rtc::AsyncSocket* socket = CreateSocket(ssl_mode_);
-
-    ssl_adapter_.reset(rtc::SSLAdapter::Create(socket));
-
-    ssl_adapter_->SetMode(ssl_mode_);
-
-    // Ignore any certificate errors for the purpose of testing.
-    // Note: We do this only because we don't have a real certificate.
-    // NEVER USE THIS IN PRODUCTION CODE!
-    ssl_adapter_->SetIgnoreBadCert(true);
-
-    ssl_adapter_->SignalReadEvent.connect(this,
-        &SSLAdapterTestDummyClient::OnSSLAdapterReadEvent);
-    ssl_adapter_->SignalCloseEvent.connect(this,
-        &SSLAdapterTestDummyClient::OnSSLAdapterCloseEvent);
-  }
-
-  void SetAlpnProtocols(const std::vector<std::string>& protos) {
-    ssl_adapter_->SetAlpnProtocols(protos);
-  }
-
-  void SetEllipticCurves(const std::vector<std::string>& curves) {
-    ssl_adapter_->SetEllipticCurves(curves);
-  }
-
-  rtc::SocketAddress GetAddress() const {
-    return ssl_adapter_->GetLocalAddress();
-  }
-
-  rtc::AsyncSocket::ConnState GetState() const {
-    return ssl_adapter_->GetState();
-  }
-
-  const std::string& GetReceivedData() const {
-    return data_;
-  }
-
-  int Connect(const std::string& hostname, const rtc::SocketAddress& address) {
-    LOG(LS_INFO) << "Initiating connection with " << address;
-
-    int rv = ssl_adapter_->Connect(address);
-
-    if (rv == 0) {
-      LOG(LS_INFO) << "Starting " << GetSSLProtocolName(ssl_mode_)
-          << " handshake with " << hostname;
-
-      if (ssl_adapter_->StartSSL(hostname.c_str(), false) != 0) {
-        return -1;
-      }
-    }
-
-    return rv;
-  }
-
-  int Close() {
-    return ssl_adapter_->Close();
-  }
-
-  int Send(const std::string& message) {
-    LOG(LS_INFO) << "Client sending '" << message << "'";
-
-    return ssl_adapter_->Send(message.data(), message.length());
-  }
-
-  void OnSSLAdapterReadEvent(rtc::AsyncSocket* socket) {
-    char buffer[4096] = "";
-
-    // Read data received from the server and store it in our internal buffer.
-    int read = socket->Recv(buffer, sizeof(buffer) - 1, nullptr);
-    if (read != -1) {
-      buffer[read] = '\0';
-
-      LOG(LS_INFO) << "Client received '" << buffer << "'";
-
-      data_ += buffer;
-    }
-  }
-
-  void OnSSLAdapterCloseEvent(rtc::AsyncSocket* socket, int error) {
-    // OpenSSLAdapter signals handshake failure with a close event, but without
-    // closing the socket! Let's close the socket here. This way GetState() can
-    // return CS_CLOSED after failure.
-    if (socket->GetState() != rtc::AsyncSocket::CS_CLOSED) {
-      socket->Close();
-    }
-  }
-
- private:
-  const rtc::SSLMode ssl_mode_;
-
-  std::unique_ptr<rtc::SSLAdapter> ssl_adapter_;
-
-  std::string data_;
-};
-
-class SSLAdapterTestDummyServer : public sigslot::has_slots<> {
- public:
-  explicit SSLAdapterTestDummyServer(const rtc::SSLMode& ssl_mode,
-                                     const rtc::KeyParams& key_params)
-      : ssl_mode_(ssl_mode) {
-    // Generate a key pair and a certificate for this host.
-    ssl_identity_.reset(rtc::SSLIdentity::Generate(GetHostname(), key_params));
-
-    server_socket_.reset(CreateSocket(ssl_mode_));
-
-    if (ssl_mode_ == rtc::SSL_MODE_TLS) {
-      server_socket_->SignalReadEvent.connect(this,
-          &SSLAdapterTestDummyServer::OnServerSocketReadEvent);
-
-      server_socket_->Listen(1);
-    }
-
-    LOG(LS_INFO) << ((ssl_mode_ == rtc::SSL_MODE_DTLS) ? "UDP" : "TCP")
-        << " server listening on " << server_socket_->GetLocalAddress();
-  }
-
-  rtc::SocketAddress GetAddress() const {
-    return server_socket_->GetLocalAddress();
-  }
-
-  std::string GetHostname() const {
-    // Since we don't have a real certificate anyway, the value here doesn't
-    // really matter.
-    return "example.com";
-  }
-
-  const std::string& GetReceivedData() const {
-    return data_;
-  }
-
-  int Send(const std::string& message) {
-    if (ssl_stream_adapter_ == nullptr ||
-        ssl_stream_adapter_->GetState() != rtc::SS_OPEN) {
-      // No connection yet.
-      return -1;
-    }
-
-    LOG(LS_INFO) << "Server sending '" << message << "'";
-
-    size_t written;
-    int error;
-
-    rtc::StreamResult r = ssl_stream_adapter_->Write(message.data(),
-        message.length(), &written, &error);
-    if (r == rtc::SR_SUCCESS) {
-      return written;
-    } else {
-      return -1;
-    }
-  }
-
-  void AcceptConnection(const rtc::SocketAddress& address) {
-    // Only a single connection is supported.
-    ASSERT_TRUE(ssl_stream_adapter_ == nullptr);
-
-    // This is only for DTLS.
-    ASSERT_EQ(rtc::SSL_MODE_DTLS, ssl_mode_);
-
-    // Transfer ownership of the socket to the SSLStreamAdapter object.
-    rtc::AsyncSocket* socket = server_socket_.release();
-
-    socket->Connect(address);
-
-    DoHandshake(socket);
-  }
-
-  void OnServerSocketReadEvent(rtc::AsyncSocket* socket) {
-    // Only a single connection is supported.
-    ASSERT_TRUE(ssl_stream_adapter_ == nullptr);
-
-    DoHandshake(server_socket_->Accept(nullptr));
-  }
-
-  void OnSSLStreamAdapterEvent(rtc::StreamInterface* stream, int sig, int err) {
-    if (sig & rtc::SE_READ) {
-      char buffer[4096] = "";
-      size_t read;
-      int error;
-
-      // Read data received from the client and store it in our internal
-      // buffer.
-      rtc::StreamResult r =
-          stream->Read(buffer, sizeof(buffer) - 1, &read, &error);
-      if (r == rtc::SR_SUCCESS) {
-        buffer[read] = '\0';
-        LOG(LS_INFO) << "Server received '" << buffer << "'";
-        data_ += buffer;
-      }
-    }
-  }
-
- private:
-  void DoHandshake(rtc::AsyncSocket* socket) {
-    rtc::SocketStream* stream = new rtc::SocketStream(socket);
-
-    ssl_stream_adapter_.reset(rtc::SSLStreamAdapter::Create(stream));
-
-    ssl_stream_adapter_->SetMode(ssl_mode_);
-    ssl_stream_adapter_->SetServerRole();
-
-    // SSLStreamAdapter is normally used for peer-to-peer communication, but
-    // here we're testing communication between a client and a server
-    // (e.g. a WebRTC-based application and an RFC 5766 TURN server), where
-    // clients are not required to provide a certificate during handshake.
-    // Accordingly, we must disable client authentication here.
-    ssl_stream_adapter_->set_client_auth_enabled(false);
-
-    ssl_stream_adapter_->SetIdentity(ssl_identity_->GetReference());
-
-    // Set a bogus peer certificate digest.
-    unsigned char digest[20];
-    size_t digest_len = sizeof(digest);
-    ssl_stream_adapter_->SetPeerCertificateDigest(rtc::DIGEST_SHA_1, digest,
-        digest_len);
-
-    ssl_stream_adapter_->StartSSL();
-
-    ssl_stream_adapter_->SignalEvent.connect(this,
-        &SSLAdapterTestDummyServer::OnSSLStreamAdapterEvent);
-  }
-
-  const rtc::SSLMode ssl_mode_;
-
-  std::unique_ptr<rtc::AsyncSocket> server_socket_;
-  std::unique_ptr<rtc::SSLStreamAdapter> ssl_stream_adapter_;
-
-  std::unique_ptr<rtc::SSLIdentity> ssl_identity_;
-
-  std::string data_;
-};
-
-class SSLAdapterTestBase : public testing::Test,
-                           public sigslot::has_slots<> {
- public:
-  explicit SSLAdapterTestBase(const rtc::SSLMode& ssl_mode,
-                              const rtc::KeyParams& key_params)
-      : ssl_mode_(ssl_mode),
-        vss_(new rtc::VirtualSocketServer()),
-        thread_(vss_.get()),
-        server_(new SSLAdapterTestDummyServer(ssl_mode_, key_params)),
-        client_(new SSLAdapterTestDummyClient(ssl_mode_)),
-        handshake_wait_(kTimeout) {}
-
-  void SetHandshakeWait(int wait) {
-    handshake_wait_ = wait;
-  }
-
-  void SetAlpnProtocols(const std::vector<std::string>& protos) {
-    client_->SetAlpnProtocols(protos);
-  }
-
-  void SetEllipticCurves(const std::vector<std::string>& curves) {
-    client_->SetEllipticCurves(curves);
-  }
-
-  void TestHandshake(bool expect_success) {
-    int rv;
-
-    // The initial state is CS_CLOSED
-    ASSERT_EQ(rtc::AsyncSocket::CS_CLOSED, client_->GetState());
-
-    rv = client_->Connect(server_->GetHostname(), server_->GetAddress());
-    ASSERT_EQ(0, rv);
-
-    // Now the state should be CS_CONNECTING
-    ASSERT_EQ(rtc::AsyncSocket::CS_CONNECTING, client_->GetState());
-
-    if (ssl_mode_ == rtc::SSL_MODE_DTLS) {
-      // For DTLS, call AcceptConnection() with the client's address.
-      server_->AcceptConnection(client_->GetAddress());
-    }
-
-    if (expect_success) {
-      // If expecting success, the client should end up in the CS_CONNECTED
-      // state after handshake.
-      EXPECT_EQ_WAIT(rtc::AsyncSocket::CS_CONNECTED, client_->GetState(),
-          handshake_wait_);
-
-      LOG(LS_INFO) << GetSSLProtocolName(ssl_mode_) << " handshake complete.";
-
-    } else {
-      // On handshake failure the client should end up in the CS_CLOSED state.
-      EXPECT_EQ_WAIT(rtc::AsyncSocket::CS_CLOSED, client_->GetState(),
-          handshake_wait_);
-
-      LOG(LS_INFO) << GetSSLProtocolName(ssl_mode_) << " handshake failed.";
-    }
-  }
-
-  void TestTransfer(const std::string& message) {
-    int rv;
-
-    rv = client_->Send(message);
-    ASSERT_EQ(static_cast<int>(message.length()), rv);
-
-    // The server should have received the client's message.
-    EXPECT_EQ_WAIT(message, server_->GetReceivedData(), kTimeout);
-
-    rv = server_->Send(message);
-    ASSERT_EQ(static_cast<int>(message.length()), rv);
-
-    // The client should have received the server's message.
-    EXPECT_EQ_WAIT(message, client_->GetReceivedData(), kTimeout);
-
-    LOG(LS_INFO) << "Transfer complete.";
-  }
-
- protected:
-  const rtc::SSLMode ssl_mode_;
-
-  std::unique_ptr<rtc::VirtualSocketServer> vss_;
-  rtc::AutoSocketServerThread thread_;
-  std::unique_ptr<SSLAdapterTestDummyServer> server_;
-  std::unique_ptr<SSLAdapterTestDummyClient> client_;
-
-  int handshake_wait_;
-};
-
-class SSLAdapterTestTLS_RSA : public SSLAdapterTestBase {
- public:
-  SSLAdapterTestTLS_RSA()
-      : SSLAdapterTestBase(rtc::SSL_MODE_TLS, rtc::KeyParams::RSA()) {}
-};
-
-class SSLAdapterTestTLS_ECDSA : public SSLAdapterTestBase {
- public:
-  SSLAdapterTestTLS_ECDSA()
-      : SSLAdapterTestBase(rtc::SSL_MODE_TLS, rtc::KeyParams::ECDSA()) {}
-};
-
-class SSLAdapterTestDTLS_RSA : public SSLAdapterTestBase {
- public:
-  SSLAdapterTestDTLS_RSA()
-      : SSLAdapterTestBase(rtc::SSL_MODE_DTLS, rtc::KeyParams::RSA()) {}
-};
-
-class SSLAdapterTestDTLS_ECDSA : public SSLAdapterTestBase {
- public:
-  SSLAdapterTestDTLS_ECDSA()
-      : SSLAdapterTestBase(rtc::SSL_MODE_DTLS, rtc::KeyParams::ECDSA()) {}
-};
-
-// Basic tests: TLS
-
-// Test that handshake works, using RSA
-TEST_F(SSLAdapterTestTLS_RSA, TestTLSConnect) {
-  TestHandshake(true);
-}
-
-// Test that handshake works, using ECDSA
-TEST_F(SSLAdapterTestTLS_ECDSA, TestTLSConnect) {
-  TestHandshake(true);
-}
-
-// Test transfer between client and server, using RSA
-TEST_F(SSLAdapterTestTLS_RSA, TestTLSTransfer) {
-  TestHandshake(true);
-  TestTransfer("Hello, world!");
-}
-
-TEST_F(SSLAdapterTestTLS_RSA, TestTLSTransferWithBlockedSocket) {
-  TestHandshake(true);
-
-  // Tell the underlying socket to simulate being blocked.
-  vss_->SetSendingBlocked(true);
-
-  std::string expected;
-  int rv;
-  // Send messages until the SSL socket adapter starts applying backpressure.
-  // Note that this may not occur immediately since there may be some amount of
-  // intermediate buffering (either in our code or in BoringSSL).
-  for (int i = 0; i < 1024; ++i) {
-    std::string message = "Hello, world: " + rtc::ToString(i);
-    rv = client_->Send(message);
-    if (rv != static_cast<int>(message.size())) {
-      // This test assumes either the whole message or none of it is sent.
-      ASSERT_EQ(-1, rv);
-      break;
-    }
-    expected += message;
-  }
-  // Assert that the loop above exited due to Send returning -1.
-  ASSERT_EQ(-1, rv);
-
-  // Try sending another message while blocked. -1 should be returned again and
-  // it shouldn't end up received by the server later.
-  EXPECT_EQ(-1, client_->Send("Never sent"));
-
-  // Unblock the underlying socket. All of the buffered messages should be sent
-  // without any further action.
-  vss_->SetSendingBlocked(false);
-  EXPECT_EQ_WAIT(expected, server_->GetReceivedData(), kTimeout);
-
-  // Send another message. This previously wasn't working
-  std::string final_message = "Fin.";
-  expected += final_message;
-  EXPECT_EQ(static_cast<int>(final_message.size()),
-            client_->Send(final_message));
-  EXPECT_EQ_WAIT(expected, server_->GetReceivedData(), kTimeout);
-}
-
-// Test transfer between client and server, using ECDSA
-TEST_F(SSLAdapterTestTLS_ECDSA, TestTLSTransfer) {
-  TestHandshake(true);
-  TestTransfer("Hello, world!");
-}
-
-// Test transfer using ALPN with protos as h2 and http/1.1
-TEST_F(SSLAdapterTestTLS_ECDSA, TestTLSALPN) {
-  std::vector<std::string> alpn_protos{"h2", "http/1.1"};
-  SetAlpnProtocols(alpn_protos);
-  TestHandshake(true);
-  TestTransfer("Hello, world!");
-}
-
-// Test transfer with TLS Elliptic curves set to "X25519:P-256:P-384:P-521"
-TEST_F(SSLAdapterTestTLS_ECDSA, TestTLSEllipticCurves) {
-  std::vector<std::string> elliptic_curves{"X25519", "P-256", "P-384", "P-521"};
-  SetEllipticCurves(elliptic_curves);
-  TestHandshake(true);
-  TestTransfer("Hello, world!");
-}
-
-// Basic tests: DTLS
-
-// Test that handshake works, using RSA
-TEST_F(SSLAdapterTestDTLS_RSA, TestDTLSConnect) {
-  TestHandshake(true);
-}
-
-// Test that handshake works, using ECDSA
-TEST_F(SSLAdapterTestDTLS_ECDSA, TestDTLSConnect) {
-  TestHandshake(true);
-}
-
-// Test transfer between client and server, using RSA
-TEST_F(SSLAdapterTestDTLS_RSA, TestDTLSTransfer) {
-  TestHandshake(true);
-  TestTransfer("Hello, world!");
-}
-
-// Test transfer between client and server, using ECDSA
-TEST_F(SSLAdapterTestDTLS_ECDSA, TestDTLSTransfer) {
-  TestHandshake(true);
-  TestTransfer("Hello, world!");
-}
diff --git a/rtc_base/sslfingerprint.cc b/rtc_base/sslfingerprint.cc
deleted file mode 100644
index adf3851..0000000
--- a/rtc_base/sslfingerprint.cc
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- *  Copyright 2012 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/rtc_base/sslfingerprint.h"
-
-#include <ctype.h>
-#include <string>
-
-#include "webrtc/rtc_base/helpers.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/messagedigest.h"
-#include "webrtc/rtc_base/stringencode.h"
-
-namespace rtc {
-
-SSLFingerprint* SSLFingerprint::Create(
-    const std::string& algorithm, const rtc::SSLIdentity* identity) {
-  if (!identity) {
-    return nullptr;
-  }
-
-  return Create(algorithm, &(identity->certificate()));
-}
-
-SSLFingerprint* SSLFingerprint::Create(
-    const std::string& algorithm, const rtc::SSLCertificate* cert) {
-  uint8_t digest_val[64];
-  size_t digest_len;
-  bool ret = cert->ComputeDigest(
-      algorithm, digest_val, sizeof(digest_val), &digest_len);
-  if (!ret) {
-    return nullptr;
-  }
-
-  return new SSLFingerprint(algorithm, digest_val, digest_len);
-}
-
-SSLFingerprint* SSLFingerprint::CreateFromRfc4572(
-    const std::string& algorithm, const std::string& fingerprint) {
-  if (algorithm.empty() || !rtc::IsFips180DigestAlgorithm(algorithm))
-    return nullptr;
-
-  if (fingerprint.empty())
-    return nullptr;
-
-  size_t value_len;
-  char value[rtc::MessageDigest::kMaxSize];
-  value_len = rtc::hex_decode_with_delimiter(value, sizeof(value),
-                                                   fingerprint.c_str(),
-                                                   fingerprint.length(),
-                                                   ':');
-  if (!value_len)
-    return nullptr;
-
-  return new SSLFingerprint(algorithm, reinterpret_cast<uint8_t*>(value),
-                            value_len);
-}
-
-SSLFingerprint* SSLFingerprint::CreateFromCertificate(
-    const RTCCertificate* cert) {
-  std::string digest_alg;
-  if (!cert->ssl_certificate().GetSignatureDigestAlgorithm(&digest_alg)) {
-    LOG(LS_ERROR) << "Failed to retrieve the certificate's digest algorithm";
-    return nullptr;
-  }
-
-  SSLFingerprint* fingerprint = Create(digest_alg, cert->identity());
-  if (!fingerprint) {
-    LOG(LS_ERROR) << "Failed to create identity fingerprint, alg="
-                  << digest_alg;
-  }
-  return fingerprint;
-}
-
-SSLFingerprint::SSLFingerprint(const std::string& algorithm,
-                               const uint8_t* digest_in,
-                               size_t digest_len)
-    : algorithm(algorithm) {
-  digest.SetData(digest_in, digest_len);
-}
-
-SSLFingerprint::SSLFingerprint(const SSLFingerprint& from)
-    : algorithm(from.algorithm), digest(from.digest) {}
-
-bool SSLFingerprint::operator==(const SSLFingerprint& other) const {
-  return algorithm == other.algorithm &&
-         digest == other.digest;
-}
-
-std::string SSLFingerprint::GetRfc4572Fingerprint() const {
-  std::string fingerprint =
-      rtc::hex_encode_with_delimiter(digest.data<char>(), digest.size(), ':');
-  std::transform(fingerprint.begin(), fingerprint.end(),
-                 fingerprint.begin(), ::toupper);
-  return fingerprint;
-}
-
-std::string SSLFingerprint::ToString() const {
-  std::string fp_str = algorithm;
-  fp_str.append(" ");
-  fp_str.append(GetRfc4572Fingerprint());
-  return fp_str;
-}
-
-}  // namespace rtc
diff --git a/rtc_base/sslfingerprint.h b/rtc_base/sslfingerprint.h
deleted file mode 100644
index 557ac56..0000000
--- a/rtc_base/sslfingerprint.h
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- *  Copyright 2012 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_RTC_BASE_SSLFINGERPRINT_H_
-#define WEBRTC_RTC_BASE_SSLFINGERPRINT_H_
-
-#include <string>
-
-#include "webrtc/rtc_base/basictypes.h"
-#include "webrtc/rtc_base/copyonwritebuffer.h"
-#include "webrtc/rtc_base/rtccertificate.h"
-#include "webrtc/rtc_base/sslidentity.h"
-
-namespace rtc {
-
-class SSLCertificate;
-
-struct SSLFingerprint {
-  static SSLFingerprint* Create(const std::string& algorithm,
-                                const rtc::SSLIdentity* identity);
-
-  static SSLFingerprint* Create(const std::string& algorithm,
-                                const rtc::SSLCertificate* cert);
-
-  static SSLFingerprint* CreateFromRfc4572(const std::string& algorithm,
-                                           const std::string& fingerprint);
-
-  // Creates a fingerprint from a certificate, using the same digest algorithm
-  // as the certificate's signature.
-  static SSLFingerprint* CreateFromCertificate(const RTCCertificate* cert);
-
-  SSLFingerprint(const std::string& algorithm,
-                 const uint8_t* digest_in,
-                 size_t digest_len);
-
-  SSLFingerprint(const SSLFingerprint& from);
-
-  bool operator==(const SSLFingerprint& other) const;
-
-  std::string GetRfc4572Fingerprint() const;
-
-  std::string ToString() const;
-
-  std::string algorithm;
-  rtc::CopyOnWriteBuffer digest;
-};
-
-}  // namespace rtc
-
-#endif  // WEBRTC_RTC_BASE_SSLFINGERPRINT_H_
diff --git a/rtc_base/sslidentity.cc b/rtc_base/sslidentity.cc
deleted file mode 100644
index 38c27ca..0000000
--- a/rtc_base/sslidentity.cc
+++ /dev/null
@@ -1,325 +0,0 @@
-/*
- *  Copyright 2004 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.
- */
-
-// Handling of certificates and keypairs for SSLStreamAdapter's peer mode.
-#include "webrtc/rtc_base/sslidentity.h"
-
-#include <ctime>
-#include <string>
-
-#include "webrtc/rtc_base/base64.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/opensslidentity.h"
-#include "webrtc/rtc_base/sslfingerprint.h"
-
-namespace rtc {
-
-const char kPemTypeCertificate[] = "CERTIFICATE";
-const char kPemTypeRsaPrivateKey[] = "RSA PRIVATE KEY";
-const char kPemTypeEcPrivateKey[] = "EC PRIVATE KEY";
-
-SSLCertificateStats::SSLCertificateStats(
-    std::string&& fingerprint,
-    std::string&& fingerprint_algorithm,
-    std::string&& base64_certificate,
-    std::unique_ptr<SSLCertificateStats>&& issuer)
-    : fingerprint(std::move(fingerprint)),
-      fingerprint_algorithm(std::move(fingerprint_algorithm)),
-      base64_certificate(std::move(base64_certificate)),
-      issuer(std::move(issuer)) {
-}
-
-SSLCertificateStats::~SSLCertificateStats() {
-}
-
-std::unique_ptr<SSLCertificateStats> SSLCertificate::GetStats() const {
-  // We have a certificate and optionally a chain of certificates. This forms a
-  // linked list, starting with |this|, then the first element of |chain| and
-  // ending with the last element of |chain|. The "issuer" of a certificate is
-  // the next certificate in the chain. Stats are produced for each certificate
-  // in the list. Here, the "issuer" is the issuer's stats.
-  std::unique_ptr<SSLCertChain> chain = GetChain();
-  std::unique_ptr<SSLCertificateStats> issuer;
-  if (chain) {
-    // The loop runs in reverse so that the |issuer| is known before the
-    // |cert|'s stats.
-    for (ptrdiff_t i = chain->GetSize() - 1; i >= 0; --i) {
-      const SSLCertificate* cert = &chain->Get(i);
-      issuer = cert->GetStats(std::move(issuer));
-    }
-  }
-  return GetStats(std::move(issuer));
-}
-
-std::unique_ptr<SSLCertificateStats> SSLCertificate::GetStats(
-    std::unique_ptr<SSLCertificateStats> issuer) const {
-  // TODO(bemasc): Move this computation to a helper class that caches these
-  // values to reduce CPU use in |StatsCollector::GetStats|. This will require
-  // adding a fast |SSLCertificate::Equals| to detect certificate changes.
-  std::string digest_algorithm;
-  if (!GetSignatureDigestAlgorithm(&digest_algorithm))
-    return nullptr;
-
-  // |SSLFingerprint::Create| can fail if the algorithm returned by
-  // |SSLCertificate::GetSignatureDigestAlgorithm| is not supported by the
-  // implementation of |SSLCertificate::ComputeDigest|. This currently happens
-  // with MD5- and SHA-224-signed certificates when linked to libNSS.
-  std::unique_ptr<SSLFingerprint> ssl_fingerprint(
-      SSLFingerprint::Create(digest_algorithm, this));
-  if (!ssl_fingerprint)
-    return nullptr;
-  std::string fingerprint = ssl_fingerprint->GetRfc4572Fingerprint();
-
-  Buffer der_buffer;
-  ToDER(&der_buffer);
-  std::string der_base64;
-  Base64::EncodeFromArray(der_buffer.data(), der_buffer.size(), &der_base64);
-
-  return std::unique_ptr<SSLCertificateStats>(new SSLCertificateStats(
-      std::move(fingerprint),
-      std::move(digest_algorithm),
-      std::move(der_base64),
-      std::move(issuer)));
-}
-
-KeyParams::KeyParams(KeyType key_type) {
-  if (key_type == KT_ECDSA) {
-    type_ = KT_ECDSA;
-    params_.curve = EC_NIST_P256;
-  } else if (key_type == KT_RSA) {
-    type_ = KT_RSA;
-    params_.rsa.mod_size = kRsaDefaultModSize;
-    params_.rsa.pub_exp = kRsaDefaultExponent;
-  } else {
-    RTC_NOTREACHED();
-  }
-}
-
-// static
-KeyParams KeyParams::RSA(int mod_size, int pub_exp) {
-  KeyParams kt(KT_RSA);
-  kt.params_.rsa.mod_size = mod_size;
-  kt.params_.rsa.pub_exp = pub_exp;
-  return kt;
-}
-
-// static
-KeyParams KeyParams::ECDSA(ECCurve curve) {
-  KeyParams kt(KT_ECDSA);
-  kt.params_.curve = curve;
-  return kt;
-}
-
-bool KeyParams::IsValid() const {
-  if (type_ == KT_RSA) {
-    return (params_.rsa.mod_size >= kRsaMinModSize &&
-            params_.rsa.mod_size <= kRsaMaxModSize &&
-            params_.rsa.pub_exp > params_.rsa.mod_size);
-  } else if (type_ == KT_ECDSA) {
-    return (params_.curve == EC_NIST_P256);
-  }
-  return false;
-}
-
-RSAParams KeyParams::rsa_params() const {
-  RTC_DCHECK(type_ == KT_RSA);
-  return params_.rsa;
-}
-
-ECCurve KeyParams::ec_curve() const {
-  RTC_DCHECK(type_ == KT_ECDSA);
-  return params_.curve;
-}
-
-KeyType IntKeyTypeFamilyToKeyType(int key_type_family) {
-  return static_cast<KeyType>(key_type_family);
-}
-
-bool SSLIdentity::PemToDer(const std::string& pem_type,
-                           const std::string& pem_string,
-                           std::string* der) {
-  // Find the inner body. We need this to fulfill the contract of
-  // returning pem_length.
-  size_t header = pem_string.find("-----BEGIN " + pem_type + "-----");
-  if (header == std::string::npos)
-    return false;
-
-  size_t body = pem_string.find("\n", header);
-  if (body == std::string::npos)
-    return false;
-
-  size_t trailer = pem_string.find("-----END " + pem_type + "-----");
-  if (trailer == std::string::npos)
-    return false;
-
-  std::string inner = pem_string.substr(body + 1, trailer - (body + 1));
-
-  *der = Base64::Decode(inner, Base64::DO_PARSE_WHITE |
-                        Base64::DO_PAD_ANY |
-                        Base64::DO_TERM_BUFFER);
-  return true;
-}
-
-std::string SSLIdentity::DerToPem(const std::string& pem_type,
-                                  const unsigned char* data,
-                                  size_t length) {
-  std::stringstream result;
-
-  result << "-----BEGIN " << pem_type << "-----\n";
-
-  std::string b64_encoded;
-  Base64::EncodeFromArray(data, length, &b64_encoded);
-
-  // Divide the Base-64 encoded data into 64-character chunks, as per
-  // 4.3.2.4 of RFC 1421.
-  static const size_t kChunkSize = 64;
-  size_t chunks = (b64_encoded.size() + (kChunkSize - 1)) / kChunkSize;
-  for (size_t i = 0, chunk_offset = 0; i < chunks;
-       ++i, chunk_offset += kChunkSize) {
-    result << b64_encoded.substr(chunk_offset, kChunkSize);
-    result << "\n";
-  }
-
-  result << "-----END " << pem_type << "-----\n";
-
-  return result.str();
-}
-
-SSLCertChain::SSLCertChain(const std::vector<SSLCertificate*>& certs) {
-  RTC_DCHECK(!certs.empty());
-  certs_.resize(certs.size());
-  std::transform(certs.begin(), certs.end(), certs_.begin(), DupCert);
-}
-
-SSLCertChain::SSLCertChain(const SSLCertificate* cert) {
-  certs_.push_back(cert->GetReference());
-}
-
-SSLCertChain::~SSLCertChain() {
-  std::for_each(certs_.begin(), certs_.end(), DeleteCert);
-}
-
-// static
-SSLCertificate* SSLCertificate::FromPEMString(const std::string& pem_string) {
-  return OpenSSLCertificate::FromPEMString(pem_string);
-}
-
-// static
-SSLIdentity* SSLIdentity::GenerateWithExpiration(const std::string& common_name,
-                                                 const KeyParams& key_params,
-                                                 time_t certificate_lifetime) {
-  return OpenSSLIdentity::GenerateWithExpiration(common_name, key_params,
-                                                 certificate_lifetime);
-}
-
-// static
-SSLIdentity* SSLIdentity::Generate(const std::string& common_name,
-                                   const KeyParams& key_params) {
-  return OpenSSLIdentity::GenerateWithExpiration(
-      common_name, key_params, kDefaultCertificateLifetimeInSeconds);
-}
-
-// static
-SSLIdentity* SSLIdentity::Generate(const std::string& common_name,
-                                   KeyType key_type) {
-  return OpenSSLIdentity::GenerateWithExpiration(
-      common_name, KeyParams(key_type), kDefaultCertificateLifetimeInSeconds);
-}
-
-SSLIdentity* SSLIdentity::GenerateForTest(const SSLIdentityParams& params) {
-  return OpenSSLIdentity::GenerateForTest(params);
-}
-
-// static
-SSLIdentity* SSLIdentity::FromPEMStrings(const std::string& private_key,
-                                         const std::string& certificate) {
-  return OpenSSLIdentity::FromPEMStrings(private_key, certificate);
-}
-
-bool operator==(const SSLIdentity& a, const SSLIdentity& b) {
-  return static_cast<const OpenSSLIdentity&>(a) ==
-         static_cast<const OpenSSLIdentity&>(b);
-}
-bool operator!=(const SSLIdentity& a, const SSLIdentity& b) {
-  return !(a == b);
-}
-
-// Read |n| bytes from ASN1 number string at *|pp| and return the numeric value.
-// Update *|pp| and *|np| to reflect number of read bytes.
-static inline int ASN1ReadInt(const unsigned char** pp, size_t* np, size_t n) {
-  const unsigned char* p = *pp;
-  int x = 0;
-  for (size_t i = 0; i < n; i++)
-    x = 10 * x + p[i] - '0';
-  *pp = p + n;
-  *np = *np - n;
-  return x;
-}
-
-int64_t ASN1TimeToSec(const unsigned char* s, size_t length, bool long_format) {
-  size_t bytes_left = length;
-
-  // Make sure the string ends with Z.  Doing it here protects the strspn call
-  // from running off the end of the string in Z's absense.
-  if (length == 0 || s[length - 1] != 'Z')
-    return -1;
-
-  // Make sure we only have ASCII digits so that we don't need to clutter the
-  // code below and ASN1ReadInt with error checking.
-  size_t n = strspn(reinterpret_cast<const char*>(s), "0123456789");
-  if (n + 1 != length)
-    return -1;
-
-  int year;
-
-  // Read out ASN1 year, in either 2-char "UTCTIME" or 4-char "GENERALIZEDTIME"
-  // format.  Both format use UTC in this context.
-  if (long_format) {
-    // ASN1 format: yyyymmddhh[mm[ss[.fff]]]Z where the Z is literal, but
-    // RFC 5280 requires us to only support exactly yyyymmddhhmmssZ.
-
-    if (bytes_left < 11)
-      return -1;
-
-    year = ASN1ReadInt(&s, &bytes_left, 4);
-    year -= 1900;
-  } else {
-    // ASN1 format: yymmddhhmm[ss]Z where the Z is literal, but RFC 5280
-    // requires us to only support exactly yymmddhhmmssZ.
-
-    if (bytes_left < 9)
-      return -1;
-
-    year = ASN1ReadInt(&s, &bytes_left, 2);
-    if (year < 50)  // Per RFC 5280 4.1.2.5.1
-      year += 100;
-  }
-
-  std::tm tm;
-  tm.tm_year = year;
-
-  // Read out remaining ASN1 time data and store it in |tm| in documented
-  // std::tm format.
-  tm.tm_mon = ASN1ReadInt(&s, &bytes_left, 2) - 1;
-  tm.tm_mday = ASN1ReadInt(&s, &bytes_left, 2);
-  tm.tm_hour = ASN1ReadInt(&s, &bytes_left, 2);
-  tm.tm_min = ASN1ReadInt(&s, &bytes_left, 2);
-  tm.tm_sec = ASN1ReadInt(&s, &bytes_left, 2);
-
-  if (bytes_left != 1) {
-    // Now just Z should remain.  Its existence was asserted above.
-    return -1;
-  }
-
-  return TmToSeconds(tm);
-}
-
-}  // namespace rtc
diff --git a/rtc_base/sslidentity.h b/rtc_base/sslidentity.h
deleted file mode 100644
index e6ac527..0000000
--- a/rtc_base/sslidentity.h
+++ /dev/null
@@ -1,274 +0,0 @@
-/*
- *  Copyright 2004 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.
- */
-
-// Handling of certificates and keypairs for SSLStreamAdapter's peer mode.
-
-#ifndef WEBRTC_RTC_BASE_SSLIDENTITY_H_
-#define WEBRTC_RTC_BASE_SSLIDENTITY_H_
-
-#include <algorithm>
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "webrtc/rtc_base/buffer.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/messagedigest.h"
-#include "webrtc/rtc_base/timeutils.h"
-
-namespace rtc {
-
-// Forward declaration due to circular dependency with SSLCertificate.
-class SSLCertChain;
-
-struct SSLCertificateStats {
-  SSLCertificateStats(std::string&& fingerprint,
-                      std::string&& fingerprint_algorithm,
-                      std::string&& base64_certificate,
-                      std::unique_ptr<SSLCertificateStats>&& issuer);
-  ~SSLCertificateStats();
-  std::string fingerprint;
-  std::string fingerprint_algorithm;
-  std::string base64_certificate;
-  std::unique_ptr<SSLCertificateStats> issuer;
-};
-
-// Abstract interface overridden by SSL library specific
-// implementations.
-
-// A somewhat opaque type used to encapsulate a certificate.
-// Wraps the SSL library's notion of a certificate, with reference counting.
-// The SSLCertificate object is pretty much immutable once created.
-// (The OpenSSL implementation only does reference counting and
-// possibly caching of intermediate results.)
-class SSLCertificate {
- public:
-  // Parses and builds a certificate from a PEM encoded string.
-  // Returns null on failure.
-  // The length of the string representation of the certificate is
-  // stored in *pem_length if it is non-null, and only if
-  // parsing was successful.
-  // Caller is responsible for freeing the returned object.
-  static SSLCertificate* FromPEMString(const std::string& pem_string);
-  virtual ~SSLCertificate() {}
-
-  // Returns a new SSLCertificate object instance wrapping the same
-  // underlying certificate, including its chain if present.
-  // Caller is responsible for freeing the returned object.
-  virtual SSLCertificate* GetReference() const = 0;
-
-  // Provides the cert chain, or null. The chain includes a copy of each
-  // certificate, excluding the leaf.
-  virtual std::unique_ptr<SSLCertChain> GetChain() const = 0;
-
-  // Returns a PEM encoded string representation of the certificate.
-  virtual std::string ToPEMString() const = 0;
-
-  // Provides a DER encoded binary representation of the certificate.
-  virtual void ToDER(Buffer* der_buffer) const = 0;
-
-  // Gets the name of the digest algorithm that was used to compute this
-  // certificate's signature.
-  virtual bool GetSignatureDigestAlgorithm(std::string* algorithm) const = 0;
-
-  // Compute the digest of the certificate given algorithm
-  virtual bool ComputeDigest(const std::string& algorithm,
-                             unsigned char* digest,
-                             size_t size,
-                             size_t* length) const = 0;
-
-  // Returns the time in seconds relative to epoch, 1970-01-01T00:00:00Z (UTC),
-  // or -1 if an expiration time could not be retrieved.
-  virtual int64_t CertificateExpirationTime() const = 0;
-
-  // Gets information (fingerprint, etc.) about this certificate and its chain
-  // (if it has a certificate chain). This is used for certificate stats, see
-  // https://w3c.github.io/webrtc-stats/#certificatestats-dict*.
-  std::unique_ptr<SSLCertificateStats> GetStats() const;
-
- private:
-  std::unique_ptr<SSLCertificateStats> GetStats(
-    std::unique_ptr<SSLCertificateStats> issuer) const;
-};
-
-// SSLCertChain is a simple wrapper for a vector of SSLCertificates. It serves
-// primarily to ensure proper memory management (especially deletion) of the
-// SSLCertificate pointers.
-class SSLCertChain {
- public:
-  // These constructors copy the provided SSLCertificate(s), so the caller
-  // retains ownership.
-  explicit SSLCertChain(const std::vector<SSLCertificate*>& certs);
-  explicit SSLCertChain(const SSLCertificate* cert);
-  ~SSLCertChain();
-
-  // Vector access methods.
-  size_t GetSize() const { return certs_.size(); }
-
-  // Returns a temporary reference, only valid until the chain is destroyed.
-  const SSLCertificate& Get(size_t pos) const { return *(certs_[pos]); }
-
-  // Returns a new SSLCertChain object instance wrapping the same underlying
-  // certificate chain.  Caller is responsible for freeing the returned object.
-  SSLCertChain* Copy() const {
-    return new SSLCertChain(certs_);
-  }
-
- private:
-  // Helper function for duplicating a vector of certificates.
-  static SSLCertificate* DupCert(const SSLCertificate* cert) {
-    return cert->GetReference();
-  }
-
-  // Helper function for deleting a vector of certificates.
-  static void DeleteCert(SSLCertificate* cert) { delete cert; }
-
-  std::vector<SSLCertificate*> certs_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(SSLCertChain);
-};
-
-// KT_LAST is intended for vector declarations and loops over all key types;
-// it does not represent any key type in itself.
-// KT_DEFAULT is used as the default KeyType for KeyParams.
-enum KeyType { KT_RSA, KT_ECDSA, KT_LAST, KT_DEFAULT = KT_ECDSA };
-
-static const int kRsaDefaultModSize = 1024;
-static const int kRsaDefaultExponent = 0x10001;  // = 2^16+1 = 65537
-static const int kRsaMinModSize = 1024;
-static const int kRsaMaxModSize = 8192;
-
-// Certificate default validity lifetime.
-static const int kDefaultCertificateLifetimeInSeconds =
-    60 * 60 * 24 * 30;  // 30 days
-// Certificate validity window.
-// This is to compensate for slightly incorrect system clocks.
-static const int kCertificateWindowInSeconds = -60 * 60 * 24;
-
-struct RSAParams {
-  unsigned int mod_size;
-  unsigned int pub_exp;
-};
-
-enum ECCurve { EC_NIST_P256, /* EC_FANCY, */ EC_LAST };
-
-class KeyParams {
- public:
-  // Generate a KeyParams object from a simple KeyType, using default params.
-  explicit KeyParams(KeyType key_type = KT_DEFAULT);
-
-  // Generate a a KeyParams for RSA with explicit parameters.
-  static KeyParams RSA(int mod_size = kRsaDefaultModSize,
-                       int pub_exp = kRsaDefaultExponent);
-
-  // Generate a a KeyParams for ECDSA specifying the curve.
-  static KeyParams ECDSA(ECCurve curve = EC_NIST_P256);
-
-  // Check validity of a KeyParams object. Since the factory functions have
-  // no way of returning errors, this function can be called after creation
-  // to make sure the parameters are OK.
-  bool IsValid() const;
-
-  RSAParams rsa_params() const;
-
-  ECCurve ec_curve() const;
-
-  KeyType type() const { return type_; }
-
- private:
-  KeyType type_;
-  union {
-    RSAParams rsa;
-    ECCurve curve;
-  } params_;
-};
-
-// TODO(hbos): Remove once rtc::KeyType (to be modified) and
-// blink::WebRTCKeyType (to be landed) match. By using this function in Chromium
-// appropriately we can change KeyType enum -> class without breaking Chromium.
-KeyType IntKeyTypeFamilyToKeyType(int key_type_family);
-
-// Parameters for generating a certificate. If |common_name| is non-empty, it
-// will be used for the certificate's subject and issuer name, otherwise a
-// random string will be used.
-struct SSLIdentityParams {
-  std::string common_name;
-  time_t not_before;  // Absolute time since epoch in seconds.
-  time_t not_after;   // Absolute time since epoch in seconds.
-  KeyParams key_params;
-};
-
-// Our identity in an SSL negotiation: a keypair and certificate (both
-// with the same public key).
-// This too is pretty much immutable once created.
-class SSLIdentity {
- public:
-  // Generates an identity (keypair and self-signed certificate). If
-  // |common_name| is non-empty, it will be used for the certificate's subject
-  // and issuer name, otherwise a random string will be used. The key type and
-  // parameters are defined in |key_param|. The certificate's lifetime in
-  // seconds from the current time is defined in |certificate_lifetime|; it
-  // should be a non-negative number.
-  // Returns null on failure.
-  // Caller is responsible for freeing the returned object.
-  static SSLIdentity* GenerateWithExpiration(const std::string& common_name,
-                                             const KeyParams& key_param,
-                                             time_t certificate_lifetime);
-  static SSLIdentity* Generate(const std::string& common_name,
-                               const KeyParams& key_param);
-  static SSLIdentity* Generate(const std::string& common_name,
-                               KeyType key_type);
-
-  // Generates an identity with the specified validity period.
-  // TODO(torbjorng): Now that Generate() accepts relevant params, make tests
-  // use that instead of this function.
-  static SSLIdentity* GenerateForTest(const SSLIdentityParams& params);
-
-  // Construct an identity from a private key and a certificate.
-  static SSLIdentity* FromPEMStrings(const std::string& private_key,
-                                     const std::string& certificate);
-
-  virtual ~SSLIdentity() {}
-
-  // Returns a new SSLIdentity object instance wrapping the same
-  // identity information.
-  // Caller is responsible for freeing the returned object.
-  // TODO(hbos,torbjorng): Rename to a less confusing name.
-  virtual SSLIdentity* GetReference() const = 0;
-
-  // Returns a temporary reference to the certificate.
-  virtual const SSLCertificate& certificate() const = 0;
-  virtual std::string PrivateKeyToPEMString() const = 0;
-  virtual std::string PublicKeyToPEMString() const = 0;
-
-  // Helpers for parsing converting between PEM and DER format.
-  static bool PemToDer(const std::string& pem_type,
-                       const std::string& pem_string,
-                       std::string* der);
-  static std::string DerToPem(const std::string& pem_type,
-                              const unsigned char* data,
-                              size_t length);
-};
-
-bool operator==(const SSLIdentity& a, const SSLIdentity& b);
-bool operator!=(const SSLIdentity& a, const SSLIdentity& b);
-
-// Convert from ASN1 time as restricted by RFC 5280 to seconds from 1970-01-01
-// 00.00 ("epoch").  If the ASN1 time cannot be read, return -1.  The data at
-// |s| is not 0-terminated; its char count is defined by |length|.
-int64_t ASN1TimeToSec(const unsigned char* s, size_t length, bool long_format);
-
-extern const char kPemTypeCertificate[];
-extern const char kPemTypeRsaPrivateKey[];
-extern const char kPemTypeEcPrivateKey[];
-
-}  // namespace rtc
-
-#endif  // WEBRTC_RTC_BASE_SSLIDENTITY_H_
diff --git a/rtc_base/sslidentity_unittest.cc b/rtc_base/sslidentity_unittest.cc
deleted file mode 100644
index 9b90b4c..0000000
--- a/rtc_base/sslidentity_unittest.cc
+++ /dev/null
@@ -1,613 +0,0 @@
-/*
- *  Copyright 2011 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 <memory>
-#include <string>
-
-#include "webrtc/rtc_base/fakesslidentity.h"
-#include "webrtc/rtc_base/gunit.h"
-#include "webrtc/rtc_base/helpers.h"
-#include "webrtc/rtc_base/ssladapter.h"
-#include "webrtc/rtc_base/sslfingerprint.h"
-#include "webrtc/rtc_base/sslidentity.h"
-#include "webrtc/rtc_base/stringutils.h"
-
-using rtc::SSLIdentity;
-
-const char kTestCertificate[] = "-----BEGIN CERTIFICATE-----\n"
-    "MIIB6TCCAVICAQYwDQYJKoZIhvcNAQEEBQAwWzELMAkGA1UEBhMCQVUxEzARBgNV\n"
-    "BAgTClF1ZWVuc2xhbmQxGjAYBgNVBAoTEUNyeXB0U29mdCBQdHkgTHRkMRswGQYD\n"
-    "VQQDExJUZXN0IENBICgxMDI0IGJpdCkwHhcNMDAxMDE2MjIzMTAzWhcNMDMwMTE0\n"
-    "MjIzMTAzWjBjMQswCQYDVQQGEwJBVTETMBEGA1UECBMKUXVlZW5zbGFuZDEaMBgG\n"
-    "A1UEChMRQ3J5cHRTb2Z0IFB0eSBMdGQxIzAhBgNVBAMTGlNlcnZlciB0ZXN0IGNl\n"
-    "cnQgKDUxMiBiaXQpMFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAJ+zw4Qnlf8SMVIP\n"
-    "Fe9GEcStgOY2Ww/dgNdhjeD8ckUJNP5VZkVDTGiXav6ooKXfX3j/7tdkuD8Ey2//\n"
-    "Kv7+ue0CAwEAATANBgkqhkiG9w0BAQQFAAOBgQCT0grFQeZaqYb5EYfk20XixZV4\n"
-    "GmyAbXMftG1Eo7qGiMhYzRwGNWxEYojf5PZkYZXvSqZ/ZXHXa4g59jK/rJNnaVGM\n"
-    "k+xIX8mxQvlV0n5O9PIha5BX5teZnkHKgL8aKKLKW1BK7YTngsfSzzaeame5iKfz\n"
-    "itAE+OjGF+PFKbwX8Q==\n"
-    "-----END CERTIFICATE-----\n";
-
-const unsigned char kTestCertSha1[] = {
-    0xA6, 0xC8, 0x59, 0xEA, 0xC3, 0x7E, 0x6D, 0x33,
-    0xCF, 0xE2, 0x69, 0x9D, 0x74, 0xE6, 0xF6, 0x8A,
-    0x9E, 0x47, 0xA7, 0xCA};
-const unsigned char kTestCertSha224[] = {
-    0xd4, 0xce, 0xc6, 0xcf, 0x28, 0xcb, 0xe9, 0x77,
-    0x38, 0x36, 0xcf, 0xb1, 0x3b, 0x4a, 0xd7, 0xbd,
-    0xae, 0x24, 0x21, 0x08, 0xcf, 0x6a, 0x44, 0x0d,
-    0x3f, 0x94, 0x2a, 0x5b};
-const unsigned char kTestCertSha256[] = {
-    0x41, 0x6b, 0xb4, 0x93, 0x47, 0x79, 0x77, 0x24,
-    0x77, 0x0b, 0x8b, 0x2e, 0xa6, 0x2b, 0xe0, 0xf9,
-    0x0a, 0xed, 0x1f, 0x31, 0xa6, 0xf7, 0x5c, 0xa1,
-    0x5a, 0xc4, 0xb0, 0xa2, 0xa4, 0x78, 0xb9, 0x76};
-const unsigned char kTestCertSha384[] = {
-    0x42, 0x31, 0x9a, 0x79, 0x1d, 0xd6, 0x08, 0xbf,
-    0x3b, 0xba, 0x36, 0xd8, 0x37, 0x4a, 0x9a, 0x75,
-    0xd3, 0x25, 0x6e, 0x28, 0x92, 0xbe, 0x06, 0xb7,
-    0xc5, 0xa0, 0x83, 0xe3, 0x86, 0xb1, 0x03, 0xfc,
-    0x64, 0x47, 0xd6, 0xd8, 0xaa, 0xd9, 0x36, 0x60,
-    0x04, 0xcc, 0xbe, 0x7d, 0x6a, 0xe8, 0x34, 0x49};
-const unsigned char kTestCertSha512[] = {
-    0x51, 0x1d, 0xec, 0x02, 0x3d, 0x51, 0x45, 0xd3,
-    0xd8, 0x1d, 0xa4, 0x9d, 0x43, 0xc9, 0xee, 0x32,
-    0x6f, 0x4f, 0x37, 0xee, 0xab, 0x3f, 0x25, 0xdf,
-    0x72, 0xfc, 0x61, 0x1a, 0xd5, 0x92, 0xff, 0x6b,
-    0x28, 0x71, 0x58, 0xb3, 0xe1, 0x8a, 0x18, 0xcf,
-    0x61, 0x33, 0x0e, 0x14, 0xc3, 0x04, 0xaa, 0x07,
-    0xf6, 0xa5, 0xda, 0xdc, 0x42, 0x42, 0x22, 0x35,
-    0xce, 0x26, 0x58, 0x4a, 0x33, 0x6d, 0xbc, 0xb6};
-
-// These PEM strings were created by generating an identity with
-// |SSLIdentity::Generate| and invoking |identity->PrivateKeyToPEMString()|,
-// |identity->PublicKeyToPEMString()| and
-// |identity->certificate().ToPEMString()|. If the crypto library is updated,
-// and the update changes the string form of the keys, these will have to be
-// updated too.  The fingerprint, fingerprint algorithm and base64 certificate
-// were created by calling |identity->certificate().GetStats()|.
-static const char kRSA_PRIVATE_KEY_PEM[] =
-    "-----BEGIN PRIVATE KEY-----\n"
-    "MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAMQPqDStRlYeDpkX\n"
-    "erRmv+a1naM8vSVSY0gG2plnrnofViWRW3MRqWC+020MsIj3hPZeSAnt/y/FL/nr\n"
-    "4Ea7NXcwdRo1/1xEK7U/f/cjSg1aunyvHCHwcFcMr31HLFvHr0ZgcFwbgIuFLNEl\n"
-    "7kK5HMO9APz1ntUjek8BmBj8yMl9AgMBAAECgYA8FWBC5GcNtSBcIinkZyigF0A7\n"
-    "6j081sa+J/uNz4xUuI257ZXM6biygUhhvuXK06/XoIULJfhyN0fAm1yb0HtNhiUs\n"
-    "kMOYeon6b8FqFaPjrQf7Gr9FMiIHXNK19uegTMKztXyPZoUWlX84X0iawY95x0Y3\n"
-    "73f6P2rN2UOjlVVjAQJBAOKy3l2w3Zj2w0oAJox0eMwl+RxBNt1C42SHrob2mFUT\n"
-    "rytpVVYOasr8CoDI0kjacjI94sLum+buJoXXX6YTGO0CQQDdZwlYIEkoS3ftfxPa\n"
-    "Ai0YTBzAWvHJg0r8Gk/TkHo6IM+LSsZ9ZYUv/vBe4BKLw1I4hZ+bQvBiq+f8ROtk\n"
-    "+TDRAkAPL3ghwoU1h+IRBO2QHwUwd6K2N9AbBi4BP+168O3HVSg4ujeTKigRLMzv\n"
-    "T4R2iNt5bhfQgvdCgtVlxcWMdF8JAkBwDCg3eEdt5BuyjwBt8XH+/O4ED0KUWCTH\n"
-    "x00k5dZlupsuhE5Fwe4QpzXg3gekwdnHjyCCQ/NCDHvgOMTkmhQxAkA9V03KRX9b\n"
-    "bhvEzY/fu8gEp+EzsER96/D79az5z1BaMGL5OPM2xHBPJATKlswnAa7Lp3QKGZGk\n"
-    "TxslfL18J71s\n"
-    "-----END PRIVATE KEY-----\n";
-static const char kRSA_PUBLIC_KEY_PEM[] =
-    "-----BEGIN PUBLIC KEY-----\n"
-    "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDED6g0rUZWHg6ZF3q0Zr/mtZ2j\n"
-    "PL0lUmNIBtqZZ656H1YlkVtzEalgvtNtDLCI94T2XkgJ7f8vxS/56+BGuzV3MHUa\n"
-    "Nf9cRCu1P3/3I0oNWrp8rxwh8HBXDK99Ryxbx69GYHBcG4CLhSzRJe5CuRzDvQD8\n"
-    "9Z7VI3pPAZgY/MjJfQIDAQAB\n"
-    "-----END PUBLIC KEY-----\n";
-static const char kRSA_CERT_PEM[] =
-    "-----BEGIN CERTIFICATE-----\n"
-    "MIIBnDCCAQWgAwIBAgIJAOEHLgeWYwrpMA0GCSqGSIb3DQEBCwUAMBAxDjAMBgNV\n"
-    "BAMMBXRlc3QxMB4XDTE2MDQyNDE4MTAyMloXDTE2MDUyNTE4MTAyMlowEDEOMAwG\n"
-    "A1UEAwwFdGVzdDEwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMQPqDStRlYe\n"
-    "DpkXerRmv+a1naM8vSVSY0gG2plnrnofViWRW3MRqWC+020MsIj3hPZeSAnt/y/F\n"
-    "L/nr4Ea7NXcwdRo1/1xEK7U/f/cjSg1aunyvHCHwcFcMr31HLFvHr0ZgcFwbgIuF\n"
-    "LNEl7kK5HMO9APz1ntUjek8BmBj8yMl9AgMBAAEwDQYJKoZIhvcNAQELBQADgYEA\n"
-    "C3ehaZFl+oEYN069C2ht/gMzuC77L854RF/x7xRtNZzkcg9TVgXXdM3auUvJi8dx\n"
-    "yTpU3ixErjQvoZew5ngXTEvTY8BSQUijJEaLWh8n6NDKRbEGTdAk8nPAmq9hdCFq\n"
-    "e3UkexqNHm3g/VxG4NUC1Y+w29ai0/Rgh+VvgbDwK+Q=\n"
-    "-----END CERTIFICATE-----\n";
-static const char kRSA_FINGERPRINT[] =
-    "3C:E8:B2:70:09:CF:A9:09:5A:F4:EF:8F:8D:8A:32:FF:EA:04:91:BA:6E:D4:17:78:16"
-    ":2A:EE:F9:9A:DD:E2:2B";
-static const char kRSA_FINGERPRINT_ALGORITHM[] =
-    "sha-256";
-static const char kRSA_BASE64_CERTIFICATE[] =
-    "MIIBnDCCAQWgAwIBAgIJAOEHLgeWYwrpMA0GCSqGSIb3DQEBCwUAMBAxDjAMBgNVBAMMBXRlc3"
-    "QxMB4XDTE2MDQyNDE4MTAyMloXDTE2MDUyNTE4MTAyMlowEDEOMAwGA1UEAwwFdGVzdDEwgZ8w"
-    "DQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMQPqDStRlYeDpkXerRmv+a1naM8vSVSY0gG2plnrn"
-    "ofViWRW3MRqWC+020MsIj3hPZeSAnt/y/FL/nr4Ea7NXcwdRo1/1xEK7U/f/cjSg1aunyvHCHw"
-    "cFcMr31HLFvHr0ZgcFwbgIuFLNEl7kK5HMO9APz1ntUjek8BmBj8yMl9AgMBAAEwDQYJKoZIhv"
-    "cNAQELBQADgYEAC3ehaZFl+oEYN069C2ht/gMzuC77L854RF/x7xRtNZzkcg9TVgXXdM3auUvJ"
-    "i8dxyTpU3ixErjQvoZew5ngXTEvTY8BSQUijJEaLWh8n6NDKRbEGTdAk8nPAmq9hdCFqe3Ukex"
-    "qNHm3g/VxG4NUC1Y+w29ai0/Rgh+VvgbDwK+Q=";
-
-static const char kECDSA_PRIVATE_KEY_PEM[] =
-    "-----BEGIN PRIVATE KEY-----\n"
-    "MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQg/AkEA2hklq7dQ2rN\n"
-    "ZxYL6hOUACL4pn7P4FYlA3ZQhIChRANCAAR7YgdO3utP/8IqVRq8G4VZKreMAxeN\n"
-    "rUa12twthv4uFjuHAHa9D9oyAjncmn+xvZZRyVmKrA56jRzENcEEHoAg\n"
-    "-----END PRIVATE KEY-----\n";
-static const char kECDSA_PUBLIC_KEY_PEM[] =
-    "-----BEGIN PUBLIC KEY-----\n"
-    "MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEe2IHTt7rT//CKlUavBuFWSq3jAMX\n"
-    "ja1GtdrcLYb+LhY7hwB2vQ/aMgI53Jp/sb2WUclZiqwOeo0cxDXBBB6AIA==\n"
-    "-----END PUBLIC KEY-----\n";
-static const char kECDSA_CERT_PEM[] =
-    "-----BEGIN CERTIFICATE-----\n"
-    "MIIBFDCBu6ADAgECAgkArpkxjw62sW4wCgYIKoZIzj0EAwIwEDEOMAwGA1UEAwwF\n"
-    "dGVzdDMwHhcNMTYwNDI0MTgxNDM4WhcNMTYwNTI1MTgxNDM4WjAQMQ4wDAYDVQQD\n"
-    "DAV0ZXN0MzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABHtiB07e60//wipVGrwb\n"
-    "hVkqt4wDF42tRrXa3C2G/i4WO4cAdr0P2jICOdyaf7G9llHJWYqsDnqNHMQ1wQQe\n"
-    "gCAwCgYIKoZIzj0EAwIDSAAwRQIhANyreQ/K5yuPPpirsd0e/4WGLHou6bIOSQks\n"
-    "DYzo56NmAiAKOr3u8ol3LmygbUCwEvtWrS8QcJDygxHPACo99hkekw==\n"
-    "-----END CERTIFICATE-----\n";
-static const char kECDSA_FINGERPRINT[] =
-    "9F:47:FA:88:76:3D:18:B8:00:A0:59:9D:C3:5D:34:0B:1F:B8:99:9E:68:DA:F3:A5:DA"
-    ":50:33:A9:FF:4D:31:89";
-static const char kECDSA_FINGERPRINT_ALGORITHM[] =
-    "sha-256";
-static const char kECDSA_BASE64_CERTIFICATE[] =
-    "MIIBFDCBu6ADAgECAgkArpkxjw62sW4wCgYIKoZIzj0EAwIwEDEOMAwGA1UEAwwFdGVzdDMwHh"
-    "cNMTYwNDI0MTgxNDM4WhcNMTYwNTI1MTgxNDM4WjAQMQ4wDAYDVQQDDAV0ZXN0MzBZMBMGByqG"
-    "SM49AgEGCCqGSM49AwEHA0IABHtiB07e60//wipVGrwbhVkqt4wDF42tRrXa3C2G/i4WO4cAdr"
-    "0P2jICOdyaf7G9llHJWYqsDnqNHMQ1wQQegCAwCgYIKoZIzj0EAwIDSAAwRQIhANyreQ/K5yuP"
-    "Ppirsd0e/4WGLHou6bIOSQksDYzo56NmAiAKOr3u8ol3LmygbUCwEvtWrS8QcJDygxHPACo99h"
-    "kekw==";
-
-struct IdentityAndInfo {
-  std::unique_ptr<rtc::SSLIdentity> identity;
-  std::vector<std::string> ders;
-  std::vector<std::string> pems;
-  std::vector<std::string> fingerprints;
-};
-
-IdentityAndInfo CreateFakeIdentityAndInfoFromDers(
-    const std::vector<std::string>& ders) {
-  RTC_CHECK(!ders.empty());
-  IdentityAndInfo info;
-  info.ders = ders;
-  for (const std::string& der : ders) {
-    info.pems.push_back(rtc::SSLIdentity::DerToPem(
-        "CERTIFICATE",
-        reinterpret_cast<const unsigned char*>(der.c_str()),
-        der.length()));
-  }
-  info.identity.reset(
-      new rtc::FakeSSLIdentity(rtc::FakeSSLCertificate(info.pems)));
-  // Strip header/footer and newline characters of PEM strings.
-  for (size_t i = 0; i < info.pems.size(); ++i) {
-    rtc::replace_substrs("-----BEGIN CERTIFICATE-----", 27,
-                         "", 0, &info.pems[i]);
-    rtc::replace_substrs("-----END CERTIFICATE-----", 25,
-                         "", 0, &info.pems[i]);
-    rtc::replace_substrs("\n", 1,
-                         "", 0, &info.pems[i]);
-  }
-  // Fingerprint of leaf certificate.
-  std::unique_ptr<rtc::SSLFingerprint> fp(
-      rtc::SSLFingerprint::Create("sha-1", &info.identity->certificate()));
-  EXPECT_TRUE(fp);
-  info.fingerprints.push_back(fp->GetRfc4572Fingerprint());
-  // Fingerprints of the rest of the chain.
-  std::unique_ptr<rtc::SSLCertChain> chain =
-      info.identity->certificate().GetChain();
-  if (chain) {
-    for (size_t i = 0; i < chain->GetSize(); i++) {
-      fp.reset(rtc::SSLFingerprint::Create("sha-1", &chain->Get(i)));
-      EXPECT_TRUE(fp);
-      info.fingerprints.push_back(fp->GetRfc4572Fingerprint());
-    }
-  }
-  EXPECT_EQ(info.ders.size(), info.fingerprints.size());
-  return info;
-}
-
-class SSLIdentityTest : public testing::Test {
- public:
-  SSLIdentityTest() {}
-
-  ~SSLIdentityTest() {
-  }
-
-  virtual void SetUp() {
-    identity_rsa1_.reset(SSLIdentity::Generate("test1", rtc::KT_RSA));
-    identity_rsa2_.reset(SSLIdentity::Generate("test2", rtc::KT_RSA));
-    identity_ecdsa1_.reset(SSLIdentity::Generate("test3", rtc::KT_ECDSA));
-    identity_ecdsa2_.reset(SSLIdentity::Generate("test4", rtc::KT_ECDSA));
-
-    ASSERT_TRUE(identity_rsa1_);
-    ASSERT_TRUE(identity_rsa2_);
-    ASSERT_TRUE(identity_ecdsa1_);
-    ASSERT_TRUE(identity_ecdsa2_);
-
-    test_cert_.reset(rtc::SSLCertificate::FromPEMString(kTestCertificate));
-    ASSERT_TRUE(test_cert_);
-  }
-
-  void TestGetSignatureDigestAlgorithm() {
-    std::string digest_algorithm;
-
-    ASSERT_TRUE(identity_rsa1_->certificate().GetSignatureDigestAlgorithm(
-        &digest_algorithm));
-    ASSERT_EQ(rtc::DIGEST_SHA_256, digest_algorithm);
-
-    ASSERT_TRUE(identity_rsa2_->certificate().GetSignatureDigestAlgorithm(
-        &digest_algorithm));
-    ASSERT_EQ(rtc::DIGEST_SHA_256, digest_algorithm);
-
-    ASSERT_TRUE(identity_ecdsa1_->certificate().GetSignatureDigestAlgorithm(
-        &digest_algorithm));
-    ASSERT_EQ(rtc::DIGEST_SHA_256, digest_algorithm);
-
-    ASSERT_TRUE(identity_ecdsa2_->certificate().GetSignatureDigestAlgorithm(
-        &digest_algorithm));
-    ASSERT_EQ(rtc::DIGEST_SHA_256, digest_algorithm);
-
-    // The test certificate has an MD5-based signature.
-    ASSERT_TRUE(test_cert_->GetSignatureDigestAlgorithm(&digest_algorithm));
-    ASSERT_EQ(rtc::DIGEST_MD5, digest_algorithm);
-  }
-
-  typedef unsigned char DigestType[rtc::MessageDigest::kMaxSize];
-
-  void TestDigestHelper(DigestType digest,
-                        const SSLIdentity* identity,
-                        const std::string& algorithm,
-                        size_t expected_len) {
-    DigestType digest1;
-    size_t digest_len;
-    bool rv;
-
-    memset(digest, 0, expected_len);
-    rv = identity->certificate().ComputeDigest(algorithm, digest,
-                                               sizeof(DigestType), &digest_len);
-    EXPECT_TRUE(rv);
-    EXPECT_EQ(expected_len, digest_len);
-
-    // Repeat digest computation for the identity as a sanity check.
-    memset(digest1, 0xff, expected_len);
-    rv = identity->certificate().ComputeDigest(algorithm, digest1,
-                                               sizeof(DigestType), &digest_len);
-    EXPECT_TRUE(rv);
-    EXPECT_EQ(expected_len, digest_len);
-
-    EXPECT_EQ(0, memcmp(digest, digest1, expected_len));
-  }
-
-  void TestDigestForGeneratedCert(const std::string& algorithm,
-                                  size_t expected_len) {
-    DigestType digest[4];
-
-    ASSERT_TRUE(expected_len <= sizeof(DigestType));
-
-    TestDigestHelper(digest[0], identity_rsa1_.get(), algorithm, expected_len);
-    TestDigestHelper(digest[1], identity_rsa2_.get(), algorithm, expected_len);
-    TestDigestHelper(digest[2], identity_ecdsa1_.get(), algorithm,
-                     expected_len);
-    TestDigestHelper(digest[3], identity_ecdsa2_.get(), algorithm,
-                     expected_len);
-
-    // Sanity check that all four digests are unique.  This could theoretically
-    // fail, since cryptographic hash collisions have a non-zero probability.
-    for (int i = 0; i < 4; i++) {
-      for (int j = 0; j < 4; j++) {
-        if (i != j)
-          EXPECT_NE(0, memcmp(digest[i], digest[j], expected_len));
-      }
-    }
-  }
-
-  void TestDigestForFixedCert(const std::string& algorithm,
-                              size_t expected_len,
-                              const unsigned char* expected_digest) {
-    bool rv;
-    DigestType digest;
-    size_t digest_len;
-
-    ASSERT_TRUE(expected_len <= sizeof(DigestType));
-
-    rv = test_cert_->ComputeDigest(algorithm, digest, sizeof(digest),
-                                   &digest_len);
-    EXPECT_TRUE(rv);
-    EXPECT_EQ(expected_len, digest_len);
-    EXPECT_EQ(0, memcmp(digest, expected_digest, expected_len));
-  }
-
-  void TestCloningIdentity(const SSLIdentity& identity) {
-    // Convert |identity| to PEM strings and create a new identity by converting
-    // back from the string format.
-    std::string priv_pem = identity.PrivateKeyToPEMString();
-    std::string publ_pem = identity.PublicKeyToPEMString();
-    std::string cert_pem = identity.certificate().ToPEMString();
-    std::unique_ptr<SSLIdentity> clone(
-        SSLIdentity::FromPEMStrings(priv_pem, cert_pem));
-    EXPECT_TRUE(clone);
-
-    // Make sure the clone is identical to the original.
-    EXPECT_TRUE(identity == *clone);
-    ASSERT_EQ(identity.certificate().CertificateExpirationTime(),
-              clone->certificate().CertificateExpirationTime());
-
-    // At this point we are confident that the identities are identical. To be
-    // extra sure, we compare PEM strings of the clone with the original. Note
-    // that the PEM strings of two identities are not strictly guaranteed to be
-    // equal (they describe structs whose members could be listed in a different
-    // order, for example). But because the same function is used to produce
-    // both PEMs, its a good enough bet that this comparison will work. If the
-    // assumption stops holding in the future we can always remove this from the
-    // unittest.
-    std::string clone_priv_pem = clone->PrivateKeyToPEMString();
-    std::string clone_publ_pem = clone->PublicKeyToPEMString();
-    std::string clone_cert_pem = clone->certificate().ToPEMString();
-    ASSERT_EQ(priv_pem, clone_priv_pem);
-    ASSERT_EQ(publ_pem, clone_publ_pem);
-    ASSERT_EQ(cert_pem, clone_cert_pem);
-  }
-
- protected:
-  std::unique_ptr<SSLIdentity> identity_rsa1_;
-  std::unique_ptr<SSLIdentity> identity_rsa2_;
-  std::unique_ptr<SSLIdentity> identity_ecdsa1_;
-  std::unique_ptr<SSLIdentity> identity_ecdsa2_;
-  std::unique_ptr<rtc::SSLCertificate> test_cert_;
-};
-
-TEST_F(SSLIdentityTest, FixedDigestSHA1) {
-  TestDigestForFixedCert(rtc::DIGEST_SHA_1, 20, kTestCertSha1);
-}
-
-// HASH_AlgSHA224 is not supported in the chromium linux build.
-TEST_F(SSLIdentityTest, FixedDigestSHA224) {
-  TestDigestForFixedCert(rtc::DIGEST_SHA_224, 28, kTestCertSha224);
-}
-
-TEST_F(SSLIdentityTest, FixedDigestSHA256) {
-  TestDigestForFixedCert(rtc::DIGEST_SHA_256, 32, kTestCertSha256);
-}
-
-TEST_F(SSLIdentityTest, FixedDigestSHA384) {
-  TestDigestForFixedCert(rtc::DIGEST_SHA_384, 48, kTestCertSha384);
-}
-
-TEST_F(SSLIdentityTest, FixedDigestSHA512) {
-  TestDigestForFixedCert(rtc::DIGEST_SHA_512, 64, kTestCertSha512);
-}
-
-// HASH_AlgSHA224 is not supported in the chromium linux build.
-TEST_F(SSLIdentityTest, DigestSHA224) {
-  TestDigestForGeneratedCert(rtc::DIGEST_SHA_224, 28);
-}
-
-TEST_F(SSLIdentityTest, DigestSHA256) {
-  TestDigestForGeneratedCert(rtc::DIGEST_SHA_256, 32);
-}
-
-TEST_F(SSLIdentityTest, DigestSHA384) {
-  TestDigestForGeneratedCert(rtc::DIGEST_SHA_384, 48);
-}
-
-TEST_F(SSLIdentityTest, DigestSHA512) {
-  TestDigestForGeneratedCert(rtc::DIGEST_SHA_512, 64);
-}
-
-TEST_F(SSLIdentityTest, IdentityComparison) {
-  EXPECT_TRUE(*identity_rsa1_ == *identity_rsa1_);
-  EXPECT_FALSE(*identity_rsa1_ == *identity_rsa2_);
-  EXPECT_FALSE(*identity_rsa1_ == *identity_ecdsa1_);
-  EXPECT_FALSE(*identity_rsa1_ == *identity_ecdsa2_);
-
-  EXPECT_TRUE(*identity_rsa2_ == *identity_rsa2_);
-  EXPECT_FALSE(*identity_rsa2_ == *identity_ecdsa1_);
-  EXPECT_FALSE(*identity_rsa2_ == *identity_ecdsa2_);
-
-  EXPECT_TRUE(*identity_ecdsa1_ == *identity_ecdsa1_);
-  EXPECT_FALSE(*identity_ecdsa1_ == *identity_ecdsa2_);
-}
-
-TEST_F(SSLIdentityTest, FromPEMStringsRSA) {
-  std::unique_ptr<SSLIdentity> identity(
-      SSLIdentity::FromPEMStrings(kRSA_PRIVATE_KEY_PEM, kRSA_CERT_PEM));
-  EXPECT_TRUE(identity);
-  EXPECT_EQ(kRSA_PRIVATE_KEY_PEM, identity->PrivateKeyToPEMString());
-  EXPECT_EQ(kRSA_PUBLIC_KEY_PEM, identity->PublicKeyToPEMString());
-  EXPECT_EQ(kRSA_CERT_PEM, identity->certificate().ToPEMString());
-}
-
-TEST_F(SSLIdentityTest, FromPEMStringsEC) {
-  std::unique_ptr<SSLIdentity> identity(
-      SSLIdentity::FromPEMStrings(kECDSA_PRIVATE_KEY_PEM, kECDSA_CERT_PEM));
-  EXPECT_TRUE(identity);
-  EXPECT_EQ(kECDSA_PRIVATE_KEY_PEM, identity->PrivateKeyToPEMString());
-  EXPECT_EQ(kECDSA_PUBLIC_KEY_PEM, identity->PublicKeyToPEMString());
-  EXPECT_EQ(kECDSA_CERT_PEM, identity->certificate().ToPEMString());
-}
-
-TEST_F(SSLIdentityTest, CloneIdentityRSA) {
-  TestCloningIdentity(*identity_rsa1_);
-  TestCloningIdentity(*identity_rsa2_);
-}
-
-TEST_F(SSLIdentityTest, CloneIdentityECDSA) {
-  TestCloningIdentity(*identity_ecdsa1_);
-  TestCloningIdentity(*identity_ecdsa2_);
-}
-
-TEST_F(SSLIdentityTest, PemDerConversion) {
-  std::string der;
-  EXPECT_TRUE(SSLIdentity::PemToDer("CERTIFICATE", kTestCertificate, &der));
-
-  EXPECT_EQ(kTestCertificate, SSLIdentity::DerToPem(
-      "CERTIFICATE",
-      reinterpret_cast<const unsigned char*>(der.data()), der.length()));
-}
-
-TEST_F(SSLIdentityTest, GetSignatureDigestAlgorithm) {
-  TestGetSignatureDigestAlgorithm();
-}
-
-TEST_F(SSLIdentityTest, SSLCertificateGetStatsRSA) {
-  std::unique_ptr<SSLIdentity> identity(
-      SSLIdentity::FromPEMStrings(kRSA_PRIVATE_KEY_PEM, kRSA_CERT_PEM));
-  std::unique_ptr<rtc::SSLCertificateStats> stats =
-      identity->certificate().GetStats();
-  EXPECT_EQ(stats->fingerprint, kRSA_FINGERPRINT);
-  EXPECT_EQ(stats->fingerprint_algorithm, kRSA_FINGERPRINT_ALGORITHM);
-  EXPECT_EQ(stats->base64_certificate, kRSA_BASE64_CERTIFICATE);
-  EXPECT_FALSE(stats->issuer);
-}
-
-TEST_F(SSLIdentityTest, SSLCertificateGetStatsECDSA) {
-  std::unique_ptr<SSLIdentity> identity(
-      SSLIdentity::FromPEMStrings(kECDSA_PRIVATE_KEY_PEM, kECDSA_CERT_PEM));
-  std::unique_ptr<rtc::SSLCertificateStats> stats =
-      identity->certificate().GetStats();
-  EXPECT_EQ(stats->fingerprint, kECDSA_FINGERPRINT);
-  EXPECT_EQ(stats->fingerprint_algorithm, kECDSA_FINGERPRINT_ALGORITHM);
-  EXPECT_EQ(stats->base64_certificate, kECDSA_BASE64_CERTIFICATE);
-  EXPECT_FALSE(stats->issuer);
-}
-
-TEST_F(SSLIdentityTest, SSLCertificateGetStatsWithChain) {
-  std::vector<std::string> ders;
-  ders.push_back("every der results in");
-  ders.push_back("an identity + certificate");
-  ders.push_back("in a certificate chain");
-  IdentityAndInfo info = CreateFakeIdentityAndInfoFromDers(ders);
-  EXPECT_TRUE(info.identity);
-  EXPECT_EQ(info.ders, ders);
-  EXPECT_EQ(info.pems.size(), info.ders.size());
-  EXPECT_EQ(info.fingerprints.size(), info.ders.size());
-
-  std::unique_ptr<rtc::SSLCertificateStats> first_stats =
-      info.identity->certificate().GetStats();
-  rtc::SSLCertificateStats* cert_stats = first_stats.get();
-  for (size_t i = 0; i < info.ders.size(); ++i) {
-    EXPECT_EQ(cert_stats->fingerprint, info.fingerprints[i]);
-    EXPECT_EQ(cert_stats->fingerprint_algorithm, "sha-1");
-    EXPECT_EQ(cert_stats->base64_certificate, info.pems[i]);
-    cert_stats = cert_stats->issuer.get();
-    EXPECT_EQ(static_cast<bool>(cert_stats), i + 1 < info.ders.size());
-  }
-}
-
-class SSLIdentityExpirationTest : public testing::Test {
- public:
-  SSLIdentityExpirationTest() {
-    // Set use of the test RNG to get deterministic expiration timestamp.
-    rtc::SetRandomTestMode(true);
-  }
-  ~SSLIdentityExpirationTest() {
-    // Put it back for the next test.
-    rtc::SetRandomTestMode(false);
-  }
-
-  void TestASN1TimeToSec() {
-    struct asn_example {
-      const char* string;
-      bool long_format;
-      int64_t want;
-    } static const data[] = {
-      // Valid examples.
-      {"19700101000000Z",  true,  0},
-      {"700101000000Z",    false, 0},
-      {"19700101000001Z",  true,  1},
-      {"700101000001Z",    false, 1},
-      {"19700101000100Z",  true,  60},
-      {"19700101000101Z",  true,  61},
-      {"19700101010000Z",  true,  3600},
-      {"19700101010001Z",  true,  3601},
-      {"19700101010100Z",  true,  3660},
-      {"19700101010101Z",  true,  3661},
-      {"710911012345Z",    false, 53400225},
-      {"20000101000000Z",  true,  946684800},
-      {"20000101000000Z",  true,  946684800},
-      {"20151130140156Z",  true,  1448892116},
-      {"151130140156Z",    false, 1448892116},
-      {"20491231235959Z",  true,  2524607999},
-      {"491231235959Z",    false, 2524607999},
-      {"20500101000000Z",  true,  2524607999+1},
-      {"20700101000000Z",  true,  3155760000},
-      {"21000101000000Z",  true,  4102444800},
-      {"24000101000000Z",  true,  13569465600},
-
-      // Invalid examples.
-      {"19700101000000",    true,  -1},  // missing Z long format
-      {"19700101000000X",   true,  -1},  // X instead of Z long format
-      {"197001010000000",   true,  -1},  // 0 instead of Z long format
-      {"1970010100000000Z", true,  -1},  // excess digits long format
-      {"700101000000",      false, -1},  // missing Z short format
-      {"700101000000X",     false, -1},  // X instead of Z short format
-      {"7001010000000",     false, -1},  // 0 instead of Z short format
-      {"70010100000000Z",   false, -1},  // excess digits short format
-      {":9700101000000Z",   true,  -1},  // invalid character
-      {"1:700101000001Z",   true,  -1},  // invalid character
-      {"19:00101000100Z",   true,  -1},  // invalid character
-      {"197:0101000101Z",   true,  -1},  // invalid character
-      {"1970:101010000Z",   true,  -1},  // invalid character
-      {"19700:01010001Z",   true,  -1},  // invalid character
-      {"197001:1010100Z",   true,  -1},  // invalid character
-      {"1970010:010101Z",   true,  -1},  // invalid character
-      {"70010100:000Z",     false, -1},  // invalid character
-      {"700101000:01Z",     false, -1},  // invalid character
-      {"2000010100:000Z",   true,  -1},  // invalid character
-      {"21000101000:00Z",   true,  -1},  // invalid character
-      {"240001010000:0Z",   true,  -1},  // invalid character
-      {"500101000000Z",     false, -1},  // but too old for epoch
-      {"691231235959Z",     false, -1},  // too old for epoch
-      {"19611118043000Z",   false, -1},  // way too old for epoch
-    };
-
-    unsigned char buf[20];
-
-    // Run all examples and check for the expected result.
-    for (const auto& entry : data) {
-      size_t length = strlen(entry.string);
-      memcpy(buf, entry.string, length);    // Copy the ASN1 string...
-      buf[length] = rtc::CreateRandomId();  // ...and terminate it with junk.
-      int64_t res = rtc::ASN1TimeToSec(buf, length, entry.long_format);
-      LOG(LS_VERBOSE) << entry.string;
-      ASSERT_EQ(entry.want, res);
-    }
-    // Run all examples again, but with an invalid length.
-    for (const auto& entry : data) {
-      size_t length = strlen(entry.string);
-      memcpy(buf, entry.string, length);    // Copy the ASN1 string...
-      buf[length] = rtc::CreateRandomId();  // ...and terminate it with junk.
-      int64_t res = rtc::ASN1TimeToSec(buf, length - 1, entry.long_format);
-      LOG(LS_VERBOSE) << entry.string;
-      ASSERT_EQ(-1, res);
-    }
-  }
-
-  void TestExpireTime(int times) {
-    // We test just ECDSA here since what we're out to exercise is the
-    // interfaces for expiration setting and reading.
-    for (int i = 0; i < times; i++) {
-      // We limit the time to < 2^31 here, i.e., we stay before 2038, since else
-      // we hit time offset limitations in OpenSSL on some 32-bit systems.
-      time_t time_before_generation = time(nullptr);
-      time_t lifetime =
-          rtc::CreateRandomId() % (0x80000000 - time_before_generation);
-      rtc::KeyParams key_params = rtc::KeyParams::ECDSA(rtc::EC_NIST_P256);
-      SSLIdentity* identity =
-          rtc::SSLIdentity::GenerateWithExpiration("", key_params, lifetime);
-      time_t time_after_generation = time(nullptr);
-      EXPECT_LE(time_before_generation + lifetime,
-                identity->certificate().CertificateExpirationTime());
-      EXPECT_GE(time_after_generation + lifetime,
-                identity->certificate().CertificateExpirationTime());
-      delete identity;
-    }
-  }
-};
-
-TEST_F(SSLIdentityExpirationTest, TestASN1TimeToSec) {
-  TestASN1TimeToSec();
-}
-
-TEST_F(SSLIdentityExpirationTest, TestExpireTime) {
-  TestExpireTime(500);
-}
diff --git a/rtc_base/sslroots.h b/rtc_base/sslroots.h
deleted file mode 100644
index b224332..0000000
--- a/rtc_base/sslroots.h
+++ /dev/null
@@ -1,4280 +0,0 @@
-/*
- *  Copyright 2004 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_RTC_BASE_SSLROOTS_H_
-#define WEBRTC_RTC_BASE_SSLROOTS_H_
-
-// This file is the root certificates in C form that are needed to connect to
-// Google.
-
-// It was generated with the following command line:
-// > python tools/sslroots/generate_sslroots.py
-//    https://pki.google.com/roots.pem
-
-/* subject:/C=BE/O=GlobalSign nv-sa/OU=Root CA/CN=GlobalSign Root CA */
-/* issuer :/C=BE/O=GlobalSign nv-sa/OU=Root CA/CN=GlobalSign Root CA */
-
-
-const unsigned char GlobalSign_Root_CA_certificate[889]={
-0x30,0x82,0x03,0x75,0x30,0x82,0x02,0x5D,0xA0,0x03,0x02,0x01,0x02,0x02,0x0B,0x04,
-0x00,0x00,0x00,0x00,0x01,0x15,0x4B,0x5A,0xC3,0x94,0x30,0x0D,0x06,0x09,0x2A,0x86,
-0x48,0x86,0xF7,0x0D,0x01,0x01,0x05,0x05,0x00,0x30,0x57,0x31,0x0B,0x30,0x09,0x06,
-0x03,0x55,0x04,0x06,0x13,0x02,0x42,0x45,0x31,0x19,0x30,0x17,0x06,0x03,0x55,0x04,
-0x0A,0x13,0x10,0x47,0x6C,0x6F,0x62,0x61,0x6C,0x53,0x69,0x67,0x6E,0x20,0x6E,0x76,
-0x2D,0x73,0x61,0x31,0x10,0x30,0x0E,0x06,0x03,0x55,0x04,0x0B,0x13,0x07,0x52,0x6F,
-0x6F,0x74,0x20,0x43,0x41,0x31,0x1B,0x30,0x19,0x06,0x03,0x55,0x04,0x03,0x13,0x12,
-0x47,0x6C,0x6F,0x62,0x61,0x6C,0x53,0x69,0x67,0x6E,0x20,0x52,0x6F,0x6F,0x74,0x20,
-0x43,0x41,0x30,0x1E,0x17,0x0D,0x39,0x38,0x30,0x39,0x30,0x31,0x31,0x32,0x30,0x30,
-0x30,0x30,0x5A,0x17,0x0D,0x32,0x38,0x30,0x31,0x32,0x38,0x31,0x32,0x30,0x30,0x30,
-0x30,0x5A,0x30,0x57,0x31,0x0B,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x42,
-0x45,0x31,0x19,0x30,0x17,0x06,0x03,0x55,0x04,0x0A,0x13,0x10,0x47,0x6C,0x6F,0x62,
-0x61,0x6C,0x53,0x69,0x67,0x6E,0x20,0x6E,0x76,0x2D,0x73,0x61,0x31,0x10,0x30,0x0E,
-0x06,0x03,0x55,0x04,0x0B,0x13,0x07,0x52,0x6F,0x6F,0x74,0x20,0x43,0x41,0x31,0x1B,
-0x30,0x19,0x06,0x03,0x55,0x04,0x03,0x13,0x12,0x47,0x6C,0x6F,0x62,0x61,0x6C,0x53,
-0x69,0x67,0x6E,0x20,0x52,0x6F,0x6F,0x74,0x20,0x43,0x41,0x30,0x82,0x01,0x22,0x30,
-0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x01,0x05,0x00,0x03,0x82,
-0x01,0x0F,0x00,0x30,0x82,0x01,0x0A,0x02,0x82,0x01,0x01,0x00,0xDA,0x0E,0xE6,0x99,
-0x8D,0xCE,0xA3,0xE3,0x4F,0x8A,0x7E,0xFB,0xF1,0x8B,0x83,0x25,0x6B,0xEA,0x48,0x1F,
-0xF1,0x2A,0xB0,0xB9,0x95,0x11,0x04,0xBD,0xF0,0x63,0xD1,0xE2,0x67,0x66,0xCF,0x1C,
-0xDD,0xCF,0x1B,0x48,0x2B,0xEE,0x8D,0x89,0x8E,0x9A,0xAF,0x29,0x80,0x65,0xAB,0xE9,
-0xC7,0x2D,0x12,0xCB,0xAB,0x1C,0x4C,0x70,0x07,0xA1,0x3D,0x0A,0x30,0xCD,0x15,0x8D,
-0x4F,0xF8,0xDD,0xD4,0x8C,0x50,0x15,0x1C,0xEF,0x50,0xEE,0xC4,0x2E,0xF7,0xFC,0xE9,
-0x52,0xF2,0x91,0x7D,0xE0,0x6D,0xD5,0x35,0x30,0x8E,0x5E,0x43,0x73,0xF2,0x41,0xE9,
-0xD5,0x6A,0xE3,0xB2,0x89,0x3A,0x56,0x39,0x38,0x6F,0x06,0x3C,0x88,0x69,0x5B,0x2A,
-0x4D,0xC5,0xA7,0x54,0xB8,0x6C,0x89,0xCC,0x9B,0xF9,0x3C,0xCA,0xE5,0xFD,0x89,0xF5,
-0x12,0x3C,0x92,0x78,0x96,0xD6,0xDC,0x74,0x6E,0x93,0x44,0x61,0xD1,0x8D,0xC7,0x46,
-0xB2,0x75,0x0E,0x86,0xE8,0x19,0x8A,0xD5,0x6D,0x6C,0xD5,0x78,0x16,0x95,0xA2,0xE9,
-0xC8,0x0A,0x38,0xEB,0xF2,0x24,0x13,0x4F,0x73,0x54,0x93,0x13,0x85,0x3A,0x1B,0xBC,
-0x1E,0x34,0xB5,0x8B,0x05,0x8C,0xB9,0x77,0x8B,0xB1,0xDB,0x1F,0x20,0x91,0xAB,0x09,
-0x53,0x6E,0x90,0xCE,0x7B,0x37,0x74,0xB9,0x70,0x47,0x91,0x22,0x51,0x63,0x16,0x79,
-0xAE,0xB1,0xAE,0x41,0x26,0x08,0xC8,0x19,0x2B,0xD1,0x46,0xAA,0x48,0xD6,0x64,0x2A,
-0xD7,0x83,0x34,0xFF,0x2C,0x2A,0xC1,0x6C,0x19,0x43,0x4A,0x07,0x85,0xE7,0xD3,0x7C,
-0xF6,0x21,0x68,0xEF,0xEA,0xF2,0x52,0x9F,0x7F,0x93,0x90,0xCF,0x02,0x03,0x01,0x00,
-0x01,0xA3,0x42,0x30,0x40,0x30,0x0E,0x06,0x03,0x55,0x1D,0x0F,0x01,0x01,0xFF,0x04,
-0x04,0x03,0x02,0x01,0x06,0x30,0x0F,0x06,0x03,0x55,0x1D,0x13,0x01,0x01,0xFF,0x04,
-0x05,0x30,0x03,0x01,0x01,0xFF,0x30,0x1D,0x06,0x03,0x55,0x1D,0x0E,0x04,0x16,0x04,
-0x14,0x60,0x7B,0x66,0x1A,0x45,0x0D,0x97,0xCA,0x89,0x50,0x2F,0x7D,0x04,0xCD,0x34,
-0xA8,0xFF,0xFC,0xFD,0x4B,0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,
-0x01,0x05,0x05,0x00,0x03,0x82,0x01,0x01,0x00,0xD6,0x73,0xE7,0x7C,0x4F,0x76,0xD0,
-0x8D,0xBF,0xEC,0xBA,0xA2,0xBE,0x34,0xC5,0x28,0x32,0xB5,0x7C,0xFC,0x6C,0x9C,0x2C,
-0x2B,0xBD,0x09,0x9E,0x53,0xBF,0x6B,0x5E,0xAA,0x11,0x48,0xB6,0xE5,0x08,0xA3,0xB3,
-0xCA,0x3D,0x61,0x4D,0xD3,0x46,0x09,0xB3,0x3E,0xC3,0xA0,0xE3,0x63,0x55,0x1B,0xF2,
-0xBA,0xEF,0xAD,0x39,0xE1,0x43,0xB9,0x38,0xA3,0xE6,0x2F,0x8A,0x26,0x3B,0xEF,0xA0,
-0x50,0x56,0xF9,0xC6,0x0A,0xFD,0x38,0xCD,0xC4,0x0B,0x70,0x51,0x94,0x97,0x98,0x04,
-0xDF,0xC3,0x5F,0x94,0xD5,0x15,0xC9,0x14,0x41,0x9C,0xC4,0x5D,0x75,0x64,0x15,0x0D,
-0xFF,0x55,0x30,0xEC,0x86,0x8F,0xFF,0x0D,0xEF,0x2C,0xB9,0x63,0x46,0xF6,0xAA,0xFC,
-0xDF,0xBC,0x69,0xFD,0x2E,0x12,0x48,0x64,0x9A,0xE0,0x95,0xF0,0xA6,0xEF,0x29,0x8F,
-0x01,0xB1,0x15,0xB5,0x0C,0x1D,0xA5,0xFE,0x69,0x2C,0x69,0x24,0x78,0x1E,0xB3,0xA7,
-0x1C,0x71,0x62,0xEE,0xCA,0xC8,0x97,0xAC,0x17,0x5D,0x8A,0xC2,0xF8,0x47,0x86,0x6E,
-0x2A,0xC4,0x56,0x31,0x95,0xD0,0x67,0x89,0x85,0x2B,0xF9,0x6C,0xA6,0x5D,0x46,0x9D,
-0x0C,0xAA,0x82,0xE4,0x99,0x51,0xDD,0x70,0xB7,0xDB,0x56,0x3D,0x61,0xE4,0x6A,0xE1,
-0x5C,0xD6,0xF6,0xFE,0x3D,0xDE,0x41,0xCC,0x07,0xAE,0x63,0x52,0xBF,0x53,0x53,0xF4,
-0x2B,0xE9,0xC7,0xFD,0xB6,0xF7,0x82,0x5F,0x85,0xD2,0x41,0x18,0xDB,0x81,0xB3,0x04,
-0x1C,0xC5,0x1F,0xA4,0x80,0x6F,0x15,0x20,0xC9,0xDE,0x0C,0x88,0x0A,0x1D,0xD6,0x66,
-0x55,0xE2,0xFC,0x48,0xC9,0x29,0x26,0x69,0xE0,
-};
-
-
-/* subject:/C=US/ST=New Jersey/L=Jersey City/O=The USERTRUST Network/CN=USERTrust RSA Certification Authority */
-/* issuer :/C=US/ST=New Jersey/L=Jersey City/O=The USERTRUST Network/CN=USERTrust RSA Certification Authority */
-
-
-const unsigned char USERTrust_RSA_Certification_Authority_certificate[1506]={
-0x30,0x82,0x05,0xDE,0x30,0x82,0x03,0xC6,0xA0,0x03,0x02,0x01,0x02,0x02,0x10,0x01,
-0xFD,0x6D,0x30,0xFC,0xA3,0xCA,0x51,0xA8,0x1B,0xBC,0x64,0x0E,0x35,0x03,0x2D,0x30,
-0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x0C,0x05,0x00,0x30,0x81,
-0x88,0x31,0x0B,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x13,
-0x30,0x11,0x06,0x03,0x55,0x04,0x08,0x13,0x0A,0x4E,0x65,0x77,0x20,0x4A,0x65,0x72,
-0x73,0x65,0x79,0x31,0x14,0x30,0x12,0x06,0x03,0x55,0x04,0x07,0x13,0x0B,0x4A,0x65,
-0x72,0x73,0x65,0x79,0x20,0x43,0x69,0x74,0x79,0x31,0x1E,0x30,0x1C,0x06,0x03,0x55,
-0x04,0x0A,0x13,0x15,0x54,0x68,0x65,0x20,0x55,0x53,0x45,0x52,0x54,0x52,0x55,0x53,
-0x54,0x20,0x4E,0x65,0x74,0x77,0x6F,0x72,0x6B,0x31,0x2E,0x30,0x2C,0x06,0x03,0x55,
-0x04,0x03,0x13,0x25,0x55,0x53,0x45,0x52,0x54,0x72,0x75,0x73,0x74,0x20,0x52,0x53,
-0x41,0x20,0x43,0x65,0x72,0x74,0x69,0x66,0x69,0x63,0x61,0x74,0x69,0x6F,0x6E,0x20,
-0x41,0x75,0x74,0x68,0x6F,0x72,0x69,0x74,0x79,0x30,0x1E,0x17,0x0D,0x31,0x30,0x30,
-0x32,0x30,0x31,0x30,0x30,0x30,0x30,0x30,0x30,0x5A,0x17,0x0D,0x33,0x38,0x30,0x31,
-0x31,0x38,0x32,0x33,0x35,0x39,0x35,0x39,0x5A,0x30,0x81,0x88,0x31,0x0B,0x30,0x09,
-0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x13,0x30,0x11,0x06,0x03,0x55,
-0x04,0x08,0x13,0x0A,0x4E,0x65,0x77,0x20,0x4A,0x65,0x72,0x73,0x65,0x79,0x31,0x14,
-0x30,0x12,0x06,0x03,0x55,0x04,0x07,0x13,0x0B,0x4A,0x65,0x72,0x73,0x65,0x79,0x20,
-0x43,0x69,0x74,0x79,0x31,0x1E,0x30,0x1C,0x06,0x03,0x55,0x04,0x0A,0x13,0x15,0x54,
-0x68,0x65,0x20,0x55,0x53,0x45,0x52,0x54,0x52,0x55,0x53,0x54,0x20,0x4E,0x65,0x74,
-0x77,0x6F,0x72,0x6B,0x31,0x2E,0x30,0x2C,0x06,0x03,0x55,0x04,0x03,0x13,0x25,0x55,
-0x53,0x45,0x52,0x54,0x72,0x75,0x73,0x74,0x20,0x52,0x53,0x41,0x20,0x43,0x65,0x72,
-0x74,0x69,0x66,0x69,0x63,0x61,0x74,0x69,0x6F,0x6E,0x20,0x41,0x75,0x74,0x68,0x6F,
-0x72,0x69,0x74,0x79,0x30,0x82,0x02,0x22,0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,
-0xF7,0x0D,0x01,0x01,0x01,0x05,0x00,0x03,0x82,0x02,0x0F,0x00,0x30,0x82,0x02,0x0A,
-0x02,0x82,0x02,0x01,0x00,0x80,0x12,0x65,0x17,0x36,0x0E,0xC3,0xDB,0x08,0xB3,0xD0,
-0xAC,0x57,0x0D,0x76,0xED,0xCD,0x27,0xD3,0x4C,0xAD,0x50,0x83,0x61,0xE2,0xAA,0x20,
-0x4D,0x09,0x2D,0x64,0x09,0xDC,0xCE,0x89,0x9F,0xCC,0x3D,0xA9,0xEC,0xF6,0xCF,0xC1,
-0xDC,0xF1,0xD3,0xB1,0xD6,0x7B,0x37,0x28,0x11,0x2B,0x47,0xDA,0x39,0xC6,0xBC,0x3A,
-0x19,0xB4,0x5F,0xA6,0xBD,0x7D,0x9D,0xA3,0x63,0x42,0xB6,0x76,0xF2,0xA9,0x3B,0x2B,
-0x91,0xF8,0xE2,0x6F,0xD0,0xEC,0x16,0x20,0x90,0x09,0x3E,0xE2,0xE8,0x74,0xC9,0x18,
-0xB4,0x91,0xD4,0x62,0x64,0xDB,0x7F,0xA3,0x06,0xF1,0x88,0x18,0x6A,0x90,0x22,0x3C,
-0xBC,0xFE,0x13,0xF0,0x87,0x14,0x7B,0xF6,0xE4,0x1F,0x8E,0xD4,0xE4,0x51,0xC6,0x11,
-0x67,0x46,0x08,0x51,0xCB,0x86,0x14,0x54,0x3F,0xBC,0x33,0xFE,0x7E,0x6C,0x9C,0xFF,
-0x16,0x9D,0x18,0xBD,0x51,0x8E,0x35,0xA6,0xA7,0x66,0xC8,0x72,0x67,0xDB,0x21,0x66,
-0xB1,0xD4,0x9B,0x78,0x03,0xC0,0x50,0x3A,0xE8,0xCC,0xF0,0xDC,0xBC,0x9E,0x4C,0xFE,
-0xAF,0x05,0x96,0x35,0x1F,0x57,0x5A,0xB7,0xFF,0xCE,0xF9,0x3D,0xB7,0x2C,0xB6,0xF6,
-0x54,0xDD,0xC8,0xE7,0x12,0x3A,0x4D,0xAE,0x4C,0x8A,0xB7,0x5C,0x9A,0xB4,0xB7,0x20,
-0x3D,0xCA,0x7F,0x22,0x34,0xAE,0x7E,0x3B,0x68,0x66,0x01,0x44,0xE7,0x01,0x4E,0x46,
-0x53,0x9B,0x33,0x60,0xF7,0x94,0xBE,0x53,0x37,0x90,0x73,0x43,0xF3,0x32,0xC3,0x53,
-0xEF,0xDB,0xAA,0xFE,0x74,0x4E,0x69,0xC7,0x6B,0x8C,0x60,0x93,0xDE,0xC4,0xC7,0x0C,
-0xDF,0xE1,0x32,0xAE,0xCC,0x93,0x3B,0x51,0x78,0x95,0x67,0x8B,0xEE,0x3D,0x56,0xFE,
-0x0C,0xD0,0x69,0x0F,0x1B,0x0F,0xF3,0x25,0x26,0x6B,0x33,0x6D,0xF7,0x6E,0x47,0xFA,
-0x73,0x43,0xE5,0x7E,0x0E,0xA5,0x66,0xB1,0x29,0x7C,0x32,0x84,0x63,0x55,0x89,0xC4,
-0x0D,0xC1,0x93,0x54,0x30,0x19,0x13,0xAC,0xD3,0x7D,0x37,0xA7,0xEB,0x5D,0x3A,0x6C,
-0x35,0x5C,0xDB,0x41,0xD7,0x12,0xDA,0xA9,0x49,0x0B,0xDF,0xD8,0x80,0x8A,0x09,0x93,
-0x62,0x8E,0xB5,0x66,0xCF,0x25,0x88,0xCD,0x84,0xB8,0xB1,0x3F,0xA4,0x39,0x0F,0xD9,
-0x02,0x9E,0xEB,0x12,0x4C,0x95,0x7C,0xF3,0x6B,0x05,0xA9,0x5E,0x16,0x83,0xCC,0xB8,
-0x67,0xE2,0xE8,0x13,0x9D,0xCC,0x5B,0x82,0xD3,0x4C,0xB3,0xED,0x5B,0xFF,0xDE,0xE5,
-0x73,0xAC,0x23,0x3B,0x2D,0x00,0xBF,0x35,0x55,0x74,0x09,0x49,0xD8,0x49,0x58,0x1A,
-0x7F,0x92,0x36,0xE6,0x51,0x92,0x0E,0xF3,0x26,0x7D,0x1C,0x4D,0x17,0xBC,0xC9,0xEC,
-0x43,0x26,0xD0,0xBF,0x41,0x5F,0x40,0xA9,0x44,0x44,0xF4,0x99,0xE7,0x57,0x87,0x9E,
-0x50,0x1F,0x57,0x54,0xA8,0x3E,0xFD,0x74,0x63,0x2F,0xB1,0x50,0x65,0x09,0xE6,0x58,
-0x42,0x2E,0x43,0x1A,0x4C,0xB4,0xF0,0x25,0x47,0x59,0xFA,0x04,0x1E,0x93,0xD4,0x26,
-0x46,0x4A,0x50,0x81,0xB2,0xDE,0xBE,0x78,0xB7,0xFC,0x67,0x15,0xE1,0xC9,0x57,0x84,
-0x1E,0x0F,0x63,0xD6,0xE9,0x62,0xBA,0xD6,0x5F,0x55,0x2E,0xEA,0x5C,0xC6,0x28,0x08,
-0x04,0x25,0x39,0xB8,0x0E,0x2B,0xA9,0xF2,0x4C,0x97,0x1C,0x07,0x3F,0x0D,0x52,0xF5,
-0xED,0xEF,0x2F,0x82,0x0F,0x02,0x03,0x01,0x00,0x01,0xA3,0x42,0x30,0x40,0x30,0x1D,
-0x06,0x03,0x55,0x1D,0x0E,0x04,0x16,0x04,0x14,0x53,0x79,0xBF,0x5A,0xAA,0x2B,0x4A,
-0xCF,0x54,0x80,0xE1,0xD8,0x9B,0xC0,0x9D,0xF2,0xB2,0x03,0x66,0xCB,0x30,0x0E,0x06,
-0x03,0x55,0x1D,0x0F,0x01,0x01,0xFF,0x04,0x04,0x03,0x02,0x01,0x06,0x30,0x0F,0x06,
-0x03,0x55,0x1D,0x13,0x01,0x01,0xFF,0x04,0x05,0x30,0x03,0x01,0x01,0xFF,0x30,0x0D,
-0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x0C,0x05,0x00,0x03,0x82,0x02,
-0x01,0x00,0x5C,0xD4,0x7C,0x0D,0xCF,0xF7,0x01,0x7D,0x41,0x99,0x65,0x0C,0x73,0xC5,
-0x52,0x9F,0xCB,0xF8,0xCF,0x99,0x06,0x7F,0x1B,0xDA,0x43,0x15,0x9F,0x9E,0x02,0x55,
-0x57,0x96,0x14,0xF1,0x52,0x3C,0x27,0x87,0x94,0x28,0xED,0x1F,0x3A,0x01,0x37,0xA2,
-0x76,0xFC,0x53,0x50,0xC0,0x84,0x9B,0xC6,0x6B,0x4E,0xBA,0x8C,0x21,0x4F,0xA2,0x8E,
-0x55,0x62,0x91,0xF3,0x69,0x15,0xD8,0xBC,0x88,0xE3,0xC4,0xAA,0x0B,0xFD,0xEF,0xA8,
-0xE9,0x4B,0x55,0x2A,0x06,0x20,0x6D,0x55,0x78,0x29,0x19,0xEE,0x5F,0x30,0x5C,0x4B,
-0x24,0x11,0x55,0xFF,0x24,0x9A,0x6E,0x5E,0x2A,0x2B,0xEE,0x0B,0x4D,0x9F,0x7F,0xF7,
-0x01,0x38,0x94,0x14,0x95,0x43,0x07,0x09,0xFB,0x60,0xA9,0xEE,0x1C,0xAB,0x12,0x8C,
-0xA0,0x9A,0x5E,0xA7,0x98,0x6A,0x59,0x6D,0x8B,0x3F,0x08,0xFB,0xC8,0xD1,0x45,0xAF,
-0x18,0x15,0x64,0x90,0x12,0x0F,0x73,0x28,0x2E,0xC5,0xE2,0x24,0x4E,0xFC,0x58,0xEC,
-0xF0,0xF4,0x45,0xFE,0x22,0xB3,0xEB,0x2F,0x8E,0xD2,0xD9,0x45,0x61,0x05,0xC1,0x97,
-0x6F,0xA8,0x76,0x72,0x8F,0x8B,0x8C,0x36,0xAF,0xBF,0x0D,0x05,0xCE,0x71,0x8D,0xE6,
-0xA6,0x6F,0x1F,0x6C,0xA6,0x71,0x62,0xC5,0xD8,0xD0,0x83,0x72,0x0C,0xF1,0x67,0x11,
-0x89,0x0C,0x9C,0x13,0x4C,0x72,0x34,0xDF,0xBC,0xD5,0x71,0xDF,0xAA,0x71,0xDD,0xE1,
-0xB9,0x6C,0x8C,0x3C,0x12,0x5D,0x65,0xDA,0xBD,0x57,0x12,0xB6,0x43,0x6B,0xFF,0xE5,
-0xDE,0x4D,0x66,0x11,0x51,0xCF,0x99,0xAE,0xEC,0x17,0xB6,0xE8,0x71,0x91,0x8C,0xDE,
-0x49,0xFE,0xDD,0x35,0x71,0xA2,0x15,0x27,0x94,0x1C,0xCF,0x61,0xE3,0x26,0xBB,0x6F,
-0xA3,0x67,0x25,0x21,0x5D,0xE6,0xDD,0x1D,0x0B,0x2E,0x68,0x1B,0x3B,0x82,0xAF,0xEC,
-0x83,0x67,0x85,0xD4,0x98,0x51,0x74,0xB1,0xB9,0x99,0x80,0x89,0xFF,0x7F,0x78,0x19,
-0x5C,0x79,0x4A,0x60,0x2E,0x92,0x40,0xAE,0x4C,0x37,0x2A,0x2C,0xC9,0xC7,0x62,0xC8,
-0x0E,0x5D,0xF7,0x36,0x5B,0xCA,0xE0,0x25,0x25,0x01,0xB4,0xDD,0x1A,0x07,0x9C,0x77,
-0x00,0x3F,0xD0,0xDC,0xD5,0xEC,0x3D,0xD4,0xFA,0xBB,0x3F,0xCC,0x85,0xD6,0x6F,0x7F,
-0xA9,0x2D,0xDF,0xB9,0x02,0xF7,0xF5,0x97,0x9A,0xB5,0x35,0xDA,0xC3,0x67,0xB0,0x87,
-0x4A,0xA9,0x28,0x9E,0x23,0x8E,0xFF,0x5C,0x27,0x6B,0xE1,0xB0,0x4F,0xF3,0x07,0xEE,
-0x00,0x2E,0xD4,0x59,0x87,0xCB,0x52,0x41,0x95,0xEA,0xF4,0x47,0xD7,0xEE,0x64,0x41,
-0x55,0x7C,0x8D,0x59,0x02,0x95,0xDD,0x62,0x9D,0xC2,0xB9,0xEE,0x5A,0x28,0x74,0x84,
-0xA5,0x9B,0xB7,0x90,0xC7,0x0C,0x07,0xDF,0xF5,0x89,0x36,0x74,0x32,0xD6,0x28,0xC1,
-0xB0,0xB0,0x0B,0xE0,0x9C,0x4C,0xC3,0x1C,0xD6,0xFC,0xE3,0x69,0xB5,0x47,0x46,0x81,
-0x2F,0xA2,0x82,0xAB,0xD3,0x63,0x44,0x70,0xC4,0x8D,0xFF,0x2D,0x33,0xBA,0xAD,0x8F,
-0x7B,0xB5,0x70,0x88,0xAE,0x3E,0x19,0xCF,0x40,0x28,0xD8,0xFC,0xC8,0x90,0xBB,0x5D,
-0x99,0x22,0xF5,0x52,0xE6,0x58,0xC5,0x1F,0x88,0x31,0x43,0xEE,0x88,0x1D,0xD7,0xC6,
-0x8E,0x3C,0x43,0x6A,0x1D,0xA7,0x18,0xDE,0x7D,0x3D,0x16,0xF1,0x62,0xF9,0xCA,0x90,
-0xA8,0xFD,
-};
-
-
-/* subject:/C=US/O=Starfield Technologies, Inc./OU=Starfield Class 2 Certification Authority */
-/* issuer :/C=US/O=Starfield Technologies, Inc./OU=Starfield Class 2 Certification Authority */
-
-
-const unsigned char Starfield_Class_2_CA_certificate[1043]={
-0x30,0x82,0x04,0x0F,0x30,0x82,0x02,0xF7,0xA0,0x03,0x02,0x01,0x02,0x02,0x01,0x00,
-0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x05,0x05,0x00,0x30,
-0x68,0x31,0x0B,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x25,
-0x30,0x23,0x06,0x03,0x55,0x04,0x0A,0x13,0x1C,0x53,0x74,0x61,0x72,0x66,0x69,0x65,
-0x6C,0x64,0x20,0x54,0x65,0x63,0x68,0x6E,0x6F,0x6C,0x6F,0x67,0x69,0x65,0x73,0x2C,
-0x20,0x49,0x6E,0x63,0x2E,0x31,0x32,0x30,0x30,0x06,0x03,0x55,0x04,0x0B,0x13,0x29,
-0x53,0x74,0x61,0x72,0x66,0x69,0x65,0x6C,0x64,0x20,0x43,0x6C,0x61,0x73,0x73,0x20,
-0x32,0x20,0x43,0x65,0x72,0x74,0x69,0x66,0x69,0x63,0x61,0x74,0x69,0x6F,0x6E,0x20,
-0x41,0x75,0x74,0x68,0x6F,0x72,0x69,0x74,0x79,0x30,0x1E,0x17,0x0D,0x30,0x34,0x30,
-0x36,0x32,0x39,0x31,0x37,0x33,0x39,0x31,0x36,0x5A,0x17,0x0D,0x33,0x34,0x30,0x36,
-0x32,0x39,0x31,0x37,0x33,0x39,0x31,0x36,0x5A,0x30,0x68,0x31,0x0B,0x30,0x09,0x06,
-0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x25,0x30,0x23,0x06,0x03,0x55,0x04,
-0x0A,0x13,0x1C,0x53,0x74,0x61,0x72,0x66,0x69,0x65,0x6C,0x64,0x20,0x54,0x65,0x63,
-0x68,0x6E,0x6F,0x6C,0x6F,0x67,0x69,0x65,0x73,0x2C,0x20,0x49,0x6E,0x63,0x2E,0x31,
-0x32,0x30,0x30,0x06,0x03,0x55,0x04,0x0B,0x13,0x29,0x53,0x74,0x61,0x72,0x66,0x69,
-0x65,0x6C,0x64,0x20,0x43,0x6C,0x61,0x73,0x73,0x20,0x32,0x20,0x43,0x65,0x72,0x74,
-0x69,0x66,0x69,0x63,0x61,0x74,0x69,0x6F,0x6E,0x20,0x41,0x75,0x74,0x68,0x6F,0x72,
-0x69,0x74,0x79,0x30,0x82,0x01,0x20,0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,
-0x0D,0x01,0x01,0x01,0x05,0x00,0x03,0x82,0x01,0x0D,0x00,0x30,0x82,0x01,0x08,0x02,
-0x82,0x01,0x01,0x00,0xB7,0x32,0xC8,0xFE,0xE9,0x71,0xA6,0x04,0x85,0xAD,0x0C,0x11,
-0x64,0xDF,0xCE,0x4D,0xEF,0xC8,0x03,0x18,0x87,0x3F,0xA1,0xAB,0xFB,0x3C,0xA6,0x9F,
-0xF0,0xC3,0xA1,0xDA,0xD4,0xD8,0x6E,0x2B,0x53,0x90,0xFB,0x24,0xA4,0x3E,0x84,0xF0,
-0x9E,0xE8,0x5F,0xEC,0xE5,0x27,0x44,0xF5,0x28,0xA6,0x3F,0x7B,0xDE,0xE0,0x2A,0xF0,
-0xC8,0xAF,0x53,0x2F,0x9E,0xCA,0x05,0x01,0x93,0x1E,0x8F,0x66,0x1C,0x39,0xA7,0x4D,
-0xFA,0x5A,0xB6,0x73,0x04,0x25,0x66,0xEB,0x77,0x7F,0xE7,0x59,0xC6,0x4A,0x99,0x25,
-0x14,0x54,0xEB,0x26,0xC7,0xF3,0x7F,0x19,0xD5,0x30,0x70,0x8F,0xAF,0xB0,0x46,0x2A,
-0xFF,0xAD,0xEB,0x29,0xED,0xD7,0x9F,0xAA,0x04,0x87,0xA3,0xD4,0xF9,0x89,0xA5,0x34,
-0x5F,0xDB,0x43,0x91,0x82,0x36,0xD9,0x66,0x3C,0xB1,0xB8,0xB9,0x82,0xFD,0x9C,0x3A,
-0x3E,0x10,0xC8,0x3B,0xEF,0x06,0x65,0x66,0x7A,0x9B,0x19,0x18,0x3D,0xFF,0x71,0x51,
-0x3C,0x30,0x2E,0x5F,0xBE,0x3D,0x77,0x73,0xB2,0x5D,0x06,0x6C,0xC3,0x23,0x56,0x9A,
-0x2B,0x85,0x26,0x92,0x1C,0xA7,0x02,0xB3,0xE4,0x3F,0x0D,0xAF,0x08,0x79,0x82,0xB8,
-0x36,0x3D,0xEA,0x9C,0xD3,0x35,0xB3,0xBC,0x69,0xCA,0xF5,0xCC,0x9D,0xE8,0xFD,0x64,
-0x8D,0x17,0x80,0x33,0x6E,0x5E,0x4A,0x5D,0x99,0xC9,0x1E,0x87,0xB4,0x9D,0x1A,0xC0,
-0xD5,0x6E,0x13,0x35,0x23,0x5E,0xDF,0x9B,0x5F,0x3D,0xEF,0xD6,0xF7,0x76,0xC2,0xEA,
-0x3E,0xBB,0x78,0x0D,0x1C,0x42,0x67,0x6B,0x04,0xD8,0xF8,0xD6,0xDA,0x6F,0x8B,0xF2,
-0x44,0xA0,0x01,0xAB,0x02,0x01,0x03,0xA3,0x81,0xC5,0x30,0x81,0xC2,0x30,0x1D,0x06,
-0x03,0x55,0x1D,0x0E,0x04,0x16,0x04,0x14,0xBF,0x5F,0xB7,0xD1,0xCE,0xDD,0x1F,0x86,
-0xF4,0x5B,0x55,0xAC,0xDC,0xD7,0x10,0xC2,0x0E,0xA9,0x88,0xE7,0x30,0x81,0x92,0x06,
-0x03,0x55,0x1D,0x23,0x04,0x81,0x8A,0x30,0x81,0x87,0x80,0x14,0xBF,0x5F,0xB7,0xD1,
-0xCE,0xDD,0x1F,0x86,0xF4,0x5B,0x55,0xAC,0xDC,0xD7,0x10,0xC2,0x0E,0xA9,0x88,0xE7,
-0xA1,0x6C,0xA4,0x6A,0x30,0x68,0x31,0x0B,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,
-0x02,0x55,0x53,0x31,0x25,0x30,0x23,0x06,0x03,0x55,0x04,0x0A,0x13,0x1C,0x53,0x74,
-0x61,0x72,0x66,0x69,0x65,0x6C,0x64,0x20,0x54,0x65,0x63,0x68,0x6E,0x6F,0x6C,0x6F,
-0x67,0x69,0x65,0x73,0x2C,0x20,0x49,0x6E,0x63,0x2E,0x31,0x32,0x30,0x30,0x06,0x03,
-0x55,0x04,0x0B,0x13,0x29,0x53,0x74,0x61,0x72,0x66,0x69,0x65,0x6C,0x64,0x20,0x43,
-0x6C,0x61,0x73,0x73,0x20,0x32,0x20,0x43,0x65,0x72,0x74,0x69,0x66,0x69,0x63,0x61,
-0x74,0x69,0x6F,0x6E,0x20,0x41,0x75,0x74,0x68,0x6F,0x72,0x69,0x74,0x79,0x82,0x01,
-0x00,0x30,0x0C,0x06,0x03,0x55,0x1D,0x13,0x04,0x05,0x30,0x03,0x01,0x01,0xFF,0x30,
-0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x05,0x05,0x00,0x03,0x82,
-0x01,0x01,0x00,0x05,0x9D,0x3F,0x88,0x9D,0xD1,0xC9,0x1A,0x55,0xA1,0xAC,0x69,0xF3,
-0xF3,0x59,0xDA,0x9B,0x01,0x87,0x1A,0x4F,0x57,0xA9,0xA1,0x79,0x09,0x2A,0xDB,0xF7,
-0x2F,0xB2,0x1E,0xCC,0xC7,0x5E,0x6A,0xD8,0x83,0x87,0xA1,0x97,0xEF,0x49,0x35,0x3E,
-0x77,0x06,0x41,0x58,0x62,0xBF,0x8E,0x58,0xB8,0x0A,0x67,0x3F,0xEC,0xB3,0xDD,0x21,
-0x66,0x1F,0xC9,0x54,0xFA,0x72,0xCC,0x3D,0x4C,0x40,0xD8,0x81,0xAF,0x77,0x9E,0x83,
-0x7A,0xBB,0xA2,0xC7,0xF5,0x34,0x17,0x8E,0xD9,0x11,0x40,0xF4,0xFC,0x2C,0x2A,0x4D,
-0x15,0x7F,0xA7,0x62,0x5D,0x2E,0x25,0xD3,0x00,0x0B,0x20,0x1A,0x1D,0x68,0xF9,0x17,
-0xB8,0xF4,0xBD,0x8B,0xED,0x28,0x59,0xDD,0x4D,0x16,0x8B,0x17,0x83,0xC8,0xB2,0x65,
-0xC7,0x2D,0x7A,0xA5,0xAA,0xBC,0x53,0x86,0x6D,0xDD,0x57,0xA4,0xCA,0xF8,0x20,0x41,
-0x0B,0x68,0xF0,0xF4,0xFB,0x74,0xBE,0x56,0x5D,0x7A,0x79,0xF5,0xF9,0x1D,0x85,0xE3,
-0x2D,0x95,0xBE,0xF5,0x71,0x90,0x43,0xCC,0x8D,0x1F,0x9A,0x00,0x0A,0x87,0x29,0xE9,
-0x55,0x22,0x58,0x00,0x23,0xEA,0xE3,0x12,0x43,0x29,0x5B,0x47,0x08,0xDD,0x8C,0x41,
-0x6A,0x65,0x06,0xA8,0xE5,0x21,0xAA,0x41,0xB4,0x95,0x21,0x95,0xB9,0x7D,0xD1,0x34,
-0xAB,0x13,0xD6,0xAD,0xBC,0xDC,0xE2,0x3D,0x39,0xCD,0xBD,0x3E,0x75,0x70,0xA1,0x18,
-0x59,0x03,0xC9,0x22,0xB4,0x8F,0x9C,0xD5,0x5E,0x2A,0xD7,0xA5,0xB6,0xD4,0x0A,0x6D,
-0xF8,0xB7,0x40,0x11,0x46,0x9A,0x1F,0x79,0x0E,0x62,0xBF,0x0F,0x97,0xEC,0xE0,0x2F,
-0x1F,0x17,0x94,
-};
-
-
-/* subject:/C=US/O=VeriSign, Inc./OU=VeriSign Trust Network/OU=(c) 1999 VeriSign, Inc. - For authorized use only/CN=VeriSign Class 3 Public Primary Certification Authority - G3 */
-/* issuer :/C=US/O=VeriSign, Inc./OU=VeriSign Trust Network/OU=(c) 1999 VeriSign, Inc. - For authorized use only/CN=VeriSign Class 3 Public Primary Certification Authority - G3 */
-
-
-const unsigned char Verisign_Class_3_Public_Primary_Certification_Authority___G3_certificate[1054]={
-0x30,0x82,0x04,0x1A,0x30,0x82,0x03,0x02,0x02,0x11,0x00,0x9B,0x7E,0x06,0x49,0xA3,
-0x3E,0x62,0xB9,0xD5,0xEE,0x90,0x48,0x71,0x29,0xEF,0x57,0x30,0x0D,0x06,0x09,0x2A,
-0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x05,0x05,0x00,0x30,0x81,0xCA,0x31,0x0B,0x30,
-0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x17,0x30,0x15,0x06,0x03,
-0x55,0x04,0x0A,0x13,0x0E,0x56,0x65,0x72,0x69,0x53,0x69,0x67,0x6E,0x2C,0x20,0x49,
-0x6E,0x63,0x2E,0x31,0x1F,0x30,0x1D,0x06,0x03,0x55,0x04,0x0B,0x13,0x16,0x56,0x65,
-0x72,0x69,0x53,0x69,0x67,0x6E,0x20,0x54,0x72,0x75,0x73,0x74,0x20,0x4E,0x65,0x74,
-0x77,0x6F,0x72,0x6B,0x31,0x3A,0x30,0x38,0x06,0x03,0x55,0x04,0x0B,0x13,0x31,0x28,
-0x63,0x29,0x20,0x31,0x39,0x39,0x39,0x20,0x56,0x65,0x72,0x69,0x53,0x69,0x67,0x6E,
-0x2C,0x20,0x49,0x6E,0x63,0x2E,0x20,0x2D,0x20,0x46,0x6F,0x72,0x20,0x61,0x75,0x74,
-0x68,0x6F,0x72,0x69,0x7A,0x65,0x64,0x20,0x75,0x73,0x65,0x20,0x6F,0x6E,0x6C,0x79,
-0x31,0x45,0x30,0x43,0x06,0x03,0x55,0x04,0x03,0x13,0x3C,0x56,0x65,0x72,0x69,0x53,
-0x69,0x67,0x6E,0x20,0x43,0x6C,0x61,0x73,0x73,0x20,0x33,0x20,0x50,0x75,0x62,0x6C,
-0x69,0x63,0x20,0x50,0x72,0x69,0x6D,0x61,0x72,0x79,0x20,0x43,0x65,0x72,0x74,0x69,
-0x66,0x69,0x63,0x61,0x74,0x69,0x6F,0x6E,0x20,0x41,0x75,0x74,0x68,0x6F,0x72,0x69,
-0x74,0x79,0x20,0x2D,0x20,0x47,0x33,0x30,0x1E,0x17,0x0D,0x39,0x39,0x31,0x30,0x30,
-0x31,0x30,0x30,0x30,0x30,0x30,0x30,0x5A,0x17,0x0D,0x33,0x36,0x30,0x37,0x31,0x36,
-0x32,0x33,0x35,0x39,0x35,0x39,0x5A,0x30,0x81,0xCA,0x31,0x0B,0x30,0x09,0x06,0x03,
-0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x17,0x30,0x15,0x06,0x03,0x55,0x04,0x0A,
-0x13,0x0E,0x56,0x65,0x72,0x69,0x53,0x69,0x67,0x6E,0x2C,0x20,0x49,0x6E,0x63,0x2E,
-0x31,0x1F,0x30,0x1D,0x06,0x03,0x55,0x04,0x0B,0x13,0x16,0x56,0x65,0x72,0x69,0x53,
-0x69,0x67,0x6E,0x20,0x54,0x72,0x75,0x73,0x74,0x20,0x4E,0x65,0x74,0x77,0x6F,0x72,
-0x6B,0x31,0x3A,0x30,0x38,0x06,0x03,0x55,0x04,0x0B,0x13,0x31,0x28,0x63,0x29,0x20,
-0x31,0x39,0x39,0x39,0x20,0x56,0x65,0x72,0x69,0x53,0x69,0x67,0x6E,0x2C,0x20,0x49,
-0x6E,0x63,0x2E,0x20,0x2D,0x20,0x46,0x6F,0x72,0x20,0x61,0x75,0x74,0x68,0x6F,0x72,
-0x69,0x7A,0x65,0x64,0x20,0x75,0x73,0x65,0x20,0x6F,0x6E,0x6C,0x79,0x31,0x45,0x30,
-0x43,0x06,0x03,0x55,0x04,0x03,0x13,0x3C,0x56,0x65,0x72,0x69,0x53,0x69,0x67,0x6E,
-0x20,0x43,0x6C,0x61,0x73,0x73,0x20,0x33,0x20,0x50,0x75,0x62,0x6C,0x69,0x63,0x20,
-0x50,0x72,0x69,0x6D,0x61,0x72,0x79,0x20,0x43,0x65,0x72,0x74,0x69,0x66,0x69,0x63,
-0x61,0x74,0x69,0x6F,0x6E,0x20,0x41,0x75,0x74,0x68,0x6F,0x72,0x69,0x74,0x79,0x20,
-0x2D,0x20,0x47,0x33,0x30,0x82,0x01,0x22,0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,
-0xF7,0x0D,0x01,0x01,0x01,0x05,0x00,0x03,0x82,0x01,0x0F,0x00,0x30,0x82,0x01,0x0A,
-0x02,0x82,0x01,0x01,0x00,0xCB,0xBA,0x9C,0x52,0xFC,0x78,0x1F,0x1A,0x1E,0x6F,0x1B,
-0x37,0x73,0xBD,0xF8,0xC9,0x6B,0x94,0x12,0x30,0x4F,0xF0,0x36,0x47,0xF5,0xD0,0x91,
-0x0A,0xF5,0x17,0xC8,0xA5,0x61,0xC1,0x16,0x40,0x4D,0xFB,0x8A,0x61,0x90,0xE5,0x76,
-0x20,0xC1,0x11,0x06,0x7D,0xAB,0x2C,0x6E,0xA6,0xF5,0x11,0x41,0x8E,0xFA,0x2D,0xAD,
-0x2A,0x61,0x59,0xA4,0x67,0x26,0x4C,0xD0,0xE8,0xBC,0x52,0x5B,0x70,0x20,0x04,0x58,
-0xD1,0x7A,0xC9,0xA4,0x69,0xBC,0x83,0x17,0x64,0xAD,0x05,0x8B,0xBC,0xD0,0x58,0xCE,
-0x8D,0x8C,0xF5,0xEB,0xF0,0x42,0x49,0x0B,0x9D,0x97,0x27,0x67,0x32,0x6E,0xE1,0xAE,
-0x93,0x15,0x1C,0x70,0xBC,0x20,0x4D,0x2F,0x18,0xDE,0x92,0x88,0xE8,0x6C,0x85,0x57,
-0x11,0x1A,0xE9,0x7E,0xE3,0x26,0x11,0x54,0xA2,0x45,0x96,0x55,0x83,0xCA,0x30,0x89,
-0xE8,0xDC,0xD8,0xA3,0xED,0x2A,0x80,0x3F,0x7F,0x79,0x65,0x57,0x3E,0x15,0x20,0x66,
-0x08,0x2F,0x95,0x93,0xBF,0xAA,0x47,0x2F,0xA8,0x46,0x97,0xF0,0x12,0xE2,0xFE,0xC2,
-0x0A,0x2B,0x51,0xE6,0x76,0xE6,0xB7,0x46,0xB7,0xE2,0x0D,0xA6,0xCC,0xA8,0xC3,0x4C,
-0x59,0x55,0x89,0xE6,0xE8,0x53,0x5C,0x1C,0xEA,0x9D,0xF0,0x62,0x16,0x0B,0xA7,0xC9,
-0x5F,0x0C,0xF0,0xDE,0xC2,0x76,0xCE,0xAF,0xF7,0x6A,0xF2,0xFA,0x41,0xA6,0xA2,0x33,
-0x14,0xC9,0xE5,0x7A,0x63,0xD3,0x9E,0x62,0x37,0xD5,0x85,0x65,0x9E,0x0E,0xE6,0x53,
-0x24,0x74,0x1B,0x5E,0x1D,0x12,0x53,0x5B,0xC7,0x2C,0xE7,0x83,0x49,0x3B,0x15,0xAE,
-0x8A,0x68,0xB9,0x57,0x97,0x02,0x03,0x01,0x00,0x01,0x30,0x0D,0x06,0x09,0x2A,0x86,
-0x48,0x86,0xF7,0x0D,0x01,0x01,0x05,0x05,0x00,0x03,0x82,0x01,0x01,0x00,0x11,0x14,
-0x96,0xC1,0xAB,0x92,0x08,0xF7,0x3F,0x2F,0xC9,0xB2,0xFE,0xE4,0x5A,0x9F,0x64,0xDE,
-0xDB,0x21,0x4F,0x86,0x99,0x34,0x76,0x36,0x57,0xDD,0xD0,0x15,0x2F,0xC5,0xAD,0x7F,
-0x15,0x1F,0x37,0x62,0x73,0x3E,0xD4,0xE7,0x5F,0xCE,0x17,0x03,0xDB,0x35,0xFA,0x2B,
-0xDB,0xAE,0x60,0x09,0x5F,0x1E,0x5F,0x8F,0x6E,0xBB,0x0B,0x3D,0xEA,0x5A,0x13,0x1E,
-0x0C,0x60,0x6F,0xB5,0xC0,0xB5,0x23,0x22,0x2E,0x07,0x0B,0xCB,0xA9,0x74,0xCB,0x47,
-0xBB,0x1D,0xC1,0xD7,0xA5,0x6B,0xCC,0x2F,0xD2,0x42,0xFD,0x49,0xDD,0xA7,0x89,0xCF,
-0x53,0xBA,0xDA,0x00,0x5A,0x28,0xBF,0x82,0xDF,0xF8,0xBA,0x13,0x1D,0x50,0x86,0x82,
-0xFD,0x8E,0x30,0x8F,0x29,0x46,0xB0,0x1E,0x3D,0x35,0xDA,0x38,0x62,0x16,0x18,0x4A,
-0xAD,0xE6,0xB6,0x51,0x6C,0xDE,0xAF,0x62,0xEB,0x01,0xD0,0x1E,0x24,0xFE,0x7A,0x8F,
-0x12,0x1A,0x12,0x68,0xB8,0xFB,0x66,0x99,0x14,0x14,0x45,0x5C,0xAE,0xE7,0xAE,0x69,
-0x17,0x81,0x2B,0x5A,0x37,0xC9,0x5E,0x2A,0xF4,0xC6,0xE2,0xA1,0x5C,0x54,0x9B,0xA6,
-0x54,0x00,0xCF,0xF0,0xF1,0xC1,0xC7,0x98,0x30,0x1A,0x3B,0x36,0x16,0xDB,0xA3,0x6E,
-0xEA,0xFD,0xAD,0xB2,0xC2,0xDA,0xEF,0x02,0x47,0x13,0x8A,0xC0,0xF1,0xB3,0x31,0xAD,
-0x4F,0x1C,0xE1,0x4F,0x9C,0xAF,0x0F,0x0C,0x9D,0xF7,0x78,0x0D,0xD8,0xF4,0x35,0x56,
-0x80,0xDA,0xB7,0x6D,0x17,0x8F,0x9D,0x1E,0x81,0x64,0xE1,0xFE,0xC5,0x45,0xBA,0xAD,
-0x6B,0xB9,0x0A,0x7A,0x4E,0x4F,0x4B,0x84,0xEE,0x4B,0xF1,0x7D,0xDD,0x11,
-};
-
-
-/* subject:/C=US/ST=New Jersey/L=Jersey City/O=The USERTRUST Network/CN=USERTrust ECC Certification Authority */
-/* issuer :/C=US/ST=New Jersey/L=Jersey City/O=The USERTRUST Network/CN=USERTrust ECC Certification Authority */
-
-
-const unsigned char USERTrust_ECC_Certification_Authority_certificate[659]={
-0x30,0x82,0x02,0x8F,0x30,0x82,0x02,0x15,0xA0,0x03,0x02,0x01,0x02,0x02,0x10,0x5C,
-0x8B,0x99,0xC5,0x5A,0x94,0xC5,0xD2,0x71,0x56,0xDE,0xCD,0x89,0x80,0xCC,0x26,0x30,
-0x0A,0x06,0x08,0x2A,0x86,0x48,0xCE,0x3D,0x04,0x03,0x03,0x30,0x81,0x88,0x31,0x0B,
-0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x13,0x30,0x11,0x06,
-0x03,0x55,0x04,0x08,0x13,0x0A,0x4E,0x65,0x77,0x20,0x4A,0x65,0x72,0x73,0x65,0x79,
-0x31,0x14,0x30,0x12,0x06,0x03,0x55,0x04,0x07,0x13,0x0B,0x4A,0x65,0x72,0x73,0x65,
-0x79,0x20,0x43,0x69,0x74,0x79,0x31,0x1E,0x30,0x1C,0x06,0x03,0x55,0x04,0x0A,0x13,
-0x15,0x54,0x68,0x65,0x20,0x55,0x53,0x45,0x52,0x54,0x52,0x55,0x53,0x54,0x20,0x4E,
-0x65,0x74,0x77,0x6F,0x72,0x6B,0x31,0x2E,0x30,0x2C,0x06,0x03,0x55,0x04,0x03,0x13,
-0x25,0x55,0x53,0x45,0x52,0x54,0x72,0x75,0x73,0x74,0x20,0x45,0x43,0x43,0x20,0x43,
-0x65,0x72,0x74,0x69,0x66,0x69,0x63,0x61,0x74,0x69,0x6F,0x6E,0x20,0x41,0x75,0x74,
-0x68,0x6F,0x72,0x69,0x74,0x79,0x30,0x1E,0x17,0x0D,0x31,0x30,0x30,0x32,0x30,0x31,
-0x30,0x30,0x30,0x30,0x30,0x30,0x5A,0x17,0x0D,0x33,0x38,0x30,0x31,0x31,0x38,0x32,
-0x33,0x35,0x39,0x35,0x39,0x5A,0x30,0x81,0x88,0x31,0x0B,0x30,0x09,0x06,0x03,0x55,
-0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x13,0x30,0x11,0x06,0x03,0x55,0x04,0x08,0x13,
-0x0A,0x4E,0x65,0x77,0x20,0x4A,0x65,0x72,0x73,0x65,0x79,0x31,0x14,0x30,0x12,0x06,
-0x03,0x55,0x04,0x07,0x13,0x0B,0x4A,0x65,0x72,0x73,0x65,0x79,0x20,0x43,0x69,0x74,
-0x79,0x31,0x1E,0x30,0x1C,0x06,0x03,0x55,0x04,0x0A,0x13,0x15,0x54,0x68,0x65,0x20,
-0x55,0x53,0x45,0x52,0x54,0x52,0x55,0x53,0x54,0x20,0x4E,0x65,0x74,0x77,0x6F,0x72,
-0x6B,0x31,0x2E,0x30,0x2C,0x06,0x03,0x55,0x04,0x03,0x13,0x25,0x55,0x53,0x45,0x52,
-0x54,0x72,0x75,0x73,0x74,0x20,0x45,0x43,0x43,0x20,0x43,0x65,0x72,0x74,0x69,0x66,
-0x69,0x63,0x61,0x74,0x69,0x6F,0x6E,0x20,0x41,0x75,0x74,0x68,0x6F,0x72,0x69,0x74,
-0x79,0x30,0x76,0x30,0x10,0x06,0x07,0x2A,0x86,0x48,0xCE,0x3D,0x02,0x01,0x06,0x05,
-0x2B,0x81,0x04,0x00,0x22,0x03,0x62,0x00,0x04,0x1A,0xAC,0x54,0x5A,0xA9,0xF9,0x68,
-0x23,0xE7,0x7A,0xD5,0x24,0x6F,0x53,0xC6,0x5A,0xD8,0x4B,0xAB,0xC6,0xD5,0xB6,0xD1,
-0xE6,0x73,0x71,0xAE,0xDD,0x9C,0xD6,0x0C,0x61,0xFD,0xDB,0xA0,0x89,0x03,0xB8,0x05,
-0x14,0xEC,0x57,0xCE,0xEE,0x5D,0x3F,0xE2,0x21,0xB3,0xCE,0xF7,0xD4,0x8A,0x79,0xE0,
-0xA3,0x83,0x7E,0x2D,0x97,0xD0,0x61,0xC4,0xF1,0x99,0xDC,0x25,0x91,0x63,0xAB,0x7F,
-0x30,0xA3,0xB4,0x70,0xE2,0xC7,0xA1,0x33,0x9C,0xF3,0xBF,0x2E,0x5C,0x53,0xB1,0x5F,
-0xB3,0x7D,0x32,0x7F,0x8A,0x34,0xE3,0x79,0x79,0xA3,0x42,0x30,0x40,0x30,0x1D,0x06,
-0x03,0x55,0x1D,0x0E,0x04,0x16,0x04,0x14,0x3A,0xE1,0x09,0x86,0xD4,0xCF,0x19,0xC2,
-0x96,0x76,0x74,0x49,0x76,0xDC,0xE0,0x35,0xC6,0x63,0x63,0x9A,0x30,0x0E,0x06,0x03,
-0x55,0x1D,0x0F,0x01,0x01,0xFF,0x04,0x04,0x03,0x02,0x01,0x06,0x30,0x0F,0x06,0x03,
-0x55,0x1D,0x13,0x01,0x01,0xFF,0x04,0x05,0x30,0x03,0x01,0x01,0xFF,0x30,0x0A,0x06,
-0x08,0x2A,0x86,0x48,0xCE,0x3D,0x04,0x03,0x03,0x03,0x68,0x00,0x30,0x65,0x02,0x30,
-0x36,0x67,0xA1,0x16,0x08,0xDC,0xE4,0x97,0x00,0x41,0x1D,0x4E,0xBE,0xE1,0x63,0x01,
-0xCF,0x3B,0xAA,0x42,0x11,0x64,0xA0,0x9D,0x94,0x39,0x02,0x11,0x79,0x5C,0x7B,0x1D,
-0xFA,0x64,0xB9,0xEE,0x16,0x42,0xB3,0xBF,0x8A,0xC2,0x09,0xC4,0xEC,0xE4,0xB1,0x4D,
-0x02,0x31,0x00,0xE9,0x2A,0x61,0x47,0x8C,0x52,0x4A,0x4B,0x4E,0x18,0x70,0xF6,0xD6,
-0x44,0xD6,0x6E,0xF5,0x83,0xBA,0x6D,0x58,0xBD,0x24,0xD9,0x56,0x48,0xEA,0xEF,0xC4,
-0xA2,0x46,0x81,0x88,0x6A,0x3A,0x46,0xD1,0xA9,0x9B,0x4D,0xC9,0x61,0xDA,0xD1,0x5D,
-0x57,0x6A,0x18,
-};
-
-
-/* subject:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA */
-/* issuer :/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA */
-
-
-const unsigned char GeoTrust_Global_CA_certificate[856]={
-0x30,0x82,0x03,0x54,0x30,0x82,0x02,0x3C,0xA0,0x03,0x02,0x01,0x02,0x02,0x03,0x02,
-0x34,0x56,0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x05,0x05,
-0x00,0x30,0x42,0x31,0x0B,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,
-0x31,0x16,0x30,0x14,0x06,0x03,0x55,0x04,0x0A,0x13,0x0D,0x47,0x65,0x6F,0x54,0x72,
-0x75,0x73,0x74,0x20,0x49,0x6E,0x63,0x2E,0x31,0x1B,0x30,0x19,0x06,0x03,0x55,0x04,
-0x03,0x13,0x12,0x47,0x65,0x6F,0x54,0x72,0x75,0x73,0x74,0x20,0x47,0x6C,0x6F,0x62,
-0x61,0x6C,0x20,0x43,0x41,0x30,0x1E,0x17,0x0D,0x30,0x32,0x30,0x35,0x32,0x31,0x30,
-0x34,0x30,0x30,0x30,0x30,0x5A,0x17,0x0D,0x32,0x32,0x30,0x35,0x32,0x31,0x30,0x34,
-0x30,0x30,0x30,0x30,0x5A,0x30,0x42,0x31,0x0B,0x30,0x09,0x06,0x03,0x55,0x04,0x06,
-0x13,0x02,0x55,0x53,0x31,0x16,0x30,0x14,0x06,0x03,0x55,0x04,0x0A,0x13,0x0D,0x47,
-0x65,0x6F,0x54,0x72,0x75,0x73,0x74,0x20,0x49,0x6E,0x63,0x2E,0x31,0x1B,0x30,0x19,
-0x06,0x03,0x55,0x04,0x03,0x13,0x12,0x47,0x65,0x6F,0x54,0x72,0x75,0x73,0x74,0x20,
-0x47,0x6C,0x6F,0x62,0x61,0x6C,0x20,0x43,0x41,0x30,0x82,0x01,0x22,0x30,0x0D,0x06,
-0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x01,0x05,0x00,0x03,0x82,0x01,0x0F,
-0x00,0x30,0x82,0x01,0x0A,0x02,0x82,0x01,0x01,0x00,0xDA,0xCC,0x18,0x63,0x30,0xFD,
-0xF4,0x17,0x23,0x1A,0x56,0x7E,0x5B,0xDF,0x3C,0x6C,0x38,0xE4,0x71,0xB7,0x78,0x91,
-0xD4,0xBC,0xA1,0xD8,0x4C,0xF8,0xA8,0x43,0xB6,0x03,0xE9,0x4D,0x21,0x07,0x08,0x88,
-0xDA,0x58,0x2F,0x66,0x39,0x29,0xBD,0x05,0x78,0x8B,0x9D,0x38,0xE8,0x05,0xB7,0x6A,
-0x7E,0x71,0xA4,0xE6,0xC4,0x60,0xA6,0xB0,0xEF,0x80,0xE4,0x89,0x28,0x0F,0x9E,0x25,
-0xD6,0xED,0x83,0xF3,0xAD,0xA6,0x91,0xC7,0x98,0xC9,0x42,0x18,0x35,0x14,0x9D,0xAD,
-0x98,0x46,0x92,0x2E,0x4F,0xCA,0xF1,0x87,0x43,0xC1,0x16,0x95,0x57,0x2D,0x50,0xEF,
-0x89,0x2D,0x80,0x7A,0x57,0xAD,0xF2,0xEE,0x5F,0x6B,0xD2,0x00,0x8D,0xB9,0x14,0xF8,
-0x14,0x15,0x35,0xD9,0xC0,0x46,0xA3,0x7B,0x72,0xC8,0x91,0xBF,0xC9,0x55,0x2B,0xCD,
-0xD0,0x97,0x3E,0x9C,0x26,0x64,0xCC,0xDF,0xCE,0x83,0x19,0x71,0xCA,0x4E,0xE6,0xD4,
-0xD5,0x7B,0xA9,0x19,0xCD,0x55,0xDE,0xC8,0xEC,0xD2,0x5E,0x38,0x53,0xE5,0x5C,0x4F,
-0x8C,0x2D,0xFE,0x50,0x23,0x36,0xFC,0x66,0xE6,0xCB,0x8E,0xA4,0x39,0x19,0x00,0xB7,
-0x95,0x02,0x39,0x91,0x0B,0x0E,0xFE,0x38,0x2E,0xD1,0x1D,0x05,0x9A,0xF6,0x4D,0x3E,
-0x6F,0x0F,0x07,0x1D,0xAF,0x2C,0x1E,0x8F,0x60,0x39,0xE2,0xFA,0x36,0x53,0x13,0x39,
-0xD4,0x5E,0x26,0x2B,0xDB,0x3D,0xA8,0x14,0xBD,0x32,0xEB,0x18,0x03,0x28,0x52,0x04,
-0x71,0xE5,0xAB,0x33,0x3D,0xE1,0x38,0xBB,0x07,0x36,0x84,0x62,0x9C,0x79,0xEA,0x16,
-0x30,0xF4,0x5F,0xC0,0x2B,0xE8,0x71,0x6B,0xE4,0xF9,0x02,0x03,0x01,0x00,0x01,0xA3,
-0x53,0x30,0x51,0x30,0x0F,0x06,0x03,0x55,0x1D,0x13,0x01,0x01,0xFF,0x04,0x05,0x30,
-0x03,0x01,0x01,0xFF,0x30,0x1D,0x06,0x03,0x55,0x1D,0x0E,0x04,0x16,0x04,0x14,0xC0,
-0x7A,0x98,0x68,0x8D,0x89,0xFB,0xAB,0x05,0x64,0x0C,0x11,0x7D,0xAA,0x7D,0x65,0xB8,
-0xCA,0xCC,0x4E,0x30,0x1F,0x06,0x03,0x55,0x1D,0x23,0x04,0x18,0x30,0x16,0x80,0x14,
-0xC0,0x7A,0x98,0x68,0x8D,0x89,0xFB,0xAB,0x05,0x64,0x0C,0x11,0x7D,0xAA,0x7D,0x65,
-0xB8,0xCA,0xCC,0x4E,0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,
-0x05,0x05,0x00,0x03,0x82,0x01,0x01,0x00,0x35,0xE3,0x29,0x6A,0xE5,0x2F,0x5D,0x54,
-0x8E,0x29,0x50,0x94,0x9F,0x99,0x1A,0x14,0xE4,0x8F,0x78,0x2A,0x62,0x94,0xA2,0x27,
-0x67,0x9E,0xD0,0xCF,0x1A,0x5E,0x47,0xE9,0xC1,0xB2,0xA4,0xCF,0xDD,0x41,0x1A,0x05,
-0x4E,0x9B,0x4B,0xEE,0x4A,0x6F,0x55,0x52,0xB3,0x24,0xA1,0x37,0x0A,0xEB,0x64,0x76,
-0x2A,0x2E,0x2C,0xF3,0xFD,0x3B,0x75,0x90,0xBF,0xFA,0x71,0xD8,0xC7,0x3D,0x37,0xD2,
-0xB5,0x05,0x95,0x62,0xB9,0xA6,0xDE,0x89,0x3D,0x36,0x7B,0x38,0x77,0x48,0x97,0xAC,
-0xA6,0x20,0x8F,0x2E,0xA6,0xC9,0x0C,0xC2,0xB2,0x99,0x45,0x00,0xC7,0xCE,0x11,0x51,
-0x22,0x22,0xE0,0xA5,0xEA,0xB6,0x15,0x48,0x09,0x64,0xEA,0x5E,0x4F,0x74,0xF7,0x05,
-0x3E,0xC7,0x8A,0x52,0x0C,0xDB,0x15,0xB4,0xBD,0x6D,0x9B,0xE5,0xC6,0xB1,0x54,0x68,
-0xA9,0xE3,0x69,0x90,0xB6,0x9A,0xA5,0x0F,0xB8,0xB9,0x3F,0x20,0x7D,0xAE,0x4A,0xB5,
-0xB8,0x9C,0xE4,0x1D,0xB6,0xAB,0xE6,0x94,0xA5,0xC1,0xC7,0x83,0xAD,0xDB,0xF5,0x27,
-0x87,0x0E,0x04,0x6C,0xD5,0xFF,0xDD,0xA0,0x5D,0xED,0x87,0x52,0xB7,0x2B,0x15,0x02,
-0xAE,0x39,0xA6,0x6A,0x74,0xE9,0xDA,0xC4,0xE7,0xBC,0x4D,0x34,0x1E,0xA9,0x5C,0x4D,
-0x33,0x5F,0x92,0x09,0x2F,0x88,0x66,0x5D,0x77,0x97,0xC7,0x1D,0x76,0x13,0xA9,0xD5,
-0xE5,0xF1,0x16,0x09,0x11,0x35,0xD5,0xAC,0xDB,0x24,0x71,0x70,0x2C,0x98,0x56,0x0B,
-0xD9,0x17,0xB4,0xD1,0xE3,0x51,0x2B,0x5E,0x75,0xE8,0xD5,0xD0,0xDC,0x4F,0x34,0xED,
-0xC2,0x05,0x66,0x80,0xA1,0xCB,0xE6,0x33,
-};
-
-
-/* subject:/C=US/ST=Arizona/L=Scottsdale/O=Starfield Technologies, Inc./CN=Starfield Root Certificate Authority - G2 */
-/* issuer :/C=US/ST=Arizona/L=Scottsdale/O=Starfield Technologies, Inc./CN=Starfield Root Certificate Authority - G2 */
-
-
-const unsigned char Starfield_Root_Certificate_Authority___G2_certificate[993]={
-0x30,0x82,0x03,0xDD,0x30,0x82,0x02,0xC5,0xA0,0x03,0x02,0x01,0x02,0x02,0x01,0x00,
-0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x0B,0x05,0x00,0x30,
-0x81,0x8F,0x31,0x0B,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,
-0x10,0x30,0x0E,0x06,0x03,0x55,0x04,0x08,0x13,0x07,0x41,0x72,0x69,0x7A,0x6F,0x6E,
-0x61,0x31,0x13,0x30,0x11,0x06,0x03,0x55,0x04,0x07,0x13,0x0A,0x53,0x63,0x6F,0x74,
-0x74,0x73,0x64,0x61,0x6C,0x65,0x31,0x25,0x30,0x23,0x06,0x03,0x55,0x04,0x0A,0x13,
-0x1C,0x53,0x74,0x61,0x72,0x66,0x69,0x65,0x6C,0x64,0x20,0x54,0x65,0x63,0x68,0x6E,
-0x6F,0x6C,0x6F,0x67,0x69,0x65,0x73,0x2C,0x20,0x49,0x6E,0x63,0x2E,0x31,0x32,0x30,
-0x30,0x06,0x03,0x55,0x04,0x03,0x13,0x29,0x53,0x74,0x61,0x72,0x66,0x69,0x65,0x6C,
-0x64,0x20,0x52,0x6F,0x6F,0x74,0x20,0x43,0x65,0x72,0x74,0x69,0x66,0x69,0x63,0x61,
-0x74,0x65,0x20,0x41,0x75,0x74,0x68,0x6F,0x72,0x69,0x74,0x79,0x20,0x2D,0x20,0x47,
-0x32,0x30,0x1E,0x17,0x0D,0x30,0x39,0x30,0x39,0x30,0x31,0x30,0x30,0x30,0x30,0x30,
-0x30,0x5A,0x17,0x0D,0x33,0x37,0x31,0x32,0x33,0x31,0x32,0x33,0x35,0x39,0x35,0x39,
-0x5A,0x30,0x81,0x8F,0x31,0x0B,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,
-0x53,0x31,0x10,0x30,0x0E,0x06,0x03,0x55,0x04,0x08,0x13,0x07,0x41,0x72,0x69,0x7A,
-0x6F,0x6E,0x61,0x31,0x13,0x30,0x11,0x06,0x03,0x55,0x04,0x07,0x13,0x0A,0x53,0x63,
-0x6F,0x74,0x74,0x73,0x64,0x61,0x6C,0x65,0x31,0x25,0x30,0x23,0x06,0x03,0x55,0x04,
-0x0A,0x13,0x1C,0x53,0x74,0x61,0x72,0x66,0x69,0x65,0x6C,0x64,0x20,0x54,0x65,0x63,
-0x68,0x6E,0x6F,0x6C,0x6F,0x67,0x69,0x65,0x73,0x2C,0x20,0x49,0x6E,0x63,0x2E,0x31,
-0x32,0x30,0x30,0x06,0x03,0x55,0x04,0x03,0x13,0x29,0x53,0x74,0x61,0x72,0x66,0x69,
-0x65,0x6C,0x64,0x20,0x52,0x6F,0x6F,0x74,0x20,0x43,0x65,0x72,0x74,0x69,0x66,0x69,
-0x63,0x61,0x74,0x65,0x20,0x41,0x75,0x74,0x68,0x6F,0x72,0x69,0x74,0x79,0x20,0x2D,
-0x20,0x47,0x32,0x30,0x82,0x01,0x22,0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,
-0x0D,0x01,0x01,0x01,0x05,0x00,0x03,0x82,0x01,0x0F,0x00,0x30,0x82,0x01,0x0A,0x02,
-0x82,0x01,0x01,0x00,0xBD,0xED,0xC1,0x03,0xFC,0xF6,0x8F,0xFC,0x02,0xB1,0x6F,0x5B,
-0x9F,0x48,0xD9,0x9D,0x79,0xE2,0xA2,0xB7,0x03,0x61,0x56,0x18,0xC3,0x47,0xB6,0xD7,
-0xCA,0x3D,0x35,0x2E,0x89,0x43,0xF7,0xA1,0x69,0x9B,0xDE,0x8A,0x1A,0xFD,0x13,0x20,
-0x9C,0xB4,0x49,0x77,0x32,0x29,0x56,0xFD,0xB9,0xEC,0x8C,0xDD,0x22,0xFA,0x72,0xDC,
-0x27,0x61,0x97,0xEE,0xF6,0x5A,0x84,0xEC,0x6E,0x19,0xB9,0x89,0x2C,0xDC,0x84,0x5B,
-0xD5,0x74,0xFB,0x6B,0x5F,0xC5,0x89,0xA5,0x10,0x52,0x89,0x46,0x55,0xF4,0xB8,0x75,
-0x1C,0xE6,0x7F,0xE4,0x54,0xAE,0x4B,0xF8,0x55,0x72,0x57,0x02,0x19,0xF8,0x17,0x71,
-0x59,0xEB,0x1E,0x28,0x07,0x74,0xC5,0x9D,0x48,0xBE,0x6C,0xB4,0xF4,0xA4,0xB0,0xF3,
-0x64,0x37,0x79,0x92,0xC0,0xEC,0x46,0x5E,0x7F,0xE1,0x6D,0x53,0x4C,0x62,0xAF,0xCD,
-0x1F,0x0B,0x63,0xBB,0x3A,0x9D,0xFB,0xFC,0x79,0x00,0x98,0x61,0x74,0xCF,0x26,0x82,
-0x40,0x63,0xF3,0xB2,0x72,0x6A,0x19,0x0D,0x99,0xCA,0xD4,0x0E,0x75,0xCC,0x37,0xFB,
-0x8B,0x89,0xC1,0x59,0xF1,0x62,0x7F,0x5F,0xB3,0x5F,0x65,0x30,0xF8,0xA7,0xB7,0x4D,
-0x76,0x5A,0x1E,0x76,0x5E,0x34,0xC0,0xE8,0x96,0x56,0x99,0x8A,0xB3,0xF0,0x7F,0xA4,
-0xCD,0xBD,0xDC,0x32,0x31,0x7C,0x91,0xCF,0xE0,0x5F,0x11,0xF8,0x6B,0xAA,0x49,0x5C,
-0xD1,0x99,0x94,0xD1,0xA2,0xE3,0x63,0x5B,0x09,0x76,0xB5,0x56,0x62,0xE1,0x4B,0x74,
-0x1D,0x96,0xD4,0x26,0xD4,0x08,0x04,0x59,0xD0,0x98,0x0E,0x0E,0xE6,0xDE,0xFC,0xC3,
-0xEC,0x1F,0x90,0xF1,0x02,0x03,0x01,0x00,0x01,0xA3,0x42,0x30,0x40,0x30,0x0F,0x06,
-0x03,0x55,0x1D,0x13,0x01,0x01,0xFF,0x04,0x05,0x30,0x03,0x01,0x01,0xFF,0x30,0x0E,
-0x06,0x03,0x55,0x1D,0x0F,0x01,0x01,0xFF,0x04,0x04,0x03,0x02,0x01,0x06,0x30,0x1D,
-0x06,0x03,0x55,0x1D,0x0E,0x04,0x16,0x04,0x14,0x7C,0x0C,0x32,0x1F,0xA7,0xD9,0x30,
-0x7F,0xC4,0x7D,0x68,0xA3,0x62,0xA8,0xA1,0xCE,0xAB,0x07,0x5B,0x27,0x30,0x0D,0x06,
-0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x0B,0x05,0x00,0x03,0x82,0x01,0x01,
-0x00,0x11,0x59,0xFA,0x25,0x4F,0x03,0x6F,0x94,0x99,0x3B,0x9A,0x1F,0x82,0x85,0x39,
-0xD4,0x76,0x05,0x94,0x5E,0xE1,0x28,0x93,0x6D,0x62,0x5D,0x09,0xC2,0xA0,0xA8,0xD4,
-0xB0,0x75,0x38,0xF1,0x34,0x6A,0x9D,0xE4,0x9F,0x8A,0x86,0x26,0x51,0xE6,0x2C,0xD1,
-0xC6,0x2D,0x6E,0x95,0x20,0x4A,0x92,0x01,0xEC,0xB8,0x8A,0x67,0x7B,0x31,0xE2,0x67,
-0x2E,0x8C,0x95,0x03,0x26,0x2E,0x43,0x9D,0x4A,0x31,0xF6,0x0E,0xB5,0x0C,0xBB,0xB7,
-0xE2,0x37,0x7F,0x22,0xBA,0x00,0xA3,0x0E,0x7B,0x52,0xFB,0x6B,0xBB,0x3B,0xC4,0xD3,
-0x79,0x51,0x4E,0xCD,0x90,0xF4,0x67,0x07,0x19,0xC8,0x3C,0x46,0x7A,0x0D,0x01,0x7D,
-0xC5,0x58,0xE7,0x6D,0xE6,0x85,0x30,0x17,0x9A,0x24,0xC4,0x10,0xE0,0x04,0xF7,0xE0,
-0xF2,0x7F,0xD4,0xAA,0x0A,0xFF,0x42,0x1D,0x37,0xED,0x94,0xE5,0x64,0x59,0x12,0x20,
-0x77,0x38,0xD3,0x32,0x3E,0x38,0x81,0x75,0x96,0x73,0xFA,0x68,0x8F,0xB1,0xCB,0xCE,
-0x1F,0xC5,0xEC,0xFA,0x9C,0x7E,0xCF,0x7E,0xB1,0xF1,0x07,0x2D,0xB6,0xFC,0xBF,0xCA,
-0xA4,0xBF,0xD0,0x97,0x05,0x4A,0xBC,0xEA,0x18,0x28,0x02,0x90,0xBD,0x54,0x78,0x09,
-0x21,0x71,0xD3,0xD1,0x7D,0x1D,0xD9,0x16,0xB0,0xA9,0x61,0x3D,0xD0,0x0A,0x00,0x22,
-0xFC,0xC7,0x7B,0xCB,0x09,0x64,0x45,0x0B,0x3B,0x40,0x81,0xF7,0x7D,0x7C,0x32,0xF5,
-0x98,0xCA,0x58,0x8E,0x7D,0x2A,0xEE,0x90,0x59,0x73,0x64,0xF9,0x36,0x74,0x5E,0x25,
-0xA1,0xF5,0x66,0x05,0x2E,0x7F,0x39,0x15,0xA9,0x2A,0xFB,0x50,0x8B,0x8E,0x85,0x69,
-0xF4,
-};
-
-
-/* subject:/C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert Global Root G3 */
-/* issuer :/C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert Global Root G3 */
-
-
-const unsigned char DigiCert_Global_Root_G3_certificate[579]={
-0x30,0x82,0x02,0x3F,0x30,0x82,0x01,0xC5,0xA0,0x03,0x02,0x01,0x02,0x02,0x10,0x05,
-0x55,0x56,0xBC,0xF2,0x5E,0xA4,0x35,0x35,0xC3,0xA4,0x0F,0xD5,0xAB,0x45,0x72,0x30,
-0x0A,0x06,0x08,0x2A,0x86,0x48,0xCE,0x3D,0x04,0x03,0x03,0x30,0x61,0x31,0x0B,0x30,
-0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x15,0x30,0x13,0x06,0x03,
-0x55,0x04,0x0A,0x13,0x0C,0x44,0x69,0x67,0x69,0x43,0x65,0x72,0x74,0x20,0x49,0x6E,
-0x63,0x31,0x19,0x30,0x17,0x06,0x03,0x55,0x04,0x0B,0x13,0x10,0x77,0x77,0x77,0x2E,
-0x64,0x69,0x67,0x69,0x63,0x65,0x72,0x74,0x2E,0x63,0x6F,0x6D,0x31,0x20,0x30,0x1E,
-0x06,0x03,0x55,0x04,0x03,0x13,0x17,0x44,0x69,0x67,0x69,0x43,0x65,0x72,0x74,0x20,
-0x47,0x6C,0x6F,0x62,0x61,0x6C,0x20,0x52,0x6F,0x6F,0x74,0x20,0x47,0x33,0x30,0x1E,
-0x17,0x0D,0x31,0x33,0x30,0x38,0x30,0x31,0x31,0x32,0x30,0x30,0x30,0x30,0x5A,0x17,
-0x0D,0x33,0x38,0x30,0x31,0x31,0x35,0x31,0x32,0x30,0x30,0x30,0x30,0x5A,0x30,0x61,
-0x31,0x0B,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x15,0x30,
-0x13,0x06,0x03,0x55,0x04,0x0A,0x13,0x0C,0x44,0x69,0x67,0x69,0x43,0x65,0x72,0x74,
-0x20,0x49,0x6E,0x63,0x31,0x19,0x30,0x17,0x06,0x03,0x55,0x04,0x0B,0x13,0x10,0x77,
-0x77,0x77,0x2E,0x64,0x69,0x67,0x69,0x63,0x65,0x72,0x74,0x2E,0x63,0x6F,0x6D,0x31,
-0x20,0x30,0x1E,0x06,0x03,0x55,0x04,0x03,0x13,0x17,0x44,0x69,0x67,0x69,0x43,0x65,
-0x72,0x74,0x20,0x47,0x6C,0x6F,0x62,0x61,0x6C,0x20,0x52,0x6F,0x6F,0x74,0x20,0x47,
-0x33,0x30,0x76,0x30,0x10,0x06,0x07,0x2A,0x86,0x48,0xCE,0x3D,0x02,0x01,0x06,0x05,
-0x2B,0x81,0x04,0x00,0x22,0x03,0x62,0x00,0x04,0xDD,0xA7,0xD9,0xBB,0x8A,0xB8,0x0B,
-0xFB,0x0B,0x7F,0x21,0xD2,0xF0,0xBE,0xBE,0x73,0xF3,0x33,0x5D,0x1A,0xBC,0x34,0xEA,
-0xDE,0xC6,0x9B,0xBC,0xD0,0x95,0xF6,0xF0,0xCC,0xD0,0x0B,0xBA,0x61,0x5B,0x51,0x46,
-0x7E,0x9E,0x2D,0x9F,0xEE,0x8E,0x63,0x0C,0x17,0xEC,0x07,0x70,0xF5,0xCF,0x84,0x2E,
-0x40,0x83,0x9C,0xE8,0x3F,0x41,0x6D,0x3B,0xAD,0xD3,0xA4,0x14,0x59,0x36,0x78,0x9D,
-0x03,0x43,0xEE,0x10,0x13,0x6C,0x72,0xDE,0xAE,0x88,0xA7,0xA1,0x6B,0xB5,0x43,0xCE,
-0x67,0xDC,0x23,0xFF,0x03,0x1C,0xA3,0xE2,0x3E,0xA3,0x42,0x30,0x40,0x30,0x0F,0x06,
-0x03,0x55,0x1D,0x13,0x01,0x01,0xFF,0x04,0x05,0x30,0x03,0x01,0x01,0xFF,0x30,0x0E,
-0x06,0x03,0x55,0x1D,0x0F,0x01,0x01,0xFF,0x04,0x04,0x03,0x02,0x01,0x86,0x30,0x1D,
-0x06,0x03,0x55,0x1D,0x0E,0x04,0x16,0x04,0x14,0xB3,0xDB,0x48,0xA4,0xF9,0xA1,0xC5,
-0xD8,0xAE,0x36,0x41,0xCC,0x11,0x63,0x69,0x62,0x29,0xBC,0x4B,0xC6,0x30,0x0A,0x06,
-0x08,0x2A,0x86,0x48,0xCE,0x3D,0x04,0x03,0x03,0x03,0x68,0x00,0x30,0x65,0x02,0x31,
-0x00,0xAD,0xBC,0xF2,0x6C,0x3F,0x12,0x4A,0xD1,0x2D,0x39,0xC3,0x0A,0x09,0x97,0x73,
-0xF4,0x88,0x36,0x8C,0x88,0x27,0xBB,0xE6,0x88,0x8D,0x50,0x85,0xA7,0x63,0xF9,0x9E,
-0x32,0xDE,0x66,0x93,0x0F,0xF1,0xCC,0xB1,0x09,0x8F,0xDD,0x6C,0xAB,0xFA,0x6B,0x7F,
-0xA0,0x02,0x30,0x39,0x66,0x5B,0xC2,0x64,0x8D,0xB8,0x9E,0x50,0xDC,0xA8,0xD5,0x49,
-0xA2,0xED,0xC7,0xDC,0xD1,0x49,0x7F,0x17,0x01,0xB8,0xC8,0x86,0x8F,0x4E,0x8C,0x88,
-0x2B,0xA8,0x9A,0xA9,0x8A,0xC5,0xD1,0x00,0xBD,0xF8,0x54,0xE2,0x9A,0xE5,0x5B,0x7C,
-0xB3,0x27,0x17,
-};
-
-
-/* subject:/C=US/O=thawte, Inc./OU=(c) 2007 thawte, Inc. - For authorized use only/CN=thawte Primary Root CA - G2 */
-/* issuer :/C=US/O=thawte, Inc./OU=(c) 2007 thawte, Inc. - For authorized use only/CN=thawte Primary Root CA - G2 */
-
-
-const unsigned char thawte_Primary_Root_CA___G2_certificate[652]={
-0x30,0x82,0x02,0x88,0x30,0x82,0x02,0x0D,0xA0,0x03,0x02,0x01,0x02,0x02,0x10,0x35,
-0xFC,0x26,0x5C,0xD9,0x84,0x4F,0xC9,0x3D,0x26,0x3D,0x57,0x9B,0xAE,0xD7,0x56,0x30,
-0x0A,0x06,0x08,0x2A,0x86,0x48,0xCE,0x3D,0x04,0x03,0x03,0x30,0x81,0x84,0x31,0x0B,
-0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x15,0x30,0x13,0x06,
-0x03,0x55,0x04,0x0A,0x13,0x0C,0x74,0x68,0x61,0x77,0x74,0x65,0x2C,0x20,0x49,0x6E,
-0x63,0x2E,0x31,0x38,0x30,0x36,0x06,0x03,0x55,0x04,0x0B,0x13,0x2F,0x28,0x63,0x29,
-0x20,0x32,0x30,0x30,0x37,0x20,0x74,0x68,0x61,0x77,0x74,0x65,0x2C,0x20,0x49,0x6E,
-0x63,0x2E,0x20,0x2D,0x20,0x46,0x6F,0x72,0x20,0x61,0x75,0x74,0x68,0x6F,0x72,0x69,
-0x7A,0x65,0x64,0x20,0x75,0x73,0x65,0x20,0x6F,0x6E,0x6C,0x79,0x31,0x24,0x30,0x22,
-0x06,0x03,0x55,0x04,0x03,0x13,0x1B,0x74,0x68,0x61,0x77,0x74,0x65,0x20,0x50,0x72,
-0x69,0x6D,0x61,0x72,0x79,0x20,0x52,0x6F,0x6F,0x74,0x20,0x43,0x41,0x20,0x2D,0x20,
-0x47,0x32,0x30,0x1E,0x17,0x0D,0x30,0x37,0x31,0x31,0x30,0x35,0x30,0x30,0x30,0x30,
-0x30,0x30,0x5A,0x17,0x0D,0x33,0x38,0x30,0x31,0x31,0x38,0x32,0x33,0x35,0x39,0x35,
-0x39,0x5A,0x30,0x81,0x84,0x31,0x0B,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,
-0x55,0x53,0x31,0x15,0x30,0x13,0x06,0x03,0x55,0x04,0x0A,0x13,0x0C,0x74,0x68,0x61,
-0x77,0x74,0x65,0x2C,0x20,0x49,0x6E,0x63,0x2E,0x31,0x38,0x30,0x36,0x06,0x03,0x55,
-0x04,0x0B,0x13,0x2F,0x28,0x63,0x29,0x20,0x32,0x30,0x30,0x37,0x20,0x74,0x68,0x61,
-0x77,0x74,0x65,0x2C,0x20,0x49,0x6E,0x63,0x2E,0x20,0x2D,0x20,0x46,0x6F,0x72,0x20,
-0x61,0x75,0x74,0x68,0x6F,0x72,0x69,0x7A,0x65,0x64,0x20,0x75,0x73,0x65,0x20,0x6F,
-0x6E,0x6C,0x79,0x31,0x24,0x30,0x22,0x06,0x03,0x55,0x04,0x03,0x13,0x1B,0x74,0x68,
-0x61,0x77,0x74,0x65,0x20,0x50,0x72,0x69,0x6D,0x61,0x72,0x79,0x20,0x52,0x6F,0x6F,
-0x74,0x20,0x43,0x41,0x20,0x2D,0x20,0x47,0x32,0x30,0x76,0x30,0x10,0x06,0x07,0x2A,
-0x86,0x48,0xCE,0x3D,0x02,0x01,0x06,0x05,0x2B,0x81,0x04,0x00,0x22,0x03,0x62,0x00,
-0x04,0xA2,0xD5,0x9C,0x82,0x7B,0x95,0x9D,0xF1,0x52,0x78,0x87,0xFE,0x8A,0x16,0xBF,
-0x05,0xE6,0xDF,0xA3,0x02,0x4F,0x0D,0x07,0xC6,0x00,0x51,0xBA,0x0C,0x02,0x52,0x2D,
-0x22,0xA4,0x42,0x39,0xC4,0xFE,0x8F,0xEA,0xC9,0xC1,0xBE,0xD4,0x4D,0xFF,0x9F,0x7A,
-0x9E,0xE2,0xB1,0x7C,0x9A,0xAD,0xA7,0x86,0x09,0x73,0x87,0xD1,0xE7,0x9A,0xE3,0x7A,
-0xA5,0xAA,0x6E,0xFB,0xBA,0xB3,0x70,0xC0,0x67,0x88,0xA2,0x35,0xD4,0xA3,0x9A,0xB1,
-0xFD,0xAD,0xC2,0xEF,0x31,0xFA,0xA8,0xB9,0xF3,0xFB,0x08,0xC6,0x91,0xD1,0xFB,0x29,
-0x95,0xA3,0x42,0x30,0x40,0x30,0x0F,0x06,0x03,0x55,0x1D,0x13,0x01,0x01,0xFF,0x04,
-0x05,0x30,0x03,0x01,0x01,0xFF,0x30,0x0E,0x06,0x03,0x55,0x1D,0x0F,0x01,0x01,0xFF,
-0x04,0x04,0x03,0x02,0x01,0x06,0x30,0x1D,0x06,0x03,0x55,0x1D,0x0E,0x04,0x16,0x04,
-0x14,0x9A,0xD8,0x00,0x30,0x00,0xE7,0x6B,0x7F,0x85,0x18,0xEE,0x8B,0xB6,0xCE,0x8A,
-0x0C,0xF8,0x11,0xE1,0xBB,0x30,0x0A,0x06,0x08,0x2A,0x86,0x48,0xCE,0x3D,0x04,0x03,
-0x03,0x03,0x69,0x00,0x30,0x66,0x02,0x31,0x00,0xDD,0xF8,0xE0,0x57,0x47,0x5B,0xA7,
-0xE6,0x0A,0xC3,0xBD,0xF5,0x80,0x8A,0x97,0x35,0x0D,0x1B,0x89,0x3C,0x54,0x86,0x77,
-0x28,0xCA,0xA1,0xF4,0x79,0xDE,0xB5,0xE6,0x38,0xB0,0xF0,0x65,0x70,0x8C,0x7F,0x02,
-0x54,0xC2,0xBF,0xFF,0xD8,0xA1,0x3E,0xD9,0xCF,0x02,0x31,0x00,0xC4,0x8D,0x94,0xFC,
-0xDC,0x53,0xD2,0xDC,0x9D,0x78,0x16,0x1F,0x15,0x33,0x23,0x53,0x52,0xE3,0x5A,0x31,
-0x5D,0x9D,0xCA,0xAE,0xBD,0x13,0x29,0x44,0x0D,0x27,0x5B,0xA8,0xE7,0x68,0x9C,0x12,
-0xF7,0x58,0x3F,0x2E,0x72,0x02,0x57,0xA3,0x8F,0xA1,0x14,0x2E,
-};
-
-
-/* subject:/C=US/O=VeriSign, Inc./OU=VeriSign Trust Network/OU=(c) 2008 VeriSign, Inc. - For authorized use only/CN=VeriSign Universal Root Certification Authority */
-/* issuer :/C=US/O=VeriSign, Inc./OU=VeriSign Trust Network/OU=(c) 2008 VeriSign, Inc. - For authorized use only/CN=VeriSign Universal Root Certification Authority */
-
-
-const unsigned char VeriSign_Universal_Root_Certification_Authority_certificate[1213]={
-0x30,0x82,0x04,0xB9,0x30,0x82,0x03,0xA1,0xA0,0x03,0x02,0x01,0x02,0x02,0x10,0x40,
-0x1A,0xC4,0x64,0x21,0xB3,0x13,0x21,0x03,0x0E,0xBB,0xE4,0x12,0x1A,0xC5,0x1D,0x30,
-0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x0B,0x05,0x00,0x30,0x81,
-0xBD,0x31,0x0B,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x17,
-0x30,0x15,0x06,0x03,0x55,0x04,0x0A,0x13,0x0E,0x56,0x65,0x72,0x69,0x53,0x69,0x67,
-0x6E,0x2C,0x20,0x49,0x6E,0x63,0x2E,0x31,0x1F,0x30,0x1D,0x06,0x03,0x55,0x04,0x0B,
-0x13,0x16,0x56,0x65,0x72,0x69,0x53,0x69,0x67,0x6E,0x20,0x54,0x72,0x75,0x73,0x74,
-0x20,0x4E,0x65,0x74,0x77,0x6F,0x72,0x6B,0x31,0x3A,0x30,0x38,0x06,0x03,0x55,0x04,
-0x0B,0x13,0x31,0x28,0x63,0x29,0x20,0x32,0x30,0x30,0x38,0x20,0x56,0x65,0x72,0x69,
-0x53,0x69,0x67,0x6E,0x2C,0x20,0x49,0x6E,0x63,0x2E,0x20,0x2D,0x20,0x46,0x6F,0x72,
-0x20,0x61,0x75,0x74,0x68,0x6F,0x72,0x69,0x7A,0x65,0x64,0x20,0x75,0x73,0x65,0x20,
-0x6F,0x6E,0x6C,0x79,0x31,0x38,0x30,0x36,0x06,0x03,0x55,0x04,0x03,0x13,0x2F,0x56,
-0x65,0x72,0x69,0x53,0x69,0x67,0x6E,0x20,0x55,0x6E,0x69,0x76,0x65,0x72,0x73,0x61,
-0x6C,0x20,0x52,0x6F,0x6F,0x74,0x20,0x43,0x65,0x72,0x74,0x69,0x66,0x69,0x63,0x61,
-0x74,0x69,0x6F,0x6E,0x20,0x41,0x75,0x74,0x68,0x6F,0x72,0x69,0x74,0x79,0x30,0x1E,
-0x17,0x0D,0x30,0x38,0x30,0x34,0x30,0x32,0x30,0x30,0x30,0x30,0x30,0x30,0x5A,0x17,
-0x0D,0x33,0x37,0x31,0x32,0x30,0x31,0x32,0x33,0x35,0x39,0x35,0x39,0x5A,0x30,0x81,
-0xBD,0x31,0x0B,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x17,
-0x30,0x15,0x06,0x03,0x55,0x04,0x0A,0x13,0x0E,0x56,0x65,0x72,0x69,0x53,0x69,0x67,
-0x6E,0x2C,0x20,0x49,0x6E,0x63,0x2E,0x31,0x1F,0x30,0x1D,0x06,0x03,0x55,0x04,0x0B,
-0x13,0x16,0x56,0x65,0x72,0x69,0x53,0x69,0x67,0x6E,0x20,0x54,0x72,0x75,0x73,0x74,
-0x20,0x4E,0x65,0x74,0x77,0x6F,0x72,0x6B,0x31,0x3A,0x30,0x38,0x06,0x03,0x55,0x04,
-0x0B,0x13,0x31,0x28,0x63,0x29,0x20,0x32,0x30,0x30,0x38,0x20,0x56,0x65,0x72,0x69,
-0x53,0x69,0x67,0x6E,0x2C,0x20,0x49,0x6E,0x63,0x2E,0x20,0x2D,0x20,0x46,0x6F,0x72,
-0x20,0x61,0x75,0x74,0x68,0x6F,0x72,0x69,0x7A,0x65,0x64,0x20,0x75,0x73,0x65,0x20,
-0x6F,0x6E,0x6C,0x79,0x31,0x38,0x30,0x36,0x06,0x03,0x55,0x04,0x03,0x13,0x2F,0x56,
-0x65,0x72,0x69,0x53,0x69,0x67,0x6E,0x20,0x55,0x6E,0x69,0x76,0x65,0x72,0x73,0x61,
-0x6C,0x20,0x52,0x6F,0x6F,0x74,0x20,0x43,0x65,0x72,0x74,0x69,0x66,0x69,0x63,0x61,
-0x74,0x69,0x6F,0x6E,0x20,0x41,0x75,0x74,0x68,0x6F,0x72,0x69,0x74,0x79,0x30,0x82,
-0x01,0x22,0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x01,0x05,
-0x00,0x03,0x82,0x01,0x0F,0x00,0x30,0x82,0x01,0x0A,0x02,0x82,0x01,0x01,0x00,0xC7,
-0x61,0x37,0x5E,0xB1,0x01,0x34,0xDB,0x62,0xD7,0x15,0x9B,0xFF,0x58,0x5A,0x8C,0x23,
-0x23,0xD6,0x60,0x8E,0x91,0xD7,0x90,0x98,0x83,0x7A,0xE6,0x58,0x19,0x38,0x8C,0xC5,
-0xF6,0xE5,0x64,0x85,0xB4,0xA2,0x71,0xFB,0xED,0xBD,0xB9,0xDA,0xCD,0x4D,0x00,0xB4,
-0xC8,0x2D,0x73,0xA5,0xC7,0x69,0x71,0x95,0x1F,0x39,0x3C,0xB2,0x44,0x07,0x9C,0xE8,
-0x0E,0xFA,0x4D,0x4A,0xC4,0x21,0xDF,0x29,0x61,0x8F,0x32,0x22,0x61,0x82,0xC5,0x87,
-0x1F,0x6E,0x8C,0x7C,0x5F,0x16,0x20,0x51,0x44,0xD1,0x70,0x4F,0x57,0xEA,0xE3,0x1C,
-0xE3,0xCC,0x79,0xEE,0x58,0xD8,0x0E,0xC2,0xB3,0x45,0x93,0xC0,0x2C,0xE7,0x9A,0x17,
-0x2B,0x7B,0x00,0x37,0x7A,0x41,0x33,0x78,0xE1,0x33,0xE2,0xF3,0x10,0x1A,0x7F,0x87,
-0x2C,0xBE,0xF6,0xF5,0xF7,0x42,0xE2,0xE5,0xBF,0x87,0x62,0x89,0x5F,0x00,0x4B,0xDF,
-0xC5,0xDD,0xE4,0x75,0x44,0x32,0x41,0x3A,0x1E,0x71,0x6E,0x69,0xCB,0x0B,0x75,0x46,
-0x08,0xD1,0xCA,0xD2,0x2B,0x95,0xD0,0xCF,0xFB,0xB9,0x40,0x6B,0x64,0x8C,0x57,0x4D,
-0xFC,0x13,0x11,0x79,0x84,0xED,0x5E,0x54,0xF6,0x34,0x9F,0x08,0x01,0xF3,0x10,0x25,
-0x06,0x17,0x4A,0xDA,0xF1,0x1D,0x7A,0x66,0x6B,0x98,0x60,0x66,0xA4,0xD9,0xEF,0xD2,
-0x2E,0x82,0xF1,0xF0,0xEF,0x09,0xEA,0x44,0xC9,0x15,0x6A,0xE2,0x03,0x6E,0x33,0xD3,
-0xAC,0x9F,0x55,0x00,0xC7,0xF6,0x08,0x6A,0x94,0xB9,0x5F,0xDC,0xE0,0x33,0xF1,0x84,
-0x60,0xF9,0x5B,0x27,0x11,0xB4,0xFC,0x16,0xF2,0xBB,0x56,0x6A,0x80,0x25,0x8D,0x02,
-0x03,0x01,0x00,0x01,0xA3,0x81,0xB2,0x30,0x81,0xAF,0x30,0x0F,0x06,0x03,0x55,0x1D,
-0x13,0x01,0x01,0xFF,0x04,0x05,0x30,0x03,0x01,0x01,0xFF,0x30,0x0E,0x06,0x03,0x55,
-0x1D,0x0F,0x01,0x01,0xFF,0x04,0x04,0x03,0x02,0x01,0x06,0x30,0x6D,0x06,0x08,0x2B,
-0x06,0x01,0x05,0x05,0x07,0x01,0x0C,0x04,0x61,0x30,0x5F,0xA1,0x5D,0xA0,0x5B,0x30,
-0x59,0x30,0x57,0x30,0x55,0x16,0x09,0x69,0x6D,0x61,0x67,0x65,0x2F,0x67,0x69,0x66,
-0x30,0x21,0x30,0x1F,0x30,0x07,0x06,0x05,0x2B,0x0E,0x03,0x02,0x1A,0x04,0x14,0x8F,
-0xE5,0xD3,0x1A,0x86,0xAC,0x8D,0x8E,0x6B,0xC3,0xCF,0x80,0x6A,0xD4,0x48,0x18,0x2C,
-0x7B,0x19,0x2E,0x30,0x25,0x16,0x23,0x68,0x74,0x74,0x70,0x3A,0x2F,0x2F,0x6C,0x6F,
-0x67,0x6F,0x2E,0x76,0x65,0x72,0x69,0x73,0x69,0x67,0x6E,0x2E,0x63,0x6F,0x6D,0x2F,
-0x76,0x73,0x6C,0x6F,0x67,0x6F,0x2E,0x67,0x69,0x66,0x30,0x1D,0x06,0x03,0x55,0x1D,
-0x0E,0x04,0x16,0x04,0x14,0xB6,0x77,0xFA,0x69,0x48,0x47,0x9F,0x53,0x12,0xD5,0xC2,
-0xEA,0x07,0x32,0x76,0x07,0xD1,0x97,0x07,0x19,0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,
-0x86,0xF7,0x0D,0x01,0x01,0x0B,0x05,0x00,0x03,0x82,0x01,0x01,0x00,0x4A,0xF8,0xF8,
-0xB0,0x03,0xE6,0x2C,0x67,0x7B,0xE4,0x94,0x77,0x63,0xCC,0x6E,0x4C,0xF9,0x7D,0x0E,
-0x0D,0xDC,0xC8,0xB9,0x35,0xB9,0x70,0x4F,0x63,0xFA,0x24,0xFA,0x6C,0x83,0x8C,0x47,
-0x9D,0x3B,0x63,0xF3,0x9A,0xF9,0x76,0x32,0x95,0x91,0xB1,0x77,0xBC,0xAC,0x9A,0xBE,
-0xB1,0xE4,0x31,0x21,0xC6,0x81,0x95,0x56,0x5A,0x0E,0xB1,0xC2,0xD4,0xB1,0xA6,0x59,
-0xAC,0xF1,0x63,0xCB,0xB8,0x4C,0x1D,0x59,0x90,0x4A,0xEF,0x90,0x16,0x28,0x1F,0x5A,
-0xAE,0x10,0xFB,0x81,0x50,0x38,0x0C,0x6C,0xCC,0xF1,0x3D,0xC3,0xF5,0x63,0xE3,0xB3,
-0xE3,0x21,0xC9,0x24,0x39,0xE9,0xFD,0x15,0x66,0x46,0xF4,0x1B,0x11,0xD0,0x4D,0x73,
-0xA3,0x7D,0x46,0xF9,0x3D,0xED,0xA8,0x5F,0x62,0xD4,0xF1,0x3F,0xF8,0xE0,0x74,0x57,
-0x2B,0x18,0x9D,0x81,0xB4,0xC4,0x28,0xDA,0x94,0x97,0xA5,0x70,0xEB,0xAC,0x1D,0xBE,
-0x07,0x11,0xF0,0xD5,0xDB,0xDD,0xE5,0x8C,0xF0,0xD5,0x32,0xB0,0x83,0xE6,0x57,0xE2,
-0x8F,0xBF,0xBE,0xA1,0xAA,0xBF,0x3D,0x1D,0xB5,0xD4,0x38,0xEA,0xD7,0xB0,0x5C,0x3A,
-0x4F,0x6A,0x3F,0x8F,0xC0,0x66,0x6C,0x63,0xAA,0xE9,0xD9,0xA4,0x16,0xF4,0x81,0xD1,
-0x95,0x14,0x0E,0x7D,0xCD,0x95,0x34,0xD9,0xD2,0x8F,0x70,0x73,0x81,0x7B,0x9C,0x7E,
-0xBD,0x98,0x61,0xD8,0x45,0x87,0x98,0x90,0xC5,0xEB,0x86,0x30,0xC6,0x35,0xBF,0xF0,
-0xFF,0xC3,0x55,0x88,0x83,0x4B,0xEF,0x05,0x92,0x06,0x71,0xF2,0xB8,0x98,0x93,0xB7,
-0xEC,0xCD,0x82,0x61,0xF1,0x38,0xE6,0x4F,0x97,0x98,0x2A,0x5A,0x8D,
-};
-
-
-/* subject:/C=US/O=VeriSign, Inc./OU=VeriSign Trust Network/OU=(c) 2007 VeriSign, Inc. - For authorized use only/CN=VeriSign Class 3 Public Primary Certification Authority - G4 */
-/* issuer :/C=US/O=VeriSign, Inc./OU=VeriSign Trust Network/OU=(c) 2007 VeriSign, Inc. - For authorized use only/CN=VeriSign Class 3 Public Primary Certification Authority - G4 */
-
-
-const unsigned char VeriSign_Class_3_Public_Primary_Certification_Authority___G4_certificate[904]={
-0x30,0x82,0x03,0x84,0x30,0x82,0x03,0x0A,0xA0,0x03,0x02,0x01,0x02,0x02,0x10,0x2F,
-0x80,0xFE,0x23,0x8C,0x0E,0x22,0x0F,0x48,0x67,0x12,0x28,0x91,0x87,0xAC,0xB3,0x30,
-0x0A,0x06,0x08,0x2A,0x86,0x48,0xCE,0x3D,0x04,0x03,0x03,0x30,0x81,0xCA,0x31,0x0B,
-0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x17,0x30,0x15,0x06,
-0x03,0x55,0x04,0x0A,0x13,0x0E,0x56,0x65,0x72,0x69,0x53,0x69,0x67,0x6E,0x2C,0x20,
-0x49,0x6E,0x63,0x2E,0x31,0x1F,0x30,0x1D,0x06,0x03,0x55,0x04,0x0B,0x13,0x16,0x56,
-0x65,0x72,0x69,0x53,0x69,0x67,0x6E,0x20,0x54,0x72,0x75,0x73,0x74,0x20,0x4E,0x65,
-0x74,0x77,0x6F,0x72,0x6B,0x31,0x3A,0x30,0x38,0x06,0x03,0x55,0x04,0x0B,0x13,0x31,
-0x28,0x63,0x29,0x20,0x32,0x30,0x30,0x37,0x20,0x56,0x65,0x72,0x69,0x53,0x69,0x67,
-0x6E,0x2C,0x20,0x49,0x6E,0x63,0x2E,0x20,0x2D,0x20,0x46,0x6F,0x72,0x20,0x61,0x75,
-0x74,0x68,0x6F,0x72,0x69,0x7A,0x65,0x64,0x20,0x75,0x73,0x65,0x20,0x6F,0x6E,0x6C,
-0x79,0x31,0x45,0x30,0x43,0x06,0x03,0x55,0x04,0x03,0x13,0x3C,0x56,0x65,0x72,0x69,
-0x53,0x69,0x67,0x6E,0x20,0x43,0x6C,0x61,0x73,0x73,0x20,0x33,0x20,0x50,0x75,0x62,
-0x6C,0x69,0x63,0x20,0x50,0x72,0x69,0x6D,0x61,0x72,0x79,0x20,0x43,0x65,0x72,0x74,
-0x69,0x66,0x69,0x63,0x61,0x74,0x69,0x6F,0x6E,0x20,0x41,0x75,0x74,0x68,0x6F,0x72,
-0x69,0x74,0x79,0x20,0x2D,0x20,0x47,0x34,0x30,0x1E,0x17,0x0D,0x30,0x37,0x31,0x31,
-0x30,0x35,0x30,0x30,0x30,0x30,0x30,0x30,0x5A,0x17,0x0D,0x33,0x38,0x30,0x31,0x31,
-0x38,0x32,0x33,0x35,0x39,0x35,0x39,0x5A,0x30,0x81,0xCA,0x31,0x0B,0x30,0x09,0x06,
-0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x17,0x30,0x15,0x06,0x03,0x55,0x04,
-0x0A,0x13,0x0E,0x56,0x65,0x72,0x69,0x53,0x69,0x67,0x6E,0x2C,0x20,0x49,0x6E,0x63,
-0x2E,0x31,0x1F,0x30,0x1D,0x06,0x03,0x55,0x04,0x0B,0x13,0x16,0x56,0x65,0x72,0x69,
-0x53,0x69,0x67,0x6E,0x20,0x54,0x72,0x75,0x73,0x74,0x20,0x4E,0x65,0x74,0x77,0x6F,
-0x72,0x6B,0x31,0x3A,0x30,0x38,0x06,0x03,0x55,0x04,0x0B,0x13,0x31,0x28,0x63,0x29,
-0x20,0x32,0x30,0x30,0x37,0x20,0x56,0x65,0x72,0x69,0x53,0x69,0x67,0x6E,0x2C,0x20,
-0x49,0x6E,0x63,0x2E,0x20,0x2D,0x20,0x46,0x6F,0x72,0x20,0x61,0x75,0x74,0x68,0x6F,
-0x72,0x69,0x7A,0x65,0x64,0x20,0x75,0x73,0x65,0x20,0x6F,0x6E,0x6C,0x79,0x31,0x45,
-0x30,0x43,0x06,0x03,0x55,0x04,0x03,0x13,0x3C,0x56,0x65,0x72,0x69,0x53,0x69,0x67,
-0x6E,0x20,0x43,0x6C,0x61,0x73,0x73,0x20,0x33,0x20,0x50,0x75,0x62,0x6C,0x69,0x63,
-0x20,0x50,0x72,0x69,0x6D,0x61,0x72,0x79,0x20,0x43,0x65,0x72,0x74,0x69,0x66,0x69,
-0x63,0x61,0x74,0x69,0x6F,0x6E,0x20,0x41,0x75,0x74,0x68,0x6F,0x72,0x69,0x74,0x79,
-0x20,0x2D,0x20,0x47,0x34,0x30,0x76,0x30,0x10,0x06,0x07,0x2A,0x86,0x48,0xCE,0x3D,
-0x02,0x01,0x06,0x05,0x2B,0x81,0x04,0x00,0x22,0x03,0x62,0x00,0x04,0xA7,0x56,0x7A,
-0x7C,0x52,0xDA,0x64,0x9B,0x0E,0x2D,0x5C,0xD8,0x5E,0xAC,0x92,0x3D,0xFE,0x01,0xE6,
-0x19,0x4A,0x3D,0x14,0x03,0x4B,0xFA,0x60,0x27,0x20,0xD9,0x83,0x89,0x69,0xFA,0x54,
-0xC6,0x9A,0x18,0x5E,0x55,0x2A,0x64,0xDE,0x06,0xF6,0x8D,0x4A,0x3B,0xAD,0x10,0x3C,
-0x65,0x3D,0x90,0x88,0x04,0x89,0xE0,0x30,0x61,0xB3,0xAE,0x5D,0x01,0xA7,0x7B,0xDE,
-0x7C,0xB2,0xBE,0xCA,0x65,0x61,0x00,0x86,0xAE,0xDA,0x8F,0x7B,0xD0,0x89,0xAD,0x4D,
-0x1D,0x59,0x9A,0x41,0xB1,0xBC,0x47,0x80,0xDC,0x9E,0x62,0xC3,0xF9,0xA3,0x81,0xB2,
-0x30,0x81,0xAF,0x30,0x0F,0x06,0x03,0x55,0x1D,0x13,0x01,0x01,0xFF,0x04,0x05,0x30,
-0x03,0x01,0x01,0xFF,0x30,0x0E,0x06,0x03,0x55,0x1D,0x0F,0x01,0x01,0xFF,0x04,0x04,
-0x03,0x02,0x01,0x06,0x30,0x6D,0x06,0x08,0x2B,0x06,0x01,0x05,0x05,0x07,0x01,0x0C,
-0x04,0x61,0x30,0x5F,0xA1,0x5D,0xA0,0x5B,0x30,0x59,0x30,0x57,0x30,0x55,0x16,0x09,
-0x69,0x6D,0x61,0x67,0x65,0x2F,0x67,0x69,0x66,0x30,0x21,0x30,0x1F,0x30,0x07,0x06,
-0x05,0x2B,0x0E,0x03,0x02,0x1A,0x04,0x14,0x8F,0xE5,0xD3,0x1A,0x86,0xAC,0x8D,0x8E,
-0x6B,0xC3,0xCF,0x80,0x6A,0xD4,0x48,0x18,0x2C,0x7B,0x19,0x2E,0x30,0x25,0x16,0x23,
-0x68,0x74,0x74,0x70,0x3A,0x2F,0x2F,0x6C,0x6F,0x67,0x6F,0x2E,0x76,0x65,0x72,0x69,
-0x73,0x69,0x67,0x6E,0x2E,0x63,0x6F,0x6D,0x2F,0x76,0x73,0x6C,0x6F,0x67,0x6F,0x2E,
-0x67,0x69,0x66,0x30,0x1D,0x06,0x03,0x55,0x1D,0x0E,0x04,0x16,0x04,0x14,0xB3,0x16,
-0x91,0xFD,0xEE,0xA6,0x6E,0xE4,0xB5,0x2E,0x49,0x8F,0x87,0x78,0x81,0x80,0xEC,0xE5,
-0xB1,0xB5,0x30,0x0A,0x06,0x08,0x2A,0x86,0x48,0xCE,0x3D,0x04,0x03,0x03,0x03,0x68,
-0x00,0x30,0x65,0x02,0x30,0x66,0x21,0x0C,0x18,0x26,0x60,0x5A,0x38,0x7B,0x56,0x42,
-0xE0,0xA7,0xFC,0x36,0x84,0x51,0x91,0x20,0x2C,0x76,0x4D,0x43,0x3D,0xC4,0x1D,0x84,
-0x23,0xD0,0xAC,0xD6,0x7C,0x35,0x06,0xCE,0xCD,0x69,0xBD,0x90,0x0D,0xDB,0x6C,0x48,
-0x42,0x1D,0x0E,0xAA,0x42,0x02,0x31,0x00,0x9C,0x3D,0x48,0x39,0x23,0x39,0x58,0x1A,
-0x15,0x12,0x59,0x6A,0x9E,0xEF,0xD5,0x59,0xB2,0x1D,0x52,0x2C,0x99,0x71,0xCD,0xC7,
-0x29,0xDF,0x1B,0x2A,0x61,0x7B,0x71,0xD1,0xDE,0xF3,0xC0,0xE5,0x0D,0x3A,0x4A,0xAA,
-0x2D,0xA7,0xD8,0x86,0x2A,0xDD,0x2E,0x10,
-};
-
-
-/* subject:/C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert Global Root G2 */
-/* issuer :/C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert Global Root G2 */
-
-
-const unsigned char DigiCert_Global_Root_G2_certificate[914]={
-0x30,0x82,0x03,0x8E,0x30,0x82,0x02,0x76,0xA0,0x03,0x02,0x01,0x02,0x02,0x10,0x03,
-0x3A,0xF1,0xE6,0xA7,0x11,0xA9,0xA0,0xBB,0x28,0x64,0xB1,0x1D,0x09,0xFA,0xE5,0x30,
-0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x0B,0x05,0x00,0x30,0x61,
-0x31,0x0B,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x15,0x30,
-0x13,0x06,0x03,0x55,0x04,0x0A,0x13,0x0C,0x44,0x69,0x67,0x69,0x43,0x65,0x72,0x74,
-0x20,0x49,0x6E,0x63,0x31,0x19,0x30,0x17,0x06,0x03,0x55,0x04,0x0B,0x13,0x10,0x77,
-0x77,0x77,0x2E,0x64,0x69,0x67,0x69,0x63,0x65,0x72,0x74,0x2E,0x63,0x6F,0x6D,0x31,
-0x20,0x30,0x1E,0x06,0x03,0x55,0x04,0x03,0x13,0x17,0x44,0x69,0x67,0x69,0x43,0x65,
-0x72,0x74,0x20,0x47,0x6C,0x6F,0x62,0x61,0x6C,0x20,0x52,0x6F,0x6F,0x74,0x20,0x47,
-0x32,0x30,0x1E,0x17,0x0D,0x31,0x33,0x30,0x38,0x30,0x31,0x31,0x32,0x30,0x30,0x30,
-0x30,0x5A,0x17,0x0D,0x33,0x38,0x30,0x31,0x31,0x35,0x31,0x32,0x30,0x30,0x30,0x30,
-0x5A,0x30,0x61,0x31,0x0B,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,
-0x31,0x15,0x30,0x13,0x06,0x03,0x55,0x04,0x0A,0x13,0x0C,0x44,0x69,0x67,0x69,0x43,
-0x65,0x72,0x74,0x20,0x49,0x6E,0x63,0x31,0x19,0x30,0x17,0x06,0x03,0x55,0x04,0x0B,
-0x13,0x10,0x77,0x77,0x77,0x2E,0x64,0x69,0x67,0x69,0x63,0x65,0x72,0x74,0x2E,0x63,
-0x6F,0x6D,0x31,0x20,0x30,0x1E,0x06,0x03,0x55,0x04,0x03,0x13,0x17,0x44,0x69,0x67,
-0x69,0x43,0x65,0x72,0x74,0x20,0x47,0x6C,0x6F,0x62,0x61,0x6C,0x20,0x52,0x6F,0x6F,
-0x74,0x20,0x47,0x32,0x30,0x82,0x01,0x22,0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,
-0xF7,0x0D,0x01,0x01,0x01,0x05,0x00,0x03,0x82,0x01,0x0F,0x00,0x30,0x82,0x01,0x0A,
-0x02,0x82,0x01,0x01,0x00,0xBB,0x37,0xCD,0x34,0xDC,0x7B,0x6B,0xC9,0xB2,0x68,0x90,
-0xAD,0x4A,0x75,0xFF,0x46,0xBA,0x21,0x0A,0x08,0x8D,0xF5,0x19,0x54,0xC9,0xFB,0x88,
-0xDB,0xF3,0xAE,0xF2,0x3A,0x89,0x91,0x3C,0x7A,0xE6,0xAB,0x06,0x1A,0x6B,0xCF,0xAC,
-0x2D,0xE8,0x5E,0x09,0x24,0x44,0xBA,0x62,0x9A,0x7E,0xD6,0xA3,0xA8,0x7E,0xE0,0x54,
-0x75,0x20,0x05,0xAC,0x50,0xB7,0x9C,0x63,0x1A,0x6C,0x30,0xDC,0xDA,0x1F,0x19,0xB1,
-0xD7,0x1E,0xDE,0xFD,0xD7,0xE0,0xCB,0x94,0x83,0x37,0xAE,0xEC,0x1F,0x43,0x4E,0xDD,
-0x7B,0x2C,0xD2,0xBD,0x2E,0xA5,0x2F,0xE4,0xA9,0xB8,0xAD,0x3A,0xD4,0x99,0xA4,0xB6,
-0x25,0xE9,0x9B,0x6B,0x00,0x60,0x92,0x60,0xFF,0x4F,0x21,0x49,0x18,0xF7,0x67,0x90,
-0xAB,0x61,0x06,0x9C,0x8F,0xF2,0xBA,0xE9,0xB4,0xE9,0x92,0x32,0x6B,0xB5,0xF3,0x57,
-0xE8,0x5D,0x1B,0xCD,0x8C,0x1D,0xAB,0x95,0x04,0x95,0x49,0xF3,0x35,0x2D,0x96,0xE3,
-0x49,0x6D,0xDD,0x77,0xE3,0xFB,0x49,0x4B,0xB4,0xAC,0x55,0x07,0xA9,0x8F,0x95,0xB3,
-0xB4,0x23,0xBB,0x4C,0x6D,0x45,0xF0,0xF6,0xA9,0xB2,0x95,0x30,0xB4,0xFD,0x4C,0x55,
-0x8C,0x27,0x4A,0x57,0x14,0x7C,0x82,0x9D,0xCD,0x73,0x92,0xD3,0x16,0x4A,0x06,0x0C,
-0x8C,0x50,0xD1,0x8F,0x1E,0x09,0xBE,0x17,0xA1,0xE6,0x21,0xCA,0xFD,0x83,0xE5,0x10,
-0xBC,0x83,0xA5,0x0A,0xC4,0x67,0x28,0xF6,0x73,0x14,0x14,0x3D,0x46,0x76,0xC3,0x87,
-0x14,0x89,0x21,0x34,0x4D,0xAF,0x0F,0x45,0x0C,0xA6,0x49,0xA1,0xBA,0xBB,0x9C,0xC5,
-0xB1,0x33,0x83,0x29,0x85,0x02,0x03,0x01,0x00,0x01,0xA3,0x42,0x30,0x40,0x30,0x0F,
-0x06,0x03,0x55,0x1D,0x13,0x01,0x01,0xFF,0x04,0x05,0x30,0x03,0x01,0x01,0xFF,0x30,
-0x0E,0x06,0x03,0x55,0x1D,0x0F,0x01,0x01,0xFF,0x04,0x04,0x03,0x02,0x01,0x86,0x30,
-0x1D,0x06,0x03,0x55,0x1D,0x0E,0x04,0x16,0x04,0x14,0x4E,0x22,0x54,0x20,0x18,0x95,
-0xE6,0xE3,0x6E,0xE6,0x0F,0xFA,0xFA,0xB9,0x12,0xED,0x06,0x17,0x8F,0x39,0x30,0x0D,
-0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x0B,0x05,0x00,0x03,0x82,0x01,
-0x01,0x00,0x60,0x67,0x28,0x94,0x6F,0x0E,0x48,0x63,0xEB,0x31,0xDD,0xEA,0x67,0x18,
-0xD5,0x89,0x7D,0x3C,0xC5,0x8B,0x4A,0x7F,0xE9,0xBE,0xDB,0x2B,0x17,0xDF,0xB0,0x5F,
-0x73,0x77,0x2A,0x32,0x13,0x39,0x81,0x67,0x42,0x84,0x23,0xF2,0x45,0x67,0x35,0xEC,
-0x88,0xBF,0xF8,0x8F,0xB0,0x61,0x0C,0x34,0xA4,0xAE,0x20,0x4C,0x84,0xC6,0xDB,0xF8,
-0x35,0xE1,0x76,0xD9,0xDF,0xA6,0x42,0xBB,0xC7,0x44,0x08,0x86,0x7F,0x36,0x74,0x24,
-0x5A,0xDA,0x6C,0x0D,0x14,0x59,0x35,0xBD,0xF2,0x49,0xDD,0xB6,0x1F,0xC9,0xB3,0x0D,
-0x47,0x2A,0x3D,0x99,0x2F,0xBB,0x5C,0xBB,0xB5,0xD4,0x20,0xE1,0x99,0x5F,0x53,0x46,
-0x15,0xDB,0x68,0x9B,0xF0,0xF3,0x30,0xD5,0x3E,0x31,0xE2,0x8D,0x84,0x9E,0xE3,0x8A,
-0xDA,0xDA,0x96,0x3E,0x35,0x13,0xA5,0x5F,0xF0,0xF9,0x70,0x50,0x70,0x47,0x41,0x11,
-0x57,0x19,0x4E,0xC0,0x8F,0xAE,0x06,0xC4,0x95,0x13,0x17,0x2F,0x1B,0x25,0x9F,0x75,
-0xF2,0xB1,0x8E,0x99,0xA1,0x6F,0x13,0xB1,0x41,0x71,0xFE,0x88,0x2A,0xC8,0x4F,0x10,
-0x20,0x55,0xD7,0xF3,0x14,0x45,0xE5,0xE0,0x44,0xF4,0xEA,0x87,0x95,0x32,0x93,0x0E,
-0xFE,0x53,0x46,0xFA,0x2C,0x9D,0xFF,0x8B,0x22,0xB9,0x4B,0xD9,0x09,0x45,0xA4,0xDE,
-0xA4,0xB8,0x9A,0x58,0xDD,0x1B,0x7D,0x52,0x9F,0x8E,0x59,0x43,0x88,0x81,0xA4,0x9E,
-0x26,0xD5,0x6F,0xAD,0xDD,0x0D,0xC6,0x37,0x7D,0xED,0x03,0x92,0x1B,0xE5,0x77,0x5F,
-0x76,0xEE,0x3C,0x8D,0xC4,0x5D,0x56,0x5B,0xA2,0xD9,0x66,0x6E,0xB3,0x35,0x37,0xE5,
-0x32,0xB6,
-};
-
-
-/* subject:/C=SE/O=AddTrust AB/OU=AddTrust TTP Network/CN=AddTrust Class 1 CA Root */
-/* issuer :/C=SE/O=AddTrust AB/OU=AddTrust TTP Network/CN=AddTrust Class 1 CA Root */
-
-
-const unsigned char AddTrust_Low_Value_Services_Root_certificate[1052]={
-0x30,0x82,0x04,0x18,0x30,0x82,0x03,0x00,0xA0,0x03,0x02,0x01,0x02,0x02,0x01,0x01,
-0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x05,0x05,0x00,0x30,
-0x65,0x31,0x0B,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x53,0x45,0x31,0x14,
-0x30,0x12,0x06,0x03,0x55,0x04,0x0A,0x13,0x0B,0x41,0x64,0x64,0x54,0x72,0x75,0x73,
-0x74,0x20,0x41,0x42,0x31,0x1D,0x30,0x1B,0x06,0x03,0x55,0x04,0x0B,0x13,0x14,0x41,
-0x64,0x64,0x54,0x72,0x75,0x73,0x74,0x20,0x54,0x54,0x50,0x20,0x4E,0x65,0x74,0x77,
-0x6F,0x72,0x6B,0x31,0x21,0x30,0x1F,0x06,0x03,0x55,0x04,0x03,0x13,0x18,0x41,0x64,
-0x64,0x54,0x72,0x75,0x73,0x74,0x20,0x43,0x6C,0x61,0x73,0x73,0x20,0x31,0x20,0x43,
-0x41,0x20,0x52,0x6F,0x6F,0x74,0x30,0x1E,0x17,0x0D,0x30,0x30,0x30,0x35,0x33,0x30,
-0x31,0x30,0x33,0x38,0x33,0x31,0x5A,0x17,0x0D,0x32,0x30,0x30,0x35,0x33,0x30,0x31,
-0x30,0x33,0x38,0x33,0x31,0x5A,0x30,0x65,0x31,0x0B,0x30,0x09,0x06,0x03,0x55,0x04,
-0x06,0x13,0x02,0x53,0x45,0x31,0x14,0x30,0x12,0x06,0x03,0x55,0x04,0x0A,0x13,0x0B,
-0x41,0x64,0x64,0x54,0x72,0x75,0x73,0x74,0x20,0x41,0x42,0x31,0x1D,0x30,0x1B,0x06,
-0x03,0x55,0x04,0x0B,0x13,0x14,0x41,0x64,0x64,0x54,0x72,0x75,0x73,0x74,0x20,0x54,
-0x54,0x50,0x20,0x4E,0x65,0x74,0x77,0x6F,0x72,0x6B,0x31,0x21,0x30,0x1F,0x06,0x03,
-0x55,0x04,0x03,0x13,0x18,0x41,0x64,0x64,0x54,0x72,0x75,0x73,0x74,0x20,0x43,0x6C,
-0x61,0x73,0x73,0x20,0x31,0x20,0x43,0x41,0x20,0x52,0x6F,0x6F,0x74,0x30,0x82,0x01,
-0x22,0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x01,0x05,0x00,
-0x03,0x82,0x01,0x0F,0x00,0x30,0x82,0x01,0x0A,0x02,0x82,0x01,0x01,0x00,0x96,0x96,
-0xD4,0x21,0x49,0x60,0xE2,0x6B,0xE8,0x41,0x07,0x0C,0xDE,0xC4,0xE0,0xDC,0x13,0x23,
-0xCD,0xC1,0x35,0xC7,0xFB,0xD6,0x4E,0x11,0x0A,0x67,0x5E,0xF5,0x06,0x5B,0x6B,0xA5,
-0x08,0x3B,0x5B,0x29,0x16,0x3A,0xE7,0x87,0xB2,0x34,0x06,0xC5,0xBC,0x05,0xA5,0x03,
-0x7C,0x82,0xCB,0x29,0x10,0xAE,0xE1,0x88,0x81,0xBD,0xD6,0x9E,0xD3,0xFE,0x2D,0x56,
-0xC1,0x15,0xCE,0xE3,0x26,0x9D,0x15,0x2E,0x10,0xFB,0x06,0x8F,0x30,0x04,0xDE,0xA7,
-0xB4,0x63,0xB4,0xFF,0xB1,0x9C,0xAE,0x3C,0xAF,0x77,0xB6,0x56,0xC5,0xB5,0xAB,0xA2,
-0xE9,0x69,0x3A,0x3D,0x0E,0x33,0x79,0x32,0x3F,0x70,0x82,0x92,0x99,0x61,0x6D,0x8D,
-0x30,0x08,0x8F,0x71,0x3F,0xA6,0x48,0x57,0x19,0xF8,0x25,0xDC,0x4B,0x66,0x5C,0xA5,
-0x74,0x8F,0x98,0xAE,0xC8,0xF9,0xC0,0x06,0x22,0xE7,0xAC,0x73,0xDF,0xA5,0x2E,0xFB,
-0x52,0xDC,0xB1,0x15,0x65,0x20,0xFA,0x35,0x66,0x69,0xDE,0xDF,0x2C,0xF1,0x6E,0xBC,
-0x30,0xDB,0x2C,0x24,0x12,0xDB,0xEB,0x35,0x35,0x68,0x90,0xCB,0x00,0xB0,0x97,0x21,
-0x3D,0x74,0x21,0x23,0x65,0x34,0x2B,0xBB,0x78,0x59,0xA3,0xD6,0xE1,0x76,0x39,0x9A,
-0xA4,0x49,0x8E,0x8C,0x74,0xAF,0x6E,0xA4,0x9A,0xA3,0xD9,0x9B,0xD2,0x38,0x5C,0x9B,
-0xA2,0x18,0xCC,0x75,0x23,0x84,0xBE,0xEB,0xE2,0x4D,0x33,0x71,0x8E,0x1A,0xF0,0xC2,
-0xF8,0xC7,0x1D,0xA2,0xAD,0x03,0x97,0x2C,0xF8,0xCF,0x25,0xC6,0xF6,0xB8,0x24,0x31,
-0xB1,0x63,0x5D,0x92,0x7F,0x63,0xF0,0x25,0xC9,0x53,0x2E,0x1F,0xBF,0x4D,0x02,0x03,
-0x01,0x00,0x01,0xA3,0x81,0xD2,0x30,0x81,0xCF,0x30,0x1D,0x06,0x03,0x55,0x1D,0x0E,
-0x04,0x16,0x04,0x14,0x95,0xB1,0xB4,0xF0,0x94,0xB6,0xBD,0xC7,0xDA,0xD1,0x11,0x09,
-0x21,0xBE,0xC1,0xAF,0x49,0xFD,0x10,0x7B,0x30,0x0B,0x06,0x03,0x55,0x1D,0x0F,0x04,
-0x04,0x03,0x02,0x01,0x06,0x30,0x0F,0x06,0x03,0x55,0x1D,0x13,0x01,0x01,0xFF,0x04,
-0x05,0x30,0x03,0x01,0x01,0xFF,0x30,0x81,0x8F,0x06,0x03,0x55,0x1D,0x23,0x04,0x81,
-0x87,0x30,0x81,0x84,0x80,0x14,0x95,0xB1,0xB4,0xF0,0x94,0xB6,0xBD,0xC7,0xDA,0xD1,
-0x11,0x09,0x21,0xBE,0xC1,0xAF,0x49,0xFD,0x10,0x7B,0xA1,0x69,0xA4,0x67,0x30,0x65,
-0x31,0x0B,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x53,0x45,0x31,0x14,0x30,
-0x12,0x06,0x03,0x55,0x04,0x0A,0x13,0x0B,0x41,0x64,0x64,0x54,0x72,0x75,0x73,0x74,
-0x20,0x41,0x42,0x31,0x1D,0x30,0x1B,0x06,0x03,0x55,0x04,0x0B,0x13,0x14,0x41,0x64,
-0x64,0x54,0x72,0x75,0x73,0x74,0x20,0x54,0x54,0x50,0x20,0x4E,0x65,0x74,0x77,0x6F,
-0x72,0x6B,0x31,0x21,0x30,0x1F,0x06,0x03,0x55,0x04,0x03,0x13,0x18,0x41,0x64,0x64,
-0x54,0x72,0x75,0x73,0x74,0x20,0x43,0x6C,0x61,0x73,0x73,0x20,0x31,0x20,0x43,0x41,
-0x20,0x52,0x6F,0x6F,0x74,0x82,0x01,0x01,0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,
-0xF7,0x0D,0x01,0x01,0x05,0x05,0x00,0x03,0x82,0x01,0x01,0x00,0x2C,0x6D,0x64,0x1B,
-0x1F,0xCD,0x0D,0xDD,0xB9,0x01,0xFA,0x96,0x63,0x34,0x32,0x48,0x47,0x99,0xAE,0x97,
-0xED,0xFD,0x72,0x16,0xA6,0x73,0x47,0x5A,0xF4,0xEB,0xDD,0xE9,0xF5,0xD6,0xFB,0x45,
-0xCC,0x29,0x89,0x44,0x5D,0xBF,0x46,0x39,0x3D,0xE8,0xEE,0xBC,0x4D,0x54,0x86,0x1E,
-0x1D,0x6C,0xE3,0x17,0x27,0x43,0xE1,0x89,0x56,0x2B,0xA9,0x6F,0x72,0x4E,0x49,0x33,
-0xE3,0x72,0x7C,0x2A,0x23,0x9A,0xBC,0x3E,0xFF,0x28,0x2A,0xED,0xA3,0xFF,0x1C,0x23,
-0xBA,0x43,0x57,0x09,0x67,0x4D,0x4B,0x62,0x06,0x2D,0xF8,0xFF,0x6C,0x9D,0x60,0x1E,
-0xD8,0x1C,0x4B,0x7D,0xB5,0x31,0x2F,0xD9,0xD0,0x7C,0x5D,0xF8,0xDE,0x6B,0x83,0x18,
-0x78,0x37,0x57,0x2F,0xE8,0x33,0x07,0x67,0xDF,0x1E,0xC7,0x6B,0x2A,0x95,0x76,0xAE,
-0x8F,0x57,0xA3,0xF0,0xF4,0x52,0xB4,0xA9,0x53,0x08,0xCF,0xE0,0x4F,0xD3,0x7A,0x53,
-0x8B,0xFD,0xBB,0x1C,0x56,0x36,0xF2,0xFE,0xB2,0xB6,0xE5,0x76,0xBB,0xD5,0x22,0x65,
-0xA7,0x3F,0xFE,0xD1,0x66,0xAD,0x0B,0xBC,0x6B,0x99,0x86,0xEF,0x3F,0x7D,0xF3,0x18,
-0x32,0xCA,0x7B,0xC6,0xE3,0xAB,0x64,0x46,0x95,0xF8,0x26,0x69,0xD9,0x55,0x83,0x7B,
-0x2C,0x96,0x07,0xFF,0x59,0x2C,0x44,0xA3,0xC6,0xE5,0xE9,0xA9,0xDC,0xA1,0x63,0x80,
-0x5A,0x21,0x5E,0x21,0xCF,0x53,0x54,0xF0,0xBA,0x6F,0x89,0xDB,0xA8,0xAA,0x95,0xCF,
-0x8B,0xE3,0x71,0xCC,0x1E,0x1B,0x20,0x44,0x08,0xC0,0x7A,0xB6,0x40,0xFD,0xC4,0xE4,
-0x35,0xE1,0x1D,0x16,0x1C,0xD0,0xBC,0x2B,0x8E,0xD6,0x71,0xD9,
-};
-
-
-/* subject:/C=US/O=AffirmTrust/CN=AffirmTrust Premium ECC */
-/* issuer :/C=US/O=AffirmTrust/CN=AffirmTrust Premium ECC */
-
-
-const unsigned char AffirmTrust_Premium_ECC_certificate[514]={
-0x30,0x82,0x01,0xFE,0x30,0x82,0x01,0x85,0xA0,0x03,0x02,0x01,0x02,0x02,0x08,0x74,
-0x97,0x25,0x8A,0xC7,0x3F,0x7A,0x54,0x30,0x0A,0x06,0x08,0x2A,0x86,0x48,0xCE,0x3D,
-0x04,0x03,0x03,0x30,0x45,0x31,0x0B,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,
-0x55,0x53,0x31,0x14,0x30,0x12,0x06,0x03,0x55,0x04,0x0A,0x0C,0x0B,0x41,0x66,0x66,
-0x69,0x72,0x6D,0x54,0x72,0x75,0x73,0x74,0x31,0x20,0x30,0x1E,0x06,0x03,0x55,0x04,
-0x03,0x0C,0x17,0x41,0x66,0x66,0x69,0x72,0x6D,0x54,0x72,0x75,0x73,0x74,0x20,0x50,
-0x72,0x65,0x6D,0x69,0x75,0x6D,0x20,0x45,0x43,0x43,0x30,0x1E,0x17,0x0D,0x31,0x30,
-0x30,0x31,0x32,0x39,0x31,0x34,0x32,0x30,0x32,0x34,0x5A,0x17,0x0D,0x34,0x30,0x31,
-0x32,0x33,0x31,0x31,0x34,0x32,0x30,0x32,0x34,0x5A,0x30,0x45,0x31,0x0B,0x30,0x09,
-0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x14,0x30,0x12,0x06,0x03,0x55,
-0x04,0x0A,0x0C,0x0B,0x41,0x66,0x66,0x69,0x72,0x6D,0x54,0x72,0x75,0x73,0x74,0x31,
-0x20,0x30,0x1E,0x06,0x03,0x55,0x04,0x03,0x0C,0x17,0x41,0x66,0x66,0x69,0x72,0x6D,
-0x54,0x72,0x75,0x73,0x74,0x20,0x50,0x72,0x65,0x6D,0x69,0x75,0x6D,0x20,0x45,0x43,
-0x43,0x30,0x76,0x30,0x10,0x06,0x07,0x2A,0x86,0x48,0xCE,0x3D,0x02,0x01,0x06,0x05,
-0x2B,0x81,0x04,0x00,0x22,0x03,0x62,0x00,0x04,0x0D,0x30,0x5E,0x1B,0x15,0x9D,0x03,
-0xD0,0xA1,0x79,0x35,0xB7,0x3A,0x3C,0x92,0x7A,0xCA,0x15,0x1C,0xCD,0x62,0xF3,0x9C,
-0x26,0x5C,0x07,0x3D,0xE5,0x54,0xFA,0xA3,0xD6,0xCC,0x12,0xEA,0xF4,0x14,0x5F,0xE8,
-0x8E,0x19,0xAB,0x2F,0x2E,0x48,0xE6,0xAC,0x18,0x43,0x78,0xAC,0xD0,0x37,0xC3,0xBD,
-0xB2,0xCD,0x2C,0xE6,0x47,0xE2,0x1A,0xE6,0x63,0xB8,0x3D,0x2E,0x2F,0x78,0xC4,0x4F,
-0xDB,0xF4,0x0F,0xA4,0x68,0x4C,0x55,0x72,0x6B,0x95,0x1D,0x4E,0x18,0x42,0x95,0x78,
-0xCC,0x37,0x3C,0x91,0xE2,0x9B,0x65,0x2B,0x29,0xA3,0x42,0x30,0x40,0x30,0x1D,0x06,
-0x03,0x55,0x1D,0x0E,0x04,0x16,0x04,0x14,0x9A,0xAF,0x29,0x7A,0xC0,0x11,0x35,0x35,
-0x26,0x51,0x30,0x00,0xC3,0x6A,0xFE,0x40,0xD5,0xAE,0xD6,0x3C,0x30,0x0F,0x06,0x03,
-0x55,0x1D,0x13,0x01,0x01,0xFF,0x04,0x05,0x30,0x03,0x01,0x01,0xFF,0x30,0x0E,0x06,
-0x03,0x55,0x1D,0x0F,0x01,0x01,0xFF,0x04,0x04,0x03,0x02,0x01,0x06,0x30,0x0A,0x06,
-0x08,0x2A,0x86,0x48,0xCE,0x3D,0x04,0x03,0x03,0x03,0x67,0x00,0x30,0x64,0x02,0x30,
-0x17,0x09,0xF3,0x87,0x88,0x50,0x5A,0xAF,0xC8,0xC0,0x42,0xBF,0x47,0x5F,0xF5,0x6C,
-0x6A,0x86,0xE0,0xC4,0x27,0x74,0xE4,0x38,0x53,0xD7,0x05,0x7F,0x1B,0x34,0xE3,0xC6,
-0x2F,0xB3,0xCA,0x09,0x3C,0x37,0x9D,0xD7,0xE7,0xB8,0x46,0xF1,0xFD,0xA1,0xE2,0x71,
-0x02,0x30,0x42,0x59,0x87,0x43,0xD4,0x51,0xDF,0xBA,0xD3,0x09,0x32,0x5A,0xCE,0x88,
-0x7E,0x57,0x3D,0x9C,0x5F,0x42,0x6B,0xF5,0x07,0x2D,0xB5,0xF0,0x82,0x93,0xF9,0x59,
-0x6F,0xAE,0x64,0xFA,0x58,0xE5,0x8B,0x1E,0xE3,0x63,0xBE,0xB5,0x81,0xCD,0x6F,0x02,
-0x8C,0x79,
-};
-
-
-/* subject:/C=US/O=VeriSign, Inc./OU=VeriSign Trust Network/OU=(c) 1999 VeriSign, Inc. - For authorized use only/CN=VeriSign Class 4 Public Primary Certification Authority - G3 */
-/* issuer :/C=US/O=VeriSign, Inc./OU=VeriSign Trust Network/OU=(c) 1999 VeriSign, Inc. - For authorized use only/CN=VeriSign Class 4 Public Primary Certification Authority - G3 */
-
-
-const unsigned char Verisign_Class_4_Public_Primary_Certification_Authority___G3_certificate[1054]={
-0x30,0x82,0x04,0x1A,0x30,0x82,0x03,0x02,0x02,0x11,0x00,0xEC,0xA0,0xA7,0x8B,0x6E,
-0x75,0x6A,0x01,0xCF,0xC4,0x7C,0xCC,0x2F,0x94,0x5E,0xD7,0x30,0x0D,0x06,0x09,0x2A,
-0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x05,0x05,0x00,0x30,0x81,0xCA,0x31,0x0B,0x30,
-0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x17,0x30,0x15,0x06,0x03,
-0x55,0x04,0x0A,0x13,0x0E,0x56,0x65,0x72,0x69,0x53,0x69,0x67,0x6E,0x2C,0x20,0x49,
-0x6E,0x63,0x2E,0x31,0x1F,0x30,0x1D,0x06,0x03,0x55,0x04,0x0B,0x13,0x16,0x56,0x65,
-0x72,0x69,0x53,0x69,0x67,0x6E,0x20,0x54,0x72,0x75,0x73,0x74,0x20,0x4E,0x65,0x74,
-0x77,0x6F,0x72,0x6B,0x31,0x3A,0x30,0x38,0x06,0x03,0x55,0x04,0x0B,0x13,0x31,0x28,
-0x63,0x29,0x20,0x31,0x39,0x39,0x39,0x20,0x56,0x65,0x72,0x69,0x53,0x69,0x67,0x6E,
-0x2C,0x20,0x49,0x6E,0x63,0x2E,0x20,0x2D,0x20,0x46,0x6F,0x72,0x20,0x61,0x75,0x74,
-0x68,0x6F,0x72,0x69,0x7A,0x65,0x64,0x20,0x75,0x73,0x65,0x20,0x6F,0x6E,0x6C,0x79,
-0x31,0x45,0x30,0x43,0x06,0x03,0x55,0x04,0x03,0x13,0x3C,0x56,0x65,0x72,0x69,0x53,
-0x69,0x67,0x6E,0x20,0x43,0x6C,0x61,0x73,0x73,0x20,0x34,0x20,0x50,0x75,0x62,0x6C,
-0x69,0x63,0x20,0x50,0x72,0x69,0x6D,0x61,0x72,0x79,0x20,0x43,0x65,0x72,0x74,0x69,
-0x66,0x69,0x63,0x61,0x74,0x69,0x6F,0x6E,0x20,0x41,0x75,0x74,0x68,0x6F,0x72,0x69,
-0x74,0x79,0x20,0x2D,0x20,0x47,0x33,0x30,0x1E,0x17,0x0D,0x39,0x39,0x31,0x30,0x30,
-0x31,0x30,0x30,0x30,0x30,0x30,0x30,0x5A,0x17,0x0D,0x33,0x36,0x30,0x37,0x31,0x36,
-0x32,0x33,0x35,0x39,0x35,0x39,0x5A,0x30,0x81,0xCA,0x31,0x0B,0x30,0x09,0x06,0x03,
-0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x17,0x30,0x15,0x06,0x03,0x55,0x04,0x0A,
-0x13,0x0E,0x56,0x65,0x72,0x69,0x53,0x69,0x67,0x6E,0x2C,0x20,0x49,0x6E,0x63,0x2E,
-0x31,0x1F,0x30,0x1D,0x06,0x03,0x55,0x04,0x0B,0x13,0x16,0x56,0x65,0x72,0x69,0x53,
-0x69,0x67,0x6E,0x20,0x54,0x72,0x75,0x73,0x74,0x20,0x4E,0x65,0x74,0x77,0x6F,0x72,
-0x6B,0x31,0x3A,0x30,0x38,0x06,0x03,0x55,0x04,0x0B,0x13,0x31,0x28,0x63,0x29,0x20,
-0x31,0x39,0x39,0x39,0x20,0x56,0x65,0x72,0x69,0x53,0x69,0x67,0x6E,0x2C,0x20,0x49,
-0x6E,0x63,0x2E,0x20,0x2D,0x20,0x46,0x6F,0x72,0x20,0x61,0x75,0x74,0x68,0x6F,0x72,
-0x69,0x7A,0x65,0x64,0x20,0x75,0x73,0x65,0x20,0x6F,0x6E,0x6C,0x79,0x31,0x45,0x30,
-0x43,0x06,0x03,0x55,0x04,0x03,0x13,0x3C,0x56,0x65,0x72,0x69,0x53,0x69,0x67,0x6E,
-0x20,0x43,0x6C,0x61,0x73,0x73,0x20,0x34,0x20,0x50,0x75,0x62,0x6C,0x69,0x63,0x20,
-0x50,0x72,0x69,0x6D,0x61,0x72,0x79,0x20,0x43,0x65,0x72,0x74,0x69,0x66,0x69,0x63,
-0x61,0x74,0x69,0x6F,0x6E,0x20,0x41,0x75,0x74,0x68,0x6F,0x72,0x69,0x74,0x79,0x20,
-0x2D,0x20,0x47,0x33,0x30,0x82,0x01,0x22,0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,
-0xF7,0x0D,0x01,0x01,0x01,0x05,0x00,0x03,0x82,0x01,0x0F,0x00,0x30,0x82,0x01,0x0A,
-0x02,0x82,0x01,0x01,0x00,0xAD,0xCB,0xA5,0x11,0x69,0xC6,0x59,0xAB,0xF1,0x8F,0xB5,
-0x19,0x0F,0x56,0xCE,0xCC,0xB5,0x1F,0x20,0xE4,0x9E,0x26,0x25,0x4B,0xE0,0x73,0x65,
-0x89,0x59,0xDE,0xD0,0x83,0xE4,0xF5,0x0F,0xB5,0xBB,0xAD,0xF1,0x7C,0xE8,0x21,0xFC,
-0xE4,0xE8,0x0C,0xEE,0x7C,0x45,0x22,0x19,0x76,0x92,0xB4,0x13,0xB7,0x20,0x5B,0x09,
-0xFA,0x61,0xAE,0xA8,0xF2,0xA5,0x8D,0x85,0xC2,0x2A,0xD6,0xDE,0x66,0x36,0xD2,0x9B,
-0x02,0xF4,0xA8,0x92,0x60,0x7C,0x9C,0x69,0xB4,0x8F,0x24,0x1E,0xD0,0x86,0x52,0xF6,
-0x32,0x9C,0x41,0x58,0x1E,0x22,0xBD,0xCD,0x45,0x62,0x95,0x08,0x6E,0xD0,0x66,0xDD,
-0x53,0xA2,0xCC,0xF0,0x10,0xDC,0x54,0x73,0x8B,0x04,0xA1,0x46,0x33,0x33,0x5C,0x17,
-0x40,0xB9,0x9E,0x4D,0xD3,0xF3,0xBE,0x55,0x83,0xE8,0xB1,0x89,0x8E,0x5A,0x7C,0x9A,
-0x96,0x22,0x90,0x3B,0x88,0x25,0xF2,0xD2,0x53,0x88,0x02,0x0C,0x0B,0x78,0xF2,0xE6,
-0x37,0x17,0x4B,0x30,0x46,0x07,0xE4,0x80,0x6D,0xA6,0xD8,0x96,0x2E,0xE8,0x2C,0xF8,
-0x11,0xB3,0x38,0x0D,0x66,0xA6,0x9B,0xEA,0xC9,0x23,0x5B,0xDB,0x8E,0xE2,0xF3,0x13,
-0x8E,0x1A,0x59,0x2D,0xAA,0x02,0xF0,0xEC,0xA4,0x87,0x66,0xDC,0xC1,0x3F,0xF5,0xD8,
-0xB9,0xF4,0xEC,0x82,0xC6,0xD2,0x3D,0x95,0x1D,0xE5,0xC0,0x4F,0x84,0xC9,0xD9,0xA3,
-0x44,0x28,0x06,0x6A,0xD7,0x45,0xAC,0xF0,0x6B,0x6A,0xEF,0x4E,0x5F,0xF8,0x11,0x82,
-0x1E,0x38,0x63,0x34,0x66,0x50,0xD4,0x3E,0x93,0x73,0xFA,0x30,0xC3,0x66,0xAD,0xFF,
-0x93,0x2D,0x97,0xEF,0x03,0x02,0x03,0x01,0x00,0x01,0x30,0x0D,0x06,0x09,0x2A,0x86,
-0x48,0x86,0xF7,0x0D,0x01,0x01,0x05,0x05,0x00,0x03,0x82,0x01,0x01,0x00,0x8F,0xFA,
-0x25,0x6B,0x4F,0x5B,0xE4,0xA4,0x4E,0x27,0x55,0xAB,0x22,0x15,0x59,0x3C,0xCA,0xB5,
-0x0A,0xD4,0x4A,0xDB,0xAB,0xDD,0xA1,0x5F,0x53,0xC5,0xA0,0x57,0x39,0xC2,0xCE,0x47,
-0x2B,0xBE,0x3A,0xC8,0x56,0xBF,0xC2,0xD9,0x27,0x10,0x3A,0xB1,0x05,0x3C,0xC0,0x77,
-0x31,0xBB,0x3A,0xD3,0x05,0x7B,0x6D,0x9A,0x1C,0x30,0x8C,0x80,0xCB,0x93,0x93,0x2A,
-0x83,0xAB,0x05,0x51,0x82,0x02,0x00,0x11,0x67,0x6B,0xF3,0x88,0x61,0x47,0x5F,0x03,
-0x93,0xD5,0x5B,0x0D,0xE0,0xF1,0xD4,0xA1,0x32,0x35,0x85,0xB2,0x3A,0xDB,0xB0,0x82,
-0xAB,0xD1,0xCB,0x0A,0xBC,0x4F,0x8C,0x5B,0xC5,0x4B,0x00,0x3B,0x1F,0x2A,0x82,0xA6,
-0x7E,0x36,0x85,0xDC,0x7E,0x3C,0x67,0x00,0xB5,0xE4,0x3B,0x52,0xE0,0xA8,0xEB,0x5D,
-0x15,0xF9,0xC6,0x6D,0xF0,0xAD,0x1D,0x0E,0x85,0xB7,0xA9,0x9A,0x73,0x14,0x5A,0x5B,
-0x8F,0x41,0x28,0xC0,0xD5,0xE8,0x2D,0x4D,0xA4,0x5E,0xCD,0xAA,0xD9,0xED,0xCE,0xDC,
-0xD8,0xD5,0x3C,0x42,0x1D,0x17,0xC1,0x12,0x5D,0x45,0x38,0xC3,0x38,0xF3,0xFC,0x85,
-0x2E,0x83,0x46,0x48,0xB2,0xD7,0x20,0x5F,0x92,0x36,0x8F,0xE7,0x79,0x0F,0x98,0x5E,
-0x99,0xE8,0xF0,0xD0,0xA4,0xBB,0xF5,0x53,0xBD,0x2A,0xCE,0x59,0xB0,0xAF,0x6E,0x7F,
-0x6C,0xBB,0xD2,0x1E,0x00,0xB0,0x21,0xED,0xF8,0x41,0x62,0x82,0xB9,0xD8,0xB2,0xC4,
-0xBB,0x46,0x50,0xF3,0x31,0xC5,0x8F,0x01,0xA8,0x74,0xEB,0xF5,0x78,0x27,0xDA,0xE7,
-0xF7,0x66,0x43,0xF3,0x9E,0x83,0x3E,0x20,0xAA,0xC3,0x35,0x60,0x91,0xCE,
-};
-
-
-/* subject:/C=US/O=thawte, Inc./OU=Certification Services Division/OU=(c) 2006 thawte, Inc. - For authorized use only/CN=thawte Primary Root CA */
-/* issuer :/C=US/O=thawte, Inc./OU=Certification Services Division/OU=(c) 2006 thawte, Inc. - For authorized use only/CN=thawte Primary Root CA */
-
-
-const unsigned char thawte_Primary_Root_CA_certificate[1060]={
-0x30,0x82,0x04,0x20,0x30,0x82,0x03,0x08,0xA0,0x03,0x02,0x01,0x02,0x02,0x10,0x34,
-0x4E,0xD5,0x57,0x20,0xD5,0xED,0xEC,0x49,0xF4,0x2F,0xCE,0x37,0xDB,0x2B,0x6D,0x30,
-0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x05,0x05,0x00,0x30,0x81,
-0xA9,0x31,0x0B,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x15,
-0x30,0x13,0x06,0x03,0x55,0x04,0x0A,0x13,0x0C,0x74,0x68,0x61,0x77,0x74,0x65,0x2C,
-0x20,0x49,0x6E,0x63,0x2E,0x31,0x28,0x30,0x26,0x06,0x03,0x55,0x04,0x0B,0x13,0x1F,
-0x43,0x65,0x72,0x74,0x69,0x66,0x69,0x63,0x61,0x74,0x69,0x6F,0x6E,0x20,0x53,0x65,
-0x72,0x76,0x69,0x63,0x65,0x73,0x20,0x44,0x69,0x76,0x69,0x73,0x69,0x6F,0x6E,0x31,
-0x38,0x30,0x36,0x06,0x03,0x55,0x04,0x0B,0x13,0x2F,0x28,0x63,0x29,0x20,0x32,0x30,
-0x30,0x36,0x20,0x74,0x68,0x61,0x77,0x74,0x65,0x2C,0x20,0x49,0x6E,0x63,0x2E,0x20,
-0x2D,0x20,0x46,0x6F,0x72,0x20,0x61,0x75,0x74,0x68,0x6F,0x72,0x69,0x7A,0x65,0x64,
-0x20,0x75,0x73,0x65,0x20,0x6F,0x6E,0x6C,0x79,0x31,0x1F,0x30,0x1D,0x06,0x03,0x55,
-0x04,0x03,0x13,0x16,0x74,0x68,0x61,0x77,0x74,0x65,0x20,0x50,0x72,0x69,0x6D,0x61,
-0x72,0x79,0x20,0x52,0x6F,0x6F,0x74,0x20,0x43,0x41,0x30,0x1E,0x17,0x0D,0x30,0x36,
-0x31,0x31,0x31,0x37,0x30,0x30,0x30,0x30,0x30,0x30,0x5A,0x17,0x0D,0x33,0x36,0x30,
-0x37,0x31,0x36,0x32,0x33,0x35,0x39,0x35,0x39,0x5A,0x30,0x81,0xA9,0x31,0x0B,0x30,
-0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x15,0x30,0x13,0x06,0x03,
-0x55,0x04,0x0A,0x13,0x0C,0x74,0x68,0x61,0x77,0x74,0x65,0x2C,0x20,0x49,0x6E,0x63,
-0x2E,0x31,0x28,0x30,0x26,0x06,0x03,0x55,0x04,0x0B,0x13,0x1F,0x43,0x65,0x72,0x74,
-0x69,0x66,0x69,0x63,0x61,0x74,0x69,0x6F,0x6E,0x20,0x53,0x65,0x72,0x76,0x69,0x63,
-0x65,0x73,0x20,0x44,0x69,0x76,0x69,0x73,0x69,0x6F,0x6E,0x31,0x38,0x30,0x36,0x06,
-0x03,0x55,0x04,0x0B,0x13,0x2F,0x28,0x63,0x29,0x20,0x32,0x30,0x30,0x36,0x20,0x74,
-0x68,0x61,0x77,0x74,0x65,0x2C,0x20,0x49,0x6E,0x63,0x2E,0x20,0x2D,0x20,0x46,0x6F,
-0x72,0x20,0x61,0x75,0x74,0x68,0x6F,0x72,0x69,0x7A,0x65,0x64,0x20,0x75,0x73,0x65,
-0x20,0x6F,0x6E,0x6C,0x79,0x31,0x1F,0x30,0x1D,0x06,0x03,0x55,0x04,0x03,0x13,0x16,
-0x74,0x68,0x61,0x77,0x74,0x65,0x20,0x50,0x72,0x69,0x6D,0x61,0x72,0x79,0x20,0x52,
-0x6F,0x6F,0x74,0x20,0x43,0x41,0x30,0x82,0x01,0x22,0x30,0x0D,0x06,0x09,0x2A,0x86,
-0x48,0x86,0xF7,0x0D,0x01,0x01,0x01,0x05,0x00,0x03,0x82,0x01,0x0F,0x00,0x30,0x82,
-0x01,0x0A,0x02,0x82,0x01,0x01,0x00,0xAC,0xA0,0xF0,0xFB,0x80,0x59,0xD4,0x9C,0xC7,
-0xA4,0xCF,0x9D,0xA1,0x59,0x73,0x09,0x10,0x45,0x0C,0x0D,0x2C,0x6E,0x68,0xF1,0x6C,
-0x5B,0x48,0x68,0x49,0x59,0x37,0xFC,0x0B,0x33,0x19,0xC2,0x77,0x7F,0xCC,0x10,0x2D,
-0x95,0x34,0x1C,0xE6,0xEB,0x4D,0x09,0xA7,0x1C,0xD2,0xB8,0xC9,0x97,0x36,0x02,0xB7,
-0x89,0xD4,0x24,0x5F,0x06,0xC0,0xCC,0x44,0x94,0x94,0x8D,0x02,0x62,0x6F,0xEB,0x5A,
-0xDD,0x11,0x8D,0x28,0x9A,0x5C,0x84,0x90,0x10,0x7A,0x0D,0xBD,0x74,0x66,0x2F,0x6A,
-0x38,0xA0,0xE2,0xD5,0x54,0x44,0xEB,0x1D,0x07,0x9F,0x07,0xBA,0x6F,0xEE,0xE9,0xFD,
-0x4E,0x0B,0x29,0xF5,0x3E,0x84,0xA0,0x01,0xF1,0x9C,0xAB,0xF8,0x1C,0x7E,0x89,0xA4,
-0xE8,0xA1,0xD8,0x71,0x65,0x0D,0xA3,0x51,0x7B,0xEE,0xBC,0xD2,0x22,0x60,0x0D,0xB9,
-0x5B,0x9D,0xDF,0xBA,0xFC,0x51,0x5B,0x0B,0xAF,0x98,0xB2,0xE9,0x2E,0xE9,0x04,0xE8,
-0x62,0x87,0xDE,0x2B,0xC8,0xD7,0x4E,0xC1,0x4C,0x64,0x1E,0xDD,0xCF,0x87,0x58,0xBA,
-0x4A,0x4F,0xCA,0x68,0x07,0x1D,0x1C,0x9D,0x4A,0xC6,0xD5,0x2F,0x91,0xCC,0x7C,0x71,
-0x72,0x1C,0xC5,0xC0,0x67,0xEB,0x32,0xFD,0xC9,0x92,0x5C,0x94,0xDA,0x85,0xC0,0x9B,
-0xBF,0x53,0x7D,0x2B,0x09,0xF4,0x8C,0x9D,0x91,0x1F,0x97,0x6A,0x52,0xCB,0xDE,0x09,
-0x36,0xA4,0x77,0xD8,0x7B,0x87,0x50,0x44,0xD5,0x3E,0x6E,0x29,0x69,0xFB,0x39,0x49,
-0x26,0x1E,0x09,0xA5,0x80,0x7B,0x40,0x2D,0xEB,0xE8,0x27,0x85,0xC9,0xFE,0x61,0xFD,
-0x7E,0xE6,0x7C,0x97,0x1D,0xD5,0x9D,0x02,0x03,0x01,0x00,0x01,0xA3,0x42,0x30,0x40,
-0x30,0x0F,0x06,0x03,0x55,0x1D,0x13,0x01,0x01,0xFF,0x04,0x05,0x30,0x03,0x01,0x01,
-0xFF,0x30,0x0E,0x06,0x03,0x55,0x1D,0x0F,0x01,0x01,0xFF,0x04,0x04,0x03,0x02,0x01,
-0x06,0x30,0x1D,0x06,0x03,0x55,0x1D,0x0E,0x04,0x16,0x04,0x14,0x7B,0x5B,0x45,0xCF,
-0xAF,0xCE,0xCB,0x7A,0xFD,0x31,0x92,0x1A,0x6A,0xB6,0xF3,0x46,0xEB,0x57,0x48,0x50,
-0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x05,0x05,0x00,0x03,
-0x82,0x01,0x01,0x00,0x79,0x11,0xC0,0x4B,0xB3,0x91,0xB6,0xFC,0xF0,0xE9,0x67,0xD4,
-0x0D,0x6E,0x45,0xBE,0x55,0xE8,0x93,0xD2,0xCE,0x03,0x3F,0xED,0xDA,0x25,0xB0,0x1D,
-0x57,0xCB,0x1E,0x3A,0x76,0xA0,0x4C,0xEC,0x50,0x76,0xE8,0x64,0x72,0x0C,0xA4,0xA9,
-0xF1,0xB8,0x8B,0xD6,0xD6,0x87,0x84,0xBB,0x32,0xE5,0x41,0x11,0xC0,0x77,0xD9,0xB3,
-0x60,0x9D,0xEB,0x1B,0xD5,0xD1,0x6E,0x44,0x44,0xA9,0xA6,0x01,0xEC,0x55,0x62,0x1D,
-0x77,0xB8,0x5C,0x8E,0x48,0x49,0x7C,0x9C,0x3B,0x57,0x11,0xAC,0xAD,0x73,0x37,0x8E,
-0x2F,0x78,0x5C,0x90,0x68,0x47,0xD9,0x60,0x60,0xE6,0xFC,0x07,0x3D,0x22,0x20,0x17,
-0xC4,0xF7,0x16,0xE9,0xC4,0xD8,0x72,0xF9,0xC8,0x73,0x7C,0xDF,0x16,0x2F,0x15,0xA9,
-0x3E,0xFD,0x6A,0x27,0xB6,0xA1,0xEB,0x5A,0xBA,0x98,0x1F,0xD5,0xE3,0x4D,0x64,0x0A,
-0x9D,0x13,0xC8,0x61,0xBA,0xF5,0x39,0x1C,0x87,0xBA,0xB8,0xBD,0x7B,0x22,0x7F,0xF6,
-0xFE,0xAC,0x40,0x79,0xE5,0xAC,0x10,0x6F,0x3D,0x8F,0x1B,0x79,0x76,0x8B,0xC4,0x37,
-0xB3,0x21,0x18,0x84,0xE5,0x36,0x00,0xEB,0x63,0x20,0x99,0xB9,0xE9,0xFE,0x33,0x04,
-0xBB,0x41,0xC8,0xC1,0x02,0xF9,0x44,0x63,0x20,0x9E,0x81,0xCE,0x42,0xD3,0xD6,0x3F,
-0x2C,0x76,0xD3,0x63,0x9C,0x59,0xDD,0x8F,0xA6,0xE1,0x0E,0xA0,0x2E,0x41,0xF7,0x2E,
-0x95,0x47,0xCF,0xBC,0xFD,0x33,0xF3,0xF6,0x0B,0x61,0x7E,0x7E,0x91,0x2B,0x81,0x47,
-0xC2,0x27,0x30,0xEE,0xA7,0x10,0x5D,0x37,0x8F,0x5C,0x39,0x2B,0xE4,0x04,0xF0,0x7B,
-0x8D,0x56,0x8C,0x68,
-};
-
-
-/* subject:/C=SE/O=AddTrust AB/OU=AddTrust TTP Network/CN=AddTrust Public CA Root */
-/* issuer :/C=SE/O=AddTrust AB/OU=AddTrust TTP Network/CN=AddTrust Public CA Root */
-
-
-const unsigned char AddTrust_Public_Services_Root_certificate[1049]={
-0x30,0x82,0x04,0x15,0x30,0x82,0x02,0xFD,0xA0,0x03,0x02,0x01,0x02,0x02,0x01,0x01,
-0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x05,0x05,0x00,0x30,
-0x64,0x31,0x0B,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x53,0x45,0x31,0x14,
-0x30,0x12,0x06,0x03,0x55,0x04,0x0A,0x13,0x0B,0x41,0x64,0x64,0x54,0x72,0x75,0x73,
-0x74,0x20,0x41,0x42,0x31,0x1D,0x30,0x1B,0x06,0x03,0x55,0x04,0x0B,0x13,0x14,0x41,
-0x64,0x64,0x54,0x72,0x75,0x73,0x74,0x20,0x54,0x54,0x50,0x20,0x4E,0x65,0x74,0x77,
-0x6F,0x72,0x6B,0x31,0x20,0x30,0x1E,0x06,0x03,0x55,0x04,0x03,0x13,0x17,0x41,0x64,
-0x64,0x54,0x72,0x75,0x73,0x74,0x20,0x50,0x75,0x62,0x6C,0x69,0x63,0x20,0x43,0x41,
-0x20,0x52,0x6F,0x6F,0x74,0x30,0x1E,0x17,0x0D,0x30,0x30,0x30,0x35,0x33,0x30,0x31,
-0x30,0x34,0x31,0x35,0x30,0x5A,0x17,0x0D,0x32,0x30,0x30,0x35,0x33,0x30,0x31,0x30,
-0x34,0x31,0x35,0x30,0x5A,0x30,0x64,0x31,0x0B,0x30,0x09,0x06,0x03,0x55,0x04,0x06,
-0x13,0x02,0x53,0x45,0x31,0x14,0x30,0x12,0x06,0x03,0x55,0x04,0x0A,0x13,0x0B,0x41,
-0x64,0x64,0x54,0x72,0x75,0x73,0x74,0x20,0x41,0x42,0x31,0x1D,0x30,0x1B,0x06,0x03,
-0x55,0x04,0x0B,0x13,0x14,0x41,0x64,0x64,0x54,0x72,0x75,0x73,0x74,0x20,0x54,0x54,
-0x50,0x20,0x4E,0x65,0x74,0x77,0x6F,0x72,0x6B,0x31,0x20,0x30,0x1E,0x06,0x03,0x55,
-0x04,0x03,0x13,0x17,0x41,0x64,0x64,0x54,0x72,0x75,0x73,0x74,0x20,0x50,0x75,0x62,
-0x6C,0x69,0x63,0x20,0x43,0x41,0x20,0x52,0x6F,0x6F,0x74,0x30,0x82,0x01,0x22,0x30,
-0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x01,0x05,0x00,0x03,0x82,
-0x01,0x0F,0x00,0x30,0x82,0x01,0x0A,0x02,0x82,0x01,0x01,0x00,0xE9,0x1A,0x30,0x8F,
-0x83,0x88,0x14,0xC1,0x20,0xD8,0x3C,0x9B,0x8F,0x1B,0x7E,0x03,0x74,0xBB,0xDA,0x69,
-0xD3,0x46,0xA5,0xF8,0x8E,0xC2,0x0C,0x11,0x90,0x51,0xA5,0x2F,0x66,0x54,0x40,0x55,
-0xEA,0xDB,0x1F,0x4A,0x56,0xEE,0x9F,0x23,0x6E,0xF4,0x39,0xCB,0xA1,0xB9,0x6F,0xF2,
-0x7E,0xF9,0x5D,0x87,0x26,0x61,0x9E,0x1C,0xF8,0xE2,0xEC,0xA6,0x81,0xF8,0x21,0xC5,
-0x24,0xCC,0x11,0x0C,0x3F,0xDB,0x26,0x72,0x7A,0xC7,0x01,0x97,0x07,0x17,0xF9,0xD7,
-0x18,0x2C,0x30,0x7D,0x0E,0x7A,0x1E,0x62,0x1E,0xC6,0x4B,0xC0,0xFD,0x7D,0x62,0x77,
-0xD3,0x44,0x1E,0x27,0xF6,0x3F,0x4B,0x44,0xB3,0xB7,0x38,0xD9,0x39,0x1F,0x60,0xD5,
-0x51,0x92,0x73,0x03,0xB4,0x00,0x69,0xE3,0xF3,0x14,0x4E,0xEE,0xD1,0xDC,0x09,0xCF,
-0x77,0x34,0x46,0x50,0xB0,0xF8,0x11,0xF2,0xFE,0x38,0x79,0xF7,0x07,0x39,0xFE,0x51,
-0x92,0x97,0x0B,0x5B,0x08,0x5F,0x34,0x86,0x01,0xAD,0x88,0x97,0xEB,0x66,0xCD,0x5E,
-0xD1,0xFF,0xDC,0x7D,0xF2,0x84,0xDA,0xBA,0x77,0xAD,0xDC,0x80,0x08,0xC7,0xA7,0x87,
-0xD6,0x55,0x9F,0x97,0x6A,0xE8,0xC8,0x11,0x64,0xBA,0xE7,0x19,0x29,0x3F,0x11,0xB3,
-0x78,0x90,0x84,0x20,0x52,0x5B,0x11,0xEF,0x78,0xD0,0x83,0xF6,0xD5,0x48,0x90,0xD0,
-0x30,0x1C,0xCF,0x80,0xF9,0x60,0xFE,0x79,0xE4,0x88,0xF2,0xDD,0x00,0xEB,0x94,0x45,
-0xEB,0x65,0x94,0x69,0x40,0xBA,0xC0,0xD5,0xB4,0xB8,0xBA,0x7D,0x04,0x11,0xA8,0xEB,
-0x31,0x05,0x96,0x94,0x4E,0x58,0x21,0x8E,0x9F,0xD0,0x60,0xFD,0x02,0x03,0x01,0x00,
-0x01,0xA3,0x81,0xD1,0x30,0x81,0xCE,0x30,0x1D,0x06,0x03,0x55,0x1D,0x0E,0x04,0x16,
-0x04,0x14,0x81,0x3E,0x37,0xD8,0x92,0xB0,0x1F,0x77,0x9F,0x5C,0xB4,0xAB,0x73,0xAA,
-0xE7,0xF6,0x34,0x60,0x2F,0xFA,0x30,0x0B,0x06,0x03,0x55,0x1D,0x0F,0x04,0x04,0x03,
-0x02,0x01,0x06,0x30,0x0F,0x06,0x03,0x55,0x1D,0x13,0x01,0x01,0xFF,0x04,0x05,0x30,
-0x03,0x01,0x01,0xFF,0x30,0x81,0x8E,0x06,0x03,0x55,0x1D,0x23,0x04,0x81,0x86,0x30,
-0x81,0x83,0x80,0x14,0x81,0x3E,0x37,0xD8,0x92,0xB0,0x1F,0x77,0x9F,0x5C,0xB4,0xAB,
-0x73,0xAA,0xE7,0xF6,0x34,0x60,0x2F,0xFA,0xA1,0x68,0xA4,0x66,0x30,0x64,0x31,0x0B,
-0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x53,0x45,0x31,0x14,0x30,0x12,0x06,
-0x03,0x55,0x04,0x0A,0x13,0x0B,0x41,0x64,0x64,0x54,0x72,0x75,0x73,0x74,0x20,0x41,
-0x42,0x31,0x1D,0x30,0x1B,0x06,0x03,0x55,0x04,0x0B,0x13,0x14,0x41,0x64,0x64,0x54,
-0x72,0x75,0x73,0x74,0x20,0x54,0x54,0x50,0x20,0x4E,0x65,0x74,0x77,0x6F,0x72,0x6B,
-0x31,0x20,0x30,0x1E,0x06,0x03,0x55,0x04,0x03,0x13,0x17,0x41,0x64,0x64,0x54,0x72,
-0x75,0x73,0x74,0x20,0x50,0x75,0x62,0x6C,0x69,0x63,0x20,0x43,0x41,0x20,0x52,0x6F,
-0x6F,0x74,0x82,0x01,0x01,0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,
-0x01,0x05,0x05,0x00,0x03,0x82,0x01,0x01,0x00,0x03,0xF7,0x15,0x4A,0xF8,0x24,0xDA,
-0x23,0x56,0x16,0x93,0x76,0xDD,0x36,0x28,0xB9,0xAE,0x1B,0xB8,0xC3,0xF1,0x64,0xBA,
-0x20,0x18,0x78,0x95,0x29,0x27,0x57,0x05,0xBC,0x7C,0x2A,0xF4,0xB9,0x51,0x55,0xDA,
-0x87,0x02,0xDE,0x0F,0x16,0x17,0x31,0xF8,0xAA,0x79,0x2E,0x09,0x13,0xBB,0xAF,0xB2,
-0x20,0x19,0x12,0xE5,0x93,0xF9,0x4B,0xF9,0x83,0xE8,0x44,0xD5,0xB2,0x41,0x25,0xBF,
-0x88,0x75,0x6F,0xFF,0x10,0xFC,0x4A,0x54,0xD0,0x5F,0xF0,0xFA,0xEF,0x36,0x73,0x7D,
-0x1B,0x36,0x45,0xC6,0x21,0x6D,0xB4,0x15,0xB8,0x4E,0xCF,0x9C,0x5C,0xA5,0x3D,0x5A,
-0x00,0x8E,0x06,0xE3,0x3C,0x6B,0x32,0x7B,0xF2,0x9F,0xF0,0xB6,0xFD,0xDF,0xF0,0x28,
-0x18,0x48,0xF0,0xC6,0xBC,0xD0,0xBF,0x34,0x80,0x96,0xC2,0x4A,0xB1,0x6D,0x8E,0xC7,
-0x90,0x45,0xDE,0x2F,0x67,0xAC,0x45,0x04,0xA3,0x7A,0xDC,0x55,0x92,0xC9,0x47,0x66,
-0xD8,0x1A,0x8C,0xC7,0xED,0x9C,0x4E,0x9A,0xE0,0x12,0xBB,0xB5,0x6A,0x4C,0x84,0xE1,
-0xE1,0x22,0x0D,0x87,0x00,0x64,0xFE,0x8C,0x7D,0x62,0x39,0x65,0xA6,0xEF,0x42,0xB6,
-0x80,0x25,0x12,0x61,0x01,0xA8,0x24,0x13,0x70,0x00,0x11,0x26,0x5F,0xFA,0x35,0x50,
-0xC5,0x48,0xCC,0x06,0x47,0xE8,0x27,0xD8,0x70,0x8D,0x5F,0x64,0xE6,0xA1,0x44,0x26,
-0x5E,0x22,0xEC,0x92,0xCD,0xFF,0x42,0x9A,0x44,0x21,0x6D,0x5C,0xC5,0xE3,0x22,0x1D,
-0x5F,0x47,0x12,0xE7,0xCE,0x5F,0x5D,0xFA,0xD8,0xAA,0xB1,0x33,0x2D,0xD9,0x76,0xF2,
-0x4E,0x3A,0x33,0x0C,0x2B,0xB3,0x2D,0x90,0x06,
-};
-
-
-/* subject:/C=SE/O=AddTrust AB/OU=AddTrust TTP Network/CN=AddTrust Qualified CA Root */
-/* issuer :/C=SE/O=AddTrust AB/OU=AddTrust TTP Network/CN=AddTrust Qualified CA Root */
-
-
-const unsigned char AddTrust_Qualified_Certificates_Root_certificate[1058]={
-0x30,0x82,0x04,0x1E,0x30,0x82,0x03,0x06,0xA0,0x03,0x02,0x01,0x02,0x02,0x01,0x01,
-0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x05,0x05,0x00,0x30,
-0x67,0x31,0x0B,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x53,0x45,0x31,0x14,
-0x30,0x12,0x06,0x03,0x55,0x04,0x0A,0x13,0x0B,0x41,0x64,0x64,0x54,0x72,0x75,0x73,
-0x74,0x20,0x41,0x42,0x31,0x1D,0x30,0x1B,0x06,0x03,0x55,0x04,0x0B,0x13,0x14,0x41,
-0x64,0x64,0x54,0x72,0x75,0x73,0x74,0x20,0x54,0x54,0x50,0x20,0x4E,0x65,0x74,0x77,
-0x6F,0x72,0x6B,0x31,0x23,0x30,0x21,0x06,0x03,0x55,0x04,0x03,0x13,0x1A,0x41,0x64,
-0x64,0x54,0x72,0x75,0x73,0x74,0x20,0x51,0x75,0x61,0x6C,0x69,0x66,0x69,0x65,0x64,
-0x20,0x43,0x41,0x20,0x52,0x6F,0x6F,0x74,0x30,0x1E,0x17,0x0D,0x30,0x30,0x30,0x35,
-0x33,0x30,0x31,0x30,0x34,0x34,0x35,0x30,0x5A,0x17,0x0D,0x32,0x30,0x30,0x35,0x33,
-0x30,0x31,0x30,0x34,0x34,0x35,0x30,0x5A,0x30,0x67,0x31,0x0B,0x30,0x09,0x06,0x03,
-0x55,0x04,0x06,0x13,0x02,0x53,0x45,0x31,0x14,0x30,0x12,0x06,0x03,0x55,0x04,0x0A,
-0x13,0x0B,0x41,0x64,0x64,0x54,0x72,0x75,0x73,0x74,0x20,0x41,0x42,0x31,0x1D,0x30,
-0x1B,0x06,0x03,0x55,0x04,0x0B,0x13,0x14,0x41,0x64,0x64,0x54,0x72,0x75,0x73,0x74,
-0x20,0x54,0x54,0x50,0x20,0x4E,0x65,0x74,0x77,0x6F,0x72,0x6B,0x31,0x23,0x30,0x21,
-0x06,0x03,0x55,0x04,0x03,0x13,0x1A,0x41,0x64,0x64,0x54,0x72,0x75,0x73,0x74,0x20,
-0x51,0x75,0x61,0x6C,0x69,0x66,0x69,0x65,0x64,0x20,0x43,0x41,0x20,0x52,0x6F,0x6F,
-0x74,0x30,0x82,0x01,0x22,0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,
-0x01,0x01,0x05,0x00,0x03,0x82,0x01,0x0F,0x00,0x30,0x82,0x01,0x0A,0x02,0x82,0x01,
-0x01,0x00,0xE4,0x1E,0x9A,0xFE,0xDC,0x09,0x5A,0x87,0xA4,0x9F,0x47,0xBE,0x11,0x5F,
-0xAF,0x84,0x34,0xDB,0x62,0x3C,0x79,0x78,0xB7,0xE9,0x30,0xB5,0xEC,0x0C,0x1C,0x2A,
-0xC4,0x16,0xFF,0xE0,0xEC,0x71,0xEB,0x8A,0xF5,0x11,0x6E,0xED,0x4F,0x0D,0x91,0xD2,
-0x12,0x18,0x2D,0x49,0x15,0x01,0xC2,0xA4,0x22,0x13,0xC7,0x11,0x64,0xFF,0x22,0x12,
-0x9A,0xB9,0x8E,0x5C,0x2F,0x08,0xCF,0x71,0x6A,0xB3,0x67,0x01,0x59,0xF1,0x5D,0x46,
-0xF3,0xB0,0x78,0xA5,0xF6,0x0E,0x42,0x7A,0xE3,0x7F,0x1B,0xCC,0xD0,0xF0,0xB7,0x28,
-0xFD,0x2A,0xEA,0x9E,0xB3,0xB0,0xB9,0x04,0xAA,0xFD,0xF6,0xC7,0xB4,0xB1,0xB8,0x2A,
-0xA0,0xFB,0x58,0xF1,0x19,0xA0,0x6F,0x70,0x25,0x7E,0x3E,0x69,0x4A,0x7F,0x0F,0x22,
-0xD8,0xEF,0xAD,0x08,0x11,0x9A,0x29,0x99,0xE1,0xAA,0x44,0x45,0x9A,0x12,0x5E,0x3E,
-0x9D,0x6D,0x52,0xFC,0xE7,0xA0,0x3D,0x68,0x2F,0xF0,0x4B,0x70,0x7C,0x13,0x38,0xAD,
-0xBC,0x15,0x25,0xF1,0xD6,0xCE,0xAB,0xA2,0xC0,0x31,0xD6,0x2F,0x9F,0xE0,0xFF,0x14,
-0x59,0xFC,0x84,0x93,0xD9,0x87,0x7C,0x4C,0x54,0x13,0xEB,0x9F,0xD1,0x2D,0x11,0xF8,
-0x18,0x3A,0x3A,0xDE,0x25,0xD9,0xF7,0xD3,0x40,0xED,0xA4,0x06,0x12,0xC4,0x3B,0xE1,
-0x91,0xC1,0x56,0x35,0xF0,0x14,0xDC,0x65,0x36,0x09,0x6E,0xAB,0xA4,0x07,0xC7,0x35,
-0xD1,0xC2,0x03,0x33,0x36,0x5B,0x75,0x26,0x6D,0x42,0xF1,0x12,0x6B,0x43,0x6F,0x4B,
-0x71,0x94,0xFA,0x34,0x1D,0xED,0x13,0x6E,0xCA,0x80,0x7F,0x98,0x2F,0x6C,0xB9,0x65,
-0xD8,0xE9,0x02,0x03,0x01,0x00,0x01,0xA3,0x81,0xD4,0x30,0x81,0xD1,0x30,0x1D,0x06,
-0x03,0x55,0x1D,0x0E,0x04,0x16,0x04,0x14,0x39,0x95,0x8B,0x62,0x8B,0x5C,0xC9,0xD4,
-0x80,0xBA,0x58,0x0F,0x97,0x3F,0x15,0x08,0x43,0xCC,0x98,0xA7,0x30,0x0B,0x06,0x03,
-0x55,0x1D,0x0F,0x04,0x04,0x03,0x02,0x01,0x06,0x30,0x0F,0x06,0x03,0x55,0x1D,0x13,
-0x01,0x01,0xFF,0x04,0x05,0x30,0x03,0x01,0x01,0xFF,0x30,0x81,0x91,0x06,0x03,0x55,
-0x1D,0x23,0x04,0x81,0x89,0x30,0x81,0x86,0x80,0x14,0x39,0x95,0x8B,0x62,0x8B,0x5C,
-0xC9,0xD4,0x80,0xBA,0x58,0x0F,0x97,0x3F,0x15,0x08,0x43,0xCC,0x98,0xA7,0xA1,0x6B,
-0xA4,0x69,0x30,0x67,0x31,0x0B,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x53,
-0x45,0x31,0x14,0x30,0x12,0x06,0x03,0x55,0x04,0x0A,0x13,0x0B,0x41,0x64,0x64,0x54,
-0x72,0x75,0x73,0x74,0x20,0x41,0x42,0x31,0x1D,0x30,0x1B,0x06,0x03,0x55,0x04,0x0B,
-0x13,0x14,0x41,0x64,0x64,0x54,0x72,0x75,0x73,0x74,0x20,0x54,0x54,0x50,0x20,0x4E,
-0x65,0x74,0x77,0x6F,0x72,0x6B,0x31,0x23,0x30,0x21,0x06,0x03,0x55,0x04,0x03,0x13,
-0x1A,0x41,0x64,0x64,0x54,0x72,0x75,0x73,0x74,0x20,0x51,0x75,0x61,0x6C,0x69,0x66,
-0x69,0x65,0x64,0x20,0x43,0x41,0x20,0x52,0x6F,0x6F,0x74,0x82,0x01,0x01,0x30,0x0D,
-0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x05,0x05,0x00,0x03,0x82,0x01,
-0x01,0x00,0x19,0xAB,0x75,0xEA,0xF8,0x8B,0x65,0x61,0x95,0x13,0xBA,0x69,0x04,0xEF,
-0x86,0xCA,0x13,0xA0,0xC7,0xAA,0x4F,0x64,0x1B,0x3F,0x18,0xF6,0xA8,0x2D,0x2C,0x55,
-0x8F,0x05,0xB7,0x30,0xEA,0x42,0x6A,0x1D,0xC0,0x25,0x51,0x2D,0xA7,0xBF,0x0C,0xB3,
-0xED,0xEF,0x08,0x7F,0x6C,0x3C,0x46,0x1A,0xEA,0x18,0x43,0xDF,0x76,0xCC,0xF9,0x66,
-0x86,0x9C,0x2C,0x68,0xF5,0xE9,0x17,0xF8,0x31,0xB3,0x18,0xC4,0xD6,0x48,0x7D,0x23,
-0x4C,0x68,0xC1,0x7E,0xBB,0x01,0x14,0x6F,0xC5,0xD9,0x6E,0xDE,0xBB,0x04,0x42,0x6A,
-0xF8,0xF6,0x5C,0x7D,0xE5,0xDA,0xFA,0x87,0xEB,0x0D,0x35,0x52,0x67,0xD0,0x9E,0x97,
-0x76,0x05,0x93,0x3F,0x95,0xC7,0x01,0xE6,0x69,0x55,0x38,0x7F,0x10,0x61,0x99,0xC9,
-0xE3,0x5F,0xA6,0xCA,0x3E,0x82,0x63,0x48,0xAA,0xE2,0x08,0x48,0x3E,0xAA,0xF2,0xB2,
-0x85,0x62,0xA6,0xB4,0xA7,0xD9,0xBD,0x37,0x9C,0x68,0xB5,0x2D,0x56,0x7D,0xB0,0xB7,
-0x3F,0xA0,0xB1,0x07,0xD6,0xE9,0x4F,0xDC,0xDE,0x45,0x71,0x30,0x32,0x7F,0x1B,0x2E,
-0x09,0xF9,0xBF,0x52,0xA1,0xEE,0xC2,0x80,0x3E,0x06,0x5C,0x2E,0x55,0x40,0xC1,0x1B,
-0xF5,0x70,0x45,0xB0,0xDC,0x5D,0xFA,0xF6,0x72,0x5A,0x77,0xD2,0x63,0xCD,0xCF,0x58,
-0x89,0x00,0x42,0x63,0x3F,0x79,0x39,0xD0,0x44,0xB0,0x82,0x6E,0x41,0x19,0xE8,0xDD,
-0xE0,0xC1,0x88,0x5A,0xD1,0x1E,0x71,0x93,0x1F,0x24,0x30,0x74,0xE5,0x1E,0xA8,0xDE,
-0x3C,0x27,0x37,0x7F,0x83,0xAE,0x9E,0x77,0xCF,0xF0,0x30,0xB1,0xFF,0x4B,0x99,0xE8,
-0xC6,0xA1,
-};
-
-
-/* subject:/C=US/O=GeoTrust Inc./OU=(c) 2008 GeoTrust Inc. - For authorized use only/CN=GeoTrust Primary Certification Authority - G3 */
-/* issuer :/C=US/O=GeoTrust Inc./OU=(c) 2008 GeoTrust Inc. - For authorized use only/CN=GeoTrust Primary Certification Authority - G3 */
-
-
-const unsigned char GeoTrust_Primary_Certification_Authority___G3_certificate[1026]={
-0x30,0x82,0x03,0xFE,0x30,0x82,0x02,0xE6,0xA0,0x03,0x02,0x01,0x02,0x02,0x10,0x15,
-0xAC,0x6E,0x94,0x19,0xB2,0x79,0x4B,0x41,0xF6,0x27,0xA9,0xC3,0x18,0x0F,0x1F,0x30,
-0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x0B,0x05,0x00,0x30,0x81,
-0x98,0x31,0x0B,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x16,
-0x30,0x14,0x06,0x03,0x55,0x04,0x0A,0x13,0x0D,0x47,0x65,0x6F,0x54,0x72,0x75,0x73,
-0x74,0x20,0x49,0x6E,0x63,0x2E,0x31,0x39,0x30,0x37,0x06,0x03,0x55,0x04,0x0B,0x13,
-0x30,0x28,0x63,0x29,0x20,0x32,0x30,0x30,0x38,0x20,0x47,0x65,0x6F,0x54,0x72,0x75,
-0x73,0x74,0x20,0x49,0x6E,0x63,0x2E,0x20,0x2D,0x20,0x46,0x6F,0x72,0x20,0x61,0x75,
-0x74,0x68,0x6F,0x72,0x69,0x7A,0x65,0x64,0x20,0x75,0x73,0x65,0x20,0x6F,0x6E,0x6C,
-0x79,0x31,0x36,0x30,0x34,0x06,0x03,0x55,0x04,0x03,0x13,0x2D,0x47,0x65,0x6F,0x54,
-0x72,0x75,0x73,0x74,0x20,0x50,0x72,0x69,0x6D,0x61,0x72,0x79,0x20,0x43,0x65,0x72,
-0x74,0x69,0x66,0x69,0x63,0x61,0x74,0x69,0x6F,0x6E,0x20,0x41,0x75,0x74,0x68,0x6F,
-0x72,0x69,0x74,0x79,0x20,0x2D,0x20,0x47,0x33,0x30,0x1E,0x17,0x0D,0x30,0x38,0x30,
-0x34,0x30,0x32,0x30,0x30,0x30,0x30,0x30,0x30,0x5A,0x17,0x0D,0x33,0x37,0x31,0x32,
-0x30,0x31,0x32,0x33,0x35,0x39,0x35,0x39,0x5A,0x30,0x81,0x98,0x31,0x0B,0x30,0x09,
-0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x16,0x30,0x14,0x06,0x03,0x55,
-0x04,0x0A,0x13,0x0D,0x47,0x65,0x6F,0x54,0x72,0x75,0x73,0x74,0x20,0x49,0x6E,0x63,
-0x2E,0x31,0x39,0x30,0x37,0x06,0x03,0x55,0x04,0x0B,0x13,0x30,0x28,0x63,0x29,0x20,
-0x32,0x30,0x30,0x38,0x20,0x47,0x65,0x6F,0x54,0x72,0x75,0x73,0x74,0x20,0x49,0x6E,
-0x63,0x2E,0x20,0x2D,0x20,0x46,0x6F,0x72,0x20,0x61,0x75,0x74,0x68,0x6F,0x72,0x69,
-0x7A,0x65,0x64,0x20,0x75,0x73,0x65,0x20,0x6F,0x6E,0x6C,0x79,0x31,0x36,0x30,0x34,
-0x06,0x03,0x55,0x04,0x03,0x13,0x2D,0x47,0x65,0x6F,0x54,0x72,0x75,0x73,0x74,0x20,
-0x50,0x72,0x69,0x6D,0x61,0x72,0x79,0x20,0x43,0x65,0x72,0x74,0x69,0x66,0x69,0x63,
-0x61,0x74,0x69,0x6F,0x6E,0x20,0x41,0x75,0x74,0x68,0x6F,0x72,0x69,0x74,0x79,0x20,
-0x2D,0x20,0x47,0x33,0x30,0x82,0x01,0x22,0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,
-0xF7,0x0D,0x01,0x01,0x01,0x05,0x00,0x03,0x82,0x01,0x0F,0x00,0x30,0x82,0x01,0x0A,
-0x02,0x82,0x01,0x01,0x00,0xDC,0xE2,0x5E,0x62,0x58,0x1D,0x33,0x57,0x39,0x32,0x33,
-0xFA,0xEB,0xCB,0x87,0x8C,0xA7,0xD4,0x4A,0xDD,0x06,0x88,0xEA,0x64,0x8E,0x31,0x98,
-0xA5,0x38,0x90,0x1E,0x98,0xCF,0x2E,0x63,0x2B,0xF0,0x46,0xBC,0x44,0xB2,0x89,0xA1,
-0xC0,0x28,0x0C,0x49,0x70,0x21,0x95,0x9F,0x64,0xC0,0xA6,0x93,0x12,0x02,0x65,0x26,
-0x86,0xC6,0xA5,0x89,0xF0,0xFA,0xD7,0x84,0xA0,0x70,0xAF,0x4F,0x1A,0x97,0x3F,0x06,
-0x44,0xD5,0xC9,0xEB,0x72,0x10,0x7D,0xE4,0x31,0x28,0xFB,0x1C,0x61,0xE6,0x28,0x07,
-0x44,0x73,0x92,0x22,0x69,0xA7,0x03,0x88,0x6C,0x9D,0x63,0xC8,0x52,0xDA,0x98,0x27,
-0xE7,0x08,0x4C,0x70,0x3E,0xB4,0xC9,0x12,0xC1,0xC5,0x67,0x83,0x5D,0x33,0xF3,0x03,
-0x11,0xEC,0x6A,0xD0,0x53,0xE2,0xD1,0xBA,0x36,0x60,0x94,0x80,0xBB,0x61,0x63,0x6C,
-0x5B,0x17,0x7E,0xDF,0x40,0x94,0x1E,0xAB,0x0D,0xC2,0x21,0x28,0x70,0x88,0xFF,0xD6,
-0x26,0x6C,0x6C,0x60,0x04,0x25,0x4E,0x55,0x7E,0x7D,0xEF,0xBF,0x94,0x48,0xDE,0xB7,
-0x1D,0xDD,0x70,0x8D,0x05,0x5F,0x88,0xA5,0x9B,0xF2,0xC2,0xEE,0xEA,0xD1,0x40,0x41,
-0x6D,0x62,0x38,0x1D,0x56,0x06,0xC5,0x03,0x47,0x51,0x20,0x19,0xFC,0x7B,0x10,0x0B,
-0x0E,0x62,0xAE,0x76,0x55,0xBF,0x5F,0x77,0xBE,0x3E,0x49,0x01,0x53,0x3D,0x98,0x25,
-0x03,0x76,0x24,0x5A,0x1D,0xB4,0xDB,0x89,0xEA,0x79,0xE5,0xB6,0xB3,0x3B,0x3F,0xBA,
-0x4C,0x28,0x41,0x7F,0x06,0xAC,0x6A,0x8E,0xC1,0xD0,0xF6,0x05,0x1D,0x7D,0xE6,0x42,
-0x86,0xE3,0xA5,0xD5,0x47,0x02,0x03,0x01,0x00,0x01,0xA3,0x42,0x30,0x40,0x30,0x0F,
-0x06,0x03,0x55,0x1D,0x13,0x01,0x01,0xFF,0x04,0x05,0x30,0x03,0x01,0x01,0xFF,0x30,
-0x0E,0x06,0x03,0x55,0x1D,0x0F,0x01,0x01,0xFF,0x04,0x04,0x03,0x02,0x01,0x06,0x30,
-0x1D,0x06,0x03,0x55,0x1D,0x0E,0x04,0x16,0x04,0x14,0xC4,0x79,0xCA,0x8E,0xA1,0x4E,
-0x03,0x1D,0x1C,0xDC,0x6B,0xDB,0x31,0x5B,0x94,0x3E,0x3F,0x30,0x7F,0x2D,0x30,0x0D,
-0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x0B,0x05,0x00,0x03,0x82,0x01,
-0x01,0x00,0x2D,0xC5,0x13,0xCF,0x56,0x80,0x7B,0x7A,0x78,0xBD,0x9F,0xAE,0x2C,0x99,
-0xE7,0xEF,0xDA,0xDF,0x94,0x5E,0x09,0x69,0xA7,0xE7,0x6E,0x68,0x8C,0xBD,0x72,0xBE,
-0x47,0xA9,0x0E,0x97,0x12,0xB8,0x4A,0xF1,0x64,0xD3,0x39,0xDF,0x25,0x34,0xD4,0xC1,
-0xCD,0x4E,0x81,0xF0,0x0F,0x04,0xC4,0x24,0xB3,0x34,0x96,0xC6,0xA6,0xAA,0x30,0xDF,
-0x68,0x61,0x73,0xD7,0xF9,0x8E,0x85,0x89,0xEF,0x0E,0x5E,0x95,0x28,0x4A,0x2A,0x27,
-0x8F,0x10,0x8E,0x2E,0x7C,0x86,0xC4,0x02,0x9E,0xDA,0x0C,0x77,0x65,0x0E,0x44,0x0D,
-0x92,0xFD,0xFD,0xB3,0x16,0x36,0xFA,0x11,0x0D,0x1D,0x8C,0x0E,0x07,0x89,0x6A,0x29,
-0x56,0xF7,0x72,0xF4,0xDD,0x15,0x9C,0x77,0x35,0x66,0x57,0xAB,0x13,0x53,0xD8,0x8E,
-0xC1,0x40,0xC5,0xD7,0x13,0x16,0x5A,0x72,0xC7,0xB7,0x69,0x01,0xC4,0x7A,0xB1,0x83,
-0x01,0x68,0x7D,0x8D,0x41,0xA1,0x94,0x18,0xC1,0x25,0x5C,0xFC,0xF0,0xFE,0x83,0x02,
-0x87,0x7C,0x0D,0x0D,0xCF,0x2E,0x08,0x5C,0x4A,0x40,0x0D,0x3E,0xEC,0x81,0x61,0xE6,
-0x24,0xDB,0xCA,0xE0,0x0E,0x2D,0x07,0xB2,0x3E,0x56,0xDC,0x8D,0xF5,0x41,0x85,0x07,
-0x48,0x9B,0x0C,0x0B,0xCB,0x49,0x3F,0x7D,0xEC,0xB7,0xFD,0xCB,0x8D,0x67,0x89,0x1A,
-0xAB,0xED,0xBB,0x1E,0xA3,0x00,0x08,0x08,0x17,0x2A,0x82,0x5C,0x31,0x5D,0x46,0x8A,
-0x2D,0x0F,0x86,0x9B,0x74,0xD9,0x45,0xFB,0xD4,0x40,0xB1,0x7A,0xAA,0x68,0x2D,0x86,
-0xB2,0x99,0x22,0xE1,0xC1,0x2B,0xC7,0x9C,0xF8,0xF3,0x5F,0xA8,0x82,0x12,0xEB,0x19,
-0x11,0x2D,
-};
-
-
-/* subject:/C=US/O=GeoTrust Inc./CN=GeoTrust Universal CA 2 */
-/* issuer :/C=US/O=GeoTrust Inc./CN=GeoTrust Universal CA 2 */
-
-
-const unsigned char GeoTrust_Universal_CA_2_certificate[1392]={
-0x30,0x82,0x05,0x6C,0x30,0x82,0x03,0x54,0xA0,0x03,0x02,0x01,0x02,0x02,0x01,0x01,
-0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x05,0x05,0x00,0x30,
-0x47,0x31,0x0B,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x16,
-0x30,0x14,0x06,0x03,0x55,0x04,0x0A,0x13,0x0D,0x47,0x65,0x6F,0x54,0x72,0x75,0x73,
-0x74,0x20,0x49,0x6E,0x63,0x2E,0x31,0x20,0x30,0x1E,0x06,0x03,0x55,0x04,0x03,0x13,
-0x17,0x47,0x65,0x6F,0x54,0x72,0x75,0x73,0x74,0x20,0x55,0x6E,0x69,0x76,0x65,0x72,
-0x73,0x61,0x6C,0x20,0x43,0x41,0x20,0x32,0x30,0x1E,0x17,0x0D,0x30,0x34,0x30,0x33,
-0x30,0x34,0x30,0x35,0x30,0x30,0x30,0x30,0x5A,0x17,0x0D,0x32,0x39,0x30,0x33,0x30,
-0x34,0x30,0x35,0x30,0x30,0x30,0x30,0x5A,0x30,0x47,0x31,0x0B,0x30,0x09,0x06,0x03,
-0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x16,0x30,0x14,0x06,0x03,0x55,0x04,0x0A,
-0x13,0x0D,0x47,0x65,0x6F,0x54,0x72,0x75,0x73,0x74,0x20,0x49,0x6E,0x63,0x2E,0x31,
-0x20,0x30,0x1E,0x06,0x03,0x55,0x04,0x03,0x13,0x17,0x47,0x65,0x6F,0x54,0x72,0x75,
-0x73,0x74,0x20,0x55,0x6E,0x69,0x76,0x65,0x72,0x73,0x61,0x6C,0x20,0x43,0x41,0x20,
-0x32,0x30,0x82,0x02,0x22,0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,
-0x01,0x01,0x05,0x00,0x03,0x82,0x02,0x0F,0x00,0x30,0x82,0x02,0x0A,0x02,0x82,0x02,
-0x01,0x00,0xB3,0x54,0x52,0xC1,0xC9,0x3E,0xF2,0xD9,0xDC,0xB1,0x53,0x1A,0x59,0x29,
-0xE7,0xB1,0xC3,0x45,0x28,0xE5,0xD7,0xD1,0xED,0xC5,0xC5,0x4B,0xA1,0xAA,0x74,0x7B,
-0x57,0xAF,0x4A,0x26,0xFC,0xD8,0xF5,0x5E,0xA7,0x6E,0x19,0xDB,0x74,0x0C,0x4F,0x35,
-0x5B,0x32,0x0B,0x01,0xE3,0xDB,0xEB,0x7A,0x77,0x35,0xEA,0xAA,0x5A,0xE0,0xD6,0xE8,
-0xA1,0x57,0x94,0xF0,0x90,0xA3,0x74,0x56,0x94,0x44,0x30,0x03,0x1E,0x5C,0x4E,0x2B,
-0x85,0x26,0x74,0x82,0x7A,0x0C,0x76,0xA0,0x6F,0x4D,0xCE,0x41,0x2D,0xA0,0x15,0x06,
-0x14,0x5F,0xB7,0x42,0xCD,0x7B,0x8F,0x58,0x61,0x34,0xDC,0x2A,0x08,0xF9,0x2E,0xC3,
-0x01,0xA6,0x22,0x44,0x1C,0x4C,0x07,0x82,0xE6,0x5B,0xCE,0xD0,0x4A,0x7C,0x04,0xD3,
-0x19,0x73,0x27,0xF0,0xAA,0x98,0x7F,0x2E,0xAF,0x4E,0xEB,0x87,0x1E,0x24,0x77,0x6A,
-0x5D,0xB6,0xE8,0x5B,0x45,0xBA,0xDC,0xC3,0xA1,0x05,0x6F,0x56,0x8E,0x8F,0x10,0x26,
-0xA5,0x49,0xC3,0x2E,0xD7,0x41,0x87,0x22,0xE0,0x4F,0x86,0xCA,0x60,0xB5,0xEA,0xA1,
-0x63,0xC0,0x01,0x97,0x10,0x79,0xBD,0x00,0x3C,0x12,0x6D,0x2B,0x15,0xB1,0xAC,0x4B,
-0xB1,0xEE,0x18,0xB9,0x4E,0x96,0xDC,0xDC,0x76,0xFF,0x3B,0xBE,0xCF,0x5F,0x03,0xC0,
-0xFC,0x3B,0xE8,0xBE,0x46,0x1B,0xFF,0xDA,0x40,0xC2,0x52,0xF7,0xFE,0xE3,0x3A,0xF7,
-0x6A,0x77,0x35,0xD0,0xDA,0x8D,0xEB,0x5E,0x18,0x6A,0x31,0xC7,0x1E,0xBA,0x3C,0x1B,
-0x28,0xD6,0x6B,0x54,0xC6,0xAA,0x5B,0xD7,0xA2,0x2C,0x1B,0x19,0xCC,0xA2,0x02,0xF6,
-0x9B,0x59,0xBD,0x37,0x6B,0x86,0xB5,0x6D,0x82,0xBA,0xD8,0xEA,0xC9,0x56,0xBC,0xA9,
-0x36,0x58,0xFD,0x3E,0x19,0xF3,0xED,0x0C,0x26,0xA9,0x93,0x38,0xF8,0x4F,0xC1,0x5D,
-0x22,0x06,0xD0,0x97,0xEA,0xE1,0xAD,0xC6,0x55,0xE0,0x81,0x2B,0x28,0x83,0x3A,0xFA,
-0xF4,0x7B,0x21,0x51,0x00,0xBE,0x52,0x38,0xCE,0xCD,0x66,0x79,0xA8,0xF4,0x81,0x56,
-0xE2,0xD0,0x83,0x09,0x47,0x51,0x5B,0x50,0x6A,0xCF,0xDB,0x48,0x1A,0x5D,0x3E,0xF7,
-0xCB,0xF6,0x65,0xF7,0x6C,0xF1,0x95,0xF8,0x02,0x3B,0x32,0x56,0x82,0x39,0x7A,0x5B,
-0xBD,0x2F,0x89,0x1B,0xBF,0xA1,0xB4,0xE8,0xFF,0x7F,0x8D,0x8C,0xDF,0x03,0xF1,0x60,
-0x4E,0x58,0x11,0x4C,0xEB,0xA3,0x3F,0x10,0x2B,0x83,0x9A,0x01,0x73,0xD9,0x94,0x6D,
-0x84,0x00,0x27,0x66,0xAC,0xF0,0x70,0x40,0x09,0x42,0x92,0xAD,0x4F,0x93,0x0D,0x61,
-0x09,0x51,0x24,0xD8,0x92,0xD5,0x0B,0x94,0x61,0xB2,0x87,0xB2,0xED,0xFF,0x9A,0x35,
-0xFF,0x85,0x54,0xCA,0xED,0x44,0x43,0xAC,0x1B,0x3C,0x16,0x6B,0x48,0x4A,0x0A,0x1C,
-0x40,0x88,0x1F,0x92,0xC2,0x0B,0x00,0x05,0xFF,0xF2,0xC8,0x02,0x4A,0xA4,0xAA,0xA9,
-0xCC,0x99,0x96,0x9C,0x2F,0x58,0xE0,0x7D,0xE1,0xBE,0xBB,0x07,0xDC,0x5F,0x04,0x72,
-0x5C,0x31,0x34,0xC3,0xEC,0x5F,0x2D,0xE0,0x3D,0x64,0x90,0x22,0xE6,0xD1,0xEC,0xB8,
-0x2E,0xDD,0x59,0xAE,0xD9,0xA1,0x37,0xBF,0x54,0x35,0xDC,0x73,0x32,0x4F,0x8C,0x04,
-0x1E,0x33,0xB2,0xC9,0x46,0xF1,0xD8,0x5C,0xC8,0x55,0x50,0xC9,0x68,0xBD,0xA8,0xBA,
-0x36,0x09,0x02,0x03,0x01,0x00,0x01,0xA3,0x63,0x30,0x61,0x30,0x0F,0x06,0x03,0x55,
-0x1D,0x13,0x01,0x01,0xFF,0x04,0x05,0x30,0x03,0x01,0x01,0xFF,0x30,0x1D,0x06,0x03,
-0x55,0x1D,0x0E,0x04,0x16,0x04,0x14,0x76,0xF3,0x55,0xE1,0xFA,0xA4,0x36,0xFB,0xF0,
-0x9F,0x5C,0x62,0x71,0xED,0x3C,0xF4,0x47,0x38,0x10,0x2B,0x30,0x1F,0x06,0x03,0x55,
-0x1D,0x23,0x04,0x18,0x30,0x16,0x80,0x14,0x76,0xF3,0x55,0xE1,0xFA,0xA4,0x36,0xFB,
-0xF0,0x9F,0x5C,0x62,0x71,0xED,0x3C,0xF4,0x47,0x38,0x10,0x2B,0x30,0x0E,0x06,0x03,
-0x55,0x1D,0x0F,0x01,0x01,0xFF,0x04,0x04,0x03,0x02,0x01,0x86,0x30,0x0D,0x06,0x09,
-0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x05,0x05,0x00,0x03,0x82,0x02,0x01,0x00,
-0x66,0xC1,0xC6,0x23,0xF3,0xD9,0xE0,0x2E,0x6E,0x5F,0xE8,0xCF,0xAE,0xB0,0xB0,0x25,
-0x4D,0x2B,0xF8,0x3B,0x58,0x9B,0x40,0x24,0x37,0x5A,0xCB,0xAB,0x16,0x49,0xFF,0xB3,
-0x75,0x79,0x33,0xA1,0x2F,0x6D,0x70,0x17,0x34,0x91,0xFE,0x67,0x7E,0x8F,0xEC,0x9B,
-0xE5,0x5E,0x82,0xA9,0x55,0x1F,0x2F,0xDC,0xD4,0x51,0x07,0x12,0xFE,0xAC,0x16,0x3E,
-0x2C,0x35,0xC6,0x63,0xFC,0xDC,0x10,0xEB,0x0D,0xA3,0xAA,0xD0,0x7C,0xCC,0xD1,0xD0,
-0x2F,0x51,0x2E,0xC4,0x14,0x5A,0xDE,0xE8,0x19,0xE1,0x3E,0xC6,0xCC,0xA4,0x29,0xE7,
-0x2E,0x84,0xAA,0x06,0x30,0x78,0x76,0x54,0x73,0x28,0x98,0x59,0x38,0xE0,0x00,0x0D,
-0x62,0xD3,0x42,0x7D,0x21,0x9F,0xAE,0x3D,0x3A,0x8C,0xD5,0xFA,0x77,0x0D,0x18,0x2B,
-0x16,0x0E,0x5F,0x36,0xE1,0xFC,0x2A,0xB5,0x30,0x24,0xCF,0xE0,0x63,0x0C,0x7B,0x58,
-0x1A,0xFE,0x99,0xBA,0x42,0x12,0xB1,0x91,0xF4,0x7C,0x68,0xE2,0xC8,0xE8,0xAF,0x2C,
-0xEA,0xC9,0x7E,0xAE,0xBB,0x2A,0x3D,0x0D,0x15,0xDC,0x34,0x95,0xB6,0x18,0x74,0xA8,
-0x6A,0x0F,0xC7,0xB4,0xF4,0x13,0xC4,0xE4,0x5B,0xED,0x0A,0xD2,0xA4,0x97,0x4C,0x2A,
-0xED,0x2F,0x6C,0x12,0x89,0x3D,0xF1,0x27,0x70,0xAA,0x6A,0x03,0x52,0x21,0x9F,0x40,
-0xA8,0x67,0x50,0xF2,0xF3,0x5A,0x1F,0xDF,0xDF,0x23,0xF6,0xDC,0x78,0x4E,0xE6,0x98,
-0x4F,0x55,0x3A,0x53,0xE3,0xEF,0xF2,0xF4,0x9F,0xC7,0x7C,0xD8,0x58,0xAF,0x29,0x22,
-0x97,0xB8,0xE0,0xBD,0x91,0x2E,0xB0,0x76,0xEC,0x57,0x11,0xCF,0xEF,0x29,0x44,0xF3,
-0xE9,0x85,0x7A,0x60,0x63,0xE4,0x5D,0x33,0x89,0x17,0xD9,0x31,0xAA,0xDA,0xD6,0xF3,
-0x18,0x35,0x72,0xCF,0x87,0x2B,0x2F,0x63,0x23,0x84,0x5D,0x84,0x8C,0x3F,0x57,0xA0,
-0x88,0xFC,0x99,0x91,0x28,0x26,0x69,0x99,0xD4,0x8F,0x97,0x44,0xBE,0x8E,0xD5,0x48,
-0xB1,0xA4,0x28,0x29,0xF1,0x15,0xB4,0xE1,0xE5,0x9E,0xDD,0xF8,0x8F,0xA6,0x6F,0x26,
-0xD7,0x09,0x3C,0x3A,0x1C,0x11,0x0E,0xA6,0x6C,0x37,0xF7,0xAD,0x44,0x87,0x2C,0x28,
-0xC7,0xD8,0x74,0x82,0xB3,0xD0,0x6F,0x4A,0x57,0xBB,0x35,0x29,0x27,0xA0,0x8B,0xE8,
-0x21,0xA7,0x87,0x64,0x36,0x5D,0xCC,0xD8,0x16,0xAC,0xC7,0xB2,0x27,0x40,0x92,0x55,
-0x38,0x28,0x8D,0x51,0x6E,0xDD,0x14,0x67,0x53,0x6C,0x71,0x5C,0x26,0x84,0x4D,0x75,
-0x5A,0xB6,0x7E,0x60,0x56,0xA9,0x4D,0xAD,0xFB,0x9B,0x1E,0x97,0xF3,0x0D,0xD9,0xD2,
-0x97,0x54,0x77,0xDA,0x3D,0x12,0xB7,0xE0,0x1E,0xEF,0x08,0x06,0xAC,0xF9,0x85,0x87,
-0xE9,0xA2,0xDC,0xAF,0x7E,0x18,0x12,0x83,0xFD,0x56,0x17,0x41,0x2E,0xD5,0x29,0x82,
-0x7D,0x99,0xF4,0x31,0xF6,0x71,0xA9,0xCF,0x2C,0x01,0x27,0xA5,0x05,0xB9,0xAA,0xB2,
-0x48,0x4E,0x2A,0xEF,0x9F,0x93,0x52,0x51,0x95,0x3C,0x52,0x73,0x8E,0x56,0x4C,0x17,
-0x40,0xC0,0x09,0x28,0xE4,0x8B,0x6A,0x48,0x53,0xDB,0xEC,0xCD,0x55,0x55,0xF1,0xC6,
-0xF8,0xE9,0xA2,0x2C,0x4C,0xA6,0xD1,0x26,0x5F,0x7E,0xAF,0x5A,0x4C,0xDA,0x1F,0xA6,
-0xF2,0x1C,0x2C,0x7E,0xAE,0x02,0x16,0xD2,0x56,0xD0,0x2F,0x57,0x53,0x47,0xE8,0x92,
-};
-
-
-/* subject:/C=IE/O=Baltimore/OU=CyberTrust/CN=Baltimore CyberTrust Root */
-/* issuer :/C=IE/O=Baltimore/OU=CyberTrust/CN=Baltimore CyberTrust Root */
-
-
-const unsigned char Baltimore_CyberTrust_Root_certificate[891]={
-0x30,0x82,0x03,0x77,0x30,0x82,0x02,0x5F,0xA0,0x03,0x02,0x01,0x02,0x02,0x04,0x02,
-0x00,0x00,0xB9,0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x05,
-0x05,0x00,0x30,0x5A,0x31,0x0B,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x49,
-0x45,0x31,0x12,0x30,0x10,0x06,0x03,0x55,0x04,0x0A,0x13,0x09,0x42,0x61,0x6C,0x74,
-0x69,0x6D,0x6F,0x72,0x65,0x31,0x13,0x30,0x11,0x06,0x03,0x55,0x04,0x0B,0x13,0x0A,
-0x43,0x79,0x62,0x65,0x72,0x54,0x72,0x75,0x73,0x74,0x31,0x22,0x30,0x20,0x06,0x03,
-0x55,0x04,0x03,0x13,0x19,0x42,0x61,0x6C,0x74,0x69,0x6D,0x6F,0x72,0x65,0x20,0x43,
-0x79,0x62,0x65,0x72,0x54,0x72,0x75,0x73,0x74,0x20,0x52,0x6F,0x6F,0x74,0x30,0x1E,
-0x17,0x0D,0x30,0x30,0x30,0x35,0x31,0x32,0x31,0x38,0x34,0x36,0x30,0x30,0x5A,0x17,
-0x0D,0x32,0x35,0x30,0x35,0x31,0x32,0x32,0x33,0x35,0x39,0x30,0x30,0x5A,0x30,0x5A,
-0x31,0x0B,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x49,0x45,0x31,0x12,0x30,
-0x10,0x06,0x03,0x55,0x04,0x0A,0x13,0x09,0x42,0x61,0x6C,0x74,0x69,0x6D,0x6F,0x72,
-0x65,0x31,0x13,0x30,0x11,0x06,0x03,0x55,0x04,0x0B,0x13,0x0A,0x43,0x79,0x62,0x65,
-0x72,0x54,0x72,0x75,0x73,0x74,0x31,0x22,0x30,0x20,0x06,0x03,0x55,0x04,0x03,0x13,
-0x19,0x42,0x61,0x6C,0x74,0x69,0x6D,0x6F,0x72,0x65,0x20,0x43,0x79,0x62,0x65,0x72,
-0x54,0x72,0x75,0x73,0x74,0x20,0x52,0x6F,0x6F,0x74,0x30,0x82,0x01,0x22,0x30,0x0D,
-0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x01,0x05,0x00,0x03,0x82,0x01,
-0x0F,0x00,0x30,0x82,0x01,0x0A,0x02,0x82,0x01,0x01,0x00,0xA3,0x04,0xBB,0x22,0xAB,
-0x98,0x3D,0x57,0xE8,0x26,0x72,0x9A,0xB5,0x79,0xD4,0x29,0xE2,0xE1,0xE8,0x95,0x80,
-0xB1,0xB0,0xE3,0x5B,0x8E,0x2B,0x29,0x9A,0x64,0xDF,0xA1,0x5D,0xED,0xB0,0x09,0x05,
-0x6D,0xDB,0x28,0x2E,0xCE,0x62,0xA2,0x62,0xFE,0xB4,0x88,0xDA,0x12,0xEB,0x38,0xEB,
-0x21,0x9D,0xC0,0x41,0x2B,0x01,0x52,0x7B,0x88,0x77,0xD3,0x1C,0x8F,0xC7,0xBA,0xB9,
-0x88,0xB5,0x6A,0x09,0xE7,0x73,0xE8,0x11,0x40,0xA7,0xD1,0xCC,0xCA,0x62,0x8D,0x2D,
-0xE5,0x8F,0x0B,0xA6,0x50,0xD2,0xA8,0x50,0xC3,0x28,0xEA,0xF5,0xAB,0x25,0x87,0x8A,
-0x9A,0x96,0x1C,0xA9,0x67,0xB8,0x3F,0x0C,0xD5,0xF7,0xF9,0x52,0x13,0x2F,0xC2,0x1B,
-0xD5,0x70,0x70,0xF0,0x8F,0xC0,0x12,0xCA,0x06,0xCB,0x9A,0xE1,0xD9,0xCA,0x33,0x7A,
-0x77,0xD6,0xF8,0xEC,0xB9,0xF1,0x68,0x44,0x42,0x48,0x13,0xD2,0xC0,0xC2,0xA4,0xAE,
-0x5E,0x60,0xFE,0xB6,0xA6,0x05,0xFC,0xB4,0xDD,0x07,0x59,0x02,0xD4,0x59,0x18,0x98,
-0x63,0xF5,0xA5,0x63,0xE0,0x90,0x0C,0x7D,0x5D,0xB2,0x06,0x7A,0xF3,0x85,0xEA,0xEB,
-0xD4,0x03,0xAE,0x5E,0x84,0x3E,0x5F,0xFF,0x15,0xED,0x69,0xBC,0xF9,0x39,0x36,0x72,
-0x75,0xCF,0x77,0x52,0x4D,0xF3,0xC9,0x90,0x2C,0xB9,0x3D,0xE5,0xC9,0x23,0x53,0x3F,
-0x1F,0x24,0x98,0x21,0x5C,0x07,0x99,0x29,0xBD,0xC6,0x3A,0xEC,0xE7,0x6E,0x86,0x3A,
-0x6B,0x97,0x74,0x63,0x33,0xBD,0x68,0x18,0x31,0xF0,0x78,0x8D,0x76,0xBF,0xFC,0x9E,
-0x8E,0x5D,0x2A,0x86,0xA7,0x4D,0x90,0xDC,0x27,0x1A,0x39,0x02,0x03,0x01,0x00,0x01,
-0xA3,0x45,0x30,0x43,0x30,0x1D,0x06,0x03,0x55,0x1D,0x0E,0x04,0x16,0x04,0x14,0xE5,
-0x9D,0x59,0x30,0x82,0x47,0x58,0xCC,0xAC,0xFA,0x08,0x54,0x36,0x86,0x7B,0x3A,0xB5,
-0x04,0x4D,0xF0,0x30,0x12,0x06,0x03,0x55,0x1D,0x13,0x01,0x01,0xFF,0x04,0x08,0x30,
-0x06,0x01,0x01,0xFF,0x02,0x01,0x03,0x30,0x0E,0x06,0x03,0x55,0x1D,0x0F,0x01,0x01,
-0xFF,0x04,0x04,0x03,0x02,0x01,0x06,0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,
-0x0D,0x01,0x01,0x05,0x05,0x00,0x03,0x82,0x01,0x01,0x00,0x85,0x0C,0x5D,0x8E,0xE4,
-0x6F,0x51,0x68,0x42,0x05,0xA0,0xDD,0xBB,0x4F,0x27,0x25,0x84,0x03,0xBD,0xF7,0x64,
-0xFD,0x2D,0xD7,0x30,0xE3,0xA4,0x10,0x17,0xEB,0xDA,0x29,0x29,0xB6,0x79,0x3F,0x76,
-0xF6,0x19,0x13,0x23,0xB8,0x10,0x0A,0xF9,0x58,0xA4,0xD4,0x61,0x70,0xBD,0x04,0x61,
-0x6A,0x12,0x8A,0x17,0xD5,0x0A,0xBD,0xC5,0xBC,0x30,0x7C,0xD6,0xE9,0x0C,0x25,0x8D,
-0x86,0x40,0x4F,0xEC,0xCC,0xA3,0x7E,0x38,0xC6,0x37,0x11,0x4F,0xED,0xDD,0x68,0x31,
-0x8E,0x4C,0xD2,0xB3,0x01,0x74,0xEE,0xBE,0x75,0x5E,0x07,0x48,0x1A,0x7F,0x70,0xFF,
-0x16,0x5C,0x84,0xC0,0x79,0x85,0xB8,0x05,0xFD,0x7F,0xBE,0x65,0x11,0xA3,0x0F,0xC0,
-0x02,0xB4,0xF8,0x52,0x37,0x39,0x04,0xD5,0xA9,0x31,0x7A,0x18,0xBF,0xA0,0x2A,0xF4,
-0x12,0x99,0xF7,0xA3,0x45,0x82,0xE3,0x3C,0x5E,0xF5,0x9D,0x9E,0xB5,0xC8,0x9E,0x7C,
-0x2E,0xC8,0xA4,0x9E,0x4E,0x08,0x14,0x4B,0x6D,0xFD,0x70,0x6D,0x6B,0x1A,0x63,0xBD,
-0x64,0xE6,0x1F,0xB7,0xCE,0xF0,0xF2,0x9F,0x2E,0xBB,0x1B,0xB7,0xF2,0x50,0x88,0x73,
-0x92,0xC2,0xE2,0xE3,0x16,0x8D,0x9A,0x32,0x02,0xAB,0x8E,0x18,0xDD,0xE9,0x10,0x11,
-0xEE,0x7E,0x35,0xAB,0x90,0xAF,0x3E,0x30,0x94,0x7A,0xD0,0x33,0x3D,0xA7,0x65,0x0F,
-0xF5,0xFC,0x8E,0x9E,0x62,0xCF,0x47,0x44,0x2C,0x01,0x5D,0xBB,0x1D,0xB5,0x32,0xD2,
-0x47,0xD2,0x38,0x2E,0xD0,0xFE,0x81,0xDC,0x32,0x6A,0x1E,0xB5,0xEE,0x3C,0xD5,0xFC,
-0xE7,0x81,0x1D,0x19,0xC3,0x24,0x42,0xEA,0x63,0x39,0xA9,
-};
-
-
-/* subject:/OU=GlobalSign Root CA - R2/O=GlobalSign/CN=GlobalSign */
-/* issuer :/OU=GlobalSign Root CA - R2/O=GlobalSign/CN=GlobalSign */
-
-
-const unsigned char GlobalSign_Root_CA___R2_certificate[958]={
-0x30,0x82,0x03,0xBA,0x30,0x82,0x02,0xA2,0xA0,0x03,0x02,0x01,0x02,0x02,0x0B,0x04,
-0x00,0x00,0x00,0x00,0x01,0x0F,0x86,0x26,0xE6,0x0D,0x30,0x0D,0x06,0x09,0x2A,0x86,
-0x48,0x86,0xF7,0x0D,0x01,0x01,0x05,0x05,0x00,0x30,0x4C,0x31,0x20,0x30,0x1E,0x06,
-0x03,0x55,0x04,0x0B,0x13,0x17,0x47,0x6C,0x6F,0x62,0x61,0x6C,0x53,0x69,0x67,0x6E,
-0x20,0x52,0x6F,0x6F,0x74,0x20,0x43,0x41,0x20,0x2D,0x20,0x52,0x32,0x31,0x13,0x30,
-0x11,0x06,0x03,0x55,0x04,0x0A,0x13,0x0A,0x47,0x6C,0x6F,0x62,0x61,0x6C,0x53,0x69,
-0x67,0x6E,0x31,0x13,0x30,0x11,0x06,0x03,0x55,0x04,0x03,0x13,0x0A,0x47,0x6C,0x6F,
-0x62,0x61,0x6C,0x53,0x69,0x67,0x6E,0x30,0x1E,0x17,0x0D,0x30,0x36,0x31,0x32,0x31,
-0x35,0x30,0x38,0x30,0x30,0x30,0x30,0x5A,0x17,0x0D,0x32,0x31,0x31,0x32,0x31,0x35,
-0x30,0x38,0x30,0x30,0x30,0x30,0x5A,0x30,0x4C,0x31,0x20,0x30,0x1E,0x06,0x03,0x55,
-0x04,0x0B,0x13,0x17,0x47,0x6C,0x6F,0x62,0x61,0x6C,0x53,0x69,0x67,0x6E,0x20,0x52,
-0x6F,0x6F,0x74,0x20,0x43,0x41,0x20,0x2D,0x20,0x52,0x32,0x31,0x13,0x30,0x11,0x06,
-0x03,0x55,0x04,0x0A,0x13,0x0A,0x47,0x6C,0x6F,0x62,0x61,0x6C,0x53,0x69,0x67,0x6E,
-0x31,0x13,0x30,0x11,0x06,0x03,0x55,0x04,0x03,0x13,0x0A,0x47,0x6C,0x6F,0x62,0x61,
-0x6C,0x53,0x69,0x67,0x6E,0x30,0x82,0x01,0x22,0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,
-0x86,0xF7,0x0D,0x01,0x01,0x01,0x05,0x00,0x03,0x82,0x01,0x0F,0x00,0x30,0x82,0x01,
-0x0A,0x02,0x82,0x01,0x01,0x00,0xA6,0xCF,0x24,0x0E,0xBE,0x2E,0x6F,0x28,0x99,0x45,
-0x42,0xC4,0xAB,0x3E,0x21,0x54,0x9B,0x0B,0xD3,0x7F,0x84,0x70,0xFA,0x12,0xB3,0xCB,
-0xBF,0x87,0x5F,0xC6,0x7F,0x86,0xD3,0xB2,0x30,0x5C,0xD6,0xFD,0xAD,0xF1,0x7B,0xDC,
-0xE5,0xF8,0x60,0x96,0x09,0x92,0x10,0xF5,0xD0,0x53,0xDE,0xFB,0x7B,0x7E,0x73,0x88,
-0xAC,0x52,0x88,0x7B,0x4A,0xA6,0xCA,0x49,0xA6,0x5E,0xA8,0xA7,0x8C,0x5A,0x11,0xBC,
-0x7A,0x82,0xEB,0xBE,0x8C,0xE9,0xB3,0xAC,0x96,0x25,0x07,0x97,0x4A,0x99,0x2A,0x07,
-0x2F,0xB4,0x1E,0x77,0xBF,0x8A,0x0F,0xB5,0x02,0x7C,0x1B,0x96,0xB8,0xC5,0xB9,0x3A,
-0x2C,0xBC,0xD6,0x12,0xB9,0xEB,0x59,0x7D,0xE2,0xD0,0x06,0x86,0x5F,0x5E,0x49,0x6A,
-0xB5,0x39,0x5E,0x88,0x34,0xEC,0xBC,0x78,0x0C,0x08,0x98,0x84,0x6C,0xA8,0xCD,0x4B,
-0xB4,0xA0,0x7D,0x0C,0x79,0x4D,0xF0,0xB8,0x2D,0xCB,0x21,0xCA,0xD5,0x6C,0x5B,0x7D,
-0xE1,0xA0,0x29,0x84,0xA1,0xF9,0xD3,0x94,0x49,0xCB,0x24,0x62,0x91,0x20,0xBC,0xDD,
-0x0B,0xD5,0xD9,0xCC,0xF9,0xEA,0x27,0x0A,0x2B,0x73,0x91,0xC6,0x9D,0x1B,0xAC,0xC8,
-0xCB,0xE8,0xE0,0xA0,0xF4,0x2F,0x90,0x8B,0x4D,0xFB,0xB0,0x36,0x1B,0xF6,0x19,0x7A,
-0x85,0xE0,0x6D,0xF2,0x61,0x13,0x88,0x5C,0x9F,0xE0,0x93,0x0A,0x51,0x97,0x8A,0x5A,
-0xCE,0xAF,0xAB,0xD5,0xF7,0xAA,0x09,0xAA,0x60,0xBD,0xDC,0xD9,0x5F,0xDF,0x72,0xA9,
-0x60,0x13,0x5E,0x00,0x01,0xC9,0x4A,0xFA,0x3F,0xA4,0xEA,0x07,0x03,0x21,0x02,0x8E,
-0x82,0xCA,0x03,0xC2,0x9B,0x8F,0x02,0x03,0x01,0x00,0x01,0xA3,0x81,0x9C,0x30,0x81,
-0x99,0x30,0x0E,0x06,0x03,0x55,0x1D,0x0F,0x01,0x01,0xFF,0x04,0x04,0x03,0x02,0x01,
-0x06,0x30,0x0F,0x06,0x03,0x55,0x1D,0x13,0x01,0x01,0xFF,0x04,0x05,0x30,0x03,0x01,
-0x01,0xFF,0x30,0x1D,0x06,0x03,0x55,0x1D,0x0E,0x04,0x16,0x04,0x14,0x9B,0xE2,0x07,
-0x57,0x67,0x1C,0x1E,0xC0,0x6A,0x06,0xDE,0x59,0xB4,0x9A,0x2D,0xDF,0xDC,0x19,0x86,
-0x2E,0x30,0x36,0x06,0x03,0x55,0x1D,0x1F,0x04,0x2F,0x30,0x2D,0x30,0x2B,0xA0,0x29,
-0xA0,0x27,0x86,0x25,0x68,0x74,0x74,0x70,0x3A,0x2F,0x2F,0x63,0x72,0x6C,0x2E,0x67,
-0x6C,0x6F,0x62,0x61,0x6C,0x73,0x69,0x67,0x6E,0x2E,0x6E,0x65,0x74,0x2F,0x72,0x6F,
-0x6F,0x74,0x2D,0x72,0x32,0x2E,0x63,0x72,0x6C,0x30,0x1F,0x06,0x03,0x55,0x1D,0x23,
-0x04,0x18,0x30,0x16,0x80,0x14,0x9B,0xE2,0x07,0x57,0x67,0x1C,0x1E,0xC0,0x6A,0x06,
-0xDE,0x59,0xB4,0x9A,0x2D,0xDF,0xDC,0x19,0x86,0x2E,0x30,0x0D,0x06,0x09,0x2A,0x86,
-0x48,0x86,0xF7,0x0D,0x01,0x01,0x05,0x05,0x00,0x03,0x82,0x01,0x01,0x00,0x99,0x81,
-0x53,0x87,0x1C,0x68,0x97,0x86,0x91,0xEC,0xE0,0x4A,0xB8,0x44,0x0B,0xAB,0x81,0xAC,
-0x27,0x4F,0xD6,0xC1,0xB8,0x1C,0x43,0x78,0xB3,0x0C,0x9A,0xFC,0xEA,0x2C,0x3C,0x6E,
-0x61,0x1B,0x4D,0x4B,0x29,0xF5,0x9F,0x05,0x1D,0x26,0xC1,0xB8,0xE9,0x83,0x00,0x62,
-0x45,0xB6,0xA9,0x08,0x93,0xB9,0xA9,0x33,0x4B,0x18,0x9A,0xC2,0xF8,0x87,0x88,0x4E,
-0xDB,0xDD,0x71,0x34,0x1A,0xC1,0x54,0xDA,0x46,0x3F,0xE0,0xD3,0x2A,0xAB,0x6D,0x54,
-0x22,0xF5,0x3A,0x62,0xCD,0x20,0x6F,0xBA,0x29,0x89,0xD7,0xDD,0x91,0xEE,0xD3,0x5C,
-0xA2,0x3E,0xA1,0x5B,0x41,0xF5,0xDF,0xE5,0x64,0x43,0x2D,0xE9,0xD5,0x39,0xAB,0xD2,
-0xA2,0xDF,0xB7,0x8B,0xD0,0xC0,0x80,0x19,0x1C,0x45,0xC0,0x2D,0x8C,0xE8,0xF8,0x2D,
-0xA4,0x74,0x56,0x49,0xC5,0x05,0xB5,0x4F,0x15,0xDE,0x6E,0x44,0x78,0x39,0x87,0xA8,
-0x7E,0xBB,0xF3,0x79,0x18,0x91,0xBB,0xF4,0x6F,0x9D,0xC1,0xF0,0x8C,0x35,0x8C,0x5D,
-0x01,0xFB,0xC3,0x6D,0xB9,0xEF,0x44,0x6D,0x79,0x46,0x31,0x7E,0x0A,0xFE,0xA9,0x82,
-0xC1,0xFF,0xEF,0xAB,0x6E,0x20,0xC4,0x50,0xC9,0x5F,0x9D,0x4D,0x9B,0x17,0x8C,0x0C,
-0xE5,0x01,0xC9,0xA0,0x41,0x6A,0x73,0x53,0xFA,0xA5,0x50,0xB4,0x6E,0x25,0x0F,0xFB,
-0x4C,0x18,0xF4,0xFD,0x52,0xD9,0x8E,0x69,0xB1,0xE8,0x11,0x0F,0xDE,0x88,0xD8,0xFB,
-0x1D,0x49,0xF7,0xAA,0xDE,0x95,0xCF,0x20,0x78,0xC2,0x60,0x12,0xDB,0x25,0x40,0x8C,
-0x6A,0xFC,0x7E,0x42,0x38,0x40,0x64,0x12,0xF7,0x9E,0x81,0xE1,0x93,0x2E,
-};
-
-
-/* subject:/OU=GlobalSign Root CA - R3/O=GlobalSign/CN=GlobalSign */
-/* issuer :/OU=GlobalSign Root CA - R3/O=GlobalSign/CN=GlobalSign */
-
-
-const unsigned char GlobalSign_Root_CA___R3_certificate[867]={
-0x30,0x82,0x03,0x5F,0x30,0x82,0x02,0x47,0xA0,0x03,0x02,0x01,0x02,0x02,0x0B,0x04,
-0x00,0x00,0x00,0x00,0x01,0x21,0x58,0x53,0x08,0xA2,0x30,0x0D,0x06,0x09,0x2A,0x86,
-0x48,0x86,0xF7,0x0D,0x01,0x01,0x0B,0x05,0x00,0x30,0x4C,0x31,0x20,0x30,0x1E,0x06,
-0x03,0x55,0x04,0x0B,0x13,0x17,0x47,0x6C,0x6F,0x62,0x61,0x6C,0x53,0x69,0x67,0x6E,
-0x20,0x52,0x6F,0x6F,0x74,0x20,0x43,0x41,0x20,0x2D,0x20,0x52,0x33,0x31,0x13,0x30,
-0x11,0x06,0x03,0x55,0x04,0x0A,0x13,0x0A,0x47,0x6C,0x6F,0x62,0x61,0x6C,0x53,0x69,
-0x67,0x6E,0x31,0x13,0x30,0x11,0x06,0x03,0x55,0x04,0x03,0x13,0x0A,0x47,0x6C,0x6F,
-0x62,0x61,0x6C,0x53,0x69,0x67,0x6E,0x30,0x1E,0x17,0x0D,0x30,0x39,0x30,0x33,0x31,
-0x38,0x31,0x30,0x30,0x30,0x30,0x30,0x5A,0x17,0x0D,0x32,0x39,0x30,0x33,0x31,0x38,
-0x31,0x30,0x30,0x30,0x30,0x30,0x5A,0x30,0x4C,0x31,0x20,0x30,0x1E,0x06,0x03,0x55,
-0x04,0x0B,0x13,0x17,0x47,0x6C,0x6F,0x62,0x61,0x6C,0x53,0x69,0x67,0x6E,0x20,0x52,
-0x6F,0x6F,0x74,0x20,0x43,0x41,0x20,0x2D,0x20,0x52,0x33,0x31,0x13,0x30,0x11,0x06,
-0x03,0x55,0x04,0x0A,0x13,0x0A,0x47,0x6C,0x6F,0x62,0x61,0x6C,0x53,0x69,0x67,0x6E,
-0x31,0x13,0x30,0x11,0x06,0x03,0x55,0x04,0x03,0x13,0x0A,0x47,0x6C,0x6F,0x62,0x61,
-0x6C,0x53,0x69,0x67,0x6E,0x30,0x82,0x01,0x22,0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,
-0x86,0xF7,0x0D,0x01,0x01,0x01,0x05,0x00,0x03,0x82,0x01,0x0F,0x00,0x30,0x82,0x01,
-0x0A,0x02,0x82,0x01,0x01,0x00,0xCC,0x25,0x76,0x90,0x79,0x06,0x78,0x22,0x16,0xF5,
-0xC0,0x83,0xB6,0x84,0xCA,0x28,0x9E,0xFD,0x05,0x76,0x11,0xC5,0xAD,0x88,0x72,0xFC,
-0x46,0x02,0x43,0xC7,0xB2,0x8A,0x9D,0x04,0x5F,0x24,0xCB,0x2E,0x4B,0xE1,0x60,0x82,
-0x46,0xE1,0x52,0xAB,0x0C,0x81,0x47,0x70,0x6C,0xDD,0x64,0xD1,0xEB,0xF5,0x2C,0xA3,
-0x0F,0x82,0x3D,0x0C,0x2B,0xAE,0x97,0xD7,0xB6,0x14,0x86,0x10,0x79,0xBB,0x3B,0x13,
-0x80,0x77,0x8C,0x08,0xE1,0x49,0xD2,0x6A,0x62,0x2F,0x1F,0x5E,0xFA,0x96,0x68,0xDF,
-0x89,0x27,0x95,0x38,0x9F,0x06,0xD7,0x3E,0xC9,0xCB,0x26,0x59,0x0D,0x73,0xDE,0xB0,
-0xC8,0xE9,0x26,0x0E,0x83,0x15,0xC6,0xEF,0x5B,0x8B,0xD2,0x04,0x60,0xCA,0x49,0xA6,
-0x28,0xF6,0x69,0x3B,0xF6,0xCB,0xC8,0x28,0x91,0xE5,0x9D,0x8A,0x61,0x57,0x37,0xAC,
-0x74,0x14,0xDC,0x74,0xE0,0x3A,0xEE,0x72,0x2F,0x2E,0x9C,0xFB,0xD0,0xBB,0xBF,0xF5,
-0x3D,0x00,0xE1,0x06,0x33,0xE8,0x82,0x2B,0xAE,0x53,0xA6,0x3A,0x16,0x73,0x8C,0xDD,
-0x41,0x0E,0x20,0x3A,0xC0,0xB4,0xA7,0xA1,0xE9,0xB2,0x4F,0x90,0x2E,0x32,0x60,0xE9,
-0x57,0xCB,0xB9,0x04,0x92,0x68,0x68,0xE5,0x38,0x26,0x60,0x75,0xB2,0x9F,0x77,0xFF,
-0x91,0x14,0xEF,0xAE,0x20,0x49,0xFC,0xAD,0x40,0x15,0x48,0xD1,0x02,0x31,0x61,0x19,
-0x5E,0xB8,0x97,0xEF,0xAD,0x77,0xB7,0x64,0x9A,0x7A,0xBF,0x5F,0xC1,0x13,0xEF,0x9B,
-0x62,0xFB,0x0D,0x6C,0xE0,0x54,0x69,0x16,0xA9,0x03,0xDA,0x6E,0xE9,0x83,0x93,0x71,
-0x76,0xC6,0x69,0x85,0x82,0x17,0x02,0x03,0x01,0x00,0x01,0xA3,0x42,0x30,0x40,0x30,
-0x0E,0x06,0x03,0x55,0x1D,0x0F,0x01,0x01,0xFF,0x04,0x04,0x03,0x02,0x01,0x06,0x30,
-0x0F,0x06,0x03,0x55,0x1D,0x13,0x01,0x01,0xFF,0x04,0x05,0x30,0x03,0x01,0x01,0xFF,
-0x30,0x1D,0x06,0x03,0x55,0x1D,0x0E,0x04,0x16,0x04,0x14,0x8F,0xF0,0x4B,0x7F,0xA8,
-0x2E,0x45,0x24,0xAE,0x4D,0x50,0xFA,0x63,0x9A,0x8B,0xDE,0xE2,0xDD,0x1B,0xBC,0x30,
-0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x0B,0x05,0x00,0x03,0x82,
-0x01,0x01,0x00,0x4B,0x40,0xDB,0xC0,0x50,0xAA,0xFE,0xC8,0x0C,0xEF,0xF7,0x96,0x54,
-0x45,0x49,0xBB,0x96,0x00,0x09,0x41,0xAC,0xB3,0x13,0x86,0x86,0x28,0x07,0x33,0xCA,
-0x6B,0xE6,0x74,0xB9,0xBA,0x00,0x2D,0xAE,0xA4,0x0A,0xD3,0xF5,0xF1,0xF1,0x0F,0x8A,
-0xBF,0x73,0x67,0x4A,0x83,0xC7,0x44,0x7B,0x78,0xE0,0xAF,0x6E,0x6C,0x6F,0x03,0x29,
-0x8E,0x33,0x39,0x45,0xC3,0x8E,0xE4,0xB9,0x57,0x6C,0xAA,0xFC,0x12,0x96,0xEC,0x53,
-0xC6,0x2D,0xE4,0x24,0x6C,0xB9,0x94,0x63,0xFB,0xDC,0x53,0x68,0x67,0x56,0x3E,0x83,
-0xB8,0xCF,0x35,0x21,0xC3,0xC9,0x68,0xFE,0xCE,0xDA,0xC2,0x53,0xAA,0xCC,0x90,0x8A,
-0xE9,0xF0,0x5D,0x46,0x8C,0x95,0xDD,0x7A,0x58,0x28,0x1A,0x2F,0x1D,0xDE,0xCD,0x00,
-0x37,0x41,0x8F,0xED,0x44,0x6D,0xD7,0x53,0x28,0x97,0x7E,0xF3,0x67,0x04,0x1E,0x15,
-0xD7,0x8A,0x96,0xB4,0xD3,0xDE,0x4C,0x27,0xA4,0x4C,0x1B,0x73,0x73,0x76,0xF4,0x17,
-0x99,0xC2,0x1F,0x7A,0x0E,0xE3,0x2D,0x08,0xAD,0x0A,0x1C,0x2C,0xFF,0x3C,0xAB,0x55,
-0x0E,0x0F,0x91,0x7E,0x36,0xEB,0xC3,0x57,0x49,0xBE,0xE1,0x2E,0x2D,0x7C,0x60,0x8B,
-0xC3,0x41,0x51,0x13,0x23,0x9D,0xCE,0xF7,0x32,0x6B,0x94,0x01,0xA8,0x99,0xE7,0x2C,
-0x33,0x1F,0x3A,0x3B,0x25,0xD2,0x86,0x40,0xCE,0x3B,0x2C,0x86,0x78,0xC9,0x61,0x2F,
-0x14,0xBA,0xEE,0xDB,0x55,0x6F,0xDF,0x84,0xEE,0x05,0x09,0x4D,0xBD,0x28,0xD8,0x72,
-0xCE,0xD3,0x62,0x50,0x65,0x1E,0xEB,0x92,0x97,0x83,0x31,0xD9,0xB3,0xB5,0xCA,0x47,
-0x58,0x3F,0x5F,
-};
-
-
-/* subject:/C=US/O=AffirmTrust/CN=AffirmTrust Networking */
-/* issuer :/C=US/O=AffirmTrust/CN=AffirmTrust Networking */
-
-
-const unsigned char AffirmTrust_Networking_certificate[848]={
-0x30,0x82,0x03,0x4C,0x30,0x82,0x02,0x34,0xA0,0x03,0x02,0x01,0x02,0x02,0x08,0x7C,
-0x4F,0x04,0x39,0x1C,0xD4,0x99,0x2D,0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,
-0x0D,0x01,0x01,0x05,0x05,0x00,0x30,0x44,0x31,0x0B,0x30,0x09,0x06,0x03,0x55,0x04,
-0x06,0x13,0x02,0x55,0x53,0x31,0x14,0x30,0x12,0x06,0x03,0x55,0x04,0x0A,0x0C,0x0B,
-0x41,0x66,0x66,0x69,0x72,0x6D,0x54,0x72,0x75,0x73,0x74,0x31,0x1F,0x30,0x1D,0x06,
-0x03,0x55,0x04,0x03,0x0C,0x16,0x41,0x66,0x66,0x69,0x72,0x6D,0x54,0x72,0x75,0x73,
-0x74,0x20,0x4E,0x65,0x74,0x77,0x6F,0x72,0x6B,0x69,0x6E,0x67,0x30,0x1E,0x17,0x0D,
-0x31,0x30,0x30,0x31,0x32,0x39,0x31,0x34,0x30,0x38,0x32,0x34,0x5A,0x17,0x0D,0x33,
-0x30,0x31,0x32,0x33,0x31,0x31,0x34,0x30,0x38,0x32,0x34,0x5A,0x30,0x44,0x31,0x0B,
-0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x14,0x30,0x12,0x06,
-0x03,0x55,0x04,0x0A,0x0C,0x0B,0x41,0x66,0x66,0x69,0x72,0x6D,0x54,0x72,0x75,0x73,
-0x74,0x31,0x1F,0x30,0x1D,0x06,0x03,0x55,0x04,0x03,0x0C,0x16,0x41,0x66,0x66,0x69,
-0x72,0x6D,0x54,0x72,0x75,0x73,0x74,0x20,0x4E,0x65,0x74,0x77,0x6F,0x72,0x6B,0x69,
-0x6E,0x67,0x30,0x82,0x01,0x22,0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,
-0x01,0x01,0x01,0x05,0x00,0x03,0x82,0x01,0x0F,0x00,0x30,0x82,0x01,0x0A,0x02,0x82,
-0x01,0x01,0x00,0xB4,0x84,0xCC,0x33,0x17,0x2E,0x6B,0x94,0x6C,0x6B,0x61,0x52,0xA0,
-0xEB,0xA3,0xCF,0x79,0x94,0x4C,0xE5,0x94,0x80,0x99,0xCB,0x55,0x64,0x44,0x65,0x8F,
-0x67,0x64,0xE2,0x06,0xE3,0x5C,0x37,0x49,0xF6,0x2F,0x9B,0x84,0x84,0x1E,0x2D,0xF2,
-0x60,0x9D,0x30,0x4E,0xCC,0x84,0x85,0xE2,0x2C,0xCF,0x1E,0x9E,0xFE,0x36,0xAB,0x33,
-0x77,0x35,0x44,0xD8,0x35,0x96,0x1A,0x3D,0x36,0xE8,0x7A,0x0E,0xD8,0xD5,0x47,0xA1,
-0x6A,0x69,0x8B,0xD9,0xFC,0xBB,0x3A,0xAE,0x79,0x5A,0xD5,0xF4,0xD6,0x71,0xBB,0x9A,
-0x90,0x23,0x6B,0x9A,0xB7,0x88,0x74,0x87,0x0C,0x1E,0x5F,0xB9,0x9E,0x2D,0xFA,0xAB,
-0x53,0x2B,0xDC,0xBB,0x76,0x3E,0x93,0x4C,0x08,0x08,0x8C,0x1E,0xA2,0x23,0x1C,0xD4,
-0x6A,0xAD,0x22,0xBA,0x99,0x01,0x2E,0x6D,0x65,0xCB,0xBE,0x24,0x66,0x55,0x24,0x4B,
-0x40,0x44,0xB1,0x1B,0xD7,0xE1,0xC2,0x85,0xC0,0xDE,0x10,0x3F,0x3D,0xED,0xB8,0xFC,
-0xF1,0xF1,0x23,0x53,0xDC,0xBF,0x65,0x97,0x6F,0xD9,0xF9,0x40,0x71,0x8D,0x7D,0xBD,
-0x95,0xD4,0xCE,0xBE,0xA0,0x5E,0x27,0x23,0xDE,0xFD,0xA6,0xD0,0x26,0x0E,0x00,0x29,
-0xEB,0x3C,0x46,0xF0,0x3D,0x60,0xBF,0x3F,0x50,0xD2,0xDC,0x26,0x41,0x51,0x9E,0x14,
-0x37,0x42,0x04,0xA3,0x70,0x57,0xA8,0x1B,0x87,0xED,0x2D,0xFA,0x7B,0xEE,0x8C,0x0A,
-0xE3,0xA9,0x66,0x89,0x19,0xCB,0x41,0xF9,0xDD,0x44,0x36,0x61,0xCF,0xE2,0x77,0x46,
-0xC8,0x7D,0xF6,0xF4,0x92,0x81,0x36,0xFD,0xDB,0x34,0xF1,0x72,0x7E,0xF3,0x0C,0x16,
-0xBD,0xB4,0x15,0x02,0x03,0x01,0x00,0x01,0xA3,0x42,0x30,0x40,0x30,0x1D,0x06,0x03,
-0x55,0x1D,0x0E,0x04,0x16,0x04,0x14,0x07,0x1F,0xD2,0xE7,0x9C,0xDA,0xC2,0x6E,0xA2,
-0x40,0xB4,0xB0,0x7A,0x50,0x10,0x50,0x74,0xC4,0xC8,0xBD,0x30,0x0F,0x06,0x03,0x55,
-0x1D,0x13,0x01,0x01,0xFF,0x04,0x05,0x30,0x03,0x01,0x01,0xFF,0x30,0x0E,0x06,0x03,
-0x55,0x1D,0x0F,0x01,0x01,0xFF,0x04,0x04,0x03,0x02,0x01,0x06,0x30,0x0D,0x06,0x09,
-0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x05,0x05,0x00,0x03,0x82,0x01,0x01,0x00,
-0x89,0x57,0xB2,0x16,0x7A,0xA8,0xC2,0xFD,0xD6,0xD9,0x9B,0x9B,0x34,0xC2,0x9C,0xB4,
-0x32,0x14,0x4D,0xA7,0xA4,0xDF,0xEC,0xBE,0xA7,0xBE,0xF8,0x43,0xDB,0x91,0x37,0xCE,
-0xB4,0x32,0x2E,0x50,0x55,0x1A,0x35,0x4E,0x76,0x43,0x71,0x20,0xEF,0x93,0x77,0x4E,
-0x15,0x70,0x2E,0x87,0xC3,0xC1,0x1D,0x6D,0xDC,0xCB,0xB5,0x27,0xD4,0x2C,0x56,0xD1,
-0x52,0x53,0x3A,0x44,0xD2,0x73,0xC8,0xC4,0x1B,0x05,0x65,0x5A,0x62,0x92,0x9C,0xEE,
-0x41,0x8D,0x31,0xDB,0xE7,0x34,0xEA,0x59,0x21,0xD5,0x01,0x7A,0xD7,0x64,0xB8,0x64,
-0x39,0xCD,0xC9,0xED,0xAF,0xED,0x4B,0x03,0x48,0xA7,0xA0,0x99,0x01,0x80,0xDC,0x65,
-0xA3,0x36,0xAE,0x65,0x59,0x48,0x4F,0x82,0x4B,0xC8,0x65,0xF1,0x57,0x1D,0xE5,0x59,
-0x2E,0x0A,0x3F,0x6C,0xD8,0xD1,0xF5,0xE5,0x09,0xB4,0x6C,0x54,0x00,0x0A,0xE0,0x15,
-0x4D,0x87,0x75,0x6D,0xB7,0x58,0x96,0x5A,0xDD,0x6D,0xD2,0x00,0xA0,0xF4,0x9B,0x48,
-0xBE,0xC3,0x37,0xA4,0xBA,0x36,0xE0,0x7C,0x87,0x85,0x97,0x1A,0x15,0xA2,0xDE,0x2E,
-0xA2,0x5B,0xBD,0xAF,0x18,0xF9,0x90,0x50,0xCD,0x70,0x59,0xF8,0x27,0x67,0x47,0xCB,
-0xC7,0xA0,0x07,0x3A,0x7D,0xD1,0x2C,0x5D,0x6C,0x19,0x3A,0x66,0xB5,0x7D,0xFD,0x91,
-0x6F,0x82,0xB1,0xBE,0x08,0x93,0xDB,0x14,0x47,0xF1,0xA2,0x37,0xC7,0x45,0x9E,0x3C,
-0xC7,0x77,0xAF,0x64,0xA8,0x93,0xDF,0xF6,0x69,0x83,0x82,0x60,0xF2,0x49,0x42,0x34,
-0xED,0x5A,0x00,0x54,0x85,0x1C,0x16,0x36,0x92,0x0C,0x5C,0xFA,0xA6,0xAD,0xBF,0xDB,
-};
-
-
-/* subject:/C=SE/O=AddTrust AB/OU=AddTrust External TTP Network/CN=AddTrust External CA Root */
-/* issuer :/C=SE/O=AddTrust AB/OU=AddTrust External TTP Network/CN=AddTrust External CA Root */
-
-
-const unsigned char AddTrust_External_Root_certificate[1082]={
-0x30,0x82,0x04,0x36,0x30,0x82,0x03,0x1E,0xA0,0x03,0x02,0x01,0x02,0x02,0x01,0x01,
-0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x05,0x05,0x00,0x30,
-0x6F,0x31,0x0B,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x53,0x45,0x31,0x14,
-0x30,0x12,0x06,0x03,0x55,0x04,0x0A,0x13,0x0B,0x41,0x64,0x64,0x54,0x72,0x75,0x73,
-0x74,0x20,0x41,0x42,0x31,0x26,0x30,0x24,0x06,0x03,0x55,0x04,0x0B,0x13,0x1D,0x41,
-0x64,0x64,0x54,0x72,0x75,0x73,0x74,0x20,0x45,0x78,0x74,0x65,0x72,0x6E,0x61,0x6C,
-0x20,0x54,0x54,0x50,0x20,0x4E,0x65,0x74,0x77,0x6F,0x72,0x6B,0x31,0x22,0x30,0x20,
-0x06,0x03,0x55,0x04,0x03,0x13,0x19,0x41,0x64,0x64,0x54,0x72,0x75,0x73,0x74,0x20,
-0x45,0x78,0x74,0x65,0x72,0x6E,0x61,0x6C,0x20,0x43,0x41,0x20,0x52,0x6F,0x6F,0x74,
-0x30,0x1E,0x17,0x0D,0x30,0x30,0x30,0x35,0x33,0x30,0x31,0x30,0x34,0x38,0x33,0x38,
-0x5A,0x17,0x0D,0x32,0x30,0x30,0x35,0x33,0x30,0x31,0x30,0x34,0x38,0x33,0x38,0x5A,
-0x30,0x6F,0x31,0x0B,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x53,0x45,0x31,
-0x14,0x30,0x12,0x06,0x03,0x55,0x04,0x0A,0x13,0x0B,0x41,0x64,0x64,0x54,0x72,0x75,
-0x73,0x74,0x20,0x41,0x42,0x31,0x26,0x30,0x24,0x06,0x03,0x55,0x04,0x0B,0x13,0x1D,
-0x41,0x64,0x64,0x54,0x72,0x75,0x73,0x74,0x20,0x45,0x78,0x74,0x65,0x72,0x6E,0x61,
-0x6C,0x20,0x54,0x54,0x50,0x20,0x4E,0x65,0x74,0x77,0x6F,0x72,0x6B,0x31,0x22,0x30,
-0x20,0x06,0x03,0x55,0x04,0x03,0x13,0x19,0x41,0x64,0x64,0x54,0x72,0x75,0x73,0x74,
-0x20,0x45,0x78,0x74,0x65,0x72,0x6E,0x61,0x6C,0x20,0x43,0x41,0x20,0x52,0x6F,0x6F,
-0x74,0x30,0x82,0x01,0x22,0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,
-0x01,0x01,0x05,0x00,0x03,0x82,0x01,0x0F,0x00,0x30,0x82,0x01,0x0A,0x02,0x82,0x01,
-0x01,0x00,0xB7,0xF7,0x1A,0x33,0xE6,0xF2,0x00,0x04,0x2D,0x39,0xE0,0x4E,0x5B,0xED,
-0x1F,0xBC,0x6C,0x0F,0xCD,0xB5,0xFA,0x23,0xB6,0xCE,0xDE,0x9B,0x11,0x33,0x97,0xA4,
-0x29,0x4C,0x7D,0x93,0x9F,0xBD,0x4A,0xBC,0x93,0xED,0x03,0x1A,0xE3,0x8F,0xCF,0xE5,
-0x6D,0x50,0x5A,0xD6,0x97,0x29,0x94,0x5A,0x80,0xB0,0x49,0x7A,0xDB,0x2E,0x95,0xFD,
-0xB8,0xCA,0xBF,0x37,0x38,0x2D,0x1E,0x3E,0x91,0x41,0xAD,0x70,0x56,0xC7,0xF0,0x4F,
-0x3F,0xE8,0x32,0x9E,0x74,0xCA,0xC8,0x90,0x54,0xE9,0xC6,0x5F,0x0F,0x78,0x9D,0x9A,
-0x40,0x3C,0x0E,0xAC,0x61,0xAA,0x5E,0x14,0x8F,0x9E,0x87,0xA1,0x6A,0x50,0xDC,0xD7,
-0x9A,0x4E,0xAF,0x05,0xB3,0xA6,0x71,0x94,0x9C,0x71,0xB3,0x50,0x60,0x0A,0xC7,0x13,
-0x9D,0x38,0x07,0x86,0x02,0xA8,0xE9,0xA8,0x69,0x26,0x18,0x90,0xAB,0x4C,0xB0,0x4F,
-0x23,0xAB,0x3A,0x4F,0x84,0xD8,0xDF,0xCE,0x9F,0xE1,0x69,0x6F,0xBB,0xD7,0x42,0xD7,
-0x6B,0x44,0xE4,0xC7,0xAD,0xEE,0x6D,0x41,0x5F,0x72,0x5A,0x71,0x08,0x37,0xB3,0x79,
-0x65,0xA4,0x59,0xA0,0x94,0x37,0xF7,0x00,0x2F,0x0D,0xC2,0x92,0x72,0xDA,0xD0,0x38,
-0x72,0xDB,0x14,0xA8,0x45,0xC4,0x5D,0x2A,0x7D,0xB7,0xB4,0xD6,0xC4,0xEE,0xAC,0xCD,
-0x13,0x44,0xB7,0xC9,0x2B,0xDD,0x43,0x00,0x25,0xFA,0x61,0xB9,0x69,0x6A,0x58,0x23,
-0x11,0xB7,0xA7,0x33,0x8F,0x56,0x75,0x59,0xF5,0xCD,0x29,0xD7,0x46,0xB7,0x0A,0x2B,
-0x65,0xB6,0xD3,0x42,0x6F,0x15,0xB2,0xB8,0x7B,0xFB,0xEF,0xE9,0x5D,0x53,0xD5,0x34,
-0x5A,0x27,0x02,0x03,0x01,0x00,0x01,0xA3,0x81,0xDC,0x30,0x81,0xD9,0x30,0x1D,0x06,
-0x03,0x55,0x1D,0x0E,0x04,0x16,0x04,0x14,0xAD,0xBD,0x98,0x7A,0x34,0xB4,0x26,0xF7,
-0xFA,0xC4,0x26,0x54,0xEF,0x03,0xBD,0xE0,0x24,0xCB,0x54,0x1A,0x30,0x0B,0x06,0x03,
-0x55,0x1D,0x0F,0x04,0x04,0x03,0x02,0x01,0x06,0x30,0x0F,0x06,0x03,0x55,0x1D,0x13,
-0x01,0x01,0xFF,0x04,0x05,0x30,0x03,0x01,0x01,0xFF,0x30,0x81,0x99,0x06,0x03,0x55,
-0x1D,0x23,0x04,0x81,0x91,0x30,0x81,0x8E,0x80,0x14,0xAD,0xBD,0x98,0x7A,0x34,0xB4,
-0x26,0xF7,0xFA,0xC4,0x26,0x54,0xEF,0x03,0xBD,0xE0,0x24,0xCB,0x54,0x1A,0xA1,0x73,
-0xA4,0x71,0x30,0x6F,0x31,0x0B,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x53,
-0x45,0x31,0x14,0x30,0x12,0x06,0x03,0x55,0x04,0x0A,0x13,0x0B,0x41,0x64,0x64,0x54,
-0x72,0x75,0x73,0x74,0x20,0x41,0x42,0x31,0x26,0x30,0x24,0x06,0x03,0x55,0x04,0x0B,
-0x13,0x1D,0x41,0x64,0x64,0x54,0x72,0x75,0x73,0x74,0x20,0x45,0x78,0x74,0x65,0x72,
-0x6E,0x61,0x6C,0x20,0x54,0x54,0x50,0x20,0x4E,0x65,0x74,0x77,0x6F,0x72,0x6B,0x31,
-0x22,0x30,0x20,0x06,0x03,0x55,0x04,0x03,0x13,0x19,0x41,0x64,0x64,0x54,0x72,0x75,
-0x73,0x74,0x20,0x45,0x78,0x74,0x65,0x72,0x6E,0x61,0x6C,0x20,0x43,0x41,0x20,0x52,
-0x6F,0x6F,0x74,0x82,0x01,0x01,0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,
-0x01,0x01,0x05,0x05,0x00,0x03,0x82,0x01,0x01,0x00,0xB0,0x9B,0xE0,0x85,0x25,0xC2,
-0xD6,0x23,0xE2,0x0F,0x96,0x06,0x92,0x9D,0x41,0x98,0x9C,0xD9,0x84,0x79,0x81,0xD9,
-0x1E,0x5B,0x14,0x07,0x23,0x36,0x65,0x8F,0xB0,0xD8,0x77,0xBB,0xAC,0x41,0x6C,0x47,
-0x60,0x83,0x51,0xB0,0xF9,0x32,0x3D,0xE7,0xFC,0xF6,0x26,0x13,0xC7,0x80,0x16,0xA5,
-0xBF,0x5A,0xFC,0x87,0xCF,0x78,0x79,0x89,0x21,0x9A,0xE2,0x4C,0x07,0x0A,0x86,0x35,
-0xBC,0xF2,0xDE,0x51,0xC4,0xD2,0x96,0xB7,0xDC,0x7E,0x4E,0xEE,0x70,0xFD,0x1C,0x39,
-0xEB,0x0C,0x02,0x51,0x14,0x2D,0x8E,0xBD,0x16,0xE0,0xC1,0xDF,0x46,0x75,0xE7,0x24,
-0xAD,0xEC,0xF4,0x42,0xB4,0x85,0x93,0x70,0x10,0x67,0xBA,0x9D,0x06,0x35,0x4A,0x18,
-0xD3,0x2B,0x7A,0xCC,0x51,0x42,0xA1,0x7A,0x63,0xD1,0xE6,0xBB,0xA1,0xC5,0x2B,0xC2,
-0x36,0xBE,0x13,0x0D,0xE6,0xBD,0x63,0x7E,0x79,0x7B,0xA7,0x09,0x0D,0x40,0xAB,0x6A,
-0xDD,0x8F,0x8A,0xC3,0xF6,0xF6,0x8C,0x1A,0x42,0x05,0x51,0xD4,0x45,0xF5,0x9F,0xA7,
-0x62,0x21,0x68,0x15,0x20,0x43,0x3C,0x99,0xE7,0x7C,0xBD,0x24,0xD8,0xA9,0x91,0x17,
-0x73,0x88,0x3F,0x56,0x1B,0x31,0x38,0x18,0xB4,0x71,0x0F,0x9A,0xCD,0xC8,0x0E,0x9E,
-0x8E,0x2E,0x1B,0xE1,0x8C,0x98,0x83,0xCB,0x1F,0x31,0xF1,0x44,0x4C,0xC6,0x04,0x73,
-0x49,0x76,0x60,0x0F,0xC7,0xF8,0xBD,0x17,0x80,0x6B,0x2E,0xE9,0xCC,0x4C,0x0E,0x5A,
-0x9A,0x79,0x0F,0x20,0x0A,0x2E,0xD5,0x9E,0x63,0x26,0x1E,0x55,0x92,0x94,0xD8,0x82,
-0x17,0x5A,0x7B,0xD0,0xBC,0xC7,0x8F,0x4E,0x86,0x04,
-};
-
-
-/* subject:/C=US/O=thawte, Inc./OU=Certification Services Division/OU=(c) 2008 thawte, Inc. - For authorized use only/CN=thawte Primary Root CA - G3 */
-/* issuer :/C=US/O=thawte, Inc./OU=Certification Services Division/OU=(c) 2008 thawte, Inc. - For authorized use only/CN=thawte Primary Root CA - G3 */
-
-
-const unsigned char thawte_Primary_Root_CA___G3_certificate[1070]={
-0x30,0x82,0x04,0x2A,0x30,0x82,0x03,0x12,0xA0,0x03,0x02,0x01,0x02,0x02,0x10,0x60,
-0x01,0x97,0xB7,0x46,0xA7,0xEA,0xB4,0xB4,0x9A,0xD6,0x4B,0x2F,0xF7,0x90,0xFB,0x30,
-0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x0B,0x05,0x00,0x30,0x81,
-0xAE,0x31,0x0B,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x15,
-0x30,0x13,0x06,0x03,0x55,0x04,0x0A,0x13,0x0C,0x74,0x68,0x61,0x77,0x74,0x65,0x2C,
-0x20,0x49,0x6E,0x63,0x2E,0x31,0x28,0x30,0x26,0x06,0x03,0x55,0x04,0x0B,0x13,0x1F,
-0x43,0x65,0x72,0x74,0x69,0x66,0x69,0x63,0x61,0x74,0x69,0x6F,0x6E,0x20,0x53,0x65,
-0x72,0x76,0x69,0x63,0x65,0x73,0x20,0x44,0x69,0x76,0x69,0x73,0x69,0x6F,0x6E,0x31,
-0x38,0x30,0x36,0x06,0x03,0x55,0x04,0x0B,0x13,0x2F,0x28,0x63,0x29,0x20,0x32,0x30,
-0x30,0x38,0x20,0x74,0x68,0x61,0x77,0x74,0x65,0x2C,0x20,0x49,0x6E,0x63,0x2E,0x20,
-0x2D,0x20,0x46,0x6F,0x72,0x20,0x61,0x75,0x74,0x68,0x6F,0x72,0x69,0x7A,0x65,0x64,
-0x20,0x75,0x73,0x65,0x20,0x6F,0x6E,0x6C,0x79,0x31,0x24,0x30,0x22,0x06,0x03,0x55,
-0x04,0x03,0x13,0x1B,0x74,0x68,0x61,0x77,0x74,0x65,0x20,0x50,0x72,0x69,0x6D,0x61,
-0x72,0x79,0x20,0x52,0x6F,0x6F,0x74,0x20,0x43,0x41,0x20,0x2D,0x20,0x47,0x33,0x30,
-0x1E,0x17,0x0D,0x30,0x38,0x30,0x34,0x30,0x32,0x30,0x30,0x30,0x30,0x30,0x30,0x5A,
-0x17,0x0D,0x33,0x37,0x31,0x32,0x30,0x31,0x32,0x33,0x35,0x39,0x35,0x39,0x5A,0x30,
-0x81,0xAE,0x31,0x0B,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,
-0x15,0x30,0x13,0x06,0x03,0x55,0x04,0x0A,0x13,0x0C,0x74,0x68,0x61,0x77,0x74,0x65,
-0x2C,0x20,0x49,0x6E,0x63,0x2E,0x31,0x28,0x30,0x26,0x06,0x03,0x55,0x04,0x0B,0x13,
-0x1F,0x43,0x65,0x72,0x74,0x69,0x66,0x69,0x63,0x61,0x74,0x69,0x6F,0x6E,0x20,0x53,
-0x65,0x72,0x76,0x69,0x63,0x65,0x73,0x20,0x44,0x69,0x76,0x69,0x73,0x69,0x6F,0x6E,
-0x31,0x38,0x30,0x36,0x06,0x03,0x55,0x04,0x0B,0x13,0x2F,0x28,0x63,0x29,0x20,0x32,
-0x30,0x30,0x38,0x20,0x74,0x68,0x61,0x77,0x74,0x65,0x2C,0x20,0x49,0x6E,0x63,0x2E,
-0x20,0x2D,0x20,0x46,0x6F,0x72,0x20,0x61,0x75,0x74,0x68,0x6F,0x72,0x69,0x7A,0x65,
-0x64,0x20,0x75,0x73,0x65,0x20,0x6F,0x6E,0x6C,0x79,0x31,0x24,0x30,0x22,0x06,0x03,
-0x55,0x04,0x03,0x13,0x1B,0x74,0x68,0x61,0x77,0x74,0x65,0x20,0x50,0x72,0x69,0x6D,
-0x61,0x72,0x79,0x20,0x52,0x6F,0x6F,0x74,0x20,0x43,0x41,0x20,0x2D,0x20,0x47,0x33,
-0x30,0x82,0x01,0x22,0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,
-0x01,0x05,0x00,0x03,0x82,0x01,0x0F,0x00,0x30,0x82,0x01,0x0A,0x02,0x82,0x01,0x01,
-0x00,0xB2,0xBF,0x27,0x2C,0xFB,0xDB,0xD8,0x5B,0xDD,0x78,0x7B,0x1B,0x9E,0x77,0x66,
-0x81,0xCB,0x3E,0xBC,0x7C,0xAE,0xF3,0xA6,0x27,0x9A,0x34,0xA3,0x68,0x31,0x71,0x38,
-0x33,0x62,0xE4,0xF3,0x71,0x66,0x79,0xB1,0xA9,0x65,0xA3,0xA5,0x8B,0xD5,0x8F,0x60,
-0x2D,0x3F,0x42,0xCC,0xAA,0x6B,0x32,0xC0,0x23,0xCB,0x2C,0x41,0xDD,0xE4,0xDF,0xFC,
-0x61,0x9C,0xE2,0x73,0xB2,0x22,0x95,0x11,0x43,0x18,0x5F,0xC4,0xB6,0x1F,0x57,0x6C,
-0x0A,0x05,0x58,0x22,0xC8,0x36,0x4C,0x3A,0x7C,0xA5,0xD1,0xCF,0x86,0xAF,0x88,0xA7,
-0x44,0x02,0x13,0x74,0x71,0x73,0x0A,0x42,0x59,0x02,0xF8,0x1B,0x14,0x6B,0x42,0xDF,
-0x6F,0x5F,0xBA,0x6B,0x82,0xA2,0x9D,0x5B,0xE7,0x4A,0xBD,0x1E,0x01,0x72,0xDB,0x4B,
-0x74,0xE8,0x3B,0x7F,0x7F,0x7D,0x1F,0x04,0xB4,0x26,0x9B,0xE0,0xB4,0x5A,0xAC,0x47,
-0x3D,0x55,0xB8,0xD7,0xB0,0x26,0x52,0x28,0x01,0x31,0x40,0x66,0xD8,0xD9,0x24,0xBD,
-0xF6,0x2A,0xD8,0xEC,0x21,0x49,0x5C,0x9B,0xF6,0x7A,0xE9,0x7F,0x55,0x35,0x7E,0x96,
-0x6B,0x8D,0x93,0x93,0x27,0xCB,0x92,0xBB,0xEA,0xAC,0x40,0xC0,0x9F,0xC2,0xF8,0x80,
-0xCF,0x5D,0xF4,0x5A,0xDC,0xCE,0x74,0x86,0xA6,0x3E,0x6C,0x0B,0x53,0xCA,0xBD,0x92,
-0xCE,0x19,0x06,0x72,0xE6,0x0C,0x5C,0x38,0x69,0xC7,0x04,0xD6,0xBC,0x6C,0xCE,0x5B,
-0xF6,0xF7,0x68,0x9C,0xDC,0x25,0x15,0x48,0x88,0xA1,0xE9,0xA9,0xF8,0x98,0x9C,0xE0,
-0xF3,0xD5,0x31,0x28,0x61,0x11,0x6C,0x67,0x96,0x8D,0x39,0x99,0xCB,0xC2,0x45,0x24,
-0x39,0x02,0x03,0x01,0x00,0x01,0xA3,0x42,0x30,0x40,0x30,0x0F,0x06,0x03,0x55,0x1D,
-0x13,0x01,0x01,0xFF,0x04,0x05,0x30,0x03,0x01,0x01,0xFF,0x30,0x0E,0x06,0x03,0x55,
-0x1D,0x0F,0x01,0x01,0xFF,0x04,0x04,0x03,0x02,0x01,0x06,0x30,0x1D,0x06,0x03,0x55,
-0x1D,0x0E,0x04,0x16,0x04,0x14,0xAD,0x6C,0xAA,0x94,0x60,0x9C,0xED,0xE4,0xFF,0xFA,
-0x3E,0x0A,0x74,0x2B,0x63,0x03,0xF7,0xB6,0x59,0xBF,0x30,0x0D,0x06,0x09,0x2A,0x86,
-0x48,0x86,0xF7,0x0D,0x01,0x01,0x0B,0x05,0x00,0x03,0x82,0x01,0x01,0x00,0x1A,0x40,
-0xD8,0x95,0x65,0xAC,0x09,0x92,0x89,0xC6,0x39,0xF4,0x10,0xE5,0xA9,0x0E,0x66,0x53,
-0x5D,0x78,0xDE,0xFA,0x24,0x91,0xBB,0xE7,0x44,0x51,0xDF,0xC6,0x16,0x34,0x0A,0xEF,
-0x6A,0x44,0x51,0xEA,0x2B,0x07,0x8A,0x03,0x7A,0xC3,0xEB,0x3F,0x0A,0x2C,0x52,0x16,
-0xA0,0x2B,0x43,0xB9,0x25,0x90,0x3F,0x70,0xA9,0x33,0x25,0x6D,0x45,0x1A,0x28,0x3B,
-0x27,0xCF,0xAA,0xC3,0x29,0x42,0x1B,0xDF,0x3B,0x4C,0xC0,0x33,0x34,0x5B,0x41,0x88,
-0xBF,0x6B,0x2B,0x65,0xAF,0x28,0xEF,0xB2,0xF5,0xC3,0xAA,0x66,0xCE,0x7B,0x56,0xEE,
-0xB7,0xC8,0xCB,0x67,0xC1,0xC9,0x9C,0x1A,0x18,0xB8,0xC4,0xC3,0x49,0x03,0xF1,0x60,
-0x0E,0x50,0xCD,0x46,0xC5,0xF3,0x77,0x79,0xF7,0xB6,0x15,0xE0,0x38,0xDB,0xC7,0x2F,
-0x28,0xA0,0x0C,0x3F,0x77,0x26,0x74,0xD9,0x25,0x12,0xDA,0x31,0xDA,0x1A,0x1E,0xDC,
-0x29,0x41,0x91,0x22,0x3C,0x69,0xA7,0xBB,0x02,0xF2,0xB6,0x5C,0x27,0x03,0x89,0xF4,
-0x06,0xEA,0x9B,0xE4,0x72,0x82,0xE3,0xA1,0x09,0xC1,0xE9,0x00,0x19,0xD3,0x3E,0xD4,
-0x70,0x6B,0xBA,0x71,0xA6,0xAA,0x58,0xAE,0xF4,0xBB,0xE9,0x6C,0xB6,0xEF,0x87,0xCC,
-0x9B,0xBB,0xFF,0x39,0xE6,0x56,0x61,0xD3,0x0A,0xA7,0xC4,0x5C,0x4C,0x60,0x7B,0x05,
-0x77,0x26,0x7A,0xBF,0xD8,0x07,0x52,0x2C,0x62,0xF7,0x70,0x63,0xD9,0x39,0xBC,0x6F,
-0x1C,0xC2,0x79,0xDC,0x76,0x29,0xAF,0xCE,0xC5,0x2C,0x64,0x04,0x5E,0x88,0x36,0x6E,
-0x31,0xD4,0x40,0x1A,0x62,0x34,0x36,0x3F,0x35,0x01,0xAE,0xAC,0x63,0xA0,
-};
-
-
-/* subject:/C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert Assured ID Root CA */
-/* issuer :/C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert Assured ID Root CA */
-
-
-const unsigned char DigiCert_Assured_ID_Root_CA_certificate[955]={
-0x30,0x82,0x03,0xB7,0x30,0x82,0x02,0x9F,0xA0,0x03,0x02,0x01,0x02,0x02,0x10,0x0C,
-0xE7,0xE0,0xE5,0x17,0xD8,0x46,0xFE,0x8F,0xE5,0x60,0xFC,0x1B,0xF0,0x30,0x39,0x30,
-0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x05,0x05,0x00,0x30,0x65,
-0x31,0x0B,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x15,0x30,
-0x13,0x06,0x03,0x55,0x04,0x0A,0x13,0x0C,0x44,0x69,0x67,0x69,0x43,0x65,0x72,0x74,
-0x20,0x49,0x6E,0x63,0x31,0x19,0x30,0x17,0x06,0x03,0x55,0x04,0x0B,0x13,0x10,0x77,
-0x77,0x77,0x2E,0x64,0x69,0x67,0x69,0x63,0x65,0x72,0x74,0x2E,0x63,0x6F,0x6D,0x31,
-0x24,0x30,0x22,0x06,0x03,0x55,0x04,0x03,0x13,0x1B,0x44,0x69,0x67,0x69,0x43,0x65,
-0x72,0x74,0x20,0x41,0x73,0x73,0x75,0x72,0x65,0x64,0x20,0x49,0x44,0x20,0x52,0x6F,
-0x6F,0x74,0x20,0x43,0x41,0x30,0x1E,0x17,0x0D,0x30,0x36,0x31,0x31,0x31,0x30,0x30,
-0x30,0x30,0x30,0x30,0x30,0x5A,0x17,0x0D,0x33,0x31,0x31,0x31,0x31,0x30,0x30,0x30,
-0x30,0x30,0x30,0x30,0x5A,0x30,0x65,0x31,0x0B,0x30,0x09,0x06,0x03,0x55,0x04,0x06,
-0x13,0x02,0x55,0x53,0x31,0x15,0x30,0x13,0x06,0x03,0x55,0x04,0x0A,0x13,0x0C,0x44,
-0x69,0x67,0x69,0x43,0x65,0x72,0x74,0x20,0x49,0x6E,0x63,0x31,0x19,0x30,0x17,0x06,
-0x03,0x55,0x04,0x0B,0x13,0x10,0x77,0x77,0x77,0x2E,0x64,0x69,0x67,0x69,0x63,0x65,
-0x72,0x74,0x2E,0x63,0x6F,0x6D,0x31,0x24,0x30,0x22,0x06,0x03,0x55,0x04,0x03,0x13,
-0x1B,0x44,0x69,0x67,0x69,0x43,0x65,0x72,0x74,0x20,0x41,0x73,0x73,0x75,0x72,0x65,
-0x64,0x20,0x49,0x44,0x20,0x52,0x6F,0x6F,0x74,0x20,0x43,0x41,0x30,0x82,0x01,0x22,
-0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x01,0x05,0x00,0x03,
-0x82,0x01,0x0F,0x00,0x30,0x82,0x01,0x0A,0x02,0x82,0x01,0x01,0x00,0xAD,0x0E,0x15,
-0xCE,0xE4,0x43,0x80,0x5C,0xB1,0x87,0xF3,0xB7,0x60,0xF9,0x71,0x12,0xA5,0xAE,0xDC,
-0x26,0x94,0x88,0xAA,0xF4,0xCE,0xF5,0x20,0x39,0x28,0x58,0x60,0x0C,0xF8,0x80,0xDA,
-0xA9,0x15,0x95,0x32,0x61,0x3C,0xB5,0xB1,0x28,0x84,0x8A,0x8A,0xDC,0x9F,0x0A,0x0C,
-0x83,0x17,0x7A,0x8F,0x90,0xAC,0x8A,0xE7,0x79,0x53,0x5C,0x31,0x84,0x2A,0xF6,0x0F,
-0x98,0x32,0x36,0x76,0xCC,0xDE,0xDD,0x3C,0xA8,0xA2,0xEF,0x6A,0xFB,0x21,0xF2,0x52,
-0x61,0xDF,0x9F,0x20,0xD7,0x1F,0xE2,0xB1,0xD9,0xFE,0x18,0x64,0xD2,0x12,0x5B,0x5F,
-0xF9,0x58,0x18,0x35,0xBC,0x47,0xCD,0xA1,0x36,0xF9,0x6B,0x7F,0xD4,0xB0,0x38,0x3E,
-0xC1,0x1B,0xC3,0x8C,0x33,0xD9,0xD8,0x2F,0x18,0xFE,0x28,0x0F,0xB3,0xA7,0x83,0xD6,
-0xC3,0x6E,0x44,0xC0,0x61,0x35,0x96,0x16,0xFE,0x59,0x9C,0x8B,0x76,0x6D,0xD7,0xF1,
-0xA2,0x4B,0x0D,0x2B,0xFF,0x0B,0x72,0xDA,0x9E,0x60,0xD0,0x8E,0x90,0x35,0xC6,0x78,
-0x55,0x87,0x20,0xA1,0xCF,0xE5,0x6D,0x0A,0xC8,0x49,0x7C,0x31,0x98,0x33,0x6C,0x22,
-0xE9,0x87,0xD0,0x32,0x5A,0xA2,0xBA,0x13,0x82,0x11,0xED,0x39,0x17,0x9D,0x99,0x3A,
-0x72,0xA1,0xE6,0xFA,0xA4,0xD9,0xD5,0x17,0x31,0x75,0xAE,0x85,0x7D,0x22,0xAE,0x3F,
-0x01,0x46,0x86,0xF6,0x28,0x79,0xC8,0xB1,0xDA,0xE4,0x57,0x17,0xC4,0x7E,0x1C,0x0E,
-0xB0,0xB4,0x92,0xA6,0x56,0xB3,0xBD,0xB2,0x97,0xED,0xAA,0xA7,0xF0,0xB7,0xC5,0xA8,
-0x3F,0x95,0x16,0xD0,0xFF,0xA1,0x96,0xEB,0x08,0x5F,0x18,0x77,0x4F,0x02,0x03,0x01,
-0x00,0x01,0xA3,0x63,0x30,0x61,0x30,0x0E,0x06,0x03,0x55,0x1D,0x0F,0x01,0x01,0xFF,
-0x04,0x04,0x03,0x02,0x01,0x86,0x30,0x0F,0x06,0x03,0x55,0x1D,0x13,0x01,0x01,0xFF,
-0x04,0x05,0x30,0x03,0x01,0x01,0xFF,0x30,0x1D,0x06,0x03,0x55,0x1D,0x0E,0x04,0x16,
-0x04,0x14,0x45,0xEB,0xA2,0xAF,0xF4,0x92,0xCB,0x82,0x31,0x2D,0x51,0x8B,0xA7,0xA7,
-0x21,0x9D,0xF3,0x6D,0xC8,0x0F,0x30,0x1F,0x06,0x03,0x55,0x1D,0x23,0x04,0x18,0x30,
-0x16,0x80,0x14,0x45,0xEB,0xA2,0xAF,0xF4,0x92,0xCB,0x82,0x31,0x2D,0x51,0x8B,0xA7,
-0xA7,0x21,0x9D,0xF3,0x6D,0xC8,0x0F,0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,
-0x0D,0x01,0x01,0x05,0x05,0x00,0x03,0x82,0x01,0x01,0x00,0xA2,0x0E,0xBC,0xDF,0xE2,
-0xED,0xF0,0xE3,0x72,0x73,0x7A,0x64,0x94,0xBF,0xF7,0x72,0x66,0xD8,0x32,0xE4,0x42,
-0x75,0x62,0xAE,0x87,0xEB,0xF2,0xD5,0xD9,0xDE,0x56,0xB3,0x9F,0xCC,0xCE,0x14,0x28,
-0xB9,0x0D,0x97,0x60,0x5C,0x12,0x4C,0x58,0xE4,0xD3,0x3D,0x83,0x49,0x45,0x58,0x97,
-0x35,0x69,0x1A,0xA8,0x47,0xEA,0x56,0xC6,0x79,0xAB,0x12,0xD8,0x67,0x81,0x84,0xDF,
-0x7F,0x09,0x3C,0x94,0xE6,0xB8,0x26,0x2C,0x20,0xBD,0x3D,0xB3,0x28,0x89,0xF7,0x5F,
-0xFF,0x22,0xE2,0x97,0x84,0x1F,0xE9,0x65,0xEF,0x87,0xE0,0xDF,0xC1,0x67,0x49,0xB3,
-0x5D,0xEB,0xB2,0x09,0x2A,0xEB,0x26,0xED,0x78,0xBE,0x7D,0x3F,0x2B,0xF3,0xB7,0x26,
-0x35,0x6D,0x5F,0x89,0x01,0xB6,0x49,0x5B,0x9F,0x01,0x05,0x9B,0xAB,0x3D,0x25,0xC1,
-0xCC,0xB6,0x7F,0xC2,0xF1,0x6F,0x86,0xC6,0xFA,0x64,0x68,0xEB,0x81,0x2D,0x94,0xEB,
-0x42,0xB7,0xFA,0x8C,0x1E,0xDD,0x62,0xF1,0xBE,0x50,0x67,0xB7,0x6C,0xBD,0xF3,0xF1,
-0x1F,0x6B,0x0C,0x36,0x07,0x16,0x7F,0x37,0x7C,0xA9,0x5B,0x6D,0x7A,0xF1,0x12,0x46,
-0x60,0x83,0xD7,0x27,0x04,0xBE,0x4B,0xCE,0x97,0xBE,0xC3,0x67,0x2A,0x68,0x11,0xDF,
-0x80,0xE7,0x0C,0x33,0x66,0xBF,0x13,0x0D,0x14,0x6E,0xF3,0x7F,0x1F,0x63,0x10,0x1E,
-0xFA,0x8D,0x1B,0x25,0x6D,0x6C,0x8F,0xA5,0xB7,0x61,0x01,0xB1,0xD2,0xA3,0x26,0xA1,
-0x10,0x71,0x9D,0xAD,0xE2,0xC3,0xF9,0xC3,0x99,0x51,0xB7,0x2B,0x07,0x08,0xCE,0x2E,
-0xE6,0x50,0xB2,0xA7,0xFA,0x0A,0x45,0x2F,0xA2,0xF0,0xF2,
-};
-
-
-/* subject:/C=US/O=The Go Daddy Group, Inc./OU=Go Daddy Class 2 Certification Authority */
-/* issuer :/C=US/O=The Go Daddy Group, Inc./OU=Go Daddy Class 2 Certification Authority */
-
-
-const unsigned char Go_Daddy_Class_2_CA_certificate[1028]={
-0x30,0x82,0x04,0x00,0x30,0x82,0x02,0xE8,0xA0,0x03,0x02,0x01,0x02,0x02,0x01,0x00,
-0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x05,0x05,0x00,0x30,
-0x63,0x31,0x0B,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x21,
-0x30,0x1F,0x06,0x03,0x55,0x04,0x0A,0x13,0x18,0x54,0x68,0x65,0x20,0x47,0x6F,0x20,
-0x44,0x61,0x64,0x64,0x79,0x20,0x47,0x72,0x6F,0x75,0x70,0x2C,0x20,0x49,0x6E,0x63,
-0x2E,0x31,0x31,0x30,0x2F,0x06,0x03,0x55,0x04,0x0B,0x13,0x28,0x47,0x6F,0x20,0x44,
-0x61,0x64,0x64,0x79,0x20,0x43,0x6C,0x61,0x73,0x73,0x20,0x32,0x20,0x43,0x65,0x72,
-0x74,0x69,0x66,0x69,0x63,0x61,0x74,0x69,0x6F,0x6E,0x20,0x41,0x75,0x74,0x68,0x6F,
-0x72,0x69,0x74,0x79,0x30,0x1E,0x17,0x0D,0x30,0x34,0x30,0x36,0x32,0x39,0x31,0x37,
-0x30,0x36,0x32,0x30,0x5A,0x17,0x0D,0x33,0x34,0x30,0x36,0x32,0x39,0x31,0x37,0x30,
-0x36,0x32,0x30,0x5A,0x30,0x63,0x31,0x0B,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,
-0x02,0x55,0x53,0x31,0x21,0x30,0x1F,0x06,0x03,0x55,0x04,0x0A,0x13,0x18,0x54,0x68,
-0x65,0x20,0x47,0x6F,0x20,0x44,0x61,0x64,0x64,0x79,0x20,0x47,0x72,0x6F,0x75,0x70,
-0x2C,0x20,0x49,0x6E,0x63,0x2E,0x31,0x31,0x30,0x2F,0x06,0x03,0x55,0x04,0x0B,0x13,
-0x28,0x47,0x6F,0x20,0x44,0x61,0x64,0x64,0x79,0x20,0x43,0x6C,0x61,0x73,0x73,0x20,
-0x32,0x20,0x43,0x65,0x72,0x74,0x69,0x66,0x69,0x63,0x61,0x74,0x69,0x6F,0x6E,0x20,
-0x41,0x75,0x74,0x68,0x6F,0x72,0x69,0x74,0x79,0x30,0x82,0x01,0x20,0x30,0x0D,0x06,
-0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x01,0x05,0x00,0x03,0x82,0x01,0x0D,
-0x00,0x30,0x82,0x01,0x08,0x02,0x82,0x01,0x01,0x00,0xDE,0x9D,0xD7,0xEA,0x57,0x18,
-0x49,0xA1,0x5B,0xEB,0xD7,0x5F,0x48,0x86,0xEA,0xBE,0xDD,0xFF,0xE4,0xEF,0x67,0x1C,
-0xF4,0x65,0x68,0xB3,0x57,0x71,0xA0,0x5E,0x77,0xBB,0xED,0x9B,0x49,0xE9,0x70,0x80,
-0x3D,0x56,0x18,0x63,0x08,0x6F,0xDA,0xF2,0xCC,0xD0,0x3F,0x7F,0x02,0x54,0x22,0x54,
-0x10,0xD8,0xB2,0x81,0xD4,0xC0,0x75,0x3D,0x4B,0x7F,0xC7,0x77,0xC3,0x3E,0x78,0xAB,
-0x1A,0x03,0xB5,0x20,0x6B,0x2F,0x6A,0x2B,0xB1,0xC5,0x88,0x7E,0xC4,0xBB,0x1E,0xB0,
-0xC1,0xD8,0x45,0x27,0x6F,0xAA,0x37,0x58,0xF7,0x87,0x26,0xD7,0xD8,0x2D,0xF6,0xA9,
-0x17,0xB7,0x1F,0x72,0x36,0x4E,0xA6,0x17,0x3F,0x65,0x98,0x92,0xDB,0x2A,0x6E,0x5D,
-0xA2,0xFE,0x88,0xE0,0x0B,0xDE,0x7F,0xE5,0x8D,0x15,0xE1,0xEB,0xCB,0x3A,0xD5,0xE2,
-0x12,0xA2,0x13,0x2D,0xD8,0x8E,0xAF,0x5F,0x12,0x3D,0xA0,0x08,0x05,0x08,0xB6,0x5C,
-0xA5,0x65,0x38,0x04,0x45,0x99,0x1E,0xA3,0x60,0x60,0x74,0xC5,0x41,0xA5,0x72,0x62,
-0x1B,0x62,0xC5,0x1F,0x6F,0x5F,0x1A,0x42,0xBE,0x02,0x51,0x65,0xA8,0xAE,0x23,0x18,
-0x6A,0xFC,0x78,0x03,0xA9,0x4D,0x7F,0x80,0xC3,0xFA,0xAB,0x5A,0xFC,0xA1,0x40,0xA4,
-0xCA,0x19,0x16,0xFE,0xB2,0xC8,0xEF,0x5E,0x73,0x0D,0xEE,0x77,0xBD,0x9A,0xF6,0x79,
-0x98,0xBC,0xB1,0x07,0x67,0xA2,0x15,0x0D,0xDD,0xA0,0x58,0xC6,0x44,0x7B,0x0A,0x3E,
-0x62,0x28,0x5F,0xBA,0x41,0x07,0x53,0x58,0xCF,0x11,0x7E,0x38,0x74,0xC5,0xF8,0xFF,
-0xB5,0x69,0x90,0x8F,0x84,0x74,0xEA,0x97,0x1B,0xAF,0x02,0x01,0x03,0xA3,0x81,0xC0,
-0x30,0x81,0xBD,0x30,0x1D,0x06,0x03,0x55,0x1D,0x0E,0x04,0x16,0x04,0x14,0xD2,0xC4,
-0xB0,0xD2,0x91,0xD4,0x4C,0x11,0x71,0xB3,0x61,0xCB,0x3D,0xA1,0xFE,0xDD,0xA8,0x6A,
-0xD4,0xE3,0x30,0x81,0x8D,0x06,0x03,0x55,0x1D,0x23,0x04,0x81,0x85,0x30,0x81,0x82,
-0x80,0x14,0xD2,0xC4,0xB0,0xD2,0x91,0xD4,0x4C,0x11,0x71,0xB3,0x61,0xCB,0x3D,0xA1,
-0xFE,0xDD,0xA8,0x6A,0xD4,0xE3,0xA1,0x67,0xA4,0x65,0x30,0x63,0x31,0x0B,0x30,0x09,
-0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x21,0x30,0x1F,0x06,0x03,0x55,
-0x04,0x0A,0x13,0x18,0x54,0x68,0x65,0x20,0x47,0x6F,0x20,0x44,0x61,0x64,0x64,0x79,
-0x20,0x47,0x72,0x6F,0x75,0x70,0x2C,0x20,0x49,0x6E,0x63,0x2E,0x31,0x31,0x30,0x2F,
-0x06,0x03,0x55,0x04,0x0B,0x13,0x28,0x47,0x6F,0x20,0x44,0x61,0x64,0x64,0x79,0x20,
-0x43,0x6C,0x61,0x73,0x73,0x20,0x32,0x20,0x43,0x65,0x72,0x74,0x69,0x66,0x69,0x63,
-0x61,0x74,0x69,0x6F,0x6E,0x20,0x41,0x75,0x74,0x68,0x6F,0x72,0x69,0x74,0x79,0x82,
-0x01,0x00,0x30,0x0C,0x06,0x03,0x55,0x1D,0x13,0x04,0x05,0x30,0x03,0x01,0x01,0xFF,
-0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x05,0x05,0x00,0x03,
-0x82,0x01,0x01,0x00,0x32,0x4B,0xF3,0xB2,0xCA,0x3E,0x91,0xFC,0x12,0xC6,0xA1,0x07,
-0x8C,0x8E,0x77,0xA0,0x33,0x06,0x14,0x5C,0x90,0x1E,0x18,0xF7,0x08,0xA6,0x3D,0x0A,
-0x19,0xF9,0x87,0x80,0x11,0x6E,0x69,0xE4,0x96,0x17,0x30,0xFF,0x34,0x91,0x63,0x72,
-0x38,0xEE,0xCC,0x1C,0x01,0xA3,0x1D,0x94,0x28,0xA4,0x31,0xF6,0x7A,0xC4,0x54,0xD7,
-0xF6,0xE5,0x31,0x58,0x03,0xA2,0xCC,0xCE,0x62,0xDB,0x94,0x45,0x73,0xB5,0xBF,0x45,
-0xC9,0x24,0xB5,0xD5,0x82,0x02,0xAD,0x23,0x79,0x69,0x8D,0xB8,0xB6,0x4D,0xCE,0xCF,
-0x4C,0xCA,0x33,0x23,0xE8,0x1C,0x88,0xAA,0x9D,0x8B,0x41,0x6E,0x16,0xC9,0x20,0xE5,
-0x89,0x9E,0xCD,0x3B,0xDA,0x70,0xF7,0x7E,0x99,0x26,0x20,0x14,0x54,0x25,0xAB,0x6E,
-0x73,0x85,0xE6,0x9B,0x21,0x9D,0x0A,0x6C,0x82,0x0E,0xA8,0xF8,0xC2,0x0C,0xFA,0x10,
-0x1E,0x6C,0x96,0xEF,0x87,0x0D,0xC4,0x0F,0x61,0x8B,0xAD,0xEE,0x83,0x2B,0x95,0xF8,
-0x8E,0x92,0x84,0x72,0x39,0xEB,0x20,0xEA,0x83,0xED,0x83,0xCD,0x97,0x6E,0x08,0xBC,
-0xEB,0x4E,0x26,0xB6,0x73,0x2B,0xE4,0xD3,0xF6,0x4C,0xFE,0x26,0x71,0xE2,0x61,0x11,
-0x74,0x4A,0xFF,0x57,0x1A,0x87,0x0F,0x75,0x48,0x2E,0xCF,0x51,0x69,0x17,0xA0,0x02,
-0x12,0x61,0x95,0xD5,0xD1,0x40,0xB2,0x10,0x4C,0xEE,0xC4,0xAC,0x10,0x43,0xA6,0xA5,
-0x9E,0x0A,0xD5,0x95,0x62,0x9A,0x0D,0xCF,0x88,0x82,0xC5,0x32,0x0C,0xE4,0x2B,0x9F,
-0x45,0xE6,0x0D,0x9F,0x28,0x9C,0xB1,0xB9,0x2A,0x5A,0x57,0xAD,0x37,0x0F,0xAF,0x1D,
-0x7F,0xDB,0xBD,0x9F,
-};
-
-
-/* subject:/C=US/O=GeoTrust Inc./CN=GeoTrust Primary Certification Authority */
-/* issuer :/C=US/O=GeoTrust Inc./CN=GeoTrust Primary Certification Authority */
-
-
-const unsigned char GeoTrust_Primary_Certification_Authority_certificate[896]={
-0x30,0x82,0x03,0x7C,0x30,0x82,0x02,0x64,0xA0,0x03,0x02,0x01,0x02,0x02,0x10,0x18,
-0xAC,0xB5,0x6A,0xFD,0x69,0xB6,0x15,0x3A,0x63,0x6C,0xAF,0xDA,0xFA,0xC4,0xA1,0x30,
-0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x05,0x05,0x00,0x30,0x58,
-0x31,0x0B,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x16,0x30,
-0x14,0x06,0x03,0x55,0x04,0x0A,0x13,0x0D,0x47,0x65,0x6F,0x54,0x72,0x75,0x73,0x74,
-0x20,0x49,0x6E,0x63,0x2E,0x31,0x31,0x30,0x2F,0x06,0x03,0x55,0x04,0x03,0x13,0x28,
-0x47,0x65,0x6F,0x54,0x72,0x75,0x73,0x74,0x20,0x50,0x72,0x69,0x6D,0x61,0x72,0x79,
-0x20,0x43,0x65,0x72,0x74,0x69,0x66,0x69,0x63,0x61,0x74,0x69,0x6F,0x6E,0x20,0x41,
-0x75,0x74,0x68,0x6F,0x72,0x69,0x74,0x79,0x30,0x1E,0x17,0x0D,0x30,0x36,0x31,0x31,
-0x32,0x37,0x30,0x30,0x30,0x30,0x30,0x30,0x5A,0x17,0x0D,0x33,0x36,0x30,0x37,0x31,
-0x36,0x32,0x33,0x35,0x39,0x35,0x39,0x5A,0x30,0x58,0x31,0x0B,0x30,0x09,0x06,0x03,
-0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x16,0x30,0x14,0x06,0x03,0x55,0x04,0x0A,
-0x13,0x0D,0x47,0x65,0x6F,0x54,0x72,0x75,0x73,0x74,0x20,0x49,0x6E,0x63,0x2E,0x31,
-0x31,0x30,0x2F,0x06,0x03,0x55,0x04,0x03,0x13,0x28,0x47,0x65,0x6F,0x54,0x72,0x75,
-0x73,0x74,0x20,0x50,0x72,0x69,0x6D,0x61,0x72,0x79,0x20,0x43,0x65,0x72,0x74,0x69,
-0x66,0x69,0x63,0x61,0x74,0x69,0x6F,0x6E,0x20,0x41,0x75,0x74,0x68,0x6F,0x72,0x69,
-0x74,0x79,0x30,0x82,0x01,0x22,0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,
-0x01,0x01,0x01,0x05,0x00,0x03,0x82,0x01,0x0F,0x00,0x30,0x82,0x01,0x0A,0x02,0x82,
-0x01,0x01,0x00,0xBE,0xB8,0x15,0x7B,0xFF,0xD4,0x7C,0x7D,0x67,0xAD,0x83,0x64,0x7B,
-0xC8,0x42,0x53,0x2D,0xDF,0xF6,0x84,0x08,0x20,0x61,0xD6,0x01,0x59,0x6A,0x9C,0x44,
-0x11,0xAF,0xEF,0x76,0xFD,0x95,0x7E,0xCE,0x61,0x30,0xBB,0x7A,0x83,0x5F,0x02,0xBD,
-0x01,0x66,0xCA,0xEE,0x15,0x8D,0x6F,0xA1,0x30,0x9C,0xBD,0xA1,0x85,0x9E,0x94,0x3A,
-0xF3,0x56,0x88,0x00,0x31,0xCF,0xD8,0xEE,0x6A,0x96,0x02,0xD9,0xED,0x03,0x8C,0xFB,
-0x75,0x6D,0xE7,0xEA,0xB8,0x55,0x16,0x05,0x16,0x9A,0xF4,0xE0,0x5E,0xB1,0x88,0xC0,
-0x64,0x85,0x5C,0x15,0x4D,0x88,0xC7,0xB7,0xBA,0xE0,0x75,0xE9,0xAD,0x05,0x3D,0x9D,
-0xC7,0x89,0x48,0xE0,0xBB,0x28,0xC8,0x03,0xE1,0x30,0x93,0x64,0x5E,0x52,0xC0,0x59,
-0x70,0x22,0x35,0x57,0x88,0x8A,0xF1,0x95,0x0A,0x83,0xD7,0xBC,0x31,0x73,0x01,0x34,
-0xED,0xEF,0x46,0x71,0xE0,0x6B,0x02,0xA8,0x35,0x72,0x6B,0x97,0x9B,0x66,0xE0,0xCB,
-0x1C,0x79,0x5F,0xD8,0x1A,0x04,0x68,0x1E,0x47,0x02,0xE6,0x9D,0x60,0xE2,0x36,0x97,
-0x01,0xDF,0xCE,0x35,0x92,0xDF,0xBE,0x67,0xC7,0x6D,0x77,0x59,0x3B,0x8F,0x9D,0xD6,
-0x90,0x15,0x94,0xBC,0x42,0x34,0x10,0xC1,0x39,0xF9,0xB1,0x27,0x3E,0x7E,0xD6,0x8A,
-0x75,0xC5,0xB2,0xAF,0x96,0xD3,0xA2,0xDE,0x9B,0xE4,0x98,0xBE,0x7D,0xE1,0xE9,0x81,
-0xAD,0xB6,0x6F,0xFC,0xD7,0x0E,0xDA,0xE0,0x34,0xB0,0x0D,0x1A,0x77,0xE7,0xE3,0x08,
-0x98,0xEF,0x58,0xFA,0x9C,0x84,0xB7,0x36,0xAF,0xC2,0xDF,0xAC,0xD2,0xF4,0x10,0x06,
-0x70,0x71,0x35,0x02,0x03,0x01,0x00,0x01,0xA3,0x42,0x30,0x40,0x30,0x0F,0x06,0x03,
-0x55,0x1D,0x13,0x01,0x01,0xFF,0x04,0x05,0x30,0x03,0x01,0x01,0xFF,0x30,0x0E,0x06,
-0x03,0x55,0x1D,0x0F,0x01,0x01,0xFF,0x04,0x04,0x03,0x02,0x01,0x06,0x30,0x1D,0x06,
-0x03,0x55,0x1D,0x0E,0x04,0x16,0x04,0x14,0x2C,0xD5,0x50,0x41,0x97,0x15,0x8B,0xF0,
-0x8F,0x36,0x61,0x5B,0x4A,0xFB,0x6B,0xD9,0x99,0xC9,0x33,0x92,0x30,0x0D,0x06,0x09,
-0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x05,0x05,0x00,0x03,0x82,0x01,0x01,0x00,
-0x5A,0x70,0x7F,0x2C,0xDD,0xB7,0x34,0x4F,0xF5,0x86,0x51,0xA9,0x26,0xBE,0x4B,0xB8,
-0xAA,0xF1,0x71,0x0D,0xDC,0x61,0xC7,0xA0,0xEA,0x34,0x1E,0x7A,0x77,0x0F,0x04,0x35,
-0xE8,0x27,0x8F,0x6C,0x90,0xBF,0x91,0x16,0x24,0x46,0x3E,0x4A,0x4E,0xCE,0x2B,0x16,
-0xD5,0x0B,0x52,0x1D,0xFC,0x1F,0x67,0xA2,0x02,0x45,0x31,0x4F,0xCE,0xF3,0xFA,0x03,
-0xA7,0x79,0x9D,0x53,0x6A,0xD9,0xDA,0x63,0x3A,0xF8,0x80,0xD7,0xD3,0x99,0xE1,0xA5,
-0xE1,0xBE,0xD4,0x55,0x71,0x98,0x35,0x3A,0xBE,0x93,0xEA,0xAE,0xAD,0x42,0xB2,0x90,
-0x6F,0xE0,0xFC,0x21,0x4D,0x35,0x63,0x33,0x89,0x49,0xD6,0x9B,0x4E,0xCA,0xC7,0xE7,
-0x4E,0x09,0x00,0xF7,0xDA,0xC7,0xEF,0x99,0x62,0x99,0x77,0xB6,0x95,0x22,0x5E,0x8A,
-0xA0,0xAB,0xF4,0xB8,0x78,0x98,0xCA,0x38,0x19,0x99,0xC9,0x72,0x9E,0x78,0xCD,0x4B,
-0xAC,0xAF,0x19,0xA0,0x73,0x12,0x2D,0xFC,0xC2,0x41,0xBA,0x81,0x91,0xDA,0x16,0x5A,
-0x31,0xB7,0xF9,0xB4,0x71,0x80,0x12,0x48,0x99,0x72,0x73,0x5A,0x59,0x53,0xC1,0x63,
-0x52,0x33,0xED,0xA7,0xC9,0xD2,0x39,0x02,0x70,0xFA,0xE0,0xB1,0x42,0x66,0x29,0xAA,
-0x9B,0x51,0xED,0x30,0x54,0x22,0x14,0x5F,0xD9,0xAB,0x1D,0xC1,0xE4,0x94,0xF0,0xF8,
-0xF5,0x2B,0xF7,0xEA,0xCA,0x78,0x46,0xD6,0xB8,0x91,0xFD,0xA6,0x0D,0x2B,0x1A,0x14,
-0x01,0x3E,0x80,0xF0,0x42,0xA0,0x95,0x07,0x5E,0x6D,0xCD,0xCC,0x4B,0xA4,0x45,0x8D,
-0xAB,0x12,0xE8,0xB3,0xDE,0x5A,0xE5,0xA0,0x7C,0xE8,0x0F,0x22,0x1D,0x5A,0xE9,0x59,
-};
-
-
-/* subject:/C=US/O=VeriSign, Inc./OU=VeriSign Trust Network/OU=(c) 2006 VeriSign, Inc. - For authorized use only/CN=VeriSign Class 3 Public Primary Certification Authority - G5 */
-/* issuer :/C=US/O=VeriSign, Inc./OU=VeriSign Trust Network/OU=(c) 2006 VeriSign, Inc. - For authorized use only/CN=VeriSign Class 3 Public Primary Certification Authority - G5 */
-
-
-const unsigned char VeriSign_Class_3_Public_Primary_Certification_Authority___G5_certificate[1239]={
-0x30,0x82,0x04,0xD3,0x30,0x82,0x03,0xBB,0xA0,0x03,0x02,0x01,0x02,0x02,0x10,0x18,
-0xDA,0xD1,0x9E,0x26,0x7D,0xE8,0xBB,0x4A,0x21,0x58,0xCD,0xCC,0x6B,0x3B,0x4A,0x30,
-0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x05,0x05,0x00,0x30,0x81,
-0xCA,0x31,0x0B,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x17,
-0x30,0x15,0x06,0x03,0x55,0x04,0x0A,0x13,0x0E,0x56,0x65,0x72,0x69,0x53,0x69,0x67,
-0x6E,0x2C,0x20,0x49,0x6E,0x63,0x2E,0x31,0x1F,0x30,0x1D,0x06,0x03,0x55,0x04,0x0B,
-0x13,0x16,0x56,0x65,0x72,0x69,0x53,0x69,0x67,0x6E,0x20,0x54,0x72,0x75,0x73,0x74,
-0x20,0x4E,0x65,0x74,0x77,0x6F,0x72,0x6B,0x31,0x3A,0x30,0x38,0x06,0x03,0x55,0x04,
-0x0B,0x13,0x31,0x28,0x63,0x29,0x20,0x32,0x30,0x30,0x36,0x20,0x56,0x65,0x72,0x69,
-0x53,0x69,0x67,0x6E,0x2C,0x20,0x49,0x6E,0x63,0x2E,0x20,0x2D,0x20,0x46,0x6F,0x72,
-0x20,0x61,0x75,0x74,0x68,0x6F,0x72,0x69,0x7A,0x65,0x64,0x20,0x75,0x73,0x65,0x20,
-0x6F,0x6E,0x6C,0x79,0x31,0x45,0x30,0x43,0x06,0x03,0x55,0x04,0x03,0x13,0x3C,0x56,
-0x65,0x72,0x69,0x53,0x69,0x67,0x6E,0x20,0x43,0x6C,0x61,0x73,0x73,0x20,0x33,0x20,
-0x50,0x75,0x62,0x6C,0x69,0x63,0x20,0x50,0x72,0x69,0x6D,0x61,0x72,0x79,0x20,0x43,
-0x65,0x72,0x74,0x69,0x66,0x69,0x63,0x61,0x74,0x69,0x6F,0x6E,0x20,0x41,0x75,0x74,
-0x68,0x6F,0x72,0x69,0x74,0x79,0x20,0x2D,0x20,0x47,0x35,0x30,0x1E,0x17,0x0D,0x30,
-0x36,0x31,0x31,0x30,0x38,0x30,0x30,0x30,0x30,0x30,0x30,0x5A,0x17,0x0D,0x33,0x36,
-0x30,0x37,0x31,0x36,0x32,0x33,0x35,0x39,0x35,0x39,0x5A,0x30,0x81,0xCA,0x31,0x0B,
-0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x17,0x30,0x15,0x06,
-0x03,0x55,0x04,0x0A,0x13,0x0E,0x56,0x65,0x72,0x69,0x53,0x69,0x67,0x6E,0x2C,0x20,
-0x49,0x6E,0x63,0x2E,0x31,0x1F,0x30,0x1D,0x06,0x03,0x55,0x04,0x0B,0x13,0x16,0x56,
-0x65,0x72,0x69,0x53,0x69,0x67,0x6E,0x20,0x54,0x72,0x75,0x73,0x74,0x20,0x4E,0x65,
-0x74,0x77,0x6F,0x72,0x6B,0x31,0x3A,0x30,0x38,0x06,0x03,0x55,0x04,0x0B,0x13,0x31,
-0x28,0x63,0x29,0x20,0x32,0x30,0x30,0x36,0x20,0x56,0x65,0x72,0x69,0x53,0x69,0x67,
-0x6E,0x2C,0x20,0x49,0x6E,0x63,0x2E,0x20,0x2D,0x20,0x46,0x6F,0x72,0x20,0x61,0x75,
-0x74,0x68,0x6F,0x72,0x69,0x7A,0x65,0x64,0x20,0x75,0x73,0x65,0x20,0x6F,0x6E,0x6C,
-0x79,0x31,0x45,0x30,0x43,0x06,0x03,0x55,0x04,0x03,0x13,0x3C,0x56,0x65,0x72,0x69,
-0x53,0x69,0x67,0x6E,0x20,0x43,0x6C,0x61,0x73,0x73,0x20,0x33,0x20,0x50,0x75,0x62,
-0x6C,0x69,0x63,0x20,0x50,0x72,0x69,0x6D,0x61,0x72,0x79,0x20,0x43,0x65,0x72,0x74,
-0x69,0x66,0x69,0x63,0x61,0x74,0x69,0x6F,0x6E,0x20,0x41,0x75,0x74,0x68,0x6F,0x72,
-0x69,0x74,0x79,0x20,0x2D,0x20,0x47,0x35,0x30,0x82,0x01,0x22,0x30,0x0D,0x06,0x09,
-0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x01,0x05,0x00,0x03,0x82,0x01,0x0F,0x00,
-0x30,0x82,0x01,0x0A,0x02,0x82,0x01,0x01,0x00,0xAF,0x24,0x08,0x08,0x29,0x7A,0x35,
-0x9E,0x60,0x0C,0xAA,0xE7,0x4B,0x3B,0x4E,0xDC,0x7C,0xBC,0x3C,0x45,0x1C,0xBB,0x2B,
-0xE0,0xFE,0x29,0x02,0xF9,0x57,0x08,0xA3,0x64,0x85,0x15,0x27,0xF5,0xF1,0xAD,0xC8,
-0x31,0x89,0x5D,0x22,0xE8,0x2A,0xAA,0xA6,0x42,0xB3,0x8F,0xF8,0xB9,0x55,0xB7,0xB1,
-0xB7,0x4B,0xB3,0xFE,0x8F,0x7E,0x07,0x57,0xEC,0xEF,0x43,0xDB,0x66,0x62,0x15,0x61,
-0xCF,0x60,0x0D,0xA4,0xD8,0xDE,0xF8,0xE0,0xC3,0x62,0x08,0x3D,0x54,0x13,0xEB,0x49,
-0xCA,0x59,0x54,0x85,0x26,0xE5,0x2B,0x8F,0x1B,0x9F,0xEB,0xF5,0xA1,0x91,0xC2,0x33,
-0x49,0xD8,0x43,0x63,0x6A,0x52,0x4B,0xD2,0x8F,0xE8,0x70,0x51,0x4D,0xD1,0x89,0x69,
-0x7B,0xC7,0x70,0xF6,0xB3,0xDC,0x12,0x74,0xDB,0x7B,0x5D,0x4B,0x56,0xD3,0x96,0xBF,
-0x15,0x77,0xA1,0xB0,0xF4,0xA2,0x25,0xF2,0xAF,0x1C,0x92,0x67,0x18,0xE5,0xF4,0x06,
-0x04,0xEF,0x90,0xB9,0xE4,0x00,0xE4,0xDD,0x3A,0xB5,0x19,0xFF,0x02,0xBA,0xF4,0x3C,
-0xEE,0xE0,0x8B,0xEB,0x37,0x8B,0xEC,0xF4,0xD7,0xAC,0xF2,0xF6,0xF0,0x3D,0xAF,0xDD,
-0x75,0x91,0x33,0x19,0x1D,0x1C,0x40,0xCB,0x74,0x24,0x19,0x21,0x93,0xD9,0x14,0xFE,
-0xAC,0x2A,0x52,0xC7,0x8F,0xD5,0x04,0x49,0xE4,0x8D,0x63,0x47,0x88,0x3C,0x69,0x83,
-0xCB,0xFE,0x47,0xBD,0x2B,0x7E,0x4F,0xC5,0x95,0xAE,0x0E,0x9D,0xD4,0xD1,0x43,0xC0,
-0x67,0x73,0xE3,0x14,0x08,0x7E,0xE5,0x3F,0x9F,0x73,0xB8,0x33,0x0A,0xCF,0x5D,0x3F,
-0x34,0x87,0x96,0x8A,0xEE,0x53,0xE8,0x25,0x15,0x02,0x03,0x01,0x00,0x01,0xA3,0x81,
-0xB2,0x30,0x81,0xAF,0x30,0x0F,0x06,0x03,0x55,0x1D,0x13,0x01,0x01,0xFF,0x04,0x05,
-0x30,0x03,0x01,0x01,0xFF,0x30,0x0E,0x06,0x03,0x55,0x1D,0x0F,0x01,0x01,0xFF,0x04,
-0x04,0x03,0x02,0x01,0x06,0x30,0x6D,0x06,0x08,0x2B,0x06,0x01,0x05,0x05,0x07,0x01,
-0x0C,0x04,0x61,0x30,0x5F,0xA1,0x5D,0xA0,0x5B,0x30,0x59,0x30,0x57,0x30,0x55,0x16,
-0x09,0x69,0x6D,0x61,0x67,0x65,0x2F,0x67,0x69,0x66,0x30,0x21,0x30,0x1F,0x30,0x07,
-0x06,0x05,0x2B,0x0E,0x03,0x02,0x1A,0x04,0x14,0x8F,0xE5,0xD3,0x1A,0x86,0xAC,0x8D,
-0x8E,0x6B,0xC3,0xCF,0x80,0x6A,0xD4,0x48,0x18,0x2C,0x7B,0x19,0x2E,0x30,0x25,0x16,
-0x23,0x68,0x74,0x74,0x70,0x3A,0x2F,0x2F,0x6C,0x6F,0x67,0x6F,0x2E,0x76,0x65,0x72,
-0x69,0x73,0x69,0x67,0x6E,0x2E,0x63,0x6F,0x6D,0x2F,0x76,0x73,0x6C,0x6F,0x67,0x6F,
-0x2E,0x67,0x69,0x66,0x30,0x1D,0x06,0x03,0x55,0x1D,0x0E,0x04,0x16,0x04,0x14,0x7F,
-0xD3,0x65,0xA7,0xC2,0xDD,0xEC,0xBB,0xF0,0x30,0x09,0xF3,0x43,0x39,0xFA,0x02,0xAF,
-0x33,0x31,0x33,0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x05,
-0x05,0x00,0x03,0x82,0x01,0x01,0x00,0x93,0x24,0x4A,0x30,0x5F,0x62,0xCF,0xD8,0x1A,
-0x98,0x2F,0x3D,0xEA,0xDC,0x99,0x2D,0xBD,0x77,0xF6,0xA5,0x79,0x22,0x38,0xEC,0xC4,
-0xA7,0xA0,0x78,0x12,0xAD,0x62,0x0E,0x45,0x70,0x64,0xC5,0xE7,0x97,0x66,0x2D,0x98,
-0x09,0x7E,0x5F,0xAF,0xD6,0xCC,0x28,0x65,0xF2,0x01,0xAA,0x08,0x1A,0x47,0xDE,0xF9,
-0xF9,0x7C,0x92,0x5A,0x08,0x69,0x20,0x0D,0xD9,0x3E,0x6D,0x6E,0x3C,0x0D,0x6E,0xD8,
-0xE6,0x06,0x91,0x40,0x18,0xB9,0xF8,0xC1,0xED,0xDF,0xDB,0x41,0xAA,0xE0,0x96,0x20,
-0xC9,0xCD,0x64,0x15,0x38,0x81,0xC9,0x94,0xEE,0xA2,0x84,0x29,0x0B,0x13,0x6F,0x8E,
-0xDB,0x0C,0xDD,0x25,0x02,0xDB,0xA4,0x8B,0x19,0x44,0xD2,0x41,0x7A,0x05,0x69,0x4A,
-0x58,0x4F,0x60,0xCA,0x7E,0x82,0x6A,0x0B,0x02,0xAA,0x25,0x17,0x39,0xB5,0xDB,0x7F,
-0xE7,0x84,0x65,0x2A,0x95,0x8A,0xBD,0x86,0xDE,0x5E,0x81,0x16,0x83,0x2D,0x10,0xCC,
-0xDE,0xFD,0xA8,0x82,0x2A,0x6D,0x28,0x1F,0x0D,0x0B,0xC4,0xE5,0xE7,0x1A,0x26,0x19,
-0xE1,0xF4,0x11,0x6F,0x10,0xB5,0x95,0xFC,0xE7,0x42,0x05,0x32,0xDB,0xCE,0x9D,0x51,
-0x5E,0x28,0xB6,0x9E,0x85,0xD3,0x5B,0xEF,0xA5,0x7D,0x45,0x40,0x72,0x8E,0xB7,0x0E,
-0x6B,0x0E,0x06,0xFB,0x33,0x35,0x48,0x71,0xB8,0x9D,0x27,0x8B,0xC4,0x65,0x5F,0x0D,
-0x86,0x76,0x9C,0x44,0x7A,0xF6,0x95,0x5C,0xF6,0x5D,0x32,0x08,0x33,0xA4,0x54,0xB6,
-0x18,0x3F,0x68,0x5C,0xF2,0x42,0x4A,0x85,0x38,0x54,0x83,0x5F,0xD1,0xE8,0x2C,0xF2,
-0xAC,0x11,0xD6,0xA8,0xED,0x63,0x6A,
-};
-
-
-/* subject:/C=US/O=Equifax/OU=Equifax Secure Certificate Authority */
-/* issuer :/C=US/O=Equifax/OU=Equifax Secure Certificate Authority */
-
-
-const unsigned char Equifax_Secure_CA_certificate[804]={
-0x30,0x82,0x03,0x20,0x30,0x82,0x02,0x89,0xA0,0x03,0x02,0x01,0x02,0x02,0x04,0x35,
-0xDE,0xF4,0xCF,0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x05,
-0x05,0x00,0x30,0x4E,0x31,0x0B,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,
-0x53,0x31,0x10,0x30,0x0E,0x06,0x03,0x55,0x04,0x0A,0x13,0x07,0x45,0x71,0x75,0x69,
-0x66,0x61,0x78,0x31,0x2D,0x30,0x2B,0x06,0x03,0x55,0x04,0x0B,0x13,0x24,0x45,0x71,
-0x75,0x69,0x66,0x61,0x78,0x20,0x53,0x65,0x63,0x75,0x72,0x65,0x20,0x43,0x65,0x72,
-0x74,0x69,0x66,0x69,0x63,0x61,0x74,0x65,0x20,0x41,0x75,0x74,0x68,0x6F,0x72,0x69,
-0x74,0x79,0x30,0x1E,0x17,0x0D,0x39,0x38,0x30,0x38,0x32,0x32,0x31,0x36,0x34,0x31,
-0x35,0x31,0x5A,0x17,0x0D,0x31,0x38,0x30,0x38,0x32,0x32,0x31,0x36,0x34,0x31,0x35,
-0x31,0x5A,0x30,0x4E,0x31,0x0B,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,
-0x53,0x31,0x10,0x30,0x0E,0x06,0x03,0x55,0x04,0x0A,0x13,0x07,0x45,0x71,0x75,0x69,
-0x66,0x61,0x78,0x31,0x2D,0x30,0x2B,0x06,0x03,0x55,0x04,0x0B,0x13,0x24,0x45,0x71,
-0x75,0x69,0x66,0x61,0x78,0x20,0x53,0x65,0x63,0x75,0x72,0x65,0x20,0x43,0x65,0x72,
-0x74,0x69,0x66,0x69,0x63,0x61,0x74,0x65,0x20,0x41,0x75,0x74,0x68,0x6F,0x72,0x69,
-0x74,0x79,0x30,0x81,0x9F,0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,
-0x01,0x01,0x05,0x00,0x03,0x81,0x8D,0x00,0x30,0x81,0x89,0x02,0x81,0x81,0x00,0xC1,
-0x5D,0xB1,0x58,0x67,0x08,0x62,0xEE,0xA0,0x9A,0x2D,0x1F,0x08,0x6D,0x91,0x14,0x68,
-0x98,0x0A,0x1E,0xFE,0xDA,0x04,0x6F,0x13,0x84,0x62,0x21,0xC3,0xD1,0x7C,0xCE,0x9F,
-0x05,0xE0,0xB8,0x01,0xF0,0x4E,0x34,0xEC,0xE2,0x8A,0x95,0x04,0x64,0xAC,0xF1,0x6B,
-0x53,0x5F,0x05,0xB3,0xCB,0x67,0x80,0xBF,0x42,0x02,0x8E,0xFE,0xDD,0x01,0x09,0xEC,
-0xE1,0x00,0x14,0x4F,0xFC,0xFB,0xF0,0x0C,0xDD,0x43,0xBA,0x5B,0x2B,0xE1,0x1F,0x80,
-0x70,0x99,0x15,0x57,0x93,0x16,0xF1,0x0F,0x97,0x6A,0xB7,0xC2,0x68,0x23,0x1C,0xCC,
-0x4D,0x59,0x30,0xAC,0x51,0x1E,0x3B,0xAF,0x2B,0xD6,0xEE,0x63,0x45,0x7B,0xC5,0xD9,
-0x5F,0x50,0xD2,0xE3,0x50,0x0F,0x3A,0x88,0xE7,0xBF,0x14,0xFD,0xE0,0xC7,0xB9,0x02,
-0x03,0x01,0x00,0x01,0xA3,0x82,0x01,0x09,0x30,0x82,0x01,0x05,0x30,0x70,0x06,0x03,
-0x55,0x1D,0x1F,0x04,0x69,0x30,0x67,0x30,0x65,0xA0,0x63,0xA0,0x61,0xA4,0x5F,0x30,
-0x5D,0x31,0x0B,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x10,
-0x30,0x0E,0x06,0x03,0x55,0x04,0x0A,0x13,0x07,0x45,0x71,0x75,0x69,0x66,0x61,0x78,
-0x31,0x2D,0x30,0x2B,0x06,0x03,0x55,0x04,0x0B,0x13,0x24,0x45,0x71,0x75,0x69,0x66,
-0x61,0x78,0x20,0x53,0x65,0x63,0x75,0x72,0x65,0x20,0x43,0x65,0x72,0x74,0x69,0x66,
-0x69,0x63,0x61,0x74,0x65,0x20,0x41,0x75,0x74,0x68,0x6F,0x72,0x69,0x74,0x79,0x31,
-0x0D,0x30,0x0B,0x06,0x03,0x55,0x04,0x03,0x13,0x04,0x43,0x52,0x4C,0x31,0x30,0x1A,
-0x06,0x03,0x55,0x1D,0x10,0x04,0x13,0x30,0x11,0x81,0x0F,0x32,0x30,0x31,0x38,0x30,
-0x38,0x32,0x32,0x31,0x36,0x34,0x31,0x35,0x31,0x5A,0x30,0x0B,0x06,0x03,0x55,0x1D,
-0x0F,0x04,0x04,0x03,0x02,0x01,0x06,0x30,0x1F,0x06,0x03,0x55,0x1D,0x23,0x04,0x18,
-0x30,0x16,0x80,0x14,0x48,0xE6,0x68,0xF9,0x2B,0xD2,0xB2,0x95,0xD7,0x47,0xD8,0x23,
-0x20,0x10,0x4F,0x33,0x98,0x90,0x9F,0xD4,0x30,0x1D,0x06,0x03,0x55,0x1D,0x0E,0x04,
-0x16,0x04,0x14,0x48,0xE6,0x68,0xF9,0x2B,0xD2,0xB2,0x95,0xD7,0x47,0xD8,0x23,0x20,
-0x10,0x4F,0x33,0x98,0x90,0x9F,0xD4,0x30,0x0C,0x06,0x03,0x55,0x1D,0x13,0x04,0x05,
-0x30,0x03,0x01,0x01,0xFF,0x30,0x1A,0x06,0x09,0x2A,0x86,0x48,0x86,0xF6,0x7D,0x07,
-0x41,0x00,0x04,0x0D,0x30,0x0B,0x1B,0x05,0x56,0x33,0x2E,0x30,0x63,0x03,0x02,0x06,
-0xC0,0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x05,0x05,0x00,
-0x03,0x81,0x81,0x00,0x58,0xCE,0x29,0xEA,0xFC,0xF7,0xDE,0xB5,0xCE,0x02,0xB9,0x17,
-0xB5,0x85,0xD1,0xB9,0xE3,0xE0,0x95,0xCC,0x25,0x31,0x0D,0x00,0xA6,0x92,0x6E,0x7F,
-0xB6,0x92,0x63,0x9E,0x50,0x95,0xD1,0x9A,0x6F,0xE4,0x11,0xDE,0x63,0x85,0x6E,0x98,
-0xEE,0xA8,0xFF,0x5A,0xC8,0xD3,0x55,0xB2,0x66,0x71,0x57,0xDE,0xC0,0x21,0xEB,0x3D,
-0x2A,0xA7,0x23,0x49,0x01,0x04,0x86,0x42,0x7B,0xFC,0xEE,0x7F,0xA2,0x16,0x52,0xB5,
-0x67,0x67,0xD3,0x40,0xDB,0x3B,0x26,0x58,0xB2,0x28,0x77,0x3D,0xAE,0x14,0x77,0x61,
-0xD6,0xFA,0x2A,0x66,0x27,0xA0,0x0D,0xFA,0xA7,0x73,0x5C,0xEA,0x70,0xF1,0x94,0x21,
-0x65,0x44,0x5F,0xFA,0xFC,0xEF,0x29,0x68,0xA9,0xA2,0x87,0x79,0xEF,0x79,0xEF,0x4F,
-0xAC,0x07,0x77,0x38,
-};
-
-
-/* subject:/O=Entrust.net/OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/OU=(c) 1999 Entrust.net Limited/CN=Entrust.net Certification Authority (2048) */
-/* issuer :/O=Entrust.net/OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/OU=(c) 1999 Entrust.net Limited/CN=Entrust.net Certification Authority (2048) */
-
-
-const unsigned char Entrust_net_Premium_2048_Secure_Server_CA_certificate[1120]={
-0x30,0x82,0x04,0x5C,0x30,0x82,0x03,0x44,0xA0,0x03,0x02,0x01,0x02,0x02,0x04,0x38,
-0x63,0xB9,0x66,0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x05,
-0x05,0x00,0x30,0x81,0xB4,0x31,0x14,0x30,0x12,0x06,0x03,0x55,0x04,0x0A,0x13,0x0B,
-0x45,0x6E,0x74,0x72,0x75,0x73,0x74,0x2E,0x6E,0x65,0x74,0x31,0x40,0x30,0x3E,0x06,
-0x03,0x55,0x04,0x0B,0x14,0x37,0x77,0x77,0x77,0x2E,0x65,0x6E,0x74,0x72,0x75,0x73,
-0x74,0x2E,0x6E,0x65,0x74,0x2F,0x43,0x50,0x53,0x5F,0x32,0x30,0x34,0x38,0x20,0x69,
-0x6E,0x63,0x6F,0x72,0x70,0x2E,0x20,0x62,0x79,0x20,0x72,0x65,0x66,0x2E,0x20,0x28,
-0x6C,0x69,0x6D,0x69,0x74,0x73,0x20,0x6C,0x69,0x61,0x62,0x2E,0x29,0x31,0x25,0x30,
-0x23,0x06,0x03,0x55,0x04,0x0B,0x13,0x1C,0x28,0x63,0x29,0x20,0x31,0x39,0x39,0x39,
-0x20,0x45,0x6E,0x74,0x72,0x75,0x73,0x74,0x2E,0x6E,0x65,0x74,0x20,0x4C,0x69,0x6D,
-0x69,0x74,0x65,0x64,0x31,0x33,0x30,0x31,0x06,0x03,0x55,0x04,0x03,0x13,0x2A,0x45,
-0x6E,0x74,0x72,0x75,0x73,0x74,0x2E,0x6E,0x65,0x74,0x20,0x43,0x65,0x72,0x74,0x69,
-0x66,0x69,0x63,0x61,0x74,0x69,0x6F,0x6E,0x20,0x41,0x75,0x74,0x68,0x6F,0x72,0x69,
-0x74,0x79,0x20,0x28,0x32,0x30,0x34,0x38,0x29,0x30,0x1E,0x17,0x0D,0x39,0x39,0x31,
-0x32,0x32,0x34,0x31,0x37,0x35,0x30,0x35,0x31,0x5A,0x17,0x0D,0x31,0x39,0x31,0x32,
-0x32,0x34,0x31,0x38,0x32,0x30,0x35,0x31,0x5A,0x30,0x81,0xB4,0x31,0x14,0x30,0x12,
-0x06,0x03,0x55,0x04,0x0A,0x13,0x0B,0x45,0x6E,0x74,0x72,0x75,0x73,0x74,0x2E,0x6E,
-0x65,0x74,0x31,0x40,0x30,0x3E,0x06,0x03,0x55,0x04,0x0B,0x14,0x37,0x77,0x77,0x77,
-0x2E,0x65,0x6E,0x74,0x72,0x75,0x73,0x74,0x2E,0x6E,0x65,0x74,0x2F,0x43,0x50,0x53,
-0x5F,0x32,0x30,0x34,0x38,0x20,0x69,0x6E,0x63,0x6F,0x72,0x70,0x2E,0x20,0x62,0x79,
-0x20,0x72,0x65,0x66,0x2E,0x20,0x28,0x6C,0x69,0x6D,0x69,0x74,0x73,0x20,0x6C,0x69,
-0x61,0x62,0x2E,0x29,0x31,0x25,0x30,0x23,0x06,0x03,0x55,0x04,0x0B,0x13,0x1C,0x28,
-0x63,0x29,0x20,0x31,0x39,0x39,0x39,0x20,0x45,0x6E,0x74,0x72,0x75,0x73,0x74,0x2E,
-0x6E,0x65,0x74,0x20,0x4C,0x69,0x6D,0x69,0x74,0x65,0x64,0x31,0x33,0x30,0x31,0x06,
-0x03,0x55,0x04,0x03,0x13,0x2A,0x45,0x6E,0x74,0x72,0x75,0x73,0x74,0x2E,0x6E,0x65,
-0x74,0x20,0x43,0x65,0x72,0x74,0x69,0x66,0x69,0x63,0x61,0x74,0x69,0x6F,0x6E,0x20,
-0x41,0x75,0x74,0x68,0x6F,0x72,0x69,0x74,0x79,0x20,0x28,0x32,0x30,0x34,0x38,0x29,
-0x30,0x82,0x01,0x22,0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,
-0x01,0x05,0x00,0x03,0x82,0x01,0x0F,0x00,0x30,0x82,0x01,0x0A,0x02,0x82,0x01,0x01,
-0x00,0xAD,0x4D,0x4B,0xA9,0x12,0x86,0xB2,0xEA,0xA3,0x20,0x07,0x15,0x16,0x64,0x2A,
-0x2B,0x4B,0xD1,0xBF,0x0B,0x4A,0x4D,0x8E,0xED,0x80,0x76,0xA5,0x67,0xB7,0x78,0x40,
-0xC0,0x73,0x42,0xC8,0x68,0xC0,0xDB,0x53,0x2B,0xDD,0x5E,0xB8,0x76,0x98,0x35,0x93,
-0x8B,0x1A,0x9D,0x7C,0x13,0x3A,0x0E,0x1F,0x5B,0xB7,0x1E,0xCF,0xE5,0x24,0x14,0x1E,
-0xB1,0x81,0xA9,0x8D,0x7D,0xB8,0xCC,0x6B,0x4B,0x03,0xF1,0x02,0x0C,0xDC,0xAB,0xA5,
-0x40,0x24,0x00,0x7F,0x74,0x94,0xA1,0x9D,0x08,0x29,0xB3,0x88,0x0B,0xF5,0x87,0x77,
-0x9D,0x55,0xCD,0xE4,0xC3,0x7E,0xD7,0x6A,0x64,0xAB,0x85,0x14,0x86,0x95,0x5B,0x97,
-0x32,0x50,0x6F,0x3D,0xC8,0xBA,0x66,0x0C,0xE3,0xFC,0xBD,0xB8,0x49,0xC1,0x76,0x89,
-0x49,0x19,0xFD,0xC0,0xA8,0xBD,0x89,0xA3,0x67,0x2F,0xC6,0x9F,0xBC,0x71,0x19,0x60,
-0xB8,0x2D,0xE9,0x2C,0xC9,0x90,0x76,0x66,0x7B,0x94,0xE2,0xAF,0x78,0xD6,0x65,0x53,
-0x5D,0x3C,0xD6,0x9C,0xB2,0xCF,0x29,0x03,0xF9,0x2F,0xA4,0x50,0xB2,0xD4,0x48,0xCE,
-0x05,0x32,0x55,0x8A,0xFD,0xB2,0x64,0x4C,0x0E,0xE4,0x98,0x07,0x75,0xDB,0x7F,0xDF,
-0xB9,0x08,0x55,0x60,0x85,0x30,0x29,0xF9,0x7B,0x48,0xA4,0x69,0x86,0xE3,0x35,0x3F,
-0x1E,0x86,0x5D,0x7A,0x7A,0x15,0xBD,0xEF,0x00,0x8E,0x15,0x22,0x54,0x17,0x00,0x90,
-0x26,0x93,0xBC,0x0E,0x49,0x68,0x91,0xBF,0xF8,0x47,0xD3,0x9D,0x95,0x42,0xC1,0x0E,
-0x4D,0xDF,0x6F,0x26,0xCF,0xC3,0x18,0x21,0x62,0x66,0x43,0x70,0xD6,0xD5,0xC0,0x07,
-0xE1,0x02,0x03,0x01,0x00,0x01,0xA3,0x74,0x30,0x72,0x30,0x11,0x06,0x09,0x60,0x86,
-0x48,0x01,0x86,0xF8,0x42,0x01,0x01,0x04,0x04,0x03,0x02,0x00,0x07,0x30,0x1F,0x06,
-0x03,0x55,0x1D,0x23,0x04,0x18,0x30,0x16,0x80,0x14,0x55,0xE4,0x81,0xD1,0x11,0x80,
-0xBE,0xD8,0x89,0xB9,0x08,0xA3,0x31,0xF9,0xA1,0x24,0x09,0x16,0xB9,0x70,0x30,0x1D,
-0x06,0x03,0x55,0x1D,0x0E,0x04,0x16,0x04,0x14,0x55,0xE4,0x81,0xD1,0x11,0x80,0xBE,
-0xD8,0x89,0xB9,0x08,0xA3,0x31,0xF9,0xA1,0x24,0x09,0x16,0xB9,0x70,0x30,0x1D,0x06,
-0x09,0x2A,0x86,0x48,0x86,0xF6,0x7D,0x07,0x41,0x00,0x04,0x10,0x30,0x0E,0x1B,0x08,
-0x56,0x35,0x2E,0x30,0x3A,0x34,0x2E,0x30,0x03,0x02,0x04,0x90,0x30,0x0D,0x06,0x09,
-0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x05,0x05,0x00,0x03,0x82,0x01,0x01,0x00,
-0x59,0x47,0xAC,0x21,0x84,0x8A,0x17,0xC9,0x9C,0x89,0x53,0x1E,0xBA,0x80,0x85,0x1A,
-0xC6,0x3C,0x4E,0x3E,0xB1,0x9C,0xB6,0x7C,0xC6,0x92,0x5D,0x18,0x64,0x02,0xE3,0xD3,
-0x06,0x08,0x11,0x61,0x7C,0x63,0xE3,0x2B,0x9D,0x31,0x03,0x70,0x76,0xD2,0xA3,0x28,
-0xA0,0xF4,0xBB,0x9A,0x63,0x73,0xED,0x6D,0xE5,0x2A,0xDB,0xED,0x14,0xA9,0x2B,0xC6,
-0x36,0x11,0xD0,0x2B,0xEB,0x07,0x8B,0xA5,0xDA,0x9E,0x5C,0x19,0x9D,0x56,0x12,0xF5,
-0x54,0x29,0xC8,0x05,0xED,0xB2,0x12,0x2A,0x8D,0xF4,0x03,0x1B,0xFF,0xE7,0x92,0x10,
-0x87,0xB0,0x3A,0xB5,0xC3,0x9D,0x05,0x37,0x12,0xA3,0xC7,0xF4,0x15,0xB9,0xD5,0xA4,
-0x39,0x16,0x9B,0x53,0x3A,0x23,0x91,0xF1,0xA8,0x82,0xA2,0x6A,0x88,0x68,0xC1,0x79,
-0x02,0x22,0xBC,0xAA,0xA6,0xD6,0xAE,0xDF,0xB0,0x14,0x5F,0xB8,0x87,0xD0,0xDD,0x7C,
-0x7F,0x7B,0xFF,0xAF,0x1C,0xCF,0xE6,0xDB,0x07,0xAD,0x5E,0xDB,0x85,0x9D,0xD0,0x2B,
-0x0D,0x33,0xDB,0x04,0xD1,0xE6,0x49,0x40,0x13,0x2B,0x76,0xFB,0x3E,0xE9,0x9C,0x89,
-0x0F,0x15,0xCE,0x18,0xB0,0x85,0x78,0x21,0x4F,0x6B,0x4F,0x0E,0xFA,0x36,0x67,0xCD,
-0x07,0xF2,0xFF,0x08,0xD0,0xE2,0xDE,0xD9,0xBF,0x2A,0xAF,0xB8,0x87,0x86,0x21,0x3C,
-0x04,0xCA,0xB7,0x94,0x68,0x7F,0xCF,0x3C,0xE9,0x98,0xD7,0x38,0xFF,0xEC,0xC0,0xD9,
-0x50,0xF0,0x2E,0x4B,0x58,0xAE,0x46,0x6F,0xD0,0x2E,0xC3,0x60,0xDA,0x72,0x55,0x72,
-0xBD,0x4C,0x45,0x9E,0x61,0xBA,0xBF,0x84,0x81,0x92,0x03,0xD1,0xD2,0x69,0x7C,0xC5,
-};
-
-
-/* subject:/C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert Assured ID Root G3 */
-/* issuer :/C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert Assured ID Root G3 */
-
-
-const unsigned char DigiCert_Assured_ID_Root_G3_certificate[586]={
-0x30,0x82,0x02,0x46,0x30,0x82,0x01,0xCD,0xA0,0x03,0x02,0x01,0x02,0x02,0x10,0x0B,
-0xA1,0x5A,0xFA,0x1D,0xDF,0xA0,0xB5,0x49,0x44,0xAF,0xCD,0x24,0xA0,0x6C,0xEC,0x30,
-0x0A,0x06,0x08,0x2A,0x86,0x48,0xCE,0x3D,0x04,0x03,0x03,0x30,0x65,0x31,0x0B,0x30,
-0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x15,0x30,0x13,0x06,0x03,
-0x55,0x04,0x0A,0x13,0x0C,0x44,0x69,0x67,0x69,0x43,0x65,0x72,0x74,0x20,0x49,0x6E,
-0x63,0x31,0x19,0x30,0x17,0x06,0x03,0x55,0x04,0x0B,0x13,0x10,0x77,0x77,0x77,0x2E,
-0x64,0x69,0x67,0x69,0x63,0x65,0x72,0x74,0x2E,0x63,0x6F,0x6D,0x31,0x24,0x30,0x22,
-0x06,0x03,0x55,0x04,0x03,0x13,0x1B,0x44,0x69,0x67,0x69,0x43,0x65,0x72,0x74,0x20,
-0x41,0x73,0x73,0x75,0x72,0x65,0x64,0x20,0x49,0x44,0x20,0x52,0x6F,0x6F,0x74,0x20,
-0x47,0x33,0x30,0x1E,0x17,0x0D,0x31,0x33,0x30,0x38,0x30,0x31,0x31,0x32,0x30,0x30,
-0x30,0x30,0x5A,0x17,0x0D,0x33,0x38,0x30,0x31,0x31,0x35,0x31,0x32,0x30,0x30,0x30,
-0x30,0x5A,0x30,0x65,0x31,0x0B,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,
-0x53,0x31,0x15,0x30,0x13,0x06,0x03,0x55,0x04,0x0A,0x13,0x0C,0x44,0x69,0x67,0x69,
-0x43,0x65,0x72,0x74,0x20,0x49,0x6E,0x63,0x31,0x19,0x30,0x17,0x06,0x03,0x55,0x04,
-0x0B,0x13,0x10,0x77,0x77,0x77,0x2E,0x64,0x69,0x67,0x69,0x63,0x65,0x72,0x74,0x2E,
-0x63,0x6F,0x6D,0x31,0x24,0x30,0x22,0x06,0x03,0x55,0x04,0x03,0x13,0x1B,0x44,0x69,
-0x67,0x69,0x43,0x65,0x72,0x74,0x20,0x41,0x73,0x73,0x75,0x72,0x65,0x64,0x20,0x49,
-0x44,0x20,0x52,0x6F,0x6F,0x74,0x20,0x47,0x33,0x30,0x76,0x30,0x10,0x06,0x07,0x2A,
-0x86,0x48,0xCE,0x3D,0x02,0x01,0x06,0x05,0x2B,0x81,0x04,0x00,0x22,0x03,0x62,0x00,
-0x04,0x19,0xE7,0xBC,0xAC,0x44,0x65,0xED,0xCD,0xB8,0x3F,0x58,0xFB,0x8D,0xB1,0x57,
-0xA9,0x44,0x2D,0x05,0x15,0xF2,0xEF,0x0B,0xFF,0x10,0x74,0x9F,0xB5,0x62,0x52,0x5F,
-0x66,0x7E,0x1F,0xE5,0xDC,0x1B,0x45,0x79,0x0B,0xCC,0xC6,0x53,0x0A,0x9D,0x8D,0x5D,
-0x02,0xD9,0xA9,0x59,0xDE,0x02,0x5A,0xF6,0x95,0x2A,0x0E,0x8D,0x38,0x4A,0x8A,0x49,
-0xC6,0xBC,0xC6,0x03,0x38,0x07,0x5F,0x55,0xDA,0x7E,0x09,0x6E,0xE2,0x7F,0x5E,0xD0,
-0x45,0x20,0x0F,0x59,0x76,0x10,0xD6,0xA0,0x24,0xF0,0x2D,0xDE,0x36,0xF2,0x6C,0x29,
-0x39,0xA3,0x42,0x30,0x40,0x30,0x0F,0x06,0x03,0x55,0x1D,0x13,0x01,0x01,0xFF,0x04,
-0x05,0x30,0x03,0x01,0x01,0xFF,0x30,0x0E,0x06,0x03,0x55,0x1D,0x0F,0x01,0x01,0xFF,
-0x04,0x04,0x03,0x02,0x01,0x86,0x30,0x1D,0x06,0x03,0x55,0x1D,0x0E,0x04,0x16,0x04,
-0x14,0xCB,0xD0,0xBD,0xA9,0xE1,0x98,0x05,0x51,0xA1,0x4D,0x37,0xA2,0x83,0x79,0xCE,
-0x8D,0x1D,0x2A,0xE4,0x84,0x30,0x0A,0x06,0x08,0x2A,0x86,0x48,0xCE,0x3D,0x04,0x03,
-0x03,0x03,0x67,0x00,0x30,0x64,0x02,0x30,0x25,0xA4,0x81,0x45,0x02,0x6B,0x12,0x4B,
-0x75,0x74,0x4F,0xC8,0x23,0xE3,0x70,0xF2,0x75,0x72,0xDE,0x7C,0x89,0xF0,0xCF,0x91,
-0x72,0x61,0x9E,0x5E,0x10,0x92,0x59,0x56,0xB9,0x83,0xC7,0x10,0xE7,0x38,0xE9,0x58,
-0x26,0x36,0x7D,0xD5,0xE4,0x34,0x86,0x39,0x02,0x30,0x7C,0x36,0x53,0xF0,0x30,0xE5,
-0x62,0x63,0x3A,0x99,0xE2,0xB6,0xA3,0x3B,0x9B,0x34,0xFA,0x1E,0xDA,0x10,0x92,0x71,
-0x5E,0x91,0x13,0xA7,0xDD,0xA4,0x6E,0x92,0xCC,0x32,0xD6,0xF5,0x21,0x66,0xC7,0x2F,
-0xEA,0x96,0x63,0x6A,0x65,0x45,0x92,0x95,0x01,0xB4,
-};
-
-
-/* subject:/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO Certification Authority */
-/* issuer :/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO Certification Authority */
-
-
-const unsigned char COMODO_Certification_Authority_certificate[1057]={
-0x30,0x82,0x04,0x1D,0x30,0x82,0x03,0x05,0xA0,0x03,0x02,0x01,0x02,0x02,0x10,0x4E,
-0x81,0x2D,0x8A,0x82,0x65,0xE0,0x0B,0x02,0xEE,0x3E,0x35,0x02,0x46,0xE5,0x3D,0x30,
-0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x05,0x05,0x00,0x30,0x81,
-0x81,0x31,0x0B,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x47,0x42,0x31,0x1B,
-0x30,0x19,0x06,0x03,0x55,0x04,0x08,0x13,0x12,0x47,0x72,0x65,0x61,0x74,0x65,0x72,
-0x20,0x4D,0x61,0x6E,0x63,0x68,0x65,0x73,0x74,0x65,0x72,0x31,0x10,0x30,0x0E,0x06,
-0x03,0x55,0x04,0x07,0x13,0x07,0x53,0x61,0x6C,0x66,0x6F,0x72,0x64,0x31,0x1A,0x30,
-0x18,0x06,0x03,0x55,0x04,0x0A,0x13,0x11,0x43,0x4F,0x4D,0x4F,0x44,0x4F,0x20,0x43,
-0x41,0x20,0x4C,0x69,0x6D,0x69,0x74,0x65,0x64,0x31,0x27,0x30,0x25,0x06,0x03,0x55,
-0x04,0x03,0x13,0x1E,0x43,0x4F,0x4D,0x4F,0x44,0x4F,0x20,0x43,0x65,0x72,0x74,0x69,
-0x66,0x69,0x63,0x61,0x74,0x69,0x6F,0x6E,0x20,0x41,0x75,0x74,0x68,0x6F,0x72,0x69,
-0x74,0x79,0x30,0x1E,0x17,0x0D,0x30,0x36,0x31,0x32,0x30,0x31,0x30,0x30,0x30,0x30,
-0x30,0x30,0x5A,0x17,0x0D,0x32,0x39,0x31,0x32,0x33,0x31,0x32,0x33,0x35,0x39,0x35,
-0x39,0x5A,0x30,0x81,0x81,0x31,0x0B,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,
-0x47,0x42,0x31,0x1B,0x30,0x19,0x06,0x03,0x55,0x04,0x08,0x13,0x12,0x47,0x72,0x65,
-0x61,0x74,0x65,0x72,0x20,0x4D,0x61,0x6E,0x63,0x68,0x65,0x73,0x74,0x65,0x72,0x31,
-0x10,0x30,0x0E,0x06,0x03,0x55,0x04,0x07,0x13,0x07,0x53,0x61,0x6C,0x66,0x6F,0x72,
-0x64,0x31,0x1A,0x30,0x18,0x06,0x03,0x55,0x04,0x0A,0x13,0x11,0x43,0x4F,0x4D,0x4F,
-0x44,0x4F,0x20,0x43,0x41,0x20,0x4C,0x69,0x6D,0x69,0x74,0x65,0x64,0x31,0x27,0x30,
-0x25,0x06,0x03,0x55,0x04,0x03,0x13,0x1E,0x43,0x4F,0x4D,0x4F,0x44,0x4F,0x20,0x43,
-0x65,0x72,0x74,0x69,0x66,0x69,0x63,0x61,0x74,0x69,0x6F,0x6E,0x20,0x41,0x75,0x74,
-0x68,0x6F,0x72,0x69,0x74,0x79,0x30,0x82,0x01,0x22,0x30,0x0D,0x06,0x09,0x2A,0x86,
-0x48,0x86,0xF7,0x0D,0x01,0x01,0x01,0x05,0x00,0x03,0x82,0x01,0x0F,0x00,0x30,0x82,
-0x01,0x0A,0x02,0x82,0x01,0x01,0x00,0xD0,0x40,0x8B,0x8B,0x72,0xE3,0x91,0x1B,0xF7,
-0x51,0xC1,0x1B,0x54,0x04,0x98,0xD3,0xA9,0xBF,0xC1,0xE6,0x8A,0x5D,0x3B,0x87,0xFB,
-0xBB,0x88,0xCE,0x0D,0xE3,0x2F,0x3F,0x06,0x96,0xF0,0xA2,0x29,0x50,0x99,0xAE,0xDB,
-0x3B,0xA1,0x57,0xB0,0x74,0x51,0x71,0xCD,0xED,0x42,0x91,0x4D,0x41,0xFE,0xA9,0xC8,
-0xD8,0x6A,0x86,0x77,0x44,0xBB,0x59,0x66,0x97,0x50,0x5E,0xB4,0xD4,0x2C,0x70,0x44,
-0xCF,0xDA,0x37,0x95,0x42,0x69,0x3C,0x30,0xC4,0x71,0xB3,0x52,0xF0,0x21,0x4D,0xA1,
-0xD8,0xBA,0x39,0x7C,0x1C,0x9E,0xA3,0x24,0x9D,0xF2,0x83,0x16,0x98,0xAA,0x16,0x7C,
-0x43,0x9B,0x15,0x5B,0xB7,0xAE,0x34,0x91,0xFE,0xD4,0x62,0x26,0x18,0x46,0x9A,0x3F,
-0xEB,0xC1,0xF9,0xF1,0x90,0x57,0xEB,0xAC,0x7A,0x0D,0x8B,0xDB,0x72,0x30,0x6A,0x66,
-0xD5,0xE0,0x46,0xA3,0x70,0xDC,0x68,0xD9,0xFF,0x04,0x48,0x89,0x77,0xDE,0xB5,0xE9,
-0xFB,0x67,0x6D,0x41,0xE9,0xBC,0x39,0xBD,0x32,0xD9,0x62,0x02,0xF1,0xB1,0xA8,0x3D,
-0x6E,0x37,0x9C,0xE2,0x2F,0xE2,0xD3,0xA2,0x26,0x8B,0xC6,0xB8,0x55,0x43,0x88,0xE1,
-0x23,0x3E,0xA5,0xD2,0x24,0x39,0x6A,0x47,0xAB,0x00,0xD4,0xA1,0xB3,0xA9,0x25,0xFE,
-0x0D,0x3F,0xA7,0x1D,0xBA,0xD3,0x51,0xC1,0x0B,0xA4,0xDA,0xAC,0x38,0xEF,0x55,0x50,
-0x24,0x05,0x65,0x46,0x93,0x34,0x4F,0x2D,0x8D,0xAD,0xC6,0xD4,0x21,0x19,0xD2,0x8E,
-0xCA,0x05,0x61,0x71,0x07,0x73,0x47,0xE5,0x8A,0x19,0x12,0xBD,0x04,0x4D,0xCE,0x4E,
-0x9C,0xA5,0x48,0xAC,0xBB,0x26,0xF7,0x02,0x03,0x01,0x00,0x01,0xA3,0x81,0x8E,0x30,
-0x81,0x8B,0x30,0x1D,0x06,0x03,0x55,0x1D,0x0E,0x04,0x16,0x04,0x14,0x0B,0x58,0xE5,
-0x8B,0xC6,0x4C,0x15,0x37,0xA4,0x40,0xA9,0x30,0xA9,0x21,0xBE,0x47,0x36,0x5A,0x56,
-0xFF,0x30,0x0E,0x06,0x03,0x55,0x1D,0x0F,0x01,0x01,0xFF,0x04,0x04,0x03,0x02,0x01,
-0x06,0x30,0x0F,0x06,0x03,0x55,0x1D,0x13,0x01,0x01,0xFF,0x04,0x05,0x30,0x03,0x01,
-0x01,0xFF,0x30,0x49,0x06,0x03,0x55,0x1D,0x1F,0x04,0x42,0x30,0x40,0x30,0x3E,0xA0,
-0x3C,0xA0,0x3A,0x86,0x38,0x68,0x74,0x74,0x70,0x3A,0x2F,0x2F,0x63,0x72,0x6C,0x2E,
-0x63,0x6F,0x6D,0x6F,0x64,0x6F,0x63,0x61,0x2E,0x63,0x6F,0x6D,0x2F,0x43,0x4F,0x4D,
-0x4F,0x44,0x4F,0x43,0x65,0x72,0x74,0x69,0x66,0x69,0x63,0x61,0x74,0x69,0x6F,0x6E,
-0x41,0x75,0x74,0x68,0x6F,0x72,0x69,0x74,0x79,0x2E,0x63,0x72,0x6C,0x30,0x0D,0x06,
-0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x05,0x05,0x00,0x03,0x82,0x01,0x01,
-0x00,0x3E,0x98,0x9E,0x9B,0xF6,0x1B,0xE9,0xD7,0x39,0xB7,0x78,0xAE,0x1D,0x72,0x18,
-0x49,0xD3,0x87,0xE4,0x43,0x82,0xEB,0x3F,0xC9,0xAA,0xF5,0xA8,0xB5,0xEF,0x55,0x7C,
-0x21,0x52,0x65,0xF9,0xD5,0x0D,0xE1,0x6C,0xF4,0x3E,0x8C,0x93,0x73,0x91,0x2E,0x02,
-0xC4,0x4E,0x07,0x71,0x6F,0xC0,0x8F,0x38,0x61,0x08,0xA8,0x1E,0x81,0x0A,0xC0,0x2F,
-0x20,0x2F,0x41,0x8B,0x91,0xDC,0x48,0x45,0xBC,0xF1,0xC6,0xDE,0xBA,0x76,0x6B,0x33,
-0xC8,0x00,0x2D,0x31,0x46,0x4C,0xED,0xE7,0x9D,0xCF,0x88,0x94,0xFF,0x33,0xC0,0x56,
-0xE8,0x24,0x86,0x26,0xB8,0xD8,0x38,0x38,0xDF,0x2A,0x6B,0xDD,0x12,0xCC,0xC7,0x3F,
-0x47,0x17,0x4C,0xA2,0xC2,0x06,0x96,0x09,0xD6,0xDB,0xFE,0x3F,0x3C,0x46,0x41,0xDF,
-0x58,0xE2,0x56,0x0F,0x3C,0x3B,0xC1,0x1C,0x93,0x35,0xD9,0x38,0x52,0xAC,0xEE,0xC8,
-0xEC,0x2E,0x30,0x4E,0x94,0x35,0xB4,0x24,0x1F,0x4B,0x78,0x69,0xDA,0xF2,0x02,0x38,
-0xCC,0x95,0x52,0x93,0xF0,0x70,0x25,0x59,0x9C,0x20,0x67,0xC4,0xEE,0xF9,0x8B,0x57,
-0x61,0xF4,0x92,0x76,0x7D,0x3F,0x84,0x8D,0x55,0xB7,0xE8,0xE5,0xAC,0xD5,0xF1,0xF5,
-0x19,0x56,0xA6,0x5A,0xFB,0x90,0x1C,0xAF,0x93,0xEB,0xE5,0x1C,0xD4,0x67,0x97,0x5D,
-0x04,0x0E,0xBE,0x0B,0x83,0xA6,0x17,0x83,0xB9,0x30,0x12,0xA0,0xC5,0x33,0x15,0x05,
-0xB9,0x0D,0xFB,0xC7,0x05,0x76,0xE3,0xD8,0x4A,0x8D,0xFC,0x34,0x17,0xA3,0xC6,0x21,
-0x28,0xBE,0x30,0x45,0x31,0x1E,0xC7,0x78,0xBE,0x58,0x61,0x38,0xAC,0x3B,0xE2,0x01,
-0x65,
-};
-
-
-/* subject:/C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert Global Root CA */
-/* issuer :/C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert Global Root CA */
-
-
-const unsigned char DigiCert_Global_Root_CA_certificate[947]={
-0x30,0x82,0x03,0xAF,0x30,0x82,0x02,0x97,0xA0,0x03,0x02,0x01,0x02,0x02,0x10,0x08,
-0x3B,0xE0,0x56,0x90,0x42,0x46,0xB1,0xA1,0x75,0x6A,0xC9,0x59,0x91,0xC7,0x4A,0x30,
-0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x05,0x05,0x00,0x30,0x61,
-0x31,0x0B,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x15,0x30,
-0x13,0x06,0x03,0x55,0x04,0x0A,0x13,0x0C,0x44,0x69,0x67,0x69,0x43,0x65,0x72,0x74,
-0x20,0x49,0x6E,0x63,0x31,0x19,0x30,0x17,0x06,0x03,0x55,0x04,0x0B,0x13,0x10,0x77,
-0x77,0x77,0x2E,0x64,0x69,0x67,0x69,0x63,0x65,0x72,0x74,0x2E,0x63,0x6F,0x6D,0x31,
-0x20,0x30,0x1E,0x06,0x03,0x55,0x04,0x03,0x13,0x17,0x44,0x69,0x67,0x69,0x43,0x65,
-0x72,0x74,0x20,0x47,0x6C,0x6F,0x62,0x61,0x6C,0x20,0x52,0x6F,0x6F,0x74,0x20,0x43,
-0x41,0x30,0x1E,0x17,0x0D,0x30,0x36,0x31,0x31,0x31,0x30,0x30,0x30,0x30,0x30,0x30,
-0x30,0x5A,0x17,0x0D,0x33,0x31,0x31,0x31,0x31,0x30,0x30,0x30,0x30,0x30,0x30,0x30,
-0x5A,0x30,0x61,0x31,0x0B,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,
-0x31,0x15,0x30,0x13,0x06,0x03,0x55,0x04,0x0A,0x13,0x0C,0x44,0x69,0x67,0x69,0x43,
-0x65,0x72,0x74,0x20,0x49,0x6E,0x63,0x31,0x19,0x30,0x17,0x06,0x03,0x55,0x04,0x0B,
-0x13,0x10,0x77,0x77,0x77,0x2E,0x64,0x69,0x67,0x69,0x63,0x65,0x72,0x74,0x2E,0x63,
-0x6F,0x6D,0x31,0x20,0x30,0x1E,0x06,0x03,0x55,0x04,0x03,0x13,0x17,0x44,0x69,0x67,
-0x69,0x43,0x65,0x72,0x74,0x20,0x47,0x6C,0x6F,0x62,0x61,0x6C,0x20,0x52,0x6F,0x6F,
-0x74,0x20,0x43,0x41,0x30,0x82,0x01,0x22,0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,
-0xF7,0x0D,0x01,0x01,0x01,0x05,0x00,0x03,0x82,0x01,0x0F,0x00,0x30,0x82,0x01,0x0A,
-0x02,0x82,0x01,0x01,0x00,0xE2,0x3B,0xE1,0x11,0x72,0xDE,0xA8,0xA4,0xD3,0xA3,0x57,
-0xAA,0x50,0xA2,0x8F,0x0B,0x77,0x90,0xC9,0xA2,0xA5,0xEE,0x12,0xCE,0x96,0x5B,0x01,
-0x09,0x20,0xCC,0x01,0x93,0xA7,0x4E,0x30,0xB7,0x53,0xF7,0x43,0xC4,0x69,0x00,0x57,
-0x9D,0xE2,0x8D,0x22,0xDD,0x87,0x06,0x40,0x00,0x81,0x09,0xCE,0xCE,0x1B,0x83,0xBF,
-0xDF,0xCD,0x3B,0x71,0x46,0xE2,0xD6,0x66,0xC7,0x05,0xB3,0x76,0x27,0x16,0x8F,0x7B,
-0x9E,0x1E,0x95,0x7D,0xEE,0xB7,0x48,0xA3,0x08,0xDA,0xD6,0xAF,0x7A,0x0C,0x39,0x06,
-0x65,0x7F,0x4A,0x5D,0x1F,0xBC,0x17,0xF8,0xAB,0xBE,0xEE,0x28,0xD7,0x74,0x7F,0x7A,
-0x78,0x99,0x59,0x85,0x68,0x6E,0x5C,0x23,0x32,0x4B,0xBF,0x4E,0xC0,0xE8,0x5A,0x6D,
-0xE3,0x70,0xBF,0x77,0x10,0xBF,0xFC,0x01,0xF6,0x85,0xD9,0xA8,0x44,0x10,0x58,0x32,
-0xA9,0x75,0x18,0xD5,0xD1,0xA2,0xBE,0x47,0xE2,0x27,0x6A,0xF4,0x9A,0x33,0xF8,0x49,
-0x08,0x60,0x8B,0xD4,0x5F,0xB4,0x3A,0x84,0xBF,0xA1,0xAA,0x4A,0x4C,0x7D,0x3E,0xCF,
-0x4F,0x5F,0x6C,0x76,0x5E,0xA0,0x4B,0x37,0x91,0x9E,0xDC,0x22,0xE6,0x6D,0xCE,0x14,
-0x1A,0x8E,0x6A,0xCB,0xFE,0xCD,0xB3,0x14,0x64,0x17,0xC7,0x5B,0x29,0x9E,0x32,0xBF,
-0xF2,0xEE,0xFA,0xD3,0x0B,0x42,0xD4,0xAB,0xB7,0x41,0x32,0xDA,0x0C,0xD4,0xEF,0xF8,
-0x81,0xD5,0xBB,0x8D,0x58,0x3F,0xB5,0x1B,0xE8,0x49,0x28,0xA2,0x70,0xDA,0x31,0x04,
-0xDD,0xF7,0xB2,0x16,0xF2,0x4C,0x0A,0x4E,0x07,0xA8,0xED,0x4A,0x3D,0x5E,0xB5,0x7F,
-0xA3,0x90,0xC3,0xAF,0x27,0x02,0x03,0x01,0x00,0x01,0xA3,0x63,0x30,0x61,0x30,0x0E,
-0x06,0x03,0x55,0x1D,0x0F,0x01,0x01,0xFF,0x04,0x04,0x03,0x02,0x01,0x86,0x30,0x0F,
-0x06,0x03,0x55,0x1D,0x13,0x01,0x01,0xFF,0x04,0x05,0x30,0x03,0x01,0x01,0xFF,0x30,
-0x1D,0x06,0x03,0x55,0x1D,0x0E,0x04,0x16,0x04,0x14,0x03,0xDE,0x50,0x35,0x56,0xD1,
-0x4C,0xBB,0x66,0xF0,0xA3,0xE2,0x1B,0x1B,0xC3,0x97,0xB2,0x3D,0xD1,0x55,0x30,0x1F,
-0x06,0x03,0x55,0x1D,0x23,0x04,0x18,0x30,0x16,0x80,0x14,0x03,0xDE,0x50,0x35,0x56,
-0xD1,0x4C,0xBB,0x66,0xF0,0xA3,0xE2,0x1B,0x1B,0xC3,0x97,0xB2,0x3D,0xD1,0x55,0x30,
-0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x05,0x05,0x00,0x03,0x82,
-0x01,0x01,0x00,0xCB,0x9C,0x37,0xAA,0x48,0x13,0x12,0x0A,0xFA,0xDD,0x44,0x9C,0x4F,
-0x52,0xB0,0xF4,0xDF,0xAE,0x04,0xF5,0x79,0x79,0x08,0xA3,0x24,0x18,0xFC,0x4B,0x2B,
-0x84,0xC0,0x2D,0xB9,0xD5,0xC7,0xFE,0xF4,0xC1,0x1F,0x58,0xCB,0xB8,0x6D,0x9C,0x7A,
-0x74,0xE7,0x98,0x29,0xAB,0x11,0xB5,0xE3,0x70,0xA0,0xA1,0xCD,0x4C,0x88,0x99,0x93,
-0x8C,0x91,0x70,0xE2,0xAB,0x0F,0x1C,0xBE,0x93,0xA9,0xFF,0x63,0xD5,0xE4,0x07,0x60,
-0xD3,0xA3,0xBF,0x9D,0x5B,0x09,0xF1,0xD5,0x8E,0xE3,0x53,0xF4,0x8E,0x63,0xFA,0x3F,
-0xA7,0xDB,0xB4,0x66,0xDF,0x62,0x66,0xD6,0xD1,0x6E,0x41,0x8D,0xF2,0x2D,0xB5,0xEA,
-0x77,0x4A,0x9F,0x9D,0x58,0xE2,0x2B,0x59,0xC0,0x40,0x23,0xED,0x2D,0x28,0x82,0x45,
-0x3E,0x79,0x54,0x92,0x26,0x98,0xE0,0x80,0x48,0xA8,0x37,0xEF,0xF0,0xD6,0x79,0x60,
-0x16,0xDE,0xAC,0xE8,0x0E,0xCD,0x6E,0xAC,0x44,0x17,0x38,0x2F,0x49,0xDA,0xE1,0x45,
-0x3E,0x2A,0xB9,0x36,0x53,0xCF,0x3A,0x50,0x06,0xF7,0x2E,0xE8,0xC4,0x57,0x49,0x6C,
-0x61,0x21,0x18,0xD5,0x04,0xAD,0x78,0x3C,0x2C,0x3A,0x80,0x6B,0xA7,0xEB,0xAF,0x15,
-0x14,0xE9,0xD8,0x89,0xC1,0xB9,0x38,0x6C,0xE2,0x91,0x6C,0x8A,0xFF,0x64,0xB9,0x77,
-0x25,0x57,0x30,0xC0,0x1B,0x24,0xA3,0xE1,0xDC,0xE9,0xDF,0x47,0x7C,0xB5,0xB4,0x24,
-0x08,0x05,0x30,0xEC,0x2D,0xBD,0x0B,0xBF,0x45,0xBF,0x50,0xB9,0xA9,0xF3,0xEB,0x98,
-0x01,0x12,0xAD,0xC8,0x88,0xC6,0x98,0x34,0x5F,0x8D,0x0A,0x3C,0xC6,0xE9,0xD5,0x95,
-0x95,0x6D,0xDE,
-};
-
-
-/* subject:/C=GB/ST=Greater Manchester/L=Salford/O=Comodo CA Limited/CN=AAA Certificate Services */
-/* issuer :/C=GB/ST=Greater Manchester/L=Salford/O=Comodo CA Limited/CN=AAA Certificate Services */
-
-
-const unsigned char Comodo_AAA_Services_root_certificate[1078]={
-0x30,0x82,0x04,0x32,0x30,0x82,0x03,0x1A,0xA0,0x03,0x02,0x01,0x02,0x02,0x01,0x01,
-0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x05,0x05,0x00,0x30,
-0x7B,0x31,0x0B,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x47,0x42,0x31,0x1B,
-0x30,0x19,0x06,0x03,0x55,0x04,0x08,0x0C,0x12,0x47,0x72,0x65,0x61,0x74,0x65,0x72,
-0x20,0x4D,0x61,0x6E,0x63,0x68,0x65,0x73,0x74,0x65,0x72,0x31,0x10,0x30,0x0E,0x06,
-0x03,0x55,0x04,0x07,0x0C,0x07,0x53,0x61,0x6C,0x66,0x6F,0x72,0x64,0x31,0x1A,0x30,
-0x18,0x06,0x03,0x55,0x04,0x0A,0x0C,0x11,0x43,0x6F,0x6D,0x6F,0x64,0x6F,0x20,0x43,
-0x41,0x20,0x4C,0x69,0x6D,0x69,0x74,0x65,0x64,0x31,0x21,0x30,0x1F,0x06,0x03,0x55,
-0x04,0x03,0x0C,0x18,0x41,0x41,0x41,0x20,0x43,0x65,0x72,0x74,0x69,0x66,0x69,0x63,
-0x61,0x74,0x65,0x20,0x53,0x65,0x72,0x76,0x69,0x63,0x65,0x73,0x30,0x1E,0x17,0x0D,
-0x30,0x34,0x30,0x31,0x30,0x31,0x30,0x30,0x30,0x30,0x30,0x30,0x5A,0x17,0x0D,0x32,
-0x38,0x31,0x32,0x33,0x31,0x32,0x33,0x35,0x39,0x35,0x39,0x5A,0x30,0x7B,0x31,0x0B,
-0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x47,0x42,0x31,0x1B,0x30,0x19,0x06,
-0x03,0x55,0x04,0x08,0x0C,0x12,0x47,0x72,0x65,0x61,0x74,0x65,0x72,0x20,0x4D,0x61,
-0x6E,0x63,0x68,0x65,0x73,0x74,0x65,0x72,0x31,0x10,0x30,0x0E,0x06,0x03,0x55,0x04,
-0x07,0x0C,0x07,0x53,0x61,0x6C,0x66,0x6F,0x72,0x64,0x31,0x1A,0x30,0x18,0x06,0x03,
-0x55,0x04,0x0A,0x0C,0x11,0x43,0x6F,0x6D,0x6F,0x64,0x6F,0x20,0x43,0x41,0x20,0x4C,
-0x69,0x6D,0x69,0x74,0x65,0x64,0x31,0x21,0x30,0x1F,0x06,0x03,0x55,0x04,0x03,0x0C,
-0x18,0x41,0x41,0x41,0x20,0x43,0x65,0x72,0x74,0x69,0x66,0x69,0x63,0x61,0x74,0x65,
-0x20,0x53,0x65,0x72,0x76,0x69,0x63,0x65,0x73,0x30,0x82,0x01,0x22,0x30,0x0D,0x06,
-0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x01,0x05,0x00,0x03,0x82,0x01,0x0F,
-0x00,0x30,0x82,0x01,0x0A,0x02,0x82,0x01,0x01,0x00,0xBE,0x40,0x9D,0xF4,0x6E,0xE1,
-0xEA,0x76,0x87,0x1C,0x4D,0x45,0x44,0x8E,0xBE,0x46,0xC8,0x83,0x06,0x9D,0xC1,0x2A,
-0xFE,0x18,0x1F,0x8E,0xE4,0x02,0xFA,0xF3,0xAB,0x5D,0x50,0x8A,0x16,0x31,0x0B,0x9A,
-0x06,0xD0,0xC5,0x70,0x22,0xCD,0x49,0x2D,0x54,0x63,0xCC,0xB6,0x6E,0x68,0x46,0x0B,
-0x53,0xEA,0xCB,0x4C,0x24,0xC0,0xBC,0x72,0x4E,0xEA,0xF1,0x15,0xAE,0xF4,0x54,0x9A,
-0x12,0x0A,0xC3,0x7A,0xB2,0x33,0x60,0xE2,0xDA,0x89,0x55,0xF3,0x22,0x58,0xF3,0xDE,
-0xDC,0xCF,0xEF,0x83,0x86,0xA2,0x8C,0x94,0x4F,0x9F,0x68,0xF2,0x98,0x90,0x46,0x84,
-0x27,0xC7,0x76,0xBF,0xE3,0xCC,0x35,0x2C,0x8B,0x5E,0x07,0x64,0x65,0x82,0xC0,0x48,
-0xB0,0xA8,0x91,0xF9,0x61,0x9F,0x76,0x20,0x50,0xA8,0x91,0xC7,0x66,0xB5,0xEB,0x78,
-0x62,0x03,0x56,0xF0,0x8A,0x1A,0x13,0xEA,0x31,0xA3,0x1E,0xA0,0x99,0xFD,0x38,0xF6,
-0xF6,0x27,0x32,0x58,0x6F,0x07,0xF5,0x6B,0xB8,0xFB,0x14,0x2B,0xAF,0xB7,0xAA,0xCC,
-0xD6,0x63,0x5F,0x73,0x8C,0xDA,0x05,0x99,0xA8,0x38,0xA8,0xCB,0x17,0x78,0x36,0x51,
-0xAC,0xE9,0x9E,0xF4,0x78,0x3A,0x8D,0xCF,0x0F,0xD9,0x42,0xE2,0x98,0x0C,0xAB,0x2F,
-0x9F,0x0E,0x01,0xDE,0xEF,0x9F,0x99,0x49,0xF1,0x2D,0xDF,0xAC,0x74,0x4D,0x1B,0x98,
-0xB5,0x47,0xC5,0xE5,0x29,0xD1,0xF9,0x90,0x18,0xC7,0x62,0x9C,0xBE,0x83,0xC7,0x26,
-0x7B,0x3E,0x8A,0x25,0xC7,0xC0,0xDD,0x9D,0xE6,0x35,0x68,0x10,0x20,0x9D,0x8F,0xD8,
-0xDE,0xD2,0xC3,0x84,0x9C,0x0D,0x5E,0xE8,0x2F,0xC9,0x02,0x03,0x01,0x00,0x01,0xA3,
-0x81,0xC0,0x30,0x81,0xBD,0x30,0x1D,0x06,0x03,0x55,0x1D,0x0E,0x04,0x16,0x04,0x14,
-0xA0,0x11,0x0A,0x23,0x3E,0x96,0xF1,0x07,0xEC,0xE2,0xAF,0x29,0xEF,0x82,0xA5,0x7F,
-0xD0,0x30,0xA4,0xB4,0x30,0x0E,0x06,0x03,0x55,0x1D,0x0F,0x01,0x01,0xFF,0x04,0x04,
-0x03,0x02,0x01,0x06,0x30,0x0F,0x06,0x03,0x55,0x1D,0x13,0x01,0x01,0xFF,0x04,0x05,
-0x30,0x03,0x01,0x01,0xFF,0x30,0x7B,0x06,0x03,0x55,0x1D,0x1F,0x04,0x74,0x30,0x72,
-0x30,0x38,0xA0,0x36,0xA0,0x34,0x86,0x32,0x68,0x74,0x74,0x70,0x3A,0x2F,0x2F,0x63,
-0x72,0x6C,0x2E,0x63,0x6F,0x6D,0x6F,0x64,0x6F,0x63,0x61,0x2E,0x63,0x6F,0x6D,0x2F,
-0x41,0x41,0x41,0x43,0x65,0x72,0x74,0x69,0x66,0x69,0x63,0x61,0x74,0x65,0x53,0x65,
-0x72,0x76,0x69,0x63,0x65,0x73,0x2E,0x63,0x72,0x6C,0x30,0x36,0xA0,0x34,0xA0,0x32,
-0x86,0x30,0x68,0x74,0x74,0x70,0x3A,0x2F,0x2F,0x63,0x72,0x6C,0x2E,0x63,0x6F,0x6D,
-0x6F,0x64,0x6F,0x2E,0x6E,0x65,0x74,0x2F,0x41,0x41,0x41,0x43,0x65,0x72,0x74,0x69,
-0x66,0x69,0x63,0x61,0x74,0x65,0x53,0x65,0x72,0x76,0x69,0x63,0x65,0x73,0x2E,0x63,
-0x72,0x6C,0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x05,0x05,
-0x00,0x03,0x82,0x01,0x01,0x00,0x08,0x56,0xFC,0x02,0xF0,0x9B,0xE8,0xFF,0xA4,0xFA,
-0xD6,0x7B,0xC6,0x44,0x80,0xCE,0x4F,0xC4,0xC5,0xF6,0x00,0x58,0xCC,0xA6,0xB6,0xBC,
-0x14,0x49,0x68,0x04,0x76,0xE8,0xE6,0xEE,0x5D,0xEC,0x02,0x0F,0x60,0xD6,0x8D,0x50,
-0x18,0x4F,0x26,0x4E,0x01,0xE3,0xE6,0xB0,0xA5,0xEE,0xBF,0xBC,0x74,0x54,0x41,0xBF,
-0xFD,0xFC,0x12,0xB8,0xC7,0x4F,0x5A,0xF4,0x89,0x60,0x05,0x7F,0x60,0xB7,0x05,0x4A,
-0xF3,0xF6,0xF1,0xC2,0xBF,0xC4,0xB9,0x74,0x86,0xB6,0x2D,0x7D,0x6B,0xCC,0xD2,0xF3,
-0x46,0xDD,0x2F,0xC6,0xE0,0x6A,0xC3,0xC3,0x34,0x03,0x2C,0x7D,0x96,0xDD,0x5A,0xC2,
-0x0E,0xA7,0x0A,0x99,0xC1,0x05,0x8B,0xAB,0x0C,0x2F,0xF3,0x5C,0x3A,0xCF,0x6C,0x37,
-0x55,0x09,0x87,0xDE,0x53,0x40,0x6C,0x58,0xEF,0xFC,0xB6,0xAB,0x65,0x6E,0x04,0xF6,
-0x1B,0xDC,0x3C,0xE0,0x5A,0x15,0xC6,0x9E,0xD9,0xF1,0x59,0x48,0x30,0x21,0x65,0x03,
-0x6C,0xEC,0xE9,0x21,0x73,0xEC,0x9B,0x03,0xA1,0xE0,0x37,0xAD,0xA0,0x15,0x18,0x8F,
-0xFA,0xBA,0x02,0xCE,0xA7,0x2C,0xA9,0x10,0x13,0x2C,0xD4,0xE5,0x08,0x26,0xAB,0x22,
-0x97,0x60,0xF8,0x90,0x5E,0x74,0xD4,0xA2,0x9A,0x53,0xBD,0xF2,0xA9,0x68,0xE0,0xA2,
-0x6E,0xC2,0xD7,0x6C,0xB1,0xA3,0x0F,0x9E,0xBF,0xEB,0x68,0xE7,0x56,0xF2,0xAE,0xF2,
-0xE3,0x2B,0x38,0x3A,0x09,0x81,0xB5,0x6B,0x85,0xD7,0xBE,0x2D,0xED,0x3F,0x1A,0xB7,
-0xB2,0x63,0xE2,0xF5,0x62,0x2C,0x82,0xD4,0x6A,0x00,0x41,0x50,0xF1,0x39,0x83,0x9F,
-0x95,0xE9,0x36,0x96,0x98,0x6E,
-};
-
-
-/* subject:/C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert High Assurance EV Root CA */
-/* issuer :/C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert High Assurance EV Root CA */
-
-
-const unsigned char DigiCert_High_Assurance_EV_Root_CA_certificate[969]={
-0x30,0x82,0x03,0xC5,0x30,0x82,0x02,0xAD,0xA0,0x03,0x02,0x01,0x02,0x02,0x10,0x02,
-0xAC,0x5C,0x26,0x6A,0x0B,0x40,0x9B,0x8F,0x0B,0x79,0xF2,0xAE,0x46,0x25,0x77,0x30,
-0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x05,0x05,0x00,0x30,0x6C,
-0x31,0x0B,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x15,0x30,
-0x13,0x06,0x03,0x55,0x04,0x0A,0x13,0x0C,0x44,0x69,0x67,0x69,0x43,0x65,0x72,0x74,
-0x20,0x49,0x6E,0x63,0x31,0x19,0x30,0x17,0x06,0x03,0x55,0x04,0x0B,0x13,0x10,0x77,
-0x77,0x77,0x2E,0x64,0x69,0x67,0x69,0x63,0x65,0x72,0x74,0x2E,0x63,0x6F,0x6D,0x31,
-0x2B,0x30,0x29,0x06,0x03,0x55,0x04,0x03,0x13,0x22,0x44,0x69,0x67,0x69,0x43,0x65,
-0x72,0x74,0x20,0x48,0x69,0x67,0x68,0x20,0x41,0x73,0x73,0x75,0x72,0x61,0x6E,0x63,
-0x65,0x20,0x45,0x56,0x20,0x52,0x6F,0x6F,0x74,0x20,0x43,0x41,0x30,0x1E,0x17,0x0D,
-0x30,0x36,0x31,0x31,0x31,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x5A,0x17,0x0D,0x33,
-0x31,0x31,0x31,0x31,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x5A,0x30,0x6C,0x31,0x0B,
-0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x15,0x30,0x13,0x06,
-0x03,0x55,0x04,0x0A,0x13,0x0C,0x44,0x69,0x67,0x69,0x43,0x65,0x72,0x74,0x20,0x49,
-0x6E,0x63,0x31,0x19,0x30,0x17,0x06,0x03,0x55,0x04,0x0B,0x13,0x10,0x77,0x77,0x77,
-0x2E,0x64,0x69,0x67,0x69,0x63,0x65,0x72,0x74,0x2E,0x63,0x6F,0x6D,0x31,0x2B,0x30,
-0x29,0x06,0x03,0x55,0x04,0x03,0x13,0x22,0x44,0x69,0x67,0x69,0x43,0x65,0x72,0x74,
-0x20,0x48,0x69,0x67,0x68,0x20,0x41,0x73,0x73,0x75,0x72,0x61,0x6E,0x63,0x65,0x20,
-0x45,0x56,0x20,0x52,0x6F,0x6F,0x74,0x20,0x43,0x41,0x30,0x82,0x01,0x22,0x30,0x0D,
-0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x01,0x05,0x00,0x03,0x82,0x01,
-0x0F,0x00,0x30,0x82,0x01,0x0A,0x02,0x82,0x01,0x01,0x00,0xC6,0xCC,0xE5,0x73,0xE6,
-0xFB,0xD4,0xBB,0xE5,0x2D,0x2D,0x32,0xA6,0xDF,0xE5,0x81,0x3F,0xC9,0xCD,0x25,0x49,
-0xB6,0x71,0x2A,0xC3,0xD5,0x94,0x34,0x67,0xA2,0x0A,0x1C,0xB0,0x5F,0x69,0xA6,0x40,
-0xB1,0xC4,0xB7,0xB2,0x8F,0xD0,0x98,0xA4,0xA9,0x41,0x59,0x3A,0xD3,0xDC,0x94,0xD6,
-0x3C,0xDB,0x74,0x38,0xA4,0x4A,0xCC,0x4D,0x25,0x82,0xF7,0x4A,0xA5,0x53,0x12,0x38,
-0xEE,0xF3,0x49,0x6D,0x71,0x91,0x7E,0x63,0xB6,0xAB,0xA6,0x5F,0xC3,0xA4,0x84,0xF8,
-0x4F,0x62,0x51,0xBE,0xF8,0xC5,0xEC,0xDB,0x38,0x92,0xE3,0x06,0xE5,0x08,0x91,0x0C,
-0xC4,0x28,0x41,0x55,0xFB,0xCB,0x5A,0x89,0x15,0x7E,0x71,0xE8,0x35,0xBF,0x4D,0x72,
-0x09,0x3D,0xBE,0x3A,0x38,0x50,0x5B,0x77,0x31,0x1B,0x8D,0xB3,0xC7,0x24,0x45,0x9A,
-0xA7,0xAC,0x6D,0x00,0x14,0x5A,0x04,0xB7,0xBA,0x13,0xEB,0x51,0x0A,0x98,0x41,0x41,
-0x22,0x4E,0x65,0x61,0x87,0x81,0x41,0x50,0xA6,0x79,0x5C,0x89,0xDE,0x19,0x4A,0x57,
-0xD5,0x2E,0xE6,0x5D,0x1C,0x53,0x2C,0x7E,0x98,0xCD,0x1A,0x06,0x16,0xA4,0x68,0x73,
-0xD0,0x34,0x04,0x13,0x5C,0xA1,0x71,0xD3,0x5A,0x7C,0x55,0xDB,0x5E,0x64,0xE1,0x37,
-0x87,0x30,0x56,0x04,0xE5,0x11,0xB4,0x29,0x80,0x12,0xF1,0x79,0x39,0x88,0xA2,0x02,
-0x11,0x7C,0x27,0x66,0xB7,0x88,0xB7,0x78,0xF2,0xCA,0x0A,0xA8,0x38,0xAB,0x0A,0x64,
-0xC2,0xBF,0x66,0x5D,0x95,0x84,0xC1,0xA1,0x25,0x1E,0x87,0x5D,0x1A,0x50,0x0B,0x20,
-0x12,0xCC,0x41,0xBB,0x6E,0x0B,0x51,0x38,0xB8,0x4B,0xCB,0x02,0x03,0x01,0x00,0x01,
-0xA3,0x63,0x30,0x61,0x30,0x0E,0x06,0x03,0x55,0x1D,0x0F,0x01,0x01,0xFF,0x04,0x04,
-0x03,0x02,0x01,0x86,0x30,0x0F,0x06,0x03,0x55,0x1D,0x13,0x01,0x01,0xFF,0x04,0x05,
-0x30,0x03,0x01,0x01,0xFF,0x30,0x1D,0x06,0x03,0x55,0x1D,0x0E,0x04,0x16,0x04,0x14,
-0xB1,0x3E,0xC3,0x69,0x03,0xF8,0xBF,0x47,0x01,0xD4,0x98,0x26,0x1A,0x08,0x02,0xEF,
-0x63,0x64,0x2B,0xC3,0x30,0x1F,0x06,0x03,0x55,0x1D,0x23,0x04,0x18,0x30,0x16,0x80,
-0x14,0xB1,0x3E,0xC3,0x69,0x03,0xF8,0xBF,0x47,0x01,0xD4,0x98,0x26,0x1A,0x08,0x02,
-0xEF,0x63,0x64,0x2B,0xC3,0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,
-0x01,0x05,0x05,0x00,0x03,0x82,0x01,0x01,0x00,0x1C,0x1A,0x06,0x97,0xDC,0xD7,0x9C,
-0x9F,0x3C,0x88,0x66,0x06,0x08,0x57,0x21,0xDB,0x21,0x47,0xF8,0x2A,0x67,0xAA,0xBF,
-0x18,0x32,0x76,0x40,0x10,0x57,0xC1,0x8A,0xF3,0x7A,0xD9,0x11,0x65,0x8E,0x35,0xFA,
-0x9E,0xFC,0x45,0xB5,0x9E,0xD9,0x4C,0x31,0x4B,0xB8,0x91,0xE8,0x43,0x2C,0x8E,0xB3,
-0x78,0xCE,0xDB,0xE3,0x53,0x79,0x71,0xD6,0xE5,0x21,0x94,0x01,0xDA,0x55,0x87,0x9A,
-0x24,0x64,0xF6,0x8A,0x66,0xCC,0xDE,0x9C,0x37,0xCD,0xA8,0x34,0xB1,0x69,0x9B,0x23,
-0xC8,0x9E,0x78,0x22,0x2B,0x70,0x43,0xE3,0x55,0x47,0x31,0x61,0x19,0xEF,0x58,0xC5,
-0x85,0x2F,0x4E,0x30,0xF6,0xA0,0x31,0x16,0x23,0xC8,0xE7,0xE2,0x65,0x16,0x33,0xCB,
-0xBF,0x1A,0x1B,0xA0,0x3D,0xF8,0xCA,0x5E,0x8B,0x31,0x8B,0x60,0x08,0x89,0x2D,0x0C,
-0x06,0x5C,0x52,0xB7,0xC4,0xF9,0x0A,0x98,0xD1,0x15,0x5F,0x9F,0x12,0xBE,0x7C,0x36,
-0x63,0x38,0xBD,0x44,0xA4,0x7F,0xE4,0x26,0x2B,0x0A,0xC4,0x97,0x69,0x0D,0xE9,0x8C,
-0xE2,0xC0,0x10,0x57,0xB8,0xC8,0x76,0x12,0x91,0x55,0xF2,0x48,0x69,0xD8,0xBC,0x2A,
-0x02,0x5B,0x0F,0x44,0xD4,0x20,0x31,0xDB,0xF4,0xBA,0x70,0x26,0x5D,0x90,0x60,0x9E,
-0xBC,0x4B,0x17,0x09,0x2F,0xB4,0xCB,0x1E,0x43,0x68,0xC9,0x07,0x27,0xC1,0xD2,0x5C,
-0xF7,0xEA,0x21,0xB9,0x68,0x12,0x9C,0x3C,0x9C,0xBF,0x9E,0xFC,0x80,0x5C,0x9B,0x63,
-0xCD,0xEC,0x47,0xAA,0x25,0x27,0x67,0xA0,0x37,0xF3,0x00,0x82,0x7D,0x54,0xD7,0xA9,
-0xF8,0xE9,0x2E,0x13,0xA3,0x77,0xE8,0x1F,0x4A,
-};
-
-
-/* subject:/C=US/O=GeoTrust Inc./CN=GeoTrust Universal CA */
-/* issuer :/C=US/O=GeoTrust Inc./CN=GeoTrust Universal CA */
-
-
-const unsigned char GeoTrust_Universal_CA_certificate[1388]={
-0x30,0x82,0x05,0x68,0x30,0x82,0x03,0x50,0xA0,0x03,0x02,0x01,0x02,0x02,0x01,0x01,
-0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x05,0x05,0x00,0x30,
-0x45,0x31,0x0B,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x16,
-0x30,0x14,0x06,0x03,0x55,0x04,0x0A,0x13,0x0D,0x47,0x65,0x6F,0x54,0x72,0x75,0x73,
-0x74,0x20,0x49,0x6E,0x63,0x2E,0x31,0x1E,0x30,0x1C,0x06,0x03,0x55,0x04,0x03,0x13,
-0x15,0x47,0x65,0x6F,0x54,0x72,0x75,0x73,0x74,0x20,0x55,0x6E,0x69,0x76,0x65,0x72,
-0x73,0x61,0x6C,0x20,0x43,0x41,0x30,0x1E,0x17,0x0D,0x30,0x34,0x30,0x33,0x30,0x34,
-0x30,0x35,0x30,0x30,0x30,0x30,0x5A,0x17,0x0D,0x32,0x39,0x30,0x33,0x30,0x34,0x30,
-0x35,0x30,0x30,0x30,0x30,0x5A,0x30,0x45,0x31,0x0B,0x30,0x09,0x06,0x03,0x55,0x04,
-0x06,0x13,0x02,0x55,0x53,0x31,0x16,0x30,0x14,0x06,0x03,0x55,0x04,0x0A,0x13,0x0D,
-0x47,0x65,0x6F,0x54,0x72,0x75,0x73,0x74,0x20,0x49,0x6E,0x63,0x2E,0x31,0x1E,0x30,
-0x1C,0x06,0x03,0x55,0x04,0x03,0x13,0x15,0x47,0x65,0x6F,0x54,0x72,0x75,0x73,0x74,
-0x20,0x55,0x6E,0x69,0x76,0x65,0x72,0x73,0x61,0x6C,0x20,0x43,0x41,0x30,0x82,0x02,
-0x22,0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x01,0x05,0x00,
-0x03,0x82,0x02,0x0F,0x00,0x30,0x82,0x02,0x0A,0x02,0x82,0x02,0x01,0x00,0xA6,0x15,
-0x55,0xA0,0xA3,0xC6,0xE0,0x1F,0x8C,0x9D,0x21,0x50,0xD7,0xC1,0xBE,0x2B,0x5B,0xB5,
-0xA4,0x9E,0xA1,0xD9,0x72,0x58,0xBD,0x00,0x1B,0x4C,0xBF,0x61,0xC9,0x14,0x1D,0x45,
-0x82,0xAB,0xC6,0x1D,0x80,0xD6,0x3D,0xEB,0x10,0x9C,0x3A,0xAF,0x6D,0x24,0xF8,0xBC,
-0x71,0x01,0x9E,0x06,0xF5,0x7C,0x5F,0x1E,0xC1,0x0E,0x55,0xCA,0x83,0x9A,0x59,0x30,
-0xAE,0x19,0xCB,0x30,0x48,0x95,0xED,0x22,0x37,0x8D,0xF4,0x4A,0x9A,0x72,0x66,0x3E,
-0xAD,0x95,0xC0,0xE0,0x16,0x00,0xE0,0x10,0x1F,0x2B,0x31,0x0E,0xD7,0x94,0x54,0xD3,
-0x42,0x33,0xA0,0x34,0x1D,0x1E,0x45,0x76,0xDD,0x4F,0xCA,0x18,0x37,0xEC,0x85,0x15,
-0x7A,0x19,0x08,0xFC,0xD5,0xC7,0x9C,0xF0,0xF2,0xA9,0x2E,0x10,0xA9,0x92,0xE6,0x3D,
-0x58,0x3D,0xA9,0x16,0x68,0x3C,0x2F,0x75,0x21,0x18,0x7F,0x28,0x77,0xA5,0xE1,0x61,
-0x17,0xB7,0xA6,0xE9,0xF8,0x1E,0x99,0xDB,0x73,0x6E,0xF4,0x0A,0xA2,0x21,0x6C,0xEE,
-0xDA,0xAA,0x85,0x92,0x66,0xAF,0xF6,0x7A,0x6B,0x82,0xDA,0xBA,0x22,0x08,0x35,0x0F,
-0xCF,0x42,0xF1,0x35,0xFA,0x6A,0xEE,0x7E,0x2B,0x25,0xCC,0x3A,0x11,0xE4,0x6D,0xAF,
-0x73,0xB2,0x76,0x1D,0xAD,0xD0,0xB2,0x78,0x67,0x1A,0xA4,0x39,0x1C,0x51,0x0B,0x67,
-0x56,0x83,0xFD,0x38,0x5D,0x0D,0xCE,0xDD,0xF0,0xBB,0x2B,0x96,0x1F,0xDE,0x7B,0x32,
-0x52,0xFD,0x1D,0xBB,0xB5,0x06,0xA1,0xB2,0x21,0x5E,0xA5,0xD6,0x95,0x68,0x7F,0xF0,
-0x99,0x9E,0xDC,0x45,0x08,0x3E,0xE7,0xD2,0x09,0x0D,0x35,0x94,0xDD,0x80,0x4E,0x53,
-0x97,0xD7,0xB5,0x09,0x44,0x20,0x64,0x16,0x17,0x03,0x02,0x4C,0x53,0x0D,0x68,0xDE,
-0xD5,0xAA,0x72,0x4D,0x93,0x6D,0x82,0x0E,0xDB,0x9C,0xBD,0xCF,0xB4,0xF3,0x5C,0x5D,
-0x54,0x7A,0x69,0x09,0x96,0xD6,0xDB,0x11,0xC1,0x8D,0x75,0xA8,0xB4,0xCF,0x39,0xC8,
-0xCE,0x3C,0xBC,0x24,0x7C,0xE6,0x62,0xCA,0xE1,0xBD,0x7D,0xA7,0xBD,0x57,0x65,0x0B,
-0xE4,0xFE,0x25,0xED,0xB6,0x69,0x10,0xDC,0x28,0x1A,0x46,0xBD,0x01,0x1D,0xD0,0x97,
-0xB5,0xE1,0x98,0x3B,0xC0,0x37,0x64,0xD6,0x3D,0x94,0xEE,0x0B,0xE1,0xF5,0x28,0xAE,
-0x0B,0x56,0xBF,0x71,0x8B,0x23,0x29,0x41,0x8E,0x86,0xC5,0x4B,0x52,0x7B,0xD8,0x71,
-0xAB,0x1F,0x8A,0x15,0xA6,0x3B,0x83,0x5A,0xD7,0x58,0x01,0x51,0xC6,0x4C,0x41,0xD9,
-0x7F,0xD8,0x41,0x67,0x72,0xA2,0x28,0xDF,0x60,0x83,0xA9,0x9E,0xC8,0x7B,0xFC,0x53,
-0x73,0x72,0x59,0xF5,0x93,0x7A,0x17,0x76,0x0E,0xCE,0xF7,0xE5,0x5C,0xD9,0x0B,0x55,
-0x34,0xA2,0xAA,0x5B,0xB5,0x6A,0x54,0xE7,0x13,0xCA,0x57,0xEC,0x97,0x6D,0xF4,0x5E,
-0x06,0x2F,0x45,0x8B,0x58,0xD4,0x23,0x16,0x92,0xE4,0x16,0x6E,0x28,0x63,0x59,0x30,
-0xDF,0x50,0x01,0x9C,0x63,0x89,0x1A,0x9F,0xDB,0x17,0x94,0x82,0x70,0x37,0xC3,0x24,
-0x9E,0x9A,0x47,0xD6,0x5A,0xCA,0x4E,0xA8,0x69,0x89,0x72,0x1F,0x91,0x6C,0xDB,0x7E,
-0x9E,0x1B,0xAD,0xC7,0x1F,0x73,0xDD,0x2C,0x4F,0x19,0x65,0xFD,0x7F,0x93,0x40,0x10,
-0x2E,0xD2,0xF0,0xED,0x3C,0x9E,0x2E,0x28,0x3E,0x69,0x26,0x33,0xC5,0x7B,0x02,0x03,
-0x01,0x00,0x01,0xA3,0x63,0x30,0x61,0x30,0x0F,0x06,0x03,0x55,0x1D,0x13,0x01,0x01,
-0xFF,0x04,0x05,0x30,0x03,0x01,0x01,0xFF,0x30,0x1D,0x06,0x03,0x55,0x1D,0x0E,0x04,
-0x16,0x04,0x14,0xDA,0xBB,0x2E,0xAA,0xB0,0x0C,0xB8,0x88,0x26,0x51,0x74,0x5C,0x6D,
-0x03,0xD3,0xC0,0xD8,0x8F,0x7A,0xD6,0x30,0x1F,0x06,0x03,0x55,0x1D,0x23,0x04,0x18,
-0x30,0x16,0x80,0x14,0xDA,0xBB,0x2E,0xAA,0xB0,0x0C,0xB8,0x88,0x26,0x51,0x74,0x5C,
-0x6D,0x03,0xD3,0xC0,0xD8,0x8F,0x7A,0xD6,0x30,0x0E,0x06,0x03,0x55,0x1D,0x0F,0x01,
-0x01,0xFF,0x04,0x04,0x03,0x02,0x01,0x86,0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,
-0xF7,0x0D,0x01,0x01,0x05,0x05,0x00,0x03,0x82,0x02,0x01,0x00,0x31,0x78,0xE6,0xC7,
-0xB5,0xDF,0xB8,0x94,0x40,0xC9,0x71,0xC4,0xA8,0x35,0xEC,0x46,0x1D,0xC2,0x85,0xF3,
-0x28,0x58,0x86,0xB0,0x0B,0xFC,0x8E,0xB2,0x39,0x8F,0x44,0x55,0xAB,0x64,0x84,0x5C,
-0x69,0xA9,0xD0,0x9A,0x38,0x3C,0xFA,0xE5,0x1F,0x35,0xE5,0x44,0xE3,0x80,0x79,0x94,
-0x68,0xA4,0xBB,0xC4,0x9F,0x3D,0xE1,0x34,0xCD,0x30,0x46,0x8B,0x54,0x2B,0x95,0xA5,
-0xEF,0xF7,0x3F,0x99,0x84,0xFD,0x35,0xE6,0xCF,0x31,0xC6,0xDC,0x6A,0xBF,0xA7,0xD7,
-0x23,0x08,0xE1,0x98,0x5E,0xC3,0x5A,0x08,0x76,0xA9,0xA6,0xAF,0x77,0x2F,0xB7,0x60,
-0xBD,0x44,0x46,0x6A,0xEF,0x97,0xFF,0x73,0x95,0xC1,0x8E,0xE8,0x93,0xFB,0xFD,0x31,
-0xB7,0xEC,0x57,0x11,0x11,0x45,0x9B,0x30,0xF1,0x1A,0x88,0x39,0xC1,0x4F,0x3C,0xA7,
-0x00,0xD5,0xC7,0xFC,0xAB,0x6D,0x80,0x22,0x70,0xA5,0x0C,0xE0,0x5D,0x04,0x29,0x02,
-0xFB,0xCB,0xA0,0x91,0xD1,0x7C,0xD6,0xC3,0x7E,0x50,0xD5,0x9D,0x58,0xBE,0x41,0x38,
-0xEB,0xB9,0x75,0x3C,0x15,0xD9,0x9B,0xC9,0x4A,0x83,0x59,0xC0,0xDA,0x53,0xFD,0x33,
-0xBB,0x36,0x18,0x9B,0x85,0x0F,0x15,0xDD,0xEE,0x2D,0xAC,0x76,0x93,0xB9,0xD9,0x01,
-0x8D,0x48,0x10,0xA8,0xFB,0xF5,0x38,0x86,0xF1,0xDB,0x0A,0xC6,0xBD,0x84,0xA3,0x23,
-0x41,0xDE,0xD6,0x77,0x6F,0x85,0xD4,0x85,0x1C,0x50,0xE0,0xAE,0x51,0x8A,0xBA,0x8D,
-0x3E,0x76,0xE2,0xB9,0xCA,0x27,0xF2,0x5F,0x9F,0xEF,0x6E,0x59,0x0D,0x06,0xD8,0x2B,
-0x17,0xA4,0xD2,0x7C,0x6B,0xBB,0x5F,0x14,0x1A,0x48,0x8F,0x1A,0x4C,0xE7,0xB3,0x47,
-0x1C,0x8E,0x4C,0x45,0x2B,0x20,0xEE,0x48,0xDF,0xE7,0xDD,0x09,0x8E,0x18,0xA8,0xDA,
-0x40,0x8D,0x92,0x26,0x11,0x53,0x61,0x73,0x5D,0xEB,0xBD,0xE7,0xC4,0x4D,0x29,0x37,
-0x61,0xEB,0xAC,0x39,0x2D,0x67,0x2E,0x16,0xD6,0xF5,0x00,0x83,0x85,0xA1,0xCC,0x7F,
-0x76,0xC4,0x7D,0xE4,0xB7,0x4B,0x66,0xEF,0x03,0x45,0x60,0x69,0xB6,0x0C,0x52,0x96,
-0x92,0x84,0x5E,0xA6,0xA3,0xB5,0xA4,0x3E,0x2B,0xD9,0xCC,0xD8,0x1B,0x47,0xAA,0xF2,
-0x44,0xDA,0x4F,0xF9,0x03,0xE8,0xF0,0x14,0xCB,0x3F,0xF3,0x83,0xDE,0xD0,0xC1,0x54,
-0xE3,0xB7,0xE8,0x0A,0x37,0x4D,0x8B,0x20,0x59,0x03,0x30,0x19,0xA1,0x2C,0xC8,0xBD,
-0x11,0x1F,0xDF,0xAE,0xC9,0x4A,0xC5,0xF3,0x27,0x66,0x66,0x86,0xAC,0x68,0x91,0xFF,
-0xD9,0xE6,0x53,0x1C,0x0F,0x8B,0x5C,0x69,0x65,0x0A,0x26,0xC8,0x1E,0x34,0xC3,0x5D,
-0x51,0x7B,0xD7,0xA9,0x9C,0x06,0xA1,0x36,0xDD,0xD5,0x89,0x94,0xBC,0xD9,0xE4,0x2D,
-0x0C,0x5E,0x09,0x6C,0x08,0x97,0x7C,0xA3,0x3D,0x7C,0x93,0xFF,0x3F,0xA1,0x14,0xA7,
-0xCF,0xB5,0x5D,0xEB,0xDB,0xDB,0x1C,0xC4,0x76,0xDF,0x88,0xB9,0xBD,0x45,0x05,0x95,
-0x1B,0xAE,0xFC,0x46,0x6A,0x4C,0xAF,0x48,0xE3,0xCE,0xAE,0x0F,0xD2,0x7E,0xEB,0xE6,
-0x6C,0x9C,0x4F,0x81,0x6A,0x7A,0x64,0xAC,0xBB,0x3E,0xD5,0xE7,0xCB,0x76,0x2E,0xC5,
-0xA7,0x48,0xC1,0x5C,0x90,0x0F,0xCB,0xC8,0x3F,0xFA,0xE6,0x32,0xE1,0x8D,0x1B,0x6F,
-0xA4,0xE6,0x8E,0xD8,0xF9,0x29,0x48,0x8A,0xCE,0x73,0xFE,0x2C,
-};
-
-
-/* subject:/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO ECC Certification Authority */
-/* issuer :/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO ECC Certification Authority */
-
-
-const unsigned char COMODO_ECC_Certification_Authority_certificate[653]={
-0x30,0x82,0x02,0x89,0x30,0x82,0x02,0x0F,0xA0,0x03,0x02,0x01,0x02,0x02,0x10,0x1F,
-0x47,0xAF,0xAA,0x62,0x00,0x70,0x50,0x54,0x4C,0x01,0x9E,0x9B,0x63,0x99,0x2A,0x30,
-0x0A,0x06,0x08,0x2A,0x86,0x48,0xCE,0x3D,0x04,0x03,0x03,0x30,0x81,0x85,0x31,0x0B,
-0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x47,0x42,0x31,0x1B,0x30,0x19,0x06,
-0x03,0x55,0x04,0x08,0x13,0x12,0x47,0x72,0x65,0x61,0x74,0x65,0x72,0x20,0x4D,0x61,
-0x6E,0x63,0x68,0x65,0x73,0x74,0x65,0x72,0x31,0x10,0x30,0x0E,0x06,0x03,0x55,0x04,
-0x07,0x13,0x07,0x53,0x61,0x6C,0x66,0x6F,0x72,0x64,0x31,0x1A,0x30,0x18,0x06,0x03,
-0x55,0x04,0x0A,0x13,0x11,0x43,0x4F,0x4D,0x4F,0x44,0x4F,0x20,0x43,0x41,0x20,0x4C,
-0x69,0x6D,0x69,0x74,0x65,0x64,0x31,0x2B,0x30,0x29,0x06,0x03,0x55,0x04,0x03,0x13,
-0x22,0x43,0x4F,0x4D,0x4F,0x44,0x4F,0x20,0x45,0x43,0x43,0x20,0x43,0x65,0x72,0x74,
-0x69,0x66,0x69,0x63,0x61,0x74,0x69,0x6F,0x6E,0x20,0x41,0x75,0x74,0x68,0x6F,0x72,
-0x69,0x74,0x79,0x30,0x1E,0x17,0x0D,0x30,0x38,0x30,0x33,0x30,0x36,0x30,0x30,0x30,
-0x30,0x30,0x30,0x5A,0x17,0x0D,0x33,0x38,0x30,0x31,0x31,0x38,0x32,0x33,0x35,0x39,
-0x35,0x39,0x5A,0x30,0x81,0x85,0x31,0x0B,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,
-0x02,0x47,0x42,0x31,0x1B,0x30,0x19,0x06,0x03,0x55,0x04,0x08,0x13,0x12,0x47,0x72,
-0x65,0x61,0x74,0x65,0x72,0x20,0x4D,0x61,0x6E,0x63,0x68,0x65,0x73,0x74,0x65,0x72,
-0x31,0x10,0x30,0x0E,0x06,0x03,0x55,0x04,0x07,0x13,0x07,0x53,0x61,0x6C,0x66,0x6F,
-0x72,0x64,0x31,0x1A,0x30,0x18,0x06,0x03,0x55,0x04,0x0A,0x13,0x11,0x43,0x4F,0x4D,
-0x4F,0x44,0x4F,0x20,0x43,0x41,0x20,0x4C,0x69,0x6D,0x69,0x74,0x65,0x64,0x31,0x2B,
-0x30,0x29,0x06,0x03,0x55,0x04,0x03,0x13,0x22,0x43,0x4F,0x4D,0x4F,0x44,0x4F,0x20,
-0x45,0x43,0x43,0x20,0x43,0x65,0x72,0x74,0x69,0x66,0x69,0x63,0x61,0x74,0x69,0x6F,
-0x6E,0x20,0x41,0x75,0x74,0x68,0x6F,0x72,0x69,0x74,0x79,0x30,0x76,0x30,0x10,0x06,
-0x07,0x2A,0x86,0x48,0xCE,0x3D,0x02,0x01,0x06,0x05,0x2B,0x81,0x04,0x00,0x22,0x03,
-0x62,0x00,0x04,0x03,0x47,0x7B,0x2F,0x75,0xC9,0x82,0x15,0x85,0xFB,0x75,0xE4,0x91,
-0x16,0xD4,0xAB,0x62,0x99,0xF5,0x3E,0x52,0x0B,0x06,0xCE,0x41,0x00,0x7F,0x97,0xE1,
-0x0A,0x24,0x3C,0x1D,0x01,0x04,0xEE,0x3D,0xD2,0x8D,0x09,0x97,0x0C,0xE0,0x75,0xE4,
-0xFA,0xFB,0x77,0x8A,0x2A,0xF5,0x03,0x60,0x4B,0x36,0x8B,0x16,0x23,0x16,0xAD,0x09,
-0x71,0xF4,0x4A,0xF4,0x28,0x50,0xB4,0xFE,0x88,0x1C,0x6E,0x3F,0x6C,0x2F,0x2F,0x09,
-0x59,0x5B,0xA5,0x5B,0x0B,0x33,0x99,0xE2,0xC3,0x3D,0x89,0xF9,0x6A,0x2C,0xEF,0xB2,
-0xD3,0x06,0xE9,0xA3,0x42,0x30,0x40,0x30,0x1D,0x06,0x03,0x55,0x1D,0x0E,0x04,0x16,
-0x04,0x14,0x75,0x71,0xA7,0x19,0x48,0x19,0xBC,0x9D,0x9D,0xEA,0x41,0x47,0xDF,0x94,
-0xC4,0x48,0x77,0x99,0xD3,0x79,0x30,0x0E,0x06,0x03,0x55,0x1D,0x0F,0x01,0x01,0xFF,
-0x04,0x04,0x03,0x02,0x01,0x06,0x30,0x0F,0x06,0x03,0x55,0x1D,0x13,0x01,0x01,0xFF,
-0x04,0x05,0x30,0x03,0x01,0x01,0xFF,0x30,0x0A,0x06,0x08,0x2A,0x86,0x48,0xCE,0x3D,
-0x04,0x03,0x03,0x03,0x68,0x00,0x30,0x65,0x02,0x31,0x00,0xEF,0x03,0x5B,0x7A,0xAC,
-0xB7,0x78,0x0A,0x72,0xB7,0x88,0xDF,0xFF,0xB5,0x46,0x14,0x09,0x0A,0xFA,0xA0,0xE6,
-0x7D,0x08,0xC6,0x1A,0x87,0xBD,0x18,0xA8,0x73,0xBD,0x26,0xCA,0x60,0x0C,0x9D,0xCE,
-0x99,0x9F,0xCF,0x5C,0x0F,0x30,0xE1,0xBE,0x14,0x31,0xEA,0x02,0x30,0x14,0xF4,0x93,
-0x3C,0x49,0xA7,0x33,0x7A,0x90,0x46,0x47,0xB3,0x63,0x7D,0x13,0x9B,0x4E,0xB7,0x6F,
-0x18,0x37,0x80,0x53,0xFE,0xDD,0x20,0xE0,0x35,0x9A,0x36,0xD1,0xC7,0x01,0xB9,0xE6,
-0xDC,0xDD,0xF3,0xFF,0x1D,0x2C,0x3A,0x16,0x57,0xD9,0x92,0x39,0xD6,
-};
-
-
-/* subject:/C=US/O=Entrust, Inc./OU=See www.entrust.net/legal-terms/OU=(c) 2009 Entrust, Inc. - for authorized use only/CN=Entrust Root Certification Authority - G2 */
-/* issuer :/C=US/O=Entrust, Inc./OU=See www.entrust.net/legal-terms/OU=(c) 2009 Entrust, Inc. - for authorized use only/CN=Entrust Root Certification Authority - G2 */
-
-
-const unsigned char Entrust_Root_Certification_Authority___G2_certificate[1090]={
-0x30,0x82,0x04,0x3E,0x30,0x82,0x03,0x26,0xA0,0x03,0x02,0x01,0x02,0x02,0x04,0x4A,
-0x53,0x8C,0x28,0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x0B,
-0x05,0x00,0x30,0x81,0xBE,0x31,0x0B,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,
-0x55,0x53,0x31,0x16,0x30,0x14,0x06,0x03,0x55,0x04,0x0A,0x13,0x0D,0x45,0x6E,0x74,
-0x72,0x75,0x73,0x74,0x2C,0x20,0x49,0x6E,0x63,0x2E,0x31,0x28,0x30,0x26,0x06,0x03,
-0x55,0x04,0x0B,0x13,0x1F,0x53,0x65,0x65,0x20,0x77,0x77,0x77,0x2E,0x65,0x6E,0x74,
-0x72,0x75,0x73,0x74,0x2E,0x6E,0x65,0x74,0x2F,0x6C,0x65,0x67,0x61,0x6C,0x2D,0x74,
-0x65,0x72,0x6D,0x73,0x31,0x39,0x30,0x37,0x06,0x03,0x55,0x04,0x0B,0x13,0x30,0x28,
-0x63,0x29,0x20,0x32,0x30,0x30,0x39,0x20,0x45,0x6E,0x74,0x72,0x75,0x73,0x74,0x2C,
-0x20,0x49,0x6E,0x63,0x2E,0x20,0x2D,0x20,0x66,0x6F,0x72,0x20,0x61,0x75,0x74,0x68,
-0x6F,0x72,0x69,0x7A,0x65,0x64,0x20,0x75,0x73,0x65,0x20,0x6F,0x6E,0x6C,0x79,0x31,
-0x32,0x30,0x30,0x06,0x03,0x55,0x04,0x03,0x13,0x29,0x45,0x6E,0x74,0x72,0x75,0x73,
-0x74,0x20,0x52,0x6F,0x6F,0x74,0x20,0x43,0x65,0x72,0x74,0x69,0x66,0x69,0x63,0x61,
-0x74,0x69,0x6F,0x6E,0x20,0x41,0x75,0x74,0x68,0x6F,0x72,0x69,0x74,0x79,0x20,0x2D,
-0x20,0x47,0x32,0x30,0x1E,0x17,0x0D,0x30,0x39,0x30,0x37,0x30,0x37,0x31,0x37,0x32,
-0x35,0x35,0x34,0x5A,0x17,0x0D,0x33,0x30,0x31,0x32,0x30,0x37,0x31,0x37,0x35,0x35,
-0x35,0x34,0x5A,0x30,0x81,0xBE,0x31,0x0B,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,
-0x02,0x55,0x53,0x31,0x16,0x30,0x14,0x06,0x03,0x55,0x04,0x0A,0x13,0x0D,0x45,0x6E,
-0x74,0x72,0x75,0x73,0x74,0x2C,0x20,0x49,0x6E,0x63,0x2E,0x31,0x28,0x30,0x26,0x06,
-0x03,0x55,0x04,0x0B,0x13,0x1F,0x53,0x65,0x65,0x20,0x77,0x77,0x77,0x2E,0x65,0x6E,
-0x74,0x72,0x75,0x73,0x74,0x2E,0x6E,0x65,0x74,0x2F,0x6C,0x65,0x67,0x61,0x6C,0x2D,
-0x74,0x65,0x72,0x6D,0x73,0x31,0x39,0x30,0x37,0x06,0x03,0x55,0x04,0x0B,0x13,0x30,
-0x28,0x63,0x29,0x20,0x32,0x30,0x30,0x39,0x20,0x45,0x6E,0x74,0x72,0x75,0x73,0x74,
-0x2C,0x20,0x49,0x6E,0x63,0x2E,0x20,0x2D,0x20,0x66,0x6F,0x72,0x20,0x61,0x75,0x74,
-0x68,0x6F,0x72,0x69,0x7A,0x65,0x64,0x20,0x75,0x73,0x65,0x20,0x6F,0x6E,0x6C,0x79,
-0x31,0x32,0x30,0x30,0x06,0x03,0x55,0x04,0x03,0x13,0x29,0x45,0x6E,0x74,0x72,0x75,
-0x73,0x74,0x20,0x52,0x6F,0x6F,0x74,0x20,0x43,0x65,0x72,0x74,0x69,0x66,0x69,0x63,
-0x61,0x74,0x69,0x6F,0x6E,0x20,0x41,0x75,0x74,0x68,0x6F,0x72,0x69,0x74,0x79,0x20,
-0x2D,0x20,0x47,0x32,0x30,0x82,0x01,0x22,0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,
-0xF7,0x0D,0x01,0x01,0x01,0x05,0x00,0x03,0x82,0x01,0x0F,0x00,0x30,0x82,0x01,0x0A,
-0x02,0x82,0x01,0x01,0x00,0xBA,0x84,0xB6,0x72,0xDB,0x9E,0x0C,0x6B,0xE2,0x99,0xE9,
-0x30,0x01,0xA7,0x76,0xEA,0x32,0xB8,0x95,0x41,0x1A,0xC9,0xDA,0x61,0x4E,0x58,0x72,
-0xCF,0xFE,0xF6,0x82,0x79,0xBF,0x73,0x61,0x06,0x0A,0xA5,0x27,0xD8,0xB3,0x5F,0xD3,
-0x45,0x4E,0x1C,0x72,0xD6,0x4E,0x32,0xF2,0x72,0x8A,0x0F,0xF7,0x83,0x19,0xD0,0x6A,
-0x80,0x80,0x00,0x45,0x1E,0xB0,0xC7,0xE7,0x9A,0xBF,0x12,0x57,0x27,0x1C,0xA3,0x68,
-0x2F,0x0A,0x87,0xBD,0x6A,0x6B,0x0E,0x5E,0x65,0xF3,0x1C,0x77,0xD5,0xD4,0x85,0x8D,
-0x70,0x21,0xB4,0xB3,0x32,0xE7,0x8B,0xA2,0xD5,0x86,0x39,0x02,0xB1,0xB8,0xD2,0x47,
-0xCE,0xE4,0xC9,0x49,0xC4,0x3B,0xA7,0xDE,0xFB,0x54,0x7D,0x57,0xBE,0xF0,0xE8,0x6E,
-0xC2,0x79,0xB2,0x3A,0x0B,0x55,0xE2,0x50,0x98,0x16,0x32,0x13,0x5C,0x2F,0x78,0x56,
-0xC1,0xC2,0x94,0xB3,0xF2,0x5A,0xE4,0x27,0x9A,0x9F,0x24,0xD7,0xC6,0xEC,0xD0,0x9B,
-0x25,0x82,0xE3,0xCC,0xC2,0xC4,0x45,0xC5,0x8C,0x97,0x7A,0x06,0x6B,0x2A,0x11,0x9F,
-0xA9,0x0A,0x6E,0x48,0x3B,0x6F,0xDB,0xD4,0x11,0x19,0x42,0xF7,0x8F,0x07,0xBF,0xF5,
-0x53,0x5F,0x9C,0x3E,0xF4,0x17,0x2C,0xE6,0x69,0xAC,0x4E,0x32,0x4C,0x62,0x77,0xEA,
-0xB7,0xE8,0xE5,0xBB,0x34,0xBC,0x19,0x8B,0xAE,0x9C,0x51,0xE7,0xB7,0x7E,0xB5,0x53,
-0xB1,0x33,0x22,0xE5,0x6D,0xCF,0x70,0x3C,0x1A,0xFA,0xE2,0x9B,0x67,0xB6,0x83,0xF4,
-0x8D,0xA5,0xAF,0x62,0x4C,0x4D,0xE0,0x58,0xAC,0x64,0x34,0x12,0x03,0xF8,0xB6,0x8D,
-0x94,0x63,0x24,0xA4,0x71,0x02,0x03,0x01,0x00,0x01,0xA3,0x42,0x30,0x40,0x30,0x0E,
-0x06,0x03,0x55,0x1D,0x0F,0x01,0x01,0xFF,0x04,0x04,0x03,0x02,0x01,0x06,0x30,0x0F,
-0x06,0x03,0x55,0x1D,0x13,0x01,0x01,0xFF,0x04,0x05,0x30,0x03,0x01,0x01,0xFF,0x30,
-0x1D,0x06,0x03,0x55,0x1D,0x0E,0x04,0x16,0x04,0x14,0x6A,0x72,0x26,0x7A,0xD0,0x1E,
-0xEF,0x7D,0xE7,0x3B,0x69,0x51,0xD4,0x6C,0x8D,0x9F,0x90,0x12,0x66,0xAB,0x30,0x0D,
-0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x0B,0x05,0x00,0x03,0x82,0x01,
-0x01,0x00,0x79,0x9F,0x1D,0x96,0xC6,0xB6,0x79,0x3F,0x22,0x8D,0x87,0xD3,0x87,0x03,
-0x04,0x60,0x6A,0x6B,0x9A,0x2E,0x59,0x89,0x73,0x11,0xAC,0x43,0xD1,0xF5,0x13,0xFF,
-0x8D,0x39,0x2B,0xC0,0xF2,0xBD,0x4F,0x70,0x8C,0xA9,0x2F,0xEA,0x17,0xC4,0x0B,0x54,
-0x9E,0xD4,0x1B,0x96,0x98,0x33,0x3C,0xA8,0xAD,0x62,0xA2,0x00,0x76,0xAB,0x59,0x69,
-0x6E,0x06,0x1D,0x7E,0xC4,0xB9,0x44,0x8D,0x98,0xAF,0x12,0xD4,0x61,0xDB,0x0A,0x19,
-0x46,0x47,0xF3,0xEB,0xF7,0x63,0xC1,0x40,0x05,0x40,0xA5,0xD2,0xB7,0xF4,0xB5,0x9A,
-0x36,0xBF,0xA9,0x88,0x76,0x88,0x04,0x55,0x04,0x2B,0x9C,0x87,0x7F,0x1A,0x37,0x3C,
-0x7E,0x2D,0xA5,0x1A,0xD8,0xD4,0x89,0x5E,0xCA,0xBD,0xAC,0x3D,0x6C,0xD8,0x6D,0xAF,
-0xD5,0xF3,0x76,0x0F,0xCD,0x3B,0x88,0x38,0x22,0x9D,0x6C,0x93,0x9A,0xC4,0x3D,0xBF,
-0x82,0x1B,0x65,0x3F,0xA6,0x0F,0x5D,0xAA,0xFC,0xE5,0xB2,0x15,0xCA,0xB5,0xAD,0xC6,
-0xBC,0x3D,0xD0,0x84,0xE8,0xEA,0x06,0x72,0xB0,0x4D,0x39,0x32,0x78,0xBF,0x3E,0x11,
-0x9C,0x0B,0xA4,0x9D,0x9A,0x21,0xF3,0xF0,0x9B,0x0B,0x30,0x78,0xDB,0xC1,0xDC,0x87,
-0x43,0xFE,0xBC,0x63,0x9A,0xCA,0xC5,0xC2,0x1C,0xC9,0xC7,0x8D,0xFF,0x3B,0x12,0x58,
-0x08,0xE6,0xB6,0x3D,0xEC,0x7A,0x2C,0x4E,0xFB,0x83,0x96,0xCE,0x0C,0x3C,0x69,0x87,
-0x54,0x73,0xA4,0x73,0xC2,0x93,0xFF,0x51,0x10,0xAC,0x15,0x54,0x01,0xD8,0xFC,0x05,
-0xB1,0x89,0xA1,0x7F,0x74,0x83,0x9A,0x49,0xD7,0xDC,0x4E,0x7B,0x8A,0x48,0x6F,0x8B,
-0x45,0xF6,
-};
-
-
-/* subject:/C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert Assured ID Root G2 */
-/* issuer :/C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert Assured ID Root G2 */
-
-
-const unsigned char DigiCert_Assured_ID_Root_G2_certificate[922]={
-0x30,0x82,0x03,0x96,0x30,0x82,0x02,0x7E,0xA0,0x03,0x02,0x01,0x02,0x02,0x10,0x0B,
-0x93,0x1C,0x3A,0xD6,0x39,0x67,0xEA,0x67,0x23,0xBF,0xC3,0xAF,0x9A,0xF4,0x4B,0x30,
-0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x0B,0x05,0x00,0x30,0x65,
-0x31,0x0B,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x15,0x30,
-0x13,0x06,0x03,0x55,0x04,0x0A,0x13,0x0C,0x44,0x69,0x67,0x69,0x43,0x65,0x72,0x74,
-0x20,0x49,0x6E,0x63,0x31,0x19,0x30,0x17,0x06,0x03,0x55,0x04,0x0B,0x13,0x10,0x77,
-0x77,0x77,0x2E,0x64,0x69,0x67,0x69,0x63,0x65,0x72,0x74,0x2E,0x63,0x6F,0x6D,0x31,
-0x24,0x30,0x22,0x06,0x03,0x55,0x04,0x03,0x13,0x1B,0x44,0x69,0x67,0x69,0x43,0x65,
-0x72,0x74,0x20,0x41,0x73,0x73,0x75,0x72,0x65,0x64,0x20,0x49,0x44,0x20,0x52,0x6F,
-0x6F,0x74,0x20,0x47,0x32,0x30,0x1E,0x17,0x0D,0x31,0x33,0x30,0x38,0x30,0x31,0x31,
-0x32,0x30,0x30,0x30,0x30,0x5A,0x17,0x0D,0x33,0x38,0x30,0x31,0x31,0x35,0x31,0x32,
-0x30,0x30,0x30,0x30,0x5A,0x30,0x65,0x31,0x0B,0x30,0x09,0x06,0x03,0x55,0x04,0x06,
-0x13,0x02,0x55,0x53,0x31,0x15,0x30,0x13,0x06,0x03,0x55,0x04,0x0A,0x13,0x0C,0x44,
-0x69,0x67,0x69,0x43,0x65,0x72,0x74,0x20,0x49,0x6E,0x63,0x31,0x19,0x30,0x17,0x06,
-0x03,0x55,0x04,0x0B,0x13,0x10,0x77,0x77,0x77,0x2E,0x64,0x69,0x67,0x69,0x63,0x65,
-0x72,0x74,0x2E,0x63,0x6F,0x6D,0x31,0x24,0x30,0x22,0x06,0x03,0x55,0x04,0x03,0x13,
-0x1B,0x44,0x69,0x67,0x69,0x43,0x65,0x72,0x74,0x20,0x41,0x73,0x73,0x75,0x72,0x65,
-0x64,0x20,0x49,0x44,0x20,0x52,0x6F,0x6F,0x74,0x20,0x47,0x32,0x30,0x82,0x01,0x22,
-0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x01,0x05,0x00,0x03,
-0x82,0x01,0x0F,0x00,0x30,0x82,0x01,0x0A,0x02,0x82,0x01,0x01,0x00,0xD9,0xE7,0x28,
-0x2F,0x52,0x3F,0x36,0x72,0x49,0x88,0x93,0x34,0xF3,0xF8,0x6A,0x1E,0x31,0x54,0x80,
-0x9F,0xAD,0x54,0x41,0xB5,0x47,0xDF,0x96,0xA8,0xD4,0xAF,0x80,0x2D,0xB9,0x0A,0xCF,
-0x75,0xFD,0x89,0xA5,0x7D,0x24,0xFA,0xE3,0x22,0x0C,0x2B,0xBC,0x95,0x17,0x0B,0x33,
-0xBF,0x19,0x4D,0x41,0x06,0x90,0x00,0xBD,0x0C,0x4D,0x10,0xFE,0x07,0xB5,0xE7,0x1C,
-0x6E,0x22,0x55,0x31,0x65,0x97,0xBD,0xD3,0x17,0xD2,0x1E,0x62,0xF3,0xDB,0xEA,0x6C,
-0x50,0x8C,0x3F,0x84,0x0C,0x96,0xCF,0xB7,0xCB,0x03,0xE0,0xCA,0x6D,0xA1,0x14,0x4C,
-0x1B,0x89,0xDD,0xED,0x00,0xB0,0x52,0x7C,0xAF,0x91,0x6C,0xB1,0x38,0x13,0xD1,0xE9,
-0x12,0x08,0xC0,0x00,0xB0,0x1C,0x2B,0x11,0xDA,0x77,0x70,0x36,0x9B,0xAE,0xCE,0x79,
-0x87,0xDC,0x82,0x70,0xE6,0x09,0x74,0x70,0x55,0x69,0xAF,0xA3,0x68,0x9F,0xBF,0xDD,
-0xB6,0x79,0xB3,0xF2,0x9D,0x70,0x29,0x55,0xF4,0xAB,0xFF,0x95,0x61,0xF3,0xC9,0x40,
-0x6F,0x1D,0xD1,0xBE,0x93,0xBB,0xD3,0x88,0x2A,0xBB,0x9D,0xBF,0x72,0x5A,0x56,0x71,
-0x3B,0x3F,0xD4,0xF3,0xD1,0x0A,0xFE,0x28,0xEF,0xA3,0xEE,0xD9,0x99,0xAF,0x03,0xD3,
-0x8F,0x60,0xB7,0xF2,0x92,0xA1,0xB1,0xBD,0x89,0x89,0x1F,0x30,0xCD,0xC3,0xA6,0x2E,
-0x62,0x33,0xAE,0x16,0x02,0x77,0x44,0x5A,0xE7,0x81,0x0A,0x3C,0xA7,0x44,0x2E,0x79,
-0xB8,0x3F,0x04,0xBC,0x5C,0xA0,0x87,0xE1,0x1B,0xAF,0x51,0x8E,0xCD,0xEC,0x2C,0xFA,
-0xF8,0xFE,0x6D,0xF0,0x3A,0x7C,0xAA,0x8B,0xE4,0x67,0x95,0x31,0x8D,0x02,0x03,0x01,
-0x00,0x01,0xA3,0x42,0x30,0x40,0x30,0x0F,0x06,0x03,0x55,0x1D,0x13,0x01,0x01,0xFF,
-0x04,0x05,0x30,0x03,0x01,0x01,0xFF,0x30,0x0E,0x06,0x03,0x55,0x1D,0x0F,0x01,0x01,
-0xFF,0x04,0x04,0x03,0x02,0x01,0x86,0x30,0x1D,0x06,0x03,0x55,0x1D,0x0E,0x04,0x16,
-0x04,0x14,0xCE,0xC3,0x4A,0xB9,0x99,0x55,0xF2,0xB8,0xDB,0x60,0xBF,0xA9,0x7E,0xBD,
-0x56,0xB5,0x97,0x36,0xA7,0xD6,0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,
-0x01,0x01,0x0B,0x05,0x00,0x03,0x82,0x01,0x01,0x00,0xCA,0xA5,0x55,0x8C,0xE3,0xC8,
-0x41,0x6E,0x69,0x27,0xA7,0x75,0x11,0xEF,0x3C,0x86,0x36,0x6F,0xD2,0x9D,0xC6,0x78,
-0x38,0x1D,0x69,0x96,0xA2,0x92,0x69,0x2E,0x38,0x6C,0x9B,0x7D,0x04,0xD4,0x89,0xA5,
-0xB1,0x31,0x37,0x8A,0xC9,0x21,0xCC,0xAB,0x6C,0xCD,0x8B,0x1C,0x9A,0xD6,0xBF,0x48,
-0xD2,0x32,0x66,0xC1,0x8A,0xC0,0xF3,0x2F,0x3A,0xEF,0xC0,0xE3,0xD4,0x91,0x86,0xD1,
-0x50,0xE3,0x03,0xDB,0x73,0x77,0x6F,0x4A,0x39,0x53,0xED,0xDE,0x26,0xC7,0xB5,0x7D,
-0xAF,0x2B,0x42,0xD1,0x75,0x62,0xE3,0x4A,0x2B,0x02,0xC7,0x50,0x4B,0xE0,0x69,0xE2,
-0x96,0x6C,0x0E,0x44,0x66,0x10,0x44,0x8F,0xAD,0x05,0xEB,0xF8,0x79,0xAC,0xA6,0x1B,
-0xE8,0x37,0x34,0x9D,0x53,0xC9,0x61,0xAA,0xA2,0x52,0xAF,0x4A,0x70,0x16,0x86,0xC2,
-0x3A,0xC8,0xB1,0x13,0x70,0x36,0xD8,0xCF,0xEE,0xF4,0x0A,0x34,0xD5,0x5B,0x4C,0xFD,
-0x07,0x9C,0xA2,0xBA,0xD9,0x01,0x72,0x5C,0xF3,0x4D,0xC1,0xDD,0x0E,0xB1,0x1C,0x0D,
-0xC4,0x63,0xBE,0xAD,0xF4,0x14,0xFB,0x89,0xEC,0xA2,0x41,0x0E,0x4C,0xCC,0xC8,0x57,
-0x40,0xD0,0x6E,0x03,0xAA,0xCD,0x0C,0x8E,0x89,0x99,0x99,0x6C,0xF0,0x3C,0x30,0xAF,
-0x38,0xDF,0x6F,0xBC,0xA3,0xBE,0x29,0x20,0x27,0xAB,0x74,0xFF,0x13,0x22,0x78,0xDE,
-0x97,0x52,0x55,0x1E,0x83,0xB5,0x54,0x20,0x03,0xEE,0xAE,0xC0,0x4F,0x56,0xDE,0x37,
-0xCC,0xC3,0x7F,0xAA,0x04,0x27,0xBB,0xD3,0x77,0xB8,0x62,0xDB,0x17,0x7C,0x9C,0x28,
-0x22,0x13,0x73,0x6C,0xCF,0x26,0xF5,0x8A,0x29,0xE7,
-};
-
-
-/* subject:/C=US/O=AffirmTrust/CN=AffirmTrust Commercial */
-/* issuer :/C=US/O=AffirmTrust/CN=AffirmTrust Commercial */
-
-
-const unsigned char AffirmTrust_Commercial_certificate[848]={
-0x30,0x82,0x03,0x4C,0x30,0x82,0x02,0x34,0xA0,0x03,0x02,0x01,0x02,0x02,0x08,0x77,
-0x77,0x06,0x27,0x26,0xA9,0xB1,0x7C,0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,
-0x0D,0x01,0x01,0x0B,0x05,0x00,0x30,0x44,0x31,0x0B,0x30,0x09,0x06,0x03,0x55,0x04,
-0x06,0x13,0x02,0x55,0x53,0x31,0x14,0x30,0x12,0x06,0x03,0x55,0x04,0x0A,0x0C,0x0B,
-0x41,0x66,0x66,0x69,0x72,0x6D,0x54,0x72,0x75,0x73,0x74,0x31,0x1F,0x30,0x1D,0x06,
-0x03,0x55,0x04,0x03,0x0C,0x16,0x41,0x66,0x66,0x69,0x72,0x6D,0x54,0x72,0x75,0x73,
-0x74,0x20,0x43,0x6F,0x6D,0x6D,0x65,0x72,0x63,0x69,0x61,0x6C,0x30,0x1E,0x17,0x0D,
-0x31,0x30,0x30,0x31,0x32,0x39,0x31,0x34,0x30,0x36,0x30,0x36,0x5A,0x17,0x0D,0x33,
-0x30,0x31,0x32,0x33,0x31,0x31,0x34,0x30,0x36,0x30,0x36,0x5A,0x30,0x44,0x31,0x0B,
-0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x14,0x30,0x12,0x06,
-0x03,0x55,0x04,0x0A,0x0C,0x0B,0x41,0x66,0x66,0x69,0x72,0x6D,0x54,0x72,0x75,0x73,
-0x74,0x31,0x1F,0x30,0x1D,0x06,0x03,0x55,0x04,0x03,0x0C,0x16,0x41,0x66,0x66,0x69,
-0x72,0x6D,0x54,0x72,0x75,0x73,0x74,0x20,0x43,0x6F,0x6D,0x6D,0x65,0x72,0x63,0x69,
-0x61,0x6C,0x30,0x82,0x01,0x22,0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,
-0x01,0x01,0x01,0x05,0x00,0x03,0x82,0x01,0x0F,0x00,0x30,0x82,0x01,0x0A,0x02,0x82,
-0x01,0x01,0x00,0xF6,0x1B,0x4F,0x67,0x07,0x2B,0xA1,0x15,0xF5,0x06,0x22,0xCB,0x1F,
-0x01,0xB2,0xE3,0x73,0x45,0x06,0x44,0x49,0x2C,0xBB,0x49,0x25,0x14,0xD6,0xCE,0xC3,
-0xB7,0xAB,0x2C,0x4F,0xC6,0x41,0x32,0x94,0x57,0xFA,0x12,0xA7,0x5B,0x0E,0xE2,0x8F,
-0x1F,0x1E,0x86,0x19,0xA7,0xAA,0xB5,0x2D,0xB9,0x5F,0x0D,0x8A,0xC2,0xAF,0x85,0x35,
-0x79,0x32,0x2D,0xBB,0x1C,0x62,0x37,0xF2,0xB1,0x5B,0x4A,0x3D,0xCA,0xCD,0x71,0x5F,
-0xE9,0x42,0xBE,0x94,0xE8,0xC8,0xDE,0xF9,0x22,0x48,0x64,0xC6,0xE5,0xAB,0xC6,0x2B,
-0x6D,0xAD,0x05,0xF0,0xFA,0xD5,0x0B,0xCF,0x9A,0xE5,0xF0,0x50,0xA4,0x8B,0x3B,0x47,
-0xA5,0x23,0x5B,0x7A,0x7A,0xF8,0x33,0x3F,0xB8,0xEF,0x99,0x97,0xE3,0x20,0xC1,0xD6,
-0x28,0x89,0xCF,0x94,0xFB,0xB9,0x45,0xED,0xE3,0x40,0x17,0x11,0xD4,0x74,0xF0,0x0B,
-0x31,0xE2,0x2B,0x26,0x6A,0x9B,0x4C,0x57,0xAE,0xAC,0x20,0x3E,0xBA,0x45,0x7A,0x05,
-0xF3,0xBD,0x9B,0x69,0x15,0xAE,0x7D,0x4E,0x20,0x63,0xC4,0x35,0x76,0x3A,0x07,0x02,
-0xC9,0x37,0xFD,0xC7,0x47,0xEE,0xE8,0xF1,0x76,0x1D,0x73,0x15,0xF2,0x97,0xA4,0xB5,
-0xC8,0x7A,0x79,0xD9,0x42,0xAA,0x2B,0x7F,0x5C,0xFE,0xCE,0x26,0x4F,0xA3,0x66,0x81,
-0x35,0xAF,0x44,0xBA,0x54,0x1E,0x1C,0x30,0x32,0x65,0x9D,0xE6,0x3C,0x93,0x5E,0x50,
-0x4E,0x7A,0xE3,0x3A,0xD4,0x6E,0xCC,0x1A,0xFB,0xF9,0xD2,0x37,0xAE,0x24,0x2A,0xAB,
-0x57,0x03,0x22,0x28,0x0D,0x49,0x75,0x7F,0xB7,0x28,0xDA,0x75,0xBF,0x8E,0xE3,0xDC,
-0x0E,0x79,0x31,0x02,0x03,0x01,0x00,0x01,0xA3,0x42,0x30,0x40,0x30,0x1D,0x06,0x03,
-0x55,0x1D,0x0E,0x04,0x16,0x04,0x14,0x9D,0x93,0xC6,0x53,0x8B,0x5E,0xCA,0xAF,0x3F,
-0x9F,0x1E,0x0F,0xE5,0x99,0x95,0xBC,0x24,0xF6,0x94,0x8F,0x30,0x0F,0x06,0x03,0x55,
-0x1D,0x13,0x01,0x01,0xFF,0x04,0x05,0x30,0x03,0x01,0x01,0xFF,0x30,0x0E,0x06,0x03,
-0x55,0x1D,0x0F,0x01,0x01,0xFF,0x04,0x04,0x03,0x02,0x01,0x06,0x30,0x0D,0x06,0x09,
-0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x0B,0x05,0x00,0x03,0x82,0x01,0x01,0x00,
-0x58,0xAC,0xF4,0x04,0x0E,0xCD,0xC0,0x0D,0xFF,0x0A,0xFD,0xD4,0xBA,0x16,0x5F,0x29,
-0xBD,0x7B,0x68,0x99,0x58,0x49,0xD2,0xB4,0x1D,0x37,0x4D,0x7F,0x27,0x7D,0x46,0x06,
-0x5D,0x43,0xC6,0x86,0x2E,0x3E,0x73,0xB2,0x26,0x7D,0x4F,0x93,0xA9,0xB6,0xC4,0x2A,
-0x9A,0xAB,0x21,0x97,0x14,0xB1,0xDE,0x8C,0xD3,0xAB,0x89,0x15,0xD8,0x6B,0x24,0xD4,
-0xF1,0x16,0xAE,0xD8,0xA4,0x5C,0xD4,0x7F,0x51,0x8E,0xED,0x18,0x01,0xB1,0x93,0x63,
-0xBD,0xBC,0xF8,0x61,0x80,0x9A,0x9E,0xB1,0xCE,0x42,0x70,0xE2,0xA9,0x7D,0x06,0x25,
-0x7D,0x27,0xA1,0xFE,0x6F,0xEC,0xB3,0x1E,0x24,0xDA,0xE3,0x4B,0x55,0x1A,0x00,0x3B,
-0x35,0xB4,0x3B,0xD9,0xD7,0x5D,0x30,0xFD,0x81,0x13,0x89,0xF2,0xC2,0x06,0x2B,0xED,
-0x67,0xC4,0x8E,0xC9,0x43,0xB2,0x5C,0x6B,0x15,0x89,0x02,0xBC,0x62,0xFC,0x4E,0xF2,
-0xB5,0x33,0xAA,0xB2,0x6F,0xD3,0x0A,0xA2,0x50,0xE3,0xF6,0x3B,0xE8,0x2E,0x44,0xC2,
-0xDB,0x66,0x38,0xA9,0x33,0x56,0x48,0xF1,0x6D,0x1B,0x33,0x8D,0x0D,0x8C,0x3F,0x60,
-0x37,0x9D,0xD3,0xCA,0x6D,0x7E,0x34,0x7E,0x0D,0x9F,0x72,0x76,0x8B,0x1B,0x9F,0x72,
-0xFD,0x52,0x35,0x41,0x45,0x02,0x96,0x2F,0x1C,0xB2,0x9A,0x73,0x49,0x21,0xB1,0x49,
-0x47,0x45,0x47,0xB4,0xEF,0x6A,0x34,0x11,0xC9,0x4D,0x9A,0xCC,0x59,0xB7,0xD6,0x02,
-0x9E,0x5A,0x4E,0x65,0xB5,0x94,0xAE,0x1B,0xDF,0x29,0xB0,0x16,0xF1,0xBF,0x00,0x9E,
-0x07,0x3A,0x17,0x64,0xB5,0x04,0xB5,0x23,0x21,0x99,0x0A,0x95,0x3B,0x97,0x7C,0xEF,
-};
-
-
-/* subject:/C=US/O=AffirmTrust/CN=AffirmTrust Premium */
-/* issuer :/C=US/O=AffirmTrust/CN=AffirmTrust Premium */
-
-
-const unsigned char AffirmTrust_Premium_certificate[1354]={
-0x30,0x82,0x05,0x46,0x30,0x82,0x03,0x2E,0xA0,0x03,0x02,0x01,0x02,0x02,0x08,0x6D,
-0x8C,0x14,0x46,0xB1,0xA6,0x0A,0xEE,0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,
-0x0D,0x01,0x01,0x0C,0x05,0x00,0x30,0x41,0x31,0x0B,0x30,0x09,0x06,0x03,0x55,0x04,
-0x06,0x13,0x02,0x55,0x53,0x31,0x14,0x30,0x12,0x06,0x03,0x55,0x04,0x0A,0x0C,0x0B,
-0x41,0x66,0x66,0x69,0x72,0x6D,0x54,0x72,0x75,0x73,0x74,0x31,0x1C,0x30,0x1A,0x06,
-0x03,0x55,0x04,0x03,0x0C,0x13,0x41,0x66,0x66,0x69,0x72,0x6D,0x54,0x72,0x75,0x73,
-0x74,0x20,0x50,0x72,0x65,0x6D,0x69,0x75,0x6D,0x30,0x1E,0x17,0x0D,0x31,0x30,0x30,
-0x31,0x32,0x39,0x31,0x34,0x31,0x30,0x33,0x36,0x5A,0x17,0x0D,0x34,0x30,0x31,0x32,
-0x33,0x31,0x31,0x34,0x31,0x30,0x33,0x36,0x5A,0x30,0x41,0x31,0x0B,0x30,0x09,0x06,
-0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x14,0x30,0x12,0x06,0x03,0x55,0x04,
-0x0A,0x0C,0x0B,0x41,0x66,0x66,0x69,0x72,0x6D,0x54,0x72,0x75,0x73,0x74,0x31,0x1C,
-0x30,0x1A,0x06,0x03,0x55,0x04,0x03,0x0C,0x13,0x41,0x66,0x66,0x69,0x72,0x6D,0x54,
-0x72,0x75,0x73,0x74,0x20,0x50,0x72,0x65,0x6D,0x69,0x75,0x6D,0x30,0x82,0x02,0x22,
-0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x01,0x05,0x00,0x03,
-0x82,0x02,0x0F,0x00,0x30,0x82,0x02,0x0A,0x02,0x82,0x02,0x01,0x00,0xC4,0x12,0xDF,
-0xA9,0x5F,0xFE,0x41,0xDD,0xDD,0xF5,0x9F,0x8A,0xE3,0xF6,0xAC,0xE1,0x3C,0x78,0x9A,
-0xBC,0xD8,0xF0,0x7F,0x7A,0xA0,0x33,0x2A,0xDC,0x8D,0x20,0x5B,0xAE,0x2D,0x6F,0xE7,
-0x93,0xD9,0x36,0x70,0x6A,0x68,0xCF,0x8E,0x51,0xA3,0x85,0x5B,0x67,0x04,0xA0,0x10,
-0x24,0x6F,0x5D,0x28,0x82,0xC1,0x97,0x57,0xD8,0x48,0x29,0x13,0xB6,0xE1,0xBE,0x91,
-0x4D,0xDF,0x85,0x0C,0x53,0x18,0x9A,0x1E,0x24,0xA2,0x4F,0x8F,0xF0,0xA2,0x85,0x0B,
-0xCB,0xF4,0x29,0x7F,0xD2,0xA4,0x58,0xEE,0x26,0x4D,0xC9,0xAA,0xA8,0x7B,0x9A,0xD9,
-0xFA,0x38,0xDE,0x44,0x57,0x15,0xE5,0xF8,0x8C,0xC8,0xD9,0x48,0xE2,0x0D,0x16,0x27,
-0x1D,0x1E,0xC8,0x83,0x85,0x25,0xB7,0xBA,0xAA,0x55,0x41,0xCC,0x03,0x22,0x4B,0x2D,
-0x91,0x8D,0x8B,0xE6,0x89,0xAF,0x66,0xC7,0xE9,0xFF,0x2B,0xE9,0x3C,0xAC,0xDA,0xD2,
-0xB3,0xC3,0xE1,0x68,0x9C,0x89,0xF8,0x7A,0x00,0x56,0xDE,0xF4,0x55,0x95,0x6C,0xFB,
-0xBA,0x64,0xDD,0x62,0x8B,0xDF,0x0B,0x77,0x32,0xEB,0x62,0xCC,0x26,0x9A,0x9B,0xBB,
-0xAA,0x62,0x83,0x4C,0xB4,0x06,0x7A,0x30,0xC8,0x29,0xBF,0xED,0x06,0x4D,0x97,0xB9,
-0x1C,0xC4,0x31,0x2B,0xD5,0x5F,0xBC,0x53,0x12,0x17,0x9C,0x99,0x57,0x29,0x66,0x77,
-0x61,0x21,0x31,0x07,0x2E,0x25,0x49,0x9D,0x18,0xF2,0xEE,0xF3,0x2B,0x71,0x8C,0xB5,
-0xBA,0x39,0x07,0x49,0x77,0xFC,0xEF,0x2E,0x92,0x90,0x05,0x8D,0x2D,0x2F,0x77,0x7B,
-0xEF,0x43,0xBF,0x35,0xBB,0x9A,0xD8,0xF9,0x73,0xA7,0x2C,0xF2,0xD0,0x57,0xEE,0x28,
-0x4E,0x26,0x5F,0x8F,0x90,0x68,0x09,0x2F,0xB8,0xF8,0xDC,0x06,0xE9,0x2E,0x9A,0x3E,
-0x51,0xA7,0xD1,0x22,0xC4,0x0A,0xA7,0x38,0x48,0x6C,0xB3,0xF9,0xFF,0x7D,0xAB,0x86,
-0x57,0xE3,0xBA,0xD6,0x85,0x78,0x77,0xBA,0x43,0xEA,0x48,0x7F,0xF6,0xD8,0xBE,0x23,
-0x6D,0x1E,0xBF,0xD1,0x36,0x6C,0x58,0x5C,0xF1,0xEE,0xA4,0x19,0x54,0x1A,0xF5,0x03,
-0xD2,0x76,0xE6,0xE1,0x8C,0xBD,0x3C,0xB3,0xD3,0x48,0x4B,0xE2,0xC8,0xF8,0x7F,0x92,
-0xA8,0x76,0x46,0x9C,0x42,0x65,0x3E,0xA4,0x1E,0xC1,0x07,0x03,0x5A,0x46,0x2D,0xB8,
-0x97,0xF3,0xB7,0xD5,0xB2,0x55,0x21,0xEF,0xBA,0xDC,0x4C,0x00,0x97,0xFB,0x14,0x95,
-0x27,0x33,0xBF,0xE8,0x43,0x47,0x46,0xD2,0x08,0x99,0x16,0x60,0x3B,0x9A,0x7E,0xD2,
-0xE6,0xED,0x38,0xEA,0xEC,0x01,0x1E,0x3C,0x48,0x56,0x49,0x09,0xC7,0x4C,0x37,0x00,
-0x9E,0x88,0x0E,0xC0,0x73,0xE1,0x6F,0x66,0xE9,0x72,0x47,0x30,0x3E,0x10,0xE5,0x0B,
-0x03,0xC9,0x9A,0x42,0x00,0x6C,0xC5,0x94,0x7E,0x61,0xC4,0x8A,0xDF,0x7F,0x82,0x1A,
-0x0B,0x59,0xC4,0x59,0x32,0x77,0xB3,0xBC,0x60,0x69,0x56,0x39,0xFD,0xB4,0x06,0x7B,
-0x2C,0xD6,0x64,0x36,0xD9,0xBD,0x48,0xED,0x84,0x1F,0x7E,0xA5,0x22,0x8F,0x2A,0xB8,
-0x42,0xF4,0x82,0xB7,0xD4,0x53,0x90,0x78,0x4E,0x2D,0x1A,0xFD,0x81,0x6F,0x44,0xD7,
-0x3B,0x01,0x74,0x96,0x42,0xE0,0x00,0xE2,0x2E,0x6B,0xEA,0xC5,0xEE,0x72,0xAC,0xBB,
-0xBF,0xFE,0xEA,0xAA,0xA8,0xF8,0xDC,0xF6,0xB2,0x79,0x8A,0xB6,0x67,0x02,0x03,0x01,
-0x00,0x01,0xA3,0x42,0x30,0x40,0x30,0x1D,0x06,0x03,0x55,0x1D,0x0E,0x04,0x16,0x04,
-0x14,0x9D,0xC0,0x67,0xA6,0x0C,0x22,0xD9,0x26,0xF5,0x45,0xAB,0xA6,0x65,0x52,0x11,
-0x27,0xD8,0x45,0xAC,0x63,0x30,0x0F,0x06,0x03,0x55,0x1D,0x13,0x01,0x01,0xFF,0x04,
-0x05,0x30,0x03,0x01,0x01,0xFF,0x30,0x0E,0x06,0x03,0x55,0x1D,0x0F,0x01,0x01,0xFF,
-0x04,0x04,0x03,0x02,0x01,0x06,0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,
-0x01,0x01,0x0C,0x05,0x00,0x03,0x82,0x02,0x01,0x00,0xB3,0x57,0x4D,0x10,0x62,0x4E,
-0x3A,0xE4,0xAC,0xEA,0xB8,0x1C,0xAF,0x32,0x23,0xC8,0xB3,0x49,0x5A,0x51,0x9C,0x76,
-0x28,0x8D,0x79,0xAA,0x57,0x46,0x17,0xD5,0xF5,0x52,0xF6,0xB7,0x44,0xE8,0x08,0x44,
-0xBF,0x18,0x84,0xD2,0x0B,0x80,0xCD,0xC5,0x12,0xFD,0x00,0x55,0x05,0x61,0x87,0x41,
-0xDC,0xB5,0x24,0x9E,0x3C,0xC4,0xD8,0xC8,0xFB,0x70,0x9E,0x2F,0x78,0x96,0x83,0x20,
-0x36,0xDE,0x7C,0x0F,0x69,0x13,0x88,0xA5,0x75,0x36,0x98,0x08,0xA6,0xC6,0xDF,0xAC,
-0xCE,0xE3,0x58,0xD6,0xB7,0x3E,0xDE,0xBA,0xF3,0xEB,0x34,0x40,0xD8,0xA2,0x81,0xF5,
-0x78,0x3F,0x2F,0xD5,0xA5,0xFC,0xD9,0xA2,0xD4,0x5E,0x04,0x0E,0x17,0xAD,0xFE,0x41,
-0xF0,0xE5,0xB2,0x72,0xFA,0x44,0x82,0x33,0x42,0xE8,0x2D,0x58,0xF7,0x56,0x8C,0x62,
-0x3F,0xBA,0x42,0xB0,0x9C,0x0C,0x5C,0x7E,0x2E,0x65,0x26,0x5C,0x53,0x4F,0x00,0xB2,
-0x78,0x7E,0xA1,0x0D,0x99,0x2D,0x8D,0xB8,0x1D,0x8E,0xA2,0xC4,0xB0,0xFD,0x60,0xD0,
-0x30,0xA4,0x8E,0xC8,0x04,0x62,0xA9,0xC4,0xED,0x35,0xDE,0x7A,0x97,0xED,0x0E,0x38,
-0x5E,0x92,0x2F,0x93,0x70,0xA5,0xA9,0x9C,0x6F,0xA7,0x7D,0x13,0x1D,0x7E,0xC6,0x08,
-0x48,0xB1,0x5E,0x67,0xEB,0x51,0x08,0x25,0xE9,0xE6,0x25,0x6B,0x52,0x29,0x91,0x9C,
-0xD2,0x39,0x73,0x08,0x57,0xDE,0x99,0x06,0xB4,0x5B,0x9D,0x10,0x06,0xE1,0xC2,0x00,
-0xA8,0xB8,0x1C,0x4A,0x02,0x0A,0x14,0xD0,0xC1,0x41,0xCA,0xFB,0x8C,0x35,0x21,0x7D,
-0x82,0x38,0xF2,0xA9,0x54,0x91,0x19,0x35,0x93,0x94,0x6D,0x6A,0x3A,0xC5,0xB2,0xD0,
-0xBB,0x89,0x86,0x93,0xE8,0x9B,0xC9,0x0F,0x3A,0xA7,0x7A,0xB8,0xA1,0xF0,0x78,0x46,
-0xFA,0xFC,0x37,0x2F,0xE5,0x8A,0x84,0xF3,0xDF,0xFE,0x04,0xD9,0xA1,0x68,0xA0,0x2F,
-0x24,0xE2,0x09,0x95,0x06,0xD5,0x95,0xCA,0xE1,0x24,0x96,0xEB,0x7C,0xF6,0x93,0x05,
-0xBB,0xED,0x73,0xE9,0x2D,0xD1,0x75,0x39,0xD7,0xE7,0x24,0xDB,0xD8,0x4E,0x5F,0x43,
-0x8F,0x9E,0xD0,0x14,0x39,0xBF,0x55,0x70,0x48,0x99,0x57,0x31,0xB4,0x9C,0xEE,0x4A,
-0x98,0x03,0x96,0x30,0x1F,0x60,0x06,0xEE,0x1B,0x23,0xFE,0x81,0x60,0x23,0x1A,0x47,
-0x62,0x85,0xA5,0xCC,0x19,0x34,0x80,0x6F,0xB3,0xAC,0x1A,0xE3,0x9F,0xF0,0x7B,0x48,
-0xAD,0xD5,0x01,0xD9,0x67,0xB6,0xA9,0x72,0x93,0xEA,0x2D,0x66,0xB5,0xB2,0xB8,0xE4,
-0x3D,0x3C,0xB2,0xEF,0x4C,0x8C,0xEA,0xEB,0x07,0xBF,0xAB,0x35,0x9A,0x55,0x86,0xBC,
-0x18,0xA6,0xB5,0xA8,0x5E,0xB4,0x83,0x6C,0x6B,0x69,0x40,0xD3,0x9F,0xDC,0xF1,0xC3,
-0x69,0x6B,0xB9,0xE1,0x6D,0x09,0xF4,0xF1,0xAA,0x50,0x76,0x0A,0x7A,0x7D,0x7A,0x17,
-0xA1,0x55,0x96,0x42,0x99,0x31,0x09,0xDD,0x60,0x11,0x8D,0x05,0x30,0x7E,0xE6,0x8E,
-0x46,0xD1,0x9D,0x14,0xDA,0xC7,0x17,0xE4,0x05,0x96,0x8C,0xC4,0x24,0xB5,0x1B,0xCF,
-0x14,0x07,0xB2,0x40,0xF8,0xA3,0x9E,0x41,0x86,0xBC,0x04,0xD0,0x6B,0x96,0xC8,0x2A,
-0x80,0x34,0xFD,0xBF,0xEF,0x06,0xA3,0xDD,0x58,0xC5,0x85,0x3D,0x3E,0x8F,0xFE,0x9E,
-0x29,0xE0,0xB6,0xB8,0x09,0x68,0x19,0x1C,0x18,0x43,
-};
-
-
-/* subject:/C=US/ST=Arizona/L=Scottsdale/O=GoDaddy.com, Inc./CN=Go Daddy Root Certificate Authority - G2 */
-/* issuer :/C=US/ST=Arizona/L=Scottsdale/O=GoDaddy.com, Inc./CN=Go Daddy Root Certificate Authority - G2 */
-
-
-const unsigned char Go_Daddy_Root_Certificate_Authority___G2_certificate[969]={
-0x30,0x82,0x03,0xC5,0x30,0x82,0x02,0xAD,0xA0,0x03,0x02,0x01,0x02,0x02,0x01,0x00,
-0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x0B,0x05,0x00,0x30,
-0x81,0x83,0x31,0x0B,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,
-0x10,0x30,0x0E,0x06,0x03,0x55,0x04,0x08,0x13,0x07,0x41,0x72,0x69,0x7A,0x6F,0x6E,
-0x61,0x31,0x13,0x30,0x11,0x06,0x03,0x55,0x04,0x07,0x13,0x0A,0x53,0x63,0x6F,0x74,
-0x74,0x73,0x64,0x61,0x6C,0x65,0x31,0x1A,0x30,0x18,0x06,0x03,0x55,0x04,0x0A,0x13,
-0x11,0x47,0x6F,0x44,0x61,0x64,0x64,0x79,0x2E,0x63,0x6F,0x6D,0x2C,0x20,0x49,0x6E,
-0x63,0x2E,0x31,0x31,0x30,0x2F,0x06,0x03,0x55,0x04,0x03,0x13,0x28,0x47,0x6F,0x20,
-0x44,0x61,0x64,0x64,0x79,0x20,0x52,0x6F,0x6F,0x74,0x20,0x43,0x65,0x72,0x74,0x69,
-0x66,0x69,0x63,0x61,0x74,0x65,0x20,0x41,0x75,0x74,0x68,0x6F,0x72,0x69,0x74,0x79,
-0x20,0x2D,0x20,0x47,0x32,0x30,0x1E,0x17,0x0D,0x30,0x39,0x30,0x39,0x30,0x31,0x30,
-0x30,0x30,0x30,0x30,0x30,0x5A,0x17,0x0D,0x33,0x37,0x31,0x32,0x33,0x31,0x32,0x33,
-0x35,0x39,0x35,0x39,0x5A,0x30,0x81,0x83,0x31,0x0B,0x30,0x09,0x06,0x03,0x55,0x04,
-0x06,0x13,0x02,0x55,0x53,0x31,0x10,0x30,0x0E,0x06,0x03,0x55,0x04,0x08,0x13,0x07,
-0x41,0x72,0x69,0x7A,0x6F,0x6E,0x61,0x31,0x13,0x30,0x11,0x06,0x03,0x55,0x04,0x07,
-0x13,0x0A,0x53,0x63,0x6F,0x74,0x74,0x73,0x64,0x61,0x6C,0x65,0x31,0x1A,0x30,0x18,
-0x06,0x03,0x55,0x04,0x0A,0x13,0x11,0x47,0x6F,0x44,0x61,0x64,0x64,0x79,0x2E,0x63,
-0x6F,0x6D,0x2C,0x20,0x49,0x6E,0x63,0x2E,0x31,0x31,0x30,0x2F,0x06,0x03,0x55,0x04,
-0x03,0x13,0x28,0x47,0x6F,0x20,0x44,0x61,0x64,0x64,0x79,0x20,0x52,0x6F,0x6F,0x74,
-0x20,0x43,0x65,0x72,0x74,0x69,0x66,0x69,0x63,0x61,0x74,0x65,0x20,0x41,0x75,0x74,
-0x68,0x6F,0x72,0x69,0x74,0x79,0x20,0x2D,0x20,0x47,0x32,0x30,0x82,0x01,0x22,0x30,
-0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x01,0x05,0x00,0x03,0x82,
-0x01,0x0F,0x00,0x30,0x82,0x01,0x0A,0x02,0x82,0x01,0x01,0x00,0xBF,0x71,0x62,0x08,
-0xF1,0xFA,0x59,0x34,0xF7,0x1B,0xC9,0x18,0xA3,0xF7,0x80,0x49,0x58,0xE9,0x22,0x83,
-0x13,0xA6,0xC5,0x20,0x43,0x01,0x3B,0x84,0xF1,0xE6,0x85,0x49,0x9F,0x27,0xEA,0xF6,
-0x84,0x1B,0x4E,0xA0,0xB4,0xDB,0x70,0x98,0xC7,0x32,0x01,0xB1,0x05,0x3E,0x07,0x4E,
-0xEE,0xF4,0xFA,0x4F,0x2F,0x59,0x30,0x22,0xE7,0xAB,0x19,0x56,0x6B,0xE2,0x80,0x07,
-0xFC,0xF3,0x16,0x75,0x80,0x39,0x51,0x7B,0xE5,0xF9,0x35,0xB6,0x74,0x4E,0xA9,0x8D,
-0x82,0x13,0xE4,0xB6,0x3F,0xA9,0x03,0x83,0xFA,0xA2,0xBE,0x8A,0x15,0x6A,0x7F,0xDE,
-0x0B,0xC3,0xB6,0x19,0x14,0x05,0xCA,0xEA,0xC3,0xA8,0x04,0x94,0x3B,0x46,0x7C,0x32,
-0x0D,0xF3,0x00,0x66,0x22,0xC8,0x8D,0x69,0x6D,0x36,0x8C,0x11,0x18,0xB7,0xD3,0xB2,
-0x1C,0x60,0xB4,0x38,0xFA,0x02,0x8C,0xCE,0xD3,0xDD,0x46,0x07,0xDE,0x0A,0x3E,0xEB,
-0x5D,0x7C,0xC8,0x7C,0xFB,0xB0,0x2B,0x53,0xA4,0x92,0x62,0x69,0x51,0x25,0x05,0x61,
-0x1A,0x44,0x81,0x8C,0x2C,0xA9,0x43,0x96,0x23,0xDF,0xAC,0x3A,0x81,0x9A,0x0E,0x29,
-0xC5,0x1C,0xA9,0xE9,0x5D,0x1E,0xB6,0x9E,0x9E,0x30,0x0A,0x39,0xCE,0xF1,0x88,0x80,
-0xFB,0x4B,0x5D,0xCC,0x32,0xEC,0x85,0x62,0x43,0x25,0x34,0x02,0x56,0x27,0x01,0x91,
-0xB4,0x3B,0x70,0x2A,0x3F,0x6E,0xB1,0xE8,0x9C,0x88,0x01,0x7D,0x9F,0xD4,0xF9,0xDB,
-0x53,0x6D,0x60,0x9D,0xBF,0x2C,0xE7,0x58,0xAB,0xB8,0x5F,0x46,0xFC,0xCE,0xC4,0x1B,
-0x03,0x3C,0x09,0xEB,0x49,0x31,0x5C,0x69,0x46,0xB3,0xE0,0x47,0x02,0x03,0x01,0x00,
-0x01,0xA3,0x42,0x30,0x40,0x30,0x0F,0x06,0x03,0x55,0x1D,0x13,0x01,0x01,0xFF,0x04,
-0x05,0x30,0x03,0x01,0x01,0xFF,0x30,0x0E,0x06,0x03,0x55,0x1D,0x0F,0x01,0x01,0xFF,
-0x04,0x04,0x03,0x02,0x01,0x06,0x30,0x1D,0x06,0x03,0x55,0x1D,0x0E,0x04,0x16,0x04,
-0x14,0x3A,0x9A,0x85,0x07,0x10,0x67,0x28,0xB6,0xEF,0xF6,0xBD,0x05,0x41,0x6E,0x20,
-0xC1,0x94,0xDA,0x0F,0xDE,0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,
-0x01,0x0B,0x05,0x00,0x03,0x82,0x01,0x01,0x00,0x99,0xDB,0x5D,0x79,0xD5,0xF9,0x97,
-0x59,0x67,0x03,0x61,0xF1,0x7E,0x3B,0x06,0x31,0x75,0x2D,0xA1,0x20,0x8E,0x4F,0x65,
-0x87,0xB4,0xF7,0xA6,0x9C,0xBC,0xD8,0xE9,0x2F,0xD0,0xDB,0x5A,0xEE,0xCF,0x74,0x8C,
-0x73,0xB4,0x38,0x42,0xDA,0x05,0x7B,0xF8,0x02,0x75,0xB8,0xFD,0xA5,0xB1,0xD7,0xAE,
-0xF6,0xD7,0xDE,0x13,0xCB,0x53,0x10,0x7E,0x8A,0x46,0xD1,0x97,0xFA,0xB7,0x2E,0x2B,
-0x11,0xAB,0x90,0xB0,0x27,0x80,0xF9,0xE8,0x9F,0x5A,0xE9,0x37,0x9F,0xAB,0xE4,0xDF,
-0x6C,0xB3,0x85,0x17,0x9D,0x3D,0xD9,0x24,0x4F,0x79,0x91,0x35,0xD6,0x5F,0x04,0xEB,
-0x80,0x83,0xAB,0x9A,0x02,0x2D,0xB5,0x10,0xF4,0xD8,0x90,0xC7,0x04,0x73,0x40,0xED,
-0x72,0x25,0xA0,0xA9,0x9F,0xEC,0x9E,0xAB,0x68,0x12,0x99,0x57,0xC6,0x8F,0x12,0x3A,
-0x09,0xA4,0xBD,0x44,0xFD,0x06,0x15,0x37,0xC1,0x9B,0xE4,0x32,0xA3,0xED,0x38,0xE8,
-0xD8,0x64,0xF3,0x2C,0x7E,0x14,0xFC,0x02,0xEA,0x9F,0xCD,0xFF,0x07,0x68,0x17,0xDB,
-0x22,0x90,0x38,0x2D,0x7A,0x8D,0xD1,0x54,0xF1,0x69,0xE3,0x5F,0x33,0xCA,0x7A,0x3D,
-0x7B,0x0A,0xE3,0xCA,0x7F,0x5F,0x39,0xE5,0xE2,0x75,0xBA,0xC5,0x76,0x18,0x33,0xCE,
-0x2C,0xF0,0x2F,0x4C,0xAD,0xF7,0xB1,0xE7,0xCE,0x4F,0xA8,0xC4,0x9B,0x4A,0x54,0x06,
-0xC5,0x7F,0x7D,0xD5,0x08,0x0F,0xE2,0x1C,0xFE,0x7E,0x17,0xB8,0xAC,0x5E,0xF6,0xD4,
-0x16,0xB2,0x43,0x09,0x0C,0x4D,0xF6,0xA7,0x6B,0xB4,0x99,0x84,0x65,0xCA,0x7A,0x88,
-0xE2,0xE2,0x44,0xBE,0x5C,0xF7,0xEA,0x1C,0xF5,
-};
-
-
-/* subject:/C=GB/ST=Greater Manchester/L=Salford/O=Comodo CA Limited/CN=Secure Certificate Services */
-/* issuer :/C=GB/ST=Greater Manchester/L=Salford/O=Comodo CA Limited/CN=Secure Certificate Services */
-
-
-const unsigned char Comodo_Secure_Services_root_certificate[1091]={
-0x30,0x82,0x04,0x3F,0x30,0x82,0x03,0x27,0xA0,0x03,0x02,0x01,0x02,0x02,0x01,0x01,
-0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x05,0x05,0x00,0x30,
-0x7E,0x31,0x0B,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x47,0x42,0x31,0x1B,
-0x30,0x19,0x06,0x03,0x55,0x04,0x08,0x0C,0x12,0x47,0x72,0x65,0x61,0x74,0x65,0x72,
-0x20,0x4D,0x61,0x6E,0x63,0x68,0x65,0x73,0x74,0x65,0x72,0x31,0x10,0x30,0x0E,0x06,
-0x03,0x55,0x04,0x07,0x0C,0x07,0x53,0x61,0x6C,0x66,0x6F,0x72,0x64,0x31,0x1A,0x30,
-0x18,0x06,0x03,0x55,0x04,0x0A,0x0C,0x11,0x43,0x6F,0x6D,0x6F,0x64,0x6F,0x20,0x43,
-0x41,0x20,0x4C,0x69,0x6D,0x69,0x74,0x65,0x64,0x31,0x24,0x30,0x22,0x06,0x03,0x55,
-0x04,0x03,0x0C,0x1B,0x53,0x65,0x63,0x75,0x72,0x65,0x20,0x43,0x65,0x72,0x74,0x69,
-0x66,0x69,0x63,0x61,0x74,0x65,0x20,0x53,0x65,0x72,0x76,0x69,0x63,0x65,0x73,0x30,
-0x1E,0x17,0x0D,0x30,0x34,0x30,0x31,0x30,0x31,0x30,0x30,0x30,0x30,0x30,0x30,0x5A,
-0x17,0x0D,0x32,0x38,0x31,0x32,0x33,0x31,0x32,0x33,0x35,0x39,0x35,0x39,0x5A,0x30,
-0x7E,0x31,0x0B,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x47,0x42,0x31,0x1B,
-0x30,0x19,0x06,0x03,0x55,0x04,0x08,0x0C,0x12,0x47,0x72,0x65,0x61,0x74,0x65,0x72,
-0x20,0x4D,0x61,0x6E,0x63,0x68,0x65,0x73,0x74,0x65,0x72,0x31,0x10,0x30,0x0E,0x06,
-0x03,0x55,0x04,0x07,0x0C,0x07,0x53,0x61,0x6C,0x66,0x6F,0x72,0x64,0x31,0x1A,0x30,
-0x18,0x06,0x03,0x55,0x04,0x0A,0x0C,0x11,0x43,0x6F,0x6D,0x6F,0x64,0x6F,0x20,0x43,
-0x41,0x20,0x4C,0x69,0x6D,0x69,0x74,0x65,0x64,0x31,0x24,0x30,0x22,0x06,0x03,0x55,
-0x04,0x03,0x0C,0x1B,0x53,0x65,0x63,0x75,0x72,0x65,0x20,0x43,0x65,0x72,0x74,0x69,
-0x66,0x69,0x63,0x61,0x74,0x65,0x20,0x53,0x65,0x72,0x76,0x69,0x63,0x65,0x73,0x30,
-0x82,0x01,0x22,0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x01,
-0x05,0x00,0x03,0x82,0x01,0x0F,0x00,0x30,0x82,0x01,0x0A,0x02,0x82,0x01,0x01,0x00,
-0xC0,0x71,0x33,0x82,0x8A,0xD0,0x70,0xEB,0x73,0x87,0x82,0x40,0xD5,0x1D,0xE4,0xCB,
-0xC9,0x0E,0x42,0x90,0xF9,0xDE,0x34,0xB9,0xA1,0xBA,0x11,0xF4,0x25,0x85,0xF3,0xCC,
-0x72,0x6D,0xF2,0x7B,0x97,0x6B,0xB3,0x07,0xF1,0x77,0x24,0x91,0x5F,0x25,0x8F,0xF6,
-0x74,0x3D,0xE4,0x80,0xC2,0xF8,0x3C,0x0D,0xF3,0xBF,0x40,0xEA,0xF7,0xC8,0x52,0xD1,
-0x72,0x6F,0xEF,0xC8,0xAB,0x41,0xB8,0x6E,0x2E,0x17,0x2A,0x95,0x69,0x0C,0xCD,0xD2,
-0x1E,0x94,0x7B,0x2D,0x94,0x1D,0xAA,0x75,0xD7,0xB3,0x98,0xCB,0xAC,0xBC,0x64,0x53,
-0x40,0xBC,0x8F,0xAC,0xAC,0x36,0xCB,0x5C,0xAD,0xBB,0xDD,0xE0,0x94,0x17,0xEC,0xD1,
-0x5C,0xD0,0xBF,0xEF,0xA5,0x95,0xC9,0x90,0xC5,0xB0,0xAC,0xFB,0x1B,0x43,0xDF,0x7A,
-0x08,0x5D,0xB7,0xB8,0xF2,0x40,0x1B,0x2B,0x27,0x9E,0x50,0xCE,0x5E,0x65,0x82,0x88,
-0x8C,0x5E,0xD3,0x4E,0x0C,0x7A,0xEA,0x08,0x91,0xB6,0x36,0xAA,0x2B,0x42,0xFB,0xEA,
-0xC2,0xA3,0x39,0xE5,0xDB,0x26,0x38,0xAD,0x8B,0x0A,0xEE,0x19,0x63,0xC7,0x1C,0x24,
-0xDF,0x03,0x78,0xDA,0xE6,0xEA,0xC1,0x47,0x1A,0x0B,0x0B,0x46,0x09,0xDD,0x02,0xFC,
-0xDE,0xCB,0x87,0x5F,0xD7,0x30,0x63,0x68,0xA1,0xAE,0xDC,0x32,0xA1,0xBA,0xBE,0xFE,
-0x44,0xAB,0x68,0xB6,0xA5,0x17,0x15,0xFD,0xBD,0xD5,0xA7,0xA7,0x9A,0xE4,0x44,0x33,
-0xE9,0x88,0x8E,0xFC,0xED,0x51,0xEB,0x93,0x71,0x4E,0xAD,0x01,0xE7,0x44,0x8E,0xAB,
-0x2D,0xCB,0xA8,0xFE,0x01,0x49,0x48,0xF0,0xC0,0xDD,0xC7,0x68,0xD8,0x92,0xFE,0x3D,
-0x02,0x03,0x01,0x00,0x01,0xA3,0x81,0xC7,0x30,0x81,0xC4,0x30,0x1D,0x06,0x03,0x55,
-0x1D,0x0E,0x04,0x16,0x04,0x14,0x3C,0xD8,0x93,0x88,0xC2,0xC0,0x82,0x09,0xCC,0x01,
-0x99,0x06,0x93,0x20,0xE9,0x9E,0x70,0x09,0x63,0x4F,0x30,0x0E,0x06,0x03,0x55,0x1D,
-0x0F,0x01,0x01,0xFF,0x04,0x04,0x03,0x02,0x01,0x06,0x30,0x0F,0x06,0x03,0x55,0x1D,
-0x13,0x01,0x01,0xFF,0x04,0x05,0x30,0x03,0x01,0x01,0xFF,0x30,0x81,0x81,0x06,0x03,
-0x55,0x1D,0x1F,0x04,0x7A,0x30,0x78,0x30,0x3B,0xA0,0x39,0xA0,0x37,0x86,0x35,0x68,
-0x74,0x74,0x70,0x3A,0x2F,0x2F,0x63,0x72,0x6C,0x2E,0x63,0x6F,0x6D,0x6F,0x64,0x6F,
-0x63,0x61,0x2E,0x63,0x6F,0x6D,0x2F,0x53,0x65,0x63,0x75,0x72,0x65,0x43,0x65,0x72,
-0x74,0x69,0x66,0x69,0x63,0x61,0x74,0x65,0x53,0x65,0x72,0x76,0x69,0x63,0x65,0x73,
-0x2E,0x63,0x72,0x6C,0x30,0x39,0xA0,0x37,0xA0,0x35,0x86,0x33,0x68,0x74,0x74,0x70,
-0x3A,0x2F,0x2F,0x63,0x72,0x6C,0x2E,0x63,0x6F,0x6D,0x6F,0x64,0x6F,0x2E,0x6E,0x65,
-0x74,0x2F,0x53,0x65,0x63,0x75,0x72,0x65,0x43,0x65,0x72,0x74,0x69,0x66,0x69,0x63,
-0x61,0x74,0x65,0x53,0x65,0x72,0x76,0x69,0x63,0x65,0x73,0x2E,0x63,0x72,0x6C,0x30,
-0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x05,0x05,0x00,0x03,0x82,
-0x01,0x01,0x00,0x87,0x01,0x6D,0x23,0x1D,0x7E,0x5B,0x17,0x7D,0xC1,0x61,0x32,0xCF,
-0x8F,0xE7,0xF3,0x8A,0x94,0x59,0x66,0xE0,0x9E,0x28,0xA8,0x5E,0xD3,0xB7,0xF4,0x34,
-0xE6,0xAA,0x39,0xB2,0x97,0x16,0xC5,0x82,0x6F,0x32,0xA4,0xE9,0x8C,0xE7,0xAF,0xFD,
-0xEF,0xC2,0xE8,0xB9,0x4B,0xAA,0xA3,0xF4,0xE6,0xDA,0x8D,0x65,0x21,0xFB,0xBA,0x80,
-0xEB,0x26,0x28,0x85,0x1A,0xFE,0x39,0x8C,0xDE,0x5B,0x04,0x04,0xB4,0x54,0xF9,0xA3,
-0x67,0x9E,0x41,0xFA,0x09,0x52,0xCC,0x05,0x48,0xA8,0xC9,0x3F,0x21,0x04,0x1E,0xCE,
-0x48,0x6B,0xFC,0x85,0xE8,0xC2,0x7B,0xAF,0x7F,0xB7,0xCC,0xF8,0x5F,0x3A,0xFD,0x35,
-0xC6,0x0D,0xEF,0x97,0xDC,0x4C,0xAB,0x11,0xE1,0x6B,0xCB,0x31,0xD1,0x6C,0xFB,0x48,
-0x80,0xAB,0xDC,0x9C,0x37,0xB8,0x21,0x14,0x4B,0x0D,0x71,0x3D,0xEC,0x83,0x33,0x6E,
-0xD1,0x6E,0x32,0x16,0xEC,0x98,0xC7,0x16,0x8B,0x59,0xA6,0x34,0xAB,0x05,0x57,0x2D,
-0x93,0xF7,0xAA,0x13,0xCB,0xD2,0x13,0xE2,0xB7,0x2E,0x3B,0xCD,0x6B,0x50,0x17,0x09,
-0x68,0x3E,0xB5,0x26,0x57,0xEE,0xB6,0xE0,0xB6,0xDD,0xB9,0x29,0x80,0x79,0x7D,0x8F,
-0xA3,0xF0,0xA4,0x28,0xA4,0x15,0xC4,0x85,0xF4,0x27,0xD4,0x6B,0xBF,0xE5,0x5C,0xE4,
-0x65,0x02,0x76,0x54,0xB4,0xE3,0x37,0x66,0x24,0xD3,0x19,0x61,0xC8,0x52,0x10,0xE5,
-0x8B,0x37,0x9A,0xB9,0xA9,0xF9,0x1D,0xBF,0xEA,0x99,0x92,0x61,0x96,0xFF,0x01,0xCD,
-0xA1,0x5F,0x0D,0xBC,0x71,0xBC,0x0E,0xAC,0x0B,0x1D,0x47,0x45,0x1D,0xC1,0xEC,0x7C,
-0xEC,0xFD,0x29,
-};
-
-
-/* subject:/C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert Trusted Root G4 */
-/* issuer :/C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert Trusted Root G4 */
-
-
-const unsigned char DigiCert_Trusted_Root_G4_certificate[1428]={
-0x30,0x82,0x05,0x90,0x30,0x82,0x03,0x78,0xA0,0x03,0x02,0x01,0x02,0x02,0x10,0x05,
-0x9B,0x1B,0x57,0x9E,0x8E,0x21,0x32,0xE2,0x39,0x07,0xBD,0xA7,0x77,0x75,0x5C,0x30,
-0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x0C,0x05,0x00,0x30,0x62,
-0x31,0x0B,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x15,0x30,
-0x13,0x06,0x03,0x55,0x04,0x0A,0x13,0x0C,0x44,0x69,0x67,0x69,0x43,0x65,0x72,0x74,
-0x20,0x49,0x6E,0x63,0x31,0x19,0x30,0x17,0x06,0x03,0x55,0x04,0x0B,0x13,0x10,0x77,
-0x77,0x77,0x2E,0x64,0x69,0x67,0x69,0x63,0x65,0x72,0x74,0x2E,0x63,0x6F,0x6D,0x31,
-0x21,0x30,0x1F,0x06,0x03,0x55,0x04,0x03,0x13,0x18,0x44,0x69,0x67,0x69,0x43,0x65,
-0x72,0x74,0x20,0x54,0x72,0x75,0x73,0x74,0x65,0x64,0x20,0x52,0x6F,0x6F,0x74,0x20,
-0x47,0x34,0x30,0x1E,0x17,0x0D,0x31,0x33,0x30,0x38,0x30,0x31,0x31,0x32,0x30,0x30,
-0x30,0x30,0x5A,0x17,0x0D,0x33,0x38,0x30,0x31,0x31,0x35,0x31,0x32,0x30,0x30,0x30,
-0x30,0x5A,0x30,0x62,0x31,0x0B,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,
-0x53,0x31,0x15,0x30,0x13,0x06,0x03,0x55,0x04,0x0A,0x13,0x0C,0x44,0x69,0x67,0x69,
-0x43,0x65,0x72,0x74,0x20,0x49,0x6E,0x63,0x31,0x19,0x30,0x17,0x06,0x03,0x55,0x04,
-0x0B,0x13,0x10,0x77,0x77,0x77,0x2E,0x64,0x69,0x67,0x69,0x63,0x65,0x72,0x74,0x2E,
-0x63,0x6F,0x6D,0x31,0x21,0x30,0x1F,0x06,0x03,0x55,0x04,0x03,0x13,0x18,0x44,0x69,
-0x67,0x69,0x43,0x65,0x72,0x74,0x20,0x54,0x72,0x75,0x73,0x74,0x65,0x64,0x20,0x52,
-0x6F,0x6F,0x74,0x20,0x47,0x34,0x30,0x82,0x02,0x22,0x30,0x0D,0x06,0x09,0x2A,0x86,
-0x48,0x86,0xF7,0x0D,0x01,0x01,0x01,0x05,0x00,0x03,0x82,0x02,0x0F,0x00,0x30,0x82,
-0x02,0x0A,0x02,0x82,0x02,0x01,0x00,0xBF,0xE6,0x90,0x73,0x68,0xDE,0xBB,0xE4,0x5D,
-0x4A,0x3C,0x30,0x22,0x30,0x69,0x33,0xEC,0xC2,0xA7,0x25,0x2E,0xC9,0x21,0x3D,0xF2,
-0x8A,0xD8,0x59,0xC2,0xE1,0x29,0xA7,0x3D,0x58,0xAB,0x76,0x9A,0xCD,0xAE,0x7B,0x1B,
-0x84,0x0D,0xC4,0x30,0x1F,0xF3,0x1B,0xA4,0x38,0x16,0xEB,0x56,0xC6,0x97,0x6D,0x1D,
-0xAB,0xB2,0x79,0xF2,0xCA,0x11,0xD2,0xE4,0x5F,0xD6,0x05,0x3C,0x52,0x0F,0x52,0x1F,
-0xC6,0x9E,0x15,0xA5,0x7E,0xBE,0x9F,0xA9,0x57,0x16,0x59,0x55,0x72,0xAF,0x68,0x93,
-0x70,0xC2,0xB2,0xBA,0x75,0x99,0x6A,0x73,0x32,0x94,0xD1,0x10,0x44,0x10,0x2E,0xDF,
-0x82,0xF3,0x07,0x84,0xE6,0x74,0x3B,0x6D,0x71,0xE2,0x2D,0x0C,0x1B,0xEE,0x20,0xD5,
-0xC9,0x20,0x1D,0x63,0x29,0x2D,0xCE,0xEC,0x5E,0x4E,0xC8,0x93,0xF8,0x21,0x61,0x9B,
-0x34,0xEB,0x05,0xC6,0x5E,0xEC,0x5B,0x1A,0xBC,0xEB,0xC9,0xCF,0xCD,0xAC,0x34,0x40,
-0x5F,0xB1,0x7A,0x66,0xEE,0x77,0xC8,0x48,0xA8,0x66,0x57,0x57,0x9F,0x54,0x58,0x8E,
-0x0C,0x2B,0xB7,0x4F,0xA7,0x30,0xD9,0x56,0xEE,0xCA,0x7B,0x5D,0xE3,0xAD,0xC9,0x4F,
-0x5E,0xE5,0x35,0xE7,0x31,0xCB,0xDA,0x93,0x5E,0xDC,0x8E,0x8F,0x80,0xDA,0xB6,0x91,
-0x98,0x40,0x90,0x79,0xC3,0x78,0xC7,0xB6,0xB1,0xC4,0xB5,0x6A,0x18,0x38,0x03,0x10,
-0x8D,0xD8,0xD4,0x37,0xA4,0x2E,0x05,0x7D,0x88,0xF5,0x82,0x3E,0x10,0x91,0x70,0xAB,
-0x55,0x82,0x41,0x32,0xD7,0xDB,0x04,0x73,0x2A,0x6E,0x91,0x01,0x7C,0x21,0x4C,0xD4,
-0xBC,0xAE,0x1B,0x03,0x75,0x5D,0x78,0x66,0xD9,0x3A,0x31,0x44,0x9A,0x33,0x40,0xBF,
-0x08,0xD7,0x5A,0x49,0xA4,0xC2,0xE6,0xA9,0xA0,0x67,0xDD,0xA4,0x27,0xBC,0xA1,0x4F,
-0x39,0xB5,0x11,0x58,0x17,0xF7,0x24,0x5C,0x46,0x8F,0x64,0xF7,0xC1,0x69,0x88,0x76,
-0x98,0x76,0x3D,0x59,0x5D,0x42,0x76,0x87,0x89,0x97,0x69,0x7A,0x48,0xF0,0xE0,0xA2,
-0x12,0x1B,0x66,0x9A,0x74,0xCA,0xDE,0x4B,0x1E,0xE7,0x0E,0x63,0xAE,0xE6,0xD4,0xEF,
-0x92,0x92,0x3A,0x9E,0x3D,0xDC,0x00,0xE4,0x45,0x25,0x89,0xB6,0x9A,0x44,0x19,0x2B,
-0x7E,0xC0,0x94,0xB4,0xD2,0x61,0x6D,0xEB,0x33,0xD9,0xC5,0xDF,0x4B,0x04,0x00,0xCC,
-0x7D,0x1C,0x95,0xC3,0x8F,0xF7,0x21,0xB2,0xB2,0x11,0xB7,0xBB,0x7F,0xF2,0xD5,0x8C,
-0x70,0x2C,0x41,0x60,0xAA,0xB1,0x63,0x18,0x44,0x95,0x1A,0x76,0x62,0x7E,0xF6,0x80,
-0xB0,0xFB,0xE8,0x64,0xA6,0x33,0xD1,0x89,0x07,0xE1,0xBD,0xB7,0xE6,0x43,0xA4,0x18,
-0xB8,0xA6,0x77,0x01,0xE1,0x0F,0x94,0x0C,0x21,0x1D,0xB2,0x54,0x29,0x25,0x89,0x6C,
-0xE5,0x0E,0x52,0x51,0x47,0x74,0xBE,0x26,0xAC,0xB6,0x41,0x75,0xDE,0x7A,0xAC,0x5F,
-0x8D,0x3F,0xC9,0xBC,0xD3,0x41,0x11,0x12,0x5B,0xE5,0x10,0x50,0xEB,0x31,0xC5,0xCA,
-0x72,0x16,0x22,0x09,0xDF,0x7C,0x4C,0x75,0x3F,0x63,0xEC,0x21,0x5F,0xC4,0x20,0x51,
-0x6B,0x6F,0xB1,0xAB,0x86,0x8B,0x4F,0xC2,0xD6,0x45,0x5F,0x9D,0x20,0xFC,0xA1,0x1E,
-0xC5,0xC0,0x8F,0xA2,0xB1,0x7E,0x0A,0x26,0x99,0xF5,0xE4,0x69,0x2F,0x98,0x1D,0x2D,
-0xF5,0xD9,0xA9,0xB2,0x1D,0xE5,0x1B,0x02,0x03,0x01,0x00,0x01,0xA3,0x42,0x30,0x40,
-0x30,0x0F,0x06,0x03,0x55,0x1D,0x13,0x01,0x01,0xFF,0x04,0x05,0x30,0x03,0x01,0x01,
-0xFF,0x30,0x0E,0x06,0x03,0x55,0x1D,0x0F,0x01,0x01,0xFF,0x04,0x04,0x03,0x02,0x01,
-0x86,0x30,0x1D,0x06,0x03,0x55,0x1D,0x0E,0x04,0x16,0x04,0x14,0xEC,0xD7,0xE3,0x82,
-0xD2,0x71,0x5D,0x64,0x4C,0xDF,0x2E,0x67,0x3F,0xE7,0xBA,0x98,0xAE,0x1C,0x0F,0x4F,
-0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x0C,0x05,0x00,0x03,
-0x82,0x02,0x01,0x00,0xBB,0x61,0xD9,0x7D,0xA9,0x6C,0xBE,0x17,0xC4,0x91,0x1B,0xC3,
-0xA1,0xA2,0x00,0x8D,0xE3,0x64,0x68,0x0F,0x56,0xCF,0x77,0xAE,0x70,0xF9,0xFD,0x9A,
-0x4A,0x99,0xB9,0xC9,0x78,0x5C,0x0C,0x0C,0x5F,0xE4,0xE6,0x14,0x29,0x56,0x0B,0x36,
-0x49,0x5D,0x44,0x63,0xE0,0xAD,0x9C,0x96,0x18,0x66,0x1B,0x23,0x0D,0x3D,0x79,0xE9,
-0x6D,0x6B,0xD6,0x54,0xF8,0xD2,0x3C,0xC1,0x43,0x40,0xAE,0x1D,0x50,0xF5,0x52,0xFC,
-0x90,0x3B,0xBB,0x98,0x99,0x69,0x6B,0xC7,0xC1,0xA7,0xA8,0x68,0xA4,0x27,0xDC,0x9D,
-0xF9,0x27,0xAE,0x30,0x85,0xB9,0xF6,0x67,0x4D,0x3A,0x3E,0x8F,0x59,0x39,0x22,0x53,
-0x44,0xEB,0xC8,0x5D,0x03,0xCA,0xED,0x50,0x7A,0x7D,0x62,0x21,0x0A,0x80,0xC8,0x73,
-0x66,0xD1,0xA0,0x05,0x60,0x5F,0xE8,0xA5,0xB4,0xA7,0xAF,0xA8,0xF7,0x6D,0x35,0x9C,
-0x7C,0x5A,0x8A,0xD6,0xA2,0x38,0x99,0xF3,0x78,0x8B,0xF4,0x4D,0xD2,0x20,0x0B,0xDE,
-0x04,0xEE,0x8C,0x9B,0x47,0x81,0x72,0x0D,0xC0,0x14,0x32,0xEF,0x30,0x59,0x2E,0xAE,
-0xE0,0x71,0xF2,0x56,0xE4,0x6A,0x97,0x6F,0x92,0x50,0x6D,0x96,0x8D,0x68,0x7A,0x9A,
-0xB2,0x36,0x14,0x7A,0x06,0xF2,0x24,0xB9,0x09,0x11,0x50,0xD7,0x08,0xB1,0xB8,0x89,
-0x7A,0x84,0x23,0x61,0x42,0x29,0xE5,0xA3,0xCD,0xA2,0x20,0x41,0xD7,0xD1,0x9C,0x64,
-0xD9,0xEA,0x26,0xA1,0x8B,0x14,0xD7,0x4C,0x19,0xB2,0x50,0x41,0x71,0x3D,0x3F,0x4D,
-0x70,0x23,0x86,0x0C,0x4A,0xDC,0x81,0xD2,0xCC,0x32,0x94,0x84,0x0D,0x08,0x09,0x97,
-0x1C,0x4F,0xC0,0xEE,0x6B,0x20,0x74,0x30,0xD2,0xE0,0x39,0x34,0x10,0x85,0x21,0x15,
-0x01,0x08,0xE8,0x55,0x32,0xDE,0x71,0x49,0xD9,0x28,0x17,0x50,0x4D,0xE6,0xBE,0x4D,
-0xD1,0x75,0xAC,0xD0,0xCA,0xFB,0x41,0xB8,0x43,0xA5,0xAA,0xD3,0xC3,0x05,0x44,0x4F,
-0x2C,0x36,0x9B,0xE2,0xFA,0xE2,0x45,0xB8,0x23,0x53,0x6C,0x06,0x6F,0x67,0x55,0x7F,
-0x46,0xB5,0x4C,0x3F,0x6E,0x28,0x5A,0x79,0x26,0xD2,0xA4,0xA8,0x62,0x97,0xD2,0x1E,
-0xE2,0xED,0x4A,0x8B,0xBC,0x1B,0xFD,0x47,0x4A,0x0D,0xDF,0x67,0x66,0x7E,0xB2,0x5B,
-0x41,0xD0,0x3B,0xE4,0xF4,0x3B,0xF4,0x04,0x63,0xE9,0xEF,0xC2,0x54,0x00,0x51,0xA0,
-0x8A,0x2A,0xC9,0xCE,0x78,0xCC,0xD5,0xEA,0x87,0x04,0x18,0xB3,0xCE,0xAF,0x49,0x88,
-0xAF,0xF3,0x92,0x99,0xB6,0xB3,0xE6,0x61,0x0F,0xD2,0x85,0x00,0xE7,0x50,0x1A,0xE4,
-0x1B,0x95,0x9D,0x19,0xA1,0xB9,0x9C,0xB1,0x9B,0xB1,0x00,0x1E,0xEF,0xD0,0x0F,0x4F,
-0x42,0x6C,0xC9,0x0A,0xBC,0xEE,0x43,0xFA,0x3A,0x71,0xA5,0xC8,0x4D,0x26,0xA5,0x35,
-0xFD,0x89,0x5D,0xBC,0x85,0x62,0x1D,0x32,0xD2,0xA0,0x2B,0x54,0xED,0x9A,0x57,0xC1,
-0xDB,0xFA,0x10,0xCF,0x19,0xB7,0x8B,0x4A,0x1B,0x8F,0x01,0xB6,0x27,0x95,0x53,0xE8,
-0xB6,0x89,0x6D,0x5B,0xBC,0x68,0xD4,0x23,0xE8,0x8B,0x51,0xA2,0x56,0xF9,0xF0,0xA6,
-0x80,0xA0,0xD6,0x1E,0xB3,0xBC,0x0F,0x0F,0x53,0x75,0x29,0xAA,0xEA,0x13,0x77,0xE4,
-0xDE,0x8C,0x81,0x21,0xAD,0x07,0x10,0x47,0x11,0xAD,0x87,0x3D,0x07,0xD1,0x75,0xBC,
-0xCF,0xF3,0x66,0x7E,
-};
-
-
-/* subject:/OU=GlobalSign ECC Root CA - R5/O=GlobalSign/CN=GlobalSign */
-/* issuer :/OU=GlobalSign ECC Root CA - R5/O=GlobalSign/CN=GlobalSign */
-
-
-const unsigned char GlobalSign_ECC_Root_CA___R5_certificate[546]={
-0x30,0x82,0x02,0x1E,0x30,0x82,0x01,0xA4,0xA0,0x03,0x02,0x01,0x02,0x02,0x11,0x60,
-0x59,0x49,0xE0,0x26,0x2E,0xBB,0x55,0xF9,0x0A,0x77,0x8A,0x71,0xF9,0x4A,0xD8,0x6C,
-0x30,0x0A,0x06,0x08,0x2A,0x86,0x48,0xCE,0x3D,0x04,0x03,0x03,0x30,0x50,0x31,0x24,
-0x30,0x22,0x06,0x03,0x55,0x04,0x0B,0x13,0x1B,0x47,0x6C,0x6F,0x62,0x61,0x6C,0x53,
-0x69,0x67,0x6E,0x20,0x45,0x43,0x43,0x20,0x52,0x6F,0x6F,0x74,0x20,0x43,0x41,0x20,
-0x2D,0x20,0x52,0x35,0x31,0x13,0x30,0x11,0x06,0x03,0x55,0x04,0x0A,0x13,0x0A,0x47,
-0x6C,0x6F,0x62,0x61,0x6C,0x53,0x69,0x67,0x6E,0x31,0x13,0x30,0x11,0x06,0x03,0x55,
-0x04,0x03,0x13,0x0A,0x47,0x6C,0x6F,0x62,0x61,0x6C,0x53,0x69,0x67,0x6E,0x30,0x1E,
-0x17,0x0D,0x31,0x32,0x31,0x31,0x31,0x33,0x30,0x30,0x30,0x30,0x30,0x30,0x5A,0x17,
-0x0D,0x33,0x38,0x30,0x31,0x31,0x39,0x30,0x33,0x31,0x34,0x30,0x37,0x5A,0x30,0x50,
-0x31,0x24,0x30,0x22,0x06,0x03,0x55,0x04,0x0B,0x13,0x1B,0x47,0x6C,0x6F,0x62,0x61,
-0x6C,0x53,0x69,0x67,0x6E,0x20,0x45,0x43,0x43,0x20,0x52,0x6F,0x6F,0x74,0x20,0x43,
-0x41,0x20,0x2D,0x20,0x52,0x35,0x31,0x13,0x30,0x11,0x06,0x03,0x55,0x04,0x0A,0x13,
-0x0A,0x47,0x6C,0x6F,0x62,0x61,0x6C,0x53,0x69,0x67,0x6E,0x31,0x13,0x30,0x11,0x06,
-0x03,0x55,0x04,0x03,0x13,0x0A,0x47,0x6C,0x6F,0x62,0x61,0x6C,0x53,0x69,0x67,0x6E,
-0x30,0x76,0x30,0x10,0x06,0x07,0x2A,0x86,0x48,0xCE,0x3D,0x02,0x01,0x06,0x05,0x2B,
-0x81,0x04,0x00,0x22,0x03,0x62,0x00,0x04,0x47,0x45,0x0E,0x96,0xFB,0x7D,0x5D,0xBF,
-0xE9,0x39,0xD1,0x21,0xF8,0x9F,0x0B,0xB6,0xD5,0x7B,0x1E,0x92,0x3A,0x48,0x59,0x1C,
-0xF0,0x62,0x31,0x2D,0xC0,0x7A,0x28,0xFE,0x1A,0xA7,0x5C,0xB3,0xB6,0xCC,0x97,0xE7,
-0x45,0xD4,0x58,0xFA,0xD1,0x77,0x6D,0x43,0xA2,0xC0,0x87,0x65,0x34,0x0A,0x1F,0x7A,
-0xDD,0xEB,0x3C,0x33,0xA1,0xC5,0x9D,0x4D,0xA4,0x6F,0x41,0x95,0x38,0x7F,0xC9,0x1E,
-0x84,0xEB,0xD1,0x9E,0x49,0x92,0x87,0x94,0x87,0x0C,0x3A,0x85,0x4A,0x66,0x9F,0x9D,
-0x59,0x93,0x4D,0x97,0x61,0x06,0x86,0x4A,0xA3,0x42,0x30,0x40,0x30,0x0E,0x06,0x03,
-0x55,0x1D,0x0F,0x01,0x01,0xFF,0x04,0x04,0x03,0x02,0x01,0x06,0x30,0x0F,0x06,0x03,
-0x55,0x1D,0x13,0x01,0x01,0xFF,0x04,0x05,0x30,0x03,0x01,0x01,0xFF,0x30,0x1D,0x06,
-0x03,0x55,0x1D,0x0E,0x04,0x16,0x04,0x14,0x3D,0xE6,0x29,0x48,0x9B,0xEA,0x07,0xCA,
-0x21,0x44,0x4A,0x26,0xDE,0x6E,0xDE,0xD2,0x83,0xD0,0x9F,0x59,0x30,0x0A,0x06,0x08,
-0x2A,0x86,0x48,0xCE,0x3D,0x04,0x03,0x03,0x03,0x68,0x00,0x30,0x65,0x02,0x31,0x00,
-0xE5,0x69,0x12,0xC9,0x6E,0xDB,0xC6,0x31,0xBA,0x09,0x41,0xE1,0x97,0xF8,0xFB,0xFD,
-0x9A,0xE2,0x7D,0x12,0xC9,0xED,0x7C,0x64,0xD3,0xCB,0x05,0x25,0x8B,0x56,0xD9,0xA0,
-0xE7,0x5E,0x5D,0x4E,0x0B,0x83,0x9C,0x5B,0x76,0x29,0xA0,0x09,0x26,0x21,0x6A,0x62,
-0x02,0x30,0x71,0xD2,0xB5,0x8F,0x5C,0xEA,0x3B,0xE1,0x78,0x09,0x85,0xA8,0x75,0x92,
-0x3B,0xC8,0x5C,0xFD,0x48,0xEF,0x0D,0x74,0x22,0xA8,0x08,0xE2,0x6E,0xC5,0x49,0xCE,
-0xC7,0x0C,0xBC,0xA7,0x61,0x69,0xF1,0xF7,0x3B,0xE1,0x2A,0xCB,0xF9,0x2B,0xF3,0x66,
-0x90,0x37,
-};
-
-
-/* subject:/C=US/ST=UT/L=Salt Lake City/O=The USERTRUST Network/OU=http://www.usertrust.com/CN=UTN-USERFirst-Hardware */
-/* issuer :/C=US/ST=UT/L=Salt Lake City/O=The USERTRUST Network/OU=http://www.usertrust.com/CN=UTN-USERFirst-Hardware */
-
-
-const unsigned char UTN_USERFirst_Hardware_Root_CA_certificate[1144]={
-0x30,0x82,0x04,0x74,0x30,0x82,0x03,0x5C,0xA0,0x03,0x02,0x01,0x02,0x02,0x10,0x44,
-0xBE,0x0C,0x8B,0x50,0x00,0x24,0xB4,0x11,0xD3,0x36,0x2A,0xFE,0x65,0x0A,0xFD,0x30,
-0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x05,0x05,0x00,0x30,0x81,
-0x97,0x31,0x0B,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x0B,
-0x30,0x09,0x06,0x03,0x55,0x04,0x08,0x13,0x02,0x55,0x54,0x31,0x17,0x30,0x15,0x06,
-0x03,0x55,0x04,0x07,0x13,0x0E,0x53,0x61,0x6C,0x74,0x20,0x4C,0x61,0x6B,0x65,0x20,
-0x43,0x69,0x74,0x79,0x31,0x1E,0x30,0x1C,0x06,0x03,0x55,0x04,0x0A,0x13,0x15,0x54,
-0x68,0x65,0x20,0x55,0x53,0x45,0x52,0x54,0x52,0x55,0x53,0x54,0x20,0x4E,0x65,0x74,
-0x77,0x6F,0x72,0x6B,0x31,0x21,0x30,0x1F,0x06,0x03,0x55,0x04,0x0B,0x13,0x18,0x68,
-0x74,0x74,0x70,0x3A,0x2F,0x2F,0x77,0x77,0x77,0x2E,0x75,0x73,0x65,0x72,0x74,0x72,
-0x75,0x73,0x74,0x2E,0x63,0x6F,0x6D,0x31,0x1F,0x30,0x1D,0x06,0x03,0x55,0x04,0x03,
-0x13,0x16,0x55,0x54,0x4E,0x2D,0x55,0x53,0x45,0x52,0x46,0x69,0x72,0x73,0x74,0x2D,
-0x48,0x61,0x72,0x64,0x77,0x61,0x72,0x65,0x30,0x1E,0x17,0x0D,0x39,0x39,0x30,0x37,
-0x30,0x39,0x31,0x38,0x31,0x30,0x34,0x32,0x5A,0x17,0x0D,0x31,0x39,0x30,0x37,0x30,
-0x39,0x31,0x38,0x31,0x39,0x32,0x32,0x5A,0x30,0x81,0x97,0x31,0x0B,0x30,0x09,0x06,
-0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x0B,0x30,0x09,0x06,0x03,0x55,0x04,
-0x08,0x13,0x02,0x55,0x54,0x31,0x17,0x30,0x15,0x06,0x03,0x55,0x04,0x07,0x13,0x0E,
-0x53,0x61,0x6C,0x74,0x20,0x4C,0x61,0x6B,0x65,0x20,0x43,0x69,0x74,0x79,0x31,0x1E,
-0x30,0x1C,0x06,0x03,0x55,0x04,0x0A,0x13,0x15,0x54,0x68,0x65,0x20,0x55,0x53,0x45,
-0x52,0x54,0x52,0x55,0x53,0x54,0x20,0x4E,0x65,0x74,0x77,0x6F,0x72,0x6B,0x31,0x21,
-0x30,0x1F,0x06,0x03,0x55,0x04,0x0B,0x13,0x18,0x68,0x74,0x74,0x70,0x3A,0x2F,0x2F,
-0x77,0x77,0x77,0x2E,0x75,0x73,0x65,0x72,0x74,0x72,0x75,0x73,0x74,0x2E,0x63,0x6F,
-0x6D,0x31,0x1F,0x30,0x1D,0x06,0x03,0x55,0x04,0x03,0x13,0x16,0x55,0x54,0x4E,0x2D,
-0x55,0x53,0x45,0x52,0x46,0x69,0x72,0x73,0x74,0x2D,0x48,0x61,0x72,0x64,0x77,0x61,
-0x72,0x65,0x30,0x82,0x01,0x22,0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,
-0x01,0x01,0x01,0x05,0x00,0x03,0x82,0x01,0x0F,0x00,0x30,0x82,0x01,0x0A,0x02,0x82,
-0x01,0x01,0x00,0xB1,0xF7,0xC3,0x38,0x3F,0xB4,0xA8,0x7F,0xCF,0x39,0x82,0x51,0x67,
-0xD0,0x6D,0x9F,0xD2,0xFF,0x58,0xF3,0xE7,0x9F,0x2B,0xEC,0x0D,0x89,0x54,0x99,0xB9,
-0x38,0x99,0x16,0xF7,0xE0,0x21,0x79,0x48,0xC2,0xBB,0x61,0x74,0x12,0x96,0x1D,0x3C,
-0x6A,0x72,0xD5,0x3C,0x10,0x67,0x3A,0x39,0xED,0x2B,0x13,0xCD,0x66,0xEB,0x95,0x09,
-0x33,0xA4,0x6C,0x97,0xB1,0xE8,0xC6,0xEC,0xC1,0x75,0x79,0x9C,0x46,0x5E,0x8D,0xAB,
-0xD0,0x6A,0xFD,0xB9,0x2A,0x55,0x17,0x10,0x54,0xB3,0x19,0xF0,0x9A,0xF6,0xF1,0xB1,
-0x5D,0xB6,0xA7,0x6D,0xFB,0xE0,0x71,0x17,0x6B,0xA2,0x88,0xFB,0x00,0xDF,0xFE,0x1A,
-0x31,0x77,0x0C,0x9A,0x01,0x7A,0xB1,0x32,0xE3,0x2B,0x01,0x07,0x38,0x6E,0xC3,0xA5,
-0x5E,0x23,0xBC,0x45,0x9B,0x7B,0x50,0xC1,0xC9,0x30,0x8F,0xDB,0xE5,0x2B,0x7A,0xD3,
-0x5B,0xFB,0x33,0x40,0x1E,0xA0,0xD5,0x98,0x17,0xBC,0x8B,0x87,0xC3,0x89,0xD3,0x5D,
-0xA0,0x8E,0xB2,0xAA,0xAA,0xF6,0x8E,0x69,0x88,0x06,0xC5,0xFA,0x89,0x21,0xF3,0x08,
-0x9D,0x69,0x2E,0x09,0x33,0x9B,0x29,0x0D,0x46,0x0F,0x8C,0xCC,0x49,0x34,0xB0,0x69,
-0x51,0xBD,0xF9,0x06,0xCD,0x68,0xAD,0x66,0x4C,0xBC,0x3E,0xAC,0x61,0xBD,0x0A,0x88,
-0x0E,0xC8,0xDF,0x3D,0xEE,0x7C,0x04,0x4C,0x9D,0x0A,0x5E,0x6B,0x91,0xD6,0xEE,0xC7,
-0xED,0x28,0x8D,0xAB,0x4D,0x87,0x89,0x73,0xD0,0x6E,0xA4,0xD0,0x1E,0x16,0x8B,0x14,
-0xE1,0x76,0x44,0x03,0x7F,0x63,0xAC,0xE4,0xCD,0x49,0x9C,0xC5,0x92,0xF4,0xAB,0x32,
-0xA1,0x48,0x5B,0x02,0x03,0x01,0x00,0x01,0xA3,0x81,0xB9,0x30,0x81,0xB6,0x30,0x0B,
-0x06,0x03,0x55,0x1D,0x0F,0x04,0x04,0x03,0x02,0x01,0xC6,0x30,0x0F,0x06,0x03,0x55,
-0x1D,0x13,0x01,0x01,0xFF,0x04,0x05,0x30,0x03,0x01,0x01,0xFF,0x30,0x1D,0x06,0x03,
-0x55,0x1D,0x0E,0x04,0x16,0x04,0x14,0xA1,0x72,0x5F,0x26,0x1B,0x28,0x98,0x43,0x95,
-0x5D,0x07,0x37,0xD5,0x85,0x96,0x9D,0x4B,0xD2,0xC3,0x45,0x30,0x44,0x06,0x03,0x55,
-0x1D,0x1F,0x04,0x3D,0x30,0x3B,0x30,0x39,0xA0,0x37,0xA0,0x35,0x86,0x33,0x68,0x74,
-0x74,0x70,0x3A,0x2F,0x2F,0x63,0x72,0x6C,0x2E,0x75,0x73,0x65,0x72,0x74,0x72,0x75,
-0x73,0x74,0x2E,0x63,0x6F,0x6D,0x2F,0x55,0x54,0x4E,0x2D,0x55,0x53,0x45,0x52,0x46,
-0x69,0x72,0x73,0x74,0x2D,0x48,0x61,0x72,0x64,0x77,0x61,0x72,0x65,0x2E,0x63,0x72,
-0x6C,0x30,0x31,0x06,0x03,0x55,0x1D,0x25,0x04,0x2A,0x30,0x28,0x06,0x08,0x2B,0x06,
-0x01,0x05,0x05,0x07,0x03,0x01,0x06,0x08,0x2B,0x06,0x01,0x05,0x05,0x07,0x03,0x05,
-0x06,0x08,0x2B,0x06,0x01,0x05,0x05,0x07,0x03,0x06,0x06,0x08,0x2B,0x06,0x01,0x05,
-0x05,0x07,0x03,0x07,0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,
-0x05,0x05,0x00,0x03,0x82,0x01,0x01,0x00,0x47,0x19,0x0F,0xDE,0x74,0xC6,0x99,0x97,
-0xAF,0xFC,0xAD,0x28,0x5E,0x75,0x8E,0xEB,0x2D,0x67,0xEE,0x4E,0x7B,0x2B,0xD7,0x0C,
-0xFF,0xF6,0xDE,0xCB,0x55,0xA2,0x0A,0xE1,0x4C,0x54,0x65,0x93,0x60,0x6B,0x9F,0x12,
-0x9C,0xAD,0x5E,0x83,0x2C,0xEB,0x5A,0xAE,0xC0,0xE4,0x2D,0xF4,0x00,0x63,0x1D,0xB8,
-0xC0,0x6C,0xF2,0xCF,0x49,0xBB,0x4D,0x93,0x6F,0x06,0xA6,0x0A,0x22,0xB2,0x49,0x62,
-0x08,0x4E,0xFF,0xC8,0xC8,0x14,0xB2,0x88,0x16,0x5D,0xE7,0x01,0xE4,0x12,0x95,0xE5,
-0x45,0x34,0xB3,0x8B,0x69,0xBD,0xCF,0xB4,0x85,0x8F,0x75,0x51,0x9E,0x7D,0x3A,0x38,
-0x3A,0x14,0x48,0x12,0xC6,0xFB,0xA7,0x3B,0x1A,0x8D,0x0D,0x82,0x40,0x07,0xE8,0x04,
-0x08,0x90,0xA1,0x89,0xCB,0x19,0x50,0xDF,0xCA,0x1C,0x01,0xBC,0x1D,0x04,0x19,0x7B,
-0x10,0x76,0x97,0x3B,0xEE,0x90,0x90,0xCA,0xC4,0x0E,0x1F,0x16,0x6E,0x75,0xEF,0x33,
-0xF8,0xD3,0x6F,0x5B,0x1E,0x96,0xE3,0xE0,0x74,0x77,0x74,0x7B,0x8A,0xA2,0x6E,0x2D,
-0xDD,0x76,0xD6,0x39,0x30,0x82,0xF0,0xAB,0x9C,0x52,0xF2,0x2A,0xC7,0xAF,0x49,0x5E,
-0x7E,0xC7,0x68,0xE5,0x82,0x81,0xC8,0x6A,0x27,0xF9,0x27,0x88,0x2A,0xD5,0x58,0x50,
-0x95,0x1F,0xF0,0x3B,0x1C,0x57,0xBB,0x7D,0x14,0x39,0x62,0x2B,0x9A,0xC9,0x94,0x92,
-0x2A,0xA3,0x22,0x0C,0xFF,0x89,0x26,0x7D,0x5F,0x23,0x2B,0x47,0xD7,0x15,0x1D,0xA9,
-0x6A,0x9E,0x51,0x0D,0x2A,0x51,0x9E,0x81,0xF9,0xD4,0x3B,0x5E,0x70,0x12,0x7F,0x10,
-0x32,0x9C,0x1E,0xBB,0x9D,0xF8,0x66,0xA8,
-};
-
-
-/* subject:/OU=GlobalSign ECC Root CA - R4/O=GlobalSign/CN=GlobalSign */
-/* issuer :/OU=GlobalSign ECC Root CA - R4/O=GlobalSign/CN=GlobalSign */
-
-
-const unsigned char GlobalSign_ECC_Root_CA___R4_certificate[485]={
-0x30,0x82,0x01,0xE1,0x30,0x82,0x01,0x87,0xA0,0x03,0x02,0x01,0x02,0x02,0x11,0x2A,
-0x38,0xA4,0x1C,0x96,0x0A,0x04,0xDE,0x42,0xB2,0x28,0xA5,0x0B,0xE8,0x34,0x98,0x02,
-0x30,0x0A,0x06,0x08,0x2A,0x86,0x48,0xCE,0x3D,0x04,0x03,0x02,0x30,0x50,0x31,0x24,
-0x30,0x22,0x06,0x03,0x55,0x04,0x0B,0x13,0x1B,0x47,0x6C,0x6F,0x62,0x61,0x6C,0x53,
-0x69,0x67,0x6E,0x20,0x45,0x43,0x43,0x20,0x52,0x6F,0x6F,0x74,0x20,0x43,0x41,0x20,
-0x2D,0x20,0x52,0x34,0x31,0x13,0x30,0x11,0x06,0x03,0x55,0x04,0x0A,0x13,0x0A,0x47,
-0x6C,0x6F,0x62,0x61,0x6C,0x53,0x69,0x67,0x6E,0x31,0x13,0x30,0x11,0x06,0x03,0x55,
-0x04,0x03,0x13,0x0A,0x47,0x6C,0x6F,0x62,0x61,0x6C,0x53,0x69,0x67,0x6E,0x30,0x1E,
-0x17,0x0D,0x31,0x32,0x31,0x31,0x31,0x33,0x30,0x30,0x30,0x30,0x30,0x30,0x5A,0x17,
-0x0D,0x33,0x38,0x30,0x31,0x31,0x39,0x30,0x33,0x31,0x34,0x30,0x37,0x5A,0x30,0x50,
-0x31,0x24,0x30,0x22,0x06,0x03,0x55,0x04,0x0B,0x13,0x1B,0x47,0x6C,0x6F,0x62,0x61,
-0x6C,0x53,0x69,0x67,0x6E,0x20,0x45,0x43,0x43,0x20,0x52,0x6F,0x6F,0x74,0x20,0x43,
-0x41,0x20,0x2D,0x20,0x52,0x34,0x31,0x13,0x30,0x11,0x06,0x03,0x55,0x04,0x0A,0x13,
-0x0A,0x47,0x6C,0x6F,0x62,0x61,0x6C,0x53,0x69,0x67,0x6E,0x31,0x13,0x30,0x11,0x06,
-0x03,0x55,0x04,0x03,0x13,0x0A,0x47,0x6C,0x6F,0x62,0x61,0x6C,0x53,0x69,0x67,0x6E,
-0x30,0x59,0x30,0x13,0x06,0x07,0x2A,0x86,0x48,0xCE,0x3D,0x02,0x01,0x06,0x08,0x2A,
-0x86,0x48,0xCE,0x3D,0x03,0x01,0x07,0x03,0x42,0x00,0x04,0xB8,0xC6,0x79,0xD3,0x8F,
-0x6C,0x25,0x0E,0x9F,0x2E,0x39,0x19,0x1C,0x03,0xA4,0xAE,0x9A,0xE5,0x39,0x07,0x09,
-0x16,0xCA,0x63,0xB1,0xB9,0x86,0xF8,0x8A,0x57,0xC1,0x57,0xCE,0x42,0xFA,0x73,0xA1,
-0xF7,0x65,0x42,0xFF,0x1E,0xC1,0x00,0xB2,0x6E,0x73,0x0E,0xFF,0xC7,0x21,0xE5,0x18,
-0xA4,0xAA,0xD9,0x71,0x3F,0xA8,0xD4,0xB9,0xCE,0x8C,0x1D,0xA3,0x42,0x30,0x40,0x30,
-0x0E,0x06,0x03,0x55,0x1D,0x0F,0x01,0x01,0xFF,0x04,0x04,0x03,0x02,0x01,0x06,0x30,
-0x0F,0x06,0x03,0x55,0x1D,0x13,0x01,0x01,0xFF,0x04,0x05,0x30,0x03,0x01,0x01,0xFF,
-0x30,0x1D,0x06,0x03,0x55,0x1D,0x0E,0x04,0x16,0x04,0x14,0x54,0xB0,0x7B,0xAD,0x45,
-0xB8,0xE2,0x40,0x7F,0xFB,0x0A,0x6E,0xFB,0xBE,0x33,0xC9,0x3C,0xA3,0x84,0xD5,0x30,
-0x0A,0x06,0x08,0x2A,0x86,0x48,0xCE,0x3D,0x04,0x03,0x02,0x03,0x48,0x00,0x30,0x45,
-0x02,0x21,0x00,0xDC,0x92,0xA1,0xA0,0x13,0xA6,0xCF,0x03,0xB0,0xE6,0xC4,0x21,0x97,
-0x90,0xFA,0x14,0x57,0x2D,0x03,0xEC,0xEE,0x3C,0xD3,0x6E,0xCA,0xA8,0x6C,0x76,0xBC,
-0xA2,0xDE,0xBB,0x02,0x20,0x27,0xA8,0x85,0x27,0x35,0x9B,0x56,0xC6,0xA3,0xF2,0x47,
-0xD2,0xB7,0x6E,0x1B,0x02,0x00,0x17,0xAA,0x67,0xA6,0x15,0x91,0xDE,0xFA,0x94,0xEC,
-0x7B,0x0B,0xF8,0x9F,0x84,
-};
-
-
-/* subject:/C=DE/O=TC TrustCenter GmbH/OU=TC TrustCenter Universal CA/CN=TC TrustCenter Universal CA I */
-/* issuer :/C=DE/O=TC TrustCenter GmbH/OU=TC TrustCenter Universal CA/CN=TC TrustCenter Universal CA I */
-
-
-const unsigned char TC_TrustCenter_Universal_CA_I_certificate[993]={
-0x30,0x82,0x03,0xDD,0x30,0x82,0x02,0xC5,0xA0,0x03,0x02,0x01,0x02,0x02,0x0E,0x1D,
-0xA2,0x00,0x01,0x00,0x02,0xEC,0xB7,0x60,0x80,0x78,0x8D,0xB6,0x06,0x30,0x0D,0x06,
-0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x05,0x05,0x00,0x30,0x79,0x31,0x0B,
-0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x44,0x45,0x31,0x1C,0x30,0x1A,0x06,
-0x03,0x55,0x04,0x0A,0x13,0x13,0x54,0x43,0x20,0x54,0x72,0x75,0x73,0x74,0x43,0x65,
-0x6E,0x74,0x65,0x72,0x20,0x47,0x6D,0x62,0x48,0x31,0x24,0x30,0x22,0x06,0x03,0x55,
-0x04,0x0B,0x13,0x1B,0x54,0x43,0x20,0x54,0x72,0x75,0x73,0x74,0x43,0x65,0x6E,0x74,
-0x65,0x72,0x20,0x55,0x6E,0x69,0x76,0x65,0x72,0x73,0x61,0x6C,0x20,0x43,0x41,0x31,
-0x26,0x30,0x24,0x06,0x03,0x55,0x04,0x03,0x13,0x1D,0x54,0x43,0x20,0x54,0x72,0x75,
-0x73,0x74,0x43,0x65,0x6E,0x74,0x65,0x72,0x20,0x55,0x6E,0x69,0x76,0x65,0x72,0x73,
-0x61,0x6C,0x20,0x43,0x41,0x20,0x49,0x30,0x1E,0x17,0x0D,0x30,0x36,0x30,0x33,0x32,
-0x32,0x31,0x35,0x35,0x34,0x32,0x38,0x5A,0x17,0x0D,0x32,0x35,0x31,0x32,0x33,0x31,
-0x32,0x32,0x35,0x39,0x35,0x39,0x5A,0x30,0x79,0x31,0x0B,0x30,0x09,0x06,0x03,0x55,
-0x04,0x06,0x13,0x02,0x44,0x45,0x31,0x1C,0x30,0x1A,0x06,0x03,0x55,0x04,0x0A,0x13,
-0x13,0x54,0x43,0x20,0x54,0x72,0x75,0x73,0x74,0x43,0x65,0x6E,0x74,0x65,0x72,0x20,
-0x47,0x6D,0x62,0x48,0x31,0x24,0x30,0x22,0x06,0x03,0x55,0x04,0x0B,0x13,0x1B,0x54,
-0x43,0x20,0x54,0x72,0x75,0x73,0x74,0x43,0x65,0x6E,0x74,0x65,0x72,0x20,0x55,0x6E,
-0x69,0x76,0x65,0x72,0x73,0x61,0x6C,0x20,0x43,0x41,0x31,0x26,0x30,0x24,0x06,0x03,
-0x55,0x04,0x03,0x13,0x1D,0x54,0x43,0x20,0x54,0x72,0x75,0x73,0x74,0x43,0x65,0x6E,
-0x74,0x65,0x72,0x20,0x55,0x6E,0x69,0x76,0x65,0x72,0x73,0x61,0x6C,0x20,0x43,0x41,
-0x20,0x49,0x30,0x82,0x01,0x22,0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,
-0x01,0x01,0x01,0x05,0x00,0x03,0x82,0x01,0x0F,0x00,0x30,0x82,0x01,0x0A,0x02,0x82,
-0x01,0x01,0x00,0xA4,0x77,0x23,0x96,0x44,0xAF,0x90,0xF4,0x31,0xA7,0x10,0xF4,0x26,
-0x87,0x9C,0xF3,0x38,0xD9,0x0F,0x5E,0xDE,0xCF,0x41,0xE8,0x31,0xAD,0xC6,0x74,0x91,
-0x24,0x96,0x78,0x1E,0x09,0xA0,0x9B,0x9A,0x95,0x4A,0x4A,0xF5,0x62,0x7C,0x02,0xA8,
-0xCA,0xAC,0xFB,0x5A,0x04,0x76,0x39,0xDE,0x5F,0xF1,0xF9,0xB3,0xBF,0xF3,0x03,0x58,
-0x55,0xD2,0xAA,0xB7,0xE3,0x04,0x22,0xD1,0xF8,0x94,0xDA,0x22,0x08,0x00,0x8D,0xD3,
-0x7C,0x26,0x5D,0xCC,0x77,0x79,0xE7,0x2C,0x78,0x39,0xA8,0x26,0x73,0x0E,0xA2,0x5D,
-0x25,0x69,0x85,0x4F,0x55,0x0E,0x9A,0xEF,0xC6,0xB9,0x44,0xE1,0x57,0x3D,0xDF,0x1F,
-0x54,0x22,0xE5,0x6F,0x65,0xAA,0x33,0x84,0x3A,0xF3,0xCE,0x7A,0xBE,0x55,0x97,0xAE,
-0x8D,0x12,0x0F,0x14,0x33,0xE2,0x50,0x70,0xC3,0x49,0x87,0x13,0xBC,0x51,0xDE,0xD7,
-0x98,0x12,0x5A,0xEF,0x3A,0x83,0x33,0x92,0x06,0x75,0x8B,0x92,0x7C,0x12,0x68,0x7B,
-0x70,0x6A,0x0F,0xB5,0x9B,0xB6,0x77,0x5B,0x48,0x59,0x9D,0xE4,0xEF,0x5A,0xAD,0xF3,
-0xC1,0x9E,0xD4,0xD7,0x45,0x4E,0xCA,0x56,0x34,0x21,0xBC,0x3E,0x17,0x5B,0x6F,0x77,
-0x0C,0x48,0x01,0x43,0x29,0xB0,0xDD,0x3F,0x96,0x6E,0xE6,0x95,0xAA,0x0C,0xC0,0x20,
-0xB6,0xFD,0x3E,0x36,0x27,0x9C,0xE3,0x5C,0xCF,0x4E,0x81,0xDC,0x19,0xBB,0x91,0x90,
-0x7D,0xEC,0xE6,0x97,0x04,0x1E,0x93,0xCC,0x22,0x49,0xD7,0x97,0x86,0xB6,0x13,0x0A,
-0x3C,0x43,0x23,0x77,0x7E,0xF0,0xDC,0xE6,0xCD,0x24,0x1F,0x3B,0x83,0x9B,0x34,0x3A,
-0x83,0x34,0xE3,0x02,0x03,0x01,0x00,0x01,0xA3,0x63,0x30,0x61,0x30,0x1F,0x06,0x03,
-0x55,0x1D,0x23,0x04,0x18,0x30,0x16,0x80,0x14,0x92,0xA4,0x75,0x2C,0xA4,0x9E,0xBE,
-0x81,0x44,0xEB,0x79,0xFC,0x8A,0xC5,0x95,0xA5,0xEB,0x10,0x75,0x73,0x30,0x0F,0x06,
-0x03,0x55,0x1D,0x13,0x01,0x01,0xFF,0x04,0x05,0x30,0x03,0x01,0x01,0xFF,0x30,0x0E,
-0x06,0x03,0x55,0x1D,0x0F,0x01,0x01,0xFF,0x04,0x04,0x03,0x02,0x01,0x86,0x30,0x1D,
-0x06,0x03,0x55,0x1D,0x0E,0x04,0x16,0x04,0x14,0x92,0xA4,0x75,0x2C,0xA4,0x9E,0xBE,
-0x81,0x44,0xEB,0x79,0xFC,0x8A,0xC5,0x95,0xA5,0xEB,0x10,0x75,0x73,0x30,0x0D,0x06,
-0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x05,0x05,0x00,0x03,0x82,0x01,0x01,
-0x00,0x28,0xD2,0xE0,0x86,0xD5,0xE6,0xF8,0x7B,0xF0,0x97,0xDC,0x22,0x6B,0x3B,0x95,
-0x14,0x56,0x0F,0x11,0x30,0xA5,0x9A,0x4F,0x3A,0xB0,0x3A,0xE0,0x06,0xCB,0x65,0xF5,
-0xED,0xC6,0x97,0x27,0xFE,0x25,0xF2,0x57,0xE6,0x5E,0x95,0x8C,0x3E,0x64,0x60,0x15,
-0x5A,0x7F,0x2F,0x0D,0x01,0xC5,0xB1,0x60,0xFD,0x45,0x35,0xCF,0xF0,0xB2,0xBF,0x06,
-0xD9,0xEF,0x5A,0xBE,0xB3,0x62,0x21,0xB4,0xD7,0xAB,0x35,0x7C,0x53,0x3E,0xA6,0x27,
-0xF1,0xA1,0x2D,0xDA,0x1A,0x23,0x9D,0xCC,0xDD,0xEC,0x3C,0x2D,0x9E,0x27,0x34,0x5D,
-0x0F,0xC2,0x36,0x79,0xBC,0xC9,0x4A,0x62,0x2D,0xED,0x6B,0xD9,0x7D,0x41,0x43,0x7C,
-0xB6,0xAA,0xCA,0xED,0x61,0xB1,0x37,0x82,0x15,0x09,0x1A,0x8A,0x16,0x30,0xD8,0xEC,
-0xC9,0xD6,0x47,0x72,0x78,0x4B,0x10,0x46,0x14,0x8E,0x5F,0x0E,0xAF,0xEC,0xC7,0x2F,
-0xAB,0x10,0xD7,0xB6,0xF1,0x6E,0xEC,0x86,0xB2,0xC2,0xE8,0x0D,0x92,0x73,0xDC,0xA2,
-0xF4,0x0F,0x3A,0xBF,0x61,0x23,0x10,0x89,0x9C,0x48,0x40,0x6E,0x70,0x00,0xB3,0xD3,
-0xBA,0x37,0x44,0x58,0x11,0x7A,0x02,0x6A,0x88,0xF0,0x37,0x34,0xF0,0x19,0xE9,0xAC,
-0xD4,0x65,0x73,0xF6,0x69,0x8C,0x64,0x94,0x3A,0x79,0x85,0x29,0xB0,0x16,0x2B,0x0C,
-0x82,0x3F,0x06,0x9C,0xC7,0xFD,0x10,0x2B,0x9E,0x0F,0x2C,0xB6,0x9E,0xE3,0x15,0xBF,
-0xD9,0x36,0x1C,0xBA,0x25,0x1A,0x52,0x3D,0x1A,0xEC,0x22,0x0C,0x1C,0xE0,0xA4,0xA2,
-0x3D,0xF0,0xE8,0x39,0xCF,0x81,0xC0,0x7B,0xED,0x5D,0x1F,0x6F,0xC5,0xD0,0x0B,0xD7,
-0x98,
-};
-
-
-/* subject:/C=GB/ST=Greater Manchester/L=Salford/O=Comodo CA Limited/CN=Trusted Certificate Services */
-/* issuer :/C=GB/ST=Greater Manchester/L=Salford/O=Comodo CA Limited/CN=Trusted Certificate Services */
-
-
-const unsigned char Comodo_Trusted_Services_root_certificate[1095]={
-0x30,0x82,0x04,0x43,0x30,0x82,0x03,0x2B,0xA0,0x03,0x02,0x01,0x02,0x02,0x01,0x01,
-0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x05,0x05,0x00,0x30,
-0x7F,0x31,0x0B,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x47,0x42,0x31,0x1B,
-0x30,0x19,0x06,0x03,0x55,0x04,0x08,0x0C,0x12,0x47,0x72,0x65,0x61,0x74,0x65,0x72,
-0x20,0x4D,0x61,0x6E,0x63,0x68,0x65,0x73,0x74,0x65,0x72,0x31,0x10,0x30,0x0E,0x06,
-0x03,0x55,0x04,0x07,0x0C,0x07,0x53,0x61,0x6C,0x66,0x6F,0x72,0x64,0x31,0x1A,0x30,
-0x18,0x06,0x03,0x55,0x04,0x0A,0x0C,0x11,0x43,0x6F,0x6D,0x6F,0x64,0x6F,0x20,0x43,
-0x41,0x20,0x4C,0x69,0x6D,0x69,0x74,0x65,0x64,0x31,0x25,0x30,0x23,0x06,0x03,0x55,
-0x04,0x03,0x0C,0x1C,0x54,0x72,0x75,0x73,0x74,0x65,0x64,0x20,0x43,0x65,0x72,0x74,
-0x69,0x66,0x69,0x63,0x61,0x74,0x65,0x20,0x53,0x65,0x72,0x76,0x69,0x63,0x65,0x73,
-0x30,0x1E,0x17,0x0D,0x30,0x34,0x30,0x31,0x30,0x31,0x30,0x30,0x30,0x30,0x30,0x30,
-0x5A,0x17,0x0D,0x32,0x38,0x31,0x32,0x33,0x31,0x32,0x33,0x35,0x39,0x35,0x39,0x5A,
-0x30,0x7F,0x31,0x0B,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x47,0x42,0x31,
-0x1B,0x30,0x19,0x06,0x03,0x55,0x04,0x08,0x0C,0x12,0x47,0x72,0x65,0x61,0x74,0x65,
-0x72,0x20,0x4D,0x61,0x6E,0x63,0x68,0x65,0x73,0x74,0x65,0x72,0x31,0x10,0x30,0x0E,
-0x06,0x03,0x55,0x04,0x07,0x0C,0x07,0x53,0x61,0x6C,0x66,0x6F,0x72,0x64,0x31,0x1A,
-0x30,0x18,0x06,0x03,0x55,0x04,0x0A,0x0C,0x11,0x43,0x6F,0x6D,0x6F,0x64,0x6F,0x20,
-0x43,0x41,0x20,0x4C,0x69,0x6D,0x69,0x74,0x65,0x64,0x31,0x25,0x30,0x23,0x06,0x03,
-0x55,0x04,0x03,0x0C,0x1C,0x54,0x72,0x75,0x73,0x74,0x65,0x64,0x20,0x43,0x65,0x72,
-0x74,0x69,0x66,0x69,0x63,0x61,0x74,0x65,0x20,0x53,0x65,0x72,0x76,0x69,0x63,0x65,
-0x73,0x30,0x82,0x01,0x22,0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,
-0x01,0x01,0x05,0x00,0x03,0x82,0x01,0x0F,0x00,0x30,0x82,0x01,0x0A,0x02,0x82,0x01,
-0x01,0x00,0xDF,0x71,0x6F,0x36,0x58,0x53,0x5A,0xF2,0x36,0x54,0x57,0x80,0xC4,0x74,
-0x08,0x20,0xED,0x18,0x7F,0x2A,0x1D,0xE6,0x35,0x9A,0x1E,0x25,0xAC,0x9C,0xE5,0x96,
-0x7E,0x72,0x52,0xA0,0x15,0x42,0xDB,0x59,0xDD,0x64,0x7A,0x1A,0xD0,0xB8,0x7B,0xDD,
-0x39,0x15,0xBC,0x55,0x48,0xC4,0xED,0x3A,0x00,0xEA,0x31,0x11,0xBA,0xF2,0x71,0x74,
-0x1A,0x67,0xB8,0xCF,0x33,0xCC,0xA8,0x31,0xAF,0xA3,0xE3,0xD7,0x7F,0xBF,0x33,0x2D,
-0x4C,0x6A,0x3C,0xEC,0x8B,0xC3,0x92,0xD2,0x53,0x77,0x24,0x74,0x9C,0x07,0x6E,0x70,
-0xFC,0xBD,0x0B,0x5B,0x76,0xBA,0x5F,0xF2,0xFF,0xD7,0x37,0x4B,0x4A,0x60,0x78,0xF7,
-0xF0,0xFA,0xCA,0x70,0xB4,0xEA,0x59,0xAA,0xA3,0xCE,0x48,0x2F,0xA9,0xC3,0xB2,0x0B,
-0x7E,0x17,0x72,0x16,0x0C,0xA6,0x07,0x0C,0x1B,0x38,0xCF,0xC9,0x62,0xB7,0x3F,0xA0,
-0x93,0xA5,0x87,0x41,0xF2,0xB7,0x70,0x40,0x77,0xD8,0xBE,0x14,0x7C,0xE3,0xA8,0xC0,
-0x7A,0x8E,0xE9,0x63,0x6A,0xD1,0x0F,0x9A,0xC6,0xD2,0xF4,0x8B,0x3A,0x14,0x04,0x56,
-0xD4,0xED,0xB8,0xCC,0x6E,0xF5,0xFB,0xE2,0x2C,0x58,0xBD,0x7F,0x4F,0x6B,0x2B,0xF7,
-0x60,0x24,0x58,0x24,0xCE,0x26,0xEF,0x34,0x91,0x3A,0xD5,0xE3,0x81,0xD0,0xB2,0xF0,
-0x04,0x02,0xD7,0x5B,0xB7,0x3E,0x92,0xAC,0x6B,0x12,0x8A,0xF9,0xE4,0x05,0xB0,0x3B,
-0x91,0x49,0x5C,0xB2,0xEB,0x53,0xEA,0xF8,0x9F,0x47,0x86,0xEE,0xBF,0x95,0xC0,0xC0,
-0x06,0x9F,0xD2,0x5B,0x5E,0x11,0x1B,0xF4,0xC7,0x04,0x35,0x29,0xD2,0x55,0x5C,0xE4,
-0xED,0xEB,0x02,0x03,0x01,0x00,0x01,0xA3,0x81,0xC9,0x30,0x81,0xC6,0x30,0x1D,0x06,
-0x03,0x55,0x1D,0x0E,0x04,0x16,0x04,0x14,0xC5,0x7B,0x58,0xBD,0xED,0xDA,0x25,0x69,
-0xD2,0xF7,0x59,0x16,0xA8,0xB3,0x32,0xC0,0x7B,0x27,0x5B,0xF4,0x30,0x0E,0x06,0x03,
-0x55,0x1D,0x0F,0x01,0x01,0xFF,0x04,0x04,0x03,0x02,0x01,0x06,0x30,0x0F,0x06,0x03,
-0x55,0x1D,0x13,0x01,0x01,0xFF,0x04,0x05,0x30,0x03,0x01,0x01,0xFF,0x30,0x81,0x83,
-0x06,0x03,0x55,0x1D,0x1F,0x04,0x7C,0x30,0x7A,0x30,0x3C,0xA0,0x3A,0xA0,0x38,0x86,
-0x36,0x68,0x74,0x74,0x70,0x3A,0x2F,0x2F,0x63,0x72,0x6C,0x2E,0x63,0x6F,0x6D,0x6F,
-0x64,0x6F,0x63,0x61,0x2E,0x63,0x6F,0x6D,0x2F,0x54,0x72,0x75,0x73,0x74,0x65,0x64,
-0x43,0x65,0x72,0x74,0x69,0x66,0x69,0x63,0x61,0x74,0x65,0x53,0x65,0x72,0x76,0x69,
-0x63,0x65,0x73,0x2E,0x63,0x72,0x6C,0x30,0x3A,0xA0,0x38,0xA0,0x36,0x86,0x34,0x68,
-0x74,0x74,0x70,0x3A,0x2F,0x2F,0x63,0x72,0x6C,0x2E,0x63,0x6F,0x6D,0x6F,0x64,0x6F,
-0x2E,0x6E,0x65,0x74,0x2F,0x54,0x72,0x75,0x73,0x74,0x65,0x64,0x43,0x65,0x72,0x74,
-0x69,0x66,0x69,0x63,0x61,0x74,0x65,0x53,0x65,0x72,0x76,0x69,0x63,0x65,0x73,0x2E,
-0x63,0x72,0x6C,0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x05,
-0x05,0x00,0x03,0x82,0x01,0x01,0x00,0xC8,0x93,0x81,0x3B,0x89,0xB4,0xAF,0xB8,0x84,
-0x12,0x4C,0x8D,0xD2,0xF0,0xDB,0x70,0xBA,0x57,0x86,0x15,0x34,0x10,0xB9,0x2F,0x7F,
-0x1E,0xB0,0xA8,0x89,0x60,0xA1,0x8A,0xC2,0x77,0x0C,0x50,0x4A,0x9B,0x00,0x8B,0xD8,
-0x8B,0xF4,0x41,0xE2,0xD0,0x83,0x8A,0x4A,0x1C,0x14,0x06,0xB0,0xA3,0x68,0x05,0x70,
-0x31,0x30,0xA7,0x53,0x9B,0x0E,0xE9,0x4A,0xA0,0x58,0x69,0x67,0x0E,0xAE,0x9D,0xF6,
-0xA5,0x2C,0x41,0xBF,0x3C,0x06,0x6B,0xE4,0x59,0xCC,0x6D,0x10,0xF1,0x96,0x6F,0x1F,
-0xDF,0xF4,0x04,0x02,0xA4,0x9F,0x45,0x3E,0xC8,0xD8,0xFA,0x36,0x46,0x44,0x50,0x3F,
-0x82,0x97,0x91,0x1F,0x28,0xDB,0x18,0x11,0x8C,0x2A,0xE4,0x65,0x83,0x57,0x12,0x12,
-0x8C,0x17,0x3F,0x94,0x36,0xFE,0x5D,0xB0,0xC0,0x04,0x77,0x13,0xB8,0xF4,0x15,0xD5,
-0x3F,0x38,0xCC,0x94,0x3A,0x55,0xD0,0xAC,0x98,0xF5,0xBA,0x00,0x5F,0xE0,0x86,0x19,
-0x81,0x78,0x2F,0x28,0xC0,0x7E,0xD3,0xCC,0x42,0x0A,0xF5,0xAE,0x50,0xA0,0xD1,0x3E,
-0xC6,0xA1,0x71,0xEC,0x3F,0xA0,0x20,0x8C,0x66,0x3A,0x89,0xB4,0x8E,0xD4,0xD8,0xB1,
-0x4D,0x25,0x47,0xEE,0x2F,0x88,0xC8,0xB5,0xE1,0x05,0x45,0xC0,0xBE,0x14,0x71,0xDE,
-0x7A,0xFD,0x8E,0x7B,0x7D,0x4D,0x08,0x96,0xA5,0x12,0x73,0xF0,0x2D,0xCA,0x37,0x27,
-0x74,0x12,0x27,0x4C,0xCB,0xB6,0x97,0xE9,0xD9,0xAE,0x08,0x6D,0x5A,0x39,0x40,0xDD,
-0x05,0x47,0x75,0x6A,0x5A,0x21,0xB3,0xA3,0x18,0xCF,0x4E,0xF7,0x2E,0x57,0xB7,0x98,
-0x70,0x5E,0xC8,0xC4,0x78,0xB0,0x62,
-};
-
-
-/* subject:/C=US/O=Entrust, Inc./OU=www.entrust.net/CPS is incorporated by reference/OU=(c) 2006 Entrust, Inc./CN=Entrust Root Certification Authority */
-/* issuer :/C=US/O=Entrust, Inc./OU=www.entrust.net/CPS is incorporated by reference/OU=(c) 2006 Entrust, Inc./CN=Entrust Root Certification Authority */
-
-
-const unsigned char Entrust_Root_Certification_Authority_certificate[1173]={
-0x30,0x82,0x04,0x91,0x30,0x82,0x03,0x79,0xA0,0x03,0x02,0x01,0x02,0x02,0x04,0x45,
-0x6B,0x50,0x54,0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x05,
-0x05,0x00,0x30,0x81,0xB0,0x31,0x0B,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,
-0x55,0x53,0x31,0x16,0x30,0x14,0x06,0x03,0x55,0x04,0x0A,0x13,0x0D,0x45,0x6E,0x74,
-0x72,0x75,0x73,0x74,0x2C,0x20,0x49,0x6E,0x63,0x2E,0x31,0x39,0x30,0x37,0x06,0x03,
-0x55,0x04,0x0B,0x13,0x30,0x77,0x77,0x77,0x2E,0x65,0x6E,0x74,0x72,0x75,0x73,0x74,
-0x2E,0x6E,0x65,0x74,0x2F,0x43,0x50,0x53,0x20,0x69,0x73,0x20,0x69,0x6E,0x63,0x6F,
-0x72,0x70,0x6F,0x72,0x61,0x74,0x65,0x64,0x20,0x62,0x79,0x20,0x72,0x65,0x66,0x65,
-0x72,0x65,0x6E,0x63,0x65,0x31,0x1F,0x30,0x1D,0x06,0x03,0x55,0x04,0x0B,0x13,0x16,
-0x28,0x63,0x29,0x20,0x32,0x30,0x30,0x36,0x20,0x45,0x6E,0x74,0x72,0x75,0x73,0x74,
-0x2C,0x20,0x49,0x6E,0x63,0x2E,0x31,0x2D,0x30,0x2B,0x06,0x03,0x55,0x04,0x03,0x13,
-0x24,0x45,0x6E,0x74,0x72,0x75,0x73,0x74,0x20,0x52,0x6F,0x6F,0x74,0x20,0x43,0x65,
-0x72,0x74,0x69,0x66,0x69,0x63,0x61,0x74,0x69,0x6F,0x6E,0x20,0x41,0x75,0x74,0x68,
-0x6F,0x72,0x69,0x74,0x79,0x30,0x1E,0x17,0x0D,0x30,0x36,0x31,0x31,0x32,0x37,0x32,
-0x30,0x32,0x33,0x34,0x32,0x5A,0x17,0x0D,0x32,0x36,0x31,0x31,0x32,0x37,0x32,0x30,
-0x35,0x33,0x34,0x32,0x5A,0x30,0x81,0xB0,0x31,0x0B,0x30,0x09,0x06,0x03,0x55,0x04,
-0x06,0x13,0x02,0x55,0x53,0x31,0x16,0x30,0x14,0x06,0x03,0x55,0x04,0x0A,0x13,0x0D,
-0x45,0x6E,0x74,0x72,0x75,0x73,0x74,0x2C,0x20,0x49,0x6E,0x63,0x2E,0x31,0x39,0x30,
-0x37,0x06,0x03,0x55,0x04,0x0B,0x13,0x30,0x77,0x77,0x77,0x2E,0x65,0x6E,0x74,0x72,
-0x75,0x73,0x74,0x2E,0x6E,0x65,0x74,0x2F,0x43,0x50,0x53,0x20,0x69,0x73,0x20,0x69,
-0x6E,0x63,0x6F,0x72,0x70,0x6F,0x72,0x61,0x74,0x65,0x64,0x20,0x62,0x79,0x20,0x72,
-0x65,0x66,0x65,0x72,0x65,0x6E,0x63,0x65,0x31,0x1F,0x30,0x1D,0x06,0x03,0x55,0x04,
-0x0B,0x13,0x16,0x28,0x63,0x29,0x20,0x32,0x30,0x30,0x36,0x20,0x45,0x6E,0x74,0x72,
-0x75,0x73,0x74,0x2C,0x20,0x49,0x6E,0x63,0x2E,0x31,0x2D,0x30,0x2B,0x06,0x03,0x55,
-0x04,0x03,0x13,0x24,0x45,0x6E,0x74,0x72,0x75,0x73,0x74,0x20,0x52,0x6F,0x6F,0x74,
-0x20,0x43,0x65,0x72,0x74,0x69,0x66,0x69,0x63,0x61,0x74,0x69,0x6F,0x6E,0x20,0x41,
-0x75,0x74,0x68,0x6F,0x72,0x69,0x74,0x79,0x30,0x82,0x01,0x22,0x30,0x0D,0x06,0x09,
-0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x01,0x05,0x00,0x03,0x82,0x01,0x0F,0x00,
-0x30,0x82,0x01,0x0A,0x02,0x82,0x01,0x01,0x00,0xB6,0x95,0xB6,0x43,0x42,0xFA,0xC6,
-0x6D,0x2A,0x6F,0x48,0xDF,0x94,0x4C,0x39,0x57,0x05,0xEE,0xC3,0x79,0x11,0x41,0x68,
-0x36,0xED,0xEC,0xFE,0x9A,0x01,0x8F,0xA1,0x38,0x28,0xFC,0xF7,0x10,0x46,0x66,0x2E,
-0x4D,0x1E,0x1A,0xB1,0x1A,0x4E,0xC6,0xD1,0xC0,0x95,0x88,0xB0,0xC9,0xFF,0x31,0x8B,
-0x33,0x03,0xDB,0xB7,0x83,0x7B,0x3E,0x20,0x84,0x5E,0xED,0xB2,0x56,0x28,0xA7,0xF8,
-0xE0,0xB9,0x40,0x71,0x37,0xC5,0xCB,0x47,0x0E,0x97,0x2A,0x68,0xC0,0x22,0x95,0x62,
-0x15,0xDB,0x47,0xD9,0xF5,0xD0,0x2B,0xFF,0x82,0x4B,0xC9,0xAD,0x3E,0xDE,0x4C,0xDB,
-0x90,0x80,0x50,0x3F,0x09,0x8A,0x84,0x00,0xEC,0x30,0x0A,0x3D,0x18,0xCD,0xFB,0xFD,
-0x2A,0x59,0x9A,0x23,0x95,0x17,0x2C,0x45,0x9E,0x1F,0x6E,0x43,0x79,0x6D,0x0C,0x5C,
-0x98,0xFE,0x48,0xA7,0xC5,0x23,0x47,0x5C,0x5E,0xFD,0x6E,0xE7,0x1E,0xB4,0xF6,0x68,
-0x45,0xD1,0x86,0x83,0x5B,0xA2,0x8A,0x8D,0xB1,0xE3,0x29,0x80,0xFE,0x25,0x71,0x88,
-0xAD,0xBE,0xBC,0x8F,0xAC,0x52,0x96,0x4B,0xAA,0x51,0x8D,0xE4,0x13,0x31,0x19,0xE8,
-0x4E,0x4D,0x9F,0xDB,0xAC,0xB3,0x6A,0xD5,0xBC,0x39,0x54,0x71,0xCA,0x7A,0x7A,0x7F,
-0x90,0xDD,0x7D,0x1D,0x80,0xD9,0x81,0xBB,0x59,0x26,0xC2,0x11,0xFE,0xE6,0x93,0xE2,
-0xF7,0x80,0xE4,0x65,0xFB,0x34,0x37,0x0E,0x29,0x80,0x70,0x4D,0xAF,0x38,0x86,0x2E,
-0x9E,0x7F,0x57,0xAF,0x9E,0x17,0xAE,0xEB,0x1C,0xCB,0x28,0x21,0x5F,0xB6,0x1C,0xD8,
-0xE7,0xA2,0x04,0x22,0xF9,0xD3,0xDA,0xD8,0xCB,0x02,0x03,0x01,0x00,0x01,0xA3,0x81,
-0xB0,0x30,0x81,0xAD,0x30,0x0E,0x06,0x03,0x55,0x1D,0x0F,0x01,0x01,0xFF,0x04,0x04,
-0x03,0x02,0x01,0x06,0x30,0x0F,0x06,0x03,0x55,0x1D,0x13,0x01,0x01,0xFF,0x04,0x05,
-0x30,0x03,0x01,0x01,0xFF,0x30,0x2B,0x06,0x03,0x55,0x1D,0x10,0x04,0x24,0x30,0x22,
-0x80,0x0F,0x32,0x30,0x30,0x36,0x31,0x31,0x32,0x37,0x32,0x30,0x32,0x33,0x34,0x32,
-0x5A,0x81,0x0F,0x32,0x30,0x32,0x36,0x31,0x31,0x32,0x37,0x32,0x30,0x35,0x33,0x34,
-0x32,0x5A,0x30,0x1F,0x06,0x03,0x55,0x1D,0x23,0x04,0x18,0x30,0x16,0x80,0x14,0x68,
-0x90,0xE4,0x67,0xA4,0xA6,0x53,0x80,0xC7,0x86,0x66,0xA4,0xF1,0xF7,0x4B,0x43,0xFB,
-0x84,0xBD,0x6D,0x30,0x1D,0x06,0x03,0x55,0x1D,0x0E,0x04,0x16,0x04,0x14,0x68,0x90,
-0xE4,0x67,0xA4,0xA6,0x53,0x80,0xC7,0x86,0x66,0xA4,0xF1,0xF7,0x4B,0x43,0xFB,0x84,
-0xBD,0x6D,0x30,0x1D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF6,0x7D,0x07,0x41,0x00,0x04,
-0x10,0x30,0x0E,0x1B,0x08,0x56,0x37,0x2E,0x31,0x3A,0x34,0x2E,0x30,0x03,0x02,0x04,
-0x90,0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x05,0x05,0x00,
-0x03,0x82,0x01,0x01,0x00,0x93,0xD4,0x30,0xB0,0xD7,0x03,0x20,0x2A,0xD0,0xF9,0x63,
-0xE8,0x91,0x0C,0x05,0x20,0xA9,0x5F,0x19,0xCA,0x7B,0x72,0x4E,0xD4,0xB1,0xDB,0xD0,
-0x96,0xFB,0x54,0x5A,0x19,0x2C,0x0C,0x08,0xF7,0xB2,0xBC,0x85,0xA8,0x9D,0x7F,0x6D,
-0x3B,0x52,0xB3,0x2A,0xDB,0xE7,0xD4,0x84,0x8C,0x63,0xF6,0x0F,0xCB,0x26,0x01,0x91,
-0x50,0x6C,0xF4,0x5F,0x14,0xE2,0x93,0x74,0xC0,0x13,0x9E,0x30,0x3A,0x50,0xE3,0xB4,
-0x60,0xC5,0x1C,0xF0,0x22,0x44,0x8D,0x71,0x47,0xAC,0xC8,0x1A,0xC9,0xE9,0x9B,0x9A,
-0x00,0x60,0x13,0xFF,0x70,0x7E,0x5F,0x11,0x4D,0x49,0x1B,0xB3,0x15,0x52,0x7B,0xC9,
-0x54,0xDA,0xBF,0x9D,0x95,0xAF,0x6B,0x9A,0xD8,0x9E,0xE9,0xF1,0xE4,0x43,0x8D,0xE2,
-0x11,0x44,0x3A,0xBF,0xAF,0xBD,0x83,0x42,0x73,0x52,0x8B,0xAA,0xBB,0xA7,0x29,0xCF,
-0xF5,0x64,0x1C,0x0A,0x4D,0xD1,0xBC,0xAA,0xAC,0x9F,0x2A,0xD0,0xFF,0x7F,0x7F,0xDA,
-0x7D,0xEA,0xB1,0xED,0x30,0x25,0xC1,0x84,0xDA,0x34,0xD2,0x5B,0x78,0x83,0x56,0xEC,
-0x9C,0x36,0xC3,0x26,0xE2,0x11,0xF6,0x67,0x49,0x1D,0x92,0xAB,0x8C,0xFB,0xEB,0xFF,
-0x7A,0xEE,0x85,0x4A,0xA7,0x50,0x80,0xF0,0xA7,0x5C,0x4A,0x94,0x2E,0x5F,0x05,0x99,
-0x3C,0x52,0x41,0xE0,0xCD,0xB4,0x63,0xCF,0x01,0x43,0xBA,0x9C,0x83,0xDC,0x8F,0x60,
-0x3B,0xF3,0x5A,0xB4,0xB4,0x7B,0xAE,0xDA,0x0B,0x90,0x38,0x75,0xEF,0x81,0x1D,0x66,
-0xD2,0xF7,0x57,0x70,0x36,0xB3,0xBF,0xFC,0x28,0xAF,0x71,0x25,0x85,0x5B,0x13,0xFE,
-0x1E,0x7F,0x5A,0xB4,0x3C,
-};
-
-
-/* subject:/C=DE/O=TC TrustCenter GmbH/OU=TC TrustCenter Class 2 CA/CN=TC TrustCenter Class 2 CA II */
-/* issuer :/C=DE/O=TC TrustCenter GmbH/OU=TC TrustCenter Class 2 CA/CN=TC TrustCenter Class 2 CA II */
-
-
-const unsigned char TC_TrustCenter_Class_2_CA_II_certificate[1198]={
-0x30,0x82,0x04,0xAA,0x30,0x82,0x03,0x92,0xA0,0x03,0x02,0x01,0x02,0x02,0x0E,0x2E,
-0x6A,0x00,0x01,0x00,0x02,0x1F,0xD7,0x52,0x21,0x2C,0x11,0x5C,0x3B,0x30,0x0D,0x06,
-0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x05,0x05,0x00,0x30,0x76,0x31,0x0B,
-0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x44,0x45,0x31,0x1C,0x30,0x1A,0x06,
-0x03,0x55,0x04,0x0A,0x13,0x13,0x54,0x43,0x20,0x54,0x72,0x75,0x73,0x74,0x43,0x65,
-0x6E,0x74,0x65,0x72,0x20,0x47,0x6D,0x62,0x48,0x31,0x22,0x30,0x20,0x06,0x03,0x55,
-0x04,0x0B,0x13,0x19,0x54,0x43,0x20,0x54,0x72,0x75,0x73,0x74,0x43,0x65,0x6E,0x74,
-0x65,0x72,0x20,0x43,0x6C,0x61,0x73,0x73,0x20,0x32,0x20,0x43,0x41,0x31,0x25,0x30,
-0x23,0x06,0x03,0x55,0x04,0x03,0x13,0x1C,0x54,0x43,0x20,0x54,0x72,0x75,0x73,0x74,
-0x43,0x65,0x6E,0x74,0x65,0x72,0x20,0x43,0x6C,0x61,0x73,0x73,0x20,0x32,0x20,0x43,
-0x41,0x20,0x49,0x49,0x30,0x1E,0x17,0x0D,0x30,0x36,0x30,0x31,0x31,0x32,0x31,0x34,
-0x33,0x38,0x34,0x33,0x5A,0x17,0x0D,0x32,0x35,0x31,0x32,0x33,0x31,0x32,0x32,0x35,
-0x39,0x35,0x39,0x5A,0x30,0x76,0x31,0x0B,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,
-0x02,0x44,0x45,0x31,0x1C,0x30,0x1A,0x06,0x03,0x55,0x04,0x0A,0x13,0x13,0x54,0x43,
-0x20,0x54,0x72,0x75,0x73,0x74,0x43,0x65,0x6E,0x74,0x65,0x72,0x20,0x47,0x6D,0x62,
-0x48,0x31,0x22,0x30,0x20,0x06,0x03,0x55,0x04,0x0B,0x13,0x19,0x54,0x43,0x20,0x54,
-0x72,0x75,0x73,0x74,0x43,0x65,0x6E,0x74,0x65,0x72,0x20,0x43,0x6C,0x61,0x73,0x73,
-0x20,0x32,0x20,0x43,0x41,0x31,0x25,0x30,0x23,0x06,0x03,0x55,0x04,0x03,0x13,0x1C,
-0x54,0x43,0x20,0x54,0x72,0x75,0x73,0x74,0x43,0x65,0x6E,0x74,0x65,0x72,0x20,0x43,
-0x6C,0x61,0x73,0x73,0x20,0x32,0x20,0x43,0x41,0x20,0x49,0x49,0x30,0x82,0x01,0x22,
-0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x01,0x05,0x00,0x03,
-0x82,0x01,0x0F,0x00,0x30,0x82,0x01,0x0A,0x02,0x82,0x01,0x01,0x00,0xAB,0x80,0x87,
-0x9B,0x8E,0xF0,0xC3,0x7C,0x87,0xD7,0xE8,0x24,0x82,0x11,0xB3,0x3C,0xDD,0x43,0x62,
-0xEE,0xF8,0xC3,0x45,0xDA,0xE8,0xE1,0xA0,0x5F,0xD1,0x2A,0xB2,0xEA,0x93,0x68,0xDF,
-0xB4,0xC8,0xD6,0x43,0xE9,0xC4,0x75,0x59,0x7F,0xFC,0xE1,0x1D,0xF8,0x31,0x70,0x23,
-0x1B,0x88,0x9E,0x27,0xB9,0x7B,0xFD,0x3A,0xD2,0xC9,0xA9,0xE9,0x14,0x2F,0x90,0xBE,
-0x03,0x52,0xC1,0x49,0xCD,0xF6,0xFD,0xE4,0x08,0x66,0x0B,0x57,0x8A,0xA2,0x42,0xA0,
-0xB8,0xD5,0x7F,0x69,0x5C,0x90,0x32,0xB2,0x97,0x0D,0xCA,0x4A,0xDC,0x46,0x3E,0x02,
-0x55,0x89,0x53,0xE3,0x1A,0x5A,0xCB,0x36,0xC6,0x07,0x56,0xF7,0x8C,0xCF,0x11,0xF4,
-0x4C,0xBB,0x30,0x70,0x04,0x95,0xA5,0xF6,0x39,0x8C,0xFD,0x73,0x81,0x08,0x7D,0x89,
-0x5E,0x32,0x1E,0x22,0xA9,0x22,0x45,0x4B,0xB0,0x66,0x2E,0x30,0xCC,0x9F,0x65,0xFD,
-0xFC,0xCB,0x81,0xA9,0xF1,0xE0,0x3B,0xAF,0xA3,0x86,0xD1,0x89,0xEA,0xC4,0x45,0x79,
-0x50,0x5D,0xAE,0xE9,0x21,0x74,0x92,0x4D,0x8B,0x59,0x82,0x8F,0x94,0xE3,0xE9,0x4A,
-0xF1,0xE7,0x49,0xB0,0x14,0xE3,0xF5,0x62,0xCB,0xD5,0x72,0xBD,0x1F,0xB9,0xD2,0x9F,
-0xA0,0xCD,0xA8,0xFA,0x01,0xC8,0xD9,0x0D,0xDF,0xDA,0xFC,0x47,0x9D,0xB3,0xC8,0x54,
-0xDF,0x49,0x4A,0xF1,0x21,0xA9,0xFE,0x18,0x4E,0xEE,0x48,0xD4,0x19,0xBB,0xEF,0x7D,
-0xE4,0xE2,0x9D,0xCB,0x5B,0xB6,0x6E,0xFF,0xE3,0xCD,0x5A,0xE7,0x74,0x82,0x05,0xBA,
-0x80,0x25,0x38,0xCB,0xE4,0x69,0x9E,0xAF,0x41,0xAA,0x1A,0x84,0xF5,0x02,0x03,0x01,
-0x00,0x01,0xA3,0x82,0x01,0x34,0x30,0x82,0x01,0x30,0x30,0x0F,0x06,0x03,0x55,0x1D,
-0x13,0x01,0x01,0xFF,0x04,0x05,0x30,0x03,0x01,0x01,0xFF,0x30,0x0E,0x06,0x03,0x55,
-0x1D,0x0F,0x01,0x01,0xFF,0x04,0x04,0x03,0x02,0x01,0x06,0x30,0x1D,0x06,0x03,0x55,
-0x1D,0x0E,0x04,0x16,0x04,0x14,0xE3,0xAB,0x54,0x4C,0x80,0xA1,0xDB,0x56,0x43,0xB7,
-0x91,0x4A,0xCB,0xF3,0x82,0x7A,0x13,0x5C,0x08,0xAB,0x30,0x81,0xED,0x06,0x03,0x55,
-0x1D,0x1F,0x04,0x81,0xE5,0x30,0x81,0xE2,0x30,0x81,0xDF,0xA0,0x81,0xDC,0xA0,0x81,
-0xD9,0x86,0x35,0x68,0x74,0x74,0x70,0x3A,0x2F,0x2F,0x77,0x77,0x77,0x2E,0x74,0x72,
-0x75,0x73,0x74,0x63,0x65,0x6E,0x74,0x65,0x72,0x2E,0x64,0x65,0x2F,0x63,0x72,0x6C,
-0x2F,0x76,0x32,0x2F,0x74,0x63,0x5F,0x63,0x6C,0x61,0x73,0x73,0x5F,0x32,0x5F,0x63,
-0x61,0x5F,0x49,0x49,0x2E,0x63,0x72,0x6C,0x86,0x81,0x9F,0x6C,0x64,0x61,0x70,0x3A,
-0x2F,0x2F,0x77,0x77,0x77,0x2E,0x74,0x72,0x75,0x73,0x74,0x63,0x65,0x6E,0x74,0x65,
-0x72,0x2E,0x64,0x65,0x2F,0x43,0x4E,0x3D,0x54,0x43,0x25,0x32,0x30,0x54,0x72,0x75,
-0x73,0x74,0x43,0x65,0x6E,0x74,0x65,0x72,0x25,0x32,0x30,0x43,0x6C,0x61,0x73,0x73,
-0x25,0x32,0x30,0x32,0x25,0x32,0x30,0x43,0x41,0x25,0x32,0x30,0x49,0x49,0x2C,0x4F,
-0x3D,0x54,0x43,0x25,0x32,0x30,0x54,0x72,0x75,0x73,0x74,0x43,0x65,0x6E,0x74,0x65,
-0x72,0x25,0x32,0x30,0x47,0x6D,0x62,0x48,0x2C,0x4F,0x55,0x3D,0x72,0x6F,0x6F,0x74,
-0x63,0x65,0x72,0x74,0x73,0x2C,0x44,0x43,0x3D,0x74,0x72,0x75,0x73,0x74,0x63,0x65,
-0x6E,0x74,0x65,0x72,0x2C,0x44,0x43,0x3D,0x64,0x65,0x3F,0x63,0x65,0x72,0x74,0x69,
-0x66,0x69,0x63,0x61,0x74,0x65,0x52,0x65,0x76,0x6F,0x63,0x61,0x74,0x69,0x6F,0x6E,
-0x4C,0x69,0x73,0x74,0x3F,0x62,0x61,0x73,0x65,0x3F,0x30,0x0D,0x06,0x09,0x2A,0x86,
-0x48,0x86,0xF7,0x0D,0x01,0x01,0x05,0x05,0x00,0x03,0x82,0x01,0x01,0x00,0x8C,0xD7,
-0xDF,0x7E,0xEE,0x1B,0x80,0x10,0xB3,0x83,0xF5,0xDB,0x11,0xEA,0x6B,0x4B,0xA8,0x92,
-0x18,0xD9,0xF7,0x07,0x39,0xF5,0x2C,0xBE,0x06,0x75,0x7A,0x68,0x53,0x15,0x1C,0xEA,
-0x4A,0xED,0x5E,0xFC,0x23,0xB2,0x13,0xA0,0xD3,0x09,0xFF,0xF6,0xF6,0x2E,0x6B,0x41,
-0x71,0x79,0xCD,0xE2,0x6D,0xFD,0xAE,0x59,0x6B,0x85,0x1D,0xB8,0x4E,0x22,0x9A,0xED,
-0x66,0x39,0x6E,0x4B,0x94,0xE6,0x55,0xFC,0x0B,0x1B,0x8B,0x77,0xC1,0x53,0x13,0x66,
-0x89,0xD9,0x28,0xD6,0x8B,0xF3,0x45,0x4A,0x63,0xB7,0xFD,0x7B,0x0B,0x61,0x5D,0xB8,
-0x6D,0xBE,0xC3,0xDC,0x5B,0x79,0xD2,0xED,0x86,0xE5,0xA2,0x4D,0xBE,0x5E,0x74,0x7C,
-0x6A,0xED,0x16,0x38,0x1F,0x7F,0x58,0x81,0x5A,0x1A,0xEB,0x32,0x88,0x2D,0xB2,0xF3,
-0x39,0x77,0x80,0xAF,0x5E,0xB6,0x61,0x75,0x29,0xDB,0x23,0x4D,0x88,0xCA,0x50,0x28,
-0xCB,0x85,0xD2,0xD3,0x10,0xA2,0x59,0x6E,0xD3,0x93,0x54,0x00,0x7A,0xA2,0x46,0x95,
-0x86,0x05,0x9C,0xA9,0x19,0x98,0xE5,0x31,0x72,0x0C,0x00,0xE2,0x67,0xD9,0x40,0xE0,
-0x24,0x33,0x7B,0x6F,0x2C,0xB9,0x5C,0xAB,0x65,0x9D,0x2C,0xAC,0x76,0xEA,0x35,0x99,
-0xF5,0x97,0xB9,0x0F,0x24,0xEC,0xC7,0x76,0x21,0x28,0x65,0xAE,0x57,0xE8,0x07,0x88,
-0x75,0x4A,0x56,0xA0,0xD2,0x05,0x3A,0xA4,0xE6,0x8D,0x92,0x88,0x2C,0xF3,0xF2,0xE1,
-0xC1,0xC6,0x61,0xDB,0x41,0xC5,0xC7,0x9B,0xF7,0x0E,0x1A,0x51,0x45,0xC2,0x61,0x6B,
-0xDC,0x64,0x27,0x17,0x8C,0x5A,0xB7,0xDA,0x74,0x28,0xCD,0x97,0xE4,0xBD,
-};
-
-
-/* subject:/O=Cybertrust, Inc/CN=Cybertrust Global Root */
-/* issuer :/O=Cybertrust, Inc/CN=Cybertrust Global Root */
-
-
-const unsigned char Cybertrust_Global_Root_certificate[933]={
-0x30,0x82,0x03,0xA1,0x30,0x82,0x02,0x89,0xA0,0x03,0x02,0x01,0x02,0x02,0x0B,0x04,
-0x00,0x00,0x00,0x00,0x01,0x0F,0x85,0xAA,0x2D,0x48,0x30,0x0D,0x06,0x09,0x2A,0x86,
-0x48,0x86,0xF7,0x0D,0x01,0x01,0x05,0x05,0x00,0x30,0x3B,0x31,0x18,0x30,0x16,0x06,
-0x03,0x55,0x04,0x0A,0x13,0x0F,0x43,0x79,0x62,0x65,0x72,0x74,0x72,0x75,0x73,0x74,
-0x2C,0x20,0x49,0x6E,0x63,0x31,0x1F,0x30,0x1D,0x06,0x03,0x55,0x04,0x03,0x13,0x16,
-0x43,0x79,0x62,0x65,0x72,0x74,0x72,0x75,0x73,0x74,0x20,0x47,0x6C,0x6F,0x62,0x61,
-0x6C,0x20,0x52,0x6F,0x6F,0x74,0x30,0x1E,0x17,0x0D,0x30,0x36,0x31,0x32,0x31,0x35,
-0x30,0x38,0x30,0x30,0x30,0x30,0x5A,0x17,0x0D,0x32,0x31,0x31,0x32,0x31,0x35,0x30,
-0x38,0x30,0x30,0x30,0x30,0x5A,0x30,0x3B,0x31,0x18,0x30,0x16,0x06,0x03,0x55,0x04,
-0x0A,0x13,0x0F,0x43,0x79,0x62,0x65,0x72,0x74,0x72,0x75,0x73,0x74,0x2C,0x20,0x49,
-0x6E,0x63,0x31,0x1F,0x30,0x1D,0x06,0x03,0x55,0x04,0x03,0x13,0x16,0x43,0x79,0x62,
-0x65,0x72,0x74,0x72,0x75,0x73,0x74,0x20,0x47,0x6C,0x6F,0x62,0x61,0x6C,0x20,0x52,
-0x6F,0x6F,0x74,0x30,0x82,0x01,0x22,0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,
-0x0D,0x01,0x01,0x01,0x05,0x00,0x03,0x82,0x01,0x0F,0x00,0x30,0x82,0x01,0x0A,0x02,
-0x82,0x01,0x01,0x00,0xF8,0xC8,0xBC,0xBD,0x14,0x50,0x66,0x13,0xFF,0xF0,0xD3,0x79,
-0xEC,0x23,0xF2,0xB7,0x1A,0xC7,0x8E,0x85,0xF1,0x12,0x73,0xA6,0x19,0xAA,0x10,0xDB,
-0x9C,0xA2,0x65,0x74,0x5A,0x77,0x3E,0x51,0x7D,0x56,0xF6,0xDC,0x23,0xB6,0xD4,0xED,
-0x5F,0x58,0xB1,0x37,0x4D,0xD5,0x49,0x0E,0x6E,0xF5,0x6A,0x87,0xD6,0xD2,0x8C,0xD2,
-0x27,0xC6,0xE2,0xFF,0x36,0x9F,0x98,0x65,0xA0,0x13,0x4E,0xC6,0x2A,0x64,0x9B,0xD5,
-0x90,0x12,0xCF,0x14,0x06,0xF4,0x3B,0xE3,0xD4,0x28,0xBE,0xE8,0x0E,0xF8,0xAB,0x4E,
-0x48,0x94,0x6D,0x8E,0x95,0x31,0x10,0x5C,0xED,0xA2,0x2D,0xBD,0xD5,0x3A,0x6D,0xB2,
-0x1C,0xBB,0x60,0xC0,0x46,0x4B,0x01,0xF5,0x49,0xAE,0x7E,0x46,0x8A,0xD0,0x74,0x8D,
-0xA1,0x0C,0x02,0xCE,0xEE,0xFC,0xE7,0x8F,0xB8,0x6B,0x66,0xF3,0x7F,0x44,0x00,0xBF,
-0x66,0x25,0x14,0x2B,0xDD,0x10,0x30,0x1D,0x07,0x96,0x3F,0x4D,0xF6,0x6B,0xB8,0x8F,
-0xB7,0x7B,0x0C,0xA5,0x38,0xEB,0xDE,0x47,0xDB,0xD5,0x5D,0x39,0xFC,0x88,0xA7,0xF3,
-0xD7,0x2A,0x74,0xF1,0xE8,0x5A,0xA2,0x3B,0x9F,0x50,0xBA,0xA6,0x8C,0x45,0x35,0xC2,
-0x50,0x65,0x95,0xDC,0x63,0x82,0xEF,0xDD,0xBF,0x77,0x4D,0x9C,0x62,0xC9,0x63,0x73,
-0x16,0xD0,0x29,0x0F,0x49,0xA9,0x48,0xF0,0xB3,0xAA,0xB7,0x6C,0xC5,0xA7,0x30,0x39,
-0x40,0x5D,0xAE,0xC4,0xE2,0x5D,0x26,0x53,0xF0,0xCE,0x1C,0x23,0x08,0x61,0xA8,0x94,
-0x19,0xBA,0x04,0x62,0x40,0xEC,0x1F,0x38,0x70,0x77,0x12,0x06,0x71,0xA7,0x30,0x18,
-0x5D,0x25,0x27,0xA5,0x02,0x03,0x01,0x00,0x01,0xA3,0x81,0xA5,0x30,0x81,0xA2,0x30,
-0x0E,0x06,0x03,0x55,0x1D,0x0F,0x01,0x01,0xFF,0x04,0x04,0x03,0x02,0x01,0x06,0x30,
-0x0F,0x06,0x03,0x55,0x1D,0x13,0x01,0x01,0xFF,0x04,0x05,0x30,0x03,0x01,0x01,0xFF,
-0x30,0x1D,0x06,0x03,0x55,0x1D,0x0E,0x04,0x16,0x04,0x14,0xB6,0x08,0x7B,0x0D,0x7A,
-0xCC,0xAC,0x20,0x4C,0x86,0x56,0x32,0x5E,0xCF,0xAB,0x6E,0x85,0x2D,0x70,0x57,0x30,
-0x3F,0x06,0x03,0x55,0x1D,0x1F,0x04,0x38,0x30,0x36,0x30,0x34,0xA0,0x32,0xA0,0x30,
-0x86,0x2E,0x68,0x74,0x74,0x70,0x3A,0x2F,0x2F,0x77,0x77,0x77,0x32,0x2E,0x70,0x75,
-0x62,0x6C,0x69,0x63,0x2D,0x74,0x72,0x75,0x73,0x74,0x2E,0x63,0x6F,0x6D,0x2F,0x63,
-0x72,0x6C,0x2F,0x63,0x74,0x2F,0x63,0x74,0x72,0x6F,0x6F,0x74,0x2E,0x63,0x72,0x6C,
-0x30,0x1F,0x06,0x03,0x55,0x1D,0x23,0x04,0x18,0x30,0x16,0x80,0x14,0xB6,0x08,0x7B,
-0x0D,0x7A,0xCC,0xAC,0x20,0x4C,0x86,0x56,0x32,0x5E,0xCF,0xAB,0x6E,0x85,0x2D,0x70,
-0x57,0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x05,0x05,0x00,
-0x03,0x82,0x01,0x01,0x00,0x56,0xEF,0x0A,0x23,0xA0,0x54,0x4E,0x95,0x97,0xC9,0xF8,
-0x89,0xDA,0x45,0xC1,0xD4,0xA3,0x00,0x25,0xF4,0x1F,0x13,0xAB,0xB7,0xA3,0x85,0x58,
-0x69,0xC2,0x30,0xAD,0xD8,0x15,0x8A,0x2D,0xE3,0xC9,0xCD,0x81,0x5A,0xF8,0x73,0x23,
-0x5A,0xA7,0x7C,0x05,0xF3,0xFD,0x22,0x3B,0x0E,0xD1,0x06,0xC4,0xDB,0x36,0x4C,0x73,
-0x04,0x8E,0xE5,0xB0,0x22,0xE4,0xC5,0xF3,0x2E,0xA5,0xD9,0x23,0xE3,0xB8,0x4E,0x4A,
-0x20,0xA7,0x6E,0x02,0x24,0x9F,0x22,0x60,0x67,0x7B,0x8B,0x1D,0x72,0x09,0xC5,0x31,
-0x5C,0xE9,0x79,0x9F,0x80,0x47,0x3D,0xAD,0xA1,0x0B,0x07,0x14,0x3D,0x47,0xFF,0x03,
-0x69,0x1A,0x0C,0x0B,0x44,0xE7,0x63,0x25,0xA7,0x7F,0xB2,0xC9,0xB8,0x76,0x84,0xED,
-0x23,0xF6,0x7D,0x07,0xAB,0x45,0x7E,0xD3,0xDF,0xB3,0xBF,0xE9,0x8A,0xB6,0xCD,0xA8,
-0xA2,0x67,0x2B,0x52,0xD5,0xB7,0x65,0xF0,0x39,0x4C,0x63,0xA0,0x91,0x79,0x93,0x52,
-0x0F,0x54,0xDD,0x83,0xBB,0x9F,0xD1,0x8F,0xA7,0x53,0x73,0xC3,0xCB,0xFF,0x30,0xEC,
-0x7C,0x04,0xB8,0xD8,0x44,0x1F,0x93,0x5F,0x71,0x09,0x22,0xB7,0x6E,0x3E,0xEA,0x1C,
-0x03,0x4E,0x9D,0x1A,0x20,0x61,0xFB,0x81,0x37,0xEC,0x5E,0xFC,0x0A,0x45,0xAB,0xD7,
-0xE7,0x17,0x55,0xD0,0xA0,0xEA,0x60,0x9B,0xA6,0xF6,0xE3,0x8C,0x5B,0x29,0xC2,0x06,
-0x60,0x14,0x9D,0x2D,0x97,0x4C,0xA9,0x93,0x15,0x9D,0x61,0xC4,0x01,0x5F,0x48,0xD6,
-0x58,0xBD,0x56,0x31,0x12,0x4E,0x11,0xC8,0x21,0xE0,0xB3,0x11,0x91,0x65,0xDB,0xB4,
-0xA6,0x88,0x38,0xCE,0x55,
-};
-
-
-/* subject:/C=US/O=Entrust, Inc./OU=See www.entrust.net/legal-terms/OU=(c) 2012 Entrust, Inc. - for authorized use only/CN=Entrust Root Certification Authority - EC1 */
-/* issuer :/C=US/O=Entrust, Inc./OU=See www.entrust.net/legal-terms/OU=(c) 2012 Entrust, Inc. - for authorized use only/CN=Entrust Root Certification Authority - EC1 */
-
-
-const unsigned char Entrust_Root_Certification_Authority___EC1_certificate[765]={
-0x30,0x82,0x02,0xF9,0x30,0x82,0x02,0x80,0xA0,0x03,0x02,0x01,0x02,0x02,0x0D,0x00,
-0xA6,0x8B,0x79,0x29,0x00,0x00,0x00,0x00,0x50,0xD0,0x91,0xF9,0x30,0x0A,0x06,0x08,
-0x2A,0x86,0x48,0xCE,0x3D,0x04,0x03,0x03,0x30,0x81,0xBF,0x31,0x0B,0x30,0x09,0x06,
-0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x16,0x30,0x14,0x06,0x03,0x55,0x04,
-0x0A,0x13,0x0D,0x45,0x6E,0x74,0x72,0x75,0x73,0x74,0x2C,0x20,0x49,0x6E,0x63,0x2E,
-0x31,0x28,0x30,0x26,0x06,0x03,0x55,0x04,0x0B,0x13,0x1F,0x53,0x65,0x65,0x20,0x77,
-0x77,0x77,0x2E,0x65,0x6E,0x74,0x72,0x75,0x73,0x74,0x2E,0x6E,0x65,0x74,0x2F,0x6C,
-0x65,0x67,0x61,0x6C,0x2D,0x74,0x65,0x72,0x6D,0x73,0x31,0x39,0x30,0x37,0x06,0x03,
-0x55,0x04,0x0B,0x13,0x30,0x28,0x63,0x29,0x20,0x32,0x30,0x31,0x32,0x20,0x45,0x6E,
-0x74,0x72,0x75,0x73,0x74,0x2C,0x20,0x49,0x6E,0x63,0x2E,0x20,0x2D,0x20,0x66,0x6F,
-0x72,0x20,0x61,0x75,0x74,0x68,0x6F,0x72,0x69,0x7A,0x65,0x64,0x20,0x75,0x73,0x65,
-0x20,0x6F,0x6E,0x6C,0x79,0x31,0x33,0x30,0x31,0x06,0x03,0x55,0x04,0x03,0x13,0x2A,
-0x45,0x6E,0x74,0x72,0x75,0x73,0x74,0x20,0x52,0x6F,0x6F,0x74,0x20,0x43,0x65,0x72,
-0x74,0x69,0x66,0x69,0x63,0x61,0x74,0x69,0x6F,0x6E,0x20,0x41,0x75,0x74,0x68,0x6F,
-0x72,0x69,0x74,0x79,0x20,0x2D,0x20,0x45,0x43,0x31,0x30,0x1E,0x17,0x0D,0x31,0x32,
-0x31,0x32,0x31,0x38,0x31,0x35,0x32,0x35,0x33,0x36,0x5A,0x17,0x0D,0x33,0x37,0x31,
-0x32,0x31,0x38,0x31,0x35,0x35,0x35,0x33,0x36,0x5A,0x30,0x81,0xBF,0x31,0x0B,0x30,
-0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x16,0x30,0x14,0x06,0x03,
-0x55,0x04,0x0A,0x13,0x0D,0x45,0x6E,0x74,0x72,0x75,0x73,0x74,0x2C,0x20,0x49,0x6E,
-0x63,0x2E,0x31,0x28,0x30,0x26,0x06,0x03,0x55,0x04,0x0B,0x13,0x1F,0x53,0x65,0x65,
-0x20,0x77,0x77,0x77,0x2E,0x65,0x6E,0x74,0x72,0x75,0x73,0x74,0x2E,0x6E,0x65,0x74,
-0x2F,0x6C,0x65,0x67,0x61,0x6C,0x2D,0x74,0x65,0x72,0x6D,0x73,0x31,0x39,0x30,0x37,
-0x06,0x03,0x55,0x04,0x0B,0x13,0x30,0x28,0x63,0x29,0x20,0x32,0x30,0x31,0x32,0x20,
-0x45,0x6E,0x74,0x72,0x75,0x73,0x74,0x2C,0x20,0x49,0x6E,0x63,0x2E,0x20,0x2D,0x20,
-0x66,0x6F,0x72,0x20,0x61,0x75,0x74,0x68,0x6F,0x72,0x69,0x7A,0x65,0x64,0x20,0x75,
-0x73,0x65,0x20,0x6F,0x6E,0x6C,0x79,0x31,0x33,0x30,0x31,0x06,0x03,0x55,0x04,0x03,
-0x13,0x2A,0x45,0x6E,0x74,0x72,0x75,0x73,0x74,0x20,0x52,0x6F,0x6F,0x74,0x20,0x43,
-0x65,0x72,0x74,0x69,0x66,0x69,0x63,0x61,0x74,0x69,0x6F,0x6E,0x20,0x41,0x75,0x74,
-0x68,0x6F,0x72,0x69,0x74,0x79,0x20,0x2D,0x20,0x45,0x43,0x31,0x30,0x76,0x30,0x10,
-0x06,0x07,0x2A,0x86,0x48,0xCE,0x3D,0x02,0x01,0x06,0x05,0x2B,0x81,0x04,0x00,0x22,
-0x03,0x62,0x00,0x04,0x84,0x13,0xC9,0xD0,0xBA,0x6D,0x41,0x7B,0xE2,0x6C,0xD0,0xEB,
-0x55,0x5F,0x66,0x02,0x1A,0x24,0xF4,0x5B,0x89,0x69,0x47,0xE3,0xB8,0xC2,0x7D,0xF1,
-0xF2,0x02,0xC5,0x9F,0xA0,0xF6,0x5B,0xD5,0x8B,0x06,0x19,0x86,0x4F,0x53,0x10,0x6D,
-0x07,0x24,0x27,0xA1,0xA0,0xF8,0xD5,0x47,0x19,0x61,0x4C,0x7D,0xCA,0x93,0x27,0xEA,
-0x74,0x0C,0xEF,0x6F,0x96,0x09,0xFE,0x63,0xEC,0x70,0x5D,0x36,0xAD,0x67,0x77,0xAE,
-0xC9,0x9D,0x7C,0x55,0x44,0x3A,0xA2,0x63,0x51,0x1F,0xF5,0xE3,0x62,0xD4,0xA9,0x47,
-0x07,0x3E,0xCC,0x20,0xA3,0x42,0x30,0x40,0x30,0x0E,0x06,0x03,0x55,0x1D,0x0F,0x01,
-0x01,0xFF,0x04,0x04,0x03,0x02,0x01,0x06,0x30,0x0F,0x06,0x03,0x55,0x1D,0x13,0x01,
-0x01,0xFF,0x04,0x05,0x30,0x03,0x01,0x01,0xFF,0x30,0x1D,0x06,0x03,0x55,0x1D,0x0E,
-0x04,0x16,0x04,0x14,0xB7,0x63,0xE7,0x1A,0xDD,0x8D,0xE9,0x08,0xA6,0x55,0x83,0xA4,
-0xE0,0x6A,0x50,0x41,0x65,0x11,0x42,0x49,0x30,0x0A,0x06,0x08,0x2A,0x86,0x48,0xCE,
-0x3D,0x04,0x03,0x03,0x03,0x67,0x00,0x30,0x64,0x02,0x30,0x61,0x79,0xD8,0xE5,0x42,
-0x47,0xDF,0x1C,0xAE,0x53,0x99,0x17,0xB6,0x6F,0x1C,0x7D,0xE1,0xBF,0x11,0x94,0xD1,
-0x03,0x88,0x75,0xE4,0x8D,0x89,0xA4,0x8A,0x77,0x46,0xDE,0x6D,0x61,0xEF,0x02,0xF5,
-0xFB,0xB5,0xDF,0xCC,0xFE,0x4E,0xFF,0xFE,0xA9,0xE6,0xA7,0x02,0x30,0x5B,0x99,0xD7,
-0x85,0x37,0x06,0xB5,0x7B,0x08,0xFD,0xEB,0x27,0x8B,0x4A,0x94,0xF9,0xE1,0xFA,0xA7,
-0x8E,0x26,0x08,0xE8,0x7C,0x92,0x68,0x6D,0x73,0xD8,0x6F,0x26,0xAC,0x21,0x02,0xB8,
-0x99,0xB7,0x26,0x41,0x5B,0x25,0x60,0xAE,0xD0,0x48,0x1A,0xEE,0x06,
-};
-
-
-/* subject:/C=US/O=GeoTrust Inc./OU=(c) 2007 GeoTrust Inc. - For authorized use only/CN=GeoTrust Primary Certification Authority - G2 */
-/* issuer :/C=US/O=GeoTrust Inc./OU=(c) 2007 GeoTrust Inc. - For authorized use only/CN=GeoTrust Primary Certification Authority - G2 */
-
-
-const unsigned char GeoTrust_Primary_Certification_Authority___G2_certificate[690]={
-0x30,0x82,0x02,0xAE,0x30,0x82,0x02,0x35,0xA0,0x03,0x02,0x01,0x02,0x02,0x10,0x3C,
-0xB2,0xF4,0x48,0x0A,0x00,0xE2,0xFE,0xEB,0x24,0x3B,0x5E,0x60,0x3E,0xC3,0x6B,0x30,
-0x0A,0x06,0x08,0x2A,0x86,0x48,0xCE,0x3D,0x04,0x03,0x03,0x30,0x81,0x98,0x31,0x0B,
-0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x16,0x30,0x14,0x06,
-0x03,0x55,0x04,0x0A,0x13,0x0D,0x47,0x65,0x6F,0x54,0x72,0x75,0x73,0x74,0x20,0x49,
-0x6E,0x63,0x2E,0x31,0x39,0x30,0x37,0x06,0x03,0x55,0x04,0x0B,0x13,0x30,0x28,0x63,
-0x29,0x20,0x32,0x30,0x30,0x37,0x20,0x47,0x65,0x6F,0x54,0x72,0x75,0x73,0x74,0x20,
-0x49,0x6E,0x63,0x2E,0x20,0x2D,0x20,0x46,0x6F,0x72,0x20,0x61,0x75,0x74,0x68,0x6F,
-0x72,0x69,0x7A,0x65,0x64,0x20,0x75,0x73,0x65,0x20,0x6F,0x6E,0x6C,0x79,0x31,0x36,
-0x30,0x34,0x06,0x03,0x55,0x04,0x03,0x13,0x2D,0x47,0x65,0x6F,0x54,0x72,0x75,0x73,
-0x74,0x20,0x50,0x72,0x69,0x6D,0x61,0x72,0x79,0x20,0x43,0x65,0x72,0x74,0x69,0x66,
-0x69,0x63,0x61,0x74,0x69,0x6F,0x6E,0x20,0x41,0x75,0x74,0x68,0x6F,0x72,0x69,0x74,
-0x79,0x20,0x2D,0x20,0x47,0x32,0x30,0x1E,0x17,0x0D,0x30,0x37,0x31,0x31,0x30,0x35,
-0x30,0x30,0x30,0x30,0x30,0x30,0x5A,0x17,0x0D,0x33,0x38,0x30,0x31,0x31,0x38,0x32,
-0x33,0x35,0x39,0x35,0x39,0x5A,0x30,0x81,0x98,0x31,0x0B,0x30,0x09,0x06,0x03,0x55,
-0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x16,0x30,0x14,0x06,0x03,0x55,0x04,0x0A,0x13,
-0x0D,0x47,0x65,0x6F,0x54,0x72,0x75,0x73,0x74,0x20,0x49,0x6E,0x63,0x2E,0x31,0x39,
-0x30,0x37,0x06,0x03,0x55,0x04,0x0B,0x13,0x30,0x28,0x63,0x29,0x20,0x32,0x30,0x30,
-0x37,0x20,0x47,0x65,0x6F,0x54,0x72,0x75,0x73,0x74,0x20,0x49,0x6E,0x63,0x2E,0x20,
-0x2D,0x20,0x46,0x6F,0x72,0x20,0x61,0x75,0x74,0x68,0x6F,0x72,0x69,0x7A,0x65,0x64,
-0x20,0x75,0x73,0x65,0x20,0x6F,0x6E,0x6C,0x79,0x31,0x36,0x30,0x34,0x06,0x03,0x55,
-0x04,0x03,0x13,0x2D,0x47,0x65,0x6F,0x54,0x72,0x75,0x73,0x74,0x20,0x50,0x72,0x69,
-0x6D,0x61,0x72,0x79,0x20,0x43,0x65,0x72,0x74,0x69,0x66,0x69,0x63,0x61,0x74,0x69,
-0x6F,0x6E,0x20,0x41,0x75,0x74,0x68,0x6F,0x72,0x69,0x74,0x79,0x20,0x2D,0x20,0x47,
-0x32,0x30,0x76,0x30,0x10,0x06,0x07,0x2A,0x86,0x48,0xCE,0x3D,0x02,0x01,0x06,0x05,
-0x2B,0x81,0x04,0x00,0x22,0x03,0x62,0x00,0x04,0x15,0xB1,0xE8,0xFD,0x03,0x15,0x43,
-0xE5,0xAC,0xEB,0x87,0x37,0x11,0x62,0xEF,0xD2,0x83,0x36,0x52,0x7D,0x45,0x57,0x0B,
-0x4A,0x8D,0x7B,0x54,0x3B,0x3A,0x6E,0x5F,0x15,0x02,0xC0,0x50,0xA6,0xCF,0x25,0x2F,
-0x7D,0xCA,0x48,0xB8,0xC7,0x50,0x63,0x1C,0x2A,0x21,0x08,0x7C,0x9A,0x36,0xD8,0x0B,
-0xFE,0xD1,0x26,0xC5,0x58,0x31,0x30,0x28,0x25,0xF3,0x5D,0x5D,0xA3,0xB8,0xB6,0xA5,
-0xB4,0x92,0xED,0x6C,0x2C,0x9F,0xEB,0xDD,0x43,0x89,0xA2,0x3C,0x4B,0x48,0x91,0x1D,
-0x50,0xEC,0x26,0xDF,0xD6,0x60,0x2E,0xBD,0x21,0xA3,0x42,0x30,0x40,0x30,0x0F,0x06,
-0x03,0x55,0x1D,0x13,0x01,0x01,0xFF,0x04,0x05,0x30,0x03,0x01,0x01,0xFF,0x30,0x0E,
-0x06,0x03,0x55,0x1D,0x0F,0x01,0x01,0xFF,0x04,0x04,0x03,0x02,0x01,0x06,0x30,0x1D,
-0x06,0x03,0x55,0x1D,0x0E,0x04,0x16,0x04,0x14,0x15,0x5F,0x35,0x57,0x51,0x55,0xFB,
-0x25,0xB2,0xAD,0x03,0x69,0xFC,0x01,0xA3,0xFA,0xBE,0x11,0x55,0xD5,0x30,0x0A,0x06,
-0x08,0x2A,0x86,0x48,0xCE,0x3D,0x04,0x03,0x03,0x03,0x67,0x00,0x30,0x64,0x02,0x30,
-0x64,0x96,0x59,0xA6,0xE8,0x09,0xDE,0x8B,0xBA,0xFA,0x5A,0x88,0x88,0xF0,0x1F,0x91,
-0xD3,0x46,0xA8,0xF2,0x4A,0x4C,0x02,0x63,0xFB,0x6C,0x5F,0x38,0xDB,0x2E,0x41,0x93,
-0xA9,0x0E,0xE6,0x9D,0xDC,0x31,0x1C,0xB2,0xA0,0xA7,0x18,0x1C,0x79,0xE1,0xC7,0x36,
-0x02,0x30,0x3A,0x56,0xAF,0x9A,0x74,0x6C,0xF6,0xFB,0x83,0xE0,0x33,0xD3,0x08,0x5F,
-0xA1,0x9C,0xC2,0x5B,0x9F,0x46,0xD6,0xB6,0xCB,0x91,0x06,0x63,0xA2,0x06,0xE7,0x33,
-0xAC,0x3E,0xA8,0x81,0x12,0xD0,0xCB,0xBA,0xD0,0x92,0x0B,0xB6,0x9E,0x96,0xAA,0x04,
-0x0F,0x8A,
-};
-
-
-/* subject:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA 2 */
-/* issuer :/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA 2 */
-
-
-const unsigned char GeoTrust_Global_CA_2_certificate[874]={
-0x30,0x82,0x03,0x66,0x30,0x82,0x02,0x4E,0xA0,0x03,0x02,0x01,0x02,0x02,0x01,0x01,
-0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x05,0x05,0x00,0x30,
-0x44,0x31,0x0B,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x16,
-0x30,0x14,0x06,0x03,0x55,0x04,0x0A,0x13,0x0D,0x47,0x65,0x6F,0x54,0x72,0x75,0x73,
-0x74,0x20,0x49,0x6E,0x63,0x2E,0x31,0x1D,0x30,0x1B,0x06,0x03,0x55,0x04,0x03,0x13,
-0x14,0x47,0x65,0x6F,0x54,0x72,0x75,0x73,0x74,0x20,0x47,0x6C,0x6F,0x62,0x61,0x6C,
-0x20,0x43,0x41,0x20,0x32,0x30,0x1E,0x17,0x0D,0x30,0x34,0x30,0x33,0x30,0x34,0x30,
-0x35,0x30,0x30,0x30,0x30,0x5A,0x17,0x0D,0x31,0x39,0x30,0x33,0x30,0x34,0x30,0x35,
-0x30,0x30,0x30,0x30,0x5A,0x30,0x44,0x31,0x0B,0x30,0x09,0x06,0x03,0x55,0x04,0x06,
-0x13,0x02,0x55,0x53,0x31,0x16,0x30,0x14,0x06,0x03,0x55,0x04,0x0A,0x13,0x0D,0x47,
-0x65,0x6F,0x54,0x72,0x75,0x73,0x74,0x20,0x49,0x6E,0x63,0x2E,0x31,0x1D,0x30,0x1B,
-0x06,0x03,0x55,0x04,0x03,0x13,0x14,0x47,0x65,0x6F,0x54,0x72,0x75,0x73,0x74,0x20,
-0x47,0x6C,0x6F,0x62,0x61,0x6C,0x20,0x43,0x41,0x20,0x32,0x30,0x82,0x01,0x22,0x30,
-0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x01,0x05,0x00,0x03,0x82,
-0x01,0x0F,0x00,0x30,0x82,0x01,0x0A,0x02,0x82,0x01,0x01,0x00,0xEF,0x3C,0x4D,0x40,
-0x3D,0x10,0xDF,0x3B,0x53,0x00,0xE1,0x67,0xFE,0x94,0x60,0x15,0x3E,0x85,0x88,0xF1,
-0x89,0x0D,0x90,0xC8,0x28,0x23,0x99,0x05,0xE8,0x2B,0x20,0x9D,0xC6,0xF3,0x60,0x46,
-0xD8,0xC1,0xB2,0xD5,0x8C,0x31,0xD9,0xDC,0x20,0x79,0x24,0x81,0xBF,0x35,0x32,0xFC,
-0x63,0x69,0xDB,0xB1,0x2A,0x6B,0xEE,0x21,0x58,0xF2,0x08,0xE9,0x78,0xCB,0x6F,0xCB,
-0xFC,0x16,0x52,0xC8,0x91,0xC4,0xFF,0x3D,0x73,0xDE,0xB1,0x3E,0xA7,0xC2,0x7D,0x66,
-0xC1,0xF5,0x7E,0x52,0x24,0x1A,0xE2,0xD5,0x67,0x91,0xD0,0x82,0x10,0xD7,0x78,0x4B,
-0x4F,0x2B,0x42,0x39,0xBD,0x64,0x2D,0x40,0xA0,0xB0,0x10,0xD3,0x38,0x48,0x46,0x88,
-0xA1,0x0C,0xBB,0x3A,0x33,0x2A,0x62,0x98,0xFB,0x00,0x9D,0x13,0x59,0x7F,0x6F,0x3B,
-0x72,0xAA,0xEE,0xA6,0x0F,0x86,0xF9,0x05,0x61,0xEA,0x67,0x7F,0x0C,0x37,0x96,0x8B,
-0xE6,0x69,0x16,0x47,0x11,0xC2,0x27,0x59,0x03,0xB3,0xA6,0x60,0xC2,0x21,0x40,0x56,
-0xFA,0xA0,0xC7,0x7D,0x3A,0x13,0xE3,0xEC,0x57,0xC7,0xB3,0xD6,0xAE,0x9D,0x89,0x80,
-0xF7,0x01,0xE7,0x2C,0xF6,0x96,0x2B,0x13,0x0D,0x79,0x2C,0xD9,0xC0,0xE4,0x86,0x7B,
-0x4B,0x8C,0x0C,0x72,0x82,0x8A,0xFB,0x17,0xCD,0x00,0x6C,0x3A,0x13,0x3C,0xB0,0x84,
-0x87,0x4B,0x16,0x7A,0x29,0xB2,0x4F,0xDB,0x1D,0xD4,0x0B,0xF3,0x66,0x37,0xBD,0xD8,
-0xF6,0x57,0xBB,0x5E,0x24,0x7A,0xB8,0x3C,0x8B,0xB9,0xFA,0x92,0x1A,0x1A,0x84,0x9E,
-0xD8,0x74,0x8F,0xAA,0x1B,0x7F,0x5E,0xF4,0xFE,0x45,0x22,0x21,0x02,0x03,0x01,0x00,
-0x01,0xA3,0x63,0x30,0x61,0x30,0x0F,0x06,0x03,0x55,0x1D,0x13,0x01,0x01,0xFF,0x04,
-0x05,0x30,0x03,0x01,0x01,0xFF,0x30,0x1D,0x06,0x03,0x55,0x1D,0x0E,0x04,0x16,0x04,
-0x14,0x71,0x38,0x36,0xF2,0x02,0x31,0x53,0x47,0x2B,0x6E,0xBA,0x65,0x46,0xA9,0x10,
-0x15,0x58,0x20,0x05,0x09,0x30,0x1F,0x06,0x03,0x55,0x1D,0x23,0x04,0x18,0x30,0x16,
-0x80,0x14,0x71,0x38,0x36,0xF2,0x02,0x31,0x53,0x47,0x2B,0x6E,0xBA,0x65,0x46,0xA9,
-0x10,0x15,0x58,0x20,0x05,0x09,0x30,0x0E,0x06,0x03,0x55,0x1D,0x0F,0x01,0x01,0xFF,
-0x04,0x04,0x03,0x02,0x01,0x86,0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,
-0x01,0x01,0x05,0x05,0x00,0x03,0x82,0x01,0x01,0x00,0x03,0xF7,0xB5,0x2B,0xAB,0x5D,
-0x10,0xFC,0x7B,0xB2,0xB2,0x5E,0xAC,0x9B,0x0E,0x7E,0x53,0x78,0x59,0x3E,0x42,0x04,
-0xFE,0x75,0xA3,0xAD,0xAC,0x81,0x4E,0xD7,0x02,0x8B,0x5E,0xC4,0x2D,0xC8,0x52,0x76,
-0xC7,0x2C,0x1F,0xFC,0x81,0x32,0x98,0xD1,0x4B,0xC6,0x92,0x93,0x33,0x35,0x31,0x2F,
-0xFC,0xD8,0x1D,0x44,0xDD,0xE0,0x81,0x7F,0x9D,0xE9,0x8B,0xE1,0x64,0x91,0x62,0x0B,
-0x39,0x08,0x8C,0xAC,0x74,0x9D,0x59,0xD9,0x7A,0x59,0x52,0x97,0x11,0xB9,0x16,0x7B,
-0x6F,0x45,0xD3,0x96,0xD9,0x31,0x7D,0x02,0x36,0x0F,0x9C,0x3B,0x6E,0xCF,0x2C,0x0D,
-0x03,0x46,0x45,0xEB,0xA0,0xF4,0x7F,0x48,0x44,0xC6,0x08,0x40,0xCC,0xDE,0x1B,0x70,
-0xB5,0x29,0xAD,0xBA,0x8B,0x3B,0x34,0x65,0x75,0x1B,0x71,0x21,0x1D,0x2C,0x14,0x0A,
-0xB0,0x96,0x95,0xB8,0xD6,0xEA,0xF2,0x65,0xFB,0x29,0xBA,0x4F,0xEA,0x91,0x93,0x74,
-0x69,0xB6,0xF2,0xFF,0xE1,0x1A,0xD0,0x0C,0xD1,0x76,0x85,0xCB,0x8A,0x25,0xBD,0x97,
-0x5E,0x2C,0x6F,0x15,0x99,0x26,0xE7,0xB6,0x29,0xFF,0x22,0xEC,0xC9,0x02,0xC7,0x56,
-0x00,0xCD,0x49,0xB9,0xB3,0x6C,0x7B,0x53,0x04,0x1A,0xE2,0xA8,0xC9,0xAA,0x12,0x05,
-0x23,0xC2,0xCE,0xE7,0xBB,0x04,0x02,0xCC,0xC0,0x47,0xA2,0xE4,0xC4,0x29,0x2F,0x5B,
-0x45,0x57,0x89,0x51,0xEE,0x3C,0xEB,0x52,0x08,0xFF,0x07,0x35,0x1E,0x9F,0x35,0x6A,
-0x47,0x4A,0x56,0x98,0xD1,0x5A,0x85,0x1F,0x8C,0xF5,0x22,0xBF,0xAB,0xCE,0x83,0xF3,
-0xE2,0x22,0x29,0xAE,0x7D,0x83,0x40,0xA8,0xBA,0x6C,
-};
-
-
-/* subject:/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Certification Authority */
-/* issuer :/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Certification Authority */
-
-
-const unsigned char COMODO_RSA_Certification_Authority_certificate[1500]={
-0x30,0x82,0x05,0xD8,0x30,0x82,0x03,0xC0,0xA0,0x03,0x02,0x01,0x02,0x02,0x10,0x4C,
-0xAA,0xF9,0xCA,0xDB,0x63,0x6F,0xE0,0x1F,0xF7,0x4E,0xD8,0x5B,0x03,0x86,0x9D,0x30,
-0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x0C,0x05,0x00,0x30,0x81,
-0x85,0x31,0x0B,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x47,0x42,0x31,0x1B,
-0x30,0x19,0x06,0x03,0x55,0x04,0x08,0x13,0x12,0x47,0x72,0x65,0x61,0x74,0x65,0x72,
-0x20,0x4D,0x61,0x6E,0x63,0x68,0x65,0x73,0x74,0x65,0x72,0x31,0x10,0x30,0x0E,0x06,
-0x03,0x55,0x04,0x07,0x13,0x07,0x53,0x61,0x6C,0x66,0x6F,0x72,0x64,0x31,0x1A,0x30,
-0x18,0x06,0x03,0x55,0x04,0x0A,0x13,0x11,0x43,0x4F,0x4D,0x4F,0x44,0x4F,0x20,0x43,
-0x41,0x20,0x4C,0x69,0x6D,0x69,0x74,0x65,0x64,0x31,0x2B,0x30,0x29,0x06,0x03,0x55,
-0x04,0x03,0x13,0x22,0x43,0x4F,0x4D,0x4F,0x44,0x4F,0x20,0x52,0x53,0x41,0x20,0x43,
-0x65,0x72,0x74,0x69,0x66,0x69,0x63,0x61,0x74,0x69,0x6F,0x6E,0x20,0x41,0x75,0x74,
-0x68,0x6F,0x72,0x69,0x74,0x79,0x30,0x1E,0x17,0x0D,0x31,0x30,0x30,0x31,0x31,0x39,
-0x30,0x30,0x30,0x30,0x30,0x30,0x5A,0x17,0x0D,0x33,0x38,0x30,0x31,0x31,0x38,0x32,
-0x33,0x35,0x39,0x35,0x39,0x5A,0x30,0x81,0x85,0x31,0x0B,0x30,0x09,0x06,0x03,0x55,
-0x04,0x06,0x13,0x02,0x47,0x42,0x31,0x1B,0x30,0x19,0x06,0x03,0x55,0x04,0x08,0x13,
-0x12,0x47,0x72,0x65,0x61,0x74,0x65,0x72,0x20,0x4D,0x61,0x6E,0x63,0x68,0x65,0x73,
-0x74,0x65,0x72,0x31,0x10,0x30,0x0E,0x06,0x03,0x55,0x04,0x07,0x13,0x07,0x53,0x61,
-0x6C,0x66,0x6F,0x72,0x64,0x31,0x1A,0x30,0x18,0x06,0x03,0x55,0x04,0x0A,0x13,0x11,
-0x43,0x4F,0x4D,0x4F,0x44,0x4F,0x20,0x43,0x41,0x20,0x4C,0x69,0x6D,0x69,0x74,0x65,
-0x64,0x31,0x2B,0x30,0x29,0x06,0x03,0x55,0x04,0x03,0x13,0x22,0x43,0x4F,0x4D,0x4F,
-0x44,0x4F,0x20,0x52,0x53,0x41,0x20,0x43,0x65,0x72,0x74,0x69,0x66,0x69,0x63,0x61,
-0x74,0x69,0x6F,0x6E,0x20,0x41,0x75,0x74,0x68,0x6F,0x72,0x69,0x74,0x79,0x30,0x82,
-0x02,0x22,0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x01,0x05,
-0x00,0x03,0x82,0x02,0x0F,0x00,0x30,0x82,0x02,0x0A,0x02,0x82,0x02,0x01,0x00,0x91,
-0xE8,0x54,0x92,0xD2,0x0A,0x56,0xB1,0xAC,0x0D,0x24,0xDD,0xC5,0xCF,0x44,0x67,0x74,
-0x99,0x2B,0x37,0xA3,0x7D,0x23,0x70,0x00,0x71,0xBC,0x53,0xDF,0xC4,0xFA,0x2A,0x12,
-0x8F,0x4B,0x7F,0x10,0x56,0xBD,0x9F,0x70,0x72,0xB7,0x61,0x7F,0xC9,0x4B,0x0F,0x17,
-0xA7,0x3D,0xE3,0xB0,0x04,0x61,0xEE,0xFF,0x11,0x97,0xC7,0xF4,0x86,0x3E,0x0A,0xFA,
-0x3E,0x5C,0xF9,0x93,0xE6,0x34,0x7A,0xD9,0x14,0x6B,0xE7,0x9C,0xB3,0x85,0xA0,0x82,
-0x7A,0x76,0xAF,0x71,0x90,0xD7,0xEC,0xFD,0x0D,0xFA,0x9C,0x6C,0xFA,0xDF,0xB0,0x82,
-0xF4,0x14,0x7E,0xF9,0xBE,0xC4,0xA6,0x2F,0x4F,0x7F,0x99,0x7F,0xB5,0xFC,0x67,0x43,
-0x72,0xBD,0x0C,0x00,0xD6,0x89,0xEB,0x6B,0x2C,0xD3,0xED,0x8F,0x98,0x1C,0x14,0xAB,
-0x7E,0xE5,0xE3,0x6E,0xFC,0xD8,0xA8,0xE4,0x92,0x24,0xDA,0x43,0x6B,0x62,0xB8,0x55,
-0xFD,0xEA,0xC1,0xBC,0x6C,0xB6,0x8B,0xF3,0x0E,0x8D,0x9A,0xE4,0x9B,0x6C,0x69,0x99,
-0xF8,0x78,0x48,0x30,0x45,0xD5,0xAD,0xE1,0x0D,0x3C,0x45,0x60,0xFC,0x32,0x96,0x51,
-0x27,0xBC,0x67,0xC3,0xCA,0x2E,0xB6,0x6B,0xEA,0x46,0xC7,0xC7,0x20,0xA0,0xB1,0x1F,
-0x65,0xDE,0x48,0x08,0xBA,0xA4,0x4E,0xA9,0xF2,0x83,0x46,0x37,0x84,0xEB,0xE8,0xCC,
-0x81,0x48,0x43,0x67,0x4E,0x72,0x2A,0x9B,0x5C,0xBD,0x4C,0x1B,0x28,0x8A,0x5C,0x22,
-0x7B,0xB4,0xAB,0x98,0xD9,0xEE,0xE0,0x51,0x83,0xC3,0x09,0x46,0x4E,0x6D,0x3E,0x99,
-0xFA,0x95,0x17,0xDA,0x7C,0x33,0x57,0x41,0x3C,0x8D,0x51,0xED,0x0B,0xB6,0x5C,0xAF,
-0x2C,0x63,0x1A,0xDF,0x57,0xC8,0x3F,0xBC,0xE9,0x5D,0xC4,0x9B,0xAF,0x45,0x99,0xE2,
-0xA3,0x5A,0x24,0xB4,0xBA,0xA9,0x56,0x3D,0xCF,0x6F,0xAA,0xFF,0x49,0x58,0xBE,0xF0,
-0xA8,0xFF,0xF4,0xB8,0xAD,0xE9,0x37,0xFB,0xBA,0xB8,0xF4,0x0B,0x3A,0xF9,0xE8,0x43,
-0x42,0x1E,0x89,0xD8,0x84,0xCB,0x13,0xF1,0xD9,0xBB,0xE1,0x89,0x60,0xB8,0x8C,0x28,
-0x56,0xAC,0x14,0x1D,0x9C,0x0A,0xE7,0x71,0xEB,0xCF,0x0E,0xDD,0x3D,0xA9,0x96,0xA1,
-0x48,0xBD,0x3C,0xF7,0xAF,0xB5,0x0D,0x22,0x4C,0xC0,0x11,0x81,0xEC,0x56,0x3B,0xF6,
-0xD3,0xA2,0xE2,0x5B,0xB7,0xB2,0x04,0x22,0x52,0x95,0x80,0x93,0x69,0xE8,0x8E,0x4C,
-0x65,0xF1,0x91,0x03,0x2D,0x70,0x74,0x02,0xEA,0x8B,0x67,0x15,0x29,0x69,0x52,0x02,
-0xBB,0xD7,0xDF,0x50,0x6A,0x55,0x46,0xBF,0xA0,0xA3,0x28,0x61,0x7F,0x70,0xD0,0xC3,
-0xA2,0xAA,0x2C,0x21,0xAA,0x47,0xCE,0x28,0x9C,0x06,0x45,0x76,0xBF,0x82,0x18,0x27,
-0xB4,0xD5,0xAE,0xB4,0xCB,0x50,0xE6,0x6B,0xF4,0x4C,0x86,0x71,0x30,0xE9,0xA6,0xDF,
-0x16,0x86,0xE0,0xD8,0xFF,0x40,0xDD,0xFB,0xD0,0x42,0x88,0x7F,0xA3,0x33,0x3A,0x2E,
-0x5C,0x1E,0x41,0x11,0x81,0x63,0xCE,0x18,0x71,0x6B,0x2B,0xEC,0xA6,0x8A,0xB7,0x31,
-0x5C,0x3A,0x6A,0x47,0xE0,0xC3,0x79,0x59,0xD6,0x20,0x1A,0xAF,0xF2,0x6A,0x98,0xAA,
-0x72,0xBC,0x57,0x4A,0xD2,0x4B,0x9D,0xBB,0x10,0xFC,0xB0,0x4C,0x41,0xE5,0xED,0x1D,
-0x3D,0x5E,0x28,0x9D,0x9C,0xCC,0xBF,0xB3,0x51,0xDA,0xA7,0x47,0xE5,0x84,0x53,0x02,
-0x03,0x01,0x00,0x01,0xA3,0x42,0x30,0x40,0x30,0x1D,0x06,0x03,0x55,0x1D,0x0E,0x04,
-0x16,0x04,0x14,0xBB,0xAF,0x7E,0x02,0x3D,0xFA,0xA6,0xF1,0x3C,0x84,0x8E,0xAD,0xEE,
-0x38,0x98,0xEC,0xD9,0x32,0x32,0xD4,0x30,0x0E,0x06,0x03,0x55,0x1D,0x0F,0x01,0x01,
-0xFF,0x04,0x04,0x03,0x02,0x01,0x06,0x30,0x0F,0x06,0x03,0x55,0x1D,0x13,0x01,0x01,
-0xFF,0x04,0x05,0x30,0x03,0x01,0x01,0xFF,0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,
-0xF7,0x0D,0x01,0x01,0x0C,0x05,0x00,0x03,0x82,0x02,0x01,0x00,0x0A,0xF1,0xD5,0x46,
-0x84,0xB7,0xAE,0x51,0xBB,0x6C,0xB2,0x4D,0x41,0x14,0x00,0x93,0x4C,0x9C,0xCB,0xE5,
-0xC0,0x54,0xCF,0xA0,0x25,0x8E,0x02,0xF9,0xFD,0xB0,0xA2,0x0D,0xF5,0x20,0x98,0x3C,
-0x13,0x2D,0xAC,0x56,0xA2,0xB0,0xD6,0x7E,0x11,0x92,0xE9,0x2E,0xBA,0x9E,0x2E,0x9A,
-0x72,0xB1,0xBD,0x19,0x44,0x6C,0x61,0x35,0xA2,0x9A,0xB4,0x16,0x12,0x69,0x5A,0x8C,
-0xE1,0xD7,0x3E,0xA4,0x1A,0xE8,0x2F,0x03,0xF4,0xAE,0x61,0x1D,0x10,0x1B,0x2A,0xA4,
-0x8B,0x7A,0xC5,0xFE,0x05,0xA6,0xE1,0xC0,0xD6,0xC8,0xFE,0x9E,0xAE,0x8F,0x2B,0xBA,
-0x3D,0x99,0xF8,0xD8,0x73,0x09,0x58,0x46,0x6E,0xA6,0x9C,0xF4,0xD7,0x27,0xD3,0x95,
-0xDA,0x37,0x83,0x72,0x1C,0xD3,0x73,0xE0,0xA2,0x47,0x99,0x03,0x38,0x5D,0xD5,0x49,
-0x79,0x00,0x29,0x1C,0xC7,0xEC,0x9B,0x20,0x1C,0x07,0x24,0x69,0x57,0x78,0xB2,0x39,
-0xFC,0x3A,0x84,0xA0,0xB5,0x9C,0x7C,0x8D,0xBF,0x2E,0x93,0x62,0x27,0xB7,0x39,0xDA,
-0x17,0x18,0xAE,0xBD,0x3C,0x09,0x68,0xFF,0x84,0x9B,0x3C,0xD5,0xD6,0x0B,0x03,0xE3,
-0x57,0x9E,0x14,0xF7,0xD1,0xEB,0x4F,0xC8,0xBD,0x87,0x23,0xB7,0xB6,0x49,0x43,0x79,
-0x85,0x5C,0xBA,0xEB,0x92,0x0B,0xA1,0xC6,0xE8,0x68,0xA8,0x4C,0x16,0xB1,0x1A,0x99,
-0x0A,0xE8,0x53,0x2C,0x92,0xBB,0xA1,0x09,0x18,0x75,0x0C,0x65,0xA8,0x7B,0xCB,0x23,
-0xB7,0x1A,0xC2,0x28,0x85,0xC3,0x1B,0xFF,0xD0,0x2B,0x62,0xEF,0xA4,0x7B,0x09,0x91,
-0x98,0x67,0x8C,0x14,0x01,0xCD,0x68,0x06,0x6A,0x63,0x21,0x75,0x03,0x80,0x88,0x8A,
-0x6E,0x81,0xC6,0x85,0xF2,0xA9,0xA4,0x2D,0xE7,0xF4,0xA5,0x24,0x10,0x47,0x83,0xCA,
-0xCD,0xF4,0x8D,0x79,0x58,0xB1,0x06,0x9B,0xE7,0x1A,0x2A,0xD9,0x9D,0x01,0xD7,0x94,
-0x7D,0xED,0x03,0x4A,0xCA,0xF0,0xDB,0xE8,0xA9,0x01,0x3E,0xF5,0x56,0x99,0xC9,0x1E,
-0x8E,0x49,0x3D,0xBB,0xE5,0x09,0xB9,0xE0,0x4F,0x49,0x92,0x3D,0x16,0x82,0x40,0xCC,
-0xCC,0x59,0xC6,0xE6,0x3A,0xED,0x12,0x2E,0x69,0x3C,0x6C,0x95,0xB1,0xFD,0xAA,0x1D,
-0x7B,0x7F,0x86,0xBE,0x1E,0x0E,0x32,0x46,0xFB,0xFB,0x13,0x8F,0x75,0x7F,0x4C,0x8B,
-0x4B,0x46,0x63,0xFE,0x00,0x34,0x40,0x70,0xC1,0xC3,0xB9,0xA1,0xDD,0xA6,0x70,0xE2,
-0x04,0xB3,0x41,0xBC,0xE9,0x80,0x91,0xEA,0x64,0x9C,0x7A,0xE1,0x22,0x03,0xA9,0x9C,
-0x6E,0x6F,0x0E,0x65,0x4F,0x6C,0x87,0x87,0x5E,0xF3,0x6E,0xA0,0xF9,0x75,0xA5,0x9B,
-0x40,0xE8,0x53,0xB2,0x27,0x9D,0x4A,0xB9,0xC0,0x77,0x21,0x8D,0xFF,0x87,0xF2,0xDE,
-0xBC,0x8C,0xEF,0x17,0xDF,0xB7,0x49,0x0B,0xD1,0xF2,0x6E,0x30,0x0B,0x1A,0x0E,0x4E,
-0x76,0xED,0x11,0xFC,0xF5,0xE9,0x56,0xB2,0x7D,0xBF,0xC7,0x6D,0x0A,0x93,0x8C,0xA5,
-0xD0,0xC0,0xB6,0x1D,0xBE,0x3A,0x4E,0x94,0xA2,0xD7,0x6E,0x6C,0x0B,0xC2,0x8A,0x7C,
-0xFA,0x20,0xF3,0xC4,0xE4,0xE5,0xCD,0x0D,0xA8,0xCB,0x91,0x92,0xB1,0x7C,0x85,0xEC,
-0xB5,0x14,0x69,0x66,0x0E,0x82,0xE7,0xCD,0xCE,0xC8,0x2D,0xA6,0x51,0x7F,0x21,0xC1,
-0x35,0x53,0x85,0x06,0x4A,0x5D,0x9F,0xAD,0xBB,0x1B,0x5F,0x74,
-};
-
-
-/* subject:/C=US/ST=UT/L=Salt Lake City/O=The USERTRUST Network/OU=http://www.usertrust.com/CN=UTN - DATACorp SGC */
-/* issuer :/C=US/ST=UT/L=Salt Lake City/O=The USERTRUST Network/OU=http://www.usertrust.com/CN=UTN - DATACorp SGC */
-
-
-const unsigned char UTN_DATACorp_SGC_Root_CA_certificate[1122]={
-0x30,0x82,0x04,0x5E,0x30,0x82,0x03,0x46,0xA0,0x03,0x02,0x01,0x02,0x02,0x10,0x44,
-0xBE,0x0C,0x8B,0x50,0x00,0x21,0xB4,0x11,0xD3,0x2A,0x68,0x06,0xA9,0xAD,0x69,0x30,
-0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x05,0x05,0x00,0x30,0x81,
-0x93,0x31,0x0B,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x0B,
-0x30,0x09,0x06,0x03,0x55,0x04,0x08,0x13,0x02,0x55,0x54,0x31,0x17,0x30,0x15,0x06,
-0x03,0x55,0x04,0x07,0x13,0x0E,0x53,0x61,0x6C,0x74,0x20,0x4C,0x61,0x6B,0x65,0x20,
-0x43,0x69,0x74,0x79,0x31,0x1E,0x30,0x1C,0x06,0x03,0x55,0x04,0x0A,0x13,0x15,0x54,
-0x68,0x65,0x20,0x55,0x53,0x45,0x52,0x54,0x52,0x55,0x53,0x54,0x20,0x4E,0x65,0x74,
-0x77,0x6F,0x72,0x6B,0x31,0x21,0x30,0x1F,0x06,0x03,0x55,0x04,0x0B,0x13,0x18,0x68,
-0x74,0x74,0x70,0x3A,0x2F,0x2F,0x77,0x77,0x77,0x2E,0x75,0x73,0x65,0x72,0x74,0x72,
-0x75,0x73,0x74,0x2E,0x63,0x6F,0x6D,0x31,0x1B,0x30,0x19,0x06,0x03,0x55,0x04,0x03,
-0x13,0x12,0x55,0x54,0x4E,0x20,0x2D,0x20,0x44,0x41,0x54,0x41,0x43,0x6F,0x72,0x70,
-0x20,0x53,0x47,0x43,0x30,0x1E,0x17,0x0D,0x39,0x39,0x30,0x36,0x32,0x34,0x31,0x38,
-0x35,0x37,0x32,0x31,0x5A,0x17,0x0D,0x31,0x39,0x30,0x36,0x32,0x34,0x31,0x39,0x30,
-0x36,0x33,0x30,0x5A,0x30,0x81,0x93,0x31,0x0B,0x30,0x09,0x06,0x03,0x55,0x04,0x06,
-0x13,0x02,0x55,0x53,0x31,0x0B,0x30,0x09,0x06,0x03,0x55,0x04,0x08,0x13,0x02,0x55,
-0x54,0x31,0x17,0x30,0x15,0x06,0x03,0x55,0x04,0x07,0x13,0x0E,0x53,0x61,0x6C,0x74,
-0x20,0x4C,0x61,0x6B,0x65,0x20,0x43,0x69,0x74,0x79,0x31,0x1E,0x30,0x1C,0x06,0x03,
-0x55,0x04,0x0A,0x13,0x15,0x54,0x68,0x65,0x20,0x55,0x53,0x45,0x52,0x54,0x52,0x55,
-0x53,0x54,0x20,0x4E,0x65,0x74,0x77,0x6F,0x72,0x6B,0x31,0x21,0x30,0x1F,0x06,0x03,
-0x55,0x04,0x0B,0x13,0x18,0x68,0x74,0x74,0x70,0x3A,0x2F,0x2F,0x77,0x77,0x77,0x2E,
-0x75,0x73,0x65,0x72,0x74,0x72,0x75,0x73,0x74,0x2E,0x63,0x6F,0x6D,0x31,0x1B,0x30,
-0x19,0x06,0x03,0x55,0x04,0x03,0x13,0x12,0x55,0x54,0x4E,0x20,0x2D,0x20,0x44,0x41,
-0x54,0x41,0x43,0x6F,0x72,0x70,0x20,0x53,0x47,0x43,0x30,0x82,0x01,0x22,0x30,0x0D,
-0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x01,0x05,0x00,0x03,0x82,0x01,
-0x0F,0x00,0x30,0x82,0x01,0x0A,0x02,0x82,0x01,0x01,0x00,0xDF,0xEE,0x58,0x10,0xA2,
-0x2B,0x6E,0x55,0xC4,0x8E,0xBF,0x2E,0x46,0x09,0xE7,0xE0,0x08,0x0F,0x2E,0x2B,0x7A,
-0x13,0x94,0x1B,0xBD,0xF6,0xB6,0x80,0x8E,0x65,0x05,0x93,0x00,0x1E,0xBC,0xAF,0xE2,
-0x0F,0x8E,0x19,0x0D,0x12,0x47,0xEC,0xAC,0xAD,0xA3,0xFA,0x2E,0x70,0xF8,0xDE,0x6E,
-0xFB,0x56,0x42,0x15,0x9E,0x2E,0x5C,0xEF,0x23,0xDE,0x21,0xB9,0x05,0x76,0x27,0x19,
-0x0F,0x4F,0xD6,0xC3,0x9C,0xB4,0xBE,0x94,0x19,0x63,0xF2,0xA6,0x11,0x0A,0xEB,0x53,
-0x48,0x9C,0xBE,0xF2,0x29,0x3B,0x16,0xE8,0x1A,0xA0,0x4C,0xA6,0xC9,0xF4,0x18,0x59,
-0x68,0xC0,0x70,0xF2,0x53,0x00,0xC0,0x5E,0x50,0x82,0xA5,0x56,0x6F,0x36,0xF9,0x4A,
-0xE0,0x44,0x86,0xA0,0x4D,0x4E,0xD6,0x47,0x6E,0x49,0x4A,0xCB,0x67,0xD7,0xA6,0xC4,
-0x05,0xB9,0x8E,0x1E,0xF4,0xFC,0xFF,0xCD,0xE7,0x36,0xE0,0x9C,0x05,0x6C,0xB2,0x33,
-0x22,0x15,0xD0,0xB4,0xE0,0xCC,0x17,0xC0,0xB2,0xC0,0xF4,0xFE,0x32,0x3F,0x29,0x2A,
-0x95,0x7B,0xD8,0xF2,0xA7,0x4E,0x0F,0x54,0x7C,0xA1,0x0D,0x80,0xB3,0x09,0x03,0xC1,
-0xFF,0x5C,0xDD,0x5E,0x9A,0x3E,0xBC,0xAE,0xBC,0x47,0x8A,0x6A,0xAE,0x71,0xCA,0x1F,
-0xB1,0x2A,0xB8,0x5F,0x42,0x05,0x0B,0xEC,0x46,0x30,0xD1,0x72,0x0B,0xCA,0xE9,0x56,
-0x6D,0xF5,0xEF,0xDF,0x78,0xBE,0x61,0xBA,0xB2,0xA5,0xAE,0x04,0x4C,0xBC,0xA8,0xAC,
-0x69,0x15,0x97,0xBD,0xEF,0xEB,0xB4,0x8C,0xBF,0x35,0xF8,0xD4,0xC3,0xD1,0x28,0x0E,
-0x5C,0x3A,0x9F,0x70,0x18,0x33,0x20,0x77,0xC4,0xA2,0xAF,0x02,0x03,0x01,0x00,0x01,
-0xA3,0x81,0xAB,0x30,0x81,0xA8,0x30,0x0B,0x06,0x03,0x55,0x1D,0x0F,0x04,0x04,0x03,
-0x02,0x01,0xC6,0x30,0x0F,0x06,0x03,0x55,0x1D,0x13,0x01,0x01,0xFF,0x04,0x05,0x30,
-0x03,0x01,0x01,0xFF,0x30,0x1D,0x06,0x03,0x55,0x1D,0x0E,0x04,0x16,0x04,0x14,0x53,
-0x32,0xD1,0xB3,0xCF,0x7F,0xFA,0xE0,0xF1,0xA0,0x5D,0x85,0x4E,0x92,0xD2,0x9E,0x45,
-0x1D,0xB4,0x4F,0x30,0x3D,0x06,0x03,0x55,0x1D,0x1F,0x04,0x36,0x30,0x34,0x30,0x32,
-0xA0,0x30,0xA0,0x2E,0x86,0x2C,0x68,0x74,0x74,0x70,0x3A,0x2F,0x2F,0x63,0x72,0x6C,
-0x2E,0x75,0x73,0x65,0x72,0x74,0x72,0x75,0x73,0x74,0x2E,0x63,0x6F,0x6D,0x2F,0x55,
-0x54,0x4E,0x2D,0x44,0x41,0x54,0x41,0x43,0x6F,0x72,0x70,0x53,0x47,0x43,0x2E,0x63,
-0x72,0x6C,0x30,0x2A,0x06,0x03,0x55,0x1D,0x25,0x04,0x23,0x30,0x21,0x06,0x08,0x2B,
-0x06,0x01,0x05,0x05,0x07,0x03,0x01,0x06,0x0A,0x2B,0x06,0x01,0x04,0x01,0x82,0x37,
-0x0A,0x03,0x03,0x06,0x09,0x60,0x86,0x48,0x01,0x86,0xF8,0x42,0x04,0x01,0x30,0x0D,
-0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x05,0x05,0x00,0x03,0x82,0x01,
-0x01,0x00,0x27,0x35,0x97,0x00,0x8A,0x8B,0x28,0xBD,0xC6,0x33,0x30,0x1E,0x29,0xFC,
-0xE2,0xF7,0xD5,0x98,0xD4,0x40,0xBB,0x60,0xCA,0xBF,0xAB,0x17,0x2C,0x09,0x36,0x7F,
-0x50,0xFA,0x41,0xDC,0xAE,0x96,0x3A,0x0A,0x23,0x3E,0x89,0x59,0xC9,0xA3,0x07,0xED,
-0x1B,0x37,0xAD,0xFC,0x7C,0xBE,0x51,0x49,0x5A,0xDE,0x3A,0x0A,0x54,0x08,0x16,0x45,
-0xC2,0x99,0xB1,0x87,0xCD,0x8C,0x68,0xE0,0x69,0x03,0xE9,0xC4,0x4E,0x98,0xB2,0x3B,
-0x8C,0x16,0xB3,0x0E,0xA0,0x0C,0x98,0x50,0x9B,0x93,0xA9,0x70,0x09,0xC8,0x2C,0xA3,
-0x8F,0xDF,0x02,0xE4,0xE0,0x71,0x3A,0xF1,0xB4,0x23,0x72,0xA0,0xAA,0x01,0xDF,0xDF,
-0x98,0x3E,0x14,0x50,0xA0,0x31,0x26,0xBD,0x28,0xE9,0x5A,0x30,0x26,0x75,0xF9,0x7B,
-0x60,0x1C,0x8D,0xF3,0xCD,0x50,0x26,0x6D,0x04,0x27,0x9A,0xDF,0xD5,0x0D,0x45,0x47,
-0x29,0x6B,0x2C,0xE6,0x76,0xD9,0xA9,0x29,0x7D,0x32,0xDD,0xC9,0x36,0x3C,0xBD,0xAE,
-0x35,0xF1,0x11,0x9E,0x1D,0xBB,0x90,0x3F,0x12,0x47,0x4E,0x8E,0xD7,0x7E,0x0F,0x62,
-0x73,0x1D,0x52,0x26,0x38,0x1C,0x18,0x49,0xFD,0x30,0x74,0x9A,0xC4,0xE5,0x22,0x2F,
-0xD8,0xC0,0x8D,0xED,0x91,0x7A,0x4C,0x00,0x8F,0x72,0x7F,0x5D,0xDA,0xDD,0x1B,0x8B,
-0x45,0x6B,0xE7,0xDD,0x69,0x97,0xA8,0xC5,0x56,0x4C,0x0F,0x0C,0xF6,0x9F,0x7A,0x91,
-0x37,0xF6,0x97,0x82,0xE0,0xDD,0x71,0x69,0xFF,0x76,0x3F,0x60,0x4D,0x3C,0xCF,0xF7,
-0x99,0xF9,0xC6,0x57,0xF4,0xC9,0x55,0x39,0x78,0xBA,0x2C,0x79,0xC9,0xA6,0x88,0x2B,
-0xF4,0x08,
-};
-
-
-const unsigned char* const kSSLCertCertificateList[] = {
- GlobalSign_Root_CA_certificate,
- USERTrust_RSA_Certification_Authority_certificate,
- Starfield_Class_2_CA_certificate,
- Verisign_Class_3_Public_Primary_Certification_Authority___G3_certificate,
- USERTrust_ECC_Certification_Authority_certificate,
- GeoTrust_Global_CA_certificate,
- Starfield_Root_Certificate_Authority___G2_certificate,
- DigiCert_Global_Root_G3_certificate,
- thawte_Primary_Root_CA___G2_certificate,
- VeriSign_Universal_Root_Certification_Authority_certificate,
- VeriSign_Class_3_Public_Primary_Certification_Authority___G4_certificate,
- DigiCert_Global_Root_G2_certificate,
- AddTrust_Low_Value_Services_Root_certificate,
- AffirmTrust_Premium_ECC_certificate,
- Verisign_Class_4_Public_Primary_Certification_Authority___G3_certificate,
- thawte_Primary_Root_CA_certificate,
- AddTrust_Public_Services_Root_certificate,
- AddTrust_Qualified_Certificates_Root_certificate,
- GeoTrust_Primary_Certification_Authority___G3_certificate,
- GeoTrust_Universal_CA_2_certificate,
- Baltimore_CyberTrust_Root_certificate,
- GlobalSign_Root_CA___R2_certificate,
- GlobalSign_Root_CA___R3_certificate,
- AffirmTrust_Networking_certificate,
- AddTrust_External_Root_certificate,
- thawte_Primary_Root_CA___G3_certificate,
- DigiCert_Assured_ID_Root_CA_certificate,
- Go_Daddy_Class_2_CA_certificate,
- GeoTrust_Primary_Certification_Authority_certificate,
- VeriSign_Class_3_Public_Primary_Certification_Authority___G5_certificate,
- Equifax_Secure_CA_certificate,
- Entrust_net_Premium_2048_Secure_Server_CA_certificate,
- DigiCert_Assured_ID_Root_G3_certificate,
- COMODO_Certification_Authority_certificate,
- DigiCert_Global_Root_CA_certificate,
- Comodo_AAA_Services_root_certificate,
- DigiCert_High_Assurance_EV_Root_CA_certificate,
- GeoTrust_Universal_CA_certificate,
- COMODO_ECC_Certification_Authority_certificate,
- Entrust_Root_Certification_Authority___G2_certificate,
- DigiCert_Assured_ID_Root_G2_certificate,
- AffirmTrust_Commercial_certificate,
- AffirmTrust_Premium_certificate,
- Go_Daddy_Root_Certificate_Authority___G2_certificate,
- Comodo_Secure_Services_root_certificate,
- DigiCert_Trusted_Root_G4_certificate,
- GlobalSign_ECC_Root_CA___R5_certificate,
- UTN_USERFirst_Hardware_Root_CA_certificate,
- GlobalSign_ECC_Root_CA___R4_certificate,
- TC_TrustCenter_Universal_CA_I_certificate,
- Comodo_Trusted_Services_root_certificate,
- Entrust_Root_Certification_Authority_certificate,
- TC_TrustCenter_Class_2_CA_II_certificate,
- Cybertrust_Global_Root_certificate,
- Entrust_Root_Certification_Authority___EC1_certificate,
- GeoTrust_Primary_Certification_Authority___G2_certificate,
- GeoTrust_Global_CA_2_certificate,
- COMODO_RSA_Certification_Authority_certificate,
- UTN_DATACorp_SGC_Root_CA_certificate,
-};
-
-const size_t kSSLCertCertificateSizeList[] = {
-  889,
-  1506,
-  1043,
-  1054,
-  659,
-  856,
-  993,
-  579,
-  652,
-  1213,
-  904,
-  914,
-  1052,
-  514,
-  1054,
-  1060,
-  1049,
-  1058,
-  1026,
-  1392,
-  891,
-  958,
-  867,
-  848,
-  1082,
-  1070,
-  955,
-  1028,
-  896,
-  1239,
-  804,
-  1120,
-  586,
-  1057,
-  947,
-  1078,
-  969,
-  1388,
-  653,
-  1090,
-  922,
-  848,
-  1354,
-  969,
-  1091,
-  1428,
-  546,
-  1144,
-  485,
-  993,
-  1095,
-  1173,
-  1198,
-  933,
-  765,
-  690,
-  874,
-  1500,
-  1122,
-};
-
-#endif  // WEBRTC_RTC_BASE_SSLROOTS_H_
diff --git a/rtc_base/sslstreamadapter.cc b/rtc_base/sslstreamadapter.cc
deleted file mode 100644
index d55b6fe..0000000
--- a/rtc_base/sslstreamadapter.cc
+++ /dev/null
@@ -1,165 +0,0 @@
-/*
- *  Copyright 2004 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/rtc_base/sslstreamadapter.h"
-
-#include "webrtc/rtc_base/opensslstreamadapter.h"
-
-///////////////////////////////////////////////////////////////////////////////
-
-namespace rtc {
-
-// TODO(guoweis): Move this to SDP layer and use int form internally.
-// webrtc:5043.
-const char CS_AES_CM_128_HMAC_SHA1_80[] = "AES_CM_128_HMAC_SHA1_80";
-const char CS_AES_CM_128_HMAC_SHA1_32[] = "AES_CM_128_HMAC_SHA1_32";
-const char CS_AEAD_AES_128_GCM[] = "AEAD_AES_128_GCM";
-const char CS_AEAD_AES_256_GCM[] = "AEAD_AES_256_GCM";
-
-std::string SrtpCryptoSuiteToName(int crypto_suite) {
-  switch (crypto_suite) {
-  case SRTP_AES128_CM_SHA1_32:
-    return CS_AES_CM_128_HMAC_SHA1_32;
-  case SRTP_AES128_CM_SHA1_80:
-    return CS_AES_CM_128_HMAC_SHA1_80;
-  case SRTP_AEAD_AES_128_GCM:
-    return CS_AEAD_AES_128_GCM;
-  case SRTP_AEAD_AES_256_GCM:
-    return CS_AEAD_AES_256_GCM;
-  default:
-    return std::string();
-  }
-}
-
-int SrtpCryptoSuiteFromName(const std::string& crypto_suite) {
-  if (crypto_suite == CS_AES_CM_128_HMAC_SHA1_32)
-    return SRTP_AES128_CM_SHA1_32;
-  if (crypto_suite == CS_AES_CM_128_HMAC_SHA1_80)
-    return SRTP_AES128_CM_SHA1_80;
-  if (crypto_suite == CS_AEAD_AES_128_GCM)
-    return SRTP_AEAD_AES_128_GCM;
-  if (crypto_suite == CS_AEAD_AES_256_GCM)
-    return SRTP_AEAD_AES_256_GCM;
-  return SRTP_INVALID_CRYPTO_SUITE;
-}
-
-bool GetSrtpKeyAndSaltLengths(int crypto_suite, int *key_length,
-    int *salt_length) {
-  switch (crypto_suite) {
-  case SRTP_AES128_CM_SHA1_32:
-  case SRTP_AES128_CM_SHA1_80:
-    // SRTP_AES128_CM_HMAC_SHA1_32 and SRTP_AES128_CM_HMAC_SHA1_80 are defined
-    // in RFC 5764 to use a 128 bits key and 112 bits salt for the cipher.
-    *key_length = 16;
-    *salt_length = 14;
-    break;
-  case SRTP_AEAD_AES_128_GCM:
-    // SRTP_AEAD_AES_128_GCM is defined in RFC 7714 to use a 128 bits key and
-    // a 96 bits salt for the cipher.
-    *key_length = 16;
-    *salt_length = 12;
-    break;
-  case SRTP_AEAD_AES_256_GCM:
-    // SRTP_AEAD_AES_256_GCM is defined in RFC 7714 to use a 256 bits key and
-    // a 96 bits salt for the cipher.
-    *key_length = 32;
-    *salt_length = 12;
-    break;
-  default:
-    return false;
-  }
-  return true;
-}
-
-bool IsGcmCryptoSuite(int crypto_suite) {
-  return (crypto_suite == SRTP_AEAD_AES_256_GCM ||
-          crypto_suite == SRTP_AEAD_AES_128_GCM);
-}
-
-bool IsGcmCryptoSuiteName(const std::string& crypto_suite) {
-  return (crypto_suite == CS_AEAD_AES_256_GCM ||
-          crypto_suite == CS_AEAD_AES_128_GCM);
-}
-
-// static
-CryptoOptions CryptoOptions::NoGcm() {
-  CryptoOptions options;
-  options.enable_gcm_crypto_suites = false;
-  return options;
-}
-
-std::vector<int> GetSupportedDtlsSrtpCryptoSuites(
-    const rtc::CryptoOptions& crypto_options) {
-  std::vector<int> crypto_suites;
-  if (crypto_options.enable_gcm_crypto_suites) {
-    crypto_suites.push_back(rtc::SRTP_AEAD_AES_256_GCM);
-    crypto_suites.push_back(rtc::SRTP_AEAD_AES_128_GCM);
-  }
-  // Note: SRTP_AES128_CM_SHA1_80 is what is required to be supported (by
-  // draft-ietf-rtcweb-security-arch), but SRTP_AES128_CM_SHA1_32 is allowed as
-  // well, and saves a few bytes per packet if it ends up selected.
-  crypto_suites.push_back(rtc::SRTP_AES128_CM_SHA1_32);
-  crypto_suites.push_back(rtc::SRTP_AES128_CM_SHA1_80);
-  return crypto_suites;
-}
-
-SSLStreamAdapter* SSLStreamAdapter::Create(StreamInterface* stream) {
-  return new OpenSSLStreamAdapter(stream);
-}
-
-SSLStreamAdapter::SSLStreamAdapter(StreamInterface* stream)
-    : StreamAdapterInterface(stream),
-      ignore_bad_cert_(false),
-      client_auth_enabled_(true) {}
-
-SSLStreamAdapter::~SSLStreamAdapter() {}
-
-bool SSLStreamAdapter::GetSslCipherSuite(int* cipher_suite) {
-  return false;
-}
-
-bool SSLStreamAdapter::ExportKeyingMaterial(const std::string& label,
-                                            const uint8_t* context,
-                                            size_t context_len,
-                                            bool use_context,
-                                            uint8_t* result,
-                                            size_t result_len) {
-  return false;  // Default is unsupported
-}
-
-bool SSLStreamAdapter::SetDtlsSrtpCryptoSuites(
-    const std::vector<int>& crypto_suites) {
-  return false;
-}
-
-bool SSLStreamAdapter::GetDtlsSrtpCryptoSuite(int* crypto_suite) {
-  return false;
-}
-
-bool SSLStreamAdapter::IsBoringSsl() {
-  return OpenSSLStreamAdapter::IsBoringSsl();
-}
-bool SSLStreamAdapter::IsAcceptableCipher(int cipher, KeyType key_type) {
-  return OpenSSLStreamAdapter::IsAcceptableCipher(cipher, key_type);
-}
-bool SSLStreamAdapter::IsAcceptableCipher(const std::string& cipher,
-                                          KeyType key_type) {
-  return OpenSSLStreamAdapter::IsAcceptableCipher(cipher, key_type);
-}
-std::string SSLStreamAdapter::SslCipherSuiteToName(int cipher_suite) {
-  return OpenSSLStreamAdapter::SslCipherSuiteToName(cipher_suite);
-}
-void SSLStreamAdapter::enable_time_callback_for_testing() {
-  OpenSSLStreamAdapter::enable_time_callback_for_testing();
-}
-
-///////////////////////////////////////////////////////////////////////////////
-
-}  // namespace rtc
diff --git a/rtc_base/sslstreamadapter.h b/rtc_base/sslstreamadapter.h
deleted file mode 100644
index 7fb0867..0000000
--- a/rtc_base/sslstreamadapter.h
+++ /dev/null
@@ -1,279 +0,0 @@
-/*
- *  Copyright 2004 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_RTC_BASE_SSLSTREAMADAPTER_H_
-#define WEBRTC_RTC_BASE_SSLSTREAMADAPTER_H_
-
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "webrtc/rtc_base/sslidentity.h"
-#include "webrtc/rtc_base/stream.h"
-
-namespace rtc {
-
-// Constants for SSL profile.
-const int TLS_NULL_WITH_NULL_NULL = 0;
-
-// Constants for SRTP profiles.
-const int SRTP_INVALID_CRYPTO_SUITE = 0;
-#ifndef SRTP_AES128_CM_SHA1_80
-const int SRTP_AES128_CM_SHA1_80 = 0x0001;
-#endif
-#ifndef SRTP_AES128_CM_SHA1_32
-const int SRTP_AES128_CM_SHA1_32 = 0x0002;
-#endif
-#ifndef SRTP_AEAD_AES_128_GCM
-const int SRTP_AEAD_AES_128_GCM = 0x0007;
-#endif
-#ifndef SRTP_AEAD_AES_256_GCM
-const int SRTP_AEAD_AES_256_GCM = 0x0008;
-#endif
-
-// Names of SRTP profiles listed above.
-// 128-bit AES with 80-bit SHA-1 HMAC.
-extern const char CS_AES_CM_128_HMAC_SHA1_80[];
-// 128-bit AES with 32-bit SHA-1 HMAC.
-extern const char CS_AES_CM_128_HMAC_SHA1_32[];
-// 128-bit AES GCM with 16 byte AEAD auth tag.
-extern const char CS_AEAD_AES_128_GCM[];
-// 256-bit AES GCM with 16 byte AEAD auth tag.
-extern const char CS_AEAD_AES_256_GCM[];
-
-// Given the DTLS-SRTP protection profile ID, as defined in
-// https://tools.ietf.org/html/rfc4568#section-6.2 , return the SRTP profile
-// name, as defined in https://tools.ietf.org/html/rfc5764#section-4.1.2.
-std::string SrtpCryptoSuiteToName(int crypto_suite);
-
-// The reverse of above conversion.
-int SrtpCryptoSuiteFromName(const std::string& crypto_suite);
-
-// Get key length and salt length for given crypto suite. Returns true for
-// valid suites, otherwise false.
-bool GetSrtpKeyAndSaltLengths(int crypto_suite, int *key_length,
-    int *salt_length);
-
-// Returns true if the given crypto suite id uses a GCM cipher.
-bool IsGcmCryptoSuite(int crypto_suite);
-
-// Returns true if the given crypto suite name uses a GCM cipher.
-bool IsGcmCryptoSuiteName(const std::string& crypto_suite);
-
-struct CryptoOptions {
-  CryptoOptions() {}
-
-  // Helper method to return an instance of the CryptoOptions with GCM crypto
-  // suites disabled. This method should be used instead of depending on current
-  // default values set by the constructor.
-  static CryptoOptions NoGcm();
-
-  // Enable GCM crypto suites from RFC 7714 for SRTP. GCM will only be used
-  // if both sides enable it.
-  bool enable_gcm_crypto_suites = false;
-
-  // If set to true, encrypted RTP header extensions as defined in RFC 6904
-  // will be negotiated. They will only be used if both peers support them.
-  bool enable_encrypted_rtp_header_extensions = false;
-};
-
-// Returns supported crypto suites, given |crypto_options|.
-// CS_AES_CM_128_HMAC_SHA1_32 will be preferred by default.
-std::vector<int> GetSupportedDtlsSrtpCryptoSuites(
-    const rtc::CryptoOptions& crypto_options);
-
-// SSLStreamAdapter : A StreamInterfaceAdapter that does SSL/TLS.
-// After SSL has been started, the stream will only open on successful
-// SSL verification of certificates, and the communication is
-// encrypted of course.
-//
-// This class was written with SSLAdapter as a starting point. It
-// offers a similar interface, with two differences: there is no
-// support for a restartable SSL connection, and this class has a
-// peer-to-peer mode.
-//
-// The SSL library requires initialization and cleanup. Static method
-// for doing this are in SSLAdapter. They should possibly be moved out
-// to a neutral class.
-
-
-enum SSLRole { SSL_CLIENT, SSL_SERVER };
-enum SSLMode { SSL_MODE_TLS, SSL_MODE_DTLS };
-enum SSLProtocolVersion {
-  SSL_PROTOCOL_TLS_10,
-  SSL_PROTOCOL_TLS_11,
-  SSL_PROTOCOL_TLS_12,
-  SSL_PROTOCOL_DTLS_10 = SSL_PROTOCOL_TLS_11,
-  SSL_PROTOCOL_DTLS_12 = SSL_PROTOCOL_TLS_12,
-};
-enum class SSLPeerCertificateDigestError {
-  NONE,
-  UNKNOWN_ALGORITHM,
-  INVALID_LENGTH,
-  VERIFICATION_FAILED,
-};
-
-// Errors for Read -- in the high range so no conflict with OpenSSL.
-enum { SSE_MSG_TRUNC = 0xff0001 };
-
-// Used to send back UMA histogram value. Logged when Dtls handshake fails.
-enum class SSLHandshakeError { UNKNOWN, INCOMPATIBLE_CIPHERSUITE, MAX_VALUE };
-
-class SSLStreamAdapter : public StreamAdapterInterface {
- public:
-  // Instantiate an SSLStreamAdapter wrapping the given stream,
-  // (using the selected implementation for the platform).
-  // Caller is responsible for freeing the returned object.
-  static SSLStreamAdapter* Create(StreamInterface* stream);
-
-  explicit SSLStreamAdapter(StreamInterface* stream);
-  ~SSLStreamAdapter() override;
-
-  void set_ignore_bad_cert(bool ignore) { ignore_bad_cert_ = ignore; }
-  bool ignore_bad_cert() const { return ignore_bad_cert_; }
-
-  void set_client_auth_enabled(bool enabled) { client_auth_enabled_ = enabled; }
-  bool client_auth_enabled() const { return client_auth_enabled_; }
-
-  // Specify our SSL identity: key and certificate. SSLStream takes ownership
-  // of the SSLIdentity object and will free it when appropriate. Should be
-  // called no more than once on a given SSLStream instance.
-  virtual void SetIdentity(SSLIdentity* identity) = 0;
-
-  // Call this to indicate that we are to play the server role (or client role,
-  // if the default argument is replaced by SSL_CLIENT).
-  // The default argument is for backward compatibility.
-  // TODO(ekr@rtfm.com): rename this SetRole to reflect its new function
-  virtual void SetServerRole(SSLRole role = SSL_SERVER) = 0;
-
-  // Do DTLS or TLS.
-  virtual void SetMode(SSLMode mode) = 0;
-
-  // Set maximum supported protocol version. The highest version supported by
-  // both ends will be used for the connection, i.e. if one party supports
-  // DTLS 1.0 and the other DTLS 1.2, DTLS 1.0 will be used.
-  // If requested version is not supported by underlying crypto library, the
-  // next lower will be used.
-  virtual void SetMaxProtocolVersion(SSLProtocolVersion version) = 0;
-
-  // Set the initial retransmission timeout for DTLS messages. When the timeout
-  // expires, the message gets retransmitted and the timeout is exponentially
-  // increased.
-  // This should only be called before StartSSL().
-  virtual void SetInitialRetransmissionTimeout(int timeout_ms) = 0;
-
-  // StartSSL starts negotiation with a peer, whose certificate is verified
-  // using the certificate digest. Generally, SetIdentity() and possibly
-  // SetServerRole() should have been called before this.
-  // SetPeerCertificateDigest() must also be called. It may be called after
-  // StartSSLWithPeer() but must be called before the underlying stream opens.
-  //
-  // Use of the stream prior to calling StartSSL will pass data in clear text.
-  // Calling StartSSL causes SSL negotiation to begin as soon as possible: right
-  // away if the underlying wrapped stream is already opened, or else as soon as
-  // it opens.
-  //
-  // StartSSL returns a negative error code on failure. Returning 0 means
-  // success so far, but negotiation is probably not complete and will continue
-  // asynchronously. In that case, the exposed stream will open after
-  // successful negotiation and verification, or an SE_CLOSE event will be
-  // raised if negotiation fails.
-  virtual int StartSSL() = 0;
-
-  // Specify the digest of the certificate that our peer is expected to use.
-  // Only this certificate will be accepted during SSL verification. The
-  // certificate is assumed to have been obtained through some other secure
-  // channel (such as the signaling channel). This must specify the terminal
-  // certificate, not just a CA. SSLStream makes a copy of the digest value.
-  //
-  // Returns true if successful.
-  // |error| is optional and provides more information about the failure.
-  virtual bool SetPeerCertificateDigest(
-      const std::string& digest_alg,
-      const unsigned char* digest_val,
-      size_t digest_len,
-      SSLPeerCertificateDigestError* error = nullptr) = 0;
-
-  // Retrieves the peer's X.509 certificate, if a connection has been
-  // established. It returns the transmitted over SSL, including the entire
-  // chain.
-  virtual std::unique_ptr<SSLCertificate> GetPeerCertificate() const = 0;
-
-  // Retrieves the IANA registration id of the cipher suite used for the
-  // connection (e.g. 0x2F for "TLS_RSA_WITH_AES_128_CBC_SHA").
-  virtual bool GetSslCipherSuite(int* cipher_suite);
-
-  virtual int GetSslVersion() const = 0;
-
-  // Key Exporter interface from RFC 5705
-  // Arguments are:
-  // label               -- the exporter label.
-  //                        part of the RFC defining each exporter
-  //                        usage (IN)
-  // context/context_len -- a context to bind to for this connection;
-  //                        optional, can be null, 0 (IN)
-  // use_context         -- whether to use the context value
-  //                        (needed to distinguish no context from
-  //                        zero-length ones).
-  // result              -- where to put the computed value
-  // result_len          -- the length of the computed value
-  virtual bool ExportKeyingMaterial(const std::string& label,
-                                    const uint8_t* context,
-                                    size_t context_len,
-                                    bool use_context,
-                                    uint8_t* result,
-                                    size_t result_len);
-
-  // DTLS-SRTP interface
-  virtual bool SetDtlsSrtpCryptoSuites(const std::vector<int>& crypto_suites);
-  virtual bool GetDtlsSrtpCryptoSuite(int* crypto_suite);
-
-  // Returns true if a TLS connection has been established.
-  // The only difference between this and "GetState() == SE_OPEN" is that if
-  // the peer certificate digest hasn't been verified, the state will still be
-  // SS_OPENING but IsTlsConnected should return true.
-  virtual bool IsTlsConnected() = 0;
-
-  // Capabilities testing.
-  // Used to have "DTLS supported", "DTLS-SRTP supported" etc. methods, but now
-  // that's assumed.
-  static bool IsBoringSsl();
-
-  // Returns true iff the supplied cipher is deemed to be strong.
-  // TODO(torbjorng): Consider removing the KeyType argument.
-  static bool IsAcceptableCipher(int cipher, KeyType key_type);
-  static bool IsAcceptableCipher(const std::string& cipher, KeyType key_type);
-
-  // TODO(guoweis): Move this away from a static class method. Currently this is
-  // introduced such that any caller could depend on sslstreamadapter.h without
-  // depending on specific SSL implementation.
-  static std::string SslCipherSuiteToName(int cipher_suite);
-
-  // Use our timeutils.h source of timing in BoringSSL, allowing us to test
-  // using a fake clock.
-  static void enable_time_callback_for_testing();
-
-  sigslot::signal1<SSLHandshakeError> SignalSSLHandshakeError;
-
- private:
-  // If true, the server certificate need not match the configured
-  // server_name, and in fact missing certificate authority and other
-  // verification errors are ignored.
-  bool ignore_bad_cert_;
-
-  // If true (default), the client is required to provide a certificate during
-  // handshake. If no certificate is given, handshake fails. This applies to
-  // server mode only.
-  bool client_auth_enabled_;
-};
-
-}  // namespace rtc
-
-#endif  // WEBRTC_RTC_BASE_SSLSTREAMADAPTER_H_
diff --git a/rtc_base/sslstreamadapter_unittest.cc b/rtc_base/sslstreamadapter_unittest.cc
deleted file mode 100644
index a2d63e8..0000000
--- a/rtc_base/sslstreamadapter_unittest.cc
+++ /dev/null
@@ -1,1352 +0,0 @@
-/*
- *  Copyright 2011 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 <algorithm>
-#include <memory>
-#include <set>
-#include <string>
-
-#include "webrtc/rtc_base/bufferqueue.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/gunit.h"
-#include "webrtc/rtc_base/helpers.h"
-#include "webrtc/rtc_base/ssladapter.h"
-#include "webrtc/rtc_base/sslidentity.h"
-#include "webrtc/rtc_base/sslstreamadapter.h"
-#include "webrtc/rtc_base/stream.h"
-
-using ::testing::WithParamInterface;
-using ::testing::Values;
-using ::testing::Combine;
-using ::testing::tuple;
-
-static const int kBlockSize = 4096;
-static const char kExporterLabel[] = "label";
-static const unsigned char kExporterContext[] = "context";
-static int kExporterContextLen = sizeof(kExporterContext);
-
-static const char kRSA_PRIVATE_KEY_PEM[] =
-    "-----BEGIN RSA PRIVATE KEY-----\n"
-    "MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAMYRkbhmI7kVA/rM\n"
-    "czsZ+6JDhDvnkF+vn6yCAGuRPV03zuRqZtDy4N4to7PZu9PjqrRl7nDMXrG3YG9y\n"
-    "rlIAZ72KjcKKFAJxQyAKLCIdawKRyp8RdK3LEySWEZb0AV58IadqPZDTNHHRX8dz\n"
-    "5aTSMsbbkZ+C/OzTnbiMqLL/vg6jAgMBAAECgYAvgOs4FJcgvp+TuREx7YtiYVsH\n"
-    "mwQPTum2z/8VzWGwR8BBHBvIpVe1MbD/Y4seyI2aco/7UaisatSgJhsU46/9Y4fq\n"
-    "2TwXH9QANf4at4d9n/R6rzwpAJOpgwZgKvdQjkfrKTtgLV+/dawvpxUYkRH4JZM1\n"
-    "CVGukMfKNrSVH4Ap4QJBAOJmGV1ASPnB4r4nc99at7JuIJmd7fmuVUwUgYi4XgaR\n"
-    "WhScBsgYwZ/JoywdyZJgnbcrTDuVcWG56B3vXbhdpMsCQQDf9zeJrjnPZ3Cqm79y\n"
-    "kdqANep0uwZciiNiWxsQrCHztywOvbFhdp8iYVFG9EK8DMY41Y5TxUwsHD+67zao\n"
-    "ZNqJAkEA1suLUP/GvL8IwuRneQd2tWDqqRQ/Td3qq03hP7e77XtF/buya3Ghclo5\n"
-    "54czUR89QyVfJEC6278nzA7n2h1uVQJAcG6mztNL6ja/dKZjYZye2CY44QjSlLo0\n"
-    "MTgTSjdfg/28fFn2Jjtqf9Pi/X+50LWI/RcYMC2no606wRk9kyOuIQJBAK6VSAim\n"
-    "1pOEjsYQn0X5KEIrz1G3bfCbB848Ime3U2/FWlCHMr6ch8kCZ5d1WUeJD3LbwMNG\n"
-    "UCXiYxSsu20QNVw=\n"
-    "-----END RSA PRIVATE KEY-----\n";
-
-static const char kCERT_PEM[] =
-    "-----BEGIN CERTIFICATE-----\n"
-    "MIIBmTCCAQKgAwIBAgIEbzBSAjANBgkqhkiG9w0BAQsFADARMQ8wDQYDVQQDEwZX\n"
-    "ZWJSVEMwHhcNMTQwMTAyMTgyNDQ3WhcNMTQwMjAxMTgyNDQ3WjARMQ8wDQYDVQQD\n"
-    "EwZXZWJSVEMwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMYRkbhmI7kVA/rM\n"
-    "czsZ+6JDhDvnkF+vn6yCAGuRPV03zuRqZtDy4N4to7PZu9PjqrRl7nDMXrG3YG9y\n"
-    "rlIAZ72KjcKKFAJxQyAKLCIdawKRyp8RdK3LEySWEZb0AV58IadqPZDTNHHRX8dz\n"
-    "5aTSMsbbkZ+C/OzTnbiMqLL/vg6jAgMBAAEwDQYJKoZIhvcNAQELBQADgYEAUflI\n"
-    "VUe5Krqf5RVa5C3u/UTAOAUJBiDS3VANTCLBxjuMsvqOG0WvaYWP3HYPgrz0jXK2\n"
-    "LJE/mGw3MyFHEqi81jh95J+ypl6xKW6Rm8jKLR87gUvCaVYn/Z4/P3AqcQTB7wOv\n"
-    "UD0A8qfhfDM+LK6rPAnCsVN0NRDY3jvd6rzix9M=\n"
-    "-----END CERTIFICATE-----\n";
-
-class SSLStreamAdapterTestBase;
-
-class SSLDummyStreamBase : public rtc::StreamInterface,
-                           public sigslot::has_slots<> {
- public:
-  SSLDummyStreamBase(SSLStreamAdapterTestBase* test,
-                     const std::string &side,
-                     rtc::StreamInterface* in,
-                     rtc::StreamInterface* out) :
-      test_base_(test),
-      side_(side),
-      in_(in),
-      out_(out),
-      first_packet_(true) {
-    in_->SignalEvent.connect(this, &SSLDummyStreamBase::OnEventIn);
-    out_->SignalEvent.connect(this, &SSLDummyStreamBase::OnEventOut);
-  }
-
-  rtc::StreamState GetState() const override { return rtc::SS_OPEN; }
-
-  rtc::StreamResult Read(void* buffer, size_t buffer_len,
-                         size_t* read, int* error) override {
-    rtc::StreamResult r;
-
-    r = in_->Read(buffer, buffer_len, read, error);
-    if (r == rtc::SR_BLOCK)
-      return rtc::SR_BLOCK;
-    if (r == rtc::SR_EOS)
-      return rtc::SR_EOS;
-
-    if (r != rtc::SR_SUCCESS) {
-      ADD_FAILURE();
-      return rtc::SR_ERROR;
-    }
-
-    return rtc::SR_SUCCESS;
-  }
-
-  // Catch readability events on in and pass them up.
-  void OnEventIn(rtc::StreamInterface* stream, int sig, int err) {
-    int mask = (rtc::SE_READ | rtc::SE_CLOSE);
-
-    if (sig & mask) {
-      LOG(LS_VERBOSE) << "SSLDummyStreamBase::OnEvent side=" << side_
-                      << " sig=" << sig << " forwarding upward";
-      PostEvent(sig & mask, 0);
-    }
-  }
-
-  // Catch writeability events on out and pass them up.
-  void OnEventOut(rtc::StreamInterface* stream, int sig, int err) {
-    if (sig & rtc::SE_WRITE) {
-      LOG(LS_VERBOSE) << "SSLDummyStreamBase::OnEvent side=" << side_
-                      << " sig=" << sig << " forwarding upward";
-
-      PostEvent(sig & rtc::SE_WRITE, 0);
-    }
-  }
-
-  // Write to the outgoing FifoBuffer
-  rtc::StreamResult WriteData(const void* data, size_t data_len,
-                              size_t* written, int* error) {
-    return out_->Write(data, data_len, written, error);
-  }
-
-  rtc::StreamResult Write(const void* data, size_t data_len,
-                          size_t* written, int* error) override;
-
-  void Close() override {
-    LOG(LS_INFO) << "Closing outbound stream";
-    out_->Close();
-  }
-
- protected:
-  SSLStreamAdapterTestBase* test_base_;
-  const std::string side_;
-  rtc::StreamInterface* in_;
-  rtc::StreamInterface* out_;
-  bool first_packet_;
-};
-
-class SSLDummyStreamTLS : public SSLDummyStreamBase {
- public:
-  SSLDummyStreamTLS(SSLStreamAdapterTestBase* test,
-                    const std::string& side,
-                    rtc::FifoBuffer* in,
-                    rtc::FifoBuffer* out) :
-      SSLDummyStreamBase(test, side, in, out) {
-  }
-};
-
-class BufferQueueStream : public rtc::BufferQueue,
-                          public rtc::StreamInterface {
- public:
-  BufferQueueStream(size_t capacity, size_t default_size)
-      : rtc::BufferQueue(capacity, default_size) {
-  }
-
-  // Implementation of abstract StreamInterface methods.
-
-  // A buffer queue stream is always "open".
-  rtc::StreamState GetState() const override { return rtc::SS_OPEN; }
-
-  // Reading a buffer queue stream will either succeed or block.
-  rtc::StreamResult Read(void* buffer, size_t buffer_len,
-                         size_t* read, int* error) override {
-    if (!ReadFront(buffer, buffer_len, read)) {
-      return rtc::SR_BLOCK;
-    }
-    return rtc::SR_SUCCESS;
-  }
-
-  // Writing to a buffer queue stream will either succeed or block.
-  rtc::StreamResult Write(const void* data, size_t data_len,
-                          size_t* written, int* error) override {
-    if (!WriteBack(data, data_len, written)) {
-      return rtc::SR_BLOCK;
-    }
-    return rtc::SR_SUCCESS;
-  }
-
-  // A buffer queue stream can not be closed.
-  void Close() override {}
-
- protected:
-  void NotifyReadableForTest() override {
-    PostEvent(rtc::SE_READ, 0);
-  }
-
-  void NotifyWritableForTest() override {
-    PostEvent(rtc::SE_WRITE, 0);
-  }
-};
-
-class SSLDummyStreamDTLS : public SSLDummyStreamBase {
- public:
-  SSLDummyStreamDTLS(SSLStreamAdapterTestBase* test,
-                     const std::string& side,
-                     BufferQueueStream* in,
-                     BufferQueueStream* out) :
-      SSLDummyStreamBase(test, side, in, out) {
-  }
-};
-
-static const int kFifoBufferSize = 4096;
-static const int kBufferCapacity = 1;
-static const size_t kDefaultBufferSize = 2048;
-
-class SSLStreamAdapterTestBase : public testing::Test,
-                                 public sigslot::has_slots<> {
- public:
-  SSLStreamAdapterTestBase(
-      const std::string& client_cert_pem,
-      const std::string& client_private_key_pem,
-      bool dtls,
-      rtc::KeyParams client_key_type = rtc::KeyParams(rtc::KT_DEFAULT),
-      rtc::KeyParams server_key_type = rtc::KeyParams(rtc::KT_DEFAULT))
-      : client_cert_pem_(client_cert_pem),
-        client_private_key_pem_(client_private_key_pem),
-        client_key_type_(client_key_type),
-        server_key_type_(server_key_type),
-        client_stream_(nullptr),
-        server_stream_(nullptr),
-        client_identity_(nullptr),
-        server_identity_(nullptr),
-        delay_(0),
-        mtu_(1460),
-        loss_(0),
-        lose_first_packet_(false),
-        damage_(false),
-        dtls_(dtls),
-        handshake_wait_(5000),
-        identities_set_(false) {
-    // Set use of the test RNG to get predictable loss patterns.
-    rtc::SetRandomTestMode(true);
-  }
-
-  ~SSLStreamAdapterTestBase() {
-    // Put it back for the next test.
-    rtc::SetRandomTestMode(false);
-  }
-
-  void SetUp() override {
-    CreateStreams();
-
-    client_ssl_.reset(rtc::SSLStreamAdapter::Create(client_stream_));
-    server_ssl_.reset(rtc::SSLStreamAdapter::Create(server_stream_));
-
-    // Set up the slots
-    client_ssl_->SignalEvent.connect(this, &SSLStreamAdapterTestBase::OnEvent);
-    server_ssl_->SignalEvent.connect(this, &SSLStreamAdapterTestBase::OnEvent);
-
-    if (!client_cert_pem_.empty() && !client_private_key_pem_.empty()) {
-      client_identity_ = rtc::SSLIdentity::FromPEMStrings(
-          client_private_key_pem_, client_cert_pem_);
-    } else {
-      client_identity_ = rtc::SSLIdentity::Generate("client", client_key_type_);
-    }
-    server_identity_ = rtc::SSLIdentity::Generate("server", server_key_type_);
-
-    client_ssl_->SetIdentity(client_identity_);
-    server_ssl_->SetIdentity(server_identity_);
-  }
-
-  void TearDown() override {
-    client_ssl_.reset(nullptr);
-    server_ssl_.reset(nullptr);
-  }
-
-  virtual void CreateStreams() = 0;
-
-  // Recreate the client/server identities with the specified validity period.
-  // |not_before| and |not_after| are offsets from the current time in number
-  // of seconds.
-  void ResetIdentitiesWithValidity(int not_before, int not_after) {
-    CreateStreams();
-
-    client_ssl_.reset(rtc::SSLStreamAdapter::Create(client_stream_));
-    server_ssl_.reset(rtc::SSLStreamAdapter::Create(server_stream_));
-
-    client_ssl_->SignalEvent.connect(this, &SSLStreamAdapterTestBase::OnEvent);
-    server_ssl_->SignalEvent.connect(this, &SSLStreamAdapterTestBase::OnEvent);
-
-    time_t now = time(nullptr);
-
-    rtc::SSLIdentityParams client_params;
-    client_params.key_params = rtc::KeyParams(rtc::KT_DEFAULT);
-    client_params.common_name = "client";
-    client_params.not_before = now + not_before;
-    client_params.not_after = now + not_after;
-    client_identity_ = rtc::SSLIdentity::GenerateForTest(client_params);
-
-    rtc::SSLIdentityParams server_params;
-    server_params.key_params = rtc::KeyParams(rtc::KT_DEFAULT);
-    server_params.common_name = "server";
-    server_params.not_before = now + not_before;
-    server_params.not_after = now + not_after;
-    server_identity_ = rtc::SSLIdentity::GenerateForTest(server_params);
-
-    client_ssl_->SetIdentity(client_identity_);
-    server_ssl_->SetIdentity(server_identity_);
-  }
-
-  virtual void OnEvent(rtc::StreamInterface *stream, int sig, int err) {
-    LOG(LS_VERBOSE) << "SSLStreamAdapterTestBase::OnEvent sig=" << sig;
-
-    if (sig & rtc::SE_READ) {
-      ReadData(stream);
-    }
-
-    if ((stream == client_ssl_.get()) && (sig & rtc::SE_WRITE)) {
-      WriteData();
-    }
-  }
-
-  void SetPeerIdentitiesByDigest(bool correct, bool expect_success) {
-    unsigned char server_digest[20];
-    size_t server_digest_len;
-    unsigned char client_digest[20];
-    size_t client_digest_len;
-    bool rv;
-    rtc::SSLPeerCertificateDigestError err;
-    rtc::SSLPeerCertificateDigestError expected_err =
-        expect_success
-            ? rtc::SSLPeerCertificateDigestError::NONE
-            : rtc::SSLPeerCertificateDigestError::VERIFICATION_FAILED;
-
-    LOG(LS_INFO) << "Setting peer identities by digest";
-
-    rv = server_identity_->certificate().ComputeDigest(
-        rtc::DIGEST_SHA_1, server_digest, 20, &server_digest_len);
-    ASSERT_TRUE(rv);
-    rv = client_identity_->certificate().ComputeDigest(
-        rtc::DIGEST_SHA_1, client_digest, 20, &client_digest_len);
-    ASSERT_TRUE(rv);
-
-    if (!correct) {
-      LOG(LS_INFO) << "Setting bogus digest for server cert";
-      server_digest[0]++;
-    }
-    rv = client_ssl_->SetPeerCertificateDigest(rtc::DIGEST_SHA_1, server_digest,
-                                               server_digest_len, &err);
-    EXPECT_EQ(expected_err, err);
-    EXPECT_EQ(expect_success, rv);
-
-    if (!correct) {
-      LOG(LS_INFO) << "Setting bogus digest for client cert";
-      client_digest[0]++;
-    }
-    rv = server_ssl_->SetPeerCertificateDigest(rtc::DIGEST_SHA_1, client_digest,
-                                               client_digest_len, &err);
-    EXPECT_EQ(expected_err, err);
-    EXPECT_EQ(expect_success, rv);
-
-    identities_set_ = true;
-  }
-
-  void SetupProtocolVersions(rtc::SSLProtocolVersion server_version,
-                             rtc::SSLProtocolVersion client_version) {
-    server_ssl_->SetMaxProtocolVersion(server_version);
-    client_ssl_->SetMaxProtocolVersion(client_version);
-  }
-
-  void TestHandshake(bool expect_success = true) {
-    server_ssl_->SetMode(dtls_ ? rtc::SSL_MODE_DTLS :
-                         rtc::SSL_MODE_TLS);
-    client_ssl_->SetMode(dtls_ ? rtc::SSL_MODE_DTLS :
-                         rtc::SSL_MODE_TLS);
-
-    if (!dtls_) {
-      // Make sure we simulate a reliable network for TLS.
-      // This is just a check to make sure that people don't write wrong
-      // tests.
-      RTC_CHECK_EQ(1460, mtu_);
-      RTC_CHECK(!loss_);
-      RTC_CHECK(!lose_first_packet_);
-    }
-
-    if (!identities_set_)
-      SetPeerIdentitiesByDigest(true, true);
-
-    // Start the handshake
-    int rv;
-
-    server_ssl_->SetServerRole();
-    rv = server_ssl_->StartSSL();
-    ASSERT_EQ(0, rv);
-
-    rv = client_ssl_->StartSSL();
-    ASSERT_EQ(0, rv);
-
-    // Now run the handshake
-    if (expect_success) {
-      EXPECT_TRUE_WAIT((client_ssl_->GetState() == rtc::SS_OPEN)
-                       && (server_ssl_->GetState() == rtc::SS_OPEN),
-                       handshake_wait_);
-    } else {
-      EXPECT_TRUE_WAIT(client_ssl_->GetState() == rtc::SS_CLOSED,
-                       handshake_wait_);
-    }
-  }
-
-  // This tests that the handshake can complete before the identity is
-  // verified, and the identity will be verified after the fact.
-  void TestHandshakeWithDelayedIdentity(bool valid_identity) {
-    server_ssl_->SetMode(dtls_ ? rtc::SSL_MODE_DTLS : rtc::SSL_MODE_TLS);
-    client_ssl_->SetMode(dtls_ ? rtc::SSL_MODE_DTLS : rtc::SSL_MODE_TLS);
-
-    if (!dtls_) {
-      // Make sure we simulate a reliable network for TLS.
-      // This is just a check to make sure that people don't write wrong
-      // tests.
-      RTC_CHECK_EQ(1460, mtu_);
-      RTC_CHECK(!loss_);
-      RTC_CHECK(!lose_first_packet_);
-    }
-
-    // Start the handshake
-    int rv;
-
-    server_ssl_->SetServerRole();
-    rv = server_ssl_->StartSSL();
-    ASSERT_EQ(0, rv);
-
-    rv = client_ssl_->StartSSL();
-    ASSERT_EQ(0, rv);
-
-    // Now run the handshake.
-    EXPECT_TRUE_WAIT(
-        client_ssl_->IsTlsConnected() && server_ssl_->IsTlsConnected(),
-        handshake_wait_);
-
-    // Until the identity has been verified, the state should still be
-    // SS_OPENING and writes should return SR_BLOCK.
-    EXPECT_EQ(rtc::SS_OPENING, client_ssl_->GetState());
-    EXPECT_EQ(rtc::SS_OPENING, server_ssl_->GetState());
-    unsigned char packet[1];
-    size_t sent;
-    EXPECT_EQ(rtc::SR_BLOCK, client_ssl_->Write(&packet, 1, &sent, 0));
-    EXPECT_EQ(rtc::SR_BLOCK, server_ssl_->Write(&packet, 1, &sent, 0));
-
-    // If we set an invalid identity at this point, SetPeerCertificateDigest
-    // should return false.
-    SetPeerIdentitiesByDigest(valid_identity, valid_identity);
-    // State should then transition to SS_OPEN or SS_CLOSED based on validation
-    // of the identity.
-    if (valid_identity) {
-      EXPECT_EQ(rtc::SS_OPEN, client_ssl_->GetState());
-      EXPECT_EQ(rtc::SS_OPEN, server_ssl_->GetState());
-    } else {
-      EXPECT_EQ(rtc::SS_CLOSED, client_ssl_->GetState());
-      EXPECT_EQ(rtc::SS_CLOSED, server_ssl_->GetState());
-    }
-  }
-
-  rtc::StreamResult DataWritten(SSLDummyStreamBase *from, const void *data,
-                                size_t data_len, size_t *written,
-                                int *error) {
-    // Randomly drop loss_ percent of packets
-    if (rtc::CreateRandomId() % 100 < static_cast<uint32_t>(loss_)) {
-      LOG(LS_VERBOSE) << "Randomly dropping packet, size=" << data_len;
-      *written = data_len;
-      return rtc::SR_SUCCESS;
-    }
-    if (dtls_ && (data_len > mtu_)) {
-      LOG(LS_VERBOSE) << "Dropping packet > mtu, size=" << data_len;
-      *written = data_len;
-      return rtc::SR_SUCCESS;
-    }
-
-    // Optionally damage application data (type 23). Note that we don't damage
-    // handshake packets and we damage the last byte to keep the header
-    // intact but break the MAC.
-    if (damage_ && (*static_cast<const unsigned char *>(data) == 23)) {
-      std::vector<char> buf(data_len);
-
-      LOG(LS_VERBOSE) << "Damaging packet";
-
-      memcpy(&buf[0], data, data_len);
-      buf[data_len - 1]++;
-
-      return from->WriteData(&buf[0], data_len, written, error);
-    }
-
-    return from->WriteData(data, data_len, written, error);
-  }
-
-  void SetDelay(int delay) {
-    delay_ = delay;
-  }
-  int GetDelay() { return delay_; }
-
-  void SetLoseFirstPacket(bool lose) {
-    lose_first_packet_ = lose;
-  }
-  bool GetLoseFirstPacket() { return lose_first_packet_; }
-
-  void SetLoss(int percent) {
-    loss_ = percent;
-  }
-
-  void SetDamage() {
-    damage_ = true;
-  }
-
-  void SetMtu(size_t mtu) {
-    mtu_ = mtu;
-  }
-
-  void SetHandshakeWait(int wait) {
-    handshake_wait_ = wait;
-  }
-
-  void SetDtlsSrtpCryptoSuites(const std::vector<int>& ciphers, bool client) {
-    if (client)
-      client_ssl_->SetDtlsSrtpCryptoSuites(ciphers);
-    else
-      server_ssl_->SetDtlsSrtpCryptoSuites(ciphers);
-  }
-
-  bool GetDtlsSrtpCryptoSuite(bool client, int* retval) {
-    if (client)
-      return client_ssl_->GetDtlsSrtpCryptoSuite(retval);
-    else
-      return server_ssl_->GetDtlsSrtpCryptoSuite(retval);
-  }
-
-  std::unique_ptr<rtc::SSLCertificate> GetPeerCertificate(bool client) {
-    if (client)
-      return client_ssl_->GetPeerCertificate();
-    else
-      return server_ssl_->GetPeerCertificate();
-  }
-
-  bool GetSslCipherSuite(bool client, int* retval) {
-    if (client)
-      return client_ssl_->GetSslCipherSuite(retval);
-    else
-      return server_ssl_->GetSslCipherSuite(retval);
-  }
-
-  int GetSslVersion(bool client) {
-    if (client)
-      return client_ssl_->GetSslVersion();
-    else
-      return server_ssl_->GetSslVersion();
-  }
-
-  bool ExportKeyingMaterial(const char *label,
-                            const unsigned char *context,
-                            size_t context_len,
-                            bool use_context,
-                            bool client,
-                            unsigned char *result,
-                            size_t result_len) {
-    if (client)
-      return client_ssl_->ExportKeyingMaterial(label,
-                                               context, context_len,
-                                               use_context,
-                                               result, result_len);
-    else
-      return server_ssl_->ExportKeyingMaterial(label,
-                                               context, context_len,
-                                               use_context,
-                                               result, result_len);
-  }
-
-  // To be implemented by subclasses.
-  virtual void WriteData() = 0;
-  virtual void ReadData(rtc::StreamInterface *stream) = 0;
-  virtual void TestTransfer(int size) = 0;
-
- protected:
-  std::string client_cert_pem_;
-  std::string client_private_key_pem_;
-  rtc::KeyParams client_key_type_;
-  rtc::KeyParams server_key_type_;
-  SSLDummyStreamBase *client_stream_;  // freed by client_ssl_ destructor
-  SSLDummyStreamBase *server_stream_;  // freed by server_ssl_ destructor
-  std::unique_ptr<rtc::SSLStreamAdapter> client_ssl_;
-  std::unique_ptr<rtc::SSLStreamAdapter> server_ssl_;
-  rtc::SSLIdentity *client_identity_;  // freed by client_ssl_ destructor
-  rtc::SSLIdentity *server_identity_;  // freed by server_ssl_ destructor
-  int delay_;
-  size_t mtu_;
-  int loss_;
-  bool lose_first_packet_;
-  bool damage_;
-  bool dtls_;
-  int handshake_wait_;
-  bool identities_set_;
-};
-
-class SSLStreamAdapterTestTLS
-    : public SSLStreamAdapterTestBase,
-      public WithParamInterface<tuple<rtc::KeyParams, rtc::KeyParams>> {
- public:
-  SSLStreamAdapterTestTLS()
-      : SSLStreamAdapterTestBase("",
-                                 "",
-                                 false,
-                                 ::testing::get<0>(GetParam()),
-                                 ::testing::get<1>(GetParam())),
-        client_buffer_(kFifoBufferSize),
-        server_buffer_(kFifoBufferSize) {
-  }
-
-  void CreateStreams() override {
-    client_stream_ =
-        new SSLDummyStreamTLS(this, "c2s", &client_buffer_, &server_buffer_);
-    server_stream_ =
-        new SSLDummyStreamTLS(this, "s2c", &server_buffer_, &client_buffer_);
-  }
-
-  // Test data transfer for TLS
-  void TestTransfer(int size) override {
-    LOG(LS_INFO) << "Starting transfer test with " << size << " bytes";
-    // Create some dummy data to send.
-    size_t received;
-
-    send_stream_.ReserveSize(size);
-    for (int i = 0; i < size; ++i) {
-      char ch = static_cast<char>(i);
-      send_stream_.Write(&ch, 1, nullptr, nullptr);
-    }
-    send_stream_.Rewind();
-
-    // Prepare the receive stream.
-    recv_stream_.ReserveSize(size);
-
-    // Start sending
-    WriteData();
-
-    // Wait for the client to close
-    EXPECT_TRUE_WAIT(server_ssl_->GetState() == rtc::SS_CLOSED, 10000);
-
-    // Now check the data
-    recv_stream_.GetSize(&received);
-
-    EXPECT_EQ(static_cast<size_t>(size), received);
-    EXPECT_EQ(0, memcmp(send_stream_.GetBuffer(),
-                        recv_stream_.GetBuffer(), size));
-  }
-
-  void WriteData() override {
-    size_t position, tosend, size;
-    rtc::StreamResult rv;
-    size_t sent;
-    char block[kBlockSize];
-
-    send_stream_.GetSize(&size);
-    if (!size)
-      return;
-
-    for (;;) {
-      send_stream_.GetPosition(&position);
-      if (send_stream_.Read(block, sizeof(block), &tosend, nullptr) !=
-          rtc::SR_EOS) {
-        rv = client_ssl_->Write(block, tosend, &sent, 0);
-
-        if (rv == rtc::SR_SUCCESS) {
-          send_stream_.SetPosition(position + sent);
-          LOG(LS_VERBOSE) << "Sent: " << position + sent;
-        } else if (rv == rtc::SR_BLOCK) {
-          LOG(LS_VERBOSE) << "Blocked...";
-          send_stream_.SetPosition(position);
-          break;
-        } else {
-          ADD_FAILURE();
-          break;
-        }
-      } else {
-        // Now close
-        LOG(LS_INFO) << "Wrote " << position << " bytes. Closing";
-        client_ssl_->Close();
-        break;
-      }
-    }
-  };
-
-  void ReadData(rtc::StreamInterface *stream) override {
-    char buffer[1600];
-    size_t bread;
-    int err2;
-    rtc::StreamResult r;
-
-    for (;;) {
-      r = stream->Read(buffer, sizeof(buffer), &bread, &err2);
-
-      if (r == rtc::SR_ERROR || r == rtc::SR_EOS) {
-        // Unfortunately, errors are the way that the stream adapter
-        // signals close in OpenSSL.
-        stream->Close();
-        return;
-      }
-
-      if (r == rtc::SR_BLOCK)
-        break;
-
-      ASSERT_EQ(rtc::SR_SUCCESS, r);
-      LOG(LS_VERBOSE) << "Read " << bread;
-
-      recv_stream_.Write(buffer, bread, nullptr, nullptr);
-    }
-  }
-
- private:
-  rtc::FifoBuffer client_buffer_;
-  rtc::FifoBuffer server_buffer_;
-  rtc::MemoryStream send_stream_;
-  rtc::MemoryStream recv_stream_;
-};
-
-class SSLStreamAdapterTestDTLS
-    : public SSLStreamAdapterTestBase,
-      public WithParamInterface<tuple<rtc::KeyParams, rtc::KeyParams>> {
- public:
-  SSLStreamAdapterTestDTLS()
-      : SSLStreamAdapterTestBase("",
-                                 "",
-                                 true,
-                                 ::testing::get<0>(GetParam()),
-                                 ::testing::get<1>(GetParam())),
-        client_buffer_(kBufferCapacity, kDefaultBufferSize),
-        server_buffer_(kBufferCapacity, kDefaultBufferSize),
-        packet_size_(1000),
-        count_(0),
-        sent_(0) {}
-
-  SSLStreamAdapterTestDTLS(const std::string& cert_pem,
-                           const std::string& private_key_pem) :
-      SSLStreamAdapterTestBase(cert_pem, private_key_pem, true),
-      client_buffer_(kBufferCapacity, kDefaultBufferSize),
-      server_buffer_(kBufferCapacity, kDefaultBufferSize),
-      packet_size_(1000), count_(0), sent_(0) {
-  }
-
-  void CreateStreams() override {
-    client_stream_ =
-        new SSLDummyStreamDTLS(this, "c2s", &client_buffer_, &server_buffer_);
-    server_stream_ =
-        new SSLDummyStreamDTLS(this, "s2c", &server_buffer_, &client_buffer_);
-  }
-
-  void WriteData() override {
-    unsigned char *packet = new unsigned char[1600];
-
-    while (sent_ < count_) {
-      unsigned int rand_state = sent_;
-      packet[0] = sent_;
-      for (size_t i = 1; i < packet_size_; i++) {
-        // This is a simple LC PRNG.  Keep in synch with identical code below.
-        rand_state = (rand_state * 251 + 19937) >> 7;
-        packet[i] = rand_state & 0xff;
-      }
-
-      size_t sent;
-      rtc::StreamResult rv = client_ssl_->Write(packet, packet_size_, &sent, 0);
-      if (rv == rtc::SR_SUCCESS) {
-        LOG(LS_VERBOSE) << "Sent: " << sent_;
-        sent_++;
-      } else if (rv == rtc::SR_BLOCK) {
-        LOG(LS_VERBOSE) << "Blocked...";
-        break;
-      } else {
-        ADD_FAILURE();
-        break;
-      }
-    }
-
-    delete [] packet;
-  }
-
-  void ReadData(rtc::StreamInterface *stream) override {
-    unsigned char buffer[2000];
-    size_t bread;
-    int err2;
-    rtc::StreamResult r;
-
-    for (;;) {
-      r = stream->Read(buffer, 2000, &bread, &err2);
-
-      if (r == rtc::SR_ERROR) {
-        // Unfortunately, errors are the way that the stream adapter
-        // signals close right now
-        stream->Close();
-        return;
-      }
-
-      if (r == rtc::SR_BLOCK)
-        break;
-
-      ASSERT_EQ(rtc::SR_SUCCESS, r);
-      LOG(LS_VERBOSE) << "Read " << bread;
-
-      // Now parse the datagram
-      ASSERT_EQ(packet_size_, bread);
-      unsigned char packet_num = buffer[0];
-
-      unsigned int rand_state = packet_num;
-      for (size_t i = 1; i < packet_size_; i++) {
-        // This is a simple LC PRNG.  Keep in synch with identical code above.
-        rand_state = (rand_state * 251 + 19937) >> 7;
-        ASSERT_EQ(rand_state & 0xff, buffer[i]);
-      }
-      received_.insert(packet_num);
-    }
-  }
-
-  void TestTransfer(int count) override {
-    count_ = count;
-
-    WriteData();
-
-    EXPECT_TRUE_WAIT(sent_ == count_, 10000);
-    LOG(LS_INFO) << "sent_ == " << sent_;
-
-    if (damage_) {
-      WAIT(false, 2000);
-      EXPECT_EQ(0U, received_.size());
-    } else if (loss_ == 0) {
-        EXPECT_EQ_WAIT(static_cast<size_t>(sent_), received_.size(), 1000);
-    } else {
-      LOG(LS_INFO) << "Sent " << sent_ << " packets; received " <<
-          received_.size();
-    }
-  };
-
- private:
-  BufferQueueStream client_buffer_;
-  BufferQueueStream server_buffer_;
-  size_t packet_size_;
-  int count_;
-  int sent_;
-  std::set<int> received_;
-};
-
-
-rtc::StreamResult SSLDummyStreamBase::Write(const void* data, size_t data_len,
-                                              size_t* written, int* error) {
-  LOG(LS_VERBOSE) << "Writing to loopback " << data_len;
-
-  if (first_packet_) {
-    first_packet_ = false;
-    if (test_base_->GetLoseFirstPacket()) {
-      LOG(LS_INFO) << "Losing initial packet of length " << data_len;
-      *written = data_len;  // Fake successful writing also to writer.
-      return rtc::SR_SUCCESS;
-    }
-  }
-
-  return test_base_->DataWritten(this, data, data_len, written, error);
-};
-
-class SSLStreamAdapterTestDTLSFromPEMStrings : public SSLStreamAdapterTestDTLS {
- public:
-  SSLStreamAdapterTestDTLSFromPEMStrings() :
-      SSLStreamAdapterTestDTLS(kCERT_PEM, kRSA_PRIVATE_KEY_PEM) {
-  }
-};
-
-// Basic tests: TLS
-
-// Test that we can make a handshake work
-TEST_P(SSLStreamAdapterTestTLS, TestTLSConnect) {
-  TestHandshake();
-};
-
-// Test that closing the connection on one side updates the other side.
-TEST_P(SSLStreamAdapterTestTLS, TestTLSClose) {
-  TestHandshake();
-  client_ssl_->Close();
-  EXPECT_EQ_WAIT(rtc::SS_CLOSED, server_ssl_->GetState(), handshake_wait_);
-};
-
-// Test transfer -- trivial
-TEST_P(SSLStreamAdapterTestTLS, TestTLSTransfer) {
-  TestHandshake();
-  TestTransfer(100000);
-};
-
-// Test read-write after close.
-TEST_P(SSLStreamAdapterTestTLS, ReadWriteAfterClose) {
-  TestHandshake();
-  TestTransfer(100000);
-  client_ssl_->Close();
-
-  rtc::StreamResult rv;
-  char block[kBlockSize];
-  size_t dummy;
-
-  // It's an error to write after closed.
-  rv = client_ssl_->Write(block, sizeof(block), &dummy, nullptr);
-  ASSERT_EQ(rtc::SR_ERROR, rv);
-
-  // But after closed read gives you EOS.
-  rv = client_ssl_->Read(block, sizeof(block), &dummy, nullptr);
-  ASSERT_EQ(rtc::SR_EOS, rv);
-};
-
-// Test a handshake with a bogus peer digest
-TEST_P(SSLStreamAdapterTestTLS, TestTLSBogusDigest) {
-  SetPeerIdentitiesByDigest(false, true);
-  TestHandshake(false);
-};
-
-TEST_P(SSLStreamAdapterTestTLS, TestTLSDelayedIdentity) {
-  TestHandshakeWithDelayedIdentity(true);
-};
-
-TEST_P(SSLStreamAdapterTestTLS, TestTLSDelayedIdentityWithBogusDigest) {
-  TestHandshakeWithDelayedIdentity(false);
-};
-
-// Test that the correct error is returned when SetPeerCertificateDigest is
-// called with an unknown algorithm.
-TEST_P(SSLStreamAdapterTestTLS,
-       TestSetPeerCertificateDigestWithUnknownAlgorithm) {
-  unsigned char server_digest[20];
-  size_t server_digest_len;
-  bool rv;
-  rtc::SSLPeerCertificateDigestError err;
-
-  rv = server_identity_->certificate().ComputeDigest(
-      rtc::DIGEST_SHA_1, server_digest, 20, &server_digest_len);
-  ASSERT_TRUE(rv);
-
-  rv = client_ssl_->SetPeerCertificateDigest("unknown algorithm", server_digest,
-                                             server_digest_len, &err);
-  EXPECT_EQ(rtc::SSLPeerCertificateDigestError::UNKNOWN_ALGORITHM, err);
-  EXPECT_FALSE(rv);
-}
-
-// Test that the correct error is returned when SetPeerCertificateDigest is
-// called with an invalid digest length.
-TEST_P(SSLStreamAdapterTestTLS, TestSetPeerCertificateDigestWithInvalidLength) {
-  unsigned char server_digest[20];
-  size_t server_digest_len;
-  bool rv;
-  rtc::SSLPeerCertificateDigestError err;
-
-  rv = server_identity_->certificate().ComputeDigest(
-      rtc::DIGEST_SHA_1, server_digest, 20, &server_digest_len);
-  ASSERT_TRUE(rv);
-
-  rv = client_ssl_->SetPeerCertificateDigest(rtc::DIGEST_SHA_1, server_digest,
-                                             server_digest_len - 1, &err);
-  EXPECT_EQ(rtc::SSLPeerCertificateDigestError::INVALID_LENGTH, err);
-  EXPECT_FALSE(rv);
-}
-
-// Test moving a bunch of data
-
-// Basic tests: DTLS
-// Test that we can make a handshake work
-TEST_P(SSLStreamAdapterTestDTLS, TestDTLSConnect) {
-  TestHandshake();
-};
-
-// Test that we can make a handshake work if the first packet in
-// each direction is lost. This gives us predictable loss
-// rather than having to tune random
-TEST_P(SSLStreamAdapterTestDTLS, TestDTLSConnectWithLostFirstPacket) {
-  SetLoseFirstPacket(true);
-  TestHandshake();
-};
-
-// Test a handshake with loss and delay
-TEST_P(SSLStreamAdapterTestDTLS, TestDTLSConnectWithLostFirstPacketDelay2s) {
-  SetLoseFirstPacket(true);
-  SetDelay(2000);
-  SetHandshakeWait(20000);
-  TestHandshake();
-};
-
-// Test a handshake with small MTU
-// Disabled due to https://code.google.com/p/webrtc/issues/detail?id=3910
-TEST_P(SSLStreamAdapterTestDTLS, DISABLED_TestDTLSConnectWithSmallMtu) {
-  SetMtu(700);
-  SetHandshakeWait(20000);
-  TestHandshake();
-};
-
-// Test transfer -- trivial
-TEST_P(SSLStreamAdapterTestDTLS, TestDTLSTransfer) {
-  TestHandshake();
-  TestTransfer(100);
-};
-
-TEST_P(SSLStreamAdapterTestDTLS, TestDTLSTransferWithLoss) {
-  TestHandshake();
-  SetLoss(10);
-  TestTransfer(100);
-};
-
-TEST_P(SSLStreamAdapterTestDTLS, TestDTLSTransferWithDamage) {
-  SetDamage();  // Must be called first because first packet
-                // write happens at end of handshake.
-  TestHandshake();
-  TestTransfer(100);
-};
-
-TEST_P(SSLStreamAdapterTestDTLS, TestDTLSDelayedIdentity) {
-  TestHandshakeWithDelayedIdentity(true);
-};
-
-TEST_P(SSLStreamAdapterTestDTLS, TestDTLSDelayedIdentityWithBogusDigest) {
-  TestHandshakeWithDelayedIdentity(false);
-};
-
-// Test DTLS-SRTP with all high ciphers
-TEST_P(SSLStreamAdapterTestDTLS, TestDTLSSrtpHigh) {
-  std::vector<int> high;
-  high.push_back(rtc::SRTP_AES128_CM_SHA1_80);
-  SetDtlsSrtpCryptoSuites(high, true);
-  SetDtlsSrtpCryptoSuites(high, false);
-  TestHandshake();
-
-  int client_cipher;
-  ASSERT_TRUE(GetDtlsSrtpCryptoSuite(true, &client_cipher));
-  int server_cipher;
-  ASSERT_TRUE(GetDtlsSrtpCryptoSuite(false, &server_cipher));
-
-  ASSERT_EQ(client_cipher, server_cipher);
-  ASSERT_EQ(client_cipher, rtc::SRTP_AES128_CM_SHA1_80);
-};
-
-// Test DTLS-SRTP with all low ciphers
-TEST_P(SSLStreamAdapterTestDTLS, TestDTLSSrtpLow) {
-  std::vector<int> low;
-  low.push_back(rtc::SRTP_AES128_CM_SHA1_32);
-  SetDtlsSrtpCryptoSuites(low, true);
-  SetDtlsSrtpCryptoSuites(low, false);
-  TestHandshake();
-
-  int client_cipher;
-  ASSERT_TRUE(GetDtlsSrtpCryptoSuite(true, &client_cipher));
-  int server_cipher;
-  ASSERT_TRUE(GetDtlsSrtpCryptoSuite(false, &server_cipher));
-
-  ASSERT_EQ(client_cipher, server_cipher);
-  ASSERT_EQ(client_cipher, rtc::SRTP_AES128_CM_SHA1_32);
-};
-
-// Test DTLS-SRTP with a mismatch -- should not converge
-TEST_P(SSLStreamAdapterTestDTLS, TestDTLSSrtpHighLow) {
-  std::vector<int> high;
-  high.push_back(rtc::SRTP_AES128_CM_SHA1_80);
-  std::vector<int> low;
-  low.push_back(rtc::SRTP_AES128_CM_SHA1_32);
-  SetDtlsSrtpCryptoSuites(high, true);
-  SetDtlsSrtpCryptoSuites(low, false);
-  TestHandshake();
-
-  int client_cipher;
-  ASSERT_FALSE(GetDtlsSrtpCryptoSuite(true, &client_cipher));
-  int server_cipher;
-  ASSERT_FALSE(GetDtlsSrtpCryptoSuite(false, &server_cipher));
-};
-
-// Test DTLS-SRTP with each side being mixed -- should select high
-TEST_P(SSLStreamAdapterTestDTLS, TestDTLSSrtpMixed) {
-  std::vector<int> mixed;
-  mixed.push_back(rtc::SRTP_AES128_CM_SHA1_80);
-  mixed.push_back(rtc::SRTP_AES128_CM_SHA1_32);
-  SetDtlsSrtpCryptoSuites(mixed, true);
-  SetDtlsSrtpCryptoSuites(mixed, false);
-  TestHandshake();
-
-  int client_cipher;
-  ASSERT_TRUE(GetDtlsSrtpCryptoSuite(true, &client_cipher));
-  int server_cipher;
-  ASSERT_TRUE(GetDtlsSrtpCryptoSuite(false, &server_cipher));
-
-  ASSERT_EQ(client_cipher, server_cipher);
-  ASSERT_EQ(client_cipher, rtc::SRTP_AES128_CM_SHA1_80);
-};
-
-// Test DTLS-SRTP with all GCM-128 ciphers.
-TEST_P(SSLStreamAdapterTestDTLS, TestDTLSSrtpGCM128) {
-  std::vector<int> gcm128;
-  gcm128.push_back(rtc::SRTP_AEAD_AES_128_GCM);
-  SetDtlsSrtpCryptoSuites(gcm128, true);
-  SetDtlsSrtpCryptoSuites(gcm128, false);
-  TestHandshake();
-
-  int client_cipher;
-  ASSERT_TRUE(GetDtlsSrtpCryptoSuite(true, &client_cipher));
-  int server_cipher;
-  ASSERT_TRUE(GetDtlsSrtpCryptoSuite(false, &server_cipher));
-
-  ASSERT_EQ(client_cipher, server_cipher);
-  ASSERT_EQ(client_cipher, rtc::SRTP_AEAD_AES_128_GCM);
-};
-
-// Test DTLS-SRTP with all GCM-256 ciphers.
-TEST_P(SSLStreamAdapterTestDTLS, TestDTLSSrtpGCM256) {
-  std::vector<int> gcm256;
-  gcm256.push_back(rtc::SRTP_AEAD_AES_256_GCM);
-  SetDtlsSrtpCryptoSuites(gcm256, true);
-  SetDtlsSrtpCryptoSuites(gcm256, false);
-  TestHandshake();
-
-  int client_cipher;
-  ASSERT_TRUE(GetDtlsSrtpCryptoSuite(true, &client_cipher));
-  int server_cipher;
-  ASSERT_TRUE(GetDtlsSrtpCryptoSuite(false, &server_cipher));
-
-  ASSERT_EQ(client_cipher, server_cipher);
-  ASSERT_EQ(client_cipher, rtc::SRTP_AEAD_AES_256_GCM);
-};
-
-// Test DTLS-SRTP with mixed GCM-128/-256 ciphers -- should not converge.
-TEST_P(SSLStreamAdapterTestDTLS, TestDTLSSrtpGCMMismatch) {
-  std::vector<int> gcm128;
-  gcm128.push_back(rtc::SRTP_AEAD_AES_128_GCM);
-  std::vector<int> gcm256;
-  gcm256.push_back(rtc::SRTP_AEAD_AES_256_GCM);
-  SetDtlsSrtpCryptoSuites(gcm128, true);
-  SetDtlsSrtpCryptoSuites(gcm256, false);
-  TestHandshake();
-
-  int client_cipher;
-  ASSERT_FALSE(GetDtlsSrtpCryptoSuite(true, &client_cipher));
-  int server_cipher;
-  ASSERT_FALSE(GetDtlsSrtpCryptoSuite(false, &server_cipher));
-};
-
-// Test DTLS-SRTP with both GCM-128/-256 ciphers -- should select GCM-256.
-TEST_P(SSLStreamAdapterTestDTLS, TestDTLSSrtpGCMMixed) {
-  std::vector<int> gcmBoth;
-  gcmBoth.push_back(rtc::SRTP_AEAD_AES_256_GCM);
-  gcmBoth.push_back(rtc::SRTP_AEAD_AES_128_GCM);
-  SetDtlsSrtpCryptoSuites(gcmBoth, true);
-  SetDtlsSrtpCryptoSuites(gcmBoth, false);
-  TestHandshake();
-
-  int client_cipher;
-  ASSERT_TRUE(GetDtlsSrtpCryptoSuite(true, &client_cipher));
-  int server_cipher;
-  ASSERT_TRUE(GetDtlsSrtpCryptoSuite(false, &server_cipher));
-
-  ASSERT_EQ(client_cipher, server_cipher);
-  ASSERT_EQ(client_cipher, rtc::SRTP_AEAD_AES_256_GCM);
-};
-
-// Test SRTP cipher suite lengths.
-TEST_P(SSLStreamAdapterTestDTLS, TestDTLSSrtpKeyAndSaltLengths) {
-  int key_len;
-  int salt_len;
-
-  ASSERT_FALSE(rtc::GetSrtpKeyAndSaltLengths(
-      rtc::SRTP_INVALID_CRYPTO_SUITE, &key_len, &salt_len));
-
-  ASSERT_TRUE(rtc::GetSrtpKeyAndSaltLengths(
-      rtc::SRTP_AES128_CM_SHA1_32, &key_len, &salt_len));
-  ASSERT_EQ(128/8, key_len);
-  ASSERT_EQ(112/8, salt_len);
-
-  ASSERT_TRUE(rtc::GetSrtpKeyAndSaltLengths(
-      rtc::SRTP_AES128_CM_SHA1_80, &key_len, &salt_len));
-  ASSERT_EQ(128/8, key_len);
-  ASSERT_EQ(112/8, salt_len);
-
-  ASSERT_TRUE(rtc::GetSrtpKeyAndSaltLengths(
-      rtc::SRTP_AEAD_AES_128_GCM, &key_len, &salt_len));
-  ASSERT_EQ(128/8, key_len);
-  ASSERT_EQ(96/8, salt_len);
-
-  ASSERT_TRUE(rtc::GetSrtpKeyAndSaltLengths(
-      rtc::SRTP_AEAD_AES_256_GCM, &key_len, &salt_len));
-  ASSERT_EQ(256/8, key_len);
-  ASSERT_EQ(96/8, salt_len);
-};
-
-// Test an exporter
-TEST_P(SSLStreamAdapterTestDTLS, TestDTLSExporter) {
-  TestHandshake();
-  unsigned char client_out[20];
-  unsigned char server_out[20];
-
-  bool result;
-  result = ExportKeyingMaterial(kExporterLabel,
-                                kExporterContext, kExporterContextLen,
-                                true, true,
-                                client_out, sizeof(client_out));
-  ASSERT_TRUE(result);
-
-  result = ExportKeyingMaterial(kExporterLabel,
-                                kExporterContext, kExporterContextLen,
-                                true, false,
-                                server_out, sizeof(server_out));
-  ASSERT_TRUE(result);
-
-  ASSERT_TRUE(!memcmp(client_out, server_out, sizeof(client_out)));
-}
-
-// Test not yet valid certificates are not rejected.
-TEST_P(SSLStreamAdapterTestDTLS, TestCertNotYetValid) {
-  long one_day = 60 * 60 * 24;
-  // Make the certificates not valid until one day later.
-  ResetIdentitiesWithValidity(one_day, one_day);
-  TestHandshake();
-}
-
-// Test expired certificates are not rejected.
-TEST_P(SSLStreamAdapterTestDTLS, TestCertExpired) {
-  long one_day = 60 * 60 * 24;
-  // Make the certificates already expired.
-  ResetIdentitiesWithValidity(-one_day, -one_day);
-  TestHandshake();
-}
-
-// Test data transfer using certs created from strings.
-TEST_F(SSLStreamAdapterTestDTLSFromPEMStrings, TestTransfer) {
-  TestHandshake();
-  TestTransfer(100);
-}
-
-// Test getting the remote certificate.
-TEST_F(SSLStreamAdapterTestDTLSFromPEMStrings, TestDTLSGetPeerCertificate) {
-  // Peer certificates haven't been received yet.
-  ASSERT_FALSE(GetPeerCertificate(true));
-  ASSERT_FALSE(GetPeerCertificate(false));
-
-  TestHandshake();
-
-  // The client should have a peer certificate after the handshake.
-  std::unique_ptr<rtc::SSLCertificate> client_peer_cert =
-      GetPeerCertificate(true);
-  ASSERT_TRUE(client_peer_cert);
-
-  // It's not kCERT_PEM.
-  std::string client_peer_string = client_peer_cert->ToPEMString();
-  ASSERT_NE(kCERT_PEM, client_peer_string);
-
-  // It must not have a chain, because the test certs are self-signed.
-  ASSERT_FALSE(client_peer_cert->GetChain());
-
-  // The server should have a peer certificate after the handshake.
-  std::unique_ptr<rtc::SSLCertificate> server_peer_cert =
-      GetPeerCertificate(false);
-  ASSERT_TRUE(server_peer_cert);
-
-  // It's kCERT_PEM
-  ASSERT_EQ(kCERT_PEM, server_peer_cert->ToPEMString());
-
-  // It must not have a chain, because the test certs are self-signed.
-  ASSERT_FALSE(server_peer_cert->GetChain());
-}
-
-// Test getting the used DTLS ciphers.
-// DTLS 1.2 enabled for neither client nor server -> DTLS 1.0 will be used.
-TEST_P(SSLStreamAdapterTestDTLS, TestGetSslCipherSuite) {
-  SetupProtocolVersions(rtc::SSL_PROTOCOL_DTLS_10, rtc::SSL_PROTOCOL_DTLS_10);
-  TestHandshake();
-
-  int client_cipher;
-  ASSERT_TRUE(GetSslCipherSuite(true, &client_cipher));
-  int server_cipher;
-  ASSERT_TRUE(GetSslCipherSuite(false, &server_cipher));
-
-  ASSERT_EQ(rtc::SSL_PROTOCOL_DTLS_10, GetSslVersion(true));
-  ASSERT_EQ(rtc::SSL_PROTOCOL_DTLS_10, GetSslVersion(false));
-
-  ASSERT_EQ(client_cipher, server_cipher);
-  ASSERT_TRUE(rtc::SSLStreamAdapter::IsAcceptableCipher(
-      server_cipher, ::testing::get<1>(GetParam()).type()));
-}
-
-// Test getting the used DTLS 1.2 ciphers.
-// DTLS 1.2 enabled for client and server -> DTLS 1.2 will be used.
-TEST_P(SSLStreamAdapterTestDTLS, TestGetSslCipherSuiteDtls12Both) {
-  SetupProtocolVersions(rtc::SSL_PROTOCOL_DTLS_12, rtc::SSL_PROTOCOL_DTLS_12);
-  TestHandshake();
-
-  int client_cipher;
-  ASSERT_TRUE(GetSslCipherSuite(true, &client_cipher));
-  int server_cipher;
-  ASSERT_TRUE(GetSslCipherSuite(false, &server_cipher));
-
-  ASSERT_EQ(rtc::SSL_PROTOCOL_DTLS_12, GetSslVersion(true));
-  ASSERT_EQ(rtc::SSL_PROTOCOL_DTLS_12, GetSslVersion(false));
-
-  ASSERT_EQ(client_cipher, server_cipher);
-  ASSERT_TRUE(rtc::SSLStreamAdapter::IsAcceptableCipher(
-      server_cipher, ::testing::get<1>(GetParam()).type()));
-}
-
-// DTLS 1.2 enabled for client only -> DTLS 1.0 will be used.
-TEST_P(SSLStreamAdapterTestDTLS, TestGetSslCipherSuiteDtls12Client) {
-  SetupProtocolVersions(rtc::SSL_PROTOCOL_DTLS_10, rtc::SSL_PROTOCOL_DTLS_12);
-  TestHandshake();
-
-  int client_cipher;
-  ASSERT_TRUE(GetSslCipherSuite(true, &client_cipher));
-  int server_cipher;
-  ASSERT_TRUE(GetSslCipherSuite(false, &server_cipher));
-
-  ASSERT_EQ(rtc::SSL_PROTOCOL_DTLS_10, GetSslVersion(true));
-  ASSERT_EQ(rtc::SSL_PROTOCOL_DTLS_10, GetSslVersion(false));
-
-  ASSERT_EQ(client_cipher, server_cipher);
-  ASSERT_TRUE(rtc::SSLStreamAdapter::IsAcceptableCipher(
-      server_cipher, ::testing::get<1>(GetParam()).type()));
-}
-
-// DTLS 1.2 enabled for server only -> DTLS 1.0 will be used.
-TEST_P(SSLStreamAdapterTestDTLS, TestGetSslCipherSuiteDtls12Server) {
-  SetupProtocolVersions(rtc::SSL_PROTOCOL_DTLS_12, rtc::SSL_PROTOCOL_DTLS_10);
-  TestHandshake();
-
-  int client_cipher;
-  ASSERT_TRUE(GetSslCipherSuite(true, &client_cipher));
-  int server_cipher;
-  ASSERT_TRUE(GetSslCipherSuite(false, &server_cipher));
-
-  ASSERT_EQ(rtc::SSL_PROTOCOL_DTLS_10, GetSslVersion(true));
-  ASSERT_EQ(rtc::SSL_PROTOCOL_DTLS_10, GetSslVersion(false));
-
-  ASSERT_EQ(client_cipher, server_cipher);
-  ASSERT_TRUE(rtc::SSLStreamAdapter::IsAcceptableCipher(
-      server_cipher, ::testing::get<1>(GetParam()).type()));
-}
-
-// The RSA keysizes here might look strange, why not include the RFC's size
-// 2048?. The reason is test case slowness; testing two sizes to exercise
-// parametrization is sufficient.
-INSTANTIATE_TEST_CASE_P(
-    SSLStreamAdapterTestsTLS,
-    SSLStreamAdapterTestTLS,
-    Combine(Values(rtc::KeyParams::RSA(1024, 65537),
-                   rtc::KeyParams::RSA(1152, 65537),
-                   rtc::KeyParams::ECDSA(rtc::EC_NIST_P256)),
-            Values(rtc::KeyParams::RSA(1024, 65537),
-                   rtc::KeyParams::RSA(1152, 65537),
-                   rtc::KeyParams::ECDSA(rtc::EC_NIST_P256))));
-INSTANTIATE_TEST_CASE_P(
-    SSLStreamAdapterTestsDTLS,
-    SSLStreamAdapterTestDTLS,
-    Combine(Values(rtc::KeyParams::RSA(1024, 65537),
-                   rtc::KeyParams::RSA(1152, 65537),
-                   rtc::KeyParams::ECDSA(rtc::EC_NIST_P256)),
-            Values(rtc::KeyParams::RSA(1024, 65537),
-                   rtc::KeyParams::RSA(1152, 65537),
-                   rtc::KeyParams::ECDSA(rtc::EC_NIST_P256))));
diff --git a/rtc_base/stream.cc b/rtc_base/stream.cc
deleted file mode 100644
index 32b9eac..0000000
--- a/rtc_base/stream.cc
+++ /dev/null
@@ -1,1115 +0,0 @@
-/*
- *  Copyright 2004 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.
- */
-
-#if defined(WEBRTC_POSIX)
-#include <sys/file.h>
-#endif  // WEBRTC_POSIX
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <errno.h>
-
-#include <algorithm>
-#include <string>
-
-#include "webrtc/rtc_base/basictypes.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/messagequeue.h"
-#include "webrtc/rtc_base/stream.h"
-#include "webrtc/rtc_base/stringencode.h"
-#include "webrtc/rtc_base/stringutils.h"
-#include "webrtc/rtc_base/thread.h"
-#include "webrtc/rtc_base/timeutils.h"
-
-#if defined(WEBRTC_WIN)
-#include "webrtc/rtc_base/win32.h"
-#define fileno _fileno
-#endif
-
-namespace rtc {
-
-///////////////////////////////////////////////////////////////////////////////
-// StreamInterface
-///////////////////////////////////////////////////////////////////////////////
-StreamInterface::~StreamInterface() {
-}
-
-StreamResult StreamInterface::WriteAll(const void* data, size_t data_len,
-                                       size_t* written, int* error) {
-  StreamResult result = SR_SUCCESS;
-  size_t total_written = 0, current_written;
-  while (total_written < data_len) {
-    result = Write(static_cast<const char*>(data) + total_written,
-                   data_len - total_written, &current_written, error);
-    if (result != SR_SUCCESS)
-      break;
-    total_written += current_written;
-  }
-  if (written)
-    *written = total_written;
-  return result;
-}
-
-StreamResult StreamInterface::ReadAll(void* buffer, size_t buffer_len,
-                                      size_t* read, int* error) {
-  StreamResult result = SR_SUCCESS;
-  size_t total_read = 0, current_read;
-  while (total_read < buffer_len) {
-    result = Read(static_cast<char*>(buffer) + total_read,
-                  buffer_len - total_read, &current_read, error);
-    if (result != SR_SUCCESS)
-      break;
-    total_read += current_read;
-  }
-  if (read)
-    *read = total_read;
-  return result;
-}
-
-StreamResult StreamInterface::ReadLine(std::string* line) {
-  line->clear();
-  StreamResult result = SR_SUCCESS;
-  while (true) {
-    char ch;
-    result = Read(&ch, sizeof(ch), nullptr, nullptr);
-    if (result != SR_SUCCESS) {
-      break;
-    }
-    if (ch == '\n') {
-      break;
-    }
-    line->push_back(ch);
-  }
-  if (!line->empty()) {   // give back the line we've collected so far with
-    result = SR_SUCCESS;  // a success code.  Otherwise return the last code
-  }
-  return result;
-}
-
-void StreamInterface::PostEvent(Thread* t, int events, int err) {
-  t->Post(RTC_FROM_HERE, this, MSG_POST_EVENT,
-          new StreamEventData(events, err));
-}
-
-void StreamInterface::PostEvent(int events, int err) {
-  PostEvent(Thread::Current(), events, err);
-}
-
-const void* StreamInterface::GetReadData(size_t* data_len) {
-  return nullptr;
-}
-
-void* StreamInterface::GetWriteBuffer(size_t* buf_len) {
-  return nullptr;
-}
-
-bool StreamInterface::SetPosition(size_t position) {
-  return false;
-}
-
-bool StreamInterface::GetPosition(size_t* position) const {
-  return false;
-}
-
-bool StreamInterface::GetSize(size_t* size) const {
-  return false;
-}
-
-bool StreamInterface::GetAvailable(size_t* size) const {
-  return false;
-}
-
-bool StreamInterface::GetWriteRemaining(size_t* size) const {
-  return false;
-}
-
-bool StreamInterface::Flush() {
-  return false;
-}
-
-bool StreamInterface::ReserveSize(size_t size) {
-  return true;
-}
-
-StreamInterface::StreamInterface() {
-}
-
-void StreamInterface::OnMessage(Message* msg) {
-  if (MSG_POST_EVENT == msg->message_id) {
-    StreamEventData* pe = static_cast<StreamEventData*>(msg->pdata);
-    SignalEvent(this, pe->events, pe->error);
-    delete msg->pdata;
-  }
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// StreamAdapterInterface
-///////////////////////////////////////////////////////////////////////////////
-
-StreamAdapterInterface::StreamAdapterInterface(StreamInterface* stream,
-                                               bool owned)
-    : stream_(stream), owned_(owned) {
-  if (nullptr != stream_)
-    stream_->SignalEvent.connect(this, &StreamAdapterInterface::OnEvent);
-}
-
-StreamState StreamAdapterInterface::GetState() const {
-  return stream_->GetState();
-}
-StreamResult StreamAdapterInterface::Read(void* buffer,
-                                          size_t buffer_len,
-                                          size_t* read,
-                                          int* error) {
-  return stream_->Read(buffer, buffer_len, read, error);
-}
-StreamResult StreamAdapterInterface::Write(const void* data,
-                                           size_t data_len,
-                                           size_t* written,
-                                           int* error) {
-  return stream_->Write(data, data_len, written, error);
-}
-void StreamAdapterInterface::Close() {
-  stream_->Close();
-}
-
-bool StreamAdapterInterface::SetPosition(size_t position) {
-  return stream_->SetPosition(position);
-}
-
-bool StreamAdapterInterface::GetPosition(size_t* position) const {
-  return stream_->GetPosition(position);
-}
-
-bool StreamAdapterInterface::GetSize(size_t* size) const {
-  return stream_->GetSize(size);
-}
-
-bool StreamAdapterInterface::GetAvailable(size_t* size) const {
-  return stream_->GetAvailable(size);
-}
-
-bool StreamAdapterInterface::GetWriteRemaining(size_t* size) const {
-  return stream_->GetWriteRemaining(size);
-}
-
-bool StreamAdapterInterface::ReserveSize(size_t size) {
-  return stream_->ReserveSize(size);
-}
-
-bool StreamAdapterInterface::Flush() {
-  return stream_->Flush();
-}
-
-void StreamAdapterInterface::Attach(StreamInterface* stream, bool owned) {
-  if (nullptr != stream_)
-    stream_->SignalEvent.disconnect(this);
-  if (owned_)
-    delete stream_;
-  stream_ = stream;
-  owned_ = owned;
-  if (nullptr != stream_)
-    stream_->SignalEvent.connect(this, &StreamAdapterInterface::OnEvent);
-}
-
-StreamInterface* StreamAdapterInterface::Detach() {
-  if (nullptr != stream_)
-    stream_->SignalEvent.disconnect(this);
-  StreamInterface* stream = stream_;
-  stream_ = nullptr;
-  return stream;
-}
-
-StreamAdapterInterface::~StreamAdapterInterface() {
-  if (owned_)
-    delete stream_;
-}
-
-void StreamAdapterInterface::OnEvent(StreamInterface* stream,
-                                     int events,
-                                     int err) {
-  SignalEvent(this, events, err);
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// StreamTap
-///////////////////////////////////////////////////////////////////////////////
-
-StreamTap::StreamTap(StreamInterface* stream, StreamInterface* tap)
-    : StreamAdapterInterface(stream), tap_(), tap_result_(SR_SUCCESS),
-        tap_error_(0) {
-  AttachTap(tap);
-}
-
-StreamTap::~StreamTap() = default;
-
-void StreamTap::AttachTap(StreamInterface* tap) {
-  tap_.reset(tap);
-}
-
-StreamInterface* StreamTap::DetachTap() {
-  return tap_.release();
-}
-
-StreamResult StreamTap::GetTapResult(int* error) {
-  if (error) {
-    *error = tap_error_;
-  }
-  return tap_result_;
-}
-
-StreamResult StreamTap::Read(void* buffer, size_t buffer_len,
-                             size_t* read, int* error) {
-  size_t backup_read;
-  if (!read) {
-    read = &backup_read;
-  }
-  StreamResult res = StreamAdapterInterface::Read(buffer, buffer_len,
-                                                  read, error);
-  if ((res == SR_SUCCESS) && (tap_result_ == SR_SUCCESS)) {
-    tap_result_ = tap_->WriteAll(buffer, *read, nullptr, &tap_error_);
-  }
-  return res;
-}
-
-StreamResult StreamTap::Write(const void* data, size_t data_len,
-                              size_t* written, int* error) {
-  size_t backup_written;
-  if (!written) {
-    written = &backup_written;
-  }
-  StreamResult res = StreamAdapterInterface::Write(data, data_len,
-                                                   written, error);
-  if ((res == SR_SUCCESS) && (tap_result_ == SR_SUCCESS)) {
-    tap_result_ = tap_->WriteAll(data, *written, nullptr, &tap_error_);
-  }
-  return res;
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// NullStream
-///////////////////////////////////////////////////////////////////////////////
-
-NullStream::NullStream() {
-}
-
-NullStream::~NullStream() {
-}
-
-StreamState NullStream::GetState() const {
-  return SS_OPEN;
-}
-
-StreamResult NullStream::Read(void* buffer, size_t buffer_len,
-                              size_t* read, int* error) {
-  if (error) *error = -1;
-  return SR_ERROR;
-}
-
-StreamResult NullStream::Write(const void* data, size_t data_len,
-                               size_t* written, int* error) {
-  if (written) *written = data_len;
-  return SR_SUCCESS;
-}
-
-void NullStream::Close() {
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// FileStream
-///////////////////////////////////////////////////////////////////////////////
-
-FileStream::FileStream() : file_(nullptr) {}
-
-FileStream::~FileStream() {
-  FileStream::Close();
-}
-
-bool FileStream::Open(const std::string& filename, const char* mode,
-                      int* error) {
-  Close();
-#if defined(WEBRTC_WIN)
-  std::wstring wfilename;
-  if (Utf8ToWindowsFilename(filename, &wfilename)) {
-    file_ = _wfopen(wfilename.c_str(), ToUtf16(mode).c_str());
-  } else {
-    if (error) {
-      *error = -1;
-      return false;
-    }
-  }
-#else
-  file_ = fopen(filename.c_str(), mode);
-#endif
-  if (!file_ && error) {
-    *error = errno;
-  }
-  return (file_ != nullptr);
-}
-
-bool FileStream::OpenShare(const std::string& filename, const char* mode,
-                           int shflag, int* error) {
-  Close();
-#if defined(WEBRTC_WIN)
-  std::wstring wfilename;
-  if (Utf8ToWindowsFilename(filename, &wfilename)) {
-    file_ = _wfsopen(wfilename.c_str(), ToUtf16(mode).c_str(), shflag);
-    if (!file_ && error) {
-      *error = errno;
-      return false;
-    }
-    return file_ != nullptr;
-  } else {
-    if (error) {
-      *error = -1;
-    }
-    return false;
-  }
-#else
-  return Open(filename, mode, error);
-#endif
-}
-
-bool FileStream::DisableBuffering() {
-  if (!file_)
-    return false;
-  return (setvbuf(file_, nullptr, _IONBF, 0) == 0);
-}
-
-StreamState FileStream::GetState() const {
-  return (file_ == nullptr) ? SS_CLOSED : SS_OPEN;
-}
-
-StreamResult FileStream::Read(void* buffer, size_t buffer_len,
-                              size_t* read, int* error) {
-  if (!file_)
-    return SR_EOS;
-  size_t result = fread(buffer, 1, buffer_len, file_);
-  if ((result == 0) && (buffer_len > 0)) {
-    if (feof(file_))
-      return SR_EOS;
-    if (error)
-      *error = errno;
-    return SR_ERROR;
-  }
-  if (read)
-    *read = result;
-  return SR_SUCCESS;
-}
-
-StreamResult FileStream::Write(const void* data, size_t data_len,
-                               size_t* written, int* error) {
-  if (!file_)
-    return SR_EOS;
-  size_t result = fwrite(data, 1, data_len, file_);
-  if ((result == 0) && (data_len > 0)) {
-    if (error)
-      *error = errno;
-    return SR_ERROR;
-  }
-  if (written)
-    *written = result;
-  return SR_SUCCESS;
-}
-
-void FileStream::Close() {
-  if (file_) {
-    DoClose();
-    file_ = nullptr;
-  }
-}
-
-bool FileStream::SetPosition(size_t position) {
-  if (!file_)
-    return false;
-  return (fseek(file_, static_cast<int>(position), SEEK_SET) == 0);
-}
-
-bool FileStream::GetPosition(size_t* position) const {
-  RTC_DCHECK(nullptr != position);
-  if (!file_)
-    return false;
-  long result = ftell(file_);
-  if (result < 0)
-    return false;
-  if (position)
-    *position = result;
-  return true;
-}
-
-bool FileStream::GetSize(size_t* size) const {
-  RTC_DCHECK(nullptr != size);
-  if (!file_)
-    return false;
-  struct stat file_stats;
-  if (fstat(fileno(file_), &file_stats) != 0)
-    return false;
-  if (size)
-    *size = file_stats.st_size;
-  return true;
-}
-
-bool FileStream::GetAvailable(size_t* size) const {
-  RTC_DCHECK(nullptr != size);
-  if (!GetSize(size))
-    return false;
-  long result = ftell(file_);
-  if (result < 0)
-    return false;
-  if (size)
-    *size -= result;
-  return true;
-}
-
-bool FileStream::ReserveSize(size_t size) {
-  // TODO: extend the file to the proper length
-  return true;
-}
-
-bool FileStream::Flush() {
-  if (file_) {
-    return (0 == fflush(file_));
-  }
-  // try to flush empty file?
-  RTC_NOTREACHED();
-  return false;
-}
-
-#if defined(WEBRTC_POSIX) && !defined(__native_client__)
-
-bool FileStream::TryLock() {
-  if (file_ == nullptr) {
-    // Stream not open.
-    RTC_NOTREACHED();
-    return false;
-  }
-
-  return flock(fileno(file_), LOCK_EX|LOCK_NB) == 0;
-}
-
-bool FileStream::Unlock() {
-  if (file_ == nullptr) {
-    // Stream not open.
-    RTC_NOTREACHED();
-    return false;
-  }
-
-  return flock(fileno(file_), LOCK_UN) == 0;
-}
-
-#endif
-
-void FileStream::DoClose() {
-  fclose(file_);
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// MemoryStream
-///////////////////////////////////////////////////////////////////////////////
-
-MemoryStreamBase::MemoryStreamBase()
-    : buffer_(nullptr), buffer_length_(0), data_length_(0), seek_position_(0) {}
-
-StreamState MemoryStreamBase::GetState() const {
-  return SS_OPEN;
-}
-
-StreamResult MemoryStreamBase::Read(void* buffer, size_t bytes,
-                                    size_t* bytes_read, int* error) {
-  if (seek_position_ >= data_length_) {
-    return SR_EOS;
-  }
-  size_t available = data_length_ - seek_position_;
-  if (bytes > available) {
-    // Read partial buffer
-    bytes = available;
-  }
-  memcpy(buffer, &buffer_[seek_position_], bytes);
-  seek_position_ += bytes;
-  if (bytes_read) {
-    *bytes_read = bytes;
-  }
-  return SR_SUCCESS;
-}
-
-StreamResult MemoryStreamBase::Write(const void* buffer, size_t bytes,
-                                     size_t* bytes_written, int* error) {
-  size_t available = buffer_length_ - seek_position_;
-  if (0 == available) {
-    // Increase buffer size to the larger of:
-    // a) new position rounded up to next 256 bytes
-    // b) double the previous length
-    size_t new_buffer_length =
-        std::max(((seek_position_ + bytes) | 0xFF) + 1, buffer_length_ * 2);
-    StreamResult result = DoReserve(new_buffer_length, error);
-    if (SR_SUCCESS != result) {
-      return result;
-    }
-    RTC_DCHECK(buffer_length_ >= new_buffer_length);
-    available = buffer_length_ - seek_position_;
-  }
-
-  if (bytes > available) {
-    bytes = available;
-  }
-  memcpy(&buffer_[seek_position_], buffer, bytes);
-  seek_position_ += bytes;
-  if (data_length_ < seek_position_) {
-    data_length_ = seek_position_;
-  }
-  if (bytes_written) {
-    *bytes_written = bytes;
-  }
-  return SR_SUCCESS;
-}
-
-void MemoryStreamBase::Close() {
-  // nothing to do
-}
-
-bool MemoryStreamBase::SetPosition(size_t position) {
-  if (position > data_length_)
-    return false;
-  seek_position_ = position;
-  return true;
-}
-
-bool MemoryStreamBase::GetPosition(size_t* position) const {
-  if (position)
-    *position = seek_position_;
-  return true;
-}
-
-bool MemoryStreamBase::GetSize(size_t* size) const {
-  if (size)
-    *size = data_length_;
-  return true;
-}
-
-bool MemoryStreamBase::GetAvailable(size_t* size) const {
-  if (size)
-    *size = data_length_ - seek_position_;
-  return true;
-}
-
-bool MemoryStreamBase::ReserveSize(size_t size) {
-  return (SR_SUCCESS == DoReserve(size, nullptr));
-}
-
-StreamResult MemoryStreamBase::DoReserve(size_t size, int* error) {
-  return (buffer_length_ >= size) ? SR_SUCCESS : SR_EOS;
-}
-
-///////////////////////////////////////////////////////////////////////////////
-
-MemoryStream::MemoryStream() : buffer_alloc_(nullptr) {}
-
-MemoryStream::MemoryStream(const char* data) : buffer_alloc_(nullptr) {
-  SetData(data, strlen(data));
-}
-
-MemoryStream::MemoryStream(const void* data, size_t length)
-    : buffer_alloc_(nullptr) {
-  SetData(data, length);
-}
-
-MemoryStream::~MemoryStream() {
-  delete [] buffer_alloc_;
-}
-
-void MemoryStream::SetData(const void* data, size_t length) {
-  data_length_ = buffer_length_ = length;
-  delete [] buffer_alloc_;
-  buffer_alloc_ = new char[buffer_length_ + kAlignment];
-  buffer_ = reinterpret_cast<char*>(ALIGNP(buffer_alloc_, kAlignment));
-  memcpy(buffer_, data, data_length_);
-  seek_position_ = 0;
-}
-
-StreamResult MemoryStream::DoReserve(size_t size, int* error) {
-  if (buffer_length_ >= size)
-    return SR_SUCCESS;
-
-  if (char* new_buffer_alloc = new char[size + kAlignment]) {
-    char* new_buffer = reinterpret_cast<char*>(
-        ALIGNP(new_buffer_alloc, kAlignment));
-    memcpy(new_buffer, buffer_, data_length_);
-    delete [] buffer_alloc_;
-    buffer_alloc_ = new_buffer_alloc;
-    buffer_ = new_buffer;
-    buffer_length_ = size;
-    return SR_SUCCESS;
-  }
-
-  if (error) {
-    *error = ENOMEM;
-  }
-  return SR_ERROR;
-}
-
-///////////////////////////////////////////////////////////////////////////////
-
-ExternalMemoryStream::ExternalMemoryStream() {
-}
-
-ExternalMemoryStream::ExternalMemoryStream(void* data, size_t length) {
-  SetData(data, length);
-}
-
-ExternalMemoryStream::~ExternalMemoryStream() {
-}
-
-void ExternalMemoryStream::SetData(void* data, size_t length) {
-  data_length_ = buffer_length_ = length;
-  buffer_ = static_cast<char*>(data);
-  seek_position_ = 0;
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// FifoBuffer
-///////////////////////////////////////////////////////////////////////////////
-
-FifoBuffer::FifoBuffer(size_t size)
-    : state_(SS_OPEN), buffer_(new char[size]), buffer_length_(size),
-      data_length_(0), read_position_(0), owner_(Thread::Current()) {
-  // all events are done on the owner_ thread
-}
-
-FifoBuffer::FifoBuffer(size_t size, Thread* owner)
-    : state_(SS_OPEN), buffer_(new char[size]), buffer_length_(size),
-      data_length_(0), read_position_(0), owner_(owner) {
-  // all events are done on the owner_ thread
-}
-
-FifoBuffer::~FifoBuffer() {
-}
-
-bool FifoBuffer::GetBuffered(size_t* size) const {
-  CritScope cs(&crit_);
-  *size = data_length_;
-  return true;
-}
-
-bool FifoBuffer::SetCapacity(size_t size) {
-  CritScope cs(&crit_);
-  if (data_length_ > size) {
-    return false;
-  }
-
-  if (size != buffer_length_) {
-    char* buffer = new char[size];
-    const size_t copy = data_length_;
-    const size_t tail_copy = std::min(copy, buffer_length_ - read_position_);
-    memcpy(buffer, &buffer_[read_position_], tail_copy);
-    memcpy(buffer + tail_copy, &buffer_[0], copy - tail_copy);
-    buffer_.reset(buffer);
-    read_position_ = 0;
-    buffer_length_ = size;
-  }
-  return true;
-}
-
-StreamResult FifoBuffer::ReadOffset(void* buffer, size_t bytes,
-                                    size_t offset, size_t* bytes_read) {
-  CritScope cs(&crit_);
-  return ReadOffsetLocked(buffer, bytes, offset, bytes_read);
-}
-
-StreamResult FifoBuffer::WriteOffset(const void* buffer, size_t bytes,
-                                     size_t offset, size_t* bytes_written) {
-  CritScope cs(&crit_);
-  return WriteOffsetLocked(buffer, bytes, offset, bytes_written);
-}
-
-StreamState FifoBuffer::GetState() const {
-  CritScope cs(&crit_);
-  return state_;
-}
-
-StreamResult FifoBuffer::Read(void* buffer, size_t bytes,
-                              size_t* bytes_read, int* error) {
-  CritScope cs(&crit_);
-  const bool was_writable = data_length_ < buffer_length_;
-  size_t copy = 0;
-  StreamResult result = ReadOffsetLocked(buffer, bytes, 0, &copy);
-
-  if (result == SR_SUCCESS) {
-    // If read was successful then adjust the read position and number of
-    // bytes buffered.
-    read_position_ = (read_position_ + copy) % buffer_length_;
-    data_length_ -= copy;
-    if (bytes_read) {
-      *bytes_read = copy;
-    }
-
-    // if we were full before, and now we're not, post an event
-    if (!was_writable && copy > 0) {
-      PostEvent(owner_, SE_WRITE, 0);
-    }
-  }
-  return result;
-}
-
-StreamResult FifoBuffer::Write(const void* buffer, size_t bytes,
-                               size_t* bytes_written, int* error) {
-  CritScope cs(&crit_);
-
-  const bool was_readable = (data_length_ > 0);
-  size_t copy = 0;
-  StreamResult result = WriteOffsetLocked(buffer, bytes, 0, &copy);
-
-  if (result == SR_SUCCESS) {
-    // If write was successful then adjust the number of readable bytes.
-    data_length_ += copy;
-    if (bytes_written) {
-      *bytes_written = copy;
-    }
-
-    // if we didn't have any data to read before, and now we do, post an event
-    if (!was_readable && copy > 0) {
-      PostEvent(owner_, SE_READ, 0);
-    }
-  }
-  return result;
-}
-
-void FifoBuffer::Close() {
-  CritScope cs(&crit_);
-  state_ = SS_CLOSED;
-}
-
-const void* FifoBuffer::GetReadData(size_t* size) {
-  CritScope cs(&crit_);
-  *size = (read_position_ + data_length_ <= buffer_length_) ?
-      data_length_ : buffer_length_ - read_position_;
-  return &buffer_[read_position_];
-}
-
-void FifoBuffer::ConsumeReadData(size_t size) {
-  CritScope cs(&crit_);
-  RTC_DCHECK(size <= data_length_);
-  const bool was_writable = data_length_ < buffer_length_;
-  read_position_ = (read_position_ + size) % buffer_length_;
-  data_length_ -= size;
-  if (!was_writable && size > 0) {
-    PostEvent(owner_, SE_WRITE, 0);
-  }
-}
-
-void* FifoBuffer::GetWriteBuffer(size_t* size) {
-  CritScope cs(&crit_);
-  if (state_ == SS_CLOSED) {
-    return nullptr;
-  }
-
-  // if empty, reset the write position to the beginning, so we can get
-  // the biggest possible block
-  if (data_length_ == 0) {
-    read_position_ = 0;
-  }
-
-  const size_t write_position = (read_position_ + data_length_)
-      % buffer_length_;
-  *size = (write_position > read_position_ || data_length_ == 0) ?
-      buffer_length_ - write_position : read_position_ - write_position;
-  return &buffer_[write_position];
-}
-
-void FifoBuffer::ConsumeWriteBuffer(size_t size) {
-  CritScope cs(&crit_);
-  RTC_DCHECK(size <= buffer_length_ - data_length_);
-  const bool was_readable = (data_length_ > 0);
-  data_length_ += size;
-  if (!was_readable && size > 0) {
-    PostEvent(owner_, SE_READ, 0);
-  }
-}
-
-bool FifoBuffer::GetWriteRemaining(size_t* size) const {
-  CritScope cs(&crit_);
-  *size = buffer_length_ - data_length_;
-  return true;
-}
-
-StreamResult FifoBuffer::ReadOffsetLocked(void* buffer,
-                                          size_t bytes,
-                                          size_t offset,
-                                          size_t* bytes_read) {
-  if (offset >= data_length_) {
-    return (state_ != SS_CLOSED) ? SR_BLOCK : SR_EOS;
-  }
-
-  const size_t available = data_length_ - offset;
-  const size_t read_position = (read_position_ + offset) % buffer_length_;
-  const size_t copy = std::min(bytes, available);
-  const size_t tail_copy = std::min(copy, buffer_length_ - read_position);
-  char* const p = static_cast<char*>(buffer);
-  memcpy(p, &buffer_[read_position], tail_copy);
-  memcpy(p + tail_copy, &buffer_[0], copy - tail_copy);
-
-  if (bytes_read) {
-    *bytes_read = copy;
-  }
-  return SR_SUCCESS;
-}
-
-StreamResult FifoBuffer::WriteOffsetLocked(const void* buffer,
-                                           size_t bytes,
-                                           size_t offset,
-                                           size_t* bytes_written) {
-  if (state_ == SS_CLOSED) {
-    return SR_EOS;
-  }
-
-  if (data_length_ + offset >= buffer_length_) {
-    return SR_BLOCK;
-  }
-
-  const size_t available = buffer_length_ - data_length_ - offset;
-  const size_t write_position = (read_position_ + data_length_ + offset)
-      % buffer_length_;
-  const size_t copy = std::min(bytes, available);
-  const size_t tail_copy = std::min(copy, buffer_length_ - write_position);
-  const char* const p = static_cast<const char*>(buffer);
-  memcpy(&buffer_[write_position], p, tail_copy);
-  memcpy(&buffer_[0], p + tail_copy, copy - tail_copy);
-
-  if (bytes_written) {
-    *bytes_written = copy;
-  }
-  return SR_SUCCESS;
-}
-
-
-
-///////////////////////////////////////////////////////////////////////////////
-// LoggingAdapter
-///////////////////////////////////////////////////////////////////////////////
-
-LoggingAdapter::LoggingAdapter(StreamInterface* stream, LoggingSeverity level,
-                               const std::string& label, bool hex_mode)
-    : StreamAdapterInterface(stream), level_(level), hex_mode_(hex_mode) {
-  set_label(label);
-}
-
-void LoggingAdapter::set_label(const std::string& label) {
-  label_.assign("[");
-  label_.append(label);
-  label_.append("]");
-}
-
-StreamResult LoggingAdapter::Read(void* buffer, size_t buffer_len,
-                                  size_t* read, int* error) {
-  size_t local_read; if (!read) read = &local_read;
-  StreamResult result = StreamAdapterInterface::Read(buffer, buffer_len, read,
-                                                     error);
-  if (result == SR_SUCCESS) {
-    LogMultiline(level_, label_.c_str(), true, buffer, *read, hex_mode_, &lms_);
-  }
-  return result;
-}
-
-StreamResult LoggingAdapter::Write(const void* data, size_t data_len,
-                                   size_t* written, int* error) {
-  size_t local_written;
-  if (!written) written = &local_written;
-  StreamResult result = StreamAdapterInterface::Write(data, data_len, written,
-                                                      error);
-  if (result == SR_SUCCESS) {
-    LogMultiline(level_, label_.c_str(), false, data, *written, hex_mode_,
-                 &lms_);
-  }
-  return result;
-}
-
-void LoggingAdapter::Close() {
-  LogMultiline(level_, label_.c_str(), false, nullptr, 0, hex_mode_, &lms_);
-  LogMultiline(level_, label_.c_str(), true, nullptr, 0, hex_mode_, &lms_);
-  LOG_V(level_) << label_ << " Closed locally";
-  StreamAdapterInterface::Close();
-}
-
-void LoggingAdapter::OnEvent(StreamInterface* stream, int events, int err) {
-  if (events & SE_OPEN) {
-    LOG_V(level_) << label_ << " Open";
-  } else if (events & SE_CLOSE) {
-    LogMultiline(level_, label_.c_str(), false, nullptr, 0, hex_mode_, &lms_);
-    LogMultiline(level_, label_.c_str(), true, nullptr, 0, hex_mode_, &lms_);
-    LOG_V(level_) << label_ << " Closed with error: " << err;
-  }
-  StreamAdapterInterface::OnEvent(stream, events, err);
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// StringStream - Reads/Writes to an external std::string
-///////////////////////////////////////////////////////////////////////////////
-
-StringStream::StringStream(std::string* str)
-    : str_(*str), read_pos_(0), read_only_(false) {
-}
-
-StringStream::StringStream(const std::string& str)
-    : str_(const_cast<std::string&>(str)), read_pos_(0), read_only_(true) {
-}
-
-StreamState StringStream::GetState() const {
-  return SS_OPEN;
-}
-
-StreamResult StringStream::Read(void* buffer, size_t buffer_len,
-                                      size_t* read, int* error) {
-  size_t available = std::min(buffer_len, str_.size() - read_pos_);
-  if (!available)
-    return SR_EOS;
-  memcpy(buffer, str_.data() + read_pos_, available);
-  read_pos_ += available;
-  if (read)
-    *read = available;
-  return SR_SUCCESS;
-}
-
-StreamResult StringStream::Write(const void* data, size_t data_len,
-                                      size_t* written, int* error) {
-  if (read_only_) {
-    if (error) {
-      *error = -1;
-    }
-    return SR_ERROR;
-  }
-  str_.append(static_cast<const char*>(data),
-              static_cast<const char*>(data) + data_len);
-  if (written)
-    *written = data_len;
-  return SR_SUCCESS;
-}
-
-void StringStream::Close() {
-}
-
-bool StringStream::SetPosition(size_t position) {
-  if (position > str_.size())
-    return false;
-  read_pos_ = position;
-  return true;
-}
-
-bool StringStream::GetPosition(size_t* position) const {
-  if (position)
-    *position = read_pos_;
-  return true;
-}
-
-bool StringStream::GetSize(size_t* size) const {
-  if (size)
-    *size = str_.size();
-  return true;
-}
-
-bool StringStream::GetAvailable(size_t* size) const {
-  if (size)
-    *size = str_.size() - read_pos_;
-  return true;
-}
-
-bool StringStream::ReserveSize(size_t size) {
-  if (read_only_)
-    return false;
-  str_.reserve(size);
-  return true;
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// StreamReference
-///////////////////////////////////////////////////////////////////////////////
-
-StreamReference::StreamReference(StreamInterface* stream)
-    : StreamAdapterInterface(stream, false) {
-  // owner set to false so the destructor does not free the stream.
-  stream_ref_count_ = new StreamRefCount(stream);
-}
-
-StreamInterface* StreamReference::NewReference() {
-  stream_ref_count_->AddReference();
-  return new StreamReference(stream_ref_count_, stream());
-}
-
-StreamReference::~StreamReference() {
-  stream_ref_count_->Release();
-}
-
-StreamReference::StreamReference(StreamRefCount* stream_ref_count,
-                                 StreamInterface* stream)
-    : StreamAdapterInterface(stream, false),
-      stream_ref_count_(stream_ref_count) {
-}
-
-///////////////////////////////////////////////////////////////////////////////
-
-StreamResult Flow(StreamInterface* source,
-                  char* buffer,
-                  size_t buffer_len,
-                  StreamInterface* sink,
-                  size_t* data_len /* = nullptr */) {
-  RTC_DCHECK(buffer_len > 0);
-
-  StreamResult result;
-  size_t count, read_pos, write_pos;
-  if (data_len) {
-    read_pos = *data_len;
-  } else {
-    read_pos = 0;
-  }
-
-  bool end_of_stream = false;
-  do {
-    // Read until buffer is full, end of stream, or error
-    while (!end_of_stream && (read_pos < buffer_len)) {
-      result = source->Read(buffer + read_pos, buffer_len - read_pos, &count,
-                            nullptr);
-      if (result == SR_EOS) {
-        end_of_stream = true;
-      } else if (result != SR_SUCCESS) {
-        if (data_len) {
-          *data_len = read_pos;
-        }
-        return result;
-      } else {
-        read_pos += count;
-      }
-    }
-
-    // Write until buffer is empty, or error (including end of stream)
-    write_pos = 0;
-    while (write_pos < read_pos) {
-      result = sink->Write(buffer + write_pos, read_pos - write_pos, &count,
-                           nullptr);
-      if (result != SR_SUCCESS) {
-        if (data_len) {
-          *data_len = read_pos - write_pos;
-          if (write_pos > 0) {
-            memmove(buffer, buffer + write_pos, *data_len);
-          }
-        }
-        return result;
-      }
-      write_pos += count;
-    }
-
-    read_pos = 0;
-  } while (!end_of_stream);
-
-  if (data_len) {
-    *data_len = 0;
-  }
-  return SR_SUCCESS;
-}
-
-///////////////////////////////////////////////////////////////////////////////
-
-}  // namespace rtc
diff --git a/rtc_base/stream.h b/rtc_base/stream.h
deleted file mode 100644
index e8418ab..0000000
--- a/rtc_base/stream.h
+++ /dev/null
@@ -1,716 +0,0 @@
-/*
- *  Copyright 2004 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_RTC_BASE_STREAM_H_
-#define WEBRTC_RTC_BASE_STREAM_H_
-
-#include <stdio.h>
-
-#include <memory>
-
-#include "webrtc/rtc_base/buffer.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/messagehandler.h"
-#include "webrtc/rtc_base/messagequeue.h"
-#include "webrtc/rtc_base/sigslot.h"
-
-namespace rtc {
-
-///////////////////////////////////////////////////////////////////////////////
-// StreamInterface is a generic asynchronous stream interface, supporting read,
-// write, and close operations, and asynchronous signalling of state changes.
-// The interface is designed with file, memory, and socket implementations in
-// mind.  Some implementations offer extended operations, such as seeking.
-///////////////////////////////////////////////////////////////////////////////
-
-// The following enumerations are declared outside of the StreamInterface
-// class for brevity in use.
-
-// The SS_OPENING state indicates that the stream will signal open or closed
-// in the future.
-enum StreamState { SS_CLOSED, SS_OPENING, SS_OPEN };
-
-// Stream read/write methods return this value to indicate various success
-// and failure conditions described below.
-enum StreamResult { SR_ERROR, SR_SUCCESS, SR_BLOCK, SR_EOS };
-
-// StreamEvents are used to asynchronously signal state transitionss.  The flags
-// may be combined.
-//  SE_OPEN: The stream has transitioned to the SS_OPEN state
-//  SE_CLOSE: The stream has transitioned to the SS_CLOSED state
-//  SE_READ: Data is available, so Read is likely to not return SR_BLOCK
-//  SE_WRITE: Data can be written, so Write is likely to not return SR_BLOCK
-enum StreamEvent { SE_OPEN = 1, SE_READ = 2, SE_WRITE = 4, SE_CLOSE = 8 };
-
-class Thread;
-
-struct StreamEventData : public MessageData {
-  int events, error;
-  StreamEventData(int ev, int er) : events(ev), error(er) { }
-};
-
-class StreamInterface : public MessageHandler {
- public:
-  enum {
-    MSG_POST_EVENT = 0xF1F1, MSG_MAX = MSG_POST_EVENT
-  };
-
-  ~StreamInterface() override;
-
-  virtual StreamState GetState() const = 0;
-
-  // Read attempts to fill buffer of size buffer_len.  Write attempts to send
-  // data_len bytes stored in data.  The variables read and write are set only
-  // on SR_SUCCESS (see below).  Likewise, error is only set on SR_ERROR.
-  // Read and Write return a value indicating:
-  //  SR_ERROR: an error occurred, which is returned in a non-null error
-  //    argument.  Interpretation of the error requires knowledge of the
-  //    stream's concrete type, which limits its usefulness.
-  //  SR_SUCCESS: some number of bytes were successfully written, which is
-  //    returned in a non-null read/write argument.
-  //  SR_BLOCK: the stream is in non-blocking mode, and the operation would
-  //    block, or the stream is in SS_OPENING state.
-  //  SR_EOS: the end-of-stream has been reached, or the stream is in the
-  //    SS_CLOSED state.
-  virtual StreamResult Read(void* buffer, size_t buffer_len,
-                            size_t* read, int* error) = 0;
-  virtual StreamResult Write(const void* data, size_t data_len,
-                             size_t* written, int* error) = 0;
-  // Attempt to transition to the SS_CLOSED state.  SE_CLOSE will not be
-  // signalled as a result of this call.
-  virtual void Close() = 0;
-
-  // Streams may signal one or more StreamEvents to indicate state changes.
-  // The first argument identifies the stream on which the state change occured.
-  // The second argument is a bit-wise combination of StreamEvents.
-  // If SE_CLOSE is signalled, then the third argument is the associated error
-  // code.  Otherwise, the value is undefined.
-  // Note: Not all streams will support asynchronous event signalling.  However,
-  // SS_OPENING and SR_BLOCK returned from stream member functions imply that
-  // certain events will be raised in the future.
-  sigslot::signal3<StreamInterface*, int, int> SignalEvent;
-
-  // Like calling SignalEvent, but posts a message to the specified thread,
-  // which will call SignalEvent.  This helps unroll the stack and prevent
-  // re-entrancy.
-  void PostEvent(Thread* t, int events, int err);
-  // Like the aforementioned method, but posts to the current thread.
-  void PostEvent(int events, int err);
-
-  //
-  // OPTIONAL OPERATIONS
-  //
-  // Not all implementations will support the following operations.  In general,
-  // a stream will only support an operation if it reasonably efficient to do
-  // so.  For example, while a socket could buffer incoming data to support
-  // seeking, it will not do so.  Instead, a buffering stream adapter should
-  // be used.
-  //
-  // Even though several of these operations are related, you should
-  // always use whichever operation is most relevant.  For example, you may
-  // be tempted to use GetSize() and GetPosition() to deduce the result of
-  // GetAvailable().  However, a stream which is read-once may support the
-  // latter operation but not the former.
-  //
-
-  // The following four methods are used to avoid copying data multiple times.
-
-  // GetReadData returns a pointer to a buffer which is owned by the stream.
-  // The buffer contains data_len bytes.  null is returned if no data is
-  // available, or if the method fails.  If the caller processes the data, it
-  // must call ConsumeReadData with the number of processed bytes.  GetReadData
-  // does not require a matching call to ConsumeReadData if the data is not
-  // processed.  Read and ConsumeReadData invalidate the buffer returned by
-  // GetReadData.
-  virtual const void* GetReadData(size_t* data_len);
-  virtual void ConsumeReadData(size_t used) {}
-
-  // GetWriteBuffer returns a pointer to a buffer which is owned by the stream.
-  // The buffer has a capacity of buf_len bytes.  null is returned if there is
-  // no buffer available, or if the method fails.  The call may write data to
-  // the buffer, and then call ConsumeWriteBuffer with the number of bytes
-  // written.  GetWriteBuffer does not require a matching call to
-  // ConsumeWriteData if no data is written.  Write, ForceWrite, and
-  // ConsumeWriteData invalidate the buffer returned by GetWriteBuffer.
-  // TODO: Allow the caller to specify a minimum buffer size.  If the specified
-  // amount of buffer is not yet available, return null and Signal SE_WRITE
-  // when it is available.  If the requested amount is too large, return an
-  // error.
-  virtual void* GetWriteBuffer(size_t* buf_len);
-  virtual void ConsumeWriteBuffer(size_t used) {}
-
-  // Write data_len bytes found in data, circumventing any throttling which
-  // would could cause SR_BLOCK to be returned.  Returns true if all the data
-  // was written.  Otherwise, the method is unsupported, or an unrecoverable
-  // error occurred, and the error value is set.  This method should be used
-  // sparingly to write critical data which should not be throttled.  A stream
-  // which cannot circumvent its blocking constraints should not implement this
-  // method.
-  // NOTE: This interface is being considered experimentally at the moment.  It
-  // would be used by JUDP and BandwidthStream as a way to circumvent certain
-  // soft limits in writing.
-  //virtual bool ForceWrite(const void* data, size_t data_len, int* error) {
-  //  if (error) *error = -1;
-  //  return false;
-  //}
-
-  // Seek to a byte offset from the beginning of the stream.  Returns false if
-  // the stream does not support seeking, or cannot seek to the specified
-  // position.
-  virtual bool SetPosition(size_t position);
-
-  // Get the byte offset of the current position from the start of the stream.
-  // Returns false if the position is not known.
-  virtual bool GetPosition(size_t* position) const;
-
-  // Get the byte length of the entire stream.  Returns false if the length
-  // is not known.
-  virtual bool GetSize(size_t* size) const;
-
-  // Return the number of Read()-able bytes remaining before end-of-stream.
-  // Returns false if not known.
-  virtual bool GetAvailable(size_t* size) const;
-
-  // Return the number of Write()-able bytes remaining before end-of-stream.
-  // Returns false if not known.
-  virtual bool GetWriteRemaining(size_t* size) const;
-
-  // Return true if flush is successful.
-  virtual bool Flush();
-
-  // Communicates the amount of data which will be written to the stream.  The
-  // stream may choose to preallocate memory to accomodate this data.  The
-  // stream may return false to indicate that there is not enough room (ie,
-  // Write will return SR_EOS/SR_ERROR at some point).  Note that calling this
-  // function should not affect the existing state of data in the stream.
-  virtual bool ReserveSize(size_t size);
-
-  //
-  // CONVENIENCE METHODS
-  //
-  // These methods are implemented in terms of other methods, for convenience.
-  //
-
-  // Seek to the start of the stream.
-  inline bool Rewind() { return SetPosition(0); }
-
-  // WriteAll is a helper function which repeatedly calls Write until all the
-  // data is written, or something other than SR_SUCCESS is returned.  Note that
-  // unlike Write, the argument 'written' is always set, and may be non-zero
-  // on results other than SR_SUCCESS.  The remaining arguments have the
-  // same semantics as Write.
-  StreamResult WriteAll(const void* data, size_t data_len,
-                        size_t* written, int* error);
-
-  // Similar to ReadAll.  Calls Read until buffer_len bytes have been read, or
-  // until a non-SR_SUCCESS result is returned.  'read' is always set.
-  StreamResult ReadAll(void* buffer, size_t buffer_len,
-                       size_t* read, int* error);
-
-  // ReadLine is a helper function which repeatedly calls Read until it hits
-  // the end-of-line character, or something other than SR_SUCCESS.
-  // TODO: this is too inefficient to keep here.  Break this out into a buffered
-  // readline object or adapter
-  StreamResult ReadLine(std::string* line);
-
- protected:
-  StreamInterface();
-
-  // MessageHandler Interface
-  void OnMessage(Message* msg) override;
-
- private:
-  RTC_DISALLOW_COPY_AND_ASSIGN(StreamInterface);
-};
-
-///////////////////////////////////////////////////////////////////////////////
-// StreamAdapterInterface is a convenient base-class for adapting a stream.
-// By default, all operations are pass-through.  Override the methods that you
-// require adaptation.  Streams should really be upgraded to reference-counted.
-// In the meantime, use the owned flag to indicate whether the adapter should
-// own the adapted stream.
-///////////////////////////////////////////////////////////////////////////////
-
-class StreamAdapterInterface : public StreamInterface,
-                               public sigslot::has_slots<> {
- public:
-  explicit StreamAdapterInterface(StreamInterface* stream, bool owned = true);
-
-  // Core Stream Interface
-  StreamState GetState() const override;
-  StreamResult Read(void* buffer,
-                    size_t buffer_len,
-                    size_t* read,
-                    int* error) override;
-  StreamResult Write(const void* data,
-                     size_t data_len,
-                     size_t* written,
-                     int* error) override;
-  void Close() override;
-
-  // Optional Stream Interface
-  /*  Note: Many stream adapters were implemented prior to this Read/Write
-      interface.  Therefore, a simple pass through of data in those cases may
-      be broken.  At a later time, we should do a once-over pass of all
-      adapters, and make them compliant with these interfaces, after which this
-      code can be uncommented.
-  virtual const void* GetReadData(size_t* data_len) {
-    return stream_->GetReadData(data_len);
-  }
-  virtual void ConsumeReadData(size_t used) {
-    stream_->ConsumeReadData(used);
-  }
-
-  virtual void* GetWriteBuffer(size_t* buf_len) {
-    return stream_->GetWriteBuffer(buf_len);
-  }
-  virtual void ConsumeWriteBuffer(size_t used) {
-    stream_->ConsumeWriteBuffer(used);
-  }
-  */
-
-  /*  Note: This interface is currently undergoing evaluation.
-  virtual bool ForceWrite(const void* data, size_t data_len, int* error) {
-    return stream_->ForceWrite(data, data_len, error);
-  }
-  */
-
-  bool SetPosition(size_t position) override;
-  bool GetPosition(size_t* position) const override;
-  bool GetSize(size_t* size) const override;
-  bool GetAvailable(size_t* size) const override;
-  bool GetWriteRemaining(size_t* size) const override;
-  bool ReserveSize(size_t size) override;
-  bool Flush() override;
-
-  void Attach(StreamInterface* stream, bool owned = true);
-  StreamInterface* Detach();
-
- protected:
-  ~StreamAdapterInterface() override;
-
-  // Note that the adapter presents itself as the origin of the stream events,
-  // since users of the adapter may not recognize the adapted object.
-  virtual void OnEvent(StreamInterface* stream, int events, int err);
-  StreamInterface* stream() { return stream_; }
-
- private:
-  StreamInterface* stream_;
-  bool owned_;
-  RTC_DISALLOW_COPY_AND_ASSIGN(StreamAdapterInterface);
-};
-
-///////////////////////////////////////////////////////////////////////////////
-// StreamTap is a non-modifying, pass-through adapter, which copies all data
-// in either direction to the tap.  Note that errors or blocking on writing to
-// the tap will prevent further tap writes from occurring.
-///////////////////////////////////////////////////////////////////////////////
-
-class StreamTap : public StreamAdapterInterface {
- public:
-  explicit StreamTap(StreamInterface* stream, StreamInterface* tap);
-  ~StreamTap() override;
-
-  void AttachTap(StreamInterface* tap);
-  StreamInterface* DetachTap();
-  StreamResult GetTapResult(int* error);
-
-  // StreamAdapterInterface Interface
-  StreamResult Read(void* buffer,
-                    size_t buffer_len,
-                    size_t* read,
-                    int* error) override;
-  StreamResult Write(const void* data,
-                     size_t data_len,
-                     size_t* written,
-                     int* error) override;
-
- private:
-  std::unique_ptr<StreamInterface> tap_;
-  StreamResult tap_result_;
-  int tap_error_;
-  RTC_DISALLOW_COPY_AND_ASSIGN(StreamTap);
-};
-
-///////////////////////////////////////////////////////////////////////////////
-// NullStream gives errors on read, and silently discards all written data.
-///////////////////////////////////////////////////////////////////////////////
-
-class NullStream : public StreamInterface {
- public:
-  NullStream();
-  ~NullStream() override;
-
-  // StreamInterface Interface
-  StreamState GetState() const override;
-  StreamResult Read(void* buffer,
-                    size_t buffer_len,
-                    size_t* read,
-                    int* error) override;
-  StreamResult Write(const void* data,
-                     size_t data_len,
-                     size_t* written,
-                     int* error) override;
-  void Close() override;
-};
-
-///////////////////////////////////////////////////////////////////////////////
-// FileStream is a simple implementation of a StreamInterface, which does not
-// support asynchronous notification.
-///////////////////////////////////////////////////////////////////////////////
-
-class FileStream : public StreamInterface {
- public:
-  FileStream();
-  ~FileStream() override;
-
-  // The semantics of filename and mode are the same as stdio's fopen
-  virtual bool Open(const std::string& filename, const char* mode, int* error);
-  virtual bool OpenShare(const std::string& filename, const char* mode,
-                         int shflag, int* error);
-
-  // By default, reads and writes are buffered for efficiency.  Disabling
-  // buffering causes writes to block until the bytes on disk are updated.
-  virtual bool DisableBuffering();
-
-  StreamState GetState() const override;
-  StreamResult Read(void* buffer,
-                    size_t buffer_len,
-                    size_t* read,
-                    int* error) override;
-  StreamResult Write(const void* data,
-                     size_t data_len,
-                     size_t* written,
-                     int* error) override;
-  void Close() override;
-  bool SetPosition(size_t position) override;
-  bool GetPosition(size_t* position) const override;
-  bool GetSize(size_t* size) const override;
-  bool GetAvailable(size_t* size) const override;
-  bool ReserveSize(size_t size) override;
-
-  bool Flush() override;
-
-#if defined(WEBRTC_POSIX) && !defined(__native_client__)
-  // Tries to aquire an exclusive lock on the file.
-  // Use OpenShare(...) on win32 to get similar functionality.
-  bool TryLock();
-  bool Unlock();
-#endif
-
- protected:
-  virtual void DoClose();
-
-  FILE* file_;
-
- private:
-  RTC_DISALLOW_COPY_AND_ASSIGN(FileStream);
-};
-
-///////////////////////////////////////////////////////////////////////////////
-// MemoryStream is a simple implementation of a StreamInterface over in-memory
-// data.  Data is read and written at the current seek position.  Reads return
-// end-of-stream when they reach the end of data.  Writes actually extend the
-// end of data mark.
-///////////////////////////////////////////////////////////////////////////////
-
-class MemoryStreamBase : public StreamInterface {
- public:
-  StreamState GetState() const override;
-  StreamResult Read(void* buffer,
-                    size_t bytes,
-                    size_t* bytes_read,
-                    int* error) override;
-  StreamResult Write(const void* buffer,
-                     size_t bytes,
-                     size_t* bytes_written,
-                     int* error) override;
-  void Close() override;
-  bool SetPosition(size_t position) override;
-  bool GetPosition(size_t* position) const override;
-  bool GetSize(size_t* size) const override;
-  bool GetAvailable(size_t* size) const override;
-  bool ReserveSize(size_t size) override;
-
-  char* GetBuffer() { return buffer_; }
-  const char* GetBuffer() const { return buffer_; }
-
- protected:
-  MemoryStreamBase();
-
-  virtual StreamResult DoReserve(size_t size, int* error);
-
-  // Invariant: 0 <= seek_position <= data_length_ <= buffer_length_
-  char* buffer_;
-  size_t buffer_length_;
-  size_t data_length_;
-  size_t seek_position_;
-
- private:
-  RTC_DISALLOW_COPY_AND_ASSIGN(MemoryStreamBase);
-};
-
-// MemoryStream dynamically resizes to accomodate written data.
-
-class MemoryStream : public MemoryStreamBase {
- public:
-  MemoryStream();
-  explicit MemoryStream(const char* data);  // Calls SetData(data, strlen(data))
-  MemoryStream(const void* data, size_t length);  // Calls SetData(data, length)
-  ~MemoryStream() override;
-
-  void SetData(const void* data, size_t length);
-
- protected:
-  StreamResult DoReserve(size_t size, int* error) override;
-  // Memory Streams are aligned for efficiency.
-  static const int kAlignment = 16;
-  char* buffer_alloc_;
-};
-
-// ExternalMemoryStream adapts an external memory buffer, so writes which would
-// extend past the end of the buffer will return end-of-stream.
-
-class ExternalMemoryStream : public MemoryStreamBase {
- public:
-  ExternalMemoryStream();
-  ExternalMemoryStream(void* data, size_t length);
-  ~ExternalMemoryStream() override;
-
-  void SetData(void* data, size_t length);
-};
-
-// FifoBuffer allows for efficient, thread-safe buffering of data between
-// writer and reader. As the data can wrap around the end of the buffer,
-// MemoryStreamBase can't help us here.
-
-class FifoBuffer : public StreamInterface {
- public:
-  // Creates a FIFO buffer with the specified capacity.
-  explicit FifoBuffer(size_t length);
-  // Creates a FIFO buffer with the specified capacity and owner
-  FifoBuffer(size_t length, Thread* owner);
-  ~FifoBuffer() override;
-  // Gets the amount of data currently readable from the buffer.
-  bool GetBuffered(size_t* data_len) const;
-  // Resizes the buffer to the specified capacity. Fails if data_length_ > size
-  bool SetCapacity(size_t length);
-
-  // Read into |buffer| with an offset from the current read position, offset
-  // is specified in number of bytes.
-  // This method doesn't adjust read position nor the number of available
-  // bytes, user has to call ConsumeReadData() to do this.
-  StreamResult ReadOffset(void* buffer, size_t bytes, size_t offset,
-                          size_t* bytes_read);
-
-  // Write |buffer| with an offset from the current write position, offset is
-  // specified in number of bytes.
-  // This method doesn't adjust the number of buffered bytes, user has to call
-  // ConsumeWriteBuffer() to do this.
-  StreamResult WriteOffset(const void* buffer, size_t bytes, size_t offset,
-                           size_t* bytes_written);
-
-  // StreamInterface methods
-  StreamState GetState() const override;
-  StreamResult Read(void* buffer,
-                    size_t bytes,
-                    size_t* bytes_read,
-                    int* error) override;
-  StreamResult Write(const void* buffer,
-                     size_t bytes,
-                     size_t* bytes_written,
-                     int* error) override;
-  void Close() override;
-  const void* GetReadData(size_t* data_len) override;
-  void ConsumeReadData(size_t used) override;
-  void* GetWriteBuffer(size_t* buf_len) override;
-  void ConsumeWriteBuffer(size_t used) override;
-  bool GetWriteRemaining(size_t* size) const override;
-
- private:
-  // Helper method that implements ReadOffset. Caller must acquire a lock
-  // when calling this method.
-  StreamResult ReadOffsetLocked(void* buffer,
-                                size_t bytes,
-                                size_t offset,
-                                size_t* bytes_read)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_);
-
-  // Helper method that implements WriteOffset. Caller must acquire a lock
-  // when calling this method.
-  StreamResult WriteOffsetLocked(const void* buffer,
-                                 size_t bytes,
-                                 size_t offset,
-                                 size_t* bytes_written)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_);
-
-  // keeps the opened/closed state of the stream
-  StreamState state_ RTC_GUARDED_BY(crit_);
-  // the allocated buffer
-  std::unique_ptr<char[]> buffer_ RTC_GUARDED_BY(crit_);
-  // size of the allocated buffer
-  size_t buffer_length_ RTC_GUARDED_BY(crit_);
-  // amount of readable data in the buffer
-  size_t data_length_ RTC_GUARDED_BY(crit_);
-  // offset to the readable data
-  size_t read_position_ RTC_GUARDED_BY(crit_);
-  // stream callbacks are dispatched on this thread
-  Thread* owner_;
-  // object lock
-  CriticalSection crit_;
-  RTC_DISALLOW_COPY_AND_ASSIGN(FifoBuffer);
-};
-
-///////////////////////////////////////////////////////////////////////////////
-
-class LoggingAdapter : public StreamAdapterInterface {
- public:
-  LoggingAdapter(StreamInterface* stream, LoggingSeverity level,
-                 const std::string& label, bool hex_mode = false);
-
-  void set_label(const std::string& label);
-
-  StreamResult Read(void* buffer,
-                    size_t buffer_len,
-                    size_t* read,
-                    int* error) override;
-  StreamResult Write(const void* data,
-                     size_t data_len,
-                     size_t* written,
-                     int* error) override;
-  void Close() override;
-
- protected:
-  void OnEvent(StreamInterface* stream, int events, int err) override;
-
- private:
-  LoggingSeverity level_;
-  std::string label_;
-  bool hex_mode_;
-  LogMultilineState lms_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(LoggingAdapter);
-};
-
-///////////////////////////////////////////////////////////////////////////////
-// StringStream - Reads/Writes to an external std::string
-///////////////////////////////////////////////////////////////////////////////
-
-class StringStream : public StreamInterface {
- public:
-  explicit StringStream(std::string* str);
-  explicit StringStream(const std::string& str);
-
-  StreamState GetState() const override;
-  StreamResult Read(void* buffer,
-                    size_t buffer_len,
-                    size_t* read,
-                    int* error) override;
-  StreamResult Write(const void* data,
-                     size_t data_len,
-                     size_t* written,
-                     int* error) override;
-  void Close() override;
-  bool SetPosition(size_t position) override;
-  bool GetPosition(size_t* position) const override;
-  bool GetSize(size_t* size) const override;
-  bool GetAvailable(size_t* size) const override;
-  bool ReserveSize(size_t size) override;
-
- private:
-  std::string& str_;
-  size_t read_pos_;
-  bool read_only_;
-};
-
-///////////////////////////////////////////////////////////////////////////////
-// StreamReference - A reference counting stream adapter
-///////////////////////////////////////////////////////////////////////////////
-
-// Keep in mind that the streams and adapters defined in this file are
-// not thread-safe, so this has limited uses.
-
-// A StreamRefCount holds the reference count and a pointer to the
-// wrapped stream. It deletes the wrapped stream when there are no
-// more references. We can then have multiple StreamReference
-// instances pointing to one StreamRefCount, all wrapping the same
-// stream.
-
-class StreamReference : public StreamAdapterInterface {
-  class StreamRefCount;
- public:
-  // Constructor for the first reference to a stream
-  // Note: get more references through NewReference(). Use this
-  // constructor only once on a given stream.
-  explicit StreamReference(StreamInterface* stream);
-  StreamInterface* GetStream() { return stream(); }
-  StreamInterface* NewReference();
-  ~StreamReference() override;
-
- private:
-  class StreamRefCount {
-   public:
-    explicit StreamRefCount(StreamInterface* stream)
-        : stream_(stream), ref_count_(1) {
-    }
-    void AddReference() {
-      CritScope lock(&cs_);
-      ++ref_count_;
-    }
-    void Release() {
-      int ref_count;
-      {  // Atomic ops would have been a better fit here.
-        CritScope lock(&cs_);
-        ref_count = --ref_count_;
-      }
-      if (ref_count == 0) {
-        delete stream_;
-        delete this;
-      }
-    }
-   private:
-    StreamInterface* stream_;
-    int ref_count_;
-    CriticalSection cs_;
-    RTC_DISALLOW_COPY_AND_ASSIGN(StreamRefCount);
-  };
-
-  // Constructor for adding references
-  explicit StreamReference(StreamRefCount* stream_ref_count,
-                           StreamInterface* stream);
-
-  StreamRefCount* stream_ref_count_;
-  RTC_DISALLOW_COPY_AND_ASSIGN(StreamReference);
-};
-
-///////////////////////////////////////////////////////////////////////////////
-
-// Flow attempts to move bytes from source to sink via buffer of size
-// buffer_len.  The function returns SR_SUCCESS when source reaches
-// end-of-stream (returns SR_EOS), and all the data has been written successful
-// to sink.  Alternately, if source returns SR_BLOCK or SR_ERROR, or if sink
-// returns SR_BLOCK, SR_ERROR, or SR_EOS, then the function immediately returns
-// with the unexpected StreamResult value.
-// data_len is the length of the valid data in buffer. in case of error
-// this is the data that read from source but can't move to destination.
-// as a pass in parameter, it indicates data in buffer that should move to sink
-StreamResult Flow(StreamInterface* source,
-                  char* buffer,
-                  size_t buffer_len,
-                  StreamInterface* sink,
-                  size_t* data_len = nullptr);
-
-///////////////////////////////////////////////////////////////////////////////
-
-}  // namespace rtc
-
-#endif  // WEBRTC_RTC_BASE_STREAM_H_
diff --git a/rtc_base/stream_unittest.cc b/rtc_base/stream_unittest.cc
deleted file mode 100644
index 0f8fbf1..0000000
--- a/rtc_base/stream_unittest.cc
+++ /dev/null
@@ -1,374 +0,0 @@
-/*
- *  Copyright 2004 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/rtc_base/stream.h"
-#include "webrtc/rtc_base/fileutils.h"
-#include "webrtc/rtc_base/gunit.h"
-#include "webrtc/rtc_base/pathutils.h"
-
-namespace rtc {
-
-///////////////////////////////////////////////////////////////////////////////
-// TestStream
-///////////////////////////////////////////////////////////////////////////////
-
-class TestStream : public StreamInterface {
- public:
-  TestStream() : pos_(0) { }
-
-  virtual StreamState GetState() const { return SS_OPEN; }
-  virtual StreamResult Read(void* buffer, size_t buffer_len,
-                            size_t* read, int* error) {
-    unsigned char* uc_buffer = static_cast<unsigned char*>(buffer);
-    for (size_t i = 0; i < buffer_len; ++i) {
-      uc_buffer[i] = static_cast<unsigned char>(pos_++);
-    }
-    if (read)
-      *read = buffer_len;
-    return SR_SUCCESS;
-  }
-  virtual StreamResult Write(const void* data, size_t data_len,
-                             size_t* written, int* error) {
-    if (error)
-      *error = -1;
-    return SR_ERROR;
-  }
-  virtual void Close() { }
-  virtual bool SetPosition(size_t position) {
-    pos_ = position;
-    return true;
-  }
-  virtual bool GetPosition(size_t* position) const {
-    if (position) *position = pos_;
-    return true;
-  }
-  virtual bool GetSize(size_t* size) const {
-    return false;
-  }
-  virtual bool GetAvailable(size_t* size) const {
-    return false;
-  }
-
- private:
-  size_t pos_;
-};
-
-bool VerifyTestBuffer(unsigned char* buffer, size_t len,
-                      unsigned char value) {
-  bool passed = true;
-  for (size_t i = 0; i < len; ++i) {
-    if (buffer[i] != value++) {
-      passed = false;
-      break;
-    }
-  }
-  // Ensure that we don't pass again without re-writing
-  memset(buffer, 0, len);
-  return passed;
-}
-
-void SeekTest(StreamInterface* stream, const unsigned char value) {
-  size_t bytes;
-  unsigned char buffer[13] = { 0 };
-  const size_t kBufSize = sizeof(buffer);
-
-  EXPECT_EQ(stream->Read(buffer, kBufSize, &bytes, nullptr), SR_SUCCESS);
-  EXPECT_EQ(bytes, kBufSize);
-  EXPECT_TRUE(VerifyTestBuffer(buffer, kBufSize, value));
-  EXPECT_TRUE(stream->GetPosition(&bytes));
-  EXPECT_EQ(13U, bytes);
-
-  EXPECT_TRUE(stream->SetPosition(7));
-
-  EXPECT_EQ(stream->Read(buffer, kBufSize, &bytes, nullptr), SR_SUCCESS);
-  EXPECT_EQ(bytes, kBufSize);
-  EXPECT_TRUE(VerifyTestBuffer(buffer, kBufSize, value + 7));
-  EXPECT_TRUE(stream->GetPosition(&bytes));
-  EXPECT_EQ(20U, bytes);
-}
-
-TEST(FifoBufferTest, TestAll) {
-  const size_t kSize = 16;
-  const char in[kSize * 2 + 1] = "0123456789ABCDEFGHIJKLMNOPQRSTUV";
-  char out[kSize * 2];
-  void* p;
-  const void* q;
-  size_t bytes;
-  FifoBuffer buf(kSize);
-  StreamInterface* stream = &buf;
-
-  // Test assumptions about base state
-  EXPECT_EQ(SS_OPEN, stream->GetState());
-  EXPECT_EQ(SR_BLOCK, stream->Read(out, kSize, &bytes, nullptr));
-  EXPECT_TRUE(nullptr != stream->GetReadData(&bytes));
-  EXPECT_EQ((size_t)0, bytes);
-  stream->ConsumeReadData(0);
-  EXPECT_TRUE(nullptr != stream->GetWriteBuffer(&bytes));
-  EXPECT_EQ(kSize, bytes);
-  stream->ConsumeWriteBuffer(0);
-
-  // Try a full write
-  EXPECT_EQ(SR_SUCCESS, stream->Write(in, kSize, &bytes, nullptr));
-  EXPECT_EQ(kSize, bytes);
-
-  // Try a write that should block
-  EXPECT_EQ(SR_BLOCK, stream->Write(in, kSize, &bytes, nullptr));
-
-  // Try a full read
-  EXPECT_EQ(SR_SUCCESS, stream->Read(out, kSize, &bytes, nullptr));
-  EXPECT_EQ(kSize, bytes);
-  EXPECT_EQ(0, memcmp(in, out, kSize));
-
-  // Try a read that should block
-  EXPECT_EQ(SR_BLOCK, stream->Read(out, kSize, &bytes, nullptr));
-
-  // Try a too-big write
-  EXPECT_EQ(SR_SUCCESS, stream->Write(in, kSize * 2, &bytes, nullptr));
-  EXPECT_EQ(bytes, kSize);
-
-  // Try a too-big read
-  EXPECT_EQ(SR_SUCCESS, stream->Read(out, kSize * 2, &bytes, nullptr));
-  EXPECT_EQ(kSize, bytes);
-  EXPECT_EQ(0, memcmp(in, out, kSize));
-
-  // Try some small writes and reads
-  EXPECT_EQ(SR_SUCCESS, stream->Write(in, kSize / 2, &bytes, nullptr));
-  EXPECT_EQ(kSize / 2, bytes);
-  EXPECT_EQ(SR_SUCCESS, stream->Read(out, kSize / 2, &bytes, nullptr));
-  EXPECT_EQ(kSize / 2, bytes);
-  EXPECT_EQ(0, memcmp(in, out, kSize / 2));
-  EXPECT_EQ(SR_SUCCESS, stream->Write(in, kSize / 2, &bytes, nullptr));
-  EXPECT_EQ(kSize / 2, bytes);
-  EXPECT_EQ(SR_SUCCESS, stream->Write(in, kSize / 2, &bytes, nullptr));
-  EXPECT_EQ(kSize / 2, bytes);
-  EXPECT_EQ(SR_SUCCESS, stream->Read(out, kSize / 2, &bytes, nullptr));
-  EXPECT_EQ(kSize / 2, bytes);
-  EXPECT_EQ(0, memcmp(in, out, kSize / 2));
-  EXPECT_EQ(SR_SUCCESS, stream->Read(out, kSize / 2, &bytes, nullptr));
-  EXPECT_EQ(kSize / 2, bytes);
-  EXPECT_EQ(0, memcmp(in, out, kSize / 2));
-
-  // Try wraparound reads and writes in the following pattern
-  // WWWWWWWWWWWW.... 0123456789AB....
-  // RRRRRRRRXXXX.... ........89AB....
-  // WWWW....XXXXWWWW 4567....89AB0123
-  // XXXX....RRRRXXXX 4567........0123
-  // XXXXWWWWWWWWXXXX 4567012345670123
-  // RRRRXXXXXXXXRRRR ....01234567....
-  // ....RRRRRRRR.... ................
-  EXPECT_EQ(SR_SUCCESS, stream->Write(in, kSize * 3 / 4, &bytes, nullptr));
-  EXPECT_EQ(kSize * 3 / 4, bytes);
-  EXPECT_EQ(SR_SUCCESS, stream->Read(out, kSize / 2, &bytes, nullptr));
-  EXPECT_EQ(kSize / 2, bytes);
-  EXPECT_EQ(0, memcmp(in, out, kSize / 2));
-  EXPECT_EQ(SR_SUCCESS, stream->Write(in, kSize / 2, &bytes, nullptr));
-  EXPECT_EQ(kSize / 2, bytes);
-  EXPECT_EQ(SR_SUCCESS, stream->Read(out, kSize / 4, &bytes, nullptr));
-  EXPECT_EQ(kSize / 4 , bytes);
-  EXPECT_EQ(0, memcmp(in + kSize / 2, out, kSize / 4));
-  EXPECT_EQ(SR_SUCCESS, stream->Write(in, kSize / 2, &bytes, nullptr));
-  EXPECT_EQ(kSize / 2, bytes);
-  EXPECT_EQ(SR_SUCCESS, stream->Read(out, kSize / 2, &bytes, nullptr));
-  EXPECT_EQ(kSize / 2 , bytes);
-  EXPECT_EQ(0, memcmp(in, out, kSize / 2));
-  EXPECT_EQ(SR_SUCCESS, stream->Read(out, kSize / 2, &bytes, nullptr));
-  EXPECT_EQ(kSize / 2 , bytes);
-  EXPECT_EQ(0, memcmp(in, out, kSize / 2));
-
-  // Use GetWriteBuffer to reset the read_position for the next tests
-  stream->GetWriteBuffer(&bytes);
-  stream->ConsumeWriteBuffer(0);
-
-  // Try using GetReadData to do a full read
-  EXPECT_EQ(SR_SUCCESS, stream->Write(in, kSize, &bytes, nullptr));
-  q = stream->GetReadData(&bytes);
-  EXPECT_TRUE(nullptr != q);
-  EXPECT_EQ(kSize, bytes);
-  EXPECT_EQ(0, memcmp(q, in, kSize));
-  stream->ConsumeReadData(kSize);
-  EXPECT_EQ(SR_BLOCK, stream->Read(out, kSize, &bytes, nullptr));
-
-  // Try using GetReadData to do some small reads
-  EXPECT_EQ(SR_SUCCESS, stream->Write(in, kSize, &bytes, nullptr));
-  q = stream->GetReadData(&bytes);
-  EXPECT_TRUE(nullptr != q);
-  EXPECT_EQ(kSize, bytes);
-  EXPECT_EQ(0, memcmp(q, in, kSize / 2));
-  stream->ConsumeReadData(kSize / 2);
-  q = stream->GetReadData(&bytes);
-  EXPECT_TRUE(nullptr != q);
-  EXPECT_EQ(kSize / 2, bytes);
-  EXPECT_EQ(0, memcmp(q, in + kSize / 2, kSize / 2));
-  stream->ConsumeReadData(kSize / 2);
-  EXPECT_EQ(SR_BLOCK, stream->Read(out, kSize, &bytes, nullptr));
-
-  // Try using GetReadData in a wraparound case
-  // WWWWWWWWWWWWWWWW 0123456789ABCDEF
-  // RRRRRRRRRRRRXXXX ............CDEF
-  // WWWWWWWW....XXXX 01234567....CDEF
-  // ............RRRR 01234567........
-  // RRRRRRRR........ ................
-  EXPECT_EQ(SR_SUCCESS, stream->Write(in, kSize, &bytes, nullptr));
-  EXPECT_EQ(SR_SUCCESS, stream->Read(out, kSize * 3 / 4, &bytes, nullptr));
-  EXPECT_EQ(SR_SUCCESS, stream->Write(in, kSize / 2, &bytes, nullptr));
-  q = stream->GetReadData(&bytes);
-  EXPECT_TRUE(nullptr != q);
-  EXPECT_EQ(kSize / 4, bytes);
-  EXPECT_EQ(0, memcmp(q, in + kSize * 3 / 4, kSize / 4));
-  stream->ConsumeReadData(kSize / 4);
-  q = stream->GetReadData(&bytes);
-  EXPECT_TRUE(nullptr != q);
-  EXPECT_EQ(kSize / 2, bytes);
-  EXPECT_EQ(0, memcmp(q, in, kSize / 2));
-  stream->ConsumeReadData(kSize / 2);
-
-  // Use GetWriteBuffer to reset the read_position for the next tests
-  stream->GetWriteBuffer(&bytes);
-  stream->ConsumeWriteBuffer(0);
-
-  // Try using GetWriteBuffer to do a full write
-  p = stream->GetWriteBuffer(&bytes);
-  EXPECT_TRUE(nullptr != p);
-  EXPECT_EQ(kSize, bytes);
-  memcpy(p, in, kSize);
-  stream->ConsumeWriteBuffer(kSize);
-  EXPECT_EQ(SR_SUCCESS, stream->Read(out, kSize, &bytes, nullptr));
-  EXPECT_EQ(kSize, bytes);
-  EXPECT_EQ(0, memcmp(in, out, kSize));
-
-  // Try using GetWriteBuffer to do some small writes
-  p = stream->GetWriteBuffer(&bytes);
-  EXPECT_TRUE(nullptr != p);
-  EXPECT_EQ(kSize, bytes);
-  memcpy(p, in, kSize / 2);
-  stream->ConsumeWriteBuffer(kSize / 2);
-  p = stream->GetWriteBuffer(&bytes);
-  EXPECT_TRUE(nullptr != p);
-  EXPECT_EQ(kSize / 2, bytes);
-  memcpy(p, in + kSize / 2, kSize / 2);
-  stream->ConsumeWriteBuffer(kSize / 2);
-  EXPECT_EQ(SR_SUCCESS, stream->Read(out, kSize, &bytes, nullptr));
-  EXPECT_EQ(kSize, bytes);
-  EXPECT_EQ(0, memcmp(in, out, kSize));
-
-  // Try using GetWriteBuffer in a wraparound case
-  // WWWWWWWWWWWW.... 0123456789AB....
-  // RRRRRRRRXXXX.... ........89AB....
-  // ........XXXXWWWW ........89AB0123
-  // WWWW....XXXXXXXX 4567....89AB0123
-  // RRRR....RRRRRRRR ................
-  EXPECT_EQ(SR_SUCCESS, stream->Write(in, kSize * 3 / 4, &bytes, nullptr));
-  EXPECT_EQ(SR_SUCCESS, stream->Read(out, kSize / 2, &bytes, nullptr));
-  p = stream->GetWriteBuffer(&bytes);
-  EXPECT_TRUE(nullptr != p);
-  EXPECT_EQ(kSize / 4, bytes);
-  memcpy(p, in, kSize / 4);
-  stream->ConsumeWriteBuffer(kSize / 4);
-  p = stream->GetWriteBuffer(&bytes);
-  EXPECT_TRUE(nullptr != p);
-  EXPECT_EQ(kSize / 2, bytes);
-  memcpy(p, in + kSize / 4, kSize / 4);
-  stream->ConsumeWriteBuffer(kSize / 4);
-  EXPECT_EQ(SR_SUCCESS, stream->Read(out, kSize * 3 / 4, &bytes, nullptr));
-  EXPECT_EQ(kSize * 3 / 4, bytes);
-  EXPECT_EQ(0, memcmp(in + kSize / 2, out, kSize / 4));
-  EXPECT_EQ(0, memcmp(in, out + kSize / 4, kSize / 4));
-
-  // Check that the stream is now empty
-  EXPECT_EQ(SR_BLOCK, stream->Read(out, kSize, &bytes, nullptr));
-
-  // Try growing the buffer
-  EXPECT_EQ(SR_SUCCESS, stream->Write(in, kSize, &bytes, nullptr));
-  EXPECT_EQ(kSize, bytes);
-  EXPECT_TRUE(buf.SetCapacity(kSize * 2));
-  EXPECT_EQ(SR_SUCCESS, stream->Write(in + kSize, kSize, &bytes, nullptr));
-  EXPECT_EQ(kSize, bytes);
-  EXPECT_EQ(SR_SUCCESS, stream->Read(out, kSize * 2, &bytes, nullptr));
-  EXPECT_EQ(kSize * 2, bytes);
-  EXPECT_EQ(0, memcmp(in, out, kSize * 2));
-
-  // Try shrinking the buffer
-  EXPECT_EQ(SR_SUCCESS, stream->Write(in, kSize, &bytes, nullptr));
-  EXPECT_EQ(kSize, bytes);
-  EXPECT_TRUE(buf.SetCapacity(kSize));
-  EXPECT_EQ(SR_BLOCK, stream->Write(in, kSize, &bytes, nullptr));
-  EXPECT_EQ(SR_SUCCESS, stream->Read(out, kSize, &bytes, nullptr));
-  EXPECT_EQ(kSize, bytes);
-  EXPECT_EQ(0, memcmp(in, out, kSize));
-
-  // Write to the stream, close it, read the remaining bytes
-  EXPECT_EQ(SR_SUCCESS, stream->Write(in, kSize / 2, &bytes, nullptr));
-  stream->Close();
-  EXPECT_EQ(SS_CLOSED, stream->GetState());
-  EXPECT_EQ(SR_EOS, stream->Write(in, kSize / 2, &bytes, nullptr));
-  EXPECT_EQ(SR_SUCCESS, stream->Read(out, kSize / 2, &bytes, nullptr));
-  EXPECT_EQ(0, memcmp(in, out, kSize / 2));
-  EXPECT_EQ(SR_EOS, stream->Read(out, kSize / 2, &bytes, nullptr));
-}
-
-TEST(FifoBufferTest, FullBufferCheck) {
-  FifoBuffer buff(10);
-  buff.ConsumeWriteBuffer(10);
-
-  size_t free;
-  EXPECT_TRUE(buff.GetWriteBuffer(&free) != nullptr);
-  EXPECT_EQ(0U, free);
-}
-
-TEST(FifoBufferTest, WriteOffsetAndReadOffset) {
-  const size_t kSize = 16;
-  const char in[kSize * 2 + 1] = "0123456789ABCDEFGHIJKLMNOPQRSTUV";
-  char out[kSize * 2];
-  FifoBuffer buf(kSize);
-
-  // Write 14 bytes.
-  EXPECT_EQ(SR_SUCCESS, buf.Write(in, 14, nullptr, nullptr));
-
-  // Make sure data is in |buf|.
-  size_t buffered;
-  EXPECT_TRUE(buf.GetBuffered(&buffered));
-  EXPECT_EQ(14u, buffered);
-
-  // Read 10 bytes.
-  buf.ConsumeReadData(10);
-
-  // There should be now 12 bytes of available space.
-  size_t remaining;
-  EXPECT_TRUE(buf.GetWriteRemaining(&remaining));
-  EXPECT_EQ(12u, remaining);
-
-  // Write at offset 12, this should fail.
-  EXPECT_EQ(SR_BLOCK, buf.WriteOffset(in, 10, 12, nullptr));
-
-  // Write 8 bytes at offset 4, this wraps around the buffer.
-  EXPECT_EQ(SR_SUCCESS, buf.WriteOffset(in, 8, 4, nullptr));
-
-  // Number of available space remains the same until we call
-  // ConsumeWriteBuffer().
-  EXPECT_TRUE(buf.GetWriteRemaining(&remaining));
-  EXPECT_EQ(12u, remaining);
-  buf.ConsumeWriteBuffer(12);
-
-  // There's 4 bytes bypassed and 4 bytes no read so skip them and verify the
-  // 8 bytes written.
-  size_t read;
-  EXPECT_EQ(SR_SUCCESS, buf.ReadOffset(out, 8, 8, &read));
-  EXPECT_EQ(8u, read);
-  EXPECT_EQ(0, memcmp(out, in, 8));
-
-  // There should still be 16 bytes available for reading.
-  EXPECT_TRUE(buf.GetBuffered(&buffered));
-  EXPECT_EQ(16u, buffered);
-
-  // Read at offset 16, this should fail since we don't have that much data.
-  EXPECT_EQ(SR_BLOCK, buf.ReadOffset(out, 10, 16, nullptr));
-}
-
-}  // namespace rtc
diff --git a/rtc_base/string_to_number.cc b/rtc_base/string_to_number.cc
deleted file mode 100644
index 06107f5..0000000
--- a/rtc_base/string_to_number.cc
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- *  Copyright 2017 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 <cerrno>
-#include <cstdlib>
-
-#include "webrtc/rtc_base/string_to_number.h"
-
-namespace rtc {
-namespace string_to_number_internal {
-
-rtc::Optional<signed_type> ParseSigned(const char* str, int base) {
-  RTC_DCHECK(str);
-  if (isdigit(str[0]) || str[0] == '-') {
-    char* end = nullptr;
-    errno = 0;
-    const signed_type value = std::strtoll(str, &end, base);
-    if (end && *end == '\0' && errno == 0) {
-      return rtc::Optional<signed_type>(value);
-    }
-  }
-  return rtc::Optional<signed_type>();
-}
-
-rtc::Optional<unsigned_type> ParseUnsigned(const char* str, int base) {
-  RTC_DCHECK(str);
-  if (isdigit(str[0]) || str[0] == '-') {
-    // Explicitly discard negative values. std::strtoull parsing causes unsigned
-    // wraparound. We cannot just reject values that start with -, though, since
-    // -0 is perfectly fine, as is -0000000000000000000000000000000.
-    const bool is_negative = str[0] == '-';
-    char* end = nullptr;
-    errno = 0;
-    const unsigned_type value = std::strtoull(str, &end, base);
-    if (end && *end == '\0' && errno == 0 && (value == 0 || !is_negative)) {
-      return rtc::Optional<unsigned_type>(value);
-    }
-  }
-  return rtc::Optional<unsigned_type>();
-}
-
-}  // namespace string_to_number_internal
-}  // namespace rtc
diff --git a/rtc_base/string_to_number.h b/rtc_base/string_to_number.h
deleted file mode 100644
index 93bd850..0000000
--- a/rtc_base/string_to_number.h
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- *  Copyright 2017 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_RTC_BASE_STRING_TO_NUMBER_H_
-#define WEBRTC_RTC_BASE_STRING_TO_NUMBER_H_
-
-#include <string>
-#include <limits>
-
-#include "webrtc/api/optional.h"
-
-namespace rtc {
-
-// This file declares a family of functions to parse integers from strings.
-// The standard C library functions either fail to indicate errors (atoi, etc.)
-// or are a hassle to work with (strtol, sscanf, etc.). The standard C++ library
-// functions (std::stoi, etc.) indicate errors by throwing exceptions, which
-// are disabled in WebRTC.
-//
-// Integers are parsed using one of the following functions:
-//   rtc::Optional<int-type> StringToNumber(const char* str, int base = 10);
-//   rtc::Optional<int-type> StringToNumber(const std::string& str,
-//                                          int base = 10);
-//
-// These functions parse a value from the beginning of a string into one of the
-// fundamental integer types, or returns an empty Optional if parsing
-// failed. Values outside of the range supported by the type will be
-// rejected. The strings must begin with a digit or a minus sign. No leading
-// space nor trailing contents are allowed.
-// By setting base to 0, one of octal, decimal or hexadecimal will be
-// detected from the string's prefix (0, nothing or 0x, respectively).
-// If non-zero, base can be set to a value between 2 and 36 inclusively.
-//
-// If desired, this interface could be extended with support for floating-point
-// types.
-
-namespace string_to_number_internal {
-// These must be (unsigned) long long, to match the signature of strto(u)ll.
-using unsigned_type = unsigned long long;  // NOLINT(runtime/int)
-using signed_type = long long;  // NOLINT(runtime/int)
-
-rtc::Optional<signed_type> ParseSigned(const char* str, int base);
-rtc::Optional<unsigned_type> ParseUnsigned(const char* str, int base);
-}  // namespace string_to_number_internal
-
-template <typename T>
-typename std::enable_if<std::is_integral<T>::value && std::is_signed<T>::value,
-                        rtc::Optional<T>>::type
-StringToNumber(const char* str, int base = 10) {
-  using string_to_number_internal::signed_type;
-  static_assert(
-      std::numeric_limits<T>::max() <=
-              std::numeric_limits<signed_type>::max() &&
-          std::numeric_limits<T>::lowest() >=
-              std::numeric_limits<signed_type>::lowest(),
-      "StringToNumber only supports signed integers as large as long long int");
-  rtc::Optional<signed_type> value =
-      string_to_number_internal::ParseSigned(str, base);
-  if (value && *value >= std::numeric_limits<T>::lowest() &&
-      *value <= std::numeric_limits<T>::max()) {
-    return rtc::Optional<T>(static_cast<T>(*value));
-  }
-  return rtc::Optional<T>();
-}
-
-template <typename T>
-typename std::enable_if<std::is_integral<T>::value &&
-                            std::is_unsigned<T>::value,
-                        rtc::Optional<T>>::type
-StringToNumber(const char* str, int base = 10) {
-  using string_to_number_internal::unsigned_type;
-  static_assert(std::numeric_limits<T>::max() <=
-                    std::numeric_limits<unsigned_type>::max(),
-                "StringToNumber only supports unsigned integers as large as "
-                "unsigned long long int");
-  rtc::Optional<unsigned_type> value =
-      string_to_number_internal::ParseUnsigned(str, base);
-  if (value && *value <= std::numeric_limits<T>::max()) {
-    return rtc::Optional<T>(static_cast<T>(*value));
-  }
-  return rtc::Optional<T>();
-}
-
-// The std::string overloads only exists if there is a matching const char*
-// version.
-template <typename T>
-auto StringToNumber(const std::string& str, int base = 10)
-    -> decltype(StringToNumber<T>(str.c_str(), base)) {
-  return StringToNumber<T>(str.c_str(), base);
-}
-
-}  // namespace rtc
-
-#endif  // WEBRTC_RTC_BASE_STRING_TO_NUMBER_H_
diff --git a/rtc_base/string_to_number_unittest.cc b/rtc_base/string_to_number_unittest.cc
deleted file mode 100644
index 2c1aece..0000000
--- a/rtc_base/string_to_number_unittest.cc
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- *  Copyright 2017 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/rtc_base/string_to_number.h"
-
-#include <string>
-#include <type_traits>
-#include <limits>
-
-#include "webrtc/rtc_base/gunit.h"
-
-namespace rtc {
-
-namespace {
-// clang-format off
-using IntegerTypes =
-    ::testing::Types<char,
-                     signed char, unsigned char,       // NOLINT(runtime/int)
-                     short,       unsigned short,      // NOLINT(runtime/int)
-                     int,         unsigned int,        // NOLINT(runtime/int)
-                     long,        unsigned long,       // NOLINT(runtime/int)
-                     long long,   unsigned long long,  // NOLINT(runtime/int)
-                     int8_t,      uint8_t,
-                     int16_t,     uint16_t,
-                     int32_t,     uint32_t,
-                     int64_t,     uint64_t>;
-// clang-format on
-
-template <typename T>
-class BasicNumberTest : public ::testing::Test {};
-
-TYPED_TEST_CASE_P(BasicNumberTest);
-
-TYPED_TEST_P(BasicNumberTest, TestValidNumbers) {
-  using T = TypeParam;
-  constexpr T min_value = std::numeric_limits<T>::lowest();
-  constexpr T max_value = std::numeric_limits<T>::max();
-  const std::string min_string = std::to_string(min_value);
-  const std::string max_string = std::to_string(max_value);
-  EXPECT_EQ(min_value, StringToNumber<T>(min_string));
-  EXPECT_EQ(min_value, StringToNumber<T>(min_string.c_str()));
-  EXPECT_EQ(max_value, StringToNumber<T>(max_string));
-  EXPECT_EQ(max_value, StringToNumber<T>(max_string.c_str()));
-  EXPECT_EQ(0, StringToNumber<T>("0"));
-  EXPECT_EQ(0, StringToNumber<T>("-0"));
-  EXPECT_EQ(0, StringToNumber<T>(std::string("-0000000000000")));
-}
-
-TYPED_TEST_P(BasicNumberTest, TestInvalidNumbers) {
-  using T = TypeParam;
-  // Value ranges aren't strictly enforced in this test, since that would either
-  // require doctoring specific strings for each data type, which is a hassle
-  // across platforms, or to be able to do addition of values larger than the
-  // largest type, which is another hassle.
-  constexpr T min_value = std::numeric_limits<T>::lowest();
-  constexpr T max_value = std::numeric_limits<T>::max();
-  // If the type supports negative values, make the large negative value
-  // approximately ten times larger. If the type is unsigned, just use -2.
-  const std::string too_low_string =
-      (min_value == 0) ? "-2" : (std::to_string(min_value) + "1");
-  // Make the large value approximately ten times larger than the maximum.
-  const std::string too_large_string = std::to_string(max_value) + "1";
-  EXPECT_EQ(rtc::Optional<T>(), StringToNumber<T>(too_low_string));
-  EXPECT_EQ(rtc::Optional<T>(), StringToNumber<T>(too_low_string.c_str()));
-  EXPECT_EQ(rtc::Optional<T>(), StringToNumber<T>(too_large_string));
-  EXPECT_EQ(rtc::Optional<T>(), StringToNumber<T>(too_large_string.c_str()));
-}
-
-TYPED_TEST_P(BasicNumberTest, TestInvalidInputs) {
-  using T = TypeParam;
-  const char kInvalidCharArray[] = "Invalid string containing 47";
-  const char kPlusMinusCharArray[] = "+-100";
-  const char kNumberFollowedByCruft[] = "640x480";
-  EXPECT_EQ(rtc::Optional<T>(), StringToNumber<T>(kInvalidCharArray));
-  EXPECT_EQ(rtc::Optional<T>(),
-            StringToNumber<T>(std::string(kInvalidCharArray)));
-  EXPECT_EQ(rtc::Optional<T>(), StringToNumber<T>(kPlusMinusCharArray));
-  EXPECT_EQ(rtc::Optional<T>(),
-            StringToNumber<T>(std::string(kPlusMinusCharArray)));
-  EXPECT_EQ(rtc::Optional<T>(), StringToNumber<T>(kNumberFollowedByCruft));
-  EXPECT_EQ(rtc::Optional<T>(),
-            StringToNumber<T>(std::string(kNumberFollowedByCruft)));
-  EXPECT_EQ(rtc::Optional<T>(), StringToNumber<T>(" 5"));
-  EXPECT_EQ(rtc::Optional<T>(), StringToNumber<T>(" - 5"));
-  EXPECT_EQ(rtc::Optional<T>(), StringToNumber<T>("- 5"));
-  EXPECT_EQ(rtc::Optional<T>(), StringToNumber<T>(" -5"));
-  EXPECT_EQ(rtc::Optional<T>(), StringToNumber<T>("5 "));
-}
-
-REGISTER_TYPED_TEST_CASE_P(BasicNumberTest,
-                           TestValidNumbers,
-                           TestInvalidNumbers,
-                           TestInvalidInputs);
-
-}  // namespace
-
-INSTANTIATE_TYPED_TEST_CASE_P(StringToNumberTest_Integers,
-                              BasicNumberTest,
-                              IntegerTypes);
-
-TEST(StringToNumberTest, TestSpecificValues) {
-  EXPECT_EQ(rtc::Optional<uint8_t>(), StringToNumber<uint8_t>("256"));
-  EXPECT_EQ(rtc::Optional<uint8_t>(), StringToNumber<uint8_t>("-256"));
-  EXPECT_EQ(rtc::Optional<int8_t>(), StringToNumber<int8_t>("256"));
-  EXPECT_EQ(rtc::Optional<int8_t>(), StringToNumber<int8_t>("-256"));
-}
-
-}  // namespace rtc
diff --git a/rtc_base/stringencode.cc b/rtc_base/stringencode.cc
deleted file mode 100644
index a4d594d..0000000
--- a/rtc_base/stringencode.cc
+++ /dev/null
@@ -1,718 +0,0 @@
-/*
- *  Copyright 2004 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/rtc_base/stringencode.h"
-
-#include <stdio.h>
-#include <stdlib.h>
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/stringutils.h"
-
-namespace rtc {
-
-/////////////////////////////////////////////////////////////////////////////
-// String Encoding Utilities
-/////////////////////////////////////////////////////////////////////////////
-
-size_t escape(char * buffer, size_t buflen,
-              const char * source, size_t srclen,
-              const char * illegal, char escape) {
-  RTC_DCHECK(buffer);  // TODO(grunell): estimate output size
-  if (buflen <= 0)
-    return 0;
-
-  size_t srcpos = 0, bufpos = 0;
-  while ((srcpos < srclen) && (bufpos + 1 < buflen)) {
-    char ch = source[srcpos++];
-    if ((ch == escape) || ::strchr(illegal, ch)) {
-      if (bufpos + 2 >= buflen)
-        break;
-      buffer[bufpos++] = escape;
-    }
-    buffer[bufpos++] = ch;
-  }
-
-  buffer[bufpos] = '\0';
-  return bufpos;
-}
-
-size_t unescape(char * buffer, size_t buflen,
-                const char * source, size_t srclen,
-                char escape) {
-  RTC_DCHECK(buffer);  // TODO(grunell): estimate output size
-  if (buflen <= 0)
-    return 0;
-
-  size_t srcpos = 0, bufpos = 0;
-  while ((srcpos < srclen) && (bufpos + 1 < buflen)) {
-    char ch = source[srcpos++];
-    if ((ch == escape) && (srcpos < srclen)) {
-      ch = source[srcpos++];
-    }
-    buffer[bufpos++] = ch;
-  }
-  buffer[bufpos] = '\0';
-  return bufpos;
-}
-
-size_t encode(char * buffer, size_t buflen,
-              const char * source, size_t srclen,
-              const char * illegal, char escape) {
-  RTC_DCHECK(buffer);  // TODO(grunell): estimate output size
-  if (buflen <= 0)
-    return 0;
-
-  size_t srcpos = 0, bufpos = 0;
-  while ((srcpos < srclen) && (bufpos + 1 < buflen)) {
-    char ch = source[srcpos++];
-    if ((ch != escape) && !::strchr(illegal, ch)) {
-      buffer[bufpos++] = ch;
-    } else if (bufpos + 3 >= buflen) {
-      break;
-    } else {
-      buffer[bufpos+0] = escape;
-      buffer[bufpos+1] = hex_encode((static_cast<unsigned char>(ch) >> 4) & 0xF);
-      buffer[bufpos+2] = hex_encode((static_cast<unsigned char>(ch)     ) & 0xF);
-      bufpos += 3;
-    }
-  }
-  buffer[bufpos] = '\0';
-  return bufpos;
-}
-
-size_t decode(char * buffer, size_t buflen,
-              const char * source, size_t srclen,
-              char escape) {
-  if (buflen <= 0)
-    return 0;
-
-  unsigned char h1, h2;
-  size_t srcpos = 0, bufpos = 0;
-  while ((srcpos < srclen) && (bufpos + 1 < buflen)) {
-    char ch = source[srcpos++];
-    if ((ch == escape)
-        && (srcpos + 1 < srclen)
-        && hex_decode(source[srcpos], &h1)
-        && hex_decode(source[srcpos+1], &h2)) {
-      buffer[bufpos++] = (h1 << 4) | h2;
-      srcpos += 2;
-    } else {
-      buffer[bufpos++] = ch;
-    }
-  }
-  buffer[bufpos] = '\0';
-  return bufpos;
-}
-
-const char* unsafe_filename_characters() {
-  // It might be better to have a single specification which is the union of
-  // all operating systems, unless one system is overly restrictive.
-#if defined(WEBRTC_WIN)
-  return "\\/:*?\"<>|";
-#else  // !WEBRTC_WIN
-  // TODO(grunell): Should this never be reached?
-  RTC_NOTREACHED();
-  return "";
-#endif  // !WEBRTC_WIN
-}
-
-const unsigned char URL_UNSAFE  = 0x1; // 0-33 "#$%&+,/:;<=>?@[\]^`{|} 127
-const unsigned char XML_UNSAFE  = 0x2; // "&'<>
-const unsigned char HTML_UNSAFE = 0x2; // "&'<>
-
-//  ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 6 5 7 8 9 : ; < = > ?
-//@ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _
-//` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~
-
-const unsigned char ASCII_CLASS[128] = {
-  1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
-  1,0,3,1,1,1,3,2,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,1,1,3,1,3,1,
-  1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,
-  1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,1,
-};
-
-size_t url_encode(char * buffer, size_t buflen,
-                  const char * source, size_t srclen) {
-  if (nullptr == buffer)
-    return srclen * 3 + 1;
-  if (buflen <= 0)
-    return 0;
-
-  size_t srcpos = 0, bufpos = 0;
-  while ((srcpos < srclen) && (bufpos + 1 < buflen)) {
-    unsigned char ch = source[srcpos++];
-    if ((ch < 128) && (ASCII_CLASS[ch] & URL_UNSAFE)) {
-      if (bufpos + 3 >= buflen) {
-        break;
-      }
-      buffer[bufpos+0] = '%';
-      buffer[bufpos+1] = hex_encode((ch >> 4) & 0xF);
-      buffer[bufpos+2] = hex_encode((ch     ) & 0xF);
-      bufpos += 3;
-    } else {
-      buffer[bufpos++] = ch;
-    }
-  }
-  buffer[bufpos] = '\0';
-  return bufpos;
-}
-
-size_t url_decode(char * buffer, size_t buflen,
-                  const char * source, size_t srclen) {
-  if (nullptr == buffer)
-    return srclen + 1;
-  if (buflen <= 0)
-    return 0;
-
-  unsigned char h1, h2;
-  size_t srcpos = 0, bufpos = 0;
-  while ((srcpos < srclen) && (bufpos + 1 < buflen)) {
-    unsigned char ch = source[srcpos++];
-    if (ch == '+') {
-      buffer[bufpos++] = ' ';
-    } else if ((ch == '%')
-               && (srcpos + 1 < srclen)
-               && hex_decode(source[srcpos], &h1)
-               && hex_decode(source[srcpos+1], &h2))
-    {
-      buffer[bufpos++] = (h1 << 4) | h2;
-      srcpos += 2;
-    } else {
-      buffer[bufpos++] = ch;
-    }
-  }
-  buffer[bufpos] = '\0';
-  return bufpos;
-}
-
-size_t utf8_decode(const char* source, size_t srclen, unsigned long* value) {
-  const unsigned char* s = reinterpret_cast<const unsigned char*>(source);
-  if ((s[0] & 0x80) == 0x00) {                    // Check s[0] == 0xxxxxxx
-    *value = s[0];
-    return 1;
-  }
-  if ((srclen < 2) || ((s[1] & 0xC0) != 0x80)) {  // Check s[1] != 10xxxxxx
-    return 0;
-  }
-  // Accumulate the trailer byte values in value16, and combine it with the
-  // relevant bits from s[0], once we've determined the sequence length.
-  unsigned long value16 = (s[1] & 0x3F);
-  if ((s[0] & 0xE0) == 0xC0) {                    // Check s[0] == 110xxxxx
-    *value = ((s[0] & 0x1F) << 6) | value16;
-    return 2;
-  }
-  if ((srclen < 3) || ((s[2] & 0xC0) != 0x80)) {  // Check s[2] != 10xxxxxx
-    return 0;
-  }
-  value16 = (value16 << 6) | (s[2] & 0x3F);
-  if ((s[0] & 0xF0) == 0xE0) {                    // Check s[0] == 1110xxxx
-    *value = ((s[0] & 0x0F) << 12) | value16;
-    return 3;
-  }
-  if ((srclen < 4) || ((s[3] & 0xC0) != 0x80)) {  // Check s[3] != 10xxxxxx
-    return 0;
-  }
-  value16 = (value16 << 6) | (s[3] & 0x3F);
-  if ((s[0] & 0xF8) == 0xF0) {                    // Check s[0] == 11110xxx
-    *value = ((s[0] & 0x07) << 18) | value16;
-    return 4;
-  }
-  return 0;
-}
-
-size_t utf8_encode(char* buffer, size_t buflen, unsigned long value) {
-  if ((value <= 0x7F) && (buflen >= 1)) {
-    buffer[0] = static_cast<unsigned char>(value);
-    return 1;
-  }
-  if ((value <= 0x7FF) && (buflen >= 2)) {
-    buffer[0] = 0xC0 | static_cast<unsigned char>(value >> 6);
-    buffer[1] = 0x80 | static_cast<unsigned char>(value & 0x3F);
-    return 2;
-  }
-  if ((value <= 0xFFFF) && (buflen >= 3)) {
-    buffer[0] = 0xE0 | static_cast<unsigned char>(value >> 12);
-    buffer[1] = 0x80 | static_cast<unsigned char>((value >> 6) & 0x3F);
-    buffer[2] = 0x80 | static_cast<unsigned char>(value & 0x3F);
-    return 3;
-  }
-  if ((value <= 0x1FFFFF) && (buflen >= 4)) {
-    buffer[0] = 0xF0 | static_cast<unsigned char>(value >> 18);
-    buffer[1] = 0x80 | static_cast<unsigned char>((value >> 12) & 0x3F);
-    buffer[2] = 0x80 | static_cast<unsigned char>((value >> 6) & 0x3F);
-    buffer[3] = 0x80 | static_cast<unsigned char>(value & 0x3F);
-    return 4;
-  }
-  return 0;
-}
-
-size_t html_encode(char * buffer, size_t buflen,
-                   const char * source, size_t srclen) {
-  RTC_DCHECK(buffer);  // TODO(grunell): estimate output size
-  if (buflen <= 0)
-    return 0;
-
-  size_t srcpos = 0, bufpos = 0;
-  while ((srcpos < srclen) && (bufpos + 1 < buflen)) {
-    unsigned char ch = source[srcpos];
-    if (ch < 128) {
-      srcpos += 1;
-      if (ASCII_CLASS[ch] & HTML_UNSAFE) {
-        const char * escseq = 0;
-        size_t esclen = 0;
-        switch (ch) {
-          case '<':  escseq = "&lt;";   esclen = 4; break;
-          case '>':  escseq = "&gt;";   esclen = 4; break;
-          case '\'': escseq = "&#39;";  esclen = 5; break;
-          case '\"': escseq = "&quot;"; esclen = 6; break;
-          case '&':  escseq = "&amp;";  esclen = 5; break;
-          default: RTC_NOTREACHED();
-        }
-        if (bufpos + esclen >= buflen) {
-          break;
-        }
-        memcpy(buffer + bufpos, escseq, esclen);
-        bufpos += esclen;
-      } else {
-        buffer[bufpos++] = ch;
-      }
-    } else {
-      // Largest value is 0x1FFFFF => &#2097151;  (10 characters)
-      const size_t kEscseqSize = 11;
-      char escseq[kEscseqSize];
-      unsigned long val;
-      if (size_t vallen = utf8_decode(&source[srcpos], srclen - srcpos, &val)) {
-        srcpos += vallen;
-      } else {
-        // Not a valid utf8 sequence, just use the raw character.
-        val = static_cast<unsigned char>(source[srcpos++]);
-      }
-      size_t esclen = sprintfn(escseq, kEscseqSize, "&#%lu;", val);
-      if (bufpos + esclen >= buflen) {
-        break;
-      }
-      memcpy(buffer + bufpos, escseq, esclen);
-      bufpos += esclen;
-    }
-  }
-  buffer[bufpos] = '\0';
-  return bufpos;
-}
-
-size_t html_decode(char * buffer, size_t buflen,
-                   const char * source, size_t srclen) {
-  RTC_DCHECK(buffer);  // TODO(grunell): estimate output size
-  return xml_decode(buffer, buflen, source, srclen);
-}
-
-size_t xml_encode(char * buffer, size_t buflen,
-                  const char * source, size_t srclen) {
-  RTC_DCHECK(buffer);  // TODO(grunell): estimate output size
-  if (buflen <= 0)
-    return 0;
-
-  size_t srcpos = 0, bufpos = 0;
-  while ((srcpos < srclen) && (bufpos + 1 < buflen)) {
-    unsigned char ch = source[srcpos++];
-    if ((ch < 128) && (ASCII_CLASS[ch] & XML_UNSAFE)) {
-      const char * escseq = 0;
-      size_t esclen = 0;
-      switch (ch) {
-        case '<':  escseq = "&lt;";   esclen = 4; break;
-        case '>':  escseq = "&gt;";   esclen = 4; break;
-        case '\'': escseq = "&apos;"; esclen = 6; break;
-        case '\"': escseq = "&quot;"; esclen = 6; break;
-        case '&':  escseq = "&amp;";  esclen = 5; break;
-        default: RTC_NOTREACHED();
-      }
-      if (bufpos + esclen >= buflen) {
-        break;
-      }
-      memcpy(buffer + bufpos, escseq, esclen);
-      bufpos += esclen;
-    } else {
-      buffer[bufpos++] = ch;
-    }
-  }
-  buffer[bufpos] = '\0';
-  return bufpos;
-}
-
-size_t xml_decode(char * buffer, size_t buflen,
-                  const char * source, size_t srclen) {
-  RTC_DCHECK(buffer);  // TODO(grunell): estimate output size
-  if (buflen <= 0)
-    return 0;
-
-  size_t srcpos = 0, bufpos = 0;
-  while ((srcpos < srclen) && (bufpos + 1 < buflen)) {
-    unsigned char ch = source[srcpos++];
-    if (ch != '&') {
-      buffer[bufpos++] = ch;
-    } else if ((srcpos + 2 < srclen)
-               && (memcmp(source + srcpos, "lt;", 3) == 0)) {
-      buffer[bufpos++] = '<';
-      srcpos += 3;
-    } else if ((srcpos + 2 < srclen)
-               && (memcmp(source + srcpos, "gt;", 3) == 0)) {
-      buffer[bufpos++] = '>';
-      srcpos += 3;
-    } else if ((srcpos + 4 < srclen)
-               && (memcmp(source + srcpos, "apos;", 5) == 0)) {
-      buffer[bufpos++] = '\'';
-      srcpos += 5;
-    } else if ((srcpos + 4 < srclen)
-               && (memcmp(source + srcpos, "quot;", 5) == 0)) {
-      buffer[bufpos++] = '\"';
-      srcpos += 5;
-    } else if ((srcpos + 3 < srclen)
-               && (memcmp(source + srcpos, "amp;", 4) == 0)) {
-      buffer[bufpos++] = '&';
-      srcpos += 4;
-    } else if ((srcpos < srclen) && (source[srcpos] == '#')) {
-      int int_base = 10;
-      if ((srcpos + 1 < srclen) && (source[srcpos+1] == 'x')) {
-        int_base = 16;
-        srcpos += 1;
-      }
-      char * ptr;
-      // TODO(grunell): Fix hack (ptr may go past end of data)
-      unsigned long val = strtoul(source + srcpos + 1, &ptr, int_base);
-      if ((static_cast<size_t>(ptr - source) < srclen) && (*ptr == ';')) {
-        srcpos = ptr - source + 1;
-      } else {
-        // Not a valid escape sequence.
-        break;
-      }
-      if (size_t esclen = utf8_encode(buffer + bufpos, buflen - bufpos, val)) {
-        bufpos += esclen;
-      } else {
-        // Not enough room to encode the character, or illegal character
-        break;
-      }
-    } else {
-      // Unrecognized escape sequence.
-      break;
-    }
-  }
-  buffer[bufpos] = '\0';
-  return bufpos;
-}
-
-static const char HEX[] = "0123456789abcdef";
-
-char hex_encode(unsigned char val) {
-  RTC_DCHECK_LT(val, 16);
-  return (val < 16) ? HEX[val] : '!';
-}
-
-bool hex_decode(char ch, unsigned char* val) {
-  if ((ch >= '0') && (ch <= '9')) {
-    *val = ch - '0';
-  } else if ((ch >= 'A') && (ch <= 'Z')) {
-    *val = (ch - 'A') + 10;
-  } else if ((ch >= 'a') && (ch <= 'z')) {
-    *val = (ch - 'a') + 10;
-  } else {
-    return false;
-  }
-  return true;
-}
-
-size_t hex_encode(char* buffer, size_t buflen,
-                  const char* csource, size_t srclen) {
-  return hex_encode_with_delimiter(buffer, buflen, csource, srclen, 0);
-}
-
-size_t hex_encode_with_delimiter(char* buffer, size_t buflen,
-                                 const char* csource, size_t srclen,
-                                 char delimiter) {
-  RTC_DCHECK(buffer);  // TODO(grunell): estimate output size
-  if (buflen == 0)
-    return 0;
-
-  // Init and check bounds.
-  const unsigned char* bsource =
-      reinterpret_cast<const unsigned char*>(csource);
-  size_t srcpos = 0, bufpos = 0;
-  size_t needed = delimiter ? (srclen * 3) : (srclen * 2 + 1);
-  if (buflen < needed)
-    return 0;
-
-  while (srcpos < srclen) {
-    unsigned char ch = bsource[srcpos++];
-    buffer[bufpos  ] = hex_encode((ch >> 4) & 0xF);
-    buffer[bufpos+1] = hex_encode((ch     ) & 0xF);
-    bufpos += 2;
-
-    // Don't write a delimiter after the last byte.
-    if (delimiter && (srcpos < srclen)) {
-      buffer[bufpos] = delimiter;
-      ++bufpos;
-    }
-  }
-
-  // Null terminate.
-  buffer[bufpos] = '\0';
-  return bufpos;
-}
-
-std::string hex_encode(const std::string& str) {
-  return hex_encode(str.c_str(), str.size());
-}
-
-std::string hex_encode(const char* source, size_t srclen) {
-  return hex_encode_with_delimiter(source, srclen, 0);
-}
-
-std::string hex_encode_with_delimiter(const char* source, size_t srclen,
-                                      char delimiter) {
-  const size_t kBufferSize = srclen * 3;
-  char* buffer = STACK_ARRAY(char, kBufferSize);
-  size_t length = hex_encode_with_delimiter(buffer, kBufferSize,
-                                            source, srclen, delimiter);
-  RTC_DCHECK(srclen == 0 || length > 0);
-  return std::string(buffer, length);
-}
-
-size_t hex_decode(char * cbuffer, size_t buflen,
-                  const char * source, size_t srclen) {
-  return hex_decode_with_delimiter(cbuffer, buflen, source, srclen, 0);
-}
-
-size_t hex_decode_with_delimiter(char* cbuffer, size_t buflen,
-                                 const char* source, size_t srclen,
-                                 char delimiter) {
-  RTC_DCHECK(cbuffer);  // TODO(grunell): estimate output size
-  if (buflen == 0)
-    return 0;
-
-  // Init and bounds check.
-  unsigned char* bbuffer = reinterpret_cast<unsigned char*>(cbuffer);
-  size_t srcpos = 0, bufpos = 0;
-  size_t needed = (delimiter) ? (srclen + 1) / 3 : srclen / 2;
-  if (buflen < needed)
-    return 0;
-
-  while (srcpos < srclen) {
-    if ((srclen - srcpos) < 2) {
-      // This means we have an odd number of bytes.
-      return 0;
-    }
-
-    unsigned char h1, h2;
-    if (!hex_decode(source[srcpos], &h1) ||
-        !hex_decode(source[srcpos + 1], &h2))
-      return 0;
-
-    bbuffer[bufpos++] = (h1 << 4) | h2;
-    srcpos += 2;
-
-    // Remove the delimiter if needed.
-    if (delimiter && (srclen - srcpos) > 1) {
-      if (source[srcpos] != delimiter)
-        return 0;
-      ++srcpos;
-    }
-  }
-
-  return bufpos;
-}
-
-size_t hex_decode(char* buffer, size_t buflen, const std::string& source) {
-  return hex_decode_with_delimiter(buffer, buflen, source, 0);
-}
-size_t hex_decode_with_delimiter(char* buffer, size_t buflen,
-                                 const std::string& source, char delimiter) {
-  return hex_decode_with_delimiter(buffer, buflen,
-                                   source.c_str(), source.length(), delimiter);
-}
-
-size_t transform(std::string& value, size_t maxlen, const std::string& source,
-                 Transform t) {
-  char* buffer = STACK_ARRAY(char, maxlen + 1);
-  size_t length = t(buffer, maxlen + 1, source.data(), source.length());
-  value.assign(buffer, length);
-  return length;
-}
-
-std::string s_transform(const std::string& source, Transform t) {
-  // Ask transformation function to approximate the destination size (returns upper bound)
-  size_t maxlen = t(nullptr, 0, source.data(), source.length());
-  char * buffer = STACK_ARRAY(char, maxlen);
-  size_t len = t(buffer, maxlen, source.data(), source.length());
-  std::string result(buffer, len);
-  return result;
-}
-
-size_t tokenize(const std::string& source, char delimiter,
-                std::vector<std::string>* fields) {
-  fields->clear();
-  size_t last = 0;
-  for (size_t i = 0; i < source.length(); ++i) {
-    if (source[i] == delimiter) {
-      if (i != last) {
-        fields->push_back(source.substr(last, i - last));
-      }
-      last = i + 1;
-    }
-  }
-  if (last != source.length()) {
-    fields->push_back(source.substr(last, source.length() - last));
-  }
-  return fields->size();
-}
-
-size_t tokenize_with_empty_tokens(const std::string& source,
-                                  char delimiter,
-                                  std::vector<std::string>* fields) {
-  fields->clear();
-  size_t last = 0;
-  for (size_t i = 0; i < source.length(); ++i) {
-    if (source[i] == delimiter) {
-      fields->push_back(source.substr(last, i - last));
-      last = i + 1;
-    }
-  }
-  fields->push_back(source.substr(last, source.length() - last));
-  return fields->size();
-}
-
-size_t tokenize_append(const std::string& source, char delimiter,
-                       std::vector<std::string>* fields) {
-  if (!fields) return 0;
-
-  std::vector<std::string> new_fields;
-  tokenize(source, delimiter, &new_fields);
-  fields->insert(fields->end(), new_fields.begin(), new_fields.end());
-  return fields->size();
-}
-
-size_t tokenize(const std::string& source, char delimiter, char start_mark,
-                char end_mark, std::vector<std::string>* fields) {
-  if (!fields) return 0;
-  fields->clear();
-
-  std::string remain_source = source;
-  while (!remain_source.empty()) {
-    size_t start_pos = remain_source.find(start_mark);
-    if (std::string::npos == start_pos) break;
-    std::string pre_mark;
-    if (start_pos > 0) {
-      pre_mark = remain_source.substr(0, start_pos - 1);
-    }
-
-    ++start_pos;
-    size_t end_pos = remain_source.find(end_mark, start_pos);
-    if (std::string::npos == end_pos) break;
-
-    // We have found the matching marks. First tokenize the pre-mask. Then add
-    // the marked part as a single field. Finally, loop back for the post-mark.
-    tokenize_append(pre_mark, delimiter, fields);
-    fields->push_back(remain_source.substr(start_pos, end_pos - start_pos));
-    remain_source = remain_source.substr(end_pos + 1);
-  }
-
-  return tokenize_append(remain_source, delimiter, fields);
-}
-
-bool tokenize_first(const std::string& source,
-                    const char delimiter,
-                    std::string* token,
-                    std::string* rest) {
-  // Find the first delimiter
-  size_t left_pos = source.find(delimiter);
-  if (left_pos == std::string::npos) {
-    return false;
-  }
-
-  // Look for additional occurrances of delimiter.
-  size_t right_pos = left_pos + 1;
-  while (source[right_pos] == delimiter) {
-    right_pos++;
-  }
-
-  *token = source.substr(0, left_pos);
-  *rest = source.substr(right_pos);
-  return true;
-}
-
-std::string join(const std::vector<std::string>& source, char delimiter) {
-  if (source.size() == 0) {
-    return std::string();
-  }
-  // Find length of the string to be returned to pre-allocate memory.
-  size_t source_string_length = 0;
-  for (size_t i = 0; i < source.size(); ++i) {
-    source_string_length += source[i].length();
-  }
-
-  // Build the joined string.
-  std::string joined_string;
-  joined_string.reserve(source_string_length + source.size() - 1);
-  for (size_t i = 0; i < source.size(); ++i) {
-    if (i != 0) {
-      joined_string += delimiter;
-    }
-    joined_string += source[i];
-  }
-  return joined_string;
-}
-
-size_t split(const std::string& source, char delimiter,
-             std::vector<std::string>* fields) {
-  RTC_DCHECK(fields);
-  fields->clear();
-  size_t last = 0;
-  for (size_t i = 0; i < source.length(); ++i) {
-    if (source[i] == delimiter) {
-      fields->push_back(source.substr(last, i - last));
-      last = i + 1;
-    }
-  }
-  fields->push_back(source.substr(last, source.length() - last));
-  return fields->size();
-}
-
-char make_char_safe_for_filename(char c) {
-  if (c < 32)
-    return '_';
-
-  switch (c) {
-    case '<':
-    case '>':
-    case ':':
-    case '"':
-    case '/':
-    case '\\':
-    case '|':
-    case '*':
-    case '?':
-      return '_';
-
-    default:
-      return c;
-  }
-}
-
-/*
-void sprintf(std::string& value, size_t maxlen, const char * format, ...) {
-  char * buffer = STACK_ARRAY(char, maxlen + 1);
-  va_list args;
-  va_start(args, format);
-  value.assign(buffer, vsprintfn(buffer, maxlen + 1, format, args));
-  va_end(args);
-}
-*/
-
-/////////////////////////////////////////////////////////////////////////////
-
-}  // namespace rtc
diff --git a/rtc_base/stringencode.h b/rtc_base/stringencode.h
deleted file mode 100644
index a4452c2..0000000
--- a/rtc_base/stringencode.h
+++ /dev/null
@@ -1,228 +0,0 @@
-/*
- *  Copyright 2004 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_RTC_BASE_STRINGENCODE_H_
-#define WEBRTC_RTC_BASE_STRINGENCODE_H_
-
-#include <sstream>
-#include <string>
-#include <vector>
-
-#include "webrtc/rtc_base/checks.h"
-
-namespace rtc {
-
-//////////////////////////////////////////////////////////////////////
-// String Encoding Utilities
-//////////////////////////////////////////////////////////////////////
-
-// Convert an unsigned value to it's utf8 representation.  Returns the length
-// of the encoded string, or 0 if the encoding is longer than buflen - 1.
-size_t utf8_encode(char* buffer, size_t buflen, unsigned long value);
-// Decode the utf8 encoded value pointed to by source.  Returns the number of
-// bytes used by the encoding, or 0 if the encoding is invalid.
-size_t utf8_decode(const char* source, size_t srclen, unsigned long* value);
-
-// Escaping prefixes illegal characters with the escape character.  Compact, but
-// illegal characters still appear in the string.
-size_t escape(char * buffer, size_t buflen,
-              const char * source, size_t srclen,
-              const char * illegal, char escape);
-// Note: in-place unescaping (buffer == source) is allowed.
-size_t unescape(char * buffer, size_t buflen,
-                const char * source, size_t srclen,
-                char escape);
-
-// Encoding replaces illegal characters with the escape character and 2 hex
-// chars, so it's a little less compact than escape, but completely removes
-// illegal characters.  note that hex digits should not be used as illegal
-// characters.
-size_t encode(char * buffer, size_t buflen,
-              const char * source, size_t srclen,
-              const char * illegal, char escape);
-// Note: in-place decoding (buffer == source) is allowed.
-size_t decode(char * buffer, size_t buflen,
-              const char * source, size_t srclen,
-              char escape);
-
-// Returns a list of characters that may be unsafe for use in the name of a
-// file, suitable for passing to the 'illegal' member of escape or encode.
-const char* unsafe_filename_characters();
-
-// url_encode is an encode operation with a predefined set of illegal characters
-// and escape character (for use in URLs, obviously).
-size_t url_encode(char * buffer, size_t buflen,
-                  const char * source, size_t srclen);
-// Note: in-place decoding (buffer == source) is allowed.
-size_t url_decode(char * buffer, size_t buflen,
-                  const char * source, size_t srclen);
-
-// html_encode prevents data embedded in html from containing markup.
-size_t html_encode(char * buffer, size_t buflen,
-                   const char * source, size_t srclen);
-// Note: in-place decoding (buffer == source) is allowed.
-size_t html_decode(char * buffer, size_t buflen,
-                   const char * source, size_t srclen);
-
-// xml_encode makes data suitable for inside xml attributes and values.
-size_t xml_encode(char * buffer, size_t buflen,
-                  const char * source, size_t srclen);
-// Note: in-place decoding (buffer == source) is allowed.
-size_t xml_decode(char * buffer, size_t buflen,
-                  const char * source, size_t srclen);
-
-// Convert an unsigned value from 0 to 15 to the hex character equivalent...
-char hex_encode(unsigned char val);
-// ...and vice-versa.
-bool hex_decode(char ch, unsigned char* val);
-
-// hex_encode shows the hex representation of binary data in ascii.
-size_t hex_encode(char* buffer, size_t buflen,
-                  const char* source, size_t srclen);
-
-// hex_encode, but separate each byte representation with a delimiter.
-// |delimiter| == 0 means no delimiter
-// If the buffer is too short, we return 0
-size_t hex_encode_with_delimiter(char* buffer, size_t buflen,
-                                 const char* source, size_t srclen,
-                                 char delimiter);
-
-// Helper functions for hex_encode.
-std::string hex_encode(const std::string& str);
-std::string hex_encode(const char* source, size_t srclen);
-std::string hex_encode_with_delimiter(const char* source, size_t srclen,
-                                      char delimiter);
-
-// hex_decode converts ascii hex to binary.
-size_t hex_decode(char* buffer, size_t buflen,
-                  const char* source, size_t srclen);
-
-// hex_decode, assuming that there is a delimiter between every byte
-// pair.
-// |delimiter| == 0 means no delimiter
-// If the buffer is too short or the data is invalid, we return 0.
-size_t hex_decode_with_delimiter(char* buffer, size_t buflen,
-                                 const char* source, size_t srclen,
-                                 char delimiter);
-
-// Helper functions for hex_decode.
-size_t hex_decode(char* buffer, size_t buflen, const std::string& source);
-size_t hex_decode_with_delimiter(char* buffer, size_t buflen,
-                                 const std::string& source, char delimiter);
-
-// Apply any suitable string transform (including the ones above) to an STL
-// string.  Stack-allocated temporary space is used for the transformation,
-// so value and source may refer to the same string.
-typedef size_t (*Transform)(char * buffer, size_t buflen,
-                            const char * source, size_t srclen);
-size_t transform(std::string& value, size_t maxlen, const std::string& source,
-                 Transform t);
-
-// Return the result of applying transform t to source.
-std::string s_transform(const std::string& source, Transform t);
-
-// Convenience wrappers.
-inline std::string s_url_encode(const std::string& source) {
-  return s_transform(source, url_encode);
-}
-inline std::string s_url_decode(const std::string& source) {
-  return s_transform(source, url_decode);
-}
-
-// Joins the source vector of strings into a single string, with each
-// field in source being separated by delimiter. No trailing delimiter is added.
-std::string join(const std::vector<std::string>& source, char delimiter);
-
-// Splits the source string into multiple fields separated by delimiter,
-// with duplicates of delimiter creating empty fields.
-size_t split(const std::string& source, char delimiter,
-             std::vector<std::string>* fields);
-
-// Splits the source string into multiple fields separated by delimiter,
-// with duplicates of delimiter ignored.  Trailing delimiter ignored.
-size_t tokenize(const std::string& source, char delimiter,
-                std::vector<std::string>* fields);
-
-// Tokenize, including the empty tokens.
-size_t tokenize_with_empty_tokens(const std::string& source,
-                                  char delimiter,
-                                  std::vector<std::string>* fields);
-
-// Tokenize and append the tokens to fields. Return the new size of fields.
-size_t tokenize_append(const std::string& source, char delimiter,
-                       std::vector<std::string>* fields);
-
-// Splits the source string into multiple fields separated by delimiter, with
-// duplicates of delimiter ignored. Trailing delimiter ignored. A substring in
-// between the start_mark and the end_mark is treated as a single field. Return
-// the size of fields. For example, if source is "filename
-// \"/Library/Application Support/media content.txt\"", delimiter is ' ', and
-// the start_mark and end_mark are '"', this method returns two fields:
-// "filename" and "/Library/Application Support/media content.txt".
-size_t tokenize(const std::string& source, char delimiter, char start_mark,
-                char end_mark, std::vector<std::string>* fields);
-
-// Extract the first token from source as separated by delimiter, with
-// duplicates of delimiter ignored. Return false if the delimiter could not be
-// found, otherwise return true.
-bool tokenize_first(const std::string& source,
-                    const char delimiter,
-                    std::string* token,
-                    std::string* rest);
-
-// Safe sprintf to std::string
-//void sprintf(std::string& value, size_t maxlen, const char * format, ...)
-//     PRINTF_FORMAT(3);
-
-// Convert arbitrary values to/from a string.
-
-template <class T>
-static bool ToString(const T &t, std::string* s) {
-  RTC_DCHECK(s);
-  std::ostringstream oss;
-  oss << std::boolalpha << t;
-  *s = oss.str();
-  return !oss.fail();
-}
-
-template <class T>
-static bool FromString(const std::string& s, T* t) {
-  RTC_DCHECK(t);
-  std::istringstream iss(s);
-  iss >> std::boolalpha >> *t;
-  return !iss.fail();
-}
-
-// Inline versions of the string conversion routines.
-
-template<typename T>
-static inline std::string ToString(const T& val) {
-  std::string str; ToString(val, &str); return str;
-}
-
-template<typename T>
-static inline T FromString(const std::string& str) {
-  T val; FromString(str, &val); return val;
-}
-
-template<typename T>
-static inline T FromString(const T& defaultValue, const std::string& str) {
-  T val(defaultValue); FromString(str, &val); return val;
-}
-
-// simple function to strip out characters which shouldn't be
-// used in filenames
-char make_char_safe_for_filename(char c);
-
-//////////////////////////////////////////////////////////////////////
-
-}  // namespace rtc
-
-#endif  // WEBRTC_RTC_BASE_STRINGENCODE_H__
diff --git a/rtc_base/stringencode_unittest.cc b/rtc_base/stringencode_unittest.cc
deleted file mode 100644
index 36071ed..0000000
--- a/rtc_base/stringencode_unittest.cc
+++ /dev/null
@@ -1,448 +0,0 @@
-/*
- *  Copyright 2004 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/rtc_base/stringencode.h"
-#include "webrtc/rtc_base/arraysize.h"
-#include "webrtc/rtc_base/gunit.h"
-#include "webrtc/rtc_base/stringutils.h"
-
-namespace rtc {
-
-TEST(Utf8EncodeTest, EncodeDecode) {
-  const struct Utf8Test {
-    const char* encoded;
-    size_t encsize, enclen;
-    unsigned long decoded;
-  } kTests[] = {
-      {"a    ",             5, 1, 'a'},
-      {"\x7F    ",          5, 1, 0x7F},
-      {"\xC2\x80   ",       5, 2, 0x80},
-      {"\xDF\xBF   ",       5, 2, 0x7FF},
-      {"\xE0\xA0\x80  ",    5, 3, 0x800},
-      {"\xEF\xBF\xBF  ",    5, 3, 0xFFFF},
-      {"\xF0\x90\x80\x80 ", 5, 4, 0x10000},
-      {"\xF0\x90\x80\x80 ", 3, 0, 0x10000},
-      {"\xF0\xF0\x80\x80 ", 5, 0, 0},
-      {"\xF0\x90\x80  ",    5, 0, 0},
-      {"\x90\x80\x80  ",    5, 0, 0},
-      {nullptr, 0, 0},
-  };
-  for (size_t i = 0; kTests[i].encoded; ++i) {
-    unsigned long val = 0;
-    ASSERT_EQ(kTests[i].enclen, utf8_decode(kTests[i].encoded,
-                                            kTests[i].encsize,
-                                            &val));
-    unsigned long result = (kTests[i].enclen == 0) ? 0 : kTests[i].decoded;
-    ASSERT_EQ(result, val);
-
-    if (kTests[i].decoded == 0) {
-      // Not an interesting encoding test case
-      continue;
-    }
-
-    char buffer[5];
-    memset(buffer, 0x01, arraysize(buffer));
-    ASSERT_EQ(kTests[i].enclen, utf8_encode(buffer,
-                                            kTests[i].encsize,
-                                            kTests[i].decoded));
-    ASSERT_TRUE(memcmp(buffer, kTests[i].encoded, kTests[i].enclen) == 0);
-    // Make sure remainder of buffer is unchanged
-    ASSERT_TRUE(memory_check(buffer + kTests[i].enclen,
-                             0x1,
-                             arraysize(buffer) - kTests[i].enclen));
-  }
-}
-
-class HexEncodeTest : public testing::Test {
- public:
-  HexEncodeTest() : enc_res_(0), dec_res_(0) {
-    for (size_t i = 0; i < sizeof(data_); ++i) {
-      data_[i] = (i + 128) & 0xff;
-    }
-    memset(decoded_, 0x7f, sizeof(decoded_));
-  }
-
-  char data_[10];
-  char encoded_[31];
-  char decoded_[11];
-  size_t enc_res_;
-  size_t dec_res_;
-};
-
-// Test that we can convert to/from hex with no delimiter.
-TEST_F(HexEncodeTest, TestWithNoDelimiter) {
-  enc_res_ = hex_encode(encoded_, sizeof(encoded_), data_, sizeof(data_));
-  ASSERT_EQ(sizeof(data_) * 2, enc_res_);
-  ASSERT_STREQ("80818283848586878889", encoded_);
-  dec_res_ = hex_decode(decoded_, sizeof(decoded_), encoded_, enc_res_);
-  ASSERT_EQ(sizeof(data_), dec_res_);
-  ASSERT_EQ(0, memcmp(data_, decoded_, dec_res_));
-}
-
-// Test that we can convert to/from hex with a colon delimiter.
-TEST_F(HexEncodeTest, TestWithDelimiter) {
-  enc_res_ = hex_encode_with_delimiter(encoded_, sizeof(encoded_),
-                                       data_, sizeof(data_), ':');
-  ASSERT_EQ(sizeof(data_) * 3 - 1, enc_res_);
-  ASSERT_STREQ("80:81:82:83:84:85:86:87:88:89", encoded_);
-  dec_res_ = hex_decode_with_delimiter(decoded_, sizeof(decoded_),
-                                       encoded_, enc_res_, ':');
-  ASSERT_EQ(sizeof(data_), dec_res_);
-  ASSERT_EQ(0, memcmp(data_, decoded_, dec_res_));
-}
-
-// Test that encoding with one delimiter and decoding with another fails.
-TEST_F(HexEncodeTest, TestWithWrongDelimiter) {
-  enc_res_ = hex_encode_with_delimiter(encoded_, sizeof(encoded_),
-                                       data_, sizeof(data_), ':');
-  ASSERT_EQ(sizeof(data_) * 3 - 1, enc_res_);
-  dec_res_ = hex_decode_with_delimiter(decoded_, sizeof(decoded_),
-                                       encoded_, enc_res_, '/');
-  ASSERT_EQ(0U, dec_res_);
-}
-
-// Test that encoding without a delimiter and decoding with one fails.
-TEST_F(HexEncodeTest, TestExpectedDelimiter) {
-  enc_res_ = hex_encode(encoded_, sizeof(encoded_), data_, sizeof(data_));
-  ASSERT_EQ(sizeof(data_) * 2, enc_res_);
-  dec_res_ = hex_decode_with_delimiter(decoded_, sizeof(decoded_),
-                                       encoded_, enc_res_, ':');
-  ASSERT_EQ(0U, dec_res_);
-}
-
-// Test that encoding with a delimiter and decoding without one fails.
-TEST_F(HexEncodeTest, TestExpectedNoDelimiter) {
-  enc_res_ = hex_encode_with_delimiter(encoded_, sizeof(encoded_),
-                                       data_, sizeof(data_), ':');
-  ASSERT_EQ(sizeof(data_) * 3 - 1, enc_res_);
-  dec_res_ = hex_decode(decoded_, sizeof(decoded_), encoded_, enc_res_);
-  ASSERT_EQ(0U, dec_res_);
-}
-
-// Test that we handle a zero-length buffer with no delimiter.
-TEST_F(HexEncodeTest, TestZeroLengthNoDelimiter) {
-  enc_res_ = hex_encode(encoded_, sizeof(encoded_), "", 0);
-  ASSERT_EQ(0U, enc_res_);
-  dec_res_ = hex_decode(decoded_, sizeof(decoded_), encoded_, enc_res_);
-  ASSERT_EQ(0U, dec_res_);
-}
-
-// Test that we handle a zero-length buffer with a delimiter.
-TEST_F(HexEncodeTest, TestZeroLengthWithDelimiter) {
-  enc_res_ = hex_encode_with_delimiter(encoded_, sizeof(encoded_), "", 0, ':');
-  ASSERT_EQ(0U, enc_res_);
-  dec_res_ = hex_decode_with_delimiter(decoded_, sizeof(decoded_),
-                                       encoded_, enc_res_, ':');
-  ASSERT_EQ(0U, dec_res_);
-}
-
-// Test the std::string variants that take no delimiter.
-TEST_F(HexEncodeTest, TestHelpersNoDelimiter) {
-  std::string result = hex_encode(data_, sizeof(data_));
-  ASSERT_EQ("80818283848586878889", result);
-  dec_res_ = hex_decode(decoded_, sizeof(decoded_), result);
-  ASSERT_EQ(sizeof(data_), dec_res_);
-  ASSERT_EQ(0, memcmp(data_, decoded_, dec_res_));
-}
-
-// Test the std::string variants that use a delimiter.
-TEST_F(HexEncodeTest, TestHelpersWithDelimiter) {
-  std::string result = hex_encode_with_delimiter(data_, sizeof(data_), ':');
-  ASSERT_EQ("80:81:82:83:84:85:86:87:88:89", result);
-  dec_res_ = hex_decode_with_delimiter(decoded_, sizeof(decoded_), result, ':');
-  ASSERT_EQ(sizeof(data_), dec_res_);
-  ASSERT_EQ(0, memcmp(data_, decoded_, dec_res_));
-}
-
-// Test that encoding into a too-small output buffer (without delimiter) fails.
-TEST_F(HexEncodeTest, TestEncodeTooShort) {
-  enc_res_ = hex_encode_with_delimiter(encoded_, sizeof(data_) * 2,
-                                       data_, sizeof(data_), 0);
-  ASSERT_EQ(0U, enc_res_);
-}
-
-// Test that encoding into a too-small output buffer (with delimiter) fails.
-TEST_F(HexEncodeTest, TestEncodeWithDelimiterTooShort) {
-  enc_res_ = hex_encode_with_delimiter(encoded_, sizeof(data_) * 3 - 1,
-                                       data_, sizeof(data_), ':');
-  ASSERT_EQ(0U, enc_res_);
-}
-
-// Test that decoding into a too-small output buffer fails.
-TEST_F(HexEncodeTest, TestDecodeTooShort) {
-  dec_res_ = hex_decode_with_delimiter(decoded_, 4, "0123456789", 10, 0);
-  ASSERT_EQ(0U, dec_res_);
-  ASSERT_EQ(0x7f, decoded_[4]);
-}
-
-// Test that decoding non-hex data fails.
-TEST_F(HexEncodeTest, TestDecodeBogusData) {
-  dec_res_ = hex_decode_with_delimiter(decoded_, sizeof(decoded_), "xyz", 3, 0);
-  ASSERT_EQ(0U, dec_res_);
-}
-
-// Test that decoding an odd number of hex characters fails.
-TEST_F(HexEncodeTest, TestDecodeOddHexDigits) {
-  dec_res_ = hex_decode_with_delimiter(decoded_, sizeof(decoded_), "012", 3, 0);
-  ASSERT_EQ(0U, dec_res_);
-}
-
-// Test that decoding a string with too many delimiters fails.
-TEST_F(HexEncodeTest, TestDecodeWithDelimiterTooManyDelimiters) {
-  dec_res_ = hex_decode_with_delimiter(decoded_, 4, "01::23::45::67", 14, ':');
-  ASSERT_EQ(0U, dec_res_);
-}
-
-// Test that decoding a string with a leading delimiter fails.
-TEST_F(HexEncodeTest, TestDecodeWithDelimiterLeadingDelimiter) {
-  dec_res_ = hex_decode_with_delimiter(decoded_, 4, ":01:23:45:67", 12, ':');
-  ASSERT_EQ(0U, dec_res_);
-}
-
-// Test that decoding a string with a trailing delimiter fails.
-TEST_F(HexEncodeTest, TestDecodeWithDelimiterTrailingDelimiter) {
-  dec_res_ = hex_decode_with_delimiter(decoded_, 4, "01:23:45:67:", 12, ':');
-  ASSERT_EQ(0U, dec_res_);
-}
-
-// Tests counting substrings.
-TEST(TokenizeTest, CountSubstrings) {
-  std::vector<std::string> fields;
-
-  EXPECT_EQ(5ul, tokenize("one two three four five", ' ', &fields));
-  fields.clear();
-  EXPECT_EQ(1ul, tokenize("one", ' ', &fields));
-
-  // Extra spaces should be ignored.
-  fields.clear();
-  EXPECT_EQ(5ul, tokenize("  one    two  three    four five  ", ' ', &fields));
-  fields.clear();
-  EXPECT_EQ(1ul, tokenize("  one  ", ' ', &fields));
-  fields.clear();
-  EXPECT_EQ(0ul, tokenize(" ", ' ', &fields));
-}
-
-// Tests comparing substrings.
-TEST(TokenizeTest, CompareSubstrings) {
-  std::vector<std::string> fields;
-
-  tokenize("find middle one", ' ', &fields);
-  ASSERT_EQ(3ul, fields.size());
-  ASSERT_STREQ("middle", fields.at(1).c_str());
-  fields.clear();
-
-  // Extra spaces should be ignored.
-  tokenize("  find   middle  one    ", ' ', &fields);
-  ASSERT_EQ(3ul, fields.size());
-  ASSERT_STREQ("middle", fields.at(1).c_str());
-  fields.clear();
-  tokenize(" ", ' ', &fields);
-  ASSERT_EQ(0ul, fields.size());
-}
-
-TEST(TokenizeTest, TokenizeAppend) {
-  ASSERT_EQ(0ul, tokenize_append("A B C", ' ', nullptr));
-
-  std::vector<std::string> fields;
-
-  tokenize_append("A B C", ' ', &fields);
-  ASSERT_EQ(3ul, fields.size());
-  ASSERT_STREQ("B", fields.at(1).c_str());
-
-  tokenize_append("D E", ' ', &fields);
-  ASSERT_EQ(5ul, fields.size());
-  ASSERT_STREQ("B", fields.at(1).c_str());
-  ASSERT_STREQ("E", fields.at(4).c_str());
-}
-
-TEST(TokenizeTest, TokenizeWithMarks) {
-  ASSERT_EQ(0ul, tokenize("D \"A B", ' ', '(', ')', nullptr));
-
-  std::vector<std::string> fields;
-  tokenize("A B C", ' ', '"', '"', &fields);
-  ASSERT_EQ(3ul, fields.size());
-  ASSERT_STREQ("C", fields.at(2).c_str());
-
-  tokenize("\"A B\" C", ' ', '"', '"', &fields);
-  ASSERT_EQ(2ul, fields.size());
-  ASSERT_STREQ("A B", fields.at(0).c_str());
-
-  tokenize("D \"A B\" C", ' ', '"', '"', &fields);
-  ASSERT_EQ(3ul, fields.size());
-  ASSERT_STREQ("D", fields.at(0).c_str());
-  ASSERT_STREQ("A B", fields.at(1).c_str());
-
-  tokenize("D \"A B\" C \"E F\"", ' ', '"', '"', &fields);
-  ASSERT_EQ(4ul, fields.size());
-  ASSERT_STREQ("D", fields.at(0).c_str());
-  ASSERT_STREQ("A B", fields.at(1).c_str());
-  ASSERT_STREQ("E F", fields.at(3).c_str());
-
-  // No matching marks.
-  tokenize("D \"A B", ' ', '"', '"', &fields);
-  ASSERT_EQ(3ul, fields.size());
-  ASSERT_STREQ("D", fields.at(0).c_str());
-  ASSERT_STREQ("\"A", fields.at(1).c_str());
-
-  tokenize("D (A B) C (E F) G", ' ', '(', ')', &fields);
-  ASSERT_EQ(5ul, fields.size());
-  ASSERT_STREQ("D", fields.at(0).c_str());
-  ASSERT_STREQ("A B", fields.at(1).c_str());
-  ASSERT_STREQ("E F", fields.at(3).c_str());
-}
-
-TEST(TokenizeTest, TokenizeWithEmptyTokens) {
-  std::vector<std::string> fields;
-  EXPECT_EQ(3ul, tokenize_with_empty_tokens("a.b.c", '.', &fields));
-  EXPECT_EQ("a", fields[0]);
-  EXPECT_EQ("b", fields[1]);
-  EXPECT_EQ("c", fields[2]);
-
-  EXPECT_EQ(3ul, tokenize_with_empty_tokens("..c", '.', &fields));
-  EXPECT_TRUE(fields[0].empty());
-  EXPECT_TRUE(fields[1].empty());
-  EXPECT_EQ("c", fields[2]);
-
-  EXPECT_EQ(1ul, tokenize_with_empty_tokens("", '.', &fields));
-  EXPECT_TRUE(fields[0].empty());
-}
-
-TEST(TokenizeFirstTest, NoLeadingSpaces) {
-  std::string token;
-  std::string rest;
-
-  ASSERT_TRUE(tokenize_first("A &*${}", ' ', &token, &rest));
-  ASSERT_STREQ("A", token.c_str());
-  ASSERT_STREQ("&*${}", rest.c_str());
-
-  ASSERT_TRUE(tokenize_first("A B& *${}", ' ', &token, &rest));
-  ASSERT_STREQ("A", token.c_str());
-  ASSERT_STREQ("B& *${}", rest.c_str());
-
-  ASSERT_TRUE(tokenize_first("A    B& *${}    ", ' ', &token, &rest));
-  ASSERT_STREQ("A", token.c_str());
-  ASSERT_STREQ("B& *${}    ", rest.c_str());
-}
-
-TEST(TokenizeFirstTest, LeadingSpaces) {
-  std::string token;
-  std::string rest;
-
-  ASSERT_TRUE(tokenize_first("     A B C", ' ', &token, &rest));
-  ASSERT_STREQ("", token.c_str());
-  ASSERT_STREQ("A B C", rest.c_str());
-
-  ASSERT_TRUE(tokenize_first("     A    B   C    ", ' ', &token, &rest));
-  ASSERT_STREQ("", token.c_str());
-  ASSERT_STREQ("A    B   C    ", rest.c_str());
-}
-
-TEST(TokenizeFirstTest, SingleToken) {
-  std::string token;
-  std::string rest;
-
-  // In the case where we cannot find delimiter the whole string is a token.
-  ASSERT_FALSE(tokenize_first("ABC", ' ', &token, &rest));
-
-  ASSERT_TRUE(tokenize_first("ABC    ", ' ', &token, &rest));
-  ASSERT_STREQ("ABC", token.c_str());
-  ASSERT_STREQ("", rest.c_str());
-
-  ASSERT_TRUE(tokenize_first("    ABC    ", ' ', &token, &rest));
-  ASSERT_STREQ("", token.c_str());
-  ASSERT_STREQ("ABC    ", rest.c_str());
-}
-
-// Tests counting substrings.
-TEST(SplitTest, CountSubstrings) {
-  std::vector<std::string> fields;
-
-  EXPECT_EQ(5ul, split("one,two,three,four,five", ',', &fields));
-  fields.clear();
-  EXPECT_EQ(1ul, split("one", ',', &fields));
-
-  // Empty fields between commas count.
-  fields.clear();
-  EXPECT_EQ(5ul, split("one,,three,four,five", ',', &fields));
-  fields.clear();
-  EXPECT_EQ(3ul, split(",three,", ',', &fields));
-  fields.clear();
-  EXPECT_EQ(1ul, split("", ',', &fields));
-}
-
-// Tests comparing substrings.
-TEST(SplitTest, CompareSubstrings) {
-  std::vector<std::string> fields;
-
-  split("find,middle,one", ',', &fields);
-  ASSERT_EQ(3ul, fields.size());
-  ASSERT_STREQ("middle", fields.at(1).c_str());
-  fields.clear();
-
-  // Empty fields between commas count.
-  split("find,,middle,one", ',', &fields);
-  ASSERT_EQ(4ul, fields.size());
-  ASSERT_STREQ("middle", fields.at(2).c_str());
-  fields.clear();
-  split("", ',', &fields);
-  ASSERT_EQ(1ul, fields.size());
-  ASSERT_STREQ("", fields.at(0).c_str());
-}
-
-TEST(BoolTest, DecodeValid) {
-  bool value;
-  EXPECT_TRUE(FromString("true", &value));
-  EXPECT_TRUE(value);
-  EXPECT_TRUE(FromString("true,", &value));
-  EXPECT_TRUE(value);
-  EXPECT_TRUE(FromString("true , true", &value));
-  EXPECT_TRUE(value);
-  EXPECT_TRUE(FromString("true ,\n false", &value));
-  EXPECT_TRUE(value);
-  EXPECT_TRUE(FromString("  true  \n", &value));
-  EXPECT_TRUE(value);
-
-  EXPECT_TRUE(FromString("false", &value));
-  EXPECT_FALSE(value);
-  EXPECT_TRUE(FromString("  false ", &value));
-  EXPECT_FALSE(value);
-  EXPECT_TRUE(FromString("  false, ", &value));
-  EXPECT_FALSE(value);
-
-  EXPECT_TRUE(FromString<bool>("true\n"));
-  EXPECT_FALSE(FromString<bool>("false\n"));
-}
-
-TEST(BoolTest, DecodeInvalid) {
-  bool value;
-  EXPECT_FALSE(FromString("True", &value));
-  EXPECT_FALSE(FromString("TRUE", &value));
-  EXPECT_FALSE(FromString("False", &value));
-  EXPECT_FALSE(FromString("FALSE", &value));
-  EXPECT_FALSE(FromString("0", &value));
-  EXPECT_FALSE(FromString("1", &value));
-  EXPECT_FALSE(FromString("0,", &value));
-  EXPECT_FALSE(FromString("1,", &value));
-  EXPECT_FALSE(FromString("1,0", &value));
-  EXPECT_FALSE(FromString("1.", &value));
-  EXPECT_FALSE(FromString("1.0", &value));
-  EXPECT_FALSE(FromString("", &value));
-  EXPECT_FALSE(FromString<bool>("false\nfalse"));
-}
-
-TEST(BoolTest, RoundTrip) {
-  bool value;
-  EXPECT_TRUE(FromString(ToString(true), &value));
-  EXPECT_TRUE(value);
-  EXPECT_TRUE(FromString(ToString(false), &value));
-  EXPECT_FALSE(value);
-}
-
-}  // namespace rtc
diff --git a/rtc_base/stringize_macros.h b/rtc_base/stringize_macros.h
deleted file mode 100644
index 992d35c..0000000
--- a/rtc_base/stringize_macros.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- *  Copyright (c) 2013 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.
- */
-
-// Modified from the Chromium original:
-// src/base/strings/stringize_macros.h
-
-// This file defines preprocessor macros for stringizing preprocessor
-// symbols (or their output) and manipulating preprocessor symbols
-// that define strings.
-
-#ifndef WEBRTC_RTC_BASE_STRINGIZE_MACROS_H_
-#define WEBRTC_RTC_BASE_STRINGIZE_MACROS_H_
-
-// This is not very useful as it does not expand defined symbols if
-// called directly. Use its counterpart without the _NO_EXPANSION
-// suffix, below.
-#define STRINGIZE_NO_EXPANSION(x) #x
-
-// Use this to quote the provided parameter, first expanding it if it
-// is a preprocessor symbol.
-//
-// For example, if:
-//   #define A FOO
-//   #define B(x) myobj->FunctionCall(x)
-//
-// Then:
-//   STRINGIZE(A) produces "FOO"
-//   STRINGIZE(B(y)) produces "myobj->FunctionCall(y)"
-#define STRINGIZE(x) STRINGIZE_NO_EXPANSION(x)
-
-#endif  // WEBRTC_RTC_BASE_STRINGIZE_MACROS_H_
diff --git a/rtc_base/stringize_macros_unittest.cc b/rtc_base/stringize_macros_unittest.cc
deleted file mode 100644
index bb3a0f6..0000000
--- a/rtc_base/stringize_macros_unittest.cc
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- *  Copyright (c) 2013 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/rtc_base/stringize_macros.h"
-
-#include "webrtc/test/gtest.h"
-
-// Macros as per documentation in header file.
-#define PREPROCESSOR_UTIL_UNITTEST_A FOO
-#define PREPROCESSOR_UTIL_UNITTEST_B(x) myobj->FunctionCall(x)
-#define PREPROCESSOR_UTIL_UNITTEST_C "foo"
-
-TEST(StringizeTest, Ansi) {
-  EXPECT_STREQ(
-      "PREPROCESSOR_UTIL_UNITTEST_A",
-      STRINGIZE_NO_EXPANSION(PREPROCESSOR_UTIL_UNITTEST_A));
-  EXPECT_STREQ(
-      "PREPROCESSOR_UTIL_UNITTEST_B(y)",
-      STRINGIZE_NO_EXPANSION(PREPROCESSOR_UTIL_UNITTEST_B(y)));
-  EXPECT_STREQ(
-      "PREPROCESSOR_UTIL_UNITTEST_C",
-      STRINGIZE_NO_EXPANSION(PREPROCESSOR_UTIL_UNITTEST_C));
-
-  EXPECT_STREQ("FOO", STRINGIZE(PREPROCESSOR_UTIL_UNITTEST_A));
-  EXPECT_STREQ("myobj->FunctionCall(y)",
-               STRINGIZE(PREPROCESSOR_UTIL_UNITTEST_B(y)));
-  EXPECT_STREQ("\"foo\"", STRINGIZE(PREPROCESSOR_UTIL_UNITTEST_C));
-}
diff --git a/rtc_base/stringutils.cc b/rtc_base/stringutils.cc
deleted file mode 100644
index b47bb16..0000000
--- a/rtc_base/stringutils.cc
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- *  Copyright 2004 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/rtc_base/stringutils.h"
-#include "webrtc/rtc_base/checks.h"
-
-namespace rtc {
-
-bool memory_check(const void* memory, int c, size_t count) {
-  const char* char_memory = static_cast<const char*>(memory);
-  char char_c = static_cast<char>(c);
-  for (size_t i = 0; i < count; ++i) {
-    if (char_memory[i] != char_c) {
-      return false;
-    }
-  }
-  return true;
-}
-
-bool string_match(const char* target, const char* pattern) {
-  while (*pattern) {
-    if (*pattern == '*') {
-      if (!*++pattern) {
-        return true;
-      }
-      while (*target) {
-        if ((toupper(*pattern) == toupper(*target))
-            && string_match(target + 1, pattern + 1)) {
-          return true;
-        }
-        ++target;
-      }
-      return false;
-    } else {
-      if (toupper(*pattern) != toupper(*target)) {
-        return false;
-      }
-      ++target;
-      ++pattern;
-    }
-  }
-  return !*target;
-}
-
-#if defined(WEBRTC_WIN)
-int ascii_string_compare(const wchar_t* s1, const char* s2, size_t n,
-                         CharacterTransformation transformation) {
-  wchar_t c1, c2;
-  while (true) {
-    if (n-- == 0) return 0;
-    c1 = transformation(*s1);
-    // Double check that characters are not UTF-8
-    RTC_DCHECK_LT(*s2, 128);
-    // Note: *s2 gets implicitly promoted to wchar_t
-    c2 = transformation(*s2);
-    if (c1 != c2) return (c1 < c2) ? -1 : 1;
-    if (!c1) return 0;
-    ++s1;
-    ++s2;
-  }
-}
-
-size_t asccpyn(wchar_t* buffer, size_t buflen,
-               const char* source, size_t srclen) {
-  if (buflen <= 0)
-    return 0;
-
-  if (srclen == SIZE_UNKNOWN) {
-    srclen = strlenn(source, buflen - 1);
-  } else if (srclen >= buflen) {
-    srclen = buflen - 1;
-  }
-#if RTC_DCHECK_IS_ON
-  // Double check that characters are not UTF-8
-  for (size_t pos = 0; pos < srclen; ++pos)
-    RTC_DCHECK_LT(source[pos], 128);
-#endif
-  std::copy(source, source + srclen, buffer);
-  buffer[srclen] = 0;
-  return srclen;
-}
-
-#endif  // WEBRTC_WIN
-
-void replace_substrs(const char *search,
-                     size_t search_len,
-                     const char *replace,
-                     size_t replace_len,
-                     std::string *s) {
-  size_t pos = 0;
-  while ((pos = s->find(search, pos, search_len)) != std::string::npos) {
-    s->replace(pos, search_len, replace, replace_len);
-    pos += replace_len;
-  }
-}
-
-bool starts_with(const char *s1, const char *s2) {
-  return strncmp(s1, s2, strlen(s2)) == 0;
-}
-
-bool ends_with(const char *s1, const char *s2) {
-  size_t s1_length = strlen(s1);
-  size_t s2_length = strlen(s2);
-
-  if (s2_length > s1_length) {
-    return false;
-  }
-
-  const char* start = s1 + (s1_length - s2_length);
-  return strncmp(start, s2, s2_length) == 0;
-}
-
-static const char kWhitespace[] = " \n\r\t";
-
-std::string string_trim(const std::string& s) {
-  std::string::size_type first = s.find_first_not_of(kWhitespace);
-  std::string::size_type last  = s.find_last_not_of(kWhitespace);
-
-  if (first == std::string::npos || last == std::string::npos) {
-    return std::string("");
-  }
-
-  return s.substr(first, last - first + 1);
-}
-
-}  // namespace rtc
diff --git a/rtc_base/stringutils.h b/rtc_base/stringutils.h
deleted file mode 100644
index 1a6392f..0000000
--- a/rtc_base/stringutils.h
+++ /dev/null
@@ -1,316 +0,0 @@
-/*
- *  Copyright 2004 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_RTC_BASE_STRINGUTILS_H_
-#define WEBRTC_RTC_BASE_STRINGUTILS_H_
-
-#include <ctype.h>
-#include <stdarg.h>
-#include <stdio.h>
-#include <string.h>
-
-#if defined(WEBRTC_WIN)
-#include <malloc.h>
-#include <wchar.h>
-#define alloca _alloca
-#endif  // WEBRTC_WIN
-
-#if defined(WEBRTC_POSIX)
-#ifdef BSD
-#include <stdlib.h>
-#else  // BSD
-#include <alloca.h>
-#endif  // !BSD
-#endif  // WEBRTC_POSIX
-
-#include <string>
-
-///////////////////////////////////////////////////////////////////////////////
-// Generic string/memory utilities
-///////////////////////////////////////////////////////////////////////////////
-
-#define STACK_ARRAY(TYPE, LEN) static_cast<TYPE*>(::alloca((LEN)*sizeof(TYPE)))
-
-namespace rtc {
-
-// Complement to memset.  Verifies memory consists of count bytes of value c.
-bool memory_check(const void* memory, int c, size_t count);
-
-// Determines whether the simple wildcard pattern matches target.
-// Alpha characters in pattern match case-insensitively.
-// Asterisks in pattern match 0 or more characters.
-// Ex: string_match("www.TEST.GOOGLE.COM", "www.*.com") -> true
-bool string_match(const char* target, const char* pattern);
-
-}  // namespace rtc
-
-///////////////////////////////////////////////////////////////////////////////
-// Rename a bunch of common string functions so they are consistent across
-// platforms and between char and wchar_t variants.
-// Here is the full list of functions that are unified:
-//  strlen, strcmp, stricmp, strncmp, strnicmp
-//  strchr, vsnprintf, strtoul, tolowercase
-// tolowercase is like tolower, but not compatible with end-of-file value
-//
-// It's not clear if we will ever use wchar_t strings on unix.  In theory,
-// all strings should be Utf8 all the time, except when interfacing with Win32
-// APIs that require Utf16.
-///////////////////////////////////////////////////////////////////////////////
-
-inline char tolowercase(char c) {
-  return static_cast<char>(tolower(c));
-}
-
-#if defined(WEBRTC_WIN)
-
-inline size_t strlen(const wchar_t* s) {
-  return wcslen(s);
-}
-inline int strcmp(const wchar_t* s1, const wchar_t* s2) {
-  return wcscmp(s1, s2);
-}
-inline int stricmp(const wchar_t* s1, const wchar_t* s2) {
-  return _wcsicmp(s1, s2);
-}
-inline int strncmp(const wchar_t* s1, const wchar_t* s2, size_t n) {
-  return wcsncmp(s1, s2, n);
-}
-inline int strnicmp(const wchar_t* s1, const wchar_t* s2, size_t n) {
-  return _wcsnicmp(s1, s2, n);
-}
-inline const wchar_t* strchr(const wchar_t* s, wchar_t c) {
-  return wcschr(s, c);
-}
-inline const wchar_t* strstr(const wchar_t* haystack, const wchar_t* needle) {
-  return wcsstr(haystack, needle);
-}
-#ifndef vsnprintf
-inline int vsnprintf(wchar_t* buf, size_t n, const wchar_t* fmt, va_list args) {
-  return _vsnwprintf(buf, n, fmt, args);
-}
-#endif // !vsnprintf
-inline unsigned long strtoul(const wchar_t* snum, wchar_t** end, int base) {
-  return wcstoul(snum, end, base);
-}
-inline wchar_t tolowercase(wchar_t c) {
-  return static_cast<wchar_t>(towlower(c));
-}
-
-#endif  // WEBRTC_WIN
-
-#if defined(WEBRTC_POSIX)
-
-inline int _stricmp(const char* s1, const char* s2) {
-  return strcasecmp(s1, s2);
-}
-inline int _strnicmp(const char* s1, const char* s2, size_t n) {
-  return strncasecmp(s1, s2, n);
-}
-
-#endif // WEBRTC_POSIX
-
-///////////////////////////////////////////////////////////////////////////////
-// Traits simplifies porting string functions to be CTYPE-agnostic
-///////////////////////////////////////////////////////////////////////////////
-
-namespace rtc {
-
-const size_t SIZE_UNKNOWN = static_cast<size_t>(-1);
-
-template<class CTYPE>
-struct Traits {
-  // STL string type
-  //typedef XXX string;
-  // Null-terminated string
-  //inline static const CTYPE* empty_str();
-};
-
-///////////////////////////////////////////////////////////////////////////////
-// String utilities which work with char or wchar_t
-///////////////////////////////////////////////////////////////////////////////
-
-template <class CTYPE>
-inline const CTYPE* nonnull(const CTYPE* str, const CTYPE* def_str = nullptr) {
-  return str ? str : (def_str ? def_str : Traits<CTYPE>::empty_str());
-}
-
-template<class CTYPE>
-const CTYPE* strchr(const CTYPE* str, const CTYPE* chs) {
-  for (size_t i=0; str[i]; ++i) {
-    for (size_t j=0; chs[j]; ++j) {
-      if (str[i] == chs[j]) {
-        return str + i;
-      }
-    }
-  }
-  return 0;
-}
-
-template<class CTYPE>
-const CTYPE* strchrn(const CTYPE* str, size_t slen, CTYPE ch) {
-  for (size_t i=0; i<slen && str[i]; ++i) {
-    if (str[i] == ch) {
-      return str + i;
-    }
-  }
-  return 0;
-}
-
-template<class CTYPE>
-size_t strlenn(const CTYPE* buffer, size_t buflen) {
-  size_t bufpos = 0;
-  while (buffer[bufpos] && (bufpos < buflen)) {
-    ++bufpos;
-  }
-  return bufpos;
-}
-
-// Safe versions of strncpy, strncat, snprintf and vsnprintf that always
-// null-terminate.
-
-template<class CTYPE>
-size_t strcpyn(CTYPE* buffer, size_t buflen,
-               const CTYPE* source, size_t srclen = SIZE_UNKNOWN) {
-  if (buflen <= 0)
-    return 0;
-
-  if (srclen == SIZE_UNKNOWN) {
-    srclen = strlenn(source, buflen - 1);
-  } else if (srclen >= buflen) {
-    srclen = buflen - 1;
-  }
-  memcpy(buffer, source, srclen * sizeof(CTYPE));
-  buffer[srclen] = 0;
-  return srclen;
-}
-
-template<class CTYPE>
-size_t strcatn(CTYPE* buffer, size_t buflen,
-               const CTYPE* source, size_t srclen = SIZE_UNKNOWN) {
-  if (buflen <= 0)
-    return 0;
-
-  size_t bufpos = strlenn(buffer, buflen - 1);
-  return bufpos + strcpyn(buffer + bufpos, buflen - bufpos, source, srclen);
-}
-
-// Some compilers (clang specifically) require vsprintfn be defined before
-// sprintfn.
-template<class CTYPE>
-size_t vsprintfn(CTYPE* buffer, size_t buflen, const CTYPE* format,
-                 va_list args) {
-  int len = vsnprintf(buffer, buflen, format, args);
-  if ((len < 0) || (static_cast<size_t>(len) >= buflen)) {
-    len = static_cast<int>(buflen - 1);
-    buffer[len] = 0;
-  }
-  return len;
-}
-
-template<class CTYPE>
-size_t sprintfn(CTYPE* buffer, size_t buflen, const CTYPE* format, ...);
-template<class CTYPE>
-size_t sprintfn(CTYPE* buffer, size_t buflen, const CTYPE* format, ...) {
-  va_list args;
-  va_start(args, format);
-  size_t len = vsprintfn(buffer, buflen, format, args);
-  va_end(args);
-  return len;
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// Allow safe comparing and copying ascii (not UTF-8) with both wide and
-// non-wide character strings.
-///////////////////////////////////////////////////////////////////////////////
-
-inline int asccmp(const char* s1, const char* s2) {
-  return strcmp(s1, s2);
-}
-inline int ascicmp(const char* s1, const char* s2) {
-  return _stricmp(s1, s2);
-}
-inline int ascncmp(const char* s1, const char* s2, size_t n) {
-  return strncmp(s1, s2, n);
-}
-inline int ascnicmp(const char* s1, const char* s2, size_t n) {
-  return _strnicmp(s1, s2, n);
-}
-inline size_t asccpyn(char* buffer, size_t buflen,
-                      const char* source, size_t srclen = SIZE_UNKNOWN) {
-  return strcpyn(buffer, buflen, source, srclen);
-}
-
-#if defined(WEBRTC_WIN)
-
-typedef wchar_t(*CharacterTransformation)(wchar_t);
-inline wchar_t identity(wchar_t c) { return c; }
-int ascii_string_compare(const wchar_t* s1, const char* s2, size_t n,
-                         CharacterTransformation transformation);
-
-inline int asccmp(const wchar_t* s1, const char* s2) {
-  return ascii_string_compare(s1, s2, static_cast<size_t>(-1), identity);
-}
-inline int ascicmp(const wchar_t* s1, const char* s2) {
-  return ascii_string_compare(s1, s2, static_cast<size_t>(-1), tolowercase);
-}
-inline int ascncmp(const wchar_t* s1, const char* s2, size_t n) {
-  return ascii_string_compare(s1, s2, n, identity);
-}
-inline int ascnicmp(const wchar_t* s1, const char* s2, size_t n) {
-  return ascii_string_compare(s1, s2, n, tolowercase);
-}
-size_t asccpyn(wchar_t* buffer, size_t buflen,
-               const char* source, size_t srclen = SIZE_UNKNOWN);
-
-#endif  // WEBRTC_WIN
-
-///////////////////////////////////////////////////////////////////////////////
-// Traits<char> specializations
-///////////////////////////////////////////////////////////////////////////////
-
-template<>
-struct Traits<char> {
-  typedef std::string string;
-  inline static const char* empty_str() { return ""; }
-};
-
-///////////////////////////////////////////////////////////////////////////////
-// Traits<wchar_t> specializations (Windows only, currently)
-///////////////////////////////////////////////////////////////////////////////
-
-#if defined(WEBRTC_WIN)
-
-template<>
-struct Traits<wchar_t> {
-  typedef std::wstring string;
-  inline static const wchar_t* empty_str() { return L""; }
-};
-
-#endif  // WEBRTC_WIN
-
-// Replaces all occurrences of "search" with "replace".
-void replace_substrs(const char *search,
-                     size_t search_len,
-                     const char *replace,
-                     size_t replace_len,
-                     std::string *s);
-
-// True iff s1 starts with s2.
-bool starts_with(const char *s1, const char *s2);
-
-// True iff s1 ends with s2.
-bool ends_with(const char *s1, const char *s2);
-
-// Remove leading and trailing whitespaces.
-std::string string_trim(const std::string& s);
-
-}  // namespace rtc
-
-#endif // WEBRTC_RTC_BASE_STRINGUTILS_H_
diff --git a/rtc_base/stringutils_unittest.cc b/rtc_base/stringutils_unittest.cc
deleted file mode 100644
index 7689b83..0000000
--- a/rtc_base/stringutils_unittest.cc
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- *  Copyright 2004 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/rtc_base/stringutils.h"
-#include "webrtc/rtc_base/gunit.h"
-
-namespace rtc {
-
-// Tests for string_match().
-
-TEST(string_matchTest, Matches) {
-  EXPECT_TRUE( string_match("A.B.C.D", "a.b.c.d"));
-  EXPECT_TRUE( string_match("www.TEST.GOOGLE.COM", "www.*.com"));
-  EXPECT_TRUE( string_match("127.0.0.1",  "12*.0.*1"));
-  EXPECT_TRUE( string_match("127.1.0.21", "12*.0.*1"));
-  EXPECT_FALSE(string_match("127.0.0.0",  "12*.0.*1"));
-  EXPECT_FALSE(string_match("127.0.0.0",  "12*.0.*1"));
-  EXPECT_FALSE(string_match("127.1.1.21", "12*.0.*1"));
-}
-
-// It's not clear if we will ever use wchar_t strings on unix.  In theory,
-// all strings should be Utf8 all the time, except when interfacing with Win32
-// APIs that require Utf16.
-
-#if defined(WEBRTC_WIN)
-
-// Tests for ascii_string_compare().
-
-// Tests null input.
-TEST(ascii_string_compareTest, NullInput) {
-  // The following results in an access violation in
-  // ascii_string_compare.  Is this a bug or by design?  stringutils.h
-  // should document the expected behavior in this case.
-
-  // EXPECT_EQ(0, ascii_string_compare(nullptr, nullptr, 1, identity));
-}
-
-// Tests comparing two strings of different lengths.
-TEST(ascii_string_compareTest, DifferentLengths) {
-  EXPECT_EQ(-1, ascii_string_compare(L"Test", "Test1", 5, identity));
-}
-
-// Tests the case where the buffer size is smaller than the string
-// lengths.
-TEST(ascii_string_compareTest, SmallBuffer) {
-  EXPECT_EQ(0, ascii_string_compare(L"Test", "Test1", 3, identity));
-}
-
-// Tests the case where the buffer is not full.
-TEST(ascii_string_compareTest, LargeBuffer) {
-  EXPECT_EQ(0, ascii_string_compare(L"Test", "Test", 10, identity));
-}
-
-// Tests comparing two eqaul strings.
-TEST(ascii_string_compareTest, Equal) {
-  EXPECT_EQ(0, ascii_string_compare(L"Test", "Test", 5, identity));
-  EXPECT_EQ(0, ascii_string_compare(L"TeSt", "tEsT", 5, tolowercase));
-}
-
-// Tests comparing a smller string to a larger one.
-TEST(ascii_string_compareTest, LessThan) {
-  EXPECT_EQ(-1, ascii_string_compare(L"abc", "abd", 4, identity));
-  EXPECT_EQ(-1, ascii_string_compare(L"ABC", "abD", 5, tolowercase));
-}
-
-// Tests comparing a larger string to a smaller one.
-TEST(ascii_string_compareTest, GreaterThan) {
-  EXPECT_EQ(1, ascii_string_compare(L"xyz", "xy", 5, identity));
-  EXPECT_EQ(1, ascii_string_compare(L"abc", "ABB", 5, tolowercase));
-}
-#endif  // WEBRTC_WIN 
-
-TEST(string_trim_Test, Trimming) {
-  EXPECT_EQ("temp", string_trim("\n\r\t temp \n\r\t"));
-  EXPECT_EQ("temp\n\r\t temp", string_trim(" temp\n\r\t temp "));
-  EXPECT_EQ("temp temp", string_trim("temp temp"));
-  EXPECT_EQ("", string_trim(" \r\n\t"));
-  EXPECT_EQ("", string_trim(""));
-}
-
-TEST(string_startsTest, StartsWith) {
-  EXPECT_TRUE(starts_with("foobar", "foo"));
-  EXPECT_TRUE(starts_with("foobar", "foobar"));
-  EXPECT_TRUE(starts_with("foobar", ""));
-  EXPECT_TRUE(starts_with("", ""));
-  EXPECT_FALSE(starts_with("foobar", "bar"));
-  EXPECT_FALSE(starts_with("foobar", "foobarbaz"));
-  EXPECT_FALSE(starts_with("", "f"));
-}
-
-TEST(string_endsTest, EndsWith) {
-  EXPECT_TRUE(ends_with("foobar", "bar"));
-  EXPECT_TRUE(ends_with("foobar", "foobar"));
-  EXPECT_TRUE(ends_with("foobar", ""));
-  EXPECT_TRUE(ends_with("", ""));
-  EXPECT_FALSE(ends_with("foobar", "foo"));
-  EXPECT_FALSE(ends_with("foobar", "foobarbaz"));
-  EXPECT_FALSE(ends_with("", "f"));
-}
-
-} // namespace rtc
diff --git a/rtc_base/swap_queue.h b/rtc_base/swap_queue.h
deleted file mode 100644
index 95bae21..0000000
--- a/rtc_base/swap_queue.h
+++ /dev/null
@@ -1,211 +0,0 @@
-/*
- *  Copyright (c) 2015 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_RTC_BASE_SWAP_QUEUE_H_
-#define WEBRTC_RTC_BASE_SWAP_QUEUE_H_
-
-#include <algorithm>
-#include <utility>
-#include <vector>
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/criticalsection.h"
-
-namespace webrtc {
-
-namespace internal {
-
-// (Internal; please don't use outside this file.)
-template <typename T>
-bool NoopSwapQueueItemVerifierFunction(const T&) {
-  return true;
-}
-
-}  // namespace internal
-
-// Functor to use when supplying a verifier function for the queue.
-template <typename T,
-          bool (*QueueItemVerifierFunction)(const T&) =
-              internal::NoopSwapQueueItemVerifierFunction>
-class SwapQueueItemVerifier {
- public:
-  bool operator()(const T& t) const { return QueueItemVerifierFunction(t); }
-};
-
-// This class is a fixed-size queue. A producer calls Insert() to insert
-// an element of type T at the back of the queue, and a consumer calls
-// Remove() to remove an element from the front of the queue. It's safe
-// for the producer(s) and the consumer(s) to access the queue
-// concurrently, from different threads.
-//
-// To avoid the construction, copying, and destruction of Ts that a naive
-// queue implementation would require, for each "full" T passed from
-// producer to consumer, SwapQueue<T> passes an "empty" T in the other
-// direction (an "empty" T is one that contains nothing of value for the
-// consumer). This bidirectional movement is implemented with swap().
-//
-// // Create queue:
-// Bottle proto(568);  // Prepare an empty Bottle. Heap allocates space for
-//                     // 568 ml.
-// SwapQueue<Bottle> q(N, proto);  // Init queue with N copies of proto.
-//                                 // Each copy allocates on the heap.
-// // Producer pseudo-code:
-// Bottle b(568); // Prepare an empty Bottle. Heap allocates space for 568 ml.
-// loop {
-//   b.Fill(amount);  // Where amount <= 568 ml.
-//   q.Insert(&b);    // Swap our full Bottle for an empty one from q.
-// }
-//
-// // Consumer pseudo-code:
-// Bottle b(568);  // Prepare an empty Bottle. Heap allocates space for 568 ml.
-// loop {
-//   q.Remove(&b); // Swap our empty Bottle for the next-in-line full Bottle.
-//   Drink(&b);
-// }
-//
-// For a well-behaved Bottle class, there are no allocations in the
-// producer, since it just fills an empty Bottle that's already large
-// enough; no deallocations in the consumer, since it returns each empty
-// Bottle to the queue after having drunk it; and no copies along the
-// way, since the queue uses swap() everywhere to move full Bottles in
-// one direction and empty ones in the other.
-template <typename T, typename QueueItemVerifier = SwapQueueItemVerifier<T>>
-class SwapQueue {
- public:
-  // Creates a queue of size size and fills it with default constructed Ts.
-  explicit SwapQueue(size_t size) : queue_(size) {
-    RTC_DCHECK(VerifyQueueSlots());
-  }
-
-  // Same as above and accepts an item verification functor.
-  SwapQueue(size_t size, const QueueItemVerifier& queue_item_verifier)
-      : queue_item_verifier_(queue_item_verifier), queue_(size) {
-    RTC_DCHECK(VerifyQueueSlots());
-  }
-
-  // Creates a queue of size size and fills it with copies of prototype.
-  SwapQueue(size_t size, const T& prototype) : queue_(size, prototype) {
-    RTC_DCHECK(VerifyQueueSlots());
-  }
-
-  // Same as above and accepts an item verification functor.
-  SwapQueue(size_t size,
-            const T& prototype,
-            const QueueItemVerifier& queue_item_verifier)
-      : queue_item_verifier_(queue_item_verifier), queue_(size, prototype) {
-    RTC_DCHECK(VerifyQueueSlots());
-  }
-
-  // Resets the queue to have zero content wile maintaining the queue size.
-  void Clear() {
-    rtc::CritScope cs(&crit_queue_);
-    next_write_index_ = 0;
-    next_read_index_ = 0;
-    num_elements_ = 0;
-  }
-
-  // Inserts a "full" T at the back of the queue by swapping *input with an
-  // "empty" T from the queue.
-  // Returns true if the item was inserted or false if not (the queue was full).
-  // When specified, the T given in *input must pass the ItemVerifier() test.
-  // The contents of *input after the call are then also guaranteed to pass the
-  // ItemVerifier() test.
-  bool Insert(T* input) RTC_WARN_UNUSED_RESULT {
-    RTC_DCHECK(input);
-
-    rtc::CritScope cs(&crit_queue_);
-
-    RTC_DCHECK(queue_item_verifier_(*input));
-
-    if (num_elements_ == queue_.size()) {
-      return false;
-    }
-
-    using std::swap;
-    swap(*input, queue_[next_write_index_]);
-
-    ++next_write_index_;
-    if (next_write_index_ == queue_.size()) {
-      next_write_index_ = 0;
-    }
-
-    ++num_elements_;
-
-    RTC_DCHECK_LT(next_write_index_, queue_.size());
-    RTC_DCHECK_LE(num_elements_, queue_.size());
-
-    return true;
-  }
-
-  // Removes the frontmost "full" T from the queue by swapping it with
-  // the "empty" T in *output.
-  // Returns true if an item could be removed or false if not (the queue was
-  // empty). When specified, The T given in *output must pass the ItemVerifier()
-  // test and the contents of *output after the call are then also guaranteed to
-  // pass the ItemVerifier() test.
-  bool Remove(T* output) RTC_WARN_UNUSED_RESULT {
-    RTC_DCHECK(output);
-
-    rtc::CritScope cs(&crit_queue_);
-
-    RTC_DCHECK(queue_item_verifier_(*output));
-
-    if (num_elements_ == 0) {
-      return false;
-    }
-
-    using std::swap;
-    swap(*output, queue_[next_read_index_]);
-
-    ++next_read_index_;
-    if (next_read_index_ == queue_.size()) {
-      next_read_index_ = 0;
-    }
-
-    --num_elements_;
-
-    RTC_DCHECK_LT(next_read_index_, queue_.size());
-    RTC_DCHECK_LE(num_elements_, queue_.size());
-
-    return true;
-  }
-
- private:
-  // Verify that the queue slots complies with the ItemVerifier test.
-  bool VerifyQueueSlots() {
-    rtc::CritScope cs(&crit_queue_);
-    for (const auto& v : queue_) {
-      RTC_DCHECK(queue_item_verifier_(v));
-    }
-    return true;
-  }
-
-  rtc::CriticalSection crit_queue_;
-
-  // TODO(peah): Change this to use std::function() once we can use C++11 std
-  // lib.
-  QueueItemVerifier queue_item_verifier_ RTC_GUARDED_BY(crit_queue_);
-
-  // (next_read_index_ + num_elements_) % queue_.size() =
-  //  next_write_index_
-  size_t next_write_index_ RTC_GUARDED_BY(crit_queue_) = 0;
-  size_t next_read_index_ RTC_GUARDED_BY(crit_queue_) = 0;
-  size_t num_elements_ RTC_GUARDED_BY(crit_queue_) = 0;
-
-  // queue_.size() is constant.
-  std::vector<T> queue_ RTC_GUARDED_BY(crit_queue_);
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(SwapQueue);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_RTC_BASE_SWAP_QUEUE_H_
diff --git a/rtc_base/swap_queue_unittest.cc b/rtc_base/swap_queue_unittest.cc
deleted file mode 100644
index ceda7eb..0000000
--- a/rtc_base/swap_queue_unittest.cc
+++ /dev/null
@@ -1,225 +0,0 @@
-/*
- *  Copyright (c) 2015 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/rtc_base/swap_queue.h"
-
-#include <vector>
-
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-namespace {
-
-// Test parameter for the basic sample based SwapQueue Tests.
-const size_t kChunkSize = 3;
-
-// Queue item verification function for the vector test.
-bool LengthVerifierFunction(const std::vector<int>& v) {
-  return v.size() == kChunkSize;
-}
-
-// Queue item verifier for the vector test.
-class LengthVerifierFunctor {
- public:
-  explicit LengthVerifierFunctor(size_t length) : length_(length) {}
-
-  bool operator()(const std::vector<int>& v) const {
-    return v.size() == length_;
-  }
-
- private:
-  size_t length_;
-};
-
-}  // anonymous namespace
-
-TEST(SwapQueueTest, BasicOperation) {
-  std::vector<int> i(kChunkSize, 0);
-  SwapQueue<std::vector<int>> queue(2, i);
-
-  EXPECT_TRUE(queue.Insert(&i));
-  EXPECT_EQ(i.size(), kChunkSize);
-  EXPECT_TRUE(queue.Insert(&i));
-  EXPECT_EQ(i.size(), kChunkSize);
-  EXPECT_TRUE(queue.Remove(&i));
-  EXPECT_EQ(i.size(), kChunkSize);
-  EXPECT_TRUE(queue.Remove(&i));
-  EXPECT_EQ(i.size(), kChunkSize);
-}
-
-TEST(SwapQueueTest, FullQueue) {
-  SwapQueue<int> queue(2);
-
-  // Fill the queue.
-  int i = 0;
-  EXPECT_TRUE(queue.Insert(&i));
-  i = 1;
-  EXPECT_TRUE(queue.Insert(&i));
-
-  // Ensure that the value is not swapped when doing an Insert
-  // on a full queue.
-  i = 2;
-  EXPECT_FALSE(queue.Insert(&i));
-  EXPECT_EQ(i, 2);
-
-  // Ensure that the Insert didn't overwrite anything in the queue.
-  EXPECT_TRUE(queue.Remove(&i));
-  EXPECT_EQ(i, 0);
-  EXPECT_TRUE(queue.Remove(&i));
-  EXPECT_EQ(i, 1);
-}
-
-TEST(SwapQueueTest, EmptyQueue) {
-  SwapQueue<int> queue(2);
-  int i = 0;
-  EXPECT_FALSE(queue.Remove(&i));
-  EXPECT_TRUE(queue.Insert(&i));
-  EXPECT_TRUE(queue.Remove(&i));
-  EXPECT_FALSE(queue.Remove(&i));
-}
-
-TEST(SwapQueueTest, Clear) {
-  SwapQueue<int> queue(2);
-  int i = 0;
-
-  // Fill the queue.
-  EXPECT_TRUE(queue.Insert(&i));
-  EXPECT_TRUE(queue.Insert(&i));
-
-  // Ensure full queue.
-  EXPECT_FALSE(queue.Insert(&i));
-
-  // Empty the queue.
-  queue.Clear();
-
-  // Ensure that the queue is empty
-  EXPECT_FALSE(queue.Remove(&i));
-
-  // Ensure that the queue is no longer full.
-  EXPECT_TRUE(queue.Insert(&i));
-}
-
-TEST(SwapQueueTest, SuccessfulItemVerifyFunction) {
-  std::vector<int> template_element(kChunkSize);
-  SwapQueue<std::vector<int>,
-            SwapQueueItemVerifier<std::vector<int>, LengthVerifierFunction>>
-      queue(2, template_element);
-  std::vector<int> valid_chunk(kChunkSize, 0);
-
-  EXPECT_TRUE(queue.Insert(&valid_chunk));
-  EXPECT_EQ(valid_chunk.size(), kChunkSize);
-  EXPECT_TRUE(queue.Remove(&valid_chunk));
-  EXPECT_EQ(valid_chunk.size(), kChunkSize);
-}
-
-TEST(SwapQueueTest, SuccessfulItemVerifyFunctor) {
-  std::vector<int> template_element(kChunkSize);
-  LengthVerifierFunctor verifier(kChunkSize);
-  SwapQueue<std::vector<int>, LengthVerifierFunctor> queue(2, template_element,
-                                                           verifier);
-  std::vector<int> valid_chunk(kChunkSize, 0);
-
-  EXPECT_TRUE(queue.Insert(&valid_chunk));
-  EXPECT_EQ(valid_chunk.size(), kChunkSize);
-  EXPECT_TRUE(queue.Remove(&valid_chunk));
-  EXPECT_EQ(valid_chunk.size(), kChunkSize);
-}
-
-#if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
-TEST(SwapQueueTest, UnsuccessfulItemVerifyFunctor) {
-  // Queue item verifier for the test.
-  auto minus_2_verifier = [](const int& i) { return i > -2; };
-  SwapQueue<int, decltype(minus_2_verifier)> queue(2, minus_2_verifier);
-
-  int valid_value = 1;
-  int invalid_value = -4;
-  EXPECT_TRUE(queue.Insert(&valid_value));
-  EXPECT_TRUE(queue.Remove(&valid_value));
-  bool result;
-  EXPECT_DEATH(result = queue.Insert(&invalid_value), "");
-}
-
-TEST(SwapQueueTest, UnSuccessfulItemVerifyInsert) {
-  std::vector<int> template_element(kChunkSize);
-  SwapQueue<std::vector<int>,
-            SwapQueueItemVerifier<std::vector<int>, &LengthVerifierFunction>>
-      queue(2, template_element);
-  std::vector<int> invalid_chunk(kChunkSize - 1, 0);
-  bool result;
-  EXPECT_DEATH(result = queue.Insert(&invalid_chunk), "");
-}
-
-TEST(SwapQueueTest, UnSuccessfulItemVerifyRemove) {
-  std::vector<int> template_element(kChunkSize);
-  SwapQueue<std::vector<int>,
-            SwapQueueItemVerifier<std::vector<int>, &LengthVerifierFunction>>
-      queue(2, template_element);
-  std::vector<int> invalid_chunk(kChunkSize - 1, 0);
-  std::vector<int> valid_chunk(kChunkSize, 0);
-  EXPECT_TRUE(queue.Insert(&valid_chunk));
-  EXPECT_EQ(valid_chunk.size(), kChunkSize);
-  bool result;
-  EXPECT_DEATH(result = queue.Remove(&invalid_chunk), "");
-}
-#endif
-
-TEST(SwapQueueTest, VectorContentTest) {
-  const size_t kQueueSize = 10;
-  const size_t kFrameLength = 160;
-  const size_t kDataLength = kQueueSize * kFrameLength;
-  std::vector<int16_t> buffer_reader(kFrameLength, 0);
-  std::vector<int16_t> buffer_writer(kFrameLength, 0);
-  SwapQueue<std::vector<int16_t>> queue(kQueueSize,
-                                        std::vector<int16_t>(kFrameLength));
-  std::vector<int16_t> samples(kDataLength);
-
-  for (size_t k = 0; k < kDataLength; k++) {
-    samples[k] = k % 9;
-  }
-
-  for (size_t k = 0; k < kQueueSize; k++) {
-    buffer_writer.clear();
-    buffer_writer.insert(buffer_writer.end(), &samples[0] + k * kFrameLength,
-                         &samples[0] + (k + 1) * kFrameLength);
-
-    EXPECT_TRUE(queue.Insert(&buffer_writer));
-  }
-
-  for (size_t k = 0; k < kQueueSize; k++) {
-    EXPECT_TRUE(queue.Remove(&buffer_reader));
-
-    for (size_t j = 0; j < buffer_reader.size(); j++) {
-      EXPECT_EQ(buffer_reader[j], samples[k * kFrameLength + j]);
-    }
-  }
-}
-
-TEST(SwapQueueTest, ZeroSlotQueue) {
-  SwapQueue<int> queue(0);
-  int i = 42;
-  EXPECT_FALSE(queue.Insert(&i));
-  EXPECT_FALSE(queue.Remove(&i));
-  EXPECT_EQ(i, 42);
-}
-
-TEST(SwapQueueTest, OneSlotQueue) {
-  SwapQueue<int> queue(1);
-  int i = 42;
-  EXPECT_TRUE(queue.Insert(&i));
-  i = 43;
-  EXPECT_FALSE(queue.Insert(&i));
-  EXPECT_EQ(i, 43);
-  EXPECT_TRUE(queue.Remove(&i));
-  EXPECT_EQ(i, 42);
-  EXPECT_FALSE(queue.Remove(&i));
-}
-
-}  // namespace webrtc
diff --git a/rtc_base/task_queue.h b/rtc_base/task_queue.h
deleted file mode 100644
index 5ad0afb..0000000
--- a/rtc_base/task_queue.h
+++ /dev/null
@@ -1,243 +0,0 @@
-/*
- *  Copyright 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_RTC_BASE_TASK_QUEUE_H_
-#define WEBRTC_RTC_BASE_TASK_QUEUE_H_
-
-#include <list>
-#include <memory>
-#include <queue>
-#include <type_traits>
-
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/scoped_ref_ptr.h"
-
-namespace rtc {
-
-// Base interface for asynchronously executed tasks.
-// The interface basically consists of a single function, Run(), that executes
-// on the target queue.  For more details see the Run() method and TaskQueue.
-class QueuedTask {
- public:
-  QueuedTask() {}
-  virtual ~QueuedTask() {}
-
-  // Main routine that will run when the task is executed on the desired queue.
-  // The task should return |true| to indicate that it should be deleted or
-  // |false| to indicate that the queue should consider ownership of the task
-  // having been transferred.  Returning |false| can be useful if a task has
-  // re-posted itself to a different queue or is otherwise being re-used.
-  virtual bool Run() = 0;
-
- private:
-  RTC_DISALLOW_COPY_AND_ASSIGN(QueuedTask);
-};
-
-// Simple implementation of QueuedTask for use with rtc::Bind and lambdas.
-template <class Closure>
-class ClosureTask : public QueuedTask {
- public:
-  explicit ClosureTask(const Closure& closure) : closure_(closure) {}
-
- private:
-  bool Run() override {
-    closure_();
-    return true;
-  }
-
-  Closure closure_;
-};
-
-// Extends ClosureTask to also allow specifying cleanup code.
-// This is useful when using lambdas if guaranteeing cleanup, even if a task
-// was dropped (queue is too full), is required.
-template <class Closure, class Cleanup>
-class ClosureTaskWithCleanup : public ClosureTask<Closure> {
- public:
-  ClosureTaskWithCleanup(const Closure& closure, Cleanup cleanup)
-      : ClosureTask<Closure>(closure), cleanup_(cleanup) {}
-  ~ClosureTaskWithCleanup() { cleanup_(); }
-
- private:
-  Cleanup cleanup_;
-};
-
-// Convenience function to construct closures that can be passed directly
-// to methods that support std::unique_ptr<QueuedTask> but not template
-// based parameters.
-template <class Closure>
-static std::unique_ptr<QueuedTask> NewClosure(const Closure& closure) {
-  return std::unique_ptr<QueuedTask>(new ClosureTask<Closure>(closure));
-}
-
-template <class Closure, class Cleanup>
-static std::unique_ptr<QueuedTask> NewClosure(const Closure& closure,
-                                              const Cleanup& cleanup) {
-  return std::unique_ptr<QueuedTask>(
-      new ClosureTaskWithCleanup<Closure, Cleanup>(closure, cleanup));
-}
-
-// Implements a task queue that asynchronously executes tasks in a way that
-// guarantees that they're executed in FIFO order and that tasks never overlap.
-// Tasks may always execute on the same worker thread and they may not.
-// To DCHECK that tasks are executing on a known task queue, use IsCurrent().
-//
-// Here are some usage examples:
-//
-//   1) Asynchronously running a lambda:
-//
-//     class MyClass {
-//       ...
-//       TaskQueue queue_("MyQueue");
-//     };
-//
-//     void MyClass::StartWork() {
-//       queue_.PostTask([]() { Work(); });
-//     ...
-//
-//   2) Doing work asynchronously on a worker queue and providing a notification
-//      callback on the current queue, when the work has been done:
-//
-//     void MyClass::StartWorkAndLetMeKnowWhenDone(
-//         std::unique_ptr<QueuedTask> callback) {
-//       DCHECK(TaskQueue::Current()) << "Need to be running on a queue";
-//       queue_.PostTaskAndReply([]() { Work(); }, std::move(callback));
-//     }
-//     ...
-//     my_class->StartWorkAndLetMeKnowWhenDone(
-//         NewClosure([]() { LOG(INFO) << "The work is done!";}));
-//
-//   3) Posting a custom task on a timer.  The task posts itself again after
-//      every running:
-//
-//     class TimerTask : public QueuedTask {
-//      public:
-//       TimerTask() {}
-//      private:
-//       bool Run() override {
-//         ++count_;
-//         TaskQueue::Current()->PostDelayedTask(
-//             std::unique_ptr<QueuedTask>(this), 1000);
-//         // Ownership has been transferred to the next occurance,
-//         // so return false to prevent from being deleted now.
-//         return false;
-//       }
-//       int count_ = 0;
-//     };
-//     ...
-//     queue_.PostDelayedTask(
-//         std::unique_ptr<QueuedTask>(new TimerTask()), 1000);
-//
-// For more examples, see task_queue_unittests.cc.
-//
-// A note on destruction:
-//
-// When a TaskQueue is deleted, pending tasks will not be executed but they will
-// be deleted.  The deletion of tasks may happen asynchronously after the
-// TaskQueue itself has been deleted or it may happen synchronously while the
-// TaskQueue instance is being deleted.  This may vary from one OS to the next
-// so assumptions about lifetimes of pending tasks should not be made.
-class RTC_LOCKABLE TaskQueue {
- public:
-  // TaskQueue priority levels. On some platforms these will map to thread
-  // priorities, on others such as Mac and iOS, GCD queue priorities.
-  enum class Priority {
-    NORMAL = 0,
-    HIGH,
-    LOW,
-  };
-
-  explicit TaskQueue(const char* queue_name,
-                     Priority priority = Priority::NORMAL);
-  ~TaskQueue();
-
-  static TaskQueue* Current();
-
-  // Used for DCHECKing the current queue.
-  bool IsCurrent() const;
-
-  // TODO(tommi): For better debuggability, implement RTC_FROM_HERE.
-
-  // Ownership of the task is passed to PostTask.
-  void PostTask(std::unique_ptr<QueuedTask> task);
-  void PostTaskAndReply(std::unique_ptr<QueuedTask> task,
-                        std::unique_ptr<QueuedTask> reply,
-                        TaskQueue* reply_queue);
-  void PostTaskAndReply(std::unique_ptr<QueuedTask> task,
-                        std::unique_ptr<QueuedTask> reply);
-
-  // Schedules a task to execute a specified number of milliseconds from when
-  // the call is made. The precision should be considered as "best effort"
-  // and in some cases, such as on Windows when all high precision timers have
-  // been used up, can be off by as much as 15 millseconds (although 8 would be
-  // more likely). This can be mitigated by limiting the use of delayed tasks.
-  void PostDelayedTask(std::unique_ptr<QueuedTask> task, uint32_t milliseconds);
-
-  // std::enable_if is used here to make sure that calls to PostTask() with
-  // std::unique_ptr<SomeClassDerivedFromQueuedTask> would not end up being
-  // caught by this template.
-  template <class Closure,
-            typename std::enable_if<
-                std::is_copy_constructible<Closure>::value>::type* = nullptr>
-  void PostTask(const Closure& closure) {
-    PostTask(std::unique_ptr<QueuedTask>(new ClosureTask<Closure>(closure)));
-  }
-
-  // See documentation above for performance expectations.
-  template <class Closure>
-  void PostDelayedTask(const Closure& closure, uint32_t milliseconds) {
-    PostDelayedTask(
-        std::unique_ptr<QueuedTask>(new ClosureTask<Closure>(closure)),
-        milliseconds);
-  }
-
-  template <class Closure1, class Closure2>
-  void PostTaskAndReply(const Closure1& task,
-                        const Closure2& reply,
-                        TaskQueue* reply_queue) {
-    PostTaskAndReply(
-        std::unique_ptr<QueuedTask>(new ClosureTask<Closure1>(task)),
-        std::unique_ptr<QueuedTask>(new ClosureTask<Closure2>(reply)),
-        reply_queue);
-  }
-
-  template <class Closure>
-  void PostTaskAndReply(std::unique_ptr<QueuedTask> task,
-                        const Closure& reply) {
-    PostTaskAndReply(std::move(task), std::unique_ptr<QueuedTask>(
-                                          new ClosureTask<Closure>(reply)));
-  }
-
-  template <class Closure>
-  void PostTaskAndReply(const Closure& task,
-                        std::unique_ptr<QueuedTask> reply) {
-    PostTaskAndReply(
-        std::unique_ptr<QueuedTask>(new ClosureTask<Closure>(task)),
-        std::move(reply));
-  }
-
-  template <class Closure1, class Closure2>
-  void PostTaskAndReply(const Closure1& task, const Closure2& reply) {
-    PostTaskAndReply(
-        std::unique_ptr<QueuedTask>(new ClosureTask<Closure1>(task)),
-        std::unique_ptr<QueuedTask>(new ClosureTask<Closure2>(reply)));
-  }
-
- private:
-  class Impl;
-  const scoped_refptr<Impl> impl_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(TaskQueue);
-};
-
-}  // namespace rtc
-
-#endif  // WEBRTC_RTC_BASE_TASK_QUEUE_H_
diff --git a/rtc_base/task_queue_gcd.cc b/rtc_base/task_queue_gcd.cc
deleted file mode 100644
index 70a016b..0000000
--- a/rtc_base/task_queue_gcd.cc
+++ /dev/null
@@ -1,242 +0,0 @@
-/*
- *  Copyright 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.
- */
-
-// This file contains the implementation of TaskQueue for Mac and iOS.
-// The implementation uses Grand Central Dispatch queues (GCD) to
-// do the actual task queuing.
-
-#include "webrtc/rtc_base/task_queue.h"
-
-#include <string.h>
-
-#include <dispatch/dispatch.h>
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/refcount.h"
-#include "webrtc/rtc_base/refcountedobject.h"
-#include "webrtc/rtc_base/task_queue_posix.h"
-
-namespace rtc {
-namespace {
-
-using Priority = TaskQueue::Priority;
-
-int TaskQueuePriorityToGCD(Priority priority) {
-  switch (priority) {
-    case Priority::NORMAL:
-      return DISPATCH_QUEUE_PRIORITY_DEFAULT;
-    case Priority::HIGH:
-      return DISPATCH_QUEUE_PRIORITY_HIGH;
-    case Priority::LOW:
-      return DISPATCH_QUEUE_PRIORITY_LOW;
-  }
-}
-}
-
-using internal::GetQueuePtrTls;
-using internal::AutoSetCurrentQueuePtr;
-
-class TaskQueue::Impl : public RefCountInterface {
- public:
-  Impl(const char* queue_name, TaskQueue* task_queue, Priority priority);
-  ~Impl() override;
-
-  static TaskQueue* Current();
-
-  // Used for DCHECKing the current queue.
-  bool IsCurrent() const;
-
-  void PostTask(std::unique_ptr<QueuedTask> task);
-  void PostTaskAndReply(std::unique_ptr<QueuedTask> task,
-                        std::unique_ptr<QueuedTask> reply,
-                        TaskQueue::Impl* reply_queue);
-
-  void PostDelayedTask(std::unique_ptr<QueuedTask> task, uint32_t milliseconds);
-
- private:
-  struct QueueContext {
-    explicit QueueContext(TaskQueue* q) : queue(q), is_active(true) {}
-
-    static void SetNotActive(void* context) {
-      QueueContext* qc = static_cast<QueueContext*>(context);
-      qc->is_active = false;
-    }
-
-    static void DeleteContext(void* context) {
-      QueueContext* qc = static_cast<QueueContext*>(context);
-      delete qc;
-    }
-
-    TaskQueue* const queue;
-    bool is_active;
-  };
-
-  struct TaskContext {
-    TaskContext(QueueContext* queue_ctx, std::unique_ptr<QueuedTask> task)
-        : queue_ctx(queue_ctx), task(std::move(task)) {}
-    virtual ~TaskContext() {}
-
-    static void RunTask(void* context) {
-      std::unique_ptr<TaskContext> tc(static_cast<TaskContext*>(context));
-      if (tc->queue_ctx->is_active) {
-        AutoSetCurrentQueuePtr set_current(tc->queue_ctx->queue);
-        if (!tc->task->Run())
-          tc->task.release();
-      }
-    }
-
-    QueueContext* const queue_ctx;
-    std::unique_ptr<QueuedTask> task;
-  };
-
-  // Special case context for holding two tasks, a |first_task| + the task
-  // that's owned by the parent struct, TaskContext, that then becomes the
-  // second (i.e. 'reply') task.
-  struct PostTaskAndReplyContext : public TaskContext {
-    explicit PostTaskAndReplyContext(QueueContext* first_queue_ctx,
-                                     std::unique_ptr<QueuedTask> first_task,
-                                     QueueContext* second_queue_ctx,
-                                     std::unique_ptr<QueuedTask> second_task)
-        : TaskContext(second_queue_ctx, std::move(second_task)),
-          first_queue_ctx(first_queue_ctx),
-          first_task(std::move(first_task)),
-          reply_queue_(second_queue_ctx->queue->impl_->queue_) {
-      // Retain the reply queue for as long as this object lives.
-      // If we don't, we may have memory leaks and/or failures.
-      dispatch_retain(reply_queue_);
-    }
-    ~PostTaskAndReplyContext() override { dispatch_release(reply_queue_); }
-
-    static void RunTask(void* context) {
-      auto* rc = static_cast<PostTaskAndReplyContext*>(context);
-      if (rc->first_queue_ctx->is_active) {
-        AutoSetCurrentQueuePtr set_current(rc->first_queue_ctx->queue);
-        if (!rc->first_task->Run())
-          rc->first_task.release();
-      }
-      // Post the reply task.  This hands the work over to the parent struct.
-      // This task will eventually delete |this|.
-      dispatch_async_f(rc->reply_queue_, rc, &TaskContext::RunTask);
-    }
-
-    QueueContext* const first_queue_ctx;
-    std::unique_ptr<QueuedTask> first_task;
-    dispatch_queue_t reply_queue_;
-  };
-
-  dispatch_queue_t queue_;
-  QueueContext* const context_;
-};
-
-TaskQueue::Impl::Impl(const char* queue_name,
-                      TaskQueue* task_queue,
-                      Priority priority)
-    : queue_(dispatch_queue_create(queue_name, DISPATCH_QUEUE_SERIAL)),
-      context_(new QueueContext(task_queue)) {
-  RTC_DCHECK(queue_name);
-  RTC_CHECK(queue_);
-  dispatch_set_context(queue_, context_);
-  // Assign a finalizer that will delete the context when the last reference
-  // to the queue is released.  This may run after the TaskQueue object has
-  // been deleted.
-  dispatch_set_finalizer_f(queue_, &QueueContext::DeleteContext);
-
-  dispatch_set_target_queue(
-      queue_, dispatch_get_global_queue(TaskQueuePriorityToGCD(priority), 0));
-}
-
-TaskQueue::Impl::~Impl() {
-  RTC_DCHECK(!IsCurrent());
-  // Implementation/behavioral note:
-  // Dispatch queues are reference counted via calls to dispatch_retain and
-  // dispatch_release. Pending blocks submitted to a queue also hold a
-  // reference to the queue until they have finished. Once all references to a
-  // queue have been released, the queue will be deallocated by the system.
-  // This is why we check the context before running tasks.
-
-  // Use dispatch_sync to set the context to null to guarantee that there's not
-  // a race between checking the context and using it from a task.
-  dispatch_sync_f(queue_, context_, &QueueContext::SetNotActive);
-  dispatch_release(queue_);
-}
-
-// static
-TaskQueue* TaskQueue::Impl::Current() {
-  return static_cast<TaskQueue*>(pthread_getspecific(GetQueuePtrTls()));
-}
-
-bool TaskQueue::Impl::IsCurrent() const {
-  RTC_DCHECK(queue_);
-  const TaskQueue* current = Current();
-  return current && this == current->impl_.get();
-}
-
-void TaskQueue::Impl::PostTask(std::unique_ptr<QueuedTask> task) {
-  auto* context = new TaskContext(context_, std::move(task));
-  dispatch_async_f(queue_, context, &TaskContext::RunTask);
-}
-
-void TaskQueue::Impl::PostDelayedTask(std::unique_ptr<QueuedTask> task,
-                                      uint32_t milliseconds) {
-  auto* context = new TaskContext(context_, std::move(task));
-  dispatch_after_f(
-      dispatch_time(DISPATCH_TIME_NOW, milliseconds * NSEC_PER_MSEC), queue_,
-      context, &TaskContext::RunTask);
-}
-
-void TaskQueue::Impl::PostTaskAndReply(std::unique_ptr<QueuedTask> task,
-                                       std::unique_ptr<QueuedTask> reply,
-                                       TaskQueue::Impl* reply_queue) {
-  auto* context = new PostTaskAndReplyContext(
-      context_, std::move(task), reply_queue->context_, std::move(reply));
-  dispatch_async_f(queue_, context, &PostTaskAndReplyContext::RunTask);
-}
-
-// Boilerplate for the PIMPL pattern.
-TaskQueue::TaskQueue(const char* queue_name, Priority priority)
-    : impl_(new RefCountedObject<TaskQueue::Impl>(queue_name, this, priority)) {
-}
-
-TaskQueue::~TaskQueue() {}
-
-// static
-TaskQueue* TaskQueue::Current() {
-  return TaskQueue::Impl::Current();
-}
-
-// Used for DCHECKing the current queue.
-bool TaskQueue::IsCurrent() const {
-  return impl_->IsCurrent();
-}
-
-void TaskQueue::PostTask(std::unique_ptr<QueuedTask> task) {
-  return TaskQueue::impl_->PostTask(std::move(task));
-}
-
-void TaskQueue::PostTaskAndReply(std::unique_ptr<QueuedTask> task,
-                                 std::unique_ptr<QueuedTask> reply,
-                                 TaskQueue* reply_queue) {
-  return TaskQueue::impl_->PostTaskAndReply(std::move(task), std::move(reply),
-                                            reply_queue->impl_.get());
-}
-
-void TaskQueue::PostTaskAndReply(std::unique_ptr<QueuedTask> task,
-                                 std::unique_ptr<QueuedTask> reply) {
-  return TaskQueue::impl_->PostTaskAndReply(std::move(task), std::move(reply),
-                                            impl_.get());
-}
-
-void TaskQueue::PostDelayedTask(std::unique_ptr<QueuedTask> task,
-                                uint32_t milliseconds) {
-  return TaskQueue::impl_->PostDelayedTask(std::move(task), milliseconds);
-}
-
-}  // namespace rtc
diff --git a/rtc_base/task_queue_libevent.cc b/rtc_base/task_queue_libevent.cc
deleted file mode 100644
index 17da0f0..0000000
--- a/rtc_base/task_queue_libevent.cc
+++ /dev/null
@@ -1,525 +0,0 @@
-/*
- *  Copyright 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/rtc_base/task_queue.h"
-
-#include <fcntl.h>
-#include <signal.h>
-#include <string.h>
-#include <unistd.h>
-
-#include "base/third_party/libevent/event.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/platform_thread.h"
-#include "webrtc/rtc_base/refcount.h"
-#include "webrtc/rtc_base/refcountedobject.h"
-#include "webrtc/rtc_base/safe_conversions.h"
-#include "webrtc/rtc_base/task_queue.h"
-#include "webrtc/rtc_base/task_queue_posix.h"
-#include "webrtc/rtc_base/timeutils.h"
-
-namespace rtc {
-using internal::GetQueuePtrTls;
-using internal::AutoSetCurrentQueuePtr;
-
-namespace {
-static const char kQuit = 1;
-static const char kRunTask = 2;
-static const char kRunReplyTask = 3;
-
-using Priority = TaskQueue::Priority;
-
-// This ignores the SIGPIPE signal on the calling thread.
-// This signal can be fired when trying to write() to a pipe that's being
-// closed or while closing a pipe that's being written to.
-// We can run into that situation (e.g. reply tasks that don't get a chance to
-// run because the task queue is being deleted) so we ignore this signal and
-// continue as normal.
-// As a side note for this implementation, it would be great if we could safely
-// restore the sigmask, but unfortunately the operation of restoring it, can
-// itself actually cause SIGPIPE to be signaled :-| (e.g. on MacOS)
-// The SIGPIPE signal by default causes the process to be terminated, so we
-// don't want to risk that.
-// An alternative to this approach is to ignore the signal for the whole
-// process:
-//   signal(SIGPIPE, SIG_IGN);
-void IgnoreSigPipeSignalOnCurrentThread() {
-  sigset_t sigpipe_mask;
-  sigemptyset(&sigpipe_mask);
-  sigaddset(&sigpipe_mask, SIGPIPE);
-  pthread_sigmask(SIG_BLOCK, &sigpipe_mask, nullptr);
-}
-
-struct TimerEvent {
-  explicit TimerEvent(std::unique_ptr<QueuedTask> task)
-      : task(std::move(task)) {}
-  ~TimerEvent() { event_del(&ev); }
-  event ev;
-  std::unique_ptr<QueuedTask> task;
-};
-
-bool SetNonBlocking(int fd) {
-  const int flags = fcntl(fd, F_GETFL);
-  RTC_CHECK(flags != -1);
-  return (flags & O_NONBLOCK) || fcntl(fd, F_SETFL, flags | O_NONBLOCK) != -1;
-}
-
-// TODO(tommi): This is a hack to support two versions of libevent that we're
-// compatible with.  The method we really want to call is event_assign(),
-// since event_set() has been marked as deprecated (and doesn't accept
-// passing event_base__ as a parameter).  However, the version of libevent
-// that we have in Chromium, doesn't have event_assign(), so we need to call
-// event_set() there.
-void EventAssign(struct event* ev,
-                 struct event_base* base,
-                 int fd,
-                 short events,
-                 void (*callback)(int, short, void*),
-                 void* arg) {
-#if defined(_EVENT2_EVENT_H_)
-  RTC_CHECK_EQ(0, event_assign(ev, base, fd, events, callback, arg));
-#else
-  event_set(ev, fd, events, callback, arg);
-  RTC_CHECK_EQ(0, event_base_set(base, ev));
-#endif
-}
-
-ThreadPriority TaskQueuePriorityToThreadPriority(Priority priority) {
-  switch (priority) {
-    case Priority::HIGH:
-      return kRealtimePriority;
-    case Priority::LOW:
-      return kLowPriority;
-    case Priority::NORMAL:
-      return kNormalPriority;
-    default:
-      RTC_NOTREACHED();
-      break;
-  }
-  return kNormalPriority;
-}
-}  // namespace
-
-class TaskQueue::Impl : public RefCountInterface {
- public:
-  explicit Impl(const char* queue_name,
-                TaskQueue* queue,
-                Priority priority = Priority::NORMAL);
-  ~Impl() override;
-
-  static TaskQueue::Impl* Current();
-  static TaskQueue* CurrentQueue();
-
-  // Used for DCHECKing the current queue.
-  bool IsCurrent() const;
-
-  void PostTask(std::unique_ptr<QueuedTask> task);
-  void PostTaskAndReply(std::unique_ptr<QueuedTask> task,
-                        std::unique_ptr<QueuedTask> reply,
-                        TaskQueue::Impl* reply_queue);
-
-  void PostDelayedTask(std::unique_ptr<QueuedTask> task, uint32_t milliseconds);
-
- private:
-  static void ThreadMain(void* context);
-  static void OnWakeup(int socket, short flags, void* context);  // NOLINT
-  static void RunTask(int fd, short flags, void* context);       // NOLINT
-  static void RunTimer(int fd, short flags, void* context);      // NOLINT
-
-  class ReplyTaskOwner;
-  class PostAndReplyTask;
-  class SetTimerTask;
-
-  typedef RefCountedObject<ReplyTaskOwner> ReplyTaskOwnerRef;
-
-  void PrepareReplyTask(scoped_refptr<ReplyTaskOwnerRef> reply_task);
-
-  struct QueueContext;
-  TaskQueue* const queue_;
-  int wakeup_pipe_in_ = -1;
-  int wakeup_pipe_out_ = -1;
-  event_base* event_base_;
-  std::unique_ptr<event> wakeup_event_;
-  PlatformThread thread_;
-  rtc::CriticalSection pending_lock_;
-  std::list<std::unique_ptr<QueuedTask>> pending_ RTC_GUARDED_BY(pending_lock_);
-  std::list<scoped_refptr<ReplyTaskOwnerRef>> pending_replies_
-      RTC_GUARDED_BY(pending_lock_);
-};
-
-struct TaskQueue::Impl::QueueContext {
-  explicit QueueContext(TaskQueue::Impl* q) : queue(q), is_active(true) {}
-  TaskQueue::Impl* queue;
-  bool is_active;
-  // Holds a list of events pending timers for cleanup when the loop exits.
-  std::list<TimerEvent*> pending_timers_;
-};
-
-// Posting a reply task is tricky business. This class owns the reply task
-// and a reference to it is held by both the reply queue and the first task.
-// Here's an outline of what happens when dealing with a reply task.
-// * The ReplyTaskOwner owns the |reply_| task.
-// * One ref owned by PostAndReplyTask
-// * One ref owned by the reply TaskQueue
-// * ReplyTaskOwner has a flag |run_task_| initially set to false.
-// * ReplyTaskOwner has a method: HasOneRef() (provided by RefCountedObject).
-// * After successfully running the original |task_|, PostAndReplyTask() calls
-//   set_should_run_task(). This sets |run_task_| to true.
-// * In PostAndReplyTask's dtor:
-//   * It releases its reference to ReplyTaskOwner (important to do this first).
-//   * Sends (write()) a kRunReplyTask message to the reply queue's pipe.
-// * PostAndReplyTask doesn't care if write() fails, but when it does:
-//   * The reply queue is gone.
-//   * ReplyTaskOwner has already been deleted and the reply task too.
-// * If write() succeeds:
-//   * ReplyQueue receives the kRunReplyTask message
-//   * Goes through all pending tasks, finding the first that HasOneRef()
-//   * Calls ReplyTaskOwner::Run()
-//     * if set_should_run_task() was called, the reply task will be run
-//   * Release the reference to ReplyTaskOwner
-//   * ReplyTaskOwner and associated |reply_| are deleted.
-class TaskQueue::Impl::ReplyTaskOwner {
- public:
-  ReplyTaskOwner(std::unique_ptr<QueuedTask> reply)
-      : reply_(std::move(reply)) {}
-
-  void Run() {
-    RTC_DCHECK(reply_);
-    if (run_task_) {
-      if (!reply_->Run())
-        reply_.release();
-    }
-    reply_.reset();
-  }
-
-  void set_should_run_task() {
-    RTC_DCHECK(!run_task_);
-    run_task_ = true;
-  }
-
- private:
-  std::unique_ptr<QueuedTask> reply_;
-  bool run_task_ = false;
-};
-
-class TaskQueue::Impl::PostAndReplyTask : public QueuedTask {
- public:
-  PostAndReplyTask(std::unique_ptr<QueuedTask> task,
-                   std::unique_ptr<QueuedTask> reply,
-                   TaskQueue::Impl* reply_queue,
-                   int reply_pipe)
-      : task_(std::move(task)),
-        reply_pipe_(reply_pipe),
-        reply_task_owner_(
-            new RefCountedObject<ReplyTaskOwner>(std::move(reply))) {
-    reply_queue->PrepareReplyTask(reply_task_owner_);
-  }
-
-  ~PostAndReplyTask() override {
-    reply_task_owner_ = nullptr;
-    IgnoreSigPipeSignalOnCurrentThread();
-    // Send a signal to the reply queue that the reply task can run now.
-    // Depending on whether |set_should_run_task()| was called by the
-    // PostAndReplyTask(), the reply task may or may not actually run.
-    // In either case, it will be deleted.
-    char message = kRunReplyTask;
-    write(reply_pipe_, &message, sizeof(message));
-  }
-
- private:
-  bool Run() override {
-    if (!task_->Run())
-      task_.release();
-    reply_task_owner_->set_should_run_task();
-    return true;
-  }
-
-  std::unique_ptr<QueuedTask> task_;
-  int reply_pipe_;
-  scoped_refptr<RefCountedObject<ReplyTaskOwner>> reply_task_owner_;
-};
-
-class TaskQueue::Impl::SetTimerTask : public QueuedTask {
- public:
-  SetTimerTask(std::unique_ptr<QueuedTask> task, uint32_t milliseconds)
-      : task_(std::move(task)),
-        milliseconds_(milliseconds),
-        posted_(Time32()) {}
-
- private:
-  bool Run() override {
-    // Compensate for the time that has passed since construction
-    // and until we got here.
-    uint32_t post_time = Time32() - posted_;
-    TaskQueue::Impl::Current()->PostDelayedTask(
-        std::move(task_),
-        post_time > milliseconds_ ? 0 : milliseconds_ - post_time);
-    return true;
-  }
-
-  std::unique_ptr<QueuedTask> task_;
-  const uint32_t milliseconds_;
-  const uint32_t posted_;
-};
-
-TaskQueue::Impl::Impl(const char* queue_name,
-                      TaskQueue* queue,
-                      Priority priority /*= NORMAL*/)
-    : queue_(queue),
-      event_base_(event_base_new()),
-      wakeup_event_(new event()),
-      thread_(&TaskQueue::Impl::ThreadMain,
-              this,
-              queue_name,
-              TaskQueuePriorityToThreadPriority(priority)) {
-  RTC_DCHECK(queue_name);
-  int fds[2];
-  RTC_CHECK(pipe(fds) == 0);
-  SetNonBlocking(fds[0]);
-  SetNonBlocking(fds[1]);
-  wakeup_pipe_out_ = fds[0];
-  wakeup_pipe_in_ = fds[1];
-
-  EventAssign(wakeup_event_.get(), event_base_, wakeup_pipe_out_,
-              EV_READ | EV_PERSIST, OnWakeup, this);
-  event_add(wakeup_event_.get(), 0);
-  thread_.Start();
-}
-
-TaskQueue::Impl::~Impl() {
-  RTC_DCHECK(!IsCurrent());
-  struct timespec ts;
-  char message = kQuit;
-  while (write(wakeup_pipe_in_, &message, sizeof(message)) != sizeof(message)) {
-    // The queue is full, so we have no choice but to wait and retry.
-    RTC_CHECK_EQ(EAGAIN, errno);
-    ts.tv_sec = 0;
-    ts.tv_nsec = 1000000;
-    nanosleep(&ts, nullptr);
-  }
-
-  thread_.Stop();
-
-  event_del(wakeup_event_.get());
-
-  IgnoreSigPipeSignalOnCurrentThread();
-
-  close(wakeup_pipe_in_);
-  close(wakeup_pipe_out_);
-  wakeup_pipe_in_ = -1;
-  wakeup_pipe_out_ = -1;
-
-  event_base_free(event_base_);
-}
-
-// static
-TaskQueue::Impl* TaskQueue::Impl::Current() {
-  QueueContext* ctx =
-      static_cast<QueueContext*>(pthread_getspecific(GetQueuePtrTls()));
-  return ctx ? ctx->queue : nullptr;
-}
-
-// static
-TaskQueue* TaskQueue::Impl::CurrentQueue() {
-  TaskQueue::Impl* current = Current();
-  if (current) {
-    return current->queue_;
-  }
-  return nullptr;
-}
-
-bool TaskQueue::Impl::IsCurrent() const {
-  return IsThreadRefEqual(thread_.GetThreadRef(), CurrentThreadRef());
-}
-
-void TaskQueue::Impl::PostTask(std::unique_ptr<QueuedTask> task) {
-  RTC_DCHECK(task.get());
-  // libevent isn't thread safe.  This means that we can't use methods such
-  // as event_base_once to post tasks to the worker thread from a different
-  // thread.  However, we can use it when posting from the worker thread itself.
-  if (IsCurrent()) {
-    if (event_base_once(event_base_, -1, EV_TIMEOUT, &TaskQueue::Impl::RunTask,
-                        task.get(), nullptr) == 0) {
-      task.release();
-    }
-  } else {
-    QueuedTask* task_id = task.get();  // Only used for comparison.
-    {
-      CritScope lock(&pending_lock_);
-      pending_.push_back(std::move(task));
-    }
-    char message = kRunTask;
-    if (write(wakeup_pipe_in_, &message, sizeof(message)) != sizeof(message)) {
-      LOG(WARNING) << "Failed to queue task.";
-      CritScope lock(&pending_lock_);
-      pending_.remove_if([task_id](std::unique_ptr<QueuedTask>& t) {
-        return t.get() == task_id;
-      });
-    }
-  }
-}
-
-void TaskQueue::Impl::PostDelayedTask(std::unique_ptr<QueuedTask> task,
-                                      uint32_t milliseconds) {
-  if (IsCurrent()) {
-    TimerEvent* timer = new TimerEvent(std::move(task));
-    EventAssign(&timer->ev, event_base_, -1, 0, &TaskQueue::Impl::RunTimer,
-                timer);
-    QueueContext* ctx =
-        static_cast<QueueContext*>(pthread_getspecific(GetQueuePtrTls()));
-    ctx->pending_timers_.push_back(timer);
-    timeval tv = {rtc::dchecked_cast<int>(milliseconds / 1000),
-                  rtc::dchecked_cast<int>(milliseconds % 1000) * 1000};
-    event_add(&timer->ev, &tv);
-  } else {
-    PostTask(std::unique_ptr<QueuedTask>(
-        new SetTimerTask(std::move(task), milliseconds)));
-  }
-}
-
-void TaskQueue::Impl::PostTaskAndReply(std::unique_ptr<QueuedTask> task,
-                                       std::unique_ptr<QueuedTask> reply,
-                                       TaskQueue::Impl* reply_queue) {
-  std::unique_ptr<QueuedTask> wrapper_task(
-      new PostAndReplyTask(std::move(task), std::move(reply), reply_queue,
-                           reply_queue->wakeup_pipe_in_));
-  PostTask(std::move(wrapper_task));
-}
-
-// static
-void TaskQueue::Impl::ThreadMain(void* context) {
-  TaskQueue::Impl* me = static_cast<TaskQueue::Impl*>(context);
-
-  QueueContext queue_context(me);
-  pthread_setspecific(GetQueuePtrTls(), &queue_context);
-
-  while (queue_context.is_active)
-    event_base_loop(me->event_base_, 0);
-
-  pthread_setspecific(GetQueuePtrTls(), nullptr);
-
-  for (TimerEvent* timer : queue_context.pending_timers_)
-    delete timer;
-}
-
-// static
-void TaskQueue::Impl::OnWakeup(int socket,
-                               short flags,
-                               void* context) {  // NOLINT
-  QueueContext* ctx =
-      static_cast<QueueContext*>(pthread_getspecific(GetQueuePtrTls()));
-  RTC_DCHECK(ctx->queue->wakeup_pipe_out_ == socket);
-  char buf;
-  RTC_CHECK(sizeof(buf) == read(socket, &buf, sizeof(buf)));
-  switch (buf) {
-    case kQuit:
-      ctx->is_active = false;
-      event_base_loopbreak(ctx->queue->event_base_);
-      break;
-    case kRunTask: {
-      std::unique_ptr<QueuedTask> task;
-      {
-        CritScope lock(&ctx->queue->pending_lock_);
-        RTC_DCHECK(!ctx->queue->pending_.empty());
-        task = std::move(ctx->queue->pending_.front());
-        ctx->queue->pending_.pop_front();
-        RTC_DCHECK(task.get());
-      }
-      if (!task->Run())
-        task.release();
-      break;
-    }
-    case kRunReplyTask: {
-      scoped_refptr<ReplyTaskOwnerRef> reply_task;
-      {
-        CritScope lock(&ctx->queue->pending_lock_);
-        for (auto it = ctx->queue->pending_replies_.begin();
-             it != ctx->queue->pending_replies_.end(); ++it) {
-          if ((*it)->HasOneRef()) {
-            reply_task = std::move(*it);
-            ctx->queue->pending_replies_.erase(it);
-            break;
-          }
-        }
-      }
-      reply_task->Run();
-      break;
-    }
-    default:
-      RTC_NOTREACHED();
-      break;
-  }
-}
-
-// static
-void TaskQueue::Impl::RunTask(int fd, short flags, void* context) {  // NOLINT
-  auto* task = static_cast<QueuedTask*>(context);
-  if (task->Run())
-    delete task;
-}
-
-// static
-void TaskQueue::Impl::RunTimer(int fd, short flags, void* context) {  // NOLINT
-  TimerEvent* timer = static_cast<TimerEvent*>(context);
-  if (!timer->task->Run())
-    timer->task.release();
-  QueueContext* ctx =
-      static_cast<QueueContext*>(pthread_getspecific(GetQueuePtrTls()));
-  ctx->pending_timers_.remove(timer);
-  delete timer;
-}
-
-void TaskQueue::Impl::PrepareReplyTask(
-    scoped_refptr<ReplyTaskOwnerRef> reply_task) {
-  RTC_DCHECK(reply_task);
-  CritScope lock(&pending_lock_);
-  pending_replies_.push_back(std::move(reply_task));
-}
-
-TaskQueue::TaskQueue(const char* queue_name, Priority priority)
-    : impl_(new RefCountedObject<TaskQueue::Impl>(queue_name, this, priority)) {
-}
-
-TaskQueue::~TaskQueue() {}
-
-// static
-TaskQueue* TaskQueue::Current() {
-  return TaskQueue::Impl::CurrentQueue();
-}
-
-// Used for DCHECKing the current queue.
-bool TaskQueue::IsCurrent() const {
-  return impl_->IsCurrent();
-}
-
-void TaskQueue::PostTask(std::unique_ptr<QueuedTask> task) {
-  return TaskQueue::impl_->PostTask(std::move(task));
-}
-
-void TaskQueue::PostTaskAndReply(std::unique_ptr<QueuedTask> task,
-                                 std::unique_ptr<QueuedTask> reply,
-                                 TaskQueue* reply_queue) {
-  return TaskQueue::impl_->PostTaskAndReply(std::move(task), std::move(reply),
-                                            reply_queue->impl_.get());
-}
-
-void TaskQueue::PostTaskAndReply(std::unique_ptr<QueuedTask> task,
-                                 std::unique_ptr<QueuedTask> reply) {
-  return TaskQueue::impl_->PostTaskAndReply(std::move(task), std::move(reply),
-                                            impl_.get());
-}
-
-void TaskQueue::PostDelayedTask(std::unique_ptr<QueuedTask> task,
-                                uint32_t milliseconds) {
-  return TaskQueue::impl_->PostDelayedTask(std::move(task), milliseconds);
-}
-
-}  // namespace rtc
diff --git a/rtc_base/task_queue_posix.cc b/rtc_base/task_queue_posix.cc
deleted file mode 100644
index 89956f1..0000000
--- a/rtc_base/task_queue_posix.cc
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- *  Copyright 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/rtc_base/task_queue_posix.h"
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/task_queue.h"
-
-namespace rtc {
-namespace internal {
-pthread_key_t g_queue_ptr_tls = 0;
-
-void InitializeTls() {
-  RTC_CHECK(pthread_key_create(&g_queue_ptr_tls, nullptr) == 0);
-}
-
-pthread_key_t GetQueuePtrTls() {
-  static pthread_once_t init_once = PTHREAD_ONCE_INIT;
-  RTC_CHECK(pthread_once(&init_once, &InitializeTls) == 0);
-  return g_queue_ptr_tls;
-}
-
-AutoSetCurrentQueuePtr::AutoSetCurrentQueuePtr(TaskQueue* q)
-    : prev_(TaskQueue::Current()) {
-  pthread_setspecific(GetQueuePtrTls(), q);
-}
-
-AutoSetCurrentQueuePtr::~AutoSetCurrentQueuePtr() {
-  pthread_setspecific(GetQueuePtrTls(), prev_);
-}
-
-}  // namespace internal
-}  // namespace rtc
diff --git a/rtc_base/task_queue_posix.h b/rtc_base/task_queue_posix.h
deleted file mode 100644
index cab2009..0000000
--- a/rtc_base/task_queue_posix.h
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- *  Copyright 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_RTC_BASE_TASK_QUEUE_POSIX_H_
-#define WEBRTC_RTC_BASE_TASK_QUEUE_POSIX_H_
-
-#include <pthread.h>
-
-namespace rtc {
-
-class TaskQueue;
-
-namespace internal {
-
-class AutoSetCurrentQueuePtr {
- public:
-  explicit AutoSetCurrentQueuePtr(TaskQueue* q);
-  ~AutoSetCurrentQueuePtr();
-
- private:
-  TaskQueue* const prev_;
-};
-
-pthread_key_t GetQueuePtrTls();
-
-}  // namespace internal
-}  // namespace rtc
-
-#endif  // WEBRTC_RTC_BASE_TASK_QUEUE_POSIX_H_
diff --git a/rtc_base/task_queue_unittest.cc b/rtc_base/task_queue_unittest.cc
deleted file mode 100644
index 512c4ee..0000000
--- a/rtc_base/task_queue_unittest.cc
+++ /dev/null
@@ -1,329 +0,0 @@
-/*
- *  Copyright 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.
- */
-
-#if defined(WEBRTC_WIN)
-// clang-format off
-#include <windows.h>  // Must come first.
-#include <mmsystem.h>
-// clang-format on
-#endif
-
-#include <memory>
-#include <vector>
-
-#include "webrtc/rtc_base/bind.h"
-#include "webrtc/rtc_base/event.h"
-#include "webrtc/rtc_base/gunit.h"
-#include "webrtc/rtc_base/task_queue.h"
-#include "webrtc/rtc_base/timeutils.h"
-
-namespace rtc {
-namespace {
-// Noop on all platforms except Windows, where it turns on high precision
-// multimedia timers which increases the precision of TimeMillis() while in
-// scope.
-class EnableHighResTimers {
- public:
-#if !defined(WEBRTC_WIN)
-  EnableHighResTimers() {}
-#else
-  EnableHighResTimers() : enabled_(timeBeginPeriod(1) == TIMERR_NOERROR) {}
-  ~EnableHighResTimers() {
-    if (enabled_)
-      timeEndPeriod(1);
-  }
-
- private:
-  const bool enabled_;
-#endif
-};
-}
-
-namespace {
-void CheckCurrent(Event* signal, TaskQueue* queue) {
-  EXPECT_TRUE(queue->IsCurrent());
-  if (signal)
-    signal->Set();
-}
-
-}  // namespace
-
-TEST(TaskQueueTest, Construct) {
-  static const char kQueueName[] = "Construct";
-  TaskQueue queue(kQueueName);
-  EXPECT_FALSE(queue.IsCurrent());
-}
-
-TEST(TaskQueueTest, PostAndCheckCurrent) {
-  static const char kQueueName[] = "PostAndCheckCurrent";
-  Event event(false, false);
-  TaskQueue queue(kQueueName);
-
-  // We're not running a task, so there shouldn't be a current queue.
-  EXPECT_FALSE(queue.IsCurrent());
-  EXPECT_FALSE(TaskQueue::Current());
-
-  queue.PostTask(Bind(&CheckCurrent, &event, &queue));
-  EXPECT_TRUE(event.Wait(1000));
-}
-
-TEST(TaskQueueTest, PostCustomTask) {
-  static const char kQueueName[] = "PostCustomImplementation";
-  Event event(false, false);
-  TaskQueue queue(kQueueName);
-
-  class CustomTask : public QueuedTask {
-   public:
-    explicit CustomTask(Event* event) : event_(event) {}
-
-   private:
-    bool Run() override {
-      event_->Set();
-      return false;  // Never allows the task to be deleted by the queue.
-    }
-
-    Event* const event_;
-  } my_task(&event);
-
-  // Please don't do this in production code! :)
-  queue.PostTask(std::unique_ptr<QueuedTask>(&my_task));
-  EXPECT_TRUE(event.Wait(1000));
-}
-
-TEST(TaskQueueTest, PostLambda) {
-  static const char kQueueName[] = "PostLambda";
-  Event event(false, false);
-  TaskQueue queue(kQueueName);
-
-  queue.PostTask([&event]() { event.Set(); });
-  EXPECT_TRUE(event.Wait(1000));
-}
-
-TEST(TaskQueueTest, PostDelayedZero) {
-  static const char kQueueName[] = "PostDelayedZero";
-  Event event(false, false);
-  TaskQueue queue(kQueueName);
-
-  queue.PostDelayedTask([&event]() { event.Set(); }, 0);
-  EXPECT_TRUE(event.Wait(1000));
-}
-
-TEST(TaskQueueTest, PostFromQueue) {
-  static const char kQueueName[] = "PostFromQueue";
-  Event event(false, false);
-  TaskQueue queue(kQueueName);
-
-  queue.PostTask(
-      [&event, &queue]() { queue.PostTask([&event]() { event.Set(); }); });
-  EXPECT_TRUE(event.Wait(1000));
-}
-
-TEST(TaskQueueTest, PostDelayed) {
-  static const char kQueueName[] = "PostDelayed";
-  Event event(false, false);
-  TaskQueue queue(kQueueName, TaskQueue::Priority::HIGH);
-
-  uint32_t start = Time();
-  queue.PostDelayedTask(Bind(&CheckCurrent, &event, &queue), 100);
-  EXPECT_TRUE(event.Wait(1000));
-  uint32_t end = Time();
-  // These tests are a little relaxed due to how "powerful" our test bots can
-  // be.  Most recently we've seen windows bots fire the callback after 94-99ms,
-  // which is why we have a little bit of leeway backwards as well.
-  EXPECT_GE(end - start, 90u);
-  EXPECT_NEAR(end - start, 190u, 100u);  // Accept 90-290.
-}
-
-// This task needs to be run manually due to the slowness of some of our bots.
-// TODO(tommi): Can we run this on the perf bots?
-TEST(TaskQueueTest, DISABLED_PostDelayedHighRes) {
-  EnableHighResTimers high_res_scope;
-
-  static const char kQueueName[] = "PostDelayedHighRes";
-  Event event(false, false);
-  TaskQueue queue(kQueueName, TaskQueue::Priority::HIGH);
-
-  uint32_t start = Time();
-  queue.PostDelayedTask(Bind(&CheckCurrent, &event, &queue), 3);
-  EXPECT_TRUE(event.Wait(1000));
-  uint32_t end = TimeMillis();
-  // These tests are a little relaxed due to how "powerful" our test bots can
-  // be.  Most recently we've seen windows bots fire the callback after 94-99ms,
-  // which is why we have a little bit of leeway backwards as well.
-  EXPECT_GE(end - start, 3u);
-  EXPECT_NEAR(end - start, 3, 3u);
-}
-
-TEST(TaskQueueTest, PostMultipleDelayed) {
-  static const char kQueueName[] = "PostMultipleDelayed";
-  TaskQueue queue(kQueueName);
-
-  std::vector<std::unique_ptr<Event>> events;
-  for (int i = 0; i < 100; ++i) {
-    events.push_back(std::unique_ptr<Event>(new Event(false, false)));
-    queue.PostDelayedTask(
-        Bind(&CheckCurrent, events.back().get(), &queue), i);
-  }
-
-  for (const auto& e : events)
-    EXPECT_TRUE(e->Wait(1000));
-}
-
-TEST(TaskQueueTest, PostDelayedAfterDestruct) {
-  static const char kQueueName[] = "PostDelayedAfterDestruct";
-  Event event(false, false);
-  {
-    TaskQueue queue(kQueueName);
-    queue.PostDelayedTask(Bind(&CheckCurrent, &event, &queue), 100);
-  }
-  EXPECT_FALSE(event.Wait(200));  // Task should not run.
-}
-
-TEST(TaskQueueTest, PostAndReply) {
-  static const char kPostQueue[] = "PostQueue";
-  static const char kReplyQueue[] = "ReplyQueue";
-  Event event(false, false);
-  TaskQueue post_queue(kPostQueue);
-  TaskQueue reply_queue(kReplyQueue);
-
-  post_queue.PostTaskAndReply(
-      Bind(&CheckCurrent, nullptr, &post_queue),
-      Bind(&CheckCurrent, &event, &reply_queue), &reply_queue);
-  EXPECT_TRUE(event.Wait(1000));
-}
-
-TEST(TaskQueueTest, PostAndReuse) {
-  static const char kPostQueue[] = "PostQueue";
-  static const char kReplyQueue[] = "ReplyQueue";
-  Event event(false, false);
-  TaskQueue post_queue(kPostQueue);
-  TaskQueue reply_queue(kReplyQueue);
-
-  int call_count = 0;
-
-  class ReusedTask : public QueuedTask {
-   public:
-    ReusedTask(int* counter, TaskQueue* reply_queue, Event* event)
-        : counter_(counter), reply_queue_(reply_queue), event_(event) {
-      EXPECT_EQ(0, *counter_);
-    }
-
-   private:
-    bool Run() override {
-      if (++(*counter_) == 1) {
-        std::unique_ptr<QueuedTask> myself(this);
-        reply_queue_->PostTask(std::move(myself));
-        // At this point, the object is owned by reply_queue_ and it's
-        // theoratically possible that the object has been deleted (e.g. if
-        // posting wasn't possible).  So, don't touch any member variables here.
-
-        // Indicate to the current queue that ownership has been transferred.
-        return false;
-      } else {
-        EXPECT_EQ(2, *counter_);
-        EXPECT_TRUE(reply_queue_->IsCurrent());
-        event_->Set();
-        return true;  // Indicate that the object should be deleted.
-      }
-    }
-
-    int* const counter_;
-    TaskQueue* const reply_queue_;
-    Event* const event_;
-  };
-
-  std::unique_ptr<QueuedTask> task(
-      new ReusedTask(&call_count, &reply_queue, &event));
-
-  post_queue.PostTask(std::move(task));
-  EXPECT_TRUE(event.Wait(1000));
-}
-
-TEST(TaskQueueTest, PostAndReplyLambda) {
-  static const char kPostQueue[] = "PostQueue";
-  static const char kReplyQueue[] = "ReplyQueue";
-  Event event(false, false);
-  TaskQueue post_queue(kPostQueue);
-  TaskQueue reply_queue(kReplyQueue);
-
-  bool my_flag = false;
-  post_queue.PostTaskAndReply([&my_flag]() { my_flag = true; },
-                              [&event]() { event.Set(); }, &reply_queue);
-  EXPECT_TRUE(event.Wait(1000));
-  EXPECT_TRUE(my_flag);
-}
-
-// This test covers a particular bug that we had in the libevent implementation
-// where we could hit a deadlock while trying to post a reply task to a queue
-// that was being deleted.  The test isn't guaranteed to hit that case but it's
-// written in a way that makes it likely and by running with --gtest_repeat=1000
-// the bug would occur. Alas, now it should be fixed.
-TEST(TaskQueueTest, PostAndReplyDeadlock) {
-  Event event(false, false);
-  TaskQueue post_queue("PostQueue");
-  TaskQueue reply_queue("ReplyQueue");
-
-  post_queue.PostTaskAndReply([&event]() { event.Set(); }, []() {},
-                              &reply_queue);
-  EXPECT_TRUE(event.Wait(1000));
-}
-
-void TestPostTaskAndReply(TaskQueue* work_queue,
-                          Event* event) {
-  ASSERT_FALSE(work_queue->IsCurrent());
-  work_queue->PostTaskAndReply(
-      Bind(&CheckCurrent, nullptr, work_queue),
-      NewClosure([event]() { event->Set(); }));
-}
-
-// Does a PostTaskAndReply from within a task to post and reply to the current
-// queue.  All in all there will be 3 tasks posted and run.
-TEST(TaskQueueTest, PostAndReply2) {
-  static const char kQueueName[] = "PostAndReply2";
-  static const char kWorkQueueName[] = "PostAndReply2_Worker";
-  Event event(false, false);
-  TaskQueue queue(kQueueName);
-  TaskQueue work_queue(kWorkQueueName);
-
-  queue.PostTask(
-      Bind(&TestPostTaskAndReply, &work_queue, &event));
-  EXPECT_TRUE(event.Wait(1000));
-}
-
-// Tests posting more messages than a queue can queue up.
-// In situations like that, tasks will get dropped.
-TEST(TaskQueueTest, PostALot) {
-  // To destruct the event after the queue has gone out of scope.
-  Event event(false, false);
-
-  int tasks_executed = 0;
-  int tasks_cleaned_up = 0;
-  static const int kTaskCount = 0xffff;
-
-  {
-    static const char kQueueName[] = "PostALot";
-    TaskQueue queue(kQueueName);
-
-    // On linux, the limit of pending bytes in the pipe buffer is 0xffff.
-    // So here we post a total of 0xffff+1 messages, which triggers a failure
-    // case inside of the libevent queue implementation.
-
-    queue.PostTask([&event]() { event.Wait(Event::kForever); });
-    for (int i = 0; i < kTaskCount; ++i)
-      queue.PostTask(NewClosure([&tasks_executed]() { ++tasks_executed; },
-                                [&tasks_cleaned_up]() { ++tasks_cleaned_up; }));
-    event.Set();  // Unblock the first task.
-  }
-
-  EXPECT_GE(tasks_cleaned_up, tasks_executed);
-  EXPECT_EQ(kTaskCount, tasks_cleaned_up);
-}
-
-}  // namespace rtc
diff --git a/rtc_base/task_queue_win.cc b/rtc_base/task_queue_win.cc
deleted file mode 100644
index 6ff64c0..0000000
--- a/rtc_base/task_queue_win.cc
+++ /dev/null
@@ -1,507 +0,0 @@
-/*
- *  Copyright 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/rtc_base/task_queue.h"
-
-#include <mmsystem.h>
-#include <string.h>
-
-#include <algorithm>
-#include <queue>
-
-#include "webrtc/rtc_base/arraysize.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/event.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/platform_thread.h"
-#include "webrtc/rtc_base/refcount.h"
-#include "webrtc/rtc_base/refcountedobject.h"
-#include "webrtc/rtc_base/safe_conversions.h"
-#include "webrtc/rtc_base/timeutils.h"
-
-namespace rtc {
-namespace {
-#define WM_RUN_TASK WM_USER + 1
-#define WM_QUEUE_DELAYED_TASK WM_USER + 2
-
-using Priority = TaskQueue::Priority;
-
-DWORD g_queue_ptr_tls = 0;
-
-BOOL CALLBACK InitializeTls(PINIT_ONCE init_once, void* param, void** context) {
-  g_queue_ptr_tls = TlsAlloc();
-  return TRUE;
-}
-
-DWORD GetQueuePtrTls() {
-  static INIT_ONCE init_once = INIT_ONCE_STATIC_INIT;
-  ::InitOnceExecuteOnce(&init_once, InitializeTls, nullptr, nullptr);
-  return g_queue_ptr_tls;
-}
-
-struct ThreadStartupData {
-  Event* started;
-  void* thread_context;
-};
-
-void CALLBACK InitializeQueueThread(ULONG_PTR param) {
-  MSG msg;
-  ::PeekMessage(&msg, nullptr, WM_USER, WM_USER, PM_NOREMOVE);
-  ThreadStartupData* data = reinterpret_cast<ThreadStartupData*>(param);
-  ::TlsSetValue(GetQueuePtrTls(), data->thread_context);
-  data->started->Set();
-}
-
-ThreadPriority TaskQueuePriorityToThreadPriority(Priority priority) {
-  switch (priority) {
-    case Priority::HIGH:
-      return kRealtimePriority;
-    case Priority::LOW:
-      return kLowPriority;
-    case Priority::NORMAL:
-      return kNormalPriority;
-    default:
-      RTC_NOTREACHED();
-      break;
-  }
-  return kNormalPriority;
-}
-
-int64_t GetTick() {
-  static const UINT kPeriod = 1;
-  bool high_res = (timeBeginPeriod(kPeriod) == TIMERR_NOERROR);
-  int64_t ret = TimeMillis();
-  if (high_res)
-    timeEndPeriod(kPeriod);
-  return ret;
-}
-
-class DelayedTaskInfo {
- public:
-  // Default ctor needed to support priority_queue::pop().
-  DelayedTaskInfo() {}
-  DelayedTaskInfo(uint32_t milliseconds, std::unique_ptr<QueuedTask> task)
-      : due_time_(GetTick() + milliseconds), task_(std::move(task)) {}
-  DelayedTaskInfo(DelayedTaskInfo&&) = default;
-
-  // Implement for priority_queue.
-  bool operator>(const DelayedTaskInfo& other) const {
-    return due_time_ > other.due_time_;
-  }
-
-  // Required by priority_queue::pop().
-  DelayedTaskInfo& operator=(DelayedTaskInfo&& other) = default;
-
-  // See below for why this method is const.
-  void Run() const {
-    RTC_DCHECK(due_time_);
-    task_->Run() ? task_.reset() : static_cast<void>(task_.release());
-  }
-
-  int64_t due_time() const { return due_time_; }
-
- private:
-  int64_t due_time_ = 0;  // Absolute timestamp in milliseconds.
-
-  // |task| needs to be mutable because std::priority_queue::top() returns
-  // a const reference and a key in an ordered queue must not be changed.
-  // There are two basic workarounds, one using const_cast, which would also
-  // make the key (|due_time|), non-const and the other is to make the non-key
-  // (|task|), mutable.
-  // Because of this, the |task| variable is made private and can only be
-  // mutated by calling the |Run()| method.
-  mutable std::unique_ptr<QueuedTask> task_;
-};
-
-class MultimediaTimer {
- public:
-  // Note: We create an event that requires manual reset.
-  MultimediaTimer() : event_(::CreateEvent(nullptr, true, false, nullptr)) {}
-
-  ~MultimediaTimer() {
-    Cancel();
-    ::CloseHandle(event_);
-  }
-
-  bool StartOneShotTimer(UINT delay_ms) {
-    RTC_DCHECK_EQ(0, timer_id_);
-    RTC_DCHECK(event_ != nullptr);
-    timer_id_ =
-        ::timeSetEvent(delay_ms, 0, reinterpret_cast<LPTIMECALLBACK>(event_), 0,
-                       TIME_ONESHOT | TIME_CALLBACK_EVENT_SET);
-    return timer_id_ != 0;
-  }
-
-  void Cancel() {
-    ::ResetEvent(event_);
-    if (timer_id_) {
-      ::timeKillEvent(timer_id_);
-      timer_id_ = 0;
-    }
-  }
-
-  HANDLE* event_for_wait() { return &event_; }
-
- private:
-  HANDLE event_ = nullptr;
-  MMRESULT timer_id_ = 0;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(MultimediaTimer);
-};
-
-}  // namespace
-
-class TaskQueue::Impl : public RefCountInterface {
- public:
-  Impl(const char* queue_name, TaskQueue* queue, Priority priority);
-  ~Impl() override;
-
-  static TaskQueue::Impl* Current();
-  static TaskQueue* CurrentQueue();
-
-  // Used for DCHECKing the current queue.
-  bool IsCurrent() const;
-
-  template <class Closure,
-            typename std::enable_if<
-                std::is_copy_constructible<Closure>::value>::type* = nullptr>
-  void PostTask(const Closure& closure) {
-    PostTask(std::unique_ptr<QueuedTask>(new ClosureTask<Closure>(closure)));
-  }
-
-  void PostTask(std::unique_ptr<QueuedTask> task);
-  void PostTaskAndReply(std::unique_ptr<QueuedTask> task,
-                        std::unique_ptr<QueuedTask> reply,
-                        TaskQueue::Impl* reply_queue);
-
-  void PostDelayedTask(std::unique_ptr<QueuedTask> task, uint32_t milliseconds);
-
-  void RunPendingTasks();
-
- private:
-  static void ThreadMain(void* context);
-
-  class WorkerThread : public PlatformThread {
-   public:
-    WorkerThread(ThreadRunFunction func,
-                 void* obj,
-                 const char* thread_name,
-                 ThreadPriority priority)
-        : PlatformThread(func, obj, thread_name, priority) {}
-
-    bool QueueAPC(PAPCFUNC apc_function, ULONG_PTR data) {
-      return PlatformThread::QueueAPC(apc_function, data);
-    }
-  };
-
-  class ThreadState {
-   public:
-    explicit ThreadState(HANDLE in_queue) : in_queue_(in_queue) {}
-    ~ThreadState() {}
-
-    void RunThreadMain();
-
-   private:
-    bool ProcessQueuedMessages();
-    void RunDueTasks();
-    void ScheduleNextTimer();
-    void CancelTimers();
-
-    // Since priority_queue<> by defult orders items in terms of
-    // largest->smallest, using std::less<>, and we want smallest->largest,
-    // we would like to use std::greater<> here. Alas it's only available in
-    // C++14 and later, so we roll our own compare template that that relies on
-    // operator<().
-    template <typename T>
-    struct greater {
-      bool operator()(const T& l, const T& r) { return l > r; }
-    };
-
-    MultimediaTimer timer_;
-    std::priority_queue<DelayedTaskInfo,
-                        std::vector<DelayedTaskInfo>,
-                        greater<DelayedTaskInfo>>
-        timer_tasks_;
-    UINT_PTR timer_id_ = 0;
-    HANDLE in_queue_;
-  };
-
-  TaskQueue* const queue_;
-  WorkerThread thread_;
-  rtc::CriticalSection pending_lock_;
-  std::queue<std::unique_ptr<QueuedTask>> pending_
-      RTC_GUARDED_BY(pending_lock_);
-  HANDLE in_queue_;
-};
-
-TaskQueue::Impl::Impl(const char* queue_name,
-                      TaskQueue* queue,
-                      Priority priority)
-    : queue_(queue),
-      thread_(&TaskQueue::Impl::ThreadMain,
-              this,
-              queue_name,
-              TaskQueuePriorityToThreadPriority(priority)),
-      in_queue_(::CreateEvent(nullptr, true, false, nullptr)) {
-  RTC_DCHECK(queue_name);
-  RTC_DCHECK(in_queue_);
-  thread_.Start();
-  Event event(false, false);
-  ThreadStartupData startup = {&event, this};
-  RTC_CHECK(thread_.QueueAPC(&InitializeQueueThread,
-                             reinterpret_cast<ULONG_PTR>(&startup)));
-  event.Wait(Event::kForever);
-}
-
-TaskQueue::Impl::~Impl() {
-  RTC_DCHECK(!IsCurrent());
-  while (!::PostThreadMessage(thread_.GetThreadRef(), WM_QUIT, 0, 0)) {
-    RTC_CHECK_EQ(ERROR_NOT_ENOUGH_QUOTA, ::GetLastError());
-    Sleep(1);
-  }
-  thread_.Stop();
-  ::CloseHandle(in_queue_);
-}
-
-// static
-TaskQueue::Impl* TaskQueue::Impl::Current() {
-  return static_cast<TaskQueue::Impl*>(::TlsGetValue(GetQueuePtrTls()));
-}
-
-// static
-TaskQueue* TaskQueue::Impl::CurrentQueue() {
-  TaskQueue::Impl* current = Current();
-  return current ? current->queue_ : nullptr;
-}
-
-bool TaskQueue::Impl::IsCurrent() const {
-  return IsThreadRefEqual(thread_.GetThreadRef(), CurrentThreadRef());
-}
-
-void TaskQueue::Impl::PostTask(std::unique_ptr<QueuedTask> task) {
-  rtc::CritScope lock(&pending_lock_);
-  pending_.push(std::move(task));
-  ::SetEvent(in_queue_);
-}
-
-void TaskQueue::Impl::PostDelayedTask(std::unique_ptr<QueuedTask> task,
-                                      uint32_t milliseconds) {
-  if (!milliseconds) {
-    PostTask(std::move(task));
-    return;
-  }
-
-  // TODO(tommi): Avoid this allocation.  It is currently here since
-  // the timestamp stored in the task info object, is a 64bit timestamp
-  // and WPARAM is 32bits in 32bit builds.  Otherwise, we could pass the
-  // task pointer and timestamp as LPARAM and WPARAM.
-  auto* task_info = new DelayedTaskInfo(milliseconds, std::move(task));
-  if (!::PostThreadMessage(thread_.GetThreadRef(), WM_QUEUE_DELAYED_TASK, 0,
-                           reinterpret_cast<LPARAM>(task_info))) {
-    delete task_info;
-  }
-}
-
-void TaskQueue::Impl::PostTaskAndReply(std::unique_ptr<QueuedTask> task,
-                                       std::unique_ptr<QueuedTask> reply,
-                                       TaskQueue::Impl* reply_queue) {
-  QueuedTask* task_ptr = task.release();
-  QueuedTask* reply_task_ptr = reply.release();
-  DWORD reply_thread_id = reply_queue->thread_.GetThreadRef();
-  PostTask([task_ptr, reply_task_ptr, reply_thread_id]() {
-    if (task_ptr->Run())
-      delete task_ptr;
-    // If the thread's message queue is full, we can't queue the task and will
-    // have to drop it (i.e. delete).
-    if (!::PostThreadMessage(reply_thread_id, WM_RUN_TASK, 0,
-                             reinterpret_cast<LPARAM>(reply_task_ptr))) {
-      delete reply_task_ptr;
-    }
-  });
-}
-
-void TaskQueue::Impl::RunPendingTasks() {
-  while (true) {
-    std::unique_ptr<QueuedTask> task;
-    {
-      rtc::CritScope lock(&pending_lock_);
-      if (pending_.empty())
-        break;
-      task = std::move(pending_.front());
-      pending_.pop();
-    }
-
-    if (!task->Run())
-      task.release();
-  }
-}
-
-// static
-void TaskQueue::Impl::ThreadMain(void* context) {
-  ThreadState state(static_cast<TaskQueue::Impl*>(context)->in_queue_);
-  state.RunThreadMain();
-}
-
-void TaskQueue::Impl::ThreadState::RunThreadMain() {
-  HANDLE handles[2] = { *timer_.event_for_wait(), in_queue_ };
-  while (true) {
-    // Make sure we do an alertable wait as that's required to allow APCs to run
-    // (e.g. required for InitializeQueueThread and stopping the thread in
-    // PlatformThread).
-    DWORD result = ::MsgWaitForMultipleObjectsEx(
-        arraysize(handles), handles, INFINITE, QS_ALLEVENTS, MWMO_ALERTABLE);
-    RTC_CHECK_NE(WAIT_FAILED, result);
-    if (result == (WAIT_OBJECT_0 + 2)) {
-      // There are messages in the message queue that need to be handled.
-      if (!ProcessQueuedMessages())
-        break;
-    }
-
-    if (result == WAIT_OBJECT_0 || (!timer_tasks_.empty() &&
-        ::WaitForSingleObject(*timer_.event_for_wait(), 0) == WAIT_OBJECT_0)) {
-      // The multimedia timer was signaled.
-      timer_.Cancel();
-      RunDueTasks();
-      ScheduleNextTimer();
-    }
-
-    if (result == (WAIT_OBJECT_0 + 1)) {
-      ::ResetEvent(in_queue_);
-      TaskQueue::Impl::Current()->RunPendingTasks();
-    }
-  }
-}
-
-bool TaskQueue::Impl::ThreadState::ProcessQueuedMessages() {
-  MSG msg = {};
-  // To protect against overly busy message queues, we limit the time
-  // we process tasks to a few milliseconds. If we don't do that, there's
-  // a chance that timer tasks won't ever run.
-  static const int kMaxTaskProcessingTimeMs = 500;
-  auto start = GetTick();
-  while (::PeekMessage(&msg, nullptr, 0, 0, PM_REMOVE) &&
-         msg.message != WM_QUIT) {
-    if (!msg.hwnd) {
-      switch (msg.message) {
-        // TODO(tommi): Stop using this way of queueing tasks.
-        case WM_RUN_TASK: {
-          QueuedTask* task = reinterpret_cast<QueuedTask*>(msg.lParam);
-          if (task->Run())
-            delete task;
-          break;
-        }
-        case WM_QUEUE_DELAYED_TASK: {
-          std::unique_ptr<DelayedTaskInfo> info(
-              reinterpret_cast<DelayedTaskInfo*>(msg.lParam));
-          bool need_to_schedule_timers =
-              timer_tasks_.empty() ||
-              timer_tasks_.top().due_time() > info->due_time();
-          timer_tasks_.emplace(std::move(*info.get()));
-          if (need_to_schedule_timers) {
-            CancelTimers();
-            ScheduleNextTimer();
-          }
-          break;
-        }
-        case WM_TIMER: {
-          RTC_DCHECK_EQ(timer_id_, msg.wParam);
-          ::KillTimer(nullptr, msg.wParam);
-          timer_id_ = 0;
-          RunDueTasks();
-          ScheduleNextTimer();
-          break;
-        }
-        default:
-          RTC_NOTREACHED();
-          break;
-      }
-    } else {
-      ::TranslateMessage(&msg);
-      ::DispatchMessage(&msg);
-    }
-
-    if (GetTick() > start + kMaxTaskProcessingTimeMs)
-      break;
-  }
-  return msg.message != WM_QUIT;
-}
-
-void TaskQueue::Impl::ThreadState::RunDueTasks() {
-  RTC_DCHECK(!timer_tasks_.empty());
-  auto now = GetTick();
-  do {
-    const auto& top = timer_tasks_.top();
-    if (top.due_time() > now)
-      break;
-    top.Run();
-    timer_tasks_.pop();
-  } while (!timer_tasks_.empty());
-}
-
-void TaskQueue::Impl::ThreadState::ScheduleNextTimer() {
-  RTC_DCHECK_EQ(timer_id_, 0);
-  if (timer_tasks_.empty())
-    return;
-
-  const auto& next_task = timer_tasks_.top();
-  int64_t delay_ms = std::max(0ll, next_task.due_time() - GetTick());
-  uint32_t milliseconds = rtc::dchecked_cast<uint32_t>(delay_ms);
-  if (!timer_.StartOneShotTimer(milliseconds))
-    timer_id_ = ::SetTimer(nullptr, 0, milliseconds, nullptr);
-}
-
-void TaskQueue::Impl::ThreadState::CancelTimers() {
-  timer_.Cancel();
-  if (timer_id_) {
-    ::KillTimer(nullptr, timer_id_);
-    timer_id_ = 0;
-  }
-}
-
-// Boilerplate for the PIMPL pattern.
-TaskQueue::TaskQueue(const char* queue_name, Priority priority)
-    : impl_(new RefCountedObject<TaskQueue::Impl>(queue_name, this, priority)) {
-}
-
-TaskQueue::~TaskQueue() {}
-
-// static
-TaskQueue* TaskQueue::Current() {
-  return TaskQueue::Impl::CurrentQueue();
-}
-
-// Used for DCHECKing the current queue.
-bool TaskQueue::IsCurrent() const {
-  return impl_->IsCurrent();
-}
-
-void TaskQueue::PostTask(std::unique_ptr<QueuedTask> task) {
-  return TaskQueue::impl_->PostTask(std::move(task));
-}
-
-void TaskQueue::PostTaskAndReply(std::unique_ptr<QueuedTask> task,
-                                 std::unique_ptr<QueuedTask> reply,
-                                 TaskQueue* reply_queue) {
-  return TaskQueue::impl_->PostTaskAndReply(std::move(task), std::move(reply),
-                                            reply_queue->impl_.get());
-}
-
-void TaskQueue::PostTaskAndReply(std::unique_ptr<QueuedTask> task,
-                                 std::unique_ptr<QueuedTask> reply) {
-  return TaskQueue::impl_->PostTaskAndReply(std::move(task), std::move(reply),
-                                            impl_.get());
-}
-
-void TaskQueue::PostDelayedTask(std::unique_ptr<QueuedTask> task,
-                                uint32_t milliseconds) {
-  return TaskQueue::impl_->PostDelayedTask(std::move(task), milliseconds);
-}
-
-}  // namespace rtc
diff --git a/rtc_base/template_util.h b/rtc_base/template_util.h
deleted file mode 100644
index acadc9d..0000000
--- a/rtc_base/template_util.h
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- *  Copyright (c) 2013 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.
- */
-
-// Borrowed from Chromium's src/base/template_util.h.
-
-#ifndef WEBRTC_RTC_BASE_TEMPLATE_UTIL_H_
-#define WEBRTC_RTC_BASE_TEMPLATE_UTIL_H_
-
-#include <stddef.h>  // For size_t.
-
-namespace rtc {
-
-// Template definitions from tr1.
-
-template<class T, T v>
-struct integral_constant {
-  static const T value = v;
-  typedef T value_type;
-  typedef integral_constant<T, v> type;
-};
-
-template <class T, T v> const T integral_constant<T, v>::value;
-
-typedef integral_constant<bool, true> true_type;
-typedef integral_constant<bool, false> false_type;
-
-template <class T> struct is_pointer : false_type {};
-template <class T> struct is_pointer<T*> : true_type {};
-
-template <class T, class U> struct is_same : public false_type {};
-template <class T> struct is_same<T, T> : true_type {};
-
-template<class> struct is_array : public false_type {};
-template<class T, size_t n> struct is_array<T[n]> : public true_type {};
-template<class T> struct is_array<T[]> : public true_type {};
-
-template <class T> struct is_non_const_reference : false_type {};
-template <class T> struct is_non_const_reference<T&> : true_type {};
-template <class T> struct is_non_const_reference<const T&> : false_type {};
-
-template <class T> struct is_void : false_type {};
-template <> struct is_void<void> : true_type {};
-
-// Helper useful for converting a tuple to variadic template function
-// arguments.
-//
-// sequence_generator<3>::type will be sequence<0, 1, 2>.
-template <int...>
-struct sequence {};
-template <int N, int... S>
-struct sequence_generator : sequence_generator<N - 1, N - 1, S...> {};
-template <int... S>
-struct sequence_generator<0, S...> {
-  typedef sequence<S...> type;
-};
-
-namespace internal {
-
-// Types YesType and NoType are guaranteed such that sizeof(YesType) <
-// sizeof(NoType).
-typedef char YesType;
-
-struct NoType {
-  YesType dummy[2];
-};
-
-// This class is an implementation detail for is_convertible, and you
-// don't need to know how it works to use is_convertible. For those
-// who care: we declare two different functions, one whose argument is
-// of type To and one with a variadic argument list. We give them
-// return types of different size, so we can use sizeof to trick the
-// compiler into telling us which function it would have chosen if we
-// had called it with an argument of type From.  See Alexandrescu's
-// _Modern C++ Design_ for more details on this sort of trick.
-
-struct ConvertHelper {
-  template <typename To>
-  static YesType Test(To);
-
-  template <typename To>
-  static NoType Test(...);
-
-  template <typename From>
-  static From& Create();
-};
-
-// Used to determine if a type is a struct/union/class. Inspired by Boost's
-// is_class type_trait implementation.
-struct IsClassHelper {
-  template <typename C>
-  static YesType Test(void(C::*)(void));
-
-  template <typename C>
-  static NoType Test(...);
-};
-
-}  // namespace internal
-
-// Inherits from true_type if From is convertible to To, false_type otherwise.
-//
-// Note that if the type is convertible, this will be a true_type REGARDLESS
-// of whether or not the conversion would emit a warning.
-template <typename From, typename To>
-struct is_convertible
-    : integral_constant<bool,
-                        sizeof(internal::ConvertHelper::Test<To>(
-                                   internal::ConvertHelper::Create<From>())) ==
-                        sizeof(internal::YesType)> {
-};
-
-template <typename T>
-struct is_class
-    : integral_constant<bool,
-                        sizeof(internal::IsClassHelper::Test<T>(0)) ==
-                            sizeof(internal::YesType)> {
-};
-
-}  // namespace rtc
-
-#endif  // WEBRTC_RTC_BASE_TEMPLATE_UTIL_H_
diff --git a/rtc_base/testbase64.h b/rtc_base/testbase64.h
deleted file mode 100644
index f8e7ac1..0000000
--- a/rtc_base/testbase64.h
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- *  Copyright 2004 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_RTC_BASE_TESTBASE64_H_
-#define WEBRTC_RTC_BASE_TESTBASE64_H_
-
-/* This file was generated by googleclient/talk/binary2header.sh */
-
-static unsigned char testbase64[] = {
-0xff, 0xd8, 0xff, 0xe0, 0x00, 0x10, 0x4a, 0x46, 0x49, 0x46, 0x00, 0x01, 0x02, 0x01, 0x00, 0x48, 0x00, 0x48, 0x00, 0x00, 0xff, 0xe1, 0x0d, 0x07, 0x45, 0x78, 0x69, 0x66, 0x00, 0x00, 0x4d, 0x4d, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0c, 0x01, 0x0e, 0x00, 0x02, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x9e, 0x01, 0x0f, 0x00, 0x02, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0xbe, 0x01, 0x10, 0x00, 0x02, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0xc3, 0x01, 0x12, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x01, 0x1a, 0x00, 0x05, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xcc, 0x01, 0x1b, 0x00, 0x05, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xd4, 0x01, 0x28, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x01, 0x31, 0x00, 0x02, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0xdc, 0x01, 0x32, 0x00, 0x02, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0xf0, 0x01, 0x3c, 0x00, 0x02, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x01, 0x04, 0x02, 0x13, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x87, 0x69, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x01, 0x14, 0x00, 0x00, 0x02, 0xc4, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x53, 0x4f, 0x4e, 0x59, 0x00, 0x44, 0x53, 0x43, 0x2d, 0x50, 0x32, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x01, 0x41, 0x64, 0x6f, 0x62, 0x65, 0x20, 0x50, 0x68, 0x6f, 0x74, 0x6f, 0x73, 0x68, 0x6f, 0x70, 0x20, 0x37, 0x2e, 0x30, 0x00, 0x32, 0x30, 0x30, 0x37, 0x3a, 0x30, 0x31, 0x3a, 0x33, 0x30, 0x20, 0x32, 0x33, 0x3a, 0x31, 0x30, 0x3a, 0x30, 0x34, 0x00, 0x4d, 0x61, 0x63, 0x20, 0x4f, 0x53, 0x20, 0x58, 0x20, 0x31, 0x30, 0x2e, 0x34, 0x2e, 0x38, 0x00, 0x00, 0x1c, 0x82, 0x9a, 0x00, 0x05, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x6a, 0x82, 0x9d, 0x00, 0x05, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x72, 0x88, 0x22, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x88, 0x27, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x64, 0x00, 0x00, 0x90, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x04, 0x30, 0x32, 0x32, 0x30, 0x90, 0x03, 0x00, 0x02, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x02, 0x7a, 0x90, 0x04, 0x00, 0x02, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x02, 0x8e, 0x91, 0x01, 0x00, 0x07, 0x00, 0x00, 0x00, 0x04, 0x01, 0x02, 0x03, 0x00, 0x91, 0x02, 0x00, 0x05, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0xa2, 0x92, 0x04, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0xaa, 0x92, 0x05, 0x00, 0x05, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0xb2, 0x92, 0x07, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x05, 0x00, 0x00, 0x92, 0x08, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x92, 0x09, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0f, 0x00, 0x00, 0x92, 0x0a, 0x00, 0x05, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0xba, 0xa0, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x04, 0x30, 0x31, 0x30, 0x30, 0xa0, 0x01, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0x00, 0x00, 0xa0, 0x02, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x64, 0xa0, 0x03, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x64, 0xa3, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x01, 0x03, 0x00, 0x00, 0x00, 0xa3, 0x01, 0x00, 0x07, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0xa4, 0x01, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x02, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x06, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x08, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x09, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x0a, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x01, 0x90, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x0a, 0x32, 0x30, 0x30, 0x37, 0x3a, 0x30, 0x31, 0x3a, 0x32, 0x30, 0x20, 0x32, 0x33, 0x3a, 0x30, 0x35, 0x3a, 0x35, 0x32, 0x00, 0x32, 0x30, 0x30, 0x37, 0x3a, 0x30, 0x31, 0x3a, 0x32, 0x30, 0x20, 0x32, 0x33, 0x3a, 0x30, 0x35, 0x3a, 0x35, 0x32, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x4f, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x06, 0x01, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x06, 0x00, 0x00, 0x01, 0x1a, 0x00, 0x05, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x03, 0x12, 0x01, 0x1b, 0x00, 0x05, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x03, 0x1a, 0x01, 0x28, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x02, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x03, 0x22, 0x02, 0x02, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x09, 0xdd, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x01, 0xff, 0xd8, 0xff, 0xe0, 0x00, 0x10, 0x4a, 0x46, 0x49, 0x46, 0x00, 0x01, 0x02, 0x01, 0x00, 0x48, 0x00, 0x48, 0x00, 0x00, 0xff, 0xed, 0x00, 0x0c, 0x41, 0x64, 0x6f, 0x62, 0x65, 0x5f, 0x43, 0x4d, 0x00, 0x02, 0xff, 0xee, 0x00, 0x0e, 0x41, 0x64, 0x6f, 0x62, 0x65, 0x00, 0x64, 0x80, 0x00, 0x00, 0x00, 0x01, 0xff, 0xdb, 0x00, 0x84, 0x00, 0x0c, 0x08, 0x08, 0x08, 0x09, 0x08, 0x0c, 0x09, 0x09, 0x0c, 0x11, 0x0b, 0x0a, 0x0b, 0x11, 0x15, 0x0f, 0x0c, 0x0c, 0x0f, 0x15, 0x18, 0x13, 0x13, 0x15, 0x13, 0x13, 0x18, 0x11, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x11, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x01, 0x0d, 0x0b, 0x0b, 0x0d, 0x0e, 0x0d, 0x10, 0x0e, 0x0e, 0x10, 0x14, 0x0e, 0x0e, 0x0e, 0x14, 0x14, 0x0e, 0x0e, 0x0e, 0x0e, 0x14, 0x11, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x11, 0x11, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x11, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0xff, 0xc0, 0x00, 0x11, 0x08, 0x00, 0x64, 0x00, 0x64, 0x03, 0x01, 0x22, 0x00, 0x02, 0x11, 0x01, 0x03, 0x11, 0x01, 0xff, 0xdd, 0x00, 0x04, 0x00, 0x07, 0xff, 0xc4, 0x01, 0x3f, 0x00, 0x00, 0x01, 0x05, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x01, 0x02, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x01, 0x00, 0x01, 0x05, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x10, 0x00, 0x01, 0x04, 0x01, 0x03, 0x02, 0x04, 0x02, 0x05, 0x07, 0x06, 0x08, 0x05, 0x03, 0x0c, 0x33, 0x01, 0x00, 0x02, 0x11, 0x03, 0x04, 0x21, 0x12, 0x31, 0x05, 0x41, 0x51, 0x61, 0x13, 0x22, 0x71, 0x81, 0x32, 0x06, 0x14, 0x91, 0xa1, 0xb1, 0x42, 0x23, 0x24, 0x15, 0x52, 0xc1, 0x62, 0x33, 0x34, 0x72, 0x82, 0xd1, 0x43, 0x07, 0x25, 0x92, 0x53, 0xf0, 0xe1, 0xf1, 0x63, 0x73, 0x35, 0x16, 0xa2, 0xb2, 0x83, 0x26, 0x44, 0x93, 0x54, 0x64, 0x45, 0xc2, 0xa3, 0x74, 0x36, 0x17, 0xd2, 0x55, 0xe2, 0x65, 0xf2, 0xb3, 0x84, 0xc3, 0xd3, 0x75, 0xe3, 0xf3, 0x46, 0x27, 0x94, 0xa4, 0x85, 0xb4, 0x95, 0xc4, 0xd4, 0xe4, 0xf4, 0xa5, 0xb5, 0xc5, 0xd5, 0xe5, 0xf5, 0x56, 0x66, 0x76, 0x86, 0x96, 0xa6, 0xb6, 0xc6, 0xd6, 0xe6, 0xf6, 0x37, 0x47, 0x57, 0x67, 0x77, 0x87, 0x97, 0xa7, 0xb7, 0xc7, 0xd7, 0xe7, 0xf7, 0x11, 0x00, 0x02, 0x02, 0x01, 0x02, 0x04, 0x04, 0x03, 0x04, 0x05, 0x06, 0x07, 0x07, 0x06, 0x05, 0x35, 0x01, 0x00, 0x02, 0x11, 0x03, 0x21, 0x31, 0x12, 0x04, 0x41, 0x51, 0x61, 0x71, 0x22, 0x13, 0x05, 0x32, 0x81, 0x91, 0x14, 0xa1, 0xb1, 0x42, 0x23, 0xc1, 0x52, 0xd1, 0xf0, 0x33, 0x24, 0x62, 0xe1, 0x72, 0x82, 0x92, 0x43, 0x53, 0x15, 0x63, 0x73, 0x34, 0xf1, 0x25, 0x06, 0x16, 0xa2, 0xb2, 0x83, 0x07, 0x26, 0x35, 0xc2, 0xd2, 0x44, 0x93, 0x54, 0xa3, 0x17, 0x64, 0x45, 0x55, 0x36, 0x74, 0x65, 0xe2, 0xf2, 0xb3, 0x84, 0xc3, 0xd3, 0x75, 0xe3, 0xf3, 0x46, 0x94, 0xa4, 0x85, 0xb4, 0x95, 0xc4, 0xd4, 0xe4, 0xf4, 0xa5, 0xb5, 0xc5, 0xd5, 0xe5, 0xf5, 0x56, 0x66, 0x76, 0x86, 0x96, 0xa6, 0xb6, 0xc6, 0xd6, 0xe6, 0xf6, 0x27, 0x37, 0x47, 0x57, 0x67, 0x77, 0x87, 0x97, 0xa7, 0xb7, 0xc7, 0xff, 0xda, 0x00, 0x0c, 0x03, 0x01, 0x00, 0x02, 0x11, 0x03, 0x11, 0x00, 0x3f, 0x00, 0xf2, 0xed, 0xb2, 0x8d, 0x4d, 0x45, 0xcd, 0x2f, 0x3f, 0x44, 0x68, 0x93, 0xc3, 0x58, 0xc8, 0xf1, 0x1f, 0x8a, 0x33, 0x86, 0xda, 0x58, 0xc1, 0xa0, 0x02, 0x4f, 0xc4, 0xa1, 0x69, 0xa5, 0x9b, 0x5b, 0x4b, 0x84, 0x73, 0xdf, 0xc9, 0x15, 0xf8, 0xe3, 0xd1, 0x0e, 0x07, 0x93, 0xf3, 0xd1, 0x0f, 0x1c, 0x17, 0xef, 0x2e, 0x3b, 0x5b, 0xdc, 0xff, 0x00, 0xdf, 0x42, 0xbf, 0x8f, 0x8e, 0xdc, 0x82, 0xca, 0xd8, 0x37, 0x11, 0xa9, 0x3d, 0x82, 0x69, 0x2b, 0xc4, 0x6d, 0xc9, 0x75, 0x25, 0xbc, 0xf7, 0xec, 0xa1, 0xb5, 0x74, 0x19, 0x5d, 0x2e, 0x8a, 0x9a, 0x4b, 0x89, 0x7d, 0xc4, 0x68, 0xc6, 0xf6, 0xfe, 0xb2, 0xa0, 0x30, 0x1d, 0x60, 0x86, 0x88, 0x8d, 0x49, 0x3e, 0x01, 0x11, 0x20, 0xa3, 0x8c, 0xb9, 0xb1, 0xaa, 0x62, 0xad, 0xbf, 0x18, 0x97, 0x43, 0x47, 0x1d, 0xd2, 0xaf, 0x04, 0xd9, 0xb8, 0xc8, 0x0d, 0x68, 0xe4, 0xf7, 0x3e, 0x48, 0xf1, 0x05, 0xbc, 0x25, 0xaa, 0x07, 0x71, 0xd9, 0x14, 0x78, 0xf6, 0x49, 0xb5, 0x90, 0xfd, 0xa7, 0xc6, 0x14, 0xfd, 0x1b, 0x1c, 0xff, 0x00, 0x4d, 0x8d, 0x2e, 0x73, 0x8c, 0x35, 0xa3, 0x52, 0x4f, 0x92, 0x48, 0xa6, 0x1a, 0x24, 0xb6, 0x2a, 0xfa, 0xa5, 0x9e, 0x60, 0x64, 0x39, 0x94, 0x13, 0xcb, 0x27, 0x73, 0x80, 0xf3, 0x0c, 0xf6, 0xff, 0x00, 0xd2, 0x5a, 0x78, 0xbf, 0x53, 0x71, 0xf6, 0x01, 0x75, 0xb6, 0x97, 0x6a, 0x25, 0xa1, 0xad, 0x1f, 0xf4, 0xb7, 0x23, 0x48, 0xb7, 0x94, 0x84, 0x97, 0x5b, 0xff, 0x00, 0x32, 0xa9, 0xdd, 0xfc, 0xed, 0x9b, 0x7e, 0x0d, 0x9e, 0x52, 0x4a, 0x95, 0x61, 0xff, 0xd0, 0xf3, 0x3b, 0xa7, 0x70, 0xee, 0x01, 0x8f, 0xb9, 0x59, 0xfa, 0x7e, 0xdf, 0xe4, 0xc8, 0xf9, 0x2a, 0xc2, 0x5c, 0x63, 0xc3, 0x54, 0x67, 0x87, 0x6e, 0x10, 0x35, 0x68, 0xd4, 0x79, 0x1e, 0x53, 0x4a, 0xe0, 0xdc, 0xe9, 0xb8, 0x1f, 0x6a, 0xda, 0x6c, 0x25, 0x94, 0x37, 0xb0, 0xd0, 0xb8, 0xad, 0x67, 0xe4, 0x55, 0x8a, 0x5b, 0x8b, 0x82, 0xc0, 0x6f, 0x76, 0x80, 0x34, 0x49, 0x05, 0x2e, 0x9e, 0xc6, 0x1c, 0x66, 0x31, 0xba, 0x10, 0x23, 0xe0, 0xaf, 0xe1, 0x61, 0x53, 0x43, 0x8d, 0x81, 0xb3, 0x67, 0xef, 0x9e, 0x49, 0x2a, 0x12, 0x6c, 0xb6, 0x63, 0x1a, 0x0c, 0x31, 0xba, 0x55, 0xcd, 0xac, 0xfa, 0x8e, 0xdf, 0x91, 0x6e, 0x91, 0xd9, 0xb3, 0xc9, 0x73, 0x90, 0x7a, 0xab, 0x6a, 0xc2, 0xa4, 0x60, 0xe2, 0x8f, 0xd2, 0x38, 0x03, 0x7d, 0x9e, 0x0d, 0xff, 0x00, 0xcc, 0xd6, 0xd3, 0x6b, 0x71, 0x67, 0xd2, 0x3e, 0x64, 0x72, 0xab, 0xdb, 0x8d, 0x54, 0x39, 0xc5, 0x83, 0x6b, 0x3d, 0xee, 0x2e, 0xd4, 0x92, 0x3c, 0x4a, 0x56, 0xba, 0xb4, 0x79, 0x5c, 0xf7, 0xb2, 0x96, 0x6c, 0x8d, 0xaf, 0x80, 0x48, 0x3c, 0xf0, 0xb2, 0x1f, 0x63, 0x9c, 0xe9, 0x3f, 0x24, 0x5c, 0xdb, 0xdd, 0x76, 0x43, 0xde, 0xfd, 0x5c, 0xe3, 0x24, 0xfc, 0x50, 0x00, 0x93, 0x0a, 0x78, 0x8a, 0x0d, 0x49, 0xca, 0xcf, 0x93, 0x63, 0x1b, 0x7d, 0xd7, 0x57, 0x50, 0xd5, 0xef, 0x70, 0x6b, 0x4f, 0xc7, 0x45, 0xdb, 0x74, 0x9e, 0x8d, 0x5e, 0x33, 0x83, 0xd8, 0x37, 0xdd, 0xc3, 0xac, 0x3d, 0xbf, 0x92, 0xc5, 0x5b, 0xea, 0xbf, 0xd5, 0x62, 0xc0, 0xdc, 0xbc, 0xbd, 0x2d, 0x22, 0x5a, 0xcf, 0xdd, 0x69, 0xff, 0x00, 0xd1, 0x8e, 0x5d, 0xa5, 0x38, 0xb5, 0xb0, 0x00, 0xc6, 0xc4, 0x24, 0x4a, 0xd6, 0x8d, 0x18, 0x04, 0x49, 0x88, 0x9e, 0x55, 0xd6, 0x61, 0xb0, 0xc1, 0x70, 0x32, 0xdd, 0x3c, 0x95, 0xda, 0xf1, 0xfe, 0xf5, 0x62, 0xbc, 0x76, 0x8e, 0x75, 0x28, 0x02, 0xa2, 0xe7, 0x7d, 0x92, 0xb9, 0x84, 0x96, 0x96, 0xda, 0xf7, 0x70, 0x12, 0x4e, 0x5a, 0xff, 0x00, 0xff, 0xd1, 0xf3, 0x7a, 0x21, 0xaf, 0xde, 0xef, 0xa2, 0x22, 0x55, 0xfc, 0x5a, 0xbd, 0x42, 0xfb, 0x08, 0xfa, 0x67, 0x4f, 0x82, 0xcd, 0x6d, 0x85, 0xc0, 0x56, 0x3b, 0x90, 0xb7, 0xf0, 0x2a, 0x0e, 0x63, 0x58, 0x3b, 0xf2, 0xa3, 0x9e, 0x8c, 0xb8, 0x86, 0xbe, 0x49, 0xf1, 0x2c, 0x0c, 0x86, 0xb4, 0x4c, 0x69, 0xe4, 0xaf, 0x6e, 0xcc, 0x6b, 0x7d, 0x46, 0xb3, 0x70, 0xec, 0x38, 0x51, 0x7d, 0x02, 0x8a, 0xc7, 0xa6, 0xd9, 0x20, 0x68, 0x0f, 0x8f, 0x8a, 0xcf, 0xc9, 0xc2, 0xea, 0x59, 0x5b, 0x48, 0xb0, 0x91, 0xae, 0xe6, 0xc9, 0x03, 0xc9, 0x30, 0x51, 0x66, 0xd4, 0x0d, 0xad, 0xbd, 0x5f, 0x53, 0xcc, 0x6b, 0xb6, 0x90, 0x5a, 0x3b, 0x83, 0x0b, 0x43, 0x17, 0x31, 0xd6, 0xc3, 0x6e, 0x12, 0x3b, 0x79, 0xac, 0xc1, 0x89, 0x47, 0xd9, 0xe8, 0x63, 0x98, 0x45, 0xed, 0x6c, 0x5a, 0xf1, 0xa0, 0x27, 0xc5, 0x5b, 0xc3, 0x6f, 0xa6, 0xe0, 0x1c, 0x7d, 0xb3, 0xa2, 0x69, 0x34, 0x7b, 0xae, 0x1a, 0x8d, 0x45, 0x17, 0x9d, 0xeb, 0xfd, 0x21, 0xd8, 0xb9, 0xae, 0xb5, 0x80, 0xbb, 0x1e, 0xd2, 0x5c, 0xd7, 0x78, 0x13, 0xf9, 0xae, 0x4b, 0xea, 0xc7, 0x4a, 0x39, 0xbd, 0x55, 0xb3, 0xed, 0x66, 0x38, 0xf5, 0x09, 0x22, 0x41, 0x23, 0xe8, 0x37, 0xfb, 0x4b, 0xa1, 0xeb, 0xd6, 0xfe, 0x88, 0x31, 0xbf, 0x41, 0xc0, 0xee, 0xd2, 0x74, 0x02, 0x78, 0x53, 0xfa, 0x97, 0x43, 0x19, 0x85, 0x65, 0xff, 0x00, 0x9d, 0x71, 0x33, 0xe4, 0x1a, 0x7d, 0x8d, 0x53, 0x42, 0x56, 0x35, 0x6b, 0xe5, 0x80, 0x06, 0xc7, 0x57, 0xa7, 0xc4, 0xa9, 0xdb, 0xb6, 0x81, 0x1f, 0xeb, 0xd9, 0x69, 0x56, 0xc2, 0xd0, 0x00, 0xe5, 0x55, 0xc0, 0x12, 0xc2, 0xd7, 0x4e, 0xa2, 0x5a, 0x7c, 0x0a, 0xd0, 0x63, 0x9a, 0xd1, 0xaf, 0xd2, 0xe2, 0x3c, 0x12, 0x62, 0x66, 0xc6, 0x42, 0x23, 0x5a, 0x49, 0x8f, 0x10, 0xa2, 0xd2, 0x3e, 0x28, 0x9d, 0xc4, 0x88, 0x09, 0x29, 0x16, 0xc3, 0x3c, 0x24, 0x8d, 0xe6, 0x92, 0x72, 0x1f, 0xff, 0xd2, 0xf3, 0xbb, 0xb0, 0xfe, 0xcb, 0x99, 0xe9, 0xce, 0xf6, 0x88, 0x2d, 0x77, 0x91, 0x5b, 0x3d, 0x3d, 0xd0, 0xe6, 0x90, 0xa9, 0x65, 0x57, 0x38, 0x95, 0xdd, 0xcb, 0x9a, 0x7d, 0xce, 0xf2, 0x3f, 0x44, 0x23, 0x60, 0x58, 0x76, 0xe9, 0xca, 0x8c, 0xea, 0x1b, 0x31, 0x02, 0x32, 0x23, 0xea, 0xee, 0xb1, 0xcd, 0xb0, 0xc7, 0x87, 0x74, 0x7a, 0xeb, 0x70, 0x1a, 0x71, 0xe1, 0xfe, 0xe4, 0x1c, 0x1d, 0xae, 0xe5, 0x69, 0xd8, 0xfa, 0x99, 0x50, 0x0d, 0x1a, 0xf7, 0x2a, 0x3a, 0x0c, 0xf4, 0x1a, 0x8e, 0xc7, 0x27, 0x5d, 0xbf, 0x18, 0x41, 0xdc, 0xc2, 0xf0, 0x7f, 0x74, 0xf6, 0x3a, 0x22, 0x66, 0xdb, 0x68, 0xc6, 0x80, 0x48, 0x6b, 0x88, 0x06, 0x39, 0x0d, 0xee, 0xaa, 0x1f, 0xb3, 0xd5, 0x1b, 0x83, 0xd8, 0x3b, 0x38, 0x8f, 0x69, 0xfe, 0xdf, 0xd1, 0x4d, 0x29, 0xa1, 0x4c, 0x7a, 0xf4, 0xbf, 0xa7, 0x92, 0xcf, 0xa5, 0x20, 0x08, 0xf3, 0xf6, 0xff, 0x00, 0x15, 0xbb, 0xd1, 0x31, 0xd9, 0x5e, 0x3d, 0x75, 0x56, 0x36, 0x88, 0x00, 0x81, 0xe0, 0x16, 0x5e, 0x55, 0x74, 0x3f, 0x00, 0x9d, 0xe0, 0xcc, 0x69, 0xe7, 0x3a, 0x2d, 0xbe, 0x90, 0x00, 0xa9, 0xae, 0xef, 0x1f, 0x95, 0x4b, 0x0d, 0x9a, 0xdc, 0xc7, 0x45, 0xfe, 0xb1, 0x7d, 0x60, 0xa7, 0xa1, 0xe0, 0x1f, 0x4e, 0x1d, 0x99, 0x69, 0x02, 0x9a, 0xcf, 0x1f, 0xca, 0x7b, 0xbf, 0x90, 0xc5, 0xc2, 0xb3, 0xeb, 0x57, 0xd6, 0x03, 0x6b, 0xae, 0x39, 0xb6, 0x82, 0xe3, 0x31, 0xa1, 0x68, 0xf2, 0x6b, 0x5c, 0x12, 0xfa, 0xe1, 0x91, 0x66, 0x47, 0x5d, 0xb8, 0x3b, 0x4f, 0x44, 0x36, 0xb6, 0x8f, 0x28, 0xdd, 0xff, 0x00, 0x7e, 0x46, 0xab, 0x12, 0x2b, 0x65, 0x55, 0x32, 0xa7, 0x62, 0xb6, 0xbd, 0xf7, 0x64, 0x10, 0xdb, 0x03, 0x9f, 0x1b, 0x9e, 0xc7, 0xd9, 0xb8, 0x3b, 0x1f, 0x67, 0xf3, 0x6c, 0x52, 0x80, 0xd7, 0x7d, 0x0f, 0xea, 0x7f, 0x5d, 0x1d, 0x67, 0xa6, 0x0b, 0x1e, 0x47, 0xda, 0x69, 0x3b, 0x2e, 0x03, 0xc7, 0xf3, 0x5f, 0x1f, 0xf0, 0x8b, 0xa1, 0x02, 0x46, 0xba, 0x79, 0xaf, 0x32, 0xff, 0x00, 0x16, 0xad, 0xca, 0x1d, 0x57, 0x2a, 0xdc, 0x79, 0x18, 0x41, 0xb0, 0xf6, 0x9e, 0xe4, 0x9f, 0xd0, 0x8f, 0xeb, 0x31, 0xab, 0xd2, 0x83, 0xa4, 0xcb, 0x8c, 0xb8, 0xa0, 0x42, 0x12, 0x7b, 0x67, 0x9f, 0x2f, 0xf5, 0x09, 0x26, 0x96, 0xc4, 0xce, 0xa9, 0x20, 0xa7, 0xff, 0xd3, 0xf3, 0x2f, 0xb4, 0x5d, 0xe9, 0x0a, 0xb7, 0x9f, 0x4c, 0x19, 0xdb, 0x3a, 0x2d, 0x5e, 0x94, 0xfd, 0xc4, 0xb7, 0xc5, 0x62, 0xf9, 0x2b, 0xfd, 0x2e, 0xe3, 0x5d, 0xe0, 0x7c, 0x13, 0x48, 0xd1, 0x92, 0x12, 0xa9, 0x0b, 0x7a, 0xbc, 0x2d, 0xc2, 0x7f, 0x92, 0x60, 0xab, 0x4e, 0x79, 0x2e, 0x00, 0xf0, 0xaa, 0xe1, 0xda, 0x3d, 0x43, 0xfc, 0xad, 0x55, 0xbb, 0x80, 0x79, 0x81, 0xa0, 0xe6, 0x54, 0x32, 0x6d, 0x02, 0xbe, 0xf3, 0x61, 0x81, 0xa8, 0x44, 0x14, 0x03, 0x59, 0x0e, 0x1c, 0xf6, 0x1f, 0xdc, 0xb2, 0xec, 0xa3, 0x23, 0x77, 0xe8, 0x6e, 0x70, 0xf2, 0x25, 0x1f, 0x1f, 0x17, 0xa9, 0x6d, 0x71, 0x36, 0x97, 0x47, 0x00, 0xa4, 0x02, 0xe0, 0x2c, 0x7c, 0xc1, 0xab, 0xd5, 0x31, 0x85, 0x35, 0xd4, 0xe6, 0x13, 0x02, 0xd6, 0x4b, 0x67, 0x48, 0x2b, 0xa9, 0xe9, 0x2e, 0x02, 0xb6, 0x4f, 0x82, 0xe5, 0x7a, 0x95, 0x19, 0xc6, 0x87, 0x3d, 0xfb, 0xa2, 0xb8, 0x79, 0x1e, 0x4d, 0x3b, 0x96, 0xcf, 0x4f, 0xbd, 0xcd, 0xa2, 0xa2, 0x1f, 0xa0, 0x82, 0xd3, 0xfc, 0x97, 0x05, 0x24, 0x36, 0x6b, 0xf3, 0x31, 0xa2, 0x35, 0x79, 0xef, 0xad, 0xf8, 0xae, 0xaf, 0xaf, 0xd8, 0xf2, 0xd8, 0x6d, 0xed, 0x6b, 0xda, 0x7b, 0x18, 0x1b, 0x5d, 0xff, 0x00, 0x52, 0xb1, 0x6d, 0xf0, 0x81, 0x31, 0xca, 0xf4, 0x6e, 0xb1, 0x80, 0xce, 0xb1, 0x84, 0xc0, 0x21, 0xb7, 0xd6, 0x77, 0x31, 0xd1, 0x27, 0xc1, 0xcd, 0xfe, 0xd2, 0xe3, 0xec, 0xe8, 0x1d, 0x45, 0x96, 0xb0, 0x9a, 0xb7, 0x87, 0x3f, 0x68, 0x2d, 0xf7, 0x01, 0x1f, 0xbe, 0xd1, 0xf4, 0x7f, 0xb4, 0xa4, 0x0d, 0x77, 0xbb, 0xfa, 0x8f, 0x80, 0x3a, 0x7f, 0x43, 0xaa, 0xe2, 0xdf, 0xd2, 0x65, 0x7e, 0x95, 0xe4, 0x0f, 0x1f, 0xa1, 0xfe, 0x6b, 0x16, 0x9f, 0x52, 0xfa, 0xc1, 0xd3, 0xba, 0x6d, 0x26, 0xdc, 0xac, 0x86, 0xd4, 0xd9, 0x0d, 0x31, 0x2e, 0x74, 0x9e, 0xdb, 0x59, 0x2e, 0x55, 0xe8, 0xc9, 0xb2, 0x96, 0xd5, 0x4b, 0x9f, 0xb8, 0x6d, 0xda, 0x1c, 0x04, 0x09, 0x03, 0xfe, 0x8a, 0xc6, 0xfa, 0xd3, 0xf5, 0x6a, 0xbe, 0xbb, 0x5b, 0x2e, 0xc6, 0xb5, 0x94, 0xe6, 0xd5, 0x20, 0x97, 0x7d, 0x1b, 0x1b, 0xf9, 0xad, 0x7c, 0x7d, 0x17, 0xb7, 0xf3, 0x1e, 0x92, 0x1b, 0x7f, 0xf8, 0xe0, 0x7d, 0x59, 0xdd, 0xfd, 0x32, 0xd8, 0x8f, 0xa5, 0xe8, 0x3a, 0x12, 0x5c, 0x3f, 0xfc, 0xc4, 0xfa, 0xc3, 0xb3, 0x77, 0xa7, 0x56, 0xed, 0xdb, 0x76, 0x7a, 0x8d, 0xdd, 0x1f, 0xbf, 0xfd, 0x44, 0x92, 0x56, 0x8f, 0xff, 0xd4, 0xf2, 0xe8, 0x86, 0x17, 0x1e, 0xfa, 0x04, 0x56, 0x4b, 0x43, 0x6c, 0x6f, 0x2d, 0xe5, 0x46, 0x01, 0x64, 0x2b, 0x14, 0x32, 0x5b, 0xb4, 0xa0, 0x52, 0x1d, 0xde, 0x9b, 0x94, 0xdb, 0xab, 0x6b, 0x81, 0xf7, 0x05, 0xb0, 0xd7, 0x07, 0xb2, 0x27, 0x55, 0xc6, 0x57, 0x65, 0xd8, 0x76, 0x6e, 0x64, 0xed, 0xee, 0x16, 0xce, 0x27, 0x57, 0x63, 0xda, 0x0c, 0xc2, 0x8e, 0x51, 0x67, 0x84, 0xfa, 0x1d, 0xdd, 0x62, 0xc7, 0x07, 0xe9, 0xf7, 0xa3, 0xd6, 0x6c, 0x02, 0x41, 0x55, 0x31, 0xf3, 0x2b, 0xb3, 0xba, 0x2b, 0x2e, 0x68, 0x24, 0x1d, 0x47, 0x64, 0xca, 0xa6, 0x50, 0x41, 0x65, 0x90, 0x6c, 0xb1, 0xa5, 0xae, 0x33, 0x23, 0x51, 0xe4, 0xab, 0x7d, 0x5d, 0xcb, 0xb6, 0xcc, 0x37, 0xd0, 0x40, 0x73, 0x71, 0xde, 0x58, 0x09, 0xe7, 0x6f, 0x2c, 0x44, 0xc9, 0xc9, 0xae, 0xba, 0x9d, 0x63, 0x88, 0x01, 0xa0, 0x95, 0x9d, 0xf5, 0x3f, 0x2a, 0xe6, 0x67, 0xdb, 0x50, 0x83, 0x55, 0xad, 0x36, 0x3e, 0x78, 0x10, 0x74, 0x77, 0xfd, 0x2d, 0xaa, 0x4c, 0x7d, 0x58, 0x73, 0x91, 0xa0, 0x0f, 0x51, 0x45, 0xb7, 0x33, 0xdd, 0x58, 0x69, 0x1d, 0xd8, 0x0c, 0x9f, 0x96, 0x88, 0x19, 0x99, 0x19, 0xac, 0xcf, 0xa3, 0xd2, 0xad, 0xb5, 0xdb, 0x76, 0x8f, 0xad, 0xc4, 0xea, 0xcf, 0xdf, 0x7e, 0xdf, 0xdd, 0xfc, 0xd5, 0xa3, 0x5e, 0x43, 0x2b, 0x6b, 0xb2, 0xad, 0x3b, 0x6a, 0xa4, 0x13, 0xa7, 0x04, 0xac, 0x7a, 0x6f, 0xb3, 0x23, 0x26, 0xcc, 0xfb, 0xb4, 0x75, 0x8e, 0x01, 0x83, 0xf7, 0x58, 0x3e, 0x8b, 0x53, 0xa7, 0x2a, 0x1a, 0x31, 0x42, 0x36, 0x5d, 0x4c, 0x9a, 0xf2, 0xdc, 0xc6, 0xfe, 0x98, 0xb4, 0x34, 0xcb, 0x48, 0x0a, 0x8f, 0xdb, 0xb2, 0xeb, 0x76, 0xd6, 0x07, 0x5c, 0x59, 0xc9, 0x64, 0x8f, 0x93, 0xa7, 0x73, 0x16, 0x83, 0xaf, 0x0e, 0xa4, 0x33, 0xef, 0x50, 0xc5, 0x0c, 0xda, 0x59, 0x10, 0x06, 0x8a, 0x2e, 0x29, 0x0e, 0xac, 0xc2, 0x31, 0x3d, 0x36, 0x69, 0x7e, 0xd6, 0xcc, 0xf5, 0x3d, 0x6f, 0xb3, 0xeb, 0x1b, 0x76, 0xef, 0x3b, 0xa3, 0xfa, 0xc9, 0x2b, 0x5f, 0x66, 0x6f, 0xa9, 0x1e, 0x73, 0xf2, 0x49, 0x2e, 0x39, 0xf7, 0x4f, 0xb7, 0x8d, 0xff, 0xd5, 0xf3, 0x26, 0xfe, 0x0a, 0xc5, 0x1b, 0xa7, 0xcb, 0xb2, 0xcf, 0x49, 0x03, 0xb2, 0x46, 0xee, 0xd9, 0xd9, 0xb3, 0xf4, 0x9f, 0x25, 0x4a, 0xdf, 0x4b, 0x77, 0xe8, 0x27, 0xd4, 0xef, 0x1c, 0x2a, 0x29, 0x26, 0xc5, 0x7c, 0x9d, 0x6c, 0x7f, 0xb7, 0x6e, 0x1b, 0x26, 0x7f, 0x05, 0xa3, 0xfe, 0x53, 0x8d, 0x62, 0x57, 0x30, 0x92, 0x12, 0xfa, 0x2f, 0x86, 0xdf, 0xa4, 0xec, 0x67, 0xfe, 0xd0, 0xf4, 0xff, 0x00, 0x4d, 0xfc, 0xdf, 0x78, 0xe1, 0x68, 0x7d, 0x54, 0x99, 0xbf, 0x6f, 0xf3, 0xbe, 0xdf, 0x8e, 0xdd, 0x7f, 0xef, 0xeb, 0x97, 0x49, 0x3e, 0x3b, 0x7f, 0x06, 0x2c, 0x9f, 0x37, 0x5f, 0xf0, 0x9f, 0x4c, 0xeb, 0x7b, 0xbf, 0x67, 0x55, 0xe8, 0xff, 0x00, 0x31, 0xbc, 0x7a, 0x9e, 0x31, 0xdb, 0xfe, 0x92, 0xae, 0x37, 0x7a, 0x4d, 0xdb, 0xe2, 0x17, 0x9d, 0xa4, 0xa3, 0xc9, 0xba, 0xfc, 0x7b, 0x7d, 0x5f, 0x52, 0xa7, 0x7e, 0xd1, 0x28, 0xf8, 0xf3, 0xb0, 0xc7, 0x32, 0xbc, 0x99, 0x24, 0xc5, 0xe3, 0xab, 0xeb, 0x1f, 0xa4, 0xf5, 0xfc, 0xe1, 0x25, 0xe4, 0xe9, 0x24, 0x97, 0xff, 0xd9, 0xff, 0xed, 0x2e, 0x1c, 0x50, 0x68, 0x6f, 0x74, 0x6f, 0x73, 0x68, 0x6f, 0x70, 0x20, 0x33, 0x2e, 0x30, 0x00, 0x38, 0x42, 0x49, 0x4d, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2b, 0x1c, 0x02, 0x00, 0x00, 0x02, 0x00, 0x02, 0x1c, 0x02, 0x78, 0x00, 0x1f, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00, 0x38, 0x42, 0x49, 0x4d, 0x04, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xfb, 0x09, 0xa6, 0xbd, 0x07, 0x4c, 0x2a, 0x36, 0x9d, 0x8f, 0xe2, 0xcc, 0x57, 0xa9, 0xac, 0x85, 0x38, 0x42, 0x49, 0x4d, 0x03, 0xea, 0x00, 0x00, 0x00, 0x00, 0x1d, 0xb0, 0x3c, 0x3f, 0x78, 0x6d, 0x6c, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x31, 0x2e, 0x30, 0x22, 0x20, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x3d, 0x22, 0x55, 0x54, 0x46, 0x2d, 0x38, 0x22, 0x3f, 0x3e, 0x0a, 0x3c, 0x21, 0x44, 0x4f, 0x43, 0x54, 0x59, 0x50, 0x45, 0x20, 0x70, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x50, 0x55, 0x42, 0x4c, 0x49, 0x43, 0x20, 0x22, 0x2d, 0x2f, 0x2f, 0x41, 0x70, 0x70, 0x6c, 0x65, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x72, 0x2f, 0x2f, 0x44, 0x54, 0x44, 0x20, 0x50, 0x4c, 0x49, 0x53, 0x54, 0x20, 0x31, 0x2e, 0x30, 0x2f, 0x2f, 0x45, 0x4e, 0x22, 0x20, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x44, 0x54, 0x44, 0x73, 0x2f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x2d, 0x31, 0x2e, 0x30, 0x2e, 0x64, 0x74, 0x64, 0x22, 0x3e, 0x0a, 0x3c, 0x70, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x31, 0x2e, 0x30, 0x22, 0x3e, 0x0a, 0x3c, 0x64, 0x69, 0x63, 0x74, 0x3e, 0x0a, 0x09, 0x3c, 0x6b, 0x65, 0x79, 0x3e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x2e, 0x50, 0x4d, 0x48, 0x6f, 0x72, 0x69, 0x7a, 0x6f, 0x6e, 0x74, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x3c, 0x2f, 0x6b, 0x65, 0x79, 0x3e, 0x0a, 0x09, 0x3c, 0x64, 0x69, 0x63, 0x74, 0x3e, 0x0a, 0x09, 0x09, 0x3c, 0x6b, 0x65, 0x79, 0x3e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x2e, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72, 0x3c, 0x2f, 0x6b, 0x65, 0x79, 0x3e, 0x0a, 0x09, 0x09, 0x3c, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x69, 0x6e, 0x67, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x3c, 0x2f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3e, 0x0a, 0x09, 0x09, 0x3c, 0x6b, 0x65, 0x79, 0x3e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x2e, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x41, 0x72, 0x72, 0x61, 0x79, 0x3c, 0x2f, 0x6b, 0x65, 0x79, 0x3e, 0x0a, 0x09, 0x09, 0x3c, 0x61, 0x72, 0x72, 0x61, 0x79, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x3c, 0x64, 0x69, 0x63, 0x74, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x6b, 0x65, 0x79, 0x3e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x2e, 0x50, 0x4d, 0x48, 0x6f, 0x72, 0x69, 0x7a, 0x6f, 0x6e, 0x74, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x3c, 0x2f, 0x6b, 0x65, 0x79, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x72, 0x65, 0x61, 0x6c, 0x3e, 0x37, 0x32, 0x3c, 0x2f, 0x72, 0x65, 0x61, 0x6c, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x6b, 0x65, 0x79, 0x3e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x2e, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x3c, 0x2f, 0x6b, 0x65, 0x79, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x69, 0x6e, 0x67, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x3c, 0x2f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x6b, 0x65, 0x79, 0x3e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x2e, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x6d, 0x6f, 0x64, 0x44, 0x61, 0x74, 0x65, 0x3c, 0x2f, 0x6b, 0x65, 0x79, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x64, 0x61, 0x74, 0x65, 0x3e, 0x32, 0x30, 0x30, 0x37, 0x2d, 0x30, 0x31, 0x2d, 0x33, 0x30, 0x54, 0x32, 0x32, 0x3a, 0x30, 0x38, 0x3a, 0x34, 0x31, 0x5a, 0x3c, 0x2f, 0x64, 0x61, 0x74, 0x65, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x6b, 0x65, 0x79, 0x3e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x2e, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x65, 0x46, 0x6c, 0x61, 0x67, 0x3c, 0x2f, 0x6b, 0x65, 0x79, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x3e, 0x30, 0x3c, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x3c, 0x2f, 0x64, 0x69, 0x63, 0x74, 0x3e, 0x0a, 0x09, 0x09, 0x3c, 0x2f, 0x61, 0x72, 0x72, 0x61, 0x79, 0x3e, 0x0a, 0x09, 0x3c, 0x2f, 0x64, 0x69, 0x63, 0x74, 0x3e, 0x0a, 0x09, 0x3c, 0x6b, 0x65, 0x79, 0x3e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x2e, 0x50, 0x4d, 0x4f, 0x72, 0x69, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3c, 0x2f, 0x6b, 0x65, 0x79, 0x3e, 0x0a, 0x09, 0x3c, 0x64, 0x69, 0x63, 0x74, 0x3e, 0x0a, 0x09, 0x09, 0x3c, 0x6b, 0x65, 0x79, 0x3e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x2e, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72, 0x3c, 0x2f, 0x6b, 0x65, 0x79, 0x3e, 0x0a, 0x09, 0x09, 0x3c, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x69, 0x6e, 0x67, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x3c, 0x2f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3e, 0x0a, 0x09, 0x09, 0x3c, 0x6b, 0x65, 0x79, 0x3e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x2e, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x41, 0x72, 0x72, 0x61, 0x79, 0x3c, 0x2f, 0x6b, 0x65, 0x79, 0x3e, 0x0a, 0x09, 0x09, 0x3c, 0x61, 0x72, 0x72, 0x61, 0x79, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x3c, 0x64, 0x69, 0x63, 0x74, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x6b, 0x65, 0x79, 0x3e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x2e, 0x50, 0x4d, 0x4f, 0x72, 0x69, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3c, 0x2f, 0x6b, 0x65, 0x79, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x3e, 0x31, 0x3c, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x6b, 0x65, 0x79, 0x3e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x2e, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x3c, 0x2f, 0x6b, 0x65, 0x79, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x69, 0x6e, 0x67, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x3c, 0x2f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x6b, 0x65, 0x79, 0x3e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x2e, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x6d, 0x6f, 0x64, 0x44, 0x61, 0x74, 0x65, 0x3c, 0x2f, 0x6b, 0x65, 0x79, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x64, 0x61, 0x74, 0x65, 0x3e, 0x32, 0x30, 0x30, 0x37, 0x2d, 0x30, 0x31, 0x2d, 0x33, 0x30, 0x54, 0x32, 0x32, 0x3a, 0x30, 0x38, 0x3a, 0x34, 0x31, 0x5a, 0x3c, 0x2f, 0x64, 0x61, 0x74, 0x65, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x6b, 0x65, 0x79, 0x3e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x2e, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x65, 0x46, 0x6c, 0x61, 0x67, 0x3c, 0x2f, 0x6b, 0x65, 0x79, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x3e, 0x30, 0x3c, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x3c, 0x2f, 0x64, 0x69, 0x63, 0x74, 0x3e, 0x0a, 0x09, 0x09, 0x3c, 0x2f, 0x61, 0x72, 0x72, 0x61, 0x79, 0x3e, 0x0a, 0x09, 0x3c, 0x2f, 0x64, 0x69, 0x63, 0x74, 0x3e, 0x0a, 0x09, 0x3c, 0x6b, 0x65, 0x79, 0x3e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x2e, 0x50, 0x4d, 0x53, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x3c, 0x2f, 0x6b, 0x65, 0x79, 0x3e, 0x0a, 0x09, 0x3c, 0x64, 0x69, 0x63, 0x74, 0x3e, 0x0a, 0x09, 0x09, 0x3c, 0x6b, 0x65, 0x79, 0x3e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x2e, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72, 0x3c, 0x2f, 0x6b, 0x65, 0x79, 0x3e, 0x0a, 0x09, 0x09, 0x3c, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x69, 0x6e, 0x67, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x3c, 0x2f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3e, 0x0a, 0x09, 0x09, 0x3c, 0x6b, 0x65, 0x79, 0x3e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x2e, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x41, 0x72, 0x72, 0x61, 0x79, 0x3c, 0x2f, 0x6b, 0x65, 0x79, 0x3e, 0x0a, 0x09, 0x09, 0x3c, 0x61, 0x72, 0x72, 0x61, 0x79, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x3c, 0x64, 0x69, 0x63, 0x74, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x6b, 0x65, 0x79, 0x3e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x2e, 0x50, 0x4d, 0x53, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x3c, 0x2f, 0x6b, 0x65, 0x79, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x72, 0x65, 0x61, 0x6c, 0x3e, 0x31, 0x3c, 0x2f, 0x72, 0x65, 0x61, 0x6c, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x6b, 0x65, 0x79, 0x3e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x2e, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x3c, 0x2f, 0x6b, 0x65, 0x79, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x69, 0x6e, 0x67, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x3c, 0x2f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x6b, 0x65, 0x79, 0x3e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x2e, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x6d, 0x6f, 0x64, 0x44, 0x61, 0x74, 0x65, 0x3c, 0x2f, 0x6b, 0x65, 0x79, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x64, 0x61, 0x74, 0x65, 0x3e, 0x32, 0x30, 0x30, 0x37, 0x2d, 0x30, 0x31, 0x2d, 0x33, 0x30, 0x54, 0x32, 0x32, 0x3a, 0x30, 0x38, 0x3a, 0x34, 0x31, 0x5a, 0x3c, 0x2f, 0x64, 0x61, 0x74, 0x65, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x6b, 0x65, 0x79, 0x3e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x2e, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x65, 0x46, 0x6c, 0x61, 0x67, 0x3c, 0x2f, 0x6b, 0x65, 0x79, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x3e, 0x30, 0x3c, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x3c, 0x2f, 0x64, 0x69, 0x63, 0x74, 0x3e, 0x0a, 0x09, 0x09, 0x3c, 0x2f, 0x61, 0x72, 0x72, 0x61, 0x79, 0x3e, 0x0a, 0x09, 0x3c, 0x2f, 0x64, 0x69, 0x63, 0x74, 0x3e, 0x0a, 0x09, 0x3c, 0x6b, 0x65, 0x79, 0x3e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x2e, 0x50, 0x4d, 0x56, 0x65, 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x3c, 0x2f, 0x6b, 0x65, 0x79, 0x3e, 0x0a, 0x09, 0x3c, 0x64, 0x69, 0x63, 0x74, 0x3e, 0x0a, 0x09, 0x09, 0x3c, 0x6b, 0x65, 0x79, 0x3e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x2e, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72, 0x3c, 0x2f, 0x6b, 0x65, 0x79, 0x3e, 0x0a, 0x09, 0x09, 0x3c, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x69, 0x6e, 0x67, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x3c, 0x2f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3e, 0x0a, 0x09, 0x09, 0x3c, 0x6b, 0x65, 0x79, 0x3e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x2e, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x41, 0x72, 0x72, 0x61, 0x79, 0x3c, 0x2f, 0x6b, 0x65, 0x79, 0x3e, 0x0a, 0x09, 0x09, 0x3c, 0x61, 0x72, 0x72, 0x61, 0x79, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x3c, 0x64, 0x69, 0x63, 0x74, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x6b, 0x65, 0x79, 0x3e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x2e, 0x50, 0x4d, 0x56, 0x65, 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x3c, 0x2f, 0x6b, 0x65, 0x79, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x72, 0x65, 0x61, 0x6c, 0x3e, 0x37, 0x32, 0x3c, 0x2f, 0x72, 0x65, 0x61, 0x6c, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x6b, 0x65, 0x79, 0x3e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x2e, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x3c, 0x2f, 0x6b, 0x65, 0x79, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x69, 0x6e, 0x67, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x3c, 0x2f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x6b, 0x65, 0x79, 0x3e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x2e, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x6d, 0x6f, 0x64, 0x44, 0x61, 0x74, 0x65, 0x3c, 0x2f, 0x6b, 0x65, 0x79, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x64, 0x61, 0x74, 0x65, 0x3e, 0x32, 0x30, 0x30, 0x37, 0x2d, 0x30, 0x31, 0x2d, 0x33, 0x30, 0x54, 0x32, 0x32, 0x3a, 0x30, 0x38, 0x3a, 0x34, 0x31, 0x5a, 0x3c, 0x2f, 0x64, 0x61, 0x74, 0x65, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x6b, 0x65, 0x79, 0x3e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x2e, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x65, 0x46, 0x6c, 0x61, 0x67, 0x3c, 0x2f, 0x6b, 0x65, 0x79, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x3e, 0x30, 0x3c, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x3c, 0x2f, 0x64, 0x69, 0x63, 0x74, 0x3e, 0x0a, 0x09, 0x09, 0x3c, 0x2f, 0x61, 0x72, 0x72, 0x61, 0x79, 0x3e, 0x0a, 0x09, 0x3c, 0x2f, 0x64, 0x69, 0x63, 0x74, 0x3e, 0x0a, 0x09, 0x3c, 0x6b, 0x65, 0x79, 0x3e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x2e, 0x50, 0x4d, 0x56, 0x65, 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x53, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x3c, 0x2f, 0x6b, 0x65, 0x79, 0x3e, 0x0a, 0x09, 0x3c, 0x64, 0x69, 0x63, 0x74, 0x3e, 0x0a, 0x09, 0x09, 0x3c, 0x6b, 0x65, 0x79, 0x3e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x2e, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72, 0x3c, 0x2f, 0x6b, 0x65, 0x79, 0x3e, 0x0a, 0x09, 0x09, 0x3c, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x69, 0x6e, 0x67, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x3c, 0x2f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3e, 0x0a, 0x09, 0x09, 0x3c, 0x6b, 0x65, 0x79, 0x3e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x2e, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x41, 0x72, 0x72, 0x61, 0x79, 0x3c, 0x2f, 0x6b, 0x65, 0x79, 0x3e, 0x0a, 0x09, 0x09, 0x3c, 0x61, 0x72, 0x72, 0x61, 0x79, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x3c, 0x64, 0x69, 0x63, 0x74, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x6b, 0x65, 0x79, 0x3e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x2e, 0x50, 0x4d, 0x56, 0x65, 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x53, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x3c, 0x2f, 0x6b, 0x65, 0x79, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x72, 0x65, 0x61, 0x6c, 0x3e, 0x31, 0x3c, 0x2f, 0x72, 0x65, 0x61, 0x6c, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x6b, 0x65, 0x79, 0x3e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x2e, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x3c, 0x2f, 0x6b, 0x65, 0x79, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x69, 0x6e, 0x67, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x3c, 0x2f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x6b, 0x65, 0x79, 0x3e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x2e, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x6d, 0x6f, 0x64, 0x44, 0x61, 0x74, 0x65, 0x3c, 0x2f, 0x6b, 0x65, 0x79, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x64, 0x61, 0x74, 0x65, 0x3e, 0x32, 0x30, 0x30, 0x37, 0x2d, 0x30, 0x31, 0x2d, 0x33, 0x30, 0x54, 0x32, 0x32, 0x3a, 0x30, 0x38, 0x3a, 0x34, 0x31, 0x5a, 0x3c, 0x2f, 0x64, 0x61, 0x74, 0x65, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x6b, 0x65, 0x79, 0x3e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x2e, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x65, 0x46, 0x6c, 0x61, 0x67, 0x3c, 0x2f, 0x6b, 0x65, 0x79, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x3e, 0x30, 0x3c, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x3c, 0x2f, 0x64, 0x69, 0x63, 0x74, 0x3e, 0x0a, 0x09, 0x09, 0x3c, 0x2f, 0x61, 0x72, 0x72, 0x61, 0x79, 0x3e, 0x0a, 0x09, 0x3c, 0x2f, 0x64, 0x69, 0x63, 0x74, 0x3e, 0x0a, 0x09, 0x3c, 0x6b, 0x65, 0x79, 0x3e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x2e, 0x73, 0x75, 0x62, 0x54, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x70, 0x61, 0x70, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x5f, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x3c, 0x2f, 0x6b, 0x65, 0x79, 0x3e, 0x0a, 0x09, 0x3c, 0x64, 0x69, 0x63, 0x74, 0x3e, 0x0a, 0x09, 0x09, 0x3c, 0x6b, 0x65, 0x79, 0x3e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x2e, 0x50, 0x4d, 0x41, 0x64, 0x6a, 0x75, 0x73, 0x74, 0x65, 0x64, 0x50, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x74, 0x3c, 0x2f, 0x6b, 0x65, 0x79, 0x3e, 0x0a, 0x09, 0x09, 0x3c, 0x64, 0x69, 0x63, 0x74, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x3c, 0x6b, 0x65, 0x79, 0x3e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x2e, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72, 0x3c, 0x2f, 0x6b, 0x65, 0x79, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x3c, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x69, 0x6e, 0x67, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x3c, 0x2f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x3c, 0x6b, 0x65, 0x79, 0x3e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x2e, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x41, 0x72, 0x72, 0x61, 0x79, 0x3c, 0x2f, 0x6b, 0x65, 0x79, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x3c, 0x61, 0x72, 0x72, 0x61, 0x79, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x64, 0x69, 0x63, 0x74, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x6b, 0x65, 0x79, 0x3e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x2e, 0x50, 0x4d, 0x41, 0x64, 0x6a, 0x75, 0x73, 0x74, 0x65, 0x64, 0x50, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x74, 0x3c, 0x2f, 0x6b, 0x65, 0x79, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x61, 0x72, 0x72, 0x61, 0x79, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x72, 0x65, 0x61, 0x6c, 0x3e, 0x30, 0x2e, 0x30, 0x3c, 0x2f, 0x72, 0x65, 0x61, 0x6c, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x72, 0x65, 0x61, 0x6c, 0x3e, 0x30, 0x2e, 0x30, 0x3c, 0x2f, 0x72, 0x65, 0x61, 0x6c, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x72, 0x65, 0x61, 0x6c, 0x3e, 0x37, 0x33, 0x34, 0x3c, 0x2f, 0x72, 0x65, 0x61, 0x6c, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x72, 0x65, 0x61, 0x6c, 0x3e, 0x35, 0x37, 0x36, 0x3c, 0x2f, 0x72, 0x65, 0x61, 0x6c, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x2f, 0x61, 0x72, 0x72, 0x61, 0x79, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x6b, 0x65, 0x79, 0x3e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x2e, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x3c, 0x2f, 0x6b, 0x65, 0x79, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x69, 0x6e, 0x67, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x3c, 0x2f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x6b, 0x65, 0x79, 0x3e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x2e, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x6d, 0x6f, 0x64, 0x44, 0x61, 0x74, 0x65, 0x3c, 0x2f, 0x6b, 0x65, 0x79, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x64, 0x61, 0x74, 0x65, 0x3e, 0x32, 0x30, 0x30, 0x37, 0x2d, 0x30, 0x31, 0x2d, 0x33, 0x30, 0x54, 0x32, 0x32, 0x3a, 0x30, 0x38, 0x3a, 0x34, 0x31, 0x5a, 0x3c, 0x2f, 0x64, 0x61, 0x74, 0x65, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x6b, 0x65, 0x79, 0x3e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x2e, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x65, 0x46, 0x6c, 0x61, 0x67, 0x3c, 0x2f, 0x6b, 0x65, 0x79, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x3e, 0x30, 0x3c, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x2f, 0x64, 0x69, 0x63, 0x74, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x3c, 0x2f, 0x61, 0x72, 0x72, 0x61, 0x79, 0x3e, 0x0a, 0x09, 0x09, 0x3c, 0x2f, 0x64, 0x69, 0x63, 0x74, 0x3e, 0x0a, 0x09, 0x09, 0x3c, 0x6b, 0x65, 0x79, 0x3e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x2e, 0x50, 0x4d, 0x41, 0x64, 0x6a, 0x75, 0x73, 0x74, 0x65, 0x64, 0x50, 0x61, 0x70, 0x65, 0x72, 0x52, 0x65, 0x63, 0x74, 0x3c, 0x2f, 0x6b, 0x65, 0x79, 0x3e, 0x0a, 0x09, 0x09, 0x3c, 0x64, 0x69, 0x63, 0x74, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x3c, 0x6b, 0x65, 0x79, 0x3e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x2e, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72, 0x3c, 0x2f, 0x6b, 0x65, 0x79, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x3c, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x69, 0x6e, 0x67, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x3c, 0x2f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x3c, 0x6b, 0x65, 0x79, 0x3e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x2e, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x41, 0x72, 0x72, 0x61, 0x79, 0x3c, 0x2f, 0x6b, 0x65, 0x79, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x3c, 0x61, 0x72, 0x72, 0x61, 0x79, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x64, 0x69, 0x63, 0x74, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x6b, 0x65, 0x79, 0x3e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x2e, 0x50, 0x4d, 0x41, 0x64, 0x6a, 0x75, 0x73, 0x74, 0x65, 0x64, 0x50, 0x61, 0x70, 0x65, 0x72, 0x52, 0x65, 0x63, 0x74, 0x3c, 0x2f, 0x6b, 0x65, 0x79, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x61, 0x72, 0x72, 0x61, 0x79, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x72, 0x65, 0x61, 0x6c, 0x3e, 0x2d, 0x31, 0x38, 0x3c, 0x2f, 0x72, 0x65, 0x61, 0x6c, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x72, 0x65, 0x61, 0x6c, 0x3e, 0x2d, 0x31, 0x38, 0x3c, 0x2f, 0x72, 0x65, 0x61, 0x6c, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x72, 0x65, 0x61, 0x6c, 0x3e, 0x37, 0x37, 0x34, 0x3c, 0x2f, 0x72, 0x65, 0x61, 0x6c, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x72, 0x65, 0x61, 0x6c, 0x3e, 0x35, 0x39, 0x34, 0x3c, 0x2f, 0x72, 0x65, 0x61, 0x6c, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x2f, 0x61, 0x72, 0x72, 0x61, 0x79, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x6b, 0x65, 0x79, 0x3e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x2e, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x3c, 0x2f, 0x6b, 0x65, 0x79, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x69, 0x6e, 0x67, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x3c, 0x2f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x6b, 0x65, 0x79, 0x3e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x2e, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x6d, 0x6f, 0x64, 0x44, 0x61, 0x74, 0x65, 0x3c, 0x2f, 0x6b, 0x65, 0x79, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x64, 0x61, 0x74, 0x65, 0x3e, 0x32, 0x30, 0x30, 0x37, 0x2d, 0x30, 0x31, 0x2d, 0x33, 0x30, 0x54, 0x32, 0x32, 0x3a, 0x30, 0x38, 0x3a, 0x34, 0x31, 0x5a, 0x3c, 0x2f, 0x64, 0x61, 0x74, 0x65, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x6b, 0x65, 0x79, 0x3e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x2e, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x65, 0x46, 0x6c, 0x61, 0x67, 0x3c, 0x2f, 0x6b, 0x65, 0x79, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x3e, 0x30, 0x3c, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x2f, 0x64, 0x69, 0x63, 0x74, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x3c, 0x2f, 0x61, 0x72, 0x72, 0x61, 0x79, 0x3e, 0x0a, 0x09, 0x09, 0x3c, 0x2f, 0x64, 0x69, 0x63, 0x74, 0x3e, 0x0a, 0x09, 0x09, 0x3c, 0x6b, 0x65, 0x79, 0x3e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x2e, 0x50, 0x61, 0x70, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x50, 0x4d, 0x50, 0x61, 0x70, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x3c, 0x2f, 0x6b, 0x65, 0x79, 0x3e, 0x0a, 0x09, 0x09, 0x3c, 0x64, 0x69, 0x63, 0x74, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x3c, 0x6b, 0x65, 0x79, 0x3e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x2e, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72, 0x3c, 0x2f, 0x6b, 0x65, 0x79, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x3c, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x2e, 0x70, 0x6d, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3c, 0x2f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x3c, 0x6b, 0x65, 0x79, 0x3e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x2e, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x41, 0x72, 0x72, 0x61, 0x79, 0x3c, 0x2f, 0x6b, 0x65, 0x79, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x3c, 0x61, 0x72, 0x72, 0x61, 0x79, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x64, 0x69, 0x63, 0x74, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x6b, 0x65, 0x79, 0x3e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x2e, 0x50, 0x61, 0x70, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x50, 0x4d, 0x50, 0x61, 0x70, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x3c, 0x2f, 0x6b, 0x65, 0x79, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3e, 0x6e, 0x61, 0x2d, 0x6c, 0x65, 0x74, 0x74, 0x65, 0x72, 0x3c, 0x2f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x6b, 0x65, 0x79, 0x3e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x2e, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x3c, 0x2f, 0x6b, 0x65, 0x79, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x2e, 0x70, 0x6d, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3c, 0x2f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x6b, 0x65, 0x79, 0x3e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x2e, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x6d, 0x6f, 0x64, 0x44, 0x61, 0x74, 0x65, 0x3c, 0x2f, 0x6b, 0x65, 0x79, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x64, 0x61, 0x74, 0x65, 0x3e, 0x32, 0x30, 0x30, 0x33, 0x2d, 0x30, 0x37, 0x2d, 0x30, 0x31, 0x54, 0x31, 0x37, 0x3a, 0x34, 0x39, 0x3a, 0x33, 0x36, 0x5a, 0x3c, 0x2f, 0x64, 0x61, 0x74, 0x65, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x6b, 0x65, 0x79, 0x3e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x2e, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x65, 0x46, 0x6c, 0x61, 0x67, 0x3c, 0x2f, 0x6b, 0x65, 0x79, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x3e, 0x31, 0x3c, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x2f, 0x64, 0x69, 0x63, 0x74, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x3c, 0x2f, 0x61, 0x72, 0x72, 0x61, 0x79, 0x3e, 0x0a, 0x09, 0x09, 0x3c, 0x2f, 0x64, 0x69, 0x63, 0x74, 0x3e, 0x0a, 0x09, 0x09, 0x3c, 0x6b, 0x65, 0x79, 0x3e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x2e, 0x50, 0x61, 0x70, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x50, 0x4d, 0x55, 0x6e, 0x61, 0x64, 0x6a, 0x75, 0x73, 0x74, 0x65, 0x64, 0x50, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x74, 0x3c, 0x2f, 0x6b, 0x65, 0x79, 0x3e, 0x0a, 0x09, 0x09, 0x3c, 0x64, 0x69, 0x63, 0x74, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x3c, 0x6b, 0x65, 0x79, 0x3e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x2e, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72, 0x3c, 0x2f, 0x6b, 0x65, 0x79, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x3c, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x2e, 0x70, 0x6d, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3c, 0x2f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x3c, 0x6b, 0x65, 0x79, 0x3e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x2e, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x41, 0x72, 0x72, 0x61, 0x79, 0x3c, 0x2f, 0x6b, 0x65, 0x79, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x3c, 0x61, 0x72, 0x72, 0x61, 0x79, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x64, 0x69, 0x63, 0x74, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x6b, 0x65, 0x79, 0x3e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x2e, 0x50, 0x61, 0x70, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x50, 0x4d, 0x55, 0x6e, 0x61, 0x64, 0x6a, 0x75, 0x73, 0x74, 0x65, 0x64, 0x50, 0x61, 0x67, 0x65, 0x52, 0x65, 0x63, 0x74, 0x3c, 0x2f, 0x6b, 0x65, 0x79, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x61, 0x72, 0x72, 0x61, 0x79, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x72, 0x65, 0x61, 0x6c, 0x3e, 0x30, 0x2e, 0x30, 0x3c, 0x2f, 0x72, 0x65, 0x61, 0x6c, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x72, 0x65, 0x61, 0x6c, 0x3e, 0x30, 0x2e, 0x30, 0x3c, 0x2f, 0x72, 0x65, 0x61, 0x6c, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x72, 0x65, 0x61, 0x6c, 0x3e, 0x37, 0x33, 0x34, 0x3c, 0x2f, 0x72, 0x65, 0x61, 0x6c, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x72, 0x65, 0x61, 0x6c, 0x3e, 0x35, 0x37, 0x36, 0x3c, 0x2f, 0x72, 0x65, 0x61, 0x6c, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x2f, 0x61, 0x72, 0x72, 0x61, 0x79, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x6b, 0x65, 0x79, 0x3e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x2e, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x3c, 0x2f, 0x6b, 0x65, 0x79, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x69, 0x6e, 0x67, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x3c, 0x2f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x6b, 0x65, 0x79, 0x3e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x2e, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x6d, 0x6f, 0x64, 0x44, 0x61, 0x74, 0x65, 0x3c, 0x2f, 0x6b, 0x65, 0x79, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x64, 0x61, 0x74, 0x65, 0x3e, 0x32, 0x30, 0x30, 0x37, 0x2d, 0x30, 0x31, 0x2d, 0x33, 0x30, 0x54, 0x32, 0x32, 0x3a, 0x30, 0x38, 0x3a, 0x34, 0x31, 0x5a, 0x3c, 0x2f, 0x64, 0x61, 0x74, 0x65, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x6b, 0x65, 0x79, 0x3e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x2e, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x65, 0x46, 0x6c, 0x61, 0x67, 0x3c, 0x2f, 0x6b, 0x65, 0x79, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x3e, 0x30, 0x3c, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x2f, 0x64, 0x69, 0x63, 0x74, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x3c, 0x2f, 0x61, 0x72, 0x72, 0x61, 0x79, 0x3e, 0x0a, 0x09, 0x09, 0x3c, 0x2f, 0x64, 0x69, 0x63, 0x74, 0x3e, 0x0a, 0x09, 0x09, 0x3c, 0x6b, 0x65, 0x79, 0x3e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x2e, 0x50, 0x61, 0x70, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x50, 0x4d, 0x55, 0x6e, 0x61, 0x64, 0x6a, 0x75, 0x73, 0x74, 0x65, 0x64, 0x50, 0x61, 0x70, 0x65, 0x72, 0x52, 0x65, 0x63, 0x74, 0x3c, 0x2f, 0x6b, 0x65, 0x79, 0x3e, 0x0a, 0x09, 0x09, 0x3c, 0x64, 0x69, 0x63, 0x74, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x3c, 0x6b, 0x65, 0x79, 0x3e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x2e, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72, 0x3c, 0x2f, 0x6b, 0x65, 0x79, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x3c, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x2e, 0x70, 0x6d, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3c, 0x2f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x3c, 0x6b, 0x65, 0x79, 0x3e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x2e, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x41, 0x72, 0x72, 0x61, 0x79, 0x3c, 0x2f, 0x6b, 0x65, 0x79, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x3c, 0x61, 0x72, 0x72, 0x61, 0x79, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x64, 0x69, 0x63, 0x74, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x6b, 0x65, 0x79, 0x3e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x2e, 0x50, 0x61, 0x70, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x50, 0x4d, 0x55, 0x6e, 0x61, 0x64, 0x6a, 0x75, 0x73, 0x74, 0x65, 0x64, 0x50, 0x61, 0x70, 0x65, 0x72, 0x52, 0x65, 0x63, 0x74, 0x3c, 0x2f, 0x6b, 0x65, 0x79, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x61, 0x72, 0x72, 0x61, 0x79, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x72, 0x65, 0x61, 0x6c, 0x3e, 0x2d, 0x31, 0x38, 0x3c, 0x2f, 0x72, 0x65, 0x61, 0x6c, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x72, 0x65, 0x61, 0x6c, 0x3e, 0x2d, 0x31, 0x38, 0x3c, 0x2f, 0x72, 0x65, 0x61, 0x6c, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x72, 0x65, 0x61, 0x6c, 0x3e, 0x37, 0x37, 0x34, 0x3c, 0x2f, 0x72, 0x65, 0x61, 0x6c, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x72, 0x65, 0x61, 0x6c, 0x3e, 0x35, 0x39, 0x34, 0x3c, 0x2f, 0x72, 0x65, 0x61, 0x6c, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x2f, 0x61, 0x72, 0x72, 0x61, 0x79, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x6b, 0x65, 0x79, 0x3e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x2e, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x3c, 0x2f, 0x6b, 0x65, 0x79, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x69, 0x6e, 0x67, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x72, 0x3c, 0x2f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x6b, 0x65, 0x79, 0x3e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x2e, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x6d, 0x6f, 0x64, 0x44, 0x61, 0x74, 0x65, 0x3c, 0x2f, 0x6b, 0x65, 0x79, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x64, 0x61, 0x74, 0x65, 0x3e, 0x32, 0x30, 0x30, 0x37, 0x2d, 0x30, 0x31, 0x2d, 0x33, 0x30, 0x54, 0x32, 0x32, 0x3a, 0x30, 0x38, 0x3a, 0x34, 0x31, 0x5a, 0x3c, 0x2f, 0x64, 0x61, 0x74, 0x65, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x6b, 0x65, 0x79, 0x3e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x2e, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x65, 0x46, 0x6c, 0x61, 0x67, 0x3c, 0x2f, 0x6b, 0x65, 0x79, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x3e, 0x30, 0x3c, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x2f, 0x64, 0x69, 0x63, 0x74, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x3c, 0x2f, 0x61, 0x72, 0x72, 0x61, 0x79, 0x3e, 0x0a, 0x09, 0x09, 0x3c, 0x2f, 0x64, 0x69, 0x63, 0x74, 0x3e, 0x0a, 0x09, 0x09, 0x3c, 0x6b, 0x65, 0x79, 0x3e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x2e, 0x50, 0x61, 0x70, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x70, 0x70, 0x64, 0x2e, 0x50, 0x4d, 0x50, 0x61, 0x70, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x3c, 0x2f, 0x6b, 0x65, 0x79, 0x3e, 0x0a, 0x09, 0x09, 0x3c, 0x64, 0x69, 0x63, 0x74, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x3c, 0x6b, 0x65, 0x79, 0x3e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x2e, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x6f, 0x72, 0x3c, 0x2f, 0x6b, 0x65, 0x79, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x3c, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x2e, 0x70, 0x6d, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3c, 0x2f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x3c, 0x6b, 0x65, 0x79, 0x3e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x2e, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x41, 0x72, 0x72, 0x61, 0x79, 0x3c, 0x2f, 0x6b, 0x65, 0x79, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x3c, 0x61, 0x72, 0x72, 0x61, 0x79, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x64, 0x69, 0x63, 0x74, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x6b, 0x65, 0x79, 0x3e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x2e, 0x50, 0x61, 0x70, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x70, 0x70, 0x64, 0x2e, 0x50, 0x4d, 0x50, 0x61, 0x70, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x3c, 0x2f, 0x6b, 0x65, 0x79, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3e, 0x55, 0x53, 0x20, 0x4c, 0x65, 0x74, 0x74, 0x65, 0x72, 0x3c, 0x2f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x6b, 0x65, 0x79, 0x3e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x2e, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x3c, 0x2f, 0x6b, 0x65, 0x79, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x2e, 0x70, 0x6d, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3c, 0x2f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x6b, 0x65, 0x79, 0x3e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x2e, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x6d, 0x6f, 0x64, 0x44, 0x61, 0x74, 0x65, 0x3c, 0x2f, 0x6b, 0x65, 0x79, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x64, 0x61, 0x74, 0x65, 0x3e, 0x32, 0x30, 0x30, 0x33, 0x2d, 0x30, 0x37, 0x2d, 0x30, 0x31, 0x54, 0x31, 0x37, 0x3a, 0x34, 0x39, 0x3a, 0x33, 0x36, 0x5a, 0x3c, 0x2f, 0x64, 0x61, 0x74, 0x65, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x6b, 0x65, 0x79, 0x3e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x2e, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x73, 0x74, 0x61, 0x74, 0x65, 0x46, 0x6c, 0x61, 0x67, 0x3c, 0x2f, 0x6b, 0x65, 0x79, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x3e, 0x31, 0x3c, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x65, 0x72, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x09, 0x3c, 0x2f, 0x64, 0x69, 0x63, 0x74, 0x3e, 0x0a, 0x09, 0x09, 0x09, 0x3c, 0x2f, 0x61, 0x72, 0x72, 0x61, 0x79, 0x3e, 0x0a, 0x09, 0x09, 0x3c, 0x2f, 0x64, 0x69, 0x63, 0x74, 0x3e, 0x0a, 0x09, 0x09, 0x3c, 0x6b, 0x65, 0x79, 0x3e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x2e, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x41, 0x50, 0x49, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3c, 0x2f, 0x6b, 0x65, 0x79, 0x3e, 0x0a, 0x09, 0x09, 0x3c, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3e, 0x30, 0x30, 0x2e, 0x32, 0x30, 0x3c, 0x2f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3e, 0x0a, 0x09, 0x09, 0x3c, 0x6b, 0x65, 0x79, 0x3e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x2e, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x4c, 0x6f, 0x63, 0x6b, 0x3c, 0x2f, 0x6b, 0x65, 0x79, 0x3e, 0x0a, 0x09, 0x09, 0x3c, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x2f, 0x3e, 0x0a, 0x09, 0x09, 0x3c, 0x6b, 0x65, 0x79, 0x3e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x2e, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x3c, 0x2f, 0x6b, 0x65, 0x79, 0x3e, 0x0a, 0x09, 0x09, 0x3c, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x2e, 0x50, 0x61, 0x70, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x54, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x3c, 0x2f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3e, 0x0a, 0x09, 0x3c, 0x2f, 0x64, 0x69, 0x63, 0x74, 0x3e, 0x0a, 0x09, 0x3c, 0x6b, 0x65, 0x79, 0x3e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x2e, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x41, 0x50, 0x49, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3c, 0x2f, 0x6b, 0x65, 0x79, 0x3e, 0x0a, 0x09, 0x3c, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3e, 0x30, 0x30, 0x2e, 0x32, 0x30, 0x3c, 0x2f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3e, 0x0a, 0x09, 0x3c, 0x6b, 0x65, 0x79, 0x3e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x2e, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x4c, 0x6f, 0x63, 0x6b, 0x3c, 0x2f, 0x6b, 0x65, 0x79, 0x3e, 0x0a, 0x09, 0x3c, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x2f, 0x3e, 0x0a, 0x09, 0x3c, 0x6b, 0x65, 0x79, 0x3e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x2e, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x3c, 0x2f, 0x6b, 0x65, 0x79, 0x3e, 0x0a, 0x09, 0x3c, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3e, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x54, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x3c, 0x2f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3e, 0x0a, 0x3c, 0x2f, 0x64, 0x69, 0x63, 0x74, 0x3e, 0x0a, 0x3c, 0x2f, 0x70, 0x6c, 0x69, 0x73, 0x74, 0x3e, 0x0a, 0x38, 0x42, 0x49, 0x4d, 0x03, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x03, 0x00, 0x00, 0x00, 0x48, 0x00, 0x48, 0x00, 0x00, 0x00, 0x00, 0x02, 0xde, 0x02, 0x40, 0xff, 0xee, 0xff, 0xee, 0x03, 0x06, 0x02, 0x52, 0x03, 0x67, 0x05, 0x28, 0x03, 0xfc, 0x00, 0x02, 0x00, 0x00, 0x00, 0x48, 0x00, 0x48, 0x00, 0x00, 0x00, 0x00, 0x02, 0xd8, 0x02, 0x28, 0x00, 0x01, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x01, 0x00, 0x03, 0x03, 0x03, 0x00, 0x00, 0x00, 0x01, 0x7f, 0xff, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x68, 0x08, 0x00, 0x19, 0x01, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x42, 0x49, 0x4d, 0x03, 0xed, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x48, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x48, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x38, 0x42, 0x49, 0x4d, 0x04, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x80, 0x00, 0x00, 0x38, 0x42, 0x49, 0x4d, 0x04, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x1e, 0x38, 0x42, 0x49, 0x4d, 0x04, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x1e, 0x38, 0x42, 0x49, 0x4d, 0x03, 0xf3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x38, 0x42, 0x49, 0x4d, 0x04, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x38, 0x42, 0x49, 0x4d, 0x27, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x38, 0x42, 0x49, 0x4d, 0x03, 0xf5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x2f, 0x66, 0x66, 0x00, 0x01, 0x00, 0x6c, 0x66, 0x66, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x2f, 0x66, 0x66, 0x00, 0x01, 0x00, 0xa1, 0x99, 0x9a, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x32, 0x00, 0x00, 0x00, 0x01, 0x00, 0x5a, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x35, 0x00, 0x00, 0x00, 0x01, 0x00, 0x2d, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x38, 0x42, 0x49, 0x4d, 0x03, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0xe8, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0xe8, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0xe8, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0xe8, 0x00, 0x00, 0x38, 0x42, 0x49, 0x4d, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x40, 0x00, 0x00, 0x02, 0x40, 0x00, 0x00, 0x00, 0x00, 0x38, 0x42, 0x49, 0x4d, 0x04, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x38, 0x42, 0x49, 0x4d, 0x04, 0x1a, 0x00, 0x00, 0x00, 0x00, 0x03, 0x45, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x08, 0x00, 0x44, 0x00, 0x53, 0x00, 0x43, 0x00, 0x30, 0x00, 0x32, 0x00, 0x33, 0x00, 0x32, 0x00, 0x35, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6e, 0x75, 0x6c, 0x6c, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x06, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x73, 0x4f, 0x62, 0x6a, 0x63, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x63, 0x74, 0x31, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x54, 0x6f, 0x70, 0x20, 0x6c, 0x6f, 0x6e, 0x67, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x65, 0x66, 0x74, 0x6c, 0x6f, 0x6e, 0x67, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x74, 0x6f, 0x6d, 0x6c, 0x6f, 0x6e, 0x67, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x00, 0x52, 0x67, 0x68, 0x74, 0x6c, 0x6f, 0x6e, 0x67, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x06, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x73, 0x56, 0x6c, 0x4c, 0x73, 0x00, 0x00, 0x00, 0x01, 0x4f, 0x62, 0x6a, 0x63, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x07, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x49, 0x44, 0x6c, 0x6f, 0x6e, 0x67, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x49, 0x44, 0x6c, 0x6f, 0x6e, 0x67, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x65, 0x6e, 0x75, 0x6d, 0x00, 0x00, 0x00, 0x0c, 0x45, 0x53, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x00, 0x00, 0x00, 0x0d, 0x61, 0x75, 0x74, 0x6f, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x00, 0x00, 0x00, 0x00, 0x54, 0x79, 0x70, 0x65, 0x65, 0x6e, 0x75, 0x6d, 0x00, 0x00, 0x00, 0x0a, 0x45, 0x53, 0x6c, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x00, 0x00, 0x00, 0x00, 0x49, 0x6d, 0x67, 0x20, 0x00, 0x00, 0x00, 0x06, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x73, 0x4f, 0x62, 0x6a, 0x63, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x63, 0x74, 0x31, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x54, 0x6f, 0x70, 0x20, 0x6c, 0x6f, 0x6e, 0x67, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x65, 0x66, 0x74, 0x6c, 0x6f, 0x6e, 0x67, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x74, 0x6f, 0x6d, 0x6c, 0x6f, 0x6e, 0x67, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x00, 0x52, 0x67, 0x68, 0x74, 0x6c, 0x6f, 0x6e, 0x67, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x03, 0x75, 0x72, 0x6c, 0x54, 0x45, 0x58, 0x54, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6e, 0x75, 0x6c, 0x6c, 0x54, 0x45, 0x58, 0x54, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x73, 0x67, 0x65, 0x54, 0x45, 0x58, 0x54, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x61, 0x6c, 0x74, 0x54, 0x61, 0x67, 0x54, 0x45, 0x58, 0x54, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x63, 0x65, 0x6c, 0x6c, 0x54, 0x65, 0x78, 0x74, 0x49, 0x73, 0x48, 0x54, 0x4d, 0x4c, 0x62, 0x6f, 0x6f, 0x6c, 0x01, 0x00, 0x00, 0x00, 0x08, 0x63, 0x65, 0x6c, 0x6c, 0x54, 0x65, 0x78, 0x74, 0x54, 0x45, 0x58, 0x54, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x68, 0x6f, 0x72, 0x7a, 0x41, 0x6c, 0x69, 0x67, 0x6e, 0x65, 0x6e, 0x75, 0x6d, 0x00, 0x00, 0x00, 0x0f, 0x45, 0x53, 0x6c, 0x69, 0x63, 0x65, 0x48, 0x6f, 0x72, 0x7a, 0x41, 0x6c, 0x69, 0x67, 0x6e, 0x00, 0x00, 0x00, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x00, 0x00, 0x00, 0x09, 0x76, 0x65, 0x72, 0x74, 0x41, 0x6c, 0x69, 0x67, 0x6e, 0x65, 0x6e, 0x75, 0x6d, 0x00, 0x00, 0x00, 0x0f, 0x45, 0x53, 0x6c, 0x69, 0x63, 0x65, 0x56, 0x65, 0x72, 0x74, 0x41, 0x6c, 0x69, 0x67, 0x6e, 0x00, 0x00, 0x00, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x00, 0x00, 0x00, 0x0b, 0x62, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x54, 0x79, 0x70, 0x65, 0x65, 0x6e, 0x75, 0x6d, 0x00, 0x00, 0x00, 0x11, 0x45, 0x53, 0x6c, 0x69, 0x63, 0x65, 0x42, 0x47, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x54, 0x79, 0x70, 0x65, 0x00, 0x00, 0x00, 0x00, 0x4e, 0x6f, 0x6e, 0x65, 0x00, 0x00, 0x00, 0x09, 0x74, 0x6f, 0x70, 0x4f, 0x75, 0x74, 0x73, 0x65, 0x74, 0x6c, 0x6f, 0x6e, 0x67, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x6c, 0x65, 0x66, 0x74, 0x4f, 0x75, 0x74, 0x73, 0x65, 0x74, 0x6c, 0x6f, 0x6e, 0x67, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x4f, 0x75, 0x74, 0x73, 0x65, 0x74, 0x6c, 0x6f, 0x6e, 0x67, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x72, 0x69, 0x67, 0x68, 0x74, 0x4f, 0x75, 0x74, 0x73, 0x65, 0x74, 0x6c, 0x6f, 0x6e, 0x67, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x42, 0x49, 0x4d, 0x04, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x38, 0x42, 0x49, 0x4d, 0x04, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x01, 0x38, 0x42, 0x49, 0x4d, 0x04, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x09, 0xf9, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x01, 0x2c, 0x00, 0x00, 0x75, 0x30, 0x00, 0x00, 0x09, 0xdd, 0x00, 0x18, 0x00, 0x01, 0xff, 0xd8, 0xff, 0xe0, 0x00, 0x10, 0x4a, 0x46, 0x49, 0x46, 0x00, 0x01, 0x02, 0x01, 0x00, 0x48, 0x00, 0x48, 0x00, 0x00, 0xff, 0xed, 0x00, 0x0c, 0x41, 0x64, 0x6f, 0x62, 0x65, 0x5f, 0x43, 0x4d, 0x00, 0x02, 0xff, 0xee, 0x00, 0x0e, 0x41, 0x64, 0x6f, 0x62, 0x65, 0x00, 0x64, 0x80, 0x00, 0x00, 0x00, 0x01, 0xff, 0xdb, 0x00, 0x84, 0x00, 0x0c, 0x08, 0x08, 0x08, 0x09, 0x08, 0x0c, 0x09, 0x09, 0x0c, 0x11, 0x0b, 0x0a, 0x0b, 0x11, 0x15, 0x0f, 0x0c, 0x0c, 0x0f, 0x15, 0x18, 0x13, 0x13, 0x15, 0x13, 0x13, 0x18, 0x11, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x11, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x01, 0x0d, 0x0b, 0x0b, 0x0d, 0x0e, 0x0d, 0x10, 0x0e, 0x0e, 0x10, 0x14, 0x0e, 0x0e, 0x0e, 0x14, 0x14, 0x0e, 0x0e, 0x0e, 0x0e, 0x14, 0x11, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x11, 0x11, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x11, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0xff, 0xc0, 0x00, 0x11, 0x08, 0x00, 0x64, 0x00, 0x64, 0x03, 0x01, 0x22, 0x00, 0x02, 0x11, 0x01, 0x03, 0x11, 0x01, 0xff, 0xdd, 0x00, 0x04, 0x00, 0x07, 0xff, 0xc4, 0x01, 0x3f, 0x00, 0x00, 0x01, 0x05, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x01, 0x02, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x01, 0x00, 0x01, 0x05, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x10, 0x00, 0x01, 0x04, 0x01, 0x03, 0x02, 0x04, 0x02, 0x05, 0x07, 0x06, 0x08, 0x05, 0x03, 0x0c, 0x33, 0x01, 0x00, 0x02, 0x11, 0x03, 0x04, 0x21, 0x12, 0x31, 0x05, 0x41, 0x51, 0x61, 0x13, 0x22, 0x71, 0x81, 0x32, 0x06, 0x14, 0x91, 0xa1, 0xb1, 0x42, 0x23, 0x24, 0x15, 0x52, 0xc1, 0x62, 0x33, 0x34, 0x72, 0x82, 0xd1, 0x43, 0x07, 0x25, 0x92, 0x53, 0xf0, 0xe1, 0xf1, 0x63, 0x73, 0x35, 0x16, 0xa2, 0xb2, 0x83, 0x26, 0x44, 0x93, 0x54, 0x64, 0x45, 0xc2, 0xa3, 0x74, 0x36, 0x17, 0xd2, 0x55, 0xe2, 0x65, 0xf2, 0xb3, 0x84, 0xc3, 0xd3, 0x75, 0xe3, 0xf3, 0x46, 0x27, 0x94, 0xa4, 0x85, 0xb4, 0x95, 0xc4, 0xd4, 0xe4, 0xf4, 0xa5, 0xb5, 0xc5, 0xd5, 0xe5, 0xf5, 0x56, 0x66, 0x76, 0x86, 0x96, 0xa6, 0xb6, 0xc6, 0xd6, 0xe6, 0xf6, 0x37, 0x47, 0x57, 0x67, 0x77, 0x87, 0x97, 0xa7, 0xb7, 0xc7, 0xd7, 0xe7, 0xf7, 0x11, 0x00, 0x02, 0x02, 0x01, 0x02, 0x04, 0x04, 0x03, 0x04, 0x05, 0x06, 0x07, 0x07, 0x06, 0x05, 0x35, 0x01, 0x00, 0x02, 0x11, 0x03, 0x21, 0x31, 0x12, 0x04, 0x41, 0x51, 0x61, 0x71, 0x22, 0x13, 0x05, 0x32, 0x81, 0x91, 0x14, 0xa1, 0xb1, 0x42, 0x23, 0xc1, 0x52, 0xd1, 0xf0, 0x33, 0x24, 0x62, 0xe1, 0x72, 0x82, 0x92, 0x43, 0x53, 0x15, 0x63, 0x73, 0x34, 0xf1, 0x25, 0x06, 0x16, 0xa2, 0xb2, 0x83, 0x07, 0x26, 0x35, 0xc2, 0xd2, 0x44, 0x93, 0x54, 0xa3, 0x17, 0x64, 0x45, 0x55, 0x36, 0x74, 0x65, 0xe2, 0xf2, 0xb3, 0x84, 0xc3, 0xd3, 0x75, 0xe3, 0xf3, 0x46, 0x94, 0xa4, 0x85, 0xb4, 0x95, 0xc4, 0xd4, 0xe4, 0xf4, 0xa5, 0xb5, 0xc5, 0xd5, 0xe5, 0xf5, 0x56, 0x66, 0x76, 0x86, 0x96, 0xa6, 0xb6, 0xc6, 0xd6, 0xe6, 0xf6, 0x27, 0x37, 0x47, 0x57, 0x67, 0x77, 0x87, 0x97, 0xa7, 0xb7, 0xc7, 0xff, 0xda, 0x00, 0x0c, 0x03, 0x01, 0x00, 0x02, 0x11, 0x03, 0x11, 0x00, 0x3f, 0x00, 0xf2, 0xed, 0xb2, 0x8d, 0x4d, 0x45, 0xcd, 0x2f, 0x3f, 0x44, 0x68, 0x93, 0xc3, 0x58, 0xc8, 0xf1, 0x1f, 0x8a, 0x33, 0x86, 0xda, 0x58, 0xc1, 0xa0, 0x02, 0x4f, 0xc4, 0xa1, 0x69, 0xa5, 0x9b, 0x5b, 0x4b, 0x84, 0x73, 0xdf, 0xc9, 0x15, 0xf8, 0xe3, 0xd1, 0x0e, 0x07, 0x93, 0xf3, 0xd1, 0x0f, 0x1c, 0x17, 0xef, 0x2e, 0x3b, 0x5b, 0xdc, 0xff, 0x00, 0xdf, 0x42, 0xbf, 0x8f, 0x8e, 0xdc, 0x82, 0xca, 0xd8, 0x37, 0x11, 0xa9, 0x3d, 0x82, 0x69, 0x2b, 0xc4, 0x6d, 0xc9, 0x75, 0x25, 0xbc, 0xf7, 0xec, 0xa1, 0xb5, 0x74, 0x19, 0x5d, 0x2e, 0x8a, 0x9a, 0x4b, 0x89, 0x7d, 0xc4, 0x68, 0xc6, 0xf6, 0xfe, 0xb2, 0xa0, 0x30, 0x1d, 0x60, 0x86, 0x88, 0x8d, 0x49, 0x3e, 0x01, 0x11, 0x20, 0xa3, 0x8c, 0xb9, 0xb1, 0xaa, 0x62, 0xad, 0xbf, 0x18, 0x97, 0x43, 0x47, 0x1d, 0xd2, 0xaf, 0x04, 0xd9, 0xb8, 0xc8, 0x0d, 0x68, 0xe4, 0xf7, 0x3e, 0x48, 0xf1, 0x05, 0xbc, 0x25, 0xaa, 0x07, 0x71, 0xd9, 0x14, 0x78, 0xf6, 0x49, 0xb5, 0x90, 0xfd, 0xa7, 0xc6, 0x14, 0xfd, 0x1b, 0x1c, 0xff, 0x00, 0x4d, 0x8d, 0x2e, 0x73, 0x8c, 0x35, 0xa3, 0x52, 0x4f, 0x92, 0x48, 0xa6, 0x1a, 0x24, 0xb6, 0x2a, 0xfa, 0xa5, 0x9e, 0x60, 0x64, 0x39, 0x94, 0x13, 0xcb, 0x27, 0x73, 0x80, 0xf3, 0x0c, 0xf6, 0xff, 0x00, 0xd2, 0x5a, 0x78, 0xbf, 0x53, 0x71, 0xf6, 0x01, 0x75, 0xb6, 0x97, 0x6a, 0x25, 0xa1, 0xad, 0x1f, 0xf4, 0xb7, 0x23, 0x48, 0xb7, 0x94, 0x84, 0x97, 0x5b, 0xff, 0x00, 0x32, 0xa9, 0xdd, 0xfc, 0xed, 0x9b, 0x7e, 0x0d, 0x9e, 0x52, 0x4a, 0x95, 0x61, 0xff, 0xd0, 0xf3, 0x3b, 0xa7, 0x70, 0xee, 0x01, 0x8f, 0xb9, 0x59, 0xfa, 0x7e, 0xdf, 0xe4, 0xc8, 0xf9, 0x2a, 0xc2, 0x5c, 0x63, 0xc3, 0x54, 0x67, 0x87, 0x6e, 0x10, 0x35, 0x68, 0xd4, 0x79, 0x1e, 0x53, 0x4a, 0xe0, 0xdc, 0xe9, 0xb8, 0x1f, 0x6a, 0xda, 0x6c, 0x25, 0x94, 0x37, 0xb0, 0xd0, 0xb8, 0xad, 0x67, 0xe4, 0x55, 0x8a, 0x5b, 0x8b, 0x82, 0xc0, 0x6f, 0x76, 0x80, 0x34, 0x49, 0x05, 0x2e, 0x9e, 0xc6, 0x1c, 0x66, 0x31, 0xba, 0x10, 0x23, 0xe0, 0xaf, 0xe1, 0x61, 0x53, 0x43, 0x8d, 0x81, 0xb3, 0x67, 0xef, 0x9e, 0x49, 0x2a, 0x12, 0x6c, 0xb6, 0x63, 0x1a, 0x0c, 0x31, 0xba, 0x55, 0xcd, 0xac, 0xfa, 0x8e, 0xdf, 0x91, 0x6e, 0x91, 0xd9, 0xb3, 0xc9, 0x73, 0x90, 0x7a, 0xab, 0x6a, 0xc2, 0xa4, 0x60, 0xe2, 0x8f, 0xd2, 0x38, 0x03, 0x7d, 0x9e, 0x0d, 0xff, 0x00, 0xcc, 0xd6, 0xd3, 0x6b, 0x71, 0x67, 0xd2, 0x3e, 0x64, 0x72, 0xab, 0xdb, 0x8d, 0x54, 0x39, 0xc5, 0x83, 0x6b, 0x3d, 0xee, 0x2e, 0xd4, 0x92, 0x3c, 0x4a, 0x56, 0xba, 0xb4, 0x79, 0x5c, 0xf7, 0xb2, 0x96, 0x6c, 0x8d, 0xaf, 0x80, 0x48, 0x3c, 0xf0, 0xb2, 0x1f, 0x63, 0x9c, 0xe9, 0x3f, 0x24, 0x5c, 0xdb, 0xdd, 0x76, 0x43, 0xde, 0xfd, 0x5c, 0xe3, 0x24, 0xfc, 0x50, 0x00, 0x93, 0x0a, 0x78, 0x8a, 0x0d, 0x49, 0xca, 0xcf, 0x93, 0x63, 0x1b, 0x7d, 0xd7, 0x57, 0x50, 0xd5, 0xef, 0x70, 0x6b, 0x4f, 0xc7, 0x45, 0xdb, 0x74, 0x9e, 0x8d, 0x5e, 0x33, 0x83, 0xd8, 0x37, 0xdd, 0xc3, 0xac, 0x3d, 0xbf, 0x92, 0xc5, 0x5b, 0xea, 0xbf, 0xd5, 0x62, 0xc0, 0xdc, 0xbc, 0xbd, 0x2d, 0x22, 0x5a, 0xcf, 0xdd, 0x69, 0xff, 0x00, 0xd1, 0x8e, 0x5d, 0xa5, 0x38, 0xb5, 0xb0, 0x00, 0xc6, 0xc4, 0x24, 0x4a, 0xd6, 0x8d, 0x18, 0x04, 0x49, 0x88, 0x9e, 0x55, 0xd6, 0x61, 0xb0, 0xc1, 0x70, 0x32, 0xdd, 0x3c, 0x95, 0xda, 0xf1, 0xfe, 0xf5, 0x62, 0xbc, 0x76, 0x8e, 0x75, 0x28, 0x02, 0xa2, 0xe7, 0x7d, 0x92, 0xb9, 0x84, 0x96, 0x96, 0xda, 0xf7, 0x70, 0x12, 0x4e, 0x5a, 0xff, 0x00, 0xff, 0xd1, 0xf3, 0x7a, 0x21, 0xaf, 0xde, 0xef, 0xa2, 0x22, 0x55, 0xfc, 0x5a, 0xbd, 0x42, 0xfb, 0x08, 0xfa, 0x67, 0x4f, 0x82, 0xcd, 0x6d, 0x85, 0xc0, 0x56, 0x3b, 0x90, 0xb7, 0xf0, 0x2a, 0x0e, 0x63, 0x58, 0x3b, 0xf2, 0xa3, 0x9e, 0x8c, 0xb8, 0x86, 0xbe, 0x49, 0xf1, 0x2c, 0x0c, 0x86, 0xb4, 0x4c, 0x69, 0xe4, 0xaf, 0x6e, 0xcc, 0x6b, 0x7d, 0x46, 0xb3, 0x70, 0xec, 0x38, 0x51, 0x7d, 0x02, 0x8a, 0xc7, 0xa6, 0xd9, 0x20, 0x68, 0x0f, 0x8f, 0x8a, 0xcf, 0xc9, 0xc2, 0xea, 0x59, 0x5b, 0x48, 0xb0, 0x91, 0xae, 0xe6, 0xc9, 0x03, 0xc9, 0x30, 0x51, 0x66, 0xd4, 0x0d, 0xad, 0xbd, 0x5f, 0x53, 0xcc, 0x6b, 0xb6, 0x90, 0x5a, 0x3b, 0x83, 0x0b, 0x43, 0x17, 0x31, 0xd6, 0xc3, 0x6e, 0x12, 0x3b, 0x79, 0xac, 0xc1, 0x89, 0x47, 0xd9, 0xe8, 0x63, 0x98, 0x45, 0xed, 0x6c, 0x5a, 0xf1, 0xa0, 0x27, 0xc5, 0x5b, 0xc3, 0x6f, 0xa6, 0xe0, 0x1c, 0x7d, 0xb3, 0xa2, 0x69, 0x34, 0x7b, 0xae, 0x1a, 0x8d, 0x45, 0x17, 0x9d, 0xeb, 0xfd, 0x21, 0xd8, 0xb9, 0xae, 0xb5, 0x80, 0xbb, 0x1e, 0xd2, 0x5c, 0xd7, 0x78, 0x13, 0xf9, 0xae, 0x4b, 0xea, 0xc7, 0x4a, 0x39, 0xbd, 0x55, 0xb3, 0xed, 0x66, 0x38, 0xf5, 0x09, 0x22, 0x41, 0x23, 0xe8, 0x37, 0xfb, 0x4b, 0xa1, 0xeb, 0xd6, 0xfe, 0x88, 0x31, 0xbf, 0x41, 0xc0, 0xee, 0xd2, 0x74, 0x02, 0x78, 0x53, 0xfa, 0x97, 0x43, 0x19, 0x85, 0x65, 0xff, 0x00, 0x9d, 0x71, 0x33, 0xe4, 0x1a, 0x7d, 0x8d, 0x53, 0x42, 0x56, 0x35, 0x6b, 0xe5, 0x80, 0x06, 0xc7, 0x57, 0xa7, 0xc4, 0xa9, 0xdb, 0xb6, 0x81, 0x1f, 0xeb, 0xd9, 0x69, 0x56, 0xc2, 0xd0, 0x00, 0xe5, 0x55, 0xc0, 0x12, 0xc2, 0xd7, 0x4e, 0xa2, 0x5a, 0x7c, 0x0a, 0xd0, 0x63, 0x9a, 0xd1, 0xaf, 0xd2, 0xe2, 0x3c, 0x12, 0x62, 0x66, 0xc6, 0x42, 0x23, 0x5a, 0x49, 0x8f, 0x10, 0xa2, 0xd2, 0x3e, 0x28, 0x9d, 0xc4, 0x88, 0x09, 0x29, 0x16, 0xc3, 0x3c, 0x24, 0x8d, 0xe6, 0x92, 0x72, 0x1f, 0xff, 0xd2, 0xf3, 0xbb, 0xb0, 0xfe, 0xcb, 0x99, 0xe9, 0xce, 0xf6, 0x88, 0x2d, 0x77, 0x91, 0x5b, 0x3d, 0x3d, 0xd0, 0xe6, 0x90, 0xa9, 0x65, 0x57, 0x38, 0x95, 0xdd, 0xcb, 0x9a, 0x7d, 0xce, 0xf2, 0x3f, 0x44, 0x23, 0x60, 0x58, 0x76, 0xe9, 0xca, 0x8c, 0xea, 0x1b, 0x31, 0x02, 0x32, 0x23, 0xea, 0xee, 0xb1, 0xcd, 0xb0, 0xc7, 0x87, 0x74, 0x7a, 0xeb, 0x70, 0x1a, 0x71, 0xe1, 0xfe, 0xe4, 0x1c, 0x1d, 0xae, 0xe5, 0x69, 0xd8, 0xfa, 0x99, 0x50, 0x0d, 0x1a, 0xf7, 0x2a, 0x3a, 0x0c, 0xf4, 0x1a, 0x8e, 0xc7, 0x27, 0x5d, 0xbf, 0x18, 0x41, 0xdc, 0xc2, 0xf0, 0x7f, 0x74, 0xf6, 0x3a, 0x22, 0x66, 0xdb, 0x68, 0xc6, 0x80, 0x48, 0x6b, 0x88, 0x06, 0x39, 0x0d, 0xee, 0xaa, 0x1f, 0xb3, 0xd5, 0x1b, 0x83, 0xd8, 0x3b, 0x38, 0x8f, 0x69, 0xfe, 0xdf, 0xd1, 0x4d, 0x29, 0xa1, 0x4c, 0x7a, 0xf4, 0xbf, 0xa7, 0x92, 0xcf, 0xa5, 0x20, 0x08, 0xf3, 0xf6, 0xff, 0x00, 0x15, 0xbb, 0xd1, 0x31, 0xd9, 0x5e, 0x3d, 0x75, 0x56, 0x36, 0x88, 0x00, 0x81, 0xe0, 0x16, 0x5e, 0x55, 0x74, 0x3f, 0x00, 0x9d, 0xe0, 0xcc, 0x69, 0xe7, 0x3a, 0x2d, 0xbe, 0x90, 0x00, 0xa9, 0xae, 0xef, 0x1f, 0x95, 0x4b, 0x0d, 0x9a, 0xdc, 0xc7, 0x45, 0xfe, 0xb1, 0x7d, 0x60, 0xa7, 0xa1, 0xe0, 0x1f, 0x4e, 0x1d, 0x99, 0x69, 0x02, 0x9a, 0xcf, 0x1f, 0xca, 0x7b, 0xbf, 0x90, 0xc5, 0xc2, 0xb3, 0xeb, 0x57, 0xd6, 0x03, 0x6b, 0xae, 0x39, 0xb6, 0x82, 0xe3, 0x31, 0xa1, 0x68, 0xf2, 0x6b, 0x5c, 0x12, 0xfa, 0xe1, 0x91, 0x66, 0x47, 0x5d, 0xb8, 0x3b, 0x4f, 0x44, 0x36, 0xb6, 0x8f, 0x28, 0xdd, 0xff, 0x00, 0x7e, 0x46, 0xab, 0x12, 0x2b, 0x65, 0x55, 0x32, 0xa7, 0x62, 0xb6, 0xbd, 0xf7, 0x64, 0x10, 0xdb, 0x03, 0x9f, 0x1b, 0x9e, 0xc7, 0xd9, 0xb8, 0x3b, 0x1f, 0x67, 0xf3, 0x6c, 0x52, 0x80, 0xd7, 0x7d, 0x0f, 0xea, 0x7f, 0x5d, 0x1d, 0x67, 0xa6, 0x0b, 0x1e, 0x47, 0xda, 0x69, 0x3b, 0x2e, 0x03, 0xc7, 0xf3, 0x5f, 0x1f, 0xf0, 0x8b, 0xa1, 0x02, 0x46, 0xba, 0x79, 0xaf, 0x32, 0xff, 0x00, 0x16, 0xad, 0xca, 0x1d, 0x57, 0x2a, 0xdc, 0x79, 0x18, 0x41, 0xb0, 0xf6, 0x9e, 0xe4, 0x9f, 0xd0, 0x8f, 0xeb, 0x31, 0xab, 0xd2, 0x83, 0xa4, 0xcb, 0x8c, 0xb8, 0xa0, 0x42, 0x12, 0x7b, 0x67, 0x9f, 0x2f, 0xf5, 0x09, 0x26, 0x96, 0xc4, 0xce, 0xa9, 0x20, 0xa7, 0xff, 0xd3, 0xf3, 0x2f, 0xb4, 0x5d, 0xe9, 0x0a, 0xb7, 0x9f, 0x4c, 0x19, 0xdb, 0x3a, 0x2d, 0x5e, 0x94, 0xfd, 0xc4, 0xb7, 0xc5, 0x62, 0xf9, 0x2b, 0xfd, 0x2e, 0xe3, 0x5d, 0xe0, 0x7c, 0x13, 0x48, 0xd1, 0x92, 0x12, 0xa9, 0x0b, 0x7a, 0xbc, 0x2d, 0xc2, 0x7f, 0x92, 0x60, 0xab, 0x4e, 0x79, 0x2e, 0x00, 0xf0, 0xaa, 0xe1, 0xda, 0x3d, 0x43, 0xfc, 0xad, 0x55, 0xbb, 0x80, 0x79, 0x81, 0xa0, 0xe6, 0x54, 0x32, 0x6d, 0x02, 0xbe, 0xf3, 0x61, 0x81, 0xa8, 0x44, 0x14, 0x03, 0x59, 0x0e, 0x1c, 0xf6, 0x1f, 0xdc, 0xb2, 0xec, 0xa3, 0x23, 0x77, 0xe8, 0x6e, 0x70, 0xf2, 0x25, 0x1f, 0x1f, 0x17, 0xa9, 0x6d, 0x71, 0x36, 0x97, 0x47, 0x00, 0xa4, 0x02, 0xe0, 0x2c, 0x7c, 0xc1, 0xab, 0xd5, 0x31, 0x85, 0x35, 0xd4, 0xe6, 0x13, 0x02, 0xd6, 0x4b, 0x67, 0x48, 0x2b, 0xa9, 0xe9, 0x2e, 0x02, 0xb6, 0x4f, 0x82, 0xe5, 0x7a, 0x95, 0x19, 0xc6, 0x87, 0x3d, 0xfb, 0xa2, 0xb8, 0x79, 0x1e, 0x4d, 0x3b, 0x96, 0xcf, 0x4f, 0xbd, 0xcd, 0xa2, 0xa2, 0x1f, 0xa0, 0x82, 0xd3, 0xfc, 0x97, 0x05, 0x24, 0x36, 0x6b, 0xf3, 0x31, 0xa2, 0x35, 0x79, 0xef, 0xad, 0xf8, 0xae, 0xaf, 0xaf, 0xd8, 0xf2, 0xd8, 0x6d, 0xed, 0x6b, 0xda, 0x7b, 0x18, 0x1b, 0x5d, 0xff, 0x00, 0x52, 0xb1, 0x6d, 0xf0, 0x81, 0x31, 0xca, 0xf4, 0x6e, 0xb1, 0x80, 0xce, 0xb1, 0x84, 0xc0, 0x21, 0xb7, 0xd6, 0x77, 0x31, 0xd1, 0x27, 0xc1, 0xcd, 0xfe, 0xd2, 0xe3, 0xec, 0xe8, 0x1d, 0x45, 0x96, 0xb0, 0x9a, 0xb7, 0x87, 0x3f, 0x68, 0x2d, 0xf7, 0x01, 0x1f, 0xbe, 0xd1, 0xf4, 0x7f, 0xb4, 0xa4, 0x0d, 0x77, 0xbb, 0xfa, 0x8f, 0x80, 0x3a, 0x7f, 0x43, 0xaa, 0xe2, 0xdf, 0xd2, 0x65, 0x7e, 0x95, 0xe4, 0x0f, 0x1f, 0xa1, 0xfe, 0x6b, 0x16, 0x9f, 0x52, 0xfa, 0xc1, 0xd3, 0xba, 0x6d, 0x26, 0xdc, 0xac, 0x86, 0xd4, 0xd9, 0x0d, 0x31, 0x2e, 0x74, 0x9e, 0xdb, 0x59, 0x2e, 0x55, 0xe8, 0xc9, 0xb2, 0x96, 0xd5, 0x4b, 0x9f, 0xb8, 0x6d, 0xda, 0x1c, 0x04, 0x09, 0x03, 0xfe, 0x8a, 0xc6, 0xfa, 0xd3, 0xf5, 0x6a, 0xbe, 0xbb, 0x5b, 0x2e, 0xc6, 0xb5, 0x94, 0xe6, 0xd5, 0x20, 0x97, 0x7d, 0x1b, 0x1b, 0xf9, 0xad, 0x7c, 0x7d, 0x17, 0xb7, 0xf3, 0x1e, 0x92, 0x1b, 0x7f, 0xf8, 0xe0, 0x7d, 0x59, 0xdd, 0xfd, 0x32, 0xd8, 0x8f, 0xa5, 0xe8, 0x3a, 0x12, 0x5c, 0x3f, 0xfc, 0xc4, 0xfa, 0xc3, 0xb3, 0x77, 0xa7, 0x56, 0xed, 0xdb, 0x76, 0x7a, 0x8d, 0xdd, 0x1f, 0xbf, 0xfd, 0x44, 0x92, 0x56, 0x8f, 0xff, 0xd4, 0xf2, 0xe8, 0x86, 0x17, 0x1e, 0xfa, 0x04, 0x56, 0x4b, 0x43, 0x6c, 0x6f, 0x2d, 0xe5, 0x46, 0x01, 0x64, 0x2b, 0x14, 0x32, 0x5b, 0xb4, 0xa0, 0x52, 0x1d, 0xde, 0x9b, 0x94, 0xdb, 0xab, 0x6b, 0x81, 0xf7, 0x05, 0xb0, 0xd7, 0x07, 0xb2, 0x27, 0x55, 0xc6, 0x57, 0x65, 0xd8, 0x76, 0x6e, 0x64, 0xed, 0xee, 0x16, 0xce, 0x27, 0x57, 0x63, 0xda, 0x0c, 0xc2, 0x8e, 0x51, 0x67, 0x84, 0xfa, 0x1d, 0xdd, 0x62, 0xc7, 0x07, 0xe9, 0xf7, 0xa3, 0xd6, 0x6c, 0x02, 0x41, 0x55, 0x31, 0xf3, 0x2b, 0xb3, 0xba, 0x2b, 0x2e, 0x68, 0x24, 0x1d, 0x47, 0x64, 0xca, 0xa6, 0x50, 0x41, 0x65, 0x90, 0x6c, 0xb1, 0xa5, 0xae, 0x33, 0x23, 0x51, 0xe4, 0xab, 0x7d, 0x5d, 0xcb, 0xb6, 0xcc, 0x37, 0xd0, 0x40, 0x73, 0x71, 0xde, 0x58, 0x09, 0xe7, 0x6f, 0x2c, 0x44, 0xc9, 0xc9, 0xae, 0xba, 0x9d, 0x63, 0x88, 0x01, 0xa0, 0x95, 0x9d, 0xf5, 0x3f, 0x2a, 0xe6, 0x67, 0xdb, 0x50, 0x83, 0x55, 0xad, 0x36, 0x3e, 0x78, 0x10, 0x74, 0x77, 0xfd, 0x2d, 0xaa, 0x4c, 0x7d, 0x58, 0x73, 0x91, 0xa0, 0x0f, 0x51, 0x45, 0xb7, 0x33, 0xdd, 0x58, 0x69, 0x1d, 0xd8, 0x0c, 0x9f, 0x96, 0x88, 0x19, 0x99, 0x19, 0xac, 0xcf, 0xa3, 0xd2, 0xad, 0xb5, 0xdb, 0x76, 0x8f, 0xad, 0xc4, 0xea, 0xcf, 0xdf, 0x7e, 0xdf, 0xdd, 0xfc, 0xd5, 0xa3, 0x5e, 0x43, 0x2b, 0x6b, 0xb2, 0xad, 0x3b, 0x6a, 0xa4, 0x13, 0xa7, 0x04, 0xac, 0x7a, 0x6f, 0xb3, 0x23, 0x26, 0xcc, 0xfb, 0xb4, 0x75, 0x8e, 0x01, 0x83, 0xf7, 0x58, 0x3e, 0x8b, 0x53, 0xa7, 0x2a, 0x1a, 0x31, 0x42, 0x36, 0x5d, 0x4c, 0x9a, 0xf2, 0xdc, 0xc6, 0xfe, 0x98, 0xb4, 0x34, 0xcb, 0x48, 0x0a, 0x8f, 0xdb, 0xb2, 0xeb, 0x76, 0xd6, 0x07, 0x5c, 0x59, 0xc9, 0x64, 0x8f, 0x93, 0xa7, 0x73, 0x16, 0x83, 0xaf, 0x0e, 0xa4, 0x33, 0xef, 0x50, 0xc5, 0x0c, 0xda, 0x59, 0x10, 0x06, 0x8a, 0x2e, 0x29, 0x0e, 0xac, 0xc2, 0x31, 0x3d, 0x36, 0x69, 0x7e, 0xd6, 0xcc, 0xf5, 0x3d, 0x6f, 0xb3, 0xeb, 0x1b, 0x76, 0xef, 0x3b, 0xa3, 0xfa, 0xc9, 0x2b, 0x5f, 0x66, 0x6f, 0xa9, 0x1e, 0x73, 0xf2, 0x49, 0x2e, 0x39, 0xf7, 0x4f, 0xb7, 0x8d, 0xff, 0xd5, 0xf3, 0x26, 0xfe, 0x0a, 0xc5, 0x1b, 0xa7, 0xcb, 0xb2, 0xcf, 0x49, 0x03, 0xb2, 0x46, 0xee, 0xd9, 0xd9, 0xb3, 0xf4, 0x9f, 0x25, 0x4a, 0xdf, 0x4b, 0x77, 0xe8, 0x27, 0xd4, 0xef, 0x1c, 0x2a, 0x29, 0x26, 0xc5, 0x7c, 0x9d, 0x6c, 0x7f, 0xb7, 0x6e, 0x1b, 0x26, 0x7f, 0x05, 0xa3, 0xfe, 0x53, 0x8d, 0x62, 0x57, 0x30, 0x92, 0x12, 0xfa, 0x2f, 0x86, 0xdf, 0xa4, 0xec, 0x67, 0xfe, 0xd0, 0xf4, 0xff, 0x00, 0x4d, 0xfc, 0xdf, 0x78, 0xe1, 0x68, 0x7d, 0x54, 0x99, 0xbf, 0x6f, 0xf3, 0xbe, 0xdf, 0x8e, 0xdd, 0x7f, 0xef, 0xeb, 0x97, 0x49, 0x3e, 0x3b, 0x7f, 0x06, 0x2c, 0x9f, 0x37, 0x5f, 0xf0, 0x9f, 0x4c, 0xeb, 0x7b, 0xbf, 0x67, 0x55, 0xe8, 0xff, 0x00, 0x31, 0xbc, 0x7a, 0x9e, 0x31, 0xdb, 0xfe, 0x92, 0xae, 0x37, 0x7a, 0x4d, 0xdb, 0xe2, 0x17, 0x9d, 0xa4, 0xa3, 0xc9, 0xba, 0xfc, 0x7b, 0x7d, 0x5f, 0x52, 0xa7, 0x7e, 0xd1, 0x28, 0xf8, 0xf3, 0xb0, 0xc7, 0x32, 0xbc, 0x99, 0x24, 0xc5, 0xe3, 0xab, 0xeb, 0x1f, 0xa4, 0xf5, 0xfc, 0xe1, 0x25, 0xe4, 0xe9, 0x24, 0x97, 0xff, 0xd9, 0x00, 0x38, 0x42, 0x49, 0x4d, 0x04, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x41, 0x00, 0x64, 0x00, 0x6f, 0x00, 0x62, 0x00, 0x65, 0x00, 0x20, 0x00, 0x50, 0x00, 0x68, 0x00, 0x6f, 0x00, 0x74, 0x00, 0x6f, 0x00, 0x73, 0x00, 0x68, 0x00, 0x6f, 0x00, 0x70, 0x00, 0x00, 0x00, 0x13, 0x00, 0x41, 0x00, 0x64, 0x00, 0x6f, 0x00, 0x62, 0x00, 0x65, 0x00, 0x20, 0x00, 0x50, 0x00, 0x68, 0x00, 0x6f, 0x00, 0x74, 0x00, 0x6f, 0x00, 0x73, 0x00, 0x68, 0x00, 0x6f, 0x00, 0x70, 0x00, 0x20, 0x00, 0x37, 0x00, 0x2e, 0x00, 0x30, 0x00, 0x00, 0x00, 0x01, 0x00, 0x38, 0x42, 0x49, 0x4d, 0x04, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x05, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0xff, 0xe1, 0x15, 0x67, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6e, 0x73, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x78, 0x61, 0x70, 0x2f, 0x31, 0x2e, 0x30, 0x2f, 0x00, 0x3c, 0x3f, 0x78, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x20, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x3d, 0x27, 0xef, 0xbb, 0xbf, 0x27, 0x20, 0x69, 0x64, 0x3d, 0x27, 0x57, 0x35, 0x4d, 0x30, 0x4d, 0x70, 0x43, 0x65, 0x68, 0x69, 0x48, 0x7a, 0x72, 0x65, 0x53, 0x7a, 0x4e, 0x54, 0x63, 0x7a, 0x6b, 0x63, 0x39, 0x64, 0x27, 0x3f, 0x3e, 0x0a, 0x3c, 0x3f, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2d, 0x78, 0x61, 0x70, 0x2d, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x20, 0x65, 0x73, 0x63, 0x3d, 0x22, 0x43, 0x52, 0x22, 0x3f, 0x3e, 0x0a, 0x3c, 0x78, 0x3a, 0x78, 0x61, 0x70, 0x6d, 0x65, 0x74, 0x61, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x78, 0x3d, 0x27, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x3a, 0x6e, 0x73, 0x3a, 0x6d, 0x65, 0x74, 0x61, 0x2f, 0x27, 0x20, 0x78, 0x3a, 0x78, 0x61, 0x70, 0x74, 0x6b, 0x3d, 0x27, 0x58, 0x4d, 0x50, 0x20, 0x74, 0x6f, 0x6f, 0x6c, 0x6b, 0x69, 0x74, 0x20, 0x32, 0x2e, 0x38, 0x2e, 0x32, 0x2d, 0x33, 0x33, 0x2c, 0x20, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x20, 0x31, 0x2e, 0x35, 0x27, 0x3e, 0x0a, 0x3c, 0x72, 0x64, 0x66, 0x3a, 0x52, 0x44, 0x46, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x72, 0x64, 0x66, 0x3d, 0x27, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x31, 0x39, 0x39, 0x39, 0x2f, 0x30, 0x32, 0x2f, 0x32, 0x32, 0x2d, 0x72, 0x64, 0x66, 0x2d, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x2d, 0x6e, 0x73, 0x23, 0x27, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x69, 0x58, 0x3d, 0x27, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6e, 0x73, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x69, 0x58, 0x2f, 0x31, 0x2e, 0x30, 0x2f, 0x27, 0x3e, 0x0a, 0x0a, 0x20, 0x3c, 0x72, 0x64, 0x66, 0x3a, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x62, 0x6f, 0x75, 0x74, 0x3d, 0x27, 0x75, 0x75, 0x69, 0x64, 0x3a, 0x32, 0x32, 0x64, 0x30, 0x32, 0x62, 0x30, 0x61, 0x2d, 0x62, 0x32, 0x34, 0x39, 0x2d, 0x31, 0x31, 0x64, 0x62, 0x2d, 0x38, 0x61, 0x66, 0x38, 0x2d, 0x39, 0x31, 0x64, 0x35, 0x34, 0x30, 0x33, 0x66, 0x39, 0x32, 0x66, 0x39, 0x27, 0x0a, 0x20, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x70, 0x64, 0x66, 0x3d, 0x27, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6e, 0x73, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x64, 0x66, 0x2f, 0x31, 0x2e, 0x33, 0x2f, 0x27, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x21, 0x2d, 0x2d, 0x20, 0x70, 0x64, 0x66, 0x3a, 0x53, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x69, 0x73, 0x20, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x65, 0x64, 0x20, 0x2d, 0x2d, 0x3e, 0x0a, 0x20, 0x3c, 0x2f, 0x72, 0x64, 0x66, 0x3a, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x0a, 0x0a, 0x20, 0x3c, 0x72, 0x64, 0x66, 0x3a, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x62, 0x6f, 0x75, 0x74, 0x3d, 0x27, 0x75, 0x75, 0x69, 0x64, 0x3a, 0x32, 0x32, 0x64, 0x30, 0x32, 0x62, 0x30, 0x61, 0x2d, 0x62, 0x32, 0x34, 0x39, 0x2d, 0x31, 0x31, 0x64, 0x62, 0x2d, 0x38, 0x61, 0x66, 0x38, 0x2d, 0x39, 0x31, 0x64, 0x35, 0x34, 0x30, 0x33, 0x66, 0x39, 0x32, 0x66, 0x39, 0x27, 0x0a, 0x20, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x70, 0x68, 0x6f, 0x74, 0x6f, 0x73, 0x68, 0x6f, 0x70, 0x3d, 0x27, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6e, 0x73, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x68, 0x6f, 0x74, 0x6f, 0x73, 0x68, 0x6f, 0x70, 0x2f, 0x31, 0x2e, 0x30, 0x2f, 0x27, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x21, 0x2d, 0x2d, 0x20, 0x70, 0x68, 0x6f, 0x74, 0x6f, 0x73, 0x68, 0x6f, 0x70, 0x3a, 0x43, 0x61, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x73, 0x20, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x65, 0x64, 0x20, 0x2d, 0x2d, 0x3e, 0x0a, 0x20, 0x3c, 0x2f, 0x72, 0x64, 0x66, 0x3a, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x0a, 0x0a, 0x20, 0x3c, 0x72, 0x64, 0x66, 0x3a, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x62, 0x6f, 0x75, 0x74, 0x3d, 0x27, 0x75, 0x75, 0x69, 0x64, 0x3a, 0x32, 0x32, 0x64, 0x30, 0x32, 0x62, 0x30, 0x61, 0x2d, 0x62, 0x32, 0x34, 0x39, 0x2d, 0x31, 0x31, 0x64, 0x62, 0x2d, 0x38, 0x61, 0x66, 0x38, 0x2d, 0x39, 0x31, 0x64, 0x35, 0x34, 0x30, 0x33, 0x66, 0x39, 0x32, 0x66, 0x39, 0x27, 0x0a, 0x20, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x78, 0x61, 0x70, 0x3d, 0x27, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6e, 0x73, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x78, 0x61, 0x70, 0x2f, 0x31, 0x2e, 0x30, 0x2f, 0x27, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x21, 0x2d, 0x2d, 0x20, 0x78, 0x61, 0x70, 0x3a, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x73, 0x20, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x65, 0x64, 0x20, 0x2d, 0x2d, 0x3e, 0x0a, 0x20, 0x3c, 0x2f, 0x72, 0x64, 0x66, 0x3a, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x0a, 0x0a, 0x20, 0x3c, 0x72, 0x64, 0x66, 0x3a, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x62, 0x6f, 0x75, 0x74, 0x3d, 0x27, 0x75, 0x75, 0x69, 0x64, 0x3a, 0x32, 0x32, 0x64, 0x30, 0x32, 0x62, 0x30, 0x61, 0x2d, 0x62, 0x32, 0x34, 0x39, 0x2d, 0x31, 0x31, 0x64, 0x62, 0x2d, 0x38, 0x61, 0x66, 0x38, 0x2d, 0x39, 0x31, 0x64, 0x35, 0x34, 0x30, 0x33, 0x66, 0x39, 0x32, 0x66, 0x39, 0x27, 0x0a, 0x20, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x78, 0x61, 0x70, 0x4d, 0x4d, 0x3d, 0x27, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6e, 0x73, 0x2e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x78, 0x61, 0x70, 0x2f, 0x31, 0x2e, 0x30, 0x2f, 0x6d, 0x6d, 0x2f, 0x27, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x78, 0x61, 0x70, 0x4d, 0x4d, 0x3a, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x44, 0x3e, 0x61, 0x64, 0x6f, 0x62, 0x65, 0x3a, 0x64, 0x6f, 0x63, 0x69, 0x64, 0x3a, 0x70, 0x68, 0x6f, 0x74, 0x6f, 0x73, 0x68, 0x6f, 0x70, 0x3a, 0x32, 0x32, 0x64, 0x30, 0x32, 0x62, 0x30, 0x36, 0x2d, 0x62, 0x32, 0x34, 0x39, 0x2d, 0x31, 0x31, 0x64, 0x62, 0x2d, 0x38, 0x61, 0x66, 0x38, 0x2d, 0x39, 0x31, 0x64, 0x35, 0x34, 0x30, 0x33, 0x66, 0x39, 0x32, 0x66, 0x39, 0x3c, 0x2f, 0x78, 0x61, 0x70, 0x4d, 0x4d, 0x3a, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x44, 0x3e, 0x0a, 0x20, 0x3c, 0x2f, 0x72, 0x64, 0x66, 0x3a, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x0a, 0x0a, 0x20, 0x3c, 0x72, 0x64, 0x66, 0x3a, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x62, 0x6f, 0x75, 0x74, 0x3d, 0x27, 0x75, 0x75, 0x69, 0x64, 0x3a, 0x32, 0x32, 0x64, 0x30, 0x32, 0x62, 0x30, 0x61, 0x2d, 0x62, 0x32, 0x34, 0x39, 0x2d, 0x31, 0x31, 0x64, 0x62, 0x2d, 0x38, 0x61, 0x66, 0x38, 0x2d, 0x39, 0x31, 0x64, 0x35, 0x34, 0x30, 0x33, 0x66, 0x39, 0x32, 0x66, 0x39, 0x27, 0x0a, 0x20, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3a, 0x64, 0x63, 0x3d, 0x27, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x70, 0x75, 0x72, 0x6c, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x64, 0x63, 0x2f, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x31, 0x2e, 0x31, 0x2f, 0x27, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x64, 0x63, 0x3a, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x3c, 0x72, 0x64, 0x66, 0x3a, 0x41, 0x6c, 0x74, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x72, 0x64, 0x66, 0x3a, 0x6c, 0x69, 0x20, 0x78, 0x6d, 0x6c, 0x3a, 0x6c, 0x61, 0x6e, 0x67, 0x3d, 0x27, 0x78, 0x2d, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x27, 0x3e, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x72, 0x64, 0x66, 0x3a, 0x6c, 0x69, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x72, 0x64, 0x66, 0x3a, 0x41, 0x6c, 0x74, 0x3e, 0x0a, 0x20, 0x20, 0x3c, 0x2f, 0x64, 0x63, 0x3a, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x0a, 0x20, 0x3c, 0x2f, 0x72, 0x64, 0x66, 0x3a, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x3e, 0x0a, 0x0a, 0x3c, 0x2f, 0x72, 0x64, 0x66, 0x3a, 0x52, 0x44, 0x46, 0x3e, 0x0a, 0x3c, 0x2f, 0x78, 0x3a, 0x78, 0x61, 0x70, 0x6d, 0x65, 0x74, 0x61, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0a, 0x3c, 0x3f, 0x78, 0x70, 0x61, 0x63, 0x6b, 0x65, 0x74, 0x20, 0x65, 0x6e, 0x64, 0x3d, 0x27, 0x77, 0x27, 0x3f, 0x3e, 0xff, 0xee, 0x00, 0x0e, 0x41, 0x64, 0x6f, 0x62, 0x65, 0x00, 0x64, 0x40, 0x00, 0x00, 0x00, 0x01, 0xff, 0xdb, 0x00, 0x84, 0x00, 0x04, 0x03, 0x03, 0x03, 0x03, 0x03, 0x04, 0x03, 0x03, 0x04, 0x06, 0x04, 0x03, 0x04, 0x06, 0x07, 0x05, 0x04, 0x04, 0x05, 0x07, 0x08, 0x06, 0x06, 0x07, 0x06, 0x06, 0x08, 0x0a, 0x08, 0x09, 0x09, 0x09, 0x09, 0x08, 0x0a, 0x0a, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0a, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x01, 0x04, 0x05, 0x05, 0x08, 0x07, 0x08, 0x0f, 0x0a, 0x0a, 0x0f, 0x14, 0x0e, 0x0e, 0x0e, 0x14, 0x14, 0x0e, 0x0e, 0x0e, 0x0e, 0x14, 0x11, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x11, 0x11, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x11, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0xff, 0xc0, 0x00, 0x11, 0x08, 0x00, 0x64, 0x00, 0x64, 0x03, 0x01, 0x11, 0x00, 0x02, 0x11, 0x01, 0x03, 0x11, 0x01, 0xff, 0xdd, 0x00, 0x04, 0x00, 0x0d, 0xff, 0xc4, 0x01, 0xa2, 0x00, 0x00, 0x00, 0x07, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x05, 0x03, 0x02, 0x06, 0x01, 0x00, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x01, 0x00, 0x02, 0x02, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x10, 0x00, 0x02, 0x01, 0x03, 0x03, 0x02, 0x04, 0x02, 0x06, 0x07, 0x03, 0x04, 0x02, 0x06, 0x02, 0x73, 0x01, 0x02, 0x03, 0x11, 0x04, 0x00, 0x05, 0x21, 0x12, 0x31, 0x41, 0x51, 0x06, 0x13, 0x61, 0x22, 0x71, 0x81, 0x14, 0x32, 0x91, 0xa1, 0x07, 0x15, 0xb1, 0x42, 0x23, 0xc1, 0x52, 0xd1, 0xe1, 0x33, 0x16, 0x62, 0xf0, 0x24, 0x72, 0x82, 0xf1, 0x25, 0x43, 0x34, 0x53, 0x92, 0xa2, 0xb2, 0x63, 0x73, 0xc2, 0x35, 0x44, 0x27, 0x93, 0xa3, 0xb3, 0x36, 0x17, 0x54, 0x64, 0x74, 0xc3, 0xd2, 0xe2, 0x08, 0x26, 0x83, 0x09, 0x0a, 0x18, 0x19, 0x84, 0x94, 0x45, 0x46, 0xa4, 0xb4, 0x56, 0xd3, 0x55, 0x28, 0x1a, 0xf2, 0xe3, 0xf3, 0xc4, 0xd4, 0xe4, 0xf4, 0x65, 0x75, 0x85, 0x95, 0xa5, 0xb5, 0xc5, 0xd5, 0xe5, 0xf5, 0x66, 0x76, 0x86, 0x96, 0xa6, 0xb6, 0xc6, 0xd6, 0xe6, 0xf6, 0x37, 0x47, 0x57, 0x67, 0x77, 0x87, 0x97, 0xa7, 0xb7, 0xc7, 0xd7, 0xe7, 0xf7, 0x38, 0x48, 0x58, 0x68, 0x78, 0x88, 0x98, 0xa8, 0xb8, 0xc8, 0xd8, 0xe8, 0xf8, 0x29, 0x39, 0x49, 0x59, 0x69, 0x79, 0x89, 0x99, 0xa9, 0xb9, 0xc9, 0xd9, 0xe9, 0xf9, 0x2a, 0x3a, 0x4a, 0x5a, 0x6a, 0x7a, 0x8a, 0x9a, 0xaa, 0xba, 0xca, 0xda, 0xea, 0xfa, 0x11, 0x00, 0x02, 0x02, 0x01, 0x02, 0x03, 0x05, 0x05, 0x04, 0x05, 0x06, 0x04, 0x08, 0x03, 0x03, 0x6d, 0x01, 0x00, 0x02, 0x11, 0x03, 0x04, 0x21, 0x12, 0x31, 0x41, 0x05, 0x51, 0x13, 0x61, 0x22, 0x06, 0x71, 0x81, 0x91, 0x32, 0xa1, 0xb1, 0xf0, 0x14, 0xc1, 0xd1, 0xe1, 0x23, 0x42, 0x15, 0x52, 0x62, 0x72, 0xf1, 0x33, 0x24, 0x34, 0x43, 0x82, 0x16, 0x92, 0x53, 0x25, 0xa2, 0x63, 0xb2, 0xc2, 0x07, 0x73, 0xd2, 0x35, 0xe2, 0x44, 0x83, 0x17, 0x54, 0x93, 0x08, 0x09, 0x0a, 0x18, 0x19, 0x26, 0x36, 0x45, 0x1a, 0x27, 0x64, 0x74, 0x55, 0x37, 0xf2, 0xa3, 0xb3, 0xc3, 0x28, 0x29, 0xd3, 0xe3, 0xf3, 0x84, 0x94, 0xa4, 0xb4, 0xc4, 0xd4, 0xe4, 0xf4, 0x65, 0x75, 0x85, 0x95, 0xa5, 0xb5, 0xc5, 0xd5, 0xe5, 0xf5, 0x46, 0x56, 0x66, 0x76, 0x86, 0x96, 0xa6, 0xb6, 0xc6, 0xd6, 0xe6, 0xf6, 0x47, 0x57, 0x67, 0x77, 0x87, 0x97, 0xa7, 0xb7, 0xc7, 0xd7, 0xe7, 0xf7, 0x38, 0x48, 0x58, 0x68, 0x78, 0x88, 0x98, 0xa8, 0xb8, 0xc8, 0xd8, 0xe8, 0xf8, 0x39, 0x49, 0x59, 0x69, 0x79, 0x89, 0x99, 0xa9, 0xb9, 0xc9, 0xd9, 0xe9, 0xf9, 0x2a, 0x3a, 0x4a, 0x5a, 0x6a, 0x7a, 0x8a, 0x9a, 0xaa, 0xba, 0xca, 0xda, 0xea, 0xfa, 0xff, 0xda, 0x00, 0x0c, 0x03, 0x01, 0x00, 0x02, 0x11, 0x03, 0x11, 0x00, 0x3f, 0x00, 0xf0, 0x67, 0xa6, 0x5c, 0x0f, 0x01, 0xd4, 0x7e, 0x18, 0x12, 0x98, 0xe9, 0xd6, 0x2d, 0x34, 0x6d, 0x70, 0xdf, 0xdc, 0xa1, 0xe3, 0xec, 0x5b, 0xfb, 0x32, 0x24, 0xb2, 0x01, 0x1f, 0x15, 0xa4, 0x52, 0x4a, 0x82, 0x31, 0xf1, 0xfe, 0xd1, 0x3d, 0x14, 0x64, 0x49, 0x64, 0x22, 0x98, 0xcf, 0xa5, 0x46, 0x6c, 0x16, 0x55, 0x71, 0x56, 0x62, 0x28, 0x07, 0xc5, 0x45, 0x15, 0xa0, 0xc8, 0x89, 0x33, 0xe1, 0x63, 0xd2, 0xd8, 0x34, 0x44, 0x17, 0xa0, 0x2c, 0x4d, 0x16, 0xbb, 0xed, 0xdc, 0xf8, 0x64, 0xc1, 0x6b, 0x31, 0x42, 0x18, 0x8e, 0xc7, 0xb5, 0x2a, 0x7d, 0xb2, 0x56, 0xc5, 0x61, 0x8c, 0xf2, 0xa0, 0x1b, 0x1e, 0x83, 0x0d, 0xa1, 0x63, 0x50, 0x1f, 0x97, 0x7c, 0x2a, 0xa9, 0x1a, 0x9a, 0x86, 0x4f, 0xb4, 0xb4, 0x38, 0x0a, 0xa6, 0x0b, 0xb8, 0x0c, 0x05, 0x14, 0xf8, 0x76, 0x3e, 0x19, 0x14, 0xb6, 0x78, 0xf8, 0x8c, 0x2a, 0xd5, 0x01, 0xdc, 0x6f, 0x8a, 0x1a, 0xe3, 0x8d, 0xab, 0xff, 0xd0, 0xf0, 0xec, 0xe9, 0x15, 0xb5, 0xb9, 0x5a, 0x7c, 0x4c, 0xa2, 0x9e, 0x24, 0xf5, 0xca, 0xc6, 0xe5, 0x99, 0xd9, 0x34, 0x99, 0x04, 0x3a, 0x7d, 0xb5, 0xba, 0xd5, 0x51, 0x63, 0x0e, 0xc7, 0xc5, 0x9b, 0x73, 0xf8, 0xe4, 0x6f, 0x76, 0xca, 0xd9, 0xda, 0x54, 0x6d, 0x72, 0x2e, 0x1a, 0x57, 0x11, 0x44, 0x40, 0x0d, 0x27, 0x7a, 0x0f, 0xd9, 0x5f, 0x12, 0x69, 0x4c, 0x84, 0xcd, 0x36, 0xe3, 0x85, 0xb2, 0xcd, 0x2f, 0x4a, 0x8b, 0x58, 0x36, 0xf6, 0x76, 0xa8, 0x64, 0x64, 0x3c, 0xa4, 0x93, 0xaa, 0x25, 0x3c, 0x49, 0xda, 0xa4, 0xe5, 0x26, 0x54, 0xe4, 0x8c, 0x7c, 0x5c, 0x93, 0x4d, 0x67, 0xc9, 0x3a, 0x6e, 0x9f, 0x13, 0xb4, 0xce, 0xf7, 0x3a, 0x9b, 0xad, 0x52, 0xd6, 0x2a, 0xd1, 0x49, 0xee, 0xc7, 0xf8, 0x64, 0x46, 0x42, 0x4e, 0xcd, 0x92, 0xc2, 0x00, 0xdd, 0x8a, 0x47, 0xe5, 0x69, 0x6e, 0xd4, 0xa4, 0x08, 0x16, 0x83, 0x9c, 0x8c, 0xdd, 0x95, 0x6b, 0xb9, 0xf6, 0xef, 0x97, 0x78, 0x94, 0xe3, 0x78, 0x04, 0xa4, 0xf3, 0xe8, 0xee, 0x64, 0xe1, 0x12, 0x10, 0x05, 0x6a, 0xc7, 0xc0, 0x6f, 0x53, 0xf3, 0xc9, 0x89, 0xb4, 0x9c, 0x4e, 0xb4, 0xf2, 0xd3, 0xde, 0x7a, 0xd2, 0x19, 0x16, 0x38, 0x61, 0x5d, 0xd9, 0x88, 0x05, 0x9c, 0xf4, 0x0a, 0x0f, 0x5f, 0x73, 0x84, 0xe4, 0xa4, 0xc7, 0x0d, 0xa5, 0xf1, 0x59, 0xba, 0x5c, 0x08, 0x98, 0x6f, 0xc8, 0x20, 0xfa, 0x4e, 0x4e, 0xf6, 0x69, 0xe1, 0xa2, 0x89, 0xfd, 0x1f, 0x77, 0x2c, 0xe6, 0xce, 0xd6, 0x17, 0x9a, 0x69, 0xdb, 0xd3, 0x86, 0x18, 0xc1, 0x67, 0x77, 0x26, 0x80, 0x28, 0x1b, 0x93, 0x88, 0x41, 0x0f, 0x40, 0xb0, 0xfc, 0x87, 0xf3, 0x43, 0x98, 0xd7, 0x58, 0x96, 0xdb, 0x4d, 0x91, 0x88, 0xe5, 0x6c, 0x58, 0xdc, 0x5c, 0x2a, 0xf7, 0x2c, 0xb1, 0xfc, 0x20, 0x8f, 0x02, 0xd9, 0x65, 0x06, 0xbe, 0x26, 0x6f, 0xa2, 0x7f, 0xce, 0x3d, 0x69, 0x26, 0xdd, 0x13, 0x52, 0xbf, 0xbd, 0x92, 0x62, 0x59, 0x4c, 0x90, 0xac, 0x50, 0x45, 0x5e, 0xbb, 0x09, 0x03, 0x12, 0x29, 0x84, 0x00, 0xc4, 0xc9, 0x11, 0xff, 0x00, 0x42, 0xe7, 0xa7, 0x7a, 0xd4, 0xfd, 0x21, 0x79, 0xe9, 0x78, 0x71, 0x8b, 0x95, 0x39, 0x75, 0xaf, 0x4e, 0x98, 0x78, 0x42, 0x38, 0xdf, 0xff, 0xd1, 0xf0, 0xe6, 0xa0, 0x58, 0xc8, 0x84, 0x9a, 0xaa, 0x30, 0x55, 0xf9, 0x0a, 0x6f, 0x90, 0x0c, 0xca, 0x72, 0x48, 0xb8, 0x1e, 0x89, 0xa7, 0x23, 0x17, 0x24, 0xff, 0x00, 0x61, 0xb6, 0x54, 0x76, 0x6e, 0x1b, 0xa7, 0xbe, 0x50, 0xf2, 0xc1, 0xd7, 0x4c, 0x52, 0x5e, 0x33, 0x5b, 0xe9, 0x10, 0xf4, 0x54, 0x3c, 0x5e, 0x77, 0xee, 0x49, 0xec, 0x2b, 0xb6, 0x63, 0xe4, 0xc9, 0xc3, 0xef, 0x73, 0xf0, 0xe1, 0x32, 0x1b, 0xf2, 0x7a, 0x05, 0xce, 0xad, 0x65, 0xa1, 0x98, 0xb4, 0x0f, 0x2a, 0x5b, 0x23, 0xeb, 0x12, 0x00, 0x88, 0xb0, 0xa8, 0x66, 0x46, 0x3d, 0xea, 0x7b, 0xfb, 0x9e, 0x99, 0x89, 0xbc, 0x8d, 0x97, 0x3a, 0x34, 0x05, 0x32, 0x5d, 0x1f, 0xc9, 0x1a, 0x8c, 0x36, 0x8c, 0x6f, 0x66, 0xfa, 0xc6, 0xb7, 0x7d, 0xf0, 0x94, 0x04, 0xf0, 0x88, 0xc9, 0xd5, 0x9d, 0x8d, 0x4b, 0x11, 0xd4, 0x9f, 0xbb, 0x25, 0xc5, 0xdc, 0xa2, 0x03, 0x99, 0x4b, 0xbc, 0xf3, 0x0d, 0x97, 0x96, 0x74, 0xe5, 0xf2, 0xb6, 0x80, 0x95, 0xbd, 0x99, 0x15, 0xf5, 0x4b, 0xd2, 0x37, 0x58, 0x46, 0xd4, 0x27, 0xc5, 0xce, 0xc1, 0x7c, 0x30, 0x8e, 0x68, 0x94, 0x7b, 0x9e, 0x6d, 0xe6, 0x7b, 0x9b, 0x5d, 0x3a, 0xd8, 0xdb, 0x32, 0xfa, 0x77, 0x65, 0x15, 0xe4, 0x57, 0xa7, 0x21, 0x55, 0x04, 0x57, 0xef, 0xd8, 0x66, 0x56, 0x38, 0x19, 0x1b, 0xe8, 0xe0, 0x67, 0x98, 0xc7, 0x1a, 0x1c, 0xde, 0x71, 0x71, 0x79, 0x2c, 0xf2, 0xfa, 0x8c, 0x48, 0xec, 0xb5, 0x24, 0x9a, 0x0c, 0xce, 0x75, 0x29, 0xae, 0x8c, 0x67, 0xd4, 0xb5, 0x0b, 0x4b, 0x04, 0x05, 0xef, 0x2e, 0x66, 0x8e, 0x18, 0x08, 0x15, 0xdd, 0x8f, 0x11, 0xb0, 0xeb, 0x4c, 0x04, 0x5b, 0x21, 0x2a, 0x7d, 0x41, 0xe4, 0x4f, 0xcb, 0xcb, 0x5d, 0x12, 0x45, 0xb8, 0xb7, 0x53, 0x71, 0xaa, 0x9f, 0x86, 0x5b, 0xd6, 0x50, 0x4a, 0xed, 0xba, 0x46, 0x77, 0x00, 0x13, 0xd4, 0x8c, 0x85, 0xd3, 0x12, 0x6d, 0xeb, 0x1a, 0x67, 0x95, 0xd9, 0x39, 0x39, 0x50, 0xac, 0xff, 0x00, 0x6f, 0xc4, 0xff, 0x00, 0x1c, 0x81, 0x92, 0xb2, 0x6b, 0x6d, 0x02, 0xdd, 0xbd, 0x36, 0x92, 0x36, 0x2d, 0x1f, 0xc0, 0x2a, 0x0b, 0x28, 0x1b, 0x91, 0x41, 0xf4, 0x9c, 0xb6, 0x25, 0x81, 0x46, 0xfe, 0x81, 0xb5, 0xad, 0x3d, 0xba, 0x57, 0xb7, 0xf9, 0xf6, 0xc9, 0xb0, 0x7f, 0xff, 0xd2, 0xf0, 0xe2, 0x86, 0x95, 0xc4, 0x67, 0x7e, 0x3f, 0x11, 0xf7, 0xa8, 0x19, 0x06, 0x69, 0x8d, 0xca, 0xca, 0x24, 0x8f, 0xd3, 0x52, 0x24, 0x89, 0x47, 0x25, 0x1f, 0xcb, 0x20, 0xf8, 0xb2, 0xb2, 0x76, 0x6e, 0x88, 0x36, 0xf6, 0x6f, 0x2a, 0xc1, 0x6e, 0xfa, 0x45, 0xad, 0xbc, 0x3f, 0x0b, 0x46, 0x81, 0x4d, 0x46, 0xea, 0x7a, 0x9a, 0x83, 0x9a, 0xa9, 0xdd, 0xbb, 0xec, 0x7b, 0x06, 0x5b, 0xe5, 0xcf, 0x2e, 0x69, 0xfa, 0x5c, 0xcd, 0x7b, 0x14, 0x5e, 0xa5, 0xee, 0xf5, 0xb8, 0x7d, 0xdd, 0x99, 0xba, 0xef, 0x91, 0x16, 0x5b, 0x36, 0xb6, 0x65, 0x0d, 0xac, 0xb2, 0x5b, 0xed, 0x34, 0x81, 0x7a, 0xbb, 0x46, 0x40, 0x6a, 0x9e, 0xb4, 0x39, 0x31, 0x13, 0x49, 0xda, 0xd2, 0x9b, 0xed, 0x1e, 0xc4, 0x24, 0xb3, 0x35, 0xb2, 0x88, 0x60, 0x06, 0xe6, 0x56, 0x98, 0x96, 0x79, 0x1e, 0x31, 0x51, 0xc9, 0x8f, 0xcb, 0x00, 0xe6, 0xb3, 0xe4, 0xf9, 0x2b, 0xcc, 0x7a, 0x94, 0xda, 0x96, 0xa9, 0x71, 0x77, 0x70, 0x79, 0xcd, 0x33, 0x97, 0x76, 0x3f, 0xcc, 0xc6, 0xa6, 0x9f, 0x2e, 0x99, 0xb9, 0xc6, 0x2a, 0x21, 0xe6, 0x73, 0xca, 0xe6, 0x4a, 0x51, 0x1a, 0x99, 0x1c, 0x28, 0x04, 0x93, 0xd0, 0x0e, 0xa4, 0xe4, 0xda, 0x5f, 0x50, 0xfe, 0x4a, 0xfe, 0x48, 0xb5, 0xb2, 0xc1, 0xe6, 0x1f, 0x31, 0x7e, 0xef, 0x52, 0x91, 0x43, 0xc3, 0x6e, 0x77, 0xf4, 0x22, 0x6d, 0xbf, 0xe4, 0x63, 0x0e, 0xbf, 0xca, 0x36, 0xeb, 0x5c, 0x84, 0xa5, 0x48, 0x7d, 0x3b, 0x61, 0xa1, 0xdb, 0x5b, 0x2c, 0x71, 0xda, 0x45, 0xc4, 0x28, 0x00, 0x81, 0xdb, 0x31, 0xc9, 0xb4, 0xb2, 0x3b, 0x5d, 0x27, 0xa5, 0x05, 0x1b, 0xc7, 0xdb, 0x10, 0xa9, 0xbd, 0xa6, 0x93, 0x0c, 0x75, 0xe4, 0x39, 0x35, 0x41, 0x3d, 0xc5, 0x06, 0xdb, 0x8e, 0xfd, 0x46, 0x5b, 0x1d, 0x98, 0x95, 0x4f, 0x46, 0xdb, 0xd5, 0xfb, 0x29, 0x5e, 0x9d, 0x0d, 0x32, 0xeb, 0x61, 0x4f, 0xff, 0xd3, 0xf1, 0x46, 0x9a, 0x16, 0x1b, 0x91, 0x71, 0x28, 0xac, 0x4a, 0x14, 0x30, 0x3e, 0x19, 0x54, 0xb9, 0x36, 0xc7, 0x9b, 0x2d, 0xd1, 0x6c, 0x45, 0xe3, 0xdc, 0xde, 0xc8, 0x95, 0x5b, 0x87, 0xf8, 0x41, 0x1d, 0x10, 0x54, 0x01, 0x98, 0x79, 0x25, 0xd1, 0xda, 0xe9, 0xe1, 0xb5, 0x9e, 0xac, 0xeb, 0x42, 0xba, 0x8e, 0xdf, 0x8c, 0x31, 0x21, 0x70, 0xb4, 0x5d, 0xbe, 0xc5, 0x7c, 0x2b, 0xed, 0xe1, 0x94, 0x18, 0xb9, 0x51, 0x3d, 0x03, 0x2c, 0x13, 0x6b, 0xf1, 0x42, 0x6e, 0xe2, 0xb7, 0x12, 0xa0, 0xdd, 0x50, 0x9f, 0x4f, 0x6f, 0xa7, 0x6f, 0xc7, 0x03, 0x61, 0xa0, 0x83, 0xb5, 0xf3, 0x97, 0x98, 0x20, 0x9c, 0x44, 0xea, 0xd0, 0xad, 0x48, 0x64, 0x90, 0x21, 0xd8, 0x9f, 0xa7, 0xa6, 0x44, 0xca, 0x99, 0xc6, 0x36, 0xcb, 0x74, 0x5d, 0x7e, 0x5b, 0xfe, 0x31, 0x6a, 0x31, 0xf3, 0x8c, 0xd0, 0xad, 0x40, 0xa3, 0x1f, 0x7c, 0x44, 0xd6, 0x51, 0xd9, 0xe0, 0x5f, 0x9a, 0x7e, 0x41, 0x9f, 0x40, 0xf3, 0x14, 0xba, 0x85, 0xba, 0x34, 0xba, 0x2d, 0xfb, 0x34, 0xd0, 0xcf, 0x4f, 0xb0, 0xce, 0x6a, 0x51, 0xe9, 0xb0, 0x20, 0xf4, 0xf1, 0x19, 0xb2, 0xc3, 0x90, 0x11, 0x4e, 0x97, 0x55, 0x80, 0x83, 0xc4, 0x17, 0x7e, 0x4c, 0x79, 0x19, 0xfc, 0xd1, 0xe7, 0x78, 0x4b, 0x91, 0x1d, 0xae, 0x92, 0xa6, 0xf6, 0x46, 0x75, 0xe4, 0xad, 0x22, 0x1f, 0xdd, 0xa1, 0x07, 0xb3, 0x1e, 0xfe, 0xd9, 0x92, 0xeb, 0x4b, 0xed, 0xfd, 0x0a, 0xc2, 0x63, 0x27, 0xa4, 0x88, 0x17, 0x60, 0x49, 0x35, 0xdc, 0x8e, 0xa5, 0x7d, 0xab, 0xd3, 0x28, 0x90, 0x50, 0xcd, 0xed, 0x2d, 0xda, 0x15, 0x55, 0x51, 0xf1, 0x1a, 0x0a, 0xf7, 0x39, 0x5d, 0xaa, 0x77, 0x6f, 0x01, 0x8e, 0xa7, 0x7d, 0xfa, 0xff, 0x00, 0x66, 0x10, 0xa8, 0xb8, 0x63, 0x76, 0x90, 0xa8, 0x20, 0x06, 0x56, 0xdb, 0x61, 0xda, 0xbd, 0x4f, 0xcb, 0x24, 0x15, 0x0f, 0xf5, 0x66, 0xe5, 0x5f, 0x4c, 0x53, 0xc3, 0xb7, 0xce, 0x99, 0x6b, 0x17, 0xff, 0xd4, 0xf0, 0xec, 0x57, 0x6f, 0x32, 0xa5, 0xa4, 0x43, 0x76, 0x75, 0xa9, 0xf1, 0x03, 0xfa, 0x64, 0x08, 0x6c, 0x8e, 0xfb, 0x3d, 0x7f, 0xcb, 0x16, 0x2b, 0x3d, 0xbc, 0x16, 0xa3, 0x66, 0x6d, 0x98, 0xfb, 0x1e, 0xb9, 0xac, 0xc8, 0x77, 0xb7, 0x7d, 0x01, 0xb3, 0x37, 0xb8, 0xd3, 0x46, 0x95, 0x68, 0x86, 0xd2, 0x2e, 0x4e, 0xab, 0xf0, 0x23, 0x11, 0x4e, 0x5f, 0xcd, 0x98, 0xe7, 0x25, 0x96, 0x71, 0x83, 0x0f, 0xd6, 0x3c, 0xb9, 0xe7, 0x0d, 0x7c, 0x41, 0x22, 0x5e, 0xb3, 0x20, 0x0c, 0x65, 0x80, 0xc8, 0x63, 0x8e, 0xbb, 0x95, 0xa5, 0x07, 0xeb, 0xcc, 0xac, 0x73, 0x83, 0x4e, 0x5c, 0x59, 0x09, 0xd8, 0xec, 0xc8, 0x57, 0x41, 0xd3, 0x4e, 0x95, 0xa5, 0x5b, 0x4b, 0x6a, 0xcb, 0xab, 0x43, 0x10, 0x4b, 0xeb, 0x85, 0xa2, 0x2c, 0x8e, 0x3f, 0x68, 0x54, 0xf5, 0x00, 0xd3, 0x97, 0x7a, 0x65, 0x79, 0xa6, 0x24, 0x76, 0x6f, 0xd3, 0x62, 0x96, 0x30, 0x78, 0xcb, 0x21, 0xf2, 0xf4, 0x22, 0xce, 0x54, 0x8e, 0x46, 0x26, 0x10, 0x7e, 0x0a, 0xf5, 0xd8, 0xf5, 0x1f, 0x31, 0x98, 0x83, 0x73, 0xb3, 0x91, 0xcd, 0x67, 0xe6, 0x7d, 0xe8, 0x16, 0x69, 0x6f, 0x10, 0x1f, 0x54, 0x9a, 0x37, 0xf5, 0x41, 0x5e, 0x7f, 0x0a, 0x29, 0x62, 0x02, 0xf8, 0x9c, 0xc8, 0x8c, 0x77, 0x6a, 0x99, 0xa0, 0x89, 0xff, 0x00, 0x9c, 0x74, 0xd2, 0xed, 0xed, 0xfc, 0xbb, 0x7b, 0xaa, 0x9a, 0x7d, 0x62, 0xfe, 0x46, 0x2d, 0xfe, 0x4c, 0x51, 0x31, 0x11, 0xa9, 0xf6, 0xef, 0x9b, 0x30, 0x5e, 0x7b, 0x38, 0xdd, 0xf4, 0x7f, 0x95, 0x94, 0xbc, 0x12, 0x43, 0x30, 0x6a, 0xb2, 0xf3, 0x86, 0x40, 0x3e, 0xcb, 0xd7, 0x6a, 0xd7, 0xb1, 0xe9, 0x8f, 0x37, 0x19, 0x97, 0x41, 0x2c, 0x71, 0x20, 0xf5, 0x36, 0x9c, 0x55, 0x78, 0x1d, 0x8a, 0x91, 0xd7, 0x11, 0x14, 0x5a, 0x3e, 0x19, 0x03, 0x10, 0x6b, 0xca, 0xbd, 0x86, 0xf8, 0x9d, 0x95, 0x18, 0x36, 0x65, 0x2e, 0xbc, 0x54, 0x1f, 0xa2, 0x99, 0x00, 0x59, 0x2a, 0x6f, 0x5e, 0x55, 0x15, 0xe9, 0x5f, 0xc3, 0x2f, 0xb6, 0x14, 0xff, 0x00, 0xff, 0xd5, 0xf1, 0x95, 0xfe, 0x80, 0x74, 0x0d, 0x7c, 0xd9, 0x89, 0x3d, 0x78, 0x57, 0x8b, 0xc5, 0x28, 0xe8, 0x55, 0xf7, 0x1f, 0x48, 0xca, 0x38, 0xb8, 0x83, 0x9f, 0x93, 0x07, 0x85, 0x3a, 0x7a, 0x6f, 0x95, 0x66, 0x2b, 0x2c, 0x4c, 0x0d, 0x14, 0x00, 0x3e, 0x9c, 0xc3, 0x98, 0x76, 0xb8, 0x45, 0xbd, 0x02, 0xde, 0x48, 0xee, 0xdc, 0xa0, 0x15, 0xe2, 0x2b, 0xc8, 0x8a, 0x8a, 0xfd, 0x3b, 0x66, 0x3f, 0x00, 0x73, 0x84, 0x2d, 0x36, 0xb5, 0xb5, 0x9e, 0x35, 0x1c, 0x29, 0xc4, 0xfe, 0xc8, 0x04, 0x7f, 0xc4, 0x69, 0x91, 0xe1, 0x67, 0x2c, 0x4a, 0xd2, 0xe9, 0x4e, 0xe3, 0xd4, 0xf4, 0x81, 0x5a, 0x12, 0xc5, 0x41, 0x3f, 0x79, 0x38, 0x9b, 0x60, 0x20, 0x07, 0x34, 0xb0, 0xc9, 0x03, 0x5c, 0x23, 0x03, 0x53, 0x13, 0x56, 0x88, 0xdf, 0x09, 0xda, 0x9b, 0xd3, 0xb6, 0x52, 0x0e, 0xec, 0xe4, 0x29, 0x24, 0xfc, 0xd0, 0xe7, 0x75, 0xe5, 0x57, 0x6b, 0x61, 0xfb, 0xf0, 0xca, 0xaa, 0x57, 0xa8, 0xe6, 0x78, 0x1a, 0x7d, 0xf9, 0x95, 0x8a, 0x5e, 0xa0, 0xe3, 0x67, 0x8f, 0xa0, 0xbd, 0x5b, 0xf2, 0xdf, 0x4a, 0x82, 0xcb, 0x4a, 0xb3, 0xb0, 0xb4, 0x41, 0x0a, 0x70, 0x48, 0xd9, 0x57, 0x60, 0x51, 0x3a, 0x8f, 0xbc, 0xe6, 0x7b, 0xcb, 0xe4, 0x3b, 0xa7, 0x3f, 0x9b, 0x9f, 0x9a, 0xba, 0x77, 0xe5, 0x5f, 0x95, 0x9c, 0x59, 0x94, 0x9f, 0xcd, 0x37, 0x8c, 0xa9, 0xa6, 0xd9, 0x39, 0xaa, 0xd0, 0x7d, 0xa9, 0x1c, 0x03, 0x5e, 0x09, 0xff, 0x00, 0x0c, 0x76, 0xcb, 0x62, 0x2d, 0xa5, 0xf2, 0x85, 0xbf, 0xe7, 0x87, 0xe6, 0xa3, 0x5e, 0x4d, 0xa8, 0xc9, 0xe6, 0x8b, 0xd5, 0x69, 0x5c, 0xb0, 0x4a, 0xab, 0xc4, 0xb5, 0x35, 0x0a, 0xaa, 0xea, 0x40, 0x03, 0xa0, 0xf6, 0xcb, 0x40, 0x4d, 0x3e, 0xdb, 0xff, 0x00, 0x9c, 0x7f, 0xfc, 0xce, 0x4f, 0xcc, 0xbf, 0x26, 0x25, 0xe5, 0xd3, 0x2f, 0xe9, 0xdd, 0x3d, 0xfe, 0xab, 0xa9, 0xaa, 0xd2, 0xa6, 0x40, 0x2a, 0xb2, 0x71, 0x00, 0x01, 0xea, 0x0d, 0xe8, 0x3a, 0x64, 0x25, 0x16, 0x1c, 0x8b, 0xd9, 0x51, 0x39, 0x28, 0x12, 0x51, 0x41, 0xfd, 0xa3, 0xd2, 0xb9, 0x4f, 0x0d, 0x33, 0xb5, 0xf4, 0x87, 0x9d, 0x79, 0x0e, 0xb4, 0xaf, 0x6a, 0xf8, 0xf1, 0xf0, 0xc9, 0xda, 0xbf, 0xff, 0xd6, 0xf2, 0xc6, 0xb5, 0x68, 0x64, 0xd0, 0x6d, 0x35, 0x20, 0x39, 0xcd, 0x13, 0x0f, 0x5e, 0x61, 0xfc, 0x8f, 0x40, 0x8b, 0x5e, 0xe0, 0x66, 0x1c, 0x4f, 0xaa, 0x9d, 0xe6, 0xa6, 0x1e, 0x91, 0x2e, 0xa9, 0x87, 0x95, 0xee, 0x9c, 0xc5, 0x55, 0x34, 0x60, 0x40, 0xae, 0x57, 0x30, 0xd9, 0xa7, 0x95, 0xbd, 0x6f, 0xcb, 0x26, 0x39, 0x40, 0x0d, 0x4e, 0xc0, 0x9f, 0x9e, 0x50, 0x5d, 0xac, 0x79, 0x33, 0x8b, 0xbb, 0x9b, 0x3b, 0x6b, 0x35, 0x48, 0x54, 0x09, 0x29, 0x56, 0x7f, 0xe1, 0x86, 0x72, 0x00, 0x2c, 0x6e, 0xf7, 0x63, 0x3e, 0x63, 0xbd, 0xbd, 0x5d, 0x20, 0x2a, 0xb3, 0xa4, 0x33, 0x48, 0xab, 0x21, 0x43, 0xf1, 0x2c, 0x47, 0xed, 0x1d, 0xbc, 0x73, 0x18, 0x9b, 0x64, 0x28, 0x96, 0x3a, 0xc7, 0x49, 0xb0, 0xf4, 0xcc, 0xe9, 0x73, 0x6c, 0xb4, 0xf8, 0x67, 0x92, 0x32, 0x21, 0x70, 0x7b, 0x89, 0x05, 0x57, 0xef, 0x38, 0x28, 0x94, 0x4a, 0x7d, 0x13, 0x7d, 0x6a, 0xd3, 0x4c, 0xb8, 0xf2, 0xc3, 0xc8, 0x2e, 0x03, 0xf3, 0xe2, 0x7d, 0x33, 0xb7, 0xc5, 0xcc, 0x71, 0x03, 0xc6, 0xb9, 0x64, 0x06, 0xe2, 0x9a, 0xf2, 0x4f, 0xd2, 0x6d, 0xe9, 0xfe, 0x41, 0x45, 0x5b, 0x18, 0x66, 0xa5, 0x64, 0x09, 0xf4, 0xd5, 0xb7, 0xcd, 0x93, 0xc7, 0xcf, 0x9b, 0xe5, 0x6f, 0xf9, 0xc8, 0x0d, 0x56, 0xeb, 0x59, 0xfc, 0xce, 0xd5, 0x12, 0x61, 0xc4, 0x69, 0xe9, 0x0d, 0xa4, 0x4b, 0xfe, 0x48, 0x40, 0xd5, 0x3e, 0xe4, 0xb6, 0x64, 0x8e, 0x4c, 0x02, 0x61, 0x65, 0xa0, 0x14, 0xb4, 0xb6, 0xb0, 0xb1, 0xb6, 0xb2, 0x97, 0xcb, 0xf1, 0x5a, 0x2d, 0xc6, 0xa5, 0xac, 0xb4, 0x70, 0x5d, 0xc7, 0x3d, 0xc1, 0x51, 0x24, 0x91, 0xc9, 0x31, 0x75, 0x6b, 0x70, 0x9f, 0x14, 0x68, 0x01, 0x46, 0xe4, 0xb5, 0xa3, 0x17, 0xcb, 0x40, 0x61, 0x6f, 0x47, 0xff, 0x00, 0x9c, 0x3a, 0x8f, 0x5b, 0x4f, 0x3c, 0x6b, 0xb7, 0xfa, 0x30, 0x91, 0x3c, 0xa4, 0xb1, 0x95, 0xb9, 0x82, 0x42, 0x0a, 0xbc, 0x8e, 0xe4, 0xdb, 0xa9, 0xef, 0xc9, 0x17, 0x91, 0x24, 0x7c, 0xb2, 0x05, 0x64, 0xfb, 0x75, 0x64, 0x32, 0x39, 0x69, 0x5b, 0x9c, 0xad, 0xb9, 0xdb, 0xa7, 0xb5, 0x3b, 0x53, 0x2a, 0x21, 0x41, 0x44, 0xf3, 0x8b, 0x8f, 0x2e, 0x43, 0x9d, 0x2b, 0xd4, 0x57, 0x23, 0x41, 0x36, 0xff, 0x00, 0xff, 0xd7, 0xf0, 0xc0, 0xd5, 0xb5, 0x11, 0x64, 0xb6, 0x3f, 0x59, 0x90, 0xd9, 0xab, 0x06, 0xf4, 0x79, 0x7c, 0x3b, 0x74, 0xc8, 0x08, 0x8b, 0xb6, 0xe3, 0x96, 0x55, 0x57, 0xb3, 0x3e, 0xf2, 0x35, 0xc7, 0xd6, 0x0b, 0x45, 0x5d, 0xdc, 0x8a, 0x7d, 0xd9, 0x8d, 0x94, 0x3b, 0x3d, 0x1c, 0x9e, 0xc3, 0xe5, 0xc3, 0x2c, 0x7c, 0xc5, 0x0f, 0xee, 0xdb, 0x8b, 0x0c, 0xc4, 0x26, 0x9d, 0xa0, 0x9a, 0x7d, 0x2c, 0xe5, 0xe4, 0x55, 0x7f, 0xee, 0xc1, 0x15, 0x04, 0xd0, 0x12, 0x3c, 0x72, 0x89, 0x1b, 0x2c, 0xcc, 0xa8, 0x2a, 0x8b, 0x87, 0xbb, 0x63, 0x1a, 0x28, 0x65, 0xf0, 0xed, 0xf2, 0xc3, 0xc2, 0x0a, 0x06, 0x4a, 0x46, 0xc7, 0xa5, 0xa3, 0x59, 0xc8, 0xb2, 0xc7, 0x45, 0x22, 0x9c, 0x14, 0x54, 0x10, 0x46, 0xf5, 0x1d, 0x32, 0x5c, 0x14, 0x14, 0xe4, 0x32, 0x2f, 0x3a, 0xf3, 0xb6, 0x90, 0x9a, 0x6d, 0xae, 0x9f, 0x3d, 0xab, 0xb8, 0x8a, 0x3b, 0xf8, 0x39, 0x44, 0x58, 0xf0, 0x08, 0xd5, 0x14, 0xa5, 0x7b, 0x65, 0x98, 0x8e, 0xfb, 0xb5, 0x67, 0x87, 0xa5, 0xef, 0x5e, 0x44, 0x96, 0x35, 0xb5, 0xb6, 0x59, 0x36, 0xfd, 0xd8, 0xa0, 0xf1, 0x20, 0x53, 0x33, 0xc0, 0x79, 0x59, 0x73, 0x7c, 0xd7, 0xf9, 0xfb, 0xa2, 0xcd, 0x67, 0xf9, 0xa7, 0x7b, 0x72, 0xf1, 0x71, 0x83, 0x53, 0x86, 0x0b, 0x98, 0x24, 0x22, 0x8a, 0xcc, 0x88, 0x23, 0x7f, 0xb8, 0xae, 0xf9, 0x7c, 0x50, 0x1e, 0x5f, 0x7c, 0x48, 0x21, 0x44, 0x6b, 0xce, 0x9b, 0xb0, 0x1b, 0x9e, 0xf5, 0xaf, 0x8e, 0x4d, 0x5f, 0x7a, 0x7f, 0xce, 0x34, 0xf9, 0x5d, 0x3c, 0xa3, 0xf9, 0x69, 0x63, 0xa9, 0x3c, 0x27, 0xeb, 0xda, 0xe1, 0x37, 0xd7, 0x2e, 0xaa, 0xdb, 0x06, 0xda, 0x30, 0x49, 0xfe, 0x54, 0x03, 0x03, 0x49, 0xdc, 0xb3, 0xaf, 0x38, 0xfe, 0x6a, 0xf9, 0x47, 0xc9, 0x3a, 0x74, 0x97, 0xfa, 0xf6, 0xaf, 0x15, 0x85, 0xb8, 0x75, 0x89, 0xb8, 0x87, 0x9a, 0x72, 0xee, 0x2a, 0x14, 0x24, 0x60, 0xb1, 0xa8, 0xdf, 0x07, 0x0b, 0x2d, 0xcb, 0xcf, 0x7f, 0xe8, 0x6a, 0xff, 0x00, 0x26, 0xbd, 0x6a, 0x7f, 0x89, 0x2f, 0xf8, 0x52, 0x9e, 0xb7, 0xe8, 0xb9, 0xb8, 0x57, 0xc2, 0x95, 0xe9, 0x8f, 0x08, 0x5a, 0x2f, 0xff, 0xd0, 0xf0, 0x4d, 0x40, 0xaa, 0xd7, 0x00, 0x64, 0xcb, 0x3c, 0x97, 0xa8, 0xb5, 0x9e, 0xa3, 0x1a, 0xd6, 0x84, 0x95, 0x3f, 0x45, 0x72, 0x9c, 0xa2, 0xc3, 0x99, 0xa5, 0x9d, 0x49, 0xf4, 0x17, 0x97, 0xaf, 0x63, 0x17, 0x52, 0x6f, 0xf0, 0xc8, 0x43, 0x6f, 0x9a, 0xe9, 0x07, 0x70, 0x0e, 0xec, 0x83, 0x51, 0x44, 0xb8, 0x61, 0x1a, 0x9e, 0x11, 0xd3, 0x91, 0x60, 0x68, 0x6b, 0xd3, 0x31, 0x4f, 0x36, 0xd3, 0x4c, 0x52, 0xef, 0x4c, 0xd5, 0x0c, 0xc4, 0x69, 0xda, 0x94, 0xc8, 0x3a, 0xf0, 0x66, 0x07, 0x73, 0xe0, 0x40, 0xfd, 0x79, 0x93, 0x12, 0x1c, 0x9c, 0x32, 0xc7, 0xfc, 0x41, 0x33, 0xd2, 0xb4, 0x6f, 0x38, 0x98, 0x65, 0x76, 0xbf, 0x69, 0x42, 0xd0, 0xaa, 0xc9, 0xde, 0x95, 0xad, 0x28, 0x46, 0x4e, 0xac, 0x39, 0x77, 0x80, 0x11, 0xbf, 0xd8, 0xc7, 0x7c, 0xe1, 0xa5, 0xf9, 0x92, 0x4d, 0x32, 0x5b, 0x8b, 0x93, 0x27, 0xa7, 0x68, 0x56, 0xe2, 0x45, 0xda, 0x85, 0x61, 0x6e, 0x67, 0xad, 0x6b, 0xb0, 0x38, 0xc2, 0x81, 0xe4, 0xc7, 0x52, 0x31, 0x1c, 0x67, 0x86, 0x5b, 0xbd, 0x37, 0xca, 0x7a, 0x94, 0xb1, 0x69, 0xb6, 0x2e, 0xb7, 0x15, 0x48, 0xc2, 0xb4, 0x52, 0x53, 0xac, 0x32, 0xaf, 0xb1, 0xed, 0x9b, 0x10, 0x36, 0x78, 0x5c, 0x9f, 0x51, 0x64, 0x1f, 0x98, 0x3e, 0x58, 0xb6, 0xfc, 0xc8, 0xf2, 0xe5, 0xbc, 0x68, 0x52, 0x2d, 0x5a, 0xd1, 0x84, 0xb6, 0xf3, 0x95, 0x0e, 0xc0, 0x85, 0xe2, 0xcb, 0xd8, 0xd1, 0xbb, 0xe4, 0xc1, 0xa6, 0x97, 0xce, 0x17, 0x5f, 0x95, 0xde, 0x6d, 0xb6, 0xbe, 0xb7, 0x69, 0x34, 0xf3, 0x3c, 0x72, 0xcf, 0xe8, 0xa3, 0x45, 0x49, 0x95, 0x4a, 0x90, 0x3e, 0x35, 0x5a, 0x95, 0x1d, 0xfe, 0x21, 0x93, 0x4d, 0xbe, 0xd2, 0xd2, 0xf5, 0x8b, 0xbd, 0x32, 0x2d, 0x3f, 0x4c, 0x9a, 0xe4, 0xca, 0x9e, 0x90, 0x85, 0x65, 0x55, 0x08, 0x85, 0x91, 0x01, 0x3b, 0x0a, 0x05, 0xe9, 0xb0, 0xc0, 0x5a, 0xc3, 0xcd, 0x3f, 0x3b, 0x7f, 0x26, 0xec, 0xff, 0x00, 0x35, 0x6d, 0x6d, 0xb5, 0x3d, 0x16, 0xfe, 0x0d, 0x3b, 0xcd, 0x96, 0x01, 0x92, 0x46, 0x9e, 0xa2, 0x0b, 0xc8, 0xb7, 0x28, 0x92, 0x71, 0xfb, 0x2e, 0xa7, 0xec, 0x3d, 0x0f, 0xc2, 0x68, 0x71, 0x05, 0x95, 0xd3, 0xe7, 0x9f, 0xfa, 0x16, 0x2f, 0xcd, 0x7f, 0x43, 0xd6, 0xfa, 0xa5, 0x97, 0xab, 0xeb, 0x7a, 0x5f, 0x55, 0xfa, 0xec, 0x5e, 0xaf, 0x0f, 0xf7, 0xed, 0x2b, 0x4e, 0x15, 0xff, 0x00, 0x65, 0xdf, 0x8e, 0x14, 0xf1, 0xbf, 0xff, 0xd1, 0xf0, 0x5a, 0xa7, 0x18, 0x5e, 0x56, 0x1f, 0x68, 0x71, 0x5f, 0xa7, 0xbe, 0x2a, 0x98, 0xdb, 0xfa, 0x90, 0x24, 0x37, 0xb0, 0xfd, 0xb8, 0xa8, 0x58, 0x78, 0xae, 0x43, 0xc9, 0xb4, 0x6d, 0xbb, 0xda, 0x3c, 0xa1, 0xad, 0x43, 0xa8, 0xda, 0xc5, 0x2a, 0x3d, 0x26, 0x5a, 0x02, 0x2b, 0xbe, 0x60, 0x64, 0x8d, 0x17, 0x6f, 0x8b, 0x20, 0x90, 0x7a, 0x3c, 0x32, 0x8b, 0xa8, 0x02, 0xf3, 0xfd, 0xe0, 0x1b, 0x11, 0x98, 0x66, 0x3b, 0xb9, 0x62, 0x54, 0x83, 0x36, 0xf2, 0xa4, 0xe4, 0x29, 0x34, 0xeb, 0xc8, 0x74, 0xae, 0x0d, 0xc3, 0x65, 0x82, 0x13, 0x6b, 0x57, 0xba, 0x54, 0xe4, 0x8c, 0x41, 0x1b, 0x75, 0xa7, 0xe0, 0x72, 0x5c, 0x4c, 0x84, 0x50, 0x5a, 0xb3, 0xdd, 0xdd, 0xc3, 0x24, 0x33, 0xb1, 0x60, 0xe0, 0x86, 0x52, 0x45, 0x38, 0xd2, 0x87, 0x24, 0x26, 0x6d, 0x8c, 0xe1, 0x41, 0x25, 0xfc, 0xa3, 0xd7, 0x2f, 0x6f, 0x3c, 0xbf, 0x73, 0xa5, 0xb2, 0x2c, 0xd1, 0x69, 0x17, 0x2f, 0x6b, 0x14, 0x8c, 0x0f, 0x21, 0x0d, 0x79, 0x46, 0x09, 0x15, 0xed, 0xb7, 0x4e, 0xd9, 0xb9, 0x8b, 0xcb, 0xe4, 0xa2, 0x5e, 0xa3, 0xa6, 0xdf, 0x6a, 0x36, 0xe4, 0xcd, 0x69, 0x1c, 0x4e, 0x84, 0x7c, 0x76, 0xab, 0x21, 0x67, 0xa8, 0xa7, 0xd9, 0xf8, 0x4d, 0x2b, 0xf3, 0xc3, 0x4d, 0x49, 0x57, 0x98, 0x75, 0x6f, 0x31, 0xda, 0xf9, 0xa3, 0x4b, 0xfd, 0x1f, 0x69, 0x1d, 0xae, 0xa1, 0xa9, 0x7e, 0xee, 0xe6, 0xd2, 0x79, 0x18, 0xf3, 0xb5, 0x1f, 0xee, 0xd9, 0x0a, 0x01, 0x4e, 0x3f, 0xb3, 0x4d, 0xf2, 0x9c, 0xb9, 0x04, 0x05, 0xb7, 0xe2, 0x87, 0x1e, 0xdd, 0x19, 0x3e, 0xaf, 0x6b, 0xae, 0xcb, 0x6d, 0x13, 0x0d, 0x45, 0xa2, 0x8e, 0x06, 0xe5, 0x13, 0x2a, 0x02, 0x01, 0x5e, 0x82, 0xb5, 0x04, 0xe6, 0x11, 0xd4, 0xcd, 0xda, 0x43, 0x49, 0x8e, 0xb7, 0xdc, 0xb1, 0x51, 0xe6, 0x4d, 0x76, 0xd2, 0x61, 0x15, 0xaa, 0x4b, 0xa8, 0xc9, 0x6e, 0x49, 0x79, 0x20, 0xe6, 0x8c, 0x49, 0xad, 0x43, 0x16, 0xe4, 0xa7, 0xaf, 0x43, 0xd3, 0x26, 0x35, 0x75, 0xcd, 0xa8, 0xe8, 0x87, 0x46, 0xbf, 0xc7, 0x9a, 0xff, 0x00, 0xd6, 0xbf, 0x48, 0xfe, 0x88, 0xfd, 0xe7, 0x0f, 0xab, 0xfa, 0x3f, 0x58, 0x7f, 0x5f, 0x8d, 0x3f, 0x9f, 0xa7, 0x5e, 0xd4, 0xc3, 0xf9, 0xd1, 0x7c, 0xb6, 0x47, 0xe4, 0x3a, 0x5b, 0xff, 0xd2, 0xf0, 0xb7, 0xa6, 0x1e, 0xdf, 0xd3, 0xf6, 0xa5, 0x71, 0x54, 0xdb, 0x4b, 0x80, 0x3c, 0x42, 0x26, 0xee, 0x29, 0xbe, 0x51, 0x23, 0x4e, 0x44, 0x05, 0x84, 0x45, 0xa5, 0xd5, 0xf7, 0x97, 0x2e, 0xfd, 0x6b, 0x6a, 0x98, 0x09, 0xab, 0xc7, 0xfc, 0x46, 0x3b, 0x4c, 0x26, 0x32, 0x30, 0x3e, 0x4f, 0x49, 0xd0, 0xfc, 0xfb, 0x05, 0xd4, 0x4a, 0x7d, 0x40, 0xac, 0x3a, 0x8e, 0x84, 0x1c, 0xc5, 0x96, 0x2a, 0x73, 0xe1, 0x9c, 0x16, 0x6d, 0xa5, 0x79, 0x86, 0xd6, 0xec, 0x80, 0x5a, 0xa0, 0xf5, 0xca, 0xcc, 0x5c, 0xa1, 0x2b, 0x1b, 0x26, 0x30, 0x6a, 0x31, 0x46, 0xcf, 0x1c, 0x87, 0x94, 0x64, 0x9e, 0x3d, 0xb6, 0xf0, 0xca, 0xa8, 0x39, 0x51, 0x99, 0x42, 0x6b, 0x1a, 0xc5, 0xa5, 0xa5, 0x94, 0xf7, 0x92, 0xc8, 0xaa, 0xb1, 0x23, 0x30, 0x04, 0xf8, 0x0e, 0x9f, 0x4e, 0x4a, 0x11, 0xb2, 0xd5, 0x9b, 0x25, 0x06, 0x1b, 0xff, 0x00, 0x38, 0xfd, 0xad, 0xdf, 0xda, 0xf9, 0xa2, 0xfe, 0xc5, 0x42, 0xbe, 0x9b, 0x7f, 0x0b, 0xdd, 0xdd, 0x07, 0xaf, 0x14, 0x68, 0xd8, 0x71, 0x6d, 0xbb, 0x90, 0xfc, 0x73, 0x6e, 0xf2, 0xf2, 0xdd, 0xf4, 0xad, 0xa6, 0xab, 0x6d, 0x69, 0x14, 0xfa, 0xee, 0xa0, 0xe2, 0x0b, 0x0d, 0x39, 0x19, 0xfe, 0x11, 0xc5, 0x1a, 0x4a, 0x1d, 0x8f, 0x73, 0x4f, 0xf8, 0x96, 0x0b, 0x40, 0x8d, 0xec, 0xf3, 0x6d, 0x3f, 0x52, 0xba, 0xd6, 0x35, 0x8b, 0xbf, 0x36, 0x6a, 0x5f, 0x0d, 0xc5, 0xdc, 0xa8, 0xb6, 0xa8, 0x7a, 0xc5, 0x6c, 0x9b, 0x22, 0x0f, 0xa3, 0x73, 0x9a, 0xbc, 0xb3, 0xe2, 0x36, 0xed, 0xb1, 0x43, 0x80, 0x53, 0xd0, 0xa7, 0xd4, 0x44, 0xfa, 0x7a, 0xda, 0x83, 0xbd, 0x3e, 0x2f, 0xa7, 0x2b, 0xad, 0x9b, 0xb8, 0x8d, 0xa8, 0xe8, 0x91, 0xdb, 0xfa, 0x2d, 0x6f, 0xc3, 0x8a, 0x2d, 0x56, 0xa3, 0xad, 0x4f, 0x5c, 0xa4, 0x0d, 0xdc, 0xa3, 0xca, 0xd0, 0xbf, 0xa1, 0xe3, 0xfa, 0xe7, 0x0f, 0xf2, 0xb9, 0x57, 0xbf, 0x1a, 0xe4, 0xb8, 0x57, 0xc5, 0xdd, 0xff, 0xd3, 0xf0, 0xcc, 0x5d, 0x7b, 0x70, 0xc5, 0x53, 0x6d, 0x2f, 0xd5, 0xe4, 0x69, 0xfd, 0xdf, 0xec, 0xd7, 0xad, 0x7d, 0xb2, 0x8c, 0x8d, 0xd8, 0xed, 0x91, 0x9f, 0x43, 0xea, 0xe7, 0xeb, 0x94, 0xad, 0x3e, 0x1e, 0x95, 0xfc, 0x72, 0x81, 0x7d, 0x1c, 0x9d, 0xba, 0xb1, 0x7b, 0xdf, 0xa9, 0x7a, 0xdf, 0xee, 0x2f, 0xd4, 0xfa, 0xe7, 0xed, 0x7a, 0x7f, 0xdd, 0xff, 0x00, 0xb2, 0xae, 0x64, 0x0b, 0xea, 0xe3, 0x9a, 0xbf, 0x4a, 0x6f, 0xa4, 0xff, 0x00, 0x89, 0xbd, 0x45, 0xfa, 0xb5, 0x79, 0xf7, 0xeb, 0xc7, 0xe9, 0xae, 0x57, 0x2e, 0x17, 0x23, 0x1f, 0x89, 0xd1, 0x99, 0x8f, 0xf1, 0xa7, 0x11, 0xcf, 0xd3, 0xf5, 0x29, 0xb5, 0x6b, 0xd3, 0xe8, 0xcc, 0x7f, 0x45, 0xb9, 0xa3, 0xc5, 0x62, 0xbe, 0x68, 0xff, 0x00, 0x15, 0xfd, 0x4c, 0xfe, 0x90, 0xaf, 0xd4, 0xab, 0xf1, 0x7a, 0x7f, 0x62, 0x9d, 0xab, 0xdf, 0x32, 0xb1, 0x70, 0x5e, 0xdc, 0xdc, 0x2d, 0x47, 0x8b, 0x5e, 0xae, 0x4c, 0xbf, 0xf2, 0x37, 0x9f, 0x3d, 0x5b, 0xd2, 0xff, 0x00, 0x8e, 0x87, 0xee, 0x29, 0x5a, 0xf2, 0xf4, 0xaa, 0xd4, 0xa5, 0x36, 0xa7, 0x3a, 0x57, 0xfd, 0x8e, 0x64, 0x3a, 0xf2, 0xf6, 0xbf, 0xcc, 0x7f, 0x5b, 0xfc, 0x23, 0xa7, 0xfe, 0x8e, 0xff, 0x00, 0x8e, 0x37, 0xd6, 0x63, 0xfa, 0xe5, 0x2b, 0xcb, 0x87, 0xec, 0xd6, 0xbd, 0xb9, 0x7d, 0xac, 0xc7, 0xcd, 0x7c, 0x2d, 0xf8, 0x2b, 0x89, 0x26, 0x8f, 0xd4, 0xfa, 0x94, 0x3e, 0x85, 0x29, 0xc9, 0x69, 0xfc, 0x33, 0x58, 0x5d, 0x9c, 0x79, 0xb2, 0xbb, 0x0f, 0xac, 0x7a, 0x2b, 0xea, 0x75, 0xef, 0x92, 0x0c, 0x53, 0x3d, 0x2f, 0xd4, 0xfa, 0xbb, 0xfa, 0x74, 0xf5, 0x39, 0x9a, 0xd7, 0xe7, 0x80, 0x53, 0x79, 0xba, 0x5b, 0xfe, 0x97, 0xfa, 0x4b, 0xfc, 0xba, 0x7f, 0xb1, 0xc7, 0xab, 0x1e, 0x8f, 0xff, 0xd9
-};
-
-#endif  // WEBRTC_RTC_BASE_TESTBASE64_H_
diff --git a/rtc_base/testclient.cc b/rtc_base/testclient.cc
deleted file mode 100644
index a54122c..0000000
--- a/rtc_base/testclient.cc
+++ /dev/null
@@ -1,171 +0,0 @@
-/*
- *  Copyright 2004 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/rtc_base/testclient.h"
-
-#include "webrtc/rtc_base/gunit.h"
-#include "webrtc/rtc_base/ptr_util.h"
-#include "webrtc/rtc_base/thread.h"
-#include "webrtc/rtc_base/timeutils.h"
-
-namespace rtc {
-
-// DESIGN: Each packet received is put it into a list of packets.
-//         Callers can retrieve received packets from any thread by calling
-//         NextPacket.
-
-TestClient::TestClient(std::unique_ptr<AsyncPacketSocket> socket)
-    : TestClient(std::move(socket), nullptr) {}
-
-TestClient::TestClient(std::unique_ptr<AsyncPacketSocket> socket,
-                       FakeClock* fake_clock)
-    : fake_clock_(fake_clock),
-      socket_(std::move(socket)),
-      prev_packet_timestamp_(-1) {
-  socket_->SignalReadPacket.connect(this, &TestClient::OnPacket);
-  socket_->SignalReadyToSend.connect(this, &TestClient::OnReadyToSend);
-}
-
-TestClient::~TestClient() {}
-
-bool TestClient::CheckConnState(AsyncPacketSocket::State state) {
-  // Wait for our timeout value until the socket reaches the desired state.
-  int64_t end = TimeAfter(kTimeoutMs);
-  while (socket_->GetState() != state && TimeUntil(end) > 0) {
-    AdvanceTime(1);
-  }
-  return (socket_->GetState() == state);
-}
-
-int TestClient::Send(const char* buf, size_t size) {
-  rtc::PacketOptions options;
-  return socket_->Send(buf, size, options);
-}
-
-int TestClient::SendTo(const char* buf, size_t size,
-                       const SocketAddress& dest) {
-  rtc::PacketOptions options;
-  return socket_->SendTo(buf, size, dest, options);
-}
-
-std::unique_ptr<TestClient::Packet> TestClient::NextPacket(int timeout_ms) {
-  // If no packets are currently available, we go into a get/dispatch loop for
-  // at most timeout_ms.  If, during the loop, a packet arrives, then we can
-  // stop early and return it.
-
-  // Note that the case where no packet arrives is important.  We often want to
-  // test that a packet does not arrive.
-
-  // Note also that we only try to pump our current thread's message queue.
-  // Pumping another thread's queue could lead to messages being dispatched from
-  // the wrong thread to non-thread-safe objects.
-
-  int64_t end = TimeAfter(timeout_ms);
-  while (TimeUntil(end) > 0) {
-    {
-      CritScope cs(&crit_);
-      if (packets_.size() != 0) {
-        break;
-      }
-    }
-    AdvanceTime(1);
-  }
-
-  // Return the first packet placed in the queue.
-  std::unique_ptr<Packet> packet;
-  CritScope cs(&crit_);
-  if (packets_.size() > 0) {
-    packet = std::move(packets_.front());
-    packets_.erase(packets_.begin());
-  }
-
-  return packet;
-}
-
-bool TestClient::CheckNextPacket(const char* buf, size_t size,
-                                 SocketAddress* addr) {
-  bool res = false;
-  std::unique_ptr<Packet> packet = NextPacket(kTimeoutMs);
-  if (packet) {
-    res = (packet->size == size && memcmp(packet->buf, buf, size) == 0 &&
-           CheckTimestamp(packet->packet_time.timestamp));
-    if (addr)
-      *addr = packet->addr;
-  }
-  return res;
-}
-
-bool TestClient::CheckTimestamp(int64_t packet_timestamp) {
-  bool res = true;
-  if (packet_timestamp == -1) {
-    res = false;
-  }
-  if (prev_packet_timestamp_ != -1) {
-    if (packet_timestamp < prev_packet_timestamp_) {
-      res = false;
-    }
-  }
-  prev_packet_timestamp_ = packet_timestamp;
-  return res;
-}
-
-void TestClient::AdvanceTime(int ms) {
-  // If the test is using a fake clock, we must advance the fake clock to
-  // advance time. Otherwise, ProcessMessages will work.
-  if (fake_clock_) {
-    SIMULATED_WAIT(false, ms, *fake_clock_);
-  } else {
-    Thread::Current()->ProcessMessages(1);
-  }
-}
-
-bool TestClient::CheckNoPacket() {
-  return NextPacket(kNoPacketTimeoutMs) == nullptr;
-}
-
-int TestClient::GetError() {
-  return socket_->GetError();
-}
-
-int TestClient::SetOption(Socket::Option opt, int value) {
-  return socket_->SetOption(opt, value);
-}
-
-void TestClient::OnPacket(AsyncPacketSocket* socket, const char* buf,
-                          size_t size, const SocketAddress& remote_addr,
-                          const PacketTime& packet_time) {
-  CritScope cs(&crit_);
-  packets_.push_back(MakeUnique<Packet>(remote_addr, buf, size, packet_time));
-}
-
-void TestClient::OnReadyToSend(AsyncPacketSocket* socket) {
-  ++ready_to_send_count_;
-}
-
-TestClient::Packet::Packet(const SocketAddress& a,
-                           const char* b,
-                           size_t s,
-                           const PacketTime& packet_time)
-    : addr(a), buf(0), size(s), packet_time(packet_time) {
-  buf = new char[size];
-  memcpy(buf, b, size);
-}
-
-TestClient::Packet::Packet(const Packet& p)
-    : addr(p.addr), buf(0), size(p.size), packet_time(p.packet_time) {
-  buf = new char[size];
-  memcpy(buf, p.buf, size);
-}
-
-TestClient::Packet::~Packet() {
-  delete[] buf;
-}
-
-}  // namespace rtc
diff --git a/rtc_base/testclient.h b/rtc_base/testclient.h
deleted file mode 100644
index 18fe71a..0000000
--- a/rtc_base/testclient.h
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- *  Copyright 2004 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_RTC_BASE_TESTCLIENT_H_
-#define WEBRTC_RTC_BASE_TESTCLIENT_H_
-
-#include <memory>
-#include <vector>
-#include "webrtc/rtc_base/asyncudpsocket.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/fakeclock.h"
-
-namespace rtc {
-
-// A simple client that can send TCP or UDP data and check that it receives
-// what it expects to receive. Useful for testing server functionality.
-class TestClient : public sigslot::has_slots<> {
- public:
-  // Records the contents of a packet that was received.
-  struct Packet {
-    Packet(const SocketAddress& a,
-           const char* b,
-           size_t s,
-           const PacketTime& packet_time);
-    Packet(const Packet& p);
-    virtual ~Packet();
-
-    SocketAddress addr;
-    char*  buf;
-    size_t size;
-    PacketTime packet_time;
-  };
-
-  // Default timeout for NextPacket reads.
-  static const int kTimeoutMs = 5000;
-
-  // Creates a client that will send and receive with the given socket and
-  // will post itself messages with the given thread.
-  explicit TestClient(std::unique_ptr<AsyncPacketSocket> socket);
-  // Create a test client that will use a fake clock. NextPacket needs to wait
-  // for a packet to be received, and thus it needs to advance the fake clock
-  // if the test is using one, rather than just sleeping.
-  TestClient(std::unique_ptr<AsyncPacketSocket> socket, FakeClock* fake_clock);
-  ~TestClient() override;
-
-  SocketAddress address() const { return socket_->GetLocalAddress(); }
-  SocketAddress remote_address() const { return socket_->GetRemoteAddress(); }
-
-  // Checks that the socket moves to the specified connect state.
-  bool CheckConnState(AsyncPacketSocket::State state);
-
-  // Checks that the socket is connected to the remote side.
-  bool CheckConnected() {
-    return CheckConnState(AsyncPacketSocket::STATE_CONNECTED);
-  }
-
-  // Sends using the clients socket.
-  int Send(const char* buf, size_t size);
-
-  // Sends using the clients socket to the given destination.
-  int SendTo(const char* buf, size_t size, const SocketAddress& dest);
-
-  // Returns the next packet received by the client or null if none is received
-  // within the specified timeout.
-  std::unique_ptr<Packet> NextPacket(int timeout_ms);
-
-  // Checks that the next packet has the given contents. Returns the remote
-  // address that the packet was sent from.
-  bool CheckNextPacket(const char* buf, size_t len, SocketAddress* addr);
-
-  // Checks that no packets have arrived or will arrive in the next second.
-  bool CheckNoPacket();
-
-  int GetError();
-  int SetOption(Socket::Option opt, int value);
-
-  bool ready_to_send() const { return ready_to_send_count() > 0; }
-
-  // How many times SignalReadyToSend has been fired.
-  int ready_to_send_count() const { return ready_to_send_count_; }
-
- private:
-  // Timeout for reads when no packet is expected.
-  static const int kNoPacketTimeoutMs = 1000;
-  // Workaround for the fact that AsyncPacketSocket::GetConnState doesn't exist.
-  Socket::ConnState GetState();
-  // Slot for packets read on the socket.
-  void OnPacket(AsyncPacketSocket* socket, const char* buf, size_t len,
-                const SocketAddress& remote_addr,
-                const PacketTime& packet_time);
-  void OnReadyToSend(AsyncPacketSocket* socket);
-  bool CheckTimestamp(int64_t packet_timestamp);
-  void AdvanceTime(int ms);
-
-  FakeClock* fake_clock_ = nullptr;
-  CriticalSection crit_;
-  std::unique_ptr<AsyncPacketSocket> socket_;
-  std::vector<std::unique_ptr<Packet>> packets_;
-  int ready_to_send_count_ = 0;
-  int64_t prev_packet_timestamp_;
-  RTC_DISALLOW_COPY_AND_ASSIGN(TestClient);
-};
-
-}  // namespace rtc
-
-#endif  // WEBRTC_RTC_BASE_TESTCLIENT_H_
diff --git a/rtc_base/testclient_unittest.cc b/rtc_base/testclient_unittest.cc
deleted file mode 100644
index 2607dbb..0000000
--- a/rtc_base/testclient_unittest.cc
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- *  Copyright 2006 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/rtc_base/testclient.h"
-#include "webrtc/rtc_base/gunit.h"
-#include "webrtc/rtc_base/nethelpers.h"
-#include "webrtc/rtc_base/physicalsocketserver.h"
-#include "webrtc/rtc_base/ptr_util.h"
-#include "webrtc/rtc_base/testechoserver.h"
-#include "webrtc/rtc_base/thread.h"
-
-using namespace rtc;
-
-#define MAYBE_SKIP_IPV4                    \
-  if (!HasIPv4Enabled()) {                 \
-    LOG(LS_INFO) << "No IPv4... skipping"; \
-    return;                                \
-  }
-
-#define MAYBE_SKIP_IPV6                    \
-  if (!HasIPv6Enabled()) {                 \
-    LOG(LS_INFO) << "No IPv6... skipping"; \
-    return;                                \
-  }
-
-void TestUdpInternal(const SocketAddress& loopback) {
-  Thread *main = Thread::Current();
-  AsyncSocket* socket = main->socketserver()
-      ->CreateAsyncSocket(loopback.family(), SOCK_DGRAM);
-  socket->Bind(loopback);
-
-  TestClient client(MakeUnique<AsyncUDPSocket>(socket));
-  SocketAddress addr = client.address(), from;
-  EXPECT_EQ(3, client.SendTo("foo", 3, addr));
-  EXPECT_TRUE(client.CheckNextPacket("foo", 3, &from));
-  EXPECT_EQ(from, addr);
-  EXPECT_TRUE(client.CheckNoPacket());
-}
-
-void TestTcpInternal(const SocketAddress& loopback) {
-  Thread *main = Thread::Current();
-  TestEchoServer server(main, loopback);
-
-  AsyncSocket* socket = main->socketserver()
-      ->CreateAsyncSocket(loopback.family(), SOCK_STREAM);
-  std::unique_ptr<AsyncTCPSocket> tcp_socket =
-      WrapUnique(AsyncTCPSocket::Create(socket, loopback, server.address()));
-  ASSERT_TRUE(tcp_socket != nullptr);
-
-  TestClient client(std::move(tcp_socket));
-  SocketAddress addr = client.address(), from;
-  EXPECT_TRUE(client.CheckConnected());
-  EXPECT_EQ(3, client.Send("foo", 3));
-  EXPECT_TRUE(client.CheckNextPacket("foo", 3, &from));
-  EXPECT_EQ(from, server.address());
-  EXPECT_TRUE(client.CheckNoPacket());
-}
-
-// Tests whether the TestClient can send UDP to itself.
-TEST(TestClientTest, TestUdpIPv4) {
-  MAYBE_SKIP_IPV4;
-  TestUdpInternal(SocketAddress("127.0.0.1", 0));
-}
-
-#if defined(WEBRTC_LINUX)
-#define MAYBE_TestUdpIPv6 DISABLED_TestUdpIPv6
-#else
-#define MAYBE_TestUdpIPv6 TestUdpIPv6
-#endif
-TEST(TestClientTest, MAYBE_TestUdpIPv6) {
-  MAYBE_SKIP_IPV6;
-  TestUdpInternal(SocketAddress("::1", 0));
-}
-
-// Tests whether the TestClient can connect to a server and exchange data.
-TEST(TestClientTest, TestTcpIPv4) {
-  MAYBE_SKIP_IPV4;
-  TestTcpInternal(SocketAddress("127.0.0.1", 0));
-}
-
-#if defined(WEBRTC_LINUX)
-#define MAYBE_TestTcpIPv6 DISABLED_TestTcpIPv6
-#else
-#define MAYBE_TestTcpIPv6 TestTcpIPv6
-#endif
-TEST(TestClientTest, MAYBE_TestTcpIPv6) {
-  MAYBE_SKIP_IPV6;
-  TestTcpInternal(SocketAddress("::1", 0));
-}
diff --git a/rtc_base/testechoserver.h b/rtc_base/testechoserver.h
deleted file mode 100644
index e115332..0000000
--- a/rtc_base/testechoserver.h
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- *  Copyright 2004 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_RTC_BASE_TESTECHOSERVER_H_
-#define WEBRTC_RTC_BASE_TESTECHOSERVER_H_
-
-#include <list>
-#include <memory>
-#include "webrtc/rtc_base/asynctcpsocket.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/sigslot.h"
-#include "webrtc/rtc_base/socketaddress.h"
-#include "webrtc/rtc_base/thread.h"
-
-namespace rtc {
-
-// A test echo server, echoes back any packets sent to it.
-// Useful for unit tests.
-class TestEchoServer : public sigslot::has_slots<> {
- public:
-  TestEchoServer(Thread* thread, const SocketAddress& addr)
-      : server_socket_(thread->socketserver()->CreateAsyncSocket(addr.family(),
-                                                                 SOCK_STREAM)) {
-    server_socket_->Bind(addr);
-    server_socket_->Listen(5);
-    server_socket_->SignalReadEvent.connect(this, &TestEchoServer::OnAccept);
-  }
-  ~TestEchoServer() {
-    for (ClientList::iterator it = client_sockets_.begin();
-         it != client_sockets_.end(); ++it) {
-      delete *it;
-    }
-  }
-
-  SocketAddress address() const { return server_socket_->GetLocalAddress(); }
-
- private:
-  void OnAccept(AsyncSocket* socket) {
-    AsyncSocket* raw_socket = socket->Accept(nullptr);
-    if (raw_socket) {
-      AsyncTCPSocket* packet_socket = new AsyncTCPSocket(raw_socket, false);
-      packet_socket->SignalReadPacket.connect(this, &TestEchoServer::OnPacket);
-      packet_socket->SignalClose.connect(this, &TestEchoServer::OnClose);
-      client_sockets_.push_back(packet_socket);
-    }
-  }
-  void OnPacket(AsyncPacketSocket* socket, const char* buf, size_t size,
-                const SocketAddress& remote_addr,
-                const PacketTime& packet_time) {
-    rtc::PacketOptions options;
-    socket->Send(buf, size, options);
-  }
-  void OnClose(AsyncPacketSocket* socket, int err) {
-    ClientList::iterator it =
-        std::find(client_sockets_.begin(), client_sockets_.end(), socket);
-    client_sockets_.erase(it);
-    Thread::Current()->Dispose(socket);
-  }
-
-  typedef std::list<AsyncTCPSocket*> ClientList;
-  std::unique_ptr<AsyncSocket> server_socket_;
-  ClientList client_sockets_;
-  RTC_DISALLOW_COPY_AND_ASSIGN(TestEchoServer);
-};
-
-}  // namespace rtc
-
-#endif  // WEBRTC_RTC_BASE_TESTECHOSERVER_H_
diff --git a/rtc_base/testutils.h b/rtc_base/testutils.h
deleted file mode 100644
index 615f094..0000000
--- a/rtc_base/testutils.h
+++ /dev/null
@@ -1,566 +0,0 @@
-/*
- *  Copyright 2004 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_RTC_BASE_TESTUTILS_H_
-#define WEBRTC_RTC_BASE_TESTUTILS_H_
-
-// Utilities for testing rtc infrastructure in unittests
-
-#if defined(WEBRTC_LINUX) && !defined(WEBRTC_ANDROID)
-#include <X11/Xlib.h>
-#include <X11/extensions/Xrandr.h>
-
-// X defines a few macros that stomp on types that gunit.h uses.
-#undef None
-#undef Bool
-#endif
-
-#include <algorithm>
-#include <map>
-#include <memory>
-#include <vector>
-#include "webrtc/rtc_base/arraysize.h"
-#include "webrtc/rtc_base/asyncsocket.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/gunit.h"
-#include "webrtc/rtc_base/nethelpers.h"
-#include "webrtc/rtc_base/pathutils.h"
-#include "webrtc/rtc_base/stream.h"
-#include "webrtc/rtc_base/stringencode.h"
-#include "webrtc/rtc_base/stringutils.h"
-#include "webrtc/rtc_base/thread.h"
-
-namespace webrtc {
-namespace testing {
-
-using namespace rtc;
-
-///////////////////////////////////////////////////////////////////////////////
-// StreamSink - Monitor asynchronously signalled events from StreamInterface
-// or AsyncSocket (which should probably be a StreamInterface.
-///////////////////////////////////////////////////////////////////////////////
-
-// Note: Any event that is an error is treaded as SSE_ERROR instead of that
-// event.
-
-enum StreamSinkEvent {
-  SSE_OPEN  = SE_OPEN,
-  SSE_READ  = SE_READ,
-  SSE_WRITE = SE_WRITE,
-  SSE_CLOSE = SE_CLOSE,
-  SSE_ERROR = 16
-};
-
-class StreamSink : public sigslot::has_slots<> {
- public:
-  void Monitor(StreamInterface* stream) {
-   stream->SignalEvent.connect(this, &StreamSink::OnEvent);
-   events_.erase(stream);
-  }
-  void Unmonitor(StreamInterface* stream) {
-   stream->SignalEvent.disconnect(this);
-   // In case you forgot to unmonitor a previous object with this address
-   events_.erase(stream);
-  }
-  bool Check(StreamInterface* stream, StreamSinkEvent event, bool reset = true) {
-    return DoCheck(stream, event, reset);
-  }
-  int Events(StreamInterface* stream, bool reset = true) {
-    return DoEvents(stream, reset);
-  }
-
-  void Monitor(AsyncSocket* socket) {
-   socket->SignalConnectEvent.connect(this, &StreamSink::OnConnectEvent);
-   socket->SignalReadEvent.connect(this, &StreamSink::OnReadEvent);
-   socket->SignalWriteEvent.connect(this, &StreamSink::OnWriteEvent);
-   socket->SignalCloseEvent.connect(this, &StreamSink::OnCloseEvent);
-   // In case you forgot to unmonitor a previous object with this address
-   events_.erase(socket);
-  }
-  void Unmonitor(AsyncSocket* socket) {
-   socket->SignalConnectEvent.disconnect(this);
-   socket->SignalReadEvent.disconnect(this);
-   socket->SignalWriteEvent.disconnect(this);
-   socket->SignalCloseEvent.disconnect(this);
-   events_.erase(socket);
-  }
-  bool Check(AsyncSocket* socket, StreamSinkEvent event, bool reset = true) {
-    return DoCheck(socket, event, reset);
-  }
-  int Events(AsyncSocket* socket, bool reset = true) {
-    return DoEvents(socket, reset);
-  }
-
- private:
-  typedef std::map<void*,int> EventMap;
-
-  void OnEvent(StreamInterface* stream, int events, int error) {
-    if (error) {
-      events = SSE_ERROR;
-    }
-    AddEvents(stream, events);
-  }
-  void OnConnectEvent(AsyncSocket* socket) {
-    AddEvents(socket, SSE_OPEN);
-  }
-  void OnReadEvent(AsyncSocket* socket) {
-    AddEvents(socket, SSE_READ);
-  }
-  void OnWriteEvent(AsyncSocket* socket) {
-    AddEvents(socket, SSE_WRITE);
-  }
-  void OnCloseEvent(AsyncSocket* socket, int error) {
-    AddEvents(socket, (0 == error) ? SSE_CLOSE : SSE_ERROR);
-  }
-
-  void AddEvents(void* obj, int events) {
-    EventMap::iterator it = events_.find(obj);
-    if (events_.end() == it) {
-      events_.insert(EventMap::value_type(obj, events));
-    } else {
-      it->second |= events;
-    }
-  }
-  bool DoCheck(void* obj, StreamSinkEvent event, bool reset) {
-    EventMap::iterator it = events_.find(obj);
-    if ((events_.end() == it) || (0 == (it->second & event))) {
-      return false;
-    }
-    if (reset) {
-      it->second &= ~event;
-    }
-    return true;
-  }
-  int DoEvents(void* obj, bool reset) {
-    EventMap::iterator it = events_.find(obj);
-    if (events_.end() == it)
-      return 0;
-    int events = it->second;
-    if (reset) {
-      it->second = 0;
-    }
-    return events;
-  }
-
-  EventMap events_;
-};
-
-///////////////////////////////////////////////////////////////////////////////
-// StreamSource - Implements stream interface and simulates asynchronous
-// events on the stream, without a network.  Also buffers written data.
-///////////////////////////////////////////////////////////////////////////////
-
-class StreamSource : public StreamInterface {
-public:
-  StreamSource() {
-    Clear();
-  }
-
-  void Clear() {
-    readable_data_.clear();
-    written_data_.clear();
-    state_ = SS_CLOSED;
-    read_block_ = 0;
-    write_block_ = SIZE_UNKNOWN;
-  }
-  void QueueString(const char* data) {
-    QueueData(data, strlen(data));
-  }
-  void QueueStringF(const char* format, ...) {
-    va_list args;
-    va_start(args, format);
-    char buffer[1024];
-    size_t len = vsprintfn(buffer, sizeof(buffer), format, args);
-    RTC_CHECK(len < sizeof(buffer) - 1);
-    va_end(args);
-    QueueData(buffer, len);
-  }
-  void QueueData(const char* data, size_t len) {
-    readable_data_.insert(readable_data_.end(), data, data + len);
-    if ((SS_OPEN == state_) && (readable_data_.size() == len)) {
-      SignalEvent(this, SE_READ, 0);
-    }
-  }
-  std::string ReadData() {
-    std::string data;
-    // avoid accessing written_data_[0] if it is undefined
-    if (written_data_.size() > 0) {
-      data.insert(0, &written_data_[0], written_data_.size());
-    }
-    written_data_.clear();
-    return data;
-  }
-  void SetState(StreamState state) {
-    int events = 0;
-    if ((SS_OPENING == state_) && (SS_OPEN == state)) {
-      events |= SE_OPEN;
-      if (!readable_data_.empty()) {
-        events |= SE_READ;
-      }
-    } else if ((SS_CLOSED != state_) && (SS_CLOSED == state)) {
-      events |= SE_CLOSE;
-    }
-    state_ = state;
-    if (events) {
-      SignalEvent(this, events, 0);
-    }
-  }
-  // Will cause Read to block when there are pos bytes in the read queue.
-  void SetReadBlock(size_t pos) { read_block_ = pos; }
-  // Will cause Write to block when there are pos bytes in the write queue.
-  void SetWriteBlock(size_t pos) { write_block_ = pos; }
-
-  virtual StreamState GetState() const { return state_; }
-  virtual StreamResult Read(void* buffer, size_t buffer_len,
-                            size_t* read, int* error) {
-    if (SS_CLOSED == state_) {
-      if (error) *error = -1;
-      return SR_ERROR;
-    }
-    if ((SS_OPENING == state_) || (readable_data_.size() <= read_block_)) {
-      return SR_BLOCK;
-    }
-    size_t count = std::min(buffer_len, readable_data_.size() - read_block_);
-    memcpy(buffer, &readable_data_[0], count);
-    size_t new_size = readable_data_.size() - count;
-    // Avoid undefined access beyond the last element of the vector.
-    // This only happens when new_size is 0.
-    if (count < readable_data_.size()) {
-      memmove(&readable_data_[0], &readable_data_[count], new_size);
-    }
-    readable_data_.resize(new_size);
-    if (read) *read = count;
-    return SR_SUCCESS;
-  }
-  virtual StreamResult Write(const void* data, size_t data_len,
-                             size_t* written, int* error) {
-    if (SS_CLOSED == state_) {
-      if (error) *error = -1;
-      return SR_ERROR;
-    }
-    if (SS_OPENING == state_) {
-      return SR_BLOCK;
-    }
-    if (SIZE_UNKNOWN != write_block_) {
-      if (written_data_.size() >= write_block_) {
-        return SR_BLOCK;
-      }
-      if (data_len > (write_block_ - written_data_.size())) {
-        data_len = write_block_ - written_data_.size();
-      }
-    }
-    if (written) *written = data_len;
-    const char* cdata = static_cast<const char*>(data);
-    written_data_.insert(written_data_.end(), cdata, cdata + data_len);
-    return SR_SUCCESS;
-  }
-  virtual void Close() { state_ = SS_CLOSED; }
-
-private:
-  typedef std::vector<char> Buffer;
-  Buffer readable_data_, written_data_;
-  StreamState state_;
-  size_t read_block_, write_block_;
-};
-
-///////////////////////////////////////////////////////////////////////////////
-// SocketTestClient
-// Creates a simulated client for testing.  Works on real and virtual networks.
-///////////////////////////////////////////////////////////////////////////////
-
-class SocketTestClient : public sigslot::has_slots<> {
-public:
- SocketTestClient() { Init(nullptr, AF_INET); }
- SocketTestClient(AsyncSocket* socket) {
-   Init(socket, socket->GetLocalAddress().family());
-  }
-  SocketTestClient(const SocketAddress& address) {
-    Init(nullptr, address.family());
-    socket_->Connect(address);
-  }
-
-  AsyncSocket* socket() { return socket_.get(); }
-
-  void QueueString(const char* data) {
-    QueueData(data, strlen(data));
-  }
-  void QueueStringF(const char* format, ...) {
-    va_list args;
-    va_start(args, format);
-    char buffer[1024];
-    size_t len = vsprintfn(buffer, sizeof(buffer), format, args);
-    RTC_CHECK(len < sizeof(buffer) - 1);
-    va_end(args);
-    QueueData(buffer, len);
-  }
-  void QueueData(const char* data, size_t len) {
-    send_buffer_.insert(send_buffer_.end(), data, data + len);
-    if (Socket::CS_CONNECTED == socket_->GetState()) {
-      Flush();
-    }
-  }
-  std::string ReadData() {
-    std::string data(&recv_buffer_[0], recv_buffer_.size());
-    recv_buffer_.clear();
-    return data;
-  }
-
-  bool IsConnected() const {
-    return (Socket::CS_CONNECTED == socket_->GetState());
-  }
-  bool IsClosed() const {
-    return (Socket::CS_CLOSED == socket_->GetState());
-  }
-
-private:
-  typedef std::vector<char> Buffer;
-
-  void Init(AsyncSocket* socket, int family) {
-    if (!socket) {
-      socket = Thread::Current()->socketserver()
-          ->CreateAsyncSocket(family, SOCK_STREAM);
-    }
-    socket_.reset(socket);
-    socket_->SignalConnectEvent.connect(this,
-      &SocketTestClient::OnConnectEvent);
-    socket_->SignalReadEvent.connect(this, &SocketTestClient::OnReadEvent);
-    socket_->SignalWriteEvent.connect(this, &SocketTestClient::OnWriteEvent);
-    socket_->SignalCloseEvent.connect(this, &SocketTestClient::OnCloseEvent);
-  }
-
-  void Flush() {
-    size_t sent = 0;
-    while (sent < send_buffer_.size()) {
-      int result = socket_->Send(&send_buffer_[sent],
-                                 send_buffer_.size() - sent);
-      if (result > 0) {
-        sent += result;
-      } else {
-        break;
-      }
-    }
-    size_t new_size = send_buffer_.size() - sent;
-    memmove(&send_buffer_[0], &send_buffer_[sent], new_size);
-    send_buffer_.resize(new_size);
-  }
-
-  void OnConnectEvent(AsyncSocket* socket) {
-    if (!send_buffer_.empty()) {
-      Flush();
-    }
-  }
-  void OnReadEvent(AsyncSocket* socket) {
-    char data[64 * 1024];
-    int result = socket_->Recv(data, arraysize(data), nullptr);
-    if (result > 0) {
-      recv_buffer_.insert(recv_buffer_.end(), data, data + result);
-    }
-  }
-  void OnWriteEvent(AsyncSocket* socket) {
-    if (!send_buffer_.empty()) {
-      Flush();
-    }
-  }
-  void OnCloseEvent(AsyncSocket* socket, int error) {
-  }
-
-  std::unique_ptr<AsyncSocket> socket_;
-  Buffer send_buffer_, recv_buffer_;
-};
-
-///////////////////////////////////////////////////////////////////////////////
-// SocketTestServer
-// Creates a simulated server for testing.  Works on real and virtual networks.
-///////////////////////////////////////////////////////////////////////////////
-
-class SocketTestServer : public sigslot::has_slots<> {
- public:
-  SocketTestServer(const SocketAddress& address)
-      : socket_(Thread::Current()->socketserver()
-                ->CreateAsyncSocket(address.family(), SOCK_STREAM))
-  {
-    socket_->SignalReadEvent.connect(this, &SocketTestServer::OnReadEvent);
-    socket_->Bind(address);
-    socket_->Listen(5);
-  }
-  virtual ~SocketTestServer() {
-    clear();
-  }
-
-  size_t size() const { return clients_.size(); }
-  SocketTestClient* client(size_t index) const { return clients_[index]; }
-  SocketTestClient* operator[](size_t index) const { return client(index); }
-
-  void clear() {
-    for (size_t i=0; i<clients_.size(); ++i) {
-      delete clients_[i];
-    }
-    clients_.clear();
-  }
-
- private:
-  void OnReadEvent(AsyncSocket* socket) {
-    AsyncSocket* accepted = static_cast<AsyncSocket*>(socket_->Accept(nullptr));
-    if (!accepted)
-      return;
-    clients_.push_back(new SocketTestClient(accepted));
-  }
-
-  std::unique_ptr<AsyncSocket> socket_;
-  std::vector<SocketTestClient*> clients_;
-};
-
-///////////////////////////////////////////////////////////////////////////////
-// Unittest predicates which are similar to STREQ, but for raw memory
-///////////////////////////////////////////////////////////////////////////////
-
-inline ::testing::AssertionResult CmpHelperMemEq(
-    const char* expected_expression,
-    const char* expected_length_expression,
-    const char* actual_expression,
-    const char* actual_length_expression,
-    const void* expected,
-    size_t expected_length,
-    const void* actual,
-    size_t actual_length) {
-  if ((expected_length == actual_length)
-      && (0 == memcmp(expected, actual, expected_length))) {
-    return ::testing::AssertionSuccess();
-  }
-
-  ::testing::Message msg;
-  msg << "Value of: " << actual_expression
-      << " [" << actual_length_expression << "]";
-  if (true) {  //!actual_value.Equals(actual_expression)) {
-    size_t buffer_size = actual_length * 2 + 1;
-    char* buffer = STACK_ARRAY(char, buffer_size);
-    hex_encode(buffer, buffer_size,
-               reinterpret_cast<const char*>(actual), actual_length);
-    msg << "\n  Actual: " << buffer << " [" << actual_length << "]";
-  }
-
-  msg << "\nExpected: " << expected_expression
-      << " [" << expected_length_expression << "]";
-  if (true) {  //!expected_value.Equals(expected_expression)) {
-    size_t buffer_size = expected_length * 2 + 1;
-    char* buffer = STACK_ARRAY(char, buffer_size);
-    hex_encode(buffer, buffer_size,
-               reinterpret_cast<const char*>(expected), expected_length);
-    msg << "\nWhich is: " << buffer << " [" << expected_length << "]";
-  }
-
-  return AssertionFailure(msg);
-}
-
-#define EXPECT_MEMEQ(expected, expected_length, actual, actual_length) \
-  EXPECT_PRED_FORMAT4(::testing::CmpHelperMemEq, expected, expected_length, \
-                      actual, actual_length)
-
-#define ASSERT_MEMEQ(expected, expected_length, actual, actual_length) \
-  ASSERT_PRED_FORMAT4(::testing::CmpHelperMemEq, expected, expected_length, \
-                      actual, actual_length)
-
-///////////////////////////////////////////////////////////////////////////////
-// Helpers for initializing constant memory with integers in a particular byte
-// order
-///////////////////////////////////////////////////////////////////////////////
-
-#define BYTE_CAST(x) static_cast<uint8_t>((x)&0xFF)
-
-// Declare a N-bit integer as a little-endian sequence of bytes
-#define LE16(x) BYTE_CAST(((uint16_t)x) >> 0), BYTE_CAST(((uint16_t)x) >> 8)
-
-#define LE32(x) \
-  BYTE_CAST(((uint32_t)x) >> 0), BYTE_CAST(((uint32_t)x) >> 8), \
-      BYTE_CAST(((uint32_t)x) >> 16), BYTE_CAST(((uint32_t)x) >> 24)
-
-#define LE64(x) \
-  BYTE_CAST(((uint64_t)x) >> 0), BYTE_CAST(((uint64_t)x) >> 8),       \
-      BYTE_CAST(((uint64_t)x) >> 16), BYTE_CAST(((uint64_t)x) >> 24), \
-      BYTE_CAST(((uint64_t)x) >> 32), BYTE_CAST(((uint64_t)x) >> 40), \
-      BYTE_CAST(((uint64_t)x) >> 48), BYTE_CAST(((uint64_t)x) >> 56)
-
-// Declare a N-bit integer as a big-endian (Internet) sequence of bytes
-#define BE16(x) BYTE_CAST(((uint16_t)x) >> 8), BYTE_CAST(((uint16_t)x) >> 0)
-
-#define BE32(x) \
-  BYTE_CAST(((uint32_t)x) >> 24), BYTE_CAST(((uint32_t)x) >> 16), \
-      BYTE_CAST(((uint32_t)x) >> 8), BYTE_CAST(((uint32_t)x) >> 0)
-
-#define BE64(x) \
-  BYTE_CAST(((uint64_t)x) >> 56), BYTE_CAST(((uint64_t)x) >> 48),     \
-      BYTE_CAST(((uint64_t)x) >> 40), BYTE_CAST(((uint64_t)x) >> 32), \
-      BYTE_CAST(((uint64_t)x) >> 24), BYTE_CAST(((uint64_t)x) >> 16), \
-      BYTE_CAST(((uint64_t)x) >> 8), BYTE_CAST(((uint64_t)x) >> 0)
-
-// Declare a N-bit integer as a this-endian (local machine) sequence of bytes
-#ifndef BIG_ENDIAN
-#define BIG_ENDIAN 1
-#endif  // BIG_ENDIAN
-
-#if BIG_ENDIAN
-#define TE16 BE16
-#define TE32 BE32
-#define TE64 BE64
-#else  // !BIG_ENDIAN
-#define TE16 LE16
-#define TE32 LE32
-#define TE64 LE64
-#endif  // !BIG_ENDIAN
-
-///////////////////////////////////////////////////////////////////////////////
-
-// Helpers for determining if X/screencasting is available (on linux).
-
-#define MAYBE_SKIP_SCREENCAST_TEST() \
-  if (!testing::IsScreencastingAvailable()) { \
-    LOG(LS_WARNING) << "Skipping test, since it doesn't have the requisite " \
-                    << "X environment for screen capture."; \
-    return; \
-  } \
-
-#if defined(WEBRTC_LINUX) && !defined(WEBRTC_ANDROID)
-struct XDisplay {
-  XDisplay() : display_(XOpenDisplay(nullptr)) {}
-  ~XDisplay() { if (display_) XCloseDisplay(display_); }
-  bool IsValid() const { return display_ != nullptr; }
-  operator Display*() { return display_; }
- private:
-  Display* display_;
-};
-#endif
-
-// Returns true if screencasting is available. When false, anything that uses
-// screencasting features may fail.
-inline bool IsScreencastingAvailable() {
-#if defined(WEBRTC_LINUX) && !defined(WEBRTC_ANDROID)
-  XDisplay display;
-  if (!display.IsValid()) {
-    LOG(LS_WARNING) << "No X Display available.";
-    return false;
-  }
-  int ignored_int, major_version, minor_version;
-  if (!XRRQueryExtension(display, &ignored_int, &ignored_int) ||
-      !XRRQueryVersion(display, &major_version, &minor_version) ||
-      major_version < 1 ||
-      (major_version < 2 && minor_version < 3)) {
-    LOG(LS_WARNING) << "XRandr version: " << major_version << "."
-                    << minor_version;
-    LOG(LS_WARNING) << "XRandr is not supported or is too old (pre 1.3).";
-    return false;
-  }
-#endif
-  return true;
-}
-
-}  // namespace testing
-}  // namespace webrtc
-
-#endif  // WEBRTC_RTC_BASE_TESTUTILS_H_
diff --git a/rtc_base/thread.cc b/rtc_base/thread.cc
deleted file mode 100644
index 9ba0f51..0000000
--- a/rtc_base/thread.cc
+++ /dev/null
@@ -1,559 +0,0 @@
-/*
- *  Copyright 2004 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/rtc_base/thread.h"
-
-#if defined(WEBRTC_WIN)
-#include <comdef.h>
-#elif defined(WEBRTC_POSIX)
-#include <time.h>
-#endif
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/nullsocketserver.h"
-#include "webrtc/rtc_base/platform_thread.h"
-#include "webrtc/rtc_base/stringutils.h"
-#include "webrtc/rtc_base/timeutils.h"
-#include "webrtc/rtc_base/trace_event.h"
-
-namespace rtc {
-
-ThreadManager* ThreadManager::Instance() {
-  RTC_DEFINE_STATIC_LOCAL(ThreadManager, thread_manager, ());
-  return &thread_manager;
-}
-
-ThreadManager::~ThreadManager() {
-  // By above RTC_DEFINE_STATIC_LOCAL.
-  RTC_NOTREACHED() << "ThreadManager should never be destructed.";
-}
-
-// static
-Thread* Thread::Current() {
-  ThreadManager* manager = ThreadManager::Instance();
-  Thread* thread = manager->CurrentThread();
-
-#ifndef NO_MAIN_THREAD_WRAPPING
-  // Only autowrap the thread which instantiated the ThreadManager.
-  if (!thread && manager->IsMainThread()) {
-    thread = new Thread(SocketServer::CreateDefault());
-    thread->WrapCurrentWithThreadManager(manager, true);
-  }
-#endif
-
-  return thread;
-}
-
-#if defined(WEBRTC_POSIX)
-#if !defined(WEBRTC_MAC)
-ThreadManager::ThreadManager() {
-  main_thread_ref_ = CurrentThreadRef();
-  pthread_key_create(&key_, nullptr);
-}
-#endif
-
-Thread *ThreadManager::CurrentThread() {
-  return static_cast<Thread *>(pthread_getspecific(key_));
-}
-
-void ThreadManager::SetCurrentThread(Thread *thread) {
-  pthread_setspecific(key_, thread);
-}
-#endif
-
-#if defined(WEBRTC_WIN)
-ThreadManager::ThreadManager() {
-  main_thread_ref_ = CurrentThreadRef();
-  key_ = TlsAlloc();
-}
-
-Thread *ThreadManager::CurrentThread() {
-  return static_cast<Thread *>(TlsGetValue(key_));
-}
-
-void ThreadManager::SetCurrentThread(Thread *thread) {
-  TlsSetValue(key_, thread);
-}
-#endif
-
-Thread *ThreadManager::WrapCurrentThread() {
-  Thread* result = CurrentThread();
-  if (nullptr == result) {
-    result = new Thread(SocketServer::CreateDefault());
-    result->WrapCurrentWithThreadManager(this, true);
-  }
-  return result;
-}
-
-void ThreadManager::UnwrapCurrentThread() {
-  Thread* t = CurrentThread();
-  if (t && !(t->IsOwned())) {
-    t->UnwrapCurrent();
-    delete t;
-  }
-}
-
-bool ThreadManager::IsMainThread() {
-  return IsThreadRefEqual(CurrentThreadRef(), main_thread_ref_);
-}
-
-Thread::ScopedDisallowBlockingCalls::ScopedDisallowBlockingCalls()
-  : thread_(Thread::Current()),
-    previous_state_(thread_->SetAllowBlockingCalls(false)) {
-}
-
-Thread::ScopedDisallowBlockingCalls::~ScopedDisallowBlockingCalls() {
-  RTC_DCHECK(thread_->IsCurrent());
-  thread_->SetAllowBlockingCalls(previous_state_);
-}
-
-// DEPRECATED.
-Thread::Thread() : Thread(SocketServer::CreateDefault()) {}
-
-Thread::Thread(SocketServer* ss)
-    : MessageQueue(ss, false),
-      running_(true, false),
-#if defined(WEBRTC_WIN)
-      thread_(nullptr),
-      thread_id_(0),
-#endif
-      owned_(true),
-      blocking_calls_allowed_(true) {
-  SetName("Thread", this);  // default name
-  DoInit();
-}
-
-Thread::Thread(std::unique_ptr<SocketServer> ss)
-    : MessageQueue(std::move(ss), false),
-      running_(true, false),
-#if defined(WEBRTC_WIN)
-      thread_(nullptr),
-      thread_id_(0),
-#endif
-      owned_(true),
-      blocking_calls_allowed_(true) {
-  SetName("Thread", this);  // default name
-  DoInit();
-}
-
-Thread::~Thread() {
-  Stop();
-  DoDestroy();
-}
-
-bool Thread::IsCurrent() const {
-  return ThreadManager::Instance()->CurrentThread() == this;
-}
-
-std::unique_ptr<Thread> Thread::CreateWithSocketServer() {
-  return std::unique_ptr<Thread>(new Thread(SocketServer::CreateDefault()));
-}
-
-std::unique_ptr<Thread> Thread::Create() {
-  return std::unique_ptr<Thread>(
-      new Thread(std::unique_ptr<SocketServer>(new NullSocketServer())));
-}
-
-bool Thread::SleepMs(int milliseconds) {
-  AssertBlockingIsAllowedOnCurrentThread();
-
-#if defined(WEBRTC_WIN)
-  ::Sleep(milliseconds);
-  return true;
-#else
-  // POSIX has both a usleep() and a nanosleep(), but the former is deprecated,
-  // so we use nanosleep() even though it has greater precision than necessary.
-  struct timespec ts;
-  ts.tv_sec = milliseconds / 1000;
-  ts.tv_nsec = (milliseconds % 1000) * 1000000;
-  int ret = nanosleep(&ts, nullptr);
-  if (ret != 0) {
-    LOG_ERR(LS_WARNING) << "nanosleep() returning early";
-    return false;
-  }
-  return true;
-#endif
-}
-
-bool Thread::SetName(const std::string& name, const void* obj) {
-  if (running()) return false;
-  name_ = name;
-  if (obj) {
-    char buf[16];
-    sprintfn(buf, sizeof(buf), " 0x%p", obj);
-    name_ += buf;
-  }
-  return true;
-}
-
-bool Thread::Start(Runnable* runnable) {
-  RTC_DCHECK(owned_);
-  if (!owned_) return false;
-  RTC_DCHECK(!running());
-  if (running()) return false;
-
-  Restart();  // reset IsQuitting() if the thread is being restarted
-
-  // Make sure that ThreadManager is created on the main thread before
-  // we start a new thread.
-  ThreadManager::Instance();
-
-  ThreadInit* init = new ThreadInit;
-  init->thread = this;
-  init->runnable = runnable;
-#if defined(WEBRTC_WIN)
-  thread_ = CreateThread(nullptr, 0, PreRun, init, 0, &thread_id_);
-  if (thread_) {
-    running_.Set();
-  } else {
-    return false;
-  }
-#elif defined(WEBRTC_POSIX)
-  pthread_attr_t attr;
-  pthread_attr_init(&attr);
-
-  int error_code = pthread_create(&thread_, &attr, PreRun, init);
-  if (0 != error_code) {
-    LOG(LS_ERROR) << "Unable to create pthread, error " << error_code;
-    return false;
-  }
-  running_.Set();
-#endif
-  return true;
-}
-
-bool Thread::WrapCurrent() {
-  return WrapCurrentWithThreadManager(ThreadManager::Instance(), true);
-}
-
-void Thread::UnwrapCurrent() {
-  // Clears the platform-specific thread-specific storage.
-  ThreadManager::Instance()->SetCurrentThread(nullptr);
-#if defined(WEBRTC_WIN)
-  if (thread_ != nullptr) {
-    if (!CloseHandle(thread_)) {
-      LOG_GLE(LS_ERROR) << "When unwrapping thread, failed to close handle.";
-    }
-    thread_ = nullptr;
-  }
-#endif
-  running_.Reset();
-}
-
-void Thread::SafeWrapCurrent() {
-  WrapCurrentWithThreadManager(ThreadManager::Instance(), false);
-}
-
-void Thread::Join() {
-  if (running()) {
-    RTC_DCHECK(!IsCurrent());
-    if (Current() && !Current()->blocking_calls_allowed_) {
-      LOG(LS_WARNING) << "Waiting for the thread to join, "
-                      << "but blocking calls have been disallowed";
-    }
-
-#if defined(WEBRTC_WIN)
-    RTC_DCHECK(thread_ != nullptr);
-    WaitForSingleObject(thread_, INFINITE);
-    CloseHandle(thread_);
-    thread_ = nullptr;
-    thread_id_ = 0;
-#elif defined(WEBRTC_POSIX)
-    void *pv;
-    pthread_join(thread_, &pv);
-#endif
-    running_.Reset();
-  }
-}
-
-bool Thread::SetAllowBlockingCalls(bool allow) {
-  RTC_DCHECK(IsCurrent());
-  bool previous = blocking_calls_allowed_;
-  blocking_calls_allowed_ = allow;
-  return previous;
-}
-
-// static
-void Thread::AssertBlockingIsAllowedOnCurrentThread() {
-#if !defined(NDEBUG)
-  Thread* current = Thread::Current();
-  RTC_DCHECK(!current || current->blocking_calls_allowed_);
-#endif
-}
-
-// static
-#if !defined(WEBRTC_MAC)
-#if defined(WEBRTC_WIN)
-DWORD WINAPI Thread::PreRun(LPVOID pv) {
-#else
-void* Thread::PreRun(void* pv) {
-#endif
-  ThreadInit* init = static_cast<ThreadInit*>(pv);
-  ThreadManager::Instance()->SetCurrentThread(init->thread);
-  rtc::SetCurrentThreadName(init->thread->name_.c_str());
-  if (init->runnable) {
-    init->runnable->Run(init->thread);
-  } else {
-    init->thread->Run();
-  }
-  delete init;
-#ifdef WEBRTC_WIN
-  return 0;
-#else
-  return nullptr;
-#endif
-}
-#endif
-
-void Thread::Run() {
-  ProcessMessages(kForever);
-}
-
-bool Thread::IsOwned() {
-  return owned_;
-}
-
-void Thread::Stop() {
-  MessageQueue::Quit();
-  Join();
-}
-
-void Thread::Send(const Location& posted_from,
-                  MessageHandler* phandler,
-                  uint32_t id,
-                  MessageData* pdata) {
-  if (IsQuitting())
-    return;
-
-  // Sent messages are sent to the MessageHandler directly, in the context
-  // of "thread", like Win32 SendMessage. If in the right context,
-  // call the handler directly.
-  Message msg;
-  msg.posted_from = posted_from;
-  msg.phandler = phandler;
-  msg.message_id = id;
-  msg.pdata = pdata;
-  if (IsCurrent()) {
-    phandler->OnMessage(&msg);
-    return;
-  }
-
-  AssertBlockingIsAllowedOnCurrentThread();
-
-  AutoThread thread;
-  Thread *current_thread = Thread::Current();
-  RTC_DCHECK(current_thread != nullptr);  // AutoThread ensures this
-
-  bool ready = false;
-  {
-    CritScope cs(&crit_);
-    _SendMessage smsg;
-    smsg.thread = current_thread;
-    smsg.msg = msg;
-    smsg.ready = &ready;
-    sendlist_.push_back(smsg);
-  }
-
-  // Wait for a reply
-  WakeUpSocketServer();
-
-  bool waited = false;
-  crit_.Enter();
-  while (!ready) {
-    crit_.Leave();
-    // We need to limit "ReceiveSends" to |this| thread to avoid an arbitrary
-    // thread invoking calls on the current thread.
-    current_thread->ReceiveSendsFromThread(this);
-    current_thread->socketserver()->Wait(kForever, false);
-    waited = true;
-    crit_.Enter();
-  }
-  crit_.Leave();
-
-  // Our Wait loop above may have consumed some WakeUp events for this
-  // MessageQueue, that weren't relevant to this Send.  Losing these WakeUps can
-  // cause problems for some SocketServers.
-  //
-  // Concrete example:
-  // Win32SocketServer on thread A calls Send on thread B.  While processing the
-  // message, thread B Posts a message to A.  We consume the wakeup for that
-  // Post while waiting for the Send to complete, which means that when we exit
-  // this loop, we need to issue another WakeUp, or else the Posted message
-  // won't be processed in a timely manner.
-
-  if (waited) {
-    current_thread->socketserver()->WakeUp();
-  }
-}
-
-void Thread::ReceiveSends() {
-  ReceiveSendsFromThread(nullptr);
-}
-
-void Thread::ReceiveSendsFromThread(const Thread* source) {
-  // Receive a sent message. Cleanup scenarios:
-  // - thread sending exits: We don't allow this, since thread can exit
-  //   only via Join, so Send must complete.
-  // - thread receiving exits: Wakeup/set ready in Thread::Clear()
-  // - object target cleared: Wakeup/set ready in Thread::Clear()
-  _SendMessage smsg;
-
-  crit_.Enter();
-  while (PopSendMessageFromThread(source, &smsg)) {
-    crit_.Leave();
-
-    smsg.msg.phandler->OnMessage(&smsg.msg);
-
-    crit_.Enter();
-    *smsg.ready = true;
-    smsg.thread->socketserver()->WakeUp();
-  }
-  crit_.Leave();
-}
-
-bool Thread::PopSendMessageFromThread(const Thread* source, _SendMessage* msg) {
-  for (std::list<_SendMessage>::iterator it = sendlist_.begin();
-       it != sendlist_.end(); ++it) {
-    if (it->thread == source || source == nullptr) {
-      *msg = *it;
-      sendlist_.erase(it);
-      return true;
-    }
-  }
-  return false;
-}
-
-void Thread::InvokeInternal(const Location& posted_from,
-                            MessageHandler* handler) {
-  TRACE_EVENT2("webrtc", "Thread::Invoke", "src_file_and_line",
-               posted_from.file_and_line(), "src_func",
-               posted_from.function_name());
-  Send(posted_from, handler);
-}
-
-void Thread::Clear(MessageHandler* phandler,
-                   uint32_t id,
-                   MessageList* removed) {
-  CritScope cs(&crit_);
-
-  // Remove messages on sendlist_ with phandler
-  // Object target cleared: remove from send list, wakeup/set ready
-  // if sender not null.
-
-  std::list<_SendMessage>::iterator iter = sendlist_.begin();
-  while (iter != sendlist_.end()) {
-    _SendMessage smsg = *iter;
-    if (smsg.msg.Match(phandler, id)) {
-      if (removed) {
-        removed->push_back(smsg.msg);
-      } else {
-        delete smsg.msg.pdata;
-      }
-      iter = sendlist_.erase(iter);
-      *smsg.ready = true;
-      smsg.thread->socketserver()->WakeUp();
-      continue;
-    }
-    ++iter;
-  }
-
-  MessageQueue::Clear(phandler, id, removed);
-}
-
-#if !defined(WEBRTC_MAC)
-// Note that these methods have a separate implementation for mac and ios
-// defined in webrtc/rtc_base/thread_darwin.mm.
-bool Thread::ProcessMessages(int cmsLoop) {
-  // Using ProcessMessages with a custom clock for testing and a time greater
-  // than 0 doesn't work, since it's not guaranteed to advance the custom
-  // clock's time, and may get stuck in an infinite loop.
-  RTC_DCHECK(GetClockForTesting() == nullptr || cmsLoop == 0 ||
-             cmsLoop == kForever);
-  int64_t msEnd = (kForever == cmsLoop) ? 0 : TimeAfter(cmsLoop);
-  int cmsNext = cmsLoop;
-
-  while (true) {
-    Message msg;
-    if (!Get(&msg, cmsNext))
-      return !IsQuitting();
-    Dispatch(&msg);
-
-    if (cmsLoop != kForever) {
-      cmsNext = static_cast<int>(TimeUntil(msEnd));
-      if (cmsNext < 0)
-        return true;
-    }
-  }
-}
-#endif
-
-bool Thread::WrapCurrentWithThreadManager(ThreadManager* thread_manager,
-                                          bool need_synchronize_access) {
-  if (running())
-    return false;
-
-#if defined(WEBRTC_WIN)
-  if (need_synchronize_access) {
-    // We explicitly ask for no rights other than synchronization.
-    // This gives us the best chance of succeeding.
-    thread_ = OpenThread(SYNCHRONIZE, FALSE, GetCurrentThreadId());
-    if (!thread_) {
-      LOG_GLE(LS_ERROR) << "Unable to get handle to thread.";
-      return false;
-    }
-    thread_id_ = GetCurrentThreadId();
-  }
-#elif defined(WEBRTC_POSIX)
-  thread_ = pthread_self();
-#endif
-
-  owned_ = false;
-  running_.Set();
-  thread_manager->SetCurrentThread(this);
-  return true;
-}
-
-AutoThread::AutoThread() : Thread(SocketServer::CreateDefault()) {
-  if (!ThreadManager::Instance()->CurrentThread()) {
-    ThreadManager::Instance()->SetCurrentThread(this);
-  }
-}
-
-AutoThread::~AutoThread() {
-  Stop();
-  if (ThreadManager::Instance()->CurrentThread() == this) {
-    ThreadManager::Instance()->SetCurrentThread(nullptr);
-  }
-}
-
-AutoSocketServerThread::AutoSocketServerThread(SocketServer* ss)
-    : Thread(ss) {
-  old_thread_ = ThreadManager::Instance()->CurrentThread();
-  rtc::ThreadManager::Instance()->SetCurrentThread(this);
-  if (old_thread_) {
-    MessageQueueManager::Remove(old_thread_);
-  }
-}
-
-AutoSocketServerThread::~AutoSocketServerThread() {
-  RTC_DCHECK(ThreadManager::Instance()->CurrentThread() == this);
-  // Some tests post destroy messages to this thread. To avoid memory
-  // leaks, we have to process those messages. In particular
-  // P2PTransportChannelPingTest, relying on the message posted in
-  // cricket::Connection::Destroy.
-  ProcessMessages(0);
-  rtc::ThreadManager::Instance()->SetCurrentThread(old_thread_);
-  if (old_thread_) {
-    MessageQueueManager::Add(old_thread_);
-  }
-}
-
-}  // namespace rtc
diff --git a/rtc_base/thread.h b/rtc_base/thread.h
deleted file mode 100644
index d072fac..0000000
--- a/rtc_base/thread.h
+++ /dev/null
@@ -1,337 +0,0 @@
-/*
- *  Copyright 2004 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_RTC_BASE_THREAD_H_
-#define WEBRTC_RTC_BASE_THREAD_H_
-
-#include <algorithm>
-#include <list>
-#include <memory>
-#include <string>
-#include <vector>
-
-#if defined(WEBRTC_POSIX)
-#include <pthread.h>
-#endif
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/event.h"
-#include "webrtc/rtc_base/messagequeue.h"
-#include "webrtc/rtc_base/platform_thread_types.h"
-
-#if defined(WEBRTC_WIN)
-#include "webrtc/rtc_base/win32.h"
-#endif
-
-namespace rtc {
-
-class Thread;
-
-class ThreadManager {
- public:
-  static const int kForever = -1;
-
-  // Singleton, constructor and destructor are private.
-  static ThreadManager* Instance();
-
-  Thread* CurrentThread();
-  void SetCurrentThread(Thread* thread);
-
-  // Returns a thread object with its thread_ ivar set
-  // to whatever the OS uses to represent the thread.
-  // If there already *is* a Thread object corresponding to this thread,
-  // this method will return that.  Otherwise it creates a new Thread
-  // object whose wrapped() method will return true, and whose
-  // handle will, on Win32, be opened with only synchronization privileges -
-  // if you need more privilegs, rather than changing this method, please
-  // write additional code to adjust the privileges, or call a different
-  // factory method of your own devising, because this one gets used in
-  // unexpected contexts (like inside browser plugins) and it would be a
-  // shame to break it.  It is also conceivable on Win32 that we won't even
-  // be able to get synchronization privileges, in which case the result
-  // will have a null handle.
-  Thread *WrapCurrentThread();
-  void UnwrapCurrentThread();
-
-  bool IsMainThread();
-
- private:
-  ThreadManager();
-  ~ThreadManager();
-
-#if defined(WEBRTC_POSIX)
-  pthread_key_t key_;
-#endif
-
-#if defined(WEBRTC_WIN)
-  DWORD key_;
-#endif
-
-  // The thread to potentially autowrap.
-  PlatformThreadRef main_thread_ref_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(ThreadManager);
-};
-
-struct _SendMessage {
-  _SendMessage() {}
-  Thread *thread;
-  Message msg;
-  bool *ready;
-};
-
-class Runnable {
- public:
-  virtual ~Runnable() {}
-  virtual void Run(Thread* thread) = 0;
-
- protected:
-  Runnable() {}
-
- private:
-  RTC_DISALLOW_COPY_AND_ASSIGN(Runnable);
-};
-
-// WARNING! SUBCLASSES MUST CALL Stop() IN THEIR DESTRUCTORS!  See ~Thread().
-
-class RTC_LOCKABLE Thread : public MessageQueue {
- public:
-  // DEPRECATED.
-  // The default constructor should not be used because it hides whether or
-  // not a socket server will be associated with the thread. Most instances
-  // of Thread do actually not need one, so please use either of the Create*
-  // methods to construct an instance of Thread.
-  Thread();
-
-  explicit Thread(SocketServer* ss);
-  explicit Thread(std::unique_ptr<SocketServer> ss);
-
-  // NOTE: ALL SUBCLASSES OF Thread MUST CALL Stop() IN THEIR DESTRUCTORS (or
-  // guarantee Stop() is explicitly called before the subclass is destroyed).
-  // This is required to avoid a data race between the destructor modifying the
-  // vtable, and the Thread::PreRun calling the virtual method Run().
-  ~Thread() override;
-
-  static std::unique_ptr<Thread> CreateWithSocketServer();
-  static std::unique_ptr<Thread> Create();
-  static Thread* Current();
-
-  // Used to catch performance regressions. Use this to disallow blocking calls
-  // (Invoke) for a given scope.  If a synchronous call is made while this is in
-  // effect, an assert will be triggered.
-  // Note that this is a single threaded class.
-  class ScopedDisallowBlockingCalls {
-   public:
-    ScopedDisallowBlockingCalls();
-    ~ScopedDisallowBlockingCalls();
-   private:
-    Thread* const thread_;
-    const bool previous_state_;
-  };
-
-  bool IsCurrent() const;
-
-  // Sleeps the calling thread for the specified number of milliseconds, during
-  // which time no processing is performed. Returns false if sleeping was
-  // interrupted by a signal (POSIX only).
-  static bool SleepMs(int millis);
-
-  // Sets the thread's name, for debugging. Must be called before Start().
-  // If |obj| is non-null, its value is appended to |name|.
-  const std::string& name() const { return name_; }
-  bool SetName(const std::string& name, const void* obj);
-
-  // Starts the execution of the thread.
-  bool Start(Runnable* runnable = nullptr);
-
-  // Tells the thread to stop and waits until it is joined.
-  // Never call Stop on the current thread.  Instead use the inherited Quit
-  // function which will exit the base MessageQueue without terminating the
-  // underlying OS thread.
-  virtual void Stop();
-
-  // By default, Thread::Run() calls ProcessMessages(kForever).  To do other
-  // work, override Run().  To receive and dispatch messages, call
-  // ProcessMessages occasionally.
-  virtual void Run();
-
-  virtual void Send(const Location& posted_from,
-                    MessageHandler* phandler,
-                    uint32_t id = 0,
-                    MessageData* pdata = nullptr);
-
-  // Convenience method to invoke a functor on another thread.  Caller must
-  // provide the |ReturnT| template argument, which cannot (easily) be deduced.
-  // Uses Send() internally, which blocks the current thread until execution
-  // is complete.
-  // Ex: bool result = thread.Invoke<bool>(RTC_FROM_HERE,
-  // &MyFunctionReturningBool);
-  // NOTE: This function can only be called when synchronous calls are allowed.
-  // See ScopedDisallowBlockingCalls for details.
-  template <class ReturnT, class FunctorT>
-  ReturnT Invoke(const Location& posted_from, const FunctorT& functor) {
-    FunctorMessageHandler<ReturnT, FunctorT> handler(functor);
-    InvokeInternal(posted_from, &handler);
-    return handler.MoveResult();
-  }
-
-  // From MessageQueue
-  void Clear(MessageHandler* phandler,
-             uint32_t id = MQID_ANY,
-             MessageList* removed = nullptr) override;
-  void ReceiveSends() override;
-
-  // ProcessMessages will process I/O and dispatch messages until:
-  //  1) cms milliseconds have elapsed (returns true)
-  //  2) Stop() is called (returns false)
-  bool ProcessMessages(int cms);
-
-  // Returns true if this is a thread that we created using the standard
-  // constructor, false if it was created by a call to
-  // ThreadManager::WrapCurrentThread().  The main thread of an application
-  // is generally not owned, since the OS representation of the thread
-  // obviously exists before we can get to it.
-  // You cannot call Start on non-owned threads.
-  bool IsOwned();
-
-#if defined(WEBRTC_WIN)
-  HANDLE GetHandle() const {
-    return thread_;
-  }
-  DWORD GetId() const {
-    return thread_id_;
-  }
-#elif defined(WEBRTC_POSIX)
-  pthread_t GetPThread() {
-    return thread_;
-  }
-#endif
-
-  // Expose private method running() for tests.
-  //
-  // DANGER: this is a terrible public API.  Most callers that might want to
-  // call this likely do not have enough control/knowledge of the Thread in
-  // question to guarantee that the returned value remains true for the duration
-  // of whatever code is conditionally executing because of the return value!
-  bool RunningForTest() { return running(); }
-
-  // Sets the per-thread allow-blocking-calls flag and returns the previous
-  // value. Must be called on this thread.
-  bool SetAllowBlockingCalls(bool allow);
-
-  // These functions are public to avoid injecting test hooks. Don't call them
-  // outside of tests.
-  // This method should be called when thread is created using non standard
-  // method, like derived implementation of rtc::Thread and it can not be
-  // started by calling Start(). This will set started flag to true and
-  // owned to false. This must be called from the current thread.
-  bool WrapCurrent();
-  void UnwrapCurrent();
-
- protected:
-  // Same as WrapCurrent except that it never fails as it does not try to
-  // acquire the synchronization access of the thread. The caller should never
-  // call Stop() or Join() on this thread.
-  void SafeWrapCurrent();
-
-  // Blocks the calling thread until this thread has terminated.
-  void Join();
-
-  static void AssertBlockingIsAllowedOnCurrentThread();
-
-  friend class ScopedDisallowBlockingCalls;
-
- private:
-  struct ThreadInit {
-    Thread* thread;
-    Runnable* runnable;
-  };
-
-#if defined(WEBRTC_WIN)
-  static DWORD WINAPI PreRun(LPVOID context);
-#else
-  static void *PreRun(void *pv);
-#endif
-
-  // ThreadManager calls this instead WrapCurrent() because
-  // ThreadManager::Instance() cannot be used while ThreadManager is
-  // being created.
-  // The method tries to get synchronization rights of the thread on Windows if
-  // |need_synchronize_access| is true.
-  bool WrapCurrentWithThreadManager(ThreadManager* thread_manager,
-                                    bool need_synchronize_access);
-
-  // Return true if the thread was started and hasn't yet stopped.
-  bool running() { return running_.Wait(0); }
-
-  // Processes received "Send" requests. If |source| is not null, only requests
-  // from |source| are processed, otherwise, all requests are processed.
-  void ReceiveSendsFromThread(const Thread* source);
-
-  // If |source| is not null, pops the first "Send" message from |source| in
-  // |sendlist_|, otherwise, pops the first "Send" message of |sendlist_|.
-  // The caller must lock |crit_| before calling.
-  // Returns true if there is such a message.
-  bool PopSendMessageFromThread(const Thread* source, _SendMessage* msg);
-
-  void InvokeInternal(const Location& posted_from, MessageHandler* handler);
-
-  std::list<_SendMessage> sendlist_;
-  std::string name_;
-  Event running_;  // Signalled means running.
-
-#if defined(WEBRTC_POSIX)
-  pthread_t thread_;
-#endif
-
-#if defined(WEBRTC_WIN)
-  HANDLE thread_;
-  DWORD thread_id_;
-#endif
-
-  bool owned_;
-  bool blocking_calls_allowed_;  // By default set to |true|.
-
-  friend class ThreadManager;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(Thread);
-};
-
-// AutoThread automatically installs itself at construction
-// uninstalls at destruction, if a Thread object is
-// _not already_ associated with the current OS thread.
-
-class AutoThread : public Thread {
- public:
-  AutoThread();
-  ~AutoThread() override;
-
- private:
-  RTC_DISALLOW_COPY_AND_ASSIGN(AutoThread);
-};
-
-// AutoSocketServerThread automatically installs itself at
-// construction and uninstalls at destruction. If a Thread object is
-// already associated with the current OS thread, it is temporarily
-// disassociated and restored by the destructor.
-
-class AutoSocketServerThread : public Thread {
- public:
-  explicit AutoSocketServerThread(SocketServer* ss);
-  ~AutoSocketServerThread() override;
-
- private:
-  rtc::Thread* old_thread_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(AutoSocketServerThread);
-};
-
-}  // namespace rtc
-
-#endif  // WEBRTC_RTC_BASE_THREAD_H_
diff --git a/rtc_base/thread_annotations.h b/rtc_base/thread_annotations.h
deleted file mode 100644
index bbd2c71..0000000
--- a/rtc_base/thread_annotations.h
+++ /dev/null
@@ -1,101 +0,0 @@
-//
-// Copyright (c) 2013 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.
-//
-// Borrowed from
-// https://code.google.com/p/gperftools/source/browse/src/base/thread_annotations.h
-// but adapted for clang attributes instead of the gcc.
-//
-// This header file contains the macro definitions for thread safety
-// annotations that allow the developers to document the locking policies
-// of their multi-threaded code. The annotations can also help program
-// analysis tools to identify potential thread safety issues.
-
-#ifndef WEBRTC_RTC_BASE_THREAD_ANNOTATIONS_H_
-#define WEBRTC_RTC_BASE_THREAD_ANNOTATIONS_H_
-
-#if defined(__clang__) && (!defined(SWIG))
-#define RTC_THREAD_ANNOTATION_ATTRIBUTE__(x) __attribute__((x))
-#else
-#define RTC_THREAD_ANNOTATION_ATTRIBUTE__(x)  // no-op
-#endif
-
-// Document if a shared variable/field needs to be protected by a lock.
-// GUARDED_BY allows the user to specify a particular lock that should be
-// held when accessing the annotated variable, while GUARDED_VAR only
-// indicates a shared variable should be guarded (by any lock). GUARDED_VAR
-// is primarily used when the client cannot express the name of the lock.
-#define RTC_GUARDED_BY(x) RTC_THREAD_ANNOTATION_ATTRIBUTE__(guarded_by(x))
-#define RTC_GUARDED_VAR RTC_THREAD_ANNOTATION_ATTRIBUTE__(guarded_var)
-
-// Document if the memory location pointed to by a pointer should be guarded
-// by a lock when dereferencing the pointer. Similar to GUARDED_VAR,
-// PT_GUARDED_VAR is primarily used when the client cannot express the name
-// of the lock. Note that a pointer variable to a shared memory location
-// could itself be a shared variable. For example, if a shared global pointer
-// q, which is guarded by mu1, points to a shared memory location that is
-// guarded by mu2, q should be annotated as follows:
-//     int *q GUARDED_BY(mu1) PT_GUARDED_BY(mu2);
-#define RTC_PT_GUARDED_BY(x) RTC_THREAD_ANNOTATION_ATTRIBUTE__(pt_guarded_by(x))
-#define RTC_PT_GUARDED_VAR RTC_THREAD_ANNOTATION_ATTRIBUTE__(pt_guarded_var)
-
-// Document the acquisition order between locks that can be held
-// simultaneously by a thread. For any two locks that need to be annotated
-// to establish an acquisition order, only one of them needs the annotation.
-// (i.e. You don't have to annotate both locks with both ACQUIRED_AFTER
-// and ACQUIRED_BEFORE.)
-#define RTC_ACQUIRED_AFTER(x) \
-  RTC_THREAD_ANNOTATION_ATTRIBUTE__(acquired_after(x))
-#define RTC_ACQUIRED_BEFORE(x) \
-  RTC_THREAD_ANNOTATION_ATTRIBUTE__(acquired_before(x))
-
-// The following three annotations document the lock requirements for
-// functions/methods.
-
-// Document if a function expects certain locks to be held before it is called
-#define RTC_EXCLUSIVE_LOCKS_REQUIRED(...) \
-  RTC_THREAD_ANNOTATION_ATTRIBUTE__(exclusive_locks_required(__VA_ARGS__))
-#define RTC_SHARED_LOCKS_REQUIRED(...) \
-  RTC_THREAD_ANNOTATION_ATTRIBUTE__(shared_locks_required(__VA_ARGS__))
-
-// Document the locks acquired in the body of the function. These locks
-// cannot be held when calling this function (as google3's Mutex locks are
-// non-reentrant).
-#define RTC_LOCKS_EXCLUDED(...) \
-  RTC_THREAD_ANNOTATION_ATTRIBUTE__(locks_excluded(__VA_ARGS__))
-
-// Document the lock the annotated function returns without acquiring it.
-#define RTC_LOCK_RETURNED(x) RTC_THREAD_ANNOTATION_ATTRIBUTE__(lock_returned(x))
-
-// Document if a class/type is a lockable type (such as the Mutex class).
-#define RTC_LOCKABLE RTC_THREAD_ANNOTATION_ATTRIBUTE__(lockable)
-
-// Document if a class is a scoped lockable type (such as the MutexLock class).
-#define RTC_SCOPED_LOCKABLE RTC_THREAD_ANNOTATION_ATTRIBUTE__(scoped_lockable)
-
-// The following annotations specify lock and unlock primitives.
-#define RTC_EXCLUSIVE_LOCK_FUNCTION(...) \
-  RTC_THREAD_ANNOTATION_ATTRIBUTE__(exclusive_lock_function(__VA_ARGS__))
-
-#define RTC_SHARED_LOCK_FUNCTION(...) \
-  RTC_THREAD_ANNOTATION_ATTRIBUTE__(shared_lock_function(__VA_ARGS__))
-
-#define RTC_EXCLUSIVE_TRYLOCK_FUNCTION(...) \
-  RTC_THREAD_ANNOTATION_ATTRIBUTE__(exclusive_trylock_function(__VA_ARGS__))
-
-#define RTC_SHARED_TRYLOCK_FUNCTION(...) \
-  RTC_THREAD_ANNOTATION_ATTRIBUTE__(shared_trylock_function(__VA_ARGS__))
-
-#define RTC_UNLOCK_FUNCTION(...) \
-  RTC_THREAD_ANNOTATION_ATTRIBUTE__(unlock_function(__VA_ARGS__))
-
-// An escape hatch for thread safety analysis to ignore the annotated function.
-#define RTC_NO_THREAD_SAFETY_ANALYSIS \
-  RTC_THREAD_ANNOTATION_ATTRIBUTE__(no_thread_safety_analysis)
-
-#endif  // WEBRTC_RTC_BASE_THREAD_ANNOTATIONS_H_
diff --git a/rtc_base/thread_annotations_unittest.cc b/rtc_base/thread_annotations_unittest.cc
deleted file mode 100644
index c8c3c37..0000000
--- a/rtc_base/thread_annotations_unittest.cc
+++ /dev/null
@@ -1,153 +0,0 @@
-/*
- *  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/rtc_base/thread_annotations.h"
-#include "webrtc/test/gtest.h"
-
-namespace {
-
-class RTC_LOCKABLE Lock {
- public:
-  void EnterWrite() const RTC_EXCLUSIVE_LOCK_FUNCTION() {}
-  void EnterRead() const RTC_SHARED_LOCK_FUNCTION() {}
-  bool TryEnterWrite() const RTC_EXCLUSIVE_TRYLOCK_FUNCTION(true) {
-    return true;
-  }
-  bool TryEnterRead() const RTC_SHARED_TRYLOCK_FUNCTION(true) { return true; }
-  void Leave() const RTC_UNLOCK_FUNCTION() {}
-};
-
-class RTC_SCOPED_LOCKABLE ScopeLock {
- public:
-  explicit ScopeLock(const Lock& lock) RTC_EXCLUSIVE_LOCK_FUNCTION(lock) {}
-  ~ScopeLock() RTC_UNLOCK_FUNCTION() {}
-};
-
-class ThreadSafe {
- public:
-  ThreadSafe() {
-    pt_protected_by_lock_ = new int;
-    pt_protected_by_anything_ = new int;
-  }
-
-  ~ThreadSafe() {
-    delete pt_protected_by_lock_;
-    delete pt_protected_by_anything_;
-  }
-
-  void LockInOrder() {
-    anylock_.EnterWrite();
-    lock_.EnterWrite();
-    pt_lock_.EnterWrite();
-
-    pt_lock_.Leave();
-    lock_.Leave();
-    anylock_.Leave();
-  }
-
-  void UnprotectedFunction() RTC_LOCKS_EXCLUDED(anylock_, lock_, pt_lock_) {
-    // Can access unprotected Value.
-    unprotected_ = 15;
-    // Can access pointers themself, but not data they point to.
-    int* tmp = pt_protected_by_lock_;
-    pt_protected_by_lock_ = pt_protected_by_anything_;
-    pt_protected_by_anything_ = tmp;
-  }
-
-  void ReadProtected() {
-    lock_.EnterRead();
-    unprotected_ = protected_by_anything_;
-    unprotected_ = protected_by_lock_;
-    lock_.Leave();
-
-    if (pt_lock_.TryEnterRead()) {
-      unprotected_ = *pt_protected_by_anything_;
-      unprotected_ = *pt_protected_by_lock_;
-      pt_lock_.Leave();
-    }
-
-    anylock_.EnterRead();
-    unprotected_ = protected_by_anything_;
-    unprotected_ = *pt_protected_by_anything_;
-    anylock_.Leave();
-  }
-
-  void WriteProtected() {
-    lock_.EnterWrite();
-    protected_by_anything_ = unprotected_;
-    protected_by_lock_ = unprotected_;
-    lock_.Leave();
-
-    if (pt_lock_.TryEnterWrite()) {
-      *pt_protected_by_anything_ = unprotected_;
-      *pt_protected_by_lock_ = unprotected_;
-      pt_lock_.Leave();
-    }
-
-    anylock_.EnterWrite();
-    protected_by_anything_ = unprotected_;
-    *pt_protected_by_anything_ = unprotected_;
-    anylock_.Leave();
-  }
-
-  void CallReadProtectedFunction() {
-    lock_.EnterRead();
-    pt_lock_.EnterRead();
-    ReadProtectedFunction();
-    pt_lock_.Leave();
-    lock_.Leave();
-  }
-
-  void CallWriteProtectedFunction() {
-    ScopeLock scope_lock(GetLock());
-    ScopeLock pt_scope_lock(pt_lock_);
-    WriteProtectedFunction();
-  }
-
- private:
-  void ReadProtectedFunction() RTC_SHARED_LOCKS_REQUIRED(lock_, pt_lock_) {
-    unprotected_ = protected_by_lock_;
-    unprotected_ = *pt_protected_by_lock_;
-  }
-
-  void WriteProtectedFunction() RTC_EXCLUSIVE_LOCKS_REQUIRED(lock_, pt_lock_) {
-    int x = protected_by_lock_;
-    *pt_protected_by_lock_ = x;
-    protected_by_lock_ = unprotected_;
-  }
-
-  const Lock& GetLock() RTC_LOCK_RETURNED(lock_) { return lock_; }
-
-  Lock anylock_ RTC_ACQUIRED_BEFORE(lock_);
-  Lock lock_;
-  Lock pt_lock_ RTC_ACQUIRED_AFTER(lock_);
-
-  int unprotected_ = 0;
-
-  int protected_by_lock_ RTC_GUARDED_BY(lock_) = 0;
-  int protected_by_anything_ RTC_GUARDED_VAR = 0;
-
-  int* pt_protected_by_lock_ RTC_PT_GUARDED_BY(pt_lock_);
-  int* pt_protected_by_anything_ RTC_PT_GUARDED_VAR;
-};
-
-}  // namespace
-
-TEST(ThreadAnnotationsTest, Test) {
-  // This test ensure thread annotations doesn't break compilation.
-  // Thus no run-time expectations.
-  ThreadSafe t;
-  t.LockInOrder();
-  t.UnprotectedFunction();
-  t.ReadProtected();
-  t.WriteProtected();
-  t.CallReadProtectedFunction();
-  t.CallWriteProtectedFunction();
-}
diff --git a/rtc_base/thread_checker.h b/rtc_base/thread_checker.h
deleted file mode 100644
index 89428fd..0000000
--- a/rtc_base/thread_checker.h
+++ /dev/null
@@ -1,176 +0,0 @@
-/*
- *  Copyright (c) 2014 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.
- */
-
-// Borrowed from Chromium's src/base/threading/thread_checker.h.
-
-#ifndef WEBRTC_RTC_BASE_THREAD_CHECKER_H_
-#define WEBRTC_RTC_BASE_THREAD_CHECKER_H_
-
-// Apart from debug builds, we also enable the thread checker in
-// builds with RTC_DCHECK_IS_ON so that trybots and waterfall bots
-// with this define will get the same level of thread checking as
-// debug bots.
-#define RTC_ENABLE_THREAD_CHECKER RTC_DCHECK_IS_ON
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/thread_annotations.h"
-#include "webrtc/rtc_base/thread_checker_impl.h"
-
-namespace rtc {
-
-// Do nothing implementation, for use in release mode.
-//
-// Note: You should almost always use the ThreadChecker class to get the
-// right version for your build configuration.
-class ThreadCheckerDoNothing {
- public:
-  bool CalledOnValidThread() const {
-    return true;
-  }
-
-  void DetachFromThread() {}
-};
-
-// ThreadChecker is a helper class used to help verify that some methods of a
-// class are called from the same thread. It provides identical functionality to
-// base::NonThreadSafe, but it is meant to be held as a member variable, rather
-// than inherited from base::NonThreadSafe.
-//
-// While inheriting from base::NonThreadSafe may give a clear indication about
-// the thread-safety of a class, it may also lead to violations of the style
-// guide with regard to multiple inheritance. The choice between having a
-// ThreadChecker member and inheriting from base::NonThreadSafe should be based
-// on whether:
-//  - Derived classes need to know the thread they belong to, as opposed to
-//    having that functionality fully encapsulated in the base class.
-//  - Derived classes should be able to reassign the base class to another
-//    thread, via DetachFromThread.
-//
-// If neither of these are true, then having a ThreadChecker member and calling
-// CalledOnValidThread is the preferable solution.
-//
-// Example:
-// class MyClass {
-//  public:
-//   void Foo() {
-//     RTC_DCHECK(thread_checker_.CalledOnValidThread());
-//     ... (do stuff) ...
-//   }
-//
-//  private:
-//   ThreadChecker thread_checker_;
-// }
-//
-// In Release mode, CalledOnValidThread will always return true.
-#if RTC_ENABLE_THREAD_CHECKER
-class RTC_LOCKABLE ThreadChecker : public ThreadCheckerImpl {};
-#else
-class RTC_LOCKABLE ThreadChecker : public ThreadCheckerDoNothing {};
-#endif  // RTC_ENABLE_THREAD_CHECKER
-
-#undef RTC_ENABLE_THREAD_CHECKER
-
-namespace internal {
-class RTC_SCOPED_LOCKABLE AnnounceOnThread {
- public:
-  template <typename ThreadLikeObject>
-  explicit AnnounceOnThread(const ThreadLikeObject* thread_like_object)
-      RTC_EXCLUSIVE_LOCK_FUNCTION(thread_like_object) {}
-  ~AnnounceOnThread() RTC_UNLOCK_FUNCTION() {}
-
-  template<typename ThreadLikeObject>
-  static bool IsCurrent(const ThreadLikeObject* thread_like_object) {
-    return thread_like_object->IsCurrent();
-  }
-  static bool IsCurrent(const rtc::ThreadChecker* checker) {
-    return checker->CalledOnValidThread();
-  }
-
- private:
-  RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(AnnounceOnThread);
-};
-
-}  // namespace internal
-}  // namespace rtc
-
-// RTC_RUN_ON/RTC_ACCESS_ON/RTC_DCHECK_RUN_ON macros allows to annotate
-// variables are accessed from same thread/task queue.
-// Using tools designed to check mutexes, it checks at compile time everywhere
-// variable is access, there is a run-time dcheck thread/task queue is correct.
-//
-// class ExampleThread {
-//  public:
-//   void NeedVar1() {
-//     RTC_DCHECK_RUN_ON(network_thread_);
-//     transport_->Send();
-//   }
-//
-//  private:
-//   rtc::Thread* network_thread_;
-//   int transport_ RTC_ACCESS_ON(network_thread_);
-// };
-//
-// class ExampleThreadChecker {
-//  public:
-//   int CalledFromPacer() RTC_RUN_ON(pacer_thread_checker_) {
-//     return var2_;
-//   }
-//
-//   void CallMeFromPacer() {
-//     RTC_DCHECK_RUN_ON(&pacer_thread_checker_)
-//        << "Should be called from pacer";
-//     CalledFromPacer();
-//   }
-//
-//  private:
-//   int pacer_var_ RTC_ACCESS_ON(pacer_thread_checker_);
-//   rtc::ThreadChecker pacer_thread_checker_;
-// };
-//
-// class TaskQueueExample {
-//  public:
-//   class Encoder {
-//    public:
-//     rtc::TaskQueue* Queue() { return encoder_queue_; }
-//     void Encode() {
-//       RTC_DCHECK_RUN_ON(encoder_queue_);
-//       DoSomething(var_);
-//     }
-//
-//    private:
-//     rtc::TaskQueue* const encoder_queue_;
-//     Frame var_ RTC_ACCESS_ON(encoder_queue_);
-//   };
-//
-//   void Encode() {
-//     // Will fail at runtime when DCHECK is enabled:
-//     // encoder_->Encode();
-//     // Will work:
-//     rtc::scoped_ref_ptr<Encoder> encoder = encoder_;
-//     encoder_->Queue()->PostTask([encoder] { encoder->Encode(); });
-//   }
-//
-//  private:
-//   rtc::scoped_ref_ptr<Encoder> encoder_;
-// }
-
-// Document if a variable/field is not shared and should be accessed from
-// same thread/task queue.
-#define RTC_ACCESS_ON(x) RTC_THREAD_ANNOTATION_ATTRIBUTE__(guarded_by(x))
-
-// Document if a function expected to be called from same thread/task queue.
-#define RTC_RUN_ON(x) RTC_THREAD_ANNOTATION_ATTRIBUTE__(exclusive_locks_required(x))
-
-#define RTC_DCHECK_RUN_ON(thread_like_object) \
-  rtc::internal::AnnounceOnThread thread_announcer(thread_like_object); \
-  RTC_DCHECK(rtc::internal::AnnounceOnThread::IsCurrent(thread_like_object))
-
-#endif  // WEBRTC_RTC_BASE_THREAD_CHECKER_H_
diff --git a/rtc_base/thread_checker_impl.cc b/rtc_base/thread_checker_impl.cc
deleted file mode 100644
index 307d6f8..0000000
--- a/rtc_base/thread_checker_impl.cc
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- *  Copyright (c) 2014 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.
- */
-
-// Borrowed from Chromium's src/base/threading/thread_checker_impl.cc.
-
-#include "webrtc/rtc_base/thread_checker_impl.h"
-
-#include "webrtc/rtc_base/platform_thread.h"
-
-namespace rtc {
-
-ThreadCheckerImpl::ThreadCheckerImpl() : valid_thread_(CurrentThreadRef()) {
-}
-
-ThreadCheckerImpl::~ThreadCheckerImpl() {
-}
-
-bool ThreadCheckerImpl::CalledOnValidThread() const {
-  const PlatformThreadRef current_thread = CurrentThreadRef();
-  CritScope scoped_lock(&lock_);
-  if (!valid_thread_)  // Set if previously detached.
-    valid_thread_ = current_thread;
-  return IsThreadRefEqual(valid_thread_, current_thread);
-}
-
-void ThreadCheckerImpl::DetachFromThread() {
-  CritScope scoped_lock(&lock_);
-  valid_thread_ = 0;
-}
-
-}  // namespace rtc
diff --git a/rtc_base/thread_checker_impl.h b/rtc_base/thread_checker_impl.h
deleted file mode 100644
index 628e9b3..0000000
--- a/rtc_base/thread_checker_impl.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- *  Copyright (c) 2014 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.
- */
-
-// Borrowed from Chromium's src/base/threading/thread_checker_impl.h.
-
-#ifndef WEBRTC_RTC_BASE_THREAD_CHECKER_IMPL_H_
-#define WEBRTC_RTC_BASE_THREAD_CHECKER_IMPL_H_
-
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/platform_thread_types.h"
-
-namespace rtc {
-
-// Real implementation of ThreadChecker, for use in debug mode, or
-// for temporary use in release mode (e.g. to RTC_CHECK on a threading issue
-// seen only in the wild).
-//
-// Note: You should almost always use the ThreadChecker class to get the
-// right version for your build configuration.
-class ThreadCheckerImpl {
- public:
-  ThreadCheckerImpl();
-  ~ThreadCheckerImpl();
-
-  bool CalledOnValidThread() const;
-
-  // Changes the thread that is checked for in CalledOnValidThread.  This may
-  // be useful when an object may be created on one thread and then used
-  // exclusively on another thread.
-  void DetachFromThread();
-
- private:
-  CriticalSection lock_;
-  // This is mutable so that CalledOnValidThread can set it.
-  // It's guarded by |lock_|.
-  mutable PlatformThreadRef valid_thread_;
-};
-
-}  // namespace rtc
-
-#endif  // WEBRTC_RTC_BASE_THREAD_CHECKER_IMPL_H_
diff --git a/rtc_base/thread_checker_unittest.cc b/rtc_base/thread_checker_unittest.cc
deleted file mode 100644
index ba5c695..0000000
--- a/rtc_base/thread_checker_unittest.cc
+++ /dev/null
@@ -1,259 +0,0 @@
-/*
- *  Copyright (c) 2014 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.
- */
-
-// Borrowed from Chromium's src/base/threading/thread_checker_unittest.cc.
-
-#include <memory>
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/nullsocketserver.h"
-#include "webrtc/rtc_base/task_queue.h"
-#include "webrtc/rtc_base/thread.h"
-#include "webrtc/rtc_base/thread_checker.h"
-#include "webrtc/test/gtest.h"
-
-// Duplicated from base/threading/thread_checker.h so that we can be
-// good citizens there and undef the macro.
-#define ENABLE_THREAD_CHECKER RTC_DCHECK_IS_ON
-
-namespace rtc {
-
-namespace {
-
-// Simple class to exercise the basics of ThreadChecker.
-// Both the destructor and DoStuff should verify that they were
-// called on the same thread as the constructor.
-class ThreadCheckerClass : public ThreadChecker {
- public:
-  ThreadCheckerClass() {}
-
-  // Verifies that it was called on the same thread as the constructor.
-  void DoStuff() { RTC_DCHECK(CalledOnValidThread()); }
-
-  void DetachFromThread() {
-    ThreadChecker::DetachFromThread();
-  }
-
-  static void MethodOnDifferentThreadImpl();
-  static void DetachThenCallFromDifferentThreadImpl();
-
- private:
-  RTC_DISALLOW_COPY_AND_ASSIGN(ThreadCheckerClass);
-};
-
-// Calls ThreadCheckerClass::DoStuff on another thread.
-class CallDoStuffOnThread : public Thread {
- public:
-  explicit CallDoStuffOnThread(ThreadCheckerClass* thread_checker_class)
-      : Thread(std::unique_ptr<SocketServer>(new rtc::NullSocketServer())),
-        thread_checker_class_(thread_checker_class) {
-    SetName("call_do_stuff_on_thread", nullptr);
-  }
-
-  void Run() override { thread_checker_class_->DoStuff(); }
-
-  // New method. Needed since Thread::Join is protected, and it is called by
-  // the TEST.
-  void Join() {
-    Thread::Join();
-  }
-
- private:
-  ThreadCheckerClass* thread_checker_class_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(CallDoStuffOnThread);
-};
-
-// Deletes ThreadCheckerClass on a different thread.
-class DeleteThreadCheckerClassOnThread : public Thread {
- public:
-  explicit DeleteThreadCheckerClassOnThread(
-      std::unique_ptr<ThreadCheckerClass> thread_checker_class)
-      : Thread(std::unique_ptr<SocketServer>(new rtc::NullSocketServer())),
-        thread_checker_class_(std::move(thread_checker_class)) {
-    SetName("delete_thread_checker_class_on_thread", nullptr);
-  }
-
-  void Run() override { thread_checker_class_.reset(); }
-
-  // New method. Needed since Thread::Join is protected, and it is called by
-  // the TEST.
-  void Join() {
-    Thread::Join();
-  }
-
-  bool has_been_deleted() const { return !thread_checker_class_; }
-
- private:
-  std::unique_ptr<ThreadCheckerClass> thread_checker_class_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(DeleteThreadCheckerClassOnThread);
-};
-
-}  // namespace
-
-TEST(ThreadCheckerTest, CallsAllowedOnSameThread) {
-  std::unique_ptr<ThreadCheckerClass> thread_checker_class(
-      new ThreadCheckerClass);
-
-  // Verify that DoStuff doesn't assert.
-  thread_checker_class->DoStuff();
-
-  // Verify that the destructor doesn't assert.
-  thread_checker_class.reset();
-}
-
-TEST(ThreadCheckerTest, DestructorAllowedOnDifferentThread) {
-  std::unique_ptr<ThreadCheckerClass> thread_checker_class(
-      new ThreadCheckerClass);
-
-  // Verify that the destructor doesn't assert
-  // when called on a different thread.
-  DeleteThreadCheckerClassOnThread delete_on_thread(
-      std::move(thread_checker_class));
-
-  EXPECT_FALSE(delete_on_thread.has_been_deleted());
-
-  delete_on_thread.Start();
-  delete_on_thread.Join();
-
-  EXPECT_TRUE(delete_on_thread.has_been_deleted());
-}
-
-TEST(ThreadCheckerTest, DetachFromThread) {
-  std::unique_ptr<ThreadCheckerClass> thread_checker_class(
-      new ThreadCheckerClass);
-
-  // Verify that DoStuff doesn't assert when called on a different thread after
-  // a call to DetachFromThread.
-  thread_checker_class->DetachFromThread();
-  CallDoStuffOnThread call_on_thread(thread_checker_class.get());
-
-  call_on_thread.Start();
-  call_on_thread.Join();
-}
-
-#if GTEST_HAS_DEATH_TEST || !ENABLE_THREAD_CHECKER
-
-void ThreadCheckerClass::MethodOnDifferentThreadImpl() {
-  std::unique_ptr<ThreadCheckerClass> thread_checker_class(
-      new ThreadCheckerClass);
-
-  // DoStuff should assert in debug builds only when called on a
-  // different thread.
-  CallDoStuffOnThread call_on_thread(thread_checker_class.get());
-
-  call_on_thread.Start();
-  call_on_thread.Join();
-}
-
-#if ENABLE_THREAD_CHECKER
-TEST(ThreadCheckerDeathTest, MethodNotAllowedOnDifferentThreadInDebug) {
-  ASSERT_DEATH({
-      ThreadCheckerClass::MethodOnDifferentThreadImpl();
-    }, "");
-}
-#else
-TEST(ThreadCheckerTest, MethodAllowedOnDifferentThreadInRelease) {
-  ThreadCheckerClass::MethodOnDifferentThreadImpl();
-}
-#endif  // ENABLE_THREAD_CHECKER
-
-void ThreadCheckerClass::DetachThenCallFromDifferentThreadImpl() {
-  std::unique_ptr<ThreadCheckerClass> thread_checker_class(
-      new ThreadCheckerClass);
-
-  // DoStuff doesn't assert when called on a different thread
-  // after a call to DetachFromThread.
-  thread_checker_class->DetachFromThread();
-  CallDoStuffOnThread call_on_thread(thread_checker_class.get());
-
-  call_on_thread.Start();
-  call_on_thread.Join();
-
-  // DoStuff should assert in debug builds only after moving to
-  // another thread.
-  thread_checker_class->DoStuff();
-}
-
-#if ENABLE_THREAD_CHECKER
-TEST(ThreadCheckerDeathTest, DetachFromThreadInDebug) {
-  ASSERT_DEATH({
-    ThreadCheckerClass::DetachThenCallFromDifferentThreadImpl();
-    }, "");
-}
-#else
-TEST(ThreadCheckerTest, DetachFromThreadInRelease) {
-  ThreadCheckerClass::DetachThenCallFromDifferentThreadImpl();
-}
-#endif  // ENABLE_THREAD_CHECKER
-
-#endif  // GTEST_HAS_DEATH_TEST || !ENABLE_THREAD_CHECKER
-
-class ThreadAnnotateTest {
- public:
-  // Next two function should create warnings when compile (e.g. if used with
-  // specific T).
-  // TODO(danilchap): Find a way to test they do not compile when thread
-  // annotation checks enabled.
-  template<typename T>
-  void access_var_no_annotate() {
-    var_thread_ = 42;
-  }
-
-  template<typename T>
-  void access_fun_no_annotate() {
-    function();
-  }
-
-  // Functions below should be able to compile.
-  void access_var_annotate_thread() {
-    RTC_DCHECK_RUN_ON(thread_);
-    var_thread_ = 42;
-  }
-
-  void access_var_annotate_checker() {
-    RTC_DCHECK_RUN_ON(&checker_);
-    var_checker_ = 44;
-  }
-
-  void access_var_annotate_queue() {
-    RTC_DCHECK_RUN_ON(queue_);
-    var_queue_ = 46;
-  }
-
-  void access_fun_annotate() {
-    RTC_DCHECK_RUN_ON(thread_);
-    function();
-  }
-
-  void access_fun_and_var() {
-    RTC_DCHECK_RUN_ON(thread_);
-    fun_acccess_var();
-  }
-
- private:
-  void function() RTC_RUN_ON(thread_) {}
-  void fun_acccess_var() RTC_RUN_ON(thread_) { var_thread_ = 13; }
-
-  rtc::Thread* thread_;
-  rtc::ThreadChecker checker_;
-  rtc::TaskQueue* queue_;
-
-  int var_thread_ RTC_ACCESS_ON(thread_);
-  int var_checker_ RTC_GUARDED_BY(checker_);
-  int var_queue_ RTC_ACCESS_ON(queue_);
-};
-
-// Just in case we ever get lumped together with other compilation units.
-#undef ENABLE_THREAD_CHECKER
-
-}  // namespace rtc
diff --git a/rtc_base/thread_darwin.mm b/rtc_base/thread_darwin.mm
deleted file mode 100644
index a673f28..0000000
--- a/rtc_base/thread_darwin.mm
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- *  Copyright 2017 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/rtc_base/thread.h"
-
-#import <Foundation/Foundation.h>
-
-#include "webrtc/rtc_base/platform_thread.h"
-
-/*
- * This file contains platform-specific implementations for several
- * methods in rtc::Thread.
- */
-
-namespace {
-void InitCocoaMultiThreading() {
-  if ([NSThread isMultiThreaded] == NO) {
-    // The sole purpose of this autorelease pool is to avoid a console
-    // message on Leopard that tells us we're autoreleasing the thread
-    // with no autorelease pool in place.
-    @autoreleasepool {
-      [NSThread detachNewThreadSelector:@selector(class)
-                               toTarget:[NSObject class]
-                             withObject:nil];
-    }
-  }
-
-  RTC_DCHECK([NSThread isMultiThreaded]);
-}
-}
-
-namespace rtc {
-
-ThreadManager::ThreadManager() {
-  main_thread_ref_ = CurrentThreadRef();
-  pthread_key_create(&key_, nullptr);
-  // This is necessary to alert the cocoa runtime of the fact that
-  // we are running in a multithreaded environment.
-  InitCocoaMultiThreading();
-}
-
-// static
-void* Thread::PreRun(void* pv) {
-  ThreadInit* init = static_cast<ThreadInit*>(pv);
-  ThreadManager::Instance()->SetCurrentThread(init->thread);
-  rtc::SetCurrentThreadName(init->thread->name_.c_str());
-  @autoreleasepool {
-    if (init->runnable) {
-      init->runnable->Run(init->thread);
-    } else {
-      init->thread->Run();
-    }
-  }
-  delete init;
-  return nullptr;
-}
-
-bool Thread::ProcessMessages(int cmsLoop) {
-  int64_t msEnd = (kForever == cmsLoop) ? 0 : TimeAfter(cmsLoop);
-  int cmsNext = cmsLoop;
-
-  while (true) {
-    @autoreleasepool {
-      Message msg;
-      if (!Get(&msg, cmsNext))
-        return !IsQuitting();
-      Dispatch(&msg);
-
-      if (cmsLoop != kForever) {
-        cmsNext = static_cast<int>(TimeUntil(msEnd));
-        if (cmsNext < 0)
-          return true;
-      }
-    }
-  }
-}
-}  // namespace rtc
diff --git a/rtc_base/thread_unittest.cc b/rtc_base/thread_unittest.cc
deleted file mode 100644
index 7631f5e..0000000
--- a/rtc_base/thread_unittest.cc
+++ /dev/null
@@ -1,645 +0,0 @@
-/*
- *  Copyright 2004 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 <memory>
-
-#include "webrtc/rtc_base/asyncinvoker.h"
-#include "webrtc/rtc_base/asyncudpsocket.h"
-#include "webrtc/rtc_base/event.h"
-#include "webrtc/rtc_base/gunit.h"
-#include "webrtc/rtc_base/nullsocketserver.h"
-#include "webrtc/rtc_base/physicalsocketserver.h"
-#include "webrtc/rtc_base/sigslot.h"
-#include "webrtc/rtc_base/socketaddress.h"
-#include "webrtc/rtc_base/thread.h"
-
-#if defined(WEBRTC_WIN)
-#include <comdef.h>  // NOLINT
-#endif
-
-using namespace rtc;
-
-// Generates a sequence of numbers (collaboratively).
-class TestGenerator {
- public:
-  TestGenerator() : last(0), count(0) {}
-
-  int Next(int prev) {
-    int result = prev + last;
-    last = result;
-    count += 1;
-    return result;
-  }
-
-  int last;
-  int count;
-};
-
-struct TestMessage : public MessageData {
-  explicit TestMessage(int v) : value(v) {}
-  virtual ~TestMessage() {}
-
-  int value;
-};
-
-// Receives on a socket and sends by posting messages.
-class SocketClient : public TestGenerator, public sigslot::has_slots<> {
- public:
-  SocketClient(AsyncSocket* socket, const SocketAddress& addr,
-               Thread* post_thread, MessageHandler* phandler)
-      : socket_(AsyncUDPSocket::Create(socket, addr)),
-        post_thread_(post_thread),
-        post_handler_(phandler) {
-    socket_->SignalReadPacket.connect(this, &SocketClient::OnPacket);
-  }
-
-  ~SocketClient() {
-    delete socket_;
-  }
-
-  SocketAddress address() const { return socket_->GetLocalAddress(); }
-
-  void OnPacket(AsyncPacketSocket* socket, const char* buf, size_t size,
-                const SocketAddress& remote_addr,
-                const PacketTime& packet_time) {
-    EXPECT_EQ(size, sizeof(uint32_t));
-    uint32_t prev = reinterpret_cast<const uint32_t*>(buf)[0];
-    uint32_t result = Next(prev);
-
-    post_thread_->PostDelayed(RTC_FROM_HERE, 200, post_handler_, 0,
-                              new TestMessage(result));
-  }
-
- private:
-  AsyncUDPSocket* socket_;
-  Thread* post_thread_;
-  MessageHandler* post_handler_;
-};
-
-// Receives messages and sends on a socket.
-class MessageClient : public MessageHandler, public TestGenerator {
- public:
-  MessageClient(Thread* pth, Socket* socket)
-      : socket_(socket) {
-  }
-
-  virtual ~MessageClient() {
-    delete socket_;
-  }
-
-  virtual void OnMessage(Message *pmsg) {
-    TestMessage* msg = static_cast<TestMessage*>(pmsg->pdata);
-    int result = Next(msg->value);
-    EXPECT_GE(socket_->Send(&result, sizeof(result)), 0);
-    delete msg;
-  }
-
- private:
-  Socket* socket_;
-};
-
-class CustomThread : public rtc::Thread {
- public:
-  CustomThread()
-      : Thread(std::unique_ptr<SocketServer>(new rtc::NullSocketServer())) {}
-  virtual ~CustomThread() { Stop(); }
-  bool Start() { return false; }
-
-  bool WrapCurrent() {
-    return Thread::WrapCurrent();
-  }
-  void UnwrapCurrent() {
-    Thread::UnwrapCurrent();
-  }
-};
-
-
-// A thread that does nothing when it runs and signals an event
-// when it is destroyed.
-class SignalWhenDestroyedThread : public Thread {
- public:
-  SignalWhenDestroyedThread(Event* event)
-      : Thread(std::unique_ptr<SocketServer>(new NullSocketServer())),
-        event_(event) {}
-
-  virtual ~SignalWhenDestroyedThread() {
-    Stop();
-    event_->Set();
-  }
-
-  virtual void Run() {
-    // Do nothing.
-  }
-
- private:
-  Event* event_;
-};
-
-// A bool wrapped in a mutex, to avoid data races. Using a volatile
-// bool should be sufficient for correct code ("eventual consistency"
-// between caches is sufficient), but we can't tell the compiler about
-// that, and then tsan complains about a data race.
-
-// See also discussion at
-// http://stackoverflow.com/questions/7223164/is-mutex-needed-to-synchronize-a-simple-flag-between-pthreads
-
-// Using std::atomic<bool> or std::atomic_flag in C++11 is probably
-// the right thing to do, but those features are not yet allowed. Or
-// rtc::AtomicInt, if/when that is added. Since the use isn't
-// performance critical, use a plain critical section for the time
-// being.
-
-class AtomicBool {
- public:
-  explicit AtomicBool(bool value = false) : flag_(value) {}
-  AtomicBool& operator=(bool value) {
-    CritScope scoped_lock(&cs_);
-    flag_ = value;
-    return *this;
-  }
-  bool get() const {
-    CritScope scoped_lock(&cs_);
-    return flag_;
-  }
-
- private:
-  CriticalSection cs_;
-  bool flag_;
-};
-
-// Function objects to test Thread::Invoke.
-struct FunctorA {
-  int operator()() { return 42; }
-};
-class FunctorB {
- public:
-  explicit FunctorB(AtomicBool* flag) : flag_(flag) {}
-  void operator()() { if (flag_) *flag_ = true; }
- private:
-  AtomicBool* flag_;
-};
-struct FunctorC {
-  int operator()() {
-    Thread::Current()->ProcessMessages(50);
-    return 24;
-  }
-};
-
-// See: https://code.google.com/p/webrtc/issues/detail?id=2409
-TEST(ThreadTest, DISABLED_Main) {
-  const SocketAddress addr("127.0.0.1", 0);
-
-  // Create the messaging client on its own thread.
-  auto th1 = Thread::CreateWithSocketServer();
-  Socket* socket =
-      th1->socketserver()->CreateAsyncSocket(addr.family(), SOCK_DGRAM);
-  MessageClient msg_client(th1.get(), socket);
-
-  // Create the socket client on its own thread.
-  auto th2 = Thread::CreateWithSocketServer();
-  AsyncSocket* asocket =
-      th2->socketserver()->CreateAsyncSocket(addr.family(), SOCK_DGRAM);
-  SocketClient sock_client(asocket, addr, th1.get(), &msg_client);
-
-  socket->Connect(sock_client.address());
-
-  th1->Start();
-  th2->Start();
-
-  // Get the messages started.
-  th1->PostDelayed(RTC_FROM_HERE, 100, &msg_client, 0, new TestMessage(1));
-
-  // Give the clients a little while to run.
-  // Messages will be processed at 100, 300, 500, 700, 900.
-  Thread* th_main = Thread::Current();
-  th_main->ProcessMessages(1000);
-
-  // Stop the sending client. Give the receiver a bit longer to run, in case
-  // it is running on a machine that is under load (e.g. the build machine).
-  th1->Stop();
-  th_main->ProcessMessages(200);
-  th2->Stop();
-
-  // Make sure the results were correct
-  EXPECT_EQ(5, msg_client.count);
-  EXPECT_EQ(34, msg_client.last);
-  EXPECT_EQ(5, sock_client.count);
-  EXPECT_EQ(55, sock_client.last);
-}
-
-// Test that setting thread names doesn't cause a malfunction.
-// There's no easy way to verify the name was set properly at this time.
-TEST(ThreadTest, Names) {
-  // Default name
-  auto thread = Thread::CreateWithSocketServer();
-  EXPECT_TRUE(thread->Start());
-  thread->Stop();
-  // Name with no object parameter
-  thread = Thread::CreateWithSocketServer();
-  EXPECT_TRUE(thread->SetName("No object", nullptr));
-  EXPECT_TRUE(thread->Start());
-  thread->Stop();
-  // Really long name
-  thread = Thread::CreateWithSocketServer();
-  EXPECT_TRUE(thread->SetName("Abcdefghijklmnopqrstuvwxyz1234567890", this));
-  EXPECT_TRUE(thread->Start());
-  thread->Stop();
-}
-
-TEST(ThreadTest, Wrap) {
-  Thread* current_thread = Thread::Current();
-  current_thread->UnwrapCurrent();
-  CustomThread* cthread = new CustomThread();
-  EXPECT_TRUE(cthread->WrapCurrent());
-  EXPECT_TRUE(cthread->RunningForTest());
-  EXPECT_FALSE(cthread->IsOwned());
-  cthread->UnwrapCurrent();
-  EXPECT_FALSE(cthread->RunningForTest());
-  delete cthread;
-  current_thread->WrapCurrent();
-}
-
-TEST(ThreadTest, Invoke) {
-  // Create and start the thread.
-  auto thread = Thread::CreateWithSocketServer();
-  thread->Start();
-  // Try calling functors.
-  EXPECT_EQ(42, thread->Invoke<int>(RTC_FROM_HERE, FunctorA()));
-  AtomicBool called;
-  FunctorB f2(&called);
-  thread->Invoke<void>(RTC_FROM_HERE, f2);
-  EXPECT_TRUE(called.get());
-  // Try calling bare functions.
-  struct LocalFuncs {
-    static int Func1() { return 999; }
-    static void Func2() {}
-  };
-  EXPECT_EQ(999, thread->Invoke<int>(RTC_FROM_HERE, &LocalFuncs::Func1));
-  thread->Invoke<void>(RTC_FROM_HERE, &LocalFuncs::Func2);
-}
-
-// Verifies that two threads calling Invoke on each other at the same time does
-// not deadlock.
-TEST(ThreadTest, TwoThreadsInvokeNoDeadlock) {
-  AutoThread thread;
-  Thread* current_thread = Thread::Current();
-  ASSERT_TRUE(current_thread != nullptr);
-
-  auto other_thread = Thread::CreateWithSocketServer();
-  other_thread->Start();
-
-  struct LocalFuncs {
-    static void Set(bool* out) { *out = true; }
-    static void InvokeSet(Thread* thread, bool* out) {
-      thread->Invoke<void>(RTC_FROM_HERE, Bind(&Set, out));
-    }
-  };
-
-  bool called = false;
-  other_thread->Invoke<void>(
-      RTC_FROM_HERE, Bind(&LocalFuncs::InvokeSet, current_thread, &called));
-
-  EXPECT_TRUE(called);
-}
-
-// Verifies that if thread A invokes a call on thread B and thread C is trying
-// to invoke A at the same time, thread A does not handle C's invoke while
-// invoking B.
-TEST(ThreadTest, ThreeThreadsInvoke) {
-  AutoThread thread;
-  Thread* thread_a = Thread::Current();
-  auto thread_b = Thread::CreateWithSocketServer();
-  auto thread_c = Thread::CreateWithSocketServer();
-  thread_b->Start();
-  thread_c->Start();
-
-  class LockedBool {
-   public:
-    explicit LockedBool(bool value) : value_(value) {}
-
-    void Set(bool value) {
-      CritScope lock(&crit_);
-      value_ = value;
-    }
-
-    bool Get() {
-      CritScope lock(&crit_);
-      return value_;
-    }
-
-   private:
-    CriticalSection crit_;
-    bool value_ RTC_GUARDED_BY(crit_);
-  };
-
-  struct LocalFuncs {
-    static void Set(LockedBool* out) { out->Set(true); }
-    static void InvokeSet(Thread* thread, LockedBool* out) {
-      thread->Invoke<void>(RTC_FROM_HERE, Bind(&Set, out));
-    }
-
-    // Set |out| true and call InvokeSet on |thread|.
-    static void SetAndInvokeSet(LockedBool* out,
-                                Thread* thread,
-                                LockedBool* out_inner) {
-      out->Set(true);
-      InvokeSet(thread, out_inner);
-    }
-
-    // Asynchronously invoke SetAndInvokeSet on |thread1| and wait until
-    // |thread1| starts the call.
-    static void AsyncInvokeSetAndWait(AsyncInvoker* invoker,
-                                      Thread* thread1,
-                                      Thread* thread2,
-                                      LockedBool* out) {
-      CriticalSection crit;
-      LockedBool async_invoked(false);
-
-      invoker->AsyncInvoke<void>(
-          RTC_FROM_HERE, thread1,
-          Bind(&SetAndInvokeSet, &async_invoked, thread2, out));
-
-      EXPECT_TRUE_WAIT(async_invoked.Get(), 2000);
-    }
-  };
-
-  AsyncInvoker invoker;
-  LockedBool thread_a_called(false);
-
-  // Start the sequence A --(invoke)--> B --(async invoke)--> C --(invoke)--> A.
-  // Thread B returns when C receives the call and C should be blocked until A
-  // starts to process messages.
-  thread_b->Invoke<void>(RTC_FROM_HERE,
-                         Bind(&LocalFuncs::AsyncInvokeSetAndWait, &invoker,
-                              thread_c.get(), thread_a, &thread_a_called));
-  EXPECT_FALSE(thread_a_called.Get());
-
-  EXPECT_TRUE_WAIT(thread_a_called.Get(), 2000);
-}
-
-// Set the name on a thread when the underlying QueueDestroyed signal is
-// triggered. This causes an error if the object is already partially
-// destroyed.
-class SetNameOnSignalQueueDestroyedTester : public sigslot::has_slots<> {
- public:
-  SetNameOnSignalQueueDestroyedTester(Thread* thread) : thread_(thread) {
-    thread->SignalQueueDestroyed.connect(
-        this, &SetNameOnSignalQueueDestroyedTester::OnQueueDestroyed);
-  }
-
-  void OnQueueDestroyed() {
-    // Makes sure that if we access the Thread while it's being destroyed, that
-    // it doesn't cause a problem because the vtable has been modified.
-    thread_->SetName("foo", nullptr);
-  }
-
- private:
-  Thread* thread_;
-};
-
-TEST(ThreadTest, SetNameOnSignalQueueDestroyed) {
-  auto thread1 = Thread::CreateWithSocketServer();
-  SetNameOnSignalQueueDestroyedTester tester1(thread1.get());
-  thread1.reset();
-
-  Thread* thread2 = new AutoThread();
-  SetNameOnSignalQueueDestroyedTester tester2(thread2);
-  delete thread2;
-}
-
-class AsyncInvokeTest : public testing::Test {
- public:
-  void IntCallback(int value) {
-    EXPECT_EQ(expected_thread_, Thread::Current());
-    int_value_ = value;
-  }
-  void SetExpectedThreadForIntCallback(Thread* thread) {
-    expected_thread_ = thread;
-  }
-
- protected:
-  enum { kWaitTimeout = 1000 };
-  AsyncInvokeTest()
-      : int_value_(0),
-        expected_thread_(nullptr) {}
-
-  int int_value_;
-  Thread* expected_thread_;
-};
-
-TEST_F(AsyncInvokeTest, FireAndForget) {
-  AsyncInvoker invoker;
-  // Create and start the thread.
-  auto thread = Thread::CreateWithSocketServer();
-  thread->Start();
-  // Try calling functor.
-  AtomicBool called;
-  invoker.AsyncInvoke<void>(RTC_FROM_HERE, thread.get(), FunctorB(&called));
-  EXPECT_TRUE_WAIT(called.get(), kWaitTimeout);
-  thread->Stop();
-}
-
-TEST_F(AsyncInvokeTest, KillInvokerDuringExecute) {
-  // Use these events to get in a state where the functor is in the middle of
-  // executing, and then to wait for it to finish, ensuring the "EXPECT_FALSE"
-  // is run.
-  Event functor_started(false, false);
-  Event functor_continue(false, false);
-  Event functor_finished(false, false);
-
-  auto thread = Thread::CreateWithSocketServer();
-  thread->Start();
-  volatile bool invoker_destroyed = false;
-  {
-    auto functor = [&functor_started, &functor_continue, &functor_finished,
-                    &invoker_destroyed] {
-      functor_started.Set();
-      functor_continue.Wait(Event::kForever);
-      rtc::Thread::Current()->SleepMs(kWaitTimeout);
-      EXPECT_FALSE(invoker_destroyed);
-      functor_finished.Set();
-    };
-    AsyncInvoker invoker;
-    invoker.AsyncInvoke<void>(RTC_FROM_HERE, thread.get(), functor);
-    functor_started.Wait(Event::kForever);
-
-    // Destroy the invoker while the functor is still executing (doing
-    // SleepMs).
-    functor_continue.Set();
-  }
-
-  // If the destructor DIDN'T wait for the functor to finish executing, it will
-  // hit the EXPECT_FALSE(invoker_destroyed) after it finishes sleeping for a
-  // second.
-  invoker_destroyed = true;
-  functor_finished.Wait(Event::kForever);
-}
-
-// Variant of the above test where the async-invoked task calls AsyncInvoke
-// *again*, for the thread on which the AsyncInvoker is currently being
-// destroyed. This shouldn't deadlock or crash; this second invocation should
-// just be ignored.
-TEST_F(AsyncInvokeTest, KillInvokerDuringExecuteWithReentrantInvoke) {
-  Event functor_started(false, false);
-  // Flag used to verify that the recursively invoked task never actually runs.
-  bool reentrant_functor_run = false;
-
-  Thread* main = Thread::Current();
-  Thread thread;
-  thread.Start();
-  {
-    AsyncInvoker invoker;
-    auto reentrant_functor = [&reentrant_functor_run] {
-      reentrant_functor_run = true;
-    };
-    auto functor = [&functor_started, &invoker, main, reentrant_functor] {
-      functor_started.Set();
-      Thread::Current()->SleepMs(kWaitTimeout);
-      invoker.AsyncInvoke<void>(RTC_FROM_HERE, main, reentrant_functor);
-    };
-    // This queues a task on |thread| to sleep for |kWaitTimeout| then queue a
-    // task on |main|. But this second queued task should never run, since the
-    // destructor will be entered before it's even invoked.
-    invoker.AsyncInvoke<void>(RTC_FROM_HERE, &thread, functor);
-    functor_started.Wait(Event::kForever);
-  }
-  EXPECT_FALSE(reentrant_functor_run);
-}
-
-TEST_F(AsyncInvokeTest, Flush) {
-  AsyncInvoker invoker;
-  AtomicBool flag1;
-  AtomicBool flag2;
-  // Queue two async calls to the current thread.
-  invoker.AsyncInvoke<void>(RTC_FROM_HERE, Thread::Current(), FunctorB(&flag1));
-  invoker.AsyncInvoke<void>(RTC_FROM_HERE, Thread::Current(), FunctorB(&flag2));
-  // Because we haven't pumped messages, these should not have run yet.
-  EXPECT_FALSE(flag1.get());
-  EXPECT_FALSE(flag2.get());
-  // Force them to run now.
-  invoker.Flush(Thread::Current());
-  EXPECT_TRUE(flag1.get());
-  EXPECT_TRUE(flag2.get());
-}
-
-TEST_F(AsyncInvokeTest, FlushWithIds) {
-  AsyncInvoker invoker;
-  AtomicBool flag1;
-  AtomicBool flag2;
-  // Queue two async calls to the current thread, one with a message id.
-  invoker.AsyncInvoke<void>(RTC_FROM_HERE, Thread::Current(), FunctorB(&flag1),
-                            5);
-  invoker.AsyncInvoke<void>(RTC_FROM_HERE, Thread::Current(), FunctorB(&flag2));
-  // Because we haven't pumped messages, these should not have run yet.
-  EXPECT_FALSE(flag1.get());
-  EXPECT_FALSE(flag2.get());
-  // Execute pending calls with id == 5.
-  invoker.Flush(Thread::Current(), 5);
-  EXPECT_TRUE(flag1.get());
-  EXPECT_FALSE(flag2.get());
-  flag1 = false;
-  // Execute all pending calls. The id == 5 call should not execute again.
-  invoker.Flush(Thread::Current());
-  EXPECT_FALSE(flag1.get());
-  EXPECT_TRUE(flag2.get());
-}
-
-class GuardedAsyncInvokeTest : public testing::Test {
- public:
-  void IntCallback(int value) {
-    EXPECT_EQ(expected_thread_, Thread::Current());
-    int_value_ = value;
-  }
-  void SetExpectedThreadForIntCallback(Thread* thread) {
-    expected_thread_ = thread;
-  }
-
- protected:
-  const static int kWaitTimeout = 1000;
-  GuardedAsyncInvokeTest()
-      : int_value_(0),
-        expected_thread_(nullptr) {}
-
-  int int_value_;
-  Thread* expected_thread_;
-};
-
-// Functor for creating an invoker.
-struct CreateInvoker {
-  CreateInvoker(std::unique_ptr<GuardedAsyncInvoker>* invoker)
-      : invoker_(invoker) {}
-  void operator()() { invoker_->reset(new GuardedAsyncInvoker()); }
-  std::unique_ptr<GuardedAsyncInvoker>* invoker_;
-};
-
-// Test that we can call AsyncInvoke<void>() after the thread died.
-TEST_F(GuardedAsyncInvokeTest, KillThreadFireAndForget) {
-  // Create and start the thread.
-  std::unique_ptr<Thread> thread(Thread::Create());
-  thread->Start();
-  std::unique_ptr<GuardedAsyncInvoker> invoker;
-  // Create the invoker on |thread|.
-  thread->Invoke<void>(RTC_FROM_HERE, CreateInvoker(&invoker));
-  // Kill |thread|.
-  thread = nullptr;
-  // Try calling functor.
-  AtomicBool called;
-  EXPECT_FALSE(invoker->AsyncInvoke<void>(RTC_FROM_HERE, FunctorB(&called)));
-  // With thread gone, nothing should happen.
-  WAIT(called.get(), kWaitTimeout);
-  EXPECT_FALSE(called.get());
-}
-
-// The remaining tests check that GuardedAsyncInvoker behaves as AsyncInvoker
-// when Thread is still alive.
-TEST_F(GuardedAsyncInvokeTest, FireAndForget) {
-  GuardedAsyncInvoker invoker;
-  // Try calling functor.
-  AtomicBool called;
-  EXPECT_TRUE(invoker.AsyncInvoke<void>(RTC_FROM_HERE, FunctorB(&called)));
-  EXPECT_TRUE_WAIT(called.get(), kWaitTimeout);
-}
-
-TEST_F(GuardedAsyncInvokeTest, Flush) {
-  GuardedAsyncInvoker invoker;
-  AtomicBool flag1;
-  AtomicBool flag2;
-  // Queue two async calls to the current thread.
-  EXPECT_TRUE(invoker.AsyncInvoke<void>(RTC_FROM_HERE, FunctorB(&flag1)));
-  EXPECT_TRUE(invoker.AsyncInvoke<void>(RTC_FROM_HERE, FunctorB(&flag2)));
-  // Because we haven't pumped messages, these should not have run yet.
-  EXPECT_FALSE(flag1.get());
-  EXPECT_FALSE(flag2.get());
-  // Force them to run now.
-  EXPECT_TRUE(invoker.Flush());
-  EXPECT_TRUE(flag1.get());
-  EXPECT_TRUE(flag2.get());
-}
-
-TEST_F(GuardedAsyncInvokeTest, FlushWithIds) {
-  GuardedAsyncInvoker invoker;
-  AtomicBool flag1;
-  AtomicBool flag2;
-  // Queue two async calls to the current thread, one with a message id.
-  EXPECT_TRUE(invoker.AsyncInvoke<void>(RTC_FROM_HERE, FunctorB(&flag1), 5));
-  EXPECT_TRUE(invoker.AsyncInvoke<void>(RTC_FROM_HERE, FunctorB(&flag2)));
-  // Because we haven't pumped messages, these should not have run yet.
-  EXPECT_FALSE(flag1.get());
-  EXPECT_FALSE(flag2.get());
-  // Execute pending calls with id == 5.
-  EXPECT_TRUE(invoker.Flush(5));
-  EXPECT_TRUE(flag1.get());
-  EXPECT_FALSE(flag2.get());
-  flag1 = false;
-  // Execute all pending calls. The id == 5 call should not execute again.
-  EXPECT_TRUE(invoker.Flush());
-  EXPECT_FALSE(flag1.get());
-  EXPECT_TRUE(flag2.get());
-}
diff --git a/rtc_base/timedelta.h b/rtc_base/timedelta.h
deleted file mode 100644
index ae4bda4..0000000
--- a/rtc_base/timedelta.h
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- *  Copyright 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_RTC_BASE_TIMEDELTA_H_
-#define WEBRTC_RTC_BASE_TIMEDELTA_H_
-
-#include <stdint.h>
-
-#include "webrtc/rtc_base/timeutils.h"
-
-// Convenience class to convert between different units of relative time.
-// Stores time to precision of nanoseconds, as int64_t internally.
-// Doesn't check for overflow/underflow.
-//
-// Based on TimeDelta in:
-// https://code.google.com/p/chromium/codesearch#chromium/src/base/time/time.h
-namespace rtc {
-
-class TimeDelta {
- public:
-  TimeDelta() : delta_(0) {}
-
-  // Converts units of time to TimeDeltas.
-  static constexpr TimeDelta FromSeconds(int64_t secs) {
-    return TimeDelta(secs * kNumNanosecsPerSec);
-  }
-  static constexpr TimeDelta FromMilliseconds(int64_t ms) {
-    return TimeDelta(ms * kNumNanosecsPerMillisec);
-  }
-  static constexpr TimeDelta FromMicroseconds(int64_t us) {
-    return TimeDelta(us * kNumNanosecsPerMicrosec);
-  }
-  static constexpr TimeDelta FromNanoseconds(int64_t ns) {
-    return TimeDelta(ns);
-  }
-
-  // Returns true if the time delta is zero.
-  bool is_zero() const { return delta_ == 0; }
-
-  // Converts TimeDelta to units of time.
-  int64_t ToSeconds() const { return delta_ / kNumNanosecsPerSec; }
-  int64_t ToMilliseconds() const { return delta_ / kNumNanosecsPerMillisec; }
-  int64_t ToMicroseconds() const { return delta_ / kNumNanosecsPerMicrosec; }
-  int64_t ToNanoseconds() const { return delta_; }
-
-  TimeDelta& operator=(TimeDelta other) {
-    delta_ = other.delta_;
-    return *this;
-  }
-
-  // Computations with other deltas.
-  TimeDelta operator+(TimeDelta other) const {
-    return TimeDelta(delta_ + other.delta_);
-  }
-  TimeDelta operator-(TimeDelta other) const {
-    return TimeDelta(delta_ + other.delta_);
-  }
-
-  TimeDelta& operator+=(TimeDelta other) { return *this = (*this + other); }
-  TimeDelta& operator-=(TimeDelta other) { return *this = (*this - other); }
-  TimeDelta operator-() const { return TimeDelta(-delta_); }
-
-  // Computations with numeric types.
-  template <typename T>
-  TimeDelta operator*(T a) const {
-    return TimeDelta(delta_ * a);
-  }
-  template <typename T>
-  TimeDelta operator/(T a) const {
-    return TimeDelta(delta_ / a);
-  }
-  template <typename T>
-  TimeDelta& operator*=(T a) {
-    return *this = (*this * a);
-  }
-  template <typename T>
-  TimeDelta& operator/=(T a) {
-    return *this = (*this / a);
-  }
-
-  TimeDelta operator%(TimeDelta a) const {
-    return TimeDelta(delta_ % a.delta_);
-  }
-
-  // Comparison operators.
-  constexpr bool operator==(TimeDelta other) const {
-    return delta_ == other.delta_;
-  }
-  constexpr bool operator!=(TimeDelta other) const {
-    return delta_ != other.delta_;
-  }
-  constexpr bool operator<(TimeDelta other) const {
-    return delta_ < other.delta_;
-  }
-  constexpr bool operator<=(TimeDelta other) const {
-    return delta_ <= other.delta_;
-  }
-  constexpr bool operator>(TimeDelta other) const {
-    return delta_ > other.delta_;
-  }
-  constexpr bool operator>=(TimeDelta other) const {
-    return delta_ >= other.delta_;
-  }
-
- private:
-  // Constructs a delta given the duration in nanoseconds. This is private
-  // to avoid confusion by callers with an integer constructor. Use
-  // FromSeconds, FromMilliseconds, etc. instead.
-  constexpr explicit TimeDelta(int64_t delta_ns) : delta_(delta_ns) {}
-
-  // Delta in nanoseconds.
-  int64_t delta_;
-};
-
-template <typename T>
-inline TimeDelta operator*(T a, TimeDelta td) {
-  return td * a;
-}
-
-}  // namespace rtc
-
-#endif  // WEBRTC_RTC_BASE_TIMEDELTA_H_
diff --git a/rtc_base/timestampaligner.cc b/rtc_base/timestampaligner.cc
deleted file mode 100644
index fdce141..0000000
--- a/rtc_base/timestampaligner.cc
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
- *  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 <limits>
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/timestampaligner.h"
-#include "webrtc/rtc_base/timeutils.h"
-
-namespace rtc {
-
-TimestampAligner::TimestampAligner()
-    : frames_seen_(0),
-      offset_us_(0),
-      clip_bias_us_(0),
-      prev_translated_time_us_(std::numeric_limits<int64_t>::min()) {}
-
-TimestampAligner::~TimestampAligner() {}
-
-int64_t TimestampAligner::TranslateTimestamp(int64_t camera_time_us,
-                                             int64_t system_time_us) {
-  return ClipTimestamp(
-      camera_time_us + UpdateOffset(camera_time_us, system_time_us),
-      system_time_us);
-}
-
-int64_t TimestampAligner::UpdateOffset(int64_t camera_time_us,
-                                       int64_t system_time_us) {
-  // Estimate the offset between system monotonic time and the capture
-  // time from the camera. The camera is assumed to provide more
-  // accurate timestamps than we get from the system time. But the
-  // camera may use its own free-running clock with a large offset and
-  // a small drift compared to the system clock. So the model is
-  // basically
-  //
-  //   y_k = c_0 + c_1 * x_k + v_k
-  //
-  // where x_k is the camera timestamp, believed to be accurate in its
-  // own scale. y_k is our reading of the system clock. v_k is the
-  // measurement noise, i.e., the delay from frame capture until the
-  // system clock was read.
-  //
-  // It's possible to do (weighted) least-squares estimation of both
-  // c_0 and c_1. Then we get the constants as c_1 = Cov(x,y) /
-  // Var(x), and c_0 = mean(y) - c_1 * mean(x). Substituting this c_0,
-  // we can rearrange the model as
-  //
-  //   y_k = mean(y) + (x_k - mean(x)) + (c_1 - 1) * (x_k - mean(x)) + v_k
-  //
-  // Now if we use a weighted average which gradually forgets old
-  // values, x_k - mean(x) is bounded, of the same order as the time
-  // constant (and close to constant for a steady frame rate). In
-  // addition, the frequency error |c_1 - 1| should be small. Cameras
-  // with a frequency error up to 3000 ppm (3 ms drift per second)
-  // have been observed, but frequency errors below 100 ppm could be
-  // expected of any cheap crystal.
-  //
-  // Bottom line is that we ignore the c_1 term, and use only the estimator
-  //
-  //    x_k + mean(y-x)
-  //
-  // where mean is plain averaging for initial samples, followed by
-  // exponential averaging.
-
-  // The input for averaging, y_k - x_k in the above notation.
-  int64_t diff_us = system_time_us - camera_time_us;
-  // The deviation from the current average.
-  int64_t error_us = diff_us - offset_us_;
-
-  // If the current difference is far from the currently estimated
-  // offset, the filter is reset. This could happen, e.g., if the
-  // camera clock is reset, or cameras are plugged in and out, or if
-  // the application process is temporarily suspended. Expected to
-  // happen for the very first timestamp (|frames_seen_| = 0). The
-  // threshold of 300 ms should make this unlikely in normal
-  // operation, and at the same time, converging gradually rather than
-  // resetting the filter should be tolerable for jumps in camera time
-  // below this threshold.
-  static const int64_t kResetThresholdUs = 300000;
-  if (std::abs(error_us) > kResetThresholdUs) {
-    LOG(LS_INFO) << "Resetting timestamp translation after averaging "
-                 << frames_seen_ << " frames. Old offset: " << offset_us_
-                 << ", new offset: " << diff_us;
-    frames_seen_ = 0;
-    clip_bias_us_ = 0;
-  }
-
-  static const int kWindowSize = 100;
-  if (frames_seen_ < kWindowSize) {
-    ++frames_seen_;
-  }
-  offset_us_ += error_us / frames_seen_;
-  return offset_us_;
-}
-
-int64_t TimestampAligner::ClipTimestamp(int64_t filtered_time_us,
-                                        int64_t system_time_us) {
-  const int64_t kMinFrameIntervalUs = rtc::kNumMicrosecsPerMillisec;
-  // Clip to make sure we don't produce timestamps in the future.
-  int64_t time_us = filtered_time_us - clip_bias_us_;
-  if (time_us > system_time_us) {
-    clip_bias_us_ += time_us - system_time_us;
-    time_us = system_time_us;
-  }
-  // Make timestamps monotonic, with a minimum inter-frame interval of 1 ms.
-  else if (time_us < prev_translated_time_us_ + kMinFrameIntervalUs) {
-    time_us = prev_translated_time_us_ + kMinFrameIntervalUs;
-    if (time_us > system_time_us) {
-      // In the anomalous case that this function is called with values of
-      // |system_time_us| less than |kMinFrameIntervalUs| apart, we may output
-      // timestamps with with too short inter-frame interval. We may even return
-      // duplicate timestamps in case this function is called several times with
-      // exactly the same |system_time_us|.
-      LOG(LS_WARNING) << "too short translated timestamp interval: "
-                      << "system time (us) = " << system_time_us
-                      << ", interval (us) = "
-                      << system_time_us - prev_translated_time_us_;
-      time_us = system_time_us;
-    }
-  }
-  RTC_DCHECK_GE(time_us, prev_translated_time_us_);
-  RTC_DCHECK_LE(time_us, system_time_us);
-  prev_translated_time_us_ = time_us;
-  return time_us;
-}
-
-}  // namespace rtc
diff --git a/rtc_base/timestampaligner.h b/rtc_base/timestampaligner.h
deleted file mode 100644
index dde877c..0000000
--- a/rtc_base/timestampaligner.h
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- *  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_RTC_BASE_TIMESTAMPALIGNER_H_
-#define WEBRTC_RTC_BASE_TIMESTAMPALIGNER_H_
-
-#include <stdint.h>
-
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace rtc {
-
-// The TimestampAligner class helps translating camera timestamps into
-// the same timescale as is used by rtc::TimeMicros(). Some cameras
-// have built in timestamping which is more accurate than reading the
-// system clock, but using a different epoch and unknown clock drift.
-// Frame timestamps in webrtc should use rtc::TimeMicros (system monotonic
-// time), and this class provides a filter which lets us use the
-// rtc::TimeMicros timescale, and at the same time take advantage of
-// higher accuracy of the camera clock.
-
-// This class is not thread safe, so all calls to it must be synchronized
-// externally.
-class TimestampAligner {
- public:
-  TimestampAligner();
-  ~TimestampAligner();
-
- public:
-  // Translates camera timestamps to the same timescale as is used by
-  // rtc::TimeMicros(). |camera_time_us| is assumed to be accurate, but
-  // with an unknown epoch and clock drift. |system_time_us| is
-  // time according to rtc::TimeMicros(), preferably read as soon as
-  // possible when the frame is captured. It may have poor accuracy
-  // due to poor resolution or scheduling delays. Returns the
-  // translated timestamp.
-  int64_t TranslateTimestamp(int64_t camera_time_us, int64_t system_time_us);
-
- protected:
-  // Update the estimated offset between camera time and system monotonic time.
-  int64_t UpdateOffset(int64_t camera_time_us, int64_t system_time_us);
-
-  // Clip timestamp, return value is always
-  //    <= |system_time_us|, and
-  //    >= min(|prev_translated_time_us_| + |kMinFrameIntervalUs|,
-  //           |system_time_us|).
-  int64_t ClipTimestamp(int64_t filtered_time_us, int64_t system_time_us);
-
- private:
-  // State for the timestamp translation.
-  int frames_seen_;
-  // Estimated offset between camera time and system monotonic time.
-  int64_t offset_us_;
-
-  // State for the ClipTimestamp method, applied after the filter.
-  // A large negative camera clock drift tends to push translated
-  // timestamps into the future. |clip_bias_us_| is subtracted from the
-  // translated timestamps, to get them back from the future.
-  int64_t clip_bias_us_;
-  // Used to ensure that translated timestamps are monotonous.
-  int64_t prev_translated_time_us_;
-  RTC_DISALLOW_COPY_AND_ASSIGN(TimestampAligner);
-};
-
-}  // namespace rtc
-
-#endif  // WEBRTC_RTC_BASE_TIMESTAMPALIGNER_H_
diff --git a/rtc_base/timestampaligner_unittest.cc b/rtc_base/timestampaligner_unittest.cc
deleted file mode 100644
index 0c838af..0000000
--- a/rtc_base/timestampaligner_unittest.cc
+++ /dev/null
@@ -1,187 +0,0 @@
-/*
- *  Copyright 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 <math.h>
-
-#include <algorithm>
-#include <limits>
-
-#include "webrtc/rtc_base/gunit.h"
-#include "webrtc/rtc_base/random.h"
-#include "webrtc/rtc_base/timestampaligner.h"
-
-namespace rtc {
-
-namespace {
-// Computes the difference x_k - mean(x), when x_k is the linear sequence x_k =
-// k, and the "mean" is plain mean for the first |window_size| samples, followed
-// by exponential averaging with weight 1 / |window_size| for each new sample.
-// This is needed to predict the effect of camera clock drift on the timestamp
-// translation. See the comment on TimestampAligner::UpdateOffset for more
-// context.
-double MeanTimeDifference(int nsamples, int window_size) {
-  if (nsamples <= window_size) {
-    // Plain averaging.
-    return nsamples / 2.0;
-  } else {
-    // Exponential convergence towards
-    // interval_error * (window_size - 1)
-    double alpha = 1.0 - 1.0 / window_size;
-
-    return ((window_size - 1) -
-            (window_size / 2.0 - 1) * pow(alpha, nsamples - window_size));
-  }
-}
-
-class TimestampAlignerForTest : public TimestampAligner {
-  // Make internal methods accessible to testing.
- public:
-  using TimestampAligner::UpdateOffset;
-  using TimestampAligner::ClipTimestamp;
-};
-
-void TestTimestampFilter(double rel_freq_error) {
-  TimestampAlignerForTest timestamp_aligner_for_test;
-  TimestampAligner timestamp_aligner;
-  const int64_t kEpoch = 10000;
-  const int64_t kJitterUs = 5000;
-  const int64_t kIntervalUs = 33333;  // 30 FPS
-  const int kWindowSize = 100;
-  const int kNumFrames = 3 * kWindowSize;
-
-  int64_t interval_error_us = kIntervalUs * rel_freq_error;
-  int64_t system_start_us = rtc::TimeMicros();
-  webrtc::Random random(17);
-
-  int64_t prev_translated_time_us = system_start_us;
-
-  for (int i = 0; i < kNumFrames; i++) {
-    // Camera time subject to drift.
-    int64_t camera_time_us = kEpoch + i * (kIntervalUs + interval_error_us);
-    int64_t system_time_us = system_start_us + i * kIntervalUs;
-    // And system time readings are subject to jitter.
-    int64_t system_measured_us = system_time_us + random.Rand(kJitterUs);
-
-    int64_t offset_us = timestamp_aligner_for_test.UpdateOffset(
-        camera_time_us, system_measured_us);
-
-    int64_t filtered_time_us = camera_time_us + offset_us;
-    int64_t translated_time_us = timestamp_aligner_for_test.ClipTimestamp(
-        filtered_time_us, system_measured_us);
-
-    // Check that we get identical result from the all-in-one helper method.
-    ASSERT_EQ(translated_time_us, timestamp_aligner.TranslateTimestamp(
-                                      camera_time_us, system_measured_us));
-
-    EXPECT_LE(translated_time_us, system_measured_us);
-    EXPECT_GE(translated_time_us,
-              prev_translated_time_us + rtc::kNumMicrosecsPerMillisec);
-
-    // The relative frequency error contributes to the expected error
-    // by a factor which is the difference between the current time
-    // and the average of earlier sample times.
-    int64_t expected_error_us =
-        kJitterUs / 2 +
-        rel_freq_error * kIntervalUs * MeanTimeDifference(i, kWindowSize);
-
-    int64_t bias_us = filtered_time_us - translated_time_us;
-    EXPECT_GE(bias_us, 0);
-
-    if (i == 0) {
-      EXPECT_EQ(translated_time_us, system_measured_us);
-    } else {
-      EXPECT_NEAR(filtered_time_us, system_time_us + expected_error_us,
-                  2.0 * kJitterUs / sqrt(std::max(i, kWindowSize)));
-    }
-    // If the camera clock runs too fast (rel_freq_error > 0.0), The
-    // bias is expected to roughly cancel the expected error from the
-    // clock drift, as this grows. Otherwise, it reflects the
-    // measurement noise. The tolerances here were selected after some
-    // trial and error.
-    if (i < 10 || rel_freq_error <= 0.0) {
-      EXPECT_LE(bias_us, 3000);
-    } else {
-      EXPECT_NEAR(bias_us, expected_error_us, 1500);
-    }
-    prev_translated_time_us = translated_time_us;
-  }
-}
-
-}  // Anonymous namespace
-
-TEST(TimestampAlignerTest, AttenuateTimestampJitterNoDrift) {
-  TestTimestampFilter(0.0);
-}
-
-// 100 ppm is a worst case for a reasonable crystal.
-TEST(TimestampAlignerTest, AttenuateTimestampJitterSmallPosDrift) {
-  TestTimestampFilter(0.0001);
-}
-
-TEST(TimestampAlignerTest, AttenuateTimestampJitterSmallNegDrift) {
-  TestTimestampFilter(-0.0001);
-}
-
-// 3000 ppm, 3 ms / s, is the worst observed drift, see
-// https://bugs.chromium.org/p/webrtc/issues/detail?id=5456
-TEST(TimestampAlignerTest, AttenuateTimestampJitterLargePosDrift) {
-  TestTimestampFilter(0.003);
-}
-
-TEST(TimestampAlignerTest, AttenuateTimestampJitterLargeNegDrift) {
-  TestTimestampFilter(-0.003);
-}
-
-// Exhibits a mostly hypothetical problem, where certain inputs to the
-// TimestampAligner.UpdateOffset filter result in non-monotonous
-// translated timestamps. This test verifies that the ClipTimestamp
-// logic handles this case correctly.
-TEST(TimestampAlignerTest, ClipToMonotonous) {
-  TimestampAlignerForTest timestamp_aligner;
-
-  // For system time stamps { 0, s1, s1 + s2 }, and camera timestamps
-  // {0, c1, c1 + c2}, we exhibit non-monotonous behaviour if and only
-  // if c1 > s1 + 2 s2 + 4 c2.
-  const int kNumSamples = 3;
-  const int64_t camera_time_us[kNumSamples] = {0, 80000, 90001};
-  const int64_t system_time_us[kNumSamples] = {0, 10000, 20000};
-  const int64_t expected_offset_us[kNumSamples] = {0, -35000, -46667};
-
-  // Non-monotonic translated timestamps can happen when only for
-  // translated timestamps in the future. Which is tolerated if
-  // |timestamp_aligner.clip_bias_us| is large enough. Instead of
-  // changing that private member for this test, just add the bias to
-  // |system_time_us| when calling ClipTimestamp.
-  const int64_t kClipBiasUs = 100000;
-
-  bool did_clip = false;
-  int64_t prev_timestamp_us = std::numeric_limits<int64_t>::min();
-  for (int i = 0; i < kNumSamples; i++) {
-    int64_t offset_us =
-        timestamp_aligner.UpdateOffset(camera_time_us[i], system_time_us[i]);
-    EXPECT_EQ(offset_us, expected_offset_us[i]);
-
-    int64_t translated_timestamp_us = camera_time_us[i] + offset_us;
-    int64_t clip_timestamp_us = timestamp_aligner.ClipTimestamp(
-        translated_timestamp_us, system_time_us[i] + kClipBiasUs);
-    if (translated_timestamp_us <= prev_timestamp_us) {
-      did_clip = true;
-      EXPECT_EQ(clip_timestamp_us,
-                prev_timestamp_us + rtc::kNumMicrosecsPerMillisec);
-    } else {
-      // No change from clipping.
-      EXPECT_EQ(clip_timestamp_us, translated_timestamp_us);
-    }
-    prev_timestamp_us = clip_timestamp_us;
-  }
-  EXPECT_TRUE(did_clip);
-}
-
-}  // namespace rtc
diff --git a/rtc_base/timeutils.cc b/rtc_base/timeutils.cc
deleted file mode 100644
index 36f9d3f..0000000
--- a/rtc_base/timeutils.cc
+++ /dev/null
@@ -1,210 +0,0 @@
-/*
- *  Copyright 2004 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 <stdint.h>
-
-#if defined(WEBRTC_POSIX)
-#include <sys/time.h>
-#if defined(WEBRTC_MAC)
-#include <mach/mach_time.h>
-#endif
-#endif
-
-#if defined(WEBRTC_WIN)
-#ifndef WIN32_LEAN_AND_MEAN
-#define WIN32_LEAN_AND_MEAN
-#endif
-#include <windows.h>
-#include <mmsystem.h>
-#include <sys/timeb.h>
-#endif
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/timeutils.h"
-
-namespace rtc {
-
-ClockInterface* g_clock = nullptr;
-
-ClockInterface* SetClockForTesting(ClockInterface* clock) {
-  ClockInterface* prev = g_clock;
-  g_clock = clock;
-  return prev;
-}
-
-ClockInterface* GetClockForTesting() {
-  return g_clock;
-}
-
-int64_t SystemTimeNanos() {
-  int64_t ticks;
-#if defined(WEBRTC_MAC)
-  static mach_timebase_info_data_t timebase;
-  if (timebase.denom == 0) {
-    // Get the timebase if this is the first time we run.
-    // Recommended by Apple's QA1398.
-    if (mach_timebase_info(&timebase) != KERN_SUCCESS) {
-      RTC_NOTREACHED();
-    }
-  }
-  // Use timebase to convert absolute time tick units into nanoseconds.
-  ticks = mach_absolute_time() * timebase.numer / timebase.denom;
-#elif defined(WEBRTC_POSIX)
-  struct timespec ts;
-  // TODO(deadbeef): Do we need to handle the case when CLOCK_MONOTONIC is not
-  // supported?
-  clock_gettime(CLOCK_MONOTONIC, &ts);
-  ticks = kNumNanosecsPerSec * static_cast<int64_t>(ts.tv_sec) +
-          static_cast<int64_t>(ts.tv_nsec);
-#elif defined(WEBRTC_WIN)
-  static volatile LONG last_timegettime = 0;
-  static volatile int64_t num_wrap_timegettime = 0;
-  volatile LONG* last_timegettime_ptr = &last_timegettime;
-  DWORD now = timeGetTime();
-  // Atomically update the last gotten time
-  DWORD old = InterlockedExchange(last_timegettime_ptr, now);
-  if (now < old) {
-    // If now is earlier than old, there may have been a race between threads.
-    // 0x0fffffff ~3.1 days, the code will not take that long to execute
-    // so it must have been a wrap around.
-    if (old > 0xf0000000 && now < 0x0fffffff) {
-      num_wrap_timegettime++;
-    }
-  }
-  ticks = now + (num_wrap_timegettime << 32);
-  // TODO(deadbeef): Calculate with nanosecond precision. Otherwise, we're
-  // just wasting a multiply and divide when doing Time() on Windows.
-  ticks = ticks * kNumNanosecsPerMillisec;
-#else
-#error Unsupported platform.
-#endif
-  return ticks;
-}
-
-int64_t SystemTimeMillis() {
-  return static_cast<int64_t>(SystemTimeNanos() / kNumNanosecsPerMillisec);
-}
-
-int64_t TimeNanos() {
-  if (g_clock) {
-    return g_clock->TimeNanos();
-  }
-  return SystemTimeNanos();
-}
-
-uint32_t Time32() {
-  return static_cast<uint32_t>(TimeNanos() / kNumNanosecsPerMillisec);
-}
-
-int64_t TimeMillis() {
-  return TimeNanos() / kNumNanosecsPerMillisec;
-}
-
-int64_t TimeMicros() {
-  return TimeNanos() / kNumNanosecsPerMicrosec;
-}
-
-int64_t TimeAfter(int64_t elapsed) {
-  RTC_DCHECK_GE(elapsed, 0);
-  return TimeMillis() + elapsed;
-}
-
-int32_t TimeDiff32(uint32_t later, uint32_t earlier) {
-  return later - earlier;
-}
-
-int64_t TimeDiff(int64_t later, int64_t earlier) {
-  return later - earlier;
-}
-
-TimestampWrapAroundHandler::TimestampWrapAroundHandler()
-    : last_ts_(0), num_wrap_(-1) {}
-
-int64_t TimestampWrapAroundHandler::Unwrap(uint32_t ts) {
-  if (num_wrap_ == -1) {
-    last_ts_ = ts;
-    num_wrap_ = 0;
-    return ts;
-  }
-
-  if (ts < last_ts_) {
-    if (last_ts_ >= 0xf0000000 && ts < 0x0fffffff)
-      ++num_wrap_;
-  } else if ((ts - last_ts_) > 0xf0000000) {
-    // Backwards wrap. Unwrap with last wrap count and don't update last_ts_.
-    return ts + ((num_wrap_ - 1) << 32);
-  }
-
-  last_ts_ = ts;
-  return ts + (num_wrap_ << 32);
-}
-
-int64_t TmToSeconds(const std::tm& tm) {
-  static short int mdays[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
-  static short int cumul_mdays[12] = {0,   31,  59,  90,  120, 151,
-                                      181, 212, 243, 273, 304, 334};
-  int year = tm.tm_year + 1900;
-  int month = tm.tm_mon;
-  int day = tm.tm_mday - 1;  // Make 0-based like the rest.
-  int hour = tm.tm_hour;
-  int min = tm.tm_min;
-  int sec = tm.tm_sec;
-
-  bool expiry_in_leap_year = (year % 4 == 0 &&
-                              (year % 100 != 0 || year % 400 == 0));
-
-  if (year < 1970)
-    return -1;
-  if (month < 0 || month > 11)
-    return -1;
-  if (day < 0 || day >= mdays[month] + (expiry_in_leap_year && month == 2 - 1))
-    return -1;
-  if (hour < 0 || hour > 23)
-    return -1;
-  if (min < 0 || min > 59)
-    return -1;
-  if (sec < 0 || sec > 59)
-    return -1;
-
-  day += cumul_mdays[month];
-
-  // Add number of leap days between 1970 and the expiration year, inclusive.
-  day += ((year / 4 - 1970 / 4) - (year / 100 - 1970 / 100) +
-          (year / 400 - 1970 / 400));
-
-  // We will have added one day too much above if expiration is during a leap
-  // year, and expiration is in January or February.
-  if (expiry_in_leap_year && month <= 2 - 1) // |month| is zero based.
-    day -= 1;
-
-  // Combine all variables into seconds from 1970-01-01 00:00 (except |month|
-  // which was accumulated into |day| above).
-  return (((static_cast<int64_t>
-            (year - 1970) * 365 + day) * 24 + hour) * 60 + min) * 60 + sec;
-}
-
-int64_t TimeUTCMicros() {
-#if defined(WEBRTC_POSIX)
-  struct timeval time;
-  gettimeofday(&time, nullptr);
-  // Convert from second (1.0) and microsecond (1e-6).
-  return (static_cast<int64_t>(time.tv_sec) * rtc::kNumMicrosecsPerSec +
-          time.tv_usec);
-
-#elif defined(WEBRTC_WIN)
-  struct _timeb time;
-  _ftime(&time);
-  // Convert from second (1.0) and milliseconds (1e-3).
-  return (static_cast<int64_t>(time.time) * rtc::kNumMicrosecsPerSec +
-          static_cast<int64_t>(time.millitm) * rtc::kNumMicrosecsPerMillisec);
-#endif
-}
-
-} // namespace rtc
diff --git a/rtc_base/timeutils.h b/rtc_base/timeutils.h
deleted file mode 100644
index c7f035c..0000000
--- a/rtc_base/timeutils.h
+++ /dev/null
@@ -1,158 +0,0 @@
-/*
- *  Copyright 2005 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_RTC_BASE_TIMEUTILS_H_
-#define WEBRTC_RTC_BASE_TIMEUTILS_H_
-
-#include <stdint.h>
-#include <time.h>
-
-#include <ctime>
-#include <string>
-
-#include "webrtc/rtc_base/checks.h"
-
-namespace rtc {
-
-static const int64_t kNumMillisecsPerSec = INT64_C(1000);
-static const int64_t kNumMicrosecsPerSec = INT64_C(1000000);
-static const int64_t kNumNanosecsPerSec = INT64_C(1000000000);
-
-static const int64_t kNumMicrosecsPerMillisec =
-    kNumMicrosecsPerSec / kNumMillisecsPerSec;
-static const int64_t kNumNanosecsPerMillisec =
-    kNumNanosecsPerSec / kNumMillisecsPerSec;
-static const int64_t kNumNanosecsPerMicrosec =
-    kNumNanosecsPerSec / kNumMicrosecsPerSec;
-
-// TODO(honghaiz): Define a type for the time value specifically.
-
-class ClockInterface {
- public:
-  virtual ~ClockInterface() {}
-  virtual int64_t TimeNanos() const = 0;
-};
-
-// Sets the global source of time. This is useful mainly for unit tests.
-//
-// Returns the previously set ClockInterface, or nullptr if none is set.
-//
-// Does not transfer ownership of the clock. SetClockForTesting(nullptr)
-// should be called before the ClockInterface is deleted.
-//
-// This method is not thread-safe; it should only be used when no other thread
-// is running (for example, at the start/end of a unit test, or start/end of
-// main()).
-//
-// TODO(deadbeef): Instead of having functions that access this global
-// ClockInterface, we may want to pass the ClockInterface into everything
-// that uses it, eliminating the need for a global variable and this function.
-ClockInterface* SetClockForTesting(ClockInterface* clock);
-
-// Returns previously set clock, or nullptr if no custom clock is being used.
-ClockInterface* GetClockForTesting();
-
-// Returns the actual system time, even if a clock is set for testing.
-// Useful for timeouts while using a test clock, or for logging.
-int64_t SystemTimeNanos();
-int64_t SystemTimeMillis();
-
-// Returns the current time in milliseconds in 32 bits.
-uint32_t Time32();
-
-// Returns the current time in milliseconds in 64 bits.
-int64_t TimeMillis();
-// Deprecated. Do not use this in any new code.
-inline int64_t Time() {
-  return TimeMillis();
-}
-
-// Returns the current time in microseconds.
-int64_t TimeMicros();
-
-// Returns the current time in nanoseconds.
-int64_t TimeNanos();
-
-
-// Returns a future timestamp, 'elapsed' milliseconds from now.
-int64_t TimeAfter(int64_t elapsed);
-
-// Number of milliseconds that would elapse between 'earlier' and 'later'
-// timestamps.  The value is negative if 'later' occurs before 'earlier'.
-int64_t TimeDiff(int64_t later, int64_t earlier);
-int32_t TimeDiff32(uint32_t later, uint32_t earlier);
-
-// The number of milliseconds that have elapsed since 'earlier'.
-inline int64_t TimeSince(int64_t earlier) {
-  return TimeMillis() - earlier;
-}
-
-// The number of milliseconds that will elapse between now and 'later'.
-inline int64_t TimeUntil(int64_t later) {
-  return later - TimeMillis();
-}
-
-class TimestampWrapAroundHandler {
- public:
-  TimestampWrapAroundHandler();
-
-  int64_t Unwrap(uint32_t ts);
-
- private:
-  uint32_t last_ts_;
-  int64_t num_wrap_;
-};
-
-// Convert from std::tm, which is relative to 1900-01-01 00:00 to number of
-// seconds from 1970-01-01 00:00 ("epoch").  Don't return time_t since that
-// is still 32 bits on many systems.
-int64_t TmToSeconds(const std::tm& tm);
-
-// Return the number of microseconds since January 1, 1970, UTC.
-// Useful mainly when producing logs to be correlated with other
-// devices, and when the devices in question all have properly
-// synchronized clocks.
-//
-// Note that this function obeys the system's idea about what the time
-// is. It is not guaranteed to be monotonic; it will jump in case the
-// system time is changed, e.g., by some other process calling
-// settimeofday. Always use rtc::TimeMicros(), not this function, for
-// measuring time intervals and timeouts.
-int64_t TimeUTCMicros();
-
-// Interval of time from the range [min, max] inclusive.
-class IntervalRange {
- public:
-  IntervalRange() : min_(0), max_(0) {}
-  IntervalRange(int min, int max) : min_(min), max_(max) {
-    RTC_DCHECK_LE(min, max);
-  }
-
-  int min() const { return min_; }
-  int max() const { return max_; }
-
-  std::string ToString() const {
-    std::stringstream ss;
-    ss << "[" << min_ << "," << max_ << "]";
-    return ss.str();
-  }
-
-  bool operator==(const IntervalRange& o) const {
-    return min_ == o.min_ && max_ == o.max_;
-  }
-
- private:
-  int min_;
-  int max_;
-};
-
-}  // namespace rtc
-
-#endif  // WEBRTC_RTC_BASE_TIMEUTILS_H_
diff --git a/rtc_base/timeutils_unittest.cc b/rtc_base/timeutils_unittest.cc
deleted file mode 100644
index a409fb6..0000000
--- a/rtc_base/timeutils_unittest.cc
+++ /dev/null
@@ -1,382 +0,0 @@
-/*
- *  Copyright 2004 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/rtc_base/timeutils.h"
-#include "webrtc/rtc_base/event.h"
-#include "webrtc/rtc_base/fakeclock.h"
-#include "webrtc/rtc_base/gunit.h"
-#include "webrtc/rtc_base/helpers.h"
-#include "webrtc/rtc_base/thread.h"
-
-namespace rtc {
-
-TEST(TimeTest, TimeInMs) {
-  int64_t ts_earlier = TimeMillis();
-  Thread::SleepMs(100);
-  int64_t ts_now = TimeMillis();
-  // Allow for the thread to wakeup ~20ms early.
-  EXPECT_GE(ts_now, ts_earlier + 80);
-  // Make sure the Time is not returning in smaller unit like microseconds.
-  EXPECT_LT(ts_now, ts_earlier + 1000);
-}
-
-TEST(TimeTest, Intervals) {
-  int64_t ts_earlier = TimeMillis();
-  int64_t ts_later = TimeAfter(500);
-
-  // We can't depend on ts_later and ts_earlier to be exactly 500 apart
-  // since time elapses between the calls to TimeMillis() and TimeAfter(500)
-  EXPECT_LE(500,  TimeDiff(ts_later, ts_earlier));
-  EXPECT_GE(-500, TimeDiff(ts_earlier, ts_later));
-
-  // Time has elapsed since ts_earlier
-  EXPECT_GE(TimeSince(ts_earlier), 0);
-
-  // ts_earlier is earlier than now, so TimeUntil ts_earlier is -ve
-  EXPECT_LE(TimeUntil(ts_earlier), 0);
-
-  // ts_later likely hasn't happened yet, so TimeSince could be -ve
-  // but within 500
-  EXPECT_GE(TimeSince(ts_later), -500);
-
-  // TimeUntil ts_later is at most 500
-  EXPECT_LE(TimeUntil(ts_later), 500);
-}
-
-TEST(TimeTest, TestTimeDiff64) {
-  int64_t ts_diff = 100;
-  int64_t ts_earlier = rtc::TimeMillis();
-  int64_t ts_later = ts_earlier + ts_diff;
-  EXPECT_EQ(ts_diff, rtc::TimeDiff(ts_later, ts_earlier));
-  EXPECT_EQ(-ts_diff, rtc::TimeDiff(ts_earlier, ts_later));
-}
-
-class TimestampWrapAroundHandlerTest : public testing::Test {
- public:
-  TimestampWrapAroundHandlerTest() {}
-
- protected:
-  TimestampWrapAroundHandler wraparound_handler_;
-};
-
-TEST_F(TimestampWrapAroundHandlerTest, Unwrap) {
-  // Start value.
-  int64_t ts = 2;
-  EXPECT_EQ(ts,
-            wraparound_handler_.Unwrap(static_cast<uint32_t>(ts & 0xffffffff)));
-
-  // Wrap backwards.
-  ts = -2;
-  EXPECT_EQ(ts,
-            wraparound_handler_.Unwrap(static_cast<uint32_t>(ts & 0xffffffff)));
-
-  // Forward to 2 again.
-  ts = 2;
-  EXPECT_EQ(ts,
-            wraparound_handler_.Unwrap(static_cast<uint32_t>(ts & 0xffffffff)));
-
-  // Max positive skip ahead, until max value (0xffffffff).
-  for (uint32_t i = 0; i <= 0xf; ++i) {
-    ts = (i << 28) + 0x0fffffff;
-    EXPECT_EQ(
-        ts, wraparound_handler_.Unwrap(static_cast<uint32_t>(ts & 0xffffffff)));
-  }
-
-  // Wrap around.
-  ts += 2;
-  EXPECT_EQ(ts,
-            wraparound_handler_.Unwrap(static_cast<uint32_t>(ts & 0xffffffff)));
-
-  // Max wrap backward...
-  ts -= 0x0fffffff;
-  EXPECT_EQ(ts,
-            wraparound_handler_.Unwrap(static_cast<uint32_t>(ts & 0xffffffff)));
-
-  // ...and back again.
-  ts += 0x0fffffff;
-  EXPECT_EQ(ts,
-            wraparound_handler_.Unwrap(static_cast<uint32_t>(ts & 0xffffffff)));
-}
-
-TEST_F(TimestampWrapAroundHandlerTest, NoNegativeStart) {
-  int64_t ts = 0xfffffff0;
-  EXPECT_EQ(ts,
-            wraparound_handler_.Unwrap(static_cast<uint32_t>(ts & 0xffffffff)));
-}
-
-class TmToSeconds : public testing::Test {
- public:
-  TmToSeconds() {
-    // Set use of the test RNG to get deterministic expiration timestamp.
-    rtc::SetRandomTestMode(true);
-  }
-  ~TmToSeconds() override {
-    // Put it back for the next test.
-    rtc::SetRandomTestMode(false);
-  }
-
-  void TestTmToSeconds(int times) {
-    static char mdays[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
-    for (int i = 0; i < times; i++) {
-
-      // First generate something correct and check that TmToSeconds is happy.
-      int year = rtc::CreateRandomId() % 400 + 1970;
-
-      bool leap_year = false;
-      if (year % 4 == 0)
-        leap_year = true;
-      if (year % 100 == 0)
-        leap_year = false;
-      if (year % 400 == 0)
-        leap_year = true;
-
-      std::tm tm;
-      tm.tm_year = year - 1900;  // std::tm is year 1900 based.
-      tm.tm_mon = rtc::CreateRandomId() % 12;
-      tm.tm_mday = rtc::CreateRandomId() % mdays[tm.tm_mon] + 1;
-      tm.tm_hour = rtc::CreateRandomId() % 24;
-      tm.tm_min = rtc::CreateRandomId() % 60;
-      tm.tm_sec = rtc::CreateRandomId() % 60;
-      int64_t t = rtc::TmToSeconds(tm);
-      EXPECT_TRUE(t >= 0);
-
-      // Now damage a random field and check that TmToSeconds is unhappy.
-      switch (rtc::CreateRandomId() % 11) {
-        case 0:
-          tm.tm_year = 1969 - 1900;
-          break;
-        case 1:
-          tm.tm_mon = -1;
-          break;
-        case 2:
-          tm.tm_mon = 12;
-          break;
-        case 3:
-          tm.tm_mday = 0;
-          break;
-        case 4:
-          tm.tm_mday = mdays[tm.tm_mon] + (leap_year && tm.tm_mon == 1) + 1;
-          break;
-        case 5:
-          tm.tm_hour = -1;
-          break;
-        case 6:
-          tm.tm_hour = 24;
-          break;
-        case 7:
-          tm.tm_min = -1;
-          break;
-        case 8:
-          tm.tm_min = 60;
-          break;
-        case 9:
-          tm.tm_sec = -1;
-          break;
-        case 10:
-          tm.tm_sec = 60;
-          break;
-      }
-      EXPECT_EQ(rtc::TmToSeconds(tm), -1);
-    }
-    // Check consistency with the system gmtime_r.  With time_t, we can only
-    // portably test dates until 2038, which is achieved by the % 0x80000000.
-    for (int i = 0; i < times; i++) {
-      time_t t = rtc::CreateRandomId() % 0x80000000;
-#if defined(WEBRTC_WIN)
-      std::tm* tm = std::gmtime(&t);
-      EXPECT_TRUE(tm);
-      EXPECT_TRUE(rtc::TmToSeconds(*tm) == t);
-#else
-      std::tm tm;
-      EXPECT_TRUE(gmtime_r(&t, &tm));
-      EXPECT_TRUE(rtc::TmToSeconds(tm) == t);
-#endif
-    }
-  }
-};
-
-TEST_F(TmToSeconds, TestTmToSeconds) {
-  TestTmToSeconds(100000);
-}
-
-TEST(TimeDelta, FromAndTo) {
-  EXPECT_TRUE(TimeDelta::FromSeconds(2) == TimeDelta::FromMilliseconds(2000));
-  EXPECT_TRUE(TimeDelta::FromMilliseconds(3) ==
-              TimeDelta::FromMicroseconds(3000));
-  EXPECT_TRUE(TimeDelta::FromMicroseconds(4) ==
-              TimeDelta::FromNanoseconds(4000));
-  EXPECT_EQ(13, TimeDelta::FromSeconds(13).ToSeconds());
-  EXPECT_EQ(13, TimeDelta::FromMilliseconds(13).ToMilliseconds());
-  EXPECT_EQ(13, TimeDelta::FromMicroseconds(13).ToMicroseconds());
-  EXPECT_EQ(13, TimeDelta::FromNanoseconds(13).ToNanoseconds());
-}
-
-TEST(TimeDelta, ComparisonOperators) {
-  EXPECT_LT(TimeDelta::FromSeconds(1), TimeDelta::FromSeconds(2));
-  EXPECT_EQ(TimeDelta::FromSeconds(3), TimeDelta::FromSeconds(3));
-  EXPECT_GT(TimeDelta::FromSeconds(5), TimeDelta::FromSeconds(4));
-}
-
-TEST(TimeDelta, NumericOperators) {
-  double d = 0.5;
-  EXPECT_EQ(TimeDelta::FromMilliseconds(500),
-            TimeDelta::FromMilliseconds(1000) * d);
-  EXPECT_EQ(TimeDelta::FromMilliseconds(2000),
-            TimeDelta::FromMilliseconds(1000) / d);
-  EXPECT_EQ(TimeDelta::FromMilliseconds(500),
-            TimeDelta::FromMilliseconds(1000) *= d);
-  EXPECT_EQ(TimeDelta::FromMilliseconds(2000),
-            TimeDelta::FromMilliseconds(1000) /= d);
-  EXPECT_EQ(TimeDelta::FromMilliseconds(500),
-            d * TimeDelta::FromMilliseconds(1000));
-
-  float f = 0.5;
-  EXPECT_EQ(TimeDelta::FromMilliseconds(500),
-            TimeDelta::FromMilliseconds(1000) * f);
-  EXPECT_EQ(TimeDelta::FromMilliseconds(2000),
-            TimeDelta::FromMilliseconds(1000) / f);
-  EXPECT_EQ(TimeDelta::FromMilliseconds(500),
-            TimeDelta::FromMilliseconds(1000) *= f);
-  EXPECT_EQ(TimeDelta::FromMilliseconds(2000),
-            TimeDelta::FromMilliseconds(1000) /= f);
-  EXPECT_EQ(TimeDelta::FromMilliseconds(500),
-            f * TimeDelta::FromMilliseconds(1000));
-
-  int i = 2;
-  EXPECT_EQ(TimeDelta::FromMilliseconds(2000),
-            TimeDelta::FromMilliseconds(1000) * i);
-  EXPECT_EQ(TimeDelta::FromMilliseconds(500),
-            TimeDelta::FromMilliseconds(1000) / i);
-  EXPECT_EQ(TimeDelta::FromMilliseconds(2000),
-            TimeDelta::FromMilliseconds(1000) *= i);
-  EXPECT_EQ(TimeDelta::FromMilliseconds(500),
-            TimeDelta::FromMilliseconds(1000) /= i);
-  EXPECT_EQ(TimeDelta::FromMilliseconds(2000),
-            i * TimeDelta::FromMilliseconds(1000));
-
-  int64_t i64 = 2;
-  EXPECT_EQ(TimeDelta::FromMilliseconds(2000),
-            TimeDelta::FromMilliseconds(1000) * i64);
-  EXPECT_EQ(TimeDelta::FromMilliseconds(500),
-            TimeDelta::FromMilliseconds(1000) / i64);
-  EXPECT_EQ(TimeDelta::FromMilliseconds(2000),
-            TimeDelta::FromMilliseconds(1000) *= i64);
-  EXPECT_EQ(TimeDelta::FromMilliseconds(500),
-            TimeDelta::FromMilliseconds(1000) /= i64);
-  EXPECT_EQ(TimeDelta::FromMilliseconds(2000),
-            i64 * TimeDelta::FromMilliseconds(1000));
-
-  EXPECT_EQ(TimeDelta::FromMilliseconds(500),
-            TimeDelta::FromMilliseconds(1000) * 0.5);
-  EXPECT_EQ(TimeDelta::FromMilliseconds(2000),
-            TimeDelta::FromMilliseconds(1000) / 0.5);
-  EXPECT_EQ(TimeDelta::FromMilliseconds(500),
-            TimeDelta::FromMilliseconds(1000) *= 0.5);
-  EXPECT_EQ(TimeDelta::FromMilliseconds(2000),
-            TimeDelta::FromMilliseconds(1000) /= 0.5);
-  EXPECT_EQ(TimeDelta::FromMilliseconds(500),
-            0.5 * TimeDelta::FromMilliseconds(1000));
-
-  EXPECT_EQ(TimeDelta::FromMilliseconds(2000),
-            TimeDelta::FromMilliseconds(1000) * 2);
-  EXPECT_EQ(TimeDelta::FromMilliseconds(500),
-            TimeDelta::FromMilliseconds(1000) / 2);
-  EXPECT_EQ(TimeDelta::FromMilliseconds(2000),
-            TimeDelta::FromMilliseconds(1000) *= 2);
-  EXPECT_EQ(TimeDelta::FromMilliseconds(500),
-            TimeDelta::FromMilliseconds(1000) /= 2);
-  EXPECT_EQ(TimeDelta::FromMilliseconds(2000),
-            2 * TimeDelta::FromMilliseconds(1000));
-}
-
-// Test that all the time functions exposed by TimeUtils get time from the
-// fake clock when it's set.
-TEST(FakeClock, TimeFunctionsUseFakeClock) {
-  FakeClock clock;
-  SetClockForTesting(&clock);
-
-  clock.SetTimeNanos(987654321);
-  EXPECT_EQ(987u, Time32());
-  EXPECT_EQ(987, TimeMillis());
-  EXPECT_EQ(987654, TimeMicros());
-  EXPECT_EQ(987654321, TimeNanos());
-  EXPECT_EQ(1000u, TimeAfter(13));
-
-  SetClockForTesting(nullptr);
-  // After it's unset, we should get a normal time.
-  EXPECT_NE(987, TimeMillis());
-}
-
-TEST(FakeClock, InitialTime) {
-  FakeClock clock;
-  EXPECT_EQ(0, clock.TimeNanos());
-}
-
-TEST(FakeClock, SetTimeNanos) {
-  FakeClock clock;
-  clock.SetTimeNanos(123);
-  EXPECT_EQ(123, clock.TimeNanos());
-  clock.SetTimeNanos(456);
-  EXPECT_EQ(456, clock.TimeNanos());
-}
-
-TEST(FakeClock, AdvanceTime) {
-  FakeClock clock;
-  clock.AdvanceTime(TimeDelta::FromNanoseconds(1111u));
-  EXPECT_EQ(1111, clock.TimeNanos());
-  clock.AdvanceTime(TimeDelta::FromMicroseconds(2222u));
-  EXPECT_EQ(2223111, clock.TimeNanos());
-  clock.AdvanceTime(TimeDelta::FromMilliseconds(3333u));
-  EXPECT_EQ(3335223111, clock.TimeNanos());
-  clock.AdvanceTime(TimeDelta::FromSeconds(4444u));
-  EXPECT_EQ(4447335223111, clock.TimeNanos());
-}
-
-// When the clock is advanced, threads that are waiting in a socket select
-// should wake up and look at the new time. This allows tests using the
-// fake clock to run much faster, if the test is bound by time constraints
-// (such as a test for a STUN ping timeout).
-TEST(FakeClock, SettingTimeWakesThreads) {
-  int64_t real_start_time_ms = TimeMillis();
-
-  FakeClock clock;
-  SetClockForTesting(&clock);
-
-  std::unique_ptr<Thread> worker(Thread::CreateWithSocketServer());
-  worker->Start();
-
-  // Post an event that won't be executed for 10 seconds.
-  Event message_handler_dispatched(false, false);
-  auto functor = [&message_handler_dispatched] {
-    message_handler_dispatched.Set();
-  };
-  FunctorMessageHandler<void, decltype(functor)> handler(functor);
-  worker->PostDelayed(RTC_FROM_HERE, 60000, &handler);
-
-  // Wait for a bit for the worker thread to be started and enter its socket
-  // select(). Otherwise this test would be trivial since the worker thread
-  // would process the event as soon as it was started.
-  Thread::Current()->SleepMs(1000);
-
-  // Advance the fake clock, expecting the worker thread to wake up
-  // and dispatch the message instantly.
-  clock.AdvanceTime(TimeDelta::FromSeconds(60u));
-  EXPECT_TRUE(message_handler_dispatched.Wait(0));
-  worker->Stop();
-
-  SetClockForTesting(nullptr);
-
-  // The message should have been dispatched long before the 60 seconds fully
-  // elapsed (just a sanity check).
-  int64_t real_end_time_ms = TimeMillis();
-  EXPECT_LT(real_end_time_ms - real_start_time_ms, 10000);
-}
-
-}  // namespace rtc
diff --git a/rtc_base/trace_event.h b/rtc_base/trace_event.h
deleted file mode 100644
index 6a1476d..0000000
--- a/rtc_base/trace_event.h
+++ /dev/null
@@ -1,916 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file under third_party_mods/chromium or at:
-// http://src.chromium.org/svn/trunk/src/LICENSE
-
-#ifndef WEBRTC_RTC_BASE_TRACE_EVENT_H_
-#define WEBRTC_RTC_BASE_TRACE_EVENT_H_
-
-#include <string>
-
-#include "webrtc/rtc_base/event_tracer.h"
-
-#if defined(TRACE_EVENT0)
-#error "Another copy of trace_event.h has already been included."
-#endif
-
-// Extracted from Chromium's src/base/debug/trace_event.h.
-
-// This header is designed to give you trace_event macros without specifying
-// how the events actually get collected and stored. If you need to expose trace
-// event to some other universe, you can copy-and-paste this file,
-// implement the TRACE_EVENT_API macros, and do any other necessary fixup for
-// the target platform. The end result is that multiple libraries can funnel
-// events through to a shared trace event collector.
-
-// Trace events are for tracking application performance and resource usage.
-// Macros are provided to track:
-//    Begin and end of function calls
-//    Counters
-//
-// Events are issued against categories. Whereas LOG's
-// categories are statically defined, TRACE categories are created
-// implicitly with a string. For example:
-//   TRACE_EVENT_INSTANT0("MY_SUBSYSTEM", "SomeImportantEvent")
-//
-// Events can be INSTANT, or can be pairs of BEGIN and END in the same scope:
-//   TRACE_EVENT_BEGIN0("MY_SUBSYSTEM", "SomethingCostly")
-//   doSomethingCostly()
-//   TRACE_EVENT_END0("MY_SUBSYSTEM", "SomethingCostly")
-// Note: our tools can't always determine the correct BEGIN/END pairs unless
-// these are used in the same scope. Use ASYNC_BEGIN/ASYNC_END macros if you
-// need them to be in separate scopes.
-//
-// A common use case is to trace entire function scopes. This
-// issues a trace BEGIN and END automatically:
-//   void doSomethingCostly() {
-//     TRACE_EVENT0("MY_SUBSYSTEM", "doSomethingCostly");
-//     ...
-//   }
-//
-// Additional parameters can be associated with an event:
-//   void doSomethingCostly2(int howMuch) {
-//     TRACE_EVENT1("MY_SUBSYSTEM", "doSomethingCostly",
-//         "howMuch", howMuch);
-//     ...
-//   }
-//
-// The trace system will automatically add to this information the
-// current process id, thread id, and a timestamp in microseconds.
-//
-// To trace an asynchronous procedure such as an IPC send/receive, use
-// ASYNC_BEGIN and ASYNC_END:
-//   [single threaded sender code]
-//     static int send_count = 0;
-//     ++send_count;
-//     TRACE_EVENT_ASYNC_BEGIN0("ipc", "message", send_count);
-//     Send(new MyMessage(send_count));
-//   [receive code]
-//     void OnMyMessage(send_count) {
-//       TRACE_EVENT_ASYNC_END0("ipc", "message", send_count);
-//     }
-// The third parameter is a unique ID to match ASYNC_BEGIN/ASYNC_END pairs.
-// ASYNC_BEGIN and ASYNC_END can occur on any thread of any traced process.
-// Pointers can be used for the ID parameter, and they will be mangled
-// internally so that the same pointer on two different processes will not
-// match. For example:
-//   class MyTracedClass {
-//    public:
-//     MyTracedClass() {
-//       TRACE_EVENT_ASYNC_BEGIN0("category", "MyTracedClass", this);
-//     }
-//     ~MyTracedClass() {
-//       TRACE_EVENT_ASYNC_END0("category", "MyTracedClass", this);
-//     }
-//   }
-//
-// Trace event also supports counters, which is a way to track a quantity
-// as it varies over time. Counters are created with the following macro:
-//   TRACE_COUNTER1("MY_SUBSYSTEM", "myCounter", g_myCounterValue);
-//
-// Counters are process-specific. The macro itself can be issued from any
-// thread, however.
-//
-// Sometimes, you want to track two counters at once. You can do this with two
-// counter macros:
-//   TRACE_COUNTER1("MY_SUBSYSTEM", "myCounter0", g_myCounterValue[0]);
-//   TRACE_COUNTER1("MY_SUBSYSTEM", "myCounter1", g_myCounterValue[1]);
-// Or you can do it with a combined macro:
-//   TRACE_COUNTER2("MY_SUBSYSTEM", "myCounter",
-//       "bytesPinned", g_myCounterValue[0],
-//       "bytesAllocated", g_myCounterValue[1]);
-// This indicates to the tracing UI that these counters should be displayed
-// in a single graph, as a summed area chart.
-//
-// Since counters are in a global namespace, you may want to disembiguate with a
-// unique ID, by using the TRACE_COUNTER_ID* variations.
-//
-// By default, trace collection is compiled in, but turned off at runtime.
-// Collecting trace data is the responsibility of the embedding
-// application. In Chrome's case, navigating to about:tracing will turn on
-// tracing and display data collected across all active processes.
-//
-//
-// Memory scoping note:
-// Tracing copies the pointers, not the string content, of the strings passed
-// in for category, name, and arg_names.  Thus, the following code will
-// cause problems:
-//     char* str = strdup("impprtantName");
-//     TRACE_EVENT_INSTANT0("SUBSYSTEM", str);  // BAD!
-//     free(str);                   // Trace system now has dangling pointer
-//
-// To avoid this issue with the |name| and |arg_name| parameters, use the
-// TRACE_EVENT_COPY_XXX overloads of the macros at additional runtime overhead.
-// Notes: The category must always be in a long-lived char* (i.e. static const).
-//        The |arg_values|, when used, are always deep copied with the _COPY
-//        macros.
-//
-// When are string argument values copied:
-// const char* arg_values are only referenced by default:
-//     TRACE_EVENT1("category", "name",
-//                  "arg1", "literal string is only referenced");
-// Use TRACE_STR_COPY to force copying of a const char*:
-//     TRACE_EVENT1("category", "name",
-//                  "arg1", TRACE_STR_COPY("string will be copied"));
-// std::string arg_values are always copied:
-//     TRACE_EVENT1("category", "name",
-//                  "arg1", std::string("string will be copied"));
-//
-//
-// Thread Safety:
-// Thread safety is provided by methods defined in event_tracer.h. See the file
-// for details.
-
-
-// By default, const char* argument values are assumed to have long-lived scope
-// and will not be copied. Use this macro to force a const char* to be copied.
-#define TRACE_STR_COPY(str) \
-    webrtc::trace_event_internal::TraceStringWithCopy(str)
-
-// This will mark the trace event as disabled by default. The user will need
-// to explicitly enable the event.
-#define TRACE_DISABLED_BY_DEFAULT(name) "disabled-by-default-" name
-
-// By default, uint64 ID argument values are not mangled with the Process ID in
-// TRACE_EVENT_ASYNC macros. Use this macro to force Process ID mangling.
-#define TRACE_ID_MANGLE(id) \
-    webrtc::trace_event_internal::TraceID::ForceMangle(id)
-
-// Records a pair of begin and end events called "name" for the current
-// scope, with 0, 1 or 2 associated arguments. If the category is not
-// enabled, then this does nothing.
-// - category and name strings must have application lifetime (statics or
-//   literals). They may not include " chars.
-#define TRACE_EVENT0(category, name) \
-    INTERNAL_TRACE_EVENT_ADD_SCOPED(category, name)
-#define TRACE_EVENT1(category, name, arg1_name, arg1_val) \
-    INTERNAL_TRACE_EVENT_ADD_SCOPED(category, name, arg1_name, arg1_val)
-#define TRACE_EVENT2(category, name, arg1_name, arg1_val, arg2_name, arg2_val) \
-    INTERNAL_TRACE_EVENT_ADD_SCOPED(category, name, arg1_name, arg1_val, \
-        arg2_name, arg2_val)
-
-// Same as TRACE_EVENT except that they are not included in official builds.
-#ifdef OFFICIAL_BUILD
-#define UNSHIPPED_TRACE_EVENT0(category, name) (void)0
-#define UNSHIPPED_TRACE_EVENT1(category, name, arg1_name, arg1_val) (void)0
-#define UNSHIPPED_TRACE_EVENT2(category, name, arg1_name, arg1_val, \
-                               arg2_name, arg2_val) (void)0
-#define UNSHIPPED_TRACE_EVENT_INSTANT0(category, name) (void)0
-#define UNSHIPPED_TRACE_EVENT_INSTANT1(category, name, arg1_name, arg1_val) \
-    (void)0
-#define UNSHIPPED_TRACE_EVENT_INSTANT2(category, name, arg1_name, arg1_val, \
-                                       arg2_name, arg2_val) (void)0
-#else
-#define UNSHIPPED_TRACE_EVENT0(category, name) \
-    TRACE_EVENT0(category, name)
-#define UNSHIPPED_TRACE_EVENT1(category, name, arg1_name, arg1_val) \
-    TRACE_EVENT1(category, name, arg1_name, arg1_val)
-#define UNSHIPPED_TRACE_EVENT2(category, name, arg1_name, arg1_val, \
-                               arg2_name, arg2_val) \
-    TRACE_EVENT2(category, name, arg1_name, arg1_val, arg2_name, arg2_val)
-#define UNSHIPPED_TRACE_EVENT_INSTANT0(category, name) \
-    TRACE_EVENT_INSTANT0(category, name)
-#define UNSHIPPED_TRACE_EVENT_INSTANT1(category, name, arg1_name, arg1_val) \
-    TRACE_EVENT_INSTANT1(category, name, arg1_name, arg1_val)
-#define UNSHIPPED_TRACE_EVENT_INSTANT2(category, name, arg1_name, arg1_val, \
-                                       arg2_name, arg2_val) \
-    TRACE_EVENT_INSTANT2(category, name, arg1_name, arg1_val, \
-                         arg2_name, arg2_val)
-#endif
-
-// Records a single event called "name" immediately, with 0, 1 or 2
-// associated arguments. If the category is not enabled, then this
-// does nothing.
-// - category and name strings must have application lifetime (statics or
-//   literals). They may not include " chars.
-#define TRACE_EVENT_INSTANT0(category, name) \
-    INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_INSTANT, \
-        category, name, TRACE_EVENT_FLAG_NONE)
-#define TRACE_EVENT_INSTANT1(category, name, arg1_name, arg1_val) \
-    INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_INSTANT, \
-        category, name, TRACE_EVENT_FLAG_NONE, arg1_name, arg1_val)
-#define TRACE_EVENT_INSTANT2(category, name, arg1_name, arg1_val, \
-        arg2_name, arg2_val) \
-    INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_INSTANT, \
-        category, name, TRACE_EVENT_FLAG_NONE, arg1_name, arg1_val, \
-        arg2_name, arg2_val)
-#define TRACE_EVENT_COPY_INSTANT0(category, name) \
-    INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_INSTANT, \
-        category, name, TRACE_EVENT_FLAG_COPY)
-#define TRACE_EVENT_COPY_INSTANT1(category, name, arg1_name, arg1_val) \
-    INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_INSTANT, \
-        category, name, TRACE_EVENT_FLAG_COPY, arg1_name, arg1_val)
-#define TRACE_EVENT_COPY_INSTANT2(category, name, arg1_name, arg1_val, \
-        arg2_name, arg2_val) \
-    INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_INSTANT, \
-        category, name, TRACE_EVENT_FLAG_COPY, arg1_name, arg1_val, \
-        arg2_name, arg2_val)
-
-// Records a single BEGIN event called "name" immediately, with 0, 1 or 2
-// associated arguments. If the category is not enabled, then this
-// does nothing.
-// - category and name strings must have application lifetime (statics or
-//   literals). They may not include " chars.
-#define TRACE_EVENT_BEGIN0(category, name) \
-    INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_BEGIN, \
-        category, name, TRACE_EVENT_FLAG_NONE)
-#define TRACE_EVENT_BEGIN1(category, name, arg1_name, arg1_val) \
-    INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_BEGIN, \
-        category, name, TRACE_EVENT_FLAG_NONE, arg1_name, arg1_val)
-#define TRACE_EVENT_BEGIN2(category, name, arg1_name, arg1_val, \
-        arg2_name, arg2_val) \
-    INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_BEGIN, \
-        category, name, TRACE_EVENT_FLAG_NONE, arg1_name, arg1_val, \
-        arg2_name, arg2_val)
-#define TRACE_EVENT_COPY_BEGIN0(category, name) \
-    INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_BEGIN, \
-        category, name, TRACE_EVENT_FLAG_COPY)
-#define TRACE_EVENT_COPY_BEGIN1(category, name, arg1_name, arg1_val) \
-    INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_BEGIN, \
-        category, name, TRACE_EVENT_FLAG_COPY, arg1_name, arg1_val)
-#define TRACE_EVENT_COPY_BEGIN2(category, name, arg1_name, arg1_val, \
-        arg2_name, arg2_val) \
-    INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_BEGIN, \
-        category, name, TRACE_EVENT_FLAG_COPY, arg1_name, arg1_val, \
-        arg2_name, arg2_val)
-
-// Records a single END event for "name" immediately. If the category
-// is not enabled, then this does nothing.
-// - category and name strings must have application lifetime (statics or
-//   literals). They may not include " chars.
-#define TRACE_EVENT_END0(category, name) \
-    INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_END, \
-        category, name, TRACE_EVENT_FLAG_NONE)
-#define TRACE_EVENT_END1(category, name, arg1_name, arg1_val) \
-    INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_END, \
-        category, name, TRACE_EVENT_FLAG_NONE, arg1_name, arg1_val)
-#define TRACE_EVENT_END2(category, name, arg1_name, arg1_val, \
-        arg2_name, arg2_val) \
-    INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_END, \
-        category, name, TRACE_EVENT_FLAG_NONE, arg1_name, arg1_val, \
-        arg2_name, arg2_val)
-#define TRACE_EVENT_COPY_END0(category, name) \
-    INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_END, \
-        category, name, TRACE_EVENT_FLAG_COPY)
-#define TRACE_EVENT_COPY_END1(category, name, arg1_name, arg1_val) \
-    INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_END, \
-        category, name, TRACE_EVENT_FLAG_COPY, arg1_name, arg1_val)
-#define TRACE_EVENT_COPY_END2(category, name, arg1_name, arg1_val, \
-        arg2_name, arg2_val) \
-    INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_END, \
-        category, name, TRACE_EVENT_FLAG_COPY, arg1_name, arg1_val, \
-        arg2_name, arg2_val)
-
-// Records the value of a counter called "name" immediately. Value
-// must be representable as a 32 bit integer.
-// - category and name strings must have application lifetime (statics or
-//   literals). They may not include " chars.
-#define TRACE_COUNTER1(category, name, value) \
-    INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_COUNTER, \
-        category, name, TRACE_EVENT_FLAG_NONE, \
-        "value", static_cast<int>(value))
-#define TRACE_COPY_COUNTER1(category, name, value) \
-    INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_COUNTER, \
-        category, name, TRACE_EVENT_FLAG_COPY, \
-        "value", static_cast<int>(value))
-
-// Records the values of a multi-parted counter called "name" immediately.
-// The UI will treat value1 and value2 as parts of a whole, displaying their
-// values as a stacked-bar chart.
-// - category and name strings must have application lifetime (statics or
-//   literals). They may not include " chars.
-#define TRACE_COUNTER2(category, name, value1_name, value1_val, \
-        value2_name, value2_val) \
-    INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_COUNTER, \
-        category, name, TRACE_EVENT_FLAG_NONE, \
-        value1_name, static_cast<int>(value1_val), \
-        value2_name, static_cast<int>(value2_val))
-#define TRACE_COPY_COUNTER2(category, name, value1_name, value1_val, \
-        value2_name, value2_val) \
-    INTERNAL_TRACE_EVENT_ADD(TRACE_EVENT_PHASE_COUNTER, \
-        category, name, TRACE_EVENT_FLAG_COPY, \
-        value1_name, static_cast<int>(value1_val), \
-        value2_name, static_cast<int>(value2_val))
-
-// Records the value of a counter called "name" immediately. Value
-// must be representable as a 32 bit integer.
-// - category and name strings must have application lifetime (statics or
-//   literals). They may not include " chars.
-// - |id| is used to disambiguate counters with the same name. It must either
-//   be a pointer or an integer value up to 64 bits. If it's a pointer, the bits
-//   will be xored with a hash of the process ID so that the same pointer on
-//   two different processes will not collide.
-#define TRACE_COUNTER_ID1(category, name, id, value) \
-    INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_COUNTER, \
-        category, name, id, TRACE_EVENT_FLAG_NONE, \
-        "value", static_cast<int>(value))
-#define TRACE_COPY_COUNTER_ID1(category, name, id, value) \
-    INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_COUNTER, \
-        category, name, id, TRACE_EVENT_FLAG_COPY, \
-        "value", static_cast<int>(value))
-
-// Records the values of a multi-parted counter called "name" immediately.
-// The UI will treat value1 and value2 as parts of a whole, displaying their
-// values as a stacked-bar chart.
-// - category and name strings must have application lifetime (statics or
-//   literals). They may not include " chars.
-// - |id| is used to disambiguate counters with the same name. It must either
-//   be a pointer or an integer value up to 64 bits. If it's a pointer, the bits
-//   will be xored with a hash of the process ID so that the same pointer on
-//   two different processes will not collide.
-#define TRACE_COUNTER_ID2(category, name, id, value1_name, value1_val, \
-        value2_name, value2_val) \
-    INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_COUNTER, \
-        category, name, id, TRACE_EVENT_FLAG_NONE, \
-        value1_name, static_cast<int>(value1_val), \
-        value2_name, static_cast<int>(value2_val))
-#define TRACE_COPY_COUNTER_ID2(category, name, id, value1_name, value1_val, \
-        value2_name, value2_val) \
-    INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_COUNTER, \
-        category, name, id, TRACE_EVENT_FLAG_COPY, \
-        value1_name, static_cast<int>(value1_val), \
-        value2_name, static_cast<int>(value2_val))
-
-
-// Records a single ASYNC_BEGIN event called "name" immediately, with 0, 1 or 2
-// associated arguments. If the category is not enabled, then this
-// does nothing.
-// - category and name strings must have application lifetime (statics or
-//   literals). They may not include " chars.
-// - |id| is used to match the ASYNC_BEGIN event with the ASYNC_END event. ASYNC
-//   events are considered to match if their category, name and id values all
-//   match. |id| must either be a pointer or an integer value up to 64 bits. If
-//   it's a pointer, the bits will be xored with a hash of the process ID so
-//   that the same pointer on two different processes will not collide.
-// An asynchronous operation can consist of multiple phases. The first phase is
-// defined by the ASYNC_BEGIN calls. Additional phases can be defined using the
-// ASYNC_STEP macros. When the operation completes, call ASYNC_END.
-// An ASYNC trace typically occur on a single thread (if not, they will only be
-// drawn on the thread defined in the ASYNC_BEGIN event), but all events in that
-// operation must use the same |name| and |id|. Each event can have its own
-// args.
-#define TRACE_EVENT_ASYNC_BEGIN0(category, name, id) \
-    INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_ASYNC_BEGIN, \
-        category, name, id, TRACE_EVENT_FLAG_NONE)
-#define TRACE_EVENT_ASYNC_BEGIN1(category, name, id, arg1_name, arg1_val) \
-    INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_ASYNC_BEGIN, \
-        category, name, id, TRACE_EVENT_FLAG_NONE, arg1_name, arg1_val)
-#define TRACE_EVENT_ASYNC_BEGIN2(category, name, id, arg1_name, arg1_val, \
-        arg2_name, arg2_val) \
-    INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_ASYNC_BEGIN, \
-        category, name, id, TRACE_EVENT_FLAG_NONE, \
-        arg1_name, arg1_val, arg2_name, arg2_val)
-#define TRACE_EVENT_COPY_ASYNC_BEGIN0(category, name, id) \
-    INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_ASYNC_BEGIN, \
-        category, name, id, TRACE_EVENT_FLAG_COPY)
-#define TRACE_EVENT_COPY_ASYNC_BEGIN1(category, name, id, arg1_name, arg1_val) \
-    INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_ASYNC_BEGIN, \
-        category, name, id, TRACE_EVENT_FLAG_COPY, \
-        arg1_name, arg1_val)
-#define TRACE_EVENT_COPY_ASYNC_BEGIN2(category, name, id, arg1_name, arg1_val, \
-        arg2_name, arg2_val) \
-    INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_ASYNC_BEGIN, \
-        category, name, id, TRACE_EVENT_FLAG_COPY, \
-        arg1_name, arg1_val, arg2_name, arg2_val)
-
-// Records a single ASYNC_STEP event for |step| immediately. If the category
-// is not enabled, then this does nothing. The |name| and |id| must match the
-// ASYNC_BEGIN event above. The |step| param identifies this step within the
-// async event. This should be called at the beginning of the next phase of an
-// asynchronous operation.
-#define TRACE_EVENT_ASYNC_STEP0(category, name, id, step) \
-    INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_ASYNC_STEP, \
-        category, name, id, TRACE_EVENT_FLAG_NONE, "step", step)
-#define TRACE_EVENT_ASYNC_STEP1(category, name, id, step, \
-                                      arg1_name, arg1_val) \
-    INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_ASYNC_STEP, \
-        category, name, id, TRACE_EVENT_FLAG_NONE, "step", step, \
-        arg1_name, arg1_val)
-#define TRACE_EVENT_COPY_ASYNC_STEP0(category, name, id, step) \
-    INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_ASYNC_STEP, \
-        category, name, id, TRACE_EVENT_FLAG_COPY, "step", step)
-#define TRACE_EVENT_COPY_ASYNC_STEP1(category, name, id, step, \
-        arg1_name, arg1_val) \
-    INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_ASYNC_STEP, \
-        category, name, id, TRACE_EVENT_FLAG_COPY, "step", step, \
-        arg1_name, arg1_val)
-
-// Records a single ASYNC_END event for "name" immediately. If the category
-// is not enabled, then this does nothing.
-#define TRACE_EVENT_ASYNC_END0(category, name, id) \
-    INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_ASYNC_END, \
-        category, name, id, TRACE_EVENT_FLAG_NONE)
-#define TRACE_EVENT_ASYNC_END1(category, name, id, arg1_name, arg1_val) \
-    INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_ASYNC_END, \
-        category, name, id, TRACE_EVENT_FLAG_NONE, arg1_name, arg1_val)
-#define TRACE_EVENT_ASYNC_END2(category, name, id, arg1_name, arg1_val, \
-        arg2_name, arg2_val) \
-    INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_ASYNC_END, \
-        category, name, id, TRACE_EVENT_FLAG_NONE, \
-        arg1_name, arg1_val, arg2_name, arg2_val)
-#define TRACE_EVENT_COPY_ASYNC_END0(category, name, id) \
-    INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_ASYNC_END, \
-        category, name, id, TRACE_EVENT_FLAG_COPY)
-#define TRACE_EVENT_COPY_ASYNC_END1(category, name, id, arg1_name, arg1_val) \
-    INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_ASYNC_END, \
-        category, name, id, TRACE_EVENT_FLAG_COPY, \
-        arg1_name, arg1_val)
-#define TRACE_EVENT_COPY_ASYNC_END2(category, name, id, arg1_name, arg1_val, \
-        arg2_name, arg2_val) \
-    INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_ASYNC_END, \
-        category, name, id, TRACE_EVENT_FLAG_COPY, \
-        arg1_name, arg1_val, arg2_name, arg2_val)
-
-
-// Records a single FLOW_BEGIN event called "name" immediately, with 0, 1 or 2
-// associated arguments. If the category is not enabled, then this
-// does nothing.
-// - category and name strings must have application lifetime (statics or
-//   literals). They may not include " chars.
-// - |id| is used to match the FLOW_BEGIN event with the FLOW_END event. FLOW
-//   events are considered to match if their category, name and id values all
-//   match. |id| must either be a pointer or an integer value up to 64 bits. If
-//   it's a pointer, the bits will be xored with a hash of the process ID so
-//   that the same pointer on two different processes will not collide.
-// FLOW events are different from ASYNC events in how they are drawn by the
-// tracing UI. A FLOW defines asynchronous data flow, such as posting a task
-// (FLOW_BEGIN) and later executing that task (FLOW_END). Expect FLOWs to be
-// drawn as lines or arrows from FLOW_BEGIN scopes to FLOW_END scopes. Similar
-// to ASYNC, a FLOW can consist of multiple phases. The first phase is defined
-// by the FLOW_BEGIN calls. Additional phases can be defined using the FLOW_STEP
-// macros. When the operation completes, call FLOW_END. An async operation can
-// span threads and processes, but all events in that operation must use the
-// same |name| and |id|. Each event can have its own args.
-#define TRACE_EVENT_FLOW_BEGIN0(category, name, id) \
-    INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_FLOW_BEGIN, \
-        category, name, id, TRACE_EVENT_FLAG_NONE)
-#define TRACE_EVENT_FLOW_BEGIN1(category, name, id, arg1_name, arg1_val) \
-    INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_FLOW_BEGIN, \
-        category, name, id, TRACE_EVENT_FLAG_NONE, arg1_name, arg1_val)
-#define TRACE_EVENT_FLOW_BEGIN2(category, name, id, arg1_name, arg1_val, \
-        arg2_name, arg2_val) \
-    INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_FLOW_BEGIN, \
-        category, name, id, TRACE_EVENT_FLAG_NONE, \
-        arg1_name, arg1_val, arg2_name, arg2_val)
-#define TRACE_EVENT_COPY_FLOW_BEGIN0(category, name, id) \
-    INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_FLOW_BEGIN, \
-        category, name, id, TRACE_EVENT_FLAG_COPY)
-#define TRACE_EVENT_COPY_FLOW_BEGIN1(category, name, id, arg1_name, arg1_val) \
-    INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_FLOW_BEGIN, \
-        category, name, id, TRACE_EVENT_FLAG_COPY, \
-        arg1_name, arg1_val)
-#define TRACE_EVENT_COPY_FLOW_BEGIN2(category, name, id, arg1_name, arg1_val, \
-        arg2_name, arg2_val) \
-    INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_FLOW_BEGIN, \
-        category, name, id, TRACE_EVENT_FLAG_COPY, \
-        arg1_name, arg1_val, arg2_name, arg2_val)
-
-// Records a single FLOW_STEP event for |step| immediately. If the category
-// is not enabled, then this does nothing. The |name| and |id| must match the
-// FLOW_BEGIN event above. The |step| param identifies this step within the
-// async event. This should be called at the beginning of the next phase of an
-// asynchronous operation.
-#define TRACE_EVENT_FLOW_STEP0(category, name, id, step) \
-    INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_FLOW_STEP, \
-        category, name, id, TRACE_EVENT_FLAG_NONE, "step", step)
-#define TRACE_EVENT_FLOW_STEP1(category, name, id, step, \
-        arg1_name, arg1_val) \
-    INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_FLOW_STEP, \
-        category, name, id, TRACE_EVENT_FLAG_NONE, "step", step, \
-        arg1_name, arg1_val)
-#define TRACE_EVENT_COPY_FLOW_STEP0(category, name, id, step) \
-    INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_FLOW_STEP, \
-        category, name, id, TRACE_EVENT_FLAG_COPY, "step", step)
-#define TRACE_EVENT_COPY_FLOW_STEP1(category, name, id, step, \
-        arg1_name, arg1_val) \
-    INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_FLOW_STEP, \
-        category, name, id, TRACE_EVENT_FLAG_COPY, "step", step, \
-        arg1_name, arg1_val)
-
-// Records a single FLOW_END event for "name" immediately. If the category
-// is not enabled, then this does nothing.
-#define TRACE_EVENT_FLOW_END0(category, name, id) \
-    INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_FLOW_END, \
-        category, name, id, TRACE_EVENT_FLAG_NONE)
-#define TRACE_EVENT_FLOW_END1(category, name, id, arg1_name, arg1_val) \
-    INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_FLOW_END, \
-        category, name, id, TRACE_EVENT_FLAG_NONE, arg1_name, arg1_val)
-#define TRACE_EVENT_FLOW_END2(category, name, id, arg1_name, arg1_val, \
-        arg2_name, arg2_val) \
-    INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_FLOW_END, \
-        category, name, id, TRACE_EVENT_FLAG_NONE, \
-        arg1_name, arg1_val, arg2_name, arg2_val)
-#define TRACE_EVENT_COPY_FLOW_END0(category, name, id) \
-    INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_FLOW_END, \
-        category, name, id, TRACE_EVENT_FLAG_COPY)
-#define TRACE_EVENT_COPY_FLOW_END1(category, name, id, arg1_name, arg1_val) \
-    INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_FLOW_END, \
-        category, name, id, TRACE_EVENT_FLAG_COPY, \
-        arg1_name, arg1_val)
-#define TRACE_EVENT_COPY_FLOW_END2(category, name, id, arg1_name, arg1_val, \
-        arg2_name, arg2_val) \
-    INTERNAL_TRACE_EVENT_ADD_WITH_ID(TRACE_EVENT_PHASE_FLOW_END, \
-        category, name, id, TRACE_EVENT_FLAG_COPY, \
-        arg1_name, arg1_val, arg2_name, arg2_val)
-
-
-////////////////////////////////////////////////////////////////////////////////
-// Implementation specific tracing API definitions.
-
-// Get a pointer to the enabled state of the given trace category. Only
-// long-lived literal strings should be given as the category name. The returned
-// pointer can be held permanently in a local static for example. If the
-// unsigned char is non-zero, tracing is enabled. If tracing is enabled,
-// TRACE_EVENT_API_ADD_TRACE_EVENT can be called. It's OK if tracing is disabled
-// between the load of the tracing state and the call to
-// TRACE_EVENT_API_ADD_TRACE_EVENT, because this flag only provides an early out
-// for best performance when tracing is disabled.
-// const unsigned char*
-//     TRACE_EVENT_API_GET_CATEGORY_ENABLED(const char* category_name)
-#define TRACE_EVENT_API_GET_CATEGORY_ENABLED \
-    webrtc::EventTracer::GetCategoryEnabled
-
-// Add a trace event to the platform tracing system.
-// void TRACE_EVENT_API_ADD_TRACE_EVENT(
-//                    char phase,
-//                    const unsigned char* category_enabled,
-//                    const char* name,
-//                    unsigned long long id,
-//                    int num_args,
-//                    const char** arg_names,
-//                    const unsigned char* arg_types,
-//                    const unsigned long long* arg_values,
-//                    unsigned char flags)
-#define TRACE_EVENT_API_ADD_TRACE_EVENT webrtc::EventTracer::AddTraceEvent
-
-////////////////////////////////////////////////////////////////////////////////
-
-// Implementation detail: trace event macros create temporary variables
-// to keep instrumentation overhead low. These macros give each temporary
-// variable a unique name based on the line number to prevent name collissions.
-#define INTERNAL_TRACE_EVENT_UID3(a,b) \
-    trace_event_unique_##a##b
-#define INTERNAL_TRACE_EVENT_UID2(a,b) \
-    INTERNAL_TRACE_EVENT_UID3(a,b)
-#define INTERNAL_TRACE_EVENT_UID(name_prefix) \
-    INTERNAL_TRACE_EVENT_UID2(name_prefix, __LINE__)
-
-#if WEBRTC_NON_STATIC_TRACE_EVENT_HANDLERS
-#define INTERNAL_TRACE_EVENT_INFO_TYPE const unsigned char*
-#else
-#define INTERNAL_TRACE_EVENT_INFO_TYPE static const unsigned char*
-#endif  // WEBRTC_NON_STATIC_TRACE_EVENT_HANDLERS
-
-// Implementation detail: internal macro to create static category.
-#define INTERNAL_TRACE_EVENT_GET_CATEGORY_INFO(category) \
-    INTERNAL_TRACE_EVENT_INFO_TYPE INTERNAL_TRACE_EVENT_UID(catstatic) = \
-        TRACE_EVENT_API_GET_CATEGORY_ENABLED(category);
-
-// Implementation detail: internal macro to create static category and add
-// event if the category is enabled.
-#define INTERNAL_TRACE_EVENT_ADD(phase, category, name, flags, ...) \
-    do { \
-      INTERNAL_TRACE_EVENT_GET_CATEGORY_INFO(category); \
-      if (*INTERNAL_TRACE_EVENT_UID(catstatic)) { \
-        webrtc::trace_event_internal::AddTraceEvent(          \
-            phase, INTERNAL_TRACE_EVENT_UID(catstatic), name, \
-            webrtc::trace_event_internal::kNoEventId, flags, ##__VA_ARGS__); \
-      } \
-    } while (0)
-
-// Implementation detail: internal macro to create static category and add begin
-// event if the category is enabled. Also adds the end event when the scope
-// ends.
-#define INTERNAL_TRACE_EVENT_ADD_SCOPED(category, name, ...) \
-    INTERNAL_TRACE_EVENT_GET_CATEGORY_INFO(category); \
-    webrtc::trace_event_internal::TraceEndOnScopeClose  \
-        INTERNAL_TRACE_EVENT_UID(profileScope); \
-    if (*INTERNAL_TRACE_EVENT_UID(catstatic)) { \
-      webrtc::trace_event_internal::AddTraceEvent(      \
-          TRACE_EVENT_PHASE_BEGIN, \
-          INTERNAL_TRACE_EVENT_UID(catstatic), \
-          name, webrtc::trace_event_internal::kNoEventId,       \
-          TRACE_EVENT_FLAG_NONE, ##__VA_ARGS__); \
-      INTERNAL_TRACE_EVENT_UID(profileScope).Initialize( \
-          INTERNAL_TRACE_EVENT_UID(catstatic), name); \
-    }
-
-// Implementation detail: internal macro to create static category and add
-// event if the category is enabled.
-#define INTERNAL_TRACE_EVENT_ADD_WITH_ID(phase, category, name, id, flags, \
-                                         ...) \
-    do { \
-      INTERNAL_TRACE_EVENT_GET_CATEGORY_INFO(category); \
-      if (*INTERNAL_TRACE_EVENT_UID(catstatic)) { \
-        unsigned char trace_event_flags = flags | TRACE_EVENT_FLAG_HAS_ID; \
-        webrtc::trace_event_internal::TraceID trace_event_trace_id( \
-            id, &trace_event_flags); \
-        webrtc::trace_event_internal::AddTraceEvent( \
-            phase, INTERNAL_TRACE_EVENT_UID(catstatic), \
-            name, trace_event_trace_id.data(), trace_event_flags, \
-            ##__VA_ARGS__); \
-      } \
-    } while (0)
-
-// Notes regarding the following definitions:
-// New values can be added and propagated to third party libraries, but existing
-// definitions must never be changed, because third party libraries may use old
-// definitions.
-
-// Phase indicates the nature of an event entry. E.g. part of a begin/end pair.
-#define TRACE_EVENT_PHASE_BEGIN    ('B')
-#define TRACE_EVENT_PHASE_END      ('E')
-#define TRACE_EVENT_PHASE_INSTANT  ('I')
-#define TRACE_EVENT_PHASE_ASYNC_BEGIN ('S')
-#define TRACE_EVENT_PHASE_ASYNC_STEP  ('T')
-#define TRACE_EVENT_PHASE_ASYNC_END   ('F')
-#define TRACE_EVENT_PHASE_FLOW_BEGIN ('s')
-#define TRACE_EVENT_PHASE_FLOW_STEP  ('t')
-#define TRACE_EVENT_PHASE_FLOW_END   ('f')
-#define TRACE_EVENT_PHASE_METADATA ('M')
-#define TRACE_EVENT_PHASE_COUNTER  ('C')
-
-// Flags for changing the behavior of TRACE_EVENT_API_ADD_TRACE_EVENT.
-#define TRACE_EVENT_FLAG_NONE        (static_cast<unsigned char>(0))
-#define TRACE_EVENT_FLAG_COPY        (static_cast<unsigned char>(1 << 0))
-#define TRACE_EVENT_FLAG_HAS_ID      (static_cast<unsigned char>(1 << 1))
-#define TRACE_EVENT_FLAG_MANGLE_ID   (static_cast<unsigned char>(1 << 2))
-
-// Type values for identifying types in the TraceValue union.
-#define TRACE_VALUE_TYPE_BOOL         (static_cast<unsigned char>(1))
-#define TRACE_VALUE_TYPE_UINT         (static_cast<unsigned char>(2))
-#define TRACE_VALUE_TYPE_INT          (static_cast<unsigned char>(3))
-#define TRACE_VALUE_TYPE_DOUBLE       (static_cast<unsigned char>(4))
-#define TRACE_VALUE_TYPE_POINTER      (static_cast<unsigned char>(5))
-#define TRACE_VALUE_TYPE_STRING       (static_cast<unsigned char>(6))
-#define TRACE_VALUE_TYPE_COPY_STRING  (static_cast<unsigned char>(7))
-
-namespace webrtc {
-namespace trace_event_internal {
-
-// Specify these values when the corresponding argument of AddTraceEvent is not
-// used.
-const int kZeroNumArgs = 0;
-const unsigned long long kNoEventId = 0;
-
-// TraceID encapsulates an ID that can either be an integer or pointer. Pointers
-// are mangled with the Process ID so that they are unlikely to collide when the
-// same pointer is used on different processes.
-class TraceID {
- public:
-  class ForceMangle {
-    public:
-     explicit ForceMangle(unsigned long long id) : data_(id) {}
-     explicit ForceMangle(unsigned long id) : data_(id) {}
-     explicit ForceMangle(unsigned int id) : data_(id) {}
-     explicit ForceMangle(unsigned short id) : data_(id) {}
-     explicit ForceMangle(unsigned char id) : data_(id) {}
-     explicit ForceMangle(long long id)
-         : data_(static_cast<unsigned long long>(id)) {}
-     explicit ForceMangle(long id)
-         : data_(static_cast<unsigned long long>(id)) {}
-     explicit ForceMangle(int id)
-         : data_(static_cast<unsigned long long>(id)) {}
-     explicit ForceMangle(short id)
-         : data_(static_cast<unsigned long long>(id)) {}
-     explicit ForceMangle(signed char id)
-         : data_(static_cast<unsigned long long>(id)) {}
-
-     unsigned long long data() const { return data_; }
-
-    private:
-     unsigned long long data_;
-  };
-
-  explicit TraceID(const void* id, unsigned char* flags)
-      : data_(static_cast<unsigned long long>(
-              reinterpret_cast<uintptr_t>(id))) {
-    *flags |= TRACE_EVENT_FLAG_MANGLE_ID;
-  }
-  explicit TraceID(ForceMangle id, unsigned char* flags) : data_(id.data()) {
-    *flags |= TRACE_EVENT_FLAG_MANGLE_ID;
-  }
-  explicit TraceID(unsigned long long id, unsigned char* flags)
-      : data_(id) { (void)flags; }
-  explicit TraceID(unsigned long id, unsigned char* flags)
-      : data_(id) { (void)flags; }
-  explicit TraceID(unsigned int id, unsigned char* flags)
-      : data_(id) { (void)flags; }
-  explicit TraceID(unsigned short id, unsigned char* flags)
-      : data_(id) { (void)flags; }
-  explicit TraceID(unsigned char id, unsigned char* flags)
-      : data_(id) { (void)flags; }
-  explicit TraceID(long long id, unsigned char* flags)
-      : data_(static_cast<unsigned long long>(id)) { (void)flags; }
-  explicit TraceID(long id, unsigned char* flags)
-      : data_(static_cast<unsigned long long>(id)) { (void)flags; }
-  explicit TraceID(int id, unsigned char* flags)
-      : data_(static_cast<unsigned long long>(id)) { (void)flags; }
-  explicit TraceID(short id, unsigned char* flags)
-      : data_(static_cast<unsigned long long>(id)) { (void)flags; }
-  explicit TraceID(signed char id, unsigned char* flags)
-      : data_(static_cast<unsigned long long>(id)) { (void)flags; }
-
-  unsigned long long data() const { return data_; }
-
- private:
-  unsigned long long data_;
-};
-
-// Simple union to store various types as unsigned long long.
-union TraceValueUnion {
-  bool as_bool;
-  unsigned long long as_uint;
-  long long as_int;
-  double as_double;
-  const void* as_pointer;
-  const char* as_string;
-};
-
-// Simple container for const char* that should be copied instead of retained.
-class TraceStringWithCopy {
- public:
-  explicit TraceStringWithCopy(const char* str) : str_(str) {}
-  operator const char* () const { return str_; }
- private:
-  const char* str_;
-};
-
-// Define SetTraceValue for each allowed type. It stores the type and
-// value in the return arguments. This allows this API to avoid declaring any
-// structures so that it is portable to third_party libraries.
-#define INTERNAL_DECLARE_SET_TRACE_VALUE(actual_type, \
-                                         union_member, \
-                                         value_type_id) \
-    static inline void SetTraceValue(actual_type arg, \
-                                     unsigned char* type, \
-                                     unsigned long long* value) { \
-      TraceValueUnion type_value; \
-      type_value.union_member = arg; \
-      *type = value_type_id; \
-      *value = type_value.as_uint; \
-    }
-// Simpler form for int types that can be safely casted.
-#define INTERNAL_DECLARE_SET_TRACE_VALUE_INT(actual_type, \
-                                             value_type_id) \
-    static inline void SetTraceValue(actual_type arg, \
-                                     unsigned char* type, \
-                                     unsigned long long* value) { \
-      *type = value_type_id; \
-      *value = static_cast<unsigned long long>(arg); \
-    }
-
-INTERNAL_DECLARE_SET_TRACE_VALUE_INT(unsigned long long, TRACE_VALUE_TYPE_UINT)
-INTERNAL_DECLARE_SET_TRACE_VALUE_INT(unsigned long, TRACE_VALUE_TYPE_UINT)
-INTERNAL_DECLARE_SET_TRACE_VALUE_INT(unsigned int, TRACE_VALUE_TYPE_UINT)
-INTERNAL_DECLARE_SET_TRACE_VALUE_INT(unsigned short, TRACE_VALUE_TYPE_UINT)
-INTERNAL_DECLARE_SET_TRACE_VALUE_INT(unsigned char, TRACE_VALUE_TYPE_UINT)
-INTERNAL_DECLARE_SET_TRACE_VALUE_INT(long long, TRACE_VALUE_TYPE_INT)
-INTERNAL_DECLARE_SET_TRACE_VALUE_INT(long, TRACE_VALUE_TYPE_INT)
-INTERNAL_DECLARE_SET_TRACE_VALUE_INT(int, TRACE_VALUE_TYPE_INT)
-INTERNAL_DECLARE_SET_TRACE_VALUE_INT(short, TRACE_VALUE_TYPE_INT)
-INTERNAL_DECLARE_SET_TRACE_VALUE_INT(signed char, TRACE_VALUE_TYPE_INT)
-INTERNAL_DECLARE_SET_TRACE_VALUE(bool, as_bool, TRACE_VALUE_TYPE_BOOL)
-INTERNAL_DECLARE_SET_TRACE_VALUE(double, as_double, TRACE_VALUE_TYPE_DOUBLE)
-INTERNAL_DECLARE_SET_TRACE_VALUE(const void*, as_pointer,
-                                 TRACE_VALUE_TYPE_POINTER)
-INTERNAL_DECLARE_SET_TRACE_VALUE(const char*, as_string,
-                                 TRACE_VALUE_TYPE_STRING)
-INTERNAL_DECLARE_SET_TRACE_VALUE(const TraceStringWithCopy&, as_string,
-                                 TRACE_VALUE_TYPE_COPY_STRING)
-
-#undef INTERNAL_DECLARE_SET_TRACE_VALUE
-#undef INTERNAL_DECLARE_SET_TRACE_VALUE_INT
-
-// std::string version of SetTraceValue so that trace arguments can be strings.
-static inline void SetTraceValue(const std::string& arg,
-                                 unsigned char* type,
-                                 unsigned long long* value) {
-  TraceValueUnion type_value;
-  type_value.as_string = arg.c_str();
-  *type = TRACE_VALUE_TYPE_COPY_STRING;
-  *value = type_value.as_uint;
-}
-
-// These AddTraceEvent template functions are defined here instead of in the
-// macro, because the arg_values could be temporary objects, such as
-// std::string. In order to store pointers to the internal c_str and pass
-// through to the tracing API, the arg_values must live throughout
-// these procedures.
-
-static inline void AddTraceEvent(char phase,
-                                const unsigned char* category_enabled,
-                                const char* name,
-                                unsigned long long id,
-                                unsigned char flags) {
-  TRACE_EVENT_API_ADD_TRACE_EVENT(phase, category_enabled, name, id,
-                                  kZeroNumArgs, nullptr, nullptr, nullptr,
-                                  flags);
-}
-
-template<class ARG1_TYPE>
-static inline void AddTraceEvent(char phase,
-                                const unsigned char* category_enabled,
-                                const char* name,
-                                unsigned long long id,
-                                unsigned char flags,
-                                const char* arg1_name,
-                                const ARG1_TYPE& arg1_val) {
-  const int num_args = 1;
-  unsigned char arg_types[1];
-  unsigned long long arg_values[1];
-  SetTraceValue(arg1_val, &arg_types[0], &arg_values[0]);
-  TRACE_EVENT_API_ADD_TRACE_EVENT(
-      phase, category_enabled, name, id,
-      num_args, &arg1_name, arg_types, arg_values,
-      flags);
-}
-
-template<class ARG1_TYPE, class ARG2_TYPE>
-static inline void AddTraceEvent(char phase,
-                                const unsigned char* category_enabled,
-                                const char* name,
-                                unsigned long long id,
-                                unsigned char flags,
-                                const char* arg1_name,
-                                const ARG1_TYPE& arg1_val,
-                                const char* arg2_name,
-                                const ARG2_TYPE& arg2_val) {
-  const int num_args = 2;
-  const char* arg_names[2] = { arg1_name, arg2_name };
-  unsigned char arg_types[2];
-  unsigned long long arg_values[2];
-  SetTraceValue(arg1_val, &arg_types[0], &arg_values[0]);
-  SetTraceValue(arg2_val, &arg_types[1], &arg_values[1]);
-  TRACE_EVENT_API_ADD_TRACE_EVENT(
-      phase, category_enabled, name, id,
-      num_args, arg_names, arg_types, arg_values,
-      flags);
-}
-
-// Used by TRACE_EVENTx macro. Do not use directly.
-class TraceEndOnScopeClose {
- public:
-  // Note: members of data_ intentionally left uninitialized. See Initialize.
-  TraceEndOnScopeClose() : p_data_(nullptr) {}
-  ~TraceEndOnScopeClose() {
-    if (p_data_)
-      AddEventIfEnabled();
-  }
-
-  void Initialize(const unsigned char* category_enabled,
-                  const char* name) {
-    data_.category_enabled = category_enabled;
-    data_.name = name;
-    p_data_ = &data_;
-  }
-
- private:
-  // Add the end event if the category is still enabled.
-  void AddEventIfEnabled() {
-    // Only called when p_data_ is non-null.
-    if (*p_data_->category_enabled) {
-      TRACE_EVENT_API_ADD_TRACE_EVENT(TRACE_EVENT_PHASE_END,
-                                      p_data_->category_enabled, p_data_->name,
-                                      kNoEventId, kZeroNumArgs, nullptr,
-                                      nullptr, nullptr, TRACE_EVENT_FLAG_NONE);
-    }
-  }
-
-  // This Data struct workaround is to avoid initializing all the members
-  // in Data during construction of this object, since this object is always
-  // constructed, even when tracing is disabled. If the members of Data were
-  // members of this class instead, compiler warnings occur about potential
-  // uninitialized accesses.
-  struct Data {
-    const unsigned char* category_enabled;
-    const char* name;
-  };
-  Data* p_data_;
-  Data data_;
-};
-
-}  // namespace trace_event_internal
-}  // namespace webrtc
-
-#endif  // WEBRTC_RTC_BASE_TRACE_EVENT_H_
diff --git a/rtc_base/transformadapter.cc b/rtc_base/transformadapter.cc
deleted file mode 100644
index 3243e6d..0000000
--- a/rtc_base/transformadapter.cc
+++ /dev/null
@@ -1,197 +0,0 @@
-/*
- *  Copyright 2004 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/rtc_base/transformadapter.h"
-
-#include <string.h>
-
-#include "webrtc/rtc_base/checks.h"
-
-namespace rtc {
-
-///////////////////////////////////////////////////////////////////////////////
-
-TransformAdapter::TransformAdapter(StreamInterface * stream,
-                                   TransformInterface * transform,
-                                   bool direction_read)
-    : StreamAdapterInterface(stream), transform_(transform),
-      direction_read_(direction_read), state_(ST_PROCESSING), len_(0) {
-}
-
-TransformAdapter::~TransformAdapter() {
-  TransformAdapter::Close();
-  delete transform_;
-}
-
-StreamResult
-TransformAdapter::Read(void * buffer, size_t buffer_len,
-                       size_t * read, int * error) {
-  if (!direction_read_)
-    return SR_EOS;
-
-  while (state_ != ST_ERROR) {
-    if (state_ == ST_COMPLETE)
-      return SR_EOS;
-
-    // Buffer more data
-    if ((state_ == ST_PROCESSING) && (len_ < sizeof(buffer_))) {
-      size_t subread;
-      StreamResult result = StreamAdapterInterface::Read(
-                              buffer_ + len_,
-                              sizeof(buffer_) - len_,
-                              &subread,
-                              &error_);
-      if (result == SR_BLOCK) {
-        return SR_BLOCK;
-      } else if (result == SR_ERROR) {
-        state_ = ST_ERROR;
-        break;
-      } else if (result == SR_EOS) {
-        state_ = ST_FLUSHING;
-      } else {
-        len_ += subread;
-      }
-    }
-
-    // Process buffered data
-    size_t in_len = len_;
-    size_t out_len = buffer_len;
-    StreamResult result = transform_->Transform(buffer_, &in_len,
-                                                buffer, &out_len,
-                                                (state_ == ST_FLUSHING));
-    RTC_DCHECK(result != SR_BLOCK);
-    if (result == SR_EOS) {
-      // Note: Don't signal SR_EOS this iteration, unless out_len is zero
-      state_ = ST_COMPLETE;
-    } else if (result == SR_ERROR) {
-      state_ = ST_ERROR;
-      error_ = -1; // TODO: propagate error
-      break;
-    } else if ((out_len == 0) && (state_ == ST_FLUSHING)) {
-      // If there is no output AND no more input, then something is wrong
-      state_ = ST_ERROR;
-      error_ = -1; // TODO: better error code?
-      break;
-    }
-
-    len_ -= in_len;
-    if (len_ > 0)
-      memmove(buffer_, buffer_ + in_len, len_);
-
-    if (out_len == 0)
-      continue;
-
-    if (read)
-      *read = out_len;
-    return SR_SUCCESS;
-  }
-
-  if (error)
-    *error = error_;
-  return SR_ERROR;
-}
-
-StreamResult
-TransformAdapter::Write(const void * data, size_t data_len,
-                        size_t * written, int * error) {
-  if (direction_read_)
-    return SR_EOS;
-
-  size_t bytes_written = 0;
-  while (state_ != ST_ERROR) {
-    if (state_ == ST_COMPLETE)
-      return SR_EOS;
-
-    if (len_ < sizeof(buffer_)) {
-      // Process buffered data
-      size_t in_len = data_len;
-      size_t out_len = sizeof(buffer_) - len_;
-      StreamResult result = transform_->Transform(data, &in_len,
-                                                  buffer_ + len_, &out_len,
-                                                  (state_ == ST_FLUSHING));
-
-      RTC_DCHECK(result != SR_BLOCK);
-      if (result == SR_EOS) {
-        // Note: Don't signal SR_EOS this iteration, unless no data written
-        state_ = ST_COMPLETE;
-      } else if (result == SR_ERROR) {
-        RTC_NOTREACHED();  // When this happens, think about what should be done
-        state_ = ST_ERROR;
-        error_ = -1; // TODO: propagate error
-        break;
-      }
-
-      len_ = out_len;
-      bytes_written = in_len;
-    }
-
-    size_t pos = 0;
-    while (pos < len_) {
-      size_t subwritten;
-      StreamResult result = StreamAdapterInterface::Write(buffer_ + pos,
-                                                          len_ - pos,
-                                                          &subwritten,
-                                                          &error_);
-      if (result == SR_BLOCK) {
-        RTC_NOTREACHED();  // We should handle this
-        return SR_BLOCK;
-      } else if (result == SR_ERROR) {
-        state_ = ST_ERROR;
-        break;
-      } else if (result == SR_EOS) {
-        state_ = ST_COMPLETE;
-        break;
-      }
-
-      pos += subwritten;
-    }
-
-    len_ -= pos;
-    if (len_ > 0)
-      memmove(buffer_, buffer_ + pos, len_);
-
-    if (bytes_written == 0)
-      continue;
-
-    if (written)
-      *written = bytes_written;
-    return SR_SUCCESS;
-  }
-
-  if (error)
-    *error = error_;
-  return SR_ERROR;
-}
-
-void
-TransformAdapter::Close() {
-  if (!direction_read_ && (state_ == ST_PROCESSING)) {
-    state_ = ST_FLUSHING;
-    do {
-      Write(0, 0, nullptr, nullptr);
-    } while (state_ == ST_FLUSHING);
-  }
-  state_ = ST_COMPLETE;
-  StreamAdapterInterface::Close();
-}
-
-bool TransformAdapter::GetAvailable(size_t* size) const {
-  return false;
-}
-
-bool TransformAdapter::ReserveSize(size_t size) {
-  return true;
-}
-
-bool TransformAdapter::Rewind() {
-  return false;
-}
-
-} // namespace rtc
diff --git a/rtc_base/transformadapter.h b/rtc_base/transformadapter.h
deleted file mode 100644
index 21e11ed..0000000
--- a/rtc_base/transformadapter.h
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- *  Copyright 2004 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_RTC_BASE_TRANSFORMADAPTER_H_
-#define WEBRTC_RTC_BASE_TRANSFORMADAPTER_H_
-
-#include "webrtc/rtc_base/stream.h"
-
-namespace rtc {
-///////////////////////////////////////////////////////////////////////////////
-
-class TransformInterface {
-public:
-  virtual ~TransformInterface() { }
-
-  // Transform should convert the in_len bytes of input into the out_len-sized
-  // output buffer.  If flush is true, there will be no more data following
-  // input.
-  // After the transformation, in_len contains the number of bytes consumed, and
-  // out_len contains the number of bytes ready in output.
-  // Note: Transform should not return SR_BLOCK, as there is no asynchronous
-  // notification available.
-  virtual StreamResult Transform(const void * input, size_t * in_len,
-                                 void * output, size_t * out_len,
-                                 bool flush) = 0;
-};
-
-///////////////////////////////////////////////////////////////////////////////
-
-// TransformAdapter causes all data passed through to be transformed by the
-// supplied TransformInterface object, which may apply compression, encryption,
-// etc.
-
-class TransformAdapter : public StreamAdapterInterface {
-public:
-  // Note that the transformation is unidirectional, in the direction specified
-  // by the constructor.  Operations in the opposite direction result in SR_EOS.
-  TransformAdapter(StreamInterface * stream,
-                   TransformInterface * transform,
-                   bool direction_read);
-  ~TransformAdapter() override;
-
-  StreamResult Read(void* buffer,
-                    size_t buffer_len,
-                    size_t* read,
-                    int* error) override;
-  StreamResult Write(const void* data,
-                     size_t data_len,
-                     size_t* written,
-                     int* error) override;
-  void Close() override;
-
-  // Apriori, we can't tell what the transformation does to the stream length.
-  bool GetAvailable(size_t* size) const override;
-  bool ReserveSize(size_t size) override;
-
-  // Transformations might not be restartable
-  virtual bool Rewind();
-
-private:
-  enum State { ST_PROCESSING, ST_FLUSHING, ST_COMPLETE, ST_ERROR };
-  enum { BUFFER_SIZE = 1024 };
-
-  TransformInterface * transform_;
-  bool direction_read_;
-  State state_;
-  int error_;
-
-  char buffer_[BUFFER_SIZE];
-  size_t len_;
-};
-
-///////////////////////////////////////////////////////////////////////////////
-
-} // namespace rtc
-
-#endif // WEBRTC_RTC_BASE_TRANSFORMADAPTER_H_
diff --git a/rtc_base/type_traits.h b/rtc_base/type_traits.h
deleted file mode 100644
index 5ecbc07..0000000
--- a/rtc_base/type_traits.h
+++ /dev/null
@@ -1,140 +0,0 @@
-/*
- *  Copyright 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_RTC_BASE_TYPE_TRAITS_H_
-#define WEBRTC_RTC_BASE_TYPE_TRAITS_H_
-
-#include <cstddef>
-#include <type_traits>
-
-namespace rtc {
-
-// Determines if the given class has zero-argument .data() and .size() methods
-// whose return values are convertible to T* and size_t, respectively.
-template <typename DS, typename T>
-class HasDataAndSize {
- private:
-  template <
-      typename C,
-      typename std::enable_if<
-          std::is_convertible<decltype(std::declval<C>().data()), T*>::value &&
-          std::is_convertible<decltype(std::declval<C>().size()),
-                              std::size_t>::value>::type* = nullptr>
-  static int Test(int);
-
-  template <typename>
-  static char Test(...);
-
- public:
-  static constexpr bool value = std::is_same<decltype(Test<DS>(0)), int>::value;
-};
-
-namespace test_has_data_and_size {
-
-template <typename DR, typename SR>
-struct Test1 {
-  DR data();
-  SR size();
-};
-static_assert(HasDataAndSize<Test1<int*, int>, int>::value, "");
-static_assert(HasDataAndSize<Test1<int*, int>, const int>::value, "");
-static_assert(HasDataAndSize<Test1<const int*, int>, const int>::value, "");
-static_assert(!HasDataAndSize<Test1<const int*, int>, int>::value,
-              "implicit cast of const int* to int*");
-static_assert(!HasDataAndSize<Test1<char*, size_t>, int>::value,
-              "implicit cast of char* to int*");
-
-struct Test2 {
-  int* data;
-  size_t size;
-};
-static_assert(!HasDataAndSize<Test2, int>::value,
-              ".data and .size aren't functions");
-
-struct Test3 {
-  int* data();
-};
-static_assert(!HasDataAndSize<Test3, int>::value, ".size() is missing");
-
-class Test4 {
-  int* data();
-  size_t size();
-};
-static_assert(!HasDataAndSize<Test4, int>::value,
-              ".data() and .size() are private");
-
-}  // namespace test_has_data_and_size
-
-namespace type_traits_impl {
-
-// Determines if the given type is an enum that converts implicitly to
-// an integral type.
-template <typename T>
-struct IsIntEnum {
- private:
-  // This overload is used if the type is an enum, and unary plus
-  // compiles and turns it into an integral type.
-  template <typename X,
-            typename std::enable_if<
-                std::is_enum<X>::value &&
-                std::is_integral<decltype(+std::declval<X>())>::value>::type* =
-                nullptr>
-  static int Test(int);
-
-  // Otherwise, this overload is used.
-  template <typename>
-  static char Test(...);
-
- public:
-  static constexpr bool value =
-      std::is_same<decltype(Test<typename std::remove_reference<T>::type>(0)),
-                   int>::value;
-};
-
-}  // namespace type_traits_impl
-
-// Determines if the given type is integral, or an enum that
-// converts implicitly to an integral type.
-template <typename T>
-struct IsIntlike {
- private:
-  using X = typename std::remove_reference<T>::type;
-
- public:
-  static constexpr bool value =
-      std::is_integral<X>::value || type_traits_impl::IsIntEnum<X>::value;
-};
-
-namespace test_enum_intlike {
-
-enum E1 { e1 };
-enum { e2 };
-enum class E3 { e3 };
-struct S {};
-
-static_assert(type_traits_impl::IsIntEnum<E1>::value, "");
-static_assert(type_traits_impl::IsIntEnum<decltype(e2)>::value, "");
-static_assert(!type_traits_impl::IsIntEnum<E3>::value, "");
-static_assert(!type_traits_impl::IsIntEnum<int>::value, "");
-static_assert(!type_traits_impl::IsIntEnum<float>::value, "");
-static_assert(!type_traits_impl::IsIntEnum<S>::value, "");
-
-static_assert(IsIntlike<E1>::value, "");
-static_assert(IsIntlike<decltype(e2)>::value, "");
-static_assert(!IsIntlike<E3>::value, "");
-static_assert(IsIntlike<int>::value, "");
-static_assert(!IsIntlike<float>::value, "");
-static_assert(!IsIntlike<S>::value, "");
-
-}  // test_enum_intlike
-
-}  // namespace rtc
-
-#endif  // WEBRTC_RTC_BASE_TYPE_TRAITS_H_
diff --git a/rtc_base/unittest_main.cc b/rtc_base/unittest_main.cc
deleted file mode 100644
index b7738c6..0000000
--- a/rtc_base/unittest_main.cc
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- *  Copyright 2007 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.
- */
-//
-// A reuseable entry point for gunit tests.
-
-#if defined(WEBRTC_WIN)
-#include <crtdbg.h>
-#endif
-
-#include "webrtc/rtc_base/fileutils.h"
-#include "webrtc/rtc_base/flags.h"
-#include "webrtc/rtc_base/gunit.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/ssladapter.h"
-#include "webrtc/rtc_base/sslstreamadapter.h"
-#include "webrtc/test/field_trial.h"
-#include "webrtc/test/testsupport/fileutils.h"
-
-#if defined(WEBRTC_IOS)
-#include "webrtc/test/ios/test_support.h"
-#endif
-
-DEFINE_bool(help, false, "prints this message");
-DEFINE_string(log, "", "logging options to use");
-DEFINE_string(
-    force_fieldtrials,
-    "",
-    "Field trials control experimental feature code which can be forced. "
-    "E.g. running with --force_fieldtrials=WebRTC-FooFeature/Enable/"
-    " will assign the group Enable to field trial WebRTC-FooFeature.");
-#if defined(WEBRTC_WIN)
-DEFINE_int(crt_break_alloc, -1, "memory allocation to break on");
-DEFINE_bool(default_error_handlers, false,
-            "leave the default exception/dbg handler functions in place");
-
-void TestInvalidParameterHandler(const wchar_t* expression,
-                                 const wchar_t* function,
-                                 const wchar_t* file,
-                                 unsigned int line,
-                                 uintptr_t pReserved) {
-  LOG(LS_ERROR) << "InvalidParameter Handler called.  Exiting.";
-  LOG(LS_ERROR) << expression << std::endl << function << std::endl << file
-                << std::endl << line;
-  exit(1);
-}
-void TestPureCallHandler() {
-  LOG(LS_ERROR) << "Purecall Handler called.  Exiting.";
-  exit(1);
-}
-int TestCrtReportHandler(int report_type, char* msg, int* retval) {
-    LOG(LS_ERROR) << "CrtReport Handler called...";
-    LOG(LS_ERROR) << msg;
-  if (report_type == _CRT_ASSERT) {
-    exit(1);
-  } else {
-    *retval = 0;
-    return TRUE;
-  }
-}
-#endif  // WEBRTC_WIN
-
-int main(int argc, char** argv) {
-  testing::InitGoogleTest(&argc, argv);
-  rtc::FlagList::SetFlagsFromCommandLine(&argc, argv, false);
-  if (FLAG_help) {
-    rtc::FlagList::Print(nullptr, false);
-    return 0;
-  }
-
-  webrtc::test::SetExecutablePath(argv[0]);
-  webrtc::test::InitFieldTrialsFromString(FLAG_force_fieldtrials);
-
-#if defined(WEBRTC_WIN)
-  if (!FLAG_default_error_handlers) {
-    // Make sure any errors don't throw dialogs hanging the test run.
-    _set_invalid_parameter_handler(TestInvalidParameterHandler);
-    _set_purecall_handler(TestPureCallHandler);
-    _CrtSetReportHook2(_CRT_RPTHOOK_INSTALL, TestCrtReportHandler);
-  }
-
-#if !defined(NDEBUG)  // Turn on memory leak checking on Windows.
-  _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF |_CRTDBG_LEAK_CHECK_DF);
-  if (FLAG_crt_break_alloc >= 0) {
-    _crtBreakAlloc = FLAG_crt_break_alloc;
-  }
-#endif
-#endif  // WEBRTC_WIN
-
-  // By default, log timestamps. Allow overrides by used of a --log flag.
-  rtc::LogMessage::LogTimestamps();
-  if (*FLAG_log != '\0') {
-    rtc::LogMessage::ConfigureLogging(FLAG_log);
-  } else if (rtc::LogMessage::GetLogToDebug() > rtc::LS_INFO) {
-    // Default to LS_INFO, even for release builds to provide better test
-    // logging.
-    rtc::LogMessage::LogToDebug(rtc::LS_INFO);
-  }
-
-  // Initialize SSL which are used by several tests.
-  rtc::InitializeSSL();
-  rtc::SSLStreamAdapter::enable_time_callback_for_testing();
-
-#if defined(WEBRTC_IOS)
-  rtc::test::InitTestSuite(RUN_ALL_TESTS, argc, argv);
-  rtc::test::RunTestsFromIOSApp();
-#endif
-  const int res = RUN_ALL_TESTS();
-
-  rtc::CleanupSSL();
-
-  // clean up logging so we don't appear to leak memory.
-  rtc::LogMessage::ConfigureLogging("");
-
-#if defined(WEBRTC_WIN)
-  // Unhook crt function so that we don't ever log after statics have been
-  // uninitialized.
-  if (!FLAG_default_error_handlers)
-    _CrtSetReportHook2(_CRT_RPTHOOK_REMOVE, TestCrtReportHandler);
-#endif
-
-  return res;
-}
diff --git a/rtc_base/unixfilesystem.cc b/rtc_base/unixfilesystem.cc
deleted file mode 100644
index 898fdd6..0000000
--- a/rtc_base/unixfilesystem.cc
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- *  Copyright 2004 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/rtc_base/unixfilesystem.h"
-
-#include <errno.h>
-#include <fcntl.h>
-#include <stdlib.h>
-#include <sys/stat.h>
-#include <unistd.h>
-
-#if defined(WEBRTC_MAC) && !defined(WEBRTC_IOS)
-#include <CoreServices/CoreServices.h>
-#include <IOKit/IOCFBundle.h>
-#include <sys/statvfs.h>
-#include "webrtc/rtc_base/macutils.h"
-#endif  // WEBRTC_MAC && !defined(WEBRTC_IOS)
-
-#if defined(WEBRTC_POSIX) && !defined(WEBRTC_MAC) || defined(WEBRTC_IOS)
-#include <sys/types.h>
-#if defined(WEBRTC_ANDROID)
-#include <sys/statfs.h>
-#elif !defined(__native_client__)
-#include <sys/statvfs.h>
-#endif  //  !defined(__native_client__)
-#include <limits.h>
-#include <pwd.h>
-#include <stdio.h>
-#endif  // WEBRTC_POSIX && !WEBRTC_MAC || WEBRTC_IOS
-
-#if defined(WEBRTC_LINUX) && !defined(WEBRTC_ANDROID)
-#include <ctype.h>
-#include <algorithm>
-#endif
-
-#if defined(__native_client__) && !defined(__GLIBC__)
-#include <sys/syslimits.h>
-#endif
-
-#include "webrtc/rtc_base/arraysize.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/fileutils.h"
-#include "webrtc/rtc_base/pathutils.h"
-#include "webrtc/rtc_base/stream.h"
-#include "webrtc/rtc_base/stringutils.h"
-
-namespace rtc {
-
-UnixFilesystem::UnixFilesystem() {}
-
-UnixFilesystem::~UnixFilesystem() {}
-
-bool UnixFilesystem::DeleteFile(const Pathname &filename) {
-  LOG(LS_INFO) << "Deleting file:" << filename.pathname();
-
-  if (!IsFile(filename)) {
-    RTC_DCHECK(IsFile(filename));
-    return false;
-  }
-  return ::unlink(filename.pathname().c_str()) == 0;
-}
-
-std::string UnixFilesystem::TempFilename(const Pathname &dir,
-                                         const std::string &prefix) {
-  int len = dir.pathname().size() + prefix.size() + 2 + 6;
-  char *tempname = new char[len];
-
-  snprintf(tempname, len, "%s/%sXXXXXX", dir.pathname().c_str(),
-           prefix.c_str());
-  int fd = ::mkstemp(tempname);
-  if (fd != -1)
-    ::close(fd);
-  std::string ret(tempname);
-  delete[] tempname;
-
-  return ret;
-}
-
-bool UnixFilesystem::MoveFile(const Pathname &old_path,
-                              const Pathname &new_path) {
-  if (!IsFile(old_path)) {
-    RTC_DCHECK(IsFile(old_path));
-    return false;
-  }
-  LOG(LS_VERBOSE) << "Moving " << old_path.pathname()
-                  << " to " << new_path.pathname();
-  if (rename(old_path.pathname().c_str(), new_path.pathname().c_str()) != 0) {
-    return false;
-  }
-  return true;
-}
-
-bool UnixFilesystem::IsFolder(const Pathname &path) {
-  struct stat st;
-  if (stat(path.pathname().c_str(), &st) < 0)
-    return false;
-  return S_ISDIR(st.st_mode);
-}
-
-bool UnixFilesystem::IsFile(const Pathname& pathname) {
-  struct stat st;
-  int res = ::stat(pathname.pathname().c_str(), &st);
-  // Treat symlinks, named pipes, etc. all as files.
-  return res == 0 && !S_ISDIR(st.st_mode);
-}
-
-bool UnixFilesystem::GetFileSize(const Pathname& pathname, size_t *size) {
-  struct stat st;
-  if (::stat(pathname.pathname().c_str(), &st) != 0)
-    return false;
-  *size = st.st_size;
-  return true;
-}
-
-char* UnixFilesystem::CopyString(const std::string& str) {
-  size_t size = str.length() + 1;
-
-  char* buf = new char[size];
-  if (!buf) {
-    return nullptr;
-  }
-
-  strcpyn(buf, size, str.c_str());
-  return buf;
-}
-
-}  // namespace rtc
-
-#if defined(__native_client__)
-extern "C" int __attribute__((weak))
-link(const char* oldpath, const char* newpath) {
-  errno = EACCES;
-  return -1;
-}
-#endif
diff --git a/rtc_base/unixfilesystem.h b/rtc_base/unixfilesystem.h
deleted file mode 100644
index 116df21..0000000
--- a/rtc_base/unixfilesystem.h
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- *  Copyright 2004 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_RTC_BASE_UNIXFILESYSTEM_H_
-#define WEBRTC_RTC_BASE_UNIXFILESYSTEM_H_
-
-#include <sys/types.h>
-
-#include "webrtc/rtc_base/fileutils.h"
-
-namespace rtc {
-
-class UnixFilesystem : public FilesystemInterface {
- public:
-  UnixFilesystem();
-  ~UnixFilesystem() override;
-
-  // This will attempt to delete the file located at filename.
-  // It will fail with VERIY if you pass it a non-existant file, or a directory.
-  bool DeleteFile(const Pathname& filename) override;
-
-  // This moves a file from old_path to new_path, where "file" can be a plain
-  // file or directory, which will be moved recursively.
-  // Returns true if function succeeds.
-  bool MoveFile(const Pathname& old_path, const Pathname& new_path) override;
-
-  // Returns true if a pathname is a directory
-  bool IsFolder(const Pathname& pathname) override;
-
-  // Returns true of pathname represents an existing file
-  bool IsFile(const Pathname& pathname) override;
-
-  std::string TempFilename(const Pathname& dir,
-                           const std::string& prefix) override;
-
-  bool GetFileSize(const Pathname& path, size_t* size) override;
-
- private:
-#if defined(WEBRTC_ANDROID) || defined(WEBRTC_MAC)
-  static char* provided_app_data_folder_;
-  static char* provided_app_temp_folder_;
-#else
-  static char* app_temp_path_;
-#endif
-
-  static char* CopyString(const std::string& str);
-};
-
-}  // namespace rtc
-
-#endif  // WEBRTC_RTC_BASE_UNIXFILESYSTEM_H_
diff --git a/rtc_base/virtualsocket_unittest.cc b/rtc_base/virtualsocket_unittest.cc
deleted file mode 100644
index b58bdd8..0000000
--- a/rtc_base/virtualsocket_unittest.cc
+++ /dev/null
@@ -1,1146 +0,0 @@
-/*
- *  Copyright 2006 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 <math.h>
-#include <time.h>
-#if defined(WEBRTC_POSIX)
-#include <netinet/in.h>
-#endif
-
-#include <memory>
-
-#include "webrtc/rtc_base/arraysize.h"
-#include "webrtc/rtc_base/fakeclock.h"
-#include "webrtc/rtc_base/gunit.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/ptr_util.h"
-#include "webrtc/rtc_base/testclient.h"
-#include "webrtc/rtc_base/testutils.h"
-#include "webrtc/rtc_base/thread.h"
-#include "webrtc/rtc_base/timeutils.h"
-#include "webrtc/rtc_base/virtualsocketserver.h"
-
-using namespace rtc;
-
-using webrtc::testing::SSE_CLOSE;
-using webrtc::testing::SSE_ERROR;
-using webrtc::testing::SSE_OPEN;
-using webrtc::testing::SSE_READ;
-using webrtc::testing::SSE_WRITE;
-using webrtc::testing::StreamSink;
-
-// Sends at a constant rate but with random packet sizes.
-struct Sender : public MessageHandler {
-  Sender(Thread* th, AsyncSocket* s, uint32_t rt)
-      : thread(th),
-        socket(MakeUnique<AsyncUDPSocket>(s)),
-        done(false),
-        rate(rt),
-        count(0) {
-    last_send = rtc::TimeMillis();
-    thread->PostDelayed(RTC_FROM_HERE, NextDelay(), this, 1);
-  }
-
-  uint32_t NextDelay() {
-    uint32_t size = (rand() % 4096) + 1;
-    return 1000 * size / rate;
-  }
-
-  void OnMessage(Message* pmsg) {
-    ASSERT_EQ(1u, pmsg->message_id);
-
-    if (done)
-      return;
-
-    int64_t cur_time = rtc::TimeMillis();
-    int64_t delay = cur_time - last_send;
-    uint32_t size = static_cast<uint32_t>(rate * delay / 1000);
-    size = std::min<uint32_t>(size, 4096);
-    size = std::max<uint32_t>(size, sizeof(uint32_t));
-
-    count += size;
-    memcpy(dummy, &cur_time, sizeof(cur_time));
-    socket->Send(dummy, size, options);
-
-    last_send = cur_time;
-    thread->PostDelayed(RTC_FROM_HERE, NextDelay(), this, 1);
-  }
-
-  Thread* thread;
-  std::unique_ptr<AsyncUDPSocket> socket;
-  rtc::PacketOptions options;
-  bool done;
-  uint32_t rate;  // bytes per second
-  uint32_t count;
-  int64_t last_send;
-  char dummy[4096];
-};
-
-struct Receiver : public MessageHandler, public sigslot::has_slots<> {
-  Receiver(Thread* th, AsyncSocket* s, uint32_t bw)
-      : thread(th),
-        socket(MakeUnique<AsyncUDPSocket>(s)),
-        bandwidth(bw),
-        done(false),
-        count(0),
-        sec_count(0),
-        sum(0),
-        sum_sq(0),
-        samples(0) {
-    socket->SignalReadPacket.connect(this, &Receiver::OnReadPacket);
-    thread->PostDelayed(RTC_FROM_HERE, 1000, this, 1);
-  }
-
-  ~Receiver() {
-    thread->Clear(this);
-  }
-
-  void OnReadPacket(AsyncPacketSocket* s, const char* data, size_t size,
-                    const SocketAddress& remote_addr,
-                    const PacketTime& packet_time) {
-    ASSERT_EQ(socket.get(), s);
-    ASSERT_GE(size, 4U);
-
-    count += size;
-    sec_count += size;
-
-    uint32_t send_time = *reinterpret_cast<const uint32_t*>(data);
-    uint32_t recv_time = rtc::TimeMillis();
-    uint32_t delay = recv_time - send_time;
-    sum += delay;
-    sum_sq += delay * delay;
-    samples += 1;
-  }
-
-  void OnMessage(Message* pmsg) {
-    ASSERT_EQ(1u, pmsg->message_id);
-
-    if (done)
-      return;
-
-    // It is always possible for us to receive more than expected because
-    // packets can be further delayed in delivery.
-    if (bandwidth > 0)
-      ASSERT_TRUE(sec_count <= 5 * bandwidth / 4);
-    sec_count = 0;
-    thread->PostDelayed(RTC_FROM_HERE, 1000, this, 1);
-  }
-
-  Thread* thread;
-  std::unique_ptr<AsyncUDPSocket> socket;
-  uint32_t bandwidth;
-  bool done;
-  size_t count;
-  size_t sec_count;
-  double sum;
-  double sum_sq;
-  uint32_t samples;
-};
-
-// Note: This test uses a fake clock in addition to a virtual network.
-class VirtualSocketServerTest : public testing::Test {
- public:
-  VirtualSocketServerTest()
-      : ss_(&fake_clock_),
-        thread_(&ss_),
-        kIPv4AnyAddress(IPAddress(INADDR_ANY), 0),
-        kIPv6AnyAddress(IPAddress(in6addr_any), 0) {}
-
-  void CheckPortIncrementalization(const SocketAddress& post,
-                                   const SocketAddress& pre) {
-    EXPECT_EQ(post.port(), pre.port() + 1);
-    IPAddress post_ip = post.ipaddr();
-    IPAddress pre_ip = pre.ipaddr();
-    EXPECT_EQ(pre_ip.family(), post_ip.family());
-    if (post_ip.family() == AF_INET) {
-      in_addr pre_ipv4 = pre_ip.ipv4_address();
-      in_addr post_ipv4 = post_ip.ipv4_address();
-      EXPECT_EQ(post_ipv4.s_addr, pre_ipv4.s_addr);
-    } else if (post_ip.family() == AF_INET6) {
-      in6_addr post_ip6 = post_ip.ipv6_address();
-      in6_addr pre_ip6 = pre_ip.ipv6_address();
-      uint32_t* post_as_ints = reinterpret_cast<uint32_t*>(&post_ip6.s6_addr);
-      uint32_t* pre_as_ints = reinterpret_cast<uint32_t*>(&pre_ip6.s6_addr);
-      EXPECT_EQ(post_as_ints[3], pre_as_ints[3]);
-    }
-  }
-
-  // Test a client can bind to the any address, and all sent packets will have
-  // the default route as the source address. Also, it can receive packets sent
-  // to the default route.
-  void TestDefaultRoute(const IPAddress& default_route) {
-    ss_.SetDefaultRoute(default_route);
-
-    // Create client1 bound to the any address.
-    AsyncSocket* socket =
-        ss_.CreateAsyncSocket(default_route.family(), SOCK_DGRAM);
-    socket->Bind(EmptySocketAddressWithFamily(default_route.family()));
-    SocketAddress client1_any_addr = socket->GetLocalAddress();
-    EXPECT_TRUE(client1_any_addr.IsAnyIP());
-    auto client1 = MakeUnique<TestClient>(MakeUnique<AsyncUDPSocket>(socket),
-                                          &fake_clock_);
-
-    // Create client2 bound to the default route.
-    AsyncSocket* socket2 =
-        ss_.CreateAsyncSocket(default_route.family(), SOCK_DGRAM);
-    socket2->Bind(SocketAddress(default_route, 0));
-    SocketAddress client2_addr = socket2->GetLocalAddress();
-    EXPECT_FALSE(client2_addr.IsAnyIP());
-    auto client2 = MakeUnique<TestClient>(MakeUnique<AsyncUDPSocket>(socket2),
-                                          &fake_clock_);
-
-    // Client1 sends to client2, client2 should see the default route as
-    // client1's address.
-    SocketAddress client1_addr;
-    EXPECT_EQ(6, client1->SendTo("bizbaz", 6, client2_addr));
-    EXPECT_TRUE(client2->CheckNextPacket("bizbaz", 6, &client1_addr));
-    EXPECT_EQ(client1_addr,
-              SocketAddress(default_route, client1_any_addr.port()));
-
-    // Client2 can send back to client1's default route address.
-    EXPECT_EQ(3, client2->SendTo("foo", 3, client1_addr));
-    EXPECT_TRUE(client1->CheckNextPacket("foo", 3, &client2_addr));
-  }
-
-  void BasicTest(const SocketAddress& initial_addr) {
-    AsyncSocket* socket =
-        ss_.CreateAsyncSocket(initial_addr.family(), SOCK_DGRAM);
-    socket->Bind(initial_addr);
-    SocketAddress server_addr = socket->GetLocalAddress();
-    // Make sure VSS didn't switch families on us.
-    EXPECT_EQ(server_addr.family(), initial_addr.family());
-
-    auto client1 = MakeUnique<TestClient>(MakeUnique<AsyncUDPSocket>(socket),
-                                          &fake_clock_);
-    AsyncSocket* socket2 =
-        ss_.CreateAsyncSocket(initial_addr.family(), SOCK_DGRAM);
-    auto client2 = MakeUnique<TestClient>(MakeUnique<AsyncUDPSocket>(socket2),
-                                          &fake_clock_);
-
-    SocketAddress client2_addr;
-    EXPECT_EQ(3, client2->SendTo("foo", 3, server_addr));
-    EXPECT_TRUE(client1->CheckNextPacket("foo", 3, &client2_addr));
-
-    SocketAddress client1_addr;
-    EXPECT_EQ(6, client1->SendTo("bizbaz", 6, client2_addr));
-    EXPECT_TRUE(client2->CheckNextPacket("bizbaz", 6, &client1_addr));
-    EXPECT_EQ(client1_addr, server_addr);
-
-    SocketAddress empty = EmptySocketAddressWithFamily(initial_addr.family());
-    for (int i = 0; i < 10; i++) {
-      client2 = MakeUnique<TestClient>(
-          WrapUnique(AsyncUDPSocket::Create(&ss_, empty)), &fake_clock_);
-
-      SocketAddress next_client2_addr;
-      EXPECT_EQ(3, client2->SendTo("foo", 3, server_addr));
-      EXPECT_TRUE(client1->CheckNextPacket("foo", 3, &next_client2_addr));
-      CheckPortIncrementalization(next_client2_addr, client2_addr);
-      // EXPECT_EQ(next_client2_addr.port(), client2_addr.port() + 1);
-
-      SocketAddress server_addr2;
-      EXPECT_EQ(6, client1->SendTo("bizbaz", 6, next_client2_addr));
-      EXPECT_TRUE(client2->CheckNextPacket("bizbaz", 6, &server_addr2));
-      EXPECT_EQ(server_addr2, server_addr);
-
-      client2_addr = next_client2_addr;
-    }
-  }
-
-  // initial_addr should be made from either INADDR_ANY or in6addr_any.
-  void ConnectTest(const SocketAddress& initial_addr) {
-    StreamSink sink;
-    SocketAddress accept_addr;
-    const SocketAddress kEmptyAddr =
-        EmptySocketAddressWithFamily(initial_addr.family());
-
-    // Create client
-    std::unique_ptr<AsyncSocket> client =
-        WrapUnique(ss_.CreateAsyncSocket(initial_addr.family(), SOCK_STREAM));
-    sink.Monitor(client.get());
-    EXPECT_EQ(client->GetState(), AsyncSocket::CS_CLOSED);
-    EXPECT_TRUE(client->GetLocalAddress().IsNil());
-
-    // Create server
-    std::unique_ptr<AsyncSocket> server =
-        WrapUnique(ss_.CreateAsyncSocket(initial_addr.family(), SOCK_STREAM));
-    sink.Monitor(server.get());
-    EXPECT_NE(0, server->Listen(5));  // Bind required
-    EXPECT_EQ(0, server->Bind(initial_addr));
-    EXPECT_EQ(server->GetLocalAddress().family(), initial_addr.family());
-    EXPECT_EQ(0, server->Listen(5));
-    EXPECT_EQ(server->GetState(), AsyncSocket::CS_CONNECTING);
-
-    // No pending server connections
-    EXPECT_FALSE(sink.Check(server.get(), SSE_READ));
-    EXPECT_TRUE(nullptr == server->Accept(&accept_addr));
-    EXPECT_EQ(AF_UNSPEC, accept_addr.family());
-
-    // Attempt connect to listening socket
-    EXPECT_EQ(0, client->Connect(server->GetLocalAddress()));
-    EXPECT_NE(client->GetLocalAddress(), kEmptyAddr);  // Implicit Bind
-    EXPECT_NE(AF_UNSPEC, client->GetLocalAddress().family());  // Implicit Bind
-    EXPECT_NE(client->GetLocalAddress(), server->GetLocalAddress());
-
-    // Client is connecting
-    EXPECT_EQ(client->GetState(), AsyncSocket::CS_CONNECTING);
-    EXPECT_FALSE(sink.Check(client.get(), SSE_OPEN));
-    EXPECT_FALSE(sink.Check(client.get(), SSE_CLOSE));
-
-    ss_.ProcessMessagesUntilIdle();
-
-    // Client still connecting
-    EXPECT_EQ(client->GetState(), AsyncSocket::CS_CONNECTING);
-    EXPECT_FALSE(sink.Check(client.get(), SSE_OPEN));
-    EXPECT_FALSE(sink.Check(client.get(), SSE_CLOSE));
-
-    // Server has pending connection
-    EXPECT_TRUE(sink.Check(server.get(), SSE_READ));
-    std::unique_ptr<Socket> accepted = WrapUnique(server->Accept(&accept_addr));
-    EXPECT_TRUE(nullptr != accepted);
-    EXPECT_NE(accept_addr, kEmptyAddr);
-    EXPECT_EQ(accepted->GetRemoteAddress(), accept_addr);
-
-    EXPECT_EQ(accepted->GetState(), AsyncSocket::CS_CONNECTED);
-    EXPECT_EQ(accepted->GetLocalAddress(), server->GetLocalAddress());
-    EXPECT_EQ(accepted->GetRemoteAddress(), client->GetLocalAddress());
-
-    ss_.ProcessMessagesUntilIdle();
-
-    // Client has connected
-    EXPECT_EQ(client->GetState(), AsyncSocket::CS_CONNECTED);
-    EXPECT_TRUE(sink.Check(client.get(), SSE_OPEN));
-    EXPECT_FALSE(sink.Check(client.get(), SSE_CLOSE));
-    EXPECT_EQ(client->GetRemoteAddress(), server->GetLocalAddress());
-    EXPECT_EQ(client->GetRemoteAddress(), accepted->GetLocalAddress());
-  }
-
-  void ConnectToNonListenerTest(const SocketAddress& initial_addr) {
-    StreamSink sink;
-    SocketAddress accept_addr;
-    const SocketAddress nil_addr;
-    const SocketAddress empty_addr =
-        EmptySocketAddressWithFamily(initial_addr.family());
-
-    // Create client
-    std::unique_ptr<AsyncSocket> client =
-        WrapUnique(ss_.CreateAsyncSocket(initial_addr.family(), SOCK_STREAM));
-    sink.Monitor(client.get());
-
-    // Create server
-    std::unique_ptr<AsyncSocket> server =
-        WrapUnique(ss_.CreateAsyncSocket(initial_addr.family(), SOCK_STREAM));
-    sink.Monitor(server.get());
-    EXPECT_EQ(0, server->Bind(initial_addr));
-    EXPECT_EQ(server->GetLocalAddress().family(), initial_addr.family());
-    // Attempt connect to non-listening socket
-    EXPECT_EQ(0, client->Connect(server->GetLocalAddress()));
-
-    ss_.ProcessMessagesUntilIdle();
-
-    // No pending server connections
-    EXPECT_FALSE(sink.Check(server.get(), SSE_READ));
-    EXPECT_TRUE(nullptr == server->Accept(&accept_addr));
-    EXPECT_EQ(accept_addr, nil_addr);
-
-    // Connection failed
-    EXPECT_EQ(client->GetState(), AsyncSocket::CS_CLOSED);
-    EXPECT_FALSE(sink.Check(client.get(), SSE_OPEN));
-    EXPECT_TRUE(sink.Check(client.get(), SSE_ERROR));
-    EXPECT_EQ(client->GetRemoteAddress(), nil_addr);
-  }
-
-  void CloseDuringConnectTest(const SocketAddress& initial_addr) {
-    StreamSink sink;
-    SocketAddress accept_addr;
-    const SocketAddress empty_addr =
-        EmptySocketAddressWithFamily(initial_addr.family());
-
-    // Create client and server
-    std::unique_ptr<AsyncSocket> client(
-        ss_.CreateAsyncSocket(initial_addr.family(), SOCK_STREAM));
-    sink.Monitor(client.get());
-    std::unique_ptr<AsyncSocket> server(
-        ss_.CreateAsyncSocket(initial_addr.family(), SOCK_STREAM));
-    sink.Monitor(server.get());
-
-    // Initiate connect
-    EXPECT_EQ(0, server->Bind(initial_addr));
-    EXPECT_EQ(server->GetLocalAddress().family(), initial_addr.family());
-
-    EXPECT_EQ(0, server->Listen(5));
-    EXPECT_EQ(0, client->Connect(server->GetLocalAddress()));
-
-    // Server close before socket enters accept queue
-    EXPECT_FALSE(sink.Check(server.get(), SSE_READ));
-    server->Close();
-
-    ss_.ProcessMessagesUntilIdle();
-
-    // Result: connection failed
-    EXPECT_EQ(client->GetState(), AsyncSocket::CS_CLOSED);
-    EXPECT_TRUE(sink.Check(client.get(), SSE_ERROR));
-
-    server.reset(ss_.CreateAsyncSocket(initial_addr.family(), SOCK_STREAM));
-    sink.Monitor(server.get());
-
-    // Initiate connect
-    EXPECT_EQ(0, server->Bind(initial_addr));
-    EXPECT_EQ(server->GetLocalAddress().family(), initial_addr.family());
-
-    EXPECT_EQ(0, server->Listen(5));
-    EXPECT_EQ(0, client->Connect(server->GetLocalAddress()));
-
-    ss_.ProcessMessagesUntilIdle();
-
-    // Server close while socket is in accept queue
-    EXPECT_TRUE(sink.Check(server.get(), SSE_READ));
-    server->Close();
-
-    ss_.ProcessMessagesUntilIdle();
-
-    // Result: connection failed
-    EXPECT_EQ(client->GetState(), AsyncSocket::CS_CLOSED);
-    EXPECT_TRUE(sink.Check(client.get(), SSE_ERROR));
-
-    // New server
-    server.reset(ss_.CreateAsyncSocket(initial_addr.family(), SOCK_STREAM));
-    sink.Monitor(server.get());
-
-    // Initiate connect
-    EXPECT_EQ(0, server->Bind(initial_addr));
-    EXPECT_EQ(server->GetLocalAddress().family(), initial_addr.family());
-
-    EXPECT_EQ(0, server->Listen(5));
-    EXPECT_EQ(0, client->Connect(server->GetLocalAddress()));
-
-    ss_.ProcessMessagesUntilIdle();
-
-    // Server accepts connection
-    EXPECT_TRUE(sink.Check(server.get(), SSE_READ));
-    std::unique_ptr<AsyncSocket> accepted(server->Accept(&accept_addr));
-    ASSERT_TRUE(nullptr != accepted.get());
-    sink.Monitor(accepted.get());
-
-    // Client closes before connection complets
-    EXPECT_EQ(accepted->GetState(), AsyncSocket::CS_CONNECTED);
-
-    // Connected message has not been processed yet.
-    EXPECT_EQ(client->GetState(), AsyncSocket::CS_CONNECTING);
-    client->Close();
-
-    ss_.ProcessMessagesUntilIdle();
-
-    // Result: accepted socket closes
-    EXPECT_EQ(accepted->GetState(), AsyncSocket::CS_CLOSED);
-    EXPECT_TRUE(sink.Check(accepted.get(), SSE_CLOSE));
-    EXPECT_FALSE(sink.Check(client.get(), SSE_CLOSE));
-  }
-
-  void CloseTest(const SocketAddress& initial_addr) {
-    StreamSink sink;
-    const SocketAddress kEmptyAddr;
-
-    // Create clients
-    std::unique_ptr<AsyncSocket> a =
-        WrapUnique(ss_.CreateAsyncSocket(initial_addr.family(), SOCK_STREAM));
-    sink.Monitor(a.get());
-    a->Bind(initial_addr);
-    EXPECT_EQ(a->GetLocalAddress().family(), initial_addr.family());
-
-    std::unique_ptr<AsyncSocket> b =
-        WrapUnique(ss_.CreateAsyncSocket(initial_addr.family(), SOCK_STREAM));
-    sink.Monitor(b.get());
-    b->Bind(initial_addr);
-    EXPECT_EQ(b->GetLocalAddress().family(), initial_addr.family());
-
-    EXPECT_EQ(0, a->Connect(b->GetLocalAddress()));
-    EXPECT_EQ(0, b->Connect(a->GetLocalAddress()));
-
-    ss_.ProcessMessagesUntilIdle();
-
-    EXPECT_TRUE(sink.Check(a.get(), SSE_OPEN));
-    EXPECT_EQ(a->GetState(), AsyncSocket::CS_CONNECTED);
-    EXPECT_EQ(a->GetRemoteAddress(), b->GetLocalAddress());
-
-    EXPECT_TRUE(sink.Check(b.get(), SSE_OPEN));
-    EXPECT_EQ(b->GetState(), AsyncSocket::CS_CONNECTED);
-    EXPECT_EQ(b->GetRemoteAddress(), a->GetLocalAddress());
-
-    EXPECT_EQ(1, a->Send("a", 1));
-    b->Close();
-    EXPECT_EQ(1, a->Send("b", 1));
-
-    ss_.ProcessMessagesUntilIdle();
-
-    char buffer[10];
-    EXPECT_FALSE(sink.Check(b.get(), SSE_READ));
-    EXPECT_EQ(-1, b->Recv(buffer, 10, nullptr));
-
-    EXPECT_TRUE(sink.Check(a.get(), SSE_CLOSE));
-    EXPECT_EQ(a->GetState(), AsyncSocket::CS_CLOSED);
-    EXPECT_EQ(a->GetRemoteAddress(), kEmptyAddr);
-
-    // No signal for Closer
-    EXPECT_FALSE(sink.Check(b.get(), SSE_CLOSE));
-    EXPECT_EQ(b->GetState(), AsyncSocket::CS_CLOSED);
-    EXPECT_EQ(b->GetRemoteAddress(), kEmptyAddr);
-  }
-
-  void TcpSendTest(const SocketAddress& initial_addr) {
-    StreamSink sink;
-    const SocketAddress kEmptyAddr;
-
-    // Connect two sockets
-    std::unique_ptr<AsyncSocket> a =
-        WrapUnique(ss_.CreateAsyncSocket(initial_addr.family(), SOCK_STREAM));
-    sink.Monitor(a.get());
-    a->Bind(initial_addr);
-    EXPECT_EQ(a->GetLocalAddress().family(), initial_addr.family());
-
-    std::unique_ptr<AsyncSocket> b =
-        WrapUnique(ss_.CreateAsyncSocket(initial_addr.family(), SOCK_STREAM));
-    sink.Monitor(b.get());
-    b->Bind(initial_addr);
-    EXPECT_EQ(b->GetLocalAddress().family(), initial_addr.family());
-
-    EXPECT_EQ(0, a->Connect(b->GetLocalAddress()));
-    EXPECT_EQ(0, b->Connect(a->GetLocalAddress()));
-
-    ss_.ProcessMessagesUntilIdle();
-
-    const size_t kBufferSize = 2000;
-    ss_.set_send_buffer_capacity(kBufferSize);
-    ss_.set_recv_buffer_capacity(kBufferSize);
-
-    const size_t kDataSize = 5000;
-    char send_buffer[kDataSize], recv_buffer[kDataSize];
-    for (size_t i = 0; i < kDataSize; ++i)
-      send_buffer[i] = static_cast<char>(i % 256);
-    memset(recv_buffer, 0, sizeof(recv_buffer));
-    size_t send_pos = 0, recv_pos = 0;
-
-    // Can't send more than send buffer in one write
-    int result = a->Send(send_buffer + send_pos, kDataSize - send_pos);
-    EXPECT_EQ(static_cast<int>(kBufferSize), result);
-    send_pos += result;
-
-    ss_.ProcessMessagesUntilIdle();
-    EXPECT_FALSE(sink.Check(a.get(), SSE_WRITE));
-    EXPECT_TRUE(sink.Check(b.get(), SSE_READ));
-
-    // Receive buffer is already filled, fill send buffer again
-    result = a->Send(send_buffer + send_pos, kDataSize - send_pos);
-    EXPECT_EQ(static_cast<int>(kBufferSize), result);
-    send_pos += result;
-
-    ss_.ProcessMessagesUntilIdle();
-    EXPECT_FALSE(sink.Check(a.get(), SSE_WRITE));
-    EXPECT_FALSE(sink.Check(b.get(), SSE_READ));
-
-    // No more room in send or receive buffer
-    result = a->Send(send_buffer + send_pos, kDataSize - send_pos);
-    EXPECT_EQ(-1, result);
-    EXPECT_TRUE(a->IsBlocking());
-
-    // Read a subset of the data
-    result = b->Recv(recv_buffer + recv_pos, 500, nullptr);
-    EXPECT_EQ(500, result);
-    recv_pos += result;
-
-    ss_.ProcessMessagesUntilIdle();
-    EXPECT_TRUE(sink.Check(a.get(), SSE_WRITE));
-    EXPECT_TRUE(sink.Check(b.get(), SSE_READ));
-
-    // Room for more on the sending side
-    result = a->Send(send_buffer + send_pos, kDataSize - send_pos);
-    EXPECT_EQ(500, result);
-    send_pos += result;
-
-    // Empty the recv buffer
-    while (true) {
-      result = b->Recv(recv_buffer + recv_pos, kDataSize - recv_pos, nullptr);
-      if (result < 0) {
-        EXPECT_EQ(-1, result);
-        EXPECT_TRUE(b->IsBlocking());
-        break;
-      }
-      recv_pos += result;
-    }
-
-    ss_.ProcessMessagesUntilIdle();
-    EXPECT_TRUE(sink.Check(b.get(), SSE_READ));
-
-    // Continue to empty the recv buffer
-    while (true) {
-      result = b->Recv(recv_buffer + recv_pos, kDataSize - recv_pos, nullptr);
-      if (result < 0) {
-        EXPECT_EQ(-1, result);
-        EXPECT_TRUE(b->IsBlocking());
-        break;
-      }
-      recv_pos += result;
-    }
-
-    // Send last of the data
-    result = a->Send(send_buffer + send_pos, kDataSize - send_pos);
-    EXPECT_EQ(500, result);
-    send_pos += result;
-
-    ss_.ProcessMessagesUntilIdle();
-    EXPECT_TRUE(sink.Check(b.get(), SSE_READ));
-
-    // Receive the last of the data
-    while (true) {
-      result = b->Recv(recv_buffer + recv_pos, kDataSize - recv_pos, nullptr);
-      if (result < 0) {
-        EXPECT_EQ(-1, result);
-        EXPECT_TRUE(b->IsBlocking());
-        break;
-      }
-      recv_pos += result;
-    }
-
-    ss_.ProcessMessagesUntilIdle();
-    EXPECT_FALSE(sink.Check(b.get(), SSE_READ));
-
-    // The received data matches the sent data
-    EXPECT_EQ(kDataSize, send_pos);
-    EXPECT_EQ(kDataSize, recv_pos);
-    EXPECT_EQ(0, memcmp(recv_buffer, send_buffer, kDataSize));
-  }
-
-  void TcpSendsPacketsInOrderTest(const SocketAddress& initial_addr) {
-    const SocketAddress kEmptyAddr;
-
-    // Connect two sockets
-    std::unique_ptr<AsyncSocket> a =
-        WrapUnique(ss_.CreateAsyncSocket(initial_addr.family(), SOCK_STREAM));
-    std::unique_ptr<AsyncSocket> b =
-        WrapUnique(ss_.CreateAsyncSocket(initial_addr.family(), SOCK_STREAM));
-    a->Bind(initial_addr);
-    EXPECT_EQ(a->GetLocalAddress().family(), initial_addr.family());
-
-    b->Bind(initial_addr);
-    EXPECT_EQ(b->GetLocalAddress().family(), initial_addr.family());
-
-    EXPECT_EQ(0, a->Connect(b->GetLocalAddress()));
-    EXPECT_EQ(0, b->Connect(a->GetLocalAddress()));
-    ss_.ProcessMessagesUntilIdle();
-
-    // First, deliver all packets in 0 ms.
-    char buffer[2] = { 0, 0 };
-    const char cNumPackets = 10;
-    for (char i = 0; i < cNumPackets; ++i) {
-      buffer[0] = '0' + i;
-      EXPECT_EQ(1, a->Send(buffer, 1));
-    }
-
-    ss_.ProcessMessagesUntilIdle();
-
-    for (char i = 0; i < cNumPackets; ++i) {
-      EXPECT_EQ(1, b->Recv(buffer, sizeof(buffer), nullptr));
-      EXPECT_EQ(static_cast<char>('0' + i), buffer[0]);
-    }
-
-    // Next, deliver packets at random intervals
-    const uint32_t mean = 50;
-    const uint32_t stddev = 50;
-
-    ss_.set_delay_mean(mean);
-    ss_.set_delay_stddev(stddev);
-    ss_.UpdateDelayDistribution();
-
-    for (char i = 0; i < cNumPackets; ++i) {
-      buffer[0] = 'A' + i;
-      EXPECT_EQ(1, a->Send(buffer, 1));
-    }
-
-    ss_.ProcessMessagesUntilIdle();
-
-    for (char i = 0; i < cNumPackets; ++i) {
-      EXPECT_EQ(1, b->Recv(buffer, sizeof(buffer), nullptr));
-      EXPECT_EQ(static_cast<char>('A' + i), buffer[0]);
-    }
-  }
-
-  // It is important that initial_addr's port has to be 0 such that the
-  // incremental port behavior could ensure the 2 Binds result in different
-  // address.
-  void BandwidthTest(const SocketAddress& initial_addr) {
-    AsyncSocket* send_socket =
-        ss_.CreateAsyncSocket(initial_addr.family(), SOCK_DGRAM);
-    AsyncSocket* recv_socket =
-        ss_.CreateAsyncSocket(initial_addr.family(), SOCK_DGRAM);
-    ASSERT_EQ(0, send_socket->Bind(initial_addr));
-    ASSERT_EQ(0, recv_socket->Bind(initial_addr));
-    EXPECT_EQ(send_socket->GetLocalAddress().family(), initial_addr.family());
-    EXPECT_EQ(recv_socket->GetLocalAddress().family(), initial_addr.family());
-    ASSERT_EQ(0, send_socket->Connect(recv_socket->GetLocalAddress()));
-
-    uint32_t bandwidth = 64 * 1024;
-    ss_.set_bandwidth(bandwidth);
-
-    Thread* pthMain = Thread::Current();
-    Sender sender(pthMain, send_socket, 80 * 1024);
-    Receiver receiver(pthMain, recv_socket, bandwidth);
-
-    // Allow the sender to run for 5 (simulated) seconds, then be stopped for 5
-    // seconds.
-    SIMULATED_WAIT(false, 5000, fake_clock_);
-    sender.done = true;
-    SIMULATED_WAIT(false, 5000, fake_clock_);
-
-    // Ensure the observed bandwidth fell within a reasonable margin of error.
-    EXPECT_TRUE(receiver.count >= 5 * 3 * bandwidth / 4);
-    EXPECT_TRUE(receiver.count <= 6 * bandwidth);  // queue could drain for 1s
-
-    ss_.set_bandwidth(0);
-  }
-
-  // It is important that initial_addr's port has to be 0 such that the
-  // incremental port behavior could ensure the 2 Binds result in different
-  // address.
-  void DelayTest(const SocketAddress& initial_addr) {
-    time_t seed = ::time(nullptr);
-    LOG(LS_VERBOSE) << "seed = " << seed;
-    srand(static_cast<unsigned int>(seed));
-
-    const uint32_t mean = 2000;
-    const uint32_t stddev = 500;
-
-    ss_.set_delay_mean(mean);
-    ss_.set_delay_stddev(stddev);
-    ss_.UpdateDelayDistribution();
-
-    AsyncSocket* send_socket =
-        ss_.CreateAsyncSocket(initial_addr.family(), SOCK_DGRAM);
-    AsyncSocket* recv_socket =
-        ss_.CreateAsyncSocket(initial_addr.family(), SOCK_DGRAM);
-    ASSERT_EQ(0, send_socket->Bind(initial_addr));
-    ASSERT_EQ(0, recv_socket->Bind(initial_addr));
-    EXPECT_EQ(send_socket->GetLocalAddress().family(), initial_addr.family());
-    EXPECT_EQ(recv_socket->GetLocalAddress().family(), initial_addr.family());
-    ASSERT_EQ(0, send_socket->Connect(recv_socket->GetLocalAddress()));
-
-    Thread* pthMain = Thread::Current();
-    // Avg packet size is 2K, so at 200KB/s for 10s, we should see about
-    // 1000 packets, which is necessary to get a good distribution.
-    Sender sender(pthMain, send_socket, 100 * 2 * 1024);
-    Receiver receiver(pthMain, recv_socket, 0);
-
-    // Simulate 10 seconds of packets being sent, then check the observed delay
-    // distribution.
-    SIMULATED_WAIT(false, 10000, fake_clock_);
-    sender.done = receiver.done = true;
-    ss_.ProcessMessagesUntilIdle();
-
-    const double sample_mean = receiver.sum / receiver.samples;
-    double num =
-        receiver.samples * receiver.sum_sq - receiver.sum * receiver.sum;
-    double den = receiver.samples * (receiver.samples - 1);
-    const double sample_stddev = sqrt(num / den);
-    LOG(LS_VERBOSE) << "mean=" << sample_mean << " stddev=" << sample_stddev;
-
-    EXPECT_LE(500u, receiver.samples);
-    // We initially used a 0.1 fudge factor, but on the build machine, we
-    // have seen the value differ by as much as 0.13.
-    EXPECT_NEAR(mean, sample_mean, 0.15 * mean);
-    EXPECT_NEAR(stddev, sample_stddev, 0.15 * stddev);
-
-    ss_.set_delay_mean(0);
-    ss_.set_delay_stddev(0);
-    ss_.UpdateDelayDistribution();
-  }
-
-  // Test cross-family communication between a client bound to client_addr and a
-  // server bound to server_addr. shouldSucceed indicates if communication is
-  // expected to work or not.
-  void CrossFamilyConnectionTest(const SocketAddress& client_addr,
-                                 const SocketAddress& server_addr,
-                                 bool shouldSucceed) {
-    StreamSink sink;
-    SocketAddress accept_address;
-    const SocketAddress kEmptyAddr;
-
-    // Client gets a IPv4 address
-    std::unique_ptr<AsyncSocket> client =
-        WrapUnique(ss_.CreateAsyncSocket(client_addr.family(), SOCK_STREAM));
-    sink.Monitor(client.get());
-    EXPECT_EQ(client->GetState(), AsyncSocket::CS_CLOSED);
-    EXPECT_EQ(client->GetLocalAddress(), kEmptyAddr);
-    client->Bind(client_addr);
-
-    // Server gets a non-mapped non-any IPv6 address.
-    // IPv4 sockets should not be able to connect to this.
-    std::unique_ptr<AsyncSocket> server =
-        WrapUnique(ss_.CreateAsyncSocket(server_addr.family(), SOCK_STREAM));
-    sink.Monitor(server.get());
-    server->Bind(server_addr);
-    server->Listen(5);
-
-    if (shouldSucceed) {
-      EXPECT_EQ(0, client->Connect(server->GetLocalAddress()));
-      ss_.ProcessMessagesUntilIdle();
-      EXPECT_TRUE(sink.Check(server.get(), SSE_READ));
-      std::unique_ptr<Socket> accepted =
-          WrapUnique(server->Accept(&accept_address));
-      EXPECT_TRUE(nullptr != accepted);
-      EXPECT_NE(kEmptyAddr, accept_address);
-      ss_.ProcessMessagesUntilIdle();
-      EXPECT_TRUE(sink.Check(client.get(), SSE_OPEN));
-      EXPECT_EQ(client->GetRemoteAddress(), server->GetLocalAddress());
-    } else {
-      // Check that the connection failed.
-      EXPECT_EQ(-1, client->Connect(server->GetLocalAddress()));
-      ss_.ProcessMessagesUntilIdle();
-
-      EXPECT_FALSE(sink.Check(server.get(), SSE_READ));
-      EXPECT_TRUE(nullptr == server->Accept(&accept_address));
-      EXPECT_EQ(accept_address, kEmptyAddr);
-      EXPECT_EQ(client->GetState(), AsyncSocket::CS_CLOSED);
-      EXPECT_FALSE(sink.Check(client.get(), SSE_OPEN));
-      EXPECT_EQ(client->GetRemoteAddress(), kEmptyAddr);
-    }
-  }
-
-  // Test cross-family datagram sending between a client bound to client_addr
-  // and a server bound to server_addr. shouldSucceed indicates if sending is
-  // expected to succeed or not.
-  void CrossFamilyDatagramTest(const SocketAddress& client_addr,
-                               const SocketAddress& server_addr,
-                               bool shouldSucceed) {
-    AsyncSocket* socket = ss_.CreateAsyncSocket(SOCK_DGRAM);
-    socket->Bind(server_addr);
-    SocketAddress bound_server_addr = socket->GetLocalAddress();
-    auto client1 = MakeUnique<TestClient>(MakeUnique<AsyncUDPSocket>(socket),
-                                          &fake_clock_);
-
-    AsyncSocket* socket2 = ss_.CreateAsyncSocket(SOCK_DGRAM);
-    socket2->Bind(client_addr);
-    auto client2 = MakeUnique<TestClient>(MakeUnique<AsyncUDPSocket>(socket2),
-                                          &fake_clock_);
-    SocketAddress client2_addr;
-
-    if (shouldSucceed) {
-      EXPECT_EQ(3, client2->SendTo("foo", 3, bound_server_addr));
-      EXPECT_TRUE(client1->CheckNextPacket("foo", 3, &client2_addr));
-      SocketAddress client1_addr;
-      EXPECT_EQ(6, client1->SendTo("bizbaz", 6, client2_addr));
-      EXPECT_TRUE(client2->CheckNextPacket("bizbaz", 6, &client1_addr));
-      EXPECT_EQ(client1_addr, bound_server_addr);
-    } else {
-      EXPECT_EQ(-1, client2->SendTo("foo", 3, bound_server_addr));
-      EXPECT_TRUE(client1->CheckNoPacket());
-    }
-  }
-
- protected:
-  rtc::ScopedFakeClock fake_clock_;
-  VirtualSocketServer ss_;
-  AutoSocketServerThread thread_;
-  const SocketAddress kIPv4AnyAddress;
-  const SocketAddress kIPv6AnyAddress;
-};
-
-TEST_F(VirtualSocketServerTest, basic_v4) {
-  SocketAddress ipv4_test_addr(IPAddress(INADDR_ANY), 5000);
-  BasicTest(ipv4_test_addr);
-}
-
-TEST_F(VirtualSocketServerTest, basic_v6) {
-  SocketAddress ipv6_test_addr(IPAddress(in6addr_any), 5000);
-  BasicTest(ipv6_test_addr);
-}
-
-TEST_F(VirtualSocketServerTest, TestDefaultRoute_v4) {
-  IPAddress ipv4_default_addr(0x01020304);
-  TestDefaultRoute(ipv4_default_addr);
-}
-
-TEST_F(VirtualSocketServerTest, TestDefaultRoute_v6) {
-  IPAddress ipv6_default_addr;
-  EXPECT_TRUE(
-      IPFromString("2401:fa00:4:1000:be30:5bff:fee5:c3", &ipv6_default_addr));
-  TestDefaultRoute(ipv6_default_addr);
-}
-
-TEST_F(VirtualSocketServerTest, connect_v4) {
-  ConnectTest(kIPv4AnyAddress);
-}
-
-TEST_F(VirtualSocketServerTest, connect_v6) {
-  ConnectTest(kIPv6AnyAddress);
-}
-
-TEST_F(VirtualSocketServerTest, connect_to_non_listener_v4) {
-  ConnectToNonListenerTest(kIPv4AnyAddress);
-}
-
-TEST_F(VirtualSocketServerTest, connect_to_non_listener_v6) {
-  ConnectToNonListenerTest(kIPv6AnyAddress);
-}
-
-TEST_F(VirtualSocketServerTest, close_during_connect_v4) {
-  CloseDuringConnectTest(kIPv4AnyAddress);
-}
-
-TEST_F(VirtualSocketServerTest, close_during_connect_v6) {
-  CloseDuringConnectTest(kIPv6AnyAddress);
-}
-
-TEST_F(VirtualSocketServerTest, close_v4) {
-  CloseTest(kIPv4AnyAddress);
-}
-
-TEST_F(VirtualSocketServerTest, close_v6) {
-  CloseTest(kIPv6AnyAddress);
-}
-
-TEST_F(VirtualSocketServerTest, tcp_send_v4) {
-  TcpSendTest(kIPv4AnyAddress);
-}
-
-TEST_F(VirtualSocketServerTest, tcp_send_v6) {
-  TcpSendTest(kIPv6AnyAddress);
-}
-
-TEST_F(VirtualSocketServerTest, TcpSendsPacketsInOrder_v4) {
-  TcpSendsPacketsInOrderTest(kIPv4AnyAddress);
-}
-
-TEST_F(VirtualSocketServerTest, TcpSendsPacketsInOrder_v6) {
-  TcpSendsPacketsInOrderTest(kIPv6AnyAddress);
-}
-
-TEST_F(VirtualSocketServerTest, bandwidth_v4) {
-  BandwidthTest(kIPv4AnyAddress);
-}
-
-TEST_F(VirtualSocketServerTest, bandwidth_v6) {
-  BandwidthTest(kIPv6AnyAddress);
-}
-
-TEST_F(VirtualSocketServerTest, delay_v4) {
-  DelayTest(kIPv4AnyAddress);
-}
-
-TEST_F(VirtualSocketServerTest, delay_v6) {
-  DelayTest(kIPv6AnyAddress);
-}
-
-// Works, receiving socket sees 127.0.0.2.
-TEST_F(VirtualSocketServerTest, CanConnectFromMappedIPv6ToIPv4Any) {
-  CrossFamilyConnectionTest(SocketAddress("::ffff:127.0.0.2", 0),
-                            SocketAddress("0.0.0.0", 5000),
-                            true);
-}
-
-// Fails.
-TEST_F(VirtualSocketServerTest, CantConnectFromUnMappedIPv6ToIPv4Any) {
-  CrossFamilyConnectionTest(SocketAddress("::2", 0),
-                            SocketAddress("0.0.0.0", 5000),
-                            false);
-}
-
-// Fails.
-TEST_F(VirtualSocketServerTest, CantConnectFromUnMappedIPv6ToMappedIPv6) {
-  CrossFamilyConnectionTest(SocketAddress("::2", 0),
-                            SocketAddress("::ffff:127.0.0.1", 5000),
-                            false);
-}
-
-// Works. receiving socket sees ::ffff:127.0.0.2.
-TEST_F(VirtualSocketServerTest, CanConnectFromIPv4ToIPv6Any) {
-  CrossFamilyConnectionTest(SocketAddress("127.0.0.2", 0),
-                            SocketAddress("::", 5000),
-                            true);
-}
-
-// Fails.
-TEST_F(VirtualSocketServerTest, CantConnectFromIPv4ToUnMappedIPv6) {
-  CrossFamilyConnectionTest(SocketAddress("127.0.0.2", 0),
-                            SocketAddress("::1", 5000),
-                            false);
-}
-
-// Works. Receiving socket sees ::ffff:127.0.0.1.
-TEST_F(VirtualSocketServerTest, CanConnectFromIPv4ToMappedIPv6) {
-  CrossFamilyConnectionTest(SocketAddress("127.0.0.1", 0),
-                            SocketAddress("::ffff:127.0.0.2", 5000),
-                            true);
-}
-
-// Works, receiving socket sees a result from GetNextIP.
-TEST_F(VirtualSocketServerTest, CanConnectFromUnboundIPv6ToIPv4Any) {
-  CrossFamilyConnectionTest(SocketAddress("::", 0),
-                            SocketAddress("0.0.0.0", 5000),
-                            true);
-}
-
-// Works, receiving socket sees whatever GetNextIP gave the client.
-TEST_F(VirtualSocketServerTest, CanConnectFromUnboundIPv4ToIPv6Any) {
-  CrossFamilyConnectionTest(SocketAddress("0.0.0.0", 0),
-                            SocketAddress("::", 5000),
-                            true);
-}
-
-TEST_F(VirtualSocketServerTest, CanSendDatagramFromUnboundIPv4ToIPv6Any) {
-  CrossFamilyDatagramTest(SocketAddress("0.0.0.0", 0),
-                          SocketAddress("::", 5000),
-                          true);
-}
-
-TEST_F(VirtualSocketServerTest, CanSendDatagramFromMappedIPv6ToIPv4Any) {
-  CrossFamilyDatagramTest(SocketAddress("::ffff:127.0.0.1", 0),
-                          SocketAddress("0.0.0.0", 5000),
-                          true);
-}
-
-TEST_F(VirtualSocketServerTest, CantSendDatagramFromUnMappedIPv6ToIPv4Any) {
-  CrossFamilyDatagramTest(SocketAddress("::2", 0),
-                          SocketAddress("0.0.0.0", 5000),
-                          false);
-}
-
-TEST_F(VirtualSocketServerTest, CantSendDatagramFromUnMappedIPv6ToMappedIPv6) {
-  CrossFamilyDatagramTest(SocketAddress("::2", 0),
-                          SocketAddress("::ffff:127.0.0.1", 5000),
-                          false);
-}
-
-TEST_F(VirtualSocketServerTest, CanSendDatagramFromIPv4ToIPv6Any) {
-  CrossFamilyDatagramTest(SocketAddress("127.0.0.2", 0),
-                          SocketAddress("::", 5000),
-                          true);
-}
-
-TEST_F(VirtualSocketServerTest, CantSendDatagramFromIPv4ToUnMappedIPv6) {
-  CrossFamilyDatagramTest(SocketAddress("127.0.0.2", 0),
-                          SocketAddress("::1", 5000),
-                          false);
-}
-
-TEST_F(VirtualSocketServerTest, CanSendDatagramFromIPv4ToMappedIPv6) {
-  CrossFamilyDatagramTest(SocketAddress("127.0.0.1", 0),
-                          SocketAddress("::ffff:127.0.0.2", 5000),
-                          true);
-}
-
-TEST_F(VirtualSocketServerTest, CanSendDatagramFromUnboundIPv6ToIPv4Any) {
-  CrossFamilyDatagramTest(SocketAddress("::", 0),
-                          SocketAddress("0.0.0.0", 5000),
-                          true);
-}
-
-TEST_F(VirtualSocketServerTest, SetSendingBlockedWithUdpSocket) {
-  AsyncSocket* socket1 =
-      ss_.CreateAsyncSocket(kIPv4AnyAddress.family(), SOCK_DGRAM);
-  std::unique_ptr<AsyncSocket> socket2 =
-      WrapUnique(ss_.CreateAsyncSocket(kIPv4AnyAddress.family(), SOCK_DGRAM));
-  socket1->Bind(kIPv4AnyAddress);
-  socket2->Bind(kIPv4AnyAddress);
-  auto client1 =
-      MakeUnique<TestClient>(MakeUnique<AsyncUDPSocket>(socket1), &fake_clock_);
-
-  ss_.SetSendingBlocked(true);
-  EXPECT_EQ(-1, client1->SendTo("foo", 3, socket2->GetLocalAddress()));
-  EXPECT_TRUE(socket1->IsBlocking());
-  EXPECT_EQ(0, client1->ready_to_send_count());
-
-  ss_.SetSendingBlocked(false);
-  EXPECT_EQ(1, client1->ready_to_send_count());
-  EXPECT_EQ(3, client1->SendTo("foo", 3, socket2->GetLocalAddress()));
-}
-
-TEST_F(VirtualSocketServerTest, SetSendingBlockedWithTcpSocket) {
-  constexpr size_t kBufferSize = 1024;
-  ss_.set_send_buffer_capacity(kBufferSize);
-  ss_.set_recv_buffer_capacity(kBufferSize);
-
-  StreamSink sink;
-  std::unique_ptr<AsyncSocket> socket1 =
-      WrapUnique(ss_.CreateAsyncSocket(kIPv4AnyAddress.family(), SOCK_STREAM));
-  std::unique_ptr<AsyncSocket> socket2 =
-      WrapUnique(ss_.CreateAsyncSocket(kIPv4AnyAddress.family(), SOCK_STREAM));
-  sink.Monitor(socket1.get());
-  sink.Monitor(socket2.get());
-  socket1->Bind(kIPv4AnyAddress);
-  socket2->Bind(kIPv4AnyAddress);
-
-  // Connect sockets.
-  EXPECT_EQ(0, socket1->Connect(socket2->GetLocalAddress()));
-  EXPECT_EQ(0, socket2->Connect(socket1->GetLocalAddress()));
-  ss_.ProcessMessagesUntilIdle();
-
-  char data[kBufferSize] = {};
-
-  // First Send call will fill the send buffer but not send anything.
-  ss_.SetSendingBlocked(true);
-  EXPECT_EQ(static_cast<int>(kBufferSize), socket1->Send(data, kBufferSize));
-  ss_.ProcessMessagesUntilIdle();
-  EXPECT_FALSE(sink.Check(socket1.get(), SSE_WRITE));
-  EXPECT_FALSE(sink.Check(socket2.get(), SSE_READ));
-  EXPECT_FALSE(socket1->IsBlocking());
-
-  // Since the send buffer is full, next Send will result in EWOULDBLOCK.
-  EXPECT_EQ(-1, socket1->Send(data, kBufferSize));
-  EXPECT_FALSE(sink.Check(socket1.get(), SSE_WRITE));
-  EXPECT_FALSE(sink.Check(socket2.get(), SSE_READ));
-  EXPECT_TRUE(socket1->IsBlocking());
-
-  // When sending is unblocked, the buffered data should be sent and
-  // SignalWriteEvent should fire.
-  ss_.SetSendingBlocked(false);
-  ss_.ProcessMessagesUntilIdle();
-  EXPECT_TRUE(sink.Check(socket1.get(), SSE_WRITE));
-  EXPECT_TRUE(sink.Check(socket2.get(), SSE_READ));
-}
-
-TEST_F(VirtualSocketServerTest, CreatesStandardDistribution) {
-  const uint32_t kTestMean[] = {10, 100, 333, 1000};
-  const double kTestDev[] = { 0.25, 0.1, 0.01 };
-  // TODO(deadbeef): The current code only works for 1000 data points or more.
-  const uint32_t kTestSamples[] = {/*10, 100,*/ 1000};
-  for (size_t midx = 0; midx < arraysize(kTestMean); ++midx) {
-    for (size_t didx = 0; didx < arraysize(kTestDev); ++didx) {
-      for (size_t sidx = 0; sidx < arraysize(kTestSamples); ++sidx) {
-        ASSERT_LT(0u, kTestSamples[sidx]);
-        const uint32_t kStdDev =
-            static_cast<uint32_t>(kTestDev[didx] * kTestMean[midx]);
-        VirtualSocketServer::Function* f =
-            VirtualSocketServer::CreateDistribution(kTestMean[midx],
-                                                    kStdDev,
-                                                    kTestSamples[sidx]);
-        ASSERT_TRUE(nullptr != f);
-        ASSERT_EQ(kTestSamples[sidx], f->size());
-        double sum = 0;
-        for (uint32_t i = 0; i < f->size(); ++i) {
-          sum += (*f)[i].second;
-        }
-        const double mean = sum / f->size();
-        double sum_sq_dev = 0;
-        for (uint32_t i = 0; i < f->size(); ++i) {
-          double dev = (*f)[i].second - mean;
-          sum_sq_dev += dev * dev;
-        }
-        const double stddev = sqrt(sum_sq_dev / f->size());
-        EXPECT_NEAR(kTestMean[midx], mean, 0.1 * kTestMean[midx])
-          << "M=" << kTestMean[midx]
-          << " SD=" << kStdDev
-          << " N=" << kTestSamples[sidx];
-        EXPECT_NEAR(kStdDev, stddev, 0.1 * kStdDev)
-          << "M=" << kTestMean[midx]
-          << " SD=" << kStdDev
-          << " N=" << kTestSamples[sidx];
-        delete f;
-      }
-    }
-  }
-}
diff --git a/rtc_base/virtualsocketserver.cc b/rtc_base/virtualsocketserver.cc
deleted file mode 100644
index 23e94a2..0000000
--- a/rtc_base/virtualsocketserver.cc
+++ /dev/null
@@ -1,1223 +0,0 @@
-/*
- *  Copyright 2004 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/rtc_base/virtualsocketserver.h"
-
-#include <errno.h>
-#include <math.h>
-
-#include <algorithm>
-#include <map>
-#include <memory>
-#include <vector>
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/fakeclock.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/physicalsocketserver.h"
-#include "webrtc/rtc_base/socketaddresspair.h"
-#include "webrtc/rtc_base/thread.h"
-#include "webrtc/rtc_base/timeutils.h"
-
-namespace rtc {
-#if defined(WEBRTC_WIN)
-const in_addr kInitialNextIPv4 = { { { 0x01, 0, 0, 0 } } };
-#else
-// This value is entirely arbitrary, hence the lack of concern about endianness.
-const in_addr kInitialNextIPv4 = { 0x01000000 };
-#endif
-// Starts at ::2 so as to not cause confusion with ::1.
-const in6_addr kInitialNextIPv6 = { { {
-      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2
-    } } };
-
-const uint16_t kFirstEphemeralPort = 49152;
-const uint16_t kLastEphemeralPort = 65535;
-const uint16_t kEphemeralPortCount =
-    kLastEphemeralPort - kFirstEphemeralPort + 1;
-const uint32_t kDefaultNetworkCapacity = 64 * 1024;
-const uint32_t kDefaultTcpBufferSize = 32 * 1024;
-
-const uint32_t UDP_HEADER_SIZE = 28;  // IP + UDP headers
-const uint32_t TCP_HEADER_SIZE = 40;  // IP + TCP headers
-const uint32_t TCP_MSS = 1400;        // Maximum segment size
-
-// Note: The current algorithm doesn't work for sample sizes smaller than this.
-const int NUM_SAMPLES = 1000;
-
-enum {
-  MSG_ID_PACKET,
-  MSG_ID_ADDRESS_BOUND,
-  MSG_ID_CONNECT,
-  MSG_ID_DISCONNECT,
-  MSG_ID_SIGNALREADEVENT,
-};
-
-// Packets are passed between sockets as messages.  We copy the data just like
-// the kernel does.
-class Packet : public MessageData {
- public:
-  Packet(const char* data, size_t size, const SocketAddress& from)
-        : size_(size), consumed_(0), from_(from) {
-    RTC_DCHECK(nullptr != data);
-    data_ = new char[size_];
-    memcpy(data_, data, size_);
-  }
-
-  ~Packet() override {
-    delete[] data_;
-  }
-
-  const char* data() const { return data_ + consumed_; }
-  size_t size() const { return size_ - consumed_; }
-  const SocketAddress& from() const { return from_; }
-
-  // Remove the first size bytes from the data.
-  void Consume(size_t size) {
-    RTC_DCHECK(size + consumed_ < size_);
-    consumed_ += size;
-  }
-
- private:
-  char* data_;
-  size_t size_, consumed_;
-  SocketAddress from_;
-};
-
-struct MessageAddress : public MessageData {
-  explicit MessageAddress(const SocketAddress& a) : addr(a) { }
-  SocketAddress addr;
-};
-
-VirtualSocket::VirtualSocket(VirtualSocketServer* server,
-                             int family,
-                             int type,
-                             bool async)
-    : server_(server),
-      type_(type),
-      async_(async),
-      state_(CS_CLOSED),
-      error_(0),
-      listen_queue_(nullptr),
-      network_size_(0),
-      recv_buffer_size_(0),
-      bound_(false),
-      was_any_(false) {
-  RTC_DCHECK((type_ == SOCK_DGRAM) || (type_ == SOCK_STREAM));
-  RTC_DCHECK(async_ ||
-             (type_ != SOCK_STREAM));  // We only support async streams
-  server->SignalReadyToSend.connect(this,
-                                    &VirtualSocket::OnSocketServerReadyToSend);
-}
-
-VirtualSocket::~VirtualSocket() {
-  Close();
-
-  for (RecvBuffer::iterator it = recv_buffer_.begin(); it != recv_buffer_.end();
-       ++it) {
-    delete *it;
-  }
-}
-
-SocketAddress VirtualSocket::GetLocalAddress() const {
-  return local_addr_;
-}
-
-SocketAddress VirtualSocket::GetRemoteAddress() const {
-  return remote_addr_;
-}
-
-void VirtualSocket::SetLocalAddress(const SocketAddress& addr) {
-  local_addr_ = addr;
-}
-
-int VirtualSocket::Bind(const SocketAddress& addr) {
-  if (!local_addr_.IsNil()) {
-    error_ = EINVAL;
-    return -1;
-  }
-  local_addr_ = addr;
-  int result = server_->Bind(this, &local_addr_);
-  if (result != 0) {
-    local_addr_.Clear();
-    error_ = EADDRINUSE;
-  } else {
-    bound_ = true;
-    was_any_ = addr.IsAnyIP();
-    // Post a message here such that test case could have chance to
-    // process the local address. (i.e. SetAlternativeLocalAddress).
-    server_->msg_queue_->Post(RTC_FROM_HERE, this, MSG_ID_ADDRESS_BOUND);
-  }
-  return result;
-}
-
-int VirtualSocket::Connect(const SocketAddress& addr) {
-  return InitiateConnect(addr, true);
-}
-
-int VirtualSocket::Close() {
-  if (!local_addr_.IsNil() && bound_) {
-    // Remove from the binding table.
-    server_->Unbind(local_addr_, this);
-    bound_ = false;
-  }
-
-  if (SOCK_STREAM == type_) {
-    // Cancel pending sockets
-    if (listen_queue_) {
-      while (!listen_queue_->empty()) {
-        SocketAddress addr = listen_queue_->front();
-
-        // Disconnect listening socket.
-        server_->Disconnect(server_->LookupBinding(addr));
-        listen_queue_->pop_front();
-      }
-      delete listen_queue_;
-      listen_queue_ = nullptr;
-    }
-    // Disconnect stream sockets
-    if (CS_CONNECTED == state_) {
-      // Disconnect remote socket, check if it is a child of a server socket.
-      VirtualSocket* socket =
-          server_->LookupConnection(local_addr_, remote_addr_);
-      if (!socket) {
-        // Not a server socket child, then see if it is bound.
-        // TODO(tbd): If this is indeed a server socket that has no
-        // children this will cause the server socket to be
-        // closed. This might lead to unexpected results, how to fix this?
-        socket = server_->LookupBinding(remote_addr_);
-      }
-      server_->Disconnect(socket);
-
-      // Remove mapping for both directions.
-      server_->RemoveConnection(remote_addr_, local_addr_);
-      server_->RemoveConnection(local_addr_, remote_addr_);
-    }
-    // Cancel potential connects
-    MessageList msgs;
-    if (server_->msg_queue_) {
-      server_->msg_queue_->Clear(this, MSG_ID_CONNECT, &msgs);
-    }
-    for (MessageList::iterator it = msgs.begin(); it != msgs.end(); ++it) {
-      RTC_DCHECK(nullptr != it->pdata);
-      MessageAddress* data = static_cast<MessageAddress*>(it->pdata);
-
-      // Lookup remote side.
-      VirtualSocket* socket =
-          server_->LookupConnection(local_addr_, data->addr);
-      if (socket) {
-        // Server socket, remote side is a socket retreived by
-        // accept. Accepted sockets are not bound so we will not
-        // find it by looking in the bindings table.
-        server_->Disconnect(socket);
-        server_->RemoveConnection(local_addr_, data->addr);
-      } else {
-        server_->Disconnect(server_->LookupBinding(data->addr));
-      }
-      delete data;
-    }
-    // Clear incoming packets and disconnect messages
-    if (server_->msg_queue_) {
-      server_->msg_queue_->Clear(this);
-    }
-  }
-
-  state_ = CS_CLOSED;
-  local_addr_.Clear();
-  remote_addr_.Clear();
-  return 0;
-}
-
-int VirtualSocket::Send(const void* pv, size_t cb) {
-    if (CS_CONNECTED != state_) {
-      error_ = ENOTCONN;
-      return -1;
-    }
-    if (SOCK_DGRAM == type_) {
-      return SendUdp(pv, cb, remote_addr_);
-    } else {
-      return SendTcp(pv, cb);
-    }
-}
-
-int VirtualSocket::SendTo(const void* pv,
-                          size_t cb,
-                          const SocketAddress& addr) {
-  if (SOCK_DGRAM == type_) {
-    return SendUdp(pv, cb, addr);
-  } else {
-    if (CS_CONNECTED != state_) {
-      error_ = ENOTCONN;
-      return -1;
-    }
-    return SendTcp(pv, cb);
-  }
-}
-
-int VirtualSocket::Recv(void* pv, size_t cb, int64_t* timestamp) {
-  SocketAddress addr;
-  return RecvFrom(pv, cb, &addr, timestamp);
-}
-
-int VirtualSocket::RecvFrom(void* pv,
-                            size_t cb,
-                            SocketAddress* paddr,
-                            int64_t* timestamp) {
-  if (timestamp) {
-    *timestamp = -1;
-  }
-  // If we don't have a packet, then either error or wait for one to arrive.
-  if (recv_buffer_.empty()) {
-    if (async_) {
-      error_ = EAGAIN;
-      return -1;
-    }
-    while (recv_buffer_.empty()) {
-      Message msg;
-      server_->msg_queue_->Get(&msg);
-      server_->msg_queue_->Dispatch(&msg);
-    }
-  }
-
-  // Return the packet at the front of the queue.
-  Packet* packet = recv_buffer_.front();
-  size_t data_read = std::min(cb, packet->size());
-  memcpy(pv, packet->data(), data_read);
-  *paddr = packet->from();
-
-  if (data_read < packet->size()) {
-    packet->Consume(data_read);
-  } else {
-    recv_buffer_.pop_front();
-    delete packet;
-  }
-
-  // To behave like a real socket, SignalReadEvent should fire in the next
-  // message loop pass if there's still data buffered.
-  if (!recv_buffer_.empty()) {
-    // Clear the message so it doesn't end up posted multiple times.
-    server_->msg_queue_->Clear(this, MSG_ID_SIGNALREADEVENT);
-    server_->msg_queue_->Post(RTC_FROM_HERE, this, MSG_ID_SIGNALREADEVENT);
-  }
-
-  if (SOCK_STREAM == type_) {
-    bool was_full = (recv_buffer_size_ == server_->recv_buffer_capacity_);
-    recv_buffer_size_ -= data_read;
-    if (was_full) {
-      VirtualSocket* sender = server_->LookupBinding(remote_addr_);
-      RTC_DCHECK(nullptr != sender);
-      server_->SendTcp(sender);
-    }
-  }
-
-  return static_cast<int>(data_read);
-}
-
-int VirtualSocket::Listen(int backlog) {
-  RTC_DCHECK(SOCK_STREAM == type_);
-  RTC_DCHECK(CS_CLOSED == state_);
-  if (local_addr_.IsNil()) {
-    error_ = EINVAL;
-    return -1;
-  }
-  RTC_DCHECK(nullptr == listen_queue_);
-  listen_queue_ = new ListenQueue;
-  state_ = CS_CONNECTING;
-  return 0;
-}
-
-VirtualSocket* VirtualSocket::Accept(SocketAddress* paddr) {
-  if (nullptr == listen_queue_) {
-    error_ = EINVAL;
-    return nullptr;
-  }
-  while (!listen_queue_->empty()) {
-    VirtualSocket* socket = new VirtualSocket(server_, AF_INET, type_, async_);
-
-    // Set the new local address to the same as this server socket.
-    socket->SetLocalAddress(local_addr_);
-    // Sockets made from a socket that 'was Any' need to inherit that.
-    socket->set_was_any(was_any_);
-    SocketAddress remote_addr(listen_queue_->front());
-    int result = socket->InitiateConnect(remote_addr, false);
-    listen_queue_->pop_front();
-    if (result != 0) {
-      delete socket;
-      continue;
-    }
-    socket->CompleteConnect(remote_addr, false);
-    if (paddr) {
-      *paddr = remote_addr;
-    }
-    return socket;
-  }
-  error_ = EWOULDBLOCK;
-  return nullptr;
-}
-
-int VirtualSocket::GetError() const {
-  return error_;
-}
-
-void VirtualSocket::SetError(int error) {
-  error_ = error;
-}
-
-Socket::ConnState VirtualSocket::GetState() const {
-  return state_;
-}
-
-int VirtualSocket::GetOption(Option opt, int* value) {
-  OptionsMap::const_iterator it = options_map_.find(opt);
-  if (it == options_map_.end()) {
-    return -1;
-  }
-  *value = it->second;
-  return 0;  // 0 is success to emulate getsockopt()
-}
-
-int VirtualSocket::SetOption(Option opt, int value) {
-  options_map_[opt] = value;
-  return 0;  // 0 is success to emulate setsockopt()
-}
-
-void VirtualSocket::OnMessage(Message* pmsg) {
-  if (pmsg->message_id == MSG_ID_PACKET) {
-    RTC_DCHECK(nullptr != pmsg->pdata);
-    Packet* packet = static_cast<Packet*>(pmsg->pdata);
-
-    recv_buffer_.push_back(packet);
-
-    if (async_) {
-      SignalReadEvent(this);
-    }
-  } else if (pmsg->message_id == MSG_ID_CONNECT) {
-    RTC_DCHECK(nullptr != pmsg->pdata);
-    MessageAddress* data = static_cast<MessageAddress*>(pmsg->pdata);
-    if (listen_queue_ != nullptr) {
-      listen_queue_->push_back(data->addr);
-      if (async_) {
-        SignalReadEvent(this);
-      }
-    } else if ((SOCK_STREAM == type_) && (CS_CONNECTING == state_)) {
-      CompleteConnect(data->addr, true);
-    } else {
-      LOG(LS_VERBOSE) << "Socket at " << local_addr_ << " is not listening";
-      server_->Disconnect(server_->LookupBinding(data->addr));
-    }
-    delete data;
-  } else if (pmsg->message_id == MSG_ID_DISCONNECT) {
-    RTC_DCHECK(SOCK_STREAM == type_);
-    if (CS_CLOSED != state_) {
-      int error = (CS_CONNECTING == state_) ? ECONNREFUSED : 0;
-      state_ = CS_CLOSED;
-      remote_addr_.Clear();
-      if (async_) {
-        SignalCloseEvent(this, error);
-      }
-    }
-  } else if (pmsg->message_id == MSG_ID_ADDRESS_BOUND) {
-    SignalAddressReady(this, GetLocalAddress());
-  } else if (pmsg->message_id == MSG_ID_SIGNALREADEVENT) {
-    if (!recv_buffer_.empty()) {
-      SignalReadEvent(this);
-    }
-  } else {
-    RTC_NOTREACHED();
-  }
-}
-
-int VirtualSocket::InitiateConnect(const SocketAddress& addr, bool use_delay) {
-  if (!remote_addr_.IsNil()) {
-    error_ = (CS_CONNECTED == state_) ? EISCONN : EINPROGRESS;
-    return -1;
-  }
-  if (local_addr_.IsNil()) {
-    // If there's no local address set, grab a random one in the correct AF.
-    int result = 0;
-    if (addr.ipaddr().family() == AF_INET) {
-      result = Bind(SocketAddress("0.0.0.0", 0));
-    } else if (addr.ipaddr().family() == AF_INET6) {
-      result = Bind(SocketAddress("::", 0));
-    }
-    if (result != 0) {
-      return result;
-    }
-  }
-  if (type_ == SOCK_DGRAM) {
-    remote_addr_ = addr;
-    state_ = CS_CONNECTED;
-  } else {
-    int result = server_->Connect(this, addr, use_delay);
-    if (result != 0) {
-      error_ = EHOSTUNREACH;
-      return -1;
-    }
-    state_ = CS_CONNECTING;
-  }
-  return 0;
-}
-
-void VirtualSocket::CompleteConnect(const SocketAddress& addr, bool notify) {
-  RTC_DCHECK(CS_CONNECTING == state_);
-  remote_addr_ = addr;
-  state_ = CS_CONNECTED;
-  server_->AddConnection(remote_addr_, local_addr_, this);
-  if (async_ && notify) {
-    SignalConnectEvent(this);
-  }
-}
-
-int VirtualSocket::SendUdp(const void* pv,
-                           size_t cb,
-                           const SocketAddress& addr) {
-  // If we have not been assigned a local port, then get one.
-  if (local_addr_.IsNil()) {
-    local_addr_ = EmptySocketAddressWithFamily(addr.ipaddr().family());
-    int result = server_->Bind(this, &local_addr_);
-    if (result != 0) {
-      local_addr_.Clear();
-      error_ = EADDRINUSE;
-      return result;
-    }
-  }
-
-  // Send the data in a message to the appropriate socket.
-  return server_->SendUdp(this, static_cast<const char*>(pv), cb, addr);
-}
-
-int VirtualSocket::SendTcp(const void* pv, size_t cb) {
-  size_t capacity = server_->send_buffer_capacity_ - send_buffer_.size();
-  if (0 == capacity) {
-    ready_to_send_ = false;
-    error_ = EWOULDBLOCK;
-    return -1;
-  }
-  size_t consumed = std::min(cb, capacity);
-  const char* cpv = static_cast<const char*>(pv);
-  send_buffer_.insert(send_buffer_.end(), cpv, cpv + consumed);
-  server_->SendTcp(this);
-  return static_cast<int>(consumed);
-}
-
-void VirtualSocket::OnSocketServerReadyToSend() {
-  if (ready_to_send_) {
-    // This socket didn't encounter EWOULDBLOCK, so there's nothing to do.
-    return;
-  }
-  if (type_ == SOCK_DGRAM) {
-    ready_to_send_ = true;
-    SignalWriteEvent(this);
-  } else {
-    RTC_DCHECK(type_ == SOCK_STREAM);
-    // This will attempt to empty the full send buffer, and will fire
-    // SignalWriteEvent if successful.
-    server_->SendTcp(this);
-  }
-}
-
-VirtualSocketServer::VirtualSocketServer() : VirtualSocketServer(nullptr) {}
-
-VirtualSocketServer::VirtualSocketServer(FakeClock* fake_clock)
-    : fake_clock_(fake_clock),
-      wakeup_(/*manual_reset=*/false, /*initially_signaled=*/false),
-      msg_queue_(nullptr),
-      stop_on_idle_(false),
-      next_ipv4_(kInitialNextIPv4),
-      next_ipv6_(kInitialNextIPv6),
-      next_port_(kFirstEphemeralPort),
-      bindings_(new AddressMap()),
-      connections_(new ConnectionMap()),
-      bandwidth_(0),
-      network_capacity_(kDefaultNetworkCapacity),
-      send_buffer_capacity_(kDefaultTcpBufferSize),
-      recv_buffer_capacity_(kDefaultTcpBufferSize),
-      delay_mean_(0),
-      delay_stddev_(0),
-      delay_samples_(NUM_SAMPLES),
-      drop_prob_(0.0) {
-  UpdateDelayDistribution();
-}
-
-VirtualSocketServer::~VirtualSocketServer() {
-  delete bindings_;
-  delete connections_;
-}
-
-IPAddress VirtualSocketServer::GetNextIP(int family) {
-  if (family == AF_INET) {
-    IPAddress next_ip(next_ipv4_);
-    next_ipv4_.s_addr =
-        HostToNetwork32(NetworkToHost32(next_ipv4_.s_addr) + 1);
-    return next_ip;
-  } else if (family == AF_INET6) {
-    IPAddress next_ip(next_ipv6_);
-    uint32_t* as_ints = reinterpret_cast<uint32_t*>(&next_ipv6_.s6_addr);
-    as_ints[3] += 1;
-    return next_ip;
-  }
-  return IPAddress();
-}
-
-uint16_t VirtualSocketServer::GetNextPort() {
-  uint16_t port = next_port_;
-  if (next_port_ < kLastEphemeralPort) {
-    ++next_port_;
-  } else {
-    next_port_ = kFirstEphemeralPort;
-  }
-  return port;
-}
-
-void VirtualSocketServer::SetSendingBlocked(bool blocked) {
-  if (blocked == sending_blocked_) {
-    // Unchanged; nothing to do.
-    return;
-  }
-  sending_blocked_ = blocked;
-  if (!sending_blocked_) {
-    // Sending was blocked, but is now unblocked. This signal gives sockets a
-    // chance to fire SignalWriteEvent, and for TCP, send buffered data.
-    SignalReadyToSend();
-  }
-}
-
-Socket* VirtualSocketServer::CreateSocket(int type) {
-  return CreateSocket(AF_INET, type);
-}
-
-Socket* VirtualSocketServer::CreateSocket(int family, int type) {
-  return CreateSocketInternal(family, type);
-}
-
-AsyncSocket* VirtualSocketServer::CreateAsyncSocket(int type) {
-  return CreateAsyncSocket(AF_INET, type);
-}
-
-AsyncSocket* VirtualSocketServer::CreateAsyncSocket(int family, int type) {
-  return CreateSocketInternal(family, type);
-}
-
-VirtualSocket* VirtualSocketServer::CreateSocketInternal(int family, int type) {
-  VirtualSocket* socket = new VirtualSocket(this, family, type, true);
-  SignalSocketCreated(socket);
-  return socket;
-}
-
-void VirtualSocketServer::SetMessageQueue(MessageQueue* msg_queue) {
-  msg_queue_ = msg_queue;
-  if (msg_queue_) {
-    msg_queue_->SignalQueueDestroyed.connect(this,
-        &VirtualSocketServer::OnMessageQueueDestroyed);
-  }
-}
-
-bool VirtualSocketServer::Wait(int cmsWait, bool process_io) {
-  RTC_DCHECK(msg_queue_ == Thread::Current());
-  if (stop_on_idle_ && Thread::Current()->empty()) {
-    return false;
-  }
-  // Note: we don't need to do anything with |process_io| since we don't have
-  // any real I/O. Received packets come in the form of queued messages, so
-  // MessageQueue will ensure WakeUp is called if another thread sends a
-  // packet.
-  wakeup_.Wait(cmsWait);
-  return true;
-}
-
-void VirtualSocketServer::WakeUp() {
-  wakeup_.Set();
-}
-
-void VirtualSocketServer::SetAlternativeLocalAddress(
-    const rtc::IPAddress& address,
-    const rtc::IPAddress& alternative) {
-  alternative_address_mapping_[address] = alternative;
-}
-
-bool VirtualSocketServer::ProcessMessagesUntilIdle() {
-  RTC_DCHECK(msg_queue_ == Thread::Current());
-  stop_on_idle_ = true;
-  while (!msg_queue_->empty()) {
-    if (fake_clock_) {
-      // If using a fake clock, advance it in millisecond increments until the
-      // queue is empty.
-      fake_clock_->AdvanceTime(rtc::TimeDelta::FromMilliseconds(1));
-    } else {
-      // Otherwise, run a normal message loop.
-      Message msg;
-      if (msg_queue_->Get(&msg, Thread::kForever)) {
-        msg_queue_->Dispatch(&msg);
-      }
-    }
-  }
-  stop_on_idle_ = false;
-  return !msg_queue_->IsQuitting();
-}
-
-void VirtualSocketServer::SetNextPortForTesting(uint16_t port) {
-  next_port_ = port;
-}
-
-bool VirtualSocketServer::CloseTcpConnections(
-    const SocketAddress& addr_local,
-    const SocketAddress& addr_remote) {
-  VirtualSocket* socket = LookupConnection(addr_local, addr_remote);
-  if (!socket) {
-    return false;
-  }
-  // Signal the close event on the local connection first.
-  socket->SignalCloseEvent(socket, 0);
-
-  // Trigger the remote connection's close event.
-  socket->Close();
-
-  return true;
-}
-
-int VirtualSocketServer::Bind(VirtualSocket* socket,
-                              const SocketAddress& addr) {
-  RTC_DCHECK(nullptr != socket);
-  // Address must be completely specified at this point
-  RTC_DCHECK(!IPIsUnspec(addr.ipaddr()));
-  RTC_DCHECK(addr.port() != 0);
-
-  // Normalize the address (turns v6-mapped addresses into v4-addresses).
-  SocketAddress normalized(addr.ipaddr().Normalized(), addr.port());
-
-  AddressMap::value_type entry(normalized, socket);
-  return bindings_->insert(entry).second ? 0 : -1;
-}
-
-int VirtualSocketServer::Bind(VirtualSocket* socket, SocketAddress* addr) {
-  RTC_DCHECK(nullptr != socket);
-
-  // Normalize the IP.
-  if (!IPIsUnspec(addr->ipaddr())) {
-    addr->SetIP(addr->ipaddr().Normalized());
-  } else {
-    RTC_NOTREACHED();
-  }
-
-  // If the IP appears in |alternative_address_mapping_|, meaning the test has
-  // configured sockets bound to this IP to actually use another IP, replace
-  // the IP here.
-  auto alternative = alternative_address_mapping_.find(addr->ipaddr());
-  if (alternative != alternative_address_mapping_.end()) {
-    addr->SetIP(alternative->second);
-  }
-
-  // Assign a port if not assigned.
-  if (addr->port() == 0) {
-    for (int i = 0; i < kEphemeralPortCount; ++i) {
-      addr->SetPort(GetNextPort());
-      if (bindings_->find(*addr) == bindings_->end()) {
-        break;
-      }
-    }
-  }
-
-  return Bind(socket, *addr);
-}
-
-VirtualSocket* VirtualSocketServer::LookupBinding(const SocketAddress& addr) {
-  SocketAddress normalized(addr.ipaddr().Normalized(),
-                           addr.port());
-  AddressMap::iterator it = bindings_->find(normalized);
-  if (it != bindings_->end()) {
-    return it->second;
-  }
-
-  IPAddress default_ip = GetDefaultRoute(addr.ipaddr().family());
-  if (!IPIsUnspec(default_ip) && addr.ipaddr() == default_ip) {
-    // If we can't find a binding for the packet which is sent to the interface
-    // corresponding to the default route, it should match a binding with the
-    // correct port to the any address.
-    SocketAddress sock_addr =
-        EmptySocketAddressWithFamily(addr.ipaddr().family());
-    sock_addr.SetPort(addr.port());
-    return LookupBinding(sock_addr);
-  }
-
-  return nullptr;
-}
-
-int VirtualSocketServer::Unbind(const SocketAddress& addr,
-                                VirtualSocket* socket) {
-  SocketAddress normalized(addr.ipaddr().Normalized(),
-                           addr.port());
-  RTC_DCHECK((*bindings_)[normalized] == socket);
-  bindings_->erase(bindings_->find(normalized));
-  return 0;
-}
-
-void VirtualSocketServer::AddConnection(const SocketAddress& local,
-                                        const SocketAddress& remote,
-                                        VirtualSocket* remote_socket) {
-  // Add this socket pair to our routing table. This will allow
-  // multiple clients to connect to the same server address.
-  SocketAddress local_normalized(local.ipaddr().Normalized(),
-                                 local.port());
-  SocketAddress remote_normalized(remote.ipaddr().Normalized(),
-                                  remote.port());
-  SocketAddressPair address_pair(local_normalized, remote_normalized);
-  connections_->insert(std::pair<SocketAddressPair,
-                       VirtualSocket*>(address_pair, remote_socket));
-}
-
-VirtualSocket* VirtualSocketServer::LookupConnection(
-    const SocketAddress& local,
-    const SocketAddress& remote) {
-  SocketAddress local_normalized(local.ipaddr().Normalized(),
-                                 local.port());
-  SocketAddress remote_normalized(remote.ipaddr().Normalized(),
-                                  remote.port());
-  SocketAddressPair address_pair(local_normalized, remote_normalized);
-  ConnectionMap::iterator it = connections_->find(address_pair);
-  return (connections_->end() != it) ? it->second : nullptr;
-}
-
-void VirtualSocketServer::RemoveConnection(const SocketAddress& local,
-                                           const SocketAddress& remote) {
-  SocketAddress local_normalized(local.ipaddr().Normalized(),
-                                local.port());
-  SocketAddress remote_normalized(remote.ipaddr().Normalized(),
-                                 remote.port());
-  SocketAddressPair address_pair(local_normalized, remote_normalized);
-  connections_->erase(address_pair);
-}
-
-static double Random() {
-  return static_cast<double>(rand()) / RAND_MAX;
-}
-
-int VirtualSocketServer::Connect(VirtualSocket* socket,
-                                 const SocketAddress& remote_addr,
-                                 bool use_delay) {
-  uint32_t delay = use_delay ? GetTransitDelay(socket) : 0;
-  VirtualSocket* remote = LookupBinding(remote_addr);
-  if (!CanInteractWith(socket, remote)) {
-    LOG(LS_INFO) << "Address family mismatch between "
-                 << socket->GetLocalAddress() << " and " << remote_addr;
-    return -1;
-  }
-  if (remote != nullptr) {
-    SocketAddress addr = socket->GetLocalAddress();
-    msg_queue_->PostDelayed(RTC_FROM_HERE, delay, remote, MSG_ID_CONNECT,
-                            new MessageAddress(addr));
-  } else {
-    LOG(LS_INFO) << "No one listening at " << remote_addr;
-    msg_queue_->PostDelayed(RTC_FROM_HERE, delay, socket, MSG_ID_DISCONNECT);
-  }
-  return 0;
-}
-
-bool VirtualSocketServer::Disconnect(VirtualSocket* socket) {
-  if (socket) {
-    // If we simulate packets being delayed, we should simulate the
-    // equivalent of a FIN being delayed as well.
-    uint32_t delay = GetTransitDelay(socket);
-    // Remove the mapping.
-    msg_queue_->PostDelayed(RTC_FROM_HERE, delay, socket, MSG_ID_DISCONNECT);
-    return true;
-  }
-  return false;
-}
-
-int VirtualSocketServer::SendUdp(VirtualSocket* socket,
-                                 const char* data, size_t data_size,
-                                 const SocketAddress& remote_addr) {
-  if (sending_blocked_) {
-    CritScope cs(&socket->crit_);
-    socket->ready_to_send_ = false;
-    socket->error_ = EWOULDBLOCK;
-    return -1;
-  }
-
-  // See if we want to drop this packet.
-  if (Random() < drop_prob_) {
-    LOG(LS_VERBOSE) << "Dropping packet: bad luck";
-    return static_cast<int>(data_size);
-  }
-
-  VirtualSocket* recipient = LookupBinding(remote_addr);
-  if (!recipient) {
-    // Make a fake recipient for address family checking.
-    std::unique_ptr<VirtualSocket> dummy_socket(
-        CreateSocketInternal(AF_INET, SOCK_DGRAM));
-    dummy_socket->SetLocalAddress(remote_addr);
-    if (!CanInteractWith(socket, dummy_socket.get())) {
-      LOG(LS_VERBOSE) << "Incompatible address families: "
-                      << socket->GetLocalAddress() << " and " << remote_addr;
-      return -1;
-    }
-    LOG(LS_VERBOSE) << "No one listening at " << remote_addr;
-    return static_cast<int>(data_size);
-  }
-
-  if (!CanInteractWith(socket, recipient)) {
-    LOG(LS_VERBOSE) << "Incompatible address families: "
-                    << socket->GetLocalAddress() << " and " << remote_addr;
-    return -1;
-  }
-
-  {
-    CritScope cs(&socket->crit_);
-
-    int64_t cur_time = TimeMillis();
-    PurgeNetworkPackets(socket, cur_time);
-
-    // Determine whether we have enough bandwidth to accept this packet.  To do
-    // this, we need to update the send queue.  Once we know it's current size,
-    // we know whether we can fit this packet.
-    //
-    // NOTE: There are better algorithms for maintaining such a queue (such as
-    // "Derivative Random Drop"); however, this algorithm is a more accurate
-    // simulation of what a normal network would do.
-
-    size_t packet_size = data_size + UDP_HEADER_SIZE;
-    if (socket->network_size_ + packet_size > network_capacity_) {
-      LOG(LS_VERBOSE) << "Dropping packet: network capacity exceeded";
-      return static_cast<int>(data_size);
-    }
-
-    AddPacketToNetwork(socket, recipient, cur_time, data, data_size,
-                       UDP_HEADER_SIZE, false);
-
-    return static_cast<int>(data_size);
-  }
-}
-
-void VirtualSocketServer::SendTcp(VirtualSocket* socket) {
-  if (sending_blocked_) {
-    // Eventually the socket's buffer will fill and VirtualSocket::SendTcp will
-    // set EWOULDBLOCK.
-    return;
-  }
-
-  // TCP can't send more data than will fill up the receiver's buffer.
-  // We track the data that is in the buffer plus data in flight using the
-  // recipient's recv_buffer_size_.  Anything beyond that must be stored in the
-  // sender's buffer.  We will trigger the buffered data to be sent when data
-  // is read from the recv_buffer.
-
-  // Lookup the local/remote pair in the connections table.
-  VirtualSocket* recipient = LookupConnection(socket->local_addr_,
-                                              socket->remote_addr_);
-  if (!recipient) {
-    LOG(LS_VERBOSE) << "Sending data to no one.";
-    return;
-  }
-
-  CritScope cs(&socket->crit_);
-
-  int64_t cur_time = TimeMillis();
-  PurgeNetworkPackets(socket, cur_time);
-
-  while (true) {
-    size_t available = recv_buffer_capacity_ - recipient->recv_buffer_size_;
-    size_t max_data_size =
-        std::min<size_t>(available, TCP_MSS - TCP_HEADER_SIZE);
-    size_t data_size = std::min(socket->send_buffer_.size(), max_data_size);
-    if (0 == data_size)
-      break;
-
-    AddPacketToNetwork(socket, recipient, cur_time, &socket->send_buffer_[0],
-                       data_size, TCP_HEADER_SIZE, true);
-    recipient->recv_buffer_size_ += data_size;
-
-    size_t new_buffer_size = socket->send_buffer_.size() - data_size;
-    // Avoid undefined access beyond the last element of the vector.
-    // This only happens when new_buffer_size is 0.
-    if (data_size < socket->send_buffer_.size()) {
-      // memmove is required for potentially overlapping source/destination.
-      memmove(&socket->send_buffer_[0], &socket->send_buffer_[data_size],
-              new_buffer_size);
-    }
-    socket->send_buffer_.resize(new_buffer_size);
-  }
-
-  if (!socket->ready_to_send_ &&
-      (socket->send_buffer_.size() < send_buffer_capacity_)) {
-    socket->ready_to_send_ = true;
-    socket->SignalWriteEvent(socket);
-  }
-}
-
-void VirtualSocketServer::AddPacketToNetwork(VirtualSocket* sender,
-                                             VirtualSocket* recipient,
-                                             int64_t cur_time,
-                                             const char* data,
-                                             size_t data_size,
-                                             size_t header_size,
-                                             bool ordered) {
-  VirtualSocket::NetworkEntry entry;
-  entry.size = data_size + header_size;
-
-  sender->network_size_ += entry.size;
-  uint32_t send_delay = SendDelay(static_cast<uint32_t>(sender->network_size_));
-  entry.done_time = cur_time + send_delay;
-  sender->network_.push_back(entry);
-
-  // Find the delay for crossing the many virtual hops of the network.
-  uint32_t transit_delay = GetTransitDelay(sender);
-
-  // When the incoming packet is from a binding of the any address, translate it
-  // to the default route here such that the recipient will see the default
-  // route.
-  SocketAddress sender_addr = sender->local_addr_;
-  IPAddress default_ip = GetDefaultRoute(sender_addr.ipaddr().family());
-  if (sender_addr.IsAnyIP() && !IPIsUnspec(default_ip)) {
-    sender_addr.SetIP(default_ip);
-  }
-
-  // Post the packet as a message to be delivered (on our own thread)
-  Packet* p = new Packet(data, data_size, sender_addr);
-
-  int64_t ts = TimeAfter(send_delay + transit_delay);
-  if (ordered) {
-    // Ensure that new packets arrive after previous ones
-    ts = std::max(ts, sender->last_delivery_time_);
-    // A socket should not have both ordered and unordered delivery, so its last
-    // delivery time only needs to be updated when it has ordered delivery.
-    sender->last_delivery_time_ = ts;
-  }
-  msg_queue_->PostAt(RTC_FROM_HERE, ts, recipient, MSG_ID_PACKET, p);
-}
-
-void VirtualSocketServer::PurgeNetworkPackets(VirtualSocket* socket,
-                                              int64_t cur_time) {
-  while (!socket->network_.empty() &&
-         (socket->network_.front().done_time <= cur_time)) {
-    RTC_DCHECK(socket->network_size_ >= socket->network_.front().size);
-    socket->network_size_ -= socket->network_.front().size;
-    socket->network_.pop_front();
-  }
-}
-
-uint32_t VirtualSocketServer::SendDelay(uint32_t size) {
-  if (bandwidth_ == 0)
-    return 0;
-  else
-    return 1000 * size / bandwidth_;
-}
-
-#if 0
-void PrintFunction(std::vector<std::pair<double, double> >* f) {
-  return;
-  double sum = 0;
-  for (uint32_t i = 0; i < f->size(); ++i) {
-    std::cout << (*f)[i].first << '\t' << (*f)[i].second << std::endl;
-    sum += (*f)[i].second;
-  }
-  if (!f->empty()) {
-    const double mean = sum / f->size();
-    double sum_sq_dev = 0;
-    for (uint32_t i = 0; i < f->size(); ++i) {
-      double dev = (*f)[i].second - mean;
-      sum_sq_dev += dev * dev;
-    }
-    std::cout << "Mean = " << mean << " StdDev = "
-              << sqrt(sum_sq_dev / f->size()) << std::endl;
-  }
-}
-#endif  // <unused>
-
-void VirtualSocketServer::UpdateDelayDistribution() {
-  Function* dist = CreateDistribution(delay_mean_, delay_stddev_,
-                                      delay_samples_);
-  // We take a lock just to make sure we don't leak memory.
-  {
-    CritScope cs(&delay_crit_);
-    delay_dist_.reset(dist);
-  }
-}
-
-static double PI = 4 * atan(1.0);
-
-static double Normal(double x, double mean, double stddev) {
-  double a = (x - mean) * (x - mean) / (2 * stddev * stddev);
-  return exp(-a) / (stddev * sqrt(2 * PI));
-}
-
-#if 0  // static unused gives a warning
-static double Pareto(double x, double min, double k) {
-  if (x < min)
-    return 0;
-  else
-    return k * std::pow(min, k) / std::pow(x, k+1);
-}
-#endif
-
-VirtualSocketServer::Function* VirtualSocketServer::CreateDistribution(
-    uint32_t mean,
-    uint32_t stddev,
-    uint32_t samples) {
-  Function* f = new Function();
-
-  if (0 == stddev) {
-    f->push_back(Point(mean, 1.0));
-  } else {
-    double start = 0;
-    if (mean >= 4 * static_cast<double>(stddev))
-      start = mean - 4 * static_cast<double>(stddev);
-    double end = mean + 4 * static_cast<double>(stddev);
-
-    for (uint32_t i = 0; i < samples; i++) {
-      double x = start + (end - start) * i / (samples - 1);
-      double y = Normal(x, mean, stddev);
-      f->push_back(Point(x, y));
-    }
-  }
-  return Resample(Invert(Accumulate(f)), 0, 1, samples);
-}
-
-uint32_t VirtualSocketServer::GetTransitDelay(Socket* socket) {
-  // Use the delay based on the address if it is set.
-  auto iter = delay_by_ip_.find(socket->GetLocalAddress().ipaddr());
-  if (iter != delay_by_ip_.end()) {
-    return static_cast<uint32_t>(iter->second);
-  }
-  // Otherwise, use the delay from the distribution distribution.
-  size_t index = rand() % delay_dist_->size();
-  double delay = (*delay_dist_)[index].second;
-  // LOG_F(LS_INFO) << "random[" << index << "] = " << delay;
-  return static_cast<uint32_t>(delay);
-}
-
-struct FunctionDomainCmp {
-  bool operator()(const VirtualSocketServer::Point& p1,
-                   const VirtualSocketServer::Point& p2) {
-    return p1.first < p2.first;
-  }
-  bool operator()(double v1, const VirtualSocketServer::Point& p2) {
-    return v1 < p2.first;
-  }
-  bool operator()(const VirtualSocketServer::Point& p1, double v2) {
-    return p1.first < v2;
-  }
-};
-
-VirtualSocketServer::Function* VirtualSocketServer::Accumulate(Function* f) {
-  RTC_DCHECK(f->size() >= 1);
-  double v = 0;
-  for (Function::size_type i = 0; i < f->size() - 1; ++i) {
-    double dx = (*f)[i + 1].first - (*f)[i].first;
-    double avgy = ((*f)[i + 1].second + (*f)[i].second) / 2;
-    (*f)[i].second = v;
-    v = v + dx * avgy;
-  }
-  (*f)[f->size()-1].second = v;
-  return f;
-}
-
-VirtualSocketServer::Function* VirtualSocketServer::Invert(Function* f) {
-  for (Function::size_type i = 0; i < f->size(); ++i)
-    std::swap((*f)[i].first, (*f)[i].second);
-
-  std::sort(f->begin(), f->end(), FunctionDomainCmp());
-  return f;
-}
-
-VirtualSocketServer::Function* VirtualSocketServer::Resample(Function* f,
-                                                             double x1,
-                                                             double x2,
-                                                             uint32_t samples) {
-  Function* g = new Function();
-
-  for (size_t i = 0; i < samples; i++) {
-    double x = x1 + (x2 - x1) * i / (samples - 1);
-    double y = Evaluate(f, x);
-    g->push_back(Point(x, y));
-  }
-
-  delete f;
-  return g;
-}
-
-double VirtualSocketServer::Evaluate(Function* f, double x) {
-  Function::iterator iter =
-      std::lower_bound(f->begin(), f->end(), x, FunctionDomainCmp());
-  if (iter == f->begin()) {
-    return (*f)[0].second;
-  } else if (iter == f->end()) {
-    RTC_DCHECK(f->size() >= 1);
-    return (*f)[f->size() - 1].second;
-  } else if (iter->first == x) {
-    return iter->second;
-  } else {
-    double x1 = (iter - 1)->first;
-    double y1 = (iter - 1)->second;
-    double x2 = iter->first;
-    double y2 = iter->second;
-    return y1 + (y2 - y1) * (x - x1) / (x2 - x1);
-  }
-}
-
-bool VirtualSocketServer::CanInteractWith(VirtualSocket* local,
-                                          VirtualSocket* remote) {
-  if (!local || !remote) {
-    return false;
-  }
-  IPAddress local_ip = local->GetLocalAddress().ipaddr();
-  IPAddress remote_ip = remote->GetLocalAddress().ipaddr();
-  IPAddress local_normalized = local_ip.Normalized();
-  IPAddress remote_normalized = remote_ip.Normalized();
-  // Check if the addresses are the same family after Normalization (turns
-  // mapped IPv6 address into IPv4 addresses).
-  // This will stop unmapped V6 addresses from talking to mapped V6 addresses.
-  if (local_normalized.family() == remote_normalized.family()) {
-    return true;
-  }
-
-  // If ip1 is IPv4 and ip2 is :: and ip2 is not IPV6_V6ONLY.
-  int remote_v6_only = 0;
-  remote->GetOption(Socket::OPT_IPV6_V6ONLY, &remote_v6_only);
-  if (local_ip.family() == AF_INET && !remote_v6_only && IPIsAny(remote_ip)) {
-    return true;
-  }
-  // Same check, backwards.
-  int local_v6_only = 0;
-  local->GetOption(Socket::OPT_IPV6_V6ONLY, &local_v6_only);
-  if (remote_ip.family() == AF_INET && !local_v6_only && IPIsAny(local_ip)) {
-    return true;
-  }
-
-  // Check to see if either socket was explicitly bound to IPv6-any.
-  // These sockets can talk with anyone.
-  if (local_ip.family() == AF_INET6 && local->was_any()) {
-    return true;
-  }
-  if (remote_ip.family() == AF_INET6 && remote->was_any()) {
-    return true;
-  }
-
-  return false;
-}
-
-IPAddress VirtualSocketServer::GetDefaultRoute(int family) {
-  if (family == AF_INET) {
-    return default_route_v4_;
-  }
-  if (family == AF_INET6) {
-    return default_route_v6_;
-  }
-  return IPAddress();
-}
-void VirtualSocketServer::SetDefaultRoute(const IPAddress& from_addr) {
-  RTC_DCHECK(!IPIsAny(from_addr));
-  if (from_addr.family() == AF_INET) {
-    default_route_v4_ = from_addr;
-  } else if (from_addr.family() == AF_INET6) {
-    default_route_v6_ = from_addr;
-  }
-}
-
-}  // namespace rtc
diff --git a/rtc_base/virtualsocketserver.h b/rtc_base/virtualsocketserver.h
deleted file mode 100644
index 089e73a..0000000
--- a/rtc_base/virtualsocketserver.h
+++ /dev/null
@@ -1,405 +0,0 @@
-/*
- *  Copyright 2004 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_RTC_BASE_VIRTUALSOCKETSERVER_H_
-#define WEBRTC_RTC_BASE_VIRTUALSOCKETSERVER_H_
-
-#include <deque>
-#include <map>
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/event.h"
-#include "webrtc/rtc_base/fakeclock.h"
-#include "webrtc/rtc_base/messagequeue.h"
-#include "webrtc/rtc_base/socketserver.h"
-
-namespace rtc {
-
-class Packet;
-class VirtualSocket;
-class SocketAddressPair;
-
-// Simulates a network in the same manner as a loopback interface.  The
-// interface can create as many addresses as you want.  All of the sockets
-// created by this network will be able to communicate with one another, unless
-// they are bound to addresses from incompatible families.
-class VirtualSocketServer : public SocketServer, public sigslot::has_slots<> {
- public:
-  VirtualSocketServer();
-  // This constructor needs to be used if the test uses a fake clock and
-  // ProcessMessagesUntilIdle, since ProcessMessagesUntilIdle needs a way of
-  // advancing time.
-  explicit VirtualSocketServer(FakeClock* fake_clock);
-  ~VirtualSocketServer() override;
-
-  // The default route indicates which local address to use when a socket is
-  // bound to the 'any' address, e.g. 0.0.0.0.
-  IPAddress GetDefaultRoute(int family);
-  void SetDefaultRoute(const IPAddress& from_addr);
-
-  // Limits the network bandwidth (maximum bytes per second).  Zero means that
-  // all sends occur instantly.  Defaults to 0.
-  uint32_t bandwidth() const { return bandwidth_; }
-  void set_bandwidth(uint32_t bandwidth) { bandwidth_ = bandwidth; }
-
-  // Limits the amount of data which can be in flight on the network without
-  // packet loss (on a per sender basis).  Defaults to 64 KB.
-  uint32_t network_capacity() const { return network_capacity_; }
-  void set_network_capacity(uint32_t capacity) { network_capacity_ = capacity; }
-
-  // The amount of data which can be buffered by tcp on the sender's side
-  uint32_t send_buffer_capacity() const { return send_buffer_capacity_; }
-  void set_send_buffer_capacity(uint32_t capacity) {
-    send_buffer_capacity_ = capacity;
-  }
-
-  // The amount of data which can be buffered by tcp on the receiver's side
-  uint32_t recv_buffer_capacity() const { return recv_buffer_capacity_; }
-  void set_recv_buffer_capacity(uint32_t capacity) {
-    recv_buffer_capacity_ = capacity;
-  }
-
-  // Controls the (transit) delay for packets sent in the network.  This does
-  // not inclue the time required to sit in the send queue.  Both of these
-  // values are measured in milliseconds.  Defaults to no delay.
-  uint32_t delay_mean() const { return delay_mean_; }
-  uint32_t delay_stddev() const { return delay_stddev_; }
-  uint32_t delay_samples() const { return delay_samples_; }
-  void set_delay_mean(uint32_t delay_mean) { delay_mean_ = delay_mean; }
-  void set_delay_stddev(uint32_t delay_stddev) { delay_stddev_ = delay_stddev; }
-  void set_delay_samples(uint32_t delay_samples) {
-    delay_samples_ = delay_samples;
-  }
-
-  // If the (transit) delay parameters are modified, this method should be
-  // called to recompute the new distribution.
-  void UpdateDelayDistribution();
-
-  // Controls the (uniform) probability that any sent packet is dropped.  This
-  // is separate from calculations to drop based on queue size.
-  double drop_probability() { return drop_prob_; }
-  void set_drop_probability(double drop_prob) {
-    RTC_DCHECK_GE(drop_prob, 0.0);
-    RTC_DCHECK_LE(drop_prob, 1.0);
-    drop_prob_ = drop_prob;
-  }
-
-  // If |blocked| is true, subsequent attempts to send will result in -1 being
-  // returned, with the socket error set to EWOULDBLOCK.
-  //
-  // If this method is later called with |blocked| set to false, any sockets
-  // that previously failed to send with EWOULDBLOCK will emit SignalWriteEvent.
-  //
-  // This can be used to simulate the send buffer on a network interface being
-  // full, and test functionality related to EWOULDBLOCK/SignalWriteEvent.
-  void SetSendingBlocked(bool blocked);
-
-  // SocketFactory:
-  Socket* CreateSocket(int type) override;
-  Socket* CreateSocket(int family, int type) override;
-
-  AsyncSocket* CreateAsyncSocket(int type) override;
-  AsyncSocket* CreateAsyncSocket(int family, int type) override;
-
-  // SocketServer:
-  void SetMessageQueue(MessageQueue* queue) override;
-  bool Wait(int cms, bool process_io) override;
-  void WakeUp() override;
-
-  void SetDelayOnAddress(const rtc::SocketAddress& address, int delay_ms) {
-    delay_by_ip_[address.ipaddr()] = delay_ms;
-  }
-
-  // Used by TurnPortTest and TcpPortTest (for example), to mimic a case where
-  // a proxy returns the local host address instead of the original one the
-  // port was bound against. Please see WebRTC issue 3927 for more detail.
-  //
-  // If SetAlternativeLocalAddress(A, B) is called, then when something
-  // attempts to bind a socket to address A, it will get a socket bound to
-  // address B instead.
-  void SetAlternativeLocalAddress(const rtc::IPAddress& address,
-                                  const rtc::IPAddress& alternative);
-
-  typedef std::pair<double, double> Point;
-  typedef std::vector<Point> Function;
-
-  static Function* CreateDistribution(uint32_t mean,
-                                      uint32_t stddev,
-                                      uint32_t samples);
-
-  // Similar to Thread::ProcessMessages, but it only processes messages until
-  // there are no immediate messages or pending network traffic.  Returns false
-  // if Thread::Stop() was called.
-  bool ProcessMessagesUntilIdle();
-
-  // Sets the next port number to use for testing.
-  void SetNextPortForTesting(uint16_t port);
-
-  // Close a pair of Tcp connections by addresses. Both connections will have
-  // its own OnClose invoked.
-  bool CloseTcpConnections(const SocketAddress& addr_local,
-                           const SocketAddress& addr_remote);
-
-  // For testing purpose only. Fired when a client socket is created.
-  sigslot::signal1<VirtualSocket*> SignalSocketCreated;
-
- protected:
-  // Returns a new IP not used before in this network.
-  IPAddress GetNextIP(int family);
-  uint16_t GetNextPort();
-
-  VirtualSocket* CreateSocketInternal(int family, int type);
-
-  // Binds the given socket to addr, assigning and IP and Port if necessary
-  int Bind(VirtualSocket* socket, SocketAddress* addr);
-
-  // Binds the given socket to the given (fully-defined) address.
-  int Bind(VirtualSocket* socket, const SocketAddress& addr);
-
-  // Find the socket bound to the given address
-  VirtualSocket* LookupBinding(const SocketAddress& addr);
-
-  int Unbind(const SocketAddress& addr, VirtualSocket* socket);
-
-  // Adds a mapping between this socket pair and the socket.
-  void AddConnection(const SocketAddress& client,
-                     const SocketAddress& server,
-                     VirtualSocket* socket);
-
-  // Find the socket pair corresponding to this server address.
-  VirtualSocket* LookupConnection(const SocketAddress& client,
-                                  const SocketAddress& server);
-
-  void RemoveConnection(const SocketAddress& client,
-                        const SocketAddress& server);
-
-  // Connects the given socket to the socket at the given address
-  int Connect(VirtualSocket* socket, const SocketAddress& remote_addr,
-              bool use_delay);
-
-  // Sends a disconnect message to the socket at the given address
-  bool Disconnect(VirtualSocket* socket);
-
-  // Sends the given packet to the socket at the given address (if one exists).
-  int SendUdp(VirtualSocket* socket, const char* data, size_t data_size,
-              const SocketAddress& remote_addr);
-
-  // Moves as much data as possible from the sender's buffer to the network
-  void SendTcp(VirtualSocket* socket);
-
-  // Places a packet on the network.
-  void AddPacketToNetwork(VirtualSocket* socket,
-                          VirtualSocket* recipient,
-                          int64_t cur_time,
-                          const char* data,
-                          size_t data_size,
-                          size_t header_size,
-                          bool ordered);
-
-  // Removes stale packets from the network
-  void PurgeNetworkPackets(VirtualSocket* socket, int64_t cur_time);
-
-  // Computes the number of milliseconds required to send a packet of this size.
-  uint32_t SendDelay(uint32_t size);
-
-  // If the delay has been set for the address of the socket, returns the set
-  // delay. Otherwise, returns a random transit delay chosen from the
-  // appropriate distribution.
-  uint32_t GetTransitDelay(Socket* socket);
-
-  // Basic operations on functions.  Those that return a function also take
-  // ownership of the function given (and hence, may modify or delete it).
-  static Function* Accumulate(Function* f);
-  static Function* Invert(Function* f);
-  static Function* Resample(Function* f,
-                            double x1,
-                            double x2,
-                            uint32_t samples);
-  static double Evaluate(Function* f, double x);
-
-  // Null out our message queue if it goes away. Necessary in the case where
-  // our lifetime is greater than that of the thread we are using, since we
-  // try to send Close messages for all connected sockets when we shutdown.
-  void OnMessageQueueDestroyed() { msg_queue_ = nullptr; }
-
-  // Determine if two sockets should be able to communicate.
-  // We don't (currently) specify an address family for sockets; instead,
-  // the currently bound address is used to infer the address family.
-  // Any socket that is not explicitly bound to an IPv4 address is assumed to be
-  // dual-stack capable.
-  // This function tests if two addresses can communicate, as well as the
-  // sockets to which they may be bound (the addresses may or may not yet be
-  // bound to the sockets).
-  // First the addresses are tested (after normalization):
-  // If both have the same family, then communication is OK.
-  // If only one is IPv4 then false, unless the other is bound to ::.
-  // This applies even if the IPv4 address is 0.0.0.0.
-  // The socket arguments are optional; the sockets are checked to see if they
-  // were explicitly bound to IPv6-any ('::'), and if so communication is
-  // permitted.
-  // NB: This scheme doesn't permit non-dualstack IPv6 sockets.
-  static bool CanInteractWith(VirtualSocket* local, VirtualSocket* remote);
-
- private:
-  friend class VirtualSocket;
-
-  // Sending was previously blocked, but now isn't.
-  sigslot::signal0<> SignalReadyToSend;
-
-  typedef std::map<SocketAddress, VirtualSocket*> AddressMap;
-  typedef std::map<SocketAddressPair, VirtualSocket*> ConnectionMap;
-
-  // May be null if the test doesn't use a fake clock, or it does but doesn't
-  // use ProcessMessagesUntilIdle.
-  FakeClock* fake_clock_ = nullptr;
-
-  // Used to implement Wait/WakeUp.
-  Event wakeup_;
-  MessageQueue* msg_queue_;
-  bool stop_on_idle_;
-  in_addr next_ipv4_;
-  in6_addr next_ipv6_;
-  uint16_t next_port_;
-  AddressMap* bindings_;
-  ConnectionMap* connections_;
-
-  IPAddress default_route_v4_;
-  IPAddress default_route_v6_;
-
-  uint32_t bandwidth_;
-  uint32_t network_capacity_;
-  uint32_t send_buffer_capacity_;
-  uint32_t recv_buffer_capacity_;
-  uint32_t delay_mean_;
-  uint32_t delay_stddev_;
-  uint32_t delay_samples_;
-
-  std::map<rtc::IPAddress, int> delay_by_ip_;
-  std::map<rtc::IPAddress, rtc::IPAddress> alternative_address_mapping_;
-  std::unique_ptr<Function> delay_dist_;
-
-  CriticalSection delay_crit_;
-
-  double drop_prob_;
-  bool sending_blocked_ = false;
-  RTC_DISALLOW_COPY_AND_ASSIGN(VirtualSocketServer);
-};
-
-// Implements the socket interface using the virtual network.  Packets are
-// passed as messages using the message queue of the socket server.
-class VirtualSocket : public AsyncSocket,
-                      public MessageHandler,
-                      public sigslot::has_slots<> {
- public:
-  VirtualSocket(VirtualSocketServer* server, int family, int type, bool async);
-  ~VirtualSocket() override;
-
-  SocketAddress GetLocalAddress() const override;
-  SocketAddress GetRemoteAddress() const override;
-
-  int Bind(const SocketAddress& addr) override;
-  int Connect(const SocketAddress& addr) override;
-  int Close() override;
-  int Send(const void* pv, size_t cb) override;
-  int SendTo(const void* pv, size_t cb, const SocketAddress& addr) override;
-  int Recv(void* pv, size_t cb, int64_t* timestamp) override;
-  int RecvFrom(void* pv,
-               size_t cb,
-               SocketAddress* paddr,
-               int64_t* timestamp) override;
-  int Listen(int backlog) override;
-  VirtualSocket* Accept(SocketAddress* paddr) override;
-
-  int GetError() const override;
-  void SetError(int error) override;
-  ConnState GetState() const override;
-  int GetOption(Option opt, int* value) override;
-  int SetOption(Option opt, int value) override;
-  void OnMessage(Message* pmsg) override;
-
-  bool was_any() { return was_any_; }
-  void set_was_any(bool was_any) { was_any_ = was_any; }
-
-  // For testing purpose only. Fired when client socket is bound to an address.
-  sigslot::signal2<VirtualSocket*, const SocketAddress&> SignalAddressReady;
-
- private:
-  struct NetworkEntry {
-    size_t size;
-    int64_t done_time;
-  };
-
-  typedef std::deque<SocketAddress> ListenQueue;
-  typedef std::deque<NetworkEntry> NetworkQueue;
-  typedef std::vector<char> SendBuffer;
-  typedef std::list<Packet*> RecvBuffer;
-  typedef std::map<Option, int> OptionsMap;
-
-  int InitiateConnect(const SocketAddress& addr, bool use_delay);
-  void CompleteConnect(const SocketAddress& addr, bool notify);
-  int SendUdp(const void* pv, size_t cb, const SocketAddress& addr);
-  int SendTcp(const void* pv, size_t cb);
-
-  // Used by server sockets to set the local address without binding.
-  void SetLocalAddress(const SocketAddress& addr);
-
-  void OnSocketServerReadyToSend();
-
-  VirtualSocketServer* server_;
-  int type_;
-  bool async_;
-  ConnState state_;
-  int error_;
-  SocketAddress local_addr_;
-  SocketAddress remote_addr_;
-
-  // Pending sockets which can be Accepted
-  ListenQueue* listen_queue_;
-
-  // Data which tcp has buffered for sending
-  SendBuffer send_buffer_;
-  // Set to false if the last attempt to send resulted in EWOULDBLOCK.
-  // Set back to true when the socket can send again.
-  bool ready_to_send_ = true;
-
-  // Critical section to protect the recv_buffer and queue_
-  CriticalSection crit_;
-
-  // Network model that enforces bandwidth and capacity constraints
-  NetworkQueue network_;
-  size_t network_size_;
-  // The scheduled delivery time of the last packet sent on this socket.
-  // It is used to ensure ordered delivery of packets sent on this socket.
-  int64_t last_delivery_time_ = 0;
-
-  // Data which has been received from the network
-  RecvBuffer recv_buffer_;
-  // The amount of data which is in flight or in recv_buffer_
-  size_t recv_buffer_size_;
-
-  // Is this socket bound?
-  bool bound_;
-
-  // When we bind a socket to Any, VSS's Bind gives it another address. For
-  // dual-stack sockets, we want to distinguish between sockets that were
-  // explicitly given a particular address and sockets that had one picked
-  // for them by VSS.
-  bool was_any_;
-
-  // Store the options that are set
-  OptionsMap options_map_;
-
-  friend class VirtualSocketServer;
-};
-
-}  // namespace rtc
-
-#endif  // WEBRTC_RTC_BASE_VIRTUALSOCKETSERVER_H_
diff --git a/rtc_base/weak_ptr.cc b/rtc_base/weak_ptr.cc
deleted file mode 100644
index 3693a94..0000000
--- a/rtc_base/weak_ptr.cc
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- *  Copyright 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/rtc_base/weak_ptr.h"
-
-// The implementation is borrowed from chromium except that it does not
-// implement SupportsWeakPtr.
-
-namespace rtc {
-namespace internal {
-
-WeakReference::Flag::Flag() : is_valid_(true) {
-  // Flags only become bound when checked for validity, or invalidated,
-  // so that we can check that later validity/invalidation operations on
-  // the same Flag take place on the same sequence.
-  checker_.Detach();
-}
-
-void WeakReference::Flag::Invalidate() {
-  RTC_DCHECK(checker_.CalledSequentially())
-      << "WeakPtrs must be invalidated on the same sequence.";
-  is_valid_ = false;
-}
-
-bool WeakReference::Flag::IsValid() const {
-  RTC_DCHECK(checker_.CalledSequentially())
-      << "WeakPtrs must be checked on the same sequence.";
-  return is_valid_;
-}
-
-WeakReference::Flag::~Flag() {}
-
-WeakReference::WeakReference() {}
-
-WeakReference::WeakReference(const Flag* flag) : flag_(flag) {}
-
-WeakReference::~WeakReference() {}
-
-WeakReference::WeakReference(WeakReference&& other) = default;
-
-WeakReference::WeakReference(const WeakReference& other) = default;
-
-bool WeakReference::is_valid() const {
-  return flag_.get() && flag_->IsValid();
-}
-
-WeakReferenceOwner::WeakReferenceOwner() {
-  checker_.Detach();
-}
-
-WeakReferenceOwner::~WeakReferenceOwner() {
-  RTC_DCHECK(checker_.CalledSequentially());
-  Invalidate();
-}
-
-WeakReference WeakReferenceOwner::GetRef() const {
-  RTC_DCHECK(checker_.CalledSequentially());
-  // If we hold the last reference to the Flag then create a new one.
-  if (!HasRefs())
-    flag_ = new RefCountedObject<WeakReference::Flag>();
-
-  return WeakReference(flag_.get());
-}
-
-void WeakReferenceOwner::Invalidate() {
-  RTC_DCHECK(checker_.CalledSequentially());
-  if (flag_.get()) {
-    flag_->Invalidate();
-    flag_ = nullptr;
-  }
-}
-
-WeakPtrBase::WeakPtrBase() {}
-
-WeakPtrBase::~WeakPtrBase() {}
-
-WeakPtrBase::WeakPtrBase(const WeakReference& ref) : ref_(ref) {}
-
-}  // namespace internal
-}  // namespace rtc
diff --git a/rtc_base/weak_ptr.h b/rtc_base/weak_ptr.h
deleted file mode 100644
index 0e82612..0000000
--- a/rtc_base/weak_ptr.h
+++ /dev/null
@@ -1,272 +0,0 @@
-/*
- *  Copyright 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_RTC_BASE_WEAK_PTR_H_
-#define WEBRTC_RTC_BASE_WEAK_PTR_H_
-
-#include <memory>
-
-#include <utility>
-
-#include "webrtc/rtc_base/refcount.h"
-#include "webrtc/rtc_base/scoped_ref_ptr.h"
-#include "webrtc/rtc_base/sequenced_task_checker.h"
-
-// The implementation is borrowed from chromium except that it does not
-// implement SupportsWeakPtr.
-
-// Weak pointers are pointers to an object that do not affect its lifetime,
-// and which may be invalidated (i.e. reset to nullptr) by the object, or its
-// owner, at any time, most commonly when the object is about to be deleted.
-
-// Weak pointers are useful when an object needs to be accessed safely by one
-// or more objects other than its owner, and those callers can cope with the
-// object vanishing and e.g. tasks posted to it being silently dropped.
-// Reference-counting such an object would complicate the ownership graph and
-// make it harder to reason about the object's lifetime.
-
-// EXAMPLE:
-//
-//  class Controller {
-//   public:
-//    Controller() : weak_factory_(this) {}
-//    void SpawnWorker() { Worker::StartNew(weak_factory_.GetWeakPtr()); }
-//    void WorkComplete(const Result& result) { ... }
-//   private:
-//    // Member variables should appear before the WeakPtrFactory, to ensure
-//    // that any WeakPtrs to Controller are invalidated before its members
-//    // variable's destructors are executed, rendering them invalid.
-//    WeakPtrFactory<Controller> weak_factory_;
-//  };
-//
-//  class Worker {
-//   public:
-//    static void StartNew(const WeakPtr<Controller>& controller) {
-//      Worker* worker = new Worker(controller);
-//      // Kick off asynchronous processing...
-//    }
-//   private:
-//    Worker(const WeakPtr<Controller>& controller)
-//        : controller_(controller) {}
-//    void DidCompleteAsynchronousProcessing(const Result& result) {
-//      if (controller_)
-//        controller_->WorkComplete(result);
-//    }
-//    WeakPtr<Controller> controller_;
-//  };
-//
-// With this implementation a caller may use SpawnWorker() to dispatch multiple
-// Workers and subsequently delete the Controller, without waiting for all
-// Workers to have completed.
-
-// ------------------------- IMPORTANT: Thread-safety -------------------------
-
-// Weak pointers may be passed safely between threads, but must always be
-// dereferenced and invalidated on the same TaskQueue or thread, otherwise
-// checking the pointer would be racey.
-//
-// To ensure correct use, the first time a WeakPtr issued by a WeakPtrFactory
-// is dereferenced, the factory and its WeakPtrs become bound to the calling
-// TaskQueue/thread, and cannot be dereferenced or
-// invalidated on any other TaskQueue/thread. Bound WeakPtrs can still be handed
-// off to other TaskQueues, e.g. to use to post tasks back to object on the
-// bound sequence.
-//
-// Thus, at least one WeakPtr object must exist and have been dereferenced on
-// the correct thread to enforce that other WeakPtr objects will enforce they
-// are used on the desired thread.
-
-namespace rtc {
-
-namespace internal {
-
-class WeakReference {
- public:
-  // Although Flag is bound to a specific sequence, it may be
-  // deleted from another via base::WeakPtr::~WeakPtr().
-  class Flag : public RefCountInterface {
-   public:
-    Flag();
-
-    void Invalidate();
-    bool IsValid() const;
-
-   private:
-    friend class RefCountedObject<Flag>;
-
-    ~Flag() override;
-
-    SequencedTaskChecker checker_;
-    bool is_valid_;
-  };
-
-  WeakReference();
-  explicit WeakReference(const Flag* flag);
-  ~WeakReference();
-
-  WeakReference(WeakReference&& other);
-  WeakReference(const WeakReference& other);
-  WeakReference& operator=(WeakReference&& other) = default;
-  WeakReference& operator=(const WeakReference& other) = default;
-
-  bool is_valid() const;
-
- private:
-  scoped_refptr<const Flag> flag_;
-};
-
-class WeakReferenceOwner {
- public:
-  WeakReferenceOwner();
-  ~WeakReferenceOwner();
-
-  WeakReference GetRef() const;
-
-  bool HasRefs() const { return flag_.get() && !flag_->HasOneRef(); }
-
-  void Invalidate();
-
- private:
-  SequencedTaskChecker checker_;
-  mutable scoped_refptr<RefCountedObject<WeakReference::Flag>> flag_;
-};
-
-// This class simplifies the implementation of WeakPtr's type conversion
-// constructor by avoiding the need for a public accessor for ref_.  A
-// WeakPtr<T> cannot access the private members of WeakPtr<U>, so this
-// base class gives us a way to access ref_ in a protected fashion.
-class WeakPtrBase {
- public:
-  WeakPtrBase();
-  ~WeakPtrBase();
-
-  WeakPtrBase(const WeakPtrBase& other) = default;
-  WeakPtrBase(WeakPtrBase&& other) = default;
-  WeakPtrBase& operator=(const WeakPtrBase& other) = default;
-  WeakPtrBase& operator=(WeakPtrBase&& other) = default;
-
- protected:
-  explicit WeakPtrBase(const WeakReference& ref);
-
-  WeakReference ref_;
-};
-
-}  // namespace internal
-
-template <typename T>
-class WeakPtrFactory;
-
-template <typename T>
-class WeakPtr : public internal::WeakPtrBase {
- public:
-  WeakPtr() : ptr_(nullptr) {}
-
-  // Allow conversion from U to T provided U "is a" T. Note that this
-  // is separate from the (implicit) copy and move constructors.
-  template <typename U>
-  WeakPtr(const WeakPtr<U>& other)
-      : internal::WeakPtrBase(other), ptr_(other.ptr_) {}
-  template <typename U>
-  WeakPtr(WeakPtr<U>&& other)
-      : internal::WeakPtrBase(std::move(other)), ptr_(other.ptr_) {}
-
-  T* get() const { return ref_.is_valid() ? ptr_ : nullptr; }
-
-  T& operator*() const {
-    RTC_DCHECK(get() != nullptr);
-    return *get();
-  }
-  T* operator->() const {
-    RTC_DCHECK(get() != nullptr);
-    return get();
-  }
-
-  void reset() {
-    ref_ = internal::WeakReference();
-    ptr_ = nullptr;
-  }
-
-  // Allow conditionals to test validity, e.g. if (weak_ptr) {...};
-  explicit operator bool() const { return get() != nullptr; }
-
- private:
-  template <typename U>
-  friend class WeakPtr;
-  friend class WeakPtrFactory<T>;
-
-  WeakPtr(const internal::WeakReference& ref, T* ptr)
-      : internal::WeakPtrBase(ref), ptr_(ptr) {}
-
-  // This pointer is only valid when ref_.is_valid() is true.  Otherwise, its
-  // value is undefined (as opposed to nullptr).
-  T* ptr_;
-};
-
-// Allow callers to compare WeakPtrs against nullptr to test validity.
-template <class T>
-bool operator!=(const WeakPtr<T>& weak_ptr, std::nullptr_t) {
-  return !(weak_ptr == nullptr);
-}
-template <class T>
-bool operator!=(std::nullptr_t, const WeakPtr<T>& weak_ptr) {
-  return weak_ptr != nullptr;
-}
-template <class T>
-bool operator==(const WeakPtr<T>& weak_ptr, std::nullptr_t) {
-  return weak_ptr.get() == nullptr;
-}
-template <class T>
-bool operator==(std::nullptr_t, const WeakPtr<T>& weak_ptr) {
-  return weak_ptr == nullptr;
-}
-
-// A class may be composed of a WeakPtrFactory and thereby
-// control how it exposes weak pointers to itself.  This is helpful if you only
-// need weak pointers within the implementation of a class.  This class is also
-// useful when working with primitive types.  For example, you could have a
-// WeakPtrFactory<bool> that is used to pass around a weak reference to a bool.
-
-// Note that GetWeakPtr must be called on one and only one TaskQueue or thread
-// and the WeakPtr must only be dereferenced and invalidated on that same
-// TaskQueue/thread. A WeakPtr instance can be copied and posted to other
-// sequences though as long as it is not dereferenced (WeakPtr<T>::get()).
-template <class T>
-class WeakPtrFactory {
- public:
-  explicit WeakPtrFactory(T* ptr) : ptr_(ptr) {}
-
-  ~WeakPtrFactory() { ptr_ = nullptr; }
-
-  WeakPtr<T> GetWeakPtr() {
-    RTC_DCHECK(ptr_);
-    return WeakPtr<T>(weak_reference_owner_.GetRef(), ptr_);
-  }
-
-  // Call this method to invalidate all existing weak pointers.
-  void InvalidateWeakPtrs() {
-    RTC_DCHECK(ptr_);
-    weak_reference_owner_.Invalidate();
-  }
-
-  // Call this method to determine if any weak pointers exist.
-  bool HasWeakPtrs() const {
-    RTC_DCHECK(ptr_);
-    return weak_reference_owner_.HasRefs();
-  }
-
- private:
-  internal::WeakReferenceOwner weak_reference_owner_;
-  T* ptr_;
-  RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(WeakPtrFactory);
-};
-
-}  // namespace rtc
-
-#endif  // WEBRTC_RTC_BASE_WEAK_PTR_H_
diff --git a/rtc_base/weak_ptr_unittest.cc b/rtc_base/weak_ptr_unittest.cc
deleted file mode 100644
index d6da234..0000000
--- a/rtc_base/weak_ptr_unittest.cc
+++ /dev/null
@@ -1,233 +0,0 @@
-/*
- *  Copyright 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 <string>
-
-#include "webrtc/rtc_base/gunit.h"
-#include "webrtc/rtc_base/task_queue.h"
-#include "webrtc/rtc_base/weak_ptr.h"
-
-namespace rtc {
-
-namespace {
-
-struct Base {
-  std::string member;
-};
-struct Derived : public Base {};
-
-struct Target {};
-
-struct Arrow {
-  WeakPtr<Target> target;
-};
-
-struct TargetWithFactory : public Target {
-  TargetWithFactory() : factory(this) {}
-  WeakPtrFactory<Target> factory;
-};
-
-}  // namespace
-
-TEST(WeakPtrFactoryTest, Basic) {
-  int data;
-  WeakPtrFactory<int> factory(&data);
-  WeakPtr<int> ptr = factory.GetWeakPtr();
-  EXPECT_EQ(&data, ptr.get());
-}
-
-TEST(WeakPtrFactoryTest, Comparison) {
-  int data;
-  WeakPtrFactory<int> factory(&data);
-  WeakPtr<int> ptr = factory.GetWeakPtr();
-  WeakPtr<int> ptr2 = ptr;
-  EXPECT_EQ(ptr.get(), ptr2.get());
-}
-
-TEST(WeakPtrFactoryTest, Move) {
-  int data;
-  WeakPtrFactory<int> factory(&data);
-  WeakPtr<int> ptr = factory.GetWeakPtr();
-  WeakPtr<int> ptr2 = factory.GetWeakPtr();
-  WeakPtr<int> ptr3 = std::move(ptr2);
-  EXPECT_NE(ptr.get(), ptr2.get());
-  EXPECT_EQ(ptr.get(), ptr3.get());
-}
-
-TEST(WeakPtrFactoryTest, OutOfScope) {
-  WeakPtr<int> ptr;
-  EXPECT_EQ(nullptr, ptr.get());
-  {
-    int data;
-    WeakPtrFactory<int> factory(&data);
-    ptr = factory.GetWeakPtr();
-    EXPECT_EQ(&data, ptr.get());
-  }
-  EXPECT_EQ(nullptr, ptr.get());
-}
-
-TEST(WeakPtrFactoryTest, Multiple) {
-  WeakPtr<int> a, b;
-  {
-    int data;
-    WeakPtrFactory<int> factory(&data);
-    a = factory.GetWeakPtr();
-    b = factory.GetWeakPtr();
-    EXPECT_EQ(&data, a.get());
-    EXPECT_EQ(&data, b.get());
-  }
-  EXPECT_EQ(nullptr, a.get());
-  EXPECT_EQ(nullptr, b.get());
-}
-
-TEST(WeakPtrFactoryTest, MultipleStaged) {
-  WeakPtr<int> a;
-  {
-    int data;
-    WeakPtrFactory<int> factory(&data);
-    a = factory.GetWeakPtr();
-    { WeakPtr<int> b = factory.GetWeakPtr(); }
-    EXPECT_NE(nullptr, a.get());
-  }
-  EXPECT_EQ(nullptr, a.get());
-}
-
-TEST(WeakPtrFactoryTest, Dereference) {
-  Base data;
-  data.member = "123456";
-  WeakPtrFactory<Base> factory(&data);
-  WeakPtr<Base> ptr = factory.GetWeakPtr();
-  EXPECT_EQ(&data, ptr.get());
-  EXPECT_EQ(data.member, (*ptr).member);
-  EXPECT_EQ(data.member, ptr->member);
-}
-
-TEST(WeakPtrFactoryTest, UpCast) {
-  Derived data;
-  WeakPtrFactory<Derived> factory(&data);
-  WeakPtr<Base> ptr = factory.GetWeakPtr();
-  ptr = factory.GetWeakPtr();
-  EXPECT_EQ(ptr.get(), &data);
-}
-
-TEST(WeakPtrTest, DefaultConstructor) {
-  WeakPtr<int> ptr;
-  EXPECT_EQ(nullptr, ptr.get());
-}
-
-TEST(WeakPtrFactoryTest, BooleanTesting) {
-  int data;
-  WeakPtrFactory<int> factory(&data);
-
-  WeakPtr<int> ptr_to_an_instance = factory.GetWeakPtr();
-  EXPECT_TRUE(ptr_to_an_instance);
-  EXPECT_FALSE(!ptr_to_an_instance);
-
-  if (ptr_to_an_instance) {
-  } else {
-    ADD_FAILURE() << "Pointer to an instance should result in true.";
-  }
-
-  if (!ptr_to_an_instance) {  // check for operator!().
-    ADD_FAILURE() << "Pointer to an instance should result in !x being false.";
-  }
-
-  WeakPtr<int> null_ptr;
-  EXPECT_FALSE(null_ptr);
-  EXPECT_TRUE(!null_ptr);
-
-  if (null_ptr) {
-    ADD_FAILURE() << "Null pointer should result in false.";
-  }
-
-  if (!null_ptr) {  // check for operator!().
-  } else {
-    ADD_FAILURE() << "Null pointer should result in !x being true.";
-  }
-}
-
-TEST(WeakPtrFactoryTest, ComparisonToNull) {
-  int data;
-  WeakPtrFactory<int> factory(&data);
-
-  WeakPtr<int> ptr_to_an_instance = factory.GetWeakPtr();
-  EXPECT_NE(nullptr, ptr_to_an_instance);
-  EXPECT_NE(ptr_to_an_instance, nullptr);
-
-  WeakPtr<int> null_ptr;
-  EXPECT_EQ(null_ptr, nullptr);
-  EXPECT_EQ(nullptr, null_ptr);
-}
-
-TEST(WeakPtrTest, InvalidateWeakPtrs) {
-  int data;
-  WeakPtrFactory<int> factory(&data);
-  WeakPtr<int> ptr = factory.GetWeakPtr();
-  EXPECT_EQ(&data, ptr.get());
-  EXPECT_TRUE(factory.HasWeakPtrs());
-  factory.InvalidateWeakPtrs();
-  EXPECT_EQ(nullptr, ptr.get());
-  EXPECT_FALSE(factory.HasWeakPtrs());
-
-  // Test that the factory can create new weak pointers after a
-  // InvalidateWeakPtrs call, and they remain valid until the next
-  // InvalidateWeakPtrs call.
-  WeakPtr<int> ptr2 = factory.GetWeakPtr();
-  EXPECT_EQ(&data, ptr2.get());
-  EXPECT_TRUE(factory.HasWeakPtrs());
-  factory.InvalidateWeakPtrs();
-  EXPECT_EQ(nullptr, ptr2.get());
-  EXPECT_FALSE(factory.HasWeakPtrs());
-}
-
-TEST(WeakPtrTest, HasWeakPtrs) {
-  int data;
-  WeakPtrFactory<int> factory(&data);
-  {
-    WeakPtr<int> ptr = factory.GetWeakPtr();
-    EXPECT_TRUE(factory.HasWeakPtrs());
-  }
-  EXPECT_FALSE(factory.HasWeakPtrs());
-}
-
-template <class T>
-std::unique_ptr<T> NewObjectCreatedOnTaskQueue() {
-  std::unique_ptr<T> obj;
-  TaskQueue queue("NewObjectCreatedOnTaskQueue");
-  Event event(false, false);
-  queue.PostTask([&event, &obj] {
-    obj.reset(new T());
-    event.Set();
-  });
-  EXPECT_TRUE(event.Wait(1000));
-  return obj;
-}
-
-TEST(WeakPtrTest, ObjectAndWeakPtrOnDifferentThreads) {
-  // Test that it is OK to create an object with a WeakPtrFactory one thread,
-  // but use it on another.  This tests that we do not trip runtime checks that
-  // ensure that a WeakPtr is not used by multiple threads.
-  std::unique_ptr<TargetWithFactory> target(
-      NewObjectCreatedOnTaskQueue<TargetWithFactory>());
-  WeakPtr<Target> weak_ptr = target->factory.GetWeakPtr();
-  EXPECT_EQ(target.get(), weak_ptr.get());
-}
-
-TEST(WeakPtrTest, WeakPtrInitiateAndUseOnDifferentThreads) {
-  // Test that it is OK to create an object that has a WeakPtr member on one
-  // thread, but use it on another.  This tests that we do not trip runtime
-  // checks that ensure that a WeakPtr is not used by multiple threads.
-  std::unique_ptr<Arrow> arrow(NewObjectCreatedOnTaskQueue<Arrow>());
-  TargetWithFactory target;
-  arrow->target = target.factory.GetWeakPtr();
-  EXPECT_EQ(&target, arrow->target.get());
-}
-
-}  // namespace rtc
diff --git a/rtc_base/win32.cc b/rtc_base/win32.cc
deleted file mode 100644
index 276b74b..0000000
--- a/rtc_base/win32.cc
+++ /dev/null
@@ -1,461 +0,0 @@
-/*
- *  Copyright 2004 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/rtc_base/win32.h"
-
-#include <winsock2.h>
-#include <ws2tcpip.h>
-#include <algorithm>
-
-#include "webrtc/rtc_base/arraysize.h"
-#include "webrtc/rtc_base/basictypes.h"
-#include "webrtc/rtc_base/byteorder.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-
-namespace rtc {
-
-// Helper function declarations for inet_ntop/inet_pton.
-static const char* inet_ntop_v4(const void* src, char* dst, socklen_t size);
-static const char* inet_ntop_v6(const void* src, char* dst, socklen_t size);
-static int inet_pton_v4(const char* src, void* dst);
-static int inet_pton_v6(const char* src, void* dst);
-
-// Implementation of inet_ntop (create a printable representation of an
-// ip address). XP doesn't have its own inet_ntop, and
-// WSAAddressToString requires both IPv6 to be  installed and for Winsock
-// to be initialized.
-const char* win32_inet_ntop(int af, const void *src,
-                            char* dst, socklen_t size) {
-  if (!src || !dst) {
-    return nullptr;
-  }
-  switch (af) {
-    case AF_INET: {
-      return inet_ntop_v4(src, dst, size);
-    }
-    case AF_INET6: {
-      return inet_ntop_v6(src, dst, size);
-    }
-  }
-  return nullptr;
-}
-
-// As above, but for inet_pton. Implements inet_pton for v4 and v6.
-// Note that our inet_ntop will output normal 'dotted' v4 addresses only.
-int win32_inet_pton(int af, const char* src, void* dst) {
-  if (!src || !dst) {
-    return 0;
-  }
-  if (af == AF_INET) {
-    return inet_pton_v4(src, dst);
-  } else if (af == AF_INET6) {
-    return inet_pton_v6(src, dst);
-  }
-  return -1;
-}
-
-// Helper function for inet_ntop for IPv4 addresses.
-// Outputs "dotted-quad" decimal notation.
-const char* inet_ntop_v4(const void* src, char* dst, socklen_t size) {
-  if (size < INET_ADDRSTRLEN) {
-    return nullptr;
-  }
-  const struct in_addr* as_in_addr =
-      reinterpret_cast<const struct in_addr*>(src);
-  rtc::sprintfn(dst, size, "%d.%d.%d.%d",
-                      as_in_addr->S_un.S_un_b.s_b1,
-                      as_in_addr->S_un.S_un_b.s_b2,
-                      as_in_addr->S_un.S_un_b.s_b3,
-                      as_in_addr->S_un.S_un_b.s_b4);
-  return dst;
-}
-
-// Helper function for inet_ntop for IPv6 addresses.
-const char* inet_ntop_v6(const void* src, char* dst, socklen_t size) {
-  if (size < INET6_ADDRSTRLEN) {
-    return nullptr;
-  }
-  const uint16_t* as_shorts = reinterpret_cast<const uint16_t*>(src);
-  int runpos[8];
-  int current = 1;
-  int max = 0;
-  int maxpos = -1;
-  int run_array_size = arraysize(runpos);
-  // Run over the address marking runs of 0s.
-  for (int i = 0; i < run_array_size; ++i) {
-    if (as_shorts[i] == 0) {
-      runpos[i] = current;
-      if (current > max) {
-        maxpos = i;
-        max = current;
-      }
-      ++current;
-    } else {
-      runpos[i] = -1;
-      current = 1;
-    }
-  }
-
-  if (max > 0) {
-    int tmpmax = maxpos;
-    // Run back through, setting -1 for all but the longest run.
-    for (int i = run_array_size - 1; i >= 0; i--) {
-      if (i > tmpmax) {
-        runpos[i] = -1;
-      } else if (runpos[i] == -1) {
-        // We're less than maxpos, we hit a -1, so the 'good' run is done.
-        // Setting tmpmax -1 means all remaining positions get set to -1.
-        tmpmax = -1;
-      }
-    }
-  }
-
-  char* cursor = dst;
-  // Print IPv4 compatible and IPv4 mapped addresses using the IPv4 helper.
-  // These addresses have an initial run of either eight zero-bytes followed
-  // by 0xFFFF, or an initial run of ten zero-bytes.
-  if (runpos[0] == 1 && (maxpos == 5 ||
-                         (maxpos == 4 && as_shorts[5] == 0xFFFF))) {
-    *cursor++ = ':';
-    *cursor++ = ':';
-    if (maxpos == 4) {
-      cursor += rtc::sprintfn(cursor, INET6_ADDRSTRLEN - 2, "ffff:");
-    }
-    const struct in_addr* as_v4 =
-        reinterpret_cast<const struct in_addr*>(&(as_shorts[6]));
-    inet_ntop_v4(as_v4, cursor,
-                 static_cast<socklen_t>(INET6_ADDRSTRLEN - (cursor - dst)));
-  } else {
-    for (int i = 0; i < run_array_size; ++i) {
-      if (runpos[i] == -1) {
-        cursor += rtc::sprintfn(cursor,
-                                      INET6_ADDRSTRLEN - (cursor - dst),
-                                      "%x", NetworkToHost16(as_shorts[i]));
-        if (i != 7 && runpos[i + 1] != 1) {
-          *cursor++ = ':';
-        }
-      } else if (runpos[i] == 1) {
-        // Entered the run; print the colons and skip the run.
-        *cursor++ = ':';
-        *cursor++ = ':';
-        i += (max - 1);
-      }
-    }
-  }
-  return dst;
-}
-
-// Helper function for inet_pton for IPv4 addresses.
-// |src| points to a character string containing an IPv4 network address in
-// dotted-decimal format, "ddd.ddd.ddd.ddd", where ddd is a decimal number
-// of up to three digits in the range 0 to 255.
-// The address is converted and copied to dst,
-// which must be sizeof(struct in_addr) (4) bytes (32 bits) long.
-int inet_pton_v4(const char* src, void* dst) {
-  const int kIpv4AddressSize = 4;
-  int found = 0;
-  const char* src_pos = src;
-  unsigned char result[kIpv4AddressSize] = {0};
-
-  while (*src_pos != '\0') {
-    // strtol won't treat whitespace characters in the begining as an error,
-    // so check to ensure this is started with digit before passing to strtol.
-    if (!isdigit(*src_pos)) {
-      return 0;
-    }
-    char* end_pos;
-    long value = strtol(src_pos, &end_pos, 10);
-    if (value < 0 || value > 255 || src_pos == end_pos) {
-      return 0;
-    }
-    ++found;
-    if (found > kIpv4AddressSize) {
-      return 0;
-    }
-    result[found - 1] = static_cast<unsigned char>(value);
-    src_pos = end_pos;
-    if (*src_pos == '.') {
-      // There's more.
-      ++src_pos;
-    } else if (*src_pos != '\0') {
-      // If it's neither '.' nor '\0' then return fail.
-      return 0;
-    }
-  }
-  if (found != kIpv4AddressSize) {
-    return 0;
-  }
-  memcpy(dst, result, sizeof(result));
-  return 1;
-}
-
-// Helper function for inet_pton for IPv6 addresses.
-int inet_pton_v6(const char* src, void* dst) {
-  // sscanf will pick any other invalid chars up, but it parses 0xnnnn as hex.
-  // Check for literal x in the input string.
-  const char* readcursor = src;
-  char c = *readcursor++;
-  while (c) {
-    if (c == 'x') {
-      return 0;
-    }
-    c = *readcursor++;
-  }
-  readcursor = src;
-
-  struct in6_addr an_addr;
-  memset(&an_addr, 0, sizeof(an_addr));
-
-  uint16_t* addr_cursor = reinterpret_cast<uint16_t*>(&an_addr.s6_addr[0]);
-  uint16_t* addr_end = reinterpret_cast<uint16_t*>(&an_addr.s6_addr[16]);
-  bool seencompressed = false;
-
-  // Addresses that start with "::" (i.e., a run of initial zeros) or
-  // "::ffff:" can potentially be IPv4 mapped or compatibility addresses.
-  // These have dotted-style IPv4 addresses on the end (e.g. "::192.168.7.1").
-  if (*readcursor == ':' && *(readcursor+1) == ':' &&
-      *(readcursor + 2) != 0) {
-    // Check for periods, which we'll take as a sign of v4 addresses.
-    const char* addrstart = readcursor + 2;
-    if (rtc::strchr(addrstart, ".")) {
-      const char* colon = rtc::strchr(addrstart, "::");
-      if (colon) {
-        uint16_t a_short;
-        int bytesread = 0;
-        if (sscanf(addrstart, "%hx%n", &a_short, &bytesread) != 1 ||
-            a_short != 0xFFFF || bytesread != 4) {
-          // Colons + periods means has to be ::ffff:a.b.c.d. But it wasn't.
-          return 0;
-        } else {
-          an_addr.s6_addr[10] = 0xFF;
-          an_addr.s6_addr[11] = 0xFF;
-          addrstart = colon + 1;
-        }
-      }
-      struct in_addr v4;
-      if (inet_pton_v4(addrstart, &v4.s_addr)) {
-        memcpy(&an_addr.s6_addr[12], &v4, sizeof(v4));
-        memcpy(dst, &an_addr, sizeof(an_addr));
-        return 1;
-      } else {
-        // Invalid v4 address.
-        return 0;
-      }
-    }
-  }
-
-  // For addresses without a trailing IPv4 component ('normal' IPv6 addresses).
-  while (*readcursor != 0 && addr_cursor < addr_end) {
-    if (*readcursor == ':') {
-      if (*(readcursor + 1) == ':') {
-        if (seencompressed) {
-          // Can only have one compressed run of zeroes ("::") per address.
-          return 0;
-        }
-        // Hit a compressed run. Count colons to figure out how much of the
-        // address is skipped.
-        readcursor += 2;
-        const char* coloncounter = readcursor;
-        int coloncount = 0;
-        if (*coloncounter == 0) {
-          // Special case - trailing ::.
-          addr_cursor = addr_end;
-        } else {
-          while (*coloncounter) {
-            if (*coloncounter == ':') {
-              ++coloncount;
-            }
-            ++coloncounter;
-          }
-          // (coloncount + 1) is the number of shorts left in the address.
-          // If this number is greater than the number of available shorts, the
-          // address is malformed.
-          if (coloncount + 1 > addr_end - addr_cursor) {
-            return 0;
-          }
-          addr_cursor = addr_end - (coloncount + 1);
-          seencompressed = true;
-        }
-      } else {
-        ++readcursor;
-      }
-    } else {
-      uint16_t word;
-      int bytesread = 0;
-      if (sscanf(readcursor, "%4hx%n", &word, &bytesread) != 1) {
-        return 0;
-      } else {
-        *addr_cursor = HostToNetwork16(word);
-        ++addr_cursor;
-        readcursor += bytesread;
-        if (*readcursor != ':' && *readcursor != '\0') {
-          return 0;
-        }
-      }
-    }
-  }
-
-  if (*readcursor != '\0' || addr_cursor < addr_end) {
-    // Catches addresses too short or too long.
-    return 0;
-  }
-  memcpy(dst, &an_addr, sizeof(an_addr));
-  return 1;
-}
-
-//
-// Unix time is in seconds relative to 1/1/1970.  So we compute the windows
-// FILETIME of that time/date, then we add/subtract in appropriate units to
-// convert to/from unix time.
-// The units of FILETIME are 100ns intervals, so by multiplying by or dividing
-// by 10000000, we can convert to/from seconds.
-//
-// FileTime = UnixTime*10000000 + FileTime(1970)
-// UnixTime = (FileTime-FileTime(1970))/10000000
-//
-
-void FileTimeToUnixTime(const FILETIME& ft, time_t* ut) {
-  RTC_DCHECK(nullptr != ut);
-
-  // FILETIME has an earlier date base than time_t (1/1/1970), so subtract off
-  // the difference.
-  SYSTEMTIME base_st;
-  memset(&base_st, 0, sizeof(base_st));
-  base_st.wDay = 1;
-  base_st.wMonth = 1;
-  base_st.wYear = 1970;
-
-  FILETIME base_ft;
-  SystemTimeToFileTime(&base_st, &base_ft);
-
-  ULARGE_INTEGER base_ul, current_ul;
-  memcpy(&base_ul, &base_ft, sizeof(FILETIME));
-  memcpy(&current_ul, &ft, sizeof(FILETIME));
-
-  // Divide by big number to convert to seconds, then subtract out the 1970
-  // base date value.
-  const ULONGLONG RATIO = 10000000;
-  *ut = static_cast<time_t>((current_ul.QuadPart - base_ul.QuadPart) / RATIO);
-}
-
-void UnixTimeToFileTime(const time_t& ut, FILETIME* ft) {
-  RTC_DCHECK(nullptr != ft);
-
-  // FILETIME has an earlier date base than time_t (1/1/1970), so add in
-  // the difference.
-  SYSTEMTIME base_st;
-  memset(&base_st, 0, sizeof(base_st));
-  base_st.wDay = 1;
-  base_st.wMonth = 1;
-  base_st.wYear = 1970;
-
-  FILETIME base_ft;
-  SystemTimeToFileTime(&base_st, &base_ft);
-
-  ULARGE_INTEGER base_ul;
-  memcpy(&base_ul, &base_ft, sizeof(FILETIME));
-
-  // Multiply by big number to convert to 100ns units, then add in the 1970
-  // base date value.
-  const ULONGLONG RATIO = 10000000;
-  ULARGE_INTEGER current_ul;
-  current_ul.QuadPart = base_ul.QuadPart + static_cast<int64_t>(ut) * RATIO;
-  memcpy(ft, &current_ul, sizeof(FILETIME));
-}
-
-bool Utf8ToWindowsFilename(const std::string& utf8, std::wstring* filename) {
-  // TODO: Integrate into fileutils.h
-  // TODO: Handle wide and non-wide cases via TCHAR?
-  // TODO: Skip \\?\ processing if the length is not > MAX_PATH?
-  // TODO: Write unittests
-
-  // Convert to Utf16
-  int wlen =
-      ::MultiByteToWideChar(CP_UTF8, 0, utf8.c_str(),
-                            static_cast<int>(utf8.length() + 1), nullptr, 0);
-  if (0 == wlen) {
-    return false;
-  }
-  wchar_t* wfilename = STACK_ARRAY(wchar_t, wlen);
-  if (0 == ::MultiByteToWideChar(CP_UTF8, 0, utf8.c_str(),
-                                 static_cast<int>(utf8.length() + 1),
-                                 wfilename, wlen)) {
-    return false;
-  }
-  // Replace forward slashes with backslashes
-  std::replace(wfilename, wfilename + wlen, L'/', L'\\');
-  // Convert to complete filename
-  DWORD full_len = ::GetFullPathName(wfilename, 0, nullptr, nullptr);
-  if (0 == full_len) {
-    return false;
-  }
-  wchar_t* filepart = nullptr;
-  wchar_t* full_filename = STACK_ARRAY(wchar_t, full_len + 6);
-  wchar_t* start = full_filename + 6;
-  if (0 == ::GetFullPathName(wfilename, full_len, start, &filepart)) {
-    return false;
-  }
-  // Add long-path prefix
-  const wchar_t kLongPathPrefix[] = L"\\\\?\\UNC";
-  if ((start[0] != L'\\') || (start[1] != L'\\')) {
-    // Non-unc path:     <pathname>
-    //      Becomes: \\?\<pathname>
-    start -= 4;
-    RTC_DCHECK(start >= full_filename);
-    memcpy(start, kLongPathPrefix, 4 * sizeof(wchar_t));
-  } else if (start[2] != L'?') {
-    // Unc path:       \\<server>\<pathname>
-    //  Becomes: \\?\UNC\<server>\<pathname>
-    start -= 6;
-    RTC_DCHECK(start >= full_filename);
-    memcpy(start, kLongPathPrefix, 7 * sizeof(wchar_t));
-  } else {
-    // Already in long-path form.
-  }
-  filename->assign(start);
-  return true;
-}
-
-bool GetOsVersion(int* major, int* minor, int* build) {
-  OSVERSIONINFO info = {0};
-  info.dwOSVersionInfoSize = sizeof(info);
-  if (GetVersionEx(&info)) {
-    if (major) *major = info.dwMajorVersion;
-    if (minor) *minor = info.dwMinorVersion;
-    if (build) *build = info.dwBuildNumber;
-    return true;
-  }
-  return false;
-}
-
-bool GetCurrentProcessIntegrityLevel(int* level) {
-  bool ret = false;
-  HANDLE process = ::GetCurrentProcess(), token;
-  if (OpenProcessToken(process, TOKEN_QUERY | TOKEN_QUERY_SOURCE, &token)) {
-    DWORD size;
-    if (!GetTokenInformation(token, TokenIntegrityLevel, nullptr, 0, &size) &&
-        GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
-      char* buf = STACK_ARRAY(char, size);
-      TOKEN_MANDATORY_LABEL* til =
-          reinterpret_cast<TOKEN_MANDATORY_LABEL*>(buf);
-      if (GetTokenInformation(token, TokenIntegrityLevel, til, size, &size)) {
-
-        DWORD count = *GetSidSubAuthorityCount(til->Label.Sid);
-        *level = *GetSidSubAuthority(til->Label.Sid, count - 1);
-        ret = true;
-      }
-    }
-    CloseHandle(token);
-  }
-  return ret;
-}
-
-}  // namespace rtc
diff --git a/rtc_base/win32.h b/rtc_base/win32.h
deleted file mode 100644
index be1195e..0000000
--- a/rtc_base/win32.h
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- *  Copyright 2004 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_RTC_BASE_WIN32_H_
-#define WEBRTC_RTC_BASE_WIN32_H_
-
-#if defined(WEBRTC_WIN)
-
-#ifndef WIN32_LEAN_AND_MEAN
-#define WIN32_LEAN_AND_MEAN
-#endif
-
-// Make sure we don't get min/max macros
-#ifndef NOMINMAX
-#define NOMINMAX
-#endif
-
-#include <winsock2.h>
-#include <windows.h>
-
-#ifndef SECURITY_MANDATORY_LABEL_AUTHORITY
-// Add defines that we use if we are compiling against older sdks
-#define SECURITY_MANDATORY_MEDIUM_RID               (0x00002000L)
-#define TokenIntegrityLevel static_cast<TOKEN_INFORMATION_CLASS>(0x19)
-typedef struct _TOKEN_MANDATORY_LABEL {
-    SID_AND_ATTRIBUTES Label;
-} TOKEN_MANDATORY_LABEL, *PTOKEN_MANDATORY_LABEL;
-#endif  // SECURITY_MANDATORY_LABEL_AUTHORITY
-
-#undef SetPort
-
-#include <string>
-
-#include "webrtc/rtc_base/basictypes.h"
-#include "webrtc/rtc_base/stringutils.h"
-
-namespace rtc {
-
-const char* win32_inet_ntop(int af, const void *src, char* dst, socklen_t size);
-int win32_inet_pton(int af, const char* src, void *dst);
-
-inline std::wstring ToUtf16(const char* utf8, size_t len) {
-  int len16 = ::MultiByteToWideChar(CP_UTF8, 0, utf8, static_cast<int>(len),
-                                    nullptr, 0);
-  wchar_t* ws = STACK_ARRAY(wchar_t, len16);
-  ::MultiByteToWideChar(CP_UTF8, 0, utf8, static_cast<int>(len), ws, len16);
-  return std::wstring(ws, len16);
-}
-
-inline std::wstring ToUtf16(const std::string& str) {
-  return ToUtf16(str.data(), str.length());
-}
-
-inline std::string ToUtf8(const wchar_t* wide, size_t len) {
-  int len8 = ::WideCharToMultiByte(CP_UTF8, 0, wide, static_cast<int>(len),
-                                   nullptr, 0, nullptr, nullptr);
-  char* ns = STACK_ARRAY(char, len8);
-  ::WideCharToMultiByte(CP_UTF8, 0, wide, static_cast<int>(len), ns, len8,
-                        nullptr, nullptr);
-  return std::string(ns, len8);
-}
-
-inline std::string ToUtf8(const wchar_t* wide) {
-  return ToUtf8(wide, wcslen(wide));
-}
-
-inline std::string ToUtf8(const std::wstring& wstr) {
-  return ToUtf8(wstr.data(), wstr.length());
-}
-
-// Convert FILETIME to time_t
-void FileTimeToUnixTime(const FILETIME& ft, time_t* ut);
-
-// Convert time_t to FILETIME
-void UnixTimeToFileTime(const time_t& ut, FILETIME * ft);
-
-// Convert a Utf8 path representation to a non-length-limited Unicode pathname.
-bool Utf8ToWindowsFilename(const std::string& utf8, std::wstring* filename);
-
-// Convert a FILETIME to a UInt64
-inline uint64_t ToUInt64(const FILETIME& ft) {
-  ULARGE_INTEGER r = {{ft.dwLowDateTime, ft.dwHighDateTime}};
-  return r.QuadPart;
-}
-
-enum WindowsMajorVersions {
-  kWindows2000 = 5,
-  kWindowsVista = 6,
-};
-bool GetOsVersion(int* major, int* minor, int* build);
-
-inline bool IsWindowsVistaOrLater() {
-  int major;
-  return (GetOsVersion(&major, nullptr, nullptr) && major >= kWindowsVista);
-}
-
-inline bool IsWindowsXpOrLater() {
-  int major, minor;
-  return (GetOsVersion(&major, &minor, nullptr) &&
-          (major >= kWindowsVista || (major == kWindows2000 && minor >= 1)));
-}
-
-inline bool IsWindows8OrLater() {
-  int major, minor;
-  return (GetOsVersion(&major, &minor, nullptr) &&
-          (major > kWindowsVista || (major == kWindowsVista && minor >= 2)));
-}
-
-// Determine the current integrity level of the process.
-bool GetCurrentProcessIntegrityLevel(int* level);
-
-inline bool IsCurrentProcessLowIntegrity() {
-  int level;
-  return (GetCurrentProcessIntegrityLevel(&level) &&
-      level < SECURITY_MANDATORY_MEDIUM_RID);
-}
-
-}  // namespace rtc
-
-#endif  // WEBRTC_WIN
-#endif  // WEBRTC_RTC_BASE_WIN32_H_
diff --git a/rtc_base/win32_unittest.cc b/rtc_base/win32_unittest.cc
deleted file mode 100644
index 831b4b3..0000000
--- a/rtc_base/win32_unittest.cc
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- *  Copyright 2010 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 <string>
-
-#include "webrtc/rtc_base/gunit.h"
-#include "webrtc/rtc_base/nethelpers.h"
-#include "webrtc/rtc_base/win32.h"
-
-#if !defined(WEBRTC_WIN)
-#error Only for Windows
-#endif
-
-namespace rtc {
-
-class Win32Test : public testing::Test {
- public:
-  Win32Test() {
-  }
-};
-
-TEST_F(Win32Test, FileTimeToUInt64Test) {
-  FILETIME ft;
-  ft.dwHighDateTime = 0xBAADF00D;
-  ft.dwLowDateTime = 0xFEED3456;
-
-  uint64_t expected = 0xBAADF00DFEED3456;
-  EXPECT_EQ(expected, ToUInt64(ft));
-}
-
-TEST_F(Win32Test, IPv6AddressCompression) {
-  IPAddress ipv6;
-
-  // Zero compression should be done on the leftmost 0s when there are
-  // multiple longest series.
-  ASSERT_TRUE(IPFromString("2a00:8a00:a000:1190:0000:0001:000:252", &ipv6));
-  EXPECT_EQ("2a00:8a00:a000:1190::1:0:252", ipv6.ToString());
-
-  // Ensure the zero compression could handle multiple octects.
-  ASSERT_TRUE(IPFromString("0:0:0:0:0:0:0:1", &ipv6));
-  EXPECT_EQ("::1", ipv6.ToString());
-
-  // Make sure multiple 0 octects compressed.
-  ASSERT_TRUE(IPFromString("fe80:0:0:0:2aa:ff:fe9a:4ca2", &ipv6));
-  EXPECT_EQ("fe80::2aa:ff:fe9a:4ca2", ipv6.ToString());
-
-  // Test zero compression at the end of string.
-  ASSERT_TRUE(IPFromString("2a00:8a00:a000:1190:0000:0001:000:00", &ipv6));
-  EXPECT_EQ("2a00:8a00:a000:1190:0:1::", ipv6.ToString());
-
-  // Test zero compression at the beginning of string.
-  ASSERT_TRUE(IPFromString("0:0:000:1190:0000:0001:000:00", &ipv6));
-  EXPECT_EQ("::1190:0:1:0:0", ipv6.ToString());
-
-  // Test zero compression only done once.
-  ASSERT_TRUE(IPFromString("0:1:000:1190:0000:0001:000:01", &ipv6));
-  EXPECT_EQ("::1:0:1190:0:1:0:1", ipv6.ToString());
-
-  // Make sure noncompressable IPv6 is the same.
-  ASSERT_TRUE(IPFromString("1234:5678:abcd:1234:5678:abcd:1234:5678", &ipv6));
-  EXPECT_EQ("1234:5678:abcd:1234:5678:abcd:1234:5678", ipv6.ToString());
-}
-
-// Test that invalid IPv6 addresses are recognized and false is returned.
-TEST_F(Win32Test, InvalidIPv6AddressParsing) {
-  IPAddress ipv6;
-
-  // More than 1 run of "::"s.
-  EXPECT_FALSE(IPFromString("1::2::3", &ipv6));
-
-  // More than 1 run of "::"s in a longer address.
-  // See: https://bugs.chromium.org/p/webrtc/issues/detail?id=7592
-  EXPECT_FALSE(IPFromString("1::2::3::4::5::6::7::8", &ipv6));
-
-  // Three ':'s in a row.
-  EXPECT_FALSE(IPFromString("1:::2", &ipv6));
-
-  // Non-hex character.
-  EXPECT_FALSE(IPFromString("test::1", &ipv6));
-
-  // More than 4 hex digits per group.
-  EXPECT_FALSE(IPFromString("abcde::1", &ipv6));
-
-  // More than 8 groups.
-  EXPECT_FALSE(IPFromString("1:2:3:4:5:6:7:8:9", &ipv6));
-
-  // Less than 8 groups.
-  EXPECT_FALSE(IPFromString("1:2:3:4:5:6:7", &ipv6));
-}
-
-}  // namespace rtc
diff --git a/rtc_base/win32filesystem.cc b/rtc_base/win32filesystem.cc
deleted file mode 100644
index 19122e5..0000000
--- a/rtc_base/win32filesystem.cc
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- *  Copyright 2004 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/rtc_base/win32filesystem.h"
-
-#include <shellapi.h>
-#include <shlobj.h>
-#include <tchar.h>
-#include "webrtc/rtc_base/win32.h"
-
-#include <memory>
-
-#include "webrtc/rtc_base/arraysize.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/fileutils.h"
-#include "webrtc/rtc_base/pathutils.h"
-#include "webrtc/rtc_base/stream.h"
-#include "webrtc/rtc_base/stringutils.h"
-
-// In several places in this file, we test the integrity level of the process
-// before calling GetLongPathName. We do this because calling GetLongPathName
-// when running under protected mode IE (a low integrity process) can result in
-// a virtualized path being returned, which is wrong if you only plan to read.
-// TODO: Waiting to hear back from IE team on whether this is the
-// best approach; IEIsProtectedModeProcess is another possible solution.
-
-namespace rtc {
-
-bool Win32Filesystem::DeleteFile(const Pathname &filename) {
-  LOG(LS_INFO) << "Deleting file " << filename.pathname();
-  if (!IsFile(filename)) {
-    RTC_DCHECK(IsFile(filename));
-    return false;
-  }
-  return ::DeleteFile(ToUtf16(filename.pathname()).c_str()) != 0;
-}
-
-std::string Win32Filesystem::TempFilename(const Pathname &dir,
-                                          const std::string &prefix) {
-  wchar_t filename[MAX_PATH];
-  if (::GetTempFileName(ToUtf16(dir.pathname()).c_str(),
-                        ToUtf16(prefix).c_str(), 0, filename) != 0)
-    return ToUtf8(filename);
-  RTC_NOTREACHED();
-  return "";
-}
-
-bool Win32Filesystem::MoveFile(const Pathname &old_path,
-                               const Pathname &new_path) {
-  if (!IsFile(old_path)) {
-    RTC_DCHECK(IsFile(old_path));
-    return false;
-  }
-  LOG(LS_INFO) << "Moving " << old_path.pathname()
-               << " to " << new_path.pathname();
-  return ::MoveFile(ToUtf16(old_path.pathname()).c_str(),
-                    ToUtf16(new_path.pathname()).c_str()) != 0;
-}
-
-bool Win32Filesystem::IsFolder(const Pathname &path) {
-  WIN32_FILE_ATTRIBUTE_DATA data = {0};
-  if (0 == ::GetFileAttributesEx(ToUtf16(path.pathname()).c_str(),
-                                 GetFileExInfoStandard, &data))
-    return false;
-  return (data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ==
-      FILE_ATTRIBUTE_DIRECTORY;
-}
-
-bool Win32Filesystem::IsFile(const Pathname &path) {
-  WIN32_FILE_ATTRIBUTE_DATA data = {0};
-  if (0 == ::GetFileAttributesEx(ToUtf16(path.pathname()).c_str(),
-                                 GetFileExInfoStandard, &data))
-    return false;
-  return (data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == 0;
-}
-
-bool Win32Filesystem::GetFileSize(const Pathname &pathname, size_t *size) {
-  WIN32_FILE_ATTRIBUTE_DATA data = {0};
-  if (::GetFileAttributesEx(ToUtf16(pathname.pathname()).c_str(),
-                            GetFileExInfoStandard, &data) == 0)
-  return false;
-  *size = data.nFileSizeLow;
-  return true;
-}
-
-}  // namespace rtc
diff --git a/rtc_base/win32filesystem.h b/rtc_base/win32filesystem.h
deleted file mode 100644
index 95c820c..0000000
--- a/rtc_base/win32filesystem.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- *  Copyright 2004 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_RTC_BASE_WIN32FILESYSTEM_H_
-#define WEBRTC_RTC_BASE_WIN32FILESYSTEM_H_
-
-#include "fileutils.h"
-
-namespace rtc {
-
-class Win32Filesystem : public FilesystemInterface {
- public:
-  // This will attempt to delete the path located at filename.
-  // If the path points to a folder, it will fail with VERIFY
-  bool DeleteFile(const Pathname& filename) override;
-
-  // This moves a file from old_path to new_path. If the new path is on a
-  // different volume than the old, it will attempt to copy and then delete
-  // the folder
-  // Returns true if the file is successfully moved
-  bool MoveFile(const Pathname& old_path, const Pathname& new_path) override;
-
-  // Returns true if a pathname is a directory
-  bool IsFolder(const Pathname& pathname) override;
-
-  // Returns true if a file exists at path
-  bool IsFile(const Pathname& path) override;
-
-  // All of the following functions set pathname and return true if successful.
-  // Returned paths always include a trailing backslash.
-  // If create is true, the path will be recursively created.
-  // If append is non-null, it will be appended (and possibly created).
-
-  std::string TempFilename(const Pathname& dir,
-                           const std::string& prefix) override;
-
-  bool GetFileSize(const Pathname& path, size_t* size) override;
-};
-
-}  // namespace rtc
-
-#endif  // WEBRTC_RTC_BASE_WIN32FILESYSTEM_H_
diff --git a/rtc_base/win32securityerrors.cc b/rtc_base/win32securityerrors.cc
deleted file mode 100644
index 0cc9bce..0000000
--- a/rtc_base/win32securityerrors.cc
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- *  Copyright 2004 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/rtc_base/logging.h"
-#include "webrtc/rtc_base/win32.h"
-
-namespace rtc {
-
-///////////////////////////////////////////////////////////////////////////////
-
-extern const ConstantLabel SECURITY_ERRORS[];
-
-const ConstantLabel SECURITY_ERRORS[] = {
-  KLABEL(SEC_I_COMPLETE_AND_CONTINUE),
-  KLABEL(SEC_I_COMPLETE_NEEDED),
-  KLABEL(SEC_I_CONTEXT_EXPIRED),
-  KLABEL(SEC_I_CONTINUE_NEEDED),
-  KLABEL(SEC_I_INCOMPLETE_CREDENTIALS),
-  KLABEL(SEC_I_RENEGOTIATE),
-  KLABEL(SEC_E_CERT_EXPIRED),
-  KLABEL(SEC_E_INCOMPLETE_MESSAGE),
-  KLABEL(SEC_E_INSUFFICIENT_MEMORY),
-  KLABEL(SEC_E_INTERNAL_ERROR),
-  KLABEL(SEC_E_INVALID_HANDLE),
-  KLABEL(SEC_E_INVALID_TOKEN),
-  KLABEL(SEC_E_LOGON_DENIED),
-  KLABEL(SEC_E_NO_AUTHENTICATING_AUTHORITY),
-  KLABEL(SEC_E_NO_CREDENTIALS),
-  KLABEL(SEC_E_NOT_OWNER),
-  KLABEL(SEC_E_OK),
-  KLABEL(SEC_E_SECPKG_NOT_FOUND),
-  KLABEL(SEC_E_TARGET_UNKNOWN),
-  KLABEL(SEC_E_UNKNOWN_CREDENTIALS),
-  KLABEL(SEC_E_UNSUPPORTED_FUNCTION),
-  KLABEL(SEC_E_UNTRUSTED_ROOT),
-  KLABEL(SEC_E_WRONG_PRINCIPAL),
-  LASTLABEL
-};
-
-///////////////////////////////////////////////////////////////////////////////
-
-}  // namespace rtc
diff --git a/rtc_base/win32socketinit.cc b/rtc_base/win32socketinit.cc
deleted file mode 100644
index 1a54c44..0000000
--- a/rtc_base/win32socketinit.cc
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- *  Copyright 2009 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/rtc_base/win32socketinit.h"
-
-#include "webrtc/rtc_base/win32.h"
-
-namespace rtc {
-
-// Please don't remove this function.
-void EnsureWinsockInit() {
-  // The default implementation uses a global initializer, so WSAStartup
-  // happens at module load time.  Thus we don't need to do anything here.
-  // The hook is provided so that a client that statically links with
-  // libjingle can override it, to provide its own initialization.
-}
-
-#if defined(WEBRTC_WIN)
-class WinsockInitializer {
- public:
-  WinsockInitializer() {
-    WSADATA wsaData;
-    WORD wVersionRequested = MAKEWORD(1, 0);
-    err_ = WSAStartup(wVersionRequested, &wsaData);
-  }
-  ~WinsockInitializer() {
-    if (!err_)
-      WSACleanup();
-  }
-  int error() {
-    return err_;
-  }
- private:
-  int err_;
-};
-WinsockInitializer g_winsockinit;
-#endif
-
-}  // namespace rtc
diff --git a/rtc_base/win32socketinit.h b/rtc_base/win32socketinit.h
deleted file mode 100644
index 6acac9f..0000000
--- a/rtc_base/win32socketinit.h
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- *  Copyright 2009 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_RTC_BASE_WIN32SOCKETINIT_H_
-#define WEBRTC_RTC_BASE_WIN32SOCKETINIT_H_
-
-namespace rtc {
-
-void EnsureWinsockInit();
-
-}  // namespace rtc
-
-#endif  // WEBRTC_RTC_BASE_WIN32SOCKETINIT_H_
diff --git a/rtc_base/win32socketserver.cc b/rtc_base/win32socketserver.cc
deleted file mode 100644
index 1405c82..0000000
--- a/rtc_base/win32socketserver.cc
+++ /dev/null
@@ -1,834 +0,0 @@
-/*
- *  Copyright 2004 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/rtc_base/win32socketserver.h"
-
-#include <algorithm>
-#include <ws2tcpip.h>  // NOLINT
-
-#include "webrtc/rtc_base/byteorder.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/win32window.h"
-
-namespace rtc {
-
-///////////////////////////////////////////////////////////////////////////////
-// Win32Socket
-///////////////////////////////////////////////////////////////////////////////
-
-// TODO: Move this to a common place where PhysicalSocketServer can
-// share it.
-// Standard MTUs
-static const uint16_t PACKET_MAXIMUMS[] = {
-    65535,  // Theoretical maximum, Hyperchannel
-    32000,  // Nothing
-    17914,  // 16Mb IBM Token Ring
-    8166,   // IEEE 802.4
-    // 4464   // IEEE 802.5 (4Mb max)
-    4352,   // FDDI
-    // 2048,  // Wideband Network
-    2002,   // IEEE 802.5 (4Mb recommended)
-    // 1536,  // Expermental Ethernet Networks
-    // 1500,  // Ethernet, Point-to-Point (default)
-    1492,   // IEEE 802.3
-    1006,   // SLIP, ARPANET
-    // 576,   // X.25 Networks
-    // 544,   // DEC IP Portal
-    // 512,   // NETBIOS
-    508,    // IEEE 802/Source-Rt Bridge, ARCNET
-    296,    // Point-to-Point (low delay)
-    68,     // Official minimum
-    0,      // End of list marker
-};
-
-static const int IP_HEADER_SIZE = 20u;
-static const int ICMP_HEADER_SIZE = 8u;
-static const int ICMP_PING_TIMEOUT_MILLIS = 10000u;
-
-// TODO: Enable for production builds also? Use FormatMessage?
-#if !defined(NDEBUG)
-LPCSTR WSAErrorToString(int error, LPCSTR *description_result) {
-  LPCSTR string = "Unspecified";
-  LPCSTR description = "Unspecified description";
-  switch (error) {
-    case ERROR_SUCCESS:
-      string = "SUCCESS";
-      description = "Operation succeeded";
-      break;
-    case WSAEWOULDBLOCK:
-      string = "WSAEWOULDBLOCK";
-      description = "Using a non-blocking socket, will notify later";
-      break;
-    case WSAEACCES:
-      string = "WSAEACCES";
-      description = "Access denied, or sharing violation";
-      break;
-    case WSAEADDRNOTAVAIL:
-      string = "WSAEADDRNOTAVAIL";
-      description = "Address is not valid in this context";
-      break;
-    case WSAENETDOWN:
-      string = "WSAENETDOWN";
-      description = "Network is down";
-      break;
-    case WSAENETUNREACH:
-      string = "WSAENETUNREACH";
-      description = "Network is up, but unreachable";
-      break;
-    case WSAENETRESET:
-      string = "WSANETRESET";
-      description = "Connection has been reset due to keep-alive activity";
-      break;
-    case WSAECONNABORTED:
-      string = "WSAECONNABORTED";
-      description = "Aborted by host";
-      break;
-    case WSAECONNRESET:
-      string = "WSAECONNRESET";
-      description = "Connection reset by host";
-      break;
-    case WSAETIMEDOUT:
-      string = "WSAETIMEDOUT";
-      description = "Timed out, host failed to respond";
-      break;
-    case WSAECONNREFUSED:
-      string = "WSAECONNREFUSED";
-      description = "Host actively refused connection";
-      break;
-    case WSAEHOSTDOWN:
-      string = "WSAEHOSTDOWN";
-      description = "Host is down";
-      break;
-    case WSAEHOSTUNREACH:
-      string = "WSAEHOSTUNREACH";
-      description = "Host is unreachable";
-      break;
-    case WSAHOST_NOT_FOUND:
-      string = "WSAHOST_NOT_FOUND";
-      description = "No such host is known";
-      break;
-  }
-  if (description_result) {
-    *description_result = description;
-  }
-  return string;
-}
-
-void ReportWSAError(LPCSTR context, int error, const SocketAddress& address) {
-  LPCSTR description_string;
-  LPCSTR error_string = WSAErrorToString(error, &description_string);
-  LOG(LS_INFO) << context << " = " << error
-    << " (" << error_string << ":" << description_string << ") ["
-    << address.ToString() << "]";
-}
-#else
-void ReportWSAError(LPCSTR context, int error, const SocketAddress& address) {}
-#endif
-
-/////////////////////////////////////////////////////////////////////////////
-// Win32Socket::EventSink
-/////////////////////////////////////////////////////////////////////////////
-
-#define WM_SOCKETNOTIFY  (WM_USER + 50)
-#define WM_DNSNOTIFY     (WM_USER + 51)
-
-struct Win32Socket::DnsLookup {
-  HANDLE handle;
-  uint16_t port;
-  char buffer[MAXGETHOSTSTRUCT];
-};
-
-class Win32Socket::EventSink : public Win32Window {
- public:
-  explicit EventSink(Win32Socket * parent) : parent_(parent) { }
-
-  void Dispose();
-
-  virtual bool OnMessage(UINT uMsg, WPARAM wParam, LPARAM lParam,
-                         LRESULT& result);
-  virtual void OnNcDestroy();
-
- private:
-  bool OnSocketNotify(UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT& result);
-  bool OnDnsNotify(WPARAM wParam, LPARAM lParam, LRESULT& result);
-
-  Win32Socket * parent_;
-};
-
-void Win32Socket::EventSink::Dispose() {
-  parent_ = nullptr;
-  if (::IsWindow(handle())) {
-    ::DestroyWindow(handle());
-  } else {
-    delete this;
-  }
-}
-
-bool Win32Socket::EventSink::OnMessage(UINT uMsg, WPARAM wParam,
-                                       LPARAM lParam, LRESULT& result) {
-  switch (uMsg) {
-  case WM_SOCKETNOTIFY:
-  case WM_TIMER:
-    return OnSocketNotify(uMsg, wParam, lParam, result);
-  case WM_DNSNOTIFY:
-    return OnDnsNotify(wParam, lParam, result);
-  }
-  return false;
-}
-
-bool Win32Socket::EventSink::OnSocketNotify(UINT uMsg, WPARAM wParam,
-                                            LPARAM lParam, LRESULT& result) {
-  result = 0;
-
-  int wsa_event = WSAGETSELECTEVENT(lParam);
-  int wsa_error = WSAGETSELECTERROR(lParam);
-
-  // Treat connect timeouts as close notifications
-  if (uMsg == WM_TIMER) {
-    wsa_event = FD_CLOSE;
-    wsa_error = WSAETIMEDOUT;
-  }
-
-  if (parent_)
-    parent_->OnSocketNotify(static_cast<SOCKET>(wParam), wsa_event, wsa_error);
-  return true;
-}
-
-bool Win32Socket::EventSink::OnDnsNotify(WPARAM wParam, LPARAM lParam,
-                                         LRESULT& result) {
-  result = 0;
-
-  int error = WSAGETASYNCERROR(lParam);
-  if (parent_)
-    parent_->OnDnsNotify(reinterpret_cast<HANDLE>(wParam), error);
-  return true;
-}
-
-void Win32Socket::EventSink::OnNcDestroy() {
-  if (parent_) {
-    LOG(LS_ERROR) << "EventSink hwnd is being destroyed, but the event sink"
-                     " hasn't yet been disposed.";
-  } else {
-    delete this;
-  }
-}
-
-/////////////////////////////////////////////////////////////////////////////
-// Win32Socket
-/////////////////////////////////////////////////////////////////////////////
-
-Win32Socket::Win32Socket()
-    : socket_(INVALID_SOCKET),
-      error_(0),
-      state_(CS_CLOSED),
-      connect_time_(0),
-      closing_(false),
-      close_error_(0),
-      sink_(nullptr),
-      dns_(nullptr) {}
-
-Win32Socket::~Win32Socket() {
-  Close();
-}
-
-bool Win32Socket::CreateT(int family, int type) {
-  Close();
-  int proto = (SOCK_DGRAM == type) ? IPPROTO_UDP : IPPROTO_TCP;
-  socket_ = ::WSASocket(family, type, proto, nullptr, 0, 0);
-  if (socket_ == INVALID_SOCKET) {
-    UpdateLastError();
-    return false;
-  }
-  if ((SOCK_DGRAM == type) && !SetAsync(FD_READ | FD_WRITE)) {
-    return false;
-  }
-  return true;
-}
-
-int Win32Socket::Attach(SOCKET s) {
-  RTC_DCHECK(socket_ == INVALID_SOCKET);
-  if (socket_ != INVALID_SOCKET)
-    return SOCKET_ERROR;
-
-  RTC_DCHECK(s != INVALID_SOCKET);
-  if (s == INVALID_SOCKET)
-    return SOCKET_ERROR;
-
-  socket_ = s;
-  state_ = CS_CONNECTED;
-
-  if (!SetAsync(FD_READ | FD_WRITE | FD_CLOSE))
-    return SOCKET_ERROR;
-
-  return 0;
-}
-
-void Win32Socket::SetTimeout(int ms) {
-  if (sink_)
-    ::SetTimer(sink_->handle(), 1, ms, 0);
-}
-
-SocketAddress Win32Socket::GetLocalAddress() const {
-  sockaddr_storage addr = {0};
-  socklen_t addrlen = sizeof(addr);
-  int result = ::getsockname(socket_, reinterpret_cast<sockaddr*>(&addr),
-                             &addrlen);
-  SocketAddress address;
-  if (result >= 0) {
-    SocketAddressFromSockAddrStorage(addr, &address);
-  } else {
-    LOG(LS_WARNING) << "GetLocalAddress: unable to get local addr, socket="
-                    << socket_;
-  }
-  return address;
-}
-
-SocketAddress Win32Socket::GetRemoteAddress() const {
-  sockaddr_storage addr = {0};
-  socklen_t addrlen = sizeof(addr);
-  int result = ::getpeername(socket_, reinterpret_cast<sockaddr*>(&addr),
-                             &addrlen);
-  SocketAddress address;
-  if (result >= 0) {
-    SocketAddressFromSockAddrStorage(addr, &address);
-  } else {
-    LOG(LS_WARNING) << "GetRemoteAddress: unable to get remote addr, socket="
-                    << socket_;
-  }
-  return address;
-}
-
-int Win32Socket::Bind(const SocketAddress& addr) {
-  RTC_DCHECK(socket_ != INVALID_SOCKET);
-  if (socket_ == INVALID_SOCKET)
-    return SOCKET_ERROR;
-
-  sockaddr_storage saddr;
-  size_t len = addr.ToSockAddrStorage(&saddr);
-  int err = ::bind(socket_,
-                   reinterpret_cast<sockaddr*>(&saddr),
-                   static_cast<int>(len));
-  UpdateLastError();
-  return err;
-}
-
-int Win32Socket::Connect(const SocketAddress& addr) {
-  if (state_ != CS_CLOSED) {
-    SetError(EALREADY);
-    return SOCKET_ERROR;
-  }
-
-  if (!addr.IsUnresolvedIP()) {
-    return DoConnect(addr);
-  }
-
-  LOG_F(LS_INFO) << "async dns lookup (" << addr.hostname() << ")";
-  DnsLookup * dns = new DnsLookup;
-  if (!sink_) {
-    // Explicitly create the sink ourselves here; we can't rely on SetAsync
-    // because we don't have a socket_ yet.
-    CreateSink();
-  }
-  // TODO: Replace with IPv6 compatible lookup.
-  dns->handle = WSAAsyncGetHostByName(sink_->handle(), WM_DNSNOTIFY,
-                                      addr.hostname().c_str(), dns->buffer,
-                                      sizeof(dns->buffer));
-
-  if (!dns->handle) {
-    LOG_F(LS_ERROR) << "WSAAsyncGetHostByName error: " << WSAGetLastError();
-    delete dns;
-    UpdateLastError();
-    Close();
-    return SOCKET_ERROR;
-  }
-
-  dns->port = addr.port();
-  dns_ = dns;
-  state_ = CS_CONNECTING;
-  return 0;
-}
-
-int Win32Socket::DoConnect(const SocketAddress& addr) {
-  if ((socket_ == INVALID_SOCKET) && !CreateT(addr.family(), SOCK_STREAM)) {
-    return SOCKET_ERROR;
-  }
-  if (!SetAsync(FD_READ | FD_WRITE | FD_CONNECT | FD_CLOSE)) {
-    return SOCKET_ERROR;
-  }
-
-  sockaddr_storage saddr = {0};
-  size_t len = addr.ToSockAddrStorage(&saddr);
-  connect_time_ = Time();
-  int result = connect(socket_,
-                       reinterpret_cast<SOCKADDR*>(&saddr),
-                       static_cast<int>(len));
-  if (result != SOCKET_ERROR) {
-    state_ = CS_CONNECTED;
-  } else {
-    int code = WSAGetLastError();
-    if (code == WSAEWOULDBLOCK) {
-      state_ = CS_CONNECTING;
-    } else {
-      ReportWSAError("WSAAsync:connect", code, addr);
-      error_ = code;
-      Close();
-      return SOCKET_ERROR;
-    }
-  }
-  addr_ = addr;
-
-  return 0;
-}
-
-int Win32Socket::GetError() const {
-  return error_;
-}
-
-void Win32Socket::SetError(int error) {
-  error_ = error;
-}
-
-Socket::ConnState Win32Socket::GetState() const {
-  return state_;
-}
-
-int Win32Socket::GetOption(Option opt, int* value) {
-  int slevel;
-  int sopt;
-  if (TranslateOption(opt, &slevel, &sopt) == -1)
-    return -1;
-
-  char* p = reinterpret_cast<char*>(value);
-  int optlen = sizeof(value);
-  return ::getsockopt(socket_, slevel, sopt, p, &optlen);
-}
-
-int Win32Socket::SetOption(Option opt, int value) {
-  int slevel;
-  int sopt;
-  if (TranslateOption(opt, &slevel, &sopt) == -1)
-    return -1;
-
-  const char* p = reinterpret_cast<const char*>(&value);
-  return ::setsockopt(socket_, slevel, sopt, p, sizeof(value));
-}
-
-int Win32Socket::Send(const void* buffer, size_t length) {
-  int sent = ::send(socket_,
-                    reinterpret_cast<const char*>(buffer),
-                    static_cast<int>(length),
-                    0);
-  UpdateLastError();
-  return sent;
-}
-
-int Win32Socket::SendTo(const void* buffer, size_t length,
-                        const SocketAddress& addr) {
-  sockaddr_storage saddr;
-  size_t addr_len = addr.ToSockAddrStorage(&saddr);
-  int sent = ::sendto(socket_, reinterpret_cast<const char*>(buffer),
-                      static_cast<int>(length), 0,
-                      reinterpret_cast<sockaddr*>(&saddr),
-                      static_cast<int>(addr_len));
-  UpdateLastError();
-  return sent;
-}
-
-int Win32Socket::Recv(void* buffer, size_t length, int64_t* timestamp) {
-  if (timestamp) {
-    *timestamp = -1;
-  }
-  int received = ::recv(socket_, static_cast<char*>(buffer),
-                        static_cast<int>(length), 0);
-  UpdateLastError();
-  if (closing_ && received <= static_cast<int>(length))
-    PostClosed();
-  return received;
-}
-
-int Win32Socket::RecvFrom(void* buffer,
-                          size_t length,
-                          SocketAddress* out_addr,
-                          int64_t* timestamp) {
-  if (timestamp) {
-    *timestamp = -1;
-  }
-  sockaddr_storage saddr;
-  socklen_t addr_len = sizeof(saddr);
-  int received = ::recvfrom(socket_, static_cast<char*>(buffer),
-                            static_cast<int>(length), 0,
-                            reinterpret_cast<sockaddr*>(&saddr), &addr_len);
-  UpdateLastError();
-  if (received != SOCKET_ERROR)
-    SocketAddressFromSockAddrStorage(saddr, out_addr);
-  if (closing_ && received <= static_cast<int>(length))
-    PostClosed();
-  return received;
-}
-
-int Win32Socket::Listen(int backlog) {
-  int err = ::listen(socket_, backlog);
-  if (!SetAsync(FD_ACCEPT))
-    return SOCKET_ERROR;
-
-  UpdateLastError();
-  if (err == 0)
-    state_ = CS_CONNECTING;
-  return err;
-}
-
-Win32Socket* Win32Socket::Accept(SocketAddress* out_addr) {
-  sockaddr_storage saddr;
-  socklen_t addr_len = sizeof(saddr);
-  SOCKET s = ::accept(socket_, reinterpret_cast<sockaddr*>(&saddr), &addr_len);
-  UpdateLastError();
-  if (s == INVALID_SOCKET)
-    return nullptr;
-  if (out_addr)
-    SocketAddressFromSockAddrStorage(saddr, out_addr);
-  Win32Socket* socket = new Win32Socket;
-  if (0 == socket->Attach(s))
-    return socket;
-  delete socket;
-  return nullptr;
-}
-
-int Win32Socket::Close() {
-  int err = 0;
-  if (socket_ != INVALID_SOCKET) {
-    err = ::closesocket(socket_);
-    socket_ = INVALID_SOCKET;
-    closing_ = false;
-    close_error_ = 0;
-    UpdateLastError();
-  }
-  if (dns_) {
-    WSACancelAsyncRequest(dns_->handle);
-    delete dns_;
-    dns_ = nullptr;
-  }
-  if (sink_) {
-    sink_->Dispose();
-    sink_ = nullptr;
-  }
-  addr_.Clear();
-  state_ = CS_CLOSED;
-  return err;
-}
-
-void Win32Socket::CreateSink() {
-  RTC_DCHECK(nullptr == sink_);
-
-  // Create window
-  sink_ = new EventSink(this);
-  sink_->Create(nullptr, L"EventSink", 0, 0, 0, 0, 10, 10);
-}
-
-bool Win32Socket::SetAsync(int events) {
-  if (nullptr == sink_) {
-    CreateSink();
-    RTC_DCHECK(nullptr != sink_);
-  }
-
-  // start the async select
-  if (WSAAsyncSelect(socket_, sink_->handle(), WM_SOCKETNOTIFY, events)
-      == SOCKET_ERROR) {
-    UpdateLastError();
-    Close();
-    return false;
-  }
-
-  return true;
-}
-
-bool Win32Socket::HandleClosed(int close_error) {
-  // WM_CLOSE will be received before all data has been read, so we need to
-  // hold on to it until the read buffer has been drained.
-  char ch;
-  closing_ = true;
-  close_error_ = close_error;
-  return (::recv(socket_, &ch, 1, MSG_PEEK) <= 0);
-}
-
-void Win32Socket::PostClosed() {
-  // If we see that the buffer is indeed drained, then send the close.
-  closing_ = false;
-  ::PostMessage(sink_->handle(), WM_SOCKETNOTIFY,
-                socket_, WSAMAKESELECTREPLY(FD_CLOSE, close_error_));
-}
-
-void Win32Socket::UpdateLastError() {
-  error_ = WSAGetLastError();
-}
-
-int Win32Socket::TranslateOption(Option opt, int* slevel, int* sopt) {
-  switch (opt) {
-    case OPT_DONTFRAGMENT:
-      *slevel = IPPROTO_IP;
-      *sopt = IP_DONTFRAGMENT;
-      break;
-    case OPT_RCVBUF:
-      *slevel = SOL_SOCKET;
-      *sopt = SO_RCVBUF;
-      break;
-    case OPT_SNDBUF:
-      *slevel = SOL_SOCKET;
-      *sopt = SO_SNDBUF;
-      break;
-    case OPT_NODELAY:
-      *slevel = IPPROTO_TCP;
-      *sopt = TCP_NODELAY;
-      break;
-    case OPT_DSCP:
-      LOG(LS_WARNING) << "Socket::OPT_DSCP not supported.";
-      return -1;
-    default:
-      RTC_NOTREACHED();
-      return -1;
-  }
-  return 0;
-}
-
-void Win32Socket::OnSocketNotify(SOCKET socket, int event, int error) {
-  // Ignore events if we're already closed.
-  if (socket != socket_)
-    return;
-
-  error_ = error;
-  switch (event) {
-    case FD_CONNECT:
-      if (error != ERROR_SUCCESS) {
-        ReportWSAError("WSAAsync:connect notify", error, addr_);
-#if !defined(NDEBUG)
-        int64_t duration = TimeSince(connect_time_);
-        LOG(LS_INFO) << "WSAAsync:connect error (" << duration
-                     << " ms), faking close";
-#endif
-        state_ = CS_CLOSED;
-        // If you get an error connecting, close doesn't really do anything
-        // and it certainly doesn't send back any close notification, but
-        // we really only maintain a few states, so it is easiest to get
-        // back into a known state by pretending that a close happened, even
-        // though the connect event never did occur.
-        SignalCloseEvent(this, error);
-      } else {
-#if !defined(NDEBUG)
-        int64_t duration = TimeSince(connect_time_);
-        LOG(LS_INFO) << "WSAAsync:connect (" << duration << " ms)";
-#endif
-        state_ = CS_CONNECTED;
-        SignalConnectEvent(this);
-      }
-      break;
-
-    case FD_ACCEPT:
-    case FD_READ:
-      if (error != ERROR_SUCCESS) {
-        ReportWSAError("WSAAsync:read notify", error, addr_);
-      } else {
-        SignalReadEvent(this);
-      }
-      break;
-
-    case FD_WRITE:
-      if (error != ERROR_SUCCESS) {
-        ReportWSAError("WSAAsync:write notify", error, addr_);
-      } else {
-        SignalWriteEvent(this);
-      }
-      break;
-
-    case FD_CLOSE:
-      if (HandleClosed(error)) {
-        ReportWSAError("WSAAsync:close notify", error, addr_);
-        state_ = CS_CLOSED;
-        SignalCloseEvent(this, error);
-      }
-      break;
-  }
-}
-
-void Win32Socket::OnDnsNotify(HANDLE task, int error) {
-  if (!dns_ || dns_->handle != task)
-    return;
-
-  uint32_t ip = 0;
-  if (error == 0) {
-    hostent* pHost = reinterpret_cast<hostent*>(dns_->buffer);
-    uint32_t net_ip = *reinterpret_cast<uint32_t*>(pHost->h_addr_list[0]);
-    ip = NetworkToHost32(net_ip);
-  }
-
-  LOG_F(LS_INFO) << "(" << IPAddress(ip).ToSensitiveString()
-                 << ", " << error << ")";
-
-  if (error == 0) {
-    SocketAddress address(ip, dns_->port);
-    error = DoConnect(address);
-  } else {
-    Close();
-  }
-
-  if (error) {
-    error_ = error;
-    SignalCloseEvent(this, error_);
-  } else {
-    delete dns_;
-    dns_ = nullptr;
-  }
-}
-
-///////////////////////////////////////////////////////////////////////////////
-// Win32SocketServer
-// Provides cricket base services on top of a win32 gui thread
-///////////////////////////////////////////////////////////////////////////////
-
-static UINT s_wm_wakeup_id = 0;
-const TCHAR Win32SocketServer::kWindowName[] = L"libjingle Message Window";
-
-Win32SocketServer::Win32SocketServer()
-    : wnd_(this),
-      posted_(false),
-      hdlg_(nullptr) {
-  if (s_wm_wakeup_id == 0)
-    s_wm_wakeup_id = RegisterWindowMessage(L"WM_WAKEUP");
-  if (!wnd_.Create(nullptr, kWindowName, 0, 0, 0, 0, 0, 0)) {
-    LOG_GLE(LS_ERROR) << "Failed to create message window.";
-  }
-}
-
-Win32SocketServer::~Win32SocketServer() {
-  if (wnd_.handle() != nullptr) {
-    KillTimer(wnd_.handle(), 1);
-    wnd_.Destroy();
-  }
-}
-
-Socket* Win32SocketServer::CreateSocket(int type) {
-  return CreateSocket(AF_INET, type);
-}
-
-Socket* Win32SocketServer::CreateSocket(int family, int type) {
-  return CreateAsyncSocket(family, type);
-}
-
-AsyncSocket* Win32SocketServer::CreateAsyncSocket(int type) {
-  return CreateAsyncSocket(AF_INET, type);
-}
-
-AsyncSocket* Win32SocketServer::CreateAsyncSocket(int family, int type) {
-  Win32Socket* socket = new Win32Socket;
-  if (socket->CreateT(family, type)) {
-    return socket;
-  }
-  delete socket;
-  return nullptr;
-}
-
-void Win32SocketServer::SetMessageQueue(MessageQueue* queue) {
-  message_queue_ = queue;
-}
-
-bool Win32SocketServer::Wait(int cms, bool process_io) {
-  BOOL b;
-  if (process_io) {
-    // Spin the Win32 message pump at least once, and as long as requested.
-    // This is the Thread::ProcessMessages case.
-    uint32_t start = Time();
-    do {
-      MSG msg;
-      SetTimer(wnd_.handle(), 0, cms, nullptr);
-      // Get the next available message. If we have a modeless dialog, give
-      // give the message to IsDialogMessage, which will return true if it
-      // was a message for the dialog that it handled internally.
-      // Otherwise, dispatch as usual via Translate/DispatchMessage.
-      b = GetMessage(&msg, nullptr, 0, 0);
-      if (b == -1) {
-        LOG_GLE(LS_ERROR) << "GetMessage failed.";
-        return false;
-      } else if(b) {
-        if (!hdlg_ || !IsDialogMessage(hdlg_, &msg)) {
-          TranslateMessage(&msg);
-          DispatchMessage(&msg);
-        }
-      }
-      KillTimer(wnd_.handle(), 0);
-    } while (b && TimeSince(start) < cms);
-  } else if (cms != 0) {
-    // Sit and wait forever for a WakeUp. This is the Thread::Send case.
-    RTC_DCHECK(cms == -1);
-    MSG msg;
-    b = GetMessage(&msg, nullptr, s_wm_wakeup_id, s_wm_wakeup_id);
-    {
-      CritScope scope(&cs_);
-      posted_ = false;
-    }
-  } else {
-    // No-op (cms == 0 && !process_io). This is the Pump case.
-    b = TRUE;
-  }
-  return (b != FALSE);
-}
-
-void Win32SocketServer::WakeUp() {
-  if (wnd_.handle()) {
-    // Set the "message pending" flag, if not already set.
-    {
-      CritScope scope(&cs_);
-      if (posted_)
-        return;
-      posted_ = true;
-    }
-
-    PostMessage(wnd_.handle(), s_wm_wakeup_id, 0, 0);
-  }
-}
-
-void Win32SocketServer::Pump() {
-  // Clear the "message pending" flag.
-  {
-    CritScope scope(&cs_);
-    posted_ = false;
-  }
-
-  // Dispatch all the messages that are currently in our queue. If new messages
-  // are posted during the dispatch, they will be handled in the next Pump.
-  // We use max(1, ...) to make sure we try to dispatch at least once, since
-  // this allow us to process "sent" messages, not included in the size() count.
-  Message msg;
-  for (size_t max_messages_to_process =
-           std::max<size_t>(1, message_queue_->size());
-       max_messages_to_process > 0 && message_queue_->Get(&msg, 0, false);
-       --max_messages_to_process) {
-    message_queue_->Dispatch(&msg);
-  }
-
-  // Anything remaining?
-  int delay = message_queue_->GetDelay();
-  if (delay == -1) {
-    KillTimer(wnd_.handle(), 1);
-  } else {
-    SetTimer(wnd_.handle(), 1, delay, nullptr);
-  }
-}
-
-bool Win32SocketServer::MessageWindow::OnMessage(UINT wm, WPARAM wp,
-                                                 LPARAM lp, LRESULT& lr) {
-  bool handled = false;
-  if (wm == s_wm_wakeup_id || (wm == WM_TIMER && wp == 1)) {
-    ss_->Pump();
-    lr = 0;
-    handled = true;
-  }
-  return handled;
-}
-
-}  // namespace rtc
diff --git a/rtc_base/win32socketserver.h b/rtc_base/win32socketserver.h
deleted file mode 100644
index 1255a80..0000000
--- a/rtc_base/win32socketserver.h
+++ /dev/null
@@ -1,162 +0,0 @@
-/*
- *  Copyright 2004 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_RTC_BASE_WIN32SOCKETSERVER_H_
-#define WEBRTC_RTC_BASE_WIN32SOCKETSERVER_H_
-
-#if defined(WEBRTC_WIN)
-#include "webrtc/rtc_base/asyncsocket.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/messagequeue.h"
-#include "webrtc/rtc_base/socket.h"
-#include "webrtc/rtc_base/socketfactory.h"
-#include "webrtc/rtc_base/socketserver.h"
-#include "webrtc/rtc_base/thread.h"
-#include "webrtc/rtc_base/win32window.h"
-
-namespace rtc {
-
-///////////////////////////////////////////////////////////////////////////////
-// Win32Socket
-///////////////////////////////////////////////////////////////////////////////
-
-class Win32Socket : public AsyncSocket {
- public:
-  Win32Socket();
-  virtual ~Win32Socket();
-
-  bool CreateT(int family, int type);
-
-  int Attach(SOCKET s);
-  void SetTimeout(int ms);
-
-  // AsyncSocket Interface
-  virtual SocketAddress GetLocalAddress() const;
-  virtual SocketAddress GetRemoteAddress() const;
-  virtual int Bind(const SocketAddress& addr);
-  virtual int Connect(const SocketAddress& addr);
-  virtual int Send(const void *buffer, size_t length);
-  virtual int SendTo(const void *buffer, size_t length, const SocketAddress& addr);
-  virtual int Recv(void* buffer, size_t length, int64_t* timestamp);
-  virtual int RecvFrom(void* buffer,
-                       size_t length,
-                       SocketAddress* out_addr,
-                       int64_t* timestamp);
-  virtual int Listen(int backlog);
-  virtual Win32Socket *Accept(SocketAddress *out_addr);
-  virtual int Close();
-  virtual int GetError() const;
-  virtual void SetError(int error);
-  virtual ConnState GetState() const;
-  virtual int GetOption(Option opt, int* value);
-  virtual int SetOption(Option opt, int value);
-
- private:
-  void CreateSink();
-  bool SetAsync(int events);
-  int DoConnect(const SocketAddress& addr);
-  bool HandleClosed(int close_error);
-  void PostClosed();
-  void UpdateLastError();
-  static int TranslateOption(Option opt, int* slevel, int* sopt);
-
-  void OnSocketNotify(SOCKET socket, int event, int error);
-  void OnDnsNotify(HANDLE task, int error);
-
-  SOCKET socket_;
-  int error_;
-  ConnState state_;
-  SocketAddress addr_;         // address that we connected to (see DoConnect)
-  uint32_t connect_time_;
-  bool closing_;
-  int close_error_;
-
-  class EventSink;
-  friend class EventSink;
-  EventSink * sink_;
-
-  struct DnsLookup;
-  DnsLookup * dns_;
-};
-
-///////////////////////////////////////////////////////////////////////////////
-// Win32SocketServer
-///////////////////////////////////////////////////////////////////////////////
-
-class Win32SocketServer : public SocketServer {
- public:
-  Win32SocketServer();
-  virtual ~Win32SocketServer();
-
-  void set_modeless_dialog(HWND hdlg) {
-    hdlg_ = hdlg;
-  }
-
-  // SocketServer Interface
-  virtual Socket* CreateSocket(int type);
-  virtual Socket* CreateSocket(int family, int type);
-
-  virtual AsyncSocket* CreateAsyncSocket(int type);
-  virtual AsyncSocket* CreateAsyncSocket(int family, int type);
-
-  virtual void SetMessageQueue(MessageQueue* queue);
-  virtual bool Wait(int cms, bool process_io);
-  virtual void WakeUp();
-
-  void Pump();
-
-  HWND handle() { return wnd_.handle(); }
-
- private:
-  class MessageWindow : public Win32Window {
-   public:
-    explicit MessageWindow(Win32SocketServer* ss) : ss_(ss) {}
-   private:
-    virtual bool OnMessage(UINT msg, WPARAM wp, LPARAM lp, LRESULT& result);
-    Win32SocketServer* ss_;
-  };
-
-  static const TCHAR kWindowName[];
-  MessageQueue *message_queue_;
-  MessageWindow wnd_;
-  CriticalSection cs_;
-  bool posted_;
-  HWND hdlg_;
-};
-
-///////////////////////////////////////////////////////////////////////////////
-// Win32Thread. Automatically pumps Windows messages.
-///////////////////////////////////////////////////////////////////////////////
-
-class Win32Thread : public Thread {
- public:
-  explicit Win32Thread(SocketServer* ss) : Thread(ss),  id_(0) {}
-  virtual ~Win32Thread() {
-    Stop();
-  }
-  virtual void Run() {
-    id_ = GetCurrentThreadId();
-    Thread::Run();
-    id_ = 0;
-  }
-  virtual void Quit() {
-    PostThreadMessage(id_, WM_QUIT, 0, 0);
-  }
- private:
-  DWORD id_;
-};
-
-///////////////////////////////////////////////////////////////////////////////
-
-}  // namespace rtc
-
-#endif  // WEBRTC_WIN
-
-#endif  // WEBRTC_RTC_BASE_WIN32SOCKETSERVER_H_
diff --git a/rtc_base/win32socketserver_unittest.cc b/rtc_base/win32socketserver_unittest.cc
deleted file mode 100644
index 9eacff7..0000000
--- a/rtc_base/win32socketserver_unittest.cc
+++ /dev/null
@@ -1,161 +0,0 @@
-/*
- *  Copyright 2009 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/rtc_base/win32socketserver.h"
-#include "webrtc/rtc_base/gunit.h"
-#include "webrtc/rtc_base/socket_unittest.h"
-#include "webrtc/rtc_base/thread.h"
-
-namespace rtc {
-
-// Test that Win32SocketServer::Wait works as expected.
-TEST(Win32SocketServerTest, TestWait) {
-  Win32SocketServer server;
-  uint32_t start = Time();
-  server.Wait(1000, true);
-  EXPECT_GE(TimeSince(start), 1000);
-}
-
-// Test that Win32Socket::Pump does not touch general Windows messages.
-TEST(Win32SocketServerTest, TestPump) {
-  Win32SocketServer server;
-  rtc::AutoSocketServerThread thread(&server);
-  EXPECT_EQ(TRUE, PostMessage(nullptr, WM_USER, 999, 0));
-  server.Pump();
-  MSG msg;
-  EXPECT_EQ(TRUE, PeekMessage(&msg, nullptr, WM_USER, 0, PM_REMOVE));
-  EXPECT_EQ(static_cast<UINT>(WM_USER), msg.message);
-  EXPECT_EQ(999u, msg.wParam);
-}
-
-// Test that Win32Socket passes all the generic Socket tests.
-class Win32SocketTest : public SocketTest {
- protected:
-  Win32SocketTest() : thread_(&server_) {}
-  Win32SocketServer server_;
-  rtc::AutoSocketServerThread thread_;
-};
-
-TEST_F(Win32SocketTest, TestConnectIPv4) {
-  SocketTest::TestConnectIPv4();
-}
-
-TEST_F(Win32SocketTest, TestConnectIPv6) {
-  SocketTest::TestConnectIPv6();
-}
-
-TEST_F(Win32SocketTest, TestConnectWithDnsLookupIPv4) {
-  SocketTest::TestConnectWithDnsLookupIPv4();
-}
-
-TEST_F(Win32SocketTest, TestConnectWithDnsLookupIPv6) {
-  SocketTest::TestConnectWithDnsLookupIPv6();
-}
-
-TEST_F(Win32SocketTest, TestConnectFailIPv4) {
-  SocketTest::TestConnectFailIPv4();
-}
-
-TEST_F(Win32SocketTest, TestConnectFailIPv6) {
-  SocketTest::TestConnectFailIPv6();
-}
-
-TEST_F(Win32SocketTest, TestConnectWithDnsLookupFailIPv4) {
-  SocketTest::TestConnectWithDnsLookupFailIPv4();
-}
-
-TEST_F(Win32SocketTest, TestConnectWithDnsLookupFailIPv6) {
-  SocketTest::TestConnectWithDnsLookupFailIPv6();
-}
-
-TEST_F(Win32SocketTest, TestConnectWithClosedSocketIPv4) {
-  SocketTest::TestConnectWithClosedSocketIPv4();
-}
-
-TEST_F(Win32SocketTest, TestConnectWithClosedSocketIPv6) {
-  SocketTest::TestConnectWithClosedSocketIPv6();
-}
-
-TEST_F(Win32SocketTest, TestConnectWhileNotClosedIPv4) {
-  SocketTest::TestConnectWhileNotClosedIPv4();
-}
-
-TEST_F(Win32SocketTest, TestConnectWhileNotClosedIPv6) {
-  SocketTest::TestConnectWhileNotClosedIPv6();
-}
-
-TEST_F(Win32SocketTest, TestServerCloseDuringConnectIPv4) {
-  SocketTest::TestServerCloseDuringConnectIPv4();
-}
-
-TEST_F(Win32SocketTest, TestServerCloseDuringConnectIPv6) {
-  SocketTest::TestServerCloseDuringConnectIPv6();
-}
-
-TEST_F(Win32SocketTest, TestClientCloseDuringConnectIPv4) {
-  SocketTest::TestClientCloseDuringConnectIPv4();
-}
-
-TEST_F(Win32SocketTest, TestClientCloseDuringConnectIPv6) {
-  SocketTest::TestClientCloseDuringConnectIPv6();
-}
-
-TEST_F(Win32SocketTest, TestServerCloseIPv4) {
-  SocketTest::TestServerCloseIPv4();
-}
-
-TEST_F(Win32SocketTest, TestServerCloseIPv6) {
-  SocketTest::TestServerCloseIPv6();
-}
-
-TEST_F(Win32SocketTest, TestCloseInClosedCallbackIPv4) {
-  SocketTest::TestCloseInClosedCallbackIPv4();
-}
-
-TEST_F(Win32SocketTest, TestCloseInClosedCallbackIPv6) {
-  SocketTest::TestCloseInClosedCallbackIPv6();
-}
-
-TEST_F(Win32SocketTest, TestSocketServerWaitIPv4) {
-  SocketTest::TestSocketServerWaitIPv4();
-}
-
-TEST_F(Win32SocketTest, TestSocketServerWaitIPv6) {
-  SocketTest::TestSocketServerWaitIPv6();
-}
-
-TEST_F(Win32SocketTest, TestTcpIPv4) {
-  SocketTest::TestTcpIPv4();
-}
-
-TEST_F(Win32SocketTest, TestTcpIPv6) {
-  SocketTest::TestTcpIPv6();
-}
-
-TEST_F(Win32SocketTest, TestUdpIPv4) {
-  SocketTest::TestUdpIPv4();
-}
-
-TEST_F(Win32SocketTest, TestUdpIPv6) {
-  SocketTest::TestUdpIPv6();
-}
-
-// Breaks win_x64_dbg bot.
-// https://bugs.chromium.org/p/webrtc/issues/detail?id=6178
-TEST_F(Win32SocketTest, DISABLED_TestGetSetOptionsIPv4) {
-  SocketTest::TestGetSetOptionsIPv4();
-}
-
-// Breaks win_x64_dbg bot.
-// https://bugs.chromium.org/p/webrtc/issues/detail?id=6178
-TEST_F(Win32SocketTest, DISABLED_TestGetSetOptionsIPv6) {
-  SocketTest::TestGetSetOptionsIPv6();
-}
-
-}  // namespace rtc
diff --git a/rtc_base/win32window.cc b/rtc_base/win32window.cc
deleted file mode 100644
index e005ba1..0000000
--- a/rtc_base/win32window.cc
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- *  Copyright 2004 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/rtc_base/win32window.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-
-namespace rtc {
-
-///////////////////////////////////////////////////////////////////////////////
-// Win32Window
-///////////////////////////////////////////////////////////////////////////////
-
-static const wchar_t kWindowBaseClassName[] = L"WindowBaseClass";
-HINSTANCE Win32Window::instance_ = nullptr;
-ATOM Win32Window::window_class_ = 0;
-
-Win32Window::Win32Window() : wnd_(nullptr) {}
-
-Win32Window::~Win32Window() {
-  RTC_DCHECK(nullptr == wnd_);
-}
-
-bool Win32Window::Create(HWND parent, const wchar_t* title, DWORD style,
-                         DWORD exstyle, int x, int y, int cx, int cy) {
-  if (wnd_) {
-    // Window already exists.
-    return false;
-  }
-
-  if (!window_class_) {
-    if (!GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS |
-                           GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT,
-                           reinterpret_cast<LPCWSTR>(&Win32Window::WndProc),
-                           &instance_)) {
-      LOG_GLE(LS_ERROR) << "GetModuleHandleEx failed";
-      return false;
-    }
-
-    // Class not registered, register it.
-    WNDCLASSEX wcex;
-    memset(&wcex, 0, sizeof(wcex));
-    wcex.cbSize = sizeof(wcex);
-    wcex.hInstance = instance_;
-    wcex.lpfnWndProc = &Win32Window::WndProc;
-    wcex.lpszClassName = kWindowBaseClassName;
-    window_class_ = ::RegisterClassEx(&wcex);
-    if (!window_class_) {
-      LOG_GLE(LS_ERROR) << "RegisterClassEx failed";
-      return false;
-    }
-  }
-  wnd_ = ::CreateWindowEx(exstyle, kWindowBaseClassName, title, style, x, y, cx,
-                          cy, parent, nullptr, instance_, this);
-  return (nullptr != wnd_);
-}
-
-void Win32Window::Destroy() {
-  const bool success = ::DestroyWindow(wnd_);
-  RTC_DCHECK(success);
-}
-
-void Win32Window::Shutdown() {
-  if (window_class_) {
-    ::UnregisterClass(MAKEINTATOM(window_class_), instance_);
-    window_class_ = 0;
-  }
-}
-
-bool Win32Window::OnMessage(UINT uMsg, WPARAM wParam, LPARAM lParam,
-                            LRESULT& result) {
-  switch (uMsg) {
-  case WM_CLOSE:
-    if (!OnClose()) {
-      result = 0;
-      return true;
-    }
-    break;
-  }
-  return false;
-}
-
-LRESULT Win32Window::WndProc(HWND hwnd, UINT uMsg,
-                             WPARAM wParam, LPARAM lParam) {
-  Win32Window* that = reinterpret_cast<Win32Window*>(
-      ::GetWindowLongPtr(hwnd, GWLP_USERDATA));
-  if (!that && (WM_CREATE == uMsg)) {
-    CREATESTRUCT* cs = reinterpret_cast<CREATESTRUCT*>(lParam);
-    that = static_cast<Win32Window*>(cs->lpCreateParams);
-    that->wnd_ = hwnd;
-    ::SetWindowLongPtr(hwnd, GWLP_USERDATA, reinterpret_cast<LONG_PTR>(that));
-  }
-  if (that) {
-    LRESULT result;
-    bool handled = that->OnMessage(uMsg, wParam, lParam, result);
-    if (WM_DESTROY == uMsg) {
-      for (HWND child = ::GetWindow(hwnd, GW_CHILD); child;
-           child = ::GetWindow(child, GW_HWNDNEXT)) {
-        LOG(LS_INFO) << "Child window: " << static_cast<void*>(child);
-      }
-    }
-    if (WM_NCDESTROY == uMsg) {
-      ::SetWindowLongPtr(hwnd, GWLP_USERDATA, NULL);
-      that->wnd_ = nullptr;
-      that->OnNcDestroy();
-    }
-    if (handled) {
-      return result;
-    }
-  }
-  return ::DefWindowProc(hwnd, uMsg, wParam, lParam);
-}
-
-}  // namespace rtc
diff --git a/rtc_base/win32window.h b/rtc_base/win32window.h
deleted file mode 100644
index a9fe843..0000000
--- a/rtc_base/win32window.h
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- *  Copyright 2004 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_RTC_BASE_WIN32WINDOW_H_
-#define WEBRTC_RTC_BASE_WIN32WINDOW_H_
-
-#if defined(WEBRTC_WIN)
-
-#include "webrtc/rtc_base/win32.h"
-
-namespace rtc {
-
-///////////////////////////////////////////////////////////////////////////////
-// Win32Window
-///////////////////////////////////////////////////////////////////////////////
-
-class Win32Window {
- public:
-  Win32Window();
-  virtual ~Win32Window();
-
-  HWND handle() const { return wnd_; }
-
-  bool Create(HWND parent, const wchar_t* title, DWORD style, DWORD exstyle,
-              int x, int y, int cx, int cy);
-  void Destroy();
-
-  // Call this when your DLL unloads.
-  static void Shutdown();
-
- protected:
-  virtual bool OnMessage(UINT uMsg, WPARAM wParam, LPARAM lParam,
-                         LRESULT& result);
-
-  virtual bool OnClose() { return true; }
-  virtual void OnNcDestroy() { }
-
- private:
-  static LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam,
-                                  LPARAM lParam);
-
-  HWND wnd_;
-  static HINSTANCE instance_;
-  static ATOM window_class_;
-};
-
-///////////////////////////////////////////////////////////////////////////////
-
-}  // namespace rtc
-
-#endif  // WEBRTC_WIN
-
-#endif  // WEBRTC_RTC_BASE_WIN32WINDOW_H_
diff --git a/rtc_base/win32window_unittest.cc b/rtc_base/win32window_unittest.cc
deleted file mode 100644
index 9bd2d34..0000000
--- a/rtc_base/win32window_unittest.cc
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- *  Copyright 2009 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/rtc_base/win32window.h"
-#include "webrtc/rtc_base/gunit.h"
-#include "webrtc/rtc_base/logging.h"
-
-static LRESULT kDummyResult = 0x1234ABCD;
-
-class TestWindow : public rtc::Win32Window {
- public:
-  TestWindow() : destroyed_(false) { memset(&msg_, 0, sizeof(msg_)); }
-  const MSG& msg() const { return msg_; }
-  bool destroyed() const { return destroyed_; }
-
-  virtual bool OnMessage(UINT uMsg, WPARAM wParam,
-                         LPARAM lParam, LRESULT& result) {
-    msg_.message = uMsg;
-    msg_.wParam = wParam;
-    msg_.lParam = lParam;
-    result = kDummyResult;
-    return true;
-  }
-  virtual void OnNcDestroy() {
-    destroyed_ = true;
-  }
-
- private:
-  MSG msg_;
-  bool destroyed_;
-};
-
-TEST(Win32WindowTest, Basics) {
-  TestWindow wnd;
-  EXPECT_TRUE(wnd.handle() == nullptr);
-  EXPECT_FALSE(wnd.destroyed());
-  EXPECT_TRUE(wnd.Create(0, L"Test", 0, 0, 0, 0, 100, 100));
-  EXPECT_TRUE(wnd.handle() != nullptr);
-  EXPECT_EQ(kDummyResult, ::SendMessage(wnd.handle(), WM_USER, 1, 2));
-  EXPECT_EQ(static_cast<UINT>(WM_USER), wnd.msg().message);
-  EXPECT_EQ(1u, wnd.msg().wParam);
-  EXPECT_EQ(2l, wnd.msg().lParam);
-  wnd.Destroy();
-  EXPECT_TRUE(wnd.handle() == nullptr);
-  EXPECT_TRUE(wnd.destroyed());
-}
-
-TEST(Win32WindowTest, MultipleWindows) {
-  TestWindow wnd1, wnd2;
-  EXPECT_TRUE(wnd1.Create(0, L"Test", 0, 0, 0, 0, 100, 100));
-  EXPECT_TRUE(wnd2.Create(0, L"Test", 0, 0, 0, 0, 100, 100));
-  EXPECT_TRUE(wnd1.handle() != nullptr);
-  EXPECT_TRUE(wnd2.handle() != nullptr);
-  wnd1.Destroy();
-  wnd2.Destroy();
-  EXPECT_TRUE(wnd2.handle() == nullptr);
-  EXPECT_TRUE(wnd1.handle() == nullptr);
-}
diff --git a/rtc_base/window.h b/rtc_base/window.h
deleted file mode 100644
index 10ed9f7..0000000
--- a/rtc_base/window.h
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- *  Copyright 2004 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_RTC_BASE_WINDOW_H_
-#define WEBRTC_RTC_BASE_WINDOW_H_
-
-#include <stdint.h>
-
-#include "webrtc/rtc_base/stringencode.h"
-
-// Define platform specific window types.
-#if defined(WEBRTC_LINUX) && !defined(WEBRTC_ANDROID)
-typedef unsigned long Window;  // Avoid include <X11/Xlib.h>.
-#elif defined(WEBRTC_WIN)
-// We commonly include win32.h in webrtc/rtc_base so just include it here.
-#include "webrtc/rtc_base/win32.h"  // Include HWND, HMONITOR.
-#elif defined(WEBRTC_MAC) && !defined(WEBRTC_IOS)
-typedef unsigned int CGWindowID;
-typedef unsigned int CGDirectDisplayID;
-#endif
-
-namespace rtc {
-
-class WindowId {
- public:
-  // Define WindowT for each platform.
-#if defined(WEBRTC_LINUX) && !defined(WEBRTC_ANDROID)
-  typedef Window WindowT;
-#elif defined(WEBRTC_WIN)
-  typedef HWND WindowT;
-#elif defined(WEBRTC_MAC) && !defined(WEBRTC_IOS)
-  typedef CGWindowID WindowT;
-#else
-  typedef unsigned int WindowT;
-#endif
-
-  static WindowId Cast(uint64_t id) {
-#if defined(WEBRTC_WIN)
-    return WindowId(reinterpret_cast<WindowId::WindowT>(id));
-#else
-    return WindowId(static_cast<WindowId::WindowT>(id));
-#endif
-  }
-
-  static uint64_t Format(const WindowT& id) {
-#if defined(WEBRTC_WIN)
-    return static_cast<uint64_t>(reinterpret_cast<uintptr_t>(id));
-#else
-    return static_cast<uint64_t>(id);
-#endif
-  }
-
-  WindowId() : id_(0) {}
-  WindowId(const WindowT& id) : id_(id) {}  // NOLINT
-  const WindowT& id() const { return id_; }
-  bool IsValid() const { return id_ != 0; }
-  bool Equals(const WindowId& other) const {
-    return id_ == other.id();
-  }
-
- private:
-  WindowT id_;
-};
-
-inline std::string ToString(const WindowId& window) {
-  return ToString(window.id());
-}
-
-}  // namespace rtc
-
-#endif  // WEBRTC_RTC_BASE_WINDOW_H_
diff --git a/rtc_tools/BUILD.gn b/rtc_tools/BUILD.gn
deleted file mode 100644
index 2166978..0000000
--- a/rtc_tools/BUILD.gn
+++ /dev/null
@@ -1,358 +0,0 @@
-# Copyright (c) 2014 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.
-
-import("//third_party/protobuf/proto_library.gni")
-import("../webrtc.gni")
-
-group("rtc_tools") {
-  # This target shall build all targets in tools/.
-  testonly = true
-
-  public_deps = [
-    ":command_line_parser",
-    ":frame_analyzer",
-    ":video_quality_analysis",
-  ]
-  if (!build_with_chromium) {
-    public_deps += [
-      ":frame_editor",
-      ":psnr_ssim_analyzer",
-      ":rgba_to_i420_converter",
-    ]
-    if (rtc_include_internal_audio_device) {
-      public_deps += [ ":force_mic_volume_max" ]
-    }
-    if (rtc_enable_protobuf) {
-      public_deps += [ ":chart_proto" ]
-    }
-  }
-
-  if (rtc_include_tests) {
-    public_deps += [
-      ":activity_metric",
-      ":tools_unittests",
-    ]
-    if (rtc_enable_protobuf) {
-      public_deps += [
-        ":event_log_visualizer",
-        ":rtp_analyzer",
-        "network_tester",
-      ]
-    }
-  }
-}
-
-rtc_static_library("command_line_parser") {
-  sources = [
-    "simple_command_line_parser.cc",
-    "simple_command_line_parser.h",
-  ]
-  deps = [
-    "../rtc_base:gtest_prod",
-    "../rtc_base:rtc_base_approved",
-  ]
-}
-
-rtc_static_library("video_quality_analysis") {
-  sources = [
-    "frame_analyzer/video_quality_analysis.cc",
-    "frame_analyzer/video_quality_analysis.h",
-  ]
-
-  public_deps = [
-    "../common_video",
-  ]
-}
-
-rtc_executable("frame_analyzer") {
-  sources = [
-    "frame_analyzer/frame_analyzer.cc",
-  ]
-
-  deps = [
-    ":command_line_parser",
-    ":video_quality_analysis",
-    "//build/win:default_exe_manifest",
-  ]
-}
-
-# Only expose the targets needed by Chromium (e.g. frame_analyzer) to avoid
-# building a lot of redundant code as part of Chromium builds.
-if (!build_with_chromium) {
-  rtc_executable("psnr_ssim_analyzer") {
-    sources = [
-      "psnr_ssim_analyzer/psnr_ssim_analyzer.cc",
-    ]
-
-    deps = [
-      ":command_line_parser",
-      ":video_quality_analysis",
-      "//build/win:default_exe_manifest",
-    ]
-  }
-
-  rtc_static_library("reference_less_video_analysis_lib") {
-    sources = [
-      "frame_analyzer/reference_less_video_analysis_lib.cc",
-      "frame_analyzer/reference_less_video_analysis_lib.h",
-    ]
-
-    deps = [
-      ":video_quality_analysis",
-    ]
-  }
-
-  rtc_executable("reference_less_video_analysis") {
-    sources = [
-      "frame_analyzer/reference_less_video_analysis.cc",
-    ]
-
-    deps = [
-      ":command_line_parser",
-      ":reference_less_video_analysis_lib",
-      "//build/win:default_exe_manifest",
-    ]
-  }
-
-  rtc_executable("rgba_to_i420_converter") {
-    sources = [
-      "converter/converter.cc",
-      "converter/converter.h",
-      "converter/rgba_to_i420_converter.cc",
-    ]
-
-    deps = [
-      ":command_line_parser",
-      "../common_video",
-      "//build/win:default_exe_manifest",
-    ]
-  }
-
-  rtc_static_library("frame_editing_lib") {
-    sources = [
-      "frame_editing/frame_editing_lib.cc",
-      "frame_editing/frame_editing_lib.h",
-    ]
-
-    # TODO(jschuh): Bug 1348: fix this warning.
-    configs += [ "//build/config/compiler:no_size_t_to_int_warning" ]
-
-    if (!build_with_chromium && is_clang) {
-      # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-    }
-
-    deps = [
-      "..:webrtc_common",
-      "../common_video",
-    ]
-  }
-
-  rtc_executable("frame_editor") {
-    sources = [
-      "frame_editing/frame_editing.cc",
-    ]
-
-    deps = [
-      ":command_line_parser",
-      ":frame_editing_lib",
-      "//build/win:default_exe_manifest",
-    ]
-  }
-
-  # It doesn't make sense to build this tool without the ADM enabled.
-  if (rtc_include_internal_audio_device) {
-    rtc_executable("force_mic_volume_max") {
-      sources = [
-        "force_mic_volume_max/force_mic_volume_max.cc",
-      ]
-
-      if (!build_with_chromium && is_clang) {
-        # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-        suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-      }
-
-      deps = [
-        "../modules/audio_device",
-        "../system_wrappers:system_wrappers_default",
-        "//build/win:default_exe_manifest",
-      ]
-    }
-  }
-
-  if (rtc_enable_protobuf) {
-    proto_library("chart_proto") {
-      sources = [
-        "event_log_visualizer/chart.proto",
-      ]
-      proto_out_dir = "webrtc/rtc_tools/event_log_visualizer"
-    }
-
-    rtc_static_library("event_log_visualizer_utils") {
-      sources = [
-        "event_log_visualizer/analyzer.cc",
-        "event_log_visualizer/analyzer.h",
-        "event_log_visualizer/plot_base.cc",
-        "event_log_visualizer/plot_base.h",
-        "event_log_visualizer/plot_protobuf.cc",
-        "event_log_visualizer/plot_protobuf.h",
-        "event_log_visualizer/plot_python.cc",
-        "event_log_visualizer/plot_python.h",
-      ]
-      if (!build_with_chromium && is_clang) {
-        # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-        suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-      }
-      defines = [ "ENABLE_RTC_EVENT_LOG" ]
-      deps = [
-        "../call:call_interfaces",
-        "../call:video_stream_api",
-        "../logging:rtc_event_log_impl",
-        "../logging:rtc_event_log_parser",
-        "../modules:module_api",
-        "../modules/audio_coding:ana_debug_dump_proto",
-        "../modules/audio_coding:neteq_tools",
-        "../rtc_base:rtc_base_approved",
-
-        # TODO(kwiberg): Remove this dependency.
-        "../api/audio_codecs:audio_codecs_api",
-        "../modules/congestion_controller",
-        "../modules/rtp_rtcp",
-        "../system_wrappers:system_wrappers_default",
-        "//build/config:exe_and_shlib_deps",
-      ]
-      public_deps = [
-        ":chart_proto",
-        "../logging:rtc_event_log_parser",
-      ]
-    }
-  }
-}
-
-# Exclude tools depending on gflags since that's not available in Chromium.
-if (rtc_include_tests) {
-  if (rtc_enable_protobuf) {
-    rtc_executable("event_log_visualizer") {
-      testonly = true
-      sources = [
-        "event_log_visualizer/main.cc",
-      ]
-
-      if (!build_with_chromium && is_clang) {
-        # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-        suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-      }
-
-      defines = [ "ENABLE_RTC_EVENT_LOG" ]
-      deps = [
-        ":event_log_visualizer_utils",
-        "../rtc_base:rtc_base_approved",
-        "../test:field_trial",
-        "../test:test_support",
-      ]
-    }
-  }
-
-  rtc_executable("activity_metric") {
-    testonly = true
-    sources = [
-      "agc/activity_metric.cc",
-    ]
-
-    if (!build_with_chromium && is_clang) {
-      # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-    }
-
-    deps = [
-      "../modules:module_api",
-      "../modules/audio_processing",
-      "../rtc_base:rtc_base_approved",
-      "../system_wrappers:metrics_default",
-      "../test:test_support",
-      "//build/win:default_exe_manifest",
-      "//testing/gtest",
-    ]
-  }
-
-  tools_unittests_resources = [
-    "../../resources/foreman_cif.yuv",
-    "../../resources/reference_less_video_test_file.y4m",
-    "../../resources/video_quality_analysis_frame.txt",
-  ]
-
-  if (is_ios) {
-    bundle_data("tools_unittests_bundle_data") {
-      testonly = true
-      sources = tools_unittests_resources
-      outputs = [
-        "{{bundle_resources_dir}}/{{source_file_part}}",
-      ]
-    }
-  }
-
-  rtc_test("tools_unittests") {
-    testonly = true
-
-    sources = [
-      "frame_analyzer/reference_less_video_analysis_unittest.cc",
-      "frame_analyzer/video_quality_analysis_unittest.cc",
-      "frame_editing/frame_editing_unittest.cc",
-      "sanitizers_unittest.cc",
-      "simple_command_line_parser_unittest.cc",
-    ]
-
-    # TODO(jschuh): Bug 1348: fix this warning.
-    configs += [ "//build/config/compiler:no_size_t_to_int_warning" ]
-
-    if (!build_with_chromium && is_clang) {
-      # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-    }
-
-    deps = [
-      ":command_line_parser",
-      ":frame_editing_lib",
-      ":reference_less_video_analysis_lib",
-      ":video_quality_analysis",
-      "../rtc_base",
-      "../test:test_main",
-      "//testing/gtest",
-    ]
-
-    if (rtc_enable_protobuf) {
-      deps += [ "network_tester:network_tester_unittests" ]
-    }
-
-    data = tools_unittests_resources
-    if (is_android) {
-      deps += [ "//testing/android/native_test:native_test_support" ]
-      shard_timeout = 900
-    }
-    if (is_ios) {
-      deps += [ ":tools_unittests_bundle_data" ]
-    }
-  }
-
-  if (rtc_enable_protobuf) {
-    copy("rtp_analyzer") {
-      sources = [
-        "py_event_log_analyzer/misc.py",
-        "py_event_log_analyzer/pb_parse.py",
-        "py_event_log_analyzer/rtp_analyzer.py",
-        "py_event_log_analyzer/rtp_analyzer.sh",
-      ]
-      outputs = [
-        "$root_build_dir/{{source_file_part}}",
-      ]
-      deps = [
-        "../logging:rtc_event_log_proto",
-      ]
-    }
-  }
-}
diff --git a/rtc_tools/DEPS b/rtc_tools/DEPS
deleted file mode 100644
index 69b7e58..0000000
--- a/rtc_tools/DEPS
+++ /dev/null
@@ -1,16 +0,0 @@
-include_rules = [
-  "+webrtc/call",
-  "+webrtc/common_video",
-  "+webrtc/logging/rtc_event_log",
-  "+webrtc/modules/audio_device",
-  "+webrtc/modules/audio_coding/audio_network_adaptor",
-  "+webrtc/modules/audio_coding/neteq/tools",
-  "+webrtc/modules/audio_processing",
-  "+webrtc/modules/bitrate_controller",
-  "+webrtc/modules/congestion_controller",
-  "+webrtc/modules/pacing",
-  "+webrtc/modules/rtp_rtcp",
-  "+webrtc/system_wrappers",
-  "+webrtc/p2p",
-]
-
diff --git a/rtc_tools/OWNERS b/rtc_tools/OWNERS
deleted file mode 100644
index 323e8e7..0000000
--- a/rtc_tools/OWNERS
+++ /dev/null
@@ -1,2 +0,0 @@
-phoglund@webrtc.org
-kjellander@webrtc.org
diff --git a/rtc_tools/agc/activity_metric.cc b/rtc_tools/agc/activity_metric.cc
deleted file mode 100644
index 2cca66b..0000000
--- a/rtc_tools/agc/activity_metric.cc
+++ /dev/null
@@ -1,395 +0,0 @@
-/*
- *  Copyright (c) 2012 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 <math.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-#include <algorithm>
-#include <memory>
-
-#include "webrtc/modules/audio_processing/agc/agc.h"
-#include "webrtc/modules/audio_processing/agc/loudness_histogram.h"
-#include "webrtc/modules/audio_processing/agc/utility.h"
-#include "webrtc/modules/audio_processing/vad/common.h"
-#include "webrtc/modules/audio_processing/vad/pitch_based_vad.h"
-#include "webrtc/modules/audio_processing/vad/standalone_vad.h"
-#include "webrtc/modules/audio_processing/vad/vad_audio_proc.h"
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/rtc_base/flags.h"
-#include "webrtc/rtc_base/safe_minmax.h"
-#include "webrtc/test/gtest.h"
-
-static const int kAgcAnalWindowSamples = 100;
-static const float kDefaultActivityThreshold = 0.3f;
-
-DEFINE_bool(standalone_vad, true, "enable stand-alone VAD");
-DEFINE_string(true_vad, "", "name of a file containing true VAD in 'int'"
-              " format");
-DEFINE_string(video_vad, "", "name of a file containing video VAD (activity"
-              " probabilities) in double format. One activity per 10ms is"
-              " required. If no file is given the video information is not"
-              " incorporated. Negative activity is interpreted as video is"
-              " not adapted and the statistics are not computed during"
-              " the learning phase. Note that the negative video activities"
-              " are ONLY allowed at the beginning.");
-DEFINE_string(result, "", "name of a file to write the results. The results"
-              " will be appended to the end of the file. This is optional.");
-DEFINE_string(audio_content, "", "name of a file where audio content is written"
-              " to, in double format.");
-DEFINE_float(activity_threshold, kDefaultActivityThreshold,
-              "Activity threshold");
-DEFINE_bool(help, false, "prints this message");
-
-namespace webrtc {
-
-// TODO(turajs) A new CL will be committed soon where ExtractFeatures will
-// notify the caller of "silence" input, instead of bailing out. We would not
-// need the following function when such a change is made.
-
-// Add some dither to quiet frames. This avoids the ExtractFeatures skip a
-// silence frame. Otherwise true VAD would drift with respect to the audio.
-// We only consider mono inputs.
-static void DitherSilence(AudioFrame* frame) {
-  ASSERT_EQ(1u, frame->num_channels_);
-  const double kRmsSilence = 5;
-  const double sum_squared_silence = kRmsSilence * kRmsSilence *
-      frame->samples_per_channel_;
-  double sum_squared = 0;
-  int16_t* frame_data = frame->mutable_data();
-  for (size_t n = 0; n < frame->samples_per_channel_; n++)
-    sum_squared += frame_data[n] * frame_data[n];
-  if (sum_squared <= sum_squared_silence) {
-    for (size_t n = 0; n < frame->samples_per_channel_; n++)
-      frame_data[n] = (rand() & 0xF) - 8;  // NOLINT: ignore non-threadsafe.
-  }
-}
-
-class AgcStat {
- public:
-  AgcStat()
-      : video_index_(0),
-        activity_threshold_(kDefaultActivityThreshold),
-        audio_content_(LoudnessHistogram::Create(kAgcAnalWindowSamples)),
-        audio_processing_(new VadAudioProc()),
-        vad_(new PitchBasedVad()),
-        standalone_vad_(StandaloneVad::Create()),
-        audio_content_fid_(NULL) {
-    for (size_t n = 0; n < kMaxNumFrames; n++)
-      video_vad_[n] = 0.5;
-  }
-
-  ~AgcStat() {
-    if (audio_content_fid_ != NULL) {
-      fclose(audio_content_fid_);
-    }
-  }
-
-  void set_audio_content_file(FILE* audio_content_fid) {
-    audio_content_fid_ = audio_content_fid;
-  }
-
-  int AddAudio(const AudioFrame& frame, double p_video,
-               int* combined_vad) {
-    if (frame.num_channels_ != 1 ||
-        frame.samples_per_channel_ !=
-            kSampleRateHz / 100 ||
-            frame.sample_rate_hz_ != kSampleRateHz)
-      return -1;
-    video_vad_[video_index_++] = p_video;
-    AudioFeatures features;
-    const int16_t* frame_data = frame.data();
-    audio_processing_->ExtractFeatures(
-        frame_data, frame.samples_per_channel_, &features);
-    if (FLAG_standalone_vad) {
-      standalone_vad_->AddAudio(frame_data,
-                                frame.samples_per_channel_);
-    }
-    if (features.num_frames > 0) {
-      double p[kMaxNumFrames] = {0.5, 0.5, 0.5, 0.5};
-      if (FLAG_standalone_vad) {
-        standalone_vad_->GetActivity(p, kMaxNumFrames);
-      }
-      // TODO(turajs) combining and limiting are used in the source files as
-      // well they can be moved to utility.
-      // Combine Video and stand-alone VAD.
-      for (size_t n = 0; n < features.num_frames; n++) {
-        double p_active = p[n] * video_vad_[n];
-        double p_passive = (1 - p[n]) * (1 - video_vad_[n]);
-        p[n] = rtc::SafeClamp(p_active / (p_active + p_passive), 0.01, 0.99);
-      }
-      if (vad_->VoicingProbability(features, p) < 0)
-        return -1;
-      for (size_t n = 0; n < features.num_frames; n++) {
-        audio_content_->Update(features.rms[n], p[n]);
-        double ac = audio_content_->AudioContent();
-        if (audio_content_fid_ != NULL) {
-          fwrite(&ac, sizeof(ac), 1, audio_content_fid_);
-        }
-        if (ac > kAgcAnalWindowSamples * activity_threshold_) {
-          combined_vad[n] = 1;
-        } else {
-          combined_vad[n] = 0;
-        }
-      }
-      video_index_ = 0;
-    }
-    return static_cast<int>(features.num_frames);
-  }
-
-  void Reset() {
-    audio_content_->Reset();
-  }
-
-  void SetActivityThreshold(double activity_threshold) {
-    activity_threshold_ = activity_threshold;
-  }
-
- private:
-  int video_index_;
-  double activity_threshold_;
-  double video_vad_[kMaxNumFrames];
-  std::unique_ptr<LoudnessHistogram> audio_content_;
-  std::unique_ptr<VadAudioProc> audio_processing_;
-  std::unique_ptr<PitchBasedVad> vad_;
-  std::unique_ptr<StandaloneVad> standalone_vad_;
-
-  FILE* audio_content_fid_;
-};
-
-
-void void_main(int argc, char* argv[]) {
-  webrtc::AgcStat agc_stat;
-
-  FILE* pcm_fid = fopen(argv[1], "rb");
-  ASSERT_TRUE(pcm_fid != NULL) << "Cannot open PCM file " << argv[1];
-
-  if (argc < 2) {
-    fprintf(stderr, "\nNot Enough arguments\n");
-  }
-
-  FILE* true_vad_fid = NULL;
-  ASSERT_GT(strlen(FLAG_true_vad), 0u) << "Specify the file containing true "
-      "VADs using --true_vad flag.";
-  true_vad_fid = fopen(FLAG_true_vad, "rb");
-  ASSERT_TRUE(true_vad_fid != NULL) << "Cannot open the active list " <<
-      FLAG_true_vad;
-
-  FILE* results_fid = NULL;
-  if (strlen(FLAG_result) > 0) {
-    // True if this is the first time writing to this function and we add a
-    // header to the beginning of the file.
-    bool write_header;
-    // Open in the read mode. If it fails, the file doesn't exist and has to
-    // write a header for it. Otherwise no need to write a header.
-    results_fid = fopen(FLAG_result, "r");
-    if (results_fid == NULL) {
-      write_header = true;
-    } else {
-      fclose(results_fid);
-      write_header = false;
-    }
-    // Open in append mode.
-    results_fid = fopen(FLAG_result, "a");
-    ASSERT_TRUE(results_fid != NULL) << "Cannot open the file, " <<
-              FLAG_result << ", to write the results.";
-    // Write the header if required.
-    if (write_header) {
-      fprintf(results_fid, "%% Total Active,  Misdetection,  "
-              "Total inactive,  False Positive,  On-sets,  Missed segments,  "
-              "Average response\n");
-    }
-  }
-
-  FILE* video_vad_fid = NULL;
-  if (strlen(FLAG_video_vad) > 0) {
-    video_vad_fid = fopen(FLAG_video_vad, "rb");
-    ASSERT_TRUE(video_vad_fid != NULL) <<  "Cannot open the file, " <<
-              FLAG_video_vad << " to read video-based VAD decisions.\n";
-  }
-
-  // AgsStat will be the owner of this file and will close it at its
-  // destructor.
-  FILE* audio_content_fid = NULL;
-  if (strlen(FLAG_audio_content) > 0) {
-    audio_content_fid = fopen(FLAG_audio_content, "wb");
-    ASSERT_TRUE(audio_content_fid != NULL) << "Cannot open file, " <<
-              FLAG_audio_content << " to write audio-content.\n";
-    agc_stat.set_audio_content_file(audio_content_fid);
-  }
-
-  webrtc::AudioFrame frame;
-  frame.num_channels_ = 1;
-  frame.sample_rate_hz_ = 16000;
-  frame.samples_per_channel_ = frame.sample_rate_hz_ / 100;
-  const size_t kSamplesToRead = frame.num_channels_ *
-      frame.samples_per_channel_;
-
-  agc_stat.SetActivityThreshold(FLAG_activity_threshold);
-
-  int ret_val = 0;
-  int num_frames = 0;
-  int agc_vad[kMaxNumFrames];
-  uint8_t true_vad[kMaxNumFrames];
-  double p_video = 0.5;
-  int total_active = 0;
-  int total_passive = 0;
-  int total_false_positive = 0;
-  int total_missed_detection = 0;
-  int onset_adaptation = 0;
-  int num_onsets = 0;
-  bool onset = false;
-  uint8_t previous_true_vad = 0;
-  int num_not_adapted = 0;
-  size_t true_vad_index = 0;
-  bool in_false_positive_region = false;
-  int total_false_positive_duration = 0;
-  bool video_adapted = false;
-  while (kSamplesToRead == fread(frame.mutable_data(), sizeof(int16_t),
-                                 kSamplesToRead, pcm_fid)) {
-    assert(true_vad_index < kMaxNumFrames);
-    ASSERT_EQ(1u, fread(&true_vad[true_vad_index], sizeof(*true_vad), 1,
-                        true_vad_fid))
-        << "Size mismatch between True-VAD and the PCM file.\n";
-    if (video_vad_fid != NULL) {
-      ASSERT_EQ(1u, fread(&p_video, sizeof(p_video), 1, video_vad_fid)) <<
-          "Not enough video-based VAD probabilities.";
-    }
-
-    // Negative video activity indicates that the video-based VAD is not yet
-    // adapted. Disregards the learning phase in statistics.
-    if (p_video < 0) {
-      if (video_adapted) {
-        fprintf(stderr, "Negative video probabilities ONLY allowed at the "
-            "beginning of the sequence, not in the middle.\n");
-        exit(1);
-      }
-      continue;
-    } else {
-      video_adapted = true;
-    }
-
-    num_frames++;
-    uint8_t last_true_vad;
-    if (true_vad_index == 0) {
-      last_true_vad = previous_true_vad;
-    } else {
-      last_true_vad = true_vad[true_vad_index - 1];
-    }
-    if (last_true_vad == 1 && true_vad[true_vad_index] == 0) {
-      agc_stat.Reset();
-    }
-    true_vad_index++;
-
-    DitherSilence(&frame);
-
-    ret_val = agc_stat.AddAudio(frame, p_video, agc_vad);
-    ASSERT_GE(ret_val, 0);
-
-    if (ret_val > 0) {
-      ASSERT_EQ(true_vad_index, static_cast<size_t>(ret_val));
-      for (int n = 0; n < ret_val; n++) {
-        if (true_vad[n] == 1) {
-          total_active++;
-          if (previous_true_vad == 0) {
-            num_onsets++;
-            onset = true;
-          }
-          if (agc_vad[n] == 0) {
-            total_missed_detection++;
-            if (onset)
-              onset_adaptation++;
-          } else {
-            in_false_positive_region = false;
-            onset = false;
-          }
-        } else if (true_vad[n] == 0) {
-          // Check if |on_set| flag is still up. If so it means that we totally
-          // missed an active region
-          if (onset)
-            num_not_adapted++;
-          onset = false;
-
-          total_passive++;
-          if (agc_vad[n] == 1) {
-            total_false_positive++;
-            in_false_positive_region = true;
-          }
-          if (in_false_positive_region) {
-            total_false_positive_duration++;
-          }
-        } else {
-          ASSERT_TRUE(false) << "Invalid value for true-VAD.\n";
-        }
-        previous_true_vad = true_vad[n];
-      }
-      true_vad_index = 0;
-    }
-  }
-
-  if (results_fid != NULL) {
-    fprintf(results_fid, "%4d  %4d  %4d  %4d  %4d  %4d  %4.0f %4.0f\n",
-            total_active,
-            total_missed_detection,
-            total_passive,
-            total_false_positive,
-            num_onsets,
-            num_not_adapted,
-            static_cast<float>(onset_adaptation) / (num_onsets + 1e-12),
-            static_cast<float>(total_false_positive_duration) /
-            (total_passive + 1e-12));
-  }
-  fprintf(stdout, "%4d %4d %4d %4d %4d %4d %4.0f %4.0f\n",
-          total_active,
-          total_missed_detection,
-          total_passive,
-          total_false_positive,
-          num_onsets,
-          num_not_adapted,
-          static_cast<float>(onset_adaptation) / (num_onsets + 1e-12),
-          static_cast<float>(total_false_positive_duration) /
-              (total_passive + 1e-12));
-
-  fclose(true_vad_fid);
-  fclose(pcm_fid);
-  if (video_vad_fid != NULL) {
-    fclose(video_vad_fid);
-  }
-  if (results_fid != NULL) {
-    fclose(results_fid);
-  }
-}
-
-}  // namespace webrtc
-
-int main(int argc, char* argv[]) {
-  if (argc == 1) {
-    // Print usage information.
-    std::cout <<
-      "\nCompute the number of misdetected and false-positive frames. Not\n"
-      " that for each frame of audio (10 ms) there should be one true\n"
-      " activity. If any video-based activity is given, there should also be\n"
-      " one probability per frame.\n"
-      "Run with --help for more details on available flags.\n"
-      "\nUsage:\n\n"
-      "activity_metric input_pcm [options]\n"
-      "where 'input_pcm' is the input audio sampled at 16 kHz in 16 bits "
-      "format.\n\n";
-    return 0;
-  }
-  rtc::FlagList::SetFlagsFromCommandLine(&argc, argv, true);
-  if (FLAG_help) {
-    rtc::FlagList::Print(nullptr, false);
-    return 0;
-  }
-  webrtc::void_main(argc, argv);
-  return 0;
-}
diff --git a/rtc_tools/author_line_count.sh b/rtc_tools/author_line_count.sh
deleted file mode 100755
index 8d67a6d..0000000
--- a/rtc_tools/author_line_count.sh
+++ /dev/null
@@ -1,28 +0,0 @@
-#!/bin/bash
-
-# 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.
-
-# This script counts net line count contributions by author. Besides
-# amusement, the value of these stats are of course questionable.
-
-git log "$@" --pretty=format:%ae --shortstat \
-  | sed '/^ /s/,/\n/g' \
-  | gawk '
-/^[^ ]/ {
-  /* Some author "email addresses" have a trailing @svn-id, strip that out. */
-  author = gensub(/^([^@]*@[^@]*).*/, "\\1", "", $1);
-}
-/^ .*insertion/ { total[author] += $1 }
-/^ .*deletion/ { total[author] -= $1 }
-END { for (author in total) {
-        print total[author], author
-      }
-}
-' \
-  | sort -nr
diff --git a/rtc_tools/barcode_tools/DEPS b/rtc_tools/barcode_tools/DEPS
deleted file mode 100644
index d0325a6..0000000
--- a/rtc_tools/barcode_tools/DEPS
+++ /dev/null
@@ -1,13 +0,0 @@
-# This is trimmed down version of the main tools DEPS file which is to be used
-# in Chromiums PyAuto WebRTC video quality measurement test. We will only
-# need the Zxing dependencies as we only use the barcode tools in this test.
-
-deps = {
-  # Used by barcode_tools
-  "barcode_tools/third_party/zxing/core":
-    "http://zxing.googlecode.com/svn/trunk/core@2349",
-
-  # Used by barcode_tools
-  "barcode_tools/third_party/zxing/javase":
-    "http://zxing.googlecode.com/svn/trunk/javase@2349",
-}
diff --git a/rtc_tools/barcode_tools/README b/rtc_tools/barcode_tools/README
deleted file mode 100644
index a23e798..0000000
--- a/rtc_tools/barcode_tools/README
+++ /dev/null
@@ -1,34 +0,0 @@
-This file explains how to get the dependencies needed for the barcode tools.
-
-barcode_encoder.py
-==================
-This script depends on:
-* Zxing (Java version)
-* Ant (must be installed manually)
-* Java
-
-To automatically download Zxing for the encoder script, checkout this directory
-as a separate gclient solution, like this:
-gclient config http://webrtc.googlecode.com/svn/trunk/webrtc/rtc_tools/barcode_tools
-gclient sync
-Then the Zxing Java source code will be put in third_party/zxing.
-
-In order to run barcode_encoder.py you then need to build:
-* zxing/core/core.jar
-* zxing/javase/javase.jar
-These are compiled using Ant by running build_zxing.py:
-python build_zxing.py
-
-For more info about Zxing, see https://code.google.com/p/zxing/
-
-
-barcode_decoder.py
-==================
-This script depends on:
-* Zxing (C++ version). You need to checkout from Subversion and build the libs
-  and zxing SCons targets. SVN URL: http://zxing.googlecode.com/svn/trunk/cpp
-* FFMPEG fmpeg 0.11.1
-
-These dependencies must be precompiled separately before running the script.
-Make sure to add FFMPEG to the PATH environment variable and provide the path
-to the zxing executable using the mandatory command line flag to the script.
diff --git a/rtc_tools/barcode_tools/barcode_decoder.py b/rtc_tools/barcode_tools/barcode_decoder.py
deleted file mode 100755
index 2abd677..0000000
--- a/rtc_tools/barcode_tools/barcode_decoder.py
+++ /dev/null
@@ -1,291 +0,0 @@
-#!/usr/bin/env python
-# Copyright (c) 2012 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.
-
-import optparse
-import os
-import sys
-
-if __name__ == '__main__':
-  # Make sure we always can import helper_functions.
-  sys.path.append(os.path.dirname(__file__))
-
-import helper_functions
-
-# Chrome browsertests will throw away stderr; avoid that output gets lost.
-sys.stderr = sys.stdout
-
-
-def ConvertYuvToPngFiles(yuv_file_name, yuv_frame_width, yuv_frame_height,
-                             output_directory, ffmpeg_path):
-  """Converts a YUV video file into PNG frames.
-
-  The function uses ffmpeg to convert the YUV file. The output of ffmpeg is in
-  the form frame_xxxx.png, where xxxx is the frame number, starting from 0001.
-
-  Args:
-    yuv_file_name(string): The name of the YUV file.
-    yuv_frame_width(int): The width of one YUV frame.
-    yuv_frame_height(int): The height of one YUV frame.
-    output_directory(string): The output directory where the PNG frames will be
-      stored.
-    ffmpeg_path(string): The path to the ffmpeg executable. If None, the PATH
-      will be searched for it.
-
-  Return:
-    (bool): True if the conversion was OK.
-  """
-  size_string = str(yuv_frame_width) + 'x' + str(yuv_frame_height)
-  output_files_pattern = os.path.join(output_directory, 'frame_%04d.png')
-  if not ffmpeg_path:
-    ffmpeg_path = 'ffmpeg.exe' if sys.platform == 'win32' else 'ffmpeg'
-  command = [ffmpeg_path, '-s', '%s' % size_string, '-i', '%s'
-             % yuv_file_name, '-f', 'image2', '-vcodec', 'png',
-             '%s' % output_files_pattern]
-  try:
-    print 'Converting YUV file to PNG images (may take a while)...'
-    print ' '.join(command)
-    helper_functions.RunShellCommand(
-        command, fail_msg='Error during YUV to PNG conversion')
-  except helper_functions.HelperError, err:
-    print 'Error executing command: %s. Error: %s' % (command, err)
-    return False
-  except OSError:
-    print 'Did not find %s. Have you installed it?' % ffmpeg_path
-    return False
-  return True
-
-
-def DecodeFrames(input_directory, zxing_path):
-  """Decodes the barcodes overlaid in each frame.
-
-  The function uses the Zxing command-line tool from the Zxing C++ distribution
-  to decode the barcode in every PNG frame from the input directory. The frames
-  should be named frame_xxxx.png, where xxxx is the frame number. The frame
-  numbers should be consecutive and should start from 0001.
-  The decoding results in a frame_xxxx.txt file for every successfully decoded
-  barcode. This file contains the decoded barcode as 12-digit string (UPC-A
-  format: 11 digits content + one check digit).
-
-  Args:
-    input_directory(string): The input directory from where the PNG frames are
-      read.
-    zxing_path(string): The path to the zxing binary. If specified as None,
-      the PATH will be searched for it.
-  Return:
-    (bool): True if the decoding succeeded.
-  """
-  if not zxing_path:
-    zxing_path = 'zxing.exe' if sys.platform == 'win32' else 'zxing'
-  print 'Decoding barcodes from PNG files with %s...' % zxing_path
-  return helper_functions.PerformActionOnAllFiles(
-      directory=input_directory, file_pattern='frame_',
-      file_extension='png', start_number=1, action=_DecodeBarcodeInFile,
-      command_line_decoder=zxing_path)
-
-
-def _DecodeBarcodeInFile(file_name, command_line_decoder):
-  """Decodes the barcode in the upper left corner of a PNG file.
-
-  Args:
-    file_name(string): File name of the PNG file.
-    command_line_decoder(string): The ZXing command-line decoding tool.
-
-  Return:
-    (bool): True upon success, False otherwise.
-  """
-  command = [command_line_decoder, '--try-harder', '--dump-raw', file_name]
-  try:
-    out = helper_functions.RunShellCommand(
-        command, fail_msg='Error during decoding of %s' % file_name)
-    text_file = open('%s.txt' % file_name[:-4], 'w')
-    text_file.write(out)
-    text_file.close()
-  except helper_functions.HelperError, err:
-    print 'Barcode in %s cannot be decoded.' % file_name
-    print err
-    return False
-  except OSError:
-    print 'Did not find %s. Have you installed it?' % command_line_decoder
-    return False
-  return True
-
-
-def _GenerateStatsFile(stats_file_name, input_directory='.'):
-  """Generate statistics file.
-
-  The function generates a statistics file. The contents of the file are in the
-  format <frame_name> <barcode>, where frame name is the name of every frame
-  (effectively the frame number) and barcode is the decoded barcode. The frames
-  and the helper .txt files are removed after they have been used.
-  """
-  file_prefix = os.path.join(input_directory, 'frame_')
-  stats_file = open(stats_file_name, 'w')
-
-  print 'Generating stats file: %s' % stats_file_name
-  for i in range(1, _CountFramesIn(input_directory=input_directory) + 1):
-    frame_number = helper_functions.ZeroPad(i)
-    barcode_file_name = file_prefix + frame_number + '.txt'
-    png_frame = file_prefix + frame_number + '.png'
-    entry_frame_number = helper_functions.ZeroPad(i-1)
-    entry = 'frame_' + entry_frame_number + ' '
-
-    if os.path.isfile(barcode_file_name):
-      barcode = _ReadBarcodeFromTextFile(barcode_file_name)
-      os.remove(barcode_file_name)
-
-      if _CheckBarcode(barcode):
-        entry += (helper_functions.ZeroPad(int(barcode[0:11])) + '\n')
-      else:
-        entry += 'Barcode error\n'  # Barcode is wrongly detected.
-    else:  # Barcode file doesn't exist.
-      entry += 'Barcode error\n'
-
-    stats_file.write(entry)
-    os.remove(png_frame)
-
-  stats_file.close()
-
-
-def _ReadBarcodeFromTextFile(barcode_file_name):
-  """Reads the decoded barcode for a .txt file.
-
-  Args:
-    barcode_file_name(string): The name of the .txt file.
-  Return:
-    (string): The decoded barcode.
-  """
-  barcode_file = open(barcode_file_name, 'r')
-  barcode = barcode_file.read()
-  barcode_file.close()
-  return barcode
-
-
-def _CheckBarcode(barcode):
-  """Check weather the UPC-A barcode was decoded correctly.
-
-  This function calculates the check digit of the provided barcode and compares
-  it to the check digit that was decoded.
-
-  Args:
-    barcode(string): The barcode (12-digit).
-  Return:
-    (bool): True if the barcode was decoded correctly.
-  """
-  if len(barcode) != 12:
-    return False
-
-  r1 = range(0, 11, 2)  # Odd digits
-  r2 = range(1, 10, 2)  # Even digits except last
-  dsum = 0
-  # Sum all the even digits
-  for i in r1:
-    dsum += int(barcode[i])
-  # Multiply the sum by 3
-  dsum *= 3
-  # Add all the even digits except the check digit (12th digit)
-  for i in r2:
-    dsum += int(barcode[i])
-  # Get the modulo 10
-  dsum = dsum % 10
-  # If not 0 substract from 10
-  if dsum != 0:
-    dsum = 10 - dsum
-  # Compare result and check digit
-  return dsum == int(barcode[11])
-
-
-def _CountFramesIn(input_directory='.'):
-  """Calculates the number of frames in the input directory.
-
-  The function calculates the number of frames in the input directory. The
-  frames should be named frame_xxxx.png, where xxxx is the number of the frame.
-  The numbers should start from 1 and should be consecutive.
-
-  Args:
-    input_directory(string): The input directory.
-  Return:
-    (int): The number of frames.
-  """
-  file_prefix = os.path.join(input_directory, 'frame_')
-  file_exists = True
-  num = 1
-
-  while file_exists:
-    file_name = (file_prefix + helper_functions.ZeroPad(num) + '.png')
-    if os.path.isfile(file_name):
-      num += 1
-    else:
-      file_exists = False
-  return num - 1
-
-
-def _ParseArgs():
-  """Registers the command-line options."""
-  usage = "usage: %prog [options]"
-  parser = optparse.OptionParser(usage=usage)
-
-  parser.add_option('--zxing_path', type='string',
-                    help=('The path to where the zxing executable is located. '
-                          'If omitted, it will be assumed to be present in the '
-                          'PATH with the name zxing[.exe].'))
-  parser.add_option('--ffmpeg_path', type='string',
-                    help=('The path to where the ffmpeg executable is located. '
-                          'If omitted, it will be assumed to be present in the '
-                          'PATH with the name ffmpeg[.exe].'))
-  parser.add_option('--yuv_frame_width', type='int', default=640,
-                    help='Width of the YUV file\'s frames. Default: %default')
-  parser.add_option('--yuv_frame_height', type='int', default=480,
-                    help='Height of the YUV file\'s frames. Default: %default')
-  parser.add_option('--yuv_file', type='string', default='output.yuv',
-                    help='The YUV file to be decoded. Default: %default')
-  parser.add_option('--stats_file', type='string', default='stats.txt',
-                    help='The output stats file. Default: %default')
-  parser.add_option('--png_working_dir', type='string', default='.',
-                    help=('The directory for temporary PNG images to be stored '
-                          'in when decoding from YUV before they\'re barcode '
-                          'decoded. If using Windows and a Cygwin-compiled '
-                          'zxing.exe, you should keep the default value to '
-                          'avoid problems. Default: %default'))
-  options, _ = parser.parse_args()
-  return options
-
-
-def main():
-  """The main function.
-
-  A simple invocation is:
-  ./webrtc/rtc_tools/barcode_tools/barcode_decoder.py
-  --yuv_file=<path_and_name_of_overlaid_yuv_video>
-  --yuv_frame_width=640 --yuv_frame_height=480
-  --stats_file=<path_and_name_to_stats_file>
-  """
-  options = _ParseArgs()
-
-  # Convert the overlaid YUV video into a set of PNG frames.
-  if not ConvertYuvToPngFiles(options.yuv_file, options.yuv_frame_width,
-                              options.yuv_frame_height,
-                              output_directory=options.png_working_dir,
-                              ffmpeg_path=options.ffmpeg_path):
-    print 'An error occurred converting from YUV to PNG frames.'
-    return -1
-
-  # Decode the barcodes from the PNG frames.
-  if not DecodeFrames(input_directory=options.png_working_dir,
-                      zxing_path=options.zxing_path):
-    print 'An error occurred decoding barcodes from PNG frames.'
-    return -2
-
-  # Generate statistics file.
-  _GenerateStatsFile(options.stats_file,
-                     input_directory=options.png_working_dir)
-  print 'Completed barcode decoding.'
-  return 0
-
-if __name__ == '__main__':
-  sys.exit(main())
diff --git a/rtc_tools/barcode_tools/barcode_encoder.py b/rtc_tools/barcode_tools/barcode_encoder.py
deleted file mode 100755
index 9ab8b50..0000000
--- a/rtc_tools/barcode_tools/barcode_encoder.py
+++ /dev/null
@@ -1,372 +0,0 @@
-#!/usr/bin/env python
-# Copyright (c) 2012 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.
-
-import optparse
-import os
-import sys
-
-import helper_functions
-
-_DEFAULT_BARCODE_WIDTH = 352
-_DEFAULT_BARCODES_FILE = 'barcodes.yuv'
-
-
-def GenerateUpcaBarcodes(number_of_barcodes, barcode_width, barcode_height,
-                         output_directory='.',
-                         path_to_zxing='zxing-read-only'):
-  """Generates UPC-A barcodes.
-
-  This function generates a number_of_barcodes UPC-A barcodes. The function
-  calls an example Java encoder from the Zxing library. The barcodes are
-  generated as PNG images. The width of the barcodes shouldn't be less than 102
-  pixels because otherwise Zxing can't properly generate the barcodes.
-
-  Args:
-    number_of_barcodes(int): The number of barcodes to generate.
-    barcode_width(int): Width of barcode in pixels.
-    barcode_height(int): Height of barcode in pixels.
-    output_directory(string): Output directory where to store generated
-      barcodes.
-    path_to_zxing(string): The path to Zxing.
-
-  Return:
-    (bool): True if the conversion is successful.
-  """
-  base_file_name = os.path.join(output_directory, "barcode_")
-  jars = _FormJarsString(path_to_zxing)
-  command_line_encoder = 'com.google.zxing.client.j2se.CommandLineEncoder'
-  barcode_width = str(barcode_width)
-  barcode_height = str(barcode_height)
-
-  errors = False
-  for i in range(number_of_barcodes):
-    suffix = helper_functions.ZeroPad(i)
-    # Barcodes starting from 0
-    content = helper_functions.ZeroPad(i, 11)
-    output_file_name = base_file_name + suffix + ".png"
-
-    command = ["java", "-cp", jars, command_line_encoder,
-               "--barcode_format=UPC_A", "--height=%s" % barcode_height,
-               "--width=%s" % barcode_width,
-               "--output=%s" % (output_file_name), "%s" % (content)]
-    try:
-      helper_functions.RunShellCommand(
-          command, fail_msg=('Error during barcode %s generation' % content))
-    except helper_functions.HelperError as err:
-      print >> sys.stderr, err
-      errors = True
-  return not errors
-
-
-def ConvertPngToYuvBarcodes(input_directory='.', output_directory='.'):
-  """Converts PNG barcodes to YUV barcode images.
-
-  This function reads all the PNG files from the input directory which are in
-  the format frame_xxxx.png, where xxxx is the number of the frame, starting
-  from 0000. The frames should be consecutive numbers. The output YUV file is
-  named frame_xxxx.yuv. The function uses ffmpeg to do the conversion.
-
-  Args:
-    input_directory(string): The input direcotry to read the PNG barcodes from.
-    output_directory(string): The putput directory to write the YUV files to.
-  Return:
-    (bool): True if the conversion was without errors.
-  """
-  return helper_functions.PerformActionOnAllFiles(
-      input_directory, 'barcode_', 'png', 0, _ConvertToYuvAndDelete,
-      output_directory=output_directory, pattern='barcode_')
-
-
-def _ConvertToYuvAndDelete(output_directory, file_name, pattern):
-  """Converts a PNG file to a YUV file and deletes the PNG file.
-
-  Args:
-    output_directory(string): The output directory for the YUV file.
-    file_name(string): The PNG file name.
-    pattern(string): The file pattern of the PNG/YUV file. The PNG/YUV files are
-      named patternxx..x.png/yuv, where xx..x are digits starting from 00..0.
-  Return:
-    (bool): True upon successful conversion, false otherwise.
-  """
-  # Pattern should be in file name
-  if not pattern in file_name:
-    return False
-  pattern_position = file_name.rfind(pattern)
-
-  # Strip the path to the PNG file and replace the png extension with yuv
-  yuv_file_name = file_name[pattern_position:-3] + 'yuv'
-  yuv_file_name = os.path.join(output_directory, yuv_file_name)
-
-  command = ['ffmpeg', '-i', '%s' % (file_name), '-pix_fmt', 'yuv420p',
-             '%s' % (yuv_file_name)]
-  try:
-    helper_functions.RunShellCommand(
-        command, fail_msg=('Error during PNG to YUV conversion of %s' %
-                           file_name))
-    os.remove(file_name)
-  except helper_functions.HelperError as err:
-    print >> sys.stderr, err
-    return False
-  return True
-
-
-def CombineYuvFramesIntoOneFile(output_file_name, input_directory='.'):
-  """Combines several YUV frames into one YUV video file.
-
-  The function combines the YUV frames from input_directory into one YUV video
-  file. The frames should be named in the format frame_xxxx.yuv where xxxx
-  stands for the frame number. The numbers have to be consecutive and start from
-  0000. The YUV frames are removed after they have been added to the video.
-
-  Args:
-    output_file_name(string): The name of the file to produce.
-    input_directory(string): The directory from which the YUV frames are read.
-  Return:
-    (bool): True if the frame stitching went OK.
-  """
-  output_file = open(output_file_name, "wb")
-  success = helper_functions.PerformActionOnAllFiles(
-      input_directory, 'barcode_', 'yuv', 0, _AddToFileAndDelete,
-      output_file=output_file)
-  output_file.close()
-  return success
-
-def _AddToFileAndDelete(output_file, file_name):
-  """Adds the contents of a file to a previously opened file.
-
-  Args:
-    output_file(file): The ouput file, previously opened.
-    file_name(string): The file name of the file to add to the output file.
-
-  Return:
-    (bool): True if successful, False otherwise.
-  """
-  input_file = open(file_name, "rb")
-  input_file_contents = input_file.read()
-  output_file.write(input_file_contents)
-  input_file.close()
-  try:
-    os.remove(file_name)
-  except OSError as e:
-    print >> sys.stderr, 'Error deleting file %s.\nError: %s' % (file_name, e)
-    return False
-  return True
-
-
-def _OverlayBarcodeAndBaseFrames(barcodes_file, base_file, output_file,
-                                 barcodes_component_sizes,
-                                 base_component_sizes):
-  """Overlays the next YUV frame from a file with a barcode.
-
-  Args:
-    barcodes_file(FileObject): The YUV file containing the barcodes (opened).
-    base_file(FileObject): The base YUV file (opened).
-    output_file(FileObject): The output overlaid file (opened).
-    barcodes_component_sizes(list of tuples): The width and height of each Y, U
-      and V plane of the barcodes YUV file.
-    base_component_sizes(list of tuples): The width and height of each Y, U and
-      V plane of the base YUV file.
-  Return:
-    (bool): True if there are more planes (i.e. frames) in the base file, false
-      otherwise.
-  """
-  # We will loop three times - once for the Y, U and V planes
-  for ((barcode_comp_width, barcode_comp_height),
-      (base_comp_width, base_comp_height)) in zip(barcodes_component_sizes,
-                                                  base_component_sizes):
-    for base_row in range(base_comp_height):
-      barcode_plane_traversed = False
-      if (base_row < barcode_comp_height) and not barcode_plane_traversed:
-        barcode_plane = barcodes_file.read(barcode_comp_width)
-        if barcode_plane == "":
-          barcode_plane_traversed = True
-      else:
-        barcode_plane_traversed = True
-      base_plane = base_file.read(base_comp_width)
-
-      if base_plane == "":
-        return False
-
-      if not barcode_plane_traversed:
-        # Substitute part of the base component with the top component
-        output_file.write(barcode_plane)
-        base_plane = base_plane[barcode_comp_width:]
-      output_file.write(base_plane)
-  return True
-
-
-def OverlayYuvFiles(barcode_width, barcode_height, base_width, base_height,
-                    barcodes_file_name, base_file_name, output_file_name):
-  """Overlays two YUV files starting from the upper left corner of both.
-
-  Args:
-    barcode_width(int): The width of the barcode (to be overlaid).
-    barcode_height(int): The height of the barcode (to be overlaid).
-    base_width(int): The width of a frame of the base file.
-    base_height(int): The height of a frame of the base file.
-    barcodes_file_name(string): The name of the YUV file containing the YUV
-      barcodes.
-    base_file_name(string): The name of the base YUV file.
-    output_file_name(string): The name of the output file where the overlaid
-      video will be written.
-  """
-  # Component sizes = [Y_sizes, U_sizes, V_sizes]
-  barcodes_component_sizes = [(barcode_width, barcode_height),
-                              (barcode_width/2, barcode_height/2),
-                              (barcode_width/2, barcode_height/2)]
-  base_component_sizes = [(base_width, base_height),
-                          (base_width/2, base_height/2),
-                          (base_width/2, base_height/2)]
-
-  barcodes_file = open(barcodes_file_name, 'rb')
-  base_file = open(base_file_name, 'rb')
-  output_file = open(output_file_name, 'wb')
-
-  data_left = True
-  while data_left:
-    data_left = _OverlayBarcodeAndBaseFrames(barcodes_file, base_file,
-                                             output_file,
-                                             barcodes_component_sizes,
-                                             base_component_sizes)
-
-  barcodes_file.close()
-  base_file.close()
-  output_file.close()
-
-
-def CalculateFramesNumberFromYuv(yuv_width, yuv_height, file_name):
-  """Calculates the number of frames of a YUV video.
-
-  Args:
-    yuv_width(int): Width of a frame of the yuv file.
-    yuv_height(int): Height of a frame of the YUV file.
-    file_name(string): The name of the YUV file.
-  Return:
-    (int): The number of frames in the YUV file.
-  """
-  file_size = os.path.getsize(file_name)
-
-  y_plane_size = yuv_width * yuv_height
-  u_plane_size = (yuv_width/2) * (yuv_height/2)  # Equals to V plane size too
-  frame_size = y_plane_size + (2 * u_plane_size)
-  return int(file_size/frame_size)  # Should be int anyway
-
-
-def _FormJarsString(path_to_zxing):
-  """Forms the the Zxing core and javase jars argument.
-
-  Args:
-    path_to_zxing(string): The path to the Zxing checkout folder.
-  Return:
-    (string): The newly formed jars argument.
-  """
-  javase_jar = os.path.join(path_to_zxing, "javase", "javase.jar")
-  core_jar = os.path.join(path_to_zxing, "core", "core.jar")
-  delimiter = ':'
-  if os.name != 'posix':
-    delimiter = ';'
-  return javase_jar + delimiter + core_jar
-
-def _ParseArgs():
-  """Registers the command-line options."""
-  usage = "usage: %prog [options]"
-  parser = optparse.OptionParser(usage=usage)
-
-  parser.add_option('--barcode_width', type='int',
-                    default=_DEFAULT_BARCODE_WIDTH,
-                    help=('Width of the barcodes to be overlaid on top of the'
-                          ' base file. Default: %default'))
-  parser.add_option('--barcode_height', type='int', default=32,
-                    help=('Height of the barcodes to be overlaid on top of the'
-                          ' base file. Default: %default'))
-  parser.add_option('--base_frame_width', type='int', default=352,
-                    help=('Width of the base YUV file\'s frames. '
-                          'Default: %default'))
-  parser.add_option('--base_frame_height', type='int', default=288,
-                    help=('Height of the top YUV file\'s frames. '
-                          'Default: %default'))
-  parser.add_option('--barcodes_yuv', type='string',
-                    default=_DEFAULT_BARCODES_FILE,
-                    help=('The YUV file with the barcodes in YUV. '
-                          'Default: %default'))
-  parser.add_option('--base_yuv', type='string', default='base.yuv',
-                    help=('The base YUV file to be overlaid. '
-                          'Default: %default'))
-  parser.add_option('--output_yuv', type='string', default='output.yuv',
-                    help=('The output YUV file containing the base overlaid'
-                          ' with the barcodes. Default: %default'))
-  parser.add_option('--png_barcodes_output_dir', type='string', default='.',
-                    help=('Output directory where the PNG barcodes will be '
-                          'generated. Default: %default'))
-  parser.add_option('--png_barcodes_input_dir', type='string', default='.',
-                    help=('Input directory from where the PNG barcodes will be '
-                          'read. Default: %default'))
-  parser.add_option('--yuv_barcodes_output_dir', type='string', default='.',
-                    help=('Output directory where the YUV barcodes will be '
-                          'generated. Default: %default'))
-  parser.add_option('--yuv_frames_input_dir', type='string', default='.',
-                    help=('Input directory from where the YUV will be '
-                          'read before combination. Default: %default'))
-  parser.add_option('--zxing_dir', type='string', default='zxing',
-                    help=('Path to the Zxing barcodes library. '
-                          'Default: %default'))
-  options = parser.parse_args()[0]
-  return options
-
-
-def main():
-  """The main function.
-
-  A simple invocation will be:
-  ./webrtc/rtc_tools/barcode_tools/barcode_encoder.py --barcode_height=32
-  --base_frame_width=352 --base_frame_height=288
-  --base_yuv=<path_and_name_of_base_file>
-  --output_yuv=<path and name_of_output_file>
-  """
-  options = _ParseArgs()
-  # The barcodes with will be different than the base frame width only if
-  # explicitly specified at the command line.
-  if options.barcode_width == _DEFAULT_BARCODE_WIDTH:
-    options.barcode_width = options.base_frame_width
-  # If the user provides a value for the barcodes YUV video file, we will keep
-  # it. Otherwise we create a temp file which is removed after it has been used.
-  keep_barcodes_yuv_file = False
-  if options.barcodes_yuv != _DEFAULT_BARCODES_FILE:
-    keep_barcodes_yuv_file = True
-
-  # Calculate the number of barcodes - it is equal to the number of frames in
-  # the base file.
-  number_of_barcodes = CalculateFramesNumberFromYuv(
-      options.base_frame_width, options.base_frame_height, options.base_yuv)
-
-  script_dir = os.path.dirname(os.path.abspath(sys.argv[0]))
-  zxing_dir = os.path.join(script_dir, 'third_party', 'zxing')
-  # Generate barcodes - will generate them in PNG.
-  GenerateUpcaBarcodes(number_of_barcodes, options.barcode_width,
-                       options.barcode_height,
-                       output_directory=options.png_barcodes_output_dir,
-                       path_to_zxing=zxing_dir)
-  # Convert the PNG barcodes to to YUV format.
-  ConvertPngToYuvBarcodes(options.png_barcodes_input_dir,
-                          options.yuv_barcodes_output_dir)
-  # Combine the YUV barcodes into one YUV file.
-  CombineYuvFramesIntoOneFile(options.barcodes_yuv,
-                              input_directory=options.yuv_frames_input_dir)
-  # Overlay the barcodes over the base file.
-  OverlayYuvFiles(options.barcode_width, options.barcode_height,
-                  options.base_frame_width, options.base_frame_height,
-                  options.barcodes_yuv, options.base_yuv, options.output_yuv)
-
-  if not keep_barcodes_yuv_file:
-    # Remove the temporary barcodes YUV file
-    os.remove(options.barcodes_yuv)
-
-
-if __name__ == '__main__':
-  sys.exit(main())
diff --git a/rtc_tools/barcode_tools/build_zxing.py b/rtc_tools/barcode_tools/build_zxing.py
deleted file mode 100755
index 92696a7..0000000
--- a/rtc_tools/barcode_tools/build_zxing.py
+++ /dev/null
@@ -1,44 +0,0 @@
-#!/usr/bin/env python
-# Copyright (c) 2012 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.
-
-import os
-import subprocess
-import sys
-
-
-def RunAntBuildCommand(path_to_ant_build_file):
-  """Tries to build the passed build file with ant."""
-  ant_executable = 'ant'
-  if sys.platform == 'win32':
-    if os.getenv('ANT_HOME'):
-      ant_executable = os.path.join(os.getenv('ANT_HOME'), 'bin', 'ant.bat')
-    else:
-      ant_executable = 'ant.bat'
-  cmd = [ant_executable, '-buildfile', path_to_ant_build_file]
-  try:
-    process = subprocess.Popen(cmd, stdout=sys.stdout, stderr=sys.stderr)
-    process.wait()
-    if process.returncode != 0:
-      print >> sys.stderr, 'Failed to execute: %s' % ' '.join(cmd)
-    return process.returncode
-  except subprocess.CalledProcessError as e:
-    print >> sys.stderr, 'Failed to execute: %s.\nCause: %s' % (' '.join(cmd),
-                                                                e)
-    return -1
-
-def main():
-  core_build = os.path.join('third_party', 'zxing', 'core', 'build.xml')
-  RunAntBuildCommand(core_build)
-
-  javase_build = os.path.join('third_party', 'zxing', 'javase', 'build.xml')
-  return RunAntBuildCommand(javase_build)
-
-
-if __name__ == '__main__':
-  sys.exit(main())
diff --git a/rtc_tools/barcode_tools/helper_functions.py b/rtc_tools/barcode_tools/helper_functions.py
deleted file mode 100644
index e27322f..0000000
--- a/rtc_tools/barcode_tools/helper_functions.py
+++ /dev/null
@@ -1,105 +0,0 @@
-#!/usr/bin/env python
-# Copyright (c) 2012 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.
-
-import multiprocessing
-import os
-import subprocess
-import sys
-
-_DEFAULT_PADDING = 4
-
-
-class HelperError(Exception):
-  """Exception raised for errors in the helper."""
-  pass
-
-
-def ZeroPad(number, padding=_DEFAULT_PADDING):
-  """Converts an int into a zero padded string.
-
-  Args:
-    number(int): The number to convert.
-    padding(int): The number of chars in the output. Note that if you pass for
-      example number=23456 and padding=4, the output will still be '23456',
-      i.e. it will not be cropped. If you pass number=2 and padding=4, the
-      return value will be '0002'.
-  Return:
-    (string): The zero padded number converted to string.
-  """
-  return str(number).zfill(padding)
-
-
-def RunShellCommand(cmd_list, fail_msg=None):
-  """Executes a command.
-
-  Args:
-    cmd_list(list): Command list to execute.
-    fail_msg(string): Message describing the error in case the command fails.
-
-  Return:
-    (string): The standard output from running the command.
-
-  Raise:
-    HelperError: If command fails.
-  """
-  process = subprocess.Popen(cmd_list, stdout=subprocess.PIPE,
-                             stderr=subprocess.PIPE)
-  output, error = process.communicate()
-  if process.returncode != 0:
-    if fail_msg:
-      print >> sys.stderr, fail_msg
-    raise HelperError('Failed to run %s: command returned %d and printed '
-                      '%s and %s' % (' '.join(cmd_list), process.returncode,
-                                     output, error))
-  return output.strip()
-
-
-def PerformActionOnAllFiles(directory, file_pattern, file_extension,
-                            start_number, action, **kwargs):
-  """Function that performs a given action on all files matching a pattern.
-
-  It is assumed that the files are named file_patternxxxx.file_extension, where
-  xxxx are digits starting from start_number.
-
-  Args:
-    directory(string): The directory where the files live.
-    file_pattern(string): The name pattern of the files.
-    file_extension(string): The files' extension.
-    start_number(int): From where to start to count frames.
-    action(function): The action to be performed over the files. Must return
-        False if the action failed, True otherwise. It should take a file name
-        as the first argument and **kwargs as arguments. The function must be
-        possible to pickle, so it cannot be a bound function (for instance).
-
-  Return:
-    (bool): Whether performing the action over all files was successful or not.
-  """
-  file_prefix = os.path.join(directory, file_pattern)
-  file_number = start_number
-
-  process_pool = multiprocessing.Pool(processes=multiprocessing.cpu_count())
-  results = []
-  while True:
-    zero_padded_file_number = ZeroPad(file_number)
-    file_name = file_prefix + zero_padded_file_number + '.' + file_extension
-    if not os.path.isfile(file_name):
-      break
-    future = process_pool.apply_async(action, args=(file_name,), kwds=kwargs)
-    results.append(future)
-    file_number += 1
-
-  successful = True
-  for result in results:
-    if not result.get():
-      print "At least one action %s failed for files %sxxxx.%s." % (
-          action, file_pattern, file_extension)
-      successful = False
-
-  process_pool.close()
-  return successful
diff --git a/rtc_tools/barcode_tools/yuv_cropper.py b/rtc_tools/barcode_tools/yuv_cropper.py
deleted file mode 100755
index 609f07d..0000000
--- a/rtc_tools/barcode_tools/yuv_cropper.py
+++ /dev/null
@@ -1,125 +0,0 @@
-#!/usr/bin/env python
-# Copyright (c) 2012 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.
-
-import optparse
-import os
-import sys
-
-
-def _CropOneFrame(yuv_file, output_file, component_sizes):
-  """Crops one frame.
-
-  This function crops one frame going through all the YUV planes and cropping
-  respective amount of rows.
-
-  Args:
-    yuv_file(file): The opened (for binary reading) YUV file.
-    output_file(file): The opened (for binary writing) file.
-    component_sizes(list of 3 3-ples): The list contains the sizes for all the
-      planes (Y, U, V) of the YUV file plus the crop_height scaled for every
-      plane. The sizes equal width, height and crop_height for the Y plane,
-      and are equal to width/2, height/2 and crop_height/2 for the U and V
-      planes.
-  Return:
-    (bool): True if there are more frames to crop, False otherwise.
-  """
-  for comp_width, comp_height, comp_crop_height in component_sizes:
-    for row in range(comp_height):
-      # Read the plane data for this row.
-      yuv_plane = yuv_file.read(comp_width)
-
-      # If the plane is empty, we have reached the end of the file.
-      if yuv_plane == "":
-        return False
-
-      # Only write the plane data for the rows bigger than crop_height.
-      if row >= comp_crop_height:
-        output_file.write(yuv_plane)
-  return True
-
-
-def CropFrames(yuv_file_name, output_file_name, width, height, crop_height):
-  """Crops rows of pixels from the top of the YUV frames.
-
-  This function goes through all the frames in a video and crops the crop_height
-  top pixel rows of every frame.
-
-  Args:
-    yuv_file_name(string): The name of the YUV file to be cropped.
-    output_file_name(string): The name of the output file where the result will
-      be written.
-    width(int): The width of the original YUV file.
-    height(int): The height of the original YUV file.
-    crop_height(int): The height (the number of pixel rows) to be cropped from
-      the frames.
-  """
-  # Component sizes = [Y_sizes, U_sizes, V_sizes].
-  component_sizes = [(width, height, crop_height),
-                     (width/2, height/2, crop_height/2),
-                     (width/2, height/2, crop_height/2)]
-
-  yuv_file = open(yuv_file_name, 'rb')
-  output_file = open(output_file_name, 'wb')
-
-  data_left = True
-  while data_left:
-    data_left = _CropOneFrame(yuv_file, output_file, component_sizes)
-
-  yuv_file.close()
-  output_file.close()
-
-
-def _ParseArgs():
-  """Registers the command-line options."""
-  usage = "usage: %prog [options]"
-  parser = optparse.OptionParser(usage=usage)
-
-  parser.add_option('--width', type='int',
-                    default=352,
-                    help=('Width of the YUV file\'s frames. '
-                          'Default: %default'))
-  parser.add_option('--height', type='int', default=288,
-                    help=('Height of the YUV file\'s frames. '
-                          'Default: %default'))
-  parser.add_option('--crop_height', type='int', default=32,
-                    help=('How much of the top of the YUV file to crop. '
-                          'Has to be module of 2. Default: %default'))
-  parser.add_option('--yuv_file', type='string',
-                    help=('The YUV file to be cropped.'))
-  parser.add_option('--output_file', type='string', default='output.yuv',
-                    help=('The output YUV file containing the cropped YUV. '
-                          'Default: %default'))
-  options = parser.parse_args()[0]
-  if not options.yuv_file:
-    parser.error('yuv_file argument missing. Please specify input YUV file!')
-  return options
-
-
-def main():
-  """A tool to crop rows of pixels from the top part of a YUV file.
-
-  A simple invocation will be:
-  ./yuv_cropper.py --width=640 --height=480 --crop_height=32
-  --yuv_file=<path_and_name_of_yuv_file>
-  --output_yuv=<path and name_of_output_file>
-  """
-  options = _ParseArgs()
-
-  if os.path.getsize(options.yuv_file) == 0:
-    sys.stderr.write('Error: The YUV file you have passed has size 0. The '
-                     'produced output will also have size 0.\n')
-    return -1
-
-  CropFrames(options.yuv_file, options.output_file, options.width,
-             options.height, options.crop_height)
-  return 0
-
-
-if __name__ == '__main__':
-  sys.exit(main())
diff --git a/rtc_tools/class_usage.sh b/rtc_tools/class_usage.sh
deleted file mode 100755
index 02b80c2..0000000
--- a/rtc_tools/class_usage.sh
+++ /dev/null
@@ -1,22 +0,0 @@
-#!/bin/bash
-
-# Copyright (c) 2017 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.
-
-# This script is run in a git repository. It lists all classes defined
-# in header files, sorted by the number of other files where the name
-# of the class occurs. It is intentionally not limited to only source
-# files. Classes close to the top of the list are candidates for
-# removal.
-
-git grep -h '^class .*[:{]' -- '*.h' '*.hpp' \
-  | sed -e 's/WEBRTC_DLL_EXPORT// ' -e 's/^class *\([^ :{(<]*\).*/\1/' \
-  | sort | uniq | while read class ; do
-  count="$(git grep -l -w -F "${class}" | wc -l)"
-  echo "${count}" "${class}"
-done | sort -n
diff --git a/rtc_tools/compare_videos.py b/rtc_tools/compare_videos.py
deleted file mode 100755
index ce5bff3..0000000
--- a/rtc_tools/compare_videos.py
+++ /dev/null
@@ -1,174 +0,0 @@
-#!/usr/bin/env python
-# Copyright (c) 2013 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.
-
-import optparse
-import os
-import shutil
-import subprocess
-import sys
-import tempfile
-
-
-SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
-
-# Chrome browsertests will throw away stderr; avoid that output gets lost.
-sys.stderr = sys.stdout
-
-
-def _ParseArgs():
-  """Registers the command-line options."""
-  usage = 'usage: %prog [options]'
-  parser = optparse.OptionParser(usage=usage)
-
-  parser.add_option('--label', type='string', default='MY_TEST',
-                    help=('Label of the test, used to identify different '
-                          'tests. Default: %default'))
-  parser.add_option('--ref_video', type='string',
-                    help='Reference video to compare with (YUV).')
-  parser.add_option('--test_video', type='string',
-                    help=('Test video to be compared with the reference '
-                          'video (YUV).'))
-  parser.add_option('--frame_analyzer', type='string',
-                    help='Path to the frame analyzer executable.')
-  parser.add_option('--barcode_decoder', type='string',
-                    help=('Path to the barcode decoder script. By default, we '
-                          'will assume we can find it in barcode_tools/'
-                          'relative to this directory.'))
-  parser.add_option('--ffmpeg_path', type='string',
-                    help=('The path to where the ffmpeg executable is located. '
-                          'If omitted, it will be assumed to be present in the '
-                          'PATH with the name ffmpeg[.exe].'))
-  parser.add_option('--zxing_path', type='string',
-                    help=('The path to where the zxing executable is located. '
-                          'If omitted, it will be assumed to be present in the '
-                          'PATH with the name zxing[.exe].'))
-  parser.add_option('--stats_file_ref', type='string', default='stats_ref.txt',
-                    help=('Path to the temporary stats file to be created and '
-                          'used for the reference video file. '
-                          'Default: %default'))
-  parser.add_option('--stats_file_test', type='string',
-                    default='stats_test.txt',
-                    help=('Path to the temporary stats file to be created and '
-                          'used for the test video file. Default: %default'))
-  parser.add_option('--stats_file', type='string',
-                    help=('DEPRECATED'))
-  parser.add_option('--yuv_frame_width', type='int', default=640,
-                    help='Width of the YUV file\'s frames. Default: %default')
-  parser.add_option('--yuv_frame_height', type='int', default=480,
-                    help='Height of the YUV file\'s frames. Default: %default')
-  options, _ = parser.parse_args()
-
-  if options.stats_file:
-    options.stats_file_test = options.stats_file
-    print ('WARNING: Using deprecated switch --stats_file. '
-           'The new flag is --stats_file_test.')
-
-  if not options.ref_video:
-    parser.error('You must provide a path to the reference video!')
-  if not os.path.exists(options.ref_video):
-    parser.error('Cannot find the reference video at %s' % options.ref_video)
-
-  if not options.test_video:
-    parser.error('You must provide a path to the test video!')
-  if not os.path.exists(options.test_video):
-    parser.error('Cannot find the test video at %s' % options.test_video)
-
-  if not options.frame_analyzer:
-    parser.error('You must provide the path to the frame analyzer executable!')
-  if not os.path.exists(options.frame_analyzer):
-    parser.error('Cannot find frame analyzer executable at %s!' %
-                 options.frame_analyzer)
-  return options
-
-def _DevNull():
-  """On Windows, sometimes the inherited stdin handle from the parent process
-  fails. Workaround this by passing null to stdin to the subprocesses commands.
-  This function can be used to create the null file handler.
-  """
-  return open(os.devnull, 'r')
-
-def DecodeBarcodesInVideo(options, path_to_decoder, video, stat_file):
-  # Run barcode decoder on the test video to identify frame numbers.
-  png_working_directory = tempfile.mkdtemp()
-  cmd = [
-    sys.executable,
-    path_to_decoder,
-    '--yuv_file=%s' % video,
-    '--yuv_frame_width=%d' % options.yuv_frame_width,
-    '--yuv_frame_height=%d' % options.yuv_frame_height,
-    '--stats_file=%s' % stat_file,
-    '--png_working_dir=%s' % png_working_directory,
-  ]
-  if options.zxing_path:
-    cmd.append('--zxing_path=%s' % options.zxing_path)
-  if options.ffmpeg_path:
-    cmd.append('--ffmpeg_path=%s' % options.ffmpeg_path)
-
-
-  barcode_decoder = subprocess.Popen(cmd, stdin=_DevNull(),
-                                     stdout=sys.stdout, stderr=sys.stderr)
-  barcode_decoder.wait()
-
-  shutil.rmtree(png_working_directory)
-  if barcode_decoder.returncode != 0:
-    print 'Failed to run barcode decoder script.'
-    return 1
-  return 0
-
-def main():
-  """The main function.
-
-  A simple invocation is:
-  ./webrtc/rtc_tools/barcode_tools/compare_videos.py
-  --ref_video=<path_and_name_of_reference_video>
-  --test_video=<path_and_name_of_test_video>
-  --frame_analyzer=<path_and_name_of_the_frame_analyzer_executable>
-
-  Notice that the prerequisites for barcode_decoder.py also applies to this
-  script. The means the following executables have to be available in the PATH:
-  * zxing
-  * ffmpeg
-  """
-  options = _ParseArgs()
-
-  if options.barcode_decoder:
-    path_to_decoder = options.barcode_decoder
-  else:
-    path_to_decoder = os.path.join(SCRIPT_DIR, 'barcode_tools',
-                                   'barcode_decoder.py')
-
-  if DecodeBarcodesInVideo(options, path_to_decoder,
-                           options.ref_video, options.stats_file_ref) != 0:
-    return 1
-  if DecodeBarcodesInVideo(options, path_to_decoder,
-                           options.test_video, options.stats_file_test) != 0:
-    return 1
-
-  # Run frame analyzer to compare the videos and print output.
-  cmd = [
-    options.frame_analyzer,
-    '--label=%s' % options.label,
-    '--reference_file=%s' % options.ref_video,
-    '--test_file=%s' % options.test_video,
-    '--stats_file_ref=%s' % options.stats_file_ref,
-    '--stats_file_test=%s' % options.stats_file_test,
-    '--width=%d' % options.yuv_frame_width,
-    '--height=%d' % options.yuv_frame_height,
-  ]
-  frame_analyzer = subprocess.Popen(cmd, stdin=_DevNull(),
-                                    stdout=sys.stdout, stderr=sys.stderr)
-  frame_analyzer.wait()
-  if frame_analyzer.returncode != 0:
-    print 'Failed to run frame analyzer.'
-    return 1
-
-  return 0
-
-if __name__ == '__main__':
-  sys.exit(main())
diff --git a/rtc_tools/converter/converter.cc b/rtc_tools/converter/converter.cc
deleted file mode 100644
index 0216ff5..0000000
--- a/rtc_tools/converter/converter.cc
+++ /dev/null
@@ -1,176 +0,0 @@
-/*
- *  Copyright (c) 2012 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 <stdio.h>
-#include <stdlib.h>
-#include <sys/stat.h>
-
-#include <iomanip>
-#include <sstream>
-
-#include "webrtc/rtc_tools/converter/converter.h"
-
-#ifdef WIN32
-#define SEPARATOR '\\'
-#define STAT _stat
-#else
-#define SEPARATOR '/'
-#define STAT stat
-#endif
-
-namespace webrtc {
-namespace test {
-
-Converter::Converter(int width, int height)
-    : width_(width),
-      height_(height) {
-}
-
-bool Converter::ConvertRGBAToI420Video(std::string frames_dir,
-                                       std::string output_file_name,
-                                       bool delete_frames) {
-  FILE* output_file = fopen(output_file_name.c_str(), "wb");
-
-  // Open output file in append mode.
-  if (output_file == NULL) {
-    fprintf(stderr, "Couldn't open input file for reading: %s\n",
-            output_file_name.c_str());
-    return false;
-  }
-
-  int input_frame_size = InputFrameSize();
-  uint8_t* rgba_buffer = new uint8_t[input_frame_size];
-  int y_plane_size = YPlaneSize();
-  uint8_t* dst_y = new uint8_t[y_plane_size];
-  int u_plane_size = UPlaneSize();
-  uint8_t* dst_u = new uint8_t[u_plane_size];
-  int v_plane_size = VPlaneSize();
-  uint8_t* dst_v = new uint8_t[v_plane_size];
-
-  int counter = 0;  // Counter to form frame names.
-  bool success = false;  // Is conversion successful.
-
-  while (true) {
-    std::string file_name = FormFrameName(4, counter);
-    // Get full path file name.
-    std::string input_file_name = FindFullFileName(frames_dir, file_name);
-
-    if (FileExists(input_file_name)) {
-      ++counter;  // Update counter for the next round.
-    } else {
-      fprintf(stdout, "Reached end of frames list\n");
-      break;
-    }
-
-    // Read the RGBA frame into rgba_buffer.
-    ReadRGBAFrame(input_file_name.c_str(), input_frame_size, rgba_buffer);
-
-    // Delete the input frame.
-    if (delete_frames) {
-      if (remove(input_file_name.c_str()) != 0) {
-        fprintf(stderr, "Cannot delete file %s\n", input_file_name.c_str());
-      }
-    }
-
-    // Convert to I420 frame.
-    libyuv::ABGRToI420(rgba_buffer, SrcStrideFrame(),
-                       dst_y, DstStrideY(),
-                       dst_u, DstStrideU(),
-                       dst_v, DstStrideV(),
-                       width_, height_);
-
-    // Add the I420 frame to the YUV video file.
-    success = AddYUVToFile(dst_y, y_plane_size, dst_u, u_plane_size,
-                           dst_v, v_plane_size, output_file);
-
-
-    if (!success) {
-      fprintf(stderr, "LibYUV error during RGBA to I420 frame conversion\n");
-      break;
-    }
-  }
-
-  delete[] rgba_buffer;
-  delete[] dst_y;
-  delete[] dst_u;
-  delete[] dst_v;
-
-  fclose(output_file);
-
-  return success;
-}
-
-bool Converter::AddYUVToFile(uint8_t* y_plane,
-                             int y_plane_size,
-                             uint8_t* u_plane,
-                             int u_plane_size,
-                             uint8_t* v_plane,
-                             int v_plane_size,
-                             FILE* output_file) {
-  bool success = AddYUVPlaneToFile(y_plane, y_plane_size, output_file) &&
-                 AddYUVPlaneToFile(u_plane, u_plane_size, output_file) &&
-                 AddYUVPlaneToFile(v_plane, v_plane_size, output_file);
-  return success;
-}
-
-bool Converter::AddYUVPlaneToFile(uint8_t* yuv_plane,
-                                  int yuv_plane_size,
-                                  FILE* file) {
-  size_t bytes_written = fwrite(yuv_plane, 1, yuv_plane_size, file);
-
-  if (bytes_written != static_cast<size_t>(yuv_plane_size)) {
-    fprintf(stderr, "Number of bytes written (%d) doesn't match size of y plane"
-            " (%d)\n", static_cast<int>(bytes_written), yuv_plane_size);
-    return false;
-  }
-  return true;
-}
-
-bool Converter::ReadRGBAFrame(const char* input_file_name, int input_frame_size,
-                              unsigned char* buffer) {
-  FILE* input_file = fopen(input_file_name, "rb");
-  if (input_file == NULL) {
-    fprintf(stderr, "Couldn't open input file for reading: %s\n",
-            input_file_name);
-    return false;
-  }
-
-  size_t nbr_read = fread(buffer, 1, input_frame_size, input_file);
-  fclose(input_file);
-
-  if (nbr_read != static_cast<size_t>(input_frame_size)) {
-    fprintf(stderr, "Error reading from input file: %s\n", input_file_name);
-    return false;
-  }
-
-  return true;
-}
-
-std::string Converter::FindFullFileName(std::string dir_name,
-                                        std::string file_name) {
-  return dir_name + SEPARATOR + file_name;
-}
-
-bool Converter:: FileExists(std::string file_name_to_check) {
-  struct STAT file_info;
-  int result = STAT(file_name_to_check.c_str(), &file_info);
-  return (result == 0);
-}
-
-std::string Converter::FormFrameName(int width, int number) {
-  std::stringstream tmp;
-
-  // Zero-pad number to a string.
-  tmp << std::setfill('0') << std::setw(width) << number;
-
-  return "frame_" + tmp.str();
-}
-
-}  // namespace test
-}  // namespace webrtc
diff --git a/rtc_tools/converter/converter.h b/rtc_tools/converter/converter.h
deleted file mode 100644
index 2c19923..0000000
--- a/rtc_tools/converter/converter.h
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- *  Copyright (c) 2012 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_RTC_TOOLS_CONVERTER_CONVERTER_H_
-#define WEBRTC_RTC_TOOLS_CONVERTER_CONVERTER_H_
-
-#include <string>
-
-#include "libyuv/compare.h"  // NOLINT
-#include "libyuv/convert.h"  // NOLINT
-
-namespace webrtc {
-namespace test {
-
-// Handles a conversion between a set of RGBA frames to a YUV (I420) video.
-class Converter {
- public:
-  Converter(int width, int height);
-
-  // Converts RGBA to YUV video. If the delete_frames argument is true, the
-  // method will delete the input frames after conversion.
-  bool ConvertRGBAToI420Video(std::string frames_dir,
-                              std::string output_file_name, bool delete_frames);
-
- private:
-  int width_;  // Width of the video (respectively of the RGBA frames).
-  int height_;  // Height of the video (respectively of the RGBA frames).
-
-  // Returns the size of the Y plane in bytes.
-  int YPlaneSize() const {
-    return width_*height_;
-  }
-
-  // Returns the size of the U plane in bytes.
-  int UPlaneSize() const {
-    return ((width_+1)/2)*((height_)/2);
-  }
-
-  // Returns the size of the V plane in bytes.
-  int VPlaneSize() const {
-    return ((width_+1)/2)*((height_)/2);
-  }
-
-  // Returns the number of bytes per row in the RGBA frame.
-  int SrcStrideFrame() const {
-    return width_*4;
-  }
-
-  // Returns the number of bytes in the Y plane.
-  int DstStrideY() const {
-    return width_;
-  }
-
-  // Returns the number of bytes in the U plane.
-  int DstStrideU() const {
-    return (width_+1)/2;
-  }
-
-  // Returns the number of bytes in the V plane.
-  int DstStrideV() const {
-    return (width_+1)/2;
-  }
-
-  // Returns the size in bytes of the input RGBA frames.
-  int InputFrameSize() const {
-    return width_*height_*4;
-  }
-
-  // Writes the Y, U and V (in this order) planes to the file, thus adding a
-  // raw YUV frame to the file.
-  bool AddYUVToFile(uint8_t* y_plane,
-                    int y_plane_size,
-                    uint8_t* u_plane,
-                    int u_plane_size,
-                    uint8_t* v_plane,
-                    int v_plane_size,
-                    FILE* output_file);
-
-  // Adds the Y, U or V plane to the file.
-  bool AddYUVPlaneToFile(uint8_t* yuv_plane, int yuv_plane_size, FILE* file);
-
-  // Reads a RGBA frame from input_file_name with input_frame_size size in bytes
-  // into the buffer.
-  bool ReadRGBAFrame(const char* input_file_name, int input_frame_size,
-                     unsigned char* buffer);
-
-  // Finds the full path name of the file - concatenates the directory and file
-  // names.
-  std::string FindFullFileName(std::string dir_name, std::string file_name);
-
-  // Checks if a file exists.
-  bool FileExists(std::string file_name_to_check);
-
-  // Returns the name of the file in the form frame_<number>, where <number> is
-    // 4 zero padded (i.e. frame_0000, frame_0001, etc.).
-  std::string FormFrameName(int width, int number);
-};
-
-}  // namespace test
-}  // namespace webrtc
-
-#endif  // WEBRTC_RTC_TOOLS_CONVERTER_CONVERTER_H_
diff --git a/rtc_tools/converter/rgba_to_i420_converter.cc b/rtc_tools/converter/rgba_to_i420_converter.cc
deleted file mode 100644
index 723893e..0000000
--- a/rtc_tools/converter/rgba_to_i420_converter.cc
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- *  Copyright (c) 2012 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 <stdio.h>
-#include <stdlib.h>
-
-#include <map>
-#include <string>
-#include <vector>
-
-#include "webrtc/rtc_tools/converter/converter.h"
-#include "webrtc/rtc_tools/simple_command_line_parser.h"
-
-/*
- * A command-line tool based on libyuv to convert a set of RGBA files to a YUV
- * video.
- * Usage:
- * rgba_to_i420_converter --frames_dir=<directory_to_rgba_frames>
- * --output_file=<output_yuv_file> --width=<width_of_input_frames>
- * --height=<height_of_input_frames>
- */
-int main(int argc, char** argv) {
-  std::string program_name = argv[0];
-  std::string usage = "Converts RGBA raw image files to I420 frames for YUV.\n"
-    "Example usage:\n" + program_name +
-    " --frames_dir=. --output_file=output.yuv --width=320 --height=240\n"
-    "IMPORTANT: If you pass the --delete_frames command line parameter, the "
-    "tool will delete the input frames after conversion.\n"
-    "Command line flags:\n"
-    "  - width(int): Width in pixels of the frames in the input file."
-    " Default: -1\n"
-    "  - height(int): Height in pixels of the frames in the input file."
-    " Default: -1\n"
-    "  - frames_dir(string): The path to the directory where the frames reside."
-    " Default: .\n"
-    "  - output_file(string): The output file to which frames are written."
-    " Default: output.yuv\n"
-    "  - delete_frames(bool): Whether or not to delete the input frames after"
-    " the conversion. Default: false.\n";
-
-  webrtc::test::CommandLineParser parser;
-
-  // Init the parser and set the usage message
-  parser.Init(argc, argv);
-  parser.SetUsageMessage(usage);
-
-  parser.SetFlag("width", "-1");
-  parser.SetFlag("height", "-1");
-  parser.SetFlag("frames_dir", ".");
-  parser.SetFlag("output_file", "output.yuv");
-  parser.SetFlag("delete_frames", "false");
-  parser.SetFlag("help", "false");
-
-  parser.ProcessFlags();
-  if (parser.GetFlag("help") == "true") {
-    parser.PrintUsageMessage();
-    exit(EXIT_SUCCESS);
-  }
-  parser.PrintEnteredFlags();
-
-  int width = strtol((parser.GetFlag("width")).c_str(), NULL, 10);
-  int height = strtol((parser.GetFlag("height")).c_str(), NULL, 10);
-
-  if (width <= 0 || height <= 0) {
-    fprintf(stderr, "Error: width or height cannot be <= 0!\n");
-    return -1;
-  }
-
-  bool del_frames = (parser.GetFlag("delete_frames") == "true") ? true : false;
-
-  webrtc::test::Converter converter(width, height);
-  bool success = converter.ConvertRGBAToI420Video(parser.GetFlag("frames_dir"),
-                                                  parser.GetFlag("output_file"),
-                                                  del_frames);
-
-  if (success) {
-    fprintf(stdout, "Successful conversion of RGBA frames to YUV video!\n");
-    return 0;
-  } else {
-    fprintf(stdout, "Unsuccessful conversion of RGBA frames to YUV video!\n");
-    return -1;
-  }
-}
diff --git a/rtc_tools/event_log_visualizer/OWNERS b/rtc_tools/event_log_visualizer/OWNERS
deleted file mode 100644
index f1a86c6..0000000
--- a/rtc_tools/event_log_visualizer/OWNERS
+++ /dev/null
@@ -1 +0,0 @@
-terelius@webrtc.org
diff --git a/rtc_tools/event_log_visualizer/analyzer.cc b/rtc_tools/event_log_visualizer/analyzer.cc
deleted file mode 100644
index 8358d3b..0000000
--- a/rtc_tools/event_log_visualizer/analyzer.cc
+++ /dev/null
@@ -1,1737 +0,0 @@
-/*
- *  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/rtc_tools/event_log_visualizer/analyzer.h"
-
-#include <algorithm>
-#include <limits>
-#include <map>
-#include <sstream>
-#include <string>
-#include <utility>
-
-#include "webrtc/call/audio_receive_stream.h"
-#include "webrtc/call/audio_send_stream.h"
-#include "webrtc/call/call.h"
-#include "webrtc/call/video_receive_stream.h"
-#include "webrtc/call/video_send_stream.h"
-#include "webrtc/common_types.h"
-#include "webrtc/modules/audio_coding/neteq/tools/audio_sink.h"
-#include "webrtc/modules/audio_coding/neteq/tools/fake_decode_from_file.h"
-#include "webrtc/modules/audio_coding/neteq/tools/neteq_delay_analyzer.h"
-#include "webrtc/modules/audio_coding/neteq/tools/neteq_replacement_input.h"
-#include "webrtc/modules/audio_coding/neteq/tools/neteq_test.h"
-#include "webrtc/modules/audio_coding/neteq/tools/resample_input_audio_file.h"
-#include "webrtc/modules/congestion_controller/include/send_side_congestion_controller.h"
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/common_header.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/receiver_report.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/remb.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/sender_report.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/transport_feedback.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_header_extensions.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_utility.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/format_macros.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/ptr_util.h"
-#include "webrtc/rtc_base/rate_statistics.h"
-
-namespace webrtc {
-namespace plotting {
-
-namespace {
-
-void SortPacketFeedbackVector(std::vector<PacketFeedback>* vec) {
-  auto pred = [](const PacketFeedback& packet_feedback) {
-    return packet_feedback.arrival_time_ms == PacketFeedback::kNotReceived;
-  };
-  vec->erase(std::remove_if(vec->begin(), vec->end(), pred), vec->end());
-  std::sort(vec->begin(), vec->end(), PacketFeedbackComparator());
-}
-
-std::string SsrcToString(uint32_t ssrc) {
-  std::stringstream ss;
-  ss << "SSRC " << ssrc;
-  return ss.str();
-}
-
-// Checks whether an SSRC is contained in the list of desired SSRCs.
-// Note that an empty SSRC list matches every SSRC.
-bool MatchingSsrc(uint32_t ssrc, const std::vector<uint32_t>& desired_ssrc) {
-  if (desired_ssrc.size() == 0)
-    return true;
-  return std::find(desired_ssrc.begin(), desired_ssrc.end(), ssrc) !=
-         desired_ssrc.end();
-}
-
-double AbsSendTimeToMicroseconds(int64_t abs_send_time) {
-  // The timestamp is a fixed point representation with 6 bits for seconds
-  // and 18 bits for fractions of a second. Thus, we divide by 2^18 to get the
-  // time in seconds and then multiply by 1000000 to convert to microseconds.
-  static constexpr double kTimestampToMicroSec =
-      1000000.0 / static_cast<double>(1ul << 18);
-  return abs_send_time * kTimestampToMicroSec;
-}
-
-// Computes the difference |later| - |earlier| where |later| and |earlier|
-// are counters that wrap at |modulus|. The difference is chosen to have the
-// least absolute value. For example if |modulus| is 8, then the difference will
-// be chosen in the range [-3, 4]. If |modulus| is 9, then the difference will
-// be in [-4, 4].
-int64_t WrappingDifference(uint32_t later, uint32_t earlier, int64_t modulus) {
-  RTC_DCHECK_LE(1, modulus);
-  RTC_DCHECK_LT(later, modulus);
-  RTC_DCHECK_LT(earlier, modulus);
-  int64_t difference =
-      static_cast<int64_t>(later) - static_cast<int64_t>(earlier);
-  int64_t max_difference = modulus / 2;
-  int64_t min_difference = max_difference - modulus + 1;
-  if (difference > max_difference) {
-    difference -= modulus;
-  }
-  if (difference < min_difference) {
-    difference += modulus;
-  }
-  if (difference > max_difference / 2 || difference < min_difference / 2) {
-    LOG(LS_WARNING) << "Difference between" << later << " and " << earlier
-                    << " expected to be in the range (" << min_difference / 2
-                    << "," << max_difference / 2 << ") but is " << difference
-                    << ". Correct unwrapping is uncertain.";
-  }
-  return difference;
-}
-
-// Return default values for header extensions, to use on streams without stored
-// mapping data. Currently this only applies to audio streams, since the mapping
-// is not stored in the event log.
-// TODO(ivoc): Remove this once this mapping is stored in the event log for
-//             audio streams. Tracking bug: webrtc:6399
-webrtc::RtpHeaderExtensionMap GetDefaultHeaderExtensionMap() {
-  webrtc::RtpHeaderExtensionMap default_map;
-  default_map.Register<AudioLevel>(webrtc::RtpExtension::kAudioLevelDefaultId);
-  default_map.Register<TransmissionOffset>(
-      webrtc::RtpExtension::kTimestampOffsetDefaultId);
-  default_map.Register<AbsoluteSendTime>(
-      webrtc::RtpExtension::kAbsSendTimeDefaultId);
-  default_map.Register<VideoOrientation>(
-      webrtc::RtpExtension::kVideoRotationDefaultId);
-  default_map.Register<VideoContentTypeExtension>(
-      webrtc::RtpExtension::kVideoContentTypeDefaultId);
-  default_map.Register<VideoTimingExtension>(
-      webrtc::RtpExtension::kVideoTimingDefaultId);
-  default_map.Register<TransportSequenceNumber>(
-      webrtc::RtpExtension::kTransportSequenceNumberDefaultId);
-  default_map.Register<PlayoutDelayLimits>(
-      webrtc::RtpExtension::kPlayoutDelayDefaultId);
-  return default_map;
-}
-
-constexpr float kLeftMargin = 0.01f;
-constexpr float kRightMargin = 0.02f;
-constexpr float kBottomMargin = 0.02f;
-constexpr float kTopMargin = 0.05f;
-
-rtc::Optional<double> NetworkDelayDiff_AbsSendTime(
-    const LoggedRtpPacket& old_packet,
-    const LoggedRtpPacket& new_packet) {
-  if (old_packet.header.extension.hasAbsoluteSendTime &&
-      new_packet.header.extension.hasAbsoluteSendTime) {
-    int64_t send_time_diff = WrappingDifference(
-        new_packet.header.extension.absoluteSendTime,
-        old_packet.header.extension.absoluteSendTime, 1ul << 24);
-    int64_t recv_time_diff = new_packet.timestamp - old_packet.timestamp;
-    double delay_change_us =
-        recv_time_diff - AbsSendTimeToMicroseconds(send_time_diff);
-    return rtc::Optional<double>(delay_change_us / 1000);
-  } else {
-    return rtc::Optional<double>();
-  }
-}
-
-rtc::Optional<double> NetworkDelayDiff_CaptureTime(
-    const LoggedRtpPacket& old_packet,
-    const LoggedRtpPacket& new_packet) {
-  int64_t send_time_diff = WrappingDifference(
-      new_packet.header.timestamp, old_packet.header.timestamp, 1ull << 32);
-  int64_t recv_time_diff = new_packet.timestamp - old_packet.timestamp;
-
-  const double kVideoSampleRate = 90000;
-  // TODO(terelius): We treat all streams as video for now, even though
-  // audio might be sampled at e.g. 16kHz, because it is really difficult to
-  // figure out the true sampling rate of a stream. The effect is that the
-  // delay will be scaled incorrectly for non-video streams.
-
-  double delay_change =
-      static_cast<double>(recv_time_diff) / 1000 -
-      static_cast<double>(send_time_diff) / kVideoSampleRate * 1000;
-  if (delay_change < -10000 || 10000 < delay_change) {
-    LOG(LS_WARNING) << "Very large delay change. Timestamps correct?";
-    LOG(LS_WARNING) << "Old capture time " << old_packet.header.timestamp
-                    << ", received time " << old_packet.timestamp;
-    LOG(LS_WARNING) << "New capture time " << new_packet.header.timestamp
-                    << ", received time " << new_packet.timestamp;
-    LOG(LS_WARNING) << "Receive time difference " << recv_time_diff << " = "
-                    << static_cast<double>(recv_time_diff) / 1000000 << "s";
-    LOG(LS_WARNING) << "Send time difference " << send_time_diff << " = "
-                    << static_cast<double>(send_time_diff) / kVideoSampleRate
-                    << "s";
-  }
-  return rtc::Optional<double>(delay_change);
-}
-
-// For each element in data, use |get_y()| to extract a y-coordinate and
-// store the result in a TimeSeries.
-template <typename DataType>
-void ProcessPoints(
-    rtc::FunctionView<rtc::Optional<float>(const DataType&)> get_y,
-    const std::vector<DataType>& data,
-    uint64_t begin_time,
-    TimeSeries* result) {
-  for (size_t i = 0; i < data.size(); i++) {
-    float x = static_cast<float>(data[i].timestamp - begin_time) / 1000000;
-    rtc::Optional<float> y = get_y(data[i]);
-    if (y)
-      result->points.emplace_back(x, *y);
-  }
-}
-
-// For each pair of adjacent elements in |data|, use |get_y| to extract a
-// y-coordinate and store the result in a TimeSeries. Note that the x-coordinate
-// will be the time of the second element in the pair.
-template <typename DataType, typename ResultType>
-void ProcessPairs(
-    rtc::FunctionView<rtc::Optional<ResultType>(const DataType&,
-                                                const DataType&)> get_y,
-    const std::vector<DataType>& data,
-    uint64_t begin_time,
-    TimeSeries* result) {
-  for (size_t i = 1; i < data.size(); i++) {
-    float x = static_cast<float>(data[i].timestamp - begin_time) / 1000000;
-    rtc::Optional<ResultType> y = get_y(data[i - 1], data[i]);
-    if (y)
-      result->points.emplace_back(x, static_cast<float>(*y));
-  }
-}
-
-// For each element in data, use |extract()| to extract a y-coordinate and
-// store the result in a TimeSeries.
-template <typename DataType, typename ResultType>
-void AccumulatePoints(
-    rtc::FunctionView<rtc::Optional<ResultType>(const DataType&)> extract,
-    const std::vector<DataType>& data,
-    uint64_t begin_time,
-    TimeSeries* result) {
-  ResultType sum = 0;
-  for (size_t i = 0; i < data.size(); i++) {
-    float x = static_cast<float>(data[i].timestamp - begin_time) / 1000000;
-    rtc::Optional<ResultType> y = extract(data[i]);
-    if (y) {
-      sum += *y;
-      result->points.emplace_back(x, static_cast<float>(sum));
-    }
-  }
-}
-
-// For each pair of adjacent elements in |data|, use |extract()| to extract a
-// y-coordinate and store the result in a TimeSeries. Note that the x-coordinate
-// will be the time of the second element in the pair.
-template <typename DataType, typename ResultType>
-void AccumulatePairs(
-    rtc::FunctionView<rtc::Optional<ResultType>(const DataType&,
-                                                const DataType&)> extract,
-    const std::vector<DataType>& data,
-    uint64_t begin_time,
-    TimeSeries* result) {
-  ResultType sum = 0;
-  for (size_t i = 1; i < data.size(); i++) {
-    float x = static_cast<float>(data[i].timestamp - begin_time) / 1000000;
-    rtc::Optional<ResultType> y = extract(data[i - 1], data[i]);
-    if (y)
-      sum += *y;
-    result->points.emplace_back(x, static_cast<float>(sum));
-  }
-}
-
-// Calculates a moving average of |data| and stores the result in a TimeSeries.
-// A data point is generated every |step| microseconds from |begin_time|
-// to |end_time|. The value of each data point is the average of the data
-// during the preceeding |window_duration_us| microseconds.
-template <typename DataType, typename ResultType>
-void MovingAverage(
-    rtc::FunctionView<rtc::Optional<ResultType>(const DataType&)> extract,
-    const std::vector<DataType>& data,
-    uint64_t begin_time,
-    uint64_t end_time,
-    uint64_t window_duration_us,
-    uint64_t step,
-    webrtc::plotting::TimeSeries* result) {
-  size_t window_index_begin = 0;
-  size_t window_index_end = 0;
-  ResultType sum_in_window = 0;
-
-  for (uint64_t t = begin_time; t < end_time + step; t += step) {
-    while (window_index_end < data.size() &&
-           data[window_index_end].timestamp < t) {
-      rtc::Optional<ResultType> value = extract(data[window_index_end]);
-      if (value)
-        sum_in_window += *value;
-      ++window_index_end;
-    }
-    while (window_index_begin < data.size() &&
-           data[window_index_begin].timestamp < t - window_duration_us) {
-      rtc::Optional<ResultType> value = extract(data[window_index_begin]);
-      if (value)
-        sum_in_window -= *value;
-      ++window_index_begin;
-    }
-    float window_duration_s = static_cast<float>(window_duration_us) / 1000000;
-    float x = static_cast<float>(t - begin_time) / 1000000;
-    float y = sum_in_window / window_duration_s;
-    result->points.emplace_back(x, y);
-  }
-}
-
-}  // namespace
-
-EventLogAnalyzer::EventLogAnalyzer(const ParsedRtcEventLog& log)
-    : parsed_log_(log), window_duration_(250000), step_(10000) {
-  uint64_t first_timestamp = std::numeric_limits<uint64_t>::max();
-  uint64_t last_timestamp = std::numeric_limits<uint64_t>::min();
-
-  PacketDirection direction;
-  uint8_t header[IP_PACKET_SIZE];
-  size_t header_length;
-  size_t total_length;
-
-  uint8_t last_incoming_rtcp_packet[IP_PACKET_SIZE];
-  uint8_t last_incoming_rtcp_packet_length = 0;
-
-  // Make a default extension map for streams without configuration information.
-  // TODO(ivoc): Once configuration of audio streams is stored in the event log,
-  //             this can be removed. Tracking bug: webrtc:6399
-  RtpHeaderExtensionMap default_extension_map = GetDefaultHeaderExtensionMap();
-
-  rtc::Optional<uint64_t> last_log_start;
-
-  for (size_t i = 0; i < parsed_log_.GetNumberOfEvents(); i++) {
-    ParsedRtcEventLog::EventType event_type = parsed_log_.GetEventType(i);
-    if (event_type != ParsedRtcEventLog::VIDEO_RECEIVER_CONFIG_EVENT &&
-        event_type != ParsedRtcEventLog::VIDEO_SENDER_CONFIG_EVENT &&
-        event_type != ParsedRtcEventLog::AUDIO_RECEIVER_CONFIG_EVENT &&
-        event_type != ParsedRtcEventLog::AUDIO_SENDER_CONFIG_EVENT &&
-        event_type != ParsedRtcEventLog::LOG_START &&
-        event_type != ParsedRtcEventLog::LOG_END) {
-      uint64_t timestamp = parsed_log_.GetTimestamp(i);
-      first_timestamp = std::min(first_timestamp, timestamp);
-      last_timestamp = std::max(last_timestamp, timestamp);
-    }
-
-    switch (parsed_log_.GetEventType(i)) {
-      case ParsedRtcEventLog::VIDEO_RECEIVER_CONFIG_EVENT: {
-        rtclog::StreamConfig config = parsed_log_.GetVideoReceiveConfig(i);
-        StreamId stream(config.remote_ssrc, kIncomingPacket);
-        video_ssrcs_.insert(stream);
-        StreamId rtx_stream(config.rtx_ssrc, kIncomingPacket);
-        video_ssrcs_.insert(rtx_stream);
-        rtx_ssrcs_.insert(rtx_stream);
-        break;
-      }
-      case ParsedRtcEventLog::VIDEO_SENDER_CONFIG_EVENT: {
-        std::vector<rtclog::StreamConfig> configs =
-            parsed_log_.GetVideoSendConfig(i);
-        for (const auto& config : configs) {
-          StreamId stream(config.local_ssrc, kOutgoingPacket);
-          video_ssrcs_.insert(stream);
-          StreamId rtx_stream(config.rtx_ssrc, kOutgoingPacket);
-          video_ssrcs_.insert(rtx_stream);
-          rtx_ssrcs_.insert(rtx_stream);
-        }
-        break;
-      }
-      case ParsedRtcEventLog::AUDIO_RECEIVER_CONFIG_EVENT: {
-        rtclog::StreamConfig config = parsed_log_.GetAudioReceiveConfig(i);
-        StreamId stream(config.remote_ssrc, kIncomingPacket);
-        audio_ssrcs_.insert(stream);
-        break;
-      }
-      case ParsedRtcEventLog::AUDIO_SENDER_CONFIG_EVENT: {
-        rtclog::StreamConfig config = parsed_log_.GetAudioSendConfig(i);
-        StreamId stream(config.local_ssrc, kOutgoingPacket);
-        audio_ssrcs_.insert(stream);
-        break;
-      }
-      case ParsedRtcEventLog::RTP_EVENT: {
-        RtpHeaderExtensionMap* extension_map = parsed_log_.GetRtpHeader(
-            i, &direction, header, &header_length, &total_length);
-        RtpUtility::RtpHeaderParser rtp_parser(header, header_length);
-        RTPHeader parsed_header;
-        if (extension_map != nullptr) {
-          rtp_parser.Parse(&parsed_header, extension_map);
-        } else {
-          // Use the default extension map.
-          // TODO(ivoc): Once configuration of audio streams is stored in the
-          //             event log, this can be removed.
-          //             Tracking bug: webrtc:6399
-          rtp_parser.Parse(&parsed_header, &default_extension_map);
-        }
-        uint64_t timestamp = parsed_log_.GetTimestamp(i);
-        StreamId stream(parsed_header.ssrc, direction);
-        rtp_packets_[stream].push_back(
-            LoggedRtpPacket(timestamp, parsed_header, total_length));
-        break;
-      }
-      case ParsedRtcEventLog::RTCP_EVENT: {
-        uint8_t packet[IP_PACKET_SIZE];
-        parsed_log_.GetRtcpPacket(i, &direction, packet, &total_length);
-        // Currently incoming RTCP packets are logged twice, both for audio and
-        // video. Only act on one of them. Compare against the previous parsed
-        // incoming RTCP packet.
-        if (direction == webrtc::kIncomingPacket) {
-          RTC_CHECK_LE(total_length, IP_PACKET_SIZE);
-          if (total_length == last_incoming_rtcp_packet_length &&
-              memcmp(last_incoming_rtcp_packet, packet, total_length) == 0) {
-            continue;
-          } else {
-            memcpy(last_incoming_rtcp_packet, packet, total_length);
-            last_incoming_rtcp_packet_length = total_length;
-          }
-        }
-        rtcp::CommonHeader header;
-        const uint8_t* packet_end = packet + total_length;
-        for (const uint8_t* block = packet; block < packet_end;
-             block = header.NextPacket()) {
-          RTC_CHECK(header.Parse(block, packet_end - block));
-          if (header.type() == rtcp::TransportFeedback::kPacketType &&
-              header.fmt() == rtcp::TransportFeedback::kFeedbackMessageType) {
-            std::unique_ptr<rtcp::TransportFeedback> rtcp_packet(
-                rtc::MakeUnique<rtcp::TransportFeedback>());
-            if (rtcp_packet->Parse(header)) {
-              uint32_t ssrc = rtcp_packet->sender_ssrc();
-              StreamId stream(ssrc, direction);
-              uint64_t timestamp = parsed_log_.GetTimestamp(i);
-              rtcp_packets_[stream].push_back(LoggedRtcpPacket(
-                  timestamp, kRtcpTransportFeedback, std::move(rtcp_packet)));
-            }
-          } else if (header.type() == rtcp::SenderReport::kPacketType) {
-            std::unique_ptr<rtcp::SenderReport> rtcp_packet(
-                rtc::MakeUnique<rtcp::SenderReport>());
-            if (rtcp_packet->Parse(header)) {
-              uint32_t ssrc = rtcp_packet->sender_ssrc();
-              StreamId stream(ssrc, direction);
-              uint64_t timestamp = parsed_log_.GetTimestamp(i);
-              rtcp_packets_[stream].push_back(
-                  LoggedRtcpPacket(timestamp, kRtcpSr, std::move(rtcp_packet)));
-            }
-          } else if (header.type() == rtcp::ReceiverReport::kPacketType) {
-            std::unique_ptr<rtcp::ReceiverReport> rtcp_packet(
-                rtc::MakeUnique<rtcp::ReceiverReport>());
-            if (rtcp_packet->Parse(header)) {
-              uint32_t ssrc = rtcp_packet->sender_ssrc();
-              StreamId stream(ssrc, direction);
-              uint64_t timestamp = parsed_log_.GetTimestamp(i);
-              rtcp_packets_[stream].push_back(
-                  LoggedRtcpPacket(timestamp, kRtcpRr, std::move(rtcp_packet)));
-            }
-          } else if (header.type() == rtcp::Remb::kPacketType &&
-                     header.fmt() == rtcp::Remb::kFeedbackMessageType) {
-            std::unique_ptr<rtcp::Remb> rtcp_packet(
-                rtc::MakeUnique<rtcp::Remb>());
-            if (rtcp_packet->Parse(header)) {
-              uint32_t ssrc = rtcp_packet->sender_ssrc();
-              StreamId stream(ssrc, direction);
-              uint64_t timestamp = parsed_log_.GetTimestamp(i);
-              rtcp_packets_[stream].push_back(LoggedRtcpPacket(
-                  timestamp, kRtcpRemb, std::move(rtcp_packet)));
-            }
-          }
-        }
-        break;
-      }
-      case ParsedRtcEventLog::LOG_START: {
-        if (last_log_start) {
-          // A LOG_END event was missing. Use last_timestamp.
-          RTC_DCHECK_GE(last_timestamp, *last_log_start);
-          log_segments_.push_back(
-            std::make_pair(*last_log_start, last_timestamp));
-        }
-        last_log_start = rtc::Optional<uint64_t>(parsed_log_.GetTimestamp(i));
-        break;
-      }
-      case ParsedRtcEventLog::LOG_END: {
-        RTC_DCHECK(last_log_start);
-        log_segments_.push_back(
-            std::make_pair(*last_log_start, parsed_log_.GetTimestamp(i)));
-        last_log_start.reset();
-        break;
-      }
-      case ParsedRtcEventLog::AUDIO_PLAYOUT_EVENT: {
-        uint32_t this_ssrc;
-        parsed_log_.GetAudioPlayout(i, &this_ssrc);
-        audio_playout_events_[this_ssrc].push_back(parsed_log_.GetTimestamp(i));
-        break;
-      }
-      case ParsedRtcEventLog::LOSS_BASED_BWE_UPDATE: {
-        LossBasedBweUpdate bwe_update;
-        bwe_update.timestamp = parsed_log_.GetTimestamp(i);
-        parsed_log_.GetLossBasedBweUpdate(i, &bwe_update.new_bitrate,
-                                          &bwe_update.fraction_loss,
-                                          &bwe_update.expected_packets);
-        bwe_loss_updates_.push_back(bwe_update);
-        break;
-      }
-      case ParsedRtcEventLog::DELAY_BASED_BWE_UPDATE: {
-        bwe_delay_updates_.push_back(parsed_log_.GetDelayBasedBweUpdate(i));
-        break;
-      }
-      case ParsedRtcEventLog::AUDIO_NETWORK_ADAPTATION_EVENT: {
-        AudioNetworkAdaptationEvent ana_event;
-        ana_event.timestamp = parsed_log_.GetTimestamp(i);
-        parsed_log_.GetAudioNetworkAdaptation(i, &ana_event.config);
-        audio_network_adaptation_events_.push_back(ana_event);
-        break;
-      }
-      case ParsedRtcEventLog::BWE_PROBE_CLUSTER_CREATED_EVENT: {
-        bwe_probe_cluster_created_events_.push_back(
-            parsed_log_.GetBweProbeClusterCreated(i));
-        break;
-      }
-      case ParsedRtcEventLog::BWE_PROBE_RESULT_EVENT: {
-        bwe_probe_result_events_.push_back(parsed_log_.GetBweProbeResult(i));
-        break;
-      }
-      case ParsedRtcEventLog::UNKNOWN_EVENT: {
-        break;
-      }
-    }
-  }
-
-  if (last_timestamp < first_timestamp) {
-    // No useful events in the log.
-    first_timestamp = last_timestamp = 0;
-  }
-  begin_time_ = first_timestamp;
-  end_time_ = last_timestamp;
-  call_duration_s_ = static_cast<float>(end_time_ - begin_time_) / 1000000;
-  if (last_log_start) {
-    // The log was missing the last LOG_END event. Fake it.
-    log_segments_.push_back(std::make_pair(*last_log_start, end_time_));
-  }
-}
-
-class BitrateObserver : public SendSideCongestionController::Observer,
-                        public RemoteBitrateObserver {
- public:
-  BitrateObserver() : last_bitrate_bps_(0), bitrate_updated_(false) {}
-
-  void OnNetworkChanged(uint32_t bitrate_bps,
-                        uint8_t fraction_loss,
-                        int64_t rtt_ms,
-                        int64_t probing_interval_ms) override {
-    last_bitrate_bps_ = bitrate_bps;
-    bitrate_updated_ = true;
-  }
-
-  void OnReceiveBitrateChanged(const std::vector<uint32_t>& ssrcs,
-                               uint32_t bitrate) override {}
-
-  uint32_t last_bitrate_bps() const { return last_bitrate_bps_; }
-  bool GetAndResetBitrateUpdated() {
-    bool bitrate_updated = bitrate_updated_;
-    bitrate_updated_ = false;
-    return bitrate_updated;
-  }
-
- private:
-  uint32_t last_bitrate_bps_;
-  bool bitrate_updated_;
-};
-
-bool EventLogAnalyzer::IsRtxSsrc(StreamId stream_id) const {
-  return rtx_ssrcs_.count(stream_id) == 1;
-}
-
-bool EventLogAnalyzer::IsVideoSsrc(StreamId stream_id) const {
-  return video_ssrcs_.count(stream_id) == 1;
-}
-
-bool EventLogAnalyzer::IsAudioSsrc(StreamId stream_id) const {
-  return audio_ssrcs_.count(stream_id) == 1;
-}
-
-std::string EventLogAnalyzer::GetStreamName(StreamId stream_id) const {
-  std::stringstream name;
-  if (IsAudioSsrc(stream_id)) {
-    name << "Audio ";
-  } else if (IsVideoSsrc(stream_id)) {
-    name << "Video ";
-  } else {
-    name << "Unknown ";
-  }
-  if (IsRtxSsrc(stream_id))
-    name << "RTX ";
-  if (stream_id.GetDirection() == kIncomingPacket) {
-    name << "(In) ";
-  } else {
-    name << "(Out) ";
-  }
-  name << SsrcToString(stream_id.GetSsrc());
-  return name.str();
-}
-
-void EventLogAnalyzer::CreatePacketGraph(PacketDirection desired_direction,
-                                         Plot* plot) {
-  for (auto& kv : rtp_packets_) {
-    StreamId stream_id = kv.first;
-    const std::vector<LoggedRtpPacket>& packet_stream = kv.second;
-    // Filter on direction and SSRC.
-    if (stream_id.GetDirection() != desired_direction ||
-        !MatchingSsrc(stream_id.GetSsrc(), desired_ssrc_)) {
-      continue;
-    }
-
-    TimeSeries time_series(GetStreamName(stream_id), BAR_GRAPH);
-    ProcessPoints<LoggedRtpPacket>(
-        [](const LoggedRtpPacket& packet) -> rtc::Optional<float> {
-          return rtc::Optional<float>(packet.total_length);
-        },
-        packet_stream, begin_time_, &time_series);
-    plot->AppendTimeSeries(std::move(time_series));
-  }
-
-  plot->SetXAxis(0, call_duration_s_, "Time (s)", kLeftMargin, kRightMargin);
-  plot->SetSuggestedYAxis(0, 1, "Packet size (bytes)", kBottomMargin,
-                          kTopMargin);
-  if (desired_direction == webrtc::PacketDirection::kIncomingPacket) {
-    plot->SetTitle("Incoming RTP packets");
-  } else if (desired_direction == webrtc::PacketDirection::kOutgoingPacket) {
-    plot->SetTitle("Outgoing RTP packets");
-  }
-}
-
-template <typename T>
-void EventLogAnalyzer::CreateAccumulatedPacketsTimeSeries(
-    PacketDirection desired_direction,
-    Plot* plot,
-    const std::map<StreamId, std::vector<T>>& packets,
-    const std::string& label_prefix) {
-  for (auto& kv : packets) {
-    StreamId stream_id = kv.first;
-    const std::vector<T>& packet_stream = kv.second;
-    // Filter on direction and SSRC.
-    if (stream_id.GetDirection() != desired_direction ||
-        !MatchingSsrc(stream_id.GetSsrc(), desired_ssrc_)) {
-      continue;
-    }
-
-    std::string label = label_prefix + " " + GetStreamName(stream_id);
-    TimeSeries time_series(label, LINE_STEP_GRAPH);
-    for (size_t i = 0; i < packet_stream.size(); i++) {
-      float x = static_cast<float>(packet_stream[i].timestamp - begin_time_) /
-                1000000;
-      time_series.points.emplace_back(x, i + 1);
-    }
-
-    plot->AppendTimeSeries(std::move(time_series));
-  }
-}
-
-void EventLogAnalyzer::CreateAccumulatedPacketsGraph(
-    PacketDirection desired_direction,
-    Plot* plot) {
-  CreateAccumulatedPacketsTimeSeries(desired_direction, plot, rtp_packets_,
-                                     "RTP");
-  CreateAccumulatedPacketsTimeSeries(desired_direction, plot, rtcp_packets_,
-                                     "RTCP");
-
-  plot->SetXAxis(0, call_duration_s_, "Time (s)", kLeftMargin, kRightMargin);
-  plot->SetSuggestedYAxis(0, 1, "Received Packets", kBottomMargin, kTopMargin);
-  if (desired_direction == webrtc::PacketDirection::kIncomingPacket) {
-    plot->SetTitle("Accumulated Incoming RTP/RTCP packets");
-  } else if (desired_direction == webrtc::PacketDirection::kOutgoingPacket) {
-    plot->SetTitle("Accumulated Outgoing RTP/RTCP packets");
-  }
-}
-
-// For each SSRC, plot the time between the consecutive playouts.
-void EventLogAnalyzer::CreatePlayoutGraph(Plot* plot) {
-  std::map<uint32_t, TimeSeries> time_series;
-  std::map<uint32_t, uint64_t> last_playout;
-
-  uint32_t ssrc;
-
-  for (size_t i = 0; i < parsed_log_.GetNumberOfEvents(); i++) {
-    ParsedRtcEventLog::EventType event_type = parsed_log_.GetEventType(i);
-    if (event_type == ParsedRtcEventLog::AUDIO_PLAYOUT_EVENT) {
-      parsed_log_.GetAudioPlayout(i, &ssrc);
-      uint64_t timestamp = parsed_log_.GetTimestamp(i);
-      if (MatchingSsrc(ssrc, desired_ssrc_)) {
-        float x = static_cast<float>(timestamp - begin_time_) / 1000000;
-        float y = static_cast<float>(timestamp - last_playout[ssrc]) / 1000;
-        if (time_series[ssrc].points.size() == 0) {
-          // There were no previusly logged playout for this SSRC.
-          // Generate a point, but place it on the x-axis.
-          y = 0;
-        }
-        time_series[ssrc].points.push_back(TimeSeriesPoint(x, y));
-        last_playout[ssrc] = timestamp;
-      }
-    }
-  }
-
-  // Set labels and put in graph.
-  for (auto& kv : time_series) {
-    kv.second.label = SsrcToString(kv.first);
-    kv.second.style = BAR_GRAPH;
-    plot->AppendTimeSeries(std::move(kv.second));
-  }
-
-  plot->SetXAxis(0, call_duration_s_, "Time (s)", kLeftMargin, kRightMargin);
-  plot->SetSuggestedYAxis(0, 1, "Time since last playout (ms)", kBottomMargin,
-                          kTopMargin);
-  plot->SetTitle("Audio playout");
-}
-
-// For audio SSRCs, plot the audio level.
-void EventLogAnalyzer::CreateAudioLevelGraph(Plot* plot) {
-  std::map<StreamId, TimeSeries> time_series;
-
-  for (auto& kv : rtp_packets_) {
-    StreamId stream_id = kv.first;
-    const std::vector<LoggedRtpPacket>& packet_stream = kv.second;
-    // TODO(ivoc): When audio send/receive configs are stored in the event
-    //             log, a check should be added here to only process audio
-    //             streams. Tracking bug: webrtc:6399
-    for (auto& packet : packet_stream) {
-      if (packet.header.extension.hasAudioLevel) {
-        float x = static_cast<float>(packet.timestamp - begin_time_) / 1000000;
-        // The audio level is stored in -dBov (so e.g. -10 dBov is stored as 10)
-        // Here we convert it to dBov.
-        float y = static_cast<float>(-packet.header.extension.audioLevel);
-        time_series[stream_id].points.emplace_back(TimeSeriesPoint(x, y));
-      }
-    }
-  }
-
-  for (auto& series : time_series) {
-    series.second.label = GetStreamName(series.first);
-    series.second.style = LINE_GRAPH;
-    plot->AppendTimeSeries(std::move(series.second));
-  }
-
-  plot->SetXAxis(0, call_duration_s_, "Time (s)", kLeftMargin, kRightMargin);
-  plot->SetYAxis(-127, 0, "Audio level (dBov)", kBottomMargin,
-                 kTopMargin);
-  plot->SetTitle("Audio level");
-}
-
-// For each SSRC, plot the time between the consecutive playouts.
-void EventLogAnalyzer::CreateSequenceNumberGraph(Plot* plot) {
-  for (auto& kv : rtp_packets_) {
-    StreamId stream_id = kv.first;
-    const std::vector<LoggedRtpPacket>& packet_stream = kv.second;
-    // Filter on direction and SSRC.
-    if (stream_id.GetDirection() != kIncomingPacket ||
-        !MatchingSsrc(stream_id.GetSsrc(), desired_ssrc_)) {
-      continue;
-    }
-
-    TimeSeries time_series(GetStreamName(stream_id), BAR_GRAPH);
-    ProcessPairs<LoggedRtpPacket, float>(
-        [](const LoggedRtpPacket& old_packet,
-           const LoggedRtpPacket& new_packet) {
-          int64_t diff =
-              WrappingDifference(new_packet.header.sequenceNumber,
-                                 old_packet.header.sequenceNumber, 1ul << 16);
-          return rtc::Optional<float>(diff);
-        },
-        packet_stream, begin_time_, &time_series);
-    plot->AppendTimeSeries(std::move(time_series));
-  }
-
-  plot->SetXAxis(0, call_duration_s_, "Time (s)", kLeftMargin, kRightMargin);
-  plot->SetSuggestedYAxis(0, 1, "Difference since last packet", kBottomMargin,
-                          kTopMargin);
-  plot->SetTitle("Sequence number");
-}
-
-void EventLogAnalyzer::CreateIncomingPacketLossGraph(Plot* plot) {
-  for (auto& kv : rtp_packets_) {
-    StreamId stream_id = kv.first;
-    const std::vector<LoggedRtpPacket>& packet_stream = kv.second;
-    // Filter on direction and SSRC.
-    if (stream_id.GetDirection() != kIncomingPacket ||
-        !MatchingSsrc(stream_id.GetSsrc(), desired_ssrc_) ||
-        packet_stream.size() == 0) {
-      continue;
-    }
-
-    TimeSeries time_series(GetStreamName(stream_id), LINE_DOT_GRAPH);
-    const uint64_t kWindowUs = 1000000;
-    const uint64_t kStep = 1000000;
-    SequenceNumberUnwrapper unwrapper_;
-    SequenceNumberUnwrapper prior_unwrapper_;
-    size_t window_index_begin = 0;
-    size_t window_index_end = 0;
-    int64_t highest_seq_number =
-        unwrapper_.Unwrap(packet_stream[0].header.sequenceNumber) - 1;
-    int64_t highest_prior_seq_number =
-        prior_unwrapper_.Unwrap(packet_stream[0].header.sequenceNumber) - 1;
-
-    for (uint64_t t = begin_time_; t < end_time_ + kStep; t += kStep) {
-      while (window_index_end < packet_stream.size() &&
-             packet_stream[window_index_end].timestamp < t) {
-        int64_t sequence_number = unwrapper_.Unwrap(
-            packet_stream[window_index_end].header.sequenceNumber);
-        highest_seq_number = std::max(highest_seq_number, sequence_number);
-        ++window_index_end;
-      }
-      while (window_index_begin < packet_stream.size() &&
-             packet_stream[window_index_begin].timestamp < t - kWindowUs) {
-        int64_t sequence_number = prior_unwrapper_.Unwrap(
-            packet_stream[window_index_begin].header.sequenceNumber);
-        highest_prior_seq_number =
-            std::max(highest_prior_seq_number, sequence_number);
-        ++window_index_begin;
-      }
-      float x = static_cast<float>(t - begin_time_) / 1000000;
-      int64_t expected_packets = highest_seq_number - highest_prior_seq_number;
-      if (expected_packets > 0) {
-        int64_t received_packets = window_index_end - window_index_begin;
-        int64_t lost_packets = expected_packets - received_packets;
-        float y = static_cast<float>(lost_packets) / expected_packets * 100;
-        time_series.points.emplace_back(x, y);
-      }
-    }
-    plot->AppendTimeSeries(std::move(time_series));
-  }
-
-  plot->SetXAxis(0, call_duration_s_, "Time (s)", kLeftMargin, kRightMargin);
-  plot->SetSuggestedYAxis(0, 1, "Estimated loss rate (%)", kBottomMargin,
-                          kTopMargin);
-  plot->SetTitle("Estimated incoming loss rate");
-}
-
-void EventLogAnalyzer::CreateIncomingDelayDeltaGraph(Plot* plot) {
-  for (auto& kv : rtp_packets_) {
-    StreamId stream_id = kv.first;
-    const std::vector<LoggedRtpPacket>& packet_stream = kv.second;
-    // Filter on direction and SSRC.
-    if (stream_id.GetDirection() != kIncomingPacket ||
-        !MatchingSsrc(stream_id.GetSsrc(), desired_ssrc_) ||
-        IsAudioSsrc(stream_id) || !IsVideoSsrc(stream_id) ||
-        IsRtxSsrc(stream_id)) {
-      continue;
-    }
-
-    TimeSeries capture_time_data(GetStreamName(stream_id) + " capture-time",
-                                 BAR_GRAPH);
-    ProcessPairs<LoggedRtpPacket, double>(NetworkDelayDiff_CaptureTime,
-                                          packet_stream, begin_time_,
-                                          &capture_time_data);
-    plot->AppendTimeSeries(std::move(capture_time_data));
-
-    TimeSeries send_time_data(GetStreamName(stream_id) + " abs-send-time",
-                              BAR_GRAPH);
-    ProcessPairs<LoggedRtpPacket, double>(NetworkDelayDiff_AbsSendTime,
-                                          packet_stream, begin_time_,
-                                          &send_time_data);
-    plot->AppendTimeSeries(std::move(send_time_data));
-  }
-
-  plot->SetXAxis(0, call_duration_s_, "Time (s)", kLeftMargin, kRightMargin);
-  plot->SetSuggestedYAxis(0, 1, "Latency change (ms)", kBottomMargin,
-                          kTopMargin);
-  plot->SetTitle("Network latency difference between consecutive packets");
-}
-
-void EventLogAnalyzer::CreateIncomingDelayGraph(Plot* plot) {
-  for (auto& kv : rtp_packets_) {
-    StreamId stream_id = kv.first;
-    const std::vector<LoggedRtpPacket>& packet_stream = kv.second;
-    // Filter on direction and SSRC.
-    if (stream_id.GetDirection() != kIncomingPacket ||
-        !MatchingSsrc(stream_id.GetSsrc(), desired_ssrc_) ||
-        IsAudioSsrc(stream_id) || !IsVideoSsrc(stream_id) ||
-        IsRtxSsrc(stream_id)) {
-      continue;
-    }
-
-    TimeSeries capture_time_data(GetStreamName(stream_id) + " capture-time",
-                                 LINE_GRAPH);
-    AccumulatePairs<LoggedRtpPacket, double>(NetworkDelayDiff_CaptureTime,
-                                             packet_stream, begin_time_,
-                                             &capture_time_data);
-    plot->AppendTimeSeries(std::move(capture_time_data));
-
-    TimeSeries send_time_data(GetStreamName(stream_id) + " abs-send-time",
-                              LINE_GRAPH);
-    AccumulatePairs<LoggedRtpPacket, double>(NetworkDelayDiff_AbsSendTime,
-                                             packet_stream, begin_time_,
-                                             &send_time_data);
-    plot->AppendTimeSeries(std::move(send_time_data));
-  }
-
-  plot->SetXAxis(0, call_duration_s_, "Time (s)", kLeftMargin, kRightMargin);
-  plot->SetSuggestedYAxis(0, 1, "Latency change (ms)", kBottomMargin,
-                          kTopMargin);
-  plot->SetTitle("Network latency (relative to first packet)");
-}
-
-// Plot the fraction of packets lost (as perceived by the loss-based BWE).
-void EventLogAnalyzer::CreateFractionLossGraph(Plot* plot) {
-  TimeSeries time_series("Fraction lost", LINE_DOT_GRAPH);
-  for (auto& bwe_update : bwe_loss_updates_) {
-    float x = static_cast<float>(bwe_update.timestamp - begin_time_) / 1000000;
-    float y = static_cast<float>(bwe_update.fraction_loss) / 255 * 100;
-    time_series.points.emplace_back(x, y);
-  }
-
-  plot->SetXAxis(0, call_duration_s_, "Time (s)", kLeftMargin, kRightMargin);
-  plot->SetSuggestedYAxis(0, 10, "Percent lost packets", kBottomMargin,
-                          kTopMargin);
-  plot->SetTitle("Reported packet loss");
-  plot->AppendTimeSeries(std::move(time_series));
-}
-
-// Plot the total bandwidth used by all RTP streams.
-void EventLogAnalyzer::CreateTotalBitrateGraph(
-    PacketDirection desired_direction,
-    Plot* plot,
-    bool show_detector_state) {
-  struct TimestampSize {
-    TimestampSize(uint64_t t, size_t s) : timestamp(t), size(s) {}
-    uint64_t timestamp;
-    size_t size;
-  };
-  std::vector<TimestampSize> packets;
-
-  PacketDirection direction;
-  size_t total_length;
-
-  // Extract timestamps and sizes for the relevant packets.
-  for (size_t i = 0; i < parsed_log_.GetNumberOfEvents(); i++) {
-    ParsedRtcEventLog::EventType event_type = parsed_log_.GetEventType(i);
-    if (event_type == ParsedRtcEventLog::RTP_EVENT) {
-      parsed_log_.GetRtpHeader(i, &direction, nullptr, nullptr, &total_length);
-      if (direction == desired_direction) {
-        uint64_t timestamp = parsed_log_.GetTimestamp(i);
-        packets.push_back(TimestampSize(timestamp, total_length));
-      }
-    }
-  }
-
-  size_t window_index_begin = 0;
-  size_t window_index_end = 0;
-  size_t bytes_in_window = 0;
-
-  // Calculate a moving average of the bitrate and store in a TimeSeries.
-  TimeSeries bitrate_series("Bitrate", LINE_GRAPH);
-  for (uint64_t time = begin_time_; time < end_time_ + step_; time += step_) {
-    while (window_index_end < packets.size() &&
-           packets[window_index_end].timestamp < time) {
-      bytes_in_window += packets[window_index_end].size;
-      ++window_index_end;
-    }
-    while (window_index_begin < packets.size() &&
-           packets[window_index_begin].timestamp < time - window_duration_) {
-      RTC_DCHECK_LE(packets[window_index_begin].size, bytes_in_window);
-      bytes_in_window -= packets[window_index_begin].size;
-      ++window_index_begin;
-    }
-    float window_duration_in_seconds =
-        static_cast<float>(window_duration_) / 1000000;
-    float x = static_cast<float>(time - begin_time_) / 1000000;
-    float y = bytes_in_window * 8 / window_duration_in_seconds / 1000;
-    bitrate_series.points.emplace_back(x, y);
-  }
-  plot->AppendTimeSeries(std::move(bitrate_series));
-
-  // Overlay the send-side bandwidth estimate over the outgoing bitrate.
-  if (desired_direction == kOutgoingPacket) {
-    TimeSeries loss_series("Loss-based estimate", LINE_STEP_GRAPH);
-    for (auto& loss_update : bwe_loss_updates_) {
-      float x =
-          static_cast<float>(loss_update.timestamp - begin_time_) / 1000000;
-      float y = static_cast<float>(loss_update.new_bitrate) / 1000;
-      loss_series.points.emplace_back(x, y);
-    }
-
-    TimeSeries delay_series("Delay-based estimate", LINE_STEP_GRAPH);
-    IntervalSeries overusing_series("Overusing", "#ff8e82",
-                                    IntervalSeries::kHorizontal);
-    IntervalSeries underusing_series("Underusing", "#5092fc",
-                                     IntervalSeries::kHorizontal);
-    IntervalSeries normal_series("Normal", "#c4ffc4",
-                                 IntervalSeries::kHorizontal);
-    IntervalSeries* last_series = &normal_series;
-    double last_detector_switch = 0.0;
-
-    BandwidthUsage last_detector_state = BandwidthUsage::kBwNormal;
-
-    for (auto& delay_update : bwe_delay_updates_) {
-      float x =
-          static_cast<float>(delay_update.timestamp - begin_time_) / 1000000;
-      float y = static_cast<float>(delay_update.bitrate_bps) / 1000;
-
-      if (last_detector_state != delay_update.detector_state) {
-        last_series->intervals.emplace_back(last_detector_switch, x);
-        last_detector_state = delay_update.detector_state;
-        last_detector_switch = x;
-
-        switch (delay_update.detector_state) {
-          case BandwidthUsage::kBwNormal:
-            last_series = &normal_series;
-            break;
-          case BandwidthUsage::kBwUnderusing:
-            last_series = &underusing_series;
-            break;
-          case BandwidthUsage::kBwOverusing:
-            last_series = &overusing_series;
-            break;
-        }
-      }
-
-      delay_series.points.emplace_back(x, y);
-    }
-
-    RTC_CHECK(last_series);
-    last_series->intervals.emplace_back(last_detector_switch, end_time_);
-
-    TimeSeries created_series("Probe cluster created.", DOT_GRAPH);
-    for (auto& cluster : bwe_probe_cluster_created_events_) {
-      float x = static_cast<float>(cluster.timestamp - begin_time_) / 1000000;
-      float y = static_cast<float>(cluster.bitrate_bps) / 1000;
-      created_series.points.emplace_back(x, y);
-    }
-
-    TimeSeries result_series("Probing results.", DOT_GRAPH);
-    for (auto& result : bwe_probe_result_events_) {
-      if (result.bitrate_bps) {
-        float x = static_cast<float>(result.timestamp - begin_time_) / 1000000;
-        float y = static_cast<float>(*result.bitrate_bps) / 1000;
-        result_series.points.emplace_back(x, y);
-      }
-    }
-
-    if (show_detector_state) {
-      plot->AppendIntervalSeries(std::move(overusing_series));
-      plot->AppendIntervalSeries(std::move(underusing_series));
-      plot->AppendIntervalSeries(std::move(normal_series));
-    }
-
-    plot->AppendTimeSeries(std::move(bitrate_series));
-    plot->AppendTimeSeries(std::move(loss_series));
-    plot->AppendTimeSeries(std::move(delay_series));
-    plot->AppendTimeSeries(std::move(created_series));
-    plot->AppendTimeSeries(std::move(result_series));
-  }
-
-  // Overlay the incoming REMB over the outgoing bitrate
-  // and outgoing REMB over incoming bitrate.
-  PacketDirection remb_direction =
-      desired_direction == kOutgoingPacket ? kIncomingPacket : kOutgoingPacket;
-  TimeSeries remb_series("Remb", LINE_STEP_GRAPH);
-  std::multimap<uint64_t, const LoggedRtcpPacket*> remb_packets;
-  for (const auto& kv : rtcp_packets_) {
-    if (kv.first.GetDirection() == remb_direction) {
-      for (const LoggedRtcpPacket& rtcp_packet : kv.second) {
-        if (rtcp_packet.type == kRtcpRemb) {
-          remb_packets.insert(
-              std::make_pair(rtcp_packet.timestamp, &rtcp_packet));
-        }
-      }
-    }
-  }
-
-  for (const auto& kv : remb_packets) {
-    const LoggedRtcpPacket* const rtcp = kv.second;
-    const rtcp::Remb* const remb = static_cast<rtcp::Remb*>(rtcp->packet.get());
-    float x = static_cast<float>(rtcp->timestamp - begin_time_) / 1000000;
-    float y = static_cast<float>(remb->bitrate_bps()) / 1000;
-    remb_series.points.emplace_back(x, y);
-  }
-  plot->AppendTimeSeriesIfNotEmpty(std::move(remb_series));
-
-  plot->SetXAxis(0, call_duration_s_, "Time (s)", kLeftMargin, kRightMargin);
-  plot->SetSuggestedYAxis(0, 1, "Bitrate (kbps)", kBottomMargin, kTopMargin);
-  if (desired_direction == webrtc::PacketDirection::kIncomingPacket) {
-    plot->SetTitle("Incoming RTP bitrate");
-  } else if (desired_direction == webrtc::PacketDirection::kOutgoingPacket) {
-    plot->SetTitle("Outgoing RTP bitrate");
-  }
-}
-
-// For each SSRC, plot the bandwidth used by that stream.
-void EventLogAnalyzer::CreateStreamBitrateGraph(
-    PacketDirection desired_direction,
-    Plot* plot) {
-  for (auto& kv : rtp_packets_) {
-    StreamId stream_id = kv.first;
-    const std::vector<LoggedRtpPacket>& packet_stream = kv.second;
-    // Filter on direction and SSRC.
-    if (stream_id.GetDirection() != desired_direction ||
-        !MatchingSsrc(stream_id.GetSsrc(), desired_ssrc_)) {
-      continue;
-    }
-
-    TimeSeries time_series(GetStreamName(stream_id), LINE_GRAPH);
-    MovingAverage<LoggedRtpPacket, double>(
-        [](const LoggedRtpPacket& packet) {
-          return rtc::Optional<double>(packet.total_length * 8.0 / 1000.0);
-        },
-        packet_stream, begin_time_, end_time_, window_duration_, step_,
-        &time_series);
-    plot->AppendTimeSeries(std::move(time_series));
-  }
-
-  plot->SetXAxis(0, call_duration_s_, "Time (s)", kLeftMargin, kRightMargin);
-  plot->SetSuggestedYAxis(0, 1, "Bitrate (kbps)", kBottomMargin, kTopMargin);
-  if (desired_direction == webrtc::PacketDirection::kIncomingPacket) {
-    plot->SetTitle("Incoming bitrate per stream");
-  } else if (desired_direction == webrtc::PacketDirection::kOutgoingPacket) {
-    plot->SetTitle("Outgoing bitrate per stream");
-  }
-}
-
-void EventLogAnalyzer::CreateBweSimulationGraph(Plot* plot) {
-  std::multimap<uint64_t, const LoggedRtpPacket*> outgoing_rtp;
-  std::multimap<uint64_t, const LoggedRtcpPacket*> incoming_rtcp;
-
-  for (const auto& kv : rtp_packets_) {
-    if (kv.first.GetDirection() == PacketDirection::kOutgoingPacket) {
-      for (const LoggedRtpPacket& rtp_packet : kv.second)
-        outgoing_rtp.insert(std::make_pair(rtp_packet.timestamp, &rtp_packet));
-    }
-  }
-
-  for (const auto& kv : rtcp_packets_) {
-    if (kv.first.GetDirection() == PacketDirection::kIncomingPacket) {
-      for (const LoggedRtcpPacket& rtcp_packet : kv.second)
-        incoming_rtcp.insert(
-            std::make_pair(rtcp_packet.timestamp, &rtcp_packet));
-    }
-  }
-
-  SimulatedClock clock(0);
-  BitrateObserver observer;
-  RtcEventLogNullImpl null_event_log;
-  PacketRouter packet_router;
-  PacedSender pacer(&clock, &packet_router, &null_event_log);
-  SendSideCongestionController cc(&clock, &observer, &null_event_log, &pacer);
-  // TODO(holmer): Log the call config and use that here instead.
-  static const uint32_t kDefaultStartBitrateBps = 300000;
-  cc.SetBweBitrates(0, kDefaultStartBitrateBps, -1);
-
-  TimeSeries time_series("Delay-based estimate", LINE_DOT_GRAPH);
-  TimeSeries acked_time_series("Acked bitrate", LINE_DOT_GRAPH);
-
-  auto rtp_iterator = outgoing_rtp.begin();
-  auto rtcp_iterator = incoming_rtcp.begin();
-
-  auto NextRtpTime = [&]() {
-    if (rtp_iterator != outgoing_rtp.end())
-      return static_cast<int64_t>(rtp_iterator->first);
-    return std::numeric_limits<int64_t>::max();
-  };
-
-  auto NextRtcpTime = [&]() {
-    if (rtcp_iterator != incoming_rtcp.end())
-      return static_cast<int64_t>(rtcp_iterator->first);
-    return std::numeric_limits<int64_t>::max();
-  };
-
-  auto NextProcessTime = [&]() {
-    if (rtcp_iterator != incoming_rtcp.end() ||
-        rtp_iterator != outgoing_rtp.end()) {
-      return clock.TimeInMicroseconds() +
-             std::max<int64_t>(cc.TimeUntilNextProcess() * 1000, 0);
-    }
-    return std::numeric_limits<int64_t>::max();
-  };
-
-  RateStatistics acked_bitrate(250, 8000);
-
-  int64_t time_us = std::min(NextRtpTime(), NextRtcpTime());
-  int64_t last_update_us = 0;
-  while (time_us != std::numeric_limits<int64_t>::max()) {
-    clock.AdvanceTimeMicroseconds(time_us - clock.TimeInMicroseconds());
-    if (clock.TimeInMicroseconds() >= NextRtcpTime()) {
-      RTC_DCHECK_EQ(clock.TimeInMicroseconds(), NextRtcpTime());
-      const LoggedRtcpPacket& rtcp = *rtcp_iterator->second;
-      if (rtcp.type == kRtcpTransportFeedback) {
-        cc.OnTransportFeedback(
-            *static_cast<rtcp::TransportFeedback*>(rtcp.packet.get()));
-        std::vector<PacketFeedback> feedback = cc.GetTransportFeedbackVector();
-        SortPacketFeedbackVector(&feedback);
-        rtc::Optional<uint32_t> bitrate_bps;
-        if (!feedback.empty()) {
-          for (const PacketFeedback& packet : feedback)
-            acked_bitrate.Update(packet.payload_size, packet.arrival_time_ms);
-          bitrate_bps = acked_bitrate.Rate(feedback.back().arrival_time_ms);
-        }
-        uint32_t y = 0;
-        if (bitrate_bps)
-          y = *bitrate_bps / 1000;
-        float x = static_cast<float>(clock.TimeInMicroseconds() - begin_time_) /
-                  1000000;
-        acked_time_series.points.emplace_back(x, y);
-      }
-      ++rtcp_iterator;
-    }
-    if (clock.TimeInMicroseconds() >= NextRtpTime()) {
-      RTC_DCHECK_EQ(clock.TimeInMicroseconds(), NextRtpTime());
-      const LoggedRtpPacket& rtp = *rtp_iterator->second;
-      if (rtp.header.extension.hasTransportSequenceNumber) {
-        RTC_DCHECK(rtp.header.extension.hasTransportSequenceNumber);
-        cc.AddPacket(rtp.header.ssrc,
-                     rtp.header.extension.transportSequenceNumber,
-                     rtp.total_length, PacedPacketInfo());
-        rtc::SentPacket sent_packet(
-            rtp.header.extension.transportSequenceNumber, rtp.timestamp / 1000);
-        cc.OnSentPacket(sent_packet);
-      }
-      ++rtp_iterator;
-    }
-    if (clock.TimeInMicroseconds() >= NextProcessTime()) {
-      RTC_DCHECK_EQ(clock.TimeInMicroseconds(), NextProcessTime());
-      cc.Process();
-    }
-    if (observer.GetAndResetBitrateUpdated() ||
-        time_us - last_update_us >= 1e6) {
-      uint32_t y = observer.last_bitrate_bps() / 1000;
-      float x = static_cast<float>(clock.TimeInMicroseconds() - begin_time_) /
-                1000000;
-      time_series.points.emplace_back(x, y);
-      last_update_us = time_us;
-    }
-    time_us = std::min({NextRtpTime(), NextRtcpTime(), NextProcessTime()});
-  }
-  // Add the data set to the plot.
-  plot->AppendTimeSeries(std::move(time_series));
-  plot->AppendTimeSeries(std::move(acked_time_series));
-
-  plot->SetXAxis(0, call_duration_s_, "Time (s)", kLeftMargin, kRightMargin);
-  plot->SetSuggestedYAxis(0, 10, "Bitrate (kbps)", kBottomMargin, kTopMargin);
-  plot->SetTitle("Simulated BWE behavior");
-}
-
-void EventLogAnalyzer::CreateNetworkDelayFeedbackGraph(Plot* plot) {
-  std::multimap<uint64_t, const LoggedRtpPacket*> outgoing_rtp;
-  std::multimap<uint64_t, const LoggedRtcpPacket*> incoming_rtcp;
-
-  for (const auto& kv : rtp_packets_) {
-    if (kv.first.GetDirection() == PacketDirection::kOutgoingPacket) {
-      for (const LoggedRtpPacket& rtp_packet : kv.second)
-        outgoing_rtp.insert(std::make_pair(rtp_packet.timestamp, &rtp_packet));
-    }
-  }
-
-  for (const auto& kv : rtcp_packets_) {
-    if (kv.first.GetDirection() == PacketDirection::kIncomingPacket) {
-      for (const LoggedRtcpPacket& rtcp_packet : kv.second)
-        incoming_rtcp.insert(
-            std::make_pair(rtcp_packet.timestamp, &rtcp_packet));
-    }
-  }
-
-  SimulatedClock clock(0);
-  TransportFeedbackAdapter feedback_adapter(&clock);
-
-  TimeSeries late_feedback_series("Late feedback results.", DOT_GRAPH);
-  TimeSeries time_series("Network Delay Change", LINE_DOT_GRAPH);
-  int64_t estimated_base_delay_ms = std::numeric_limits<int64_t>::max();
-
-  auto rtp_iterator = outgoing_rtp.begin();
-  auto rtcp_iterator = incoming_rtcp.begin();
-
-  auto NextRtpTime = [&]() {
-    if (rtp_iterator != outgoing_rtp.end())
-      return static_cast<int64_t>(rtp_iterator->first);
-    return std::numeric_limits<int64_t>::max();
-  };
-
-  auto NextRtcpTime = [&]() {
-    if (rtcp_iterator != incoming_rtcp.end())
-      return static_cast<int64_t>(rtcp_iterator->first);
-    return std::numeric_limits<int64_t>::max();
-  };
-
-  int64_t time_us = std::min(NextRtpTime(), NextRtcpTime());
-  int64_t prev_y = 0;
-  while (time_us != std::numeric_limits<int64_t>::max()) {
-    clock.AdvanceTimeMicroseconds(time_us - clock.TimeInMicroseconds());
-    if (clock.TimeInMicroseconds() >= NextRtcpTime()) {
-      RTC_DCHECK_EQ(clock.TimeInMicroseconds(), NextRtcpTime());
-      const LoggedRtcpPacket& rtcp = *rtcp_iterator->second;
-      if (rtcp.type == kRtcpTransportFeedback) {
-        feedback_adapter.OnTransportFeedback(
-            *static_cast<rtcp::TransportFeedback*>(rtcp.packet.get()));
-        std::vector<PacketFeedback> feedback =
-            feedback_adapter.GetTransportFeedbackVector();
-        SortPacketFeedbackVector(&feedback);
-        for (const PacketFeedback& packet : feedback) {
-          float x =
-              static_cast<float>(clock.TimeInMicroseconds() - begin_time_) /
-              1000000;
-          if (packet.send_time_ms == -1) {
-            late_feedback_series.points.emplace_back(x, prev_y);
-            continue;
-          }
-          int64_t y = packet.arrival_time_ms - packet.send_time_ms;
-          prev_y = y;
-          estimated_base_delay_ms = std::min(y, estimated_base_delay_ms);
-          time_series.points.emplace_back(x, y);
-        }
-      }
-      ++rtcp_iterator;
-    }
-    if (clock.TimeInMicroseconds() >= NextRtpTime()) {
-      RTC_DCHECK_EQ(clock.TimeInMicroseconds(), NextRtpTime());
-      const LoggedRtpPacket& rtp = *rtp_iterator->second;
-      if (rtp.header.extension.hasTransportSequenceNumber) {
-        RTC_DCHECK(rtp.header.extension.hasTransportSequenceNumber);
-        feedback_adapter.AddPacket(rtp.header.ssrc,
-                                   rtp.header.extension.transportSequenceNumber,
-                                   rtp.total_length, PacedPacketInfo());
-        feedback_adapter.OnSentPacket(
-            rtp.header.extension.transportSequenceNumber, rtp.timestamp / 1000);
-      }
-      ++rtp_iterator;
-    }
-    time_us = std::min(NextRtpTime(), NextRtcpTime());
-  }
-  // We assume that the base network delay (w/o queues) is the min delay
-  // observed during the call.
-  for (TimeSeriesPoint& point : time_series.points)
-    point.y -= estimated_base_delay_ms;
-  for (TimeSeriesPoint& point : late_feedback_series.points)
-    point.y -= estimated_base_delay_ms;
-  // Add the data set to the plot.
-  plot->AppendTimeSeriesIfNotEmpty(std::move(time_series));
-  plot->AppendTimeSeriesIfNotEmpty(std::move(late_feedback_series));
-
-  plot->SetXAxis(0, call_duration_s_, "Time (s)", kLeftMargin, kRightMargin);
-  plot->SetSuggestedYAxis(0, 10, "Delay (ms)", kBottomMargin, kTopMargin);
-  plot->SetTitle("Network Delay Change.");
-}
-
-std::vector<std::pair<int64_t, int64_t>> EventLogAnalyzer::GetFrameTimestamps()
-    const {
-  std::vector<std::pair<int64_t, int64_t>> timestamps;
-  size_t largest_stream_size = 0;
-  const std::vector<LoggedRtpPacket>* largest_video_stream = nullptr;
-  // Find the incoming video stream with the most number of packets that is
-  // not rtx.
-  for (const auto& kv : rtp_packets_) {
-    if (kv.first.GetDirection() == kIncomingPacket &&
-        video_ssrcs_.find(kv.first) != video_ssrcs_.end() &&
-        rtx_ssrcs_.find(kv.first) == rtx_ssrcs_.end() &&
-        kv.second.size() > largest_stream_size) {
-      largest_stream_size = kv.second.size();
-      largest_video_stream = &kv.second;
-    }
-  }
-  if (largest_video_stream == nullptr) {
-    for (auto& packet : *largest_video_stream) {
-      if (packet.header.markerBit) {
-        int64_t capture_ms = packet.header.timestamp / 90.0;
-        int64_t arrival_ms = packet.timestamp / 1000.0;
-        timestamps.push_back(std::make_pair(capture_ms, arrival_ms));
-      }
-    }
-  }
-  return timestamps;
-}
-
-void EventLogAnalyzer::CreateTimestampGraph(Plot* plot) {
-  for (const auto& kv : rtp_packets_) {
-    const std::vector<LoggedRtpPacket>& rtp_packets = kv.second;
-    StreamId stream_id = kv.first;
-
-    {
-      TimeSeries timestamp_data(GetStreamName(stream_id) + " capture-time",
-                                LINE_DOT_GRAPH);
-      for (LoggedRtpPacket packet : rtp_packets) {
-        float x = static_cast<float>(packet.timestamp - begin_time_) / 1000000;
-        float y = packet.header.timestamp;
-        timestamp_data.points.emplace_back(x, y);
-      }
-      plot->AppendTimeSeries(std::move(timestamp_data));
-    }
-
-    {
-      auto kv = rtcp_packets_.find(stream_id);
-      if (kv != rtcp_packets_.end()) {
-        const auto& packets = kv->second;
-        TimeSeries timestamp_data(
-            GetStreamName(stream_id) + " rtcp capture-time", LINE_DOT_GRAPH);
-        for (const LoggedRtcpPacket& rtcp : packets) {
-          if (rtcp.type != kRtcpSr)
-            continue;
-          rtcp::SenderReport* sr;
-          sr = static_cast<rtcp::SenderReport*>(rtcp.packet.get());
-          float x = static_cast<float>(rtcp.timestamp - begin_time_) / 1000000;
-          float y = sr->rtp_timestamp();
-          timestamp_data.points.emplace_back(x, y);
-        }
-        plot->AppendTimeSeries(std::move(timestamp_data));
-      }
-    }
-  }
-
-  plot->SetXAxis(0, call_duration_s_, "Time (s)", kLeftMargin, kRightMargin);
-  plot->SetSuggestedYAxis(0, 1, "Timestamp (90khz)", kBottomMargin, kTopMargin);
-  plot->SetTitle("Timestamps");
-}
-
-void EventLogAnalyzer::CreateAudioEncoderTargetBitrateGraph(Plot* plot) {
-  TimeSeries time_series("Audio encoder target bitrate", LINE_DOT_GRAPH);
-  ProcessPoints<AudioNetworkAdaptationEvent>(
-      [](const AudioNetworkAdaptationEvent& ana_event) -> rtc::Optional<float> {
-        if (ana_event.config.bitrate_bps)
-          return rtc::Optional<float>(
-              static_cast<float>(*ana_event.config.bitrate_bps));
-        return rtc::Optional<float>();
-      },
-      audio_network_adaptation_events_, begin_time_, &time_series);
-  plot->AppendTimeSeries(std::move(time_series));
-  plot->SetXAxis(0, call_duration_s_, "Time (s)", kLeftMargin, kRightMargin);
-  plot->SetSuggestedYAxis(0, 1, "Bitrate (bps)", kBottomMargin, kTopMargin);
-  plot->SetTitle("Reported audio encoder target bitrate");
-}
-
-void EventLogAnalyzer::CreateAudioEncoderFrameLengthGraph(Plot* plot) {
-  TimeSeries time_series("Audio encoder frame length", LINE_DOT_GRAPH);
-  ProcessPoints<AudioNetworkAdaptationEvent>(
-      [](const AudioNetworkAdaptationEvent& ana_event) {
-        if (ana_event.config.frame_length_ms)
-          return rtc::Optional<float>(
-              static_cast<float>(*ana_event.config.frame_length_ms));
-        return rtc::Optional<float>();
-      },
-      audio_network_adaptation_events_, begin_time_, &time_series);
-  plot->AppendTimeSeries(std::move(time_series));
-  plot->SetXAxis(0, call_duration_s_, "Time (s)", kLeftMargin, kRightMargin);
-  plot->SetSuggestedYAxis(0, 1, "Frame length (ms)", kBottomMargin, kTopMargin);
-  plot->SetTitle("Reported audio encoder frame length");
-}
-
-void EventLogAnalyzer::CreateAudioEncoderPacketLossGraph(Plot* plot) {
-  TimeSeries time_series("Audio encoder uplink packet loss fraction",
-                         LINE_DOT_GRAPH);
-  ProcessPoints<AudioNetworkAdaptationEvent>(
-      [](const AudioNetworkAdaptationEvent& ana_event) {
-        if (ana_event.config.uplink_packet_loss_fraction)
-          return rtc::Optional<float>(static_cast<float>(
-              *ana_event.config.uplink_packet_loss_fraction));
-        return rtc::Optional<float>();
-      },
-      audio_network_adaptation_events_, begin_time_, &time_series);
-  plot->AppendTimeSeries(std::move(time_series));
-  plot->SetXAxis(0, call_duration_s_, "Time (s)", kLeftMargin, kRightMargin);
-  plot->SetSuggestedYAxis(0, 10, "Percent lost packets", kBottomMargin,
-                          kTopMargin);
-  plot->SetTitle("Reported audio encoder lost packets");
-}
-
-void EventLogAnalyzer::CreateAudioEncoderEnableFecGraph(Plot* plot) {
-  TimeSeries time_series("Audio encoder FEC", LINE_DOT_GRAPH);
-  ProcessPoints<AudioNetworkAdaptationEvent>(
-      [](const AudioNetworkAdaptationEvent& ana_event) {
-        if (ana_event.config.enable_fec)
-          return rtc::Optional<float>(
-              static_cast<float>(*ana_event.config.enable_fec));
-        return rtc::Optional<float>();
-      },
-      audio_network_adaptation_events_, begin_time_, &time_series);
-  plot->AppendTimeSeries(std::move(time_series));
-  plot->SetXAxis(0, call_duration_s_, "Time (s)", kLeftMargin, kRightMargin);
-  plot->SetSuggestedYAxis(0, 1, "FEC (false/true)", kBottomMargin, kTopMargin);
-  plot->SetTitle("Reported audio encoder FEC");
-}
-
-void EventLogAnalyzer::CreateAudioEncoderEnableDtxGraph(Plot* plot) {
-  TimeSeries time_series("Audio encoder DTX", LINE_DOT_GRAPH);
-  ProcessPoints<AudioNetworkAdaptationEvent>(
-      [](const AudioNetworkAdaptationEvent& ana_event) {
-        if (ana_event.config.enable_dtx)
-          return rtc::Optional<float>(
-              static_cast<float>(*ana_event.config.enable_dtx));
-        return rtc::Optional<float>();
-      },
-      audio_network_adaptation_events_, begin_time_, &time_series);
-  plot->AppendTimeSeries(std::move(time_series));
-  plot->SetXAxis(0, call_duration_s_, "Time (s)", kLeftMargin, kRightMargin);
-  plot->SetSuggestedYAxis(0, 1, "DTX (false/true)", kBottomMargin, kTopMargin);
-  plot->SetTitle("Reported audio encoder DTX");
-}
-
-void EventLogAnalyzer::CreateAudioEncoderNumChannelsGraph(Plot* plot) {
-  TimeSeries time_series("Audio encoder number of channels", LINE_DOT_GRAPH);
-  ProcessPoints<AudioNetworkAdaptationEvent>(
-      [](const AudioNetworkAdaptationEvent& ana_event) {
-        if (ana_event.config.num_channels)
-          return rtc::Optional<float>(
-              static_cast<float>(*ana_event.config.num_channels));
-        return rtc::Optional<float>();
-      },
-      audio_network_adaptation_events_, begin_time_, &time_series);
-  plot->AppendTimeSeries(std::move(time_series));
-  plot->SetXAxis(0, call_duration_s_, "Time (s)", kLeftMargin, kRightMargin);
-  plot->SetSuggestedYAxis(0, 1, "Number of channels (1 (mono)/2 (stereo))",
-                          kBottomMargin, kTopMargin);
-  plot->SetTitle("Reported audio encoder number of channels");
-}
-
-class NetEqStreamInput : public test::NetEqInput {
- public:
-  // Does not take any ownership, and all pointers must refer to valid objects
-  // that outlive the one constructed.
-  NetEqStreamInput(const std::vector<LoggedRtpPacket>* packet_stream,
-                   const std::vector<uint64_t>* output_events_us,
-                   rtc::Optional<uint64_t> end_time_us)
-      : packet_stream_(*packet_stream),
-        packet_stream_it_(packet_stream_.begin()),
-        output_events_us_it_(output_events_us->begin()),
-        output_events_us_end_(output_events_us->end()),
-        end_time_us_(end_time_us) {
-    RTC_DCHECK(packet_stream);
-    RTC_DCHECK(output_events_us);
-  }
-
-  rtc::Optional<int64_t> NextPacketTime() const override {
-    if (packet_stream_it_ == packet_stream_.end()) {
-      return rtc::Optional<int64_t>();
-    }
-    if (end_time_us_ && packet_stream_it_->timestamp > *end_time_us_) {
-      return rtc::Optional<int64_t>();
-    }
-    // Convert from us to ms.
-    return rtc::Optional<int64_t>(packet_stream_it_->timestamp / 1000);
-  }
-
-  rtc::Optional<int64_t> NextOutputEventTime() const override {
-    if (output_events_us_it_ == output_events_us_end_) {
-      return rtc::Optional<int64_t>();
-    }
-    if (end_time_us_ && *output_events_us_it_ > *end_time_us_) {
-      return rtc::Optional<int64_t>();
-    }
-    // Convert from us to ms.
-    return rtc::Optional<int64_t>(
-        rtc::checked_cast<int64_t>(*output_events_us_it_ / 1000));
-  }
-
-  std::unique_ptr<PacketData> PopPacket() override {
-    if (packet_stream_it_ == packet_stream_.end()) {
-      return std::unique_ptr<PacketData>();
-    }
-    std::unique_ptr<PacketData> packet_data(new PacketData());
-    packet_data->header = packet_stream_it_->header;
-    // Convert from us to ms.
-    packet_data->time_ms = packet_stream_it_->timestamp / 1000.0;
-
-    // This is a header-only "dummy" packet. Set the payload to all zeros, with
-    // length according to the virtual length.
-    packet_data->payload.SetSize(packet_stream_it_->total_length);
-    std::fill_n(packet_data->payload.data(), packet_data->payload.size(), 0);
-
-    ++packet_stream_it_;
-    return packet_data;
-  }
-
-  void AdvanceOutputEvent() override {
-    if (output_events_us_it_ != output_events_us_end_) {
-      ++output_events_us_it_;
-    }
-  }
-
-  bool ended() const override { return !NextEventTime(); }
-
-  rtc::Optional<RTPHeader> NextHeader() const override {
-    if (packet_stream_it_ == packet_stream_.end()) {
-      return rtc::Optional<RTPHeader>();
-    }
-    return rtc::Optional<RTPHeader>(packet_stream_it_->header);
-  }
-
- private:
-  const std::vector<LoggedRtpPacket>& packet_stream_;
-  std::vector<LoggedRtpPacket>::const_iterator packet_stream_it_;
-  std::vector<uint64_t>::const_iterator output_events_us_it_;
-  const std::vector<uint64_t>::const_iterator output_events_us_end_;
-  const rtc::Optional<uint64_t> end_time_us_;
-};
-
-namespace {
-// Creates a NetEq test object and all necessary input and output helpers. Runs
-// the test and returns the NetEqDelayAnalyzer object that was used to
-// instrument the test.
-std::unique_ptr<test::NetEqDelayAnalyzer> CreateNetEqTestAndRun(
-    const std::vector<LoggedRtpPacket>* packet_stream,
-    const std::vector<uint64_t>* output_events_us,
-    rtc::Optional<uint64_t> end_time_us,
-    const std::string& replacement_file_name,
-    int file_sample_rate_hz) {
-  std::unique_ptr<test::NetEqInput> input(
-      new NetEqStreamInput(packet_stream, output_events_us, end_time_us));
-
-  constexpr int kReplacementPt = 127;
-  std::set<uint8_t> cn_types;
-  std::set<uint8_t> forbidden_types;
-  input.reset(new test::NetEqReplacementInput(std::move(input), kReplacementPt,
-                                              cn_types, forbidden_types));
-
-  NetEq::Config config;
-  config.max_packets_in_buffer = 200;
-  config.enable_fast_accelerate = true;
-
-  std::unique_ptr<test::VoidAudioSink> output(new test::VoidAudioSink());
-
-  test::NetEqTest::DecoderMap codecs;
-
-  // Create a "replacement decoder" that produces the decoded audio by reading
-  // from a file rather than from the encoded payloads.
-  std::unique_ptr<test::ResampleInputAudioFile> replacement_file(
-      new test::ResampleInputAudioFile(replacement_file_name,
-                                       file_sample_rate_hz));
-  replacement_file->set_output_rate_hz(48000);
-  std::unique_ptr<AudioDecoder> replacement_decoder(
-      new test::FakeDecodeFromFile(std::move(replacement_file), 48000, false));
-  test::NetEqTest::ExtDecoderMap ext_codecs;
-  ext_codecs[kReplacementPt] = {replacement_decoder.get(),
-                                NetEqDecoder::kDecoderArbitrary,
-                                "replacement codec"};
-
-  std::unique_ptr<test::NetEqDelayAnalyzer> delay_cb(
-      new test::NetEqDelayAnalyzer);
-  test::DefaultNetEqTestErrorCallback error_cb;
-  test::NetEqTest::Callbacks callbacks;
-  callbacks.error_callback = &error_cb;
-  callbacks.post_insert_packet = delay_cb.get();
-  callbacks.get_audio_callback = delay_cb.get();
-
-  test::NetEqTest test(config, codecs, ext_codecs, std::move(input),
-                       std::move(output), callbacks);
-  test.Run();
-  return delay_cb;
-}
-}  // namespace
-
-// Plots the jitter buffer delay profile. This will plot only for the first
-// incoming audio SSRC. If the stream contains more than one incoming audio
-// SSRC, all but the first will be ignored.
-void EventLogAnalyzer::CreateAudioJitterBufferGraph(
-    const std::string& replacement_file_name,
-    int file_sample_rate_hz,
-    Plot* plot) {
-  const auto& incoming_audio_kv = std::find_if(
-      rtp_packets_.begin(), rtp_packets_.end(),
-      [this](std::pair<StreamId, std::vector<LoggedRtpPacket>> kv) {
-        return kv.first.GetDirection() == kIncomingPacket &&
-               this->IsAudioSsrc(kv.first);
-      });
-  if (incoming_audio_kv == rtp_packets_.end()) {
-    // No incoming audio stream found.
-    return;
-  }
-
-  const uint32_t ssrc = incoming_audio_kv->first.GetSsrc();
-
-  std::map<uint32_t, std::vector<uint64_t>>::const_iterator output_events_it =
-      audio_playout_events_.find(ssrc);
-  if (output_events_it == audio_playout_events_.end()) {
-    // Could not find output events with SSRC matching the input audio stream.
-    // Using the first available stream of output events.
-    output_events_it = audio_playout_events_.cbegin();
-  }
-
-  rtc::Optional<uint64_t> end_time_us =
-      log_segments_.empty()
-          ? rtc::Optional<uint64_t>()
-          : rtc::Optional<uint64_t>(log_segments_.front().second);
-
-  auto delay_cb = CreateNetEqTestAndRun(
-      &incoming_audio_kv->second, &output_events_it->second, end_time_us,
-      replacement_file_name, file_sample_rate_hz);
-
-  std::vector<float> send_times_s;
-  std::vector<float> arrival_delay_ms;
-  std::vector<float> corrected_arrival_delay_ms;
-  std::vector<rtc::Optional<float>> playout_delay_ms;
-  std::vector<rtc::Optional<float>> target_delay_ms;
-  delay_cb->CreateGraphs(&send_times_s, &arrival_delay_ms,
-                         &corrected_arrival_delay_ms, &playout_delay_ms,
-                         &target_delay_ms);
-  RTC_DCHECK_EQ(send_times_s.size(), arrival_delay_ms.size());
-  RTC_DCHECK_EQ(send_times_s.size(), corrected_arrival_delay_ms.size());
-  RTC_DCHECK_EQ(send_times_s.size(), playout_delay_ms.size());
-  RTC_DCHECK_EQ(send_times_s.size(), target_delay_ms.size());
-
-  std::map<StreamId, TimeSeries> time_series_packet_arrival;
-  std::map<StreamId, TimeSeries> time_series_relative_packet_arrival;
-  std::map<StreamId, TimeSeries> time_series_play_time;
-  std::map<StreamId, TimeSeries> time_series_target_time;
-  float min_y_axis = 0.f;
-  float max_y_axis = 0.f;
-  const StreamId stream_id = incoming_audio_kv->first;
-  for (size_t i = 0; i < send_times_s.size(); ++i) {
-    time_series_packet_arrival[stream_id].points.emplace_back(
-        TimeSeriesPoint(send_times_s[i], arrival_delay_ms[i]));
-    time_series_relative_packet_arrival[stream_id].points.emplace_back(
-        TimeSeriesPoint(send_times_s[i], corrected_arrival_delay_ms[i]));
-    min_y_axis = std::min(min_y_axis, corrected_arrival_delay_ms[i]);
-    max_y_axis = std::max(max_y_axis, corrected_arrival_delay_ms[i]);
-    if (playout_delay_ms[i]) {
-      time_series_play_time[stream_id].points.emplace_back(
-          TimeSeriesPoint(send_times_s[i], *playout_delay_ms[i]));
-      min_y_axis = std::min(min_y_axis, *playout_delay_ms[i]);
-      max_y_axis = std::max(max_y_axis, *playout_delay_ms[i]);
-    }
-    if (target_delay_ms[i]) {
-      time_series_target_time[stream_id].points.emplace_back(
-          TimeSeriesPoint(send_times_s[i], *target_delay_ms[i]));
-      min_y_axis = std::min(min_y_axis, *target_delay_ms[i]);
-      max_y_axis = std::max(max_y_axis, *target_delay_ms[i]);
-    }
-  }
-
-  // This code is adapted for a single stream. The creation of the streams above
-  // guarantee that no more than one steam is included. If multiple streams are
-  // to be plotted, they should likely be given distinct labels below.
-  RTC_DCHECK_EQ(time_series_relative_packet_arrival.size(), 1);
-  for (auto& series : time_series_relative_packet_arrival) {
-    series.second.label = "Relative packet arrival delay";
-    series.second.style = LINE_GRAPH;
-    plot->AppendTimeSeries(std::move(series.second));
-  }
-  RTC_DCHECK_EQ(time_series_play_time.size(), 1);
-  for (auto& series : time_series_play_time) {
-    series.second.label = "Playout delay";
-    series.second.style = LINE_GRAPH;
-    plot->AppendTimeSeries(std::move(series.second));
-  }
-  RTC_DCHECK_EQ(time_series_target_time.size(), 1);
-  for (auto& series : time_series_target_time) {
-    series.second.label = "Target delay";
-    series.second.style = LINE_DOT_GRAPH;
-    plot->AppendTimeSeries(std::move(series.second));
-  }
-
-  plot->SetXAxis(0, call_duration_s_, "Time (s)", kLeftMargin, kRightMargin);
-  plot->SetYAxis(min_y_axis, max_y_axis, "Relative delay (ms)", kBottomMargin,
-                 kTopMargin);
-  plot->SetTitle("NetEq timing");
-}
-}  // namespace plotting
-}  // namespace webrtc
diff --git a/rtc_tools/event_log_visualizer/analyzer.h b/rtc_tools/event_log_visualizer/analyzer.h
deleted file mode 100644
index 328fc53..0000000
--- a/rtc_tools/event_log_visualizer/analyzer.h
+++ /dev/null
@@ -1,207 +0,0 @@
-/*
- *  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_RTC_TOOLS_EVENT_LOG_VISUALIZER_ANALYZER_H_
-#define WEBRTC_RTC_TOOLS_EVENT_LOG_VISUALIZER_ANALYZER_H_
-
-#include <map>
-#include <memory>
-#include <set>
-#include <string>
-#include <utility>
-#include <vector>
-
-#include "webrtc/logging/rtc_event_log/rtc_event_log_parser.h"
-#include "webrtc/modules/audio_coding/audio_network_adaptor/include/audio_network_adaptor.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet.h"
-#include "webrtc/rtc_base/function_view.h"
-#include "webrtc/rtc_tools/event_log_visualizer/plot_base.h"
-
-namespace webrtc {
-namespace plotting {
-
-struct LoggedRtpPacket {
-  LoggedRtpPacket(uint64_t timestamp, RTPHeader header, size_t total_length)
-      : timestamp(timestamp), header(header), total_length(total_length) {}
-  uint64_t timestamp;
-  // TODO(terelius): This allocates space for 15 CSRCs even if none are used.
-  RTPHeader header;
-  size_t total_length;
-};
-
-struct LoggedRtcpPacket {
-  LoggedRtcpPacket(uint64_t timestamp,
-                   RTCPPacketType rtcp_type,
-                   std::unique_ptr<rtcp::RtcpPacket> rtcp_packet)
-      : timestamp(timestamp), type(rtcp_type), packet(std::move(rtcp_packet)) {}
-  uint64_t timestamp;
-  RTCPPacketType type;
-  std::unique_ptr<rtcp::RtcpPacket> packet;
-};
-
-struct LossBasedBweUpdate {
-  uint64_t timestamp;
-  int32_t new_bitrate;
-  uint8_t fraction_loss;
-  int32_t expected_packets;
-};
-
-struct AudioNetworkAdaptationEvent {
-  uint64_t timestamp;
-  AudioEncoderRuntimeConfig config;
-};
-
-class EventLogAnalyzer {
- public:
-  // The EventLogAnalyzer keeps a reference to the ParsedRtcEventLog for the
-  // duration of its lifetime. The ParsedRtcEventLog must not be destroyed or
-  // modified while the EventLogAnalyzer is being used.
-  explicit EventLogAnalyzer(const ParsedRtcEventLog& log);
-
-  void CreatePacketGraph(PacketDirection desired_direction, Plot* plot);
-
-  void CreateAccumulatedPacketsGraph(PacketDirection desired_direction,
-                                     Plot* plot);
-
-  void CreatePlayoutGraph(Plot* plot);
-
-  void CreateAudioLevelGraph(Plot* plot);
-
-  void CreateSequenceNumberGraph(Plot* plot);
-
-  void CreateIncomingPacketLossGraph(Plot* plot);
-
-  void CreateIncomingDelayDeltaGraph(Plot* plot);
-  void CreateIncomingDelayGraph(Plot* plot);
-
-  void CreateFractionLossGraph(Plot* plot);
-
-  void CreateTotalBitrateGraph(PacketDirection desired_direction,
-                               Plot* plot,
-                               bool show_detector_state = false);
-
-  void CreateStreamBitrateGraph(PacketDirection desired_direction, Plot* plot);
-
-  void CreateBweSimulationGraph(Plot* plot);
-
-  void CreateNetworkDelayFeedbackGraph(Plot* plot);
-  void CreateTimestampGraph(Plot* plot);
-
-  void CreateAudioEncoderTargetBitrateGraph(Plot* plot);
-  void CreateAudioEncoderFrameLengthGraph(Plot* plot);
-  void CreateAudioEncoderPacketLossGraph(Plot* plot);
-  void CreateAudioEncoderEnableFecGraph(Plot* plot);
-  void CreateAudioEncoderEnableDtxGraph(Plot* plot);
-  void CreateAudioEncoderNumChannelsGraph(Plot* plot);
-  void CreateAudioJitterBufferGraph(const std::string& replacement_file_name,
-                                    int file_sample_rate_hz,
-                                    Plot* plot);
-
-  // Returns a vector of capture and arrival timestamps for the video frames
-  // of the stream with the most number of frames.
-  std::vector<std::pair<int64_t, int64_t>> GetFrameTimestamps() const;
-
- private:
-  class StreamId {
-   public:
-    StreamId(uint32_t ssrc, webrtc::PacketDirection direction)
-        : ssrc_(ssrc), direction_(direction) {}
-    bool operator<(const StreamId& other) const {
-      return std::tie(ssrc_, direction_) <
-             std::tie(other.ssrc_, other.direction_);
-    }
-    bool operator==(const StreamId& other) const {
-      return std::tie(ssrc_, direction_) ==
-             std::tie(other.ssrc_, other.direction_);
-    }
-    uint32_t GetSsrc() const { return ssrc_; }
-    webrtc::PacketDirection GetDirection() const { return direction_; }
-
-   private:
-    uint32_t ssrc_;
-    webrtc::PacketDirection direction_;
-  };
-
-  template <typename T>
-  void CreateAccumulatedPacketsTimeSeries(
-      PacketDirection desired_direction,
-      Plot* plot,
-      const std::map<StreamId, std::vector<T>>& packets,
-      const std::string& label_prefix);
-
-  bool IsRtxSsrc(StreamId stream_id) const;
-
-  bool IsVideoSsrc(StreamId stream_id) const;
-
-  bool IsAudioSsrc(StreamId stream_id) const;
-
-  std::string GetStreamName(StreamId) const;
-
-  const ParsedRtcEventLog& parsed_log_;
-
-  // A list of SSRCs we are interested in analysing.
-  // If left empty, all SSRCs will be considered relevant.
-  std::vector<uint32_t> desired_ssrc_;
-
-  // Tracks what each stream is configured for. Note that a single SSRC can be
-  // in several sets. For example, the SSRC used for sending video over RTX
-  // will appear in both video_ssrcs_ and rtx_ssrcs_. In the unlikely case that
-  // an SSRC is reconfigured to a different media type mid-call, it will also
-  // appear in multiple sets.
-  std::set<StreamId> rtx_ssrcs_;
-  std::set<StreamId> video_ssrcs_;
-  std::set<StreamId> audio_ssrcs_;
-
-  // Maps a stream identifier consisting of ssrc and direction to the parsed
-  // RTP headers in that stream. Header extensions are parsed if the stream
-  // has been configured.
-  std::map<StreamId, std::vector<LoggedRtpPacket>> rtp_packets_;
-
-  std::map<StreamId, std::vector<LoggedRtcpPacket>> rtcp_packets_;
-
-  // Maps an SSRC to the timestamps of parsed audio playout events.
-  std::map<uint32_t, std::vector<uint64_t>> audio_playout_events_;
-
-  // Stores the timestamps for all log segments, in the form of associated start
-  // and end events.
-  std::vector<std::pair<uint64_t, uint64_t>> log_segments_;
-
-  // A list of all updates from the send-side loss-based bandwidth estimator.
-  std::vector<LossBasedBweUpdate> bwe_loss_updates_;
-
-  std::vector<AudioNetworkAdaptationEvent> audio_network_adaptation_events_;
-
-  std::vector<ParsedRtcEventLog::BweProbeClusterCreatedEvent>
-      bwe_probe_cluster_created_events_;
-
-  std::vector<ParsedRtcEventLog::BweProbeResultEvent> bwe_probe_result_events_;
-
-  std::vector<ParsedRtcEventLog::BweDelayBasedUpdate> bwe_delay_updates_;
-
-  // Window and step size used for calculating moving averages, e.g. bitrate.
-  // The generated data points will be |step_| microseconds apart.
-  // Only events occuring at most |window_duration_| microseconds before the
-  // current data point will be part of the average.
-  uint64_t window_duration_;
-  uint64_t step_;
-
-  // First and last events of the log.
-  uint64_t begin_time_;
-  uint64_t end_time_;
-
-  // Duration (in seconds) of log file.
-  float call_duration_s_;
-};
-
-}  // namespace plotting
-}  // namespace webrtc
-
-#endif  // WEBRTC_RTC_TOOLS_EVENT_LOG_VISUALIZER_ANALYZER_H_
diff --git a/rtc_tools/event_log_visualizer/chart.proto b/rtc_tools/event_log_visualizer/chart.proto
deleted file mode 100644
index 41e3ebd..0000000
--- a/rtc_tools/event_log_visualizer/chart.proto
+++ /dev/null
@@ -1,38 +0,0 @@
-// Describes a chart generated from WebRTC event log data.
-syntax = "proto3";
-option optimize_for = LITE_RUNTIME;
-
-package webrtc.analytics;
-
-message ChartStyle {
-  enum Type {
-    UNDEFINED = 0;
-    LINE_CHART = 1;
-    BAR_CHART = 2;
-    LINE_STEP_CHART = 3;
-    SCATTER_CHART = 4;
-  }
-}
-
-message DataSet {
-  repeated float x_values = 1;
-  repeated float y_values = 2;
-  string label = 3;
-  ChartStyle.Type style = 4;
-  bool highlight_points = 5;
-}
-
-message Chart {
-  repeated DataSet data_sets = 1;
-  float xaxis_min = 2;
-  float xaxis_max = 3;
-  string xaxis_label = 4;
-  float yaxis_min = 5;
-  float yaxis_max = 6;
-  string yaxis_label = 7;
-  string title = 8;
-}
-
-message ChartCollection {
-  repeated Chart charts = 1;
-}
diff --git a/rtc_tools/event_log_visualizer/main.cc b/rtc_tools/event_log_visualizer/main.cc
deleted file mode 100644
index 0aafb2c..0000000
--- a/rtc_tools/event_log_visualizer/main.cc
+++ /dev/null
@@ -1,304 +0,0 @@
-/*
- *  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 <iostream>
-
-#include "webrtc/logging/rtc_event_log/rtc_event_log_parser.h"
-#include "webrtc/rtc_base/flags.h"
-#include "webrtc/rtc_tools/event_log_visualizer/analyzer.h"
-#include "webrtc/rtc_tools/event_log_visualizer/plot_base.h"
-#include "webrtc/rtc_tools/event_log_visualizer/plot_python.h"
-#include "webrtc/test/field_trial.h"
-#include "webrtc/test/testsupport/fileutils.h"
-
-DEFINE_string(plot_profile,
-              "default",
-              "A profile that selects a certain subset of the plots. Currently "
-              "defined profiles are \"all\", \"none\" and \"default\"");
-
-DEFINE_bool(plot_incoming_packet_sizes,
-            false,
-            "Plot bar graph showing the size of each incoming packet.");
-DEFINE_bool(plot_outgoing_packet_sizes,
-            false,
-            "Plot bar graph showing the size of each outgoing packet.");
-DEFINE_bool(plot_incoming_packet_count,
-            false,
-            "Plot the accumulated number of packets for each incoming stream.");
-DEFINE_bool(plot_outgoing_packet_count,
-            false,
-            "Plot the accumulated number of packets for each outgoing stream.");
-DEFINE_bool(plot_audio_playout,
-            false,
-            "Plot bar graph showing the time between each audio playout.");
-DEFINE_bool(plot_audio_level,
-            false,
-            "Plot line graph showing the audio level of incoming audio.");
-DEFINE_bool(plot_incoming_sequence_number_delta,
-            false,
-            "Plot the sequence number difference between consecutive incoming "
-            "packets.");
-DEFINE_bool(
-    plot_incoming_delay_delta,
-    false,
-    "Plot the difference in 1-way path delay between consecutive packets.");
-DEFINE_bool(plot_incoming_delay,
-            true,
-            "Plot the 1-way path delay for incoming packets, normalized so "
-            "that the first packet has delay 0.");
-DEFINE_bool(plot_incoming_loss_rate,
-            true,
-            "Compute the loss rate for incoming packets using a method that's "
-            "similar to the one used for RTCP SR and RR fraction lost. Note "
-            "that the loss rate can be negative if packets are duplicated or "
-            "reordered.");
-DEFINE_bool(plot_incoming_bitrate,
-            true,
-            "Plot the total bitrate used by all incoming streams.");
-DEFINE_bool(plot_outgoing_bitrate,
-            true,
-            "Plot the total bitrate used by all outgoing streams.");
-DEFINE_bool(plot_incoming_stream_bitrate,
-            true,
-            "Plot the bitrate used by each incoming stream.");
-DEFINE_bool(plot_outgoing_stream_bitrate,
-            true,
-            "Plot the bitrate used by each outgoing stream.");
-DEFINE_bool(plot_simulated_sendside_bwe,
-            false,
-            "Run the send-side bandwidth estimator with the outgoing rtp and "
-            "incoming rtcp and plot the resulting estimate.");
-DEFINE_bool(plot_network_delay_feedback,
-            true,
-            "Compute network delay based on sent packets and the received "
-            "transport feedback.");
-DEFINE_bool(plot_fraction_loss_feedback,
-            true,
-            "Plot packet loss in percent for outgoing packets (as perceived by "
-            "the send-side bandwidth estimator).");
-DEFINE_bool(plot_timestamps,
-            false,
-            "Plot the rtp timestamps of all rtp and rtcp packets over time.");
-DEFINE_bool(plot_audio_encoder_bitrate_bps,
-            false,
-            "Plot the audio encoder target bitrate.");
-DEFINE_bool(plot_audio_encoder_frame_length_ms,
-            false,
-            "Plot the audio encoder frame length.");
-DEFINE_bool(
-    plot_audio_encoder_packet_loss,
-    false,
-    "Plot the uplink packet loss fraction which is sent to the audio encoder.");
-DEFINE_bool(plot_audio_encoder_fec, false, "Plot the audio encoder FEC.");
-DEFINE_bool(plot_audio_encoder_dtx, false, "Plot the audio encoder DTX.");
-DEFINE_bool(plot_audio_encoder_num_channels,
-            false,
-            "Plot the audio encoder number of channels.");
-DEFINE_bool(plot_audio_jitter_buffer,
-            false,
-            "Plot the audio jitter buffer delay profile.");
-DEFINE_string(
-    force_fieldtrials,
-    "",
-    "Field trials control experimental feature code which can be forced. "
-    "E.g. running with --force_fieldtrials=WebRTC-FooFeature/Enabled/"
-    " will assign the group Enabled to field trial WebRTC-FooFeature. Multiple "
-    "trials are separated by \"/\"");
-DEFINE_string(wav_filename,
-              "",
-              "Path to wav file used for simulation of jitter buffer");
-DEFINE_bool(help, false, "prints this message");
-
-DEFINE_bool(show_detector_state,
-            false,
-            "Show the state of the delay based BWE detector on the total "
-            "bitrate graph");
-
-void SetAllPlotFlags(bool setting);
-
-
-int main(int argc, char* argv[]) {
-  std::string program_name = argv[0];
-  std::string usage =
-      "A tool for visualizing WebRTC event logs.\n"
-      "Example usage:\n" +
-      program_name + " <logfile> | python\n" + "Run " + program_name +
-      " --help for a list of command line options\n";
-
-  // Parse command line flags without removing them. We're only interested in
-  // the |plot_profile| flag.
-  rtc::FlagList::SetFlagsFromCommandLine(&argc, argv, false);
-  if (strcmp(FLAG_plot_profile, "all") == 0) {
-    SetAllPlotFlags(true);
-  } else if (strcmp(FLAG_plot_profile, "none") == 0) {
-    SetAllPlotFlags(false);
-  } else if (strcmp(FLAG_plot_profile, "default") == 0) {
-    // Do nothing.
-  } else {
-    rtc::Flag* plot_profile_flag = rtc::FlagList::Lookup("plot_profile");
-    RTC_CHECK(plot_profile_flag);
-    plot_profile_flag->Print(false);
-  }
-  // Parse the remaining flags. They are applied relative to the chosen profile.
-  rtc::FlagList::SetFlagsFromCommandLine(&argc, argv, true);
-
-  if (argc != 2 || FLAG_help) {
-    // Print usage information.
-    std::cout << usage;
-    if (FLAG_help)
-      rtc::FlagList::Print(nullptr, false);
-    return 0;
-  }
-
-  webrtc::test::SetExecutablePath(argv[0]);
-  webrtc::test::InitFieldTrialsFromString(FLAG_force_fieldtrials);
-
-  std::string filename = argv[1];
-
-  webrtc::ParsedRtcEventLog parsed_log;
-
-  if (!parsed_log.ParseFile(filename)) {
-    std::cerr << "Could not parse the entire log file." << std::endl;
-    std::cerr << "Proceeding to analyze the first "
-              << parsed_log.GetNumberOfEvents() << " events in the file."
-              << std::endl;
-  }
-
-  webrtc::plotting::EventLogAnalyzer analyzer(parsed_log);
-  std::unique_ptr<webrtc::plotting::PlotCollection> collection(
-      new webrtc::plotting::PythonPlotCollection());
-
-  if (FLAG_plot_incoming_packet_sizes) {
-    analyzer.CreatePacketGraph(webrtc::PacketDirection::kIncomingPacket,
-                               collection->AppendNewPlot());
-  }
-  if (FLAG_plot_outgoing_packet_sizes) {
-    analyzer.CreatePacketGraph(webrtc::PacketDirection::kOutgoingPacket,
-                               collection->AppendNewPlot());
-  }
-  if (FLAG_plot_incoming_packet_count) {
-    analyzer.CreateAccumulatedPacketsGraph(
-        webrtc::PacketDirection::kIncomingPacket, collection->AppendNewPlot());
-  }
-  if (FLAG_plot_outgoing_packet_count) {
-    analyzer.CreateAccumulatedPacketsGraph(
-        webrtc::PacketDirection::kOutgoingPacket, collection->AppendNewPlot());
-  }
-  if (FLAG_plot_audio_playout) {
-    analyzer.CreatePlayoutGraph(collection->AppendNewPlot());
-  }
-  if (FLAG_plot_audio_level) {
-    analyzer.CreateAudioLevelGraph(collection->AppendNewPlot());
-  }
-  if (FLAG_plot_incoming_sequence_number_delta) {
-    analyzer.CreateSequenceNumberGraph(collection->AppendNewPlot());
-  }
-  if (FLAG_plot_incoming_delay_delta) {
-    analyzer.CreateIncomingDelayDeltaGraph(collection->AppendNewPlot());
-  }
-  if (FLAG_plot_incoming_delay) {
-    analyzer.CreateIncomingDelayGraph(collection->AppendNewPlot());
-  }
-  if (FLAG_plot_incoming_loss_rate) {
-    analyzer.CreateIncomingPacketLossGraph(collection->AppendNewPlot());
-  }
-  if (FLAG_plot_incoming_bitrate) {
-    analyzer.CreateTotalBitrateGraph(webrtc::PacketDirection::kIncomingPacket,
-                                     collection->AppendNewPlot(),
-                                     FLAG_show_detector_state);
-  }
-  if (FLAG_plot_outgoing_bitrate) {
-    analyzer.CreateTotalBitrateGraph(webrtc::PacketDirection::kOutgoingPacket,
-                                     collection->AppendNewPlot(),
-                                     FLAG_show_detector_state);
-  }
-  if (FLAG_plot_incoming_stream_bitrate) {
-    analyzer.CreateStreamBitrateGraph(webrtc::PacketDirection::kIncomingPacket,
-                                      collection->AppendNewPlot());
-  }
-  if (FLAG_plot_outgoing_stream_bitrate) {
-    analyzer.CreateStreamBitrateGraph(webrtc::PacketDirection::kOutgoingPacket,
-                                      collection->AppendNewPlot());
-  }
-  if (FLAG_plot_simulated_sendside_bwe) {
-    analyzer.CreateBweSimulationGraph(collection->AppendNewPlot());
-  }
-  if (FLAG_plot_network_delay_feedback) {
-    analyzer.CreateNetworkDelayFeedbackGraph(collection->AppendNewPlot());
-  }
-  if (FLAG_plot_fraction_loss_feedback) {
-    analyzer.CreateFractionLossGraph(collection->AppendNewPlot());
-  }
-  if (FLAG_plot_timestamps) {
-    analyzer.CreateTimestampGraph(collection->AppendNewPlot());
-  }
-  if (FLAG_plot_audio_encoder_bitrate_bps) {
-    analyzer.CreateAudioEncoderTargetBitrateGraph(collection->AppendNewPlot());
-  }
-  if (FLAG_plot_audio_encoder_frame_length_ms) {
-    analyzer.CreateAudioEncoderFrameLengthGraph(collection->AppendNewPlot());
-  }
-  if (FLAG_plot_audio_encoder_packet_loss) {
-    analyzer.CreateAudioEncoderPacketLossGraph(collection->AppendNewPlot());
-  }
-  if (FLAG_plot_audio_encoder_fec) {
-    analyzer.CreateAudioEncoderEnableFecGraph(collection->AppendNewPlot());
-  }
-  if (FLAG_plot_audio_encoder_dtx) {
-    analyzer.CreateAudioEncoderEnableDtxGraph(collection->AppendNewPlot());
-  }
-  if (FLAG_plot_audio_encoder_num_channels) {
-    analyzer.CreateAudioEncoderNumChannelsGraph(collection->AppendNewPlot());
-  }
-  if (FLAG_plot_audio_jitter_buffer) {
-    std::string wav_path;
-    if (FLAG_wav_filename[0] != '\0') {
-      wav_path = FLAG_wav_filename;
-    } else {
-      wav_path = webrtc::test::ResourcePath(
-          "audio_processing/conversational_speech/EN_script2_F_sp2_B1", "wav");
-    }
-    analyzer.CreateAudioJitterBufferGraph(wav_path, 48000,
-                                          collection->AppendNewPlot());
-  }
-
-  collection->Draw();
-
-  return 0;
-}
-
-
-void SetAllPlotFlags(bool setting) {
-  FLAG_plot_incoming_packet_sizes = setting;
-  FLAG_plot_outgoing_packet_sizes = setting;
-  FLAG_plot_incoming_packet_count = setting;
-  FLAG_plot_outgoing_packet_count = setting;
-  FLAG_plot_audio_playout = setting;
-  FLAG_plot_audio_level = setting;
-  FLAG_plot_incoming_sequence_number_delta = setting;
-  FLAG_plot_incoming_delay_delta = setting;
-  FLAG_plot_incoming_delay = setting;
-  FLAG_plot_incoming_loss_rate = setting;
-  FLAG_plot_incoming_bitrate = setting;
-  FLAG_plot_outgoing_bitrate = setting;
-  FLAG_plot_incoming_stream_bitrate = setting;
-  FLAG_plot_outgoing_stream_bitrate = setting;
-  FLAG_plot_simulated_sendside_bwe = setting;
-  FLAG_plot_network_delay_feedback = setting;
-  FLAG_plot_fraction_loss_feedback = setting;
-  FLAG_plot_timestamps = setting;
-  FLAG_plot_audio_encoder_bitrate_bps = setting;
-  FLAG_plot_audio_encoder_frame_length_ms = setting;
-  FLAG_plot_audio_encoder_packet_loss = setting;
-  FLAG_plot_audio_encoder_fec = setting;
-  FLAG_plot_audio_encoder_dtx = setting;
-  FLAG_plot_audio_encoder_num_channels = setting;
-  FLAG_plot_audio_jitter_buffer = setting;
-}
diff --git a/rtc_tools/event_log_visualizer/plot_base.cc b/rtc_tools/event_log_visualizer/plot_base.cc
deleted file mode 100644
index 783f2b8..0000000
--- a/rtc_tools/event_log_visualizer/plot_base.cc
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- *  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/rtc_tools/event_log_visualizer/plot_base.h"
-
-#include <algorithm>
-
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-namespace plotting {
-
-void Plot::SetXAxis(float min_value,
-                    float max_value,
-                    std::string label,
-                    float left_margin,
-                    float right_margin) {
-  RTC_DCHECK_LE(min_value, max_value);
-  xaxis_min_ = min_value - left_margin * (max_value - min_value);
-  xaxis_max_ = max_value + right_margin * (max_value - min_value);
-  xaxis_label_ = label;
-}
-
-void Plot::SetSuggestedXAxis(float min_value,
-                             float max_value,
-                             std::string label,
-                             float left_margin,
-                             float right_margin) {
-  for (const auto& series : series_list_) {
-    for (const auto& point : series.points) {
-      min_value = std::min(min_value, point.x);
-      max_value = std::max(max_value, point.x);
-    }
-  }
-  SetXAxis(min_value, max_value, label, left_margin, right_margin);
-}
-
-void Plot::SetYAxis(float min_value,
-                    float max_value,
-                    std::string label,
-                    float bottom_margin,
-                    float top_margin) {
-  RTC_DCHECK_LE(min_value, max_value);
-  yaxis_min_ = min_value - bottom_margin * (max_value - min_value);
-  yaxis_max_ = max_value + top_margin * (max_value - min_value);
-  yaxis_label_ = label;
-}
-
-void Plot::SetSuggestedYAxis(float min_value,
-                             float max_value,
-                             std::string label,
-                             float bottom_margin,
-                             float top_margin) {
-  for (const auto& series : series_list_) {
-    for (const auto& point : series.points) {
-      min_value = std::min(min_value, point.y);
-      max_value = std::max(max_value, point.y);
-    }
-  }
-  SetYAxis(min_value, max_value, label, bottom_margin, top_margin);
-}
-
-void Plot::SetTitle(std::string title) {
-  title_ = title;
-}
-
-void Plot::AppendTimeSeries(TimeSeries&& time_series) {
-  series_list_.emplace_back(std::move(time_series));
-}
-
-void Plot::AppendIntervalSeries(IntervalSeries&& interval_series) {
-  interval_list_.emplace_back(std::move(interval_series));
-}
-
-void Plot::AppendTimeSeriesIfNotEmpty(TimeSeries&& time_series) {
-  if (time_series.points.size() > 0) {
-    series_list_.emplace_back(std::move(time_series));
-  }
-}
-
-}  // namespace plotting
-}  // namespace webrtc
diff --git a/rtc_tools/event_log_visualizer/plot_base.h b/rtc_tools/event_log_visualizer/plot_base.h
deleted file mode 100644
index 347fca4..0000000
--- a/rtc_tools/event_log_visualizer/plot_base.h
+++ /dev/null
@@ -1,167 +0,0 @@
-/*
- *  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_RTC_TOOLS_EVENT_LOG_VISUALIZER_PLOT_BASE_H_
-#define WEBRTC_RTC_TOOLS_EVENT_LOG_VISUALIZER_PLOT_BASE_H_
-
-#include <memory>
-#include <string>
-#include <utility>
-#include <vector>
-
-namespace webrtc {
-namespace plotting {
-
-enum PlotStyle {
-  LINE_GRAPH,
-  LINE_DOT_GRAPH,
-  BAR_GRAPH,
-  LINE_STEP_GRAPH,
-  DOT_GRAPH
-};
-
-struct TimeSeriesPoint {
-  TimeSeriesPoint(float x, float y) : x(x), y(y) {}
-  float x;
-  float y;
-};
-
-struct TimeSeries {
-  TimeSeries() = default;
-  TimeSeries(const char* label, PlotStyle style) : label(label), style(style) {}
-  TimeSeries(const std::string& label, PlotStyle style)
-      : label(label), style(style) {}
-  TimeSeries(TimeSeries&& other)
-      : label(std::move(other.label)),
-        style(other.style),
-        points(std::move(other.points)) {}
-  TimeSeries& operator=(TimeSeries&& other) {
-    label = std::move(other.label);
-    style = other.style;
-    points = std::move(other.points);
-    return *this;
-  }
-
-  std::string label;
-  PlotStyle style;
-  std::vector<TimeSeriesPoint> points;
-};
-
-struct Interval {
-  Interval() = default;
-  Interval(double begin, double end) : begin(begin), end(end) {}
-
-  double begin;
-  double end;
-};
-
-struct IntervalSeries {
-  enum Orientation { kHorizontal, kVertical };
-
-  IntervalSeries() = default;
-  IntervalSeries(const std::string& label,
-                 const std::string& color,
-                 IntervalSeries::Orientation orientation)
-      : label(label), color(color), orientation(orientation) {}
-
-  std::string label;
-  std::string color;
-  Orientation orientation;
-  std::vector<Interval> intervals;
-};
-
-// A container that represents a general graph, with axes, title and one or
-// more data series. A subclass should define the output format by overriding
-// the Draw() method.
-class Plot {
- public:
-  virtual ~Plot() {}
-
-  // Overloaded to draw the plot.
-  virtual void Draw() = 0;
-
-  // Sets the lower x-axis limit to min_value (if left_margin == 0).
-  // Sets the upper x-axis limit to max_value (if right_margin == 0).
-  // The margins are measured as fractions of the interval
-  // (max_value - min_value) and are added to either side of the plot.
-  void SetXAxis(float min_value,
-                float max_value,
-                std::string label,
-                float left_margin = 0,
-                float right_margin = 0);
-
-  // Sets the lower and upper x-axis limits based on min_value and max_value,
-  // but modified such that all points in the data series can be represented
-  // on the x-axis. The margins are measured as fractions of the range of
-  // x-values and are added to either side of the plot.
-  void SetSuggestedXAxis(float min_value,
-                         float max_value,
-                         std::string label,
-                         float left_margin = 0,
-                         float right_margin = 0);
-
-  // Sets the lower y-axis limit to min_value (if bottom_margin == 0).
-  // Sets the upper y-axis limit to max_value (if top_margin == 0).
-  // The margins are measured as fractions of the interval
-  // (max_value - min_value) and are added to either side of the plot.
-  void SetYAxis(float min_value,
-                float max_value,
-                std::string label,
-                float bottom_margin = 0,
-                float top_margin = 0);
-
-  // Sets the lower and upper y-axis limits based on min_value and max_value,
-  // but modified such that all points in the data series can be represented
-  // on the y-axis. The margins are measured as fractions of the range of
-  // y-values and are added to either side of the plot.
-  void SetSuggestedYAxis(float min_value,
-                         float max_value,
-                         std::string label,
-                         float bottom_margin = 0,
-                         float top_margin = 0);
-
-  // Sets the title of the plot.
-  void SetTitle(std::string title);
-
-  // Add a new TimeSeries to the plot.
-  void AppendTimeSeries(TimeSeries&& time_series);
-
-  // Add a new IntervalSeries to the plot.
-  void AppendIntervalSeries(IntervalSeries&& interval_series);
-
-  // Add a new TimeSeries to the plot if the series contains contains data.
-  // Otherwise, the call has no effect and the timeseries is destroyed.
-  void AppendTimeSeriesIfNotEmpty(TimeSeries&& time_series);
-
- protected:
-  float xaxis_min_;
-  float xaxis_max_;
-  std::string xaxis_label_;
-  float yaxis_min_;
-  float yaxis_max_;
-  std::string yaxis_label_;
-  std::string title_;
-  std::vector<TimeSeries> series_list_;
-  std::vector<IntervalSeries> interval_list_;
-};
-
-class PlotCollection {
- public:
-  virtual ~PlotCollection() {}
-  virtual void Draw() = 0;
-  virtual Plot* AppendNewPlot() = 0;
-
- protected:
-  std::vector<std::unique_ptr<Plot> > plots_;
-};
-
-}  // namespace plotting
-}  // namespace webrtc
-
-#endif  // WEBRTC_RTC_TOOLS_EVENT_LOG_VISUALIZER_PLOT_BASE_H_
diff --git a/rtc_tools/event_log_visualizer/plot_protobuf.cc b/rtc_tools/event_log_visualizer/plot_protobuf.cc
deleted file mode 100644
index f176414..0000000
--- a/rtc_tools/event_log_visualizer/plot_protobuf.cc
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- *  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/rtc_tools/event_log_visualizer/plot_protobuf.h"
-
-#include <memory>
-
-namespace webrtc {
-namespace plotting {
-
-ProtobufPlot::ProtobufPlot() {}
-
-ProtobufPlot::~ProtobufPlot() {}
-
-void ProtobufPlot::Draw() {}
-
-void ProtobufPlot::ExportProtobuf(webrtc::analytics::Chart* chart) {
-  for (size_t i = 0; i < series_list_.size(); i++) {
-    webrtc::analytics::DataSet* data_set = chart->add_data_sets();
-    for (const auto& point : series_list_[i].points) {
-      data_set->add_x_values(point.x);
-    }
-    for (const auto& point : series_list_[i].points) {
-      data_set->add_y_values(point.y);
-    }
-
-    if (series_list_[i].style == BAR_GRAPH) {
-      data_set->set_style(webrtc::analytics::ChartStyle::BAR_CHART);
-    } else if (series_list_[i].style == LINE_GRAPH) {
-      data_set->set_style(webrtc::analytics::ChartStyle::LINE_CHART);
-    } else if (series_list_[i].style == LINE_DOT_GRAPH) {
-      data_set->set_style(webrtc::analytics::ChartStyle::LINE_CHART);
-      data_set->set_highlight_points(true);
-    } else if (series_list_[i].style == LINE_STEP_GRAPH) {
-      data_set->set_style(webrtc::analytics::ChartStyle::LINE_STEP_CHART);
-    } else if (series_list_[i].style == DOT_GRAPH) {
-      data_set->set_style(webrtc::analytics::ChartStyle::SCATTER_CHART);
-      data_set->set_highlight_points(true);
-    } else {
-      data_set->set_style(webrtc::analytics::ChartStyle::UNDEFINED);
-    }
-
-    data_set->set_label(series_list_[i].label);
-  }
-
-  chart->set_xaxis_min(xaxis_min_);
-  chart->set_xaxis_max(xaxis_max_);
-  chart->set_yaxis_min(yaxis_min_);
-  chart->set_yaxis_max(yaxis_max_);
-  chart->set_xaxis_label(xaxis_label_);
-  chart->set_yaxis_label(yaxis_label_);
-  chart->set_title(title_);
-}
-
-ProtobufPlotCollection::ProtobufPlotCollection() {}
-
-ProtobufPlotCollection::~ProtobufPlotCollection() {}
-
-void ProtobufPlotCollection::Draw() {}
-
-void ProtobufPlotCollection::ExportProtobuf(
-    webrtc::analytics::ChartCollection* collection) {
-  for (const auto& plot : plots_) {
-    // TODO(terelius): Ensure that there is no way to insert plots other than
-    // ProtobufPlots in a ProtobufPlotCollection. Needed to safely static_cast
-    // here.
-    webrtc::analytics::Chart* protobuf_representation
-        = collection->add_charts();
-    static_cast<ProtobufPlot*>(plot.get())
-        ->ExportProtobuf(protobuf_representation);
-  }
-}
-
-Plot* ProtobufPlotCollection::AppendNewPlot() {
-  Plot* plot = new ProtobufPlot();
-  plots_.push_back(std::unique_ptr<Plot>(plot));
-  return plot;
-}
-
-}  // namespace plotting
-}  // namespace webrtc
diff --git a/rtc_tools/event_log_visualizer/plot_protobuf.h b/rtc_tools/event_log_visualizer/plot_protobuf.h
deleted file mode 100644
index e4670db..0000000
--- a/rtc_tools/event_log_visualizer/plot_protobuf.h
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- *  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_RTC_TOOLS_EVENT_LOG_VISUALIZER_PLOT_PROTOBUF_H_
-#define WEBRTC_RTC_TOOLS_EVENT_LOG_VISUALIZER_PLOT_PROTOBUF_H_
-
-#include "webrtc/rtc_base/ignore_wundef.h"
-RTC_PUSH_IGNORING_WUNDEF()
-#include "webrtc/rtc_tools/event_log_visualizer/chart.pb.h"
-RTC_POP_IGNORING_WUNDEF()
-#include "webrtc/rtc_tools/event_log_visualizer/plot_base.h"
-
-namespace webrtc {
-namespace plotting {
-
-class ProtobufPlot final : public Plot {
- public:
-  ProtobufPlot();
-  ~ProtobufPlot() override;
-  void Draw() override;
-  void ExportProtobuf(webrtc::analytics::Chart* chart);
-};
-
-class ProtobufPlotCollection final : public PlotCollection {
- public:
-  ProtobufPlotCollection();
-  ~ProtobufPlotCollection() override;
-  void Draw() override;
-  Plot* AppendNewPlot() override;
-  void ExportProtobuf(webrtc::analytics::ChartCollection* collection);
-};
-
-}  // namespace plotting
-}  // namespace webrtc
-
-#endif  // WEBRTC_RTC_TOOLS_EVENT_LOG_VISUALIZER_PLOT_PROTOBUF_H_
diff --git a/rtc_tools/event_log_visualizer/plot_python.cc b/rtc_tools/event_log_visualizer/plot_python.cc
deleted file mode 100644
index dae2855..0000000
--- a/rtc_tools/event_log_visualizer/plot_python.cc
+++ /dev/null
@@ -1,172 +0,0 @@
-/*
- *  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/rtc_tools/event_log_visualizer/plot_python.h"
-
-#include <stdio.h>
-
-#include <memory>
-
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-namespace plotting {
-
-PythonPlot::PythonPlot() {}
-
-PythonPlot::~PythonPlot() {}
-
-void PythonPlot::Draw() {
-  // Write python commands to stdout. Intended program usage is
-  // ./event_log_visualizer event_log160330.dump | python
-
-  if (!series_list_.empty()) {
-    printf("color_count = %zu\n", series_list_.size());
-    printf(
-        "hls_colors = [(i*1.0/color_count, 0.25+i*0.5/color_count, 0.8) for i "
-        "in range(color_count)]\n");
-    printf("rgb_colors = [colorsys.hls_to_rgb(*hls) for hls in hls_colors]\n");
-
-    for (size_t i = 0; i < series_list_.size(); i++) {
-      printf("\n# === Series: %s ===\n", series_list_[i].label.c_str());
-      // List x coordinates
-      printf("x%zu = [", i);
-      if (series_list_[i].points.size() > 0)
-        printf("%G", series_list_[i].points[0].x);
-      for (size_t j = 1; j < series_list_[i].points.size(); j++)
-        printf(", %G", series_list_[i].points[j].x);
-      printf("]\n");
-
-      // List y coordinates
-      printf("y%zu = [", i);
-      if (series_list_[i].points.size() > 0)
-        printf("%G", series_list_[i].points[0].y);
-      for (size_t j = 1; j < series_list_[i].points.size(); j++)
-        printf(", %G", series_list_[i].points[j].y);
-      printf("]\n");
-
-      if (series_list_[i].style == BAR_GRAPH) {
-        // There is a plt.bar function that draws bar plots,
-        // but it is *way* too slow to be useful.
-        printf(
-            "plt.vlines(x%zu, map(lambda t: min(t,0), y%zu), map(lambda t: "
-            "max(t,0), y%zu), color=rgb_colors[%zu], "
-            "label=\'%s\')\n",
-            i, i, i, i, series_list_[i].label.c_str());
-      } else if (series_list_[i].style == LINE_GRAPH) {
-        printf("plt.plot(x%zu, y%zu, color=rgb_colors[%zu], label=\'%s\')\n", i,
-               i, i, series_list_[i].label.c_str());
-      } else if (series_list_[i].style == LINE_DOT_GRAPH) {
-        printf(
-            "plt.plot(x%zu, y%zu, color=rgb_colors[%zu], label=\'%s\', "
-            "marker='.')\n",
-            i, i, i, series_list_[i].label.c_str());
-      } else if (series_list_[i].style == LINE_STEP_GRAPH) {
-        // Draw lines from (x[0],y[0]) to (x[1],y[0]) to (x[1],y[1]) and so on
-        // to illustrate the "steps". This can be expressed by duplicating all
-        // elements except the first in x and the last in y.
-        printf("x%zu = [v for dup in x%zu for v in [dup, dup]]\n", i, i);
-        printf("y%zu = [v for dup in y%zu for v in [dup, dup]]\n", i, i);
-        printf(
-            "plt.plot(x%zu[1:], y%zu[:-1], color=rgb_colors[%zu], "
-            "path_effects=[pe.Stroke(linewidth=2, foreground='black'), "
-            "pe.Normal()], "
-            "label=\'%s\')\n",
-            i, i, i, series_list_[i].label.c_str());
-      } else if (series_list_[i].style == DOT_GRAPH) {
-        printf(
-            "plt.plot(x%zu, y%zu, color=rgb_colors[%zu], label=\'%s\', "
-            "marker='o', ls=' ')\n",
-            i, i, i, series_list_[i].label.c_str());
-      } else {
-        printf("raise Exception(\"Unknown graph type\")\n");
-      }
-    }
-
-    // IntervalSeries
-    printf("interval_colors = ['#ff8e82','#5092fc','#c4ffc4']\n");
-    RTC_CHECK_LE(interval_list_.size(), 3);
-    // To get the intervals to show up in the legend we have to created patches
-    // for them.
-    printf("legend_patches = []\n");
-    for (size_t i = 0; i < interval_list_.size(); i++) {
-      // List intervals
-      printf("\n# === IntervalSeries: %s ===\n",
-             interval_list_[i].label.c_str());
-      printf("ival%zu = [", i);
-      if (interval_list_[i].intervals.size() > 0) {
-        printf("(%G, %G)", interval_list_[i].intervals[0].begin,
-               interval_list_[i].intervals[0].end);
-      }
-      for (size_t j = 1; j < interval_list_[i].intervals.size(); j++) {
-        printf(", (%G, %G)", interval_list_[i].intervals[j].begin,
-               interval_list_[i].intervals[j].end);
-      }
-      printf("]\n");
-
-      printf("for i in range(0, %zu):\n", interval_list_[i].intervals.size());
-      if (interval_list_[i].orientation == IntervalSeries::kVertical) {
-        printf(
-            "  plt.axhspan(ival%zu[i][0], ival%zu[i][1], "
-            "facecolor=interval_colors[%zu], "
-            "alpha=0.3)\n",
-            i, i, i);
-      } else {
-        printf(
-            "  plt.axvspan(ival%zu[i][0], ival%zu[i][1], "
-            "facecolor=interval_colors[%zu], "
-            "alpha=0.3)\n",
-            i, i, i);
-      }
-      printf(
-          "legend_patches.append(mpatches.Patch(ec=\'black\', "
-          "fc=interval_colors[%zu], label='%s'))\n",
-          i, interval_list_[i].label.c_str());
-    }
-  }
-
-  printf("plt.xlim(%f, %f)\n", xaxis_min_, xaxis_max_);
-  printf("plt.ylim(%f, %f)\n", yaxis_min_, yaxis_max_);
-  printf("plt.xlabel(\'%s\')\n", xaxis_label_.c_str());
-  printf("plt.ylabel(\'%s\')\n", yaxis_label_.c_str());
-  printf("plt.title(\'%s\')\n", title_.c_str());
-  if (!series_list_.empty() || !interval_list_.empty()) {
-    printf("handles, labels = plt.gca().get_legend_handles_labels()\n");
-    printf("for lp in legend_patches:\n");
-    printf("   handles.append(lp)\n");
-    printf("   labels.append(lp.get_label())\n");
-    printf("plt.legend(handles, labels, loc=\'best\', fontsize=\'small\')\n");
-  }
-}
-
-PythonPlotCollection::PythonPlotCollection() {}
-
-PythonPlotCollection::~PythonPlotCollection() {}
-
-void PythonPlotCollection::Draw() {
-  printf("import matplotlib.pyplot as plt\n");
-  printf("import matplotlib.patches as mpatches\n");
-  printf("import matplotlib.patheffects as pe\n");
-  printf("import colorsys\n");
-  for (size_t i = 0; i < plots_.size(); i++) {
-    printf("plt.figure(%zu)\n", i);
-    plots_[i]->Draw();
-  }
-  printf("plt.show()\n");
-}
-
-Plot* PythonPlotCollection::AppendNewPlot() {
-  Plot* plot = new PythonPlot();
-  plots_.push_back(std::unique_ptr<Plot>(plot));
-  return plot;
-}
-
-}  // namespace plotting
-}  // namespace webrtc
diff --git a/rtc_tools/event_log_visualizer/plot_python.h b/rtc_tools/event_log_visualizer/plot_python.h
deleted file mode 100644
index cad2f45..0000000
--- a/rtc_tools/event_log_visualizer/plot_python.h
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- *  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_RTC_TOOLS_EVENT_LOG_VISUALIZER_PLOT_PYTHON_H_
-#define WEBRTC_RTC_TOOLS_EVENT_LOG_VISUALIZER_PLOT_PYTHON_H_
-
-#include "webrtc/rtc_tools/event_log_visualizer/plot_base.h"
-
-namespace webrtc {
-namespace plotting {
-
-class PythonPlot final : public Plot {
- public:
-  PythonPlot();
-  ~PythonPlot() override;
-  void Draw() override;
-};
-
-class PythonPlotCollection final : public PlotCollection {
- public:
-  PythonPlotCollection();
-  ~PythonPlotCollection() override;
-  void Draw() override;
-  Plot* AppendNewPlot() override;
-};
-
-}  // namespace plotting
-}  // namespace webrtc
-
-#endif  // WEBRTC_RTC_TOOLS_EVENT_LOG_VISUALIZER_PLOT_PYTHON_H_
diff --git a/rtc_tools/force_mic_volume_max/force_mic_volume_max.cc b/rtc_tools/force_mic_volume_max/force_mic_volume_max.cc
deleted file mode 100644
index 0a2347d..0000000
--- a/rtc_tools/force_mic_volume_max/force_mic_volume_max.cc
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- *  Copyright (c) 2013 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.
- */
-
-// This utility will portably force the volume of the default microphone to max.
-
-#include <stdio.h>
-
-#include "webrtc/modules/audio_device/include/audio_device.h"
-
-using webrtc::AudioDeviceModule;
-
-#if defined(_WIN32)
-#define DEFAULT_INPUT_DEVICE (AudioDeviceModule::kDefaultCommunicationDevice)
-#else
-#define DEFAULT_INPUT_DEVICE (0)
-#endif
-
-int main(int /*argc*/, char** /*argv*/) {
-  // Create and initialize the ADM.
-  rtc::scoped_refptr<AudioDeviceModule> adm(
-      AudioDeviceModule::Create(1, AudioDeviceModule::kPlatformDefaultAudio));
-  if (!adm.get()) {
-    fprintf(stderr, "Failed to create Audio Device Module.\n");
-    return 1;
-  }
-  if (adm->Init() != 0) {
-    fprintf(stderr, "Failed to initialize Audio Device Module.\n");
-    return 1;
-  }
-  if (adm->SetRecordingDevice(DEFAULT_INPUT_DEVICE) != 0) {
-    fprintf(stderr, "Failed to set the default input device.\n");
-    return 1;
-  }
-  if (adm->InitMicrophone() != 0) {
-    fprintf(stderr, "Failed to to initialize the microphone.\n");
-    return 1;
-  }
-
-  // Set mic volume to max.
-  uint32_t max_vol = 0;
-  if (adm->MaxMicrophoneVolume(&max_vol) != 0) {
-    fprintf(stderr, "Failed to get max volume.\n");
-    return 1;
-  }
-  if (adm->SetMicrophoneVolume(max_vol) != 0) {
-    fprintf(stderr, "Failed to set mic volume.\n");
-    return 1;
-  }
-
-  return 0;
-}
diff --git a/rtc_tools/frame_analyzer/frame_analyzer.cc b/rtc_tools/frame_analyzer/frame_analyzer.cc
deleted file mode 100644
index 4af3389..0000000
--- a/rtc_tools/frame_analyzer/frame_analyzer.cc
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- *  Copyright (c) 2012 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 <stdio.h>
-#include <stdlib.h>
-
-#include <map>
-#include <string>
-#include <vector>
-
-#include "webrtc/rtc_tools/frame_analyzer/video_quality_analysis.h"
-#include "webrtc/rtc_tools/simple_command_line_parser.h"
-
-/*
- * A command line tool running PSNR and SSIM on a reference video and a test
- * video. The test video is a record of the reference video which can start at
- * an arbitrary point. It is possible that there will be repeated frames or
- * skipped frames as well. In order to have a way to compare corresponding
- * frames from the two videos, two stats files should be provided. One for the
- * reference video and one for the test video. The stats file
- * is a text file assumed to be in the format:
- * frame_xxxx yyyy where xxxx is the frame number in and yyyy is the
- * corresponding barcode. The video files should be 1420 YUV videos.
- * The tool prints the result to standard output in the Chromium perf format:
- * RESULT <metric>:<label>= <values>
- *
- * The max value for PSNR is 48.0 (between equal frames), as for SSIM it is 1.0.
- *
- * Usage:
- * frame_analyzer --label=<test_label> --reference_file=<name_of_file>
- * --test_file_ref=<name_of_file> --stats_file_test=<name_of_file>
- * --stats_file=<name_of_file> --width=<frame_width>
- * --height=<frame_height>
- */
-int main(int argc, char** argv) {
-  std::string program_name = argv[0];
-  std::string usage =
-      "Compares the output video with the initially sent video."
-      "\nExample usage:\n" +
-      program_name +
-      " --reference_file=ref.yuv --test_file=test.yuv --width=320 "
-      "--height=240\n"
-      "Command line flags:\n"
-      "  - width(int): The width of the reference and test files. Default: -1\n"
-      "  - height(int): The height of the reference and test files. "
-      " Default: -1\n"
-      "  - label(string): The label to use for the perf output."
-      " Default: MY_TEST\n"
-      "  - stats_file_ref(string): The path to the stats file that will be"
-      " produced for the reference video file."
-      " Default: stats_ref.txt\n"
-      "  - stats_file_test(string): The path to the stats file that will be"
-      " produced for the test video file."
-      " Default: stats_test.txt\n"
-      "  - reference_file(string): The reference YUV file to compare against."
-      " Default: ref.yuv\n"
-      "  - test_file(string): The test YUV file to run the analysis for."
-      " Default: test_file.yuv\n";
-
-  webrtc::test::CommandLineParser parser;
-
-  // Init the parser and set the usage message
-  parser.Init(argc, argv);
-  parser.SetUsageMessage(usage);
-
-  parser.SetFlag("width", "-1");
-  parser.SetFlag("height", "-1");
-  parser.SetFlag("label", "MY_TEST");
-  parser.SetFlag("stats_file_ref", "stats_ref.txt");
-  parser.SetFlag("stats_file_test", "stats_test.txt");
-  parser.SetFlag("reference_file", "ref.yuv");
-  parser.SetFlag("test_file", "test.yuv");
-  parser.SetFlag("help", "false");
-
-  parser.ProcessFlags();
-  if (parser.GetFlag("help") == "true") {
-    parser.PrintUsageMessage();
-    exit(EXIT_SUCCESS);
-  }
-  parser.PrintEnteredFlags();
-
-  int width = strtol((parser.GetFlag("width")).c_str(), NULL, 10);
-  int height = strtol((parser.GetFlag("height")).c_str(), NULL, 10);
-
-  if (width <= 0 || height <= 0) {
-    fprintf(stderr, "Error: width or height cannot be <= 0!\n");
-    return -1;
-  }
-
-  webrtc::test::ResultsContainer results;
-
-  webrtc::test::RunAnalysis(parser.GetFlag("reference_file").c_str(),
-                            parser.GetFlag("test_file").c_str(),
-                            parser.GetFlag("stats_file_ref").c_str(),
-                            parser.GetFlag("stats_file_test").c_str(), width,
-                            height, &results);
-
-  std::string label = parser.GetFlag("label");
-  webrtc::test::PrintAnalysisResults(label, &results);
-  webrtc::test::PrintMaxRepeatedAndSkippedFrames(
-      label, parser.GetFlag("stats_file_ref"),
-      parser.GetFlag("stats_file_test"));
-}
diff --git a/rtc_tools/frame_analyzer/reference_less_video_analysis.cc b/rtc_tools/frame_analyzer/reference_less_video_analysis.cc
deleted file mode 100644
index 6170da0..0000000
--- a/rtc_tools/frame_analyzer/reference_less_video_analysis.cc
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- *  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 <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "webrtc/rtc_tools/frame_analyzer/reference_less_video_analysis_lib.h"
-#include "webrtc/rtc_tools/simple_command_line_parser.h"
-
-int main(int argc, char** argv) {
-  // This captures the freezing metrics for reference less video analysis.
-  std::string program_name = argv[0];
-  std::string usage = "Outputs the freezing score by comparing current frame "
-      "with the previous frame.\nExample usage:\n" + program_name +
-      " --video_file=video_file.y4m\n"
-      "Command line flags:\n"
-      "  - video_file(string): Path of the video "
-      "file to be analyzed. Only y4m file format is supported.\n";
-
-  webrtc::test::CommandLineParser parser;
-
-  // Init the parser and set the usage message.
-  parser.Init(argc, argv);
-  parser.SetUsageMessage(usage);
-
-  parser.SetFlag("video_file", "");
-  parser.ProcessFlags();
-  if (parser.GetFlag("video_file").empty()) {
-    parser.PrintUsageMessage();
-    exit(EXIT_SUCCESS);
-  }
-  std::string video_file = parser.GetFlag("video_file");
-
-  return run_analysis(video_file);
-}
diff --git a/rtc_tools/frame_analyzer/reference_less_video_analysis_lib.cc b/rtc_tools/frame_analyzer/reference_less_video_analysis_lib.cc
deleted file mode 100644
index 0f5c012..0000000
--- a/rtc_tools/frame_analyzer/reference_less_video_analysis_lib.cc
+++ /dev/null
@@ -1,202 +0,0 @@
-/*
- *  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 <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <iostream>
-#include <numeric>
-#include <vector>
-
-#include "webrtc/rtc_tools/frame_analyzer/reference_less_video_analysis_lib.h"
-#include "webrtc/rtc_tools/frame_analyzer/video_quality_analysis.h"
-
-#define STATS_LINE_LENGTH 28
-#define PSNR_FREEZE_THRESHOLD 47
-#define SSIM_FREEZE_THRESHOLD .999
-
-#if defined(_WIN32) || defined(_WIN64)
-#define strtok_r strtok_s
-#endif
-
-void get_height_width_fps(int *height, int *width, int *fps,
-                          const std::string& video_file) {
-  // File header looks like :
-  //  YUV4MPEG2 W1280 H720 F25:1 Ip A0:0 C420mpeg2 XYSCSS=420MPEG2.
-  char frame_header[STATS_LINE_LENGTH];
-  FILE* input_file = fopen(video_file.c_str(), "rb");
-
-  size_t bytes_read = fread(frame_header, 1, STATS_LINE_LENGTH - 1, input_file);
-
-  frame_header[bytes_read] = '\0';
-  std::string file_header_stats[5];
-  int no_of_stats = 0;
-  char *save_ptr;
-  char *token = strtok_r(frame_header, " ", &save_ptr);
-
-  while (token != NULL) {
-    file_header_stats[no_of_stats++] = token;
-    token = strtok_r(NULL, " ", &save_ptr);
-  }
-
-  *width = std::stoi(file_header_stats[1].erase(0, 1));
-  *height = std::stoi(file_header_stats[2].erase(0, 1));
-  *fps = std::stoi(file_header_stats[3].erase(0, 1));
-
-  printf("Height: %d Width: %d fps:%d \n", *height, *width, *fps);
-  fclose(input_file);
-}
-
-bool frozen_frame(std::vector<double> psnr_per_frame,
-                  std::vector<double> ssim_per_frame, size_t frame) {
-  if (psnr_per_frame[frame] >= PSNR_FREEZE_THRESHOLD ||
-      ssim_per_frame[frame] >= SSIM_FREEZE_THRESHOLD)
-    return true;
-  return false;
-}
-
-std::vector<int> find_frame_clusters(const std::vector<double>& psnr_per_frame,
-                                   const std::vector<double>& ssim_per_frame) {
-  std::vector<int> identical_frame_clusters;
-  int num_frozen = 0;
-  size_t total_no_of_frames = psnr_per_frame.size();
-
-  for (size_t each_frame = 0; each_frame < total_no_of_frames; each_frame++) {
-      if (frozen_frame(psnr_per_frame, ssim_per_frame, each_frame)) {
-        num_frozen++;
-        } else if (num_frozen > 0) {
-          // Not frozen anymore.
-          identical_frame_clusters.push_back(num_frozen);
-          num_frozen = 0;
-        }
-  }
-  return identical_frame_clusters;
-}
-
-void print_freezing_metrics(const std::vector<double>& psnr_per_frame,
-                            const std::vector<double>& ssim_per_frame) {
-  /*
-   * Prints the different metrics mainly:
-   * 1) Identical frame number, PSNR and SSIM values.
-   * 2) Length of continuous frozen frames.
-   * 3) Max length of continuous freezed frames.
-   * 4) No of unique frames found.
-   * 5) Total different identical frames found.
-   *
-   * Sample output:
-   *  Printing metrics for file: /src/webrtc/rtc_tools/test_3.y4m
-      =============================
-      Total number of frames received: 74
-      Total identical frames: 5
-      Number of unique frames: 69
-      Printing Identical Frames:
-        Frame Number: 29 PSNR: 48.000000 SSIM: 0.999618
-        Frame Number: 30 PSNR: 48.000000 SSIM: 0.999898
-        Frame Number: 60 PSNR: 48.000000 SSIM: 0.999564
-        Frame Number: 64 PSNR: 48.000000 SSIM: 0.999651
-        Frame Number: 69 PSNR: 48.000000 SSIM: 0.999684
-      Print identical frame which appears in clusters :
-        2 1 1 1
-   *
-   */
-  size_t total_no_of_frames = psnr_per_frame.size();
-  std::vector<int> identical_frame_clusters = find_frame_clusters(
-        psnr_per_frame, ssim_per_frame);
-  int total_identical_frames = std::accumulate(
-      identical_frame_clusters.begin(), identical_frame_clusters.end(), 0);
-  size_t unique_frames = total_no_of_frames - total_identical_frames;
-
-  printf("Total number of frames received: %zu\n", total_no_of_frames);
-  printf("Total identical frames: %d\n", total_identical_frames);
-  printf("Number of unique frames: %zu\n", unique_frames);
-
-  printf("Printing Identical Frames: \n");
-  for (size_t frame = 0; frame < total_no_of_frames; frame++) {
-    if (frozen_frame(psnr_per_frame, ssim_per_frame, frame)) {
-      printf("  Frame Number: %zu PSNR: %f SSIM: %f \n", frame,
-             psnr_per_frame[frame], ssim_per_frame[frame]);
-    }
-  }
-
-  printf("Print identical frame which appears in clusters : \n");
-  for (int cluster = 0;
-      cluster < static_cast<int>(identical_frame_clusters.size()); cluster++)
-    printf("%d ", identical_frame_clusters[cluster]);
-  printf("\n");
-}
-
-void compute_metrics(const std::string& video_file_name,
-                     std::vector<double>* psnr_per_frame,
-                     std::vector<double>* ssim_per_frame) {
-  int height = 0, width = 0, fps = 0;
-  get_height_width_fps(&height, &width, &fps, video_file_name);
-
-  int no_of_frames = 0;
-  int size = webrtc::test::GetI420FrameSize(width, height);
-
-  // Allocate buffers for test and reference frames.
-  uint8_t* current_frame = new uint8_t[size];
-  uint8_t* next_frame = new uint8_t[size];
-
-  while (true) {
-    if (!(webrtc::test::ExtractFrameFromY4mFile (video_file_name.c_str(),
-                                                 width, height,
-                                                 no_of_frames,
-                                                 current_frame))) {
-      break;
-    }
-
-    if (!(webrtc::test::ExtractFrameFromY4mFile (video_file_name.c_str(),
-                                                 width, height,
-                                                 no_of_frames + 1,
-                                                 next_frame))) {
-      break;
-    }
-
-    double result_psnr = webrtc::test::CalculateMetrics(webrtc::test::kPSNR,
-                                                        current_frame,
-                                                        next_frame,
-                                                        width, height);
-    double result_ssim = webrtc::test::CalculateMetrics(webrtc::test::kSSIM,
-                                                        current_frame,
-                                                        next_frame,
-                                                        width, height);
-
-    psnr_per_frame->push_back(result_psnr);
-    ssim_per_frame->push_back(result_ssim);
-    no_of_frames++;
-  }
-  // Cleanup.
-  delete[] current_frame;
-  delete[] next_frame;
-}
-
-bool check_file_extension(const std::string& video_file_name) {
-  if (video_file_name.substr(video_file_name.length()-3, 3) != "y4m") {
-    printf("Only y4m video file format is supported. Given: %s\n",
-           video_file_name.c_str());
-    return false;
-  }
-  return true;
-}
-
-int run_analysis(const std::string& video_file) {
-  std::vector<double> psnr_per_frame;
-  std::vector<double> ssim_per_frame;
-  if (check_file_extension(video_file)) {
-    compute_metrics(video_file, &psnr_per_frame, &ssim_per_frame);
-  } else {
-    return -1;
-  }
-  printf("=============================\n");
-  printf("Printing metrics for file: %s\n", video_file.c_str());
-  printf("=============================\n");
-  print_freezing_metrics(psnr_per_frame, ssim_per_frame);
-  return 0;
-}
diff --git a/rtc_tools/frame_analyzer/reference_less_video_analysis_lib.h b/rtc_tools/frame_analyzer/reference_less_video_analysis_lib.h
deleted file mode 100644
index b50aa09..0000000
--- a/rtc_tools/frame_analyzer/reference_less_video_analysis_lib.h
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- *  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_RTC_TOOLS_FRAME_ANALYZER_REFERENCE_LESS_VIDEO_ANALYSIS_LIB_H_
-#define WEBRTC_RTC_TOOLS_FRAME_ANALYZER_REFERENCE_LESS_VIDEO_ANALYSIS_LIB_H_
-
-#include <string>
-#include <vector>
-
-// Parse the file header to extract height, width and fps
-// for a given video file.
-void get_height_width_fps(int *height, int *width, int *fps,
-                          const std::string& video_file);
-
-// Returns true if the frame is frozen based on psnr and ssim freezing
-// threshold values.
-bool frozen_frame(std::vector<double> psnr_per_frame,
-                     std::vector<double> ssim_per_frame, size_t frame);
-
-// Returns the vector of identical cluster of frames that are frozen
-// and appears continuously.
-std::vector<int> find_frame_clusters(const std::vector<double>& psnr_per_frame,
-                                     const std::vector<double>& ssim_per_frame);
-
-// Prints various freezing metrics like identical frames,
-// total unique frames etc.
-void print_freezing_metrics(const std::vector<double>& psnr_per_frame,
-                            const std::vector<double>& ssim_per_frame);
-
-// Compute the metrics like freezing score based on PSNR and SSIM values for a
-// given video file.
-void compute_metrics(const std::string& video_file_name,
-                     std::vector<double>* psnr_per_frame,
-                     std::vector<double>* ssim_per_frame);
-
-// Checks the file extension and return true if it is y4m.
-bool check_file_extension(const std::string& video_file_name);
-
-// Compute freezing score metrics and prints the metrics
-// for a list of video files.
-int run_analysis(const std::string& video_file);
-
-#endif  // WEBRTC_RTC_TOOLS_FRAME_ANALYZER_REFERENCE_LESS_VIDEO_ANALYSIS_LIB_H_
diff --git a/rtc_tools/frame_analyzer/reference_less_video_analysis_unittest.cc b/rtc_tools/frame_analyzer/reference_less_video_analysis_unittest.cc
deleted file mode 100644
index 8d9e257..0000000
--- a/rtc_tools/frame_analyzer/reference_less_video_analysis_unittest.cc
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- *  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 <string.h>
-#include <stdio.h>
-#include <cstring>
-#include <iostream>
-#include <vector>
-
-#include "webrtc/rtc_tools/frame_analyzer/reference_less_video_analysis_lib.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/testsupport/fileutils.h"
-
-class ReferenceLessVideoAnalysisTest : public ::testing::Test {
- public:
-  void SetUp() override {
-    video_file =
-           webrtc::test::ResourcePath("reference_less_video_test_file", "y4m");
-  }
-  std::string video_file;
-  std::vector<double> psnr_per_frame;
-  std::vector<double> ssim_per_frame;
-};
-
-TEST_F(ReferenceLessVideoAnalysisTest, MatchComputedMetrics) {
-  compute_metrics(video_file, &psnr_per_frame, &ssim_per_frame);
-  EXPECT_EQ(74, (int)psnr_per_frame.size());
-
-  ASSERT_NEAR(27.2f, psnr_per_frame[1], 0.1f);
-  ASSERT_NEAR(24.9f, psnr_per_frame[5], 0.1f);
-
-  ASSERT_NEAR(0.9f, ssim_per_frame[1], 0.1f);
-  ASSERT_NEAR(0.9f, ssim_per_frame[5], 0.1f);
-}
-
-TEST_F(ReferenceLessVideoAnalysisTest, MatchHeightWidthFps) {
-  int height = 0, width = 0, fps = 0;
-  get_height_width_fps(&height, &width, &fps, video_file.c_str());
-  EXPECT_EQ(height, 720);
-  EXPECT_EQ(width, 1280);
-  EXPECT_EQ(fps, 25);
-}
-
-TEST_F(ReferenceLessVideoAnalysisTest, MatchIdenticalFrameClusters) {
-  compute_metrics(video_file, &psnr_per_frame, &ssim_per_frame);
-  std::vector<int> identical_frame_clusters =
-      find_frame_clusters(psnr_per_frame, ssim_per_frame);
-  EXPECT_EQ(5, (int)identical_frame_clusters.size());
-  EXPECT_EQ(1, identical_frame_clusters[0]);
-  EXPECT_EQ(1, identical_frame_clusters[4]);
-}
-
-TEST_F(ReferenceLessVideoAnalysisTest, CheckFileExtension) {
-  EXPECT_TRUE(check_file_extension(video_file));
-  std::string txt_file =
-      webrtc::test::ResourcePath("video_quality_analysis_frame", "txt");
-  EXPECT_FALSE(check_file_extension(txt_file));
-}
-
-
-
-
diff --git a/rtc_tools/frame_analyzer/video_quality_analysis.cc b/rtc_tools/frame_analyzer/video_quality_analysis.cc
deleted file mode 100644
index 2d8376c..0000000
--- a/rtc_tools/frame_analyzer/video_quality_analysis.cc
+++ /dev/null
@@ -1,510 +0,0 @@
-/*
- *  Copyright (c) 2012 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/rtc_tools/frame_analyzer/video_quality_analysis.h"
-
-#include <assert.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <algorithm>
-#include <string>
-#include <map>
-#include <utility>
-
-#define STATS_LINE_LENGTH 32
-#define Y4M_FILE_HEADER_MAX_SIZE 200
-#define Y4M_FRAME_DELIMITER "FRAME"
-#define Y4M_FRAME_HEADER_SIZE 6
-
-namespace webrtc {
-namespace test {
-
-ResultsContainer::ResultsContainer() {}
-ResultsContainer::~ResultsContainer() {}
-
-int GetI420FrameSize(int width, int height) {
-  int half_width = (width + 1) >> 1;
-  int half_height = (height + 1) >> 1;
-
-  int y_plane = width * height;  // I420 Y plane.
-  int u_plane = half_width * half_height;  // I420 U plane.
-  int v_plane = half_width * half_height;  // I420 V plane.
-
-  return y_plane + u_plane + v_plane;
-}
-
-int ExtractFrameSequenceNumber(std::string line) {
-  size_t space_position = line.find(' ');
-  if (space_position == std::string::npos) {
-    return -1;
-  }
-  std::string frame = line.substr(0, space_position);
-
-  size_t underscore_position = frame.find('_');
-  if (underscore_position == std::string::npos) {
-    return -1;
-  }
-  std::string frame_number = frame.substr(underscore_position + 1);
-
-  return strtol(frame_number.c_str(), NULL, 10);
-}
-
-int ExtractDecodedFrameNumber(std::string line) {
-  size_t space_position = line.find(' ');
-  if (space_position == std::string::npos) {
-    return -1;
-  }
-  std::string decoded_number = line.substr(space_position + 1);
-
-  return strtol(decoded_number.c_str(), NULL, 10);
-}
-
-bool IsThereBarcodeError(std::string line) {
-  size_t barcode_error_position = line.find("Barcode error");
-  if (barcode_error_position != std::string::npos) {
-    return true;
-  }
-  return false;
-}
-
-bool GetNextStatsLine(FILE* stats_file, char* line) {
-  int chars = 0;
-  char buf = 0;
-
-  while (buf != '\n') {
-    size_t chars_read = fread(&buf, 1, 1, stats_file);
-    if (chars_read != 1 || feof(stats_file)) {
-      return false;
-    }
-    line[chars] = buf;
-    ++chars;
-  }
-  line[chars-1] = '\0';  // Strip the trailing \n and put end of string.
-  return true;
-}
-
-bool ExtractFrameFromYuvFile(const char* i420_file_name,
-                             int width,
-                             int height,
-                             int frame_number,
-                             uint8_t* result_frame) {
-  int frame_size = GetI420FrameSize(width, height);
-  int offset = frame_number * frame_size;  // Calculate offset for the frame.
-  bool errors = false;
-
-  FILE* input_file = fopen(i420_file_name, "rb");
-  if (input_file == NULL) {
-    fprintf(stderr, "Couldn't open input file for reading: %s\n",
-            i420_file_name);
-    return false;
-  }
-
-  // Change stream pointer to new offset.
-  fseek(input_file, offset, SEEK_SET);
-
-  size_t bytes_read = fread(result_frame, 1, frame_size, input_file);
-  if (bytes_read != static_cast<size_t>(frame_size) &&
-      ferror(input_file)) {
-    fprintf(stdout, "Error while reading frame no %d from file %s\n",
-            frame_number, i420_file_name);
-    errors = true;
-  }
-  fclose(input_file);
-  return !errors;
-}
-
-bool ExtractFrameFromY4mFile(const char* y4m_file_name,
-                             int width,
-                             int height,
-                             int frame_number,
-                             uint8_t* result_frame) {
-  int frame_size = GetI420FrameSize(width, height);
-  int inital_offset = frame_number * (frame_size + Y4M_FRAME_HEADER_SIZE);
-  int frame_offset = 0;
-
-  FILE* input_file = fopen(y4m_file_name, "rb");
-  if (input_file == NULL) {
-    fprintf(stderr, "Couldn't open input file for reading: %s\n",
-            y4m_file_name);
-    return false;
-  }
-
-  // YUV4MPEG2, a.k.a. Y4M File format has a file header and a frame header. The
-  // file header has the aspect: "YUV4MPEG2 C420 W640 H360 Ip F30:1 A1:1".
-  char frame_header[Y4M_FILE_HEADER_MAX_SIZE];
-  size_t bytes_read =
-      fread(frame_header, 1, Y4M_FILE_HEADER_MAX_SIZE - 1, input_file);
-  if (bytes_read != static_cast<size_t>(frame_size) && ferror(input_file)) {
-    fprintf(stdout, "Error while reading frame from file %s\n",
-        y4m_file_name);
-    fclose(input_file);
-    return false;
-  }
-  frame_header[bytes_read] = '\0';
-  std::string header_contents(frame_header);
-  std::size_t found = header_contents.find(Y4M_FRAME_DELIMITER);
-  if (found == std::string::npos) {
-    fprintf(stdout, "Corrupted Y4M header, could not find \"FRAME\" in %s\n",
-        header_contents.c_str());
-    fclose(input_file);
-    return false;
-  }
-  frame_offset = static_cast<int>(found);
-
-  // Change stream pointer to new offset, skipping the frame header as well.
-  fseek(input_file, inital_offset + frame_offset + Y4M_FRAME_HEADER_SIZE,
-        SEEK_SET);
-
-  bytes_read = fread(result_frame, 1, frame_size, input_file);
-  if (feof(input_file)) {
-    fclose(input_file);
-    return false;
-  }
-  if (bytes_read != static_cast<size_t>(frame_size) && ferror(input_file)) {
-    fprintf(stdout, "Error while reading frame no %d from file %s\n",
-            frame_number, y4m_file_name);
-    fclose(input_file);
-    return false;
-  }
-
-  fclose(input_file);
-  return true;
-}
-
-double CalculateMetrics(VideoAnalysisMetricsType video_metrics_type,
-                        const uint8_t* ref_frame,
-                        const uint8_t* test_frame,
-                        int width,
-                        int height) {
-  if (!ref_frame || !test_frame)
-    return -1;
-  else if (height < 0 || width < 0)
-    return -1;
-  int half_width = (width + 1) >> 1;
-  int half_height = (height + 1) >> 1;
-  const uint8_t* src_y_a = ref_frame;
-  const uint8_t* src_u_a = src_y_a + width * height;
-  const uint8_t* src_v_a = src_u_a + half_width * half_height;
-  const uint8_t* src_y_b = test_frame;
-  const uint8_t* src_u_b = src_y_b + width * height;
-  const uint8_t* src_v_b = src_u_b + half_width * half_height;
-
-  int stride_y = width;
-  int stride_uv = half_width;
-
-  double result = 0.0;
-
-  switch (video_metrics_type) {
-    case kPSNR:
-      // In the following: stride is determined by width.
-      result = libyuv::I420Psnr(src_y_a, width, src_u_a, half_width,
-                                src_v_a, half_width, src_y_b, width,
-                                src_u_b, half_width, src_v_b, half_width,
-                                width, height);
-      // LibYuv sets the max psnr value to 128, we restrict it to 48.
-      // In case of 0 mse in one frame, 128 can skew the results significantly.
-      result = (result > 48.0) ? 48.0 : result;
-      break;
-    case kSSIM:
-      result = libyuv::I420Ssim(src_y_a, stride_y, src_u_a, stride_uv,
-                                src_v_a, stride_uv, src_y_b, stride_y,
-                                src_u_b, stride_uv, src_v_b, stride_uv,
-                                width, height);
-      break;
-    default:
-      assert(false);
-  }
-
-  return result;
-}
-
-void RunAnalysis(const char* reference_file_name,
-                 const char* test_file_name,
-                 const char* stats_file_reference_name,
-                 const char* stats_file_test_name,
-                 int width,
-                 int height,
-                 ResultsContainer* results) {
-  // Check if the reference_file_name ends with "y4m".
-  bool y4m_mode = false;
-  if (std::string(reference_file_name).find("y4m") != std::string::npos) {
-    y4m_mode = true;
-  }
-
-  int size = GetI420FrameSize(width, height);
-  FILE* stats_file_ref = fopen(stats_file_reference_name, "r");
-  FILE* stats_file_test = fopen(stats_file_test_name, "r");
-
-  // String buffer for the lines in the stats file.
-  char line[STATS_LINE_LENGTH];
-
-  // Allocate buffers for test and reference frames.
-  uint8_t* test_frame = new uint8_t[size];
-  uint8_t* reference_frame = new uint8_t[size];
-  int previous_frame_number = -1;
-
-  // Maps barcode id to the frame id for the reference video.
-  // In case two frames have same id, then we only save the first one.
-  std::map<int, int> ref_barcode_to_frame;
-  // While there are entries in the stats file.
-  while (GetNextStatsLine(stats_file_ref, line)) {
-    int extracted_ref_frame = ExtractFrameSequenceNumber(line);
-    int decoded_frame_number = ExtractDecodedFrameNumber(line);
-
-    // Insert will only add if it is not in map already.
-    ref_barcode_to_frame.insert(
-        std::make_pair(decoded_frame_number, extracted_ref_frame));
-  }
-
-  while (GetNextStatsLine(stats_file_test, line)) {
-    int extracted_test_frame = ExtractFrameSequenceNumber(line);
-    int decoded_frame_number = ExtractDecodedFrameNumber(line);
-    auto it = ref_barcode_to_frame.find(decoded_frame_number);
-    if (it == ref_barcode_to_frame.end()) {
-      // Not found in the reference video.
-      // TODO(mandermo) print
-      continue;
-    }
-    int extracted_ref_frame = it->second;
-
-    // If there was problem decoding the barcode in this frame or the frame has
-    // been duplicated, continue.
-    if (IsThereBarcodeError(line) ||
-        decoded_frame_number == previous_frame_number) {
-      continue;
-    }
-
-    assert(extracted_test_frame != -1);
-    assert(decoded_frame_number != -1);
-
-    ExtractFrameFromYuvFile(test_file_name, width, height, extracted_test_frame,
-                            test_frame);
-    if (y4m_mode) {
-      ExtractFrameFromY4mFile(reference_file_name, width, height,
-                              extracted_ref_frame, reference_frame);
-    } else {
-      ExtractFrameFromYuvFile(reference_file_name, width, height,
-                              extracted_ref_frame, reference_frame);
-    }
-
-    // Calculate the PSNR and SSIM.
-    double result_psnr =
-        CalculateMetrics(kPSNR, reference_frame, test_frame, width, height);
-    double result_ssim =
-        CalculateMetrics(kSSIM, reference_frame, test_frame, width, height);
-
-    previous_frame_number = decoded_frame_number;
-
-    // Fill in the result struct.
-    AnalysisResult result;
-    result.frame_number = decoded_frame_number;
-    result.psnr_value = result_psnr;
-    result.ssim_value = result_ssim;
-
-    results->frames.push_back(result);
-  }
-
-  // Cleanup.
-  fclose(stats_file_ref);
-  fclose(stats_file_test);
-  delete[] test_frame;
-  delete[] reference_frame;
-}
-
-void PrintMaxRepeatedAndSkippedFrames(const std::string& label,
-                                      const std::string& stats_file_ref_name,
-                                      const std::string& stats_file_test_name) {
-  PrintMaxRepeatedAndSkippedFrames(stdout, label, stats_file_ref_name,
-                                   stats_file_test_name);
-}
-
-std::vector<std::pair<int, int> > CalculateFrameClusters(
-    FILE* file,
-    int* num_decode_errors) {
-  if (num_decode_errors) {
-    *num_decode_errors = 0;
-  }
-  std::vector<std::pair<int, int> > frame_cnt;
-  char line[STATS_LINE_LENGTH];
-  while (GetNextStatsLine(file, line)) {
-    int decoded_frame_number;
-    if (IsThereBarcodeError(line)) {
-      decoded_frame_number = DECODE_ERROR;
-      if (num_decode_errors) {
-        ++*num_decode_errors;
-      }
-    } else {
-      decoded_frame_number = ExtractDecodedFrameNumber(line);
-    }
-    if (frame_cnt.size() >= 2 && decoded_frame_number != DECODE_ERROR &&
-        frame_cnt.back().first == DECODE_ERROR &&
-        frame_cnt[frame_cnt.size() - 2].first == decoded_frame_number) {
-      // Handle when there is a decoding error inside a cluster of frames.
-      frame_cnt[frame_cnt.size() - 2].second += frame_cnt.back().second + 1;
-      frame_cnt.pop_back();
-    } else if (frame_cnt.empty() ||
-               frame_cnt.back().first != decoded_frame_number) {
-      frame_cnt.push_back(std::make_pair(decoded_frame_number, 1));
-    } else {
-      ++frame_cnt.back().second;
-    }
-  }
-  return frame_cnt;
-}
-
-void PrintMaxRepeatedAndSkippedFrames(FILE* output,
-                                      const std::string& label,
-                                      const std::string& stats_file_ref_name,
-                                      const std::string& stats_file_test_name) {
-  FILE* stats_file_ref = fopen(stats_file_ref_name.c_str(), "r");
-  FILE* stats_file_test = fopen(stats_file_test_name.c_str(), "r");
-  if (stats_file_ref == NULL) {
-    fprintf(stderr, "Couldn't open reference stats file for reading: %s\n",
-            stats_file_ref_name.c_str());
-    return;
-  }
-  if (stats_file_test == NULL) {
-    fprintf(stderr, "Couldn't open test stats file for reading: %s\n",
-            stats_file_test_name.c_str());
-    fclose(stats_file_ref);
-    return;
-  }
-
-  int max_repeated_frames = 1;
-  int max_skipped_frames = 0;
-
-  int decode_errors_ref = 0;
-  int decode_errors_test = 0;
-
-  std::vector<std::pair<int, int> > frame_cnt_ref =
-      CalculateFrameClusters(stats_file_ref, &decode_errors_ref);
-
-  std::vector<std::pair<int, int> > frame_cnt_test =
-      CalculateFrameClusters(stats_file_test, &decode_errors_test);
-
-  fclose(stats_file_ref);
-  fclose(stats_file_test);
-
-  auto it_ref = frame_cnt_ref.begin();
-  auto it_test = frame_cnt_test.begin();
-  auto end_ref = frame_cnt_ref.end();
-  auto end_test = frame_cnt_test.end();
-
-  if (it_test == end_test || it_ref == end_ref) {
-    fprintf(stderr, "Either test or ref file is empty, nothing to print\n");
-    return;
-  }
-
-  while (it_test != end_test && it_test->first == DECODE_ERROR) {
-    ++it_test;
-  }
-
-  if (it_test == end_test) {
-    fprintf(stderr, "Test video only has barcode decode errors\n");
-    return;
-  }
-
-  // Find the first frame in the reference video that match the first frame in
-  // the test video.
-  while (it_ref != end_ref &&
-         (it_ref->first == DECODE_ERROR || it_ref->first != it_test->first)) {
-    ++it_ref;
-  }
-  if (it_ref == end_ref) {
-    fprintf(stderr,
-            "The barcode in the test video's first frame is not in the "
-            "reference video.\n");
-    return;
-  }
-
-  int total_skipped_frames = 0;
-  for (;;) {
-    max_repeated_frames =
-        std::max(max_repeated_frames, it_test->second - it_ref->second + 1);
-
-    bool passed_error = false;
-
-    ++it_test;
-    while (it_test != end_test && it_test->first == DECODE_ERROR) {
-      ++it_test;
-      passed_error = true;
-    }
-    if (it_test == end_test) {
-      break;
-    }
-
-    int skipped_frames = 0;
-    ++it_ref;
-    for (; it_ref != end_ref; ++it_ref) {
-      if (it_ref->first != DECODE_ERROR && it_ref->first >= it_test->first) {
-        break;
-      }
-      ++skipped_frames;
-    }
-    if (passed_error) {
-      // If we pass an error in the test video, then we are conservative
-      // and will not calculate skipped frames for that part.
-      skipped_frames = 0;
-    }
-    if (it_ref != end_ref && it_ref->first == it_test->first) {
-      total_skipped_frames += skipped_frames;
-      if (skipped_frames > max_skipped_frames) {
-        max_skipped_frames = skipped_frames;
-      }
-      continue;
-    }
-    fprintf(output,
-            "Found barcode %d in test video, which is not in reference video\n",
-            it_test->first);
-    break;
-  }
-
-  fprintf(output, "RESULT Max_repeated: %s= %d\n", label.c_str(),
-          max_repeated_frames);
-  fprintf(output, "RESULT Max_skipped: %s= %d\n", label.c_str(),
-          max_skipped_frames);
-  fprintf(output, "RESULT Total_skipped: %s= %d\n", label.c_str(),
-          total_skipped_frames);
-  fprintf(output, "RESULT Decode_errors_reference: %s= %d\n", label.c_str(),
-          decode_errors_ref);
-  fprintf(output, "RESULT Decode_errors_test: %s= %d\n", label.c_str(),
-          decode_errors_test);
-}
-
-void PrintAnalysisResults(const std::string& label, ResultsContainer* results) {
-  PrintAnalysisResults(stdout, label, results);
-}
-
-void PrintAnalysisResults(FILE* output, const std::string& label,
-                          ResultsContainer* results) {
-  std::vector<AnalysisResult>::iterator iter;
-
-  fprintf(output, "RESULT Unique_frames_count: %s= %u score\n", label.c_str(),
-          static_cast<unsigned int>(results->frames.size()));
-
-  if (results->frames.size() > 0u) {
-    fprintf(output, "RESULT PSNR: %s= [", label.c_str());
-    for (iter = results->frames.begin(); iter != results->frames.end() - 1;
-         ++iter) {
-      fprintf(output, "%f,", iter->psnr_value);
-    }
-    fprintf(output, "%f] dB\n", iter->psnr_value);
-
-    fprintf(output, "RESULT SSIM: %s= [", label.c_str());
-    for (iter = results->frames.begin(); iter != results->frames.end() - 1;
-         ++iter) {
-      fprintf(output, "%f,", iter->ssim_value);
-    }
-    fprintf(output, "%f] score\n", iter->ssim_value);
-  }
-}
-
-}  // namespace test
-}  // namespace webrtc
diff --git a/rtc_tools/frame_analyzer/video_quality_analysis.h b/rtc_tools/frame_analyzer/video_quality_analysis.h
deleted file mode 100644
index 8d03fae..0000000
--- a/rtc_tools/frame_analyzer/video_quality_analysis.h
+++ /dev/null
@@ -1,150 +0,0 @@
-/*
- *  Copyright (c) 2012 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_RTC_TOOLS_FRAME_ANALYZER_VIDEO_QUALITY_ANALYSIS_H_
-#define WEBRTC_RTC_TOOLS_FRAME_ANALYZER_VIDEO_QUALITY_ANALYSIS_H_
-
-#include <string>
-#include <vector>
-#include <utility>
-
-#include "libyuv/compare.h"  // NOLINT
-#include "libyuv/convert.h"  // NOLINT
-
-namespace webrtc {
-namespace test {
-
-struct AnalysisResult {
-  AnalysisResult() {}
-  AnalysisResult(int frame_number, double psnr_value, double ssim_value)
-      : frame_number(frame_number),
-        psnr_value(psnr_value),
-        ssim_value(ssim_value) {}
-  int frame_number;
-  double psnr_value;
-  double ssim_value;
-};
-
-struct ResultsContainer {
-  ResultsContainer();
-  ~ResultsContainer();
-
-  std::vector<AnalysisResult> frames;
-};
-
-enum VideoAnalysisMetricsType {kPSNR, kSSIM};
-
-// A function to run the PSNR and SSIM analysis on the test file. The test file
-// comprises the frames that were captured during the quality measurement test.
-// There may be missing or duplicate frames. Also the frames start at a random
-// position in the original video. We should provide a statistics file along
-// with the test video. The stats file contains the connection between the
-// actual frames in the test file and their bar code number. There is one file
-// for the reference video and one for the test video. The stats file should
-// be in the form 'frame_xxxx yyyy', where xxxx is the consecutive
-// number of the frame in the test video, and yyyy is the barcode number.
-// The stats file could be produced by
-// tools/barcode_tools/barcode_decoder.py. This script decodes the barcodes
-// integrated in every video and generates the stats file. If three was some
-// problem with the decoding there would be 'Barcode error' instead of yyyy.
-// The stat files are used to compare the right frames with each other and
-// to calculate statistics.
-void RunAnalysis(const char* reference_file_name,
-                 const char* test_file_name,
-                 const char* stats_file_reference_name,
-                 const char* stats_file_test_name,
-                 int width,
-                 int height,
-                 ResultsContainer* results);
-
-// Compute PSNR or SSIM for an I420 frame (all planes). When we are calculating
-// PSNR values, the max return value (in the case where the test and reference
-// frames are exactly the same) will be 48. In the case of SSIM the max return
-// value will be 1.
-double CalculateMetrics(VideoAnalysisMetricsType video_metrics_type,
-                        const uint8_t* ref_frame,
-                        const uint8_t* test_frame,
-                        int width,
-                        int height);
-
-// Prints the result from the analysis in Chromium performance
-// numbers compatible format to stdout. If the results object contains no frames
-// no output will be written.
-void PrintAnalysisResults(const std::string& label, ResultsContainer* results);
-
-// Similar to the above, but will print to the specified file handle.
-void PrintAnalysisResults(FILE* output, const std::string& label,
-                          ResultsContainer* results);
-
-// The barcode number that means that the barcode could not be decoded.
-const int DECODE_ERROR = -1;
-
-// Clusters the frames in the file. First in the pair is the frame number and
-// second is the number of frames in that cluster. So if first frame in video
-// has number 100 and it is repeated 3 after each other, then the first entry
-// in the returned vector has first set to 100 and second set to 3.
-// Decode errors between two frames with same barcode, then it interprets
-// the frame with the decode error as having the same id as the two frames
-// around it. Eg. [400, DECODE_ERROR, DECODE_ERROR, 400] is becomes an entry
-// in return vector with first==400 and second==4. In other cases with decode
-// errors like [400, DECODE_ERROR, 401] becomes three entries, each with
-// second==1 and the middle has first==DECODE_ERROR.
-std::vector<std::pair<int, int> > CalculateFrameClusters(
-    FILE* file,
-    int* num_decode_errors);
-
-// Calculates max repeated and skipped frames and prints them to stdout in a
-// format that is compatible with Chromium performance numbers.
-void PrintMaxRepeatedAndSkippedFrames(const std::string& label,
-                                      const std::string& stats_file_ref_name,
-                                      const std::string& stats_file_test_name);
-
-// Similar to the above, but will print to the specified file handle.
-void PrintMaxRepeatedAndSkippedFrames(FILE* output,
-                                      const std::string& label,
-                                      const std::string& stats_file_ref_name,
-                                      const std::string& stats_file_test_name);
-
-// Gets the next line from an open stats file.
-bool GetNextStatsLine(FILE* stats_file, char* line);
-
-// Calculates the size of a I420 frame if given the width and height.
-int GetI420FrameSize(int width, int height);
-
-// Extract the sequence of the frame in the video. I.e. if line is
-// frame_0023 0284, we will get 23.
-int ExtractFrameSequenceNumber(std::string line);
-
-// Checks if there is 'Barcode error' for the given line.
-bool IsThereBarcodeError(std::string line);
-
-// Extract the frame number in the reference video. I.e. if line is
-// frame_0023 0284, we will get 284.
-int ExtractDecodedFrameNumber(std::string line);
-
-// Extracts an I420 frame at position frame_number from the raw YUV file.
-bool ExtractFrameFromYuvFile(const char* i420_file_name,
-                             int width,
-                             int height,
-                             int frame_number,
-                             uint8_t* result_frame);
-
-// Extracts an I420 frame at position frame_number from the Y4M file. The first
-// frame has corresponded |frame_number| 0.
-bool ExtractFrameFromY4mFile(const char* i420_file_name,
-                             int width,
-                             int height,
-                             int frame_number,
-                             uint8_t* result_frame);
-
-}  // namespace test
-}  // namespace webrtc
-
-#endif  // WEBRTC_RTC_TOOLS_FRAME_ANALYZER_VIDEO_QUALITY_ANALYSIS_H_
diff --git a/rtc_tools/frame_analyzer/video_quality_analysis_unittest.cc b/rtc_tools/frame_analyzer/video_quality_analysis_unittest.cc
deleted file mode 100644
index bbaf571..0000000
--- a/rtc_tools/frame_analyzer/video_quality_analysis_unittest.cc
+++ /dev/null
@@ -1,340 +0,0 @@
-/*
- *  Copyright (c) 2013 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.
- */
-
-// This test doesn't actually verify the output since it's just printed
-// to stdout by void functions, but it's still useful as it executes the code.
-
-#include <stdio.h>
-#include <fstream>
-#include <string>
-
-#include "webrtc/rtc_tools/frame_analyzer/video_quality_analysis.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/testsupport/fileutils.h"
-
-namespace webrtc {
-namespace test {
-
-// Setup a log file to write the output to instead of stdout because we don't
-// want those numbers to be picked up as perf numbers.
-class VideoQualityAnalysisTest : public ::testing::Test {
- protected:
-  void SetUp() {
-    std::string log_filename = TempFilename(webrtc::test::OutputPath(),
-                                            "VideoQualityAnalysisTest.log");
-    logfile_ = fopen(log_filename.c_str(), "w");
-    ASSERT_TRUE(logfile_ != NULL);
-
-    stats_filename_ref_ = TempFilename(OutputPath(), "stats-1.txt");
-    stats_filename_ = TempFilename(OutputPath(), "stats-2.txt");
-  }
-  void TearDown() { ASSERT_EQ(0, fclose(logfile_)); }
-  FILE* logfile_;
-  std::string stats_filename_ref_;
-  std::string stats_filename_;
-};
-
-TEST_F(VideoQualityAnalysisTest, MatchExtractedY4mFrame) {
-  std::string video_file =
-         webrtc::test::ResourcePath("reference_less_video_test_file", "y4m");
-
-  std::string extracted_frame_from_video_file =
-         webrtc::test::ResourcePath("video_quality_analysis_frame", "txt");
-
-  int frame_height = 720, frame_width = 1280;
-  int frame_number = 2;
-  int size = GetI420FrameSize(frame_width, frame_height);
-  uint8_t* result_frame = new uint8_t[size];
-  uint8_t* expected_frame = new uint8_t[size];
-
-  FILE* input_file = fopen(extracted_frame_from_video_file.c_str(), "rb");
-  fread(expected_frame, 1, size, input_file);
-
-  ExtractFrameFromY4mFile(video_file.c_str(),
-                          frame_width, frame_height,
-                          frame_number, result_frame);
-
-  EXPECT_EQ(*expected_frame, *result_frame);
-  fclose(input_file);
-  delete[] result_frame;
-  delete[] expected_frame;
-}
-
-TEST_F(VideoQualityAnalysisTest, PrintAnalysisResultsEmpty) {
-  ResultsContainer result;
-  PrintAnalysisResults(logfile_, "Empty", &result);
-}
-
-TEST_F(VideoQualityAnalysisTest, PrintAnalysisResultsOneFrame) {
-  ResultsContainer result;
-  result.frames.push_back(AnalysisResult(0, 35.0, 0.9));
-  PrintAnalysisResults(logfile_, "OneFrame", &result);
-}
-
-TEST_F(VideoQualityAnalysisTest, PrintAnalysisResultsThreeFrames) {
-  ResultsContainer result;
-  result.frames.push_back(AnalysisResult(0, 35.0, 0.9));
-  result.frames.push_back(AnalysisResult(1, 34.0, 0.8));
-  result.frames.push_back(AnalysisResult(2, 33.0, 0.7));
-  PrintAnalysisResults(logfile_, "ThreeFrames", &result);
-}
-
-TEST_F(VideoQualityAnalysisTest, PrintMaxRepeatedAndSkippedFramesInvalidFile) {
-  remove(stats_filename_.c_str());
-  PrintMaxRepeatedAndSkippedFrames(logfile_, "NonExistingStatsFile",
-                                   stats_filename_ref_, stats_filename_);
-}
-
-TEST_F(VideoQualityAnalysisTest,
-       PrintMaxRepeatedAndSkippedFramesEmptyStatsFile) {
-  std::ofstream stats_file;
-  stats_file.open(stats_filename_ref_.c_str());
-  stats_file.close();
-  stats_file.open(stats_filename_.c_str());
-  stats_file.close();
-  PrintMaxRepeatedAndSkippedFrames(logfile_, "EmptyStatsFile",
-                                   stats_filename_ref_, stats_filename_);
-}
-
-TEST_F(VideoQualityAnalysisTest, PrintMaxRepeatedAndSkippedFramesNormalFile) {
-  std::ofstream stats_file;
-
-  stats_file.open(stats_filename_ref_.c_str());
-  stats_file << "frame_0001 0100\n";
-  stats_file << "frame_0002 0101\n";
-  stats_file << "frame_0003 0102\n";
-  stats_file << "frame_0004 0103\n";
-  stats_file << "frame_0005 0106\n";
-  stats_file << "frame_0006 0107\n";
-  stats_file << "frame_0007 0108\n";
-  stats_file.close();
-
-  stats_file.open(stats_filename_.c_str());
-  stats_file << "frame_0001 0100\n";
-  stats_file << "frame_0002 0101\n";
-  stats_file << "frame_0003 0101\n";
-  stats_file << "frame_0004 0106\n";
-  stats_file.close();
-
-  PrintMaxRepeatedAndSkippedFrames(logfile_, "NormalStatsFile",
-                                   stats_filename_ref_, stats_filename_);
-}
-
-namespace {
-void VerifyLogOutput(const std::string& log_filename,
-                     const std::vector<std::string>& expected_out) {
-  std::ifstream logf(log_filename);
-  std::string line;
-
-  std::size_t i;
-  for (i = 0; i < expected_out.size() && getline(logf, line); ++i) {
-    ASSERT_EQ(expected_out.at(i), line);
-  }
-  ASSERT_TRUE(i == expected_out.size()) << "Not enough input data";
-}
-}  // unnamed namespace
-
-TEST_F(VideoQualityAnalysisTest,
-       PrintMaxRepeatedAndSkippedFramesSkippedFrames) {
-  std::ofstream stats_file;
-
-  std::string log_filename =
-      TempFilename(webrtc::test::OutputPath(), "log.log");
-  FILE* logfile = fopen(log_filename.c_str(), "w");
-  ASSERT_TRUE(logfile != NULL);
-  stats_file.open(stats_filename_ref_.c_str());
-  stats_file << "frame_0001 0100\n";
-  stats_file << "frame_0002 0101\n";
-  stats_file << "frame_0002 0101\n";
-  stats_file << "frame_0003 0103\n";
-  stats_file << "frame_0004 0103\n";
-  stats_file << "frame_0005 0106\n";
-  stats_file << "frame_0006 0106\n";
-  stats_file << "frame_0007 0108\n";
-  stats_file << "frame_0008 0110\n";
-  stats_file << "frame_0009 0112\n";
-  stats_file.close();
-
-  stats_file.open(stats_filename_.c_str());
-  stats_file << "frame_0001 0101\n";
-  stats_file << "frame_0002 0101\n";
-  stats_file << "frame_0003 0101\n";
-  stats_file << "frame_0004 0108\n";
-  stats_file << "frame_0005 0108\n";
-  stats_file << "frame_0006 0112\n";
-  stats_file.close();
-
-  PrintMaxRepeatedAndSkippedFrames(logfile, "NormalStatsFile",
-                                   stats_filename_ref_, stats_filename_);
-  ASSERT_EQ(0, fclose(logfile));
-
-  std::vector<std::string> expected_out = {
-      "RESULT Max_repeated: NormalStatsFile= 2",
-      "RESULT Max_skipped: NormalStatsFile= 2",
-      "RESULT Total_skipped: NormalStatsFile= 3",
-      "RESULT Decode_errors_reference: NormalStatsFile= 0",
-      "RESULT Decode_errors_test: NormalStatsFile= 0"};
-  VerifyLogOutput(log_filename, expected_out);
-}
-
-TEST_F(VideoQualityAnalysisTest,
-       PrintMaxRepeatedAndSkippedFramesDecodeErrorInTest) {
-  std::ofstream stats_file;
-
-  std::string log_filename =
-      TempFilename(webrtc::test::OutputPath(), "log.log");
-  FILE* logfile = fopen(log_filename.c_str(), "w");
-  ASSERT_TRUE(logfile != NULL);
-  stats_file.open(stats_filename_ref_.c_str());
-  stats_file << "frame_0001 0100\n";
-  stats_file << "frame_0002 0100\n";
-  stats_file << "frame_0002 0101\n";
-  stats_file << "frame_0003 0103\n";
-  stats_file << "frame_0004 0103\n";
-  stats_file << "frame_0005 0106\n";
-  stats_file << "frame_0006 0107\n";
-  stats_file << "frame_0007 0107\n";
-  stats_file << "frame_0008 0110\n";
-  stats_file << "frame_0009 0112\n";
-  stats_file.close();
-
-  stats_file.open(stats_filename_.c_str());
-  stats_file << "frame_0001 0101\n";
-  stats_file << "frame_0002 Barcode error\n";
-  stats_file << "frame_0003 Barcode error\n";
-  stats_file << "frame_0004 Barcode error\n";
-  stats_file << "frame_0005 0107\n";
-  stats_file << "frame_0006 0110\n";
-  stats_file.close();
-
-  PrintMaxRepeatedAndSkippedFrames(logfile, "NormalStatsFile",
-                                   stats_filename_ref_, stats_filename_);
-  ASSERT_EQ(0, fclose(logfile));
-
-  std::vector<std::string> expected_out = {
-      "RESULT Max_repeated: NormalStatsFile= 1",
-      "RESULT Max_skipped: NormalStatsFile= 0",
-      "RESULT Total_skipped: NormalStatsFile= 0",
-      "RESULT Decode_errors_reference: NormalStatsFile= 0",
-      "RESULT Decode_errors_test: NormalStatsFile= 3"};
-  VerifyLogOutput(log_filename, expected_out);
-}
-
-TEST_F(VideoQualityAnalysisTest, CalculateFrameClustersOneValue) {
-  std::ofstream stats_file;
-
-  stats_file.open(stats_filename_.c_str());
-  stats_file << "frame_0001 0101\n";
-  stats_file.close();
-
-  FILE* stats_filef = fopen(stats_filename_.c_str(), "r");
-  ASSERT_TRUE(stats_filef != NULL);
-
-  auto clusters = CalculateFrameClusters(stats_filef, nullptr);
-  ASSERT_EQ(0, fclose(stats_filef));
-  decltype(clusters) expected = {std::make_pair(101, 1)};
-  ASSERT_EQ(expected, clusters);
-}
-
-TEST_F(VideoQualityAnalysisTest, CalculateFrameClustersOneOneTwo) {
-  std::ofstream stats_file;
-
-  stats_file.open(stats_filename_.c_str());
-  stats_file << "frame_0001 0101\n";
-  stats_file << "frame_0002 0101\n";
-  stats_file << "frame_0003 0102\n";
-  stats_file.close();
-
-  FILE* stats_filef = fopen(stats_filename_.c_str(), "r");
-  ASSERT_TRUE(stats_filef != NULL);
-
-  auto clusters = CalculateFrameClusters(stats_filef, nullptr);
-  ASSERT_EQ(0, fclose(stats_filef));
-  decltype(clusters) expected = {std::make_pair(101, 2),
-                                 std::make_pair(102, 1)};
-  ASSERT_EQ(expected, clusters);
-}
-
-TEST_F(VideoQualityAnalysisTest, CalculateFrameClustersOneOneErrErrThree) {
-  std::ofstream stats_file;
-
-  stats_file.open(stats_filename_.c_str());
-  stats_file << "frame_0001 0101\n";
-  stats_file << "frame_0002 0101\n";
-  stats_file << "frame_0003 Barcode error\n";
-  stats_file << "frame_0004 Barcode error\n";
-  stats_file << "frame_0005 0103\n";
-  stats_file.close();
-
-  FILE* stats_filef = fopen(stats_filename_.c_str(), "r");
-  ASSERT_TRUE(stats_filef != NULL);
-
-  auto clusters = CalculateFrameClusters(stats_filef, nullptr);
-  ASSERT_EQ(0, fclose(stats_filef));
-  decltype(clusters) expected = {std::make_pair(101, 2),
-                                 std::make_pair(DECODE_ERROR, 2),
-                                 std::make_pair(103, 1)};
-  ASSERT_EQ(expected, clusters);
-}
-
-TEST_F(VideoQualityAnalysisTest, CalculateFrameClustersErrErr) {
-  std::ofstream stats_file;
-
-  stats_file.open(stats_filename_.c_str());
-  stats_file << "frame_0001 Barcode error\n";
-  stats_file << "frame_0002 Barcode error\n";
-  stats_file.close();
-
-  FILE* stats_filef = fopen(stats_filename_.c_str(), "r");
-  ASSERT_TRUE(stats_filef != NULL);
-
-  auto clusters = CalculateFrameClusters(stats_filef, nullptr);
-  ASSERT_EQ(0, fclose(stats_filef));
-  decltype(clusters) expected = {std::make_pair(DECODE_ERROR, 2)};
-  ASSERT_EQ(expected, clusters);
-}
-
-TEST_F(VideoQualityAnalysisTest, CalculateFrameClustersOneOneErrErrOneOne) {
-  std::ofstream stats_file;
-
-  stats_file.open(stats_filename_.c_str());
-  stats_file << "frame_0001 0101\n";
-  stats_file << "frame_0002 0101\n";
-  stats_file << "frame_0003 Barcode error\n";
-  stats_file << "frame_0004 Barcode error\n";
-  stats_file << "frame_0005 0101\n";
-  stats_file << "frame_0006 0101\n";
-  stats_file.close();
-
-  FILE* stats_filef = fopen(stats_filename_.c_str(), "r");
-  ASSERT_TRUE(stats_filef != NULL);
-
-  auto clusters = CalculateFrameClusters(stats_filef, nullptr);
-  ASSERT_EQ(0, fclose(stats_filef));
-  decltype(clusters) expected = {std::make_pair(101, 6)};
-  ASSERT_EQ(expected, clusters);
-}
-
-TEST_F(VideoQualityAnalysisTest, CalculateFrameClustersEmpty) {
-  std::ofstream stats_file;
-
-  stats_file.open(stats_filename_.c_str());
-  stats_file.close();
-
-  FILE* stats_filef = fopen(stats_filename_.c_str(), "r");
-  ASSERT_TRUE(stats_filef != NULL);
-
-  auto clusters = CalculateFrameClusters(stats_filef, nullptr);
-  ASSERT_EQ(0, fclose(stats_filef));
-  decltype(clusters) expected;
-  ASSERT_EQ(expected, clusters);
-}
-}  // namespace test
-}  // namespace webrtc
diff --git a/rtc_tools/frame_editing/frame_editing.cc b/rtc_tools/frame_editing/frame_editing.cc
deleted file mode 100644
index 9030674..0000000
--- a/rtc_tools/frame_editing/frame_editing.cc
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- *  Copyright (c) 2012 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/rtc_tools/frame_editing/frame_editing_lib.h"
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "webrtc/rtc_tools/simple_command_line_parser.h"
-
-// A command-line tool to edit a YUV-video (I420 sub-sampled).
-int main(int argc, char** argv) {
-  std::string program_name = argv[0];
-  std::string usage = "Deletes a series of frames in a yuv file."
-    " Only I420 is supported!\n"
-    "Example usage:\n" + program_name +
-    " --in_path=input.yuv --width=320 --height=240 --f=60 --interval=1 --l=120"
-    " --out_path=edited_clip.yuv\n"
-    "Command line flags:\n"
-    "--in_path(string): Path and filename to the input file\n"
-    "--width(int): Width in pixels of the frames in the input file."
-    " Default: -1\n"
-    "--height(int): Height in pixels of the frames in the input file."
-    " Default: -1\n"
-    "--f(int): First frame to process. Default: -1\n"
-    "--l(int): Last frame to process.  Default: -1\n"
-    "Frame numbering starts at 1. The set of frames to be processed includes "
-    "the frame with the number <f> and <l>.\n"
-    "--interval(int): Interval specifies with what ratio the number of frames "
-    "should be increased or decreased with.\n"
-    "If you set <interval> to a positive number, frames between <f> and <l> "
-    "will be inserted <interval> times."
-    " If you set <interval> to a negative number then the amount of frames "
-    "between <f> and <l> will be decreased with a ratio of abs(interval)."
-    " Set interval=-1 if every frame between <f> and <l> should be "
-    "deleted. Set interval=-2 if every second frame should be deleted, and so "
-    "on. Frame numbering between <f> and <l> starts with 1 and frames with"
-    " number n where (n - 1)  % interval == 0 will be kept.\n"
-    "Example 1:\n"
-    "If one clip has 10 frames (1 to 10) and you specify <f>=4, <l>=7 and "
-    "interval=2, then you will get a clip that contains frame "
-    "1, 2, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 9 and 10.\n"
-    "Example 2:\n"
-    "If you specify f=4, l=7 and interval=-1, then you will get a clip that"
-    " contains frame 1, 2, 3, 8, 9 and 10.\n"
-    "Example 3:\n"
-    "If one clip has 10 frames (1 to 10), and you specify f=1, l=10 and "
-    " interval=-4, then you will get a clip that contains frame "
-    "1, 5 and 9.\n"
-    "No interpolation is done when up-sampling."
-    " Default: -1\n"
-    "--out_path(string): The output file to which frames are written."
-    " Default: output.yuv\n";
-
-  webrtc::test::CommandLineParser parser;
-
-  // Init the parser and set the usage message
-  parser.Init(argc, argv);
-  parser.SetUsageMessage(usage);
-  parser.SetFlag("in_path", "-1");
-  parser.SetFlag("width", "-1");
-  parser.SetFlag("height", "-1");
-  parser.SetFlag("f", "-1");
-  parser.SetFlag("interval", "-1");
-  parser.SetFlag("l", "-1");
-  parser.SetFlag("out_path", "edited_output.yuv");
-  parser.SetFlag("help", "false");
-
-  parser.ProcessFlags();
-  if (parser.GetFlag("help") == "true") {
-    parser.PrintUsageMessage();
-    exit(EXIT_SUCCESS);
-  }
-  parser.PrintEnteredFlags();
-
-  const char* in_path = parser.GetFlag("in_path").c_str();
-  int width = strtol((parser.GetFlag("width")).c_str(), NULL, 10);
-  int height = strtol((parser.GetFlag("height")).c_str(), NULL, 10);
-  int first_frame_to_cut = strtol((parser.GetFlag("f")).c_str(), NULL, 10);
-  int interval = strtol((parser.GetFlag("interval")).c_str(), NULL, 10);
-  int last_frame_to_cut = strtol((parser.GetFlag("l")).c_str(), NULL, 10);
-
-  const char* out_path = parser.GetFlag("out_path").c_str();
-
-  if (!strcmp(in_path, "-1")) {
-    fprintf(stderr, "You must specify a file to edit\n");
-    return -1;
-  }
-
-  if (first_frame_to_cut <= 0 || last_frame_to_cut <= 0) {
-    fprintf(stderr, "Error: You must specify which frames to cut!\n");
-    return -2;
-  }
-
-  if (width <= 0 || height <= 0) {
-    fprintf(stderr, "Error: width or height cannot be <= 0!\n");
-    return -3;
-  }
-  return webrtc::EditFrames(in_path, width, height, first_frame_to_cut,
-                            interval, last_frame_to_cut, out_path);
-}
diff --git a/rtc_tools/frame_editing/frame_editing_lib.cc b/rtc_tools/frame_editing/frame_editing_lib.cc
deleted file mode 100644
index a20d8bb..0000000
--- a/rtc_tools/frame_editing/frame_editing_lib.cc
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- *  Copyright (c) 2012 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 <stdio.h>
-#include <stdlib.h>
-
-#include <memory>
-#include <string>
-
-#include "webrtc/common_video/libyuv/include/webrtc_libyuv.h"
-#include "webrtc/rtc_tools/frame_editing/frame_editing_lib.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-int EditFrames(const std::string& in_path, int width, int height,
-               int first_frame_to_process, int interval,
-               int last_frame_to_process, const std::string& out_path) {
-  if (last_frame_to_process < first_frame_to_process) {
-    fprintf(stderr, "The set of frames to cut is empty! (l < f)\n");
-    return -10;
-  }
-
-  FILE* in_fid = fopen(in_path.c_str() , "rb");
-  if (!in_fid) {
-    fprintf(stderr, "Could not read input file: %s.\n", in_path.c_str());
-    return -11;
-  }
-
-  // Frame size of I420.
-  size_t frame_length = CalcBufferSize(VideoType::kI420, width, height);
-
-  std::unique_ptr<uint8_t[]> temp_buffer(new uint8_t[frame_length]);
-
-  FILE* out_fid = fopen(out_path.c_str(), "wb");
-
-  if (!out_fid) {
-    fprintf(stderr, "Could not open output file: %s.\n", out_path.c_str());
-    fclose(in_fid);
-    return -12;
-  }
-
-  int num_frames_read = 0;
-  int num_frames_read_between = 0;
-  size_t num_bytes_read;
-
-  while ((num_bytes_read = fread(temp_buffer.get(), 1, frame_length, in_fid))
-      == frame_length) {
-    num_frames_read++;
-    if ((num_frames_read < first_frame_to_process) ||
-        (last_frame_to_process < num_frames_read)) {
-      fwrite(temp_buffer.get(), 1, frame_length, out_fid);
-    } else {
-      num_frames_read_between++;
-      if (interval <= 0) {
-        if (interval == -1) {
-          // Remove all frames.
-        } else {
-          if (((num_frames_read_between - 1) % interval) == 0) {
-            // Keep only every |interval| frame.
-            fwrite(temp_buffer.get(), 1, frame_length, out_fid);
-          }
-        }
-      } else if (interval > 0) {
-        for (int i = 1; i <= interval; ++i) {
-          fwrite(temp_buffer.get(), 1, frame_length, out_fid);
-        }
-      }
-    }
-  }
-  if (num_bytes_read > 0 && num_bytes_read < frame_length) {
-    printf("Frame to small! Last frame truncated.\n");
-  }
-  fclose(in_fid);
-  fclose(out_fid);
-
-  printf("Done editing!\n");
-  return 0;
-}
-}  // namespace webrtc
diff --git a/rtc_tools/frame_editing/frame_editing_lib.h b/rtc_tools/frame_editing/frame_editing_lib.h
deleted file mode 100644
index 26435a3..0000000
--- a/rtc_tools/frame_editing/frame_editing_lib.h
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- *  Copyright (c) 2012 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_RTC_TOOLS_FRAME_EDITING_FRAME_EDITING_LIB_H_
-#define WEBRTC_RTC_TOOLS_FRAME_EDITING_FRAME_EDITING_LIB_H_
-
-#include <string>
-
-namespace webrtc {
-
-// Frame numbering starts at 1. The set of frames to be processed includes the
-// frame with the number: first_frame_to_process and last_frame_to_process.
-// Interval specifies with what interval frames should be cut or kept.
-// Example 1:
-// If one clip has 10 frames (1 to 10), and you specify
-// first_frame_to_process = 4, last_frame_to_process = 7 and interval = -1,
-// then you will get a clip that contains frame 1, 2, 3, 8, 9 and 10.
-// Example 2:
-// I you specify first_frame_to_process = 1, last_frame_to_process = 10 and
-// interval = -4, then you will get a clip that contains frame 1, 5, 9.
-// Example 3:
-// If you specify first_frame_to_process = 4, last_frame_to_process = 7 and
-// interval = 2, then you will get a clip that contains frame
-// 1, 2, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 9 and 10.
-// No interpolation is done when up-sampling.
-
-int EditFrames(const std::string& in_path, int width, int height,
-                int first_frame_to_process, int interval,
-                int last_frame_to_process, const std::string& out_path);
-}  // namespace webrtc
-
-#endif  // WEBRTC_RTC_TOOLS_FRAME_EDITING_FRAME_EDITING_LIB_H_
diff --git a/rtc_tools/frame_editing/frame_editing_unittest.cc b/rtc_tools/frame_editing/frame_editing_unittest.cc
deleted file mode 100644
index 12d2d6c..0000000
--- a/rtc_tools/frame_editing/frame_editing_unittest.cc
+++ /dev/null
@@ -1,216 +0,0 @@
-/*
- *  Copyright (c) 2012 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 <stdio.h>
-#include <stdlib.h>
-
-#include <fstream>
-#include <memory>
-
-#include "webrtc/common_video/libyuv/include/webrtc_libyuv.h"
-#include "webrtc/rtc_tools/frame_editing/frame_editing_lib.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/testsupport/fileutils.h"
-
-namespace webrtc {
-namespace test {
-
-const int kWidth = 352;
-const int kHeight = 288;
-const size_t kFrameSize = CalcBufferSize(VideoType::kI420, kWidth, kHeight);
-
-class FrameEditingTest : public ::testing::Test {
- protected:
-  virtual void SetUp() {
-    reference_video_ = ResourcePath("foreman_cif", "yuv");
-    test_video_ = webrtc::test::TempFilename(webrtc::test::OutputPath(),
-                                             "frame_editing_unittest.yuv");
-
-    original_fid_ = fopen(reference_video_.c_str(), "rb");
-    ASSERT_TRUE(original_fid_ != NULL);
-
-    // Ensure the output file exists on disk.
-    std::ofstream(test_video_.c_str(), std::ios::out);
-    // Open the output file for reading.
-    // TODO(holmer): Figure out why this file has to be opened here (test fails
-    // if it's opened after the write operation performed in EditFrames).
-    edited_fid_ = fopen(test_video_.c_str(), "rb");
-    ASSERT_TRUE(edited_fid_ != NULL);
-
-    original_buffer_.reset(new int[kFrameSize]);
-    edited_buffer_.reset(new int[kFrameSize]);
-    num_frames_read_ = 0;
-  }
-  virtual void TearDown() {
-    fclose(original_fid_);
-    fclose(edited_fid_);
-    remove(test_video_.c_str());
-  }
-  // Compares the frames in both streams to the end of one of the streams.
-  void CompareToTheEnd(FILE* test_video_fid,
-                       FILE* ref_video_fid,
-                       std::unique_ptr<int[]>* ref_buffer,
-                       std::unique_ptr<int[]>* test_buffer) {
-    while (!feof(test_video_fid) && !feof(ref_video_fid)) {
-      num_bytes_read_ = fread(ref_buffer->get(), 1, kFrameSize, ref_video_fid);
-      if (!feof(ref_video_fid)) {
-        EXPECT_EQ(kFrameSize, num_bytes_read_);
-      }
-      num_bytes_read_ = fread(test_buffer->get(), 1, kFrameSize,
-                              test_video_fid);
-      if (!feof(test_video_fid)) {
-        EXPECT_EQ(kFrameSize, num_bytes_read_);
-      }
-      if (!feof(test_video_fid) && !feof(test_video_fid)) {
-        EXPECT_EQ(0, memcmp(ref_buffer->get(), test_buffer->get(),
-                            kFrameSize));
-      }
-    }
-    // There should not be anything left in either stream.
-    EXPECT_EQ(!feof(test_video_fid), !feof(ref_video_fid));
-  }
-  std::string reference_video_;
-  std::string test_video_;
-  FILE* original_fid_;
-  FILE* edited_fid_;
-  size_t num_bytes_read_;
-  std::unique_ptr<int[]> original_buffer_;
-  std::unique_ptr<int[]> edited_buffer_;
-  int num_frames_read_;
-};
-
-TEST_F(FrameEditingTest, ValidInPath) {
-  const int kFirstFrameToProcess = 160;
-  const int kInterval = -1;
-  const int kLastFrameToProcess = 240;
-
-  int result = EditFrames(reference_video_, kWidth, kHeight,
-                          kFirstFrameToProcess, kInterval, kLastFrameToProcess,
-                          test_video_);
-  EXPECT_EQ(0, result);
-
-  for (int i = 1; i < kFirstFrameToProcess; ++i) {
-    num_bytes_read_ = fread(original_buffer_.get(), 1, kFrameSize,
-                            original_fid_);
-    EXPECT_EQ(kFrameSize, num_bytes_read_);
-
-    num_bytes_read_ = fread(edited_buffer_.get(), 1, kFrameSize, edited_fid_);
-    EXPECT_EQ(kFrameSize, num_bytes_read_);
-
-    EXPECT_EQ(0, memcmp(original_buffer_.get(), edited_buffer_.get(),
-                        kFrameSize));
-  }
-  // Do not compare the frames that have been cut.
-  for (int i = kFirstFrameToProcess; i <= kLastFrameToProcess; ++i) {
-    num_bytes_read_ = fread(original_buffer_.get(), 1, kFrameSize,
-                            original_fid_);
-    EXPECT_EQ(kFrameSize, num_bytes_read_);
-  }
-  CompareToTheEnd(edited_fid_, original_fid_, &original_buffer_,
-                  &edited_buffer_);
-}
-
-TEST_F(FrameEditingTest, EmptySetToCut) {
-  const int kFirstFrameToProcess = 2;
-  const int kInterval = -1;
-  const int kLastFrameToProcess = 1;
-
-  int result = EditFrames(reference_video_, kWidth, kHeight,
-                          kFirstFrameToProcess, kInterval, kLastFrameToProcess,
-                          test_video_);
-  EXPECT_EQ(-10, result);
-}
-
-TEST_F(FrameEditingTest, InValidInPath) {
-  const std::string kRefVideo_ = "PATH/THAT/DOES/NOT/EXIST";
-
-  const int kFirstFrameToProcess = 30;
-  const int kInterval = 1;
-  const int kLastFrameToProcess = 120;
-
-  int result = EditFrames(kRefVideo_, kWidth, kHeight, kFirstFrameToProcess,
-                          kInterval, kLastFrameToProcess, test_video_);
-  EXPECT_EQ(-11, result);
-}
-
-TEST_F(FrameEditingTest, DeletingEverySecondFrame) {
-  const int kFirstFrameToProcess = 1;
-  const int kInterval = -2;
-  const int kLastFrameToProcess = 10000;
-  // Set kLastFrameToProcess to a large value so that all frame are processed.
-  int result = EditFrames(reference_video_, kWidth, kHeight,
-                          kFirstFrameToProcess, kInterval, kLastFrameToProcess,
-                          test_video_);
-  EXPECT_EQ(0, result);
-
-  while (!feof(original_fid_) && !feof(edited_fid_)) {
-    num_bytes_read_ =
-        fread(original_buffer_.get(), 1, kFrameSize, original_fid_);
-    if (!feof(original_fid_)) {
-      EXPECT_EQ(kFrameSize, num_bytes_read_);
-      num_frames_read_++;
-    }
-    // We want to compare every second frame of the original to the edited.
-    // kInterval=-2 and (num_frames_read_ - 1) % kInterval  will be -1 for
-    // every second frame.
-    // num_frames_read_ - 1 because we have deleted frame number 2, 4 , 6 etc.
-    if ((num_frames_read_ - 1) % kInterval == -1) {
-      num_bytes_read_ = fread(edited_buffer_.get(), 1, kFrameSize,
-                              edited_fid_);
-      if (!feof(edited_fid_)) {
-        EXPECT_EQ(kFrameSize, num_bytes_read_);
-      }
-      if (!feof(original_fid_) && !feof(edited_fid_)) {
-        EXPECT_EQ(0, memcmp(original_buffer_.get(),
-                            edited_buffer_.get(), kFrameSize));
-      }
-    }
-  }
-}
-
-TEST_F(FrameEditingTest, RepeatFrames) {
-  const int kFirstFrameToProcess = 160;
-  const int kInterval = 2;
-  const int kLastFrameToProcess = 240;
-
-  int result = EditFrames(reference_video_, kWidth, kHeight,
-                          kFirstFrameToProcess, kInterval, kLastFrameToProcess,
-                          test_video_);
-  EXPECT_EQ(0, result);
-
-  for (int i = 1; i < kFirstFrameToProcess; ++i) {
-    num_bytes_read_ = fread(original_buffer_.get(), 1, kFrameSize,
-                            original_fid_);
-    EXPECT_EQ(kFrameSize, num_bytes_read_);
-
-    num_bytes_read_ = fread(edited_buffer_.get(), 1, kFrameSize, edited_fid_);
-    EXPECT_EQ(kFrameSize, num_bytes_read_);
-
-    EXPECT_EQ(0, memcmp(original_buffer_.get(), edited_buffer_.get(),
-                        kFrameSize));
-  }
-  // Do not compare the frames that have been repeated.
-  for (int i = kFirstFrameToProcess; i <= kLastFrameToProcess; ++i) {
-    num_bytes_read_ = fread(original_buffer_.get(), 1, kFrameSize,
-                            original_fid_);
-    EXPECT_EQ(kFrameSize, num_bytes_read_);
-    for (int i = 1; i <= kInterval; ++i) {
-      num_bytes_read_ = fread(edited_buffer_.get(), 1, kFrameSize,
-                              edited_fid_);
-      EXPECT_EQ(kFrameSize, num_bytes_read_);
-      EXPECT_EQ(0, memcmp(original_buffer_.get(), edited_buffer_.get(),
-                          kFrameSize));
-    }
-  }
-  CompareToTheEnd(edited_fid_, original_fid_, &original_buffer_,
-                  &edited_buffer_);
-}
-}  // namespace test
-}  // namespace webrtc
diff --git a/rtc_tools/header_usage.sh b/rtc_tools/header_usage.sh
deleted file mode 100755
index 58d8502..0000000
--- a/rtc_tools/header_usage.sh
+++ /dev/null
@@ -1,25 +0,0 @@
-#!/bin/bash
-
-# 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.
-
-# This script is run in a git repository. It lists all header files,
-# sorted by the number of other files where the file name of the file
-# occurs. It is intentionally not limited to only source files, and
-# there may be some false hits because we search only for the file
-# part (sans directory). It is quite slow.
-#
-# Headers close to the top of the list are candidates for removal.
-
-git ls-files '*.h' '*.hpp' | while read header ; do
-  name="$(basename "${header}")"
-  count="$(git grep -l -F  "${name}" \
-           | grep -v -e '\.gn' -e '\.gyp'  \
-           | wc -l)"
-  echo "${count}" "${header}"
-done | sort -n
diff --git a/rtc_tools/loopback_test/OWNERS b/rtc_tools/loopback_test/OWNERS
deleted file mode 100644
index 296f71f..0000000
--- a/rtc_tools/loopback_test/OWNERS
+++ /dev/null
@@ -1 +0,0 @@
-andresp@webrtc.org
diff --git a/rtc_tools/loopback_test/README b/rtc_tools/loopback_test/README
deleted file mode 100644
index 68f8eed..0000000
--- a/rtc_tools/loopback_test/README
+++ /dev/null
@@ -1,12 +0,0 @@
-Loopback test
-
-This is a simple html test framework to run a loopback test which can go via
-turn. For now the test is used to analyse bandwidth estimation and get records
-for bad scenarios.
-
-How to run:
- ./run-server.sh (to start python serving the tests)
- Access http://localhost:8080/loopback_test.html to run the test
-
-How to record:
- You can use record-test.sh to get a tcpdump of a test run.
diff --git a/rtc_tools/loopback_test/adapter.js b/rtc_tools/loopback_test/adapter.js
deleted file mode 100644
index 6c2bd04..0000000
--- a/rtc_tools/loopback_test/adapter.js
+++ /dev/null
@@ -1,211 +0,0 @@
-/**
- * Copyright (c) 2014 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.
- */
-
-// This file is cloned from samples/js/base/adapter.js
-// Modify the original and do new copy instead of doing changes here.
-
-var RTCPeerConnection = null;
-var getUserMedia = null;
-var attachMediaStream = null;
-var reattachMediaStream = null;
-var webrtcDetectedBrowser = null;
-var webrtcDetectedVersion = null;
-
-function trace(text) {
-  // This function is used for logging.
-  if (text[text.length - 1] == '\n') {
-    text = text.substring(0, text.length - 1);
-  }
-  console.log((performance.now() / 1000).toFixed(3) + ": " + text);
-}
-function maybeFixConfiguration(pcConfig) {
-  if (pcConfig == null) {
-    return;
-  }
-  for (var i = 0; i < pcConfig.iceServers.length; i++) {
-    if (pcConfig.iceServers[i].hasOwnProperty('urls')){
-      pcConfig.iceServers[i]['url'] = pcConfig.iceServers[i]['urls'];
-      delete pcConfig.iceServers[i]['urls'];
-    }
-  }
-}
-
-if (navigator.mozGetUserMedia) {
-  console.log("This appears to be Firefox");
-
-  webrtcDetectedBrowser = "firefox";
-
-  webrtcDetectedVersion =
-           parseInt(navigator.userAgent.match(/Firefox\/([0-9]+)\./)[1], 10);
-
-  // The RTCPeerConnection object.
-  var RTCPeerConnection = function(pcConfig, pcConstraints) {
-    // .urls is not supported in FF yet.
-    maybeFixConfiguration(pcConfig);
-    return new mozRTCPeerConnection(pcConfig, pcConstraints);
-  }
-
-  // The RTCSessionDescription object.
-  RTCSessionDescription = mozRTCSessionDescription;
-
-  // The RTCIceCandidate object.
-  RTCIceCandidate = mozRTCIceCandidate;
-
-  // Get UserMedia (only difference is the prefix).
-  // Code from Adam Barth.
-  getUserMedia = navigator.mozGetUserMedia.bind(navigator);
-  navigator.getUserMedia = getUserMedia;
-
-  // Creates iceServer from the url for FF.
-  createIceServer = function(url, username, password) {
-    var iceServer = null;
-    var url_parts = url.split(':');
-    if (url_parts[0].indexOf('stun') === 0) {
-      // Create iceServer with stun url.
-      iceServer = { 'url': url };
-    } else if (url_parts[0].indexOf('turn') === 0) {
-      if (webrtcDetectedVersion < 27) {
-        // Create iceServer with turn url.
-        // Ignore the transport parameter from TURN url for FF version <=27.
-        var turn_url_parts = url.split("?");
-        // Return null for createIceServer if transport=tcp.
-        if (turn_url_parts.length === 1 ||
-            turn_url_parts[1].indexOf('transport=udp') === 0) {
-          iceServer = {'url': turn_url_parts[0],
-                       'credential': password,
-                       'username': username};
-        }
-      } else {
-        // FF 27 and above supports transport parameters in TURN url,
-        // So passing in the full url to create iceServer.
-        iceServer = {'url': url,
-                     'credential': password,
-                     'username': username};
-      }
-    }
-    return iceServer;
-  };
-
-  createIceServers = function(urls, username, password) {
-    var iceServers = [];
-    // Use .url for FireFox.
-    for (i = 0; i < urls.length; i++) {
-      var iceServer = createIceServer(urls[i],
-                                      username,
-                                      password);
-      if (iceServer !== null) {
-        iceServers.push(iceServer);
-      }
-    }
-    return iceServers;
-  }
-
-  // Attach a media stream to an element.
-  attachMediaStream = function(element, stream) {
-    console.log("Attaching media stream");
-    element.mozSrcObject = stream;
-    element.play();
-  };
-
-  reattachMediaStream = function(to, from) {
-    console.log("Reattaching media stream");
-    to.mozSrcObject = from.mozSrcObject;
-    to.play();
-  };
-
-  // Fake get{Video,Audio}Tracks
-  if (!MediaStream.prototype.getVideoTracks) {
-    MediaStream.prototype.getVideoTracks = function() {
-      return [];
-    };
-  }
-
-  if (!MediaStream.prototype.getAudioTracks) {
-    MediaStream.prototype.getAudioTracks = function() {
-      return [];
-    };
-  }
-} else if (navigator.webkitGetUserMedia) {
-  console.log("This appears to be Chrome");
-
-  webrtcDetectedBrowser = "chrome";
-  webrtcDetectedVersion =
-         parseInt(navigator.userAgent.match(/Chrom(e|ium)\/([0-9]+)\./)[2], 10);
-
-  // Creates iceServer from the url for Chrome M33 and earlier.
-  createIceServer = function(url, username, password) {
-    var iceServer = null;
-    var url_parts = url.split(':');
-    if (url_parts[0].indexOf('stun') === 0) {
-      // Create iceServer with stun url.
-      iceServer = { 'url': url };
-    } else if (url_parts[0].indexOf('turn') === 0) {
-      // Chrome M28 & above uses below TURN format.
-      iceServer = {'url': url,
-                   'credential': password,
-                   'username': username};
-    }
-    return iceServer;
-  };
-
-  // Creates iceServers from the urls for Chrome M34 and above.
-  createIceServers = function(urls, username, password) {
-    var iceServers = [];
-    if (webrtcDetectedVersion >= 34) {
-      // .urls is supported since Chrome M34.
-      iceServers = {'urls': urls,
-                    'credential': password,
-                    'username': username };
-    } else {
-      for (i = 0; i < urls.length; i++) {
-        var iceServer = createIceServer(urls[i],
-                                        username,
-                                        password);
-        if (iceServer !== null) {
-          iceServers.push(iceServer);
-        }
-      }
-    }
-    return iceServers;
-  };
-
-  // The RTCPeerConnection object.
-  var RTCPeerConnection = function(pcConfig, pcConstraints) {
-    // .urls is supported since Chrome M34.
-    if (webrtcDetectedVersion < 34) {
-      maybeFixConfiguration(pcConfig);
-    }
-    return new webkitRTCPeerConnection(pcConfig, pcConstraints);
-  }
-
-  // Get UserMedia (only difference is the prefix).
-  // Code from Adam Barth.
-  getUserMedia = navigator.webkitGetUserMedia.bind(navigator);
-  navigator.getUserMedia = getUserMedia;
-
-  // Attach a media stream to an element.
-  attachMediaStream = function(element, stream) {
-    if (typeof element.srcObject !== 'undefined') {
-      element.srcObject = stream;
-    } else if (typeof element.mozSrcObject !== 'undefined') {
-      element.mozSrcObject = stream;
-    } else if (typeof element.src !== 'undefined') {
-      element.src = URL.createObjectURL(stream);
-    } else {
-      console.log('Error attaching stream to element.');
-    }
-  };
-
-  reattachMediaStream = function(to, from) {
-    to.src = from.src;
-  };
-} else {
-  console.log("Browser does not appear to be WebRTC-capable");
-}
diff --git a/rtc_tools/loopback_test/loopback_test.html b/rtc_tools/loopback_test/loopback_test.html
deleted file mode 100644
index 676fbe7..0000000
--- a/rtc_tools/loopback_test/loopback_test.html
+++ /dev/null
@@ -1,227 +0,0 @@
-<!DOCTYPE html>
-<!--
-  This page was created to help debug and study webrtc issues such as
-  bandwidth estimation problems. It allows one to easily launch a test
-  case that establishs a connection between 2 peer connections
--->
-<html>
-<head>
-<title>Loopback test</title>
-
-<!-- In order to plot graphs, this tools uses google visualization API which is
-     loaded via goog.load provided by google api. -->
-<script src="//www.google.com/jsapi"></script>
-
-<!-- This file is included to allow loopback_test.js instantiate a
-     RTCPeerConnection on a browser and version agnostic way. -->
-<script src="adapter.js"></script>
-
-<!-- Provides class StatTracker used by loopback_test.js to keep track of
-     RTCPeerConnection stats -->
-<script src="stat_tracker.js"></script>
-
-<!-- Provides LoopbackTest class which has the core logic for the test itself.
-     Such as: create 2 peer connections, establish a call, filter turn
-     candidates, constraint video bitrate etc.
-  -->
-<script src="loopback_test.js"></script>
-
-<style>
-#chart {
-  height: 400px;
-}
-
-#control-range {
-  height: 100px;
-}
-</style>
-</head>
-<body>
-<div id="test-launcher">
-  <p>Duration (s): <input id="duration" type="text"></p>
-  <p>Max video bitrate (kbps): <input id="max-video-bitrate" type="text"></p>
-  <p>Peer connection constraints: <input id="pc-constraints" type="text"></p>
-  <p>Force TURN: <input id="force-turn" type="checkbox" checked></p>
-  <p><input id="launcher-button" type="button" value="Run test">
-  <div id="test-status" style="display:none"></div>
-  <div id="dashboard">
-    <div id="control-category"></div>
-    <div id="chart"></div>
-    <div id="control-range"></div>
-  </div>
-</div>
-<script>
-google.load('visualization', '1.0', {'packages':['controls']});
-
-var durationInput = document.getElementById('duration');
-var maxVideoBitrateInput = document.getElementById('max-video-bitrate');
-var forceTurnInput = document.getElementById('force-turn');
-var launcherButton = document.getElementById('launcher-button');
-var autoModeInput = document.createElement('input');
-var testStatus = document.getElementById('test-status');
-var pcConstraintsInput = document.getElementById('pc-constraints');
-
-launcherButton.onclick = start;
-
-// Load parameters from the url if present. This allows one to link to
-// a specific test configuration and is used to automatically pass parameters
-// for scripts such as record-test.sh
-function getURLParameter(name, default_value) {
-  var search =
-      RegExp('(^\\?|&)' + name + '=' + '(.+?)(&|$)').exec(location.search);
-  if (search)
-    return decodeURI(search[2]);
-  else
-    return default_value;
-}
-
-durationInput.value = getURLParameter('duration', 10);
-maxVideoBitrateInput.value = getURLParameter('max-video-bitrate', 2000);
-forceTurnInput.checked = (getURLParameter('force-turn', 'true') === 'true');
-autoModeInput.checked = (getURLParameter('auto-mode', 'false') === 'true');
-pcConstraintsInput.value = getURLParameter('pc-constraints', '');
-
-if (autoModeInput.checked) start();
-
-function start() {
-  var durationMs = parseInt(durationInput.value) * 1000;
-  var maxVideoBitrateKbps = parseInt(maxVideoBitrateInput.value);
-  var forceTurn = forceTurnInput.checked;
-  var autoClose = autoModeInput.checked;
-  var pcConstraints = pcConstraintsInput.value == "" ?
-                      null : JSON.parse(pcConstraintsInput.value);
-
-  var updateStatusInterval;
-  var testFinished = false;
-  function updateStatus() {
-    if (testFinished) {
-      testStatus.innerHTML = 'Test finished';
-      if (updateStatusInterval) {
-	clearInterval(updateStatusInterval);
-        updateStatusInterval = null;
-      }
-    } else {
-      if (!updateStatusInterval) {
-        updateStatusInterval = setInterval(updateStatus, 1000);
-        testStatus.innerHTML = 'Running';
-      }
-      testStatus.innerHTML += '.';
-    }
-  }
-
-  if (!(isFinite(maxVideoBitrateKbps) && maxVideoBitrateKbps > 0)) {
-    // TODO(andresp): Get a better way to show errors than alert.
-    alert("Invalid max video bitrate");
-    return;
-  }
-
-  if (!(isFinite(durationMs) && durationMs > 0)) {
-    alert("Invalid duration");
-    return;
-  }
-
-  durationInput.disabled = true;
-  forceTurnInput.disabled = true;
-  maxVideoBitrateInput.disabled = true;
-  launcherButton.style.display = 'none';
-  testStatus.style.display = 'block';
-
-  getUserMedia({audio:true, video:true},
-                gotStream, function() {});
-
-  function gotStream(stream) {
-    updateStatus();
-    var test = new LoopbackTest(stream, durationMs,
-                                forceTurn,
-                                pcConstraints,
-                                maxVideoBitrateKbps);
-    test.run(onTestFinished.bind(test));
-  }
-
-  function onTestFinished() {
-    testFinished = true;
-    updateStatus();
-    if (autoClose) {
-      window.close();
-    } else {
-      plotStats(this.getResults());
-    }
-  }
-}
-
-function plotStats(data) {
-  var dashboard = new google.visualization.Dashboard(
-      document.getElementById('dashboard'));
-
-  var chart = new google.visualization.ChartWrapper({
-      'containerId': 'chart',
-      'chartType': 'LineChart',
-      'options': { 'pointSize': 0, 'lineWidth': 1, 'interpolateNulls': true },
-    });
-
-  var rangeFilter = new google.visualization.ControlWrapper({
-     'controlType': 'ChartRangeFilter',
-     'containerId': 'control-range',
-     'options': {
-       'filterColumnIndex': 0,
-       'ui': {
-         'chartType': 'ScatterChart',
-         'chartOptions': {
-           'hAxis': {'baselineColor': 'none'}
-         },
-         'chartView': {
-           'columns': [0, 1]
-         },
-         'minRangeSize': 1000 // 1 second
-       }
-     },
-   });
-
-  // Create a table with the columns of the dataset.
-  var columnsTable = new google.visualization.DataTable();
-  columnsTable.addColumn('number', 'columnIndex');
-  columnsTable.addColumn('string', 'columnLabel');
-  var initState = {selectedValues: []};
-  for (var i = 1; i < data.getNumberOfColumns(); i++) {
-    columnsTable.addRow([i, data.getColumnLabel(i)]);
-    initState.selectedValues.push(data.getColumnLabel(i));
-  }
-
-  var columnFilter = new google.visualization.ControlWrapper({
-    controlType: 'CategoryFilter',
-    containerId: 'control-category',
-    dataTable: columnsTable,
-    options: {
-      filterColumnLabel: 'columnLabel',
-      ui: {
-        label: '',
-        allowNone: false,
-        selectedValuesLayout: 'aside'
-      }
-    },
-    state: initState
-  });
-  google.visualization.events.addListener(columnFilter, 'statechange',
-    function () {
-      var state = columnFilter.getState();
-      var row;
-      var columnIndices = [0];
-      for (var i = 0; i < state.selectedValues.length; i++) {
-        row = columnsTable.getFilteredRows([{
-            column: 1,
-            value: state.selectedValues[i]}])[0];
-        columnIndices.push(columnsTable.getValue(row, 0));
-      }
-      // Sort the indices into their original order
-      columnIndices.sort(function (a, b) { return (a - b); });
-      chart.setView({columns: columnIndices});
-      chart.draw();
-    });
-
-  columnFilter.draw();
-  dashboard.bind([rangeFilter], [chart]);
-  dashboard.draw(data);
-}
-</script>
-</body>
-</html>
diff --git a/rtc_tools/loopback_test/loopback_test.js b/rtc_tools/loopback_test/loopback_test.js
deleted file mode 100644
index 5e596b7..0000000
--- a/rtc_tools/loopback_test/loopback_test.js
+++ /dev/null
@@ -1,240 +0,0 @@
-/**
- * Copyright (c) 2014 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.
- */
-
-// LoopbackTest establish a one way loopback call between 2 peer connections
-// while continuously monitoring bandwidth stats. The idea is to use this as
-// a base for other future tests and to keep track of more than just bandwidth
-// stats.
-//
-// Usage:
-//  var test = new LoopbackTest(stream, callDurationMs,
-//                              forceTurn, pcConstraints,
-//                              maxVideoBitrateKbps);
-//  test.run(onDone);
-//  function onDone() {
-//    test.getResults(); // return stats recorded during the loopback test.
-//  }
-//
-function LoopbackTest(
-    stream,
-    callDurationMs,
-    forceTurn,
-    pcConstraints,
-    maxVideoBitrateKbps) {
-
-  var pc1StatTracker;
-  var pc2StatTracker;
-
-  // In order to study effect of network (e.g. wifi) on peer connection one can
-  // establish a loopback call and force it to go via a turn server. This way
-  // the call won't switch to local addresses. That is achieved by filtering out
-  // all non-relay ice candidades on both peers.
-  function constrainTurnCandidates(pc) {
-    var origAddIceCandidate = pc.addIceCandidate;
-    pc.addIceCandidate = function (candidate, successCallback,
-                                   failureCallback) {
-      if (forceTurn && candidate.candidate.indexOf("typ relay ") == -1) {
-        trace("Dropping non-turn candidate: " + candidate.candidate);
-        successCallback();
-        return;
-      } else {
-        origAddIceCandidate.call(this, candidate, successCallback,
-                                 failureCallback);
-      }
-    }
-  }
-
-  // FEC makes it hard to study bwe estimation since there seems to be a spike
-  // when it is enabled and disabled. Disable it for now. FEC issue tracked on:
-  // https://code.google.com/p/webrtc/issues/detail?id=3050
-  function constrainOfferToRemoveFec(pc) {
-    var origCreateOffer = pc.createOffer;
-    pc.createOffer = function (successCallback, failureCallback, options) {
-      function filteredSuccessCallback(desc) {
-        desc.sdp = desc.sdp.replace(/(m=video 1 [^\r]+)(116 117)(\r\n)/g,
-                                    '$1\r\n');
-        desc.sdp = desc.sdp.replace(/a=rtpmap:116 red\/90000\r\n/g, '');
-        desc.sdp = desc.sdp.replace(/a=rtpmap:117 ulpfec\/90000\r\n/g, '');
-        successCallback(desc);
-      }
-      origCreateOffer.call(this, filteredSuccessCallback, failureCallback,
-                           options);
-    }
-  }
-
-  // Constraint max video bitrate by modifying the SDP when creating an answer.
-  function constrainBitrateAnswer(pc) {
-    var origCreateAnswer = pc.createAnswer;
-    pc.createAnswer = function (successCallback, failureCallback, options) {
-      function filteredSuccessCallback(desc) {
-        if (maxVideoBitrateKbps) {
-          desc.sdp = desc.sdp.replace(
-              /a=mid:video\r\n/g,
-              'a=mid:video\r\nb=AS:' + maxVideoBitrateKbps + '\r\n');
-        }
-        successCallback(desc);
-      }
-      origCreateAnswer.call(this, filteredSuccessCallback, failureCallback,
-                            options);
-    }
-  }
-
-  // Run the actual LoopbackTest.
-  this.run = function(doneCallback) {
-    if (forceTurn) requestTurn(start, fail);
-    else start();
-
-    function start(turnServer) {
-      var pcConfig = forceTurn ? { iceServers: [turnServer] } : null;
-      console.log(pcConfig);
-      var pc1 = new RTCPeerConnection(pcConfig, pcConstraints);
-      constrainTurnCandidates(pc1);
-      constrainOfferToRemoveFec(pc1);
-      pc1StatTracker = new StatTracker(pc1, 50);
-      pc1StatTracker.recordStat("EstimatedSendBitrate",
-                                "bweforvideo", "googAvailableSendBandwidth");
-      pc1StatTracker.recordStat("TransmitBitrate",
-                                "bweforvideo", "googTransmitBitrate");
-      pc1StatTracker.recordStat("TargetEncodeBitrate",
-                                "bweforvideo", "googTargetEncBitrate");
-      pc1StatTracker.recordStat("ActualEncodedBitrate",
-                                "bweforvideo", "googActualEncBitrate");
-
-      var pc2 = new RTCPeerConnection(pcConfig, pcConstraints);
-      constrainTurnCandidates(pc2);
-      constrainBitrateAnswer(pc2);
-      pc2StatTracker = new StatTracker(pc2, 50);
-      pc2StatTracker.recordStat("REMB",
-                                "bweforvideo", "googAvailableReceiveBandwidth");
-
-      pc1.addStream(stream);
-      var call = new Call(pc1, pc2);
-
-      call.start();
-      setTimeout(function () {
-          call.stop();
-          pc1StatTracker.stop();
-          pc2StatTracker.stop();
-          success();
-        }, callDurationMs);
-    }
-
-    function success() {
-      trace("Success");
-      doneCallback();
-    }
-
-    function fail(msg) {
-      trace("Fail: " + msg);
-      doneCallback();
-    }
-  }
-
-  // Returns a google visualization datatable with the recorded samples during
-  // the loopback test.
-  this.getResults = function () {
-    return mergeDataTable(pc1StatTracker.dataTable(),
-                          pc2StatTracker.dataTable());
-  }
-
-  // Helper class to establish and manage a call between 2 peer connections.
-  // Usage:
-  //   var c = new Call(pc1, pc2);
-  //   c.start();
-  //   c.stop();
-  //
-  function Call(pc1, pc2) {
-    pc1.onicecandidate = applyIceCandidate.bind(pc2);
-    pc2.onicecandidate = applyIceCandidate.bind(pc1);
-
-    function applyIceCandidate(e) {
-      if (e.candidate) {
-        this.addIceCandidate(new RTCIceCandidate(e.candidate),
-                             onAddIceCandidateSuccess,
-                             onAddIceCandidateError);
-      }
-    }
-
-    function onAddIceCandidateSuccess() {}
-    function onAddIceCandidateError(error) {
-      trace("Failed to add Ice Candidate: " + error.toString());
-    }
-
-    this.start = function() {
-      pc1.createOffer(gotDescription1, onCreateSessionDescriptionError);
-
-      function onCreateSessionDescriptionError(error) {
-        trace('Failed to create session description: ' + error.toString());
-      }
-
-      function gotDescription1(desc){
-        trace("Offer: " + desc.sdp);
-        pc1.setLocalDescription(desc);
-        pc2.setRemoteDescription(desc);
-        // Since the "remote" side has no media stream we need
-        // to pass in the right constraints in order for it to
-        // accept the incoming offer of audio and video.
-        pc2.createAnswer(gotDescription2, onCreateSessionDescriptionError);
-      }
-
-      function gotDescription2(desc){
-        trace("Answer: " + desc.sdp);
-        pc2.setLocalDescription(desc);
-        pc1.setRemoteDescription(desc);
-      }
-    }
-
-    this.stop = function() {
-      pc1.close();
-      pc2.close();
-    }
-  }
-
-  // Request a turn server. This uses the same servers as apprtc.
-  function requestTurn(successCallback, failureCallback) {
-    var currentDomain = document.domain;
-    if (currentDomain.search('localhost') === -1 &&
-        currentDomain.search('webrtc.googlecode.com') === -1) {
-      failureCallback("Domain not authorized for turn server: " +
-                      currentDomain);
-      return;
-    }
-
-    // Get a turn server from computeengineondemand.appspot.com.
-    var turnUrl = 'https://computeengineondemand.appspot.com/' +
-                  'turn?username=156547625762562&key=4080218913';
-    var xmlhttp = new XMLHttpRequest();
-    xmlhttp.onreadystatechange = onTurnResult;
-    xmlhttp.open('GET', turnUrl, true);
-    xmlhttp.send();
-
-    function onTurnResult() {
-      if (this.readyState !== 4) {
-        return;
-      }
-
-      if (this.status === 200) {
-        var turnServer = JSON.parse(xmlhttp.responseText);
-        // Create turnUris using the polyfill (adapter.js).
-        turnServer.uris = turnServer.uris.filter(
-            function (e) { return e.search('transport=udp') != -1; }
-        );
-        var iceServers = createIceServers(turnServer.uris,
-                                          turnServer.username,
-                                          turnServer.password);
-        if (iceServers !== null) {
-          successCallback(iceServers);
-          return;
-        }
-      }
-      failureCallback("Failed to get a turn server.");
-    }
-  }
-}
diff --git a/rtc_tools/loopback_test/record-test.sh b/rtc_tools/loopback_test/record-test.sh
deleted file mode 100755
index 92d9202..0000000
--- a/rtc_tools/loopback_test/record-test.sh
+++ /dev/null
@@ -1,60 +0,0 @@
-#!/bin/sh
-#
-# Copyright (c) 2014 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.
-#
-# This script is used to record a tcp dump of running a loop back test.
-# Example use case:
-#
-#  $ ./run-server.sh &       # spawns a server to serve the html pages
-#                            # on localhost:8080
-#
-#  (recording 3 tests with 5mins and bitrates 1mbps, 2mbps and 3mbps)
-#  $ sudo -v                              # Caches sudo credentials needed
-#                                         # for tcpdump
-#  $ export INTERFACE=eth1                # Defines interface to record packets
-#  $ export CHROME_UNDER_TESTING=./chrome # Define which chrome to run on tests
-#  $ export TEST="http://localhost:8080/loopback_test.html?auto-mode=true"
-#  $ record-test.sh ./record1.pcap "$TEST&duration=300&max-video-bitrate=1000"
-#  $ record-test.sh ./record2.pcap "$TEST&duration=300&max-video-bitrate=2000"
-#  $ record-test.sh ./record3.pcap "$TEST&duration=300&max-video-bitrate=3000"
-
-# Indicate an error and exit with a nonzero status if any of the required
-# environment variables is Null or Unset.
-: ${INTERFACE:?"Need to set INTERFACE env variable"}
-: ${CHROME_UNDER_TESTING:?"Need to set CHROME_UNDER_TESTING env variable"}
-
-if [ ! -x "$CHROME_UNDER_TESTING" ]; then
-  echo "CHROME_UNDER_TESTING=$CHROME_UNDER_TESTING does not seem to exist."
-  exit 1
-fi
-
-if [ "$#" -ne 2 ]; then
-  echo "Usage: $0 <test-url> <network-dump>"
-  exit 1
-fi
-TEST_URL=$1
-OUTPUT_RECORDING=$2
-
-sudo -nv > /dev/null 2>&1
-if [ $? != 0 ]; then
-  echo "Run \"sudo -v\" to cache your credentials." \
-       "They are needed to run tcpdump."
-  exit
-fi
-
-echo "Recording $INTERFACE into ${OUTPUT_RECORDING}"
-sudo -n tcpdump -i "$INTERFACE" -w - > "${OUTPUT_RECORDING}" &
-TCPDUMP_PID=$!
-
-echo "Starting ${CHROME_UNDER_TESTING} with ${TEST_URL}."
-# Using real camera instead of --use-fake-device-for-media-stream as it
-# does not produces images complex enough to reach 3mbps.
-# Flag --use-fake-ui-for-media-stream automatically allows getUserMedia calls.
-$CHROME_UNDER_TESTING --use-fake-ui-for-media-stream "${TEST_URL}"
-kill ${TCPDUMP_PID}
diff --git a/rtc_tools/loopback_test/run-server.sh b/rtc_tools/loopback_test/run-server.sh
deleted file mode 100755
index 35c0797..0000000
--- a/rtc_tools/loopback_test/run-server.sh
+++ /dev/null
@@ -1,15 +0,0 @@
-#!/bin/sh
-#
-# Copyright (c) 2014 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.
-#
-# This script is used to launch a simple http server for files in the same
-# location as the script itself.
-cd "`dirname \"$0\"`"
-echo "Starting http server in port 8080."
-exec python -m SimpleHTTPServer 8080
diff --git a/rtc_tools/loopback_test/stat_tracker.js b/rtc_tools/loopback_test/stat_tracker.js
deleted file mode 100644
index 49f46c3..0000000
--- a/rtc_tools/loopback_test/stat_tracker.js
+++ /dev/null
@@ -1,94 +0,0 @@
-/**
- * Copyright (c) 2014 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.
- */
-
-// StatTracker is a helper class to keep track of stats on a RTCPeerConnection
-// object. It uses google visualization datatables to keep the recorded samples
-// and simplify plugging them into graphs later.
-//
-// Usage example:
-//   var tracker = new StatTracker(pc, pollInterval);
-//   tracker.recordStat("EstimatedSendBitrate",
-//                      "bweforvideo", "googAvailableSendBandwidth");
-//   ...
-//   tracker.stop();
-//   tracker.dataTable(); // returns the recorded values. In this case
-//   a table with 2 columns { Time, EstimatedSendBitrate } and a row for each
-//   sample taken until stop() was called.
-//
-function StatTracker(pc, pollInterval) {
-  pollInterval = pollInterval || 250;
-
-  var dataTable = new google.visualization.DataTable();
-  var timeColumnIndex = dataTable.addColumn('datetime', 'Time');
-  var recording = true;
-
-  // Set of sampling functions. Functions registered here are called
-  // once per getStats with the given report and a rowIndex for the
-  // sample period so they can extract and record the tracked variables.
-  var samplingFunctions = {};
-
-  // Accessor to the current recorded stats.
-  this.dataTable = function() { return dataTable; }
-
-  // recordStat(varName, recordName, statName) adds a samplingFunction that
-  // records namedItem(recordName).stat(statName) from RTCStatsReport for each
-  // sample into a column named varName in the dataTable.
-  this.recordStat = function (varName, recordName, statName) {
-    var columnIndex = dataTable.addColumn('number', varName);
-    samplingFunctions[varName] = function (report, rowIndex) {
-      var sample;
-      var record = report.namedItem(recordName);
-      if (record) sample = record.stat(statName);
-      dataTable.setCell(rowIndex, columnIndex, sample);
-    }
-  }
-
-  // Stops the polling of stats from the peer connection.
-  this.stop = function() {
-    recording = false;
-  }
-
-  // RTCPeerConnection.getStats is asynchronous. In order to avoid having
-  // too many pending getStats requests going, this code only queues the
-  // next getStats with setTimeout after the previous one returns, instead
-  // of using setInterval.
-  function poll() {
-    pc.getStats(function (report) {
-      if (!recording) return;
-      setTimeout(poll, pollInterval);
-      var result = report.result();
-      if (result.length < 1) return;
-
-      var rowIndex = dataTable.addRow();
-      dataTable.setCell(rowIndex, timeColumnIndex, result[0].timestamp);
-      for (var v in samplingFunctions)
-        samplingFunctions[v](report, rowIndex);
-    });
-  }
-  setTimeout(poll, pollInterval);
-}
-
-/**
- * Utility method to perform a full join between data tables from StatTracker.
- */
-function mergeDataTable(dataTable1, dataTable2) {
-  function allColumns(cols) {
-    var a = [];
-    for (var i = 1; i < cols; ++i) a.push(i);
-    return a;
-  }
-  return google.visualization.data.join(
-      dataTable1,
-      dataTable2,
-      'full',
-      [[0, 0]],
-      allColumns(dataTable1.getNumberOfColumns()),
-      allColumns(dataTable2.getNumberOfColumns()));
-}
diff --git a/rtc_tools/network_tester/BUILD.gn b/rtc_tools/network_tester/BUILD.gn
deleted file mode 100644
index cff453d..0000000
--- a/rtc_tools/network_tester/BUILD.gn
+++ /dev/null
@@ -1,178 +0,0 @@
-# Copyright (c) 2017 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.
-
-import("../../webrtc.gni")
-import("//third_party/protobuf/proto_library.gni")
-
-if (rtc_enable_protobuf) {
-  proto_library("network_tester_config_proto") {
-    sources = [
-      "network_tester_config.proto",
-    ]
-    proto_out_dir = "webrtc/rtc_tools/network_tester"
-  }
-
-  proto_library("network_tester_packet_proto") {
-    sources = [
-      "network_tester_packet.proto",
-    ]
-    proto_out_dir = "webrtc/rtc_tools/network_tester"
-  }
-
-  rtc_static_library("network_tester") {
-    sources = [
-      "config_reader.cc",
-      "config_reader.h",
-      "packet_logger.cc",
-      "packet_logger.h",
-      "packet_sender.cc",
-      "packet_sender.h",
-      "test_controller.cc",
-      "test_controller.h",
-    ]
-
-    defines = [ "WEBRTC_NETWORK_TESTER_PROTO" ]
-
-    deps = [
-      ":network_tester_config_proto",
-      ":network_tester_packet_proto",
-      "../../api:optional",
-      "../../p2p",
-      "../../rtc_base:protobuf_utils",
-      "../../rtc_base:rtc_base_approved",
-      "../../rtc_base:rtc_task_queue",
-      "../../rtc_base:sequenced_task_checker",
-    ]
-
-    if (!build_with_chromium && is_clang) {
-      # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-    }
-  }
-
-  network_tester_unittests_resources = [
-    "../../../resources/network_tester/client_config.dat",
-    "../../../resources/network_tester/server_config.dat",
-  ]
-
-  if (is_ios) {
-    bundle_data("network_tester_unittests_bundle_data") {
-      testonly = true
-      sources = network_tester_unittests_resources
-      outputs = [
-        "{{bundle_resources_dir}}/{{source_file_part}}",
-      ]
-    }
-  }
-
-  rtc_source_set("network_tester_unittests") {
-    testonly = true
-
-    # Skip restricting visibility on mobile platforms since the tests on those
-    # gets additional generated targets which would require many lines here to
-    # cover (which would be confusing to read and hard to maintain).
-    if (!is_android && !is_ios) {
-      visibility = [ "..:tools_unittests" ]
-    }
-    sources = [
-      "network_tester_unittest.cc",
-    ]
-
-    deps = [
-      ":network_tester",
-      "../../rtc_base:rtc_base_tests_utils",
-      "../../test:test_support",
-      "//testing/gtest",
-    ]
-
-    if (is_ios) {
-      deps += [ ":network_tester_unittests_bundle_data" ]
-    }
-
-    defines = [
-      "GTEST_RELATIVE_PATH",
-      "WEBRTC_NETWORK_TESTER_TEST_ENABLED",
-    ]
-
-    data = network_tester_unittests_resources
-
-    if (!build_with_chromium && is_clang) {
-      # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-    }
-  }
-
-  rtc_executable("network_tester_server") {
-    sources = [
-      "server.cc",
-    ]
-
-    deps = [
-      ":network_tester",
-    ]
-
-    if (!build_with_chromium && is_clang) {
-      # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-    }
-  }
-}
-
-if (is_android) {
-  android_apk("NetworkTesterMobile") {
-    testonly = true
-    apk_name = "NetworkTesterMobile"
-    android_manifest = "androidapp/AndroidManifest.xml"
-
-    deps = [
-      ":NetworkTesterMobile_javalib",
-      ":NetworkTesterMobile_resources",
-      "../../rtc_base:base_java",
-      "//base:base_java",
-    ]
-
-    shared_libraries = [ "../../rtc_tools/network_tester:network_tester_so" ]
-  }
-
-  android_library("NetworkTesterMobile_javalib") {
-    testonly = true
-    android_manifest = "androidapp/AndroidManifest.xml"
-
-    java_files = [
-      "androidapp/src/com/google/media/networktester/MainActivity.java",
-      "androidapp/src/com/google/media/networktester/NetworkTester.java",
-    ]
-
-    deps = [
-      ":NetworkTesterMobile_resources",
-      "../../rtc_base:base_java",
-    ]
-  }
-
-  android_resources("NetworkTesterMobile_resources") {
-    testonly = true
-    resource_dirs = [ "androidapp/res" ]
-    custom_package = "com.google.media.networktester"
-  }
-
-  rtc_shared_library("network_tester_so") {
-    sources = [
-      "jni.cpp",
-    ]
-
-    deps = [
-      ":network_tester",
-      "../../system_wrappers:field_trial_default",
-    ]
-
-    suppressed_configs += [ "//build/config/android:hide_all_but_jni_onload" ]
-    configs += [ "//build/config/android:hide_all_but_jni" ]
-
-    output_extension = "so"
-  }
-}
diff --git a/rtc_tools/network_tester/README b/rtc_tools/network_tester/README
deleted file mode 100644
index 6680212..0000000
--- a/rtc_tools/network_tester/README
+++ /dev/null
@@ -1,35 +0,0 @@
-This file explains how to run the network tester and how to analyze the results.
-
-create config files
-===================
-use create_network_tester_config.py  to create config files.
-you can add or change the AddConfig call in the main function to create a
-the desired network config.
-
-run network_tester_server
-=========================
-place the network config file next to the server binary and name it
-"server_config.dat".
-
-the network_tester_server should run on a server with a public IP address.
-
-the log file of network_tester_server will be created next to the binary with
-the name "server_packet_log.dat"
-
-
-run NetworkTesterMobile (apk)
-=============================
-change the IP and the port in the jni.cpp file and set it to the port and IP
-you run the network_tester_server on.
-
-place the network config file as "/mnt/sdcard/network_tester_client_config.dat"
-on the tester android phone.
-
-The log file of network_tester_server will be created at
-"/mnt/sdcard/network_tester_client_packet_log.dat"
-
-
-analyze the results
-====================
-run "python parse_packet_log.py -f <log_file_to_parse>" to analyze the
-log results.
diff --git a/rtc_tools/network_tester/androidapp/AndroidManifest.xml b/rtc_tools/network_tester/androidapp/AndroidManifest.xml
deleted file mode 100755
index f391063..0000000
--- a/rtc_tools/network_tester/androidapp/AndroidManifest.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="com.google.media.networktester" >
-    <uses-permission android:name="android.permission.INTERNET" />
-    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
-    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
-    <uses-sdk android:minSdkVersion="17"
-    android:targetSdkVersion="24"
-    android:maxSdkVersion="24" />
-    <application
-        android:allowBackup="true"
-        android:icon="@mipmap/ic_launcher"
-        android:label="@string/app_name"
-        android:supportsRtl="true"
-        android:theme="@style/AppTheme" >
-        <activity android:name=".MainActivity" >
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN" />
-
-                <category android:name="android.intent.category.LAUNCHER" />
-            </intent-filter>
-        </activity>
-    </application>
-</manifest>
\ No newline at end of file
diff --git a/rtc_tools/network_tester/androidapp/res/layout/activity_main.xml b/rtc_tools/network_tester/androidapp/res/layout/activity_main.xml
deleted file mode 100755
index 8839a31..0000000
--- a/rtc_tools/network_tester/androidapp/res/layout/activity_main.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<RelativeLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:tools="http://schemas.android.com/tools"
-    android:id="@+id/activity_main"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:paddingStart="@dimen/activity_horizontal_margin"
-    android:paddingEnd="@dimen/activity_horizontal_margin"
-    android:paddingTop="@dimen/activity_vertical_margin"
-    android:paddingBottom="@dimen/activity_vertical_margin"
-    tools:context="com.google.media.networktester.MainActivity">
-    <Button
-      android:text="@string/start_test"
-      android:layout_width="wrap_content"
-      android:layout_height="wrap_content"
-      android:layout_alignParentTop="true"
-      android:layout_alignParentStart="true"
-      android:id="@+id/start_button"/>
-    <Button
-      android:text="@string/interrupt_test"
-      android:layout_width="wrap_content"
-      android:layout_height="wrap_content"
-      android:layout_alignParentTop="true"
-      android:layout_toEndOf="@+id/start_button"
-      android:id="@+id/stop_button"/>
-
-</RelativeLayout>
diff --git a/rtc_tools/network_tester/androidapp/res/mipmap-hdpi/ic_launcher.png b/rtc_tools/network_tester/androidapp/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index cde69bc..0000000
--- a/rtc_tools/network_tester/androidapp/res/mipmap-hdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/rtc_tools/network_tester/androidapp/res/mipmap-mdpi/ic_launcher.png b/rtc_tools/network_tester/androidapp/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index c133a0c..0000000
--- a/rtc_tools/network_tester/androidapp/res/mipmap-mdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/rtc_tools/network_tester/androidapp/res/mipmap-xhdpi/ic_launcher.png b/rtc_tools/network_tester/androidapp/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index bfa42f0..0000000
--- a/rtc_tools/network_tester/androidapp/res/mipmap-xhdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/rtc_tools/network_tester/androidapp/res/mipmap-xxhdpi/ic_launcher.png b/rtc_tools/network_tester/androidapp/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index 324e72c..0000000
--- a/rtc_tools/network_tester/androidapp/res/mipmap-xxhdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/rtc_tools/network_tester/androidapp/res/mipmap-xxxhdpi/ic_launcher.png b/rtc_tools/network_tester/androidapp/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index aee44e1..0000000
--- a/rtc_tools/network_tester/androidapp/res/mipmap-xxxhdpi/ic_launcher.png
+++ /dev/null
Binary files differ
diff --git a/rtc_tools/network_tester/androidapp/res/values-v17/styles.xml b/rtc_tools/network_tester/androidapp/res/values-v17/styles.xml
deleted file mode 100755
index ff6c9d2..0000000
--- a/rtc_tools/network_tester/androidapp/res/values-v17/styles.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<resources>
-
-    <!-- Base application theme. -->
-    <style name="AppTheme" parent="android:Theme.Holo.Light.DarkActionBar">
-        <!-- Customize your theme here. -->
-    </style>
-
-</resources>
diff --git a/rtc_tools/network_tester/androidapp/res/values-w820dp/dimens.xml b/rtc_tools/network_tester/androidapp/res/values-w820dp/dimens.xml
deleted file mode 100755
index 63fc816..0000000
--- a/rtc_tools/network_tester/androidapp/res/values-w820dp/dimens.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<resources>
-    <!-- Example customization of dimensions originally defined in res/values/dimens.xml
-         (such as screen margins) for screens with more than 820dp of available width. This
-         would include 7" and 10" devices in landscape (~960dp and ~1280dp respectively). -->
-    <dimen name="activity_horizontal_margin">64dp</dimen>
-</resources>
diff --git a/rtc_tools/network_tester/androidapp/res/values/colors.xml b/rtc_tools/network_tester/androidapp/res/values/colors.xml
deleted file mode 100755
index 3ab3e9c..0000000
--- a/rtc_tools/network_tester/androidapp/res/values/colors.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
-    <color name="colorPrimary">#3F51B5</color>
-    <color name="colorPrimaryDark">#303F9F</color>
-    <color name="colorAccent">#FF4081</color>
-</resources>
diff --git a/rtc_tools/network_tester/androidapp/res/values/dimens.xml b/rtc_tools/network_tester/androidapp/res/values/dimens.xml
deleted file mode 100755
index 47c8224..0000000
--- a/rtc_tools/network_tester/androidapp/res/values/dimens.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<resources>
-    <!-- Default screen margins, per the Android Design guidelines. -->
-    <dimen name="activity_horizontal_margin">16dp</dimen>
-    <dimen name="activity_vertical_margin">16dp</dimen>
-</resources>
diff --git a/rtc_tools/network_tester/androidapp/res/values/strings.xml b/rtc_tools/network_tester/androidapp/res/values/strings.xml
deleted file mode 100755
index 273276d..0000000
--- a/rtc_tools/network_tester/androidapp/res/values/strings.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<resources>
-    <string name="app_name">NetworkTester</string>
-    <string name="start_test">Start test</string>
-    <string name="interrupt_test">Interrupt test</string>
-    <string name="test_status">Status</string>
-</resources>
diff --git a/rtc_tools/network_tester/androidapp/src/com/google/media/networktester/MainActivity.java b/rtc_tools/network_tester/androidapp/src/com/google/media/networktester/MainActivity.java
deleted file mode 100644
index 2a78d6b..0000000
--- a/rtc_tools/network_tester/androidapp/src/com/google/media/networktester/MainActivity.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- *  Copyright 2017 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.
- */
-
-package com.google.media.networktester;
-
-import android.app.Activity;
-import android.content.Context;
-import android.net.ConnectivityManager;
-import android.net.NetworkInfo;
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.ParcelFileDescriptor;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.view.WindowManager;
-import android.widget.Button;
-
-public class MainActivity extends Activity {
-  Button startButton;
-  Button stopButton;
-  NetworkTester networkTester = null;
-  Handler mainThreadHandler;
-
-  @Override
-  protected void onCreate(Bundle savedInstanceState) {
-    super.onCreate(savedInstanceState);
-    setContentView(R.layout.activity_main);
-    startButton = (Button) findViewById(R.id.start_button);
-    startButton.setOnClickListener(new OnClickListener() {
-      @Override
-      public void onClick(View v) {
-        startTest();
-      }
-    });
-    stopButton = (Button) findViewById(R.id.stop_button);
-    stopButton.setOnClickListener(new OnClickListener() {
-      @Override
-      public void onClick(View v) {
-        stopTest();
-      }
-    });
-    mainThreadHandler = new Handler();
-    getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
-  }
-
-  private void startTest() {
-    if (networkTester == null) {
-      networkTester = new NetworkTester();
-      networkTester.start();
-    }
-  }
-
-  private void stopTest() {
-    if (networkTester != null) {
-      networkTester.interrupt();
-      networkTester = null;
-    }
-  }
-}
diff --git a/rtc_tools/network_tester/androidapp/src/com/google/media/networktester/NetworkTester.java b/rtc_tools/network_tester/androidapp/src/com/google/media/networktester/NetworkTester.java
deleted file mode 100644
index 7c08f87..0000000
--- a/rtc_tools/network_tester/androidapp/src/com/google/media/networktester/NetworkTester.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- *  Copyright 2017 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.
- */
-
-package com.google.media.networktester;
-
-public class NetworkTester extends Thread {
-  private native static long CreateTestController();
-  private native static void TestControllerConnect(long testController);
-  private native static void TestControllerRun(long testController);
-  private native static boolean TestControllerIsDone(long testController);
-  private native static void DestroyTestController(long testController);
-  static {
-    System.loadLibrary("network_tester_so");
-  }
-
-  @Override
-  public void run() {
-    final long testController = CreateTestController();
-    TestControllerConnect(testController);
-    while (!Thread.interrupted() && !TestControllerIsDone(testController)) {
-      TestControllerRun(testController);
-    }
-    DestroyTestController(testController);
-  }
-}
diff --git a/rtc_tools/network_tester/config_reader.cc b/rtc_tools/network_tester/config_reader.cc
deleted file mode 100644
index ccc4153..0000000
--- a/rtc_tools/network_tester/config_reader.cc
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- *  Copyright 2017 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/rtc_tools/network_tester/config_reader.h"
-
-#include <string>
-#include <vector>
-
-namespace webrtc {
-
-ConfigReader::ConfigReader(const std::string& config_file_path)
-    : proto_config_index_(0) {
-  std::ifstream config_stream(config_file_path,
-                              std::ios_base::in | std::ios_base::binary);
-  RTC_DCHECK(config_stream.is_open());
-  RTC_DCHECK(config_stream.good());
-  std::string config_data((std::istreambuf_iterator<char>(config_stream)),
-                          (std::istreambuf_iterator<char>()));
-  if (config_data.size() > 0) {
-    proto_all_configs_.ParseFromString(config_data);
-  }
-}
-
-ConfigReader::~ConfigReader() = default;
-
-rtc::Optional<ConfigReader::Config> ConfigReader::GetNextConfig() {
-#ifdef WEBRTC_NETWORK_TESTER_PROTO
-  if (proto_config_index_ >= proto_all_configs_.configs_size())
-    return rtc::Optional<Config>();
-  auto proto_config = proto_all_configs_.configs(proto_config_index_++);
-  RTC_DCHECK(proto_config.has_packet_send_interval_ms());
-  RTC_DCHECK(proto_config.has_packet_size());
-  RTC_DCHECK(proto_config.has_execution_time_ms());
-  Config config;
-  config.packet_send_interval_ms = proto_config.packet_send_interval_ms();
-  config.packet_size = proto_config.packet_size();
-  config.execution_time_ms = proto_config.execution_time_ms();
-  return rtc::Optional<Config>(config);
-#else
-  return rtc::Optional<Config>();
-#endif  //  WEBRTC_NETWORK_TESTER_PROTO
-}
-
-}  // namespace webrtc
diff --git a/rtc_tools/network_tester/config_reader.h b/rtc_tools/network_tester/config_reader.h
deleted file mode 100644
index ae4348f..0000000
--- a/rtc_tools/network_tester/config_reader.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- *  Copyright 2017 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_RTC_TOOLS_NETWORK_TESTER_CONFIG_READER_H_
-#define WEBRTC_RTC_TOOLS_NETWORK_TESTER_CONFIG_READER_H_
-
-#include <fstream>
-#include <string>
-
-#include "webrtc/api/optional.h"
-#include "webrtc/rtc_base/constructormagic.h"
-
-#include "webrtc/rtc_base/ignore_wundef.h"
-
-#ifdef WEBRTC_NETWORK_TESTER_PROTO
-RTC_PUSH_IGNORING_WUNDEF()
-#include "webrtc/rtc_tools/network_tester/network_tester_config.pb.h"
-RTC_POP_IGNORING_WUNDEF()
-using webrtc::network_tester::config::NetworkTesterAllConfigs;
-#else
-class NetworkTesterConfigs;
-#endif  // WEBRTC_NETWORK_TESTER_PROTO
-
-namespace webrtc {
-
-class ConfigReader {
- public:
-  struct Config {
-    int packet_send_interval_ms;
-    int packet_size;
-    int execution_time_ms;
-  };
-  explicit ConfigReader(const std::string& config_file_path);
-  ~ConfigReader();
-
-  rtc::Optional<Config> GetNextConfig();
-
- private:
-  NetworkTesterAllConfigs proto_all_configs_;
-  int proto_config_index_;
-  RTC_DISALLOW_COPY_AND_ASSIGN(ConfigReader);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_RTC_TOOLS_NETWORK_TESTER_CONFIG_READER_H_
diff --git a/rtc_tools/network_tester/create_network_tester_config.py b/rtc_tools/network_tester/create_network_tester_config.py
deleted file mode 100644
index 57c1eb8..0000000
--- a/rtc_tools/network_tester/create_network_tester_config.py
+++ /dev/null
@@ -1,30 +0,0 @@
-#!/usr/bin/env python
-# Copyright (c) 2017 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.
-
-import network_tester_config_pb2
-
-
-def AddConfig(all_configs,
-              packet_send_interval_ms,
-              packet_size,
-              execution_time_ms):
-  config = all_configs.configs.add()
-  config.packet_send_interval_ms = packet_send_interval_ms
-  config.packet_size = packet_size
-  config.execution_time_ms = execution_time_ms
-
-def main():
-  all_configs = network_tester_config_pb2.NetworkTesterAllConfigs()
-  AddConfig(all_configs, 10, 50, 200)
-  AddConfig(all_configs, 10, 100, 200)
-  with open("network_tester_config.dat", 'wb') as f:
-    f.write(all_configs.SerializeToString())
-
-if __name__ == "__main__":
-  main()
diff --git a/rtc_tools/network_tester/jni.cpp b/rtc_tools/network_tester/jni.cpp
deleted file mode 100644
index b849afb..0000000
--- a/rtc_tools/network_tester/jni.cpp
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- *  Copyright 2017 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 <jni.h>
-#undef JNIEXPORT
-#define JNIEXPORT __attribute__((visibility("default")))
-#include <string>
-
-#include "webrtc/rtc_tools/network_tester/test_controller.h"
-
-extern "C" JNIEXPORT jlong JNICALL
-Java_com_google_media_networktester_NetworkTester_CreateTestController(
-    JNIEnv* jni,
-    jclass) {
-  return reinterpret_cast<intptr_t>(new webrtc::TestController(
-      0, 0, "/mnt/sdcard/network_tester_client_config.dat",
-      "/mnt/sdcard/network_tester_client_packet_log.dat"));
-}
-
-extern "C" JNIEXPORT void JNICALL
-Java_com_google_media_networktester_NetworkTester_TestControllerConnect(
-    JNIEnv* jni,
-    jclass,
-    jlong native_pointer) {
-  reinterpret_cast<webrtc::TestController*>(native_pointer)
-      ->SendConnectTo("85.195.237.107", 9090);
-}
-
-extern "C" JNIEXPORT bool JNICALL
-Java_com_google_media_networktester_NetworkTester_TestControllerIsDone(
-    JNIEnv* jni,
-    jclass,
-    jlong native_pointer) {
-  return reinterpret_cast<webrtc::TestController*>(native_pointer)
-      ->IsTestDone();
-}
-
-extern "C" JNIEXPORT void JNICALL
-Java_com_google_media_networktester_NetworkTester_TestControllerRun(
-    JNIEnv* jni,
-    jclass,
-    jlong native_pointer) {
-  reinterpret_cast<webrtc::TestController*>(native_pointer)->Run();
-}
-
-extern "C" JNIEXPORT void JNICALL
-Java_com_google_media_networktester_NetworkTester_DestroyTestController(
-    JNIEnv* jni,
-    jclass,
-    jlong native_pointer) {
-  webrtc::TestController* test_controller =
-      reinterpret_cast<webrtc::TestController*>(native_pointer);
-  if (test_controller) {
-    delete test_controller;
-  }
-}
diff --git a/rtc_tools/network_tester/network_tester_config.proto b/rtc_tools/network_tester/network_tester_config.proto
deleted file mode 100644
index a911dc1..0000000
--- a/rtc_tools/network_tester/network_tester_config.proto
+++ /dev/null
@@ -1,14 +0,0 @@
-syntax = "proto2";
-option optimize_for = LITE_RUNTIME;
-package webrtc.network_tester.config;
-
-message NetworkTesterConfig {
-  optional int32 packet_send_interval_ms = 1;
-  optional float packet_size = 2;
-  optional int32 execution_time_ms = 3;
-}
-
-message NetworkTesterAllConfigs {
-  repeated NetworkTesterConfig configs = 1;
-}
-
diff --git a/rtc_tools/network_tester/network_tester_packet.proto b/rtc_tools/network_tester/network_tester_packet.proto
deleted file mode 100644
index c3bcec5..0000000
--- a/rtc_tools/network_tester/network_tester_packet.proto
+++ /dev/null
@@ -1,18 +0,0 @@
-syntax = "proto2";
-option optimize_for = LITE_RUNTIME;
-package webrtc.network_tester.packet;
-
-message NetworkTesterPacket {
-  enum Type {
-    HAND_SHAKING = 0;
-    TEST_START = 1;
-    TEST_DATA = 2;
-    TEST_DONE = 3;
-  }
-
-  optional Type type = 1;
-  optional int64 send_timestamp = 2;
-  optional int64 arrival_timestamp = 3;
-  optional int64 sequence_number = 4;
-  optional int32 packet_size = 5;
-}
diff --git a/rtc_tools/network_tester/network_tester_unittest.cc b/rtc_tools/network_tester/network_tester_unittest.cc
deleted file mode 100644
index d3958be..0000000
--- a/rtc_tools/network_tester/network_tester_unittest.cc
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- *  Copyright (c) 2017 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.
- */
-
-
-#ifdef WEBRTC_NETWORK_TESTER_TEST_ENABLED
-
-#include "webrtc/rtc_tools/network_tester/test_controller.h"
-
-#include "webrtc/rtc_base/gunit.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/testsupport/fileutils.h"
-
-namespace webrtc {
-
-TEST(NetworkTesterTest, ServerClient) {
-  TestController client(
-      0, 0, webrtc::test::ResourcePath("network_tester/client_config", "dat"),
-      webrtc::test::OutputPath() + "client_packet_log.dat");
-  TestController server(
-      9090, 9090,
-      webrtc::test::ResourcePath("network_tester/server_config", "dat"),
-      webrtc::test::OutputPath() + "server_packet_log.dat");
-  client.SendConnectTo("127.0.0.1", 9090);
-  EXPECT_TRUE_WAIT(server.IsTestDone() && client.IsTestDone(), 2000);
-}
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_NETWORK_TESTER_TEST_ENABLED
diff --git a/rtc_tools/network_tester/packet_logger.cc b/rtc_tools/network_tester/packet_logger.cc
deleted file mode 100644
index ad93e71..0000000
--- a/rtc_tools/network_tester/packet_logger.cc
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- *  Copyright 2017 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/rtc_tools/network_tester/packet_logger.h"
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/protobuf_utils.h"
-
-namespace webrtc {
-
-PacketLogger::PacketLogger(const std::string& log_file_path)
-    : packet_logger_stream_(log_file_path,
-                            std::ios_base::out | std::ios_base::binary) {
-  RTC_DCHECK(packet_logger_stream_.is_open());
-  RTC_DCHECK(packet_logger_stream_.good());
-}
-
-PacketLogger::~PacketLogger() = default;
-
-void PacketLogger::LogPacket(const NetworkTesterPacket& packet) {
-  // The protobuffer message will be saved in the following format to the file:
-  // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-  // |      1 byte      |  X byte |      1 byte      | ... |  X byte |
-  // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-  // | Size of the next | proto   | Size of the next | ... | proto   |
-  // | proto message    | message | proto message    |     | message |
-  // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-  ProtoString packet_data;
-  packet.SerializeToString(&packet_data);
-  RTC_DCHECK_LE(packet_data.length(), 255);
-  RTC_DCHECK_GE(packet_data.length(), 0);
-  char proto_size = packet_data.length();
-  packet_logger_stream_.write(&proto_size, sizeof(proto_size));
-  packet_logger_stream_.write(packet_data.data(), packet_data.length());
-}
-
-}  // namespace webrtc
diff --git a/rtc_tools/network_tester/packet_logger.h b/rtc_tools/network_tester/packet_logger.h
deleted file mode 100644
index 79923b6..0000000
--- a/rtc_tools/network_tester/packet_logger.h
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- *  Copyright 2017 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_RTC_TOOLS_NETWORK_TESTER_PACKET_LOGGER_H_
-#define WEBRTC_RTC_TOOLS_NETWORK_TESTER_PACKET_LOGGER_H_
-
-#include <fstream>
-#include <string>
-
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/ignore_wundef.h"
-
-#ifdef WEBRTC_NETWORK_TESTER_PROTO
-RTC_PUSH_IGNORING_WUNDEF()
-#include "webrtc/rtc_tools/network_tester/network_tester_packet.pb.h"
-RTC_POP_IGNORING_WUNDEF()
-using webrtc::network_tester::packet::NetworkTesterPacket;
-#else
-class NetworkTesterPacket;
-#endif  // WEBRTC_NETWORK_TESTER_PROTO
-
-namespace webrtc {
-
-class PacketLogger {
- public:
-  explicit PacketLogger(const std::string& log_file_path);
-  ~PacketLogger();
-
-  void LogPacket(const NetworkTesterPacket& packet);
-
- private:
-  std::ofstream packet_logger_stream_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(PacketLogger);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_RTC_TOOLS_NETWORK_TESTER_PACKET_LOGGER_H_
diff --git a/rtc_tools/network_tester/packet_sender.cc b/rtc_tools/network_tester/packet_sender.cc
deleted file mode 100644
index 6568ba0..0000000
--- a/rtc_tools/network_tester/packet_sender.cc
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- *  Copyright 2017 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/rtc_tools/network_tester/packet_sender.h"
-
-#include <algorithm>
-#include <string>
-#include <utility>
-
-#include "webrtc/rtc_base/timeutils.h"
-#include "webrtc/rtc_tools/network_tester/config_reader.h"
-#include "webrtc/rtc_tools/network_tester/test_controller.h"
-
-namespace webrtc {
-
-namespace {
-
-class SendPacketTask : public rtc::QueuedTask {
- public:
-  explicit SendPacketTask(PacketSender* packet_sender)
-      : target_time_ms_(rtc::TimeMillis()), packet_sender_(packet_sender) {}
-
- private:
-  bool Run() override {
-    if (packet_sender_->IsSending()) {
-      packet_sender_->SendPacket();
-      target_time_ms_ += packet_sender_->GetSendIntervalMs();
-      int64_t delay_ms = std::max(static_cast<int64_t>(0),
-                                  target_time_ms_ - rtc::TimeMillis());
-      rtc::TaskQueue::Current()->PostDelayedTask(
-          std::unique_ptr<QueuedTask>(this), delay_ms);
-      return false;
-    } else {
-      return true;
-    }
-  }
-  int64_t target_time_ms_;
-  PacketSender* const packet_sender_;
-};
-
-class UpdateTestSettingTask : public rtc::QueuedTask {
- public:
-  UpdateTestSettingTask(PacketSender* packet_sender,
-                        std::unique_ptr<ConfigReader> config_reader)
-      : packet_sender_(packet_sender),
-        config_reader_(std::move(config_reader)) {}
-
- private:
-  bool Run() override {
-    auto config = config_reader_->GetNextConfig();
-    if (config) {
-      packet_sender_->UpdateTestSetting((*config).packet_size,
-                                        (*config).packet_send_interval_ms);
-      rtc::TaskQueue::Current()->PostDelayedTask(
-          std::unique_ptr<QueuedTask>(this), (*config).execution_time_ms);
-      return false;
-    } else {
-      packet_sender_->StopSending();
-      return true;
-    }
-  }
-  PacketSender* const packet_sender_;
-  const std::unique_ptr<ConfigReader> config_reader_;
-};
-
-}  // namespace
-
-PacketSender::PacketSender(TestController* test_controller,
-                           const std::string& config_file_path)
-    : packet_size_(0),
-      send_interval_ms_(0),
-      sequence_number_(0),
-      sending_(false),
-      config_file_path_(config_file_path),
-      test_controller_(test_controller),
-      worker_queue_("Packet Sender", rtc::TaskQueue::Priority::HIGH) {}
-
-PacketSender::~PacketSender() = default;
-
-void PacketSender::StartSending() {
-  worker_queue_checker_.Detach();
-  worker_queue_.PostTask([this]() {
-    RTC_DCHECK_CALLED_SEQUENTIALLY(&worker_queue_checker_);
-    sending_ = true;
-  });
-  worker_queue_.PostTask(
-      std::unique_ptr<rtc::QueuedTask>(new UpdateTestSettingTask(
-          this,
-          std::unique_ptr<ConfigReader>(new ConfigReader(config_file_path_)))));
-  worker_queue_.PostTask(
-      std::unique_ptr<rtc::QueuedTask>(new SendPacketTask(this)));
-}
-
-void PacketSender::StopSending() {
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&worker_queue_checker_);
-  sending_ = false;
-  test_controller_->OnTestDone();
-}
-
-bool PacketSender::IsSending() const {
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&worker_queue_checker_);
-  return sending_;
-}
-
-void PacketSender::SendPacket() {
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&worker_queue_checker_);
-  NetworkTesterPacket packet;
-  packet.set_type(NetworkTesterPacket::TEST_DATA);
-  packet.set_sequence_number(sequence_number_++);
-  packet.set_send_timestamp(rtc::TimeMicros());
-  test_controller_->SendData(packet, rtc::Optional<size_t>(packet_size_));
-}
-
-int64_t PacketSender::GetSendIntervalMs() const {
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&worker_queue_checker_);
-  return send_interval_ms_;
-}
-
-void PacketSender::UpdateTestSetting(size_t packet_size,
-                                     int64_t send_interval_ms) {
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&worker_queue_checker_);
-  send_interval_ms_ = send_interval_ms;
-  packet_size_ = packet_size;
-}
-
-}  // namespace webrtc
diff --git a/rtc_tools/network_tester/packet_sender.h b/rtc_tools/network_tester/packet_sender.h
deleted file mode 100644
index 78c3ab8..0000000
--- a/rtc_tools/network_tester/packet_sender.h
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- *  Copyright 2017 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_RTC_TOOLS_NETWORK_TESTER_PACKET_SENDER_H_
-#define WEBRTC_RTC_TOOLS_NETWORK_TESTER_PACKET_SENDER_H_
-
-#include <memory>
-#include <string>
-
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/ignore_wundef.h"
-#include "webrtc/rtc_base/sequenced_task_checker.h"
-#include "webrtc/rtc_base/task_queue.h"
-
-#ifdef WEBRTC_NETWORK_TESTER_PROTO
-RTC_PUSH_IGNORING_WUNDEF()
-#include "webrtc/rtc_tools/network_tester/network_tester_packet.pb.h"
-RTC_POP_IGNORING_WUNDEF()
-using webrtc::network_tester::packet::NetworkTesterPacket;
-#else
-class NetworkTesterPacket;
-#endif  // WEBRTC_NETWORK_TESTER_PROTO
-
-namespace webrtc {
-
-class TestController;
-
-class PacketSender {
- public:
-  PacketSender(TestController* test_controller,
-               const std::string& config_file_path);
-  ~PacketSender();
-
-  void StartSending();
-  void StopSending();
-  bool IsSending() const;
-
-  void SendPacket();
-
-  int64_t GetSendIntervalMs() const;
-  void UpdateTestSetting(size_t packet_size, int64_t send_interval_ms);
-
- private:
-  rtc::SequencedTaskChecker worker_queue_checker_;
-  size_t packet_size_ RTC_ACCESS_ON(worker_queue_checker_);
-  int64_t send_interval_ms_ RTC_ACCESS_ON(worker_queue_checker_);
-  int64_t sequence_number_ RTC_ACCESS_ON(worker_queue_checker_);
-  bool sending_ RTC_ACCESS_ON(worker_queue_checker_);
-  const std::string config_file_path_;
-  TestController* const test_controller_;
-  rtc::TaskQueue worker_queue_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(PacketSender);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_RTC_TOOLS_NETWORK_TESTER_PACKET_SENDER_H_
diff --git a/rtc_tools/network_tester/parse_packet_log.py b/rtc_tools/network_tester/parse_packet_log.py
deleted file mode 100755
index 98fd0f6..0000000
--- a/rtc_tools/network_tester/parse_packet_log.py
+++ /dev/null
@@ -1,147 +0,0 @@
-#  Copyright (c) 2017 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.
-
-#  To run this script please copy "out/<build_name>/pyproto/webrtc/rtc_tools/
-#  network_tester/network_tester_packet_pb2.py" next to this script.
-#  The you can run this script with:
-#  "python parse_packet_log.py -f packet_log.dat"
-#  for more information call:
-#  "python parse_packet_log.py --help"
-
-from optparse import OptionParser
-import struct
-
-import matplotlib.pyplot as plt
-
-import network_tester_packet_pb2
-
-def GetSize(file_to_parse):
-  data = file_to_parse.read(1)
-  if data == '':
-    return 0
-  return struct.unpack('<b', data)[0]
-
-
-def ParsePacketLog(packet_log_file_to_parse):
-  packets = []
-  with open(packet_log_file_to_parse, 'rb') as file_to_parse:
-    while True:
-      size = GetSize(file_to_parse)
-      if size == 0:
-        break
-      try:
-        packet = network_tester_packet_pb2.NetworkTesterPacket()
-        packet.ParseFromString(file_to_parse.read(size))
-        packets.append(packet)
-      except IOError:
-        break
-  return packets
-
-
-def GetTimeAxis(packets):
-  first_arrival_time = packets[0].arrival_timestamp
-  return [(packet.arrival_timestamp - first_arrival_time) / 1000000.0
-          for packet in packets]
-
-
-def CreateSendTimeDiffPlot(packets, plot):
-  first_send_time_diff = (
-      packets[0].arrival_timestamp - packets[0].send_timestamp)
-  y = [(packet.arrival_timestamp - packet.send_timestamp) - first_send_time_diff
-       for packet in packets]
-  plot.grid(True)
-  plot.set_title("SendTime difference [us]")
-  plot.plot(GetTimeAxis(packets), y)
-
-
-class MovingAverageBitrate(object):
-
-  def __init__(self):
-    self.packet_window = []
-    self.window_time = 1000000
-    self.bytes = 0
-    self.latest_packet_time = 0
-    self.send_interval = 0
-
-  def RemoveOldPackets(self):
-    for packet in self.packet_window:
-      if (self.latest_packet_time - packet.arrival_timestamp >
-          self.window_time):
-        self.bytes = self.bytes - packet.packet_size
-        self.packet_window.remove(packet)
-
-  def AddPacket(self, packet):
-    """This functions returns bits / second"""
-    self.send_interval = packet.arrival_timestamp - self.latest_packet_time
-    self.latest_packet_time = packet.arrival_timestamp
-    self.RemoveOldPackets()
-    self.packet_window.append(packet)
-    self.bytes = self.bytes + packet.packet_size
-    return self.bytes * 8
-
-
-def CreateReceiveBiratePlot(packets, plot):
-  bitrate = MovingAverageBitrate()
-  y = [bitrate.AddPacket(packet) for packet in packets]
-  plot.grid(True)
-  plot.set_title("Receive birate [bps]")
-  plot.plot(GetTimeAxis(packets), y)
-
-
-def CreatePacketlossPlot(packets, plot):
-  packets_look_up = {}
-  first_sequence_number = packets[0].sequence_number
-  last_sequence_number = packets[-1].sequence_number
-  for packet in packets:
-    packets_look_up[packet.sequence_number] = packet
-  y = []
-  x = []
-  first_arrival_time = 0
-  last_arrival_time = 0
-  last_arrival_time_diff = 0
-  for sequence_number in range(first_sequence_number, last_sequence_number + 1):
-    if sequence_number in packets_look_up:
-      y.append(0)
-      if first_arrival_time == 0:
-        first_arrival_time = packets_look_up[sequence_number].arrival_timestamp
-      x_time = (packets_look_up[sequence_number].arrival_timestamp -
-                first_arrival_time)
-      if last_arrival_time != 0:
-        last_arrival_time_diff = x_time - last_arrival_time
-      last_arrival_time = x_time
-      x.append(x_time / 1000000.0)
-    else:
-      if last_arrival_time != 0 and last_arrival_time_diff != 0:
-        x.append((last_arrival_time + last_arrival_time_diff) / 1000000.0)
-        y.append(1)
-  plot.grid(True)
-  plot.set_title("Lost packets [0/1]")
-  plot.plot(x, y)
-
-
-def main():
-  parser = OptionParser()
-  parser.add_option("-f",
-                    "--packet_log_file",
-                    dest="packet_log_file",
-                    help="packet_log file to parse")
-
-  options = parser.parse_args()[0]
-
-  packets = ParsePacketLog(options.packet_log_file)
-  f, plots = plt.subplots(3, sharex=True)
-  plt.xlabel('time [sec]')
-  CreateSendTimeDiffPlot(packets, plots[0])
-  CreateReceiveBiratePlot(packets, plots[1])
-  CreatePacketlossPlot(packets, plots[2])
-  f.subplots_adjust(hspace=0.3)
-  plt.show()
-
-
-if __name__ == "__main__":
-  main()
diff --git a/rtc_tools/network_tester/server.cc b/rtc_tools/network_tester/server.cc
deleted file mode 100644
index c358f39..0000000
--- a/rtc_tools/network_tester/server.cc
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- *  Copyright 2017 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/rtc_tools/network_tester/test_controller.h"
-
-int main() {
-  webrtc::TestController server(9090, 9090, "server_config.dat",
-                                "server_packet_log.dat");
-  while (!server.IsTestDone()) {
-    server.Run();
-  }
-}
diff --git a/rtc_tools/network_tester/test_controller.cc b/rtc_tools/network_tester/test_controller.cc
deleted file mode 100644
index 45b1de2..0000000
--- a/rtc_tools/network_tester/test_controller.cc
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- *  Copyright 2017 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/rtc_tools/network_tester/test_controller.h"
-
-namespace webrtc {
-
-TestController::TestController(int min_port,
-                               int max_port,
-                               const std::string& config_file_path,
-                               const std::string& log_file_path)
-    : socket_factory_(rtc::ThreadManager::Instance()->WrapCurrentThread()),
-      config_file_path_(config_file_path),
-      packet_logger_(log_file_path),
-      local_test_done_(false),
-      remote_test_done_(false) {
-  RTC_DCHECK_RUN_ON(&test_controller_thread_checker_);
-  packet_sender_checker_.Detach();
-  send_data_.fill(42);
-  auto socket =
-      std::unique_ptr<rtc::AsyncPacketSocket>(socket_factory_.CreateUdpSocket(
-          rtc::SocketAddress(rtc::GetAnyIP(AF_INET), 0), min_port, max_port));
-  socket->SignalReadPacket.connect(this, &TestController::OnReadPacket);
-  udp_transport_.reset(
-      new cricket::UdpTransport("network tester transport", std::move(socket)));
-}
-
-void TestController::SendConnectTo(const std::string& hostname, int port) {
-  RTC_DCHECK_RUN_ON(&test_controller_thread_checker_);
-  udp_transport_->SetRemoteAddress(rtc::SocketAddress(hostname, port));
-  NetworkTesterPacket packet;
-  packet.set_type(NetworkTesterPacket::HAND_SHAKING);
-  SendData(packet, rtc::Optional<size_t>());
-  rtc::CritScope scoped_lock(&local_test_done_lock_);
-  local_test_done_ = false;
-  remote_test_done_ = false;
-}
-
-void TestController::Run() {
-  RTC_DCHECK_RUN_ON(&test_controller_thread_checker_);
-  rtc::Thread::Current()->ProcessMessages(0);
-}
-
-void TestController::SendData(const NetworkTesterPacket& packet,
-                              rtc::Optional<size_t> data_size) {
-  // Can be call from packet_sender or from test_controller thread.
-  size_t packet_size = packet.ByteSize();
-  send_data_[0] = packet_size;
-  packet_size++;
-  packet.SerializeToArray(&send_data_[1], std::numeric_limits<char>::max());
-  if (data_size && *data_size > packet_size)
-    packet_size = *data_size;
-  udp_transport_->SendPacket(send_data_.data(), packet_size,
-                             rtc::PacketOptions(), 0);
-}
-
-void TestController::OnTestDone() {
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&packet_sender_checker_);
-  NetworkTesterPacket packet;
-  packet.set_type(NetworkTesterPacket::TEST_DONE);
-  SendData(packet, rtc::Optional<size_t>());
-  rtc::CritScope scoped_lock(&local_test_done_lock_);
-  local_test_done_ = true;
-}
-
-bool TestController::IsTestDone() {
-  RTC_DCHECK_RUN_ON(&test_controller_thread_checker_);
-  rtc::CritScope scoped_lock(&local_test_done_lock_);
-  return local_test_done_ && remote_test_done_;
-}
-
-void TestController::OnReadPacket(rtc::AsyncPacketSocket* socket,
-                                  const char* data,
-                                  size_t len,
-                                  const rtc::SocketAddress& remote_addr,
-                                  const rtc::PacketTime& packet_time) {
-  RTC_DCHECK_RUN_ON(&test_controller_thread_checker_);
-  size_t packet_size = data[0];
-  std::string receive_data(&data[1], packet_size);
-  NetworkTesterPacket packet;
-  packet.ParseFromString(receive_data);
-  RTC_CHECK(packet.has_type());
-  switch (packet.type()) {
-    case NetworkTesterPacket::HAND_SHAKING: {
-      NetworkTesterPacket packet;
-      packet.set_type(NetworkTesterPacket::TEST_START);
-      udp_transport_->SetRemoteAddress(remote_addr);
-      SendData(packet, rtc::Optional<size_t>());
-      packet_sender_.reset(new PacketSender(this, config_file_path_));
-      packet_sender_->StartSending();
-      rtc::CritScope scoped_lock(&local_test_done_lock_);
-      local_test_done_ = false;
-      remote_test_done_ = false;
-      break;
-    }
-    case NetworkTesterPacket::TEST_START: {
-      packet_sender_.reset(new PacketSender(this, config_file_path_));
-      packet_sender_->StartSending();
-      rtc::CritScope scoped_lock(&local_test_done_lock_);
-      local_test_done_ = false;
-      remote_test_done_ = false;
-      break;
-    }
-    case NetworkTesterPacket::TEST_DATA: {
-      packet.set_arrival_timestamp(packet_time.timestamp);
-      packet.set_packet_size(len);
-      packet_logger_.LogPacket(packet);
-      break;
-    }
-    case NetworkTesterPacket::TEST_DONE: {
-      remote_test_done_ = true;
-      break;
-    }
-    default: { RTC_NOTREACHED(); }
-  }
-}
-
-}  // namespace webrtc
diff --git a/rtc_tools/network_tester/test_controller.h b/rtc_tools/network_tester/test_controller.h
deleted file mode 100644
index 870ca47..0000000
--- a/rtc_tools/network_tester/test_controller.h
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- *  Copyright 2017 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_RTC_TOOLS_NETWORK_TESTER_TEST_CONTROLLER_H_
-#define WEBRTC_RTC_TOOLS_NETWORK_TESTER_TEST_CONTROLLER_H_
-
-#include <array>
-#include <limits>
-#include <memory>
-#include <string>
-#include <utility>
-
-#include "webrtc/p2p/base/basicpacketsocketfactory.h"
-#include "webrtc/p2p/base/udptransport.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/ignore_wundef.h"
-#include "webrtc/rtc_tools/network_tester/packet_logger.h"
-#include "webrtc/rtc_tools/network_tester/packet_sender.h"
-
-#ifdef WEBRTC_NETWORK_TESTER_PROTO
-RTC_PUSH_IGNORING_WUNDEF()
-#include "webrtc/rtc_tools/network_tester/network_tester_packet.pb.h"
-RTC_POP_IGNORING_WUNDEF()
-using webrtc::network_tester::packet::NetworkTesterPacket;
-#else
-class NetworkTesterPacket;
-#endif  // WEBRTC_NETWORK_TESTER_PROTO
-
-namespace webrtc {
-
-constexpr size_t kEthernetMtu = 1500;
-
-class TestController : public sigslot::has_slots<> {
- public:
-  TestController(int min_port,
-                 int max_port,
-                 const std::string& config_file_path,
-                 const std::string& log_file_path);
-
-  void Run();
-
-  void SendConnectTo(const std::string& hostname, int port);
-
-  void SendData(const NetworkTesterPacket& packet,
-                rtc::Optional<size_t> data_size);
-
-  void OnTestDone();
-
-  bool IsTestDone();
-
- private:
-  void OnReadPacket(rtc::AsyncPacketSocket* socket,
-                    const char* data,
-                    size_t len,
-                    const rtc::SocketAddress& remote_addr,
-                    const rtc::PacketTime& packet_time);
-  rtc::ThreadChecker test_controller_thread_checker_;
-  rtc::SequencedTaskChecker packet_sender_checker_;
-  rtc::BasicPacketSocketFactory socket_factory_;
-  const std::string config_file_path_;
-  PacketLogger packet_logger_;
-  rtc::CriticalSection local_test_done_lock_;
-  bool local_test_done_ RTC_GUARDED_BY(local_test_done_lock_);
-  bool remote_test_done_;
-  std::array<char, kEthernetMtu> send_data_;
-  std::unique_ptr<cricket::UdpTransport> udp_transport_;
-  std::unique_ptr<PacketSender> packet_sender_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(TestController);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_RTC_TOOLS_NETWORK_TESTER_TEST_CONTROLLER_H_
diff --git a/rtc_tools/psnr_ssim_analyzer/psnr_ssim_analyzer.cc b/rtc_tools/psnr_ssim_analyzer/psnr_ssim_analyzer.cc
deleted file mode 100644
index b20875a..0000000
--- a/rtc_tools/psnr_ssim_analyzer/psnr_ssim_analyzer.cc
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- *  Copyright (c) 2012 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 <limits.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-#include <map>
-#include <string>
-#include <vector>
-
-#include "webrtc/rtc_tools/frame_analyzer/video_quality_analysis.h"
-#include "webrtc/rtc_tools/simple_command_line_parser.h"
-
-#define MAX_NUM_FRAMES_PER_FILE INT_MAX
-
-void CompareFiles(const char* reference_file_name, const char* test_file_name,
-                  const char* results_file_name, int width, int height) {
-  // Check if the reference_file_name ends with "y4m".
-  bool y4m_mode = false;
-  if (std::string(reference_file_name).find("y4m") != std::string::npos) {
-    y4m_mode = true;
-  }
-
-  FILE* results_file = fopen(results_file_name, "w");
-
-  int size = webrtc::test::GetI420FrameSize(width, height);
-
-  // Allocate buffers for test and reference frames.
-  uint8_t* test_frame = new uint8_t[size];
-  uint8_t* ref_frame = new uint8_t[size];
-
-  bool read_result = true;
-  for (int frame_counter = 0; frame_counter < MAX_NUM_FRAMES_PER_FILE;
-      ++frame_counter) {
-    read_result &= (y4m_mode) ? webrtc::test::ExtractFrameFromY4mFile(
-        reference_file_name, width, height, frame_counter, ref_frame):
-        webrtc::test::ExtractFrameFromYuvFile(reference_file_name, width,
-                                              height, frame_counter, ref_frame);
-    read_result &=  webrtc::test::ExtractFrameFromYuvFile(test_file_name, width,
-        height, frame_counter, test_frame);
-
-    if (!read_result)
-      break;
-
-    // Calculate the PSNR and SSIM.
-    double result_psnr = webrtc::test::CalculateMetrics(
-        webrtc::test::kPSNR, ref_frame, test_frame, width, height);
-    double result_ssim = webrtc::test::CalculateMetrics(
-        webrtc::test::kSSIM, ref_frame, test_frame, width, height);
-    fprintf(results_file, "Frame: %d, PSNR: %f, SSIM: %f\n", frame_counter,
-            result_psnr, result_ssim);
-  }
-  delete[] test_frame;
-  delete[] ref_frame;
-
-  fclose(results_file);
-}
-
-/*
- * A tool running PSNR and SSIM analysis on two videos - a reference video and a
- * test video. The two videos should be I420 YUV videos.
- * The tool just runs PSNR and SSIM on the corresponding frames in the test and
- * the reference videos until either the first or the second video runs out of
- * frames. The result is written in a results text file in the format:
- * Frame: <frame_number>, PSNR: <psnr_value>, SSIM: <ssim_value>
- * Frame: <frame_number>, ........
- *
- * The max value for PSNR is 48.0 (between equal frames), as for SSIM it is 1.0.
- *
- * Usage:
- * psnr_ssim_analyzer --reference_file=<name_of_file> --test_file=<name_of_file>
- * --results_file=<name_of_file> --width=<width_of_frames>
- * --height=<height_of_frames>
- */
-int main(int argc, char** argv) {
-  std::string program_name = argv[0];
-  std::string usage = "Runs PSNR and SSIM on two I420 videos and write the"
-      "results in a file.\n"
-      "Example usage:\n" + program_name + " --reference_file=ref.yuv "
-      "--test_file=test.yuv --results_file=results.txt --width=320 "
-      "--height=240\n"
-      "Command line flags:\n"
-      "  - width(int): The width of the reference and test files. Default: -1\n"
-      "  - height(int): The height of the reference and test files. "
-      " Default: -1\n"
-      "  - reference_file(string): The reference YUV file to compare against."
-      " Default: ref.yuv\n"
-      "  - test_file(string): The test YUV file to run the analysis for."
-      " Default: test_file.yuv\n"
-      "  - results_file(string): The full name of the file where the results "
-      "will be written. Default: results.txt\n";
-
-  webrtc::test::CommandLineParser parser;
-
-  // Init the parser and set the usage message
-  parser.Init(argc, argv);
-  parser.SetUsageMessage(usage);
-
-  parser.SetFlag("width", "-1");
-  parser.SetFlag("height", "-1");
-  parser.SetFlag("results_file", "results.txt");
-  parser.SetFlag("reference_file", "ref.yuv");
-  parser.SetFlag("test_file", "test.yuv");
-  parser.SetFlag("results_file", "results.txt");
-  parser.SetFlag("help", "false");
-
-  parser.ProcessFlags();
-  if (parser.GetFlag("help") == "true") {
-    parser.PrintUsageMessage();
-    exit(EXIT_SUCCESS);
-  }
-  parser.PrintEnteredFlags();
-
-  int width = strtol((parser.GetFlag("width")).c_str(), NULL, 10);
-  int height = strtol((parser.GetFlag("height")).c_str(), NULL, 10);
-
-  if (width <= 0 || height <= 0) {
-    fprintf(stderr, "Error: width or height cannot be <= 0!\n");
-    return -1;
-  }
-
-  CompareFiles(parser.GetFlag("reference_file").c_str(),
-               parser.GetFlag("test_file").c_str(),
-               parser.GetFlag("results_file").c_str(), width, height);
-}
diff --git a/rtc_tools/py_event_log_analyzer/README b/rtc_tools/py_event_log_analyzer/README
deleted file mode 100644
index 6c77136..0000000
--- a/rtc_tools/py_event_log_analyzer/README
+++ /dev/null
@@ -1,32 +0,0 @@
-This file describes how to set up and use the RTP log analyzer.
-
-First build the tool with
-
-    ninja -C out/my_build webrtc:rtp_analyzer
-
-The tool is built by default, so
-
-    ninja -C out/my_build
-
-is enough.
-
-After building, run the tool as follows:
-
-    ./out/my_build/rtp_analyzer.sh [options] <rtc event log>
-
-where <rtc event log> is a recorded RTC event log, which is stored in
-protobuf format. Such logs are generated in multiple ways, e.g. by
-Chrome through the chrome://webrtc-internals page.
-
-Options:
-  -h, --help            show this help message and exit
-  --dump_header_to_stdout
-                        print header info to stdout; similar to rtp_analyze
-  --query_sample_rate   always query user for real sample rate
-
-The script has been tested to work in python versions 3.4.1 and 2.7.6,
-but should work in all python versions.
-
-Working versions of NumPy (http://www.numpy.org/) and matplotlib
-(http://matplotlib.org/) are needed to run this tool. See this link
-with installation instructions (http://www.scipy.org/install.html).
diff --git a/rtc_tools/py_event_log_analyzer/misc.py b/rtc_tools/py_event_log_analyzer/misc.py
deleted file mode 100644
index 629497c..0000000
--- a/rtc_tools/py_event_log_analyzer/misc.py
+++ /dev/null
@@ -1,87 +0,0 @@
-#  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.
-
-"""Utility functions for calculating statistics.
-"""
-
-from __future__ import division
-import collections
-import sys
-
-
-def CountReordered(sequence_numbers):
-  """Returns number of reordered indices.
-
-  A reordered index is an index `i` for which sequence_numbers[i] >=
-  sequence_numbers[i + 1]
-  """
-  return sum(1 for (s1, s2) in zip(sequence_numbers,
-                                   sequence_numbers[1:]) if
-             s1 >= s2)
-
-
-def SsrcNormalizedSizeTable(data_points):
-  """Counts proportion of data for every SSRC.
-
-  Args:
-     data_points: list of pb_parse.DataPoint
-
-  Returns:
-     A dictionary mapping from every SSRC in the data points. The
-     value of an SSRC `s` is the proportion of sizes of packets with
-     SSRC `s` to the total size of all packets.
-
-  """
-  mapping = collections.defaultdict(int)
-  for point in data_points:
-    mapping[point.ssrc] += point.size
-  return NormalizeCounter(mapping)
-
-
-def NormalizeCounter(counter):
-  """Returns a normalized version of the dictionary `counter`.
-
-  Does not modify `counter`.
-
-  Returns:
-    A new dictionary, in which every value in `counter`
-    has been divided by the total to sum up to 1.
-  """
-  total = sum(counter.values())
-  return {key: counter[key] / total for key in counter}
-
-
-def Unwrap(data, mod):
-  """Returns `data` unwrapped modulo `mod`. Does not modify data.
-
-  Adds integer multiples of mod to all elements of data except the
-  first, such that all pairs of consecutive elements (a, b) satisfy
-  -mod / 2 <= b - a < mod / 2.
-
-  E.g. Unwrap([0, 1, 2, 0, 1, 2, 7, 8], 3) -> [0, 1, 2, 3,
-  4, 5, 4, 5]
-  """
-  lst = data[:]
-  for i in range(1, len(data)):
-    lst[i] = lst[i - 1] + (lst[i] - lst[i - 1] +
-                           mod // 2) % mod - (mod // 2)
-  return lst
-
-
-def SsrcDirections(data_points):
-  ssrc_is_incoming = {}
-  for point in data_points:
-    ssrc_is_incoming[point.ssrc] = point.incoming
-  return ssrc_is_incoming
-
-
-# Python 2/3-compatible input function
-if sys.version_info[0] <= 2:
-  get_input = raw_input  # pylint: disable=invalid-name
-else:
-  get_input = input  # pylint: disable=invalid-name
diff --git a/rtc_tools/py_event_log_analyzer/misc_test.py b/rtc_tools/py_event_log_analyzer/misc_test.py
deleted file mode 100755
index 33449a7..0000000
--- a/rtc_tools/py_event_log_analyzer/misc_test.py
+++ /dev/null
@@ -1,72 +0,0 @@
-#!/usr/bin/env python
-#  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.
-
-"""Run the tests with
-
-      python misc_test.py
-or
-      python3 misc_test.py
-"""
-
-from __future__ import division
-import random
-import unittest
-
-import misc
-
-
-class TestMisc(unittest.TestCase):
-  def testUnwrapMod3(self):
-    data = [0, 1, 2, 0, -1, -2, -3, -4]
-    unwrapped_3 = misc.Unwrap(data, 3)
-    self.assertEqual([0, 1, 2, 3, 2, 1, 0, -1], unwrapped_3)
-
-  def testUnwrapMod4(self):
-    data = [0, 1, 2, 0, -1, -2, -3, -4]
-    unwrapped_4 = misc.Unwrap(data, 4)
-    self.assertEqual([0, 1, 2, 0, -1, -2, -3, -4], unwrapped_4)
-
-  def testDataShouldNotChangeAfterUnwrap(self):
-    data = [0, 1, 2, 0, -1, -2, -3, -4]
-    _ = misc.Unwrap(data, 4)
-
-    self.assertEqual([0, 1, 2, 0, -1, -2, -3, -4], data)
-
-  def testRandomlyMultiplesOfModAdded(self):
-    # `unwrap` definition says only multiples of mod are added.
-    random_data = [random.randint(0, 9) for _ in range(100)]
-
-    for mod in range(1, 100):
-      random_data_unwrapped_mod = misc.Unwrap(random_data, mod)
-
-      for (old_a, a) in zip(random_data, random_data_unwrapped_mod):
-        self.assertEqual((old_a - a) % mod, 0)
-
-  def testRandomlyAgainstInequalityDefinition(self):
-    # Data has to satisfy -mod/2 <= difference < mod/2 for every
-    # difference between consecutive values after unwrap.
-    random_data = [random.randint(0, 9) for _ in range(100)]
-
-    for mod in range(1, 100):
-      random_data_unwrapped_mod = misc.Unwrap(random_data, mod)
-
-      for (a, b) in zip(random_data_unwrapped_mod,
-                        random_data_unwrapped_mod[1:]):
-        self.assertTrue(-mod / 2 <= b - a < mod / 2)
-
-  def testRandomlyDataShouldNotChangeAfterUnwrap(self):
-    random_data = [random.randint(0, 9) for _ in range(100)]
-    random_data_copy = random_data[:]
-    for mod in range(1, 100):
-      _ = misc.Unwrap(random_data, mod)
-
-      self.assertEqual(random_data, random_data_copy)
-
-if __name__ == "__main__":
-  unittest.main()
diff --git a/rtc_tools/py_event_log_analyzer/pb_parse.py b/rtc_tools/py_event_log_analyzer/pb_parse.py
deleted file mode 100644
index f4c8a33..0000000
--- a/rtc_tools/py_event_log_analyzer/pb_parse.py
+++ /dev/null
@@ -1,52 +0,0 @@
-#  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.
-
-"""Parses protobuf RTC dumps."""
-
-from __future__ import division
-import struct
-import pyproto.webrtc.logging.rtc_event_log.rtc_event_log_pb2 as rtc_pb
-
-
-class DataPoint(object):
-  """Simple container class for RTP events."""
-
-  def __init__(self, rtp_header_str, packet_size,
-               arrival_timestamp_us, incoming):
-    """Builds a data point by parsing an RTP header, size and arrival time.
-
-    RTP header structure is defined in RFC 3550 section 5.1.
-    """
-    self.size = packet_size
-    self.arrival_timestamp_ms = arrival_timestamp_us / 1000
-    self.incoming = incoming
-    header = struct.unpack_from("!HHII", rtp_header_str, 0)
-    (first2header_bytes, self.sequence_number, self.timestamp,
-     self.ssrc) = header
-    self.payload_type = first2header_bytes & 0b01111111
-    self.marker_bit = (first2header_bytes & 0b10000000) >> 7
-
-
-def ParseProtobuf(file_path):
-  """Parses RTC event log from protobuf file.
-
-  Args:
-       file_path: path to protobuf file of RTC event stream
-
-  Returns:
-    all RTP packet events from the event stream as a list of DataPoints
-  """
-  event_stream = rtc_pb.EventStream()
-  with open(file_path, "rb") as f:
-    event_stream.ParseFromString(f.read())
-
-  return [DataPoint(event.rtp_packet.header,
-                    event.rtp_packet.packet_length,
-                    event.timestamp_us, event.rtp_packet.incoming)
-          for event in event_stream.stream
-          if event.HasField("rtp_packet")]
diff --git a/rtc_tools/py_event_log_analyzer/rtp_analyzer.py b/rtc_tools/py_event_log_analyzer/rtp_analyzer.py
deleted file mode 100644
index 23e15fc..0000000
--- a/rtc_tools/py_event_log_analyzer/rtp_analyzer.py
+++ /dev/null
@@ -1,340 +0,0 @@
-#  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.
-
-"""Displays statistics and plots graphs from RTC protobuf dump."""
-
-from __future__ import division
-from __future__ import print_function
-
-import collections
-import optparse
-import os
-import sys
-
-import matplotlib.pyplot as plt
-import numpy
-
-import misc
-import pb_parse
-
-
-class RTPStatistics(object):
-  """Has methods for calculating and plotting RTP stream statistics."""
-
-  BANDWIDTH_SMOOTHING_WINDOW_SIZE = 10
-  PLOT_RESOLUTION_MS = 50
-
-  def __init__(self, data_points):
-    """Initializes object with data_points and computes simple statistics.
-
-    Computes percentages of number of packets and packet sizes by
-    SSRC.
-
-    Args:
-        data_points: list of pb_parse.DataPoints on which statistics are
-            calculated.
-
-    """
-
-    self.data_points = data_points
-    self.ssrc_frequencies = misc.NormalizeCounter(
-        collections.Counter([pt.ssrc for pt in self.data_points]))
-    self.ssrc_size_table = misc.SsrcNormalizedSizeTable(self.data_points)
-    self.bandwidth_kbps = None
-    self.smooth_bw_kbps = None
-
-  def PrintHeaderStatistics(self):
-    print("{:>6}{:>14}{:>14}{:>6}{:>6}{:>3}{:>11}".format(
-        "SeqNo", "TimeStamp", "SendTime", "Size", "PT", "M", "SSRC"))
-    for point in self.data_points:
-      print("{:>6}{:>14}{:>14}{:>6}{:>6}{:>3}{:>11}".format(
-          point.sequence_number, point.timestamp,
-          int(point.arrival_timestamp_ms), point.size, point.payload_type,
-          point.marker_bit, "0x{:x}".format(point.ssrc)))
-
-  def PrintSsrcInfo(self, ssrc_id, ssrc):
-    """Prints packet and size statistics for a given SSRC.
-
-    Args:
-        ssrc_id: textual identifier of SSRC printed beside statistics for it.
-        ssrc: SSRC by which to filter data and display statistics
-    """
-    filtered_ssrc = [point for point in self.data_points if point.ssrc
-                     == ssrc]
-    payloads = misc.NormalizeCounter(
-        collections.Counter([point.payload_type for point in
-                             filtered_ssrc]))
-
-    payload_info = "payload type(s): {}".format(
-        ", ".join(str(payload) for payload in  payloads))
-    print("{} 0x{:x} {}, {:.2f}% packets, {:.2f}% data".format(
-        ssrc_id, ssrc, payload_info, self.ssrc_frequencies[ssrc] * 100,
-        self.ssrc_size_table[ssrc] * 100))
-    print("  packet sizes:")
-    (bin_counts, bin_bounds) = numpy.histogram([point.size for point in
-                                                filtered_ssrc], bins=5,
-                                               density=False)
-    bin_proportions = bin_counts / sum(bin_counts)
-    print("\n".join([
-        " {:.1f} - {:.1f}: {:.2f}%".format(bin_bounds[i], bin_bounds[i + 1],
-                                           bin_proportions[i] * 100)
-        for i in range(len(bin_proportions))
-    ]))
-
-  def ChooseSsrc(self):
-    """Queries user for SSRC."""
-
-    if len(self.ssrc_frequencies) == 1:
-      chosen_ssrc = self.ssrc_frequencies[0][-1]
-      self.PrintSsrcInfo("", chosen_ssrc)
-      return chosen_ssrc
-
-    ssrc_is_incoming = misc.SsrcDirections(self.data_points)
-    incoming = [ssrc for ssrc in ssrc_is_incoming if ssrc_is_incoming[ssrc]]
-    outgoing = [ssrc for ssrc in ssrc_is_incoming if not ssrc_is_incoming[ssrc]]
-
-    print("\nIncoming:\n")
-    for (i, ssrc) in enumerate(incoming):
-      self.PrintSsrcInfo(i, ssrc)
-
-    print("\nOutgoing:\n")
-    for (i, ssrc) in enumerate(outgoing):
-      self.PrintSsrcInfo(i + len(incoming), ssrc)
-
-    while True:
-      chosen_index = int(misc.get_input("choose one> "))
-      if 0 <= chosen_index < len(self.ssrc_frequencies):
-        return (incoming + outgoing)[chosen_index]
-      else:
-        print("Invalid index!")
-
-  def FilterSsrc(self, chosen_ssrc):
-    """Filters and wraps data points.
-
-    Removes data points with `ssrc != chosen_ssrc`. Unwraps sequence
-    numbers and timestamps for the chosen selection.
-    """
-    self.data_points = [point for point in self.data_points if
-                        point.ssrc == chosen_ssrc]
-    unwrapped_sequence_numbers = misc.Unwrap(
-        [point.sequence_number for point in self.data_points], 2**16 - 1)
-    for (data_point, sequence_number) in zip(self.data_points,
-                                             unwrapped_sequence_numbers):
-      data_point.sequence_number = sequence_number
-
-    unwrapped_timestamps = misc.Unwrap([point.timestamp for point in
-                                        self.data_points], 2**32 - 1)
-
-    for (data_point, timestamp) in zip(self.data_points,
-                                       unwrapped_timestamps):
-      data_point.timestamp = timestamp
-
-  def PrintSequenceNumberStatistics(self):
-    seq_no_set = set(point.sequence_number for point in
-                     self.data_points)
-    missing_sequence_numbers = max(seq_no_set) - min(seq_no_set) + (
-        1 - len(seq_no_set))
-    print("Missing sequence numbers: {} out of {}  ({:.2f}%)".format(
-        missing_sequence_numbers,
-        len(seq_no_set),
-        100 * missing_sequence_numbers / len(seq_no_set)
-    ))
-    print("Duplicated packets: {}".format(len(self.data_points) -
-                                          len(seq_no_set)))
-    print("Reordered packets: {}".format(
-        misc.CountReordered([point.sequence_number for point in
-                             self.data_points])))
-
-  def EstimateFrequency(self, always_query_sample_rate):
-    """Estimates frequency and updates data.
-
-    Guesses the most probable frequency by looking at changes in
-    timestamps (RFC 3550 section 5.1), calculates clock drifts and
-    sending time of packets. Updates `self.data_points` with changes
-    in delay and send time.
-    """
-    delta_timestamp = (self.data_points[-1].timestamp -
-                       self.data_points[0].timestamp)
-    delta_arr_timestamp = float((self.data_points[-1].arrival_timestamp_ms -
-                                 self.data_points[0].arrival_timestamp_ms))
-    freq_est = delta_timestamp / delta_arr_timestamp
-
-    freq_vec = [8, 16, 32, 48, 90]
-    freq = None
-    for f in freq_vec:
-      if abs((freq_est - f) / f) < 0.05:
-        freq = f
-
-    print("Estimated frequency: {:.3f}kHz".format(freq_est))
-    if freq is None or always_query_sample_rate:
-      if not always_query_sample_rate:
-        print ("Frequency could not be guessed.", end=" ")
-      freq = int(misc.get_input("Input frequency (in kHz)> "))
-    else:
-      print("Guessed frequency: {}kHz".format(freq))
-
-    for point in self.data_points:
-      point.real_send_time_ms = (point.timestamp -
-                                 self.data_points[0].timestamp) / freq
-      point.delay = point.arrival_timestamp_ms - point.real_send_time_ms
-
-  def PrintDurationStatistics(self):
-    """Prints delay, clock drift and bitrate statistics."""
-
-    min_delay = min(point.delay for point in self.data_points)
-
-    for point in self.data_points:
-      point.absdelay = point.delay - min_delay
-
-    stream_duration_sender = self.data_points[-1].real_send_time_ms / 1000
-    print("Stream duration at sender: {:.1f} seconds".format(
-        stream_duration_sender
-    ))
-
-    arrival_timestamps_ms = [point.arrival_timestamp_ms for point in
-                             self.data_points]
-    stream_duration_receiver = (max(arrival_timestamps_ms) -
-                                min(arrival_timestamps_ms)) / 1000
-    print("Stream duration at receiver: {:.1f} seconds".format(
-        stream_duration_receiver
-    ))
-
-    print("Clock drift: {:.2f}%".format(
-        100 * (stream_duration_receiver / stream_duration_sender - 1)
-    ))
-
-    total_size = sum(point.size for point in self.data_points) * 8 / 1000
-    print("Send average bitrate: {:.2f} kbps".format(
-        total_size / stream_duration_sender))
-
-    print("Receive average bitrate: {:.2f} kbps".format(
-        total_size / stream_duration_receiver))
-
-  def RemoveReordered(self):
-    last = self.data_points[0]
-    data_points_ordered = [last]
-    for point in self.data_points[1:]:
-      if point.sequence_number > last.sequence_number and (
-          point.real_send_time_ms > last.real_send_time_ms):
-        data_points_ordered.append(point)
-        last = point
-    self.data_points = data_points_ordered
-
-  def ComputeBandwidth(self):
-    """Computes bandwidth averaged over several consecutive packets.
-
-    The number of consecutive packets used in the average is
-    BANDWIDTH_SMOOTHING_WINDOW_SIZE. Averaging is done with
-    numpy.correlate.
-    """
-    start_ms = self.data_points[0].real_send_time_ms
-    stop_ms = self.data_points[-1].real_send_time_ms
-    (self.bandwidth_kbps, _) = numpy.histogram(
-        [point.real_send_time_ms for point in self.data_points],
-        bins=numpy.arange(start_ms, stop_ms,
-                          RTPStatistics.PLOT_RESOLUTION_MS),
-        weights=[point.size * 8 / RTPStatistics.PLOT_RESOLUTION_MS
-                 for point in self.data_points]
-    )
-    correlate_filter = (numpy.ones(
-        RTPStatistics.BANDWIDTH_SMOOTHING_WINDOW_SIZE) /
-                        RTPStatistics.BANDWIDTH_SMOOTHING_WINDOW_SIZE)
-    self.smooth_bw_kbps = numpy.correlate(self.bandwidth_kbps, correlate_filter)
-
-  def PlotStatistics(self):
-    """Plots changes in delay and average bandwidth."""
-
-    start_ms = self.data_points[0].real_send_time_ms
-    stop_ms = self.data_points[-1].real_send_time_ms
-    time_axis = numpy.arange(start_ms / 1000, stop_ms / 1000,
-                             RTPStatistics.PLOT_RESOLUTION_MS / 1000)
-
-    delay = CalculateDelay(start_ms, stop_ms,
-                            RTPStatistics.PLOT_RESOLUTION_MS,
-                            self.data_points)
-
-    plt.figure(1)
-    plt.plot(time_axis, delay[:len(time_axis)])
-    plt.xlabel("Send time [s]")
-    plt.ylabel("Relative transport delay [ms]")
-
-    plt.figure(2)
-    plt.plot(time_axis[:len(self.smooth_bw_kbps)], self.smooth_bw_kbps)
-    plt.xlabel("Send time [s]")
-    plt.ylabel("Bandwidth [kbps]")
-
-    plt.show()
-
-
-def CalculateDelay(start, stop, step, points):
-  """Quantizes the time coordinates for the delay.
-
-  Quantizes points by rounding the timestamps downwards to the nearest
-  point in the time sequence start, start+step, start+2*step... Takes
-  the average of the delays of points rounded to the same. Returns
-  masked array, in which time points with no value are masked.
-
-  """
-  grouped_delays = [[] for _ in numpy.arange(start, stop + step, step)]
-  rounded_value_index = lambda x: int((x - start) / step)
-  for point in points:
-    grouped_delays[rounded_value_index(point.real_send_time_ms)
-                  ].append(point.absdelay)
-  regularized_delays = [numpy.average(arr) if arr else -1 for arr in
-                        grouped_delays]
-  return numpy.ma.masked_values(regularized_delays, -1)
-
-
-def main():
-  usage = "Usage: %prog [options] <filename of rtc event log>"
-  parser = optparse.OptionParser(usage=usage)
-  parser.add_option("--dump_header_to_stdout",
-                    default=False, action="store_true",
-                    help="print header info to stdout; similar to rtp_analyze")
-  parser.add_option("--query_sample_rate",
-                    default=False, action="store_true",
-                    help="always query user for real sample rate")
-
-  parser.add_option("--working_directory",
-                    default=None, action="store",
-                    help="directory in which to search for relative paths")
-
-  (options, args) = parser.parse_args()
-
-  if len(args) < 1:
-    parser.print_help()
-    sys.exit(0)
-
-  input_file = args[0]
-
-  if options.working_directory and not os.path.isabs(input_file):
-    input_file = os.path.join(options.working_directory, input_file)
-
-  data_points = pb_parse.ParseProtobuf(input_file)
-  rtp_stats = RTPStatistics(data_points)
-
-  if options.dump_header_to_stdout:
-    print("Printing header info to stdout.", file=sys.stderr)
-    rtp_stats.PrintHeaderStatistics()
-    sys.exit(0)
-
-  chosen_ssrc = rtp_stats.ChooseSsrc()
-  print("Chosen SSRC: 0X{:X}".format(chosen_ssrc))
-
-  rtp_stats.FilterSsrc(chosen_ssrc)
-
-  print("Statistics:")
-  rtp_stats.PrintSequenceNumberStatistics()
-  rtp_stats.EstimateFrequency(options.query_sample_rate)
-  rtp_stats.PrintDurationStatistics()
-  rtp_stats.RemoveReordered()
-  rtp_stats.ComputeBandwidth()
-  rtp_stats.PlotStatistics()
-
-if __name__ == "__main__":
-  main()
diff --git a/rtc_tools/py_event_log_analyzer/rtp_analyzer.sh b/rtc_tools/py_event_log_analyzer/rtp_analyzer.sh
deleted file mode 100755
index 817ca4f..0000000
--- a/rtc_tools/py_event_log_analyzer/rtp_analyzer.sh
+++ /dev/null
@@ -1,17 +0,0 @@
-#!/bin/sh
-#  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.
-set -e
-WORKING_DIR=$(pwd)
-cd $(dirname $0)
-PYTHONPATH="../../third_party/protobuf/python/"
-if [ -z ${PYTHON_EXECUTABLE+x} ]
-then
-    PYTHON_EXECUTABLE=python3
-fi
-exec $PYTHON_EXECUTABLE "rtp_analyzer.py" $@ --working_dir $WORKING_DIR
diff --git a/rtc_tools/py_event_log_analyzer/rtp_analyzer_test.py b/rtc_tools/py_event_log_analyzer/rtp_analyzer_test.py
deleted file mode 100755
index dc6cb22..0000000
--- a/rtc_tools/py_event_log_analyzer/rtp_analyzer_test.py
+++ /dev/null
@@ -1,61 +0,0 @@
-#!/usr/bin/env python
-#  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.
-
-"""Run the tests with
-
-      python rtp_analyzer_test.py
-or
-      python3 rtp_analyzer_test.py
-"""
-
-import collections
-import unittest
-
-MISSING_NUMPY = False  # pylint: disable=invalid-name
-try:
-  import numpy
-  import rtp_analyzer
-except ImportError:
-  MISSING_NUMPY = True
-
-FakePoint = collections.namedtuple("FakePoint",
-                                   ["real_send_time_ms", "absdelay"])
-
-
-class TestDelay(unittest.TestCase):
-  def AssertMaskEqual(self, masked_array, data, mask):
-    self.assertEqual(list(masked_array.data), data)
-
-    if isinstance(masked_array.mask, numpy.bool_):
-      array_mask = masked_array.mask
-    else:
-      array_mask = list(masked_array.mask)
-    self.assertEqual(array_mask, mask)
-
-  def testCalculateDelaySimple(self):
-    points = [FakePoint(0, 0), FakePoint(1, 0)]
-    mask = rtp_analyzer.CalculateDelay(0, 1, 1, points)
-    self.AssertMaskEqual(mask, [0, 0], False)
-
-  def testCalculateDelayMissing(self):
-    points = [FakePoint(0, 0), FakePoint(2, 0)]
-    mask = rtp_analyzer.CalculateDelay(0, 2, 1, points)
-    self.AssertMaskEqual(mask, [0, -1, 0], [False, True, False])
-
-  def testCalculateDelayBorders(self):
-    points = [FakePoint(0, 0), FakePoint(2, 0)]
-    mask = rtp_analyzer.CalculateDelay(0, 3, 2, points)
-    self.AssertMaskEqual(mask, [0, 0, -1], [False, False, True])
-
-
-if __name__ == "__main__":
-  if MISSING_NUMPY:
-    print "Missing numpy, skipping test."
-  else:
-    unittest.main()
diff --git a/rtc_tools/rtcbot/OWNERS b/rtc_tools/rtcbot/OWNERS
deleted file mode 100644
index 296f71f..0000000
--- a/rtc_tools/rtcbot/OWNERS
+++ /dev/null
@@ -1 +0,0 @@
-andresp@webrtc.org
diff --git a/rtc_tools/rtcbot/README b/rtc_tools/rtcbot/README
deleted file mode 100644
index 1f4d7c1..0000000
--- a/rtc_tools/rtcbot/README
+++ /dev/null
@@ -1,59 +0,0 @@
-=== RTCBot ===
-RTCBot is a framework to write tests that need to spawn multiple webrtc
-endpoints.
-
-== Description ==
-RTCBot is a framework that allows to write tests where logic runs on a single
-host that controls multiple endpoints ("bots"). It allows creating complex
-scenarios that would otherwise require non-trival signalling between multiple
-parties.
-
-The host runs in node.js, but the test code is run in an isolated context with
-no access to node.js specifics other than the exposed api via a test variable.
-
-Part of the exposed api (test.spawnBot) allows a test to spawn a bot and
-access its exposed API. Details are in botmanager.js.
-
-== How to run the test ==
- $ cd trunk/webrtc/tool/rtcbot
- $ npm install express browserify ws websocket-stream dnode
- $ mkdir configurations
- $ cd configurations
- $ openssl genrsa -out priv.pem 1024
- $ openssl req -x509 -new -key priv.pem -days 3650 -out cert.crt
- $ cd trunk/webrtc/tool/rtcbot
- $ node main.js "<test_name>"
-
-* Note:
-    In first time you will use rtcBot you will receive a warning telling
-  you that your connection is not private. Just avoid this warning and
-  click Proceed to localhost (unsafe).
-
-== How can I see the list of available tests? ==
- $ node main.js
-
-== Example on how to install nodejs ==
- $ cd /work/tools/
- $ git clone https://github.com/creationix/nvm.git
- $ export NVM_DIR=/work/tools/nvm; source $NVM_DIR/nvm.sh
- $ nvm install 0.10
- $ nvm use 0.10
-
-== Why generating the private key and self signed certificate? ==
-  - Private key and certificate are used for creating HTTPs server in
-    rtcBot for loading the required files on the different types of the bots.
-
-== Supported Bot Types ==
-  - "chrome": chrome on host machine.
-  - "android-chrome": chrome on android device. Details in "Android" Section.
-
- * Bot type is specified directly by the test.
-
-== Android ==
-Before running test with Android one MUST forward the device port 8080 to the
-host machine. That is easy to achieve with chrome port forwarding tools.
- - Visit chrome://inspect/devices on the host machine.
- - Configure and enable port forwarding 8080 -> localhost:8080
- - Open chrome on you Android device before running test, and leave it
-   running until the end of test.
- - Run your test.
diff --git a/rtc_tools/rtcbot/bot/api.js b/rtc_tools/rtcbot/bot/api.js
deleted file mode 100644
index 7e1a436..0000000
--- a/rtc_tools/rtcbot/bot/api.js
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright (c) 2014 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.
-//
-// This file exposes the api for the bot to connect to the host script
-// waiting a websocket connection and using dnode for javascript rpc.
-//
-// This file is served to the browser via browserify to resolve the
-// dnode requires.
-var WebSocketStream = require('websocket-stream');
-var Dnode = require('dnode');
-
-function connectToServer(api) {
-  var stream = new WebSocketStream("wss://localhost:8080/");
-  var dnode = new Dnode(api);
-  dnode.on('error', function (error) { console.log(error); });
-  dnode.pipe(stream).pipe(dnode);
-}
-
-// Dnode loses certain method calls when exposing native browser objects such as
-// peer connections. This methods helps work around that by allowing one to
-// redefine a non-native method in a target "obj" from "src" that applies a list
-// of casts to the arguments (types are lost in dnode).
-function expose(obj, src, method, casts) {
-  obj[method] = function () {
-    for (index in casts)
-      arguments[index] = new (casts[index])(arguments[index]);
-    src[method].apply(src, arguments);
-  }
-}
-
-window.expose = expose;
-window.connectToServer = connectToServer;
diff --git a/rtc_tools/rtcbot/bot/browser/bot.js b/rtc_tools/rtcbot/bot/browser/bot.js
deleted file mode 100644
index a5785df..0000000
--- a/rtc_tools/rtcbot/bot/browser/bot.js
+++ /dev/null
@@ -1,140 +0,0 @@
-// Copyright (c) 2014 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.
-//
-var localStreams = [];
-var remoteStreams = [];
-
-function ping(callback) {
-  callback("pong");
-}
-
-function getUserMedia(constraints, onSuccessCallback, onFailCallback){
-  console.log("Getting user media.");
-  navigator.webkitGetUserMedia(constraints,
-      onSuccessCallbackWraper, onFailCallback);
-
-  function onSuccessCallbackWraper(stream) {
-    console.log("GetUserMedia success.");
-    localStreams[stream.id] = stream;
-    onSuccessCallback(stream);
-  }
-}
-
-function createPeerConnection(config, doneCallback, failCallback) {
-  console.log("Creating peer connection");
-  var obj = {};
-  var pc = new webkitRTCPeerConnection(config);
-
-  expose(obj, pc, "close");
-  expose(obj, pc, "createOffer");
-  expose(obj, pc, "createAnswer");
-  expose(obj, pc, "addEventListener");
-  expose(obj, pc, "addIceCandidate", { 0: RTCIceCandidate});
-  expose(obj, pc, "setRemoteDescription", { 0: RTCSessionDescription });
-  expose(obj, pc, "setLocalDescription", { 0: RTCSessionDescription });
-
-  obj.addStream = function(stream) {
-    console.log("Adding local stream.");
-    var tempStream = localStreams[stream.id];
-    if (!tempStream) {
-      console.log("Undefined stream!");
-      return;
-    }
-    pc.addStream(tempStream);
-  };
-
-  // Return an array of Objects, each Object is a copy of RTCStateReport
-  // and has the following attributes (id, type, names, and stats).
-  // names: array originaly returned by calling RTCStateReport.names().
-  // stats: dictionary of stat name as key and stat value as dictionary
-  // value.
-  obj.getStats = function(callback, mediaTrack) {
-    pc.getStats(onStatsReady, mediaTrack);
-
-    function onStatsReady(stateResponse) {
-      var outputReports = [];
-      var reports = stateResponse.result();
-      for (index in reports) {
-        var report = {};
-        report.id = reports[index].id;
-        report.type = reports[index].type;
-        report.names = reports[index].names();
-        report.stats = [];
-        populateStats(reports[index], report.stats);
-
-        outputReports.push(report);
-      }
-
-      callback(outputReports);
-    }
-
-    function populateStats(report, stats) {
-      var names = report.names();
-      for (index in names) {
-        stats.push({
-           name: names[index],
-           stat: report.stat(names[index]),
-          });
-      }
-
-    }
-  };
-
-  pc.addEventListener('addstream', function(event) {
-    remoteStreams[event.stream.id] = event.stream;
-  });
-
-  doneCallback(obj);
-};
-
-function showStream(streamId, autoplay, muted) {
-  var stream = getStreamFromIdentifier_(streamId);
-  var video = document.createElement('video');
-  video.autoplay = autoplay;
-  video.muted = muted;
-  document.body.appendChild(video);
-  video.src = URL.createObjectURL(stream);
-  console.log("Stream " + stream.id + " attached to video element");
-};
-
-function getStreamFromIdentifier_(id) {
-  var tempStream = localStreams[id];
-  if (tempStream)
-    return tempStream;
-  tempStream = remoteStreams[id];
-  if (tempStream)
-    return tempStream;
-  console.log(id + " is not id for stream.");
-  return null;
-};
-
-function downloadFile(path, onSuccess, onError) {
-  var xhr = new XMLHttpRequest();
-  function onResult() {
-    if (xhr.readyState != 4)
-      return;
-
-    if (xhr.status != 200) {
-      onError("Download request failed!");
-      return;
-    }
-    onSuccess(xhr.responseText);
-  }
-
-  xhr.onreadystatechange = onResult;
-  xhr.open('GET', path, true);
-  xhr.send();
-};
-
-connectToServer({
-  ping: ping,
-  getUserMedia: getUserMedia,
-  createPeerConnection: createPeerConnection,
-  showStream: showStream,
-  downloadFile: downloadFile,
-});
diff --git a/rtc_tools/rtcbot/bot/browser/index.html b/rtc_tools/rtcbot/bot/browser/index.html
deleted file mode 100644
index 57bf596..0000000
--- a/rtc_tools/rtcbot/bot/browser/index.html
+++ /dev/null
@@ -1,11 +0,0 @@
-<!--
-// Copyright (c) 2014 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.
--->
-<script src="../api.js"></script>
-<script src="bot.js"></script>
diff --git a/rtc_tools/rtcbot/botmanager.js b/rtc_tools/rtcbot/botmanager.js
deleted file mode 100644
index 5b325bd..0000000
--- a/rtc_tools/rtcbot/botmanager.js
+++ /dev/null
@@ -1,216 +0,0 @@
-// Copyright (c) 2014 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.
-//
-// botmanager.js module allows a test to spawn bots that expose an RPC API
-// to be controlled by tests.
-var https = require('https');
-var fs = require('fs');
-var child = require('child_process');
-var Browserify = require('browserify');
-var Dnode = require('dnode');
-var Express = require('express');
-var WebSocketServer = require('ws').Server;
-var WebSocketStream = require('websocket-stream');
-
-// BotManager runs a HttpsServer that serves bots assets and and WebSocketServer
-// that listens to incoming connections. Once a connection is available it
-// connects it to bots pending endpoints.
-//
-// TODO(andresp): There should be a way to control which bot was spawned
-// and what bot instance it gets connected to.
-BotManager = function () {
-  this.webSocketServer_ = null;
-  this.bots_ = [];
-  this.pendingConnections_ = [];
-  this.androidDeviceManager_ = new AndroidDeviceManager();
-}
-
-BotManager.BotTypes = {
-  CHROME : 'chrome',
-  ANDROID_CHROME : 'android-chrome',
-};
-
-BotManager.prototype = {
-  createBot_: function (name, botType, callback) {
-    switch(botType) {
-      case BotManager.BotTypes.CHROME:
-        return new BrowserBot(name, callback);
-      case BotManager.BotTypes.ANDROID_CHROME:
-        return new AndroidChromeBot(name, this.androidDeviceManager_,
-            callback);
-      default:
-        console.log('Error: Type ' + botType + ' not supported by rtc-Bot!');
-        process.exit(1);
-    }
-  },
-
-  spawnNewBot: function (name, botType, callback) {
-    this.startWebSocketServer_();
-    var bot = this.createBot_(name, botType, callback);
-    this.bots_.push(bot);
-    this.pendingConnections_.push(bot.onBotConnected.bind(bot));
-  },
-
-  startWebSocketServer_: function () {
-    if (this.webSocketServer_) return;
-
-    this.app_ = new Express();
-
-    this.app_.use('/bot/api.js',
-        this.serveBrowserifyFile_.bind(this,
-          __dirname + '/bot/api.js'));
-
-    this.app_.use('/bot/', Express.static(__dirname + '/bot'));
-
-    var options = options = {
-      key: fs.readFileSync('configurations/priv.pem', 'utf8'),
-      cert: fs.readFileSync('configurations/cert.crt', 'utf8')
-    };
-    this.server_ = https.createServer(options, this.app_);
-
-    this.webSocketServer_ = new WebSocketServer({ server: this.server_ });
-    this.webSocketServer_.on('connection', this.onConnection_.bind(this));
-
-    this.server_.listen(8080);
-  },
-
-  onConnection_: function (ws) {
-    var callback = this.pendingConnections_.shift();
-    callback(new WebSocketStream(ws));
-  },
-
-  serveBrowserifyFile_: function (file, request, result) {
-    // TODO(andresp): Cache browserify result for future serves.
-    var browserify = new Browserify();
-    browserify.add(file);
-    browserify.bundle().pipe(result);
-  }
-}
-
-// A basic bot waits for onBotConnected to be called with a stream to the actual
-// endpoint with the bot. Once that stream is available it establishes a dnode
-// connection and calls the callback with the other endpoint interface so the
-// test can interact with it.
-Bot = function (name, callback) {
-  this.name_ = name;
-  this.onbotready_ = callback;
-}
-
-Bot.prototype = {
-  log: function (msg) {
-    console.log("bot:" + this.name_ + " > " + msg);
-  },
-
-  name: function () { return this.name_; },
-
-  onBotConnected: function (stream) {
-    this.log('Connected');
-    this.stream_ = stream;
-    this.dnode_ = new Dnode();
-    this.dnode_.on('remote', this.onRemoteFromDnode_.bind(this));
-    this.dnode_.pipe(this.stream_).pipe(this.dnode_);
-  },
-
-  onRemoteFromDnode_: function (remote) {
-    this.onbotready_(remote);
-  }
-}
-
-// BrowserBot spawns a process to open "https://localhost:8080/bot/browser".
-//
-// That page once loaded, connects to the websocket server run by BotManager
-// and exposes the bot api.
-BrowserBot = function (name, callback) {
-  Bot.call(this, name, callback);
-  this.spawnBotProcess_();
-}
-
-BrowserBot.prototype = {
-  spawnBotProcess_: function () {
-    this.log('Spawning browser');
-    child.exec('google-chrome "https://localhost:8080/bot/browser/"');
-  },
-
-  __proto__: Bot.prototype
-}
-
-// AndroidChromeBot spawns a process to open
-// "https://localhost:8080/bot/browser/" on chrome for Android.
-AndroidChromeBot = function (name, androidDeviceManager, callback) {
-  Bot.call(this, name, callback);
-  androidDeviceManager.getNewDevice(function (serialNumber) {
-    this.serialNumber_ = serialNumber;
-    this.spawnBotProcess_();
-  }.bind(this));
-}
-
-AndroidChromeBot.prototype = {
-  spawnBotProcess_: function () {
-    this.log('Spawning Android device with serial ' + this.serialNumber_);
-    var runChrome = 'adb -s ' + this.serialNumber_ + ' shell am start ' +
-    '-n com.android.chrome/com.google.android.apps.chrome.Main ' +
-    '-d https://localhost:8080/bot/browser/';
-    child.exec(runChrome, function (error, stdout, stderr) {
-      if (error) {
-        this.log(error);
-        process.exit(1);
-      }
-      this.log('Opening Chrome for Android...');
-      this.log(stdout);
-    }.bind(this));
-  },
-
-  __proto__: Bot.prototype
-}
-
-AndroidDeviceManager = function () {
-  this.connectedDevices_ = [];
-}
-
-AndroidDeviceManager.prototype = {
-  getNewDevice: function (callback) {
-    this.listDevices_(function (devices) {
-      for (var i = 0; i < devices.length; i++) {
-        if (!this.connectedDevices_[devices[i]]) {
-          this.connectedDevices_[devices[i]] = devices[i];
-          callback(this.connectedDevices_[devices[i]]);
-          return;
-        }
-      }
-      if (devices.length == 0) {
-        console.log('Error: No connected devices!');
-      } else {
-        console.log('Error: There is no enough connected devices.');
-      }
-      process.exit(1);
-    }.bind(this));
-  },
-
-  listDevices_: function (callback) {
-    child.exec('adb devices' , function (error, stdout, stderr) {
-      var devices = [];
-      if (error || stderr) {
-        console.log(error || stderr);
-      }
-      if (stdout) {
-        // The first line is "List of devices attached"
-        // and the following lines:
-        // <serial number>  <device/emulator>
-        var tempList = stdout.split("\n").slice(1);
-        for (var i = 0; i < tempList.length; i++) {
-          if (tempList[i] == "") {
-            continue;
-          }
-          devices.push(tempList[i].split("\t")[0]);
-        }
-      }
-      callback(devices);
-    });
-  },
-}
-module.exports = BotManager;
diff --git a/rtc_tools/rtcbot/main.js b/rtc_tools/rtcbot/main.js
deleted file mode 100644
index 665f6e8..0000000
--- a/rtc_tools/rtcbot/main.js
+++ /dev/null
@@ -1,102 +0,0 @@
-// Copyright (c) 2014 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.
-//
-// This script loads all the test/* files into a very small context that
-// only exposes a minimal set of functions that allows to register tests.
-//
-// Once all files are loaded it runs the specific test on the command line.
-// If no arguments are given it lists all the registered tests.
-//
-// Note: the small context where the scripts are loaded is intended to keep
-// nodejs-isms away from the test code and isolate implementation details away
-// from them.
-var fs = require('fs');
-var vm = require('vm');
-var Test = require('./test.js');
-
-var testSuites = {};
-
-function registerTest(name, func) {
-  testSuites[name] = func;
-}
-
-function registerBotTest(name, func, bots) {
-  registerTest(name, bootstrap);
-
-  function bootstrap(test) {
-    var callbacks = [];
-    for (var i = 0; i != bots.length; ++i)
-      callbacks.push(test.spawnBot.bind(test, "", bots[i]));
-
-    test.wait(callbacks, func.bind(test, test));
-  }
-}
-
-function loadTestFile(filename, doneCallback) {
-  var loadTestContext = {
-    setTimeout: setTimeout,
-    registerTest: registerTest,
-    registerBotTest: registerBotTest
-  };
-  var script = vm.createScript(fs.readFileSync(filename), filename);
-  script.runInNewContext(loadTestContext);
-  doneCallback();
-}
-
-function iterateOverTestFiles(foreachCallback, doneCallback) {
-  fs.readdir('test', function (error, list) {
-    function iterateNextFile() {
-      if (list.length === 0) {
-        doneCallback();
-      } else {
-        var filename = list.pop();
-        if (filename[0] === '.' || filename.slice(-3) !== '.js') {
-          // Skip hidden and non .js files on that directory.
-          iterateNextFile();
-        } else {
-          foreachCallback('test/' + filename, iterateNextFile);
-        }
-      }
-    }
-
-    if (error !== null) {
-      throw error;
-    }
-    iterateNextFile();
-  });
-}
-
-function runTest(testname) {
-  if (testname in testSuites) {
-    console.log("Running test: " + testname);
-    var test = new Test();
-    testSuites[testname](test);
-  } else {
-    console.log("Unknown test: " + testname);
-  }
-}
-
-function printUsage() {
-  console.log('Run as:\n $ '
-      + process.argv[0] + ' ' + process.argv[1]
-      + ' <testname>');
-  console.log('These are the existent ones:');
-  for (var testname in testSuites)
-    console.log('  ' + testname);
-}
-
-function main() {
-  // TODO(andresp): support multiple tests.
-  var testList = process.argv.slice(2);
-  if (testList.length === 1)
-    runTest(testList[0]);
-  else
-    printUsage();
-}
-
-iterateOverTestFiles(loadTestFile, main);
diff --git a/rtc_tools/rtcbot/rtcBotReportVisualizer/index.html b/rtc_tools/rtcbot/rtcBotReportVisualizer/index.html
deleted file mode 100644
index 7ff59fc..0000000
--- a/rtc_tools/rtcbot/rtcBotReportVisualizer/index.html
+++ /dev/null
@@ -1,14 +0,0 @@
-<!--
-// Copyright (c) 2014 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.
--->
-<html>
-  <script src="https://www.google.com/jsapi"></script>
-  <script type="text/javascript" src="main.js"></script>
-  <input type="file" onchange="openFiles(event)" multiple>
-</html>
\ No newline at end of file
diff --git a/rtc_tools/rtcbot/rtcBotReportVisualizer/main.js b/rtc_tools/rtcbot/rtcBotReportVisualizer/main.js
deleted file mode 100644
index 91b0eec..0000000
--- a/rtc_tools/rtcbot/rtcBotReportVisualizer/main.js
+++ /dev/null
@@ -1,191 +0,0 @@
-// Copyright (c) 2014 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.
-//
-google.load("visualization", "1", {packages:["corechart"]});
-
-function openFiles(event) {
-  var files = event.target.files;
-  readAndAnalyzeFiles(files)
-}
-
-function readAndAnalyzeFiles(files) {
-  if(!files) {
-    alert("No files have been selected!");
-    return;
-  }
-
-  var reports = [];
-  var filesNames = [];
-  missingFiles = files.length;
-
-  for(var i = 0; i < files.length; i++) {
-    var reader = new FileReader();
-    reader.onload = onReaderLoad.bind(reader, files[i].name);
-    reader.readAsText(files[i]);
-  }
-
-  function onReaderLoad(fileName) {
-    reports.push(JSON.parse(this.result));
-    filesNames.push(fileName);
-
-    missingFiles--;
-    if(missingFiles == 0) {
-      analyzeReports_(reports, filesNames);
-    }
-  }
-}
-
-// TODO(houssainy) take the input stats from the select list or
-// drop down menu in html.
-function analyzeReports_(reports, filesNames) {
-  filesNames.unshift(""); // ned
-
-  // Rtt
-  analyzeRttData(reports, filesNames, "bot1");
-  analyzeRttData(reports, filesNames, "bot2");
-
-  // Send Packets Lost
-  analyzePacketsLostData(reports, filesNames, "bot1");
-  analyzePacketsLostData(reports, filesNames, "bot2");
-
-  // Send bandwidth
-  analyzeData(reports, filesNames, "Available Send Bandwidth-bot1", "bot1",
-      "bweforvideo", "googAvailableSendBandwidth");
-  analyzeData(reports, filesNames, "Available Send Bandwidth-bot2", "bot2",
-      "bweforvideo", "googAvailableSendBandwidth");
-
-   // Receive bandwidth
-   analyzeData(reports, filesNames, "Available Receive Bandwidth-bot1", "bot1",
-       "bweforvideo", "googAvailableReceiveBandwidth");
-   analyzeData(reports, filesNames, "Available Receive Bandwidth-bot2", "bot2",
-     "bweforvideo", "googAvailableReceiveBandwidth");
-
-  drawSeparatorLine();
-}
-
-function analyzeRttData(reports, filesNames, botName) {
-  var outPut = [];
-  outPut.push(filesNames);
-
-  var avergaData = ['Average Rtt x10'];
-  var maxData = ['Max Rtt'];
-
-  var average;
-  var max;
-  for(var index in reports) {
-    average = getStateAverage(reports[index], botName, "Conn-audio-1-0",
-      "googRtt");
-    avergaData.push(average*10);
-
-    max = getStateMax(reports[index], botName, "Conn-audio-1-0",
-      "googRtt");
-    maxData.push(max);
-  }
-  outPut.push(avergaData);
-  outPut.push(maxData);
-
-  drawChart("Rtt-" + botName, outPut);
-}
-
-function analyzePacketsLostData(reports, filesNames, botName) {
-  var outPut = [];
-  outPut.push(filesNames);
-
-  var maxData = ['Max Send PacketsLost'];
-  var max;
-  for(var index in reports) {
-    max = getStateMax(reports[index], botName, "ssrc_[0-9]+_send",
-        "packetsLost");
-    maxData.push(max);
-  }
-  outPut.push(maxData);
-
-  drawChart("Send PacketsLost-" + botName, outPut);
-}
-
-function analyzeData(reports, filesNames, chartName, botName, reportId,
-    statName) {
-  var outPut = [];
-  outPut.push(filesNames);
-
-  var avergaData = ['Average ' + statName];
-  var maxData = ['Max ' + statName];
-
-  var average;
-  var max;
-  for(var index in reports) {
-    average = getStateAverage(reports[index], botName, reportId, statName);
-    avergaData.push(average);
-
-    max = getStateMax(reports[index], botName, reportId, statName);
-    maxData.push(max);
-  }
-  outPut.push(avergaData);
-  outPut.push(maxData);
-
-  drawChart(chartName, outPut);
-}
-
-function getStateAverage(reports, botName, reportId, statName) {
-  var sum = 0;
-  var count = 0;
-
-  for (var index in reports) {
-    var data = reports[index].data;
-    if(index == 0 || !data.hasOwnProperty(botName))
-      continue;
-
-    var stats = data[botName];
-    for (var key in stats) {
-      if(key.search(reportId) != -1) {
-        var value = parseInt(stats[key][statName]);
-        sum += value;
-        count++;
-      }
-    }
-  }
-  return Math.round(sum/count);
-}
-
-function getStateMax(reports, botName, reportId, statName) {
-  var max = -1;
-
-  for (var index in reports) {
-    var data = reports[index].data;
-    if(index == 0 || !data.hasOwnProperty(botName))
-      continue;
-
-    var stats = data[botName];
-    for (var key in stats) {
-      if(key.search(reportId) != -1) {
-        var value = parseInt(stats[key][statName]);
-        max = Math.max(value, max);
-      }
-    }
-  }
-  return max;
-}
-
-function drawChart(title, data) {
-  var dataTable = google.visualization.arrayToDataTable(data);
-
-  var options = {
-    title: title,
-  };
-
-  var div = document.createElement('div');
-  document.body.appendChild(div);
-
-  var chart = new google.visualization.ColumnChart(div);
-  chart.draw(dataTable, options);
-}
-
-function drawSeparatorLine()  {
-  var hr = document.createElement('hr');
-  document.body.appendChild(hr);
-}
diff --git a/rtc_tools/rtcbot/test.js b/rtc_tools/rtcbot/test.js
deleted file mode 100644
index 33ef960..0000000
--- a/rtc_tools/rtcbot/test.js
+++ /dev/null
@@ -1,155 +0,0 @@
-// Copyright (c) 2014 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.
-//
-// Provides a Test class that exposes api to the tests.
-// Read test.prototype to see what methods are exposed.
-var fs = require('fs');
-var request = require('request');
-var BotManager = require('./botmanager.js');
-
-function Test() {
-  this.timeout_ = setTimeout(
-      this.fail.bind(this, "Test timeout!"),
-      100000);
-}
-
-Test.prototype = {
-  log: function () {
-    console.log.apply(console.log, arguments);
-  },
-
-  abort: function (error) {
-    var error = new Error(error || "Test aborted");
-    console.log(error.stack);
-    process.exit(1);
-  },
-
-  assert: function (value, message) {
-    if (value !== true) {
-      this.abort(message || "Assert failed.");
-    }
-  },
-
-  fail: function () {
-    this.assert(false, "Test failed.");
-  },
-
-  done: function () {
-    clearTimeout(this.timeout_);
-    console.log("Test succeeded");
-    process.exit(0);
-  },
-
-  // Utility method to wait for multiple callbacks to be executed.
-  //  functions - array of functions to call with a callback.
-  //  doneCallback - called when all callbacks on the array have completed.
-  wait: function (functions, doneCallback) {
-    var result = new Array(functions.length);
-    var missingResult = functions.length;
-    for (var i = 0; i != functions.length; ++i)
-      functions[i](complete.bind(this, i));
-
-    function complete(index, value) {
-      missingResult--;
-      result[index] = value;
-      if (missingResult == 0)
-        doneCallback.apply(null, result);
-    }
-  },
-
-  spawnBot: function (name, botType, doneCallback) {
-    // Lazy initialization of botmanager.
-    if (!this.botManager_)
-      this.botManager_ = new BotManager();
-    this.botManager_.spawnNewBot(name, botType, doneCallback);
-  },
-
-  createStatisticsReport: function (outputFileName) {
-    return new StatisticsReport(outputFileName);
-  },
-
-  // Ask computeengineondemand to give us TURN server credentials and URIs.
-  createTurnConfig: function (onSuccess, onError) {
-    request('https://computeengineondemand.appspot.com/turn?username=1234&key=5678',
-        function (error, response, body) {
-          if (error || response.statusCode != 200) {
-            onError('TURN request failed');
-            return;
-          }
-
-          var response = JSON.parse(body);
-          var iceServer = {
-            'username': response.username,
-            'credential': response.password,
-            'urls': response.uris
-          };
-          onSuccess({ 'iceServers': [ iceServer ] });
-        }
-      );
-  },
-}
-
-StatisticsReport = function (outputFileName) {
-  this.output_ = [];
-  this.output_.push("Version: 1");
-  this.outputFileName_ = outputFileName;
-}
-
-StatisticsReport.prototype = {
-  collectStatsFromPeerConnection: function (prefix, pc) {
-    setInterval(this.addPeerConnectionStats.bind(this, prefix, pc), 100);
-  },
-
-  addPeerConnectionStats: function (prefix, pc) {
-    pc.getStats(onStatsReady.bind(this));
-
-    function onStatsReady(reports) {
-      for (index in reports) {
-        var stats = {};
-        stats[reports[index].id] = collectStats(reports[index].stats);
-
-        var data = {};
-        data[prefix] = stats;
-
-        this.output_.push({
-            type: "UpdateCounters",
-            startTime: (new Date()).getTime(),
-            data: data,
-          });
-      }
-    };
-
-    function collectStats(stats) {
-      var outputStats = {};
-      for (index in stats) {
-        var statValue = parseFloat(stats[index].stat);
-        outputStats[stats[index].name] = isNaN(statValue)?
-            stats[index].stat : statValue;
-      }
-      return outputStats;
-    };
-  },
-
-  finish: function (doneCallback) {
-    fs.exists("test/reports/", function (exists) {
-      if(exists) {
-        writeFile.bind(this)();
-      } else {
-        fs.mkdir("test/reports/", 0777, writeFile.bind(this));
-      }
-    }.bind(this));
-
-    function writeFile () {
-      fs.writeFile("test/reports/" + this.outputFileName_ + "_" +
-        (new Date()).getTime() +".json", JSON.stringify(this.output_),
-        doneCallback);
-    }
-  },
-};
-
-module.exports = Test;
diff --git a/rtc_tools/rtcbot/test/oneWayVideoStreamingWithDownloadingFile.js b/rtc_tools/rtcbot/test/oneWayVideoStreamingWithDownloadingFile.js
deleted file mode 100644
index 857d838..0000000
--- a/rtc_tools/rtcbot/test/oneWayVideoStreamingWithDownloadingFile.js
+++ /dev/null
@@ -1,122 +0,0 @@
-// Copyright (c) 2014 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.
-//
-// A unidirectional video and audio flowing test from bot 1 to bot 2,
-// and download a file from a server after 2 seconds of establishing
-// the call.
-//
-// The test succeeds after collecting stats for 10 seconds from both bots
-// and then write these stats to a file.
-//
-// Note: the source of the video and audio stream is getUserMedia().
-//
-function testOneWayVideoWithDownloading(test, bot1, bot2) {
-  var report = test.createStatisticsReport("testOneWayVideoWithDownloading");
-
-  test.wait([
-      createPeerConnection.bind(bot1),
-      createPeerConnection.bind(bot2) ],
-    onPeerConnectionCreated);
-
-  function createPeerConnection(done) {
-    test.createTurnConfig(onTurnConfig.bind(this), test.fail);
-
-    function onTurnConfig(config) {
-      this.createPeerConnection(config, done, test.fail);
-    };
-  }
-
-  function onPeerConnectionCreated(pc1, pc2) {
-    test.log("RTC Peers created.");
-    pc1.addEventListener('addstream', test.fail);
-    pc2.addEventListener('addstream', onAddStream);
-    pc1.addEventListener('icecandidate', onIceCandidate.bind(pc2));
-    pc2.addEventListener('icecandidate', onIceCandidate.bind(pc1));
-
-    bot1.getUserMedia({video:true, audio:true}, onUserMediaSuccess, test.fail);
-
-    function onUserMediaSuccess(stream) {
-      test.log("User has granted access to local media.");
-      pc1.addStream(stream);
-      bot1.showStream(stream.id, true, true);
-
-      createOfferAndAnswer(pc1, pc2);
-    }
-  }
-
-  function onAddStream(event) {
-    test.log("On Add stream.");
-    bot2.showStream(event.stream.id, true, false);
-  }
-
-  function onIceCandidate(event) {
-    if(event.candidate) {
-      test.log(event.candidate.candidate);
-      this.addIceCandidate(event.candidate,
-         onAddIceCandidateSuccess, test.fail);
-    }
-
-    function onAddIceCandidateSuccess() {
-      test.log("Candidate added successfully");
-    }
-  }
-
-  function createOfferAndAnswer(pc1, pc2) {
-    test.log("Creating offer.");
-    pc1.createOffer(gotOffer, test.fail);
-
-    function gotOffer(offer) {
-      test.log("Got offer");
-      pc1.setLocalDescription(offer, onSetSessionDescriptionSuccess, test.fail);
-      pc2.setRemoteDescription(offer, onSetSessionDescriptionSuccess,
-          test.fail);
-      test.log("Creating answer");
-      pc2.createAnswer(gotAnswer, test.fail);
-    }
-
-    function gotAnswer(answer) {
-      test.log("Got answer");
-      pc2.setLocalDescription(answer, onSetSessionDescriptionSuccess,
-          test.fail);
-      pc1.setRemoteDescription(answer, onSetSessionDescriptionSuccess,
-          test.fail);
-      collectStats();
-
-      setTimeout(function() {
-        downloadFile(bot1, "bot1");
-        downloadFile(bot2, "bot2");
-      }, 2000);
-    }
-
-    function onSetSessionDescriptionSuccess() {
-      test.log("Set session description success.");
-    }
-
-    function collectStats() {
-      report.collectStatsFromPeerConnection("bot1", pc1);
-      report.collectStatsFromPeerConnection("bot2", pc2);
-
-      setTimeout(function() {
-        report.finish(test.done);
-        }, 10000);
-    }
-
-    function downloadFile(bot, name) {
-      bot.downloadFile("https://test.webrtc.org/test-download-file/9000KB.data",
-          onDownloadSuccess.bind(null, name), test.fail);
-
-      function onDownloadSuccess(name, data) {
-        test.log( name + " downloaded " +
-            Math.round(data.length/(1024*1024)) + "MB.");
-      }
-    }
-  }
-}
-
-registerBotTest('testOneWayVideoWithDownloading/chrome-chrome',
-                testOneWayVideoWithDownloading, ['chrome', 'chrome']);
diff --git a/rtc_tools/rtcbot/test/ping_pong.js b/rtc_tools/rtcbot/test/ping_pong.js
deleted file mode 100644
index 1d9886e..0000000
--- a/rtc_tools/rtcbot/test/ping_pong.js
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright (c) 2014 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.
-//
-function testPingPong(test, bot) {
-  test.assert(typeof bot.ping === 'function', 'Bot does not exposes ping.');
-
-  bot.ping(gotAnswer);
-
-  function gotAnswer(answer) {
-    test.log('bot > ' + answer);
-    test.done();
-  }
-}
-
-registerBotTest('testPingPong/chrome', testPingPong, ['chrome']);
diff --git a/rtc_tools/rtcbot/test/simple_offer_answer.js b/rtc_tools/rtcbot/test/simple_offer_answer.js
deleted file mode 100644
index 888662a..0000000
--- a/rtc_tools/rtcbot/test/simple_offer_answer.js
+++ /dev/null
@@ -1,48 +0,0 @@
-// Copyright (c) 2014 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.
-//
-// Test that offer/answer between 2 peers completes successfully.
-//
-// Note: This test does not performs ice candidate exchange and
-// does not verifies that media can flow between the peers.
-function testOfferAnswer(test, bot1, bot2) {
-  test.wait( [ bot1.createPeerConnection.bind(bot1, null),
-               bot2.createPeerConnection.bind(bot2, null) ],
-            run);
-
-  function run(pc1, pc2) {
-    test.log("Establishing call.");
-    pc1.createOffer(gotOffer);
-
-    function gotOffer(offer) {
-      test.log("Got offer");
-      expectedCall();
-      pc1.setLocalDescription(offer, expectedCall, test.fail);
-      pc2.setRemoteDescription(offer, expectedCall, test.fail);
-      pc2.createAnswer(gotAnswer, test.fail);
-    }
-
-    function gotAnswer(answer) {
-      test.log("Got answer");
-      expectedCall();
-      pc2.setLocalDescription(answer, expectedCall, test.fail);
-      pc1.setRemoteDescription(answer, expectedCall, test.fail);
-    }
-
-    // TODO(andresp): Implement utilities in test to write expectations
-    // that certain methods must be called.
-    var expectedCalls = 0;
-    function expectedCall() {
-      if (++expectedCalls == 6)
-        test.done();
-    }
-  }
-}
-
-registerBotTest('testOfferAnswer/chrome-chrome',
-                testOfferAnswer, ['chrome', 'chrome']);
diff --git a/rtc_tools/rtcbot/test/three_bots_video_conference.js b/rtc_tools/rtcbot/test/three_bots_video_conference.js
deleted file mode 100644
index 65c3e99..0000000
--- a/rtc_tools/rtcbot/test/three_bots_video_conference.js
+++ /dev/null
@@ -1,135 +0,0 @@
-// Copyright (c) 2014 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.
-//
-// A video conference between 3 bots streaming video and audio between
-// each other.
-// The test succeeds after establishing the call between the three
-// devices.
-//
-// Note: the source of the video and audio stream is getUserMedia().
-function testTwoWayVideoStreaming(test, bot1, bot2, bot3) {
-  var answersCount = 0;
-  var statsCollector;
-
-  test.wait([
-      createBotPeerConnectionsWithLocalStream.bind(bot1),
-      createBotPeerConnectionsWithLocalStream.bind(bot2),
-      createBotPeerConnectionsWithLocalStream.bind(bot3)],
-    onPeerConnectionCreated);
-
-  // done() callback is called with list of peers as argument.
-  function createBotPeerConnectionsWithLocalStream(done) {
-    var peerConnections = [];
-
-    this.getUserMedia({video:true, audio:true},
-        onUserMediaSuccess.bind(this), test.fail);
-
-    function onUserMediaSuccess(stream) {
-      test.log("User has granted access to local media.");
-      this.showStream(stream.id, true, true);
-
-      test.createTurnConfig(onTurnConfig.bind(this), test.fail);
-
-      function onTurnConfig(config) {
-        this.createPeerConnection(config, addStream.bind(this),
-            test.fail);
-        this.createPeerConnection(config, addStream.bind(this),
-            test.fail);
-      }
-
-      function addStream(pc) {
-        pc.addStream(stream);
-        pc.addEventListener('addstream', onAddStream.bind(this));
-
-        peerConnections.push(pc);
-        if(peerConnections.length == 2)
-          done(peerConnections);
-      }
-    }
-  }
-
-  function onPeerConnectionCreated(peerConnections1,
-      peerConnections2, peerConnections3) {
-    test.log("RTC Peers created.");
-
-    // Bot1 and Bot2
-    establichCall(peerConnections1[0], peerConnections2[1]);
-    // Bot2 and Bot3
-    establichCall(peerConnections2[0], peerConnections3[1]);
-    // Bot3 and Bot1
-    establichCall(peerConnections3[0], peerConnections1[1]);
-  }
-
-  function establichCall(pc1, pc2) {
-    pc1.addEventListener('icecandidate', onIceCandidate.bind(pc2));
-    pc2.addEventListener('icecandidate', onIceCandidate.bind(pc1));
-
-    createOfferAndAnswer(pc1, pc2);
-  }
-
-  function onAddStream(event) {
-    test.log("On Add stream.");
-    this.showStream(event.stream.id, true, false);
-  }
-
-  function onIceCandidate(event) {
-    if(event.candidate) {
-      this.addIceCandidate(event.candidate,
-         onAddIceCandidateSuccess, test.fail);
-    };
-
-    function onAddIceCandidateSuccess() {
-      test.log("Candidate added successfully");
-    };
-  }
-
-  function createOfferAndAnswer(pc1, pc2) {
-    test.log("Creating offer.");
-    pc1.createOffer(gotOffer, test.fail);
-
-    function gotOffer(offer) {
-      test.log("Got offer");
-      pc1.setLocalDescription(offer, onSetSessionDescriptionSuccess, test.fail);
-      pc2.setRemoteDescription(offer, onSetSessionDescriptionSuccess,
-          test.fail);
-      test.log("Creating answer");
-      pc2.createAnswer(gotAnswer, test.fail);
-    }
-
-    function gotAnswer(answer) {
-      test.log("Got answer");
-      pc2.setLocalDescription(answer, onSetSessionDescriptionSuccess,
-          test.fail);
-      pc1.setRemoteDescription(answer, onSetSessionDescriptionSuccess,
-          test.fail);
-
-      answersCount++;
-      if(answersCount == 3) {
-        // SetTimeout used because creating the three answers will very fast
-        // and test will success and the vm will be closed before establishing
-        // the calls.
-        setTimeout(function() {
-            test.done();
-          }, 5000);
-      }
-    }
-
-    function onSetSessionDescriptionSuccess() {
-      test.log("Set session description success.");
-    }
-  }
-}
-
-registerBotTest('threeBotsVideoConference/android+android+chrome',
-                testTwoWayVideoStreaming, ['android-chrome', 'android-chrome',
-                'chrome']);
-registerBotTest('threeBotsVideoConference/chrome-chrome-chrome',
-                testTwoWayVideoStreaming, ['chrome', 'chrome', 'chrome']);
-registerBotTest('threeBotsVideoConference/android-android-android',
-                testTwoWayVideoStreaming, ['android-chrome', 'android-chrome',
-                'android-chrome']);
\ No newline at end of file
diff --git a/rtc_tools/rtcbot/test/two_way_video_streaming.js b/rtc_tools/rtcbot/test/two_way_video_streaming.js
deleted file mode 100644
index 7b02dce..0000000
--- a/rtc_tools/rtcbot/test/two_way_video_streaming.js
+++ /dev/null
@@ -1,112 +0,0 @@
-// Copyright (c) 2014 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.
-//
-// A two way video and audio flowing test between bot 1 and bot 2.
-// The test succeeds after collecting stats for 10 seconds from both bots
-// and then write these stats to a file.
-//
-// Note: the source of the video and audio stream is getUserMedia().
-function testTwoWayVideoStreaming(test, bot1, bot2) {
-  var report = test.createStatisticsReport("two_way_video_streaming");
-  var statsCollector;
-
-  test.wait([
-      createPeerConnectionWithLocalStream.bind(bot1),
-      createPeerConnectionWithLocalStream.bind(bot2)],
-    onPeerConnectionCreated);
-
-  function createPeerConnectionWithLocalStream(done) {
-    this.getUserMedia({video:true, audio:true},
-        onUserMediaSuccess.bind(this), test.fail);
-
-    function onUserMediaSuccess(stream) {
-      test.log("User has granted access to local media.");
-      test.createTurnConfig(onTurnConfig.bind(this), test.fail);
-
-      function onTurnConfig(config) {
-        this.createPeerConnection(config, addAndShowStream.bind(this),
-            test.fail);
-      };
-
-      function addAndShowStream(pc) {
-        pc.addStream(stream);
-        this.showStream(stream.id, true, true);
-
-        done(pc);
-      }
-    }
-  }
-
-  function onPeerConnectionCreated(pc1, pc2) {
-    test.log("RTC Peers created.");
-    pc1.addEventListener('addstream', onAddStream.bind(bot1));
-    pc2.addEventListener('addstream', onAddStream.bind(bot2));
-    pc1.addEventListener('icecandidate', onIceCandidate.bind(pc2));
-    pc2.addEventListener('icecandidate', onIceCandidate.bind(pc1));
-
-    createOfferAndAnswer(pc1, pc2);
-  }
-
-  function onAddStream(event) {
-    test.log("On Add stream.");
-    this.showStream(event.stream.id, true, false);
-  }
-
-  function onIceCandidate(event) {
-    if(event.candidate) {
-      test.log(event.candidate.candidate);
-      this.addIceCandidate(event.candidate,
-         onAddIceCandidateSuccess, test.fail);
-    };
-
-    function onAddIceCandidateSuccess() {
-      test.log("Candidate added successfully");
-    };
-  }
-
-  function createOfferAndAnswer(pc1, pc2) {
-    test.log("Creating offer.");
-    pc1.createOffer(gotOffer, test.fail);
-
-    function gotOffer(offer) {
-      test.log("Got offer");
-      pc1.setLocalDescription(offer, onSetSessionDescriptionSuccess, test.fail);
-      pc2.setRemoteDescription(offer, onSetSessionDescriptionSuccess,
-          test.fail);
-      test.log("Creating answer");
-      pc2.createAnswer(gotAnswer, test.fail);
-    }
-
-    function gotAnswer(answer) {
-      test.log("Got answer");
-      pc2.setLocalDescription(answer, onSetSessionDescriptionSuccess,
-          test.fail);
-      pc1.setRemoteDescription(answer, onSetSessionDescriptionSuccess,
-          test.fail);
-      collectStats();
-    }
-
-    function onSetSessionDescriptionSuccess() {
-      test.log("Set session description success.");
-    }
-
-    function collectStats() {
-      report.collectStatsFromPeerConnection("bot1", pc1);
-      report.collectStatsFromPeerConnection("bot2", pc2);
-
-      setTimeout(function() {
-        report.finish(test.done);
-        }, 10000);
-    }
-  }
-}
-
-registerBotTest('testTwoWayVideo/android-android',
-                testTwoWayVideoStreaming, ['android-chrome', 'android-chrome']);
-registerBotTest('testTwoWayVideo/chrome-chrome',
-                testTwoWayVideoStreaming, ['chrome', 'chrome']);
\ No newline at end of file
diff --git a/rtc_tools/rtcbot/test/webrtc_video_streaming.js b/rtc_tools/rtcbot/test/webrtc_video_streaming.js
deleted file mode 100644
index 6518c20..0000000
--- a/rtc_tools/rtcbot/test/webrtc_video_streaming.js
+++ /dev/null
@@ -1,103 +0,0 @@
-// Copyright (c) 2014 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.
-//
-// A unidirectional video and audio flowing test from bot 1 to bot 2.
-// The test succeeds after collecting stats for 10 seconds from both bots
-// and then write these stats to a file.
-//
-// Note: the source of the video and audio stream is getUserMedia().
-function testOneWayVideo(test, bot1, bot2) {
-  var report = test.createStatisticsReport("webrtc_video_streaming");
-
-  test.wait([
-      createPeerConnection.bind(bot1),
-      createPeerConnection.bind(bot2) ],
-    onPeerConnectionCreated);
-
-  function createPeerConnection(done) {
-    test.createTurnConfig(onTurnConfig.bind(this), test.fail);
-
-    function onTurnConfig(config) {
-      this.createPeerConnection(config, done, test.fail);
-    };
-  }
-
-  function onPeerConnectionCreated(pc1, pc2) {
-    test.log("RTC Peers created.");
-    pc1.addEventListener('addstream', test.fail);
-    pc2.addEventListener('addstream', onAddStream);
-    pc1.addEventListener('icecandidate', onIceCandidate.bind(pc2));
-    pc2.addEventListener('icecandidate', onIceCandidate.bind(pc1));
-
-    bot1.getUserMedia({video:true, audio:true}, onUserMediaSuccess, test.fail);
-
-    function onUserMediaSuccess(stream) {
-      test.log("User has granted access to local media.");
-      pc1.addStream(stream);
-      bot1.showStream(stream.id, true, true);
-
-      createOfferAndAnswer(pc1, pc2);
-    }
-  }
-
-  function onAddStream(event) {
-    test.log("On Add stream.");
-    bot2.showStream(event.stream.id, true, false);
-  }
-
-  function onIceCandidate(event) {
-    if(event.candidate) {
-      test.log(event.candidate.candidate);
-      this.addIceCandidate(event.candidate,
-         onAddIceCandidateSuccess, test.fail);
-    }
-
-    function onAddIceCandidateSuccess() {
-      test.log("Candidate added successfully");
-    }
-  }
-
-  function createOfferAndAnswer(pc1, pc2) {
-    test.log("Creating offer.");
-    pc1.createOffer(gotOffer, test.fail);
-
-    function gotOffer(offer) {
-      test.log("Got offer");
-      pc1.setLocalDescription(offer, onSetSessionDescriptionSuccess, test.fail);
-      pc2.setRemoteDescription(offer, onSetSessionDescriptionSuccess,
-          test.fail);
-      test.log("Creating answer");
-      pc2.createAnswer(gotAnswer, test.fail);
-    }
-
-    function gotAnswer(answer) {
-      test.log("Got answer");
-      pc2.setLocalDescription(answer, onSetSessionDescriptionSuccess,
-          test.fail);
-      pc1.setRemoteDescription(answer, onSetSessionDescriptionSuccess,
-          test.fail);
-      collectStats();
-    }
-
-    function onSetSessionDescriptionSuccess() {
-      test.log("Set session description success.");
-    }
-
-    function collectStats() {
-      report.collectStatsFromPeerConnection("bot1", pc1);
-      report.collectStatsFromPeerConnection("bot2", pc2);
-
-      setTimeout(function() {
-        report.finish(test.done);
-        }, 10000);
-    }
-  }
-}
-
-registerBotTest('testOneWayVideo/chrome-chrome',
-                testOneWayVideo, ['chrome', 'chrome']);
diff --git a/rtc_tools/sanitizers_unittest.cc b/rtc_tools/sanitizers_unittest.cc
deleted file mode 100644
index 74cb081..0000000
--- a/rtc_tools/sanitizers_unittest.cc
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- *  Copyright (c) 2017 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 <stddef.h>
-#include <stdio.h>
-#include <random>
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/nullsocketserver.h"
-#include "webrtc/rtc_base/ptr_util.h"
-#include "webrtc/rtc_base/thread.h"
-#include "webrtc/test/gtest.h"
-
-namespace rtc {
-
-namespace {
-
-#if defined(MEMORY_SANITIZER)
-void UseOfUninitializedValue() {
-  int* buf = new int[2];
-  std::random_device engine;
-  if (buf[engine() % 2]) {  // Non-deterministic conditional.
-    printf("Externally visible action.");
-  }
-  delete[] buf;
-}
-
-TEST(SanitizersDeathTest, MemorySanitizer) {
-  EXPECT_DEATH(UseOfUninitializedValue(), "use-of-uninitialized-value");
-}
-#endif
-
-#if defined(ADDRESS_SANITIZER)
-void HeapUseAfterFree() {
-  char *buf = new char[2];
-  delete[] buf;
-  buf[0] = buf[1];
-}
-
-TEST(SanitizersDeathTest, AddressSanitizer) {
-  EXPECT_DEATH(HeapUseAfterFree(), "heap-use-after-free");
-}
-#endif
-
-#if defined(UNDEFINED_SANITIZER)
-// For ubsan:
-void SignedIntegerOverflow() {
-  int32_t x = 1234567890;
-  x *= 2;
-}
-
-// For ubsan_vptr:
-struct Base {
-  virtual void f() {}
-  virtual ~Base() {}
-};
-struct Derived : public Base {
-};
-
-void InvalidVptr() {
-  Base b;
-  auto* d = static_cast<Derived*>(&b);  // Bad downcast.
-  d->f();  // Virtual function call with object of wrong dynamic type.
-}
-
-TEST(SanitizersDeathTest, UndefinedSanitizer) {
-  EXPECT_DEATH({ SignedIntegerOverflow(); InvalidVptr(); }, "runtime error");
-}
-#endif
-
-#if defined(THREAD_SANITIZER)
-class IncrementThread : public Thread {
- public:
-  explicit IncrementThread(int* value)
-      : Thread(rtc::MakeUnique<NullSocketServer>()),
-        value_(value) {}
-
-  void Run() override {
-    ++*value_;
-    Thread::Current()->SleepMs(100);
-  }
-
-  // Un-protect Thread::Join for the test.
-  void Join() {
-    Thread::Join();
-  }
-
- private:
-  int* value_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(IncrementThread);
-};
-
-void DataRace() {
-  int value = 0;
-  IncrementThread thread1(&value);
-  IncrementThread thread2(&value);
-  thread1.Start();
-  thread2.Start();
-  thread1.Join();
-  thread2.Join();
-  // TSan seems to mess with gtest's death detection.
-  // Fail intentionally, and rely on detecting the error message.
-  RTC_CHECK(false);
-}
-
-TEST(SanitizersDeathTest, ThreadSanitizer) {
-  EXPECT_DEATH(DataRace(), "data race");
-}
-#endif
-
-}  // namespace
-
-}  // namespace rtc
diff --git a/rtc_tools/simple_command_line_parser.cc b/rtc_tools/simple_command_line_parser.cc
deleted file mode 100644
index fae02ae..0000000
--- a/rtc_tools/simple_command_line_parser.cc
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- *  Copyright (c) 2012 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/rtc_tools/simple_command_line_parser.h"
-
-#include <stdio.h>
-#include <stdlib.h>
-
-#include <string>
-
-namespace webrtc {
-namespace test {
-
-CommandLineParser::CommandLineParser() {}
-CommandLineParser::~CommandLineParser() {}
-
-void CommandLineParser::Init(int argc, char** argv) {
-  args_ = std::vector<std::string> (argv + 1, argv + argc);
-}
-
-bool CommandLineParser::IsStandaloneFlag(std::string flag) {
-  return flag.find("=") == std::string::npos;
-}
-
-bool CommandLineParser::IsFlagWellFormed(std::string flag) {
-  size_t dash_pos = flag.find("--");
-  size_t equal_pos = flag.find("=");
-  if (dash_pos != 0) {
-    fprintf(stderr, "Wrong switch format: %s\n", flag.c_str());
-    fprintf(stderr, "Flag doesn't start with --\n");
-    return false;
-  }
-  size_t flag_length = flag.length() - 1;
-
-  // We use 3 here because we assume that the flags are in the format
-  // --flag_name=flag_value, thus -- are at positions 0 and 1 and we should have
-  // at least one symbol for the flag name.
-  if (equal_pos > 0 && (equal_pos < 3 || equal_pos == flag_length)) {
-    fprintf(stderr, "Wrong switch format: %s\n", flag.c_str());
-    fprintf(stderr, "Wrong placement of =\n");
-    return false;
-  }
-  return true;
-}
-
-std::string CommandLineParser::GetCommandLineFlagName(std::string flag) {
-  size_t dash_pos = flag.find("--");
-  size_t equal_pos = flag.find("=");
-  if (equal_pos == std::string::npos) {
-    return flag.substr(dash_pos + 2);
-  } else {
-    return flag.substr(dash_pos + 2, equal_pos - 2);
-  }
-}
-
-std::string CommandLineParser::GetCommandLineFlagValue(std::string flag) {
-  size_t equal_pos = flag.find("=");
-  if (equal_pos == std::string::npos) {
-    return "";
-  } else {
-    return flag.substr(equal_pos + 1);
-  }
-}
-
-void CommandLineParser::PrintEnteredFlags() {
-  std::map<std::string, std::string>::iterator flag_iter;
-  fprintf(stdout, "You have entered:\n");
-  for (flag_iter = flags_.begin(); flag_iter != flags_.end(); ++flag_iter) {
-    if (flag_iter->first != "help") {
-      fprintf(stdout, "%s=%s, ", flag_iter->first.c_str(),
-              flag_iter->second.c_str());
-    }
-  }
-  fprintf(stdout, "\n");
-}
-
-void CommandLineParser::ProcessFlags() {
-  std::map<std::string, std::string>::iterator flag_iter;
-  std::vector<std::string>::iterator iter;
-  for (iter = args_.begin(); iter != args_.end(); ++iter) {
-    if (!IsFlagWellFormed(*iter)) {
-      // Ignore badly formated flags.
-      continue;
-    }
-    std::string flag_name = GetCommandLineFlagName(*iter);
-    flag_iter = flags_.find(flag_name);
-    if (flag_iter == flags_.end()) {
-      // Ignore unknown flags.
-      fprintf(stdout, "Flag '%s' is not recognized\n", flag_name.c_str());
-      continue;
-    }
-    if (IsStandaloneFlag(*iter)) {
-      flags_[flag_name] = "true";
-    } else {
-      flags_[flag_name] = GetCommandLineFlagValue(*iter);
-    }
-  }
-}
-
-void CommandLineParser::SetUsageMessage(std::string usage_message) {
-  usage_message_ = usage_message;
-}
-
-void CommandLineParser::PrintUsageMessage() {
-  fprintf(stdout, "%s", usage_message_.c_str());
-}
-
-void CommandLineParser::SetFlag(std::string flag_name,
-                                std::string default_flag_value) {
-  flags_[flag_name] = default_flag_value;
-}
-
-std::string CommandLineParser::GetFlag(std::string flag_name) {
-  std::map<std::string, std::string>::iterator flag_iter;
-  flag_iter = flags_.find(flag_name);
-  // If no such flag.
-  if (flag_iter == flags_.end()) {
-    return "";
-  }
-  return flag_iter->second;
-}
-
-}  // namespace test
-}  // namespace webrtc
diff --git a/rtc_tools/simple_command_line_parser.h b/rtc_tools/simple_command_line_parser.h
deleted file mode 100644
index 1137a74..0000000
--- a/rtc_tools/simple_command_line_parser.h
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- *  Copyright (c) 2012 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_RTC_TOOLS_SIMPLE_COMMAND_LINE_PARSER_H_
-#define WEBRTC_RTC_TOOLS_SIMPLE_COMMAND_LINE_PARSER_H_
-
-#include <map>
-#include <string>
-#include <vector>
-
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/gtest_prod_util.h"
-
-// This is a very basic command line parsing class. We pass the command line
-// arguments and their number and the class forms a vector out of these. Than we
-// should set up the flags - we provide a name and a string value and map these.
-//
-// Example use of this class:
-// 1. Create a CommandLineParser object.
-// 2. Configure the flags you want to support with SetFlag calls.
-// 3. Call Init with your program's argc+argv parameters.
-// 4. Parse the flags by calling ProcessFlags.
-// 5. Get the values of the flags using GetFlag.
-
-namespace webrtc {
-namespace test {
-
-class CommandLineParser {
- public:
-  CommandLineParser();
-  ~CommandLineParser();
-
-  void Init(int argc, char** argv);
-
-  // Prints the entered flags and their values (without --help).
-  void PrintEnteredFlags();
-
-  // Processes the vector of command line arguments and puts the value of each
-  // flag in the corresponding map entry for this flag's name. We don't process
-  // flags which haven't been defined in the map.
-  void ProcessFlags();
-
-  // Sets the usage message to be shown if we pass --help.
-  void SetUsageMessage(std::string usage_message);
-
-  // prints the usage message.
-  void PrintUsageMessage();
-
-  // Set a flag into the map of flag names/values.
-  // To set a boolean flag, use "false" as the default flag value.
-  // The flag_name should not include the -- prefix.
-  void SetFlag(std::string flag_name, std::string default_flag_value);
-
-  // Gets a flag when provided a flag name (name is without the -- prefix).
-  // Returns "" if the flag is unknown and "true"/"false" if the flag is a
-  // boolean flag.
-  std::string GetFlag(std::string flag_name);
-
- private:
-  // The vector of passed command line arguments.
-  std::vector<std::string> args_;
-  // The map of the flag names/values.
-  std::map<std::string, std::string> flags_;
-  // The usage message.
-  std::string usage_message_;
-
-  // Returns whether the passed flag is standalone or not. By standalone we
-  // understand e.g. --standalone (in contrast to --non_standalone=1).
-  bool IsStandaloneFlag(std::string flag);
-
-  // Checks whether the flag is in the format --flag_name=flag_value.
-  // or just --flag_name.
-  bool IsFlagWellFormed(std::string flag);
-
-  // Extracts the flag name from the flag, i.e. return foo for --foo=bar.
-  std::string GetCommandLineFlagName(std::string flag);
-
-  // Extracts the flag value from the flag, i.e. return bar for --foo=bar.
-  // If the flag has no value (i.e. no equals sign) an empty string is returned.
-  std::string GetCommandLineFlagValue(std::string flag);
-
-  FRIEND_TEST_ALL_PREFIXES(CommandLineParserTest, IsStandaloneFlag);
-  FRIEND_TEST_ALL_PREFIXES(CommandLineParserTest, IsFlagWellFormed);
-  FRIEND_TEST_ALL_PREFIXES(CommandLineParserTest, GetCommandLineFlagName);
-  FRIEND_TEST_ALL_PREFIXES(CommandLineParserTest, GetCommandLineFlagValue);
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(CommandLineParser);
-};
-
-}  // namespace test
-}  // namespace webrtc
-
-#endif  // WEBRTC_RTC_TOOLS_SIMPLE_COMMAND_LINE_PARSER_H_
diff --git a/rtc_tools/simple_command_line_parser_unittest.cc b/rtc_tools/simple_command_line_parser_unittest.cc
deleted file mode 100644
index c71b472..0000000
--- a/rtc_tools/simple_command_line_parser_unittest.cc
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- *  Copyright (c) 2012 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/test/gtest.h"
-#include "webrtc/rtc_tools/simple_command_line_parser.h"
-
-namespace webrtc {
-namespace test {
-
-class CommandLineParserTest : public ::testing::Test {
- protected:
-  void SetUp() override {
-    parser_ = new CommandLineParser();
-
-    test_flags_length_ = 3;
-    int flag_size = 32;
-    test_flags_ = new char*[test_flags_length_];
-    for (int i = 0; i < test_flags_length_; ++i) {
-      test_flags_[i] = new char[flag_size];
-    }
-    strncpy(test_flags_[0], "tools_unittest", flag_size);
-    strncpy(test_flags_[1], "--foo", flag_size);
-    strncpy(test_flags_[2], "--bar=1", flag_size);
-  }
-  void TearDown() override {
-    for (int i = 0; i < test_flags_length_; ++i) {
-      delete[] test_flags_[i];
-    }
-    delete[] test_flags_;
-    delete parser_;
-  }
-  CommandLineParser* parser_;
-  // Test flags to emulate a program's argv arguments.
-  char** test_flags_;
-  int test_flags_length_;
-};
-
-TEST_F(CommandLineParserTest, ProcessFlags) {
-  // Setup supported flags to parse.
-  parser_->SetFlag("foo", "false");
-  parser_->SetFlag("foo-foo", "false");  // To test boolean flags defaults.
-  parser_->SetFlag("bar", "222");
-  parser_->SetFlag("baz", "333");  // To test the default value functionality.
-
-  parser_->Init(test_flags_length_, test_flags_);
-  parser_->ProcessFlags();
-  EXPECT_EQ("true", parser_->GetFlag("foo"));
-  EXPECT_EQ("false", parser_->GetFlag("foo-foo"));
-  EXPECT_EQ("1", parser_->GetFlag("bar"));
-  EXPECT_EQ("333", parser_->GetFlag("baz"));
-  EXPECT_EQ("", parser_->GetFlag("unknown"));
-}
-
-TEST_F(CommandLineParserTest, IsStandaloneFlag) {
-  EXPECT_TRUE(parser_->IsStandaloneFlag("--foo"));
-  EXPECT_TRUE(parser_->IsStandaloneFlag("--foo-foo"));
-  EXPECT_FALSE(parser_->IsStandaloneFlag("--foo=1"));
-}
-
-TEST_F(CommandLineParserTest, IsFlagWellFormed) {
-  EXPECT_TRUE(parser_->IsFlagWellFormed("--foo"));
-  EXPECT_TRUE(parser_->IsFlagWellFormed("--foo-foo"));
-  EXPECT_TRUE(parser_->IsFlagWellFormed("--bar=1"));
-}
-
-TEST_F(CommandLineParserTest, GetCommandLineFlagName) {
-  EXPECT_EQ("foo", parser_->GetCommandLineFlagName("--foo"));
-  EXPECT_EQ("foo-foo", parser_->GetCommandLineFlagName("--foo-foo"));
-  EXPECT_EQ("bar", parser_->GetCommandLineFlagName("--bar=1"));
-}
-
-TEST_F(CommandLineParserTest, GetCommandLineFlagValue) {
-  EXPECT_EQ("", parser_->GetCommandLineFlagValue("--foo"));
-  EXPECT_EQ("", parser_->GetCommandLineFlagValue("--foo-foo"));
-  EXPECT_EQ("1", parser_->GetCommandLineFlagValue("--bar=1"));
-}
-
-}  // namespace test
-}  // namespace webrtc
diff --git a/rtc_tools/testing/README.md b/rtc_tools/testing/README.md
deleted file mode 100644
index 7d5c774..0000000
--- a/rtc_tools/testing/README.md
+++ /dev/null
@@ -1,38 +0,0 @@
-This directory contains prebuilt tools used during end-to-end tests.
-They will be downloaded by their SHA1 hash, and are not meant to be checked in.
-
-Updating prebuilt_apprtc.zip:
-
-- Follow AppRTC instructions:
-    - `git clone https://github.com/webrtc/apprtc`
-    - Install NodeJS:
-        - Download <https://nodejs.org/> and extract it
-        - `export PATH="$(pwd)/node-v6.10.3-linux-x64/bin:$PATH"`
-    - `cd apprtc`
-    - `npm install`
-    - `export PATH="$(pwd)/node_modules/.bin:$PATH"`
-    - `pip install --user --upgrade pip setuptools` - needed only on old systems
-    - `grunt`
-- Vendor collider's dependencies:
-    - `ln -s "$(pwd)/src/collider" src/src`
-    - `GOPATH="$(pwd)/src" go get -d collidermain`
-    - `rm src/src`
-- Remove unneeded files:
-    - `rm -rf .git node_modules browsers`
-- `zip -r prebuilt_apprtc.zip apprtc/`
-- `mv prebuilt_apprtc.zip webrtc/src/webrtc/rtc_tools/testing/prebuilt_apprtc.zip`
-
-Updating golang/*:
-
-- Go to <https://golang.org/dl/>
-- Download these files:
-    - go*.linux-amd64.tar.gz -> golang/linux/go.tar.gz
-    - go*.darwin-amd64.tar.gz -> golang/mac/go.tar.gz
-    - go*.windows-amd64.zip -> golang/windows/go.zip
-
-After updating the archives:
-
-- `cd webrtc/src/webrtc/rtc_tools/testing`
-- For each updated archive:
-    - `upload_to_google_storage.py file.zip --bucket=chromium-webrtc-resources`
-- `git commit -a && git cl upload`
diff --git a/rtc_tools/testing/build_apprtc.py b/rtc_tools/testing/build_apprtc.py
deleted file mode 100755
index a390c94..0000000
--- a/rtc_tools/testing/build_apprtc.py
+++ /dev/null
@@ -1,57 +0,0 @@
-#!/usr/bin/env python
-# Copyright (c) 2017 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.
-
-"""Builds the AppRTC collider using the golang toolchain.
-
-The golang toolchain is downloaded by download_apprtc.py. We use that here
-to build the AppRTC collider server.
-
-This script needs to know the path to the 'src' directory in apprtc, the
-root directory of 'go' and the output_dir.
-"""
-
-import os
-import shutil
-import subprocess
-import sys
-
-import utils
-
-
-USAGE_STR = "Usage: {} <apprtc_src_dir> <go_dir> <output_dir>"
-
-
-def main(argv):
-  if len(argv) != 4:
-    return USAGE_STR.format(argv[0])
-
-  apprtc_dir = os.path.abspath(argv[1])
-  go_root_dir = os.path.abspath(argv[2])
-  golang_workspace = os.path.abspath(argv[3])
-
-  utils.RemoveDirectory(golang_workspace)
-
-  golang_workspace_src = os.path.join(golang_workspace, 'src')
-
-  collider_dir = os.path.join(apprtc_dir, 'collider')
-  shutil.copytree(collider_dir, golang_workspace_src)
-
-  golang_binary = 'go%s' % ('.exe' if utils.GetPlatform() == 'win' else '')
-  golang_path = os.path.join(go_root_dir, 'bin', golang_binary)
-
-  golang_env = os.environ.copy()
-  golang_env['GOROOT'] = go_root_dir
-  golang_env['GOPATH'] = golang_workspace
-  collider_exec = os.path.join(golang_workspace, 'collidermain')
-  subprocess.check_call([golang_path, 'build', '-o', collider_exec,
-                         'collidermain'], env=golang_env)
-
-
-if __name__ == '__main__':
-  sys.exit(main(sys.argv))
diff --git a/rtc_tools/testing/download_apprtc.py b/rtc_tools/testing/download_apprtc.py
deleted file mode 100755
index f6db785..0000000
--- a/rtc_tools/testing/download_apprtc.py
+++ /dev/null
@@ -1,58 +0,0 @@
-#!/usr/bin/env python
-# Copyright (c) 2017 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.
-
-"""Downloads prebuilt AppRTC and Go from WebRTC storage and unpacks it.
-
-Requires that depot_tools is installed and in the PATH.
-
-It downloads compressed files in the directory where the script lives.
-This is because the precondition is that the script lives in the same
-directory of the .sha1 files.
-"""
-
-import os
-import sys
-
-import utils
-
-
-SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
-
-
-def _GetGoArchivePathForPlatform():
-  archive_extension = 'zip' if utils.GetPlatform() == 'win' else 'tar.gz'
-  return os.path.join(utils.GetPlatform(), 'go.%s' % archive_extension)
-
-
-def main(argv):
-  if len(argv) > 2:
-    return 'Usage: %s [output_dir]' % argv[0]
-
-  output_dir = os.path.abspath(argv[1]) if len(argv) > 1 else None
-
-  apprtc_zip_path = os.path.join(SCRIPT_DIR, 'prebuilt_apprtc.zip')
-  if os.path.isfile(apprtc_zip_path + '.sha1'):
-    utils.DownloadFilesFromGoogleStorage(SCRIPT_DIR, auto_platform=False)
-
-  if output_dir is not None:
-    utils.RemoveDirectory(os.path.join(output_dir, 'apprtc'))
-    utils.UnpackArchiveTo(apprtc_zip_path, output_dir)
-
-  golang_path = os.path.join(SCRIPT_DIR, 'golang')
-  golang_zip_path = os.path.join(golang_path, _GetGoArchivePathForPlatform())
-  if os.path.isfile(golang_zip_path + '.sha1'):
-    utils.DownloadFilesFromGoogleStorage(golang_path)
-
-  if output_dir is not None:
-    utils.RemoveDirectory(os.path.join(output_dir, 'go'))
-    utils.UnpackArchiveTo(golang_zip_path, output_dir)
-
-
-if __name__ == '__main__':
-  sys.exit(main(sys.argv))
diff --git a/rtc_tools/testing/golang/linux/go.tar.gz.sha1 b/rtc_tools/testing/golang/linux/go.tar.gz.sha1
deleted file mode 100644
index aa25095..0000000
--- a/rtc_tools/testing/golang/linux/go.tar.gz.sha1
+++ /dev/null
@@ -1 +0,0 @@
-a433f76c569055ff8536d796995518dd91a9fa5b
\ No newline at end of file
diff --git a/rtc_tools/testing/golang/mac/go.tar.gz.sha1 b/rtc_tools/testing/golang/mac/go.tar.gz.sha1
deleted file mode 100644
index 6dbaaf3..0000000
--- a/rtc_tools/testing/golang/mac/go.tar.gz.sha1
+++ /dev/null
@@ -1 +0,0 @@
-aecf5ec9360a004fdbff181269554892743f4bf6
\ No newline at end of file
diff --git a/rtc_tools/testing/golang/win/go.zip.sha1 b/rtc_tools/testing/golang/win/go.zip.sha1
deleted file mode 100644
index 00fae8d..0000000
--- a/rtc_tools/testing/golang/win/go.zip.sha1
+++ /dev/null
@@ -1 +0,0 @@
-26bf854fb81f12e9c80a146d8f0081cd22ae9d02
\ No newline at end of file
diff --git a/rtc_tools/testing/prebuilt_apprtc.zip.sha1 b/rtc_tools/testing/prebuilt_apprtc.zip.sha1
deleted file mode 100644
index 95b41c7..0000000
--- a/rtc_tools/testing/prebuilt_apprtc.zip.sha1
+++ /dev/null
@@ -1 +0,0 @@
-d8d95f55129e0c1a4e0f5d0d3acbf7163395354c
\ No newline at end of file
diff --git a/rtc_tools/testing/setup_apprtc.py b/rtc_tools/testing/setup_apprtc.py
deleted file mode 100755
index 697d503..0000000
--- a/rtc_tools/testing/setup_apprtc.py
+++ /dev/null
@@ -1,44 +0,0 @@
-#!/usr/bin/env python
-# Copyright (c) 2017 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.
-
-"""This script sets up AppRTC and its dependencies.
-
-Requires that depot_tools is installed and in the PATH.
-
-It will put the result under <output_dir>/collider.
-"""
-
-import os
-import sys
-
-import utils
-
-
-SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
-
-
-def main(argv):
-  if len(argv) == 1:
-    return 'Usage %s <output_dir>' % argv[0]
-
-  output_dir = os.path.abspath(argv[1])
-
-  download_apprtc_path = os.path.join(SCRIPT_DIR, 'download_apprtc.py')
-  utils.RunSubprocessWithRetry([download_apprtc_path, output_dir])
-
-  build_apprtc_path = os.path.join(SCRIPT_DIR, 'build_apprtc.py')
-  apprtc_src_dir = os.path.join(output_dir, 'apprtc', 'src')
-  go_dir = os.path.join(output_dir, 'go')
-  collider_dir = os.path.join(output_dir, 'collider')
-  utils.RunSubprocessWithRetry([build_apprtc_path, apprtc_src_dir,
-                                go_dir, collider_dir])
-
-
-if __name__ == '__main__':
-  sys.exit(main(sys.argv))
diff --git a/rtc_tools/testing/utils.py b/rtc_tools/testing/utils.py
deleted file mode 100755
index 3b82fc8..0000000
--- a/rtc_tools/testing/utils.py
+++ /dev/null
@@ -1,120 +0,0 @@
-#!/usr/bin/env python
-# Copyright (c) 2017 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.
-
-"""Utilities for all our deps-management stuff."""
-
-import os
-import shutil
-import sys
-import subprocess
-import tarfile
-import time
-import zipfile
-
-
-def RunSubprocessWithRetry(cmd):
-  """Invokes the subprocess and backs off exponentially on fail."""
-  for i in range(5):
-    try:
-      subprocess.check_call(cmd)
-      return
-    except subprocess.CalledProcessError as exception:
-      backoff = pow(2, i)
-      print 'Got %s, retrying in %d seconds...' % (exception, backoff)
-      time.sleep(backoff)
-
-  print 'Giving up.'
-  raise exception
-
-
-def DownloadFilesFromGoogleStorage(path, auto_platform=True):
-  print 'Downloading files in %s...' % path
-
-  extension = 'bat' if 'win32' in sys.platform else 'py'
-  cmd = ['download_from_google_storage.%s' % extension,
-         '--bucket=chromium-webrtc-resources',
-         '--directory', path]
-  if auto_platform:
-    cmd += ['--auto_platform', '--recursive']
-  subprocess.check_call(cmd)
-
-
-# Code partially copied from
-# https://cs.chromium.org#chromium/build/scripts/common/chromium_utils.py
-def RemoveDirectory(*path):
-  """Recursively removes a directory, even if it's marked read-only.
-
-  Remove the directory located at *path, if it exists.
-
-  shutil.rmtree() doesn't work on Windows if any of the files or directories
-  are read-only, which svn repositories and some .svn files are.  We need to
-  be able to force the files to be writable (i.e., deletable) as we traverse
-  the tree.
-
-  Even with all this, Windows still sometimes fails to delete a file, citing
-  a permission error (maybe something to do with antivirus scans or disk
-  indexing).  The best suggestion any of the user forums had was to wait a
-  bit and try again, so we do that too.  It's hand-waving, but sometimes it
-  works. :/
-  """
-  file_path = os.path.join(*path)
-  print 'Deleting `{}`.'.format(file_path)
-  if not os.path.exists(file_path):
-    print '`{}` does not exist.'.format(file_path)
-    return
-
-  if sys.platform == 'win32':
-    # Give up and use cmd.exe's rd command.
-    file_path = os.path.normcase(file_path)
-    for _ in xrange(3):
-      print 'RemoveDirectory running %s' % (' '.join(
-          ['cmd.exe', '/c', 'rd', '/q', '/s', file_path]))
-      if not subprocess.call(['cmd.exe', '/c', 'rd', '/q', '/s', file_path]):
-        break
-      print '  Failed'
-      time.sleep(3)
-    return
-  else:
-    shutil.rmtree(file_path, ignore_errors=True)
-
-
-def UnpackArchiveTo(archive_path, output_dir):
-  extension = os.path.splitext(archive_path)[1]
-  if extension == '.zip':
-    _UnzipArchiveTo(archive_path, output_dir)
-  else:
-    _UntarArchiveTo(archive_path, output_dir)
-
-
-def _UnzipArchiveTo(archive_path, output_dir):
-  print 'Unzipping {} in {}.'.format(archive_path, output_dir)
-  zip_file = zipfile.ZipFile(archive_path)
-  try:
-    zip_file.extractall(output_dir)
-  finally:
-    zip_file.close()
-
-
-def _UntarArchiveTo(archive_path, output_dir):
-  print 'Untarring {} in {}.'.format(archive_path, output_dir)
-  tar_file = tarfile.open(archive_path, 'r:gz')
-  try:
-    tar_file.extractall(output_dir)
-  finally:
-    tar_file.close()
-
-
-def GetPlatform():
-  if sys.platform.startswith('win'):
-    return 'win'
-  if sys.platform.startswith('linux'):
-    return 'linux'
-  if sys.platform.startswith('darwin'):
-    return 'mac'
-  raise Exception("Can't run on platform %s." % sys.platform)
diff --git a/rtc_tools/video_analysis.py b/rtc_tools/video_analysis.py
deleted file mode 100755
index 1a7bb48..0000000
--- a/rtc_tools/video_analysis.py
+++ /dev/null
@@ -1,510 +0,0 @@
-#!/usr/bin/env python
-# Copyright (c) 2017 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.
-
-import glob
-import optparse
-import os
-import shutil
-import subprocess
-import sys
-import time
-
-
-# Used to time-stamp output files and directories
-CURRENT_TIME = time.strftime("%d_%m_%Y-%H:%M:%S")
-
-
-class Error(Exception):
-  pass
-
-
-class FfmpegError(Error):
-  pass
-
-
-class MagewellError(Error):
-  pass
-
-
-class CompareVideosError(Error):
-  pass
-
-
-def _ParseArgs():
-  """Registers the command-line options."""
-  usage = 'usage: %prog [options]'
-  parser = optparse.OptionParser(usage=usage)
-
-  parser.add_option('--frame_width', type='int', default=1280,
-                    help='Width of the recording. Default: %default')
-  parser.add_option('--frame_height', type='int', default=720,
-                    help='Height of the recording. Default: %default')
-  parser.add_option('--framerate', type='int', default=60,
-                    help='Recording framerate. Default: %default')
-  parser.add_option('--ref_duration', type='int', default=20,
-                    help='Reference recording duration. Default: %default')
-  parser.add_option('--test_duration', type='int', default=10,
-                    help='Test recording duration. Default: %default')
-  parser.add_option('--time_between_recordings', type='int', default=5,
-                    help='Time between starting test recording after ref.'
-                    'Default: %default')
-  parser.add_option('--ref_video_device', type='string', default='/dev/video0',
-                    help='Reference recording device. Default: %default')
-  parser.add_option('--test_video_device', type='string', default='/dev/video1',
-                    help='Test recording device. Default: %default')
-  parser.add_option('--app_name', type='string',
-                    help='Name of the app under test.')
-  parser.add_option('--recording_api', type='string', default='Video4Linux2',
-                    help='Recording API to use. Default: %default')
-  parser.add_option('--pixel_format', type='string', default='yuv420p',
-                    help='Recording pixel format Default: %default')
-  parser.add_option('--ffmpeg', type='string',
-                    help='Path to the ffmpeg executable for the reference '
-                    'device.')
-  parser.add_option('--video_container', type='string', default='yuv',
-                    help='Video container for the recordings.'
-                    'Default: %default')
-  parser.add_option('--compare_videos_script', type='string',
-                    default='compare_videos.py',
-                    help='Path to script used to compare and generate metrics.'
-                    'Default: %default')
-  parser.add_option('--frame_analyzer', type='string',
-                    default='../../out/Default/frame_analyzer',
-                    help='Path to the frame analyzer executable.'
-                    'Default: %default')
-  parser.add_option('--zxing_path', type='string',
-                    help='Path to the zebra xing barcode analyzer.')
-  parser.add_option('--ref_rec_dir', type='string', default='ref',
-                    help='Path to where reference recordings will be created.'
-                    'Ideally keep the ref and test directories on separate'
-                    'drives. Default: %default')
-  parser.add_option('--test_rec_dir', type='string', default='test',
-                    help='Path to where test recordings will be created.'
-                    'Ideally keep the ref and test directories on separate '
-                    'drives. Default: %default')
-  parser.add_option('--test_crop_parameters', type='string',
-                    help='ffmpeg processing parameters for the test video.')
-  parser.add_option('--ref_crop_parameters', type='string',
-                    help='ffmpeg processing parameters for the ref video.')
-
-  options, _ = parser.parse_args()
-
-  if not options.app_name:
-    parser.error('You must provide an application name!')
-
-  if not options.test_crop_parameters or not options.ref_crop_parameters:
-    parser.error('You must provide ref and test crop parameters!')
-
-  # Ensure the crop filter is included in the crop parameters used for ffmpeg.
-  if 'crop' not in options.ref_crop_parameters:
-    parser.error('You must provide a reference crop filter for ffmpeg.')
-  if 'crop' not in options.test_crop_parameters:
-    parser.error('You must provide a test crop filter for ffmpeg.')
-
-  if not options.ffmpeg:
-    parser.error('You most provide location for the ffmpeg executable.')
-  if not os.path.isfile(options.ffmpeg):
-    parser.error('Cannot find the ffmpeg executable.')
-
-  # compare_videos.py dependencies.
-  if not os.path.isfile(options.compare_videos_script):
-    parser.warning('Cannot find compare_videos.py script, no metrics will be '
-                   'generated!')
-  if not os.path.isfile(options.frame_analyzer):
-    parser.warning('Cannot find frame_analyzer, no metrics will be generated!')
-  if not os.path.isfile(options.zxing_path):
-    parser.warning('Cannot find Zebra Xing, no metrics will be generated!')
-
-  return options
-
-
-def CreateRecordingDirs(options):
-  """Create root + sub directories for reference and test recordings.
-
-  Args:
-    options(object): Contains all the provided command line options.
-
-  Returns:
-    record_paths(dict): key: value pair with reference and test file
-        absolute paths.
-  """
-
-  # Create root directories for the video recordings.
-  if not os.path.isdir(options.ref_rec_dir):
-    os.makedirs(options.ref_rec_dir)
-  if not os.path.isdir(options.test_rec_dir):
-    os.makedirs(options.test_rec_dir)
-
-  # Create and time-stamp directories for all the output files.
-  ref_rec_dir = os.path.join(options.ref_rec_dir, options.app_name + '_' + \
-    CURRENT_TIME)
-  test_rec_dir = os.path.join(options.test_rec_dir, options.app_name + '_' + \
-    CURRENT_TIME)
-
-  os.makedirs(ref_rec_dir)
-  os.makedirs(test_rec_dir)
-
-  record_paths = {
-    'ref_rec_location' : os.path.abspath(ref_rec_dir),
-    'test_rec_location' : os.path.abspath(test_rec_dir)
-  }
-
-  return record_paths
-
-
-def FindUsbPortForV4lDevices(ref_video_device, test_video_device):
-  """Tries to find the usb port for ref_video_device and test_video_device.
-
-  Tries to find the provided ref_video_device and test_video_device devices
-  which use video4linux and then do a soft reset by using USB unbind and bind.
-
-  Args:
-    ref_device(string): reference recording device path.
-    test_device(string): test recording device path
-
-  Returns:
-    usb_ports(list): USB ports(string) for the devices found.
-  """
-
-  # Find the device location including USB and USB Bus ID's. Use the usb1
-  # in the path since the driver folder is a symlink which contains all the
-  # usb device port mappings and it's the same in all usbN folders. Tested
-  # on Ubuntu 14.04.
-  v4l_device_path = '/sys/bus/usb/devices/usb1/1-1/driver/**/**/video4linux/'
-  v4l_ref_device = glob.glob('%s%s' % (v4l_device_path, ref_video_device))
-  v4l_test_device = glob.glob('%s%s' % (v4l_device_path, test_video_device))
-  usb_ports = []
-  paths = []
-
-  # Split on the driver folder first since we are only interested in the
-  # folders thereafter.
-  try:
-    ref_path = str(v4l_ref_device).split('driver')[1].split('/')
-    test_path = str(v4l_test_device).split('driver')[1].split('/')
-  except IndexError:
-    print 'Could not find one or both of the specified recording devices.'
-  else:
-    paths.append(ref_path)
-    paths.append(test_path)
-
-    for path in paths:
-      for usb_id in path:
-        # Look for : separator and then use the first element in the list.
-        # E.g 3-3.1:1.0 split on : and [0] becomes 3-3.1 which can be used
-        # for bind/unbind.
-        if ':' in usb_id:
-          usb_ports.append(usb_id.split(':')[0])
-
-  return usb_ports
-
-
-def RestartMagewellDevices(ref_video_device_path, test_video_device_path):
-  """Reset the USB ports where Magewell capture devices are connected to.
-
-  Performs a soft reset by using USB unbind and bind.
-  This is due to Magewell capture devices have proven to be unstable after the
-  first recording attempt.
-
-  Args:
-    ref_video_device_path(string): reference recording device path.
-    test_video_device_path(string): test recording device path
-
-  Raises:
-    MagewellError: If no magewell devices are found.
-  """
-
-  # Get the dev/videoN device name from the command line arguments.
-  ref_magewell_path = ref_video_device_path.split('/')[2]
-  test_magewell_path = test_video_device_path.split('/')[2]
-  magewell_usb_ports = FindUsbPortForV4lDevices(ref_magewell_path,
-                                                test_magewell_path)
-
-  # Abort early if no devices are found.
-  if len(magewell_usb_ports) == 0:
-    raise MagewellError('No magewell devices found.')
-  else:
-    print '\nResetting USB ports where magewell devices are connected...'
-    # Use the USB bus and port ID (e.g. 4-3) to unbind and bind the USB devices
-    # (i.e. soft eject and insert).
-    for usb_port in magewell_usb_ports:
-      echo_cmd = ['echo', usb_port]
-      unbind_cmd = ['sudo', 'tee', '/sys/bus/usb/drivers/usb/unbind']
-      bind_cmd = ['sudo', 'tee', '/sys/bus/usb/drivers/usb/bind']
-
-      # TODO(jansson) Figure out a way to call on echo once for bind & unbind
-      # if possible.
-      echo_unbind = subprocess.Popen(echo_cmd, stdout=subprocess.PIPE)
-      unbind = subprocess.Popen(unbind_cmd, stdin=echo_unbind.stdout)
-      echo_unbind.stdout.close()
-      unbind.wait()
-
-      echo_bind = subprocess.Popen(echo_cmd, stdout=subprocess.PIPE)
-      bind = subprocess.Popen(bind_cmd, stdin=echo_bind.stdout)
-      echo_bind.stdout.close()
-      bind.wait()
-  if bind.returncode == 0:
-    print 'Reset done!\n'
-
-
-def StartRecording(options, ref_file_location, test_file_location):
-  """Starts recording from the two specified video devices.
-
-  Args:
-    options(object): Contains all the provided command line options.
-    record_paths(dict): key: value pair with reference and test file
-        absolute paths.
-
-  Returns:
-    recording_files_and_time(dict): key: value pair with the path to cropped
-        test and reference video files.
-
-  Raises:
-    FfmpegError: If the ffmpeg command fails.
-  """
-  ref_file_name = '%s_%s_ref.%s' % (options.app_name, CURRENT_TIME,
-    options.video_container)
-  ref_file = os.path.join(ref_file_location, ref_file_name)
-
-  test_file_name = '%s_%s_test.%s' % (options.app_name, CURRENT_TIME,
-    options.video_container)
-  test_file = os.path.join(test_file_location, test_file_name)
-
-  # Reference video recorder command line.
-  ref_cmd = [
-    options.ffmpeg,
-    '-v', 'error',
-    '-s', '%dx%d' % (options.frame_width, options.frame_height),
-    '-r', '%d' % options.framerate,
-    '-f', '%s' % options.recording_api,
-    '-i', '%s' % options.ref_video_device,
-    '-pix_fmt', '%s' % options.pixel_format,
-    '-s', '%dx%d' % (options.frame_width, options.frame_height),
-    '-t', '%d' % options.ref_duration,
-    '-r', '%d' % options.framerate,
-    ref_file
-  ]
-
-  # Test video recorder command line.
-  test_cmd = [
-    options.ffmpeg,
-    '-v', 'error',
-    '-s', '%dx%d' % (options.frame_width, options.frame_height),
-    '-r', '%d' % options.framerate,
-    '-f', '%s' % options.recording_api,
-    '-i', '%s' % options.test_video_device,
-    '-pix_fmt', '%s' % options.pixel_format,
-    '-s', '%dx%d' % (options.frame_width, options.frame_height),
-    '-t', '%d' % options.test_duration,
-    '-r', '%d' % options.framerate,
-    test_file
-  ]
-  print 'Trying to record from reference recorder...'
-  ref_recorder = subprocess.Popen(ref_cmd)
-
-  # Start the 2nd recording a little later to ensure the 1st one has started.
-  # TODO(jansson) Check that the ref_recorder output file exists rather than
-  # using sleep.
-  time.sleep(options.time_between_recordings)
-  print 'Trying to record from test recorder...'
-  test_recorder = subprocess.Popen(test_cmd)
-  test_recorder.wait()
-  ref_recorder.wait()
-
-  # ffmpeg does not abort when it fails, need to check return code.
-  if ref_recorder.returncode != 0 or test_recorder.returncode != 0:
-    # Cleanup recording directories.
-    shutil.rmtree(ref_file_location)
-    shutil.rmtree(test_file_location)
-    raise FfmpegError('Recording failed, check ffmpeg output.')
-  else:
-    print 'Ref file recorded to: ' + os.path.abspath(ref_file)
-    print 'Test file recorded to: ' + os.path.abspath(test_file)
-    print 'Recording done!\n'
-    return FlipAndCropRecordings(options, test_file_name, test_file_location,
-        ref_file_name, ref_file_location)
-
-
-def FlipAndCropRecordings(options, test_file_name, test_file_location,
-                          ref_file_name, ref_file_location):
-  """Performs a horizontal flip of the reference video to match the test video.
-
-  This is done to the match orientation and then crops the ref and test videos
-  using the options.test_crop_parameters and options.ref_crop_parameters.
-
-  Args:
-    options(object): Contains all the provided command line options.
-    test_file_name(string): Name of the test video file recording.
-    test_file_location(string): Path to the test video file recording.
-    ref_file_name(string): Name of the reference video file recording.
-    ref_file_location(string): Path to the reference video file recording.
-
-  Returns:
-    recording_files_and_time(dict): key: value pair with the path to cropped
-        test and reference video files.
-
-  Raises:
-    FfmpegError: If the ffmpeg command fails.
-  """
-  print 'Trying to crop videos...'
-
-  # Ref file cropping.
-  cropped_ref_file_name = 'cropped_' + ref_file_name
-  cropped_ref_file = os.path.abspath(
-      os.path.join(ref_file_location, cropped_ref_file_name))
-
-  ref_video_crop_cmd = [
-    options.ffmpeg,
-    '-v', 'error',
-    '-s', '%dx%d' % (options.frame_width, options.frame_height),
-    '-i', '%s' % os.path.join(ref_file_location, ref_file_name),
-    '-vf', '%s' % options.ref_crop_parameters,
-    '-c:a', 'copy',
-    cropped_ref_file
-  ]
-
-  # Test file cropping.
-  cropped_test_file_name = 'cropped_' + test_file_name
-  cropped_test_file = os.path.abspath(
-      os.path.join(test_file_location, cropped_test_file_name))
-
-  test_video_crop_cmd = [
-    options.ffmpeg,
-    '-v', 'error',
-    '-s', '%dx%d' % (options.frame_width, options.frame_height),
-    '-i', '%s' % os.path.join(test_file_location, test_file_name),
-    '-vf', '%s' % options.test_crop_parameters,
-    '-c:a', 'copy',
-    cropped_test_file
-  ]
-
-  ref_crop = subprocess.Popen(ref_video_crop_cmd)
-  ref_crop.wait()
-  test_crop = subprocess.Popen(test_video_crop_cmd)
-  test_crop.wait()
-
-  # ffmpeg does not abort when it fails, need to check return code.
-  if ref_crop.returncode != 0 or test_crop.returncode != 0:
-    # Cleanup recording directories.
-    shutil.rmtree(ref_file_location)
-    shutil.rmtree(test_file_location)
-    raise FfmpegError('Cropping failed, check ffmpeg output.')
-  else:
-    print 'Ref file cropped to: ' + cropped_ref_file
-    print 'Test file cropped to: ' + cropped_test_file
-    print 'Cropping done!\n'
-
-    # Need to return these so they can be used by other parts.
-    cropped_recordings = {
-      'cropped_test_file' : cropped_test_file,
-      'cropped_ref_file' : cropped_ref_file
-    }
-    return cropped_recordings
-
-
-def CompareVideos(options, cropped_ref_file, cropped_test_file):
-  """Runs the compare_video.py script from src/webrtc/rtc_tools using path.
-
-  Uses the path from recording_result and writes the output to a file named
-  <options.app_name + '_' + CURRENT_TIME + '_result.txt> in the reference video
-  recording folder taken from recording_result.
-
-  Args:
-    options(object): Contains all the provided command line options.
-    cropped_ref_file(string): Path to cropped reference video file.
-    cropped_test_file(string): Path to cropped test video file.
-
-  Raises:
-    CompareVideosError: If compare_videos.py fails.
-  """
-  print 'Starting comparison...'
-  print 'Grab a coffee, this might take a few minutes...'
-  compare_videos_script = os.path.abspath(options.compare_videos_script)
-  rec_path = os.path.abspath(os.path.join(
-    os.path.dirname(cropped_test_file)))
-  result_file_name = os.path.join(rec_path, '%s_%s_result.txt') % (
-    options.app_name, CURRENT_TIME)
-
-  # Find the crop dimensions (e.g. 950 and 420) in the ref crop parameter
-  # string: 'hflip, crop=950:420:130:56'
-  for param in options.ref_crop_parameters.split('crop'):
-    if param[0] == '=':
-      crop_width = int(param.split(':')[0].split('=')[1])
-      crop_height = int(param.split(':')[1])
-
-  compare_cmd = [
-    compare_videos_script,
-    '--ref_video=%s' % cropped_ref_file,
-    '--test_video=%s' % cropped_test_file,
-    '--frame_analyzer=%s' % os.path.abspath(options.frame_analyzer),
-    '--zxing_path=%s' % options.zxing_path,
-    '--ffmpeg_path=%s' % options.ffmpeg,
-    '--stats_file_ref=%s_stats.txt' %
-        os.path.join(os.path.dirname(cropped_ref_file), cropped_ref_file),
-    '--stats_file_test=%s_stats.txt' %
-        os.path.join(os.path.dirname(cropped_test_file), cropped_test_file),
-    '--yuv_frame_height=%d' % crop_height,
-    '--yuv_frame_width=%d' % crop_width
-  ]
-
-  with open(result_file_name, 'w') as f:
-    try:
-      compare_video_recordings = subprocess.check_output(compare_cmd)
-      f.write(compare_video_recordings)
-    except subprocess.CalledProcessError as error:
-      raise CompareVideosError('Failed to perform comparison: %s' % error)
-    else:
-      print 'Result recorded to: %s' % os.path.abspath(result_file_name)
-      print 'Comparison done!'
-      return compare_video_recordings
-
-
-def main():
-  """The main function.
-
-  A simple invocation is:
-  ./run_video_analysis.py \
-    --app_name AppRTCMobile \
-    --ffmpeg ./ffmpeg --ref_video_device=/dev/video0 \
-    --test_video_device=/dev/video1 \
-    --zxing_path ./zxing \
-    --test_crop_parameters 'crop=950:420:130:56' \
-    --ref_crop_parameters 'hflip, crop=950:420:130:56' \
-    --ref_rec_dir /tmp/ref \
-    --test_rec_dir /tmp/test
-
-  This will produce the following files if successful:
-  # Original video recordings.
-  /tmp/ref/AppRTCMobile_<recording date and time>_ref.yuv
-  /tmp/test/AppRTCMobile_<recording date and time>_test.yuv
-
-  # Cropped video recordings according to the crop parameters.
-  /tmp/ref/cropped_AppRTCMobile_<recording date and time>_ref.yuv
-  /tmp/test/cropped_AppRTCMobile_<recording date and time>_ref.yuv
-
-  # Comparison metrics from cropped test and ref videos.
-  /tmp/test/AppRTCMobile_<recording date and time>_result.text
-
-  """
-  options = _ParseArgs()
-  RestartMagewellDevices(options.ref_video_device, options.test_video_device)
-  record_paths = CreateRecordingDirs(options)
-  recording_result = StartRecording(options, record_paths['ref_rec_location'],
-                                    record_paths['test_rec_location'])
-
-  # Do not require compare_video.py script to run, no metrics will be generated.
-  if options.compare_videos_script:
-    CompareVideos(options, recording_result['cropped_ref_file'],
-                  recording_result['cropped_test_file'])
-  else:
-    print ('Skipping compare videos step due to compare_videos flag were not '
-           'passed.')
-
-
-if __name__ == '__main__':
-  sys.exit(main())
diff --git a/rtc_tools/video_analysis_test.py b/rtc_tools/video_analysis_test.py
deleted file mode 100755
index e0c0f4b..0000000
--- a/rtc_tools/video_analysis_test.py
+++ /dev/null
@@ -1,69 +0,0 @@
-#!/usr/bin/env python
-# Copyright (c) 2017 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.
-
-import glob
-import unittest
-from video_analysis import FindUsbPortForV4lDevices
-
-
-class RunVideoAnalysisTest(unittest.TestCase):
-  def SetGlobPath(self, path1, path2):
-    self.path1 = path1
-    self.path2 = path2
-
-  def setUp(self):
-    self.path1 = ''
-    self.path2 = ''
-    self.request_nbr = 1
-
-    def GlobMock(string):
-      # Eat incoming string.
-      del string
-      if self.request_nbr == 1:
-        self.request_nbr += 1
-        return self.path1
-      else:
-        self.request_nbr = 1
-        return self.path2
-
-    # Override the glob function with our own that returns a string set by the
-    # test.
-    glob.glob = GlobMock
-
-  # Verifies that the correct USB id is returned.
-  def testFindUSBPortForV4lDevices(self):
-    short_path1 = ('/sys/bus/usb/devices/usb1/1-1/driver/4-4/4-4:1.0/'
-                   'video4linux/video0')
-    short_path2 = ('/sys/bus/usb/devices/usb1/1-1/driver/4-3/4-3:1.0/'
-                   'video4linux/video1')
-    self.SetGlobPath(short_path1, short_path2)
-    short_usb_ids = ['4-4', '4-3']
-    self.assertEqual(FindUsbPortForV4lDevices('video0', 'video1'),
-                     short_usb_ids)
-
-    long_path1 = ('/sys/bus/usb/devices/usb1/1-1/driver/3-3/3-3.1:1.0/'
-                  'video4linux/video0')
-    long_path2 = ('/sys/bus/usb/devices/usb1/1-1/driver/3-2/3-2.1:1.0/'
-                  'video4linux/video1')
-    self.SetGlobPath(long_path1, long_path2)
-    long_usb_ids = ['3-3.1', '3-2.1']
-    self.assertEqual(FindUsbPortForV4lDevices('video0', 'video1'), long_usb_ids)
-
-
-  def testFindUSBPortForV4lDevicesNoDevice(self):
-    no_device_found = ('')
-    v4l_device = ('/sys/bus/usb/devices/usb1/1-1/driver/3-2/3-2.1:1.0/'
-                  'video4linux/video1')
-    self.SetGlobPath(no_device_found, v4l_device)
-    empty_list = []
-    self.assertEqual(FindUsbPortForV4lDevices('video0', 'video1'), empty_list)
-
-
-if __name__ == "__main__":
-  unittest.main()
diff --git a/sdk/BUILD.gn b/sdk/BUILD.gn
deleted file mode 100644
index 086ce49..0000000
--- a/sdk/BUILD.gn
+++ /dev/null
@@ -1,778 +0,0 @@
-# Copyright 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.
-
-import("../webrtc.gni")
-if (is_ios) {
-  import("//build/config/ios/rules.gni")
-  import("//build/config/ios/ios_sdk.gni")
-}
-
-declare_args() {
-  # Determine whether or not to include metal rendering
-  rtc_use_metal_rendering = is_mac || (is_ios && current_cpu == "arm64")
-}
-
-group("sdk") {
-  public_deps = []
-  if (!build_with_chromium) {
-    if (is_android) {
-      public_deps += [ "android" ]
-    }
-    if (is_ios) {
-      public_deps += [ ":framework_objc" ]
-    }
-  }
-}
-
-if (is_ios || is_mac) {
-  config("common_config_objc") {
-    include_dirs = [
-      "objc/Framework/Classes",
-      "objc/Framework/Classes/Audio",
-      "objc/Framework/Classes/Common",
-      "objc/Framework/Classes/Metal",
-      "objc/Framework/Classes/PeerConnection",
-      "objc/Framework/Classes/UI",
-      "objc/Framework/Classes/Video",
-      "objc/Framework/Classes/VideoToolbox",
-      "objc/Framework/Headers",
-    ]
-  }
-
-  rtc_static_library("common_objc") {
-    sources = [
-      "objc/Framework/Classes/Common/NSString+StdString.h",
-      "objc/Framework/Classes/Common/NSString+StdString.mm",
-      "objc/Framework/Classes/Common/RTCDispatcher+Private.h",
-      "objc/Framework/Classes/Common/RTCDispatcher.m",
-      "objc/Framework/Classes/Common/RTCFieldTrials.mm",
-      "objc/Framework/Classes/Common/RTCLogging.mm",
-      "objc/Framework/Classes/Common/RTCUIApplicationStatusObserver.h",
-      "objc/Framework/Classes/Common/RTCUIApplicationStatusObserver.m",
-      "objc/Framework/Classes/Common/helpers.h",
-      "objc/Framework/Classes/Common/helpers.mm",
-      "objc/Framework/Headers/WebRTC/RTCDispatcher.h",
-      "objc/Framework/Headers/WebRTC/RTCFieldTrials.h",
-      "objc/Framework/Headers/WebRTC/RTCLogging.h",
-      "objc/Framework/Headers/WebRTC/RTCMacros.h",
-    ]
-
-    deps = [
-      "../rtc_base:rtc_base",
-    ]
-    configs += [ "..:common_objc" ]
-
-    public_configs = [ ":common_config_objc" ]
-
-    if (is_ios) {
-      sources += [
-        "objc/Framework/Classes/Common/UIDevice+RTCDevice.mm",
-        "objc/Framework/Headers/WebRTC/UIDevice+RTCDevice.h",
-      ]
-    }
-
-    if (!build_with_chromium) {
-      sources += [
-        "objc/Framework/Classes/Common/RTCFileLogger.mm",
-        "objc/Framework/Headers/WebRTC/RTCFileLogger.h",
-      ]
-    }
-  }
-
-  if (!build_with_chromium) {
-    rtc_static_library("audio_objc") {
-      sources = [
-        "objc/Framework/Classes/Audio/RTCAudioSession+Configuration.mm",
-        "objc/Framework/Classes/Audio/RTCAudioSession+Private.h",
-        "objc/Framework/Classes/Audio/RTCAudioSession.mm",
-        "objc/Framework/Classes/Audio/RTCAudioSessionConfiguration.m",
-        "objc/Framework/Headers/WebRTC/RTCAudioSession.h",
-        "objc/Framework/Headers/WebRTC/RTCAudioSessionConfiguration.h",
-      ]
-      configs += [ "..:common_objc" ]
-
-      deps = [
-        ":common_objc",
-        "../rtc_base:rtc_base_approved",
-      ]
-
-      if (is_clang) {
-        # Suppress warnings from the Chromium Clang plugin
-        # (bugs.webrtc.org/163).
-        suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-      }
-    }
-
-    # Keep videotracksource related code in a separate target so that we can
-    # build PeerConnectionFactory without audio/video support when that's called
-    # for.
-    rtc_static_library("videotracksource_objc") {
-      sources = [
-        "objc/Framework/Classes/Video/RTCCVPixelBuffer.mm",
-        "objc/Framework/Classes/Video/RTCI420Buffer+Private.h",
-        "objc/Framework/Classes/Video/RTCI420Buffer.mm",
-        "objc/Framework/Classes/Video/objc_frame_buffer.h",
-        "objc/Framework/Classes/Video/objc_frame_buffer.mm",
-        "objc/Framework/Classes/Video/objcvideotracksource.h",
-        "objc/Framework/Classes/Video/objcvideotracksource.mm",
-        "objc/Framework/Headers/WebRTC/RTCVideoFrameBuffer.h",
-      ]
-
-      deps = [
-        ":common_objc",
-        "../api:libjingle_peerconnection_api",
-        "../api:video_frame_api",
-        "../common_video",
-        "../media:rtc_media_base",
-        "../rtc_base:rtc_base",
-      ]
-
-      configs += [ "..:common_objc" ]
-      if (!build_with_chromium && is_clang) {
-        # Suppress warnings from the Chromium Clang plugin
-        # (bugs.webrtc.org/163).
-        suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-      }
-    }
-
-    rtc_static_library("video_objc") {
-      sources = [
-        "objc/Framework/Classes/Video/AVCaptureSession+DevicePosition.h",
-        "objc/Framework/Classes/Video/AVCaptureSession+DevicePosition.mm",
-        "objc/Framework/Classes/Video/RTCAVFoundationVideoCapturerInternal.h",
-        "objc/Framework/Classes/Video/RTCAVFoundationVideoCapturerInternal.mm",
-        "objc/Framework/Classes/Video/RTCDefaultShader.h",
-        "objc/Framework/Classes/Video/RTCDefaultShader.mm",
-        "objc/Framework/Classes/Video/RTCI420TextureCache.h",
-        "objc/Framework/Classes/Video/RTCI420TextureCache.mm",
-        "objc/Framework/Classes/Video/RTCOpenGLDefines.h",
-        "objc/Framework/Classes/Video/RTCShader.h",
-        "objc/Framework/Classes/Video/RTCShader.mm",
-        "objc/Framework/Classes/Video/avfoundationformatmapper.h",
-        "objc/Framework/Classes/Video/avfoundationformatmapper.mm",
-        "objc/Framework/Classes/Video/avfoundationvideocapturer.h",
-        "objc/Framework/Classes/Video/avfoundationvideocapturer.mm",
-      ]
-      libs = []
-      if (is_ios) {
-        sources += [
-          "objc/Framework/Classes/Video/RTCNV12TextureCache.h",
-          "objc/Framework/Classes/Video/RTCNV12TextureCache.m",
-        ]
-        libs += [
-          "GLKit.framework",
-          "OpenGLES.framework",
-          "QuartzCore.framework",
-        ]
-      } else if (is_mac) {
-        sources += []
-
-        libs += [
-          "CoreMedia.framework",
-          "CoreVideo.framework",
-          "OpenGL.framework",
-        ]
-      }
-
-      deps = [
-        ":common_objc",
-        ":videotracksource_objc",
-        "../api:libjingle_peerconnection_api",
-        "../api:optional",
-        "../common_video",
-        "../media:rtc_media_base",
-        "../rtc_base:rtc_base",
-      ]
-
-      configs += [ "..:common_objc" ]
-      if (!build_with_chromium && is_clang) {
-        # Suppress warnings from the Chromium Clang plugin
-        # (bugs.webrtc.org/163).
-        suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-      }
-    }
-
-    rtc_static_library("ui_objc") {
-      if (is_ios) {
-        sources = [
-          "objc/Framework/Classes/UI/RTCCameraPreviewView.m",
-          "objc/Framework/Classes/UI/RTCEAGLVideoView.m",
-          "objc/Framework/Headers/WebRTC/RTCCameraPreviewView.h",
-          "objc/Framework/Headers/WebRTC/RTCEAGLVideoView.h",
-        ]
-      }
-      if (is_mac) {
-        sources = [
-          "objc/Framework/Classes/UI/RTCNSGLVideoView.m",
-          "objc/Framework/Headers/WebRTC/RTCNSGLVideoView.h",
-        ]
-      }
-      configs += [ "..:common_objc" ]
-      deps = [
-        ":common_objc",
-        ":peerconnection_objc",
-      ]
-    }
-
-    if (rtc_use_metal_rendering) {
-      rtc_static_library("metal_objc") {
-        sources = [
-          "objc/Framework/Classes/Metal/RTCMTLI420Renderer.h",
-          "objc/Framework/Classes/Metal/RTCMTLI420Renderer.mm",
-          "objc/Framework/Classes/Metal/RTCMTLRenderer+Private.h",
-          "objc/Framework/Classes/Metal/RTCMTLRenderer.h",
-          "objc/Framework/Classes/Metal/RTCMTLRenderer.mm",
-        ]
-        if (is_ios) {
-          sources += [
-            "objc/Framework/Classes/Metal/RTCMTLNV12Renderer.h",
-            "objc/Framework/Classes/Metal/RTCMTLNV12Renderer.mm",
-            "objc/Framework/Classes/Metal/RTCMTLVideoView.m",
-            "objc/Framework/Headers/WebRTC/RTCMTLVideoView.h",
-          ]
-        }
-        if (is_mac) {
-          sources += [
-            "objc/Framework/Classes/Metal/RTCMTLNSVideoView.m",
-            "objc/Framework/Headers/WebRTC/RTCMTLNSVideoView.h",
-          ]
-        }
-        libs = [
-          "CoreVideo.framework",
-          "Metal.framework",
-          "MetalKit.framework",
-        ]
-        deps = [
-          ":video_objc",
-          "../api:video_frame_api",
-          "../rtc_base:rtc_base_approved",
-        ]
-        configs += [ "..:common_objc" ]
-        public_configs = [ ":common_config_objc" ]
-      }
-    }
-
-    rtc_static_library("peerconnection_objc") {
-      sources = [
-        "objc/Framework/Classes/PeerConnection/RTCAVFoundationVideoSource+Private.h",
-        "objc/Framework/Classes/PeerConnection/RTCAVFoundationVideoSource.mm",
-        "objc/Framework/Classes/PeerConnection/RTCCameraVideoCapturer.m",
-        "objc/Framework/Headers/WebRTC/RTCCameraVideoCapturer.h",
-      ]
-      if (is_ios) {
-        sources += [
-          "objc/Framework/Classes/PeerConnection/RTCFileVideoCapturer.h",
-          "objc/Framework/Classes/PeerConnection/RTCFileVideoCapturer.m",
-        ]
-      }
-      libs = [ "AVFoundation.framework" ]
-
-      if (is_ios) {
-        libs += [ "CoreGraphics.framework" ]
-      }
-
-      configs += [ "..:common_objc" ]
-
-      public_configs = [ ":common_config_objc" ]
-
-      if (!build_with_chromium && is_clang) {
-        # Suppress warnings from the Chromium Clang plugin
-        # (bugs.webrtc.org/163).
-        suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-      }
-
-      deps = [
-        ":common_objc",
-        ":corevideoframebuffer_objc",
-        ":peerconnectionfactory_objc",
-        ":video_objc",
-        "../api:video_frame_api",
-        "../media:rtc_media_base",
-        "../pc:libjingle_peerconnection",
-        "../rtc_base:rtc_base",
-      ]
-
-      if (rtc_use_metal_rendering) {
-        deps += [ ":metal_objc" ]
-      }
-
-      if (rtc_build_libyuv) {
-        deps += [ "$rtc_libyuv_dir" ]
-        public_deps = [
-          "$rtc_libyuv_dir",
-        ]
-      }
-    }
-
-    rtc_static_library("peerconnectionfactory_objc") {
-      sources = [
-        "objc/Framework/Classes/PeerConnection/RTCPeerConnectionFactory+Native.h",
-        "objc/Framework/Classes/PeerConnection/RTCPeerConnectionFactory+Private.h",
-        "objc/Framework/Classes/PeerConnection/RTCPeerConnectionFactory.mm",
-        "objc/Framework/Classes/PeerConnection/RTCVideoCodecH264.mm",
-      ]
-
-      public_configs = [ ":common_config_objc" ]
-
-      if (!build_with_chromium && is_clang) {
-        # Suppress warnings from the Chromium Clang plugin
-        # (bugs.webrtc.org/163).
-        suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-      }
-
-      deps = [
-        ":common_objc",
-        ":corevideoframebuffer_objc",
-        ":peerconnectionfactory_base_objc",
-        ":video_objc",
-        ":videotoolbox_objc",
-        ":videotracksource_objc",
-        "../api:video_frame_api",
-        "../api/audio_codecs:builtin_audio_decoder_factory",
-        "../api/audio_codecs:builtin_audio_encoder_factory",
-        "../api/video_codecs:video_codecs_api",
-        "../media:rtc_audio_video",
-        "../media:rtc_media_base",
-        "../pc:create_pc_factory",
-        "../pc:peerconnection",
-        "../rtc_base:rtc_base",
-        "../system_wrappers:field_trial_api",
-      ]
-    }
-
-    # Build the PeerConnectionFactory without audio/video support.
-    # This target depends on the objc_peeerconnectionfactory_base which still
-    # includes some audio/video related objects such as RTCAudioSource because
-    # these objects are just thin wrappers of native C++ interfaces required
-    # when implementing webrtc::PeerConnectionFactoryInterface and
-    # webrtc::PeerConnectionInterface.
-    # The applications which only use WebRTC DataChannel can depend on this
-    # target instead of rtc_sdk_objc.
-    rtc_static_library("peerconnectionfactory_no_media_objc") {
-      defines = [ "HAVE_NO_MEDIA" ]
-
-      sources = [
-        "objc/Framework/Classes/PeerConnection/RTCPeerConnectionFactory+Native.h",
-        "objc/Framework/Classes/PeerConnection/RTCPeerConnectionFactory+Private.h",
-        "objc/Framework/Classes/PeerConnection/RTCPeerConnectionFactory.mm",
-      ]
-
-      public_configs = [ ":common_config_objc" ]
-
-      if (!build_with_chromium && is_clang) {
-        # Suppress warnings from the Chromium Clang plugin
-        # (bugs.webrtc.org/163).
-        suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-      }
-
-      deps = [
-        ":peerconnectionfactory_base_objc",
-        "../api:libjingle_peerconnection_api",
-        "../rtc_base:rtc_base",
-      ]
-    }
-
-    rtc_static_library("peerconnectionfactory_base_objc") {
-      sources = [
-        "objc/Framework/Classes/PeerConnection/RTCAudioSource+Private.h",
-        "objc/Framework/Classes/PeerConnection/RTCAudioSource.mm",
-        "objc/Framework/Classes/PeerConnection/RTCAudioTrack+Private.h",
-        "objc/Framework/Classes/PeerConnection/RTCAudioTrack.mm",
-        "objc/Framework/Classes/PeerConnection/RTCConfiguration+Private.h",
-        "objc/Framework/Classes/PeerConnection/RTCConfiguration.mm",
-        "objc/Framework/Classes/PeerConnection/RTCDataChannel+Private.h",
-        "objc/Framework/Classes/PeerConnection/RTCDataChannel.mm",
-        "objc/Framework/Classes/PeerConnection/RTCDataChannelConfiguration+Private.h",
-        "objc/Framework/Classes/PeerConnection/RTCDataChannelConfiguration.mm",
-        "objc/Framework/Classes/PeerConnection/RTCEncodedImage.mm",
-        "objc/Framework/Classes/PeerConnection/RTCIceCandidate+Private.h",
-        "objc/Framework/Classes/PeerConnection/RTCIceCandidate.mm",
-        "objc/Framework/Classes/PeerConnection/RTCIceServer+Private.h",
-        "objc/Framework/Classes/PeerConnection/RTCIceServer.mm",
-        "objc/Framework/Classes/PeerConnection/RTCIntervalRange+Private.h",
-        "objc/Framework/Classes/PeerConnection/RTCIntervalRange.mm",
-        "objc/Framework/Classes/PeerConnection/RTCLegacyStatsReport+Private.h",
-        "objc/Framework/Classes/PeerConnection/RTCLegacyStatsReport.mm",
-        "objc/Framework/Classes/PeerConnection/RTCMediaConstraints+Private.h",
-        "objc/Framework/Classes/PeerConnection/RTCMediaConstraints.mm",
-        "objc/Framework/Classes/PeerConnection/RTCMediaSource+Private.h",
-        "objc/Framework/Classes/PeerConnection/RTCMediaSource.mm",
-        "objc/Framework/Classes/PeerConnection/RTCMediaStream+Private.h",
-        "objc/Framework/Classes/PeerConnection/RTCMediaStream.mm",
-        "objc/Framework/Classes/PeerConnection/RTCMediaStreamTrack+Private.h",
-        "objc/Framework/Classes/PeerConnection/RTCMediaStreamTrack.mm",
-        "objc/Framework/Classes/PeerConnection/RTCMetrics.mm",
-        "objc/Framework/Classes/PeerConnection/RTCMetricsSampleInfo+Private.h",
-        "objc/Framework/Classes/PeerConnection/RTCMetricsSampleInfo.mm",
-        "objc/Framework/Classes/PeerConnection/RTCPeerConnection+DataChannel.mm",
-        "objc/Framework/Classes/PeerConnection/RTCPeerConnection+Private.h",
-        "objc/Framework/Classes/PeerConnection/RTCPeerConnection+Stats.mm",
-        "objc/Framework/Classes/PeerConnection/RTCPeerConnection.mm",
-        "objc/Framework/Classes/PeerConnection/RTCRtpCodecParameters+Private.h",
-        "objc/Framework/Classes/PeerConnection/RTCRtpCodecParameters.mm",
-        "objc/Framework/Classes/PeerConnection/RTCRtpEncodingParameters+Private.h",
-        "objc/Framework/Classes/PeerConnection/RTCRtpEncodingParameters.mm",
-        "objc/Framework/Classes/PeerConnection/RTCRtpFragmentationHeader.mm",
-        "objc/Framework/Classes/PeerConnection/RTCRtpParameters+Private.h",
-        "objc/Framework/Classes/PeerConnection/RTCRtpParameters.mm",
-        "objc/Framework/Classes/PeerConnection/RTCRtpReceiver+Private.h",
-        "objc/Framework/Classes/PeerConnection/RTCRtpReceiver.mm",
-        "objc/Framework/Classes/PeerConnection/RTCRtpSender+Private.h",
-        "objc/Framework/Classes/PeerConnection/RTCRtpSender.mm",
-        "objc/Framework/Classes/PeerConnection/RTCSSLAdapter.mm",
-        "objc/Framework/Classes/PeerConnection/RTCSessionDescription+Private.h",
-        "objc/Framework/Classes/PeerConnection/RTCSessionDescription.mm",
-        "objc/Framework/Classes/PeerConnection/RTCTracing.mm",
-        "objc/Framework/Classes/PeerConnection/RTCVideoCapturer.m",
-        "objc/Framework/Classes/PeerConnection/RTCVideoCodec+Private.h",
-        "objc/Framework/Classes/PeerConnection/RTCVideoCodec.mm",
-        "objc/Framework/Classes/PeerConnection/RTCVideoEncoderSettings.mm",
-        "objc/Framework/Classes/PeerConnection/RTCVideoFrame.mm",
-        "objc/Framework/Classes/PeerConnection/RTCVideoRendererAdapter+Private.h",
-        "objc/Framework/Classes/PeerConnection/RTCVideoRendererAdapter.h",
-        "objc/Framework/Classes/PeerConnection/RTCVideoRendererAdapter.mm",
-        "objc/Framework/Classes/PeerConnection/RTCVideoSource+Private.h",
-        "objc/Framework/Classes/PeerConnection/RTCVideoSource.mm",
-        "objc/Framework/Classes/PeerConnection/RTCVideoTrack+Private.h",
-        "objc/Framework/Classes/PeerConnection/RTCVideoTrack.mm",
-        "objc/Framework/Headers/WebRTC/RTCAVFoundationVideoSource.h",
-        "objc/Framework/Headers/WebRTC/RTCAudioSource.h",
-        "objc/Framework/Headers/WebRTC/RTCAudioTrack.h",
-        "objc/Framework/Headers/WebRTC/RTCConfiguration.h",
-        "objc/Framework/Headers/WebRTC/RTCDataChannel.h",
-        "objc/Framework/Headers/WebRTC/RTCDataChannelConfiguration.h",
-        "objc/Framework/Headers/WebRTC/RTCIceCandidate.h",
-        "objc/Framework/Headers/WebRTC/RTCIceServer.h",
-        "objc/Framework/Headers/WebRTC/RTCIntervalRange.h",
-        "objc/Framework/Headers/WebRTC/RTCLegacyStatsReport.h",
-        "objc/Framework/Headers/WebRTC/RTCMediaConstraints.h",
-        "objc/Framework/Headers/WebRTC/RTCMediaSource.h",
-        "objc/Framework/Headers/WebRTC/RTCMediaStream.h",
-        "objc/Framework/Headers/WebRTC/RTCMediaStreamTrack.h",
-        "objc/Framework/Headers/WebRTC/RTCMetrics.h",
-        "objc/Framework/Headers/WebRTC/RTCMetricsSampleInfo.h",
-        "objc/Framework/Headers/WebRTC/RTCPeerConnection.h",
-        "objc/Framework/Headers/WebRTC/RTCPeerConnectionFactory.h",
-        "objc/Framework/Headers/WebRTC/RTCRtpCodecParameters.h",
-        "objc/Framework/Headers/WebRTC/RTCRtpEncodingParameters.h",
-        "objc/Framework/Headers/WebRTC/RTCRtpParameters.h",
-        "objc/Framework/Headers/WebRTC/RTCRtpReceiver.h",
-        "objc/Framework/Headers/WebRTC/RTCRtpSender.h",
-        "objc/Framework/Headers/WebRTC/RTCSSLAdapter.h",
-        "objc/Framework/Headers/WebRTC/RTCSessionDescription.h",
-        "objc/Framework/Headers/WebRTC/RTCTracing.h",
-        "objc/Framework/Headers/WebRTC/RTCVideoCapturer.h",
-        "objc/Framework/Headers/WebRTC/RTCVideoFrame.h",
-        "objc/Framework/Headers/WebRTC/RTCVideoFrameBuffer.h",
-        "objc/Framework/Headers/WebRTC/RTCVideoRenderer.h",
-        "objc/Framework/Headers/WebRTC/RTCVideoSource.h",
-        "objc/Framework/Headers/WebRTC/RTCVideoTrack.h",
-        "objc/Framework/Headers/WebRTC/RTCVideoViewShading.h",
-      ]
-
-      configs += [ "..:common_objc" ]
-
-      public_configs = [ ":common_config_objc" ]
-
-      if (!build_with_chromium && is_clang) {
-        # Suppress warnings from the Chromium Clang plugin
-        # (bugs.webrtc.org/163).
-        suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-      }
-
-      deps = [
-        ":common_objc",
-        ":corevideoframebuffer_objc",
-        ":videotracksource_objc",
-        "../api:video_frame_api",
-        "../common_video",
-        "../media:rtc_media_base",
-        "../modules:module_api",
-        "../pc:peerconnection",
-        "../rtc_base:rtc_base",
-      ]
-    }
-
-    if (rtc_include_tests) {
-      rtc_source_set("sdk_unittests_objc") {
-        testonly = true
-
-        # Skip restricting visibility on mobile platforms since the tests on those
-        # gets additional generated targets which would require many lines here to
-        # cover (which would be confusing to read and hard to maintain).
-        if (!is_android && !is_ios) {
-          visibility = [ "..:rtc_unittests" ]
-        }
-        sources = [
-          "objc/Framework/UnitTests/RTCConfigurationTest.mm",
-          "objc/Framework/UnitTests/RTCDataChannelConfigurationTest.mm",
-          "objc/Framework/UnitTests/RTCIceCandidateTest.mm",
-          "objc/Framework/UnitTests/RTCIceServerTest.mm",
-          "objc/Framework/UnitTests/RTCIntervalRangeTests.mm",
-          "objc/Framework/UnitTests/RTCMediaConstraintsTest.mm",
-          "objc/Framework/UnitTests/RTCPeerConnectionTest.mm",
-          "objc/Framework/UnitTests/RTCSessionDescriptionTest.mm",
-          "objc/Framework/UnitTests/RTCTracingTest.mm",
-          "objc/Framework/UnitTests/avformatmappertests.mm",
-          "objc/Framework/UnitTests/objc_video_decoder_factory_tests.mm",
-          "objc/Framework/UnitTests/objc_video_encoder_factory_tests.mm",
-        ]
-        if (is_ios &&
-            !(use_ios_simulator &&
-              # The tests crash on these simulator versions:
-              (ios_sdk_version == "10.0" || ios_sdk_version == "10.1"))) {
-          sources +=
-              [ "objc/Framework/UnitTests/RTCCameraVideoCapturerTests.mm" ]
-        }
-
-        # |-ObjC| flag needed to make sure category method implementations
-        # are included:
-        # https://developer.apple.com/library/mac/qa/qa1490/_index.html
-        ldflags = [ "-ObjC" ]
-
-        defines = [ "GTEST_RELATIVE_PATH" ]
-        deps = [
-          ":peerconnection_objc",
-          ":peerconnectionfactory_objc",
-          ":videotoolbox_objc",
-          ":videotracksource_objc",
-          "..//system_wrappers:system_wrappers_default",
-          "../media:rtc_media_base",
-          "../modules:module_api",
-          "../rtc_base:rtc_base_tests_utils",
-          "../system_wrappers:system_wrappers_default",
-          "//third_party/ocmock",
-        ]
-
-        if (is_ios) {
-          sources += [ "objc/Framework/UnitTests/RTCAudioSessionTest.mm" ]
-
-          # RTCMTLVideoView not supported on 32-bit arm
-          if (current_cpu != "arm") {
-            sources += [ "objc/Framework/UnitTests/RTCMTLVideoViewTests.mm" ]
-            if (current_cpu != "arm64") {
-              # Only include this file on simulator, as it's already
-              # included in device builds.
-              sources += [ "objc/Framework/Classes/Metal/RTCMTLVideoView.m" ]
-              libs = [ "CoreVideo.framework" ]
-            }
-          }
-        }
-        if (!build_with_chromium && is_clang) {
-          # Suppress warnings from the Chromium Clang plugin
-          # (bugs.webrtc.org/163).
-          suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-        }
-      }
-    }
-
-    if (is_ios) {
-      ios_framework_bundle("framework_objc") {
-        info_plist = "objc/Framework/Info.plist"
-        output_name = "WebRTC"
-
-        common_objc_headers = [
-          "objc/Framework/Headers/WebRTC/RTCAudioSession.h",
-          "objc/Framework/Headers/WebRTC/RTCVideoCodec.h",
-          "objc/Framework/Headers/WebRTC/RTCVideoCodecFactory.h",
-          "objc/Framework/Headers/WebRTC/RTCAudioSessionConfiguration.h",
-          "objc/Framework/Headers/WebRTC/RTCAVFoundationVideoSource.h",
-          "objc/Framework/Headers/WebRTC/RTCAudioSource.h",
-          "objc/Framework/Headers/WebRTC/RTCAudioTrack.h",
-          "objc/Framework/Headers/WebRTC/RTCCameraVideoCapturer.h",
-          "objc/Framework/Headers/WebRTC/RTCCameraPreviewView.h",
-          "objc/Framework/Headers/WebRTC/RTCConfiguration.h",
-          "objc/Framework/Headers/WebRTC/RTCDataChannel.h",
-          "objc/Framework/Headers/WebRTC/RTCDataChannelConfiguration.h",
-          "objc/Framework/Headers/WebRTC/RTCDispatcher.h",
-          "objc/Framework/Headers/WebRTC/RTCEAGLVideoView.h",
-          "objc/Framework/Headers/WebRTC/RTCFieldTrials.h",
-          "objc/Framework/Headers/WebRTC/RTCIceCandidate.h",
-          "objc/Framework/Headers/WebRTC/RTCIceServer.h",
-          "objc/Framework/Headers/WebRTC/RTCIntervalRange.h",
-          "objc/Framework/Headers/WebRTC/RTCLegacyStatsReport.h",
-          "objc/Framework/Headers/WebRTC/RTCLogging.h",
-          "objc/Framework/Headers/WebRTC/RTCMacros.h",
-          "objc/Framework/Headers/WebRTC/RTCMediaConstraints.h",
-          "objc/Framework/Headers/WebRTC/RTCMediaSource.h",
-          "objc/Framework/Headers/WebRTC/RTCMediaStream.h",
-          "objc/Framework/Headers/WebRTC/RTCMediaStreamTrack.h",
-          "objc/Framework/Headers/WebRTC/RTCMetrics.h",
-          "objc/Framework/Headers/WebRTC/RTCMetricsSampleInfo.h",
-          "objc/Framework/Headers/WebRTC/RTCPeerConnection.h",
-          "objc/Framework/Headers/WebRTC/RTCPeerConnectionFactory.h",
-          "objc/Framework/Headers/WebRTC/RTCRtpCodecParameters.h",
-          "objc/Framework/Headers/WebRTC/RTCRtpEncodingParameters.h",
-          "objc/Framework/Headers/WebRTC/RTCRtpParameters.h",
-          "objc/Framework/Headers/WebRTC/RTCRtpReceiver.h",
-          "objc/Framework/Headers/WebRTC/RTCRtpSender.h",
-          "objc/Framework/Headers/WebRTC/RTCSSLAdapter.h",
-          "objc/Framework/Headers/WebRTC/RTCSessionDescription.h",
-          "objc/Framework/Headers/WebRTC/RTCTracing.h",
-          "objc/Framework/Headers/WebRTC/RTCVideoCapturer.h",
-          "objc/Framework/Headers/WebRTC/RTCVideoFrame.h",
-          "objc/Framework/Headers/WebRTC/RTCVideoFrameBuffer.h",
-          "objc/Framework/Headers/WebRTC/RTCVideoRenderer.h",
-          "objc/Framework/Headers/WebRTC/RTCVideoSource.h",
-          "objc/Framework/Headers/WebRTC/RTCVideoTrack.h",
-          "objc/Framework/Headers/WebRTC/RTCVideoViewShading.h",
-          "objc/Framework/Headers/WebRTC/UIDevice+RTCDevice.h",
-          "objc/Framework/Headers/WebRTC/RTCVideoCodecH264.h",
-          "objc/Framework/Headers/WebRTC/WebRTC.h",
-        ]
-        if (rtc_use_metal_rendering) {
-          common_objc_headers +=
-              [ "objc/Framework/Headers/WebRTC/RTCMTLVideoView.h" ]
-        }
-        sources = common_objc_headers
-        public_headers = common_objc_headers
-
-        if (!build_with_chromium) {
-          sources += [ "objc/Framework/Headers/WebRTC/RTCFileLogger.h" ]
-          public_headers += [ "objc/Framework/Headers/WebRTC/RTCFileLogger.h" ]
-        }
-
-        ldflags = [
-          "-all_load",
-          "-install_name",
-          "@rpath/$output_name.framework/$output_name",
-        ]
-
-        deps = [
-          ":audio_objc",
-          ":peerconnection_objc",
-          ":ui_objc",
-          "../rtc_base:rtc_base_approved",
-          "../system_wrappers:field_trial_default",
-          "../system_wrappers:metrics_default",
-        ]
-
-        libs = [
-          "AVFoundation.framework",
-          "CoreGraphics.framework",
-          "CoreMedia.framework",
-          "GLKit.framework",
-        ]
-
-        configs += [ "..:common_objc" ]
-
-        public_configs = [ ":common_config_objc" ]
-
-        if (!build_with_chromium && is_clang) {
-          # Suppress warnings from the Chromium Clang plugin
-          # (bugs.webrtc.org/163).
-          configs -= [ "//build/config/clang:find_bad_constructs" ]
-        }
-      }
-    }
-
-    rtc_static_library("rtc_sdk_objc") {
-      complete_static_lib = true
-      deps = [
-        ":peerconnection_objc",
-        ":ui_objc",
-        "../system_wrappers:field_trial_default",
-        "../system_wrappers:metrics_default",
-      ]
-    }
-
-    rtc_static_library("corevideoframebuffer_objc") {
-      sources = [
-        "objc/Framework/Classes/Video/corevideo_frame_buffer.cc",
-        "objc/Framework/Classes/Video/corevideo_frame_buffer.h",
-      ]
-
-      deps = [
-        "../common_video",
-        "../rtc_base:rtc_base_approved",
-      ]
-
-      if (!build_with_chromium && is_clang) {
-        # Suppress warnings from the Chromium Clang plugin
-        # (bugs.webrtc.org/163).
-        suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-      }
-
-      libs = [ "CoreVideo.framework" ]
-    }
-
-    rtc_static_library("video_toolbox_cc") {
-      visibility = [ ":videotoolbox_objc" ]
-      sources = [
-        "objc/Framework/Classes/VideoToolbox/helpers.cc",
-        "objc/Framework/Classes/VideoToolbox/helpers.h",
-        "objc/Framework/Classes/VideoToolbox/nalu_rewriter.cc",
-        "objc/Framework/Classes/VideoToolbox/nalu_rewriter.h",
-      ]
-      deps = [
-        "../common_video",
-        "../modules:module_api",
-        "../modules/video_coding:webrtc_h264",
-        "../rtc_base:rtc_base_approved",
-      ]
-      if (!build_with_chromium && is_clang) {
-        # Suppress warnings from the Chromium Clang plugin
-        # (bugs.webrtc.org/163).
-        suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-      }
-    }
-
-    rtc_static_library("videotoolbox_objc") {
-      sources = [
-        "objc/Framework/Classes/VideoToolbox/RTCVideoDecoderH264.mm",
-        "objc/Framework/Classes/VideoToolbox/RTCVideoEncoderH264.mm",
-        "objc/Framework/Classes/VideoToolbox/objc_video_decoder_factory.h",
-        "objc/Framework/Classes/VideoToolbox/objc_video_decoder_factory.mm",
-        "objc/Framework/Classes/VideoToolbox/objc_video_encoder_factory.h",
-        "objc/Framework/Classes/VideoToolbox/objc_video_encoder_factory.mm",
-        "objc/Framework/Headers/WebRTC/RTCVideoFrameBuffer.h",
-      ]
-
-      configs += [ "..:common_objc" ]
-
-      deps = [
-        ":common_objc",
-        ":video_objc",
-        ":video_toolbox_cc",
-        ":videotracksource_objc",
-        "../api/video_codecs:video_codecs_api",
-        "../common_video",
-        "../media:rtc_media",
-        "../media:rtc_media_base",
-        "../modules:module_api",
-        "../modules/video_coding:video_coding_utility",
-        "../modules/video_coding:webrtc_h264",
-        "../rtc_base:rtc_base_approved",
-        "../system_wrappers",
-      ]
-
-      libs = [
-        "CoreFoundation.framework",
-        "CoreMedia.framework",
-        "CoreVideo.framework",
-        "VideoToolbox.framework",
-      ]
-
-      if (!build_with_chromium && is_clang) {
-        # Suppress warnings from the Chromium Clang plugin
-        # (bugs.webrtc.org/163).
-        suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-      }
-
-      if (rtc_build_libyuv) {
-        deps += [ "$rtc_libyuv_dir" ]
-        public_deps = [
-          "$rtc_libyuv_dir",
-        ]
-      } else {
-        # Need to add a directory normally exported by libyuv.
-        include_dirs = [ "$rtc_libyuv_dir/include" ]
-      }
-    }
-  }
-}
diff --git a/sdk/OWNERS b/sdk/OWNERS
deleted file mode 100644
index cfbb17a..0000000
--- a/sdk/OWNERS
+++ /dev/null
@@ -1,6 +0,0 @@
-magjed@webrtc.org
-
-# These are for the common case of adding or renaming files. If you're doing
-# structural changes, please get a review from a reviewer in this file.
-per-file *.gn=*
-per-file *.gni=*
diff --git a/sdk/android/AndroidManifest.xml b/sdk/android/AndroidManifest.xml
deleted file mode 100644
index 5afbd7b..0000000
--- a/sdk/android/AndroidManifest.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- *  Copyright 2017 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.
--->
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="org.webrtc">
-  <uses-sdk android:minSdkVersion="16" android:targetSdkVersion="23" />
-</manifest>
diff --git a/sdk/android/BUILD.gn b/sdk/android/BUILD.gn
deleted file mode 100644
index ab9bfb6..0000000
--- a/sdk/android/BUILD.gn
+++ /dev/null
@@ -1,524 +0,0 @@
-# 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.
-
-import("../../webrtc.gni")
-import("//build/config/android/config.gni")
-import("//build/config/android/rules.gni")
-
-group("android") {
-  if (!build_with_chromium && is_android) {
-    public_deps = [
-      ":libjingle_peerconnection_datachannelonly_so",
-      ":libjingle_peerconnection_jni",
-      ":libjingle_peerconnection_so",
-      ":libwebrtc",
-    ]
-  }
-}
-
-config("libjingle_peerconnection_jni_warnings_config") {
-  # The warnings below are enabled by default. Since GN orders compiler flags
-  # for a target before flags from configs, the only way to disable such
-  # warnings is by having them in a separate config, loaded from the target.
-  if (!is_win) {
-    cflags = [
-      "-Wno-sign-compare",
-      "-Wno-unused-variable",
-    ]
-  }
-}
-
-rtc_source_set("base_jni") {
-  sources = [
-    "src/jni/androidhistogram_jni.cc",
-    "src/jni/classreferenceholder.cc",
-    "src/jni/classreferenceholder.h",
-    "src/jni/jni_common.cc",
-    "src/jni/jni_helpers.cc",
-    "src/jni/jni_helpers.h",
-    "src/jni/pc/audio_jni.h",
-    "src/jni/pc/media_jni.h",
-    "src/jni/pc/video_jni.h",
-  ]
-
-  deps = [
-    "../../api:libjingle_peerconnection_api",
-    "../../rtc_base:rtc_base",
-    "../../rtc_base:rtc_base_approved",
-    "../../system_wrappers:metrics_api",
-  ]
-
-  if (is_clang) {
-    # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-    suppressed_configs += [
-      "//build/config/clang:extra_warnings",
-      "//build/config/clang:find_bad_constructs",
-    ]
-  }
-}
-
-rtc_static_library("audio_jni") {
-  sources = [
-    "src/jni/pc/audio_jni.cc",
-  ]
-
-  deps = [
-    ":base_jni",
-    "../../api/audio_codecs:builtin_audio_decoder_factory",
-    "../../api/audio_codecs:builtin_audio_encoder_factory",
-    "../../voice_engine:voice_engine",
-  ]
-}
-
-rtc_static_library("null_audio_jni") {
-  sources = [
-    "src/jni/pc/null_audio_jni.cc",
-  ]
-
-  deps = [
-    ":base_jni",
-  ]
-}
-
-rtc_static_library("video_jni") {
-  sources = [
-    "src/jni/androidmediacodeccommon.h",
-    "src/jni/androidmediadecoder_jni.cc",
-    "src/jni/androidmediadecoder_jni.h",
-    "src/jni/androidmediaencoder_jni.cc",
-    "src/jni/androidmediaencoder_jni.h",
-    "src/jni/androidvideotracksource.cc",
-    "src/jni/androidvideotracksource.h",
-    "src/jni/androidvideotracksource_jni.cc",
-    "src/jni/filevideocapturer_jni.cc",
-    "src/jni/native_handle_impl.cc",
-    "src/jni/native_handle_impl.h",
-    "src/jni/nv12buffer_jni.cc",
-    "src/jni/nv21buffer_jni.cc",
-    "src/jni/pc/video_jni.cc",
-    "src/jni/surfacetexturehelper_jni.cc",
-    "src/jni/surfacetexturehelper_jni.h",
-    "src/jni/video_renderer_jni.cc",
-    "src/jni/videodecoderfactorywrapper.cc",
-    "src/jni/videodecoderfactorywrapper.h",
-    "src/jni/videodecoderwrapper.cc",
-    "src/jni/videodecoderwrapper.h",
-    "src/jni/videoencoderfactorywrapper.cc",
-    "src/jni/videoencoderfactorywrapper.h",
-    "src/jni/videoencoderwrapper.cc",
-    "src/jni/videoencoderwrapper.h",
-    "src/jni/videofilerenderer_jni.cc",
-    "src/jni/videoframe_jni.cc",
-    "src/jni/videotrack_jni.cc",
-    "src/jni/wrapped_native_i420_buffer.cc",
-    "src/jni/wrapped_native_i420_buffer.h",
-  ]
-
-  configs += [ ":libjingle_peerconnection_jni_warnings_config" ]
-
-  if (is_clang) {
-    # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-    suppressed_configs += [
-      "//build/config/clang:extra_warnings",
-      "//build/config/clang:find_bad_constructs",
-    ]
-  }
-
-  # TODO(jschuh): Bug 1348: fix this warning.
-  configs += [ "//build/config/compiler:no_size_t_to_int_warning" ]
-
-  if (is_win) {
-    cflags += [
-      "/wd4245",  # conversion from "int" to "size_t", signed/unsigned mismatch.
-      "/wd4389",  # signed/unsigned mismatch.
-    ]
-  }
-
-  deps = [
-    ":base_jni",
-    ":peerconnection_jni",
-    "../..:webrtc_common",
-    "../../api:libjingle_peerconnection_api",
-    "../../api:video_frame_api",
-    "../../api/video_codecs:video_codecs_api",
-    "../../common_video:common_video",
-    "../../media:rtc_audio_video",
-    "../../media:rtc_media_base",
-    "../../modules:module_api",
-    "../../modules/utility:utility",
-    "../../modules/video_coding:video_coding_utility",
-    "../../rtc_base:rtc_base",
-    "../../rtc_base:rtc_base_approved",
-    "../../rtc_base:rtc_task_queue",
-    "../../rtc_base:sequenced_task_checker",
-    "../../rtc_base:weak_ptr",
-    "../../system_wrappers:system_wrappers",
-  ]
-
-  if (rtc_build_libyuv) {
-    deps += [ "$rtc_libyuv_dir" ]
-    public_deps = [
-      "$rtc_libyuv_dir",
-    ]
-  } else {
-    # Need to add a directory normally exported by libyuv.
-    include_dirs = [ "$rtc_libyuv_dir/include" ]
-  }
-}
-
-rtc_static_library("null_video_jni") {
-  sources = [
-    "src/jni/pc/null_video_jni.cc",
-  ]
-
-  deps = [
-    ":base_jni",
-  ]
-}
-
-rtc_static_library("media_jni") {
-  sources = [
-    "src/jni/pc/media_jni.cc",
-  ]
-
-  deps = [
-    ":base_jni",
-    "../../call:call_interfaces",
-    "../../logging:rtc_event_log_api",
-    "../../media:rtc_audio_video",
-    "../../modules/audio_processing:audio_processing",
-  ]
-
-  if (is_clang) {
-    # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-    suppressed_configs += [
-      "//build/config/clang:extra_warnings",
-      "//build/config/clang:find_bad_constructs",
-    ]
-  }
-}
-
-rtc_static_library("null_media_jni") {
-  sources = [
-    "src/jni/pc/null_media_jni.cc",
-  ]
-
-  deps = [
-    ":base_jni",
-  ]
-}
-
-rtc_static_library("peerconnection_jni") {
-  sources = [
-    "src/jni/androidnetworkmonitor_jni.h",
-    "src/jni/pc/androidnetworkmonitor_jni.cc",
-    "src/jni/pc/androidnetworkmonitor_jni.h",
-    "src/jni/pc/audiotrack_jni.cc",
-    "src/jni/pc/callsessionfilerotatinglogsink_jni.cc",
-    "src/jni/pc/datachannel_jni.cc",
-    "src/jni/pc/datachannelobserver_jni.cc",
-    "src/jni/pc/datachannelobserver_jni.h",
-    "src/jni/pc/dtmfsender_jni.cc",
-    "src/jni/pc/java_native_conversion.cc",
-    "src/jni/pc/java_native_conversion.h",
-    "src/jni/pc/logging_jni.cc",
-    "src/jni/pc/mediaconstraints_jni.cc",
-    "src/jni/pc/mediaconstraints_jni.h",
-    "src/jni/pc/mediasource_jni.cc",
-    "src/jni/pc/mediastream_jni.cc",
-    "src/jni/pc/mediastreamtrack_jni.cc",
-    "src/jni/pc/ownedfactoryandthreads.cc",
-    "src/jni/pc/ownedfactoryandthreads.h",
-    "src/jni/pc/peerconnection_jni.cc",
-    "src/jni/pc/peerconnectionfactory_jni.cc",
-    "src/jni/pc/peerconnectionobserver_jni.cc",
-    "src/jni/pc/peerconnectionobserver_jni.h",
-    "src/jni/pc/rtcstatscollectorcallbackwrapper.cc",
-    "src/jni/pc/rtcstatscollectorcallbackwrapper.h",
-    "src/jni/pc/rtpreceiver_jni.cc",
-    "src/jni/pc/rtpreceiverobserver_jni.cc",
-    "src/jni/pc/rtpreceiverobserver_jni.h",
-    "src/jni/pc/rtpsender_jni.cc",
-    "src/jni/pc/sdpobserver_jni.h",
-    "src/jni/pc/statsobserver_jni.cc",
-    "src/jni/pc/statsobserver_jni.h",
-  ]
-
-  configs += [ ":libjingle_peerconnection_jni_warnings_config" ]
-
-  if (is_clang) {
-    # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-    suppressed_configs += [
-      "//build/config/clang:extra_warnings",
-      "//build/config/clang:find_bad_constructs",
-    ]
-  }
-
-  # TODO(jschuh): Bug 1348: fix this warning.
-  configs += [ "//build/config/compiler:no_size_t_to_int_warning" ]
-
-  if (is_win) {
-    cflags += [
-      "/wd4245",  # conversion from "int" to "size_t", signed/unsigned mismatch.
-      "/wd4389",  # signed/unsigned mismatch.
-    ]
-  }
-
-  deps = [
-    ":base_jni",
-    "../..:webrtc_common",
-    "../../media:rtc_data",
-    "../../media:rtc_media_base",
-    "../../modules/utility:utility",
-    "../../pc:peerconnection",
-    "../../rtc_base:rtc_base",
-    "../../rtc_base:rtc_base_approved",
-    "../../rtc_base:rtc_task_queue",
-    "../../system_wrappers:system_wrappers",
-  ]
-}
-
-rtc_static_library("libjingle_peerconnection_jni") {
-  public_deps = [
-    ":audio_jni",
-    ":base_jni",
-    ":media_jni",
-    ":peerconnection_jni",
-    ":video_jni",
-    "../../pc:create_pc_factory",
-  ]
-}
-
-rtc_static_library("libjingle_peerconnection_metrics_default_jni") {
-  sources = [
-    "src/jni/androidmetrics_jni.cc",
-  ]
-
-  configs += [ ":libjingle_peerconnection_jni_warnings_config" ]
-
-  deps = [
-    ":base_jni",
-    ":peerconnection_jni",
-    "../../pc:peerconnection",
-    "../../system_wrappers",
-    "../../system_wrappers:field_trial_default",
-    "../../system_wrappers:metrics_default",
-  ]
-}
-
-# The modular build targets can be used to build WebRTC with different
-# functionalities. The users can choose either the real implemenation or the
-# null implementation of the audio/video modules based on their requirments.
-rtc_shared_library("libjingle_peerconnection_datachannelonly_so") {
-  sources = [
-    "src/jni/jni_onload.cc",
-  ]
-
-  suppressed_configs += [ "//build/config/android:hide_all_but_jni_onload" ]
-  configs += [ "//build/config/android:hide_all_but_jni" ]
-
-  deps = [
-    ":base_jni",
-    ":libjingle_peerconnection_metrics_default_jni",
-    ":null_audio_jni",
-    ":null_media_jni",
-    ":null_video_jni",
-    ":peerconnection_jni",
-    "../../pc:peerconnection",
-    "../../rtc_base:rtc_base",
-    "../../rtc_base:rtc_base_approved",
-  ]
-  output_extension = "so"
-}
-
-rtc_shared_library("libjingle_peerconnection_so") {
-  sources = [
-    "src/jni/jni_onload.cc",
-  ]
-
-  suppressed_configs += [ "//build/config/android:hide_all_but_jni_onload" ]
-  configs += [ "//build/config/android:hide_all_but_jni" ]
-
-  deps = [
-    ":libjingle_peerconnection_jni",
-    ":libjingle_peerconnection_metrics_default_jni",
-    "../../pc:libjingle_peerconnection",
-    "../../rtc_base:rtc_base",
-  ]
-  output_extension = "so"
-}
-
-dist_jar("libwebrtc") {
-  _target_dir_name = get_label_info(":$target_name", "dir")
-  output = "${root_out_dir}/lib.java${_target_dir_name}/${target_name}.jar"
-  direct_deps_only = true
-  use_interface_jars = false
-  deps = [
-    ":libjingle_peerconnection_java",
-    ":libjingle_peerconnection_metrics_default_java",
-    "../../modules/audio_device:audio_device_java",
-    "../../rtc_base:base_java",
-  ]
-}
-
-android_library("libjingle_peerconnection_java") {
-  java_files = [
-    "api/org/webrtc/AudioSource.java",
-    "api/org/webrtc/AudioTrack.java",
-    "api/org/webrtc/CallSessionFileRotatingLogSink.java",
-    "api/org/webrtc/Camera1Capturer.java",
-    "api/org/webrtc/Camera1Enumerator.java",
-    "api/org/webrtc/Camera2Capturer.java",
-    "api/org/webrtc/Camera2Enumerator.java",
-    "api/org/webrtc/CameraEnumerationAndroid.java",
-    "api/org/webrtc/CameraEnumerator.java",
-    "api/org/webrtc/CameraVideoCapturer.java",
-    "api/org/webrtc/DataChannel.java",
-    "api/org/webrtc/DtmfSender.java",
-    "api/org/webrtc/EglBase.java",
-    "api/org/webrtc/EglRenderer.java",
-    "api/org/webrtc/EncodedImage.java",
-    "api/org/webrtc/FileVideoCapturer.java",
-    "api/org/webrtc/GlRectDrawer.java",
-    "api/org/webrtc/GlShader.java",
-    "api/org/webrtc/GlTextureFrameBuffer.java",
-    "api/org/webrtc/GlUtil.java",
-    "api/org/webrtc/HardwareVideoDecoderFactory.java",
-    "api/org/webrtc/HardwareVideoEncoderFactory.java",
-    "api/org/webrtc/IceCandidate.java",
-    "api/org/webrtc/MediaCodecVideoDecoder.java",
-    "api/org/webrtc/MediaCodecVideoEncoder.java",
-    "api/org/webrtc/MediaConstraints.java",
-    "api/org/webrtc/MediaSource.java",
-    "api/org/webrtc/MediaStream.java",
-    "api/org/webrtc/MediaStreamTrack.java",
-    "api/org/webrtc/NetworkMonitor.java",
-    "api/org/webrtc/NetworkMonitorAutoDetect.java",
-    "api/org/webrtc/PeerConnection.java",
-    "api/org/webrtc/PeerConnectionFactory.java",
-    "api/org/webrtc/RendererCommon.java",
-    "api/org/webrtc/RTCStats.java",
-    "api/org/webrtc/RTCStatsCollectorCallback.java",
-    "api/org/webrtc/RTCStatsReport.java",
-    "api/org/webrtc/RtpParameters.java",
-    "api/org/webrtc/RtpReceiver.java",
-    "api/org/webrtc/RtpSender.java",
-    "api/org/webrtc/ScreenCapturerAndroid.java",
-    "api/org/webrtc/SdpObserver.java",
-    "api/org/webrtc/SessionDescription.java",
-    "api/org/webrtc/StatsObserver.java",
-    "api/org/webrtc/StatsReport.java",
-    "api/org/webrtc/SurfaceTextureHelper.java",
-    "api/org/webrtc/SurfaceViewRenderer.java",
-    "api/org/webrtc/VideoCapturer.java",
-    "api/org/webrtc/VideoCodecInfo.java",
-    "api/org/webrtc/VideoCodecStatus.java",
-    "api/org/webrtc/VideoDecoder.java",
-    "api/org/webrtc/VideoDecoderFactory.java",
-    "api/org/webrtc/VideoEncoder.java",
-    "api/org/webrtc/VideoEncoderFactory.java",
-    "api/org/webrtc/VideoFileRenderer.java",
-    "api/org/webrtc/VideoFrame.java",
-    "api/org/webrtc/VideoFrameDrawer.java",
-    "api/org/webrtc/VideoRenderer.java",
-    "api/org/webrtc/VideoSink.java",
-    "api/org/webrtc/VideoSource.java",
-    "api/org/webrtc/VideoTrack.java",
-    "src/java/org/webrtc/AndroidVideoTrackSourceObserver.java",
-    "src/java/org/webrtc/BaseBitrateAdjuster.java",
-    "src/java/org/webrtc/BitrateAdjuster.java",
-    "src/java/org/webrtc/Camera1Session.java",
-    "src/java/org/webrtc/Camera2Session.java",
-    "src/java/org/webrtc/CameraCapturer.java",
-    "src/java/org/webrtc/CameraSession.java",
-    "src/java/org/webrtc/DynamicBitrateAdjuster.java",
-    "src/java/org/webrtc/EglBase10.java",
-    "src/java/org/webrtc/EglBase14.java",
-    "src/java/org/webrtc/FramerateBitrateAdjuster.java",
-    "src/java/org/webrtc/HardwareVideoDecoder.java",
-    "src/java/org/webrtc/HardwareVideoEncoder.java",
-    "src/java/org/webrtc/Histogram.java",
-    "src/java/org/webrtc/I420BufferImpl.java",
-    "src/java/org/webrtc/JniCommon.java",
-    "src/java/org/webrtc/MediaCodecUtils.java",
-    "src/java/org/webrtc/NV12Buffer.java",
-    "src/java/org/webrtc/NV21Buffer.java",
-    "src/java/org/webrtc/TextureBufferImpl.java",
-    "src/java/org/webrtc/VideoCodecType.java",
-    "src/java/org/webrtc/VideoDecoderWrapperCallback.java",
-    "src/java/org/webrtc/VideoEncoderWrapperCallback.java",
-    "src/java/org/webrtc/WrappedNativeI420Buffer.java",
-    "src/java/org/webrtc/YuvConverter.java",
-  ]
-
-  deps = [
-    "../../modules/audio_device:audio_device_java",
-    "../../rtc_base:base_java",
-  ]
-
-  # TODO(sakal): Fix build hooks crbug.com/webrtc/8148
-  no_build_hooks = true
-}
-
-android_library("libjingle_peerconnection_metrics_default_java") {
-  java_files = [ "api/org/webrtc/Metrics.java" ]
-
-  deps = [
-    "../../rtc_base:base_java",
-  ]
-
-  # TODO(sakal): Fix build hooks crbug.com/webrtc/8148
-  no_build_hooks = true
-}
-
-if (rtc_include_tests) {
-  instrumentation_test_apk("libjingle_peerconnection_android_unittest") {
-    apk_name = "libjingle_peerconnection_android_unittest"
-    android_manifest = "instrumentationtests/AndroidManifest.xml"
-
-    java_files = [
-      "instrumentationtests/src/org/webrtc/Camera1CapturerUsingByteBufferTest.java",
-      "instrumentationtests/src/org/webrtc/Camera1CapturerUsingTextureTest.java",
-      "instrumentationtests/src/org/webrtc/Camera2CapturerTest.java",
-      "instrumentationtests/src/org/webrtc/CameraVideoCapturerTestFixtures.java",
-      "instrumentationtests/src/org/webrtc/EglRendererTest.java",
-      "instrumentationtests/src/org/webrtc/FileVideoCapturerTest.java",
-      "instrumentationtests/src/org/webrtc/GlRectDrawerTest.java",
-      "instrumentationtests/src/org/webrtc/HardwareVideoEncoderTest.java",
-      "instrumentationtests/src/org/webrtc/HardwareVideoDecoderTest.java",
-      "instrumentationtests/src/org/webrtc/MediaCodecVideoEncoderTest.java",
-      "instrumentationtests/src/org/webrtc/NetworkMonitorTest.java",
-      "instrumentationtests/src/org/webrtc/PeerConnectionTest.java",
-      "instrumentationtests/src/org/webrtc/RendererCommonTest.java",
-      "instrumentationtests/src/org/webrtc/SurfaceTextureHelperTest.java",
-      "instrumentationtests/src/org/webrtc/SurfaceViewRendererOnMeasureTest.java",
-      "instrumentationtests/src/org/webrtc/VideoFileRendererTest.java",
-      "instrumentationtests/src/org/webrtc/WebRtcJniBootTest.java",
-    ]
-
-    data = [
-      "../../sdk/android/instrumentationtests/src/org/webrtc/capturetestvideo.y4m",
-    ]
-
-    deps = [
-      "../../rtc_base:base_java",
-      "../../sdk/android:libjingle_peerconnection_java",
-      "../../sdk/android:libjingle_peerconnection_metrics_default_java",
-      "//base:base_java",
-      "//base:base_java_test_support",
-      "//third_party/android_support_test_runner:rules_java",
-      "//third_party/android_support_test_runner:runner_java",
-      "//third_party/junit",
-    ]
-
-    shared_libraries = [ "../../sdk/android:libjingle_peerconnection_so" ]
-
-    # TODO(sakal): Fix build hooks crbug.com/webrtc/8148
-    no_build_hooks = true
-  }
-}
diff --git a/sdk/android/OWNERS b/sdk/android/OWNERS
deleted file mode 100644
index b77294b..0000000
--- a/sdk/android/OWNERS
+++ /dev/null
@@ -1,3 +0,0 @@
-glaznev@webrtc.org
-magjed@webrtc.org
-sakal@webrtc.org
diff --git a/sdk/android/PRESUBMIT.py b/sdk/android/PRESUBMIT.py
deleted file mode 100644
index bc0cbcb..0000000
--- a/sdk/android/PRESUBMIT.py
+++ /dev/null
@@ -1,28 +0,0 @@
-# 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.
-
-def CheckChangeOnUpload(input_api, output_api):
-  results = []
-  results.extend(CheckPatchFormatted(input_api, output_api))
-  return results
-
-def CheckPatchFormatted(input_api, output_api):
-  import git_cl
-  cmd = ['cl', 'format', '--dry-run', input_api.PresubmitLocalPath()]
-  code, _ = git_cl.RunGitWithCode(cmd, suppress_stderr=True)
-  if code == 2:
-    short_path = input_api.basename(input_api.PresubmitLocalPath())
-    full_path = input_api.os_path.relpath(input_api.PresubmitLocalPath(),
-                                          input_api.change.RepositoryRoot())
-    return [output_api.PresubmitPromptWarning(
-      'The %s directory requires source formatting. '
-      'Please run git cl format %s' %
-      (short_path, full_path))]
-  # As this is just a warning, ignore all other errors if the user
-  # happens to have a broken clang-format, doesn't use git, etc etc.
-  return []
diff --git a/sdk/android/README b/sdk/android/README
deleted file mode 100644
index c5aba93..0000000
--- a/sdk/android/README
+++ /dev/null
@@ -1,11 +0,0 @@
-This directory holds a Java implementation of the webrtc::PeerConnection API, as
-well as the JNI glue C++ code that lets the Java implementation reuse the C++
-implementation of the same API.
-
-To build the Java API and related tests, generate GN projects with:
---args='target_os="android"'
-
-To use the Java API, start by looking at the public interface of
-org.webrtc.PeerConnection{,Factory} and the org.webrtc.PeerConnectionTest.
-
-To understand the implementation of the API, see the native code in jni/.
diff --git a/sdk/android/api/org/webrtc/AudioSource.java b/sdk/android/api/org/webrtc/AudioSource.java
deleted file mode 100644
index 99fcad1..0000000
--- a/sdk/android/api/org/webrtc/AudioSource.java
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- *  Copyright 2013 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.
- */
-
-package org.webrtc;
-
-/**
- * Java wrapper for a C++ AudioSourceInterface.  Used as the source for one or
- * more {@code AudioTrack} objects.
- */
-public class AudioSource extends MediaSource {
-  public AudioSource(long nativeSource) {
-    super(nativeSource);
-  }
-}
diff --git a/sdk/android/api/org/webrtc/AudioTrack.java b/sdk/android/api/org/webrtc/AudioTrack.java
deleted file mode 100644
index 6b71353..0000000
--- a/sdk/android/api/org/webrtc/AudioTrack.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- *  Copyright 2013 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.
- */
-
-package org.webrtc;
-
-/** Java wrapper for a C++ AudioTrackInterface */
-public class AudioTrack extends MediaStreamTrack {
-  public AudioTrack(long nativeTrack) {
-    super(nativeTrack);
-  }
-
-  /** Sets the volume for the underlying MediaSource. Volume is a gain value in the range
-   *  0 to 10.
-   */
-  public void setVolume(double volume) {
-    nativeSetVolume(super.nativeTrack, volume);
-  }
-
-  private static native void nativeSetVolume(long nativeTrack, double volume);
-}
diff --git a/sdk/android/api/org/webrtc/CallSessionFileRotatingLogSink.java b/sdk/android/api/org/webrtc/CallSessionFileRotatingLogSink.java
deleted file mode 100644
index 9b53ce4..0000000
--- a/sdk/android/api/org/webrtc/CallSessionFileRotatingLogSink.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-package org.webrtc;
-
-public class CallSessionFileRotatingLogSink {
-  static {
-    System.loadLibrary("jingle_peerconnection_so");
-  }
-
-  private long nativeSink;
-
-  public static byte[] getLogData(String dirPath) {
-    return nativeGetLogData(dirPath);
-  }
-
-  public CallSessionFileRotatingLogSink(
-      String dirPath, int maxFileSize, Logging.Severity severity) {
-    nativeSink = nativeAddSink(dirPath, maxFileSize, severity.ordinal());
-  }
-
-  public void dispose() {
-    if (nativeSink != 0) {
-      nativeDeleteSink(nativeSink);
-      nativeSink = 0;
-    }
-  }
-
-  private static native long nativeAddSink(String dirPath, int maxFileSize, int severity);
-  private static native void nativeDeleteSink(long nativeSink);
-  private static native byte[] nativeGetLogData(String dirPath);
-}
diff --git a/sdk/android/api/org/webrtc/Camera1Capturer.java b/sdk/android/api/org/webrtc/Camera1Capturer.java
deleted file mode 100644
index 41352ab..0000000
--- a/sdk/android/api/org/webrtc/Camera1Capturer.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- *  Copyright 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.
- */
-
-package org.webrtc;
-
-import android.content.Context;
-import android.media.MediaRecorder;
-
-public class Camera1Capturer extends CameraCapturer {
-  private final boolean captureToTexture;
-
-  public Camera1Capturer(
-      String cameraName, CameraEventsHandler eventsHandler, boolean captureToTexture) {
-    super(cameraName, eventsHandler, new Camera1Enumerator(captureToTexture));
-
-    this.captureToTexture = captureToTexture;
-  }
-
-  @Override
-  protected void createCameraSession(CameraSession.CreateSessionCallback createSessionCallback,
-      CameraSession.Events events, Context applicationContext,
-      SurfaceTextureHelper surfaceTextureHelper, MediaRecorder mediaRecorder, String cameraName,
-      int width, int height, int framerate) {
-    Camera1Session.create(createSessionCallback, events,
-        captureToTexture || (mediaRecorder != null), applicationContext, surfaceTextureHelper,
-        mediaRecorder, Camera1Enumerator.getCameraIndex(cameraName), width, height, framerate);
-  }
-}
diff --git a/sdk/android/api/org/webrtc/Camera1Enumerator.java b/sdk/android/api/org/webrtc/Camera1Enumerator.java
deleted file mode 100644
index 429daf5..0000000
--- a/sdk/android/api/org/webrtc/Camera1Enumerator.java
+++ /dev/null
@@ -1,184 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-package org.webrtc;
-
-import android.os.SystemClock;
-import java.util.ArrayList;
-import java.util.List;
-import org.webrtc.CameraEnumerationAndroid.CaptureFormat;
-
-@SuppressWarnings("deprecation")
-public class Camera1Enumerator implements CameraEnumerator {
-  private final static String TAG = "Camera1Enumerator";
-  // Each entry contains the supported formats for corresponding camera index. The formats for all
-  // cameras are enumerated on the first call to getSupportedFormats(), and cached for future
-  // reference.
-  private static List<List<CaptureFormat>> cachedSupportedFormats;
-
-  private final boolean captureToTexture;
-
-  public Camera1Enumerator() {
-    this(true /* captureToTexture */);
-  }
-
-  public Camera1Enumerator(boolean captureToTexture) {
-    this.captureToTexture = captureToTexture;
-  }
-
-  // Returns device names that can be used to create a new VideoCapturerAndroid.
-  @Override
-  public String[] getDeviceNames() {
-    ArrayList<String> namesList = new ArrayList<>();
-    for (int i = 0; i < android.hardware.Camera.getNumberOfCameras(); ++i) {
-      String name = getDeviceName(i);
-      if (name != null) {
-        namesList.add(name);
-        Logging.d(TAG, "Index: " + i + ". " + name);
-      } else {
-        Logging.e(TAG, "Index: " + i + ". Failed to query camera name.");
-      }
-    }
-    String[] namesArray = new String[namesList.size()];
-    return namesList.toArray(namesArray);
-  }
-
-  @Override
-  public boolean isFrontFacing(String deviceName) {
-    android.hardware.Camera.CameraInfo info = getCameraInfo(getCameraIndex(deviceName));
-    return info != null && info.facing == android.hardware.Camera.CameraInfo.CAMERA_FACING_FRONT;
-  }
-
-  @Override
-  public boolean isBackFacing(String deviceName) {
-    android.hardware.Camera.CameraInfo info = getCameraInfo(getCameraIndex(deviceName));
-    return info != null && info.facing == android.hardware.Camera.CameraInfo.CAMERA_FACING_BACK;
-  }
-
-  @Override
-  public List<CaptureFormat> getSupportedFormats(String deviceName) {
-    return getSupportedFormats(getCameraIndex(deviceName));
-  }
-
-  @Override
-  public CameraVideoCapturer createCapturer(
-      String deviceName, CameraVideoCapturer.CameraEventsHandler eventsHandler) {
-    return new Camera1Capturer(deviceName, eventsHandler, captureToTexture);
-  }
-
-  private static android.hardware.Camera.CameraInfo getCameraInfo(int index) {
-    android.hardware.Camera.CameraInfo info = new android.hardware.Camera.CameraInfo();
-    try {
-      android.hardware.Camera.getCameraInfo(index, info);
-    } catch (Exception e) {
-      Logging.e(TAG, "getCameraInfo failed on index " + index, e);
-      return null;
-    }
-    return info;
-  }
-
-  static synchronized List<CaptureFormat> getSupportedFormats(int cameraId) {
-    if (cachedSupportedFormats == null) {
-      cachedSupportedFormats = new ArrayList<List<CaptureFormat>>();
-      for (int i = 0; i < android.hardware.Camera.getNumberOfCameras(); ++i) {
-        cachedSupportedFormats.add(enumerateFormats(i));
-      }
-    }
-    return cachedSupportedFormats.get(cameraId);
-  }
-
-  private static List<CaptureFormat> enumerateFormats(int cameraId) {
-    Logging.d(TAG, "Get supported formats for camera index " + cameraId + ".");
-    final long startTimeMs = SystemClock.elapsedRealtime();
-    final android.hardware.Camera.Parameters parameters;
-    android.hardware.Camera camera = null;
-    try {
-      Logging.d(TAG, "Opening camera with index " + cameraId);
-      camera = android.hardware.Camera.open(cameraId);
-      parameters = camera.getParameters();
-    } catch (RuntimeException e) {
-      Logging.e(TAG, "Open camera failed on camera index " + cameraId, e);
-      return new ArrayList<CaptureFormat>();
-    } finally {
-      if (camera != null) {
-        camera.release();
-      }
-    }
-
-    final List<CaptureFormat> formatList = new ArrayList<CaptureFormat>();
-    try {
-      int minFps = 0;
-      int maxFps = 0;
-      final List<int[]> listFpsRange = parameters.getSupportedPreviewFpsRange();
-      if (listFpsRange != null) {
-        // getSupportedPreviewFpsRange() returns a sorted list. Take the fps range
-        // corresponding to the highest fps.
-        final int[] range = listFpsRange.get(listFpsRange.size() - 1);
-        minFps = range[android.hardware.Camera.Parameters.PREVIEW_FPS_MIN_INDEX];
-        maxFps = range[android.hardware.Camera.Parameters.PREVIEW_FPS_MAX_INDEX];
-      }
-      for (android.hardware.Camera.Size size : parameters.getSupportedPreviewSizes()) {
-        formatList.add(new CaptureFormat(size.width, size.height, minFps, maxFps));
-      }
-    } catch (Exception e) {
-      Logging.e(TAG, "getSupportedFormats() failed on camera index " + cameraId, e);
-    }
-
-    final long endTimeMs = SystemClock.elapsedRealtime();
-    Logging.d(TAG, "Get supported formats for camera index " + cameraId + " done."
-            + " Time spent: " + (endTimeMs - startTimeMs) + " ms.");
-    return formatList;
-  }
-
-  // Convert from android.hardware.Camera.Size to Size.
-  static List<Size> convertSizes(List<android.hardware.Camera.Size> cameraSizes) {
-    final List<Size> sizes = new ArrayList<Size>();
-    for (android.hardware.Camera.Size size : cameraSizes) {
-      sizes.add(new Size(size.width, size.height));
-    }
-    return sizes;
-  }
-
-  // Convert from int[2] to CaptureFormat.FramerateRange.
-  static List<CaptureFormat.FramerateRange> convertFramerates(List<int[]> arrayRanges) {
-    final List<CaptureFormat.FramerateRange> ranges = new ArrayList<CaptureFormat.FramerateRange>();
-    for (int[] range : arrayRanges) {
-      ranges.add(new CaptureFormat.FramerateRange(
-          range[android.hardware.Camera.Parameters.PREVIEW_FPS_MIN_INDEX],
-          range[android.hardware.Camera.Parameters.PREVIEW_FPS_MAX_INDEX]));
-    }
-    return ranges;
-  }
-
-  // Returns the camera index for camera with name |deviceName|, or throws IllegalArgumentException
-  // if no such camera can be found.
-  static int getCameraIndex(String deviceName) {
-    Logging.d(TAG, "getCameraIndex: " + deviceName);
-    for (int i = 0; i < android.hardware.Camera.getNumberOfCameras(); ++i) {
-      if (deviceName.equals(getDeviceName(i))) {
-        return i;
-      }
-    }
-    throw new IllegalArgumentException("No such camera: " + deviceName);
-  }
-
-  // Returns the name of the camera with camera index. Returns null if the
-  // camera can not be used.
-  static String getDeviceName(int index) {
-    android.hardware.Camera.CameraInfo info = getCameraInfo(index);
-    if (info == null) {
-      return null;
-    }
-
-    String facing =
-        (info.facing == android.hardware.Camera.CameraInfo.CAMERA_FACING_FRONT) ? "front" : "back";
-    return "Camera " + index + ", Facing " + facing + ", Orientation " + info.orientation;
-  }
-}
diff --git a/sdk/android/api/org/webrtc/Camera2Capturer.java b/sdk/android/api/org/webrtc/Camera2Capturer.java
deleted file mode 100644
index 769a94a..0000000
--- a/sdk/android/api/org/webrtc/Camera2Capturer.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- *  Copyright 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.
- */
-
-package org.webrtc;
-
-import android.annotation.TargetApi;
-import android.content.Context;
-import android.hardware.camera2.CameraManager;
-import android.media.MediaRecorder;
-
-@TargetApi(21)
-public class Camera2Capturer extends CameraCapturer {
-  private final Context context;
-  private final CameraManager cameraManager;
-
-  public Camera2Capturer(Context context, String cameraName, CameraEventsHandler eventsHandler) {
-    super(cameraName, eventsHandler, new Camera2Enumerator(context));
-
-    this.context = context;
-    cameraManager = (CameraManager) context.getSystemService(Context.CAMERA_SERVICE);
-  }
-
-  @Override
-  protected void createCameraSession(CameraSession.CreateSessionCallback createSessionCallback,
-      CameraSession.Events events, Context applicationContext,
-      SurfaceTextureHelper surfaceTextureHelper, MediaRecorder mediaRecoder, String cameraName,
-      int width, int height, int framerate) {
-    Camera2Session.create(createSessionCallback, events, applicationContext, cameraManager,
-        surfaceTextureHelper, mediaRecoder, cameraName, width, height, framerate);
-  }
-}
diff --git a/sdk/android/api/org/webrtc/Camera2Enumerator.java b/sdk/android/api/org/webrtc/Camera2Enumerator.java
deleted file mode 100644
index fa5c55d..0000000
--- a/sdk/android/api/org/webrtc/Camera2Enumerator.java
+++ /dev/null
@@ -1,248 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-package org.webrtc;
-
-import org.webrtc.CameraEnumerationAndroid.CaptureFormat;
-
-import android.annotation.TargetApi;
-import android.content.Context;
-import android.graphics.Rect;
-import android.graphics.SurfaceTexture;
-import android.hardware.camera2.CameraCharacteristics;
-import android.hardware.camera2.CameraManager;
-import android.hardware.camera2.CameraMetadata;
-import android.hardware.camera2.params.StreamConfigurationMap;
-import android.os.Build;
-import android.os.SystemClock;
-import android.util.AndroidException;
-import android.util.Range;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-@TargetApi(21)
-public class Camera2Enumerator implements CameraEnumerator {
-  private final static String TAG = "Camera2Enumerator";
-  private final static double NANO_SECONDS_PER_SECOND = 1.0e9;
-
-  // Each entry contains the supported formats for a given camera index. The formats are enumerated
-  // lazily in getSupportedFormats(), and cached for future reference.
-  private static final Map<String, List<CaptureFormat>> cachedSupportedFormats =
-      new HashMap<String, List<CaptureFormat>>();
-
-  final Context context;
-  final CameraManager cameraManager;
-
-  public Camera2Enumerator(Context context) {
-    this.context = context;
-    this.cameraManager = (CameraManager) context.getSystemService(Context.CAMERA_SERVICE);
-  }
-
-  @Override
-  public String[] getDeviceNames() {
-    try {
-      return cameraManager.getCameraIdList();
-      // On Android OS pre 4.4.2, a class will not load because of VerifyError if it contains a
-      // catch statement with an Exception from a newer API, even if the code is never executed.
-      // https://code.google.com/p/android/issues/detail?id=209129
-    } catch (/* CameraAccessException */ AndroidException e) {
-      Logging.e(TAG, "Camera access exception: " + e);
-      return new String[] {};
-    }
-  }
-
-  @Override
-  public boolean isFrontFacing(String deviceName) {
-    CameraCharacteristics characteristics = getCameraCharacteristics(deviceName);
-
-    return characteristics != null
-        && characteristics.get(CameraCharacteristics.LENS_FACING)
-        == CameraMetadata.LENS_FACING_FRONT;
-  }
-
-  @Override
-  public boolean isBackFacing(String deviceName) {
-    CameraCharacteristics characteristics = getCameraCharacteristics(deviceName);
-
-    return characteristics != null
-        && characteristics.get(CameraCharacteristics.LENS_FACING)
-        == CameraMetadata.LENS_FACING_BACK;
-  }
-
-  @Override
-  public List<CaptureFormat> getSupportedFormats(String deviceName) {
-    return getSupportedFormats(context, deviceName);
-  }
-
-  @Override
-  public CameraVideoCapturer createCapturer(
-      String deviceName, CameraVideoCapturer.CameraEventsHandler eventsHandler) {
-    return new Camera2Capturer(context, deviceName, eventsHandler);
-  }
-
-  private CameraCharacteristics getCameraCharacteristics(String deviceName) {
-    try {
-      return cameraManager.getCameraCharacteristics(deviceName);
-      // On Android OS pre 4.4.2, a class will not load because of VerifyError if it contains a
-      // catch statement with an Exception from a newer API, even if the code is never executed.
-      // https://code.google.com/p/android/issues/detail?id=209129
-    } catch (/* CameraAccessException */ AndroidException e) {
-      Logging.e(TAG, "Camera access exception: " + e);
-      return null;
-    }
-  }
-
-  /**
-   * Checks if API is supported and all cameras have better than legacy support.
-   */
-  public static boolean isSupported(Context context) {
-    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
-      return false;
-    }
-
-    CameraManager cameraManager = (CameraManager) context.getSystemService(Context.CAMERA_SERVICE);
-    try {
-      String[] cameraIds = cameraManager.getCameraIdList();
-      for (String id : cameraIds) {
-        CameraCharacteristics characteristics = cameraManager.getCameraCharacteristics(id);
-        if (characteristics.get(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL)
-            == CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY) {
-          return false;
-        }
-      }
-      // On Android OS pre 4.4.2, a class will not load because of VerifyError if it contains a
-      // catch statement with an Exception from a newer API, even if the code is never executed.
-      // https://code.google.com/p/android/issues/detail?id=209129
-    } catch (/* CameraAccessException */ AndroidException e) {
-      Logging.e(TAG, "Camera access exception: " + e);
-      return false;
-    }
-    return true;
-  }
-
-  static int getFpsUnitFactor(Range<Integer>[] fpsRanges) {
-    if (fpsRanges.length == 0) {
-      return 1000;
-    }
-    return fpsRanges[0].getUpper() < 1000 ? 1000 : 1;
-  }
-
-  static List<Size> getSupportedSizes(CameraCharacteristics cameraCharacteristics) {
-    final StreamConfigurationMap streamMap =
-        cameraCharacteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
-    final int supportLevel =
-        cameraCharacteristics.get(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL);
-
-    final android.util.Size[] nativeSizes = streamMap.getOutputSizes(SurfaceTexture.class);
-    final List<Size> sizes = convertSizes(nativeSizes);
-
-    // Video may be stretched pre LMR1 on legacy implementations.
-    // Filter out formats that have different aspect ratio than the sensor array.
-    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP_MR1
-        && supportLevel == CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY) {
-      final Rect activeArraySize =
-          cameraCharacteristics.get(CameraCharacteristics.SENSOR_INFO_ACTIVE_ARRAY_SIZE);
-      final ArrayList<Size> filteredSizes = new ArrayList<Size>();
-
-      for (Size size : sizes) {
-        if (activeArraySize.width() * size.height == activeArraySize.height() * size.width) {
-          filteredSizes.add(size);
-        }
-      }
-
-      return filteredSizes;
-    } else {
-      return sizes;
-    }
-  }
-
-  static List<CaptureFormat> getSupportedFormats(Context context, String cameraId) {
-    return getSupportedFormats(
-        (CameraManager) context.getSystemService(Context.CAMERA_SERVICE), cameraId);
-  }
-
-  static List<CaptureFormat> getSupportedFormats(CameraManager cameraManager, String cameraId) {
-    synchronized (cachedSupportedFormats) {
-      if (cachedSupportedFormats.containsKey(cameraId)) {
-        return cachedSupportedFormats.get(cameraId);
-      }
-
-      Logging.d(TAG, "Get supported formats for camera index " + cameraId + ".");
-      final long startTimeMs = SystemClock.elapsedRealtime();
-
-      final CameraCharacteristics cameraCharacteristics;
-      try {
-        cameraCharacteristics = cameraManager.getCameraCharacteristics(cameraId);
-      } catch (Exception ex) {
-        Logging.e(TAG, "getCameraCharacteristics(): " + ex);
-        return new ArrayList<CaptureFormat>();
-      }
-
-      final StreamConfigurationMap streamMap =
-          cameraCharacteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
-
-      Range<Integer>[] fpsRanges =
-          cameraCharacteristics.get(CameraCharacteristics.CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES);
-      List<CaptureFormat.FramerateRange> framerateRanges =
-          convertFramerates(fpsRanges, getFpsUnitFactor(fpsRanges));
-      List<Size> sizes = getSupportedSizes(cameraCharacteristics);
-
-      int defaultMaxFps = 0;
-      for (CaptureFormat.FramerateRange framerateRange : framerateRanges) {
-        defaultMaxFps = Math.max(defaultMaxFps, framerateRange.max);
-      }
-
-      final List<CaptureFormat> formatList = new ArrayList<CaptureFormat>();
-      for (Size size : sizes) {
-        long minFrameDurationNs = 0;
-        try {
-          minFrameDurationNs = streamMap.getOutputMinFrameDuration(
-              SurfaceTexture.class, new android.util.Size(size.width, size.height));
-        } catch (Exception e) {
-          // getOutputMinFrameDuration() is not supported on all devices. Ignore silently.
-        }
-        final int maxFps = (minFrameDurationNs == 0)
-            ? defaultMaxFps
-            : (int) Math.round(NANO_SECONDS_PER_SECOND / minFrameDurationNs) * 1000;
-        formatList.add(new CaptureFormat(size.width, size.height, 0, maxFps));
-        Logging.d(TAG, "Format: " + size.width + "x" + size.height + "@" + maxFps);
-      }
-
-      cachedSupportedFormats.put(cameraId, formatList);
-      final long endTimeMs = SystemClock.elapsedRealtime();
-      Logging.d(TAG, "Get supported formats for camera index " + cameraId + " done."
-              + " Time spent: " + (endTimeMs - startTimeMs) + " ms.");
-      return formatList;
-    }
-  }
-
-  // Convert from android.util.Size to Size.
-  private static List<Size> convertSizes(android.util.Size[] cameraSizes) {
-    final List<Size> sizes = new ArrayList<Size>();
-    for (android.util.Size size : cameraSizes) {
-      sizes.add(new Size(size.getWidth(), size.getHeight()));
-    }
-    return sizes;
-  }
-
-  // Convert from android.util.Range<Integer> to CaptureFormat.FramerateRange.
-  static List<CaptureFormat.FramerateRange> convertFramerates(
-      Range<Integer>[] arrayRanges, int unitFactor) {
-    final List<CaptureFormat.FramerateRange> ranges = new ArrayList<CaptureFormat.FramerateRange>();
-    for (Range<Integer> range : arrayRanges) {
-      ranges.add(new CaptureFormat.FramerateRange(
-          range.getLower() * unitFactor, range.getUpper() * unitFactor));
-    }
-    return ranges;
-  }
-}
diff --git a/sdk/android/api/org/webrtc/CameraEnumerationAndroid.java b/sdk/android/api/org/webrtc/CameraEnumerationAndroid.java
deleted file mode 100644
index de2b919..0000000
--- a/sdk/android/api/org/webrtc/CameraEnumerationAndroid.java
+++ /dev/null
@@ -1,206 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-package org.webrtc;
-
-import static java.lang.Math.abs;
-
-import android.graphics.ImageFormat;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.List;
-
-@SuppressWarnings("deprecation")
-public class CameraEnumerationAndroid {
-  private final static String TAG = "CameraEnumerationAndroid";
-
-  static final ArrayList<Size> COMMON_RESOLUTIONS = new ArrayList<Size>(Arrays.asList(
-      // 0, Unknown resolution
-      new Size(160, 120), // 1, QQVGA
-      new Size(240, 160), // 2, HQVGA
-      new Size(320, 240), // 3, QVGA
-      new Size(400, 240), // 4, WQVGA
-      new Size(480, 320), // 5, HVGA
-      new Size(640, 360), // 6, nHD
-      new Size(640, 480), // 7, VGA
-      new Size(768, 480), // 8, WVGA
-      new Size(854, 480), // 9, FWVGA
-      new Size(800, 600), // 10, SVGA
-      new Size(960, 540), // 11, qHD
-      new Size(960, 640), // 12, DVGA
-      new Size(1024, 576), // 13, WSVGA
-      new Size(1024, 600), // 14, WVSGA
-      new Size(1280, 720), // 15, HD
-      new Size(1280, 1024), // 16, SXGA
-      new Size(1920, 1080), // 17, Full HD
-      new Size(1920, 1440), // 18, Full HD 4:3
-      new Size(2560, 1440), // 19, QHD
-      new Size(3840, 2160) // 20, UHD
-      ));
-
-  public static class CaptureFormat {
-    // Class to represent a framerate range. The framerate varies because of lightning conditions.
-    // The values are multiplied by 1000, so 1000 represents one frame per second.
-    public static class FramerateRange {
-      public int min;
-      public int max;
-
-      public FramerateRange(int min, int max) {
-        this.min = min;
-        this.max = max;
-      }
-
-      @Override
-      public String toString() {
-        return "[" + (min / 1000.0f) + ":" + (max / 1000.0f) + "]";
-      }
-
-      @Override
-      public boolean equals(Object other) {
-        if (!(other instanceof FramerateRange)) {
-          return false;
-        }
-        final FramerateRange otherFramerate = (FramerateRange) other;
-        return min == otherFramerate.min && max == otherFramerate.max;
-      }
-
-      @Override
-      public int hashCode() {
-        // Use prime close to 2^16 to avoid collisions for normal values less than 2^16.
-        return 1 + 65537 * min + max;
-      }
-    }
-
-    public final int width;
-    public final int height;
-    public final FramerateRange framerate;
-
-    // TODO(hbos): If VideoCapturer.startCapture is updated to support other image formats then this
-    // needs to be updated and VideoCapturer.getSupportedFormats need to return CaptureFormats of
-    // all imageFormats.
-    public final int imageFormat = ImageFormat.NV21;
-
-    public CaptureFormat(int width, int height, int minFramerate, int maxFramerate) {
-      this.width = width;
-      this.height = height;
-      this.framerate = new FramerateRange(minFramerate, maxFramerate);
-    }
-
-    public CaptureFormat(int width, int height, FramerateRange framerate) {
-      this.width = width;
-      this.height = height;
-      this.framerate = framerate;
-    }
-
-    // Calculates the frame size of this capture format.
-    public int frameSize() {
-      return frameSize(width, height, imageFormat);
-    }
-
-    // Calculates the frame size of the specified image format. Currently only
-    // supporting ImageFormat.NV21.
-    // The size is width * height * number of bytes per pixel.
-    // http://developer.android.com/reference/android/hardware/Camera.html#addCallbackBuffer(byte[])
-    public static int frameSize(int width, int height, int imageFormat) {
-      if (imageFormat != ImageFormat.NV21) {
-        throw new UnsupportedOperationException("Don't know how to calculate "
-            + "the frame size of non-NV21 image formats.");
-      }
-      return (width * height * ImageFormat.getBitsPerPixel(imageFormat)) / 8;
-    }
-
-    @Override
-    public String toString() {
-      return width + "x" + height + "@" + framerate;
-    }
-
-    @Override
-    public boolean equals(Object other) {
-      if (!(other instanceof CaptureFormat)) {
-        return false;
-      }
-      final CaptureFormat otherFormat = (CaptureFormat) other;
-      return width == otherFormat.width && height == otherFormat.height
-          && framerate.equals(otherFormat.framerate);
-    }
-
-    @Override
-    public int hashCode() {
-      return 1 + (width * 65497 + height) * 251 + framerate.hashCode();
-    }
-  }
-
-  // Helper class for finding the closest supported format for the two functions below. It creates a
-  // comparator based on the difference to some requested parameters, where the element with the
-  // minimum difference is the element that is closest to the requested parameters.
-  private static abstract class ClosestComparator<T> implements Comparator<T> {
-    // Difference between supported and requested parameter.
-    abstract int diff(T supportedParameter);
-
-    @Override
-    public int compare(T t1, T t2) {
-      return diff(t1) - diff(t2);
-    }
-  }
-
-  // Prefer a fps range with an upper bound close to |framerate|. Also prefer a fps range with a low
-  // lower bound, to allow the framerate to fluctuate based on lightning conditions.
-  public static CaptureFormat.FramerateRange getClosestSupportedFramerateRange(
-      List<CaptureFormat.FramerateRange> supportedFramerates, final int requestedFps) {
-    return Collections.min(
-        supportedFramerates, new ClosestComparator<CaptureFormat.FramerateRange>() {
-          // Progressive penalty if the upper bound is further away than |MAX_FPS_DIFF_THRESHOLD|
-          // from requested.
-          private static final int MAX_FPS_DIFF_THRESHOLD = 5000;
-          private static final int MAX_FPS_LOW_DIFF_WEIGHT = 1;
-          private static final int MAX_FPS_HIGH_DIFF_WEIGHT = 3;
-
-          // Progressive penalty if the lower bound is bigger than |MIN_FPS_THRESHOLD|.
-          private static final int MIN_FPS_THRESHOLD = 8000;
-          private static final int MIN_FPS_LOW_VALUE_WEIGHT = 1;
-          private static final int MIN_FPS_HIGH_VALUE_WEIGHT = 4;
-
-          // Use one weight for small |value| less than |threshold|, and another weight above.
-          private int progressivePenalty(int value, int threshold, int lowWeight, int highWeight) {
-            return (value < threshold) ? value * lowWeight
-                                       : threshold * lowWeight + (value - threshold) * highWeight;
-          }
-
-          @Override
-          int diff(CaptureFormat.FramerateRange range) {
-            final int minFpsError = progressivePenalty(
-                range.min, MIN_FPS_THRESHOLD, MIN_FPS_LOW_VALUE_WEIGHT, MIN_FPS_HIGH_VALUE_WEIGHT);
-            final int maxFpsError = progressivePenalty(Math.abs(requestedFps * 1000 - range.max),
-                MAX_FPS_DIFF_THRESHOLD, MAX_FPS_LOW_DIFF_WEIGHT, MAX_FPS_HIGH_DIFF_WEIGHT);
-            return minFpsError + maxFpsError;
-          }
-        });
-  }
-
-  public static Size getClosestSupportedSize(
-      List<Size> supportedSizes, final int requestedWidth, final int requestedHeight) {
-    return Collections.min(supportedSizes, new ClosestComparator<Size>() {
-      @Override
-      int diff(Size size) {
-        return abs(requestedWidth - size.width) + abs(requestedHeight - size.height);
-      }
-    });
-  }
-
-  // Helper method for camera classes.
-  static void reportCameraResolution(Histogram histogram, Size resolution) {
-    int index = COMMON_RESOLUTIONS.indexOf(resolution);
-    // 0 is reserved for unknown resolution, so add 1.
-    // indexOf returns -1 for unknown resolutions so it becomes 0 automatically.
-    histogram.addSample(index + 1);
-  }
-}
diff --git a/sdk/android/api/org/webrtc/CameraEnumerator.java b/sdk/android/api/org/webrtc/CameraEnumerator.java
deleted file mode 100644
index dc954b6..0000000
--- a/sdk/android/api/org/webrtc/CameraEnumerator.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- *  Copyright 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.
- */
-
-package org.webrtc;
-
-import org.webrtc.CameraEnumerationAndroid.CaptureFormat;
-
-import java.util.List;
-
-public interface CameraEnumerator {
-  public String[] getDeviceNames();
-  public boolean isFrontFacing(String deviceName);
-  public boolean isBackFacing(String deviceName);
-  public List<CaptureFormat> getSupportedFormats(String deviceName);
-
-  public CameraVideoCapturer createCapturer(
-      String deviceName, CameraVideoCapturer.CameraEventsHandler eventsHandler);
-}
diff --git a/sdk/android/api/org/webrtc/CameraVideoCapturer.java b/sdk/android/api/org/webrtc/CameraVideoCapturer.java
deleted file mode 100644
index be9d669..0000000
--- a/sdk/android/api/org/webrtc/CameraVideoCapturer.java
+++ /dev/null
@@ -1,158 +0,0 @@
-/*
- *  Copyright 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.
- */
-
-package org.webrtc;
-
-import android.media.MediaRecorder;
-
-/**
- * Base interface for camera1 and camera2 implementations. Extends VideoCapturer with a
- * switchCamera() function. Also provides subinterfaces for handling camera events, and a helper
- * class for detecting camera freezes.
- */
-public interface CameraVideoCapturer extends VideoCapturer {
-  /**
-   * Camera events handler - can be used to be notifed about camera events. The callbacks are
-   * executed from an arbitrary thread.
-   */
-  public interface CameraEventsHandler {
-    // Camera error handler - invoked when camera can not be opened
-    // or any camera exception happens on camera thread.
-    void onCameraError(String errorDescription);
-
-    // Called when camera is disconnected.
-    void onCameraDisconnected();
-
-    // Invoked when camera stops receiving frames.
-    void onCameraFreezed(String errorDescription);
-
-    // Callback invoked when camera is opening.
-    void onCameraOpening(String cameraName);
-
-    // Callback invoked when first camera frame is available after camera is started.
-    void onFirstFrameAvailable();
-
-    // Callback invoked when camera is closed.
-    void onCameraClosed();
-  }
-
-  /**
-   * Camera switch handler - one of these functions are invoked with the result of switchCamera().
-   * The callback may be called on an arbitrary thread.
-   */
-  public interface CameraSwitchHandler {
-    // Invoked on success. |isFrontCamera| is true if the new camera is front facing.
-    void onCameraSwitchDone(boolean isFrontCamera);
-
-    // Invoked on failure, e.g. camera is stopped or only one camera available.
-    void onCameraSwitchError(String errorDescription);
-  }
-
-  /**
-   * Switch camera to the next valid camera id. This can only be called while the camera is running.
-   * This function can be called from any thread.
-   */
-  void switchCamera(CameraSwitchHandler switchEventsHandler);
-
-  /**
-   * MediaRecorder add/remove handler - one of these functions are invoked with the result of
-   * addMediaRecorderToCamera() or removeMediaRecorderFromCamera calls.
-   * The callback may be called on an arbitrary thread.
-   */
-  public interface MediaRecorderHandler {
-    // Invoked on success.
-    void onMediaRecorderSuccess();
-
-    // Invoked on failure, e.g. camera is stopped or any exception happens.
-    void onMediaRecorderError(String errorDescription);
-  }
-
-  /**
-   * Add MediaRecorder to camera pipeline. This can only be called while the camera is running.
-   * Once MediaRecorder is added to camera pipeline camera switch is not allowed.
-   * This function can be called from any thread.
-   */
-  void addMediaRecorderToCamera(MediaRecorder mediaRecorder, MediaRecorderHandler resultHandler);
-
-  /**
-   * Remove MediaRecorder from camera pipeline. This can only be called while the camera is running.
-   * This function can be called from any thread.
-   */
-  void removeMediaRecorderFromCamera(MediaRecorderHandler resultHandler);
-
-  /**
-   * Helper class to log framerate and detect if the camera freezes. It will run periodic callbacks
-   * on the SurfaceTextureHelper thread passed in the ctor, and should only be operated from that
-   * thread.
-   */
-  public static class CameraStatistics {
-    private final static String TAG = "CameraStatistics";
-    private final static int CAMERA_OBSERVER_PERIOD_MS = 2000;
-    private final static int CAMERA_FREEZE_REPORT_TIMOUT_MS = 4000;
-
-    private final SurfaceTextureHelper surfaceTextureHelper;
-    private final CameraEventsHandler eventsHandler;
-    private int frameCount;
-    private int freezePeriodCount;
-    // Camera observer - monitors camera framerate. Observer is executed on camera thread.
-    private final Runnable cameraObserver = new Runnable() {
-      @Override
-      public void run() {
-        final int cameraFps = Math.round(frameCount * 1000.0f / CAMERA_OBSERVER_PERIOD_MS);
-        Logging.d(TAG, "Camera fps: " + cameraFps + ".");
-        if (frameCount == 0) {
-          ++freezePeriodCount;
-          if (CAMERA_OBSERVER_PERIOD_MS * freezePeriodCount >= CAMERA_FREEZE_REPORT_TIMOUT_MS
-              && eventsHandler != null) {
-            Logging.e(TAG, "Camera freezed.");
-            if (surfaceTextureHelper.isTextureInUse()) {
-              // This can only happen if we are capturing to textures.
-              eventsHandler.onCameraFreezed("Camera failure. Client must return video buffers.");
-            } else {
-              eventsHandler.onCameraFreezed("Camera failure.");
-            }
-            return;
-          }
-        } else {
-          freezePeriodCount = 0;
-        }
-        frameCount = 0;
-        surfaceTextureHelper.getHandler().postDelayed(this, CAMERA_OBSERVER_PERIOD_MS);
-      }
-    };
-
-    public CameraStatistics(
-        SurfaceTextureHelper surfaceTextureHelper, CameraEventsHandler eventsHandler) {
-      if (surfaceTextureHelper == null) {
-        throw new IllegalArgumentException("SurfaceTextureHelper is null");
-      }
-      this.surfaceTextureHelper = surfaceTextureHelper;
-      this.eventsHandler = eventsHandler;
-      this.frameCount = 0;
-      this.freezePeriodCount = 0;
-      surfaceTextureHelper.getHandler().postDelayed(cameraObserver, CAMERA_OBSERVER_PERIOD_MS);
-    }
-
-    private void checkThread() {
-      if (Thread.currentThread() != surfaceTextureHelper.getHandler().getLooper().getThread()) {
-        throw new IllegalStateException("Wrong thread");
-      }
-    }
-
-    public void addFrame() {
-      checkThread();
-      ++frameCount;
-    }
-
-    public void release() {
-      surfaceTextureHelper.getHandler().removeCallbacks(cameraObserver);
-    }
-  }
-}
diff --git a/sdk/android/api/org/webrtc/DataChannel.java b/sdk/android/api/org/webrtc/DataChannel.java
deleted file mode 100644
index dc64ccc..0000000
--- a/sdk/android/api/org/webrtc/DataChannel.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- *  Copyright 2013 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.
- */
-
-package org.webrtc;
-
-import java.nio.ByteBuffer;
-
-/** Java wrapper for a C++ DataChannelInterface. */
-public class DataChannel {
-  /** Java wrapper for WebIDL RTCDataChannel. */
-  public static class Init {
-    public boolean ordered = true;
-    // Optional unsigned short in WebIDL, -1 means unspecified.
-    public int maxRetransmitTimeMs = -1;
-    // Optional unsigned short in WebIDL, -1 means unspecified.
-    public int maxRetransmits = -1;
-    public String protocol = "";
-    public boolean negotiated = false;
-    // Optional unsigned short in WebIDL, -1 means unspecified.
-    public int id = -1;
-
-    public Init() {}
-
-    // Called only by native code.
-    private Init(boolean ordered, int maxRetransmitTimeMs, int maxRetransmits, String protocol,
-        boolean negotiated, int id) {
-      this.ordered = ordered;
-      this.maxRetransmitTimeMs = maxRetransmitTimeMs;
-      this.maxRetransmits = maxRetransmits;
-      this.protocol = protocol;
-      this.negotiated = negotiated;
-      this.id = id;
-    }
-  }
-
-  /** Java version of C++ DataBuffer.  The atom of data in a DataChannel. */
-  public static class Buffer {
-    /** The underlying data. */
-    public final ByteBuffer data;
-
-    /**
-     * Indicates whether |data| contains UTF-8 text or "binary data"
-     * (i.e. anything else).
-     */
-    public final boolean binary;
-
-    public Buffer(ByteBuffer data, boolean binary) {
-      this.data = data;
-      this.binary = binary;
-    }
-  }
-
-  /** Java version of C++ DataChannelObserver. */
-  public interface Observer {
-    /** The data channel's bufferedAmount has changed. */
-    public void onBufferedAmountChange(long previousAmount);
-    /** The data channel state has changed. */
-    public void onStateChange();
-    /**
-     * A data buffer was successfully received.  NOTE: |buffer.data| will be
-     * freed once this function returns so callers who want to use the data
-     * asynchronously must make sure to copy it first.
-     */
-    public void onMessage(Buffer buffer);
-  }
-
-  /** Keep in sync with DataChannelInterface::DataState. */
-  public enum State { CONNECTING, OPEN, CLOSING, CLOSED }
-
-  private final long nativeDataChannel;
-  private long nativeObserver;
-
-  public DataChannel(long nativeDataChannel) {
-    this.nativeDataChannel = nativeDataChannel;
-  }
-
-  /** Register |observer|, replacing any previously-registered observer. */
-  public void registerObserver(Observer observer) {
-    if (nativeObserver != 0) {
-      unregisterObserverNative(nativeObserver);
-    }
-    nativeObserver = registerObserverNative(observer);
-  }
-  private native long registerObserverNative(Observer observer);
-
-  /** Unregister the (only) observer. */
-  public void unregisterObserver() {
-    unregisterObserverNative(nativeObserver);
-  }
-  private native void unregisterObserverNative(long nativeObserver);
-
-  public native String label();
-
-  public native int id();
-
-  public native State state();
-
-  /**
-   * Return the number of bytes of application data (UTF-8 text and binary data)
-   * that have been queued using SendBuffer but have not yet been transmitted
-   * to the network.
-   */
-  public native long bufferedAmount();
-
-  /** Close the channel. */
-  public native void close();
-
-  /** Send |data| to the remote peer; return success. */
-  public boolean send(Buffer buffer) {
-    // TODO(fischman): this could be cleverer about avoiding copies if the
-    // ByteBuffer is direct and/or is backed by an array.
-    byte[] data = new byte[buffer.data.remaining()];
-    buffer.data.get(data);
-    return sendNative(data, buffer.binary);
-  }
-  private native boolean sendNative(byte[] data, boolean binary);
-
-  /** Dispose of native resources attached to this channel. */
-  public native void dispose();
-};
diff --git a/sdk/android/api/org/webrtc/DtmfSender.java b/sdk/android/api/org/webrtc/DtmfSender.java
deleted file mode 100644
index d284313..0000000
--- a/sdk/android/api/org/webrtc/DtmfSender.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- *  Copyright 2017 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.
- */
-
-package org.webrtc;
-
-/** Java wrapper for a C++ DtmfSenderInterface. */
-public class DtmfSender {
-  final long nativeDtmfSender;
-
-  public DtmfSender(long nativeDtmfSender) {
-    this.nativeDtmfSender = nativeDtmfSender;
-  }
-
-  /**
-   * @return true if this DtmfSender is capable of sending DTMF. Otherwise false.
-   */
-  public boolean canInsertDtmf() {
-    return nativeCanInsertDtmf(nativeDtmfSender);
-  }
-
-  /**
-   * Queues a task that sends the provided DTMF tones.
-   * <p>
-   * If insertDtmf is called on the same object while an existing task for this
-   * object to generate DTMF is still running, the previous task is canceled.
-   *
-   * @param tones        This parameter is treated as a series of characters. The characters 0
-   *                     through 9, A through D, #, and * generate the associated DTMF tones. The
-   *                     characters a to d are equivalent to A to D. The character ',' indicates a
-   *                     delay of 2 seconds before processing the next character in the tones
-   *                     parameter. Unrecognized characters are ignored.
-   * @param duration     Indicates the duration in ms to use for each character passed in the tones
-   *                     parameter. The duration cannot be more than 6000 or less than 70.
-   * @param interToneGap Indicates the gap between tones in ms. Must be at least 50 ms but should be
-   *                     as short as possible.
-   * @return             true on success and false on failure.
-   */
-  public boolean insertDtmf(String tones, int duration, int interToneGap) {
-    return nativeInsertDtmf(nativeDtmfSender, tones, duration, interToneGap);
-  }
-
-  /**
-   * @return The tones remaining to be played out
-   */
-  public String tones() {
-    return nativeTones(nativeDtmfSender);
-  }
-
-  /**
-   * @return The current tone duration value in ms. This value will be the value last set via the
-   *         insertDtmf() method, or the default value of 100 ms if insertDtmf() was never called.
-   */
-  public int duration() {
-    return nativeDuration(nativeDtmfSender);
-  }
-
-  /**
-   * @return The current value of the between-tone gap in ms. This value will be the value last set
-   *         via the insertDtmf() method, or the default value of 50 ms if insertDtmf() was never
-   *         called.
-   */
-  public int interToneGap() {
-    return nativeInterToneGap(nativeDtmfSender);
-  }
-
-  public void dispose() {
-    JniCommon.nativeReleaseRef(nativeDtmfSender);
-  }
-
-  private static native boolean nativeCanInsertDtmf(long nativeDtmfSender);
-  private static native boolean nativeInsertDtmf(
-      long nativeDtmfSender, String tones, int duration, int interToneGap);
-  private static native String nativeTones(long nativeDtmfSender);
-  private static native int nativeDuration(long nativeDtmfSender);
-  private static native int nativeInterToneGap(long nativeDtmfSender);
-};
diff --git a/sdk/android/api/org/webrtc/EglBase.java b/sdk/android/api/org/webrtc/EglBase.java
deleted file mode 100644
index 1f90588..0000000
--- a/sdk/android/api/org/webrtc/EglBase.java
+++ /dev/null
@@ -1,173 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-package org.webrtc;
-
-import android.graphics.SurfaceTexture;
-import android.view.Surface;
-
-import javax.microedition.khronos.egl.EGL10;
-
-/**
- * Holds EGL state and utility methods for handling an egl 1.0 EGLContext, an EGLDisplay,
- * and an EGLSurface.
- */
-public abstract class EglBase {
-  // EGL wrapper for an actual EGLContext.
-  public static class Context {}
-
-  // According to the documentation, EGL can be used from multiple threads at the same time if each
-  // thread has its own EGLContext, but in practice it deadlocks on some devices when doing this.
-  // Therefore, synchronize on this global lock before calling dangerous EGL functions that might
-  // deadlock. See https://bugs.chromium.org/p/webrtc/issues/detail?id=5702 for more info.
-  public static final Object lock = new Object();
-
-  // These constants are taken from EGL14.EGL_OPENGL_ES2_BIT and EGL14.EGL_CONTEXT_CLIENT_VERSION.
-  // https://android.googlesource.com/platform/frameworks/base/+/master/opengl/java/android/opengl/EGL14.java
-  // This is similar to how GlSurfaceView does:
-  // http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/5.1.1_r1/android/opengl/GLSurfaceView.java#760
-  public static final int EGL_OPENGL_ES2_BIT = 4;
-  // Android-specific extension.
-  public static final int EGL_RECORDABLE_ANDROID = 0x3142;
-
-  // clang-format off
-  public static final int[] CONFIG_PLAIN = {
-    EGL10.EGL_RED_SIZE, 8,
-    EGL10.EGL_GREEN_SIZE, 8,
-    EGL10.EGL_BLUE_SIZE, 8,
-    EGL10.EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
-    EGL10.EGL_NONE
-  };
-  public static final int[] CONFIG_RGBA = {
-    EGL10.EGL_RED_SIZE, 8,
-    EGL10.EGL_GREEN_SIZE, 8,
-    EGL10.EGL_BLUE_SIZE, 8,
-    EGL10.EGL_ALPHA_SIZE, 8,
-    EGL10.EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
-    EGL10.EGL_NONE
-  };
-  public static final int[] CONFIG_PIXEL_BUFFER = {
-    EGL10.EGL_RED_SIZE, 8,
-    EGL10.EGL_GREEN_SIZE, 8,
-    EGL10.EGL_BLUE_SIZE, 8,
-    EGL10.EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
-    EGL10.EGL_SURFACE_TYPE, EGL10.EGL_PBUFFER_BIT,
-    EGL10.EGL_NONE
-  };
-  public static final int[] CONFIG_PIXEL_RGBA_BUFFER = {
-    EGL10.EGL_RED_SIZE, 8,
-    EGL10.EGL_GREEN_SIZE, 8,
-    EGL10.EGL_BLUE_SIZE, 8,
-    EGL10.EGL_ALPHA_SIZE, 8,
-    EGL10.EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
-    EGL10.EGL_SURFACE_TYPE, EGL10.EGL_PBUFFER_BIT,
-    EGL10.EGL_NONE
-  };
-  public static final int[] CONFIG_RECORDABLE = {
-    EGL10.EGL_RED_SIZE, 8,
-    EGL10.EGL_GREEN_SIZE, 8,
-    EGL10.EGL_BLUE_SIZE, 8,
-    EGL10.EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
-    EGL_RECORDABLE_ANDROID, 1,
-    EGL10.EGL_NONE
-  };
-  // clang-format on
-
-  /**
-   * Create a new context with the specified config attributes, sharing data with |sharedContext|.
-   * If |sharedContext| is null, a root context is created. This function will try to create an EGL
-   * 1.4 context if possible, and an EGL 1.0 context otherwise.
-   */
-  public static EglBase create(Context sharedContext, int[] configAttributes) {
-    return (EglBase14.isEGL14Supported()
-               && (sharedContext == null || sharedContext instanceof EglBase14.Context))
-        ? new EglBase14((EglBase14.Context) sharedContext, configAttributes)
-        : new EglBase10((EglBase10.Context) sharedContext, configAttributes);
-  }
-
-  /**
-   * Helper function for creating a plain root context. This function will try to create an EGL 1.4
-   * context if possible, and an EGL 1.0 context otherwise.
-   */
-  public static EglBase create() {
-    return create(null /* shaderContext */, CONFIG_PLAIN);
-  }
-
-  /**
-   * Helper function for creating a plain context, sharing data with |sharedContext|. This function
-   * will try to create an EGL 1.4 context if possible, and an EGL 1.0 context otherwise.
-   */
-  public static EglBase create(Context sharedContext) {
-    return create(sharedContext, CONFIG_PLAIN);
-  }
-
-  /**
-   * Explicitly create a root EGl 1.0 context with the specified config attributes.
-   */
-  public static EglBase createEgl10(int[] configAttributes) {
-    return new EglBase10(null /* shaderContext */, configAttributes);
-  }
-
-  /**
-   * Explicitly create a root EGl 1.0 context with the specified config attributes
-   * and shared context.
-   */
-  public static EglBase createEgl10(
-      javax.microedition.khronos.egl.EGLContext sharedContext, int[] configAttributes) {
-    return new EglBase10(new EglBase10.Context(sharedContext), configAttributes);
-  }
-
-  /**
-   * Explicitly create a root EGl 1.4 context with the specified config attributes.
-   */
-  public static EglBase createEgl14(int[] configAttributes) {
-    return new EglBase14(null /* shaderContext */, configAttributes);
-  }
-
-  /**
-   * Explicitly create a root EGl 1.4 context with the specified config attributes
-   * and shared context.
-   */
-  public static EglBase createEgl14(
-      android.opengl.EGLContext sharedContext, int[] configAttributes) {
-    return new EglBase14(new EglBase14.Context(sharedContext), configAttributes);
-  }
-
-  public abstract void createSurface(Surface surface);
-
-  // Create EGLSurface from the Android SurfaceTexture.
-  public abstract void createSurface(SurfaceTexture surfaceTexture);
-
-  // Create dummy 1x1 pixel buffer surface so the context can be made current.
-  public abstract void createDummyPbufferSurface();
-
-  public abstract void createPbufferSurface(int width, int height);
-
-  public abstract Context getEglBaseContext();
-
-  public abstract boolean hasSurface();
-
-  public abstract int surfaceWidth();
-
-  public abstract int surfaceHeight();
-
-  public abstract void releaseSurface();
-
-  public abstract void release();
-
-  public abstract void makeCurrent();
-
-  // Detach the current EGL context, so that it can be made current on another thread.
-  public abstract void detachCurrent();
-
-  public abstract void swapBuffers();
-
-  public abstract void swapBuffers(long presentationTimeStampNs);
-}
diff --git a/sdk/android/api/org/webrtc/EglRenderer.java b/sdk/android/api/org/webrtc/EglRenderer.java
deleted file mode 100644
index 16e89f4..0000000
--- a/sdk/android/api/org/webrtc/EglRenderer.java
+++ /dev/null
@@ -1,685 +0,0 @@
-/*
- *  Copyright 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.
- */
-
-package org.webrtc;
-
-import android.graphics.Bitmap;
-import android.graphics.Matrix;
-import android.graphics.SurfaceTexture;
-import android.opengl.GLES20;
-import android.os.Handler;
-import android.os.HandlerThread;
-import android.os.Looper;
-import android.view.Surface;
-import java.nio.ByteBuffer;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.Locale;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
-
-/**
- * Implements org.webrtc.VideoRenderer.Callbacks by displaying the video stream on an EGL Surface.
- * This class is intended to be used as a helper class for rendering on SurfaceViews and
- * TextureViews.
- */
-public class EglRenderer implements VideoRenderer.Callbacks, VideoSink {
-  private static final String TAG = "EglRenderer";
-  private static final long LOG_INTERVAL_SEC = 4;
-  private static final int MAX_SURFACE_CLEAR_COUNT = 3;
-
-  public interface FrameListener { void onFrame(Bitmap frame); }
-
-  private static class FrameListenerAndParams {
-    public final FrameListener listener;
-    public final float scale;
-    public final RendererCommon.GlDrawer drawer;
-    public final boolean applyFpsReduction;
-
-    public FrameListenerAndParams(FrameListener listener, float scale,
-        RendererCommon.GlDrawer drawer, boolean applyFpsReduction) {
-      this.listener = listener;
-      this.scale = scale;
-      this.drawer = drawer;
-      this.applyFpsReduction = applyFpsReduction;
-    }
-  }
-
-  private class EglSurfaceCreation implements Runnable {
-    private Object surface;
-
-    public synchronized void setSurface(Object surface) {
-      this.surface = surface;
-    }
-
-    @Override
-    public synchronized void run() {
-      if (surface != null && eglBase != null && !eglBase.hasSurface()) {
-        if (surface instanceof Surface) {
-          eglBase.createSurface((Surface) surface);
-        } else if (surface instanceof SurfaceTexture) {
-          eglBase.createSurface((SurfaceTexture) surface);
-        } else {
-          throw new IllegalStateException("Invalid surface: " + surface);
-        }
-        eglBase.makeCurrent();
-        // Necessary for YUV frames with odd width.
-        GLES20.glPixelStorei(GLES20.GL_UNPACK_ALIGNMENT, 1);
-      }
-    }
-  }
-
-  private final String name;
-
-  // |renderThreadHandler| is a handler for communicating with |renderThread|, and is synchronized
-  // on |handlerLock|.
-  private final Object handlerLock = new Object();
-  private Handler renderThreadHandler;
-
-  private final ArrayList<FrameListenerAndParams> frameListeners = new ArrayList<>();
-
-  // Variables for fps reduction.
-  private final Object fpsReductionLock = new Object();
-  // Time for when next frame should be rendered.
-  private long nextFrameTimeNs;
-  // Minimum duration between frames when fps reduction is active, or -1 if video is completely
-  // paused.
-  private long minRenderPeriodNs;
-
-  // EGL and GL resources for drawing YUV/OES textures. After initilization, these are only accessed
-  // from the render thread.
-  private EglBase eglBase;
-  private final VideoFrameDrawer frameDrawer = new VideoFrameDrawer();
-  private RendererCommon.GlDrawer drawer;
-  private final Matrix drawMatrix = new Matrix();
-
-  // Pending frame to render. Serves as a queue with size 1. Synchronized on |frameLock|.
-  private final Object frameLock = new Object();
-  private VideoFrame pendingFrame;
-
-  // These variables are synchronized on |layoutLock|.
-  private final Object layoutLock = new Object();
-  private float layoutAspectRatio;
-  // If true, mirrors the video stream horizontally.
-  private boolean mirror;
-
-  // These variables are synchronized on |statisticsLock|.
-  private final Object statisticsLock = new Object();
-  // Total number of video frames received in renderFrame() call.
-  private int framesReceived;
-  // Number of video frames dropped by renderFrame() because previous frame has not been rendered
-  // yet.
-  private int framesDropped;
-  // Number of rendered video frames.
-  private int framesRendered;
-  // Start time for counting these statistics, or 0 if we haven't started measuring yet.
-  private long statisticsStartTimeNs;
-  // Time in ns spent in renderFrameOnRenderThread() function.
-  private long renderTimeNs;
-  // Time in ns spent by the render thread in the swapBuffers() function.
-  private long renderSwapBufferTimeNs;
-
-  // Used for bitmap capturing.
-  private GlTextureFrameBuffer bitmapTextureFramebuffer;
-
-  private final Runnable logStatisticsRunnable = new Runnable() {
-    @Override
-    public void run() {
-      logStatistics();
-      synchronized (handlerLock) {
-        if (renderThreadHandler != null) {
-          renderThreadHandler.removeCallbacks(logStatisticsRunnable);
-          renderThreadHandler.postDelayed(
-              logStatisticsRunnable, TimeUnit.SECONDS.toMillis(LOG_INTERVAL_SEC));
-        }
-      }
-    }
-  };
-
-  private final EglSurfaceCreation eglSurfaceCreationRunnable = new EglSurfaceCreation();
-
-  /**
-   * Standard constructor. The name will be used for the render thread name and included when
-   * logging. In order to render something, you must first call init() and createEglSurface.
-   */
-  public EglRenderer(String name) {
-    this.name = name;
-  }
-
-  /**
-   * Initialize this class, sharing resources with |sharedContext|. The custom |drawer| will be used
-   * for drawing frames on the EGLSurface. This class is responsible for calling release() on
-   * |drawer|. It is allowed to call init() to reinitialize the renderer after a previous
-   * init()/release() cycle.
-   */
-  public void init(final EglBase.Context sharedContext, final int[] configAttributes,
-      RendererCommon.GlDrawer drawer) {
-    synchronized (handlerLock) {
-      if (renderThreadHandler != null) {
-        throw new IllegalStateException(name + "Already initialized");
-      }
-      logD("Initializing EglRenderer");
-      this.drawer = drawer;
-
-      final HandlerThread renderThread = new HandlerThread(name + "EglRenderer");
-      renderThread.start();
-      renderThreadHandler = new Handler(renderThread.getLooper());
-      // Create EGL context on the newly created render thread. It should be possibly to create the
-      // context on this thread and make it current on the render thread, but this causes failure on
-      // some Marvel based JB devices. https://bugs.chromium.org/p/webrtc/issues/detail?id=6350.
-      ThreadUtils.invokeAtFrontUninterruptibly(renderThreadHandler, () -> {
-        // If sharedContext is null, then texture frames are disabled. This is typically for old
-        // devices that might not be fully spec compliant, so force EGL 1.0 since EGL 1.4 has
-        // caused trouble on some weird devices.
-        if (sharedContext == null) {
-          logD("EglBase10.create context");
-          eglBase = EglBase.createEgl10(configAttributes);
-        } else {
-          logD("EglBase.create shared context");
-          eglBase = EglBase.create(sharedContext, configAttributes);
-        }
-      });
-      renderThreadHandler.post(eglSurfaceCreationRunnable);
-      final long currentTimeNs = System.nanoTime();
-      resetStatistics(currentTimeNs);
-      renderThreadHandler.postDelayed(
-          logStatisticsRunnable, TimeUnit.SECONDS.toMillis(LOG_INTERVAL_SEC));
-    }
-  }
-
-  public void createEglSurface(Surface surface) {
-    createEglSurfaceInternal(surface);
-  }
-
-  public void createEglSurface(SurfaceTexture surfaceTexture) {
-    createEglSurfaceInternal(surfaceTexture);
-  }
-
-  private void createEglSurfaceInternal(Object surface) {
-    eglSurfaceCreationRunnable.setSurface(surface);
-    postToRenderThread(eglSurfaceCreationRunnable);
-  }
-
-  /**
-   * Block until any pending frame is returned and all GL resources released, even if an interrupt
-   * occurs. If an interrupt occurs during release(), the interrupt flag will be set. This function
-   * should be called before the Activity is destroyed and the EGLContext is still valid. If you
-   * don't call this function, the GL resources might leak.
-   */
-  public void release() {
-    logD("Releasing.");
-    final CountDownLatch eglCleanupBarrier = new CountDownLatch(1);
-    synchronized (handlerLock) {
-      if (renderThreadHandler == null) {
-        logD("Already released");
-        return;
-      }
-      renderThreadHandler.removeCallbacks(logStatisticsRunnable);
-      // Release EGL and GL resources on render thread.
-      renderThreadHandler.postAtFrontOfQueue(() -> {
-        if (drawer != null) {
-          drawer.release();
-          drawer = null;
-        }
-        frameDrawer.release();
-        if (bitmapTextureFramebuffer != null) {
-          bitmapTextureFramebuffer.release();
-          bitmapTextureFramebuffer = null;
-        }
-        if (eglBase != null) {
-          logD("eglBase detach and release.");
-          eglBase.detachCurrent();
-          eglBase.release();
-          eglBase = null;
-        }
-        eglCleanupBarrier.countDown();
-      });
-      final Looper renderLooper = renderThreadHandler.getLooper();
-      // TODO(magjed): Replace this post() with renderLooper.quitSafely() when API support >= 18.
-      renderThreadHandler.post(() -> {
-        logD("Quitting render thread.");
-        renderLooper.quit();
-      });
-      // Don't accept any more frames or messages to the render thread.
-      renderThreadHandler = null;
-    }
-    // Make sure the EGL/GL cleanup posted above is executed.
-    ThreadUtils.awaitUninterruptibly(eglCleanupBarrier);
-    synchronized (frameLock) {
-      if (pendingFrame != null) {
-        pendingFrame.release();
-        pendingFrame = null;
-      }
-    }
-    logD("Releasing done.");
-  }
-
-  /**
-   * Reset the statistics logged in logStatistics().
-   */
-  private void resetStatistics(long currentTimeNs) {
-    synchronized (statisticsLock) {
-      statisticsStartTimeNs = currentTimeNs;
-      framesReceived = 0;
-      framesDropped = 0;
-      framesRendered = 0;
-      renderTimeNs = 0;
-      renderSwapBufferTimeNs = 0;
-    }
-  }
-
-  public void printStackTrace() {
-    synchronized (handlerLock) {
-      final Thread renderThread =
-          (renderThreadHandler == null) ? null : renderThreadHandler.getLooper().getThread();
-      if (renderThread != null) {
-        final StackTraceElement[] renderStackTrace = renderThread.getStackTrace();
-        if (renderStackTrace.length > 0) {
-          logD("EglRenderer stack trace:");
-          for (StackTraceElement traceElem : renderStackTrace) {
-            logD(traceElem.toString());
-          }
-        }
-      }
-    }
-  }
-
-  /**
-   * Set if the video stream should be mirrored or not.
-   */
-  public void setMirror(final boolean mirror) {
-    logD("setMirror: " + mirror);
-    synchronized (layoutLock) {
-      this.mirror = mirror;
-    }
-  }
-
-  /**
-   * Set layout aspect ratio. This is used to crop frames when rendering to avoid stretched video.
-   * Set this to 0 to disable cropping.
-   */
-  public void setLayoutAspectRatio(float layoutAspectRatio) {
-    logD("setLayoutAspectRatio: " + layoutAspectRatio);
-    synchronized (layoutLock) {
-      this.layoutAspectRatio = layoutAspectRatio;
-    }
-  }
-
-  /**
-   * Limit render framerate.
-   *
-   * @param fps Limit render framerate to this value, or use Float.POSITIVE_INFINITY to disable fps
-   *            reduction.
-   */
-  public void setFpsReduction(float fps) {
-    logD("setFpsReduction: " + fps);
-    synchronized (fpsReductionLock) {
-      final long previousRenderPeriodNs = minRenderPeriodNs;
-      if (fps <= 0) {
-        minRenderPeriodNs = Long.MAX_VALUE;
-      } else {
-        minRenderPeriodNs = (long) (TimeUnit.SECONDS.toNanos(1) / fps);
-      }
-      if (minRenderPeriodNs != previousRenderPeriodNs) {
-        // Fps reduction changed - reset frame time.
-        nextFrameTimeNs = System.nanoTime();
-      }
-    }
-  }
-
-  public void disableFpsReduction() {
-    setFpsReduction(Float.POSITIVE_INFINITY /* fps */);
-  }
-
-  public void pauseVideo() {
-    setFpsReduction(0 /* fps */);
-  }
-
-  /**
-   * Register a callback to be invoked when a new video frame has been received. This version uses
-   * the drawer of the EglRenderer that was passed in init.
-   *
-   * @param listener The callback to be invoked. The callback will be invoked on the render thread.
-   *                 It should be lightweight and must not call removeFrameListener.
-   * @param scale    The scale of the Bitmap passed to the callback, or 0 if no Bitmap is
-   *                 required.
-   */
-  public void addFrameListener(final FrameListener listener, final float scale) {
-    addFrameListener(listener, scale, null, false /* applyFpsReduction */);
-  }
-
-  /**
-   * Register a callback to be invoked when a new video frame has been received.
-   *
-   * @param listener The callback to be invoked. The callback will be invoked on the render thread.
-   *                 It should be lightweight and must not call removeFrameListener.
-   * @param scale    The scale of the Bitmap passed to the callback, or 0 if no Bitmap is
-   *                 required.
-   * @param drawer   Custom drawer to use for this frame listener or null to use the default one.
-   */
-  public void addFrameListener(
-      final FrameListener listener, final float scale, final RendererCommon.GlDrawer drawerParam) {
-    addFrameListener(listener, scale, drawerParam, false /* applyFpsReduction */);
-  }
-
-  /**
-   * Register a callback to be invoked when a new video frame has been received.
-   *
-   * @param listener The callback to be invoked. The callback will be invoked on the render thread.
-   *                 It should be lightweight and must not call removeFrameListener.
-   * @param scale    The scale of the Bitmap passed to the callback, or 0 if no Bitmap is
-   *                 required.
-   * @param drawer   Custom drawer to use for this frame listener or null to use the default one.
-   * @param applyFpsReduction This callback will not be called for frames that have been dropped by
-   *                          FPS reduction.
-   */
-  public void addFrameListener(final FrameListener listener, final float scale,
-      final RendererCommon.GlDrawer drawerParam, final boolean applyFpsReduction) {
-    postToRenderThread(() -> {
-      final RendererCommon.GlDrawer listenerDrawer = drawerParam == null ? drawer : drawerParam;
-      frameListeners.add(
-          new FrameListenerAndParams(listener, scale, listenerDrawer, applyFpsReduction));
-    });
-  }
-
-  /**
-   * Remove any pending callback that was added with addFrameListener. If the callback is not in
-   * the queue, nothing happens. It is ensured that callback won't be called after this method
-   * returns.
-   *
-   * @param runnable The callback to remove.
-   */
-  public void removeFrameListener(final FrameListener listener) {
-    if (Thread.currentThread() == renderThreadHandler.getLooper().getThread()) {
-      throw new RuntimeException("removeFrameListener must not be called on the render thread.");
-    }
-    final CountDownLatch latch = new CountDownLatch(1);
-    postToRenderThread(() -> {
-      latch.countDown();
-      final Iterator<FrameListenerAndParams> iter = frameListeners.iterator();
-      while (iter.hasNext()) {
-        if (iter.next().listener == listener) {
-          iter.remove();
-        }
-      }
-    });
-    ThreadUtils.awaitUninterruptibly(latch);
-  }
-
-  // VideoRenderer.Callbacks interface.
-  @Override
-  public void renderFrame(VideoRenderer.I420Frame frame) {
-    VideoFrame videoFrame = frame.toVideoFrame();
-    onFrame(videoFrame);
-    videoFrame.release();
-  }
-
-  // VideoSink interface.
-  @Override
-  public void onFrame(VideoFrame frame) {
-    synchronized (statisticsLock) {
-      ++framesReceived;
-    }
-    final boolean dropOldFrame;
-    synchronized (handlerLock) {
-      if (renderThreadHandler == null) {
-        logD("Dropping frame - Not initialized or already released.");
-        return;
-      }
-      synchronized (frameLock) {
-        dropOldFrame = (pendingFrame != null);
-        if (dropOldFrame) {
-          pendingFrame.release();
-        }
-        pendingFrame = frame;
-        pendingFrame.retain();
-        renderThreadHandler.post(this ::renderFrameOnRenderThread);
-      }
-    }
-    if (dropOldFrame) {
-      synchronized (statisticsLock) {
-        ++framesDropped;
-      }
-    }
-  }
-
-  /**
-   * Release EGL surface. This function will block until the EGL surface is released.
-   */
-  public void releaseEglSurface(final Runnable completionCallback) {
-    // Ensure that the render thread is no longer touching the Surface before returning from this
-    // function.
-    eglSurfaceCreationRunnable.setSurface(null /* surface */);
-    synchronized (handlerLock) {
-      if (renderThreadHandler != null) {
-        renderThreadHandler.removeCallbacks(eglSurfaceCreationRunnable);
-        renderThreadHandler.postAtFrontOfQueue(() -> {
-          if (eglBase != null) {
-            eglBase.detachCurrent();
-            eglBase.releaseSurface();
-          }
-          completionCallback.run();
-        });
-        return;
-      }
-    }
-    completionCallback.run();
-  }
-
-  /**
-   * Private helper function to post tasks safely.
-   */
-  private void postToRenderThread(Runnable runnable) {
-    synchronized (handlerLock) {
-      if (renderThreadHandler != null) {
-        renderThreadHandler.post(runnable);
-      }
-    }
-  }
-
-  private void clearSurfaceOnRenderThread(float r, float g, float b, float a) {
-    if (eglBase != null && eglBase.hasSurface()) {
-      logD("clearSurface");
-      GLES20.glClearColor(r, g, b, a);
-      GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
-      eglBase.swapBuffers();
-    }
-  }
-
-  /**
-   * Post a task to clear the surface to a transparent uniform color.
-   */
-  public void clearImage() {
-    clearImage(0 /* red */, 0 /* green */, 0 /* blue */, 0 /* alpha */);
-  }
-
-  /**
-   * Post a task to clear the surface to a specific color.
-   */
-  public void clearImage(final float r, final float g, final float b, final float a) {
-    synchronized (handlerLock) {
-      if (renderThreadHandler == null) {
-        return;
-      }
-      renderThreadHandler.postAtFrontOfQueue(() -> clearSurfaceOnRenderThread(r, g, b, a));
-    }
-  }
-
-  /**
-   * Renders and releases |pendingFrame|.
-   */
-  private void renderFrameOnRenderThread() {
-    // Fetch and render |pendingFrame|.
-    final VideoFrame frame;
-    synchronized (frameLock) {
-      if (pendingFrame == null) {
-        return;
-      }
-      frame = pendingFrame;
-      pendingFrame = null;
-    }
-    if (eglBase == null || !eglBase.hasSurface()) {
-      logD("Dropping frame - No surface");
-      frame.release();
-      return;
-    }
-    // Check if fps reduction is active.
-    final boolean shouldRenderFrame;
-    synchronized (fpsReductionLock) {
-      if (minRenderPeriodNs == Long.MAX_VALUE) {
-        // Rendering is paused.
-        shouldRenderFrame = false;
-      } else if (minRenderPeriodNs <= 0) {
-        // FPS reduction is disabled.
-        shouldRenderFrame = true;
-      } else {
-        final long currentTimeNs = System.nanoTime();
-        if (currentTimeNs < nextFrameTimeNs) {
-          logD("Skipping frame rendering - fps reduction is active.");
-          shouldRenderFrame = false;
-        } else {
-          nextFrameTimeNs += minRenderPeriodNs;
-          // The time for the next frame should always be in the future.
-          nextFrameTimeNs = Math.max(nextFrameTimeNs, currentTimeNs);
-          shouldRenderFrame = true;
-        }
-      }
-    }
-
-    final long startTimeNs = System.nanoTime();
-
-    final float frameAspectRatio = frame.getRotatedWidth() / (float) frame.getRotatedHeight();
-    final float drawnAspectRatio;
-    synchronized (layoutLock) {
-      drawnAspectRatio = layoutAspectRatio != 0f ? layoutAspectRatio : frameAspectRatio;
-    }
-
-    final float scaleX;
-    final float scaleY;
-
-    if (frameAspectRatio > drawnAspectRatio) {
-      scaleX = drawnAspectRatio / frameAspectRatio;
-      scaleY = 1f;
-    } else {
-      scaleX = 1f;
-      scaleY = frameAspectRatio / drawnAspectRatio;
-    }
-
-    drawMatrix.reset();
-    drawMatrix.preTranslate(0.5f, 0.5f);
-    if (mirror)
-      drawMatrix.preScale(-1f, 1f);
-    drawMatrix.preScale(scaleX, scaleY);
-    drawMatrix.preTranslate(-0.5f, -0.5f);
-
-    if (shouldRenderFrame) {
-      GLES20.glClearColor(0 /* red */, 0 /* green */, 0 /* blue */, 0 /* alpha */);
-      GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
-      frameDrawer.drawFrame(frame, drawer, drawMatrix, 0 /* viewportX */, 0 /* viewportY */,
-          eglBase.surfaceWidth(), eglBase.surfaceHeight());
-
-      final long swapBuffersStartTimeNs = System.nanoTime();
-      eglBase.swapBuffers();
-
-      final long currentTimeNs = System.nanoTime();
-      synchronized (statisticsLock) {
-        ++framesRendered;
-        renderTimeNs += (currentTimeNs - startTimeNs);
-        renderSwapBufferTimeNs += (currentTimeNs - swapBuffersStartTimeNs);
-      }
-    }
-
-    notifyCallbacks(frame, shouldRenderFrame);
-    frame.release();
-  }
-
-  private void notifyCallbacks(VideoFrame frame, boolean wasRendered) {
-    if (frameListeners.isEmpty())
-      return;
-
-    drawMatrix.reset();
-    drawMatrix.preTranslate(0.5f, 0.5f);
-    if (mirror)
-      drawMatrix.preScale(-1f, 1f);
-    drawMatrix.preScale(1f, -1f); // We want the output to be upside down for Bitmap.
-    drawMatrix.preTranslate(-0.5f, -0.5f);
-
-    Iterator<FrameListenerAndParams> it = frameListeners.iterator();
-    while (it.hasNext()) {
-      FrameListenerAndParams listenerAndParams = it.next();
-      if (!wasRendered && listenerAndParams.applyFpsReduction) {
-        continue;
-      }
-      it.remove();
-
-      final int scaledWidth = (int) (listenerAndParams.scale * frame.getRotatedWidth());
-      final int scaledHeight = (int) (listenerAndParams.scale * frame.getRotatedHeight());
-
-      if (scaledWidth == 0 || scaledHeight == 0) {
-        listenerAndParams.listener.onFrame(null);
-        continue;
-      }
-
-      if (bitmapTextureFramebuffer == null) {
-        bitmapTextureFramebuffer = new GlTextureFrameBuffer(GLES20.GL_RGBA);
-      }
-      bitmapTextureFramebuffer.setSize(scaledWidth, scaledHeight);
-
-      GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, bitmapTextureFramebuffer.getFrameBufferId());
-      GLES20.glFramebufferTexture2D(GLES20.GL_FRAMEBUFFER, GLES20.GL_COLOR_ATTACHMENT0,
-          GLES20.GL_TEXTURE_2D, bitmapTextureFramebuffer.getTextureId(), 0);
-
-      GLES20.glClearColor(0 /* red */, 0 /* green */, 0 /* blue */, 0 /* alpha */);
-      GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
-      frameDrawer.drawFrame(frame, listenerAndParams.drawer, drawMatrix, 0 /* viewportX */,
-          0 /* viewportY */, scaledWidth, scaledHeight);
-
-      final ByteBuffer bitmapBuffer = ByteBuffer.allocateDirect(scaledWidth * scaledHeight * 4);
-      GLES20.glViewport(0, 0, scaledWidth, scaledHeight);
-      GLES20.glReadPixels(
-          0, 0, scaledWidth, scaledHeight, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, bitmapBuffer);
-
-      GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, 0);
-      GlUtil.checkNoGLES2Error("EglRenderer.notifyCallbacks");
-
-      final Bitmap bitmap = Bitmap.createBitmap(scaledWidth, scaledHeight, Bitmap.Config.ARGB_8888);
-      bitmap.copyPixelsFromBuffer(bitmapBuffer);
-      listenerAndParams.listener.onFrame(bitmap);
-    }
-  }
-
-  private String averageTimeAsString(long sumTimeNs, int count) {
-    return (count <= 0) ? "NA" : TimeUnit.NANOSECONDS.toMicros(sumTimeNs / count) + " μs";
-  }
-
-  private void logStatistics() {
-    final long currentTimeNs = System.nanoTime();
-    synchronized (statisticsLock) {
-      final long elapsedTimeNs = currentTimeNs - statisticsStartTimeNs;
-      if (elapsedTimeNs <= 0) {
-        return;
-      }
-      final float renderFps = framesRendered * TimeUnit.SECONDS.toNanos(1) / (float) elapsedTimeNs;
-      logD("Duration: " + TimeUnit.NANOSECONDS.toMillis(elapsedTimeNs) + " ms."
-          + " Frames received: " + framesReceived + "."
-          + " Dropped: " + framesDropped + "."
-          + " Rendered: " + framesRendered + "."
-          + " Render fps: " + String.format(Locale.US, "%.1f", renderFps) + "."
-          + " Average render time: " + averageTimeAsString(renderTimeNs, framesRendered) + "."
-          + " Average swapBuffer time: "
-          + averageTimeAsString(renderSwapBufferTimeNs, framesRendered) + ".");
-      resetStatistics(currentTimeNs);
-    }
-  }
-
-  private void logD(String string) {
-    Logging.d(TAG, name + string);
-  }
-}
diff --git a/sdk/android/api/org/webrtc/EncodedImage.java b/sdk/android/api/org/webrtc/EncodedImage.java
deleted file mode 100644
index 6720cd7..0000000
--- a/sdk/android/api/org/webrtc/EncodedImage.java
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
- *  Copyright 2017 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.
- */
-
-package org.webrtc;
-
-import java.nio.ByteBuffer;
-import java.util.concurrent.TimeUnit;
-
-/**
- * An encoded frame from a video stream. Used as an input for decoders and as an output for
- * encoders.
- */
-public class EncodedImage {
-  // Must be kept in sync with common_types.h FrameType.
-  public enum FrameType {
-    EmptyFrame(0),
-    VideoFrameKey(3),
-    VideoFrameDelta(4);
-
-    private final int nativeIndex;
-
-    private FrameType(int nativeIndex) {
-      this.nativeIndex = nativeIndex;
-    }
-
-    public int getNative() {
-      return nativeIndex;
-    }
-
-    public static FrameType fromNative(int nativeIndex) {
-      for (FrameType type : FrameType.values()) {
-        if (type.nativeIndex == nativeIndex) {
-          return type;
-        }
-      }
-      throw new IllegalArgumentException("Unknown native frame type: " + nativeIndex);
-    }
-  }
-
-  public final ByteBuffer buffer;
-  public final int encodedWidth;
-  public final int encodedHeight;
-  public final long captureTimeMs; // Deprecated
-  public final long captureTimeNs;
-  public final FrameType frameType;
-  public final int rotation;
-  public final boolean completeFrame;
-  public final Integer qp;
-
-  private EncodedImage(ByteBuffer buffer, int encodedWidth, int encodedHeight, long captureTimeNs,
-      FrameType frameType, int rotation, boolean completeFrame, Integer qp) {
-    this.buffer = buffer;
-    this.encodedWidth = encodedWidth;
-    this.encodedHeight = encodedHeight;
-    this.captureTimeMs = TimeUnit.NANOSECONDS.toMillis(captureTimeNs);
-    this.captureTimeNs = captureTimeNs;
-    this.frameType = frameType;
-    this.rotation = rotation;
-    this.completeFrame = completeFrame;
-    this.qp = qp;
-  }
-
-  public static Builder builder() {
-    return new Builder();
-  }
-
-  public static class Builder {
-    private ByteBuffer buffer;
-    private int encodedWidth;
-    private int encodedHeight;
-    private long captureTimeNs;
-    private EncodedImage.FrameType frameType;
-    private int rotation;
-    private boolean completeFrame;
-    private Integer qp;
-
-    private Builder() {}
-
-    public Builder setBuffer(ByteBuffer buffer) {
-      this.buffer = buffer;
-      return this;
-    }
-
-    public Builder setEncodedWidth(int encodedWidth) {
-      this.encodedWidth = encodedWidth;
-      return this;
-    }
-
-    public Builder setEncodedHeight(int encodedHeight) {
-      this.encodedHeight = encodedHeight;
-      return this;
-    }
-
-    @Deprecated
-    public Builder setCaptureTimeMs(long captureTimeMs) {
-      this.captureTimeNs = TimeUnit.MILLISECONDS.toNanos(captureTimeMs);
-      return this;
-    }
-
-    public Builder setCaptureTimeNs(long captureTimeNs) {
-      this.captureTimeNs = captureTimeNs;
-      return this;
-    }
-
-    public Builder setFrameType(EncodedImage.FrameType frameType) {
-      this.frameType = frameType;
-      return this;
-    }
-
-    public Builder setRotation(int rotation) {
-      this.rotation = rotation;
-      return this;
-    }
-
-    public Builder setCompleteFrame(boolean completeFrame) {
-      this.completeFrame = completeFrame;
-      return this;
-    }
-
-    public Builder setQp(Integer qp) {
-      this.qp = qp;
-      return this;
-    }
-
-    public EncodedImage createEncodedImage() {
-      return new EncodedImage(buffer, encodedWidth, encodedHeight, captureTimeNs, frameType,
-          rotation, completeFrame, qp);
-    }
-  }
-}
diff --git a/sdk/android/api/org/webrtc/FileVideoCapturer.java b/sdk/android/api/org/webrtc/FileVideoCapturer.java
deleted file mode 100644
index a71e932..0000000
--- a/sdk/android/api/org/webrtc/FileVideoCapturer.java
+++ /dev/null
@@ -1,215 +0,0 @@
-/*
- *  Copyright 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.
- */
-
-package org.webrtc;
-
-import android.content.Context;
-import android.os.SystemClock;
-
-import java.util.concurrent.TimeUnit;
-import java.util.Timer;
-import java.util.TimerTask;
-import java.io.RandomAccessFile;
-import java.io.IOException;
-
-public class FileVideoCapturer implements VideoCapturer {
-  static {
-    System.loadLibrary("jingle_peerconnection_so");
-  }
-
-  private interface VideoReader {
-    int getFrameWidth();
-    int getFrameHeight();
-    byte[] getNextFrame();
-    void close();
-  }
-
-  /**
-   * Read video data from file for the .y4m container.
-   */
-  private static class VideoReaderY4M implements VideoReader {
-    private final static String TAG = "VideoReaderY4M";
-    private final int frameWidth;
-    private final int frameHeight;
-    private final int frameSize;
-
-    // First char after header
-    private final long videoStart;
-
-    private static final String Y4M_FRAME_DELIMETER = "FRAME";
-
-    private final RandomAccessFile mediaFileStream;
-
-    public int getFrameWidth() {
-      return frameWidth;
-    }
-
-    public int getFrameHeight() {
-      return frameHeight;
-    }
-
-    public VideoReaderY4M(String file) throws IOException {
-      mediaFileStream = new RandomAccessFile(file, "r");
-      StringBuilder builder = new StringBuilder();
-      for (;;) {
-        int c = mediaFileStream.read();
-        if (c == -1) {
-          // End of file reached.
-          throw new RuntimeException("Found end of file before end of header for file: " + file);
-        }
-        if (c == '\n') {
-          // End of header found.
-          break;
-        }
-        builder.append((char) c);
-      }
-      videoStart = mediaFileStream.getFilePointer();
-      String header = builder.toString();
-      String[] headerTokens = header.split("[ ]");
-      int w = 0;
-      int h = 0;
-      String colorSpace = "";
-      for (String tok : headerTokens) {
-        char c = tok.charAt(0);
-        switch (c) {
-          case 'W':
-            w = Integer.parseInt(tok.substring(1));
-            break;
-          case 'H':
-            h = Integer.parseInt(tok.substring(1));
-            break;
-          case 'C':
-            colorSpace = tok.substring(1);
-            break;
-        }
-      }
-      Logging.d(TAG, "Color space: " + colorSpace);
-      if (!colorSpace.equals("420") && !colorSpace.equals("420mpeg2")) {
-        throw new IllegalArgumentException(
-            "Does not support any other color space than I420 or I420mpeg2");
-      }
-      if ((w % 2) == 1 || (h % 2) == 1) {
-        throw new IllegalArgumentException("Does not support odd width or height");
-      }
-      frameWidth = w;
-      frameHeight = h;
-      frameSize = w * h * 3 / 2;
-      Logging.d(TAG, "frame dim: (" + w + ", " + h + ") frameSize: " + frameSize);
-    }
-
-    public byte[] getNextFrame() {
-      byte[] frame = new byte[frameSize];
-      try {
-        byte[] frameDelim = new byte[Y4M_FRAME_DELIMETER.length() + 1];
-        if (mediaFileStream.read(frameDelim) < frameDelim.length) {
-          // We reach end of file, loop
-          mediaFileStream.seek(videoStart);
-          if (mediaFileStream.read(frameDelim) < frameDelim.length) {
-            throw new RuntimeException("Error looping video");
-          }
-        }
-        String frameDelimStr = new String(frameDelim);
-        if (!frameDelimStr.equals(Y4M_FRAME_DELIMETER + "\n")) {
-          throw new RuntimeException(
-              "Frames should be delimited by FRAME plus newline, found delimter was: '"
-              + frameDelimStr + "'");
-        }
-        mediaFileStream.readFully(frame);
-        byte[] nv21Frame = new byte[frameSize];
-        nativeI420ToNV21(frame, frameWidth, frameHeight, nv21Frame);
-        return nv21Frame;
-      } catch (IOException e) {
-        throw new RuntimeException(e);
-      }
-    }
-
-    public void close() {
-      try {
-        mediaFileStream.close();
-      } catch (IOException e) {
-        Logging.e(TAG, "Problem closing file", e);
-      }
-    }
-  }
-
-  private final static String TAG = "FileVideoCapturer";
-  private final VideoReader videoReader;
-  private CapturerObserver capturerObserver;
-  private final Timer timer = new Timer();
-
-  private final TimerTask tickTask = new TimerTask() {
-    @Override
-    public void run() {
-      tick();
-    }
-  };
-
-  private int getFrameWidth() {
-    return videoReader.getFrameWidth();
-  }
-
-  private int getFrameHeight() {
-    return videoReader.getFrameHeight();
-  }
-
-  public FileVideoCapturer(String inputFile) throws IOException {
-    try {
-      videoReader = new VideoReaderY4M(inputFile);
-    } catch (IOException e) {
-      Logging.d(TAG, "Could not open video file: " + inputFile);
-      throw e;
-    }
-  }
-
-  private byte[] getNextFrame() {
-    return videoReader.getNextFrame();
-  }
-
-  public void tick() {
-    final long captureTimeNs = TimeUnit.MILLISECONDS.toNanos(SystemClock.elapsedRealtime());
-
-    byte[] frameData = getNextFrame();
-    capturerObserver.onByteBufferFrameCaptured(
-        frameData, getFrameWidth(), getFrameHeight(), 0, captureTimeNs);
-  }
-
-  @Override
-  public void initialize(SurfaceTextureHelper surfaceTextureHelper, Context applicationContext,
-      CapturerObserver capturerObserver) {
-    this.capturerObserver = capturerObserver;
-  }
-
-  @Override
-  public void startCapture(int width, int height, int framerate) {
-    timer.schedule(tickTask, 0, 1000 / framerate);
-  }
-
-  @Override
-  public void stopCapture() throws InterruptedException {
-    timer.cancel();
-  }
-
-  @Override
-  public void changeCaptureFormat(int width, int height, int framerate) {
-    // Empty on purpose
-  }
-
-  @Override
-  public void dispose() {
-    videoReader.close();
-  }
-
-  @Override
-  public boolean isScreencast() {
-    return false;
-  }
-
-  public static native void nativeI420ToNV21(byte[] src, int width, int height, byte[] dst);
-}
diff --git a/sdk/android/api/org/webrtc/GlRectDrawer.java b/sdk/android/api/org/webrtc/GlRectDrawer.java
deleted file mode 100644
index 6b36ede..0000000
--- a/sdk/android/api/org/webrtc/GlRectDrawer.java
+++ /dev/null
@@ -1,210 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-package org.webrtc;
-
-import android.opengl.GLES11Ext;
-import android.opengl.GLES20;
-import java.nio.FloatBuffer;
-import java.util.IdentityHashMap;
-import java.util.Map;
-
-/**
- * Helper class to draw an opaque quad on the target viewport location. Rotation, mirror, and
- * cropping is specified using a 4x4 texture coordinate transform matrix. The frame input can either
- * be an OES texture or YUV textures in I420 format. The GL state must be preserved between draw
- * calls, this is intentional to maximize performance. The function release() must be called
- * manually to free the resources held by this object.
- */
-public class GlRectDrawer implements RendererCommon.GlDrawer {
-  // clang-format off
-  // Simple vertex shader, used for both YUV and OES.
-  private static final String VERTEX_SHADER_STRING =
-        "varying vec2 interp_tc;\n"
-      + "attribute vec4 in_pos;\n"
-      + "attribute vec4 in_tc;\n"
-      + "\n"
-      + "uniform mat4 texMatrix;\n"
-      + "\n"
-      + "void main() {\n"
-      + "    gl_Position = in_pos;\n"
-      + "    interp_tc = (texMatrix * in_tc).xy;\n"
-      + "}\n";
-
-  private static final String YUV_FRAGMENT_SHADER_STRING =
-        "precision mediump float;\n"
-      + "varying vec2 interp_tc;\n"
-      + "\n"
-      + "uniform sampler2D y_tex;\n"
-      + "uniform sampler2D u_tex;\n"
-      + "uniform sampler2D v_tex;\n"
-      + "\n"
-      + "void main() {\n"
-      // CSC according to http://www.fourcc.org/fccyvrgb.php
-      + "  float y = texture2D(y_tex, interp_tc).r;\n"
-      + "  float u = texture2D(u_tex, interp_tc).r - 0.5;\n"
-      + "  float v = texture2D(v_tex, interp_tc).r - 0.5;\n"
-      + "  gl_FragColor = vec4(y + 1.403 * v, "
-      + "                      y - 0.344 * u - 0.714 * v, "
-      + "                      y + 1.77 * u, 1);\n"
-      + "}\n";
-
-  private static final String RGB_FRAGMENT_SHADER_STRING =
-        "precision mediump float;\n"
-      + "varying vec2 interp_tc;\n"
-      + "\n"
-      + "uniform sampler2D rgb_tex;\n"
-      + "\n"
-      + "void main() {\n"
-      + "  gl_FragColor = texture2D(rgb_tex, interp_tc);\n"
-      + "}\n";
-
-  private static final String OES_FRAGMENT_SHADER_STRING =
-        "#extension GL_OES_EGL_image_external : require\n"
-      + "precision mediump float;\n"
-      + "varying vec2 interp_tc;\n"
-      + "\n"
-      + "uniform samplerExternalOES oes_tex;\n"
-      + "\n"
-      + "void main() {\n"
-      + "  gl_FragColor = texture2D(oes_tex, interp_tc);\n"
-      + "}\n";
-  // clang-format on
-
-  // Vertex coordinates in Normalized Device Coordinates, i.e. (-1, -1) is bottom-left and (1, 1) is
-  // top-right.
-  private static final FloatBuffer FULL_RECTANGLE_BUF = GlUtil.createFloatBuffer(new float[] {
-      -1.0f, -1.0f, // Bottom left.
-      1.0f, -1.0f, // Bottom right.
-      -1.0f, 1.0f, // Top left.
-      1.0f, 1.0f, // Top right.
-  });
-
-  // Texture coordinates - (0, 0) is bottom-left and (1, 1) is top-right.
-  private static final FloatBuffer FULL_RECTANGLE_TEX_BUF = GlUtil.createFloatBuffer(new float[] {
-      0.0f, 0.0f, // Bottom left.
-      1.0f, 0.0f, // Bottom right.
-      0.0f, 1.0f, // Top left.
-      1.0f, 1.0f // Top right.
-  });
-
-  private static class Shader {
-    public final GlShader glShader;
-    public final int texMatrixLocation;
-
-    public Shader(String fragmentShader) {
-      this.glShader = new GlShader(VERTEX_SHADER_STRING, fragmentShader);
-      this.texMatrixLocation = glShader.getUniformLocation("texMatrix");
-    }
-  }
-
-  // The keys are one of the fragments shaders above.
-  private final Map<String, Shader> shaders = new IdentityHashMap<String, Shader>();
-
-  /**
-   * Draw an OES texture frame with specified texture transformation matrix. Required resources are
-   * allocated at the first call to this function.
-   */
-  @Override
-  public void drawOes(int oesTextureId, float[] texMatrix, int frameWidth, int frameHeight,
-      int viewportX, int viewportY, int viewportWidth, int viewportHeight) {
-    prepareShader(OES_FRAGMENT_SHADER_STRING, texMatrix);
-    GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
-    // updateTexImage() may be called from another thread in another EGL context, so we need to
-    // bind/unbind the texture in each draw call so that GLES understads it's a new texture.
-    GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, oesTextureId);
-    drawRectangle(viewportX, viewportY, viewportWidth, viewportHeight);
-    GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, 0);
-  }
-
-  /**
-   * Draw a RGB(A) texture frame with specified texture transformation matrix. Required resources
-   * are allocated at the first call to this function.
-   */
-  @Override
-  public void drawRgb(int textureId, float[] texMatrix, int frameWidth, int frameHeight,
-      int viewportX, int viewportY, int viewportWidth, int viewportHeight) {
-    prepareShader(RGB_FRAGMENT_SHADER_STRING, texMatrix);
-    GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
-    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textureId);
-    drawRectangle(viewportX, viewportY, viewportWidth, viewportHeight);
-    // Unbind the texture as a precaution.
-    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 0);
-  }
-
-  /**
-   * Draw a YUV frame with specified texture transformation matrix. Required resources are
-   * allocated at the first call to this function.
-   */
-  @Override
-  public void drawYuv(int[] yuvTextures, float[] texMatrix, int frameWidth, int frameHeight,
-      int viewportX, int viewportY, int viewportWidth, int viewportHeight) {
-    prepareShader(YUV_FRAGMENT_SHADER_STRING, texMatrix);
-    // Bind the textures.
-    for (int i = 0; i < 3; ++i) {
-      GLES20.glActiveTexture(GLES20.GL_TEXTURE0 + i);
-      GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, yuvTextures[i]);
-    }
-    drawRectangle(viewportX, viewportY, viewportWidth, viewportHeight);
-    // Unbind the textures as a precaution..
-    for (int i = 0; i < 3; ++i) {
-      GLES20.glActiveTexture(GLES20.GL_TEXTURE0 + i);
-      GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 0);
-    }
-  }
-
-  private void drawRectangle(int x, int y, int width, int height) {
-    // Draw quad.
-    GLES20.glViewport(x, y, width, height);
-    GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4);
-  }
-
-  private void prepareShader(String fragmentShader, float[] texMatrix) {
-    final Shader shader;
-    if (shaders.containsKey(fragmentShader)) {
-      shader = shaders.get(fragmentShader);
-    } else {
-      // Lazy allocation.
-      shader = new Shader(fragmentShader);
-      shaders.put(fragmentShader, shader);
-      shader.glShader.useProgram();
-      // Initialize fragment shader uniform values.
-      if (fragmentShader == YUV_FRAGMENT_SHADER_STRING) {
-        GLES20.glUniform1i(shader.glShader.getUniformLocation("y_tex"), 0);
-        GLES20.glUniform1i(shader.glShader.getUniformLocation("u_tex"), 1);
-        GLES20.glUniform1i(shader.glShader.getUniformLocation("v_tex"), 2);
-      } else if (fragmentShader == RGB_FRAGMENT_SHADER_STRING) {
-        GLES20.glUniform1i(shader.glShader.getUniformLocation("rgb_tex"), 0);
-      } else if (fragmentShader == OES_FRAGMENT_SHADER_STRING) {
-        GLES20.glUniform1i(shader.glShader.getUniformLocation("oes_tex"), 0);
-      } else {
-        throw new IllegalStateException("Unknown fragment shader: " + fragmentShader);
-      }
-      GlUtil.checkNoGLES2Error("Initialize fragment shader uniform values.");
-      // Initialize vertex shader attributes.
-      shader.glShader.setVertexAttribArray("in_pos", 2, FULL_RECTANGLE_BUF);
-      shader.glShader.setVertexAttribArray("in_tc", 2, FULL_RECTANGLE_TEX_BUF);
-    }
-    shader.glShader.useProgram();
-    // Copy the texture transformation matrix over.
-    GLES20.glUniformMatrix4fv(shader.texMatrixLocation, 1, false, texMatrix, 0);
-  }
-
-  /**
-   * Release all GLES resources. This needs to be done manually, otherwise the resources are leaked.
-   */
-  @Override
-  public void release() {
-    for (Shader shader : shaders.values()) {
-      shader.glShader.release();
-    }
-    shaders.clear();
-  }
-}
diff --git a/sdk/android/api/org/webrtc/GlShader.java b/sdk/android/api/org/webrtc/GlShader.java
deleted file mode 100644
index 15dfc45..0000000
--- a/sdk/android/api/org/webrtc/GlShader.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-package org.webrtc;
-
-import android.opengl.GLES20;
-
-import java.nio.FloatBuffer;
-
-// Helper class for handling OpenGL shaders and shader programs.
-public class GlShader {
-  private static final String TAG = "GlShader";
-
-  private static int compileShader(int shaderType, String source) {
-    final int shader = GLES20.glCreateShader(shaderType);
-    if (shader == 0) {
-      throw new RuntimeException("glCreateShader() failed. GLES20 error: " + GLES20.glGetError());
-    }
-    GLES20.glShaderSource(shader, source);
-    GLES20.glCompileShader(shader);
-    int[] compileStatus = new int[] {GLES20.GL_FALSE};
-    GLES20.glGetShaderiv(shader, GLES20.GL_COMPILE_STATUS, compileStatus, 0);
-    if (compileStatus[0] != GLES20.GL_TRUE) {
-      Logging.e(
-          TAG, "Could not compile shader " + shaderType + ":" + GLES20.glGetShaderInfoLog(shader));
-      throw new RuntimeException(GLES20.glGetShaderInfoLog(shader));
-    }
-    GlUtil.checkNoGLES2Error("compileShader");
-    return shader;
-  }
-
-  private int program;
-
-  public GlShader(String vertexSource, String fragmentSource) {
-    final int vertexShader = compileShader(GLES20.GL_VERTEX_SHADER, vertexSource);
-    final int fragmentShader = compileShader(GLES20.GL_FRAGMENT_SHADER, fragmentSource);
-    program = GLES20.glCreateProgram();
-    if (program == 0) {
-      throw new RuntimeException("glCreateProgram() failed. GLES20 error: " + GLES20.glGetError());
-    }
-    GLES20.glAttachShader(program, vertexShader);
-    GLES20.glAttachShader(program, fragmentShader);
-    GLES20.glLinkProgram(program);
-    int[] linkStatus = new int[] {GLES20.GL_FALSE};
-    GLES20.glGetProgramiv(program, GLES20.GL_LINK_STATUS, linkStatus, 0);
-    if (linkStatus[0] != GLES20.GL_TRUE) {
-      Logging.e(TAG, "Could not link program: " + GLES20.glGetProgramInfoLog(program));
-      throw new RuntimeException(GLES20.glGetProgramInfoLog(program));
-    }
-    // According to the documentation of glLinkProgram():
-    // "After the link operation, applications are free to modify attached shader objects, compile
-    // attached shader objects, detach shader objects, delete shader objects, and attach additional
-    // shader objects. None of these operations affects the information log or the program that is
-    // part of the program object."
-    // But in practice, detaching shaders from the program seems to break some devices. Deleting the
-    // shaders are fine however - it will delete them when they are no longer attached to a program.
-    GLES20.glDeleteShader(vertexShader);
-    GLES20.glDeleteShader(fragmentShader);
-    GlUtil.checkNoGLES2Error("Creating GlShader");
-  }
-
-  public int getAttribLocation(String label) {
-    if (program == -1) {
-      throw new RuntimeException("The program has been released");
-    }
-    int location = GLES20.glGetAttribLocation(program, label);
-    if (location < 0) {
-      throw new RuntimeException("Could not locate '" + label + "' in program");
-    }
-    return location;
-  }
-
-  /**
-   * Enable and upload a vertex array for attribute |label|. The vertex data is specified in
-   * |buffer| with |dimension| number of components per vertex.
-   */
-  public void setVertexAttribArray(String label, int dimension, FloatBuffer buffer) {
-    if (program == -1) {
-      throw new RuntimeException("The program has been released");
-    }
-    int location = getAttribLocation(label);
-    GLES20.glEnableVertexAttribArray(location);
-    GLES20.glVertexAttribPointer(location, dimension, GLES20.GL_FLOAT, false, 0, buffer);
-    GlUtil.checkNoGLES2Error("setVertexAttribArray");
-  }
-
-  public int getUniformLocation(String label) {
-    if (program == -1) {
-      throw new RuntimeException("The program has been released");
-    }
-    int location = GLES20.glGetUniformLocation(program, label);
-    if (location < 0) {
-      throw new RuntimeException("Could not locate uniform '" + label + "' in program");
-    }
-    return location;
-  }
-
-  public void useProgram() {
-    if (program == -1) {
-      throw new RuntimeException("The program has been released");
-    }
-    GLES20.glUseProgram(program);
-    GlUtil.checkNoGLES2Error("glUseProgram");
-  }
-
-  public void release() {
-    Logging.d(TAG, "Deleting shader.");
-    // Delete program, automatically detaching any shaders from it.
-    if (program != -1) {
-      GLES20.glDeleteProgram(program);
-      program = -1;
-    }
-  }
-}
diff --git a/sdk/android/api/org/webrtc/GlTextureFrameBuffer.java b/sdk/android/api/org/webrtc/GlTextureFrameBuffer.java
deleted file mode 100644
index 164dff2..0000000
--- a/sdk/android/api/org/webrtc/GlTextureFrameBuffer.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-package org.webrtc;
-
-import android.opengl.GLES20;
-
-/**
- * Helper class for handling OpenGL framebuffer with only color attachment and no depth or stencil
- * buffer. Intended for simple tasks such as texture copy, texture downscaling, and texture color
- * conversion.
- */
-// TODO(magjed): Add unittests for this class.
-public class GlTextureFrameBuffer {
-  private final int frameBufferId;
-  private final int textureId;
-  private final int pixelFormat;
-  private int width;
-  private int height;
-
-  /**
-   * Generate texture and framebuffer resources. An EGLContext must be bound on the current thread
-   * when calling this function. The framebuffer is not complete until setSize() is called.
-   */
-  public GlTextureFrameBuffer(int pixelFormat) {
-    switch (pixelFormat) {
-      case GLES20.GL_LUMINANCE:
-      case GLES20.GL_RGB:
-      case GLES20.GL_RGBA:
-        this.pixelFormat = pixelFormat;
-        break;
-      default:
-        throw new IllegalArgumentException("Invalid pixel format: " + pixelFormat);
-    }
-
-    // Create texture.
-    textureId = GlUtil.generateTexture(GLES20.GL_TEXTURE_2D);
-    this.width = 0;
-    this.height = 0;
-
-    // Create framebuffer object.
-    final int frameBuffers[] = new int[1];
-    GLES20.glGenFramebuffers(1, frameBuffers, 0);
-    frameBufferId = frameBuffers[0];
-  }
-
-  /**
-   * (Re)allocate texture. Will do nothing if the requested size equals the current size. An
-   * EGLContext must be bound on the current thread when calling this function. Must be called at
-   * least once before using the framebuffer. May be called multiple times to change size.
-   */
-  public void setSize(int width, int height) {
-    if (width == 0 || height == 0) {
-      throw new IllegalArgumentException("Invalid size: " + width + "x" + height);
-    }
-    if (width == this.width && height == this.height) {
-      return;
-    }
-    this.width = width;
-    this.height = height;
-
-    // Allocate texture.
-    GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
-    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textureId);
-    GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, pixelFormat, width, height, 0, pixelFormat,
-        GLES20.GL_UNSIGNED_BYTE, null);
-    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 0);
-    GlUtil.checkNoGLES2Error("GlTextureFrameBuffer setSize");
-
-    // Attach the texture to the framebuffer as color attachment.
-    GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, frameBufferId);
-    GLES20.glFramebufferTexture2D(
-        GLES20.GL_FRAMEBUFFER, GLES20.GL_COLOR_ATTACHMENT0, GLES20.GL_TEXTURE_2D, textureId, 0);
-
-    // Check that the framebuffer is in a good state.
-    final int status = GLES20.glCheckFramebufferStatus(GLES20.GL_FRAMEBUFFER);
-    if (status != GLES20.GL_FRAMEBUFFER_COMPLETE) {
-      throw new IllegalStateException("Framebuffer not complete, status: " + status);
-    }
-
-    GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, 0);
-  }
-
-  public int getWidth() {
-    return width;
-  }
-
-  public int getHeight() {
-    return height;
-  }
-
-  public int getFrameBufferId() {
-    return frameBufferId;
-  }
-
-  public int getTextureId() {
-    return textureId;
-  }
-
-  /**
-   * Release texture and framebuffer. An EGLContext must be bound on the current thread when calling
-   * this function. This object should not be used after this call.
-   */
-  public void release() {
-    GLES20.glDeleteTextures(1, new int[] {textureId}, 0);
-    GLES20.glDeleteFramebuffers(1, new int[] {frameBufferId}, 0);
-    width = 0;
-    height = 0;
-  }
-}
diff --git a/sdk/android/api/org/webrtc/GlUtil.java b/sdk/android/api/org/webrtc/GlUtil.java
deleted file mode 100644
index 6f5e605..0000000
--- a/sdk/android/api/org/webrtc/GlUtil.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-package org.webrtc;
-
-import android.opengl.GLES20;
-
-import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
-import java.nio.FloatBuffer;
-
-/**
- * Some OpenGL static utility functions.
- */
-public class GlUtil {
-  private GlUtil() {}
-
-  // Assert that no OpenGL ES 2.0 error has been raised.
-  public static void checkNoGLES2Error(String msg) {
-    int error = GLES20.glGetError();
-    if (error != GLES20.GL_NO_ERROR) {
-      throw new RuntimeException(msg + ": GLES20 error: " + error);
-    }
-  }
-
-  public static FloatBuffer createFloatBuffer(float[] coords) {
-    // Allocate a direct ByteBuffer, using 4 bytes per float, and copy coords into it.
-    ByteBuffer bb = ByteBuffer.allocateDirect(coords.length * 4);
-    bb.order(ByteOrder.nativeOrder());
-    FloatBuffer fb = bb.asFloatBuffer();
-    fb.put(coords);
-    fb.position(0);
-    return fb;
-  }
-
-  /**
-   * Generate texture with standard parameters.
-   */
-  public static int generateTexture(int target) {
-    final int textureArray[] = new int[1];
-    GLES20.glGenTextures(1, textureArray, 0);
-    final int textureId = textureArray[0];
-    GLES20.glBindTexture(target, textureId);
-    GLES20.glTexParameterf(target, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR);
-    GLES20.glTexParameterf(target, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR);
-    GLES20.glTexParameterf(target, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE);
-    GLES20.glTexParameterf(target, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE);
-    checkNoGLES2Error("generateTexture");
-    return textureId;
-  }
-}
diff --git a/sdk/android/api/org/webrtc/HardwareVideoDecoderFactory.java b/sdk/android/api/org/webrtc/HardwareVideoDecoderFactory.java
deleted file mode 100644
index 5f86e0a..0000000
--- a/sdk/android/api/org/webrtc/HardwareVideoDecoderFactory.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- *  Copyright 2017 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.
- */
-
-package org.webrtc;
-
-import static org.webrtc.MediaCodecUtils.EXYNOS_PREFIX;
-import static org.webrtc.MediaCodecUtils.INTEL_PREFIX;
-import static org.webrtc.MediaCodecUtils.NVIDIA_PREFIX;
-import static org.webrtc.MediaCodecUtils.QCOM_PREFIX;
-
-import android.media.MediaCodec;
-import android.media.MediaCodecInfo;
-import android.media.MediaCodecInfo.CodecCapabilities;
-import android.media.MediaCodecList;
-import android.os.Build;
-
-/** Factory for Android hardware VideoDecoders. */
-@SuppressWarnings("deprecation") // API level 16 requires use of deprecated methods.
-public class HardwareVideoDecoderFactory implements VideoDecoderFactory {
-  private static final String TAG = "HardwareVideoDecoderFactory";
-
-  private final EglBase.Context sharedContext;
-
-  /** Creates a HardwareVideoDecoderFactory that does not use surface textures. */
-  @Deprecated // Not removed yet to avoid breaking callers.
-  public HardwareVideoDecoderFactory() {
-    this(null);
-  }
-
-  /**
-   * Creates a HardwareVideoDecoderFactory that supports surface texture rendering using the given
-   * shared context.  The context may be null.  If it is null, then surface support is disabled.
-   */
-  public HardwareVideoDecoderFactory(EglBase.Context sharedContext) {
-    this.sharedContext = sharedContext;
-  }
-
-  @Override
-  public VideoDecoder createDecoder(String codecType) {
-    VideoCodecType type = VideoCodecType.valueOf(codecType);
-    MediaCodecInfo info = findCodecForType(type);
-
-    if (info == null) {
-      return null; // No support for this codec type.
-    }
-
-    CodecCapabilities capabilities = info.getCapabilitiesForType(type.mimeType());
-    return new HardwareVideoDecoder(info.getName(), type,
-        MediaCodecUtils.selectColorFormat(MediaCodecUtils.DECODER_COLOR_FORMATS, capabilities),
-        sharedContext);
-  }
-
-  private MediaCodecInfo findCodecForType(VideoCodecType type) {
-    // HW decoding is not supported on builds before KITKAT.
-    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
-      return null;
-    }
-
-    for (int i = 0; i < MediaCodecList.getCodecCount(); ++i) {
-      MediaCodecInfo info = null;
-      try {
-        info = MediaCodecList.getCodecInfoAt(i);
-      } catch (IllegalArgumentException e) {
-        Logging.e(TAG, "Cannot retrieve encoder codec info", e);
-      }
-
-      if (info == null || info.isEncoder()) {
-        continue;
-      }
-
-      if (isSupportedCodec(info, type)) {
-        return info;
-      }
-    }
-    return null; // No support for this type.
-  }
-
-  // Returns true if the given MediaCodecInfo indicates a supported encoder for the given type.
-  private boolean isSupportedCodec(MediaCodecInfo info, VideoCodecType type) {
-    if (!MediaCodecUtils.codecSupportsType(info, type)) {
-      return false;
-    }
-    // Check for a supported color format.
-    if (MediaCodecUtils.selectColorFormat(
-            MediaCodecUtils.DECODER_COLOR_FORMATS, info.getCapabilitiesForType(type.mimeType()))
-        == null) {
-      return false;
-    }
-    return isHardwareSupported(info, type);
-  }
-
-  private boolean isHardwareSupported(MediaCodecInfo info, VideoCodecType type) {
-    String name = info.getName();
-    switch (type) {
-      case VP8:
-        // QCOM, Intel, Exynos, and Nvidia all supported for VP8.
-        return name.startsWith(QCOM_PREFIX) || name.startsWith(INTEL_PREFIX)
-            || name.startsWith(EXYNOS_PREFIX) || name.startsWith(NVIDIA_PREFIX);
-      case VP9:
-        // QCOM and Exynos supported for VP9.
-        return name.startsWith(QCOM_PREFIX) || name.startsWith(EXYNOS_PREFIX);
-      case H264:
-        // QCOM, Intel, and Exynos supported for H264.
-        return name.startsWith(QCOM_PREFIX) || name.startsWith(INTEL_PREFIX)
-            || name.startsWith(EXYNOS_PREFIX);
-      default:
-        return false;
-    }
-  }
-}
diff --git a/sdk/android/api/org/webrtc/HardwareVideoEncoderFactory.java b/sdk/android/api/org/webrtc/HardwareVideoEncoderFactory.java
deleted file mode 100644
index 9324ba3..0000000
--- a/sdk/android/api/org/webrtc/HardwareVideoEncoderFactory.java
+++ /dev/null
@@ -1,247 +0,0 @@
-/*
- *  Copyright 2017 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.
- */
-
-package org.webrtc;
-
-import static org.webrtc.MediaCodecUtils.EXYNOS_PREFIX;
-import static org.webrtc.MediaCodecUtils.INTEL_PREFIX;
-import static org.webrtc.MediaCodecUtils.QCOM_PREFIX;
-
-import android.media.MediaCodecInfo;
-import android.media.MediaCodecList;
-import android.os.Build;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/** Factory for android hardware video encoders. */
-@SuppressWarnings("deprecation") // API 16 requires the use of deprecated methods.
-public class HardwareVideoEncoderFactory implements VideoEncoderFactory {
-  private static final String TAG = "HardwareVideoEncoderFactory";
-
-  // Forced key frame interval - used to reduce color distortions on Qualcomm platforms.
-  private static final int QCOM_VP8_KEY_FRAME_INTERVAL_ANDROID_L_MS = 15000;
-  private static final int QCOM_VP8_KEY_FRAME_INTERVAL_ANDROID_M_MS = 20000;
-  private static final int QCOM_VP8_KEY_FRAME_INTERVAL_ANDROID_N_MS = 15000;
-
-  // List of devices with poor H.264 encoder quality.
-  // HW H.264 encoder on below devices has poor bitrate control - actual
-  // bitrates deviates a lot from the target value.
-  private static final List<String> H264_HW_EXCEPTION_MODELS =
-      Arrays.asList("SAMSUNG-SGH-I337", "Nexus 7", "Nexus 4");
-
-  private final EglBase14.Context sharedContext;
-  private final boolean enableIntelVp8Encoder;
-  private final boolean enableH264HighProfile;
-
-  public HardwareVideoEncoderFactory(
-      EglBase.Context sharedContext, boolean enableIntelVp8Encoder, boolean enableH264HighProfile) {
-    // Texture mode requires EglBase14.
-    if (sharedContext instanceof EglBase14.Context) {
-      this.sharedContext = (EglBase14.Context) sharedContext;
-    } else {
-      Logging.w(TAG, "No shared EglBase.Context.  Encoders will not use texture mode.");
-      this.sharedContext = null;
-    }
-    this.enableIntelVp8Encoder = enableIntelVp8Encoder;
-    this.enableH264HighProfile = enableH264HighProfile;
-  }
-
-  @Deprecated
-  public HardwareVideoEncoderFactory(boolean enableIntelVp8Encoder, boolean enableH264HighProfile) {
-    this(null, enableIntelVp8Encoder, enableH264HighProfile);
-  }
-
-  @Override
-  public VideoEncoder createEncoder(VideoCodecInfo input) {
-    VideoCodecType type = VideoCodecType.valueOf(input.name);
-    MediaCodecInfo info = findCodecForType(type);
-
-    if (info == null) {
-      return null; // No support for this type.
-    }
-
-    String codecName = info.getName();
-    String mime = type.mimeType();
-    int colorFormat = MediaCodecUtils.selectColorFormat(sharedContext == null
-            ? MediaCodecUtils.ENCODER_COLOR_FORMATS
-            : MediaCodecUtils.TEXTURE_COLOR_FORMATS,
-        info.getCapabilitiesForType(mime));
-
-    return new HardwareVideoEncoder(codecName, type, colorFormat, input.params,
-        getKeyFrameIntervalSec(type), getForcedKeyFrameIntervalMs(type, codecName),
-        createBitrateAdjuster(type, codecName), sharedContext);
-  }
-
-  @Override
-  public VideoCodecInfo[] getSupportedCodecs() {
-    List<VideoCodecInfo> supportedCodecInfos = new ArrayList<VideoCodecInfo>();
-    // Generate a list of supported codecs in order of preference:
-    // VP8, VP9, H264 (high profile), and H264 (baseline profile).
-    for (VideoCodecType type :
-        new VideoCodecType[] {VideoCodecType.VP8, VideoCodecType.VP9, VideoCodecType.H264}) {
-      MediaCodecInfo codec = findCodecForType(type);
-      if (codec != null) {
-        String name = type.name();
-        if (type == VideoCodecType.H264 && isH264HighProfileSupported(codec)) {
-          supportedCodecInfos.add(new VideoCodecInfo(0, name, getCodecProperties(type, true)));
-        }
-
-        supportedCodecInfos.add(new VideoCodecInfo(0, name, getCodecProperties(type, false)));
-      }
-    }
-    return supportedCodecInfos.toArray(new VideoCodecInfo[supportedCodecInfos.size()]);
-  }
-
-  private MediaCodecInfo findCodecForType(VideoCodecType type) {
-    for (int i = 0; i < MediaCodecList.getCodecCount(); ++i) {
-      MediaCodecInfo info = null;
-      try {
-        info = MediaCodecList.getCodecInfoAt(i);
-      } catch (IllegalArgumentException e) {
-        Logging.e(TAG, "Cannot retrieve encoder codec info", e);
-      }
-
-      if (info == null || !info.isEncoder()) {
-        continue;
-      }
-
-      if (isSupportedCodec(info, type)) {
-        return info;
-      }
-    }
-    return null; // No support for this type.
-  }
-
-  // Returns true if the given MediaCodecInfo indicates a supported encoder for the given type.
-  private boolean isSupportedCodec(MediaCodecInfo info, VideoCodecType type) {
-    if (!MediaCodecUtils.codecSupportsType(info, type)) {
-      return false;
-    }
-    // Check for a supported color format.
-    if (MediaCodecUtils.selectColorFormat(sharedContext == null
-                ? MediaCodecUtils.ENCODER_COLOR_FORMATS
-                : MediaCodecUtils.TEXTURE_COLOR_FORMATS,
-            info.getCapabilitiesForType(type.mimeType()))
-        == null) {
-      return false;
-    }
-    return isHardwareSupportedInCurrentSdk(info, type);
-  }
-
-  // Returns true if the given MediaCodecInfo indicates a hardware module that is supported on the
-  // current SDK.
-  private boolean isHardwareSupportedInCurrentSdk(MediaCodecInfo info, VideoCodecType type) {
-    switch (type) {
-      case VP8:
-        return isHardwareSupportedInCurrentSdkVp8(info);
-      case VP9:
-        return isHardwareSupportedInCurrentSdkVp9(info);
-      case H264:
-        return isHardwareSupportedInCurrentSdkH264(info);
-    }
-    return false;
-  }
-
-  private boolean isHardwareSupportedInCurrentSdkVp8(MediaCodecInfo info) {
-    String name = info.getName();
-    // QCOM Vp8 encoder is supported in KITKAT or later.
-    return (name.startsWith(QCOM_PREFIX) && Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT)
-        // Exynos VP8 encoder is supported in M or later.
-        || (name.startsWith(EXYNOS_PREFIX) && Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
-        // Intel Vp8 encoder is supported in LOLLIPOP or later, with the intel encoder enabled.
-        || (name.startsWith(INTEL_PREFIX) && Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP
-               && enableIntelVp8Encoder);
-  }
-
-  private boolean isHardwareSupportedInCurrentSdkVp9(MediaCodecInfo info) {
-    String name = info.getName();
-    return (name.startsWith(QCOM_PREFIX) || name.startsWith(EXYNOS_PREFIX))
-        // Both QCOM and Exynos VP9 encoders are supported in N or later.
-        && Build.VERSION.SDK_INT >= Build.VERSION_CODES.N;
-  }
-
-  private boolean isHardwareSupportedInCurrentSdkH264(MediaCodecInfo info) {
-    // First, H264 hardware might perform poorly on this model.
-    if (H264_HW_EXCEPTION_MODELS.contains(Build.MODEL)) {
-      return false;
-    }
-    String name = info.getName();
-    // QCOM H264 encoder is supported in KITKAT or later.
-    return (name.startsWith(QCOM_PREFIX) && Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT)
-        // Exynos H264 encoder is supported in LOLLIPOP or later.
-        || (name.startsWith(EXYNOS_PREFIX)
-               && Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP);
-  }
-
-  private int getKeyFrameIntervalSec(VideoCodecType type) {
-    switch (type) {
-      case VP8: // Fallthrough intended.
-      case VP9:
-        return 100;
-      case H264:
-        return 20;
-    }
-    throw new IllegalArgumentException("Unsupported VideoCodecType " + type);
-  }
-
-  private int getForcedKeyFrameIntervalMs(VideoCodecType type, String codecName) {
-    if (type == VideoCodecType.VP8 && codecName.startsWith(QCOM_PREFIX)) {
-      if (Build.VERSION.SDK_INT == Build.VERSION_CODES.LOLLIPOP
-          || Build.VERSION.SDK_INT == Build.VERSION_CODES.LOLLIPOP_MR1) {
-        return QCOM_VP8_KEY_FRAME_INTERVAL_ANDROID_L_MS;
-      } else if (Build.VERSION.SDK_INT == Build.VERSION_CODES.M) {
-        return QCOM_VP8_KEY_FRAME_INTERVAL_ANDROID_M_MS;
-      } else if (Build.VERSION.SDK_INT > Build.VERSION_CODES.M) {
-        return QCOM_VP8_KEY_FRAME_INTERVAL_ANDROID_N_MS;
-      }
-    }
-    // Other codecs don't need key frame forcing.
-    return 0;
-  }
-
-  private BitrateAdjuster createBitrateAdjuster(VideoCodecType type, String codecName) {
-    if (codecName.startsWith(EXYNOS_PREFIX)) {
-      if (type == VideoCodecType.VP8) {
-        // Exynos VP8 encoders need dynamic bitrate adjustment.
-        return new DynamicBitrateAdjuster();
-      } else {
-        // Exynos VP9 and H264 encoders need framerate-based bitrate adjustment.
-        return new FramerateBitrateAdjuster();
-      }
-    }
-    // Other codecs don't need bitrate adjustment.
-    return new BaseBitrateAdjuster();
-  }
-
-  private boolean isH264HighProfileSupported(MediaCodecInfo info) {
-    return enableH264HighProfile && info.getName().startsWith(QCOM_PREFIX);
-  }
-
-  private Map<String, String> getCodecProperties(VideoCodecType type, boolean highProfile) {
-    switch (type) {
-      case VP8:
-      case VP9:
-        return new HashMap<String, String>();
-      case H264:
-        Map<String, String> properties = new HashMap<>();
-        properties.put(VideoCodecInfo.H264_FMTP_LEVEL_ASYMMETRY_ALLOWED, "1");
-        properties.put(VideoCodecInfo.H264_FMTP_PACKETIZATION_MODE, "1");
-        properties.put(VideoCodecInfo.H264_FMTP_PROFILE_LEVEL_ID,
-            highProfile ? VideoCodecInfo.H264_CONSTRAINED_HIGH_3_1
-                        : VideoCodecInfo.H264_CONSTRAINED_BASELINE_3_1);
-        return properties;
-      default:
-        throw new IllegalArgumentException("Unsupported codec: " + type);
-    }
-  }
-}
diff --git a/sdk/android/api/org/webrtc/IceCandidate.java b/sdk/android/api/org/webrtc/IceCandidate.java
deleted file mode 100644
index cfdfe60..0000000
--- a/sdk/android/api/org/webrtc/IceCandidate.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- *  Copyright 2013 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.
- */
-
-package org.webrtc;
-
-/**
- * Representation of a single ICE Candidate, mirroring
- * {@code IceCandidateInterface} in the C++ API.
- */
-public class IceCandidate {
-  public final String sdpMid;
-  public final int sdpMLineIndex;
-  public final String sdp;
-  public final String serverUrl;
-
-  public IceCandidate(String sdpMid, int sdpMLineIndex, String sdp) {
-    this.sdpMid = sdpMid;
-    this.sdpMLineIndex = sdpMLineIndex;
-    this.sdp = sdp;
-    this.serverUrl = "";
-  }
-
-  // Only be called internally from JNI.
-  private IceCandidate(String sdpMid, int sdpMLineIndex, String sdp, String serverUrl) {
-    this.sdpMid = sdpMid;
-    this.sdpMLineIndex = sdpMLineIndex;
-    this.sdp = sdp;
-    this.serverUrl = serverUrl;
-  }
-
-  public String toString() {
-    return sdpMid + ":" + sdpMLineIndex + ":" + sdp + ":" + serverUrl;
-  }
-}
diff --git a/sdk/android/api/org/webrtc/MediaCodecVideoDecoder.java b/sdk/android/api/org/webrtc/MediaCodecVideoDecoder.java
deleted file mode 100644
index 4304ff4..0000000
--- a/sdk/android/api/org/webrtc/MediaCodecVideoDecoder.java
+++ /dev/null
@@ -1,751 +0,0 @@
-/*
- *  Copyright 2014 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.
- */
-
-package org.webrtc;
-
-import android.media.MediaCodec;
-import android.media.MediaCodecInfo;
-import android.media.MediaCodecInfo.CodecCapabilities;
-import android.media.MediaCodecList;
-import android.media.MediaFormat;
-import android.os.Build;
-import android.os.SystemClock;
-import android.view.Surface;
-
-import java.nio.ByteBuffer;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Queue;
-import java.util.Set;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
-
-// Java-side of peerconnection_jni.cc:MediaCodecVideoDecoder.
-// This class is an implementation detail of the Java PeerConnection API.
-@SuppressWarnings("deprecation")
-public class MediaCodecVideoDecoder {
-  // This class is constructed, operated, and destroyed by its C++ incarnation,
-  // so the class and its methods have non-public visibility.  The API this
-  // class exposes aims to mimic the webrtc::VideoDecoder API as closely as
-  // possibly to minimize the amount of translation work necessary.
-
-  private static final String TAG = "MediaCodecVideoDecoder";
-  private static final long MAX_DECODE_TIME_MS = 200;
-
-  // TODO(magjed): Use MediaFormat constants when part of the public API.
-  private static final String FORMAT_KEY_STRIDE = "stride";
-  private static final String FORMAT_KEY_SLICE_HEIGHT = "slice-height";
-  private static final String FORMAT_KEY_CROP_LEFT = "crop-left";
-  private static final String FORMAT_KEY_CROP_RIGHT = "crop-right";
-  private static final String FORMAT_KEY_CROP_TOP = "crop-top";
-  private static final String FORMAT_KEY_CROP_BOTTOM = "crop-bottom";
-
-  // Tracks webrtc::VideoCodecType.
-  public enum VideoCodecType { VIDEO_CODEC_VP8, VIDEO_CODEC_VP9, VIDEO_CODEC_H264 }
-
-  // Timeout for input buffer dequeue.
-  private static final int DEQUEUE_INPUT_TIMEOUT = 500000;
-  // Timeout for codec releasing.
-  private static final int MEDIA_CODEC_RELEASE_TIMEOUT_MS = 5000;
-  // Max number of output buffers queued before starting to drop decoded frames.
-  private static final int MAX_QUEUED_OUTPUTBUFFERS = 3;
-  // Active running decoder instance. Set in initDecode() (called from native code)
-  // and reset to null in release() call.
-  private static MediaCodecVideoDecoder runningInstance = null;
-  private static MediaCodecVideoDecoderErrorCallback errorCallback = null;
-  private static int codecErrors = 0;
-  // List of disabled codec types - can be set from application.
-  private static Set<String> hwDecoderDisabledTypes = new HashSet<String>();
-
-  private Thread mediaCodecThread;
-  private MediaCodec mediaCodec;
-  private ByteBuffer[] inputBuffers;
-  private ByteBuffer[] outputBuffers;
-  private static final String VP8_MIME_TYPE = "video/x-vnd.on2.vp8";
-  private static final String VP9_MIME_TYPE = "video/x-vnd.on2.vp9";
-  private static final String H264_MIME_TYPE = "video/avc";
-  // List of supported HW VP8 decoders.
-  private static final String[] supportedVp8HwCodecPrefixes = {
-      "OMX.qcom.", "OMX.Nvidia.", "OMX.Exynos.", "OMX.Intel."};
-  // List of supported HW VP9 decoders.
-  private static final String[] supportedVp9HwCodecPrefixes = {"OMX.qcom.", "OMX.Exynos."};
-  // List of supported HW H.264 decoders.
-  private static final String[] supportedH264HwCodecPrefixes = {
-      "OMX.qcom.", "OMX.Intel.", "OMX.Exynos."};
-  // List of supported HW H.264 high profile decoders.
-  private static final String supportedQcomH264HighProfileHwCodecPrefix = "OMX.qcom.";
-  private static final String supportedExynosH264HighProfileHwCodecPrefix = "OMX.Exynos.";
-
-  // NV12 color format supported by QCOM codec, but not declared in MediaCodec -
-  // see /hardware/qcom/media/mm-core/inc/OMX_QCOMExtns.h
-  private static final int COLOR_QCOM_FORMATYVU420PackedSemiPlanar32m4ka = 0x7FA30C01;
-  private static final int COLOR_QCOM_FORMATYVU420PackedSemiPlanar16m4ka = 0x7FA30C02;
-  private static final int COLOR_QCOM_FORMATYVU420PackedSemiPlanar64x32Tile2m8ka = 0x7FA30C03;
-  private static final int COLOR_QCOM_FORMATYUV420PackedSemiPlanar32m = 0x7FA30C04;
-  // Allowable color formats supported by codec - in order of preference.
-  private static final List<Integer> supportedColorList = Arrays.asList(
-      CodecCapabilities.COLOR_FormatYUV420Planar, CodecCapabilities.COLOR_FormatYUV420SemiPlanar,
-      CodecCapabilities.COLOR_QCOM_FormatYUV420SemiPlanar,
-      COLOR_QCOM_FORMATYVU420PackedSemiPlanar32m4ka, COLOR_QCOM_FORMATYVU420PackedSemiPlanar16m4ka,
-      COLOR_QCOM_FORMATYVU420PackedSemiPlanar64x32Tile2m8ka,
-      COLOR_QCOM_FORMATYUV420PackedSemiPlanar32m);
-
-  private int colorFormat;
-  private int width;
-  private int height;
-  private int stride;
-  private int sliceHeight;
-  private boolean hasDecodedFirstFrame;
-  private final Queue<TimeStamps> decodeStartTimeMs = new LinkedList<TimeStamps>();
-  private boolean useSurface;
-
-  // The below variables are only used when decoding to a Surface.
-  private TextureListener textureListener;
-  private int droppedFrames;
-  private Surface surface = null;
-  private final Queue<DecodedOutputBuffer> dequeuedSurfaceOutputBuffers =
-      new LinkedList<DecodedOutputBuffer>();
-
-  // MediaCodec error handler - invoked when critical error happens which may prevent
-  // further use of media codec API. Now it means that one of media codec instances
-  // is hanging and can no longer be used in the next call.
-  public static interface MediaCodecVideoDecoderErrorCallback {
-    void onMediaCodecVideoDecoderCriticalError(int codecErrors);
-  }
-
-  public static void setErrorCallback(MediaCodecVideoDecoderErrorCallback errorCallback) {
-    Logging.d(TAG, "Set error callback");
-    MediaCodecVideoDecoder.errorCallback = errorCallback;
-  }
-
-  // Functions to disable HW decoding - can be called from applications for platforms
-  // which have known HW decoding problems.
-  public static void disableVp8HwCodec() {
-    Logging.w(TAG, "VP8 decoding is disabled by application.");
-    hwDecoderDisabledTypes.add(VP8_MIME_TYPE);
-  }
-
-  public static void disableVp9HwCodec() {
-    Logging.w(TAG, "VP9 decoding is disabled by application.");
-    hwDecoderDisabledTypes.add(VP9_MIME_TYPE);
-  }
-
-  public static void disableH264HwCodec() {
-    Logging.w(TAG, "H.264 decoding is disabled by application.");
-    hwDecoderDisabledTypes.add(H264_MIME_TYPE);
-  }
-
-  // Functions to query if HW decoding is supported.
-  public static boolean isVp8HwSupported() {
-    return !hwDecoderDisabledTypes.contains(VP8_MIME_TYPE)
-        && (findDecoder(VP8_MIME_TYPE, supportedVp8HwCodecPrefixes) != null);
-  }
-
-  public static boolean isVp9HwSupported() {
-    return !hwDecoderDisabledTypes.contains(VP9_MIME_TYPE)
-        && (findDecoder(VP9_MIME_TYPE, supportedVp9HwCodecPrefixes) != null);
-  }
-
-  public static boolean isH264HwSupported() {
-    return !hwDecoderDisabledTypes.contains(H264_MIME_TYPE)
-        && (findDecoder(H264_MIME_TYPE, supportedH264HwCodecPrefixes) != null);
-  }
-
-  public static boolean isH264HighProfileHwSupported() {
-    if (hwDecoderDisabledTypes.contains(H264_MIME_TYPE)) {
-      return false;
-    }
-    // Support H.264 HP decoding on QCOM chips for Android L and above.
-    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP
-        && findDecoder(H264_MIME_TYPE, new String[] {supportedQcomH264HighProfileHwCodecPrefix})
-            != null) {
-      return true;
-    }
-    // Support H.264 HP decoding on Exynos chips for Android M and above.
-    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M
-        && findDecoder(H264_MIME_TYPE, new String[] {supportedExynosH264HighProfileHwCodecPrefix})
-            != null) {
-      return true;
-    }
-    return false;
-  }
-
-  public static void printStackTrace() {
-    if (runningInstance != null && runningInstance.mediaCodecThread != null) {
-      StackTraceElement[] mediaCodecStackTraces = runningInstance.mediaCodecThread.getStackTrace();
-      if (mediaCodecStackTraces.length > 0) {
-        Logging.d(TAG, "MediaCodecVideoDecoder stacks trace:");
-        for (StackTraceElement stackTrace : mediaCodecStackTraces) {
-          Logging.d(TAG, stackTrace.toString());
-        }
-      }
-    }
-  }
-
-  // Helper struct for findDecoder() below.
-  private static class DecoderProperties {
-    public DecoderProperties(String codecName, int colorFormat) {
-      this.codecName = codecName;
-      this.colorFormat = colorFormat;
-    }
-    public final String codecName; // OpenMax component name for VP8 codec.
-    public final int colorFormat; // Color format supported by codec.
-  }
-
-  private static DecoderProperties findDecoder(String mime, String[] supportedCodecPrefixes) {
-    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
-      return null; // MediaCodec.setParameters is missing.
-    }
-    Logging.d(TAG, "Trying to find HW decoder for mime " + mime);
-    for (int i = 0; i < MediaCodecList.getCodecCount(); ++i) {
-      MediaCodecInfo info = null;
-      try {
-        info = MediaCodecList.getCodecInfoAt(i);
-      } catch (IllegalArgumentException e) {
-        Logging.e(TAG, "Cannot retrieve decoder codec info", e);
-      }
-      if (info == null || info.isEncoder()) {
-        continue;
-      }
-      String name = null;
-      for (String mimeType : info.getSupportedTypes()) {
-        if (mimeType.equals(mime)) {
-          name = info.getName();
-          break;
-        }
-      }
-      if (name == null) {
-        continue; // No HW support in this codec; try the next one.
-      }
-      Logging.d(TAG, "Found candidate decoder " + name);
-
-      // Check if this is supported decoder.
-      boolean supportedCodec = false;
-      for (String codecPrefix : supportedCodecPrefixes) {
-        if (name.startsWith(codecPrefix)) {
-          supportedCodec = true;
-          break;
-        }
-      }
-      if (!supportedCodec) {
-        continue;
-      }
-
-      // Check if codec supports either yuv420 or nv12.
-      CodecCapabilities capabilities;
-      try {
-        capabilities = info.getCapabilitiesForType(mime);
-      } catch (IllegalArgumentException e) {
-        Logging.e(TAG, "Cannot retrieve decoder capabilities", e);
-        continue;
-      }
-      for (int colorFormat : capabilities.colorFormats) {
-        Logging.v(TAG, "   Color: 0x" + Integer.toHexString(colorFormat));
-      }
-      for (int supportedColorFormat : supportedColorList) {
-        for (int codecColorFormat : capabilities.colorFormats) {
-          if (codecColorFormat == supportedColorFormat) {
-            // Found supported HW decoder.
-            Logging.d(TAG, "Found target decoder " + name + ". Color: 0x"
-                    + Integer.toHexString(codecColorFormat));
-            return new DecoderProperties(name, codecColorFormat);
-          }
-        }
-      }
-    }
-    Logging.d(TAG, "No HW decoder found for mime " + mime);
-    return null; // No HW decoder.
-  }
-
-  private void checkOnMediaCodecThread() throws IllegalStateException {
-    if (mediaCodecThread.getId() != Thread.currentThread().getId()) {
-      throw new IllegalStateException("MediaCodecVideoDecoder previously operated on "
-          + mediaCodecThread + " but is now called on " + Thread.currentThread());
-    }
-  }
-
-  // Pass null in |surfaceTextureHelper| to configure the codec for ByteBuffer output.
-  private boolean initDecode(
-      VideoCodecType type, int width, int height, SurfaceTextureHelper surfaceTextureHelper) {
-    if (mediaCodecThread != null) {
-      throw new RuntimeException("initDecode: Forgot to release()?");
-    }
-
-    String mime = null;
-    useSurface = (surfaceTextureHelper != null);
-    String[] supportedCodecPrefixes = null;
-    if (type == VideoCodecType.VIDEO_CODEC_VP8) {
-      mime = VP8_MIME_TYPE;
-      supportedCodecPrefixes = supportedVp8HwCodecPrefixes;
-    } else if (type == VideoCodecType.VIDEO_CODEC_VP9) {
-      mime = VP9_MIME_TYPE;
-      supportedCodecPrefixes = supportedVp9HwCodecPrefixes;
-    } else if (type == VideoCodecType.VIDEO_CODEC_H264) {
-      mime = H264_MIME_TYPE;
-      supportedCodecPrefixes = supportedH264HwCodecPrefixes;
-    } else {
-      throw new RuntimeException("initDecode: Non-supported codec " + type);
-    }
-    DecoderProperties properties = findDecoder(mime, supportedCodecPrefixes);
-    if (properties == null) {
-      throw new RuntimeException("Cannot find HW decoder for " + type);
-    }
-
-    Logging.d(TAG, "Java initDecode: " + type + " : " + width + " x " + height + ". Color: 0x"
-            + Integer.toHexString(properties.colorFormat) + ". Use Surface: " + useSurface);
-
-    runningInstance = this; // Decoder is now running and can be queried for stack traces.
-    mediaCodecThread = Thread.currentThread();
-    try {
-      this.width = width;
-      this.height = height;
-      stride = width;
-      sliceHeight = height;
-
-      if (useSurface) {
-        textureListener = new TextureListener(surfaceTextureHelper);
-        surface = new Surface(surfaceTextureHelper.getSurfaceTexture());
-      }
-
-      MediaFormat format = MediaFormat.createVideoFormat(mime, width, height);
-      if (!useSurface) {
-        format.setInteger(MediaFormat.KEY_COLOR_FORMAT, properties.colorFormat);
-      }
-      Logging.d(TAG, "  Format: " + format);
-      mediaCodec = MediaCodecVideoEncoder.createByCodecName(properties.codecName);
-      if (mediaCodec == null) {
-        Logging.e(TAG, "Can not create media decoder");
-        return false;
-      }
-      mediaCodec.configure(format, surface, null, 0);
-      mediaCodec.start();
-
-      colorFormat = properties.colorFormat;
-      outputBuffers = mediaCodec.getOutputBuffers();
-      inputBuffers = mediaCodec.getInputBuffers();
-      decodeStartTimeMs.clear();
-      hasDecodedFirstFrame = false;
-      dequeuedSurfaceOutputBuffers.clear();
-      droppedFrames = 0;
-      Logging.d(TAG,
-          "Input buffers: " + inputBuffers.length + ". Output buffers: " + outputBuffers.length);
-      return true;
-    } catch (IllegalStateException e) {
-      Logging.e(TAG, "initDecode failed", e);
-      return false;
-    }
-  }
-
-  // Resets the decoder so it can start decoding frames with new resolution.
-  // Flushes MediaCodec and clears decoder output buffers.
-  private void reset(int width, int height) {
-    if (mediaCodecThread == null || mediaCodec == null) {
-      throw new RuntimeException("Incorrect reset call for non-initialized decoder.");
-    }
-    Logging.d(TAG, "Java reset: " + width + " x " + height);
-
-    mediaCodec.flush();
-
-    this.width = width;
-    this.height = height;
-    decodeStartTimeMs.clear();
-    dequeuedSurfaceOutputBuffers.clear();
-    hasDecodedFirstFrame = false;
-    droppedFrames = 0;
-  }
-
-  private void release() {
-    Logging.d(TAG, "Java releaseDecoder. Total number of dropped frames: " + droppedFrames);
-    checkOnMediaCodecThread();
-
-    // Run Mediacodec stop() and release() on separate thread since sometime
-    // Mediacodec.stop() may hang.
-    final CountDownLatch releaseDone = new CountDownLatch(1);
-
-    Runnable runMediaCodecRelease = new Runnable() {
-      @Override
-      public void run() {
-        try {
-          Logging.d(TAG, "Java releaseDecoder on release thread");
-          mediaCodec.stop();
-          mediaCodec.release();
-          Logging.d(TAG, "Java releaseDecoder on release thread done");
-        } catch (Exception e) {
-          Logging.e(TAG, "Media decoder release failed", e);
-        }
-        releaseDone.countDown();
-      }
-    };
-    new Thread(runMediaCodecRelease).start();
-
-    if (!ThreadUtils.awaitUninterruptibly(releaseDone, MEDIA_CODEC_RELEASE_TIMEOUT_MS)) {
-      Logging.e(TAG, "Media decoder release timeout");
-      codecErrors++;
-      if (errorCallback != null) {
-        Logging.e(TAG, "Invoke codec error callback. Errors: " + codecErrors);
-        errorCallback.onMediaCodecVideoDecoderCriticalError(codecErrors);
-      }
-    }
-
-    mediaCodec = null;
-    mediaCodecThread = null;
-    runningInstance = null;
-    if (useSurface) {
-      surface.release();
-      surface = null;
-      textureListener.release();
-    }
-    Logging.d(TAG, "Java releaseDecoder done");
-  }
-
-  // Dequeue an input buffer and return its index, -1 if no input buffer is
-  // available, or -2 if the codec is no longer operative.
-  private int dequeueInputBuffer() {
-    checkOnMediaCodecThread();
-    try {
-      return mediaCodec.dequeueInputBuffer(DEQUEUE_INPUT_TIMEOUT);
-    } catch (IllegalStateException e) {
-      Logging.e(TAG, "dequeueIntputBuffer failed", e);
-      return -2;
-    }
-  }
-
-  private boolean queueInputBuffer(int inputBufferIndex, int size, long presentationTimeStamUs,
-      long timeStampMs, long ntpTimeStamp) {
-    checkOnMediaCodecThread();
-    try {
-      inputBuffers[inputBufferIndex].position(0);
-      inputBuffers[inputBufferIndex].limit(size);
-      decodeStartTimeMs.add(
-          new TimeStamps(SystemClock.elapsedRealtime(), timeStampMs, ntpTimeStamp));
-      mediaCodec.queueInputBuffer(inputBufferIndex, 0, size, presentationTimeStamUs, 0);
-      return true;
-    } catch (IllegalStateException e) {
-      Logging.e(TAG, "decode failed", e);
-      return false;
-    }
-  }
-
-  private static class TimeStamps {
-    public TimeStamps(long decodeStartTimeMs, long timeStampMs, long ntpTimeStampMs) {
-      this.decodeStartTimeMs = decodeStartTimeMs;
-      this.timeStampMs = timeStampMs;
-      this.ntpTimeStampMs = ntpTimeStampMs;
-    }
-    // Time when this frame was queued for decoding.
-    private final long decodeStartTimeMs;
-    // Only used for bookkeeping in Java. Stores C++ inputImage._timeStamp value for input frame.
-    private final long timeStampMs;
-    // Only used for bookkeeping in Java. Stores C++ inputImage.ntp_time_ms_ value for input frame.
-    private final long ntpTimeStampMs;
-  }
-
-  // Helper struct for dequeueOutputBuffer() below.
-  private static class DecodedOutputBuffer {
-    public DecodedOutputBuffer(int index, int offset, int size, long presentationTimeStampMs,
-        long timeStampMs, long ntpTimeStampMs, long decodeTime, long endDecodeTime) {
-      this.index = index;
-      this.offset = offset;
-      this.size = size;
-      this.presentationTimeStampMs = presentationTimeStampMs;
-      this.timeStampMs = timeStampMs;
-      this.ntpTimeStampMs = ntpTimeStampMs;
-      this.decodeTimeMs = decodeTime;
-      this.endDecodeTimeMs = endDecodeTime;
-    }
-
-    private final int index;
-    private final int offset;
-    private final int size;
-    // Presentation timestamp returned in dequeueOutputBuffer call.
-    private final long presentationTimeStampMs;
-    // C++ inputImage._timeStamp value for output frame.
-    private final long timeStampMs;
-    // C++ inputImage.ntp_time_ms_ value for output frame.
-    private final long ntpTimeStampMs;
-    // Number of ms it took to decode this frame.
-    private final long decodeTimeMs;
-    // System time when this frame decoding finished.
-    private final long endDecodeTimeMs;
-  }
-
-  // Helper struct for dequeueTextureBuffer() below.
-  private static class DecodedTextureBuffer {
-    private final int textureID;
-    private final float[] transformMatrix;
-    // Presentation timestamp returned in dequeueOutputBuffer call.
-    private final long presentationTimeStampMs;
-    // C++ inputImage._timeStamp value for output frame.
-    private final long timeStampMs;
-    // C++ inputImage.ntp_time_ms_ value for output frame.
-    private final long ntpTimeStampMs;
-    // Number of ms it took to decode this frame.
-    private final long decodeTimeMs;
-    // Interval from when the frame finished decoding until this buffer has been created.
-    // Since there is only one texture, this interval depend on the time from when
-    // a frame is decoded and provided to C++ and until that frame is returned to the MediaCodec
-    // so that the texture can be updated with the next decoded frame.
-    private final long frameDelayMs;
-
-    // A DecodedTextureBuffer with zero |textureID| has special meaning and represents a frame
-    // that was dropped.
-    public DecodedTextureBuffer(int textureID, float[] transformMatrix,
-        long presentationTimeStampMs, long timeStampMs, long ntpTimeStampMs, long decodeTimeMs,
-        long frameDelay) {
-      this.textureID = textureID;
-      this.transformMatrix = transformMatrix;
-      this.presentationTimeStampMs = presentationTimeStampMs;
-      this.timeStampMs = timeStampMs;
-      this.ntpTimeStampMs = ntpTimeStampMs;
-      this.decodeTimeMs = decodeTimeMs;
-      this.frameDelayMs = frameDelay;
-    }
-  }
-
-  // Poll based texture listener.
-  private static class TextureListener
-      implements SurfaceTextureHelper.OnTextureFrameAvailableListener {
-    private final SurfaceTextureHelper surfaceTextureHelper;
-    // |newFrameLock| is used to synchronize arrival of new frames with wait()/notifyAll().
-    private final Object newFrameLock = new Object();
-    // |bufferToRender| is non-null when waiting for transition between addBufferToRender() to
-    // onTextureFrameAvailable().
-    private DecodedOutputBuffer bufferToRender;
-    private DecodedTextureBuffer renderedBuffer;
-
-    public TextureListener(SurfaceTextureHelper surfaceTextureHelper) {
-      this.surfaceTextureHelper = surfaceTextureHelper;
-      surfaceTextureHelper.startListening(this);
-    }
-
-    public void addBufferToRender(DecodedOutputBuffer buffer) {
-      if (bufferToRender != null) {
-        Logging.e(TAG, "Unexpected addBufferToRender() called while waiting for a texture.");
-        throw new IllegalStateException("Waiting for a texture.");
-      }
-      bufferToRender = buffer;
-    }
-
-    public boolean isWaitingForTexture() {
-      synchronized (newFrameLock) {
-        return bufferToRender != null;
-      }
-    }
-
-    // Callback from |surfaceTextureHelper|. May be called on an arbitrary thread.
-    @Override
-    public void onTextureFrameAvailable(
-        int oesTextureId, float[] transformMatrix, long timestampNs) {
-      synchronized (newFrameLock) {
-        if (renderedBuffer != null) {
-          Logging.e(
-              TAG, "Unexpected onTextureFrameAvailable() called while already holding a texture.");
-          throw new IllegalStateException("Already holding a texture.");
-        }
-        // |timestampNs| is always zero on some Android versions.
-        renderedBuffer = new DecodedTextureBuffer(oesTextureId, transformMatrix,
-            bufferToRender.presentationTimeStampMs, bufferToRender.timeStampMs,
-            bufferToRender.ntpTimeStampMs, bufferToRender.decodeTimeMs,
-            SystemClock.elapsedRealtime() - bufferToRender.endDecodeTimeMs);
-        bufferToRender = null;
-        newFrameLock.notifyAll();
-      }
-    }
-
-    // Dequeues and returns a DecodedTextureBuffer if available, or null otherwise.
-    public DecodedTextureBuffer dequeueTextureBuffer(int timeoutMs) {
-      synchronized (newFrameLock) {
-        if (renderedBuffer == null && timeoutMs > 0 && isWaitingForTexture()) {
-          try {
-            newFrameLock.wait(timeoutMs);
-          } catch (InterruptedException e) {
-            // Restore the interrupted status by reinterrupting the thread.
-            Thread.currentThread().interrupt();
-          }
-        }
-        DecodedTextureBuffer returnedBuffer = renderedBuffer;
-        renderedBuffer = null;
-        return returnedBuffer;
-      }
-    }
-
-    public void release() {
-      // SurfaceTextureHelper.stopListening() will block until any onTextureFrameAvailable() in
-      // progress is done. Therefore, the call must be outside any synchronized
-      // statement that is also used in the onTextureFrameAvailable() above to avoid deadlocks.
-      surfaceTextureHelper.stopListening();
-      synchronized (newFrameLock) {
-        if (renderedBuffer != null) {
-          surfaceTextureHelper.returnTextureFrame();
-          renderedBuffer = null;
-        }
-      }
-    }
-  }
-
-  // Returns null if no decoded buffer is available, and otherwise a DecodedByteBuffer.
-  // Throws IllegalStateException if call is made on the wrong thread, if color format changes to an
-  // unsupported format, or if |mediaCodec| is not in the Executing state. Throws CodecException
-  // upon codec error.
-  private DecodedOutputBuffer dequeueOutputBuffer(int dequeueTimeoutMs) {
-    checkOnMediaCodecThread();
-    if (decodeStartTimeMs.isEmpty()) {
-      return null;
-    }
-    // Drain the decoder until receiving a decoded buffer or hitting
-    // MediaCodec.INFO_TRY_AGAIN_LATER.
-    final MediaCodec.BufferInfo info = new MediaCodec.BufferInfo();
-    while (true) {
-      final int result =
-          mediaCodec.dequeueOutputBuffer(info, TimeUnit.MILLISECONDS.toMicros(dequeueTimeoutMs));
-      switch (result) {
-        case MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED:
-          outputBuffers = mediaCodec.getOutputBuffers();
-          Logging.d(TAG, "Decoder output buffers changed: " + outputBuffers.length);
-          if (hasDecodedFirstFrame) {
-            throw new RuntimeException("Unexpected output buffer change event.");
-          }
-          break;
-        case MediaCodec.INFO_OUTPUT_FORMAT_CHANGED:
-          MediaFormat format = mediaCodec.getOutputFormat();
-          Logging.d(TAG, "Decoder format changed: " + format.toString());
-          final int newWidth;
-          final int newHeight;
-          if (format.containsKey(FORMAT_KEY_CROP_LEFT) && format.containsKey(FORMAT_KEY_CROP_RIGHT)
-              && format.containsKey(FORMAT_KEY_CROP_BOTTOM)
-              && format.containsKey(FORMAT_KEY_CROP_TOP)) {
-            newWidth = 1 + format.getInteger(FORMAT_KEY_CROP_RIGHT)
-                - format.getInteger(FORMAT_KEY_CROP_LEFT);
-            newHeight = 1 + format.getInteger(FORMAT_KEY_CROP_BOTTOM)
-                - format.getInteger(FORMAT_KEY_CROP_TOP);
-          } else {
-            newWidth = format.getInteger(MediaFormat.KEY_WIDTH);
-            newHeight = format.getInteger(MediaFormat.KEY_HEIGHT);
-          }
-          if (hasDecodedFirstFrame && (newWidth != width || newHeight != height)) {
-            throw new RuntimeException("Unexpected size change. Configured " + width + "*" + height
-                + ". New " + newWidth + "*" + newHeight);
-          }
-          width = newWidth;
-          height = newHeight;
-
-          if (!useSurface && format.containsKey(MediaFormat.KEY_COLOR_FORMAT)) {
-            colorFormat = format.getInteger(MediaFormat.KEY_COLOR_FORMAT);
-            Logging.d(TAG, "Color: 0x" + Integer.toHexString(colorFormat));
-            if (!supportedColorList.contains(colorFormat)) {
-              throw new IllegalStateException("Non supported color format: " + colorFormat);
-            }
-          }
-          if (format.containsKey(FORMAT_KEY_STRIDE)) {
-            stride = format.getInteger(FORMAT_KEY_STRIDE);
-          }
-          if (format.containsKey(FORMAT_KEY_SLICE_HEIGHT)) {
-            sliceHeight = format.getInteger(FORMAT_KEY_SLICE_HEIGHT);
-          }
-          Logging.d(TAG, "Frame stride and slice height: " + stride + " x " + sliceHeight);
-          stride = Math.max(width, stride);
-          sliceHeight = Math.max(height, sliceHeight);
-          break;
-        case MediaCodec.INFO_TRY_AGAIN_LATER:
-          return null;
-        default:
-          hasDecodedFirstFrame = true;
-          TimeStamps timeStamps = decodeStartTimeMs.remove();
-          long decodeTimeMs = SystemClock.elapsedRealtime() - timeStamps.decodeStartTimeMs;
-          if (decodeTimeMs > MAX_DECODE_TIME_MS) {
-            Logging.e(TAG, "Very high decode time: " + decodeTimeMs + "ms"
-                    + ". Q size: " + decodeStartTimeMs.size()
-                    + ". Might be caused by resuming H264 decoding after a pause.");
-            decodeTimeMs = MAX_DECODE_TIME_MS;
-          }
-          return new DecodedOutputBuffer(result, info.offset, info.size,
-              TimeUnit.MICROSECONDS.toMillis(info.presentationTimeUs), timeStamps.timeStampMs,
-              timeStamps.ntpTimeStampMs, decodeTimeMs, SystemClock.elapsedRealtime());
-      }
-    }
-  }
-
-  // Returns null if no decoded buffer is available, and otherwise a DecodedTextureBuffer.
-  // Throws IllegalStateException if call is made on the wrong thread, if color format changes to an
-  // unsupported format, or if |mediaCodec| is not in the Executing state. Throws CodecException
-  // upon codec error. If |dequeueTimeoutMs| > 0, the oldest decoded frame will be dropped if
-  // a frame can't be returned.
-  private DecodedTextureBuffer dequeueTextureBuffer(int dequeueTimeoutMs) {
-    checkOnMediaCodecThread();
-    if (!useSurface) {
-      throw new IllegalStateException("dequeueTexture() called for byte buffer decoding.");
-    }
-    DecodedOutputBuffer outputBuffer = dequeueOutputBuffer(dequeueTimeoutMs);
-    if (outputBuffer != null) {
-      dequeuedSurfaceOutputBuffers.add(outputBuffer);
-    }
-
-    MaybeRenderDecodedTextureBuffer();
-    // Check if there is texture ready now by waiting max |dequeueTimeoutMs|.
-    DecodedTextureBuffer renderedBuffer = textureListener.dequeueTextureBuffer(dequeueTimeoutMs);
-    if (renderedBuffer != null) {
-      MaybeRenderDecodedTextureBuffer();
-      return renderedBuffer;
-    }
-
-    if ((dequeuedSurfaceOutputBuffers.size()
-                >= Math.min(MAX_QUEUED_OUTPUTBUFFERS, outputBuffers.length)
-            || (dequeueTimeoutMs > 0 && !dequeuedSurfaceOutputBuffers.isEmpty()))) {
-      ++droppedFrames;
-      // Drop the oldest frame still in dequeuedSurfaceOutputBuffers.
-      // The oldest frame is owned by |textureListener| and can't be dropped since
-      // mediaCodec.releaseOutputBuffer has already been called.
-      final DecodedOutputBuffer droppedFrame = dequeuedSurfaceOutputBuffers.remove();
-      if (dequeueTimeoutMs > 0) {
-        // TODO(perkj): Re-add the below log when VideoRenderGUI has been removed or fixed to
-        // return the one and only texture even if it does not render.
-        Logging.w(TAG, "Draining decoder. Dropping frame with TS: "
-                + droppedFrame.presentationTimeStampMs + ". Total number of dropped frames: "
-                + droppedFrames);
-      } else {
-        Logging.w(TAG, "Too many output buffers " + dequeuedSurfaceOutputBuffers.size()
-                + ". Dropping frame with TS: " + droppedFrame.presentationTimeStampMs
-                + ". Total number of dropped frames: " + droppedFrames);
-      }
-
-      mediaCodec.releaseOutputBuffer(droppedFrame.index, false /* render */);
-      return new DecodedTextureBuffer(0, null, droppedFrame.presentationTimeStampMs,
-          droppedFrame.timeStampMs, droppedFrame.ntpTimeStampMs, droppedFrame.decodeTimeMs,
-          SystemClock.elapsedRealtime() - droppedFrame.endDecodeTimeMs);
-    }
-    return null;
-  }
-
-  private void MaybeRenderDecodedTextureBuffer() {
-    if (dequeuedSurfaceOutputBuffers.isEmpty() || textureListener.isWaitingForTexture()) {
-      return;
-    }
-    // Get the first frame in the queue and render to the decoder output surface.
-    final DecodedOutputBuffer buffer = dequeuedSurfaceOutputBuffers.remove();
-    textureListener.addBufferToRender(buffer);
-    mediaCodec.releaseOutputBuffer(buffer.index, true /* render */);
-  }
-
-  // Release a dequeued output byte buffer back to the codec for re-use. Should only be called for
-  // non-surface decoding.
-  // Throws IllegalStateException if the call is made on the wrong thread, if codec is configured
-  // for surface decoding, or if |mediaCodec| is not in the Executing state. Throws
-  // MediaCodec.CodecException upon codec error.
-  private void returnDecodedOutputBuffer(int index)
-      throws IllegalStateException, MediaCodec.CodecException {
-    checkOnMediaCodecThread();
-    if (useSurface) {
-      throw new IllegalStateException("returnDecodedOutputBuffer() called for surface decoding.");
-    }
-    mediaCodec.releaseOutputBuffer(index, false /* render */);
-  }
-}
diff --git a/sdk/android/api/org/webrtc/MediaCodecVideoEncoder.java b/sdk/android/api/org/webrtc/MediaCodecVideoEncoder.java
deleted file mode 100644
index 227c5a4..0000000
--- a/sdk/android/api/org/webrtc/MediaCodecVideoEncoder.java
+++ /dev/null
@@ -1,927 +0,0 @@
-/*
- *  Copyright 2013 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.
- */
-
-package org.webrtc;
-
-import android.annotation.TargetApi;
-import android.graphics.Matrix;
-import android.media.MediaCodec;
-import android.media.MediaCodecInfo;
-import android.media.MediaCodecInfo.CodecCapabilities;
-import android.media.MediaCodecList;
-import android.media.MediaFormat;
-import android.opengl.GLES20;
-import android.os.Build;
-import android.os.Bundle;
-import android.view.Surface;
-import java.nio.ByteBuffer;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
-
-// Java-side of peerconnection_jni.cc:MediaCodecVideoEncoder.
-// This class is an implementation detail of the Java PeerConnection API.
-@TargetApi(19)
-@SuppressWarnings("deprecation")
-public class MediaCodecVideoEncoder {
-  // This class is constructed, operated, and destroyed by its C++ incarnation,
-  // so the class and its methods have non-public visibility.  The API this
-  // class exposes aims to mimic the webrtc::VideoEncoder API as closely as
-  // possibly to minimize the amount of translation work necessary.
-
-  private static final String TAG = "MediaCodecVideoEncoder";
-
-  // Tracks webrtc::VideoCodecType.
-  public enum VideoCodecType { VIDEO_CODEC_VP8, VIDEO_CODEC_VP9, VIDEO_CODEC_H264 }
-
-  private static final int MEDIA_CODEC_RELEASE_TIMEOUT_MS = 5000; // Timeout for codec releasing.
-  private static final int DEQUEUE_TIMEOUT = 0; // Non-blocking, no wait.
-  private static final int BITRATE_ADJUSTMENT_FPS = 30;
-  private static final int MAXIMUM_INITIAL_FPS = 30;
-  private static final double BITRATE_CORRECTION_SEC = 3.0;
-  // Maximum bitrate correction scale - no more than 4 times.
-  private static final double BITRATE_CORRECTION_MAX_SCALE = 4;
-  // Amount of correction steps to reach correction maximum scale.
-  private static final int BITRATE_CORRECTION_STEPS = 20;
-  // Forced key frame interval - used to reduce color distortions on Qualcomm platform.
-  private static final long QCOM_VP8_KEY_FRAME_INTERVAL_ANDROID_L_MS = 15000;
-  private static final long QCOM_VP8_KEY_FRAME_INTERVAL_ANDROID_M_MS = 20000;
-  private static final long QCOM_VP8_KEY_FRAME_INTERVAL_ANDROID_N_MS = 15000;
-
-  // Active running encoder instance. Set in initEncode() (called from native code)
-  // and reset to null in release() call.
-  private static MediaCodecVideoEncoder runningInstance = null;
-  private static MediaCodecVideoEncoderErrorCallback errorCallback = null;
-  private static int codecErrors = 0;
-  // List of disabled codec types - can be set from application.
-  private static Set<String> hwEncoderDisabledTypes = new HashSet<String>();
-
-  private Thread mediaCodecThread;
-  private MediaCodec mediaCodec;
-  private ByteBuffer[] outputBuffers;
-  private EglBase14 eglBase;
-  private int profile;
-  private int width;
-  private int height;
-  private Surface inputSurface;
-  private GlRectDrawer drawer;
-
-  private static final String VP8_MIME_TYPE = "video/x-vnd.on2.vp8";
-  private static final String VP9_MIME_TYPE = "video/x-vnd.on2.vp9";
-  private static final String H264_MIME_TYPE = "video/avc";
-
-  private static final int VIDEO_AVCProfileHigh = 8;
-  private static final int VIDEO_AVCLevel3 = 0x100;
-
-  // Type of bitrate adjustment for video encoder.
-  public enum BitrateAdjustmentType {
-    // No adjustment - video encoder has no known bitrate problem.
-    NO_ADJUSTMENT,
-    // Framerate based bitrate adjustment is required - HW encoder does not use frame
-    // timestamps to calculate frame bitrate budget and instead is relying on initial
-    // fps configuration assuming that all frames are coming at fixed initial frame rate.
-    FRAMERATE_ADJUSTMENT,
-    // Dynamic bitrate adjustment is required - HW encoder used frame timestamps, but actual
-    // bitrate deviates too much from the target value.
-    DYNAMIC_ADJUSTMENT
-  }
-
-  // Should be in sync with webrtc::H264::Profile.
-  public static enum H264Profile {
-    CONSTRAINED_BASELINE(0),
-    BASELINE(1),
-    MAIN(2),
-    CONSTRAINED_HIGH(3),
-    HIGH(4);
-
-    private final int value;
-
-    H264Profile(int value) {
-      this.value = value;
-    }
-
-    public int getValue() {
-      return value;
-    }
-  }
-
-  // Class describing supported media codec properties.
-  private static class MediaCodecProperties {
-    public final String codecPrefix;
-    // Minimum Android SDK required for this codec to be used.
-    public final int minSdk;
-    // Flag if encoder implementation does not use frame timestamps to calculate frame bitrate
-    // budget and instead is relying on initial fps configuration assuming that all frames are
-    // coming at fixed initial frame rate. Bitrate adjustment is required for this case.
-    public final BitrateAdjustmentType bitrateAdjustmentType;
-
-    MediaCodecProperties(
-        String codecPrefix, int minSdk, BitrateAdjustmentType bitrateAdjustmentType) {
-      this.codecPrefix = codecPrefix;
-      this.minSdk = minSdk;
-      this.bitrateAdjustmentType = bitrateAdjustmentType;
-    }
-  }
-
-  // List of supported HW VP8 encoders.
-  private static final MediaCodecProperties qcomVp8HwProperties = new MediaCodecProperties(
-      "OMX.qcom.", Build.VERSION_CODES.KITKAT, BitrateAdjustmentType.NO_ADJUSTMENT);
-  private static final MediaCodecProperties exynosVp8HwProperties = new MediaCodecProperties(
-      "OMX.Exynos.", Build.VERSION_CODES.M, BitrateAdjustmentType.DYNAMIC_ADJUSTMENT);
-  private static final MediaCodecProperties intelVp8HwProperties = new MediaCodecProperties(
-      "OMX.Intel.", Build.VERSION_CODES.LOLLIPOP, BitrateAdjustmentType.NO_ADJUSTMENT);
-  private static MediaCodecProperties[] vp8HwList() {
-    final ArrayList<MediaCodecProperties> supported_codecs = new ArrayList<MediaCodecProperties>();
-    supported_codecs.add(qcomVp8HwProperties);
-    supported_codecs.add(exynosVp8HwProperties);
-    if (PeerConnectionFactory.fieldTrialsFindFullName("WebRTC-IntelVP8").equals("Enabled")) {
-      supported_codecs.add(intelVp8HwProperties);
-    }
-    return supported_codecs.toArray(new MediaCodecProperties[supported_codecs.size()]);
-  }
-
-  // List of supported HW VP9 encoders.
-  private static final MediaCodecProperties qcomVp9HwProperties = new MediaCodecProperties(
-      "OMX.qcom.", Build.VERSION_CODES.N, BitrateAdjustmentType.NO_ADJUSTMENT);
-  private static final MediaCodecProperties exynosVp9HwProperties = new MediaCodecProperties(
-      "OMX.Exynos.", Build.VERSION_CODES.N, BitrateAdjustmentType.FRAMERATE_ADJUSTMENT);
-  private static final MediaCodecProperties[] vp9HwList =
-      new MediaCodecProperties[] {qcomVp9HwProperties, exynosVp9HwProperties};
-
-  // List of supported HW H.264 encoders.
-  private static final MediaCodecProperties qcomH264HwProperties = new MediaCodecProperties(
-      "OMX.qcom.", Build.VERSION_CODES.KITKAT, BitrateAdjustmentType.NO_ADJUSTMENT);
-  private static final MediaCodecProperties exynosH264HwProperties = new MediaCodecProperties(
-      "OMX.Exynos.", Build.VERSION_CODES.LOLLIPOP, BitrateAdjustmentType.FRAMERATE_ADJUSTMENT);
-  private static final MediaCodecProperties[] h264HwList =
-      new MediaCodecProperties[] {qcomH264HwProperties, exynosH264HwProperties};
-
-  // List of supported HW H.264 high profile encoders.
-  private static final MediaCodecProperties exynosH264HighProfileHwProperties =
-      new MediaCodecProperties(
-          "OMX.Exynos.", Build.VERSION_CODES.M, BitrateAdjustmentType.FRAMERATE_ADJUSTMENT);
-  private static final MediaCodecProperties[] h264HighProfileHwList =
-      new MediaCodecProperties[] {exynosH264HighProfileHwProperties};
-
-  // List of devices with poor H.264 encoder quality.
-  // HW H.264 encoder on below devices has poor bitrate control - actual
-  // bitrates deviates a lot from the target value.
-  private static final String[] H264_HW_EXCEPTION_MODELS =
-      new String[] {"SAMSUNG-SGH-I337", "Nexus 7", "Nexus 4"};
-
-  // Bitrate modes - should be in sync with OMX_VIDEO_CONTROLRATETYPE defined
-  // in OMX_Video.h
-  private static final int VIDEO_ControlRateConstant = 2;
-  // NV12 color format supported by QCOM codec, but not declared in MediaCodec -
-  // see /hardware/qcom/media/mm-core/inc/OMX_QCOMExtns.h
-  private static final int COLOR_QCOM_FORMATYUV420PackedSemiPlanar32m = 0x7FA30C04;
-  // Allowable color formats supported by codec - in order of preference.
-  private static final int[] supportedColorList = {CodecCapabilities.COLOR_FormatYUV420Planar,
-      CodecCapabilities.COLOR_FormatYUV420SemiPlanar,
-      CodecCapabilities.COLOR_QCOM_FormatYUV420SemiPlanar,
-      COLOR_QCOM_FORMATYUV420PackedSemiPlanar32m};
-  private static final int[] supportedSurfaceColorList = {CodecCapabilities.COLOR_FormatSurface};
-  private VideoCodecType type;
-  private int colorFormat; // Used by native code.
-
-  // Variables used for dynamic bitrate adjustment.
-  private BitrateAdjustmentType bitrateAdjustmentType = BitrateAdjustmentType.NO_ADJUSTMENT;
-  private double bitrateAccumulator;
-  private double bitrateAccumulatorMax;
-  private double bitrateObservationTimeMs;
-  private int bitrateAdjustmentScaleExp;
-  private int targetBitrateBps;
-  private int targetFps;
-
-  // Interval in ms to force key frame generation. Used to reduce the time of color distortions
-  // happened sometime when using Qualcomm video encoder.
-  private long forcedKeyFrameMs;
-  private long lastKeyFrameMs;
-
-  // SPS and PPS NALs (Config frame) for H.264.
-  private ByteBuffer configData = null;
-
-  // MediaCodec error handler - invoked when critical error happens which may prevent
-  // further use of media codec API. Now it means that one of media codec instances
-  // is hanging and can no longer be used in the next call.
-  public static interface MediaCodecVideoEncoderErrorCallback {
-    void onMediaCodecVideoEncoderCriticalError(int codecErrors);
-  }
-
-  public static void setErrorCallback(MediaCodecVideoEncoderErrorCallback errorCallback) {
-    Logging.d(TAG, "Set error callback");
-    MediaCodecVideoEncoder.errorCallback = errorCallback;
-  }
-
-  // Functions to disable HW encoding - can be called from applications for platforms
-  // which have known HW decoding problems.
-  public static void disableVp8HwCodec() {
-    Logging.w(TAG, "VP8 encoding is disabled by application.");
-    hwEncoderDisabledTypes.add(VP8_MIME_TYPE);
-  }
-
-  public static void disableVp9HwCodec() {
-    Logging.w(TAG, "VP9 encoding is disabled by application.");
-    hwEncoderDisabledTypes.add(VP9_MIME_TYPE);
-  }
-
-  public static void disableH264HwCodec() {
-    Logging.w(TAG, "H.264 encoding is disabled by application.");
-    hwEncoderDisabledTypes.add(H264_MIME_TYPE);
-  }
-
-  // Functions to query if HW encoding is supported.
-  public static boolean isVp8HwSupported() {
-    return !hwEncoderDisabledTypes.contains(VP8_MIME_TYPE)
-        && (findHwEncoder(VP8_MIME_TYPE, vp8HwList(), supportedColorList) != null);
-  }
-
-  public static EncoderProperties vp8HwEncoderProperties() {
-    if (hwEncoderDisabledTypes.contains(VP8_MIME_TYPE)) {
-      return null;
-    } else {
-      return findHwEncoder(VP8_MIME_TYPE, vp8HwList(), supportedColorList);
-    }
-  }
-
-  public static boolean isVp9HwSupported() {
-    return !hwEncoderDisabledTypes.contains(VP9_MIME_TYPE)
-        && (findHwEncoder(VP9_MIME_TYPE, vp9HwList, supportedColorList) != null);
-  }
-
-  public static boolean isH264HwSupported() {
-    return !hwEncoderDisabledTypes.contains(H264_MIME_TYPE)
-        && (findHwEncoder(H264_MIME_TYPE, h264HwList, supportedColorList) != null);
-  }
-
-  public static boolean isH264HighProfileHwSupported() {
-    return !hwEncoderDisabledTypes.contains(H264_MIME_TYPE)
-        && (findHwEncoder(H264_MIME_TYPE, h264HighProfileHwList, supportedColorList) != null);
-  }
-
-  public static boolean isVp8HwSupportedUsingTextures() {
-    return !hwEncoderDisabledTypes.contains(VP8_MIME_TYPE)
-        && (findHwEncoder(VP8_MIME_TYPE, vp8HwList(), supportedSurfaceColorList) != null);
-  }
-
-  public static boolean isVp9HwSupportedUsingTextures() {
-    return !hwEncoderDisabledTypes.contains(VP9_MIME_TYPE)
-        && (findHwEncoder(VP9_MIME_TYPE, vp9HwList, supportedSurfaceColorList) != null);
-  }
-
-  public static boolean isH264HwSupportedUsingTextures() {
-    return !hwEncoderDisabledTypes.contains(H264_MIME_TYPE)
-        && (findHwEncoder(H264_MIME_TYPE, h264HwList, supportedSurfaceColorList) != null);
-  }
-
-  // Helper struct for findHwEncoder() below.
-  public static class EncoderProperties {
-    public EncoderProperties(
-        String codecName, int colorFormat, BitrateAdjustmentType bitrateAdjustmentType) {
-      this.codecName = codecName;
-      this.colorFormat = colorFormat;
-      this.bitrateAdjustmentType = bitrateAdjustmentType;
-    }
-    public final String codecName; // OpenMax component name for HW codec.
-    public final int colorFormat; // Color format supported by codec.
-    public final BitrateAdjustmentType bitrateAdjustmentType; // Bitrate adjustment type
-  }
-
-  private static EncoderProperties findHwEncoder(
-      String mime, MediaCodecProperties[] supportedHwCodecProperties, int[] colorList) {
-    // MediaCodec.setParameters is missing for JB and below, so bitrate
-    // can not be adjusted dynamically.
-    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
-      return null;
-    }
-
-    // Check if device is in H.264 exception list.
-    if (mime.equals(H264_MIME_TYPE)) {
-      List<String> exceptionModels = Arrays.asList(H264_HW_EXCEPTION_MODELS);
-      if (exceptionModels.contains(Build.MODEL)) {
-        Logging.w(TAG, "Model: " + Build.MODEL + " has black listed H.264 encoder.");
-        return null;
-      }
-    }
-
-    for (int i = 0; i < MediaCodecList.getCodecCount(); ++i) {
-      MediaCodecInfo info = null;
-      try {
-        info = MediaCodecList.getCodecInfoAt(i);
-      } catch (IllegalArgumentException e) {
-        Logging.e(TAG, "Cannot retrieve encoder codec info", e);
-      }
-      if (info == null || !info.isEncoder()) {
-        continue;
-      }
-      String name = null;
-      for (String mimeType : info.getSupportedTypes()) {
-        if (mimeType.equals(mime)) {
-          name = info.getName();
-          break;
-        }
-      }
-      if (name == null) {
-        continue; // No HW support in this codec; try the next one.
-      }
-      Logging.v(TAG, "Found candidate encoder " + name);
-
-      // Check if this is supported HW encoder.
-      boolean supportedCodec = false;
-      BitrateAdjustmentType bitrateAdjustmentType = BitrateAdjustmentType.NO_ADJUSTMENT;
-      for (MediaCodecProperties codecProperties : supportedHwCodecProperties) {
-        if (name.startsWith(codecProperties.codecPrefix)) {
-          if (Build.VERSION.SDK_INT < codecProperties.minSdk) {
-            Logging.w(
-                TAG, "Codec " + name + " is disabled due to SDK version " + Build.VERSION.SDK_INT);
-            continue;
-          }
-          if (codecProperties.bitrateAdjustmentType != BitrateAdjustmentType.NO_ADJUSTMENT) {
-            bitrateAdjustmentType = codecProperties.bitrateAdjustmentType;
-            Logging.w(
-                TAG, "Codec " + name + " requires bitrate adjustment: " + bitrateAdjustmentType);
-          }
-          supportedCodec = true;
-          break;
-        }
-      }
-      if (!supportedCodec) {
-        continue;
-      }
-
-      // Check if HW codec supports known color format.
-      CodecCapabilities capabilities;
-      try {
-        capabilities = info.getCapabilitiesForType(mime);
-      } catch (IllegalArgumentException e) {
-        Logging.e(TAG, "Cannot retrieve encoder capabilities", e);
-        continue;
-      }
-      for (int colorFormat : capabilities.colorFormats) {
-        Logging.v(TAG, "   Color: 0x" + Integer.toHexString(colorFormat));
-      }
-
-      for (int supportedColorFormat : colorList) {
-        for (int codecColorFormat : capabilities.colorFormats) {
-          if (codecColorFormat == supportedColorFormat) {
-            // Found supported HW encoder.
-            Logging.d(TAG, "Found target encoder for mime " + mime + " : " + name + ". Color: 0x"
-                    + Integer.toHexString(codecColorFormat) + ". Bitrate adjustment: "
-                    + bitrateAdjustmentType);
-            return new EncoderProperties(name, codecColorFormat, bitrateAdjustmentType);
-          }
-        }
-      }
-    }
-    return null; // No HW encoder.
-  }
-
-  private void checkOnMediaCodecThread() {
-    if (mediaCodecThread.getId() != Thread.currentThread().getId()) {
-      throw new RuntimeException("MediaCodecVideoEncoder previously operated on " + mediaCodecThread
-          + " but is now called on " + Thread.currentThread());
-    }
-  }
-
-  public static void printStackTrace() {
-    if (runningInstance != null && runningInstance.mediaCodecThread != null) {
-      StackTraceElement[] mediaCodecStackTraces = runningInstance.mediaCodecThread.getStackTrace();
-      if (mediaCodecStackTraces.length > 0) {
-        Logging.d(TAG, "MediaCodecVideoEncoder stacks trace:");
-        for (StackTraceElement stackTrace : mediaCodecStackTraces) {
-          Logging.d(TAG, stackTrace.toString());
-        }
-      }
-    }
-  }
-
-  static MediaCodec createByCodecName(String codecName) {
-    try {
-      // In the L-SDK this call can throw IOException so in order to work in
-      // both cases catch an exception.
-      return MediaCodec.createByCodecName(codecName);
-    } catch (Exception e) {
-      return null;
-    }
-  }
-
-  boolean initEncode(VideoCodecType type, int profile, int width, int height, int kbps, int fps,
-      EglBase14.Context sharedContext) {
-    final boolean useSurface = sharedContext != null;
-    Logging.d(TAG,
-        "Java initEncode: " + type + ". Profile: " + profile + " : " + width + " x " + height
-            + ". @ " + kbps + " kbps. Fps: " + fps + ". Encode from texture : " + useSurface);
-
-    this.profile = profile;
-    this.width = width;
-    this.height = height;
-    if (mediaCodecThread != null) {
-      throw new RuntimeException("Forgot to release()?");
-    }
-    EncoderProperties properties = null;
-    String mime = null;
-    int keyFrameIntervalSec = 0;
-    boolean configureH264HighProfile = false;
-    if (type == VideoCodecType.VIDEO_CODEC_VP8) {
-      mime = VP8_MIME_TYPE;
-      properties = findHwEncoder(
-          VP8_MIME_TYPE, vp8HwList(), useSurface ? supportedSurfaceColorList : supportedColorList);
-      keyFrameIntervalSec = 100;
-    } else if (type == VideoCodecType.VIDEO_CODEC_VP9) {
-      mime = VP9_MIME_TYPE;
-      properties = findHwEncoder(
-          VP9_MIME_TYPE, vp9HwList, useSurface ? supportedSurfaceColorList : supportedColorList);
-      keyFrameIntervalSec = 100;
-    } else if (type == VideoCodecType.VIDEO_CODEC_H264) {
-      mime = H264_MIME_TYPE;
-      properties = findHwEncoder(
-          H264_MIME_TYPE, h264HwList, useSurface ? supportedSurfaceColorList : supportedColorList);
-      if (profile == H264Profile.CONSTRAINED_HIGH.getValue()) {
-        EncoderProperties h264HighProfileProperties = findHwEncoder(H264_MIME_TYPE,
-            h264HighProfileHwList, useSurface ? supportedSurfaceColorList : supportedColorList);
-        if (h264HighProfileProperties != null) {
-          Logging.d(TAG, "High profile H.264 encoder supported.");
-          configureH264HighProfile = true;
-        } else {
-          Logging.d(TAG, "High profile H.264 encoder requested, but not supported. Use baseline.");
-        }
-      }
-      keyFrameIntervalSec = 20;
-    }
-    if (properties == null) {
-      throw new RuntimeException("Can not find HW encoder for " + type);
-    }
-    runningInstance = this; // Encoder is now running and can be queried for stack traces.
-    colorFormat = properties.colorFormat;
-    bitrateAdjustmentType = properties.bitrateAdjustmentType;
-    if (bitrateAdjustmentType == BitrateAdjustmentType.FRAMERATE_ADJUSTMENT) {
-      fps = BITRATE_ADJUSTMENT_FPS;
-    } else {
-      fps = Math.min(fps, MAXIMUM_INITIAL_FPS);
-    }
-
-    forcedKeyFrameMs = 0;
-    lastKeyFrameMs = -1;
-    if (type == VideoCodecType.VIDEO_CODEC_VP8
-        && properties.codecName.startsWith(qcomVp8HwProperties.codecPrefix)) {
-      if (Build.VERSION.SDK_INT == Build.VERSION_CODES.LOLLIPOP
-          || Build.VERSION.SDK_INT == Build.VERSION_CODES.LOLLIPOP_MR1) {
-        forcedKeyFrameMs = QCOM_VP8_KEY_FRAME_INTERVAL_ANDROID_L_MS;
-      } else if (Build.VERSION.SDK_INT == Build.VERSION_CODES.M) {
-        forcedKeyFrameMs = QCOM_VP8_KEY_FRAME_INTERVAL_ANDROID_M_MS;
-      } else if (Build.VERSION.SDK_INT > Build.VERSION_CODES.M) {
-        forcedKeyFrameMs = QCOM_VP8_KEY_FRAME_INTERVAL_ANDROID_N_MS;
-      }
-    }
-
-    Logging.d(TAG, "Color format: " + colorFormat + ". Bitrate adjustment: " + bitrateAdjustmentType
-            + ". Key frame interval: " + forcedKeyFrameMs + " . Initial fps: " + fps);
-    targetBitrateBps = 1000 * kbps;
-    targetFps = fps;
-    bitrateAccumulatorMax = targetBitrateBps / 8.0;
-    bitrateAccumulator = 0;
-    bitrateObservationTimeMs = 0;
-    bitrateAdjustmentScaleExp = 0;
-
-    mediaCodecThread = Thread.currentThread();
-    try {
-      MediaFormat format = MediaFormat.createVideoFormat(mime, width, height);
-      format.setInteger(MediaFormat.KEY_BIT_RATE, targetBitrateBps);
-      format.setInteger("bitrate-mode", VIDEO_ControlRateConstant);
-      format.setInteger(MediaFormat.KEY_COLOR_FORMAT, properties.colorFormat);
-      format.setInteger(MediaFormat.KEY_FRAME_RATE, targetFps);
-      format.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, keyFrameIntervalSec);
-      if (configureH264HighProfile) {
-        format.setInteger("profile", VIDEO_AVCProfileHigh);
-        format.setInteger("level", VIDEO_AVCLevel3);
-      }
-      Logging.d(TAG, "  Format: " + format);
-      mediaCodec = createByCodecName(properties.codecName);
-      this.type = type;
-      if (mediaCodec == null) {
-        Logging.e(TAG, "Can not create media encoder");
-        release();
-        return false;
-      }
-      mediaCodec.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
-
-      if (useSurface) {
-        eglBase = new EglBase14(sharedContext, EglBase.CONFIG_RECORDABLE);
-        // Create an input surface and keep a reference since we must release the surface when done.
-        inputSurface = mediaCodec.createInputSurface();
-        eglBase.createSurface(inputSurface);
-        drawer = new GlRectDrawer();
-      }
-      mediaCodec.start();
-      outputBuffers = mediaCodec.getOutputBuffers();
-      Logging.d(TAG, "Output buffers: " + outputBuffers.length);
-
-    } catch (IllegalStateException e) {
-      Logging.e(TAG, "initEncode failed", e);
-      release();
-      return false;
-    }
-    return true;
-  }
-
-  ByteBuffer[] getInputBuffers() {
-    ByteBuffer[] inputBuffers = mediaCodec.getInputBuffers();
-    Logging.d(TAG, "Input buffers: " + inputBuffers.length);
-    return inputBuffers;
-  }
-
-  void checkKeyFrameRequired(boolean requestedKeyFrame, long presentationTimestampUs) {
-    long presentationTimestampMs = (presentationTimestampUs + 500) / 1000;
-    if (lastKeyFrameMs < 0) {
-      lastKeyFrameMs = presentationTimestampMs;
-    }
-    boolean forcedKeyFrame = false;
-    if (!requestedKeyFrame && forcedKeyFrameMs > 0
-        && presentationTimestampMs > lastKeyFrameMs + forcedKeyFrameMs) {
-      forcedKeyFrame = true;
-    }
-    if (requestedKeyFrame || forcedKeyFrame) {
-      // Ideally MediaCodec would honor BUFFER_FLAG_SYNC_FRAME so we could
-      // indicate this in queueInputBuffer() below and guarantee _this_ frame
-      // be encoded as a key frame, but sadly that flag is ignored.  Instead,
-      // we request a key frame "soon".
-      if (requestedKeyFrame) {
-        Logging.d(TAG, "Sync frame request");
-      } else {
-        Logging.d(TAG, "Sync frame forced");
-      }
-      Bundle b = new Bundle();
-      b.putInt(MediaCodec.PARAMETER_KEY_REQUEST_SYNC_FRAME, 0);
-      mediaCodec.setParameters(b);
-      lastKeyFrameMs = presentationTimestampMs;
-    }
-  }
-
-  boolean encodeBuffer(
-      boolean isKeyframe, int inputBuffer, int size, long presentationTimestampUs) {
-    checkOnMediaCodecThread();
-    try {
-      checkKeyFrameRequired(isKeyframe, presentationTimestampUs);
-      mediaCodec.queueInputBuffer(inputBuffer, 0, size, presentationTimestampUs, 0);
-      return true;
-    } catch (IllegalStateException e) {
-      Logging.e(TAG, "encodeBuffer failed", e);
-      return false;
-    }
-  }
-
-  boolean encodeTexture(boolean isKeyframe, int oesTextureId, float[] transformationMatrix,
-      long presentationTimestampUs) {
-    checkOnMediaCodecThread();
-    try {
-      checkKeyFrameRequired(isKeyframe, presentationTimestampUs);
-      eglBase.makeCurrent();
-      // TODO(perkj): glClear() shouldn't be necessary since every pixel is covered anyway,
-      // but it's a workaround for bug webrtc:5147.
-      GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
-      drawer.drawOes(oesTextureId, transformationMatrix, width, height, 0, 0, width, height);
-      eglBase.swapBuffers(TimeUnit.MICROSECONDS.toNanos(presentationTimestampUs));
-      return true;
-    } catch (RuntimeException e) {
-      Logging.e(TAG, "encodeTexture failed", e);
-      return false;
-    }
-  }
-
-  /**
-   * Encodes a new style VideoFrame. Called by JNI. |bufferIndex| is -1 if we are not encoding in
-   * surface mode.
-   */
-  boolean encodeFrame(long nativeEncoder, boolean isKeyframe, VideoFrame frame, int bufferIndex) {
-    checkOnMediaCodecThread();
-    try {
-      long presentationTimestampUs = TimeUnit.NANOSECONDS.toMicros(frame.getTimestampNs());
-      checkKeyFrameRequired(isKeyframe, presentationTimestampUs);
-
-      VideoFrame.Buffer buffer = frame.getBuffer();
-      if (buffer instanceof VideoFrame.TextureBuffer) {
-        VideoFrame.TextureBuffer textureBuffer = (VideoFrame.TextureBuffer) buffer;
-        eglBase.makeCurrent();
-        // TODO(perkj): glClear() shouldn't be necessary since every pixel is covered anyway,
-        // but it's a workaround for bug webrtc:5147.
-        GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
-        VideoFrameDrawer.drawTexture(drawer, textureBuffer, new Matrix() /* renderMatrix */, width,
-            height, 0 /* viewportX */, 0 /* viewportY */, width, height);
-        eglBase.swapBuffers(frame.getTimestampNs());
-      } else {
-        VideoFrame.I420Buffer i420Buffer = buffer.toI420();
-        nativeFillBuffer(nativeEncoder, bufferIndex, i420Buffer.getDataY(), i420Buffer.getStrideY(),
-            i420Buffer.getDataU(), i420Buffer.getStrideU(), i420Buffer.getDataV(),
-            i420Buffer.getStrideV());
-        i420Buffer.release();
-        // I420 consists of one full-resolution and two half-resolution planes.
-        // 1 + 1 / 4 + 1 / 4 = 3 / 2
-        int yuvSize = width * height * 3 / 2;
-        mediaCodec.queueInputBuffer(bufferIndex, 0, yuvSize, presentationTimestampUs, 0);
-      }
-      return true;
-    } catch (RuntimeException e) {
-      Logging.e(TAG, "encodeFrame failed", e);
-      return false;
-    }
-  }
-
-  void release() {
-    Logging.d(TAG, "Java releaseEncoder");
-    checkOnMediaCodecThread();
-
-    class CaughtException {
-      Exception e;
-    }
-    final CaughtException caughtException = new CaughtException();
-    boolean stopHung = false;
-
-    if (mediaCodec != null) {
-      // Run Mediacodec stop() and release() on separate thread since sometime
-      // Mediacodec.stop() may hang.
-      final CountDownLatch releaseDone = new CountDownLatch(1);
-
-      Runnable runMediaCodecRelease = new Runnable() {
-        @Override
-        public void run() {
-          Logging.d(TAG, "Java releaseEncoder on release thread");
-          try {
-            mediaCodec.stop();
-          } catch (Exception e) {
-            Logging.e(TAG, "Media encoder stop failed", e);
-          }
-          try {
-            mediaCodec.release();
-          } catch (Exception e) {
-            Logging.e(TAG, "Media encoder release failed", e);
-            caughtException.e = e;
-          }
-          Logging.d(TAG, "Java releaseEncoder on release thread done");
-
-          releaseDone.countDown();
-        }
-      };
-      new Thread(runMediaCodecRelease).start();
-
-      if (!ThreadUtils.awaitUninterruptibly(releaseDone, MEDIA_CODEC_RELEASE_TIMEOUT_MS)) {
-        Logging.e(TAG, "Media encoder release timeout");
-        stopHung = true;
-      }
-
-      mediaCodec = null;
-    }
-
-    mediaCodecThread = null;
-    if (drawer != null) {
-      drawer.release();
-      drawer = null;
-    }
-    if (eglBase != null) {
-      eglBase.release();
-      eglBase = null;
-    }
-    if (inputSurface != null) {
-      inputSurface.release();
-      inputSurface = null;
-    }
-    runningInstance = null;
-
-    if (stopHung) {
-      codecErrors++;
-      if (errorCallback != null) {
-        Logging.e(TAG, "Invoke codec error callback. Errors: " + codecErrors);
-        errorCallback.onMediaCodecVideoEncoderCriticalError(codecErrors);
-      }
-      throw new RuntimeException("Media encoder release timeout.");
-    }
-
-    // Re-throw any runtime exception caught inside the other thread. Since this is an invoke, add
-    // stack trace for the waiting thread as well.
-    if (caughtException.e != null) {
-      final RuntimeException runtimeException = new RuntimeException(caughtException.e);
-      runtimeException.setStackTrace(ThreadUtils.concatStackTraces(
-          caughtException.e.getStackTrace(), runtimeException.getStackTrace()));
-      throw runtimeException;
-    }
-
-    Logging.d(TAG, "Java releaseEncoder done");
-  }
-
-  private boolean setRates(int kbps, int frameRate) {
-    checkOnMediaCodecThread();
-
-    int codecBitrateBps = 1000 * kbps;
-    if (bitrateAdjustmentType == BitrateAdjustmentType.DYNAMIC_ADJUSTMENT) {
-      bitrateAccumulatorMax = codecBitrateBps / 8.0;
-      if (targetBitrateBps > 0 && codecBitrateBps < targetBitrateBps) {
-        // Rescale the accumulator level if the accumulator max decreases
-        bitrateAccumulator = bitrateAccumulator * codecBitrateBps / targetBitrateBps;
-      }
-    }
-    targetBitrateBps = codecBitrateBps;
-    targetFps = frameRate;
-
-    // Adjust actual encoder bitrate based on bitrate adjustment type.
-    if (bitrateAdjustmentType == BitrateAdjustmentType.FRAMERATE_ADJUSTMENT && targetFps > 0) {
-      codecBitrateBps = BITRATE_ADJUSTMENT_FPS * targetBitrateBps / targetFps;
-      Logging.v(TAG,
-          "setRates: " + kbps + " -> " + (codecBitrateBps / 1000) + " kbps. Fps: " + targetFps);
-    } else if (bitrateAdjustmentType == BitrateAdjustmentType.DYNAMIC_ADJUSTMENT) {
-      Logging.v(TAG, "setRates: " + kbps + " kbps. Fps: " + targetFps + ". ExpScale: "
-              + bitrateAdjustmentScaleExp);
-      if (bitrateAdjustmentScaleExp != 0) {
-        codecBitrateBps = (int) (codecBitrateBps * getBitrateScale(bitrateAdjustmentScaleExp));
-      }
-    } else {
-      Logging.v(TAG, "setRates: " + kbps + " kbps. Fps: " + targetFps);
-    }
-
-    try {
-      Bundle params = new Bundle();
-      params.putInt(MediaCodec.PARAMETER_KEY_VIDEO_BITRATE, codecBitrateBps);
-      mediaCodec.setParameters(params);
-      return true;
-    } catch (IllegalStateException e) {
-      Logging.e(TAG, "setRates failed", e);
-      return false;
-    }
-  }
-
-  // Dequeue an input buffer and return its index, -1 if no input buffer is
-  // available, or -2 if the codec is no longer operative.
-  int dequeueInputBuffer() {
-    checkOnMediaCodecThread();
-    try {
-      return mediaCodec.dequeueInputBuffer(DEQUEUE_TIMEOUT);
-    } catch (IllegalStateException e) {
-      Logging.e(TAG, "dequeueIntputBuffer failed", e);
-      return -2;
-    }
-  }
-
-  // Helper struct for dequeueOutputBuffer() below.
-  static class OutputBufferInfo {
-    public OutputBufferInfo(
-        int index, ByteBuffer buffer, boolean isKeyFrame, long presentationTimestampUs) {
-      this.index = index;
-      this.buffer = buffer;
-      this.isKeyFrame = isKeyFrame;
-      this.presentationTimestampUs = presentationTimestampUs;
-    }
-
-    public final int index;
-    public final ByteBuffer buffer;
-    public final boolean isKeyFrame;
-    public final long presentationTimestampUs;
-  }
-
-  // Dequeue and return an output buffer, or null if no output is ready.  Return
-  // a fake OutputBufferInfo with index -1 if the codec is no longer operable.
-  OutputBufferInfo dequeueOutputBuffer() {
-    checkOnMediaCodecThread();
-    try {
-      MediaCodec.BufferInfo info = new MediaCodec.BufferInfo();
-      int result = mediaCodec.dequeueOutputBuffer(info, DEQUEUE_TIMEOUT);
-      // Check if this is config frame and save configuration data.
-      if (result >= 0) {
-        boolean isConfigFrame = (info.flags & MediaCodec.BUFFER_FLAG_CODEC_CONFIG) != 0;
-        if (isConfigFrame) {
-          Logging.d(TAG, "Config frame generated. Offset: " + info.offset + ". Size: " + info.size);
-          configData = ByteBuffer.allocateDirect(info.size);
-          outputBuffers[result].position(info.offset);
-          outputBuffers[result].limit(info.offset + info.size);
-          configData.put(outputBuffers[result]);
-          // Log few SPS header bytes to check profile and level.
-          String spsData = "";
-          for (int i = 0; i < (info.size < 8 ? info.size : 8); i++) {
-            spsData += Integer.toHexString(configData.get(i) & 0xff) + " ";
-          }
-          Logging.d(TAG, spsData);
-          // Release buffer back.
-          mediaCodec.releaseOutputBuffer(result, false);
-          // Query next output.
-          result = mediaCodec.dequeueOutputBuffer(info, DEQUEUE_TIMEOUT);
-        }
-      }
-      if (result >= 0) {
-        // MediaCodec doesn't care about Buffer position/remaining/etc so we can
-        // mess with them to get a slice and avoid having to pass extra
-        // (BufferInfo-related) parameters back to C++.
-        ByteBuffer outputBuffer = outputBuffers[result].duplicate();
-        outputBuffer.position(info.offset);
-        outputBuffer.limit(info.offset + info.size);
-        reportEncodedFrame(info.size);
-
-        // Check key frame flag.
-        boolean isKeyFrame = (info.flags & MediaCodec.BUFFER_FLAG_SYNC_FRAME) != 0;
-        if (isKeyFrame) {
-          Logging.d(TAG, "Sync frame generated");
-        }
-        if (isKeyFrame && type == VideoCodecType.VIDEO_CODEC_H264) {
-          Logging.d(TAG, "Appending config frame of size " + configData.capacity()
-                  + " to output buffer with offset " + info.offset + ", size " + info.size);
-          // For H.264 key frame append SPS and PPS NALs at the start
-          ByteBuffer keyFrameBuffer = ByteBuffer.allocateDirect(configData.capacity() + info.size);
-          configData.rewind();
-          keyFrameBuffer.put(configData);
-          keyFrameBuffer.put(outputBuffer);
-          keyFrameBuffer.position(0);
-          return new OutputBufferInfo(result, keyFrameBuffer, isKeyFrame, info.presentationTimeUs);
-        } else {
-          return new OutputBufferInfo(
-              result, outputBuffer.slice(), isKeyFrame, info.presentationTimeUs);
-        }
-      } else if (result == MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED) {
-        outputBuffers = mediaCodec.getOutputBuffers();
-        return dequeueOutputBuffer();
-      } else if (result == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) {
-        return dequeueOutputBuffer();
-      } else if (result == MediaCodec.INFO_TRY_AGAIN_LATER) {
-        return null;
-      }
-      throw new RuntimeException("dequeueOutputBuffer: " + result);
-    } catch (IllegalStateException e) {
-      Logging.e(TAG, "dequeueOutputBuffer failed", e);
-      return new OutputBufferInfo(-1, null, false, -1);
-    }
-  }
-
-  private double getBitrateScale(int bitrateAdjustmentScaleExp) {
-    return Math.pow(BITRATE_CORRECTION_MAX_SCALE,
-        (double) bitrateAdjustmentScaleExp / BITRATE_CORRECTION_STEPS);
-  }
-
-  private void reportEncodedFrame(int size) {
-    if (targetFps == 0 || bitrateAdjustmentType != BitrateAdjustmentType.DYNAMIC_ADJUSTMENT) {
-      return;
-    }
-
-    // Accumulate the difference between actial and expected frame sizes.
-    double expectedBytesPerFrame = targetBitrateBps / (8.0 * targetFps);
-    bitrateAccumulator += (size - expectedBytesPerFrame);
-    bitrateObservationTimeMs += 1000.0 / targetFps;
-
-    // Put a cap on the accumulator, i.e., don't let it grow beyond some level to avoid
-    // using too old data for bitrate adjustment.
-    double bitrateAccumulatorCap = BITRATE_CORRECTION_SEC * bitrateAccumulatorMax;
-    bitrateAccumulator = Math.min(bitrateAccumulator, bitrateAccumulatorCap);
-    bitrateAccumulator = Math.max(bitrateAccumulator, -bitrateAccumulatorCap);
-
-    // Do bitrate adjustment every 3 seconds if actual encoder bitrate deviates too much
-    // form the target value.
-    if (bitrateObservationTimeMs > 1000 * BITRATE_CORRECTION_SEC) {
-      Logging.d(TAG, "Acc: " + (int) bitrateAccumulator + ". Max: " + (int) bitrateAccumulatorMax
-              + ". ExpScale: " + bitrateAdjustmentScaleExp);
-      boolean bitrateAdjustmentScaleChanged = false;
-      if (bitrateAccumulator > bitrateAccumulatorMax) {
-        // Encoder generates too high bitrate - need to reduce the scale.
-        int bitrateAdjustmentInc = (int) (bitrateAccumulator / bitrateAccumulatorMax + 0.5);
-        bitrateAdjustmentScaleExp -= bitrateAdjustmentInc;
-        bitrateAccumulator = bitrateAccumulatorMax;
-        bitrateAdjustmentScaleChanged = true;
-      } else if (bitrateAccumulator < -bitrateAccumulatorMax) {
-        // Encoder generates too low bitrate - need to increase the scale.
-        int bitrateAdjustmentInc = (int) (-bitrateAccumulator / bitrateAccumulatorMax + 0.5);
-        bitrateAdjustmentScaleExp += bitrateAdjustmentInc;
-        bitrateAccumulator = -bitrateAccumulatorMax;
-        bitrateAdjustmentScaleChanged = true;
-      }
-      if (bitrateAdjustmentScaleChanged) {
-        bitrateAdjustmentScaleExp = Math.min(bitrateAdjustmentScaleExp, BITRATE_CORRECTION_STEPS);
-        bitrateAdjustmentScaleExp = Math.max(bitrateAdjustmentScaleExp, -BITRATE_CORRECTION_STEPS);
-        Logging.d(TAG, "Adjusting bitrate scale to " + bitrateAdjustmentScaleExp + ". Value: "
-                + getBitrateScale(bitrateAdjustmentScaleExp));
-        setRates(targetBitrateBps / 1000, targetFps);
-      }
-      bitrateObservationTimeMs = 0;
-    }
-  }
-
-  // Release a dequeued output buffer back to the codec for re-use.  Return
-  // false if the codec is no longer operable.
-  boolean releaseOutputBuffer(int index) {
-    checkOnMediaCodecThread();
-    try {
-      mediaCodec.releaseOutputBuffer(index, false);
-      return true;
-    } catch (IllegalStateException e) {
-      Logging.e(TAG, "releaseOutputBuffer failed", e);
-      return false;
-    }
-  }
-
-  /** Fills an inputBuffer with the given index with data from the byte buffers. */
-  private static native void nativeFillBuffer(long nativeEncoder, int inputBuffer, ByteBuffer dataY,
-      int strideY, ByteBuffer dataU, int strideU, ByteBuffer dataV, int strideV);
-}
diff --git a/sdk/android/api/org/webrtc/MediaConstraints.java b/sdk/android/api/org/webrtc/MediaConstraints.java
deleted file mode 100644
index cfe709e..0000000
--- a/sdk/android/api/org/webrtc/MediaConstraints.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- *  Copyright 2013 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.
- */
-
-package org.webrtc;
-
-import java.util.LinkedList;
-import java.util.List;
-
-/**
- * Description of media constraints for {@code MediaStream} and
- * {@code PeerConnection}.
- */
-public class MediaConstraints {
-  /** Simple String key/value pair. */
-  public static class KeyValuePair {
-    private final String key;
-    private final String value;
-
-    public KeyValuePair(String key, String value) {
-      this.key = key;
-      this.value = value;
-    }
-
-    public String getKey() {
-      return key;
-    }
-
-    public String getValue() {
-      return value;
-    }
-
-    public String toString() {
-      return key + ": " + value;
-    }
-
-    @Override
-    public boolean equals(Object other) {
-      if (this == other) {
-        return true;
-      }
-      if (other == null || getClass() != other.getClass()) {
-        return false;
-      }
-      KeyValuePair that = (KeyValuePair) other;
-      return key.equals(that.key) && value.equals(that.value);
-    }
-
-    @Override
-    public int hashCode() {
-      return key.hashCode() + value.hashCode();
-    }
-  }
-
-  public final List<KeyValuePair> mandatory;
-  public final List<KeyValuePair> optional;
-
-  public MediaConstraints() {
-    mandatory = new LinkedList<KeyValuePair>();
-    optional = new LinkedList<KeyValuePair>();
-  }
-
-  private static String stringifyKeyValuePairList(List<KeyValuePair> list) {
-    StringBuilder builder = new StringBuilder("[");
-    for (KeyValuePair pair : list) {
-      if (builder.length() > 1) {
-        builder.append(", ");
-      }
-      builder.append(pair.toString());
-    }
-    return builder.append("]").toString();
-  }
-
-  public String toString() {
-    return "mandatory: " + stringifyKeyValuePairList(mandatory) + ", optional: "
-        + stringifyKeyValuePairList(optional);
-  }
-}
diff --git a/sdk/android/api/org/webrtc/MediaSource.java b/sdk/android/api/org/webrtc/MediaSource.java
deleted file mode 100644
index a26e889..0000000
--- a/sdk/android/api/org/webrtc/MediaSource.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- *  Copyright 2013 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.
- */
-
-package org.webrtc;
-
-/** Java wrapper for a C++ MediaSourceInterface. */
-public class MediaSource {
-  /** Tracks MediaSourceInterface.SourceState */
-  public enum State { INITIALIZING, LIVE, ENDED, MUTED }
-
-  final long nativeSource; // Package-protected for PeerConnectionFactory.
-
-  public MediaSource(long nativeSource) {
-    this.nativeSource = nativeSource;
-  }
-
-  public State state() {
-    return nativeState(nativeSource);
-  }
-
-  public void dispose() {
-    JniCommon.nativeReleaseRef(nativeSource);
-  }
-
-  private static native State nativeState(long pointer);
-}
diff --git a/sdk/android/api/org/webrtc/MediaStream.java b/sdk/android/api/org/webrtc/MediaStream.java
deleted file mode 100644
index 3c7349d..0000000
--- a/sdk/android/api/org/webrtc/MediaStream.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- *  Copyright 2013 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.
- */
-
-package org.webrtc;
-
-import java.util.LinkedList;
-
-/** Java wrapper for a C++ MediaStreamInterface. */
-public class MediaStream {
-  public final LinkedList<AudioTrack> audioTracks;
-  public final LinkedList<VideoTrack> videoTracks;
-  public final LinkedList<VideoTrack> preservedVideoTracks;
-  // Package-protected for PeerConnection.
-  final long nativeStream;
-
-  public MediaStream(long nativeStream) {
-    audioTracks = new LinkedList<AudioTrack>();
-    videoTracks = new LinkedList<VideoTrack>();
-    preservedVideoTracks = new LinkedList<VideoTrack>();
-    this.nativeStream = nativeStream;
-  }
-
-  public boolean addTrack(AudioTrack track) {
-    if (nativeAddAudioTrack(nativeStream, track.nativeTrack)) {
-      audioTracks.add(track);
-      return true;
-    }
-    return false;
-  }
-
-  public boolean addTrack(VideoTrack track) {
-    if (nativeAddVideoTrack(nativeStream, track.nativeTrack)) {
-      videoTracks.add(track);
-      return true;
-    }
-    return false;
-  }
-
-  // Tracks added in addTrack() call will be auto released once MediaStream.dispose()
-  // is called. If video track need to be preserved after MediaStream is destroyed it
-  // should be added to MediaStream using addPreservedTrack() call.
-  public boolean addPreservedTrack(VideoTrack track) {
-    if (nativeAddVideoTrack(nativeStream, track.nativeTrack)) {
-      preservedVideoTracks.add(track);
-      return true;
-    }
-    return false;
-  }
-
-  public boolean removeTrack(AudioTrack track) {
-    audioTracks.remove(track);
-    return nativeRemoveAudioTrack(nativeStream, track.nativeTrack);
-  }
-
-  public boolean removeTrack(VideoTrack track) {
-    videoTracks.remove(track);
-    preservedVideoTracks.remove(track);
-    return nativeRemoveVideoTrack(nativeStream, track.nativeTrack);
-  }
-
-  public void dispose() {
-    // Remove and release previously added audio and video tracks.
-    while (!audioTracks.isEmpty()) {
-      AudioTrack track = audioTracks.getFirst();
-      removeTrack(track);
-      track.dispose();
-    }
-    while (!videoTracks.isEmpty()) {
-      VideoTrack track = videoTracks.getFirst();
-      removeTrack(track);
-      track.dispose();
-    }
-    // Remove, but do not release preserved video tracks.
-    while (!preservedVideoTracks.isEmpty()) {
-      removeTrack(preservedVideoTracks.getFirst());
-    }
-    free(nativeStream);
-  }
-
-  public String label() {
-    return nativeLabel(nativeStream);
-  }
-
-  public String toString() {
-    return "[" + label() + ":A=" + audioTracks.size() + ":V=" + videoTracks.size() + "]";
-  }
-
-  private static native boolean nativeAddAudioTrack(long nativeStream, long nativeAudioTrack);
-
-  private static native boolean nativeAddVideoTrack(long nativeStream, long nativeVideoTrack);
-
-  private static native boolean nativeRemoveAudioTrack(long nativeStream, long nativeAudioTrack);
-
-  private static native boolean nativeRemoveVideoTrack(long nativeStream, long nativeVideoTrack);
-
-  private static native String nativeLabel(long nativeStream);
-
-  private static native void free(long nativeStream);
-}
diff --git a/sdk/android/api/org/webrtc/MediaStreamTrack.java b/sdk/android/api/org/webrtc/MediaStreamTrack.java
deleted file mode 100644
index 656d024..0000000
--- a/sdk/android/api/org/webrtc/MediaStreamTrack.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- *  Copyright 2013 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.
- */
-
-package org.webrtc;
-
-/** Java wrapper for a C++ MediaStreamTrackInterface. */
-public class MediaStreamTrack {
-  /** Tracks MediaStreamTrackInterface.TrackState */
-  public enum State { LIVE, ENDED }
-
-  public enum MediaType {
-    MEDIA_TYPE_AUDIO,
-    MEDIA_TYPE_VIDEO,
-  }
-
-  final long nativeTrack;
-
-  public MediaStreamTrack(long nativeTrack) {
-    this.nativeTrack = nativeTrack;
-  }
-
-  public String id() {
-    return nativeId(nativeTrack);
-  }
-
-  public String kind() {
-    return nativeKind(nativeTrack);
-  }
-
-  public boolean enabled() {
-    return nativeEnabled(nativeTrack);
-  }
-
-  public boolean setEnabled(boolean enable) {
-    return nativeSetEnabled(nativeTrack, enable);
-  }
-
-  public State state() {
-    return nativeState(nativeTrack);
-  }
-
-  public void dispose() {
-    JniCommon.nativeReleaseRef(nativeTrack);
-  }
-
-  private static native String nativeId(long nativeTrack);
-
-  private static native String nativeKind(long nativeTrack);
-
-  private static native boolean nativeEnabled(long nativeTrack);
-
-  private static native boolean nativeSetEnabled(long nativeTrack, boolean enabled);
-
-  private static native State nativeState(long nativeTrack);
-}
diff --git a/sdk/android/api/org/webrtc/Metrics.java b/sdk/android/api/org/webrtc/Metrics.java
deleted file mode 100644
index ca19489..0000000
--- a/sdk/android/api/org/webrtc/Metrics.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- *  Copyright 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.
- */
-
-package org.webrtc;
-
-import java.util.HashMap;
-import java.util.Map;
-
-// Java-side of androidmetrics_jni.cc.
-//
-// Rtc histograms can be queried through the API, getAndReset().
-// The returned map holds the name of a histogram and its samples.
-//
-// Example of |map| with one histogram:
-// |name|: "WebRTC.Video.InputFramesPerSecond"
-//     |min|: 1
-//     |max|: 100
-//     |bucketCount|: 50
-//     |samples|: [30]:1
-//
-// Most histograms are not updated frequently (e.g. most video metrics are an
-// average over the call and recorded when a stream is removed).
-// The metrics can for example be retrieved when a peer connection is closed.
-
-public class Metrics {
-  private static final String TAG = "Metrics";
-
-  static {
-    System.loadLibrary("jingle_peerconnection_so");
-  }
-  public final Map<String, HistogramInfo> map =
-      new HashMap<String, HistogramInfo>(); // <name, HistogramInfo>
-
-  /**
-   * Class holding histogram information.
-   */
-  public static class HistogramInfo {
-    public final int min;
-    public final int max;
-    public final int bucketCount;
-    public final Map<Integer, Integer> samples =
-        new HashMap<Integer, Integer>(); // <value, # of events>
-
-    public HistogramInfo(int min, int max, int bucketCount) {
-      this.min = min;
-      this.max = max;
-      this.bucketCount = bucketCount;
-    }
-
-    public void addSample(int value, int numEvents) {
-      samples.put(value, numEvents);
-    }
-  }
-
-  private void add(String name, HistogramInfo info) {
-    map.put(name, info);
-  }
-
-  // Enables gathering of metrics (which can be fetched with getAndReset()).
-  // Must be called before PeerConnectionFactory is created.
-  public static void enable() {
-    nativeEnable();
-  }
-
-  // Gets and clears native histograms.
-  public static Metrics getAndReset() {
-    return nativeGetAndReset();
-  }
-
-  private static native void nativeEnable();
-  private static native Metrics nativeGetAndReset();
-}
diff --git a/sdk/android/api/org/webrtc/NetworkMonitor.java b/sdk/android/api/org/webrtc/NetworkMonitor.java
deleted file mode 100644
index 29530da..0000000
--- a/sdk/android/api/org/webrtc/NetworkMonitor.java
+++ /dev/null
@@ -1,238 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-package org.webrtc;
-
-import static org.webrtc.NetworkMonitorAutoDetect.ConnectionType;
-import static org.webrtc.NetworkMonitorAutoDetect.INVALID_NET_ID;
-import static org.webrtc.NetworkMonitorAutoDetect.NetworkInformation;
-
-import android.annotation.SuppressLint;
-import android.content.Context;
-import android.os.Build;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Borrowed from Chromium's src/net/android/java/src/org/chromium/net/NetworkChangeNotifier.java
- *
- * Triggers updates to the underlying network state from OS networking events.
- *
- * WARNING: This class is not thread-safe.
- */
-public class NetworkMonitor {
-  /**
-   * Alerted when the connection type of the network changes.
-   * The alert is fired on the UI thread.
-   */
-  public interface NetworkObserver {
-    public void onConnectionTypeChanged(ConnectionType connectionType);
-  }
-
-  private static final String TAG = "NetworkMonitor";
-
-  // We are storing application context so it is okay.
-  private static NetworkMonitor instance;
-
-  // Native observers of the connection type changes.
-  private final ArrayList<Long> nativeNetworkObservers;
-  // Java observers of the connection type changes.
-  private final ArrayList<NetworkObserver> networkObservers;
-
-  // Object that detects the connection type changes.
-  private NetworkMonitorAutoDetect autoDetector;
-
-  private ConnectionType currentConnectionType = ConnectionType.CONNECTION_UNKNOWN;
-
-  private NetworkMonitor() {
-    nativeNetworkObservers = new ArrayList<Long>();
-    networkObservers = new ArrayList<NetworkObserver>();
-  }
-
-  // TODO(sakal): Remove once downstream dependencies have been updated.
-  @Deprecated
-  public static void init(Context context) {}
-
-  /**
-   * Returns the singleton instance.
-   */
-  public static NetworkMonitor getInstance() {
-    if (instance == null) {
-      instance = new NetworkMonitor();
-    }
-    return instance;
-  }
-
-  private static void assertIsTrue(boolean condition) {
-    if (!condition) {
-      throw new AssertionError("Expected to be true");
-    }
-  }
-
-  /**
-   * Called by the native code.
-   *
-   * Enables auto detection of the current network state based on notifications
-   * from the system. Note that this requires the embedding app have the
-   * platform ACCESS_NETWORK_STATE permission.
-   */
-  private void startMonitoring(long nativeObserver) {
-    Logging.d(TAG, "Start monitoring from native observer " + nativeObserver);
-    nativeNetworkObservers.add(nativeObserver);
-    if (autoDetector == null) {
-      createAutoDetector();
-    }
-    // The observers expect a network list update after they call startMonitoring.
-    final NetworkMonitorAutoDetect.NetworkState networkState =
-        autoDetector.getCurrentNetworkState();
-    updateCurrentConnectionType(NetworkMonitorAutoDetect.getConnectionType(networkState));
-    updateObserverActiveNetworkList(nativeObserver);
-  }
-
-  // Called by the native code.
-  private void stopMonitoring(long nativeObserver) {
-    Logging.d(TAG, "Stop monitoring from native observer " + nativeObserver);
-    nativeNetworkObservers.remove(nativeObserver);
-    if (nativeNetworkObservers.isEmpty()) {
-      autoDetector.destroy();
-      autoDetector = null;
-    }
-  }
-
-  // Called by the native code to determine if network binding is supported
-  // on this platform.
-  private boolean networkBindingSupported() {
-    return autoDetector != null && autoDetector.supportNetworkCallback();
-  }
-
-  // Called by the native code to get the Android SDK version.
-  private static int androidSdkInt() {
-    return Build.VERSION.SDK_INT;
-  }
-
-  private ConnectionType getCurrentConnectionType() {
-    return currentConnectionType;
-  }
-
-  private long getCurrentDefaultNetId() {
-    return autoDetector == null ? INVALID_NET_ID : autoDetector.getDefaultNetId();
-  }
-
-  private void createAutoDetector() {
-    autoDetector = new NetworkMonitorAutoDetect(new NetworkMonitorAutoDetect.Observer() {
-
-      @Override
-      public void onConnectionTypeChanged(ConnectionType newConnectionType) {
-        updateCurrentConnectionType(newConnectionType);
-      }
-
-      @Override
-      public void onNetworkConnect(NetworkInformation networkInfo) {
-        notifyObserversOfNetworkConnect(networkInfo);
-      }
-
-      @Override
-      public void onNetworkDisconnect(long networkHandle) {
-        notifyObserversOfNetworkDisconnect(networkHandle);
-      }
-    }, ContextUtils.getApplicationContext());
-  }
-
-  private void updateCurrentConnectionType(ConnectionType newConnectionType) {
-    currentConnectionType = newConnectionType;
-    notifyObserversOfConnectionTypeChange(newConnectionType);
-  }
-
-  /**
-   * Alerts all observers of a connection change.
-   */
-  private void notifyObserversOfConnectionTypeChange(ConnectionType newConnectionType) {
-    for (long nativeObserver : nativeNetworkObservers) {
-      nativeNotifyConnectionTypeChanged(nativeObserver);
-    }
-    for (NetworkObserver observer : networkObservers) {
-      observer.onConnectionTypeChanged(newConnectionType);
-    }
-  }
-
-  private void notifyObserversOfNetworkConnect(NetworkInformation networkInfo) {
-    for (long nativeObserver : nativeNetworkObservers) {
-      nativeNotifyOfNetworkConnect(nativeObserver, networkInfo);
-    }
-  }
-
-  private void notifyObserversOfNetworkDisconnect(long networkHandle) {
-    for (long nativeObserver : nativeNetworkObservers) {
-      nativeNotifyOfNetworkDisconnect(nativeObserver, networkHandle);
-    }
-  }
-
-  private void updateObserverActiveNetworkList(long nativeObserver) {
-    List<NetworkInformation> networkInfoList = autoDetector.getActiveNetworkList();
-    if (networkInfoList == null || networkInfoList.size() == 0) {
-      return;
-    }
-
-    NetworkInformation[] networkInfos = new NetworkInformation[networkInfoList.size()];
-    networkInfos = networkInfoList.toArray(networkInfos);
-    nativeNotifyOfActiveNetworkList(nativeObserver, networkInfos);
-  }
-
-  /**
-   * Adds an observer for any connection type changes.
-   */
-  public static void addNetworkObserver(NetworkObserver observer) {
-    getInstance().addNetworkObserverInternal(observer);
-  }
-
-  private void addNetworkObserverInternal(NetworkObserver observer) {
-    networkObservers.add(observer);
-  }
-
-  /**
-   * Removes an observer for any connection type changes.
-   */
-  public static void removeNetworkObserver(NetworkObserver observer) {
-    getInstance().removeNetworkObserverInternal(observer);
-  }
-
-  private void removeNetworkObserverInternal(NetworkObserver observer) {
-    networkObservers.remove(observer);
-  }
-
-  /**
-   * Checks if there currently is connectivity.
-   */
-  public static boolean isOnline() {
-    ConnectionType connectionType = getInstance().getCurrentConnectionType();
-    return connectionType != ConnectionType.CONNECTION_NONE;
-  }
-
-  private native void nativeNotifyConnectionTypeChanged(long nativePtr);
-  private native void nativeNotifyOfNetworkConnect(long nativePtr, NetworkInformation networkInfo);
-  private native void nativeNotifyOfNetworkDisconnect(long nativePtr, long networkHandle);
-  private native void nativeNotifyOfActiveNetworkList(
-      long nativePtr, NetworkInformation[] networkInfos);
-
-  // For testing only.
-  static void resetInstanceForTests() {
-    instance = new NetworkMonitor();
-  }
-
-  // For testing only.
-  static void createAutoDetectorForTest() {
-    getInstance().createAutoDetector();
-  }
-
-  // For testing only.
-  static NetworkMonitorAutoDetect getAutoDetectorForTest() {
-    return getInstance().autoDetector;
-  }
-}
diff --git a/sdk/android/api/org/webrtc/NetworkMonitorAutoDetect.java b/sdk/android/api/org/webrtc/NetworkMonitorAutoDetect.java
deleted file mode 100644
index 9cae2ef..0000000
--- a/sdk/android/api/org/webrtc/NetworkMonitorAutoDetect.java
+++ /dev/null
@@ -1,740 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-package org.webrtc;
-
-import android.annotation.SuppressLint;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.net.ConnectivityManager;
-import android.net.ConnectivityManager.NetworkCallback;
-import android.net.LinkAddress;
-import android.net.LinkProperties;
-import android.net.Network;
-import android.net.NetworkCapabilities;
-import android.net.NetworkInfo;
-import android.net.NetworkRequest;
-import android.net.wifi.WifiInfo;
-import android.net.wifi.WifiManager;
-import android.net.wifi.p2p.WifiP2pGroup;
-import android.net.wifi.p2p.WifiP2pManager;
-import android.os.Build;
-import android.telephony.TelephonyManager;
-import java.net.InetAddress;
-import java.net.NetworkInterface;
-import java.net.SocketException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-/**
- * Borrowed from Chromium's
- * src/net/android/java/src/org/chromium/net/NetworkChangeNotifierAutoDetect.java
- *
- * Used by the NetworkMonitor to listen to platform changes in connectivity.
- * Note that use of this class requires that the app have the platform
- * ACCESS_NETWORK_STATE permission.
- */
-public class NetworkMonitorAutoDetect extends BroadcastReceiver {
-  public static enum ConnectionType {
-    CONNECTION_UNKNOWN,
-    CONNECTION_ETHERNET,
-    CONNECTION_WIFI,
-    CONNECTION_4G,
-    CONNECTION_3G,
-    CONNECTION_2G,
-    CONNECTION_UNKNOWN_CELLULAR,
-    CONNECTION_BLUETOOTH,
-    CONNECTION_NONE
-  }
-
-  public static class IPAddress {
-    public final byte[] address;
-    public IPAddress(byte[] address) {
-      this.address = address;
-    }
-  }
-
-  /** Java version of NetworkMonitor.NetworkInformation */
-  public static class NetworkInformation {
-    public final String name;
-    public final ConnectionType type;
-    public final long handle;
-    public final IPAddress[] ipAddresses;
-    public NetworkInformation(
-        String name, ConnectionType type, long handle, IPAddress[] addresses) {
-      this.name = name;
-      this.type = type;
-      this.handle = handle;
-      this.ipAddresses = addresses;
-    }
-  };
-
-  static class NetworkState {
-    private final boolean connected;
-    // Defined from ConnectivityManager.TYPE_XXX for non-mobile; for mobile, it is
-    // further divided into 2G, 3G, or 4G from the subtype.
-    private final int type;
-    // Defined from NetworkInfo.subtype, which is one of the TelephonyManager.NETWORK_TYPE_XXXs.
-    // Will be useful to find the maximum bandwidth.
-    private final int subtype;
-
-    public NetworkState(boolean connected, int type, int subtype) {
-      this.connected = connected;
-      this.type = type;
-      this.subtype = subtype;
-    }
-
-    public boolean isConnected() {
-      return connected;
-    }
-
-    public int getNetworkType() {
-      return type;
-    }
-
-    public int getNetworkSubType() {
-      return subtype;
-    }
-  }
-  /**
-   * The methods in this class get called when the network changes if the callback
-   * is registered with a proper network request. It is only available in Android Lollipop
-   * and above.
-   */
-  @SuppressLint("NewApi")
-  private class SimpleNetworkCallback extends NetworkCallback {
-    @Override
-    public void onAvailable(Network network) {
-      Logging.d(TAG, "Network becomes available: " + network.toString());
-      onNetworkChanged(network);
-    }
-
-    @Override
-    public void onCapabilitiesChanged(Network network, NetworkCapabilities networkCapabilities) {
-      // A capabilities change may indicate the ConnectionType has changed,
-      // so forward the new NetworkInformation along to the observer.
-      Logging.d(TAG, "capabilities changed: " + networkCapabilities.toString());
-      onNetworkChanged(network);
-    }
-
-    @Override
-    public void onLinkPropertiesChanged(Network network, LinkProperties linkProperties) {
-      // A link property change may indicate the IP address changes.
-      // so forward the new NetworkInformation to the observer.
-      Logging.d(TAG, "link properties changed: " + linkProperties.toString());
-      onNetworkChanged(network);
-    }
-
-    @Override
-    public void onLosing(Network network, int maxMsToLive) {
-      // Tell the network is going to lose in MaxMsToLive milliseconds.
-      // We may use this signal later.
-      Logging.d(
-          TAG, "Network " + network.toString() + " is about to lose in " + maxMsToLive + "ms");
-    }
-
-    @Override
-    public void onLost(Network network) {
-      Logging.d(TAG, "Network " + network.toString() + " is disconnected");
-      observer.onNetworkDisconnect(networkToNetId(network));
-    }
-
-    private void onNetworkChanged(Network network) {
-      NetworkInformation networkInformation = connectivityManagerDelegate.networkToInfo(network);
-      if (networkInformation != null) {
-        observer.onNetworkConnect(networkInformation);
-      }
-    }
-  }
-
-  /** Queries the ConnectivityManager for information about the current connection. */
-  static class ConnectivityManagerDelegate {
-    /**
-     *  Note: In some rare Android systems connectivityManager is null.  We handle that
-     *  gracefully below.
-     */
-    private final ConnectivityManager connectivityManager;
-
-    ConnectivityManagerDelegate(Context context) {
-      connectivityManager =
-          (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
-    }
-
-    // For testing.
-    ConnectivityManagerDelegate() {
-      // All the methods below should be overridden.
-      connectivityManager = null;
-    }
-
-    /**
-     * Returns connection type and status information about the current
-     * default network.
-     */
-    NetworkState getNetworkState() {
-      if (connectivityManager == null) {
-        return new NetworkState(false, -1, -1);
-      }
-      return getNetworkState(connectivityManager.getActiveNetworkInfo());
-    }
-
-    /**
-     * Returns connection type and status information about |network|.
-     * Only callable on Lollipop and newer releases.
-     */
-    @SuppressLint("NewApi")
-    NetworkState getNetworkState(Network network) {
-      if (connectivityManager == null) {
-        return new NetworkState(false, -1, -1);
-      }
-      return getNetworkState(connectivityManager.getNetworkInfo(network));
-    }
-
-    /**
-     * Returns connection type and status information gleaned from networkInfo.
-     */
-    NetworkState getNetworkState(NetworkInfo networkInfo) {
-      if (networkInfo == null || !networkInfo.isConnected()) {
-        return new NetworkState(false, -1, -1);
-      }
-      return new NetworkState(true, networkInfo.getType(), networkInfo.getSubtype());
-    }
-
-    /**
-     * Returns all connected networks.
-     * Only callable on Lollipop and newer releases.
-     */
-    @SuppressLint("NewApi")
-    Network[] getAllNetworks() {
-      if (connectivityManager == null) {
-        return new Network[0];
-      }
-      return connectivityManager.getAllNetworks();
-    }
-
-    List<NetworkInformation> getActiveNetworkList() {
-      if (!supportNetworkCallback()) {
-        return null;
-      }
-      ArrayList<NetworkInformation> netInfoList = new ArrayList<NetworkInformation>();
-      for (Network network : getAllNetworks()) {
-        NetworkInformation info = networkToInfo(network);
-        if (info != null) {
-          netInfoList.add(info);
-        }
-      }
-      return netInfoList;
-    }
-
-    /**
-     * Returns the NetID of the current default network. Returns
-     * INVALID_NET_ID if no current default network connected.
-     * Only callable on Lollipop and newer releases.
-     */
-    @SuppressLint("NewApi")
-    long getDefaultNetId() {
-      if (!supportNetworkCallback()) {
-        return INVALID_NET_ID;
-      }
-      // Android Lollipop had no API to get the default network; only an
-      // API to return the NetworkInfo for the default network. To
-      // determine the default network one can find the network with
-      // type matching that of the default network.
-      final NetworkInfo defaultNetworkInfo = connectivityManager.getActiveNetworkInfo();
-      if (defaultNetworkInfo == null) {
-        return INVALID_NET_ID;
-      }
-      final Network[] networks = getAllNetworks();
-      long defaultNetId = INVALID_NET_ID;
-      for (Network network : networks) {
-        if (!hasInternetCapability(network)) {
-          continue;
-        }
-        final NetworkInfo networkInfo = connectivityManager.getNetworkInfo(network);
-        if (networkInfo != null && networkInfo.getType() == defaultNetworkInfo.getType()) {
-          // There should not be multiple connected networks of the
-          // same type. At least as of Android Marshmallow this is
-          // not supported. If this becomes supported this assertion
-          // may trigger. At that point we could consider using
-          // ConnectivityManager.getDefaultNetwork() though this
-          // may give confusing results with VPNs and is only
-          // available with Android Marshmallow.
-          if (defaultNetId != INVALID_NET_ID) {
-            throw new RuntimeException(
-                "Multiple connected networks of same type are not supported.");
-          }
-          defaultNetId = networkToNetId(network);
-        }
-      }
-      return defaultNetId;
-    }
-
-    @SuppressLint("NewApi")
-    private NetworkInformation networkToInfo(Network network) {
-      LinkProperties linkProperties = connectivityManager.getLinkProperties(network);
-      // getLinkProperties will return null if the network is unknown.
-      if (linkProperties == null) {
-        Logging.w(TAG, "Detected unknown network: " + network.toString());
-        return null;
-      }
-      if (linkProperties.getInterfaceName() == null) {
-        Logging.w(TAG, "Null interface name for network " + network.toString());
-        return null;
-      }
-
-      NetworkState networkState = getNetworkState(network);
-      if (networkState.connected && networkState.getNetworkType() == ConnectivityManager.TYPE_VPN) {
-        // If a VPN network is in place, we can find the underlying network type via querying the
-        // active network info thanks to
-        // https://android.googlesource.com/platform/frameworks/base/+/d6a7980d
-        networkState = getNetworkState();
-      }
-      ConnectionType connectionType = getConnectionType(networkState);
-      if (connectionType == ConnectionType.CONNECTION_NONE) {
-        // This may not be an error. The OS may signal a network event with connection type
-        // NONE when the network disconnects.
-        Logging.d(TAG, "Network " + network.toString() + " is disconnected");
-        return null;
-      }
-
-      // Some android device may return a CONNECTION_UNKNOWN_CELLULAR or CONNECTION_UNKNOWN type,
-      // which appears to be usable. Just log them here.
-      if (connectionType == ConnectionType.CONNECTION_UNKNOWN
-          || connectionType == ConnectionType.CONNECTION_UNKNOWN_CELLULAR) {
-        Logging.d(TAG, "Network " + network.toString() + " connection type is " + connectionType
-                + " because it has type " + networkState.getNetworkType() + " and subtype "
-                + networkState.getNetworkSubType());
-      }
-
-      NetworkInformation networkInformation =
-          new NetworkInformation(linkProperties.getInterfaceName(), connectionType,
-              networkToNetId(network), getIPAddresses(linkProperties));
-      return networkInformation;
-    }
-
-    /**
-     * Returns true if {@code network} can provide Internet access. Can be used to
-     * ignore specialized networks (e.g. IMS, FOTA).
-     */
-    @SuppressLint("NewApi")
-    boolean hasInternetCapability(Network network) {
-      if (connectivityManager == null) {
-        return false;
-      }
-      final NetworkCapabilities capabilities = connectivityManager.getNetworkCapabilities(network);
-      return capabilities != null
-          && capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET);
-    }
-
-    /** Only callable on Lollipop and newer releases. */
-    @SuppressLint("NewApi")
-    public void registerNetworkCallback(NetworkCallback networkCallback) {
-      connectivityManager.registerNetworkCallback(
-          new NetworkRequest.Builder()
-              .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
-              .build(),
-          networkCallback);
-    }
-
-    /** Only callable on Lollipop and newer releases. */
-    @SuppressLint("NewApi")
-    public void requestMobileNetwork(NetworkCallback networkCallback) {
-      NetworkRequest.Builder builder = new NetworkRequest.Builder();
-      builder.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
-          .addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR);
-      connectivityManager.requestNetwork(builder.build(), networkCallback);
-    }
-
-    @SuppressLint("NewApi")
-    IPAddress[] getIPAddresses(LinkProperties linkProperties) {
-      IPAddress[] ipAddresses = new IPAddress[linkProperties.getLinkAddresses().size()];
-      int i = 0;
-      for (LinkAddress linkAddress : linkProperties.getLinkAddresses()) {
-        ipAddresses[i] = new IPAddress(linkAddress.getAddress().getAddress());
-        ++i;
-      }
-      return ipAddresses;
-    }
-
-    @SuppressLint("NewApi")
-    public void releaseCallback(NetworkCallback networkCallback) {
-      if (supportNetworkCallback()) {
-        Logging.d(TAG, "Unregister network callback");
-        connectivityManager.unregisterNetworkCallback(networkCallback);
-      }
-    }
-
-    public boolean supportNetworkCallback() {
-      return Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && connectivityManager != null;
-    }
-  }
-
-  /** Queries the WifiManager for SSID of the current Wifi connection. */
-  static class WifiManagerDelegate {
-    private final Context context;
-    WifiManagerDelegate(Context context) {
-      this.context = context;
-    }
-
-    // For testing.
-    WifiManagerDelegate() {
-      // All the methods below should be overridden.
-      context = null;
-    }
-
-    String getWifiSSID() {
-      final Intent intent = context.registerReceiver(
-          null, new IntentFilter(WifiManager.NETWORK_STATE_CHANGED_ACTION));
-      if (intent != null) {
-        final WifiInfo wifiInfo = intent.getParcelableExtra(WifiManager.EXTRA_WIFI_INFO);
-        if (wifiInfo != null) {
-          final String ssid = wifiInfo.getSSID();
-          if (ssid != null) {
-            return ssid;
-          }
-        }
-      }
-      return "";
-    }
-  }
-
-  /** Maintains the information about wifi direct (aka WifiP2p) networks. */
-  static class WifiDirectManagerDelegate extends BroadcastReceiver {
-    // Network "handle" for the Wifi P2p network. We have to bind to the default network id
-    // (NETWORK_UNSPECIFIED) for these addresses.
-    private static final int WIFI_P2P_NETWORK_HANDLE = 0;
-    private final Context context;
-    private final Observer observer;
-    // Network information about a WifiP2p (aka WiFi-Direct) network, or null if no such network is
-    // connected.
-    private NetworkInformation wifiP2pNetworkInfo = null;
-
-    WifiDirectManagerDelegate(Observer observer, Context context) {
-      this.context = context;
-      this.observer = observer;
-      IntentFilter intentFilter = new IntentFilter();
-      intentFilter.addAction(WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION);
-      intentFilter.addAction(WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION);
-      context.registerReceiver(this, intentFilter);
-    }
-
-    // BroadcastReceiver
-    @Override
-    @SuppressLint("InlinedApi")
-    public void onReceive(Context context, Intent intent) {
-      if (WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION.equals(intent.getAction())) {
-        WifiP2pGroup wifiP2pGroup = intent.getParcelableExtra(WifiP2pManager.EXTRA_WIFI_P2P_GROUP);
-        onWifiP2pGroupChange(wifiP2pGroup);
-      } else if (WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION.equals(intent.getAction())) {
-        int state = intent.getIntExtra(WifiP2pManager.EXTRA_WIFI_STATE, 0 /* default to unknown */);
-        onWifiP2pStateChange(state);
-      }
-    }
-
-    /** Releases the broadcast receiver. */
-    public void release() {
-      context.unregisterReceiver(this);
-    }
-
-    public List<NetworkInformation> getActiveNetworkList() {
-      if (wifiP2pNetworkInfo != null) {
-        return Collections.singletonList(wifiP2pNetworkInfo);
-      }
-
-      return Collections.emptyList();
-    }
-
-    /** Handle a change notification about the wifi p2p group. */
-    private void onWifiP2pGroupChange(WifiP2pGroup wifiP2pGroup) {
-      if (wifiP2pGroup == null || wifiP2pGroup.getInterface() == null) {
-        return;
-      }
-
-      NetworkInterface wifiP2pInterface;
-      try {
-        wifiP2pInterface = NetworkInterface.getByName(wifiP2pGroup.getInterface());
-      } catch (SocketException e) {
-        Logging.e(TAG, "Unable to get WifiP2p network interface", e);
-        return;
-      }
-
-      List<InetAddress> interfaceAddresses = Collections.list(wifiP2pInterface.getInetAddresses());
-      IPAddress[] ipAddresses = new IPAddress[interfaceAddresses.size()];
-      for (int i = 0; i < interfaceAddresses.size(); ++i) {
-        ipAddresses[i] = new IPAddress(interfaceAddresses.get(i).getAddress());
-      }
-
-      wifiP2pNetworkInfo =
-          new NetworkInformation(
-              wifiP2pGroup.getInterface(),
-              ConnectionType.CONNECTION_WIFI,
-              WIFI_P2P_NETWORK_HANDLE,
-              ipAddresses);
-      observer.onNetworkConnect(wifiP2pNetworkInfo);
-    }
-
-    /** Handle a state change notification about wifi p2p. */
-    private void onWifiP2pStateChange(int state) {
-      if (state == WifiP2pManager.WIFI_P2P_STATE_DISABLED) {
-        wifiP2pNetworkInfo = null;
-        observer.onNetworkDisconnect(WIFI_P2P_NETWORK_HANDLE);
-      }
-    }
-  }
-
-  static final long INVALID_NET_ID = -1;
-  private static final String TAG = "NetworkMonitorAutoDetect";
-
-  // Observer for the connection type change.
-  private final Observer observer;
-  private final IntentFilter intentFilter;
-  private final Context context;
-  // Used to request mobile network. It does not do anything except for keeping
-  // the callback for releasing the request.
-  private final NetworkCallback mobileNetworkCallback;
-  // Used to receive updates on all networks.
-  private final NetworkCallback allNetworkCallback;
-  // connectivityManagerDelegate and wifiManagerDelegate are only non-final for testing.
-  private ConnectivityManagerDelegate connectivityManagerDelegate;
-  private WifiManagerDelegate wifiManagerDelegate;
-  private WifiDirectManagerDelegate wifiDirectManagerDelegate;
-
-  private boolean isRegistered;
-  private ConnectionType connectionType;
-  private String wifiSSID;
-
-  /**
-   * Observer interface by which observer is notified of network changes.
-   */
-  public static interface Observer {
-    /**
-     * Called when default network changes.
-     */
-    public void onConnectionTypeChanged(ConnectionType newConnectionType);
-    public void onNetworkConnect(NetworkInformation networkInfo);
-    public void onNetworkDisconnect(long networkHandle);
-  }
-
-  /**
-   * Constructs a NetworkMonitorAutoDetect. Should only be called on UI thread.
-   */
-  @SuppressLint("NewApi")
-  public NetworkMonitorAutoDetect(Observer observer, Context context) {
-    this.observer = observer;
-    this.context = context;
-    connectivityManagerDelegate = new ConnectivityManagerDelegate(context);
-    wifiManagerDelegate = new WifiManagerDelegate(context);
-
-    final NetworkState networkState = connectivityManagerDelegate.getNetworkState();
-    connectionType = getConnectionType(networkState);
-    wifiSSID = getWifiSSID(networkState);
-    intentFilter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
-
-    if (PeerConnectionFactory.fieldTrialsFindFullName("IncludeWifiDirect").equals("Enabled")) {
-      wifiDirectManagerDelegate = new WifiDirectManagerDelegate(observer, context);
-    }
-
-    registerReceiver();
-    if (connectivityManagerDelegate.supportNetworkCallback()) {
-      // On Android 6.0.0, the WRITE_SETTINGS permission is necessary for
-      // requestNetwork, so it will fail. This was fixed in Android 6.0.1.
-      NetworkCallback tempNetworkCallback = new NetworkCallback();
-      try {
-        connectivityManagerDelegate.requestMobileNetwork(tempNetworkCallback);
-      } catch (java.lang.SecurityException e) {
-        Logging.w(TAG, "Unable to obtain permission to request a cellular network.");
-        tempNetworkCallback = null;
-      }
-      mobileNetworkCallback = tempNetworkCallback;
-      allNetworkCallback = new SimpleNetworkCallback();
-      connectivityManagerDelegate.registerNetworkCallback(allNetworkCallback);
-    } else {
-      mobileNetworkCallback = null;
-      allNetworkCallback = null;
-    }
-  }
-
-  public boolean supportNetworkCallback() {
-    return connectivityManagerDelegate.supportNetworkCallback();
-  }
-
-  /**
-   * Allows overriding the ConnectivityManagerDelegate for tests.
-   */
-  void setConnectivityManagerDelegateForTests(ConnectivityManagerDelegate delegate) {
-    connectivityManagerDelegate = delegate;
-  }
-
-  /**
-   * Allows overriding the WifiManagerDelegate for tests.
-   */
-  void setWifiManagerDelegateForTests(WifiManagerDelegate delegate) {
-    wifiManagerDelegate = delegate;
-  }
-
-  /**
-   * Returns whether the object has registered to receive network connectivity intents.
-   * Visible for testing.
-   */
-  boolean isReceiverRegisteredForTesting() {
-    return isRegistered;
-  }
-
-  List<NetworkInformation> getActiveNetworkList() {
-    List<NetworkInformation> connectivityManagerList =
-        connectivityManagerDelegate.getActiveNetworkList();
-    if (connectivityManagerList == null) {
-      return null;
-    }
-    ArrayList<NetworkInformation> result =
-        new ArrayList<NetworkInformation>(connectivityManagerList);
-    if (wifiDirectManagerDelegate != null) {
-      result.addAll(wifiDirectManagerDelegate.getActiveNetworkList());
-    }
-    return result;
-  }
-
-  public void destroy() {
-    if (allNetworkCallback != null) {
-      connectivityManagerDelegate.releaseCallback(allNetworkCallback);
-    }
-    if (mobileNetworkCallback != null) {
-      connectivityManagerDelegate.releaseCallback(mobileNetworkCallback);
-    }
-    if (wifiDirectManagerDelegate != null) {
-      wifiDirectManagerDelegate.release();
-    }
-    unregisterReceiver();
-  }
-
-  /**
-   * Registers a BroadcastReceiver in the given context.
-   */
-  private void registerReceiver() {
-    if (isRegistered)
-      return;
-
-    isRegistered = true;
-    context.registerReceiver(this, intentFilter);
-  }
-
-  /**
-   * Unregisters the BroadcastReceiver in the given context.
-   */
-  private void unregisterReceiver() {
-    if (!isRegistered)
-      return;
-
-    isRegistered = false;
-    context.unregisterReceiver(this);
-  }
-
-  public NetworkState getCurrentNetworkState() {
-    return connectivityManagerDelegate.getNetworkState();
-  }
-
-  /**
-   * Returns NetID of device's current default connected network used for
-   * communication.
-   * Only implemented on Lollipop and newer releases, returns INVALID_NET_ID
-   * when not implemented.
-   */
-  public long getDefaultNetId() {
-    return connectivityManagerDelegate.getDefaultNetId();
-  }
-
-  public static ConnectionType getConnectionType(NetworkState networkState) {
-    if (!networkState.isConnected()) {
-      return ConnectionType.CONNECTION_NONE;
-    }
-
-    switch (networkState.getNetworkType()) {
-      case ConnectivityManager.TYPE_ETHERNET:
-        return ConnectionType.CONNECTION_ETHERNET;
-      case ConnectivityManager.TYPE_WIFI:
-        return ConnectionType.CONNECTION_WIFI;
-      case ConnectivityManager.TYPE_WIMAX:
-        return ConnectionType.CONNECTION_4G;
-      case ConnectivityManager.TYPE_BLUETOOTH:
-        return ConnectionType.CONNECTION_BLUETOOTH;
-      case ConnectivityManager.TYPE_MOBILE:
-        // Use information from TelephonyManager to classify the connection.
-        switch (networkState.getNetworkSubType()) {
-          case TelephonyManager.NETWORK_TYPE_GPRS:
-          case TelephonyManager.NETWORK_TYPE_EDGE:
-          case TelephonyManager.NETWORK_TYPE_CDMA:
-          case TelephonyManager.NETWORK_TYPE_1xRTT:
-          case TelephonyManager.NETWORK_TYPE_IDEN:
-            return ConnectionType.CONNECTION_2G;
-          case TelephonyManager.NETWORK_TYPE_UMTS:
-          case TelephonyManager.NETWORK_TYPE_EVDO_0:
-          case TelephonyManager.NETWORK_TYPE_EVDO_A:
-          case TelephonyManager.NETWORK_TYPE_HSDPA:
-          case TelephonyManager.NETWORK_TYPE_HSUPA:
-          case TelephonyManager.NETWORK_TYPE_HSPA:
-          case TelephonyManager.NETWORK_TYPE_EVDO_B:
-          case TelephonyManager.NETWORK_TYPE_EHRPD:
-          case TelephonyManager.NETWORK_TYPE_HSPAP:
-            return ConnectionType.CONNECTION_3G;
-          case TelephonyManager.NETWORK_TYPE_LTE:
-            return ConnectionType.CONNECTION_4G;
-          default:
-            return ConnectionType.CONNECTION_UNKNOWN_CELLULAR;
-        }
-      default:
-        return ConnectionType.CONNECTION_UNKNOWN;
-    }
-  }
-
-  private String getWifiSSID(NetworkState networkState) {
-    if (getConnectionType(networkState) != ConnectionType.CONNECTION_WIFI)
-      return "";
-    return wifiManagerDelegate.getWifiSSID();
-  }
-
-  // BroadcastReceiver
-  @Override
-  public void onReceive(Context context, Intent intent) {
-    final NetworkState networkState = getCurrentNetworkState();
-    if (ConnectivityManager.CONNECTIVITY_ACTION.equals(intent.getAction())) {
-      connectionTypeChanged(networkState);
-    }
-  }
-
-  private void connectionTypeChanged(NetworkState networkState) {
-    ConnectionType newConnectionType = getConnectionType(networkState);
-    String newWifiSSID = getWifiSSID(networkState);
-    if (newConnectionType == connectionType && newWifiSSID.equals(wifiSSID))
-      return;
-
-    connectionType = newConnectionType;
-    wifiSSID = newWifiSSID;
-    Logging.d(TAG, "Network connectivity changed, type is: " + connectionType);
-    observer.onConnectionTypeChanged(newConnectionType);
-  }
-
-  /**
-   * Extracts NetID of network on Lollipop and NetworkHandle (which is mungled
-   * NetID) on Marshmallow and newer releases. Only available on Lollipop and
-   * newer releases. Returns long since getNetworkHandle returns long.
-   */
-  @SuppressLint("NewApi")
-  private static long networkToNetId(Network network) {
-    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
-      return network.getNetworkHandle();
-    }
-
-    // NOTE(honghaiz): This depends on Android framework implementation details.
-    // These details cannot change because Lollipop has been released.
-    return Integer.parseInt(network.toString());
-  }
-}
diff --git a/sdk/android/api/org/webrtc/OWNERS b/sdk/android/api/org/webrtc/OWNERS
deleted file mode 100644
index e6ccc2d..0000000
--- a/sdk/android/api/org/webrtc/OWNERS
+++ /dev/null
@@ -1,3 +0,0 @@
-per-file Camera*=sakal@webrtc.org
-per-file Histogram.java=sakal@webrtc.org
-per-file Metrics.java=sakal@webrtc.org
diff --git a/sdk/android/api/org/webrtc/PeerConnection.java b/sdk/android/api/org/webrtc/PeerConnection.java
deleted file mode 100644
index 9ddfdfd..0000000
--- a/sdk/android/api/org/webrtc/PeerConnection.java
+++ /dev/null
@@ -1,553 +0,0 @@
-/*
- *  Copyright 2013 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.
- */
-
-package org.webrtc;
-
-import java.util.Collections;
-import java.util.LinkedList;
-import java.util.List;
-
-/**
- * Java-land version of the PeerConnection APIs; wraps the C++ API
- * http://www.webrtc.org/reference/native-apis, which in turn is inspired by the
- * JS APIs: http://dev.w3.org/2011/webrtc/editor/webrtc.html and
- * http://www.w3.org/TR/mediacapture-streams/
- */
-public class PeerConnection {
-  static {
-    System.loadLibrary("jingle_peerconnection_so");
-  }
-
-  /** Tracks PeerConnectionInterface::IceGatheringState */
-  public enum IceGatheringState { NEW, GATHERING, COMPLETE }
-
-  /** Tracks PeerConnectionInterface::IceConnectionState */
-  public enum IceConnectionState {
-    NEW,
-    CHECKING,
-    CONNECTED,
-    COMPLETED,
-    FAILED,
-    DISCONNECTED,
-    CLOSED
-  }
-
-  /** Tracks PeerConnectionInterface::TlsCertPolicy */
-  public enum TlsCertPolicy {
-    TLS_CERT_POLICY_SECURE,
-    TLS_CERT_POLICY_INSECURE_NO_CHECK,
-  }
-
-  /** Tracks PeerConnectionInterface::SignalingState */
-  public enum SignalingState {
-    STABLE,
-    HAVE_LOCAL_OFFER,
-    HAVE_LOCAL_PRANSWER,
-    HAVE_REMOTE_OFFER,
-    HAVE_REMOTE_PRANSWER,
-    CLOSED
-  }
-
-  /** Java version of PeerConnectionObserver. */
-  public static interface Observer {
-    /** Triggered when the SignalingState changes. */
-    public void onSignalingChange(SignalingState newState);
-
-    /** Triggered when the IceConnectionState changes. */
-    public void onIceConnectionChange(IceConnectionState newState);
-
-    /** Triggered when the ICE connection receiving status changes. */
-    public void onIceConnectionReceivingChange(boolean receiving);
-
-    /** Triggered when the IceGatheringState changes. */
-    public void onIceGatheringChange(IceGatheringState newState);
-
-    /** Triggered when a new ICE candidate has been found. */
-    public void onIceCandidate(IceCandidate candidate);
-
-    /** Triggered when some ICE candidates have been removed. */
-    public void onIceCandidatesRemoved(IceCandidate[] candidates);
-
-    /** Triggered when media is received on a new stream from remote peer. */
-    public void onAddStream(MediaStream stream);
-
-    /** Triggered when a remote peer close a stream. */
-    public void onRemoveStream(MediaStream stream);
-
-    /** Triggered when a remote peer opens a DataChannel. */
-    public void onDataChannel(DataChannel dataChannel);
-
-    /** Triggered when renegotiation is necessary. */
-    public void onRenegotiationNeeded();
-
-    /**
-     * Triggered when a new track is signaled by the remote peer, as a result of
-     * setRemoteDescription.
-     */
-    public void onAddTrack(RtpReceiver receiver, MediaStream[] mediaStreams);
-  }
-
-  /** Java version of PeerConnectionInterface.IceServer. */
-  public static class IceServer {
-    // List of URIs associated with this server. Valid formats are described
-    // in RFC7064 and RFC7065, and more may be added in the future. The "host"
-    // part of the URI may contain either an IP address or a hostname.
-    @Deprecated public final String uri;
-    public final List<String> urls;
-    public final String username;
-    public final String password;
-    public final TlsCertPolicy tlsCertPolicy;
-
-    // If the URIs in |urls| only contain IP addresses, this field can be used
-    // to indicate the hostname, which may be necessary for TLS (using the SNI
-    // extension). If |urls| itself contains the hostname, this isn't
-    // necessary.
-    public final String hostname;
-
-    // List of protocols to be used in the TLS ALPN extension.
-    public final List<String> tlsAlpnProtocols;
-
-    // List of elliptic curves to be used in the TLS elliptic curves extension.
-    // Only curve names supported by OpenSSL should be used (eg. "P-256","X25519").
-    public final List<String> tlsEllipticCurves;
-
-    /** Convenience constructor for STUN servers. */
-    @Deprecated
-    public IceServer(String uri) {
-      this(uri, "", "");
-    }
-
-    @Deprecated
-    public IceServer(String uri, String username, String password) {
-      this(uri, username, password, TlsCertPolicy.TLS_CERT_POLICY_SECURE);
-    }
-
-    @Deprecated
-    public IceServer(String uri, String username, String password, TlsCertPolicy tlsCertPolicy) {
-      this(uri, username, password, tlsCertPolicy, "");
-    }
-
-    @Deprecated
-    public IceServer(String uri, String username, String password, TlsCertPolicy tlsCertPolicy,
-        String hostname) {
-      this(uri, Collections.singletonList(uri), username, password, tlsCertPolicy, hostname, null,
-          null);
-    }
-
-    private IceServer(String uri, List<String> urls, String username, String password,
-        TlsCertPolicy tlsCertPolicy, String hostname, List<String> tlsAlpnProtocols,
-        List<String> tlsEllipticCurves) {
-      if (uri == null || urls == null || urls.isEmpty()) {
-        throw new IllegalArgumentException("uri == null || urls == null || urls.isEmpty()");
-      }
-      for (String it : urls) {
-        if (it == null) {
-          throw new IllegalArgumentException("urls element is null: " + urls);
-        }
-      }
-      if (username == null) {
-        throw new IllegalArgumentException("username == null");
-      }
-      if (password == null) {
-        throw new IllegalArgumentException("password == null");
-      }
-      if (hostname == null) {
-        throw new IllegalArgumentException("hostname == null");
-      }
-      this.uri = uri;
-      this.urls = urls;
-      this.username = username;
-      this.password = password;
-      this.tlsCertPolicy = tlsCertPolicy;
-      this.hostname = hostname;
-      this.tlsAlpnProtocols = tlsAlpnProtocols;
-      this.tlsEllipticCurves = tlsEllipticCurves;
-    }
-
-    public String toString() {
-      return urls + " [" + username + ":" + password + "] [" + tlsCertPolicy + "] [" + hostname
-          + "] [" + tlsAlpnProtocols + "] [" + tlsEllipticCurves + "]";
-    }
-
-    public static Builder builder(String uri) {
-      return new Builder(Collections.singletonList(uri));
-    }
-
-    public static Builder builder(List<String> urls) {
-      return new Builder(urls);
-    }
-
-    public static class Builder {
-      private final List<String> urls;
-      private String username = "";
-      private String password = "";
-      private TlsCertPolicy tlsCertPolicy = TlsCertPolicy.TLS_CERT_POLICY_SECURE;
-      private String hostname = "";
-      private List<String> tlsAlpnProtocols;
-      private List<String> tlsEllipticCurves;
-
-      private Builder(List<String> urls) {
-        if (urls == null || urls.isEmpty()) {
-          throw new IllegalArgumentException("urls == null || urls.isEmpty(): " + urls);
-        }
-        this.urls = urls;
-      }
-
-      public Builder setUsername(String username) {
-        this.username = username;
-        return this;
-      }
-
-      public Builder setPassword(String password) {
-        this.password = password;
-        return this;
-      }
-
-      public Builder setTlsCertPolicy(TlsCertPolicy tlsCertPolicy) {
-        this.tlsCertPolicy = tlsCertPolicy;
-        return this;
-      }
-
-      public Builder setHostname(String hostname) {
-        this.hostname = hostname;
-        return this;
-      }
-
-      public Builder setTlsAlpnProtocols(List<String> tlsAlpnProtocols) {
-        this.tlsAlpnProtocols = tlsAlpnProtocols;
-        return this;
-      }
-
-      public Builder setTlsEllipticCurves(List<String> tlsEllipticCurves) {
-        this.tlsEllipticCurves = tlsEllipticCurves;
-        return this;
-      }
-
-      public IceServer createIceServer() {
-        return new IceServer(urls.get(0), urls, username, password, tlsCertPolicy, hostname,
-            tlsAlpnProtocols, tlsEllipticCurves);
-      }
-    }
-  }
-
-  /** Java version of PeerConnectionInterface.IceTransportsType */
-  public enum IceTransportsType { NONE, RELAY, NOHOST, ALL }
-
-  /** Java version of PeerConnectionInterface.BundlePolicy */
-  public enum BundlePolicy { BALANCED, MAXBUNDLE, MAXCOMPAT }
-
-  /** Java version of PeerConnectionInterface.RtcpMuxPolicy */
-  public enum RtcpMuxPolicy { NEGOTIATE, REQUIRE }
-
-  /** Java version of PeerConnectionInterface.TcpCandidatePolicy */
-  public enum TcpCandidatePolicy { ENABLED, DISABLED }
-
-  /** Java version of PeerConnectionInterface.CandidateNetworkPolicy */
-  public enum CandidateNetworkPolicy { ALL, LOW_COST }
-
-  /** Java version of rtc::KeyType */
-  public enum KeyType { RSA, ECDSA }
-
-  /** Java version of PeerConnectionInterface.ContinualGatheringPolicy */
-  public enum ContinualGatheringPolicy { GATHER_ONCE, GATHER_CONTINUALLY }
-
-  /** Java version of rtc::IntervalRange */
-  public static class IntervalRange {
-    private final int min;
-    private final int max;
-
-    public IntervalRange(int min, int max) {
-      this.min = min;
-      this.max = max;
-    }
-
-    public int getMin() {
-      return min;
-    }
-
-    public int getMax() {
-      return max;
-    }
-  }
-
-  /** Java version of PeerConnectionInterface.RTCConfiguration */
-  public static class RTCConfiguration {
-    public IceTransportsType iceTransportsType;
-    public List<IceServer> iceServers;
-    public BundlePolicy bundlePolicy;
-    public RtcpMuxPolicy rtcpMuxPolicy;
-    public TcpCandidatePolicy tcpCandidatePolicy;
-    public CandidateNetworkPolicy candidateNetworkPolicy;
-    public int audioJitterBufferMaxPackets;
-    public boolean audioJitterBufferFastAccelerate;
-    public int iceConnectionReceivingTimeout;
-    public int iceBackupCandidatePairPingInterval;
-    public KeyType keyType;
-    public ContinualGatheringPolicy continualGatheringPolicy;
-    public int iceCandidatePoolSize;
-    public boolean pruneTurnPorts;
-    public boolean presumeWritableWhenFullyRelayed;
-    public Integer iceCheckMinInterval;
-    public boolean disableIPv6OnWifi;
-    // By default, PeerConnection will use a limited number of IPv6 network
-    // interfaces, in order to avoid too many ICE candidate pairs being created
-    // and delaying ICE completion.
-    //
-    // Can be set to Integer.MAX_VALUE to effectively disable the limit.
-    public int maxIPv6Networks;
-    public IntervalRange iceRegatherIntervalRange;
-
-    // TODO(deadbeef): Instead of duplicating the defaults here, we should do
-    // something to pick up the defaults from C++. The Objective-C equivalent
-    // of RTCConfiguration does that.
-    public RTCConfiguration(List<IceServer> iceServers) {
-      iceTransportsType = IceTransportsType.ALL;
-      bundlePolicy = BundlePolicy.BALANCED;
-      rtcpMuxPolicy = RtcpMuxPolicy.REQUIRE;
-      tcpCandidatePolicy = TcpCandidatePolicy.ENABLED;
-      candidateNetworkPolicy = candidateNetworkPolicy.ALL;
-      this.iceServers = iceServers;
-      audioJitterBufferMaxPackets = 50;
-      audioJitterBufferFastAccelerate = false;
-      iceConnectionReceivingTimeout = -1;
-      iceBackupCandidatePairPingInterval = -1;
-      keyType = KeyType.ECDSA;
-      continualGatheringPolicy = ContinualGatheringPolicy.GATHER_ONCE;
-      iceCandidatePoolSize = 0;
-      pruneTurnPorts = false;
-      presumeWritableWhenFullyRelayed = false;
-      iceCheckMinInterval = null;
-      disableIPv6OnWifi = false;
-      maxIPv6Networks = 5;
-      iceRegatherIntervalRange = null;
-    }
-  };
-
-  private final List<MediaStream> localStreams;
-  private final long nativePeerConnection;
-  private final long nativeObserver;
-  private List<RtpSender> senders;
-  private List<RtpReceiver> receivers;
-
-  PeerConnection(long nativePeerConnection, long nativeObserver) {
-    this.nativePeerConnection = nativePeerConnection;
-    this.nativeObserver = nativeObserver;
-    localStreams = new LinkedList<MediaStream>();
-    senders = new LinkedList<RtpSender>();
-    receivers = new LinkedList<RtpReceiver>();
-  }
-
-  // JsepInterface.
-  public native SessionDescription getLocalDescription();
-
-  public native SessionDescription getRemoteDescription();
-
-  public native DataChannel createDataChannel(String label, DataChannel.Init init);
-
-  public native void createOffer(SdpObserver observer, MediaConstraints constraints);
-
-  public native void createAnswer(SdpObserver observer, MediaConstraints constraints);
-
-  public native void setLocalDescription(SdpObserver observer, SessionDescription sdp);
-
-  public native void setRemoteDescription(SdpObserver observer, SessionDescription sdp);
-
-  public boolean setConfiguration(RTCConfiguration config) {
-    return nativeSetConfiguration(config, nativeObserver);
-  }
-
-  public boolean addIceCandidate(IceCandidate candidate) {
-    return nativeAddIceCandidate(candidate.sdpMid, candidate.sdpMLineIndex, candidate.sdp);
-  }
-
-  public boolean removeIceCandidates(final IceCandidate[] candidates) {
-    return nativeRemoveIceCandidates(candidates);
-  }
-
-  public boolean addStream(MediaStream stream) {
-    boolean ret = nativeAddLocalStream(stream.nativeStream);
-    if (!ret) {
-      return false;
-    }
-    localStreams.add(stream);
-    return true;
-  }
-
-  public void removeStream(MediaStream stream) {
-    nativeRemoveLocalStream(stream.nativeStream);
-    localStreams.remove(stream);
-  }
-
-  /**
-   * Creates an RtpSender without a track.
-   * <p>
-   * This method allows an application to cause the PeerConnection to negotiate
-   * sending/receiving a specific media type, but without having a track to
-   * send yet.
-   * <p>
-   * When the application does want to begin sending a track, it can call
-   * RtpSender.setTrack, which doesn't require any additional SDP negotiation.
-   * <p>
-   * Example use:
-   * <pre>
-   * {@code
-   * audioSender = pc.createSender("audio", "stream1");
-   * videoSender = pc.createSender("video", "stream1");
-   * // Do normal SDP offer/answer, which will kick off ICE/DTLS and negotiate
-   * // media parameters....
-   * // Later, when the endpoint is ready to actually begin sending:
-   * audioSender.setTrack(audioTrack, false);
-   * videoSender.setTrack(videoTrack, false);
-   * }
-   * </pre>
-   * Note: This corresponds most closely to "addTransceiver" in the official
-   * WebRTC API, in that it creates a sender without a track. It was
-   * implemented before addTransceiver because it provides useful
-   * functionality, and properly implementing transceivers would have required
-   * a great deal more work.
-   *
-   * @param kind      Corresponds to MediaStreamTrack kinds (must be "audio" or
-   *                  "video").
-   * @param stream_id The ID of the MediaStream that this sender's track will
-   *                  be associated with when SDP is applied to the remote
-   *                  PeerConnection. If createSender is used to create an
-   *                  audio and video sender that should be synchronized, they
-   *                  should use the same stream ID.
-   * @return          A new RtpSender object if successful, or null otherwise.
-   */
-  public RtpSender createSender(String kind, String stream_id) {
-    RtpSender new_sender = nativeCreateSender(kind, stream_id);
-    if (new_sender != null) {
-      senders.add(new_sender);
-    }
-    return new_sender;
-  }
-
-  // Note that calling getSenders will dispose of the senders previously
-  // returned (and same goes for getReceivers).
-  public List<RtpSender> getSenders() {
-    for (RtpSender sender : senders) {
-      sender.dispose();
-    }
-    senders = nativeGetSenders();
-    return Collections.unmodifiableList(senders);
-  }
-
-  public List<RtpReceiver> getReceivers() {
-    for (RtpReceiver receiver : receivers) {
-      receiver.dispose();
-    }
-    receivers = nativeGetReceivers();
-    return Collections.unmodifiableList(receivers);
-  }
-
-  // Older, non-standard implementation of getStats.
-  @Deprecated
-  public boolean getStats(StatsObserver observer, MediaStreamTrack track) {
-    return nativeOldGetStats(observer, (track == null) ? 0 : track.nativeTrack);
-  }
-
-  // Gets stats using the new stats collection API, see webrtc/api/stats/. These
-  // will replace old stats collection API when the new API has matured enough.
-  public void getStats(RTCStatsCollectorCallback callback) {
-    nativeNewGetStats(callback);
-  }
-
-  // Limits the bandwidth allocated for all RTP streams sent by this
-  // PeerConnection. Pass null to leave a value unchanged.
-  public native boolean setBitrate(Integer min, Integer current, Integer max);
-
-  // Starts recording an RTC event log. Ownership of the file is transfered to
-  // the native code. If an RTC event log is already being recorded, it will be
-  // stopped and a new one will start using the provided file. Logging will
-  // continue until the stopRtcEventLog function is called. The max_size_bytes
-  // argument is ignored, it is added for future use.
-  public boolean startRtcEventLog(int file_descriptor, int max_size_bytes) {
-    return nativeStartRtcEventLog(file_descriptor, max_size_bytes);
-  }
-
-  // Stops recording an RTC event log. If no RTC event log is currently being
-  // recorded, this call will have no effect.
-  public void stopRtcEventLog() {
-    nativeStopRtcEventLog();
-  }
-
-  // TODO(fischman): add support for DTMF-related methods once that API
-  // stabilizes.
-  public native SignalingState signalingState();
-
-  public native IceConnectionState iceConnectionState();
-
-  public native IceGatheringState iceGatheringState();
-
-  public native void close();
-
-  /**
-   * Free native resources associated with this PeerConnection instance.
-   * <p>
-   * This method removes a reference count from the C++ PeerConnection object,
-   * which should result in it being destroyed. It also calls equivalent
-   * "dispose" methods on the Java objects attached to this PeerConnection
-   * (streams, senders, receivers), such that their associated C++ objects
-   * will also be destroyed.
-   * <p>
-   * Note that this method cannot be safely called from an observer callback
-   * (PeerConnection.Observer, DataChannel.Observer, etc.). If you want to, for
-   * example, destroy the PeerConnection after an "ICE failed" callback, you
-   * must do this asynchronously (in other words, unwind the stack first). See
-   * <a href="https://bugs.chromium.org/p/webrtc/issues/detail?id=3721">bug
-   * 3721</a> for more details.
-   */
-  public void dispose() {
-    close();
-    for (MediaStream stream : localStreams) {
-      nativeRemoveLocalStream(stream.nativeStream);
-      stream.dispose();
-    }
-    localStreams.clear();
-    for (RtpSender sender : senders) {
-      sender.dispose();
-    }
-    senders.clear();
-    for (RtpReceiver receiver : receivers) {
-      receiver.dispose();
-    }
-    receivers.clear();
-    JniCommon.nativeReleaseRef(nativePeerConnection);
-    freeObserver(nativeObserver);
-  }
-
-  private static native void freeObserver(long nativeObserver);
-
-  public native boolean nativeSetConfiguration(RTCConfiguration config, long nativeObserver);
-
-  private native boolean nativeAddIceCandidate(
-      String sdpMid, int sdpMLineIndex, String iceCandidateSdp);
-
-  private native boolean nativeRemoveIceCandidates(final IceCandidate[] candidates);
-
-  private native boolean nativeAddLocalStream(long nativeStream);
-
-  private native void nativeRemoveLocalStream(long nativeStream);
-
-  private native boolean nativeOldGetStats(StatsObserver observer, long nativeTrack);
-
-  private native void nativeNewGetStats(RTCStatsCollectorCallback callback);
-
-  private native RtpSender nativeCreateSender(String kind, String stream_id);
-
-  private native List<RtpSender> nativeGetSenders();
-
-  private native List<RtpReceiver> nativeGetReceivers();
-
-  private native boolean nativeStartRtcEventLog(int file_descriptor, int max_size_bytes);
-
-  private native void nativeStopRtcEventLog();
-}
diff --git a/sdk/android/api/org/webrtc/PeerConnectionFactory.java b/sdk/android/api/org/webrtc/PeerConnectionFactory.java
deleted file mode 100644
index 59ee91c..0000000
--- a/sdk/android/api/org/webrtc/PeerConnectionFactory.java
+++ /dev/null
@@ -1,293 +0,0 @@
-/*
- *  Copyright 2013 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.
- */
-
-package org.webrtc;
-
-import android.content.Context;
-import java.util.List;
-
-/**
- * Java wrapper for a C++ PeerConnectionFactoryInterface.  Main entry point to
- * the PeerConnection API for clients.
- */
-public class PeerConnectionFactory {
-  private static volatile boolean nativeLibLoaded;
-
-  static {
-    try {
-      System.loadLibrary("jingle_peerconnection_so");
-      nativeLibLoaded = true;
-    } catch (UnsatisfiedLinkError t) {
-      nativeLibLoaded = false;
-    }
-  }
-
-  public static final String TRIAL_ENABLED = "Enabled";
-  public static final String VIDEO_FRAME_EMIT_TRIAL = "VideoFrameEmit";
-
-  private static final String TAG = "PeerConnectionFactory";
-  private static final String VIDEO_CAPTURER_THREAD_NAME = "VideoCapturerThread";
-  private final long nativeFactory;
-  private static Context applicationContext;
-  private static Thread networkThread;
-  private static Thread workerThread;
-  private static Thread signalingThread;
-  private EglBase localEglbase;
-  private EglBase remoteEglbase;
-
-  public static class Options {
-    // Keep in sync with webrtc/rtc_base/network.h!
-    static final int ADAPTER_TYPE_UNKNOWN = 0;
-    static final int ADAPTER_TYPE_ETHERNET = 1 << 0;
-    static final int ADAPTER_TYPE_WIFI = 1 << 1;
-    static final int ADAPTER_TYPE_CELLULAR = 1 << 2;
-    static final int ADAPTER_TYPE_VPN = 1 << 3;
-    static final int ADAPTER_TYPE_LOOPBACK = 1 << 4;
-
-    public int networkIgnoreMask;
-    public boolean disableEncryption;
-    public boolean disableNetworkMonitor;
-  }
-
-  // Must be called at least once before creating a PeerConnectionFactory
-  // (for example, at application startup time).
-  public static native void nativeInitializeAndroidGlobals(
-      Context context, boolean videoHwAcceleration);
-
-  public static void initializeAndroidGlobals(Context context, boolean videoHwAcceleration) {
-    ContextUtils.initialize(context);
-    nativeInitializeAndroidGlobals(context, videoHwAcceleration);
-  }
-
-  // Older signature of initializeAndroidGlobals. The extra parameters are now meaningless.
-  @Deprecated
-  public static boolean initializeAndroidGlobals(Object context, boolean initializeAudio,
-      boolean initializeVideo, boolean videoHwAcceleration) {
-    initializeAndroidGlobals((Context) context, videoHwAcceleration);
-    return true;
-  }
-
-  // Field trial initialization. Must be called before PeerConnectionFactory
-  // is created.
-  public static native void initializeFieldTrials(String fieldTrialsInitString);
-  // Wrapper of webrtc::field_trial::FindFullName. Develop the feature with default behaviour off.
-  // Example usage:
-  // if (PeerConnectionFactory.fieldTrialsFindFullName("WebRTCExperiment").equals("Enabled")) {
-  //   method1();
-  // } else {
-  //   method2();
-  // }
-  public static String fieldTrialsFindFullName(String name) {
-    return nativeLibLoaded ? nativeFieldTrialsFindFullName(name) : "";
-  }
-  private static native String nativeFieldTrialsFindFullName(String name);
-  // Internal tracing initialization. Must be called before PeerConnectionFactory is created to
-  // prevent racing with tracing code.
-  public static native void initializeInternalTracer();
-  // Internal tracing shutdown, called to prevent resource leaks. Must be called after
-  // PeerConnectionFactory is gone to prevent races with code performing tracing.
-  public static native void shutdownInternalTracer();
-  // Start/stop internal capturing of internal tracing.
-  public static native boolean startInternalTracingCapture(String tracing_filename);
-  public static native void stopInternalTracingCapture();
-
-  @Deprecated
-  public PeerConnectionFactory() {
-    this(null);
-  }
-
-  // Note: initializeAndroidGlobals must be called at least once before
-  // constructing a PeerConnectionFactory.
-  public PeerConnectionFactory(Options options) {
-    this(options, null /* encoderFactory */, null /* decoderFactory */);
-  }
-
-  public PeerConnectionFactory(
-      Options options, VideoEncoderFactory encoderFactory, VideoDecoderFactory decoderFactory) {
-    nativeFactory = nativeCreatePeerConnectionFactory(options, encoderFactory, decoderFactory);
-    if (nativeFactory == 0) {
-      throw new RuntimeException("Failed to initialize PeerConnectionFactory!");
-    }
-  }
-
-  public PeerConnection createPeerConnection(PeerConnection.RTCConfiguration rtcConfig,
-      MediaConstraints constraints, PeerConnection.Observer observer) {
-    long nativeObserver = nativeCreateObserver(observer);
-    if (nativeObserver == 0) {
-      return null;
-    }
-    long nativePeerConnection =
-        nativeCreatePeerConnection(nativeFactory, rtcConfig, constraints, nativeObserver);
-    if (nativePeerConnection == 0) {
-      return null;
-    }
-    return new PeerConnection(nativePeerConnection, nativeObserver);
-  }
-
-  public PeerConnection createPeerConnection(List<PeerConnection.IceServer> iceServers,
-      MediaConstraints constraints, PeerConnection.Observer observer) {
-    PeerConnection.RTCConfiguration rtcConfig = new PeerConnection.RTCConfiguration(iceServers);
-    return createPeerConnection(rtcConfig, constraints, observer);
-  }
-
-  public MediaStream createLocalMediaStream(String label) {
-    return new MediaStream(nativeCreateLocalMediaStream(nativeFactory, label));
-  }
-
-  public VideoSource createVideoSource(VideoCapturer capturer) {
-    final EglBase.Context eglContext =
-        localEglbase == null ? null : localEglbase.getEglBaseContext();
-    final SurfaceTextureHelper surfaceTextureHelper =
-        SurfaceTextureHelper.create(VIDEO_CAPTURER_THREAD_NAME, eglContext);
-    long nativeAndroidVideoTrackSource =
-        nativeCreateVideoSource(nativeFactory, surfaceTextureHelper, capturer.isScreencast());
-    VideoCapturer.CapturerObserver capturerObserver =
-        new AndroidVideoTrackSourceObserver(nativeAndroidVideoTrackSource);
-    capturer.initialize(
-        surfaceTextureHelper, ContextUtils.getApplicationContext(), capturerObserver);
-    return new VideoSource(nativeAndroidVideoTrackSource);
-  }
-
-  public VideoTrack createVideoTrack(String id, VideoSource source) {
-    return new VideoTrack(nativeCreateVideoTrack(nativeFactory, id, source.nativeSource));
-  }
-
-  public AudioSource createAudioSource(MediaConstraints constraints) {
-    return new AudioSource(nativeCreateAudioSource(nativeFactory, constraints));
-  }
-
-  public AudioTrack createAudioTrack(String id, AudioSource source) {
-    return new AudioTrack(nativeCreateAudioTrack(nativeFactory, id, source.nativeSource));
-  }
-
-  // Starts recording an AEC dump. Ownership of the file is transfered to the
-  // native code. If an AEC dump is already in progress, it will be stopped and
-  // a new one will start using the provided file.
-  public boolean startAecDump(int file_descriptor, int filesize_limit_bytes) {
-    return nativeStartAecDump(nativeFactory, file_descriptor, filesize_limit_bytes);
-  }
-
-  // Stops recording an AEC dump. If no AEC dump is currently being recorded,
-  // this call will have no effect.
-  public void stopAecDump() {
-    nativeStopAecDump(nativeFactory);
-  }
-
-  @Deprecated
-  public void setOptions(Options options) {
-    nativeSetOptions(nativeFactory, options);
-  }
-
-  /** Set the EGL context used by HW Video encoding and decoding.
-   *
-   * @param localEglContext   Must be the same as used by VideoCapturerAndroid and any local video
-   *                          renderer.
-   * @param remoteEglContext  Must be the same as used by any remote video renderer.
-   */
-  public void setVideoHwAccelerationOptions(
-      EglBase.Context localEglContext, EglBase.Context remoteEglContext) {
-    if (localEglbase != null) {
-      Logging.w(TAG, "Egl context already set.");
-      localEglbase.release();
-    }
-    if (remoteEglbase != null) {
-      Logging.w(TAG, "Egl context already set.");
-      remoteEglbase.release();
-    }
-    localEglbase = EglBase.create(localEglContext);
-    remoteEglbase = EglBase.create(remoteEglContext);
-    nativeSetVideoHwAccelerationOptions(
-        nativeFactory, localEglbase.getEglBaseContext(), remoteEglbase.getEglBaseContext());
-  }
-
-  public void dispose() {
-    nativeFreeFactory(nativeFactory);
-    networkThread = null;
-    workerThread = null;
-    signalingThread = null;
-    if (localEglbase != null)
-      localEglbase.release();
-    if (remoteEglbase != null)
-      remoteEglbase.release();
-  }
-
-  public void threadsCallbacks() {
-    nativeThreadsCallbacks(nativeFactory);
-  }
-
-  private static void printStackTrace(Thread thread, String threadName) {
-    if (thread != null) {
-      StackTraceElement[] stackTraces = thread.getStackTrace();
-      if (stackTraces.length > 0) {
-        Logging.d(TAG, threadName + " stacks trace:");
-        for (StackTraceElement stackTrace : stackTraces) {
-          Logging.d(TAG, stackTrace.toString());
-        }
-      }
-    }
-  }
-
-  public static void printStackTraces() {
-    printStackTrace(networkThread, "Network thread");
-    printStackTrace(workerThread, "Worker thread");
-    printStackTrace(signalingThread, "Signaling thread");
-  }
-
-  private static void onNetworkThreadReady() {
-    networkThread = Thread.currentThread();
-    Logging.d(TAG, "onNetworkThreadReady");
-  }
-
-  private static void onWorkerThreadReady() {
-    workerThread = Thread.currentThread();
-    Logging.d(TAG, "onWorkerThreadReady");
-  }
-
-  private static void onSignalingThreadReady() {
-    signalingThread = Thread.currentThread();
-    Logging.d(TAG, "onSignalingThreadReady");
-  }
-
-  private static native long nativeCreatePeerConnectionFactory(
-      Options options, VideoEncoderFactory encoderFactory, VideoDecoderFactory decoderFactory);
-
-  private static native long nativeCreateObserver(PeerConnection.Observer observer);
-
-  private static native long nativeCreatePeerConnection(long nativeFactory,
-      PeerConnection.RTCConfiguration rtcConfig, MediaConstraints constraints, long nativeObserver);
-
-  private static native long nativeCreateLocalMediaStream(long nativeFactory, String label);
-
-  private static native long nativeCreateVideoSource(
-      long nativeFactory, SurfaceTextureHelper surfaceTextureHelper, boolean is_screencast);
-
-  private static native long nativeCreateVideoTrack(
-      long nativeFactory, String id, long nativeVideoSource);
-
-  private static native long nativeCreateAudioSource(
-      long nativeFactory, MediaConstraints constraints);
-
-  private static native long nativeCreateAudioTrack(
-      long nativeFactory, String id, long nativeSource);
-
-  private static native boolean nativeStartAecDump(
-      long nativeFactory, int file_descriptor, int filesize_limit_bytes);
-
-  private static native void nativeStopAecDump(long nativeFactory);
-
-  @Deprecated public native void nativeSetOptions(long nativeFactory, Options options);
-
-  private static native void nativeSetVideoHwAccelerationOptions(
-      long nativeFactory, Object localEGLContext, Object remoteEGLContext);
-
-  private static native void nativeThreadsCallbacks(long nativeFactory);
-
-  private static native void nativeFreeFactory(long nativeFactory);
-}
diff --git a/sdk/android/api/org/webrtc/RTCStats.java b/sdk/android/api/org/webrtc/RTCStats.java
deleted file mode 100644
index c7035a1..0000000
--- a/sdk/android/api/org/webrtc/RTCStats.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- *  Copyright 2017 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.
- */
-
-package org.webrtc;
-
-import java.util.Map;
-
-/**
- * Java version of webrtc::RTCStats. Represents an RTCStats object, as
- * described in https://w3c.github.io/webrtc-stats/. The |id|, |timestampUs|
- * and |type| accessors have the same meaning for this class as for the
- * RTCStats dictionary. Each RTCStatsReport produced by getStats contains
- * multiple RTCStats objects; one for each underlying object (codec, stream,
- * transport, etc.) that was inspected to produce the stats.
- */
-public class RTCStats {
-  private final long timestampUs;
-  private final String type;
-  private final String id;
-  private final Map<String, Object> members;
-
-  public RTCStats(long timestampUs, String type, String id, Map<String, Object> members) {
-    this.timestampUs = timestampUs;
-    this.type = type;
-    this.id = id;
-    this.members = members;
-  }
-
-  // Timestamp in microseconds.
-  public double getTimestampUs() {
-    return timestampUs;
-  }
-
-  // Equivalent to RTCStatsType in the stats spec. Indicates the type of the
-  // object that was inspected to produce the stats.
-  public String getType() {
-    return type;
-  }
-
-  // Unique ID representing this stats object. May be referred to by members of
-  // other stats objects.
-  public String getId() {
-    return id;
-  }
-
-  /**
-   * Returns map of member names to values. Returns as an ordered map so that
-   * the stats object can be serialized with a consistent ordering.
-   *
-   * Values will be one of the following objects:
-   * - Boolean
-   * - Integer (for 32-bit signed integers)
-   * - Long (for 32-bit unsigned and 64-bit signed integers)
-   * - BigInteger (for 64-bit unsigned integers)
-   * - Double
-   * - String
-   * - The array form of any of the above (e.g., Integer[])
-   */
-  public Map<String, Object> getMembers() {
-    return members;
-  }
-
-  public String toString() {
-    StringBuilder builder = new StringBuilder();
-    builder.append("{ timestampUs: ")
-        .append(timestampUs)
-        .append(", type: ")
-        .append(type)
-        .append(", id: ")
-        .append(id);
-    boolean first = true;
-    for (Map.Entry<String, Object> entry : members.entrySet()) {
-      builder.append(", ").append(entry.getKey()).append(": ");
-      appendValue(builder, entry.getValue());
-    }
-    builder.append(" }");
-    return builder.toString();
-  }
-
-  private static void appendValue(StringBuilder builder, Object value) {
-    if (value instanceof Object[]) {
-      Object[] arrayValue = (Object[]) value;
-      builder.append('[');
-      for (int i = 0; i < arrayValue.length; ++i) {
-        if (i != 0) {
-          builder.append(", ");
-        }
-        appendValue(builder, arrayValue[i]);
-      }
-      builder.append(']');
-    } else if (value instanceof String) {
-      // Enclose strings in quotes to make it clear they're strings.
-      builder.append('"').append(value).append('"');
-    } else {
-      builder.append(value);
-    }
-  }
-}
diff --git a/sdk/android/api/org/webrtc/RTCStatsCollectorCallback.java b/sdk/android/api/org/webrtc/RTCStatsCollectorCallback.java
deleted file mode 100644
index 027c158..0000000
--- a/sdk/android/api/org/webrtc/RTCStatsCollectorCallback.java
+++ /dev/null
@@ -1,17 +0,0 @@
-/*
- *  Copyright 2017 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.
- */
-
-package org.webrtc;
-
-/** Interface for receiving stats reports (see webrtc::RTCStatsCollectorCallback). */
-public interface RTCStatsCollectorCallback {
-  /** Called when the stats report is ready. */
-  public void onStatsDelivered(RTCStatsReport report);
-}
diff --git a/sdk/android/api/org/webrtc/RTCStatsReport.java b/sdk/android/api/org/webrtc/RTCStatsReport.java
deleted file mode 100644
index 00a7c02..0000000
--- a/sdk/android/api/org/webrtc/RTCStatsReport.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- *  Copyright 2017 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.
- */
-
-package org.webrtc;
-
-import java.util.Map;
-
-/**
- * Java version of webrtc::RTCStatsReport. Each RTCStatsReport produced by
- * getStats contains multiple RTCStats objects; one for each underlying object
- * (codec, stream, transport, etc.) that was inspected to produce the stats.
- */
-public class RTCStatsReport {
-  private final long timestampUs;
-  private final Map<String, RTCStats> stats;
-
-  public RTCStatsReport(long timestampUs, Map<String, RTCStats> stats) {
-    this.timestampUs = timestampUs;
-    this.stats = stats;
-  }
-
-  // Timestamp in microseconds.
-  public double getTimestampUs() {
-    return timestampUs;
-  }
-
-  // Map of stats object IDs to stats objects. Can be used to easily look up
-  // other stats objects, when they refer to each other by ID.
-  public Map<String, RTCStats> getStatsMap() {
-    return stats;
-  }
-
-  public String toString() {
-    StringBuilder builder = new StringBuilder();
-    builder.append("{ timestampUs: ").append(timestampUs).append(", stats: [\n");
-    boolean first = true;
-    for (RTCStats stat : stats.values()) {
-      if (!first) {
-        builder.append(",\n");
-      }
-      builder.append(stat);
-      first = false;
-    }
-    builder.append(" ] }");
-    return builder.toString();
-  }
-}
diff --git a/sdk/android/api/org/webrtc/RendererCommon.java b/sdk/android/api/org/webrtc/RendererCommon.java
deleted file mode 100644
index 0554f11..0000000
--- a/sdk/android/api/org/webrtc/RendererCommon.java
+++ /dev/null
@@ -1,290 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-package org.webrtc;
-
-import android.graphics.Point;
-import android.opengl.Matrix;
-import android.view.View;
-
-/**
- * Static helper functions for renderer implementations.
- */
-public class RendererCommon {
-  /** Interface for reporting rendering events. */
-  public static interface RendererEvents {
-    /**
-     * Callback fired once first frame is rendered.
-     */
-    public void onFirstFrameRendered();
-
-    /**
-     * Callback fired when rendered frame resolution or rotation has changed.
-     */
-    public void onFrameResolutionChanged(int videoWidth, int videoHeight, int rotation);
-  }
-
-  /** Interface for rendering frames on an EGLSurface. */
-  public static interface GlDrawer {
-    /**
-     * Functions for drawing frames with different sources. The rendering surface target is
-     * implied by the current EGL context of the calling thread and requires no explicit argument.
-     * The coordinates specify the viewport location on the surface target.
-     */
-    void drawOes(int oesTextureId, float[] texMatrix, int frameWidth, int frameHeight,
-        int viewportX, int viewportY, int viewportWidth, int viewportHeight);
-    void drawRgb(int textureId, float[] texMatrix, int frameWidth, int frameHeight, int viewportX,
-        int viewportY, int viewportWidth, int viewportHeight);
-    void drawYuv(int[] yuvTextures, float[] texMatrix, int frameWidth, int frameHeight,
-        int viewportX, int viewportY, int viewportWidth, int viewportHeight);
-
-    /**
-     * Release all GL resources. This needs to be done manually, otherwise resources may leak.
-     */
-    void release();
-  }
-
-  /**
-   * Helper class for determining layout size based on layout requirements, scaling type, and video
-   * aspect ratio.
-   */
-  public static class VideoLayoutMeasure {
-    // The scaling type determines how the video will fill the allowed layout area in measure(). It
-    // can be specified separately for the case when video has matched orientation with layout size
-    // and when there is an orientation mismatch.
-    private ScalingType scalingTypeMatchOrientation = ScalingType.SCALE_ASPECT_BALANCED;
-    private ScalingType scalingTypeMismatchOrientation = ScalingType.SCALE_ASPECT_BALANCED;
-
-    public void setScalingType(ScalingType scalingType) {
-      this.scalingTypeMatchOrientation = scalingType;
-      this.scalingTypeMismatchOrientation = scalingType;
-    }
-
-    public void setScalingType(
-        ScalingType scalingTypeMatchOrientation, ScalingType scalingTypeMismatchOrientation) {
-      this.scalingTypeMatchOrientation = scalingTypeMatchOrientation;
-      this.scalingTypeMismatchOrientation = scalingTypeMismatchOrientation;
-    }
-
-    public Point measure(int widthSpec, int heightSpec, int frameWidth, int frameHeight) {
-      // Calculate max allowed layout size.
-      final int maxWidth = View.getDefaultSize(Integer.MAX_VALUE, widthSpec);
-      final int maxHeight = View.getDefaultSize(Integer.MAX_VALUE, heightSpec);
-      if (frameWidth == 0 || frameHeight == 0 || maxWidth == 0 || maxHeight == 0) {
-        return new Point(maxWidth, maxHeight);
-      }
-      // Calculate desired display size based on scaling type, video aspect ratio,
-      // and maximum layout size.
-      final float frameAspect = frameWidth / (float) frameHeight;
-      final float displayAspect = maxWidth / (float) maxHeight;
-      final ScalingType scalingType = (frameAspect > 1.0f) == (displayAspect > 1.0f)
-          ? scalingTypeMatchOrientation
-          : scalingTypeMismatchOrientation;
-      final Point layoutSize = getDisplaySize(scalingType, frameAspect, maxWidth, maxHeight);
-
-      // If the measure specification is forcing a specific size - yield.
-      if (View.MeasureSpec.getMode(widthSpec) == View.MeasureSpec.EXACTLY) {
-        layoutSize.x = maxWidth;
-      }
-      if (View.MeasureSpec.getMode(heightSpec) == View.MeasureSpec.EXACTLY) {
-        layoutSize.y = maxHeight;
-      }
-      return layoutSize;
-    }
-  }
-
-  // Types of video scaling:
-  // SCALE_ASPECT_FIT - video frame is scaled to fit the size of the view by
-  //    maintaining the aspect ratio (black borders may be displayed).
-  // SCALE_ASPECT_FILL - video frame is scaled to fill the size of the view by
-  //    maintaining the aspect ratio. Some portion of the video frame may be
-  //    clipped.
-  // SCALE_ASPECT_BALANCED - Compromise between FIT and FILL. Video frame will fill as much as
-  // possible of the view while maintaining aspect ratio, under the constraint that at least
-  // |BALANCED_VISIBLE_FRACTION| of the frame content will be shown.
-  public static enum ScalingType { SCALE_ASPECT_FIT, SCALE_ASPECT_FILL, SCALE_ASPECT_BALANCED }
-  // The minimum fraction of the frame content that will be shown for |SCALE_ASPECT_BALANCED|.
-  // This limits excessive cropping when adjusting display size.
-  private static float BALANCED_VISIBLE_FRACTION = 0.5625f;
-  // clang-format off
-  public static final float[] identityMatrix() {
-    return new float[] {
-        1, 0, 0, 0,
-        0, 1, 0, 0,
-        0, 0, 1, 0,
-        0, 0, 0, 1};
-  }
-  // Matrix with transform y' = 1 - y.
-  public static final float[] verticalFlipMatrix() {
-    return new float[] {
-        1,  0, 0, 0,
-        0, -1, 0, 0,
-        0,  0, 1, 0,
-        0,  1, 0, 1};
-  }
-
-  // Matrix with transform x' = 1 - x.
-  public static final float[] horizontalFlipMatrix() {
-    return new float[] {
-        -1, 0, 0, 0,
-         0, 1, 0, 0,
-         0, 0, 1, 0,
-         1, 0, 0, 1};
-  }
-  // clang-format on
-
-  /**
-   * Returns texture matrix that will have the effect of rotating the frame |rotationDegree|
-   * clockwise when rendered.
-   */
-  public static float[] rotateTextureMatrix(float[] textureMatrix, float rotationDegree) {
-    final float[] rotationMatrix = new float[16];
-    Matrix.setRotateM(rotationMatrix, 0, rotationDegree, 0, 0, 1);
-    adjustOrigin(rotationMatrix);
-    return multiplyMatrices(textureMatrix, rotationMatrix);
-  }
-
-  /**
-   * Returns new matrix with the result of a * b.
-   */
-  public static float[] multiplyMatrices(float[] a, float[] b) {
-    final float[] resultMatrix = new float[16];
-    Matrix.multiplyMM(resultMatrix, 0, a, 0, b, 0);
-    return resultMatrix;
-  }
-
-  /**
-   * Returns layout transformation matrix that applies an optional mirror effect and compensates
-   * for video vs display aspect ratio.
-   */
-  public static float[] getLayoutMatrix(
-      boolean mirror, float videoAspectRatio, float displayAspectRatio) {
-    float scaleX = 1;
-    float scaleY = 1;
-    // Scale X or Y dimension so that video and display size have same aspect ratio.
-    if (displayAspectRatio > videoAspectRatio) {
-      scaleY = videoAspectRatio / displayAspectRatio;
-    } else {
-      scaleX = displayAspectRatio / videoAspectRatio;
-    }
-    // Apply optional horizontal flip.
-    if (mirror) {
-      scaleX *= -1;
-    }
-    final float matrix[] = new float[16];
-    Matrix.setIdentityM(matrix, 0);
-    Matrix.scaleM(matrix, 0, scaleX, scaleY, 1);
-    adjustOrigin(matrix);
-    return matrix;
-  }
-
-  /** Converts a float[16] matrix array to android.graphics.Matrix. */
-  public static android.graphics.Matrix convertMatrixToAndroidGraphicsMatrix(float[] matrix4x4) {
-    // clang-format off
-    float[] values = {
-        matrix4x4[0 * 4 + 0], matrix4x4[1 * 4 + 0], matrix4x4[3 * 4 + 0],
-        matrix4x4[0 * 4 + 1], matrix4x4[1 * 4 + 1], matrix4x4[3 * 4 + 1],
-        matrix4x4[0 * 4 + 3], matrix4x4[1 * 4 + 3], matrix4x4[3 * 4 + 3],
-    };
-    // clang-format on
-
-    android.graphics.Matrix matrix = new android.graphics.Matrix();
-    matrix.setValues(values);
-    return matrix;
-  }
-
-  /** Converts android.graphics.Matrix to a float[16] matrix array. */
-  public static float[] convertMatrixFromAndroidGraphicsMatrix(android.graphics.Matrix matrix) {
-    float[] values = new float[9];
-    matrix.getValues(values);
-
-    // The android.graphics.Matrix looks like this:
-    // [x1 y1 w1]
-    // [x2 y2 w2]
-    // [x3 y3 w3]
-    // We want to contruct a matrix that looks like this:
-    // [x1 y1  0 w1]
-    // [x2 y2  0 w2]
-    // [ 0  0  1  0]
-    // [x3 y3  0 w3]
-    // Since it is stored in column-major order, it looks like this:
-    // [x1 x2 0 x3
-    //  y1 y2 0 y3
-    //   0  0 1  0
-    //  w1 w2 0 w3]
-    // clang-format off
-    float[] matrix4x4 = {
-        values[0 * 3 + 0],  values[1 * 3 + 0], 0,  values[2 * 3 + 0],
-        values[0 * 3 + 1],  values[1 * 3 + 1], 0,  values[2 * 3 + 1],
-        0,                  0,                 1,  0,
-        values[0 * 3 + 2],  values[1 * 3 + 2], 0,  values[2 * 3 + 2],
-    };
-    // clang-format on
-    return matrix4x4;
-  }
-
-  /**
-   * Calculate display size based on scaling type, video aspect ratio, and maximum display size.
-   */
-  public static Point getDisplaySize(
-      ScalingType scalingType, float videoAspectRatio, int maxDisplayWidth, int maxDisplayHeight) {
-    return getDisplaySize(convertScalingTypeToVisibleFraction(scalingType), videoAspectRatio,
-        maxDisplayWidth, maxDisplayHeight);
-  }
-
-  /**
-   * Move |matrix| transformation origin to (0.5, 0.5). This is the origin for texture coordinates
-   * that are in the range 0 to 1.
-   */
-  private static void adjustOrigin(float[] matrix) {
-    // Note that OpenGL is using column-major order.
-    // Pre translate with -0.5 to move coordinates to range [-0.5, 0.5].
-    matrix[12] -= 0.5f * (matrix[0] + matrix[4]);
-    matrix[13] -= 0.5f * (matrix[1] + matrix[5]);
-    // Post translate with 0.5 to move coordinates to range [0, 1].
-    matrix[12] += 0.5f;
-    matrix[13] += 0.5f;
-  }
-
-  /**
-   * Each scaling type has a one-to-one correspondence to a numeric minimum fraction of the video
-   * that must remain visible.
-   */
-  private static float convertScalingTypeToVisibleFraction(ScalingType scalingType) {
-    switch (scalingType) {
-      case SCALE_ASPECT_FIT:
-        return 1.0f;
-      case SCALE_ASPECT_FILL:
-        return 0.0f;
-      case SCALE_ASPECT_BALANCED:
-        return BALANCED_VISIBLE_FRACTION;
-      default:
-        throw new IllegalArgumentException();
-    }
-  }
-
-  /**
-   * Calculate display size based on minimum fraction of the video that must remain visible,
-   * video aspect ratio, and maximum display size.
-   */
-  private static Point getDisplaySize(
-      float minVisibleFraction, float videoAspectRatio, int maxDisplayWidth, int maxDisplayHeight) {
-    // If there is no constraint on the amount of cropping, fill the allowed display area.
-    if (minVisibleFraction == 0 || videoAspectRatio == 0) {
-      return new Point(maxDisplayWidth, maxDisplayHeight);
-    }
-    // Each dimension is constrained on max display size and how much we are allowed to crop.
-    final int width = Math.min(
-        maxDisplayWidth, Math.round(maxDisplayHeight / minVisibleFraction * videoAspectRatio));
-    final int height = Math.min(
-        maxDisplayHeight, Math.round(maxDisplayWidth / minVisibleFraction / videoAspectRatio));
-    return new Point(width, height);
-  }
-}
diff --git a/sdk/android/api/org/webrtc/RtpParameters.java b/sdk/android/api/org/webrtc/RtpParameters.java
deleted file mode 100644
index fde2b35..0000000
--- a/sdk/android/api/org/webrtc/RtpParameters.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- *  Copyright 2013 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.
- */
-
-package org.webrtc;
-
-import java.util.LinkedList;
-
-/**
- * The parameters for an {@code RtpSender}, as defined in
- * http://w3c.github.io/webrtc-pc/#rtcrtpsender-interface.
- *
- * Note: These structures use nullable Integer/etc. types because in the
- * future, they may be used to construct ORTC RtpSender/RtpReceivers, in
- * which case "null" will be used to represent "choose the implementation
- * default value".
- */
-public class RtpParameters {
-  public static class Encoding {
-    // Set to true to cause this encoding to be sent, and false for it not to
-    // be sent.
-    public boolean active = true;
-    // If non-null, this represents the Transport Independent Application
-    // Specific maximum bandwidth defined in RFC3890. If null, there is no
-    // maximum bitrate.
-    public Integer maxBitrateBps;
-    // SSRC to be used by this encoding.
-    // Can't be changed between getParameters/setParameters.
-    public Long ssrc;
-  }
-
-  public static class Codec {
-    // Payload type used to identify this codec in RTP packets.
-    public int payloadType;
-    // Name used to identify the codec. Equivalent to MIME subtype.
-    public String name;
-    // The media type of this codec. Equivalent to MIME top-level type.
-    MediaStreamTrack.MediaType kind;
-    // Clock rate in Hertz.
-    public Integer clockRate;
-    // The number of audio channels used. Set to null for video codecs.
-    public Integer numChannels;
-  }
-
-  public final LinkedList<Encoding> encodings;
-  // Codec parameters can't currently be changed between getParameters and
-  // setParameters. Though in the future it will be possible to reorder them or
-  // remove them.
-  public final LinkedList<Codec> codecs;
-
-  public RtpParameters() {
-    encodings = new LinkedList<Encoding>();
-    codecs = new LinkedList<Codec>();
-  }
-}
diff --git a/sdk/android/api/org/webrtc/RtpReceiver.java b/sdk/android/api/org/webrtc/RtpReceiver.java
deleted file mode 100644
index 69dfd92..0000000
--- a/sdk/android/api/org/webrtc/RtpReceiver.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-package org.webrtc;
-
-/** Java wrapper for a C++ RtpReceiverInterface. */
-public class RtpReceiver {
-  /** Java wrapper for a C++ RtpReceiverObserverInterface*/
-  public static interface Observer {
-    // Called when the first audio or video packet is received.
-    public void onFirstPacketReceived(MediaStreamTrack.MediaType media_type);
-  }
-
-  final long nativeRtpReceiver;
-  private long nativeObserver;
-
-  private MediaStreamTrack cachedTrack;
-
-  public RtpReceiver(long nativeRtpReceiver) {
-    this.nativeRtpReceiver = nativeRtpReceiver;
-    long track = nativeGetTrack(nativeRtpReceiver);
-    // We can assume that an RtpReceiver always has an associated track.
-    cachedTrack = new MediaStreamTrack(track);
-  }
-
-  public MediaStreamTrack track() {
-    return cachedTrack;
-  }
-
-  public boolean setParameters(RtpParameters parameters) {
-    return nativeSetParameters(nativeRtpReceiver, parameters);
-  }
-
-  public RtpParameters getParameters() {
-    return nativeGetParameters(nativeRtpReceiver);
-  }
-
-  public String id() {
-    return nativeId(nativeRtpReceiver);
-  }
-
-  public void dispose() {
-    cachedTrack.dispose();
-    if (nativeObserver != 0) {
-      nativeUnsetObserver(nativeRtpReceiver, nativeObserver);
-      nativeObserver = 0;
-    }
-    JniCommon.nativeReleaseRef(nativeRtpReceiver);
-  }
-
-  public void SetObserver(Observer observer) {
-    // Unset the existing one before setting a new one.
-    if (nativeObserver != 0) {
-      nativeUnsetObserver(nativeRtpReceiver, nativeObserver);
-    }
-    nativeObserver = nativeSetObserver(nativeRtpReceiver, observer);
-  }
-
-  // This should increment the reference count of the track.
-  // Will be released in dispose().
-  private static native long nativeGetTrack(long nativeRtpReceiver);
-
-  private static native boolean nativeSetParameters(
-      long nativeRtpReceiver, RtpParameters parameters);
-
-  private static native RtpParameters nativeGetParameters(long nativeRtpReceiver);
-
-  private static native String nativeId(long nativeRtpReceiver);
-
-  private static native long nativeSetObserver(long nativeRtpReceiver, Observer observer);
-
-  private static native long nativeUnsetObserver(long nativeRtpReceiver, long nativeObserver);
-};
diff --git a/sdk/android/api/org/webrtc/RtpSender.java b/sdk/android/api/org/webrtc/RtpSender.java
deleted file mode 100644
index fbb62db..0000000
--- a/sdk/android/api/org/webrtc/RtpSender.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-package org.webrtc;
-
-/** Java wrapper for a C++ RtpSenderInterface. */
-public class RtpSender {
-  final long nativeRtpSender;
-
-  private MediaStreamTrack cachedTrack;
-  private boolean ownsTrack = true;
-
-  private final DtmfSender dtmfSender;
-
-  public RtpSender(long nativeRtpSender) {
-    this.nativeRtpSender = nativeRtpSender;
-    long track = nativeGetTrack(nativeRtpSender);
-    // It may be possible for an RtpSender to be created without a track.
-    cachedTrack = (track != 0) ? new MediaStreamTrack(track) : null;
-
-    long nativeDtmfSender = nativeGetDtmfSender(nativeRtpSender);
-    dtmfSender = (nativeDtmfSender != 0) ? new DtmfSender(nativeDtmfSender) : null;
-  }
-
-  /**
-   * Starts sending a new track, without requiring additional SDP negotiation.
-   * <p>
-   * Note: This is equivalent to replaceTrack in the official WebRTC API. It
-   * was just implemented before the standards group settled on a name.
-   *
-   * @param takeOwnership If true, the RtpSender takes ownership of the track
-   *                      from the caller, and will auto-dispose of it when no
-   *                      longer needed. |takeOwnership| should only be used if
-   *                      the caller owns the track; it is not appropriate when
-   *                      the track is owned by, for example, another RtpSender
-   *                      or a MediaStream.
-   * @return              true on success and false on failure.
-   */
-  public boolean setTrack(MediaStreamTrack track, boolean takeOwnership) {
-    if (!nativeSetTrack(nativeRtpSender, (track == null) ? 0 : track.nativeTrack)) {
-      return false;
-    }
-    if (cachedTrack != null && ownsTrack) {
-      cachedTrack.dispose();
-    }
-    cachedTrack = track;
-    ownsTrack = takeOwnership;
-    return true;
-  }
-
-  public MediaStreamTrack track() {
-    return cachedTrack;
-  }
-
-  public boolean setParameters(RtpParameters parameters) {
-    return nativeSetParameters(nativeRtpSender, parameters);
-  }
-
-  public RtpParameters getParameters() {
-    return nativeGetParameters(nativeRtpSender);
-  }
-
-  public String id() {
-    return nativeId(nativeRtpSender);
-  }
-
-  public DtmfSender dtmf() {
-    return dtmfSender;
-  }
-
-  public void dispose() {
-    if (dtmfSender != null) {
-      dtmfSender.dispose();
-    }
-    if (cachedTrack != null && ownsTrack) {
-      cachedTrack.dispose();
-    }
-    JniCommon.nativeReleaseRef(nativeRtpSender);
-  }
-
-  private static native boolean nativeSetTrack(long nativeRtpSender, long nativeTrack);
-
-  // This should increment the reference count of the track.
-  // Will be released in dispose() or setTrack().
-  private static native long nativeGetTrack(long nativeRtpSender);
-
-  // This should increment the reference count of the DTMF sender.
-  // Will be released in dispose().
-  private static native long nativeGetDtmfSender(long nativeRtpSender);
-
-  private static native boolean nativeSetParameters(long nativeRtpSender, RtpParameters parameters);
-
-  private static native RtpParameters nativeGetParameters(long nativeRtpSender);
-
-  private static native String nativeId(long nativeRtpSender);
-};
diff --git a/sdk/android/api/org/webrtc/ScreenCapturerAndroid.java b/sdk/android/api/org/webrtc/ScreenCapturerAndroid.java
deleted file mode 100644
index 08d34dd..0000000
--- a/sdk/android/api/org/webrtc/ScreenCapturerAndroid.java
+++ /dev/null
@@ -1,203 +0,0 @@
-/*
- *  Copyright 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.
- */
-
-package org.webrtc;
-
-import android.annotation.TargetApi;
-import android.app.Activity;
-import android.content.Context;
-import android.content.Intent;
-import android.hardware.display.DisplayManager;
-import android.hardware.display.VirtualDisplay;
-import android.media.projection.MediaProjection;
-import android.media.projection.MediaProjectionManager;
-import android.view.Surface;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * An implementation of VideoCapturer to capture the screen content as a video stream.
- * Capturing is done by {@code MediaProjection} on a {@code SurfaceTexture}. We interact with this
- * {@code SurfaceTexture} using a {@code SurfaceTextureHelper}.
- * The {@code SurfaceTextureHelper} is created by the native code and passed to this capturer in
- * {@code VideoCapturer.initialize()}. On receiving a new frame, this capturer passes it
- * as a texture to the native code via {@code CapturerObserver.onTextureFrameCaptured()}. This takes
- * place on the HandlerThread of the given {@code SurfaceTextureHelper}. When done with each frame,
- * the native code returns the buffer to the  {@code SurfaceTextureHelper} to be used for new
- * frames. At any time, at most one frame is being processed.
- */
-@TargetApi(21)
-public class ScreenCapturerAndroid
-    implements VideoCapturer, SurfaceTextureHelper.OnTextureFrameAvailableListener {
-  private static final int DISPLAY_FLAGS =
-      DisplayManager.VIRTUAL_DISPLAY_FLAG_PUBLIC | DisplayManager.VIRTUAL_DISPLAY_FLAG_PRESENTATION;
-  // DPI for VirtualDisplay, does not seem to matter for us.
-  private static final int VIRTUAL_DISPLAY_DPI = 400;
-
-  private final Intent mediaProjectionPermissionResultData;
-  private final MediaProjection.Callback mediaProjectionCallback;
-
-  private int width;
-  private int height;
-  private VirtualDisplay virtualDisplay;
-  private SurfaceTextureHelper surfaceTextureHelper;
-  private CapturerObserver capturerObserver;
-  private long numCapturedFrames = 0;
-  private MediaProjection mediaProjection;
-  private boolean isDisposed = false;
-  private MediaProjectionManager mediaProjectionManager;
-
-  /**
-   * Constructs a new Screen Capturer.
-   *
-   * @param mediaProjectionPermissionResultData the result data of MediaProjection permission
-   *     activity; the calling app must validate that result code is Activity.RESULT_OK before
-   *     calling this method.
-   * @param mediaProjectionCallback MediaProjection callback to implement application specific
-   *     logic in events such as when the user revokes a previously granted capture permission.
-  **/
-  public ScreenCapturerAndroid(Intent mediaProjectionPermissionResultData,
-      MediaProjection.Callback mediaProjectionCallback) {
-    this.mediaProjectionPermissionResultData = mediaProjectionPermissionResultData;
-    this.mediaProjectionCallback = mediaProjectionCallback;
-  }
-
-  private void checkNotDisposed() {
-    if (isDisposed) {
-      throw new RuntimeException("capturer is disposed.");
-    }
-  }
-
-  @Override
-  public synchronized void initialize(final SurfaceTextureHelper surfaceTextureHelper,
-      final Context applicationContext, final VideoCapturer.CapturerObserver capturerObserver) {
-    checkNotDisposed();
-
-    if (capturerObserver == null) {
-      throw new RuntimeException("capturerObserver not set.");
-    }
-    this.capturerObserver = capturerObserver;
-
-    if (surfaceTextureHelper == null) {
-      throw new RuntimeException("surfaceTextureHelper not set.");
-    }
-    this.surfaceTextureHelper = surfaceTextureHelper;
-
-    mediaProjectionManager = (MediaProjectionManager) applicationContext.getSystemService(
-        Context.MEDIA_PROJECTION_SERVICE);
-  }
-
-  @Override
-  public synchronized void startCapture(
-      final int width, final int height, final int ignoredFramerate) {
-    checkNotDisposed();
-
-    this.width = width;
-    this.height = height;
-
-    mediaProjection = mediaProjectionManager.getMediaProjection(
-        Activity.RESULT_OK, mediaProjectionPermissionResultData);
-
-    // Let MediaProjection callback use the SurfaceTextureHelper thread.
-    mediaProjection.registerCallback(mediaProjectionCallback, surfaceTextureHelper.getHandler());
-
-    createVirtualDisplay();
-    capturerObserver.onCapturerStarted(true);
-    surfaceTextureHelper.startListening(ScreenCapturerAndroid.this);
-  }
-
-  @Override
-  public synchronized void stopCapture() {
-    checkNotDisposed();
-    ThreadUtils.invokeAtFrontUninterruptibly(surfaceTextureHelper.getHandler(), new Runnable() {
-      @Override
-      public void run() {
-        surfaceTextureHelper.stopListening();
-        capturerObserver.onCapturerStopped();
-
-        if (virtualDisplay != null) {
-          virtualDisplay.release();
-          virtualDisplay = null;
-        }
-
-        if (mediaProjection != null) {
-          // Unregister the callback before stopping, otherwise the callback recursively
-          // calls this method.
-          mediaProjection.unregisterCallback(mediaProjectionCallback);
-          mediaProjection.stop();
-          mediaProjection = null;
-        }
-      }
-    });
-  }
-
-  @Override
-  public synchronized void dispose() {
-    isDisposed = true;
-  }
-
-  /**
-   * Changes output video format. This method can be used to scale the output
-   * video, or to change orientation when the captured screen is rotated for example.
-   *
-   * @param width new output video width
-   * @param height new output video height
-   * @param ignoredFramerate ignored
-   */
-  @Override
-  public synchronized void changeCaptureFormat(
-      final int width, final int height, final int ignoredFramerate) {
-    checkNotDisposed();
-
-    this.width = width;
-    this.height = height;
-
-    if (virtualDisplay == null) {
-      // Capturer is stopped, the virtual display will be created in startCaptuer().
-      return;
-    }
-
-    // Create a new virtual display on the surfaceTextureHelper thread to avoid interference
-    // with frame processing, which happens on the same thread (we serialize events by running
-    // them on the same thread).
-    ThreadUtils.invokeAtFrontUninterruptibly(surfaceTextureHelper.getHandler(), new Runnable() {
-      @Override
-      public void run() {
-        virtualDisplay.release();
-        createVirtualDisplay();
-      }
-    });
-  }
-
-  private void createVirtualDisplay() {
-    surfaceTextureHelper.getSurfaceTexture().setDefaultBufferSize(width, height);
-    virtualDisplay = mediaProjection.createVirtualDisplay("WebRTC_ScreenCapture", width, height,
-        VIRTUAL_DISPLAY_DPI, DISPLAY_FLAGS, new Surface(surfaceTextureHelper.getSurfaceTexture()),
-        null /* callback */, null /* callback handler */);
-  }
-
-  // This is called on the internal looper thread of {@Code SurfaceTextureHelper}.
-  @Override
-  public void onTextureFrameAvailable(int oesTextureId, float[] transformMatrix, long timestampNs) {
-    numCapturedFrames++;
-    capturerObserver.onTextureFrameCaptured(
-        width, height, oesTextureId, transformMatrix, 0 /* rotation */, timestampNs);
-  }
-
-  @Override
-  public boolean isScreencast() {
-    return true;
-  }
-
-  public long getNumCapturedFrames() {
-    return numCapturedFrames;
-  }
-}
diff --git a/sdk/android/api/org/webrtc/SdpObserver.java b/sdk/android/api/org/webrtc/SdpObserver.java
deleted file mode 100644
index a9c03f7..0000000
--- a/sdk/android/api/org/webrtc/SdpObserver.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- *  Copyright 2013 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.
- */
-
-package org.webrtc;
-
-/** Interface for observing SDP-related events. */
-public interface SdpObserver {
-  /** Called on success of Create{Offer,Answer}(). */
-  public void onCreateSuccess(SessionDescription sdp);
-
-  /** Called on success of Set{Local,Remote}Description(). */
-  public void onSetSuccess();
-
-  /** Called on error of Create{Offer,Answer}(). */
-  public void onCreateFailure(String error);
-
-  /** Called on error of Set{Local,Remote}Description(). */
-  public void onSetFailure(String error);
-}
diff --git a/sdk/android/api/org/webrtc/SessionDescription.java b/sdk/android/api/org/webrtc/SessionDescription.java
deleted file mode 100644
index 7367085..0000000
--- a/sdk/android/api/org/webrtc/SessionDescription.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- *  Copyright 2013 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.
- */
-
-package org.webrtc;
-
-import java.util.Locale;
-
-/**
- * Description of an RFC 4566 Session.
- * SDPs are passed as serialized Strings in Java-land and are materialized
- * to SessionDescriptionInterface as appropriate in the JNI layer.
- */
-public class SessionDescription {
-  /** Java-land enum version of SessionDescriptionInterface's type() string. */
-  public static enum Type {
-    OFFER,
-    PRANSWER,
-    ANSWER;
-
-    public String canonicalForm() {
-      return name().toLowerCase(Locale.US);
-    }
-
-    public static Type fromCanonicalForm(String canonical) {
-      return Type.valueOf(Type.class, canonical.toUpperCase(Locale.US));
-    }
-  }
-
-  public final Type type;
-  public final String description;
-
-  public SessionDescription(Type type, String description) {
-    this.type = type;
-    this.description = description;
-  }
-}
diff --git a/sdk/android/api/org/webrtc/StatsObserver.java b/sdk/android/api/org/webrtc/StatsObserver.java
deleted file mode 100644
index b1ad0de..0000000
--- a/sdk/android/api/org/webrtc/StatsObserver.java
+++ /dev/null
@@ -1,17 +0,0 @@
-/*
- *  Copyright 2013 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.
- */
-
-package org.webrtc;
-
-/** Interface for observing Stats reports (see webrtc::StatsObservers). */
-public interface StatsObserver {
-  /** Called when the reports are ready.*/
-  public void onComplete(StatsReport[] reports);
-}
diff --git a/sdk/android/api/org/webrtc/StatsReport.java b/sdk/android/api/org/webrtc/StatsReport.java
deleted file mode 100644
index a72ea5d..0000000
--- a/sdk/android/api/org/webrtc/StatsReport.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- *  Copyright 2013 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.
- */
-
-package org.webrtc;
-
-/** Java version of webrtc::StatsReport. */
-public class StatsReport {
-  /** Java version of webrtc::StatsReport::Value. */
-  public static class Value {
-    public final String name;
-    public final String value;
-
-    public Value(String name, String value) {
-      this.name = name;
-      this.value = value;
-    }
-
-    public String toString() {
-      StringBuilder builder = new StringBuilder();
-      builder.append("[").append(name).append(": ").append(value).append("]");
-      return builder.toString();
-    }
-  }
-
-  public final String id;
-  public final String type;
-  // Time since 1970-01-01T00:00:00Z in milliseconds.
-  public final double timestamp;
-  public final Value[] values;
-
-  public StatsReport(String id, String type, double timestamp, Value[] values) {
-    this.id = id;
-    this.type = type;
-    this.timestamp = timestamp;
-    this.values = values;
-  }
-
-  public String toString() {
-    StringBuilder builder = new StringBuilder();
-    builder.append("id: ")
-        .append(id)
-        .append(", type: ")
-        .append(type)
-        .append(", timestamp: ")
-        .append(timestamp)
-        .append(", values: ");
-    for (int i = 0; i < values.length; ++i) {
-      builder.append(values[i].toString()).append(", ");
-    }
-    return builder.toString();
-  }
-}
diff --git a/sdk/android/api/org/webrtc/SurfaceTextureHelper.java b/sdk/android/api/org/webrtc/SurfaceTextureHelper.java
deleted file mode 100644
index 1fbc53f..0000000
--- a/sdk/android/api/org/webrtc/SurfaceTextureHelper.java
+++ /dev/null
@@ -1,311 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-package org.webrtc;
-
-import android.annotation.TargetApi;
-import android.graphics.Matrix;
-import android.graphics.SurfaceTexture;
-import android.opengl.GLES11Ext;
-import android.opengl.GLES20;
-import android.os.Build;
-import android.os.Handler;
-import android.os.HandlerThread;
-import android.os.SystemClock;
-import java.nio.ByteBuffer;
-import java.nio.FloatBuffer;
-import java.util.concurrent.Callable;
-import java.util.concurrent.TimeUnit;
-import org.webrtc.VideoFrame.I420Buffer;
-import org.webrtc.VideoFrame.TextureBuffer;
-
-/**
- * Helper class to create and synchronize access to a SurfaceTexture. The caller will get notified
- * of new frames in onTextureFrameAvailable(), and should call returnTextureFrame() when done with
- * the frame. Only one texture frame can be in flight at once, so returnTextureFrame() must be
- * called in order to receive a new frame. Call stopListening() to stop receiveing new frames. Call
- * dispose to release all resources once the texture frame is returned.
- * Note that there is a C++ counter part of this class that optionally can be used. It is used for
- * wrapping texture frames into webrtc::VideoFrames and also handles calling returnTextureFrame()
- * when the webrtc::VideoFrame is no longer used.
- */
-public class SurfaceTextureHelper {
-  private static final String TAG = "SurfaceTextureHelper";
-  /**
-   * Callback interface for being notified that a new texture frame is available. The calls will be
-   * made on the SurfaceTextureHelper handler thread, with a bound EGLContext. The callee is not
-   * allowed to make another EGLContext current on the calling thread.
-   */
-  public interface OnTextureFrameAvailableListener {
-    abstract void onTextureFrameAvailable(
-        int oesTextureId, float[] transformMatrix, long timestampNs);
-  }
-
-  /**
-   * Construct a new SurfaceTextureHelper sharing OpenGL resources with |sharedContext|. A dedicated
-   * thread and handler is created for handling the SurfaceTexture. May return null if EGL fails to
-   * initialize a pixel buffer surface and make it current.
-   */
-  public static SurfaceTextureHelper create(
-      final String threadName, final EglBase.Context sharedContext) {
-    final HandlerThread thread = new HandlerThread(threadName);
-    thread.start();
-    final Handler handler = new Handler(thread.getLooper());
-
-    // The onFrameAvailable() callback will be executed on the SurfaceTexture ctor thread. See:
-    // http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/5.1.1_r1/android/graphics/SurfaceTexture.java#195.
-    // Therefore, in order to control the callback thread on API lvl < 21, the SurfaceTextureHelper
-    // is constructed on the |handler| thread.
-    return ThreadUtils.invokeAtFrontUninterruptibly(handler, new Callable<SurfaceTextureHelper>() {
-      @Override
-      public SurfaceTextureHelper call() {
-        try {
-          return new SurfaceTextureHelper(sharedContext, handler);
-        } catch (RuntimeException e) {
-          Logging.e(TAG, threadName + " create failure", e);
-          return null;
-        }
-      }
-    });
-  }
-
-  private final Handler handler;
-  private final EglBase eglBase;
-  private final SurfaceTexture surfaceTexture;
-  private final int oesTextureId;
-  private YuvConverter yuvConverter;
-
-  // These variables are only accessed from the |handler| thread.
-  private OnTextureFrameAvailableListener listener;
-  // The possible states of this class.
-  private boolean hasPendingTexture = false;
-  private volatile boolean isTextureInUse = false;
-  private boolean isQuitting = false;
-  // |pendingListener| is set in setListener() and the runnable is posted to the handler thread.
-  // setListener() is not allowed to be called again before stopListening(), so this is thread safe.
-  private OnTextureFrameAvailableListener pendingListener;
-  final Runnable setListenerRunnable = new Runnable() {
-    @Override
-    public void run() {
-      Logging.d(TAG, "Setting listener to " + pendingListener);
-      listener = pendingListener;
-      pendingListener = null;
-      // May have a pending frame from the previous capture session - drop it.
-      if (hasPendingTexture) {
-        // Calling updateTexImage() is neccessary in order to receive new frames.
-        updateTexImage();
-        hasPendingTexture = false;
-      }
-    }
-  };
-
-  private SurfaceTextureHelper(EglBase.Context sharedContext, Handler handler) {
-    if (handler.getLooper().getThread() != Thread.currentThread()) {
-      throw new IllegalStateException("SurfaceTextureHelper must be created on the handler thread");
-    }
-    this.handler = handler;
-
-    eglBase = EglBase.create(sharedContext, EglBase.CONFIG_PIXEL_BUFFER);
-    try {
-      // Both these statements have been observed to fail on rare occasions, see BUG=webrtc:5682.
-      eglBase.createDummyPbufferSurface();
-      eglBase.makeCurrent();
-    } catch (RuntimeException e) {
-      // Clean up before rethrowing the exception.
-      eglBase.release();
-      handler.getLooper().quit();
-      throw e;
-    }
-
-    oesTextureId = GlUtil.generateTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES);
-    surfaceTexture = new SurfaceTexture(oesTextureId);
-    setOnFrameAvailableListener(surfaceTexture, (SurfaceTexture st) -> {
-      hasPendingTexture = true;
-      tryDeliverTextureFrame();
-    }, handler);
-  }
-
-  @TargetApi(21)
-  private static void setOnFrameAvailableListener(SurfaceTexture surfaceTexture,
-      SurfaceTexture.OnFrameAvailableListener listener, Handler handler) {
-    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
-      surfaceTexture.setOnFrameAvailableListener(listener, handler);
-    } else {
-      // The documentation states that the listener will be called on an arbitrary thread, but in
-      // pratice, it is always the thread on which the SurfaceTexture was constructed. There are
-      // assertions in place in case this ever changes. For API >= 21, we use the new API to
-      // explicitly specify the handler.
-      surfaceTexture.setOnFrameAvailableListener(listener);
-    }
-  }
-
-  /**
-   * Start to stream textures to the given |listener|. If you need to change listener, you need to
-   * call stopListening() first.
-   */
-  public void startListening(final OnTextureFrameAvailableListener listener) {
-    if (this.listener != null || this.pendingListener != null) {
-      throw new IllegalStateException("SurfaceTextureHelper listener has already been set.");
-    }
-    this.pendingListener = listener;
-    handler.post(setListenerRunnable);
-  }
-
-  /**
-   * Stop listening. The listener set in startListening() is guaranteded to not receive any more
-   * onTextureFrameAvailable() callbacks after this function returns.
-   */
-  public void stopListening() {
-    Logging.d(TAG, "stopListening()");
-    handler.removeCallbacks(setListenerRunnable);
-    ThreadUtils.invokeAtFrontUninterruptibly(handler, new Runnable() {
-      @Override
-      public void run() {
-        listener = null;
-        pendingListener = null;
-      }
-    });
-  }
-
-  /**
-   * Retrieve the underlying SurfaceTexture. The SurfaceTexture should be passed in to a video
-   * producer such as a camera or decoder.
-   */
-  public SurfaceTexture getSurfaceTexture() {
-    return surfaceTexture;
-  }
-
-  /**
-   * Retrieve the handler that calls onTextureFrameAvailable(). This handler is valid until
-   * dispose() is called.
-   */
-  public Handler getHandler() {
-    return handler;
-  }
-
-  /**
-   * Call this function to signal that you are done with the frame received in
-   * onTextureFrameAvailable(). Only one texture frame can be in flight at once, so you must call
-   * this function in order to receive a new frame.
-   */
-  public void returnTextureFrame() {
-    handler.post(new Runnable() {
-      @Override
-      public void run() {
-        isTextureInUse = false;
-        if (isQuitting) {
-          release();
-        } else {
-          tryDeliverTextureFrame();
-        }
-      }
-    });
-  }
-
-  public boolean isTextureInUse() {
-    return isTextureInUse;
-  }
-
-  /**
-   * Call disconnect() to stop receiving frames. OpenGL resources are released and the handler is
-   * stopped when the texture frame has been returned by a call to returnTextureFrame(). You are
-   * guaranteed to not receive any more onTextureFrameAvailable() after this function returns.
-   */
-  public void dispose() {
-    Logging.d(TAG, "dispose()");
-    ThreadUtils.invokeAtFrontUninterruptibly(handler, new Runnable() {
-      @Override
-      public void run() {
-        isQuitting = true;
-        if (!isTextureInUse) {
-          release();
-        }
-      }
-    });
-  }
-
-  public void textureToYUV(final ByteBuffer buf, final int width, final int height,
-      final int stride, final int textureId, final float[] transformMatrix) {
-    if (textureId != oesTextureId) {
-      throw new IllegalStateException("textureToByteBuffer called with unexpected textureId");
-    }
-
-    ThreadUtils.invokeAtFrontUninterruptibly(handler, new Runnable() {
-      @Override
-      public void run() {
-        if (yuvConverter == null) {
-          yuvConverter = new YuvConverter();
-        }
-        yuvConverter.convert(buf, width, height, stride, textureId, transformMatrix);
-      }
-    });
-  }
-
-  private void updateTexImage() {
-    // SurfaceTexture.updateTexImage apparently can compete and deadlock with eglSwapBuffers,
-    // as observed on Nexus 5. Therefore, synchronize it with the EGL functions.
-    // See https://bugs.chromium.org/p/webrtc/issues/detail?id=5702 for more info.
-    synchronized (EglBase.lock) {
-      surfaceTexture.updateTexImage();
-    }
-  }
-
-  private void tryDeliverTextureFrame() {
-    if (handler.getLooper().getThread() != Thread.currentThread()) {
-      throw new IllegalStateException("Wrong thread.");
-    }
-    if (isQuitting || !hasPendingTexture || isTextureInUse || listener == null) {
-      return;
-    }
-    isTextureInUse = true;
-    hasPendingTexture = false;
-
-    updateTexImage();
-
-    final float[] transformMatrix = new float[16];
-    surfaceTexture.getTransformMatrix(transformMatrix);
-    final long timestampNs = surfaceTexture.getTimestamp();
-    listener.onTextureFrameAvailable(oesTextureId, transformMatrix, timestampNs);
-  }
-
-  private void release() {
-    if (handler.getLooper().getThread() != Thread.currentThread()) {
-      throw new IllegalStateException("Wrong thread.");
-    }
-    if (isTextureInUse || !isQuitting) {
-      throw new IllegalStateException("Unexpected release.");
-    }
-    if (yuvConverter != null) {
-      yuvConverter.release();
-    }
-    GLES20.glDeleteTextures(1, new int[] {oesTextureId}, 0);
-    surfaceTexture.release();
-    eglBase.release();
-    handler.getLooper().quit();
-  }
-
-  /**
-   * Creates a VideoFrame buffer backed by this helper's texture. The |width| and |height| should
-   * match the dimensions of the data placed in the texture. The correct |transformMatrix| may be
-   * obtained from callbacks to OnTextureFrameAvailableListener.
-   *
-   * The returned TextureBuffer holds a reference to the SurfaceTextureHelper that created it. The
-   * buffer calls returnTextureFrame() when it is released.
-   */
-  public TextureBuffer createTextureBuffer(int width, int height, Matrix transformMatrix) {
-    return new TextureBufferImpl(
-        width, height, TextureBuffer.Type.OES, oesTextureId, transformMatrix, this, new Runnable() {
-          @Override
-          public void run() {
-            returnTextureFrame();
-          }
-        });
-  }
-}
diff --git a/sdk/android/api/org/webrtc/SurfaceViewRenderer.java b/sdk/android/api/org/webrtc/SurfaceViewRenderer.java
deleted file mode 100644
index f664b01..0000000
--- a/sdk/android/api/org/webrtc/SurfaceViewRenderer.java
+++ /dev/null
@@ -1,385 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-package org.webrtc;
-
-import android.content.Context;
-import android.content.res.Resources.NotFoundException;
-import android.graphics.Point;
-import android.util.AttributeSet;
-import android.view.SurfaceHolder;
-import android.view.SurfaceView;
-import java.util.concurrent.CountDownLatch;
-
-/**
- * Implements org.webrtc.VideoRenderer.Callbacks by displaying the video stream on a SurfaceView.
- * renderFrame() is asynchronous to avoid blocking the calling thread.
- * This class is thread safe and handles access from potentially four different threads:
- * Interaction from the main app in init, release, setMirror, and setScalingtype.
- * Interaction from C++ rtc::VideoSinkInterface in renderFrame.
- * Interaction from the Activity lifecycle in surfaceCreated, surfaceChanged, and surfaceDestroyed.
- * Interaction with the layout framework in onMeasure and onSizeChanged.
- */
-public class SurfaceViewRenderer
-    extends SurfaceView implements SurfaceHolder.Callback, VideoRenderer.Callbacks, VideoSink {
-  private static final String TAG = "SurfaceViewRenderer";
-
-  // Cached resource name.
-  private final String resourceName;
-  private final RendererCommon.VideoLayoutMeasure videoLayoutMeasure =
-      new RendererCommon.VideoLayoutMeasure();
-  private final EglRenderer eglRenderer;
-
-  // Callback for reporting renderer events. Read-only after initilization so no lock required.
-  private RendererCommon.RendererEvents rendererEvents;
-
-  private final Object layoutLock = new Object();
-  private boolean isRenderingPaused = false;
-  private boolean isFirstFrameRendered;
-  private int rotatedFrameWidth;
-  private int rotatedFrameHeight;
-  private int frameRotation;
-
-  // Accessed only on the main thread.
-  private boolean enableFixedSize;
-  private int surfaceWidth;
-  private int surfaceHeight;
-
-  /**
-   * Standard View constructor. In order to render something, you must first call init().
-   */
-  public SurfaceViewRenderer(Context context) {
-    super(context);
-    this.resourceName = getResourceName();
-    eglRenderer = new EglRenderer(resourceName);
-    getHolder().addCallback(this);
-  }
-
-  /**
-   * Standard View constructor. In order to render something, you must first call init().
-   */
-  public SurfaceViewRenderer(Context context, AttributeSet attrs) {
-    super(context, attrs);
-    this.resourceName = getResourceName();
-    eglRenderer = new EglRenderer(resourceName);
-    getHolder().addCallback(this);
-  }
-
-  /**
-   * Initialize this class, sharing resources with |sharedContext|. It is allowed to call init() to
-   * reinitialize the renderer after a previous init()/release() cycle.
-   */
-  public void init(EglBase.Context sharedContext, RendererCommon.RendererEvents rendererEvents) {
-    init(sharedContext, rendererEvents, EglBase.CONFIG_PLAIN, new GlRectDrawer());
-  }
-
-  /**
-   * Initialize this class, sharing resources with |sharedContext|. The custom |drawer| will be used
-   * for drawing frames on the EGLSurface. This class is responsible for calling release() on
-   * |drawer|. It is allowed to call init() to reinitialize the renderer after a previous
-   * init()/release() cycle.
-   */
-  public void init(final EglBase.Context sharedContext,
-      RendererCommon.RendererEvents rendererEvents, final int[] configAttributes,
-      RendererCommon.GlDrawer drawer) {
-    ThreadUtils.checkIsOnMainThread();
-    this.rendererEvents = rendererEvents;
-    synchronized (layoutLock) {
-      isFirstFrameRendered = false;
-      rotatedFrameWidth = 0;
-      rotatedFrameHeight = 0;
-      frameRotation = 0;
-    }
-    eglRenderer.init(sharedContext, configAttributes, drawer);
-  }
-
-  /**
-   * Block until any pending frame is returned and all GL resources released, even if an interrupt
-   * occurs. If an interrupt occurs during release(), the interrupt flag will be set. This function
-   * should be called before the Activity is destroyed and the EGLContext is still valid. If you
-   * don't call this function, the GL resources might leak.
-   */
-  public void release() {
-    eglRenderer.release();
-  }
-
-  /**
-   * Register a callback to be invoked when a new video frame has been received.
-   *
-   * @param listener The callback to be invoked. The callback will be invoked on the render thread.
-   *                 It should be lightweight and must not call removeFrameListener.
-   * @param scale    The scale of the Bitmap passed to the callback, or 0 if no Bitmap is
-   *                 required.
-   * @param drawer   Custom drawer to use for this frame listener.
-   */
-  public void addFrameListener(
-      EglRenderer.FrameListener listener, float scale, RendererCommon.GlDrawer drawerParam) {
-    eglRenderer.addFrameListener(listener, scale, drawerParam);
-  }
-
-  /**
-   * Register a callback to be invoked when a new video frame has been received. This version uses
-   * the drawer of the EglRenderer that was passed in init.
-   *
-   * @param listener The callback to be invoked. The callback will be invoked on the render thread.
-   *                 It should be lightweight and must not call removeFrameListener.
-   * @param scale    The scale of the Bitmap passed to the callback, or 0 if no Bitmap is
-   *                 required.
-   */
-  public void addFrameListener(EglRenderer.FrameListener listener, float scale) {
-    eglRenderer.addFrameListener(listener, scale);
-  }
-
-  public void removeFrameListener(EglRenderer.FrameListener listener) {
-    eglRenderer.removeFrameListener(listener);
-  }
-
-  /**
-   * Enables fixed size for the surface. This provides better performance but might be buggy on some
-   * devices. By default this is turned off.
-   */
-  public void setEnableHardwareScaler(boolean enabled) {
-    ThreadUtils.checkIsOnMainThread();
-    enableFixedSize = enabled;
-    updateSurfaceSize();
-  }
-
-  /**
-   * Set if the video stream should be mirrored or not.
-   */
-  public void setMirror(final boolean mirror) {
-    eglRenderer.setMirror(mirror);
-  }
-
-  /**
-   * Set how the video will fill the allowed layout area.
-   */
-  public void setScalingType(RendererCommon.ScalingType scalingType) {
-    ThreadUtils.checkIsOnMainThread();
-    videoLayoutMeasure.setScalingType(scalingType);
-    requestLayout();
-  }
-
-  public void setScalingType(RendererCommon.ScalingType scalingTypeMatchOrientation,
-      RendererCommon.ScalingType scalingTypeMismatchOrientation) {
-    ThreadUtils.checkIsOnMainThread();
-    videoLayoutMeasure.setScalingType(scalingTypeMatchOrientation, scalingTypeMismatchOrientation);
-    requestLayout();
-  }
-
-  /**
-   * Limit render framerate.
-   *
-   * @param fps Limit render framerate to this value, or use Float.POSITIVE_INFINITY to disable fps
-   *            reduction.
-   */
-  public void setFpsReduction(float fps) {
-    synchronized (layoutLock) {
-      isRenderingPaused = fps == 0f;
-    }
-    eglRenderer.setFpsReduction(fps);
-  }
-
-  public void disableFpsReduction() {
-    synchronized (layoutLock) {
-      isRenderingPaused = false;
-    }
-    eglRenderer.disableFpsReduction();
-  }
-
-  public void pauseVideo() {
-    synchronized (layoutLock) {
-      isRenderingPaused = true;
-    }
-    eglRenderer.pauseVideo();
-  }
-
-  // VideoRenderer.Callbacks interface.
-  @Override
-  public void renderFrame(VideoRenderer.I420Frame frame) {
-    updateFrameDimensionsAndReportEvents(frame);
-    eglRenderer.renderFrame(frame);
-  }
-
-  // VideoSink interface.
-  @Override
-  public void onFrame(VideoFrame frame) {
-    updateFrameDimensionsAndReportEvents(frame);
-    eglRenderer.onFrame(frame);
-  }
-
-  // View layout interface.
-  @Override
-  protected void onMeasure(int widthSpec, int heightSpec) {
-    ThreadUtils.checkIsOnMainThread();
-    final Point size;
-    synchronized (layoutLock) {
-      size =
-          videoLayoutMeasure.measure(widthSpec, heightSpec, rotatedFrameWidth, rotatedFrameHeight);
-    }
-    setMeasuredDimension(size.x, size.y);
-    logD("onMeasure(). New size: " + size.x + "x" + size.y);
-  }
-
-  @Override
-  protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
-    ThreadUtils.checkIsOnMainThread();
-    eglRenderer.setLayoutAspectRatio((right - left) / (float) (bottom - top));
-    updateSurfaceSize();
-  }
-
-  private void updateSurfaceSize() {
-    ThreadUtils.checkIsOnMainThread();
-    synchronized (layoutLock) {
-      if (enableFixedSize && rotatedFrameWidth != 0 && rotatedFrameHeight != 0 && getWidth() != 0
-          && getHeight() != 0) {
-        final float layoutAspectRatio = getWidth() / (float) getHeight();
-        final float frameAspectRatio = rotatedFrameWidth / (float) rotatedFrameHeight;
-        final int drawnFrameWidth;
-        final int drawnFrameHeight;
-        if (frameAspectRatio > layoutAspectRatio) {
-          drawnFrameWidth = (int) (rotatedFrameHeight * layoutAspectRatio);
-          drawnFrameHeight = rotatedFrameHeight;
-        } else {
-          drawnFrameWidth = rotatedFrameWidth;
-          drawnFrameHeight = (int) (rotatedFrameWidth / layoutAspectRatio);
-        }
-        // Aspect ratio of the drawn frame and the view is the same.
-        final int width = Math.min(getWidth(), drawnFrameWidth);
-        final int height = Math.min(getHeight(), drawnFrameHeight);
-        logD("updateSurfaceSize. Layout size: " + getWidth() + "x" + getHeight() + ", frame size: "
-            + rotatedFrameWidth + "x" + rotatedFrameHeight + ", requested surface size: " + width
-            + "x" + height + ", old surface size: " + surfaceWidth + "x" + surfaceHeight);
-        if (width != surfaceWidth || height != surfaceHeight) {
-          surfaceWidth = width;
-          surfaceHeight = height;
-          getHolder().setFixedSize(width, height);
-        }
-      } else {
-        surfaceWidth = surfaceHeight = 0;
-        getHolder().setSizeFromLayout();
-      }
-    }
-  }
-
-  // SurfaceHolder.Callback interface.
-  @Override
-  public void surfaceCreated(final SurfaceHolder holder) {
-    ThreadUtils.checkIsOnMainThread();
-    eglRenderer.createEglSurface(holder.getSurface());
-    surfaceWidth = surfaceHeight = 0;
-    updateSurfaceSize();
-  }
-
-  @Override
-  public void surfaceDestroyed(SurfaceHolder holder) {
-    ThreadUtils.checkIsOnMainThread();
-    final CountDownLatch completionLatch = new CountDownLatch(1);
-    eglRenderer.releaseEglSurface(new Runnable() {
-      @Override
-      public void run() {
-        completionLatch.countDown();
-      }
-    });
-    ThreadUtils.awaitUninterruptibly(completionLatch);
-  }
-
-  @Override
-  public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
-    ThreadUtils.checkIsOnMainThread();
-    logD("surfaceChanged: format: " + format + " size: " + width + "x" + height);
-  }
-
-  private String getResourceName() {
-    try {
-      return getResources().getResourceEntryName(getId()) + ": ";
-    } catch (NotFoundException e) {
-      return "";
-    }
-  }
-
-  /**
-   * Post a task to clear the SurfaceView to a transparent uniform color.
-   */
-  public void clearImage() {
-    eglRenderer.clearImage();
-  }
-
-  // Update frame dimensions and report any changes to |rendererEvents|.
-  private void updateFrameDimensionsAndReportEvents(VideoRenderer.I420Frame frame) {
-    synchronized (layoutLock) {
-      if (isRenderingPaused) {
-        return;
-      }
-      if (!isFirstFrameRendered) {
-        isFirstFrameRendered = true;
-        logD("Reporting first rendered frame.");
-        if (rendererEvents != null) {
-          rendererEvents.onFirstFrameRendered();
-        }
-      }
-      if (rotatedFrameWidth != frame.rotatedWidth() || rotatedFrameHeight != frame.rotatedHeight()
-          || frameRotation != frame.rotationDegree) {
-        logD("Reporting frame resolution changed to " + frame.width + "x" + frame.height
-            + " with rotation " + frame.rotationDegree);
-        if (rendererEvents != null) {
-          rendererEvents.onFrameResolutionChanged(frame.width, frame.height, frame.rotationDegree);
-        }
-        rotatedFrameWidth = frame.rotatedWidth();
-        rotatedFrameHeight = frame.rotatedHeight();
-        frameRotation = frame.rotationDegree;
-        post(new Runnable() {
-          @Override
-          public void run() {
-            updateSurfaceSize();
-            requestLayout();
-          }
-        });
-      }
-    }
-  }
-
-  // Update frame dimensions and report any changes to |rendererEvents|.
-  private void updateFrameDimensionsAndReportEvents(VideoFrame frame) {
-    synchronized (layoutLock) {
-      if (isRenderingPaused) {
-        return;
-      }
-      if (!isFirstFrameRendered) {
-        isFirstFrameRendered = true;
-        logD("Reporting first rendered frame.");
-        if (rendererEvents != null) {
-          rendererEvents.onFirstFrameRendered();
-        }
-      }
-      if (rotatedFrameWidth != frame.getRotatedWidth()
-          || rotatedFrameHeight != frame.getRotatedHeight()
-          || frameRotation != frame.getRotation()) {
-        logD("Reporting frame resolution changed to " + frame.getBuffer().getWidth() + "x"
-            + frame.getBuffer().getHeight() + " with rotation " + frame.getRotation());
-        if (rendererEvents != null) {
-          rendererEvents.onFrameResolutionChanged(
-              frame.getBuffer().getWidth(), frame.getBuffer().getHeight(), frame.getRotation());
-        }
-        rotatedFrameWidth = frame.getRotatedWidth();
-        rotatedFrameHeight = frame.getRotatedHeight();
-        frameRotation = frame.getRotation();
-        post(() -> {
-          updateSurfaceSize();
-          requestLayout();
-        });
-      }
-    }
-  }
-
-  private void logD(String string) {
-    Logging.d(TAG, resourceName + string);
-  }
-}
diff --git a/sdk/android/api/org/webrtc/VideoCapturer.java b/sdk/android/api/org/webrtc/VideoCapturer.java
deleted file mode 100644
index 804560a..0000000
--- a/sdk/android/api/org/webrtc/VideoCapturer.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- *  Copyright 2013 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.
- */
-
-package org.webrtc;
-
-import android.content.Context;
-import java.util.List;
-
-// Base interface for all VideoCapturers to implement.
-public interface VideoCapturer {
-  // Interface used for providing callbacks to an observer.
-  public interface CapturerObserver {
-    // Notify if the camera have been started successfully or not.
-    // Called on a Java thread owned by VideoCapturer.
-    void onCapturerStarted(boolean success);
-    void onCapturerStopped();
-
-    // Delivers a captured frame. Called on a Java thread owned by VideoCapturer.
-    void onByteBufferFrameCaptured(
-        byte[] data, int width, int height, int rotation, long timeStamp);
-
-    // Delivers a captured frame in a texture with id |oesTextureId|. Called on a Java thread
-    // owned by VideoCapturer.
-    void onTextureFrameCaptured(int width, int height, int oesTextureId, float[] transformMatrix,
-        int rotation, long timestamp);
-
-    // Delivers a captured frame. Called on a Java thread owned by VideoCapturer.
-    void onFrameCaptured(VideoFrame frame);
-  }
-
-  /**
-   * This function is used to initialize the camera thread, the android application context, and the
-   * capture observer. It will be called only once and before any startCapture() request. The
-   * camera thread is guaranteed to be valid until dispose() is called. If the VideoCapturer wants
-   * to deliver texture frames, it should do this by rendering on the SurfaceTexture in
-   * |surfaceTextureHelper|, register itself as a listener, and forward the texture frames to
-   * CapturerObserver.onTextureFrameCaptured().
-   */
-  void initialize(SurfaceTextureHelper surfaceTextureHelper, Context applicationContext,
-      CapturerObserver capturerObserver);
-
-  /**
-   * Start capturing frames in a format that is as close as possible to |width| x |height| and
-   * |framerate|.
-   */
-  void startCapture(int width, int height, int framerate);
-
-  /**
-   * Stop capturing. This function should block until capture is actually stopped.
-   */
-  void stopCapture() throws InterruptedException;
-
-  void changeCaptureFormat(int width, int height, int framerate);
-
-  /**
-   * Perform any final cleanup here. No more capturing will be done after this call.
-   */
-  void dispose();
-
-  /**
-   * @return true if-and-only-if this is a screen capturer.
-   */
-  boolean isScreencast();
-}
diff --git a/sdk/android/api/org/webrtc/VideoCodecInfo.java b/sdk/android/api/org/webrtc/VideoCodecInfo.java
deleted file mode 100644
index 70295b7..0000000
--- a/sdk/android/api/org/webrtc/VideoCodecInfo.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- *  Copyright 2017 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.
- */
-
-package org.webrtc;
-
-import java.util.Map;
-
-/**
- * Represent a video codec as encoded in SDP.
- */
-public class VideoCodecInfo {
-  // Keys for H264 VideoCodecInfo properties.
-  public static final String H264_FMTP_PROFILE_LEVEL_ID = "profile-level-id";
-  public static final String H264_FMTP_LEVEL_ASYMMETRY_ALLOWED = "level-asymmetry-allowed";
-  public static final String H264_FMTP_PACKETIZATION_MODE = "packetization-mode";
-
-  public static final String H264_PROFILE_CONSTRAINED_BASELINE = "4200";
-  public static final String H264_PROFILE_CONSTRAINED_HIGH = "640c";
-  public static final String H264_LEVEL_3_1 = "1f"; // 31 in hex.
-  public static final String H264_CONSTRAINED_HIGH_3_1 =
-      H264_PROFILE_CONSTRAINED_HIGH + H264_LEVEL_3_1;
-  public static final String H264_CONSTRAINED_BASELINE_3_1 =
-      H264_PROFILE_CONSTRAINED_BASELINE + H264_LEVEL_3_1;
-
-  public final int payload;
-  public final String name;
-  public final Map<String, String> params;
-
-  public VideoCodecInfo(int payload, String name, Map<String, String> params) {
-    this.payload = payload;
-    this.name = name;
-    this.params = params;
-  }
-}
diff --git a/sdk/android/api/org/webrtc/VideoCodecStatus.java b/sdk/android/api/org/webrtc/VideoCodecStatus.java
deleted file mode 100644
index 3a7c81f..0000000
--- a/sdk/android/api/org/webrtc/VideoCodecStatus.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- *  Copyright 2017 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.
- */
-
-package org.webrtc;
-
-/**
- * Status codes reported by video encoding/decoding components. This should be kept in sync with
- * video_error_codes.h.
- */
-public enum VideoCodecStatus {
-  REQUEST_SLI(2),
-  NO_OUTPUT(1),
-  OK(0),
-  ERROR(-1),
-  LEVEL_EXCEEDED(-2),
-  MEMORY(-3),
-  ERR_PARAMETER(-4),
-  ERR_SIZE(-5),
-  TIMEOUT(-6),
-  UNINITIALIZED(-7),
-  ERR_REQUEST_SLI(-12),
-  FALLBACK_SOFTWARE(-13),
-  TARGET_BITRATE_OVERSHOOT(-14);
-
-  private final int number;
-
-  private VideoCodecStatus(int number) {
-    this.number = number;
-  }
-
-  public int getNumber() {
-    return number;
-  }
-}
diff --git a/sdk/android/api/org/webrtc/VideoDecoder.java b/sdk/android/api/org/webrtc/VideoDecoder.java
deleted file mode 100644
index f5d8850..0000000
--- a/sdk/android/api/org/webrtc/VideoDecoder.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- *  Copyright 2017 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.
- */
-
-package org.webrtc;
-
-/**
- * Interface for a video decoder that can be used in WebRTC. All calls to the class will be made on
- * a single decoding thread.
- */
-public interface VideoDecoder {
-  /** Settings passed to the decoder by WebRTC. */
-  public class Settings {
-    public final int numberOfCores;
-    public final int width;
-    public final int height;
-
-    public Settings(int numberOfCores, int width, int height) {
-      this.numberOfCores = numberOfCores;
-      this.width = width;
-      this.height = height;
-    }
-  }
-
-  /** Additional info for decoding. */
-  public class DecodeInfo {
-    public final boolean isMissingFrames;
-    public final long renderTimeMs;
-
-    public DecodeInfo(boolean isMissingFrames, long renderTimeMs) {
-      this.isMissingFrames = isMissingFrames;
-      this.renderTimeMs = renderTimeMs;
-    }
-  }
-
-  public interface Callback {
-    /**
-     * Call to return a decoded frame. Can be called on any thread.
-     *
-     * @param frame Decoded frame
-     * @param decodeTimeMs Time it took to decode the frame in milliseconds or null if not available
-     * @param qp QP value of the decoded frame or null if not available
-     */
-    void onDecodedFrame(VideoFrame frame, Integer decodeTimeMs, Integer qp);
-  }
-
-  /**
-   * Initializes the decoding process with specified settings. Will be called on the decoding thread
-   * before any decode calls.
-   */
-  VideoCodecStatus initDecode(Settings settings, Callback decodeCallback);
-  /**
-   * Called when the decoder is no longer needed. Any more calls to decode will not be made.
-   */
-  VideoCodecStatus release();
-  /**
-   * Request the decoder to decode a frame.
-   */
-  VideoCodecStatus decode(EncodedImage frame, DecodeInfo info);
-  /**
-   * The decoder should return true if it prefers late decoding. That is, it can not decode
-   * infinite number of frames before the decoded frame is consumed.
-   */
-  boolean getPrefersLateDecoding();
-  /** Should return a descriptive name for the implementation. */
-  String getImplementationName();
-}
diff --git a/sdk/android/api/org/webrtc/VideoDecoderFactory.java b/sdk/android/api/org/webrtc/VideoDecoderFactory.java
deleted file mode 100644
index 1c01503..0000000
--- a/sdk/android/api/org/webrtc/VideoDecoderFactory.java
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- *  Copyright 2017 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.
- */
-
-package org.webrtc;
-
-/** Factory for creating VideoDecoders. */
-public interface VideoDecoderFactory {
-  /**
-   * Creates a VideoDecoder for the given codec. Supports the same codecs supported by
-   * VideoEncoderFactory.
-   */
-  public VideoDecoder createDecoder(String codecType);
-}
diff --git a/sdk/android/api/org/webrtc/VideoEncoder.java b/sdk/android/api/org/webrtc/VideoEncoder.java
deleted file mode 100644
index 1fb9601..0000000
--- a/sdk/android/api/org/webrtc/VideoEncoder.java
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- *  Copyright 2017 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.
- */
-
-package org.webrtc;
-
-/**
- * Interface for a video encoder that can be used with WebRTC. All calls will be made on the
- * encoding thread.
- */
-public interface VideoEncoder {
-  /** Settings passed to the encoder by WebRTC. */
-  public class Settings {
-    public final int numberOfCores;
-    public final int width;
-    public final int height;
-    public final int startBitrate; // Kilobits per second.
-    public final int maxFramerate;
-    public final boolean automaticResizeOn;
-
-    public Settings(int numberOfCores, int width, int height, int startBitrate, int maxFramerate,
-        boolean automaticResizeOn) {
-      this.numberOfCores = numberOfCores;
-      this.width = width;
-      this.height = height;
-      this.startBitrate = startBitrate;
-      this.maxFramerate = maxFramerate;
-      this.automaticResizeOn = automaticResizeOn;
-    }
-  }
-
-  /** Additional info for encoding. */
-  public class EncodeInfo {
-    public final EncodedImage.FrameType[] frameTypes;
-
-    public EncodeInfo(EncodedImage.FrameType[] frameTypes) {
-      this.frameTypes = frameTypes;
-    }
-  }
-
-  // TODO(sakal): Add values to these classes as necessary.
-  /** Codec specific information about the encoded frame. */
-  public class CodecSpecificInfo {}
-
-  public class CodecSpecificInfoVP8 extends CodecSpecificInfo {}
-
-  public class CodecSpecificInfoVP9 extends CodecSpecificInfo {}
-
-  public class CodecSpecificInfoH264 extends CodecSpecificInfo {}
-
-  /**
-   * Represents bitrate allocated for an encoder to produce frames. Bitrate can be divided between
-   * spatial and temporal layers.
-   */
-  public class BitrateAllocation {
-    // First index is the spatial layer and second the temporal layer.
-    public final int[][] bitratesBbs;
-
-    /**
-     * Initializes the allocation with a two dimensional array of bitrates. The first index of the
-     * array is the spatial layer and the second index in the temporal layer.
-     */
-    public BitrateAllocation(int[][] bitratesBbs) {
-      this.bitratesBbs = bitratesBbs;
-    }
-
-    /**
-     * Gets the total bitrate allocated for all layers.
-     */
-    public int getSum() {
-      int sum = 0;
-      for (int[] spatialLayer : bitratesBbs) {
-        for (int bitrate : spatialLayer) {
-          sum += bitrate;
-        }
-      }
-      return sum;
-    }
-  }
-
-  /** Settings for WebRTC quality based scaling. */
-  public class ScalingSettings {
-    public final boolean on;
-    public final Integer low;
-    public final Integer high;
-
-    /**
-     * Creates quality based scaling setting.
-     *
-     * @param on True if quality scaling is turned on.
-     */
-    public ScalingSettings(boolean on) {
-      this.on = on;
-      this.low = null;
-      this.high = null;
-    }
-
-    /**
-     * Creates quality based scaling settings with custom thresholds.
-     *
-     * @param on True if quality scaling is turned on.
-     * @param low Average QP at which to scale up the resolution.
-     * @param high Average QP at which to scale down the resolution.
-     */
-    public ScalingSettings(boolean on, int low, int high) {
-      this.on = on;
-      this.low = low;
-      this.high = high;
-    }
-  }
-
-  public interface Callback {
-    /** Call to return an encoded frame. */
-    void onEncodedFrame(EncodedImage frame, CodecSpecificInfo info);
-  }
-
-  /**
-   * Initializes the encoding process. Call before any calls to encode.
-   */
-  VideoCodecStatus initEncode(Settings settings, Callback encodeCallback);
-  /**
-   * Releases the encoder. No more calls to encode will be made after this call.
-   */
-  VideoCodecStatus release();
-  /**
-   * Requests the encoder to encode a frame.
-   */
-  VideoCodecStatus encode(VideoFrame frame, EncodeInfo info);
-  /**
-   * Informs the encoder of the packet loss and the round-trip time of the network.
-   *
-   * @param packetLoss How many packets are lost on average per 255 packets.
-   * @param roundTripTimeMs Round-trip time of the network in milliseconds.
-   */
-  VideoCodecStatus setChannelParameters(short packetLoss, long roundTripTimeMs);
-  /** Sets the bitrate allocation and the target framerate for the encoder. */
-  VideoCodecStatus setRateAllocation(BitrateAllocation allocation, int framerate);
-  /** Any encoder that wants to use WebRTC provided quality scaler must implement this method. */
-  ScalingSettings getScalingSettings();
-  /** Should return a descriptive name for the implementation. Gets called once and cached. */
-  String getImplementationName();
-}
diff --git a/sdk/android/api/org/webrtc/VideoEncoderFactory.java b/sdk/android/api/org/webrtc/VideoEncoderFactory.java
deleted file mode 100644
index 4445524..0000000
--- a/sdk/android/api/org/webrtc/VideoEncoderFactory.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- *  Copyright 2017 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.
- */
-
-package org.webrtc;
-
-/** Factory for creating VideoEncoders. */
-public interface VideoEncoderFactory {
-  /** Creates an encoder for the given video codec. */
-  public VideoEncoder createEncoder(VideoCodecInfo info);
-
-  /**
-   * Enumerates the list of supported video codecs. This method will only be called once and the
-   * result will be cached.
-   */
-  public VideoCodecInfo[] getSupportedCodecs();
-}
diff --git a/sdk/android/api/org/webrtc/VideoFileRenderer.java b/sdk/android/api/org/webrtc/VideoFileRenderer.java
deleted file mode 100644
index 17676c0..0000000
--- a/sdk/android/api/org/webrtc/VideoFileRenderer.java
+++ /dev/null
@@ -1,174 +0,0 @@
-/*
- *  Copyright 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.
- */
-
-package org.webrtc;
-
-import android.os.Handler;
-import android.os.HandlerThread;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.nio.ByteBuffer;
-import java.util.concurrent.CountDownLatch;
-import java.util.ArrayList;
-
-/**
- * Can be used to save the video frames to file.
- */
-public class VideoFileRenderer implements VideoRenderer.Callbacks {
-  static {
-    System.loadLibrary("jingle_peerconnection_so");
-  }
-
-  private static final String TAG = "VideoFileRenderer";
-
-  private final HandlerThread renderThread;
-  private final Object handlerLock = new Object();
-  private final Handler renderThreadHandler;
-  private final FileOutputStream videoOutFile;
-  private final String outputFileName;
-  private final int outputFileWidth;
-  private final int outputFileHeight;
-  private final int outputFrameSize;
-  private final ByteBuffer outputFrameBuffer;
-  private EglBase eglBase;
-  private YuvConverter yuvConverter;
-  private ArrayList<ByteBuffer> rawFrames = new ArrayList<>();
-
-  public VideoFileRenderer(String outputFile, int outputFileWidth, int outputFileHeight,
-      final EglBase.Context sharedContext) throws IOException {
-    if ((outputFileWidth % 2) == 1 || (outputFileHeight % 2) == 1) {
-      throw new IllegalArgumentException("Does not support uneven width or height");
-    }
-
-    this.outputFileName = outputFile;
-    this.outputFileWidth = outputFileWidth;
-    this.outputFileHeight = outputFileHeight;
-
-    outputFrameSize = outputFileWidth * outputFileHeight * 3 / 2;
-    outputFrameBuffer = ByteBuffer.allocateDirect(outputFrameSize);
-
-    videoOutFile = new FileOutputStream(outputFile);
-    videoOutFile.write(
-        ("YUV4MPEG2 C420 W" + outputFileWidth + " H" + outputFileHeight + " Ip F30:1 A1:1\n")
-            .getBytes());
-
-    renderThread = new HandlerThread(TAG);
-    renderThread.start();
-    renderThreadHandler = new Handler(renderThread.getLooper());
-
-    ThreadUtils.invokeAtFrontUninterruptibly(renderThreadHandler, new Runnable() {
-      @Override
-      public void run() {
-        eglBase = EglBase.create(sharedContext, EglBase.CONFIG_PIXEL_BUFFER);
-        eglBase.createDummyPbufferSurface();
-        eglBase.makeCurrent();
-        yuvConverter = new YuvConverter();
-      }
-    });
-  }
-
-  @Override
-  public void renderFrame(final VideoRenderer.I420Frame frame) {
-    renderThreadHandler.post(new Runnable() {
-      @Override
-      public void run() {
-        renderFrameOnRenderThread(frame);
-      }
-    });
-  }
-
-  private void renderFrameOnRenderThread(VideoRenderer.I420Frame frame) {
-    final float frameAspectRatio = (float) frame.rotatedWidth() / (float) frame.rotatedHeight();
-
-    final float[] rotatedSamplingMatrix =
-        RendererCommon.rotateTextureMatrix(frame.samplingMatrix, frame.rotationDegree);
-    final float[] layoutMatrix = RendererCommon.getLayoutMatrix(
-        false, frameAspectRatio, (float) outputFileWidth / outputFileHeight);
-    final float[] texMatrix = RendererCommon.multiplyMatrices(rotatedSamplingMatrix, layoutMatrix);
-
-    try {
-      ByteBuffer buffer = nativeCreateNativeByteBuffer(outputFrameSize);
-      if (!frame.yuvFrame) {
-        yuvConverter.convert(outputFrameBuffer, outputFileWidth, outputFileHeight, outputFileWidth,
-            frame.textureId, texMatrix);
-
-        int stride = outputFileWidth;
-        byte[] data = outputFrameBuffer.array();
-        int offset = outputFrameBuffer.arrayOffset();
-
-        // Write Y
-        buffer.put(data, offset, outputFileWidth * outputFileHeight);
-
-        // Write U
-        for (int r = outputFileHeight; r < outputFileHeight * 3 / 2; ++r) {
-          buffer.put(data, offset + r * stride, stride / 2);
-        }
-
-        // Write V
-        for (int r = outputFileHeight; r < outputFileHeight * 3 / 2; ++r) {
-          buffer.put(data, offset + r * stride + stride / 2, stride / 2);
-        }
-      } else {
-        nativeI420Scale(frame.yuvPlanes[0], frame.yuvStrides[0], frame.yuvPlanes[1],
-            frame.yuvStrides[1], frame.yuvPlanes[2], frame.yuvStrides[2], frame.width, frame.height,
-            outputFrameBuffer, outputFileWidth, outputFileHeight);
-
-        buffer.put(outputFrameBuffer.array(), outputFrameBuffer.arrayOffset(), outputFrameSize);
-      }
-      buffer.rewind();
-      rawFrames.add(buffer);
-    } finally {
-      VideoRenderer.renderFrameDone(frame);
-    }
-  }
-
-  /**
-   * Release all resources. All already posted frames will be rendered first.
-   */
-  public void release() {
-    final CountDownLatch cleanupBarrier = new CountDownLatch(1);
-    renderThreadHandler.post(new Runnable() {
-      @Override
-      public void run() {
-        yuvConverter.release();
-        eglBase.release();
-        renderThread.quit();
-        cleanupBarrier.countDown();
-      }
-    });
-    ThreadUtils.awaitUninterruptibly(cleanupBarrier);
-    try {
-      for (ByteBuffer buffer : rawFrames) {
-        videoOutFile.write("FRAME\n".getBytes());
-
-        byte[] data = new byte[outputFrameSize];
-        buffer.get(data);
-
-        videoOutFile.write(data);
-
-        nativeFreeNativeByteBuffer(buffer);
-      }
-      videoOutFile.close();
-      Logging.d(TAG, "Video written to disk as " + outputFileName + ". Number frames are "
-              + rawFrames.size() + " and the dimension of the frames are " + outputFileWidth + "x"
-              + outputFileHeight + ".");
-    } catch (IOException e) {
-      Logging.e(TAG, "Error writing video to disk", e);
-    }
-  }
-
-  public static native void nativeI420Scale(ByteBuffer srcY, int strideY, ByteBuffer srcU,
-      int strideU, ByteBuffer srcV, int strideV, int width, int height, ByteBuffer dst,
-      int dstWidth, int dstHeight);
-
-  public static native ByteBuffer nativeCreateNativeByteBuffer(int size);
-
-  public static native void nativeFreeNativeByteBuffer(ByteBuffer buffer);
-}
diff --git a/sdk/android/api/org/webrtc/VideoFrame.java b/sdk/android/api/org/webrtc/VideoFrame.java
deleted file mode 100644
index 438df0f..0000000
--- a/sdk/android/api/org/webrtc/VideoFrame.java
+++ /dev/null
@@ -1,181 +0,0 @@
-/*
- *  Copyright 2017 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.
- */
-
-package org.webrtc;
-
-import android.graphics.Matrix;
-import java.nio.ByteBuffer;
-
-/**
- * Java version of webrtc::VideoFrame and webrtc::VideoFrameBuffer. A difference from the C++
- * version is that no explicit tag is used, and clients are expected to use 'instanceof' to find the
- * right subclass of the buffer. This allows clients to create custom VideoFrame.Buffer in
- * arbitrary format in their custom VideoSources, and then cast it back to the correct subclass in
- * their custom VideoSinks. All implementations must also implement the toI420() function,
- * converting from the underlying representation if necessary. I420 is the most widely accepted
- * format and serves as a fallback for video sinks that can only handle I420, e.g. the internal
- * WebRTC software encoders.
- */
-public class VideoFrame {
-  public interface Buffer {
-    /**
-     * Resolution of the buffer in pixels.
-     */
-    int getWidth();
-    int getHeight();
-
-    /**
-     * Returns a memory-backed frame in I420 format. If the pixel data is in another format, a
-     * conversion will take place. All implementations must provide a fallback to I420 for
-     * compatibility with e.g. the internal WebRTC software encoders.
-     */
-    I420Buffer toI420();
-
-    /**
-     * Reference counting is needed since a video buffer can be shared between multiple VideoSinks,
-     * and the buffer needs to be returned to the VideoSource as soon as all references are gone.
-     */
-    void retain();
-    void release();
-
-    /**
-     * Crops a region defined by |cropx|, |cropY|, |cropWidth| and |cropHeight|. Scales it to size
-     * |scaleWidth| x |scaleHeight|.
-     */
-    Buffer cropAndScale(
-        int cropX, int cropY, int cropWidth, int cropHeight, int scaleWidth, int scaleHeight);
-  }
-
-  /**
-   * Interface for I420 buffers.
-   */
-  public interface I420Buffer extends Buffer {
-    ByteBuffer getDataY();
-    ByteBuffer getDataU();
-    ByteBuffer getDataV();
-
-    int getStrideY();
-    int getStrideU();
-    int getStrideV();
-  }
-
-  /**
-   * Interface for buffers that are stored as a single texture, either in OES or RGB format.
-   */
-  public interface TextureBuffer extends Buffer {
-    enum Type { OES, RGB }
-
-    Type getType();
-    int getTextureId();
-
-    /**
-     * Retrieve the transform matrix associated with the frame. This transform matrix maps 2D
-     * homogeneous coordinates of the form (s, t, 1) with s and t in the inclusive range [0, 1] to
-     * the coordinate that should be used to sample that location from the buffer.
-     */
-    public Matrix getTransformMatrix();
-  }
-
-  private final Buffer buffer;
-  private final int rotation;
-  private final long timestampNs;
-
-  public VideoFrame(Buffer buffer, int rotation, long timestampNs) {
-    if (buffer == null) {
-      throw new IllegalArgumentException("buffer not allowed to be null");
-    }
-    if (rotation % 90 != 0) {
-      throw new IllegalArgumentException("rotation must be a multiple of 90");
-    }
-    this.buffer = buffer;
-    this.rotation = rotation;
-    this.timestampNs = timestampNs;
-  }
-
-  public Buffer getBuffer() {
-    return buffer;
-  }
-
-  /**
-   * Rotation of the frame in degrees.
-   */
-  public int getRotation() {
-    return rotation;
-  }
-
-  /**
-   * Timestamp of the frame in nano seconds.
-   */
-  public long getTimestampNs() {
-    return timestampNs;
-  }
-
-  public int getRotatedWidth() {
-    if (rotation % 180 == 0) {
-      return buffer.getWidth();
-    }
-    return buffer.getHeight();
-  }
-
-  public int getRotatedHeight() {
-    if (rotation % 180 == 0) {
-      return buffer.getHeight();
-    }
-    return buffer.getWidth();
-  }
-
-  /**
-   * Reference counting of the underlying buffer.
-   */
-  public void retain() {
-    buffer.retain();
-  }
-
-  public void release() {
-    buffer.release();
-  }
-
-  public static VideoFrame.Buffer cropAndScaleI420(final I420Buffer buffer, int cropX, int cropY,
-      int cropWidth, int cropHeight, int scaleWidth, int scaleHeight) {
-    if (cropWidth == scaleWidth && cropHeight == scaleHeight) {
-      // No scaling.
-      ByteBuffer dataY = buffer.getDataY();
-      ByteBuffer dataU = buffer.getDataU();
-      ByteBuffer dataV = buffer.getDataV();
-
-      dataY.position(cropX + cropY * buffer.getStrideY());
-      dataU.position(cropX / 2 + cropY / 2 * buffer.getStrideU());
-      dataV.position(cropX / 2 + cropY / 2 * buffer.getStrideV());
-
-      buffer.retain();
-      return new I420BufferImpl(buffer.getWidth(), buffer.getHeight(), dataY.slice(),
-          buffer.getStrideY(), dataU.slice(), buffer.getStrideU(), dataV.slice(),
-          buffer.getStrideV(), new Runnable() {
-            @Override
-            public void run() {
-              buffer.release();
-            }
-          });
-    }
-
-    I420BufferImpl newBuffer = I420BufferImpl.allocate(scaleWidth, scaleHeight);
-    nativeCropAndScaleI420(buffer.getDataY(), buffer.getStrideY(), buffer.getDataU(),
-        buffer.getStrideU(), buffer.getDataV(), buffer.getStrideV(), cropX, cropY, cropWidth,
-        cropHeight, newBuffer.getDataY(), newBuffer.getStrideY(), newBuffer.getDataU(),
-        newBuffer.getStrideU(), newBuffer.getDataV(), newBuffer.getStrideV(), scaleWidth,
-        scaleHeight);
-    return newBuffer;
-  }
-
-  private static native void nativeCropAndScaleI420(ByteBuffer srcY, int srcStrideY,
-      ByteBuffer srcU, int srcStrideU, ByteBuffer srcV, int srcStrideV, int cropX, int cropY,
-      int cropWidth, int cropHeight, ByteBuffer dstY, int dstStrideY, ByteBuffer dstU,
-      int dstStrideU, ByteBuffer dstV, int dstStrideV, int scaleWidth, int scaleHeight);
-}
diff --git a/sdk/android/api/org/webrtc/VideoFrameDrawer.java b/sdk/android/api/org/webrtc/VideoFrameDrawer.java
deleted file mode 100644
index 491fd05..0000000
--- a/sdk/android/api/org/webrtc/VideoFrameDrawer.java
+++ /dev/null
@@ -1,227 +0,0 @@
-/*
- *  Copyright 2017 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.
- */
-
-package org.webrtc;
-
-import android.graphics.Matrix;
-import android.graphics.Point;
-import android.opengl.GLES20;
-import java.nio.ByteBuffer;
-
-/**
- * Helper class to draw VideoFrames. Calls either drawer.drawOes, drawer.drawRgb, or
- * drawer.drawYuv depending on the type of the buffer. The frame will be rendered with rotation
- * taken into account. You can supply an additional render matrix for custom transformations.
- */
-public class VideoFrameDrawer {
-  /**
-   * Draws a VideoFrame.TextureBuffer. Calls either drawer.drawOes or drawer.drawRgb
-   * depending on the type of the buffer. You can supply an additional render matrix. This is
-   * used multiplied together with the transformation matrix of the frame. (M = renderMatrix *
-   * transformationMatrix)
-   */
-  static void drawTexture(RendererCommon.GlDrawer drawer, VideoFrame.TextureBuffer buffer,
-      Matrix renderMatrix, int frameWidth, int frameHeight, int viewportX, int viewportY,
-      int viewportWidth, int viewportHeight) {
-    Matrix finalMatrix = new Matrix(buffer.getTransformMatrix());
-    finalMatrix.preConcat(renderMatrix);
-    float[] finalGlMatrix = RendererCommon.convertMatrixFromAndroidGraphicsMatrix(finalMatrix);
-    switch (buffer.getType()) {
-      case OES:
-        drawer.drawOes(buffer.getTextureId(), finalGlMatrix, frameWidth, frameHeight, viewportX,
-            viewportY, viewportWidth, viewportHeight);
-        break;
-      case RGB:
-        drawer.drawRgb(buffer.getTextureId(), finalGlMatrix, frameWidth, frameHeight, viewportX,
-            viewportY, viewportWidth, viewportHeight);
-        break;
-      default:
-        throw new RuntimeException("Unknown texture type.");
-    }
-  }
-
-  /**
-   * Helper class for uploading YUV bytebuffer frames to textures that handles stride > width. This
-   * class keeps an internal ByteBuffer to avoid unnecessary allocations for intermediate copies.
-   */
-  private static class YuvUploader {
-    // Intermediate copy buffer for uploading yuv frames that are not packed, i.e. stride > width.
-    // TODO(magjed): Investigate when GL_UNPACK_ROW_LENGTH is available, or make a custom shader
-    // that handles stride and compare performance with intermediate copy.
-    private ByteBuffer copyBuffer;
-    private int[] yuvTextures;
-
-    /**
-     * Upload |planes| into OpenGL textures, taking stride into consideration.
-     *
-     * @return Array of three texture indices corresponding to Y-, U-, and V-plane respectively.
-     */
-    public int[] uploadYuvData(int width, int height, int[] strides, ByteBuffer[] planes) {
-      final int[] planeWidths = new int[] {width, width / 2, width / 2};
-      final int[] planeHeights = new int[] {height, height / 2, height / 2};
-      // Make a first pass to see if we need a temporary copy buffer.
-      int copyCapacityNeeded = 0;
-      for (int i = 0; i < 3; ++i) {
-        if (strides[i] > planeWidths[i]) {
-          copyCapacityNeeded = Math.max(copyCapacityNeeded, planeWidths[i] * planeHeights[i]);
-        }
-      }
-      // Allocate copy buffer if necessary.
-      if (copyCapacityNeeded > 0
-          && (copyBuffer == null || copyBuffer.capacity() < copyCapacityNeeded)) {
-        copyBuffer = ByteBuffer.allocateDirect(copyCapacityNeeded);
-      }
-      // Make sure YUV textures are allocated.
-      if (yuvTextures == null) {
-        yuvTextures = new int[3];
-        for (int i = 0; i < 3; i++) {
-          yuvTextures[i] = GlUtil.generateTexture(GLES20.GL_TEXTURE_2D);
-        }
-      }
-      // Upload each plane.
-      for (int i = 0; i < 3; ++i) {
-        GLES20.glActiveTexture(GLES20.GL_TEXTURE0 + i);
-        GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, yuvTextures[i]);
-        // GLES only accepts packed data, i.e. stride == planeWidth.
-        final ByteBuffer packedByteBuffer;
-        if (strides[i] == planeWidths[i]) {
-          // Input is packed already.
-          packedByteBuffer = planes[i];
-        } else {
-          VideoRenderer.nativeCopyPlane(
-              planes[i], planeWidths[i], planeHeights[i], strides[i], copyBuffer, planeWidths[i]);
-          packedByteBuffer = copyBuffer;
-        }
-        GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_LUMINANCE, planeWidths[i],
-            planeHeights[i], 0, GLES20.GL_LUMINANCE, GLES20.GL_UNSIGNED_BYTE, packedByteBuffer);
-      }
-      return yuvTextures;
-    }
-
-    public int[] uploadFromBuffer(VideoFrame.I420Buffer buffer) {
-      int[] strides = {buffer.getStrideY(), buffer.getStrideU(), buffer.getStrideV()};
-      ByteBuffer[] planes = {buffer.getDataY(), buffer.getDataU(), buffer.getDataV()};
-      return uploadYuvData(buffer.getWidth(), buffer.getHeight(), strides, planes);
-    }
-
-    public int[] getYuvTextures() {
-      return yuvTextures;
-    }
-
-    /**
-     * Releases cached resources. Uploader can still be used and the resources will be reallocated
-     * on first use.
-     */
-    public void release() {
-      copyBuffer = null;
-      if (yuvTextures != null) {
-        GLES20.glDeleteTextures(3, yuvTextures, 0);
-        yuvTextures = null;
-      }
-    }
-  }
-
-  private static int distance(float x0, float y0, float x1, float y1) {
-    return (int) Math.round(Math.hypot(x1 - x0, y1 - y0));
-  }
-
-  // These points are used to calculate the size of the part of the frame we are rendering.
-  final static float[] srcPoints =
-      new float[] {0f /* x0 */, 0f /* y0 */, 1f /* x1 */, 0f /* y1 */, 0f /* x2 */, 1f /* y2 */};
-  private final float[] dstPoints = new float[6];
-  private final Point renderSize = new Point();
-  private int renderWidth;
-  private int renderHeight;
-
-  // Calculate the frame size after |renderMatrix| is applied. Stores the output in member variables
-  // |renderWidth| and |renderHeight| to avoid allocations since this function is called for every
-  // frame.
-  private void calculateTransformedRenderSize(
-      int frameWidth, int frameHeight, Matrix renderMatrix) {
-    if (renderMatrix == null) {
-      renderWidth = frameWidth;
-      renderHeight = frameHeight;
-      return;
-    }
-    // Transform the texture coordinates (in the range [0, 1]) according to |renderMatrix|.
-    renderMatrix.mapPoints(dstPoints, srcPoints);
-
-    // Multiply with the width and height to get the positions in terms of pixels.
-    for (int i = 0; i < 3; ++i) {
-      dstPoints[i * 2 + 0] *= frameWidth;
-      dstPoints[i * 2 + 1] *= frameHeight;
-    }
-
-    // Get the length of the sides of the transformed rectangle in terms of pixels.
-    renderWidth = distance(dstPoints[0], dstPoints[1], dstPoints[2], dstPoints[3]);
-    renderHeight = distance(dstPoints[0], dstPoints[1], dstPoints[4], dstPoints[5]);
-  }
-
-  private final YuvUploader yuvUploader = new YuvUploader();
-  // This variable will only be used for checking reference equality and is used for caching I420
-  // textures.
-  private VideoFrame lastI420Frame;
-  private final Matrix renderMatrix = new Matrix();
-
-  public void drawFrame(VideoFrame frame, RendererCommon.GlDrawer drawer) {
-    drawFrame(frame, drawer, null /* additionalRenderMatrix */);
-  }
-
-  public void drawFrame(
-      VideoFrame frame, RendererCommon.GlDrawer drawer, Matrix additionalRenderMatrix) {
-    drawFrame(frame, drawer, additionalRenderMatrix, 0 /* viewportX */, 0 /* viewportY */,
-        frame.getRotatedWidth(), frame.getRotatedHeight());
-  }
-
-  public void drawFrame(VideoFrame frame, RendererCommon.GlDrawer drawer,
-      Matrix additionalRenderMatrix, int viewportX, int viewportY, int viewportWidth,
-      int viewportHeight) {
-    final int width = frame.getRotatedWidth();
-    final int height = frame.getRotatedHeight();
-
-    calculateTransformedRenderSize(width, height, additionalRenderMatrix);
-
-    final boolean isTextureFrame = frame.getBuffer() instanceof VideoFrame.TextureBuffer;
-    renderMatrix.reset();
-    renderMatrix.preTranslate(0.5f, 0.5f);
-    if (!isTextureFrame) {
-      renderMatrix.preScale(1f, -1f); // I420-frames are upside down
-    }
-    renderMatrix.preRotate(frame.getRotation());
-    renderMatrix.preTranslate(-0.5f, -0.5f);
-    if (additionalRenderMatrix != null) {
-      renderMatrix.preConcat(additionalRenderMatrix);
-    }
-
-    if (isTextureFrame) {
-      lastI420Frame = null;
-      drawTexture(drawer, (VideoFrame.TextureBuffer) frame.getBuffer(), renderMatrix, renderWidth,
-          renderHeight, viewportX, viewportY, viewportWidth, viewportHeight);
-    } else {
-      // Only upload the I420 data to textures once per frame, if we are called multiple times
-      // with the same frame.
-      if (frame != lastI420Frame) {
-        lastI420Frame = frame;
-        final VideoFrame.I420Buffer i420Buffer = frame.getBuffer().toI420();
-        yuvUploader.uploadFromBuffer(i420Buffer);
-        i420Buffer.release();
-      }
-
-      drawer.drawYuv(yuvUploader.getYuvTextures(),
-          RendererCommon.convertMatrixFromAndroidGraphicsMatrix(renderMatrix), renderWidth,
-          renderHeight, viewportX, viewportY, viewportWidth, viewportHeight);
-    }
-  }
-
-  public void release() {
-    yuvUploader.release();
-    lastI420Frame = null;
-  }
-}
diff --git a/sdk/android/api/org/webrtc/VideoRenderer.java b/sdk/android/api/org/webrtc/VideoRenderer.java
deleted file mode 100644
index e44578c..0000000
--- a/sdk/android/api/org/webrtc/VideoRenderer.java
+++ /dev/null
@@ -1,223 +0,0 @@
-/*
- *  Copyright 2013 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.
- */
-
-package org.webrtc;
-
-import java.nio.ByteBuffer;
-
-/**
- * Java version of VideoSinkInterface.  In addition to allowing clients to
- * define their own rendering behavior (by passing in a Callbacks object), this
- * class also provides a createGui() method for creating a GUI-rendering window
- * on various platforms.
- */
-public class VideoRenderer {
-  /**
-   * Java version of webrtc::VideoFrame. Frames are only constructed from native code and test
-   * code.
-   */
-  public static class I420Frame {
-    public final int width;
-    public final int height;
-    public final int[] yuvStrides;
-    public ByteBuffer[] yuvPlanes;
-    public final boolean yuvFrame;
-    // Matrix that transforms standard coordinates to their proper sampling locations in
-    // the texture. This transform compensates for any properties of the video source that
-    // cause it to appear different from a normalized texture. This matrix does not take
-    // |rotationDegree| into account.
-    public final float[] samplingMatrix;
-    public int textureId;
-    // Frame pointer in C++.
-    private long nativeFramePointer;
-
-    // rotationDegree is the degree that the frame must be rotated clockwisely
-    // to be rendered correctly.
-    public int rotationDegree;
-
-    // If this I420Frame was constructed from VideoFrame.Buffer, this points to
-    // the backing buffer.
-    private final VideoFrame.Buffer backingBuffer;
-
-    /**
-     * Construct a frame of the given dimensions with the specified planar data.
-     */
-    public I420Frame(int width, int height, int rotationDegree, int[] yuvStrides,
-        ByteBuffer[] yuvPlanes, long nativeFramePointer) {
-      this.width = width;
-      this.height = height;
-      this.yuvStrides = yuvStrides;
-      this.yuvPlanes = yuvPlanes;
-      this.yuvFrame = true;
-      this.rotationDegree = rotationDegree;
-      this.nativeFramePointer = nativeFramePointer;
-      backingBuffer = null;
-      if (rotationDegree % 90 != 0) {
-        throw new IllegalArgumentException("Rotation degree not multiple of 90: " + rotationDegree);
-      }
-      // The convention in WebRTC is that the first element in a ByteBuffer corresponds to the
-      // top-left corner of the image, but in glTexImage2D() the first element corresponds to the
-      // bottom-left corner. This discrepancy is corrected by setting a vertical flip as sampling
-      // matrix.
-      samplingMatrix = RendererCommon.verticalFlipMatrix();
-    }
-
-    /**
-     * Construct a texture frame of the given dimensions with data in SurfaceTexture
-     */
-    public I420Frame(int width, int height, int rotationDegree, int textureId,
-        float[] samplingMatrix, long nativeFramePointer) {
-      this.width = width;
-      this.height = height;
-      this.yuvStrides = null;
-      this.yuvPlanes = null;
-      this.samplingMatrix = samplingMatrix;
-      this.textureId = textureId;
-      this.yuvFrame = false;
-      this.rotationDegree = rotationDegree;
-      this.nativeFramePointer = nativeFramePointer;
-      backingBuffer = null;
-      if (rotationDegree % 90 != 0) {
-        throw new IllegalArgumentException("Rotation degree not multiple of 90: " + rotationDegree);
-      }
-    }
-
-    /**
-     * Construct a frame from VideoFrame.Buffer.
-     */
-    public I420Frame(int rotationDegree, VideoFrame.Buffer buffer, long nativeFramePointer) {
-      this.width = buffer.getWidth();
-      this.height = buffer.getHeight();
-      this.rotationDegree = rotationDegree;
-      if (rotationDegree % 90 != 0) {
-        throw new IllegalArgumentException("Rotation degree not multiple of 90: " + rotationDegree);
-      }
-      if (buffer instanceof VideoFrame.TextureBuffer
-          && ((VideoFrame.TextureBuffer) buffer).getType() == VideoFrame.TextureBuffer.Type.OES) {
-        VideoFrame.TextureBuffer textureBuffer = (VideoFrame.TextureBuffer) buffer;
-        this.yuvFrame = false;
-        this.textureId = textureBuffer.getTextureId();
-        this.samplingMatrix = RendererCommon.convertMatrixFromAndroidGraphicsMatrix(
-            textureBuffer.getTransformMatrix());
-
-        this.yuvStrides = null;
-        this.yuvPlanes = null;
-      } else if (buffer instanceof VideoFrame.I420Buffer) {
-        VideoFrame.I420Buffer i420Buffer = (VideoFrame.I420Buffer) buffer;
-        this.yuvFrame = true;
-        this.yuvStrides =
-            new int[] {i420Buffer.getStrideY(), i420Buffer.getStrideU(), i420Buffer.getStrideV()};
-        this.yuvPlanes =
-            new ByteBuffer[] {i420Buffer.getDataY(), i420Buffer.getDataU(), i420Buffer.getDataV()};
-        // The convention in WebRTC is that the first element in a ByteBuffer corresponds to the
-        // top-left corner of the image, but in glTexImage2D() the first element corresponds to the
-        // bottom-left corner. This discrepancy is corrected by multiplying the sampling matrix with
-        // a vertical flip matrix.
-        this.samplingMatrix = RendererCommon.verticalFlipMatrix();
-
-        this.textureId = 0;
-      } else {
-        this.yuvFrame = false;
-        this.textureId = 0;
-        this.samplingMatrix = null;
-        this.yuvStrides = null;
-        this.yuvPlanes = null;
-      }
-      this.nativeFramePointer = nativeFramePointer;
-      backingBuffer = buffer;
-    }
-
-    public int rotatedWidth() {
-      return (rotationDegree % 180 == 0) ? width : height;
-    }
-
-    public int rotatedHeight() {
-      return (rotationDegree % 180 == 0) ? height : width;
-    }
-
-    @Override
-    public String toString() {
-      final String type = yuvFrame
-          ? "Y: " + yuvStrides[0] + ", U: " + yuvStrides[1] + ", V: " + yuvStrides[2]
-          : "Texture: " + textureId;
-      return width + "x" + height + ", " + type;
-    }
-
-    /**
-     * Convert the frame to VideoFrame. It is no longer safe to use the I420Frame after calling
-     * this.
-     */
-    VideoFrame toVideoFrame() {
-      final VideoFrame.Buffer buffer;
-      if (backingBuffer != null) {
-        // We were construted from a VideoFrame.Buffer, just return it.
-        // Make sure webrtc::VideoFrame object is released.
-        backingBuffer.retain();
-        VideoRenderer.renderFrameDone(this);
-        buffer = backingBuffer;
-      } else if (yuvFrame) {
-        buffer = new I420BufferImpl(width, height, yuvPlanes[0], yuvStrides[0], yuvPlanes[1],
-            yuvStrides[1], yuvPlanes[2], yuvStrides[2],
-            () -> { VideoRenderer.renderFrameDone(this); });
-      } else {
-        // Note: surfaceTextureHelper being null means calling toI420 will crash.
-        buffer = new TextureBufferImpl(width, height, VideoFrame.TextureBuffer.Type.OES, textureId,
-            RendererCommon.convertMatrixToAndroidGraphicsMatrix(samplingMatrix),
-            null /* surfaceTextureHelper */, () -> { VideoRenderer.renderFrameDone(this); });
-      }
-      return new VideoFrame(buffer, rotationDegree, 0 /* timestampNs */);
-    }
-  }
-
-  // Helper native function to do a video frame plane copying.
-  public static native void nativeCopyPlane(
-      ByteBuffer src, int width, int height, int srcStride, ByteBuffer dst, int dstStride);
-
-  /** The real meat of VideoSinkInterface. */
-  public static interface Callbacks {
-    // |frame| might have pending rotation and implementation of Callbacks
-    // should handle that by applying rotation during rendering. The callee
-    // is responsible for signaling when it is done with |frame| by calling
-    // renderFrameDone(frame).
-    public void renderFrame(I420Frame frame);
-  }
-
-  /**
-   * This must be called after every renderFrame() to release the frame.
-   */
-  public static void renderFrameDone(I420Frame frame) {
-    frame.yuvPlanes = null;
-    frame.textureId = 0;
-    if (frame.nativeFramePointer != 0) {
-      releaseNativeFrame(frame.nativeFramePointer);
-      frame.nativeFramePointer = 0;
-    }
-  }
-
-  long nativeVideoRenderer;
-
-  public VideoRenderer(Callbacks callbacks) {
-    nativeVideoRenderer = nativeWrapVideoRenderer(callbacks);
-  }
-
-  public void dispose() {
-    if (nativeVideoRenderer == 0) {
-      // Already disposed.
-      return;
-    }
-
-    freeWrappedVideoRenderer(nativeVideoRenderer);
-    nativeVideoRenderer = 0;
-  }
-
-  private static native long nativeWrapVideoRenderer(Callbacks callbacks);
-  private static native void freeWrappedVideoRenderer(long nativeVideoRenderer);
-  private static native void releaseNativeFrame(long nativeFramePointer);
-}
diff --git a/sdk/android/api/org/webrtc/VideoSink.java b/sdk/android/api/org/webrtc/VideoSink.java
deleted file mode 100644
index e4162fe..0000000
--- a/sdk/android/api/org/webrtc/VideoSink.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- *  Copyright 2017 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.
- */
-
-package org.webrtc;
-
-/**
- * Java version of rtc::VideoSinkInterface.
- */
-public interface VideoSink {
-  /**
-   * Implementations should call frame.retain() if they need to hold a reference to the frame after
-   * this function returns. Each call to retain() should be followed by a call to frame.release()
-   * when the reference is no longer needed.
-   */
-  void onFrame(VideoFrame frame);
-}
diff --git a/sdk/android/api/org/webrtc/VideoSource.java b/sdk/android/api/org/webrtc/VideoSource.java
deleted file mode 100644
index d9531cd..0000000
--- a/sdk/android/api/org/webrtc/VideoSource.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- *  Copyright 2013 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.
- */
-
-package org.webrtc;
-
-/**
- * Java wrapper of native AndroidVideoTrackSource.
- */
-public class VideoSource extends MediaSource {
-  public VideoSource(long nativeSource) {
-    super(nativeSource);
-  }
-
-  /**
-   * Calling this function will cause frames to be scaled down to the requested resolution. Also,
-   * frames will be cropped to match the requested aspect ratio, and frames will be dropped to match
-   * the requested fps. The requested aspect ratio is orientation agnostic and will be adjusted to
-   * maintain the input orientation, so it doesn't matter if e.g. 1280x720 or 720x1280 is requested.
-   */
-  public void adaptOutputFormat(int width, int height, int fps) {
-    nativeAdaptOutputFormat(nativeSource, width, height, fps);
-  }
-
-  private static native void nativeAdaptOutputFormat(
-      long nativeSource, int width, int height, int fps);
-}
diff --git a/sdk/android/api/org/webrtc/VideoTrack.java b/sdk/android/api/org/webrtc/VideoTrack.java
deleted file mode 100644
index 18a826c..0000000
--- a/sdk/android/api/org/webrtc/VideoTrack.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- *  Copyright 2013 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.
- */
-
-package org.webrtc;
-
-import java.util.IdentityHashMap;
-import java.util.LinkedList;
-
-/** Java version of VideoTrackInterface. */
-public class VideoTrack extends MediaStreamTrack {
-  private final LinkedList<VideoRenderer> renderers = new LinkedList<VideoRenderer>();
-  private final IdentityHashMap<VideoSink, Long> sinks = new IdentityHashMap<VideoSink, Long>();
-
-  public VideoTrack(long nativeTrack) {
-    super(nativeTrack);
-  }
-
-  /**
-   * Adds a VideoSink to the track.
-   *
-   * A track can have any number of VideoSinks. VideoSinks will replace
-   * renderers. However, converting old style texture frames will involve costly
-   * conversion to I420 so it is not recommended to upgrade before all your
-   * sources produce VideoFrames.
-   */
-  public void addSink(VideoSink sink) {
-    final long nativeSink = nativeWrapSink(sink);
-    sinks.put(sink, nativeSink);
-    nativeAddSink(nativeTrack, nativeSink);
-  }
-
-  /**
-   * Removes a VideoSink from the track.
-   *
-   * If the VideoSink was not attached to the track, this is a no-op.
-   */
-  public void removeSink(VideoSink sink) {
-    final long nativeSink = sinks.remove(sink);
-    if (nativeSink != 0) {
-      nativeRemoveSink(nativeTrack, nativeSink);
-      nativeFreeSink(nativeSink);
-    }
-  }
-
-  public void addRenderer(VideoRenderer renderer) {
-    renderers.add(renderer);
-    nativeAddSink(nativeTrack, renderer.nativeVideoRenderer);
-  }
-
-  public void removeRenderer(VideoRenderer renderer) {
-    if (!renderers.remove(renderer)) {
-      return;
-    }
-    nativeRemoveSink(nativeTrack, renderer.nativeVideoRenderer);
-    renderer.dispose();
-  }
-
-  public void dispose() {
-    while (!renderers.isEmpty()) {
-      removeRenderer(renderers.getFirst());
-    }
-    for (long nativeSink : sinks.values()) {
-      nativeRemoveSink(nativeTrack, nativeSink);
-      nativeFreeSink(nativeSink);
-    }
-    sinks.clear();
-    super.dispose();
-  }
-
-  private static native void nativeAddSink(long nativeTrack, long nativeSink);
-  private static native void nativeRemoveSink(long nativeTrack, long nativeSink);
-
-  private static native long nativeWrapSink(VideoSink sink);
-  private static native void nativeFreeSink(long nativeSink);
-}
diff --git a/sdk/android/instrumentationtests/AndroidManifest.xml b/sdk/android/instrumentationtests/AndroidManifest.xml
deleted file mode 100644
index c239a83..0000000
--- a/sdk/android/instrumentationtests/AndroidManifest.xml
+++ /dev/null
@@ -1,41 +0,0 @@
-<!--
- *  Copyright 2017 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.
--->
-
-<manifest
-      xmlns:android="http://schemas.android.com/apk/res/android"
-      xmlns:tools="http://schemas.android.com/tools"
-      package="org.webrtc">
-    <uses-feature android:name="android.hardware.camera" />
-    <uses-feature android:name="android.hardware.camera.autofocus" />
-    <uses-feature android:glEsVersion="0x00020000" android:required="true" />
-
-    <uses-sdk android:minSdkVersion="16" android:targetSdkVersion="21" />
-
-    <uses-permission android:name="android.permission.CAMERA" />
-    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
-    <uses-permission android:name="android.permission.RECORD_AUDIO" />
-    <uses-permission android:name="android.permission.INTERNET" />
-    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
-    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
-    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
-    <uses-permission android:name="android.permission.RUN_INSTRUMENTATION" />
-
-    <application>
-        <uses-library android:name="android.test.runner" />
-    </application>
-
-    <!-- tools:ignore needed for chromium-junit4 tag. crbug.com/640116
-         TODO(sakal): Remove once the tag is no longer needed. -->
-    <instrumentation android:name="android.support.test.runner.AndroidJUnitRunner"
-        tools:ignore="MissingPrefix"
-        android:targetPackage="org.webrtc"
-        android:label="Tests for WebRTC Android SDK"
-        chromium-junit4="true"/>
-</manifest>
diff --git a/sdk/android/instrumentationtests/ant.properties b/sdk/android/instrumentationtests/ant.properties
deleted file mode 100644
index bc05353..0000000
--- a/sdk/android/instrumentationtests/ant.properties
+++ /dev/null
@@ -1,18 +0,0 @@
-# This file is used to override default values used by the Ant build system.
-#
-# This file must be checked into Version Control Systems, as it is
-# integral to the build system of your project.
-
-# This file is only used by the Ant script.
-
-# You can use this to override default values such as
-#  'source.dir' for the location of your java source folder and
-#  'out.dir' for the location of your output folder.
-
-# You can also use it define how the release builds are signed by declaring
-# the following properties:
-#  'key.store' for the location of your keystore and
-#  'key.alias' for the name of the key to use.
-# The password will be asked during the build when you use the 'release' target.
-
-source.dir=../java/testcommon/src;src
\ No newline at end of file
diff --git a/sdk/android/instrumentationtests/build.xml b/sdk/android/instrumentationtests/build.xml
deleted file mode 100644
index cb4cb7a..0000000
--- a/sdk/android/instrumentationtests/build.xml
+++ /dev/null
@@ -1,92 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project name="libjingle_peerconnection_android_unittest" default="help">
-
-    <!-- The local.properties file is created and updated by the 'android' tool.
-         It contains the path to the SDK. It should *NOT* be checked into
-         Version Control Systems. -->
-    <property file="local.properties" />
-
-    <!-- The ant.properties file can be created by you. It is only edited by the
-         'android' tool to add properties to it.
-         This is the place to change some Ant specific build properties.
-         Here are some properties you may want to change/update:
-
-         source.dir
-             The name of the source directory. Default is 'src'.
-         out.dir
-             The name of the output directory. Default is 'bin'.
-
-         For other overridable properties, look at the beginning of the rules
-         files in the SDK, at tools/ant/build.xml
-
-         Properties related to the SDK location or the project target should
-         be updated using the 'android' tool with the 'update' action.
-
-         This file is an integral part of the build system for your
-         application and should be checked into Version Control Systems.
-
-         -->
-    <property file="ant.properties" />
-
-    <!-- if sdk.dir was not set from one of the property file, then
-         get it from the ANDROID_HOME env var.
-         This must be done before we load project.properties since
-         the proguard config can use sdk.dir -->
-    <property environment="env" />
-    <condition property="sdk.dir" value="${env.ANDROID_SDK_ROOT}">
-        <isset property="env.ANDROID_SDK_ROOT" />
-    </condition>
-
-    <!-- The project.properties file is created and updated by the 'android'
-         tool, as well as ADT.
-
-         This contains project specific properties such as project target, and library
-         dependencies. Lower level build properties are stored in ant.properties
-         (or in .classpath for Eclipse projects).
-
-         This file is an integral part of the build system for your
-         application and should be checked into Version Control Systems. -->
-    <loadproperties srcFile="project.properties" />
-
-    <!-- quick check on sdk.dir -->
-    <fail
-            message="sdk.dir is missing. Make sure to generate local.properties using 'android update project' or to inject it through the ANDROID_HOME environment variable."
-            unless="sdk.dir"
-    />
-
-    <!--
-        Import per project custom build rules if present at the root of the project.
-        This is the place to put custom intermediary targets such as:
-            -pre-build
-            -pre-compile
-            -post-compile (This is typically used for code obfuscation.
-                           Compiled code location: ${out.classes.absolute.dir}
-                           If this is not done in place, override ${out.dex.input.absolute.dir})
-            -post-package
-            -post-build
-            -pre-clean
-    -->
-    <import file="custom_rules.xml" optional="true" />
-
-    <!-- Import the actual build file.
-
-         To customize existing targets, there are two options:
-         - Customize only one target:
-             - copy/paste the target into this file, *before* the
-               <import> task.
-             - customize it to your needs.
-         - Customize the whole content of build.xml
-             - copy/paste the content of the rules files (minus the top node)
-               into this file, replacing the <import> task.
-             - customize to your needs.
-
-         ***********************
-         ****** IMPORTANT ******
-         ***********************
-         In all cases you must update the value of version-tag below to read 'custom' instead of an integer,
-         in order to avoid having your file be overridden by tools such as "android update project"
-    -->
-    <!-- version-tag: 1 -->
-    <import file="${sdk.dir}/tools/ant/build.xml" />
-
-</project>
diff --git a/sdk/android/instrumentationtests/project.properties b/sdk/android/instrumentationtests/project.properties
deleted file mode 100644
index a6ca533..0000000
--- a/sdk/android/instrumentationtests/project.properties
+++ /dev/null
@@ -1,16 +0,0 @@
-# This file is automatically generated by Android Tools.
-# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
-#
-# This file must be checked in Version Control Systems.
-#
-# To customize properties used by the Ant build system edit
-# "ant.properties", and override values to adapt the script to your
-# project structure.
-#
-# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
-#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
-
-# Project target.
-target=android-22
-
-java.compilerargs=-Xlint:all -Werror
diff --git a/sdk/android/instrumentationtests/src/org/webrtc/Camera1CapturerUsingByteBufferTest.java b/sdk/android/instrumentationtests/src/org/webrtc/Camera1CapturerUsingByteBufferTest.java
deleted file mode 100644
index cb8ad5f..0000000
--- a/sdk/android/instrumentationtests/src/org/webrtc/Camera1CapturerUsingByteBufferTest.java
+++ /dev/null
@@ -1,204 +0,0 @@
-/*
- *  Copyright 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.
- */
-
-package org.webrtc;
-
-import android.content.Context;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.LargeTest;
-import android.support.test.filters.MediumTest;
-import android.support.test.filters.SmallTest;
-import java.io.IOException;
-import org.chromium.base.test.BaseJUnit4ClassRunner;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-@RunWith(BaseJUnit4ClassRunner.class)
-public class Camera1CapturerUsingByteBufferTest {
-  static final String TAG = "Camera1CapturerUsingByteBufferTest";
-
-  private class TestObjectFactory extends CameraVideoCapturerTestFixtures.TestObjectFactory {
-    @Override
-    public boolean isCapturingToTexture() {
-      return false;
-    }
-
-    @Override
-    public CameraEnumerator getCameraEnumerator() {
-      return new Camera1Enumerator(false);
-    }
-
-    @Override
-    public Context getAppContext() {
-      return InstrumentationRegistry.getTargetContext();
-    }
-
-    @SuppressWarnings("deprecation")
-    @Override
-    public Object rawOpenCamera(String cameraName) {
-      return android.hardware.Camera.open(Camera1Enumerator.getCameraIndex(cameraName));
-    }
-
-    @SuppressWarnings("deprecation")
-    @Override
-    public void rawCloseCamera(Object camera) {
-      ((android.hardware.Camera) camera).release();
-    }
-  }
-
-  private CameraVideoCapturerTestFixtures fixtures;
-
-  @Before
-  public void setUp() {
-    // Enable VideoFrame capture.
-    PeerConnectionFactory.initializeFieldTrials(PeerConnectionFactory.VIDEO_FRAME_EMIT_TRIAL + "/"
-        + PeerConnectionFactory.TRIAL_ENABLED + "/");
-    fixtures = new CameraVideoCapturerTestFixtures(new TestObjectFactory());
-  }
-
-  @After
-  public void tearDown() {
-    fixtures.dispose();
-  }
-
-  @Test
-  @SmallTest
-  public void testCreateAndDispose() throws InterruptedException {
-    fixtures.createCapturerAndDispose();
-  }
-
-  @Test
-  @SmallTest
-  public void testCreateNonExistingCamera() throws InterruptedException {
-    fixtures.createNonExistingCamera();
-  }
-
-  // This test that the camera can be started and that the frames are forwarded
-  // to a Java video renderer using a "default" capturer.
-  // It tests both the Java and the C++ layer.
-  @Test
-  @MediumTest
-  public void testCreateCapturerAndRender() throws InterruptedException {
-    fixtures.createCapturerAndRender();
-  }
-
-  // This test that the camera can be started and that the frames are forwarded
-  // to a Java video renderer using the front facing video capturer.
-  // It tests both the Java and the C++ layer.
-  @Test
-  @MediumTest
-  public void testStartFrontFacingVideoCapturer() throws InterruptedException {
-    fixtures.createFrontFacingCapturerAndRender();
-  }
-
-  // This test that the camera can be started and that the frames are forwarded
-  // to a Java video renderer using the back facing video capturer.
-  // It tests both the Java and the C++ layer.
-  @Test
-  @MediumTest
-  public void testStartBackFacingVideoCapturer() throws InterruptedException {
-    fixtures.createBackFacingCapturerAndRender();
-  }
-
-  // This test that the default camera can be started and that the camera can
-  // later be switched to another camera.
-  // It tests both the Java and the C++ layer.
-  @Test
-  @MediumTest
-  public void testSwitchVideoCapturer() throws InterruptedException {
-    fixtures.switchCamera();
-  }
-
-  @Test
-  @MediumTest
-  public void testCameraEvents() throws InterruptedException {
-    fixtures.cameraEventsInvoked();
-  }
-
-  @Test
-  @MediumTest
-  public void testUpdateMediaRecorder() throws InterruptedException, IOException {
-    fixtures.updateMediaRecorder(false /* useSurfaceCapture */);
-  }
-
-  // Test what happens when attempting to call e.g. switchCamera() after camera has been stopped.
-  @Test
-  @MediumTest
-  public void testCameraCallsAfterStop() throws InterruptedException {
-    fixtures.cameraCallsAfterStop();
-  }
-
-  // This test that the VideoSource that the CameraVideoCapturer is connected to can
-  // be stopped and restarted. It tests both the Java and the C++ layer.
-  @Test
-  @LargeTest
-  public void testStopRestartVideoSource() throws InterruptedException {
-    fixtures.stopRestartVideoSource();
-  }
-
-  // This test that the camera can be started at different resolutions.
-  // It does not test or use the C++ layer.
-  @Test
-  @LargeTest
-  public void testStartStopWithDifferentResolutions() throws InterruptedException {
-    fixtures.startStopWithDifferentResolutions();
-  }
-
-  // This test what happens if buffers are returned after the capturer have
-  // been stopped and restarted. It does not test or use the C++ layer.
-  @Test
-  @LargeTest
-  public void testReturnBufferLate() throws InterruptedException {
-    fixtures.returnBufferLate();
-  }
-
-  // This test that we can capture frames, keep the frames in a local renderer, stop capturing,
-  // and then return the frames. The difference between the test testReturnBufferLate() is that we
-  // also test the JNI and C++ AndroidVideoCapturer parts.
-  @Test
-  @MediumTest
-  public void testReturnBufferLateEndToEnd() throws InterruptedException {
-    fixtures.returnBufferLateEndToEnd();
-  }
-
-  // This test that frames forwarded to a renderer is scaled if adaptOutputFormat is
-  // called. This test both Java and C++ parts of of the stack.
-  @Test
-  @MediumTest
-  public void testScaleCameraOutput() throws InterruptedException {
-    fixtures.scaleCameraOutput();
-  }
-
-  // This test that an error is reported if the camera is already opened
-  // when CameraVideoCapturer is started.
-  @Test
-  @LargeTest
-  public void testStartWhileCameraIsAlreadyOpen() throws InterruptedException {
-    fixtures.startWhileCameraIsAlreadyOpen();
-  }
-
-  // This test that CameraVideoCapturer can be started, even if the camera is already opened
-  // if the camera is closed while CameraVideoCapturer is re-trying to start.
-  @Test
-  @LargeTest
-  public void testStartWhileCameraIsAlreadyOpenAndCloseCamera() throws InterruptedException {
-    fixtures.startWhileCameraIsAlreadyOpenAndCloseCamera();
-  }
-
-  // This test that CameraVideoCapturer.stop can be called while CameraVideoCapturer is
-  // re-trying to start.
-  @Test
-  @MediumTest
-  public void testStartWhileCameraIsAlreadyOpenAndStop() throws InterruptedException {
-    fixtures.startWhileCameraIsAlreadyOpenAndStop();
-  }
-}
diff --git a/sdk/android/instrumentationtests/src/org/webrtc/Camera1CapturerUsingTextureTest.java b/sdk/android/instrumentationtests/src/org/webrtc/Camera1CapturerUsingTextureTest.java
deleted file mode 100644
index fd74ee5..0000000
--- a/sdk/android/instrumentationtests/src/org/webrtc/Camera1CapturerUsingTextureTest.java
+++ /dev/null
@@ -1,207 +0,0 @@
-/*
- *  Copyright 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.
- */
-
-package org.webrtc;
-
-import android.content.Context;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.LargeTest;
-import android.support.test.filters.MediumTest;
-import android.support.test.filters.SmallTest;
-import java.io.IOException;
-import org.chromium.base.test.BaseJUnit4ClassRunner;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-@RunWith(BaseJUnit4ClassRunner.class)
-public class Camera1CapturerUsingTextureTest {
-  static final String TAG = "Camera1CapturerUsingTextureTest";
-
-  private class TestObjectFactory extends CameraVideoCapturerTestFixtures.TestObjectFactory {
-    @Override
-    public CameraEnumerator getCameraEnumerator() {
-      return new Camera1Enumerator();
-    }
-
-    @Override
-    public Context getAppContext() {
-      return InstrumentationRegistry.getTargetContext();
-    }
-
-    @SuppressWarnings("deprecation")
-    @Override
-    public Object rawOpenCamera(String cameraName) {
-      return android.hardware.Camera.open(Camera1Enumerator.getCameraIndex(cameraName));
-    }
-
-    @SuppressWarnings("deprecation")
-    @Override
-    public void rawCloseCamera(Object camera) {
-      ((android.hardware.Camera) camera).release();
-    }
-  }
-
-  private CameraVideoCapturerTestFixtures fixtures;
-
-  @Before
-  public void setUp() {
-    // Enable VideoFrame capture.
-    PeerConnectionFactory.initializeFieldTrials(PeerConnectionFactory.VIDEO_FRAME_EMIT_TRIAL + "/"
-        + PeerConnectionFactory.TRIAL_ENABLED + "/");
-    fixtures = new CameraVideoCapturerTestFixtures(new TestObjectFactory());
-  }
-
-  @After
-  public void tearDown() {
-    fixtures.dispose();
-  }
-
-  @Test
-  @SmallTest
-  public void testCreateAndDispose() throws InterruptedException {
-    fixtures.createCapturerAndDispose();
-  }
-
-  @Test
-  @SmallTest
-  public void testCreateNonExistingCamera() throws InterruptedException {
-    fixtures.createNonExistingCamera();
-  }
-
-  // This test that the camera can be started and that the frames are forwarded
-  // to a Java video renderer using a "default" capturer.
-  // It tests both the Java and the C++ layer.
-  @Test
-  @MediumTest
-  public void testCreateCapturerAndRender() throws InterruptedException {
-    fixtures.createCapturerAndRender();
-  }
-
-  // This test that the camera can be started and that the frames are forwarded
-  // to a Java video renderer using the front facing video capturer.
-  // It tests both the Java and the C++ layer.
-  @Test
-  @MediumTest
-  public void testStartFrontFacingVideoCapturer() throws InterruptedException {
-    fixtures.createFrontFacingCapturerAndRender();
-  }
-
-  // This test that the camera can be started and that the frames are forwarded
-  // to a Java video renderer using the back facing video capturer.
-  // It tests both the Java and the C++ layer.
-  @Test
-  @MediumTest
-  public void testStartBackFacingVideoCapturer() throws InterruptedException {
-    fixtures.createBackFacingCapturerAndRender();
-  }
-
-  // This test that the default camera can be started and that the camera can
-  // later be switched to another camera.
-  // It tests both the Java and the C++ layer.
-  @Test
-  @MediumTest
-  public void testSwitchVideoCapturer() throws InterruptedException {
-    fixtures.switchCamera();
-  }
-
-  @Test
-  @MediumTest
-  public void testCameraEvents() throws InterruptedException {
-    fixtures.cameraEventsInvoked();
-  }
-
-  @Test
-  @MediumTest
-  public void testUpdateMediaRecorder() throws InterruptedException, IOException {
-    fixtures.updateMediaRecorder(false /* useSurfaceCapture */);
-  }
-
-  // Test what happens when attempting to call e.g. switchCamera() after camera has been stopped.
-  @Test
-  @MediumTest
-  public void testCameraCallsAfterStop() throws InterruptedException {
-    fixtures.cameraCallsAfterStop();
-  }
-
-  // This test that the VideoSource that the CameraVideoCapturer is connected to can
-  // be stopped and restarted. It tests both the Java and the C++ layer.
-  @Test
-  @LargeTest
-  public void testStopRestartVideoSource() throws InterruptedException {
-    fixtures.stopRestartVideoSource();
-  }
-
-  // This test that the camera can be started at different resolutions.
-  // It does not test or use the C++ layer.
-  @Test
-  @LargeTest
-  public void testStartStopWithDifferentResolutions() throws InterruptedException {
-    fixtures.startStopWithDifferentResolutions();
-  }
-
-  // This test what happens if buffers are returned after the capturer have
-  // been stopped and restarted. It does not test or use the C++ layer.
-  @Test
-  @LargeTest
-  public void testReturnBufferLate() throws InterruptedException {
-    fixtures.returnBufferLate();
-  }
-
-  // This test that we can capture frames, keep the frames in a local renderer, stop capturing,
-  // and then return the frames. The difference between the test testReturnBufferLate() is that we
-  // also test the JNI and C++ AndroidVideoCapturer parts.
-  @Test
-  @MediumTest
-  public void testReturnBufferLateEndToEnd() throws InterruptedException {
-    fixtures.returnBufferLateEndToEnd();
-  }
-
-  // This test that CameraEventsHandler.onError is triggered if video buffers are not returned to
-  // the capturer.
-  @Test
-  @LargeTest
-  public void testCameraFreezedEventOnBufferStarvation() throws InterruptedException {
-    fixtures.cameraFreezedEventOnBufferStarvation();
-  }
-
-  // This test that frames forwarded to a renderer is scaled if adaptOutputFormat is
-  // called. This test both Java and C++ parts of of the stack.
-  @Test
-  @MediumTest
-  public void testScaleCameraOutput() throws InterruptedException {
-    fixtures.scaleCameraOutput();
-  }
-
-  // This test that an error is reported if the camera is already opened
-  // when CameraVideoCapturer is started.
-  @Test
-  @LargeTest
-  public void testStartWhileCameraIsAlreadyOpen() throws InterruptedException {
-    fixtures.startWhileCameraIsAlreadyOpen();
-  }
-
-  // This test that CameraVideoCapturer can be started, even if the camera is already opened
-  // if the camera is closed while CameraVideoCapturer is re-trying to start.
-  @Test
-  @LargeTest
-  public void testStartWhileCameraIsAlreadyOpenAndCloseCamera() throws InterruptedException {
-    fixtures.startWhileCameraIsAlreadyOpenAndCloseCamera();
-  }
-
-  // This test that CameraVideoCapturer.stop can be called while CameraVideoCapturer is
-  // re-trying to start.
-  @Test
-  @MediumTest
-  public void testStartWhileCameraIsAlreadyOpenAndStop() throws InterruptedException {
-    fixtures.startWhileCameraIsAlreadyOpenAndStop();
-  }
-}
diff --git a/sdk/android/instrumentationtests/src/org/webrtc/Camera2CapturerTest.java b/sdk/android/instrumentationtests/src/org/webrtc/Camera2CapturerTest.java
deleted file mode 100644
index a256294..0000000
--- a/sdk/android/instrumentationtests/src/org/webrtc/Camera2CapturerTest.java
+++ /dev/null
@@ -1,336 +0,0 @@
-/*
- *  Copyright 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.
- */
-
-package org.webrtc;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.fail;
-
-import android.annotation.TargetApi;
-import android.content.Context;
-import android.hardware.camera2.CameraAccessException;
-import android.hardware.camera2.CameraDevice;
-import android.hardware.camera2.CameraManager;
-import android.os.Handler;
-import android.os.Looper;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.LargeTest;
-import android.support.test.filters.MediumTest;
-import android.support.test.filters.SmallTest;
-import java.io.IOException;
-import java.util.concurrent.CountDownLatch;
-import org.chromium.base.test.BaseJUnit4ClassRunner;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-@TargetApi(21)
-@RunWith(BaseJUnit4ClassRunner.class)
-public class Camera2CapturerTest {
-  static final String TAG = "Camera2CapturerTest";
-
-  /**
-   * Simple camera2 implementation that only knows how to open the camera and close it.
-   */
-  private class SimpleCamera2 {
-    final CameraManager cameraManager;
-    final LooperThread looperThread;
-    final CountDownLatch openDoneSignal;
-    final Object cameraDeviceLock;
-    CameraDevice cameraDevice; // Guarded by cameraDeviceLock
-    boolean openSucceeded; // Guarded by cameraDeviceLock
-
-    private class LooperThread extends Thread {
-      final CountDownLatch startedSignal = new CountDownLatch(1);
-      private Handler handler;
-
-      @Override
-      public void run() {
-        Looper.prepare();
-        handler = new Handler();
-        startedSignal.countDown();
-        Looper.loop();
-      }
-
-      public void waitToStart() {
-        ThreadUtils.awaitUninterruptibly(startedSignal);
-      }
-
-      public void requestStop() {
-        handler.getLooper().quit();
-      }
-
-      public Handler getHandler() {
-        return handler;
-      }
-    }
-
-    private class CameraStateCallback extends CameraDevice.StateCallback {
-      @Override
-      public void onClosed(CameraDevice cameraDevice) {
-        Logging.d(TAG, "Simple camera2 closed.");
-
-        synchronized (cameraDeviceLock) {
-          SimpleCamera2.this.cameraDevice = null;
-        }
-      }
-
-      @Override
-      public void onDisconnected(CameraDevice cameraDevice) {
-        Logging.d(TAG, "Simple camera2 disconnected.");
-
-        synchronized (cameraDeviceLock) {
-          SimpleCamera2.this.cameraDevice = null;
-        }
-      }
-
-      @Override
-      public void onError(CameraDevice cameraDevice, int errorCode) {
-        Logging.w(TAG, "Simple camera2 error: " + errorCode);
-
-        synchronized (cameraDeviceLock) {
-          SimpleCamera2.this.cameraDevice = cameraDevice;
-          openSucceeded = false;
-        }
-
-        openDoneSignal.countDown();
-      }
-
-      @Override
-      public void onOpened(CameraDevice cameraDevice) {
-        Logging.d(TAG, "Simple camera2 opened.");
-
-        synchronized (cameraDeviceLock) {
-          SimpleCamera2.this.cameraDevice = cameraDevice;
-          openSucceeded = true;
-        }
-
-        openDoneSignal.countDown();
-      }
-    }
-
-    SimpleCamera2(Context context, String deviceName) {
-      cameraManager = (CameraManager) context.getSystemService(Context.CAMERA_SERVICE);
-      looperThread = new LooperThread();
-      looperThread.start();
-      looperThread.waitToStart();
-      cameraDeviceLock = new Object();
-      openDoneSignal = new CountDownLatch(1);
-      cameraDevice = null;
-      Logging.d(TAG, "Opening simple camera2.");
-      try {
-        cameraManager.openCamera(deviceName, new CameraStateCallback(), looperThread.getHandler());
-      } catch (CameraAccessException e) {
-        fail("Simple camera2 CameraAccessException: " + e.getMessage());
-      }
-
-      Logging.d(TAG, "Waiting for simple camera2 to open.");
-      ThreadUtils.awaitUninterruptibly(openDoneSignal);
-      synchronized (cameraDeviceLock) {
-        if (!openSucceeded) {
-          fail("Opening simple camera2 failed.");
-        }
-      }
-    }
-
-    public void close() {
-      Logging.d(TAG, "Closing simple camera2.");
-      synchronized (cameraDeviceLock) {
-        if (cameraDevice != null) {
-          cameraDevice.close();
-        }
-      }
-
-      looperThread.requestStop();
-      ThreadUtils.joinUninterruptibly(looperThread);
-    }
-  }
-
-  private class TestObjectFactory extends CameraVideoCapturerTestFixtures.TestObjectFactory {
-    @Override
-    public CameraEnumerator getCameraEnumerator() {
-      return new Camera2Enumerator(getAppContext());
-    }
-
-    @Override
-    public Context getAppContext() {
-      return InstrumentationRegistry.getTargetContext();
-    }
-
-    @SuppressWarnings("deprecation")
-    @Override
-    public Object rawOpenCamera(String cameraName) {
-      return new SimpleCamera2(getAppContext(), cameraName);
-    }
-
-    @SuppressWarnings("deprecation")
-    @Override
-    public void rawCloseCamera(Object camera) {
-      ((SimpleCamera2) camera).close();
-    }
-  }
-
-  private CameraVideoCapturerTestFixtures fixtures;
-
-  @Before
-  public void setUp() {
-    // Enable VideoFrame capture.
-    PeerConnectionFactory.initializeFieldTrials(PeerConnectionFactory.VIDEO_FRAME_EMIT_TRIAL + "/"
-        + PeerConnectionFactory.TRIAL_ENABLED + "/");
-    fixtures = new CameraVideoCapturerTestFixtures(new TestObjectFactory());
-  }
-
-  @After
-  public void tearDown() {
-    fixtures.dispose();
-  }
-
-  @Test
-  @SmallTest
-  public void testCreateAndDispose() throws InterruptedException {
-    fixtures.createCapturerAndDispose();
-  }
-
-  @Test
-  @SmallTest
-  public void testCreateNonExistingCamera() throws InterruptedException {
-    fixtures.createNonExistingCamera();
-  }
-
-  // This test that the camera can be started and that the frames are forwarded
-  // to a Java video renderer using a "default" capturer.
-  // It tests both the Java and the C++ layer.
-  @Test
-  @MediumTest
-  public void testCreateCapturerAndRender() throws InterruptedException {
-    fixtures.createCapturerAndRender();
-  }
-
-  // This test that the camera can be started and that the frames are forwarded
-  // to a Java video renderer using the front facing video capturer.
-  // It tests both the Java and the C++ layer.
-  @Test
-  @MediumTest
-  public void testStartFrontFacingVideoCapturer() throws InterruptedException {
-    fixtures.createFrontFacingCapturerAndRender();
-  }
-
-  // This test that the camera can be started and that the frames are forwarded
-  // to a Java video renderer using the back facing video capturer.
-  // It tests both the Java and the C++ layer.
-  @Test
-  @MediumTest
-  public void testStartBackFacingVideoCapturer() throws InterruptedException {
-    fixtures.createBackFacingCapturerAndRender();
-  }
-
-  // This test that the default camera can be started and that the camera can
-  // later be switched to another camera.
-  // It tests both the Java and the C++ layer.
-  @Test
-  @MediumTest
-  public void testSwitchVideoCapturer() throws InterruptedException {
-    fixtures.switchCamera();
-  }
-
-  @Test
-  @MediumTest
-  public void testCameraEvents() throws InterruptedException {
-    fixtures.cameraEventsInvoked();
-  }
-
-  @Test
-  @MediumTest
-  public void testUpdateMediaRecorder() throws InterruptedException, IOException {
-    fixtures.updateMediaRecorder(true /* useSurfaceCapture */);
-  }
-
-  // Test what happens when attempting to call e.g. switchCamera() after camera has been stopped.
-  @Test
-  @MediumTest
-  public void testCameraCallsAfterStop() throws InterruptedException {
-    fixtures.cameraCallsAfterStop();
-  }
-
-  // This test that the VideoSource that the CameraVideoCapturer is connected to can
-  // be stopped and restarted. It tests both the Java and the C++ layer.
-  @Test
-  @LargeTest
-  public void testStopRestartVideoSource() throws InterruptedException {
-    fixtures.stopRestartVideoSource();
-  }
-
-  // This test that the camera can be started at different resolutions.
-  // It does not test or use the C++ layer.
-  @Test
-  @LargeTest
-  public void testStartStopWithDifferentResolutions() throws InterruptedException {
-    fixtures.startStopWithDifferentResolutions();
-  }
-
-  // This test what happens if buffers are returned after the capturer have
-  // been stopped and restarted. It does not test or use the C++ layer.
-  @Test
-  @LargeTest
-  public void testReturnBufferLate() throws InterruptedException {
-    fixtures.returnBufferLate();
-  }
-
-  // This test that we can capture frames, keep the frames in a local renderer, stop capturing,
-  // and then return the frames. The difference between the test testReturnBufferLate() is that we
-  // also test the JNI and C++ AndroidVideoCapturer parts.
-  @Test
-  @MediumTest
-  public void testReturnBufferLateEndToEnd() throws InterruptedException {
-    fixtures.returnBufferLateEndToEnd();
-  }
-
-  // This test that CameraEventsHandler.onError is triggered if video buffers are not returned to
-  // the capturer.
-  @Test
-  @LargeTest
-  public void testCameraFreezedEventOnBufferStarvation() throws InterruptedException {
-    fixtures.cameraFreezedEventOnBufferStarvation();
-  }
-
-  // This test that frames forwarded to a renderer is scaled if adaptOutputFormat is
-  // called. This test both Java and C++ parts of of the stack.
-  @Test
-  @MediumTest
-  public void testScaleCameraOutput() throws InterruptedException {
-    fixtures.scaleCameraOutput();
-  }
-
-  // This test that an error is reported if the camera is already opened
-  // when CameraVideoCapturer is started.
-  @Test
-  @LargeTest
-  public void testStartWhileCameraIsAlreadyOpen() throws InterruptedException {
-    fixtures.startWhileCameraIsAlreadyOpen();
-  }
-
-  // This test that CameraVideoCapturer can be started, even if the camera is already opened
-  // if the camera is closed while CameraVideoCapturer is re-trying to start.
-  @Test
-  @LargeTest
-  public void testStartWhileCameraIsAlreadyOpenAndCloseCamera() throws InterruptedException {
-    fixtures.startWhileCameraIsAlreadyOpenAndCloseCamera();
-  }
-
-  // This test that CameraVideoCapturer.stop can be called while CameraVideoCapturer is
-  // re-trying to start.
-  @Test
-  @MediumTest
-  public void testStartWhileCameraIsAlreadyOpenAndStop() throws InterruptedException {
-    fixtures.startWhileCameraIsAlreadyOpenAndStop();
-  }
-}
diff --git a/sdk/android/instrumentationtests/src/org/webrtc/CameraVideoCapturerTestFixtures.java b/sdk/android/instrumentationtests/src/org/webrtc/CameraVideoCapturerTestFixtures.java
deleted file mode 100644
index d7130b8..0000000
--- a/sdk/android/instrumentationtests/src/org/webrtc/CameraVideoCapturerTestFixtures.java
+++ /dev/null
@@ -1,844 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-package org.webrtc;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-import android.annotation.TargetApi;
-import android.content.Context;
-import android.media.CamcorderProfile;
-import android.media.MediaRecorder;
-import android.os.Environment;
-import java.io.File;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.CountDownLatch;
-import org.chromium.base.test.BaseJUnit4ClassRunner;
-import org.junit.runner.RunWith;
-import org.webrtc.CameraEnumerationAndroid.CaptureFormat;
-import org.webrtc.VideoRenderer.I420Frame;
-
-class CameraVideoCapturerTestFixtures {
-  static final String TAG = "CameraVideoCapturerTestFixtures";
-  // Default values used for starting capturing
-  static final int DEFAULT_WIDTH = 640;
-  static final int DEFAULT_HEIGHT = 480;
-  static final int DEFAULT_FPS = 15;
-
-  static private class RendererCallbacks implements VideoRenderer.Callbacks {
-    private int framesRendered = 0;
-    private Object frameLock = 0;
-    private int width = 0;
-    private int height = 0;
-
-    @Override
-    public void renderFrame(I420Frame frame) {
-      synchronized (frameLock) {
-        ++framesRendered;
-        width = frame.rotatedWidth();
-        height = frame.rotatedHeight();
-        frameLock.notify();
-      }
-      VideoRenderer.renderFrameDone(frame);
-    }
-
-    public int frameWidth() {
-      synchronized (frameLock) {
-        return width;
-      }
-    }
-
-    public int frameHeight() {
-      synchronized (frameLock) {
-        return height;
-      }
-    }
-
-    public int waitForNextFrameToRender() throws InterruptedException {
-      Logging.d(TAG, "Waiting for the next frame to render");
-      synchronized (frameLock) {
-        frameLock.wait();
-        return framesRendered;
-      }
-    }
-  }
-
-  static private class FakeAsyncRenderer implements VideoRenderer.Callbacks {
-    private final List<I420Frame> pendingFrames = new ArrayList<I420Frame>();
-
-    @Override
-    public void renderFrame(I420Frame frame) {
-      synchronized (pendingFrames) {
-        pendingFrames.add(frame);
-        pendingFrames.notifyAll();
-      }
-    }
-
-    // Wait until at least one frame have been received, before returning them.
-    public List<I420Frame> waitForPendingFrames() throws InterruptedException {
-      Logging.d(TAG, "Waiting for pending frames");
-      synchronized (pendingFrames) {
-        while (pendingFrames.isEmpty()) {
-          pendingFrames.wait();
-        }
-        return new ArrayList<I420Frame>(pendingFrames);
-      }
-    }
-  }
-
-  static private class FakeCapturerObserver implements CameraVideoCapturer.CapturerObserver {
-    private int framesCaptured = 0;
-    private VideoFrame videoFrame;
-    final private Object frameLock = new Object();
-    final private Object capturerStartLock = new Object();
-    private boolean capturerStartResult = false;
-    final private List<Long> timestamps = new ArrayList<Long>();
-
-    @Override
-    public void onCapturerStarted(boolean success) {
-      Logging.d(TAG, "onCapturerStarted: " + success);
-
-      synchronized (capturerStartLock) {
-        capturerStartResult = success;
-        capturerStartLock.notifyAll();
-      }
-    }
-
-    @Override
-    public void onCapturerStopped() {
-      Logging.d(TAG, "onCapturerStopped");
-    }
-
-    @Override
-    public void onByteBufferFrameCaptured(
-        byte[] frame, int width, int height, int rotation, long timeStamp) {
-      throw new RuntimeException("onByteBufferFrameCaptured called");
-    }
-
-    @Override
-    public void onTextureFrameCaptured(int width, int height, int oesTextureId,
-        float[] transformMatrix, int rotation, long timeStamp) {
-      throw new RuntimeException("onTextureFrameCaptured called");
-    }
-
-    @Override
-    public void onFrameCaptured(VideoFrame frame) {
-      synchronized (frameLock) {
-        ++framesCaptured;
-        if (videoFrame != null) {
-          videoFrame.release();
-        }
-        videoFrame = frame;
-        videoFrame.retain();
-        timestamps.add(videoFrame.getTimestampNs());
-        frameLock.notify();
-      }
-    }
-
-    public boolean waitForCapturerToStart() throws InterruptedException {
-      Logging.d(TAG, "Waiting for the capturer to start");
-      synchronized (capturerStartLock) {
-        capturerStartLock.wait();
-        return capturerStartResult;
-      }
-    }
-
-    public int waitForNextCapturedFrame() throws InterruptedException {
-      Logging.d(TAG, "Waiting for the next captured frame");
-      synchronized (frameLock) {
-        frameLock.wait();
-        return framesCaptured;
-      }
-    }
-
-    int frameWidth() {
-      synchronized (frameLock) {
-        return videoFrame.getBuffer().getWidth();
-      }
-    }
-
-    int frameHeight() {
-      synchronized (frameLock) {
-        return videoFrame.getBuffer().getHeight();
-      }
-    }
-
-    void releaseFrame() {
-      synchronized (frameLock) {
-        if (videoFrame != null) {
-          videoFrame.release();
-          videoFrame = null;
-        }
-      }
-    }
-
-    List<Long> getCopyAndResetListOftimeStamps() {
-      synchronized (frameLock) {
-        ArrayList<Long> list = new ArrayList<Long>(timestamps);
-        timestamps.clear();
-        return list;
-      }
-    }
-  }
-
-  static class CameraEvents implements CameraVideoCapturer.CameraEventsHandler {
-    public boolean onCameraOpeningCalled;
-    public boolean onFirstFrameAvailableCalled;
-    public final Object onCameraFreezedLock = new Object();
-    private String onCameraFreezedDescription;
-    public final Object cameraClosedLock = new Object();
-    private boolean cameraClosed = true;
-
-    @Override
-    public void onCameraError(String errorDescription) {
-      Logging.w(TAG, "Camera error: " + errorDescription);
-      cameraClosed = true;
-    }
-
-    @Override
-    public void onCameraDisconnected() {}
-
-    @Override
-    public void onCameraFreezed(String errorDescription) {
-      synchronized (onCameraFreezedLock) {
-        onCameraFreezedDescription = errorDescription;
-        onCameraFreezedLock.notifyAll();
-      }
-    }
-
-    @Override
-    public void onCameraOpening(String cameraName) {
-      onCameraOpeningCalled = true;
-      synchronized (cameraClosedLock) {
-        cameraClosed = false;
-      }
-    }
-
-    @Override
-    public void onFirstFrameAvailable() {
-      onFirstFrameAvailableCalled = true;
-    }
-
-    @Override
-    public void onCameraClosed() {
-      synchronized (cameraClosedLock) {
-        cameraClosed = true;
-        cameraClosedLock.notifyAll();
-      }
-    }
-
-    public String waitForCameraFreezed() throws InterruptedException {
-      Logging.d(TAG, "Waiting for the camera to freeze");
-      synchronized (onCameraFreezedLock) {
-        onCameraFreezedLock.wait();
-        return onCameraFreezedDescription;
-      }
-    }
-
-    public void waitForCameraClosed() throws InterruptedException {
-      synchronized (cameraClosedLock) {
-        while (!cameraClosed) {
-          Logging.d(TAG, "Waiting for the camera to close.");
-          cameraClosedLock.wait();
-        }
-      }
-    }
-  }
-
-  /**
-   * Class to collect all classes related to single capturer instance.
-   */
-  static private class CapturerInstance {
-    public CameraVideoCapturer capturer;
-    public CameraEvents cameraEvents;
-    public SurfaceTextureHelper surfaceTextureHelper;
-    public FakeCapturerObserver observer;
-    public List<CaptureFormat> supportedFormats;
-    public CaptureFormat format;
-  }
-
-  /**
-   * Class used for collecting a VideoSource, a VideoTrack and a renderer. The class
-   * is used for testing local rendering from a capturer.
-   */
-  static private class VideoTrackWithRenderer {
-    public VideoSource source;
-    public VideoTrack track;
-    public RendererCallbacks rendererCallbacks;
-    public FakeAsyncRenderer fakeAsyncRenderer;
-  }
-
-  public abstract static class TestObjectFactory {
-    final CameraEnumerator cameraEnumerator;
-
-    TestObjectFactory() {
-      cameraEnumerator = getCameraEnumerator();
-    }
-
-    public CameraVideoCapturer createCapturer(
-        String name, CameraVideoCapturer.CameraEventsHandler eventsHandler) {
-      return cameraEnumerator.createCapturer(name, eventsHandler);
-    }
-
-    public String getNameOfFrontFacingDevice() {
-      for (String deviceName : cameraEnumerator.getDeviceNames()) {
-        if (cameraEnumerator.isFrontFacing(deviceName)) {
-          return deviceName;
-        }
-      }
-
-      return null;
-    }
-
-    public String getNameOfBackFacingDevice() {
-      for (String deviceName : cameraEnumerator.getDeviceNames()) {
-        if (cameraEnumerator.isBackFacing(deviceName)) {
-          return deviceName;
-        }
-      }
-
-      return null;
-    }
-
-    public boolean haveTwoCameras() {
-      return cameraEnumerator.getDeviceNames().length >= 2;
-    }
-
-    public boolean isCapturingToTexture() {
-      // In the future, we plan to only support capturing to texture, so default to true
-      return true;
-    }
-
-    abstract public CameraEnumerator getCameraEnumerator();
-    abstract public Context getAppContext();
-
-    // CameraVideoCapturer API is too slow for some of our tests where we need to open a competing
-    // camera. These methods are used instead.
-    abstract public Object rawOpenCamera(String cameraName);
-    abstract public void rawCloseCamera(Object camera);
-  }
-
-  private PeerConnectionFactory peerConnectionFactory;
-  private TestObjectFactory testObjectFactory;
-
-  CameraVideoCapturerTestFixtures(TestObjectFactory testObjectFactory) {
-    PeerConnectionFactory.initializeAndroidGlobals(testObjectFactory.getAppContext(), true);
-
-    this.peerConnectionFactory = new PeerConnectionFactory(null /* options */);
-    this.testObjectFactory = testObjectFactory;
-  }
-
-  public void dispose() {
-    this.peerConnectionFactory.dispose();
-  }
-
-  // Internal helper methods
-  private CapturerInstance createCapturer(String name, boolean initialize) {
-    CapturerInstance instance = new CapturerInstance();
-    instance.cameraEvents = new CameraEvents();
-    instance.capturer = testObjectFactory.createCapturer(name, instance.cameraEvents);
-    instance.surfaceTextureHelper = SurfaceTextureHelper.create(
-        "SurfaceTextureHelper test" /* threadName */, null /* sharedContext */);
-    instance.observer = new FakeCapturerObserver();
-    if (initialize) {
-      instance.capturer.initialize(
-          instance.surfaceTextureHelper, testObjectFactory.getAppContext(), instance.observer);
-    }
-    instance.supportedFormats = testObjectFactory.cameraEnumerator.getSupportedFormats(name);
-    return instance;
-  }
-
-  private CapturerInstance createCapturer(boolean initialize) {
-    String name = testObjectFactory.cameraEnumerator.getDeviceNames()[0];
-    return createCapturer(name, initialize);
-  }
-
-  private void startCapture(CapturerInstance instance) {
-    startCapture(instance, 0);
-  }
-
-  private void startCapture(CapturerInstance instance, int formatIndex) {
-    final CameraEnumerationAndroid.CaptureFormat format =
-        instance.supportedFormats.get(formatIndex);
-
-    instance.capturer.startCapture(format.width, format.height, format.framerate.max);
-    instance.format = format;
-  }
-
-  private void disposeCapturer(CapturerInstance instance) throws InterruptedException {
-    instance.capturer.stopCapture();
-    instance.cameraEvents.waitForCameraClosed();
-    instance.capturer.dispose();
-    instance.observer.releaseFrame();
-    instance.surfaceTextureHelper.dispose();
-  }
-
-  private VideoTrackWithRenderer createVideoTrackWithRenderer(
-      CameraVideoCapturer capturer, VideoRenderer.Callbacks rendererCallbacks) {
-    VideoTrackWithRenderer videoTrackWithRenderer = new VideoTrackWithRenderer();
-    videoTrackWithRenderer.source = peerConnectionFactory.createVideoSource(capturer);
-    capturer.startCapture(DEFAULT_WIDTH, DEFAULT_HEIGHT, DEFAULT_FPS);
-    videoTrackWithRenderer.track =
-        peerConnectionFactory.createVideoTrack("dummy", videoTrackWithRenderer.source);
-    videoTrackWithRenderer.track.addRenderer(new VideoRenderer(rendererCallbacks));
-    return videoTrackWithRenderer;
-  }
-
-  private VideoTrackWithRenderer createVideoTrackWithRenderer(CameraVideoCapturer capturer) {
-    RendererCallbacks rendererCallbacks = new RendererCallbacks();
-    VideoTrackWithRenderer videoTrackWithRenderer =
-        createVideoTrackWithRenderer(capturer, rendererCallbacks);
-    videoTrackWithRenderer.rendererCallbacks = rendererCallbacks;
-    return videoTrackWithRenderer;
-  }
-
-  private VideoTrackWithRenderer createVideoTrackWithFakeAsyncRenderer(
-      CameraVideoCapturer capturer) {
-    FakeAsyncRenderer fakeAsyncRenderer = new FakeAsyncRenderer();
-    VideoTrackWithRenderer videoTrackWithRenderer =
-        createVideoTrackWithRenderer(capturer, fakeAsyncRenderer);
-    videoTrackWithRenderer.fakeAsyncRenderer = fakeAsyncRenderer;
-    return videoTrackWithRenderer;
-  }
-
-  private void disposeVideoTrackWithRenderer(VideoTrackWithRenderer videoTrackWithRenderer) {
-    videoTrackWithRenderer.track.dispose();
-    videoTrackWithRenderer.source.dispose();
-  }
-
-  private void waitUntilIdle(CapturerInstance capturerInstance) throws InterruptedException {
-    final CountDownLatch barrier = new CountDownLatch(1);
-    capturerInstance.surfaceTextureHelper.getHandler().post(new Runnable() {
-      @Override
-      public void run() {
-        barrier.countDown();
-      }
-    });
-    barrier.await();
-  }
-
-  private void createCapturerAndRender(String name) throws InterruptedException {
-    if (name == null) {
-      Logging.w(TAG, "Skipping video capturer test because device name is null.");
-      return;
-    }
-
-    final CapturerInstance capturerInstance = createCapturer(name, false /* initialize */);
-    final VideoTrackWithRenderer videoTrackWithRenderer =
-        createVideoTrackWithRenderer(capturerInstance.capturer);
-    assertTrue(videoTrackWithRenderer.rendererCallbacks.waitForNextFrameToRender() > 0);
-    disposeCapturer(capturerInstance);
-    disposeVideoTrackWithRenderer(videoTrackWithRenderer);
-  }
-
-  // Test methods
-  public void createCapturerAndDispose() throws InterruptedException {
-    disposeCapturer(createCapturer(true /* initialize */));
-  }
-
-  public void createNonExistingCamera() throws InterruptedException {
-    try {
-      disposeCapturer(createCapturer("non-existing camera", false /* initialize */));
-    } catch (IllegalArgumentException e) {
-      return;
-    }
-
-    fail("Expected illegal argument exception when creating non-existing camera.");
-  }
-
-  public void createCapturerAndRender() throws InterruptedException {
-    String name = testObjectFactory.cameraEnumerator.getDeviceNames()[0];
-    createCapturerAndRender(name);
-  }
-
-  public void createFrontFacingCapturerAndRender() throws InterruptedException {
-    createCapturerAndRender(testObjectFactory.getNameOfFrontFacingDevice());
-  }
-
-  public void createBackFacingCapturerAndRender() throws InterruptedException {
-    createCapturerAndRender(testObjectFactory.getNameOfBackFacingDevice());
-  }
-
-  public void switchCamera() throws InterruptedException {
-    if (!testObjectFactory.haveTwoCameras()) {
-      Logging.w(
-          TAG, "Skipping test switch video capturer because the device doesn't have two cameras.");
-      return;
-    }
-
-    final CapturerInstance capturerInstance = createCapturer(false /* initialize */);
-    final VideoTrackWithRenderer videoTrackWithRenderer =
-        createVideoTrackWithRenderer(capturerInstance.capturer);
-    // Wait for the camera to start so we can switch it
-    assertTrue(videoTrackWithRenderer.rendererCallbacks.waitForNextFrameToRender() > 0);
-
-    // Array with one element to avoid final problem in nested classes.
-    final boolean[] cameraSwitchSuccessful = new boolean[1];
-    final CountDownLatch barrier = new CountDownLatch(1);
-    capturerInstance.capturer.switchCamera(new CameraVideoCapturer.CameraSwitchHandler() {
-      @Override
-      public void onCameraSwitchDone(boolean isFrontCamera) {
-        cameraSwitchSuccessful[0] = true;
-        barrier.countDown();
-      }
-      @Override
-      public void onCameraSwitchError(String errorDescription) {
-        cameraSwitchSuccessful[0] = false;
-        barrier.countDown();
-      }
-    });
-    // Wait until the camera has been switched.
-    barrier.await();
-
-    // Check result.
-    assertTrue(cameraSwitchSuccessful[0]);
-    // Ensure that frames are received.
-    assertTrue(videoTrackWithRenderer.rendererCallbacks.waitForNextFrameToRender() > 0);
-    disposeCapturer(capturerInstance);
-    disposeVideoTrackWithRenderer(videoTrackWithRenderer);
-  }
-
-  @TargetApi(21)
-  private static void prepareMediaRecorderForTests(
-      MediaRecorder mediaRecorder, File outputFile, boolean useSurfaceCapture) throws IOException {
-    mediaRecorder.setVideoSource(
-        useSurfaceCapture ? MediaRecorder.VideoSource.SURFACE : MediaRecorder.VideoSource.CAMERA);
-    CamcorderProfile profile = CamcorderProfile.get(CamcorderProfile.QUALITY_480P);
-    profile.videoCodec = MediaRecorder.VideoEncoder.H264;
-    profile.videoBitRate = 2500000;
-    profile.videoFrameWidth = 640;
-    profile.videoFrameHeight = 480;
-    mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
-    mediaRecorder.setVideoFrameRate(profile.videoFrameRate);
-    mediaRecorder.setVideoSize(profile.videoFrameWidth, profile.videoFrameHeight);
-    mediaRecorder.setVideoEncodingBitRate(profile.videoBitRate);
-    mediaRecorder.setVideoEncoder(profile.videoCodec);
-    mediaRecorder.setOutputFile(outputFile.getPath());
-    mediaRecorder.prepare();
-  }
-
-  @TargetApi(21)
-  public void updateMediaRecorder(boolean useSurfaceCapture)
-      throws InterruptedException, IOException {
-    final CapturerInstance capturerInstance = createCapturer(false /* initialize */);
-    final VideoTrackWithRenderer videoTrackWithRenderer =
-        createVideoTrackWithRenderer(capturerInstance.capturer);
-    // Wait for the camera to start so we can add and remove MediaRecorder.
-    assertTrue(videoTrackWithRenderer.rendererCallbacks.waitForNextFrameToRender() > 0);
-
-    final String videoOutPath = Environment.getExternalStorageDirectory().getPath()
-        + "/chromium_tests_root/testmediarecorder.mp4";
-    File outputFile = new File(videoOutPath);
-
-    // Create MediaRecorder object
-    MediaRecorder mediaRecorder = new MediaRecorder();
-    if (useSurfaceCapture) {
-      // When using using surface capture, media recorder has to be prepared before adding it to the
-      // camera.
-      prepareMediaRecorderForTests(mediaRecorder, outputFile, useSurfaceCapture);
-    }
-
-    // Add MediaRecorder to camera pipeline.
-    final boolean[] addMediaRecorderSuccessful = new boolean[1];
-    final CountDownLatch addBarrier = new CountDownLatch(1);
-    CameraVideoCapturer.MediaRecorderHandler addMediaRecorderHandler =
-        new CameraVideoCapturer.MediaRecorderHandler() {
-          @Override
-          public void onMediaRecorderSuccess() {
-            addMediaRecorderSuccessful[0] = true;
-            addBarrier.countDown();
-          }
-          @Override
-          public void onMediaRecorderError(String errorDescription) {
-            Logging.e(TAG, errorDescription);
-            addMediaRecorderSuccessful[0] = false;
-            addBarrier.countDown();
-          }
-        };
-    capturerInstance.capturer.addMediaRecorderToCamera(mediaRecorder, addMediaRecorderHandler);
-    // Wait until MediaRecoder has been added.
-    addBarrier.await();
-    // Check result.
-    assertTrue(addMediaRecorderSuccessful[0]);
-
-    // Start MediaRecorder and wait for a few frames to capture.
-    if (!useSurfaceCapture) {
-      // When using using camera capture, media recorder has to be prepared after adding it to the
-      // camera.
-      prepareMediaRecorderForTests(mediaRecorder, outputFile, useSurfaceCapture);
-    }
-    mediaRecorder.start();
-    for (int i = 0; i < 5; i++) {
-      assertTrue(videoTrackWithRenderer.rendererCallbacks.waitForNextFrameToRender() > 0);
-    }
-    mediaRecorder.stop();
-
-    // Remove MediaRecorder from camera pipeline.
-    final boolean[] removeMediaRecorderSuccessful = new boolean[1];
-    final CountDownLatch removeBarrier = new CountDownLatch(1);
-    CameraVideoCapturer.MediaRecorderHandler removeMediaRecorderHandler =
-        new CameraVideoCapturer.MediaRecorderHandler() {
-          @Override
-          public void onMediaRecorderSuccess() {
-            removeMediaRecorderSuccessful[0] = true;
-            removeBarrier.countDown();
-          }
-          @Override
-          public void onMediaRecorderError(String errorDescription) {
-            removeMediaRecorderSuccessful[0] = false;
-            removeBarrier.countDown();
-          }
-        };
-    capturerInstance.capturer.removeMediaRecorderFromCamera(removeMediaRecorderHandler);
-    // Wait until MediaRecoder has been removed.
-    removeBarrier.await();
-    // Check result.
-    assertTrue(removeMediaRecorderSuccessful[0]);
-    // Ensure that frames are received after removing MediaRecorder.
-    assertTrue(videoTrackWithRenderer.rendererCallbacks.waitForNextFrameToRender() > 0);
-    // Check that recorded file contains some data.
-    assertTrue(outputFile.length() > 0);
-
-    disposeCapturer(capturerInstance);
-    disposeVideoTrackWithRenderer(videoTrackWithRenderer);
-  }
-
-  public void cameraEventsInvoked() throws InterruptedException {
-    final CapturerInstance capturerInstance = createCapturer(true /* initialize */);
-    startCapture(capturerInstance);
-    // Make sure camera is started and first frame is received and then stop it.
-    assertTrue(capturerInstance.observer.waitForCapturerToStart());
-    capturerInstance.observer.waitForNextCapturedFrame();
-    disposeCapturer(capturerInstance);
-
-    assertTrue(capturerInstance.cameraEvents.onCameraOpeningCalled);
-    assertTrue(capturerInstance.cameraEvents.onFirstFrameAvailableCalled);
-  }
-
-  public void cameraCallsAfterStop() throws InterruptedException {
-    final CapturerInstance capturerInstance = createCapturer(true /* initialize */);
-    startCapture(capturerInstance);
-    // Make sure camera is started and then stop it.
-    assertTrue(capturerInstance.observer.waitForCapturerToStart());
-    capturerInstance.capturer.stopCapture();
-    capturerInstance.observer.releaseFrame();
-
-    // We can't change |capturer| at this point, but we should not crash.
-    capturerInstance.capturer.switchCamera(null /* switchEventsHandler */);
-    capturerInstance.capturer.changeCaptureFormat(DEFAULT_WIDTH, DEFAULT_HEIGHT, DEFAULT_FPS);
-
-    disposeCapturer(capturerInstance);
-  }
-
-  public void stopRestartVideoSource() throws InterruptedException {
-    final CapturerInstance capturerInstance = createCapturer(false /* initialize */);
-    final VideoTrackWithRenderer videoTrackWithRenderer =
-        createVideoTrackWithRenderer(capturerInstance.capturer);
-
-    assertTrue(videoTrackWithRenderer.rendererCallbacks.waitForNextFrameToRender() > 0);
-    assertEquals(MediaSource.State.LIVE, videoTrackWithRenderer.source.state());
-
-    capturerInstance.capturer.stopCapture();
-    assertEquals(MediaSource.State.ENDED, videoTrackWithRenderer.source.state());
-
-    startCapture(capturerInstance);
-    assertTrue(videoTrackWithRenderer.rendererCallbacks.waitForNextFrameToRender() > 0);
-    assertEquals(MediaSource.State.LIVE, videoTrackWithRenderer.source.state());
-
-    disposeCapturer(capturerInstance);
-    disposeVideoTrackWithRenderer(videoTrackWithRenderer);
-  }
-
-  public void startStopWithDifferentResolutions() throws InterruptedException {
-    final CapturerInstance capturerInstance = createCapturer(true /* initialize */);
-
-    for (int i = 0; i < 3; ++i) {
-      startCapture(capturerInstance, i);
-      assertTrue(capturerInstance.observer.waitForCapturerToStart());
-      capturerInstance.observer.waitForNextCapturedFrame();
-
-      // Check the frame size. The actual width and height depend on how the capturer is mounted.
-      final boolean identicalResolution =
-          (capturerInstance.observer.frameWidth() == capturerInstance.format.width
-              && capturerInstance.observer.frameHeight() == capturerInstance.format.height);
-      final boolean flippedResolution =
-          (capturerInstance.observer.frameWidth() == capturerInstance.format.height
-              && capturerInstance.observer.frameHeight() == capturerInstance.format.width);
-      if (!identicalResolution && !flippedResolution) {
-        fail("Wrong resolution, got: " + capturerInstance.observer.frameWidth() + "x"
-            + capturerInstance.observer.frameHeight() + " expected: "
-            + capturerInstance.format.width + "x" + capturerInstance.format.height + " or "
-            + capturerInstance.format.height + "x" + capturerInstance.format.width);
-      }
-
-      capturerInstance.capturer.stopCapture();
-      capturerInstance.observer.releaseFrame();
-    }
-    disposeCapturer(capturerInstance);
-  }
-
-  public void returnBufferLate() throws InterruptedException {
-    final CapturerInstance capturerInstance = createCapturer(true /* initialize */);
-    startCapture(capturerInstance);
-    assertTrue(capturerInstance.observer.waitForCapturerToStart());
-
-    capturerInstance.observer.waitForNextCapturedFrame();
-    capturerInstance.capturer.stopCapture();
-    List<Long> listOftimestamps = capturerInstance.observer.getCopyAndResetListOftimeStamps();
-    assertTrue(listOftimestamps.size() >= 1);
-
-    startCapture(capturerInstance, 1);
-    capturerInstance.observer.waitForCapturerToStart();
-    capturerInstance.observer.releaseFrame();
-
-    capturerInstance.observer.waitForNextCapturedFrame();
-    capturerInstance.capturer.stopCapture();
-
-    listOftimestamps = capturerInstance.observer.getCopyAndResetListOftimeStamps();
-    assertTrue(listOftimestamps.size() >= 1);
-
-    disposeCapturer(capturerInstance);
-  }
-
-  public void returnBufferLateEndToEnd() throws InterruptedException {
-    final CapturerInstance capturerInstance = createCapturer(false /* initialize */);
-    final VideoTrackWithRenderer videoTrackWithRenderer =
-        createVideoTrackWithFakeAsyncRenderer(capturerInstance.capturer);
-    // Wait for at least one frame that has not been returned.
-    assertFalse(videoTrackWithRenderer.fakeAsyncRenderer.waitForPendingFrames().isEmpty());
-
-    capturerInstance.capturer.stopCapture();
-
-    // Dispose everything.
-    disposeCapturer(capturerInstance);
-    disposeVideoTrackWithRenderer(videoTrackWithRenderer);
-
-    // Return the frame(s), on a different thread out of spite.
-    final List<I420Frame> pendingFrames =
-        videoTrackWithRenderer.fakeAsyncRenderer.waitForPendingFrames();
-    final Thread returnThread = new Thread(new Runnable() {
-      @Override
-      public void run() {
-        for (I420Frame frame : pendingFrames) {
-          VideoRenderer.renderFrameDone(frame);
-        }
-      }
-    });
-    returnThread.start();
-    returnThread.join();
-  }
-
-  public void cameraFreezedEventOnBufferStarvation() throws InterruptedException {
-    final CapturerInstance capturerInstance = createCapturer(true /* initialize */);
-    startCapture(capturerInstance);
-    // Make sure camera is started.
-    assertTrue(capturerInstance.observer.waitForCapturerToStart());
-    // Since we don't return the buffer, we should get a starvation message if we are
-    // capturing to a texture.
-    assertEquals("Camera failure. Client must return video buffers.",
-        capturerInstance.cameraEvents.waitForCameraFreezed());
-
-    capturerInstance.capturer.stopCapture();
-    disposeCapturer(capturerInstance);
-  }
-
-  public void scaleCameraOutput() throws InterruptedException {
-    final CapturerInstance capturerInstance = createCapturer(false /* initialize */);
-    final VideoTrackWithRenderer videoTrackWithRenderer =
-        createVideoTrackWithRenderer(capturerInstance.capturer);
-    assertTrue(videoTrackWithRenderer.rendererCallbacks.waitForNextFrameToRender() > 0);
-
-    final int startWidth = videoTrackWithRenderer.rendererCallbacks.frameWidth();
-    final int startHeight = videoTrackWithRenderer.rendererCallbacks.frameHeight();
-    final int frameRate = 30;
-    final int scaledWidth = startWidth / 2;
-    final int scaledHeight = startHeight / 2;
-
-    // Request the captured frames to be scaled.
-    videoTrackWithRenderer.source.adaptOutputFormat(scaledWidth, scaledHeight, frameRate);
-
-    boolean gotExpectedResolution = false;
-    int numberOfInspectedFrames = 0;
-
-    do {
-      videoTrackWithRenderer.rendererCallbacks.waitForNextFrameToRender();
-      ++numberOfInspectedFrames;
-
-      gotExpectedResolution = (videoTrackWithRenderer.rendererCallbacks.frameWidth() == scaledWidth
-          && videoTrackWithRenderer.rendererCallbacks.frameHeight() == scaledHeight);
-    } while (!gotExpectedResolution && numberOfInspectedFrames < 30);
-
-    disposeCapturer(capturerInstance);
-    disposeVideoTrackWithRenderer(videoTrackWithRenderer);
-
-    assertTrue(gotExpectedResolution);
-  }
-
-  public void startWhileCameraIsAlreadyOpen() throws InterruptedException {
-    final String cameraName = testObjectFactory.getNameOfBackFacingDevice();
-    // At this point camera is not actually opened.
-    final CapturerInstance capturerInstance = createCapturer(cameraName, true /* initialize */);
-
-    final Object competingCamera = testObjectFactory.rawOpenCamera(cameraName);
-
-    startCapture(capturerInstance);
-
-    if (android.os.Build.VERSION.SDK_INT > android.os.Build.VERSION_CODES.LOLLIPOP_MR1) {
-      // The first opened camera client will be evicted.
-      assertTrue(capturerInstance.observer.waitForCapturerToStart());
-    } else {
-      assertFalse(capturerInstance.observer.waitForCapturerToStart());
-    }
-
-    testObjectFactory.rawCloseCamera(competingCamera);
-    disposeCapturer(capturerInstance);
-  }
-
-  public void startWhileCameraIsAlreadyOpenAndCloseCamera() throws InterruptedException {
-    final String cameraName = testObjectFactory.getNameOfBackFacingDevice();
-    // At this point camera is not actually opened.
-    final CapturerInstance capturerInstance = createCapturer(cameraName, false /* initialize */);
-
-    Logging.d(TAG, "startWhileCameraIsAlreadyOpenAndCloseCamera: Opening competing camera.");
-    final Object competingCamera = testObjectFactory.rawOpenCamera(cameraName);
-
-    Logging.d(TAG, "startWhileCameraIsAlreadyOpenAndCloseCamera: Opening camera.");
-    final VideoTrackWithRenderer videoTrackWithRenderer =
-        createVideoTrackWithRenderer(capturerInstance.capturer);
-    waitUntilIdle(capturerInstance);
-
-    Logging.d(TAG, "startWhileCameraIsAlreadyOpenAndCloseCamera: Closing competing camera.");
-    testObjectFactory.rawCloseCamera(competingCamera);
-
-    // Make sure camera is started and first frame is received and then stop it.
-    Logging.d(TAG, "startWhileCameraIsAlreadyOpenAndCloseCamera: Waiting for capture to start.");
-    videoTrackWithRenderer.rendererCallbacks.waitForNextFrameToRender();
-    Logging.d(TAG, "startWhileCameraIsAlreadyOpenAndCloseCamera: Stopping capture.");
-    disposeCapturer(capturerInstance);
-  }
-
-  public void startWhileCameraIsAlreadyOpenAndStop() throws InterruptedException {
-    final String cameraName = testObjectFactory.getNameOfBackFacingDevice();
-    // At this point camera is not actually opened.
-    final CapturerInstance capturerInstance = createCapturer(cameraName, true /* initialize */);
-
-    final Object competingCamera = testObjectFactory.rawOpenCamera(cameraName);
-
-    startCapture(capturerInstance);
-    disposeCapturer(capturerInstance);
-
-    testObjectFactory.rawCloseCamera(competingCamera);
-  }
-}
diff --git a/sdk/android/instrumentationtests/src/org/webrtc/EglRendererTest.java b/sdk/android/instrumentationtests/src/org/webrtc/EglRendererTest.java
deleted file mode 100644
index 49c7dd3..0000000
--- a/sdk/android/instrumentationtests/src/org/webrtc/EglRendererTest.java
+++ /dev/null
@@ -1,338 +0,0 @@
-/*
- *  Copyright 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.
- */
-
-package org.webrtc;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-import android.graphics.Bitmap;
-import android.graphics.SurfaceTexture;
-import android.opengl.GLES11Ext;
-import android.opengl.GLES20;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.SmallTest;
-import java.nio.ByteBuffer;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
-import org.chromium.base.test.BaseJUnit4ClassRunner;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-// EmptyActivity is needed for the surface.
-@RunWith(BaseJUnit4ClassRunner.class)
-public class EglRendererTest {
-  final static String TAG = "EglRendererTest";
-  final static int RENDER_WAIT_MS = 1000;
-  final static int SURFACE_WAIT_MS = 1000;
-  final static int TEST_FRAME_WIDTH = 4;
-  final static int TEST_FRAME_HEIGHT = 4;
-  final static int REMOVE_FRAME_LISTENER_RACY_NUM_TESTS = 10;
-  // Some arbitrary frames.
-  final static ByteBuffer[][] TEST_FRAMES = {
-      {
-          ByteBuffer.wrap(new byte[] {
-              11, -12, 13, -14, -15, 16, -17, 18, 19, -110, 111, -112, -113, 114, -115, 116}),
-          ByteBuffer.wrap(new byte[] {117, 118, 119, 120}),
-          ByteBuffer.wrap(new byte[] {121, 122, 123, 124}),
-      },
-      {
-          ByteBuffer.wrap(new byte[] {-11, -12, -13, -14, -15, -16, -17, -18, -19, -110, -111, -112,
-              -113, -114, -115, -116}),
-          ByteBuffer.wrap(new byte[] {-121, -122, -123, -124}),
-          ByteBuffer.wrap(new byte[] {-117, -118, -119, -120}),
-      },
-      {
-          ByteBuffer.wrap(new byte[] {-11, -12, -13, -14, -15, -16, -17, -18, -19, -110, -111, -112,
-              -113, -114, -115, -116}),
-          ByteBuffer.wrap(new byte[] {117, 118, 119, 120}),
-          ByteBuffer.wrap(new byte[] {121, 122, 123, 124}),
-      },
-  };
-
-  private class TestFrameListener implements EglRenderer.FrameListener {
-    final private ArrayList<Bitmap> bitmaps = new ArrayList<Bitmap>();
-    boolean bitmapReceived;
-    Bitmap storedBitmap;
-
-    @Override
-    public synchronized void onFrame(Bitmap bitmap) {
-      if (bitmapReceived) {
-        fail("Unexpected bitmap was received.");
-      }
-
-      bitmapReceived = true;
-      storedBitmap = bitmap;
-      notify();
-    }
-
-    public synchronized boolean waitForBitmap(int timeoutMs) throws InterruptedException {
-      if (!bitmapReceived) {
-        wait(timeoutMs);
-      }
-      return bitmapReceived;
-    }
-
-    public synchronized Bitmap resetAndGetBitmap() {
-      bitmapReceived = false;
-      return storedBitmap;
-    }
-  }
-
-  final TestFrameListener testFrameListener = new TestFrameListener();
-
-  EglRenderer eglRenderer;
-  CountDownLatch surfaceReadyLatch = new CountDownLatch(1);
-  int oesTextureId;
-  SurfaceTexture surfaceTexture;
-
-  @Before
-  public void setUp() throws Exception {
-    PeerConnectionFactory.initializeAndroidGlobals(
-        InstrumentationRegistry.getTargetContext(), true /* videoHwAcceleration */);
-    eglRenderer = new EglRenderer("TestRenderer: ");
-    eglRenderer.init(null /* sharedContext */, EglBase.CONFIG_RGBA, new GlRectDrawer());
-    oesTextureId = GlUtil.generateTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES);
-    surfaceTexture = new SurfaceTexture(oesTextureId);
-    surfaceTexture.setDefaultBufferSize(1 /* width */, 1 /* height */);
-    eglRenderer.createEglSurface(surfaceTexture);
-  }
-
-  @After
-  public void tearDown() {
-    surfaceTexture.release();
-    GLES20.glDeleteTextures(1 /* n */, new int[] {oesTextureId}, 0 /* offset */);
-    eglRenderer.release();
-  }
-
-  /** Checks the bitmap is not null and the correct size. */
-  private static void checkBitmap(Bitmap bitmap, float scale) {
-    assertNotNull(bitmap);
-    assertEquals((int) (TEST_FRAME_WIDTH * scale), bitmap.getWidth());
-    assertEquals((int) (TEST_FRAME_HEIGHT * scale), bitmap.getHeight());
-  }
-
-  /**
-   * Does linear sampling on U/V plane of test data.
-   *
-   * @param data Plane data to be sampled from.
-   * @param planeWidth Width of the plane data. This is also assumed to be the stride.
-   * @param planeHeight Height of the plane data.
-   * @param x X-coordinate in range [0, 1].
-   * @param y Y-coordinate in range [0, 1].
-   */
-  private static float linearSample(
-      ByteBuffer plane, int planeWidth, int planeHeight, float x, float y) {
-    final int stride = planeWidth;
-
-    final float coordX = x * planeWidth;
-    final float coordY = y * planeHeight;
-
-    int lowIndexX = (int) Math.floor(coordX - 0.5f);
-    int lowIndexY = (int) Math.floor(coordY - 0.5f);
-    int highIndexX = lowIndexX + 1;
-    int highIndexY = lowIndexY + 1;
-
-    final float highWeightX = coordX - lowIndexX - 0.5f;
-    final float highWeightY = coordY - lowIndexY - 0.5f;
-    final float lowWeightX = 1f - highWeightX;
-    final float lowWeightY = 1f - highWeightY;
-
-    // Clamp on the edges.
-    lowIndexX = Math.max(0, lowIndexX);
-    lowIndexY = Math.max(0, lowIndexY);
-    highIndexX = Math.min(planeWidth - 1, highIndexX);
-    highIndexY = Math.min(planeHeight - 1, highIndexY);
-
-    float lowYValue = (plane.get(lowIndexY * stride + lowIndexX) & 0xFF) * lowWeightX
-        + (plane.get(lowIndexY * stride + highIndexX) & 0xFF) * highWeightX;
-    float highYValue = (plane.get(highIndexY * stride + lowIndexX) & 0xFF) * lowWeightX
-        + (plane.get(highIndexY * stride + highIndexX) & 0xFF) * highWeightX;
-
-    return (lowWeightY * lowYValue + highWeightY * highYValue) / 255f;
-  }
-
-  private static byte saturatedFloatToByte(float c) {
-    return (byte) Math.round(255f * Math.max(0f, Math.min(1f, c)));
-  }
-
-  /**
-   * Converts test data YUV frame to expected RGBA frame. Tries to match the behavior of OpenGL
-   * YUV drawer shader. Does linear sampling on the U- and V-planes.
-   *
-   * @param yuvFrame Array of size 3 containing Y-, U-, V-planes for image of size
-   *                 (TEST_FRAME_WIDTH, TEST_FRAME_HEIGHT). U- and V-planes should be half the size
-   *                 of the Y-plane.
-   */
-  private static byte[] convertYUVFrameToRGBA(ByteBuffer[] yuvFrame) {
-    final byte[] argbFrame = new byte[TEST_FRAME_WIDTH * TEST_FRAME_HEIGHT * 4];
-    final int argbStride = TEST_FRAME_WIDTH * 4;
-    final int yStride = TEST_FRAME_WIDTH;
-
-    final int vStride = TEST_FRAME_WIDTH / 2;
-
-    for (int y = 0; y < TEST_FRAME_HEIGHT; y++) {
-      for (int x = 0; x < TEST_FRAME_WIDTH; x++) {
-        final int x2 = x / 2;
-        final int y2 = y / 2;
-
-        final float yC = (yuvFrame[0].get(y * yStride + x) & 0xFF) / 255f;
-        final float uC = linearSample(yuvFrame[1], TEST_FRAME_WIDTH / 2, TEST_FRAME_HEIGHT / 2,
-                             (x + 0.5f) / TEST_FRAME_WIDTH, (y + 0.5f) / TEST_FRAME_HEIGHT)
-            - 0.5f;
-        final float vC = linearSample(yuvFrame[2], TEST_FRAME_WIDTH / 2, TEST_FRAME_HEIGHT / 2,
-                             (x + 0.5f) / TEST_FRAME_WIDTH, (y + 0.5f) / TEST_FRAME_HEIGHT)
-            - 0.5f;
-        final float rC = yC + 1.403f * vC;
-        final float gC = yC - 0.344f * uC - 0.714f * vC;
-        final float bC = yC + 1.77f * uC;
-
-        argbFrame[y * argbStride + x * 4 + 0] = saturatedFloatToByte(rC);
-        argbFrame[y * argbStride + x * 4 + 1] = saturatedFloatToByte(gC);
-        argbFrame[y * argbStride + x * 4 + 2] = saturatedFloatToByte(bC);
-        argbFrame[y * argbStride + x * 4 + 3] = (byte) 255;
-      }
-    }
-
-    return argbFrame;
-  }
-
-  /** Checks that the bitmap content matches the test frame with the given index. */
-  private static void checkBitmapContent(Bitmap bitmap, int frame) {
-    checkBitmap(bitmap, 1f);
-
-    byte[] expectedRGBA = convertYUVFrameToRGBA(TEST_FRAMES[frame]);
-    ByteBuffer bitmapBuffer = ByteBuffer.allocateDirect(bitmap.getByteCount());
-    bitmap.copyPixelsToBuffer(bitmapBuffer);
-
-    for (int i = 0; i < expectedRGBA.length; i++) {
-      int expected = expectedRGBA[i] & 0xFF;
-      int value = bitmapBuffer.get(i) & 0xFF;
-      // Due to unknown conversion differences check value matches +-1.
-      if (Math.abs(value - expected) > 1) {
-        Logging.d(TAG, "Expected bitmap content: " + Arrays.toString(expectedRGBA));
-        Logging.d(TAG, "Bitmap content: " + Arrays.toString(bitmapBuffer.array()));
-        fail("Frame doesn't match original frame on byte " + i + ". Expected: " + expected
-            + " Result: " + value);
-      }
-    }
-  }
-
-  /** Tells eglRenderer to render test frame with given index. */
-  private void feedFrame(int i) {
-    eglRenderer.renderFrame(new VideoRenderer.I420Frame(TEST_FRAME_WIDTH, TEST_FRAME_HEIGHT, 0,
-        new int[] {TEST_FRAME_WIDTH, TEST_FRAME_WIDTH / 2, TEST_FRAME_WIDTH / 2}, TEST_FRAMES[i],
-        0));
-  }
-
-  @Test
-  @SmallTest
-  public void testAddFrameListener() throws Exception {
-    eglRenderer.addFrameListener(testFrameListener, 0f /* scaleFactor */);
-    feedFrame(0);
-    assertTrue(testFrameListener.waitForBitmap(RENDER_WAIT_MS));
-    assertNull(testFrameListener.resetAndGetBitmap());
-    eglRenderer.addFrameListener(testFrameListener, 0f /* scaleFactor */);
-    feedFrame(1);
-    assertTrue(testFrameListener.waitForBitmap(RENDER_WAIT_MS));
-    assertNull(testFrameListener.resetAndGetBitmap());
-    feedFrame(2);
-    // Check we get no more bitmaps than two.
-    assertFalse(testFrameListener.waitForBitmap(RENDER_WAIT_MS));
-  }
-
-  @Test
-  @SmallTest
-  public void testAddFrameListenerBitmap() throws Exception {
-    eglRenderer.addFrameListener(testFrameListener, 1f /* scaleFactor */);
-    feedFrame(0);
-    assertTrue(testFrameListener.waitForBitmap(RENDER_WAIT_MS));
-    checkBitmapContent(testFrameListener.resetAndGetBitmap(), 0);
-    eglRenderer.addFrameListener(testFrameListener, 1f /* scaleFactor */);
-    feedFrame(1);
-    assertTrue(testFrameListener.waitForBitmap(RENDER_WAIT_MS));
-    checkBitmapContent(testFrameListener.resetAndGetBitmap(), 1);
-  }
-
-  @Test
-  @SmallTest
-  public void testAddFrameListenerBitmapScale() throws Exception {
-    for (int i = 0; i < 3; ++i) {
-      float scale = i * 0.5f + 0.5f;
-      eglRenderer.addFrameListener(testFrameListener, scale);
-      feedFrame(i);
-      assertTrue(testFrameListener.waitForBitmap(RENDER_WAIT_MS));
-      checkBitmap(testFrameListener.resetAndGetBitmap(), scale);
-    }
-  }
-
-  /**
-   * Checks that the frame listener will not be called with a frame that was delivered before the
-   * frame listener was added.
-   */
-  @Test
-  @SmallTest
-  public void testFrameListenerNotCalledWithOldFrames() throws Exception {
-    feedFrame(0);
-    eglRenderer.addFrameListener(testFrameListener, 0f);
-    // Check the old frame does not trigger frame listener.
-    assertFalse(testFrameListener.waitForBitmap(RENDER_WAIT_MS));
-  }
-
-  /** Checks that the frame listener will not be called after it is removed. */
-  @Test
-  @SmallTest
-  public void testRemoveFrameListenerNotRacy() throws Exception {
-    for (int i = 0; i < REMOVE_FRAME_LISTENER_RACY_NUM_TESTS; i++) {
-      feedFrame(0);
-      eglRenderer.addFrameListener(testFrameListener, 0f);
-      eglRenderer.removeFrameListener(testFrameListener);
-      feedFrame(1);
-    }
-    // Check the frame listener hasn't triggered.
-    assertFalse(testFrameListener.waitForBitmap(RENDER_WAIT_MS));
-  }
-
-  @Test
-  @SmallTest
-  public void testFrameListenersFpsReduction() throws Exception {
-    // Test that normal frame listeners receive frames while the renderer is paused.
-    eglRenderer.pauseVideo();
-    eglRenderer.addFrameListener(testFrameListener, 1f /* scaleFactor */);
-    feedFrame(0);
-    assertTrue(testFrameListener.waitForBitmap(RENDER_WAIT_MS));
-    checkBitmapContent(testFrameListener.resetAndGetBitmap(), 0);
-
-    // Test that frame listeners with FPS reduction applied receive frames while the renderer is not
-    // paused.
-    eglRenderer.disableFpsReduction();
-    eglRenderer.addFrameListener(
-        testFrameListener, 1f /* scaleFactor */, null, true /* applyFpsReduction */);
-    feedFrame(1);
-    assertTrue(testFrameListener.waitForBitmap(RENDER_WAIT_MS));
-    checkBitmapContent(testFrameListener.resetAndGetBitmap(), 1);
-
-    // Test that frame listeners with FPS reduction applied will not receive frames while the
-    // renderer is paused.
-    eglRenderer.pauseVideo();
-    eglRenderer.addFrameListener(
-        testFrameListener, 1f /* scaleFactor */, null, true /* applyFpsReduction */);
-    feedFrame(1);
-    assertFalse(testFrameListener.waitForBitmap(RENDER_WAIT_MS));
-  }
-}
diff --git a/sdk/android/instrumentationtests/src/org/webrtc/FileVideoCapturerTest.java b/sdk/android/instrumentationtests/src/org/webrtc/FileVideoCapturerTest.java
deleted file mode 100644
index 8127f8f..0000000
--- a/sdk/android/instrumentationtests/src/org/webrtc/FileVideoCapturerTest.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- *  Copyright 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.
- */
-
-package org.webrtc;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-
-import android.os.Environment;
-import android.support.test.filters.LargeTest;
-import android.support.test.filters.MediumTest;
-import android.support.test.filters.SmallTest;
-import java.io.IOException;
-import java.lang.Thread;
-import java.nio.charset.Charset;
-import java.util.ArrayList;
-import java.util.Arrays;
-import org.chromium.base.test.BaseJUnit4ClassRunner;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-@RunWith(BaseJUnit4ClassRunner.class)
-public class FileVideoCapturerTest {
-  private static class Frame {
-    public byte[] data;
-    public int width;
-    public int height;
-  }
-
-  public class MockCapturerObserver implements VideoCapturer.CapturerObserver {
-    private final ArrayList<Frame> frameDatas = new ArrayList<Frame>();
-
-    @Override
-    public void onCapturerStarted(boolean success) {
-      assertTrue(success);
-    }
-
-    @Override
-    public void onCapturerStopped() {
-      // Empty on purpose.
-    }
-
-    @Override
-    public synchronized void onByteBufferFrameCaptured(
-        byte[] data, int width, int height, int rotation, long timeStamp) {
-      Frame frame = new Frame();
-      frame.data = data;
-      frame.width = width;
-      frame.height = height;
-      assertTrue(data.length != 0);
-      frameDatas.add(frame);
-      notify();
-    }
-
-    @Override
-    public void onTextureFrameCaptured(int width, int height, int oesTextureId,
-        float[] transformMatrix, int rotation, long timestamp) {
-      // Empty on purpose.
-    }
-
-    @Override
-    public void onFrameCaptured(VideoFrame frame) {
-      // Empty on purpose.
-    }
-
-    public synchronized ArrayList<Frame> getMinimumFramesBlocking(int minFrames)
-        throws InterruptedException {
-      while (frameDatas.size() < minFrames) {
-        wait();
-      }
-      return new ArrayList<Frame>(frameDatas);
-    }
-  }
-
-  @Test
-  @SmallTest
-  public void testVideoCaptureFromFile() throws InterruptedException, IOException {
-    final int FRAME_WIDTH = 4;
-    final int FRAME_HEIGHT = 4;
-    final FileVideoCapturer fileVideoCapturer =
-        new FileVideoCapturer(Environment.getExternalStorageDirectory().getPath()
-            + "/chromium_tests_root/webrtc/sdk/android/instrumentationtests/src/org/webrtc/"
-            + "capturetestvideo.y4m");
-    final MockCapturerObserver capturerObserver = new MockCapturerObserver();
-    fileVideoCapturer.initialize(null, null, capturerObserver);
-    fileVideoCapturer.startCapture(FRAME_WIDTH, FRAME_HEIGHT, 33);
-
-    final String[] expectedFrames = {
-        "THIS IS JUST SOME TEXT x", "THE SECOND FRAME qwerty.", "HERE IS THE THRID FRAME!"};
-
-    final ArrayList<Frame> frameDatas;
-    frameDatas = capturerObserver.getMinimumFramesBlocking(expectedFrames.length);
-
-    assertEquals(expectedFrames.length, frameDatas.size());
-
-    fileVideoCapturer.stopCapture();
-    fileVideoCapturer.dispose();
-
-    for (int i = 0; i < expectedFrames.length; ++i) {
-      Frame frame = frameDatas.get(i);
-
-      assertEquals(FRAME_WIDTH, frame.width);
-      assertEquals(FRAME_HEIGHT, frame.height);
-      assertEquals(FRAME_WIDTH * FRAME_HEIGHT * 3 / 2, frame.data.length);
-
-      byte[] expectedNV12Bytes = new byte[frame.data.length];
-      FileVideoCapturer.nativeI420ToNV21(expectedFrames[i].getBytes(Charset.forName("US-ASCII")),
-          FRAME_WIDTH, FRAME_HEIGHT, expectedNV12Bytes);
-
-      assertTrue(Arrays.equals(expectedNV12Bytes, frame.data));
-    }
-  }
-}
diff --git a/sdk/android/instrumentationtests/src/org/webrtc/GlRectDrawerTest.java b/sdk/android/instrumentationtests/src/org/webrtc/GlRectDrawerTest.java
deleted file mode 100644
index e1853f2..0000000
--- a/sdk/android/instrumentationtests/src/org/webrtc/GlRectDrawerTest.java
+++ /dev/null
@@ -1,305 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-package org.webrtc;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-import android.graphics.SurfaceTexture;
-import android.opengl.GLES20;
-import android.support.test.filters.MediumTest;
-import android.support.test.filters.SmallTest;
-import java.nio.ByteBuffer;
-import java.util.Random;
-import org.chromium.base.test.BaseJUnit4ClassRunner;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-@RunWith(BaseJUnit4ClassRunner.class)
-public class GlRectDrawerTest {
-  // Resolution of the test image.
-  private static final int WIDTH = 16;
-  private static final int HEIGHT = 16;
-  // Seed for random pixel creation.
-  private static final int SEED = 42;
-  // When comparing pixels, allow some slack for float arithmetic and integer rounding.
-  private static final float MAX_DIFF = 1.5f;
-
-  private static float normalizedByte(byte b) {
-    return (b & 0xFF) / 255.0f;
-  }
-
-  private static float saturatedConvert(float c) {
-    return 255.0f * Math.max(0, Math.min(c, 1));
-  }
-
-  // Assert RGB ByteBuffers are pixel perfect identical.
-  private static void assertByteBufferEquals(
-      int width, int height, ByteBuffer actual, ByteBuffer expected) {
-    actual.rewind();
-    expected.rewind();
-    assertEquals(actual.remaining(), width * height * 3);
-    assertEquals(expected.remaining(), width * height * 3);
-    for (int y = 0; y < height; ++y) {
-      for (int x = 0; x < width; ++x) {
-        final int actualR = actual.get() & 0xFF;
-        final int actualG = actual.get() & 0xFF;
-        final int actualB = actual.get() & 0xFF;
-        final int expectedR = expected.get() & 0xFF;
-        final int expectedG = expected.get() & 0xFF;
-        final int expectedB = expected.get() & 0xFF;
-        if (actualR != expectedR || actualG != expectedG || actualB != expectedB) {
-          fail("ByteBuffers of size " + width + "x" + height + " not equal at position "
-              + "(" + x + ", " + y + "). Expected color (R,G,B): "
-              + "(" + expectedR + ", " + expectedG + ", " + expectedB + ")"
-              + " but was: "
-              + "(" + actualR + ", " + actualG + ", " + actualB + ").");
-        }
-      }
-    }
-  }
-
-  // Convert RGBA ByteBuffer to RGB ByteBuffer.
-  private static ByteBuffer stripAlphaChannel(ByteBuffer rgbaBuffer) {
-    rgbaBuffer.rewind();
-    assertEquals(rgbaBuffer.remaining() % 4, 0);
-    final int numberOfPixels = rgbaBuffer.remaining() / 4;
-    final ByteBuffer rgbBuffer = ByteBuffer.allocateDirect(numberOfPixels * 3);
-    while (rgbaBuffer.hasRemaining()) {
-      // Copy RGB.
-      for (int channel = 0; channel < 3; ++channel) {
-        rgbBuffer.put(rgbaBuffer.get());
-      }
-      // Drop alpha.
-      rgbaBuffer.get();
-    }
-    return rgbBuffer;
-  }
-
-  @Test
-  @SmallTest
-  public void testRgbRendering() {
-    // Create EGL base with a pixel buffer as display output.
-    final EglBase eglBase = EglBase.create(null, EglBase.CONFIG_PIXEL_BUFFER);
-    eglBase.createPbufferSurface(WIDTH, HEIGHT);
-    eglBase.makeCurrent();
-
-    // Create RGB byte buffer plane with random content.
-    final ByteBuffer rgbPlane = ByteBuffer.allocateDirect(WIDTH * HEIGHT * 3);
-    final Random random = new Random(SEED);
-    random.nextBytes(rgbPlane.array());
-
-    // Upload the RGB byte buffer data as a texture.
-    final int rgbTexture = GlUtil.generateTexture(GLES20.GL_TEXTURE_2D);
-    GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
-    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, rgbTexture);
-    GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGB, WIDTH, HEIGHT, 0, GLES20.GL_RGB,
-        GLES20.GL_UNSIGNED_BYTE, rgbPlane);
-    GlUtil.checkNoGLES2Error("glTexImage2D");
-
-    // Draw the RGB frame onto the pixel buffer.
-    final GlRectDrawer drawer = new GlRectDrawer();
-    drawer.drawRgb(rgbTexture, RendererCommon.identityMatrix(), WIDTH, HEIGHT, 0 /* viewportX */,
-        0 /* viewportY */, WIDTH, HEIGHT);
-
-    // Download the pixels in the pixel buffer as RGBA. Not all platforms support RGB, e.g. Nexus 9.
-    final ByteBuffer rgbaData = ByteBuffer.allocateDirect(WIDTH * HEIGHT * 4);
-    GLES20.glReadPixels(0, 0, WIDTH, HEIGHT, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, rgbaData);
-    GlUtil.checkNoGLES2Error("glReadPixels");
-
-    // Assert rendered image is pixel perfect to source RGB.
-    assertByteBufferEquals(WIDTH, HEIGHT, stripAlphaChannel(rgbaData), rgbPlane);
-
-    drawer.release();
-    GLES20.glDeleteTextures(1, new int[] {rgbTexture}, 0);
-    eglBase.release();
-  }
-
-  @Test
-  @SmallTest
-  public void testYuvRendering() {
-    // Create EGL base with a pixel buffer as display output.
-    EglBase eglBase = EglBase.create(null, EglBase.CONFIG_PIXEL_BUFFER);
-    eglBase.createPbufferSurface(WIDTH, HEIGHT);
-    eglBase.makeCurrent();
-
-    // Create YUV byte buffer planes with random content.
-    final ByteBuffer[] yuvPlanes = new ByteBuffer[3];
-    final Random random = new Random(SEED);
-    for (int i = 0; i < 3; ++i) {
-      yuvPlanes[i] = ByteBuffer.allocateDirect(WIDTH * HEIGHT);
-      random.nextBytes(yuvPlanes[i].array());
-    }
-
-    // Generate 3 texture ids for Y/U/V.
-    final int yuvTextures[] = new int[3];
-    for (int i = 0; i < 3; i++) {
-      yuvTextures[i] = GlUtil.generateTexture(GLES20.GL_TEXTURE_2D);
-    }
-
-    // Upload the YUV byte buffer data as textures.
-    for (int i = 0; i < 3; ++i) {
-      GLES20.glActiveTexture(GLES20.GL_TEXTURE0 + i);
-      GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, yuvTextures[i]);
-      GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_LUMINANCE, WIDTH, HEIGHT, 0,
-          GLES20.GL_LUMINANCE, GLES20.GL_UNSIGNED_BYTE, yuvPlanes[i]);
-      GlUtil.checkNoGLES2Error("glTexImage2D");
-    }
-
-    // Draw the YUV frame onto the pixel buffer.
-    final GlRectDrawer drawer = new GlRectDrawer();
-    drawer.drawYuv(yuvTextures, RendererCommon.identityMatrix(), WIDTH, HEIGHT, 0 /* viewportX */,
-        0 /* viewportY */, WIDTH, HEIGHT);
-
-    // Download the pixels in the pixel buffer as RGBA. Not all platforms support RGB, e.g. Nexus 9.
-    final ByteBuffer data = ByteBuffer.allocateDirect(WIDTH * HEIGHT * 4);
-    GLES20.glReadPixels(0, 0, WIDTH, HEIGHT, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, data);
-    GlUtil.checkNoGLES2Error("glReadPixels");
-
-    // Compare the YUV data with the RGBA result.
-    for (int y = 0; y < HEIGHT; ++y) {
-      for (int x = 0; x < WIDTH; ++x) {
-        // YUV color space. Y in [0, 1], UV in [-0.5, 0.5]. The constants are taken from the YUV
-        // fragment shader code in GlRectDrawer.
-        final float y_luma = normalizedByte(yuvPlanes[0].get());
-        final float u_chroma = normalizedByte(yuvPlanes[1].get()) - 0.5f;
-        final float v_chroma = normalizedByte(yuvPlanes[2].get()) - 0.5f;
-        // Expected color in unrounded RGB [0.0f, 255.0f].
-        final float expectedRed = saturatedConvert(y_luma + 1.403f * v_chroma);
-        final float expectedGreen =
-            saturatedConvert(y_luma - 0.344f * u_chroma - 0.714f * v_chroma);
-        final float expectedBlue = saturatedConvert(y_luma + 1.77f * u_chroma);
-
-        // Actual color in RGB8888.
-        final int actualRed = data.get() & 0xFF;
-        final int actualGreen = data.get() & 0xFF;
-        final int actualBlue = data.get() & 0xFF;
-        final int actualAlpha = data.get() & 0xFF;
-
-        // Assert rendered image is close to pixel perfect from source YUV.
-        assertTrue(Math.abs(actualRed - expectedRed) < MAX_DIFF);
-        assertTrue(Math.abs(actualGreen - expectedGreen) < MAX_DIFF);
-        assertTrue(Math.abs(actualBlue - expectedBlue) < MAX_DIFF);
-        assertEquals(actualAlpha, 255);
-      }
-    }
-
-    drawer.release();
-    GLES20.glDeleteTextures(3, yuvTextures, 0);
-    eglBase.release();
-  }
-
-  /**
-   * The purpose here is to test GlRectDrawer.oesDraw(). Unfortunately, there is no easy way to
-   * create an OES texture, which is needed for input to oesDraw(). Most of the test is concerned
-   * with creating OES textures in the following way:
-   *  - Create SurfaceTexture with help from SurfaceTextureHelper.
-   *  - Create an EglBase with the SurfaceTexture as EGLSurface.
-   *  - Upload RGB texture with known content.
-   *  - Draw the RGB texture onto the EglBase with the SurfaceTexture as target.
-   *  - Wait for an OES texture to be produced.
-   * The actual oesDraw() test is this:
-   *  - Create an EglBase with a pixel buffer as target.
-   *  - Render the OES texture onto the pixel buffer.
-   *  - Read back the pixel buffer and compare it with the known RGB data.
-   */
-  @Test
-  @MediumTest
-  public void testOesRendering() throws InterruptedException {
-    /**
-     * Stub class to convert RGB ByteBuffers to OES textures by drawing onto a SurfaceTexture.
-     */
-    class StubOesTextureProducer {
-      private final EglBase eglBase;
-      private final GlRectDrawer drawer;
-      private final int rgbTexture;
-
-      public StubOesTextureProducer(
-          EglBase.Context sharedContext, SurfaceTexture surfaceTexture, int width, int height) {
-        eglBase = EglBase.create(sharedContext, EglBase.CONFIG_PLAIN);
-        surfaceTexture.setDefaultBufferSize(width, height);
-        eglBase.createSurface(surfaceTexture);
-        assertEquals(eglBase.surfaceWidth(), width);
-        assertEquals(eglBase.surfaceHeight(), height);
-
-        drawer = new GlRectDrawer();
-
-        eglBase.makeCurrent();
-        rgbTexture = GlUtil.generateTexture(GLES20.GL_TEXTURE_2D);
-      }
-
-      public void draw(ByteBuffer rgbPlane) {
-        eglBase.makeCurrent();
-
-        // Upload RGB data to texture.
-        GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
-        GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, rgbTexture);
-        GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGB, WIDTH, HEIGHT, 0, GLES20.GL_RGB,
-            GLES20.GL_UNSIGNED_BYTE, rgbPlane);
-        // Draw the RGB data onto the SurfaceTexture.
-        drawer.drawRgb(rgbTexture, RendererCommon.identityMatrix(), WIDTH, HEIGHT,
-            0 /* viewportX */, 0 /* viewportY */, WIDTH, HEIGHT);
-        eglBase.swapBuffers();
-      }
-
-      public void release() {
-        eglBase.makeCurrent();
-        drawer.release();
-        GLES20.glDeleteTextures(1, new int[] {rgbTexture}, 0);
-        eglBase.release();
-      }
-    }
-
-    // Create EGL base with a pixel buffer as display output.
-    final EglBase eglBase = EglBase.create(null, EglBase.CONFIG_PIXEL_BUFFER);
-    eglBase.createPbufferSurface(WIDTH, HEIGHT);
-
-    // Create resources for generating OES textures.
-    final SurfaceTextureHelper surfaceTextureHelper = SurfaceTextureHelper.create(
-        "SurfaceTextureHelper test" /* threadName */, eglBase.getEglBaseContext());
-    final StubOesTextureProducer oesProducer = new StubOesTextureProducer(
-        eglBase.getEglBaseContext(), surfaceTextureHelper.getSurfaceTexture(), WIDTH, HEIGHT);
-    final SurfaceTextureHelperTest.MockTextureListener listener =
-        new SurfaceTextureHelperTest.MockTextureListener();
-    surfaceTextureHelper.startListening(listener);
-
-    // Create RGB byte buffer plane with random content.
-    final ByteBuffer rgbPlane = ByteBuffer.allocateDirect(WIDTH * HEIGHT * 3);
-    final Random random = new Random(SEED);
-    random.nextBytes(rgbPlane.array());
-
-    // Draw the frame and block until an OES texture is delivered.
-    oesProducer.draw(rgbPlane);
-    listener.waitForNewFrame();
-
-    // Real test starts here.
-    // Draw the OES texture on the pixel buffer.
-    eglBase.makeCurrent();
-    final GlRectDrawer drawer = new GlRectDrawer();
-    drawer.drawOes(listener.oesTextureId, listener.transformMatrix, WIDTH, HEIGHT,
-        0 /* viewportX */, 0 /* viewportY */, WIDTH, HEIGHT);
-
-    // Download the pixels in the pixel buffer as RGBA. Not all platforms support RGB, e.g. Nexus 9.
-    final ByteBuffer rgbaData = ByteBuffer.allocateDirect(WIDTH * HEIGHT * 4);
-    GLES20.glReadPixels(0, 0, WIDTH, HEIGHT, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, rgbaData);
-    GlUtil.checkNoGLES2Error("glReadPixels");
-
-    // Assert rendered image is pixel perfect to source RGB.
-    assertByteBufferEquals(WIDTH, HEIGHT, stripAlphaChannel(rgbaData), rgbPlane);
-
-    drawer.release();
-    surfaceTextureHelper.returnTextureFrame();
-    oesProducer.release();
-    surfaceTextureHelper.dispose();
-    eglBase.release();
-  }
-}
diff --git a/sdk/android/instrumentationtests/src/org/webrtc/HardwareVideoDecoderTest.java b/sdk/android/instrumentationtests/src/org/webrtc/HardwareVideoDecoderTest.java
deleted file mode 100644
index 38d10e1..0000000
--- a/sdk/android/instrumentationtests/src/org/webrtc/HardwareVideoDecoderTest.java
+++ /dev/null
@@ -1,233 +0,0 @@
-/*
- *  Copyright 2017 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.
- */
-
-package org.webrtc;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-
-import android.annotation.TargetApi;
-import android.graphics.Matrix;
-import android.support.test.filters.MediumTest;
-import android.util.Log;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.atomic.AtomicReference;
-import org.chromium.base.test.BaseJUnit4ClassRunner;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-/** Unit tests for {@link HardwareVideoDecoder}. */
-@TargetApi(16)
-@RunWith(BaseJUnit4ClassRunner.class)
-public final class HardwareVideoDecoderTest {
-  private static final String TAG = "HardwareVideoDecoderTest";
-
-  private static final boolean ENABLE_INTEL_VP8_ENCODER = true;
-  private static final boolean ENABLE_H264_HIGH_PROFILE = true;
-  private static final VideoDecoder.Settings SETTINGS =
-      new VideoDecoder.Settings(1 /* core */, 640 /* width */, 480 /* height */);
-
-  @Test
-  @MediumTest
-  public void testInitialize() {
-    HardwareVideoEncoderFactory encoderFactory =
-        new HardwareVideoEncoderFactory(ENABLE_INTEL_VP8_ENCODER, ENABLE_H264_HIGH_PROFILE);
-    VideoCodecInfo[] supportedCodecs = encoderFactory.getSupportedCodecs();
-    if (supportedCodecs.length == 0) {
-      Log.i(TAG, "No hardware encoding support, skipping testInitialize");
-      return;
-    }
-
-    HardwareVideoDecoderFactory decoderFactory = new HardwareVideoDecoderFactory(null);
-
-    VideoDecoder decoder = decoderFactory.createDecoder(supportedCodecs[0].name);
-    assertEquals(decoder.initDecode(SETTINGS, null), VideoCodecStatus.OK);
-    assertEquals(decoder.release(), VideoCodecStatus.OK);
-  }
-
-  @Test
-  @MediumTest
-  public void testInitializeUsingTextures() {
-    HardwareVideoEncoderFactory encoderFactory =
-        new HardwareVideoEncoderFactory(ENABLE_INTEL_VP8_ENCODER, ENABLE_H264_HIGH_PROFILE);
-    VideoCodecInfo[] supportedCodecs = encoderFactory.getSupportedCodecs();
-    if (supportedCodecs.length == 0) {
-      Log.i(TAG, "No hardware encoding support, skipping testInitialize");
-      return;
-    }
-
-    EglBase14 eglBase = new EglBase14(null, EglBase.CONFIG_PLAIN);
-    HardwareVideoDecoderFactory decoderFactory =
-        new HardwareVideoDecoderFactory(eglBase.getEglBaseContext());
-
-    VideoDecoder decoder = decoderFactory.createDecoder(supportedCodecs[0].name);
-    assertEquals(decoder.initDecode(SETTINGS, null), VideoCodecStatus.OK);
-    assertEquals(decoder.release(), VideoCodecStatus.OK);
-
-    eglBase.release();
-  }
-
-  @Test
-  @MediumTest
-  public void testDecode() throws InterruptedException {
-    HardwareVideoEncoderFactory encoderFactory =
-        new HardwareVideoEncoderFactory(ENABLE_INTEL_VP8_ENCODER, ENABLE_H264_HIGH_PROFILE);
-    VideoCodecInfo[] supportedCodecs = encoderFactory.getSupportedCodecs();
-    if (supportedCodecs.length == 0) {
-      Log.i(TAG, "No hardware encoding support, skipping testEncodeYuvBuffer");
-      return;
-    }
-
-    // Set up the decoder.
-    HardwareVideoDecoderFactory decoderFactory = new HardwareVideoDecoderFactory(null);
-    VideoDecoder decoder = decoderFactory.createDecoder(supportedCodecs[0].name);
-
-    final long presentationTimestampUs = 20000;
-    final int rotation = 270;
-
-    final CountDownLatch decodeDone = new CountDownLatch(1);
-    final AtomicReference<VideoFrame> decoded = new AtomicReference<>();
-    VideoDecoder.Callback decodeCallback = new VideoDecoder.Callback() {
-      @Override
-      public void onDecodedFrame(VideoFrame frame, Integer decodeTimeMs, Integer qp) {
-        frame.retain();
-        decoded.set(frame);
-        decodeDone.countDown();
-      }
-    };
-    assertEquals(decoder.initDecode(SETTINGS, decodeCallback), VideoCodecStatus.OK);
-
-    // Set up an encoder to produce a valid encoded frame.
-    VideoEncoder encoder = encoderFactory.createEncoder(supportedCodecs[0]);
-    final CountDownLatch encodeDone = new CountDownLatch(1);
-    final AtomicReference<EncodedImage> encoded = new AtomicReference<>();
-    VideoEncoder.Callback encodeCallback = new VideoEncoder.Callback() {
-      @Override
-      public void onEncodedFrame(EncodedImage image, VideoEncoder.CodecSpecificInfo info) {
-        encoded.set(image);
-        encodeDone.countDown();
-      }
-    };
-    assertEquals(encoder.initEncode(new VideoEncoder.Settings(1, SETTINGS.width, SETTINGS.height,
-                                        300, 30, true /* automaticResizeOn */),
-                     encodeCallback),
-        VideoCodecStatus.OK);
-
-    // First, encode a frame.
-    VideoFrame.I420Buffer buffer = I420BufferImpl.allocate(SETTINGS.width, SETTINGS.height);
-    VideoFrame frame = new VideoFrame(buffer, rotation, presentationTimestampUs * 1000);
-    VideoEncoder.EncodeInfo info = new VideoEncoder.EncodeInfo(
-        new EncodedImage.FrameType[] {EncodedImage.FrameType.VideoFrameKey});
-
-    assertEquals(encoder.encode(frame, info), VideoCodecStatus.OK);
-
-    ThreadUtils.awaitUninterruptibly(encodeDone);
-
-    // Now decode the frame.
-    assertEquals(
-        decoder.decode(encoded.get(), new VideoDecoder.DecodeInfo(false, 0)), VideoCodecStatus.OK);
-
-    ThreadUtils.awaitUninterruptibly(decodeDone);
-
-    frame = decoded.get();
-    assertEquals(frame.getRotation(), rotation);
-    assertEquals(frame.getTimestampNs(), presentationTimestampUs * 1000);
-    assertEquals(frame.getBuffer().getWidth(), SETTINGS.width);
-    assertEquals(frame.getBuffer().getHeight(), SETTINGS.height);
-
-    frame.release();
-    assertEquals(decoder.release(), VideoCodecStatus.OK);
-    assertEquals(encoder.release(), VideoCodecStatus.OK);
-  }
-
-  @Test
-  @MediumTest
-  public void testDecodeUsingTextures() throws InterruptedException {
-    HardwareVideoEncoderFactory encoderFactory =
-        new HardwareVideoEncoderFactory(ENABLE_INTEL_VP8_ENCODER, ENABLE_H264_HIGH_PROFILE);
-    VideoCodecInfo[] supportedCodecs = encoderFactory.getSupportedCodecs();
-    if (supportedCodecs.length == 0) {
-      Log.i(TAG, "No hardware encoding support, skipping testEncodeYuvBuffer");
-      return;
-    }
-
-    // Set up the decoder.
-    EglBase14 eglBase = new EglBase14(null, EglBase.CONFIG_PLAIN);
-    HardwareVideoDecoderFactory decoderFactory =
-        new HardwareVideoDecoderFactory(eglBase.getEglBaseContext());
-    VideoDecoder decoder = decoderFactory.createDecoder(supportedCodecs[0].name);
-
-    final long presentationTimestampUs = 20000;
-    final int rotation = 270;
-
-    final CountDownLatch decodeDone = new CountDownLatch(1);
-    final AtomicReference<VideoFrame> decoded = new AtomicReference<>();
-    VideoDecoder.Callback decodeCallback = new VideoDecoder.Callback() {
-      @Override
-      public void onDecodedFrame(VideoFrame frame, Integer decodeTimeMs, Integer qp) {
-        frame.retain();
-        decoded.set(frame);
-        decodeDone.countDown();
-      }
-    };
-    assertEquals(decoder.initDecode(SETTINGS, decodeCallback), VideoCodecStatus.OK);
-
-    // Set up an encoder to produce a valid encoded frame.
-    VideoEncoder encoder = encoderFactory.createEncoder(supportedCodecs[0]);
-    final CountDownLatch encodeDone = new CountDownLatch(1);
-    final AtomicReference<EncodedImage> encoded = new AtomicReference<>();
-    VideoEncoder.Callback encodeCallback = new VideoEncoder.Callback() {
-      @Override
-      public void onEncodedFrame(EncodedImage image, VideoEncoder.CodecSpecificInfo info) {
-        encoded.set(image);
-        encodeDone.countDown();
-      }
-    };
-    assertEquals(encoder.initEncode(new VideoEncoder.Settings(1, SETTINGS.width, SETTINGS.height,
-                                        300, 30, true /* automaticResizeOn */),
-                     encodeCallback),
-        VideoCodecStatus.OK);
-
-    // First, encode a frame.
-    VideoFrame.I420Buffer buffer = I420BufferImpl.allocate(SETTINGS.width, SETTINGS.height);
-    VideoFrame frame = new VideoFrame(buffer, rotation, presentationTimestampUs * 1000);
-    VideoEncoder.EncodeInfo info = new VideoEncoder.EncodeInfo(
-        new EncodedImage.FrameType[] {EncodedImage.FrameType.VideoFrameKey});
-
-    assertEquals(encoder.encode(frame, info), VideoCodecStatus.OK);
-
-    ThreadUtils.awaitUninterruptibly(encodeDone);
-
-    // Now decode the frame.
-    assertEquals(
-        decoder.decode(encoded.get(), new VideoDecoder.DecodeInfo(false, 0)), VideoCodecStatus.OK);
-
-    ThreadUtils.awaitUninterruptibly(decodeDone);
-
-    frame = decoded.get();
-    assertEquals(frame.getRotation(), rotation);
-    assertEquals(frame.getTimestampNs(), presentationTimestampUs * 1000);
-
-    assertTrue(frame.getBuffer() instanceof VideoFrame.TextureBuffer);
-    VideoFrame.TextureBuffer textureBuffer = (VideoFrame.TextureBuffer) frame.getBuffer();
-    // TODO(mellem):  Compare the matrix to whatever we expect to get back?
-    assertNotNull(textureBuffer.getTransformMatrix());
-    assertEquals(textureBuffer.getWidth(), SETTINGS.width);
-    assertEquals(textureBuffer.getHeight(), SETTINGS.height);
-    assertEquals(textureBuffer.getType(), VideoFrame.TextureBuffer.Type.OES);
-
-    assertEquals(decoder.release(), VideoCodecStatus.OK);
-    assertEquals(encoder.release(), VideoCodecStatus.OK);
-
-    frame.release();
-    eglBase.release();
-  }
-}
diff --git a/sdk/android/instrumentationtests/src/org/webrtc/HardwareVideoEncoderTest.java b/sdk/android/instrumentationtests/src/org/webrtc/HardwareVideoEncoderTest.java
deleted file mode 100644
index 92e9fa3..0000000
--- a/sdk/android/instrumentationtests/src/org/webrtc/HardwareVideoEncoderTest.java
+++ /dev/null
@@ -1,212 +0,0 @@
-/*
- *  Copyright 2017 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.
- */
-
-package org.webrtc;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-
-import android.annotation.TargetApi;
-import android.graphics.Matrix;
-import android.opengl.GLES11Ext;
-import android.opengl.GLES20;
-import android.support.test.filters.SmallTest;
-import android.util.Log;
-import java.nio.ByteBuffer;
-import java.util.concurrent.CountDownLatch;
-import org.chromium.base.test.BaseJUnit4ClassRunner;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-@TargetApi(16)
-@RunWith(BaseJUnit4ClassRunner.class)
-public class HardwareVideoEncoderTest {
-  final static String TAG = "MediaCodecVideoEncoderTest";
-
-  private static final boolean ENABLE_INTEL_VP8_ENCODER = true;
-  private static final boolean ENABLE_H264_HIGH_PROFILE = true;
-  private static final VideoEncoder.Settings SETTINGS =
-      new VideoEncoder.Settings(1 /* core */, 640 /* width */, 480 /* height */, 300 /* kbps */,
-          30 /* fps */, true /* automaticResizeOn */);
-
-  @Test
-  @SmallTest
-  public void testInitializeUsingYuvBuffer() {
-    HardwareVideoEncoderFactory factory =
-        new HardwareVideoEncoderFactory(ENABLE_INTEL_VP8_ENCODER, ENABLE_H264_HIGH_PROFILE);
-    VideoCodecInfo[] supportedCodecs = factory.getSupportedCodecs();
-    if (supportedCodecs.length == 0) {
-      Log.w(TAG, "No hardware encoding support, skipping testInitializeUsingYuvBuffer");
-      return;
-    }
-    VideoEncoder encoder = factory.createEncoder(supportedCodecs[0]);
-    assertEquals(VideoCodecStatus.OK, encoder.initEncode(SETTINGS, null));
-    assertEquals(VideoCodecStatus.OK, encoder.release());
-  }
-
-  @Test
-  @SmallTest
-  public void testInitializeUsingTextures() {
-    EglBase14 eglBase = new EglBase14(null, EglBase.CONFIG_PLAIN);
-    HardwareVideoEncoderFactory factory = new HardwareVideoEncoderFactory(
-        eglBase.getEglBaseContext(), ENABLE_INTEL_VP8_ENCODER, ENABLE_H264_HIGH_PROFILE);
-    VideoCodecInfo[] supportedCodecs = factory.getSupportedCodecs();
-    if (supportedCodecs.length == 0) {
-      Log.w(TAG, "No hardware encoding support, skipping testInitializeUsingTextures");
-      return;
-    }
-    VideoEncoder encoder = factory.createEncoder(supportedCodecs[0]);
-    assertEquals(VideoCodecStatus.OK, encoder.initEncode(SETTINGS, null));
-    assertEquals(VideoCodecStatus.OK, encoder.release());
-    eglBase.release();
-  }
-
-  @Test
-  @SmallTest
-  public void testEncodeYuvBuffer() throws InterruptedException {
-    HardwareVideoEncoderFactory factory =
-        new HardwareVideoEncoderFactory(ENABLE_INTEL_VP8_ENCODER, ENABLE_H264_HIGH_PROFILE);
-    VideoCodecInfo[] supportedCodecs = factory.getSupportedCodecs();
-    if (supportedCodecs.length == 0) {
-      Log.w(TAG, "No hardware encoding support, skipping testEncodeYuvBuffer");
-      return;
-    }
-
-    VideoEncoder encoder = factory.createEncoder(supportedCodecs[0]);
-
-    final long presentationTimestampNs = 20000;
-    final CountDownLatch encodeDone = new CountDownLatch(1);
-
-    VideoEncoder.Callback callback = new VideoEncoder.Callback() {
-      @Override
-      public void onEncodedFrame(EncodedImage image, VideoEncoder.CodecSpecificInfo info) {
-        assertTrue(image.buffer.capacity() > 0);
-        assertEquals(image.encodedWidth, SETTINGS.width);
-        assertEquals(image.encodedHeight, SETTINGS.height);
-        assertEquals(image.captureTimeNs, presentationTimestampNs);
-        assertEquals(image.frameType, EncodedImage.FrameType.VideoFrameKey);
-        assertEquals(image.rotation, 0);
-        assertTrue(image.completeFrame);
-
-        encodeDone.countDown();
-      }
-    };
-
-    assertEquals(encoder.initEncode(SETTINGS, callback), VideoCodecStatus.OK);
-
-    VideoFrame.I420Buffer buffer = I420BufferImpl.allocate(SETTINGS.width, SETTINGS.height);
-    VideoFrame frame = new VideoFrame(buffer, 0 /* rotation */, presentationTimestampNs);
-    VideoEncoder.EncodeInfo info = new VideoEncoder.EncodeInfo(
-        new EncodedImage.FrameType[] {EncodedImage.FrameType.VideoFrameKey});
-
-    assertEquals(encoder.encode(frame, info), VideoCodecStatus.OK);
-
-    ThreadUtils.awaitUninterruptibly(encodeDone);
-
-    assertEquals(encoder.release(), VideoCodecStatus.OK);
-  }
-
-  @Test
-  @SmallTest
-  public void testEncodeTextures() throws InterruptedException {
-    final EglBase14 eglOesBase = new EglBase14(null, EglBase.CONFIG_PIXEL_BUFFER);
-    HardwareVideoEncoderFactory factory = new HardwareVideoEncoderFactory(
-        eglOesBase.getEglBaseContext(), ENABLE_INTEL_VP8_ENCODER, ENABLE_H264_HIGH_PROFILE);
-    VideoCodecInfo[] supportedCodecs = factory.getSupportedCodecs();
-    if (supportedCodecs.length == 0) {
-      Log.w(TAG, "No hardware encoding support, skipping testEncodeTextures");
-      return;
-    }
-
-    eglOesBase.createDummyPbufferSurface();
-    eglOesBase.makeCurrent();
-    final int oesTextureId = GlUtil.generateTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES);
-
-    VideoEncoder encoder = factory.createEncoder(supportedCodecs[0]);
-
-    final long presentationTimestampNs = 20000;
-    final CountDownLatch encodeDone = new CountDownLatch(1);
-
-    VideoEncoder.Callback callback = new VideoEncoder.Callback() {
-      @Override
-      public void onEncodedFrame(EncodedImage image, VideoEncoder.CodecSpecificInfo info) {
-        assertTrue(image.buffer.capacity() > 0);
-        assertEquals(image.encodedWidth, SETTINGS.width);
-        assertEquals(image.encodedHeight, SETTINGS.height);
-        assertEquals(image.captureTimeNs, presentationTimestampNs);
-        assertEquals(image.frameType, EncodedImage.FrameType.VideoFrameKey);
-        assertEquals(image.rotation, 0);
-        assertTrue(image.completeFrame);
-
-        encodeDone.countDown();
-      }
-    };
-
-    assertEquals(encoder.initEncode(SETTINGS, callback), VideoCodecStatus.OK);
-
-    VideoFrame.TextureBuffer buffer = new VideoFrame.TextureBuffer() {
-      @Override
-      public VideoFrame.TextureBuffer.Type getType() {
-        return VideoFrame.TextureBuffer.Type.OES;
-      }
-
-      @Override
-      public int getTextureId() {
-        return oesTextureId;
-      }
-
-      @Override
-      public Matrix getTransformMatrix() {
-        return new Matrix();
-      }
-
-      @Override
-      public int getWidth() {
-        return SETTINGS.width;
-      }
-
-      @Override
-      public int getHeight() {
-        return SETTINGS.height;
-      }
-
-      @Override
-      public VideoFrame.I420Buffer toI420() {
-        return null;
-      }
-
-      @Override
-      public void retain() {}
-
-      @Override
-      public void release() {}
-
-      @Override
-      public VideoFrame.Buffer cropAndScale(
-          int cropX, int cropY, int cropWidth, int cropHeight, int scaleWidth, int scaleHeight) {
-        return null;
-      }
-    };
-    VideoFrame frame = new VideoFrame(buffer, 0 /* rotation */, presentationTimestampNs);
-    VideoEncoder.EncodeInfo info = new VideoEncoder.EncodeInfo(
-        new EncodedImage.FrameType[] {EncodedImage.FrameType.VideoFrameKey});
-
-    assertEquals(encoder.encode(frame, info), VideoCodecStatus.OK);
-    GlUtil.checkNoGLES2Error("encodeTexture");
-
-    // It should be Ok to delete the texture after calling encodeTexture.
-    GLES20.glDeleteTextures(1, new int[] {oesTextureId}, 0);
-
-    ThreadUtils.awaitUninterruptibly(encodeDone);
-
-    assertEquals(encoder.release(), VideoCodecStatus.OK);
-    eglOesBase.release();
-  }
-}
diff --git a/sdk/android/instrumentationtests/src/org/webrtc/MediaCodecVideoEncoderTest.java b/sdk/android/instrumentationtests/src/org/webrtc/MediaCodecVideoEncoderTest.java
deleted file mode 100644
index fdc7a29..0000000
--- a/sdk/android/instrumentationtests/src/org/webrtc/MediaCodecVideoEncoderTest.java
+++ /dev/null
@@ -1,170 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-package org.webrtc;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-
-import android.annotation.TargetApi;
-import android.opengl.GLES11Ext;
-import android.opengl.GLES20;
-import android.os.Build;
-import android.support.test.filters.SmallTest;
-import android.util.Log;
-import java.nio.ByteBuffer;
-import org.chromium.base.test.BaseJUnit4ClassRunner;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.webrtc.MediaCodecVideoEncoder.OutputBufferInfo;
-
-@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1)
-@RunWith(BaseJUnit4ClassRunner.class)
-public class MediaCodecVideoEncoderTest {
-  final static String TAG = "MediaCodecVideoEncoderTest";
-  final static int profile = MediaCodecVideoEncoder.H264Profile.CONSTRAINED_BASELINE.getValue();
-
-  @Test
-  @SmallTest
-  public void testInitializeUsingByteBuffer() {
-    if (!MediaCodecVideoEncoder.isVp8HwSupported()) {
-      Log.i(TAG, "Hardware does not support VP8 encoding, skipping testInitReleaseUsingByteBuffer");
-      return;
-    }
-    MediaCodecVideoEncoder encoder = new MediaCodecVideoEncoder();
-    assertTrue(encoder.initEncode(
-        MediaCodecVideoEncoder.VideoCodecType.VIDEO_CODEC_VP8, profile, 640, 480, 300, 30, null));
-    encoder.release();
-  }
-
-  @Test
-  @SmallTest
-  public void testInitilizeUsingTextures() {
-    if (!MediaCodecVideoEncoder.isVp8HwSupportedUsingTextures()) {
-      Log.i(TAG, "hardware does not support VP8 encoding, skipping testEncoderUsingTextures");
-      return;
-    }
-    EglBase14 eglBase = new EglBase14(null, EglBase.CONFIG_PLAIN);
-    MediaCodecVideoEncoder encoder = new MediaCodecVideoEncoder();
-    assertTrue(encoder.initEncode(MediaCodecVideoEncoder.VideoCodecType.VIDEO_CODEC_VP8, profile,
-        640, 480, 300, 30, eglBase.getEglBaseContext()));
-    encoder.release();
-    eglBase.release();
-  }
-
-  @Test
-  @SmallTest
-  public void testInitializeUsingByteBufferReInitilizeUsingTextures() {
-    if (!MediaCodecVideoEncoder.isVp8HwSupportedUsingTextures()) {
-      Log.i(TAG, "hardware does not support VP8 encoding, skipping testEncoderUsingTextures");
-      return;
-    }
-    MediaCodecVideoEncoder encoder = new MediaCodecVideoEncoder();
-    assertTrue(encoder.initEncode(
-        MediaCodecVideoEncoder.VideoCodecType.VIDEO_CODEC_VP8, profile, 640, 480, 300, 30, null));
-    encoder.release();
-    EglBase14 eglBase = new EglBase14(null, EglBase.CONFIG_PLAIN);
-    assertTrue(encoder.initEncode(MediaCodecVideoEncoder.VideoCodecType.VIDEO_CODEC_VP8, profile,
-        640, 480, 300, 30, eglBase.getEglBaseContext()));
-    encoder.release();
-    eglBase.release();
-  }
-
-  @Test
-  @SmallTest
-  public void testEncoderUsingByteBuffer() throws InterruptedException {
-    if (!MediaCodecVideoEncoder.isVp8HwSupported()) {
-      Log.i(TAG, "Hardware does not support VP8 encoding, skipping testEncoderUsingByteBuffer");
-      return;
-    }
-
-    final int width = 640;
-    final int height = 480;
-    final int min_size = width * height * 3 / 2;
-    final long presentationTimestampUs = 2;
-
-    MediaCodecVideoEncoder encoder = new MediaCodecVideoEncoder();
-
-    assertTrue(encoder.initEncode(MediaCodecVideoEncoder.VideoCodecType.VIDEO_CODEC_VP8, profile,
-        width, height, 300, 30, null));
-    ByteBuffer[] inputBuffers = encoder.getInputBuffers();
-    assertNotNull(inputBuffers);
-    assertTrue(min_size <= inputBuffers[0].capacity());
-
-    int bufferIndex;
-    do {
-      Thread.sleep(10);
-      bufferIndex = encoder.dequeueInputBuffer();
-    } while (bufferIndex == -1); // |-1| is returned when there is no buffer available yet.
-
-    assertTrue(bufferIndex >= 0);
-    assertTrue(bufferIndex < inputBuffers.length);
-    assertTrue(encoder.encodeBuffer(true, bufferIndex, min_size, presentationTimestampUs));
-
-    OutputBufferInfo info;
-    do {
-      info = encoder.dequeueOutputBuffer();
-      Thread.sleep(10);
-    } while (info == null);
-    assertTrue(info.index >= 0);
-    assertEquals(presentationTimestampUs, info.presentationTimestampUs);
-    assertTrue(info.buffer.capacity() > 0);
-    encoder.releaseOutputBuffer(info.index);
-
-    encoder.release();
-  }
-
-  @Test
-  @SmallTest
-  public void testEncoderUsingTextures() throws InterruptedException {
-    if (!MediaCodecVideoEncoder.isVp8HwSupportedUsingTextures()) {
-      Log.i(TAG, "Hardware does not support VP8 encoding, skipping testEncoderUsingTextures");
-      return;
-    }
-
-    final int width = 640;
-    final int height = 480;
-    final long presentationTs = 2;
-
-    final EglBase14 eglOesBase = new EglBase14(null, EglBase.CONFIG_PIXEL_BUFFER);
-    eglOesBase.createDummyPbufferSurface();
-    eglOesBase.makeCurrent();
-    int oesTextureId = GlUtil.generateTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES);
-
-    // TODO(perkj): This test is week since we don't fill the texture with valid data with correct
-    // width and height and verify the encoded data. Fill the OES texture and figure out a way to
-    // verify that the output make sense.
-
-    MediaCodecVideoEncoder encoder = new MediaCodecVideoEncoder();
-
-    assertTrue(encoder.initEncode(MediaCodecVideoEncoder.VideoCodecType.VIDEO_CODEC_VP8, profile,
-        width, height, 300, 30, eglOesBase.getEglBaseContext()));
-    assertTrue(
-        encoder.encodeTexture(true, oesTextureId, RendererCommon.identityMatrix(), presentationTs));
-    GlUtil.checkNoGLES2Error("encodeTexture");
-
-    // It should be Ok to delete the texture after calling encodeTexture.
-    GLES20.glDeleteTextures(1, new int[] {oesTextureId}, 0);
-
-    OutputBufferInfo info = encoder.dequeueOutputBuffer();
-    while (info == null) {
-      info = encoder.dequeueOutputBuffer();
-      Thread.sleep(20);
-    }
-    assertTrue(info.index != -1);
-    assertTrue(info.buffer.capacity() > 0);
-    assertEquals(presentationTs, info.presentationTimestampUs);
-    encoder.releaseOutputBuffer(info.index);
-
-    encoder.release();
-    eglOesBase.release();
-  }
-}
diff --git a/sdk/android/instrumentationtests/src/org/webrtc/NetworkMonitorTest.java b/sdk/android/instrumentationtests/src/org/webrtc/NetworkMonitorTest.java
deleted file mode 100644
index 923bd3c..0000000
--- a/sdk/android/instrumentationtests/src/org/webrtc/NetworkMonitorTest.java
+++ /dev/null
@@ -1,291 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-package org.webrtc;
-
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-import static org.webrtc.NetworkMonitorAutoDetect.ConnectionType;
-import static org.webrtc.NetworkMonitorAutoDetect.ConnectivityManagerDelegate;
-import static org.webrtc.NetworkMonitorAutoDetect.INVALID_NET_ID;
-import static org.webrtc.NetworkMonitorAutoDetect.NetworkInformation;
-import static org.webrtc.NetworkMonitorAutoDetect.NetworkState;
-
-import android.annotation.SuppressLint;
-import android.content.Context;
-import android.content.Intent;
-import android.net.ConnectivityManager;
-import android.net.Network;
-import android.net.wifi.WifiManager;
-import android.os.Build;
-import android.os.Handler;
-import android.os.Looper;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.annotation.UiThreadTest;
-import android.support.test.filters.MediumTest;
-import android.support.test.filters.SmallTest;
-import android.support.test.rule.UiThreadTestRule;
-import org.chromium.base.test.BaseJUnit4ClassRunner;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-/**
- * Tests for org.webrtc.NetworkMonitor.
- *
- * TODO(deadbeef): These tests don't cover the interaction between
- * NetworkManager.java and androidnetworkmonitor_jni.cc, which is how this
- * class is used in practice in WebRTC.
- */
-@SuppressLint("NewApi")
-@RunWith(BaseJUnit4ClassRunner.class)
-public class NetworkMonitorTest {
-  @Rule public UiThreadTestRule uiThreadTestRule = new UiThreadTestRule();
-
-  /**
-   * Listens for alerts fired by the NetworkMonitor when network status changes.
-   */
-  private static class NetworkMonitorTestObserver implements NetworkMonitor.NetworkObserver {
-    private boolean receivedNotification = false;
-
-    @Override
-    public void onConnectionTypeChanged(ConnectionType connectionType) {
-      receivedNotification = true;
-    }
-
-    public boolean hasReceivedNotification() {
-      return receivedNotification;
-    }
-
-    public void resetHasReceivedNotification() {
-      receivedNotification = false;
-    }
-  }
-
-  /**
-   * Mocks out calls to the ConnectivityManager.
-   */
-  private static class MockConnectivityManagerDelegate extends ConnectivityManagerDelegate {
-    private boolean activeNetworkExists;
-    private int networkType;
-    private int networkSubtype;
-
-    @Override
-    public NetworkState getNetworkState() {
-      return new NetworkState(activeNetworkExists, networkType, networkSubtype);
-    }
-
-    // Dummy implementations to avoid NullPointerExceptions in default implementations:
-
-    @Override
-    public long getDefaultNetId() {
-      return INVALID_NET_ID;
-    }
-
-    @Override
-    public Network[] getAllNetworks() {
-      return new Network[0];
-    }
-
-    @Override
-    public NetworkState getNetworkState(Network network) {
-      return new NetworkState(false, -1, -1);
-    }
-
-    public void setActiveNetworkExists(boolean networkExists) {
-      activeNetworkExists = networkExists;
-    }
-
-    public void setNetworkType(int networkType) {
-      this.networkType = networkType;
-    }
-
-    public void setNetworkSubtype(int networkSubtype) {
-      this.networkSubtype = networkSubtype;
-    }
-  }
-
-  /**
-   * Mocks out calls to the WifiManager.
-   */
-  private static class MockWifiManagerDelegate
-      extends NetworkMonitorAutoDetect.WifiManagerDelegate {
-    private String wifiSSID;
-
-    @Override
-    public String getWifiSSID() {
-      return wifiSSID;
-    }
-
-    public void setWifiSSID(String wifiSSID) {
-      this.wifiSSID = wifiSSID;
-    }
-  }
-
-  // A dummy NetworkMonitorAutoDetect.Observer.
-  private static class TestNetworkMonitorAutoDetectObserver
-      implements NetworkMonitorAutoDetect.Observer {
-    @Override
-    public void onConnectionTypeChanged(ConnectionType newConnectionType) {}
-
-    @Override
-    public void onNetworkConnect(NetworkInformation networkInfo) {}
-
-    @Override
-    public void onNetworkDisconnect(long networkHandle) {}
-  }
-
-  private static final Object lock = new Object();
-  private static Handler uiThreadHandler = null;
-
-  private NetworkMonitorAutoDetect receiver;
-  private MockConnectivityManagerDelegate connectivityDelegate;
-  private MockWifiManagerDelegate wifiDelegate;
-
-  private static Handler getUiThreadHandler() {
-    synchronized (lock) {
-      if (uiThreadHandler == null) {
-        uiThreadHandler = new Handler(Looper.getMainLooper());
-      }
-      return uiThreadHandler;
-    }
-  }
-
-  /**
-   * Helper method to create a network monitor and delegates for testing.
-   */
-  private void createTestMonitor() {
-    Context context = InstrumentationRegistry.getTargetContext();
-    NetworkMonitor.resetInstanceForTests();
-    NetworkMonitor.createAutoDetectorForTest();
-    receiver = NetworkMonitor.getAutoDetectorForTest();
-    assertNotNull(receiver);
-
-    connectivityDelegate = new MockConnectivityManagerDelegate();
-    connectivityDelegate.setActiveNetworkExists(true);
-    receiver.setConnectivityManagerDelegateForTests(connectivityDelegate);
-
-    wifiDelegate = new MockWifiManagerDelegate();
-    receiver.setWifiManagerDelegateForTests(wifiDelegate);
-    wifiDelegate.setWifiSSID("foo");
-  }
-
-  private NetworkMonitorAutoDetect.ConnectionType getCurrentConnectionType() {
-    final NetworkMonitorAutoDetect.NetworkState networkState = receiver.getCurrentNetworkState();
-    return receiver.getConnectionType(networkState);
-  }
-
-  @Before
-  public void setUp() {
-    ContextUtils.initialize(InstrumentationRegistry.getTargetContext());
-    createTestMonitor();
-  }
-
-  /**
-   * Tests that the receiver registers for connectivity intents during construction.
-   */
-  @Test
-  @UiThreadTest
-  @SmallTest
-  public void testNetworkMonitorRegistersInConstructor() throws InterruptedException {
-    Context context = InstrumentationRegistry.getTargetContext();
-
-    NetworkMonitorAutoDetect.Observer observer = new TestNetworkMonitorAutoDetectObserver();
-
-    NetworkMonitorAutoDetect receiver = new NetworkMonitorAutoDetect(observer, context);
-
-    assertTrue(receiver.isReceiverRegisteredForTesting());
-  }
-
-  /**
-   * Tests that when there is an intent indicating a change in network connectivity, it sends a
-   * notification to Java observers.
-   */
-  @Test
-  @UiThreadTest
-  @MediumTest
-  public void testNetworkMonitorJavaObservers() throws InterruptedException {
-    // Initialize the NetworkMonitor with a connection.
-    Intent connectivityIntent = new Intent(ConnectivityManager.CONNECTIVITY_ACTION);
-    receiver.onReceive(InstrumentationRegistry.getTargetContext(), connectivityIntent);
-
-    // We shouldn't be re-notified if the connection hasn't actually changed.
-    NetworkMonitorTestObserver observer = new NetworkMonitorTestObserver();
-    NetworkMonitor.addNetworkObserver(observer);
-    receiver.onReceive(InstrumentationRegistry.getTargetContext(), connectivityIntent);
-    assertFalse(observer.hasReceivedNotification());
-
-    // We shouldn't be notified if we're connected to non-Wifi and the Wifi SSID changes.
-    wifiDelegate.setWifiSSID("bar");
-    receiver.onReceive(InstrumentationRegistry.getTargetContext(), connectivityIntent);
-    assertFalse(observer.hasReceivedNotification());
-
-    // We should be notified when we change to Wifi.
-    connectivityDelegate.setNetworkType(ConnectivityManager.TYPE_WIFI);
-    receiver.onReceive(InstrumentationRegistry.getTargetContext(), connectivityIntent);
-    assertTrue(observer.hasReceivedNotification());
-    observer.resetHasReceivedNotification();
-
-    // We should be notified when the Wifi SSID changes.
-    wifiDelegate.setWifiSSID("foo");
-    receiver.onReceive(InstrumentationRegistry.getTargetContext(), connectivityIntent);
-    assertTrue(observer.hasReceivedNotification());
-    observer.resetHasReceivedNotification();
-
-    // We shouldn't be re-notified if the Wifi SSID hasn't actually changed.
-    receiver.onReceive(InstrumentationRegistry.getTargetContext(), connectivityIntent);
-    assertFalse(observer.hasReceivedNotification());
-
-    // Mimic that connectivity has been lost and ensure that the observer gets the notification.
-    connectivityDelegate.setActiveNetworkExists(false);
-    Intent noConnectivityIntent = new Intent(ConnectivityManager.CONNECTIVITY_ACTION);
-    receiver.onReceive(InstrumentationRegistry.getTargetContext(), noConnectivityIntent);
-    assertTrue(observer.hasReceivedNotification());
-  }
-
-  /**
-   * Tests that ConnectivityManagerDelegate doesn't crash. This test cannot rely on having any
-   * active network connections so it cannot usefully check results, but it can at least check
-   * that the functions don't crash.
-   */
-  @Test
-  @UiThreadTest
-  @SmallTest
-  public void testConnectivityManagerDelegateDoesNotCrash() {
-    ConnectivityManagerDelegate delegate =
-        new ConnectivityManagerDelegate(InstrumentationRegistry.getTargetContext());
-    delegate.getNetworkState();
-    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
-      Network[] networks = delegate.getAllNetworks();
-      if (networks.length >= 1) {
-        delegate.getNetworkState(networks[0]);
-        delegate.hasInternetCapability(networks[0]);
-      }
-      delegate.getDefaultNetId();
-    }
-  }
-
-  /**
-   * Tests that NetworkMonitorAutoDetect queryable APIs don't crash. This test cannot rely
-   * on having any active network connections so it cannot usefully check results, but it can at
-   * least check that the functions don't crash.
-   */
-  @Test
-  @UiThreadTest
-  @SmallTest
-  public void testQueryableAPIsDoNotCrash() {
-    NetworkMonitorAutoDetect.Observer observer = new TestNetworkMonitorAutoDetectObserver();
-    NetworkMonitorAutoDetect ncn =
-        new NetworkMonitorAutoDetect(observer, InstrumentationRegistry.getTargetContext());
-    ncn.getDefaultNetId();
-  }
-}
diff --git a/sdk/android/instrumentationtests/src/org/webrtc/PeerConnectionTest.java b/sdk/android/instrumentationtests/src/org/webrtc/PeerConnectionTest.java
deleted file mode 100644
index 699c7de..0000000
--- a/sdk/android/instrumentationtests/src/org/webrtc/PeerConnectionTest.java
+++ /dev/null
@@ -1,1282 +0,0 @@
-/*
- *  Copyright 2013 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.
- */
-
-package org.webrtc;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.MediumTest;
-import android.support.test.filters.SmallTest;
-import java.io.File;
-import java.lang.ref.WeakReference;
-import java.nio.ByteBuffer;
-import java.nio.charset.Charset;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.IdentityHashMap;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.TreeSet;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
-import org.chromium.base.test.BaseJUnit4ClassRunner;
-import org.chromium.base.test.util.DisabledTest;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.webrtc.Metrics.HistogramInfo;
-import org.webrtc.PeerConnection.IceConnectionState;
-import org.webrtc.PeerConnection.IceGatheringState;
-import org.webrtc.PeerConnection.SignalingState;
-
-/** End-to-end tests for PeerConnection.java. */
-@RunWith(BaseJUnit4ClassRunner.class)
-public class PeerConnectionTest {
-  private static final int TIMEOUT_SECONDS = 20;
-  private TreeSet<String> threadsBeforeTest = null;
-
-  @Before
-  public void setUp() {
-    PeerConnectionFactory.initializeAndroidGlobals(InstrumentationRegistry.getContext(), true);
-  }
-
-  private static class ObserverExpectations
-      implements PeerConnection.Observer, VideoRenderer.Callbacks, DataChannel.Observer,
-                 StatsObserver, RTCStatsCollectorCallback, RtpReceiver.Observer {
-    private final String name;
-    private int expectedIceCandidates = 0;
-    private int expectedErrors = 0;
-    private int expectedRenegotiations = 0;
-    private int expectedWidth = 0;
-    private int expectedHeight = 0;
-    private int expectedFramesDelivered = 0;
-    private int expectedTracksAdded = 0;
-    private LinkedList<SignalingState> expectedSignalingChanges = new LinkedList<SignalingState>();
-    private LinkedList<IceConnectionState> expectedIceConnectionChanges =
-        new LinkedList<IceConnectionState>();
-    private LinkedList<IceGatheringState> expectedIceGatheringChanges =
-        new LinkedList<IceGatheringState>();
-    private LinkedList<String> expectedAddStreamLabels = new LinkedList<String>();
-    private LinkedList<String> expectedRemoveStreamLabels = new LinkedList<String>();
-    private final LinkedList<IceCandidate> gotIceCandidates = new LinkedList<IceCandidate>();
-    private Map<MediaStream, WeakReference<VideoRenderer>> renderers =
-        new IdentityHashMap<MediaStream, WeakReference<VideoRenderer>>();
-    private DataChannel dataChannel;
-    private LinkedList<DataChannel.Buffer> expectedBuffers = new LinkedList<DataChannel.Buffer>();
-    private LinkedList<DataChannel.State> expectedStateChanges =
-        new LinkedList<DataChannel.State>();
-    private LinkedList<String> expectedRemoteDataChannelLabels = new LinkedList<String>();
-    private int expectedOldStatsCallbacks = 0;
-    private int expectedNewStatsCallbacks = 0;
-    private LinkedList<StatsReport[]> gotStatsReports = new LinkedList<StatsReport[]>();
-    private final HashSet<MediaStream> gotRemoteStreams = new HashSet<MediaStream>();
-    private int expectedFirstAudioPacket = 0;
-    private int expectedFirstVideoPacket = 0;
-
-    public ObserverExpectations(String name) {
-      this.name = name;
-    }
-
-    public synchronized void setDataChannel(DataChannel dataChannel) {
-      assertNull(this.dataChannel);
-      this.dataChannel = dataChannel;
-      this.dataChannel.registerObserver(this);
-      assertNotNull(this.dataChannel);
-    }
-
-    public synchronized void expectIceCandidates(int count) {
-      expectedIceCandidates += count;
-    }
-
-    @Override
-    public synchronized void onIceCandidate(IceCandidate candidate) {
-      --expectedIceCandidates;
-
-      // We don't assert expectedIceCandidates >= 0 because it's hard to know
-      // how many to expect, in general.  We only use expectIceCandidates to
-      // assert a minimal count.
-      synchronized (gotIceCandidates) {
-        gotIceCandidates.add(candidate);
-        gotIceCandidates.notifyAll();
-      }
-    }
-
-    @Override
-    public void onIceCandidatesRemoved(IceCandidate[] candidates) {}
-
-    public synchronized void setExpectedResolution(int width, int height) {
-      expectedWidth = width;
-      expectedHeight = height;
-    }
-
-    public synchronized void expectFramesDelivered(int count) {
-      expectedFramesDelivered += count;
-    }
-
-    @Override
-    public synchronized void renderFrame(VideoRenderer.I420Frame frame) {
-      assertTrue(expectedWidth > 0);
-      assertTrue(expectedHeight > 0);
-      assertEquals(expectedWidth, frame.rotatedWidth());
-      assertEquals(expectedHeight, frame.rotatedHeight());
-      --expectedFramesDelivered;
-      VideoRenderer.renderFrameDone(frame);
-    }
-
-    public synchronized void expectSignalingChange(SignalingState newState) {
-      expectedSignalingChanges.add(newState);
-    }
-
-    @Override
-    public synchronized void onSignalingChange(SignalingState newState) {
-      assertEquals(expectedSignalingChanges.removeFirst(), newState);
-    }
-
-    public synchronized void expectIceConnectionChange(IceConnectionState newState) {
-      expectedIceConnectionChanges.add(newState);
-    }
-
-    @Override
-    public synchronized void onIceConnectionChange(IceConnectionState newState) {
-      // TODO(bemasc): remove once delivery of ICECompleted is reliable
-      // (https://code.google.com/p/webrtc/issues/detail?id=3021).
-      if (newState.equals(IceConnectionState.COMPLETED)) {
-        return;
-      }
-
-      if (expectedIceConnectionChanges.isEmpty()) {
-        System.out.println(name + "Got an unexpected ice connection change " + newState);
-        return;
-      }
-
-      assertEquals(expectedIceConnectionChanges.removeFirst(), newState);
-    }
-
-    @Override
-    public synchronized void onIceConnectionReceivingChange(boolean receiving) {
-      System.out.println(name + "Got an ice connection receiving change " + receiving);
-    }
-
-    public synchronized void expectIceGatheringChange(IceGatheringState newState) {
-      expectedIceGatheringChanges.add(newState);
-    }
-
-    @Override
-    public synchronized void onIceGatheringChange(IceGatheringState newState) {
-      // It's fine to get a variable number of GATHERING messages before
-      // COMPLETE fires (depending on how long the test runs) so we don't assert
-      // any particular count.
-      if (newState == IceGatheringState.GATHERING) {
-        return;
-      }
-      assertEquals(expectedIceGatheringChanges.removeFirst(), newState);
-    }
-
-    public synchronized void expectAddStream(String label) {
-      expectedAddStreamLabels.add(label);
-    }
-
-    @Override
-    public synchronized void onAddStream(MediaStream stream) {
-      assertEquals(expectedAddStreamLabels.removeFirst(), stream.label());
-      assertEquals(1, stream.videoTracks.size());
-      assertEquals(1, stream.audioTracks.size());
-      assertTrue(stream.videoTracks.get(0).id().endsWith("VideoTrack"));
-      assertTrue(stream.audioTracks.get(0).id().endsWith("AudioTrack"));
-      assertEquals("video", stream.videoTracks.get(0).kind());
-      assertEquals("audio", stream.audioTracks.get(0).kind());
-      VideoRenderer renderer = createVideoRenderer(this);
-      stream.videoTracks.get(0).addRenderer(renderer);
-      assertNull(renderers.put(stream, new WeakReference<VideoRenderer>(renderer)));
-      gotRemoteStreams.add(stream);
-    }
-
-    public synchronized void expectRemoveStream(String label) {
-      expectedRemoveStreamLabels.add(label);
-    }
-
-    @Override
-    public synchronized void onRemoveStream(MediaStream stream) {
-      assertEquals(expectedRemoveStreamLabels.removeFirst(), stream.label());
-      WeakReference<VideoRenderer> renderer = renderers.remove(stream);
-      assertNotNull(renderer);
-      assertNotNull(renderer.get());
-      assertEquals(1, stream.videoTracks.size());
-      stream.videoTracks.get(0).removeRenderer(renderer.get());
-      gotRemoteStreams.remove(stream);
-    }
-
-    public synchronized void expectDataChannel(String label) {
-      expectedRemoteDataChannelLabels.add(label);
-    }
-
-    @Override
-    public synchronized void onDataChannel(DataChannel remoteDataChannel) {
-      assertEquals(expectedRemoteDataChannelLabels.removeFirst(), remoteDataChannel.label());
-      setDataChannel(remoteDataChannel);
-      assertEquals(DataChannel.State.CONNECTING, dataChannel.state());
-    }
-
-    public synchronized void expectRenegotiationNeeded() {
-      ++expectedRenegotiations;
-    }
-
-    @Override
-    public synchronized void onRenegotiationNeeded() {
-      assertTrue(--expectedRenegotiations >= 0);
-    }
-
-    public synchronized void expectAddTrack(int expectedTracksAdded) {
-      this.expectedTracksAdded = expectedTracksAdded;
-    }
-
-    @Override
-    public synchronized void onAddTrack(RtpReceiver receiver, MediaStream[] mediaStreams) {
-      expectedTracksAdded--;
-    }
-
-    public synchronized void expectMessage(ByteBuffer expectedBuffer, boolean expectedBinary) {
-      expectedBuffers.add(new DataChannel.Buffer(expectedBuffer, expectedBinary));
-    }
-
-    @Override
-    public synchronized void onMessage(DataChannel.Buffer buffer) {
-      DataChannel.Buffer expected = expectedBuffers.removeFirst();
-      assertEquals(expected.binary, buffer.binary);
-      assertTrue(expected.data.equals(buffer.data));
-    }
-
-    @Override
-    public synchronized void onBufferedAmountChange(long previousAmount) {
-      assertFalse(previousAmount == dataChannel.bufferedAmount());
-    }
-
-    @Override
-    public synchronized void onStateChange() {
-      assertEquals(expectedStateChanges.removeFirst(), dataChannel.state());
-    }
-
-    public synchronized void expectStateChange(DataChannel.State state) {
-      expectedStateChanges.add(state);
-    }
-
-    // Old getStats callback.
-    @Override
-    public synchronized void onComplete(StatsReport[] reports) {
-      if (--expectedOldStatsCallbacks < 0) {
-        throw new RuntimeException("Unexpected stats report: " + reports);
-      }
-      gotStatsReports.add(reports);
-    }
-
-    // New getStats callback.
-    @Override
-    public synchronized void onStatsDelivered(RTCStatsReport report) {
-      if (--expectedNewStatsCallbacks < 0) {
-        throw new RuntimeException("Unexpected stats report: " + report);
-      }
-    }
-
-    @Override
-    public synchronized void onFirstPacketReceived(MediaStreamTrack.MediaType mediaType) {
-      if (mediaType == MediaStreamTrack.MediaType.MEDIA_TYPE_AUDIO) {
-        expectedFirstAudioPacket--;
-      } else {
-        expectedFirstVideoPacket--;
-      }
-      if (expectedFirstAudioPacket < 0 || expectedFirstVideoPacket < 0) {
-        throw new RuntimeException("Unexpected call of onFirstPacketReceived");
-      }
-    }
-
-    public synchronized void expectFirstPacketReceived() {
-      expectedFirstAudioPacket = 1;
-      expectedFirstVideoPacket = 1;
-    }
-
-    public synchronized void expectOldStatsCallback() {
-      ++expectedOldStatsCallbacks;
-    }
-
-    public synchronized void expectNewStatsCallback() {
-      ++expectedNewStatsCallbacks;
-    }
-
-    public synchronized LinkedList<StatsReport[]> takeStatsReports() {
-      LinkedList<StatsReport[]> got = gotStatsReports;
-      gotStatsReports = new LinkedList<StatsReport[]>();
-      return got;
-    }
-
-    // Return a set of expectations that haven't been satisfied yet, possibly
-    // empty if no such expectations exist.
-    public synchronized TreeSet<String> unsatisfiedExpectations() {
-      TreeSet<String> stillWaitingForExpectations = new TreeSet<String>();
-      if (expectedIceCandidates > 0) { // See comment in onIceCandidate.
-        stillWaitingForExpectations.add("expectedIceCandidates");
-      }
-      if (expectedErrors != 0) {
-        stillWaitingForExpectations.add("expectedErrors: " + expectedErrors);
-      }
-      if (expectedSignalingChanges.size() != 0) {
-        stillWaitingForExpectations.add(
-            "expectedSignalingChanges: " + expectedSignalingChanges.size());
-      }
-      if (expectedIceConnectionChanges.size() != 0) {
-        stillWaitingForExpectations.add(
-            "expectedIceConnectionChanges: " + expectedIceConnectionChanges.size());
-      }
-      if (expectedIceGatheringChanges.size() != 0) {
-        stillWaitingForExpectations.add(
-            "expectedIceGatheringChanges: " + expectedIceGatheringChanges.size());
-      }
-      if (expectedAddStreamLabels.size() != 0) {
-        stillWaitingForExpectations.add(
-            "expectedAddStreamLabels: " + expectedAddStreamLabels.size());
-      }
-      if (expectedRemoveStreamLabels.size() != 0) {
-        stillWaitingForExpectations.add(
-            "expectedRemoveStreamLabels: " + expectedRemoveStreamLabels.size());
-      }
-      if (expectedFramesDelivered > 0) {
-        stillWaitingForExpectations.add("expectedFramesDelivered: " + expectedFramesDelivered);
-      }
-      if (!expectedBuffers.isEmpty()) {
-        stillWaitingForExpectations.add("expectedBuffers: " + expectedBuffers.size());
-      }
-      if (!expectedStateChanges.isEmpty()) {
-        stillWaitingForExpectations.add("expectedStateChanges: " + expectedStateChanges.size());
-      }
-      if (!expectedRemoteDataChannelLabels.isEmpty()) {
-        stillWaitingForExpectations.add(
-            "expectedRemoteDataChannelLabels: " + expectedRemoteDataChannelLabels.size());
-      }
-      if (expectedOldStatsCallbacks != 0) {
-        stillWaitingForExpectations.add("expectedOldStatsCallbacks: " + expectedOldStatsCallbacks);
-      }
-      if (expectedNewStatsCallbacks != 0) {
-        stillWaitingForExpectations.add("expectedNewStatsCallbacks: " + expectedNewStatsCallbacks);
-      }
-      if (expectedFirstAudioPacket > 0) {
-        stillWaitingForExpectations.add("expectedFirstAudioPacket: " + expectedFirstAudioPacket);
-      }
-      if (expectedFirstVideoPacket > 0) {
-        stillWaitingForExpectations.add("expectedFirstVideoPacket: " + expectedFirstVideoPacket);
-      }
-      if (expectedTracksAdded != 0) {
-        stillWaitingForExpectations.add("expectedAddedTrack: " + expectedTracksAdded);
-      }
-      return stillWaitingForExpectations;
-    }
-
-    public boolean waitForAllExpectationsToBeSatisfied(int timeoutSeconds) {
-      // TODO(fischman): problems with this approach:
-      // - come up with something better than a poll loop
-      // - avoid serializing expectations explicitly; the test is not as robust
-      //   as it could be because it must place expectations between wait
-      //   statements very precisely (e.g. frame must not arrive before its
-      //   expectation, and expectation must not be registered so early as to
-      //   stall a wait).  Use callbacks to fire off dependent steps instead of
-      //   explicitly waiting, so there can be just a single wait at the end of
-      //   the test.
-      long endTime = System.currentTimeMillis() + 1000 * timeoutSeconds;
-      TreeSet<String> prev = null;
-      TreeSet<String> stillWaitingForExpectations = unsatisfiedExpectations();
-      while (!stillWaitingForExpectations.isEmpty()) {
-        if (!stillWaitingForExpectations.equals(prev)) {
-          System.out.println(name + " still waiting at\n    " + (new Throwable()).getStackTrace()[1]
-              + "\n    for: " + Arrays.toString(stillWaitingForExpectations.toArray()));
-        }
-        if (endTime < System.currentTimeMillis()) {
-          System.out.println(name + " timed out waiting for: "
-              + Arrays.toString(stillWaitingForExpectations.toArray()));
-          return false;
-        }
-        try {
-          Thread.sleep(10);
-        } catch (InterruptedException e) {
-          throw new RuntimeException(e);
-        }
-        prev = stillWaitingForExpectations;
-        stillWaitingForExpectations = unsatisfiedExpectations();
-      }
-      if (prev == null) {
-        System.out.println(
-            name + " didn't need to wait at\n    " + (new Throwable()).getStackTrace()[1]);
-      }
-      return true;
-    }
-
-    // This methods return a list of all currently gathered ice candidates or waits until
-    // 1 candidate have been gathered.
-    public List<IceCandidate> getAtLeastOneIceCandidate() throws InterruptedException {
-      synchronized (gotIceCandidates) {
-        while (gotIceCandidates.isEmpty()) {
-          gotIceCandidates.wait();
-        }
-        return new LinkedList<IceCandidate>(gotIceCandidates);
-      }
-    }
-  }
-
-  // Sets the expected resolution for an ObserverExpectations once a frame
-  // has been captured.
-  private static class ExpectedResolutionSetter implements VideoRenderer.Callbacks {
-    private ObserverExpectations observer;
-
-    public ExpectedResolutionSetter(ObserverExpectations observer) {
-      this.observer = observer;
-    }
-
-    @Override
-    public synchronized void renderFrame(VideoRenderer.I420Frame frame) {
-      // Because different camera devices (fake & physical) produce different
-      // resolutions, we only sanity-check the set sizes,
-      assertTrue(frame.rotatedWidth() > 0);
-      assertTrue(frame.rotatedHeight() > 0);
-      observer.setExpectedResolution(frame.rotatedWidth(), frame.rotatedHeight());
-    }
-  }
-
-  private static class SdpObserverLatch implements SdpObserver {
-    private boolean success = false;
-    private SessionDescription sdp = null;
-    private String error = null;
-    private CountDownLatch latch = new CountDownLatch(1);
-
-    public SdpObserverLatch() {}
-
-    @Override
-    public void onCreateSuccess(SessionDescription sdp) {
-      this.sdp = sdp;
-      onSetSuccess();
-    }
-
-    @Override
-    public void onSetSuccess() {
-      success = true;
-      latch.countDown();
-    }
-
-    @Override
-    public void onCreateFailure(String error) {
-      onSetFailure(error);
-    }
-
-    @Override
-    public void onSetFailure(String error) {
-      this.error = error;
-      latch.countDown();
-    }
-
-    public boolean await() {
-      try {
-        assertTrue(latch.await(1000, TimeUnit.MILLISECONDS));
-        return getSuccess();
-      } catch (Exception e) {
-        throw new RuntimeException(e);
-      }
-    }
-
-    public boolean getSuccess() {
-      return success;
-    }
-
-    public SessionDescription getSdp() {
-      return sdp;
-    }
-
-    public String getError() {
-      return error;
-    }
-  }
-
-  static int videoWindowsMapped = -1;
-
-  private static VideoRenderer createVideoRenderer(VideoRenderer.Callbacks videoCallbacks) {
-    return new VideoRenderer(videoCallbacks);
-  }
-
-  // Return a weak reference to test that ownership is correctly held by
-  // PeerConnection, not by test code.
-  private static WeakReference<MediaStream> addTracksToPC(PeerConnectionFactory factory,
-      PeerConnection pc, VideoSource videoSource, String streamLabel, String videoTrackId,
-      String audioTrackId, VideoRenderer.Callbacks videoCallbacks) {
-    MediaStream lMS = factory.createLocalMediaStream(streamLabel);
-    VideoTrack videoTrack = factory.createVideoTrack(videoTrackId, videoSource);
-    assertNotNull(videoTrack);
-    VideoRenderer videoRenderer = createVideoRenderer(videoCallbacks);
-    assertNotNull(videoRenderer);
-    videoTrack.addRenderer(videoRenderer);
-    lMS.addTrack(videoTrack);
-    // Just for fun, let's remove and re-add the track.
-    lMS.removeTrack(videoTrack);
-    lMS.addTrack(videoTrack);
-    lMS.addTrack(
-        factory.createAudioTrack(audioTrackId, factory.createAudioSource(new MediaConstraints())));
-    pc.addStream(lMS);
-    return new WeakReference<MediaStream>(lMS);
-  }
-
-  // Used for making sure thread handles are not leaked.
-  // Call initializeThreadCheck before a test and finalizeThreadCheck after
-  // a test.
-  void initializeThreadCheck() {
-    System.gc(); // Encourage any GC-related threads to start up.
-    threadsBeforeTest = allThreads();
-  }
-
-  void finalizeThreadCheck() throws Exception {
-    // TreeSet<String> threadsAfterTest = allThreads();
-
-    // TODO(tommi): Figure out a more reliable way to do this test.  As is
-    // we're seeing three possible 'normal' situations:
-    // 1.  before and after sets are equal.
-    // 2.  before contains 3 threads that do not exist in after.
-    // 3.  after contains 3 threads that do not exist in before.
-    //
-    // Maybe it would be better to do the thread enumeration from C++ and get
-    // the thread names as well, in order to determine what these 3 threads are.
-
-    // assertEquals(threadsBeforeTest, threadsAfterTest);
-    // Thread.sleep(100);
-  }
-
-  // TODO(fischman) MOAR test ideas:
-  // - Test that PC.removeStream() works; requires a second
-  //   createOffer/createAnswer dance.
-  // - audit each place that uses |constraints| for specifying non-trivial
-  //   constraints (and ensure they're honored).
-  // - test error cases
-  // - ensure reasonable coverage of _jni.cc is achieved.  Coverage is
-  //   extra-important because of all the free-text (class/method names, etc)
-  //   in JNI-style programming; make sure no typos!
-  // - Test that shutdown mid-interaction is crash-free.
-
-  // Tests that the JNI glue between Java and C++ does not crash when creating a PeerConnection.
-  @Test
-  @SmallTest
-  public void testCreationWithConfig() throws Exception {
-    PeerConnectionFactory.Options options = new PeerConnectionFactory.Options();
-    PeerConnectionFactory factory = new PeerConnectionFactory(options);
-    List<PeerConnection.IceServer> iceServers =
-        Arrays.asList(new PeerConnection.IceServer("stun:stun.l.google.com:19302"),
-            new PeerConnection.IceServer("turn:fake.example.com", "fakeUsername", "fakePassword"));
-    PeerConnection.RTCConfiguration config = new PeerConnection.RTCConfiguration(iceServers);
-
-    // Test configuration options.
-    config.continualGatheringPolicy = PeerConnection.ContinualGatheringPolicy.GATHER_CONTINUALLY;
-    config.iceRegatherIntervalRange = new PeerConnection.IntervalRange(1000, 2000);
-
-    MediaConstraints constraints = new MediaConstraints();
-    ObserverExpectations offeringExpectations = new ObserverExpectations("PCTest:offerer");
-    PeerConnection offeringPC =
-        factory.createPeerConnection(config, constraints, offeringExpectations);
-    assertNotNull(offeringPC);
-  }
-
-  @Test
-  @MediumTest
-  public void testCompleteSession() throws Exception {
-    Metrics.enable();
-    // Allow loopback interfaces too since our Android devices often don't
-    // have those.
-    PeerConnectionFactory.Options options = new PeerConnectionFactory.Options();
-    options.networkIgnoreMask = 0;
-    PeerConnectionFactory factory = new PeerConnectionFactory(options);
-    // Uncomment to get ALL WebRTC tracing and SENSITIVE libjingle logging.
-    // NOTE: this _must_ happen while |factory| is alive!
-    // Logging.enableTracing(
-    //     "/tmp/PeerConnectionTest-log.txt",
-    //     EnumSet.of(Logging.TraceLevel.TRACE_ALL),
-    //     Logging.Severity.LS_SENSITIVE);
-
-    MediaConstraints pcConstraints = new MediaConstraints();
-    pcConstraints.mandatory.add(new MediaConstraints.KeyValuePair("DtlsSrtpKeyAgreement", "true"));
-
-    LinkedList<PeerConnection.IceServer> iceServers = new LinkedList<PeerConnection.IceServer>();
-    iceServers.add(new PeerConnection.IceServer("stun:stun.l.google.com:19302"));
-    iceServers.add(
-        new PeerConnection.IceServer("turn:fake.example.com", "fakeUsername", "fakePassword"));
-    ObserverExpectations offeringExpectations = new ObserverExpectations("PCTest:offerer");
-    PeerConnection offeringPC =
-        factory.createPeerConnection(iceServers, pcConstraints, offeringExpectations);
-    assertNotNull(offeringPC);
-
-    ObserverExpectations answeringExpectations = new ObserverExpectations("PCTest:answerer");
-    PeerConnection answeringPC =
-        factory.createPeerConnection(iceServers, pcConstraints, answeringExpectations);
-    assertNotNull(answeringPC);
-
-    // We want to use the same camera for offerer & answerer, so create it here
-    // instead of in addTracksToPC.
-    final CameraEnumerator enumerator = new Camera1Enumerator(false /* captureToTexture */);
-    final VideoCapturer videoCapturer =
-        enumerator.createCapturer(enumerator.getDeviceNames()[0], null);
-    final VideoSource videoSource = factory.createVideoSource(videoCapturer);
-    videoCapturer.startCapture(640, 480, 30);
-
-    offeringExpectations.expectRenegotiationNeeded();
-    WeakReference<MediaStream> oLMS =
-        addTracksToPC(factory, offeringPC, videoSource, "offeredMediaStream", "offeredVideoTrack",
-            "offeredAudioTrack", new ExpectedResolutionSetter(answeringExpectations));
-
-    offeringExpectations.expectAddTrack(2);
-    answeringExpectations.expectAddTrack(2);
-
-    offeringExpectations.expectRenegotiationNeeded();
-    DataChannel offeringDC = offeringPC.createDataChannel("offeringDC", new DataChannel.Init());
-    assertEquals("offeringDC", offeringDC.label());
-
-    offeringExpectations.setDataChannel(offeringDC);
-    SdpObserverLatch sdpLatch = new SdpObserverLatch();
-    offeringPC.createOffer(sdpLatch, new MediaConstraints());
-    assertTrue(sdpLatch.await());
-    SessionDescription offerSdp = sdpLatch.getSdp();
-    assertEquals(offerSdp.type, SessionDescription.Type.OFFER);
-    assertFalse(offerSdp.description.isEmpty());
-
-    sdpLatch = new SdpObserverLatch();
-    answeringExpectations.expectSignalingChange(SignalingState.HAVE_REMOTE_OFFER);
-    answeringExpectations.expectAddStream("offeredMediaStream");
-    // SCTP DataChannels are announced via OPEN messages over the established
-    // connection (not via SDP), so answeringExpectations can only register
-    // expecting the channel during ICE, below.
-    answeringPC.setRemoteDescription(sdpLatch, offerSdp);
-    assertEquals(PeerConnection.SignalingState.STABLE, offeringPC.signalingState());
-    assertTrue(sdpLatch.await());
-    assertNull(sdpLatch.getSdp());
-
-    answeringExpectations.expectRenegotiationNeeded();
-    WeakReference<MediaStream> aLMS = addTracksToPC(factory, answeringPC, videoSource,
-        "answeredMediaStream", "answeredVideoTrack", "answeredAudioTrack",
-        new ExpectedResolutionSetter(offeringExpectations));
-
-    sdpLatch = new SdpObserverLatch();
-    answeringPC.createAnswer(sdpLatch, new MediaConstraints());
-    assertTrue(sdpLatch.await());
-    SessionDescription answerSdp = sdpLatch.getSdp();
-    assertEquals(answerSdp.type, SessionDescription.Type.ANSWER);
-    assertFalse(answerSdp.description.isEmpty());
-
-    offeringExpectations.expectIceCandidates(2);
-    answeringExpectations.expectIceCandidates(2);
-
-    offeringExpectations.expectIceGatheringChange(IceGatheringState.COMPLETE);
-    answeringExpectations.expectIceGatheringChange(IceGatheringState.COMPLETE);
-
-    sdpLatch = new SdpObserverLatch();
-    answeringExpectations.expectSignalingChange(SignalingState.STABLE);
-    answeringPC.setLocalDescription(sdpLatch, answerSdp);
-    assertTrue(sdpLatch.await());
-    assertNull(sdpLatch.getSdp());
-
-    sdpLatch = new SdpObserverLatch();
-    offeringExpectations.expectSignalingChange(SignalingState.HAVE_LOCAL_OFFER);
-    offeringPC.setLocalDescription(sdpLatch, offerSdp);
-    assertTrue(sdpLatch.await());
-    assertNull(sdpLatch.getSdp());
-    sdpLatch = new SdpObserverLatch();
-    offeringExpectations.expectSignalingChange(SignalingState.STABLE);
-    offeringExpectations.expectAddStream("answeredMediaStream");
-
-    offeringExpectations.expectIceConnectionChange(IceConnectionState.CHECKING);
-    offeringExpectations.expectIceConnectionChange(IceConnectionState.CONNECTED);
-    // TODO(bemasc): uncomment once delivery of ICECompleted is reliable
-    // (https://code.google.com/p/webrtc/issues/detail?id=3021).
-    //
-    // offeringExpectations.expectIceConnectionChange(
-    //     IceConnectionState.COMPLETED);
-    answeringExpectations.expectIceConnectionChange(IceConnectionState.CHECKING);
-    answeringExpectations.expectIceConnectionChange(IceConnectionState.CONNECTED);
-
-    offeringPC.setRemoteDescription(sdpLatch, answerSdp);
-    assertTrue(sdpLatch.await());
-    assertNull(sdpLatch.getSdp());
-
-    assertEquals(offeringPC.getLocalDescription().type, offerSdp.type);
-    assertEquals(offeringPC.getRemoteDescription().type, answerSdp.type);
-    assertEquals(answeringPC.getLocalDescription().type, answerSdp.type);
-    assertEquals(answeringPC.getRemoteDescription().type, offerSdp.type);
-
-    assertEquals(offeringPC.getSenders().size(), 2);
-    assertEquals(offeringPC.getReceivers().size(), 2);
-    assertEquals(answeringPC.getSenders().size(), 2);
-    assertEquals(answeringPC.getReceivers().size(), 2);
-
-    offeringExpectations.expectFirstPacketReceived();
-    answeringExpectations.expectFirstPacketReceived();
-
-    for (RtpReceiver receiver : offeringPC.getReceivers()) {
-      receiver.SetObserver(offeringExpectations);
-    }
-
-    for (RtpReceiver receiver : answeringPC.getReceivers()) {
-      receiver.SetObserver(answeringExpectations);
-    }
-
-    // Wait for at least some frames to be delivered at each end (number
-    // chosen arbitrarily).
-    offeringExpectations.expectFramesDelivered(10);
-    answeringExpectations.expectFramesDelivered(10);
-
-    offeringExpectations.expectStateChange(DataChannel.State.OPEN);
-    // See commentary about SCTP DataChannels above for why this is here.
-    answeringExpectations.expectDataChannel("offeringDC");
-    answeringExpectations.expectStateChange(DataChannel.State.OPEN);
-
-    // Wait for at least one ice candidate from the offering PC and forward them to the answering
-    // PC.
-    for (IceCandidate candidate : offeringExpectations.getAtLeastOneIceCandidate()) {
-      answeringPC.addIceCandidate(candidate);
-    }
-
-    // Wait for at least one ice candidate from the answering PC and forward them to the offering
-    // PC.
-    for (IceCandidate candidate : answeringExpectations.getAtLeastOneIceCandidate()) {
-      offeringPC.addIceCandidate(candidate);
-    }
-
-    assertTrue(offeringExpectations.waitForAllExpectationsToBeSatisfied(TIMEOUT_SECONDS));
-    assertTrue(answeringExpectations.waitForAllExpectationsToBeSatisfied(TIMEOUT_SECONDS));
-
-    assertEquals(PeerConnection.SignalingState.STABLE, offeringPC.signalingState());
-    assertEquals(PeerConnection.SignalingState.STABLE, answeringPC.signalingState());
-
-    // Test some of the RtpSender API.
-    RtpSender videoSender = null;
-    RtpSender audioSender = null;
-    for (RtpSender sender : offeringPC.getSenders()) {
-      if (sender.track().kind().equals("video")) {
-        videoSender = sender;
-      } else {
-        audioSender = sender;
-      }
-    }
-    assertNotNull(videoSender);
-    assertNotNull(audioSender);
-
-    // Set a bitrate limit for the outgoing video stream for the offerer.
-    RtpParameters rtpParameters = videoSender.getParameters();
-    assertNotNull(rtpParameters);
-    assertEquals(1, rtpParameters.encodings.size());
-    assertNull(rtpParameters.encodings.get(0).maxBitrateBps);
-
-    rtpParameters.encodings.get(0).maxBitrateBps = 300000;
-    assertTrue(videoSender.setParameters(rtpParameters));
-
-    // Create a DTMF sender.
-    DtmfSender dtmfSender = audioSender.dtmf();
-    assertNotNull(dtmfSender);
-    assertTrue(dtmfSender.canInsertDtmf());
-    assertTrue(dtmfSender.insertDtmf("123", 300, 100));
-
-    // Verify that we can read back the updated value.
-    rtpParameters = videoSender.getParameters();
-    assertEquals(300000, (int) rtpParameters.encodings.get(0).maxBitrateBps);
-
-    // Test send & receive UTF-8 text.
-    answeringExpectations.expectMessage(
-        ByteBuffer.wrap("hello!".getBytes(Charset.forName("UTF-8"))), false);
-    DataChannel.Buffer buffer =
-        new DataChannel.Buffer(ByteBuffer.wrap("hello!".getBytes(Charset.forName("UTF-8"))), false);
-    assertTrue(offeringExpectations.dataChannel.send(buffer));
-    assertTrue(answeringExpectations.waitForAllExpectationsToBeSatisfied(TIMEOUT_SECONDS));
-
-    // Construct this binary message two different ways to ensure no
-    // shortcuts are taken.
-    ByteBuffer expectedBinaryMessage = ByteBuffer.allocateDirect(5);
-    for (byte i = 1; i < 6; ++i) {
-      expectedBinaryMessage.put(i);
-    }
-    expectedBinaryMessage.flip();
-    offeringExpectations.expectMessage(expectedBinaryMessage, true);
-    assertTrue(answeringExpectations.dataChannel.send(
-        new DataChannel.Buffer(ByteBuffer.wrap(new byte[] {1, 2, 3, 4, 5}), true)));
-    assertTrue(offeringExpectations.waitForAllExpectationsToBeSatisfied(TIMEOUT_SECONDS));
-
-    offeringExpectations.expectStateChange(DataChannel.State.CLOSING);
-    answeringExpectations.expectStateChange(DataChannel.State.CLOSING);
-    offeringExpectations.expectStateChange(DataChannel.State.CLOSED);
-    answeringExpectations.expectStateChange(DataChannel.State.CLOSED);
-    answeringExpectations.dataChannel.close();
-    offeringExpectations.dataChannel.close();
-
-    // Test SetBitrate.
-    assertTrue(offeringPC.setBitrate(100000, 5000000, 500000000));
-    assertFalse(offeringPC.setBitrate(3, 2, 1));
-
-    // Free the Java-land objects and collect them.
-    shutdownPC(offeringPC, offeringExpectations);
-    offeringPC = null;
-    shutdownPC(answeringPC, answeringExpectations);
-    answeringPC = null;
-    getMetrics();
-    videoCapturer.stopCapture();
-    videoCapturer.dispose();
-    videoSource.dispose();
-    factory.dispose();
-    System.gc();
-  }
-
-  @Test
-  @MediumTest
-  public void testDataChannelOnlySession() throws Exception {
-    // Allow loopback interfaces too since our Android devices often don't
-    // have those.
-    PeerConnectionFactory.Options options = new PeerConnectionFactory.Options();
-    options.networkIgnoreMask = 0;
-    PeerConnectionFactory factory = new PeerConnectionFactory(options);
-
-    MediaConstraints pcConstraints = new MediaConstraints();
-    pcConstraints.mandatory.add(new MediaConstraints.KeyValuePair("DtlsSrtpKeyAgreement", "true"));
-
-    LinkedList<PeerConnection.IceServer> iceServers = new LinkedList<PeerConnection.IceServer>();
-    iceServers.add(new PeerConnection.IceServer("stun:stun.l.google.com:19302"));
-    iceServers.add(
-        new PeerConnection.IceServer("turn:fake.example.com", "fakeUsername", "fakePassword"));
-    ObserverExpectations offeringExpectations = new ObserverExpectations("PCTest:offerer");
-    PeerConnection offeringPC =
-        factory.createPeerConnection(iceServers, pcConstraints, offeringExpectations);
-    assertNotNull(offeringPC);
-
-    ObserverExpectations answeringExpectations = new ObserverExpectations("PCTest:answerer");
-    PeerConnection answeringPC =
-        factory.createPeerConnection(iceServers, pcConstraints, answeringExpectations);
-    assertNotNull(answeringPC);
-
-    offeringExpectations.expectRenegotiationNeeded();
-    DataChannel offeringDC = offeringPC.createDataChannel("offeringDC", new DataChannel.Init());
-    assertEquals("offeringDC", offeringDC.label());
-
-    offeringExpectations.setDataChannel(offeringDC);
-    SdpObserverLatch sdpLatch = new SdpObserverLatch();
-    offeringPC.createOffer(sdpLatch, new MediaConstraints());
-    assertTrue(sdpLatch.await());
-    SessionDescription offerSdp = sdpLatch.getSdp();
-    assertEquals(offerSdp.type, SessionDescription.Type.OFFER);
-    assertFalse(offerSdp.description.isEmpty());
-
-    sdpLatch = new SdpObserverLatch();
-    answeringExpectations.expectSignalingChange(SignalingState.HAVE_REMOTE_OFFER);
-    // SCTP DataChannels are announced via OPEN messages over the established
-    // connection (not via SDP), so answeringExpectations can only register
-    // expecting the channel during ICE, below.
-    answeringPC.setRemoteDescription(sdpLatch, offerSdp);
-    assertEquals(PeerConnection.SignalingState.STABLE, offeringPC.signalingState());
-    assertTrue(sdpLatch.await());
-    assertNull(sdpLatch.getSdp());
-
-    sdpLatch = new SdpObserverLatch();
-    answeringPC.createAnswer(sdpLatch, new MediaConstraints());
-    assertTrue(sdpLatch.await());
-    SessionDescription answerSdp = sdpLatch.getSdp();
-    assertEquals(answerSdp.type, SessionDescription.Type.ANSWER);
-    assertFalse(answerSdp.description.isEmpty());
-
-    offeringExpectations.expectIceCandidates(2);
-    answeringExpectations.expectIceCandidates(2);
-
-    offeringExpectations.expectIceGatheringChange(IceGatheringState.COMPLETE);
-    answeringExpectations.expectIceGatheringChange(IceGatheringState.COMPLETE);
-
-    sdpLatch = new SdpObserverLatch();
-    answeringExpectations.expectSignalingChange(SignalingState.STABLE);
-    answeringPC.setLocalDescription(sdpLatch, answerSdp);
-    assertTrue(sdpLatch.await());
-    assertNull(sdpLatch.getSdp());
-
-    sdpLatch = new SdpObserverLatch();
-    offeringExpectations.expectSignalingChange(SignalingState.HAVE_LOCAL_OFFER);
-    offeringPC.setLocalDescription(sdpLatch, offerSdp);
-    assertTrue(sdpLatch.await());
-    assertNull(sdpLatch.getSdp());
-    sdpLatch = new SdpObserverLatch();
-    offeringExpectations.expectSignalingChange(SignalingState.STABLE);
-
-    offeringExpectations.expectIceConnectionChange(IceConnectionState.CHECKING);
-    offeringExpectations.expectIceConnectionChange(IceConnectionState.CONNECTED);
-    // TODO(bemasc): uncomment once delivery of ICECompleted is reliable
-    // (https://code.google.com/p/webrtc/issues/detail?id=3021).
-    answeringExpectations.expectIceConnectionChange(IceConnectionState.CHECKING);
-    answeringExpectations.expectIceConnectionChange(IceConnectionState.CONNECTED);
-
-    offeringPC.setRemoteDescription(sdpLatch, answerSdp);
-    assertTrue(sdpLatch.await());
-    assertNull(sdpLatch.getSdp());
-
-    assertEquals(offeringPC.getLocalDescription().type, offerSdp.type);
-    assertEquals(offeringPC.getRemoteDescription().type, answerSdp.type);
-    assertEquals(answeringPC.getLocalDescription().type, answerSdp.type);
-    assertEquals(answeringPC.getRemoteDescription().type, offerSdp.type);
-
-    offeringExpectations.expectStateChange(DataChannel.State.OPEN);
-    // See commentary about SCTP DataChannels above for why this is here.
-    answeringExpectations.expectDataChannel("offeringDC");
-    answeringExpectations.expectStateChange(DataChannel.State.OPEN);
-
-    // Wait for at least one ice candidate from the offering PC and forward them to the answering
-    // PC.
-    for (IceCandidate candidate : offeringExpectations.getAtLeastOneIceCandidate()) {
-      answeringPC.addIceCandidate(candidate);
-    }
-
-    // Wait for at least one ice candidate from the answering PC and forward them to the offering
-    // PC.
-    for (IceCandidate candidate : answeringExpectations.getAtLeastOneIceCandidate()) {
-      offeringPC.addIceCandidate(candidate);
-    }
-
-    assertTrue(offeringExpectations.waitForAllExpectationsToBeSatisfied(TIMEOUT_SECONDS));
-    assertTrue(answeringExpectations.waitForAllExpectationsToBeSatisfied(TIMEOUT_SECONDS));
-
-    assertEquals(PeerConnection.SignalingState.STABLE, offeringPC.signalingState());
-    assertEquals(PeerConnection.SignalingState.STABLE, answeringPC.signalingState());
-
-    // Test send & receive UTF-8 text.
-    answeringExpectations.expectMessage(
-        ByteBuffer.wrap("hello!".getBytes(Charset.forName("UTF-8"))), false);
-    DataChannel.Buffer buffer =
-        new DataChannel.Buffer(ByteBuffer.wrap("hello!".getBytes(Charset.forName("UTF-8"))), false);
-    assertTrue(offeringExpectations.dataChannel.send(buffer));
-    assertTrue(answeringExpectations.waitForAllExpectationsToBeSatisfied(TIMEOUT_SECONDS));
-
-    // Construct this binary message two different ways to ensure no
-    // shortcuts are taken.
-    ByteBuffer expectedBinaryMessage = ByteBuffer.allocateDirect(5);
-    for (byte i = 1; i < 6; ++i) {
-      expectedBinaryMessage.put(i);
-    }
-    expectedBinaryMessage.flip();
-    offeringExpectations.expectMessage(expectedBinaryMessage, true);
-    assertTrue(answeringExpectations.dataChannel.send(
-        new DataChannel.Buffer(ByteBuffer.wrap(new byte[] {1, 2, 3, 4, 5}), true)));
-    assertTrue(offeringExpectations.waitForAllExpectationsToBeSatisfied(TIMEOUT_SECONDS));
-
-    offeringExpectations.expectStateChange(DataChannel.State.CLOSING);
-    answeringExpectations.expectStateChange(DataChannel.State.CLOSING);
-    offeringExpectations.expectStateChange(DataChannel.State.CLOSED);
-    answeringExpectations.expectStateChange(DataChannel.State.CLOSED);
-    answeringExpectations.dataChannel.close();
-    offeringExpectations.dataChannel.close();
-
-    // Free the Java-land objects and collect them.
-    shutdownPC(offeringPC, offeringExpectations);
-    offeringPC = null;
-    shutdownPC(answeringPC, answeringExpectations);
-    answeringPC = null;
-    factory.dispose();
-    System.gc();
-  }
-
-  // Flaky on Android. See webrtc:7761
-  @DisabledTest
-  @Test
-  @MediumTest
-  public void testTrackRemovalAndAddition() throws Exception {
-    // Allow loopback interfaces too since our Android devices often don't
-    // have those.
-    PeerConnectionFactory.Options options = new PeerConnectionFactory.Options();
-    options.networkIgnoreMask = 0;
-    PeerConnectionFactory factory = new PeerConnectionFactory(options);
-
-    MediaConstraints pcConstraints = new MediaConstraints();
-    pcConstraints.mandatory.add(new MediaConstraints.KeyValuePair("DtlsSrtpKeyAgreement", "true"));
-
-    LinkedList<PeerConnection.IceServer> iceServers = new LinkedList<PeerConnection.IceServer>();
-    iceServers.add(new PeerConnection.IceServer("stun:stun.l.google.com:19302"));
-
-    ObserverExpectations offeringExpectations = new ObserverExpectations("PCTest:offerer");
-    PeerConnection offeringPC =
-        factory.createPeerConnection(iceServers, pcConstraints, offeringExpectations);
-    assertNotNull(offeringPC);
-
-    ObserverExpectations answeringExpectations = new ObserverExpectations("PCTest:answerer");
-    PeerConnection answeringPC =
-        factory.createPeerConnection(iceServers, pcConstraints, answeringExpectations);
-    assertNotNull(answeringPC);
-
-    // We want to use the same camera for offerer & answerer, so create it here
-    // instead of in addTracksToPC.
-    final CameraEnumerator enumerator = new Camera1Enumerator(false /* captureToTexture */);
-    final VideoCapturer videoCapturer =
-        enumerator.createCapturer(enumerator.getDeviceNames()[0], null);
-    final VideoSource videoSource = factory.createVideoSource(videoCapturer);
-    videoCapturer.startCapture(640, 480, 30);
-
-    // Add offerer media stream.
-    offeringExpectations.expectRenegotiationNeeded();
-    WeakReference<MediaStream> oLMS =
-        addTracksToPC(factory, offeringPC, videoSource, "offeredMediaStream", "offeredVideoTrack",
-            "offeredAudioTrack", new ExpectedResolutionSetter(answeringExpectations));
-
-    offeringExpectations.expectAddTrack(2);
-    answeringExpectations.expectAddTrack(2);
-    // Create offer.
-    SdpObserverLatch sdpLatch = new SdpObserverLatch();
-    offeringPC.createOffer(sdpLatch, new MediaConstraints());
-    assertTrue(sdpLatch.await());
-    SessionDescription offerSdp = sdpLatch.getSdp();
-    assertEquals(offerSdp.type, SessionDescription.Type.OFFER);
-    assertFalse(offerSdp.description.isEmpty());
-
-    // Set local description for offerer.
-    sdpLatch = new SdpObserverLatch();
-    offeringExpectations.expectSignalingChange(SignalingState.HAVE_LOCAL_OFFER);
-    offeringExpectations.expectIceCandidates(2);
-    offeringExpectations.expectIceGatheringChange(IceGatheringState.COMPLETE);
-    offeringPC.setLocalDescription(sdpLatch, offerSdp);
-    assertTrue(sdpLatch.await());
-    assertNull(sdpLatch.getSdp());
-
-    // Set remote description for answerer.
-    sdpLatch = new SdpObserverLatch();
-    answeringExpectations.expectSignalingChange(SignalingState.HAVE_REMOTE_OFFER);
-    answeringExpectations.expectAddStream("offeredMediaStream");
-    answeringPC.setRemoteDescription(sdpLatch, offerSdp);
-    assertTrue(sdpLatch.await());
-    assertNull(sdpLatch.getSdp());
-
-    // Add answerer media stream.
-    answeringExpectations.expectRenegotiationNeeded();
-    WeakReference<MediaStream> aLMS = addTracksToPC(factory, answeringPC, videoSource,
-        "answeredMediaStream", "answeredVideoTrack", "answeredAudioTrack",
-        new ExpectedResolutionSetter(offeringExpectations));
-
-    // Create answer.
-    sdpLatch = new SdpObserverLatch();
-    answeringPC.createAnswer(sdpLatch, new MediaConstraints());
-    assertTrue(sdpLatch.await());
-    SessionDescription answerSdp = sdpLatch.getSdp();
-    assertEquals(answerSdp.type, SessionDescription.Type.ANSWER);
-    assertFalse(answerSdp.description.isEmpty());
-
-    // Set local description for answerer.
-    sdpLatch = new SdpObserverLatch();
-    answeringExpectations.expectSignalingChange(SignalingState.STABLE);
-    answeringExpectations.expectIceCandidates(2);
-    answeringExpectations.expectIceGatheringChange(IceGatheringState.COMPLETE);
-    answeringPC.setLocalDescription(sdpLatch, answerSdp);
-    assertTrue(sdpLatch.await());
-    assertNull(sdpLatch.getSdp());
-
-    // Set remote description for offerer.
-    sdpLatch = new SdpObserverLatch();
-    offeringExpectations.expectSignalingChange(SignalingState.STABLE);
-    offeringExpectations.expectAddStream("answeredMediaStream");
-
-    offeringExpectations.expectIceConnectionChange(IceConnectionState.CHECKING);
-    offeringExpectations.expectIceConnectionChange(IceConnectionState.CONNECTED);
-    // TODO(bemasc): uncomment once delivery of ICECompleted is reliable
-    // (https://code.google.com/p/webrtc/issues/detail?id=3021).
-    //
-    // offeringExpectations.expectIceConnectionChange(
-    //     IceConnectionState.COMPLETED);
-    answeringExpectations.expectIceConnectionChange(IceConnectionState.CHECKING);
-    answeringExpectations.expectIceConnectionChange(IceConnectionState.CONNECTED);
-
-    offeringPC.setRemoteDescription(sdpLatch, answerSdp);
-    assertTrue(sdpLatch.await());
-    assertNull(sdpLatch.getSdp());
-
-    // Wait for at least one ice candidate from the offering PC and forward them to the answering
-    // PC.
-    for (IceCandidate candidate : offeringExpectations.getAtLeastOneIceCandidate()) {
-      answeringPC.addIceCandidate(candidate);
-    }
-
-    // Wait for at least one ice candidate from the answering PC and forward them to the offering
-    // PC.
-    for (IceCandidate candidate : answeringExpectations.getAtLeastOneIceCandidate()) {
-      offeringPC.addIceCandidate(candidate);
-    }
-
-    // Wait for one frame of the correct size to be delivered.
-    // Otherwise we could get a dummy black frame of unexpcted size when the
-    // video track is removed.
-    offeringExpectations.expectFramesDelivered(1);
-    answeringExpectations.expectFramesDelivered(1);
-
-    assertTrue(offeringExpectations.waitForAllExpectationsToBeSatisfied(TIMEOUT_SECONDS));
-    assertTrue(answeringExpectations.waitForAllExpectationsToBeSatisfied(TIMEOUT_SECONDS));
-
-    assertEquals(PeerConnection.SignalingState.STABLE, offeringPC.signalingState());
-    assertEquals(PeerConnection.SignalingState.STABLE, answeringPC.signalingState());
-
-    // Now do another negotiation, removing the video track from one peer.
-    // This previously caused a crash on pc.dispose().
-    // See: https://bugs.chromium.org/p/webrtc/issues/detail?id=5128
-    VideoTrack offererVideoTrack = oLMS.get().videoTracks.get(0);
-    // Note that when we call removeTrack, we regain responsibility for
-    // disposing of the track.
-    oLMS.get().removeTrack(offererVideoTrack);
-    negotiate(offeringPC, offeringExpectations, answeringPC, answeringExpectations);
-
-    // Make sure the track was really removed.
-    // TODO(deadbeef): Currently the expectation is that the video track's
-    // state will be set to "ended". However, in the future, it's likely that
-    // the video track will be completely removed from the remote stream
-    // (as it is on the C++ level).
-    MediaStream aRMS = answeringExpectations.gotRemoteStreams.iterator().next();
-    assertEquals(aRMS.videoTracks.get(0).state(), MediaStreamTrack.State.ENDED);
-
-    // Add the video track to test if the answeringPC will create a new track
-    // for the updated remote description.
-    oLMS.get().addTrack(offererVideoTrack);
-    // The answeringPC sets the updated remote description with a track added.
-    // So the onAddTrack callback is expected to be called once.
-    answeringExpectations.expectAddTrack(1);
-    offeringExpectations.expectAddTrack(0);
-    negotiate(offeringPC, offeringExpectations, answeringPC, answeringExpectations);
-
-    // Finally, remove both the audio and video tracks, which should completely
-    // remove the remote stream. This used to trigger an assert.
-    // See: https://bugs.chromium.org/p/webrtc/issues/detail?id=5128
-    oLMS.get().removeTrack(offererVideoTrack);
-    AudioTrack offererAudioTrack = oLMS.get().audioTracks.get(0);
-    oLMS.get().removeTrack(offererAudioTrack);
-
-    answeringExpectations.expectRemoveStream("offeredMediaStream");
-    negotiate(offeringPC, offeringExpectations, answeringPC, answeringExpectations);
-
-    // Make sure the stream was really removed.
-    assertTrue(answeringExpectations.gotRemoteStreams.isEmpty());
-
-    // Free the Java-land objects and collect them.
-    shutdownPC(offeringPC, offeringExpectations);
-    offeringPC = null;
-    shutdownPC(answeringPC, answeringExpectations);
-    answeringPC = null;
-    offererVideoTrack.dispose();
-    offererAudioTrack.dispose();
-    videoCapturer.stopCapture();
-    videoCapturer.dispose();
-    videoSource.dispose();
-    factory.dispose();
-    System.gc();
-  }
-
-  private static void negotiate(PeerConnection offeringPC,
-      ObserverExpectations offeringExpectations, PeerConnection answeringPC,
-      ObserverExpectations answeringExpectations) {
-    // Create offer.
-    SdpObserverLatch sdpLatch = new SdpObserverLatch();
-    offeringPC.createOffer(sdpLatch, new MediaConstraints());
-    assertTrue(sdpLatch.await());
-    SessionDescription offerSdp = sdpLatch.getSdp();
-    assertEquals(offerSdp.type, SessionDescription.Type.OFFER);
-    assertFalse(offerSdp.description.isEmpty());
-
-    // Set local description for offerer.
-    sdpLatch = new SdpObserverLatch();
-    offeringExpectations.expectSignalingChange(SignalingState.HAVE_LOCAL_OFFER);
-    offeringPC.setLocalDescription(sdpLatch, offerSdp);
-    assertTrue(sdpLatch.await());
-    assertNull(sdpLatch.getSdp());
-
-    // Set remote description for answerer.
-    sdpLatch = new SdpObserverLatch();
-    answeringExpectations.expectSignalingChange(SignalingState.HAVE_REMOTE_OFFER);
-    answeringPC.setRemoteDescription(sdpLatch, offerSdp);
-    assertTrue(sdpLatch.await());
-    assertNull(sdpLatch.getSdp());
-
-    // Create answer.
-    sdpLatch = new SdpObserverLatch();
-    answeringPC.createAnswer(sdpLatch, new MediaConstraints());
-    assertTrue(sdpLatch.await());
-    SessionDescription answerSdp = sdpLatch.getSdp();
-    assertEquals(answerSdp.type, SessionDescription.Type.ANSWER);
-    assertFalse(answerSdp.description.isEmpty());
-
-    // Set local description for answerer.
-    sdpLatch = new SdpObserverLatch();
-    answeringExpectations.expectSignalingChange(SignalingState.STABLE);
-    answeringPC.setLocalDescription(sdpLatch, answerSdp);
-    assertTrue(sdpLatch.await());
-    assertNull(sdpLatch.getSdp());
-
-    // Set remote description for offerer.
-    sdpLatch = new SdpObserverLatch();
-    offeringExpectations.expectSignalingChange(SignalingState.STABLE);
-    offeringPC.setRemoteDescription(sdpLatch, answerSdp);
-    assertTrue(sdpLatch.await());
-    assertNull(sdpLatch.getSdp());
-  }
-
-  private static void getMetrics() {
-    Metrics metrics = Metrics.getAndReset();
-    assertTrue(metrics.map.size() > 0);
-    // Test for example that the lifetime of a Call is recorded.
-    String name = "WebRTC.Call.LifetimeInSeconds";
-    assertTrue(metrics.map.containsKey(name));
-    HistogramInfo info = metrics.map.get(name);
-    assertTrue(info.samples.size() > 0);
-  }
-
-  private static void shutdownPC(PeerConnection pc, ObserverExpectations expectations) {
-    if (expectations.dataChannel != null) {
-      expectations.dataChannel.unregisterObserver();
-      expectations.dataChannel.dispose();
-    }
-
-    // Call getStats (old implementation) before shutting down PC.
-    expectations.expectOldStatsCallback();
-    assertTrue(pc.getStats(expectations, null));
-    assertTrue(expectations.waitForAllExpectationsToBeSatisfied(TIMEOUT_SECONDS));
-
-    // Call the new getStats implementation as well.
-    expectations.expectNewStatsCallback();
-    pc.getStats(expectations);
-    assertTrue(expectations.waitForAllExpectationsToBeSatisfied(TIMEOUT_SECONDS));
-
-    expectations.expectIceConnectionChange(IceConnectionState.CLOSED);
-    expectations.expectSignalingChange(SignalingState.CLOSED);
-    pc.close();
-    assertTrue(expectations.waitForAllExpectationsToBeSatisfied(TIMEOUT_SECONDS));
-
-    // Call getStats (old implementation) after calling close(). Should still
-    // work.
-    expectations.expectOldStatsCallback();
-    assertTrue(pc.getStats(expectations, null));
-    assertTrue(expectations.waitForAllExpectationsToBeSatisfied(TIMEOUT_SECONDS));
-
-    System.out.println("FYI stats: ");
-    int reportIndex = -1;
-    for (StatsReport[] reports : expectations.takeStatsReports()) {
-      System.out.println(" Report #" + (++reportIndex));
-      for (int i = 0; i < reports.length; ++i) {
-        System.out.println("  " + reports[i].toString());
-      }
-    }
-    assertEquals(1, reportIndex);
-    System.out.println("End stats.");
-
-    pc.dispose();
-  }
-
-  // Returns a set of thread IDs belonging to this process, as Strings.
-  private static TreeSet<String> allThreads() {
-    TreeSet<String> threads = new TreeSet<String>();
-    // This pokes at /proc instead of using the Java APIs because we're also
-    // looking for libjingle/webrtc native threads, most of which won't have
-    // attached to the JVM.
-    for (String threadId : (new File("/proc/self/task")).list()) {
-      threads.add(threadId);
-    }
-    return threads;
-  }
-}
diff --git a/sdk/android/instrumentationtests/src/org/webrtc/RendererCommonTest.java b/sdk/android/instrumentationtests/src/org/webrtc/RendererCommonTest.java
deleted file mode 100644
index 34d795b..0000000
--- a/sdk/android/instrumentationtests/src/org/webrtc/RendererCommonTest.java
+++ /dev/null
@@ -1,200 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-package org.webrtc;
-
-import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertEquals;
-import static org.webrtc.RendererCommon.ScalingType.*;
-import static org.webrtc.RendererCommon.getDisplaySize;
-import static org.webrtc.RendererCommon.getLayoutMatrix;
-import static org.webrtc.RendererCommon.rotateTextureMatrix;
-
-import android.graphics.Point;
-import android.support.test.filters.SmallTest;
-import org.chromium.base.test.BaseJUnit4ClassRunner;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-@RunWith(BaseJUnit4ClassRunner.class)
-public class RendererCommonTest {
-  @Test
-  @SmallTest
-  public void testDisplaySizeNoFrame() {
-    assertEquals(new Point(0, 0), getDisplaySize(SCALE_ASPECT_FIT, 0.0f, 0, 0));
-    assertEquals(new Point(0, 0), getDisplaySize(SCALE_ASPECT_FILL, 0.0f, 0, 0));
-    assertEquals(new Point(0, 0), getDisplaySize(SCALE_ASPECT_BALANCED, 0.0f, 0, 0));
-  }
-
-  @Test
-  @SmallTest
-  public void testDisplaySizeDegenerateAspectRatio() {
-    assertEquals(new Point(1280, 720), getDisplaySize(SCALE_ASPECT_FIT, 0.0f, 1280, 720));
-    assertEquals(new Point(1280, 720), getDisplaySize(SCALE_ASPECT_FILL, 0.0f, 1280, 720));
-    assertEquals(new Point(1280, 720), getDisplaySize(SCALE_ASPECT_BALANCED, 0.0f, 1280, 720));
-  }
-
-  @Test
-  @SmallTest
-  public void testZeroDisplaySize() {
-    assertEquals(new Point(0, 0), getDisplaySize(SCALE_ASPECT_FIT, 16.0f / 9, 0, 0));
-    assertEquals(new Point(0, 0), getDisplaySize(SCALE_ASPECT_FILL, 16.0f / 9, 0, 0));
-    assertEquals(new Point(0, 0), getDisplaySize(SCALE_ASPECT_BALANCED, 16.0f / 9, 0, 0));
-  }
-
-  @Test
-  @SmallTest
-  public void testDisplaySizePerfectFit() {
-    assertEquals(new Point(1280, 720), getDisplaySize(SCALE_ASPECT_FIT, 16.0f / 9, 1280, 720));
-    assertEquals(new Point(1280, 720), getDisplaySize(SCALE_ASPECT_FILL, 16.0f / 9, 1280, 720));
-    assertEquals(new Point(1280, 720), getDisplaySize(SCALE_ASPECT_BALANCED, 16.0f / 9, 1280, 720));
-    assertEquals(new Point(720, 1280), getDisplaySize(SCALE_ASPECT_FIT, 9.0f / 16, 720, 1280));
-    assertEquals(new Point(720, 1280), getDisplaySize(SCALE_ASPECT_FILL, 9.0f / 16, 720, 1280));
-    assertEquals(new Point(720, 1280), getDisplaySize(SCALE_ASPECT_BALANCED, 9.0f / 16, 720, 1280));
-  }
-
-  @Test
-  @SmallTest
-  public void testLandscapeVideoInPortraitDisplay() {
-    assertEquals(new Point(720, 405), getDisplaySize(SCALE_ASPECT_FIT, 16.0f / 9, 720, 1280));
-    assertEquals(new Point(720, 1280), getDisplaySize(SCALE_ASPECT_FILL, 16.0f / 9, 720, 1280));
-    assertEquals(new Point(720, 720), getDisplaySize(SCALE_ASPECT_BALANCED, 16.0f / 9, 720, 1280));
-  }
-
-  @Test
-  @SmallTest
-  public void testPortraitVideoInLandscapeDisplay() {
-    assertEquals(new Point(405, 720), getDisplaySize(SCALE_ASPECT_FIT, 9.0f / 16, 1280, 720));
-    assertEquals(new Point(1280, 720), getDisplaySize(SCALE_ASPECT_FILL, 9.0f / 16, 1280, 720));
-    assertEquals(new Point(720, 720), getDisplaySize(SCALE_ASPECT_BALANCED, 9.0f / 16, 1280, 720));
-  }
-
-  @Test
-  @SmallTest
-  public void testFourToThreeVideoInSixteenToNineDisplay() {
-    assertEquals(new Point(960, 720), getDisplaySize(SCALE_ASPECT_FIT, 4.0f / 3, 1280, 720));
-    assertEquals(new Point(1280, 720), getDisplaySize(SCALE_ASPECT_FILL, 4.0f / 3, 1280, 720));
-    assertEquals(new Point(1280, 720), getDisplaySize(SCALE_ASPECT_BALANCED, 4.0f / 3, 1280, 720));
-  }
-
-  // Only keep 2 rounded decimals to make float comparison robust.
-  private static double[] round(float[] array) {
-    assertEquals(16, array.length);
-    final double[] doubleArray = new double[16];
-    for (int i = 0; i < 16; ++i) {
-      doubleArray[i] = Math.round(100 * array[i]) / 100.0;
-    }
-    return doubleArray;
-  }
-
-  // Brief summary about matrix transformations:
-  // A coordinate p = [u, v, 0, 1] is transformed by matrix m like this p' = [u', v', 0, 1] = m * p.
-  // OpenGL uses column-major order, so:
-  // u' = u * m[0] + v * m[4] + m[12].
-  // v' = u * m[1] + v * m[5] + m[13].
-
-  @Test
-  @SmallTest
-  public void testLayoutMatrixDefault() {
-    final float layoutMatrix[] = getLayoutMatrix(false, 1.0f, 1.0f);
-    // Assert:
-    // u' = u.
-    // v' = v.
-    // clang-format off
-    assertArrayEquals(new double[] {
-        1, 0, 0, 0,
-        0, 1, 0, 0,
-        0, 0, 1, 0,
-        0, 0, 0, 1}, round(layoutMatrix), 0.0);
-    // clang-format on
-  }
-
-  @Test
-  @SmallTest
-  public void testLayoutMatrixMirror() {
-    final float layoutMatrix[] = getLayoutMatrix(true, 1.0f, 1.0f);
-    // Assert:
-    // u' = 1 - u.
-    // v' = v.
-    // clang-format off
-    assertArrayEquals(new double[] {
-        -1, 0, 0, 0,
-         0, 1, 0, 0,
-         0, 0, 1, 0,
-         1, 0, 0, 1}, round(layoutMatrix), 0.0);
-    // clang-format on
-  }
-
-  @Test
-  @SmallTest
-  public void testLayoutMatrixScale() {
-    // Video has aspect ratio 2, but layout is square. This will cause only the center part of the
-    // video to be visible, i.e. the u coordinate will go from 0.25 to 0.75 instead of from 0 to 1.
-    final float layoutMatrix[] = getLayoutMatrix(false, 2.0f, 1.0f);
-    // Assert:
-    // u' = 0.25 + 0.5 u.
-    // v' = v.
-    // clang-format off
-    assertArrayEquals(new double[] {
-         0.5, 0, 0, 0,
-           0, 1, 0, 0,
-           0, 0, 1, 0,
-        0.25, 0, 0, 1}, round(layoutMatrix), 0.0);
-    // clang-format on
-  }
-
-  @Test
-  @SmallTest
-  public void testRotateTextureMatrixDefault() {
-    // Test that rotation with 0 degrees returns an identical matrix.
-    // clang-format off
-    final float[] matrix = new float[] {
-        1, 2, 3, 4,
-        5, 6, 7, 8,
-        9, 0, 1, 2,
-        3, 4, 5, 6
-    };
-    // clang-format on
-    final float rotatedMatrix[] = rotateTextureMatrix(matrix, 0);
-    assertArrayEquals(round(matrix), round(rotatedMatrix), 0.0);
-  }
-
-  @Test
-  @SmallTest
-  public void testRotateTextureMatrix90Deg() {
-    final float samplingMatrix[] = rotateTextureMatrix(RendererCommon.identityMatrix(), 90);
-    // Assert:
-    // u' = 1 - v.
-    // v' = u.
-    // clang-format off
-    assertArrayEquals(new double[] {
-         0, 1, 0, 0,
-        -1, 0, 0, 0,
-         0, 0, 1, 0,
-         1, 0, 0, 1}, round(samplingMatrix), 0.0);
-    // clang-format on
-  }
-
-  @Test
-  @SmallTest
-  public void testRotateTextureMatrix180Deg() {
-    final float samplingMatrix[] = rotateTextureMatrix(RendererCommon.identityMatrix(), 180);
-    // Assert:
-    // u' = 1 - u.
-    // v' = 1 - v.
-    // clang-format off
-    assertArrayEquals(new double[] {
-        -1,  0, 0, 0,
-         0, -1, 0, 0,
-         0,  0, 1, 0,
-         1,  1, 0, 1}, round(samplingMatrix), 0.0);
-    // clang-format on
-  }
-}
diff --git a/sdk/android/instrumentationtests/src/org/webrtc/SurfaceTextureHelperTest.java b/sdk/android/instrumentationtests/src/org/webrtc/SurfaceTextureHelperTest.java
deleted file mode 100644
index 1f638da..0000000
--- a/sdk/android/instrumentationtests/src/org/webrtc/SurfaceTextureHelperTest.java
+++ /dev/null
@@ -1,506 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-package org.webrtc;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.fail;
-
-import android.graphics.SurfaceTexture;
-import android.opengl.GLES20;
-import android.os.SystemClock;
-import android.support.test.filters.MediumTest;
-import android.support.test.filters.SmallTest;
-import java.nio.ByteBuffer;
-import java.util.concurrent.CountDownLatch;
-import org.chromium.base.test.BaseJUnit4ClassRunner;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-@RunWith(BaseJUnit4ClassRunner.class)
-public class SurfaceTextureHelperTest {
-  /**
-   * Mock texture listener with blocking wait functionality.
-   */
-  public static final class MockTextureListener
-      implements SurfaceTextureHelper.OnTextureFrameAvailableListener {
-    public int oesTextureId;
-    public float[] transformMatrix;
-    private boolean hasNewFrame = false;
-    // Thread where frames are expected to be received on.
-    private final Thread expectedThread;
-
-    MockTextureListener() {
-      this.expectedThread = null;
-    }
-
-    MockTextureListener(Thread expectedThread) {
-      this.expectedThread = expectedThread;
-    }
-
-    @Override
-    public synchronized void onTextureFrameAvailable(
-        int oesTextureId, float[] transformMatrix, long timestampNs) {
-      if (expectedThread != null && Thread.currentThread() != expectedThread) {
-        throw new IllegalStateException("onTextureFrameAvailable called on wrong thread.");
-      }
-      this.oesTextureId = oesTextureId;
-      this.transformMatrix = transformMatrix;
-      hasNewFrame = true;
-      notifyAll();
-    }
-
-    /**
-     * Wait indefinitely for a new frame.
-     */
-    public synchronized void waitForNewFrame() throws InterruptedException {
-      while (!hasNewFrame) {
-        wait();
-      }
-      hasNewFrame = false;
-    }
-
-    /**
-     * Wait for a new frame, or until the specified timeout elapses. Returns true if a new frame was
-     * received before the timeout.
-     */
-    public synchronized boolean waitForNewFrame(final long timeoutMs) throws InterruptedException {
-      final long startTimeMs = SystemClock.elapsedRealtime();
-      long timeRemainingMs = timeoutMs;
-      while (!hasNewFrame && timeRemainingMs > 0) {
-        wait(timeRemainingMs);
-        final long elapsedTimeMs = SystemClock.elapsedRealtime() - startTimeMs;
-        timeRemainingMs = timeoutMs - elapsedTimeMs;
-      }
-      final boolean didReceiveFrame = hasNewFrame;
-      hasNewFrame = false;
-      return didReceiveFrame;
-    }
-  }
-
-  /** Assert that two integers are close, with difference at most
-   * {@code threshold}. */
-  public static void assertClose(int threshold, int expected, int actual) {
-    if (Math.abs(expected - actual) <= threshold)
-      return;
-    fail("Not close enough, threshold " + threshold + ". Expected: " + expected + " Actual: "
-        + actual);
-  }
-
-  /**
-   * Test normal use by receiving three uniform texture frames. Texture frames are returned as early
-   * as possible. The texture pixel values are inspected by drawing the texture frame to a pixel
-   * buffer and reading it back with glReadPixels().
-   */
-  @Test
-  @MediumTest
-  public void testThreeConstantColorFrames() throws InterruptedException {
-    final int width = 16;
-    final int height = 16;
-    // Create EGL base with a pixel buffer as display output.
-    final EglBase eglBase = EglBase.create(null, EglBase.CONFIG_PIXEL_BUFFER);
-    eglBase.createPbufferSurface(width, height);
-    final GlRectDrawer drawer = new GlRectDrawer();
-
-    // Create SurfaceTextureHelper and listener.
-    final SurfaceTextureHelper surfaceTextureHelper = SurfaceTextureHelper.create(
-        "SurfaceTextureHelper test" /* threadName */, eglBase.getEglBaseContext());
-    final MockTextureListener listener = new MockTextureListener();
-    surfaceTextureHelper.startListening(listener);
-    surfaceTextureHelper.getSurfaceTexture().setDefaultBufferSize(width, height);
-
-    // Create resources for stubbing an OES texture producer. |eglOesBase| has the SurfaceTexture in
-    // |surfaceTextureHelper| as the target EGLSurface.
-    final EglBase eglOesBase = EglBase.create(eglBase.getEglBaseContext(), EglBase.CONFIG_PLAIN);
-    eglOesBase.createSurface(surfaceTextureHelper.getSurfaceTexture());
-    assertEquals(eglOesBase.surfaceWidth(), width);
-    assertEquals(eglOesBase.surfaceHeight(), height);
-
-    final int red[] = new int[] {79, 144, 185};
-    final int green[] = new int[] {66, 210, 162};
-    final int blue[] = new int[] {161, 117, 158};
-    // Draw three frames.
-    for (int i = 0; i < 3; ++i) {
-      // Draw a constant color frame onto the SurfaceTexture.
-      eglOesBase.makeCurrent();
-      GLES20.glClearColor(red[i] / 255.0f, green[i] / 255.0f, blue[i] / 255.0f, 1.0f);
-      GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
-      // swapBuffers() will ultimately trigger onTextureFrameAvailable().
-      eglOesBase.swapBuffers();
-
-      // Wait for an OES texture to arrive and draw it onto the pixel buffer.
-      listener.waitForNewFrame();
-      eglBase.makeCurrent();
-      drawer.drawOes(
-          listener.oesTextureId, listener.transformMatrix, width, height, 0, 0, width, height);
-
-      surfaceTextureHelper.returnTextureFrame();
-
-      // Download the pixels in the pixel buffer as RGBA. Not all platforms support RGB, e.g.
-      // Nexus 9.
-      final ByteBuffer rgbaData = ByteBuffer.allocateDirect(width * height * 4);
-      GLES20.glReadPixels(0, 0, width, height, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, rgbaData);
-      GlUtil.checkNoGLES2Error("glReadPixels");
-
-      // Assert rendered image is expected constant color.
-      while (rgbaData.hasRemaining()) {
-        assertEquals(rgbaData.get() & 0xFF, red[i]);
-        assertEquals(rgbaData.get() & 0xFF, green[i]);
-        assertEquals(rgbaData.get() & 0xFF, blue[i]);
-        assertEquals(rgbaData.get() & 0xFF, 255);
-      }
-    }
-
-    drawer.release();
-    surfaceTextureHelper.dispose();
-    eglBase.release();
-  }
-
-  /**
-   * Test disposing the SurfaceTextureHelper while holding a pending texture frame. The pending
-   * texture frame should still be valid, and this is tested by drawing the texture frame to a pixel
-   * buffer and reading it back with glReadPixels().
-   */
-  @Test
-  @MediumTest
-  public void testLateReturnFrame() throws InterruptedException {
-    final int width = 16;
-    final int height = 16;
-    // Create EGL base with a pixel buffer as display output.
-    final EglBase eglBase = EglBase.create(null, EglBase.CONFIG_PIXEL_BUFFER);
-    eglBase.createPbufferSurface(width, height);
-
-    // Create SurfaceTextureHelper and listener.
-    final SurfaceTextureHelper surfaceTextureHelper = SurfaceTextureHelper.create(
-        "SurfaceTextureHelper test" /* threadName */, eglBase.getEglBaseContext());
-    final MockTextureListener listener = new MockTextureListener();
-    surfaceTextureHelper.startListening(listener);
-    surfaceTextureHelper.getSurfaceTexture().setDefaultBufferSize(width, height);
-
-    // Create resources for stubbing an OES texture producer. |eglOesBase| has the SurfaceTexture in
-    // |surfaceTextureHelper| as the target EGLSurface.
-    final EglBase eglOesBase = EglBase.create(eglBase.getEglBaseContext(), EglBase.CONFIG_PLAIN);
-    eglOesBase.createSurface(surfaceTextureHelper.getSurfaceTexture());
-    assertEquals(eglOesBase.surfaceWidth(), width);
-    assertEquals(eglOesBase.surfaceHeight(), height);
-
-    final int red = 79;
-    final int green = 66;
-    final int blue = 161;
-    // Draw a constant color frame onto the SurfaceTexture.
-    eglOesBase.makeCurrent();
-    GLES20.glClearColor(red / 255.0f, green / 255.0f, blue / 255.0f, 1.0f);
-    GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
-    // swapBuffers() will ultimately trigger onTextureFrameAvailable().
-    eglOesBase.swapBuffers();
-    eglOesBase.release();
-
-    // Wait for OES texture frame.
-    listener.waitForNewFrame();
-    // Diconnect while holding the frame.
-    surfaceTextureHelper.dispose();
-
-    // Draw the pending texture frame onto the pixel buffer.
-    eglBase.makeCurrent();
-    final GlRectDrawer drawer = new GlRectDrawer();
-    drawer.drawOes(
-        listener.oesTextureId, listener.transformMatrix, width, height, 0, 0, width, height);
-    drawer.release();
-
-    // Download the pixels in the pixel buffer as RGBA. Not all platforms support RGB, e.g. Nexus 9.
-    final ByteBuffer rgbaData = ByteBuffer.allocateDirect(width * height * 4);
-    GLES20.glReadPixels(0, 0, width, height, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, rgbaData);
-    GlUtil.checkNoGLES2Error("glReadPixels");
-    eglBase.release();
-
-    // Assert rendered image is expected constant color.
-    while (rgbaData.hasRemaining()) {
-      assertEquals(rgbaData.get() & 0xFF, red);
-      assertEquals(rgbaData.get() & 0xFF, green);
-      assertEquals(rgbaData.get() & 0xFF, blue);
-      assertEquals(rgbaData.get() & 0xFF, 255);
-    }
-    // Late frame return after everything has been disposed and released.
-    surfaceTextureHelper.returnTextureFrame();
-  }
-
-  /**
-   * Test disposing the SurfaceTextureHelper, but keep trying to produce more texture frames. No
-   * frames should be delivered to the listener.
-   */
-  @Test
-  @MediumTest
-  public void testDispose() throws InterruptedException {
-    // Create SurfaceTextureHelper and listener.
-    final SurfaceTextureHelper surfaceTextureHelper =
-        SurfaceTextureHelper.create("SurfaceTextureHelper test" /* threadName */, null);
-    final MockTextureListener listener = new MockTextureListener();
-    surfaceTextureHelper.startListening(listener);
-    // Create EglBase with the SurfaceTexture as target EGLSurface.
-    final EglBase eglBase = EglBase.create(null, EglBase.CONFIG_PLAIN);
-    eglBase.createSurface(surfaceTextureHelper.getSurfaceTexture());
-    eglBase.makeCurrent();
-    // Assert no frame has been received yet.
-    assertFalse(listener.waitForNewFrame(1));
-    // Draw and wait for one frame.
-    GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
-    // swapBuffers() will ultimately trigger onTextureFrameAvailable().
-    eglBase.swapBuffers();
-    listener.waitForNewFrame();
-    surfaceTextureHelper.returnTextureFrame();
-
-    // Dispose - we should not receive any textures after this.
-    surfaceTextureHelper.dispose();
-
-    // Draw one frame.
-    GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
-    eglBase.swapBuffers();
-    // swapBuffers() should not trigger onTextureFrameAvailable() because disposed has been called.
-    // Assert that no OES texture was delivered.
-    assertFalse(listener.waitForNewFrame(500));
-
-    eglBase.release();
-  }
-
-  /**
-   * Test disposing the SurfaceTextureHelper immediately after is has been setup to use a
-   * shared context. No frames should be delivered to the listener.
-   */
-  @Test
-  @SmallTest
-  public void testDisposeImmediately() {
-    final SurfaceTextureHelper surfaceTextureHelper =
-        SurfaceTextureHelper.create("SurfaceTextureHelper test" /* threadName */, null);
-    surfaceTextureHelper.dispose();
-  }
-
-  /**
-   * Call stopListening(), but keep trying to produce more texture frames. No frames should be
-   * delivered to the listener.
-   */
-  @Test
-  @MediumTest
-  public void testStopListening() throws InterruptedException {
-    // Create SurfaceTextureHelper and listener.
-    final SurfaceTextureHelper surfaceTextureHelper =
-        SurfaceTextureHelper.create("SurfaceTextureHelper test" /* threadName */, null);
-    final MockTextureListener listener = new MockTextureListener();
-    surfaceTextureHelper.startListening(listener);
-    // Create EglBase with the SurfaceTexture as target EGLSurface.
-    final EglBase eglBase = EglBase.create(null, EglBase.CONFIG_PLAIN);
-    eglBase.createSurface(surfaceTextureHelper.getSurfaceTexture());
-    eglBase.makeCurrent();
-    // Assert no frame has been received yet.
-    assertFalse(listener.waitForNewFrame(1));
-    // Draw and wait for one frame.
-    GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
-    // swapBuffers() will ultimately trigger onTextureFrameAvailable().
-    eglBase.swapBuffers();
-    listener.waitForNewFrame();
-    surfaceTextureHelper.returnTextureFrame();
-
-    // Stop listening - we should not receive any textures after this.
-    surfaceTextureHelper.stopListening();
-
-    // Draw one frame.
-    GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
-    eglBase.swapBuffers();
-    // swapBuffers() should not trigger onTextureFrameAvailable() because disposed has been called.
-    // Assert that no OES texture was delivered.
-    assertFalse(listener.waitForNewFrame(500));
-
-    surfaceTextureHelper.dispose();
-    eglBase.release();
-  }
-
-  /**
-   * Test stopListening() immediately after the SurfaceTextureHelper has been setup.
-   */
-  @Test
-  @SmallTest
-  public void testStopListeningImmediately() throws InterruptedException {
-    final SurfaceTextureHelper surfaceTextureHelper =
-        SurfaceTextureHelper.create("SurfaceTextureHelper test" /* threadName */, null);
-    final MockTextureListener listener = new MockTextureListener();
-    surfaceTextureHelper.startListening(listener);
-    surfaceTextureHelper.stopListening();
-    surfaceTextureHelper.dispose();
-  }
-
-  /**
-   * Test stopListening() immediately after the SurfaceTextureHelper has been setup on the handler
-   * thread.
-   */
-  @Test
-  @SmallTest
-  public void testStopListeningImmediatelyOnHandlerThread() throws InterruptedException {
-    final SurfaceTextureHelper surfaceTextureHelper =
-        SurfaceTextureHelper.create("SurfaceTextureHelper test" /* threadName */, null);
-    final MockTextureListener listener = new MockTextureListener();
-
-    final CountDownLatch stopListeningBarrier = new CountDownLatch(1);
-    final CountDownLatch stopListeningBarrierDone = new CountDownLatch(1);
-    // Start by posting to the handler thread to keep it occupied.
-    surfaceTextureHelper.getHandler().post(new Runnable() {
-      @Override
-      public void run() {
-        ThreadUtils.awaitUninterruptibly(stopListeningBarrier);
-        surfaceTextureHelper.stopListening();
-        stopListeningBarrierDone.countDown();
-      }
-    });
-
-    // startListening() is asynchronous and will post to the occupied handler thread.
-    surfaceTextureHelper.startListening(listener);
-    // Wait for stopListening() to be called on the handler thread.
-    stopListeningBarrier.countDown();
-    stopListeningBarrierDone.await();
-    // Wait until handler thread is idle to try to catch late startListening() call.
-    final CountDownLatch barrier = new CountDownLatch(1);
-    surfaceTextureHelper.getHandler().post(new Runnable() {
-      @Override
-      public void run() {
-        barrier.countDown();
-      }
-    });
-    ThreadUtils.awaitUninterruptibly(barrier);
-    // Previous startListening() call should never have taken place and it should be ok to call it
-    // again.
-    surfaceTextureHelper.startListening(listener);
-
-    surfaceTextureHelper.dispose();
-  }
-
-  /**
-   * Test calling startListening() with a new listener after stopListening() has been called.
-   */
-  @Test
-  @MediumTest
-  public void testRestartListeningWithNewListener() throws InterruptedException {
-    // Create SurfaceTextureHelper and listener.
-    final SurfaceTextureHelper surfaceTextureHelper =
-        SurfaceTextureHelper.create("SurfaceTextureHelper test" /* threadName */, null);
-    final MockTextureListener listener1 = new MockTextureListener();
-    surfaceTextureHelper.startListening(listener1);
-    // Create EglBase with the SurfaceTexture as target EGLSurface.
-    final EglBase eglBase = EglBase.create(null, EglBase.CONFIG_PLAIN);
-    eglBase.createSurface(surfaceTextureHelper.getSurfaceTexture());
-    eglBase.makeCurrent();
-    // Assert no frame has been received yet.
-    assertFalse(listener1.waitForNewFrame(1));
-    // Draw and wait for one frame.
-    GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
-    // swapBuffers() will ultimately trigger onTextureFrameAvailable().
-    eglBase.swapBuffers();
-    listener1.waitForNewFrame();
-    surfaceTextureHelper.returnTextureFrame();
-
-    // Stop listening - |listener1| should not receive any textures after this.
-    surfaceTextureHelper.stopListening();
-
-    // Connect different listener.
-    final MockTextureListener listener2 = new MockTextureListener();
-    surfaceTextureHelper.startListening(listener2);
-    // Assert no frame has been received yet.
-    assertFalse(listener2.waitForNewFrame(1));
-
-    // Draw one frame.
-    GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
-    eglBase.swapBuffers();
-
-    // Check that |listener2| received the frame, and not |listener1|.
-    listener2.waitForNewFrame();
-    assertFalse(listener1.waitForNewFrame(1));
-
-    surfaceTextureHelper.returnTextureFrame();
-
-    surfaceTextureHelper.dispose();
-    eglBase.release();
-  }
-
-  @Test
-  @MediumTest
-  public void testTexturetoYUV() throws InterruptedException {
-    final int width = 16;
-    final int height = 16;
-
-    final EglBase eglBase = EglBase.create(null, EglBase.CONFIG_PLAIN);
-
-    // Create SurfaceTextureHelper and listener.
-    final SurfaceTextureHelper surfaceTextureHelper = SurfaceTextureHelper.create(
-        "SurfaceTextureHelper test" /* threadName */, eglBase.getEglBaseContext());
-    final MockTextureListener listener = new MockTextureListener();
-    surfaceTextureHelper.startListening(listener);
-    surfaceTextureHelper.getSurfaceTexture().setDefaultBufferSize(width, height);
-
-    // Create resources for stubbing an OES texture producer. |eglBase| has the SurfaceTexture in
-    // |surfaceTextureHelper| as the target EGLSurface.
-
-    eglBase.createSurface(surfaceTextureHelper.getSurfaceTexture());
-    assertEquals(eglBase.surfaceWidth(), width);
-    assertEquals(eglBase.surfaceHeight(), height);
-
-    final int red[] = new int[] {79, 144, 185};
-    final int green[] = new int[] {66, 210, 162};
-    final int blue[] = new int[] {161, 117, 158};
-
-    final int ref_y[] = new int[] {81, 180, 168};
-    final int ref_u[] = new int[] {173, 93, 122};
-    final int ref_v[] = new int[] {127, 103, 140};
-
-    // Draw three frames.
-    for (int i = 0; i < 3; ++i) {
-      // Draw a constant color frame onto the SurfaceTexture.
-      eglBase.makeCurrent();
-      GLES20.glClearColor(red[i] / 255.0f, green[i] / 255.0f, blue[i] / 255.0f, 1.0f);
-      GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
-      // swapBuffers() will ultimately trigger onTextureFrameAvailable().
-      eglBase.swapBuffers();
-
-      // Wait for an OES texture to arrive.
-      listener.waitForNewFrame();
-
-      // Memory layout: Lines are 16 bytes. First 16 lines are
-      // the Y data. These are followed by 8 lines with 8 bytes of U
-      // data on the left and 8 bytes of V data on the right.
-      //
-      // Offset
-      //      0 YYYYYYYY YYYYYYYY
-      //     16 YYYYYYYY YYYYYYYY
-      //    ...
-      //    240 YYYYYYYY YYYYYYYY
-      //    256 UUUUUUUU VVVVVVVV
-      //    272 UUUUUUUU VVVVVVVV
-      //    ...
-      //    368 UUUUUUUU VVVVVVVV
-      //    384 buffer end
-      ByteBuffer buffer = ByteBuffer.allocateDirect(width * height * 3 / 2);
-      surfaceTextureHelper.textureToYUV(
-          buffer, width, height, width, listener.oesTextureId, listener.transformMatrix);
-
-      surfaceTextureHelper.returnTextureFrame();
-
-      // Allow off-by-one differences due to different rounding.
-      while (buffer.position() < width * height) {
-        assertClose(1, buffer.get() & 0xff, ref_y[i]);
-      }
-      while (buffer.hasRemaining()) {
-        if (buffer.position() % width < width / 2)
-          assertClose(1, buffer.get() & 0xff, ref_u[i]);
-        else
-          assertClose(1, buffer.get() & 0xff, ref_v[i]);
-      }
-    }
-
-    surfaceTextureHelper.dispose();
-    eglBase.release();
-  }
-}
diff --git a/sdk/android/instrumentationtests/src/org/webrtc/SurfaceViewRendererOnMeasureTest.java b/sdk/android/instrumentationtests/src/org/webrtc/SurfaceViewRendererOnMeasureTest.java
deleted file mode 100644
index eba555b..0000000
--- a/sdk/android/instrumentationtests/src/org/webrtc/SurfaceViewRendererOnMeasureTest.java
+++ /dev/null
@@ -1,235 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-package org.webrtc;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.fail;
-
-import android.annotation.SuppressLint;
-import android.graphics.Point;
-import android.support.test.InstrumentationRegistry;
-import android.support.test.annotation.UiThreadTest;
-import android.support.test.filters.MediumTest;
-import android.support.test.rule.UiThreadTestRule;
-import android.view.View.MeasureSpec;
-import java.nio.ByteBuffer;
-import java.util.Arrays;
-import java.util.List;
-import org.chromium.base.test.BaseJUnit4ClassRunner;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-@RunWith(BaseJUnit4ClassRunner.class)
-public class SurfaceViewRendererOnMeasureTest {
-  @Rule public UiThreadTestRule uiThreadTestRule = new UiThreadTestRule();
-
-  /**
-   * List with all possible scaling types.
-   */
-  private static final List<RendererCommon.ScalingType> scalingTypes = Arrays.asList(
-      RendererCommon.ScalingType.SCALE_ASPECT_FIT, RendererCommon.ScalingType.SCALE_ASPECT_FILL,
-      RendererCommon.ScalingType.SCALE_ASPECT_BALANCED);
-
-  /**
-   * List with MeasureSpec modes.
-   */
-  private static final List<Integer> measureSpecModes =
-      Arrays.asList(MeasureSpec.EXACTLY, MeasureSpec.AT_MOST);
-
-  /**
-   * Returns a dummy YUV frame.
-   */
-  static VideoRenderer.I420Frame createFrame(int width, int height, int rotationDegree) {
-    final int[] yuvStrides = new int[] {width, (width + 1) / 2, (width + 1) / 2};
-    final int[] yuvHeights = new int[] {height, (height + 1) / 2, (height + 1) / 2};
-    final ByteBuffer[] yuvPlanes = new ByteBuffer[3];
-    for (int i = 0; i < 3; ++i) {
-      yuvPlanes[i] = ByteBuffer.allocateDirect(yuvStrides[i] * yuvHeights[i]);
-    }
-    return new VideoRenderer.I420Frame(width, height, rotationDegree, yuvStrides, yuvPlanes, 0);
-  }
-
-  /**
-   * Assert onMeasure() with given parameters will result in expected measured size.
-   */
-  @SuppressLint("WrongCall")
-  private static void assertMeasuredSize(SurfaceViewRenderer surfaceViewRenderer,
-      RendererCommon.ScalingType scalingType, String frameDimensions, int expectedWidth,
-      int expectedHeight, int widthSpec, int heightSpec) {
-    surfaceViewRenderer.setScalingType(scalingType);
-    surfaceViewRenderer.onMeasure(widthSpec, heightSpec);
-    final int measuredWidth = surfaceViewRenderer.getMeasuredWidth();
-    final int measuredHeight = surfaceViewRenderer.getMeasuredHeight();
-    if (measuredWidth != expectedWidth || measuredHeight != expectedHeight) {
-      fail("onMeasure(" + MeasureSpec.toString(widthSpec) + ", " + MeasureSpec.toString(heightSpec)
-          + ")"
-          + " with scaling type " + scalingType + " and frame: " + frameDimensions
-          + " expected measured size " + expectedWidth + "x" + expectedHeight + ", but was "
-          + measuredWidth + "x" + measuredHeight);
-    }
-  }
-
-  /**
-   * Test how SurfaceViewRenderer.onMeasure() behaves when no frame has been delivered.
-   */
-  @Test
-  @UiThreadTest
-  @MediumTest
-  public void testNoFrame() {
-    final SurfaceViewRenderer surfaceViewRenderer =
-        new SurfaceViewRenderer(InstrumentationRegistry.getContext());
-    final String frameDimensions = "null";
-
-    // Test behaviour before SurfaceViewRenderer.init() is called.
-    for (RendererCommon.ScalingType scalingType : scalingTypes) {
-      for (int measureSpecMode : measureSpecModes) {
-        final int zeroMeasureSize = MeasureSpec.makeMeasureSpec(0, measureSpecMode);
-        assertMeasuredSize(surfaceViewRenderer, scalingType, frameDimensions, 0, 0, zeroMeasureSize,
-            zeroMeasureSize);
-        assertMeasuredSize(surfaceViewRenderer, scalingType, frameDimensions, 1280, 720,
-            MeasureSpec.makeMeasureSpec(1280, measureSpecMode),
-            MeasureSpec.makeMeasureSpec(720, measureSpecMode));
-      }
-    }
-
-    // Test behaviour after SurfaceViewRenderer.init() is called, but still no frame.
-    surfaceViewRenderer.init((EglBase.Context) null, null);
-    for (RendererCommon.ScalingType scalingType : scalingTypes) {
-      for (int measureSpecMode : measureSpecModes) {
-        final int zeroMeasureSize = MeasureSpec.makeMeasureSpec(0, measureSpecMode);
-        assertMeasuredSize(surfaceViewRenderer, scalingType, frameDimensions, 0, 0, zeroMeasureSize,
-            zeroMeasureSize);
-        assertMeasuredSize(surfaceViewRenderer, scalingType, frameDimensions, 1280, 720,
-            MeasureSpec.makeMeasureSpec(1280, measureSpecMode),
-            MeasureSpec.makeMeasureSpec(720, measureSpecMode));
-      }
-    }
-
-    surfaceViewRenderer.release();
-  }
-
-  /**
-   * Test how SurfaceViewRenderer.onMeasure() behaves with a 1280x720 frame.
-   */
-  @Test
-  @UiThreadTest
-  @MediumTest
-  public void testFrame1280x720() throws InterruptedException {
-    final SurfaceViewRenderer surfaceViewRenderer =
-        new SurfaceViewRenderer(InstrumentationRegistry.getContext());
-    /**
-     * Mock renderer events with blocking wait functionality for frame size changes.
-     */
-    class MockRendererEvents implements RendererCommon.RendererEvents {
-      private int frameWidth;
-      private int frameHeight;
-      private int rotation;
-
-      public synchronized void waitForFrameSize(int frameWidth, int frameHeight, int rotation)
-          throws InterruptedException {
-        while (this.frameWidth != frameWidth || this.frameHeight != frameHeight
-            || this.rotation != rotation) {
-          wait();
-        }
-      }
-
-      public void onFirstFrameRendered() {}
-
-      public synchronized void onFrameResolutionChanged(
-          int frameWidth, int frameHeight, int rotation) {
-        this.frameWidth = frameWidth;
-        this.frameHeight = frameHeight;
-        this.rotation = rotation;
-        notifyAll();
-      }
-    }
-    final MockRendererEvents rendererEvents = new MockRendererEvents();
-    surfaceViewRenderer.init((EglBase.Context) null, rendererEvents);
-
-    // Test different rotation degress, but same rotated size.
-    for (int rotationDegree : new int[] {0, 90, 180, 270}) {
-      final int rotatedWidth = 1280;
-      final int rotatedHeight = 720;
-      final int unrotatedWidth = (rotationDegree % 180 == 0 ? rotatedWidth : rotatedHeight);
-      final int unrotatedHeight = (rotationDegree % 180 == 0 ? rotatedHeight : rotatedWidth);
-      final VideoRenderer.I420Frame frame =
-          createFrame(unrotatedWidth, unrotatedHeight, rotationDegree);
-      assertEquals(rotatedWidth, frame.rotatedWidth());
-      assertEquals(rotatedHeight, frame.rotatedHeight());
-      final String frameDimensions =
-          unrotatedWidth + "x" + unrotatedHeight + " with rotation " + rotationDegree;
-      surfaceViewRenderer.renderFrame(frame);
-      rendererEvents.waitForFrameSize(unrotatedWidth, unrotatedHeight, rotationDegree);
-
-      // Test forcing to zero size.
-      for (RendererCommon.ScalingType scalingType : scalingTypes) {
-        for (int measureSpecMode : measureSpecModes) {
-          final int zeroMeasureSize = MeasureSpec.makeMeasureSpec(0, measureSpecMode);
-          assertMeasuredSize(surfaceViewRenderer, scalingType, frameDimensions, 0, 0,
-              zeroMeasureSize, zeroMeasureSize);
-        }
-      }
-
-      // Test perfect fit.
-      for (RendererCommon.ScalingType scalingType : scalingTypes) {
-        for (int measureSpecMode : measureSpecModes) {
-          assertMeasuredSize(surfaceViewRenderer, scalingType, frameDimensions, rotatedWidth,
-              rotatedHeight, MeasureSpec.makeMeasureSpec(rotatedWidth, measureSpecMode),
-              MeasureSpec.makeMeasureSpec(rotatedHeight, measureSpecMode));
-        }
-      }
-
-      // Force spec size with different aspect ratio than frame aspect ratio.
-      for (RendererCommon.ScalingType scalingType : scalingTypes) {
-        assertMeasuredSize(surfaceViewRenderer, scalingType, frameDimensions, 720, 1280,
-            MeasureSpec.makeMeasureSpec(720, MeasureSpec.EXACTLY),
-            MeasureSpec.makeMeasureSpec(1280, MeasureSpec.EXACTLY));
-      }
-
-      final float videoAspectRatio = (float) rotatedWidth / rotatedHeight;
-      {
-        // Relax both width and height constraints.
-        final int widthSpec = MeasureSpec.makeMeasureSpec(720, MeasureSpec.AT_MOST);
-        final int heightSpec = MeasureSpec.makeMeasureSpec(1280, MeasureSpec.AT_MOST);
-        for (RendererCommon.ScalingType scalingType : scalingTypes) {
-          final Point expectedSize =
-              RendererCommon.getDisplaySize(scalingType, videoAspectRatio, 720, 1280);
-          assertMeasuredSize(surfaceViewRenderer, scalingType, frameDimensions, expectedSize.x,
-              expectedSize.y, widthSpec, heightSpec);
-        }
-      }
-      {
-        // Force width to 720, but relax height constraint. This will give the same result as
-        // above, because width is already the limiting factor and will be maxed out.
-        final int widthSpec = MeasureSpec.makeMeasureSpec(720, MeasureSpec.EXACTLY);
-        final int heightSpec = MeasureSpec.makeMeasureSpec(1280, MeasureSpec.AT_MOST);
-        for (RendererCommon.ScalingType scalingType : scalingTypes) {
-          final Point expectedSize =
-              RendererCommon.getDisplaySize(scalingType, videoAspectRatio, 720, 1280);
-          assertMeasuredSize(surfaceViewRenderer, scalingType, frameDimensions, expectedSize.x,
-              expectedSize.y, widthSpec, heightSpec);
-        }
-      }
-      {
-        // Force height, but relax width constraint. This will force a bad layout size.
-        final int widthSpec = MeasureSpec.makeMeasureSpec(720, MeasureSpec.AT_MOST);
-        final int heightSpec = MeasureSpec.makeMeasureSpec(1280, MeasureSpec.EXACTLY);
-        for (RendererCommon.ScalingType scalingType : scalingTypes) {
-          assertMeasuredSize(
-              surfaceViewRenderer, scalingType, frameDimensions, 720, 1280, widthSpec, heightSpec);
-        }
-      }
-    }
-
-    surfaceViewRenderer.release();
-  }
-}
diff --git a/sdk/android/instrumentationtests/src/org/webrtc/VideoFileRendererTest.java b/sdk/android/instrumentationtests/src/org/webrtc/VideoFileRendererTest.java
deleted file mode 100644
index 08b8e22..0000000
--- a/sdk/android/instrumentationtests/src/org/webrtc/VideoFileRendererTest.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- *  Copyright 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.
- */
-
-package org.webrtc;
-
-import static org.junit.Assert.assertEquals;
-
-import android.os.Environment;
-import android.support.test.filters.SmallTest;
-import java.io.File;
-import java.io.IOException;
-import java.io.RandomAccessFile;
-import java.lang.Thread;
-import java.nio.ByteBuffer;
-import java.nio.charset.Charset;
-import java.util.ArrayList;
-import java.util.Random;
-import org.chromium.base.test.BaseJUnit4ClassRunner;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-@RunWith(BaseJUnit4ClassRunner.class)
-public class VideoFileRendererTest {
-  @Test
-  @SmallTest
-  public void testYuvRenderingToFile() throws InterruptedException, IOException {
-    EglBase eglBase = EglBase.create();
-    final String videoOutPath = Environment.getExternalStorageDirectory().getPath()
-        + "/chromium_tests_root/testvideoout.y4m";
-    int frameWidth = 4;
-    int frameHeight = 4;
-    VideoFileRenderer videoFileRenderer =
-        new VideoFileRenderer(videoOutPath, frameWidth, frameHeight, eglBase.getEglBaseContext());
-
-    String[] frames = {
-        "THIS IS JUST SOME TEXT x", "THE SECOND FRAME qwerty.", "HERE IS THE THRID FRAME!"};
-
-    for (String frameStr : frames) {
-      int[] planeSizes = {
-          frameWidth * frameWidth, frameWidth * frameHeight / 4, frameWidth * frameHeight / 4};
-
-      byte[] frameBytes = frameStr.getBytes(Charset.forName("US-ASCII"));
-      ByteBuffer[] yuvPlanes = new ByteBuffer[3];
-      int pos = 0;
-      for (int i = 0; i < 3; i++) {
-        yuvPlanes[i] = ByteBuffer.allocateDirect(planeSizes[i]);
-        yuvPlanes[i].put(frameBytes, pos, planeSizes[i]);
-        pos += planeSizes[i];
-      }
-
-      int[] yuvStrides = {frameWidth, frameWidth / 2, frameWidth / 2};
-
-      VideoRenderer.I420Frame frame =
-          new VideoRenderer.I420Frame(frameWidth, frameHeight, 0, yuvStrides, yuvPlanes, 0);
-
-      videoFileRenderer.renderFrame(frame);
-    }
-    videoFileRenderer.release();
-
-    RandomAccessFile writtenFile = new RandomAccessFile(videoOutPath, "r");
-    try {
-      int length = (int) writtenFile.length();
-      byte[] data = new byte[length];
-      writtenFile.readFully(data);
-      String fileContent = new String(data, Charset.forName("US-ASCII"));
-      String expected = "YUV4MPEG2 C420 W4 H4 Ip F30:1 A1:1\n"
-          + "FRAME\n"
-          + "THIS IS JUST SOME TEXT xFRAME\n"
-          + "THE SECOND FRAME qwerty.FRAME\n"
-          + "HERE IS THE THRID FRAME!";
-      assertEquals(expected, fileContent);
-    } finally {
-      writtenFile.close();
-    }
-
-    new File(videoOutPath).delete();
-  }
-}
diff --git a/sdk/android/instrumentationtests/src/org/webrtc/WebRtcJniBootTest.java b/sdk/android/instrumentationtests/src/org/webrtc/WebRtcJniBootTest.java
deleted file mode 100644
index 6faf723..0000000
--- a/sdk/android/instrumentationtests/src/org/webrtc/WebRtcJniBootTest.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- *  Copyright 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.
- */
-
-package org.webrtc;
-
-import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.webrtc.PeerConnectionFactory;
-
-// This test is intended to run on ARM and catch LoadLibrary errors when we load the WebRTC
-// JNI. It can't really be setting up calls since ARM emulators are too slow, but instantiating
-// a peer connection isn't timing-sensitive, so we can at least do that.
-@RunWith(AndroidJUnit4.class)
-public class WebRtcJniBootTest {
-  @Test
-  @SmallTest
-  public void testJniLoadsWithoutError() throws InterruptedException {
-    PeerConnectionFactory.initializeAndroidGlobals(InstrumentationRegistry.getTargetContext(),
-        false /* videoCodecHwAcceleration */);
-
-    PeerConnectionFactory.Options options = new PeerConnectionFactory.Options();
-    new PeerConnectionFactory(options);
-  }
-}
diff --git a/sdk/android/instrumentationtests/src/org/webrtc/capturetestvideo.y4m b/sdk/android/instrumentationtests/src/org/webrtc/capturetestvideo.y4m
deleted file mode 100644
index ecc695a..0000000
--- a/sdk/android/instrumentationtests/src/org/webrtc/capturetestvideo.y4m
+++ /dev/null
@@ -1,5 +0,0 @@
-YUV4MPEG2 C420 W4 H4 Ip F30:1 A1:1
-FRAME
-THIS IS JUST SOME TEXT xFRAME
-THE SECOND FRAME qwerty.FRAME
-HERE IS THE THRID FRAME!
diff --git a/sdk/android/src/java/org/webrtc/AndroidVideoTrackSourceObserver.java b/sdk/android/src/java/org/webrtc/AndroidVideoTrackSourceObserver.java
deleted file mode 100644
index 1232047..0000000
--- a/sdk/android/src/java/org/webrtc/AndroidVideoTrackSourceObserver.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- *  Copyright 2017 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.
- */
-
-package org.webrtc;
-
-/** An implementation of CapturerObserver that forwards all calls from Java to the C layer. */
-class AndroidVideoTrackSourceObserver implements VideoCapturer.CapturerObserver {
-  // Pointer to VideoTrackSourceProxy proxying AndroidVideoTrackSource.
-  private final long nativeSource;
-
-  public AndroidVideoTrackSourceObserver(long nativeSource) {
-    this.nativeSource = nativeSource;
-  }
-
-  @Override
-  public void onCapturerStarted(boolean success) {
-    nativeCapturerStarted(nativeSource, success);
-  }
-
-  @Override
-  public void onCapturerStopped() {
-    nativeCapturerStopped(nativeSource);
-  }
-
-  @Override
-  public void onByteBufferFrameCaptured(
-      byte[] data, int width, int height, int rotation, long timeStamp) {
-    nativeOnByteBufferFrameCaptured(
-        nativeSource, data, data.length, width, height, rotation, timeStamp);
-  }
-
-  @Override
-  public void onTextureFrameCaptured(int width, int height, int oesTextureId,
-      float[] transformMatrix, int rotation, long timestamp) {
-    nativeOnTextureFrameCaptured(
-        nativeSource, width, height, oesTextureId, transformMatrix, rotation, timestamp);
-  }
-
-  @Override
-  public void onFrameCaptured(VideoFrame frame) {
-    nativeOnFrameCaptured(nativeSource, frame.getBuffer().getWidth(), frame.getBuffer().getHeight(),
-        frame.getRotation(), frame.getTimestampNs(), frame.getBuffer());
-  }
-
-  private native void nativeCapturerStarted(long nativeSource, boolean success);
-  private native void nativeCapturerStopped(long nativeSource);
-  private native void nativeOnByteBufferFrameCaptured(long nativeSource, byte[] data, int length,
-      int width, int height, int rotation, long timeStamp);
-  private native void nativeOnTextureFrameCaptured(long nativeSource, int width, int height,
-      int oesTextureId, float[] transformMatrix, int rotation, long timestamp);
-  private native void nativeOnFrameCaptured(long nativeSource, int width, int height, int rotation,
-      long timestampNs, VideoFrame.Buffer frame);
-}
diff --git a/sdk/android/src/java/org/webrtc/BaseBitrateAdjuster.java b/sdk/android/src/java/org/webrtc/BaseBitrateAdjuster.java
deleted file mode 100644
index ca9ebb5..0000000
--- a/sdk/android/src/java/org/webrtc/BaseBitrateAdjuster.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- *  Copyright 2017 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.
- */
-
-package org.webrtc;
-
-/** BitrateAdjuster that tracks bitrate and framerate but does not adjust them. */
-class BaseBitrateAdjuster implements BitrateAdjuster {
-  protected int targetBitrateBps = 0;
-  protected int targetFps = 0;
-
-  @Override
-  public void setTargets(int targetBitrateBps, int targetFps) {
-    this.targetBitrateBps = targetBitrateBps;
-    this.targetFps = targetFps;
-  }
-
-  @Override
-  public void reportEncodedFrame(int size) {
-    // No op.
-  }
-
-  @Override
-  public int getAdjustedBitrateBps() {
-    return targetBitrateBps;
-  }
-
-  @Override
-  public int getAdjustedFramerate() {
-    return targetFps;
-  }
-}
diff --git a/sdk/android/src/java/org/webrtc/BitrateAdjuster.java b/sdk/android/src/java/org/webrtc/BitrateAdjuster.java
deleted file mode 100644
index 044a43a..0000000
--- a/sdk/android/src/java/org/webrtc/BitrateAdjuster.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- *  Copyright 2017 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.
- */
-
-package org.webrtc;
-
-/** Object that adjusts the bitrate of a hardware codec. */
-interface BitrateAdjuster {
-  /**
-   * Sets the target bitrate in bits per second and framerate in frames per second.
-   */
-  void setTargets(int targetBitrateBps, int targetFps);
-
-  /**
-   * Reports that a frame of the given size has been encoded.  Returns true if the bitrate should
-   * be adjusted.
-   */
-  void reportEncodedFrame(int size);
-
-  /** Gets the current bitrate. */
-  int getAdjustedBitrateBps();
-
-  /** Gets the current framerate. */
-  int getAdjustedFramerate();
-}
diff --git a/sdk/android/src/java/org/webrtc/Camera1Session.java b/sdk/android/src/java/org/webrtc/Camera1Session.java
deleted file mode 100644
index 61a51c9..0000000
--- a/sdk/android/src/java/org/webrtc/Camera1Session.java
+++ /dev/null
@@ -1,369 +0,0 @@
-/*
- *  Copyright 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.
- */
-
-package org.webrtc;
-
-import android.content.Context;
-import android.media.MediaRecorder;
-import android.os.Handler;
-import android.os.SystemClock;
-import android.view.Surface;
-import android.view.WindowManager;
-import java.io.IOException;
-import java.nio.ByteBuffer;
-import java.util.List;
-import java.util.concurrent.TimeUnit;
-import org.webrtc.CameraEnumerationAndroid.CaptureFormat;
-
-@SuppressWarnings("deprecation")
-class Camera1Session implements CameraSession {
-  private static final String TAG = "Camera1Session";
-  private static final int NUMBER_OF_CAPTURE_BUFFERS = 3;
-
-  private static final Histogram camera1StartTimeMsHistogram =
-      Histogram.createCounts("WebRTC.Android.Camera1.StartTimeMs", 1, 10000, 50);
-  private static final Histogram camera1StopTimeMsHistogram =
-      Histogram.createCounts("WebRTC.Android.Camera1.StopTimeMs", 1, 10000, 50);
-  private static final Histogram camera1ResolutionHistogram = Histogram.createEnumeration(
-      "WebRTC.Android.Camera1.Resolution", CameraEnumerationAndroid.COMMON_RESOLUTIONS.size());
-
-  private static enum SessionState { RUNNING, STOPPED }
-
-  private final boolean videoFrameEmitTrialEnabled;
-
-  private final Handler cameraThreadHandler;
-  private final Events events;
-  private final boolean captureToTexture;
-  private final Context applicationContext;
-  private final SurfaceTextureHelper surfaceTextureHelper;
-  private final int cameraId;
-  private final android.hardware.Camera camera;
-  private final android.hardware.Camera.CameraInfo info;
-  private final CaptureFormat captureFormat;
-  // Used only for stats. Only used on the camera thread.
-  private final long constructionTimeNs; // Construction time of this class.
-
-  private SessionState state;
-  private boolean firstFrameReported = false;
-
-  public static void create(final CreateSessionCallback callback, final Events events,
-      final boolean captureToTexture, final Context applicationContext,
-      final SurfaceTextureHelper surfaceTextureHelper, final MediaRecorder mediaRecorder,
-      final int cameraId, final int width, final int height, final int framerate) {
-    final long constructionTimeNs = System.nanoTime();
-    Logging.d(TAG, "Open camera " + cameraId);
-    events.onCameraOpening();
-
-    final android.hardware.Camera camera;
-    try {
-      camera = android.hardware.Camera.open(cameraId);
-    } catch (RuntimeException e) {
-      callback.onFailure(FailureType.ERROR, e.getMessage());
-      return;
-    }
-
-    try {
-      camera.setPreviewTexture(surfaceTextureHelper.getSurfaceTexture());
-    } catch (IOException e) {
-      camera.release();
-      callback.onFailure(FailureType.ERROR, e.getMessage());
-      return;
-    }
-
-    final android.hardware.Camera.CameraInfo info = new android.hardware.Camera.CameraInfo();
-    android.hardware.Camera.getCameraInfo(cameraId, info);
-
-    final android.hardware.Camera.Parameters parameters = camera.getParameters();
-    final CaptureFormat captureFormat =
-        findClosestCaptureFormat(parameters, width, height, framerate);
-    final Size pictureSize = findClosestPictureSize(parameters, width, height);
-
-    updateCameraParameters(camera, parameters, captureFormat, pictureSize, captureToTexture);
-
-    if (!captureToTexture) {
-      final int frameSize = captureFormat.frameSize();
-      for (int i = 0; i < NUMBER_OF_CAPTURE_BUFFERS; ++i) {
-        final ByteBuffer buffer = ByteBuffer.allocateDirect(frameSize);
-        camera.addCallbackBuffer(buffer.array());
-      }
-    }
-
-    // Calculate orientation manually and send it as CVO insted.
-    camera.setDisplayOrientation(0 /* degrees */);
-
-    callback.onDone(
-        new Camera1Session(events, captureToTexture, applicationContext, surfaceTextureHelper,
-            mediaRecorder, cameraId, camera, info, captureFormat, constructionTimeNs));
-  }
-
-  private static void updateCameraParameters(android.hardware.Camera camera,
-      android.hardware.Camera.Parameters parameters, CaptureFormat captureFormat, Size pictureSize,
-      boolean captureToTexture) {
-    final List<String> focusModes = parameters.getSupportedFocusModes();
-
-    parameters.setPreviewFpsRange(captureFormat.framerate.min, captureFormat.framerate.max);
-    parameters.setPreviewSize(captureFormat.width, captureFormat.height);
-    parameters.setPictureSize(pictureSize.width, pictureSize.height);
-    if (!captureToTexture) {
-      parameters.setPreviewFormat(captureFormat.imageFormat);
-    }
-
-    if (parameters.isVideoStabilizationSupported()) {
-      parameters.setVideoStabilization(true);
-    }
-    if (focusModes.contains(android.hardware.Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO)) {
-      parameters.setFocusMode(android.hardware.Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO);
-    }
-    camera.setParameters(parameters);
-  }
-
-  private static CaptureFormat findClosestCaptureFormat(
-      android.hardware.Camera.Parameters parameters, int width, int height, int framerate) {
-    // Find closest supported format for |width| x |height| @ |framerate|.
-    final List<CaptureFormat.FramerateRange> supportedFramerates =
-        Camera1Enumerator.convertFramerates(parameters.getSupportedPreviewFpsRange());
-    Logging.d(TAG, "Available fps ranges: " + supportedFramerates);
-
-    final CaptureFormat.FramerateRange fpsRange =
-        CameraEnumerationAndroid.getClosestSupportedFramerateRange(supportedFramerates, framerate);
-
-    final Size previewSize = CameraEnumerationAndroid.getClosestSupportedSize(
-        Camera1Enumerator.convertSizes(parameters.getSupportedPreviewSizes()), width, height);
-    CameraEnumerationAndroid.reportCameraResolution(camera1ResolutionHistogram, previewSize);
-
-    return new CaptureFormat(previewSize.width, previewSize.height, fpsRange);
-  }
-
-  private static Size findClosestPictureSize(
-      android.hardware.Camera.Parameters parameters, int width, int height) {
-    return CameraEnumerationAndroid.getClosestSupportedSize(
-        Camera1Enumerator.convertSizes(parameters.getSupportedPictureSizes()), width, height);
-  }
-
-  private Camera1Session(Events events, boolean captureToTexture, Context applicationContext,
-      SurfaceTextureHelper surfaceTextureHelper, MediaRecorder mediaRecorder, int cameraId,
-      android.hardware.Camera camera, android.hardware.Camera.CameraInfo info,
-      CaptureFormat captureFormat, long constructionTimeNs) {
-    Logging.d(TAG, "Create new camera1 session on camera " + cameraId);
-    videoFrameEmitTrialEnabled =
-        PeerConnectionFactory.fieldTrialsFindFullName(PeerConnectionFactory.VIDEO_FRAME_EMIT_TRIAL)
-            .equals(PeerConnectionFactory.TRIAL_ENABLED);
-
-    this.cameraThreadHandler = new Handler();
-    this.events = events;
-    this.captureToTexture = captureToTexture;
-    this.applicationContext = applicationContext;
-    this.surfaceTextureHelper = surfaceTextureHelper;
-    this.cameraId = cameraId;
-    this.camera = camera;
-    this.info = info;
-    this.captureFormat = captureFormat;
-    this.constructionTimeNs = constructionTimeNs;
-
-    startCapturing();
-
-    if (mediaRecorder != null) {
-      camera.unlock();
-      mediaRecorder.setCamera(camera);
-    }
-  }
-
-  @Override
-  public void stop() {
-    Logging.d(TAG, "Stop camera1 session on camera " + cameraId);
-    checkIsOnCameraThread();
-    if (state != SessionState.STOPPED) {
-      final long stopStartTime = System.nanoTime();
-      stopInternal();
-      final int stopTimeMs = (int) TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - stopStartTime);
-      camera1StopTimeMsHistogram.addSample(stopTimeMs);
-    }
-  }
-
-  private void startCapturing() {
-    Logging.d(TAG, "Start capturing");
-    checkIsOnCameraThread();
-
-    state = SessionState.RUNNING;
-
-    camera.setErrorCallback(new android.hardware.Camera.ErrorCallback() {
-      @Override
-      public void onError(int error, android.hardware.Camera camera) {
-        String errorMessage;
-        if (error == android.hardware.Camera.CAMERA_ERROR_SERVER_DIED) {
-          errorMessage = "Camera server died!";
-        } else {
-          errorMessage = "Camera error: " + error;
-        }
-        Logging.e(TAG, errorMessage);
-        stopInternal();
-        if (error == android.hardware.Camera.CAMERA_ERROR_EVICTED) {
-          events.onCameraDisconnected(Camera1Session.this);
-        } else {
-          events.onCameraError(Camera1Session.this, errorMessage);
-        }
-      }
-    });
-
-    if (captureToTexture) {
-      listenForTextureFrames();
-    } else {
-      listenForBytebufferFrames();
-    }
-    try {
-      camera.startPreview();
-    } catch (RuntimeException e) {
-      stopInternal();
-      events.onCameraError(this, e.getMessage());
-    }
-  }
-
-  private void stopInternal() {
-    Logging.d(TAG, "Stop internal");
-    checkIsOnCameraThread();
-    if (state == SessionState.STOPPED) {
-      Logging.d(TAG, "Camera is already stopped");
-      return;
-    }
-
-    state = SessionState.STOPPED;
-    surfaceTextureHelper.stopListening();
-    // Note: stopPreview or other driver code might deadlock. Deadlock in
-    // android.hardware.Camera._stopPreview(Native Method) has been observed on
-    // Nexus 5 (hammerhead), OS version LMY48I.
-    camera.stopPreview();
-    camera.release();
-    events.onCameraClosed(this);
-    Logging.d(TAG, "Stop done");
-  }
-
-  private void listenForTextureFrames() {
-    surfaceTextureHelper.startListening(new SurfaceTextureHelper.OnTextureFrameAvailableListener() {
-      @Override
-      public void onTextureFrameAvailable(
-          int oesTextureId, float[] transformMatrix, long timestampNs) {
-        checkIsOnCameraThread();
-
-        if (state != SessionState.RUNNING) {
-          Logging.d(TAG, "Texture frame captured but camera is no longer running.");
-          surfaceTextureHelper.returnTextureFrame();
-          return;
-        }
-
-        if (!firstFrameReported) {
-          final int startTimeMs =
-              (int) TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - constructionTimeNs);
-          camera1StartTimeMsHistogram.addSample(startTimeMs);
-          firstFrameReported = true;
-        }
-
-        int rotation = getFrameOrientation();
-        if (info.facing == android.hardware.Camera.CameraInfo.CAMERA_FACING_FRONT) {
-          // Undo the mirror that the OS "helps" us with.
-          // http://developer.android.com/reference/android/hardware/Camera.html#setDisplayOrientation(int)
-          transformMatrix = RendererCommon.multiplyMatrices(
-              transformMatrix, RendererCommon.horizontalFlipMatrix());
-        }
-        if (videoFrameEmitTrialEnabled) {
-          final VideoFrame.Buffer buffer =
-              surfaceTextureHelper.createTextureBuffer(captureFormat.width, captureFormat.height,
-                  RendererCommon.convertMatrixToAndroidGraphicsMatrix(transformMatrix));
-          final VideoFrame frame = new VideoFrame(buffer, rotation, timestampNs);
-          events.onFrameCaptured(Camera1Session.this, frame);
-          frame.release();
-        } else {
-          events.onTextureFrameCaptured(Camera1Session.this, captureFormat.width,
-              captureFormat.height, oesTextureId, transformMatrix, rotation, timestampNs);
-        }
-      }
-    });
-  }
-
-  private void listenForBytebufferFrames() {
-    camera.setPreviewCallbackWithBuffer(new android.hardware.Camera.PreviewCallback() {
-      @Override
-      public void onPreviewFrame(final byte[] data, android.hardware.Camera callbackCamera) {
-        checkIsOnCameraThread();
-
-        if (callbackCamera != camera) {
-          Logging.e(TAG, "Callback from a different camera. This should never happen.");
-          return;
-        }
-
-        if (state != SessionState.RUNNING) {
-          Logging.d(TAG, "Bytebuffer frame captured but camera is no longer running.");
-          return;
-        }
-
-        final long captureTimeNs = TimeUnit.MILLISECONDS.toNanos(SystemClock.elapsedRealtime());
-
-        if (!firstFrameReported) {
-          final int startTimeMs =
-              (int) TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - constructionTimeNs);
-          camera1StartTimeMsHistogram.addSample(startTimeMs);
-          firstFrameReported = true;
-        }
-
-        if (videoFrameEmitTrialEnabled) {
-          VideoFrame.Buffer frameBuffer = new NV21Buffer(data, captureFormat.width,
-              captureFormat.height, () -> cameraThreadHandler.post(() -> {
-                if (state == SessionState.RUNNING) {
-                  camera.addCallbackBuffer(data);
-                }
-              }));
-          final VideoFrame frame =
-              new VideoFrame(frameBuffer, getFrameOrientation(), captureTimeNs);
-          events.onFrameCaptured(Camera1Session.this, frame);
-          frame.release();
-        } else {
-          events.onByteBufferFrameCaptured(Camera1Session.this, data, captureFormat.width,
-              captureFormat.height, getFrameOrientation(), captureTimeNs);
-          camera.addCallbackBuffer(data);
-        }
-      }
-    });
-  }
-
-  private int getDeviceOrientation() {
-    int orientation = 0;
-
-    WindowManager wm = (WindowManager) applicationContext.getSystemService(Context.WINDOW_SERVICE);
-    switch (wm.getDefaultDisplay().getRotation()) {
-      case Surface.ROTATION_90:
-        orientation = 90;
-        break;
-      case Surface.ROTATION_180:
-        orientation = 180;
-        break;
-      case Surface.ROTATION_270:
-        orientation = 270;
-        break;
-      case Surface.ROTATION_0:
-      default:
-        orientation = 0;
-        break;
-    }
-    return orientation;
-  }
-
-  private int getFrameOrientation() {
-    int rotation = getDeviceOrientation();
-    if (info.facing == android.hardware.Camera.CameraInfo.CAMERA_FACING_BACK) {
-      rotation = 360 - rotation;
-    }
-    return (info.orientation + rotation) % 360;
-  }
-
-  private void checkIsOnCameraThread() {
-    if (Thread.currentThread() != cameraThreadHandler.getLooper().getThread()) {
-      throw new IllegalStateException("Wrong thread");
-    }
-  }
-}
diff --git a/sdk/android/src/java/org/webrtc/Camera2Session.java b/sdk/android/src/java/org/webrtc/Camera2Session.java
deleted file mode 100644
index b74aaa0..0000000
--- a/sdk/android/src/java/org/webrtc/Camera2Session.java
+++ /dev/null
@@ -1,480 +0,0 @@
-/*
- *  Copyright 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.
- */
-
-package org.webrtc;
-
-import android.annotation.TargetApi;
-import android.content.Context;
-import android.graphics.Matrix;
-import android.graphics.SurfaceTexture;
-import android.hardware.camera2.CameraAccessException;
-import android.hardware.camera2.CameraCaptureSession;
-import android.hardware.camera2.CameraCharacteristics;
-import android.hardware.camera2.CameraDevice;
-import android.hardware.camera2.CameraManager;
-import android.hardware.camera2.CameraMetadata;
-import android.hardware.camera2.CaptureFailure;
-import android.hardware.camera2.CaptureRequest;
-import android.media.MediaRecorder;
-import android.os.Handler;
-import android.util.Range;
-import android.view.Surface;
-import android.view.WindowManager;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.TimeUnit;
-import org.webrtc.CameraEnumerationAndroid.CaptureFormat;
-
-@TargetApi(21)
-class Camera2Session implements CameraSession {
-  private static final String TAG = "Camera2Session";
-
-  private static final Histogram camera2StartTimeMsHistogram =
-      Histogram.createCounts("WebRTC.Android.Camera2.StartTimeMs", 1, 10000, 50);
-  private static final Histogram camera2StopTimeMsHistogram =
-      Histogram.createCounts("WebRTC.Android.Camera2.StopTimeMs", 1, 10000, 50);
-  private static final Histogram camera2ResolutionHistogram = Histogram.createEnumeration(
-      "WebRTC.Android.Camera2.Resolution", CameraEnumerationAndroid.COMMON_RESOLUTIONS.size());
-
-  private static enum SessionState { RUNNING, STOPPED }
-
-  private final boolean videoFrameEmitTrialEnabled;
-
-  private final Handler cameraThreadHandler;
-  private final CreateSessionCallback callback;
-  private final Events events;
-  private final Context applicationContext;
-  private final CameraManager cameraManager;
-  private final SurfaceTextureHelper surfaceTextureHelper;
-  private final Surface mediaRecorderSurface;
-  private final String cameraId;
-  private final int width;
-  private final int height;
-  private final int framerate;
-
-  // Initialized at start
-  private CameraCharacteristics cameraCharacteristics;
-  private int cameraOrientation;
-  private boolean isCameraFrontFacing;
-  private int fpsUnitFactor;
-  private CaptureFormat captureFormat;
-
-  // Initialized when camera opens
-  private CameraDevice cameraDevice;
-  private Surface surface;
-
-  // Initialized when capture session is created
-  private CameraCaptureSession captureSession;
-
-  // State
-  private SessionState state = SessionState.RUNNING;
-  private boolean firstFrameReported = false;
-
-  // Used only for stats. Only used on the camera thread.
-  private final long constructionTimeNs; // Construction time of this class.
-
-  private class CameraStateCallback extends CameraDevice.StateCallback {
-    private String getErrorDescription(int errorCode) {
-      switch (errorCode) {
-        case CameraDevice.StateCallback.ERROR_CAMERA_DEVICE:
-          return "Camera device has encountered a fatal error.";
-        case CameraDevice.StateCallback.ERROR_CAMERA_DISABLED:
-          return "Camera device could not be opened due to a device policy.";
-        case CameraDevice.StateCallback.ERROR_CAMERA_IN_USE:
-          return "Camera device is in use already.";
-        case CameraDevice.StateCallback.ERROR_CAMERA_SERVICE:
-          return "Camera service has encountered a fatal error.";
-        case CameraDevice.StateCallback.ERROR_MAX_CAMERAS_IN_USE:
-          return "Camera device could not be opened because"
-              + " there are too many other open camera devices.";
-        default:
-          return "Unknown camera error: " + errorCode;
-      }
-    }
-
-    @Override
-    public void onDisconnected(CameraDevice camera) {
-      checkIsOnCameraThread();
-      final boolean startFailure = (captureSession == null) && (state != SessionState.STOPPED);
-      state = SessionState.STOPPED;
-      stopInternal();
-      if (startFailure) {
-        callback.onFailure(FailureType.DISCONNECTED, "Camera disconnected / evicted.");
-      } else {
-        events.onCameraDisconnected(Camera2Session.this);
-      }
-    }
-
-    @Override
-    public void onError(CameraDevice camera, int errorCode) {
-      checkIsOnCameraThread();
-      reportError(getErrorDescription(errorCode));
-    }
-
-    @Override
-    public void onOpened(CameraDevice camera) {
-      checkIsOnCameraThread();
-
-      Logging.d(TAG, "Camera opened.");
-      cameraDevice = camera;
-
-      final SurfaceTexture surfaceTexture = surfaceTextureHelper.getSurfaceTexture();
-      surfaceTexture.setDefaultBufferSize(captureFormat.width, captureFormat.height);
-      surface = new Surface(surfaceTexture);
-      List<Surface> surfaces = new ArrayList<Surface>();
-      surfaces.add(surface);
-      if (mediaRecorderSurface != null) {
-        Logging.d(TAG, "Add MediaRecorder surface to capture session.");
-        surfaces.add(mediaRecorderSurface);
-      }
-      try {
-        camera.createCaptureSession(surfaces, new CaptureSessionCallback(), cameraThreadHandler);
-      } catch (CameraAccessException e) {
-        reportError("Failed to create capture session. " + e);
-        return;
-      }
-    }
-
-    @Override
-    public void onClosed(CameraDevice camera) {
-      checkIsOnCameraThread();
-
-      Logging.d(TAG, "Camera device closed.");
-      events.onCameraClosed(Camera2Session.this);
-    }
-  }
-
-  private class CaptureSessionCallback extends CameraCaptureSession.StateCallback {
-    @Override
-    public void onConfigureFailed(CameraCaptureSession session) {
-      checkIsOnCameraThread();
-      session.close();
-      reportError("Failed to configure capture session.");
-    }
-
-    @Override
-    public void onConfigured(CameraCaptureSession session) {
-      checkIsOnCameraThread();
-      Logging.d(TAG, "Camera capture session configured.");
-      captureSession = session;
-      try {
-        /*
-         * The viable options for video capture requests are:
-         * TEMPLATE_PREVIEW: High frame rate is given priority over the highest-quality
-         *   post-processing.
-         * TEMPLATE_RECORD: Stable frame rate is used, and post-processing is set for recording
-         *   quality.
-         */
-        final CaptureRequest.Builder captureRequestBuilder =
-            cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_RECORD);
-        // Set auto exposure fps range.
-        captureRequestBuilder.set(CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE,
-            new Range<Integer>(captureFormat.framerate.min / fpsUnitFactor,
-                captureFormat.framerate.max / fpsUnitFactor));
-        captureRequestBuilder.set(
-            CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON);
-        captureRequestBuilder.set(CaptureRequest.CONTROL_AE_LOCK, false);
-        chooseStabilizationMode(captureRequestBuilder);
-        chooseFocusMode(captureRequestBuilder);
-
-        captureRequestBuilder.addTarget(surface);
-        if (mediaRecorderSurface != null) {
-          Logging.d(TAG, "Add MediaRecorder surface to CaptureRequest.Builder");
-          captureRequestBuilder.addTarget(mediaRecorderSurface);
-        }
-        session.setRepeatingRequest(
-            captureRequestBuilder.build(), new CameraCaptureCallback(), cameraThreadHandler);
-      } catch (CameraAccessException e) {
-        reportError("Failed to start capture request. " + e);
-        return;
-      }
-
-      surfaceTextureHelper.startListening(
-          new SurfaceTextureHelper.OnTextureFrameAvailableListener() {
-            @Override
-            public void onTextureFrameAvailable(
-                int oesTextureId, float[] transformMatrix, long timestampNs) {
-              checkIsOnCameraThread();
-
-              if (state != SessionState.RUNNING) {
-                Logging.d(TAG, "Texture frame captured but camera is no longer running.");
-                surfaceTextureHelper.returnTextureFrame();
-                return;
-              }
-
-              if (!firstFrameReported) {
-                firstFrameReported = true;
-                final int startTimeMs =
-                    (int) TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - constructionTimeNs);
-                camera2StartTimeMsHistogram.addSample(startTimeMs);
-              }
-
-              int rotation = getFrameOrientation();
-              if (isCameraFrontFacing) {
-                // Undo the mirror that the OS "helps" us with.
-                // http://developer.android.com/reference/android/hardware/Camera.html#setDisplayOrientation(int)
-                transformMatrix = RendererCommon.multiplyMatrices(
-                    transformMatrix, RendererCommon.horizontalFlipMatrix());
-              }
-
-              // Undo camera orientation - we report it as rotation instead.
-              transformMatrix =
-                  RendererCommon.rotateTextureMatrix(transformMatrix, -cameraOrientation);
-
-              if (videoFrameEmitTrialEnabled) {
-                VideoFrame.Buffer buffer = surfaceTextureHelper.createTextureBuffer(
-                    captureFormat.width, captureFormat.height,
-                    RendererCommon.convertMatrixToAndroidGraphicsMatrix(transformMatrix));
-                final VideoFrame frame = new VideoFrame(buffer, rotation, timestampNs);
-                events.onFrameCaptured(Camera2Session.this, frame);
-                frame.release();
-              } else {
-                events.onTextureFrameCaptured(Camera2Session.this, captureFormat.width,
-                    captureFormat.height, oesTextureId, transformMatrix, rotation, timestampNs);
-              }
-            }
-          });
-      Logging.d(TAG, "Camera device successfully started.");
-      callback.onDone(Camera2Session.this);
-    }
-
-    // Prefers optical stabilization over software stabilization if available. Only enables one of
-    // the stabilization modes at a time because having both enabled can cause strange results.
-    private void chooseStabilizationMode(CaptureRequest.Builder captureRequestBuilder) {
-      final int[] availableOpticalStabilization = cameraCharacteristics.get(
-          CameraCharacteristics.LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION);
-      if (availableOpticalStabilization != null) {
-        for (int mode : availableOpticalStabilization) {
-          if (mode == CaptureRequest.LENS_OPTICAL_STABILIZATION_MODE_ON) {
-            captureRequestBuilder.set(CaptureRequest.LENS_OPTICAL_STABILIZATION_MODE,
-                CaptureRequest.LENS_OPTICAL_STABILIZATION_MODE_ON);
-            captureRequestBuilder.set(CaptureRequest.CONTROL_VIDEO_STABILIZATION_MODE,
-                CaptureRequest.CONTROL_VIDEO_STABILIZATION_MODE_OFF);
-            Logging.d(TAG, "Using optical stabilization.");
-            return;
-          }
-        }
-      }
-      // If no optical mode is available, try software.
-      final int[] availableVideoStabilization = cameraCharacteristics.get(
-          CameraCharacteristics.CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES);
-      for (int mode : availableVideoStabilization) {
-        if (mode == CaptureRequest.CONTROL_VIDEO_STABILIZATION_MODE_ON) {
-          captureRequestBuilder.set(CaptureRequest.CONTROL_VIDEO_STABILIZATION_MODE,
-              CaptureRequest.CONTROL_VIDEO_STABILIZATION_MODE_ON);
-          captureRequestBuilder.set(CaptureRequest.LENS_OPTICAL_STABILIZATION_MODE,
-              CaptureRequest.LENS_OPTICAL_STABILIZATION_MODE_OFF);
-          Logging.d(TAG, "Using video stabilization.");
-          return;
-        }
-      }
-      Logging.d(TAG, "Stabilization not available.");
-    }
-
-    private void chooseFocusMode(CaptureRequest.Builder captureRequestBuilder) {
-      final int[] availableFocusModes =
-          cameraCharacteristics.get(CameraCharacteristics.CONTROL_AF_AVAILABLE_MODES);
-      for (int mode : availableFocusModes) {
-        if (mode == CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_VIDEO) {
-          captureRequestBuilder.set(
-              CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_VIDEO);
-          Logging.d(TAG, "Using continuous video auto-focus.");
-          return;
-        }
-      }
-      Logging.d(TAG, "Auto-focus is not available.");
-    }
-  }
-
-  private class CameraCaptureCallback extends CameraCaptureSession.CaptureCallback {
-    @Override
-    public void onCaptureFailed(
-        CameraCaptureSession session, CaptureRequest request, CaptureFailure failure) {
-      Logging.d(TAG, "Capture failed: " + failure);
-    }
-  }
-
-  public static void create(CreateSessionCallback callback, Events events,
-      Context applicationContext, CameraManager cameraManager,
-      SurfaceTextureHelper surfaceTextureHelper, MediaRecorder mediaRecorder, String cameraId,
-      int width, int height, int framerate) {
-    new Camera2Session(callback, events, applicationContext, cameraManager, surfaceTextureHelper,
-        mediaRecorder, cameraId, width, height, framerate);
-  }
-
-  private Camera2Session(CreateSessionCallback callback, Events events, Context applicationContext,
-      CameraManager cameraManager, SurfaceTextureHelper surfaceTextureHelper,
-      MediaRecorder mediaRecorder, String cameraId, int width, int height, int framerate) {
-    Logging.d(TAG, "Create new camera2 session on camera " + cameraId);
-    videoFrameEmitTrialEnabled =
-        PeerConnectionFactory.fieldTrialsFindFullName(PeerConnectionFactory.VIDEO_FRAME_EMIT_TRIAL)
-            .equals(PeerConnectionFactory.TRIAL_ENABLED);
-
-    constructionTimeNs = System.nanoTime();
-
-    this.cameraThreadHandler = new Handler();
-    this.callback = callback;
-    this.events = events;
-    this.applicationContext = applicationContext;
-    this.cameraManager = cameraManager;
-    this.surfaceTextureHelper = surfaceTextureHelper;
-    this.mediaRecorderSurface = (mediaRecorder != null) ? mediaRecorder.getSurface() : null;
-    this.cameraId = cameraId;
-    this.width = width;
-    this.height = height;
-    this.framerate = framerate;
-
-    start();
-  }
-
-  private void start() {
-    checkIsOnCameraThread();
-    Logging.d(TAG, "start");
-
-    try {
-      cameraCharacteristics = cameraManager.getCameraCharacteristics(cameraId);
-    } catch (final CameraAccessException e) {
-      reportError("getCameraCharacteristics(): " + e.getMessage());
-      return;
-    }
-    cameraOrientation = cameraCharacteristics.get(CameraCharacteristics.SENSOR_ORIENTATION);
-    isCameraFrontFacing = cameraCharacteristics.get(CameraCharacteristics.LENS_FACING)
-        == CameraMetadata.LENS_FACING_FRONT;
-
-    findCaptureFormat();
-    openCamera();
-  }
-
-  private void findCaptureFormat() {
-    checkIsOnCameraThread();
-
-    Range<Integer>[] fpsRanges =
-        cameraCharacteristics.get(CameraCharacteristics.CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES);
-    fpsUnitFactor = Camera2Enumerator.getFpsUnitFactor(fpsRanges);
-    List<CaptureFormat.FramerateRange> framerateRanges =
-        Camera2Enumerator.convertFramerates(fpsRanges, fpsUnitFactor);
-    List<Size> sizes = Camera2Enumerator.getSupportedSizes(cameraCharacteristics);
-    Logging.d(TAG, "Available preview sizes: " + sizes);
-    Logging.d(TAG, "Available fps ranges: " + framerateRanges);
-
-    if (framerateRanges.isEmpty() || sizes.isEmpty()) {
-      reportError("No supported capture formats.");
-      return;
-    }
-
-    final CaptureFormat.FramerateRange bestFpsRange =
-        CameraEnumerationAndroid.getClosestSupportedFramerateRange(framerateRanges, framerate);
-
-    final Size bestSize = CameraEnumerationAndroid.getClosestSupportedSize(sizes, width, height);
-    CameraEnumerationAndroid.reportCameraResolution(camera2ResolutionHistogram, bestSize);
-
-    captureFormat = new CaptureFormat(bestSize.width, bestSize.height, bestFpsRange);
-    Logging.d(TAG, "Using capture format: " + captureFormat);
-  }
-
-  private void openCamera() {
-    checkIsOnCameraThread();
-
-    Logging.d(TAG, "Opening camera " + cameraId);
-    events.onCameraOpening();
-
-    try {
-      cameraManager.openCamera(cameraId, new CameraStateCallback(), cameraThreadHandler);
-    } catch (CameraAccessException e) {
-      reportError("Failed to open camera: " + e);
-      return;
-    }
-  }
-
-  @Override
-  public void stop() {
-    Logging.d(TAG, "Stop camera2 session on camera " + cameraId);
-    checkIsOnCameraThread();
-    if (state != SessionState.STOPPED) {
-      final long stopStartTime = System.nanoTime();
-      state = SessionState.STOPPED;
-      stopInternal();
-      final int stopTimeMs = (int) TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - stopStartTime);
-      camera2StopTimeMsHistogram.addSample(stopTimeMs);
-    }
-  }
-
-  private void stopInternal() {
-    Logging.d(TAG, "Stop internal");
-    checkIsOnCameraThread();
-
-    surfaceTextureHelper.stopListening();
-
-    if (captureSession != null) {
-      captureSession.close();
-      captureSession = null;
-    }
-    if (surface != null) {
-      surface.release();
-      surface = null;
-    }
-    if (cameraDevice != null) {
-      cameraDevice.close();
-      cameraDevice = null;
-    }
-
-    Logging.d(TAG, "Stop done");
-  }
-
-  private void reportError(String error) {
-    checkIsOnCameraThread();
-    Logging.e(TAG, "Error: " + error);
-
-    final boolean startFailure = (captureSession == null) && (state != SessionState.STOPPED);
-    state = SessionState.STOPPED;
-    stopInternal();
-    if (startFailure) {
-      callback.onFailure(FailureType.ERROR, error);
-    } else {
-      events.onCameraError(this, error);
-    }
-  }
-
-  private int getDeviceOrientation() {
-    int orientation = 0;
-
-    WindowManager wm = (WindowManager) applicationContext.getSystemService(Context.WINDOW_SERVICE);
-    switch (wm.getDefaultDisplay().getRotation()) {
-      case Surface.ROTATION_90:
-        orientation = 90;
-        break;
-      case Surface.ROTATION_180:
-        orientation = 180;
-        break;
-      case Surface.ROTATION_270:
-        orientation = 270;
-        break;
-      case Surface.ROTATION_0:
-      default:
-        orientation = 0;
-        break;
-    }
-    return orientation;
-  }
-
-  private int getFrameOrientation() {
-    int rotation = getDeviceOrientation();
-    if (!isCameraFrontFacing) {
-      rotation = 360 - rotation;
-    }
-    return (cameraOrientation + rotation) % 360;
-  }
-
-  private void checkIsOnCameraThread() {
-    if (Thread.currentThread() != cameraThreadHandler.getLooper().getThread()) {
-      throw new IllegalStateException("Wrong thread");
-    }
-  }
-}
diff --git a/sdk/android/src/java/org/webrtc/CameraCapturer.java b/sdk/android/src/java/org/webrtc/CameraCapturer.java
deleted file mode 100644
index 3b442fb..0000000
--- a/sdk/android/src/java/org/webrtc/CameraCapturer.java
+++ /dev/null
@@ -1,590 +0,0 @@
-/*
- *  Copyright 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.
- */
-
-package org.webrtc;
-
-import android.content.Context;
-import android.media.MediaRecorder;
-import android.os.Handler;
-import android.os.Looper;
-import java.util.Arrays;
-
-@SuppressWarnings("deprecation")
-abstract class CameraCapturer implements CameraVideoCapturer {
-  enum SwitchState {
-    IDLE, // No switch requested.
-    PENDING, // Waiting for previous capture session to open.
-    IN_PROGRESS, // Waiting for new switched capture session to start.
-  }
-
-  enum MediaRecorderState {
-    IDLE, // No media recording update (add or remove) requested.
-    IDLE_TO_ACTIVE, // Waiting for new capture session with added MediaRecorder surface to start.
-    ACTIVE_TO_IDLE, // Waiting for new capture session with removed MediaRecorder surface to start.
-    ACTIVE, // MediaRecorder was successfully added to camera pipeline.
-  }
-
-  private static final String TAG = "CameraCapturer";
-  private final static int MAX_OPEN_CAMERA_ATTEMPTS = 3;
-  private final static int OPEN_CAMERA_DELAY_MS = 500;
-  private final static int OPEN_CAMERA_TIMEOUT = 10000;
-
-  private final CameraEnumerator cameraEnumerator;
-  private final CameraEventsHandler eventsHandler;
-  private final Handler uiThreadHandler;
-
-  private final CameraSession.CreateSessionCallback createSessionCallback =
-      new CameraSession.CreateSessionCallback() {
-        @Override
-        public void onDone(CameraSession session) {
-          checkIsOnCameraThread();
-          Logging.d(TAG,
-              "Create session done. Switch state: " + switchState
-                  + ". MediaRecorder state: " + mediaRecorderState);
-          uiThreadHandler.removeCallbacks(openCameraTimeoutRunnable);
-          synchronized (stateLock) {
-            capturerObserver.onCapturerStarted(true /* success */);
-            sessionOpening = false;
-            currentSession = session;
-            cameraStatistics = new CameraStatistics(surfaceHelper, eventsHandler);
-            firstFrameObserved = false;
-            stateLock.notifyAll();
-
-            if (switchState == SwitchState.IN_PROGRESS) {
-              if (switchEventsHandler != null) {
-                switchEventsHandler.onCameraSwitchDone(cameraEnumerator.isFrontFacing(cameraName));
-                switchEventsHandler = null;
-              }
-              switchState = SwitchState.IDLE;
-            } else if (switchState == SwitchState.PENDING) {
-              switchState = SwitchState.IDLE;
-              switchCameraInternal(switchEventsHandler);
-            }
-
-            if (mediaRecorderState == MediaRecorderState.IDLE_TO_ACTIVE
-                || mediaRecorderState == MediaRecorderState.ACTIVE_TO_IDLE) {
-              if (mediaRecorderEventsHandler != null) {
-                mediaRecorderEventsHandler.onMediaRecorderSuccess();
-                mediaRecorderEventsHandler = null;
-              }
-              if (mediaRecorderState == MediaRecorderState.IDLE_TO_ACTIVE) {
-                mediaRecorderState = MediaRecorderState.ACTIVE;
-              } else {
-                mediaRecorderState = MediaRecorderState.IDLE;
-              }
-            }
-          }
-        }
-
-        @Override
-        public void onFailure(CameraSession.FailureType failureType, String error) {
-          checkIsOnCameraThread();
-          uiThreadHandler.removeCallbacks(openCameraTimeoutRunnable);
-          synchronized (stateLock) {
-            capturerObserver.onCapturerStarted(false /* success */);
-            openAttemptsRemaining--;
-
-            if (openAttemptsRemaining <= 0) {
-              Logging.w(TAG, "Opening camera failed, passing: " + error);
-              sessionOpening = false;
-              stateLock.notifyAll();
-
-              if (switchState != SwitchState.IDLE) {
-                if (switchEventsHandler != null) {
-                  switchEventsHandler.onCameraSwitchError(error);
-                  switchEventsHandler = null;
-                }
-                switchState = SwitchState.IDLE;
-              }
-
-              if (mediaRecorderState != MediaRecorderState.IDLE) {
-                if (mediaRecorderEventsHandler != null) {
-                  mediaRecorderEventsHandler.onMediaRecorderError(error);
-                  mediaRecorderEventsHandler = null;
-                }
-                mediaRecorderState = MediaRecorderState.IDLE;
-              }
-
-              if (failureType == CameraSession.FailureType.DISCONNECTED) {
-                eventsHandler.onCameraDisconnected();
-              } else {
-                eventsHandler.onCameraError(error);
-              }
-            } else {
-              Logging.w(TAG, "Opening camera failed, retry: " + error);
-              createSessionInternal(OPEN_CAMERA_DELAY_MS, null /* mediaRecorder */);
-            }
-          }
-        }
-      };
-
-  private final CameraSession.Events cameraSessionEventsHandler = new CameraSession.Events() {
-    @Override
-    public void onCameraOpening() {
-      checkIsOnCameraThread();
-      synchronized (stateLock) {
-        if (currentSession != null) {
-          Logging.w(TAG, "onCameraOpening while session was open.");
-          return;
-        }
-        eventsHandler.onCameraOpening(cameraName);
-      }
-    }
-
-    @Override
-    public void onCameraError(CameraSession session, String error) {
-      checkIsOnCameraThread();
-      synchronized (stateLock) {
-        if (session != currentSession) {
-          Logging.w(TAG, "onCameraError from another session: " + error);
-          return;
-        }
-        eventsHandler.onCameraError(error);
-        stopCapture();
-      }
-    }
-
-    @Override
-    public void onCameraDisconnected(CameraSession session) {
-      checkIsOnCameraThread();
-      synchronized (stateLock) {
-        if (session != currentSession) {
-          Logging.w(TAG, "onCameraDisconnected from another session.");
-          return;
-        }
-        eventsHandler.onCameraDisconnected();
-        stopCapture();
-      }
-    }
-
-    @Override
-    public void onCameraClosed(CameraSession session) {
-      checkIsOnCameraThread();
-      synchronized (stateLock) {
-        if (session != currentSession && currentSession != null) {
-          Logging.d(TAG, "onCameraClosed from another session.");
-          return;
-        }
-        eventsHandler.onCameraClosed();
-      }
-    }
-
-    @Override
-    public void onFrameCaptured(CameraSession session, VideoFrame frame) {
-      checkIsOnCameraThread();
-      synchronized (stateLock) {
-        if (session != currentSession) {
-          Logging.w(TAG, "onTextureFrameCaptured from another session.");
-          return;
-        }
-        if (!firstFrameObserved) {
-          eventsHandler.onFirstFrameAvailable();
-          firstFrameObserved = true;
-        }
-        cameraStatistics.addFrame();
-        capturerObserver.onFrameCaptured(frame);
-      }
-    }
-
-    @Override
-    public void onByteBufferFrameCaptured(
-        CameraSession session, byte[] data, int width, int height, int rotation, long timestamp) {
-      checkIsOnCameraThread();
-      synchronized (stateLock) {
-        if (session != currentSession) {
-          Logging.w(TAG, "onByteBufferFrameCaptured from another session.");
-          return;
-        }
-        if (!firstFrameObserved) {
-          eventsHandler.onFirstFrameAvailable();
-          firstFrameObserved = true;
-        }
-        cameraStatistics.addFrame();
-        capturerObserver.onByteBufferFrameCaptured(data, width, height, rotation, timestamp);
-      }
-    }
-
-    @Override
-    public void onTextureFrameCaptured(CameraSession session, int width, int height,
-        int oesTextureId, float[] transformMatrix, int rotation, long timestamp) {
-      checkIsOnCameraThread();
-      synchronized (stateLock) {
-        if (session != currentSession) {
-          Logging.w(TAG, "onTextureFrameCaptured from another session.");
-          surfaceHelper.returnTextureFrame();
-          return;
-        }
-        if (!firstFrameObserved) {
-          eventsHandler.onFirstFrameAvailable();
-          firstFrameObserved = true;
-        }
-        cameraStatistics.addFrame();
-        capturerObserver.onTextureFrameCaptured(
-            width, height, oesTextureId, transformMatrix, rotation, timestamp);
-      }
-    }
-  };
-
-  private final Runnable openCameraTimeoutRunnable = new Runnable() {
-    @Override
-    public void run() {
-      eventsHandler.onCameraError("Camera failed to start within timeout.");
-    }
-  };
-
-  // Initialized on initialize
-  // -------------------------
-  private Handler cameraThreadHandler;
-  private Context applicationContext;
-  private CapturerObserver capturerObserver;
-  private SurfaceTextureHelper surfaceHelper;
-
-  private final Object stateLock = new Object();
-  private boolean sessionOpening; /* guarded by stateLock */
-  private CameraSession currentSession; /* guarded by stateLock */
-  private String cameraName; /* guarded by stateLock */
-  private int width; /* guarded by stateLock */
-  private int height; /* guarded by stateLock */
-  private int framerate; /* guarded by stateLock */
-  private int openAttemptsRemaining; /* guarded by stateLock */
-  private SwitchState switchState = SwitchState.IDLE; /* guarded by stateLock */
-  private CameraSwitchHandler switchEventsHandler; /* guarded by stateLock */
-  // Valid from onDone call until stopCapture, otherwise null.
-  private CameraStatistics cameraStatistics; /* guarded by stateLock */
-  private boolean firstFrameObserved; /* guarded by stateLock */
-
-  // Variables used on camera thread - do not require stateLock synchronization.
-  private MediaRecorderState mediaRecorderState = MediaRecorderState.IDLE;
-  private MediaRecorderHandler mediaRecorderEventsHandler;
-
-  public CameraCapturer(
-      String cameraName, CameraEventsHandler eventsHandler, CameraEnumerator cameraEnumerator) {
-    if (eventsHandler == null) {
-      eventsHandler = new CameraEventsHandler() {
-        @Override
-        public void onCameraError(String errorDescription) {}
-        @Override
-        public void onCameraDisconnected() {}
-        @Override
-        public void onCameraFreezed(String errorDescription) {}
-        @Override
-        public void onCameraOpening(String cameraName) {}
-        @Override
-        public void onFirstFrameAvailable() {}
-        @Override
-        public void onCameraClosed() {}
-      };
-    }
-
-    this.eventsHandler = eventsHandler;
-    this.cameraEnumerator = cameraEnumerator;
-    this.cameraName = cameraName;
-    uiThreadHandler = new Handler(Looper.getMainLooper());
-
-    final String[] deviceNames = cameraEnumerator.getDeviceNames();
-
-    if (deviceNames.length == 0) {
-      throw new RuntimeException("No cameras attached.");
-    }
-    if (!Arrays.asList(deviceNames).contains(this.cameraName)) {
-      throw new IllegalArgumentException(
-          "Camera name " + this.cameraName + " does not match any known camera device.");
-    }
-  }
-
-  @Override
-  public void initialize(SurfaceTextureHelper surfaceTextureHelper, Context applicationContext,
-      CapturerObserver capturerObserver) {
-    this.applicationContext = applicationContext;
-    this.capturerObserver = capturerObserver;
-    this.surfaceHelper = surfaceTextureHelper;
-    this.cameraThreadHandler =
-        surfaceTextureHelper == null ? null : surfaceTextureHelper.getHandler();
-  }
-
-  @Override
-  public void startCapture(int width, int height, int framerate) {
-    Logging.d(TAG, "startCapture: " + width + "x" + height + "@" + framerate);
-    if (applicationContext == null) {
-      throw new RuntimeException("CameraCapturer must be initialized before calling startCapture.");
-    }
-
-    synchronized (stateLock) {
-      if (sessionOpening || currentSession != null) {
-        Logging.w(TAG, "Session already open");
-        return;
-      }
-
-      this.width = width;
-      this.height = height;
-      this.framerate = framerate;
-
-      sessionOpening = true;
-      openAttemptsRemaining = MAX_OPEN_CAMERA_ATTEMPTS;
-      createSessionInternal(0, null /* mediaRecorder */);
-    }
-  }
-
-  private void createSessionInternal(int delayMs, final MediaRecorder mediaRecorder) {
-    uiThreadHandler.postDelayed(openCameraTimeoutRunnable, delayMs + OPEN_CAMERA_TIMEOUT);
-    cameraThreadHandler.postDelayed(new Runnable() {
-      @Override
-      public void run() {
-        createCameraSession(createSessionCallback, cameraSessionEventsHandler, applicationContext,
-            surfaceHelper, mediaRecorder, cameraName, width, height, framerate);
-      }
-    }, delayMs);
-  }
-
-  @Override
-  public void stopCapture() {
-    Logging.d(TAG, "Stop capture");
-
-    synchronized (stateLock) {
-      while (sessionOpening) {
-        Logging.d(TAG, "Stop capture: Waiting for session to open");
-        ThreadUtils.waitUninterruptibly(stateLock);
-      }
-
-      if (currentSession != null) {
-        Logging.d(TAG, "Stop capture: Nulling session");
-        cameraStatistics.release();
-        cameraStatistics = null;
-        final CameraSession oldSession = currentSession;
-        cameraThreadHandler.post(new Runnable() {
-          @Override
-          public void run() {
-            oldSession.stop();
-          }
-        });
-        currentSession = null;
-        capturerObserver.onCapturerStopped();
-      } else {
-        Logging.d(TAG, "Stop capture: No session open");
-      }
-    }
-
-    Logging.d(TAG, "Stop capture done");
-  }
-
-  @Override
-  public void changeCaptureFormat(int width, int height, int framerate) {
-    Logging.d(TAG, "changeCaptureFormat: " + width + "x" + height + "@" + framerate);
-    synchronized (stateLock) {
-      stopCapture();
-      startCapture(width, height, framerate);
-    }
-  }
-
-  @Override
-  public void dispose() {
-    Logging.d(TAG, "dispose");
-    stopCapture();
-  }
-
-  @Override
-  public void switchCamera(final CameraSwitchHandler switchEventsHandler) {
-    Logging.d(TAG, "switchCamera");
-    cameraThreadHandler.post(new Runnable() {
-      @Override
-      public void run() {
-        switchCameraInternal(switchEventsHandler);
-      }
-    });
-  }
-
-  @Override
-  public void addMediaRecorderToCamera(
-      final MediaRecorder mediaRecorder, final MediaRecorderHandler mediaRecoderEventsHandler) {
-    Logging.d(TAG, "addMediaRecorderToCamera");
-    cameraThreadHandler.post(new Runnable() {
-      @Override
-      public void run() {
-        updateMediaRecorderInternal(mediaRecorder, mediaRecoderEventsHandler);
-      }
-    });
-  }
-
-  @Override
-  public void removeMediaRecorderFromCamera(final MediaRecorderHandler mediaRecoderEventsHandler) {
-    Logging.d(TAG, "removeMediaRecorderFromCamera");
-    cameraThreadHandler.post(new Runnable() {
-      @Override
-      public void run() {
-        updateMediaRecorderInternal(null /* mediaRecorder */, mediaRecoderEventsHandler);
-      }
-    });
-  }
-
-  @Override
-  public boolean isScreencast() {
-    return false;
-  }
-
-  public void printStackTrace() {
-    Thread cameraThread = null;
-    if (cameraThreadHandler != null) {
-      cameraThread = cameraThreadHandler.getLooper().getThread();
-    }
-    if (cameraThread != null) {
-      StackTraceElement[] cameraStackTrace = cameraThread.getStackTrace();
-      if (cameraStackTrace.length > 0) {
-        Logging.d(TAG, "CameraCapturer stack trace:");
-        for (StackTraceElement traceElem : cameraStackTrace) {
-          Logging.d(TAG, traceElem.toString());
-        }
-      }
-    }
-  }
-
-  private void reportCameraSwitchError(String error, CameraSwitchHandler switchEventsHandler) {
-    Logging.e(TAG, error);
-    if (switchEventsHandler != null) {
-      switchEventsHandler.onCameraSwitchError(error);
-    }
-  }
-
-  private void switchCameraInternal(final CameraSwitchHandler switchEventsHandler) {
-    Logging.d(TAG, "switchCamera internal");
-
-    final String[] deviceNames = cameraEnumerator.getDeviceNames();
-
-    if (deviceNames.length < 2) {
-      if (switchEventsHandler != null) {
-        switchEventsHandler.onCameraSwitchError("No camera to switch to.");
-      }
-      return;
-    }
-
-    synchronized (stateLock) {
-      if (switchState != SwitchState.IDLE) {
-        reportCameraSwitchError("Camera switch already in progress.", switchEventsHandler);
-        return;
-      }
-      if (mediaRecorderState != MediaRecorderState.IDLE) {
-        reportCameraSwitchError("switchCamera: media recording is active", switchEventsHandler);
-        return;
-      }
-      if (!sessionOpening && currentSession == null) {
-        reportCameraSwitchError("switchCamera: camera is not running.", switchEventsHandler);
-        return;
-      }
-
-      this.switchEventsHandler = switchEventsHandler;
-      if (sessionOpening) {
-        switchState = SwitchState.PENDING;
-        return;
-      } else {
-        switchState = SwitchState.IN_PROGRESS;
-      }
-
-      Logging.d(TAG, "switchCamera: Stopping session");
-      cameraStatistics.release();
-      cameraStatistics = null;
-      final CameraSession oldSession = currentSession;
-      cameraThreadHandler.post(new Runnable() {
-        @Override
-        public void run() {
-          oldSession.stop();
-        }
-      });
-      currentSession = null;
-
-      int cameraNameIndex = Arrays.asList(deviceNames).indexOf(cameraName);
-      cameraName = deviceNames[(cameraNameIndex + 1) % deviceNames.length];
-
-      sessionOpening = true;
-      openAttemptsRemaining = 1;
-      createSessionInternal(0, null /* mediaRecorder */);
-    }
-    Logging.d(TAG, "switchCamera done");
-  }
-
-  private void reportUpdateMediaRecorderError(
-      String error, MediaRecorderHandler mediaRecoderEventsHandler) {
-    checkIsOnCameraThread();
-    Logging.e(TAG, error);
-    if (mediaRecoderEventsHandler != null) {
-      mediaRecoderEventsHandler.onMediaRecorderError(error);
-    }
-  }
-
-  private void updateMediaRecorderInternal(
-      MediaRecorder mediaRecorder, MediaRecorderHandler mediaRecoderEventsHandler) {
-    checkIsOnCameraThread();
-    boolean addMediaRecorder = (mediaRecorder != null);
-    Logging.d(TAG,
-        "updateMediaRecoderInternal internal. State: " + mediaRecorderState
-            + ". Switch state: " + switchState + ". Add MediaRecorder: " + addMediaRecorder);
-
-    synchronized (stateLock) {
-      if ((addMediaRecorder && mediaRecorderState != MediaRecorderState.IDLE)
-          || (!addMediaRecorder && mediaRecorderState != MediaRecorderState.ACTIVE)) {
-        reportUpdateMediaRecorderError(
-            "Incorrect state for MediaRecorder update.", mediaRecoderEventsHandler);
-        return;
-      }
-      if (switchState != SwitchState.IDLE) {
-        reportUpdateMediaRecorderError(
-            "MediaRecorder update while camera is switching.", mediaRecoderEventsHandler);
-        return;
-      }
-      if (currentSession == null) {
-        reportUpdateMediaRecorderError(
-            "MediaRecorder update while camera is closed.", mediaRecoderEventsHandler);
-        return;
-      }
-      if (sessionOpening) {
-        reportUpdateMediaRecorderError(
-            "MediaRecorder update while camera is still opening.", mediaRecoderEventsHandler);
-        return;
-      }
-
-      this.mediaRecorderEventsHandler = mediaRecoderEventsHandler;
-      mediaRecorderState =
-          addMediaRecorder ? MediaRecorderState.IDLE_TO_ACTIVE : MediaRecorderState.ACTIVE_TO_IDLE;
-
-      Logging.d(TAG, "updateMediaRecoder: Stopping session");
-      cameraStatistics.release();
-      cameraStatistics = null;
-      final CameraSession oldSession = currentSession;
-      cameraThreadHandler.post(new Runnable() {
-        @Override
-        public void run() {
-          oldSession.stop();
-        }
-      });
-      currentSession = null;
-
-      sessionOpening = true;
-      openAttemptsRemaining = 1;
-      createSessionInternal(0, mediaRecorder);
-    }
-    Logging.d(TAG, "updateMediaRecoderInternal done");
-  }
-
-  private void checkIsOnCameraThread() {
-    if (Thread.currentThread() != cameraThreadHandler.getLooper().getThread()) {
-      Logging.e(TAG, "Check is on camera thread failed.");
-      throw new RuntimeException("Not on camera thread.");
-    }
-  }
-
-  protected String getCameraName() {
-    synchronized (stateLock) {
-      return cameraName;
-    }
-  }
-
-  abstract protected void createCameraSession(
-      CameraSession.CreateSessionCallback createSessionCallback, CameraSession.Events events,
-      Context applicationContext, SurfaceTextureHelper surfaceTextureHelper,
-      MediaRecorder mediaRecoder, String cameraName, int width, int height, int framerate);
-}
diff --git a/sdk/android/src/java/org/webrtc/CameraSession.java b/sdk/android/src/java/org/webrtc/CameraSession.java
deleted file mode 100644
index a560378..0000000
--- a/sdk/android/src/java/org/webrtc/CameraSession.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- *  Copyright 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.
- */
-
-package org.webrtc;
-
-interface CameraSession {
-  enum FailureType { ERROR, DISCONNECTED }
-
-  // Callbacks are fired on the camera thread.
-  public interface CreateSessionCallback {
-    void onDone(CameraSession session);
-    void onFailure(FailureType failureType, String error);
-  }
-
-  // Events are fired on the camera thread.
-  public interface Events {
-    void onCameraOpening();
-    void onCameraError(CameraSession session, String error);
-    void onCameraDisconnected(CameraSession session);
-    void onCameraClosed(CameraSession session);
-    void onFrameCaptured(CameraSession session, VideoFrame frame);
-
-    // The old way of passing frames. Will be removed eventually.
-    void onByteBufferFrameCaptured(
-        CameraSession session, byte[] data, int width, int height, int rotation, long timestamp);
-    void onTextureFrameCaptured(CameraSession session, int width, int height, int oesTextureId,
-        float[] transformMatrix, int rotation, long timestamp);
-  }
-
-  /**
-   * Stops the capture. Waits until no more calls to capture observer will be made.
-   * If waitCameraStop is true, also waits for the camera to stop.
-   */
-  void stop();
-}
diff --git a/sdk/android/src/java/org/webrtc/DynamicBitrateAdjuster.java b/sdk/android/src/java/org/webrtc/DynamicBitrateAdjuster.java
deleted file mode 100644
index 742cfad..0000000
--- a/sdk/android/src/java/org/webrtc/DynamicBitrateAdjuster.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- *  Copyright 2017 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.
- */
-
-package org.webrtc;
-
-/**
- * BitrateAdjuster that tracks the bandwidth produced by an encoder and dynamically adjusts the
- * bitrate.  Used for hardware codecs that pay attention to framerate but still deviate from the
- * target bitrate by unacceptable margins.
- */
-class DynamicBitrateAdjuster extends BaseBitrateAdjuster {
-  // Change the bitrate at most once every three seconds.
-  private static final double BITRATE_ADJUSTMENT_SEC = 3.0;
-  // Maximum bitrate adjustment scale - no more than 4 times.
-  private static final double BITRATE_ADJUSTMENT_MAX_SCALE = 4;
-  // Amount of adjustment steps to reach maximum scale.
-  private static final int BITRATE_ADJUSTMENT_STEPS = 20;
-
-  private static final double BITS_PER_BYTE = 8.0;
-
-  // How far the codec has deviated above (or below) the target bitrate (tracked in bytes).
-  private double deviationBytes = 0;
-  private double timeSinceLastAdjustmentMs = 0;
-  private int bitrateAdjustmentScaleExp = 0;
-
-  @Override
-  public void setTargets(int targetBitrateBps, int targetFps) {
-    if (this.targetBitrateBps > 0 && targetBitrateBps < this.targetBitrateBps) {
-      // Rescale the accumulator level if the accumulator max decreases
-      deviationBytes = deviationBytes * targetBitrateBps / this.targetBitrateBps;
-    }
-    super.setTargets(targetBitrateBps, targetFps);
-  }
-
-  @Override
-  public void reportEncodedFrame(int size) {
-    if (targetFps == 0) {
-      return;
-    }
-
-    // Accumulate the difference between actual and expected frame sizes.
-    double expectedBytesPerFrame = (targetBitrateBps / BITS_PER_BYTE) / targetFps;
-    deviationBytes += (size - expectedBytesPerFrame);
-    timeSinceLastAdjustmentMs += 1000.0 / targetFps;
-
-    // Adjust the bitrate when the encoder accumulates one second's worth of data in excess or
-    // shortfall of the target.
-    double deviationThresholdBytes = targetBitrateBps / BITS_PER_BYTE;
-
-    // Cap the deviation, i.e., don't let it grow beyond some level to avoid using too old data for
-    // bitrate adjustment.  This also prevents taking more than 3 "steps" in a given 3-second cycle.
-    double deviationCap = BITRATE_ADJUSTMENT_SEC * deviationThresholdBytes;
-    deviationBytes = Math.min(deviationBytes, deviationCap);
-    deviationBytes = Math.max(deviationBytes, -deviationCap);
-
-    // Do bitrate adjustment every 3 seconds if actual encoder bitrate deviates too much
-    // from the target value.
-    if (timeSinceLastAdjustmentMs <= 1000 * BITRATE_ADJUSTMENT_SEC) {
-      return;
-    }
-
-    if (deviationBytes > deviationThresholdBytes) {
-      // Encoder generates too high bitrate - need to reduce the scale.
-      int bitrateAdjustmentInc = (int) (deviationBytes / deviationThresholdBytes + 0.5);
-      bitrateAdjustmentScaleExp -= bitrateAdjustmentInc;
-      // Don't let the adjustment scale drop below -BITRATE_ADJUSTMENT_STEPS.
-      // This sets a minimum exponent of -1 (bitrateAdjustmentScaleExp / BITRATE_ADJUSTMENT_STEPS).
-      bitrateAdjustmentScaleExp = Math.max(bitrateAdjustmentScaleExp, -BITRATE_ADJUSTMENT_STEPS);
-      deviationBytes = deviationThresholdBytes;
-    } else if (deviationBytes < -deviationThresholdBytes) {
-      // Encoder generates too low bitrate - need to increase the scale.
-      int bitrateAdjustmentInc = (int) (-deviationBytes / deviationThresholdBytes + 0.5);
-      bitrateAdjustmentScaleExp += bitrateAdjustmentInc;
-      // Don't let the adjustment scale exceed BITRATE_ADJUSTMENT_STEPS.
-      // This sets a maximum exponent of 1 (bitrateAdjustmentScaleExp / BITRATE_ADJUSTMENT_STEPS).
-      bitrateAdjustmentScaleExp = Math.min(bitrateAdjustmentScaleExp, BITRATE_ADJUSTMENT_STEPS);
-      deviationBytes = -deviationThresholdBytes;
-    }
-    timeSinceLastAdjustmentMs = 0;
-  }
-
-  @Override
-  public int getAdjustedBitrateBps() {
-    return (int) (targetBitrateBps
-        * Math.pow(BITRATE_ADJUSTMENT_MAX_SCALE,
-              (double) bitrateAdjustmentScaleExp / BITRATE_ADJUSTMENT_STEPS));
-  }
-}
diff --git a/sdk/android/src/java/org/webrtc/EglBase10.java b/sdk/android/src/java/org/webrtc/EglBase10.java
deleted file mode 100644
index 8f1c5c6..0000000
--- a/sdk/android/src/java/org/webrtc/EglBase10.java
+++ /dev/null
@@ -1,313 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-package org.webrtc;
-
-import android.graphics.Canvas;
-import android.graphics.Rect;
-import android.graphics.SurfaceTexture;
-import android.view.Surface;
-import android.view.SurfaceHolder;
-
-import javax.microedition.khronos.egl.EGL10;
-import javax.microedition.khronos.egl.EGLConfig;
-import javax.microedition.khronos.egl.EGLContext;
-import javax.microedition.khronos.egl.EGLDisplay;
-import javax.microedition.khronos.egl.EGLSurface;
-
-/**
- * Holds EGL state and utility methods for handling an egl 1.0 EGLContext, an EGLDisplay,
- * and an EGLSurface.
- */
-class EglBase10 extends EglBase {
-  // This constant is taken from EGL14.EGL_CONTEXT_CLIENT_VERSION.
-  private static final int EGL_CONTEXT_CLIENT_VERSION = 0x3098;
-
-  private final EGL10 egl;
-  private EGLContext eglContext;
-  private EGLConfig eglConfig;
-  private EGLDisplay eglDisplay;
-  private EGLSurface eglSurface = EGL10.EGL_NO_SURFACE;
-
-  // EGL wrapper for an actual EGLContext.
-  public static class Context extends EglBase.Context {
-    private final EGLContext eglContext;
-
-    public Context(EGLContext eglContext) {
-      this.eglContext = eglContext;
-    }
-  }
-
-  // Create a new context with the specified config type, sharing data with sharedContext.
-  public EglBase10(Context sharedContext, int[] configAttributes) {
-    this.egl = (EGL10) EGLContext.getEGL();
-    eglDisplay = getEglDisplay();
-    eglConfig = getEglConfig(eglDisplay, configAttributes);
-    eglContext = createEglContext(sharedContext, eglDisplay, eglConfig);
-  }
-
-  @Override
-  public void createSurface(Surface surface) {
-    /**
-     * We have to wrap Surface in a SurfaceHolder because for some reason eglCreateWindowSurface
-     * couldn't actually take a Surface object until API 17. Older versions fortunately just call
-     * SurfaceHolder.getSurface(), so we'll do that. No other methods are relevant.
-     */
-    class FakeSurfaceHolder implements SurfaceHolder {
-      private final Surface surface;
-
-      FakeSurfaceHolder(Surface surface) {
-        this.surface = surface;
-      }
-
-      @Override
-      public void addCallback(Callback callback) {}
-
-      @Override
-      public void removeCallback(Callback callback) {}
-
-      @Override
-      public boolean isCreating() {
-        return false;
-      }
-
-      @Deprecated
-      @Override
-      public void setType(int i) {}
-
-      @Override
-      public void setFixedSize(int i, int i2) {}
-
-      @Override
-      public void setSizeFromLayout() {}
-
-      @Override
-      public void setFormat(int i) {}
-
-      @Override
-      public void setKeepScreenOn(boolean b) {}
-
-      @Override
-      public Canvas lockCanvas() {
-        return null;
-      }
-
-      @Override
-      public Canvas lockCanvas(Rect rect) {
-        return null;
-      }
-
-      @Override
-      public void unlockCanvasAndPost(Canvas canvas) {}
-
-      @Override
-      public Rect getSurfaceFrame() {
-        return null;
-      }
-
-      @Override
-      public Surface getSurface() {
-        return surface;
-      }
-    }
-
-    createSurfaceInternal(new FakeSurfaceHolder(surface));
-  }
-
-  // Create EGLSurface from the Android SurfaceTexture.
-  @Override
-  public void createSurface(SurfaceTexture surfaceTexture) {
-    createSurfaceInternal(surfaceTexture);
-  }
-
-  // Create EGLSurface from either a SurfaceHolder or a SurfaceTexture.
-  private void createSurfaceInternal(Object nativeWindow) {
-    if (!(nativeWindow instanceof SurfaceHolder) && !(nativeWindow instanceof SurfaceTexture)) {
-      throw new IllegalStateException("Input must be either a SurfaceHolder or SurfaceTexture");
-    }
-    checkIsNotReleased();
-    if (eglSurface != EGL10.EGL_NO_SURFACE) {
-      throw new RuntimeException("Already has an EGLSurface");
-    }
-    int[] surfaceAttribs = {EGL10.EGL_NONE};
-    eglSurface = egl.eglCreateWindowSurface(eglDisplay, eglConfig, nativeWindow, surfaceAttribs);
-    if (eglSurface == EGL10.EGL_NO_SURFACE) {
-      throw new RuntimeException(
-          "Failed to create window surface: 0x" + Integer.toHexString(egl.eglGetError()));
-    }
-  }
-
-  // Create dummy 1x1 pixel buffer surface so the context can be made current.
-  @Override
-  public void createDummyPbufferSurface() {
-    createPbufferSurface(1, 1);
-  }
-
-  @Override
-  public void createPbufferSurface(int width, int height) {
-    checkIsNotReleased();
-    if (eglSurface != EGL10.EGL_NO_SURFACE) {
-      throw new RuntimeException("Already has an EGLSurface");
-    }
-    int[] surfaceAttribs = {EGL10.EGL_WIDTH, width, EGL10.EGL_HEIGHT, height, EGL10.EGL_NONE};
-    eglSurface = egl.eglCreatePbufferSurface(eglDisplay, eglConfig, surfaceAttribs);
-    if (eglSurface == EGL10.EGL_NO_SURFACE) {
-      throw new RuntimeException("Failed to create pixel buffer surface with size " + width + "x"
-          + height + ": 0x" + Integer.toHexString(egl.eglGetError()));
-    }
-  }
-
-  @Override
-  public org.webrtc.EglBase.Context getEglBaseContext() {
-    return new EglBase10.Context(eglContext);
-  }
-
-  @Override
-  public boolean hasSurface() {
-    return eglSurface != EGL10.EGL_NO_SURFACE;
-  }
-
-  @Override
-  public int surfaceWidth() {
-    final int widthArray[] = new int[1];
-    egl.eglQuerySurface(eglDisplay, eglSurface, EGL10.EGL_WIDTH, widthArray);
-    return widthArray[0];
-  }
-
-  @Override
-  public int surfaceHeight() {
-    final int heightArray[] = new int[1];
-    egl.eglQuerySurface(eglDisplay, eglSurface, EGL10.EGL_HEIGHT, heightArray);
-    return heightArray[0];
-  }
-
-  @Override
-  public void releaseSurface() {
-    if (eglSurface != EGL10.EGL_NO_SURFACE) {
-      egl.eglDestroySurface(eglDisplay, eglSurface);
-      eglSurface = EGL10.EGL_NO_SURFACE;
-    }
-  }
-
-  private void checkIsNotReleased() {
-    if (eglDisplay == EGL10.EGL_NO_DISPLAY || eglContext == EGL10.EGL_NO_CONTEXT
-        || eglConfig == null) {
-      throw new RuntimeException("This object has been released");
-    }
-  }
-
-  @Override
-  public void release() {
-    checkIsNotReleased();
-    releaseSurface();
-    detachCurrent();
-    egl.eglDestroyContext(eglDisplay, eglContext);
-    egl.eglTerminate(eglDisplay);
-    eglContext = EGL10.EGL_NO_CONTEXT;
-    eglDisplay = EGL10.EGL_NO_DISPLAY;
-    eglConfig = null;
-  }
-
-  @Override
-  public void makeCurrent() {
-    checkIsNotReleased();
-    if (eglSurface == EGL10.EGL_NO_SURFACE) {
-      throw new RuntimeException("No EGLSurface - can't make current");
-    }
-    synchronized (EglBase.lock) {
-      if (!egl.eglMakeCurrent(eglDisplay, eglSurface, eglSurface, eglContext)) {
-        throw new RuntimeException(
-            "eglMakeCurrent failed: 0x" + Integer.toHexString(egl.eglGetError()));
-      }
-    }
-  }
-
-  // Detach the current EGL context, so that it can be made current on another thread.
-  @Override
-  public void detachCurrent() {
-    synchronized (EglBase.lock) {
-      if (!egl.eglMakeCurrent(
-              eglDisplay, EGL10.EGL_NO_SURFACE, EGL10.EGL_NO_SURFACE, EGL10.EGL_NO_CONTEXT)) {
-        throw new RuntimeException(
-            "eglDetachCurrent failed: 0x" + Integer.toHexString(egl.eglGetError()));
-      }
-    }
-  }
-
-  @Override
-  public void swapBuffers() {
-    checkIsNotReleased();
-    if (eglSurface == EGL10.EGL_NO_SURFACE) {
-      throw new RuntimeException("No EGLSurface - can't swap buffers");
-    }
-    synchronized (EglBase.lock) {
-      egl.eglSwapBuffers(eglDisplay, eglSurface);
-    }
-  }
-
-  @Override
-  public void swapBuffers(long timeStampNs) {
-    // Setting presentation time is not supported for EGL 1.0.
-    swapBuffers();
-  }
-
-  // Return an EGLDisplay, or die trying.
-  private EGLDisplay getEglDisplay() {
-    EGLDisplay eglDisplay = egl.eglGetDisplay(EGL10.EGL_DEFAULT_DISPLAY);
-    if (eglDisplay == EGL10.EGL_NO_DISPLAY) {
-      throw new RuntimeException(
-          "Unable to get EGL10 display: 0x" + Integer.toHexString(egl.eglGetError()));
-    }
-    int[] version = new int[2];
-    if (!egl.eglInitialize(eglDisplay, version)) {
-      throw new RuntimeException(
-          "Unable to initialize EGL10: 0x" + Integer.toHexString(egl.eglGetError()));
-    }
-    return eglDisplay;
-  }
-
-  // Return an EGLConfig, or die trying.
-  private EGLConfig getEglConfig(EGLDisplay eglDisplay, int[] configAttributes) {
-    EGLConfig[] configs = new EGLConfig[1];
-    int[] numConfigs = new int[1];
-    if (!egl.eglChooseConfig(eglDisplay, configAttributes, configs, configs.length, numConfigs)) {
-      throw new RuntimeException(
-          "eglChooseConfig failed: 0x" + Integer.toHexString(egl.eglGetError()));
-    }
-    if (numConfigs[0] <= 0) {
-      throw new RuntimeException("Unable to find any matching EGL config");
-    }
-    final EGLConfig eglConfig = configs[0];
-    if (eglConfig == null) {
-      throw new RuntimeException("eglChooseConfig returned null");
-    }
-    return eglConfig;
-  }
-
-  // Return an EGLConfig, or die trying.
-  private EGLContext createEglContext(
-      Context sharedContext, EGLDisplay eglDisplay, EGLConfig eglConfig) {
-    if (sharedContext != null && sharedContext.eglContext == EGL10.EGL_NO_CONTEXT) {
-      throw new RuntimeException("Invalid sharedContext");
-    }
-    int[] contextAttributes = {EGL_CONTEXT_CLIENT_VERSION, 2, EGL10.EGL_NONE};
-    EGLContext rootContext =
-        sharedContext == null ? EGL10.EGL_NO_CONTEXT : sharedContext.eglContext;
-    final EGLContext eglContext;
-    synchronized (EglBase.lock) {
-      eglContext = egl.eglCreateContext(eglDisplay, eglConfig, rootContext, contextAttributes);
-    }
-    if (eglContext == EGL10.EGL_NO_CONTEXT) {
-      throw new RuntimeException(
-          "Failed to create EGL context: 0x" + Integer.toHexString(egl.eglGetError()));
-    }
-    return eglContext;
-  }
-}
diff --git a/sdk/android/src/java/org/webrtc/EglBase14.java b/sdk/android/src/java/org/webrtc/EglBase14.java
deleted file mode 100644
index 92f0958..0000000
--- a/sdk/android/src/java/org/webrtc/EglBase14.java
+++ /dev/null
@@ -1,266 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-package org.webrtc;
-
-import android.annotation.TargetApi;
-import android.graphics.SurfaceTexture;
-import android.opengl.EGL14;
-import android.opengl.EGLConfig;
-import android.opengl.EGLContext;
-import android.opengl.EGLDisplay;
-import android.opengl.EGLExt;
-import android.opengl.EGLSurface;
-import android.view.Surface;
-
-/**
- * Holds EGL state and utility methods for handling an EGL14 EGLContext, an EGLDisplay,
- * and an EGLSurface.
- */
-@TargetApi(18)
-class EglBase14 extends EglBase {
-  private static final String TAG = "EglBase14";
-  private static final int EGLExt_SDK_VERSION = android.os.Build.VERSION_CODES.JELLY_BEAN_MR2;
-  private static final int CURRENT_SDK_VERSION = android.os.Build.VERSION.SDK_INT;
-  private EGLContext eglContext;
-  private EGLConfig eglConfig;
-  private EGLDisplay eglDisplay;
-  private EGLSurface eglSurface = EGL14.EGL_NO_SURFACE;
-
-  // EGL 1.4 is supported from API 17. But EGLExt that is used for setting presentation
-  // time stamp on a surface is supported from 18 so we require 18.
-  public static boolean isEGL14Supported() {
-    Logging.d(TAG,
-        "SDK version: " + CURRENT_SDK_VERSION
-            + ". isEGL14Supported: " + (CURRENT_SDK_VERSION >= EGLExt_SDK_VERSION));
-    return (CURRENT_SDK_VERSION >= EGLExt_SDK_VERSION);
-  }
-
-  public static class Context extends EglBase.Context {
-    private final android.opengl.EGLContext egl14Context;
-
-    public Context(android.opengl.EGLContext eglContext) {
-      this.egl14Context = eglContext;
-    }
-  }
-
-  // Create a new context with the specified config type, sharing data with sharedContext.
-  // |sharedContext| may be null.
-  public EglBase14(EglBase14.Context sharedContext, int[] configAttributes) {
-    eglDisplay = getEglDisplay();
-    eglConfig = getEglConfig(eglDisplay, configAttributes);
-    eglContext = createEglContext(sharedContext, eglDisplay, eglConfig);
-  }
-
-  // Create EGLSurface from the Android Surface.
-  @Override
-  public void createSurface(Surface surface) {
-    createSurfaceInternal(surface);
-  }
-
-  // Create EGLSurface from the Android SurfaceTexture.
-  @Override
-  public void createSurface(SurfaceTexture surfaceTexture) {
-    createSurfaceInternal(surfaceTexture);
-  }
-
-  // Create EGLSurface from either Surface or SurfaceTexture.
-  private void createSurfaceInternal(Object surface) {
-    if (!(surface instanceof Surface) && !(surface instanceof SurfaceTexture)) {
-      throw new IllegalStateException("Input must be either a Surface or SurfaceTexture");
-    }
-    checkIsNotReleased();
-    if (eglSurface != EGL14.EGL_NO_SURFACE) {
-      throw new RuntimeException("Already has an EGLSurface");
-    }
-    int[] surfaceAttribs = {EGL14.EGL_NONE};
-    eglSurface = EGL14.eglCreateWindowSurface(eglDisplay, eglConfig, surface, surfaceAttribs, 0);
-    if (eglSurface == EGL14.EGL_NO_SURFACE) {
-      throw new RuntimeException(
-          "Failed to create window surface: 0x" + Integer.toHexString(EGL14.eglGetError()));
-    }
-  }
-
-  @Override
-  public void createDummyPbufferSurface() {
-    createPbufferSurface(1, 1);
-  }
-
-  @Override
-  public void createPbufferSurface(int width, int height) {
-    checkIsNotReleased();
-    if (eglSurface != EGL14.EGL_NO_SURFACE) {
-      throw new RuntimeException("Already has an EGLSurface");
-    }
-    int[] surfaceAttribs = {EGL14.EGL_WIDTH, width, EGL14.EGL_HEIGHT, height, EGL14.EGL_NONE};
-    eglSurface = EGL14.eglCreatePbufferSurface(eglDisplay, eglConfig, surfaceAttribs, 0);
-    if (eglSurface == EGL14.EGL_NO_SURFACE) {
-      throw new RuntimeException("Failed to create pixel buffer surface with size " + width + "x"
-          + height + ": 0x" + Integer.toHexString(EGL14.eglGetError()));
-    }
-  }
-
-  @Override
-  public Context getEglBaseContext() {
-    return new EglBase14.Context(eglContext);
-  }
-
-  @Override
-  public boolean hasSurface() {
-    return eglSurface != EGL14.EGL_NO_SURFACE;
-  }
-
-  @Override
-  public int surfaceWidth() {
-    final int widthArray[] = new int[1];
-    EGL14.eglQuerySurface(eglDisplay, eglSurface, EGL14.EGL_WIDTH, widthArray, 0);
-    return widthArray[0];
-  }
-
-  @Override
-  public int surfaceHeight() {
-    final int heightArray[] = new int[1];
-    EGL14.eglQuerySurface(eglDisplay, eglSurface, EGL14.EGL_HEIGHT, heightArray, 0);
-    return heightArray[0];
-  }
-
-  @Override
-  public void releaseSurface() {
-    if (eglSurface != EGL14.EGL_NO_SURFACE) {
-      EGL14.eglDestroySurface(eglDisplay, eglSurface);
-      eglSurface = EGL14.EGL_NO_SURFACE;
-    }
-  }
-
-  private void checkIsNotReleased() {
-    if (eglDisplay == EGL14.EGL_NO_DISPLAY || eglContext == EGL14.EGL_NO_CONTEXT
-        || eglConfig == null) {
-      throw new RuntimeException("This object has been released");
-    }
-  }
-
-  @Override
-  public void release() {
-    checkIsNotReleased();
-    releaseSurface();
-    detachCurrent();
-    EGL14.eglDestroyContext(eglDisplay, eglContext);
-    EGL14.eglReleaseThread();
-    EGL14.eglTerminate(eglDisplay);
-    eglContext = EGL14.EGL_NO_CONTEXT;
-    eglDisplay = EGL14.EGL_NO_DISPLAY;
-    eglConfig = null;
-  }
-
-  @Override
-  public void makeCurrent() {
-    checkIsNotReleased();
-    if (eglSurface == EGL14.EGL_NO_SURFACE) {
-      throw new RuntimeException("No EGLSurface - can't make current");
-    }
-    synchronized (EglBase.lock) {
-      if (!EGL14.eglMakeCurrent(eglDisplay, eglSurface, eglSurface, eglContext)) {
-        throw new RuntimeException(
-            "eglMakeCurrent failed: 0x" + Integer.toHexString(EGL14.eglGetError()));
-      }
-    }
-  }
-
-  // Detach the current EGL context, so that it can be made current on another thread.
-  @Override
-  public void detachCurrent() {
-    synchronized (EglBase.lock) {
-      if (!EGL14.eglMakeCurrent(
-              eglDisplay, EGL14.EGL_NO_SURFACE, EGL14.EGL_NO_SURFACE, EGL14.EGL_NO_CONTEXT)) {
-        throw new RuntimeException(
-            "eglDetachCurrent failed: 0x" + Integer.toHexString(EGL14.eglGetError()));
-      }
-    }
-  }
-
-  @Override
-  public void swapBuffers() {
-    checkIsNotReleased();
-    if (eglSurface == EGL14.EGL_NO_SURFACE) {
-      throw new RuntimeException("No EGLSurface - can't swap buffers");
-    }
-    synchronized (EglBase.lock) {
-      EGL14.eglSwapBuffers(eglDisplay, eglSurface);
-    }
-  }
-
-  @Override
-  public void swapBuffers(long timeStampNs) {
-    checkIsNotReleased();
-    if (eglSurface == EGL14.EGL_NO_SURFACE) {
-      throw new RuntimeException("No EGLSurface - can't swap buffers");
-    }
-    synchronized (EglBase.lock) {
-      // See
-      // https://android.googlesource.com/platform/frameworks/native/+/tools_r22.2/opengl/specs/EGL_ANDROID_presentation_time.txt
-      EGLExt.eglPresentationTimeANDROID(eglDisplay, eglSurface, timeStampNs);
-      EGL14.eglSwapBuffers(eglDisplay, eglSurface);
-    }
-  }
-
-  // Return an EGLDisplay, or die trying.
-  private static EGLDisplay getEglDisplay() {
-    EGLDisplay eglDisplay = EGL14.eglGetDisplay(EGL14.EGL_DEFAULT_DISPLAY);
-    if (eglDisplay == EGL14.EGL_NO_DISPLAY) {
-      throw new RuntimeException(
-          "Unable to get EGL14 display: 0x" + Integer.toHexString(EGL14.eglGetError()));
-    }
-    int[] version = new int[2];
-    if (!EGL14.eglInitialize(eglDisplay, version, 0, version, 1)) {
-      throw new RuntimeException(
-          "Unable to initialize EGL14: 0x" + Integer.toHexString(EGL14.eglGetError()));
-    }
-    return eglDisplay;
-  }
-
-  // Return an EGLConfig, or die trying.
-  private static EGLConfig getEglConfig(EGLDisplay eglDisplay, int[] configAttributes) {
-    EGLConfig[] configs = new EGLConfig[1];
-    int[] numConfigs = new int[1];
-    if (!EGL14.eglChooseConfig(
-            eglDisplay, configAttributes, 0, configs, 0, configs.length, numConfigs, 0)) {
-      throw new RuntimeException(
-          "eglChooseConfig failed: 0x" + Integer.toHexString(EGL14.eglGetError()));
-    }
-    if (numConfigs[0] <= 0) {
-      throw new RuntimeException("Unable to find any matching EGL config");
-    }
-    final EGLConfig eglConfig = configs[0];
-    if (eglConfig == null) {
-      throw new RuntimeException("eglChooseConfig returned null");
-    }
-    return eglConfig;
-  }
-
-  // Return an EGLConfig, or die trying.
-  private static EGLContext createEglContext(
-      EglBase14.Context sharedContext, EGLDisplay eglDisplay, EGLConfig eglConfig) {
-    if (sharedContext != null && sharedContext.egl14Context == EGL14.EGL_NO_CONTEXT) {
-      throw new RuntimeException("Invalid sharedContext");
-    }
-    int[] contextAttributes = {EGL14.EGL_CONTEXT_CLIENT_VERSION, 2, EGL14.EGL_NONE};
-    EGLContext rootContext =
-        sharedContext == null ? EGL14.EGL_NO_CONTEXT : sharedContext.egl14Context;
-    final EGLContext eglContext;
-    synchronized (EglBase.lock) {
-      eglContext = EGL14.eglCreateContext(eglDisplay, eglConfig, rootContext, contextAttributes, 0);
-    }
-    if (eglContext == EGL14.EGL_NO_CONTEXT) {
-      throw new RuntimeException(
-          "Failed to create EGL context: 0x" + Integer.toHexString(EGL14.eglGetError()));
-    }
-    return eglContext;
-  }
-}
diff --git a/sdk/android/src/java/org/webrtc/FramerateBitrateAdjuster.java b/sdk/android/src/java/org/webrtc/FramerateBitrateAdjuster.java
deleted file mode 100644
index a0a0664..0000000
--- a/sdk/android/src/java/org/webrtc/FramerateBitrateAdjuster.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- *  Copyright 2017 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.
- */
-
-package org.webrtc;
-
-/**
- * BitrateAdjuster that adjusts the bitrate to compensate for changes in the framerate.  Used with
- * hardware codecs that assume the framerate never changes.
- */
-class FramerateBitrateAdjuster extends BaseBitrateAdjuster {
-  private static final int INITIAL_FPS = 30;
-
-  @Override
-  public void setTargets(int targetBitrateBps, int targetFps) {
-    if (this.targetFps == 0) {
-      // Framerate-based bitrate adjustment always initializes to the same framerate.
-      targetFps = INITIAL_FPS;
-    }
-    super.setTargets(targetBitrateBps, targetFps);
-
-    this.targetBitrateBps *= INITIAL_FPS / this.targetFps;
-  }
-}
diff --git a/sdk/android/src/java/org/webrtc/HardwareVideoDecoder.java b/sdk/android/src/java/org/webrtc/HardwareVideoDecoder.java
deleted file mode 100644
index 7f7d538..0000000
--- a/sdk/android/src/java/org/webrtc/HardwareVideoDecoder.java
+++ /dev/null
@@ -1,700 +0,0 @@
-/*
- *  Copyright 2017 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.
- */
-
-package org.webrtc;
-
-import android.annotation.TargetApi;
-import android.media.MediaCodec;
-import android.media.MediaCodecInfo.CodecCapabilities;
-import android.media.MediaFormat;
-import android.os.SystemClock;
-import android.view.Surface;
-import java.io.IOException;
-import java.nio.ByteBuffer;
-import java.util.concurrent.BlockingDeque;
-import java.util.concurrent.LinkedBlockingDeque;
-import java.util.concurrent.TimeUnit;
-import org.webrtc.ThreadUtils.ThreadChecker;
-
-/** Android hardware video decoder. */
-@TargetApi(16)
-@SuppressWarnings("deprecation") // Cannot support API 16 without using deprecated methods.
-class HardwareVideoDecoder
-    implements VideoDecoder, SurfaceTextureHelper.OnTextureFrameAvailableListener {
-  private static final String TAG = "HardwareVideoDecoder";
-
-  // TODO(magjed): Use MediaFormat.KEY_* constants when part of the public API.
-  private static final String MEDIA_FORMAT_KEY_STRIDE = "stride";
-  private static final String MEDIA_FORMAT_KEY_SLICE_HEIGHT = "slice-height";
-  private static final String MEDIA_FORMAT_KEY_CROP_LEFT = "crop-left";
-  private static final String MEDIA_FORMAT_KEY_CROP_RIGHT = "crop-right";
-  private static final String MEDIA_FORMAT_KEY_CROP_TOP = "crop-top";
-  private static final String MEDIA_FORMAT_KEY_CROP_BOTTOM = "crop-bottom";
-
-  // MediaCodec.release() occasionally hangs.  Release stops waiting and reports failure after
-  // this timeout.
-  private static final int MEDIA_CODEC_RELEASE_TIMEOUT_MS = 5000;
-
-  // WebRTC queues input frames quickly in the beginning on the call. Wait for input buffers with a
-  // long timeout (500 ms) to prevent this from causing the codec to return an error.
-  private static final int DEQUEUE_INPUT_TIMEOUT_US = 500000;
-
-  // Dequeuing an output buffer will block until a buffer is available (up to 100 milliseconds).
-  // If this timeout is exceeded, the output thread will unblock and check if the decoder is still
-  // running.  If it is, it will block on dequeue again.  Otherwise, it will stop and release the
-  // MediaCodec.
-  private static final int DEQUEUE_OUTPUT_BUFFER_TIMEOUT_US = 100000;
-
-  private final String codecName;
-  private final VideoCodecType codecType;
-
-  private static class FrameInfo {
-    final long decodeStartTimeMs;
-    final int rotation;
-
-    FrameInfo(long decodeStartTimeMs, int rotation) {
-      this.decodeStartTimeMs = decodeStartTimeMs;
-      this.rotation = rotation;
-    }
-  }
-
-  private final BlockingDeque<FrameInfo> frameInfos;
-  private int colorFormat;
-
-  // Output thread runs a loop which polls MediaCodec for decoded output buffers.  It reformats
-  // those buffers into VideoFrames and delivers them to the callback.  Variable is set on decoder
-  // thread and is immutable while the codec is running.
-  private Thread outputThread;
-
-  // Checker that ensures work is run on the output thread.
-  private ThreadChecker outputThreadChecker;
-
-  // Checker that ensures work is run on the decoder thread.  The decoder thread is owned by the
-  // caller and must be used to call initDecode, decode, and release.
-  private ThreadChecker decoderThreadChecker;
-
-  private volatile boolean running = false;
-  private volatile Exception shutdownException = null;
-
-  // Prevents the decoder from being released before all output buffers have been released.
-  private final Object activeOutputBuffersLock = new Object();
-  private int activeOutputBuffers = 0; // Guarded by activeOutputBuffersLock
-
-  // Dimensions (width, height, stride, and sliceHeight) may be accessed by either the decode thread
-  // or the output thread.  Accesses should be protected with this lock.
-  private final Object dimensionLock = new Object();
-  private int width;
-  private int height;
-  private int stride;
-  private int sliceHeight;
-
-  // Whether the decoder has finished the first frame.  The codec may not change output dimensions
-  // after delivering the first frame.  Only accessed on the output thread while the decoder is
-  // running.
-  private boolean hasDecodedFirstFrame;
-  // Whether the decoder has seen a key frame.  The first frame must be a key frame.  Only accessed
-  // on the decoder thread.
-  private boolean keyFrameRequired;
-
-  private final EglBase.Context sharedContext;
-  // Valid and immutable while the decoder is running.
-  private SurfaceTextureHelper surfaceTextureHelper;
-  private Surface surface = null;
-
-  private static class DecodedTextureMetadata {
-    final int width;
-    final int height;
-    final int rotation;
-    final long presentationTimestampUs;
-    final Integer decodeTimeMs;
-
-    DecodedTextureMetadata(
-        int width, int height, int rotation, long presentationTimestampUs, Integer decodeTimeMs) {
-      this.width = width;
-      this.height = height;
-      this.rotation = rotation;
-      this.presentationTimestampUs = presentationTimestampUs;
-      this.decodeTimeMs = decodeTimeMs;
-    }
-  }
-
-  // Metadata for the last frame rendered to the texture.  Only accessed on the texture helper's
-  // thread.
-  private DecodedTextureMetadata renderedTextureMetadata;
-
-  // Decoding proceeds asynchronously.  This callback returns decoded frames to the caller.  Valid
-  // and immutable while the decoder is running.
-  private Callback callback;
-
-  // Valid and immutable while the decoder is running.
-  private MediaCodec codec = null;
-
-  HardwareVideoDecoder(
-      String codecName, VideoCodecType codecType, int colorFormat, EglBase.Context sharedContext) {
-    if (!isSupportedColorFormat(colorFormat)) {
-      throw new IllegalArgumentException("Unsupported color format: " + colorFormat);
-    }
-    this.codecName = codecName;
-    this.codecType = codecType;
-    this.colorFormat = colorFormat;
-    this.sharedContext = sharedContext;
-    this.frameInfos = new LinkedBlockingDeque<>();
-  }
-
-  @Override
-  public VideoCodecStatus initDecode(Settings settings, Callback callback) {
-    this.decoderThreadChecker = new ThreadChecker();
-
-    this.callback = callback;
-    if (sharedContext != null) {
-      surfaceTextureHelper = SurfaceTextureHelper.create("decoder-texture-thread", sharedContext);
-      surface = new Surface(surfaceTextureHelper.getSurfaceTexture());
-      surfaceTextureHelper.startListening(this);
-    }
-    return initDecodeInternal(settings.width, settings.height);
-  }
-
-  // Internal variant is used when restarting the codec due to reconfiguration.
-  private VideoCodecStatus initDecodeInternal(int width, int height) {
-    decoderThreadChecker.checkIsOnValidThread();
-    Logging.d(TAG, "initDecodeInternal");
-    if (outputThread != null) {
-      Logging.e(TAG, "initDecodeInternal called while the codec is already running");
-      return VideoCodecStatus.ERROR;
-    }
-
-    // Note:  it is not necessary to initialize dimensions under the lock, since the output thread
-    // is not running.
-    this.width = width;
-    this.height = height;
-
-    stride = width;
-    sliceHeight = height;
-    hasDecodedFirstFrame = false;
-    keyFrameRequired = true;
-
-    try {
-      codec = MediaCodec.createByCodecName(codecName);
-    } catch (IOException | IllegalArgumentException e) {
-      Logging.e(TAG, "Cannot create media decoder " + codecName);
-      return VideoCodecStatus.ERROR;
-    }
-    try {
-      MediaFormat format = MediaFormat.createVideoFormat(codecType.mimeType(), width, height);
-      if (sharedContext == null) {
-        format.setInteger(MediaFormat.KEY_COLOR_FORMAT, colorFormat);
-      }
-      codec.configure(format, surface, null, 0);
-      codec.start();
-    } catch (IllegalStateException e) {
-      Logging.e(TAG, "initDecode failed", e);
-      release();
-      return VideoCodecStatus.ERROR;
-    }
-    running = true;
-    outputThread = createOutputThread();
-    outputThread.start();
-
-    Logging.d(TAG, "initDecodeInternal done");
-    return VideoCodecStatus.OK;
-  }
-
-  @Override
-  public VideoCodecStatus decode(EncodedImage frame, DecodeInfo info) {
-    decoderThreadChecker.checkIsOnValidThread();
-    if (codec == null || callback == null) {
-      Logging.d(TAG, "decode uninitalized, codec: " + codec + ", callback: " + callback);
-      return VideoCodecStatus.UNINITIALIZED;
-    }
-
-    if (frame.buffer == null) {
-      Logging.e(TAG, "decode() - no input data");
-      return VideoCodecStatus.ERR_PARAMETER;
-    }
-
-    int size = frame.buffer.remaining();
-    if (size == 0) {
-      Logging.e(TAG, "decode() - input buffer empty");
-      return VideoCodecStatus.ERR_PARAMETER;
-    }
-
-    // Load dimensions from shared memory under the dimension lock.
-    int width, height;
-    synchronized (dimensionLock) {
-      width = this.width;
-      height = this.height;
-    }
-
-    // Check if the resolution changed and reset the codec if necessary.
-    if (frame.encodedWidth * frame.encodedHeight > 0
-        && (frame.encodedWidth != width || frame.encodedHeight != height)) {
-      VideoCodecStatus status = reinitDecode(frame.encodedWidth, frame.encodedHeight);
-      if (status != VideoCodecStatus.OK) {
-        return status;
-      }
-    }
-
-    if (keyFrameRequired) {
-      // Need to process a key frame first.
-      if (frame.frameType != EncodedImage.FrameType.VideoFrameKey) {
-        Logging.e(TAG, "decode() - key frame required first");
-        return VideoCodecStatus.ERROR;
-      }
-      if (!frame.completeFrame) {
-        Logging.e(TAG, "decode() - complete frame required first");
-        return VideoCodecStatus.ERROR;
-      }
-    }
-
-    int index;
-    try {
-      index = codec.dequeueInputBuffer(DEQUEUE_INPUT_TIMEOUT_US);
-    } catch (IllegalStateException e) {
-      Logging.e(TAG, "dequeueInputBuffer failed", e);
-      return VideoCodecStatus.ERROR;
-    }
-    if (index < 0) {
-      // Decoder is falling behind.  No input buffers available.
-      // The decoder can't simply drop frames; it might lose a key frame.
-      Logging.e(TAG, "decode() - no HW buffers available; decoder falling behind");
-      return VideoCodecStatus.ERROR;
-    }
-
-    ByteBuffer buffer;
-    try {
-      buffer = codec.getInputBuffers()[index];
-    } catch (IllegalStateException e) {
-      Logging.e(TAG, "getInputBuffers failed", e);
-      return VideoCodecStatus.ERROR;
-    }
-
-    if (buffer.capacity() < size) {
-      Logging.e(TAG, "decode() - HW buffer too small");
-      return VideoCodecStatus.ERROR;
-    }
-    buffer.put(frame.buffer);
-
-    frameInfos.offer(new FrameInfo(SystemClock.elapsedRealtime(), frame.rotation));
-    try {
-      codec.queueInputBuffer(index, 0 /* offset */, size,
-          TimeUnit.NANOSECONDS.toMicros(frame.captureTimeNs), 0 /* flags */);
-    } catch (IllegalStateException e) {
-      Logging.e(TAG, "queueInputBuffer failed", e);
-      frameInfos.pollLast();
-      return VideoCodecStatus.ERROR;
-    }
-    if (keyFrameRequired) {
-      keyFrameRequired = false;
-    }
-    return VideoCodecStatus.OK;
-  }
-
-  @Override
-  public boolean getPrefersLateDecoding() {
-    return true;
-  }
-
-  @Override
-  public String getImplementationName() {
-    return "HardwareVideoDecoder: " + codecName;
-  }
-
-  @Override
-  public VideoCodecStatus release() {
-    // TODO(sakal): This is not called on the correct thread but is still called synchronously.
-    // Re-enable the check once this is called on the correct thread.
-    // decoderThreadChecker.checkIsOnValidThread();
-    Logging.d(TAG, "release");
-    VideoCodecStatus status = releaseInternal();
-    if (surface != null) {
-      surface.release();
-      surface = null;
-      surfaceTextureHelper.stopListening();
-      surfaceTextureHelper.dispose();
-      surfaceTextureHelper = null;
-    }
-    callback = null;
-    frameInfos.clear();
-    return status;
-  }
-
-  // Internal variant is used when restarting the codec due to reconfiguration.
-  private VideoCodecStatus releaseInternal() {
-    if (!running) {
-      Logging.d(TAG, "release: Decoder is not running.");
-      return VideoCodecStatus.OK;
-    }
-    try {
-      // The outputThread actually stops and releases the codec once running is false.
-      running = false;
-      if (!ThreadUtils.joinUninterruptibly(outputThread, MEDIA_CODEC_RELEASE_TIMEOUT_MS)) {
-        // Log an exception to capture the stack trace and turn it into a TIMEOUT error.
-        Logging.e(TAG, "Media decoder release timeout", new RuntimeException());
-        return VideoCodecStatus.TIMEOUT;
-      }
-      if (shutdownException != null) {
-        // Log the exception and turn it into an error.  Wrap the exception in a new exception to
-        // capture both the output thread's stack trace and this thread's stack trace.
-        Logging.e(TAG, "Media decoder release error", new RuntimeException(shutdownException));
-        shutdownException = null;
-        return VideoCodecStatus.ERROR;
-      }
-    } finally {
-      codec = null;
-      outputThread = null;
-    }
-    return VideoCodecStatus.OK;
-  }
-
-  private VideoCodecStatus reinitDecode(int newWidth, int newHeight) {
-    decoderThreadChecker.checkIsOnValidThread();
-    VideoCodecStatus status = releaseInternal();
-    if (status != VideoCodecStatus.OK) {
-      return status;
-    }
-    return initDecodeInternal(newWidth, newHeight);
-  }
-
-  private Thread createOutputThread() {
-    return new Thread("HardwareVideoDecoder.outputThread") {
-      @Override
-      public void run() {
-        outputThreadChecker = new ThreadChecker();
-        while (running) {
-          deliverDecodedFrame();
-        }
-        releaseCodecOnOutputThread();
-      }
-    };
-  }
-
-  private void deliverDecodedFrame() {
-    outputThreadChecker.checkIsOnValidThread();
-    try {
-      MediaCodec.BufferInfo info = new MediaCodec.BufferInfo();
-      // Block until an output buffer is available (up to 100 milliseconds).  If the timeout is
-      // exceeded, deliverDecodedFrame() will be called again on the next iteration of the output
-      // thread's loop.  Blocking here prevents the output thread from busy-waiting while the codec
-      // is idle.
-      int result = codec.dequeueOutputBuffer(info, DEQUEUE_OUTPUT_BUFFER_TIMEOUT_US);
-      if (result == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) {
-        reformat(codec.getOutputFormat());
-        return;
-      }
-
-      if (result < 0) {
-        Logging.v(TAG, "dequeueOutputBuffer returned " + result);
-        return;
-      }
-
-      FrameInfo frameInfo = frameInfos.poll();
-      Integer decodeTimeMs = null;
-      int rotation = 0;
-      if (frameInfo != null) {
-        decodeTimeMs = (int) (SystemClock.elapsedRealtime() - frameInfo.decodeStartTimeMs);
-        rotation = frameInfo.rotation;
-      }
-
-      hasDecodedFirstFrame = true;
-
-      if (surfaceTextureHelper != null) {
-        deliverTextureFrame(result, info, rotation, decodeTimeMs);
-      } else {
-        deliverByteFrame(result, info, rotation, decodeTimeMs);
-      }
-
-    } catch (IllegalStateException e) {
-      Logging.e(TAG, "deliverDecodedFrame failed", e);
-    }
-  }
-
-  private void deliverTextureFrame(final int index, final MediaCodec.BufferInfo info,
-      final int rotation, final Integer decodeTimeMs) {
-    // Load dimensions from shared memory under the dimension lock.
-    final int width, height;
-    synchronized (dimensionLock) {
-      width = this.width;
-      height = this.height;
-    }
-
-    surfaceTextureHelper.getHandler().post(new Runnable() {
-      @Override
-      public void run() {
-        renderedTextureMetadata = new DecodedTextureMetadata(
-            width, height, rotation, info.presentationTimeUs, decodeTimeMs);
-        codec.releaseOutputBuffer(index, true);
-      }
-    });
-  }
-
-  @Override
-  public void onTextureFrameAvailable(int oesTextureId, float[] transformMatrix, long timestampNs) {
-    VideoFrame.TextureBuffer oesBuffer = surfaceTextureHelper.createTextureBuffer(
-        renderedTextureMetadata.width, renderedTextureMetadata.height,
-        RendererCommon.convertMatrixToAndroidGraphicsMatrix(transformMatrix));
-
-    VideoFrame frame = new VideoFrame(oesBuffer, renderedTextureMetadata.rotation,
-        renderedTextureMetadata.presentationTimestampUs * 1000);
-    callback.onDecodedFrame(frame, renderedTextureMetadata.decodeTimeMs, null /* qp */);
-    frame.release();
-  }
-
-  private void deliverByteFrame(
-      int result, MediaCodec.BufferInfo info, int rotation, Integer decodeTimeMs) {
-    // Load dimensions from shared memory under the dimension lock.
-    int width, height, stride, sliceHeight;
-    synchronized (dimensionLock) {
-      width = this.width;
-      height = this.height;
-      stride = this.stride;
-      sliceHeight = this.sliceHeight;
-    }
-
-    // Output must be at least width * height bytes for Y channel, plus (width / 2) * (height / 2)
-    // bytes for each of the U and V channels.
-    if (info.size < width * height * 3 / 2) {
-      Logging.e(TAG, "Insufficient output buffer size: " + info.size);
-      return;
-    }
-
-    if (info.size < stride * height * 3 / 2 && sliceHeight == height && stride > width) {
-      // Some codecs (Exynos) report an incorrect stride.  Correct it here.
-      // Expected size == stride * height * 3 / 2.  A bit of algebra gives the correct stride as
-      // 2 * size / (3 * height).
-      stride = info.size * 2 / (height * 3);
-    }
-
-    ByteBuffer buffer = codec.getOutputBuffers()[result];
-    buffer.position(info.offset);
-    buffer.limit(info.offset + info.size);
-    buffer = buffer.slice();
-    final VideoFrame.Buffer frameBuffer;
-
-    if (colorFormat == CodecCapabilities.COLOR_FormatYUV420Planar) {
-      if (sliceHeight % 2 == 0) {
-        frameBuffer = wrapI420Buffer(buffer, result, stride, sliceHeight, width, height);
-      } else {
-        // WebRTC rounds chroma plane size conversions up so we have to repeat the last row.
-        frameBuffer = copyI420Buffer(buffer, result, stride, sliceHeight, width, height);
-      }
-    } else {
-      // All other supported color formats are NV12.
-      frameBuffer = wrapNV12Buffer(buffer, result, stride, sliceHeight, width, height);
-    }
-
-    long presentationTimeNs = info.presentationTimeUs * 1000;
-    VideoFrame frame = new VideoFrame(frameBuffer, rotation, presentationTimeNs);
-
-    // Note that qp is parsed on the C++ side.
-    callback.onDecodedFrame(frame, decodeTimeMs, null /* qp */);
-    frame.release();
-  }
-
-  private VideoFrame.Buffer wrapNV12Buffer(ByteBuffer buffer, int outputBufferIndex, int stride,
-      int sliceHeight, int width, int height) {
-    synchronized (activeOutputBuffersLock) {
-      activeOutputBuffers++;
-    }
-
-    return new NV12Buffer(width, height, stride, sliceHeight, buffer, () -> {
-      codec.releaseOutputBuffer(outputBufferIndex, false);
-      synchronized (activeOutputBuffersLock) {
-        activeOutputBuffers--;
-        activeOutputBuffersLock.notifyAll();
-      }
-    });
-  }
-
-  private VideoFrame.Buffer copyI420Buffer(ByteBuffer buffer, int outputBufferIndex, int stride,
-      int sliceHeight, int width, int height) {
-    final int uvStride = stride / 2;
-
-    final int yPos = 0;
-    final int uPos = yPos + stride * sliceHeight;
-    final int uEnd = uPos + uvStride * (sliceHeight / 2);
-    final int vPos = uPos + uvStride * sliceHeight / 2;
-    final int vEnd = vPos + uvStride * (sliceHeight / 2);
-
-    VideoFrame.I420Buffer frameBuffer = I420BufferImpl.allocate(width, height);
-
-    ByteBuffer dataY = frameBuffer.getDataY();
-    dataY.position(0); // Ensure we are in the beginning.
-    buffer.position(yPos);
-    buffer.limit(uPos);
-    dataY.put(buffer);
-    dataY.position(0); // Go back to beginning.
-
-    ByteBuffer dataU = frameBuffer.getDataU();
-    dataU.position(0); // Ensure we are in the beginning.
-    buffer.position(uPos);
-    buffer.limit(uEnd);
-    dataU.put(buffer);
-    if (sliceHeight % 2 != 0) {
-      buffer.position(uEnd - uvStride); // Repeat the last row.
-      dataU.put(buffer);
-    }
-    dataU.position(0); // Go back to beginning.
-
-    ByteBuffer dataV = frameBuffer.getDataU();
-    dataV.position(0); // Ensure we are in the beginning.
-    buffer.position(vPos);
-    buffer.limit(vEnd);
-    dataV.put(buffer);
-    if (sliceHeight % 2 != 0) {
-      buffer.position(vEnd - uvStride); // Repeat the last row.
-      dataV.put(buffer);
-    }
-    dataV.position(0); // Go back to beginning.
-
-    codec.releaseOutputBuffer(outputBufferIndex, false);
-
-    return frameBuffer;
-  }
-
-  private VideoFrame.Buffer wrapI420Buffer(ByteBuffer buffer, int outputBufferIndex, int stride,
-      int sliceHeight, int width, int height) {
-    final int uvStride = stride / 2;
-
-    final int yPos = 0;
-    final int uPos = yPos + stride * sliceHeight;
-    final int uEnd = uPos + uvStride * (sliceHeight / 2);
-    final int vPos = uPos + uvStride * sliceHeight / 2;
-    final int vEnd = vPos + uvStride * (sliceHeight / 2);
-
-    synchronized (activeOutputBuffersLock) {
-      activeOutputBuffers++;
-    }
-
-    Runnable releaseCallback = () -> {
-      codec.releaseOutputBuffer(outputBufferIndex, false);
-      synchronized (activeOutputBuffersLock) {
-        activeOutputBuffers--;
-        activeOutputBuffersLock.notifyAll();
-      }
-    };
-
-    buffer.position(yPos);
-    buffer.limit(uPos);
-    ByteBuffer dataY = buffer.slice();
-
-    buffer.position(uPos);
-    buffer.limit(uEnd);
-    ByteBuffer dataU = buffer.slice();
-
-    buffer.position(vPos);
-    buffer.limit(vEnd);
-    ByteBuffer dataV = buffer.slice();
-
-    return new I420BufferImpl(
-        width, height, dataY, stride, dataU, uvStride, dataV, uvStride, releaseCallback);
-  }
-
-  private void reformat(MediaFormat format) {
-    outputThreadChecker.checkIsOnValidThread();
-    Logging.d(TAG, "Decoder format changed: " + format.toString());
-    final int newWidth;
-    final int newHeight;
-    if (format.containsKey(MEDIA_FORMAT_KEY_CROP_LEFT)
-        && format.containsKey(MEDIA_FORMAT_KEY_CROP_RIGHT)
-        && format.containsKey(MEDIA_FORMAT_KEY_CROP_BOTTOM)
-        && format.containsKey(MEDIA_FORMAT_KEY_CROP_TOP)) {
-      newWidth = 1 + format.getInteger(MEDIA_FORMAT_KEY_CROP_RIGHT)
-          - format.getInteger(MEDIA_FORMAT_KEY_CROP_LEFT);
-      newHeight = 1 + format.getInteger(MEDIA_FORMAT_KEY_CROP_BOTTOM)
-          - format.getInteger(MEDIA_FORMAT_KEY_CROP_TOP);
-    } else {
-      newWidth = format.getInteger(MediaFormat.KEY_WIDTH);
-      newHeight = format.getInteger(MediaFormat.KEY_HEIGHT);
-    }
-    // Compare to existing width, height, and save values under the dimension lock.
-    synchronized (dimensionLock) {
-      if (hasDecodedFirstFrame && (width != newWidth || height != newHeight)) {
-        stopOnOutputThread(new RuntimeException("Unexpected size change. Configured " + width + "*"
-            + height + ". New " + newWidth + "*" + newHeight));
-        return;
-      }
-      width = newWidth;
-      height = newHeight;
-    }
-
-    // Note:  texture mode ignores colorFormat.  Hence, if the texture helper is non-null, skip
-    // color format updates.
-    if (surfaceTextureHelper == null && format.containsKey(MediaFormat.KEY_COLOR_FORMAT)) {
-      colorFormat = format.getInteger(MediaFormat.KEY_COLOR_FORMAT);
-      Logging.d(TAG, "Color: 0x" + Integer.toHexString(colorFormat));
-      if (!isSupportedColorFormat(colorFormat)) {
-        stopOnOutputThread(new IllegalStateException("Unsupported color format: " + colorFormat));
-        return;
-      }
-    }
-
-    // Save stride and sliceHeight under the dimension lock.
-    synchronized (dimensionLock) {
-      if (format.containsKey(MEDIA_FORMAT_KEY_STRIDE)) {
-        stride = format.getInteger(MEDIA_FORMAT_KEY_STRIDE);
-      }
-      if (format.containsKey(MEDIA_FORMAT_KEY_SLICE_HEIGHT)) {
-        sliceHeight = format.getInteger(MEDIA_FORMAT_KEY_SLICE_HEIGHT);
-      }
-      Logging.d(TAG, "Frame stride and slice height: " + stride + " x " + sliceHeight);
-      stride = Math.max(width, stride);
-      sliceHeight = Math.max(height, sliceHeight);
-    }
-  }
-
-  private void releaseCodecOnOutputThread() {
-    outputThreadChecker.checkIsOnValidThread();
-    Logging.d(TAG, "Releasing MediaCodec on output thread");
-    waitOutputBuffersReleasedOnOutputThread();
-    try {
-      codec.stop();
-    } catch (Exception e) {
-      Logging.e(TAG, "Media decoder stop failed", e);
-    }
-    try {
-      codec.release();
-    } catch (Exception e) {
-      Logging.e(TAG, "Media decoder release failed", e);
-      // Propagate exceptions caught during release back to the main thread.
-      shutdownException = e;
-    }
-    Logging.d(TAG, "Release on output thread done");
-  }
-
-  private void waitOutputBuffersReleasedOnOutputThread() {
-    outputThreadChecker.checkIsOnValidThread();
-    synchronized (activeOutputBuffersLock) {
-      while (activeOutputBuffers > 0) {
-        Logging.d(TAG, "Waiting for all frames to be released.");
-        try {
-          activeOutputBuffersLock.wait();
-        } catch (InterruptedException e) {
-          Logging.e(TAG, "Interrupted while waiting for output buffers to be released.", e);
-          return;
-        }
-      }
-    }
-  }
-
-  private void stopOnOutputThread(Exception e) {
-    outputThreadChecker.checkIsOnValidThread();
-    running = false;
-    shutdownException = e;
-  }
-
-  private boolean isSupportedColorFormat(int colorFormat) {
-    for (int supported : MediaCodecUtils.DECODER_COLOR_FORMATS) {
-      if (supported == colorFormat) {
-        return true;
-      }
-    }
-    return false;
-  }
-}
diff --git a/sdk/android/src/java/org/webrtc/HardwareVideoEncoder.java b/sdk/android/src/java/org/webrtc/HardwareVideoEncoder.java
deleted file mode 100644
index f3be4cb..0000000
--- a/sdk/android/src/java/org/webrtc/HardwareVideoEncoder.java
+++ /dev/null
@@ -1,581 +0,0 @@
-/*
- *  Copyright 2017 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.
- */
-
-package org.webrtc;
-
-import android.annotation.TargetApi;
-import android.graphics.Matrix;
-import android.media.MediaCodec;
-import android.media.MediaCodecInfo;
-import android.media.MediaFormat;
-import android.opengl.GLES20;
-import android.os.Bundle;
-import android.view.Surface;
-import java.io.IOException;
-import java.nio.ByteBuffer;
-import java.util.Deque;
-import java.util.Map;
-import java.util.concurrent.LinkedBlockingDeque;
-import java.util.concurrent.TimeUnit;
-
-/** Android hardware video encoder. */
-@TargetApi(19)
-@SuppressWarnings("deprecation") // Cannot support API level 19 without using deprecated methods.
-class HardwareVideoEncoder implements VideoEncoder {
-  private static final String TAG = "HardwareVideoEncoder";
-
-  // Bitrate modes - should be in sync with OMX_VIDEO_CONTROLRATETYPE defined
-  // in OMX_Video.h
-  private static final int VIDEO_ControlRateConstant = 2;
-  // Key associated with the bitrate control mode value (above). Not present as a MediaFormat
-  // constant until API level 21.
-  private static final String KEY_BITRATE_MODE = "bitrate-mode";
-
-  private static final int VIDEO_AVC_PROFILE_HIGH = 8;
-  private static final int VIDEO_AVC_LEVEL_3 = 0x100;
-
-  private static final int MAX_VIDEO_FRAMERATE = 30;
-
-  // See MAX_ENCODER_Q_SIZE in androidmediaencoder_jni.cc.
-  private static final int MAX_ENCODER_Q_SIZE = 2;
-
-  private static final int MEDIA_CODEC_RELEASE_TIMEOUT_MS = 5000;
-  private static final int DEQUEUE_OUTPUT_BUFFER_TIMEOUT_US = 100000;
-
-  private final String codecName;
-  private final VideoCodecType codecType;
-  private final int colorFormat;
-  private final Map<String, String> params;
-  private final ColorFormat inputColorFormat;
-  // Base interval for generating key frames.
-  private final int keyFrameIntervalSec;
-  // Interval at which to force a key frame. Used to reduce color distortions caused by some
-  // Qualcomm video encoders.
-  private final long forcedKeyFrameNs;
-  // Presentation timestamp of the last requested (or forced) key frame.
-  private long lastKeyFrameNs;
-
-  private final BitrateAdjuster bitrateAdjuster;
-  private int adjustedBitrate;
-
-  // A queue of EncodedImage.Builders that correspond to frames in the codec.  These builders are
-  // pre-populated with all the information that can't be sent through MediaCodec.
-  private final Deque<EncodedImage.Builder> outputBuilders;
-
-  // Thread that delivers encoded frames to the user callback.
-  private Thread outputThread;
-
-  // Whether the encoder is running.  Volatile so that the output thread can watch this value and
-  // exit when the encoder stops.
-  private volatile boolean running = false;
-  // Any exception thrown during shutdown.  The output thread releases the MediaCodec and uses this
-  // value to send exceptions thrown during release back to the encoder thread.
-  private volatile Exception shutdownException = null;
-
-  // Surface objects for texture-mode encoding.
-
-  // EGL context shared with the application.  Used to access texture inputs.
-  private EglBase14.Context textureContext;
-  // EGL base wrapping the shared texture context.  Holds hooks to both the shared context and the
-  // input surface.  Making this base current allows textures from the context to be drawn onto the
-  // surface.
-  private EglBase14 textureEglBase;
-  // Input surface for the codec.  The encoder will draw input textures onto this surface.
-  private Surface textureInputSurface;
-  // Drawer used to draw input textures onto the codec's input surface.
-  private GlRectDrawer textureDrawer;
-
-  private MediaCodec codec;
-  private Callback callback;
-
-  private boolean automaticResizeOn;
-  private int width;
-  private int height;
-
-  // Contents of the last observed config frame output by the MediaCodec. Used by H.264.
-  private ByteBuffer configBuffer = null;
-
-  /**
-   * Creates a new HardwareVideoEncoder with the given codecName, codecType, colorFormat, key frame
-   * intervals, and bitrateAdjuster.
-   *
-   * @param codecName the hardware codec implementation to use
-   * @param codecType the type of the given video codec (eg. VP8, VP9, or H264)
-   * @param colorFormat color format used by the input buffer
-   * @param keyFrameIntervalSec interval in seconds between key frames; used to initialize the codec
-   * @param forceKeyFrameIntervalMs interval at which to force a key frame if one is not requested;
-   *     used to reduce distortion caused by some codec implementations
-   * @param bitrateAdjuster algorithm used to correct codec implementations that do not produce the
-   *     desired bitrates
-   * @throws IllegalArgumentException if colorFormat is unsupported
-   */
-  public HardwareVideoEncoder(String codecName, VideoCodecType codecType, int colorFormat,
-      Map<String, String> params, int keyFrameIntervalSec, int forceKeyFrameIntervalMs,
-      BitrateAdjuster bitrateAdjuster, EglBase14.Context textureContext) {
-    this.codecName = codecName;
-    this.codecType = codecType;
-    this.colorFormat = colorFormat;
-    this.params = params;
-    if (textureContext == null) {
-      this.inputColorFormat = ColorFormat.valueOf(colorFormat);
-    } else {
-      // ColorFormat copies bytes between buffers.  It is not used in texture mode.
-      this.inputColorFormat = null;
-    }
-    this.keyFrameIntervalSec = keyFrameIntervalSec;
-    this.forcedKeyFrameNs = TimeUnit.MILLISECONDS.toNanos(forceKeyFrameIntervalMs);
-    this.bitrateAdjuster = bitrateAdjuster;
-    this.outputBuilders = new LinkedBlockingDeque<>();
-    this.textureContext = textureContext;
-  }
-
-  @Override
-  public VideoCodecStatus initEncode(Settings settings, Callback callback) {
-    automaticResizeOn = settings.automaticResizeOn;
-
-    return initEncodeInternal(
-        settings.width, settings.height, settings.startBitrate, settings.maxFramerate, callback);
-  }
-
-  private VideoCodecStatus initEncodeInternal(
-      int width, int height, int bitrateKbps, int fps, Callback callback) {
-    Logging.d(
-        TAG, "initEncode: " + width + " x " + height + ". @ " + bitrateKbps + "kbps. Fps: " + fps);
-    this.width = width;
-    this.height = height;
-    if (bitrateKbps != 0 && fps != 0) {
-      bitrateAdjuster.setTargets(bitrateKbps * 1000, fps);
-    }
-    adjustedBitrate = bitrateAdjuster.getAdjustedBitrateBps();
-
-    this.callback = callback;
-
-    lastKeyFrameNs = -1;
-
-    try {
-      codec = MediaCodec.createByCodecName(codecName);
-    } catch (IOException | IllegalArgumentException e) {
-      Logging.e(TAG, "Cannot create media encoder " + codecName);
-      return VideoCodecStatus.ERROR;
-    }
-    try {
-      MediaFormat format = MediaFormat.createVideoFormat(codecType.mimeType(), width, height);
-      format.setInteger(MediaFormat.KEY_BIT_RATE, adjustedBitrate);
-      format.setInteger(KEY_BITRATE_MODE, VIDEO_ControlRateConstant);
-      format.setInteger(MediaFormat.KEY_COLOR_FORMAT, colorFormat);
-      format.setInteger(MediaFormat.KEY_FRAME_RATE, bitrateAdjuster.getAdjustedFramerate());
-      format.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, keyFrameIntervalSec);
-      if (codecType == VideoCodecType.H264) {
-        String profileLevelId = params.get(VideoCodecInfo.H264_FMTP_PROFILE_LEVEL_ID);
-        if (profileLevelId == null) {
-          profileLevelId = VideoCodecInfo.H264_CONSTRAINED_BASELINE_3_1;
-        }
-        switch (profileLevelId) {
-          case VideoCodecInfo.H264_CONSTRAINED_HIGH_3_1:
-            format.setInteger("profile", VIDEO_AVC_PROFILE_HIGH);
-            format.setInteger("level", VIDEO_AVC_LEVEL_3);
-            break;
-          case VideoCodecInfo.H264_CONSTRAINED_BASELINE_3_1:
-            break;
-          default:
-            Logging.w(TAG, "Unknown profile level id: " + profileLevelId);
-        }
-      }
-      Logging.d(TAG, "Format: " + format);
-      codec.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
-
-      if (textureContext != null) {
-        // Texture mode.
-        textureEglBase = new EglBase14(textureContext, EglBase.CONFIG_RECORDABLE);
-        textureInputSurface = codec.createInputSurface();
-        textureEglBase.createSurface(textureInputSurface);
-        textureDrawer = new GlRectDrawer();
-      }
-
-      codec.start();
-    } catch (IllegalStateException e) {
-      Logging.e(TAG, "initEncode failed", e);
-      release();
-      return VideoCodecStatus.ERROR;
-    }
-
-    running = true;
-    outputThread = createOutputThread();
-    outputThread.start();
-
-    return VideoCodecStatus.OK;
-  }
-
-  @Override
-  public VideoCodecStatus release() {
-    try {
-      if (outputThread == null) {
-        return VideoCodecStatus.OK;
-      }
-      // The outputThread actually stops and releases the codec once running is false.
-      running = false;
-      if (!ThreadUtils.joinUninterruptibly(outputThread, MEDIA_CODEC_RELEASE_TIMEOUT_MS)) {
-        Logging.e(TAG, "Media encoder release timeout");
-        return VideoCodecStatus.TIMEOUT;
-      }
-      if (shutdownException != null) {
-        // Log the exception and turn it into an error.
-        Logging.e(TAG, "Media encoder release exception", shutdownException);
-        return VideoCodecStatus.ERROR;
-      }
-    } finally {
-      codec = null;
-      outputThread = null;
-      outputBuilders.clear();
-
-      if (textureDrawer != null) {
-        textureDrawer.release();
-        textureDrawer = null;
-      }
-      if (textureEglBase != null) {
-        textureEglBase.release();
-        textureEglBase = null;
-      }
-      if (textureInputSurface != null) {
-        textureInputSurface.release();
-        textureInputSurface = null;
-      }
-    }
-    return VideoCodecStatus.OK;
-  }
-
-  @Override
-  public VideoCodecStatus encode(VideoFrame videoFrame, EncodeInfo encodeInfo) {
-    if (codec == null) {
-      return VideoCodecStatus.UNINITIALIZED;
-    }
-
-    // If input resolution changed, restart the codec with the new resolution.
-    int frameWidth = videoFrame.getBuffer().getWidth();
-    int frameHeight = videoFrame.getBuffer().getHeight();
-    if (frameWidth != width || frameHeight != height) {
-      VideoCodecStatus status = resetCodec(frameWidth, frameHeight);
-      if (status != VideoCodecStatus.OK) {
-        return status;
-      }
-    }
-
-    if (outputBuilders.size() > MAX_ENCODER_Q_SIZE) {
-      // Too many frames in the encoder.  Drop this frame.
-      Logging.e(TAG, "Dropped frame, encoder queue full");
-      return VideoCodecStatus.OK; // See webrtc bug 2887.
-    }
-
-    boolean requestedKeyFrame = false;
-    for (EncodedImage.FrameType frameType : encodeInfo.frameTypes) {
-      if (frameType == EncodedImage.FrameType.VideoFrameKey) {
-        requestedKeyFrame = true;
-      }
-    }
-
-    if (requestedKeyFrame || shouldForceKeyFrame(videoFrame.getTimestampNs())) {
-      requestKeyFrame(videoFrame.getTimestampNs());
-    }
-
-    VideoFrame.Buffer videoFrameBuffer = videoFrame.getBuffer();
-    // Number of bytes in the video buffer. Y channel is sampled at one byte per pixel; U and V are
-    // subsampled at one byte per four pixels.
-    int bufferSize = videoFrameBuffer.getHeight() * videoFrameBuffer.getWidth() * 3 / 2;
-    EncodedImage.Builder builder = EncodedImage.builder()
-                                       .setCaptureTimeNs(videoFrame.getTimestampNs())
-                                       .setCompleteFrame(true)
-                                       .setEncodedWidth(videoFrame.getBuffer().getWidth())
-                                       .setEncodedHeight(videoFrame.getBuffer().getHeight())
-                                       .setRotation(videoFrame.getRotation());
-    outputBuilders.offer(builder);
-
-    if (textureContext != null) {
-      if (!(videoFrameBuffer instanceof VideoFrame.TextureBuffer)) {
-        Logging.e(TAG, "Cannot encode non-texture buffer in texture mode");
-        return VideoCodecStatus.ERROR;
-      }
-      VideoFrame.TextureBuffer textureBuffer = (VideoFrame.TextureBuffer) videoFrameBuffer;
-      return encodeTextureBuffer(videoFrame, textureBuffer);
-    } else {
-      if (videoFrameBuffer instanceof VideoFrame.TextureBuffer) {
-        Logging.w(TAG, "Encoding texture buffer in byte mode; this may be inefficient");
-      }
-      return encodeByteBuffer(videoFrame, videoFrameBuffer, bufferSize);
-    }
-  }
-
-  private VideoCodecStatus encodeTextureBuffer(
-      VideoFrame videoFrame, VideoFrame.TextureBuffer textureBuffer) {
-    Matrix matrix = textureBuffer.getTransformMatrix();
-    float[] transformationMatrix = RendererCommon.convertMatrixFromAndroidGraphicsMatrix(matrix);
-
-    try {
-      textureEglBase.makeCurrent();
-      // TODO(perkj): glClear() shouldn't be necessary since every pixel is covered anyway,
-      // but it's a workaround for bug webrtc:5147.
-      GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
-      switch (textureBuffer.getType()) {
-        case OES:
-          textureDrawer.drawOes(textureBuffer.getTextureId(), transformationMatrix, width, height,
-              0, 0, width, height);
-          break;
-        case RGB:
-          textureDrawer.drawRgb(textureBuffer.getTextureId(), transformationMatrix, width, height,
-              0, 0, width, height);
-          break;
-      }
-      textureEglBase.swapBuffers(videoFrame.getTimestampNs());
-    } catch (RuntimeException e) {
-      Logging.e(TAG, "encodeTexture failed", e);
-      // Keep the output builders in sync with buffers in the codec.
-      outputBuilders.pollLast();
-      return VideoCodecStatus.ERROR;
-    }
-    return VideoCodecStatus.OK;
-  }
-
-  private VideoCodecStatus encodeByteBuffer(
-      VideoFrame videoFrame, VideoFrame.Buffer videoFrameBuffer, int bufferSize) {
-    // Frame timestamp rounded to the nearest microsecond.
-    long presentationTimestampUs = (videoFrame.getTimestampNs() + 500) / 1000;
-
-    // No timeout.  Don't block for an input buffer, drop frames if the encoder falls behind.
-    int index;
-    try {
-      index = codec.dequeueInputBuffer(0 /* timeout */);
-    } catch (IllegalStateException e) {
-      Logging.e(TAG, "dequeueInputBuffer failed", e);
-      return VideoCodecStatus.FALLBACK_SOFTWARE;
-    }
-
-    if (index == -1) {
-      // Encoder is falling behind.  No input buffers available.  Drop the frame.
-      Logging.e(TAG, "Dropped frame, no input buffers available");
-      return VideoCodecStatus.OK; // See webrtc bug 2887.
-    }
-
-    ByteBuffer buffer;
-    try {
-      buffer = codec.getInputBuffers()[index];
-    } catch (IllegalStateException e) {
-      Logging.e(TAG, "getInputBuffers failed", e);
-      return VideoCodecStatus.ERROR;
-    }
-    VideoFrame.I420Buffer i420 = videoFrameBuffer.toI420();
-    inputColorFormat.fillBufferFromI420(buffer, i420);
-    i420.release();
-
-    try {
-      codec.queueInputBuffer(
-          index, 0 /* offset */, bufferSize, presentationTimestampUs, 0 /* flags */);
-    } catch (IllegalStateException e) {
-      Logging.e(TAG, "queueInputBuffer failed", e);
-      // Keep the output builders in sync with buffers in the codec.
-      outputBuilders.pollLast();
-      // IllegalStateException thrown when the codec is in the wrong state.
-      return VideoCodecStatus.ERROR;
-    }
-    return VideoCodecStatus.OK;
-  }
-
-  @Override
-  public VideoCodecStatus setChannelParameters(short packetLoss, long roundTripTimeMs) {
-    // No op.
-    return VideoCodecStatus.OK;
-  }
-
-  @Override
-  public VideoCodecStatus setRateAllocation(BitrateAllocation bitrateAllocation, int framerate) {
-    if (framerate > MAX_VIDEO_FRAMERATE) {
-      framerate = MAX_VIDEO_FRAMERATE;
-    }
-    bitrateAdjuster.setTargets(bitrateAllocation.getSum(), framerate);
-    return updateBitrate();
-  }
-
-  @Override
-  public ScalingSettings getScalingSettings() {
-    return new ScalingSettings(automaticResizeOn);
-  }
-
-  @Override
-  public String getImplementationName() {
-    return "HardwareVideoEncoder: " + codecName;
-  }
-
-  private VideoCodecStatus resetCodec(int newWidth, int newHeight) {
-    VideoCodecStatus status = release();
-    if (status != VideoCodecStatus.OK) {
-      return status;
-    }
-    // Zero bitrate and framerate indicate not to change the targets.
-    return initEncodeInternal(newWidth, newHeight, 0, 0, callback);
-  }
-
-  private boolean shouldForceKeyFrame(long presentationTimestampNs) {
-    return forcedKeyFrameNs > 0 && presentationTimestampNs > lastKeyFrameNs + forcedKeyFrameNs;
-  }
-
-  private void requestKeyFrame(long presentationTimestampNs) {
-    // Ideally MediaCodec would honor BUFFER_FLAG_SYNC_FRAME so we could
-    // indicate this in queueInputBuffer() below and guarantee _this_ frame
-    // be encoded as a key frame, but sadly that flag is ignored.  Instead,
-    // we request a key frame "soon".
-    try {
-      Bundle b = new Bundle();
-      b.putInt(MediaCodec.PARAMETER_KEY_REQUEST_SYNC_FRAME, 0);
-      codec.setParameters(b);
-    } catch (IllegalStateException e) {
-      Logging.e(TAG, "requestKeyFrame failed", e);
-      return;
-    }
-    lastKeyFrameNs = presentationTimestampNs;
-  }
-
-  private Thread createOutputThread() {
-    return new Thread() {
-      @Override
-      public void run() {
-        while (running) {
-          deliverEncodedImage();
-        }
-        releaseCodecOnOutputThread();
-      }
-    };
-  }
-
-  private void deliverEncodedImage() {
-    try {
-      MediaCodec.BufferInfo info = new MediaCodec.BufferInfo();
-      int index = codec.dequeueOutputBuffer(info, DEQUEUE_OUTPUT_BUFFER_TIMEOUT_US);
-      if (index < 0) {
-        return;
-      }
-
-      ByteBuffer codecOutputBuffer = codec.getOutputBuffers()[index];
-      codecOutputBuffer.position(info.offset);
-      codecOutputBuffer.limit(info.offset + info.size);
-
-      if ((info.flags & MediaCodec.BUFFER_FLAG_CODEC_CONFIG) != 0) {
-        Logging.d(TAG, "Config frame generated. Offset: " + info.offset + ". Size: " + info.size);
-        configBuffer = ByteBuffer.allocateDirect(info.size);
-        configBuffer.put(codecOutputBuffer);
-      } else {
-        bitrateAdjuster.reportEncodedFrame(info.size);
-        if (adjustedBitrate != bitrateAdjuster.getAdjustedBitrateBps()) {
-          updateBitrate();
-        }
-
-        ByteBuffer frameBuffer;
-        boolean isKeyFrame = (info.flags & MediaCodec.BUFFER_FLAG_SYNC_FRAME) != 0;
-        if (isKeyFrame && codecType == VideoCodecType.H264) {
-          Logging.d(TAG,
-              "Prepending config frame of size " + configBuffer.capacity()
-                  + " to output buffer with offset " + info.offset + ", size " + info.size);
-          // For H.264 key frame prepend SPS and PPS NALs at the start.
-          frameBuffer = ByteBuffer.allocateDirect(info.size + configBuffer.capacity());
-          configBuffer.rewind();
-          frameBuffer.put(configBuffer);
-        } else {
-          frameBuffer = ByteBuffer.allocateDirect(info.size);
-        }
-        frameBuffer.put(codecOutputBuffer);
-        frameBuffer.rewind();
-
-        EncodedImage.FrameType frameType = EncodedImage.FrameType.VideoFrameDelta;
-        if (isKeyFrame) {
-          Logging.d(TAG, "Sync frame generated");
-          frameType = EncodedImage.FrameType.VideoFrameKey;
-        }
-        EncodedImage.Builder builder = outputBuilders.poll();
-        builder.setBuffer(frameBuffer).setFrameType(frameType);
-        // TODO(mellem):  Set codec-specific info.
-        callback.onEncodedFrame(builder.createEncodedImage(), new CodecSpecificInfo());
-      }
-      codec.releaseOutputBuffer(index, false);
-    } catch (IllegalStateException e) {
-      Logging.e(TAG, "deliverOutput failed", e);
-    }
-  }
-
-  private void releaseCodecOnOutputThread() {
-    Logging.d(TAG, "Releasing MediaCodec on output thread");
-    try {
-      codec.stop();
-    } catch (Exception e) {
-      Logging.e(TAG, "Media encoder stop failed", e);
-    }
-    try {
-      codec.release();
-    } catch (Exception e) {
-      Logging.e(TAG, "Media encoder release failed", e);
-      // Propagate exceptions caught during release back to the main thread.
-      shutdownException = e;
-    }
-    Logging.d(TAG, "Release on output thread done");
-  }
-
-  private VideoCodecStatus updateBitrate() {
-    adjustedBitrate = bitrateAdjuster.getAdjustedBitrateBps();
-    try {
-      Bundle params = new Bundle();
-      params.putInt(MediaCodec.PARAMETER_KEY_VIDEO_BITRATE, adjustedBitrate);
-      codec.setParameters(params);
-      return VideoCodecStatus.OK;
-    } catch (IllegalStateException e) {
-      Logging.e(TAG, "updateBitrate failed", e);
-      return VideoCodecStatus.ERROR;
-    }
-  }
-
-  /**
-   * Enumeration of supported color formats used for MediaCodec's input.
-   */
-  private static enum ColorFormat {
-    I420 {
-      @Override
-      void fillBufferFromI420(ByteBuffer buffer, VideoFrame.I420Buffer i420) {
-        buffer.put(i420.getDataY());
-        buffer.put(i420.getDataU());
-        buffer.put(i420.getDataV());
-      }
-    },
-    NV12 {
-      @Override
-      void fillBufferFromI420(ByteBuffer buffer, VideoFrame.I420Buffer i420) {
-        buffer.put(i420.getDataY());
-
-        // Interleave the bytes from the U and V portions, starting with U.
-        ByteBuffer u = i420.getDataU();
-        ByteBuffer v = i420.getDataV();
-        int i = 0;
-        while (u.hasRemaining() && v.hasRemaining()) {
-          buffer.put(u.get());
-          buffer.put(v.get());
-        }
-      }
-    };
-
-    abstract void fillBufferFromI420(ByteBuffer buffer, VideoFrame.I420Buffer i420);
-
-    static ColorFormat valueOf(int colorFormat) {
-      switch (colorFormat) {
-        case MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420Planar:
-          return I420;
-        case MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420SemiPlanar:
-        case MediaCodecInfo.CodecCapabilities.COLOR_QCOM_FormatYUV420SemiPlanar:
-        case MediaCodecUtils.COLOR_QCOM_FORMATYUV420PackedSemiPlanar32m:
-          return NV12;
-        default:
-          throw new IllegalArgumentException("Unsupported colorFormat: " + colorFormat);
-      }
-    }
-  }
-}
diff --git a/sdk/android/src/java/org/webrtc/Histogram.java b/sdk/android/src/java/org/webrtc/Histogram.java
deleted file mode 100644
index 8779861..0000000
--- a/sdk/android/src/java/org/webrtc/Histogram.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- *  Copyright 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.
- */
-
-package org.webrtc;
-
-/**
- * Class for holding the native pointer of a histogram. Since there is no way to destroy a
- * histogram, please don't create unnecessary instances of this object. This class is thread safe.
- *
- * Usage example:
- * private static final Histogram someMetricHistogram =
- *     Histogram.createCounts("WebRTC.Video.SomeMetric", 1, 10000, 50);
- * someMetricHistogram.addSample(someVariable);
- */
-class Histogram {
-  private final long handle;
-
-  private Histogram(long handle) {
-    this.handle = handle;
-  }
-
-  static public Histogram createCounts(String name, int min, int max, int bucketCount) {
-    return new Histogram(nativeCreateCounts(name, min, max, bucketCount));
-  }
-
-  static public Histogram createEnumeration(String name, int max) {
-    return new Histogram(nativeCreateEnumeration(name, max));
-  }
-
-  public void addSample(int sample) {
-    nativeAddSample(handle, sample);
-  }
-
-  private static native long nativeCreateCounts(String name, int min, int max, int bucketCount);
-  private static native long nativeCreateEnumeration(String name, int max);
-  private static native void nativeAddSample(long handle, int sample);
-}
diff --git a/sdk/android/src/java/org/webrtc/I420BufferImpl.java b/sdk/android/src/java/org/webrtc/I420BufferImpl.java
deleted file mode 100644
index 2f545e9..0000000
--- a/sdk/android/src/java/org/webrtc/I420BufferImpl.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/*
- *  Copyright 2017 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.
- */
-
-package org.webrtc;
-
-import java.nio.ByteBuffer;
-import org.webrtc.VideoFrame.I420Buffer;
-
-/** Implementation of an I420 VideoFrame buffer. */
-class I420BufferImpl implements VideoFrame.I420Buffer {
-  private final int width;
-  private final int height;
-  private final ByteBuffer dataY;
-  private final ByteBuffer dataU;
-  private final ByteBuffer dataV;
-  private final int strideY;
-  private final int strideU;
-  private final int strideV;
-  private final Runnable releaseCallback;
-  private final Object refCountLock = new Object();
-
-  private int refCount;
-
-  /** Constructs an I420Buffer backed by existing data. */
-  I420BufferImpl(int width, int height, ByteBuffer dataY, int strideY, ByteBuffer dataU,
-      int strideU, ByteBuffer dataV, int strideV, Runnable releaseCallback) {
-    this.width = width;
-    this.height = height;
-    this.dataY = dataY;
-    this.dataU = dataU;
-    this.dataV = dataV;
-    this.strideY = strideY;
-    this.strideU = strideU;
-    this.strideV = strideV;
-    this.releaseCallback = releaseCallback;
-
-    this.refCount = 1;
-  }
-
-  /** Allocates an empty I420Buffer suitable for an image of the given dimensions. */
-  static I420BufferImpl allocate(int width, int height) {
-    int chromaHeight = (height + 1) / 2;
-    int strideUV = (width + 1) / 2;
-    int yPos = 0;
-    int uPos = yPos + width * height;
-    int vPos = uPos + strideUV * chromaHeight;
-
-    ByteBuffer buffer = ByteBuffer.allocateDirect(width * height + 2 * strideUV * chromaHeight);
-
-    buffer.position(yPos);
-    buffer.limit(uPos);
-    ByteBuffer dataY = buffer.slice();
-
-    buffer.position(uPos);
-    buffer.limit(vPos);
-    ByteBuffer dataU = buffer.slice();
-
-    buffer.position(vPos);
-    buffer.limit(vPos + strideUV * chromaHeight);
-    ByteBuffer dataV = buffer.slice();
-
-    return new I420BufferImpl(width, height, dataY, width, dataU, strideUV, dataV, strideUV, null);
-  }
-
-  @Override
-  public int getWidth() {
-    return width;
-  }
-
-  @Override
-  public int getHeight() {
-    return height;
-  }
-
-  @Override
-  public ByteBuffer getDataY() {
-    return dataY;
-  }
-
-  @Override
-  public ByteBuffer getDataU() {
-    return dataU;
-  }
-
-  @Override
-  public ByteBuffer getDataV() {
-    return dataV;
-  }
-
-  @Override
-  public int getStrideY() {
-    return strideY;
-  }
-
-  @Override
-  public int getStrideU() {
-    return strideU;
-  }
-
-  @Override
-  public int getStrideV() {
-    return strideV;
-  }
-
-  @Override
-  public I420Buffer toI420() {
-    retain();
-    return this;
-  }
-
-  @Override
-  public void retain() {
-    synchronized (refCountLock) {
-      ++refCount;
-    }
-  }
-
-  @Override
-  public void release() {
-    synchronized (refCountLock) {
-      if (--refCount == 0 && releaseCallback != null) {
-        releaseCallback.run();
-      }
-    }
-  }
-
-  @Override
-  public VideoFrame.Buffer cropAndScale(
-      int cropX, int cropY, int cropWidth, int cropHeight, int scaleWidth, int scaleHeight) {
-    return VideoFrame.cropAndScaleI420(
-        this, cropX, cropY, cropWidth, cropHeight, scaleWidth, scaleHeight);
-  }
-}
diff --git a/sdk/android/src/java/org/webrtc/JniCommon.java b/sdk/android/src/java/org/webrtc/JniCommon.java
deleted file mode 100644
index cc80bec..0000000
--- a/sdk/android/src/java/org/webrtc/JniCommon.java
+++ /dev/null
@@ -1,18 +0,0 @@
-/*
- *  Copyright 2017 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.
- */
-
-package org.webrtc;
-
-/** Class with static JNI helper functions that are used in many places. */
-class JniCommon {
-  /** Functions to increment/decrement an rtc::RefCountInterface pointer. */
-  static native void nativeAddRef(long nativeRefCountedPointer);
-  static native void nativeReleaseRef(long nativeRefCountedPointer);
-}
diff --git a/sdk/android/src/java/org/webrtc/MediaCodecUtils.java b/sdk/android/src/java/org/webrtc/MediaCodecUtils.java
deleted file mode 100644
index c313423..0000000
--- a/sdk/android/src/java/org/webrtc/MediaCodecUtils.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- *  Copyright 2017 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.
- */
-
-package org.webrtc;
-
-import android.annotation.TargetApi;
-import android.media.MediaCodec;
-import android.media.MediaCodecInfo;
-import android.media.MediaCodecInfo.CodecCapabilities;
-
-/** Container class for static constants and helpers used with MediaCodec. */
-@TargetApi(18)
-class MediaCodecUtils {
-  private static final String TAG = "MediaCodecUtils";
-
-  // Prefixes for supported hardware encoder/decoder component names.
-  static final String EXYNOS_PREFIX = "OMX.Exynos.";
-  static final String INTEL_PREFIX = "OMX.Intel.";
-  static final String NVIDIA_PREFIX = "OMX.Nvidia.";
-  static final String QCOM_PREFIX = "OMX.qcom.";
-
-  // NV12 color format supported by QCOM codec, but not declared in MediaCodec -
-  // see /hardware/qcom/media/mm-core/inc/OMX_QCOMExtns.h
-  static final int COLOR_QCOM_FORMATYVU420PackedSemiPlanar32m4ka = 0x7FA30C01;
-  static final int COLOR_QCOM_FORMATYVU420PackedSemiPlanar16m4ka = 0x7FA30C02;
-  static final int COLOR_QCOM_FORMATYVU420PackedSemiPlanar64x32Tile2m8ka = 0x7FA30C03;
-  static final int COLOR_QCOM_FORMATYUV420PackedSemiPlanar32m = 0x7FA30C04;
-
-  // Color formats supported by hardware decoder - in order of preference.
-  static final int[] DECODER_COLOR_FORMATS = new int[] {CodecCapabilities.COLOR_FormatYUV420Planar,
-      CodecCapabilities.COLOR_FormatYUV420SemiPlanar,
-      CodecCapabilities.COLOR_QCOM_FormatYUV420SemiPlanar,
-      MediaCodecUtils.COLOR_QCOM_FORMATYVU420PackedSemiPlanar32m4ka,
-      MediaCodecUtils.COLOR_QCOM_FORMATYVU420PackedSemiPlanar16m4ka,
-      MediaCodecUtils.COLOR_QCOM_FORMATYVU420PackedSemiPlanar64x32Tile2m8ka,
-      MediaCodecUtils.COLOR_QCOM_FORMATYUV420PackedSemiPlanar32m};
-
-  // Color formats supported by hardware encoder - in order of preference.
-  static final int[] ENCODER_COLOR_FORMATS = {
-      MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420Planar,
-      MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420SemiPlanar,
-      MediaCodecInfo.CodecCapabilities.COLOR_QCOM_FormatYUV420SemiPlanar,
-      MediaCodecUtils.COLOR_QCOM_FORMATYUV420PackedSemiPlanar32m};
-
-  // Color formats supported by texture mode encoding - in order of preference.
-  static final int[] TEXTURE_COLOR_FORMATS = {MediaCodecInfo.CodecCapabilities.COLOR_FormatSurface};
-
-  static Integer selectColorFormat(int[] supportedColorFormats, CodecCapabilities capabilities) {
-    for (int supportedColorFormat : supportedColorFormats) {
-      for (int codecColorFormat : capabilities.colorFormats) {
-        if (codecColorFormat == supportedColorFormat) {
-          return codecColorFormat;
-        }
-      }
-    }
-    return null;
-  }
-
-  static boolean codecSupportsType(MediaCodecInfo info, VideoCodecType type) {
-    for (String mimeType : info.getSupportedTypes()) {
-      if (type.mimeType().equals(mimeType)) {
-        return true;
-      }
-    }
-    return false;
-  }
-
-  private MediaCodecUtils() {
-    // This class should not be instantiated.
-  }
-}
diff --git a/sdk/android/src/java/org/webrtc/NV12Buffer.java b/sdk/android/src/java/org/webrtc/NV12Buffer.java
deleted file mode 100644
index af9ac25..0000000
--- a/sdk/android/src/java/org/webrtc/NV12Buffer.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Copyright 2017 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.
- */
-
-package org.webrtc;
-
-import java.nio.ByteBuffer;
-
-public class NV12Buffer implements VideoFrame.Buffer {
-  private final int width;
-  private final int height;
-  private final int stride;
-  private final int sliceHeight;
-  private final ByteBuffer buffer;
-  private final Runnable releaseCallback;
-  private final Object refCountLock = new Object();
-
-  private int refCount;
-
-  public NV12Buffer(int width, int height, int stride, int sliceHeight, ByteBuffer buffer,
-      Runnable releaseCallback) {
-    this.width = width;
-    this.height = height;
-    this.stride = stride;
-    this.sliceHeight = sliceHeight;
-    this.buffer = buffer;
-    this.releaseCallback = releaseCallback;
-
-    refCount = 1;
-  }
-
-  @Override
-  public int getWidth() {
-    return width;
-  }
-
-  @Override
-  public int getHeight() {
-    return height;
-  }
-
-  @Override
-  public VideoFrame.I420Buffer toI420() {
-    return (VideoFrame.I420Buffer) cropAndScale(0, 0, width, height, width, height);
-  }
-
-  @Override
-  public void retain() {
-    synchronized (refCountLock) {
-      ++refCount;
-    }
-  }
-
-  @Override
-  public void release() {
-    synchronized (refCountLock) {
-      if (--refCount == 0 && releaseCallback != null) {
-        releaseCallback.run();
-      }
-    }
-  }
-
-  @Override
-  public VideoFrame.Buffer cropAndScale(
-      int cropX, int cropY, int cropWidth, int cropHeight, int scaleWidth, int scaleHeight) {
-    I420BufferImpl newBuffer = I420BufferImpl.allocate(scaleWidth, scaleHeight);
-    nativeCropAndScale(cropX, cropY, cropWidth, cropHeight, scaleWidth, scaleHeight, buffer, width,
-        height, stride, sliceHeight, newBuffer.getDataY(), newBuffer.getStrideY(),
-        newBuffer.getDataU(), newBuffer.getStrideU(), newBuffer.getDataV(), newBuffer.getStrideV());
-    return newBuffer;
-  }
-
-  private static native void nativeCropAndScale(int cropX, int cropY, int cropWidth, int cropHeight,
-      int scaleWidth, int scaleHeight, ByteBuffer src, int srcWidth, int srcHeight, int srcStride,
-      int srcSliceHeight, ByteBuffer dstY, int dstStrideY, ByteBuffer dstU, int dstStrideU,
-      ByteBuffer dstV, int dstStrideV);
-}
diff --git a/sdk/android/src/java/org/webrtc/NV21Buffer.java b/sdk/android/src/java/org/webrtc/NV21Buffer.java
deleted file mode 100644
index defcc1b..0000000
--- a/sdk/android/src/java/org/webrtc/NV21Buffer.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Copyright 2017 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.
- */
-
-package org.webrtc;
-
-import java.nio.ByteBuffer;
-
-public class NV21Buffer implements VideoFrame.Buffer {
-  private final byte[] data;
-  private final int width;
-  private final int height;
-  private final Runnable releaseCallback;
-  private final Object refCountLock = new Object();
-
-  private int refCount = 1;
-
-  public NV21Buffer(byte[] data, int width, int height, Runnable releaseCallback) {
-    this.data = data;
-    this.width = width;
-    this.height = height;
-    this.releaseCallback = releaseCallback;
-  }
-
-  @Override
-  public int getWidth() {
-    return width;
-  }
-
-  @Override
-  public int getHeight() {
-    return height;
-  }
-
-  @Override
-  public VideoFrame.I420Buffer toI420() {
-    // Cropping converts the frame to I420. Just crop and scale to the whole image.
-    return (VideoFrame.I420Buffer) cropAndScale(0 /* cropX */, 0 /* cropY */, width /* cropWidth */,
-        height /* cropHeight */, width /* scaleWidth */, height /* scaleHeight */);
-  }
-
-  @Override
-  public void retain() {
-    synchronized (refCountLock) {
-      ++refCount;
-    }
-  }
-
-  @Override
-  public void release() {
-    synchronized (refCountLock) {
-      if (--refCount == 0 && releaseCallback != null) {
-        releaseCallback.run();
-      }
-    }
-  }
-
-  @Override
-  public VideoFrame.Buffer cropAndScale(
-      int cropX, int cropY, int cropWidth, int cropHeight, int scaleWidth, int scaleHeight) {
-    I420BufferImpl newBuffer = I420BufferImpl.allocate(scaleWidth, scaleHeight);
-    nativeCropAndScale(cropX, cropY, cropWidth, cropHeight, scaleWidth, scaleHeight, data, width,
-        height, newBuffer.getDataY(), newBuffer.getStrideY(), newBuffer.getDataU(),
-        newBuffer.getStrideU(), newBuffer.getDataV(), newBuffer.getStrideV());
-    return newBuffer;
-  }
-
-  private static native void nativeCropAndScale(int cropX, int cropY, int cropWidth, int cropHeight,
-      int scaleWidth, int scaleHeight, byte[] src, int srcWidth, int srcHeight, ByteBuffer dstY,
-      int dstStrideY, ByteBuffer dstU, int dstStrideU, ByteBuffer dstV, int dstStrideV);
-}
diff --git a/sdk/android/src/java/org/webrtc/TextureBufferImpl.java b/sdk/android/src/java/org/webrtc/TextureBufferImpl.java
deleted file mode 100644
index 3a7da8d..0000000
--- a/sdk/android/src/java/org/webrtc/TextureBufferImpl.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- *  Copyright 2017 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.
- */
-
-package org.webrtc;
-
-import android.graphics.Matrix;
-import java.nio.ByteBuffer;
-
-/**
- * Android texture buffer backed by a SurfaceTextureHelper's texture. The buffer calls
- * |releaseCallback| when it is released.
- */
-class TextureBufferImpl implements VideoFrame.TextureBuffer {
-  private final int width;
-  private final int height;
-  private final Type type;
-  private final int id;
-  private final Matrix transformMatrix;
-  private final SurfaceTextureHelper surfaceTextureHelper;
-  private final Runnable releaseCallback;
-  private final Object refCountLock = new Object();
-  private int refCount;
-
-  public TextureBufferImpl(int width, int height, Type type, int id, Matrix transformMatrix,
-      SurfaceTextureHelper surfaceTextureHelper, Runnable releaseCallback) {
-    this.width = width;
-    this.height = height;
-    this.type = type;
-    this.id = id;
-    this.transformMatrix = transformMatrix;
-    this.surfaceTextureHelper = surfaceTextureHelper;
-    this.releaseCallback = releaseCallback;
-    this.refCount = 1; // Creator implicitly holds a reference.
-  }
-
-  @Override
-  public VideoFrame.TextureBuffer.Type getType() {
-    return type;
-  }
-
-  @Override
-  public int getTextureId() {
-    return id;
-  }
-
-  @Override
-  public Matrix getTransformMatrix() {
-    return transformMatrix;
-  }
-
-  @Override
-  public int getWidth() {
-    return width;
-  }
-
-  @Override
-  public int getHeight() {
-    return height;
-  }
-
-  @Override
-  public VideoFrame.I420Buffer toI420() {
-    if (type == Type.RGB) {
-      throw new RuntimeException("toI420 for RGB frames not implemented yet");
-    }
-    // SurfaceTextureHelper requires a stride that is divisible by 8.  Round width up.
-    // See SurfaceTextureHelper for details on the size and format.
-    int stride = ((width + 7) / 8) * 8;
-    int uvHeight = (height + 1) / 2;
-    // Due to the layout used by SurfaceTextureHelper, vPos + stride * uvHeight would overrun the
-    // buffer.  Add one row at the bottom to compensate for this.  There will never be data in the
-    // extra row, but now other code does not have to deal with v stride * v height exceeding the
-    // buffer's capacity.
-    int size = stride * (height + uvHeight + 1);
-    ByteBuffer buffer = ByteBuffer.allocateDirect(size);
-    surfaceTextureHelper.textureToYUV(buffer, width, height, stride, id,
-        RendererCommon.convertMatrixFromAndroidGraphicsMatrix(transformMatrix));
-
-    int yPos = 0;
-    int uPos = yPos + stride * height;
-    // Rows of U and V alternate in the buffer, so V data starts after the first row of U.
-    int vPos = uPos + stride / 2;
-
-    buffer.position(yPos);
-    buffer.limit(yPos + stride * height);
-    ByteBuffer dataY = buffer.slice();
-
-    buffer.position(uPos);
-    buffer.limit(uPos + stride * uvHeight);
-    ByteBuffer dataU = buffer.slice();
-
-    buffer.position(vPos);
-    buffer.limit(vPos + stride * uvHeight);
-    ByteBuffer dataV = buffer.slice();
-
-    // SurfaceTextureHelper uses the same stride for Y, U, and V data.
-    return new I420BufferImpl(width, height, dataY, stride, dataU, stride, dataV, stride, null);
-  }
-
-  @Override
-  public void retain() {
-    synchronized (refCountLock) {
-      ++refCount;
-    }
-  }
-
-  @Override
-  public void release() {
-    synchronized (refCountLock) {
-      if (--refCount == 0 && releaseCallback != null) {
-        releaseCallback.run();
-      }
-    }
-  }
-
-  @Override
-  public VideoFrame.Buffer cropAndScale(
-      int cropX, int cropY, int cropWidth, int cropHeight, int scaleWidth, int scaleHeight) {
-    retain();
-    Matrix newMatrix = new Matrix(transformMatrix);
-    newMatrix.postScale(cropWidth / (float) width, cropHeight / (float) height);
-    newMatrix.postTranslate(cropX / (float) width, cropY / (float) height);
-
-    return new TextureBufferImpl(
-        scaleWidth, scaleHeight, type, id, newMatrix, surfaceTextureHelper, new Runnable() {
-          @Override
-          public void run() {
-            release();
-          }
-        });
-  }
-}
diff --git a/sdk/android/src/java/org/webrtc/VideoCodecType.java b/sdk/android/src/java/org/webrtc/VideoCodecType.java
deleted file mode 100644
index 2d4ef9a..0000000
--- a/sdk/android/src/java/org/webrtc/VideoCodecType.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- *  Copyright 2017 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.
- */
-
-package org.webrtc;
-
-/** Enumeration of supported video codec types. */
-enum VideoCodecType {
-  VP8("video/x-vnd.on2.vp8"),
-  VP9("video/x-vnd.on2.vp9"),
-  H264("video/avc");
-
-  private final String mimeType;
-
-  private VideoCodecType(String mimeType) {
-    this.mimeType = mimeType;
-  }
-
-  String mimeType() {
-    return mimeType;
-  }
-}
diff --git a/sdk/android/src/java/org/webrtc/VideoDecoderWrapperCallback.java b/sdk/android/src/java/org/webrtc/VideoDecoderWrapperCallback.java
deleted file mode 100644
index 232466d..0000000
--- a/sdk/android/src/java/org/webrtc/VideoDecoderWrapperCallback.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- *  Copyright (c) 2017 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.
- */
-
-package org.webrtc;
-
-/**
- * VideoDecoder callback that calls VideoDecoderWrapper.OnDecodedFrame for the decoded frames.
- */
-class VideoDecoderWrapperCallback implements VideoDecoder.Callback {
-  private final long nativeDecoder;
-
-  public VideoDecoderWrapperCallback(long nativeDecoder) {
-    this.nativeDecoder = nativeDecoder;
-  }
-
-  @Override
-  public void onDecodedFrame(VideoFrame frame, Integer decodeTimeMs, Integer qp) {
-    nativeOnDecodedFrame(nativeDecoder, frame, decodeTimeMs, qp);
-  }
-
-  private native static void nativeOnDecodedFrame(
-      long nativeDecoder, VideoFrame frame, Integer decodeTimeMs, Integer qp);
-}
diff --git a/sdk/android/src/java/org/webrtc/VideoEncoderWrapperCallback.java b/sdk/android/src/java/org/webrtc/VideoEncoderWrapperCallback.java
deleted file mode 100644
index 0a8a8a6..0000000
--- a/sdk/android/src/java/org/webrtc/VideoEncoderWrapperCallback.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Copyright 2017 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.
- */
-
-package org.webrtc;
-
-import java.nio.ByteBuffer;
-
-/**
- * VideoEncoder callback that calls VideoEncoderWrapper.OnEncodedFrame for the Encoded frames.
- */
-class VideoEncoderWrapperCallback implements VideoEncoder.Callback {
-  private final long nativeEncoder;
-
-  public VideoEncoderWrapperCallback(long nativeEncoder) {
-    this.nativeEncoder = nativeEncoder;
-  }
-
-  @Override
-  public void onEncodedFrame(EncodedImage frame, VideoEncoder.CodecSpecificInfo info) {
-    nativeOnEncodedFrame(nativeEncoder, frame.buffer, frame.encodedWidth, frame.encodedHeight,
-        frame.captureTimeNs, frame.frameType.getNative(), frame.rotation, frame.completeFrame,
-        frame.qp);
-  }
-
-  private native static void nativeOnEncodedFrame(long nativeEncoder, ByteBuffer buffer,
-      int encodedWidth, int encodedHeight, long captureTimeNs, int frameType, int rotation,
-      boolean completeFrame, Integer qp);
-}
diff --git a/sdk/android/src/java/org/webrtc/WrappedNativeI420Buffer.java b/sdk/android/src/java/org/webrtc/WrappedNativeI420Buffer.java
deleted file mode 100644
index 85d02e6..0000000
--- a/sdk/android/src/java/org/webrtc/WrappedNativeI420Buffer.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- *  Copyright 2017 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.
- */
-
-package org.webrtc;
-
-import java.nio.ByteBuffer;
-
-/**
- * This class wraps a webrtc::I420BufferInterface into a VideoFrame.I420Buffer.
- */
-class WrappedNativeI420Buffer implements VideoFrame.I420Buffer {
-  private final int width;
-  private final int height;
-  private final ByteBuffer dataY;
-  private final int strideY;
-  private final ByteBuffer dataU;
-  private final int strideU;
-  private final ByteBuffer dataV;
-  private final int strideV;
-  private final long nativeBuffer;
-
-  WrappedNativeI420Buffer(int width, int height, ByteBuffer dataY, int strideY, ByteBuffer dataU,
-      int strideU, ByteBuffer dataV, int strideV, long nativeBuffer) {
-    this.width = width;
-    this.height = height;
-    this.dataY = dataY;
-    this.strideY = strideY;
-    this.dataU = dataU;
-    this.strideU = strideU;
-    this.dataV = dataV;
-    this.strideV = strideV;
-    this.nativeBuffer = nativeBuffer;
-
-    retain();
-  }
-
-  @Override
-  public int getWidth() {
-    return width;
-  }
-
-  @Override
-  public int getHeight() {
-    return height;
-  }
-
-  @Override
-  public ByteBuffer getDataY() {
-    return dataY;
-  }
-
-  @Override
-  public ByteBuffer getDataU() {
-    return dataU;
-  }
-
-  @Override
-  public ByteBuffer getDataV() {
-    return dataV;
-  }
-
-  @Override
-  public int getStrideY() {
-    return strideY;
-  }
-
-  @Override
-  public int getStrideU() {
-    return strideU;
-  }
-
-  @Override
-  public int getStrideV() {
-    return strideV;
-  }
-
-  @Override
-  public VideoFrame.I420Buffer toI420() {
-    retain();
-    return this;
-  }
-
-  @Override
-  public void retain() {
-    JniCommon.nativeAddRef(nativeBuffer);
-  }
-
-  @Override
-  public void release() {
-    JniCommon.nativeReleaseRef(nativeBuffer);
-  }
-
-  @Override
-  public VideoFrame.Buffer cropAndScale(
-      int cropX, int cropY, int cropWidth, int cropHeight, int scaleWidth, int scaleHeight) {
-    return VideoFrame.cropAndScaleI420(
-        this, cropX, cropY, cropWidth, cropHeight, scaleWidth, scaleHeight);
-  }
-}
diff --git a/sdk/android/src/java/org/webrtc/YuvConverter.java b/sdk/android/src/java/org/webrtc/YuvConverter.java
deleted file mode 100644
index bd6f8af..0000000
--- a/sdk/android/src/java/org/webrtc/YuvConverter.java
+++ /dev/null
@@ -1,223 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-package org.webrtc;
-
-import android.opengl.GLES11Ext;
-import android.opengl.GLES20;
-import java.nio.ByteBuffer;
-import java.nio.FloatBuffer;
-
-/**
- * Class for converting OES textures to a YUV ByteBuffer. It should be constructed on a thread with
- * an active EGL context, and only be used from that thread.
- */
-class YuvConverter {
-  // Vertex coordinates in Normalized Device Coordinates, i.e.
-  // (-1, -1) is bottom-left and (1, 1) is top-right.
-  private static final FloatBuffer DEVICE_RECTANGLE = GlUtil.createFloatBuffer(new float[] {
-      -1.0f, -1.0f, // Bottom left.
-      1.0f, -1.0f, // Bottom right.
-      -1.0f, 1.0f, // Top left.
-      1.0f, 1.0f, // Top right.
-  });
-
-  // Texture coordinates - (0, 0) is bottom-left and (1, 1) is top-right.
-  private static final FloatBuffer TEXTURE_RECTANGLE = GlUtil.createFloatBuffer(new float[] {
-      0.0f, 0.0f, // Bottom left.
-      1.0f, 0.0f, // Bottom right.
-      0.0f, 1.0f, // Top left.
-      1.0f, 1.0f // Top right.
-  });
-
-  // clang-format off
-  private static final String VERTEX_SHADER =
-        "varying vec2 interp_tc;\n"
-      + "attribute vec4 in_pos;\n"
-      + "attribute vec4 in_tc;\n"
-      + "\n"
-      + "uniform mat4 texMatrix;\n"
-      + "\n"
-      + "void main() {\n"
-      + "    gl_Position = in_pos;\n"
-      + "    interp_tc = (texMatrix * in_tc).xy;\n"
-      + "}\n";
-
-  private static final String FRAGMENT_SHADER =
-        "#extension GL_OES_EGL_image_external : require\n"
-      + "precision mediump float;\n"
-      + "varying vec2 interp_tc;\n"
-      + "\n"
-      + "uniform samplerExternalOES oesTex;\n"
-      // Difference in texture coordinate corresponding to one
-      // sub-pixel in the x direction.
-      + "uniform vec2 xUnit;\n"
-      // Color conversion coefficients, including constant term
-      + "uniform vec4 coeffs;\n"
-      + "\n"
-      + "void main() {\n"
-      // Since the alpha read from the texture is always 1, this could
-      // be written as a mat4 x vec4 multiply. However, that seems to
-      // give a worse framerate, possibly because the additional
-      // multiplies by 1.0 consume resources. TODO(nisse): Could also
-      // try to do it as a vec3 x mat3x4, followed by an add in of a
-      // constant vector.
-      + "  gl_FragColor.r = coeffs.a + dot(coeffs.rgb,\n"
-      + "      texture2D(oesTex, interp_tc - 1.5 * xUnit).rgb);\n"
-      + "  gl_FragColor.g = coeffs.a + dot(coeffs.rgb,\n"
-      + "      texture2D(oesTex, interp_tc - 0.5 * xUnit).rgb);\n"
-      + "  gl_FragColor.b = coeffs.a + dot(coeffs.rgb,\n"
-      + "      texture2D(oesTex, interp_tc + 0.5 * xUnit).rgb);\n"
-      + "  gl_FragColor.a = coeffs.a + dot(coeffs.rgb,\n"
-      + "      texture2D(oesTex, interp_tc + 1.5 * xUnit).rgb);\n"
-      + "}\n";
-  // clang-format on
-
-  private final GlTextureFrameBuffer textureFrameBuffer;
-  private final GlShader shader;
-  private final int texMatrixLoc;
-  private final int xUnitLoc;
-  private final int coeffsLoc;
-  private final ThreadUtils.ThreadChecker threadChecker = new ThreadUtils.ThreadChecker();
-  private boolean released = false;
-
-  /**
-   * This class should be constructed on a thread that has an active EGL context.
-   */
-  public YuvConverter() {
-    threadChecker.checkIsOnValidThread();
-    textureFrameBuffer = new GlTextureFrameBuffer(GLES20.GL_RGBA);
-    shader = new GlShader(VERTEX_SHADER, FRAGMENT_SHADER);
-    shader.useProgram();
-    texMatrixLoc = shader.getUniformLocation("texMatrix");
-    xUnitLoc = shader.getUniformLocation("xUnit");
-    coeffsLoc = shader.getUniformLocation("coeffs");
-    GLES20.glUniform1i(shader.getUniformLocation("oesTex"), 0);
-    GlUtil.checkNoGLES2Error("Initialize fragment shader uniform values.");
-    // Initialize vertex shader attributes.
-    shader.setVertexAttribArray("in_pos", 2, DEVICE_RECTANGLE);
-    // If the width is not a multiple of 4 pixels, the texture
-    // will be scaled up slightly and clipped at the right border.
-    shader.setVertexAttribArray("in_tc", 2, TEXTURE_RECTANGLE);
-  }
-
-  public void convert(ByteBuffer buf, int width, int height, int stride, int srcTextureId,
-      float[] transformMatrix) {
-    threadChecker.checkIsOnValidThread();
-    if (released) {
-      throw new IllegalStateException("YuvConverter.convert called on released object");
-    }
-
-    // We draw into a buffer laid out like
-    //
-    //    +---------+
-    //    |         |
-    //    |  Y      |
-    //    |         |
-    //    |         |
-    //    +----+----+
-    //    | U  | V  |
-    //    |    |    |
-    //    +----+----+
-    //
-    // In memory, we use the same stride for all of Y, U and V. The
-    // U data starts at offset |height| * |stride| from the Y data,
-    // and the V data starts at at offset |stride/2| from the U
-    // data, with rows of U and V data alternating.
-    //
-    // Now, it would have made sense to allocate a pixel buffer with
-    // a single byte per pixel (EGL10.EGL_COLOR_BUFFER_TYPE,
-    // EGL10.EGL_LUMINANCE_BUFFER,), but that seems to be
-    // unsupported by devices. So do the following hack: Allocate an
-    // RGBA buffer, of width |stride|/4. To render each of these
-    // large pixels, sample the texture at 4 different x coordinates
-    // and store the results in the four components.
-    //
-    // Since the V data needs to start on a boundary of such a
-    // larger pixel, it is not sufficient that |stride| is even, it
-    // has to be a multiple of 8 pixels.
-
-    if (stride % 8 != 0) {
-      throw new IllegalArgumentException("Invalid stride, must be a multiple of 8");
-    }
-    if (stride < width) {
-      throw new IllegalArgumentException("Invalid stride, must >= width");
-    }
-
-    int y_width = (width + 3) / 4;
-    int uv_width = (width + 7) / 8;
-    int uv_height = (height + 1) / 2;
-    int total_height = height + uv_height;
-    int size = stride * total_height;
-
-    if (buf.capacity() < size) {
-      throw new IllegalArgumentException("YuvConverter.convert called with too small buffer");
-    }
-    // Produce a frame buffer starting at top-left corner, not
-    // bottom-left.
-    transformMatrix =
-        RendererCommon.multiplyMatrices(transformMatrix, RendererCommon.verticalFlipMatrix());
-
-    final int frameBufferWidth = stride / 4;
-    final int frameBufferHeight = total_height;
-    textureFrameBuffer.setSize(frameBufferWidth, frameBufferHeight);
-
-    // Bind our framebuffer.
-    GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, textureFrameBuffer.getFrameBufferId());
-    GlUtil.checkNoGLES2Error("glBindFramebuffer");
-
-    GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
-    GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, srcTextureId);
-    GLES20.glUniformMatrix4fv(texMatrixLoc, 1, false, transformMatrix, 0);
-
-    // Draw Y
-    GLES20.glViewport(0, 0, y_width, height);
-    // Matrix * (1;0;0;0) / width. Note that opengl uses column major order.
-    GLES20.glUniform2f(xUnitLoc, transformMatrix[0] / width, transformMatrix[1] / width);
-    // Y'UV444 to RGB888, see
-    // https://en.wikipedia.org/wiki/YUV#Y.27UV444_to_RGB888_conversion.
-    // We use the ITU-R coefficients for U and V */
-    GLES20.glUniform4f(coeffsLoc, 0.299f, 0.587f, 0.114f, 0.0f);
-    GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4);
-
-    // Draw U
-    GLES20.glViewport(0, height, uv_width, uv_height);
-    // Matrix * (1;0;0;0) / (width / 2). Note that opengl uses column major order.
-    GLES20.glUniform2f(
-        xUnitLoc, 2.0f * transformMatrix[0] / width, 2.0f * transformMatrix[1] / width);
-    GLES20.glUniform4f(coeffsLoc, -0.169f, -0.331f, 0.499f, 0.5f);
-    GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4);
-
-    // Draw V
-    GLES20.glViewport(stride / 8, height, uv_width, uv_height);
-    GLES20.glUniform4f(coeffsLoc, 0.499f, -0.418f, -0.0813f, 0.5f);
-    GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4);
-
-    GLES20.glReadPixels(
-        0, 0, frameBufferWidth, frameBufferHeight, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, buf);
-
-    GlUtil.checkNoGLES2Error("YuvConverter.convert");
-
-    // Restore normal framebuffer.
-    GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, 0);
-    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 0);
-
-    // Unbind texture. Reportedly needed on some devices to get
-    // the texture updated from the camera.
-    GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, 0);
-  }
-
-  public void release() {
-    threadChecker.checkIsOnValidThread();
-    released = true;
-    shader.release();
-    textureFrameBuffer.release();
-  }
-}
diff --git a/sdk/android/src/jni/DEPS b/sdk/android/src/jni/DEPS
deleted file mode 100644
index 382b404..0000000
--- a/sdk/android/src/jni/DEPS
+++ /dev/null
@@ -1,15 +0,0 @@
-include_rules = [
-  "+third_party/libyuv",
-  "+webrtc/call/callfactoryinterface.h",
-  "+webrtc/common_video",
-  "+webrtc/logging/rtc_event_log/rtc_event_log_factory_interface.h",
-  "+webrtc/media/base",
-  "+webrtc/media/engine",
-  "+webrtc/modules/audio_processing/include/audio_processing.h",
-  "+webrtc/modules/include",
-  "+webrtc/modules/utility/include/jvm_android.h",
-  "+webrtc/modules/video_coding",
-  "+webrtc/pc",
-  "+webrtc/system_wrappers/include",
-  "+webrtc/voice_engine/include/voe_base.h",
-]
diff --git a/sdk/android/src/jni/OWNERS b/sdk/android/src/jni/OWNERS
deleted file mode 100644
index 4c1d7c2..0000000
--- a/sdk/android/src/jni/OWNERS
+++ /dev/null
@@ -1,4 +0,0 @@
-per-file androidhistogram_jni.cc=sakal@webrtc.org
-per-file androidmetrics_jni.cc=sakal@webrtc.org
-per-file androidvideotracksource.*=sakal@webrtc.org
-per-file androidvideotracksource_jni.cc=sakal@webrtc.org
diff --git a/sdk/android/src/jni/androidhistogram_jni.cc b/sdk/android/src/jni/androidhistogram_jni.cc
deleted file mode 100644
index c21b346..0000000
--- a/sdk/android/src/jni/androidhistogram_jni.cc
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- *  Copyright 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 <map>
-#include <memory>
-
-#include "webrtc/sdk/android/src/jni/classreferenceholder.h"
-#include "webrtc/sdk/android/src/jni/jni_helpers.h"
-#include "webrtc/system_wrappers/include/metrics.h"
-
-// Enables collection of native histograms and creating them.
-namespace webrtc {
-namespace jni {
-
-JNI_FUNCTION_DECLARATION(jlong,
-                         Histogram_nativeCreateCounts,
-                         JNIEnv* jni,
-                         jclass,
-                         jstring j_name,
-                         jint min,
-                         jint max,
-                         jint buckets) {
-  std::string name = JavaToStdString(jni, j_name);
-  return jlongFromPointer(
-      metrics::HistogramFactoryGetCounts(name, min, max, buckets));
-}
-
-JNI_FUNCTION_DECLARATION(jlong,
-                         Histogram_nativeCreateEnumeration,
-                         JNIEnv* jni,
-                         jclass,
-                         jstring j_name,
-                         jint max) {
-  std::string name = JavaToStdString(jni, j_name);
-  return jlongFromPointer(metrics::HistogramFactoryGetEnumeration(name, max));
-}
-
-JNI_FUNCTION_DECLARATION(void,
-                         Histogram_nativeAddSample,
-                         JNIEnv* jni,
-                         jclass,
-                         jlong histogram,
-                         jint sample) {
-  if (histogram) {
-    HistogramAdd(reinterpret_cast<metrics::Histogram*>(histogram), sample);
-  }
-}
-
-}  // namespace jni
-}  // namespace webrtc
diff --git a/sdk/android/src/jni/androidmediacodeccommon.h b/sdk/android/src/jni/androidmediacodeccommon.h
deleted file mode 100644
index 08224ee..0000000
--- a/sdk/android/src/jni/androidmediacodeccommon.h
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- *  Copyright 2015 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_SDK_ANDROID_SRC_JNI_ANDROIDMEDIACODECCOMMON_H_
-#define WEBRTC_SDK_ANDROID_SRC_JNI_ANDROIDMEDIACODECCOMMON_H_
-
-#include <android/log.h>
-#include <string>
-
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/thread.h"
-#include "webrtc/sdk/android/src/jni/classreferenceholder.h"
-#include "webrtc/sdk/android/src/jni/jni_helpers.h"
-
-namespace webrtc {
-namespace jni {
-
-// Uncomment this define to enable verbose logging for every encoded/decoded
-// video frame.
-//#define TRACK_BUFFER_TIMING
-
-#define TAG_COMMON "MediaCodecVideo"
-
-// Color formats supported by encoder or decoder - should include all
-// colors from supportedColorList in MediaCodecVideoEncoder.java and
-// MediaCodecVideoDecoder.java. Supported color format set in encoder
-// and decoder could be different.
-enum COLOR_FORMATTYPE {
-  COLOR_FormatYUV420Planar = 0x13,
-  COLOR_FormatYUV420SemiPlanar = 0x15,
-  COLOR_QCOM_FormatYUV420SemiPlanar = 0x7FA30C00,
-  // NV12 color format supported by QCOM codec, but not declared in MediaCodec -
-  // see /hardware/qcom/media/mm-core/inc/OMX_QCOMExtns.h
-  // This format is presumably similar to COLOR_FormatYUV420SemiPlanar,
-  // but requires some (16, 32?) byte alignment.
-  COLOR_QCOM_FORMATYVU420PackedSemiPlanar32m4ka = 0x7FA30C01,
-  COLOR_QCOM_FORMATYVU420PackedSemiPlanar16m4ka = 0x7FA30C02,
-  COLOR_QCOM_FORMATYVU420PackedSemiPlanar64x32Tile2m8ka = 0x7FA30C03,
-  COLOR_QCOM_FORMATYUV420PackedSemiPlanar32m = 0x7FA30C04
-};
-
-// Arbitrary interval to poll the codec for new outputs.
-enum { kMediaCodecPollMs = 10 };
-// Arbitrary interval to poll at when there should be no more frames.
-enum { kMediaCodecPollNoFramesMs = 100 };
-// Media codec maximum output buffer ready timeout.
-enum { kMediaCodecTimeoutMs = 1000 };
-// Interval to print codec statistics (bitrate, fps, encoding/decoding time).
-enum { kMediaCodecStatisticsIntervalMs = 3000 };
-// Maximum amount of pending frames for VP8 decoder.
-enum { kMaxPendingFramesVp8 = 1 };
-// Maximum amount of pending frames for VP9 decoder.
-enum { kMaxPendingFramesVp9 = 1 };
-// Maximum amount of pending frames for H.264 decoder.
-enum { kMaxPendingFramesH264 = 4 };
-// Maximum amount of decoded frames for which per-frame logging is enabled.
-enum { kMaxDecodedLogFrames = 10 };
-// Maximum amount of encoded frames for which per-frame logging is enabled.
-enum { kMaxEncodedLogFrames = 10 };
-
-static inline void AllowBlockingCalls() {
-  rtc::Thread* current_thread = rtc::Thread::Current();
-  if (current_thread != NULL)
-    current_thread->SetAllowBlockingCalls(true);
-}
-
-// Checks for any Java exception, prints stack backtrace and clears
-// currently thrown exception.
-static inline bool CheckException(JNIEnv* jni) {
-  if (jni->ExceptionCheck()) {
-    LOG_TAG(rtc::LS_ERROR, TAG_COMMON) << "Java JNI exception.";
-    jni->ExceptionDescribe();
-    jni->ExceptionClear();
-    return true;
-  }
-  return false;
-}
-
-}  // namespace jni
-}  // namespace webrtc
-
-#endif  // WEBRTC_SDK_ANDROID_SRC_JNI_ANDROIDMEDIACODECCOMMON_H_
diff --git a/sdk/android/src/jni/androidmediadecoder_jni.cc b/sdk/android/src/jni/androidmediadecoder_jni.cc
deleted file mode 100644
index dec35ec..0000000
--- a/sdk/android/src/jni/androidmediadecoder_jni.cc
+++ /dev/null
@@ -1,1024 +0,0 @@
-/*
- *  Copyright 2015 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 <algorithm>
-#include <deque>
-#include <memory>
-#include <vector>
-
-// NOTICE: androidmediadecoder_jni.h must be included before
-// androidmediacodeccommon.h to avoid build errors.
-#include "webrtc/sdk/android/src/jni/androidmediadecoder_jni.h"
-
-#include "third_party/libyuv/include/libyuv/convert.h"
-#include "third_party/libyuv/include/libyuv/convert_from.h"
-#include "third_party/libyuv/include/libyuv/video_common.h"
-#include "webrtc/common_video/h264/h264_bitstream_parser.h"
-#include "webrtc/common_video/include/i420_buffer_pool.h"
-#include "webrtc/modules/video_coding/include/video_codec_interface.h"
-#include "webrtc/modules/video_coding/utility/vp8_header_parser.h"
-#include "webrtc/rtc_base/bind.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/scoped_ref_ptr.h"
-#include "webrtc/rtc_base/thread.h"
-#include "webrtc/rtc_base/timeutils.h"
-#include "webrtc/sdk/android/src/jni/androidmediacodeccommon.h"
-#include "webrtc/sdk/android/src/jni/classreferenceholder.h"
-#include "webrtc/sdk/android/src/jni/native_handle_impl.h"
-#include "webrtc/sdk/android/src/jni/surfacetexturehelper_jni.h"
-
-using rtc::Bind;
-using rtc::Thread;
-using rtc::ThreadManager;
-
-namespace webrtc {
-namespace jni {
-
-// Logging macros.
-#define TAG_DECODER "MediaCodecVideoDecoder"
-#ifdef TRACK_BUFFER_TIMING
-#define ALOGV(...) \
-  __android_log_print(ANDROID_LOG_VERBOSE, TAG_DECODER, __VA_ARGS__)
-#else
-#define ALOGV(...)
-#endif
-#define ALOGD LOG_TAG(rtc::LS_INFO, TAG_DECODER)
-#define ALOGW LOG_TAG(rtc::LS_WARNING, TAG_DECODER)
-#define ALOGE LOG_TAG(rtc::LS_ERROR, TAG_DECODER)
-
-enum { kMaxWarningLogFrames = 2 };
-
-class MediaCodecVideoDecoder : public VideoDecoder, public rtc::MessageHandler {
- public:
-  explicit MediaCodecVideoDecoder(
-      JNIEnv* jni, VideoCodecType codecType, jobject render_egl_context);
-  virtual ~MediaCodecVideoDecoder();
-
-  int32_t InitDecode(const VideoCodec* codecSettings, int32_t numberOfCores)
-      override;
-
-  int32_t Decode(
-      const EncodedImage& inputImage, bool missingFrames,
-      const RTPFragmentationHeader* fragmentation,
-      const CodecSpecificInfo* codecSpecificInfo = NULL,
-      int64_t renderTimeMs = -1) override;
-
-  int32_t RegisterDecodeCompleteCallback(DecodedImageCallback* callback)
-      override;
-
-  int32_t Release() override;
-
-  bool PrefersLateDecoding() const override { return true; }
-
-  // rtc::MessageHandler implementation.
-  void OnMessage(rtc::Message* msg) override;
-
-  const char* ImplementationName() const override;
-
- private:
-  // CHECK-fail if not running on |codec_thread_|.
-  void CheckOnCodecThread();
-
-  int32_t InitDecodeOnCodecThread();
-  int32_t ResetDecodeOnCodecThread();
-  int32_t ReleaseOnCodecThread();
-  int32_t DecodeOnCodecThread(const EncodedImage& inputImage);
-  // Deliver any outputs pending in the MediaCodec to our |callback_| and return
-  // true on success.
-  bool DeliverPendingOutputs(JNIEnv* jni, int dequeue_timeout_us);
-  int32_t ProcessHWErrorOnCodecThread();
-  void EnableFrameLogOnWarning();
-  void ResetVariables();
-
-  // Type of video codec.
-  VideoCodecType codecType_;
-
-  // Render EGL context - owned by factory, should not be allocated/destroyed
-  // by VideoDecoder.
-  jobject render_egl_context_;
-
-  bool key_frame_required_;
-  bool inited_;
-  bool sw_fallback_required_;
-  bool use_surface_;
-  VideoCodec codec_;
-  I420BufferPool decoded_frame_pool_;
-  rtc::scoped_refptr<SurfaceTextureHelper> surface_texture_helper_;
-  DecodedImageCallback* callback_;
-  int frames_received_;  // Number of frames received by decoder.
-  int frames_decoded_;  // Number of frames decoded by decoder.
-  // Number of decoded frames for which log information is displayed.
-  int frames_decoded_logged_;
-  int64_t start_time_ms_;  // Start time for statistics.
-  int current_frames_;  // Number of frames in the current statistics interval.
-  int current_bytes_;  // Encoded bytes in the current statistics interval.
-  int current_decoding_time_ms_;  // Overall decoding time in the current second
-  int current_delay_time_ms_;  // Overall delay time in the current second.
-  uint32_t max_pending_frames_;  // Maximum number of pending input frames.
-  H264BitstreamParser h264_bitstream_parser_;
-  std::deque<rtc::Optional<uint8_t>> pending_frame_qps_;
-
-  // State that is constant for the lifetime of this object once the ctor
-  // returns.
-  std::unique_ptr<Thread>
-      codec_thread_;  // Thread on which to operate MediaCodec.
-  ScopedGlobalRef<jclass> j_media_codec_video_decoder_class_;
-  ScopedGlobalRef<jobject> j_media_codec_video_decoder_;
-  jmethodID j_init_decode_method_;
-  jmethodID j_reset_method_;
-  jmethodID j_release_method_;
-  jmethodID j_dequeue_input_buffer_method_;
-  jmethodID j_queue_input_buffer_method_;
-  jmethodID j_dequeue_byte_buffer_method_;
-  jmethodID j_dequeue_texture_buffer_method_;
-  jmethodID j_return_decoded_byte_buffer_method_;
-  // MediaCodecVideoDecoder fields.
-  jfieldID j_input_buffers_field_;
-  jfieldID j_output_buffers_field_;
-  jfieldID j_color_format_field_;
-  jfieldID j_width_field_;
-  jfieldID j_height_field_;
-  jfieldID j_stride_field_;
-  jfieldID j_slice_height_field_;
-  // MediaCodecVideoDecoder.DecodedTextureBuffer fields.
-  jfieldID j_texture_id_field_;
-  jfieldID j_transform_matrix_field_;
-  jfieldID j_texture_presentation_timestamp_ms_field_;
-  jfieldID j_texture_timestamp_ms_field_;
-  jfieldID j_texture_ntp_timestamp_ms_field_;
-  jfieldID j_texture_decode_time_ms_field_;
-  jfieldID j_texture_frame_delay_ms_field_;
-  // MediaCodecVideoDecoder.DecodedOutputBuffer fields.
-  jfieldID j_info_index_field_;
-  jfieldID j_info_offset_field_;
-  jfieldID j_info_size_field_;
-  jfieldID j_presentation_timestamp_ms_field_;
-  jfieldID j_timestamp_ms_field_;
-  jfieldID j_ntp_timestamp_ms_field_;
-  jfieldID j_byte_buffer_decode_time_ms_field_;
-
-  // Global references; must be deleted in Release().
-  std::vector<jobject> input_buffers_;
-};
-
-MediaCodecVideoDecoder::MediaCodecVideoDecoder(JNIEnv* jni,
-                                               VideoCodecType codecType,
-                                               jobject render_egl_context)
-    : codecType_(codecType),
-      render_egl_context_(render_egl_context),
-      key_frame_required_(true),
-      inited_(false),
-      sw_fallback_required_(false),
-      codec_thread_(Thread::Create()),
-      j_media_codec_video_decoder_class_(
-          jni,
-          FindClass(jni, "org/webrtc/MediaCodecVideoDecoder")),
-      j_media_codec_video_decoder_(
-          jni,
-          jni->NewObject(*j_media_codec_video_decoder_class_,
-                         GetMethodID(jni,
-                                     *j_media_codec_video_decoder_class_,
-                                     "<init>",
-                                     "()V"))) {
-  codec_thread_->SetName("MediaCodecVideoDecoder", NULL);
-  RTC_CHECK(codec_thread_->Start()) << "Failed to start MediaCodecVideoDecoder";
-
-  j_init_decode_method_ = GetMethodID(
-      jni, *j_media_codec_video_decoder_class_, "initDecode",
-      "(Lorg/webrtc/MediaCodecVideoDecoder$VideoCodecType;"
-      "IILorg/webrtc/SurfaceTextureHelper;)Z");
-  j_reset_method_ =
-      GetMethodID(jni, *j_media_codec_video_decoder_class_, "reset", "(II)V");
-  j_release_method_ =
-      GetMethodID(jni, *j_media_codec_video_decoder_class_, "release", "()V");
-  j_dequeue_input_buffer_method_ = GetMethodID(
-      jni, *j_media_codec_video_decoder_class_, "dequeueInputBuffer", "()I");
-  j_queue_input_buffer_method_ = GetMethodID(
-      jni, *j_media_codec_video_decoder_class_, "queueInputBuffer", "(IIJJJ)Z");
-  j_dequeue_byte_buffer_method_ = GetMethodID(
-      jni, *j_media_codec_video_decoder_class_, "dequeueOutputBuffer",
-      "(I)Lorg/webrtc/MediaCodecVideoDecoder$DecodedOutputBuffer;");
-  j_dequeue_texture_buffer_method_ = GetMethodID(
-      jni, *j_media_codec_video_decoder_class_, "dequeueTextureBuffer",
-      "(I)Lorg/webrtc/MediaCodecVideoDecoder$DecodedTextureBuffer;");
-  j_return_decoded_byte_buffer_method_ =
-      GetMethodID(jni, *j_media_codec_video_decoder_class_,
-                  "returnDecodedOutputBuffer", "(I)V");
-
-  j_input_buffers_field_ = GetFieldID(
-      jni, *j_media_codec_video_decoder_class_,
-      "inputBuffers", "[Ljava/nio/ByteBuffer;");
-  j_output_buffers_field_ = GetFieldID(
-      jni, *j_media_codec_video_decoder_class_,
-      "outputBuffers", "[Ljava/nio/ByteBuffer;");
-  j_color_format_field_ = GetFieldID(
-      jni, *j_media_codec_video_decoder_class_, "colorFormat", "I");
-  j_width_field_ = GetFieldID(
-      jni, *j_media_codec_video_decoder_class_, "width", "I");
-  j_height_field_ = GetFieldID(
-      jni, *j_media_codec_video_decoder_class_, "height", "I");
-  j_stride_field_ = GetFieldID(
-      jni, *j_media_codec_video_decoder_class_, "stride", "I");
-  j_slice_height_field_ = GetFieldID(
-      jni, *j_media_codec_video_decoder_class_, "sliceHeight", "I");
-
-  jclass j_decoded_texture_buffer_class = FindClass(jni,
-      "org/webrtc/MediaCodecVideoDecoder$DecodedTextureBuffer");
-  j_texture_id_field_ = GetFieldID(
-      jni, j_decoded_texture_buffer_class, "textureID", "I");
-  j_transform_matrix_field_ = GetFieldID(
-      jni, j_decoded_texture_buffer_class, "transformMatrix", "[F");
-  j_texture_presentation_timestamp_ms_field_ = GetFieldID(
-      jni, j_decoded_texture_buffer_class, "presentationTimeStampMs", "J");
-  j_texture_timestamp_ms_field_ = GetFieldID(
-      jni, j_decoded_texture_buffer_class, "timeStampMs", "J");
-  j_texture_ntp_timestamp_ms_field_ = GetFieldID(
-      jni, j_decoded_texture_buffer_class, "ntpTimeStampMs", "J");
-  j_texture_decode_time_ms_field_ = GetFieldID(
-      jni, j_decoded_texture_buffer_class, "decodeTimeMs", "J");
-  j_texture_frame_delay_ms_field_ = GetFieldID(
-      jni, j_decoded_texture_buffer_class, "frameDelayMs", "J");
-
-  jclass j_decoded_output_buffer_class = FindClass(jni,
-      "org/webrtc/MediaCodecVideoDecoder$DecodedOutputBuffer");
-  j_info_index_field_ = GetFieldID(
-      jni, j_decoded_output_buffer_class, "index", "I");
-  j_info_offset_field_ = GetFieldID(
-      jni, j_decoded_output_buffer_class, "offset", "I");
-  j_info_size_field_ = GetFieldID(
-      jni, j_decoded_output_buffer_class, "size", "I");
-  j_presentation_timestamp_ms_field_ = GetFieldID(
-      jni, j_decoded_output_buffer_class, "presentationTimeStampMs", "J");
-  j_timestamp_ms_field_ = GetFieldID(
-      jni, j_decoded_output_buffer_class, "timeStampMs", "J");
-  j_ntp_timestamp_ms_field_ = GetFieldID(
-      jni, j_decoded_output_buffer_class, "ntpTimeStampMs", "J");
-  j_byte_buffer_decode_time_ms_field_ = GetFieldID(
-      jni, j_decoded_output_buffer_class, "decodeTimeMs", "J");
-
-  CHECK_EXCEPTION(jni) << "MediaCodecVideoDecoder ctor failed";
-  use_surface_ = (render_egl_context_ != NULL);
-  ALOGD << "MediaCodecVideoDecoder ctor. Use surface: " << use_surface_;
-  memset(&codec_, 0, sizeof(codec_));
-  AllowBlockingCalls();
-}
-
-MediaCodecVideoDecoder::~MediaCodecVideoDecoder() {
-  // Call Release() to ensure no more callbacks to us after we are deleted.
-  Release();
-}
-
-int32_t MediaCodecVideoDecoder::InitDecode(const VideoCodec* inst,
-    int32_t numberOfCores) {
-  ALOGD << "InitDecode.";
-  if (inst == NULL) {
-    ALOGE << "NULL VideoCodec instance";
-    return WEBRTC_VIDEO_CODEC_ERR_PARAMETER;
-  }
-  // Factory should guard against other codecs being used with us.
-  RTC_CHECK(inst->codecType == codecType_)
-      << "Unsupported codec " << inst->codecType << " for " << codecType_;
-
-  if (sw_fallback_required_) {
-    ALOGE << "InitDecode() - fallback to SW decoder";
-    return WEBRTC_VIDEO_CODEC_OK;
-  }
-  // Save VideoCodec instance for later.
-  if (&codec_ != inst) {
-    codec_ = *inst;
-  }
-  // If maxFramerate is not set then assume 30 fps.
-  codec_.maxFramerate = (codec_.maxFramerate >= 1) ? codec_.maxFramerate : 30;
-
-  // Call Java init.
-  return codec_thread_->Invoke<int32_t>(
-      RTC_FROM_HERE,
-      Bind(&MediaCodecVideoDecoder::InitDecodeOnCodecThread, this));
-}
-
-void MediaCodecVideoDecoder::ResetVariables() {
-  CheckOnCodecThread();
-
-  key_frame_required_ = true;
-  frames_received_ = 0;
-  frames_decoded_ = 0;
-  frames_decoded_logged_ = kMaxDecodedLogFrames;
-  start_time_ms_ = rtc::TimeMillis();
-  current_frames_ = 0;
-  current_bytes_ = 0;
-  current_decoding_time_ms_ = 0;
-  current_delay_time_ms_ = 0;
-  pending_frame_qps_.clear();
-}
-
-int32_t MediaCodecVideoDecoder::InitDecodeOnCodecThread() {
-  CheckOnCodecThread();
-  JNIEnv* jni = AttachCurrentThreadIfNeeded();
-  ScopedLocalRefFrame local_ref_frame(jni);
-  ALOGD << "InitDecodeOnCodecThread Type: " << (int)codecType_ << ". "
-      << codec_.width << " x " << codec_.height << ". Fps: " <<
-      (int)codec_.maxFramerate;
-
-  // Release previous codec first if it was allocated before.
-  int ret_val = ReleaseOnCodecThread();
-  if (ret_val < 0) {
-    ALOGE << "Release failure: " << ret_val << " - fallback to SW codec";
-    sw_fallback_required_ = true;
-    return WEBRTC_VIDEO_CODEC_ERROR;
-  }
-
-  ResetVariables();
-
-  if (use_surface_) {
-    surface_texture_helper_ = SurfaceTextureHelper::create(
-        jni, "Decoder SurfaceTextureHelper", render_egl_context_);
-    if (!surface_texture_helper_) {
-      ALOGE << "Couldn't create SurfaceTextureHelper - fallback to SW codec";
-      sw_fallback_required_ = true;
-      return WEBRTC_VIDEO_CODEC_ERROR;
-    }
-  }
-
-  jobject j_video_codec_enum = JavaEnumFromIndexAndClassName(
-      jni, "MediaCodecVideoDecoder$VideoCodecType", codecType_);
-  bool success = jni->CallBooleanMethod(
-      *j_media_codec_video_decoder_,
-      j_init_decode_method_,
-      j_video_codec_enum,
-      codec_.width,
-      codec_.height,
-      use_surface_ ? surface_texture_helper_->GetJavaSurfaceTextureHelper()
-                   : nullptr);
-
-  if (CheckException(jni) || !success) {
-    ALOGE << "Codec initialization error - fallback to SW codec.";
-    sw_fallback_required_ = true;
-    return WEBRTC_VIDEO_CODEC_ERROR;
-  }
-  inited_ = true;
-
-  switch (codecType_) {
-    case kVideoCodecVP8:
-      max_pending_frames_ = kMaxPendingFramesVp8;
-      break;
-    case kVideoCodecVP9:
-      max_pending_frames_ = kMaxPendingFramesVp9;
-      break;
-    case kVideoCodecH264:
-      max_pending_frames_ = kMaxPendingFramesH264;
-      break;
-    default:
-      max_pending_frames_ = 0;
-  }
-  ALOGD << "Maximum amount of pending frames: " << max_pending_frames_;
-
-  jobjectArray input_buffers = (jobjectArray)GetObjectField(
-      jni, *j_media_codec_video_decoder_, j_input_buffers_field_);
-  size_t num_input_buffers = jni->GetArrayLength(input_buffers);
-  input_buffers_.resize(num_input_buffers);
-  for (size_t i = 0; i < num_input_buffers; ++i) {
-    input_buffers_[i] =
-        jni->NewGlobalRef(jni->GetObjectArrayElement(input_buffers, i));
-    if (CheckException(jni)) {
-      ALOGE << "NewGlobalRef error - fallback to SW codec.";
-      sw_fallback_required_ = true;
-      return WEBRTC_VIDEO_CODEC_ERROR;
-    }
-  }
-
-  codec_thread_->PostDelayed(RTC_FROM_HERE, kMediaCodecPollMs, this);
-
-  return WEBRTC_VIDEO_CODEC_OK;
-}
-
-int32_t MediaCodecVideoDecoder::ResetDecodeOnCodecThread() {
-  CheckOnCodecThread();
-  JNIEnv* jni = AttachCurrentThreadIfNeeded();
-  ScopedLocalRefFrame local_ref_frame(jni);
-  ALOGD << "ResetDecodeOnCodecThread Type: " << (int)codecType_ << ". "
-      << codec_.width << " x " << codec_.height;
-  ALOGD << "  Frames received: " << frames_received_ <<
-      ". Frames decoded: " << frames_decoded_;
-
-  inited_ = false;
-  rtc::MessageQueueManager::Clear(this);
-  ResetVariables();
-
-  jni->CallVoidMethod(
-      *j_media_codec_video_decoder_,
-      j_reset_method_,
-      codec_.width,
-      codec_.height);
-
-  if (CheckException(jni)) {
-    ALOGE << "Soft reset error - fallback to SW codec.";
-    sw_fallback_required_ = true;
-    return WEBRTC_VIDEO_CODEC_ERROR;
-  }
-  inited_ = true;
-
-  codec_thread_->PostDelayed(RTC_FROM_HERE, kMediaCodecPollMs, this);
-
-  return WEBRTC_VIDEO_CODEC_OK;
-}
-
-int32_t MediaCodecVideoDecoder::Release() {
-  ALOGD << "DecoderRelease request";
-  return codec_thread_->Invoke<int32_t>(
-      RTC_FROM_HERE, Bind(&MediaCodecVideoDecoder::ReleaseOnCodecThread, this));
-}
-
-int32_t MediaCodecVideoDecoder::ReleaseOnCodecThread() {
-  if (!inited_) {
-    return WEBRTC_VIDEO_CODEC_OK;
-  }
-  CheckOnCodecThread();
-  JNIEnv* jni = AttachCurrentThreadIfNeeded();
-  ALOGD << "DecoderReleaseOnCodecThread: Frames received: " <<
-      frames_received_ << ". Frames decoded: " << frames_decoded_;
-  ScopedLocalRefFrame local_ref_frame(jni);
-  for (size_t i = 0; i < input_buffers_.size(); i++) {
-    jni->DeleteGlobalRef(input_buffers_[i]);
-  }
-  input_buffers_.clear();
-  jni->CallVoidMethod(*j_media_codec_video_decoder_, j_release_method_);
-  surface_texture_helper_ = nullptr;
-  inited_ = false;
-  rtc::MessageQueueManager::Clear(this);
-  if (CheckException(jni)) {
-    ALOGE << "Decoder release exception";
-    return WEBRTC_VIDEO_CODEC_ERROR;
-  }
-  ALOGD << "DecoderReleaseOnCodecThread done";
-  return WEBRTC_VIDEO_CODEC_OK;
-}
-
-void MediaCodecVideoDecoder::CheckOnCodecThread() {
-  RTC_CHECK(codec_thread_.get() == ThreadManager::Instance()->CurrentThread())
-      << "Running on wrong thread!";
-}
-
-void MediaCodecVideoDecoder::EnableFrameLogOnWarning() {
-  // Log next 2 output frames.
-  frames_decoded_logged_ = std::max(
-      frames_decoded_logged_, frames_decoded_ + kMaxWarningLogFrames);
-}
-
-int32_t MediaCodecVideoDecoder::ProcessHWErrorOnCodecThread() {
-  CheckOnCodecThread();
-  int ret_val = ReleaseOnCodecThread();
-  if (ret_val < 0) {
-    ALOGE << "ProcessHWError: Release failure";
-  }
-  if (codecType_ == kVideoCodecH264) {
-    // For now there is no SW H.264 which can be used as fallback codec.
-    // So try to restart hw codec for now.
-    ret_val = InitDecodeOnCodecThread();
-    ALOGE << "Reset H.264 codec done. Status: " << ret_val;
-    if (ret_val == WEBRTC_VIDEO_CODEC_OK) {
-      // H.264 codec was succesfully reset - return regular error code.
-      return WEBRTC_VIDEO_CODEC_ERROR;
-    } else {
-      // Fail to restart H.264 codec - return error code which should stop the
-      // call.
-      return WEBRTC_VIDEO_CODEC_FALLBACK_SOFTWARE;
-    }
-  } else {
-    sw_fallback_required_ = true;
-    ALOGE << "Return WEBRTC_VIDEO_CODEC_FALLBACK_SOFTWARE";
-    return WEBRTC_VIDEO_CODEC_FALLBACK_SOFTWARE;
-  }
-}
-
-int32_t MediaCodecVideoDecoder::Decode(
-    const EncodedImage& inputImage,
-    bool missingFrames,
-    const RTPFragmentationHeader* fragmentation,
-    const CodecSpecificInfo* codecSpecificInfo,
-    int64_t renderTimeMs) {
-  if (sw_fallback_required_) {
-    ALOGE << "Decode() - fallback to SW codec";
-    return WEBRTC_VIDEO_CODEC_FALLBACK_SOFTWARE;
-  }
-  if (callback_ == NULL) {
-    ALOGE << "Decode() - callback_ is NULL";
-    return WEBRTC_VIDEO_CODEC_UNINITIALIZED;
-  }
-  if (inputImage._buffer == NULL && inputImage._length > 0) {
-    ALOGE << "Decode() - inputImage is incorrect";
-    return WEBRTC_VIDEO_CODEC_ERR_PARAMETER;
-  }
-  if (!inited_) {
-    ALOGE << "Decode() - decoder is not initialized";
-    return WEBRTC_VIDEO_CODEC_UNINITIALIZED;
-  }
-
-  // Check if encoded frame dimension has changed.
-  if ((inputImage._encodedWidth * inputImage._encodedHeight > 0) &&
-      (inputImage._encodedWidth != codec_.width ||
-      inputImage._encodedHeight != codec_.height)) {
-    ALOGW << "Input resolution changed from " <<
-        codec_.width << " x " << codec_.height << " to " <<
-        inputImage._encodedWidth << " x " << inputImage._encodedHeight;
-    codec_.width = inputImage._encodedWidth;
-    codec_.height = inputImage._encodedHeight;
-    int32_t ret;
-    if (use_surface_ &&
-        (codecType_ == kVideoCodecVP8 || codecType_ == kVideoCodecH264)) {
-      // Soft codec reset - only for surface decoding.
-      ret = codec_thread_->Invoke<int32_t>(
-          RTC_FROM_HERE,
-          Bind(&MediaCodecVideoDecoder::ResetDecodeOnCodecThread, this));
-    } else {
-      // Hard codec reset.
-      ret = InitDecode(&codec_, 1);
-    }
-    if (ret < 0) {
-      ALOGE << "InitDecode failure: " << ret << " - fallback to SW codec";
-      sw_fallback_required_ = true;
-      return WEBRTC_VIDEO_CODEC_FALLBACK_SOFTWARE;
-    }
-  }
-
-  // Always start with a complete key frame.
-  if (key_frame_required_) {
-    if (inputImage._frameType != kVideoFrameKey) {
-      ALOGE << "Decode() - key frame is required";
-      return WEBRTC_VIDEO_CODEC_ERROR;
-    }
-    if (!inputImage._completeFrame) {
-      ALOGE << "Decode() - complete frame is required";
-      return WEBRTC_VIDEO_CODEC_ERROR;
-    }
-    key_frame_required_ = false;
-  }
-  if (inputImage._length == 0) {
-    return WEBRTC_VIDEO_CODEC_ERROR;
-  }
-
-  return codec_thread_->Invoke<int32_t>(
-      RTC_FROM_HERE,
-      Bind(&MediaCodecVideoDecoder::DecodeOnCodecThread, this, inputImage));
-}
-
-int32_t MediaCodecVideoDecoder::DecodeOnCodecThread(
-    const EncodedImage& inputImage) {
-  CheckOnCodecThread();
-  JNIEnv* jni = AttachCurrentThreadIfNeeded();
-  ScopedLocalRefFrame local_ref_frame(jni);
-
-  // Try to drain the decoder and wait until output is not too
-  // much behind the input.
-  if (codecType_ == kVideoCodecH264 &&
-      frames_received_ > frames_decoded_ + max_pending_frames_) {
-    // Print warning for H.264 only - for VP8/VP9 one frame delay is ok.
-    ALOGW << "Decoder is too far behind. Try to drain. Received: " <<
-        frames_received_ << ". Decoded: " << frames_decoded_;
-    EnableFrameLogOnWarning();
-  }
-  const int64 drain_start = rtc::TimeMillis();
-  while ((frames_received_ > frames_decoded_ + max_pending_frames_) &&
-         (rtc::TimeMillis() - drain_start) < kMediaCodecTimeoutMs) {
-    if (!DeliverPendingOutputs(jni, kMediaCodecPollMs)) {
-      ALOGE << "DeliverPendingOutputs error. Frames received: " <<
-          frames_received_ << ". Frames decoded: " << frames_decoded_;
-      return ProcessHWErrorOnCodecThread();
-    }
-  }
-  if (frames_received_ > frames_decoded_ + max_pending_frames_) {
-    ALOGE << "Output buffer dequeue timeout. Frames received: " <<
-        frames_received_ << ". Frames decoded: " << frames_decoded_;
-    return ProcessHWErrorOnCodecThread();
-  }
-
-  // Get input buffer.
-  int j_input_buffer_index = jni->CallIntMethod(
-      *j_media_codec_video_decoder_, j_dequeue_input_buffer_method_);
-  if (CheckException(jni) || j_input_buffer_index < 0) {
-    ALOGE << "dequeueInputBuffer error: " << j_input_buffer_index <<
-        ". Retry DeliverPendingOutputs.";
-    EnableFrameLogOnWarning();
-    // Try to drain the decoder.
-    if (!DeliverPendingOutputs(jni, kMediaCodecPollMs)) {
-      ALOGE << "DeliverPendingOutputs error. Frames received: " <<
-          frames_received_ << ". Frames decoded: " << frames_decoded_;
-      return ProcessHWErrorOnCodecThread();
-    }
-    // Try dequeue input buffer one last time.
-    j_input_buffer_index = jni->CallIntMethod(
-        *j_media_codec_video_decoder_, j_dequeue_input_buffer_method_);
-    if (CheckException(jni) || j_input_buffer_index < 0) {
-      ALOGE << "dequeueInputBuffer critical error: " << j_input_buffer_index;
-      return ProcessHWErrorOnCodecThread();
-    }
-  }
-
-  // Copy encoded data to Java ByteBuffer.
-  jobject j_input_buffer = input_buffers_[j_input_buffer_index];
-  uint8_t* buffer =
-      reinterpret_cast<uint8_t*>(jni->GetDirectBufferAddress(j_input_buffer));
-  RTC_CHECK(buffer) << "Indirect buffer??";
-  int64_t buffer_capacity = jni->GetDirectBufferCapacity(j_input_buffer);
-  if (CheckException(jni) || buffer_capacity < inputImage._length) {
-    ALOGE << "Input frame size "<<  inputImage._length <<
-        " is bigger than buffer size " << buffer_capacity;
-    return ProcessHWErrorOnCodecThread();
-  }
-  jlong presentation_timestamp_us = static_cast<jlong>(
-      static_cast<int64_t>(frames_received_) * 1000000 / codec_.maxFramerate);
-  memcpy(buffer, inputImage._buffer, inputImage._length);
-
-  if (frames_decoded_ < frames_decoded_logged_) {
-    ALOGD << "Decoder frame in # " << frames_received_ <<
-        ". Type: " << inputImage._frameType <<
-        ". Buffer # " << j_input_buffer_index <<
-        ". TS: " << presentation_timestamp_us / 1000 <<
-        ". Size: " << inputImage._length;
-  }
-
-  // Save input image timestamps for later output.
-  frames_received_++;
-  current_bytes_ += inputImage._length;
-  rtc::Optional<uint8_t> qp;
-  if (codecType_ == kVideoCodecVP8) {
-    int qp_int;
-    if (vp8::GetQp(inputImage._buffer, inputImage._length, &qp_int)) {
-      qp = rtc::Optional<uint8_t>(qp_int);
-    }
-  } else if (codecType_ == kVideoCodecH264) {
-    h264_bitstream_parser_.ParseBitstream(inputImage._buffer,
-                                          inputImage._length);
-    int qp_int;
-    if (h264_bitstream_parser_.GetLastSliceQp(&qp_int)) {
-      qp = rtc::Optional<uint8_t>(qp_int);
-    }
-  }
-  pending_frame_qps_.push_back(qp);
-
-  // Feed input to decoder.
-  bool success = jni->CallBooleanMethod(
-      *j_media_codec_video_decoder_,
-      j_queue_input_buffer_method_,
-      j_input_buffer_index,
-      inputImage._length,
-      presentation_timestamp_us,
-      static_cast<int64_t> (inputImage._timeStamp),
-      inputImage.ntp_time_ms_);
-  if (CheckException(jni) || !success) {
-    ALOGE << "queueInputBuffer error";
-    return ProcessHWErrorOnCodecThread();
-  }
-
-  // Try to drain the decoder
-  if (!DeliverPendingOutputs(jni, 0)) {
-    ALOGE << "DeliverPendingOutputs error";
-    return ProcessHWErrorOnCodecThread();
-  }
-
-  return WEBRTC_VIDEO_CODEC_OK;
-}
-
-bool MediaCodecVideoDecoder::DeliverPendingOutputs(
-    JNIEnv* jni, int dequeue_timeout_ms) {
-  CheckOnCodecThread();
-  if (frames_received_ <= frames_decoded_) {
-    // No need to query for output buffers - decoder is drained.
-    return true;
-  }
-  // Get decoder output.
-  jobject j_decoder_output_buffer =
-      jni->CallObjectMethod(*j_media_codec_video_decoder_,
-          use_surface_ ? j_dequeue_texture_buffer_method_
-                       : j_dequeue_byte_buffer_method_,
-          dequeue_timeout_ms);
-
-  if (CheckException(jni)) {
-    ALOGE << "dequeueOutputBuffer() error";
-    return false;
-  }
-  if (IsNull(jni, j_decoder_output_buffer)) {
-    // No decoded frame ready.
-    return true;
-  }
-
-  // Get decoded video frame properties.
-  int color_format = GetIntField(jni, *j_media_codec_video_decoder_,
-      j_color_format_field_);
-  int width = GetIntField(jni, *j_media_codec_video_decoder_, j_width_field_);
-  int height = GetIntField(jni, *j_media_codec_video_decoder_, j_height_field_);
-
-  rtc::scoped_refptr<VideoFrameBuffer> frame_buffer;
-  int64_t presentation_timestamps_ms = 0;
-  int64_t output_timestamps_ms = 0;
-  int64_t output_ntp_timestamps_ms = 0;
-  int decode_time_ms = 0;
-  int64_t frame_delayed_ms = 0;
-  if (use_surface_) {
-    // Extract data from Java DecodedTextureBuffer.
-    presentation_timestamps_ms = GetLongField(
-        jni, j_decoder_output_buffer,
-        j_texture_presentation_timestamp_ms_field_);
-    output_timestamps_ms = GetLongField(
-        jni, j_decoder_output_buffer, j_texture_timestamp_ms_field_);
-    output_ntp_timestamps_ms = GetLongField(
-        jni, j_decoder_output_buffer, j_texture_ntp_timestamp_ms_field_);
-    decode_time_ms = GetLongField(
-        jni, j_decoder_output_buffer, j_texture_decode_time_ms_field_);
-
-    const int texture_id =
-        GetIntField(jni, j_decoder_output_buffer, j_texture_id_field_);
-    if (texture_id != 0) {  // |texture_id| == 0 represents a dropped frame.
-      const jfloatArray j_transform_matrix =
-          reinterpret_cast<jfloatArray>(GetObjectField(
-              jni, j_decoder_output_buffer, j_transform_matrix_field_));
-      frame_delayed_ms = GetLongField(
-          jni, j_decoder_output_buffer, j_texture_frame_delay_ms_field_);
-
-      // Create VideoFrameBuffer with native texture handle.
-      frame_buffer = surface_texture_helper_->CreateTextureFrame(
-          width, height, NativeHandleImpl(jni, texture_id, j_transform_matrix));
-    } else {
-      EnableFrameLogOnWarning();
-    }
-  } else {
-    // Extract data from Java ByteBuffer and create output yuv420 frame -
-    // for non surface decoding only.
-    int stride =
-        GetIntField(jni, *j_media_codec_video_decoder_, j_stride_field_);
-    const int slice_height =
-        GetIntField(jni, *j_media_codec_video_decoder_, j_slice_height_field_);
-    const int output_buffer_index = GetIntField(
-        jni, j_decoder_output_buffer, j_info_index_field_);
-    const int output_buffer_offset = GetIntField(
-        jni, j_decoder_output_buffer, j_info_offset_field_);
-    const int output_buffer_size = GetIntField(
-        jni, j_decoder_output_buffer, j_info_size_field_);
-    presentation_timestamps_ms = GetLongField(
-        jni, j_decoder_output_buffer, j_presentation_timestamp_ms_field_);
-    output_timestamps_ms = GetLongField(
-        jni, j_decoder_output_buffer, j_timestamp_ms_field_);
-    output_ntp_timestamps_ms = GetLongField(
-        jni, j_decoder_output_buffer, j_ntp_timestamp_ms_field_);
-
-    decode_time_ms = GetLongField(jni, j_decoder_output_buffer,
-                                  j_byte_buffer_decode_time_ms_field_);
-    RTC_CHECK_GE(slice_height, height);
-
-    if (output_buffer_size < width * height * 3 / 2) {
-      ALOGE << "Insufficient output buffer size: " << output_buffer_size;
-      return false;
-    }
-    if (output_buffer_size < stride * height * 3 / 2 &&
-        slice_height == height && stride > width) {
-      // Some codecs (Exynos) incorrectly report stride information for
-      // output byte buffer, so actual stride value need to be corrected.
-      stride = output_buffer_size * 2 / (height * 3);
-    }
-    jobjectArray output_buffers = reinterpret_cast<jobjectArray>(GetObjectField(
-        jni, *j_media_codec_video_decoder_, j_output_buffers_field_));
-    jobject output_buffer =
-        jni->GetObjectArrayElement(output_buffers, output_buffer_index);
-    uint8_t* payload = reinterpret_cast<uint8_t*>(jni->GetDirectBufferAddress(
-        output_buffer));
-    if (CheckException(jni)) {
-      return false;
-    }
-    payload += output_buffer_offset;
-
-    // Create yuv420 frame.
-    rtc::scoped_refptr<I420Buffer> i420_buffer =
-        decoded_frame_pool_.CreateBuffer(width, height);
-    if (color_format == COLOR_FormatYUV420Planar) {
-      RTC_CHECK_EQ(0, stride % 2);
-      const int uv_stride = stride / 2;
-      const uint8_t* y_ptr = payload;
-      const uint8_t* u_ptr = y_ptr + stride * slice_height;
-
-      // Note that the case with odd |slice_height| is handled in a special way.
-      // The chroma height contained in the payload is rounded down instead of
-      // up, making it one row less than what we expect in WebRTC. Therefore, we
-      // have to duplicate the last chroma rows for this case. Also, the offset
-      // between the Y plane and the U plane is unintuitive for this case. See
-      // http://bugs.webrtc.org/6651 for more info.
-      const int chroma_width = (width + 1) / 2;
-      const int chroma_height =
-          (slice_height % 2 == 0) ? (height + 1) / 2 : height / 2;
-      const int u_offset = uv_stride * slice_height / 2;
-      const uint8_t* v_ptr = u_ptr + u_offset;
-      libyuv::CopyPlane(y_ptr, stride,
-                        i420_buffer->MutableDataY(), i420_buffer->StrideY(),
-                        width, height);
-      libyuv::CopyPlane(u_ptr, uv_stride,
-                        i420_buffer->MutableDataU(), i420_buffer->StrideU(),
-                        chroma_width, chroma_height);
-      libyuv::CopyPlane(v_ptr, uv_stride,
-                        i420_buffer->MutableDataV(), i420_buffer->StrideV(),
-                        chroma_width, chroma_height);
-      if (slice_height % 2 == 1) {
-        RTC_CHECK_EQ(height, slice_height);
-        // Duplicate the last chroma rows.
-        uint8_t* u_last_row_ptr = i420_buffer->MutableDataU() +
-                                  chroma_height * i420_buffer->StrideU();
-        memcpy(u_last_row_ptr, u_last_row_ptr - i420_buffer->StrideU(),
-               i420_buffer->StrideU());
-        uint8_t* v_last_row_ptr = i420_buffer->MutableDataV() +
-                                  chroma_height * i420_buffer->StrideV();
-        memcpy(v_last_row_ptr, v_last_row_ptr - i420_buffer->StrideV(),
-               i420_buffer->StrideV());
-      }
-    } else {
-      // All other supported formats are nv12.
-      const uint8_t* y_ptr = payload;
-      const uint8_t* uv_ptr = y_ptr + stride * slice_height;
-      libyuv::NV12ToI420(y_ptr, stride, uv_ptr, stride,
-                         i420_buffer->MutableDataY(), i420_buffer->StrideY(),
-                         i420_buffer->MutableDataU(), i420_buffer->StrideU(),
-                         i420_buffer->MutableDataV(), i420_buffer->StrideV(),
-                         width, height);
-    }
-    frame_buffer = i420_buffer;
-
-    // Return output byte buffer back to codec.
-    jni->CallVoidMethod(
-        *j_media_codec_video_decoder_,
-        j_return_decoded_byte_buffer_method_,
-        output_buffer_index);
-    if (CheckException(jni)) {
-      ALOGE << "returnDecodedOutputBuffer error";
-      return false;
-    }
-  }
-  if (frames_decoded_ < frames_decoded_logged_) {
-    ALOGD << "Decoder frame out # " << frames_decoded_ <<
-        ". " << width << " x " << height <<
-        ". Color: " << color_format <<
-        ". TS: " << presentation_timestamps_ms <<
-        ". DecTime: " << (int)decode_time_ms <<
-        ". DelayTime: " << (int)frame_delayed_ms;
-  }
-
-  // Calculate and print decoding statistics - every 3 seconds.
-  frames_decoded_++;
-  current_frames_++;
-  current_decoding_time_ms_ += decode_time_ms;
-  current_delay_time_ms_ += frame_delayed_ms;
-  int statistic_time_ms = rtc::TimeMillis() - start_time_ms_;
-  if (statistic_time_ms >= kMediaCodecStatisticsIntervalMs &&
-      current_frames_ > 0) {
-    int current_bitrate = current_bytes_ * 8 / statistic_time_ms;
-    int current_fps =
-        (current_frames_ * 1000 + statistic_time_ms / 2) / statistic_time_ms;
-    ALOGD << "Frames decoded: " << frames_decoded_ <<
-        ". Received: " <<  frames_received_ <<
-        ". Bitrate: " << current_bitrate << " kbps" <<
-        ". Fps: " << current_fps <<
-        ". DecTime: " << (current_decoding_time_ms_ / current_frames_) <<
-        ". DelayTime: " << (current_delay_time_ms_ / current_frames_) <<
-        " for last " << statistic_time_ms << " ms.";
-    start_time_ms_ = rtc::TimeMillis();
-    current_frames_ = 0;
-    current_bytes_ = 0;
-    current_decoding_time_ms_ = 0;
-    current_delay_time_ms_ = 0;
-  }
-
-  // If the frame was dropped, frame_buffer is left as nullptr.
-  if (frame_buffer) {
-    VideoFrame decoded_frame(frame_buffer, 0, 0, kVideoRotation_0);
-    decoded_frame.set_timestamp(output_timestamps_ms);
-    decoded_frame.set_ntp_time_ms(output_ntp_timestamps_ms);
-
-    rtc::Optional<uint8_t> qp = pending_frame_qps_.front();
-    pending_frame_qps_.pop_front();
-    callback_->Decoded(decoded_frame, rtc::Optional<int32_t>(decode_time_ms),
-                       qp);
-  }
-  return true;
-}
-
-int32_t MediaCodecVideoDecoder::RegisterDecodeCompleteCallback(
-    DecodedImageCallback* callback) {
-  callback_ = callback;
-  return WEBRTC_VIDEO_CODEC_OK;
-}
-
-void MediaCodecVideoDecoder::OnMessage(rtc::Message* msg) {
-  JNIEnv* jni = AttachCurrentThreadIfNeeded();
-  ScopedLocalRefFrame local_ref_frame(jni);
-  if (!inited_) {
-    return;
-  }
-  // We only ever send one message to |this| directly (not through a Bind()'d
-  // functor), so expect no ID/data.
-  RTC_CHECK(!msg->message_id) << "Unexpected message!";
-  RTC_CHECK(!msg->pdata) << "Unexpected message!";
-  CheckOnCodecThread();
-
-  if (!DeliverPendingOutputs(jni, 0)) {
-    ALOGE << "OnMessage: DeliverPendingOutputs error";
-    ProcessHWErrorOnCodecThread();
-    return;
-  }
-  codec_thread_->PostDelayed(RTC_FROM_HERE, kMediaCodecPollMs, this);
-}
-
-MediaCodecVideoDecoderFactory::MediaCodecVideoDecoderFactory()
-    : egl_context_(nullptr) {
-  ALOGD << "MediaCodecVideoDecoderFactory ctor";
-  JNIEnv* jni = AttachCurrentThreadIfNeeded();
-  ScopedLocalRefFrame local_ref_frame(jni);
-  jclass j_decoder_class = FindClass(jni, "org/webrtc/MediaCodecVideoDecoder");
-  supported_codec_types_.clear();
-
-  bool is_vp8_hw_supported = jni->CallStaticBooleanMethod(
-      j_decoder_class,
-      GetStaticMethodID(jni, j_decoder_class, "isVp8HwSupported", "()Z"));
-  if (CheckException(jni)) {
-    is_vp8_hw_supported = false;
-  }
-  if (is_vp8_hw_supported) {
-    ALOGD << "VP8 HW Decoder supported.";
-    supported_codec_types_.push_back(kVideoCodecVP8);
-  }
-
-  bool is_vp9_hw_supported = jni->CallStaticBooleanMethod(
-      j_decoder_class,
-      GetStaticMethodID(jni, j_decoder_class, "isVp9HwSupported", "()Z"));
-  if (CheckException(jni)) {
-    is_vp9_hw_supported = false;
-  }
-  if (is_vp9_hw_supported) {
-    ALOGD << "VP9 HW Decoder supported.";
-    supported_codec_types_.push_back(kVideoCodecVP9);
-  }
-
-  bool is_h264_hw_supported = jni->CallStaticBooleanMethod(
-      j_decoder_class,
-      GetStaticMethodID(jni, j_decoder_class, "isH264HwSupported", "()Z"));
-  if (CheckException(jni)) {
-    is_h264_hw_supported = false;
-  }
-  if (is_h264_hw_supported) {
-    ALOGD << "H264 HW Decoder supported.";
-    supported_codec_types_.push_back(kVideoCodecH264);
-  }
-}
-
-MediaCodecVideoDecoderFactory::~MediaCodecVideoDecoderFactory() {
-  ALOGD << "MediaCodecVideoDecoderFactory dtor";
-  if (egl_context_) {
-    JNIEnv* jni = AttachCurrentThreadIfNeeded();
-    jni->DeleteGlobalRef(egl_context_);
-  }
-}
-
-void MediaCodecVideoDecoderFactory::SetEGLContext(
-    JNIEnv* jni, jobject egl_context) {
-  ALOGD << "MediaCodecVideoDecoderFactory::SetEGLContext";
-  if (egl_context_) {
-    jni->DeleteGlobalRef(egl_context_);
-    egl_context_ = nullptr;
-  }
-  egl_context_ = jni->NewGlobalRef(egl_context);
-  if (CheckException(jni)) {
-    ALOGE << "error calling NewGlobalRef for EGL Context.";
-  }
-}
-
-VideoDecoder* MediaCodecVideoDecoderFactory::CreateVideoDecoder(
-    VideoCodecType type) {
-  if (supported_codec_types_.empty()) {
-    ALOGW << "No HW video decoder for type " << (int)type;
-    return nullptr;
-  }
-  for (VideoCodecType codec_type : supported_codec_types_) {
-    if (codec_type == type) {
-      ALOGD << "Create HW video decoder for type " << (int)type;
-      JNIEnv* jni = AttachCurrentThreadIfNeeded();
-      ScopedLocalRefFrame local_ref_frame(jni);
-      return new MediaCodecVideoDecoder(jni, type, egl_context_);
-    }
-  }
-  ALOGW << "Can not find HW video decoder for type " << (int)type;
-  return nullptr;
-}
-
-void MediaCodecVideoDecoderFactory::DestroyVideoDecoder(VideoDecoder* decoder) {
-  ALOGD << "Destroy video decoder.";
-  delete decoder;
-}
-
-const char* MediaCodecVideoDecoder::ImplementationName() const {
-  return "MediaCodec";
-}
-
-}  // namespace jni
-}  // namespace webrtc
diff --git a/sdk/android/src/jni/androidmediadecoder_jni.h b/sdk/android/src/jni/androidmediadecoder_jni.h
deleted file mode 100644
index b971647..0000000
--- a/sdk/android/src/jni/androidmediadecoder_jni.h
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- *  Copyright 2015 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_SDK_ANDROID_SRC_JNI_ANDROIDMEDIADECODER_JNI_H_
-#define WEBRTC_SDK_ANDROID_SRC_JNI_ANDROIDMEDIADECODER_JNI_H_
-
-#include "webrtc/sdk/android/src/jni/jni_helpers.h"
-#include "webrtc/media/engine/webrtcvideodecoderfactory.h"
-
-namespace webrtc {
-namespace jni {
-
-// Implementation of Android MediaCodec based decoder factory.
-class MediaCodecVideoDecoderFactory
-    : public cricket::WebRtcVideoDecoderFactory {
- public:
-  MediaCodecVideoDecoderFactory();
-  virtual ~MediaCodecVideoDecoderFactory();
-
-  void SetEGLContext(JNIEnv* jni, jobject render_egl_context);
-
-  // WebRtcVideoDecoderFactory implementation.
-  VideoDecoder* CreateVideoDecoder(VideoCodecType type) override;
-
-  void DestroyVideoDecoder(VideoDecoder* decoder) override;
-
- private:
-  jobject egl_context_;
-  std::vector<VideoCodecType> supported_codec_types_;
-};
-
-}  // namespace jni
-}  // namespace webrtc
-
-#endif  // WEBRTC_SDK_ANDROID_SRC_JNI_ANDROIDMEDIADECODER_JNI_H_
diff --git a/sdk/android/src/jni/androidmediaencoder_jni.cc b/sdk/android/src/jni/androidmediaencoder_jni.cc
deleted file mode 100644
index 7c40dac..0000000
--- a/sdk/android/src/jni/androidmediaencoder_jni.cc
+++ /dev/null
@@ -1,1485 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-// NOTICE: androidmediaencoder_jni.h must be included before
-// androidmediacodeccommon.h to avoid build errors.
-#include "webrtc/sdk/android/src/jni/androidmediaencoder_jni.h"
-
-#include <algorithm>
-#include <list>
-#include <memory>
-#include <string>
-#include <utility>
-
-#include "third_party/libyuv/include/libyuv/convert.h"
-#include "third_party/libyuv/include/libyuv/convert_from.h"
-#include "third_party/libyuv/include/libyuv/video_common.h"
-#include "webrtc/api/video_codecs/video_encoder.h"
-#include "webrtc/common_types.h"
-#include "webrtc/common_video/h264/h264_bitstream_parser.h"
-#include "webrtc/common_video/h264/h264_common.h"
-#include "webrtc/common_video/h264/profile_level_id.h"
-#include "webrtc/media/engine/internalencoderfactory.h"
-#include "webrtc/modules/video_coding/include/video_codec_interface.h"
-#include "webrtc/modules/video_coding/utility/quality_scaler.h"
-#include "webrtc/modules/video_coding/utility/vp8_header_parser.h"
-#include "webrtc/modules/video_coding/utility/vp9_uncompressed_header_parser.h"
-#include "webrtc/rtc_base/bind.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/random.h"
-#include "webrtc/rtc_base/sequenced_task_checker.h"
-#include "webrtc/rtc_base/task_queue.h"
-#include "webrtc/rtc_base/thread.h"
-#include "webrtc/rtc_base/timeutils.h"
-#include "webrtc/rtc_base/weak_ptr.h"
-#include "webrtc/sdk/android/src/jni/androidmediacodeccommon.h"
-#include "webrtc/sdk/android/src/jni/classreferenceholder.h"
-#include "webrtc/sdk/android/src/jni/jni_helpers.h"
-#include "webrtc/sdk/android/src/jni/native_handle_impl.h"
-#include "webrtc/system_wrappers/include/field_trial.h"
-
-using rtc::Bind;
-using rtc::Thread;
-using rtc::ThreadManager;
-
-namespace webrtc {
-namespace jni {
-
-// Maximum supported HW video encoder fps.
-#define MAX_VIDEO_FPS 30
-// Maximum allowed fps value in SetRates() call.
-#define MAX_ALLOWED_VIDEO_FPS 60
-// Maximum allowed frames in encoder input queue.
-#define MAX_ENCODER_Q_SIZE 2
-// Maximum amount of dropped frames caused by full encoder queue - exceeding
-// this threshold means that encoder probably got stuck and need to be reset.
-#define ENCODER_STALL_FRAMEDROP_THRESHOLD 60
-
-// Logging macros.
-#define TAG_ENCODER "MediaCodecVideoEncoder"
-#ifdef TRACK_BUFFER_TIMING
-#define ALOGV(...)
-  __android_log_print(ANDROID_LOG_VERBOSE, TAG_ENCODER, __VA_ARGS__)
-#else
-#define ALOGV(...)
-#endif
-#define ALOGD LOG_TAG(rtc::LS_INFO, TAG_ENCODER)
-#define ALOGW LOG_TAG(rtc::LS_WARNING, TAG_ENCODER)
-#define ALOGE LOG_TAG(rtc::LS_ERROR, TAG_ENCODER)
-
-namespace {
-// Maximum time limit between incoming frames before requesting a key frame.
-const size_t kFrameDiffThresholdMs = 350;
-const int kMinKeyFrameInterval = 6;
-const char kH264HighProfileFieldTrial[] = "WebRTC-H264HighProfile";
-const char kCustomQPThresholdsFieldTrial[] = "WebRTC-CustomQPThresholds";
-}  // namespace
-
-// MediaCodecVideoEncoder is a VideoEncoder implementation that uses
-// Android's MediaCodec SDK API behind the scenes to implement (hopefully)
-// HW-backed video encode.  This C++ class is implemented as a very thin shim,
-// delegating all of the interesting work to org.webrtc.MediaCodecVideoEncoder.
-// MediaCodecVideoEncoder must be operated on a single task queue, currently
-// this is the encoder queue from ViE encoder.
-class MediaCodecVideoEncoder : public VideoEncoder {
- public:
-  virtual ~MediaCodecVideoEncoder();
-  MediaCodecVideoEncoder(JNIEnv* jni,
-                         const cricket::VideoCodec& codec,
-                         jobject egl_context);
-
-  // VideoEncoder implementation.
-  int32_t InitEncode(const VideoCodec* codec_settings,
-                     int32_t /* number_of_cores */,
-                     size_t /* max_payload_size */) override;
-  int32_t Encode(const VideoFrame& input_image,
-                 const CodecSpecificInfo* /* codec_specific_info */,
-                 const std::vector<FrameType>* frame_types) override;
-  int32_t RegisterEncodeCompleteCallback(
-      EncodedImageCallback* callback) override;
-  int32_t Release() override;
-  int32_t SetChannelParameters(uint32_t /* packet_loss */,
-                               int64_t /* rtt */) override;
-  int32_t SetRateAllocation(const BitrateAllocation& rate_allocation,
-                            uint32_t frame_rate) override;
-
-  bool SupportsNativeHandle() const override { return egl_context_ != nullptr; }
-  const char* ImplementationName() const override;
-
-  // Fills the input buffer with data from the buffers passed as parameters.
-  bool FillInputBuffer(JNIEnv* jni,
-                       int input_buffer_index,
-                       uint8_t const* buffer_y,
-                       int stride_y,
-                       uint8_t const* buffer_u,
-                       int stride_u,
-                       uint8_t const* buffer_v,
-                       int stride_v);
-
- private:
-  class EncodeTask : public rtc::QueuedTask {
-   public:
-    explicit EncodeTask(rtc::WeakPtr<MediaCodecVideoEncoder> encoder);
-    bool Run() override;
-
-   private:
-    rtc::WeakPtr<MediaCodecVideoEncoder> encoder_;
-  };
-
-  // ResetCodec() calls Release() and InitEncodeInternal() in an attempt to
-  // restore the codec to an operable state. Necessary after all manner of
-  // OMX-layer errors. Returns true if the codec was reset successfully.
-  bool ResetCodec();
-
-  // Fallback to a software encoder if one is supported else try to reset the
-  // encoder. Called with |reset_if_fallback_unavailable| equal to false from
-  // init/release encoder so that we don't go into infinite recursion.
-  // Returns true if the codec was reset successfully.
-  bool ProcessHWError(bool reset_if_fallback_unavailable);
-
-  // Calls ProcessHWError(true). Returns WEBRTC_VIDEO_CODEC_FALLBACK_SOFTWARE if
-  // sw_fallback_required_ was set or WEBRTC_VIDEO_CODEC_ERROR otherwise.
-  int32_t ProcessHWErrorOnEncode();
-
-  // If width==0 then this is assumed to be a re-initialization and the
-  // previously-current values are reused instead of the passed parameters
-  // (makes it easier to reason about thread-safety).
-  int32_t InitEncodeInternal(int width,
-                             int height,
-                             int kbps,
-                             int fps,
-                             bool use_surface);
-  // Reconfigure to match |frame| in width, height. Also reconfigures the
-  // encoder if |frame| is a texture/byte buffer and the encoder is initialized
-  // for byte buffer/texture. Returns false if reconfiguring fails.
-  bool MaybeReconfigureEncoder(JNIEnv* jni, const VideoFrame& frame);
-
-  // Returns true if the frame is a texture frame and we should use surface
-  // based encoding.
-  bool IsTextureFrame(JNIEnv* jni, const VideoFrame& frame);
-
-  bool EncodeByteBuffer(JNIEnv* jni,
-                        bool key_frame,
-                        const VideoFrame& frame,
-                        int input_buffer_index);
-  bool EncodeTexture(JNIEnv* jni, bool key_frame, const VideoFrame& frame);
-  // Encodes a new style org.webrtc.VideoFrame. Might be a I420 or a texture
-  // frame.
-  bool EncodeJavaFrame(JNIEnv* jni,
-                       bool key_frame,
-                       jobject frame,
-                       int input_buffer_index);
-
-  // Helper accessors for MediaCodecVideoEncoder$OutputBufferInfo members.
-  int GetOutputBufferInfoIndex(JNIEnv* jni, jobject j_output_buffer_info);
-  jobject GetOutputBufferInfoBuffer(JNIEnv* jni, jobject j_output_buffer_info);
-  bool GetOutputBufferInfoIsKeyFrame(JNIEnv* jni, jobject j_output_buffer_info);
-  jlong GetOutputBufferInfoPresentationTimestampUs(
-      JNIEnv* jni, jobject j_output_buffer_info);
-
-  // Deliver any outputs pending in the MediaCodec to our |callback_| and return
-  // true on success.
-  bool DeliverPendingOutputs(JNIEnv* jni);
-
-  VideoEncoder::ScalingSettings GetScalingSettings() const override;
-
-  // Displays encoder statistics.
-  void LogStatistics(bool force_log);
-
-  VideoCodecType GetCodecType() const;
-
-#if RTC_DCHECK_IS_ON
-  // Mutex for protecting inited_. It is only used for correctness checking on
-  // debug build. It is used for checking that encoder has been released in the
-  // destructor. Because this might happen on a different thread, we need a
-  // mutex.
-  rtc::CriticalSection inited_crit_;
-#endif
-
-  // Type of video codec.
-  const cricket::VideoCodec codec_;
-
-  EncodedImageCallback* callback_;
-
-  // State that is constant for the lifetime of this object once the ctor
-  // returns.
-  rtc::SequencedTaskChecker encoder_queue_checker_;
-  ScopedGlobalRef<jclass> j_media_codec_video_encoder_class_;
-  ScopedGlobalRef<jobject> j_media_codec_video_encoder_;
-  jmethodID j_init_encode_method_;
-  jmethodID j_get_input_buffers_method_;
-  jmethodID j_dequeue_input_buffer_method_;
-  jmethodID j_encode_buffer_method_;
-  jmethodID j_encode_texture_method_;
-  jmethodID j_encode_frame_method_;
-  jmethodID j_release_method_;
-  jmethodID j_set_rates_method_;
-  jmethodID j_dequeue_output_buffer_method_;
-  jmethodID j_release_output_buffer_method_;
-  jfieldID j_color_format_field_;
-  jfieldID j_info_index_field_;
-  jfieldID j_info_buffer_field_;
-  jfieldID j_info_is_key_frame_field_;
-  jfieldID j_info_presentation_timestamp_us_field_;
-
-  const JavaVideoFrameFactory video_frame_factory_;
-  ScopedGlobalRef<jclass> j_video_frame_texture_buffer_class_;
-
-  // State that is valid only between InitEncode() and the next Release().
-  int width_;   // Frame width in pixels.
-  int height_;  // Frame height in pixels.
-  bool inited_;
-  bool use_surface_;
-  enum libyuv::FourCC encoder_fourcc_;  // Encoder color space format.
-  int last_set_bitrate_kbps_;  // Last-requested bitrate in kbps.
-  int last_set_fps_;  // Last-requested frame rate.
-  int64_t current_timestamp_us_;  // Current frame timestamps in us.
-  int frames_received_;  // Number of frames received by encoder.
-  int frames_encoded_;  // Number of frames encoded by encoder.
-  int frames_dropped_media_encoder_;  // Number of frames dropped by encoder.
-  // Number of dropped frames caused by full queue.
-  int consecutive_full_queue_frame_drops_;
-  int64_t stat_start_time_ms_;  // Start time for statistics.
-  int current_frames_;  // Number of frames in the current statistics interval.
-  int current_bytes_;  // Encoded bytes in the current statistics interval.
-  int current_acc_qp_;  // Accumulated QP in the current statistics interval.
-  int current_encoding_time_ms_;  // Overall encoding time in the current second
-  int64_t last_input_timestamp_ms_;  // Timestamp of last received yuv frame.
-  int64_t last_output_timestamp_ms_;  // Timestamp of last encoded frame.
-  // Holds the task while the polling loop is paused.
-  std::unique_ptr<rtc::QueuedTask> encode_task_;
-
-  struct InputFrameInfo {
-    InputFrameInfo(int64_t encode_start_time,
-                   int32_t frame_timestamp,
-                   int64_t frame_render_time_ms,
-                   VideoRotation rotation)
-        : encode_start_time(encode_start_time),
-          frame_timestamp(frame_timestamp),
-          frame_render_time_ms(frame_render_time_ms),
-          rotation(rotation) {}
-    // Time when video frame is sent to encoder input.
-    const int64_t encode_start_time;
-
-    // Input frame information.
-    const int32_t frame_timestamp;
-    const int64_t frame_render_time_ms;
-    const VideoRotation rotation;
-  };
-  std::list<InputFrameInfo> input_frame_infos_;
-  int32_t output_timestamp_;       // Last output frame timestamp from
-                                   // |input_frame_infos_|.
-  int64_t output_render_time_ms_;  // Last output frame render time from
-                                   // |input_frame_infos_|.
-  VideoRotation output_rotation_;  // Last output frame rotation from
-                                   // |input_frame_infos_|.
-
-  // Frame size in bytes fed to MediaCodec.
-  int yuv_size_;
-  // True only when between a callback_->OnEncodedImage() call return a positive
-  // value and the next Encode() call being ignored.
-  bool drop_next_input_frame_;
-  bool scale_;
-  H264::Profile profile_;
-  // Global references; must be deleted in Release().
-  std::vector<jobject> input_buffers_;
-  H264BitstreamParser h264_bitstream_parser_;
-
-  // VP9 variables to populate codec specific structure.
-  GofInfoVP9 gof_;  // Contains each frame's temporal information for
-                    // non-flexible VP9 mode.
-  size_t gof_idx_;
-
-  // EGL context - owned by factory, should not be allocated/destroyed
-  // by MediaCodecVideoEncoder.
-  jobject egl_context_;
-
-  // Temporary fix for VP8.
-  // Sends a key frame if frames are largely spaced apart (possibly
-  // corresponding to a large image change).
-  int64_t last_frame_received_ms_;
-  int frames_received_since_last_key_;
-  VideoCodecMode codec_mode_;
-
-  // RTP state.
-  uint16_t picture_id_;
-  uint8_t tl0_pic_idx_;
-
-  bool sw_fallback_required_;
-
-  // All other member variables should be before WeakPtrFactory. Valid only from
-  // InitEncode to Release.
-  std::unique_ptr<rtc::WeakPtrFactory<MediaCodecVideoEncoder>> weak_factory_;
-};
-
-MediaCodecVideoEncoder::~MediaCodecVideoEncoder() {
-#if RTC_DCHECK_IS_ON
-  rtc::CritScope lock(&inited_crit_);
-  RTC_DCHECK(!inited_);
-#endif
-}
-
-MediaCodecVideoEncoder::MediaCodecVideoEncoder(JNIEnv* jni,
-                                               const cricket::VideoCodec& codec,
-                                               jobject egl_context)
-    : codec_(codec),
-      callback_(NULL),
-      j_media_codec_video_encoder_class_(
-          jni,
-          FindClass(jni, "org/webrtc/MediaCodecVideoEncoder")),
-      j_media_codec_video_encoder_(
-          jni,
-          jni->NewObject(*j_media_codec_video_encoder_class_,
-                         GetMethodID(jni,
-                                     *j_media_codec_video_encoder_class_,
-                                     "<init>",
-                                     "()V"))),
-      video_frame_factory_(jni),
-      j_video_frame_texture_buffer_class_(
-          jni,
-          FindClass(jni, "org/webrtc/VideoFrame$TextureBuffer")),
-      inited_(false),
-      use_surface_(false),
-      egl_context_(egl_context),
-      sw_fallback_required_(false) {
-  encoder_queue_checker_.Detach();
-
-  jclass j_output_buffer_info_class =
-      FindClass(jni, "org/webrtc/MediaCodecVideoEncoder$OutputBufferInfo");
-  j_init_encode_method_ =
-      GetMethodID(jni, *j_media_codec_video_encoder_class_, "initEncode",
-                  "(Lorg/webrtc/MediaCodecVideoEncoder$VideoCodecType;"
-                  "IIIIILorg/webrtc/EglBase14$Context;)Z");
-  j_get_input_buffers_method_ = GetMethodID(
-      jni,
-      *j_media_codec_video_encoder_class_,
-      "getInputBuffers",
-      "()[Ljava/nio/ByteBuffer;");
-  j_dequeue_input_buffer_method_ = GetMethodID(
-      jni, *j_media_codec_video_encoder_class_, "dequeueInputBuffer", "()I");
-  j_encode_buffer_method_ = GetMethodID(
-      jni, *j_media_codec_video_encoder_class_, "encodeBuffer", "(ZIIJ)Z");
-  j_encode_texture_method_ = GetMethodID(
-        jni, *j_media_codec_video_encoder_class_, "encodeTexture",
-        "(ZI[FJ)Z");
-  j_encode_frame_method_ =
-      GetMethodID(jni, *j_media_codec_video_encoder_class_, "encodeFrame",
-                  "(JZLorg/webrtc/VideoFrame;I)Z");
-  j_release_method_ =
-      GetMethodID(jni, *j_media_codec_video_encoder_class_, "release", "()V");
-  j_set_rates_method_ = GetMethodID(
-      jni, *j_media_codec_video_encoder_class_, "setRates", "(II)Z");
-  j_dequeue_output_buffer_method_ = GetMethodID(
-      jni,
-      *j_media_codec_video_encoder_class_,
-      "dequeueOutputBuffer",
-      "()Lorg/webrtc/MediaCodecVideoEncoder$OutputBufferInfo;");
-  j_release_output_buffer_method_ = GetMethodID(
-      jni, *j_media_codec_video_encoder_class_, "releaseOutputBuffer", "(I)Z");
-
-  j_color_format_field_ =
-      GetFieldID(jni, *j_media_codec_video_encoder_class_, "colorFormat", "I");
-  j_info_index_field_ =
-      GetFieldID(jni, j_output_buffer_info_class, "index", "I");
-  j_info_buffer_field_ = GetFieldID(
-      jni, j_output_buffer_info_class, "buffer", "Ljava/nio/ByteBuffer;");
-  j_info_is_key_frame_field_ =
-      GetFieldID(jni, j_output_buffer_info_class, "isKeyFrame", "Z");
-  j_info_presentation_timestamp_us_field_ = GetFieldID(
-      jni, j_output_buffer_info_class, "presentationTimestampUs", "J");
-  if (CheckException(jni)) {
-    ALOGW << "MediaCodecVideoEncoder ctor failed.";
-    ProcessHWError(true /* reset_if_fallback_unavailable */);
-  }
-
-  Random random(rtc::TimeMicros());
-  picture_id_ = random.Rand<uint16_t>() & 0x7FFF;
-  tl0_pic_idx_ = random.Rand<uint8_t>();
-}
-
-int32_t MediaCodecVideoEncoder::InitEncode(const VideoCodec* codec_settings,
-                                           int32_t /* number_of_cores */,
-                                           size_t /* max_payload_size */) {
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&encoder_queue_checker_);
-  if (codec_settings == NULL) {
-    ALOGE << "NULL VideoCodec instance";
-    return WEBRTC_VIDEO_CODEC_ERR_PARAMETER;
-  }
-  // Factory should guard against other codecs being used with us.
-  const VideoCodecType codec_type = GetCodecType();
-  RTC_CHECK(codec_settings->codecType == codec_type)
-      << "Unsupported codec " << codec_settings->codecType << " for "
-      << codec_type;
-  if (sw_fallback_required_) {
-    return WEBRTC_VIDEO_CODEC_OK;
-  }
-  codec_mode_ = codec_settings->mode;
-  int init_width = codec_settings->width;
-  int init_height = codec_settings->height;
-  // Scaling is optionally enabled for VP8 and VP9.
-  // TODO(pbos): Extract automaticResizeOn out of VP8 settings.
-  scale_ = false;
-  if (codec_type == kVideoCodecVP8) {
-    scale_ = codec_settings->VP8().automaticResizeOn;
-  } else if (codec_type == kVideoCodecVP9) {
-    scale_ = codec_settings->VP9().automaticResizeOn;
-  } else {
-    scale_ = true;
-  }
-
-  ALOGD << "InitEncode request: " << init_width << " x " << init_height;
-  ALOGD << "Encoder automatic resize " << (scale_ ? "enabled" : "disabled");
-
-  // Check allowed H.264 profile
-  profile_ = H264::Profile::kProfileBaseline;
-  if (codec_type == kVideoCodecH264) {
-    const rtc::Optional<H264::ProfileLevelId> profile_level_id =
-        H264::ParseSdpProfileLevelId(codec_.params);
-    RTC_DCHECK(profile_level_id);
-    profile_ = profile_level_id->profile;
-    ALOGD << "H.264 profile: " << profile_;
-  }
-
-  return InitEncodeInternal(
-      init_width, init_height, codec_settings->startBitrate,
-      codec_settings->maxFramerate, codec_settings->expect_encode_from_texture);
-}
-
-int32_t MediaCodecVideoEncoder::SetChannelParameters(uint32_t /* packet_loss */,
-                                                     int64_t /* rtt */) {
-  return WEBRTC_VIDEO_CODEC_OK;
-}
-
-bool MediaCodecVideoEncoder::ResetCodec() {
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&encoder_queue_checker_);
-  ALOGE << "Reset";
-  if (Release() != WEBRTC_VIDEO_CODEC_OK) {
-    ALOGE << "Releasing codec failed during reset.";
-    return false;
-  }
-  if (InitEncodeInternal(width_, height_, 0, 0, false) !=
-      WEBRTC_VIDEO_CODEC_OK) {
-    ALOGE << "Initializing encoder failed during reset.";
-    return false;
-  }
-  return true;
-}
-
-MediaCodecVideoEncoder::EncodeTask::EncodeTask(
-    rtc::WeakPtr<MediaCodecVideoEncoder> encoder)
-    : encoder_(encoder) {}
-
-bool MediaCodecVideoEncoder::EncodeTask::Run() {
-  if (!encoder_) {
-    // Encoder was destroyed.
-    return true;
-  }
-
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&encoder_->encoder_queue_checker_);
-  JNIEnv* jni = AttachCurrentThreadIfNeeded();
-  ScopedLocalRefFrame local_ref_frame(jni);
-
-  if (!encoder_->inited_) {
-    encoder_->encode_task_ = std::unique_ptr<rtc::QueuedTask>(this);
-    return false;
-  }
-
-  // It would be nice to recover from a failure here if one happened, but it's
-  // unclear how to signal such a failure to the app, so instead we stay silent
-  // about it and let the next app-called API method reveal the borkedness.
-  encoder_->DeliverPendingOutputs(jni);
-
-  if (!encoder_) {
-    // Encoder can be destroyed in DeliverPendingOutputs.
-    return true;
-  }
-
-  // Call log statistics here so it's called even if no frames are being
-  // delivered.
-  encoder_->LogStatistics(false);
-
-  // If there aren't more frames to deliver, we can start polling at lower rate.
-  if (encoder_->input_frame_infos_.empty()) {
-    rtc::TaskQueue::Current()->PostDelayedTask(
-        std::unique_ptr<rtc::QueuedTask>(this), kMediaCodecPollNoFramesMs);
-  } else {
-    rtc::TaskQueue::Current()->PostDelayedTask(
-        std::unique_ptr<rtc::QueuedTask>(this), kMediaCodecPollMs);
-  }
-
-  return false;
-}
-
-bool MediaCodecVideoEncoder::ProcessHWError(
-    bool reset_if_fallback_unavailable) {
-  ALOGE << "ProcessHWError";
-  if (FindMatchingCodec(cricket::InternalEncoderFactory().supported_codecs(),
-                        codec_)) {
-    ALOGE << "Fallback to SW encoder.";
-    sw_fallback_required_ = true;
-    return false;
-  } else if (reset_if_fallback_unavailable) {
-    ALOGE << "Reset encoder.";
-    return ResetCodec();
-  }
-  return false;
-}
-
-int32_t MediaCodecVideoEncoder::ProcessHWErrorOnEncode() {
-  ProcessHWError(true /* reset_if_fallback_unavailable */);
-  return sw_fallback_required_ ? WEBRTC_VIDEO_CODEC_FALLBACK_SOFTWARE
-                               : WEBRTC_VIDEO_CODEC_ERROR;
-}
-
-VideoCodecType MediaCodecVideoEncoder::GetCodecType() const {
-  return PayloadStringToCodecType(codec_.name);
-}
-
-int32_t MediaCodecVideoEncoder::InitEncodeInternal(int width,
-                                                   int height,
-                                                   int kbps,
-                                                   int fps,
-                                                   bool use_surface) {
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&encoder_queue_checker_);
-  if (sw_fallback_required_) {
-    return WEBRTC_VIDEO_CODEC_OK;
-  }
-  RTC_CHECK(!use_surface || egl_context_ != nullptr) << "EGL context not set.";
-  JNIEnv* jni = AttachCurrentThreadIfNeeded();
-  ScopedLocalRefFrame local_ref_frame(jni);
-
-  const VideoCodecType codec_type = GetCodecType();
-  ALOGD << "InitEncodeInternal Type: " << static_cast<int>(codec_type) << ", "
-        << width << " x " << height << ". Bitrate: " << kbps
-        << " kbps. Fps: " << fps << ". Profile: " << profile_ << ".";
-  if (kbps == 0) {
-    kbps = last_set_bitrate_kbps_;
-  }
-  if (fps == 0) {
-    fps = MAX_VIDEO_FPS;
-  }
-
-  width_ = width;
-  height_ = height;
-  last_set_bitrate_kbps_ = kbps;
-  last_set_fps_ = (fps < MAX_VIDEO_FPS) ? fps : MAX_VIDEO_FPS;
-  yuv_size_ = width_ * height_ * 3 / 2;
-  frames_received_ = 0;
-  frames_encoded_ = 0;
-  frames_dropped_media_encoder_ = 0;
-  consecutive_full_queue_frame_drops_ = 0;
-  current_timestamp_us_ = 0;
-  stat_start_time_ms_ = rtc::TimeMillis();
-  current_frames_ = 0;
-  current_bytes_ = 0;
-  current_acc_qp_ = 0;
-  current_encoding_time_ms_ = 0;
-  last_input_timestamp_ms_ = -1;
-  last_output_timestamp_ms_ = -1;
-  output_timestamp_ = 0;
-  output_render_time_ms_ = 0;
-  input_frame_infos_.clear();
-  drop_next_input_frame_ = false;
-  use_surface_ = use_surface;
-  gof_.SetGofInfoVP9(TemporalStructureMode::kTemporalStructureMode1);
-  gof_idx_ = 0;
-  last_frame_received_ms_ = -1;
-  frames_received_since_last_key_ = kMinKeyFrameInterval;
-
-  // We enforce no extra stride/padding in the format creation step.
-  jobject j_video_codec_enum = JavaEnumFromIndexAndClassName(
-      jni, "MediaCodecVideoEncoder$VideoCodecType", codec_type);
-  const bool encode_status = jni->CallBooleanMethod(
-      *j_media_codec_video_encoder_, j_init_encode_method_, j_video_codec_enum,
-      profile_, width, height, kbps, fps,
-      (use_surface ? egl_context_ : nullptr));
-  if (!encode_status) {
-    ALOGE << "Failed to configure encoder.";
-    ProcessHWError(false /* reset_if_fallback_unavailable */);
-    return WEBRTC_VIDEO_CODEC_ERROR;
-  }
-  if (CheckException(jni)) {
-    ALOGE << "Exception in init encode.";
-    ProcessHWError(false /* reset_if_fallback_unavailable */);
-    return WEBRTC_VIDEO_CODEC_ERROR;
-  }
-
-  if (!use_surface) {
-    jobjectArray input_buffers = reinterpret_cast<jobjectArray>(
-        jni->CallObjectMethod(*j_media_codec_video_encoder_,
-            j_get_input_buffers_method_));
-    if (CheckException(jni)) {
-      ALOGE << "Exception in get input buffers.";
-      ProcessHWError(false /* reset_if_fallback_unavailable */);
-      return WEBRTC_VIDEO_CODEC_ERROR;
-    }
-
-    if (IsNull(jni, input_buffers)) {
-      ProcessHWError(false /* reset_if_fallback_unavailable */);
-      return WEBRTC_VIDEO_CODEC_ERROR;
-    }
-
-    switch (GetIntField(jni, *j_media_codec_video_encoder_,
-        j_color_format_field_)) {
-      case COLOR_FormatYUV420Planar:
-        encoder_fourcc_ = libyuv::FOURCC_YU12;
-        break;
-      case COLOR_FormatYUV420SemiPlanar:
-      case COLOR_QCOM_FormatYUV420SemiPlanar:
-      case COLOR_QCOM_FORMATYUV420PackedSemiPlanar32m:
-        encoder_fourcc_ = libyuv::FOURCC_NV12;
-        break;
-      default:
-        LOG(LS_ERROR) << "Wrong color format.";
-        ProcessHWError(false /* reset_if_fallback_unavailable */);
-        return WEBRTC_VIDEO_CODEC_ERROR;
-    }
-    size_t num_input_buffers = jni->GetArrayLength(input_buffers);
-    RTC_CHECK(input_buffers_.empty())
-        << "Unexpected double InitEncode without Release";
-    input_buffers_.resize(num_input_buffers);
-    for (size_t i = 0; i < num_input_buffers; ++i) {
-      input_buffers_[i] =
-          jni->NewGlobalRef(jni->GetObjectArrayElement(input_buffers, i));
-      int64_t yuv_buffer_capacity =
-          jni->GetDirectBufferCapacity(input_buffers_[i]);
-      if (CheckException(jni)) {
-        ALOGE << "Exception in get direct buffer capacity.";
-        ProcessHWError(false /* reset_if_fallback_unavailable */);
-        return WEBRTC_VIDEO_CODEC_ERROR;
-      }
-      RTC_CHECK(yuv_buffer_capacity >= yuv_size_) << "Insufficient capacity";
-    }
-  }
-
-  {
-#if RTC_DCHECK_IS_ON
-    rtc::CritScope lock(&inited_crit_);
-#endif
-    inited_ = true;
-  }
-  weak_factory_.reset(new rtc::WeakPtrFactory<MediaCodecVideoEncoder>(this));
-  encode_task_.reset(new EncodeTask(weak_factory_->GetWeakPtr()));
-
-  return WEBRTC_VIDEO_CODEC_OK;
-}
-
-int32_t MediaCodecVideoEncoder::Encode(
-    const VideoFrame& frame,
-    const CodecSpecificInfo* /* codec_specific_info */,
-    const std::vector<FrameType>* frame_types) {
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&encoder_queue_checker_);
-  if (sw_fallback_required_)
-    return WEBRTC_VIDEO_CODEC_FALLBACK_SOFTWARE;
-  JNIEnv* jni = AttachCurrentThreadIfNeeded();
-  ScopedLocalRefFrame local_ref_frame(jni);
-  const int64_t frame_input_time_ms = rtc::TimeMillis();
-
-  if (!inited_) {
-    return WEBRTC_VIDEO_CODEC_UNINITIALIZED;
-  }
-
-  bool send_key_frame = false;
-  if (codec_mode_ == kRealtimeVideo) {
-    ++frames_received_since_last_key_;
-    int64_t now_ms = rtc::TimeMillis();
-    if (last_frame_received_ms_ != -1 &&
-        (now_ms - last_frame_received_ms_) > kFrameDiffThresholdMs) {
-      // Add limit to prevent triggering a key for every frame for very low
-      // framerates (e.g. if frame diff > kFrameDiffThresholdMs).
-      if (frames_received_since_last_key_ > kMinKeyFrameInterval) {
-        ALOGD << "Send key, frame diff: " << (now_ms - last_frame_received_ms_);
-        send_key_frame = true;
-      }
-      frames_received_since_last_key_ = 0;
-    }
-    last_frame_received_ms_ = now_ms;
-  }
-
-  frames_received_++;
-  if (!DeliverPendingOutputs(jni)) {
-    if (!ProcessHWError(true /* reset_if_fallback_unavailable */)) {
-      return sw_fallback_required_ ? WEBRTC_VIDEO_CODEC_FALLBACK_SOFTWARE
-                                   : WEBRTC_VIDEO_CODEC_ERROR;
-    }
-  }
-  if (frames_encoded_ < kMaxEncodedLogFrames) {
-    ALOGD << "Encoder frame in # " << (frames_received_ - 1)
-          << ". TS: " << static_cast<int>(current_timestamp_us_ / 1000)
-          << ". Q: " << input_frame_infos_.size() << ". Fps: " << last_set_fps_
-          << ". Kbps: " << last_set_bitrate_kbps_;
-  }
-
-  if (drop_next_input_frame_) {
-    ALOGW << "Encoder drop frame - failed callback.";
-    drop_next_input_frame_ = false;
-    current_timestamp_us_ += rtc::kNumMicrosecsPerSec / last_set_fps_;
-    frames_dropped_media_encoder_++;
-    return WEBRTC_VIDEO_CODEC_OK;
-  }
-
-  RTC_CHECK(frame_types->size() == 1) << "Unexpected stream count";
-
-  // Check if we accumulated too many frames in encoder input buffers and drop
-  // frame if so.
-  if (input_frame_infos_.size() > MAX_ENCODER_Q_SIZE) {
-    ALOGD << "Already " << input_frame_infos_.size()
-          << " frames in the queue, dropping"
-          << ". TS: " << static_cast<int>(current_timestamp_us_ / 1000)
-          << ". Fps: " << last_set_fps_
-          << ". Consecutive drops: " << consecutive_full_queue_frame_drops_;
-    current_timestamp_us_ += rtc::kNumMicrosecsPerSec / last_set_fps_;
-    consecutive_full_queue_frame_drops_++;
-    if (consecutive_full_queue_frame_drops_ >=
-        ENCODER_STALL_FRAMEDROP_THRESHOLD) {
-      ALOGE << "Encoder got stuck.";
-      return ProcessHWErrorOnEncode();
-    }
-    frames_dropped_media_encoder_++;
-    return WEBRTC_VIDEO_CODEC_OK;
-  }
-  consecutive_full_queue_frame_drops_ = 0;
-
-  rtc::scoped_refptr<VideoFrameBuffer> input_buffer(frame.video_frame_buffer());
-
-  VideoFrame input_frame(input_buffer, frame.timestamp(),
-                         frame.render_time_ms(), frame.rotation());
-
-  if (!MaybeReconfigureEncoder(jni, input_frame)) {
-    ALOGE << "Failed to reconfigure encoder.";
-    return WEBRTC_VIDEO_CODEC_ERROR;
-  }
-
-  const bool key_frame =
-      frame_types->front() != kVideoFrameDelta || send_key_frame;
-  bool encode_status = true;
-
-  int j_input_buffer_index = -1;
-  if (!use_surface_) {
-    j_input_buffer_index = jni->CallIntMethod(*j_media_codec_video_encoder_,
-                                              j_dequeue_input_buffer_method_);
-    if (CheckException(jni)) {
-      ALOGE << "Exception in dequeu input buffer.";
-      return ProcessHWErrorOnEncode();
-    }
-    if (j_input_buffer_index == -1) {
-      // Video codec falls behind - no input buffer available.
-      ALOGW << "Encoder drop frame - no input buffers available";
-      if (frames_received_ > 1) {
-        current_timestamp_us_ += rtc::kNumMicrosecsPerSec / last_set_fps_;
-        frames_dropped_media_encoder_++;
-      } else {
-        // Input buffers are not ready after codec initialization, HW is still
-        // allocating thme - this is expected and should not result in drop
-        // frame report.
-        frames_received_ = 0;
-      }
-      return WEBRTC_VIDEO_CODEC_OK;  // TODO(fischman): see webrtc bug 2887.
-    } else if (j_input_buffer_index == -2) {
-      return ProcessHWErrorOnEncode();
-    }
-  }
-
-  if (input_frame.video_frame_buffer()->type() !=
-      VideoFrameBuffer::Type::kNative) {
-    encode_status =
-        EncodeByteBuffer(jni, key_frame, input_frame, j_input_buffer_index);
-  } else {
-    AndroidVideoFrameBuffer* android_buffer =
-        static_cast<AndroidVideoFrameBuffer*>(
-            input_frame.video_frame_buffer().get());
-    switch (android_buffer->android_type()) {
-      case AndroidVideoFrameBuffer::AndroidType::kTextureBuffer:
-        encode_status = EncodeTexture(jni, key_frame, input_frame);
-        break;
-      case AndroidVideoFrameBuffer::AndroidType::kJavaBuffer:
-        encode_status = EncodeJavaFrame(
-            jni, key_frame, video_frame_factory_.ToJavaFrame(jni, input_frame),
-            j_input_buffer_index);
-        break;
-      default:
-        RTC_NOTREACHED();
-        return WEBRTC_VIDEO_CODEC_ERROR;
-    }
-  }
-
-  if (!encode_status) {
-    ALOGE << "Failed encode frame with timestamp: " << input_frame.timestamp();
-    return ProcessHWErrorOnEncode();
-  }
-
-  // Save input image timestamps for later output.
-  input_frame_infos_.emplace_back(frame_input_time_ms, input_frame.timestamp(),
-                                  input_frame.render_time_ms(),
-                                  input_frame.rotation());
-
-  last_input_timestamp_ms_ =
-      current_timestamp_us_ / rtc::kNumMicrosecsPerMillisec;
-
-  current_timestamp_us_ += rtc::kNumMicrosecsPerSec / last_set_fps_;
-
-  // Start the polling loop if it is not started.
-  if (encode_task_) {
-    rtc::TaskQueue::Current()->PostDelayedTask(std::move(encode_task_),
-                                               kMediaCodecPollMs);
-  }
-
-  if (!DeliverPendingOutputs(jni)) {
-    return ProcessHWErrorOnEncode();
-  }
-  return WEBRTC_VIDEO_CODEC_OK;
-}
-
-bool MediaCodecVideoEncoder::MaybeReconfigureEncoder(JNIEnv* jni,
-                                                     const VideoFrame& frame) {
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&encoder_queue_checker_);
-
-  bool is_texture = IsTextureFrame(jni, frame);
-  const bool reconfigure_due_to_format = is_texture != use_surface_;
-  const bool reconfigure_due_to_size =
-      frame.width() != width_ || frame.height() != height_;
-
-  if (reconfigure_due_to_format) {
-      ALOGD << "Reconfigure encoder due to format change. "
-            << (use_surface_ ?
-                "Reconfiguring to encode from byte buffer." :
-                "Reconfiguring to encode from texture.");
-      LogStatistics(true);
-  }
-  if (reconfigure_due_to_size) {
-    ALOGW << "Reconfigure encoder due to frame resolution change from "
-        << width_ << " x " << height_ << " to " << frame.width() << " x "
-        << frame.height();
-    LogStatistics(true);
-    width_ = frame.width();
-    height_ = frame.height();
-  }
-
-  if (!reconfigure_due_to_format && !reconfigure_due_to_size)
-    return true;
-
-  Release();
-
-  return InitEncodeInternal(width_, height_, 0, 0, is_texture) ==
-         WEBRTC_VIDEO_CODEC_OK;
-}
-
-bool MediaCodecVideoEncoder::IsTextureFrame(JNIEnv* jni,
-                                            const VideoFrame& frame) {
-  if (frame.video_frame_buffer()->type() != VideoFrameBuffer::Type::kNative) {
-    return false;
-  }
-
-  AndroidVideoFrameBuffer* android_buffer =
-      static_cast<AndroidVideoFrameBuffer*>(frame.video_frame_buffer().get());
-  switch (android_buffer->android_type()) {
-    case AndroidVideoFrameBuffer::AndroidType::kTextureBuffer:
-      return true;
-    case AndroidVideoFrameBuffer::AndroidType::kJavaBuffer:
-      return jni->IsInstanceOf(static_cast<AndroidVideoBuffer*>(android_buffer)
-                                   ->video_frame_buffer(),
-                               *j_video_frame_texture_buffer_class_);
-    default:
-      RTC_NOTREACHED();
-      return false;
-  }
-}
-
-bool MediaCodecVideoEncoder::EncodeByteBuffer(JNIEnv* jni,
-                                              bool key_frame,
-                                              const VideoFrame& frame,
-                                              int input_buffer_index) {
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&encoder_queue_checker_);
-  RTC_CHECK(!use_surface_);
-
-  rtc::scoped_refptr<I420BufferInterface> i420_buffer =
-      frame.video_frame_buffer()->ToI420();
-  if (!FillInputBuffer(jni, input_buffer_index, i420_buffer->DataY(),
-                       i420_buffer->StrideY(), i420_buffer->DataU(),
-                       i420_buffer->StrideU(), i420_buffer->DataV(),
-                       i420_buffer->StrideV())) {
-    return false;
-  }
-  bool encode_status = jni->CallBooleanMethod(
-      *j_media_codec_video_encoder_, j_encode_buffer_method_, key_frame,
-      input_buffer_index, yuv_size_, current_timestamp_us_);
-  if (CheckException(jni)) {
-    ALOGE << "Exception in encode buffer.";
-    ProcessHWError(true /* reset_if_fallback_unavailable */);
-    return false;
-  }
-  return encode_status;
-}
-
-bool MediaCodecVideoEncoder::FillInputBuffer(JNIEnv* jni,
-                                             int input_buffer_index,
-                                             uint8_t const* buffer_y,
-                                             int stride_y,
-                                             uint8_t const* buffer_u,
-                                             int stride_u,
-                                             uint8_t const* buffer_v,
-                                             int stride_v) {
-  jobject j_input_buffer = input_buffers_[input_buffer_index];
-  uint8_t* yuv_buffer =
-      reinterpret_cast<uint8_t*>(jni->GetDirectBufferAddress(j_input_buffer));
-  if (CheckException(jni)) {
-    ALOGE << "Exception in get direct buffer address.";
-    ProcessHWError(true /* reset_if_fallback_unavailable */);
-    return false;
-  }
-  RTC_CHECK(yuv_buffer) << "Indirect buffer??";
-
-  RTC_CHECK(!libyuv::ConvertFromI420(buffer_y, stride_y, buffer_u, stride_u,
-                                     buffer_v, stride_v, yuv_buffer, width_,
-                                     width_, height_, encoder_fourcc_))
-      << "ConvertFromI420 failed";
-  return true;
-}
-
-bool MediaCodecVideoEncoder::EncodeTexture(JNIEnv* jni,
-                                           bool key_frame,
-                                           const VideoFrame& frame) {
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&encoder_queue_checker_);
-  RTC_CHECK(use_surface_);
-  NativeHandleImpl handle =
-      static_cast<AndroidTextureBuffer*>(frame.video_frame_buffer().get())
-          ->native_handle_impl();
-
-  jfloatArray sampling_matrix = handle.sampling_matrix.ToJava(jni);
-  bool encode_status = jni->CallBooleanMethod(
-      *j_media_codec_video_encoder_, j_encode_texture_method_, key_frame,
-      handle.oes_texture_id, sampling_matrix, current_timestamp_us_);
-  if (CheckException(jni)) {
-    ALOGE << "Exception in encode texture.";
-    ProcessHWError(true /* reset_if_fallback_unavailable */);
-    return false;
-  }
-  return encode_status;
-}
-
-bool MediaCodecVideoEncoder::EncodeJavaFrame(JNIEnv* jni,
-                                             bool key_frame,
-                                             jobject frame,
-                                             int input_buffer_index) {
-  bool encode_status = jni->CallBooleanMethod(
-      *j_media_codec_video_encoder_, j_encode_frame_method_,
-      jlongFromPointer(this), key_frame, frame, input_buffer_index);
-  if (CheckException(jni)) {
-    ALOGE << "Exception in encode frame.";
-    ProcessHWError(true /* reset_if_fallback_unavailable */);
-    return false;
-  }
-  return encode_status;
-}
-
-int32_t MediaCodecVideoEncoder::RegisterEncodeCompleteCallback(
-    EncodedImageCallback* callback) {
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&encoder_queue_checker_);
-  JNIEnv* jni = AttachCurrentThreadIfNeeded();
-  ScopedLocalRefFrame local_ref_frame(jni);
-  callback_ = callback;
-  return WEBRTC_VIDEO_CODEC_OK;
-}
-
-int32_t MediaCodecVideoEncoder::Release() {
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&encoder_queue_checker_);
-  if (!inited_) {
-    return WEBRTC_VIDEO_CODEC_OK;
-  }
-  JNIEnv* jni = AttachCurrentThreadIfNeeded();
-  ALOGD << "EncoderRelease: Frames received: " << frames_received_
-        << ". Encoded: " << frames_encoded_
-        << ". Dropped: " << frames_dropped_media_encoder_;
-  encode_task_.reset(nullptr);
-  weak_factory_.reset(nullptr);
-  ScopedLocalRefFrame local_ref_frame(jni);
-  for (size_t i = 0; i < input_buffers_.size(); ++i)
-    jni->DeleteGlobalRef(input_buffers_[i]);
-  input_buffers_.clear();
-  jni->CallVoidMethod(*j_media_codec_video_encoder_, j_release_method_);
-  if (CheckException(jni)) {
-    ALOGE << "Exception in release.";
-    ProcessHWError(false /* reset_if_fallback_unavailable */);
-    return WEBRTC_VIDEO_CODEC_ERROR;
-  }
-  {
-#if RTC_DCHECK_IS_ON
-    rtc::CritScope lock(&inited_crit_);
-#endif
-    inited_ = false;
-  }
-  use_surface_ = false;
-  ALOGD << "EncoderRelease done.";
-  return WEBRTC_VIDEO_CODEC_OK;
-}
-
-int32_t MediaCodecVideoEncoder::SetRateAllocation(
-    const BitrateAllocation& rate_allocation,
-    uint32_t frame_rate) {
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&encoder_queue_checker_);
-  const uint32_t new_bit_rate = rate_allocation.get_sum_kbps();
-  if (sw_fallback_required_)
-    return WEBRTC_VIDEO_CODEC_OK;
-  frame_rate =
-      (frame_rate < MAX_ALLOWED_VIDEO_FPS) ? frame_rate : MAX_ALLOWED_VIDEO_FPS;
-  if (last_set_bitrate_kbps_ == new_bit_rate && last_set_fps_ == frame_rate) {
-    return WEBRTC_VIDEO_CODEC_OK;
-  }
-  JNIEnv* jni = AttachCurrentThreadIfNeeded();
-  ScopedLocalRefFrame local_ref_frame(jni);
-  if (new_bit_rate > 0) {
-    last_set_bitrate_kbps_ = new_bit_rate;
-  }
-  if (frame_rate > 0) {
-    last_set_fps_ = frame_rate;
-  }
-  bool ret =
-      jni->CallBooleanMethod(*j_media_codec_video_encoder_, j_set_rates_method_,
-                             last_set_bitrate_kbps_, last_set_fps_);
-  if (CheckException(jni) || !ret) {
-    ProcessHWError(true /* reset_if_fallback_unavailable */);
-    return sw_fallback_required_ ? WEBRTC_VIDEO_CODEC_OK
-                                 : WEBRTC_VIDEO_CODEC_ERROR;
-  }
-  return WEBRTC_VIDEO_CODEC_OK;
-}
-
-int MediaCodecVideoEncoder::GetOutputBufferInfoIndex(
-    JNIEnv* jni,
-    jobject j_output_buffer_info) {
-  return GetIntField(jni, j_output_buffer_info, j_info_index_field_);
-}
-
-jobject MediaCodecVideoEncoder::GetOutputBufferInfoBuffer(
-    JNIEnv* jni,
-    jobject j_output_buffer_info) {
-  return GetObjectField(jni, j_output_buffer_info, j_info_buffer_field_);
-}
-
-bool MediaCodecVideoEncoder::GetOutputBufferInfoIsKeyFrame(
-    JNIEnv* jni,
-    jobject j_output_buffer_info) {
-  return GetBooleanField(jni, j_output_buffer_info, j_info_is_key_frame_field_);
-}
-
-jlong MediaCodecVideoEncoder::GetOutputBufferInfoPresentationTimestampUs(
-    JNIEnv* jni,
-    jobject j_output_buffer_info) {
-  return GetLongField(
-      jni, j_output_buffer_info, j_info_presentation_timestamp_us_field_);
-}
-
-bool MediaCodecVideoEncoder::DeliverPendingOutputs(JNIEnv* jni) {
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&encoder_queue_checker_);
-
-  while (true) {
-    jobject j_output_buffer_info = jni->CallObjectMethod(
-        *j_media_codec_video_encoder_, j_dequeue_output_buffer_method_);
-    if (CheckException(jni)) {
-      ALOGE << "Exception in set dequeue output buffer.";
-      ProcessHWError(true /* reset_if_fallback_unavailable */);
-      return WEBRTC_VIDEO_CODEC_ERROR;
-    }
-    if (IsNull(jni, j_output_buffer_info)) {
-      break;
-    }
-
-    int output_buffer_index =
-        GetOutputBufferInfoIndex(jni, j_output_buffer_info);
-    if (output_buffer_index == -1) {
-      ProcessHWError(true /* reset_if_fallback_unavailable */);
-      return false;
-    }
-
-    // Get key and config frame flags.
-    jobject j_output_buffer =
-        GetOutputBufferInfoBuffer(jni, j_output_buffer_info);
-    bool key_frame = GetOutputBufferInfoIsKeyFrame(jni, j_output_buffer_info);
-
-    // Get frame timestamps from a queue - for non config frames only.
-    int64_t encoding_start_time_ms = 0;
-    int64_t frame_encoding_time_ms = 0;
-    last_output_timestamp_ms_ =
-        GetOutputBufferInfoPresentationTimestampUs(jni, j_output_buffer_info) /
-        rtc::kNumMicrosecsPerMillisec;
-    if (!input_frame_infos_.empty()) {
-      const InputFrameInfo& frame_info = input_frame_infos_.front();
-      output_timestamp_ = frame_info.frame_timestamp;
-      output_render_time_ms_ = frame_info.frame_render_time_ms;
-      output_rotation_ = frame_info.rotation;
-      encoding_start_time_ms = frame_info.encode_start_time;
-      input_frame_infos_.pop_front();
-    }
-
-    // Extract payload.
-    size_t payload_size = jni->GetDirectBufferCapacity(j_output_buffer);
-    uint8_t* payload = reinterpret_cast<uint8_t*>(
-        jni->GetDirectBufferAddress(j_output_buffer));
-    if (CheckException(jni)) {
-      ALOGE << "Exception in get direct buffer address.";
-      ProcessHWError(true /* reset_if_fallback_unavailable */);
-      return WEBRTC_VIDEO_CODEC_ERROR;
-    }
-
-    // Callback - return encoded frame.
-    const VideoCodecType codec_type = GetCodecType();
-    EncodedImageCallback::Result callback_result(
-        EncodedImageCallback::Result::OK);
-    if (callback_) {
-      std::unique_ptr<EncodedImage> image(
-          new EncodedImage(payload, payload_size, payload_size));
-      image->_encodedWidth = width_;
-      image->_encodedHeight = height_;
-      image->_timeStamp = output_timestamp_;
-      image->capture_time_ms_ = output_render_time_ms_;
-      image->rotation_ = output_rotation_;
-      image->content_type_ = (codec_mode_ == VideoCodecMode::kScreensharing)
-                                 ? VideoContentType::SCREENSHARE
-                                 : VideoContentType::UNSPECIFIED;
-      image->timing_.flags = TimingFrameFlags::kInvalid;
-      image->_frameType = (key_frame ? kVideoFrameKey : kVideoFrameDelta);
-      image->_completeFrame = true;
-      CodecSpecificInfo info;
-      memset(&info, 0, sizeof(info));
-      info.codecType = codec_type;
-      if (codec_type == kVideoCodecVP8) {
-        info.codecSpecific.VP8.pictureId = picture_id_;
-        info.codecSpecific.VP8.nonReference = false;
-        info.codecSpecific.VP8.simulcastIdx = 0;
-        info.codecSpecific.VP8.temporalIdx = kNoTemporalIdx;
-        info.codecSpecific.VP8.layerSync = false;
-        info.codecSpecific.VP8.tl0PicIdx = kNoTl0PicIdx;
-        info.codecSpecific.VP8.keyIdx = kNoKeyIdx;
-      } else if (codec_type == kVideoCodecVP9) {
-        if (key_frame) {
-          gof_idx_ = 0;
-        }
-        info.codecSpecific.VP9.picture_id = picture_id_;
-        info.codecSpecific.VP9.inter_pic_predicted = key_frame ? false : true;
-        info.codecSpecific.VP9.flexible_mode = false;
-        info.codecSpecific.VP9.ss_data_available = key_frame ? true : false;
-        info.codecSpecific.VP9.tl0_pic_idx = tl0_pic_idx_++;
-        info.codecSpecific.VP9.temporal_idx = kNoTemporalIdx;
-        info.codecSpecific.VP9.spatial_idx = kNoSpatialIdx;
-        info.codecSpecific.VP9.temporal_up_switch = true;
-        info.codecSpecific.VP9.inter_layer_predicted = false;
-        info.codecSpecific.VP9.gof_idx =
-            static_cast<uint8_t>(gof_idx_++ % gof_.num_frames_in_gof);
-        info.codecSpecific.VP9.num_spatial_layers = 1;
-        info.codecSpecific.VP9.spatial_layer_resolution_present = false;
-        if (info.codecSpecific.VP9.ss_data_available) {
-          info.codecSpecific.VP9.spatial_layer_resolution_present = true;
-          info.codecSpecific.VP9.width[0] = width_;
-          info.codecSpecific.VP9.height[0] = height_;
-          info.codecSpecific.VP9.gof.CopyGofInfoVP9(gof_);
-        }
-      }
-      picture_id_ = (picture_id_ + 1) & 0x7FFF;
-
-      // Generate a header describing a single fragment.
-      RTPFragmentationHeader header;
-      memset(&header, 0, sizeof(header));
-      if (codec_type == kVideoCodecVP8 || codec_type == kVideoCodecVP9) {
-        header.VerifyAndAllocateFragmentationHeader(1);
-        header.fragmentationOffset[0] = 0;
-        header.fragmentationLength[0] = image->_length;
-        header.fragmentationPlType[0] = 0;
-        header.fragmentationTimeDiff[0] = 0;
-        if (codec_type == kVideoCodecVP8) {
-          int qp;
-          if (vp8::GetQp(payload, payload_size, &qp)) {
-            current_acc_qp_ += qp;
-            image->qp_ = qp;
-          }
-        } else if (codec_type == kVideoCodecVP9) {
-          int qp;
-          if (vp9::GetQp(payload, payload_size, &qp)) {
-            current_acc_qp_ += qp;
-            image->qp_ = qp;
-          }
-        }
-      } else if (codec_type == kVideoCodecH264) {
-        h264_bitstream_parser_.ParseBitstream(payload, payload_size);
-        int qp;
-        if (h264_bitstream_parser_.GetLastSliceQp(&qp)) {
-          current_acc_qp_ += qp;
-          image->qp_ = qp;
-        }
-        // For H.264 search for start codes.
-        const std::vector<H264::NaluIndex> nalu_idxs =
-            H264::FindNaluIndices(payload, payload_size);
-        if (nalu_idxs.empty()) {
-          ALOGE << "Start code is not found!";
-          ALOGE << "Data:" <<  image->_buffer[0] << " " << image->_buffer[1]
-              << " " << image->_buffer[2] << " " << image->_buffer[3]
-              << " " << image->_buffer[4] << " " << image->_buffer[5];
-          ProcessHWError(true /* reset_if_fallback_unavailable */);
-          return false;
-        }
-        header.VerifyAndAllocateFragmentationHeader(nalu_idxs.size());
-        for (size_t i = 0; i < nalu_idxs.size(); i++) {
-          header.fragmentationOffset[i] = nalu_idxs[i].payload_start_offset;
-          header.fragmentationLength[i] = nalu_idxs[i].payload_size;
-          header.fragmentationPlType[i] = 0;
-          header.fragmentationTimeDiff[i] = 0;
-        }
-      }
-
-      callback_result = callback_->OnEncodedImage(*image, &info, &header);
-    }
-
-    // Return output buffer back to the encoder.
-    bool success = jni->CallBooleanMethod(*j_media_codec_video_encoder_,
-                                          j_release_output_buffer_method_,
-                                          output_buffer_index);
-    if (CheckException(jni) || !success) {
-      ProcessHWError(true /* reset_if_fallback_unavailable */);
-      return false;
-    }
-
-    // Print per frame statistics.
-    if (encoding_start_time_ms > 0) {
-      frame_encoding_time_ms = rtc::TimeMillis() - encoding_start_time_ms;
-    }
-    if (frames_encoded_ < kMaxEncodedLogFrames) {
-      int current_latency = static_cast<int>(last_input_timestamp_ms_ -
-                                             last_output_timestamp_ms_);
-      ALOGD << "Encoder frame out # " << frames_encoded_
-            << ". Key: " << key_frame << ". Size: " << payload_size
-            << ". TS: " << static_cast<int>(last_output_timestamp_ms_)
-            << ". Latency: " << current_latency
-            << ". EncTime: " << frame_encoding_time_ms;
-    }
-
-    // Calculate and print encoding statistics - every 3 seconds.
-    frames_encoded_++;
-    current_frames_++;
-    current_bytes_ += payload_size;
-    current_encoding_time_ms_ += frame_encoding_time_ms;
-    LogStatistics(false);
-
-    // Errors in callback_result are currently ignored.
-    if (callback_result.drop_next_frame)
-      drop_next_input_frame_ = true;
-  }
-  return true;
-}
-
-void MediaCodecVideoEncoder::LogStatistics(bool force_log) {
-  int statistic_time_ms = rtc::TimeMillis() - stat_start_time_ms_;
-  if ((statistic_time_ms >= kMediaCodecStatisticsIntervalMs || force_log)
-      && statistic_time_ms > 0) {
-    // Prevent division by zero.
-    int current_frames_divider = current_frames_ != 0 ? current_frames_ : 1;
-
-    int current_bitrate = current_bytes_ * 8 / statistic_time_ms;
-    int current_fps =
-        (current_frames_ * 1000 + statistic_time_ms / 2) / statistic_time_ms;
-    ALOGD << "Encoded frames: " << frames_encoded_ <<
-        ". Bitrate: " << current_bitrate <<
-        ", target: " << last_set_bitrate_kbps_ << " kbps" <<
-        ", fps: " << current_fps <<
-        ", encTime: " << (current_encoding_time_ms_ / current_frames_divider) <<
-        ". QP: " << (current_acc_qp_ / current_frames_divider) <<
-        " for last " << statistic_time_ms << " ms.";
-    stat_start_time_ms_ = rtc::TimeMillis();
-    current_frames_ = 0;
-    current_bytes_ = 0;
-    current_acc_qp_ = 0;
-    current_encoding_time_ms_ = 0;
-  }
-}
-
-VideoEncoder::ScalingSettings MediaCodecVideoEncoder::GetScalingSettings()
-    const {
-  if (field_trial::IsEnabled(kCustomQPThresholdsFieldTrial)) {
-    const VideoCodecType codec_type = GetCodecType();
-    std::string experiment_string =
-        field_trial::FindFullName(kCustomQPThresholdsFieldTrial);
-    ALOGD << "QP custom thresholds: " << experiment_string << " for codec "
-          << codec_type;
-    int low_vp8_qp_threshold;
-    int high_vp8_qp_threshold;
-    int low_h264_qp_threshold;
-    int high_h264_qp_threshold;
-    int parsed_values = sscanf(experiment_string.c_str(), "Enabled-%u,%u,%u,%u",
-                               &low_vp8_qp_threshold, &high_vp8_qp_threshold,
-                               &low_h264_qp_threshold, &high_h264_qp_threshold);
-    if (parsed_values == 4) {
-      RTC_CHECK_GT(high_vp8_qp_threshold, low_vp8_qp_threshold);
-      RTC_CHECK_GT(low_vp8_qp_threshold, 0);
-      RTC_CHECK_GT(high_h264_qp_threshold, low_h264_qp_threshold);
-      RTC_CHECK_GT(low_h264_qp_threshold, 0);
-      if (codec_type == kVideoCodecVP8) {
-        return VideoEncoder::ScalingSettings(scale_, low_vp8_qp_threshold,
-                                             high_vp8_qp_threshold);
-      } else if (codec_type == kVideoCodecH264) {
-        return VideoEncoder::ScalingSettings(scale_, low_h264_qp_threshold,
-                                             high_h264_qp_threshold);
-      }
-    }
-  }
-  return VideoEncoder::ScalingSettings(scale_);
-}
-
-const char* MediaCodecVideoEncoder::ImplementationName() const {
-  return "MediaCodec";
-}
-
-MediaCodecVideoEncoderFactory::MediaCodecVideoEncoderFactory()
-    : egl_context_(nullptr) {
-  JNIEnv* jni = AttachCurrentThreadIfNeeded();
-  ScopedLocalRefFrame local_ref_frame(jni);
-  jclass j_encoder_class = FindClass(jni, "org/webrtc/MediaCodecVideoEncoder");
-  jclass j_decoder_class = FindClass(jni, "org/webrtc/MediaCodecVideoDecoder");
-  supported_codecs_.clear();
-
-  bool is_vp8_hw_supported = jni->CallStaticBooleanMethod(
-      j_encoder_class,
-      GetStaticMethodID(jni, j_encoder_class, "isVp8HwSupported", "()Z"));
-  CHECK_EXCEPTION(jni);
-  if (is_vp8_hw_supported) {
-    ALOGD << "VP8 HW Encoder supported.";
-    supported_codecs_.push_back(cricket::VideoCodec(cricket::kVp8CodecName));
-  }
-
-  bool is_vp9_hw_supported = jni->CallStaticBooleanMethod(
-      j_encoder_class,
-      GetStaticMethodID(jni, j_encoder_class, "isVp9HwSupported", "()Z"));
-  CHECK_EXCEPTION(jni);
-  if (is_vp9_hw_supported) {
-    ALOGD << "VP9 HW Encoder supported.";
-    supported_codecs_.push_back(cricket::VideoCodec(cricket::kVp9CodecName));
-  }
-  supported_codecs_with_h264_hp_ = supported_codecs_;
-
-  // Check if high profile is supported by decoder. If yes, encoder can always
-  // fall back to baseline profile as a subset as high profile.
-  bool is_h264_high_profile_hw_supported = jni->CallStaticBooleanMethod(
-      j_decoder_class,
-      GetStaticMethodID(jni, j_decoder_class, "isH264HighProfileHwSupported",
-                        "()Z"));
-  CHECK_EXCEPTION(jni);
-  if (is_h264_high_profile_hw_supported) {
-    ALOGD << "H.264 High Profile HW Encoder supported.";
-    // TODO(magjed): Enumerate actual level instead of using hardcoded level
-    // 3.1. Level 3.1 is 1280x720@30fps which is enough for now.
-    cricket::VideoCodec constrained_high(cricket::kH264CodecName);
-    const H264::ProfileLevelId constrained_high_profile(
-        H264::kProfileConstrainedHigh, H264::kLevel3_1);
-    constrained_high.SetParam(
-        cricket::kH264FmtpProfileLevelId,
-        *H264::ProfileLevelIdToString(constrained_high_profile));
-    constrained_high.SetParam(cricket::kH264FmtpLevelAsymmetryAllowed, "1");
-    constrained_high.SetParam(cricket::kH264FmtpPacketizationMode, "1");
-    supported_codecs_with_h264_hp_.push_back(constrained_high);
-  }
-
-  bool is_h264_hw_supported = jni->CallStaticBooleanMethod(
-      j_encoder_class,
-      GetStaticMethodID(jni, j_encoder_class, "isH264HwSupported", "()Z"));
-  CHECK_EXCEPTION(jni);
-  if (is_h264_hw_supported) {
-    ALOGD << "H.264 HW Encoder supported.";
-    // TODO(magjed): Push Constrained High profile as well when negotiation is
-    // ready, http://crbug/webrtc/6337. We can negotiate Constrained High
-    // profile as long as we have decode support for it and still send Baseline
-    // since Baseline is a subset of the High profile.
-    cricket::VideoCodec constrained_baseline(cricket::kH264CodecName);
-    const H264::ProfileLevelId constrained_baseline_profile(
-        H264::kProfileConstrainedBaseline, H264::kLevel3_1);
-    constrained_baseline.SetParam(
-        cricket::kH264FmtpProfileLevelId,
-        *H264::ProfileLevelIdToString(constrained_baseline_profile));
-    constrained_baseline.SetParam(cricket::kH264FmtpLevelAsymmetryAllowed, "1");
-    constrained_baseline.SetParam(cricket::kH264FmtpPacketizationMode, "1");
-    supported_codecs_.push_back(constrained_baseline);
-    supported_codecs_with_h264_hp_.push_back(constrained_baseline);
-  }
-}
-
-MediaCodecVideoEncoderFactory::~MediaCodecVideoEncoderFactory() {
-  ALOGD << "MediaCodecVideoEncoderFactory dtor";
-  if (egl_context_) {
-    JNIEnv* jni = AttachCurrentThreadIfNeeded();
-    jni->DeleteGlobalRef(egl_context_);
-  }
-}
-
-void MediaCodecVideoEncoderFactory::SetEGLContext(
-    JNIEnv* jni, jobject egl_context) {
-  ALOGD << "MediaCodecVideoEncoderFactory::SetEGLContext";
-  if (egl_context_) {
-    jni->DeleteGlobalRef(egl_context_);
-    egl_context_ = nullptr;
-  }
-  egl_context_ = jni->NewGlobalRef(egl_context);
-  if (CheckException(jni)) {
-    ALOGE << "error calling NewGlobalRef for EGL Context.";
-  }
-}
-
-VideoEncoder* MediaCodecVideoEncoderFactory::CreateVideoEncoder(
-    const cricket::VideoCodec& codec) {
-  if (supported_codecs().empty()) {
-    ALOGW << "No HW video encoder for codec " << codec.name;
-    return nullptr;
-  }
-  if (FindMatchingCodec(supported_codecs(), codec)) {
-    ALOGD << "Create HW video encoder for " << codec.name;
-    JNIEnv* jni = AttachCurrentThreadIfNeeded();
-    ScopedLocalRefFrame local_ref_frame(jni);
-    return new MediaCodecVideoEncoder(jni, codec, egl_context_);
-  }
-  ALOGW << "Can not find HW video encoder for type " << codec.name;
-  return nullptr;
-}
-
-const std::vector<cricket::VideoCodec>&
-MediaCodecVideoEncoderFactory::supported_codecs() const {
-  if (field_trial::IsEnabled(kH264HighProfileFieldTrial)) {
-    return supported_codecs_with_h264_hp_;
-  } else {
-    return supported_codecs_;
-  }
-}
-
-void MediaCodecVideoEncoderFactory::DestroyVideoEncoder(VideoEncoder* encoder) {
-  ALOGD << "Destroy video encoder.";
-  delete encoder;
-}
-
-JNI_FUNCTION_DECLARATION(void,
-                         MediaCodecVideoEncoder_nativeFillBuffer,
-                         JNIEnv* jni,
-                         jclass,
-                         jlong native_encoder,
-                         jint input_buffer,
-                         jobject j_buffer_y,
-                         jint stride_y,
-                         jobject j_buffer_u,
-                         jint stride_u,
-                         jobject j_buffer_v,
-                         jint stride_v) {
-  uint8_t* buffer_y =
-      static_cast<uint8_t*>(jni->GetDirectBufferAddress(j_buffer_y));
-  uint8_t* buffer_u =
-      static_cast<uint8_t*>(jni->GetDirectBufferAddress(j_buffer_u));
-  uint8_t* buffer_v =
-      static_cast<uint8_t*>(jni->GetDirectBufferAddress(j_buffer_v));
-
-  reinterpret_cast<MediaCodecVideoEncoder*>(native_encoder)
-      ->FillInputBuffer(jni, input_buffer, buffer_y, stride_y, buffer_u,
-                        stride_u, buffer_v, stride_v);
-}
-
-}  // namespace jni
-}  // namespace webrtc
diff --git a/sdk/android/src/jni/androidmediaencoder_jni.h b/sdk/android/src/jni/androidmediaencoder_jni.h
deleted file mode 100644
index 4b3be4e..0000000
--- a/sdk/android/src/jni/androidmediaencoder_jni.h
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- *  Copyright 2015 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_SDK_ANDROID_SRC_JNI_ANDROIDMEDIAENCODER_JNI_H_
-#define WEBRTC_SDK_ANDROID_SRC_JNI_ANDROIDMEDIAENCODER_JNI_H_
-
-#include <vector>
-
-#include "webrtc/sdk/android/src/jni/jni_helpers.h"
-#include "webrtc/media/engine/webrtcvideoencoderfactory.h"
-
-namespace webrtc {
-namespace jni {
-
-// Implementation of Android MediaCodec based encoder factory.
-class MediaCodecVideoEncoderFactory
-    : public cricket::WebRtcVideoEncoderFactory {
- public:
-  MediaCodecVideoEncoderFactory();
-  virtual ~MediaCodecVideoEncoderFactory();
-
-  void SetEGLContext(JNIEnv* jni, jobject egl_context);
-
-  // WebRtcVideoEncoderFactory implementation.
-  VideoEncoder* CreateVideoEncoder(const cricket::VideoCodec& codec) override;
-  const std::vector<cricket::VideoCodec>& supported_codecs() const override;
-  void DestroyVideoEncoder(VideoEncoder* encoder) override;
-
- private:
-  jobject egl_context_;
-
-  // Empty if platform support is lacking, const after ctor returns.
-  std::vector<cricket::VideoCodec> supported_codecs_;
-  std::vector<cricket::VideoCodec> supported_codecs_with_h264_hp_;
-};
-
-}  // namespace jni
-}  // namespace webrtc
-
-#endif  // WEBRTC_SDK_ANDROID_SRC_JNI_ANDROIDMEDIAENCODER_JNI_H_
diff --git a/sdk/android/src/jni/androidmetrics_jni.cc b/sdk/android/src/jni/androidmetrics_jni.cc
deleted file mode 100644
index a4eb33b..0000000
--- a/sdk/android/src/jni/androidmetrics_jni.cc
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- *  Copyright 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 <map>
-#include <memory>
-
-#include "webrtc/sdk/android/src/jni/classreferenceholder.h"
-#include "webrtc/sdk/android/src/jni/jni_helpers.h"
-#include "webrtc/system_wrappers/include/metrics.h"
-#include "webrtc/system_wrappers/include/metrics_default.h"
-
-// Enables collection of native histograms and creating them.
-namespace webrtc {
-namespace jni {
-
-JNI_FUNCTION_DECLARATION(void, Metrics_nativeEnable, JNIEnv* jni, jclass) {
-  metrics::Enable();
-}
-
-// Gets and clears native histograms.
-JNI_FUNCTION_DECLARATION(jobject,
-                         Metrics_nativeGetAndReset,
-                         JNIEnv* jni,
-                         jclass) {
-  jclass j_metrics_class = jni->FindClass("org/webrtc/Metrics");
-  jmethodID j_add =
-      GetMethodID(jni, j_metrics_class, "add",
-                  "(Ljava/lang/String;Lorg/webrtc/Metrics$HistogramInfo;)V");
-  jclass j_info_class = jni->FindClass("org/webrtc/Metrics$HistogramInfo");
-  jmethodID j_add_sample = GetMethodID(jni, j_info_class, "addSample", "(II)V");
-
-  // Create |Metrics|.
-  jobject j_metrics = jni->NewObject(
-      j_metrics_class, GetMethodID(jni, j_metrics_class, "<init>", "()V"));
-
-  std::map<std::string, std::unique_ptr<metrics::SampleInfo>> histograms;
-  metrics::GetAndReset(&histograms);
-  for (const auto& kv : histograms) {
-    // Create and add samples to |HistogramInfo|.
-    jobject j_info = jni->NewObject(
-        j_info_class, GetMethodID(jni, j_info_class, "<init>", "(III)V"),
-        kv.second->min, kv.second->max,
-        static_cast<int>(kv.second->bucket_count));
-    for (const auto& sample : kv.second->samples) {
-      jni->CallVoidMethod(j_info, j_add_sample, sample.first, sample.second);
-    }
-    // Add |HistogramInfo| to |Metrics|.
-    jstring j_name = jni->NewStringUTF(kv.first.c_str());
-    jni->CallVoidMethod(j_metrics, j_add, j_name, j_info);
-    jni->DeleteLocalRef(j_name);
-    jni->DeleteLocalRef(j_info);
-  }
-  CHECK_EXCEPTION(jni);
-  return j_metrics;
-}
-
-}  // namespace jni
-}  // namespace webrtc
diff --git a/sdk/android/src/jni/androidnetworkmonitor_jni.h b/sdk/android/src/jni/androidnetworkmonitor_jni.h
deleted file mode 100644
index c72b9d0..0000000
--- a/sdk/android/src/jni/androidnetworkmonitor_jni.h
+++ /dev/null
@@ -1,14 +0,0 @@
-/*
- *  Copyright 2017 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.
- */
-
-// TODO(deadbeef): Remove this file when clients are updated to new include
-// path.
-
-#include "webrtc/sdk/android/src/jni/pc/androidnetworkmonitor_jni.h"
diff --git a/sdk/android/src/jni/androidvideotracksource.cc b/sdk/android/src/jni/androidvideotracksource.cc
deleted file mode 100644
index 4c4e87e..0000000
--- a/sdk/android/src/jni/androidvideotracksource.cc
+++ /dev/null
@@ -1,211 +0,0 @@
-/*
- *  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/sdk/android/src/jni/androidvideotracksource.h"
-
-#include <utility>
-
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/sdk/android/src/jni/classreferenceholder.h"
-
-namespace {
-// MediaCodec wants resolution to be divisible by 2.
-const int kRequiredResolutionAlignment = 2;
-}
-
-namespace webrtc {
-namespace jni {
-
-AndroidVideoTrackSource::AndroidVideoTrackSource(
-    rtc::Thread* signaling_thread,
-    JNIEnv* jni,
-    jobject j_surface_texture_helper,
-    bool is_screencast)
-    : AdaptedVideoTrackSource(kRequiredResolutionAlignment),
-      signaling_thread_(signaling_thread),
-      surface_texture_helper_(new rtc::RefCountedObject<SurfaceTextureHelper>(
-          jni,
-          j_surface_texture_helper)),
-      video_buffer_factory_(jni),
-      is_screencast_(is_screencast) {
-  LOG(LS_INFO) << "AndroidVideoTrackSource ctor";
-  camera_thread_checker_.DetachFromThread();
-
-  jclass j_video_frame_buffer_class =
-      FindClass(jni, "org/webrtc/VideoFrame$Buffer");
-  j_crop_and_scale_id_ =
-      jni->GetMethodID(j_video_frame_buffer_class, "cropAndScale",
-                       "(IIIIII)Lorg/webrtc/VideoFrame$Buffer;");
-}
-
-void AndroidVideoTrackSource::SetState(SourceState state) {
-  if (rtc::Thread::Current() != signaling_thread_) {
-    invoker_.AsyncInvoke<void>(
-        RTC_FROM_HERE, signaling_thread_,
-        rtc::Bind(&AndroidVideoTrackSource::SetState, this, state));
-    return;
-  }
-
-  if (state_ != state) {
-    state_ = state;
-    FireOnChanged();
-  }
-}
-
-void AndroidVideoTrackSource::OnByteBufferFrameCaptured(const void* frame_data,
-                                                        int length,
-                                                        int width,
-                                                        int height,
-                                                        VideoRotation rotation,
-                                                        int64_t timestamp_ns) {
-  RTC_DCHECK(camera_thread_checker_.CalledOnValidThread());
-
-  int64_t camera_time_us = timestamp_ns / rtc::kNumNanosecsPerMicrosec;
-  int64_t translated_camera_time_us =
-      timestamp_aligner_.TranslateTimestamp(camera_time_us, rtc::TimeMicros());
-
-  int adapted_width;
-  int adapted_height;
-  int crop_width;
-  int crop_height;
-  int crop_x;
-  int crop_y;
-
-  if (!AdaptFrame(width, height, camera_time_us, &adapted_width,
-                  &adapted_height, &crop_width, &crop_height, &crop_x,
-                  &crop_y)) {
-    return;
-  }
-
-  const uint8_t* y_plane = static_cast<const uint8_t*>(frame_data);
-  const uint8_t* uv_plane = y_plane + width * height;
-  const int uv_width = (width + 1) / 2;
-
-  RTC_CHECK_GE(length, width * height + 2 * uv_width * ((height + 1) / 2));
-
-  // Can only crop at even pixels.
-  crop_x &= ~1;
-  crop_y &= ~1;
-  // Crop just by modifying pointers.
-  y_plane += width * crop_y + crop_x;
-  uv_plane += uv_width * crop_y + crop_x;
-
-  rtc::scoped_refptr<I420Buffer> buffer =
-      buffer_pool_.CreateBuffer(adapted_width, adapted_height);
-
-  nv12toi420_scaler_.NV12ToI420Scale(
-      y_plane, width, uv_plane, uv_width * 2, crop_width, crop_height,
-      buffer->MutableDataY(), buffer->StrideY(),
-      // Swap U and V, since we have NV21, not NV12.
-      buffer->MutableDataV(), buffer->StrideV(), buffer->MutableDataU(),
-      buffer->StrideU(), buffer->width(), buffer->height());
-
-  OnFrame(VideoFrame(buffer, rotation, translated_camera_time_us));
-}
-
-void AndroidVideoTrackSource::OnTextureFrameCaptured(
-    int width,
-    int height,
-    VideoRotation rotation,
-    int64_t timestamp_ns,
-    const NativeHandleImpl& handle) {
-  RTC_DCHECK(camera_thread_checker_.CalledOnValidThread());
-
-  int64_t camera_time_us = timestamp_ns / rtc::kNumNanosecsPerMicrosec;
-  int64_t translated_camera_time_us =
-      timestamp_aligner_.TranslateTimestamp(camera_time_us, rtc::TimeMicros());
-
-  int adapted_width;
-  int adapted_height;
-  int crop_width;
-  int crop_height;
-  int crop_x;
-  int crop_y;
-
-  if (!AdaptFrame(width, height, camera_time_us, &adapted_width,
-                  &adapted_height, &crop_width, &crop_height, &crop_x,
-                  &crop_y)) {
-    surface_texture_helper_->ReturnTextureFrame();
-    return;
-  }
-
-  Matrix matrix = handle.sampling_matrix;
-
-  matrix.Crop(crop_width / static_cast<float>(width),
-              crop_height / static_cast<float>(height),
-              crop_x / static_cast<float>(width),
-              crop_y / static_cast<float>(height));
-
-  // Note that apply_rotation() may change under our feet, so we should only
-  // check once.
-  if (apply_rotation()) {
-    if (rotation == kVideoRotation_90 || rotation == kVideoRotation_270) {
-      std::swap(adapted_width, adapted_height);
-    }
-    matrix.Rotate(rotation);
-    rotation = kVideoRotation_0;
-  }
-
-  OnFrame(VideoFrame(surface_texture_helper_->CreateTextureFrame(
-                         adapted_width, adapted_height,
-                         NativeHandleImpl(handle.oes_texture_id, matrix)),
-                     rotation, translated_camera_time_us));
-}
-
-void AndroidVideoTrackSource::OnFrameCaptured(JNIEnv* jni,
-                                              int width,
-                                              int height,
-                                              int64_t timestamp_ns,
-                                              VideoRotation rotation,
-                                              jobject j_video_frame_buffer) {
-  RTC_DCHECK(camera_thread_checker_.CalledOnValidThread());
-
-  int64_t camera_time_us = timestamp_ns / rtc::kNumNanosecsPerMicrosec;
-  int64_t translated_camera_time_us =
-      timestamp_aligner_.TranslateTimestamp(camera_time_us, rtc::TimeMicros());
-
-  int adapted_width;
-  int adapted_height;
-  int crop_width;
-  int crop_height;
-  int crop_x;
-  int crop_y;
-
-  if (!AdaptFrame(width, height, camera_time_us, &adapted_width,
-                  &adapted_height, &crop_width, &crop_height, &crop_x,
-                  &crop_y)) {
-    return;
-  }
-
-  jobject j_adapted_video_frame_buffer = jni->CallObjectMethod(
-      j_video_frame_buffer, j_crop_and_scale_id_, crop_x, crop_y, crop_width,
-      crop_height, adapted_width, adapted_height);
-
-  rtc::scoped_refptr<VideoFrameBuffer> buffer =
-      video_buffer_factory_.WrapBuffer(jni, j_adapted_video_frame_buffer);
-
-  // AdaptedVideoTrackSource handles applying rotation for I420 frames.
-  if (apply_rotation()) {
-    buffer = buffer->ToI420();
-  }
-
-  OnFrame(VideoFrame(buffer, rotation, translated_camera_time_us));
-}
-
-void AndroidVideoTrackSource::OnOutputFormatRequest(int width,
-                                                    int height,
-                                                    int fps) {
-  cricket::VideoFormat format(width, height,
-                              cricket::VideoFormat::FpsToInterval(fps), 0);
-  video_adapter()->OnOutputFormatRequest(format);
-}
-
-}  // namespace webrtc
-}  // namespace webrtc
diff --git a/sdk/android/src/jni/androidvideotracksource.h b/sdk/android/src/jni/androidvideotracksource.h
deleted file mode 100644
index 3608d02..0000000
--- a/sdk/android/src/jni/androidvideotracksource.h
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- *  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_API_ANDROID_JNI_ANDROIDVIDEOTRACKSOURCE_H_
-#define WEBRTC_API_ANDROID_JNI_ANDROIDVIDEOTRACKSOURCE_H_
-
-#include <jni.h>
-
-#include "webrtc/common_video/include/i420_buffer_pool.h"
-#include "webrtc/common_video/libyuv/include/webrtc_libyuv.h"
-#include "webrtc/media/base/adaptedvideotracksource.h"
-#include "webrtc/rtc_base/asyncinvoker.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/thread_checker.h"
-#include "webrtc/rtc_base/timestampaligner.h"
-#include "webrtc/sdk/android/src/jni/native_handle_impl.h"
-#include "webrtc/sdk/android/src/jni/surfacetexturehelper_jni.h"
-
-namespace webrtc {
-namespace jni {
-
-class AndroidVideoTrackSource : public rtc::AdaptedVideoTrackSource {
- public:
-  AndroidVideoTrackSource(rtc::Thread* signaling_thread,
-                          JNIEnv* jni,
-                          jobject j_surface_texture_helper,
-                          bool is_screencast = false);
-
-  bool is_screencast() const override { return is_screencast_; }
-
-  // Indicates that the encoder should denoise video before encoding it.
-  // If it is not set, the default configuration is used which is different
-  // depending on video codec.
-  rtc::Optional<bool> needs_denoising() const override {
-    return rtc::Optional<bool>(false);
-  }
-
-  // Called by the native capture observer
-  void SetState(SourceState state);
-
-  SourceState state() const override { return state_; }
-
-  bool remote() const override { return false; }
-
-  void OnByteBufferFrameCaptured(const void* frame_data,
-                                 int length,
-                                 int width,
-                                 int height,
-                                 VideoRotation rotation,
-                                 int64_t timestamp_ns);
-
-  void OnTextureFrameCaptured(int width,
-                              int height,
-                              VideoRotation rotation,
-                              int64_t timestamp_ns,
-                              const NativeHandleImpl& handle);
-
-  void OnFrameCaptured(JNIEnv* jni,
-                       int width,
-                       int height,
-                       int64_t timestamp_ns,
-                       VideoRotation rotation,
-                       jobject j_video_frame_buffer);
-
-  void OnOutputFormatRequest(int width, int height, int fps);
-
-  rtc::scoped_refptr<SurfaceTextureHelper> surface_texture_helper() {
-    return surface_texture_helper_;
-  }
-
- private:
-  rtc::Thread* signaling_thread_;
-  rtc::AsyncInvoker invoker_;
-  rtc::ThreadChecker camera_thread_checker_;
-  SourceState state_;
-  rtc::TimestampAligner timestamp_aligner_;
-  NV12ToI420Scaler nv12toi420_scaler_;
-  I420BufferPool buffer_pool_;
-  rtc::scoped_refptr<SurfaceTextureHelper> surface_texture_helper_;
-  AndroidVideoBufferFactory video_buffer_factory_;
-  const bool is_screencast_;
-
-  jmethodID j_crop_and_scale_id_;
-};
-
-}  // namespace jni
-}  // namespace webrtc
-
-#endif  // WEBRTC_API_ANDROID_JNI_ANDROIDVIDEOTRACKSOURCE_H_
diff --git a/sdk/android/src/jni/androidvideotracksource_jni.cc b/sdk/android/src/jni/androidvideotracksource_jni.cc
deleted file mode 100644
index fc9f3b2..0000000
--- a/sdk/android/src/jni/androidvideotracksource_jni.cc
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- *  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/api/video/video_rotation.h"
-#include "webrtc/api/videosourceproxy.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/sdk/android/src/jni/androidvideotracksource.h"
-#include "webrtc/sdk/android/src/jni/classreferenceholder.h"
-
-namespace webrtc {
-
-namespace {
-
-static VideoRotation jintToVideoRotation(jint rotation) {
-  RTC_DCHECK(rotation == 0 || rotation == 90 || rotation == 180 ||
-             rotation == 270);
-  return static_cast<VideoRotation>(rotation);
-}
-
-}  // namespace
-
-namespace jni {
-
-static AndroidVideoTrackSource* AndroidVideoTrackSourceFromJavaProxy(
-    jlong j_proxy) {
-  auto proxy_source = reinterpret_cast<VideoTrackSourceProxy*>(j_proxy);
-  return reinterpret_cast<AndroidVideoTrackSource*>(proxy_source->internal());
-}
-
-JNI_FUNCTION_DECLARATION(
-    void,
-    AndroidVideoTrackSourceObserver_nativeOnByteBufferFrameCaptured,
-    JNIEnv* jni,
-    jclass,
-    jlong j_source,
-    jbyteArray j_frame,
-    jint length,
-    jint width,
-    jint height,
-    jint rotation,
-    jlong timestamp) {
-  AndroidVideoTrackSource* source =
-      AndroidVideoTrackSourceFromJavaProxy(j_source);
-  jbyte* bytes = jni->GetByteArrayElements(j_frame, nullptr);
-  source->OnByteBufferFrameCaptured(bytes, length, width, height,
-                                    jintToVideoRotation(rotation), timestamp);
-  jni->ReleaseByteArrayElements(j_frame, bytes, JNI_ABORT);
-}
-
-JNI_FUNCTION_DECLARATION(
-    void,
-    AndroidVideoTrackSourceObserver_nativeOnTextureFrameCaptured,
-    JNIEnv* jni,
-    jclass,
-    jlong j_source,
-    jint j_width,
-    jint j_height,
-    jint j_oes_texture_id,
-    jfloatArray j_transform_matrix,
-    jint j_rotation,
-    jlong j_timestamp) {
-  AndroidVideoTrackSource* source =
-      AndroidVideoTrackSourceFromJavaProxy(j_source);
-  source->OnTextureFrameCaptured(
-      j_width, j_height, jintToVideoRotation(j_rotation), j_timestamp,
-      NativeHandleImpl(jni, j_oes_texture_id, j_transform_matrix));
-}
-
-JNI_FUNCTION_DECLARATION(void,
-                         AndroidVideoTrackSourceObserver_nativeOnFrameCaptured,
-                         JNIEnv* jni,
-                         jclass,
-                         jlong j_source,
-                         jint j_width,
-                         jint j_height,
-                         jint j_rotation,
-                         jlong j_timestamp_ns,
-                         jobject j_video_frame_buffer) {
-  AndroidVideoTrackSource* source =
-      AndroidVideoTrackSourceFromJavaProxy(j_source);
-  source->OnFrameCaptured(jni, j_width, j_height, j_timestamp_ns,
-                          jintToVideoRotation(j_rotation),
-                          j_video_frame_buffer);
-}
-
-JNI_FUNCTION_DECLARATION(void,
-                         AndroidVideoTrackSourceObserver_nativeCapturerStarted,
-                         JNIEnv* jni,
-                         jclass,
-                         jlong j_source,
-                         jboolean j_success) {
-  LOG(LS_INFO) << "AndroidVideoTrackSourceObserve_nativeCapturerStarted";
-  AndroidVideoTrackSource* source =
-      AndroidVideoTrackSourceFromJavaProxy(j_source);
-  source->SetState(j_success ? AndroidVideoTrackSource::SourceState::kLive
-                             : AndroidVideoTrackSource::SourceState::kEnded);
-}
-
-JNI_FUNCTION_DECLARATION(void,
-                         AndroidVideoTrackSourceObserver_nativeCapturerStopped,
-                         JNIEnv* jni,
-                         jclass,
-                         jlong j_source) {
-  LOG(LS_INFO) << "AndroidVideoTrackSourceObserve_nativeCapturerStopped";
-  AndroidVideoTrackSource* source =
-      AndroidVideoTrackSourceFromJavaProxy(j_source);
-  source->SetState(AndroidVideoTrackSource::SourceState::kEnded);
-}
-
-JNI_FUNCTION_DECLARATION(void,
-                         VideoSource_nativeAdaptOutputFormat,
-                         JNIEnv* jni,
-                         jclass,
-                         jlong j_source,
-                         jint j_width,
-                         jint j_height,
-                         jint j_fps) {
-  LOG(LS_INFO) << "VideoSource_nativeAdaptOutputFormat";
-  AndroidVideoTrackSource* source =
-      AndroidVideoTrackSourceFromJavaProxy(j_source);
-  source->OnOutputFormatRequest(j_width, j_height, j_fps);
-}
-
-}  // namespace jni
-}  // namespace webrtc
diff --git a/sdk/android/src/jni/classreferenceholder.cc b/sdk/android/src/jni/classreferenceholder.cc
deleted file mode 100644
index 7648798..0000000
--- a/sdk/android/src/jni/classreferenceholder.cc
+++ /dev/null
@@ -1,165 +0,0 @@
-/*
- *  Copyright 2015 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/sdk/android/src/jni/classreferenceholder.h"
-
-#include "webrtc/sdk/android/src/jni/jni_helpers.h"
-
-namespace webrtc {
-namespace jni {
-
-// ClassReferenceHolder holds global reference to Java classes in app/webrtc.
-class ClassReferenceHolder {
- public:
-  explicit ClassReferenceHolder(JNIEnv* jni);
-  ~ClassReferenceHolder();
-
-  void FreeReferences(JNIEnv* jni);
-  jclass GetClass(const std::string& name);
-
- private:
-  void LoadClass(JNIEnv* jni, const std::string& name);
-
-  std::map<std::string, jclass> classes_;
-};
-
-// Allocated in LoadGlobalClassReferenceHolder(),
-// freed in FreeGlobalClassReferenceHolder().
-static ClassReferenceHolder* g_class_reference_holder = nullptr;
-
-void LoadGlobalClassReferenceHolder() {
-  RTC_CHECK(g_class_reference_holder == nullptr);
-  g_class_reference_holder = new ClassReferenceHolder(GetEnv());
-}
-
-void FreeGlobalClassReferenceHolder() {
-  g_class_reference_holder->FreeReferences(AttachCurrentThreadIfNeeded());
-  delete g_class_reference_holder;
-  g_class_reference_holder = nullptr;
-}
-
-ClassReferenceHolder::ClassReferenceHolder(JNIEnv* jni) {
-  LoadClass(jni, "android/graphics/SurfaceTexture");
-  LoadClass(jni, "java/lang/Boolean");
-  LoadClass(jni, "java/lang/Double");
-  LoadClass(jni, "java/lang/Integer");
-  LoadClass(jni, "java/lang/Long");
-  LoadClass(jni, "java/lang/String");
-  LoadClass(jni, "java/math/BigInteger");
-  LoadClass(jni, "java/nio/ByteBuffer");
-  LoadClass(jni, "java/util/ArrayList");
-  LoadClass(jni, "java/util/LinkedHashMap");
-  LoadClass(jni, "org/webrtc/AudioTrack");
-  LoadClass(jni, "org/webrtc/Camera1Enumerator");
-  LoadClass(jni, "org/webrtc/Camera2Enumerator");
-  LoadClass(jni, "org/webrtc/CameraEnumerationAndroid");
-  LoadClass(jni, "org/webrtc/DataChannel");
-  LoadClass(jni, "org/webrtc/DataChannel$Buffer");
-  LoadClass(jni, "org/webrtc/DataChannel$Init");
-  LoadClass(jni, "org/webrtc/DataChannel$State");
-  LoadClass(jni, "org/webrtc/EglBase");
-  LoadClass(jni, "org/webrtc/EglBase$Context");
-  LoadClass(jni, "org/webrtc/EglBase14$Context");
-  LoadClass(jni, "org/webrtc/EncodedImage");
-  LoadClass(jni, "org/webrtc/EncodedImage$FrameType");
-  LoadClass(jni, "org/webrtc/IceCandidate");
-  LoadClass(jni, "org/webrtc/MediaCodecVideoDecoder");
-  LoadClass(jni, "org/webrtc/MediaCodecVideoDecoder$DecodedOutputBuffer");
-  LoadClass(jni, "org/webrtc/MediaCodecVideoDecoder$DecodedTextureBuffer");
-  LoadClass(jni, "org/webrtc/MediaCodecVideoDecoder$VideoCodecType");
-  LoadClass(jni, "org/webrtc/MediaCodecVideoEncoder");
-  LoadClass(jni, "org/webrtc/MediaCodecVideoEncoder$OutputBufferInfo");
-  LoadClass(jni, "org/webrtc/MediaCodecVideoEncoder$VideoCodecType");
-  LoadClass(jni, "org/webrtc/MediaSource$State");
-  LoadClass(jni, "org/webrtc/MediaStream");
-  LoadClass(jni, "org/webrtc/MediaStreamTrack$MediaType");
-  LoadClass(jni, "org/webrtc/MediaStreamTrack$State");
-  LoadClass(jni, "org/webrtc/NetworkMonitor");
-  LoadClass(jni, "org/webrtc/NetworkMonitorAutoDetect$ConnectionType");
-  LoadClass(jni, "org/webrtc/NetworkMonitorAutoDetect$IPAddress");
-  LoadClass(jni, "org/webrtc/NetworkMonitorAutoDetect$NetworkInformation");
-  LoadClass(jni, "org/webrtc/PeerConnection$BundlePolicy");
-  LoadClass(jni, "org/webrtc/PeerConnection$CandidateNetworkPolicy");
-  LoadClass(jni, "org/webrtc/PeerConnection$ContinualGatheringPolicy");
-  LoadClass(jni, "org/webrtc/PeerConnection$IceConnectionState");
-  LoadClass(jni, "org/webrtc/PeerConnection$IceGatheringState");
-  LoadClass(jni, "org/webrtc/PeerConnection$IceTransportsType");
-  LoadClass(jni, "org/webrtc/PeerConnection$KeyType");
-  LoadClass(jni, "org/webrtc/PeerConnection$RtcpMuxPolicy");
-  LoadClass(jni, "org/webrtc/PeerConnection$SignalingState");
-  LoadClass(jni, "org/webrtc/PeerConnection$TcpCandidatePolicy");
-  LoadClass(jni, "org/webrtc/PeerConnection$TlsCertPolicy");
-  LoadClass(jni, "org/webrtc/PeerConnectionFactory");
-  LoadClass(jni, "org/webrtc/RTCStats");
-  LoadClass(jni, "org/webrtc/RTCStatsReport");
-  LoadClass(jni, "org/webrtc/RtpReceiver");
-  LoadClass(jni, "org/webrtc/RtpSender");
-  LoadClass(jni, "org/webrtc/SessionDescription");
-  LoadClass(jni, "org/webrtc/SessionDescription$Type");
-  LoadClass(jni, "org/webrtc/StatsReport");
-  LoadClass(jni, "org/webrtc/StatsReport$Value");
-  LoadClass(jni, "org/webrtc/SurfaceTextureHelper");
-  LoadClass(jni, "org/webrtc/VideoCapturer");
-  LoadClass(jni, "org/webrtc/VideoCodecInfo");
-  LoadClass(jni, "org/webrtc/VideoCodecStatus");
-  LoadClass(jni, "org/webrtc/VideoDecoder$Settings");
-  LoadClass(jni, "org/webrtc/VideoDecoderWrapperCallback");
-  LoadClass(jni, "org/webrtc/VideoEncoder");
-  LoadClass(jni, "org/webrtc/VideoEncoder$BitrateAllocation");
-  LoadClass(jni, "org/webrtc/VideoEncoder$EncodeInfo");
-  LoadClass(jni, "org/webrtc/VideoEncoder$ScalingSettings");
-  LoadClass(jni, "org/webrtc/VideoEncoder$Settings");
-  LoadClass(jni, "org/webrtc/VideoEncoderWrapperCallback");
-  LoadClass(jni, "org/webrtc/VideoFrame");
-  LoadClass(jni, "org/webrtc/VideoFrame$Buffer");
-  LoadClass(jni, "org/webrtc/VideoFrame$I420Buffer");
-  LoadClass(jni, "org/webrtc/VideoFrame$TextureBuffer");
-  LoadClass(jni, "org/webrtc/VideoRenderer$I420Frame");
-  LoadClass(jni, "org/webrtc/VideoSink");
-  LoadClass(jni, "org/webrtc/VideoTrack");
-  LoadClass(jni, "org/webrtc/WrappedNativeI420Buffer");
-}
-
-ClassReferenceHolder::~ClassReferenceHolder() {
-  RTC_CHECK(classes_.empty()) << "Must call FreeReferences() before dtor!";
-}
-
-void ClassReferenceHolder::FreeReferences(JNIEnv* jni) {
-  for (std::map<std::string, jclass>::const_iterator it = classes_.begin();
-      it != classes_.end(); ++it) {
-    jni->DeleteGlobalRef(it->second);
-  }
-  classes_.clear();
-}
-
-jclass ClassReferenceHolder::GetClass(const std::string& name) {
-  std::map<std::string, jclass>::iterator it = classes_.find(name);
-  RTC_CHECK(it != classes_.end()) << "Unexpected GetClass() call for: " << name;
-  return it->second;
-}
-
-void ClassReferenceHolder::LoadClass(JNIEnv* jni, const std::string& name) {
-  jclass localRef = jni->FindClass(name.c_str());
-  CHECK_EXCEPTION(jni) << "error during FindClass: " << name;
-  RTC_CHECK(localRef) << name;
-  jclass globalRef = reinterpret_cast<jclass>(jni->NewGlobalRef(localRef));
-  CHECK_EXCEPTION(jni) << "error during NewGlobalRef: " << name;
-  RTC_CHECK(globalRef) << name;
-  bool inserted = classes_.insert(std::make_pair(name, globalRef)).second;
-  RTC_CHECK(inserted) << "Duplicate class name: " << name;
-}
-
-// Returns a global reference guaranteed to be valid for the lifetime of the
-// process.
-jclass FindClass(JNIEnv* jni, const char* name) {
-  return g_class_reference_holder->GetClass(name);
-}
-
-}  // namespace jni
-}  // namespace webrtc
diff --git a/sdk/android/src/jni/classreferenceholder.h b/sdk/android/src/jni/classreferenceholder.h
deleted file mode 100644
index 646725a..0000000
--- a/sdk/android/src/jni/classreferenceholder.h
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-// Android's FindClass() is trickier than usual because the app-specific
-// ClassLoader is not consulted when there is no app-specific frame on the
-// stack.  Consequently, we only look up all classes once in app/webrtc.
-// http://developer.android.com/training/articles/perf-jni.html#faq_FindClass
-
-#ifndef WEBRTC_SDK_ANDROID_SRC_JNI_CLASSREFERENCEHOLDER_H_
-#define WEBRTC_SDK_ANDROID_SRC_JNI_CLASSREFERENCEHOLDER_H_
-
-#include <jni.h>
-#include <map>
-#include <string>
-
-namespace webrtc {
-namespace jni {
-
-// LoadGlobalClassReferenceHolder must be called in JNI_OnLoad.
-void LoadGlobalClassReferenceHolder();
-// FreeGlobalClassReferenceHolder must be called in JNI_UnLoad.
-void FreeGlobalClassReferenceHolder();
-
-// Returns a global reference guaranteed to be valid for the lifetime of the
-// process.
-jclass FindClass(JNIEnv* jni, const char* name);
-
-}  // namespace jni
-}  // namespace webrtc
-
-// TODO(magjed): Remove once external clients are updated.
-namespace webrtc_jni {
-
-using webrtc::jni::LoadGlobalClassReferenceHolder;
-using webrtc::jni::FreeGlobalClassReferenceHolder;
-
-}  // namespace webrtc_jni
-
-#endif  // WEBRTC_SDK_ANDROID_SRC_JNI_CLASSREFERENCEHOLDER_H_
diff --git a/sdk/android/src/jni/filevideocapturer_jni.cc b/sdk/android/src/jni/filevideocapturer_jni.cc
deleted file mode 100644
index 059dbef..0000000
--- a/sdk/android/src/jni/filevideocapturer_jni.cc
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- *  Copyright 2017 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 <jni.h>
-
-#include "third_party/libyuv/include/libyuv/convert_from.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-
-namespace webrtc {
-namespace jni {
-
-extern "C" JNIEXPORT void JNICALL
-Java_org_webrtc_FileVideoCapturer_nativeI420ToNV21(JNIEnv* jni,
-                                                   jclass,
-                                                   jbyteArray j_src_buffer,
-                                                   jint width,
-                                                   jint height,
-                                                   jbyteArray j_dst_buffer) {
-  size_t src_size = jni->GetArrayLength(j_src_buffer);
-  size_t dst_size = jni->GetArrayLength(j_dst_buffer);
-  int src_stride = width;
-  int dst_stride = width;
-  RTC_CHECK_GE(src_size, src_stride * height * 3 / 2);
-  RTC_CHECK_GE(dst_size, dst_stride * height * 3 / 2);
-
-  jbyte* src_bytes = jni->GetByteArrayElements(j_src_buffer, 0);
-  uint8_t* src = reinterpret_cast<uint8_t*>(src_bytes);
-  jbyte* dst_bytes = jni->GetByteArrayElements(j_dst_buffer, 0);
-  uint8_t* dst = reinterpret_cast<uint8_t*>(dst_bytes);
-
-  uint8_t* src_y = src;
-  size_t src_stride_y = src_stride;
-  uint8_t* src_u = src + src_stride * height;
-  size_t src_stride_u = src_stride / 2;
-  uint8_t* src_v = src + src_stride * height * 5 / 4;
-  size_t src_stride_v = src_stride / 2;
-
-  uint8_t* dst_y = dst;
-  size_t dst_stride_y = dst_stride;
-  size_t dst_stride_uv = dst_stride;
-  uint8_t* dst_uv = dst + dst_stride * height;
-
-  int ret = libyuv::I420ToNV21(src_y, src_stride_y, src_u, src_stride_u, src_v,
-                               src_stride_v, dst_y, dst_stride_y, dst_uv,
-                               dst_stride_uv, width, height);
-  jni->ReleaseByteArrayElements(j_src_buffer, src_bytes, 0);
-  jni->ReleaseByteArrayElements(j_dst_buffer, dst_bytes, 0);
-  if (ret) {
-    LOG(LS_ERROR) << "Error converting I420 frame to NV21: " << ret;
-  }
-}
-
-}  // namespace jni
-}  // namespace webrtc
diff --git a/sdk/android/src/jni/jni_common.cc b/sdk/android/src/jni/jni_common.cc
deleted file mode 100644
index 3a34ba3..0000000
--- a/sdk/android/src/jni/jni_common.cc
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- *  Copyright 2017 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/rtc_base/refcount.h"
-#include "webrtc/sdk/android/src/jni/jni_helpers.h"
-
-namespace webrtc_jni {
-
-JNI_FUNCTION_DECLARATION(void,
-                         JniCommon_nativeAddRef,
-                         JNIEnv* jni,
-                         jclass,
-                         jlong j_native_ref_counted_pointer) {
-  reinterpret_cast<rtc::RefCountInterface*>(j_native_ref_counted_pointer)
-      ->AddRef();
-}
-
-JNI_FUNCTION_DECLARATION(void,
-                         JniCommon_nativeReleaseRef,
-                         JNIEnv* jni,
-                         jclass,
-                         jlong j_native_ref_counted_pointer) {
-  reinterpret_cast<rtc::RefCountInterface*>(j_native_ref_counted_pointer)
-      ->Release();
-}
-
-}  // namespace webrtc_jni
diff --git a/sdk/android/src/jni/jni_helpers.cc b/sdk/android/src/jni/jni_helpers.cc
deleted file mode 100644
index 0384766..0000000
--- a/sdk/android/src/jni/jni_helpers.cc
+++ /dev/null
@@ -1,437 +0,0 @@
-/*
- *  Copyright 2015 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/sdk/android/src/jni/jni_helpers.h"
-
-#include <asm/unistd.h>
-#include <sys/prctl.h>
-#include <sys/syscall.h>
-#include <unistd.h>
-#include <vector>
-
-#include "webrtc/sdk/android/src/jni/classreferenceholder.h"
-
-namespace webrtc {
-namespace jni {
-
-static JavaVM* g_jvm = nullptr;
-
-static pthread_once_t g_jni_ptr_once = PTHREAD_ONCE_INIT;
-
-// Key for per-thread JNIEnv* data.  Non-NULL in threads attached to |g_jvm| by
-// AttachCurrentThreadIfNeeded(), NULL in unattached threads and threads that
-// were attached by the JVM because of a Java->native call.
-static pthread_key_t g_jni_ptr;
-
-JavaVM *GetJVM() {
-  RTC_CHECK(g_jvm) << "JNI_OnLoad failed to run?";
-  return g_jvm;
-}
-
-// Return a |JNIEnv*| usable on this thread or NULL if this thread is detached.
-JNIEnv* GetEnv() {
-  void* env = nullptr;
-  jint status = g_jvm->GetEnv(&env, JNI_VERSION_1_6);
-  RTC_CHECK(((env != nullptr) && (status == JNI_OK)) ||
-            ((env == nullptr) && (status == JNI_EDETACHED)))
-      << "Unexpected GetEnv return: " << status << ":" << env;
-  return reinterpret_cast<JNIEnv*>(env);
-}
-
-static void ThreadDestructor(void* prev_jni_ptr) {
-  // This function only runs on threads where |g_jni_ptr| is non-NULL, meaning
-  // we were responsible for originally attaching the thread, so are responsible
-  // for detaching it now.  However, because some JVM implementations (notably
-  // Oracle's http://goo.gl/eHApYT) also use the pthread_key_create mechanism,
-  // the JVMs accounting info for this thread may already be wiped out by the
-  // time this is called. Thus it may appear we are already detached even though
-  // it was our responsibility to detach!  Oh well.
-  if (!GetEnv())
-    return;
-
-  RTC_CHECK(GetEnv() == prev_jni_ptr)
-      << "Detaching from another thread: " << prev_jni_ptr << ":" << GetEnv();
-  jint status = g_jvm->DetachCurrentThread();
-  RTC_CHECK(status == JNI_OK) << "Failed to detach thread: " << status;
-  RTC_CHECK(!GetEnv()) << "Detaching was a successful no-op???";
-}
-
-static void CreateJNIPtrKey() {
-  RTC_CHECK(!pthread_key_create(&g_jni_ptr, &ThreadDestructor))
-      << "pthread_key_create";
-}
-
-jint InitGlobalJniVariables(JavaVM *jvm) {
-  RTC_CHECK(!g_jvm) << "InitGlobalJniVariables!";
-  g_jvm = jvm;
-  RTC_CHECK(g_jvm) << "InitGlobalJniVariables handed NULL?";
-
-  RTC_CHECK(!pthread_once(&g_jni_ptr_once, &CreateJNIPtrKey)) << "pthread_once";
-
-  JNIEnv* jni = nullptr;
-  if (jvm->GetEnv(reinterpret_cast<void**>(&jni), JNI_VERSION_1_6) != JNI_OK)
-    return -1;
-
-  return JNI_VERSION_1_6;
-}
-
-// Return thread ID as a string.
-static std::string GetThreadId() {
-  char buf[21];  // Big enough to hold a kuint64max plus terminating NULL.
-  RTC_CHECK_LT(snprintf(buf, sizeof(buf), "%ld",
-                        static_cast<long>(syscall(__NR_gettid))),
-               sizeof(buf))
-      << "Thread id is bigger than uint64??";
-  return std::string(buf);
-}
-
-// Return the current thread's name.
-static std::string GetThreadName() {
-  char name[17] = {0};
-  if (prctl(PR_GET_NAME, name) != 0)
-    return std::string("<noname>");
-  return std::string(name);
-}
-
-// Return a |JNIEnv*| usable on this thread.  Attaches to |g_jvm| if necessary.
-JNIEnv* AttachCurrentThreadIfNeeded() {
-  JNIEnv* jni = GetEnv();
-  if (jni)
-    return jni;
-  RTC_CHECK(!pthread_getspecific(g_jni_ptr))
-      << "TLS has a JNIEnv* but not attached?";
-
-  std::string name(GetThreadName() + " - " + GetThreadId());
-  JavaVMAttachArgs args;
-  args.version = JNI_VERSION_1_6;
-  args.name = &name[0];
-  args.group = nullptr;
-  // Deal with difference in signatures between Oracle's jni.h and Android's.
-#ifdef _JAVASOFT_JNI_H_  // Oracle's jni.h violates the JNI spec!
-  void* env = nullptr;
-#else
-  JNIEnv* env = nullptr;
-#endif
-  RTC_CHECK(!g_jvm->AttachCurrentThread(&env, &args))
-      << "Failed to attach thread";
-  RTC_CHECK(env) << "AttachCurrentThread handed back NULL!";
-  jni = reinterpret_cast<JNIEnv*>(env);
-  RTC_CHECK(!pthread_setspecific(g_jni_ptr, jni)) << "pthread_setspecific";
-  return jni;
-}
-
-// Return a |jlong| that will correctly convert back to |ptr|.  This is needed
-// because the alternative (of silently passing a 32-bit pointer to a vararg
-// function expecting a 64-bit param) picks up garbage in the high 32 bits.
-jlong jlongFromPointer(void* ptr) {
-  static_assert(sizeof(intptr_t) <= sizeof(jlong),
-                "Time to rethink the use of jlongs");
-  // Going through intptr_t to be obvious about the definedness of the
-  // conversion from pointer to integral type.  intptr_t to jlong is a standard
-  // widening by the static_assert above.
-  jlong ret = reinterpret_cast<intptr_t>(ptr);
-  RTC_DCHECK(reinterpret_cast<void*>(ret) == ptr);
-  return ret;
-}
-
-// JNIEnv-helper methods that RTC_CHECK success: no Java exception thrown and
-// found object/class/method/field is non-null.
-jmethodID GetMethodID(
-    JNIEnv* jni, jclass c, const std::string& name, const char* signature) {
-  jmethodID m = jni->GetMethodID(c, name.c_str(), signature);
-  CHECK_EXCEPTION(jni) << "error during GetMethodID: " << name << ", "
-                       << signature;
-  RTC_CHECK(m) << name << ", " << signature;
-  return m;
-}
-
-jmethodID GetStaticMethodID(
-    JNIEnv* jni, jclass c, const char* name, const char* signature) {
-  jmethodID m = jni->GetStaticMethodID(c, name, signature);
-  CHECK_EXCEPTION(jni) << "error during GetStaticMethodID: " << name << ", "
-                       << signature;
-  RTC_CHECK(m) << name << ", " << signature;
-  return m;
-}
-
-jfieldID GetFieldID(
-    JNIEnv* jni, jclass c, const char* name, const char* signature) {
-  jfieldID f = jni->GetFieldID(c, name, signature);
-  CHECK_EXCEPTION(jni) << "error during GetFieldID";
-  RTC_CHECK(f) << name << ", " << signature;
-  return f;
-}
-
-jfieldID GetStaticFieldID(JNIEnv* jni,
-                          jclass c,
-                          const char* name,
-                          const char* signature) {
-  jfieldID f = jni->GetStaticFieldID(c, name, signature);
-  CHECK_EXCEPTION(jni) << "error during GetStaticFieldID";
-  RTC_CHECK(f) << name << ", " << signature;
-  return f;
-}
-
-jclass GetObjectClass(JNIEnv* jni, jobject object) {
-  jclass c = jni->GetObjectClass(object);
-  CHECK_EXCEPTION(jni) << "error during GetObjectClass";
-  RTC_CHECK(c) << "GetObjectClass returned NULL";
-  return c;
-}
-
-jobject GetObjectField(JNIEnv* jni, jobject object, jfieldID id) {
-  jobject o = jni->GetObjectField(object, id);
-  CHECK_EXCEPTION(jni) << "error during GetObjectField";
-  RTC_CHECK(!IsNull(jni, o)) << "GetObjectField returned NULL";
-  return o;
-}
-
-jobject GetStaticObjectField(JNIEnv* jni, jclass c, jfieldID id) {
-  jobject o = jni->GetStaticObjectField(c, id);
-  CHECK_EXCEPTION(jni) << "error during GetStaticObjectField";
-  RTC_CHECK(!IsNull(jni, o)) << "GetStaticObjectField returned NULL";
-  return o;
-}
-
-jobject GetNullableObjectField(JNIEnv* jni, jobject object, jfieldID id) {
-  jobject o = jni->GetObjectField(object, id);
-  CHECK_EXCEPTION(jni) << "error during GetObjectField";
-  return o;
-}
-
-jstring GetStringField(JNIEnv* jni, jobject object, jfieldID id) {
-  return static_cast<jstring>(GetObjectField(jni, object, id));
-}
-
-jlong GetLongField(JNIEnv* jni, jobject object, jfieldID id) {
-  jlong l = jni->GetLongField(object, id);
-  CHECK_EXCEPTION(jni) << "error during GetLongField";
-  return l;
-}
-
-jint GetIntField(JNIEnv* jni, jobject object, jfieldID id) {
-  jint i = jni->GetIntField(object, id);
-  CHECK_EXCEPTION(jni) << "error during GetIntField";
-  return i;
-}
-
-bool GetBooleanField(JNIEnv* jni, jobject object, jfieldID id) {
-  jboolean b = jni->GetBooleanField(object, id);
-  CHECK_EXCEPTION(jni) << "error during GetBooleanField";
-  return b;
-}
-
-bool IsNull(JNIEnv* jni, jobject obj) {
-  return jni->IsSameObject(obj, nullptr);
-}
-
-// Given a UTF-8 encoded |native| string return a new (UTF-16) jstring.
-jstring JavaStringFromStdString(JNIEnv* jni, const std::string& native) {
-  jstring jstr = jni->NewStringUTF(native.c_str());
-  CHECK_EXCEPTION(jni) << "error during NewStringUTF";
-  return jstr;
-}
-
-// Given a jstring, reinterprets it to a new native string.
-std::string JavaToStdString(JNIEnv* jni, const jstring& j_string) {
-  // Invoke String.getBytes(String charsetName) method to convert |j_string|
-  // to a byte array.
-  const jclass string_class = GetObjectClass(jni, j_string);
-  const jmethodID get_bytes =
-      GetMethodID(jni, string_class, "getBytes", "(Ljava/lang/String;)[B");
-  const jstring charset_name = jni->NewStringUTF("ISO-8859-1");
-  CHECK_EXCEPTION(jni) << "error during NewStringUTF";
-  const jbyteArray j_byte_array =
-      (jbyteArray)jni->CallObjectMethod(j_string, get_bytes, charset_name);
-  CHECK_EXCEPTION(jni) << "error during CallObjectMethod";
-
-  const size_t len = jni->GetArrayLength(j_byte_array);
-  CHECK_EXCEPTION(jni) << "error during GetArrayLength";
-  std::vector<char> buf(len);
-  jni->GetByteArrayRegion(j_byte_array, 0, len,
-                          reinterpret_cast<jbyte*>(&buf[0]));
-  CHECK_EXCEPTION(jni) << "error during GetByteArrayRegion";
-
-  return std::string(buf.begin(), buf.end());
-}
-
-// Given a list of jstrings, reinterprets it to a new vector of native strings.
-std::vector<std::string> JavaToStdVectorStrings(JNIEnv* jni, jobject list) {
-  std::vector<std::string> converted_list;
-  if (list != nullptr) {
-    for (jobject str : Iterable(jni, list)) {
-      converted_list.push_back(
-          JavaToStdString(jni, reinterpret_cast<jstring>(str)));
-    }
-  }
-  return converted_list;
-}
-
-// Return the (singleton) Java Enum object corresponding to |index|;
-jobject JavaEnumFromIndex(JNIEnv* jni, jclass state_class,
-                          const std::string& state_class_name, int index) {
-  jmethodID state_values_id = GetStaticMethodID(
-      jni, state_class, "values", ("()[L" + state_class_name  + ";").c_str());
-  jobjectArray state_values = static_cast<jobjectArray>(
-      jni->CallStaticObjectMethod(state_class, state_values_id));
-  CHECK_EXCEPTION(jni) << "error during CallStaticObjectMethod";
-  jobject ret = jni->GetObjectArrayElement(state_values, index);
-  CHECK_EXCEPTION(jni) << "error during GetObjectArrayElement";
-  return ret;
-}
-
-jobject JavaEnumFromIndexAndClassName(JNIEnv* jni,
-                                      const std::string& state_class_fragment,
-                                      int index) {
-  const std::string state_class = "org/webrtc/" + state_class_fragment;
-  return JavaEnumFromIndex(jni, FindClass(jni, state_class.c_str()),
-                           state_class, index);
-}
-
-std::string GetJavaEnumName(JNIEnv* jni,
-                            const std::string& className,
-                            jobject j_enum) {
-  jclass enumClass = FindClass(jni, className.c_str());
-  jmethodID nameMethod =
-      GetMethodID(jni, enumClass, "name", "()Ljava/lang/String;");
-  jstring name =
-      reinterpret_cast<jstring>(jni->CallObjectMethod(j_enum, nameMethod));
-  CHECK_EXCEPTION(jni) << "error during CallObjectMethod for " << className
-                       << ".name";
-  return JavaToStdString(jni, name);
-}
-
-std::map<std::string, std::string> JavaToStdMapStrings(JNIEnv* jni,
-                                                       jobject j_map) {
-  jclass map_class = jni->FindClass("java/util/Map");
-  jclass set_class = jni->FindClass("java/util/Set");
-  jclass iterator_class = jni->FindClass("java/util/Iterator");
-  jclass entry_class = jni->FindClass("java/util/Map$Entry");
-  jmethodID entry_set_method =
-      jni->GetMethodID(map_class, "entrySet", "()Ljava/util/Set;");
-  jmethodID iterator_method =
-      jni->GetMethodID(set_class, "iterator", "()Ljava/util/Iterator;");
-  jmethodID has_next_method =
-      jni->GetMethodID(iterator_class, "hasNext", "()Z");
-  jmethodID next_method =
-      jni->GetMethodID(iterator_class, "next", "()Ljava/lang/Object;");
-  jmethodID get_key_method =
-      jni->GetMethodID(entry_class, "getKey", "()Ljava/lang/Object;");
-  jmethodID get_value_method =
-      jni->GetMethodID(entry_class, "getValue", "()Ljava/lang/Object;");
-
-  jobject j_entry_set = jni->CallObjectMethod(j_map, entry_set_method);
-  jobject j_iterator = jni->CallObjectMethod(j_entry_set, iterator_method);
-
-  std::map<std::string, std::string> result;
-  while (jni->CallBooleanMethod(j_iterator, has_next_method)) {
-    jobject j_entry = jni->CallObjectMethod(j_iterator, next_method);
-    jstring j_key =
-        static_cast<jstring>(jni->CallObjectMethod(j_entry, get_key_method));
-    jstring j_value =
-        static_cast<jstring>(jni->CallObjectMethod(j_entry, get_value_method));
-    result[JavaToStdString(jni, j_key)] = JavaToStdString(jni, j_value);
-  }
-
-  return result;
-}
-
-jobject NewGlobalRef(JNIEnv* jni, jobject o) {
-  jobject ret = jni->NewGlobalRef(o);
-  CHECK_EXCEPTION(jni) << "error during NewGlobalRef";
-  RTC_CHECK(ret);
-  return ret;
-}
-
-void DeleteGlobalRef(JNIEnv* jni, jobject o) {
-  jni->DeleteGlobalRef(o);
-  CHECK_EXCEPTION(jni) << "error during DeleteGlobalRef";
-}
-
-// Scope Java local references to the lifetime of this object.  Use in all C++
-// callbacks (i.e. entry points that don't originate in a Java callstack
-// through a "native" method call).
-ScopedLocalRefFrame::ScopedLocalRefFrame(JNIEnv* jni) : jni_(jni) {
-  RTC_CHECK(!jni_->PushLocalFrame(0)) << "Failed to PushLocalFrame";
-}
-ScopedLocalRefFrame::~ScopedLocalRefFrame() {
-  jni_->PopLocalFrame(nullptr);
-}
-
-// Creates an iterator representing the end of any collection.
-Iterable::Iterator::Iterator() : iterator_(nullptr) {}
-
-// Creates an iterator pointing to the beginning of the specified collection.
-Iterable::Iterator::Iterator(JNIEnv* jni, jobject iterable) : jni_(jni) {
-  jclass j_class = GetObjectClass(jni, iterable);
-  jmethodID iterator_id =
-      GetMethodID(jni, j_class, "iterator", "()Ljava/util/Iterator;");
-  iterator_ = jni->CallObjectMethod(iterable, iterator_id);
-  CHECK_EXCEPTION(jni) << "error during CallObjectMethod";
-  RTC_CHECK(iterator_ != nullptr);
-
-  jclass iterator_class = GetObjectClass(jni, iterator_);
-  has_next_id_ = GetMethodID(jni, iterator_class, "hasNext", "()Z");
-  next_id_ = GetMethodID(jni, iterator_class, "next", "()Ljava/lang/Object;");
-
-  // Start at the first element in the collection.
-  ++(*this);
-}
-
-// Move constructor - necessary to be able to return iterator types from
-// functions.
-Iterable::Iterator::Iterator(Iterator&& other)
-    : jni_(std::move(other.jni_)),
-      iterator_(std::move(other.iterator_)),
-      value_(std::move(other.value_)),
-      has_next_id_(std::move(other.has_next_id_)),
-      next_id_(std::move(other.next_id_)),
-      thread_checker_(std::move(other.thread_checker_)){};
-
-// Advances the iterator one step.
-Iterable::Iterator& Iterable::Iterator::operator++() {
-  RTC_CHECK(thread_checker_.CalledOnValidThread());
-  if (AtEnd()) {
-    // Can't move past the end.
-    return *this;
-  }
-  bool has_next = jni_->CallBooleanMethod(iterator_, has_next_id_);
-  CHECK_EXCEPTION(jni_) << "error during CallBooleanMethod";
-  if (!has_next) {
-    iterator_ = nullptr;
-    value_ = nullptr;
-    return *this;
-  }
-
-  value_ = jni_->CallObjectMethod(iterator_, next_id_);
-  CHECK_EXCEPTION(jni_) << "error during CallObjectMethod";
-  return *this;
-}
-
-// Provides a way to compare the iterator with itself and with the end iterator.
-// Note: all other comparison results are undefined, just like for C++ input
-// iterators.
-bool Iterable::Iterator::operator==(const Iterable::Iterator& other) {
-  // Two different active iterators should never be compared.
-  RTC_DCHECK(this == &other || AtEnd() || other.AtEnd());
-  return AtEnd() == other.AtEnd();
-}
-
-jobject Iterable::Iterator::operator*() {
-  RTC_CHECK(!AtEnd());
-  return value_;
-}
-
-bool Iterable::Iterator::AtEnd() const {
-  RTC_CHECK(thread_checker_.CalledOnValidThread());
-  return jni_ == nullptr || IsNull(jni_, iterator_);
-}
-
-}  // namespace jni
-}  // namespace webrtc
diff --git a/sdk/android/src/jni/jni_helpers.h b/sdk/android/src/jni/jni_helpers.h
deleted file mode 100644
index 83f2155..0000000
--- a/sdk/android/src/jni/jni_helpers.h
+++ /dev/null
@@ -1,229 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-// This file contain convenience functions and classes for JNI.
-// Before using any of the methods, InitGlobalJniVariables must be called.
-
-#ifndef WEBRTC_SDK_ANDROID_SRC_JNI_JNI_HELPERS_H_
-#define WEBRTC_SDK_ANDROID_SRC_JNI_JNI_HELPERS_H_
-
-#include <jni.h>
-#include <map>
-#include <string>
-#include <vector>
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/thread_checker.h"
-
-// Abort the process if |jni| has a Java exception pending.
-// This macros uses the comma operator to execute ExceptionDescribe
-// and ExceptionClear ignoring their return values and sending ""
-// to the error stream.
-#define CHECK_EXCEPTION(jni)        \
-  RTC_CHECK(!jni->ExceptionCheck()) \
-      << (jni->ExceptionDescribe(), jni->ExceptionClear(), "")
-
-// Helper that calls ptr->Release() and aborts the process with a useful
-// message if that didn't actually delete *ptr because of extra refcounts.
-#define CHECK_RELEASE(ptr) \
-  RTC_CHECK_EQ(0, (ptr)->Release()) << "Unexpected refcount."
-
-// Convenience macro defining JNI-accessible methods in the org.webrtc package.
-// Eliminates unnecessary boilerplate and line-wraps, reducing visual clutter.
-#define JNI_FUNCTION_DECLARATION(rettype, name, ...) \
-  extern "C" JNIEXPORT rettype JNICALL Java_org_webrtc_##name(__VA_ARGS__)
-
-namespace webrtc {
-namespace jni {
-
-jint InitGlobalJniVariables(JavaVM *jvm);
-
-// Return a |JNIEnv*| usable on this thread or NULL if this thread is detached.
-JNIEnv* GetEnv();
-
-JavaVM *GetJVM();
-
-// Return a |JNIEnv*| usable on this thread.  Attaches to |g_jvm| if necessary.
-JNIEnv* AttachCurrentThreadIfNeeded();
-
-// Return a |jlong| that will correctly convert back to |ptr|.  This is needed
-// because the alternative (of silently passing a 32-bit pointer to a vararg
-// function expecting a 64-bit param) picks up garbage in the high 32 bits.
-jlong jlongFromPointer(void* ptr);
-
-// JNIEnv-helper methods that RTC_CHECK success: no Java exception thrown and
-// found object/class/method/field is non-null.
-jmethodID GetMethodID(
-    JNIEnv* jni, jclass c, const std::string& name, const char* signature);
-
-jmethodID GetStaticMethodID(
-    JNIEnv* jni, jclass c, const char* name, const char* signature);
-
-jfieldID GetFieldID(JNIEnv* jni, jclass c, const char* name,
-                    const char* signature);
-
-jfieldID GetStaticFieldID(JNIEnv* jni,
-                          jclass c,
-                          const char* name,
-                          const char* signature);
-
-jclass GetObjectClass(JNIEnv* jni, jobject object);
-
-// Throws an exception if the object field is null.
-jobject GetObjectField(JNIEnv* jni, jobject object, jfieldID id);
-
-jobject GetStaticObjectField(JNIEnv* jni, jclass c, jfieldID id);
-
-jobject GetNullableObjectField(JNIEnv* jni, jobject object, jfieldID id);
-
-jstring GetStringField(JNIEnv* jni, jobject object, jfieldID id);
-
-jlong GetLongField(JNIEnv* jni, jobject object, jfieldID id);
-
-jint GetIntField(JNIEnv* jni, jobject object, jfieldID id);
-
-bool GetBooleanField(JNIEnv* jni, jobject object, jfieldID id);
-
-// Returns true if |obj| == null in Java.
-bool IsNull(JNIEnv* jni, jobject obj);
-
-// Given a UTF-8 encoded |native| string return a new (UTF-16) jstring.
-jstring JavaStringFromStdString(JNIEnv* jni, const std::string& native);
-
-// Given a (UTF-16) jstring return a new UTF-8 native string.
-std::string JavaToStdString(JNIEnv* jni, const jstring& j_string);
-
-// Given a List of (UTF-16) jstrings
-// return a new vector of UTF-8 native strings.
-std::vector<std::string> JavaToStdVectorStrings(JNIEnv* jni, jobject list);
-
-// Return the (singleton) Java Enum object corresponding to |index|;
-jobject JavaEnumFromIndex(JNIEnv* jni, jclass state_class,
-                          const std::string& state_class_name, int index);
-
-// Return the (singleton) Java Enum object corresponding to |index|;
-// |state_class_fragment| is something like "MediaSource$State".
-jobject JavaEnumFromIndexAndClassName(JNIEnv* jni,
-                                      const std::string& state_class_fragment,
-                                      int index);
-
-// Parses Map<String, String> to std::map<std::string, std::string>.
-std::map<std::string, std::string> JavaToStdMapStrings(JNIEnv* jni,
-                                                       jobject j_map);
-
-// Returns the name of a Java enum.
-std::string GetJavaEnumName(JNIEnv* jni,
-                            const std::string& className,
-                            jobject j_enum);
-
-jobject NewGlobalRef(JNIEnv* jni, jobject o);
-
-void DeleteGlobalRef(JNIEnv* jni, jobject o);
-
-// Scope Java local references to the lifetime of this object.  Use in all C++
-// callbacks (i.e. entry points that don't originate in a Java callstack
-// through a "native" method call).
-class ScopedLocalRefFrame {
- public:
-  explicit ScopedLocalRefFrame(JNIEnv* jni);
-  ~ScopedLocalRefFrame();
-
- private:
-  JNIEnv* jni_;
-};
-
-// Scoped holder for global Java refs.
-template<class T>  // T is jclass, jobject, jintArray, etc.
-class ScopedGlobalRef {
- public:
-  ScopedGlobalRef(JNIEnv* jni, T obj)
-      : obj_(static_cast<T>(jni->NewGlobalRef(obj))) {}
-  ~ScopedGlobalRef() {
-    DeleteGlobalRef(AttachCurrentThreadIfNeeded(), obj_);
-  }
-  T operator*() const {
-    return obj_;
-  }
- private:
-  T obj_;
-};
-
-// Provides a convenient way to iterate over a Java Iterable using the
-// C++ range-for loop.
-// E.g. for (jobject value : Iterable(jni, j_iterable)) { ... }
-// Note: Since Java iterators cannot be duplicated, the iterator class is not
-// copyable to prevent creating multiple C++ iterators that refer to the same
-// Java iterator.
-class Iterable {
- public:
-  Iterable(JNIEnv* jni, jobject iterable) : jni_(jni), iterable_(iterable) {}
-
-  class Iterator {
-   public:
-    // Creates an iterator representing the end of any collection.
-    Iterator();
-    // Creates an iterator pointing to the beginning of the specified
-    // collection.
-    Iterator(JNIEnv* jni, jobject iterable);
-
-    // Move constructor - necessary to be able to return iterator types from
-    // functions.
-    Iterator(Iterator&& other);
-
-    // Move assignment should not be used.
-    Iterator& operator=(Iterator&&) = delete;
-
-    // Advances the iterator one step.
-    Iterator& operator++();
-
-    // Provides a way to compare the iterator with itself and with the end
-    // iterator.
-    // Note: all other comparison results are undefined, just like for C++ input
-    // iterators.
-    bool operator==(const Iterator& other);
-    bool operator!=(const Iterator& other) { return !(*this == other); }
-    jobject operator*();
-
-   private:
-    bool AtEnd() const;
-
-    JNIEnv* jni_ = nullptr;
-    jobject iterator_ = nullptr;
-    jobject value_ = nullptr;
-    jmethodID has_next_id_ = nullptr;
-    jmethodID next_id_ = nullptr;
-    rtc::ThreadChecker thread_checker_;
-
-    RTC_DISALLOW_COPY_AND_ASSIGN(Iterator);
-  };
-
-  Iterable::Iterator begin() { return Iterable::Iterator(jni_, iterable_); }
-  Iterable::Iterator end() { return Iterable::Iterator(); }
-
- private:
-  JNIEnv* jni_;
-  jobject iterable_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(Iterable);
-};
-
-}  // namespace jni
-}  // namespace webrtc
-
-// TODO(magjed): Remove once external clients are updated.
-namespace webrtc_jni {
-
-using webrtc::jni::AttachCurrentThreadIfNeeded;
-using webrtc::jni::InitGlobalJniVariables;
-
-}  // namespace webrtc_jni
-
-#endif  // WEBRTC_SDK_ANDROID_SRC_JNI_JNI_HELPERS_H_
diff --git a/sdk/android/src/jni/jni_onload.cc b/sdk/android/src/jni/jni_onload.cc
deleted file mode 100644
index 8794c12..0000000
--- a/sdk/android/src/jni/jni_onload.cc
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- *  Copyright 2015 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 <jni.h>
-#undef JNIEXPORT
-#define JNIEXPORT __attribute__((visibility("default")))
-
-#include "webrtc/rtc_base/ssladapter.h"
-#include "webrtc/sdk/android/src/jni/classreferenceholder.h"
-#include "webrtc/sdk/android/src/jni/jni_helpers.h"
-
-namespace webrtc {
-namespace jni {
-
-extern "C" jint JNIEXPORT JNICALL JNI_OnLoad(JavaVM *jvm, void *reserved) {
-  jint ret = InitGlobalJniVariables(jvm);
-  RTC_DCHECK_GE(ret, 0);
-  if (ret < 0)
-    return -1;
-
-  RTC_CHECK(rtc::InitializeSSL()) << "Failed to InitializeSSL()";
-  LoadGlobalClassReferenceHolder();
-
-  return ret;
-}
-
-extern "C" void JNIEXPORT JNICALL JNI_OnUnLoad(JavaVM *jvm, void *reserved) {
-  FreeGlobalClassReferenceHolder();
-  RTC_CHECK(rtc::CleanupSSL()) << "Failed to CleanupSSL()";
-}
-
-}  // namespace jni
-}  // namespace webrtc
diff --git a/sdk/android/src/jni/native_handle_impl.cc b/sdk/android/src/jni/native_handle_impl.cc
deleted file mode 100644
index 910235c..0000000
--- a/sdk/android/src/jni/native_handle_impl.cc
+++ /dev/null
@@ -1,512 +0,0 @@
-/*
- *  Copyright 2015 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/sdk/android/src/jni/native_handle_impl.h"
-
-#include <memory>
-
-#include "webrtc/common_video/include/video_frame_buffer.h"
-#include "webrtc/rtc_base/bind.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/keep_ref_until_done.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/scoped_ref_ptr.h"
-#include "webrtc/rtc_base/timeutils.h"
-#include "webrtc/sdk/android/src/jni/classreferenceholder.h"
-#include "webrtc/sdk/android/src/jni/jni_helpers.h"
-#include "webrtc/sdk/android/src/jni/wrapped_native_i420_buffer.h"
-#include "webrtc/system_wrappers/include/aligned_malloc.h"
-
-namespace webrtc {
-namespace jni {
-
-namespace {
-
-class AndroidVideoI420Buffer : public I420BufferInterface {
- public:
-  // Wraps an existing reference to a Java VideoBuffer. Retain will not be
-  // called but release will be called when the C++ object is destroyed.
-  static rtc::scoped_refptr<AndroidVideoI420Buffer> WrapReference(
-      JNIEnv* jni,
-      jmethodID j_release_id,
-      int width,
-      int height,
-      jobject j_video_frame_buffer);
-
- protected:
-  AndroidVideoI420Buffer(JNIEnv* jni,
-                         jmethodID j_retain_id,
-                         jmethodID j_release_id,
-                         int width,
-                         int height,
-                         jobject j_video_frame_buffer);
-  // Should not be called directly. Wraps a reference. Use
-  // AndroidVideoI420Buffer::WrapReference instead for clarity.
-  AndroidVideoI420Buffer(JNIEnv* jni,
-                         jmethodID j_release_id,
-                         int width,
-                         int height,
-                         jobject j_video_frame_buffer);
-  ~AndroidVideoI420Buffer();
-
- private:
-  const uint8_t* DataY() const override { return data_y_; }
-  const uint8_t* DataU() const override { return data_u_; }
-  const uint8_t* DataV() const override { return data_v_; }
-
-  int StrideY() const override { return stride_y_; }
-  int StrideU() const override { return stride_u_; }
-  int StrideV() const override { return stride_v_; }
-
-  int width() const override { return width_; }
-  int height() const override { return height_; }
-
-  const jmethodID j_release_id_;
-  const int width_;
-  const int height_;
-  // Holds a VideoFrame.I420Buffer.
-  const ScopedGlobalRef<jobject> j_video_frame_buffer_;
-
-  const uint8_t* data_y_;
-  const uint8_t* data_u_;
-  const uint8_t* data_v_;
-  int stride_y_;
-  int stride_u_;
-  int stride_v_;
-};
-
-rtc::scoped_refptr<AndroidVideoI420Buffer>
-AndroidVideoI420Buffer::WrapReference(JNIEnv* jni,
-                                      jmethodID j_release_id,
-                                      int width,
-                                      int height,
-                                      jobject j_video_frame_buffer) {
-  return new rtc::RefCountedObject<AndroidVideoI420Buffer>(
-      jni, j_release_id, width, height, j_video_frame_buffer);
-}
-
-AndroidVideoI420Buffer::AndroidVideoI420Buffer(JNIEnv* jni,
-                                               jmethodID j_retain_id,
-                                               jmethodID j_release_id,
-                                               int width,
-                                               int height,
-                                               jobject j_video_frame_buffer)
-    : AndroidVideoI420Buffer(jni,
-                             j_release_id,
-                             width,
-                             height,
-                             j_video_frame_buffer) {
-  jni->CallVoidMethod(j_video_frame_buffer, j_retain_id);
-}
-
-AndroidVideoI420Buffer::AndroidVideoI420Buffer(JNIEnv* jni,
-                                               jmethodID j_release_id,
-                                               int width,
-                                               int height,
-                                               jobject j_video_frame_buffer)
-    : j_release_id_(j_release_id),
-      width_(width),
-      height_(height),
-      j_video_frame_buffer_(jni, j_video_frame_buffer) {
-  jclass j_video_frame_i420_buffer_class =
-      FindClass(jni, "org/webrtc/VideoFrame$I420Buffer");
-  jmethodID j_get_data_y_id = jni->GetMethodID(
-      j_video_frame_i420_buffer_class, "getDataY", "()Ljava/nio/ByteBuffer;");
-  jmethodID j_get_data_u_id = jni->GetMethodID(
-      j_video_frame_i420_buffer_class, "getDataU", "()Ljava/nio/ByteBuffer;");
-  jmethodID j_get_data_v_id = jni->GetMethodID(
-      j_video_frame_i420_buffer_class, "getDataV", "()Ljava/nio/ByteBuffer;");
-  jmethodID j_get_stride_y_id =
-      jni->GetMethodID(j_video_frame_i420_buffer_class, "getStrideY", "()I");
-  jmethodID j_get_stride_u_id =
-      jni->GetMethodID(j_video_frame_i420_buffer_class, "getStrideU", "()I");
-  jmethodID j_get_stride_v_id =
-      jni->GetMethodID(j_video_frame_i420_buffer_class, "getStrideV", "()I");
-
-  jobject j_data_y =
-      jni->CallObjectMethod(j_video_frame_buffer, j_get_data_y_id);
-  jobject j_data_u =
-      jni->CallObjectMethod(j_video_frame_buffer, j_get_data_u_id);
-  jobject j_data_v =
-      jni->CallObjectMethod(j_video_frame_buffer, j_get_data_v_id);
-
-  data_y_ = static_cast<const uint8_t*>(jni->GetDirectBufferAddress(j_data_y));
-  data_u_ = static_cast<const uint8_t*>(jni->GetDirectBufferAddress(j_data_u));
-  data_v_ = static_cast<const uint8_t*>(jni->GetDirectBufferAddress(j_data_v));
-
-  stride_y_ = jni->CallIntMethod(j_video_frame_buffer, j_get_stride_y_id);
-  stride_u_ = jni->CallIntMethod(j_video_frame_buffer, j_get_stride_u_id);
-  stride_v_ = jni->CallIntMethod(j_video_frame_buffer, j_get_stride_v_id);
-}
-
-AndroidVideoI420Buffer::~AndroidVideoI420Buffer() {
-  JNIEnv* jni = AttachCurrentThreadIfNeeded();
-  jni->CallVoidMethod(*j_video_frame_buffer_, j_release_id_);
-}
-
-}  // namespace
-
-Matrix::Matrix(JNIEnv* jni, jfloatArray a) {
-  RTC_CHECK_EQ(16, jni->GetArrayLength(a));
-  jfloat* ptr = jni->GetFloatArrayElements(a, nullptr);
-  for (int i = 0; i < 16; ++i) {
-    elem_[i] = ptr[i];
-  }
-  jni->ReleaseFloatArrayElements(a, ptr, 0);
-}
-
-jfloatArray Matrix::ToJava(JNIEnv* jni) const {
-  jfloatArray matrix = jni->NewFloatArray(16);
-  jni->SetFloatArrayRegion(matrix, 0, 16, elem_);
-  return matrix;
-}
-
-void Matrix::Rotate(VideoRotation rotation) {
-  // Texture coordinates are in the range 0 to 1. The transformation of the last
-  // row in each rotation matrix is needed for proper translation, e.g, to
-  // mirror x, we don't replace x by -x, but by 1-x.
-  switch (rotation) {
-    case kVideoRotation_0:
-      break;
-    case kVideoRotation_90: {
-      const float ROTATE_90[16] =
-          { elem_[4], elem_[5], elem_[6], elem_[7],
-            -elem_[0], -elem_[1], -elem_[2], -elem_[3],
-            elem_[8], elem_[9], elem_[10], elem_[11],
-            elem_[0] + elem_[12], elem_[1] + elem_[13],
-            elem_[2] + elem_[14], elem_[3] + elem_[15]};
-      memcpy(elem_, ROTATE_90, sizeof(elem_));
-    } break;
-    case kVideoRotation_180: {
-      const float ROTATE_180[16] =
-          { -elem_[0], -elem_[1], -elem_[2], -elem_[3],
-            -elem_[4], -elem_[5], -elem_[6], -elem_[7],
-            elem_[8], elem_[9], elem_[10], elem_[11],
-            elem_[0] + elem_[4] + elem_[12], elem_[1] + elem_[5] + elem_[13],
-            elem_[2] + elem_[6] + elem_[14], elem_[3] + elem_[11]+ elem_[15]};
-        memcpy(elem_, ROTATE_180, sizeof(elem_));
-    } break;
-    case kVideoRotation_270: {
-      const float ROTATE_270[16] =
-          { -elem_[4], -elem_[5], -elem_[6], -elem_[7],
-            elem_[0], elem_[1], elem_[2], elem_[3],
-            elem_[8], elem_[9], elem_[10], elem_[11],
-            elem_[4] + elem_[12], elem_[5] + elem_[13],
-            elem_[6] + elem_[14], elem_[7] + elem_[15]};
-      memcpy(elem_, ROTATE_270, sizeof(elem_));
-    } break;
-  }
-}
-
-// Calculates result = a * b, in column-major order.
-void Matrix::Multiply(const float a[16], const float b[16], float result[16]) {
-  for (int i = 0; i < 4; ++i) {
-    for (int j = 0; j < 4; ++j) {
-      float sum = 0;
-      for (int k = 0; k < 4; ++k) {
-        sum += a[k * 4 + j] * b[i * 4 + k];
-      }
-      result[i * 4 + j] = sum;
-    }
-  }
-}
-
-// Center crop by keeping xFraction of the width and yFraction of the height,
-// so e.g. cropping from 640x480 to 640x360 would use
-// xFraction=1, yFraction=360/480.
-void Matrix::Crop(float xFraction,
-                  float yFraction,
-                  float xOffset,
-                  float yOffset) {
-  const float crop_matrix[16] =
-      {xFraction, 0, 0, 0,
-       0, yFraction, 0, 0,
-       0, 0, 1, 0,
-       xOffset, yOffset, 0, 1};
-  const Matrix old = *this;
-  Multiply(crop_matrix, old.elem_, this->elem_);
-}
-
-// Aligning pointer to 64 bytes for improved performance, e.g. use SIMD.
-static const int kBufferAlignment = 64;
-
-NativeHandleImpl::NativeHandleImpl(int id, const Matrix& matrix)
-    : oes_texture_id(id), sampling_matrix(matrix) {}
-
-NativeHandleImpl::NativeHandleImpl(JNIEnv* jni,
-                                   jint j_oes_texture_id,
-                                   jfloatArray j_transform_matrix)
-    : oes_texture_id(j_oes_texture_id),
-      sampling_matrix(jni, j_transform_matrix) {}
-
-AndroidTextureBuffer::AndroidTextureBuffer(
-    int width,
-    int height,
-    const NativeHandleImpl& native_handle,
-    jobject surface_texture_helper,
-    const rtc::Callback0<void>& no_longer_used)
-    : width_(width),
-      height_(height),
-      native_handle_(native_handle),
-      surface_texture_helper_(surface_texture_helper),
-      no_longer_used_cb_(no_longer_used) {}
-
-AndroidTextureBuffer::~AndroidTextureBuffer() {
-  no_longer_used_cb_();
-}
-
-VideoFrameBuffer::Type AndroidTextureBuffer::type() const {
-  return Type::kNative;
-}
-
-NativeHandleImpl AndroidTextureBuffer::native_handle_impl() const {
-  return native_handle_;
-}
-
-int AndroidTextureBuffer::width() const {
-  return width_;
-}
-
-int AndroidTextureBuffer::height() const {
-  return height_;
-}
-
-rtc::scoped_refptr<I420BufferInterface> AndroidTextureBuffer::ToI420() {
-  int uv_width = (width() + 7) / 8;
-  int stride = 8 * uv_width;
-  int uv_height = (height() + 1) / 2;
-  size_t size = stride * (height() + uv_height);
-  // The data is owned by the frame, and the normal case is that the
-  // data is deleted by the frame's destructor callback.
-  //
-  // TODO(nisse): Use an I420BufferPool. We then need to extend that
-  // class, and I420Buffer, to support our memory layout.
-  // TODO(nisse): Depending on
-  // system_wrappers/include/aligned_malloc.h violate current DEPS
-  // rules. We get away for now only because it is indirectly included
-  // by i420_buffer.h
-  std::unique_ptr<uint8_t, AlignedFreeDeleter> yuv_data(
-      static_cast<uint8_t*>(AlignedMalloc(size, kBufferAlignment)));
-  // See YuvConverter.java for the required layout.
-  uint8_t* y_data = yuv_data.get();
-  uint8_t* u_data = y_data + height() * stride;
-  uint8_t* v_data = u_data + stride/2;
-
-  rtc::scoped_refptr<I420BufferInterface> copy = webrtc::WrapI420Buffer(
-      width(), height(), y_data, stride, u_data, stride, v_data, stride,
-      rtc::Bind(&AlignedFree, yuv_data.release()));
-
-  JNIEnv* jni = AttachCurrentThreadIfNeeded();
-  ScopedLocalRefFrame local_ref_frame(jni);
-
-  jmethodID transform_mid = GetMethodID(
-      jni,
-      GetObjectClass(jni, surface_texture_helper_),
-      "textureToYUV",
-      "(Ljava/nio/ByteBuffer;IIII[F)V");
-
-  jobject byte_buffer = jni->NewDirectByteBuffer(y_data, size);
-
-  jfloatArray sampling_matrix = native_handle_.sampling_matrix.ToJava(jni);
-  jni->CallVoidMethod(surface_texture_helper_,
-                      transform_mid,
-                      byte_buffer, width(), height(), stride,
-                      native_handle_.oes_texture_id, sampling_matrix);
-  CHECK_EXCEPTION(jni) << "textureToYUV throwed an exception";
-
-  return copy;
-}
-
-rtc::scoped_refptr<AndroidVideoBuffer> AndroidVideoBuffer::WrapReference(
-    JNIEnv* jni,
-    jmethodID j_release_id,
-    int width,
-    int height,
-    jobject j_video_frame_buffer) {
-  return new rtc::RefCountedObject<AndroidVideoBuffer>(
-      jni, j_release_id, width, height, j_video_frame_buffer);
-}
-
-AndroidVideoBuffer::AndroidVideoBuffer(JNIEnv* jni,
-                                       jmethodID j_retain_id,
-                                       jmethodID j_release_id,
-                                       int width,
-                                       int height,
-                                       jobject j_video_frame_buffer)
-    : AndroidVideoBuffer(jni,
-                         j_release_id,
-                         width,
-                         height,
-                         j_video_frame_buffer) {
-  jni->CallVoidMethod(j_video_frame_buffer, j_retain_id);
-}
-
-AndroidVideoBuffer::AndroidVideoBuffer(JNIEnv* jni,
-                                       jmethodID j_release_id,
-                                       int width,
-                                       int height,
-                                       jobject j_video_frame_buffer)
-    : j_release_id_(j_release_id),
-      width_(width),
-      height_(height),
-      j_video_frame_buffer_(jni, j_video_frame_buffer) {}
-
-AndroidVideoBuffer::~AndroidVideoBuffer() {
-  JNIEnv* jni = AttachCurrentThreadIfNeeded();
-  jni->CallVoidMethod(*j_video_frame_buffer_, j_release_id_);
-}
-
-jobject AndroidVideoBuffer::video_frame_buffer() const {
-  return *j_video_frame_buffer_;
-}
-
-VideoFrameBuffer::Type AndroidVideoBuffer::type() const {
-  return Type::kNative;
-}
-
-int AndroidVideoBuffer::width() const {
-  return width_;
-}
-
-int AndroidVideoBuffer::height() const {
-  return height_;
-}
-
-rtc::scoped_refptr<I420BufferInterface> AndroidVideoBuffer::ToI420() {
-  JNIEnv* jni = AttachCurrentThreadIfNeeded();
-  ScopedLocalRefFrame local_ref_frame(jni);
-
-  jclass j_video_frame_buffer_class =
-      FindClass(jni, "org/webrtc/VideoFrame$Buffer");
-  jmethodID j_to_i420_id =
-      jni->GetMethodID(j_video_frame_buffer_class, "toI420",
-                       "()Lorg/webrtc/VideoFrame$I420Buffer;");
-
-  jobject j_i420_buffer =
-      jni->CallObjectMethod(*j_video_frame_buffer_, j_to_i420_id);
-
-  // We don't need to retain the buffer because toI420 returns a new object that
-  // we are assumed to take the ownership of.
-  return AndroidVideoI420Buffer::WrapReference(jni, j_release_id_, width_,
-                                               height_, j_i420_buffer);
-}
-
-jobject AndroidVideoBuffer::ToJavaI420Frame(JNIEnv* jni, int rotation) {
-  jclass j_byte_buffer_class = jni->FindClass("java/nio/ByteBuffer");
-  jclass j_i420_frame_class =
-      FindClass(jni, "org/webrtc/VideoRenderer$I420Frame");
-  jmethodID j_i420_frame_ctor_id = GetMethodID(
-      jni, j_i420_frame_class, "<init>", "(ILorg/webrtc/VideoFrame$Buffer;J)V");
-  // Java code just uses the native frame to hold a reference to the buffer so
-  // this is okay.
-  VideoFrame* native_frame =
-      new VideoFrame(this, 0 /* timestamp */, 0 /* render_time_ms */,
-                     VideoRotation::kVideoRotation_0 /* rotation */);
-  return jni->NewObject(j_i420_frame_class, j_i420_frame_ctor_id, rotation,
-                        *j_video_frame_buffer_, jlongFromPointer(native_frame));
-}
-
-AndroidVideoBufferFactory::AndroidVideoBufferFactory(JNIEnv* jni)
-    : j_video_frame_class_(jni, FindClass(jni, "org/webrtc/VideoFrame")),
-      j_get_buffer_id_(GetMethodID(jni,
-                                   *j_video_frame_class_,
-                                   "getBuffer",
-                                   "()Lorg/webrtc/VideoFrame$Buffer;")),
-      j_get_rotation_id_(
-          GetMethodID(jni, *j_video_frame_class_, "getRotation", "()I")),
-      j_get_timestamp_ns_id_(
-          GetMethodID(jni, *j_video_frame_class_, "getTimestampNs", "()J")),
-      j_video_frame_buffer_class_(
-          jni,
-          FindClass(jni, "org/webrtc/VideoFrame$Buffer")),
-      j_retain_id_(
-          GetMethodID(jni, *j_video_frame_buffer_class_, "retain", "()V")),
-      j_release_id_(
-          GetMethodID(jni, *j_video_frame_buffer_class_, "release", "()V")),
-      j_get_width_id_(
-          GetMethodID(jni, *j_video_frame_buffer_class_, "getWidth", "()I")),
-      j_get_height_id_(
-          GetMethodID(jni, *j_video_frame_buffer_class_, "getHeight", "()I")) {}
-
-VideoFrame AndroidVideoBufferFactory::CreateFrame(
-    JNIEnv* jni,
-    jobject j_video_frame,
-    uint32_t timestamp_rtp) const {
-  jobject j_video_frame_buffer =
-      jni->CallObjectMethod(j_video_frame, j_get_buffer_id_);
-  int rotation = jni->CallIntMethod(j_video_frame, j_get_rotation_id_);
-  uint32_t timestamp_ns =
-      jni->CallLongMethod(j_video_frame, j_get_timestamp_ns_id_);
-  rtc::scoped_refptr<AndroidVideoBuffer> buffer =
-      CreateBuffer(jni, j_video_frame_buffer);
-  return VideoFrame(buffer, timestamp_rtp,
-                    timestamp_ns / rtc::kNumNanosecsPerMillisec,
-                    static_cast<VideoRotation>(rotation));
-}
-
-rtc::scoped_refptr<AndroidVideoBuffer> AndroidVideoBufferFactory::WrapBuffer(
-    JNIEnv* jni,
-    jobject j_video_frame_buffer) const {
-  int width = jni->CallIntMethod(j_video_frame_buffer, j_get_width_id_);
-  int height = jni->CallIntMethod(j_video_frame_buffer, j_get_height_id_);
-  return AndroidVideoBuffer::WrapReference(jni, j_release_id_, width, height,
-                                           j_video_frame_buffer);
-}
-
-rtc::scoped_refptr<AndroidVideoBuffer> AndroidVideoBufferFactory::CreateBuffer(
-    JNIEnv* jni,
-    jobject j_video_frame_buffer) const {
-  int width = jni->CallIntMethod(j_video_frame_buffer, j_get_width_id_);
-  int height = jni->CallIntMethod(j_video_frame_buffer, j_get_height_id_);
-  return new rtc::RefCountedObject<AndroidVideoBuffer>(
-      jni, j_retain_id_, j_release_id_, width, height, j_video_frame_buffer);
-}
-
-JavaVideoFrameFactory::JavaVideoFrameFactory(JNIEnv* jni)
-    : j_video_frame_class_(jni, FindClass(jni, "org/webrtc/VideoFrame")) {
-  j_video_frame_constructor_id_ =
-      GetMethodID(jni, *j_video_frame_class_, "<init>",
-                  "(Lorg/webrtc/VideoFrame$Buffer;IJ)V");
-}
-
-static bool IsJavaVideoBuffer(rtc::scoped_refptr<VideoFrameBuffer> buffer) {
-  if (buffer->type() != VideoFrameBuffer::Type::kNative) {
-    return false;
-  }
-  AndroidVideoFrameBuffer* android_buffer =
-      static_cast<AndroidVideoFrameBuffer*>(buffer.get());
-  return android_buffer->android_type() ==
-         AndroidVideoFrameBuffer::AndroidType::kJavaBuffer;
-}
-
-jobject JavaVideoFrameFactory::ToJavaFrame(JNIEnv* jni,
-                                           const VideoFrame& frame) const {
-  rtc::scoped_refptr<VideoFrameBuffer> buffer = frame.video_frame_buffer();
-  jobject j_buffer;
-  if (IsJavaVideoBuffer(buffer)) {
-    RTC_DCHECK(buffer->type() == VideoFrameBuffer::Type::kNative);
-    AndroidVideoFrameBuffer* android_buffer =
-        static_cast<AndroidVideoFrameBuffer*>(buffer.get());
-    RTC_DCHECK(android_buffer->android_type() ==
-               AndroidVideoFrameBuffer::AndroidType::kJavaBuffer);
-    AndroidVideoBuffer* android_video_buffer =
-        static_cast<AndroidVideoBuffer*>(android_buffer);
-    j_buffer = android_video_buffer->video_frame_buffer();
-  } else {
-    j_buffer = WrapI420Buffer(jni, buffer->ToI420());
-  }
-  return jni->NewObject(
-      *j_video_frame_class_, j_video_frame_constructor_id_, j_buffer,
-      static_cast<jint>(frame.rotation()),
-      static_cast<jlong>(frame.timestamp_us() * rtc::kNumNanosecsPerMicrosec));
-}
-
-}  // namespace jni
-}  // namespace webrtc
diff --git a/sdk/android/src/jni/native_handle_impl.h b/sdk/android/src/jni/native_handle_impl.h
deleted file mode 100644
index 3ad1b6a..0000000
--- a/sdk/android/src/jni/native_handle_impl.h
+++ /dev/null
@@ -1,197 +0,0 @@
-/*
- *  Copyright 2015 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_SDK_ANDROID_SRC_JNI_NATIVE_HANDLE_IMPL_H_
-#define WEBRTC_SDK_ANDROID_SRC_JNI_NATIVE_HANDLE_IMPL_H_
-
-#include <jni.h>
-
-#include "webrtc/api/video/video_frame.h"
-#include "webrtc/api/video/video_frame_buffer.h"
-#include "webrtc/api/video/video_rotation.h"
-#include "webrtc/rtc_base/callback.h"
-#include "webrtc/sdk/android/src/jni/jni_helpers.h"
-
-namespace webrtc {
-namespace jni {
-
-// Open gl texture matrix, in column-major order. Operations are
-// in-place.
-class Matrix {
- public:
-  Matrix(JNIEnv* jni, jfloatArray a);
-
-  static Matrix fromAndroidGraphicsMatrix(JNIEnv* jni, jobject j_matrix);
-
-  jfloatArray ToJava(JNIEnv* jni) const;
-
-  // Crop arguments are relative to original size.
-  void Crop(float cropped_width,
-            float cropped_height,
-            float crop_x,
-            float crop_y);
-
-  void Rotate(VideoRotation rotation);
-
- private:
-  Matrix() {}
-
-  static void Multiply(const float a[16], const float b[16], float result[16]);
-  float elem_[16];
-};
-
-// Wrapper for texture object.
-struct NativeHandleImpl {
-  NativeHandleImpl(JNIEnv* jni,
-                   jint j_oes_texture_id,
-                   jfloatArray j_transform_matrix);
-
-  NativeHandleImpl(int id, const Matrix& matrix);
-
-  const int oes_texture_id;
-  Matrix sampling_matrix;
-};
-
-// Base class to differentiate between the old texture frames and the new
-// Java-based frames.
-// TODO(sakal): Remove this and AndroidTextureBuffer once they are no longer
-// needed.
-class AndroidVideoFrameBuffer : public VideoFrameBuffer {
- public:
-  enum class AndroidType { kTextureBuffer, kJavaBuffer };
-
-  virtual AndroidType android_type() = 0;
-};
-
-class AndroidTextureBuffer : public AndroidVideoFrameBuffer {
- public:
-  AndroidTextureBuffer(int width,
-                       int height,
-                       const NativeHandleImpl& native_handle,
-                       jobject surface_texture_helper,
-                       const rtc::Callback0<void>& no_longer_used);
-  ~AndroidTextureBuffer();
-
-  NativeHandleImpl native_handle_impl() const;
-
- private:
-  Type type() const override;
-  int width() const override;
-  int height() const override;
-
-  rtc::scoped_refptr<I420BufferInterface> ToI420() override;
-
-  AndroidType android_type() override { return AndroidType::kTextureBuffer; }
-
-  const int width_;
-  const int height_;
-  NativeHandleImpl native_handle_;
-  // Raw object pointer, relying on the caller, i.e.,
-  // AndroidVideoCapturerJni or the C++ SurfaceTextureHelper, to keep
-  // a global reference. TODO(nisse): Make this a reference to the C++
-  // SurfaceTextureHelper instead, but that requires some refactoring
-  // of AndroidVideoCapturerJni.
-  jobject surface_texture_helper_;
-  rtc::Callback0<void> no_longer_used_cb_;
-};
-
-class AndroidVideoBuffer : public AndroidVideoFrameBuffer {
- public:
-  // Wraps an existing reference to a Java VideoBuffer. Retain will not be
-  // called but release will be called when the C++ object is destroyed.
-  static rtc::scoped_refptr<AndroidVideoBuffer> WrapReference(
-      JNIEnv* jni,
-      jmethodID j_release_id,
-      int width,
-      int height,
-      jobject j_video_frame_buffer);
-
-  AndroidVideoBuffer(JNIEnv* jni,
-                     jmethodID j_retain_id,
-                     jmethodID j_release_id,
-                     int width,
-                     int height,
-                     jobject j_video_frame_buffer);
-  // Should not be called directly. Wraps a reference. Use
-  // AndroidVideoBuffer::WrapReference instead for clarity.
-  AndroidVideoBuffer(JNIEnv* jni,
-                     jmethodID j_release_id,
-                     int width,
-                     int height,
-                     jobject j_video_frame_buffer);
-  ~AndroidVideoBuffer() override;
-
-  jobject video_frame_buffer() const;
-
-  // Returns an instance of VideoRenderer.I420Frame (deprecated)
-  jobject ToJavaI420Frame(JNIEnv* jni, int rotation);
-
- private:
-  Type type() const override;
-  int width() const override;
-  int height() const override;
-
-  rtc::scoped_refptr<I420BufferInterface> ToI420() override;
-
-  AndroidType android_type() override { return AndroidType::kJavaBuffer; }
-
-  const jmethodID j_release_id_;
-  const int width_;
-  const int height_;
-  // Holds a VideoFrame.Buffer.
-  const ScopedGlobalRef<jobject> j_video_frame_buffer_;
-};
-
-class AndroidVideoBufferFactory {
- public:
-  explicit AndroidVideoBufferFactory(JNIEnv* jni);
-
-  VideoFrame CreateFrame(JNIEnv* jni,
-                         jobject j_video_frame,
-                         uint32_t timestamp_rtp) const;
-
-  // Wraps a buffer to AndroidVideoBuffer without incrementing the reference
-  // count.
-  rtc::scoped_refptr<AndroidVideoBuffer> WrapBuffer(
-      JNIEnv* jni,
-      jobject j_video_frame_buffer) const;
-
-  rtc::scoped_refptr<AndroidVideoBuffer> CreateBuffer(
-      JNIEnv* jni,
-      jobject j_video_frame_buffer) const;
-
- private:
-  ScopedGlobalRef<jclass> j_video_frame_class_;
-  jmethodID j_get_buffer_id_;
-  jmethodID j_get_rotation_id_;
-  jmethodID j_get_timestamp_ns_id_;
-
-  ScopedGlobalRef<jclass> j_video_frame_buffer_class_;
-  jmethodID j_retain_id_;
-  jmethodID j_release_id_;
-  jmethodID j_get_width_id_;
-  jmethodID j_get_height_id_;
-};
-
-class JavaVideoFrameFactory {
- public:
-  JavaVideoFrameFactory(JNIEnv* jni);
-
-  jobject ToJavaFrame(JNIEnv* jni, const VideoFrame& frame) const;
-
- private:
-  ScopedGlobalRef<jclass> j_video_frame_class_;
-  jmethodID j_video_frame_constructor_id_;
-};
-
-}  // namespace jni
-}  // namespace webrtc
-
-#endif  // WEBRTC_SDK_ANDROID_SRC_JNI_NATIVE_HANDLE_IMPL_H_
diff --git a/sdk/android/src/jni/nv12buffer_jni.cc b/sdk/android/src/jni/nv12buffer_jni.cc
deleted file mode 100644
index 37eb335..0000000
--- a/sdk/android/src/jni/nv12buffer_jni.cc
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- *  Copyright 2017 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 <jni.h>
-#include <vector>
-
-#include "third_party/libyuv/include/libyuv/convert.h"
-#include "third_party/libyuv/include/libyuv/scale.h"
-
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-namespace jni {
-
-extern "C" JNIEXPORT void JNICALL
-Java_org_webrtc_NV12Buffer_nativeCropAndScale(JNIEnv* jni,
-                                              jclass,
-                                              jint crop_x,
-                                              jint crop_y,
-                                              jint crop_width,
-                                              jint crop_height,
-                                              jint scale_width,
-                                              jint scale_height,
-                                              jobject j_src,
-                                              jint src_width,
-                                              jint src_height,
-                                              jint src_stride,
-                                              jint src_slice_height,
-                                              jobject j_dst_y,
-                                              jint dst_stride_y,
-                                              jobject j_dst_u,
-                                              jint dst_stride_u,
-                                              jobject j_dst_v,
-                                              jint dst_stride_v) {
-  const int src_stride_y = src_stride;
-  const int src_stride_uv = src_stride;
-  const int crop_chroma_x = crop_x / 2;
-  const int crop_chroma_y = crop_y / 2;
-  const int crop_chroma_width = (crop_width + 1) / 2;
-  const int crop_chroma_height = (crop_height + 1) / 2;
-  const int tmp_stride_u = crop_chroma_width;
-  const int tmp_stride_v = crop_chroma_width;
-  const int tmp_size = crop_chroma_height * (tmp_stride_u + tmp_stride_v);
-
-  uint8_t const* src_y =
-      static_cast<uint8_t const*>(jni->GetDirectBufferAddress(j_src));
-  uint8_t const* src_uv = src_y + src_slice_height * src_stride_y;
-
-  uint8_t* dst_y = static_cast<uint8_t*>(jni->GetDirectBufferAddress(j_dst_y));
-  uint8_t* dst_u = static_cast<uint8_t*>(jni->GetDirectBufferAddress(j_dst_u));
-  uint8_t* dst_v = static_cast<uint8_t*>(jni->GetDirectBufferAddress(j_dst_v));
-
-  // Crop using pointer arithmetic.
-  src_y += crop_x + crop_y * src_stride_y;
-  src_uv += crop_chroma_x + crop_chroma_y * src_stride_uv;
-
-  std::vector<uint8_t> tmp_buffer(tmp_size);
-  uint8_t* tmp_u = tmp_buffer.data();
-  uint8_t* tmp_v = tmp_u + crop_chroma_height * tmp_stride_u;
-
-  libyuv::SplitUVPlane(src_uv, src_stride_uv, tmp_u, tmp_stride_u, tmp_v,
-                       tmp_stride_v, crop_chroma_width, crop_chroma_height);
-
-  libyuv::I420Scale(src_y, src_stride_y, tmp_u, tmp_stride_u, tmp_v,
-                    tmp_stride_v, crop_width, crop_height, dst_y, dst_stride_y,
-                    dst_u, dst_stride_u, dst_v, dst_stride_v, scale_width,
-                    scale_height, libyuv::kFilterBox);
-}
-
-}  // namespace jni
-}  // namespace webrtc
diff --git a/sdk/android/src/jni/nv21buffer_jni.cc b/sdk/android/src/jni/nv21buffer_jni.cc
deleted file mode 100644
index f8ab903..0000000
--- a/sdk/android/src/jni/nv21buffer_jni.cc
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- *  Copyright 2017 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 <jni.h>
-#include <vector>
-
-#include "third_party/libyuv/include/libyuv/convert.h"
-#include "third_party/libyuv/include/libyuv/scale.h"
-
-#include "webrtc/common_video/libyuv/include/webrtc_libyuv.h"
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-namespace jni {
-
-extern "C" JNIEXPORT void JNICALL
-Java_org_webrtc_NV21Buffer_nativeCropAndScale(JNIEnv* jni,
-                                              jclass,
-                                              jint crop_x,
-                                              jint crop_y,
-                                              jint crop_width,
-                                              jint crop_height,
-                                              jint scale_width,
-                                              jint scale_height,
-                                              jbyteArray j_src,
-                                              jint src_width,
-                                              jint src_height,
-                                              jobject j_dst_y,
-                                              jint dst_stride_y,
-                                              jobject j_dst_u,
-                                              jint dst_stride_u,
-                                              jobject j_dst_v,
-                                              jint dst_stride_v) {
-  const int src_stride_y = src_width;
-  const int src_stride_uv = src_width;
-  const int crop_chroma_x = crop_x / 2;
-  const int crop_chroma_y = crop_y / 2;
-  const int crop_chroma_width = (crop_width + 1) / 2;
-  const int crop_chroma_height = (crop_height + 1) / 2;
-  const int tmp_stride_u = crop_chroma_width;
-  const int tmp_stride_v = crop_chroma_width;
-  const int tmp_size = crop_chroma_height * (tmp_stride_u + tmp_stride_v);
-
-  jboolean was_copy;
-  jbyte* src_bytes = jni->GetByteArrayElements(j_src, &was_copy);
-  RTC_DCHECK(!was_copy);
-  uint8_t const* src_y = reinterpret_cast<uint8_t const*>(src_bytes);
-  uint8_t const* src_uv = src_y + src_height * src_stride_y;
-
-  uint8_t* dst_y = static_cast<uint8_t*>(jni->GetDirectBufferAddress(j_dst_y));
-  uint8_t* dst_u = static_cast<uint8_t*>(jni->GetDirectBufferAddress(j_dst_u));
-  uint8_t* dst_v = static_cast<uint8_t*>(jni->GetDirectBufferAddress(j_dst_v));
-
-  // Crop using pointer arithmetic.
-  src_y += crop_x + crop_y * src_stride_y;
-  src_uv += crop_chroma_x + crop_chroma_y * src_stride_uv;
-
-  NV12ToI420Scaler scaler;
-  // U- and V-planes are swapped because this is NV21 not NV12.
-  scaler.NV12ToI420Scale(src_y, src_stride_y, src_uv, src_stride_uv, crop_width,
-                         crop_height, dst_y, dst_stride_y, dst_v, dst_stride_v,
-                         dst_u, dst_stride_u, scale_width, scale_height);
-
-  jni->ReleaseByteArrayElements(j_src, src_bytes, JNI_ABORT);
-}
-
-}  // namespace jni
-}  // namespace webrtc
diff --git a/sdk/android/src/jni/pc/OWNERS b/sdk/android/src/jni/pc/OWNERS
deleted file mode 100644
index a32f041..0000000
--- a/sdk/android/src/jni/pc/OWNERS
+++ /dev/null
@@ -1 +0,0 @@
-deadbeef@webrtc.org
diff --git a/sdk/android/src/jni/pc/androidnetworkmonitor_jni.cc b/sdk/android/src/jni/pc/androidnetworkmonitor_jni.cc
deleted file mode 100644
index c0f6bd5..0000000
--- a/sdk/android/src/jni/pc/androidnetworkmonitor_jni.cc
+++ /dev/null
@@ -1,447 +0,0 @@
-/*
- *  Copyright 2015 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/sdk/android/src/jni/pc/androidnetworkmonitor_jni.h"
-
-#include <dlfcn.h>
-// This was added in Lollipop to dlfcn.h
-#define RTLD_NOLOAD 4
-
-#include "webrtc/rtc_base/bind.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/ipaddress.h"
-#include "webrtc/sdk/android/src/jni/classreferenceholder.h"
-#include "webrtc/sdk/android/src/jni/jni_helpers.h"
-
-namespace webrtc {
-namespace jni {
-
-enum AndroidSdkVersion {
-  SDK_VERSION_LOLLIPOP = 21,
-  SDK_VERSION_MARSHMALLOW = 23
-};
-
-int AndroidNetworkMonitor::android_sdk_int_ = 0;
-
-static NetworkType GetNetworkTypeFromJava(JNIEnv* jni, jobject j_network_type) {
-  std::string enum_name =
-      GetJavaEnumName(jni, "org/webrtc/NetworkMonitorAutoDetect$ConnectionType",
-                      j_network_type);
-  if (enum_name == "CONNECTION_UNKNOWN") {
-    return NetworkType::NETWORK_UNKNOWN;
-  }
-  if (enum_name == "CONNECTION_ETHERNET") {
-    return NetworkType::NETWORK_ETHERNET;
-  }
-  if (enum_name == "CONNECTION_WIFI") {
-    return NetworkType::NETWORK_WIFI;
-  }
-  if (enum_name == "CONNECTION_4G") {
-    return NetworkType::NETWORK_4G;
-  }
-  if (enum_name == "CONNECTION_3G") {
-    return NetworkType::NETWORK_3G;
-  }
-  if (enum_name == "CONNECTION_2G") {
-    return NetworkType::NETWORK_2G;
-  }
-  if (enum_name == "CONNECTION_UNKNOWN_CELLULAR") {
-    return NetworkType::NETWORK_UNKNOWN_CELLULAR;
-  }
-  if (enum_name == "CONNECTION_BLUETOOTH") {
-    return NetworkType::NETWORK_BLUETOOTH;
-  }
-  if (enum_name == "CONNECTION_NONE") {
-    return NetworkType::NETWORK_NONE;
-  }
-  RTC_NOTREACHED();
-  return NetworkType::NETWORK_UNKNOWN;
-}
-
-static rtc::AdapterType AdapterTypeFromNetworkType(NetworkType network_type) {
-  switch (network_type) {
-    case NETWORK_UNKNOWN:
-      return rtc::ADAPTER_TYPE_UNKNOWN;
-    case NETWORK_ETHERNET:
-      return rtc::ADAPTER_TYPE_ETHERNET;
-    case NETWORK_WIFI:
-      return rtc::ADAPTER_TYPE_WIFI;
-    case NETWORK_4G:
-    case NETWORK_3G:
-    case NETWORK_2G:
-    case NETWORK_UNKNOWN_CELLULAR:
-      return rtc::ADAPTER_TYPE_CELLULAR;
-    case NETWORK_BLUETOOTH:
-      // There is no corresponding mapping for bluetooth networks.
-      // Map it to VPN for now.
-      return rtc::ADAPTER_TYPE_VPN;
-    default:
-      RTC_NOTREACHED() << "Invalid network type " << network_type;
-      return rtc::ADAPTER_TYPE_UNKNOWN;
-  }
-}
-
-static rtc::IPAddress GetIPAddressFromJava(JNIEnv* jni, jobject j_ip_address) {
-  jclass j_ip_address_class = GetObjectClass(jni, j_ip_address);
-  jfieldID j_address_id = GetFieldID(jni, j_ip_address_class, "address", "[B");
-  jbyteArray j_addresses =
-      static_cast<jbyteArray>(GetObjectField(jni, j_ip_address, j_address_id));
-  size_t address_length = jni->GetArrayLength(j_addresses);
-  jbyte* addr_array = jni->GetByteArrayElements(j_addresses, nullptr);
-  CHECK_EXCEPTION(jni) << "Error during GetIPAddressFromJava";
-  if (address_length == 4) {
-    // IP4
-    struct in_addr ip4_addr;
-    memcpy(&ip4_addr.s_addr, addr_array, 4);
-    jni->ReleaseByteArrayElements(j_addresses, addr_array, JNI_ABORT);
-    return rtc::IPAddress(ip4_addr);
-  }
-  // IP6
-  RTC_CHECK(address_length == 16);
-  struct in6_addr ip6_addr;
-  memcpy(ip6_addr.s6_addr, addr_array, address_length);
-  jni->ReleaseByteArrayElements(j_addresses, addr_array, JNI_ABORT);
-  return rtc::IPAddress(ip6_addr);
-}
-
-static void GetIPAddressesFromJava(JNIEnv* jni,
-                                   jobjectArray j_ip_addresses,
-                                   std::vector<rtc::IPAddress>* ip_addresses) {
-  ip_addresses->clear();
-  size_t num_addresses = jni->GetArrayLength(j_ip_addresses);
-  CHECK_EXCEPTION(jni) << "Error during GetArrayLength";
-  for (size_t i = 0; i < num_addresses; ++i) {
-    jobject j_ip_address = jni->GetObjectArrayElement(j_ip_addresses, i);
-    CHECK_EXCEPTION(jni) << "Error during GetObjectArrayElement";
-    rtc::IPAddress ip = GetIPAddressFromJava(jni, j_ip_address);
-    ip_addresses->push_back(ip);
-  }
-}
-
-static NetworkInformation GetNetworkInformationFromJava(
-    JNIEnv* jni,
-    jobject j_network_info) {
-  jclass j_network_info_class = GetObjectClass(jni, j_network_info);
-  jfieldID j_interface_name_id =
-      GetFieldID(jni, j_network_info_class, "name", "Ljava/lang/String;");
-  jfieldID j_handle_id = GetFieldID(jni, j_network_info_class, "handle", "J");
-  jfieldID j_type_id =
-      GetFieldID(jni, j_network_info_class, "type",
-                 "Lorg/webrtc/NetworkMonitorAutoDetect$ConnectionType;");
-  jfieldID j_ip_addresses_id =
-      GetFieldID(jni, j_network_info_class, "ipAddresses",
-                 "[Lorg/webrtc/NetworkMonitorAutoDetect$IPAddress;");
-
-  NetworkInformation network_info;
-  network_info.interface_name = JavaToStdString(
-      jni, GetStringField(jni, j_network_info, j_interface_name_id));
-  network_info.handle = static_cast<NetworkHandle>(
-      GetLongField(jni, j_network_info, j_handle_id));
-  network_info.type = GetNetworkTypeFromJava(
-      jni, GetObjectField(jni, j_network_info, j_type_id));
-  jobjectArray j_ip_addresses = static_cast<jobjectArray>(
-      GetObjectField(jni, j_network_info, j_ip_addresses_id));
-  GetIPAddressesFromJava(jni, j_ip_addresses, &network_info.ip_addresses);
-  return network_info;
-}
-
-std::string NetworkInformation::ToString() const {
-  std::stringstream ss;
-  ss << "NetInfo[name " << interface_name << "; handle " << handle << "; type "
-     << type << "; address";
-  for (const rtc::IPAddress address : ip_addresses) {
-    ss << " " << address.ToString();
-  }
-  ss << "]";
-  return ss.str();
-}
-
-AndroidNetworkMonitor::AndroidNetworkMonitor()
-    : j_network_monitor_class_(jni(),
-                               FindClass(jni(), "org/webrtc/NetworkMonitor")),
-      j_network_monitor_(
-          jni(),
-          jni()->CallStaticObjectMethod(
-              *j_network_monitor_class_,
-              GetStaticMethodID(jni(),
-                                *j_network_monitor_class_,
-                                "getInstance",
-                                "()Lorg/webrtc/NetworkMonitor;"))) {
-  CHECK_EXCEPTION(jni()) << "Error during NetworkMonitor.init";
-  if (android_sdk_int_ <= 0) {
-    jmethodID m = GetStaticMethodID(jni(), *j_network_monitor_class_,
-                                    "androidSdkInt", "()I");
-    android_sdk_int_ = jni()->CallStaticIntMethod(*j_network_monitor_class_, m);
-    CHECK_EXCEPTION(jni()) << "Error during NetworkMonitor.androidSdkInt";
-  }
-}
-
-void AndroidNetworkMonitor::Start() {
-  RTC_CHECK(thread_checker_.CalledOnValidThread());
-  if (started_) {
-    return;
-  }
-  started_ = true;
-
-  // This is kind of magic behavior, but doing this allows the SocketServer to
-  // use this as a NetworkBinder to bind sockets on a particular network when
-  // it creates sockets.
-  worker_thread()->socketserver()->set_network_binder(this);
-
-  jmethodID m =
-      GetMethodID(jni(), *j_network_monitor_class_, "startMonitoring", "(J)V");
-  jni()->CallVoidMethod(*j_network_monitor_, m, jlongFromPointer(this));
-  CHECK_EXCEPTION(jni()) << "Error during CallVoidMethod";
-}
-
-void AndroidNetworkMonitor::Stop() {
-  RTC_CHECK(thread_checker_.CalledOnValidThread());
-  if (!started_) {
-    return;
-  }
-  started_ = false;
-
-  // Once the network monitor stops, it will clear all network information and
-  // it won't find the network handle to bind anyway.
-  if (worker_thread()->socketserver()->network_binder() == this) {
-    worker_thread()->socketserver()->set_network_binder(nullptr);
-  }
-
-  jmethodID m =
-      GetMethodID(jni(), *j_network_monitor_class_, "stopMonitoring", "(J)V");
-  jni()->CallVoidMethod(*j_network_monitor_, m, jlongFromPointer(this));
-  CHECK_EXCEPTION(jni()) << "Error during NetworkMonitor.stopMonitoring";
-
-  network_handle_by_address_.clear();
-  network_info_by_handle_.clear();
-}
-
-// The implementation is largely taken from UDPSocketPosix::BindToNetwork in
-// https://cs.chromium.org/chromium/src/net/udp/udp_socket_posix.cc
-rtc::NetworkBindingResult AndroidNetworkMonitor::BindSocketToNetwork(
-    int socket_fd,
-    const rtc::IPAddress& address) {
-  RTC_CHECK(thread_checker_.CalledOnValidThread());
-
-  if (socket_fd == 0 /* NETWORK_UNSPECIFIED */) {
-    return rtc::NetworkBindingResult::NOT_IMPLEMENTED;
-  }
-
-  jmethodID network_binding_supported_id = GetMethodID(
-      jni(), *j_network_monitor_class_, "networkBindingSupported", "()Z");
-  // Android prior to Lollipop didn't have support for binding sockets to
-  // networks. This may also occur if there is no connectivity manager service.
-  bool network_binding_supported = jni()->CallBooleanMethod(
-      *j_network_monitor_, network_binding_supported_id);
-  CHECK_EXCEPTION(jni())
-      << "Error during NetworkMonitor.networkBindingSupported";
-  if (!network_binding_supported) {
-    LOG(LS_WARNING) << "BindSocketToNetwork is not supported on this platform "
-                    << "(Android SDK: " << android_sdk_int_ << ")";
-    return rtc::NetworkBindingResult::NOT_IMPLEMENTED;
-  }
-
-  auto iter = network_handle_by_address_.find(address);
-  if (iter == network_handle_by_address_.end()) {
-    return rtc::NetworkBindingResult::ADDRESS_NOT_FOUND;
-  }
-  NetworkHandle network_handle = iter->second;
-
-  int rv = 0;
-  if (android_sdk_int_ >= SDK_VERSION_MARSHMALLOW) {
-    // See declaration of android_setsocknetwork() here:
-    // http://androidxref.com/6.0.0_r1/xref/development/ndk/platforms/android-M/include/android/multinetwork.h#65
-    // Function cannot be called directly as it will cause app to fail to load
-    // on pre-marshmallow devices.
-    typedef int (*MarshmallowSetNetworkForSocket)(NetworkHandle net,
-                                                  int socket);
-    static MarshmallowSetNetworkForSocket marshmallowSetNetworkForSocket;
-    // This is not thread-safe, but we are running this only on the worker
-    // thread.
-    if (!marshmallowSetNetworkForSocket) {
-      const std::string android_native_lib_path = "libandroid.so";
-      void* lib = dlopen(android_native_lib_path.c_str(), RTLD_NOW);
-      if (lib == nullptr) {
-        LOG(LS_ERROR) << "Library " << android_native_lib_path << " not found!";
-        return rtc::NetworkBindingResult::NOT_IMPLEMENTED;
-      }
-      marshmallowSetNetworkForSocket =
-          reinterpret_cast<MarshmallowSetNetworkForSocket>(
-              dlsym(lib, "android_setsocknetwork"));
-    }
-    if (!marshmallowSetNetworkForSocket) {
-      LOG(LS_ERROR) << "Symbol marshmallowSetNetworkForSocket is not found";
-      return rtc::NetworkBindingResult::NOT_IMPLEMENTED;
-    }
-    rv = marshmallowSetNetworkForSocket(network_handle, socket_fd);
-  } else {
-    // NOTE: This relies on Android implementation details, but it won't change
-    // because Lollipop is already released.
-    typedef int (*LollipopSetNetworkForSocket)(unsigned net, int socket);
-    static LollipopSetNetworkForSocket lollipopSetNetworkForSocket;
-    // This is not threadsafe, but we are running this only on the worker
-    // thread.
-    if (!lollipopSetNetworkForSocket) {
-      // Android's netd client library should always be loaded in our address
-      // space as it shims libc functions like connect().
-      const std::string net_library_path = "libnetd_client.so";
-      // Use RTLD_NOW to match Android's prior loading of the library:
-      // http://androidxref.com/6.0.0_r5/xref/bionic/libc/bionic/NetdClient.cpp#37
-      // Use RTLD_NOLOAD to assert that the library is already loaded and
-      // avoid doing any disk IO.
-      void* lib = dlopen(net_library_path.c_str(), RTLD_NOW | RTLD_NOLOAD);
-      if (lib == nullptr) {
-        LOG(LS_ERROR) << "Library " << net_library_path << " not found!";
-        return rtc::NetworkBindingResult::NOT_IMPLEMENTED;
-      }
-      lollipopSetNetworkForSocket =
-          reinterpret_cast<LollipopSetNetworkForSocket>(
-              dlsym(lib, "setNetworkForSocket"));
-    }
-    if (!lollipopSetNetworkForSocket) {
-      LOG(LS_ERROR) << "Symbol lollipopSetNetworkForSocket is not found ";
-      return rtc::NetworkBindingResult::NOT_IMPLEMENTED;
-    }
-    rv = lollipopSetNetworkForSocket(network_handle, socket_fd);
-  }
-
-  // If |network| has since disconnected, |rv| will be ENONET.  Surface this as
-  // ERR_NETWORK_CHANGED, rather than MapSystemError(ENONET) which gives back
-  // the less descriptive ERR_FAILED.
-  if (rv == 0) {
-    return rtc::NetworkBindingResult::SUCCESS;
-  }
-  if (rv == ENONET) {
-    return rtc::NetworkBindingResult::NETWORK_CHANGED;
-  }
-  return rtc::NetworkBindingResult::FAILURE;
-}
-
-void AndroidNetworkMonitor::OnNetworkConnected(
-    const NetworkInformation& network_info) {
-  worker_thread()->Invoke<void>(
-      RTC_FROM_HERE, rtc::Bind(&AndroidNetworkMonitor::OnNetworkConnected_w,
-                               this, network_info));
-  // Fire SignalNetworksChanged to update the list of networks.
-  OnNetworksChanged();
-}
-
-void AndroidNetworkMonitor::OnNetworkConnected_w(
-    const NetworkInformation& network_info) {
-  LOG(LS_INFO) << "Network connected: " << network_info.ToString();
-  adapter_type_by_name_[network_info.interface_name] =
-      AdapterTypeFromNetworkType(network_info.type);
-  network_info_by_handle_[network_info.handle] = network_info;
-  for (const rtc::IPAddress& address : network_info.ip_addresses) {
-    network_handle_by_address_[address] = network_info.handle;
-  }
-}
-
-void AndroidNetworkMonitor::OnNetworkDisconnected(NetworkHandle handle) {
-  LOG(LS_INFO) << "Network disconnected for handle " << handle;
-  worker_thread()->Invoke<void>(
-      RTC_FROM_HERE,
-      rtc::Bind(&AndroidNetworkMonitor::OnNetworkDisconnected_w, this, handle));
-}
-
-void AndroidNetworkMonitor::OnNetworkDisconnected_w(NetworkHandle handle) {
-  auto iter = network_info_by_handle_.find(handle);
-  if (iter != network_info_by_handle_.end()) {
-    for (const rtc::IPAddress& address : iter->second.ip_addresses) {
-      network_handle_by_address_.erase(address);
-    }
-    network_info_by_handle_.erase(iter);
-  }
-}
-
-void AndroidNetworkMonitor::SetNetworkInfos(
-    const std::vector<NetworkInformation>& network_infos) {
-  RTC_CHECK(thread_checker_.CalledOnValidThread());
-  network_handle_by_address_.clear();
-  network_info_by_handle_.clear();
-  LOG(LS_INFO) << "Android network monitor found " << network_infos.size()
-               << " networks";
-  for (NetworkInformation network : network_infos) {
-    OnNetworkConnected_w(network);
-  }
-}
-
-rtc::AdapterType AndroidNetworkMonitor::GetAdapterType(
-    const std::string& if_name) {
-  auto iter = adapter_type_by_name_.find(if_name);
-  rtc::AdapterType type = (iter == adapter_type_by_name_.end())
-                              ? rtc::ADAPTER_TYPE_UNKNOWN
-                              : iter->second;
-  if (type == rtc::ADAPTER_TYPE_UNKNOWN) {
-    LOG(LS_WARNING) << "Get an unknown type for the interface " << if_name;
-  }
-  return type;
-}
-
-rtc::NetworkMonitorInterface*
-AndroidNetworkMonitorFactory::CreateNetworkMonitor() {
-  return new AndroidNetworkMonitor();
-}
-
-JNI_FUNCTION_DECLARATION(void,
-                         NetworkMonitor_nativeNotifyConnectionTypeChanged,
-                         JNIEnv* jni,
-                         jobject j_monitor,
-                         jlong j_native_monitor) {
-  rtc::NetworkMonitorInterface* network_monitor =
-      reinterpret_cast<rtc::NetworkMonitorInterface*>(j_native_monitor);
-  network_monitor->OnNetworksChanged();
-}
-
-JNI_FUNCTION_DECLARATION(void,
-                         NetworkMonitor_nativeNotifyOfActiveNetworkList,
-                         JNIEnv* jni,
-                         jobject j_monitor,
-                         jlong j_native_monitor,
-                         jobjectArray j_network_infos) {
-  AndroidNetworkMonitor* network_monitor =
-      reinterpret_cast<AndroidNetworkMonitor*>(j_native_monitor);
-  std::vector<NetworkInformation> network_infos;
-  size_t num_networks = jni->GetArrayLength(j_network_infos);
-  for (size_t i = 0; i < num_networks; ++i) {
-    jobject j_network_info = jni->GetObjectArrayElement(j_network_infos, i);
-    CHECK_EXCEPTION(jni) << "Error during GetObjectArrayElement";
-    network_infos.push_back(GetNetworkInformationFromJava(jni, j_network_info));
-  }
-  network_monitor->SetNetworkInfos(network_infos);
-}
-
-JNI_FUNCTION_DECLARATION(void,
-                         NetworkMonitor_nativeNotifyOfNetworkConnect,
-                         JNIEnv* jni,
-                         jobject j_monitor,
-                         jlong j_native_monitor,
-                         jobject j_network_info) {
-  AndroidNetworkMonitor* network_monitor =
-      reinterpret_cast<AndroidNetworkMonitor*>(j_native_monitor);
-  NetworkInformation network_info =
-      GetNetworkInformationFromJava(jni, j_network_info);
-  network_monitor->OnNetworkConnected(network_info);
-}
-
-JNI_FUNCTION_DECLARATION(void,
-                         NetworkMonitor_nativeNotifyOfNetworkDisconnect,
-                         JNIEnv* jni,
-                         jobject j_monitor,
-                         jlong j_native_monitor,
-                         jlong network_handle) {
-  AndroidNetworkMonitor* network_monitor =
-      reinterpret_cast<AndroidNetworkMonitor*>(j_native_monitor);
-  network_monitor->OnNetworkDisconnected(
-      static_cast<NetworkHandle>(network_handle));
-}
-
-}  // namespace jni
-}  // namespace webrtc
diff --git a/sdk/android/src/jni/pc/androidnetworkmonitor_jni.h b/sdk/android/src/jni/pc/androidnetworkmonitor_jni.h
deleted file mode 100644
index 71f2528..0000000
--- a/sdk/android/src/jni/pc/androidnetworkmonitor_jni.h
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- *  Copyright 2015 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_SDK_ANDROID_SRC_JNI_PC_ANDROIDNETWORKMONITOR_JNI_H_
-#define WEBRTC_SDK_ANDROID_SRC_JNI_PC_ANDROIDNETWORKMONITOR_JNI_H_
-
-#include <stdint.h>
-#include <map>
-#include <string>
-#include <vector>
-
-#include "webrtc/rtc_base/networkmonitor.h"
-#include "webrtc/rtc_base/thread_checker.h"
-#include "webrtc/sdk/android/src/jni/jni_helpers.h"
-
-namespace webrtc {
-namespace jni {
-
-typedef int64_t NetworkHandle;
-
-// c++ equivalent of java NetworkMonitorAutoDetect.ConnectionType.
-enum NetworkType {
-  NETWORK_UNKNOWN,
-  NETWORK_ETHERNET,
-  NETWORK_WIFI,
-  NETWORK_4G,
-  NETWORK_3G,
-  NETWORK_2G,
-  NETWORK_UNKNOWN_CELLULAR,
-  NETWORK_BLUETOOTH,
-  NETWORK_NONE
-};
-
-// The information is collected from Android OS so that the native code can get
-// the network type and handle (Android network ID) for each interface.
-struct NetworkInformation {
-  std::string interface_name;
-  NetworkHandle handle;
-  NetworkType type;
-  std::vector<rtc::IPAddress> ip_addresses;
-
-  std::string ToString() const;
-};
-
-class AndroidNetworkMonitor : public rtc::NetworkMonitorBase,
-                              public rtc::NetworkBinderInterface {
- public:
-  AndroidNetworkMonitor();
-
-  // TODO(sakal): Remove once down stream dependencies have been updated.
-  static void SetAndroidContext(JNIEnv* jni, jobject context) {}
-
-  void Start() override;
-  void Stop() override;
-
-  rtc::NetworkBindingResult BindSocketToNetwork(
-      int socket_fd,
-      const rtc::IPAddress& address) override;
-  rtc::AdapterType GetAdapterType(const std::string& if_name) override;
-  void OnNetworkConnected(const NetworkInformation& network_info);
-  void OnNetworkDisconnected(NetworkHandle network_handle);
-  // Always expected to be called on the network thread.
-  void SetNetworkInfos(const std::vector<NetworkInformation>& network_infos);
-
- private:
-  static jobject application_context_;
-  static int android_sdk_int_;
-  JNIEnv* jni() { return AttachCurrentThreadIfNeeded(); }
-
-  void OnNetworkConnected_w(const NetworkInformation& network_info);
-  void OnNetworkDisconnected_w(NetworkHandle network_handle);
-
-  ScopedGlobalRef<jclass> j_network_monitor_class_;
-  ScopedGlobalRef<jobject> j_network_monitor_;
-  rtc::ThreadChecker thread_checker_;
-  bool started_ = false;
-  std::map<std::string, rtc::AdapterType> adapter_type_by_name_;
-  std::map<rtc::IPAddress, NetworkHandle> network_handle_by_address_;
-  std::map<NetworkHandle, NetworkInformation> network_info_by_handle_;
-};
-
-class AndroidNetworkMonitorFactory : public rtc::NetworkMonitorFactory {
- public:
-  AndroidNetworkMonitorFactory() {}
-
-  rtc::NetworkMonitorInterface* CreateNetworkMonitor() override;
-};
-
-}  // namespace jni
-}  // namespace webrtc
-
-// TODO(magjed): Remove once external clients are updated.
-namespace webrtc_jni {
-
-using webrtc::jni::AndroidNetworkMonitor;
-using webrtc::jni::AndroidNetworkMonitorFactory;
-
-}  // namespace webrtc_jni
-
-#endif  // WEBRTC_SDK_ANDROID_SRC_JNI_PC_ANDROIDNETWORKMONITOR_JNI_H_
diff --git a/sdk/android/src/jni/pc/audio_jni.cc b/sdk/android/src/jni/pc/audio_jni.cc
deleted file mode 100644
index 6bd7df5..0000000
--- a/sdk/android/src/jni/pc/audio_jni.cc
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- *  Copyright 2017 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/sdk/android/src/jni/pc/audio_jni.h"
-
-#include "webrtc/api/audio_codecs/builtin_audio_decoder_factory.h"
-#include "webrtc/api/audio_codecs/builtin_audio_encoder_factory.h"
-
-namespace webrtc {
-namespace jni {
-
-rtc::scoped_refptr<AudioDecoderFactory> CreateAudioDecoderFactory() {
-  return CreateBuiltinAudioDecoderFactory();
-}
-
-rtc::scoped_refptr<AudioEncoderFactory> CreateAudioEncoderFactory() {
-  return CreateBuiltinAudioEncoderFactory();
-}
-
-}  // namespace jni
-}  // namespace webrtc
diff --git a/sdk/android/src/jni/pc/audio_jni.h b/sdk/android/src/jni/pc/audio_jni.h
deleted file mode 100644
index 477054e..0000000
--- a/sdk/android/src/jni/pc/audio_jni.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- *  Copyright 2017 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_SDK_ANDROID_SRC_JNI_PC_AUDIO_JNI_H_
-#define WEBRTC_SDK_ANDROID_SRC_JNI_PC_AUDIO_JNI_H_
-
-// Adding 'nogncheck' to disable the gn include headers check.
-// We don't want this target depend on audio related targets
-#include "webrtc/api/audio_codecs/audio_decoder_factory.h"  // nogncheck
-#include "webrtc/api/audio_codecs/audio_encoder_factory.h"  // nogncheck
-#include "webrtc/rtc_base/scoped_ref_ptr.h"
-
-namespace webrtc {
-namespace jni {
-
-rtc::scoped_refptr<AudioDecoderFactory> CreateAudioDecoderFactory();
-
-rtc::scoped_refptr<AudioEncoderFactory> CreateAudioEncoderFactory();
-
-}  // namespace jni
-}  // namespace webrtc
-
-#endif  // WEBRTC_SDK_ANDROID_SRC_JNI_PC_AUDIO_JNI_H_
diff --git a/sdk/android/src/jni/pc/audiotrack_jni.cc b/sdk/android/src/jni/pc/audiotrack_jni.cc
deleted file mode 100644
index 99a272b..0000000
--- a/sdk/android/src/jni/pc/audiotrack_jni.cc
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- *  Copyright 2017 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/api/mediastreaminterface.h"
-#include "webrtc/sdk/android/src/jni/jni_helpers.h"
-
-namespace webrtc {
-namespace jni {
-
-JNI_FUNCTION_DECLARATION(void,
-                         AudioTrack_nativeSetVolume,
-                         JNIEnv*,
-                         jclass,
-                         jlong j_p,
-                         jdouble volume) {
-  rtc::scoped_refptr<AudioSourceInterface> source(
-      reinterpret_cast<AudioTrackInterface*>(j_p)->GetSource());
-  source->SetVolume(volume);
-}
-
-}  // namespace jni
-}  // namespace webrtc
diff --git a/sdk/android/src/jni/pc/callsessionfilerotatinglogsink_jni.cc b/sdk/android/src/jni/pc/callsessionfilerotatinglogsink_jni.cc
deleted file mode 100644
index 739dcaa..0000000
--- a/sdk/android/src/jni/pc/callsessionfilerotatinglogsink_jni.cc
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- *  Copyright 2017 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/rtc_base/logsinks.h"
-#include "webrtc/sdk/android/src/jni/jni_helpers.h"
-
-namespace webrtc {
-namespace jni {
-
-JNI_FUNCTION_DECLARATION(jlong,
-                         CallSessionFileRotatingLogSink_nativeAddSink,
-                         JNIEnv* jni,
-                         jclass,
-                         jstring j_dirPath,
-                         jint j_maxFileSize,
-                         jint j_severity) {
-  std::string dir_path = JavaToStdString(jni, j_dirPath);
-  rtc::CallSessionFileRotatingLogSink* sink =
-      new rtc::CallSessionFileRotatingLogSink(dir_path, j_maxFileSize);
-  if (!sink->Init()) {
-    LOG_V(rtc::LoggingSeverity::LS_WARNING)
-        << "Failed to init CallSessionFileRotatingLogSink for path "
-        << dir_path;
-    delete sink;
-    return 0;
-  }
-  rtc::LogMessage::AddLogToStream(
-      sink, static_cast<rtc::LoggingSeverity>(j_severity));
-  return (jlong)sink;
-}
-
-JNI_FUNCTION_DECLARATION(void,
-                         CallSessionFileRotatingLogSink_nativeDeleteSink,
-                         JNIEnv* jni,
-                         jclass,
-                         jlong j_sink) {
-  rtc::CallSessionFileRotatingLogSink* sink =
-      reinterpret_cast<rtc::CallSessionFileRotatingLogSink*>(j_sink);
-  rtc::LogMessage::RemoveLogToStream(sink);
-  delete sink;
-}
-
-JNI_FUNCTION_DECLARATION(jbyteArray,
-                         CallSessionFileRotatingLogSink_nativeGetLogData,
-                         JNIEnv* jni,
-                         jclass,
-                         jstring j_dirPath) {
-  std::string dir_path = JavaToStdString(jni, j_dirPath);
-  std::unique_ptr<rtc::CallSessionFileRotatingStream> stream(
-      new rtc::CallSessionFileRotatingStream(dir_path));
-  if (!stream->Open()) {
-    LOG_V(rtc::LoggingSeverity::LS_WARNING)
-        << "Failed to open CallSessionFileRotatingStream for path " << dir_path;
-    return jni->NewByteArray(0);
-  }
-  size_t log_size = 0;
-  if (!stream->GetSize(&log_size) || log_size == 0) {
-    LOG_V(rtc::LoggingSeverity::LS_WARNING)
-        << "CallSessionFileRotatingStream returns 0 size for path " << dir_path;
-    return jni->NewByteArray(0);
-  }
-
-  size_t read = 0;
-  std::unique_ptr<jbyte> buffer(static_cast<jbyte*>(malloc(log_size)));
-  stream->ReadAll(buffer.get(), log_size, &read, nullptr);
-
-  jbyteArray result = jni->NewByteArray(read);
-  jni->SetByteArrayRegion(result, 0, read, buffer.get());
-
-  return result;
-}
-
-}  // namespace jni
-}  // namespace webrtc
diff --git a/sdk/android/src/jni/pc/datachannel_jni.cc b/sdk/android/src/jni/pc/datachannel_jni.cc
deleted file mode 100644
index ba28f9b..0000000
--- a/sdk/android/src/jni/pc/datachannel_jni.cc
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- *  Copyright 2017 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 <memory>
-
-#include "webrtc/api/datachannelinterface.h"
-#include "webrtc/sdk/android/src/jni/jni_helpers.h"
-#include "webrtc/sdk/android/src/jni/pc/datachannelobserver_jni.h"
-
-namespace webrtc {
-namespace jni {
-
-static DataChannelInterface* ExtractNativeDC(JNIEnv* jni, jobject j_dc) {
-  jfieldID native_dc_id =
-      GetFieldID(jni, GetObjectClass(jni, j_dc), "nativeDataChannel", "J");
-  jlong j_d = GetLongField(jni, j_dc, native_dc_id);
-  return reinterpret_cast<DataChannelInterface*>(j_d);
-}
-
-JNI_FUNCTION_DECLARATION(jlong,
-                         DataChannel_registerObserverNative,
-                         JNIEnv* jni,
-                         jobject j_dc,
-                         jobject j_observer) {
-  std::unique_ptr<DataChannelObserverJni> observer(
-      new DataChannelObserverJni(jni, j_observer));
-  ExtractNativeDC(jni, j_dc)->RegisterObserver(observer.get());
-  return jlongFromPointer(observer.release());
-}
-
-JNI_FUNCTION_DECLARATION(void,
-                         DataChannel_unregisterObserverNative,
-                         JNIEnv* jni,
-                         jobject j_dc,
-                         jlong native_observer) {
-  ExtractNativeDC(jni, j_dc)->UnregisterObserver();
-  delete reinterpret_cast<DataChannelObserverJni*>(native_observer);
-}
-
-JNI_FUNCTION_DECLARATION(jstring,
-                         DataChannel_label,
-                         JNIEnv* jni,
-                         jobject j_dc) {
-  return JavaStringFromStdString(jni, ExtractNativeDC(jni, j_dc)->label());
-}
-
-JNI_FUNCTION_DECLARATION(jint, DataChannel_id, JNIEnv* jni, jobject j_dc) {
-  int id = ExtractNativeDC(jni, j_dc)->id();
-  RTC_CHECK_LE(id, std::numeric_limits<int32_t>::max())
-      << "id overflowed jint!";
-  return static_cast<jint>(id);
-}
-
-JNI_FUNCTION_DECLARATION(jobject,
-                         DataChannel_state,
-                         JNIEnv* jni,
-                         jobject j_dc) {
-  return JavaEnumFromIndexAndClassName(jni, "DataChannel$State",
-                                       ExtractNativeDC(jni, j_dc)->state());
-}
-
-JNI_FUNCTION_DECLARATION(jlong,
-                         DataChannel_bufferedAmount,
-                         JNIEnv* jni,
-                         jobject j_dc) {
-  uint64_t buffered_amount = ExtractNativeDC(jni, j_dc)->buffered_amount();
-  RTC_CHECK_LE(buffered_amount, std::numeric_limits<int64_t>::max())
-      << "buffered_amount overflowed jlong!";
-  return static_cast<jlong>(buffered_amount);
-}
-
-JNI_FUNCTION_DECLARATION(void, DataChannel_close, JNIEnv* jni, jobject j_dc) {
-  ExtractNativeDC(jni, j_dc)->Close();
-}
-
-JNI_FUNCTION_DECLARATION(jboolean,
-                         DataChannel_sendNative,
-                         JNIEnv* jni,
-                         jobject j_dc,
-                         jbyteArray data,
-                         jboolean binary) {
-  jbyte* bytes = jni->GetByteArrayElements(data, NULL);
-  bool ret = ExtractNativeDC(jni, j_dc)->Send(DataBuffer(
-      rtc::CopyOnWriteBuffer(bytes, jni->GetArrayLength(data)), binary));
-  jni->ReleaseByteArrayElements(data, bytes, JNI_ABORT);
-  return ret;
-}
-
-JNI_FUNCTION_DECLARATION(void, DataChannel_dispose, JNIEnv* jni, jobject j_dc) {
-  CHECK_RELEASE(ExtractNativeDC(jni, j_dc));
-}
-
-}  // namespace jni
-}  // namespace webrtc
diff --git a/sdk/android/src/jni/pc/datachannelobserver_jni.cc b/sdk/android/src/jni/pc/datachannelobserver_jni.cc
deleted file mode 100644
index 32bbab0..0000000
--- a/sdk/android/src/jni/pc/datachannelobserver_jni.cc
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- *  Copyright 2017 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/sdk/android/src/jni/pc/datachannelobserver_jni.h"
-
-#include "webrtc/sdk/android/src/jni/classreferenceholder.h"
-
-namespace webrtc {
-namespace jni {
-
-// Convenience, used since callbacks occur on the signaling thread, which may
-// be a non-Java thread.
-static JNIEnv* jni() {
-  return AttachCurrentThreadIfNeeded();
-}
-
-DataChannelObserverJni::DataChannelObserverJni(JNIEnv* jni, jobject j_observer)
-    : j_observer_global_(jni, j_observer),
-      j_observer_class_(jni, GetObjectClass(jni, j_observer)),
-      j_buffer_class_(jni, FindClass(jni, "org/webrtc/DataChannel$Buffer")),
-      j_on_buffered_amount_change_mid_(GetMethodID(jni,
-                                                   *j_observer_class_,
-                                                   "onBufferedAmountChange",
-                                                   "(J)V")),
-      j_on_state_change_mid_(
-          GetMethodID(jni, *j_observer_class_, "onStateChange", "()V")),
-      j_on_message_mid_(GetMethodID(jni,
-                                    *j_observer_class_,
-                                    "onMessage",
-                                    "(Lorg/webrtc/DataChannel$Buffer;)V")),
-      j_buffer_ctor_(GetMethodID(jni,
-                                 *j_buffer_class_,
-                                 "<init>",
-                                 "(Ljava/nio/ByteBuffer;Z)V")) {}
-
-void DataChannelObserverJni::OnBufferedAmountChange(uint64_t previous_amount) {
-  ScopedLocalRefFrame local_ref_frame(jni());
-  jni()->CallVoidMethod(*j_observer_global_, j_on_buffered_amount_change_mid_,
-                        previous_amount);
-  CHECK_EXCEPTION(jni()) << "error during CallVoidMethod";
-}
-
-void DataChannelObserverJni::OnStateChange() {
-  ScopedLocalRefFrame local_ref_frame(jni());
-  jni()->CallVoidMethod(*j_observer_global_, j_on_state_change_mid_);
-  CHECK_EXCEPTION(jni()) << "error during CallVoidMethod";
-}
-
-void DataChannelObserverJni::OnMessage(const DataBuffer& buffer) {
-  ScopedLocalRefFrame local_ref_frame(jni());
-  jobject byte_buffer = jni()->NewDirectByteBuffer(
-      const_cast<char*>(buffer.data.data<char>()), buffer.data.size());
-  jobject j_buffer = jni()->NewObject(*j_buffer_class_, j_buffer_ctor_,
-                                      byte_buffer, buffer.binary);
-  jni()->CallVoidMethod(*j_observer_global_, j_on_message_mid_, j_buffer);
-  CHECK_EXCEPTION(jni()) << "error during CallVoidMethod";
-}
-
-}  // namespace jni
-}  // namespace webrtc
diff --git a/sdk/android/src/jni/pc/datachannelobserver_jni.h b/sdk/android/src/jni/pc/datachannelobserver_jni.h
deleted file mode 100644
index a9106a2..0000000
--- a/sdk/android/src/jni/pc/datachannelobserver_jni.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- *  Copyright 2017 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_SDK_ANDROID_SRC_JNI_PC_DATACHANNELOBSERVER_JNI_H_
-#define WEBRTC_SDK_ANDROID_SRC_JNI_PC_DATACHANNELOBSERVER_JNI_H_
-
-#include "webrtc/api/datachannelinterface.h"
-#include "webrtc/sdk/android/src/jni/jni_helpers.h"
-
-namespace webrtc {
-namespace jni {
-
-// Adapter for a Java DataChannel$Observer presenting a C++ DataChannelObserver
-// and dispatching the callback from C++ back to Java.
-class DataChannelObserverJni : public DataChannelObserver {
- public:
-  DataChannelObserverJni(JNIEnv* jni, jobject j_observer);
-  virtual ~DataChannelObserverJni() {}
-
-  void OnBufferedAmountChange(uint64_t previous_amount) override;
-  void OnStateChange() override;
-  void OnMessage(const DataBuffer& buffer) override;
-
- private:
-  const ScopedGlobalRef<jobject> j_observer_global_;
-  const ScopedGlobalRef<jclass> j_observer_class_;
-  const ScopedGlobalRef<jclass> j_buffer_class_;
-  const jmethodID j_on_buffered_amount_change_mid_;
-  const jmethodID j_on_state_change_mid_;
-  const jmethodID j_on_message_mid_;
-  const jmethodID j_buffer_ctor_;
-};
-
-}  // namespace jni
-}  // namespace webrtc
-
-#endif  // WEBRTC_SDK_ANDROID_SRC_JNI_PC_DATACHANNELOBSERVER_JNI_H_
diff --git a/sdk/android/src/jni/pc/dtmfsender_jni.cc b/sdk/android/src/jni/pc/dtmfsender_jni.cc
deleted file mode 100644
index 20c0ea7..0000000
--- a/sdk/android/src/jni/pc/dtmfsender_jni.cc
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- *  Copyright 2017 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/api/dtmfsenderinterface.h"
-#include "webrtc/sdk/android/src/jni/jni_helpers.h"
-
-namespace webrtc {
-namespace jni {
-
-JNI_FUNCTION_DECLARATION(jboolean,
-                         DtmfSender_nativeCanInsertDtmf,
-                         JNIEnv* jni,
-                         jclass,
-                         jlong j_dtmf_sender_pointer) {
-  return reinterpret_cast<DtmfSenderInterface*>(j_dtmf_sender_pointer)
-      ->CanInsertDtmf();
-}
-
-JNI_FUNCTION_DECLARATION(jboolean,
-                         DtmfSender_nativeInsertDtmf,
-                         JNIEnv* jni,
-                         jclass,
-                         jlong j_dtmf_sender_pointer,
-                         jstring tones,
-                         jint duration,
-                         jint inter_tone_gap) {
-  return reinterpret_cast<DtmfSenderInterface*>(j_dtmf_sender_pointer)
-      ->InsertDtmf(JavaToStdString(jni, tones), duration, inter_tone_gap);
-}
-
-JNI_FUNCTION_DECLARATION(jstring,
-                         DtmfSender_nativeTones,
-                         JNIEnv* jni,
-                         jclass,
-                         jlong j_dtmf_sender_pointer) {
-  return JavaStringFromStdString(
-      jni,
-      reinterpret_cast<DtmfSenderInterface*>(j_dtmf_sender_pointer)->tones());
-}
-
-JNI_FUNCTION_DECLARATION(jint,
-                         DtmfSender_nativeDuration,
-                         JNIEnv* jni,
-                         jclass,
-                         jlong j_dtmf_sender_pointer) {
-  return reinterpret_cast<DtmfSenderInterface*>(j_dtmf_sender_pointer)
-      ->duration();
-}
-
-JNI_FUNCTION_DECLARATION(jint,
-                         DtmfSender_nativeInterToneGap,
-                         JNIEnv* jni,
-                         jclass,
-                         jlong j_dtmf_sender_pointer) {
-  return reinterpret_cast<DtmfSenderInterface*>(j_dtmf_sender_pointer)
-      ->inter_tone_gap();
-}
-
-}  // namespace jni
-}  // namespace webrtc
diff --git a/sdk/android/src/jni/pc/java_native_conversion.cc b/sdk/android/src/jni/pc/java_native_conversion.cc
deleted file mode 100644
index 1d1a2e5..0000000
--- a/sdk/android/src/jni/pc/java_native_conversion.cc
+++ /dev/null
@@ -1,711 +0,0 @@
-/*
- *  Copyright 2017 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/sdk/android/src/jni/pc/java_native_conversion.h"
-
-#include <string>
-
-#include "webrtc/pc/webrtcsdp.h"
-#include "webrtc/sdk/android/src/jni/classreferenceholder.h"
-
-namespace webrtc {
-namespace jni {
-
-DataChannelInit JavaToNativeDataChannelInit(JNIEnv* jni, jobject j_init) {
-  DataChannelInit init;
-
-  jclass j_init_class = FindClass(jni, "org/webrtc/DataChannel$Init");
-  jfieldID ordered_id = GetFieldID(jni, j_init_class, "ordered", "Z");
-  jfieldID max_retransmit_time_id =
-      GetFieldID(jni, j_init_class, "maxRetransmitTimeMs", "I");
-  jfieldID max_retransmits_id =
-      GetFieldID(jni, j_init_class, "maxRetransmits", "I");
-  jfieldID protocol_id =
-      GetFieldID(jni, j_init_class, "protocol", "Ljava/lang/String;");
-  jfieldID negotiated_id = GetFieldID(jni, j_init_class, "negotiated", "Z");
-  jfieldID id_id = GetFieldID(jni, j_init_class, "id", "I");
-
-  init.ordered = GetBooleanField(jni, j_init, ordered_id);
-  init.maxRetransmitTime = GetIntField(jni, j_init, max_retransmit_time_id);
-  init.maxRetransmits = GetIntField(jni, j_init, max_retransmits_id);
-  init.protocol =
-      JavaToStdString(jni, GetStringField(jni, j_init, protocol_id));
-  init.negotiated = GetBooleanField(jni, j_init, negotiated_id);
-  init.id = GetIntField(jni, j_init, id_id);
-
-  return init;
-}
-
-jobject NativeToJavaMediaType(JNIEnv* jni, cricket::MediaType media_type) {
-  jclass j_media_type_class =
-      FindClass(jni, "org/webrtc/MediaStreamTrack$MediaType");
-
-  const char* media_type_str = nullptr;
-  switch (media_type) {
-    case cricket::MEDIA_TYPE_AUDIO:
-      media_type_str = "MEDIA_TYPE_AUDIO";
-      break;
-    case cricket::MEDIA_TYPE_VIDEO:
-      media_type_str = "MEDIA_TYPE_VIDEO";
-      break;
-    case cricket::MEDIA_TYPE_DATA:
-      RTC_NOTREACHED();
-      break;
-  }
-  jfieldID j_media_type_fid =
-      GetStaticFieldID(jni, j_media_type_class, media_type_str,
-                       "Lorg/webrtc/MediaStreamTrack$MediaType;");
-  return GetStaticObjectField(jni, j_media_type_class, j_media_type_fid);
-}
-
-cricket::MediaType JavaToNativeMediaType(JNIEnv* jni, jobject j_media_type) {
-  jclass j_media_type_class =
-      FindClass(jni, "org/webrtc/MediaStreamTrack$MediaType");
-  jmethodID j_name_id =
-      GetMethodID(jni, j_media_type_class, "name", "()Ljava/lang/String;");
-  jstring j_type_string =
-      (jstring)jni->CallObjectMethod(j_media_type, j_name_id);
-  CHECK_EXCEPTION(jni) << "error during CallObjectMethod";
-  std::string type_string = JavaToStdString(jni, j_type_string);
-
-  RTC_DCHECK(type_string == "MEDIA_TYPE_AUDIO" ||
-             type_string == "MEDIA_TYPE_VIDEO")
-      << "Media type: " << type_string;
-  return type_string == "MEDIA_TYPE_AUDIO" ? cricket::MEDIA_TYPE_AUDIO
-                                           : cricket::MEDIA_TYPE_VIDEO;
-}
-
-cricket::Candidate JavaToNativeCandidate(JNIEnv* jni, jobject j_candidate) {
-  jclass j_candidate_class = GetObjectClass(jni, j_candidate);
-  jfieldID j_sdp_mid_id =
-      GetFieldID(jni, j_candidate_class, "sdpMid", "Ljava/lang/String;");
-  std::string sdp_mid =
-      JavaToStdString(jni, GetStringField(jni, j_candidate, j_sdp_mid_id));
-  jfieldID j_sdp_id =
-      GetFieldID(jni, j_candidate_class, "sdp", "Ljava/lang/String;");
-  std::string sdp =
-      JavaToStdString(jni, GetStringField(jni, j_candidate, j_sdp_id));
-  cricket::Candidate candidate;
-  if (!SdpDeserializeCandidate(sdp_mid, sdp, &candidate, NULL)) {
-    LOG(LS_ERROR) << "SdpDescrializeCandidate failed with sdp " << sdp;
-  }
-  return candidate;
-}
-
-jobject NativeToJavaCandidate(JNIEnv* jni,
-                              jclass* candidate_class,
-                              const cricket::Candidate& candidate) {
-  std::string sdp = SdpSerializeCandidate(candidate);
-  RTC_CHECK(!sdp.empty()) << "got an empty ICE candidate";
-  jmethodID ctor = GetMethodID(jni, *candidate_class, "<init>",
-                               "(Ljava/lang/String;ILjava/lang/String;)V");
-  jstring j_mid = JavaStringFromStdString(jni, candidate.transport_name());
-  jstring j_sdp = JavaStringFromStdString(jni, sdp);
-  // sdp_mline_index is not used, pass an invalid value -1.
-  jobject j_candidate =
-      jni->NewObject(*candidate_class, ctor, j_mid, -1, j_sdp);
-  CHECK_EXCEPTION(jni) << "error during Java Candidate NewObject";
-  return j_candidate;
-}
-
-jobjectArray NativeToJavaCandidateArray(
-    JNIEnv* jni,
-    const std::vector<cricket::Candidate>& candidates) {
-  jclass candidate_class = FindClass(jni, "org/webrtc/IceCandidate");
-  jobjectArray java_candidates =
-      jni->NewObjectArray(candidates.size(), candidate_class, NULL);
-  int i = 0;
-  for (const cricket::Candidate& candidate : candidates) {
-    jobject j_candidate =
-        NativeToJavaCandidate(jni, &candidate_class, candidate);
-    jni->SetObjectArrayElement(java_candidates, i++, j_candidate);
-  }
-  return java_candidates;
-}
-
-SessionDescriptionInterface* JavaToNativeSessionDescription(JNIEnv* jni,
-                                                            jobject j_sdp) {
-  jfieldID j_type_id = GetFieldID(jni, GetObjectClass(jni, j_sdp), "type",
-                                  "Lorg/webrtc/SessionDescription$Type;");
-  jobject j_type = GetObjectField(jni, j_sdp, j_type_id);
-  jmethodID j_canonical_form_id =
-      GetMethodID(jni, GetObjectClass(jni, j_type), "canonicalForm",
-                  "()Ljava/lang/String;");
-  jstring j_type_string =
-      (jstring)jni->CallObjectMethod(j_type, j_canonical_form_id);
-  CHECK_EXCEPTION(jni) << "error during CallObjectMethod";
-  std::string std_type = JavaToStdString(jni, j_type_string);
-
-  jfieldID j_description_id = GetFieldID(jni, GetObjectClass(jni, j_sdp),
-                                         "description", "Ljava/lang/String;");
-  jstring j_description = (jstring)GetObjectField(jni, j_sdp, j_description_id);
-  std::string std_description = JavaToStdString(jni, j_description);
-
-  return CreateSessionDescription(std_type, std_description, NULL);
-}
-
-jobject NativeToJavaSessionDescription(
-    JNIEnv* jni,
-    const SessionDescriptionInterface* desc) {
-  std::string sdp;
-  RTC_CHECK(desc->ToString(&sdp)) << "got so far: " << sdp;
-  jstring j_description = JavaStringFromStdString(jni, sdp);
-
-  jclass j_type_class = FindClass(jni, "org/webrtc/SessionDescription$Type");
-  jmethodID j_type_from_canonical = GetStaticMethodID(
-      jni, j_type_class, "fromCanonicalForm",
-      "(Ljava/lang/String;)Lorg/webrtc/SessionDescription$Type;");
-  jstring j_type_string = JavaStringFromStdString(jni, desc->type());
-  jobject j_type = jni->CallStaticObjectMethod(
-      j_type_class, j_type_from_canonical, j_type_string);
-  CHECK_EXCEPTION(jni) << "error during CallObjectMethod";
-
-  jclass j_sdp_class = FindClass(jni, "org/webrtc/SessionDescription");
-  jmethodID j_sdp_ctor =
-      GetMethodID(jni, j_sdp_class, "<init>",
-                  "(Lorg/webrtc/SessionDescription$Type;Ljava/lang/String;)V");
-  jobject j_sdp =
-      jni->NewObject(j_sdp_class, j_sdp_ctor, j_type, j_description);
-  CHECK_EXCEPTION(jni) << "error during NewObject";
-  return j_sdp;
-}
-
-PeerConnectionFactoryInterface::Options
-JavaToNativePeerConnectionFactoryOptions(JNIEnv* jni, jobject options) {
-  jclass options_class = jni->GetObjectClass(options);
-  jfieldID network_ignore_mask_field =
-      jni->GetFieldID(options_class, "networkIgnoreMask", "I");
-  int network_ignore_mask =
-      jni->GetIntField(options, network_ignore_mask_field);
-
-  jfieldID disable_encryption_field =
-      jni->GetFieldID(options_class, "disableEncryption", "Z");
-  bool disable_encryption =
-      jni->GetBooleanField(options, disable_encryption_field);
-
-  jfieldID disable_network_monitor_field =
-      jni->GetFieldID(options_class, "disableNetworkMonitor", "Z");
-  bool disable_network_monitor =
-      jni->GetBooleanField(options, disable_network_monitor_field);
-
-  PeerConnectionFactoryInterface::Options native_options;
-
-  // This doesn't necessarily match the c++ version of this struct; feel free
-  // to add more parameters as necessary.
-  native_options.network_ignore_mask = network_ignore_mask;
-  native_options.disable_encryption = disable_encryption;
-  native_options.disable_network_monitor = disable_network_monitor;
-  return native_options;
-}
-
-PeerConnectionInterface::IceTransportsType JavaToNativeIceTransportsType(
-    JNIEnv* jni,
-    jobject j_ice_transports_type) {
-  std::string enum_name =
-      GetJavaEnumName(jni, "org/webrtc/PeerConnection$IceTransportsType",
-                      j_ice_transports_type);
-
-  if (enum_name == "ALL")
-    return PeerConnectionInterface::kAll;
-
-  if (enum_name == "RELAY")
-    return PeerConnectionInterface::kRelay;
-
-  if (enum_name == "NOHOST")
-    return PeerConnectionInterface::kNoHost;
-
-  if (enum_name == "NONE")
-    return PeerConnectionInterface::kNone;
-
-  RTC_CHECK(false) << "Unexpected IceTransportsType enum_name " << enum_name;
-  return PeerConnectionInterface::kAll;
-}
-
-PeerConnectionInterface::BundlePolicy JavaToNativeBundlePolicy(
-    JNIEnv* jni,
-    jobject j_bundle_policy) {
-  std::string enum_name = GetJavaEnumName(
-      jni, "org/webrtc/PeerConnection$BundlePolicy", j_bundle_policy);
-
-  if (enum_name == "BALANCED")
-    return PeerConnectionInterface::kBundlePolicyBalanced;
-
-  if (enum_name == "MAXBUNDLE")
-    return PeerConnectionInterface::kBundlePolicyMaxBundle;
-
-  if (enum_name == "MAXCOMPAT")
-    return PeerConnectionInterface::kBundlePolicyMaxCompat;
-
-  RTC_CHECK(false) << "Unexpected BundlePolicy enum_name " << enum_name;
-  return PeerConnectionInterface::kBundlePolicyBalanced;
-}
-
-PeerConnectionInterface::RtcpMuxPolicy JavaToNativeRtcpMuxPolicy(
-    JNIEnv* jni,
-    jobject j_rtcp_mux_policy) {
-  std::string enum_name = GetJavaEnumName(
-      jni, "org/webrtc/PeerConnection$RtcpMuxPolicy", j_rtcp_mux_policy);
-
-  if (enum_name == "NEGOTIATE")
-    return PeerConnectionInterface::kRtcpMuxPolicyNegotiate;
-
-  if (enum_name == "REQUIRE")
-    return PeerConnectionInterface::kRtcpMuxPolicyRequire;
-
-  RTC_CHECK(false) << "Unexpected RtcpMuxPolicy enum_name " << enum_name;
-  return PeerConnectionInterface::kRtcpMuxPolicyNegotiate;
-}
-
-PeerConnectionInterface::TcpCandidatePolicy JavaToNativeTcpCandidatePolicy(
-    JNIEnv* jni,
-    jobject j_tcp_candidate_policy) {
-  std::string enum_name =
-      GetJavaEnumName(jni, "org/webrtc/PeerConnection$TcpCandidatePolicy",
-                      j_tcp_candidate_policy);
-
-  if (enum_name == "ENABLED")
-    return PeerConnectionInterface::kTcpCandidatePolicyEnabled;
-
-  if (enum_name == "DISABLED")
-    return PeerConnectionInterface::kTcpCandidatePolicyDisabled;
-
-  RTC_CHECK(false) << "Unexpected TcpCandidatePolicy enum_name " << enum_name;
-  return PeerConnectionInterface::kTcpCandidatePolicyEnabled;
-}
-
-PeerConnectionInterface::CandidateNetworkPolicy
-JavaToNativeCandidateNetworkPolicy(JNIEnv* jni,
-                                   jobject j_candidate_network_policy) {
-  std::string enum_name =
-      GetJavaEnumName(jni, "org/webrtc/PeerConnection$CandidateNetworkPolicy",
-                      j_candidate_network_policy);
-
-  if (enum_name == "ALL")
-    return PeerConnectionInterface::kCandidateNetworkPolicyAll;
-
-  if (enum_name == "LOW_COST")
-    return PeerConnectionInterface::kCandidateNetworkPolicyLowCost;
-
-  RTC_CHECK(false) << "Unexpected CandidateNetworkPolicy enum_name "
-                   << enum_name;
-  return PeerConnectionInterface::kCandidateNetworkPolicyAll;
-}
-
-rtc::KeyType JavaToNativeKeyType(JNIEnv* jni, jobject j_key_type) {
-  std::string enum_name =
-      GetJavaEnumName(jni, "org/webrtc/PeerConnection$KeyType", j_key_type);
-
-  if (enum_name == "RSA")
-    return rtc::KT_RSA;
-  if (enum_name == "ECDSA")
-    return rtc::KT_ECDSA;
-
-  RTC_CHECK(false) << "Unexpected KeyType enum_name " << enum_name;
-  return rtc::KT_ECDSA;
-}
-
-PeerConnectionInterface::ContinualGatheringPolicy
-JavaToNativeContinualGatheringPolicy(JNIEnv* jni, jobject j_gathering_policy) {
-  std::string enum_name =
-      GetJavaEnumName(jni, "org/webrtc/PeerConnection$ContinualGatheringPolicy",
-                      j_gathering_policy);
-  if (enum_name == "GATHER_ONCE")
-    return PeerConnectionInterface::GATHER_ONCE;
-
-  if (enum_name == "GATHER_CONTINUALLY")
-    return PeerConnectionInterface::GATHER_CONTINUALLY;
-
-  RTC_CHECK(false) << "Unexpected ContinualGatheringPolicy enum name "
-                   << enum_name;
-  return PeerConnectionInterface::GATHER_ONCE;
-}
-
-PeerConnectionInterface::TlsCertPolicy JavaToNativeTlsCertPolicy(
-    JNIEnv* jni,
-    jobject j_ice_server_tls_cert_policy) {
-  std::string enum_name =
-      GetJavaEnumName(jni, "org/webrtc/PeerConnection$TlsCertPolicy",
-                      j_ice_server_tls_cert_policy);
-
-  if (enum_name == "TLS_CERT_POLICY_SECURE")
-    return PeerConnectionInterface::kTlsCertPolicySecure;
-
-  if (enum_name == "TLS_CERT_POLICY_INSECURE_NO_CHECK")
-    return PeerConnectionInterface::kTlsCertPolicyInsecureNoCheck;
-
-  RTC_CHECK(false) << "Unexpected TlsCertPolicy enum_name " << enum_name;
-  return PeerConnectionInterface::kTlsCertPolicySecure;
-}
-
-void JavaToNativeIceServers(JNIEnv* jni,
-                            jobject j_ice_servers,
-                            PeerConnectionInterface::IceServers* ice_servers) {
-  for (jobject j_ice_server : Iterable(jni, j_ice_servers)) {
-    jclass j_ice_server_class = GetObjectClass(jni, j_ice_server);
-    jfieldID j_ice_server_urls_id =
-        GetFieldID(jni, j_ice_server_class, "urls", "Ljava/util/List;");
-    jfieldID j_ice_server_username_id =
-        GetFieldID(jni, j_ice_server_class, "username", "Ljava/lang/String;");
-    jfieldID j_ice_server_password_id =
-        GetFieldID(jni, j_ice_server_class, "password", "Ljava/lang/String;");
-    jfieldID j_ice_server_tls_cert_policy_id =
-        GetFieldID(jni, j_ice_server_class, "tlsCertPolicy",
-                   "Lorg/webrtc/PeerConnection$TlsCertPolicy;");
-    jobject j_ice_server_tls_cert_policy =
-        GetObjectField(jni, j_ice_server, j_ice_server_tls_cert_policy_id);
-    jfieldID j_ice_server_hostname_id =
-        GetFieldID(jni, j_ice_server_class, "hostname", "Ljava/lang/String;");
-    jfieldID j_ice_server_tls_alpn_protocols_id = GetFieldID(
-        jni, j_ice_server_class, "tlsAlpnProtocols", "Ljava/util/List;");
-    jfieldID j_ice_server_tls_elliptic_curves_id = GetFieldID(
-        jni, j_ice_server_class, "tlsEllipticCurves", "Ljava/util/List;");
-    jobject urls = GetObjectField(jni, j_ice_server, j_ice_server_urls_id);
-    jstring username = reinterpret_cast<jstring>(
-        GetObjectField(jni, j_ice_server, j_ice_server_username_id));
-    jstring password = reinterpret_cast<jstring>(
-        GetObjectField(jni, j_ice_server, j_ice_server_password_id));
-    PeerConnectionInterface::TlsCertPolicy tls_cert_policy =
-        JavaToNativeTlsCertPolicy(jni, j_ice_server_tls_cert_policy);
-    jstring hostname = reinterpret_cast<jstring>(
-        GetObjectField(jni, j_ice_server, j_ice_server_hostname_id));
-    jobject tls_alpn_protocols = GetNullableObjectField(
-        jni, j_ice_server, j_ice_server_tls_alpn_protocols_id);
-    jobject tls_elliptic_curves = GetNullableObjectField(
-        jni, j_ice_server, j_ice_server_tls_elliptic_curves_id);
-    PeerConnectionInterface::IceServer server;
-    server.urls = JavaToStdVectorStrings(jni, urls);
-    server.username = JavaToStdString(jni, username);
-    server.password = JavaToStdString(jni, password);
-    server.tls_cert_policy = tls_cert_policy;
-    server.hostname = JavaToStdString(jni, hostname);
-    server.tls_alpn_protocols = JavaToStdVectorStrings(jni, tls_alpn_protocols);
-    server.tls_elliptic_curves =
-        JavaToStdVectorStrings(jni, tls_elliptic_curves);
-    ice_servers->push_back(server);
-  }
-}
-
-void JavaToNativeRTCConfiguration(
-    JNIEnv* jni,
-    jobject j_rtc_config,
-    PeerConnectionInterface::RTCConfiguration* rtc_config) {
-  jclass j_rtc_config_class = GetObjectClass(jni, j_rtc_config);
-
-  jfieldID j_ice_transports_type_id =
-      GetFieldID(jni, j_rtc_config_class, "iceTransportsType",
-                 "Lorg/webrtc/PeerConnection$IceTransportsType;");
-  jobject j_ice_transports_type =
-      GetObjectField(jni, j_rtc_config, j_ice_transports_type_id);
-
-  jfieldID j_bundle_policy_id =
-      GetFieldID(jni, j_rtc_config_class, "bundlePolicy",
-                 "Lorg/webrtc/PeerConnection$BundlePolicy;");
-  jobject j_bundle_policy =
-      GetObjectField(jni, j_rtc_config, j_bundle_policy_id);
-
-  jfieldID j_rtcp_mux_policy_id =
-      GetFieldID(jni, j_rtc_config_class, "rtcpMuxPolicy",
-                 "Lorg/webrtc/PeerConnection$RtcpMuxPolicy;");
-  jobject j_rtcp_mux_policy =
-      GetObjectField(jni, j_rtc_config, j_rtcp_mux_policy_id);
-
-  jfieldID j_tcp_candidate_policy_id =
-      GetFieldID(jni, j_rtc_config_class, "tcpCandidatePolicy",
-                 "Lorg/webrtc/PeerConnection$TcpCandidatePolicy;");
-  jobject j_tcp_candidate_policy =
-      GetObjectField(jni, j_rtc_config, j_tcp_candidate_policy_id);
-
-  jfieldID j_candidate_network_policy_id =
-      GetFieldID(jni, j_rtc_config_class, "candidateNetworkPolicy",
-                 "Lorg/webrtc/PeerConnection$CandidateNetworkPolicy;");
-  jobject j_candidate_network_policy =
-      GetObjectField(jni, j_rtc_config, j_candidate_network_policy_id);
-
-  jfieldID j_ice_servers_id =
-      GetFieldID(jni, j_rtc_config_class, "iceServers", "Ljava/util/List;");
-  jobject j_ice_servers = GetObjectField(jni, j_rtc_config, j_ice_servers_id);
-
-  jfieldID j_audio_jitter_buffer_max_packets_id =
-      GetFieldID(jni, j_rtc_config_class, "audioJitterBufferMaxPackets", "I");
-  jfieldID j_audio_jitter_buffer_fast_accelerate_id = GetFieldID(
-      jni, j_rtc_config_class, "audioJitterBufferFastAccelerate", "Z");
-
-  jfieldID j_ice_connection_receiving_timeout_id =
-      GetFieldID(jni, j_rtc_config_class, "iceConnectionReceivingTimeout", "I");
-
-  jfieldID j_ice_backup_candidate_pair_ping_interval_id = GetFieldID(
-      jni, j_rtc_config_class, "iceBackupCandidatePairPingInterval", "I");
-
-  jfieldID j_continual_gathering_policy_id =
-      GetFieldID(jni, j_rtc_config_class, "continualGatheringPolicy",
-                 "Lorg/webrtc/PeerConnection$ContinualGatheringPolicy;");
-  jobject j_continual_gathering_policy =
-      GetObjectField(jni, j_rtc_config, j_continual_gathering_policy_id);
-
-  jfieldID j_ice_candidate_pool_size_id =
-      GetFieldID(jni, j_rtc_config_class, "iceCandidatePoolSize", "I");
-  jfieldID j_presume_writable_when_fully_relayed_id = GetFieldID(
-      jni, j_rtc_config_class, "presumeWritableWhenFullyRelayed", "Z");
-
-  jfieldID j_prune_turn_ports_id =
-      GetFieldID(jni, j_rtc_config_class, "pruneTurnPorts", "Z");
-
-  jfieldID j_ice_check_min_interval_id = GetFieldID(
-      jni, j_rtc_config_class, "iceCheckMinInterval", "Ljava/lang/Integer;");
-  jclass j_integer_class = jni->FindClass("java/lang/Integer");
-  jmethodID int_value_id = GetMethodID(jni, j_integer_class, "intValue", "()I");
-
-  jfieldID j_disable_ipv6_on_wifi_id =
-      GetFieldID(jni, j_rtc_config_class, "disableIPv6OnWifi", "Z");
-
-  jfieldID j_max_ipv6_networks_id =
-      GetFieldID(jni, j_rtc_config_class, "maxIPv6Networks", "I");
-
-  jfieldID j_ice_regather_interval_range_id =
-      GetFieldID(jni, j_rtc_config_class, "iceRegatherIntervalRange",
-                 "Lorg/webrtc/PeerConnection$IntervalRange;");
-  jclass j_interval_range_class =
-      jni->FindClass("org/webrtc/PeerConnection$IntervalRange");
-  jmethodID get_min_id =
-      GetMethodID(jni, j_interval_range_class, "getMin", "()I");
-  jmethodID get_max_id =
-      GetMethodID(jni, j_interval_range_class, "getMax", "()I");
-
-  rtc_config->type = JavaToNativeIceTransportsType(jni, j_ice_transports_type);
-  rtc_config->bundle_policy = JavaToNativeBundlePolicy(jni, j_bundle_policy);
-  rtc_config->rtcp_mux_policy =
-      JavaToNativeRtcpMuxPolicy(jni, j_rtcp_mux_policy);
-  rtc_config->tcp_candidate_policy =
-      JavaToNativeTcpCandidatePolicy(jni, j_tcp_candidate_policy);
-  rtc_config->candidate_network_policy =
-      JavaToNativeCandidateNetworkPolicy(jni, j_candidate_network_policy);
-  JavaToNativeIceServers(jni, j_ice_servers, &rtc_config->servers);
-  rtc_config->audio_jitter_buffer_max_packets =
-      GetIntField(jni, j_rtc_config, j_audio_jitter_buffer_max_packets_id);
-  rtc_config->audio_jitter_buffer_fast_accelerate = GetBooleanField(
-      jni, j_rtc_config, j_audio_jitter_buffer_fast_accelerate_id);
-  rtc_config->ice_connection_receiving_timeout =
-      GetIntField(jni, j_rtc_config, j_ice_connection_receiving_timeout_id);
-  rtc_config->ice_backup_candidate_pair_ping_interval = GetIntField(
-      jni, j_rtc_config, j_ice_backup_candidate_pair_ping_interval_id);
-  rtc_config->continual_gathering_policy =
-      JavaToNativeContinualGatheringPolicy(jni, j_continual_gathering_policy);
-  rtc_config->ice_candidate_pool_size =
-      GetIntField(jni, j_rtc_config, j_ice_candidate_pool_size_id);
-  rtc_config->prune_turn_ports =
-      GetBooleanField(jni, j_rtc_config, j_prune_turn_ports_id);
-  rtc_config->presume_writable_when_fully_relayed = GetBooleanField(
-      jni, j_rtc_config, j_presume_writable_when_fully_relayed_id);
-  jobject j_ice_check_min_interval =
-      GetNullableObjectField(jni, j_rtc_config, j_ice_check_min_interval_id);
-  if (!IsNull(jni, j_ice_check_min_interval)) {
-    int ice_check_min_interval_value =
-        jni->CallIntMethod(j_ice_check_min_interval, int_value_id);
-    rtc_config->ice_check_min_interval =
-        rtc::Optional<int>(ice_check_min_interval_value);
-  }
-  rtc_config->disable_ipv6_on_wifi =
-      GetBooleanField(jni, j_rtc_config, j_disable_ipv6_on_wifi_id);
-  rtc_config->max_ipv6_networks =
-      GetIntField(jni, j_rtc_config, j_max_ipv6_networks_id);
-  jobject j_ice_regather_interval_range = GetNullableObjectField(
-      jni, j_rtc_config, j_ice_regather_interval_range_id);
-  if (!IsNull(jni, j_ice_regather_interval_range)) {
-    int min = jni->CallIntMethod(j_ice_regather_interval_range, get_min_id);
-    int max = jni->CallIntMethod(j_ice_regather_interval_range, get_max_id);
-    rtc_config->ice_regather_interval_range.emplace(min, max);
-  }
-}
-
-void JavaToNativeRtpParameters(JNIEnv* jni,
-                               jobject j_parameters,
-                               RtpParameters* parameters) {
-  RTC_CHECK(parameters != nullptr);
-  jclass parameters_class = jni->FindClass("org/webrtc/RtpParameters");
-  jfieldID encodings_id =
-      GetFieldID(jni, parameters_class, "encodings", "Ljava/util/LinkedList;");
-  jfieldID codecs_id =
-      GetFieldID(jni, parameters_class, "codecs", "Ljava/util/LinkedList;");
-
-  // Convert encodings.
-  jobject j_encodings = GetObjectField(jni, j_parameters, encodings_id);
-  jclass j_encoding_parameters_class =
-      jni->FindClass("org/webrtc/RtpParameters$Encoding");
-  jfieldID active_id =
-      GetFieldID(jni, j_encoding_parameters_class, "active", "Z");
-  jfieldID bitrate_id = GetFieldID(jni, j_encoding_parameters_class,
-                                   "maxBitrateBps", "Ljava/lang/Integer;");
-  jfieldID ssrc_id =
-      GetFieldID(jni, j_encoding_parameters_class, "ssrc", "Ljava/lang/Long;");
-  jclass j_integer_class = jni->FindClass("java/lang/Integer");
-  jclass j_long_class = jni->FindClass("java/lang/Long");
-  jmethodID int_value_id = GetMethodID(jni, j_integer_class, "intValue", "()I");
-  jmethodID long_value_id = GetMethodID(jni, j_long_class, "longValue", "()J");
-
-  for (jobject j_encoding_parameters : Iterable(jni, j_encodings)) {
-    RtpEncodingParameters encoding;
-    encoding.active = GetBooleanField(jni, j_encoding_parameters, active_id);
-    jobject j_bitrate =
-        GetNullableObjectField(jni, j_encoding_parameters, bitrate_id);
-    if (!IsNull(jni, j_bitrate)) {
-      int bitrate_value = jni->CallIntMethod(j_bitrate, int_value_id);
-      CHECK_EXCEPTION(jni) << "error during CallIntMethod";
-      encoding.max_bitrate_bps = rtc::Optional<int>(bitrate_value);
-    }
-    jobject j_ssrc =
-        GetNullableObjectField(jni, j_encoding_parameters, ssrc_id);
-    if (!IsNull(jni, j_ssrc)) {
-      jlong ssrc_value = jni->CallLongMethod(j_ssrc, long_value_id);
-      CHECK_EXCEPTION(jni) << "error during CallLongMethod";
-      encoding.ssrc = rtc::Optional<uint32_t>(ssrc_value);
-    }
-    parameters->encodings.push_back(encoding);
-  }
-
-  // Convert codecs.
-  jobject j_codecs = GetObjectField(jni, j_parameters, codecs_id);
-  jclass codec_class = jni->FindClass("org/webrtc/RtpParameters$Codec");
-  jfieldID payload_type_id = GetFieldID(jni, codec_class, "payloadType", "I");
-  jfieldID name_id = GetFieldID(jni, codec_class, "name", "Ljava/lang/String;");
-  jfieldID kind_id = GetFieldID(jni, codec_class, "kind",
-                                "Lorg/webrtc/MediaStreamTrack$MediaType;");
-  jfieldID clock_rate_id =
-      GetFieldID(jni, codec_class, "clockRate", "Ljava/lang/Integer;");
-  jfieldID num_channels_id =
-      GetFieldID(jni, codec_class, "numChannels", "Ljava/lang/Integer;");
-
-  for (jobject j_codec : Iterable(jni, j_codecs)) {
-    RtpCodecParameters codec;
-    codec.payload_type = GetIntField(jni, j_codec, payload_type_id);
-    codec.name = JavaToStdString(jni, GetStringField(jni, j_codec, name_id));
-    codec.kind =
-        JavaToNativeMediaType(jni, GetObjectField(jni, j_codec, kind_id));
-    jobject j_clock_rate = GetNullableObjectField(jni, j_codec, clock_rate_id);
-    if (!IsNull(jni, j_clock_rate)) {
-      int clock_rate_value = jni->CallIntMethod(j_clock_rate, int_value_id);
-      CHECK_EXCEPTION(jni) << "error during CallIntMethod";
-      codec.clock_rate = rtc::Optional<int>(clock_rate_value);
-    }
-    jobject j_num_channels =
-        GetNullableObjectField(jni, j_codec, num_channels_id);
-    if (!IsNull(jni, j_num_channels)) {
-      int num_channels_value = jni->CallIntMethod(j_num_channels, int_value_id);
-      CHECK_EXCEPTION(jni) << "error during CallIntMethod";
-      codec.num_channels = rtc::Optional<int>(num_channels_value);
-    }
-    parameters->codecs.push_back(codec);
-  }
-}
-
-jobject NativeToJavaRtpParameters(JNIEnv* jni,
-                                  const RtpParameters& parameters) {
-  jclass parameters_class = jni->FindClass("org/webrtc/RtpParameters");
-  jmethodID parameters_ctor =
-      GetMethodID(jni, parameters_class, "<init>", "()V");
-  jobject j_parameters = jni->NewObject(parameters_class, parameters_ctor);
-  CHECK_EXCEPTION(jni) << "error during NewObject";
-
-  // Add encodings.
-  jclass encoding_class = jni->FindClass("org/webrtc/RtpParameters$Encoding");
-  jmethodID encoding_ctor = GetMethodID(jni, encoding_class, "<init>", "()V");
-  jfieldID encodings_id =
-      GetFieldID(jni, parameters_class, "encodings", "Ljava/util/LinkedList;");
-  jobject j_encodings = GetObjectField(jni, j_parameters, encodings_id);
-  jmethodID encodings_add = GetMethodID(jni, GetObjectClass(jni, j_encodings),
-                                        "add", "(Ljava/lang/Object;)Z");
-  jfieldID active_id = GetFieldID(jni, encoding_class, "active", "Z");
-  jfieldID bitrate_id =
-      GetFieldID(jni, encoding_class, "maxBitrateBps", "Ljava/lang/Integer;");
-  jfieldID ssrc_id =
-      GetFieldID(jni, encoding_class, "ssrc", "Ljava/lang/Long;");
-
-  jclass integer_class = jni->FindClass("java/lang/Integer");
-  jclass long_class = jni->FindClass("java/lang/Long");
-  jmethodID integer_ctor = GetMethodID(jni, integer_class, "<init>", "(I)V");
-  jmethodID long_ctor = GetMethodID(jni, long_class, "<init>", "(J)V");
-
-  for (const RtpEncodingParameters& encoding : parameters.encodings) {
-    jobject j_encoding_parameters =
-        jni->NewObject(encoding_class, encoding_ctor);
-    CHECK_EXCEPTION(jni) << "error during NewObject";
-    jni->SetBooleanField(j_encoding_parameters, active_id, encoding.active);
-    CHECK_EXCEPTION(jni) << "error during SetBooleanField";
-    if (encoding.max_bitrate_bps) {
-      jobject j_bitrate_value = jni->NewObject(integer_class, integer_ctor,
-                                               *(encoding.max_bitrate_bps));
-      CHECK_EXCEPTION(jni) << "error during NewObject";
-      jni->SetObjectField(j_encoding_parameters, bitrate_id, j_bitrate_value);
-      CHECK_EXCEPTION(jni) << "error during SetObjectField";
-    }
-    if (encoding.ssrc) {
-      jobject j_ssrc_value = jni->NewObject(long_class, long_ctor,
-                                            static_cast<jlong>(*encoding.ssrc));
-      CHECK_EXCEPTION(jni) << "error during NewObject";
-      jni->SetObjectField(j_encoding_parameters, ssrc_id, j_ssrc_value);
-      CHECK_EXCEPTION(jni) << "error during SetObjectField";
-    }
-    jboolean added = jni->CallBooleanMethod(j_encodings, encodings_add,
-                                            j_encoding_parameters);
-    CHECK_EXCEPTION(jni) << "error during CallBooleanMethod";
-    RTC_CHECK(added);
-  }
-
-  // Add codecs.
-  jclass codec_class = jni->FindClass("org/webrtc/RtpParameters$Codec");
-  jmethodID codec_ctor = GetMethodID(jni, codec_class, "<init>", "()V");
-  jfieldID codecs_id =
-      GetFieldID(jni, parameters_class, "codecs", "Ljava/util/LinkedList;");
-  jobject j_codecs = GetObjectField(jni, j_parameters, codecs_id);
-  jmethodID codecs_add = GetMethodID(jni, GetObjectClass(jni, j_codecs), "add",
-                                     "(Ljava/lang/Object;)Z");
-  jfieldID payload_type_id = GetFieldID(jni, codec_class, "payloadType", "I");
-  jfieldID name_id = GetFieldID(jni, codec_class, "name", "Ljava/lang/String;");
-  jfieldID kind_id = GetFieldID(jni, codec_class, "kind",
-                                "Lorg/webrtc/MediaStreamTrack$MediaType;");
-  jfieldID clock_rate_id =
-      GetFieldID(jni, codec_class, "clockRate", "Ljava/lang/Integer;");
-  jfieldID num_channels_id =
-      GetFieldID(jni, codec_class, "numChannels", "Ljava/lang/Integer;");
-
-  for (const RtpCodecParameters& codec : parameters.codecs) {
-    jobject j_codec = jni->NewObject(codec_class, codec_ctor);
-    CHECK_EXCEPTION(jni) << "error during NewObject";
-    jni->SetIntField(j_codec, payload_type_id, codec.payload_type);
-    CHECK_EXCEPTION(jni) << "error during SetIntField";
-    jni->SetObjectField(j_codec, name_id,
-                        JavaStringFromStdString(jni, codec.name));
-    CHECK_EXCEPTION(jni) << "error during SetObjectField";
-    jni->SetObjectField(j_codec, kind_id,
-                        NativeToJavaMediaType(jni, codec.kind));
-    CHECK_EXCEPTION(jni) << "error during SetObjectField";
-    if (codec.clock_rate) {
-      jobject j_clock_rate_value =
-          jni->NewObject(integer_class, integer_ctor, *(codec.clock_rate));
-      CHECK_EXCEPTION(jni) << "error during NewObject";
-      jni->SetObjectField(j_codec, clock_rate_id, j_clock_rate_value);
-      CHECK_EXCEPTION(jni) << "error during SetObjectField";
-    }
-    if (codec.num_channels) {
-      jobject j_num_channels_value =
-          jni->NewObject(integer_class, integer_ctor, *(codec.num_channels));
-      CHECK_EXCEPTION(jni) << "error during NewObject";
-      jni->SetObjectField(j_codec, num_channels_id, j_num_channels_value);
-      CHECK_EXCEPTION(jni) << "error during SetObjectField";
-    }
-    jboolean added = jni->CallBooleanMethod(j_codecs, codecs_add, j_codec);
-    CHECK_EXCEPTION(jni) << "error during CallBooleanMethod";
-    RTC_CHECK(added);
-  }
-
-  return j_parameters;
-}
-
-}  // namespace jni
-}  // namespace webrtc
diff --git a/sdk/android/src/jni/pc/java_native_conversion.h b/sdk/android/src/jni/pc/java_native_conversion.h
deleted file mode 100644
index dc91c13..0000000
--- a/sdk/android/src/jni/pc/java_native_conversion.h
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- *  Copyright 2017 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_SDK_ANDROID_SRC_JNI_PC_JAVA_NATIVE_CONVERSION_H_
-#define WEBRTC_SDK_ANDROID_SRC_JNI_PC_JAVA_NATIVE_CONVERSION_H_
-
-#include <vector>
-
-#include "webrtc/api/datachannelinterface.h"
-#include "webrtc/api/jsep.h"
-#include "webrtc/api/jsepicecandidate.h"
-#include "webrtc/api/mediastreaminterface.h"
-#include "webrtc/api/mediatypes.h"
-#include "webrtc/api/peerconnectioninterface.h"
-#include "webrtc/api/rtpparameters.h"
-#include "webrtc/rtc_base/sslidentity.h"
-#include "webrtc/sdk/android/src/jni/jni_helpers.h"
-
-// This file contains helper methods for converting between simple C++ and Java
-// PeerConnection-related structures. Similar to some methods in jni_helpers.h,
-// but specifically for structures tied to the PeerConnection API.
-
-namespace webrtc {
-namespace jni {
-
-DataChannelInit JavaToNativeDataChannelInit(JNIEnv* jni, jobject j_init);
-
-cricket::MediaType JavaToNativeMediaType(JNIEnv* jni, jobject j_media_type);
-
-jobject NativeToJavaMediaType(JNIEnv* jni, cricket::MediaType media_type);
-
-cricket::Candidate JavaToNativeCandidate(JNIEnv* jni, jobject j_candidate);
-
-jobject NativeToJavaCandidate(JNIEnv* jni,
-                              jclass* candidate_class,
-                              const cricket::Candidate& candidate);
-
-jobjectArray NativeToJavaCandidateArray(
-    JNIEnv* jni,
-    const std::vector<cricket::Candidate>& candidates);
-
-SessionDescriptionInterface* JavaToNativeSessionDescription(JNIEnv* jni,
-                                                            jobject j_sdp);
-
-jobject NativeToJavaSessionDescription(JNIEnv* jni,
-                                       const SessionDescriptionInterface* desc);
-
-PeerConnectionFactoryInterface::Options
-JavaToNativePeerConnectionFactoryOptions(JNIEnv* jni, jobject options);
-
-/*****************************************************
- * Below are all things that go into RTCConfiguration.
- *****************************************************/
-PeerConnectionInterface::IceTransportsType JavaToNativeIceTransportsType(
-    JNIEnv* jni,
-    jobject j_ice_transports_type);
-
-PeerConnectionInterface::BundlePolicy JavaToNativeBundlePolicy(
-    JNIEnv* jni,
-    jobject j_bundle_policy);
-
-PeerConnectionInterface::RtcpMuxPolicy JavaToNativeRtcpMuxPolicy(
-    JNIEnv* jni,
-    jobject j_rtcp_mux_policy);
-
-PeerConnectionInterface::TcpCandidatePolicy JavaToNativeTcpCandidatePolicy(
-    JNIEnv* jni,
-    jobject j_tcp_candidate_policy);
-
-PeerConnectionInterface::CandidateNetworkPolicy
-JavaToNativeCandidateNetworkPolicy(JNIEnv* jni,
-                                   jobject j_candidate_network_policy);
-
-rtc::KeyType JavaToNativeKeyType(JNIEnv* jni, jobject j_key_type);
-
-PeerConnectionInterface::ContinualGatheringPolicy
-JavaToNativeContinualGatheringPolicy(JNIEnv* jni, jobject j_gathering_policy);
-
-PeerConnectionInterface::TlsCertPolicy JavaToNativeTlsCertPolicy(
-    JNIEnv* jni,
-    jobject j_ice_server_tls_cert_policy);
-
-void JavaToNativeIceServers(JNIEnv* jni,
-                            jobject j_ice_servers,
-                            PeerConnectionInterface::IceServers* ice_servers);
-
-void JavaToNativeRTCConfiguration(
-    JNIEnv* jni,
-    jobject j_rtc_config,
-    PeerConnectionInterface::RTCConfiguration* rtc_config);
-
-/*********************************************************
- * RtpParameters, used for RtpSender and RtpReceiver APIs.
- *********************************************************/
-void JavaToNativeRtpParameters(JNIEnv* jni,
-                               jobject j_parameters,
-                               RtpParameters* parameters);
-
-jobject NativeToJavaRtpParameters(JNIEnv* jni, const RtpParameters& parameters);
-
-}  // namespace jni
-}  // namespace webrtc
-
-#endif  // WEBRTC_SDK_ANDROID_SRC_JNI_PC_JAVA_NATIVE_CONVERSION_H_
diff --git a/sdk/android/src/jni/pc/logging_jni.cc b/sdk/android/src/jni/pc/logging_jni.cc
deleted file mode 100644
index e71670a..0000000
--- a/sdk/android/src/jni/pc/logging_jni.cc
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- *  Copyright 2017 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 <memory>
-
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/sdk/android/src/jni/jni_helpers.h"
-#include "webrtc/system_wrappers/include/logcat_trace_context.h"
-#include "webrtc/system_wrappers/include/trace.h"
-
-namespace webrtc {
-namespace jni {
-
-JNI_FUNCTION_DECLARATION(void,
-                         Logging_nativeEnableTracing,
-                         JNIEnv* jni,
-                         jclass,
-                         jstring j_path,
-                         jint nativeLevels) {
-  std::string path = JavaToStdString(jni, j_path);
-  if (nativeLevels != kTraceNone) {
-    Trace::set_level_filter(nativeLevels);
-    if (path != "logcat:") {
-      RTC_CHECK_EQ(0, Trace::SetTraceFile(path.c_str(), false))
-          << "SetTraceFile failed";
-    } else {
-      // Intentionally leak this to avoid needing to reason about its lifecycle.
-      // It keeps no state and functions only as a dispatch point.
-      static LogcatTraceContext* g_trace_callback = new LogcatTraceContext();
-    }
-  }
-}
-
-JNI_FUNCTION_DECLARATION(void,
-                         Logging_nativeEnableLogToDebugOutput,
-                         JNIEnv* jni,
-                         jclass,
-                         jint nativeSeverity) {
-  if (nativeSeverity >= rtc::LS_SENSITIVE && nativeSeverity <= rtc::LS_NONE) {
-    rtc::LogMessage::LogToDebug(
-        static_cast<rtc::LoggingSeverity>(nativeSeverity));
-  }
-}
-
-JNI_FUNCTION_DECLARATION(void,
-                         Logging_nativeEnableLogThreads,
-                         JNIEnv* jni,
-                         jclass) {
-  rtc::LogMessage::LogThreads(true);
-}
-
-JNI_FUNCTION_DECLARATION(void,
-                         Logging_nativeEnableLogTimeStamps,
-                         JNIEnv* jni,
-                         jclass) {
-  rtc::LogMessage::LogTimestamps(true);
-}
-
-JNI_FUNCTION_DECLARATION(void,
-                         Logging_nativeLog,
-                         JNIEnv* jni,
-                         jclass,
-                         jint j_severity,
-                         jstring j_tag,
-                         jstring j_message) {
-  std::string message = JavaToStdString(jni, j_message);
-  std::string tag = JavaToStdString(jni, j_tag);
-  LOG_TAG(static_cast<rtc::LoggingSeverity>(j_severity), tag) << message;
-}
-
-}  // namespace jni
-}  // namespace webrtc
diff --git a/sdk/android/src/jni/pc/media_jni.cc b/sdk/android/src/jni/pc/media_jni.cc
deleted file mode 100644
index 8d8b6b9..0000000
--- a/sdk/android/src/jni/pc/media_jni.cc
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- *  Copyright 2017 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/sdk/android/src/jni/pc/media_jni.h"
-
-#include "webrtc/call/callfactoryinterface.h"
-#include "webrtc/logging/rtc_event_log/rtc_event_log_factory_interface.h"
-#include "webrtc/media/engine/webrtcmediaengine.h"
-#include "webrtc/modules/audio_processing/include/audio_processing.h"
-
-namespace webrtc {
-namespace jni {
-
-CallFactoryInterface* CreateCallFactory() {
-  return webrtc::CreateCallFactory().release();
-}
-
-RtcEventLogFactoryInterface* CreateRtcEventLogFactory() {
-  return webrtc::CreateRtcEventLogFactory().release();
-}
-
-cricket::MediaEngineInterface* CreateMediaEngine(
-    AudioDeviceModule* adm,
-    const rtc::scoped_refptr<AudioEncoderFactory>& audio_encoder_factory,
-    const rtc::scoped_refptr<AudioDecoderFactory>& audio_decoder_factory,
-    cricket::WebRtcVideoEncoderFactory* video_encoder_factory,
-    cricket::WebRtcVideoDecoderFactory* video_decoder_factory,
-    rtc::scoped_refptr<AudioMixer> audio_mixer) {
-  return cricket::WebRtcMediaEngineFactory::Create(
-      adm, audio_encoder_factory, audio_decoder_factory, video_encoder_factory,
-      video_decoder_factory, audio_mixer, AudioProcessing::Create());
-}
-
-}  // namespace jni
-}  // namespace webrtc
diff --git a/sdk/android/src/jni/pc/media_jni.h b/sdk/android/src/jni/pc/media_jni.h
deleted file mode 100644
index 02c3a80..0000000
--- a/sdk/android/src/jni/pc/media_jni.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- *  Copyright 2017 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_SDK_ANDROID_SRC_JNI_PC_MEDIA_JNI_H_
-#define WEBRTC_SDK_ANDROID_SRC_JNI_PC_MEDIA_JNI_H_
-
-#include "webrtc/rtc_base/scoped_ref_ptr.h"
-
-namespace webrtc {
-class AudioDeviceModule;
-class CallFactoryInterface;
-class AudioEncoderFactory;
-class AudioDecoderFactory;
-class RtcEventLogFactoryInterface;
-class AudioMixer;
-}  // namespace webrtc
-
-namespace cricket {
-class MediaEngineInterface;
-class WebRtcVideoEncoderFactory;
-class WebRtcVideoDecoderFactory;
-}  // namespace cricket
-
-namespace webrtc {
-namespace jni {
-
-CallFactoryInterface* CreateCallFactory();
-RtcEventLogFactoryInterface* CreateRtcEventLogFactory();
-
-cricket::MediaEngineInterface* CreateMediaEngine(
-    AudioDeviceModule* adm,
-    const rtc::scoped_refptr<AudioEncoderFactory>& audio_encoder_factory,
-    const rtc::scoped_refptr<AudioDecoderFactory>& audio_decoder_factory,
-    cricket::WebRtcVideoEncoderFactory* video_encoder_factory,
-    cricket::WebRtcVideoDecoderFactory* video_decoder_factory,
-    rtc::scoped_refptr<AudioMixer> audio_mixer);
-
-}  // namespace jni
-}  // namespace webrtc
-
-#endif  // WEBRTC_SDK_ANDROID_SRC_JNI_PC_MEDIA_JNI_H_
diff --git a/sdk/android/src/jni/pc/mediaconstraints_jni.cc b/sdk/android/src/jni/pc/mediaconstraints_jni.cc
deleted file mode 100644
index f36401d..0000000
--- a/sdk/android/src/jni/pc/mediaconstraints_jni.cc
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- *  Copyright 2017 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/sdk/android/src/jni/pc/mediaconstraints_jni.h"
-
-namespace webrtc {
-namespace jni {
-
-MediaConstraintsJni::MediaConstraintsJni(JNIEnv* jni, jobject j_constraints) {
-  PopulateConstraintsFromJavaPairList(jni, j_constraints, "mandatory",
-                                      &mandatory_);
-  PopulateConstraintsFromJavaPairList(jni, j_constraints, "optional",
-                                      &optional_);
-}
-
-// static
-void MediaConstraintsJni::PopulateConstraintsFromJavaPairList(
-    JNIEnv* jni,
-    jobject j_constraints,
-    const char* field_name,
-    Constraints* field) {
-  jfieldID j_id = GetFieldID(jni, GetObjectClass(jni, j_constraints),
-                             field_name, "Ljava/util/List;");
-  jobject j_list = GetObjectField(jni, j_constraints, j_id);
-  for (jobject entry : Iterable(jni, j_list)) {
-    jmethodID get_key = GetMethodID(jni, GetObjectClass(jni, entry), "getKey",
-                                    "()Ljava/lang/String;");
-    jstring j_key =
-        reinterpret_cast<jstring>(jni->CallObjectMethod(entry, get_key));
-    CHECK_EXCEPTION(jni) << "error during CallObjectMethod";
-    jmethodID get_value = GetMethodID(jni, GetObjectClass(jni, entry),
-                                      "getValue", "()Ljava/lang/String;");
-    jstring j_value =
-        reinterpret_cast<jstring>(jni->CallObjectMethod(entry, get_value));
-    CHECK_EXCEPTION(jni) << "error during CallObjectMethod";
-    field->push_back(
-        Constraint(JavaToStdString(jni, j_key), JavaToStdString(jni, j_value)));
-  }
-}
-
-}  // namespace jni
-}  // namespace webrtc
diff --git a/sdk/android/src/jni/pc/mediaconstraints_jni.h b/sdk/android/src/jni/pc/mediaconstraints_jni.h
deleted file mode 100644
index 9828234..0000000
--- a/sdk/android/src/jni/pc/mediaconstraints_jni.h
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- *  Copyright 2017 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_SDK_ANDROID_SRC_JNI_PC_MEDIACONSTRAINTS_JNI_H_
-#define WEBRTC_SDK_ANDROID_SRC_JNI_PC_MEDIACONSTRAINTS_JNI_H_
-
-#include "webrtc/api/mediaconstraintsinterface.h"
-#include "webrtc/sdk/android/src/jni/jni_helpers.h"
-
-namespace webrtc {
-namespace jni {
-
-// Wrapper for a Java MediaConstraints object.  Copies all needed data so when
-// the constructor returns the Java object is no longer needed.
-class MediaConstraintsJni : public MediaConstraintsInterface {
- public:
-  MediaConstraintsJni(JNIEnv* jni, jobject j_constraints);
-  virtual ~MediaConstraintsJni() {}
-
-  // MediaConstraintsInterface.
-  const Constraints& GetMandatory() const override { return mandatory_; }
-  const Constraints& GetOptional() const override { return optional_; }
-
- private:
-  // Helper for translating a List<Pair<String, String>> to a Constraints.
-  static void PopulateConstraintsFromJavaPairList(JNIEnv* jni,
-                                                  jobject j_constraints,
-                                                  const char* field_name,
-                                                  Constraints* field);
-
-  Constraints mandatory_;
-  Constraints optional_;
-};
-
-}  // namespace jni
-}  // namespace webrtc
-
-#endif  // WEBRTC_SDK_ANDROID_SRC_JNI_PC_MEDIACONSTRAINTS_JNI_H_
diff --git a/sdk/android/src/jni/pc/mediasource_jni.cc b/sdk/android/src/jni/pc/mediasource_jni.cc
deleted file mode 100644
index 6c3c230..0000000
--- a/sdk/android/src/jni/pc/mediasource_jni.cc
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- *  Copyright 2017 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/api/mediastreaminterface.h"
-#include "webrtc/sdk/android/src/jni/jni_helpers.h"
-
-namespace webrtc {
-namespace jni {
-
-JNI_FUNCTION_DECLARATION(jobject,
-                         MediaSource_nativeState,
-                         JNIEnv* jni,
-                         jclass,
-                         jlong j_p) {
-  rtc::scoped_refptr<MediaSourceInterface> p(
-      reinterpret_cast<MediaSourceInterface*>(j_p));
-  return JavaEnumFromIndexAndClassName(jni, "MediaSource$State", p->state());
-}
-
-}  // namespace jni
-}  // namespace webrtc
diff --git a/sdk/android/src/jni/pc/mediastream_jni.cc b/sdk/android/src/jni/pc/mediastream_jni.cc
deleted file mode 100644
index 74dc2c5..0000000
--- a/sdk/android/src/jni/pc/mediastream_jni.cc
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- *  Copyright 2017 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/api/mediastreaminterface.h"
-#include "webrtc/sdk/android/src/jni/jni_helpers.h"
-
-namespace webrtc {
-namespace jni {
-
-JNI_FUNCTION_DECLARATION(jboolean,
-                         MediaStream_nativeAddAudioTrack,
-                         JNIEnv* jni,
-                         jclass,
-                         jlong pointer,
-                         jlong j_audio_track_pointer) {
-  return reinterpret_cast<MediaStreamInterface*>(pointer)->AddTrack(
-      reinterpret_cast<AudioTrackInterface*>(j_audio_track_pointer));
-}
-
-JNI_FUNCTION_DECLARATION(jboolean,
-                         MediaStream_nativeAddVideoTrack,
-                         JNIEnv* jni,
-                         jclass,
-                         jlong pointer,
-                         jlong j_video_track_pointer) {
-  return reinterpret_cast<MediaStreamInterface*>(pointer)->AddTrack(
-      reinterpret_cast<VideoTrackInterface*>(j_video_track_pointer));
-}
-
-JNI_FUNCTION_DECLARATION(jboolean,
-                         MediaStream_nativeRemoveAudioTrack,
-                         JNIEnv* jni,
-                         jclass,
-                         jlong pointer,
-                         jlong j_audio_track_pointer) {
-  return reinterpret_cast<MediaStreamInterface*>(pointer)->RemoveTrack(
-      reinterpret_cast<AudioTrackInterface*>(j_audio_track_pointer));
-}
-
-JNI_FUNCTION_DECLARATION(jboolean,
-                         MediaStream_nativeRemoveVideoTrack,
-                         JNIEnv* jni,
-                         jclass,
-                         jlong pointer,
-                         jlong j_video_track_pointer) {
-  return reinterpret_cast<MediaStreamInterface*>(pointer)->RemoveTrack(
-      reinterpret_cast<VideoTrackInterface*>(j_video_track_pointer));
-}
-
-JNI_FUNCTION_DECLARATION(jstring,
-                         MediaStream_nativeLabel,
-                         JNIEnv* jni,
-                         jclass,
-                         jlong j_p) {
-  return JavaStringFromStdString(
-      jni, reinterpret_cast<MediaStreamInterface*>(j_p)->label());
-}
-
-JNI_FUNCTION_DECLARATION(void, MediaStream_free, JNIEnv*, jclass, jlong j_p) {
-  CHECK_RELEASE(reinterpret_cast<MediaStreamInterface*>(j_p));
-}
-
-}  // namespace jni
-}  // namespace webrtc
diff --git a/sdk/android/src/jni/pc/mediastreamtrack_jni.cc b/sdk/android/src/jni/pc/mediastreamtrack_jni.cc
deleted file mode 100644
index e5af865..0000000
--- a/sdk/android/src/jni/pc/mediastreamtrack_jni.cc
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- *  Copyright 2017 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/api/mediastreaminterface.h"
-#include "webrtc/sdk/android/src/jni/jni_helpers.h"
-
-namespace webrtc {
-namespace jni {
-
-JNI_FUNCTION_DECLARATION(jstring,
-                         MediaStreamTrack_nativeId,
-                         JNIEnv* jni,
-                         jclass,
-                         jlong j_p) {
-  return JavaStringFromStdString(
-      jni, reinterpret_cast<MediaStreamTrackInterface*>(j_p)->id());
-}
-
-JNI_FUNCTION_DECLARATION(jstring,
-                         MediaStreamTrack_nativeKind,
-                         JNIEnv* jni,
-                         jclass,
-                         jlong j_p) {
-  return JavaStringFromStdString(
-      jni, reinterpret_cast<MediaStreamTrackInterface*>(j_p)->kind());
-}
-
-JNI_FUNCTION_DECLARATION(jboolean,
-                         MediaStreamTrack_nativeEnabled,
-                         JNIEnv* jni,
-                         jclass,
-                         jlong j_p) {
-  return reinterpret_cast<MediaStreamTrackInterface*>(j_p)->enabled();
-}
-
-JNI_FUNCTION_DECLARATION(jobject,
-                         MediaStreamTrack_nativeState,
-                         JNIEnv* jni,
-                         jclass,
-                         jlong j_p) {
-  return JavaEnumFromIndexAndClassName(
-      jni, "MediaStreamTrack$State",
-      reinterpret_cast<MediaStreamTrackInterface*>(j_p)->state());
-}
-
-JNI_FUNCTION_DECLARATION(jboolean,
-                         MediaStreamTrack_nativeSetEnabled,
-                         JNIEnv* jni,
-                         jclass,
-                         jlong j_p,
-                         jboolean enabled) {
-  return reinterpret_cast<MediaStreamTrackInterface*>(j_p)->set_enabled(
-      enabled);
-}
-
-}  // namespace jni
-}  // namespace webrtc
diff --git a/sdk/android/src/jni/pc/null_audio_jni.cc b/sdk/android/src/jni/pc/null_audio_jni.cc
deleted file mode 100644
index 85c9798..0000000
--- a/sdk/android/src/jni/pc/null_audio_jni.cc
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- *  Copyright 2017 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/sdk/android/src/jni/pc/audio_jni.h"
-
-namespace webrtc {
-namespace jni {
-
-rtc::scoped_refptr<AudioDecoderFactory> CreateAudioDecoderFactory() {
-  return nullptr;
-}
-
-rtc::scoped_refptr<AudioEncoderFactory> CreateAudioEncoderFactory() {
-  return nullptr;
-}
-
-}  // namespace jni
-}  // namespace webrtc
diff --git a/sdk/android/src/jni/pc/null_media_jni.cc b/sdk/android/src/jni/pc/null_media_jni.cc
deleted file mode 100644
index 2f2ff6d..0000000
--- a/sdk/android/src/jni/pc/null_media_jni.cc
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- *  Copyright 2017 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/sdk/android/src/jni/pc/media_jni.h"
-
-namespace webrtc {
-namespace jni {
-
-CallFactoryInterface* CreateCallFactory() {
-  return nullptr;
-}
-
-RtcEventLogFactoryInterface* CreateRtcEventLogFactory() {
-  return nullptr;
-}
-
-cricket::MediaEngineInterface* CreateMediaEngine(
-    AudioDeviceModule* adm,
-    const rtc::scoped_refptr<AudioEncoderFactory>& audio_encoder_factory,
-    const rtc::scoped_refptr<AudioDecoderFactory>& audio_decoder_factory,
-    cricket::WebRtcVideoEncoderFactory* video_encoder_factory,
-    cricket::WebRtcVideoDecoderFactory* video_decoder_factory,
-    rtc::scoped_refptr<AudioMixer> audio_mixer) {
-  return nullptr;
-}
-
-}  // namespace jni
-}  // namespace webrtc
diff --git a/sdk/android/src/jni/pc/null_video_jni.cc b/sdk/android/src/jni/pc/null_video_jni.cc
deleted file mode 100644
index b9bf8de..0000000
--- a/sdk/android/src/jni/pc/null_video_jni.cc
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- *  Copyright (c) 2017 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/sdk/android/src/jni/pc/video_jni.h"
-
-namespace webrtc {
-namespace jni {
-
-cricket::WebRtcVideoEncoderFactory* CreateVideoEncoderFactory(
-    JNIEnv* jni,
-    jobject j_encoder_factory) {
-  return nullptr;
-}
-
-cricket::WebRtcVideoDecoderFactory* CreateVideoDecoderFactory(
-    JNIEnv* jni,
-    jobject j_decoder_factory) {
-  return nullptr;
-}
-
-jobject GetJavaSurfaceTextureHelper(
-    const rtc::scoped_refptr<SurfaceTextureHelper>& surface_texture_helper) {
-  return nullptr;
-}
-
-}  // namespace jni
-}  // namespace webrtc
diff --git a/sdk/android/src/jni/pc/ownedfactoryandthreads.cc b/sdk/android/src/jni/pc/ownedfactoryandthreads.cc
deleted file mode 100644
index 062270c..0000000
--- a/sdk/android/src/jni/pc/ownedfactoryandthreads.cc
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- *  Copyright 2017 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/sdk/android/src/jni/pc/ownedfactoryandthreads.h"
-
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/sdk/android/src/jni/classreferenceholder.h"
-#include "webrtc/sdk/android/src/jni/jni_helpers.h"
-
-namespace webrtc {
-namespace jni {
-
-PeerConnectionFactoryInterface* factoryFromJava(jlong j_p) {
-  return reinterpret_cast<OwnedFactoryAndThreads*>(j_p)->factory();
-}
-
-OwnedFactoryAndThreads::~OwnedFactoryAndThreads() {
-  CHECK_RELEASE(factory_);
-  if (network_monitor_factory_ != nullptr) {
-    rtc::NetworkMonitorFactory::ReleaseFactory(network_monitor_factory_);
-  }
-}
-
-void OwnedFactoryAndThreads::JavaCallbackOnFactoryThreads() {
-  JNIEnv* jni = AttachCurrentThreadIfNeeded();
-  ScopedLocalRefFrame local_ref_frame(jni);
-  jclass j_factory_class = FindClass(jni, "org/webrtc/PeerConnectionFactory");
-  jmethodID m = nullptr;
-  if (network_thread_->IsCurrent()) {
-    LOG(LS_INFO) << "Network thread JavaCallback";
-    m = GetStaticMethodID(jni, j_factory_class, "onNetworkThreadReady", "()V");
-  }
-  if (worker_thread_->IsCurrent()) {
-    LOG(LS_INFO) << "Worker thread JavaCallback";
-    m = GetStaticMethodID(jni, j_factory_class, "onWorkerThreadReady", "()V");
-  }
-  if (signaling_thread_->IsCurrent()) {
-    LOG(LS_INFO) << "Signaling thread JavaCallback";
-    m = GetStaticMethodID(jni, j_factory_class, "onSignalingThreadReady",
-                          "()V");
-  }
-  if (m != nullptr) {
-    jni->CallStaticVoidMethod(j_factory_class, m);
-    CHECK_EXCEPTION(jni) << "error during JavaCallback::CallStaticVoidMethod";
-  }
-}
-
-void OwnedFactoryAndThreads::InvokeJavaCallbacksOnFactoryThreads() {
-  LOG(LS_INFO) << "InvokeJavaCallbacksOnFactoryThreads.";
-  network_thread_->Invoke<void>(RTC_FROM_HERE,
-                                [this] { JavaCallbackOnFactoryThreads(); });
-  worker_thread_->Invoke<void>(RTC_FROM_HERE,
-                               [this] { JavaCallbackOnFactoryThreads(); });
-  signaling_thread_->Invoke<void>(RTC_FROM_HERE,
-                                  [this] { JavaCallbackOnFactoryThreads(); });
-}
-
-}  // namespace jni
-}  // namespace webrtc
diff --git a/sdk/android/src/jni/pc/ownedfactoryandthreads.h b/sdk/android/src/jni/pc/ownedfactoryandthreads.h
deleted file mode 100644
index ce69c12..0000000
--- a/sdk/android/src/jni/pc/ownedfactoryandthreads.h
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- *  Copyright 2017 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_SDK_ANDROID_SRC_JNI_PC_OWNEDFACTORYANDTHREADS_H_
-#define WEBRTC_SDK_ANDROID_SRC_JNI_PC_OWNEDFACTORYANDTHREADS_H_
-
-#include <jni.h>
-#include <memory>
-#include <utility>
-
-#include "webrtc/api/peerconnectioninterface.h"
-#include "webrtc/rtc_base/thread.h"
-
-using cricket::WebRtcVideoDecoderFactory;
-using cricket::WebRtcVideoEncoderFactory;
-using rtc::Thread;
-
-namespace webrtc {
-namespace jni {
-
-PeerConnectionFactoryInterface* factoryFromJava(jlong j_p);
-
-// Helper struct for working around the fact that CreatePeerConnectionFactory()
-// comes in two flavors: either entirely automagical (constructing its own
-// threads and deleting them on teardown, but no external codec factory support)
-// or entirely manual (requires caller to delete threads after factory
-// teardown).  This struct takes ownership of its ctor's arguments to present a
-// single thing for Java to hold and eventually free.
-class OwnedFactoryAndThreads {
- public:
-  OwnedFactoryAndThreads(std::unique_ptr<Thread> network_thread,
-                         std::unique_ptr<Thread> worker_thread,
-                         std::unique_ptr<Thread> signaling_thread,
-                         WebRtcVideoEncoderFactory* encoder_factory,
-                         WebRtcVideoDecoderFactory* decoder_factory,
-                         rtc::NetworkMonitorFactory* network_monitor_factory,
-                         PeerConnectionFactoryInterface* factory)
-      : network_thread_(std::move(network_thread)),
-        worker_thread_(std::move(worker_thread)),
-        signaling_thread_(std::move(signaling_thread)),
-        encoder_factory_(encoder_factory),
-        decoder_factory_(decoder_factory),
-        network_monitor_factory_(network_monitor_factory),
-        factory_(factory) {}
-
-  ~OwnedFactoryAndThreads();
-
-  PeerConnectionFactoryInterface* factory() { return factory_; }
-  Thread* signaling_thread() { return signaling_thread_.get(); }
-  Thread* worker_thread() { return worker_thread_.get(); }
-  WebRtcVideoEncoderFactory* encoder_factory() { return encoder_factory_; }
-  WebRtcVideoDecoderFactory* decoder_factory() { return decoder_factory_; }
-  rtc::NetworkMonitorFactory* network_monitor_factory() {
-    return network_monitor_factory_;
-  }
-  void clear_network_monitor_factory() { network_monitor_factory_ = nullptr; }
-  void InvokeJavaCallbacksOnFactoryThreads();
-
- private:
-  void JavaCallbackOnFactoryThreads();
-
-  const std::unique_ptr<Thread> network_thread_;
-  const std::unique_ptr<Thread> worker_thread_;
-  const std::unique_ptr<Thread> signaling_thread_;
-  WebRtcVideoEncoderFactory* encoder_factory_;
-  WebRtcVideoDecoderFactory* decoder_factory_;
-  rtc::NetworkMonitorFactory* network_monitor_factory_;
-  PeerConnectionFactoryInterface* factory_;  // Const after ctor except dtor.
-};
-
-}  // namespace jni
-}  // namespace webrtc
-
-#endif  // WEBRTC_SDK_ANDROID_SRC_JNI_PC_OWNEDFACTORYANDTHREADS_H_
diff --git a/sdk/android/src/jni/pc/peerconnection_jni.cc b/sdk/android/src/jni/pc/peerconnection_jni.cc
deleted file mode 100644
index 1e83435..0000000
--- a/sdk/android/src/jni/pc/peerconnection_jni.cc
+++ /dev/null
@@ -1,427 +0,0 @@
-/*
- *  Copyright 2013 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.
- */
-
-// Lifecycle notes: objects are owned where they will be called; in other words
-// FooObservers are owned by C++-land, and user-callable objects (e.g.
-// PeerConnection and VideoTrack) are owned by Java-land.
-// When this file (or other files in this directory) allocates C++
-// RefCountInterfaces it AddRef()s an artificial ref simulating the jlong held
-// in Java-land, and then Release()s the ref in the respective free call.
-// Sometimes this AddRef is implicit in the construction of a scoped_refptr<>
-// which is then .release()d. Any persistent (non-local) references from C++ to
-// Java must be global or weak (in which case they must be checked before use)!
-//
-// Exception notes: pretty much all JNI calls can throw Java exceptions, so each
-// call through a JNIEnv* pointer needs to be followed by an ExceptionCheck()
-// call. In this file this is done in CHECK_EXCEPTION, making for much easier
-// debugging in case of failure (the alternative is to wait for control to
-// return to the Java frame that called code in this file, at which point it's
-// impossible to tell which JNI call broke).
-
-#include <limits>
-#include <memory>
-#include <utility>
-
-#include "webrtc/api/mediaconstraintsinterface.h"
-#include "webrtc/api/peerconnectioninterface.h"
-#include "webrtc/api/rtpreceiverinterface.h"
-#include "webrtc/api/rtpsenderinterface.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/sdk/android/src/jni/classreferenceholder.h"
-#include "webrtc/sdk/android/src/jni/jni_helpers.h"
-#include "webrtc/sdk/android/src/jni/pc/java_native_conversion.h"
-#include "webrtc/sdk/android/src/jni/pc/mediaconstraints_jni.h"
-#include "webrtc/sdk/android/src/jni/pc/peerconnectionobserver_jni.h"
-#include "webrtc/sdk/android/src/jni/pc/rtcstatscollectorcallbackwrapper.h"
-#include "webrtc/sdk/android/src/jni/pc/sdpobserver_jni.h"
-#include "webrtc/sdk/android/src/jni/pc/statsobserver_jni.h"
-#include "webrtc/system_wrappers/include/trace.h"
-
-namespace webrtc {
-namespace jni {
-
-static rtc::scoped_refptr<PeerConnectionInterface> ExtractNativePC(
-    JNIEnv* jni,
-    jobject j_pc) {
-  jfieldID native_pc_id =
-      GetFieldID(jni, GetObjectClass(jni, j_pc), "nativePeerConnection", "J");
-  jlong j_p = GetLongField(jni, j_pc, native_pc_id);
-  return rtc::scoped_refptr<PeerConnectionInterface>(
-      reinterpret_cast<PeerConnectionInterface*>(j_p));
-}
-
-JNI_FUNCTION_DECLARATION(void,
-                         PeerConnection_freeObserver,
-                         JNIEnv*,
-                         jclass,
-                         jlong j_p) {
-  PeerConnectionObserverJni* p =
-      reinterpret_cast<PeerConnectionObserverJni*>(j_p);
-  delete p;
-}
-
-JNI_FUNCTION_DECLARATION(jobject,
-                         PeerConnection_getLocalDescription,
-                         JNIEnv* jni,
-                         jobject j_pc) {
-  const SessionDescriptionInterface* sdp =
-      ExtractNativePC(jni, j_pc)->local_description();
-  return sdp ? NativeToJavaSessionDescription(jni, sdp) : NULL;
-}
-
-JNI_FUNCTION_DECLARATION(jobject,
-                         PeerConnection_getRemoteDescription,
-                         JNIEnv* jni,
-                         jobject j_pc) {
-  const SessionDescriptionInterface* sdp =
-      ExtractNativePC(jni, j_pc)->remote_description();
-  return sdp ? NativeToJavaSessionDescription(jni, sdp) : NULL;
-}
-
-JNI_FUNCTION_DECLARATION(jobject,
-                         PeerConnection_createDataChannel,
-                         JNIEnv* jni,
-                         jobject j_pc,
-                         jstring j_label,
-                         jobject j_init) {
-  DataChannelInit init = JavaToNativeDataChannelInit(jni, j_init);
-  rtc::scoped_refptr<DataChannelInterface> channel(
-      ExtractNativePC(jni, j_pc)->CreateDataChannel(
-          JavaToStdString(jni, j_label), &init));
-  // Mustn't pass channel.get() directly through NewObject to avoid reading its
-  // vararg parameter as 64-bit and reading memory that doesn't belong to the
-  // 32-bit parameter.
-  jlong nativeChannelPtr = jlongFromPointer(channel.get());
-  if (!nativeChannelPtr) {
-    LOG(LS_ERROR) << "Failed to create DataChannel";
-    return nullptr;
-  }
-  jclass j_data_channel_class = FindClass(jni, "org/webrtc/DataChannel");
-  jmethodID j_data_channel_ctor =
-      GetMethodID(jni, j_data_channel_class, "<init>", "(J)V");
-  jobject j_channel = jni->NewObject(j_data_channel_class, j_data_channel_ctor,
-                                     nativeChannelPtr);
-  CHECK_EXCEPTION(jni) << "error during NewObject";
-  // Channel is now owned by Java object, and will be freed from there.
-  int bumped_count = channel->AddRef();
-  RTC_CHECK(bumped_count == 2) << "Unexpected refcount";
-  return j_channel;
-}
-
-JNI_FUNCTION_DECLARATION(void,
-                         PeerConnection_createOffer,
-                         JNIEnv* jni,
-                         jobject j_pc,
-                         jobject j_observer,
-                         jobject j_constraints) {
-  MediaConstraintsJni* constraints =
-      new MediaConstraintsJni(jni, j_constraints);
-  rtc::scoped_refptr<CreateSdpObserverJni> observer(
-      new rtc::RefCountedObject<CreateSdpObserverJni>(jni, j_observer,
-                                                      constraints));
-  ExtractNativePC(jni, j_pc)->CreateOffer(observer, constraints);
-}
-
-JNI_FUNCTION_DECLARATION(void,
-                         PeerConnection_createAnswer,
-                         JNIEnv* jni,
-                         jobject j_pc,
-                         jobject j_observer,
-                         jobject j_constraints) {
-  MediaConstraintsJni* constraints =
-      new MediaConstraintsJni(jni, j_constraints);
-  rtc::scoped_refptr<CreateSdpObserverJni> observer(
-      new rtc::RefCountedObject<CreateSdpObserverJni>(jni, j_observer,
-                                                      constraints));
-  ExtractNativePC(jni, j_pc)->CreateAnswer(observer, constraints);
-}
-
-JNI_FUNCTION_DECLARATION(void,
-                         PeerConnection_setLocalDescription,
-                         JNIEnv* jni,
-                         jobject j_pc,
-                         jobject j_observer,
-                         jobject j_sdp) {
-  rtc::scoped_refptr<SetSdpObserverJni> observer(
-      new rtc::RefCountedObject<SetSdpObserverJni>(jni, j_observer, nullptr));
-  ExtractNativePC(jni, j_pc)->SetLocalDescription(
-      observer, JavaToNativeSessionDescription(jni, j_sdp));
-}
-
-JNI_FUNCTION_DECLARATION(void,
-                         PeerConnection_setRemoteDescription,
-                         JNIEnv* jni,
-                         jobject j_pc,
-                         jobject j_observer,
-                         jobject j_sdp) {
-  rtc::scoped_refptr<SetSdpObserverJni> observer(
-      new rtc::RefCountedObject<SetSdpObserverJni>(jni, j_observer, nullptr));
-  ExtractNativePC(jni, j_pc)->SetRemoteDescription(
-      observer, JavaToNativeSessionDescription(jni, j_sdp));
-}
-
-JNI_FUNCTION_DECLARATION(jboolean,
-                         PeerConnection_nativeSetConfiguration,
-                         JNIEnv* jni,
-                         jobject j_pc,
-                         jobject j_rtc_config,
-                         jlong native_observer) {
-  // Need to merge constraints into RTCConfiguration again, which are stored
-  // in the observer object.
-  PeerConnectionObserverJni* observer =
-      reinterpret_cast<PeerConnectionObserverJni*>(native_observer);
-  PeerConnectionInterface::RTCConfiguration rtc_config(
-      PeerConnectionInterface::RTCConfigurationType::kAggressive);
-  JavaToNativeRTCConfiguration(jni, j_rtc_config, &rtc_config);
-  CopyConstraintsIntoRtcConfiguration(observer->constraints(), &rtc_config);
-  return ExtractNativePC(jni, j_pc)->SetConfiguration(rtc_config);
-}
-
-JNI_FUNCTION_DECLARATION(jboolean,
-                         PeerConnection_nativeAddIceCandidate,
-                         JNIEnv* jni,
-                         jobject j_pc,
-                         jstring j_sdp_mid,
-                         jint j_sdp_mline_index,
-                         jstring j_candidate_sdp) {
-  std::string sdp_mid = JavaToStdString(jni, j_sdp_mid);
-  std::string sdp = JavaToStdString(jni, j_candidate_sdp);
-  std::unique_ptr<IceCandidateInterface> candidate(
-      CreateIceCandidate(sdp_mid, j_sdp_mline_index, sdp, nullptr));
-  return ExtractNativePC(jni, j_pc)->AddIceCandidate(candidate.get());
-}
-
-JNI_FUNCTION_DECLARATION(jboolean,
-                         PeerConnection_nativeRemoveIceCandidates,
-                         JNIEnv* jni,
-                         jobject j_pc,
-                         jobjectArray j_candidates) {
-  std::vector<cricket::Candidate> candidates;
-  size_t num_candidates = jni->GetArrayLength(j_candidates);
-  for (size_t i = 0; i < num_candidates; ++i) {
-    jobject j_candidate = jni->GetObjectArrayElement(j_candidates, i);
-    candidates.push_back(JavaToNativeCandidate(jni, j_candidate));
-  }
-  return ExtractNativePC(jni, j_pc)->RemoveIceCandidates(candidates);
-}
-
-JNI_FUNCTION_DECLARATION(jboolean,
-                         PeerConnection_nativeAddLocalStream,
-                         JNIEnv* jni,
-                         jobject j_pc,
-                         jlong native_stream) {
-  return ExtractNativePC(jni, j_pc)->AddStream(
-      reinterpret_cast<MediaStreamInterface*>(native_stream));
-}
-
-JNI_FUNCTION_DECLARATION(void,
-                         PeerConnection_nativeRemoveLocalStream,
-                         JNIEnv* jni,
-                         jobject j_pc,
-                         jlong native_stream) {
-  ExtractNativePC(jni, j_pc)->RemoveStream(
-      reinterpret_cast<MediaStreamInterface*>(native_stream));
-}
-
-JNI_FUNCTION_DECLARATION(jobject,
-                         PeerConnection_nativeCreateSender,
-                         JNIEnv* jni,
-                         jobject j_pc,
-                         jstring j_kind,
-                         jstring j_stream_id) {
-  jclass j_rtp_sender_class = FindClass(jni, "org/webrtc/RtpSender");
-  jmethodID j_rtp_sender_ctor =
-      GetMethodID(jni, j_rtp_sender_class, "<init>", "(J)V");
-
-  std::string kind = JavaToStdString(jni, j_kind);
-  std::string stream_id = JavaToStdString(jni, j_stream_id);
-  rtc::scoped_refptr<RtpSenderInterface> sender =
-      ExtractNativePC(jni, j_pc)->CreateSender(kind, stream_id);
-  if (!sender.get()) {
-    return nullptr;
-  }
-  jlong nativeSenderPtr = jlongFromPointer(sender.get());
-  jobject j_sender =
-      jni->NewObject(j_rtp_sender_class, j_rtp_sender_ctor, nativeSenderPtr);
-  CHECK_EXCEPTION(jni) << "error during NewObject";
-  // Sender is now owned by the Java object, and will be freed from
-  // RtpSender.dispose(), called by PeerConnection.dispose() or getSenders().
-  sender->AddRef();
-  return j_sender;
-}
-
-JNI_FUNCTION_DECLARATION(jobject,
-                         PeerConnection_nativeGetSenders,
-                         JNIEnv* jni,
-                         jobject j_pc) {
-  jclass j_array_list_class = FindClass(jni, "java/util/ArrayList");
-  jmethodID j_array_list_ctor =
-      GetMethodID(jni, j_array_list_class, "<init>", "()V");
-  jmethodID j_array_list_add =
-      GetMethodID(jni, j_array_list_class, "add", "(Ljava/lang/Object;)Z");
-  jobject j_senders = jni->NewObject(j_array_list_class, j_array_list_ctor);
-  CHECK_EXCEPTION(jni) << "error during NewObject";
-
-  jclass j_rtp_sender_class = FindClass(jni, "org/webrtc/RtpSender");
-  jmethodID j_rtp_sender_ctor =
-      GetMethodID(jni, j_rtp_sender_class, "<init>", "(J)V");
-
-  auto senders = ExtractNativePC(jni, j_pc)->GetSenders();
-  for (const auto& sender : senders) {
-    jlong nativeSenderPtr = jlongFromPointer(sender.get());
-    jobject j_sender =
-        jni->NewObject(j_rtp_sender_class, j_rtp_sender_ctor, nativeSenderPtr);
-    CHECK_EXCEPTION(jni) << "error during NewObject";
-    // Sender is now owned by the Java object, and will be freed from
-    // RtpSender.dispose(), called by PeerConnection.dispose() or getSenders().
-    sender->AddRef();
-    jni->CallBooleanMethod(j_senders, j_array_list_add, j_sender);
-    CHECK_EXCEPTION(jni) << "error during CallBooleanMethod";
-  }
-  return j_senders;
-}
-
-JNI_FUNCTION_DECLARATION(jobject,
-                         PeerConnection_nativeGetReceivers,
-                         JNIEnv* jni,
-                         jobject j_pc) {
-  jclass j_array_list_class = FindClass(jni, "java/util/ArrayList");
-  jmethodID j_array_list_ctor =
-      GetMethodID(jni, j_array_list_class, "<init>", "()V");
-  jmethodID j_array_list_add =
-      GetMethodID(jni, j_array_list_class, "add", "(Ljava/lang/Object;)Z");
-  jobject j_receivers = jni->NewObject(j_array_list_class, j_array_list_ctor);
-  CHECK_EXCEPTION(jni) << "error during NewObject";
-
-  jclass j_rtp_receiver_class = FindClass(jni, "org/webrtc/RtpReceiver");
-  jmethodID j_rtp_receiver_ctor =
-      GetMethodID(jni, j_rtp_receiver_class, "<init>", "(J)V");
-
-  auto receivers = ExtractNativePC(jni, j_pc)->GetReceivers();
-  for (const auto& receiver : receivers) {
-    jlong nativeReceiverPtr = jlongFromPointer(receiver.get());
-    jobject j_receiver = jni->NewObject(j_rtp_receiver_class,
-                                        j_rtp_receiver_ctor, nativeReceiverPtr);
-    CHECK_EXCEPTION(jni) << "error during NewObject";
-    // Receiver is now owned by Java object, and will be freed from there.
-    receiver->AddRef();
-    jni->CallBooleanMethod(j_receivers, j_array_list_add, j_receiver);
-    CHECK_EXCEPTION(jni) << "error during CallBooleanMethod";
-  }
-  return j_receivers;
-}
-
-JNI_FUNCTION_DECLARATION(bool,
-                         PeerConnection_nativeOldGetStats,
-                         JNIEnv* jni,
-                         jobject j_pc,
-                         jobject j_observer,
-                         jlong native_track) {
-  rtc::scoped_refptr<StatsObserverJni> observer(
-      new rtc::RefCountedObject<StatsObserverJni>(jni, j_observer));
-  return ExtractNativePC(jni, j_pc)->GetStats(
-      observer, reinterpret_cast<MediaStreamTrackInterface*>(native_track),
-      PeerConnectionInterface::kStatsOutputLevelStandard);
-}
-
-JNI_FUNCTION_DECLARATION(void,
-                         PeerConnection_nativeNewGetStats,
-                         JNIEnv* jni,
-                         jobject j_pc,
-                         jobject j_callback) {
-  rtc::scoped_refptr<RTCStatsCollectorCallbackWrapper> callback(
-      new rtc::RefCountedObject<RTCStatsCollectorCallbackWrapper>(jni,
-                                                                  j_callback));
-  ExtractNativePC(jni, j_pc)->GetStats(callback);
-}
-
-JNI_FUNCTION_DECLARATION(jboolean,
-                         PeerConnection_setBitrate,
-                         JNIEnv* jni,
-                         jobject j_pc,
-                         jobject j_min,
-                         jobject j_current,
-                         jobject j_max) {
-  PeerConnectionInterface::BitrateParameters params;
-  jclass j_integer_class = jni->FindClass("java/lang/Integer");
-  jmethodID int_value_id = GetMethodID(jni, j_integer_class, "intValue", "()I");
-  if (!IsNull(jni, j_min)) {
-    int min_value = jni->CallIntMethod(j_min, int_value_id);
-    params.min_bitrate_bps = rtc::Optional<int>(min_value);
-  }
-  if (!IsNull(jni, j_current)) {
-    int current_value = jni->CallIntMethod(j_current, int_value_id);
-    params.current_bitrate_bps = rtc::Optional<int>(current_value);
-  }
-  if (!IsNull(jni, j_max)) {
-    int max_value = jni->CallIntMethod(j_max, int_value_id);
-    params.max_bitrate_bps = rtc::Optional<int>(max_value);
-  }
-  return ExtractNativePC(jni, j_pc)->SetBitrate(params).ok();
-}
-
-JNI_FUNCTION_DECLARATION(bool,
-                         PeerConnection_nativeStartRtcEventLog,
-                         JNIEnv* jni,
-                         jobject j_pc,
-                         int file_descriptor,
-                         int max_size_bytes) {
-  return ExtractNativePC(jni, j_pc)->StartRtcEventLog(file_descriptor,
-                                                      max_size_bytes);
-}
-
-JNI_FUNCTION_DECLARATION(void,
-                         PeerConnection_nativeStopRtcEventLog,
-                         JNIEnv* jni,
-                         jobject j_pc) {
-  ExtractNativePC(jni, j_pc)->StopRtcEventLog();
-}
-
-JNI_FUNCTION_DECLARATION(jobject,
-                         PeerConnection_signalingState,
-                         JNIEnv* jni,
-                         jobject j_pc) {
-  PeerConnectionInterface::SignalingState state =
-      ExtractNativePC(jni, j_pc)->signaling_state();
-  return JavaEnumFromIndexAndClassName(jni, "PeerConnection$SignalingState",
-                                       state);
-}
-
-JNI_FUNCTION_DECLARATION(jobject,
-                         PeerConnection_iceConnectionState,
-                         JNIEnv* jni,
-                         jobject j_pc) {
-  PeerConnectionInterface::IceConnectionState state =
-      ExtractNativePC(jni, j_pc)->ice_connection_state();
-  return JavaEnumFromIndexAndClassName(jni, "PeerConnection$IceConnectionState",
-                                       state);
-}
-
-JNI_FUNCTION_DECLARATION(jobject,
-                         PeerConnection_iceGatheringState,
-                         JNIEnv* jni,
-                         jobject j_pc) {
-  PeerConnectionInterface::IceGatheringState state =
-      ExtractNativePC(jni, j_pc)->ice_gathering_state();
-  return JavaEnumFromIndexAndClassName(jni, "PeerConnection$IceGatheringState",
-                                       state);
-}
-
-JNI_FUNCTION_DECLARATION(void,
-                         PeerConnection_close,
-                         JNIEnv* jni,
-                         jobject j_pc) {
-  ExtractNativePC(jni, j_pc)->Close();
-  return;
-}
-
-}  // namespace jni
-}  // namespace webrtc
diff --git a/sdk/android/src/jni/pc/peerconnectionfactory_jni.cc b/sdk/android/src/jni/pc/peerconnectionfactory_jni.cc
deleted file mode 100644
index e9e8020..0000000
--- a/sdk/android/src/jni/pc/peerconnectionfactory_jni.cc
+++ /dev/null
@@ -1,377 +0,0 @@
-/*
- *  Copyright 2017 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 <memory>
-#include <utility>
-
-#include "webrtc/api/peerconnectioninterface.h"
-#include "webrtc/media/base/mediaengine.h"
-#include "webrtc/modules/utility/include/jvm_android.h"
-#include "webrtc/rtc_base/event_tracer.h"
-#include "webrtc/rtc_base/stringutils.h"
-#include "webrtc/rtc_base/thread.h"
-#include "webrtc/sdk/android/src/jni/jni_helpers.h"
-#include "webrtc/sdk/android/src/jni/pc/androidnetworkmonitor_jni.h"
-#include "webrtc/sdk/android/src/jni/pc/audio_jni.h"
-#include "webrtc/sdk/android/src/jni/pc/java_native_conversion.h"
-#include "webrtc/sdk/android/src/jni/pc/media_jni.h"
-#include "webrtc/sdk/android/src/jni/pc/ownedfactoryandthreads.h"
-#include "webrtc/sdk/android/src/jni/pc/peerconnectionobserver_jni.h"
-#include "webrtc/sdk/android/src/jni/pc/video_jni.h"
-#include "webrtc/system_wrappers/include/field_trial.h"
-// Adding 'nogncheck' to disable the gn include headers check.
-// We don't want to depend on 'system_wrappers:field_trial_default' because
-// clients should be able to provide their own implementation.
-#include "webrtc/system_wrappers/include/field_trial_default.h"  // nogncheck
-#include "webrtc/system_wrappers/include/trace.h"
-
-namespace webrtc {
-namespace jni {
-
-// Note: Some of the video-specific PeerConnectionFactory methods are
-// implemented in "video_jni.cc". This is done so that if an application
-// doesn't need video support, it can just link with "null_video_jni.cc"
-// instead of "video_jni.cc", which doesn't bring in the video-specific
-// dependencies.
-
-// Field trials initialization string
-static char* field_trials_init_string = nullptr;
-
-// Set in PeerConnectionFactory_initializeAndroidGlobals().
-static bool factory_static_initialized = false;
-static bool video_hw_acceleration_enabled = true;
-
-JNI_FUNCTION_DECLARATION(jlong,
-                         PeerConnectionFactory_nativeCreateObserver,
-                         JNIEnv* jni,
-                         jclass,
-                         jobject j_observer) {
-  return (jlong) new PeerConnectionObserverJni(jni, j_observer);
-}
-
-JNI_FUNCTION_DECLARATION(void,
-                         PeerConnectionFactory_nativeInitializeAndroidGlobals,
-                         JNIEnv* jni,
-                         jclass,
-                         jobject context,
-                         jboolean video_hw_acceleration) {
-  video_hw_acceleration_enabled = video_hw_acceleration;
-  if (!factory_static_initialized) {
-    JVM::Initialize(GetJVM());
-    factory_static_initialized = true;
-  }
-}
-
-JNI_FUNCTION_DECLARATION(void,
-                         PeerConnectionFactory_initializeFieldTrials,
-                         JNIEnv* jni,
-                         jclass,
-                         jstring j_trials_init_string) {
-  field_trials_init_string = NULL;
-  if (j_trials_init_string != NULL) {
-    const char* init_string =
-        jni->GetStringUTFChars(j_trials_init_string, NULL);
-    int init_string_length = jni->GetStringUTFLength(j_trials_init_string);
-    field_trials_init_string = new char[init_string_length + 1];
-    rtc::strcpyn(field_trials_init_string, init_string_length + 1, init_string);
-    jni->ReleaseStringUTFChars(j_trials_init_string, init_string);
-    LOG(LS_INFO) << "initializeFieldTrials: " << field_trials_init_string;
-  }
-  field_trial::InitFieldTrialsFromString(field_trials_init_string);
-}
-
-JNI_FUNCTION_DECLARATION(void,
-                         PeerConnectionFactory_initializeInternalTracer,
-                         JNIEnv* jni,
-                         jclass) {
-  rtc::tracing::SetupInternalTracer();
-}
-
-JNI_FUNCTION_DECLARATION(jstring,
-                         PeerConnectionFactory_nativeFieldTrialsFindFullName,
-                         JNIEnv* jni,
-                         jclass,
-                         jstring j_name) {
-  return JavaStringFromStdString(
-      jni, field_trial::FindFullName(JavaToStdString(jni, j_name)));
-}
-
-JNI_FUNCTION_DECLARATION(jboolean,
-                         PeerConnectionFactory_startInternalTracingCapture,
-                         JNIEnv* jni,
-                         jclass,
-                         jstring j_event_tracing_filename) {
-  if (!j_event_tracing_filename)
-    return false;
-
-  const char* init_string =
-      jni->GetStringUTFChars(j_event_tracing_filename, NULL);
-  LOG(LS_INFO) << "Starting internal tracing to: " << init_string;
-  bool ret = rtc::tracing::StartInternalCapture(init_string);
-  jni->ReleaseStringUTFChars(j_event_tracing_filename, init_string);
-  return ret;
-}
-
-JNI_FUNCTION_DECLARATION(void,
-                         PeerConnectionFactory_stopInternalTracingCapture,
-                         JNIEnv* jni,
-                         jclass) {
-  rtc::tracing::StopInternalCapture();
-}
-
-JNI_FUNCTION_DECLARATION(void,
-                         PeerConnectionFactory_shutdownInternalTracer,
-                         JNIEnv* jni,
-                         jclass) {
-  rtc::tracing::ShutdownInternalTracer();
-}
-
-JNI_FUNCTION_DECLARATION(
-    jlong,
-    PeerConnectionFactory_nativeCreatePeerConnectionFactory,
-    JNIEnv* jni,
-    jclass,
-    jobject joptions,
-    jobject jencoder_factory,
-    jobject jdecoder_factory) {
-  // talk/ assumes pretty widely that the current Thread is ThreadManager'd, but
-  // ThreadManager only WrapCurrentThread()s the thread where it is first
-  // created.  Since the semantics around when auto-wrapping happens in
-  // webrtc/rtc_base/ are convoluted, we simply wrap here to avoid having to
-  // think about ramifications of auto-wrapping there.
-  rtc::ThreadManager::Instance()->WrapCurrentThread();
-  Trace::CreateTrace();
-
-  std::unique_ptr<rtc::Thread> network_thread =
-      rtc::Thread::CreateWithSocketServer();
-  network_thread->SetName("network_thread", nullptr);
-  RTC_CHECK(network_thread->Start()) << "Failed to start thread";
-
-  std::unique_ptr<rtc::Thread> worker_thread = rtc::Thread::Create();
-  worker_thread->SetName("worker_thread", nullptr);
-  RTC_CHECK(worker_thread->Start()) << "Failed to start thread";
-
-  std::unique_ptr<rtc::Thread> signaling_thread = rtc::Thread::Create();
-  signaling_thread->SetName("signaling_thread", NULL);
-  RTC_CHECK(signaling_thread->Start()) << "Failed to start thread";
-
-  cricket::WebRtcVideoEncoderFactory* video_encoder_factory = nullptr;
-  cricket::WebRtcVideoDecoderFactory* video_decoder_factory = nullptr;
-  rtc::NetworkMonitorFactory* network_monitor_factory = nullptr;
-  auto audio_encoder_factory = CreateAudioEncoderFactory();
-  auto audio_decoder_factory = CreateAudioDecoderFactory();
-
-  PeerConnectionFactoryInterface::Options options;
-  bool has_options = joptions != NULL;
-  if (has_options) {
-    options = JavaToNativePeerConnectionFactoryOptions(jni, joptions);
-  }
-
-  if (video_hw_acceleration_enabled) {
-    video_encoder_factory = CreateVideoEncoderFactory(jni, jencoder_factory);
-    video_decoder_factory = CreateVideoDecoderFactory(jni, jdecoder_factory);
-  }
-  // Do not create network_monitor_factory only if the options are
-  // provided and disable_network_monitor therein is set to true.
-  if (!(has_options && options.disable_network_monitor)) {
-    network_monitor_factory = new AndroidNetworkMonitorFactory();
-    rtc::NetworkMonitorFactory::SetFactory(network_monitor_factory);
-  }
-
-  AudioDeviceModule* adm = nullptr;
-  rtc::scoped_refptr<AudioMixer> audio_mixer = nullptr;
-  std::unique_ptr<CallFactoryInterface> call_factory(CreateCallFactory());
-  std::unique_ptr<RtcEventLogFactoryInterface> rtc_event_log_factory(
-      CreateRtcEventLogFactory());
-  std::unique_ptr<cricket::MediaEngineInterface> media_engine(CreateMediaEngine(
-      adm, audio_encoder_factory, audio_decoder_factory, video_encoder_factory,
-      video_decoder_factory, audio_mixer));
-
-  rtc::scoped_refptr<PeerConnectionFactoryInterface> factory(
-      CreateModularPeerConnectionFactory(
-          network_thread.get(), worker_thread.get(), signaling_thread.get(),
-          adm, audio_encoder_factory, audio_decoder_factory,
-          video_encoder_factory, video_decoder_factory, audio_mixer,
-          std::move(media_engine), std::move(call_factory),
-          std::move(rtc_event_log_factory)));
-  RTC_CHECK(factory) << "Failed to create the peer connection factory; "
-                     << "WebRTC/libjingle init likely failed on this device";
-  // TODO(honghaiz): Maybe put the options as the argument of
-  // CreatePeerConnectionFactory.
-  if (has_options) {
-    factory->SetOptions(options);
-  }
-  OwnedFactoryAndThreads* owned_factory = new OwnedFactoryAndThreads(
-      std::move(network_thread), std::move(worker_thread),
-      std::move(signaling_thread), video_encoder_factory, video_decoder_factory,
-      network_monitor_factory, factory.release());
-  owned_factory->InvokeJavaCallbacksOnFactoryThreads();
-  return jlongFromPointer(owned_factory);
-}
-
-JNI_FUNCTION_DECLARATION(void,
-                         PeerConnectionFactory_nativeFreeFactory,
-                         JNIEnv*,
-                         jclass,
-                         jlong j_p) {
-  delete reinterpret_cast<OwnedFactoryAndThreads*>(j_p);
-  if (field_trials_init_string) {
-    field_trial::InitFieldTrialsFromString(NULL);
-    delete field_trials_init_string;
-    field_trials_init_string = NULL;
-  }
-  Trace::ReturnTrace();
-}
-
-JNI_FUNCTION_DECLARATION(void,
-                         PeerConnectionFactory_nativeThreadsCallbacks,
-                         JNIEnv*,
-                         jclass,
-                         jlong j_p) {
-  OwnedFactoryAndThreads* factory =
-      reinterpret_cast<OwnedFactoryAndThreads*>(j_p);
-  factory->InvokeJavaCallbacksOnFactoryThreads();
-}
-
-JNI_FUNCTION_DECLARATION(jlong,
-                         PeerConnectionFactory_nativeCreateLocalMediaStream,
-                         JNIEnv* jni,
-                         jclass,
-                         jlong native_factory,
-                         jstring label) {
-  rtc::scoped_refptr<PeerConnectionFactoryInterface> factory(
-      factoryFromJava(native_factory));
-  rtc::scoped_refptr<MediaStreamInterface> stream(
-      factory->CreateLocalMediaStream(JavaToStdString(jni, label)));
-  return (jlong)stream.release();
-}
-
-JNI_FUNCTION_DECLARATION(jlong,
-                         PeerConnectionFactory_nativeCreateAudioSource,
-                         JNIEnv* jni,
-                         jclass,
-                         jlong native_factory,
-                         jobject j_constraints) {
-  std::unique_ptr<MediaConstraintsJni> constraints(
-      new MediaConstraintsJni(jni, j_constraints));
-  rtc::scoped_refptr<PeerConnectionFactoryInterface> factory(
-      factoryFromJava(native_factory));
-  cricket::AudioOptions options;
-  CopyConstraintsIntoAudioOptions(constraints.get(), &options);
-  rtc::scoped_refptr<AudioSourceInterface> source(
-      factory->CreateAudioSource(options));
-  return (jlong)source.release();
-}
-
-JNI_FUNCTION_DECLARATION(jlong,
-                         PeerConnectionFactory_nativeCreateAudioTrack,
-                         JNIEnv* jni,
-                         jclass,
-                         jlong native_factory,
-                         jstring id,
-                         jlong native_source) {
-  rtc::scoped_refptr<PeerConnectionFactoryInterface> factory(
-      factoryFromJava(native_factory));
-  rtc::scoped_refptr<AudioTrackInterface> track(factory->CreateAudioTrack(
-      JavaToStdString(jni, id),
-      reinterpret_cast<AudioSourceInterface*>(native_source)));
-  return (jlong)track.release();
-}
-
-JNI_FUNCTION_DECLARATION(jboolean,
-                         PeerConnectionFactory_nativeStartAecDump,
-                         JNIEnv* jni,
-                         jclass,
-                         jlong native_factory,
-                         jint file,
-                         jint filesize_limit_bytes) {
-  rtc::scoped_refptr<PeerConnectionFactoryInterface> factory(
-      factoryFromJava(native_factory));
-  return factory->StartAecDump(file, filesize_limit_bytes);
-}
-
-JNI_FUNCTION_DECLARATION(void,
-                         PeerConnectionFactory_nativeStopAecDump,
-                         JNIEnv* jni,
-                         jclass,
-                         jlong native_factory) {
-  rtc::scoped_refptr<PeerConnectionFactoryInterface> factory(
-      factoryFromJava(native_factory));
-  factory->StopAecDump();
-}
-
-JNI_FUNCTION_DECLARATION(void,
-                         PeerConnectionFactory_nativeSetOptions,
-                         JNIEnv* jni,
-                         jclass,
-                         jlong native_factory,
-                         jobject options) {
-  rtc::scoped_refptr<PeerConnectionFactoryInterface> factory(
-      factoryFromJava(native_factory));
-  PeerConnectionFactoryInterface::Options options_to_set =
-      JavaToNativePeerConnectionFactoryOptions(jni, options);
-  factory->SetOptions(options_to_set);
-
-  if (options_to_set.disable_network_monitor) {
-    OwnedFactoryAndThreads* owner =
-        reinterpret_cast<OwnedFactoryAndThreads*>(native_factory);
-    if (owner->network_monitor_factory()) {
-      rtc::NetworkMonitorFactory::ReleaseFactory(
-          owner->network_monitor_factory());
-      owner->clear_network_monitor_factory();
-    }
-  }
-}
-
-JNI_FUNCTION_DECLARATION(jlong,
-                         PeerConnectionFactory_nativeCreatePeerConnection,
-                         JNIEnv* jni,
-                         jclass,
-                         jlong factory,
-                         jobject j_rtc_config,
-                         jobject j_constraints,
-                         jlong observer_p) {
-  rtc::scoped_refptr<PeerConnectionFactoryInterface> f(
-      reinterpret_cast<PeerConnectionFactoryInterface*>(
-          factoryFromJava(factory)));
-
-  PeerConnectionInterface::RTCConfiguration rtc_config(
-      PeerConnectionInterface::RTCConfigurationType::kAggressive);
-  JavaToNativeRTCConfiguration(jni, j_rtc_config, &rtc_config);
-
-  jclass j_rtc_config_class = GetObjectClass(jni, j_rtc_config);
-  jfieldID j_key_type_id = GetFieldID(jni, j_rtc_config_class, "keyType",
-                                      "Lorg/webrtc/PeerConnection$KeyType;");
-  jobject j_key_type = GetObjectField(jni, j_rtc_config, j_key_type_id);
-
-  // Generate non-default certificate.
-  rtc::KeyType key_type = JavaToNativeKeyType(jni, j_key_type);
-  if (key_type != rtc::KT_DEFAULT) {
-    rtc::scoped_refptr<rtc::RTCCertificate> certificate =
-        rtc::RTCCertificateGenerator::GenerateCertificate(
-            rtc::KeyParams(key_type), rtc::Optional<uint64_t>());
-    if (!certificate) {
-      LOG(LS_ERROR) << "Failed to generate certificate. KeyType: " << key_type;
-      return 0;
-    }
-    rtc_config.certificates.push_back(certificate);
-  }
-
-  PeerConnectionObserverJni* observer =
-      reinterpret_cast<PeerConnectionObserverJni*>(observer_p);
-  observer->SetConstraints(new MediaConstraintsJni(jni, j_constraints));
-  CopyConstraintsIntoRtcConfiguration(observer->constraints(), &rtc_config);
-  rtc::scoped_refptr<PeerConnectionInterface> pc(
-      f->CreatePeerConnection(rtc_config, nullptr, nullptr, observer));
-  return (jlong)pc.release();
-}
-
-}  // namespace jni
-}  // namespace webrtc
diff --git a/sdk/android/src/jni/pc/peerconnectionobserver_jni.cc b/sdk/android/src/jni/pc/peerconnectionobserver_jni.cc
deleted file mode 100644
index d65c95c..0000000
--- a/sdk/android/src/jni/pc/peerconnectionobserver_jni.cc
+++ /dev/null
@@ -1,307 +0,0 @@
-/*
- *  Copyright 2017 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/sdk/android/src/jni/pc/peerconnectionobserver_jni.h"
-
-#include <string>
-
-#include "webrtc/sdk/android/src/jni/classreferenceholder.h"
-#include "webrtc/sdk/android/src/jni/pc/java_native_conversion.h"
-
-namespace webrtc {
-namespace jni {
-
-// Convenience, used since callbacks occur on the signaling thread, which may
-// be a non-Java thread.
-static JNIEnv* jni() {
-  return AttachCurrentThreadIfNeeded();
-}
-
-PeerConnectionObserverJni::PeerConnectionObserverJni(JNIEnv* jni,
-                                                     jobject j_observer)
-    : j_observer_global_(jni, j_observer),
-      j_observer_class_(jni, GetObjectClass(jni, *j_observer_global_)),
-      j_media_stream_class_(jni, FindClass(jni, "org/webrtc/MediaStream")),
-      j_media_stream_ctor_(
-          GetMethodID(jni, *j_media_stream_class_, "<init>", "(J)V")),
-      j_audio_track_class_(jni, FindClass(jni, "org/webrtc/AudioTrack")),
-      j_audio_track_ctor_(
-          GetMethodID(jni, *j_audio_track_class_, "<init>", "(J)V")),
-      j_video_track_class_(jni, FindClass(jni, "org/webrtc/VideoTrack")),
-      j_video_track_ctor_(
-          GetMethodID(jni, *j_video_track_class_, "<init>", "(J)V")),
-      j_data_channel_class_(jni, FindClass(jni, "org/webrtc/DataChannel")),
-      j_data_channel_ctor_(
-          GetMethodID(jni, *j_data_channel_class_, "<init>", "(J)V")),
-      j_rtp_receiver_class_(jni, FindClass(jni, "org/webrtc/RtpReceiver")),
-      j_rtp_receiver_ctor_(
-          GetMethodID(jni, *j_rtp_receiver_class_, "<init>", "(J)V")) {}
-
-PeerConnectionObserverJni::~PeerConnectionObserverJni() {
-  ScopedLocalRefFrame local_ref_frame(jni());
-  while (!remote_streams_.empty())
-    DisposeRemoteStream(remote_streams_.begin());
-  while (!rtp_receivers_.empty())
-    DisposeRtpReceiver(rtp_receivers_.begin());
-}
-
-void PeerConnectionObserverJni::OnIceCandidate(
-    const IceCandidateInterface* candidate) {
-  ScopedLocalRefFrame local_ref_frame(jni());
-  std::string sdp;
-  RTC_CHECK(candidate->ToString(&sdp)) << "got so far: " << sdp;
-  jclass candidate_class = FindClass(jni(), "org/webrtc/IceCandidate");
-  jmethodID ctor =
-      GetMethodID(jni(), candidate_class, "<init>",
-                  "(Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;)V");
-  jstring j_mid = JavaStringFromStdString(jni(), candidate->sdp_mid());
-  jstring j_sdp = JavaStringFromStdString(jni(), sdp);
-  jstring j_url = JavaStringFromStdString(jni(), candidate->candidate().url());
-  jobject j_candidate = jni()->NewObject(
-      candidate_class, ctor, j_mid, candidate->sdp_mline_index(), j_sdp, j_url);
-  CHECK_EXCEPTION(jni()) << "error during NewObject";
-  jmethodID m = GetMethodID(jni(), *j_observer_class_, "onIceCandidate",
-                            "(Lorg/webrtc/IceCandidate;)V");
-  jni()->CallVoidMethod(*j_observer_global_, m, j_candidate);
-  CHECK_EXCEPTION(jni()) << "error during CallVoidMethod";
-}
-
-void PeerConnectionObserverJni::OnIceCandidatesRemoved(
-    const std::vector<cricket::Candidate>& candidates) {
-  ScopedLocalRefFrame local_ref_frame(jni());
-  jobjectArray candidates_array = NativeToJavaCandidateArray(jni(), candidates);
-  jmethodID m = GetMethodID(jni(), *j_observer_class_, "onIceCandidatesRemoved",
-                            "([Lorg/webrtc/IceCandidate;)V");
-  jni()->CallVoidMethod(*j_observer_global_, m, candidates_array);
-  CHECK_EXCEPTION(jni()) << "Error during CallVoidMethod";
-}
-
-void PeerConnectionObserverJni::OnSignalingChange(
-    PeerConnectionInterface::SignalingState new_state) {
-  ScopedLocalRefFrame local_ref_frame(jni());
-  jmethodID m = GetMethodID(jni(), *j_observer_class_, "onSignalingChange",
-                            "(Lorg/webrtc/PeerConnection$SignalingState;)V");
-  jobject new_state_enum = JavaEnumFromIndexAndClassName(
-      jni(), "PeerConnection$SignalingState", new_state);
-  jni()->CallVoidMethod(*j_observer_global_, m, new_state_enum);
-  CHECK_EXCEPTION(jni()) << "error during CallVoidMethod";
-}
-
-void PeerConnectionObserverJni::OnIceConnectionChange(
-    PeerConnectionInterface::IceConnectionState new_state) {
-  ScopedLocalRefFrame local_ref_frame(jni());
-  jmethodID m =
-      GetMethodID(jni(), *j_observer_class_, "onIceConnectionChange",
-                  "(Lorg/webrtc/PeerConnection$IceConnectionState;)V");
-  jobject new_state_enum = JavaEnumFromIndexAndClassName(
-      jni(), "PeerConnection$IceConnectionState", new_state);
-  jni()->CallVoidMethod(*j_observer_global_, m, new_state_enum);
-  CHECK_EXCEPTION(jni()) << "error during CallVoidMethod";
-}
-
-void PeerConnectionObserverJni::OnIceConnectionReceivingChange(bool receiving) {
-  ScopedLocalRefFrame local_ref_frame(jni());
-  jmethodID m = GetMethodID(jni(), *j_observer_class_,
-                            "onIceConnectionReceivingChange", "(Z)V");
-  jni()->CallVoidMethod(*j_observer_global_, m, receiving);
-  CHECK_EXCEPTION(jni()) << "error during CallVoidMethod";
-}
-
-void PeerConnectionObserverJni::OnIceGatheringChange(
-    PeerConnectionInterface::IceGatheringState new_state) {
-  ScopedLocalRefFrame local_ref_frame(jni());
-  jmethodID m = GetMethodID(jni(), *j_observer_class_, "onIceGatheringChange",
-                            "(Lorg/webrtc/PeerConnection$IceGatheringState;)V");
-  jobject new_state_enum = JavaEnumFromIndexAndClassName(
-      jni(), "PeerConnection$IceGatheringState", new_state);
-  jni()->CallVoidMethod(*j_observer_global_, m, new_state_enum);
-  CHECK_EXCEPTION(jni()) << "error during CallVoidMethod";
-}
-
-void PeerConnectionObserverJni::OnAddStream(
-    rtc::scoped_refptr<MediaStreamInterface> stream) {
-  ScopedLocalRefFrame local_ref_frame(jni());
-  // The stream could be added into the remote_streams_ map when calling
-  // OnAddTrack.
-  jobject j_stream = GetOrCreateJavaStream(stream);
-
-  for (const auto& track : stream->GetAudioTracks()) {
-    jstring id = JavaStringFromStdString(jni(), track->id());
-    // Java AudioTrack holds one reference. Corresponding Release() is in
-    // MediaStreamTrack_free, triggered by AudioTrack.dispose().
-    track->AddRef();
-    jobject j_track =
-        jni()->NewObject(*j_audio_track_class_, j_audio_track_ctor_,
-                         reinterpret_cast<jlong>(track.get()), id);
-    CHECK_EXCEPTION(jni()) << "error during NewObject";
-    jfieldID audio_tracks_id = GetFieldID(
-        jni(), *j_media_stream_class_, "audioTracks", "Ljava/util/LinkedList;");
-    jobject audio_tracks = GetObjectField(jni(), j_stream, audio_tracks_id);
-    jmethodID add = GetMethodID(jni(), GetObjectClass(jni(), audio_tracks),
-                                "add", "(Ljava/lang/Object;)Z");
-    jboolean added = jni()->CallBooleanMethod(audio_tracks, add, j_track);
-    CHECK_EXCEPTION(jni()) << "error during CallBooleanMethod";
-    RTC_CHECK(added);
-  }
-
-  for (const auto& track : stream->GetVideoTracks()) {
-    jstring id = JavaStringFromStdString(jni(), track->id());
-    // Java VideoTrack holds one reference. Corresponding Release() is in
-    // MediaStreamTrack_free, triggered by VideoTrack.dispose().
-    track->AddRef();
-    jobject j_track =
-        jni()->NewObject(*j_video_track_class_, j_video_track_ctor_,
-                         reinterpret_cast<jlong>(track.get()), id);
-    CHECK_EXCEPTION(jni()) << "error during NewObject";
-    jfieldID video_tracks_id = GetFieldID(
-        jni(), *j_media_stream_class_, "videoTracks", "Ljava/util/LinkedList;");
-    jobject video_tracks = GetObjectField(jni(), j_stream, video_tracks_id);
-    jmethodID add = GetMethodID(jni(), GetObjectClass(jni(), video_tracks),
-                                "add", "(Ljava/lang/Object;)Z");
-    jboolean added = jni()->CallBooleanMethod(video_tracks, add, j_track);
-    CHECK_EXCEPTION(jni()) << "error during CallBooleanMethod";
-    RTC_CHECK(added);
-  }
-
-  jmethodID m = GetMethodID(jni(), *j_observer_class_, "onAddStream",
-                            "(Lorg/webrtc/MediaStream;)V");
-  jni()->CallVoidMethod(*j_observer_global_, m, j_stream);
-  CHECK_EXCEPTION(jni()) << "error during CallVoidMethod";
-}
-
-void PeerConnectionObserverJni::OnRemoveStream(
-    rtc::scoped_refptr<MediaStreamInterface> stream) {
-  ScopedLocalRefFrame local_ref_frame(jni());
-  NativeToJavaStreamsMap::iterator it = remote_streams_.find(stream);
-  RTC_CHECK(it != remote_streams_.end())
-      << "unexpected stream: " << std::hex << stream;
-  jobject j_stream = it->second;
-  jmethodID m = GetMethodID(jni(), *j_observer_class_, "onRemoveStream",
-                            "(Lorg/webrtc/MediaStream;)V");
-  jni()->CallVoidMethod(*j_observer_global_, m, j_stream);
-  CHECK_EXCEPTION(jni()) << "error during CallVoidMethod";
-  // Release the refptr reference so that DisposeRemoteStream can assert
-  // it removes the final reference.
-  stream = nullptr;
-  DisposeRemoteStream(it);
-}
-
-void PeerConnectionObserverJni::OnDataChannel(
-    rtc::scoped_refptr<DataChannelInterface> channel) {
-  ScopedLocalRefFrame local_ref_frame(jni());
-  jobject j_channel =
-      jni()->NewObject(*j_data_channel_class_, j_data_channel_ctor_,
-                       jlongFromPointer(channel.get()));
-  CHECK_EXCEPTION(jni()) << "error during NewObject";
-
-  jmethodID m = GetMethodID(jni(), *j_observer_class_, "onDataChannel",
-                            "(Lorg/webrtc/DataChannel;)V");
-  jni()->CallVoidMethod(*j_observer_global_, m, j_channel);
-
-  // Channel is now owned by Java object, and will be freed from
-  // DataChannel.dispose().  Important that this be done _after_ the
-  // CallVoidMethod above as Java code might call back into native code and be
-  // surprised to see a refcount of 2.
-  int bumped_count = channel->AddRef();
-  RTC_CHECK(bumped_count == 2) << "Unexpected refcount OnDataChannel";
-
-  CHECK_EXCEPTION(jni()) << "error during CallVoidMethod";
-}
-
-void PeerConnectionObserverJni::OnRenegotiationNeeded() {
-  ScopedLocalRefFrame local_ref_frame(jni());
-  jmethodID m =
-      GetMethodID(jni(), *j_observer_class_, "onRenegotiationNeeded", "()V");
-  jni()->CallVoidMethod(*j_observer_global_, m);
-  CHECK_EXCEPTION(jni()) << "error during CallVoidMethod";
-}
-
-void PeerConnectionObserverJni::OnAddTrack(
-    rtc::scoped_refptr<RtpReceiverInterface> receiver,
-    const std::vector<rtc::scoped_refptr<MediaStreamInterface>>& streams) {
-  ScopedLocalRefFrame local_ref_frame(jni());
-  jobject j_rtp_receiver =
-      jni()->NewObject(*j_rtp_receiver_class_, j_rtp_receiver_ctor_,
-                       jlongFromPointer(receiver.get()));
-  CHECK_EXCEPTION(jni()) << "error during NewObject";
-  receiver->AddRef();
-  rtp_receivers_[receiver] = NewGlobalRef(jni(), j_rtp_receiver);
-
-  jobjectArray j_stream_array = NativeToJavaMediaStreamArray(jni(), streams);
-  jmethodID m =
-      GetMethodID(jni(), *j_observer_class_, "onAddTrack",
-                  "(Lorg/webrtc/RtpReceiver;[Lorg/webrtc/MediaStream;)V");
-  jni()->CallVoidMethod(*j_observer_global_, m, j_rtp_receiver, j_stream_array);
-  CHECK_EXCEPTION(jni()) << "Error during CallVoidMethod";
-}
-
-void PeerConnectionObserverJni::SetConstraints(
-    MediaConstraintsJni* constraints) {
-  RTC_CHECK(!constraints_.get()) << "constraints already set!";
-  constraints_.reset(constraints);
-}
-
-void PeerConnectionObserverJni::DisposeRemoteStream(
-    const NativeToJavaStreamsMap::iterator& it) {
-  jobject j_stream = it->second;
-  remote_streams_.erase(it);
-  jni()->CallVoidMethod(
-      j_stream, GetMethodID(jni(), *j_media_stream_class_, "dispose", "()V"));
-  CHECK_EXCEPTION(jni()) << "error during MediaStream.dispose()";
-  DeleteGlobalRef(jni(), j_stream);
-}
-
-void PeerConnectionObserverJni::DisposeRtpReceiver(
-    const NativeToJavaRtpReceiverMap::iterator& it) {
-  jobject j_rtp_receiver = it->second;
-  rtp_receivers_.erase(it);
-  jni()->CallVoidMethod(
-      j_rtp_receiver,
-      GetMethodID(jni(), *j_rtp_receiver_class_, "dispose", "()V"));
-  CHECK_EXCEPTION(jni()) << "error during RtpReceiver.dispose()";
-  DeleteGlobalRef(jni(), j_rtp_receiver);
-}
-
-// If the NativeToJavaStreamsMap contains the stream, return it.
-// Otherwise, create a new Java MediaStream.
-jobject PeerConnectionObserverJni::GetOrCreateJavaStream(
-    const rtc::scoped_refptr<MediaStreamInterface>& stream) {
-  NativeToJavaStreamsMap::iterator it = remote_streams_.find(stream);
-  if (it != remote_streams_.end()) {
-    return it->second;
-  }
-
-  // Java MediaStream holds one reference. Corresponding Release() is in
-  // MediaStream_free, triggered by MediaStream.dispose().
-  stream->AddRef();
-  jobject j_stream =
-      jni()->NewObject(*j_media_stream_class_, j_media_stream_ctor_,
-                       reinterpret_cast<jlong>(stream.get()));
-  CHECK_EXCEPTION(jni()) << "error during NewObject";
-
-  remote_streams_[stream] = NewGlobalRef(jni(), j_stream);
-  return j_stream;
-}
-
-jobjectArray PeerConnectionObserverJni::NativeToJavaMediaStreamArray(
-    JNIEnv* jni,
-    const std::vector<rtc::scoped_refptr<MediaStreamInterface>>& streams) {
-  jobjectArray java_streams =
-      jni->NewObjectArray(streams.size(), *j_media_stream_class_, nullptr);
-  CHECK_EXCEPTION(jni) << "error during NewObjectArray";
-  for (size_t i = 0; i < streams.size(); ++i) {
-    jobject j_stream = GetOrCreateJavaStream(streams[i]);
-    jni->SetObjectArrayElement(java_streams, i, j_stream);
-  }
-  return java_streams;
-}
-
-}  // namespace jni
-}  // namespace webrtc
diff --git a/sdk/android/src/jni/pc/peerconnectionobserver_jni.h b/sdk/android/src/jni/pc/peerconnectionobserver_jni.h
deleted file mode 100644
index d543b35..0000000
--- a/sdk/android/src/jni/pc/peerconnectionobserver_jni.h
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- *  Copyright 2017 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_SDK_ANDROID_SRC_JNI_PC_PEERCONNECTIONOBSERVER_JNI_H_
-#define WEBRTC_SDK_ANDROID_SRC_JNI_PC_PEERCONNECTIONOBSERVER_JNI_H_
-
-#include <map>
-#include <memory>
-#include <vector>
-
-#include "webrtc/api/peerconnectioninterface.h"
-#include "webrtc/sdk/android/src/jni/jni_helpers.h"
-#include "webrtc/sdk/android/src/jni/pc/mediaconstraints_jni.h"
-
-namespace webrtc {
-namespace jni {
-
-// Adapter between the C++ PeerConnectionObserver interface and the Java
-// PeerConnection.Observer interface.  Wraps an instance of the Java interface
-// and dispatches C++ callbacks to Java.
-class PeerConnectionObserverJni : public PeerConnectionObserver {
- public:
-  PeerConnectionObserverJni(JNIEnv* jni, jobject j_observer);
-  virtual ~PeerConnectionObserverJni();
-
-  // Implementation of PeerConnectionObserver interface, which propagates
-  // the callbacks to the Java observer.
-  void OnIceCandidate(const IceCandidateInterface* candidate) override;
-  void OnIceCandidatesRemoved(
-      const std::vector<cricket::Candidate>& candidates) override;
-  void OnSignalingChange(
-      PeerConnectionInterface::SignalingState new_state) override;
-  void OnIceConnectionChange(
-      PeerConnectionInterface::IceConnectionState new_state) override;
-  void OnIceConnectionReceivingChange(bool receiving) override;
-  void OnIceGatheringChange(
-      PeerConnectionInterface::IceGatheringState new_state) override;
-  void OnAddStream(rtc::scoped_refptr<MediaStreamInterface> stream) override;
-  void OnRemoveStream(rtc::scoped_refptr<MediaStreamInterface> stream) override;
-  void OnDataChannel(rtc::scoped_refptr<DataChannelInterface> channel) override;
-  void OnRenegotiationNeeded() override;
-  void OnAddTrack(rtc::scoped_refptr<RtpReceiverInterface> receiver,
-                  const std::vector<rtc::scoped_refptr<MediaStreamInterface>>&
-                      streams) override;
-
-  void SetConstraints(MediaConstraintsJni* constraints);
-  const MediaConstraintsJni* constraints() { return constraints_.get(); }
-
- private:
-  typedef std::map<MediaStreamInterface*, jobject> NativeToJavaStreamsMap;
-  typedef std::map<RtpReceiverInterface*, jobject> NativeToJavaRtpReceiverMap;
-
-  void DisposeRemoteStream(const NativeToJavaStreamsMap::iterator& it);
-  void DisposeRtpReceiver(const NativeToJavaRtpReceiverMap::iterator& it);
-
-  // If the NativeToJavaStreamsMap contains the stream, return it.
-  // Otherwise, create a new Java MediaStream.
-  jobject GetOrCreateJavaStream(
-      const rtc::scoped_refptr<MediaStreamInterface>& stream);
-
-  // Converts array of streams, creating or re-using Java streams as necessary.
-  jobjectArray NativeToJavaMediaStreamArray(
-      JNIEnv* jni,
-      const std::vector<rtc::scoped_refptr<MediaStreamInterface>>& streams);
-
-  const ScopedGlobalRef<jobject> j_observer_global_;
-  const ScopedGlobalRef<jclass> j_observer_class_;
-  const ScopedGlobalRef<jclass> j_media_stream_class_;
-  const jmethodID j_media_stream_ctor_;
-  const ScopedGlobalRef<jclass> j_audio_track_class_;
-  const jmethodID j_audio_track_ctor_;
-  const ScopedGlobalRef<jclass> j_video_track_class_;
-  const jmethodID j_video_track_ctor_;
-  const ScopedGlobalRef<jclass> j_data_channel_class_;
-  const jmethodID j_data_channel_ctor_;
-  const ScopedGlobalRef<jclass> j_rtp_receiver_class_;
-  const jmethodID j_rtp_receiver_ctor_;
-  // C++ -> Java remote streams. The stored jobects are global refs and must be
-  // manually deleted upon removal. Use DisposeRemoteStream().
-  NativeToJavaStreamsMap remote_streams_;
-  NativeToJavaRtpReceiverMap rtp_receivers_;
-  std::unique_ptr<MediaConstraintsJni> constraints_;
-};
-
-}  // namespace jni
-}  // namespace webrtc
-
-#endif  // WEBRTC_SDK_ANDROID_SRC_JNI_PC_PEERCONNECTIONOBSERVER_JNI_H_
diff --git a/sdk/android/src/jni/pc/rtcstatscollectorcallbackwrapper.cc b/sdk/android/src/jni/pc/rtcstatscollectorcallbackwrapper.cc
deleted file mode 100644
index 5be96f5..0000000
--- a/sdk/android/src/jni/pc/rtcstatscollectorcallbackwrapper.cc
+++ /dev/null
@@ -1,267 +0,0 @@
-/*
- *  Copyright 2017 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/sdk/android/src/jni/pc/rtcstatscollectorcallbackwrapper.h"
-
-#include <string>
-#include <vector>
-
-#include "webrtc/sdk/android/src/jni/classreferenceholder.h"
-
-namespace webrtc {
-namespace jni {
-
-RTCStatsCollectorCallbackWrapper::RTCStatsCollectorCallbackWrapper(
-    JNIEnv* jni,
-    jobject j_callback)
-    : j_callback_global_(jni, j_callback),
-      j_callback_class_(jni, GetObjectClass(jni, j_callback)),
-      j_stats_report_class_(FindClass(jni, "org/webrtc/RTCStatsReport")),
-      j_stats_report_ctor_(GetMethodID(jni,
-                                       j_stats_report_class_,
-                                       "<init>",
-                                       "(JLjava/util/Map;)V")),
-      j_stats_class_(FindClass(jni, "org/webrtc/RTCStats")),
-      j_stats_ctor_(GetMethodID(
-          jni,
-          j_stats_class_,
-          "<init>",
-          "(JLjava/lang/String;Ljava/lang/String;Ljava/util/Map;)V")),
-      j_linked_hash_map_class_(FindClass(jni, "java/util/LinkedHashMap")),
-      j_linked_hash_map_ctor_(
-          GetMethodID(jni, j_linked_hash_map_class_, "<init>", "()V")),
-      j_linked_hash_map_put_(GetMethodID(
-          jni,
-          j_linked_hash_map_class_,
-          "put",
-          "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;")),
-      j_boolean_class_(FindClass(jni, "java/lang/Boolean")),
-      j_boolean_ctor_(GetMethodID(jni, j_boolean_class_, "<init>", "(Z)V")),
-      j_integer_class_(FindClass(jni, "java/lang/Integer")),
-      j_integer_ctor_(GetMethodID(jni, j_integer_class_, "<init>", "(I)V")),
-      j_long_class_(FindClass(jni, "java/lang/Long")),
-      j_long_ctor_(GetMethodID(jni, j_long_class_, "<init>", "(J)V")),
-      j_big_integer_class_(FindClass(jni, "java/math/BigInteger")),
-      j_big_integer_ctor_(GetMethodID(jni,
-                                      j_big_integer_class_,
-                                      "<init>",
-                                      "(Ljava/lang/String;)V")),
-      j_double_class_(FindClass(jni, "java/lang/Double")),
-      j_double_ctor_(GetMethodID(jni, j_double_class_, "<init>", "(D)V")),
-      j_string_class_(FindClass(jni, "java/lang/String")) {}
-
-void RTCStatsCollectorCallbackWrapper::OnStatsDelivered(
-    const rtc::scoped_refptr<const RTCStatsReport>& report) {
-  JNIEnv* jni = AttachCurrentThreadIfNeeded();
-  ScopedLocalRefFrame local_ref_frame(jni);
-  jobject j_report = ReportToJava(jni, report);
-  jmethodID m = GetMethodID(jni, *j_callback_class_, "onStatsDelivered",
-                            "(Lorg/webrtc/RTCStatsReport;)V");
-  jni->CallVoidMethod(*j_callback_global_, m, j_report);
-  CHECK_EXCEPTION(jni) << "error during CallVoidMethod";
-}
-
-jobject RTCStatsCollectorCallbackWrapper::ReportToJava(
-    JNIEnv* jni,
-    const rtc::scoped_refptr<const RTCStatsReport>& report) {
-  jobject j_stats_map =
-      jni->NewObject(j_linked_hash_map_class_, j_linked_hash_map_ctor_);
-  CHECK_EXCEPTION(jni) << "error during NewObject";
-  for (const RTCStats& stats : *report) {
-    // Create a local reference frame for each RTCStats, since there is a
-    // maximum number of references that can be created in one frame.
-    ScopedLocalRefFrame local_ref_frame(jni);
-    jstring j_id = JavaStringFromStdString(jni, stats.id());
-    jobject j_stats = StatsToJava(jni, stats);
-    jni->CallObjectMethod(j_stats_map, j_linked_hash_map_put_, j_id, j_stats);
-    CHECK_EXCEPTION(jni) << "error during CallObjectMethod";
-  }
-  jobject j_report = jni->NewObject(j_stats_report_class_, j_stats_report_ctor_,
-                                    report->timestamp_us(), j_stats_map);
-  CHECK_EXCEPTION(jni) << "error during NewObject";
-  return j_report;
-}
-
-jobject RTCStatsCollectorCallbackWrapper::StatsToJava(JNIEnv* jni,
-                                                      const RTCStats& stats) {
-  jstring j_type = JavaStringFromStdString(jni, stats.type());
-  jstring j_id = JavaStringFromStdString(jni, stats.id());
-  jobject j_members =
-      jni->NewObject(j_linked_hash_map_class_, j_linked_hash_map_ctor_);
-  for (const RTCStatsMemberInterface* member : stats.Members()) {
-    if (!member->is_defined()) {
-      continue;
-    }
-    // Create a local reference frame for each member as well.
-    ScopedLocalRefFrame local_ref_frame(jni);
-    jstring j_name = JavaStringFromStdString(jni, member->name());
-    jobject j_member = MemberToJava(jni, member);
-    jni->CallObjectMethod(j_members, j_linked_hash_map_put_, j_name, j_member);
-    CHECK_EXCEPTION(jni) << "error during CallObjectMethod";
-  }
-  jobject j_stats =
-      jni->NewObject(j_stats_class_, j_stats_ctor_, stats.timestamp_us(),
-                     j_type, j_id, j_members);
-  CHECK_EXCEPTION(jni) << "error during NewObject";
-  return j_stats;
-}
-
-jobject RTCStatsCollectorCallbackWrapper::MemberToJava(
-    JNIEnv* jni,
-    const RTCStatsMemberInterface* member) {
-  switch (member->type()) {
-    case RTCStatsMemberInterface::kBool: {
-      jobject value = jni->NewObject(j_boolean_class_, j_boolean_ctor_,
-                                     *member->cast_to<RTCStatsMember<bool>>());
-      CHECK_EXCEPTION(jni) << "error during NewObject";
-      return value;
-    }
-    case RTCStatsMemberInterface::kInt32: {
-      jobject value =
-          jni->NewObject(j_integer_class_, j_integer_ctor_,
-                         *member->cast_to<RTCStatsMember<int32_t>>());
-      CHECK_EXCEPTION(jni) << "error during NewObject";
-      return value;
-    }
-    case RTCStatsMemberInterface::kUint32: {
-      jobject value =
-          jni->NewObject(j_long_class_, j_long_ctor_,
-                         (jlong)*member->cast_to<RTCStatsMember<uint32_t>>());
-      CHECK_EXCEPTION(jni) << "error during NewObject";
-      return value;
-    }
-    case RTCStatsMemberInterface::kInt64: {
-      jobject value =
-          jni->NewObject(j_long_class_, j_long_ctor_,
-                         *member->cast_to<RTCStatsMember<int64_t>>());
-      CHECK_EXCEPTION(jni) << "error during NewObject";
-      return value;
-    }
-    case RTCStatsMemberInterface::kUint64: {
-      jobject value =
-          jni->NewObject(j_big_integer_class_, j_big_integer_ctor_,
-                         JavaStringFromStdString(jni, member->ValueToString()));
-      CHECK_EXCEPTION(jni) << "error during NewObject";
-      return value;
-    }
-    case RTCStatsMemberInterface::kDouble: {
-      jobject value =
-          jni->NewObject(j_double_class_, j_double_ctor_,
-                         *member->cast_to<RTCStatsMember<double>>());
-      CHECK_EXCEPTION(jni) << "error during NewObject";
-      return value;
-    }
-    case RTCStatsMemberInterface::kString: {
-      return JavaStringFromStdString(
-          jni, *member->cast_to<RTCStatsMember<std::string>>());
-    }
-    case RTCStatsMemberInterface::kSequenceBool: {
-      const std::vector<bool>& values =
-          *member->cast_to<RTCStatsMember<std::vector<bool>>>();
-      jobjectArray j_values =
-          jni->NewObjectArray(values.size(), j_boolean_class_, nullptr);
-      CHECK_EXCEPTION(jni) << "error during NewObjectArray";
-      for (size_t i = 0; i < values.size(); ++i) {
-        jobject value =
-            jni->NewObject(j_boolean_class_, j_boolean_ctor_, values[i]);
-        jni->SetObjectArrayElement(j_values, i, value);
-        CHECK_EXCEPTION(jni) << "error during SetObjectArrayElement";
-      }
-      return j_values;
-    }
-    case RTCStatsMemberInterface::kSequenceInt32: {
-      const std::vector<int32_t>& values =
-          *member->cast_to<RTCStatsMember<std::vector<int32_t>>>();
-      jobjectArray j_values =
-          jni->NewObjectArray(values.size(), j_integer_class_, nullptr);
-      CHECK_EXCEPTION(jni) << "error during NewObjectArray";
-      for (size_t i = 0; i < values.size(); ++i) {
-        jobject value =
-            jni->NewObject(j_integer_class_, j_integer_ctor_, values[i]);
-        jni->SetObjectArrayElement(j_values, i, value);
-        CHECK_EXCEPTION(jni) << "error during SetObjectArrayElement";
-      }
-      return j_values;
-    }
-    case RTCStatsMemberInterface::kSequenceUint32: {
-      const std::vector<uint32_t>& values =
-          *member->cast_to<RTCStatsMember<std::vector<uint32_t>>>();
-      jobjectArray j_values =
-          jni->NewObjectArray(values.size(), j_long_class_, nullptr);
-      CHECK_EXCEPTION(jni) << "error during NewObjectArray";
-      for (size_t i = 0; i < values.size(); ++i) {
-        jobject value = jni->NewObject(j_long_class_, j_long_ctor_, values[i]);
-        jni->SetObjectArrayElement(j_values, i, value);
-        CHECK_EXCEPTION(jni) << "error during SetObjectArrayElement";
-      }
-      return j_values;
-    }
-    case RTCStatsMemberInterface::kSequenceInt64: {
-      const std::vector<int64_t>& values =
-          *member->cast_to<RTCStatsMember<std::vector<int64_t>>>();
-      jobjectArray j_values =
-          jni->NewObjectArray(values.size(), j_long_class_, nullptr);
-      CHECK_EXCEPTION(jni) << "error during NewObjectArray";
-      for (size_t i = 0; i < values.size(); ++i) {
-        jobject value = jni->NewObject(j_long_class_, j_long_ctor_, values[i]);
-        jni->SetObjectArrayElement(j_values, i, value);
-        CHECK_EXCEPTION(jni) << "error during SetObjectArrayElement";
-      }
-      return j_values;
-    }
-    case RTCStatsMemberInterface::kSequenceUint64: {
-      const std::vector<uint64_t>& values =
-          *member->cast_to<RTCStatsMember<std::vector<uint64_t>>>();
-      jobjectArray j_values =
-          jni->NewObjectArray(values.size(), j_big_integer_class_, nullptr);
-      CHECK_EXCEPTION(jni) << "error during NewObjectArray";
-      for (size_t i = 0; i < values.size(); ++i) {
-        jobject value = jni->NewObject(
-            j_big_integer_class_, j_big_integer_ctor_,
-            JavaStringFromStdString(jni, rtc::ToString(values[i])));
-        jni->SetObjectArrayElement(j_values, i, value);
-        CHECK_EXCEPTION(jni) << "error during SetObjectArrayElement";
-      }
-      return j_values;
-    }
-    case RTCStatsMemberInterface::kSequenceDouble: {
-      const std::vector<double>& values =
-          *member->cast_to<RTCStatsMember<std::vector<double>>>();
-      jobjectArray j_values =
-          jni->NewObjectArray(values.size(), j_double_class_, nullptr);
-      CHECK_EXCEPTION(jni) << "error during NewObjectArray";
-      for (size_t i = 0; i < values.size(); ++i) {
-        jobject value =
-            jni->NewObject(j_double_class_, j_double_ctor_, values[i]);
-        jni->SetObjectArrayElement(j_values, i, value);
-        CHECK_EXCEPTION(jni) << "error during SetObjectArrayElement";
-      }
-      return j_values;
-    }
-    case RTCStatsMemberInterface::kSequenceString: {
-      const std::vector<std::string>& values =
-          *member->cast_to<RTCStatsMember<std::vector<std::string>>>();
-      jobjectArray j_values =
-          jni->NewObjectArray(values.size(), j_string_class_, nullptr);
-      CHECK_EXCEPTION(jni) << "error during NewObjectArray";
-      for (size_t i = 0; i < values.size(); ++i) {
-        jni->SetObjectArrayElement(j_values, i,
-                                   JavaStringFromStdString(jni, values[i]));
-        CHECK_EXCEPTION(jni) << "error during SetObjectArrayElement";
-      }
-      return j_values;
-    }
-  }
-  RTC_NOTREACHED();
-  return nullptr;
-}
-
-}  // namespace jni
-}  // namespace webrtc
diff --git a/sdk/android/src/jni/pc/rtcstatscollectorcallbackwrapper.h b/sdk/android/src/jni/pc/rtcstatscollectorcallbackwrapper.h
deleted file mode 100644
index 5727074..0000000
--- a/sdk/android/src/jni/pc/rtcstatscollectorcallbackwrapper.h
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- *  Copyright 2017 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_SDK_ANDROID_SRC_JNI_PC_RTCSTATSCOLLECTORCALLBACKWRAPPER_H_
-#define WEBRTC_SDK_ANDROID_SRC_JNI_PC_RTCSTATSCOLLECTORCALLBACKWRAPPER_H_
-
-#include <jni.h>
-
-#include "webrtc/api/peerconnectioninterface.h"
-#include "webrtc/sdk/android/src/jni/jni_helpers.h"
-
-namespace webrtc {
-namespace jni {
-
-// Adapter for a Java RTCStatsCollectorCallback presenting a C++
-// RTCStatsCollectorCallback and dispatching the callback from C++ back to
-// Java.
-class RTCStatsCollectorCallbackWrapper : public RTCStatsCollectorCallback {
- public:
-  RTCStatsCollectorCallbackWrapper(JNIEnv* jni, jobject j_callback);
-
-  void OnStatsDelivered(
-      const rtc::scoped_refptr<const RTCStatsReport>& report) override;
-
- private:
-  // Helper functions for converting C++ RTCStatsReport to Java equivalent.
-  jobject ReportToJava(JNIEnv* jni,
-                       const rtc::scoped_refptr<const RTCStatsReport>& report);
-  jobject StatsToJava(JNIEnv* jni, const RTCStats& stats);
-  jobject MemberToJava(JNIEnv* jni, const RTCStatsMemberInterface* member);
-
-  const ScopedGlobalRef<jobject> j_callback_global_;
-  const ScopedGlobalRef<jclass> j_callback_class_;
-  const jclass j_stats_report_class_;
-  const jmethodID j_stats_report_ctor_;
-  const jclass j_stats_class_;
-  const jmethodID j_stats_ctor_;
-  const jclass j_linked_hash_map_class_;
-  const jmethodID j_linked_hash_map_ctor_;
-  const jmethodID j_linked_hash_map_put_;
-  const jclass j_boolean_class_;
-  const jmethodID j_boolean_ctor_;
-  const jclass j_integer_class_;
-  const jmethodID j_integer_ctor_;
-  const jclass j_long_class_;
-  const jmethodID j_long_ctor_;
-  const jclass j_big_integer_class_;
-  const jmethodID j_big_integer_ctor_;
-  const jclass j_double_class_;
-  const jmethodID j_double_ctor_;
-  const jclass j_string_class_;
-};
-
-}  // namespace jni
-}  // namespace webrtc
-
-#endif  // WEBRTC_SDK_ANDROID_SRC_JNI_PC_RTCSTATSCOLLECTORCALLBACKWRAPPER_H_
diff --git a/sdk/android/src/jni/pc/rtpreceiver_jni.cc b/sdk/android/src/jni/pc/rtpreceiver_jni.cc
deleted file mode 100644
index 2a4ed95..0000000
--- a/sdk/android/src/jni/pc/rtpreceiver_jni.cc
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- *  Copyright 2017 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/api/rtpreceiverinterface.h"
-#include "webrtc/sdk/android/src/jni/jni_helpers.h"
-#include "webrtc/sdk/android/src/jni/pc/java_native_conversion.h"
-#include "webrtc/sdk/android/src/jni/pc/rtpreceiverobserver_jni.h"
-
-namespace webrtc {
-namespace jni {
-
-JNI_FUNCTION_DECLARATION(jlong,
-                         RtpReceiver_nativeGetTrack,
-                         JNIEnv* jni,
-                         jclass,
-                         jlong j_rtp_receiver_pointer,
-                         jlong j_track_pointer) {
-  return jlongFromPointer(
-      reinterpret_cast<RtpReceiverInterface*>(j_rtp_receiver_pointer)
-          ->track()
-          .release());
-}
-
-JNI_FUNCTION_DECLARATION(jboolean,
-                         RtpReceiver_nativeSetParameters,
-                         JNIEnv* jni,
-                         jclass,
-                         jlong j_rtp_receiver_pointer,
-                         jobject j_parameters) {
-  if (IsNull(jni, j_parameters)) {
-    return false;
-  }
-  RtpParameters parameters;
-  JavaToNativeRtpParameters(jni, j_parameters, &parameters);
-  return reinterpret_cast<RtpReceiverInterface*>(j_rtp_receiver_pointer)
-      ->SetParameters(parameters);
-}
-
-JNI_FUNCTION_DECLARATION(jobject,
-                         RtpReceiver_nativeGetParameters,
-                         JNIEnv* jni,
-                         jclass,
-                         jlong j_rtp_receiver_pointer) {
-  RtpParameters parameters =
-      reinterpret_cast<RtpReceiverInterface*>(j_rtp_receiver_pointer)
-          ->GetParameters();
-  return NativeToJavaRtpParameters(jni, parameters);
-}
-
-JNI_FUNCTION_DECLARATION(jstring,
-                         RtpReceiver_nativeId,
-                         JNIEnv* jni,
-                         jclass,
-                         jlong j_rtp_receiver_pointer) {
-  return JavaStringFromStdString(
-      jni,
-      reinterpret_cast<RtpReceiverInterface*>(j_rtp_receiver_pointer)->id());
-}
-
-JNI_FUNCTION_DECLARATION(jlong,
-                         RtpReceiver_nativeSetObserver,
-                         JNIEnv* jni,
-                         jclass,
-                         jlong j_rtp_receiver_pointer,
-                         jobject j_observer) {
-  RtpReceiverObserverJni* rtpReceiverObserver =
-      new RtpReceiverObserverJni(jni, j_observer);
-  reinterpret_cast<RtpReceiverInterface*>(j_rtp_receiver_pointer)
-      ->SetObserver(rtpReceiverObserver);
-  return jlongFromPointer(rtpReceiverObserver);
-}
-
-JNI_FUNCTION_DECLARATION(void,
-                         RtpReceiver_nativeUnsetObserver,
-                         JNIEnv* jni,
-                         jclass,
-                         jlong j_rtp_receiver_pointer,
-                         jlong j_observer_pointer) {
-  reinterpret_cast<RtpReceiverInterface*>(j_rtp_receiver_pointer)
-      ->SetObserver(nullptr);
-  RtpReceiverObserverJni* observer =
-      reinterpret_cast<RtpReceiverObserverJni*>(j_observer_pointer);
-  if (observer) {
-    delete observer;
-  }
-}
-
-}  // namespace jni
-}  // namespace webrtc
diff --git a/sdk/android/src/jni/pc/rtpreceiverobserver_jni.cc b/sdk/android/src/jni/pc/rtpreceiverobserver_jni.cc
deleted file mode 100644
index 89a348f..0000000
--- a/sdk/android/src/jni/pc/rtpreceiverobserver_jni.cc
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- *  Copyright 2017 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/sdk/android/src/jni/pc/rtpreceiverobserver_jni.h"
-
-#include "webrtc/sdk/android/src/jni/pc/java_native_conversion.h"
-
-namespace webrtc {
-namespace jni {
-
-void RtpReceiverObserverJni::OnFirstPacketReceived(
-    cricket::MediaType media_type) {
-  JNIEnv* const jni = AttachCurrentThreadIfNeeded();
-
-  jmethodID j_on_first_packet_received_mid = GetMethodID(
-      jni, GetObjectClass(jni, *j_observer_global_), "onFirstPacketReceived",
-      "(Lorg/webrtc/MediaStreamTrack$MediaType;)V");
-  // Get the Java version of media type.
-  jobject JavaMediaType = NativeToJavaMediaType(jni, media_type);
-  // Trigger the callback function.
-  jni->CallVoidMethod(*j_observer_global_, j_on_first_packet_received_mid,
-                      JavaMediaType);
-  CHECK_EXCEPTION(jni) << "error during CallVoidMethod";
-}
-
-}  // namespace jni
-}  // namespace webrtc
diff --git a/sdk/android/src/jni/pc/rtpreceiverobserver_jni.h b/sdk/android/src/jni/pc/rtpreceiverobserver_jni.h
deleted file mode 100644
index ef58f97..0000000
--- a/sdk/android/src/jni/pc/rtpreceiverobserver_jni.h
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- *  Copyright 2017 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_SDK_ANDROID_SRC_JNI_PC_RTPRECEIVEROBSERVER_JNI_H_
-#define WEBRTC_SDK_ANDROID_SRC_JNI_PC_RTPRECEIVEROBSERVER_JNI_H_
-
-#include "webrtc/api/rtpreceiverinterface.h"
-#include "webrtc/sdk/android/src/jni/jni_helpers.h"
-
-namespace webrtc {
-namespace jni {
-
-// Adapter between the C++ RtpReceiverObserverInterface and the Java
-// RtpReceiver.Observer interface. Wraps an instance of the Java interface and
-// dispatches C++ callbacks to Java.
-class RtpReceiverObserverJni : public RtpReceiverObserverInterface {
- public:
-  RtpReceiverObserverJni(JNIEnv* jni, jobject j_observer)
-      : j_observer_global_(jni, j_observer) {}
-
-  ~RtpReceiverObserverJni() override {}
-
-  void OnFirstPacketReceived(cricket::MediaType media_type) override;
-
- private:
-  const ScopedGlobalRef<jobject> j_observer_global_;
-};
-
-}  // namespace jni
-}  // namespace webrtc
-
-#endif  // WEBRTC_SDK_ANDROID_SRC_JNI_PC_RTPRECEIVEROBSERVER_JNI_H_
diff --git a/sdk/android/src/jni/pc/rtpsender_jni.cc b/sdk/android/src/jni/pc/rtpsender_jni.cc
deleted file mode 100644
index 8cd1dcc..0000000
--- a/sdk/android/src/jni/pc/rtpsender_jni.cc
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- *  Copyright 2017 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/api/rtpsenderinterface.h"
-#include "webrtc/sdk/android/src/jni/jni_helpers.h"
-#include "webrtc/sdk/android/src/jni/pc/java_native_conversion.h"
-
-namespace webrtc {
-namespace jni {
-
-JNI_FUNCTION_DECLARATION(jboolean,
-                         RtpSender_nativeSetTrack,
-                         JNIEnv* jni,
-                         jclass,
-                         jlong j_rtp_sender_pointer,
-                         jlong j_track_pointer) {
-  return reinterpret_cast<RtpSenderInterface*>(j_rtp_sender_pointer)
-      ->SetTrack(reinterpret_cast<MediaStreamTrackInterface*>(j_track_pointer));
-}
-
-JNI_FUNCTION_DECLARATION(jlong,
-                         RtpSender_nativeGetTrack,
-                         JNIEnv* jni,
-                         jclass,
-                         jlong j_rtp_sender_pointer) {
-  return jlongFromPointer(
-      reinterpret_cast<RtpSenderInterface*>(j_rtp_sender_pointer)
-          ->track()
-          .release());
-}
-
-JNI_FUNCTION_DECLARATION(jlong,
-                         RtpSender_nativeGetDtmfSender,
-                         JNIEnv* jni,
-                         jclass,
-                         jlong j_rtp_sender_pointer) {
-  return jlongFromPointer(
-      reinterpret_cast<RtpSenderInterface*>(j_rtp_sender_pointer)
-          ->GetDtmfSender()
-          .release());
-}
-
-JNI_FUNCTION_DECLARATION(jboolean,
-                         RtpSender_nativeSetParameters,
-                         JNIEnv* jni,
-                         jclass,
-                         jlong j_rtp_sender_pointer,
-                         jobject j_parameters) {
-  if (IsNull(jni, j_parameters)) {
-    return false;
-  }
-  RtpParameters parameters;
-  JavaToNativeRtpParameters(jni, j_parameters, &parameters);
-  return reinterpret_cast<RtpSenderInterface*>(j_rtp_sender_pointer)
-      ->SetParameters(parameters);
-}
-
-JNI_FUNCTION_DECLARATION(jobject,
-                         RtpSender_nativeGetParameters,
-                         JNIEnv* jni,
-                         jclass,
-                         jlong j_rtp_sender_pointer) {
-  RtpParameters parameters =
-      reinterpret_cast<RtpSenderInterface*>(j_rtp_sender_pointer)
-          ->GetParameters();
-  return NativeToJavaRtpParameters(jni, parameters);
-}
-
-JNI_FUNCTION_DECLARATION(jstring,
-                         RtpSender_nativeId,
-                         JNIEnv* jni,
-                         jclass,
-                         jlong j_rtp_sender_pointer) {
-  return JavaStringFromStdString(
-      jni, reinterpret_cast<RtpSenderInterface*>(j_rtp_sender_pointer)->id());
-}
-
-}  // namespace jni
-}  // namespace webrtc
diff --git a/sdk/android/src/jni/pc/sdpobserver_jni.h b/sdk/android/src/jni/pc/sdpobserver_jni.h
deleted file mode 100644
index 14b9575..0000000
--- a/sdk/android/src/jni/pc/sdpobserver_jni.h
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- *  Copyright 2017 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_SDK_ANDROID_SRC_JNI_PC_SDPOBSERVER_JNI_H_
-#define WEBRTC_SDK_ANDROID_SRC_JNI_PC_SDPOBSERVER_JNI_H_
-
-#include <memory>
-#include <string>
-
-#include "webrtc/api/peerconnectioninterface.h"
-#include "webrtc/sdk/android/src/jni/jni_helpers.h"
-#include "webrtc/sdk/android/src/jni/pc/mediaconstraints_jni.h"
-
-namespace webrtc {
-namespace jni {
-
-// Adapter for a Java StatsObserver presenting a C++
-// CreateSessionDescriptionObserver or SetSessionDescriptionObserver and
-// dispatching the callback from C++ back to Java.
-template <class T>  // T is one of {Create,Set}SessionDescriptionObserver.
-class SdpObserverJni : public T {
- public:
-  SdpObserverJni(JNIEnv* jni,
-                 jobject j_observer,
-                 MediaConstraintsJni* constraints)
-      : constraints_(constraints),
-        j_observer_global_(jni, j_observer),
-        j_observer_class_(jni, GetObjectClass(jni, j_observer)) {}
-
-  virtual ~SdpObserverJni() {}
-
-  // Can't mark override because of templating.
-  virtual void OnSuccess() {
-    ScopedLocalRefFrame local_ref_frame(jni());
-    jmethodID m = GetMethodID(jni(), *j_observer_class_, "onSetSuccess", "()V");
-    jni()->CallVoidMethod(*j_observer_global_, m);
-    CHECK_EXCEPTION(jni()) << "error during CallVoidMethod";
-  }
-
-  // Can't mark override because of templating.
-  virtual void OnSuccess(SessionDescriptionInterface* desc) {
-    ScopedLocalRefFrame local_ref_frame(jni());
-    jmethodID m = GetMethodID(jni(), *j_observer_class_, "onCreateSuccess",
-                              "(Lorg/webrtc/SessionDescription;)V");
-    jobject j_sdp = NativeToJavaSessionDescription(jni(), desc);
-    jni()->CallVoidMethod(*j_observer_global_, m, j_sdp);
-    CHECK_EXCEPTION(jni()) << "error during CallVoidMethod";
-    // OnSuccess transfers ownership of the description (there's a TODO to make
-    // it use unique_ptr...).
-    delete desc;
-  }
-
- protected:
-  // Common implementation for failure of Set & Create types, distinguished by
-  // |op| being "Set" or "Create".
-  void DoOnFailure(const std::string& op, const std::string& error) {
-    jmethodID m = GetMethodID(jni(), *j_observer_class_, "on" + op + "Failure",
-                              "(Ljava/lang/String;)V");
-    jstring j_error_string = JavaStringFromStdString(jni(), error);
-    jni()->CallVoidMethod(*j_observer_global_, m, j_error_string);
-    CHECK_EXCEPTION(jni()) << "error during CallVoidMethod";
-  }
-
-  JNIEnv* jni() { return AttachCurrentThreadIfNeeded(); }
-
- private:
-  std::unique_ptr<MediaConstraintsJni> constraints_;
-  const ScopedGlobalRef<jobject> j_observer_global_;
-  const ScopedGlobalRef<jclass> j_observer_class_;
-};
-
-class CreateSdpObserverJni
-    : public SdpObserverJni<CreateSessionDescriptionObserver> {
- public:
-  CreateSdpObserverJni(JNIEnv* jni,
-                       jobject j_observer,
-                       MediaConstraintsJni* constraints)
-      : SdpObserverJni(jni, j_observer, constraints) {}
-
-  void OnFailure(const std::string& error) override {
-    ScopedLocalRefFrame local_ref_frame(jni());
-    SdpObserverJni::DoOnFailure(std::string("Create"), error);
-  }
-};
-
-class SetSdpObserverJni : public SdpObserverJni<SetSessionDescriptionObserver> {
- public:
-  SetSdpObserverJni(JNIEnv* jni,
-                    jobject j_observer,
-                    MediaConstraintsJni* constraints)
-      : SdpObserverJni(jni, j_observer, constraints) {}
-
-  void OnFailure(const std::string& error) override {
-    ScopedLocalRefFrame local_ref_frame(jni());
-    SdpObserverJni::DoOnFailure(std::string("Set"), error);
-  }
-};
-
-}  // namespace jni
-}  // namespace webrtc
-
-#endif  // WEBRTC_SDK_ANDROID_SRC_JNI_PC_SDPOBSERVER_JNI_H_
diff --git a/sdk/android/src/jni/pc/statsobserver_jni.cc b/sdk/android/src/jni/pc/statsobserver_jni.cc
deleted file mode 100644
index f72d1ae..0000000
--- a/sdk/android/src/jni/pc/statsobserver_jni.cc
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- *  Copyright 2017 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/sdk/android/src/jni/pc/statsobserver_jni.h"
-
-#include "webrtc/sdk/android/src/jni/classreferenceholder.h"
-
-namespace webrtc {
-namespace jni {
-
-// Convenience, used since callbacks occur on the signaling thread, which may
-// be a non-Java thread.
-static JNIEnv* jni() {
-  return AttachCurrentThreadIfNeeded();
-}
-
-StatsObserverJni::StatsObserverJni(JNIEnv* jni, jobject j_observer)
-    : j_observer_global_(jni, j_observer),
-      j_observer_class_(jni, GetObjectClass(jni, j_observer)),
-      j_stats_report_class_(jni, FindClass(jni, "org/webrtc/StatsReport")),
-      j_stats_report_ctor_(GetMethodID(jni,
-                                       *j_stats_report_class_,
-                                       "<init>",
-                                       "(Ljava/lang/String;Ljava/lang/String;D"
-                                       "[Lorg/webrtc/StatsReport$Value;)V")),
-      j_value_class_(jni, FindClass(jni, "org/webrtc/StatsReport$Value")),
-      j_value_ctor_(GetMethodID(jni,
-                                *j_value_class_,
-                                "<init>",
-                                "(Ljava/lang/String;Ljava/lang/String;)V")) {}
-
-void StatsObserverJni::OnComplete(const StatsReports& reports) {
-  ScopedLocalRefFrame local_ref_frame(jni());
-  jobjectArray j_reports = ReportsToJava(jni(), reports);
-  jmethodID m = GetMethodID(jni(), *j_observer_class_, "onComplete",
-                            "([Lorg/webrtc/StatsReport;)V");
-  jni()->CallVoidMethod(*j_observer_global_, m, j_reports);
-  CHECK_EXCEPTION(jni()) << "error during CallVoidMethod";
-}
-
-jobjectArray StatsObserverJni::ReportsToJava(JNIEnv* jni,
-                                             const StatsReports& reports) {
-  jobjectArray reports_array =
-      jni->NewObjectArray(reports.size(), *j_stats_report_class_, NULL);
-  int i = 0;
-  for (const auto* report : reports) {
-    ScopedLocalRefFrame local_ref_frame(jni);
-    jstring j_id = JavaStringFromStdString(jni, report->id()->ToString());
-    jstring j_type = JavaStringFromStdString(jni, report->TypeToString());
-    jobjectArray j_values = ValuesToJava(jni, report->values());
-    jobject j_report =
-        jni->NewObject(*j_stats_report_class_, j_stats_report_ctor_, j_id,
-                       j_type, report->timestamp(), j_values);
-    jni->SetObjectArrayElement(reports_array, i++, j_report);
-  }
-  return reports_array;
-}
-
-jobjectArray StatsObserverJni::ValuesToJava(JNIEnv* jni,
-                                            const StatsReport::Values& values) {
-  jobjectArray j_values =
-      jni->NewObjectArray(values.size(), *j_value_class_, NULL);
-  int i = 0;
-  for (const auto& it : values) {
-    ScopedLocalRefFrame local_ref_frame(jni);
-    // Should we use the '.name' enum value here instead of converting the
-    // name to a string?
-    jstring j_name = JavaStringFromStdString(jni, it.second->display_name());
-    jstring j_value = JavaStringFromStdString(jni, it.second->ToString());
-    jobject j_element_value =
-        jni->NewObject(*j_value_class_, j_value_ctor_, j_name, j_value);
-    jni->SetObjectArrayElement(j_values, i++, j_element_value);
-  }
-  return j_values;
-}
-
-}  // namespace jni
-}  // namespace webrtc
diff --git a/sdk/android/src/jni/pc/statsobserver_jni.h b/sdk/android/src/jni/pc/statsobserver_jni.h
deleted file mode 100644
index 1543040..0000000
--- a/sdk/android/src/jni/pc/statsobserver_jni.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- *  Copyright 2017 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_SDK_ANDROID_SRC_JNI_PC_STATSOBSERVER_JNI_H_
-#define WEBRTC_SDK_ANDROID_SRC_JNI_PC_STATSOBSERVER_JNI_H_
-
-#include "webrtc/api/peerconnectioninterface.h"
-#include "webrtc/sdk/android/src/jni/jni_helpers.h"
-
-namespace webrtc {
-namespace jni {
-
-// Adapter for a Java StatsObserver presenting a C++ StatsObserver and
-// dispatching the callback from C++ back to Java.
-class StatsObserverJni : public StatsObserver {
- public:
-  StatsObserverJni(JNIEnv* jni, jobject j_observer);
-
-  void OnComplete(const StatsReports& reports) override;
-
- private:
-  jobjectArray ReportsToJava(JNIEnv* jni, const StatsReports& reports);
-
-  jobjectArray ValuesToJava(JNIEnv* jni, const StatsReport::Values& values);
-
-  const ScopedGlobalRef<jobject> j_observer_global_;
-  const ScopedGlobalRef<jclass> j_observer_class_;
-  const ScopedGlobalRef<jclass> j_stats_report_class_;
-  const jmethodID j_stats_report_ctor_;
-  const ScopedGlobalRef<jclass> j_value_class_;
-  const jmethodID j_value_ctor_;
-};
-
-}  // namespace jni
-}  // namespace webrtc
-
-#endif  // WEBRTC_SDK_ANDROID_SRC_JNI_PC_STATSOBSERVER_JNI_H_
diff --git a/sdk/android/src/jni/pc/video_jni.cc b/sdk/android/src/jni/pc/video_jni.cc
deleted file mode 100644
index 3172b13..0000000
--- a/sdk/android/src/jni/pc/video_jni.cc
+++ /dev/null
@@ -1,136 +0,0 @@
-/*
- *  Copyright 2017 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 <jni.h>
-
-#include "webrtc/api/videosourceproxy.h"
-#include "webrtc/media/engine/webrtcvideodecoderfactory.h"
-#include "webrtc/media/engine/webrtcvideoencoderfactory.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/sdk/android/src/jni/androidmediadecoder_jni.h"
-#include "webrtc/sdk/android/src/jni/androidmediaencoder_jni.h"
-#include "webrtc/sdk/android/src/jni/androidvideotracksource.h"
-#include "webrtc/sdk/android/src/jni/classreferenceholder.h"
-#include "webrtc/sdk/android/src/jni/pc/ownedfactoryandthreads.h"
-#include "webrtc/sdk/android/src/jni/surfacetexturehelper_jni.h"
-#include "webrtc/sdk/android/src/jni/videodecoderfactorywrapper.h"
-#include "webrtc/sdk/android/src/jni/videoencoderfactorywrapper.h"
-
-namespace webrtc {
-namespace jni {
-
-// TODO(sakal): Remove this once MediaCodecVideoDecoder/Encoder are no longer
-// used and all applications inject their own codecs.
-// This is semi broken if someone wants to create multiple peerconnection
-// factories.
-static bool use_media_codec_encoder_factory;
-static bool use_media_codec_decoder_factory;
-
-cricket::WebRtcVideoEncoderFactory* CreateVideoEncoderFactory(
-    JNIEnv* jni,
-    jobject j_encoder_factory) {
-  use_media_codec_encoder_factory = j_encoder_factory == nullptr;
-
-  if (use_media_codec_encoder_factory) {
-    return new MediaCodecVideoEncoderFactory();
-  } else {
-    return new VideoEncoderFactoryWrapper(jni, j_encoder_factory);
-  }
-}
-
-cricket::WebRtcVideoDecoderFactory* CreateVideoDecoderFactory(
-    JNIEnv* jni,
-    jobject j_decoder_factory) {
-  use_media_codec_decoder_factory = j_decoder_factory == nullptr;
-
-  if (use_media_codec_decoder_factory) {
-    return new MediaCodecVideoDecoderFactory();
-  } else {
-    return new VideoDecoderFactoryWrapper(jni, j_decoder_factory);
-  }
-}
-
-jobject GetJavaSurfaceTextureHelper(
-    const rtc::scoped_refptr<SurfaceTextureHelper>& surface_texture_helper) {
-  return surface_texture_helper
-             ? surface_texture_helper->GetJavaSurfaceTextureHelper()
-             : nullptr;
-}
-
-JNI_FUNCTION_DECLARATION(jlong,
-                         PeerConnectionFactory_nativeCreateVideoSource,
-                         JNIEnv* jni,
-                         jclass,
-                         jlong native_factory,
-                         jobject j_surface_texture_helper,
-                         jboolean is_screencast) {
-  OwnedFactoryAndThreads* factory =
-      reinterpret_cast<OwnedFactoryAndThreads*>(native_factory);
-
-  rtc::scoped_refptr<AndroidVideoTrackSource> source(
-      new rtc::RefCountedObject<AndroidVideoTrackSource>(
-          factory->signaling_thread(), jni, j_surface_texture_helper,
-          is_screencast));
-  rtc::scoped_refptr<VideoTrackSourceProxy> proxy_source =
-      VideoTrackSourceProxy::Create(factory->signaling_thread(),
-                                    factory->worker_thread(), source);
-
-  return (jlong)proxy_source.release();
-}
-
-JNI_FUNCTION_DECLARATION(jlong,
-                         PeerConnectionFactory_nativeCreateVideoTrack,
-                         JNIEnv* jni,
-                         jclass,
-                         jlong native_factory,
-                         jstring id,
-                         jlong native_source) {
-  rtc::scoped_refptr<PeerConnectionFactoryInterface> factory(
-      factoryFromJava(native_factory));
-  rtc::scoped_refptr<VideoTrackInterface> track(factory->CreateVideoTrack(
-      JavaToStdString(jni, id),
-      reinterpret_cast<VideoTrackSourceInterface*>(native_source)));
-  return (jlong)track.release();
-}
-
-JNI_FUNCTION_DECLARATION(
-    void,
-    PeerConnectionFactory_nativeSetVideoHwAccelerationOptions,
-    JNIEnv* jni,
-    jclass,
-    jlong native_factory,
-    jobject local_egl_context,
-    jobject remote_egl_context) {
-  OwnedFactoryAndThreads* owned_factory =
-      reinterpret_cast<OwnedFactoryAndThreads*>(native_factory);
-
-  jclass j_eglbase14_context_class =
-      FindClass(jni, "org/webrtc/EglBase14$Context");
-
-  MediaCodecVideoEncoderFactory* encoder_factory =
-      static_cast<MediaCodecVideoEncoderFactory*>(
-          owned_factory->encoder_factory());
-  if (use_media_codec_encoder_factory && encoder_factory &&
-      jni->IsInstanceOf(local_egl_context, j_eglbase14_context_class)) {
-    LOG(LS_INFO) << "Set EGL context for HW encoding.";
-    encoder_factory->SetEGLContext(jni, local_egl_context);
-  }
-
-  MediaCodecVideoDecoderFactory* decoder_factory =
-      static_cast<MediaCodecVideoDecoderFactory*>(
-          owned_factory->decoder_factory());
-  if (use_media_codec_decoder_factory && decoder_factory) {
-    LOG(LS_INFO) << "Set EGL context for HW decoding.";
-    decoder_factory->SetEGLContext(jni, remote_egl_context);
-  }
-}
-
-}  // namespace jni
-}  // namespace webrtc
diff --git a/sdk/android/src/jni/pc/video_jni.h b/sdk/android/src/jni/pc/video_jni.h
deleted file mode 100644
index 016ce0a..0000000
--- a/sdk/android/src/jni/pc/video_jni.h
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- *  Copyright 2017 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_SDK_ANDROID_SRC_JNI_PC_VIDEO_JNI_H_
-#define WEBRTC_SDK_ANDROID_SRC_JNI_PC_VIDEO_JNI_H_
-
-#include <jni.h>
-
-#include "webrtc/rtc_base/scoped_ref_ptr.h"
-
-namespace cricket {
-class WebRtcVideoEncoderFactory;
-class WebRtcVideoDecoderFactory;
-}  // namespace cricket
-
-namespace webrtc {
-namespace jni {
-
-class SurfaceTextureHelper;
-
-cricket::WebRtcVideoEncoderFactory* CreateVideoEncoderFactory(
-    JNIEnv* jni,
-    jobject j_encoder_factory);
-
-cricket::WebRtcVideoDecoderFactory* CreateVideoDecoderFactory(
-    JNIEnv* jni,
-    jobject j_decoder_factory);
-
-jobject GetJavaSurfaceTextureHelper(
-    const rtc::scoped_refptr<SurfaceTextureHelper>& surface_texture_helper);
-
-}  // namespace jni
-}  // namespace webrtc
-
-#endif  // WEBRTC_SDK_ANDROID_SRC_JNI_PC_VIDEO_JNI_H_
diff --git a/sdk/android/src/jni/surfacetexturehelper_jni.cc b/sdk/android/src/jni/surfacetexturehelper_jni.cc
deleted file mode 100644
index cfc2904..0000000
--- a/sdk/android/src/jni/surfacetexturehelper_jni.cc
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- *  Copyright 2015 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/sdk/android/src/jni/surfacetexturehelper_jni.h"
-
-#include "webrtc/rtc_base/bind.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/sdk/android/src/jni/classreferenceholder.h"
-
-namespace webrtc {
-namespace jni {
-
-rtc::scoped_refptr<SurfaceTextureHelper> SurfaceTextureHelper::create(
-    JNIEnv* jni,
-    const char* thread_name,
-    jobject j_egl_context) {
-  jobject j_surface_texture_helper = jni->CallStaticObjectMethod(
-      FindClass(jni, "org/webrtc/SurfaceTextureHelper"),
-      GetStaticMethodID(jni, FindClass(jni, "org/webrtc/SurfaceTextureHelper"),
-                        "create",
-                        "(Ljava/lang/String;Lorg/webrtc/EglBase$Context;)"
-                        "Lorg/webrtc/SurfaceTextureHelper;"),
-      jni->NewStringUTF(thread_name), j_egl_context);
-  CHECK_EXCEPTION(jni)
-      << "error during initialization of Java SurfaceTextureHelper";
-  if (IsNull(jni, j_surface_texture_helper))
-    return nullptr;
-  return new rtc::RefCountedObject<SurfaceTextureHelper>(
-      jni, j_surface_texture_helper);
-}
-
-SurfaceTextureHelper::SurfaceTextureHelper(JNIEnv* jni,
-                                           jobject j_surface_texture_helper)
-    : j_surface_texture_helper_(jni, j_surface_texture_helper),
-      j_return_texture_method_(
-          GetMethodID(jni,
-                      FindClass(jni, "org/webrtc/SurfaceTextureHelper"),
-                      "returnTextureFrame",
-                      "()V")) {
-  CHECK_EXCEPTION(jni) << "error during initialization of SurfaceTextureHelper";
-}
-
-SurfaceTextureHelper::~SurfaceTextureHelper() {
-  LOG(LS_INFO) << "SurfaceTextureHelper dtor";
-  JNIEnv* jni = AttachCurrentThreadIfNeeded();
-  jni->CallVoidMethod(
-      *j_surface_texture_helper_,
-      GetMethodID(jni, FindClass(jni, "org/webrtc/SurfaceTextureHelper"),
-                  "dispose", "()V"));
-
-  CHECK_EXCEPTION(jni) << "error during SurfaceTextureHelper.dispose()";
-}
-
-jobject SurfaceTextureHelper::GetJavaSurfaceTextureHelper() const {
-  return *j_surface_texture_helper_;
-}
-
-void SurfaceTextureHelper::ReturnTextureFrame() const {
-  JNIEnv* jni = AttachCurrentThreadIfNeeded();
-  jni->CallVoidMethod(*j_surface_texture_helper_, j_return_texture_method_);
-
-  CHECK_EXCEPTION(
-      jni) << "error during SurfaceTextureHelper.returnTextureFrame";
-}
-
-rtc::scoped_refptr<VideoFrameBuffer> SurfaceTextureHelper::CreateTextureFrame(
-    int width,
-    int height,
-    const NativeHandleImpl& native_handle) {
-  return new rtc::RefCountedObject<AndroidTextureBuffer>(
-      width, height, native_handle, *j_surface_texture_helper_,
-      rtc::Bind(&SurfaceTextureHelper::ReturnTextureFrame, this));
-}
-
-}  // namespace jni
-}  // namespace webrtc
diff --git a/sdk/android/src/jni/surfacetexturehelper_jni.h b/sdk/android/src/jni/surfacetexturehelper_jni.h
deleted file mode 100644
index 82e36cf..0000000
--- a/sdk/android/src/jni/surfacetexturehelper_jni.h
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- *  Copyright 2015 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_SDK_ANDROID_SRC_JNI_SURFACETEXTUREHELPER_JNI_H_
-#define WEBRTC_SDK_ANDROID_SRC_JNI_SURFACETEXTUREHELPER_JNI_H_
-
-#include <jni.h>
-
-#include "webrtc/api/video/video_frame_buffer.h"
-#include "webrtc/rtc_base/refcount.h"
-#include "webrtc/rtc_base/scoped_ref_ptr.h"
-#include "webrtc/sdk/android/src/jni/jni_helpers.h"
-#include "webrtc/sdk/android/src/jni/native_handle_impl.h"
-
-namespace webrtc {
-namespace jni {
-
-// Helper class to create and synchronize access to an Android SurfaceTexture.
-// It is used for creating VideoFrameBuffers from a SurfaceTexture when
-// the SurfaceTexture has been updated.
-// When the VideoFrameBuffer is released, this class returns the buffer to the
-// java SurfaceTextureHelper so it can be updated safely. The VideoFrameBuffer
-// can be released on an arbitrary thread.
-// SurfaceTextureHelper is reference counted to make sure that it is not
-// destroyed while a VideoFrameBuffer is in use.
-// This class is the C++ counterpart of the java class SurfaceTextureHelper.
-// It owns the corresponding java object, and calls the java dispose
-// method when destroyed.
-// Usage:
-// 1. Create an instance of this class.
-// 2. Get the Java SurfaceTextureHelper with GetJavaSurfaceTextureHelper().
-// 3. Register a listener to the Java SurfaceListener and start producing
-// new buffers.
-// 4. Call CreateTextureFrame to wrap the Java texture in a VideoFrameBuffer.
-class SurfaceTextureHelper : public rtc::RefCountInterface {
- public:
-  // Might return null if creating the Java SurfaceTextureHelper fails.
-  static rtc::scoped_refptr<SurfaceTextureHelper> create(
-      JNIEnv* jni, const char* thread_name, jobject j_egl_context);
-
-  jobject GetJavaSurfaceTextureHelper() const;
-
-  rtc::scoped_refptr<VideoFrameBuffer> CreateTextureFrame(
-      int width,
-      int height,
-      const NativeHandleImpl& native_handle);
-
-  // May be called on arbitrary thread.
-  void ReturnTextureFrame() const;
-
- protected:
-  ~SurfaceTextureHelper();
-  SurfaceTextureHelper(JNIEnv* jni, jobject j_surface_texture_helper);
-
- private:
-  const ScopedGlobalRef<jobject> j_surface_texture_helper_;
-  const jmethodID j_return_texture_method_;
-};
-
-}  // namespace jni
-}  // namespace webrtc
-
-#endif  // WEBRTC_SDK_ANDROID_SRC_JNI_SURFACETEXTUREHELPER_JNI_H_
diff --git a/sdk/android/src/jni/video_renderer_jni.cc b/sdk/android/src/jni/video_renderer_jni.cc
deleted file mode 100644
index 07244bc..0000000
--- a/sdk/android/src/jni/video_renderer_jni.cc
+++ /dev/null
@@ -1,198 +0,0 @@
-/*
- *  Copyright (c) 2017 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 <jni.h>
-
-#include "webrtc/api/video/video_frame.h"
-#include "webrtc/media/base/videosinkinterface.h"
-#include "webrtc/sdk/android/src/jni/classreferenceholder.h"
-#include "webrtc/sdk/android/src/jni/jni_helpers.h"
-#include "webrtc/sdk/android/src/jni/native_handle_impl.h"
-
-namespace webrtc {
-namespace jni {
-
-// Wrapper dispatching rtc::VideoSinkInterface to a Java VideoRenderer
-// instance.
-class JavaVideoRendererWrapper : public rtc::VideoSinkInterface<VideoFrame> {
- public:
-  JavaVideoRendererWrapper(JNIEnv* jni, jobject j_callbacks)
-      : j_callbacks_(jni, j_callbacks),
-        j_render_frame_id_(
-            GetMethodID(jni,
-                        GetObjectClass(jni, j_callbacks),
-                        "renderFrame",
-                        "(Lorg/webrtc/VideoRenderer$I420Frame;)V")),
-        j_frame_class_(jni,
-                       FindClass(jni, "org/webrtc/VideoRenderer$I420Frame")),
-        j_i420_frame_ctor_id_(GetMethodID(jni,
-                                          *j_frame_class_,
-                                          "<init>",
-                                          "(III[I[Ljava/nio/ByteBuffer;J)V")),
-        j_texture_frame_ctor_id_(
-            GetMethodID(jni, *j_frame_class_, "<init>", "(IIII[FJ)V")),
-        j_byte_buffer_class_(jni, FindClass(jni, "java/nio/ByteBuffer")) {
-    CHECK_EXCEPTION(jni);
-  }
-
-  virtual ~JavaVideoRendererWrapper() {}
-
-  void OnFrame(const VideoFrame& video_frame) override {
-    ScopedLocalRefFrame local_ref_frame(jni());
-
-    jobject j_frame;
-    if (video_frame.video_frame_buffer()->type() ==
-        VideoFrameBuffer::Type::kNative) {
-      AndroidVideoFrameBuffer* android_buffer =
-          static_cast<AndroidVideoFrameBuffer*>(
-              video_frame.video_frame_buffer().get());
-      switch (android_buffer->android_type()) {
-        case AndroidVideoFrameBuffer::AndroidType::kTextureBuffer:
-          j_frame = ToJavaTextureFrame(&video_frame);
-          break;
-        case AndroidVideoFrameBuffer::AndroidType::kJavaBuffer:
-          j_frame = static_cast<AndroidVideoBuffer*>(android_buffer)
-                        ->ToJavaI420Frame(jni(), video_frame.rotation());
-          break;
-        default:
-          RTC_NOTREACHED();
-      }
-    } else {
-      j_frame = ToJavaI420Frame(&video_frame);
-    }
-    // |j_callbacks_| is responsible for releasing |j_frame| with
-    // VideoRenderer.renderFrameDone().
-    jni()->CallVoidMethod(*j_callbacks_, j_render_frame_id_, j_frame);
-    CHECK_EXCEPTION(jni());
-  }
-
- private:
-  // Make a shallow copy of |frame| to be used with Java. The callee has
-  // ownership of the frame, and the frame should be released with
-  // VideoRenderer.releaseNativeFrame().
-  static jlong javaShallowCopy(const VideoFrame* frame) {
-    return jlongFromPointer(new VideoFrame(*frame));
-  }
-
-  // Return a VideoRenderer.I420Frame referring to the data in |frame|.
-  jobject ToJavaI420Frame(const VideoFrame* frame) {
-    jintArray strides = jni()->NewIntArray(3);
-    jint* strides_array = jni()->GetIntArrayElements(strides, NULL);
-    rtc::scoped_refptr<I420BufferInterface> i420_buffer =
-        frame->video_frame_buffer()->ToI420();
-    strides_array[0] = i420_buffer->StrideY();
-    strides_array[1] = i420_buffer->StrideU();
-    strides_array[2] = i420_buffer->StrideV();
-    jni()->ReleaseIntArrayElements(strides, strides_array, 0);
-    jobjectArray planes = jni()->NewObjectArray(3, *j_byte_buffer_class_, NULL);
-    jobject y_buffer = jni()->NewDirectByteBuffer(
-        const_cast<uint8_t*>(i420_buffer->DataY()),
-        i420_buffer->StrideY() * i420_buffer->height());
-    size_t chroma_height = i420_buffer->ChromaHeight();
-    jobject u_buffer =
-        jni()->NewDirectByteBuffer(const_cast<uint8_t*>(i420_buffer->DataU()),
-                                   i420_buffer->StrideU() * chroma_height);
-    jobject v_buffer =
-        jni()->NewDirectByteBuffer(const_cast<uint8_t*>(i420_buffer->DataV()),
-                                   i420_buffer->StrideV() * chroma_height);
-
-    jni()->SetObjectArrayElement(planes, 0, y_buffer);
-    jni()->SetObjectArrayElement(planes, 1, u_buffer);
-    jni()->SetObjectArrayElement(planes, 2, v_buffer);
-    return jni()->NewObject(*j_frame_class_, j_i420_frame_ctor_id_,
-                            frame->width(), frame->height(),
-                            static_cast<int>(frame->rotation()), strides,
-                            planes, javaShallowCopy(frame));
-  }
-
-  // Return a VideoRenderer.I420Frame referring texture object in |frame|.
-  jobject ToJavaTextureFrame(const VideoFrame* frame) {
-    NativeHandleImpl handle =
-        static_cast<AndroidTextureBuffer*>(frame->video_frame_buffer().get())
-            ->native_handle_impl();
-    jfloatArray sampling_matrix = handle.sampling_matrix.ToJava(jni());
-
-    return jni()->NewObject(
-        *j_frame_class_, j_texture_frame_ctor_id_, frame->width(),
-        frame->height(), static_cast<int>(frame->rotation()),
-        handle.oes_texture_id, sampling_matrix, javaShallowCopy(frame));
-  }
-
-  JNIEnv* jni() { return AttachCurrentThreadIfNeeded(); }
-
-  ScopedGlobalRef<jobject> j_callbacks_;
-  jmethodID j_render_frame_id_;
-  ScopedGlobalRef<jclass> j_frame_class_;
-  jmethodID j_i420_frame_ctor_id_;
-  jmethodID j_texture_frame_ctor_id_;
-  ScopedGlobalRef<jclass> j_byte_buffer_class_;
-};
-
-JNI_FUNCTION_DECLARATION(void,
-                         VideoRenderer_freeWrappedVideoRenderer,
-                         JNIEnv*,
-                         jclass,
-                         jlong j_p) {
-  delete reinterpret_cast<JavaVideoRendererWrapper*>(j_p);
-}
-
-JNI_FUNCTION_DECLARATION(void,
-                         VideoRenderer_releaseNativeFrame,
-                         JNIEnv* jni,
-                         jclass,
-                         jlong j_frame_ptr) {
-  delete reinterpret_cast<const VideoFrame*>(j_frame_ptr);
-}
-
-JNI_FUNCTION_DECLARATION(jlong,
-                         VideoRenderer_nativeWrapVideoRenderer,
-                         JNIEnv* jni,
-                         jclass,
-                         jobject j_callbacks) {
-  std::unique_ptr<JavaVideoRendererWrapper> renderer(
-      new JavaVideoRendererWrapper(jni, j_callbacks));
-  return (jlong)renderer.release();
-}
-
-JNI_FUNCTION_DECLARATION(void,
-                         VideoRenderer_nativeCopyPlane,
-                         JNIEnv* jni,
-                         jclass,
-                         jobject j_src_buffer,
-                         jint width,
-                         jint height,
-                         jint src_stride,
-                         jobject j_dst_buffer,
-                         jint dst_stride) {
-  size_t src_size = jni->GetDirectBufferCapacity(j_src_buffer);
-  size_t dst_size = jni->GetDirectBufferCapacity(j_dst_buffer);
-  RTC_CHECK(src_stride >= width) << "Wrong source stride " << src_stride;
-  RTC_CHECK(dst_stride >= width) << "Wrong destination stride " << dst_stride;
-  RTC_CHECK(src_size >= src_stride * height)
-      << "Insufficient source buffer capacity " << src_size;
-  RTC_CHECK(dst_size >= dst_stride * height)
-      << "Insufficient destination buffer capacity " << dst_size;
-  uint8_t* src =
-      reinterpret_cast<uint8_t*>(jni->GetDirectBufferAddress(j_src_buffer));
-  uint8_t* dst =
-      reinterpret_cast<uint8_t*>(jni->GetDirectBufferAddress(j_dst_buffer));
-  if (src_stride == dst_stride) {
-    memcpy(dst, src, src_stride * height);
-  } else {
-    for (int i = 0; i < height; i++) {
-      memcpy(dst, src, width);
-      src += src_stride;
-      dst += dst_stride;
-    }
-  }
-}
-
-}  // namespace jni
-}  // namespace webrtc
diff --git a/sdk/android/src/jni/videodecoderfactorywrapper.cc b/sdk/android/src/jni/videodecoderfactorywrapper.cc
deleted file mode 100644
index dba8fe2..0000000
--- a/sdk/android/src/jni/videodecoderfactorywrapper.cc
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- *  Copyright 2017 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/sdk/android/src/jni/videodecoderfactorywrapper.h"
-
-#include "webrtc/api/video_codecs/video_decoder.h"
-#include "webrtc/common_types.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/sdk/android/src/jni/videodecoderwrapper.h"
-
-namespace webrtc {
-namespace jni {
-
-VideoDecoderFactoryWrapper::VideoDecoderFactoryWrapper(JNIEnv* jni,
-                                                       jobject decoder_factory)
-    : decoder_factory_(jni, decoder_factory) {
-  jclass decoder_factory_class = jni->GetObjectClass(*decoder_factory_);
-  create_decoder_method_ =
-      jni->GetMethodID(decoder_factory_class, "createDecoder",
-                       "(Ljava/lang/String;)Lorg/webrtc/VideoDecoder;");
-}
-
-VideoDecoder* VideoDecoderFactoryWrapper::CreateVideoDecoder(
-    VideoCodecType type) {
-  JNIEnv* jni = AttachCurrentThreadIfNeeded();
-  ScopedLocalRefFrame local_ref_frame(jni);
-  const char* type_payload = CodecTypeToPayloadString(type);
-  jstring name = jni->NewStringUTF(type_payload);
-  jobject decoder =
-      jni->CallObjectMethod(*decoder_factory_, create_decoder_method_, name);
-  return decoder != nullptr ? new VideoDecoderWrapper(jni, decoder) : nullptr;
-}
-
-void VideoDecoderFactoryWrapper::DestroyVideoDecoder(VideoDecoder* decoder) {
-  delete decoder;
-}
-
-}  // namespace jni
-}  // namespace webrtc
diff --git a/sdk/android/src/jni/videodecoderfactorywrapper.h b/sdk/android/src/jni/videodecoderfactorywrapper.h
deleted file mode 100644
index 43c86cb..0000000
--- a/sdk/android/src/jni/videodecoderfactorywrapper.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- *  Copyright 2017 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_SDK_ANDROID_SRC_JNI_VIDEODECODERFACTORYWRAPPER_H_
-#define WEBRTC_SDK_ANDROID_SRC_JNI_VIDEODECODERFACTORYWRAPPER_H_
-
-#include <jni.h>
-
-#include "webrtc/media/engine/webrtcvideodecoderfactory.h"
-#include "webrtc/sdk/android/src/jni/jni_helpers.h"
-
-namespace webrtc {
-namespace jni {
-
-// Wrapper for Java VideoDecoderFactory class. Delegates method calls through
-// JNI and wraps the decoder inside VideoDecoderWrapper.
-class VideoDecoderFactoryWrapper : public cricket::WebRtcVideoDecoderFactory {
- public:
-  VideoDecoderFactoryWrapper(JNIEnv* jni, jobject decoder_factory);
-
-  // Caller takes the ownership of the returned object and it should be released
-  // by calling DestroyVideoDecoder().
-  VideoDecoder* CreateVideoDecoder(VideoCodecType type) override;
-  void DestroyVideoDecoder(VideoDecoder* decoder) override;
-
- private:
-  const ScopedGlobalRef<jobject> decoder_factory_;
-  jmethodID create_decoder_method_;
-};
-
-}  // namespace jni
-}  // namespace webrtc
-
-#endif  // WEBRTC_SDK_ANDROID_SRC_JNI_VIDEODECODERFACTORYWRAPPER_H_
diff --git a/sdk/android/src/jni/videodecoderwrapper.cc b/sdk/android/src/jni/videodecoderwrapper.cc
deleted file mode 100644
index 23a8314..0000000
--- a/sdk/android/src/jni/videodecoderwrapper.cc
+++ /dev/null
@@ -1,315 +0,0 @@
-/*
- *  Copyright 2017 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/sdk/android/src/jni/videodecoderwrapper.h"
-
-#include "webrtc/api/video/video_frame.h"
-#include "webrtc/modules/video_coding/include/video_codec_interface.h"
-#include "webrtc/modules/video_coding/utility/vp8_header_parser.h"
-#include "webrtc/modules/video_coding/utility/vp9_uncompressed_header_parser.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/timeutils.h"
-#include "webrtc/sdk/android/src/jni/classreferenceholder.h"
-
-namespace webrtc {
-namespace jni {
-
-VideoDecoderWrapper::VideoDecoderWrapper(JNIEnv* jni, jobject decoder)
-    : android_video_buffer_factory_(jni),
-      decoder_(jni, decoder),
-      encoded_image_class_(jni, FindClass(jni, "org/webrtc/EncodedImage")),
-      frame_type_class_(jni,
-                        FindClass(jni, "org/webrtc/EncodedImage$FrameType")),
-      settings_class_(jni, FindClass(jni, "org/webrtc/VideoDecoder$Settings")),
-      video_frame_class_(jni, FindClass(jni, "org/webrtc/VideoFrame")),
-      video_codec_status_class_(jni,
-                                FindClass(jni, "org/webrtc/VideoCodecStatus")),
-      integer_class_(jni, jni->FindClass("java/lang/Integer")) {
-  encoded_image_constructor_ =
-      jni->GetMethodID(*encoded_image_class_, "<init>",
-                       "(Ljava/nio/ByteBuffer;IIJLorg/webrtc/"
-                       "EncodedImage$FrameType;IZLjava/lang/Integer;)V");
-  settings_constructor_ =
-      jni->GetMethodID(*settings_class_, "<init>", "(III)V");
-
-  empty_frame_field_ = jni->GetStaticFieldID(
-      *frame_type_class_, "EmptyFrame", "Lorg/webrtc/EncodedImage$FrameType;");
-  video_frame_key_field_ =
-      jni->GetStaticFieldID(*frame_type_class_, "VideoFrameKey",
-                            "Lorg/webrtc/EncodedImage$FrameType;");
-  video_frame_delta_field_ =
-      jni->GetStaticFieldID(*frame_type_class_, "VideoFrameDelta",
-                            "Lorg/webrtc/EncodedImage$FrameType;");
-
-  video_frame_get_timestamp_ns_method_ =
-      jni->GetMethodID(*video_frame_class_, "getTimestampNs", "()J");
-
-  jclass decoder_class = jni->GetObjectClass(decoder);
-  init_decode_method_ =
-      jni->GetMethodID(decoder_class, "initDecode",
-                       "(Lorg/webrtc/VideoDecoder$Settings;Lorg/webrtc/"
-                       "VideoDecoder$Callback;)Lorg/webrtc/VideoCodecStatus;");
-  release_method_ = jni->GetMethodID(decoder_class, "release",
-                                     "()Lorg/webrtc/VideoCodecStatus;");
-  decode_method_ = jni->GetMethodID(decoder_class, "decode",
-                                    "(Lorg/webrtc/EncodedImage;Lorg/webrtc/"
-                                    "VideoDecoder$DecodeInfo;)Lorg/webrtc/"
-                                    "VideoCodecStatus;");
-  get_prefers_late_decoding_method_ =
-      jni->GetMethodID(decoder_class, "getPrefersLateDecoding", "()Z");
-  get_implementation_name_method_ = jni->GetMethodID(
-      decoder_class, "getImplementationName", "()Ljava/lang/String;");
-
-  get_number_method_ =
-      jni->GetMethodID(*video_codec_status_class_, "getNumber", "()I");
-
-  integer_constructor_ = jni->GetMethodID(*integer_class_, "<init>", "(I)V");
-  int_value_method_ = jni->GetMethodID(*integer_class_, "intValue", "()I");
-
-  initialized_ = false;
-  // QP parsing starts enabled and we disable it if the decoder provides frames.
-  qp_parsing_enabled_ = true;
-}
-
-int32_t VideoDecoderWrapper::InitDecode(const VideoCodec* codec_settings,
-                                        int32_t number_of_cores) {
-  JNIEnv* jni = AttachCurrentThreadIfNeeded();
-  ScopedLocalRefFrame local_ref_frame(jni);
-
-  codec_settings_ = *codec_settings;
-  number_of_cores_ = number_of_cores;
-  return InitDecodeInternal(jni);
-}
-
-int32_t VideoDecoderWrapper::InitDecodeInternal(JNIEnv* jni) {
-  jobject settings =
-      jni->NewObject(*settings_class_, settings_constructor_, number_of_cores_,
-                     codec_settings_.width, codec_settings_.height);
-
-  jclass callback_class =
-      FindClass(jni, "org/webrtc/VideoDecoderWrapperCallback");
-  jmethodID callback_constructor =
-      jni->GetMethodID(callback_class, "<init>", "(J)V");
-  jobject callback = jni->NewObject(callback_class, callback_constructor,
-                                    jlongFromPointer(this));
-
-  jobject ret =
-      jni->CallObjectMethod(*decoder_, init_decode_method_, settings, callback);
-  if (jni->CallIntMethod(ret, get_number_method_) == WEBRTC_VIDEO_CODEC_OK) {
-    initialized_ = true;
-  }
-
-  // The decoder was reinitialized so re-enable the QP parsing in case it stops
-  // providing QP values.
-  qp_parsing_enabled_ = true;
-
-  return HandleReturnCode(jni, ret);
-}
-
-int32_t VideoDecoderWrapper::Decode(
-    const EncodedImage& input_image,
-    bool missing_frames,
-    const RTPFragmentationHeader* fragmentation,
-    const CodecSpecificInfo* codec_specific_info,
-    int64_t render_time_ms) {
-  if (!initialized_) {
-    // Most likely initializing the codec failed.
-    return WEBRTC_VIDEO_CODEC_FALLBACK_SOFTWARE;
-  }
-
-  JNIEnv* jni = AttachCurrentThreadIfNeeded();
-  ScopedLocalRefFrame local_ref_frame(jni);
-
-  FrameExtraInfo frame_extra_info;
-  frame_extra_info.capture_time_ns =
-      input_image.capture_time_ms_ * rtc::kNumNanosecsPerMillisec;
-  frame_extra_info.timestamp_rtp = input_image._timeStamp;
-  frame_extra_info.qp =
-      qp_parsing_enabled_ ? ParseQP(input_image) : rtc::Optional<uint8_t>();
-  frame_extra_infos_.push_back(frame_extra_info);
-
-  jobject jinput_image =
-      ConvertEncodedImageToJavaEncodedImage(jni, input_image);
-  jobject ret =
-      jni->CallObjectMethod(*decoder_, decode_method_, jinput_image, nullptr);
-  return HandleReturnCode(jni, ret);
-}
-
-int32_t VideoDecoderWrapper::RegisterDecodeCompleteCallback(
-    DecodedImageCallback* callback) {
-  callback_ = callback;
-  return WEBRTC_VIDEO_CODEC_OK;
-}
-
-int32_t VideoDecoderWrapper::Release() {
-  JNIEnv* jni = AttachCurrentThreadIfNeeded();
-  ScopedLocalRefFrame local_ref_frame(jni);
-  jobject ret = jni->CallObjectMethod(*decoder_, release_method_);
-  frame_extra_infos_.clear();
-  initialized_ = false;
-  return HandleReturnCode(jni, ret);
-}
-
-bool VideoDecoderWrapper::PrefersLateDecoding() const {
-  JNIEnv* jni = AttachCurrentThreadIfNeeded();
-  return jni->CallBooleanMethod(*decoder_, get_prefers_late_decoding_method_);
-}
-
-const char* VideoDecoderWrapper::ImplementationName() const {
-  JNIEnv* jni = AttachCurrentThreadIfNeeded();
-  ScopedLocalRefFrame local_ref_frame(jni);
-  jstring jname = reinterpret_cast<jstring>(
-      jni->CallObjectMethod(*decoder_, get_implementation_name_method_));
-  return JavaToStdString(jni, jname).c_str();
-}
-
-void VideoDecoderWrapper::OnDecodedFrame(JNIEnv* jni,
-                                         jobject jframe,
-                                         jobject jdecode_time_ms,
-                                         jobject jqp) {
-  const jlong capture_time_ns =
-      jni->CallLongMethod(jframe, video_frame_get_timestamp_ns_method_);
-  FrameExtraInfo frame_extra_info;
-  do {
-    if (frame_extra_infos_.empty()) {
-      LOG(LS_WARNING) << "Java decoder produced an unexpected frame.";
-      return;
-    }
-
-    frame_extra_info = frame_extra_infos_.front();
-    frame_extra_infos_.pop_front();
-    // If the decoder might drop frames so iterate through the queue until we
-    // find a matching timestamp.
-  } while (frame_extra_info.capture_time_ns != capture_time_ns);
-
-  VideoFrame frame = android_video_buffer_factory_.CreateFrame(
-      jni, jframe, frame_extra_info.timestamp_rtp);
-
-  rtc::Optional<int32_t> decoding_time_ms;
-  if (jdecode_time_ms != nullptr) {
-    decoding_time_ms = rtc::Optional<int32_t>(
-        jni->CallIntMethod(jdecode_time_ms, int_value_method_));
-  }
-
-  rtc::Optional<uint8_t> qp;
-  if (jqp != nullptr) {
-    qp = rtc::Optional<uint8_t>(jni->CallIntMethod(jqp, int_value_method_));
-    // The decoder provides QP values itself, no need to parse the bitstream.
-    qp_parsing_enabled_ = false;
-  } else {
-    qp = frame_extra_info.qp;
-    // The decoder doesn't provide QP values, ensure bitstream parsing is
-    // enabled.
-    qp_parsing_enabled_ = true;
-  }
-
-  callback_->Decoded(frame, decoding_time_ms, qp);
-}
-
-jobject VideoDecoderWrapper::ConvertEncodedImageToJavaEncodedImage(
-    JNIEnv* jni,
-    const EncodedImage& image) {
-  jobject buffer = jni->NewDirectByteBuffer(image._buffer, image._length);
-  jfieldID frame_type_field;
-  switch (image._frameType) {
-    case kEmptyFrame:
-      frame_type_field = empty_frame_field_;
-      break;
-    case kVideoFrameKey:
-      frame_type_field = video_frame_key_field_;
-      break;
-    case kVideoFrameDelta:
-      frame_type_field = video_frame_delta_field_;
-      break;
-    default:
-      RTC_NOTREACHED();
-      return nullptr;
-  }
-  jobject frame_type =
-      jni->GetStaticObjectField(*frame_type_class_, frame_type_field);
-  jobject qp = nullptr;
-  if (image.qp_ != -1) {
-    qp = jni->NewObject(*integer_class_, integer_constructor_, image.qp_);
-  }
-  return jni->NewObject(
-      *encoded_image_class_, encoded_image_constructor_, buffer,
-      static_cast<jint>(image._encodedWidth),
-      static_cast<jint>(image._encodedHeight),
-      static_cast<jlong>(image.capture_time_ms_ * rtc::kNumNanosecsPerMillisec),
-      frame_type, static_cast<jint>(image.rotation_), image._completeFrame, qp);
-}
-
-int32_t VideoDecoderWrapper::HandleReturnCode(JNIEnv* jni, jobject code) {
-  int32_t value = jni->CallIntMethod(code, get_number_method_);
-  if (value < 0) {  // Any errors are represented by negative values.
-    // Reset the codec.
-    if (Release() == WEBRTC_VIDEO_CODEC_OK) {
-      InitDecodeInternal(jni);
-    }
-
-    LOG(LS_WARNING) << "Falling back to software decoder.";
-    return WEBRTC_VIDEO_CODEC_FALLBACK_SOFTWARE;
-  } else {
-    return value;
-  }
-}
-
-rtc::Optional<uint8_t> VideoDecoderWrapper::ParseQP(
-    const EncodedImage& input_image) {
-  if (input_image.qp_ != -1) {
-    return rtc::Optional<uint8_t>(input_image.qp_);
-  }
-
-  rtc::Optional<uint8_t> qp;
-  switch (codec_settings_.codecType) {
-    case kVideoCodecVP8: {
-      int qp_int;
-      if (vp8::GetQp(input_image._buffer, input_image._length, &qp_int)) {
-        qp = rtc::Optional<uint8_t>(qp_int);
-      }
-      break;
-    }
-    case kVideoCodecVP9: {
-      int qp_int;
-      if (vp9::GetQp(input_image._buffer, input_image._length, &qp_int)) {
-        qp = rtc::Optional<uint8_t>(qp_int);
-      }
-      break;
-    }
-    case kVideoCodecH264: {
-      h264_bitstream_parser_.ParseBitstream(input_image._buffer,
-                                            input_image._length);
-      int qp_int;
-      if (h264_bitstream_parser_.GetLastSliceQp(&qp_int)) {
-        qp = rtc::Optional<uint8_t>(qp_int);
-      }
-      break;
-    }
-    default:
-      break;  // Default is to not provide QP.
-  }
-  return qp;
-}
-
-JNI_FUNCTION_DECLARATION(void,
-                         VideoDecoderWrapperCallback_nativeOnDecodedFrame,
-                         JNIEnv* jni,
-                         jclass,
-                         jlong jnative_decoder,
-                         jobject jframe,
-                         jobject jdecode_time_ms,
-                         jobject jqp) {
-  VideoDecoderWrapper* native_decoder =
-      reinterpret_cast<VideoDecoderWrapper*>(jnative_decoder);
-  native_decoder->OnDecodedFrame(jni, jframe, jdecode_time_ms, jqp);
-}
-
-}  // namespace jni
-}  // namespace webrtc
diff --git a/sdk/android/src/jni/videodecoderwrapper.h b/sdk/android/src/jni/videodecoderwrapper.h
deleted file mode 100644
index c737456..0000000
--- a/sdk/android/src/jni/videodecoderwrapper.h
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- *  Copyright 2017 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_SDK_ANDROID_SRC_JNI_VIDEODECODERWRAPPER_H_
-#define WEBRTC_SDK_ANDROID_SRC_JNI_VIDEODECODERWRAPPER_H_
-
-#include <jni.h>
-#include <deque>
-
-#include "webrtc/api/video_codecs/video_decoder.h"
-#include "webrtc/common_video/h264/h264_bitstream_parser.h"
-#include "webrtc/sdk/android/src/jni/jni_helpers.h"
-#include "webrtc/sdk/android/src/jni/native_handle_impl.h"
-
-namespace webrtc {
-namespace jni {
-
-// Wraps a Java decoder and delegates all calls to it. Passes
-// VideoDecoderWrapperCallback to the decoder on InitDecode. Wraps the received
-// frames to AndroidVideoBuffer.
-class VideoDecoderWrapper : public VideoDecoder {
- public:
-  VideoDecoderWrapper(JNIEnv* jni, jobject decoder);
-
-  int32_t InitDecode(const VideoCodec* codec_settings,
-                     int32_t number_of_cores) override;
-
-  int32_t Decode(const EncodedImage& input_image,
-                 bool missing_frames,
-                 const RTPFragmentationHeader* fragmentation,
-                 const CodecSpecificInfo* codec_specific_info,
-                 int64_t render_time_ms) override;
-
-  int32_t RegisterDecodeCompleteCallback(
-      DecodedImageCallback* callback) override;
-
-  int32_t Release() override;
-
-  // Returns true if the decoder prefer to decode frames late.
-  // That is, it can not decode infinite number of frames before the decoded
-  // frame is consumed.
-  bool PrefersLateDecoding() const override;
-
-  const char* ImplementationName() const override;
-
-  // Wraps the frame to a AndroidVideoBuffer and passes it to the callback.
-  void OnDecodedFrame(JNIEnv* jni,
-                      jobject jframe,
-                      jobject jdecode_time_ms,
-                      jobject jqp);
-
- private:
-  struct FrameExtraInfo {
-    uint64_t capture_time_ns;  // Used as an identifier of the frame.
-
-    uint32_t timestamp_rtp;
-    rtc::Optional<uint8_t> qp;
-  };
-
-  int32_t InitDecodeInternal(JNIEnv* jni);
-
-  // Takes Java VideoCodecStatus, handles it and returns WEBRTC_VIDEO_CODEC_*
-  // status code.
-  int32_t HandleReturnCode(JNIEnv* jni, jobject code);
-
-  rtc::Optional<uint8_t> ParseQP(const EncodedImage& input_image);
-
-  VideoCodec codec_settings_;
-  int32_t number_of_cores_;
-
-  bool initialized_;
-  AndroidVideoBufferFactory android_video_buffer_factory_;
-  std::deque<FrameExtraInfo> frame_extra_infos_;
-  bool qp_parsing_enabled_;
-  H264BitstreamParser h264_bitstream_parser_;
-
-  DecodedImageCallback* callback_;
-
-  const ScopedGlobalRef<jobject> decoder_;
-  const ScopedGlobalRef<jclass> encoded_image_class_;
-  const ScopedGlobalRef<jclass> frame_type_class_;
-  const ScopedGlobalRef<jclass> settings_class_;
-  const ScopedGlobalRef<jclass> video_frame_class_;
-  const ScopedGlobalRef<jclass> video_codec_status_class_;
-  const ScopedGlobalRef<jclass> integer_class_;
-
-  jmethodID encoded_image_constructor_;
-  jmethodID settings_constructor_;
-
-  jfieldID empty_frame_field_;
-  jfieldID video_frame_key_field_;
-  jfieldID video_frame_delta_field_;
-
-  jmethodID video_frame_get_timestamp_ns_method_;
-
-  jmethodID init_decode_method_;
-  jmethodID release_method_;
-  jmethodID decode_method_;
-  jmethodID get_prefers_late_decoding_method_;
-  jmethodID get_implementation_name_method_;
-
-  jmethodID get_number_method_;
-
-  jmethodID integer_constructor_;
-  jmethodID int_value_method_;
-
-  jobject ConvertEncodedImageToJavaEncodedImage(JNIEnv* jni,
-                                                const EncodedImage& image);
-};
-
-}  // namespace jni
-}  // namespace webrtc
-
-#endif  // WEBRTC_SDK_ANDROID_SRC_JNI_VIDEODECODERWRAPPER_H_
diff --git a/sdk/android/src/jni/videoencoderfactorywrapper.cc b/sdk/android/src/jni/videoencoderfactorywrapper.cc
deleted file mode 100644
index 138d863..0000000
--- a/sdk/android/src/jni/videoencoderfactorywrapper.cc
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- *  Copyright 2017 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/sdk/android/src/jni/videoencoderfactorywrapper.h"
-
-#include "webrtc/api/video_codecs/video_encoder.h"
-#include "webrtc/common_types.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/sdk/android/src/jni/classreferenceholder.h"
-#include "webrtc/sdk/android/src/jni/videoencoderwrapper.h"
-
-namespace webrtc {
-namespace jni {
-
-VideoEncoderFactoryWrapper::VideoEncoderFactoryWrapper(JNIEnv* jni,
-                                                       jobject encoder_factory)
-    : video_codec_info_class_(jni, FindClass(jni, "org/webrtc/VideoCodecInfo")),
-      hash_map_class_(jni, jni->FindClass("java/util/HashMap")),
-      encoder_factory_(jni, encoder_factory) {
-  jclass encoder_factory_class = jni->GetObjectClass(*encoder_factory_);
-  create_encoder_method_ = jni->GetMethodID(
-      encoder_factory_class, "createEncoder",
-      "(Lorg/webrtc/VideoCodecInfo;)Lorg/webrtc/VideoEncoder;");
-  get_supported_codecs_method_ =
-      jni->GetMethodID(encoder_factory_class, "getSupportedCodecs",
-                       "()[Lorg/webrtc/VideoCodecInfo;");
-
-  video_codec_info_constructor_ =
-      jni->GetMethodID(*video_codec_info_class_, "<init>",
-                       "(ILjava/lang/String;Ljava/util/Map;)V");
-  payload_field_ = jni->GetFieldID(*video_codec_info_class_, "payload", "I");
-  name_field_ =
-      jni->GetFieldID(*video_codec_info_class_, "name", "Ljava/lang/String;");
-  params_field_ =
-      jni->GetFieldID(*video_codec_info_class_, "params", "Ljava/util/Map;");
-
-  hash_map_constructor_ = jni->GetMethodID(*hash_map_class_, "<init>", "()V");
-  put_method_ = jni->GetMethodID(
-      *hash_map_class_, "put",
-      "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");
-
-  supported_codecs_ = GetSupportedCodecs(jni);
-}
-
-VideoEncoder* VideoEncoderFactoryWrapper::CreateVideoEncoder(
-    const cricket::VideoCodec& codec) {
-  JNIEnv* jni = AttachCurrentThreadIfNeeded();
-  ScopedLocalRefFrame local_ref_frame(jni);
-  jobject j_codec_info = ToJavaCodecInfo(jni, codec);
-  jobject encoder = jni->CallObjectMethod(*encoder_factory_,
-                                          create_encoder_method_, j_codec_info);
-  return encoder != nullptr ? new VideoEncoderWrapper(jni, encoder) : nullptr;
-}
-
-jobject VideoEncoderFactoryWrapper::ToJavaCodecInfo(
-    JNIEnv* jni,
-    const cricket::VideoCodec& codec) {
-  jobject j_params = jni->NewObject(*hash_map_class_, hash_map_constructor_);
-  for (auto const& param : codec.params) {
-    jni->CallObjectMethod(j_params, put_method_,
-                          JavaStringFromStdString(jni, param.first),
-                          JavaStringFromStdString(jni, param.second));
-  }
-  return jni->NewObject(*video_codec_info_class_, video_codec_info_constructor_,
-                        codec.id, JavaStringFromStdString(jni, codec.name),
-                        j_params);
-}
-
-std::vector<cricket::VideoCodec> VideoEncoderFactoryWrapper::GetSupportedCodecs(
-    JNIEnv* jni) const {
-  const jobjectArray j_supported_codecs = static_cast<jobjectArray>(
-      jni->CallObjectMethod(*encoder_factory_, get_supported_codecs_method_));
-  const jsize supported_codecs_count = jni->GetArrayLength(j_supported_codecs);
-
-  std::vector<cricket::VideoCodec> supported_codecs;
-  supported_codecs.resize(supported_codecs_count);
-  for (jsize i = 0; i < supported_codecs_count; i++) {
-    jobject j_supported_codec =
-        jni->GetObjectArrayElement(j_supported_codecs, i);
-    int payload = jni->GetIntField(j_supported_codec, payload_field_);
-    jobject j_params = jni->GetObjectField(j_supported_codec, params_field_);
-    jstring j_name = static_cast<jstring>(
-        jni->GetObjectField(j_supported_codec, name_field_));
-    supported_codecs[i] =
-        cricket::VideoCodec(payload, JavaToStdString(jni, j_name));
-    supported_codecs[i].params = JavaToStdMapStrings(jni, j_params);
-  }
-  return supported_codecs;
-}
-
-void VideoEncoderFactoryWrapper::DestroyVideoEncoder(VideoEncoder* encoder) {
-  delete encoder;
-}
-
-}  // namespace jni
-}  // namespace webrtc
diff --git a/sdk/android/src/jni/videoencoderfactorywrapper.h b/sdk/android/src/jni/videoencoderfactorywrapper.h
deleted file mode 100644
index 03d054d..0000000
--- a/sdk/android/src/jni/videoencoderfactorywrapper.h
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- *  Copyright 2017 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_SDK_ANDROID_SRC_JNI_VIDEOENCODERFACTORYWRAPPER_H_
-#define WEBRTC_SDK_ANDROID_SRC_JNI_VIDEOENCODERFACTORYWRAPPER_H_
-
-#include <jni.h>
-#include <vector>
-
-#include "webrtc/media/engine/webrtcvideoencoderfactory.h"
-#include "webrtc/sdk/android/src/jni/jni_helpers.h"
-
-namespace webrtc {
-namespace jni {
-
-// Wrapper for Java VideoEncoderFactory class. Delegates method calls through
-// JNI and wraps the encoder inside VideoEncoderWrapper.
-class VideoEncoderFactoryWrapper : public cricket::WebRtcVideoEncoderFactory {
- public:
-  VideoEncoderFactoryWrapper(JNIEnv* jni, jobject encoder_factory);
-
-  // Caller takes the ownership of the returned object and it should be released
-  // by calling DestroyVideoEncoder().
-  VideoEncoder* CreateVideoEncoder(const cricket::VideoCodec& codec) override;
-
-  // Returns a list of supported codecs in order of preference.
-  const std::vector<cricket::VideoCodec>& supported_codecs() const override {
-    return supported_codecs_;
-  }
-
-  void DestroyVideoEncoder(VideoEncoder* encoder) override;
-
- private:
-  std::vector<cricket::VideoCodec> GetSupportedCodecs(JNIEnv* jni) const;
-  jobject ToJavaCodecInfo(JNIEnv* jni, const cricket::VideoCodec& codec);
-
-  const ScopedGlobalRef<jclass> video_codec_info_class_;
-  const ScopedGlobalRef<jclass> hash_map_class_;
-  const ScopedGlobalRef<jobject> encoder_factory_;
-
-  jmethodID create_encoder_method_;
-  jmethodID get_supported_codecs_method_;
-
-  jmethodID video_codec_info_constructor_;
-  jfieldID payload_field_;
-  jfieldID name_field_;
-  jfieldID params_field_;
-
-  jmethodID hash_map_constructor_;
-  jmethodID put_method_;
-
-  std::vector<cricket::VideoCodec> supported_codecs_;
-};
-
-}  // namespace jni
-}  // namespace webrtc
-
-#endif  // WEBRTC_SDK_ANDROID_SRC_JNI_VIDEOENCODERFACTORYWRAPPER_H_
diff --git a/sdk/android/src/jni/videoencoderwrapper.cc b/sdk/android/src/jni/videoencoderwrapper.cc
deleted file mode 100644
index 2b87d67..0000000
--- a/sdk/android/src/jni/videoencoderwrapper.cc
+++ /dev/null
@@ -1,490 +0,0 @@
-/*
- *  Copyright 2017 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/sdk/android/src/jni/videoencoderwrapper.h"
-
-#include <utility>
-
-#include "webrtc/common_video/h264/h264_common.h"
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/modules/video_coding/include/video_codec_interface.h"
-#include "webrtc/modules/video_coding/include/video_error_codes.h"
-#include "webrtc/modules/video_coding/utility/vp8_header_parser.h"
-#include "webrtc/modules/video_coding/utility/vp9_uncompressed_header_parser.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/random.h"
-#include "webrtc/rtc_base/timeutils.h"
-#include "webrtc/sdk/android/src/jni/classreferenceholder.h"
-
-namespace webrtc {
-namespace jni {
-
-static const int kMaxJavaEncoderResets = 3;
-
-VideoEncoderWrapper::VideoEncoderWrapper(JNIEnv* jni, jobject j_encoder)
-    : encoder_(jni, j_encoder),
-      settings_class_(jni, FindClass(jni, "org/webrtc/VideoEncoder$Settings")),
-      encode_info_class_(jni,
-                         FindClass(jni, "org/webrtc/VideoEncoder$EncodeInfo")),
-      frame_type_class_(jni,
-                        FindClass(jni, "org/webrtc/EncodedImage$FrameType")),
-      bitrate_allocation_class_(
-          jni,
-          FindClass(jni, "org/webrtc/VideoEncoder$BitrateAllocation")),
-      int_array_class_(jni, jni->FindClass("[I")),
-      video_frame_factory_(jni) {
-  jclass encoder_class = FindClass(jni, "org/webrtc/VideoEncoder");
-
-  init_encode_method_ =
-      jni->GetMethodID(encoder_class, "initEncode",
-                       "(Lorg/webrtc/VideoEncoder$Settings;Lorg/webrtc/"
-                       "VideoEncoder$Callback;)Lorg/webrtc/VideoCodecStatus;");
-  release_method_ = jni->GetMethodID(encoder_class, "release",
-                                     "()Lorg/webrtc/VideoCodecStatus;");
-  encode_method_ = jni->GetMethodID(
-      encoder_class, "encode",
-      "(Lorg/webrtc/VideoFrame;Lorg/webrtc/"
-      "VideoEncoder$EncodeInfo;)Lorg/webrtc/VideoCodecStatus;");
-  set_channel_parameters_method_ =
-      jni->GetMethodID(encoder_class, "setChannelParameters",
-                       "(SJ)Lorg/webrtc/VideoCodecStatus;");
-  set_rate_allocation_method_ =
-      jni->GetMethodID(encoder_class, "setRateAllocation",
-                       "(Lorg/webrtc/VideoEncoder$BitrateAllocation;I)Lorg/"
-                       "webrtc/VideoCodecStatus;");
-  get_scaling_settings_method_ =
-      jni->GetMethodID(encoder_class, "getScalingSettings",
-                       "()Lorg/webrtc/VideoEncoder$ScalingSettings;");
-  get_implementation_name_method_ = jni->GetMethodID(
-      encoder_class, "getImplementationName", "()Ljava/lang/String;");
-
-  settings_constructor_ =
-      jni->GetMethodID(*settings_class_, "<init>", "(IIIIIZ)V");
-
-  encode_info_constructor_ = jni->GetMethodID(
-      *encode_info_class_, "<init>", "([Lorg/webrtc/EncodedImage$FrameType;)V");
-
-  frame_type_from_native_method_ =
-      jni->GetStaticMethodID(*frame_type_class_, "fromNative",
-                             "(I)Lorg/webrtc/EncodedImage$FrameType;");
-
-  bitrate_allocation_constructor_ =
-      jni->GetMethodID(*bitrate_allocation_class_, "<init>", "([[I)V");
-
-  jclass video_codec_status_class =
-      FindClass(jni, "org/webrtc/VideoCodecStatus");
-  get_number_method_ =
-      jni->GetMethodID(video_codec_status_class, "getNumber", "()I");
-
-  jclass integer_class = jni->FindClass("java/lang/Integer");
-  int_value_method_ = jni->GetMethodID(integer_class, "intValue", "()I");
-
-  jclass scaling_settings_class =
-      FindClass(jni, "org/webrtc/VideoEncoder$ScalingSettings");
-  scaling_settings_on_field_ =
-      jni->GetFieldID(scaling_settings_class, "on", "Z");
-  scaling_settings_low_field_ =
-      jni->GetFieldID(scaling_settings_class, "low", "Ljava/lang/Integer;");
-  scaling_settings_high_field_ =
-      jni->GetFieldID(scaling_settings_class, "high", "Ljava/lang/Integer;");
-
-  implementation_name_ = GetImplementationName(jni);
-
-  encoder_queue_ = rtc::TaskQueue::Current();
-
-  initialized_ = false;
-  num_resets_ = 0;
-
-  Random random(rtc::TimeMicros());
-  picture_id_ = random.Rand<uint16_t>() & 0x7FFF;
-  tl0_pic_idx_ = random.Rand<uint8_t>();
-}
-
-int32_t VideoEncoderWrapper::InitEncode(const VideoCodec* codec_settings,
-                                        int32_t number_of_cores,
-                                        size_t max_payload_size) {
-  JNIEnv* jni = AttachCurrentThreadIfNeeded();
-  ScopedLocalRefFrame local_ref_frame(jni);
-
-  number_of_cores_ = number_of_cores;
-  codec_settings_ = *codec_settings;
-  num_resets_ = 0;
-
-  return InitEncodeInternal(jni);
-}
-
-int32_t VideoEncoderWrapper::InitEncodeInternal(JNIEnv* jni) {
-  bool automatic_resize_on;
-  switch (codec_settings_.codecType) {
-    case kVideoCodecVP8:
-      automatic_resize_on = codec_settings_.VP8()->automaticResizeOn;
-      break;
-    case kVideoCodecVP9:
-      automatic_resize_on = codec_settings_.VP9()->automaticResizeOn;
-      break;
-    default:
-      automatic_resize_on = true;
-  }
-
-  jobject settings =
-      jni->NewObject(*settings_class_, settings_constructor_, number_of_cores_,
-                     codec_settings_.width, codec_settings_.height,
-                     codec_settings_.startBitrate, codec_settings_.maxFramerate,
-                     automatic_resize_on);
-
-  jclass callback_class =
-      FindClass(jni, "org/webrtc/VideoEncoderWrapperCallback");
-  jmethodID callback_constructor =
-      jni->GetMethodID(callback_class, "<init>", "(J)V");
-  jobject callback = jni->NewObject(callback_class, callback_constructor,
-                                    jlongFromPointer(this));
-
-  jobject ret =
-      jni->CallObjectMethod(*encoder_, init_encode_method_, settings, callback);
-  if (jni->CallIntMethod(ret, get_number_method_) == WEBRTC_VIDEO_CODEC_OK) {
-    initialized_ = true;
-  }
-
-  return HandleReturnCode(jni, ret);
-}
-
-int32_t VideoEncoderWrapper::RegisterEncodeCompleteCallback(
-    EncodedImageCallback* callback) {
-  callback_ = callback;
-  return WEBRTC_VIDEO_CODEC_OK;
-}
-
-int32_t VideoEncoderWrapper::Release() {
-  JNIEnv* jni = AttachCurrentThreadIfNeeded();
-  ScopedLocalRefFrame local_ref_frame(jni);
-  jobject ret = jni->CallObjectMethod(*encoder_, release_method_);
-  frame_extra_infos_.clear();
-  initialized_ = false;
-  return HandleReturnCode(jni, ret);
-}
-
-int32_t VideoEncoderWrapper::Encode(
-    const VideoFrame& frame,
-    const CodecSpecificInfo* /* codec_specific_info */,
-    const std::vector<FrameType>* frame_types) {
-  if (!initialized_) {
-    // Most likely initializing the codec failed.
-    return WEBRTC_VIDEO_CODEC_FALLBACK_SOFTWARE;
-  }
-
-  JNIEnv* jni = AttachCurrentThreadIfNeeded();
-  ScopedLocalRefFrame local_ref_frame(jni);
-
-  // Construct encode info.
-  jobjectArray j_frame_types =
-      jni->NewObjectArray(frame_types->size(), *frame_type_class_, nullptr);
-  for (size_t i = 0; i < frame_types->size(); ++i) {
-    jobject j_frame_type = jni->CallStaticObjectMethod(
-        *frame_type_class_, frame_type_from_native_method_,
-        static_cast<jint>((*frame_types)[i]));
-    jni->SetObjectArrayElement(j_frame_types, i, j_frame_type);
-  }
-  jobject encode_info = jni->NewObject(*encode_info_class_,
-                                       encode_info_constructor_, j_frame_types);
-
-  FrameExtraInfo info;
-  info.capture_time_ns = frame.timestamp_us() * rtc::kNumNanosecsPerMicrosec;
-  info.timestamp_rtp = frame.timestamp();
-  frame_extra_infos_.push_back(info);
-
-  jobject ret = jni->CallObjectMethod(
-      *encoder_, encode_method_, video_frame_factory_.ToJavaFrame(jni, frame),
-      encode_info);
-  return HandleReturnCode(jni, ret);
-}
-
-int32_t VideoEncoderWrapper::SetChannelParameters(uint32_t packet_loss,
-                                                  int64_t rtt) {
-  JNIEnv* jni = AttachCurrentThreadIfNeeded();
-  ScopedLocalRefFrame local_ref_frame(jni);
-  jobject ret = jni->CallObjectMethod(*encoder_, set_channel_parameters_method_,
-                                      (jshort)packet_loss, (jlong)rtt);
-  return HandleReturnCode(jni, ret);
-}
-
-int32_t VideoEncoderWrapper::SetRateAllocation(
-    const BitrateAllocation& allocation,
-    uint32_t framerate) {
-  JNIEnv* jni = AttachCurrentThreadIfNeeded();
-  ScopedLocalRefFrame local_ref_frame(jni);
-
-  jobject j_bitrate_allocation = ToJavaBitrateAllocation(jni, allocation);
-  jobject ret = jni->CallObjectMethod(*encoder_, set_rate_allocation_method_,
-                                      j_bitrate_allocation, (jint)framerate);
-  return HandleReturnCode(jni, ret);
-}
-
-VideoEncoderWrapper::ScalingSettings VideoEncoderWrapper::GetScalingSettings()
-    const {
-  JNIEnv* jni = AttachCurrentThreadIfNeeded();
-  ScopedLocalRefFrame local_ref_frame(jni);
-  jobject j_scaling_settings =
-      jni->CallObjectMethod(*encoder_, get_scaling_settings_method_);
-  bool on =
-      jni->GetBooleanField(j_scaling_settings, scaling_settings_on_field_);
-  jobject j_low =
-      jni->GetObjectField(j_scaling_settings, scaling_settings_low_field_);
-  jobject j_high =
-      jni->GetObjectField(j_scaling_settings, scaling_settings_high_field_);
-
-  if (j_low != nullptr || j_high != nullptr) {
-    RTC_DCHECK(j_low != nullptr);
-    RTC_DCHECK(j_high != nullptr);
-    int low = jni->CallIntMethod(j_low, int_value_method_);
-    int high = jni->CallIntMethod(j_high, int_value_method_);
-    return ScalingSettings(on, low, high);
-  } else {
-    return ScalingSettings(on);
-  }
-}
-
-const char* VideoEncoderWrapper::ImplementationName() const {
-  return implementation_name_.c_str();
-}
-
-void VideoEncoderWrapper::OnEncodedFrame(JNIEnv* jni,
-                                         jobject j_buffer,
-                                         jint encoded_width,
-                                         jint encoded_height,
-                                         jlong capture_time_ns,
-                                         jint frame_type,
-                                         jint rotation,
-                                         jboolean complete_frame,
-                                         jobject j_qp) {
-  const uint8_t* buffer =
-      static_cast<uint8_t*>(jni->GetDirectBufferAddress(j_buffer));
-  const size_t buffer_size = jni->GetDirectBufferCapacity(j_buffer);
-
-  std::vector<uint8_t> buffer_copy(buffer_size);
-  memcpy(buffer_copy.data(), buffer, buffer_size);
-  int qp = -1;
-  if (j_qp != nullptr) {
-    qp = jni->CallIntMethod(j_qp, int_value_method_);
-  }
-
-  encoder_queue_->PostTask(
-      [
-        this, task_buffer = std::move(buffer_copy), qp, encoded_width,
-        encoded_height, capture_time_ns, frame_type, rotation, complete_frame
-      ]() {
-        FrameExtraInfo frame_extra_info;
-        do {
-          if (frame_extra_infos_.empty()) {
-            LOG(LS_WARNING)
-                << "Java encoder produced an unexpected frame with timestamp: "
-                << capture_time_ns;
-            return;
-          }
-
-          frame_extra_info = frame_extra_infos_.front();
-          frame_extra_infos_.pop_front();
-          // The encoder might drop frames so iterate through the queue until
-          // we find a matching timestamp.
-        } while (frame_extra_info.capture_time_ns != capture_time_ns);
-
-        RTPFragmentationHeader header = ParseFragmentationHeader(task_buffer);
-        EncodedImage frame(const_cast<uint8_t*>(task_buffer.data()),
-                           task_buffer.size(), task_buffer.size());
-        frame._encodedWidth = encoded_width;
-        frame._encodedHeight = encoded_height;
-        frame._timeStamp = frame_extra_info.timestamp_rtp;
-        frame.capture_time_ms_ = capture_time_ns / rtc::kNumNanosecsPerMillisec;
-        frame._frameType = (FrameType)frame_type;
-        frame.rotation_ = (VideoRotation)rotation;
-        frame._completeFrame = complete_frame;
-        if (qp == -1) {
-          frame.qp_ = ParseQp(task_buffer);
-        } else {
-          frame.qp_ = qp;
-        }
-
-        CodecSpecificInfo info(ParseCodecSpecificInfo(frame));
-        callback_->OnEncodedImage(frame, &info, &header);
-      });
-}
-
-int32_t VideoEncoderWrapper::HandleReturnCode(JNIEnv* jni, jobject code) {
-  int32_t value = jni->CallIntMethod(code, get_number_method_);
-  if (value < 0) {  // Any errors are represented by negative values.
-    // Try resetting the codec.
-    if (++num_resets_ <= kMaxJavaEncoderResets &&
-        Release() == WEBRTC_VIDEO_CODEC_OK) {
-      LOG(LS_WARNING) << "Reset Java encoder: " << num_resets_;
-      return InitEncodeInternal(jni);
-    }
-
-    LOG(LS_WARNING) << "Falling back to software decoder.";
-    return WEBRTC_VIDEO_CODEC_FALLBACK_SOFTWARE;
-  } else {
-    return value;
-  }
-}
-
-RTPFragmentationHeader VideoEncoderWrapper::ParseFragmentationHeader(
-    const std::vector<uint8_t>& buffer) {
-  RTPFragmentationHeader header;
-  if (codec_settings_.codecType == kVideoCodecH264) {
-    h264_bitstream_parser_.ParseBitstream(buffer.data(), buffer.size());
-
-    // For H.264 search for start codes.
-    const std::vector<H264::NaluIndex> nalu_idxs =
-        H264::FindNaluIndices(buffer.data(), buffer.size());
-    if (nalu_idxs.empty()) {
-      LOG(LS_ERROR) << "Start code is not found!";
-      LOG(LS_ERROR) << "Data:" << buffer[0] << " " << buffer[1] << " "
-                    << buffer[2] << " " << buffer[3] << " " << buffer[4] << " "
-                    << buffer[5];
-    }
-    header.VerifyAndAllocateFragmentationHeader(nalu_idxs.size());
-    for (size_t i = 0; i < nalu_idxs.size(); i++) {
-      header.fragmentationOffset[i] = nalu_idxs[i].payload_start_offset;
-      header.fragmentationLength[i] = nalu_idxs[i].payload_size;
-      header.fragmentationPlType[i] = 0;
-      header.fragmentationTimeDiff[i] = 0;
-    }
-  } else {
-    // Generate a header describing a single fragment.
-    header.VerifyAndAllocateFragmentationHeader(1);
-    header.fragmentationOffset[0] = 0;
-    header.fragmentationLength[0] = buffer.size();
-    header.fragmentationPlType[0] = 0;
-    header.fragmentationTimeDiff[0] = 0;
-  }
-  return header;
-}
-
-int VideoEncoderWrapper::ParseQp(const std::vector<uint8_t>& buffer) {
-  int qp;
-  bool success;
-  switch (codec_settings_.codecType) {
-    case kVideoCodecVP8:
-      success = vp8::GetQp(buffer.data(), buffer.size(), &qp);
-      break;
-    case kVideoCodecVP9:
-      success = vp9::GetQp(buffer.data(), buffer.size(), &qp);
-      break;
-    case kVideoCodecH264:
-      success = h264_bitstream_parser_.GetLastSliceQp(&qp);
-      break;
-    default:  // Default is to not provide QP.
-      success = false;
-      break;
-  }
-  return success ? qp : -1;  // -1 means unknown QP.
-}
-
-CodecSpecificInfo VideoEncoderWrapper::ParseCodecSpecificInfo(
-    const EncodedImage& frame) {
-  const bool key_frame = frame._frameType == kVideoFrameKey;
-
-  CodecSpecificInfo info;
-  memset(&info, 0, sizeof(info));
-  info.codecType = codec_settings_.codecType;
-  info.codec_name = implementation_name_.c_str();
-
-  switch (codec_settings_.codecType) {
-    case kVideoCodecVP8:
-      info.codecSpecific.VP8.pictureId = picture_id_;
-      info.codecSpecific.VP8.nonReference = false;
-      info.codecSpecific.VP8.simulcastIdx = 0;
-      info.codecSpecific.VP8.temporalIdx = kNoTemporalIdx;
-      info.codecSpecific.VP8.layerSync = false;
-      info.codecSpecific.VP8.tl0PicIdx = kNoTl0PicIdx;
-      info.codecSpecific.VP8.keyIdx = kNoKeyIdx;
-      break;
-    case kVideoCodecVP9:
-      if (key_frame) {
-        gof_idx_ = 0;
-      }
-      info.codecSpecific.VP9.picture_id = picture_id_;
-      info.codecSpecific.VP9.inter_pic_predicted = key_frame ? false : true;
-      info.codecSpecific.VP9.flexible_mode = false;
-      info.codecSpecific.VP9.ss_data_available = key_frame ? true : false;
-      info.codecSpecific.VP9.tl0_pic_idx = tl0_pic_idx_++;
-      info.codecSpecific.VP9.temporal_idx = kNoTemporalIdx;
-      info.codecSpecific.VP9.spatial_idx = kNoSpatialIdx;
-      info.codecSpecific.VP9.temporal_up_switch = true;
-      info.codecSpecific.VP9.inter_layer_predicted = false;
-      info.codecSpecific.VP9.gof_idx =
-          static_cast<uint8_t>(gof_idx_++ % gof_.num_frames_in_gof);
-      info.codecSpecific.VP9.num_spatial_layers = 1;
-      info.codecSpecific.VP9.spatial_layer_resolution_present = false;
-      if (info.codecSpecific.VP9.ss_data_available) {
-        info.codecSpecific.VP9.spatial_layer_resolution_present = true;
-        info.codecSpecific.VP9.width[0] = frame._encodedWidth;
-        info.codecSpecific.VP9.height[0] = frame._encodedHeight;
-        info.codecSpecific.VP9.gof.CopyGofInfoVP9(gof_);
-      }
-      break;
-    default:
-      break;
-  }
-
-  picture_id_ = (picture_id_ + 1) & 0x7FFF;
-
-  return info;
-}
-
-jobject VideoEncoderWrapper::ToJavaBitrateAllocation(
-    JNIEnv* jni,
-    const BitrateAllocation& allocation) {
-  jobjectArray j_allocation_array = jni->NewObjectArray(
-      kMaxSpatialLayers, *int_array_class_, nullptr /* initial */);
-  for (int spatial_i = 0; spatial_i < kMaxSpatialLayers; ++spatial_i) {
-    jintArray j_array_spatial_layer = jni->NewIntArray(kMaxTemporalStreams);
-    jint* array_spatial_layer =
-        jni->GetIntArrayElements(j_array_spatial_layer, nullptr /* isCopy */);
-    for (int temporal_i = 0; temporal_i < kMaxTemporalStreams; ++temporal_i) {
-      array_spatial_layer[temporal_i] =
-          allocation.GetBitrate(spatial_i, temporal_i);
-    }
-    jni->ReleaseIntArrayElements(j_array_spatial_layer, array_spatial_layer,
-                                 JNI_COMMIT);
-
-    jni->SetObjectArrayElement(j_allocation_array, spatial_i,
-                               j_array_spatial_layer);
-  }
-  return jni->NewObject(*bitrate_allocation_class_,
-                        bitrate_allocation_constructor_, j_allocation_array);
-}
-
-std::string VideoEncoderWrapper::GetImplementationName(JNIEnv* jni) const {
-  jstring jname = reinterpret_cast<jstring>(
-      jni->CallObjectMethod(*encoder_, get_implementation_name_method_));
-  return JavaToStdString(jni, jname);
-}
-
-JNI_FUNCTION_DECLARATION(void,
-                         VideoEncoderWrapperCallback_nativeOnEncodedFrame,
-                         JNIEnv* jni,
-                         jclass,
-                         jlong j_native_encoder,
-                         jobject buffer,
-                         jint encoded_width,
-                         jint encoded_height,
-                         jlong capture_time_ns,
-                         jint frame_type,
-                         jint rotation,
-                         jboolean complete_frame,
-                         jobject qp) {
-  VideoEncoderWrapper* native_encoder =
-      reinterpret_cast<VideoEncoderWrapper*>(j_native_encoder);
-  native_encoder->OnEncodedFrame(jni, buffer, encoded_width, encoded_height,
-                                 capture_time_ns, frame_type, rotation,
-                                 complete_frame, qp);
-}
-
-}  // namespace jni
-}  // namespace webrtc
diff --git a/sdk/android/src/jni/videoencoderwrapper.h b/sdk/android/src/jni/videoencoderwrapper.h
deleted file mode 100644
index afda8d2..0000000
--- a/sdk/android/src/jni/videoencoderwrapper.h
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- *  Copyright 2017 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_SDK_ANDROID_SRC_JNI_VIDEOENCODERWRAPPER_H_
-#define WEBRTC_SDK_ANDROID_SRC_JNI_VIDEOENCODERWRAPPER_H_
-
-#include <jni.h>
-#include <deque>
-#include <string>
-#include <vector>
-
-#include "webrtc/api/video_codecs/video_encoder.h"
-#include "webrtc/common_video/h264/h264_bitstream_parser.h"
-#include "webrtc/modules/video_coding/codecs/vp9/include/vp9_globals.h"
-#include "webrtc/rtc_base/task_queue.h"
-#include "webrtc/sdk/android/src/jni/jni_helpers.h"
-#include "webrtc/sdk/android/src/jni/native_handle_impl.h"
-
-namespace webrtc {
-namespace jni {
-
-// Wraps a Java decoder and delegates all calls to it. Passes
-// VideoEncoderWrapperCallback to the decoder on InitDecode. Wraps the received
-// frames to AndroidVideoBuffer.
-class VideoEncoderWrapper : public VideoEncoder {
- public:
-  VideoEncoderWrapper(JNIEnv* jni, jobject j_encoder);
-
-  int32_t InitEncode(const VideoCodec* codec_settings,
-                     int32_t number_of_cores,
-                     size_t max_payload_size) override;
-
-  int32_t RegisterEncodeCompleteCallback(
-      EncodedImageCallback* callback) override;
-
-  int32_t Release() override;
-
-  int32_t Encode(const VideoFrame& frame,
-                 const CodecSpecificInfo* codec_specific_info,
-                 const std::vector<FrameType>* frame_types) override;
-
-  int32_t SetChannelParameters(uint32_t packet_loss, int64_t rtt) override;
-
-  int32_t SetRateAllocation(const BitrateAllocation& allocation,
-                            uint32_t framerate) override;
-
-  ScalingSettings GetScalingSettings() const override;
-
-  bool SupportsNativeHandle() const override { return true; }
-
-  // Should only be called by JNI.
-  void OnEncodedFrame(JNIEnv* jni,
-                      jobject j_buffer,
-                      jint encoded_width,
-                      jint encoded_height,
-                      jlong capture_time_ms,
-                      jint frame_type,
-                      jint rotation,
-                      jboolean complete_frame,
-                      jobject j_qp);
-
-  const char* ImplementationName() const override;
-
- private:
-  struct FrameExtraInfo {
-    uint64_t capture_time_ns;  // Used as an identifier of the frame.
-
-    uint32_t timestamp_rtp;
-  };
-
-  int32_t InitEncodeInternal(JNIEnv* jni);
-
-  // Takes Java VideoCodecStatus, handles it and returns WEBRTC_VIDEO_CODEC_*
-  // status code.
-  int32_t HandleReturnCode(JNIEnv* jni, jobject code);
-
-  RTPFragmentationHeader ParseFragmentationHeader(
-      const std::vector<uint8_t>& buffer);
-  int ParseQp(const std::vector<uint8_t>& buffer);
-  CodecSpecificInfo ParseCodecSpecificInfo(const EncodedImage& frame);
-  jobject ToJavaBitrateAllocation(JNIEnv* jni,
-                                  const BitrateAllocation& allocation);
-  std::string GetImplementationName(JNIEnv* jni) const;
-
-  const ScopedGlobalRef<jobject> encoder_;
-  const ScopedGlobalRef<jclass> settings_class_;
-  const ScopedGlobalRef<jclass> encode_info_class_;
-  const ScopedGlobalRef<jclass> frame_type_class_;
-  const ScopedGlobalRef<jclass> bitrate_allocation_class_;
-  const ScopedGlobalRef<jclass> int_array_class_;
-
-  jmethodID init_encode_method_;
-  jmethodID release_method_;
-  jmethodID encode_method_;
-  jmethodID set_channel_parameters_method_;
-  jmethodID set_rate_allocation_method_;
-  jmethodID get_scaling_settings_method_;
-  jmethodID get_implementation_name_method_;
-
-  jmethodID settings_constructor_;
-
-  jmethodID encode_info_constructor_;
-
-  jmethodID frame_type_from_native_method_;
-
-  jmethodID bitrate_allocation_constructor_;
-
-  jfieldID scaling_settings_on_field_;
-  jfieldID scaling_settings_low_field_;
-  jfieldID scaling_settings_high_field_;
-
-  jmethodID get_number_method_;
-
-  jmethodID int_value_method_;
-
-  std::string implementation_name_;
-
-  rtc::TaskQueue* encoder_queue_;
-  JavaVideoFrameFactory video_frame_factory_;
-  std::deque<FrameExtraInfo> frame_extra_infos_;
-  EncodedImageCallback* callback_;
-  bool initialized_;
-  int num_resets_;
-  int number_of_cores_;
-  VideoCodec codec_settings_;
-  H264BitstreamParser h264_bitstream_parser_;
-
-  // RTP state.
-  uint16_t picture_id_;
-  uint8_t tl0_pic_idx_;
-
-  // VP9 variables to populate codec specific structure.
-  GofInfoVP9 gof_;  // Contains each frame's temporal information for
-                    // non-flexible VP9 mode.
-  size_t gof_idx_;
-};
-
-}  // namespace jni
-}  // namespace webrtc
-
-#endif  // WEBRTC_SDK_ANDROID_SRC_JNI_VIDEOENCODERWRAPPER_H_
diff --git a/sdk/android/src/jni/videofilerenderer_jni.cc b/sdk/android/src/jni/videofilerenderer_jni.cc
deleted file mode 100644
index 638994d..0000000
--- a/sdk/android/src/jni/videofilerenderer_jni.cc
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- *  Copyright 2017 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 <jni.h>
-
-#include "third_party/libyuv/include/libyuv/scale.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-
-namespace webrtc {
-namespace jni {
-
-extern "C" JNIEXPORT void JNICALL
-Java_org_webrtc_VideoFileRenderer_nativeI420Scale(JNIEnv* jni,
-                                                  jclass,
-                                                  jobject j_src_buffer_y,
-                                                  jint j_src_stride_y,
-                                                  jobject j_src_buffer_u,
-                                                  jint j_src_stride_u,
-                                                  jobject j_src_buffer_v,
-                                                  jint j_src_stride_v,
-                                                  jint width,
-                                                  jint height,
-                                                  jbyteArray j_dst_buffer,
-                                                  jint dstWidth,
-                                                  jint dstHeight) {
-  size_t src_size_y = jni->GetDirectBufferCapacity(j_src_buffer_y);
-  size_t src_size_u = jni->GetDirectBufferCapacity(j_src_buffer_u);
-  size_t src_size_v = jni->GetDirectBufferCapacity(j_src_buffer_v);
-  size_t dst_size = jni->GetDirectBufferCapacity(j_dst_buffer);
-  int dst_stride = dstWidth;
-  RTC_CHECK_GE(src_size_y, j_src_stride_y * height);
-  RTC_CHECK_GE(src_size_u, j_src_stride_u * height / 4);
-  RTC_CHECK_GE(src_size_v, j_src_stride_v * height / 4);
-  RTC_CHECK_GE(dst_size, dst_stride * dstHeight * 3 / 2);
-  uint8_t* src_y =
-      reinterpret_cast<uint8_t*>(jni->GetDirectBufferAddress(j_src_buffer_y));
-  uint8_t* src_u =
-      reinterpret_cast<uint8_t*>(jni->GetDirectBufferAddress(j_src_buffer_u));
-  uint8_t* src_v =
-      reinterpret_cast<uint8_t*>(jni->GetDirectBufferAddress(j_src_buffer_v));
-  uint8_t* dst =
-      reinterpret_cast<uint8_t*>(jni->GetDirectBufferAddress(j_dst_buffer));
-
-  uint8_t* dst_y = dst;
-  size_t dst_stride_y = dst_stride;
-  uint8_t* dst_u = dst + dst_stride * dstHeight;
-  size_t dst_stride_u = dst_stride / 2;
-  uint8_t* dst_v = dst + dst_stride * dstHeight * 5 / 4;
-  size_t dst_stride_v = dst_stride / 2;
-
-  int ret = libyuv::I420Scale(
-      src_y, j_src_stride_y, src_u, j_src_stride_u, src_v, j_src_stride_v,
-      width, height, dst_y, dst_stride_y, dst_u, dst_stride_u, dst_v,
-      dst_stride_v, dstWidth, dstHeight, libyuv::kFilterBilinear);
-  if (ret) {
-    LOG(LS_ERROR) << "Error scaling I420 frame: " << ret;
-  }
-}
-
-extern "C" JNIEXPORT jobject JNICALL
-Java_org_webrtc_VideoFileRenderer_nativeCreateNativeByteBuffer(JNIEnv* jni,
-                                                               jclass,
-                                                               jint size) {
-  void* new_data = ::operator new(size);
-  jobject byte_buffer = jni->NewDirectByteBuffer(new_data, size);
-  return byte_buffer;
-}
-
-extern "C" JNIEXPORT void JNICALL
-Java_org_webrtc_VideoFileRenderer_nativeFreeNativeByteBuffer(
-    JNIEnv* jni,
-    jclass,
-    jobject byte_buffer) {
-  void* data = jni->GetDirectBufferAddress(byte_buffer);
-  ::operator delete(data);
-}
-
-}  // namespace jni
-}  // namespace webrtc
diff --git a/sdk/android/src/jni/videoframe_jni.cc b/sdk/android/src/jni/videoframe_jni.cc
deleted file mode 100644
index f6ba46f..0000000
--- a/sdk/android/src/jni/videoframe_jni.cc
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- *  Copyright 2017 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 <jni.h>
-
-#include "libyuv/scale.h"
-
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-namespace jni {
-
-extern "C" JNIEXPORT void JNICALL
-Java_org_webrtc_VideoFrame_nativeCropAndScaleI420(JNIEnv* jni,
-                                                  jclass,
-                                                  jobject j_src_y,
-                                                  jint src_stride_y,
-                                                  jobject j_src_u,
-                                                  jint src_stride_u,
-                                                  jobject j_src_v,
-                                                  jint src_stride_v,
-                                                  jint crop_x,
-                                                  jint crop_y,
-                                                  jint crop_width,
-                                                  jint crop_height,
-                                                  jobject j_dst_y,
-                                                  jint dst_stride_y,
-                                                  jobject j_dst_u,
-                                                  jint dst_stride_u,
-                                                  jobject j_dst_v,
-                                                  jint dst_stride_v,
-                                                  jint scale_width,
-                                                  jint scale_height) {
-  uint8_t const* src_y =
-      static_cast<uint8_t*>(jni->GetDirectBufferAddress(j_src_y));
-  uint8_t const* src_u =
-      static_cast<uint8_t*>(jni->GetDirectBufferAddress(j_src_u));
-  uint8_t const* src_v =
-      static_cast<uint8_t*>(jni->GetDirectBufferAddress(j_src_v));
-  uint8_t* dst_y = static_cast<uint8_t*>(jni->GetDirectBufferAddress(j_dst_y));
-  uint8_t* dst_u = static_cast<uint8_t*>(jni->GetDirectBufferAddress(j_dst_u));
-  uint8_t* dst_v = static_cast<uint8_t*>(jni->GetDirectBufferAddress(j_dst_v));
-
-  // Perform cropping using pointer arithmetic.
-  src_y += crop_x + crop_y * src_stride_y;
-  src_u += crop_x / 2 + crop_y / 2 * src_stride_u;
-  src_v += crop_x / 2 + crop_y / 2 * src_stride_v;
-
-  bool ret = libyuv::I420Scale(
-      src_y, src_stride_y, src_u, src_stride_u, src_v, src_stride_v, crop_width,
-      crop_height, dst_y, dst_stride_y, dst_u, dst_stride_u, dst_v,
-      dst_stride_v, scale_width, scale_height, libyuv::kFilterBox);
-  RTC_DCHECK_EQ(ret, 0) << "I420Scale failed";
-}
-
-}  // namespace jni
-}  // namespace webrtc
diff --git a/sdk/android/src/jni/videotrack_jni.cc b/sdk/android/src/jni/videotrack_jni.cc
deleted file mode 100644
index ed22c54..0000000
--- a/sdk/android/src/jni/videotrack_jni.cc
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- *  Copyright 2017 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 <jni.h>
-
-#include "webrtc/api/mediastreaminterface.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/sdk/android/src/jni/classreferenceholder.h"
-#include "webrtc/sdk/android/src/jni/jni_helpers.h"
-#include "webrtc/sdk/android/src/jni/native_handle_impl.h"
-
-namespace webrtc {
-namespace jni {
-
-namespace {
-
-class VideoSinkWrapper : public rtc::VideoSinkInterface<VideoFrame> {
- public:
-  VideoSinkWrapper(JNIEnv* jni, jobject j_sink);
-  ~VideoSinkWrapper() override {}
-
- private:
-  void OnFrame(const VideoFrame& frame) override;
-
-  jmethodID j_on_frame_method_;
-
-  const JavaVideoFrameFactory java_video_frame_factory_;
-  const ScopedGlobalRef<jobject> j_sink_;
-};
-
-VideoSinkWrapper::VideoSinkWrapper(JNIEnv* jni, jobject j_sink)
-    : java_video_frame_factory_(jni), j_sink_(jni, j_sink) {
-  jclass j_video_sink_class = FindClass(jni, "org/webrtc/VideoSink");
-  j_on_frame_method_ = jni->GetMethodID(j_video_sink_class, "onFrame",
-                                        "(Lorg/webrtc/VideoFrame;)V");
-}
-
-void VideoSinkWrapper::OnFrame(const VideoFrame& frame) {
-  JNIEnv* jni = AttachCurrentThreadIfNeeded();
-  ScopedLocalRefFrame local_ref_frame(jni);
-  jni->CallVoidMethod(*j_sink_, j_on_frame_method_,
-                      java_video_frame_factory_.ToJavaFrame(jni, frame));
-}
-
-}  // namespace
-
-extern "C" JNIEXPORT void JNICALL
-Java_org_webrtc_VideoTrack_nativeAddSink(JNIEnv* jni,
-                                         jclass,
-                                         jlong j_native_track,
-                                         jlong j_native_sink) {
-  reinterpret_cast<VideoTrackInterface*>(j_native_track)
-      ->AddOrUpdateSink(
-          reinterpret_cast<rtc::VideoSinkInterface<VideoFrame>*>(j_native_sink),
-          rtc::VideoSinkWants());
-}
-
-extern "C" JNIEXPORT void JNICALL
-Java_org_webrtc_VideoTrack_nativeRemoveSink(JNIEnv* jni,
-                                            jclass,
-                                            jlong j_native_track,
-                                            jlong j_native_sink) {
-  reinterpret_cast<VideoTrackInterface*>(j_native_track)
-      ->RemoveSink(reinterpret_cast<rtc::VideoSinkInterface<VideoFrame>*>(
-          j_native_sink));
-}
-
-extern "C" JNIEXPORT jlong JNICALL
-Java_org_webrtc_VideoTrack_nativeWrapSink(JNIEnv* jni, jclass, jobject sink) {
-  return jlongFromPointer(new VideoSinkWrapper(jni, sink));
-}
-
-extern "C" JNIEXPORT void JNICALL
-Java_org_webrtc_VideoTrack_nativeFreeSink(JNIEnv* jni,
-                                          jclass,
-                                          jlong j_native_sink) {
-  delete reinterpret_cast<rtc::VideoSinkInterface<VideoFrame>*>(j_native_sink);
-}
-
-}  // namespace jni
-}  // namespace webrtc
diff --git a/sdk/android/src/jni/wrapped_native_i420_buffer.cc b/sdk/android/src/jni/wrapped_native_i420_buffer.cc
deleted file mode 100644
index 1f26a83..0000000
--- a/sdk/android/src/jni/wrapped_native_i420_buffer.cc
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- *  Copyright (c) 2017 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/sdk/android/src/jni/wrapped_native_i420_buffer.h"
-
-#include "webrtc/sdk/android/src/jni/classreferenceholder.h"
-#include "webrtc/sdk/android/src/jni/jni_helpers.h"
-
-namespace webrtc {
-namespace jni {
-
-// TODO(magjed): Write a test for this function.
-jobject WrapI420Buffer(
-    JNIEnv* jni,
-    const rtc::scoped_refptr<I420BufferInterface>& i420_buffer) {
-  jclass j_wrapped_native_i420_buffer_class =
-      FindClass(jni, "org/webrtc/WrappedNativeI420Buffer");
-  jmethodID j_wrapped_native_i420_buffer_ctor_id =
-      GetMethodID(jni, j_wrapped_native_i420_buffer_class, "<init>",
-                  "(IILjava/nio/ByteBuffer;ILjava/nio/ByteBuffer;ILjava/nio/"
-                  "ByteBuffer;IJ)V");
-
-  jobject y_buffer =
-      jni->NewDirectByteBuffer(const_cast<uint8_t*>(i420_buffer->DataY()),
-                               i420_buffer->StrideY() * i420_buffer->height());
-  jobject u_buffer = jni->NewDirectByteBuffer(
-      const_cast<uint8_t*>(i420_buffer->DataU()),
-      i420_buffer->StrideU() * i420_buffer->ChromaHeight());
-  jobject v_buffer = jni->NewDirectByteBuffer(
-      const_cast<uint8_t*>(i420_buffer->DataV()),
-      i420_buffer->StrideV() * i420_buffer->ChromaHeight());
-
-  jobject j_wrapped_native_i420_buffer = jni->NewObject(
-      j_wrapped_native_i420_buffer_class, j_wrapped_native_i420_buffer_ctor_id,
-      i420_buffer->width(), i420_buffer->height(), y_buffer,
-      i420_buffer->StrideY(), u_buffer, i420_buffer->StrideU(), v_buffer,
-      i420_buffer->StrideV(), jlongFromPointer(i420_buffer.get()));
-  CHECK_EXCEPTION(jni);
-
-  return j_wrapped_native_i420_buffer;
-}
-
-}  // namespace jni
-}  // namespace webrtc
diff --git a/sdk/android/src/jni/wrapped_native_i420_buffer.h b/sdk/android/src/jni/wrapped_native_i420_buffer.h
deleted file mode 100644
index 0242877..0000000
--- a/sdk/android/src/jni/wrapped_native_i420_buffer.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- *  Copyright (c) 2017 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_SDK_ANDROID_SRC_JNI_WRAPPED_NATIVE_I420_BUFFER_H_
-#define WEBRTC_SDK_ANDROID_SRC_JNI_WRAPPED_NATIVE_I420_BUFFER_H_
-
-#include <jni.h>
-
-#include "webrtc/api/video/video_frame_buffer.h"
-
-namespace webrtc {
-namespace jni {
-
-// This function wraps the C++ I420 buffer and returns a Java
-// VideoFrame.I420Buffer as a jobject.
-jobject WrapI420Buffer(
-    JNIEnv* jni,
-    const rtc::scoped_refptr<I420BufferInterface>& i420_buffer);
-
-}  // namespace jni
-}  // namespace webrtc
-
-#endif  // WEBRTC_SDK_ANDROID_SRC_JNI_WRAPPED_NATIVE_I420_BUFFER_H_
diff --git a/sdk/android/tests/src/org/webrtc/CameraEnumerationTest.java b/sdk/android/tests/src/org/webrtc/CameraEnumerationTest.java
deleted file mode 100644
index 6047b55..0000000
--- a/sdk/android/tests/src/org/webrtc/CameraEnumerationTest.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- *  Copyright 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.
- */
-
-package org.webrtc;
-
-import static org.junit.Assert.assertEquals;
-import static org.webrtc.CameraEnumerationAndroid.getClosestSupportedFramerateRange;
-
-import java.util.Arrays;
-import org.chromium.testing.local.LocalRobolectricTestRunner;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.annotation.Config;
-import org.webrtc.CameraEnumerationAndroid.CaptureFormat.FramerateRange;
-
-/**
- * Tests for CameraEnumerationAndroid.
- */
-@RunWith(LocalRobolectricTestRunner.class)
-@Config(manifest = Config.NONE)
-public class CameraEnumerationTest {
-  @Test
-  public void testGetClosestSupportedFramerateRange() {
-    assertEquals(new FramerateRange(10000, 30000),
-        getClosestSupportedFramerateRange(
-            Arrays.asList(new FramerateRange(10000, 30000), new FramerateRange(30000, 30000)),
-            30 /* requestedFps */));
-
-    assertEquals(new FramerateRange(10000, 20000),
-        getClosestSupportedFramerateRange(
-            Arrays.asList(new FramerateRange(0, 30000), new FramerateRange(10000, 20000),
-                new FramerateRange(14000, 16000), new FramerateRange(15000, 15000)),
-            15 /* requestedFps */));
-
-    assertEquals(new FramerateRange(10000, 20000),
-        getClosestSupportedFramerateRange(
-            Arrays.asList(new FramerateRange(15000, 15000), new FramerateRange(10000, 20000),
-                new FramerateRange(10000, 30000)),
-            10 /* requestedFps */));
-  }
-}
diff --git a/sdk/objc/DEPS b/sdk/objc/DEPS
deleted file mode 100644
index eea7e4f..0000000
--- a/sdk/objc/DEPS
+++ /dev/null
@@ -1,18 +0,0 @@
-include_rules = [
-  "+WebRTC",
-  "+Common",
-  "+Video",
-  "+Audio",
-  "+UI",
-  "+PeerConnection",
-  "+VideoToolbox",
-  "+Metal",
-  "+webrtc/api",
-  "+webrtc/common_video/h264",
-  "+webrtc/common_video/include",
-  "+webrtc/common_video/libyuv/include",
-  "+webrtc/media",
-  "+webrtc/modules/video_coding",
-  "+webrtc/pc",
-  "+webrtc/system_wrappers",
-]
\ No newline at end of file
diff --git a/sdk/objc/Framework/Classes/Audio/RTCAudioSession+Configuration.mm b/sdk/objc/Framework/Classes/Audio/RTCAudioSession+Configuration.mm
deleted file mode 100644
index c4d0d0c..0000000
--- a/sdk/objc/Framework/Classes/Audio/RTCAudioSession+Configuration.mm
+++ /dev/null
@@ -1,172 +0,0 @@
- /*
- *  Copyright 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.
- */
-
-#import "WebRTC/RTCAudioSession.h"
-#import "WebRTC/RTCAudioSessionConfiguration.h"
-
-#import "WebRTC/RTCLogging.h"
-#import "RTCAudioSession+Private.h"
-
-
-@implementation RTCAudioSession (Configuration)
-
-- (BOOL)setConfiguration:(RTCAudioSessionConfiguration *)configuration
-                   error:(NSError **)outError {
-  return [self setConfiguration:configuration
-                         active:NO
-                shouldSetActive:NO
-                          error:outError];
-}
-
-- (BOOL)setConfiguration:(RTCAudioSessionConfiguration *)configuration
-                  active:(BOOL)active
-                   error:(NSError **)outError {
-  return [self setConfiguration:configuration
-                         active:active
-                shouldSetActive:YES
-                          error:outError];
-}
-
-#pragma mark - Private
-
-- (BOOL)setConfiguration:(RTCAudioSessionConfiguration *)configuration
-                  active:(BOOL)active
-         shouldSetActive:(BOOL)shouldSetActive
-                   error:(NSError **)outError {
-  NSParameterAssert(configuration);
-  if (outError) {
-    *outError = nil;
-  }
-  if (![self checkLock:outError]) {
-    return NO;
-  }
-
-  // Provide an error even if there isn't one so we can log it. We will not
-  // return immediately on error in this function and instead try to set
-  // everything we can.
-  NSError *error = nil;
-
-  if (self.category != configuration.category ||
-      self.categoryOptions != configuration.categoryOptions) {
-    NSError *categoryError = nil;
-    if (![self setCategory:configuration.category
-               withOptions:configuration.categoryOptions
-                     error:&categoryError]) {
-      RTCLogError(@"Failed to set category: %@",
-                  categoryError.localizedDescription);
-      error = categoryError;
-    } else {
-      RTCLog(@"Set category to: %@", configuration.category);
-    }
-  }
-
-  if (self.mode != configuration.mode) {
-    NSError *modeError = nil;
-    if (![self setMode:configuration.mode error:&modeError]) {
-      RTCLogError(@"Failed to set mode: %@",
-                  modeError.localizedDescription);
-      error = modeError;
-    } else {
-      RTCLog(@"Set mode to: %@", configuration.mode);
-    }
-  }
-
-  // Sometimes category options don't stick after setting mode.
-  if (self.categoryOptions != configuration.categoryOptions) {
-    NSError *categoryError = nil;
-    if (![self setCategory:configuration.category
-               withOptions:configuration.categoryOptions
-                     error:&categoryError]) {
-      RTCLogError(@"Failed to set category options: %@",
-                  categoryError.localizedDescription);
-      error = categoryError;
-    } else {
-      RTCLog(@"Set category options to: %ld",
-             (long)configuration.categoryOptions);
-    }
-  }
-
-  if (self.preferredSampleRate != configuration.sampleRate) {
-    NSError *sampleRateError = nil;
-    if (![self setPreferredSampleRate:configuration.sampleRate
-                                error:&sampleRateError]) {
-      RTCLogError(@"Failed to set preferred sample rate: %@",
-                  sampleRateError.localizedDescription);
-      error = sampleRateError;
-    } else {
-      RTCLog(@"Set preferred sample rate to: %.2f",
-             configuration.sampleRate);
-    }
-  }
-
-  if (self.preferredIOBufferDuration != configuration.ioBufferDuration) {
-    NSError *bufferDurationError = nil;
-    if (![self setPreferredIOBufferDuration:configuration.ioBufferDuration
-                                      error:&bufferDurationError]) {
-      RTCLogError(@"Failed to set preferred IO buffer duration: %@",
-                  bufferDurationError.localizedDescription);
-      error = bufferDurationError;
-    } else {
-      RTCLog(@"Set preferred IO buffer duration to: %f",
-             configuration.ioBufferDuration);
-    }
-  }
-
-  if (shouldSetActive) {
-    NSError *activeError = nil;
-    if (![self setActive:active error:&activeError]) {
-      RTCLogError(@"Failed to setActive to %d: %@",
-                  active, activeError.localizedDescription);
-      error = activeError;
-    }
-  }
-
-  if (self.isActive &&
-      // TODO(tkchin): Figure out which category/mode numChannels is valid for.
-      [self.mode isEqualToString:AVAudioSessionModeVoiceChat]) {
-    // Try to set the preferred number of hardware audio channels. These calls
-    // must be done after setting the audio session’s category and mode and
-    // activating the session.
-    NSInteger inputNumberOfChannels = configuration.inputNumberOfChannels;
-    if (self.inputNumberOfChannels != inputNumberOfChannels) {
-      NSError *inputChannelsError = nil;
-      if (![self setPreferredInputNumberOfChannels:inputNumberOfChannels
-                                             error:&inputChannelsError]) {
-       RTCLogError(@"Failed to set preferred input number of channels: %@",
-                   inputChannelsError.localizedDescription);
-       error = inputChannelsError;
-      } else {
-        RTCLog(@"Set input number of channels to: %ld",
-               (long)inputNumberOfChannels);
-      }
-    }
-    NSInteger outputNumberOfChannels = configuration.outputNumberOfChannels;
-    if (self.outputNumberOfChannels != outputNumberOfChannels) {
-      NSError *outputChannelsError = nil;
-      if (![self setPreferredOutputNumberOfChannels:outputNumberOfChannels
-                                              error:&outputChannelsError]) {
-        RTCLogError(@"Failed to set preferred output number of channels: %@",
-                    outputChannelsError.localizedDescription);
-        error = outputChannelsError;
-      } else {
-        RTCLog(@"Set output number of channels to: %ld",
-               (long)outputNumberOfChannels);
-      }
-    }
-  }
-
-  if (outError) {
-    *outError = error;
-  }
-
-  return error == nil;
-}
-
-@end
diff --git a/sdk/objc/Framework/Classes/Audio/RTCAudioSession+Private.h b/sdk/objc/Framework/Classes/Audio/RTCAudioSession+Private.h
deleted file mode 100644
index 4c27270..0000000
--- a/sdk/objc/Framework/Classes/Audio/RTCAudioSession+Private.h
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- *  Copyright 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.
- */
-
-#import "webrtc/sdk/objc/Framework/Headers/WebRTC/RTCAudioSession.h"
-
-#include <vector>
-
-NS_ASSUME_NONNULL_BEGIN
-
-@class RTCAudioSessionConfiguration;
-
-@interface RTCAudioSession ()
-
-/** Number of times setActive:YES has succeeded without a balanced call to
- *  setActive:NO.
- */
-@property(nonatomic, readonly) int activationCount;
-
-/** The number of times |beginWebRTCSession| was called without a balanced call
- *  to |endWebRTCSession|.
- */
-@property(nonatomic, readonly) int webRTCSessionCount;
-
-/** Convenience BOOL that checks useManualAudio and isAudioEnebled. */
-@property(readonly) BOOL canPlayOrRecord;
-
-/** Tracks whether we have been sent an interruption event that hasn't been matched by either an
- *  interrupted end event or a foreground event.
- */
-@property(nonatomic, assign) BOOL isInterrupted;
-
-- (BOOL)checkLock:(NSError **)outError;
-
-/** Adds the delegate to the list of delegates, and places it at the front of
- *  the list. This delegate will be notified before other delegates of
- *  audio events.
- */
-- (void)pushDelegate:(id<RTCAudioSessionDelegate>)delegate;
-
-/** Signals RTCAudioSession that a WebRTC session is about to begin and
- *  audio configuration is needed. Will configure the audio session for WebRTC
- *  if not already configured and if configuration is not delayed.
- *  Successful calls must be balanced by a call to endWebRTCSession.
- */
-- (BOOL)beginWebRTCSession:(NSError **)outError;
-
-/** Signals RTCAudioSession that a WebRTC session is about to end and audio
- *  unconfiguration is needed. Will unconfigure the audio session for WebRTC
- *  if this is the last unmatched call and if configuration is not delayed.
- */
-- (BOOL)endWebRTCSession:(NSError **)outError;
-
-/** Configure the audio session for WebRTC. This call will fail if the session
- *  is already configured. On other failures, we will attempt to restore the
- *  previously used audio session configuration.
- *  |lockForConfiguration| must be called first.
- *  Successful calls to configureWebRTCSession must be matched by calls to
- *  |unconfigureWebRTCSession|.
- */
-- (BOOL)configureWebRTCSession:(NSError **)outError;
-
-/** Unconfigures the session for WebRTC. This will attempt to restore the
- *  audio session to the settings used before |configureWebRTCSession| was
- *  called.
- *  |lockForConfiguration| must be called first.
- */
-- (BOOL)unconfigureWebRTCSession:(NSError **)outError;
-
-/** Returns a configuration error with the given description. */
-- (NSError *)configurationErrorWithDescription:(NSString *)description;
-
-// Properties and methods for tests.
-@property(nonatomic, readonly)
-    std::vector<__weak id<RTCAudioSessionDelegate> > delegates;
-
-- (void)notifyDidBeginInterruption;
-- (void)notifyDidEndInterruptionWithShouldResumeSession:
-    (BOOL)shouldResumeSession;
-- (void)notifyDidChangeRouteWithReason:(AVAudioSessionRouteChangeReason)reason
-    previousRoute:(AVAudioSessionRouteDescription *)previousRoute;
-- (void)notifyMediaServicesWereLost;
-- (void)notifyMediaServicesWereReset;
-- (void)notifyDidChangeCanPlayOrRecord:(BOOL)canPlayOrRecord;
-- (void)notifyDidStartPlayOrRecord;
-- (void)notifyDidStopPlayOrRecord;
-- (void)notifyDidDetectPlayoutGlitch:(int64_t)totalNumberOfGlitches;
-
-@end
-
-NS_ASSUME_NONNULL_END
diff --git a/sdk/objc/Framework/Classes/Audio/RTCAudioSession.mm b/sdk/objc/Framework/Classes/Audio/RTCAudioSession.mm
deleted file mode 100644
index 906f627..0000000
--- a/sdk/objc/Framework/Classes/Audio/RTCAudioSession.mm
+++ /dev/null
@@ -1,925 +0,0 @@
-/*
- *  Copyright 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.
- */
-
-#import "WebRTC/RTCAudioSession.h"
-
-#import <UIKit/UIKit.h>
-
-#include "webrtc/rtc_base/atomicops.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/criticalsection.h"
-
-#import "WebRTC/RTCAudioSessionConfiguration.h"
-#import "WebRTC/RTCLogging.h"
-
-#import "RTCAudioSession+Private.h"
-
-
-NSString * const kRTCAudioSessionErrorDomain = @"org.webrtc.RTCAudioSession";
-NSInteger const kRTCAudioSessionErrorLockRequired = -1;
-NSInteger const kRTCAudioSessionErrorConfiguration = -2;
-NSString * const kRTCAudioSessionOutputVolumeSelector = @"outputVolume";
-
-// This class needs to be thread-safe because it is accessed from many threads.
-// TODO(tkchin): Consider more granular locking. We're not expecting a lot of
-// lock contention so coarse locks should be fine for now.
-@implementation RTCAudioSession {
-  rtc::CriticalSection _crit;
-  AVAudioSession *_session;
-  volatile int _activationCount;
-  volatile int _lockRecursionCount;
-  volatile int _webRTCSessionCount;
-  BOOL _isActive;
-  BOOL _useManualAudio;
-  BOOL _isAudioEnabled;
-  BOOL _canPlayOrRecord;
-  BOOL _isInterrupted;
-}
-
-@synthesize session = _session;
-@synthesize delegates = _delegates;
-
-+ (instancetype)sharedInstance {
-  static dispatch_once_t onceToken;
-  static RTCAudioSession *sharedInstance = nil;
-  dispatch_once(&onceToken, ^{
-    sharedInstance = [[self alloc] init];
-  });
-  return sharedInstance;
-}
-
-- (instancetype)init {
-  if (self = [super init]) {
-    _session = [AVAudioSession sharedInstance];
-
-    NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
-    [center addObserver:self
-               selector:@selector(handleInterruptionNotification:)
-                   name:AVAudioSessionInterruptionNotification
-                 object:nil];
-    [center addObserver:self
-               selector:@selector(handleRouteChangeNotification:)
-                   name:AVAudioSessionRouteChangeNotification
-                 object:nil];
-    [center addObserver:self
-               selector:@selector(handleMediaServicesWereLost:)
-                   name:AVAudioSessionMediaServicesWereLostNotification
-                 object:nil];
-    [center addObserver:self
-               selector:@selector(handleMediaServicesWereReset:)
-                   name:AVAudioSessionMediaServicesWereResetNotification
-                 object:nil];
-    // Posted on the main thread when the primary audio from other applications
-    // starts and stops. Foreground applications may use this notification as a
-    // hint to enable or disable audio that is secondary.
-    [center addObserver:self
-               selector:@selector(handleSilenceSecondaryAudioHintNotification:)
-                   name:AVAudioSessionSilenceSecondaryAudioHintNotification
-                 object:nil];
-    // Also track foreground event in order to deal with interruption ended situation.
-    [center addObserver:self
-               selector:@selector(handleApplicationDidBecomeActive:)
-                   name:UIApplicationDidBecomeActiveNotification
-                 object:nil];
-    [_session addObserver:self
-               forKeyPath:kRTCAudioSessionOutputVolumeSelector
-                  options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld
-                  context:nil];
-
-    RTCLog(@"RTCAudioSession (%p): init.", self);
-  }
-  return self;
-}
-
-- (void)dealloc {
-  [[NSNotificationCenter defaultCenter] removeObserver:self];
-  [_session removeObserver:self forKeyPath:kRTCAudioSessionOutputVolumeSelector context:nil];
-  RTCLog(@"RTCAudioSession (%p): dealloc.", self);
-}
-
-- (NSString *)description {
-  NSString *format =
-      @"RTCAudioSession: {\n"
-       "  category: %@\n"
-       "  categoryOptions: %ld\n"
-       "  mode: %@\n"
-       "  isActive: %d\n"
-       "  sampleRate: %.2f\n"
-       "  IOBufferDuration: %f\n"
-       "  outputNumberOfChannels: %ld\n"
-       "  inputNumberOfChannels: %ld\n"
-       "  outputLatency: %f\n"
-       "  inputLatency: %f\n"
-       "  outputVolume: %f\n"
-       "}";
-  NSString *description = [NSString stringWithFormat:format,
-      self.category, (long)self.categoryOptions, self.mode,
-      self.isActive, self.sampleRate, self.IOBufferDuration,
-      self.outputNumberOfChannels, self.inputNumberOfChannels,
-      self.outputLatency, self.inputLatency, self.outputVolume];
-  return description;
-}
-
-- (void)setIsActive:(BOOL)isActive {
-  @synchronized(self) {
-    _isActive = isActive;
-  }
-}
-
-- (BOOL)isActive {
-  @synchronized(self) {
-    return _isActive;
-  }
-}
-
-- (BOOL)isLocked {
-  return _lockRecursionCount > 0;
-}
-
-- (void)setUseManualAudio:(BOOL)useManualAudio {
-  @synchronized(self) {
-    if (_useManualAudio == useManualAudio) {
-      return;
-    }
-    _useManualAudio = useManualAudio;
-  }
-  [self updateCanPlayOrRecord];
-}
-
-- (BOOL)useManualAudio {
-  @synchronized(self) {
-    return _useManualAudio;
-  }
-}
-
-- (void)setIsAudioEnabled:(BOOL)isAudioEnabled {
-  @synchronized(self) {
-    if (_isAudioEnabled == isAudioEnabled) {
-      return;
-    }
-    _isAudioEnabled = isAudioEnabled;
-  }
-  [self updateCanPlayOrRecord];
-}
-
-- (BOOL)isAudioEnabled {
-  @synchronized(self) {
-    return _isAudioEnabled;
-  }
-}
-
-// TODO(tkchin): Check for duplicates.
-- (void)addDelegate:(id<RTCAudioSessionDelegate>)delegate {
-  RTCLog(@"Adding delegate: (%p)", delegate);
-  if (!delegate) {
-    return;
-  }
-  @synchronized(self) {
-    _delegates.push_back(delegate);
-    [self removeZeroedDelegates];
-  }
-}
-
-- (void)removeDelegate:(id<RTCAudioSessionDelegate>)delegate {
-  RTCLog(@"Removing delegate: (%p)", delegate);
-  if (!delegate) {
-    return;
-  }
-  @synchronized(self) {
-    _delegates.erase(std::remove(_delegates.begin(),
-                                 _delegates.end(),
-                                 delegate),
-                     _delegates.end());
-    [self removeZeroedDelegates];
-  }
-}
-
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wthread-safety-analysis"
-
-- (void)lockForConfiguration {
-  _crit.Enter();
-  rtc::AtomicOps::Increment(&_lockRecursionCount);
-}
-
-- (void)unlockForConfiguration {
-  // Don't let threads other than the one that called lockForConfiguration
-  // unlock.
-  if (_crit.TryEnter()) {
-    rtc::AtomicOps::Decrement(&_lockRecursionCount);
-    // One unlock for the tryLock, and another one to actually unlock. If this
-    // was called without anyone calling lock, we will hit an assertion.
-    _crit.Leave();
-    _crit.Leave();
-  }
-}
-
-#pragma clang diagnostic pop
-
-#pragma mark - AVAudioSession proxy methods
-
-- (NSString *)category {
-  return self.session.category;
-}
-
-- (AVAudioSessionCategoryOptions)categoryOptions {
-  return self.session.categoryOptions;
-}
-
-- (NSString *)mode {
-  return self.session.mode;
-}
-
-- (BOOL)secondaryAudioShouldBeSilencedHint {
-  return self.session.secondaryAudioShouldBeSilencedHint;
-}
-
-- (AVAudioSessionRouteDescription *)currentRoute {
-  return self.session.currentRoute;
-}
-
-- (NSInteger)maximumInputNumberOfChannels {
-  return self.session.maximumInputNumberOfChannels;
-}
-
-- (NSInteger)maximumOutputNumberOfChannels {
-  return self.session.maximumOutputNumberOfChannels;
-}
-
-- (float)inputGain {
-  return self.session.inputGain;
-}
-
-- (BOOL)inputGainSettable {
-  return self.session.inputGainSettable;
-}
-
-- (BOOL)inputAvailable {
-  return self.session.inputAvailable;
-}
-
-- (NSArray<AVAudioSessionDataSourceDescription *> *)inputDataSources {
-  return self.session.inputDataSources;
-}
-
-- (AVAudioSessionDataSourceDescription *)inputDataSource {
-  return self.session.inputDataSource;
-}
-
-- (NSArray<AVAudioSessionDataSourceDescription *> *)outputDataSources {
-  return self.session.outputDataSources;
-}
-
-- (AVAudioSessionDataSourceDescription *)outputDataSource {
-  return self.session.outputDataSource;
-}
-
-- (double)sampleRate {
-  return self.session.sampleRate;
-}
-
-- (double)preferredSampleRate {
-  return self.session.preferredSampleRate;
-}
-
-- (NSInteger)inputNumberOfChannels {
-  return self.session.inputNumberOfChannels;
-}
-
-- (NSInteger)outputNumberOfChannels {
-  return self.session.outputNumberOfChannels;
-}
-
-- (float)outputVolume {
-  return self.session.outputVolume;
-}
-
-- (NSTimeInterval)inputLatency {
-  return self.session.inputLatency;
-}
-
-- (NSTimeInterval)outputLatency {
-  return self.session.outputLatency;
-}
-
-- (NSTimeInterval)IOBufferDuration {
-  return self.session.IOBufferDuration;
-}
-
-- (NSTimeInterval)preferredIOBufferDuration {
-  return self.session.preferredIOBufferDuration;
-}
-
-// TODO(tkchin): Simplify the amount of locking happening here. Likely that we
-// can just do atomic increments / decrements.
-- (BOOL)setActive:(BOOL)active
-            error:(NSError **)outError {
-  if (![self checkLock:outError]) {
-    return NO;
-  }
-  int activationCount = _activationCount;
-  if (!active && activationCount == 0) {
-    RTCLogWarning(@"Attempting to deactivate without prior activation.");
-  }
-  BOOL success = YES;
-  BOOL isActive = self.isActive;
-  // Keep a local error so we can log it.
-  NSError *error = nil;
-  BOOL shouldSetActive =
-      (active && !isActive) || (!active && isActive && activationCount == 1);
-  // Attempt to activate if we're not active.
-  // Attempt to deactivate if we're active and it's the last unbalanced call.
-  if (shouldSetActive) {
-    AVAudioSession *session = self.session;
-    // AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation is used to ensure
-    // that other audio sessions that were interrupted by our session can return
-    // to their active state. It is recommended for VoIP apps to use this
-    // option.
-    AVAudioSessionSetActiveOptions options =
-        active ? 0 : AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation;
-    success = [session setActive:active
-                     withOptions:options
-                           error:&error];
-    if (outError) {
-      *outError = error;
-    }
-  }
-  if (success) {
-    if (shouldSetActive) {
-      self.isActive = active;
-    }
-    if (active) {
-      [self incrementActivationCount];
-    }
-  } else {
-    RTCLogError(@"Failed to setActive:%d. Error: %@",
-                active, error.localizedDescription);
-  }
-  // Decrement activation count on deactivation whether or not it succeeded.
-  if (!active) {
-    [self decrementActivationCount];
-  }
-  RTCLog(@"Number of current activations: %d", _activationCount);
-  return success;
-}
-
-- (BOOL)setCategory:(NSString *)category
-        withOptions:(AVAudioSessionCategoryOptions)options
-              error:(NSError **)outError {
-  if (![self checkLock:outError]) {
-    return NO;
-  }
-  return [self.session setCategory:category withOptions:options error:outError];
-}
-
-- (BOOL)setMode:(NSString *)mode error:(NSError **)outError {
-  if (![self checkLock:outError]) {
-    return NO;
-  }
-  return [self.session setMode:mode error:outError];
-}
-
-- (BOOL)setInputGain:(float)gain error:(NSError **)outError {
-  if (![self checkLock:outError]) {
-    return NO;
-  }
-  return [self.session setInputGain:gain error:outError];
-}
-
-- (BOOL)setPreferredSampleRate:(double)sampleRate error:(NSError **)outError {
-  if (![self checkLock:outError]) {
-    return NO;
-  }
-  return [self.session setPreferredSampleRate:sampleRate error:outError];
-}
-
-- (BOOL)setPreferredIOBufferDuration:(NSTimeInterval)duration
-                               error:(NSError **)outError {
-  if (![self checkLock:outError]) {
-    return NO;
-  }
-  return [self.session setPreferredIOBufferDuration:duration error:outError];
-}
-
-- (BOOL)setPreferredInputNumberOfChannels:(NSInteger)count
-                                    error:(NSError **)outError {
-  if (![self checkLock:outError]) {
-    return NO;
-  }
-  return [self.session setPreferredInputNumberOfChannels:count error:outError];
-}
-- (BOOL)setPreferredOutputNumberOfChannels:(NSInteger)count
-                                     error:(NSError **)outError {
-  if (![self checkLock:outError]) {
-    return NO;
-  }
-  return [self.session setPreferredOutputNumberOfChannels:count error:outError];
-}
-
-- (BOOL)overrideOutputAudioPort:(AVAudioSessionPortOverride)portOverride
-                          error:(NSError **)outError {
-  if (![self checkLock:outError]) {
-    return NO;
-  }
-  return [self.session overrideOutputAudioPort:portOverride error:outError];
-}
-
-- (BOOL)setPreferredInput:(AVAudioSessionPortDescription *)inPort
-                    error:(NSError **)outError {
-  if (![self checkLock:outError]) {
-    return NO;
-  }
-  return [self.session setPreferredInput:inPort error:outError];
-}
-
-- (BOOL)setInputDataSource:(AVAudioSessionDataSourceDescription *)dataSource
-                     error:(NSError **)outError {
-  if (![self checkLock:outError]) {
-    return NO;
-  }
-  return [self.session setInputDataSource:dataSource error:outError];
-}
-
-- (BOOL)setOutputDataSource:(AVAudioSessionDataSourceDescription *)dataSource
-                      error:(NSError **)outError {
-  if (![self checkLock:outError]) {
-    return NO;
-  }
-  return [self.session setOutputDataSource:dataSource error:outError];
-}
-
-#pragma mark - Notifications
-
-- (void)handleInterruptionNotification:(NSNotification *)notification {
-  NSNumber* typeNumber =
-      notification.userInfo[AVAudioSessionInterruptionTypeKey];
-  AVAudioSessionInterruptionType type =
-      (AVAudioSessionInterruptionType)typeNumber.unsignedIntegerValue;
-  switch (type) {
-    case AVAudioSessionInterruptionTypeBegan:
-      RTCLog(@"Audio session interruption began.");
-      self.isActive = NO;
-      self.isInterrupted = YES;
-      [self notifyDidBeginInterruption];
-      break;
-    case AVAudioSessionInterruptionTypeEnded: {
-      RTCLog(@"Audio session interruption ended.");
-      self.isInterrupted = NO;
-      [self updateAudioSessionAfterEvent];
-      NSNumber *optionsNumber =
-          notification.userInfo[AVAudioSessionInterruptionOptionKey];
-      AVAudioSessionInterruptionOptions options =
-          optionsNumber.unsignedIntegerValue;
-      BOOL shouldResume =
-          options & AVAudioSessionInterruptionOptionShouldResume;
-      [self notifyDidEndInterruptionWithShouldResumeSession:shouldResume];
-      break;
-    }
-  }
-}
-
-- (void)handleRouteChangeNotification:(NSNotification *)notification {
-  // Get reason for current route change.
-  NSNumber* reasonNumber =
-      notification.userInfo[AVAudioSessionRouteChangeReasonKey];
-  AVAudioSessionRouteChangeReason reason =
-      (AVAudioSessionRouteChangeReason)reasonNumber.unsignedIntegerValue;
-  RTCLog(@"Audio route changed:");
-  switch (reason) {
-    case AVAudioSessionRouteChangeReasonUnknown:
-      RTCLog(@"Audio route changed: ReasonUnknown");
-      break;
-    case AVAudioSessionRouteChangeReasonNewDeviceAvailable:
-      RTCLog(@"Audio route changed: NewDeviceAvailable");
-      break;
-    case AVAudioSessionRouteChangeReasonOldDeviceUnavailable:
-      RTCLog(@"Audio route changed: OldDeviceUnavailable");
-      break;
-    case AVAudioSessionRouteChangeReasonCategoryChange:
-      RTCLog(@"Audio route changed: CategoryChange to :%@",
-             self.session.category);
-      break;
-    case AVAudioSessionRouteChangeReasonOverride:
-      RTCLog(@"Audio route changed: Override");
-      break;
-    case AVAudioSessionRouteChangeReasonWakeFromSleep:
-      RTCLog(@"Audio route changed: WakeFromSleep");
-      break;
-    case AVAudioSessionRouteChangeReasonNoSuitableRouteForCategory:
-      RTCLog(@"Audio route changed: NoSuitableRouteForCategory");
-      break;
-    case AVAudioSessionRouteChangeReasonRouteConfigurationChange:
-      RTCLog(@"Audio route changed: RouteConfigurationChange");
-      break;
-  }
-  AVAudioSessionRouteDescription* previousRoute =
-      notification.userInfo[AVAudioSessionRouteChangePreviousRouteKey];
-  // Log previous route configuration.
-  RTCLog(@"Previous route: %@\nCurrent route:%@",
-         previousRoute, self.session.currentRoute);
-  [self notifyDidChangeRouteWithReason:reason previousRoute:previousRoute];
-}
-
-- (void)handleMediaServicesWereLost:(NSNotification *)notification {
-  RTCLog(@"Media services were lost.");
-  [self updateAudioSessionAfterEvent];
-  [self notifyMediaServicesWereLost];
-}
-
-- (void)handleMediaServicesWereReset:(NSNotification *)notification {
-  RTCLog(@"Media services were reset.");
-  [self updateAudioSessionAfterEvent];
-  [self notifyMediaServicesWereReset];
-}
-
-- (void)handleSilenceSecondaryAudioHintNotification:(NSNotification *)notification {
-  // TODO(henrika): just adding logs here for now until we know if we are ever
-  // see this notification and might be affected by it or if further actions
-  // are required.
-  NSNumber *typeNumber =
-      notification.userInfo[AVAudioSessionSilenceSecondaryAudioHintTypeKey];
-  AVAudioSessionSilenceSecondaryAudioHintType type =
-      (AVAudioSessionSilenceSecondaryAudioHintType)typeNumber.unsignedIntegerValue;
-  switch (type) {
-    case AVAudioSessionSilenceSecondaryAudioHintTypeBegin:
-      RTCLog(@"Another application's primary audio has started.");
-      break;
-    case AVAudioSessionSilenceSecondaryAudioHintTypeEnd:
-      RTCLog(@"Another application's primary audio has stopped.");
-      break;
-  }
-}
-
-- (void)handleApplicationDidBecomeActive:(NSNotification *)notification {
-  RTCLog(@"Application became active after an interruption. Treating as interruption "
-         " end. isInterrupted changed from %d to 0.", self.isInterrupted);
-  if (self.isInterrupted) {
-    self.isInterrupted = NO;
-    [self updateAudioSessionAfterEvent];
-  }
-  // Always treat application becoming active as an interruption end event.
-  [self notifyDidEndInterruptionWithShouldResumeSession:YES];
-}
-
-#pragma mark - Private
-
-+ (NSError *)lockError {
-  NSDictionary *userInfo = @{
-    NSLocalizedDescriptionKey:
-        @"Must call lockForConfiguration before calling this method."
-  };
-  NSError *error =
-      [[NSError alloc] initWithDomain:kRTCAudioSessionErrorDomain
-                                 code:kRTCAudioSessionErrorLockRequired
-                             userInfo:userInfo];
-  return error;
-}
-
-- (std::vector<__weak id<RTCAudioSessionDelegate> >)delegates {
-  @synchronized(self) {
-    // Note: this returns a copy.
-    return _delegates;
-  }
-}
-
-// TODO(tkchin): check for duplicates.
-- (void)pushDelegate:(id<RTCAudioSessionDelegate>)delegate {
-  @synchronized(self) {
-    _delegates.insert(_delegates.begin(), delegate);
-  }
-}
-
-- (void)removeZeroedDelegates {
-  @synchronized(self) {
-    _delegates.erase(
-        std::remove_if(_delegates.begin(),
-                       _delegates.end(),
-                       [](id delegate) -> bool { return delegate == nil; }),
-        _delegates.end());
-  }
-}
-
-- (int)activationCount {
-  return _activationCount;
-}
-
-- (int)incrementActivationCount {
-  RTCLog(@"Incrementing activation count.");
-  return rtc::AtomicOps::Increment(&_activationCount);
-}
-
-- (NSInteger)decrementActivationCount {
-  RTCLog(@"Decrementing activation count.");
-  return rtc::AtomicOps::Decrement(&_activationCount);
-}
-
-- (int)webRTCSessionCount {
-  return _webRTCSessionCount;
-}
-
-- (BOOL)canPlayOrRecord {
-  return !self.useManualAudio || self.isAudioEnabled;
-}
-
-- (BOOL)isInterrupted {
-  @synchronized(self) {
-    return _isInterrupted;
-  }
-}
-
-- (void)setIsInterrupted:(BOOL)isInterrupted {
-  @synchronized(self) {
-    if (_isInterrupted == isInterrupted) {
-      return;
-   }
-   _isInterrupted = isInterrupted;
-  }
-}
-
-- (BOOL)checkLock:(NSError **)outError {
-  // Check ivar instead of trying to acquire lock so that we won't accidentally
-  // acquire lock if it hasn't already been called.
-  if (!self.isLocked) {
-    if (outError) {
-      *outError = [RTCAudioSession lockError];
-    }
-    return NO;
-  }
-  return YES;
-}
-
-- (BOOL)beginWebRTCSession:(NSError **)outError {
-  if (outError) {
-    *outError = nil;
-  }
-  if (![self checkLock:outError]) {
-    return NO;
-  }
-  rtc::AtomicOps::Increment(&_webRTCSessionCount);
-  [self notifyDidStartPlayOrRecord];
-  return YES;
-}
-
-- (BOOL)endWebRTCSession:(NSError **)outError {
-  if (outError) {
-    *outError = nil;
-  }
-  if (![self checkLock:outError]) {
-    return NO;
-  }
-  rtc::AtomicOps::Decrement(&_webRTCSessionCount);
-  [self notifyDidStopPlayOrRecord];
-  return YES;
-}
-
-- (BOOL)configureWebRTCSession:(NSError **)outError {
-  if (outError) {
-    *outError = nil;
-  }
-  if (![self checkLock:outError]) {
-    return NO;
-  }
-  RTCLog(@"Configuring audio session for WebRTC.");
-
-  // Configure the AVAudioSession and activate it.
-  // Provide an error even if there isn't one so we can log it.
-  NSError *error = nil;
-  RTCAudioSessionConfiguration *webRTCConfig =
-      [RTCAudioSessionConfiguration webRTCConfiguration];
-  if (![self setConfiguration:webRTCConfig active:YES error:&error]) {
-    RTCLogError(@"Failed to set WebRTC audio configuration: %@",
-                error.localizedDescription);
-    // Do not call setActive:NO if setActive:YES failed.
-    if (outError) {
-      *outError = error;
-    }
-    return NO;
-  }
-
-  // Ensure that the device currently supports audio input.
-  // TODO(tkchin): Figure out if this is really necessary.
-  if (!self.inputAvailable) {
-    RTCLogError(@"No audio input path is available!");
-    [self unconfigureWebRTCSession:nil];
-    if (outError) {
-      *outError = [self configurationErrorWithDescription:@"No input path."];
-    }
-    return NO;
-  }
-
-  // It can happen (e.g. in combination with BT devices) that the attempt to set
-  // the preferred sample rate for WebRTC (48kHz) fails. If so, make a new
-  // configuration attempt using the sample rate that worked using the active
-  // audio session. A typical case is that only 8 or 16kHz can be set, e.g. in
-  // combination with BT headsets. Using this "trick" seems to avoid a state
-  // where Core Audio asks for a different number of audio frames than what the
-  // session's I/O buffer duration corresponds to.
-  // TODO(henrika): this fix resolves bugs.webrtc.org/6004 but it has only been
-  // tested on a limited set of iOS devices and BT devices.
-  double sessionSampleRate = self.sampleRate;
-  double preferredSampleRate = webRTCConfig.sampleRate;
-  if (sessionSampleRate != preferredSampleRate) {
-    RTCLogWarning(
-        @"Current sample rate (%.2f) is not the preferred rate (%.2f)",
-        sessionSampleRate, preferredSampleRate);
-    if (![self setPreferredSampleRate:sessionSampleRate
-                                error:&error]) {
-      RTCLogError(@"Failed to set preferred sample rate: %@",
-                  error.localizedDescription);
-      if (outError) {
-        *outError = error;
-      }
-    }
-  }
-
-  return YES;
-}
-
-- (BOOL)unconfigureWebRTCSession:(NSError **)outError {
-  if (outError) {
-    *outError = nil;
-  }
-  if (![self checkLock:outError]) {
-    return NO;
-  }
-  RTCLog(@"Unconfiguring audio session for WebRTC.");
-  [self setActive:NO error:outError];
-
-  return YES;
-}
-
-- (NSError *)configurationErrorWithDescription:(NSString *)description {
-  NSDictionary* userInfo = @{
-    NSLocalizedDescriptionKey: description,
-  };
-  return [[NSError alloc] initWithDomain:kRTCAudioSessionErrorDomain
-                                    code:kRTCAudioSessionErrorConfiguration
-                                userInfo:userInfo];
-}
-
-- (void)updateAudioSessionAfterEvent {
-  BOOL shouldActivate = self.activationCount > 0;
-  AVAudioSessionSetActiveOptions options = shouldActivate ?
-      0 : AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation;
-  NSError *error = nil;
-  if ([self.session setActive:shouldActivate
-                  withOptions:options
-                        error:&error]) {
-    self.isActive = shouldActivate;
-  } else {
-    RTCLogError(@"Failed to set session active to %d. Error:%@",
-                shouldActivate, error.localizedDescription);
-  }
-}
-
-- (void)updateCanPlayOrRecord {
-  BOOL canPlayOrRecord = NO;
-  BOOL shouldNotify = NO;
-  @synchronized(self) {
-    canPlayOrRecord = !self.useManualAudio || self.isAudioEnabled;
-    if (_canPlayOrRecord == canPlayOrRecord) {
-      return;
-    }
-    _canPlayOrRecord = canPlayOrRecord;
-    shouldNotify = YES;
-  }
-  if (shouldNotify) {
-    [self notifyDidChangeCanPlayOrRecord:canPlayOrRecord];
-  }
-}
-
-- (void)audioSessionDidActivate:(AVAudioSession *)session {
-  if (_session != session) {
-    RTCLogError(@"audioSessionDidActivate called on different AVAudioSession");
-  }
-  [self incrementActivationCount];
-  self.isActive = YES;
-}
-
-- (void)audioSessionDidDeactivate:(AVAudioSession *)session {
-  if (_session != session) {
-    RTCLogError(@"audioSessionDidDeactivate called on different AVAudioSession");
-  }
-  self.isActive = NO;
-  [self decrementActivationCount];
-}
-
-- (void)observeValueForKeyPath:(NSString *)keyPath
-                      ofObject:(id)object
-                        change:(NSDictionary *)change
-                       context:(void *)context {
-  if (object == _session) {
-    NSNumber *newVolume = change[NSKeyValueChangeNewKey];
-    RTCLog(@"OutputVolumeDidChange to %f", newVolume.floatValue);
-    [self notifyDidChangeOutputVolume:newVolume.floatValue];
-  } else {
-    [super observeValueForKeyPath:keyPath
-                         ofObject:object
-                           change:change
-                          context:context];
-  }
-}
-
-- (void)notifyDidBeginInterruption {
-  for (auto delegate : self.delegates) {
-    SEL sel = @selector(audioSessionDidBeginInterruption:);
-    if ([delegate respondsToSelector:sel]) {
-      [delegate audioSessionDidBeginInterruption:self];
-    }
-  }
-}
-
-- (void)notifyDidEndInterruptionWithShouldResumeSession:
-    (BOOL)shouldResumeSession {
-  for (auto delegate : self.delegates) {
-    SEL sel = @selector(audioSessionDidEndInterruption:shouldResumeSession:);
-    if ([delegate respondsToSelector:sel]) {
-      [delegate audioSessionDidEndInterruption:self
-                           shouldResumeSession:shouldResumeSession];
-    }
-  }
-}
-
-- (void)notifyDidChangeRouteWithReason:(AVAudioSessionRouteChangeReason)reason
-    previousRoute:(AVAudioSessionRouteDescription *)previousRoute {
-  for (auto delegate : self.delegates) {
-    SEL sel = @selector(audioSessionDidChangeRoute:reason:previousRoute:);
-    if ([delegate respondsToSelector:sel]) {
-      [delegate audioSessionDidChangeRoute:self
-                                    reason:reason
-                             previousRoute:previousRoute];
-    }
-  }
-}
-
-- (void)notifyMediaServicesWereLost {
-  for (auto delegate : self.delegates) {
-    SEL sel = @selector(audioSessionMediaServerTerminated:);
-    if ([delegate respondsToSelector:sel]) {
-      [delegate audioSessionMediaServerTerminated:self];
-    }
-  }
-}
-
-- (void)notifyMediaServicesWereReset {
-  for (auto delegate : self.delegates) {
-    SEL sel = @selector(audioSessionMediaServerReset:);
-    if ([delegate respondsToSelector:sel]) {
-      [delegate audioSessionMediaServerReset:self];
-    }
-  }
-}
-
-- (void)notifyDidChangeCanPlayOrRecord:(BOOL)canPlayOrRecord {
-  for (auto delegate : self.delegates) {
-    SEL sel = @selector(audioSession:didChangeCanPlayOrRecord:);
-    if ([delegate respondsToSelector:sel]) {
-      [delegate audioSession:self didChangeCanPlayOrRecord:canPlayOrRecord];
-    }
-  }
-}
-
-- (void)notifyDidStartPlayOrRecord {
-  for (auto delegate : self.delegates) {
-    SEL sel = @selector(audioSessionDidStartPlayOrRecord:);
-    if ([delegate respondsToSelector:sel]) {
-      [delegate audioSessionDidStartPlayOrRecord:self];
-    }
-  }
-}
-
-- (void)notifyDidStopPlayOrRecord {
-  for (auto delegate : self.delegates) {
-    SEL sel = @selector(audioSessionDidStopPlayOrRecord:);
-    if ([delegate respondsToSelector:sel]) {
-      [delegate audioSessionDidStopPlayOrRecord:self];
-    }
-  }
-}
-
-- (void)notifyDidChangeOutputVolume:(float)volume {
-  for (auto delegate : self.delegates) {
-    SEL sel = @selector(audioSession:didChangeOutputVolume:);
-    if ([delegate respondsToSelector:sel]) {
-      [delegate audioSession:self didChangeOutputVolume:volume];
-    }
-  }
-}
-
-- (void)notifyDidDetectPlayoutGlitch:(int64_t)totalNumberOfGlitches {
-  for (auto delegate : self.delegates) {
-    SEL sel = @selector(audioSession:didDetectPlayoutGlitch:);
-    if ([delegate respondsToSelector:sel]) {
-      [delegate audioSession:self didDetectPlayoutGlitch:totalNumberOfGlitches];
-    }
-  }
-}
-
-@end
diff --git a/sdk/objc/Framework/Classes/Audio/RTCAudioSessionConfiguration.m b/sdk/objc/Framework/Classes/Audio/RTCAudioSessionConfiguration.m
deleted file mode 100644
index 3bcb034..0000000
--- a/sdk/objc/Framework/Classes/Audio/RTCAudioSessionConfiguration.m
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- *  Copyright 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.
- */
-
-#import "WebRTC/RTCAudioSession.h"
-#import "WebRTC/RTCAudioSessionConfiguration.h"
-
-#import "WebRTC/RTCDispatcher.h"
-#import "WebRTC/UIDevice+RTCDevice.h"
-
-
-// Try to use mono to save resources. Also avoids channel format conversion
-// in the I/O audio unit. Initial tests have shown that it is possible to use
-// mono natively for built-in microphones and for BT headsets but not for
-// wired headsets. Wired headsets only support stereo as native channel format
-// but it is a low cost operation to do a format conversion to mono in the
-// audio unit. Hence, we will not hit a RTC_CHECK in
-// VerifyAudioParametersForActiveAudioSession() for a mismatch between the
-// preferred number of channels and the actual number of channels.
-const int kRTCAudioSessionPreferredNumberOfChannels = 1;
-
-// Preferred hardware sample rate (unit is in Hertz). The client sample rate
-// will be set to this value as well to avoid resampling the the audio unit's
-// format converter. Note that, some devices, e.g. BT headsets, only supports
-// 8000Hz as native sample rate.
-const double kRTCAudioSessionHighPerformanceSampleRate = 48000.0;
-
-// A lower sample rate will be used for devices with only one core
-// (e.g. iPhone 4). The goal is to reduce the CPU load of the application.
-const double kRTCAudioSessionLowComplexitySampleRate = 16000.0;
-
-// Use a hardware I/O buffer size (unit is in seconds) that matches the 10ms
-// size used by WebRTC. The exact actual size will differ between devices.
-// Example: using 48kHz on iPhone 6 results in a native buffer size of
-// ~10.6667ms or 512 audio frames per buffer. The FineAudioBuffer instance will
-// take care of any buffering required to convert between native buffers and
-// buffers used by WebRTC. It is beneficial for the performance if the native
-// size is as an even multiple of 10ms as possible since it results in "clean"
-// callback sequence without bursts of callbacks back to back.
-const double kRTCAudioSessionHighPerformanceIOBufferDuration = 0.02;
-
-// Use a larger buffer size on devices with only one core (e.g. iPhone 4).
-// It will result in a lower CPU consumption at the cost of a larger latency.
-// The size of 60ms is based on instrumentation that shows a significant
-// reduction in CPU load compared with 10ms on low-end devices.
-// TODO(henrika): monitor this size and determine if it should be modified.
-const double kRTCAudioSessionLowComplexityIOBufferDuration = 0.06;
-
-static RTCAudioSessionConfiguration *gWebRTCConfiguration = nil;
-
-@implementation RTCAudioSessionConfiguration
-
-@synthesize category = _category;
-@synthesize categoryOptions = _categoryOptions;
-@synthesize mode = _mode;
-@synthesize sampleRate = _sampleRate;
-@synthesize ioBufferDuration = _ioBufferDuration;
-@synthesize inputNumberOfChannels = _inputNumberOfChannels;
-@synthesize outputNumberOfChannels = _outputNumberOfChannels;
-
-- (instancetype)init {
-  if (self = [super init]) {
-    // Use a category which supports simultaneous recording and playback.
-    // By default, using this category implies that our app’s audio is
-    // nonmixable, hence activating the session will interrupt any other
-    // audio sessions which are also nonmixable.
-    _category = AVAudioSessionCategoryPlayAndRecord;
-    _categoryOptions = AVAudioSessionCategoryOptionAllowBluetooth;
-
-    // Specify mode for two-way voice communication (e.g. VoIP).
-    _mode = AVAudioSessionModeVoiceChat;
-
-    // Set the session's sample rate or the hardware sample rate.
-    // It is essential that we use the same sample rate as stream format
-    // to ensure that the I/O unit does not have to do sample rate conversion.
-    // Set the preferred audio I/O buffer duration, in seconds.
-    NSUInteger processorCount = [NSProcessInfo processInfo].processorCount;
-    // Use best sample rate and buffer duration if the CPU has more than one
-    // core.
-    if (processorCount > 1 && [UIDevice deviceType] != RTCDeviceTypeIPhone4S) {
-      _sampleRate = kRTCAudioSessionHighPerformanceSampleRate;
-      _ioBufferDuration = kRTCAudioSessionHighPerformanceIOBufferDuration;
-    } else {
-      _sampleRate = kRTCAudioSessionLowComplexitySampleRate;
-      _ioBufferDuration = kRTCAudioSessionLowComplexityIOBufferDuration;
-    }
-
-    // We try to use mono in both directions to save resources and format
-    // conversions in the audio unit. Some devices does only support stereo;
-    // e.g. wired headset on iPhone 6.
-    // TODO(henrika): add support for stereo if needed.
-    _inputNumberOfChannels = kRTCAudioSessionPreferredNumberOfChannels;
-    _outputNumberOfChannels = kRTCAudioSessionPreferredNumberOfChannels;
-  }
-  return self;
-}
-
-+ (void)initialize {
-  gWebRTCConfiguration = [[self alloc] init];
-}
-
-+ (instancetype)currentConfiguration {
-  RTCAudioSession *session = [RTCAudioSession sharedInstance];
-  RTCAudioSessionConfiguration *config =
-      [[RTCAudioSessionConfiguration alloc] init];
-  config.category = session.category;
-  config.categoryOptions = session.categoryOptions;
-  config.mode = session.mode;
-  config.sampleRate = session.sampleRate;
-  config.ioBufferDuration = session.IOBufferDuration;
-  config.inputNumberOfChannels = session.inputNumberOfChannels;
-  config.outputNumberOfChannels = session.outputNumberOfChannels;
-  return config;
-}
-
-+ (instancetype)webRTCConfiguration {
-  @synchronized(self) {
-    return (RTCAudioSessionConfiguration *)gWebRTCConfiguration;
-  }
-}
-
-+ (void)setWebRTCConfiguration:(RTCAudioSessionConfiguration *)configuration {
-  @synchronized(self) {
-    gWebRTCConfiguration = configuration;
-  }
-}
-
-@end
diff --git a/sdk/objc/Framework/Classes/Common/NSString+StdString.h b/sdk/objc/Framework/Classes/Common/NSString+StdString.h
deleted file mode 100644
index 8bf6cc9..0000000
--- a/sdk/objc/Framework/Classes/Common/NSString+StdString.h
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-#import <Foundation/Foundation.h>
-
-#include <string>
-
-NS_ASSUME_NONNULL_BEGIN
-
-@interface NSString (StdString)
-
-@property(nonatomic, readonly) std::string stdString;
-
-+ (std::string)stdStringForString:(NSString *)nsString;
-+ (NSString *)stringForStdString:(const std::string&)stdString;
-
-@end
-
-NS_ASSUME_NONNULL_END
diff --git a/sdk/objc/Framework/Classes/Common/NSString+StdString.mm b/sdk/objc/Framework/Classes/Common/NSString+StdString.mm
deleted file mode 100644
index 3210ff0..0000000
--- a/sdk/objc/Framework/Classes/Common/NSString+StdString.mm
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-#import "NSString+StdString.h"
-
-@implementation NSString (StdString)
-
-- (std::string)stdString {
-  return [NSString stdStringForString:self];
-}
-
-+ (std::string)stdStringForString:(NSString *)nsString {
-  NSData *charData = [nsString dataUsingEncoding:NSUTF8StringEncoding];
-  return std::string(reinterpret_cast<const char *>(charData.bytes),
-                     charData.length);
-}
-
-+ (NSString *)stringForStdString:(const std::string&)stdString {
-  // std::string may contain null termination character so we construct
-  // using length.
-  return [[NSString alloc] initWithBytes:stdString.data()
-                                  length:stdString.length()
-                                encoding:NSUTF8StringEncoding];
-}
-
-@end
diff --git a/sdk/objc/Framework/Classes/Common/RTCDispatcher+Private.h b/sdk/objc/Framework/Classes/Common/RTCDispatcher+Private.h
deleted file mode 100644
index 3c114e5..0000000
--- a/sdk/objc/Framework/Classes/Common/RTCDispatcher+Private.h
+++ /dev/null
@@ -1,17 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-#import "WebRTC/RTCDispatcher.h"
-
-@interface RTCDispatcher ()
-
-+ (dispatch_queue_t)dispatchQueueForType:(RTCDispatcherQueueType)dispatchType;
-
-@end
diff --git a/sdk/objc/Framework/Classes/Common/RTCDispatcher.m b/sdk/objc/Framework/Classes/Common/RTCDispatcher.m
deleted file mode 100644
index 530e51a..0000000
--- a/sdk/objc/Framework/Classes/Common/RTCDispatcher.m
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-#import "RTCDispatcher+Private.h"
-
-static dispatch_queue_t kAudioSessionQueue = nil;
-static dispatch_queue_t kCaptureSessionQueue = nil;
-
-@implementation RTCDispatcher
-
-+ (void)initialize {
-  static dispatch_once_t onceToken;
-  dispatch_once(&onceToken, ^{
-    kAudioSessionQueue = dispatch_queue_create(
-        "org.webrtc.RTCDispatcherAudioSession",
-        DISPATCH_QUEUE_SERIAL);
-    kCaptureSessionQueue = dispatch_queue_create(
-        "org.webrtc.RTCDispatcherCaptureSession",
-        DISPATCH_QUEUE_SERIAL);
-  });
-}
-
-+ (void)dispatchAsyncOnType:(RTCDispatcherQueueType)dispatchType
-                      block:(dispatch_block_t)block {
-  dispatch_queue_t queue = [self dispatchQueueForType:dispatchType];
-  dispatch_async(queue, block);
-}
-
-+ (BOOL)isOnQueueForType:(RTCDispatcherQueueType)dispatchType {
-  dispatch_queue_t targetQueue = [self dispatchQueueForType:dispatchType];
-  const char* targetLabel = dispatch_queue_get_label(targetQueue);
-  const char* currentLabel = dispatch_queue_get_label(DISPATCH_CURRENT_QUEUE_LABEL);
-
-  NSAssert(strlen(targetLabel) > 0, @"Label is required for the target queue.");
-  NSAssert(strlen(currentLabel) > 0, @"Label is required for the current queue.");
-
-  return strcmp(targetLabel, currentLabel) == 0;
-}
-
-#pragma mark - Private
-
-+ (dispatch_queue_t)dispatchQueueForType:(RTCDispatcherQueueType)dispatchType {
-  switch (dispatchType) {
-    case RTCDispatcherTypeMain:
-      return dispatch_get_main_queue();
-    case RTCDispatcherTypeCaptureSession:
-      return kCaptureSessionQueue;
-    case RTCDispatcherTypeAudioSession:
-      return kAudioSessionQueue;
-  }
-}
-
-@end
-
diff --git a/sdk/objc/Framework/Classes/Common/RTCFieldTrials.mm b/sdk/objc/Framework/Classes/Common/RTCFieldTrials.mm
deleted file mode 100644
index 854bc7c..0000000
--- a/sdk/objc/Framework/Classes/Common/RTCFieldTrials.mm
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- *  Copyright 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.
- */
-
-#import "WebRTC/RTCFieldTrials.h"
-
-#include <memory>
-
-#import "WebRTC/RTCLogging.h"
-
-// Adding 'nogncheck' to disable the gn include headers check.
-// We don't want to depend on 'system_wrappers:field_trial_default' because
-// clients should be able to provide their own implementation.
-#include "webrtc/system_wrappers/include/field_trial_default.h"  // nogncheck
-
-NSString * const kRTCFieldTrialAudioSendSideBweKey = @"WebRTC-Audio-SendSideBwe";
-NSString * const kRTCFieldTrialSendSideBweWithOverheadKey = @"WebRTC-SendSideBwe-WithOverhead";
-NSString * const kRTCFieldTrialFlexFec03AdvertisedKey = @"WebRTC-FlexFEC-03-Advertised";
-NSString * const kRTCFieldTrialFlexFec03Key = @"WebRTC-FlexFEC-03";
-NSString * const kRTCFieldTrialImprovedBitrateEstimateKey = @"WebRTC-ImprovedBitrateEstimate";
-NSString * const kRTCFieldTrialMedianSlopeFilterKey = @"WebRTC-BweMedianSlopeFilter";
-NSString * const kRTCFieldTrialTrendlineFilterKey = @"WebRTC-BweTrendlineFilter";
-NSString * const kRTCFieldTrialH264HighProfileKey = @"WebRTC-H264HighProfile";
-NSString * const kRTCFieldTrialMinimizeResamplingOnMobileKey =
-    @"WebRTC-Audio-MinimizeResamplingOnMobile";
-NSString * const kRTCFieldTrialEnabledValue = @"Enabled";
-
-static std::unique_ptr<char[]> gFieldTrialInitString;
-
-NSString *RTCFieldTrialMedianSlopeFilterValue(
-    size_t windowSize, double thresholdGain) {
-  NSString *format = @"Enabled-%zu,%lf";
-  return [NSString stringWithFormat:format, windowSize, thresholdGain];
-}
-
-NSString *RTCFieldTrialTrendlineFilterValue(
-    size_t windowSize, double smoothingCoeff, double thresholdGain) {
-  NSString *format = @"Enabled-%zu,%lf,%lf";
-  return [NSString stringWithFormat:format, windowSize, smoothingCoeff, thresholdGain];
-}
-
-void RTCInitFieldTrialDictionary(NSDictionary<NSString *, NSString *> *fieldTrials) {
-  if (!fieldTrials) {
-    RTCLogWarning(@"No fieldTrials provided.");
-    return;
-  }
-  // Assemble the keys and values into the field trial string.
-  // We don't perform any extra format checking. That should be done by the underlying WebRTC calls.
-  NSMutableString *fieldTrialInitString = [NSMutableString string];
-  for (NSString *key in fieldTrials) {
-    NSString *fieldTrialEntry = [NSString stringWithFormat:@"%@/%@/", key, fieldTrials[key]];
-    [fieldTrialInitString appendString:fieldTrialEntry];
-  }
-  size_t len = fieldTrialInitString.length + 1;
-  gFieldTrialInitString.reset(new char[len]);
-  if (![fieldTrialInitString getCString:gFieldTrialInitString.get()
-                              maxLength:len
-                               encoding:NSUTF8StringEncoding]) {
-    RTCLogError(@"Failed to convert field trial string.");
-    return;
-  }
-  webrtc::field_trial::InitFieldTrialsFromString(gFieldTrialInitString.get());
-}
diff --git a/sdk/objc/Framework/Classes/Common/RTCFileLogger.mm b/sdk/objc/Framework/Classes/Common/RTCFileLogger.mm
deleted file mode 100644
index 75d0621..0000000
--- a/sdk/objc/Framework/Classes/Common/RTCFileLogger.mm
+++ /dev/null
@@ -1,176 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-#import "WebRTC/RTCFileLogger.h"
-
-#include <memory>
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/filerotatingstream.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/logsinks.h"
-
-NSString *const kDefaultLogDirName = @"webrtc_logs";
-NSUInteger const kDefaultMaxFileSize = 10 * 1024 * 1024; // 10MB.
-const char *kRTCFileLoggerRotatingLogPrefix = "rotating_log";
-
-@implementation RTCFileLogger {
-  BOOL _hasStarted;
-  NSString *_dirPath;
-  NSUInteger _maxFileSize;
-  std::unique_ptr<rtc::FileRotatingLogSink> _logSink;
-}
-
-@synthesize severity = _severity;
-@synthesize rotationType = _rotationType;
-@synthesize shouldDisableBuffering = _shouldDisableBuffering;
-
-- (instancetype)init {
-  NSArray *paths = NSSearchPathForDirectoriesInDomains(
-      NSDocumentDirectory, NSUserDomainMask, YES);
-  NSString *documentsDirPath = [paths firstObject];
-  NSString *defaultDirPath =
-      [documentsDirPath stringByAppendingPathComponent:kDefaultLogDirName];
-  return [self initWithDirPath:defaultDirPath
-                   maxFileSize:kDefaultMaxFileSize];
-}
-
-- (instancetype)initWithDirPath:(NSString *)dirPath
-                    maxFileSize:(NSUInteger)maxFileSize {
-  return [self initWithDirPath:dirPath
-                   maxFileSize:maxFileSize
-                  rotationType:RTCFileLoggerTypeCall];
-}
-
-- (instancetype)initWithDirPath:(NSString *)dirPath
-                    maxFileSize:(NSUInteger)maxFileSize
-                   rotationType:(RTCFileLoggerRotationType)rotationType {
-  NSParameterAssert(dirPath.length);
-  NSParameterAssert(maxFileSize);
-  if (self = [super init]) {
-    BOOL isDir = NO;
-    NSFileManager *fileManager = [NSFileManager defaultManager];
-    if ([fileManager fileExistsAtPath:dirPath isDirectory:&isDir]) {
-      if (!isDir) {
-        // Bail if something already exists there.
-        return nil;
-      }
-    } else {
-      if (![fileManager createDirectoryAtPath:dirPath
-                  withIntermediateDirectories:NO
-                                   attributes:nil
-                                        error:nil]) {
-        // Bail if we failed to create a directory.
-        return nil;
-      }
-    }
-    _dirPath = dirPath;
-    _maxFileSize = maxFileSize;
-    _severity = RTCFileLoggerSeverityInfo;
-  }
-  return self;
-}
-
-- (void)dealloc {
-  [self stop];
-}
-
-- (void)start {
-  if (_hasStarted) {
-    return;
-  }
-  switch (_rotationType) {
-    case RTCFileLoggerTypeApp:
-      _logSink.reset(
-          new rtc::FileRotatingLogSink(_dirPath.UTF8String,
-                                       kRTCFileLoggerRotatingLogPrefix,
-                                       _maxFileSize,
-                                       _maxFileSize / 10));
-      break;
-    case RTCFileLoggerTypeCall:
-      _logSink.reset(
-          new rtc::CallSessionFileRotatingLogSink(_dirPath.UTF8String,
-                                                  _maxFileSize));
-      break;
-  }
-  if (!_logSink->Init()) {
-    LOG(LS_ERROR) << "Failed to open log files at path: "
-                  << _dirPath.UTF8String;
-    _logSink.reset();
-    return;
-  }
-  if (_shouldDisableBuffering) {
-    _logSink->DisableBuffering();
-  }
-  rtc::LogMessage::LogThreads(true);
-  rtc::LogMessage::LogTimestamps(true);
-  rtc::LogMessage::AddLogToStream(_logSink.get(), [self rtcSeverity]);
-  _hasStarted = YES;
-}
-
-- (void)stop {
-  if (!_hasStarted) {
-    return;
-  }
-  RTC_DCHECK(_logSink);
-  rtc::LogMessage::RemoveLogToStream(_logSink.get());
-  _hasStarted = NO;
-  _logSink.reset();
-}
-
-- (NSData *)logData {
-  if (_hasStarted) {
-    return nil;
-  }
-  NSMutableData* logData = [NSMutableData data];
-  std::unique_ptr<rtc::FileRotatingStream> stream;
-  switch(_rotationType) {
-    case RTCFileLoggerTypeApp:
-      stream.reset(
-          new rtc::FileRotatingStream(_dirPath.UTF8String,
-                                      kRTCFileLoggerRotatingLogPrefix));
-      break;
-    case RTCFileLoggerTypeCall:
-      stream.reset(new rtc::CallSessionFileRotatingStream(_dirPath.UTF8String));
-      break;
-  }
-  if (!stream->Open()) {
-    return logData;
-  }
-  size_t bufferSize = 0;
-  if (!stream->GetSize(&bufferSize) || bufferSize == 0) {
-    return logData;
-  }
-  size_t read = 0;
-  // Allocate memory using malloc so we can pass it direcly to NSData without
-  // copying.
-  std::unique_ptr<uint8_t[]> buffer(static_cast<uint8_t*>(malloc(bufferSize)));
-  stream->ReadAll(buffer.get(), bufferSize, &read, nullptr);
-  logData = [[NSMutableData alloc] initWithBytesNoCopy:buffer.release()
-                                                length:read];
-  return logData;
-}
-
-#pragma mark - Private
-
-- (rtc::LoggingSeverity)rtcSeverity {
-  switch (_severity) {
-    case RTCFileLoggerSeverityVerbose:
-      return rtc::LS_VERBOSE;
-    case RTCFileLoggerSeverityInfo:
-      return rtc::LS_INFO;
-    case RTCFileLoggerSeverityWarning:
-      return rtc::LS_WARNING;
-    case RTCFileLoggerSeverityError:
-      return rtc::LS_ERROR;
-  }
-}
-
-@end
diff --git a/sdk/objc/Framework/Classes/Common/RTCLogging.mm b/sdk/objc/Framework/Classes/Common/RTCLogging.mm
deleted file mode 100644
index 7b8ca0a..0000000
--- a/sdk/objc/Framework/Classes/Common/RTCLogging.mm
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-#import "WebRTC/RTCLogging.h"
-
-#include "webrtc/rtc_base/logging.h"
-
-rtc::LoggingSeverity RTCGetNativeLoggingSeverity(RTCLoggingSeverity severity) {
-  switch (severity) {
-    case RTCLoggingSeverityVerbose:
-      return rtc::LS_VERBOSE;
-    case RTCLoggingSeverityInfo:
-      return rtc::LS_INFO;
-    case RTCLoggingSeverityWarning:
-      return rtc::LS_WARNING;
-    case RTCLoggingSeverityError:
-      return rtc::LS_ERROR;
-  }
-}
-
-void RTCLogEx(RTCLoggingSeverity severity, NSString* log_string) {
-  if (log_string.length) {
-    const char* utf8_string = log_string.UTF8String;
-    LOG_V(RTCGetNativeLoggingSeverity(severity)) << utf8_string;
-  }
-}
-
-void RTCSetMinDebugLogLevel(RTCLoggingSeverity severity) {
-  rtc::LogMessage::LogToDebug(RTCGetNativeLoggingSeverity(severity));
-}
-
-NSString* RTCFileName(const char* file_path) {
-  NSString* ns_file_path =
-      [[NSString alloc] initWithBytesNoCopy:const_cast<char*>(file_path)
-                                     length:strlen(file_path)
-                                   encoding:NSUTF8StringEncoding
-                               freeWhenDone:NO];
-  return ns_file_path.lastPathComponent;
-}
-
diff --git a/sdk/objc/Framework/Classes/Common/RTCUIApplicationStatusObserver.h b/sdk/objc/Framework/Classes/Common/RTCUIApplicationStatusObserver.h
deleted file mode 100644
index a2064df..0000000
--- a/sdk/objc/Framework/Classes/Common/RTCUIApplicationStatusObserver.h
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- *  Copyright 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.
- */
-
-#if defined(WEBRTC_IOS)
-
-#import <Foundation/Foundation.h>
-
-@interface RTCUIApplicationStatusObserver : NSObject
-
-+ (instancetype)sharedInstance;
-+ (void)prepareForUse;
-
-- (BOOL)isApplicationActive;
-
-@end
-
-#endif  // WEBRTC_IOS
diff --git a/sdk/objc/Framework/Classes/Common/RTCUIApplicationStatusObserver.m b/sdk/objc/Framework/Classes/Common/RTCUIApplicationStatusObserver.m
deleted file mode 100644
index 7134773..0000000
--- a/sdk/objc/Framework/Classes/Common/RTCUIApplicationStatusObserver.m
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- *  Copyright 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 "RTCUIApplicationStatusObserver.h"
-
-#if defined(WEBRTC_IOS)
-
-#import <UIKit/UIKit.h>
-
-#include "webrtc/rtc_base/checks.h"
-
-@interface RTCUIApplicationStatusObserver ()
-
-@property(nonatomic, assign) BOOL initialized;
-@property(nonatomic, assign) UIApplicationState state;
-
-@end
-
-@implementation RTCUIApplicationStatusObserver {
-  BOOL _initialized;
-  dispatch_block_t _initializeBlock;
-  dispatch_semaphore_t _waitForInitializeSemaphore;
-  UIApplicationState _state;
-
-  id<NSObject> _activeObserver;
-  id<NSObject> _backgroundObserver;
-}
-
-@synthesize initialized = _initialized;
-@synthesize state = _state;
-
-+ (instancetype)sharedInstance {
-  static id sharedInstance;
-  static dispatch_once_t onceToken;
-  dispatch_once(&onceToken, ^{
-    sharedInstance = [[self alloc] init];
-  });
-
-  return sharedInstance;
-}
-
-// Method to make sure observers are added and the initialization block is
-// scheduled to run on the main queue.
-+ (void)prepareForUse {
-  __unused RTCUIApplicationStatusObserver *observer = [self sharedInstance];
-}
-
-- (id)init {
-  if (self = [super init]) {
-    NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
-    __weak RTCUIApplicationStatusObserver *weakSelf = self;
-    _activeObserver = [center addObserverForName:UIApplicationDidBecomeActiveNotification
-                                          object:nil
-                                           queue:[NSOperationQueue mainQueue]
-                                      usingBlock:^(NSNotification *note) {
-                                        weakSelf.state =
-                                            [UIApplication sharedApplication].applicationState;
-                                      }];
-
-    _backgroundObserver = [center addObserverForName:UIApplicationDidEnterBackgroundNotification
-                                              object:nil
-                                               queue:[NSOperationQueue mainQueue]
-                                          usingBlock:^(NSNotification *note) {
-                                            weakSelf.state =
-                                                [UIApplication sharedApplication].applicationState;
-                                          }];
-
-    _waitForInitializeSemaphore = dispatch_semaphore_create(1);
-    _initialized = NO;
-    _initializeBlock = dispatch_block_create(DISPATCH_BLOCK_INHERIT_QOS_CLASS, ^{
-      weakSelf.state = [UIApplication sharedApplication].applicationState;
-      weakSelf.initialized = YES;
-    });
-
-    dispatch_async(dispatch_get_main_queue(), _initializeBlock);
-  }
-
-  return self;
-}
-
-- (void)dealloc {
-  NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
-  [center removeObserver:_activeObserver];
-  [center removeObserver:_backgroundObserver];
-}
-
-- (BOOL)isApplicationActive {
-  // NOTE: The function `dispatch_block_wait` can only legally be called once.
-  // Because of this, if several threads call the `isApplicationActive` method before
-  // the `_initializeBlock` has been executed, instead of multiple threads calling
-  // `dispatch_block_wait`, the other threads need to wait for the first waiting thread
-  // instead.
-  if (!_initialized) {
-    dispatch_semaphore_wait(_waitForInitializeSemaphore, DISPATCH_TIME_FOREVER);
-    if (!_initialized) {
-      long ret = dispatch_block_wait(_initializeBlock,
-                                     dispatch_time(DISPATCH_TIME_NOW, 10.0 * NSEC_PER_SEC));
-      RTC_DCHECK_EQ(ret, 0);
-    }
-    dispatch_semaphore_signal(_waitForInitializeSemaphore);
-  }
-  return _state == UIApplicationStateActive;
-}
-
-@end
-
-#endif  // WEBRTC_IOS
diff --git a/sdk/objc/Framework/Classes/Common/UIDevice+RTCDevice.mm b/sdk/objc/Framework/Classes/Common/UIDevice+RTCDevice.mm
deleted file mode 100644
index 94faf53..0000000
--- a/sdk/objc/Framework/Classes/Common/UIDevice+RTCDevice.mm
+++ /dev/null
@@ -1,176 +0,0 @@
-/*
- *  Copyright 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.
- */
-
-#import "WebRTC/UIDevice+RTCDevice.h"
-
-#include <memory>
-#include <sys/sysctl.h>
-
-@implementation UIDevice (RTCDevice)
-
-+ (RTCDeviceType)deviceType {
-  NSDictionary *machineNameToType = @{
-    @"iPhone1,1": @(RTCDeviceTypeIPhone1G),
-    @"iPhone1,2": @(RTCDeviceTypeIPhone3G),
-    @"iPhone2,1": @(RTCDeviceTypeIPhone3GS),
-    @"iPhone3,1": @(RTCDeviceTypeIPhone4),
-    @"iPhone3,3": @(RTCDeviceTypeIPhone4Verizon),
-    @"iPhone4,1": @(RTCDeviceTypeIPhone4S),
-    @"iPhone5,1": @(RTCDeviceTypeIPhone5GSM),
-    @"iPhone5,2": @(RTCDeviceTypeIPhone5GSM_CDMA),
-    @"iPhone5,3": @(RTCDeviceTypeIPhone5CGSM),
-    @"iPhone5,4": @(RTCDeviceTypeIPhone5CGSM_CDMA),
-    @"iPhone6,1": @(RTCDeviceTypeIPhone5SGSM),
-    @"iPhone6,2": @(RTCDeviceTypeIPhone5SGSM_CDMA),
-    @"iPhone7,1": @(RTCDeviceTypeIPhone6Plus),
-    @"iPhone7,2": @(RTCDeviceTypeIPhone6),
-    @"iPhone8,1": @(RTCDeviceTypeIPhone6S),
-    @"iPhone8,2": @(RTCDeviceTypeIPhone6SPlus),
-    @"iPod1,1": @(RTCDeviceTypeIPodTouch1G),
-    @"iPod2,1": @(RTCDeviceTypeIPodTouch2G),
-    @"iPod3,1": @(RTCDeviceTypeIPodTouch3G),
-    @"iPod4,1": @(RTCDeviceTypeIPodTouch4G),
-    @"iPod5,1": @(RTCDeviceTypeIPodTouch5G),
-    @"iPad1,1": @(RTCDeviceTypeIPad),
-    @"iPad2,1": @(RTCDeviceTypeIPad2Wifi),
-    @"iPad2,2": @(RTCDeviceTypeIPad2GSM),
-    @"iPad2,3": @(RTCDeviceTypeIPad2CDMA),
-    @"iPad2,4": @(RTCDeviceTypeIPad2Wifi2),
-    @"iPad2,5": @(RTCDeviceTypeIPadMiniWifi),
-    @"iPad2,6": @(RTCDeviceTypeIPadMiniGSM),
-    @"iPad2,7": @(RTCDeviceTypeIPadMiniGSM_CDMA),
-    @"iPad3,1": @(RTCDeviceTypeIPad3Wifi),
-    @"iPad3,2": @(RTCDeviceTypeIPad3GSM_CDMA),
-    @"iPad3,3": @(RTCDeviceTypeIPad3GSM),
-    @"iPad3,4": @(RTCDeviceTypeIPad4Wifi),
-    @"iPad3,5": @(RTCDeviceTypeIPad4GSM),
-    @"iPad3,6": @(RTCDeviceTypeIPad4GSM_CDMA),
-    @"iPad4,1": @(RTCDeviceTypeIPadAirWifi),
-    @"iPad4,2": @(RTCDeviceTypeIPadAirCellular),
-    @"iPad4,4": @(RTCDeviceTypeIPadMini2GWifi),
-    @"iPad4,5": @(RTCDeviceTypeIPadMini2GCellular),
-    @"i386": @(RTCDeviceTypeSimulatori386),
-    @"x86_64": @(RTCDeviceTypeSimulatorx86_64),
-  };
-
-  size_t size = 0;
-  sysctlbyname("hw.machine", NULL, &size, NULL, 0);
-  std::unique_ptr<char[]> machine;
-  machine.reset(new char[size]);
-  sysctlbyname("hw.machine", machine.get(), &size, NULL, 0);
-  NSString *machineName = [[NSString alloc] initWithCString:machine.get()
-                                                   encoding:NSUTF8StringEncoding];
-  RTCDeviceType deviceType = RTCDeviceTypeUnknown;
-  NSNumber *typeNumber = machineNameToType[machineName];
-  if (typeNumber) {
-    deviceType = static_cast<RTCDeviceType>(typeNumber.integerValue);
-  }
-  return deviceType;
-}
-
-+ (NSString *)stringForDeviceType:(RTCDeviceType)deviceType {
-  switch (deviceType) {
-    case RTCDeviceTypeUnknown:
-      return @"Unknown";
-    case RTCDeviceTypeIPhone1G:
-      return @"iPhone 1G";
-    case RTCDeviceTypeIPhone3G:
-      return @"iPhone 3G";
-    case RTCDeviceTypeIPhone3GS:
-      return @"iPhone 3GS";
-    case RTCDeviceTypeIPhone4:
-      return @"iPhone 4";
-    case RTCDeviceTypeIPhone4Verizon:
-      return @"iPhone 4 Verizon";
-    case RTCDeviceTypeIPhone4S:
-      return @"iPhone 4S";
-    case RTCDeviceTypeIPhone5GSM:
-      return @"iPhone 5 (GSM)";
-    case RTCDeviceTypeIPhone5GSM_CDMA:
-      return @"iPhone 5 (GSM+CDMA)";
-    case RTCDeviceTypeIPhone5CGSM:
-      return @"iPhone 5C (GSM)";
-    case RTCDeviceTypeIPhone5CGSM_CDMA:
-      return @"iPhone 5C (GSM+CDMA)";
-    case RTCDeviceTypeIPhone5SGSM:
-      return @"iPhone 5S (GSM)";
-    case RTCDeviceTypeIPhone5SGSM_CDMA:
-      return @"iPhone 5S (GSM+CDMA)";
-    case RTCDeviceTypeIPhone6Plus:
-      return @"iPhone 6 Plus";
-    case RTCDeviceTypeIPhone6:
-      return @"iPhone 6";
-    case RTCDeviceTypeIPhone6S:
-      return @"iPhone 6S";
-    case RTCDeviceTypeIPhone6SPlus:
-      return @"iPhone 6S Plus";
-    case RTCDeviceTypeIPodTouch1G:
-      return @"iPod Touch 1G";
-    case RTCDeviceTypeIPodTouch2G:
-      return @"iPod Touch 2G";
-    case RTCDeviceTypeIPodTouch3G:
-      return @"iPod Touch 3G";
-    case RTCDeviceTypeIPodTouch4G:
-      return @"iPod Touch 4G";
-    case RTCDeviceTypeIPodTouch5G:
-      return @"iPod Touch 5G";
-    case RTCDeviceTypeIPad:
-      return @"iPad";
-    case RTCDeviceTypeIPad2Wifi:
-      return @"iPad 2 (WiFi)";
-    case RTCDeviceTypeIPad2GSM:
-      return @"iPad 2 (GSM)";
-    case RTCDeviceTypeIPad2CDMA:
-      return @"iPad 2 (CDMA)";
-    case RTCDeviceTypeIPad2Wifi2:
-      return @"iPad 2 (WiFi) 2";
-    case RTCDeviceTypeIPadMiniWifi:
-      return @"iPad Mini (WiFi)";
-    case RTCDeviceTypeIPadMiniGSM:
-      return @"iPad Mini (GSM)";
-    case RTCDeviceTypeIPadMiniGSM_CDMA:
-      return @"iPad Mini (GSM+CDMA)";
-    case RTCDeviceTypeIPad3Wifi:
-      return @"iPad 3 (WiFi)";
-    case RTCDeviceTypeIPad3GSM_CDMA:
-      return @"iPad 3 (GSM+CDMA)";
-    case RTCDeviceTypeIPad3GSM:
-      return @"iPad 3 (GSM)";
-    case RTCDeviceTypeIPad4Wifi:
-      return @"iPad 4 (WiFi)";
-    case RTCDeviceTypeIPad4GSM:
-      return @"iPad 4 (GSM)";
-    case RTCDeviceTypeIPad4GSM_CDMA:
-      return @"iPad 4 (GSM+CDMA)";
-    case RTCDeviceTypeIPadAirWifi:
-      return @"iPad Air (WiFi)";
-    case RTCDeviceTypeIPadAirCellular:
-      return @"iPad Air (Cellular)";
-    case RTCDeviceTypeIPadMini2GWifi:
-      return @"iPad Mini 2G (Wifi)";
-    case RTCDeviceTypeIPadMini2GCellular:
-      return @"iPad Mini 2G (Cellular)";
-    case RTCDeviceTypeSimulatori386:
-      return @"i386 Simulator";
-    case RTCDeviceTypeSimulatorx86_64:
-      return @"x86_64 Simulator";
-  }
-  return @"Unknown";
-}
-
-+ (double)currentDeviceSystemVersion {
-  return [self currentDevice].systemVersion.doubleValue;
-}
-
-+ (BOOL)isIOS9OrLater {
-  return [self currentDeviceSystemVersion] >= 9.0;
-}
-
-@end
diff --git a/sdk/objc/Framework/Classes/Common/helpers.h b/sdk/objc/Framework/Classes/Common/helpers.h
deleted file mode 100644
index fdcd9cc..0000000
--- a/sdk/objc/Framework/Classes/Common/helpers.h
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- *  Copyright (c) 2015 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_SDK_OBJC_FRAMEWORK_CLASSES_COMMON_HELPERS_H_
-#define WEBRTC_SDK_OBJC_FRAMEWORK_CLASSES_COMMON_HELPERS_H_
-
-#include <string>
-
-namespace webrtc {
-namespace ios {
-
-bool CheckAndLogError(BOOL success, NSError* error);
-
-NSString *NSStringFromStdString(const std::string& stdString);
-std::string StdStringFromNSString(NSString* nsString);
-
-// Return thread ID as a string.
-std::string GetThreadId();
-
-// Return thread ID as string suitable for debug logging.
-std::string GetThreadInfo();
-
-// Returns [NSThread currentThread] description as string.
-// Example: <NSThread: 0x170066d80>{number = 1, name = main}
-std::string GetCurrentThreadDescription();
-
-#if defined(WEBRTC_IOS)
-// Returns the current name of the operating system.
-std::string GetSystemName();
-
-// Returns the current version of the operating system as a string.
-std::string GetSystemVersionAsString();
-
-// Returns the version of the operating system in double representation.
-// Uses a cached value of the system version.
-double GetSystemVersion();
-
-// Returns the device type.
-// Examples: ”iPhone” and ”iPod touch”.
-std::string GetDeviceType();
-#endif  // defined(WEBRTC_IOS)
-
-// Returns a more detailed device name.
-// Examples: "iPhone 5s (GSM)" and "iPhone 6 Plus".
-std::string GetDeviceName();
-
-// Returns the name of the process. Does not uniquely identify the process.
-std::string GetProcessName();
-
-// Returns the identifier of the process (often called process ID).
-int GetProcessID();
-
-// Returns a string containing the version of the operating system on which the
-// process is executing. The string is string is human readable, localized, and
-// is appropriate for displaying to the user.
-std::string GetOSVersionString();
-
-// Returns the number of processing cores available on the device.
-int GetProcessorCount();
-
-#if defined(WEBRTC_IOS)
-// Indicates whether Low Power Mode is enabled on the iOS device.
-bool GetLowPowerModeEnabled();
-#endif
-
-}  // namespace ios
-}  // namespace webrtc
-
-#endif  // WEBRTC_SDK_OBJC_FRAMEWORK_CLASSES_COMMON_HELPERS_H_
diff --git a/sdk/objc/Framework/Classes/Common/helpers.mm b/sdk/objc/Framework/Classes/Common/helpers.mm
deleted file mode 100644
index 6b44c59..0000000
--- a/sdk/objc/Framework/Classes/Common/helpers.mm
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
- *  Copyright (c) 2015 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.
- */
-
-
-#import <Foundation/Foundation.h>
-#import <sys/sysctl.h>
-#if defined(WEBRTC_IOS)
-#import <UIKit/UIKit.h>
-#endif
-
-#include <memory>
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/sdk/objc/Framework/Classes/Common/helpers.h"
-
-namespace webrtc {
-namespace ios {
-
-#if defined(WEBRTC_IOS)
-bool isOperatingSystemAtLeastVersion(double version) {
-  return GetSystemVersion() >= version;
-}
-#endif
-
-NSString* NSStringFromStdString(const std::string& stdString) {
-  // std::string may contain null termination character so we construct
-  // using length.
-  return [[NSString alloc] initWithBytes:stdString.data()
-                                  length:stdString.length()
-                                encoding:NSUTF8StringEncoding];
-}
-
-std::string StdStringFromNSString(NSString* nsString) {
-  NSData* charData = [nsString dataUsingEncoding:NSUTF8StringEncoding];
-  return std::string(reinterpret_cast<const char*>([charData bytes]),
-                     [charData length]);
-}
-
-bool CheckAndLogError(BOOL success, NSError* error) {
-  if (!success) {
-    NSString* msg =
-        [NSString stringWithFormat:@"Error: %ld, %@, %@", (long)error.code,
-                                   error.localizedDescription,
-                                   error.localizedFailureReason];
-    LOG(LS_ERROR) << StdStringFromNSString(msg);
-    return false;
-  }
-  return true;
-}
-
-// TODO(henrika): see if it is possible to move to GetThreadName in
-// platform_thread.h and base it on pthread methods instead.
-std::string GetCurrentThreadDescription() {
-  NSString* name = [NSString stringWithFormat:@"%@", [NSThread currentThread]];
-  return StdStringFromNSString(name);
-}
-
-#if defined(WEBRTC_IOS)
-std::string GetSystemName() {
-  NSString* osName = [[UIDevice currentDevice] systemName];
-  return StdStringFromNSString(osName);
-}
-
-std::string GetSystemVersionAsString() {
-  NSString* osVersion = [[UIDevice currentDevice] systemVersion];
-  return StdStringFromNSString(osVersion);
-}
-
-double GetSystemVersion() {
-  static dispatch_once_t once_token;
-  static double system_version;
-  dispatch_once(&once_token, ^{
-    system_version = [UIDevice currentDevice].systemVersion.doubleValue;
-  });
-  return system_version;
-}
-
-std::string GetDeviceType() {
-  NSString* deviceModel = [[UIDevice currentDevice] model];
-  return StdStringFromNSString(deviceModel);
-}
-#endif
-
-std::string GetDeviceName() {
-  size_t size;
-  sysctlbyname("hw.machine", NULL, &size, NULL, 0);
-  std::unique_ptr<char[]> machine;
-  machine.reset(new char[size]);
-  sysctlbyname("hw.machine", machine.get(), &size, NULL, 0);
-  return std::string(machine.get());
-}
-
-std::string GetProcessName() {
-  NSString* processName = [NSProcessInfo processInfo].processName;
-  return StdStringFromNSString(processName);
-}
-
-int GetProcessID() {
-  return [NSProcessInfo processInfo].processIdentifier;
-}
-
-std::string GetOSVersionString() {
-  NSString* osVersion =
-      [NSProcessInfo processInfo].operatingSystemVersionString;
-  return StdStringFromNSString(osVersion);
-}
-
-int GetProcessorCount() {
-  return [NSProcessInfo processInfo].processorCount;
-}
-
-#if defined(__IPHONE_9_0) && defined(__IPHONE_OS_VERSION_MAX_ALLOWED) \
-    && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_9_0
-bool GetLowPowerModeEnabled() {
-  if (isOperatingSystemAtLeastVersion(9.0)) {
-    // lowPoweredModeEnabled is only available on iOS9+.
-    return [NSProcessInfo processInfo].lowPowerModeEnabled;
-  }
-  LOG(LS_WARNING) << "webrtc::ios::GetLowPowerModeEnabled() is not "
-                     "supported. Requires at least iOS 9.0";
-  return false;
-}
-#endif
-
-}  // namespace ios
-}  // namespace webrtc
-
diff --git a/sdk/objc/Framework/Classes/Metal/RTCMTLI420Renderer.h b/sdk/objc/Framework/Classes/Metal/RTCMTLI420Renderer.h
deleted file mode 100644
index e5987fe..0000000
--- a/sdk/objc/Framework/Classes/Metal/RTCMTLI420Renderer.h
+++ /dev/null
@@ -1,17 +0,0 @@
-/*
- *  Copyright 2017 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.
- */
-
-#import <Foundation/Foundation.h>
-
-#import "RTCMTLRenderer.h"
-
-NS_AVAILABLE(10_11, 9_0)
-@interface RTCMTLI420Renderer : RTCMTLRenderer
-@end
diff --git a/sdk/objc/Framework/Classes/Metal/RTCMTLI420Renderer.mm b/sdk/objc/Framework/Classes/Metal/RTCMTLI420Renderer.mm
deleted file mode 100644
index 027db05..0000000
--- a/sdk/objc/Framework/Classes/Metal/RTCMTLI420Renderer.mm
+++ /dev/null
@@ -1,152 +0,0 @@
-/*
- *  Copyright 2017 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.
- */
-
-#import "RTCMTLI420Renderer.h"
-#import "WebRTC/RTCVideoFrameBuffer.h"
-
-#import <Metal/Metal.h>
-#import <MetalKit/MetalKit.h>
-
-#import "WebRTC/RTCLogging.h"
-#import "WebRTC/RTCVideoFrame.h"
-
-#import "RTCMTLRenderer+Private.h"
-
-#define MTL_STRINGIFY(s) @ #s
-
-static NSString *const shaderSource = MTL_STRINGIFY(
-    using namespace metal; typedef struct {
-      packed_float2 position;
-      packed_float2 texcoord;
-    } Vertex;
-
-    typedef struct {
-      float4 position[[position]];
-      float2 texcoord;
-    } Varyings;
-
-    vertex Varyings vertexPassthrough(device Vertex * verticies[[buffer(0)]],
-                                      unsigned int vid[[vertex_id]]) {
-      Varyings out;
-      device Vertex &v = verticies[vid];
-      out.position = float4(float2(v.position), 0.0, 1.0);
-      out.texcoord = v.texcoord;
-
-      return out;
-    }
-
-    fragment half4 fragmentColorConversion(
-        Varyings in[[stage_in]], texture2d<float, access::sample> textureY[[texture(0)]],
-        texture2d<float, access::sample> textureU[[texture(1)]],
-        texture2d<float, access::sample> textureV[[texture(2)]]) {
-      constexpr sampler s(address::clamp_to_edge, filter::linear);
-      float y;
-      float u;
-      float v;
-      float r;
-      float g;
-      float b;
-      // Conversion for YUV to rgb from http://www.fourcc.org/fccyvrgb.php
-      y = textureY.sample(s, in.texcoord).r;
-      u = textureU.sample(s, in.texcoord).r;
-      v = textureV.sample(s, in.texcoord).r;
-      u = u - 0.5;
-      v = v - 0.5;
-      r = y + 1.403 * v;
-      g = y - 0.344 * u - 0.714 * v;
-      b = y + 1.770 * u;
-
-      float4 out = float4(r, g, b, 1.0);
-
-      return half4(out);
-    });
-
-@implementation RTCMTLI420Renderer {
-  // Textures.
-  id<MTLTexture> _yTexture;
-  id<MTLTexture> _uTexture;
-  id<MTLTexture> _vTexture;
-
-  MTLTextureDescriptor *_descriptor;
-  MTLTextureDescriptor *_chromaDescriptor;
-
-  int _width;
-  int _height;
-  int _chromaWidth;
-  int _chromaHeight;
-}
-
-#pragma mark - Virtual
-
-- (NSString *)shaderSource {
-  return shaderSource;
-}
-
-- (BOOL)setupTexturesForFrame:(nonnull RTCVideoFrame *)frame {
-  [super setupTexturesForFrame:frame];
-
-  id<MTLDevice> device = [self currentMetalDevice];
-  if (!device) {
-    return NO;
-  }
-
-  id<RTCI420Buffer> buffer = [frame.buffer toI420];
-
-  // Luma (y) texture.
-  if (!_descriptor || (_width != frame.width && _height != frame.height)) {
-    _width = frame.width;
-    _height = frame.height;
-    _descriptor = [MTLTextureDescriptor texture2DDescriptorWithPixelFormat:MTLPixelFormatR8Unorm
-                                                                     width:_width
-                                                                    height:_height
-                                                                 mipmapped:NO];
-    _descriptor.usage = MTLTextureUsageShaderRead;
-    _yTexture = [device newTextureWithDescriptor:_descriptor];
-  }
-
-  // Chroma (u,v) textures
-  [_yTexture replaceRegion:MTLRegionMake2D(0, 0, _width, _height)
-               mipmapLevel:0
-                 withBytes:buffer.dataY
-               bytesPerRow:buffer.strideY];
-
-  if (!_chromaDescriptor ||
-      (_chromaWidth != frame.width / 2 && _chromaHeight != frame.height / 2)) {
-    _chromaWidth = frame.width / 2;
-    _chromaHeight = frame.height / 2;
-    _chromaDescriptor =
-        [MTLTextureDescriptor texture2DDescriptorWithPixelFormat:MTLPixelFormatR8Unorm
-                                                           width:_chromaWidth
-                                                          height:_chromaHeight
-                                                       mipmapped:NO];
-    _chromaDescriptor.usage = MTLTextureUsageShaderRead;
-    _uTexture = [device newTextureWithDescriptor:_chromaDescriptor];
-    _vTexture = [device newTextureWithDescriptor:_chromaDescriptor];
-  }
-
-  [_uTexture replaceRegion:MTLRegionMake2D(0, 0, _chromaWidth, _chromaHeight)
-               mipmapLevel:0
-                 withBytes:buffer.dataU
-               bytesPerRow:buffer.strideU];
-  [_vTexture replaceRegion:MTLRegionMake2D(0, 0, _chromaWidth, _chromaHeight)
-               mipmapLevel:0
-                 withBytes:buffer.dataV
-               bytesPerRow:buffer.strideV];
-
-  return (_uTexture != nil) && (_yTexture != nil) && (_vTexture != nil);
-}
-
-- (void)uploadTexturesToRenderEncoder:(id<MTLRenderCommandEncoder>)renderEncoder {
-  [renderEncoder setFragmentTexture:_yTexture atIndex:0];
-  [renderEncoder setFragmentTexture:_uTexture atIndex:1];
-  [renderEncoder setFragmentTexture:_vTexture atIndex:2];
-}
-
-@end
diff --git a/sdk/objc/Framework/Classes/Metal/RTCMTLNSVideoView.m b/sdk/objc/Framework/Classes/Metal/RTCMTLNSVideoView.m
deleted file mode 100644
index ff23bc6..0000000
--- a/sdk/objc/Framework/Classes/Metal/RTCMTLNSVideoView.m
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- *  Copyright 2017 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.
- */
-
-#import "WebRTC/RTCMTLNSVideoView.h"
-
-#import <Metal/Metal.h>
-#import <MetalKit/MetalKit.h>
-
-#import "WebRTC/RTCVideoFrame.h"
-
-#import "RTCMTLI420Renderer.h"
-
-@interface RTCMTLNSVideoView ()<MTKViewDelegate>
-@property(nonatomic) id<RTCMTLRenderer> renderer;
-@property(nonatomic, strong) MTKView *metalView;
-@property(atomic, strong) RTCVideoFrame *videoFrame;
-@end
-
-@implementation RTCMTLNSVideoView {
-  id<RTCMTLRenderer> _renderer;
-}
-
-@synthesize renderer = _renderer;
-@synthesize metalView = _metalView;
-@synthesize videoFrame = _videoFrame;
-
-- (instancetype)initWithFrame:(CGRect)frameRect {
-  self = [super initWithFrame:frameRect];
-  if (self) {
-    [self configure];
-  }
-  return self;
-}
-
-- (instancetype)initWithCoder:(NSCoder *)aCoder {
-  self = [super initWithCoder:aCoder];
-  if (self) {
-    [self configure];
-  }
-  return self;
-}
-
-#pragma mark - Private
-
-+ (BOOL)isMetalAvailable {
-  return [MTLCopyAllDevices() count] > 0;
-}
-
-- (void)configure {
-  if ([[self class] isMetalAvailable]) {
-    _metalView = [[MTKView alloc] initWithFrame:self.bounds];
-    [self addSubview:_metalView];
-    _metalView.layerContentsPlacement = NSViewLayerContentsPlacementScaleProportionallyToFit;
-    _metalView.translatesAutoresizingMaskIntoConstraints = NO;
-    _metalView.framebufferOnly = YES;
-    _metalView.delegate = self;
-
-    _renderer = [[RTCMTLI420Renderer alloc] init];
-    if (![(RTCMTLI420Renderer *)_renderer addRenderingDestination:_metalView]) {
-      _renderer = nil;
-    };
-  }
-}
-
-- (void)updateConstraints {
-  NSDictionary *views = NSDictionaryOfVariableBindings(_metalView);
-
-  NSArray *constraintsHorizontal =
-      [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-0-[_metalView]-0-|"
-                                              options:0
-                                              metrics:nil
-                                                views:views];
-  [self addConstraints:constraintsHorizontal];
-
-  NSArray *constraintsVertical =
-      [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-0-[_metalView]-0-|"
-                                              options:0
-                                              metrics:nil
-                                                views:views];
-  [self addConstraints:constraintsVertical];
-  [super updateConstraints];
-}
-
-#pragma mark - MTKViewDelegate methods
-- (void)drawInMTKView:(nonnull MTKView *)view {
-  if (self.videoFrame == nil) {
-    return;
-  }
-  if (view == self.metalView) {
-    [_renderer drawFrame:self.videoFrame];
-  }
-}
-
-- (void)mtkView:(MTKView *)view drawableSizeWillChange:(CGSize)size {
-}
-
-#pragma mark - RTCVideoRenderer
-
-- (void)setSize:(CGSize)size {
-  _metalView.drawableSize = size;
-  [_metalView draw];
-}
-
-- (void)renderFrame:(nullable RTCVideoFrame *)frame {
-  if (frame == nil) {
-    return;
-  }
-  self.videoFrame = [frame newI420VideoFrame];
-}
-
-@end
diff --git a/sdk/objc/Framework/Classes/Metal/RTCMTLNV12Renderer.h b/sdk/objc/Framework/Classes/Metal/RTCMTLNV12Renderer.h
deleted file mode 100644
index 866b7ea..0000000
--- a/sdk/objc/Framework/Classes/Metal/RTCMTLNV12Renderer.h
+++ /dev/null
@@ -1,18 +0,0 @@
-/*
- *  Copyright 2017 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.
- */
-
-#import <Foundation/Foundation.h>
-
-#import "RTCMTLRenderer.h"
-
-NS_AVAILABLE(10_11, 9_0)
-@interface RTCMTLNV12Renderer : RTCMTLRenderer
-
-@end
diff --git a/sdk/objc/Framework/Classes/Metal/RTCMTLNV12Renderer.mm b/sdk/objc/Framework/Classes/Metal/RTCMTLNV12Renderer.mm
deleted file mode 100644
index 70ecf54..0000000
--- a/sdk/objc/Framework/Classes/Metal/RTCMTLNV12Renderer.mm
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
- *  Copyright 2017 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.
- */
-
-#import "RTCMTLNV12Renderer.h"
-
-#import <Metal/Metal.h>
-#import <MetalKit/MetalKit.h>
-
-#import "WebRTC/RTCLogging.h"
-#import "WebRTC/RTCVideoFrame.h"
-#import "WebRTC/RTCVideoFrameBuffer.h"
-
-#import "RTCMTLRenderer+Private.h"
-
-#define MTL_STRINGIFY(s) @ #s
-
-static NSString *const shaderSource = MTL_STRINGIFY(
-    using namespace metal; typedef struct {
-      packed_float2 position;
-      packed_float2 texcoord;
-    } Vertex;
-
-    typedef struct {
-      float4 position[[position]];
-      float2 texcoord;
-    } Varyings;
-
-    vertex Varyings vertexPassthrough(device Vertex * verticies[[buffer(0)]],
-                                      unsigned int vid[[vertex_id]]) {
-      Varyings out;
-      device Vertex &v = verticies[vid];
-      out.position = float4(float2(v.position), 0.0, 1.0);
-      out.texcoord = v.texcoord;
-      return out;
-    }
-
-    // Receiving YCrCb textures.
-    fragment half4 fragmentColorConversion(
-        Varyings in[[stage_in]], texture2d<float, access::sample> textureY[[texture(0)]],
-        texture2d<float, access::sample> textureCbCr[[texture(1)]]) {
-      constexpr sampler s(address::clamp_to_edge, filter::linear);
-      float y;
-      float2 uv;
-      y = textureY.sample(s, in.texcoord).r;
-      uv = textureCbCr.sample(s, in.texcoord).rg - float2(0.5, 0.5);
-
-      // Conversion for YUV to rgb from http://www.fourcc.org/fccyvrgb.php
-      float4 out = float4(y + 1.403 * uv.y, y - 0.344 * uv.x - 0.714 * uv.y, y + 1.770 * uv.x, 1.0);
-
-      return half4(out);
-    });
-
-@implementation RTCMTLNV12Renderer {
-  // Textures.
-  CVMetalTextureCacheRef _textureCache;
-  id<MTLTexture> _yTexture;
-  id<MTLTexture> _CrCbTexture;
-}
-
-- (BOOL)addRenderingDestination:(__kindof MTKView *)view {
-  if ([super addRenderingDestination:view]) {
-    [self initializeTextureCache];
-    return YES;
-  }
-  return NO;
-}
-
-- (void)initializeTextureCache {
-  CVReturn status = CVMetalTextureCacheCreate(kCFAllocatorDefault, nil, [self currentMetalDevice],
-                                              nil, &_textureCache);
-  if (status != kCVReturnSuccess) {
-    RTCLogError(@"Metal: Failed to initialize metal texture cache. Return status is %d", status);
-  }
-}
-
-- (NSString *)shaderSource {
-  return shaderSource;
-}
-
-- (BOOL)setupTexturesForFrame:(nonnull RTCVideoFrame *)frame {
-  [super setupTexturesForFrame:frame];
-  CVPixelBufferRef pixelBuffer = ((RTCCVPixelBuffer *)frame.buffer).pixelBuffer;
-
-  id<MTLTexture> lumaTexture = nil;
-  id<MTLTexture> chromaTexture = nil;
-  CVMetalTextureRef outTexture = nullptr;
-
-  // Luma (y) texture.
-  int lumaWidth = CVPixelBufferGetWidthOfPlane(pixelBuffer, 0);
-  int lumaHeight = CVPixelBufferGetHeightOfPlane(pixelBuffer, 0);
-
-  int indexPlane = 0;
-  CVReturn result = CVMetalTextureCacheCreateTextureFromImage(
-      kCFAllocatorDefault, _textureCache, pixelBuffer, nil, MTLPixelFormatR8Unorm, lumaWidth,
-      lumaHeight, indexPlane, &outTexture);
-
-  if (result == kCVReturnSuccess) {
-    lumaTexture = CVMetalTextureGetTexture(outTexture);
-  }
-
-  // Same as CFRelease except it can be passed NULL without crashing.
-  CVBufferRelease(outTexture);
-  outTexture = nullptr;
-
-  // Chroma (CrCb) texture.
-  indexPlane = 1;
-  result = CVMetalTextureCacheCreateTextureFromImage(
-      kCFAllocatorDefault, _textureCache, pixelBuffer, nil, MTLPixelFormatRG8Unorm, lumaWidth / 2,
-      lumaHeight / 2, indexPlane, &outTexture);
-  if (result == kCVReturnSuccess) {
-    chromaTexture = CVMetalTextureGetTexture(outTexture);
-  }
-  CVBufferRelease(outTexture);
-
-  if (lumaTexture != nil && chromaTexture != nil) {
-    _yTexture = lumaTexture;
-    _CrCbTexture = chromaTexture;
-    return YES;
-  }
-  return NO;
-}
-
-- (void)uploadTexturesToRenderEncoder:(id<MTLRenderCommandEncoder>)renderEncoder {
-  [renderEncoder setFragmentTexture:_yTexture atIndex:0];
-  [renderEncoder setFragmentTexture:_CrCbTexture atIndex:1];
-}
-
-@end
diff --git a/sdk/objc/Framework/Classes/Metal/RTCMTLRenderer+Private.h b/sdk/objc/Framework/Classes/Metal/RTCMTLRenderer+Private.h
deleted file mode 100644
index dfeb87b..0000000
--- a/sdk/objc/Framework/Classes/Metal/RTCMTLRenderer+Private.h
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- *  Copyright 2017 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.
- */
-
-#import <Metal/Metal.h>
-#import "RTCMTLRenderer.h"
-
-NS_ASSUME_NONNULL_BEGIN
-@interface RTCMTLRenderer (Private)
-- (nullable id<MTLDevice>)currentMetalDevice;
-- (NSString *)shaderSource;
-- (BOOL)setupTexturesForFrame:(nonnull RTCVideoFrame *)frame;
-- (void)uploadTexturesToRenderEncoder:(id<MTLRenderCommandEncoder>)renderEncoder;
-@end
-NS_ASSUME_NONNULL_END
diff --git a/sdk/objc/Framework/Classes/Metal/RTCMTLRenderer.h b/sdk/objc/Framework/Classes/Metal/RTCMTLRenderer.h
deleted file mode 100644
index e279b09..0000000
--- a/sdk/objc/Framework/Classes/Metal/RTCMTLRenderer.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- *  Copyright 2017 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.
- */
-
-#import <Foundation/Foundation.h>
-#if TARGET_OS_IPHONE
-#import <UIKit/UIKit.h>
-#else
-#import <AppKit/AppKit.h>
-#endif
-
-#import "WebRTC/RTCVideoFrame.h"
-
-NS_ASSUME_NONNULL_BEGIN
-/**
- * Protocol defining ability to render RTCVideoFrame in Metal enabled views.
- */
-@protocol RTCMTLRenderer<NSObject>
-
-/**
- * Method to be implemented to perform actual rendering of the provided frame.
- *
- * @param frame The frame to be rendered.
- */
-- (void)drawFrame:(RTCVideoFrame *)frame;
-
-/**
- * Sets the provided view as rendering destination if possible.
- *
- * If not possible method returns NO and callers of the method are responisble for performing
- * cleanups.
- */
-
-#if TARGET_OS_IOS
-- (BOOL)addRenderingDestination:(__kindof UIView *)view;
-#else
-- (BOOL)addRenderingDestination:(__kindof NSView *)view;
-#endif
-
-@end
-
-/**
- * Implementation of RTCMTLRenderer protocol for rendering native nv12 video frames.
- */
-NS_AVAILABLE(10_11, 9_0)
-@interface RTCMTLRenderer : NSObject<RTCMTLRenderer>
-@end
-
-NS_ASSUME_NONNULL_END
diff --git a/sdk/objc/Framework/Classes/Metal/RTCMTLRenderer.mm b/sdk/objc/Framework/Classes/Metal/RTCMTLRenderer.mm
deleted file mode 100644
index 1c60ecc..0000000
--- a/sdk/objc/Framework/Classes/Metal/RTCMTLRenderer.mm
+++ /dev/null
@@ -1,244 +0,0 @@
-/*
- *  Copyright 2017 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.
- */
-
-#import "RTCMTLRenderer+Private.h"
-
-#import <Metal/Metal.h>
-#import <MetalKit/MetalKit.h>
-
-#import "WebRTC/RTCLogging.h"
-#import "WebRTC/RTCVideoFrame.h"
-
-#include "webrtc/api/video/video_rotation.h"
-#include "webrtc/rtc_base/checks.h"
-
-// As defined in shaderSource.
-static NSString *const vertexFunctionName = @"vertexPassthrough";
-static NSString *const fragmentFunctionName = @"fragmentColorConversion";
-
-static NSString *const pipelineDescriptorLabel = @"RTCPipeline";
-static NSString *const commandBufferLabel = @"RTCCommandBuffer";
-static NSString *const renderEncoderLabel = @"RTCEncoder";
-static NSString *const renderEncoderDebugGroup = @"RTCDrawFrame";
-
-static const float cubeVertexData[64] = {
-    -1.0, -1.0, 0.0, 1.0, 1.0, -1.0, 1.0, 1.0, -1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 1.0, 0.0,
-
-    // rotation = 90, offset = 16.
-    -1.0, -1.0, 1.0, 1.0, 1.0, -1.0, 1.0, 0.0, -1.0, 1.0, 0.0, 1.0, 1.0, 1.0, 0.0, 0.0,
-
-    // rotation = 180, offset = 32.
-    -1.0, -1.0, 1.0, 0.0, 1.0, -1.0, 0.0, 0.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 1.0,
-
-    // rotation = 270, offset = 48.
-    -1.0, -1.0, 0.0, 0.0, 1.0, -1.0, 0.0, 1.0, -1.0, 1.0, 1.0, 0.0, 1.0, 1.0, 1.0, 1.0,
-};
-
-static inline int offsetForRotation(RTCVideoRotation rotation) {
-  switch (rotation) {
-    case RTCVideoRotation_0:
-      return 0;
-    case RTCVideoRotation_90:
-      return 16;
-    case RTCVideoRotation_180:
-      return 32;
-    case RTCVideoRotation_270:
-      return 48;
-  }
-  return 0;
-}
-
-// The max number of command buffers in flight (submitted to GPU).
-// For now setting it up to 1.
-// In future we might use triple buffering method if it improves performance.
-static const NSInteger kMaxInflightBuffers = 1;
-
-@implementation RTCMTLRenderer {
-  __kindof MTKView *_view;
-
-  // Controller.
-  dispatch_semaphore_t _inflight_semaphore;
-
-  // Renderer.
-  id<MTLDevice> _device;
-  id<MTLCommandQueue> _commandQueue;
-  id<MTLLibrary> _defaultLibrary;
-  id<MTLRenderPipelineState> _pipelineState;
-
-  // Buffers.
-  id<MTLBuffer> _vertexBuffer;
-
-  // RTC Frame parameters.
-  int _offset;
-}
-
-- (instancetype)init {
-  if (self = [super init]) {
-    // _offset of 0 is equal to rotation of 0.
-    _offset = 0;
-    _inflight_semaphore = dispatch_semaphore_create(kMaxInflightBuffers);
-  }
-
-  return self;
-}
-
-- (BOOL)addRenderingDestination:(__kindof MTKView *)view {
-  return [self setupWithView:view];
-}
-
-#pragma mark - Private
-
-- (BOOL)setupWithView:(__kindof MTKView *)view {
-  BOOL success = NO;
-  if ([self setupMetal]) {
-    [self setupView:view];
-    [self loadAssets];
-    [self setupBuffers];
-    success = YES;
-  }
-  return success;
-}
-#pragma mark - Inheritance
-
-- (id<MTLDevice>)currentMetalDevice {
-  return _device;
-}
-
-- (NSString *)shaderSource {
-  RTC_NOTREACHED() << "Virtual method not implemented in subclass.";
-  return nil;
-}
-
-- (void)uploadTexturesToRenderEncoder:(id<MTLRenderCommandEncoder>)renderEncoder {
-  RTC_NOTREACHED() << "Virtual method not implemented in subclass.";
-}
-
-- (BOOL)setupTexturesForFrame:(nonnull RTCVideoFrame *)frame {
-  _offset = offsetForRotation(frame.rotation);
-  return YES;
-}
-
-#pragma mark - GPU methods
-
-- (BOOL)setupMetal {
-  // Set the view to use the default device.
-  _device = MTLCreateSystemDefaultDevice();
-  if (!_device) {
-    return NO;
-  }
-
-  // Create a new command queue.
-  _commandQueue = [_device newCommandQueue];
-
-  // Load metal library from source.
-  NSError *libraryError = nil;
-
-  id<MTLLibrary> sourceLibrary =
-      [_device newLibraryWithSource:[self shaderSource] options:NULL error:&libraryError];
-
-  if (libraryError) {
-    RTCLogError(@"Metal: Library with source failed\n%@", libraryError);
-    return NO;
-  }
-
-  if (!sourceLibrary) {
-    RTCLogError(@"Metal: Failed to load library. %@", libraryError);
-    return NO;
-  }
-  _defaultLibrary = sourceLibrary;
-
-  return YES;
-}
-
-- (void)setupView:(__kindof MTKView *)view {
-  view.device = _device;
-
-  view.preferredFramesPerSecond = 30;
-  view.autoResizeDrawable = NO;
-
-  // We need to keep reference to the view as it's needed down the rendering pipeline.
-  _view = view;
-}
-
-- (void)loadAssets {
-  id<MTLFunction> vertexFunction = [_defaultLibrary newFunctionWithName:vertexFunctionName];
-  id<MTLFunction> fragmentFunction = [_defaultLibrary newFunctionWithName:fragmentFunctionName];
-
-  MTLRenderPipelineDescriptor *pipelineDescriptor = [[MTLRenderPipelineDescriptor alloc] init];
-  pipelineDescriptor.label = pipelineDescriptorLabel;
-  pipelineDescriptor.vertexFunction = vertexFunction;
-  pipelineDescriptor.fragmentFunction = fragmentFunction;
-  pipelineDescriptor.colorAttachments[0].pixelFormat = _view.colorPixelFormat;
-  pipelineDescriptor.depthAttachmentPixelFormat = MTLPixelFormatInvalid;
-  NSError *error = nil;
-  _pipelineState = [_device newRenderPipelineStateWithDescriptor:pipelineDescriptor error:&error];
-
-  if (!_pipelineState) {
-    RTCLogError(@"Metal: Failed to create pipeline state. %@", error);
-  }
-}
-
-- (void)setupBuffers {
-  _vertexBuffer = [_device newBufferWithBytes:cubeVertexData
-                                       length:sizeof(cubeVertexData)
-                                      options:MTLResourceOptionCPUCacheModeDefault];
-}
-
-- (void)render {
-  // Wait until the inflight (curently sent to GPU) command buffer
-  // has completed the GPU work.
-  dispatch_semaphore_wait(_inflight_semaphore, DISPATCH_TIME_FOREVER);
-
-  id<MTLCommandBuffer> commandBuffer = [_commandQueue commandBuffer];
-  commandBuffer.label = commandBufferLabel;
-
-  __block dispatch_semaphore_t block_semaphore = _inflight_semaphore;
-  [commandBuffer addCompletedHandler:^(id<MTLCommandBuffer> _Nonnull) {
-    // GPU work completed.
-    dispatch_semaphore_signal(block_semaphore);
-  }];
-
-  MTLRenderPassDescriptor *renderPassDescriptor = _view.currentRenderPassDescriptor;
-  if (renderPassDescriptor) {  // Valid drawable.
-    id<MTLRenderCommandEncoder> renderEncoder =
-        [commandBuffer renderCommandEncoderWithDescriptor:renderPassDescriptor];
-    renderEncoder.label = renderEncoderLabel;
-
-    // Set context state.
-    [renderEncoder pushDebugGroup:renderEncoderDebugGroup];
-    [renderEncoder setRenderPipelineState:_pipelineState];
-    [renderEncoder setVertexBuffer:_vertexBuffer offset:_offset * sizeof(float) atIndex:0];
-    [self uploadTexturesToRenderEncoder:renderEncoder];
-
-    [renderEncoder drawPrimitives:MTLPrimitiveTypeTriangleStrip
-                      vertexStart:0
-                      vertexCount:4
-                    instanceCount:1];
-    [renderEncoder popDebugGroup];
-    [renderEncoder endEncoding];
-
-    [commandBuffer presentDrawable:_view.currentDrawable];
-  }
-
-  // CPU work is completed, GPU work can be started.
-  [commandBuffer commit];
-}
-
-#pragma mark - RTCMTLRenderer
-
-- (void)drawFrame:(RTCVideoFrame *)frame {
-  @autoreleasepool {
-    if ([self setupTexturesForFrame:frame]) {
-      [self render];
-    }
-  }
-}
-
-@end
diff --git a/sdk/objc/Framework/Classes/Metal/RTCMTLVideoView.m b/sdk/objc/Framework/Classes/Metal/RTCMTLVideoView.m
deleted file mode 100644
index e36cb3a..0000000
--- a/sdk/objc/Framework/Classes/Metal/RTCMTLVideoView.m
+++ /dev/null
@@ -1,152 +0,0 @@
-/*
- *  Copyright 2017 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.
- */
-
-#import "WebRTC/RTCMTLVideoView.h"
-
-#import <Metal/Metal.h>
-#import <MetalKit/MetalKit.h>
-
-#import "WebRTC/RTCLogging.h"
-#import "WebRTC/RTCVideoFrame.h"
-#import "WebRTC/RTCVideoFrameBuffer.h"
-
-#import "RTCMTLI420Renderer.h"
-#import "RTCMTLNV12Renderer.h"
-
-// To avoid unreconized symbol linker errors, we're taking advantage of the objc runtime.
-// Linking errors occur when compiling for architectures that don't support Metal.
-#define MTKViewClass NSClassFromString(@"MTKView")
-#define RTCMTLNV12RendererClass NSClassFromString(@"RTCMTLNV12Renderer")
-#define RTCMTLI420RendererClass NSClassFromString(@"RTCMTLI420Renderer")
-
-@interface RTCMTLVideoView () <MTKViewDelegate>
-@property(nonatomic, strong) RTCMTLI420Renderer *rendererI420;
-@property(nonatomic, strong) RTCMTLNV12Renderer *rendererNV12;
-@property(nonatomic, strong) MTKView *metalView;
-@property(atomic, strong) RTCVideoFrame *videoFrame;
-@end
-
-@implementation RTCMTLVideoView
-
-@synthesize rendererI420 = _rendererI420;
-@synthesize rendererNV12 = _rendererNV12;
-@synthesize metalView = _metalView;
-@synthesize videoFrame = _videoFrame;
-
-- (instancetype)initWithFrame:(CGRect)frameRect {
-  self = [super initWithFrame:frameRect];
-  if (self) {
-    [self configure];
-  }
-  return self;
-}
-
-- (instancetype)initWithCoder:(NSCoder *)aCoder {
-  self = [super initWithCoder:aCoder];
-  if (self) {
-    [self configure];
-  }
-  return self;
-}
-
-#pragma mark - Private
-
-+ (BOOL)isMetalAvailable {
-#if defined(RTC_SUPPORTS_METAL)
-  return YES;
-#else
-  return NO;
-#endif
-}
-
-+ (MTKView *)createMetalView:(CGRect)frame {
-  MTKView *view = [[MTKViewClass alloc] initWithFrame:frame];
-  return view;
-}
-
-+ (RTCMTLNV12Renderer *)createNV12Renderer {
-  return [[RTCMTLNV12RendererClass alloc] init];
-}
-
-+ (RTCMTLI420Renderer *)createI420Renderer {
-  return [[RTCMTLI420RendererClass alloc] init];
-}
-
-- (void)configure {
-  NSAssert([RTCMTLVideoView isMetalAvailable], @"Metal not availiable on this device");
-
-  _metalView = [RTCMTLVideoView createMetalView:self.bounds];
-  [self configureMetalView];
-}
-
-- (void)configureMetalView {
-  if (_metalView) {
-    _metalView.delegate = self;
-    [self addSubview:_metalView];
-    _metalView.contentMode = UIViewContentModeScaleAspectFit;
-    _metalView.translatesAutoresizingMaskIntoConstraints = NO;
-    UILayoutGuide *margins = self.layoutMarginsGuide;
-    [_metalView.topAnchor constraintEqualToAnchor:margins.topAnchor].active = YES;
-    [_metalView.bottomAnchor constraintEqualToAnchor:margins.bottomAnchor].active = YES;
-    [_metalView.leftAnchor constraintEqualToAnchor:margins.leftAnchor].active = YES;
-    [_metalView.rightAnchor constraintEqualToAnchor:margins.rightAnchor].active = YES;
-  }
-}
-
-#pragma mark - MTKViewDelegate methods
-
-- (void)drawInMTKView:(nonnull MTKView *)view {
-  NSAssert(view == self.metalView, @"Receiving draw callbacks from foreign instance.");
-  if (!self.videoFrame) {
-    return;
-  }
-
-  id<RTCMTLRenderer> renderer = nil;
-  if ([self.videoFrame.buffer isKindOfClass:[RTCCVPixelBuffer class]]) {
-    if (!self.rendererNV12) {
-      self.rendererNV12 = [RTCMTLVideoView createNV12Renderer];
-      if (![self.rendererNV12 addRenderingDestination:self.metalView]) {
-        self.rendererNV12 = nil;
-        RTCLogError(@"Failed to create NV12 renderer");
-      }
-    }
-    renderer = self.rendererNV12;
-  } else {
-    if (!self.rendererI420) {
-      self.rendererI420 = [RTCMTLVideoView createI420Renderer];
-      if (![self.rendererI420 addRenderingDestination:self.metalView]) {
-        self.rendererI420 = nil;
-        RTCLogError(@"Failed to create I420 renderer");
-      }
-    }
-    renderer = self.rendererI420;
-  }
-
-  [renderer drawFrame:self.videoFrame];
-}
-
-- (void)mtkView:(MTKView *)view drawableSizeWillChange:(CGSize)size {
-}
-
-#pragma mark - RTCVideoRenderer
-
-- (void)setSize:(CGSize)size {
-  self.metalView.drawableSize = size;
-}
-
-- (void)renderFrame:(nullable RTCVideoFrame *)frame {
-  if (frame == nil) {
-    RTCLogInfo(@"Incoming frame is nil. Exiting render callback.");
-    return;
-  }
-  self.videoFrame = frame;
-}
-
-@end
diff --git a/sdk/objc/Framework/Classes/PeerConnection/OWNERS b/sdk/objc/Framework/Classes/PeerConnection/OWNERS
deleted file mode 100644
index a32f041..0000000
--- a/sdk/objc/Framework/Classes/PeerConnection/OWNERS
+++ /dev/null
@@ -1 +0,0 @@
-deadbeef@webrtc.org
diff --git a/sdk/objc/Framework/Classes/PeerConnection/RTCAVFoundationVideoSource+Private.h b/sdk/objc/Framework/Classes/PeerConnection/RTCAVFoundationVideoSource+Private.h
deleted file mode 100644
index 7a4de08..0000000
--- a/sdk/objc/Framework/Classes/PeerConnection/RTCAVFoundationVideoSource+Private.h
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-#import "WebRTC/RTCAVFoundationVideoSource.h"
-
-#include "avfoundationvideocapturer.h"
-
-NS_ASSUME_NONNULL_BEGIN
-
-@interface RTCAVFoundationVideoSource ()
-
-@property(nonatomic, readonly) webrtc::AVFoundationVideoCapturer *capturer;
-
-/** Initialize an RTCAVFoundationVideoSource with constraints. */
-- (instancetype)initWithFactory:(RTCPeerConnectionFactory *)factory
-                    constraints:(nullable RTCMediaConstraints *)constraints;
-
-@end
-
-NS_ASSUME_NONNULL_END
diff --git a/sdk/objc/Framework/Classes/PeerConnection/RTCAVFoundationVideoSource.mm b/sdk/objc/Framework/Classes/PeerConnection/RTCAVFoundationVideoSource.mm
deleted file mode 100644
index b004191..0000000
--- a/sdk/objc/Framework/Classes/PeerConnection/RTCAVFoundationVideoSource.mm
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-#import "RTCAVFoundationVideoSource+Private.h"
-
-#import "RTCMediaConstraints+Private.h"
-#import "RTCPeerConnectionFactory+Private.h"
-#import "RTCVideoSource+Private.h"
-
-@implementation RTCAVFoundationVideoSource {
-  webrtc::AVFoundationVideoCapturer *_capturer;
-}
-
-- (instancetype)initWithFactory:(RTCPeerConnectionFactory *)factory
-                    constraints:(RTCMediaConstraints *)constraints {
-  NSParameterAssert(factory);
-  // We pass ownership of the capturer to the source, but since we own
-  // the source, it should be ok to keep a raw pointer to the
-  // capturer.
-  _capturer = new webrtc::AVFoundationVideoCapturer();
-  rtc::scoped_refptr<webrtc::VideoTrackSourceInterface> source =
-      factory.nativeFactory->CreateVideoSource(
-          std::unique_ptr<cricket::VideoCapturer>(_capturer),
-          constraints.nativeConstraints.get());
-
-  return [super initWithNativeVideoSource:source];
-}
-
-- (void)adaptOutputFormatToWidth:(int)width
-                          height:(int)height
-                             fps:(int)fps {
-  self.capturer->AdaptOutputFormat(width, height, fps);
-}
-
-- (BOOL)canUseBackCamera {
-  return self.capturer->CanUseBackCamera();
-}
-
-- (BOOL)useBackCamera {
-  return self.capturer->GetUseBackCamera();
-}
-
-- (void)setUseBackCamera:(BOOL)useBackCamera {
-  self.capturer->SetUseBackCamera(useBackCamera);
-}
-
-- (AVCaptureSession *)captureSession {
-  return self.capturer->GetCaptureSession();
-}
-
-- (webrtc::AVFoundationVideoCapturer *)capturer {
-  return _capturer;
-}
-
-@end
diff --git a/sdk/objc/Framework/Classes/PeerConnection/RTCAudioSource+Private.h b/sdk/objc/Framework/Classes/PeerConnection/RTCAudioSource+Private.h
deleted file mode 100644
index 43aff02..0000000
--- a/sdk/objc/Framework/Classes/PeerConnection/RTCAudioSource+Private.h
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- *  Copyright 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.
- */
-
-#import "WebRTC/RTCAudioSource.h"
-
-#import "RTCMediaSource+Private.h"
-
-@interface RTCAudioSource ()
-
-/**
- * The AudioSourceInterface object passed to this RTCAudioSource during
- * construction.
- */
-@property(nonatomic, readonly) rtc::scoped_refptr<webrtc::AudioSourceInterface> nativeAudioSource;
-
-/** Initialize an RTCAudioSource from a native AudioSourceInterface. */
-- (instancetype)initWithNativeAudioSource:
-    (rtc::scoped_refptr<webrtc::AudioSourceInterface>)nativeAudioSource
-    NS_DESIGNATED_INITIALIZER;
-
-- (instancetype)initWithNativeMediaSource:
-    (rtc::scoped_refptr<webrtc::MediaSourceInterface>)nativeMediaSource
-                                     type:(RTCMediaSourceType)type NS_UNAVAILABLE;
-
-@end
diff --git a/sdk/objc/Framework/Classes/PeerConnection/RTCAudioSource.mm b/sdk/objc/Framework/Classes/PeerConnection/RTCAudioSource.mm
deleted file mode 100644
index 07b1cb5..0000000
--- a/sdk/objc/Framework/Classes/PeerConnection/RTCAudioSource.mm
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- *  Copyright 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.
- */
-
-#import "RTCAudioSource+Private.h"
-
-#include "webrtc/rtc_base/checks.h"
-
-@implementation RTCAudioSource {
-}
-
-@synthesize volume = _volume;
-@synthesize nativeAudioSource = _nativeAudioSource;
-
-- (instancetype)initWithNativeAudioSource:
-    (rtc::scoped_refptr<webrtc::AudioSourceInterface>)nativeAudioSource {
-  RTC_DCHECK(nativeAudioSource);
-  if (self = [super initWithNativeMediaSource:nativeAudioSource
-                                         type:RTCMediaSourceTypeAudio]) {
-    _nativeAudioSource = nativeAudioSource;
-  }
-  return self;
-}
-
-- (instancetype)initWithNativeMediaSource:
-    (rtc::scoped_refptr<webrtc::MediaSourceInterface>)nativeMediaSource
-                                     type:(RTCMediaSourceType)type {
-  RTC_NOTREACHED();
-  return nil;
-}
-
-- (NSString *)description {
-  NSString *stateString = [[self class] stringForState:self.state];
-  return [NSString stringWithFormat:@"RTCAudioSource( %p ): %@", self, stateString];
-}
-
-- (void)setVolume:(double)volume {
-  _volume = volume;
-  _nativeAudioSource->SetVolume(volume);
-}
-
-@end
diff --git a/sdk/objc/Framework/Classes/PeerConnection/RTCAudioTrack+Private.h b/sdk/objc/Framework/Classes/PeerConnection/RTCAudioTrack+Private.h
deleted file mode 100644
index ea14fb3..0000000
--- a/sdk/objc/Framework/Classes/PeerConnection/RTCAudioTrack+Private.h
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-#import "WebRTC/RTCAudioTrack.h"
-
-#include "webrtc/api/mediastreaminterface.h"
-
-NS_ASSUME_NONNULL_BEGIN
-
-@class RTCPeerConnectionFactory;
-@interface RTCAudioTrack ()
-
-/** AudioTrackInterface created or passed in at construction. */
-@property(nonatomic, readonly)
-    rtc::scoped_refptr<webrtc::AudioTrackInterface> nativeAudioTrack;
-
-/** Initialize an RTCAudioTrack with an id. */
-- (instancetype)initWithFactory:(RTCPeerConnectionFactory *)factory
-                         source:(RTCAudioSource *)source
-                        trackId:(NSString *)trackId;
-
-@end
-
-NS_ASSUME_NONNULL_END
diff --git a/sdk/objc/Framework/Classes/PeerConnection/RTCAudioTrack.mm b/sdk/objc/Framework/Classes/PeerConnection/RTCAudioTrack.mm
deleted file mode 100644
index d8a0d51..0000000
--- a/sdk/objc/Framework/Classes/PeerConnection/RTCAudioTrack.mm
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-#import "RTCAudioTrack+Private.h"
-
-#import "NSString+StdString.h"
-#import "RTCAudioSource+Private.h"
-#import "RTCMediaStreamTrack+Private.h"
-#import "RTCPeerConnectionFactory+Private.h"
-
-#include "webrtc/rtc_base/checks.h"
-
-@implementation RTCAudioTrack
-
-@synthesize source = _source;
-
-- (instancetype)initWithFactory:(RTCPeerConnectionFactory *)factory
-                         source:(RTCAudioSource *)source
-                        trackId:(NSString *)trackId {
-  RTC_DCHECK(factory);
-  RTC_DCHECK(source);
-  RTC_DCHECK(trackId.length);
-
-  std::string nativeId = [NSString stdStringForString:trackId];
-  rtc::scoped_refptr<webrtc::AudioTrackInterface> track =
-      factory.nativeFactory->CreateAudioTrack(nativeId, source.nativeAudioSource);
-  if ([self initWithNativeTrack:track type:RTCMediaStreamTrackTypeAudio]) {
-    _source = source;
-  }
-  return self;
-}
-
-- (instancetype)initWithNativeTrack:
-    (rtc::scoped_refptr<webrtc::MediaStreamTrackInterface>)nativeTrack
-                               type:(RTCMediaStreamTrackType)type {
-  NSParameterAssert(nativeTrack);
-  NSParameterAssert(type == RTCMediaStreamTrackTypeAudio);
-  return [super initWithNativeTrack:nativeTrack type:type];
-}
-
-
-- (RTCAudioSource *)source {
-  if (!_source) {
-    rtc::scoped_refptr<webrtc::AudioSourceInterface> source =
-        self.nativeAudioTrack->GetSource();
-    if (source) {
-      _source = [[RTCAudioSource alloc] initWithNativeAudioSource:source.get()];
-    }
-  }
-  return _source;
-}
-
-#pragma mark - Private
-
-- (rtc::scoped_refptr<webrtc::AudioTrackInterface>)nativeAudioTrack {
-  return static_cast<webrtc::AudioTrackInterface *>(self.nativeTrack.get());
-}
-
-@end
diff --git a/sdk/objc/Framework/Classes/PeerConnection/RTCCameraVideoCapturer.m b/sdk/objc/Framework/Classes/PeerConnection/RTCCameraVideoCapturer.m
deleted file mode 100644
index 9237484..0000000
--- a/sdk/objc/Framework/Classes/PeerConnection/RTCCameraVideoCapturer.m
+++ /dev/null
@@ -1,447 +0,0 @@
-/*
- *  Copyright 2017 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.
- */
-
-#import <Foundation/Foundation.h>
-
-#import "WebRTC/RTCCameraVideoCapturer.h"
-#import "WebRTC/RTCLogging.h"
-#import "WebRTC/RTCVideoFrameBuffer.h"
-
-#if TARGET_OS_IPHONE
-#import "WebRTC/UIDevice+RTCDevice.h"
-#endif
-
-#import "AVCaptureSession+DevicePosition.h"
-#import "RTCDispatcher+Private.h"
-
-const int64_t kNanosecondsPerSecond = 1000000000;
-
-static inline BOOL IsMediaSubTypeSupported(FourCharCode mediaSubType) {
-  return (mediaSubType == kCVPixelFormatType_420YpCbCr8PlanarFullRange ||
-          mediaSubType == kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange);
-}
-
-@interface RTCCameraVideoCapturer ()<AVCaptureVideoDataOutputSampleBufferDelegate>
-@property(nonatomic, readonly) dispatch_queue_t frameQueue;
-@end
-
-@implementation RTCCameraVideoCapturer {
-  AVCaptureVideoDataOutput *_videoDataOutput;
-  AVCaptureSession *_captureSession;
-  AVCaptureDevice *_currentDevice;
-  BOOL _hasRetriedOnFatalError;
-  BOOL _isRunning;
-  // Will the session be running once all asynchronous operations have been completed?
-  BOOL _willBeRunning;
-#if TARGET_OS_IPHONE
-  UIDeviceOrientation _orientation;
-#endif
-}
-
-@synthesize frameQueue = _frameQueue;
-@synthesize captureSession = _captureSession;
-
-- (instancetype)initWithDelegate:(__weak id<RTCVideoCapturerDelegate>)delegate {
-  if (self = [super initWithDelegate:delegate]) {
-    // Create the capture session and all relevant inputs and outputs. We need
-    // to do this in init because the application may want the capture session
-    // before we start the capturer for e.g. AVCapturePreviewLayer. All objects
-    // created here are retained until dealloc and never recreated.
-    if (![self setupCaptureSession]) {
-      return nil;
-    }
-    NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
-#if TARGET_OS_IPHONE
-    _orientation = UIDeviceOrientationPortrait;
-    [center addObserver:self
-               selector:@selector(deviceOrientationDidChange:)
-                   name:UIDeviceOrientationDidChangeNotification
-                 object:nil];
-    [center addObserver:self
-               selector:@selector(handleCaptureSessionInterruption:)
-                   name:AVCaptureSessionWasInterruptedNotification
-                 object:_captureSession];
-    [center addObserver:self
-               selector:@selector(handleCaptureSessionInterruptionEnded:)
-                   name:AVCaptureSessionInterruptionEndedNotification
-                 object:_captureSession];
-    [center addObserver:self
-               selector:@selector(handleApplicationDidBecomeActive:)
-                   name:UIApplicationDidBecomeActiveNotification
-                 object:[UIApplication sharedApplication]];
-#endif
-    [center addObserver:self
-               selector:@selector(handleCaptureSessionRuntimeError:)
-                   name:AVCaptureSessionRuntimeErrorNotification
-                 object:_captureSession];
-    [center addObserver:self
-               selector:@selector(handleCaptureSessionDidStartRunning:)
-                   name:AVCaptureSessionDidStartRunningNotification
-                 object:_captureSession];
-    [center addObserver:self
-               selector:@selector(handleCaptureSessionDidStopRunning:)
-                   name:AVCaptureSessionDidStopRunningNotification
-                 object:_captureSession];
-  }
-  return self;
-}
-
-- (void)dealloc {
-  NSAssert(
-      !_willBeRunning,
-      @"Session was still running in RTCCameraVideoCapturer dealloc. Forgot to call stopCapture?");
-  [[NSNotificationCenter defaultCenter] removeObserver:self];
-}
-
-+ (NSArray<AVCaptureDevice *> *)captureDevices {
-  return [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo];
-}
-
-+ (NSArray<AVCaptureDeviceFormat *> *)supportedFormatsForDevice:(AVCaptureDevice *)device {
-  NSMutableArray<AVCaptureDeviceFormat *> *eligibleDeviceFormats = [NSMutableArray array];
-
-  for (AVCaptureDeviceFormat *format in device.formats) {
-    // Filter out subTypes that we currently don't support in the stack
-    FourCharCode mediaSubType = CMFormatDescriptionGetMediaSubType(format.formatDescription);
-    if (IsMediaSubTypeSupported(mediaSubType)) {
-      [eligibleDeviceFormats addObject:format];
-    }
-  }
-
-  return eligibleDeviceFormats;
-}
-
-- (void)startCaptureWithDevice:(AVCaptureDevice *)device
-                        format:(AVCaptureDeviceFormat *)format
-                           fps:(NSInteger)fps {
-  _willBeRunning = YES;
-  [RTCDispatcher
-      dispatchAsyncOnType:RTCDispatcherTypeCaptureSession
-                    block:^{
-                      RTCLogInfo("startCaptureWithDevice %@ @ %ld fps", format, (long)fps);
-
-#if TARGET_OS_IPHONE
-                      [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
-#endif
-
-                      _currentDevice = device;
-
-                      NSError *error = nil;
-                      if (![_currentDevice lockForConfiguration:&error]) {
-                        RTCLogError(
-                            @"Failed to lock device %@. Error: %@", _currentDevice, error.userInfo);
-                        return;
-                      }
-                      [self reconfigureCaptureSessionInput];
-                      [self updateOrientation];
-                      [self updateDeviceCaptureFormat:format fps:fps];
-                      [_captureSession startRunning];
-                      [_currentDevice unlockForConfiguration];
-                      _isRunning = YES;
-                    }];
-}
-
-- (void)stopCapture {
-  _willBeRunning = NO;
-  [RTCDispatcher
-      dispatchAsyncOnType:RTCDispatcherTypeCaptureSession
-                    block:^{
-                      RTCLogInfo("Stop");
-                      _currentDevice = nil;
-                      for (AVCaptureDeviceInput *oldInput in [_captureSession.inputs copy]) {
-                        [_captureSession removeInput:oldInput];
-                      }
-                      [_captureSession stopRunning];
-
-#if TARGET_OS_IPHONE
-                      [[UIDevice currentDevice] endGeneratingDeviceOrientationNotifications];
-#endif
-                      _isRunning = NO;
-                    }];
-}
-
-#pragma mark iOS notifications
-
-#if TARGET_OS_IPHONE
-- (void)deviceOrientationDidChange:(NSNotification *)notification {
-  [RTCDispatcher dispatchAsyncOnType:RTCDispatcherTypeCaptureSession
-                               block:^{
-                                 [self updateOrientation];
-                               }];
-}
-#endif
-
-#pragma mark AVCaptureVideoDataOutputSampleBufferDelegate
-
-- (void)captureOutput:(AVCaptureOutput *)captureOutput
-    didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer
-           fromConnection:(AVCaptureConnection *)connection {
-  NSParameterAssert(captureOutput == _videoDataOutput);
-
-  if (CMSampleBufferGetNumSamples(sampleBuffer) != 1 || !CMSampleBufferIsValid(sampleBuffer) ||
-      !CMSampleBufferDataIsReady(sampleBuffer)) {
-    return;
-  }
-
-  CVPixelBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
-  if (pixelBuffer == nil) {
-    return;
-  }
-
-#if TARGET_OS_IPHONE
-  // Default to portrait orientation on iPhone.
-  RTCVideoRotation rotation = RTCVideoRotation_90;
-  BOOL usingFrontCamera = NO;
-  // Check the image's EXIF for the camera the image came from as the image could have been
-  // delayed as we set alwaysDiscardsLateVideoFrames to NO.
-  AVCaptureDevicePosition cameraPosition =
-      [AVCaptureSession devicePositionForSampleBuffer:sampleBuffer];
-  if (cameraPosition != AVCaptureDevicePositionUnspecified) {
-    usingFrontCamera = AVCaptureDevicePositionFront == cameraPosition;
-  } else {
-    AVCaptureDeviceInput *deviceInput =
-        (AVCaptureDeviceInput *)((AVCaptureInputPort *)connection.inputPorts.firstObject).input;
-    usingFrontCamera = AVCaptureDevicePositionFront == deviceInput.device.position;
-  }
-  switch (_orientation) {
-    case UIDeviceOrientationPortrait:
-      rotation = RTCVideoRotation_90;
-      break;
-    case UIDeviceOrientationPortraitUpsideDown:
-      rotation = RTCVideoRotation_270;
-      break;
-    case UIDeviceOrientationLandscapeLeft:
-      rotation = usingFrontCamera ? RTCVideoRotation_180 : RTCVideoRotation_0;
-      break;
-    case UIDeviceOrientationLandscapeRight:
-      rotation = usingFrontCamera ? RTCVideoRotation_0 : RTCVideoRotation_180;
-      break;
-    case UIDeviceOrientationFaceUp:
-    case UIDeviceOrientationFaceDown:
-    case UIDeviceOrientationUnknown:
-      // Ignore.
-      break;
-  }
-#else
-  // No rotation on Mac.
-  RTCVideoRotation rotation = RTCVideoRotation_0;
-#endif
-
-  RTCCVPixelBuffer *rtcPixelBuffer = [[RTCCVPixelBuffer alloc] initWithPixelBuffer:pixelBuffer];
-  int64_t timeStampNs = CMTimeGetSeconds(CMSampleBufferGetPresentationTimeStamp(sampleBuffer)) *
-      kNanosecondsPerSecond;
-  RTCVideoFrame *videoFrame = [[RTCVideoFrame alloc] initWithBuffer:rtcPixelBuffer
-                                                           rotation:rotation
-                                                        timeStampNs:timeStampNs];
-  [self.delegate capturer:self didCaptureVideoFrame:videoFrame];
-}
-
-- (void)captureOutput:(AVCaptureOutput *)captureOutput
-    didDropSampleBuffer:(CMSampleBufferRef)sampleBuffer
-         fromConnection:(AVCaptureConnection *)connection {
-  RTCLogError(@"Dropped sample buffer.");
-}
-
-#pragma mark - AVCaptureSession notifications
-
-- (void)handleCaptureSessionInterruption:(NSNotification *)notification {
-  NSString *reasonString = nil;
-#if defined(__IPHONE_9_0) && defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && \
-    __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_9_0
-  if ([UIDevice isIOS9OrLater]) {
-    NSNumber *reason = notification.userInfo[AVCaptureSessionInterruptionReasonKey];
-    if (reason) {
-      switch (reason.intValue) {
-        case AVCaptureSessionInterruptionReasonVideoDeviceNotAvailableInBackground:
-          reasonString = @"VideoDeviceNotAvailableInBackground";
-          break;
-        case AVCaptureSessionInterruptionReasonAudioDeviceInUseByAnotherClient:
-          reasonString = @"AudioDeviceInUseByAnotherClient";
-          break;
-        case AVCaptureSessionInterruptionReasonVideoDeviceInUseByAnotherClient:
-          reasonString = @"VideoDeviceInUseByAnotherClient";
-          break;
-        case AVCaptureSessionInterruptionReasonVideoDeviceNotAvailableWithMultipleForegroundApps:
-          reasonString = @"VideoDeviceNotAvailableWithMultipleForegroundApps";
-          break;
-      }
-    }
-  }
-#endif
-  RTCLog(@"Capture session interrupted: %@", reasonString);
-}
-
-- (void)handleCaptureSessionInterruptionEnded:(NSNotification *)notification {
-  RTCLog(@"Capture session interruption ended.");
-}
-
-- (void)handleCaptureSessionRuntimeError:(NSNotification *)notification {
-  NSError *error = [notification.userInfo objectForKey:AVCaptureSessionErrorKey];
-  RTCLogError(@"Capture session runtime error: %@", error);
-
-  [RTCDispatcher dispatchAsyncOnType:RTCDispatcherTypeCaptureSession
-                               block:^{
-#if TARGET_OS_IPHONE
-                                 if (error.code == AVErrorMediaServicesWereReset) {
-                                   [self handleNonFatalError];
-                                 } else {
-                                   [self handleFatalError];
-                                 }
-#else
-                                [self handleFatalError];
-#endif
-                               }];
-}
-
-- (void)handleCaptureSessionDidStartRunning:(NSNotification *)notification {
-  RTCLog(@"Capture session started.");
-
-  [RTCDispatcher dispatchAsyncOnType:RTCDispatcherTypeCaptureSession
-                               block:^{
-                                 // If we successfully restarted after an unknown error,
-                                 // allow future retries on fatal errors.
-                                 _hasRetriedOnFatalError = NO;
-                               }];
-}
-
-- (void)handleCaptureSessionDidStopRunning:(NSNotification *)notification {
-  RTCLog(@"Capture session stopped.");
-}
-
-- (void)handleFatalError {
-  [RTCDispatcher
-      dispatchAsyncOnType:RTCDispatcherTypeCaptureSession
-                    block:^{
-                      if (!_hasRetriedOnFatalError) {
-                        RTCLogWarning(@"Attempting to recover from fatal capture error.");
-                        [self handleNonFatalError];
-                        _hasRetriedOnFatalError = YES;
-                      } else {
-                        RTCLogError(@"Previous fatal error recovery failed.");
-                      }
-                    }];
-}
-
-- (void)handleNonFatalError {
-  [RTCDispatcher dispatchAsyncOnType:RTCDispatcherTypeCaptureSession
-                               block:^{
-                                 RTCLog(@"Restarting capture session after error.");
-                                 if (_isRunning) {
-                                   [_captureSession startRunning];
-                                 }
-                               }];
-}
-
-#if TARGET_OS_IPHONE
-
-#pragma mark - UIApplication notifications
-
-- (void)handleApplicationDidBecomeActive:(NSNotification *)notification {
-  [RTCDispatcher dispatchAsyncOnType:RTCDispatcherTypeCaptureSession
-                               block:^{
-                                 if (_isRunning && !_captureSession.isRunning) {
-                                   RTCLog(@"Restarting capture session on active.");
-                                   [_captureSession startRunning];
-                                 }
-                               }];
-}
-
-#endif  // TARGET_OS_IPHONE
-
-#pragma mark - Private
-
-- (dispatch_queue_t)frameQueue {
-  if (!_frameQueue) {
-    _frameQueue =
-        dispatch_queue_create("org.webrtc.avfoundationvideocapturer.video", DISPATCH_QUEUE_SERIAL);
-    dispatch_set_target_queue(_frameQueue,
-                              dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0));
-  }
-  return _frameQueue;
-}
-
-- (BOOL)setupCaptureSession {
-  NSAssert(_captureSession == nil, @"Setup capture session called twice.");
-  _captureSession = [[AVCaptureSession alloc] init];
-#if defined(WEBRTC_IOS)
-  _captureSession.sessionPreset = AVCaptureSessionPresetInputPriority;
-  _captureSession.usesApplicationAudioSession = NO;
-#endif
-  [self setupVideoDataOutput];
-  // Add the output.
-  if (![_captureSession canAddOutput:_videoDataOutput]) {
-    RTCLogError(@"Video data output unsupported.");
-    return NO;
-  }
-  [_captureSession addOutput:_videoDataOutput];
-
-  return YES;
-}
-
-- (void)setupVideoDataOutput {
-  NSAssert(_videoDataOutput == nil, @"Setup video data output called twice.");
-  // Make the capturer output NV12. Ideally we want I420 but that's not
-  // currently supported on iPhone / iPad.
-  AVCaptureVideoDataOutput *videoDataOutput = [[AVCaptureVideoDataOutput alloc] init];
-  videoDataOutput.videoSettings = @{
-    (NSString *)
-    // TODO(denicija): Remove this color conversion and use the original capture format directly.
-    kCVPixelBufferPixelFormatTypeKey : @(kCVPixelFormatType_420YpCbCr8BiPlanarFullRange)
-  };
-  videoDataOutput.alwaysDiscardsLateVideoFrames = NO;
-  [videoDataOutput setSampleBufferDelegate:self queue:self.frameQueue];
-  _videoDataOutput = videoDataOutput;
-}
-
-#pragma mark - Private, called inside capture queue
-
-- (void)updateDeviceCaptureFormat:(AVCaptureDeviceFormat *)format fps:(NSInteger)fps {
-  NSAssert([RTCDispatcher isOnQueueForType:RTCDispatcherTypeCaptureSession],
-           @"updateDeviceCaptureFormat must be called on the capture queue.");
-  @try {
-    _currentDevice.activeFormat = format;
-    _currentDevice.activeVideoMinFrameDuration = CMTimeMake(1, fps);
-  } @catch (NSException *exception) {
-    RTCLogError(@"Failed to set active format!\n User info:%@", exception.userInfo);
-    return;
-  }
-}
-
-- (void)reconfigureCaptureSessionInput {
-  NSAssert([RTCDispatcher isOnQueueForType:RTCDispatcherTypeCaptureSession],
-           @"reconfigureCaptureSessionInput must be called on the capture queue.");
-  NSError *error = nil;
-  AVCaptureDeviceInput *input =
-      [AVCaptureDeviceInput deviceInputWithDevice:_currentDevice error:&error];
-  if (!input) {
-    RTCLogError(@"Failed to create front camera input: %@", error.localizedDescription);
-    return;
-  }
-  [_captureSession beginConfiguration];
-  for (AVCaptureDeviceInput *oldInput in [_captureSession.inputs copy]) {
-    [_captureSession removeInput:oldInput];
-  }
-  if ([_captureSession canAddInput:input]) {
-    [_captureSession addInput:input];
-  } else {
-    RTCLogError(@"Cannot add camera as an input to the session.");
-  }
-  [_captureSession commitConfiguration];
-}
-
-- (void)updateOrientation {
-  NSAssert([RTCDispatcher isOnQueueForType:RTCDispatcherTypeCaptureSession],
-           @"updateOrientation must be called on the capture queue.");
-#if TARGET_OS_IPHONE
-  _orientation = [UIDevice currentDevice].orientation;
-#endif
-}
-
-@end
diff --git a/sdk/objc/Framework/Classes/PeerConnection/RTCConfiguration+Private.h b/sdk/objc/Framework/Classes/PeerConnection/RTCConfiguration+Private.h
deleted file mode 100644
index 059651e..0000000
--- a/sdk/objc/Framework/Classes/PeerConnection/RTCConfiguration+Private.h
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-#import "WebRTC/RTCConfiguration.h"
-
-#include "webrtc/api/peerconnectioninterface.h"
-
-NS_ASSUME_NONNULL_BEGIN
-
-@interface RTCConfiguration ()
-
-+ (webrtc::PeerConnectionInterface::IceTransportsType)
-    nativeTransportsTypeForTransportPolicy:(RTCIceTransportPolicy)policy;
-
-+ (RTCIceTransportPolicy)transportPolicyForTransportsType:
-    (webrtc::PeerConnectionInterface::IceTransportsType)nativeType;
-
-+ (NSString *)stringForTransportPolicy:(RTCIceTransportPolicy)policy;
-
-+ (webrtc::PeerConnectionInterface::BundlePolicy)nativeBundlePolicyForPolicy:
-    (RTCBundlePolicy)policy;
-
-+ (RTCBundlePolicy)bundlePolicyForNativePolicy:
-    (webrtc::PeerConnectionInterface::BundlePolicy)nativePolicy;
-
-+ (NSString *)stringForBundlePolicy:(RTCBundlePolicy)policy;
-
-+ (webrtc::PeerConnectionInterface::RtcpMuxPolicy)nativeRtcpMuxPolicyForPolicy:
-    (RTCRtcpMuxPolicy)policy;
-
-+ (RTCRtcpMuxPolicy)rtcpMuxPolicyForNativePolicy:
-    (webrtc::PeerConnectionInterface::RtcpMuxPolicy)nativePolicy;
-
-+ (NSString *)stringForRtcpMuxPolicy:(RTCRtcpMuxPolicy)policy;
-
-+ (webrtc::PeerConnectionInterface::TcpCandidatePolicy)
-    nativeTcpCandidatePolicyForPolicy:(RTCTcpCandidatePolicy)policy;
-
-+ (RTCTcpCandidatePolicy)tcpCandidatePolicyForNativePolicy:
-    (webrtc::PeerConnectionInterface::TcpCandidatePolicy)nativePolicy;
-
-+ (NSString *)stringForTcpCandidatePolicy:(RTCTcpCandidatePolicy)policy;
-
-+ (webrtc::PeerConnectionInterface::CandidateNetworkPolicy)
-    nativeCandidateNetworkPolicyForPolicy:(RTCCandidateNetworkPolicy)policy;
-
-+ (RTCCandidateNetworkPolicy)candidateNetworkPolicyForNativePolicy:
-    (webrtc::PeerConnectionInterface::CandidateNetworkPolicy)nativePolicy;
-
-+ (NSString *)stringForCandidateNetworkPolicy:(RTCCandidateNetworkPolicy)policy;
-
-+ (rtc::KeyType)nativeEncryptionKeyTypeForKeyType:(RTCEncryptionKeyType)keyType;
-
-/**
- * RTCConfiguration struct representation of this RTCConfiguration. This is
- * needed to pass to the underlying C++ APIs.
- */
-- (webrtc::PeerConnectionInterface::RTCConfiguration *)
-    createNativeConfiguration;
-
-- (instancetype)initWithNativeConfiguration:
-    (const webrtc::PeerConnectionInterface::RTCConfiguration &)config NS_DESIGNATED_INITIALIZER;
-
-@end
-
-NS_ASSUME_NONNULL_END
diff --git a/sdk/objc/Framework/Classes/PeerConnection/RTCConfiguration.mm b/sdk/objc/Framework/Classes/PeerConnection/RTCConfiguration.mm
deleted file mode 100644
index a71c571..0000000
--- a/sdk/objc/Framework/Classes/PeerConnection/RTCConfiguration.mm
+++ /dev/null
@@ -1,390 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-#import "RTCConfiguration+Private.h"
-
-#include <memory>
-
-#import "RTCIceServer+Private.h"
-#import "RTCIntervalRange+Private.h"
-#import "WebRTC/RTCLogging.h"
-
-#include "webrtc/rtc_base/rtccertificategenerator.h"
-#include "webrtc/rtc_base/sslidentity.h"
-
-@implementation RTCConfiguration
-
-@synthesize iceServers = _iceServers;
-@synthesize iceTransportPolicy = _iceTransportPolicy;
-@synthesize bundlePolicy = _bundlePolicy;
-@synthesize rtcpMuxPolicy = _rtcpMuxPolicy;
-@synthesize tcpCandidatePolicy = _tcpCandidatePolicy;
-@synthesize candidateNetworkPolicy = _candidateNetworkPolicy;
-@synthesize continualGatheringPolicy = _continualGatheringPolicy;
-@synthesize maxIPv6Networks = _maxIPv6Networks;
-@synthesize audioJitterBufferMaxPackets = _audioJitterBufferMaxPackets;
-@synthesize audioJitterBufferFastAccelerate = _audioJitterBufferFastAccelerate;
-@synthesize iceConnectionReceivingTimeout = _iceConnectionReceivingTimeout;
-@synthesize iceBackupCandidatePairPingInterval =
-    _iceBackupCandidatePairPingInterval;
-@synthesize keyType = _keyType;
-@synthesize iceCandidatePoolSize = _iceCandidatePoolSize;
-@synthesize shouldPruneTurnPorts = _shouldPruneTurnPorts;
-@synthesize shouldPresumeWritableWhenFullyRelayed =
-    _shouldPresumeWritableWhenFullyRelayed;
-@synthesize iceCheckMinInterval = _iceCheckMinInterval;
-@synthesize iceRegatherIntervalRange = _iceRegatherIntervalRange;
-
-- (instancetype)init {
-  // Copy defaults.
-  webrtc::PeerConnectionInterface::RTCConfiguration config(
-    webrtc::PeerConnectionInterface::RTCConfigurationType::kAggressive);
-  return [self initWithNativeConfiguration:config];
-}
-
-- (instancetype)initWithNativeConfiguration:
-    (const webrtc::PeerConnectionInterface::RTCConfiguration &)config {
-  if (self = [super init]) {
-    NSMutableArray *iceServers = [NSMutableArray array];
-    for (const webrtc::PeerConnectionInterface::IceServer& server : config.servers) {
-      RTCIceServer *iceServer = [[RTCIceServer alloc] initWithNativeServer:server];
-      [iceServers addObject:iceServer];
-    }
-    _iceServers = iceServers;
-    _iceTransportPolicy =
-        [[self class] transportPolicyForTransportsType:config.type];
-    _bundlePolicy =
-        [[self class] bundlePolicyForNativePolicy:config.bundle_policy];
-    _rtcpMuxPolicy =
-        [[self class] rtcpMuxPolicyForNativePolicy:config.rtcp_mux_policy];
-    _tcpCandidatePolicy = [[self class] tcpCandidatePolicyForNativePolicy:
-        config.tcp_candidate_policy];
-    _candidateNetworkPolicy = [[self class]
-        candidateNetworkPolicyForNativePolicy:config.candidate_network_policy];
-    webrtc::PeerConnectionInterface::ContinualGatheringPolicy nativePolicy =
-    config.continual_gathering_policy;
-    _continualGatheringPolicy =
-        [[self class] continualGatheringPolicyForNativePolicy:nativePolicy];
-    _maxIPv6Networks = config.max_ipv6_networks;
-    _audioJitterBufferMaxPackets = config.audio_jitter_buffer_max_packets;
-    _audioJitterBufferFastAccelerate = config.audio_jitter_buffer_fast_accelerate;
-    _iceConnectionReceivingTimeout = config.ice_connection_receiving_timeout;
-    _iceBackupCandidatePairPingInterval =
-        config.ice_backup_candidate_pair_ping_interval;
-    _keyType = RTCEncryptionKeyTypeECDSA;
-    _iceCandidatePoolSize = config.ice_candidate_pool_size;
-    _shouldPruneTurnPorts = config.prune_turn_ports;
-    _shouldPresumeWritableWhenFullyRelayed =
-        config.presume_writable_when_fully_relayed;
-    if (config.ice_check_min_interval) {
-      _iceCheckMinInterval =
-          [NSNumber numberWithInt:*config.ice_check_min_interval];
-    }
-    if (config.ice_regather_interval_range) {
-      const rtc::IntervalRange &nativeIntervalRange = config.ice_regather_interval_range.value();
-      _iceRegatherIntervalRange =
-          [[RTCIntervalRange alloc] initWithNativeIntervalRange:nativeIntervalRange];
-    }
-  }
-  return self;
-}
-
-- (NSString *)description {
-  return
-      [NSString stringWithFormat:
-                    @"RTCConfiguration: "
-                    @"{\n%@\n%@\n%@\n%@\n%@\n%@\n%@\n%d\n%d\n%d\n%d\n%d\n%d\n%d\n%@\n%@\n%d\n}\n",
-                    _iceServers,
-                    [[self class] stringForTransportPolicy:_iceTransportPolicy],
-                    [[self class] stringForBundlePolicy:_bundlePolicy],
-                    [[self class] stringForRtcpMuxPolicy:_rtcpMuxPolicy],
-                    [[self class] stringForTcpCandidatePolicy:_tcpCandidatePolicy],
-                    [[self class] stringForCandidateNetworkPolicy:_candidateNetworkPolicy],
-                    [[self class] stringForContinualGatheringPolicy:_continualGatheringPolicy],
-                    _audioJitterBufferMaxPackets,
-                    _audioJitterBufferFastAccelerate,
-                    _iceConnectionReceivingTimeout,
-                    _iceBackupCandidatePairPingInterval,
-                    _iceCandidatePoolSize,
-                    _shouldPruneTurnPorts,
-                    _shouldPresumeWritableWhenFullyRelayed,
-                    _iceCheckMinInterval,
-                    _iceRegatherIntervalRange,
-                    _maxIPv6Networks];
-}
-
-#pragma mark - Private
-
-- (webrtc::PeerConnectionInterface::RTCConfiguration *)
-    createNativeConfiguration {
-  std::unique_ptr<webrtc::PeerConnectionInterface::RTCConfiguration>
-      nativeConfig(new webrtc::PeerConnectionInterface::RTCConfiguration(
-          webrtc::PeerConnectionInterface::RTCConfigurationType::kAggressive));
-
-  for (RTCIceServer *iceServer in _iceServers) {
-    nativeConfig->servers.push_back(iceServer.nativeServer);
-  }
-  nativeConfig->type =
-      [[self class] nativeTransportsTypeForTransportPolicy:_iceTransportPolicy];
-  nativeConfig->bundle_policy =
-      [[self class] nativeBundlePolicyForPolicy:_bundlePolicy];
-  nativeConfig->rtcp_mux_policy =
-      [[self class] nativeRtcpMuxPolicyForPolicy:_rtcpMuxPolicy];
-  nativeConfig->tcp_candidate_policy =
-      [[self class] nativeTcpCandidatePolicyForPolicy:_tcpCandidatePolicy];
-  nativeConfig->candidate_network_policy = [[self class]
-      nativeCandidateNetworkPolicyForPolicy:_candidateNetworkPolicy];
-  nativeConfig->continual_gathering_policy = [[self class]
-      nativeContinualGatheringPolicyForPolicy:_continualGatheringPolicy];
-  nativeConfig->max_ipv6_networks = _maxIPv6Networks;
-  nativeConfig->audio_jitter_buffer_max_packets = _audioJitterBufferMaxPackets;
-  nativeConfig->audio_jitter_buffer_fast_accelerate =
-      _audioJitterBufferFastAccelerate  ? true : false;
-  nativeConfig->ice_connection_receiving_timeout =
-      _iceConnectionReceivingTimeout;
-  nativeConfig->ice_backup_candidate_pair_ping_interval =
-      _iceBackupCandidatePairPingInterval;
-  rtc::KeyType keyType =
-      [[self class] nativeEncryptionKeyTypeForKeyType:_keyType];
-  // Generate non-default certificate.
-  if (keyType != rtc::KT_DEFAULT) {
-    rtc::scoped_refptr<rtc::RTCCertificate> certificate =
-        rtc::RTCCertificateGenerator::GenerateCertificate(
-            rtc::KeyParams(keyType), rtc::Optional<uint64_t>());
-    if (!certificate) {
-      RTCLogError(@"Failed to generate certificate.");
-      return nullptr;
-    }
-    nativeConfig->certificates.push_back(certificate);
-  }
-  nativeConfig->ice_candidate_pool_size = _iceCandidatePoolSize;
-  nativeConfig->prune_turn_ports = _shouldPruneTurnPorts ? true : false;
-  nativeConfig->presume_writable_when_fully_relayed =
-      _shouldPresumeWritableWhenFullyRelayed ? true : false;
-  if (_iceCheckMinInterval != nil) {
-    nativeConfig->ice_check_min_interval =
-        rtc::Optional<int>(_iceCheckMinInterval.intValue);
-  }
-  if (_iceRegatherIntervalRange != nil) {
-    std::unique_ptr<rtc::IntervalRange> nativeIntervalRange(
-        _iceRegatherIntervalRange.nativeIntervalRange);
-    nativeConfig->ice_regather_interval_range =
-        rtc::Optional<rtc::IntervalRange>(*nativeIntervalRange);
-  }
-
-  return nativeConfig.release();
-}
-
-+ (webrtc::PeerConnectionInterface::IceTransportsType)
-    nativeTransportsTypeForTransportPolicy:(RTCIceTransportPolicy)policy {
-  switch (policy) {
-    case RTCIceTransportPolicyNone:
-      return webrtc::PeerConnectionInterface::kNone;
-    case RTCIceTransportPolicyRelay:
-      return webrtc::PeerConnectionInterface::kRelay;
-    case RTCIceTransportPolicyNoHost:
-      return webrtc::PeerConnectionInterface::kNoHost;
-    case RTCIceTransportPolicyAll:
-      return webrtc::PeerConnectionInterface::kAll;
-  }
-}
-
-+ (RTCIceTransportPolicy)transportPolicyForTransportsType:
-    (webrtc::PeerConnectionInterface::IceTransportsType)nativeType {
-  switch (nativeType) {
-    case webrtc::PeerConnectionInterface::kNone:
-      return RTCIceTransportPolicyNone;
-    case webrtc::PeerConnectionInterface::kRelay:
-      return RTCIceTransportPolicyRelay;
-    case webrtc::PeerConnectionInterface::kNoHost:
-      return RTCIceTransportPolicyNoHost;
-    case webrtc::PeerConnectionInterface::kAll:
-      return RTCIceTransportPolicyAll;
-  }
-}
-
-+ (NSString *)stringForTransportPolicy:(RTCIceTransportPolicy)policy {
-  switch (policy) {
-    case RTCIceTransportPolicyNone:
-      return @"NONE";
-    case RTCIceTransportPolicyRelay:
-      return @"RELAY";
-    case RTCIceTransportPolicyNoHost:
-      return @"NO_HOST";
-    case RTCIceTransportPolicyAll:
-      return @"ALL";
-  }
-}
-
-+ (webrtc::PeerConnectionInterface::BundlePolicy)nativeBundlePolicyForPolicy:
-    (RTCBundlePolicy)policy {
-  switch (policy) {
-    case RTCBundlePolicyBalanced:
-      return webrtc::PeerConnectionInterface::kBundlePolicyBalanced;
-    case RTCBundlePolicyMaxCompat:
-      return webrtc::PeerConnectionInterface::kBundlePolicyMaxCompat;
-    case RTCBundlePolicyMaxBundle:
-      return webrtc::PeerConnectionInterface::kBundlePolicyMaxBundle;
-  }
-}
-
-+ (RTCBundlePolicy)bundlePolicyForNativePolicy:
-    (webrtc::PeerConnectionInterface::BundlePolicy)nativePolicy {
-  switch (nativePolicy) {
-    case webrtc::PeerConnectionInterface::kBundlePolicyBalanced:
-      return RTCBundlePolicyBalanced;
-    case webrtc::PeerConnectionInterface::kBundlePolicyMaxCompat:
-      return RTCBundlePolicyMaxCompat;
-    case webrtc::PeerConnectionInterface::kBundlePolicyMaxBundle:
-      return RTCBundlePolicyMaxBundle;
-  }
-}
-
-+ (NSString *)stringForBundlePolicy:(RTCBundlePolicy)policy {
-  switch (policy) {
-    case RTCBundlePolicyBalanced:
-      return @"BALANCED";
-    case RTCBundlePolicyMaxCompat:
-      return @"MAX_COMPAT";
-    case RTCBundlePolicyMaxBundle:
-      return @"MAX_BUNDLE";
-  }
-}
-
-+ (webrtc::PeerConnectionInterface::RtcpMuxPolicy)nativeRtcpMuxPolicyForPolicy:
-    (RTCRtcpMuxPolicy)policy {
-  switch (policy) {
-    case RTCRtcpMuxPolicyNegotiate:
-      return webrtc::PeerConnectionInterface::kRtcpMuxPolicyNegotiate;
-    case RTCRtcpMuxPolicyRequire:
-      return webrtc::PeerConnectionInterface::kRtcpMuxPolicyRequire;
-  }
-}
-
-+ (RTCRtcpMuxPolicy)rtcpMuxPolicyForNativePolicy:
-    (webrtc::PeerConnectionInterface::RtcpMuxPolicy)nativePolicy {
-  switch (nativePolicy) {
-    case webrtc::PeerConnectionInterface::kRtcpMuxPolicyNegotiate:
-      return RTCRtcpMuxPolicyNegotiate;
-    case webrtc::PeerConnectionInterface::kRtcpMuxPolicyRequire:
-      return RTCRtcpMuxPolicyRequire;
-  }
-}
-
-+ (NSString *)stringForRtcpMuxPolicy:(RTCRtcpMuxPolicy)policy {
-  switch (policy) {
-    case RTCRtcpMuxPolicyNegotiate:
-      return @"NEGOTIATE";
-    case RTCRtcpMuxPolicyRequire:
-      return @"REQUIRE";
-  }
-}
-
-+ (webrtc::PeerConnectionInterface::TcpCandidatePolicy)
-    nativeTcpCandidatePolicyForPolicy:(RTCTcpCandidatePolicy)policy {
-  switch (policy) {
-    case RTCTcpCandidatePolicyEnabled:
-      return webrtc::PeerConnectionInterface::kTcpCandidatePolicyEnabled;
-    case RTCTcpCandidatePolicyDisabled:
-      return webrtc::PeerConnectionInterface::kTcpCandidatePolicyDisabled;
-  }
-}
-
-+ (webrtc::PeerConnectionInterface::CandidateNetworkPolicy)
-    nativeCandidateNetworkPolicyForPolicy:(RTCCandidateNetworkPolicy)policy {
-  switch (policy) {
-    case RTCCandidateNetworkPolicyAll:
-      return webrtc::PeerConnectionInterface::kCandidateNetworkPolicyAll;
-    case RTCCandidateNetworkPolicyLowCost:
-      return webrtc::PeerConnectionInterface::kCandidateNetworkPolicyLowCost;
-  }
-}
-
-+ (RTCTcpCandidatePolicy)tcpCandidatePolicyForNativePolicy:
-    (webrtc::PeerConnectionInterface::TcpCandidatePolicy)nativePolicy {
-  switch (nativePolicy) {
-    case webrtc::PeerConnectionInterface::kTcpCandidatePolicyEnabled:
-      return RTCTcpCandidatePolicyEnabled;
-    case webrtc::PeerConnectionInterface::kTcpCandidatePolicyDisabled:
-      return RTCTcpCandidatePolicyDisabled;
-  }
-}
-
-+ (NSString *)stringForTcpCandidatePolicy:(RTCTcpCandidatePolicy)policy {
-  switch (policy) {
-    case RTCTcpCandidatePolicyEnabled:
-      return @"TCP_ENABLED";
-    case RTCTcpCandidatePolicyDisabled:
-      return @"TCP_DISABLED";
-  }
-}
-
-+ (RTCCandidateNetworkPolicy)candidateNetworkPolicyForNativePolicy:
-    (webrtc::PeerConnectionInterface::CandidateNetworkPolicy)nativePolicy {
-  switch (nativePolicy) {
-    case webrtc::PeerConnectionInterface::kCandidateNetworkPolicyAll:
-      return RTCCandidateNetworkPolicyAll;
-    case webrtc::PeerConnectionInterface::kCandidateNetworkPolicyLowCost:
-      return RTCCandidateNetworkPolicyLowCost;
-  }
-}
-
-+ (NSString *)stringForCandidateNetworkPolicy:
-    (RTCCandidateNetworkPolicy)policy {
-  switch (policy) {
-    case RTCCandidateNetworkPolicyAll:
-      return @"CANDIDATE_ALL_NETWORKS";
-    case RTCCandidateNetworkPolicyLowCost:
-      return @"CANDIDATE_LOW_COST_NETWORKS";
-  }
-}
-
-+ (webrtc::PeerConnectionInterface::ContinualGatheringPolicy)
-    nativeContinualGatheringPolicyForPolicy:
-        (RTCContinualGatheringPolicy)policy {
-  switch (policy) {
-    case RTCContinualGatheringPolicyGatherOnce:
-      return webrtc::PeerConnectionInterface::GATHER_ONCE;
-    case RTCContinualGatheringPolicyGatherContinually:
-      return webrtc::PeerConnectionInterface::GATHER_CONTINUALLY;
-  }
-}
-
-+ (RTCContinualGatheringPolicy)continualGatheringPolicyForNativePolicy:
-    (webrtc::PeerConnectionInterface::ContinualGatheringPolicy)nativePolicy {
-  switch (nativePolicy) {
-    case webrtc::PeerConnectionInterface::GATHER_ONCE:
-      return RTCContinualGatheringPolicyGatherOnce;
-    case webrtc::PeerConnectionInterface::GATHER_CONTINUALLY:
-      return RTCContinualGatheringPolicyGatherContinually;
-  }
-}
-
-+ (NSString *)stringForContinualGatheringPolicy:
-    (RTCContinualGatheringPolicy)policy {
-  switch (policy) {
-    case RTCContinualGatheringPolicyGatherOnce:
-      return @"GATHER_ONCE";
-    case RTCContinualGatheringPolicyGatherContinually:
-      return @"GATHER_CONTINUALLY";
-  }
-}
-
-+ (rtc::KeyType)nativeEncryptionKeyTypeForKeyType:
-    (RTCEncryptionKeyType)keyType {
-  switch (keyType) {
-    case RTCEncryptionKeyTypeRSA:
-      return rtc::KT_RSA;
-    case RTCEncryptionKeyTypeECDSA:
-      return rtc::KT_ECDSA;
-  }
-}
-
-@end
diff --git a/sdk/objc/Framework/Classes/PeerConnection/RTCDataChannel+Private.h b/sdk/objc/Framework/Classes/PeerConnection/RTCDataChannel+Private.h
deleted file mode 100644
index 5017c2f..0000000
--- a/sdk/objc/Framework/Classes/PeerConnection/RTCDataChannel+Private.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-#import "WebRTC/RTCDataChannel.h"
-
-#include "webrtc/api/datachannelinterface.h"
-#include "webrtc/rtc_base/scoped_ref_ptr.h"
-
-NS_ASSUME_NONNULL_BEGIN
-
-@interface RTCDataBuffer ()
-
-/**
- * The native DataBuffer representation of this RTCDatabuffer object. This is
- * needed to pass to the underlying C++ APIs.
- */
-@property(nonatomic, readonly) const webrtc::DataBuffer *nativeDataBuffer;
-
-/** Initialize an RTCDataBuffer from a native DataBuffer. */
-- (instancetype)initWithNativeBuffer:(const webrtc::DataBuffer&)nativeBuffer;
-
-@end
-
-
-@interface RTCDataChannel ()
-
-/** Initialize an RTCDataChannel from a native DataChannelInterface. */
-- (instancetype)initWithNativeDataChannel:
-    (rtc::scoped_refptr<webrtc::DataChannelInterface>)nativeDataChannel
-    NS_DESIGNATED_INITIALIZER;
-
-+ (webrtc::DataChannelInterface::DataState)
-    nativeDataChannelStateForState:(RTCDataChannelState)state;
-
-+ (RTCDataChannelState)dataChannelStateForNativeState:
-    (webrtc::DataChannelInterface::DataState)nativeState;
-
-+ (NSString *)stringForState:(RTCDataChannelState)state;
-
-@end
-
-NS_ASSUME_NONNULL_END
diff --git a/sdk/objc/Framework/Classes/PeerConnection/RTCDataChannel.mm b/sdk/objc/Framework/Classes/PeerConnection/RTCDataChannel.mm
deleted file mode 100644
index 706e43e..0000000
--- a/sdk/objc/Framework/Classes/PeerConnection/RTCDataChannel.mm
+++ /dev/null
@@ -1,220 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-#import "RTCDataChannel+Private.h"
-
-#import "NSString+StdString.h"
-
-#include <memory>
-
-namespace webrtc {
-
-class DataChannelDelegateAdapter : public DataChannelObserver {
- public:
-  DataChannelDelegateAdapter(RTCDataChannel *channel) { channel_ = channel; }
-
-  void OnStateChange() override {
-    [channel_.delegate dataChannelDidChangeState:channel_];
-  }
-
-  void OnMessage(const DataBuffer& buffer) override {
-    RTCDataBuffer *data_buffer =
-        [[RTCDataBuffer alloc] initWithNativeBuffer:buffer];
-    [channel_.delegate dataChannel:channel_
-       didReceiveMessageWithBuffer:data_buffer];
-  }
-
-  void OnBufferedAmountChange(uint64_t previousAmount) override {
-    id<RTCDataChannelDelegate> delegate = channel_.delegate;
-    SEL sel = @selector(dataChannel:didChangeBufferedAmount:);
-    if ([delegate respondsToSelector:sel]) {
-      [delegate dataChannel:channel_ didChangeBufferedAmount:previousAmount];
-    }
-  }
-
- private:
-  __weak RTCDataChannel *channel_;
-};
-}
-
-
-@implementation RTCDataBuffer {
-  std::unique_ptr<webrtc::DataBuffer> _dataBuffer;
-}
-
-- (instancetype)initWithData:(NSData *)data isBinary:(BOOL)isBinary {
-  NSParameterAssert(data);
-  if (self = [super init]) {
-    rtc::CopyOnWriteBuffer buffer(
-        reinterpret_cast<const uint8_t*>(data.bytes), data.length);
-    _dataBuffer.reset(new webrtc::DataBuffer(buffer, isBinary));
-  }
-  return self;
-}
-
-- (NSData *)data {
-  return [NSData dataWithBytes:_dataBuffer->data.data()
-                        length:_dataBuffer->data.size()];
-}
-
-- (BOOL)isBinary {
-  return _dataBuffer->binary;
-}
-
-#pragma mark - Private
-
-- (instancetype)initWithNativeBuffer:(const webrtc::DataBuffer&)nativeBuffer {
-  if (self = [super init]) {
-    _dataBuffer.reset(new webrtc::DataBuffer(nativeBuffer));
-  }
-  return self;
-}
-
-- (const webrtc::DataBuffer *)nativeDataBuffer {
-  return _dataBuffer.get();
-}
-
-@end
-
-
-@implementation RTCDataChannel {
-  rtc::scoped_refptr<webrtc::DataChannelInterface> _nativeDataChannel;
-  std::unique_ptr<webrtc::DataChannelDelegateAdapter> _observer;
-  BOOL _isObserverRegistered;
-}
-
-@synthesize delegate = _delegate;
-
-- (void)dealloc {
-  // Handles unregistering the observer properly. We need to do this because
-  // there may still be other references to the underlying data channel.
-  _nativeDataChannel->UnregisterObserver();
-}
-
-- (NSString *)label {
-  return [NSString stringForStdString:_nativeDataChannel->label()];
-}
-
-- (BOOL)isReliable {
-  return _nativeDataChannel->reliable();
-}
-
-- (BOOL)isOrdered {
-  return _nativeDataChannel->ordered();
-}
-
-- (NSUInteger)maxRetransmitTime {
-  return self.maxPacketLifeTime;
-}
-
-- (uint16_t)maxPacketLifeTime {
-  return _nativeDataChannel->maxRetransmitTime();
-}
-
-- (uint16_t)maxRetransmits {
-  return _nativeDataChannel->maxRetransmits();
-}
-
-- (NSString *)protocol {
-  return [NSString stringForStdString:_nativeDataChannel->protocol()];
-}
-
-- (BOOL)isNegotiated {
-  return _nativeDataChannel->negotiated();
-}
-
-- (NSInteger)streamId {
-  return self.channelId;
-}
-
-- (int)channelId {
-  return _nativeDataChannel->id();
-}
-
-- (RTCDataChannelState)readyState {
-  return [[self class] dataChannelStateForNativeState:
-      _nativeDataChannel->state()];
-}
-
-- (uint64_t)bufferedAmount {
-  return _nativeDataChannel->buffered_amount();
-}
-
-- (void)close {
-  _nativeDataChannel->Close();
-}
-
-- (BOOL)sendData:(RTCDataBuffer *)data {
-  return _nativeDataChannel->Send(*data.nativeDataBuffer);
-}
-
-- (NSString *)description {
-  return [NSString stringWithFormat:@"RTCDataChannel:\n%ld\n%@\n%@",
-                                    (long)self.channelId,
-                                    self.label,
-                                    [[self class]
-                                        stringForState:self.readyState]];
-}
-
-#pragma mark - Private
-
-- (instancetype)initWithNativeDataChannel:
-    (rtc::scoped_refptr<webrtc::DataChannelInterface>)nativeDataChannel {
-  NSParameterAssert(nativeDataChannel);
-  if (self = [super init]) {
-    _nativeDataChannel = nativeDataChannel;
-    _observer.reset(new webrtc::DataChannelDelegateAdapter(self));
-    _nativeDataChannel->RegisterObserver(_observer.get());
-  }
-  return self;
-}
-
-+ (webrtc::DataChannelInterface::DataState)
-    nativeDataChannelStateForState:(RTCDataChannelState)state {
-  switch (state) {
-    case RTCDataChannelStateConnecting:
-      return webrtc::DataChannelInterface::DataState::kConnecting;
-    case RTCDataChannelStateOpen:
-      return webrtc::DataChannelInterface::DataState::kOpen;
-    case RTCDataChannelStateClosing:
-      return webrtc::DataChannelInterface::DataState::kClosing;
-    case RTCDataChannelStateClosed:
-      return webrtc::DataChannelInterface::DataState::kClosed;
-  }
-}
-
-+ (RTCDataChannelState)dataChannelStateForNativeState:
-    (webrtc::DataChannelInterface::DataState)nativeState {
-  switch (nativeState) {
-    case webrtc::DataChannelInterface::DataState::kConnecting:
-      return RTCDataChannelStateConnecting;
-    case webrtc::DataChannelInterface::DataState::kOpen:
-      return RTCDataChannelStateOpen;
-    case webrtc::DataChannelInterface::DataState::kClosing:
-      return RTCDataChannelStateClosing;
-    case webrtc::DataChannelInterface::DataState::kClosed:
-      return RTCDataChannelStateClosed;
-  }
-}
-
-+ (NSString *)stringForState:(RTCDataChannelState)state {
-  switch (state) {
-    case RTCDataChannelStateConnecting:
-      return @"Connecting";
-    case RTCDataChannelStateOpen:
-      return @"Open";
-    case RTCDataChannelStateClosing:
-      return @"Closing";
-    case RTCDataChannelStateClosed:
-      return @"Closed";
-  }
-}
-
-@end
diff --git a/sdk/objc/Framework/Classes/PeerConnection/RTCDataChannelConfiguration+Private.h b/sdk/objc/Framework/Classes/PeerConnection/RTCDataChannelConfiguration+Private.h
deleted file mode 100644
index e9ea747..0000000
--- a/sdk/objc/Framework/Classes/PeerConnection/RTCDataChannelConfiguration+Private.h
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-#import "WebRTC/RTCDataChannelConfiguration.h"
-
-#include "webrtc/api/datachannelinterface.h"
-
-NS_ASSUME_NONNULL_BEGIN
-
-@interface RTCDataChannelConfiguration ()
-
-@property(nonatomic, readonly) webrtc::DataChannelInit nativeDataChannelInit;
-
-@end
-
-NS_ASSUME_NONNULL_END
diff --git a/sdk/objc/Framework/Classes/PeerConnection/RTCDataChannelConfiguration.mm b/sdk/objc/Framework/Classes/PeerConnection/RTCDataChannelConfiguration.mm
deleted file mode 100644
index 89c56de..0000000
--- a/sdk/objc/Framework/Classes/PeerConnection/RTCDataChannelConfiguration.mm
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-#import "RTCDataChannelConfiguration+Private.h"
-
-#import "NSString+StdString.h"
-
-@implementation RTCDataChannelConfiguration
-
-@synthesize nativeDataChannelInit = _nativeDataChannelInit;
-
-- (BOOL)isOrdered {
-  return _nativeDataChannelInit.ordered;
-}
-
-- (void)setIsOrdered:(BOOL)isOrdered {
-  _nativeDataChannelInit.ordered = isOrdered;
-}
-
-- (NSInteger)maxRetransmitTimeMs {
-  return self.maxPacketLifeTime;
-}
-
-- (void)setMaxRetransmitTimeMs:(NSInteger)maxRetransmitTimeMs {
-  self.maxPacketLifeTime = maxRetransmitTimeMs;
-}
-
-- (int)maxPacketLifeTime {
-  return _nativeDataChannelInit.maxRetransmitTime;
-}
-
-- (void)setMaxPacketLifeTime:(int)maxPacketLifeTime {
-  _nativeDataChannelInit.maxRetransmitTime = maxPacketLifeTime;
-}
-
-- (int)maxRetransmits {
-  return _nativeDataChannelInit.maxRetransmits;
-}
-
-- (void)setMaxRetransmits:(int)maxRetransmits {
-  _nativeDataChannelInit.maxRetransmits = maxRetransmits;
-}
-
-- (NSString *)protocol {
-  return [NSString stringForStdString:_nativeDataChannelInit.protocol];
-}
-
-- (void)setProtocol:(NSString *)protocol {
-  _nativeDataChannelInit.protocol = [NSString stdStringForString:protocol];
-}
-
-- (BOOL)isNegotiated {
-  return _nativeDataChannelInit.negotiated;
-}
-
-- (void)setIsNegotiated:(BOOL)isNegotiated {
-  _nativeDataChannelInit.negotiated = isNegotiated;
-}
-
-- (int)streamId {
-  return self.channelId;
-}
-
-- (void)setStreamId:(int)streamId {
-  self.channelId = streamId;
-}
-
-- (int)channelId {
-  return _nativeDataChannelInit.id;
-}
-
-- (void)setChannelId:(int)channelId {
-  _nativeDataChannelInit.id = channelId;
-}
-
-@end
diff --git a/sdk/objc/Framework/Classes/PeerConnection/RTCEncodedImage.mm b/sdk/objc/Framework/Classes/PeerConnection/RTCEncodedImage.mm
deleted file mode 100644
index 1c8a27b..0000000
--- a/sdk/objc/Framework/Classes/PeerConnection/RTCEncodedImage.mm
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- *  Copyright 2017 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.
- */
-
-#import "WebRTC/RTCVideoCodec.h"
-
-#import "RTCVideoCodec+Private.h"
-
-#include "webrtc/rtc_base/safe_conversions.h"
-
-@implementation RTCEncodedImage
-
-@synthesize buffer = _buffer;
-@synthesize encodedWidth = _encodedWidth;
-@synthesize encodedHeight = _encodedHeight;
-@synthesize timeStamp = _timeStamp;
-@synthesize captureTimeMs = _captureTimeMs;
-@synthesize ntpTimeMs = _ntpTimeMs;
-@synthesize flags = _flags;
-@synthesize encodeStartMs = _encodeStartMs;
-@synthesize encodeFinishMs = _encodeFinishMs;
-@synthesize frameType = _frameType;
-@synthesize rotation = _rotation;
-@synthesize completeFrame = _completeFrame;
-@synthesize qp = _qp;
-@synthesize contentType = _contentType;
-
-- (instancetype)initWithNativeEncodedImage:(webrtc::EncodedImage)encodedImage {
-  if (self = [super init]) {
-    // Wrap the buffer in NSData without copying, do not take ownership.
-    _buffer = [NSData dataWithBytesNoCopy:encodedImage._buffer
-                                   length:encodedImage._length
-                             freeWhenDone:NO];
-    _encodedWidth = rtc::dchecked_cast<int32_t>(encodedImage._encodedWidth);
-    _encodedHeight = rtc::dchecked_cast<int32_t>(encodedImage._encodedHeight);
-    _timeStamp = encodedImage._timeStamp;
-    _captureTimeMs = encodedImage.capture_time_ms_;
-    _ntpTimeMs = encodedImage.ntp_time_ms_;
-    _flags = encodedImage.timing_.flags;
-    _encodeStartMs = encodedImage.timing_.encode_start_ms;
-    _encodeFinishMs = encodedImage.timing_.encode_finish_ms;
-    _frameType = static_cast<RTCFrameType>(encodedImage._frameType);
-    _rotation = static_cast<RTCVideoRotation>(encodedImage.rotation_);
-    _completeFrame = encodedImage._completeFrame;
-    _qp = encodedImage.qp_ == -1 ? nil : @(encodedImage.qp_);
-    _contentType = (encodedImage.content_type_ == webrtc::VideoContentType::SCREENSHARE) ?
-        RTCVideoContentTypeScreenshare :
-        RTCVideoContentTypeUnspecified;
-  }
-
-  return self;
-}
-
-- (webrtc::EncodedImage)nativeEncodedImage {
-  // Return the pointer without copying.
-  webrtc::EncodedImage encodedImage(
-      (uint8_t *)_buffer.bytes, (size_t)_buffer.length, (size_t)_buffer.length);
-  encodedImage._encodedWidth = rtc::dchecked_cast<uint32_t>(_encodedWidth);
-  encodedImage._encodedHeight = rtc::dchecked_cast<uint32_t>(_encodedHeight);
-  encodedImage._timeStamp = _timeStamp;
-  encodedImage.capture_time_ms_ = _captureTimeMs;
-  encodedImage.ntp_time_ms_ = _ntpTimeMs;
-  encodedImage.timing_.flags = _flags;
-  encodedImage.timing_.encode_start_ms = _encodeStartMs;
-  encodedImage.timing_.encode_finish_ms = _encodeFinishMs;
-  encodedImage._frameType = webrtc::FrameType(_frameType);
-  encodedImage.rotation_ = webrtc::VideoRotation(_rotation);
-  encodedImage._completeFrame = _completeFrame;
-  encodedImage.qp_ = _qp ? _qp.intValue : -1;
-  encodedImage.content_type_ = (_contentType == RTCVideoContentTypeScreenshare) ?
-      webrtc::VideoContentType::SCREENSHARE :
-      webrtc::VideoContentType::UNSPECIFIED;
-
-  return encodedImage;
-}
-
-@end
diff --git a/sdk/objc/Framework/Classes/PeerConnection/RTCFileVideoCapturer.h b/sdk/objc/Framework/Classes/PeerConnection/RTCFileVideoCapturer.h
deleted file mode 100644
index 3e63403..0000000
--- a/sdk/objc/Framework/Classes/PeerConnection/RTCFileVideoCapturer.h
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- *  Copyright 2017 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.
- */
-
-#import <Foundation/Foundation.h>
-#import <WebRTC/RTCVideoCapturer.h>
-
-/**
- * RTCVideoCapturer that reads buffers from file.
- *
- * Per design, the file capturer can only be run once and once stopped it cannot run again.
- * To run another file capture session, create new instance of the class.
- */
-@interface RTCFileVideoCapturer : RTCVideoCapturer
-
-- (void)startCapturingFromFileNamed:(NSString *)nameOfFile;
-- (void)stopCapture;
-
-@end
diff --git a/sdk/objc/Framework/Classes/PeerConnection/RTCFileVideoCapturer.m b/sdk/objc/Framework/Classes/PeerConnection/RTCFileVideoCapturer.m
deleted file mode 100644
index 178a958..0000000
--- a/sdk/objc/Framework/Classes/PeerConnection/RTCFileVideoCapturer.m
+++ /dev/null
@@ -1,163 +0,0 @@
-/**
- *  Copyright 2017 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.
- */
-
-#import "RTCFileVideoCapturer.h"
-
-#import "WebRTC/RTCLogging.h"
-#import "WebRTC/RTCVideoFrameBuffer.h"
-
-@implementation RTCFileVideoCapturer {
-  AVAssetReader *_reader;
-  AVAssetReaderTrackOutput *_outTrack;
-  BOOL _capturerStopped;
-  CMTime _lastPresentationTime;
-  dispatch_queue_t _frameQueue;
-}
-
-- (void)startCapturingFromFileNamed:(NSString *)nameOfFile {
-  dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
-    if (_reader && _reader.status == AVAssetReaderStatusReading) {
-      RTCLog("Capturer exists and reads another file. Start capture request failed.");
-      return;
-    }
-    NSString *pathForFile = [self pathForFileName:nameOfFile];
-    if (!pathForFile) {
-      RTCLog("File %@ not found in bundle", nameOfFile);
-      return;
-    }
-
-    _lastPresentationTime = CMTimeMake(0, 0);
-
-    NSURL *URLForFile = [NSURL fileURLWithPath:pathForFile];
-    AVURLAsset *asset = [AVURLAsset URLAssetWithURL:URLForFile options:nil];
-
-    NSArray *allTracks = [asset tracksWithMediaType:AVMediaTypeVideo];
-    NSError *error = nil;
-    _reader = [[AVAssetReader alloc] initWithAsset:asset error:&error];
-    if (error) {
-      RTCLog("File reader failed with error: %@", error);
-      return;
-    }
-
-    NSDictionary *options = @{
-      (NSString *)
-      kCVPixelBufferPixelFormatTypeKey : @(kCVPixelFormatType_420YpCbCr8BiPlanarFullRange)
-    };
-    _outTrack = [[AVAssetReaderTrackOutput alloc] initWithTrack:allTracks.firstObject
-                                                 outputSettings:options];
-    [_reader addOutput:_outTrack];
-
-    [_reader startReading];
-    RTCLog(@"File capturer started reading");
-    [self readNextBuffer];
-  });
-}
-
-- (void)stopCapture {
-  _capturerStopped = YES;
-  RTCLog(@"File capturer stopped.");
-}
-
-#pragma mark - Private
-
-- (nullable NSString *)pathForFileName:(NSString *)fileName {
-  NSArray *nameComponents = [fileName componentsSeparatedByString:@"."];
-  if (nameComponents.count != 2) {
-    return nil;
-  }
-
-  NSString *path =
-      [[NSBundle mainBundle] pathForResource:nameComponents[0] ofType:nameComponents[1]];
-  return path;
-}
-
-- (dispatch_queue_t)frameQueue {
-  if (!_frameQueue) {
-    _frameQueue = dispatch_queue_create("org.webrtc.filecapturer.video", DISPATCH_QUEUE_SERIAL);
-    dispatch_set_target_queue(_frameQueue,
-                              dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0));
-  }
-  return _frameQueue;
-}
-
-- (void)readNextBuffer {
-  if (_reader.status != AVAssetReaderStatusReading || _capturerStopped) {
-    [_reader cancelReading];
-    _reader = nil;
-    return;
-  }
-
-  CMSampleBufferRef sampleBuffer = [_outTrack copyNextSampleBuffer];
-  if (!sampleBuffer) {
-    [self readNextBuffer];
-    return;
-  }
-  if (CMSampleBufferGetNumSamples(sampleBuffer) != 1 || !CMSampleBufferIsValid(sampleBuffer) ||
-      !CMSampleBufferDataIsReady(sampleBuffer)) {
-    [self readNextBuffer];
-    return;
-  }
-
-  [self publishSampleBuffer:sampleBuffer];
-}
-
-- (void)publishSampleBuffer:(CMSampleBufferRef)sampleBuffer {
-  CMTime presentationTime = CMSampleBufferGetPresentationTimeStamp(sampleBuffer);
-  Float64 presentationDifference =
-      CMTimeGetSeconds(CMTimeSubtract(presentationTime, _lastPresentationTime));
-  _lastPresentationTime = presentationTime;
-  int64_t presentationDifferenceRound = lroundf(presentationDifference * NSEC_PER_SEC);
-
-  __block dispatch_source_t timer = [self createStrictTimer];
-  // Strict timer that will fire |presentationDifferenceRound| ns from now and never again.
-  dispatch_source_set_timer(timer,
-                            dispatch_time(DISPATCH_TIME_NOW, presentationDifferenceRound),
-                            DISPATCH_TIME_FOREVER,
-                            0);
-  dispatch_source_set_event_handler(timer, ^{
-    dispatch_source_cancel(timer);
-    timer = nil;
-
-    CVPixelBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
-    if (!pixelBuffer) {
-      CFRelease(sampleBuffer);
-      dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
-        [self readNextBuffer];
-      });
-      return;
-    }
-
-    RTCCVPixelBuffer *rtcPixelBuffer = [[RTCCVPixelBuffer alloc] initWithPixelBuffer:pixelBuffer];
-    NSTimeInterval timeStampSeconds = CACurrentMediaTime();
-    int64_t timeStampNs = lroundf(timeStampSeconds * NSEC_PER_SEC);
-    RTCVideoFrame *videoFrame =
-        [[RTCVideoFrame alloc] initWithBuffer:rtcPixelBuffer rotation:0 timeStampNs:timeStampNs];
-    CFRelease(sampleBuffer);
-
-    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
-      [self readNextBuffer];
-    });
-
-    [self.delegate capturer:self didCaptureVideoFrame:videoFrame];
-  });
-  dispatch_activate(timer);
-}
-
-- (dispatch_source_t)createStrictTimer {
-  dispatch_source_t timer = dispatch_source_create(
-      DISPATCH_SOURCE_TYPE_TIMER, 0, DISPATCH_TIMER_STRICT, [self frameQueue]);
-  return timer;
-}
-
-- (void)dealloc {
-  [self stopCapture];
-}
-
-@end
diff --git a/sdk/objc/Framework/Classes/PeerConnection/RTCIceCandidate+Private.h b/sdk/objc/Framework/Classes/PeerConnection/RTCIceCandidate+Private.h
deleted file mode 100644
index b00c8da..0000000
--- a/sdk/objc/Framework/Classes/PeerConnection/RTCIceCandidate+Private.h
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-#import "WebRTC/RTCIceCandidate.h"
-
-#include <memory>
-
-#include "webrtc/api/jsep.h"
-
-NS_ASSUME_NONNULL_BEGIN
-
-@interface RTCIceCandidate ()
-
-/**
- * The native IceCandidateInterface representation of this RTCIceCandidate
- * object. This is needed to pass to the underlying C++ APIs.
- */
-@property(nonatomic, readonly)
-    std::unique_ptr<webrtc::IceCandidateInterface> nativeCandidate;
-
-/**
- * Initialize an RTCIceCandidate from a native IceCandidateInterface. No
- * ownership is taken of the native candidate.
- */
-- (instancetype)initWithNativeCandidate:
-    (const webrtc::IceCandidateInterface *)candidate;
-
-@end
-
-NS_ASSUME_NONNULL_END
diff --git a/sdk/objc/Framework/Classes/PeerConnection/RTCIceCandidate.mm b/sdk/objc/Framework/Classes/PeerConnection/RTCIceCandidate.mm
deleted file mode 100644
index 0e2cc8a..0000000
--- a/sdk/objc/Framework/Classes/PeerConnection/RTCIceCandidate.mm
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-#import "RTCIceCandidate+Private.h"
-
-#include <memory>
-
-#import "NSString+StdString.h"
-#import "WebRTC/RTCLogging.h"
-
-@implementation RTCIceCandidate
-
-@synthesize sdpMid = _sdpMid;
-@synthesize sdpMLineIndex = _sdpMLineIndex;
-@synthesize sdp = _sdp;
-@synthesize serverUrl = _serverUrl;
-
-- (instancetype)initWithSdp:(NSString *)sdp
-              sdpMLineIndex:(int)sdpMLineIndex
-                     sdpMid:(NSString *)sdpMid {
-  NSParameterAssert(sdp.length);
-  if (self = [super init]) {
-    _sdpMid = [sdpMid copy];
-    _sdpMLineIndex = sdpMLineIndex;
-    _sdp = [sdp copy];
-  }
-  return self;
-}
-
-- (NSString *)description {
-  return [NSString stringWithFormat:@"RTCIceCandidate:\n%@\n%d\n%@\n%@",
-                                    _sdpMid,
-                                    _sdpMLineIndex,
-                                    _sdp,
-                                    _serverUrl];
-}
-
-#pragma mark - Private
-
-- (instancetype)initWithNativeCandidate:
-    (const webrtc::IceCandidateInterface *)candidate {
-  NSParameterAssert(candidate);
-  std::string sdp;
-  candidate->ToString(&sdp);
-
-  RTCIceCandidate *rtcCandidate =
-      [self initWithSdp:[NSString stringForStdString:sdp]
-          sdpMLineIndex:candidate->sdp_mline_index()
-                 sdpMid:[NSString stringForStdString:candidate->sdp_mid()]];
-  rtcCandidate->_serverUrl = [NSString stringForStdString:candidate->server_url()];
-  return rtcCandidate;
-}
-
-- (std::unique_ptr<webrtc::IceCandidateInterface>)nativeCandidate {
-  webrtc::SdpParseError error;
-
-  webrtc::IceCandidateInterface *candidate = webrtc::CreateIceCandidate(
-      _sdpMid.stdString, _sdpMLineIndex, _sdp.stdString, &error);
-
-  if (!candidate) {
-    RTCLog(@"Failed to create ICE candidate: %s\nline: %s",
-           error.description.c_str(),
-           error.line.c_str());
-  }
-
-  return std::unique_ptr<webrtc::IceCandidateInterface>(candidate);
-}
-
-@end
diff --git a/sdk/objc/Framework/Classes/PeerConnection/RTCIceServer+Private.h b/sdk/objc/Framework/Classes/PeerConnection/RTCIceServer+Private.h
deleted file mode 100644
index 7efeda4..0000000
--- a/sdk/objc/Framework/Classes/PeerConnection/RTCIceServer+Private.h
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-#import "WebRTC/RTCIceServer.h"
-
-#include "webrtc/api/peerconnectioninterface.h"
-
-NS_ASSUME_NONNULL_BEGIN
-
-@interface RTCIceServer ()
-
-/**
- * IceServer struct representation of this RTCIceServer object's data.
- * This is needed to pass to the underlying C++ APIs.
- */
-@property(nonatomic, readonly)
-    webrtc::PeerConnectionInterface::IceServer nativeServer;
-
-/** Initialize an RTCIceServer from a native IceServer. */
-- (instancetype)initWithNativeServer:
-    (webrtc::PeerConnectionInterface::IceServer)nativeServer;
-
-@end
-
-NS_ASSUME_NONNULL_END
diff --git a/sdk/objc/Framework/Classes/PeerConnection/RTCIceServer.mm b/sdk/objc/Framework/Classes/PeerConnection/RTCIceServer.mm
deleted file mode 100644
index eeb1177..0000000
--- a/sdk/objc/Framework/Classes/PeerConnection/RTCIceServer.mm
+++ /dev/null
@@ -1,196 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-#import "RTCIceServer+Private.h"
-
-#import "NSString+StdString.h"
-
-@implementation RTCIceServer
-
-@synthesize urlStrings = _urlStrings;
-@synthesize username = _username;
-@synthesize credential = _credential;
-@synthesize tlsCertPolicy = _tlsCertPolicy;
-@synthesize hostname = _hostname;
-@synthesize tlsAlpnProtocols = _tlsAlpnProtocols;
-@synthesize tlsEllipticCurves = _tlsEllipticCurves;
-
-- (instancetype)initWithURLStrings:(NSArray<NSString *> *)urlStrings {
-  return [self initWithURLStrings:urlStrings
-                         username:nil
-                       credential:nil];
-}
-
-- (instancetype)initWithURLStrings:(NSArray<NSString *> *)urlStrings
-                          username:(NSString *)username
-                        credential:(NSString *)credential {
-  return [self initWithURLStrings:urlStrings
-                         username:username
-                       credential:credential
-                    tlsCertPolicy:RTCTlsCertPolicySecure];
-}
-
-- (instancetype)initWithURLStrings:(NSArray<NSString *> *)urlStrings
-                          username:(NSString *)username
-                        credential:(NSString *)credential
-                     tlsCertPolicy:(RTCTlsCertPolicy)tlsCertPolicy {
-  return [self initWithURLStrings:urlStrings
-                         username:username
-                       credential:credential
-                    tlsCertPolicy:tlsCertPolicy
-                         hostname:nil];
-}
-
-- (instancetype)initWithURLStrings:(NSArray<NSString *> *)urlStrings
-                          username:(NSString *)username
-                        credential:(NSString *)credential
-                     tlsCertPolicy:(RTCTlsCertPolicy)tlsCertPolicy
-                          hostname:(NSString *)hostname {
-  return [self initWithURLStrings:urlStrings
-                         username:username
-                       credential:credential
-                    tlsCertPolicy:tlsCertPolicy
-                         hostname:hostname
-                 tlsAlpnProtocols:[NSArray array]];
-}
-
-- (instancetype)initWithURLStrings:(NSArray<NSString *> *)urlStrings
-                          username:(NSString *)username
-                        credential:(NSString *)credential
-                     tlsCertPolicy:(RTCTlsCertPolicy)tlsCertPolicy
-                          hostname:(NSString *)hostname
-                  tlsAlpnProtocols:(NSArray<NSString *> *)tlsAlpnProtocols {
-  return [self initWithURLStrings:urlStrings
-                         username:username
-                       credential:credential
-                    tlsCertPolicy:tlsCertPolicy
-                         hostname:hostname
-                 tlsAlpnProtocols:tlsAlpnProtocols
-                tlsEllipticCurves:[NSArray array]];
-}
-
-- (instancetype)initWithURLStrings:(NSArray<NSString *> *)urlStrings
-                          username:(NSString *)username
-                        credential:(NSString *)credential
-                     tlsCertPolicy:(RTCTlsCertPolicy)tlsCertPolicy
-                          hostname:(NSString *)hostname
-                  tlsAlpnProtocols:(NSArray<NSString *> *)tlsAlpnProtocols
-                 tlsEllipticCurves:(NSArray<NSString *> *)tlsEllipticCurves {
-  NSParameterAssert(urlStrings.count);
-  if (self = [super init]) {
-    _urlStrings = [[NSArray alloc] initWithArray:urlStrings copyItems:YES];
-    _username = [username copy];
-    _credential = [credential copy];
-    _tlsCertPolicy = tlsCertPolicy;
-    _hostname = [hostname copy];
-    _tlsAlpnProtocols = [[NSArray alloc] initWithArray:tlsAlpnProtocols copyItems:YES];
-    _tlsEllipticCurves = [[NSArray alloc] initWithArray:tlsEllipticCurves copyItems:YES];
-  }
-  return self;
-}
-
-- (NSString *)description {
-  return [NSString stringWithFormat:@"RTCIceServer:\n%@\n%@\n%@\n%@\n%@\n%@\n%@",
-                                    _urlStrings,
-                                    _username,
-                                    _credential,
-                                    [self stringForTlsCertPolicy:_tlsCertPolicy],
-                                    _hostname,
-                                    _tlsAlpnProtocols,
-                                    _tlsEllipticCurves];
-}
-
-#pragma mark - Private
-
-- (NSString *)stringForTlsCertPolicy:(RTCTlsCertPolicy)tlsCertPolicy {
-  switch (tlsCertPolicy) {
-    case RTCTlsCertPolicySecure:
-      return @"RTCTlsCertPolicySecure";
-    case RTCTlsCertPolicyInsecureNoCheck:
-      return @"RTCTlsCertPolicyInsecureNoCheck";
-  }
-}
-
-- (webrtc::PeerConnectionInterface::IceServer)nativeServer {
-  __block webrtc::PeerConnectionInterface::IceServer iceServer;
-
-  iceServer.username = [NSString stdStringForString:_username];
-  iceServer.password = [NSString stdStringForString:_credential];
-  iceServer.hostname = [NSString stdStringForString:_hostname];
-
-  [_tlsAlpnProtocols enumerateObjectsUsingBlock:^(NSString *proto, NSUInteger idx, BOOL *stop) {
-    iceServer.tls_alpn_protocols.push_back(proto.stdString);
-  }];
-
-  [_tlsEllipticCurves enumerateObjectsUsingBlock:^(NSString *curve, NSUInteger idx, BOOL *stop) {
-    iceServer.tls_elliptic_curves.push_back(curve.stdString);
-  }];
-
-  [_urlStrings enumerateObjectsUsingBlock:^(NSString *url,
-                                            NSUInteger idx,
-                                            BOOL *stop) {
-    iceServer.urls.push_back(url.stdString);
-  }];
-
-  switch (_tlsCertPolicy) {
-    case RTCTlsCertPolicySecure:
-      iceServer.tls_cert_policy =
-          webrtc::PeerConnectionInterface::kTlsCertPolicySecure;
-      break;
-    case RTCTlsCertPolicyInsecureNoCheck:
-      iceServer.tls_cert_policy =
-          webrtc::PeerConnectionInterface::kTlsCertPolicyInsecureNoCheck;
-      break;
-  }
-  return iceServer;
-}
-
-- (instancetype)initWithNativeServer:
-    (webrtc::PeerConnectionInterface::IceServer)nativeServer {
-  NSMutableArray *urls =
-      [NSMutableArray arrayWithCapacity:nativeServer.urls.size()];
-  for (auto const &url : nativeServer.urls) {
-    [urls addObject:[NSString stringForStdString:url]];
-  }
-  NSString *username = [NSString stringForStdString:nativeServer.username];
-  NSString *credential = [NSString stringForStdString:nativeServer.password];
-  NSString *hostname = [NSString stringForStdString:nativeServer.hostname];
-  NSMutableArray *tlsAlpnProtocols =
-      [NSMutableArray arrayWithCapacity:nativeServer.tls_alpn_protocols.size()];
-  for (auto const &proto : nativeServer.tls_alpn_protocols) {
-    [tlsAlpnProtocols addObject:[NSString stringForStdString:proto]];
-  }
-  NSMutableArray *tlsEllipticCurves =
-      [NSMutableArray arrayWithCapacity:nativeServer.tls_elliptic_curves.size()];
-  for (auto const &curve : nativeServer.tls_elliptic_curves) {
-    [tlsEllipticCurves addObject:[NSString stringForStdString:curve]];
-  }
-  RTCTlsCertPolicy tlsCertPolicy;
-
-  switch (nativeServer.tls_cert_policy) {
-    case webrtc::PeerConnectionInterface::kTlsCertPolicySecure:
-      tlsCertPolicy = RTCTlsCertPolicySecure;
-      break;
-    case webrtc::PeerConnectionInterface::kTlsCertPolicyInsecureNoCheck:
-      tlsCertPolicy = RTCTlsCertPolicyInsecureNoCheck;
-      break;
-  }
-
-  self = [self initWithURLStrings:urls
-                         username:username
-                       credential:credential
-                    tlsCertPolicy:tlsCertPolicy
-                         hostname:hostname
-                 tlsAlpnProtocols:tlsAlpnProtocols
-                tlsEllipticCurves:tlsEllipticCurves];
-  return self;
-}
-
-@end
diff --git a/sdk/objc/Framework/Classes/PeerConnection/RTCIntervalRange+Private.h b/sdk/objc/Framework/Classes/PeerConnection/RTCIntervalRange+Private.h
deleted file mode 100644
index b958413..0000000
--- a/sdk/objc/Framework/Classes/PeerConnection/RTCIntervalRange+Private.h
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- *  Copyright 2017 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.
- */
-
-#import "WebRTC/RTCIntervalRange.h"
-
-#include "webrtc/rtc_base/timeutils.h"
-
-NS_ASSUME_NONNULL_BEGIN
-
-@interface RTCIntervalRange ()
-
-@property(nonatomic, readonly)
-    std::unique_ptr<rtc::IntervalRange> nativeIntervalRange;
-
-- (instancetype)initWithNativeIntervalRange:(const rtc::IntervalRange &)config;
-
-@end
-
-NS_ASSUME_NONNULL_END
-
diff --git a/sdk/objc/Framework/Classes/PeerConnection/RTCIntervalRange.mm b/sdk/objc/Framework/Classes/PeerConnection/RTCIntervalRange.mm
deleted file mode 100644
index 40f5eb5..0000000
--- a/sdk/objc/Framework/Classes/PeerConnection/RTCIntervalRange.mm
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- *  Copyright 2017 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.
- */
-
-#import "RTCIntervalRange+Private.h"
-
-#include "webrtc/rtc_base/checks.h"
-
-@implementation RTCIntervalRange
-
-@synthesize min = _min;
-@synthesize max = _max;
-
-- (instancetype)init {
-  return [self initWithMin:0 max:0];
-}
-
-- (instancetype)initWithMin:(NSInteger)min
-                        max:(NSInteger)max {
-  RTC_DCHECK_LE(min, max);
-  if (self = [super init]) {
-    _min = min;
-    _max = max;
-  }
-  return self;
-}
-
-- (instancetype)initWithNativeIntervalRange:(const rtc::IntervalRange &)config {
-  return [self initWithMin:config.min() max:config.max()];
-}
-
-- (NSString *)description {
-  return [NSString stringWithFormat:@"[%ld, %ld]", (long)_min, (long)_max];
-}
-
-#pragma mark - Private
-
-- (std::unique_ptr<rtc::IntervalRange>)nativeIntervalRange {
-  std::unique_ptr<rtc::IntervalRange> nativeIntervalRange(
-      new rtc::IntervalRange((int)_min, (int)_max));
-  return nativeIntervalRange;
-}
-
-@end
diff --git a/sdk/objc/Framework/Classes/PeerConnection/RTCLegacyStatsReport+Private.h b/sdk/objc/Framework/Classes/PeerConnection/RTCLegacyStatsReport+Private.h
deleted file mode 100644
index 67eb318..0000000
--- a/sdk/objc/Framework/Classes/PeerConnection/RTCLegacyStatsReport+Private.h
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-#import "WebRTC/RTCLegacyStatsReport.h"
-
-#include "webrtc/api/statstypes.h"
-
-NS_ASSUME_NONNULL_BEGIN
-
-@interface RTCLegacyStatsReport ()
-
-/** Initialize an RTCLegacyStatsReport object from a native StatsReport. */
-- (instancetype)initWithNativeReport:(const webrtc::StatsReport &)nativeReport;
-
-@end
-
-NS_ASSUME_NONNULL_END
diff --git a/sdk/objc/Framework/Classes/PeerConnection/RTCLegacyStatsReport.mm b/sdk/objc/Framework/Classes/PeerConnection/RTCLegacyStatsReport.mm
deleted file mode 100644
index 82b43f8..0000000
--- a/sdk/objc/Framework/Classes/PeerConnection/RTCLegacyStatsReport.mm
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-#import "RTCLegacyStatsReport+Private.h"
-
-#import "NSString+StdString.h"
-#import "WebRTC/RTCLogging.h"
-
-#include "webrtc/rtc_base/checks.h"
-
-@implementation RTCLegacyStatsReport
-
-@synthesize timestamp = _timestamp;
-@synthesize type = _type;
-@synthesize reportId = _reportId;
-@synthesize values = _values;
-
-- (NSString *)description {
-  return [NSString stringWithFormat:@"RTCLegacyStatsReport:\n%@\n%@\n%f\n%@",
-                                    _reportId,
-                                    _type,
-                                    _timestamp,
-                                    _values];
-}
-
-#pragma mark - Private
-
-- (instancetype)initWithNativeReport:(const webrtc::StatsReport &)nativeReport {
-  if (self = [super init]) {
-    _timestamp = nativeReport.timestamp();
-    _type = [NSString stringForStdString:nativeReport.TypeToString()];
-    _reportId = [NSString stringForStdString:
-        nativeReport.id()->ToString()];
-
-    NSUInteger capacity = nativeReport.values().size();
-    NSMutableDictionary *values =
-        [NSMutableDictionary dictionaryWithCapacity:capacity];
-    for (auto const &valuePair : nativeReport.values()) {
-      NSString *key = [NSString stringForStdString:
-          valuePair.second->display_name()];
-      NSString *value = [NSString stringForStdString:
-          valuePair.second->ToString()];
-
-      // Not expecting duplicate keys.
-      RTC_DCHECK(![values objectForKey:key]);
-      [values setObject:value forKey:key];
-    }
-    _values = values;
-  }
-  return self;
-}
-
-@end
diff --git a/sdk/objc/Framework/Classes/PeerConnection/RTCMediaConstraints+Private.h b/sdk/objc/Framework/Classes/PeerConnection/RTCMediaConstraints+Private.h
deleted file mode 100644
index 606a132..0000000
--- a/sdk/objc/Framework/Classes/PeerConnection/RTCMediaConstraints+Private.h
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-#import "WebRTC/RTCMediaConstraints.h"
-
-#include <memory>
-
-#include "webrtc/api/mediaconstraintsinterface.h"
-
-namespace webrtc {
-
-class MediaConstraints : public MediaConstraintsInterface {
- public:
-  virtual ~MediaConstraints();
-  MediaConstraints();
-  MediaConstraints(
-      const MediaConstraintsInterface::Constraints& mandatory,
-      const MediaConstraintsInterface::Constraints& optional);
-  virtual const Constraints& GetMandatory() const;
-  virtual const Constraints& GetOptional() const;
-
- private:
-  MediaConstraintsInterface::Constraints mandatory_;
-  MediaConstraintsInterface::Constraints optional_;
-};
-
-}  // namespace webrtc
-
-
-NS_ASSUME_NONNULL_BEGIN
-
-@interface RTCMediaConstraints ()
-
-/**
- * A MediaConstraints representation of this RTCMediaConstraints object. This is
- * needed to pass to the underlying C++ APIs.
- */
-- (std::unique_ptr<webrtc::MediaConstraints>)nativeConstraints;
-
-/** Return a native Constraints object representing these constraints */
-+ (webrtc::MediaConstraintsInterface::Constraints)
-    nativeConstraintsForConstraints:
-        (NSDictionary<NSString *, NSString *> *)constraints;
-
-@end
-
-NS_ASSUME_NONNULL_END
diff --git a/sdk/objc/Framework/Classes/PeerConnection/RTCMediaConstraints.mm b/sdk/objc/Framework/Classes/PeerConnection/RTCMediaConstraints.mm
deleted file mode 100644
index c686b56..0000000
--- a/sdk/objc/Framework/Classes/PeerConnection/RTCMediaConstraints.mm
+++ /dev/null
@@ -1,138 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-#import "RTCMediaConstraints+Private.h"
-
-#import "NSString+StdString.h"
-
-#include <memory>
-
-NSString * const kRTCMediaConstraintsMinAspectRatio =
-    @(webrtc::MediaConstraintsInterface::kMinAspectRatio);
-NSString * const kRTCMediaConstraintsMaxAspectRatio =
-    @(webrtc::MediaConstraintsInterface::kMaxAspectRatio);
-NSString * const kRTCMediaConstraintsMinWidth =
-    @(webrtc::MediaConstraintsInterface::kMinWidth);
-NSString * const kRTCMediaConstraintsMaxWidth =
-    @(webrtc::MediaConstraintsInterface::kMaxWidth);
-NSString * const kRTCMediaConstraintsMinHeight =
-    @(webrtc::MediaConstraintsInterface::kMinHeight);
-NSString * const kRTCMediaConstraintsMaxHeight =
-    @(webrtc::MediaConstraintsInterface::kMaxHeight);
-NSString * const kRTCMediaConstraintsMinFrameRate =
-    @(webrtc::MediaConstraintsInterface::kMinFrameRate);
-NSString * const kRTCMediaConstraintsMaxFrameRate =
-    @(webrtc::MediaConstraintsInterface::kMaxFrameRate);
-NSString * const kRTCMediaConstraintsLevelControl =
-    @(webrtc::MediaConstraintsInterface::kLevelControl);
-NSString * const kRTCMediaConstraintsAudioNetworkAdaptorConfig =
-    @(webrtc::MediaConstraintsInterface::kAudioNetworkAdaptorConfig);
-
-NSString * const kRTCMediaConstraintsIceRestart =
-    @(webrtc::MediaConstraintsInterface::kIceRestart);
-NSString * const kRTCMediaConstraintsOfferToReceiveAudio =
-    @(webrtc::MediaConstraintsInterface::kOfferToReceiveAudio);
-NSString * const kRTCMediaConstraintsOfferToReceiveVideo =
-    @(webrtc::MediaConstraintsInterface::kOfferToReceiveVideo);
-NSString * const kRTCMediaConstraintsVoiceActivityDetection =
-    @(webrtc::MediaConstraintsInterface::kVoiceActivityDetection);
-
-NSString * const kRTCMediaConstraintsValueTrue =
-    @(webrtc::MediaConstraintsInterface::kValueTrue);
-NSString * const kRTCMediaConstraintsValueFalse =
-    @(webrtc::MediaConstraintsInterface::kValueFalse);
-
-namespace webrtc {
-
-MediaConstraints::~MediaConstraints() {}
-
-MediaConstraints::MediaConstraints() {}
-
-MediaConstraints::MediaConstraints(
-    const MediaConstraintsInterface::Constraints& mandatory,
-    const MediaConstraintsInterface::Constraints& optional)
-    : mandatory_(mandatory), optional_(optional) {}
-
-const MediaConstraintsInterface::Constraints&
-MediaConstraints::GetMandatory() const {
-  return mandatory_;
-}
-
-const MediaConstraintsInterface::Constraints&
-MediaConstraints::GetOptional() const {
-  return optional_;
-}
-
-}  // namespace webrtc
-
-
-@implementation RTCMediaConstraints {
-  NSDictionary<NSString *, NSString *> *_mandatory;
-  NSDictionary<NSString *, NSString *> *_optional;
-}
-
-- (instancetype)initWithMandatoryConstraints:
-    (NSDictionary<NSString *, NSString *> *)mandatory
-                         optionalConstraints:
-    (NSDictionary<NSString *, NSString *> *)optional {
-  if (self = [super init]) {
-    _mandatory = [[NSDictionary alloc] initWithDictionary:mandatory
-                                                copyItems:YES];
-    _optional = [[NSDictionary alloc] initWithDictionary:optional
-                                               copyItems:YES];
-  }
-  return self;
-}
-
-- (NSString *)description {
-  return [NSString stringWithFormat:@"RTCMediaConstraints:\n%@\n%@",
-                                    _mandatory,
-                                    _optional];
-}
-
-#pragma mark - Private
-
-- (std::unique_ptr<webrtc::MediaConstraints>)nativeConstraints {
-  webrtc::MediaConstraintsInterface::Constraints mandatory =
-      [[self class] nativeConstraintsForConstraints:_mandatory];
-  webrtc::MediaConstraintsInterface::Constraints optional =
-      [[self class] nativeConstraintsForConstraints:_optional];
-
-  webrtc::MediaConstraints *nativeConstraints =
-      new webrtc::MediaConstraints(mandatory, optional);
-  return std::unique_ptr<webrtc::MediaConstraints>(nativeConstraints);
-}
-
-+ (webrtc::MediaConstraintsInterface::Constraints)
-    nativeConstraintsForConstraints:
-        (NSDictionary<NSString *, NSString *> *)constraints {
-  webrtc::MediaConstraintsInterface::Constraints nativeConstraints;
-  for (NSString *key in constraints) {
-    NSAssert([key isKindOfClass:[NSString class]],
-             @"%@ is not an NSString.", key);
-    NSString *value = [constraints objectForKey:key];
-    NSAssert([value isKindOfClass:[NSString class]],
-             @"%@ is not an NSString.", value);
-    if ([kRTCMediaConstraintsAudioNetworkAdaptorConfig isEqualToString:key]) {
-      // This value is base64 encoded.
-      NSData *charData = [[NSData alloc] initWithBase64EncodedString:value options:0];
-      std::string configValue =
-          std::string(reinterpret_cast<const char *>(charData.bytes), charData.length);
-      nativeConstraints.push_back(webrtc::MediaConstraintsInterface::Constraint(
-          key.stdString, configValue));
-    } else {
-      nativeConstraints.push_back(webrtc::MediaConstraintsInterface::Constraint(
-          key.stdString, value.stdString));
-    }
-  }
-  return nativeConstraints;
-}
-
-@end
diff --git a/sdk/objc/Framework/Classes/PeerConnection/RTCMediaSource+Private.h b/sdk/objc/Framework/Classes/PeerConnection/RTCMediaSource+Private.h
deleted file mode 100644
index 55d268a..0000000
--- a/sdk/objc/Framework/Classes/PeerConnection/RTCMediaSource+Private.h
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- *  Copyright 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.
- */
-
-#import "WebRTC/RTCMediaSource.h"
-
-#include "webrtc/api/mediastreaminterface.h"
-
-NS_ASSUME_NONNULL_BEGIN
-
-typedef NS_ENUM(NSInteger, RTCMediaSourceType) {
-  RTCMediaSourceTypeAudio,
-  RTCMediaSourceTypeVideo,
-};
-
-@interface RTCMediaSource ()
-
-@property(nonatomic, readonly)
-    rtc::scoped_refptr<webrtc::MediaSourceInterface> nativeMediaSource;
-
-- (instancetype)initWithNativeMediaSource:
-   (rtc::scoped_refptr<webrtc::MediaSourceInterface>)nativeMediaSource
-                                     type:(RTCMediaSourceType)type
-    NS_DESIGNATED_INITIALIZER;
-
-+ (webrtc::MediaSourceInterface::SourceState)nativeSourceStateForState:
-    (RTCSourceState)state;
-
-+ (RTCSourceState)sourceStateForNativeState:
-    (webrtc::MediaSourceInterface::SourceState)nativeState;
-
-+ (NSString *)stringForState:(RTCSourceState)state;
-
-@end
-
-NS_ASSUME_NONNULL_END
diff --git a/sdk/objc/Framework/Classes/PeerConnection/RTCMediaSource.mm b/sdk/objc/Framework/Classes/PeerConnection/RTCMediaSource.mm
deleted file mode 100644
index 956da16..0000000
--- a/sdk/objc/Framework/Classes/PeerConnection/RTCMediaSource.mm
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- *  Copyright 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.
- */
-
-#import "RTCMediaSource+Private.h"
-
-#include "webrtc/rtc_base/checks.h"
-
-@implementation RTCMediaSource {
-  RTCMediaSourceType _type;
-}
-
-@synthesize nativeMediaSource = _nativeMediaSource;
-
-- (instancetype)initWithNativeMediaSource:
-   (rtc::scoped_refptr<webrtc::MediaSourceInterface>)nativeMediaSource
-                                     type:(RTCMediaSourceType)type {
-  RTC_DCHECK(nativeMediaSource);
-  if (self = [super init]) {
-    _nativeMediaSource = nativeMediaSource;
-    _type = type;
-  }
-  return self;
-}
-
-- (RTCSourceState)state {
-  return [[self class] sourceStateForNativeState:_nativeMediaSource->state()];
-}
-
-#pragma mark - Private
-
-+ (webrtc::MediaSourceInterface::SourceState)nativeSourceStateForState:
-    (RTCSourceState)state {
-  switch (state) {
-    case RTCSourceStateInitializing:
-      return webrtc::MediaSourceInterface::kInitializing;
-    case RTCSourceStateLive:
-      return webrtc::MediaSourceInterface::kLive;
-    case RTCSourceStateEnded:
-      return webrtc::MediaSourceInterface::kEnded;
-    case RTCSourceStateMuted:
-      return webrtc::MediaSourceInterface::kMuted;
-  }
-}
-
-+ (RTCSourceState)sourceStateForNativeState:
-    (webrtc::MediaSourceInterface::SourceState)nativeState {
-  switch (nativeState) {
-    case webrtc::MediaSourceInterface::kInitializing:
-      return RTCSourceStateInitializing;
-    case webrtc::MediaSourceInterface::kLive:
-      return RTCSourceStateLive;
-    case webrtc::MediaSourceInterface::kEnded:
-      return RTCSourceStateEnded;
-    case webrtc::MediaSourceInterface::kMuted:
-      return RTCSourceStateMuted;
-  }
-}
-
-+ (NSString *)stringForState:(RTCSourceState)state {
-  switch (state) {
-    case RTCSourceStateInitializing:
-      return @"Initializing";
-    case RTCSourceStateLive:
-      return @"Live";
-    case RTCSourceStateEnded:
-      return @"Ended";
-    case RTCSourceStateMuted:
-      return @"Muted";
-  }
-}
-
-@end
diff --git a/sdk/objc/Framework/Classes/PeerConnection/RTCMediaStream+Private.h b/sdk/objc/Framework/Classes/PeerConnection/RTCMediaStream+Private.h
deleted file mode 100644
index 7f87072..0000000
--- a/sdk/objc/Framework/Classes/PeerConnection/RTCMediaStream+Private.h
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-#import "WebRTC/RTCMediaStream.h"
-
-#include "webrtc/api/mediastreaminterface.h"
-
-NS_ASSUME_NONNULL_BEGIN
-
-@interface RTCMediaStream ()
-
-/**
- * MediaStreamInterface representation of this RTCMediaStream object. This is
- * needed to pass to the underlying C++ APIs.
- */
-@property(nonatomic, readonly)
-    rtc::scoped_refptr<webrtc::MediaStreamInterface> nativeMediaStream;
-
-/** Initialize an RTCMediaStream with an id. */
-- (instancetype)initWithFactory:(RTCPeerConnectionFactory *)factory
-                       streamId:(NSString *)streamId;
-
-/** Initialize an RTCMediaStream from a native MediaStreamInterface. */
-- (instancetype)initWithNativeMediaStream:
-    (rtc::scoped_refptr<webrtc::MediaStreamInterface>)nativeMediaStream;
-
-@end
-
-NS_ASSUME_NONNULL_END
diff --git a/sdk/objc/Framework/Classes/PeerConnection/RTCMediaStream.mm b/sdk/objc/Framework/Classes/PeerConnection/RTCMediaStream.mm
deleted file mode 100644
index 0737dee..0000000
--- a/sdk/objc/Framework/Classes/PeerConnection/RTCMediaStream.mm
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-#import "RTCMediaStream+Private.h"
-
-#include <vector>
-
-#import "NSString+StdString.h"
-#import "RTCAudioTrack+Private.h"
-#import "RTCMediaStreamTrack+Private.h"
-#import "RTCPeerConnectionFactory+Private.h"
-#import "RTCVideoTrack+Private.h"
-
-@implementation RTCMediaStream {
-  NSMutableArray *_audioTracks;
-  NSMutableArray *_videoTracks;
-  rtc::scoped_refptr<webrtc::MediaStreamInterface> _nativeMediaStream;
-}
-
-- (instancetype)initWithFactory:(RTCPeerConnectionFactory *)factory
-                       streamId:(NSString *)streamId {
-  NSParameterAssert(factory);
-  NSParameterAssert(streamId.length);
-  std::string nativeId = [NSString stdStringForString:streamId];
-  rtc::scoped_refptr<webrtc::MediaStreamInterface> stream =
-      factory.nativeFactory->CreateLocalMediaStream(nativeId);
-  return [self initWithNativeMediaStream:stream];
-}
-
-- (NSArray<RTCAudioTrack *> *)audioTracks {
-  return [_audioTracks copy];
-}
-
-- (NSArray<RTCVideoTrack *> *)videoTracks {
-  return [_videoTracks copy];
-}
-
-- (NSString *)streamId {
-  return [NSString stringForStdString:_nativeMediaStream->label()];
-}
-
-- (void)addAudioTrack:(RTCAudioTrack *)audioTrack {
-  if (_nativeMediaStream->AddTrack(audioTrack.nativeAudioTrack)) {
-    [_audioTracks addObject:audioTrack];
-  }
-}
-
-- (void)addVideoTrack:(RTCVideoTrack *)videoTrack {
-  if (_nativeMediaStream->AddTrack(videoTrack.nativeVideoTrack)) {
-    [_videoTracks addObject:videoTrack];
-  }
-}
-
-- (void)removeAudioTrack:(RTCAudioTrack *)audioTrack {
-  NSUInteger index = [_audioTracks indexOfObjectIdenticalTo:audioTrack];
-  NSAssert(index != NSNotFound,
-           @"|removeAudioTrack| called on unexpected RTCAudioTrack");
-  if (index != NSNotFound &&
-      _nativeMediaStream->RemoveTrack(audioTrack.nativeAudioTrack)) {
-    [_audioTracks removeObjectAtIndex:index];
-  }
-}
-
-- (void)removeVideoTrack:(RTCVideoTrack *)videoTrack {
-  NSUInteger index = [_videoTracks indexOfObjectIdenticalTo:videoTrack];
-  NSAssert(index != NSNotFound,
-           @"|removeVideoTrack| called on unexpected RTCVideoTrack");
-  if (index != NSNotFound &&
-      _nativeMediaStream->RemoveTrack(videoTrack.nativeVideoTrack)) {
-    [_videoTracks removeObjectAtIndex:index];
-  }
-}
-
-- (NSString *)description {
-  return [NSString stringWithFormat:@"RTCMediaStream:\n%@\nA=%lu\nV=%lu",
-                                    self.streamId,
-                                    (unsigned long)self.audioTracks.count,
-                                    (unsigned long)self.videoTracks.count];
-}
-
-#pragma mark - Private
-
-- (rtc::scoped_refptr<webrtc::MediaStreamInterface>)nativeMediaStream {
-  return _nativeMediaStream;
-}
-
-- (instancetype)initWithNativeMediaStream:
-    (rtc::scoped_refptr<webrtc::MediaStreamInterface>)nativeMediaStream {
-  NSParameterAssert(nativeMediaStream);
-  if (self = [super init]) {
-    webrtc::AudioTrackVector audioTracks = nativeMediaStream->GetAudioTracks();
-    webrtc::VideoTrackVector videoTracks = nativeMediaStream->GetVideoTracks();
-
-    _audioTracks = [NSMutableArray arrayWithCapacity:audioTracks.size()];
-    _videoTracks = [NSMutableArray arrayWithCapacity:videoTracks.size()];
-    _nativeMediaStream = nativeMediaStream;
-
-    for (auto &track : audioTracks) {
-      RTCMediaStreamTrackType type = RTCMediaStreamTrackTypeAudio;
-      RTCAudioTrack *audioTrack =
-          [[RTCAudioTrack alloc] initWithNativeTrack:track type:type];
-      [_audioTracks addObject:audioTrack];
-    }
-
-    for (auto &track : videoTracks) {
-      RTCMediaStreamTrackType type = RTCMediaStreamTrackTypeVideo;
-      RTCVideoTrack *videoTrack =
-          [[RTCVideoTrack alloc] initWithNativeTrack:track type:type];
-      [_videoTracks addObject:videoTrack];
-    }
-  }
-  return self;
-}
-
-@end
diff --git a/sdk/objc/Framework/Classes/PeerConnection/RTCMediaStreamTrack+Private.h b/sdk/objc/Framework/Classes/PeerConnection/RTCMediaStreamTrack+Private.h
deleted file mode 100644
index d526126..0000000
--- a/sdk/objc/Framework/Classes/PeerConnection/RTCMediaStreamTrack+Private.h
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-#import "WebRTC/RTCMediaStreamTrack.h"
-
-#include "webrtc/api/mediastreaminterface.h"
-
-typedef NS_ENUM(NSInteger, RTCMediaStreamTrackType) {
-  RTCMediaStreamTrackTypeAudio,
-  RTCMediaStreamTrackTypeVideo,
-};
-
-NS_ASSUME_NONNULL_BEGIN
-
-@interface RTCMediaStreamTrack ()
-
-/**
- * The native MediaStreamTrackInterface passed in or created during
- * construction.
- */
-@property(nonatomic, readonly)
-    rtc::scoped_refptr<webrtc::MediaStreamTrackInterface> nativeTrack;
-
-/**
- * Initialize an RTCMediaStreamTrack from a native MediaStreamTrackInterface.
- */
-- (instancetype)initWithNativeTrack:
-    (rtc::scoped_refptr<webrtc::MediaStreamTrackInterface>)nativeTrack
-                               type:(RTCMediaStreamTrackType)type
-    NS_DESIGNATED_INITIALIZER;
-
-- (instancetype)initWithNativeTrack:
-    (rtc::scoped_refptr<webrtc::MediaStreamTrackInterface>)nativeTrack;
-
-- (BOOL)isEqualToTrack:(RTCMediaStreamTrack *)track;
-
-+ (webrtc::MediaStreamTrackInterface::TrackState)nativeTrackStateForState:
-    (RTCMediaStreamTrackState)state;
-
-+ (RTCMediaStreamTrackState)trackStateForNativeState:
-    (webrtc::MediaStreamTrackInterface::TrackState)nativeState;
-
-+ (NSString *)stringForState:(RTCMediaStreamTrackState)state;
-
-@end
-
-NS_ASSUME_NONNULL_END
diff --git a/sdk/objc/Framework/Classes/PeerConnection/RTCMediaStreamTrack.mm b/sdk/objc/Framework/Classes/PeerConnection/RTCMediaStreamTrack.mm
deleted file mode 100644
index 208550f..0000000
--- a/sdk/objc/Framework/Classes/PeerConnection/RTCMediaStreamTrack.mm
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-#import "RTCMediaStreamTrack+Private.h"
-
-#import "NSString+StdString.h"
-
-NSString * const kRTCMediaStreamTrackKindAudio =
-    @(webrtc::MediaStreamTrackInterface::kAudioKind);
-NSString * const kRTCMediaStreamTrackKindVideo =
-    @(webrtc::MediaStreamTrackInterface::kVideoKind);
-
-@implementation RTCMediaStreamTrack {
-  rtc::scoped_refptr<webrtc::MediaStreamTrackInterface> _nativeTrack;
-  RTCMediaStreamTrackType _type;
-}
-
-- (NSString *)kind {
-  return [NSString stringForStdString:_nativeTrack->kind()];
-}
-
-- (NSString *)trackId {
-  return [NSString stringForStdString:_nativeTrack->id()];
-}
-
-- (BOOL)isEnabled {
-  return _nativeTrack->enabled();
-}
-
-- (void)setIsEnabled:(BOOL)isEnabled {
-  _nativeTrack->set_enabled(isEnabled);
-}
-
-- (RTCMediaStreamTrackState)readyState {
-  return [[self class] trackStateForNativeState:_nativeTrack->state()];
-}
-
-- (NSString *)description {
-  NSString *readyState = [[self class] stringForState:self.readyState];
-  return [NSString stringWithFormat:@"RTCMediaStreamTrack:\n%@\n%@\n%@\n%@",
-                                    self.kind,
-                                    self.trackId,
-                                    self.isEnabled ? @"enabled" : @"disabled",
-                                    readyState];
-}
-
-- (BOOL)isEqual:(id)object {
-  if (self == object) {
-    return YES;
-  }
-  if (![object isMemberOfClass:[self class]]) {
-    return NO;
-  }
-  return [self isEqualToTrack:(RTCMediaStreamTrack *)object];
-}
-
-- (NSUInteger)hash {
-  return (NSUInteger)_nativeTrack.get();
-}
-
-#pragma mark - Private
-
-- (rtc::scoped_refptr<webrtc::MediaStreamTrackInterface>)nativeTrack {
-  return _nativeTrack;
-}
-
-- (instancetype)initWithNativeTrack:
-    (rtc::scoped_refptr<webrtc::MediaStreamTrackInterface>)nativeTrack
-                               type:(RTCMediaStreamTrackType)type {
-  NSParameterAssert(nativeTrack);
-  if (self = [super init]) {
-    _nativeTrack = nativeTrack;
-    _type = type;
-  }
-  return self;
-}
-
-- (instancetype)initWithNativeTrack:
-    (rtc::scoped_refptr<webrtc::MediaStreamTrackInterface>)nativeTrack {
-  NSParameterAssert(nativeTrack);
-  if (nativeTrack->kind() ==
-      std::string(webrtc::MediaStreamTrackInterface::kAudioKind)) {
-    return [self initWithNativeTrack:nativeTrack
-                                type:RTCMediaStreamTrackTypeAudio];
-  }
-  if (nativeTrack->kind() ==
-      std::string(webrtc::MediaStreamTrackInterface::kVideoKind)) {
-    return [self initWithNativeTrack:nativeTrack
-                                type:RTCMediaStreamTrackTypeVideo];
-  }
-  return nil;
-}
-
-- (BOOL)isEqualToTrack:(RTCMediaStreamTrack *)track {
-  if (!track) {
-    return NO;
-  }
-  return _nativeTrack == track.nativeTrack;
-}
-
-+ (webrtc::MediaStreamTrackInterface::TrackState)nativeTrackStateForState:
-    (RTCMediaStreamTrackState)state {
-  switch (state) {
-    case RTCMediaStreamTrackStateLive:
-      return webrtc::MediaStreamTrackInterface::kLive;
-    case RTCMediaStreamTrackStateEnded:
-      return webrtc::MediaStreamTrackInterface::kEnded;
-  }
-}
-
-+ (RTCMediaStreamTrackState)trackStateForNativeState:
-    (webrtc::MediaStreamTrackInterface::TrackState)nativeState {
-  switch (nativeState) {
-    case webrtc::MediaStreamTrackInterface::kLive:
-      return RTCMediaStreamTrackStateLive;
-    case webrtc::MediaStreamTrackInterface::kEnded:
-      return RTCMediaStreamTrackStateEnded;
-  }
-}
-
-+ (NSString *)stringForState:(RTCMediaStreamTrackState)state {
-  switch (state) {
-    case RTCMediaStreamTrackStateLive:
-      return @"Live";
-    case RTCMediaStreamTrackStateEnded:
-      return @"Ended";
-  }
-}
-
-@end
diff --git a/sdk/objc/Framework/Classes/PeerConnection/RTCMetrics.mm b/sdk/objc/Framework/Classes/PeerConnection/RTCMetrics.mm
deleted file mode 100644
index 279a2be..0000000
--- a/sdk/objc/Framework/Classes/PeerConnection/RTCMetrics.mm
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- *  Copyright 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.
- */
-
-#import "WebRTC/RTCMetrics.h"
-
-#import "RTCMetricsSampleInfo+Private.h"
-
-void RTCEnableMetrics() {
-  webrtc::metrics::Enable();
-}
-
-NSArray<RTCMetricsSampleInfo *> *RTCGetAndResetMetrics() {
-  std::map<std::string, std::unique_ptr<webrtc::metrics::SampleInfo>>
-      histograms;
-  webrtc::metrics::GetAndReset(&histograms);
-
-  NSMutableArray *metrics =
-      [NSMutableArray arrayWithCapacity:histograms.size()];
-  for (auto const &histogram : histograms) {
-    RTCMetricsSampleInfo *metric = [[RTCMetricsSampleInfo alloc]
-        initWithNativeSampleInfo:*histogram.second];
-    [metrics addObject:metric];
-  }
-  return metrics;
-}
diff --git a/sdk/objc/Framework/Classes/PeerConnection/RTCMetricsSampleInfo+Private.h b/sdk/objc/Framework/Classes/PeerConnection/RTCMetricsSampleInfo+Private.h
deleted file mode 100644
index 609fc74..0000000
--- a/sdk/objc/Framework/Classes/PeerConnection/RTCMetricsSampleInfo+Private.h
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- *  Copyright 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.
- */
-
-#import "WebRTC/RTCMetricsSampleInfo.h"
-
-// Adding 'nogncheck' to disable the gn include headers check.
-// We don't want to depend on 'system_wrappers:metrics_default' because
-// clients should be able to provide their own implementation.
-#include "webrtc/system_wrappers/include/metrics_default.h"  // nogncheck
-
-NS_ASSUME_NONNULL_BEGIN
-
-@interface RTCMetricsSampleInfo ()
-
-/** Initialize an RTCMetricsSampleInfo object from native SampleInfo. */
-- (instancetype)initWithNativeSampleInfo:
-    (const webrtc::metrics::SampleInfo &)info;
-
-@end
-
-NS_ASSUME_NONNULL_END
diff --git a/sdk/objc/Framework/Classes/PeerConnection/RTCMetricsSampleInfo.mm b/sdk/objc/Framework/Classes/PeerConnection/RTCMetricsSampleInfo.mm
deleted file mode 100644
index 628ba9e..0000000
--- a/sdk/objc/Framework/Classes/PeerConnection/RTCMetricsSampleInfo.mm
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- *  Copyright 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.
- */
-
-#import "RTCMetricsSampleInfo+Private.h"
-
-#import "NSString+StdString.h"
-
-@implementation RTCMetricsSampleInfo
-
-@synthesize name = _name;
-@synthesize min = _min;
-@synthesize max = _max;
-@synthesize bucketCount = _bucketCount;
-@synthesize samples = _samples;
-
-#pragma mark - Private
-
-- (instancetype)initWithNativeSampleInfo:
-    (const webrtc::metrics::SampleInfo &)info {
-  if (self = [super init]) {
-    _name = [NSString stringForStdString:info.name];
-    _min = info.min;
-    _max = info.max;
-    _bucketCount = info.bucket_count;
-
-    NSMutableDictionary *samples =
-        [NSMutableDictionary dictionaryWithCapacity:info.samples.size()];
-    for (auto const &sample : info.samples) {
-      [samples setObject:@(sample.second) forKey:@(sample.first)];
-    }
-    _samples = samples;
-  }
-  return self;
-}
-
-@end
diff --git a/sdk/objc/Framework/Classes/PeerConnection/RTCPeerConnection+DataChannel.mm b/sdk/objc/Framework/Classes/PeerConnection/RTCPeerConnection+DataChannel.mm
deleted file mode 100644
index 80b5108..0000000
--- a/sdk/objc/Framework/Classes/PeerConnection/RTCPeerConnection+DataChannel.mm
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-#import "RTCPeerConnection+Private.h"
-
-#import "NSString+StdString.h"
-#import "RTCDataChannel+Private.h"
-#import "RTCDataChannelConfiguration+Private.h"
-
-@implementation RTCPeerConnection (DataChannel)
-
-- (RTCDataChannel *)dataChannelForLabel:(NSString *)label
-                          configuration:
-    (RTCDataChannelConfiguration *)configuration {
-  std::string labelString = [NSString stdStringForString:label];
-  const webrtc::DataChannelInit nativeInit =
-      configuration.nativeDataChannelInit;
-  rtc::scoped_refptr<webrtc::DataChannelInterface> dataChannel =
-      self.nativePeerConnection->CreateDataChannel(labelString,
-                                                   &nativeInit);
-  if (!dataChannel) {
-    return nil;
-  }
-  return [[RTCDataChannel alloc] initWithNativeDataChannel:dataChannel];
-}
-
-@end
diff --git a/sdk/objc/Framework/Classes/PeerConnection/RTCPeerConnection+Private.h b/sdk/objc/Framework/Classes/PeerConnection/RTCPeerConnection+Private.h
deleted file mode 100644
index 60ab868..0000000
--- a/sdk/objc/Framework/Classes/PeerConnection/RTCPeerConnection+Private.h
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-#import "WebRTC/RTCPeerConnection.h"
-
-#include "webrtc/api/peerconnectioninterface.h"
-
-NS_ASSUME_NONNULL_BEGIN
-
-namespace webrtc {
-
-/**
- * These objects are created by RTCPeerConnectionFactory to wrap an
- * id<RTCPeerConnectionDelegate> and call methods on that interface.
- */
-class PeerConnectionDelegateAdapter : public PeerConnectionObserver {
-
- public:
-  PeerConnectionDelegateAdapter(RTCPeerConnection *peerConnection);
-  virtual ~PeerConnectionDelegateAdapter();
-
-  void OnSignalingChange(
-      PeerConnectionInterface::SignalingState new_state) override;
-
-  void OnAddStream(rtc::scoped_refptr<MediaStreamInterface> stream) override;
-
-  void OnRemoveStream(rtc::scoped_refptr<MediaStreamInterface> stream) override;
-
-  void OnDataChannel(
-      rtc::scoped_refptr<DataChannelInterface> data_channel) override;
-
-  void OnRenegotiationNeeded() override;
-
-  void OnIceConnectionChange(
-      PeerConnectionInterface::IceConnectionState new_state) override;
-
-  void OnIceGatheringChange(
-      PeerConnectionInterface::IceGatheringState new_state) override;
-
-  void OnIceCandidate(const IceCandidateInterface *candidate) override;
-
-  void OnIceCandidatesRemoved(
-      const std::vector<cricket::Candidate>& candidates) override;
-
- private:
-  __weak RTCPeerConnection *peer_connection_;
-};
-
-} // namespace webrtc
-
-
-@interface RTCPeerConnection ()
-
-/** The native PeerConnectionInterface created during construction. */
-@property(nonatomic, readonly)
-    rtc::scoped_refptr<webrtc::PeerConnectionInterface> nativePeerConnection;
-
-/** Initialize an RTCPeerConnection with a configuration, constraints, and
- *  delegate.
- */
-- (instancetype)initWithFactory:
-    (RTCPeerConnectionFactory *)factory
-                  configuration:
-    (RTCConfiguration *)configuration
-                    constraints:
-    (RTCMediaConstraints *)constraints
-                       delegate:
-    (nullable id<RTCPeerConnectionDelegate>)delegate
-    NS_DESIGNATED_INITIALIZER;
-
-+ (webrtc::PeerConnectionInterface::SignalingState)nativeSignalingStateForState:
-    (RTCSignalingState)state;
-
-+ (RTCSignalingState)signalingStateForNativeState:
-    (webrtc::PeerConnectionInterface::SignalingState)nativeState;
-
-+ (NSString *)stringForSignalingState:(RTCSignalingState)state;
-
-+ (webrtc::PeerConnectionInterface::IceConnectionState)
-    nativeIceConnectionStateForState:(RTCIceConnectionState)state;
-
-+ (RTCIceConnectionState)iceConnectionStateForNativeState:
-    (webrtc::PeerConnectionInterface::IceConnectionState)nativeState;
-
-+ (NSString *)stringForIceConnectionState:(RTCIceConnectionState)state;
-
-+ (webrtc::PeerConnectionInterface::IceGatheringState)
-    nativeIceGatheringStateForState:(RTCIceGatheringState)state;
-
-+ (RTCIceGatheringState)iceGatheringStateForNativeState:
-    (webrtc::PeerConnectionInterface::IceGatheringState)nativeState;
-
-+ (NSString *)stringForIceGatheringState:(RTCIceGatheringState)state;
-
-+ (webrtc::PeerConnectionInterface::StatsOutputLevel)
-    nativeStatsOutputLevelForLevel:(RTCStatsOutputLevel)level;
-
-@end
-
-NS_ASSUME_NONNULL_END
diff --git a/sdk/objc/Framework/Classes/PeerConnection/RTCPeerConnection+Stats.mm b/sdk/objc/Framework/Classes/PeerConnection/RTCPeerConnection+Stats.mm
deleted file mode 100644
index 8e56465..0000000
--- a/sdk/objc/Framework/Classes/PeerConnection/RTCPeerConnection+Stats.mm
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-#import "RTCPeerConnection+Private.h"
-
-#import "NSString+StdString.h"
-#import "RTCMediaStreamTrack+Private.h"
-#import "RTCLegacyStatsReport+Private.h"
-
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-
-class StatsObserverAdapter : public StatsObserver {
- public:
-  StatsObserverAdapter(void (^completionHandler)
-      (NSArray<RTCLegacyStatsReport *> *stats)) {
-    completion_handler_ = completionHandler;
-  }
-
-  ~StatsObserverAdapter() {
-    completion_handler_ = nil;
-  }
-
-  void OnComplete(const StatsReports& reports) override {
-    RTC_DCHECK(completion_handler_);
-    NSMutableArray *stats = [NSMutableArray arrayWithCapacity:reports.size()];
-    for (const auto* report : reports) {
-      RTCLegacyStatsReport *statsReport =
-          [[RTCLegacyStatsReport alloc] initWithNativeReport:*report];
-      [stats addObject:statsReport];
-    }
-    completion_handler_(stats);
-    completion_handler_ = nil;
-  }
-
- private:
-  void (^completion_handler_)(NSArray<RTCLegacyStatsReport *> *stats);
-};
-}  // namespace webrtc
-
-@implementation RTCPeerConnection (Stats)
-
-- (void)statsForTrack:(RTCMediaStreamTrack *)mediaStreamTrack
-     statsOutputLevel:(RTCStatsOutputLevel)statsOutputLevel
-    completionHandler:
-    (void (^)(NSArray<RTCLegacyStatsReport *> *stats))completionHandler {
-  rtc::scoped_refptr<webrtc::StatsObserverAdapter> observer(
-      new rtc::RefCountedObject<webrtc::StatsObserverAdapter>
-          (completionHandler));
-  webrtc::PeerConnectionInterface::StatsOutputLevel nativeOutputLevel =
-      [[self class] nativeStatsOutputLevelForLevel:statsOutputLevel];
-  self.nativePeerConnection->GetStats(
-      observer, mediaStreamTrack.nativeTrack, nativeOutputLevel);
-}
-
-@end
diff --git a/sdk/objc/Framework/Classes/PeerConnection/RTCPeerConnection.mm b/sdk/objc/Framework/Classes/PeerConnection/RTCPeerConnection.mm
deleted file mode 100644
index c08503e..0000000
--- a/sdk/objc/Framework/Classes/PeerConnection/RTCPeerConnection.mm
+++ /dev/null
@@ -1,617 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-#import "RTCPeerConnection+Private.h"
-
-#import "NSString+StdString.h"
-#import "RTCConfiguration+Private.h"
-#import "RTCDataChannel+Private.h"
-#import "RTCIceCandidate+Private.h"
-#import "RTCLegacyStatsReport+Private.h"
-#import "RTCMediaConstraints+Private.h"
-#import "RTCMediaStream+Private.h"
-#import "RTCPeerConnectionFactory+Private.h"
-#import "RTCRtpReceiver+Private.h"
-#import "RTCRtpSender+Private.h"
-#import "RTCSessionDescription+Private.h"
-#import "WebRTC/RTCLogging.h"
-
-#include <memory>
-
-#include "webrtc/api/jsepicecandidate.h"
-#include "webrtc/rtc_base/checks.h"
-
-NSString * const kRTCPeerConnectionErrorDomain =
-    @"org.webrtc.RTCPeerConnection";
-int const kRTCPeerConnnectionSessionDescriptionError = -1;
-
-namespace webrtc {
-
-class CreateSessionDescriptionObserverAdapter
-    : public CreateSessionDescriptionObserver {
- public:
-  CreateSessionDescriptionObserverAdapter(
-      void (^completionHandler)(RTCSessionDescription *sessionDescription,
-                                NSError *error)) {
-    completion_handler_ = completionHandler;
-  }
-
-  ~CreateSessionDescriptionObserverAdapter() {
-    completion_handler_ = nil;
-  }
-
-  void OnSuccess(SessionDescriptionInterface *desc) override {
-    RTC_DCHECK(completion_handler_);
-    std::unique_ptr<webrtc::SessionDescriptionInterface> description =
-        std::unique_ptr<webrtc::SessionDescriptionInterface>(desc);
-    RTCSessionDescription* session =
-        [[RTCSessionDescription alloc] initWithNativeDescription:
-            description.get()];
-    completion_handler_(session, nil);
-    completion_handler_ = nil;
-  }
-
-  void OnFailure(const std::string& error) override {
-    RTC_DCHECK(completion_handler_);
-    NSString* str = [NSString stringForStdString:error];
-    NSError* err =
-        [NSError errorWithDomain:kRTCPeerConnectionErrorDomain
-                            code:kRTCPeerConnnectionSessionDescriptionError
-                        userInfo:@{ NSLocalizedDescriptionKey : str }];
-    completion_handler_(nil, err);
-    completion_handler_ = nil;
-  }
-
- private:
-  void (^completion_handler_)
-      (RTCSessionDescription *sessionDescription, NSError *error);
-};
-
-class SetSessionDescriptionObserverAdapter :
-    public SetSessionDescriptionObserver {
- public:
-  SetSessionDescriptionObserverAdapter(void (^completionHandler)
-      (NSError *error)) {
-    completion_handler_ = completionHandler;
-  }
-
-  ~SetSessionDescriptionObserverAdapter() {
-    completion_handler_ = nil;
-  }
-
-  void OnSuccess() override {
-    RTC_DCHECK(completion_handler_);
-    completion_handler_(nil);
-    completion_handler_ = nil;
-  }
-
-  void OnFailure(const std::string& error) override {
-    RTC_DCHECK(completion_handler_);
-    NSString* str = [NSString stringForStdString:error];
-    NSError* err =
-        [NSError errorWithDomain:kRTCPeerConnectionErrorDomain
-                            code:kRTCPeerConnnectionSessionDescriptionError
-                        userInfo:@{ NSLocalizedDescriptionKey : str }];
-    completion_handler_(err);
-    completion_handler_ = nil;
-  }
-
- private:
-  void (^completion_handler_)(NSError *error);
-};
-
-PeerConnectionDelegateAdapter::PeerConnectionDelegateAdapter(
-    RTCPeerConnection *peerConnection) {
-  peer_connection_ = peerConnection;
-}
-
-PeerConnectionDelegateAdapter::~PeerConnectionDelegateAdapter() {
-  peer_connection_ = nil;
-}
-
-void PeerConnectionDelegateAdapter::OnSignalingChange(
-    PeerConnectionInterface::SignalingState new_state) {
-  RTCSignalingState state =
-      [[RTCPeerConnection class] signalingStateForNativeState:new_state];
-  RTCPeerConnection *peer_connection = peer_connection_;
-  [peer_connection.delegate peerConnection:peer_connection
-                   didChangeSignalingState:state];
-}
-
-void PeerConnectionDelegateAdapter::OnAddStream(
-    rtc::scoped_refptr<MediaStreamInterface> stream) {
-  RTCMediaStream *mediaStream =
-      [[RTCMediaStream alloc] initWithNativeMediaStream:stream];
-  RTCPeerConnection *peer_connection = peer_connection_;
-  [peer_connection.delegate peerConnection:peer_connection
-                              didAddStream:mediaStream];
-}
-
-void PeerConnectionDelegateAdapter::OnRemoveStream(
-    rtc::scoped_refptr<MediaStreamInterface> stream) {
-  RTCMediaStream *mediaStream =
-      [[RTCMediaStream alloc] initWithNativeMediaStream:stream];
-  RTCPeerConnection *peer_connection = peer_connection_;
-  [peer_connection.delegate peerConnection:peer_connection
-                           didRemoveStream:mediaStream];
-}
-
-void PeerConnectionDelegateAdapter::OnDataChannel(
-    rtc::scoped_refptr<DataChannelInterface> data_channel) {
-  RTCDataChannel *dataChannel =
-      [[RTCDataChannel alloc] initWithNativeDataChannel:data_channel];
-  RTCPeerConnection *peer_connection = peer_connection_;
-  [peer_connection.delegate peerConnection:peer_connection
-                        didOpenDataChannel:dataChannel];
-}
-
-void PeerConnectionDelegateAdapter::OnRenegotiationNeeded() {
-  RTCPeerConnection *peer_connection = peer_connection_;
-  [peer_connection.delegate peerConnectionShouldNegotiate:peer_connection];
-}
-
-void PeerConnectionDelegateAdapter::OnIceConnectionChange(
-    PeerConnectionInterface::IceConnectionState new_state) {
-  RTCIceConnectionState state =
-      [[RTCPeerConnection class] iceConnectionStateForNativeState:new_state];
-  RTCPeerConnection *peer_connection = peer_connection_;
-  [peer_connection.delegate peerConnection:peer_connection
-               didChangeIceConnectionState:state];
-}
-
-void PeerConnectionDelegateAdapter::OnIceGatheringChange(
-    PeerConnectionInterface::IceGatheringState new_state) {
-  RTCIceGatheringState state =
-      [[RTCPeerConnection class] iceGatheringStateForNativeState:new_state];
-  RTCPeerConnection *peer_connection = peer_connection_;
-  [peer_connection.delegate peerConnection:peer_connection
-                didChangeIceGatheringState:state];
-}
-
-void PeerConnectionDelegateAdapter::OnIceCandidate(
-    const IceCandidateInterface *candidate) {
-  RTCIceCandidate *iceCandidate =
-      [[RTCIceCandidate alloc] initWithNativeCandidate:candidate];
-  RTCPeerConnection *peer_connection = peer_connection_;
-  [peer_connection.delegate peerConnection:peer_connection
-                   didGenerateIceCandidate:iceCandidate];
-}
-
-void PeerConnectionDelegateAdapter::OnIceCandidatesRemoved(
-    const std::vector<cricket::Candidate>& candidates) {
-  NSMutableArray* ice_candidates =
-      [NSMutableArray arrayWithCapacity:candidates.size()];
-  for (const auto& candidate : candidates) {
-    std::unique_ptr<JsepIceCandidate> candidate_wrapper(
-        new JsepIceCandidate(candidate.transport_name(), -1, candidate));
-    RTCIceCandidate* ice_candidate = [[RTCIceCandidate alloc]
-        initWithNativeCandidate:candidate_wrapper.get()];
-    [ice_candidates addObject:ice_candidate];
-  }
-  RTCPeerConnection* peer_connection = peer_connection_;
-  [peer_connection.delegate peerConnection:peer_connection
-                    didRemoveIceCandidates:ice_candidates];
-}
-
-}  // namespace webrtc
-
-
-@implementation RTCPeerConnection {
-  NSMutableArray<RTCMediaStream *> *_localStreams;
-  std::unique_ptr<webrtc::PeerConnectionDelegateAdapter> _observer;
-  rtc::scoped_refptr<webrtc::PeerConnectionInterface> _peerConnection;
-  std::unique_ptr<webrtc::MediaConstraints> _nativeConstraints;
-  BOOL _hasStartedRtcEventLog;
-}
-
-@synthesize delegate = _delegate;
-
-- (instancetype)initWithFactory:(RTCPeerConnectionFactory *)factory
-                  configuration:(RTCConfiguration *)configuration
-                    constraints:(RTCMediaConstraints *)constraints
-                       delegate:(id<RTCPeerConnectionDelegate>)delegate {
-  NSParameterAssert(factory);
-  std::unique_ptr<webrtc::PeerConnectionInterface::RTCConfiguration> config(
-      [configuration createNativeConfiguration]);
-  if (!config) {
-    return nil;
-  }
-  if (self = [super init]) {
-    _observer.reset(new webrtc::PeerConnectionDelegateAdapter(self));
-    _nativeConstraints = constraints.nativeConstraints;
-    CopyConstraintsIntoRtcConfiguration(_nativeConstraints.get(),
-                                        config.get());
-    _peerConnection =
-        factory.nativeFactory->CreatePeerConnection(*config,
-                                                    nullptr,
-                                                    nullptr,
-                                                    _observer.get());
-    if (!_peerConnection) {
-      return nil;
-    }
-    _localStreams = [[NSMutableArray alloc] init];
-    _delegate = delegate;
-  }
-  return self;
-}
-
-- (NSArray<RTCMediaStream *> *)localStreams {
-  return [_localStreams copy];
-}
-
-- (RTCSessionDescription *)localDescription {
-  const webrtc::SessionDescriptionInterface *description =
-      _peerConnection->local_description();
-  return description ?
-      [[RTCSessionDescription alloc] initWithNativeDescription:description]
-          : nil;
-}
-
-- (RTCSessionDescription *)remoteDescription {
-  const webrtc::SessionDescriptionInterface *description =
-      _peerConnection->remote_description();
-  return description ?
-      [[RTCSessionDescription alloc] initWithNativeDescription:description]
-          : nil;
-}
-
-- (RTCSignalingState)signalingState {
-  return [[self class]
-      signalingStateForNativeState:_peerConnection->signaling_state()];
-}
-
-- (RTCIceConnectionState)iceConnectionState {
-  return [[self class] iceConnectionStateForNativeState:
-      _peerConnection->ice_connection_state()];
-}
-
-- (RTCIceGatheringState)iceGatheringState {
-  return [[self class] iceGatheringStateForNativeState:
-      _peerConnection->ice_gathering_state()];
-}
-
-- (BOOL)setConfiguration:(RTCConfiguration *)configuration {
-  std::unique_ptr<webrtc::PeerConnectionInterface::RTCConfiguration> config(
-      [configuration createNativeConfiguration]);
-  if (!config) {
-    return NO;
-  }
-  CopyConstraintsIntoRtcConfiguration(_nativeConstraints.get(),
-                                      config.get());
-  return _peerConnection->SetConfiguration(*config);
-}
-
-- (RTCConfiguration *)configuration {
-  webrtc::PeerConnectionInterface::RTCConfiguration config =
-    _peerConnection->GetConfiguration();
-  return [[RTCConfiguration alloc] initWithNativeConfiguration:config];
-}
-
-- (void)close {
-  _peerConnection->Close();
-}
-
-- (void)addIceCandidate:(RTCIceCandidate *)candidate {
-  std::unique_ptr<const webrtc::IceCandidateInterface> iceCandidate(
-      candidate.nativeCandidate);
-  _peerConnection->AddIceCandidate(iceCandidate.get());
-}
-
-- (void)removeIceCandidates:(NSArray<RTCIceCandidate *> *)iceCandidates {
-  std::vector<cricket::Candidate> candidates;
-  for (RTCIceCandidate *iceCandidate in iceCandidates) {
-    std::unique_ptr<const webrtc::IceCandidateInterface> candidate(
-        iceCandidate.nativeCandidate);
-    if (candidate) {
-      candidates.push_back(candidate->candidate());
-      // Need to fill the transport name from the sdp_mid.
-      candidates.back().set_transport_name(candidate->sdp_mid());
-    }
-  }
-  if (!candidates.empty()) {
-    _peerConnection->RemoveIceCandidates(candidates);
-  }
-}
-
-- (void)addStream:(RTCMediaStream *)stream {
-  if (!_peerConnection->AddStream(stream.nativeMediaStream)) {
-    RTCLogError(@"Failed to add stream: %@", stream);
-    return;
-  }
-  [_localStreams addObject:stream];
-}
-
-- (void)removeStream:(RTCMediaStream *)stream {
-  _peerConnection->RemoveStream(stream.nativeMediaStream);
-  [_localStreams removeObject:stream];
-}
-
-- (void)offerForConstraints:(RTCMediaConstraints *)constraints
-          completionHandler:
-    (void (^)(RTCSessionDescription *sessionDescription,
-              NSError *error))completionHandler {
-  rtc::scoped_refptr<webrtc::CreateSessionDescriptionObserverAdapter>
-      observer(new rtc::RefCountedObject
-          <webrtc::CreateSessionDescriptionObserverAdapter>(completionHandler));
-  _peerConnection->CreateOffer(observer, constraints.nativeConstraints.get());
-}
-
-- (void)answerForConstraints:(RTCMediaConstraints *)constraints
-           completionHandler:
-    (void (^)(RTCSessionDescription *sessionDescription,
-              NSError *error))completionHandler {
-  rtc::scoped_refptr<webrtc::CreateSessionDescriptionObserverAdapter>
-      observer(new rtc::RefCountedObject
-          <webrtc::CreateSessionDescriptionObserverAdapter>(completionHandler));
-  _peerConnection->CreateAnswer(observer, constraints.nativeConstraints.get());
-}
-
-- (void)setLocalDescription:(RTCSessionDescription *)sdp
-          completionHandler:(void (^)(NSError *error))completionHandler {
-  rtc::scoped_refptr<webrtc::SetSessionDescriptionObserverAdapter> observer(
-      new rtc::RefCountedObject<webrtc::SetSessionDescriptionObserverAdapter>(
-          completionHandler));
-  _peerConnection->SetLocalDescription(observer, sdp.nativeDescription);
-}
-
-- (void)setRemoteDescription:(RTCSessionDescription *)sdp
-           completionHandler:(void (^)(NSError *error))completionHandler {
-  rtc::scoped_refptr<webrtc::SetSessionDescriptionObserverAdapter> observer(
-      new rtc::RefCountedObject<webrtc::SetSessionDescriptionObserverAdapter>(
-          completionHandler));
-  _peerConnection->SetRemoteDescription(observer, sdp.nativeDescription);
-}
-
-- (BOOL)setBweMinBitrateBps:(nullable NSNumber *)minBitrateBps
-          currentBitrateBps:(nullable NSNumber *)currentBitrateBps
-              maxBitrateBps:(nullable NSNumber *)maxBitrateBps {
-  webrtc::PeerConnectionInterface::BitrateParameters params;
-  if (minBitrateBps != nil) {
-    params.min_bitrate_bps = rtc::Optional<int>(minBitrateBps.intValue);
-  }
-  if (currentBitrateBps != nil) {
-    params.current_bitrate_bps = rtc::Optional<int>(currentBitrateBps.intValue);
-  }
-  if (maxBitrateBps != nil) {
-    params.max_bitrate_bps = rtc::Optional<int>(maxBitrateBps.intValue);
-  }
-  return _peerConnection->SetBitrate(params).ok();
-}
-
-- (BOOL)startRtcEventLogWithFilePath:(NSString *)filePath
-                      maxSizeInBytes:(int64_t)maxSizeInBytes {
-  RTC_DCHECK(filePath.length);
-  RTC_DCHECK_GT(maxSizeInBytes, 0);
-  RTC_DCHECK(!_hasStartedRtcEventLog);
-  if (_hasStartedRtcEventLog) {
-    RTCLogError(@"Event logging already started.");
-    return NO;
-  }
-  int fd = open(filePath.UTF8String, O_WRONLY | O_CREAT | O_TRUNC,
-                S_IRUSR | S_IWUSR);
-  if (fd < 0) {
-    RTCLogError(@"Error opening file: %@. Error: %d", filePath, errno);
-    return NO;
-  }
-  _hasStartedRtcEventLog =
-      _peerConnection->StartRtcEventLog(fd, maxSizeInBytes);
-  return _hasStartedRtcEventLog;
-}
-
-- (void)stopRtcEventLog {
-  _peerConnection->StopRtcEventLog();
-  _hasStartedRtcEventLog = NO;
-}
-
-- (RTCRtpSender *)senderWithKind:(NSString *)kind
-                        streamId:(NSString *)streamId {
-  std::string nativeKind = [NSString stdStringForString:kind];
-  std::string nativeStreamId = [NSString stdStringForString:streamId];
-  rtc::scoped_refptr<webrtc::RtpSenderInterface> nativeSender(
-      _peerConnection->CreateSender(nativeKind, nativeStreamId));
-  return nativeSender ?
-      [[RTCRtpSender alloc] initWithNativeRtpSender:nativeSender]
-      : nil;
-}
-
-- (NSArray<RTCRtpSender *> *)senders {
-  std::vector<rtc::scoped_refptr<webrtc::RtpSenderInterface>> nativeSenders(
-      _peerConnection->GetSenders());
-  NSMutableArray *senders = [[NSMutableArray alloc] init];
-  for (const auto &nativeSender : nativeSenders) {
-    RTCRtpSender *sender =
-        [[RTCRtpSender alloc] initWithNativeRtpSender:nativeSender];
-    [senders addObject:sender];
-  }
-  return senders;
-}
-
-- (NSArray<RTCRtpReceiver *> *)receivers {
-  std::vector<rtc::scoped_refptr<webrtc::RtpReceiverInterface>> nativeReceivers(
-      _peerConnection->GetReceivers());
-  NSMutableArray *receivers = [[NSMutableArray alloc] init];
-  for (const auto &nativeReceiver : nativeReceivers) {
-    RTCRtpReceiver *receiver =
-        [[RTCRtpReceiver alloc] initWithNativeRtpReceiver:nativeReceiver];
-    [receivers addObject:receiver];
-  }
-  return receivers;
-}
-
-#pragma mark - Private
-
-+ (webrtc::PeerConnectionInterface::SignalingState)nativeSignalingStateForState:
-    (RTCSignalingState)state {
-  switch (state) {
-    case RTCSignalingStateStable:
-      return webrtc::PeerConnectionInterface::kStable;
-    case RTCSignalingStateHaveLocalOffer:
-      return webrtc::PeerConnectionInterface::kHaveLocalOffer;
-    case RTCSignalingStateHaveLocalPrAnswer:
-      return webrtc::PeerConnectionInterface::kHaveLocalPrAnswer;
-    case RTCSignalingStateHaveRemoteOffer:
-      return webrtc::PeerConnectionInterface::kHaveRemoteOffer;
-    case RTCSignalingStateHaveRemotePrAnswer:
-      return webrtc::PeerConnectionInterface::kHaveRemotePrAnswer;
-    case RTCSignalingStateClosed:
-      return webrtc::PeerConnectionInterface::kClosed;
-  }
-}
-
-+ (RTCSignalingState)signalingStateForNativeState:
-    (webrtc::PeerConnectionInterface::SignalingState)nativeState {
-  switch (nativeState) {
-    case webrtc::PeerConnectionInterface::kStable:
-      return RTCSignalingStateStable;
-    case webrtc::PeerConnectionInterface::kHaveLocalOffer:
-      return RTCSignalingStateHaveLocalOffer;
-    case webrtc::PeerConnectionInterface::kHaveLocalPrAnswer:
-      return RTCSignalingStateHaveLocalPrAnswer;
-    case webrtc::PeerConnectionInterface::kHaveRemoteOffer:
-      return RTCSignalingStateHaveRemoteOffer;
-    case webrtc::PeerConnectionInterface::kHaveRemotePrAnswer:
-      return RTCSignalingStateHaveRemotePrAnswer;
-    case webrtc::PeerConnectionInterface::kClosed:
-      return RTCSignalingStateClosed;
-  }
-}
-
-+ (NSString *)stringForSignalingState:(RTCSignalingState)state {
-  switch (state) {
-    case RTCSignalingStateStable:
-      return @"STABLE";
-    case RTCSignalingStateHaveLocalOffer:
-      return @"HAVE_LOCAL_OFFER";
-    case RTCSignalingStateHaveLocalPrAnswer:
-      return @"HAVE_LOCAL_PRANSWER";
-    case RTCSignalingStateHaveRemoteOffer:
-      return @"HAVE_REMOTE_OFFER";
-    case RTCSignalingStateHaveRemotePrAnswer:
-      return @"HAVE_REMOTE_PRANSWER";
-    case RTCSignalingStateClosed:
-      return @"CLOSED";
-  }
-}
-
-+ (webrtc::PeerConnectionInterface::IceConnectionState)
-    nativeIceConnectionStateForState:(RTCIceConnectionState)state {
-  switch (state) {
-    case RTCIceConnectionStateNew:
-      return webrtc::PeerConnectionInterface::kIceConnectionNew;
-    case RTCIceConnectionStateChecking:
-      return webrtc::PeerConnectionInterface::kIceConnectionChecking;
-    case RTCIceConnectionStateConnected:
-      return webrtc::PeerConnectionInterface::kIceConnectionConnected;
-    case RTCIceConnectionStateCompleted:
-      return webrtc::PeerConnectionInterface::kIceConnectionCompleted;
-    case RTCIceConnectionStateFailed:
-      return webrtc::PeerConnectionInterface::kIceConnectionFailed;
-    case RTCIceConnectionStateDisconnected:
-      return webrtc::PeerConnectionInterface::kIceConnectionDisconnected;
-    case RTCIceConnectionStateClosed:
-      return webrtc::PeerConnectionInterface::kIceConnectionClosed;
-    case RTCIceConnectionStateCount:
-      return webrtc::PeerConnectionInterface::kIceConnectionMax;
-  }
-}
-
-+ (RTCIceConnectionState)iceConnectionStateForNativeState:
-    (webrtc::PeerConnectionInterface::IceConnectionState)nativeState {
-  switch (nativeState) {
-    case webrtc::PeerConnectionInterface::kIceConnectionNew:
-      return RTCIceConnectionStateNew;
-    case webrtc::PeerConnectionInterface::kIceConnectionChecking:
-      return RTCIceConnectionStateChecking;
-    case webrtc::PeerConnectionInterface::kIceConnectionConnected:
-      return RTCIceConnectionStateConnected;
-    case webrtc::PeerConnectionInterface::kIceConnectionCompleted:
-      return RTCIceConnectionStateCompleted;
-    case webrtc::PeerConnectionInterface::kIceConnectionFailed:
-      return RTCIceConnectionStateFailed;
-    case webrtc::PeerConnectionInterface::kIceConnectionDisconnected:
-      return RTCIceConnectionStateDisconnected;
-    case webrtc::PeerConnectionInterface::kIceConnectionClosed:
-      return RTCIceConnectionStateClosed;
-    case webrtc::PeerConnectionInterface::kIceConnectionMax:
-      return RTCIceConnectionStateCount;
-  }
-}
-
-+ (NSString *)stringForIceConnectionState:(RTCIceConnectionState)state {
-  switch (state) {
-    case RTCIceConnectionStateNew:
-      return @"NEW";
-    case RTCIceConnectionStateChecking:
-      return @"CHECKING";
-    case RTCIceConnectionStateConnected:
-      return @"CONNECTED";
-    case RTCIceConnectionStateCompleted:
-      return @"COMPLETED";
-    case RTCIceConnectionStateFailed:
-      return @"FAILED";
-    case RTCIceConnectionStateDisconnected:
-      return @"DISCONNECTED";
-    case RTCIceConnectionStateClosed:
-      return @"CLOSED";
-    case RTCIceConnectionStateCount:
-      return @"COUNT";
-  }
-}
-
-+ (webrtc::PeerConnectionInterface::IceGatheringState)
-    nativeIceGatheringStateForState:(RTCIceGatheringState)state {
-  switch (state) {
-    case RTCIceGatheringStateNew:
-      return webrtc::PeerConnectionInterface::kIceGatheringNew;
-    case RTCIceGatheringStateGathering:
-      return webrtc::PeerConnectionInterface::kIceGatheringGathering;
-    case RTCIceGatheringStateComplete:
-      return webrtc::PeerConnectionInterface::kIceGatheringComplete;
-  }
-}
-
-+ (RTCIceGatheringState)iceGatheringStateForNativeState:
-    (webrtc::PeerConnectionInterface::IceGatheringState)nativeState {
-  switch (nativeState) {
-    case webrtc::PeerConnectionInterface::kIceGatheringNew:
-      return RTCIceGatheringStateNew;
-    case webrtc::PeerConnectionInterface::kIceGatheringGathering:
-      return RTCIceGatheringStateGathering;
-    case webrtc::PeerConnectionInterface::kIceGatheringComplete:
-      return RTCIceGatheringStateComplete;
-  }
-}
-
-+ (NSString *)stringForIceGatheringState:(RTCIceGatheringState)state {
-  switch (state) {
-    case RTCIceGatheringStateNew:
-      return @"NEW";
-    case RTCIceGatheringStateGathering:
-      return @"GATHERING";
-    case RTCIceGatheringStateComplete:
-      return @"COMPLETE";
-  }
-}
-
-+ (webrtc::PeerConnectionInterface::StatsOutputLevel)
-    nativeStatsOutputLevelForLevel:(RTCStatsOutputLevel)level {
-  switch (level) {
-    case RTCStatsOutputLevelStandard:
-      return webrtc::PeerConnectionInterface::kStatsOutputLevelStandard;
-    case RTCStatsOutputLevelDebug:
-      return webrtc::PeerConnectionInterface::kStatsOutputLevelDebug;
-  }
-}
-
-- (rtc::scoped_refptr<webrtc::PeerConnectionInterface>)nativePeerConnection {
-  return _peerConnection;
-}
-
-@end
diff --git a/sdk/objc/Framework/Classes/PeerConnection/RTCPeerConnectionFactory+Native.h b/sdk/objc/Framework/Classes/PeerConnection/RTCPeerConnectionFactory+Native.h
deleted file mode 100644
index fb3068a..0000000
--- a/sdk/objc/Framework/Classes/PeerConnection/RTCPeerConnectionFactory+Native.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- *  Copyright 2017 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.
- */
-
-#import "WebRTC/RTCPeerConnectionFactory.h"
-
-#include "webrtc/rtc_base/scoped_ref_ptr.h"
-
-namespace webrtc {
-
-class AudioEncoderFactory;
-class AudioDecoderFactory;
-
-}  // namespace webrtc
-
-namespace cricket {
-
-class WebRtcVideoEncoderFactory;
-class WebRtcVideoDecoderFactory;
-
-}  // namespace cricket
-
-NS_ASSUME_NONNULL_BEGIN
-
-/**
- * This class extension exposes methods that work directly with injectable C++ components.
- */
-@interface RTCPeerConnectionFactory ()
-
-/* Initialize object with injectable native audio/video encoder/decoder factories */
-- (instancetype)initWithNativeAudioEncoderFactory:
-                    (rtc::scoped_refptr<webrtc::AudioEncoderFactory>)audioEncoderFactory
-                        nativeAudioDecoderFactory:
-                            (rtc::scoped_refptr<webrtc::AudioDecoderFactory>)audioDecoderFactory
-                        nativeVideoEncoderFactory:
-                            (nullable cricket::WebRtcVideoEncoderFactory *)videoEncoderFactory
-                        nativeVideoDecoderFactory:
-                            (nullable cricket::WebRtcVideoDecoderFactory *)videoDecoderFactory
-    NS_DESIGNATED_INITIALIZER;
-
-@end
-
-NS_ASSUME_NONNULL_END
diff --git a/sdk/objc/Framework/Classes/PeerConnection/RTCPeerConnectionFactory+Private.h b/sdk/objc/Framework/Classes/PeerConnection/RTCPeerConnectionFactory+Private.h
deleted file mode 100644
index 1c53e64..0000000
--- a/sdk/objc/Framework/Classes/PeerConnection/RTCPeerConnectionFactory+Private.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-#import "WebRTC/RTCPeerConnectionFactory.h"
-
-#include "webrtc/api/peerconnectioninterface.h"
-#include "webrtc/rtc_base/scoped_ref_ptr.h"
-
-NS_ASSUME_NONNULL_BEGIN
-
-@interface RTCPeerConnectionFactory ()
-
-/**
- * PeerConnectionFactoryInterface created and held by this
- * RTCPeerConnectionFactory object. This is needed to pass to the underlying
- * C++ APIs.
- */
-@property(nonatomic, readonly)
-    rtc::scoped_refptr<webrtc::PeerConnectionFactoryInterface> nativeFactory;
-
-@end
-
-NS_ASSUME_NONNULL_END
diff --git a/sdk/objc/Framework/Classes/PeerConnection/RTCPeerConnectionFactory.mm b/sdk/objc/Framework/Classes/PeerConnection/RTCPeerConnectionFactory.mm
deleted file mode 100644
index 48d788f..0000000
--- a/sdk/objc/Framework/Classes/PeerConnection/RTCPeerConnectionFactory.mm
+++ /dev/null
@@ -1,226 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-#import "RTCPeerConnectionFactory+Native.h"
-#import "RTCPeerConnectionFactory+Private.h"
-
-#import "NSString+StdString.h"
-#import "RTCAVFoundationVideoSource+Private.h"
-#import "RTCAudioSource+Private.h"
-#import "RTCAudioTrack+Private.h"
-#import "RTCMediaConstraints+Private.h"
-#import "RTCMediaStream+Private.h"
-#import "RTCPeerConnection+Private.h"
-#import "RTCVideoSource+Private.h"
-#import "RTCVideoTrack+Private.h"
-#import "WebRTC/RTCLogging.h"
-#import "WebRTC/RTCVideoCodecFactory.h"
-#ifndef HAVE_NO_MEDIA
-#include "VideoToolbox/objc_video_decoder_factory.h"
-#include "VideoToolbox/objc_video_encoder_factory.h"
-#import "WebRTC/RTCVideoCodecH264.h"
-// The no-media version PeerConnectionFactory doesn't depend on these files, but the gn check tool
-// is not smart enough to take the #ifdef into account.
-#include "webrtc/api/audio_codecs/builtin_audio_decoder_factory.h"  // nogncheck
-#include "webrtc/api/audio_codecs/builtin_audio_encoder_factory.h"  // nogncheck
-#endif
-
-#include "Video/objcvideotracksource.h"
-#include "webrtc/api/videosourceproxy.h"
-// Adding the nogncheck to disable the including header check.
-// The no-media version PeerConnectionFactory doesn't depend on media related
-// C++ target.
-// TODO(zhihuang): Remove nogncheck once MediaEngineInterface is moved to C++
-// API layer.
-#include "webrtc/media/engine/webrtcmediaengine.h"  // nogncheck
-
-@implementation RTCPeerConnectionFactory {
-  std::unique_ptr<rtc::Thread> _networkThread;
-  std::unique_ptr<rtc::Thread> _workerThread;
-  std::unique_ptr<rtc::Thread> _signalingThread;
-  BOOL _hasStartedAecDump;
-}
-
-@synthesize nativeFactory = _nativeFactory;
-
-- (instancetype)init {
-#ifdef HAVE_NO_MEDIA
-  return [self initWithNativeAudioEncoderFactory:nil
-                       nativeAudioDecoderFactory:nil
-                       nativeVideoEncoderFactory:nil
-                       nativeVideoDecoderFactory:nil];
-#else
-  return [self initWithNativeAudioEncoderFactory:webrtc::CreateBuiltinAudioEncoderFactory()
-                       nativeAudioDecoderFactory:webrtc::CreateBuiltinAudioDecoderFactory()
-                       nativeVideoEncoderFactory:new webrtc::ObjCVideoEncoderFactory(
-                                                     [[RTCVideoEncoderFactoryH264 alloc] init])
-                       nativeVideoDecoderFactory:new webrtc::ObjCVideoDecoderFactory(
-                                                     [[RTCVideoDecoderFactoryH264 alloc] init])];
-#endif
-}
-
-- (instancetype)initWithEncoderFactory:(nullable id<RTCVideoEncoderFactory>)encoderFactory
-                        decoderFactory:(nullable id<RTCVideoDecoderFactory>)decoderFactory {
-#ifdef HAVE_NO_MEDIA
-  return [self initWithNativeAudioEncoderFactory:nil
-                       nativeAudioDecoderFactory:nil
-                       nativeVideoEncoderFactory:nil
-                       nativeVideoDecoderFactory:nil];
-#else
-  cricket::WebRtcVideoEncoderFactory *native_encoder_factory =
-      encoderFactory ? new webrtc::ObjCVideoEncoderFactory(encoderFactory) : nullptr;
-  cricket::WebRtcVideoDecoderFactory *native_decoder_factory =
-      decoderFactory ? new webrtc::ObjCVideoDecoderFactory(decoderFactory) : nullptr;
-  return [self initWithNativeAudioEncoderFactory:webrtc::CreateBuiltinAudioEncoderFactory()
-                       nativeAudioDecoderFactory:webrtc::CreateBuiltinAudioDecoderFactory()
-                       nativeVideoEncoderFactory:native_encoder_factory
-                       nativeVideoDecoderFactory:native_decoder_factory];
-#endif
-}
-
-- (instancetype)initWithNativeAudioEncoderFactory:
-                    (rtc::scoped_refptr<webrtc::AudioEncoderFactory>)audioEncoderFactory
-                        nativeAudioDecoderFactory:
-                            (rtc::scoped_refptr<webrtc::AudioDecoderFactory>)audioDecoderFactory
-                        nativeVideoEncoderFactory:
-                            (nullable cricket::WebRtcVideoEncoderFactory *)videoEncoderFactory
-                        nativeVideoDecoderFactory:
-                            (nullable cricket::WebRtcVideoDecoderFactory *)videoDecoderFactory {
-  if (self = [super init]) {
-    _networkThread = rtc::Thread::CreateWithSocketServer();
-    BOOL result = _networkThread->Start();
-    NSAssert(result, @"Failed to start network thread.");
-
-    _workerThread = rtc::Thread::Create();
-    result = _workerThread->Start();
-    NSAssert(result, @"Failed to start worker thread.");
-
-    _signalingThread = rtc::Thread::Create();
-    result = _signalingThread->Start();
-    NSAssert(result, @"Failed to start signaling thread.");
-#ifdef HAVE_NO_MEDIA
-    _nativeFactory = webrtc::CreateModularPeerConnectionFactory(
-        _networkThread.get(),
-        _workerThread.get(),
-        _signalingThread.get(),
-        nullptr,  // default_adm
-        nullptr,  // audio_encoder_factory
-        nullptr,  // audio_decoder_factory
-        nullptr,  // video_encoder_factory
-        nullptr,  // video_decoder_factory
-        nullptr,  // audio_mixer
-        std::unique_ptr<cricket::MediaEngineInterface>(),
-        std::unique_ptr<webrtc::CallFactoryInterface>(),
-        std::unique_ptr<webrtc::RtcEventLogFactoryInterface>());
-#else
-    // Ownership of encoder/decoder factories is passed on to the
-    // peerconnectionfactory, that handles deleting them.
-    _nativeFactory = webrtc::CreatePeerConnectionFactory(_networkThread.get(),
-                                                         _workerThread.get(),
-                                                         _signalingThread.get(),
-                                                         nullptr,  // audio device module
-                                                         audioEncoderFactory,
-                                                         audioDecoderFactory,
-                                                         videoEncoderFactory,
-                                                         videoDecoderFactory);
-#endif
-    NSAssert(_nativeFactory, @"Failed to initialize PeerConnectionFactory!");
-  }
-  return self;
-}
-
-- (RTCAudioSource *)audioSourceWithConstraints:(nullable RTCMediaConstraints *)constraints {
-  std::unique_ptr<webrtc::MediaConstraints> nativeConstraints;
-  if (constraints) {
-    nativeConstraints = constraints.nativeConstraints;
-  }
-  rtc::scoped_refptr<webrtc::AudioSourceInterface> source =
-      _nativeFactory->CreateAudioSource(nativeConstraints.get());
-  return [[RTCAudioSource alloc] initWithNativeAudioSource:source];
-}
-
-- (RTCAudioTrack *)audioTrackWithTrackId:(NSString *)trackId {
-  RTCAudioSource *audioSource = [self audioSourceWithConstraints:nil];
-  return [self audioTrackWithSource:audioSource trackId:trackId];
-}
-
-- (RTCAudioTrack *)audioTrackWithSource:(RTCAudioSource *)source
-                                trackId:(NSString *)trackId {
-  return [[RTCAudioTrack alloc] initWithFactory:self
-                                         source:source
-                                        trackId:trackId];
-}
-
-- (RTCAVFoundationVideoSource *)avFoundationVideoSourceWithConstraints:
-    (nullable RTCMediaConstraints *)constraints {
-#ifdef HAVE_NO_MEDIA
-  return nil;
-#else
-  return [[RTCAVFoundationVideoSource alloc] initWithFactory:self constraints:constraints];
-#endif
-}
-
-- (RTCVideoSource *)videoSource {
-  rtc::scoped_refptr<webrtc::ObjcVideoTrackSource> objcVideoTrackSource(
-      new rtc::RefCountedObject<webrtc::ObjcVideoTrackSource>());
-  return [[RTCVideoSource alloc]
-      initWithNativeVideoSource:webrtc::VideoTrackSourceProxy::Create(_signalingThread.get(),
-                                                                      _workerThread.get(),
-                                                                      objcVideoTrackSource)];
-}
-
-- (RTCVideoTrack *)videoTrackWithSource:(RTCVideoSource *)source
-                                trackId:(NSString *)trackId {
-  return [[RTCVideoTrack alloc] initWithFactory:self
-                                         source:source
-                                        trackId:trackId];
-}
-
-- (RTCMediaStream *)mediaStreamWithStreamId:(NSString *)streamId {
-  return [[RTCMediaStream alloc] initWithFactory:self
-                                        streamId:streamId];
-}
-
-- (RTCPeerConnection *)peerConnectionWithConfiguration:
-    (RTCConfiguration *)configuration
-                                           constraints:
-    (RTCMediaConstraints *)constraints
-                                              delegate:
-    (nullable id<RTCPeerConnectionDelegate>)delegate {
-  return [[RTCPeerConnection alloc] initWithFactory:self
-                                      configuration:configuration
-                                        constraints:constraints
-                                           delegate:delegate];
-}
-
-- (BOOL)startAecDumpWithFilePath:(NSString *)filePath
-                  maxSizeInBytes:(int64_t)maxSizeInBytes {
-  RTC_DCHECK(filePath.length);
-  RTC_DCHECK_GT(maxSizeInBytes, 0);
-
-  if (_hasStartedAecDump) {
-    RTCLogError(@"Aec dump already started.");
-    return NO;
-  }
-  int fd = open(filePath.UTF8String, O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR);
-  if (fd < 0) {
-    RTCLogError(@"Error opening file: %@. Error: %d", filePath, errno);
-    return NO;
-  }
-  _hasStartedAecDump = _nativeFactory->StartAecDump(fd, maxSizeInBytes);
-  return _hasStartedAecDump;
-}
-
-- (void)stopAecDump {
-  _nativeFactory->StopAecDump();
-  _hasStartedAecDump = NO;
-}
-
-@end
diff --git a/sdk/objc/Framework/Classes/PeerConnection/RTCRtpCodecParameters+Private.h b/sdk/objc/Framework/Classes/PeerConnection/RTCRtpCodecParameters+Private.h
deleted file mode 100644
index fe33e9e..0000000
--- a/sdk/objc/Framework/Classes/PeerConnection/RTCRtpCodecParameters+Private.h
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- *  Copyright 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.
- */
-
-#import "WebRTC/RTCRtpCodecParameters.h"
-
-#include "webrtc/api/rtpparameters.h"
-
-NS_ASSUME_NONNULL_BEGIN
-
-@interface RTCRtpCodecParameters ()
-
-/** Returns the equivalent native RtpCodecParameters structure. */
-@property(nonatomic, readonly) webrtc::RtpCodecParameters nativeParameters;
-
-/** Initialize the object with a native RtpCodecParameters structure. */
-- (instancetype)initWithNativeParameters:
-    (const webrtc::RtpCodecParameters &)nativeParameters;
-
-@end
-
-NS_ASSUME_NONNULL_END
diff --git a/sdk/objc/Framework/Classes/PeerConnection/RTCRtpCodecParameters.mm b/sdk/objc/Framework/Classes/PeerConnection/RTCRtpCodecParameters.mm
deleted file mode 100644
index 3e137b8..0000000
--- a/sdk/objc/Framework/Classes/PeerConnection/RTCRtpCodecParameters.mm
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- *  Copyright 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.
- */
-
-#import "RTCRtpCodecParameters+Private.h"
-
-#import "NSString+StdString.h"
-#import "WebRTC/RTCMediaStreamTrack.h"  // For "kind" strings.
-
-#include "webrtc/media/base/mediaconstants.h"
-#include "webrtc/rtc_base/checks.h"
-
-const NSString * const kRTCRtxCodecName = @(cricket::kRtxCodecName);
-const NSString * const kRTCRedCodecName = @(cricket::kRedCodecName);
-const NSString * const kRTCUlpfecCodecName = @(cricket::kUlpfecCodecName);
-const NSString * const kRTCFlexfecCodecName = @(cricket::kFlexfecCodecName);
-const NSString * const kRTCOpusCodecName = @(cricket::kOpusCodecName);
-const NSString * const kRTCIsacCodecName = @(cricket::kIsacCodecName);
-const NSString * const kRTCL16CodecName  = @(cricket::kL16CodecName);
-const NSString * const kRTCG722CodecName = @(cricket::kG722CodecName);
-const NSString * const kRTCIlbcCodecName = @(cricket::kIlbcCodecName);
-const NSString * const kRTCPcmuCodecName = @(cricket::kPcmuCodecName);
-const NSString * const kRTCPcmaCodecName = @(cricket::kPcmaCodecName);
-const NSString * const kRTCDtmfCodecName = @(cricket::kDtmfCodecName);
-const NSString * const kRTCComfortNoiseCodecName =
-    @(cricket::kComfortNoiseCodecName);
-const NSString * const kRTCVp8CodecName = @(cricket::kVp8CodecName);
-const NSString * const kRTCVp9CodecName = @(cricket::kVp9CodecName);
-const NSString * const kRTCH264CodecName = @(cricket::kH264CodecName);
-
-@implementation RTCRtpCodecParameters
-
-@synthesize payloadType = _payloadType;
-@synthesize name = _name;
-@synthesize kind = _kind;
-@synthesize clockRate = _clockRate;
-@synthesize numChannels = _numChannels;
-
-- (instancetype)init {
-  return [super init];
-}
-
-- (instancetype)initWithNativeParameters:
-    (const webrtc::RtpCodecParameters &)nativeParameters {
-  if (self = [self init]) {
-    _payloadType = nativeParameters.payload_type;
-    _name = [NSString stringForStdString:nativeParameters.name];
-    switch (nativeParameters.kind) {
-      case cricket::MEDIA_TYPE_AUDIO:
-        _kind = kRTCMediaStreamTrackKindAudio;
-        break;
-      case cricket::MEDIA_TYPE_VIDEO:
-        _kind = kRTCMediaStreamTrackKindVideo;
-        break;
-      case cricket::MEDIA_TYPE_DATA:
-        RTC_NOTREACHED();
-        break;
-    }
-    if (nativeParameters.clock_rate) {
-      _clockRate = [NSNumber numberWithInt:*nativeParameters.clock_rate];
-    }
-    if (nativeParameters.num_channels) {
-      _numChannels = [NSNumber numberWithInt:*nativeParameters.num_channels];
-    }
-  }
-  return self;
-}
-
-- (webrtc::RtpCodecParameters)nativeParameters {
-  webrtc::RtpCodecParameters parameters;
-  parameters.payload_type = _payloadType;
-  parameters.name = [NSString stdStringForString:_name];
-  // NSString pointer comparison is safe here since "kind" is readonly and only
-  // populated above.
-  if (_kind == kRTCMediaStreamTrackKindAudio) {
-    parameters.kind = cricket::MEDIA_TYPE_AUDIO;
-  } else if (_kind == kRTCMediaStreamTrackKindVideo) {
-    parameters.kind = cricket::MEDIA_TYPE_VIDEO;
-  } else {
-    RTC_NOTREACHED();
-  }
-  if (_clockRate != nil) {
-    parameters.clock_rate = rtc::Optional<int>(_clockRate.intValue);
-  }
-  if (_numChannels != nil) {
-    parameters.num_channels = rtc::Optional<int>(_numChannels.intValue);
-  }
-  return parameters;
-}
-
-@end
diff --git a/sdk/objc/Framework/Classes/PeerConnection/RTCRtpEncodingParameters+Private.h b/sdk/objc/Framework/Classes/PeerConnection/RTCRtpEncodingParameters+Private.h
deleted file mode 100644
index 1d75268..0000000
--- a/sdk/objc/Framework/Classes/PeerConnection/RTCRtpEncodingParameters+Private.h
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- *  Copyright 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.
- */
-
-#import "WebRTC/RTCRtpEncodingParameters.h"
-
-#include "webrtc/api/rtpparameters.h"
-
-NS_ASSUME_NONNULL_BEGIN
-
-@interface RTCRtpEncodingParameters ()
-
-/** Returns the equivalent native RtpEncodingParameters structure. */
-@property(nonatomic, readonly) webrtc::RtpEncodingParameters nativeParameters;
-
-/** Initialize the object with a native RtpEncodingParameters structure. */
-- (instancetype)initWithNativeParameters:
-    (const webrtc::RtpEncodingParameters &)nativeParameters;
-
-@end
-
-NS_ASSUME_NONNULL_END
diff --git a/sdk/objc/Framework/Classes/PeerConnection/RTCRtpEncodingParameters.mm b/sdk/objc/Framework/Classes/PeerConnection/RTCRtpEncodingParameters.mm
deleted file mode 100644
index 8e72d18..0000000
--- a/sdk/objc/Framework/Classes/PeerConnection/RTCRtpEncodingParameters.mm
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- *  Copyright 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.
- */
-
-#import "RTCRtpEncodingParameters+Private.h"
-
-@implementation RTCRtpEncodingParameters
-
-@synthesize isActive = _isActive;
-@synthesize maxBitrateBps = _maxBitrateBps;
-@synthesize ssrc = _ssrc;
-
-- (instancetype)init {
-  return [super init];
-}
-
-- (instancetype)initWithNativeParameters:
-    (const webrtc::RtpEncodingParameters &)nativeParameters {
-  if (self = [self init]) {
-    _isActive = nativeParameters.active;
-    if (nativeParameters.max_bitrate_bps) {
-      _maxBitrateBps =
-          [NSNumber numberWithInt:*nativeParameters.max_bitrate_bps];
-    }
-    if (nativeParameters.ssrc) {
-      _ssrc = [NSNumber numberWithUnsignedLong:*nativeParameters.ssrc];
-    }
-  }
-  return self;
-}
-
-- (webrtc::RtpEncodingParameters)nativeParameters {
-  webrtc::RtpEncodingParameters parameters;
-  parameters.active = _isActive;
-  if (_maxBitrateBps != nil) {
-    parameters.max_bitrate_bps = rtc::Optional<int>(_maxBitrateBps.intValue);
-  }
-  if (_ssrc != nil) {
-    parameters.ssrc = rtc::Optional<uint32_t>(_ssrc.unsignedLongValue);
-  }
-  return parameters;
-}
-
-@end
diff --git a/sdk/objc/Framework/Classes/PeerConnection/RTCRtpFragmentationHeader.mm b/sdk/objc/Framework/Classes/PeerConnection/RTCRtpFragmentationHeader.mm
deleted file mode 100644
index 541fd45..0000000
--- a/sdk/objc/Framework/Classes/PeerConnection/RTCRtpFragmentationHeader.mm
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- *  Copyright 2017 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.
- */
-
-#import "WebRTC/RTCVideoCodec.h"
-
-#include "webrtc/modules/include/module_common_types.h"
-
-@implementation RTCRtpFragmentationHeader
-
-@synthesize fragmentationOffset = _fragmentationOffset;
-@synthesize fragmentationLength = _fragmentationLength;
-@synthesize fragmentationTimeDiff = _fragmentationTimeDiff;
-@synthesize fragmentationPlType = _fragmentationPlType;
-
-- (instancetype)initWithNativeFragmentationHeader:
-        (const webrtc::RTPFragmentationHeader *)fragmentationHeader {
-  if (self = [super init]) {
-    if (fragmentationHeader) {
-      int count = fragmentationHeader->fragmentationVectorSize;
-      NSMutableArray *offsets = [NSMutableArray array];
-      NSMutableArray *lengths = [NSMutableArray array];
-      NSMutableArray *timeDiffs = [NSMutableArray array];
-      NSMutableArray *plTypes = [NSMutableArray array];
-      for (int i = 0; i < count; ++i) {
-        [offsets addObject:@(fragmentationHeader->fragmentationOffset[i])];
-        [lengths addObject:@(fragmentationHeader->fragmentationLength[i])];
-        [timeDiffs addObject:@(fragmentationHeader->fragmentationTimeDiff[i])];
-        [plTypes addObject:@(fragmentationHeader->fragmentationPlType[i])];
-      }
-      _fragmentationOffset = [offsets copy];
-      _fragmentationLength = [lengths copy];
-      _fragmentationTimeDiff = [timeDiffs copy];
-      _fragmentationPlType = [plTypes copy];
-    }
-  }
-
-  return self;
-}
-
-- (std::unique_ptr<webrtc::RTPFragmentationHeader>)createNativeFragmentationHeader {
-  auto fragmentationHeader =
-      std::unique_ptr<webrtc::RTPFragmentationHeader>(new webrtc::RTPFragmentationHeader);
-  fragmentationHeader->VerifyAndAllocateFragmentationHeader(_fragmentationOffset.count);
-  for (NSUInteger i = 0; i < _fragmentationOffset.count; ++i) {
-    fragmentationHeader->fragmentationOffset[i] = (size_t)_fragmentationOffset[i].unsignedIntValue;
-    fragmentationHeader->fragmentationLength[i] = (size_t)_fragmentationLength[i].unsignedIntValue;
-    fragmentationHeader->fragmentationTimeDiff[i] =
-        (uint16_t)_fragmentationOffset[i].unsignedIntValue;
-    fragmentationHeader->fragmentationPlType[i] = (uint8_t)_fragmentationOffset[i].unsignedIntValue;
-  }
-
-  return fragmentationHeader;
-}
-
-@end
diff --git a/sdk/objc/Framework/Classes/PeerConnection/RTCRtpParameters+Private.h b/sdk/objc/Framework/Classes/PeerConnection/RTCRtpParameters+Private.h
deleted file mode 100644
index 0cb1ffe..0000000
--- a/sdk/objc/Framework/Classes/PeerConnection/RTCRtpParameters+Private.h
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- *  Copyright 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.
- */
-
-#import "WebRTC/RTCRtpParameters.h"
-
-#include "webrtc/api/rtpparameters.h"
-
-NS_ASSUME_NONNULL_BEGIN
-
-@interface RTCRtpParameters ()
-
-/** Returns the equivalent native RtpParameters structure. */
-@property(nonatomic, readonly) webrtc::RtpParameters nativeParameters;
-
-/** Initialize the object with a native RtpParameters structure. */
-- (instancetype)initWithNativeParameters:
-    (const webrtc::RtpParameters &)nativeParameters;
-
-@end
-
-NS_ASSUME_NONNULL_END
diff --git a/sdk/objc/Framework/Classes/PeerConnection/RTCRtpParameters.mm b/sdk/objc/Framework/Classes/PeerConnection/RTCRtpParameters.mm
deleted file mode 100644
index 5e79106..0000000
--- a/sdk/objc/Framework/Classes/PeerConnection/RTCRtpParameters.mm
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- *  Copyright 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.
- */
-
-#import "RTCRtpParameters+Private.h"
-
-#import "RTCRtpCodecParameters+Private.h"
-#import "RTCRtpEncodingParameters+Private.h"
-
-@implementation RTCRtpParameters
-
-@synthesize encodings = _encodings;
-@synthesize codecs = _codecs;
-
-- (instancetype)init {
-  return [super init];
-}
-
-- (instancetype)initWithNativeParameters:
-    (const webrtc::RtpParameters &)nativeParameters {
-  if (self = [self init]) {
-    NSMutableArray *encodings = [[NSMutableArray alloc] init];
-    for (const auto &encoding : nativeParameters.encodings) {
-      [encodings addObject:[[RTCRtpEncodingParameters alloc]
-                               initWithNativeParameters:encoding]];
-    }
-    _encodings = encodings;
-
-    NSMutableArray *codecs = [[NSMutableArray alloc] init];
-    for (const auto &codec : nativeParameters.codecs) {
-      [codecs addObject:[[RTCRtpCodecParameters alloc]
-                            initWithNativeParameters:codec]];
-    }
-    _codecs = codecs;
-  }
-  return self;
-}
-
-- (webrtc::RtpParameters)nativeParameters {
-    webrtc::RtpParameters parameters;
-  for (RTCRtpEncodingParameters *encoding in _encodings) {
-    parameters.encodings.push_back(encoding.nativeParameters);
-  }
-  for (RTCRtpCodecParameters *codec in _codecs) {
-    parameters.codecs.push_back(codec.nativeParameters);
-  }
-  return parameters;
-}
-
-@end
diff --git a/sdk/objc/Framework/Classes/PeerConnection/RTCRtpReceiver+Private.h b/sdk/objc/Framework/Classes/PeerConnection/RTCRtpReceiver+Private.h
deleted file mode 100644
index 3dc0285..0000000
--- a/sdk/objc/Framework/Classes/PeerConnection/RTCRtpReceiver+Private.h
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- *  Copyright 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.
- */
-
-#import "WebRTC/RTCRtpReceiver.h"
-
-#include "webrtc/api/rtpreceiverinterface.h"
-
-NS_ASSUME_NONNULL_BEGIN
-
-namespace webrtc {
-
-class RtpReceiverDelegateAdapter : public RtpReceiverObserverInterface {
- public:
-  RtpReceiverDelegateAdapter(RTCRtpReceiver* receiver);
-
-  void OnFirstPacketReceived(cricket::MediaType media_type) override;
-
- private:
-  __weak RTCRtpReceiver* receiver_;
-};
-
-}  // namespace webrtc
-
-@interface RTCRtpReceiver ()
-
-@property(nonatomic, readonly)
-    rtc::scoped_refptr<webrtc::RtpReceiverInterface> nativeRtpReceiver;
-
-/** Initialize an RTCRtpReceiver with a native RtpReceiverInterface. */
-- (instancetype)initWithNativeRtpReceiver:
-    (rtc::scoped_refptr<webrtc::RtpReceiverInterface>)nativeRtpReceiver
-    NS_DESIGNATED_INITIALIZER;
-
-+ (RTCRtpMediaType)mediaTypeForNativeMediaType:(cricket::MediaType)nativeMediaType;
-
-@end
-
-NS_ASSUME_NONNULL_END
diff --git a/sdk/objc/Framework/Classes/PeerConnection/RTCRtpReceiver.mm b/sdk/objc/Framework/Classes/PeerConnection/RTCRtpReceiver.mm
deleted file mode 100644
index ee10005..0000000
--- a/sdk/objc/Framework/Classes/PeerConnection/RTCRtpReceiver.mm
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- *  Copyright 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.
- */
-
-#import "RTCRtpReceiver+Private.h"
-
-#import "NSString+StdString.h"
-#import "RTCMediaStreamTrack+Private.h"
-#import "RTCRtpParameters+Private.h"
-#import "WebRTC/RTCLogging.h"
-
-#include "webrtc/api/mediastreaminterface.h"
-
-namespace webrtc {
-
-RtpReceiverDelegateAdapter::RtpReceiverDelegateAdapter(
-    RTCRtpReceiver *receiver) {
-  RTC_CHECK(receiver);
-  receiver_ = receiver;
-}
-
-void RtpReceiverDelegateAdapter::OnFirstPacketReceived(
-    cricket::MediaType media_type) {
-  RTCRtpMediaType packet_media_type =
-      [RTCRtpReceiver mediaTypeForNativeMediaType:media_type];
-  RTCRtpReceiver *receiver = receiver_;
-  [receiver.delegate rtpReceiver:receiver didReceiveFirstPacketForMediaType:packet_media_type];
-}
-
-}  // namespace webrtc
-
-@implementation RTCRtpReceiver {
-  rtc::scoped_refptr<webrtc::RtpReceiverInterface> _nativeRtpReceiver;
-  std::unique_ptr<webrtc::RtpReceiverDelegateAdapter> _observer;
-}
-
-@synthesize delegate = _delegate;
-
-- (NSString *)receiverId {
-  return [NSString stringForStdString:_nativeRtpReceiver->id()];
-}
-
-- (RTCRtpParameters *)parameters {
-  return [[RTCRtpParameters alloc]
-      initWithNativeParameters:_nativeRtpReceiver->GetParameters()];
-}
-
-- (void)setParameters:(RTCRtpParameters *)parameters {
-  if (!_nativeRtpReceiver->SetParameters(parameters.nativeParameters)) {
-    RTCLogError(@"RTCRtpReceiver(%p): Failed to set parameters: %@", self,
-        parameters);
-  }
-}
-
-- (RTCMediaStreamTrack *)track {
-  rtc::scoped_refptr<webrtc::MediaStreamTrackInterface> nativeTrack(
-    _nativeRtpReceiver->track());
-  if (nativeTrack) {
-    return [[RTCMediaStreamTrack alloc] initWithNativeTrack:nativeTrack];
-  }
-  return nil;
-}
-
-- (NSString *)description {
-  return [NSString stringWithFormat:@"RTCRtpReceiver {\n  receiverId: %@\n}",
-      self.receiverId];
-}
-
-- (BOOL)isEqual:(id)object {
-  if (self == object) {
-    return YES;
-  }
-  if (object == nil) {
-    return NO;
-  }
-  if (![object isMemberOfClass:[self class]]) {
-    return NO;
-  }
-  RTCRtpReceiver *receiver = (RTCRtpReceiver *)object;
-  return _nativeRtpReceiver == receiver.nativeRtpReceiver;
-}
-
-- (NSUInteger)hash {
-  return (NSUInteger)_nativeRtpReceiver.get();
-}
-
-#pragma mark - Private
-
-- (rtc::scoped_refptr<webrtc::RtpReceiverInterface>)nativeRtpReceiver {
-  return _nativeRtpReceiver;
-}
-
-- (instancetype)initWithNativeRtpReceiver:
-    (rtc::scoped_refptr<webrtc::RtpReceiverInterface>)nativeRtpReceiver {
-  if (self = [super init]) {
-    _nativeRtpReceiver = nativeRtpReceiver;
-    RTCLogInfo(
-        @"RTCRtpReceiver(%p): created receiver: %@", self, self.description);
-    _observer.reset(new webrtc::RtpReceiverDelegateAdapter(self));
-    _nativeRtpReceiver->SetObserver(_observer.get());
-  }
-  return self;
-}
-
-+ (RTCRtpMediaType)mediaTypeForNativeMediaType:
-    (cricket::MediaType)nativeMediaType {
-  switch (nativeMediaType) {
-    case cricket::MEDIA_TYPE_AUDIO:
-      return RTCRtpMediaTypeAudio;
-    case cricket::MEDIA_TYPE_VIDEO:
-      return RTCRtpMediaTypeVideo;
-    case cricket::MEDIA_TYPE_DATA:
-      return RTCRtpMediaTypeData;
-  }
-}
-
-@end
diff --git a/sdk/objc/Framework/Classes/PeerConnection/RTCRtpSender+Private.h b/sdk/objc/Framework/Classes/PeerConnection/RTCRtpSender+Private.h
deleted file mode 100644
index e372c52..0000000
--- a/sdk/objc/Framework/Classes/PeerConnection/RTCRtpSender+Private.h
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- *  Copyright 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.
- */
-
-#import "WebRTC/RTCRtpSender.h"
-
-#include "webrtc/api/rtpsenderinterface.h"
-
-NS_ASSUME_NONNULL_BEGIN
-
-@interface RTCRtpSender ()
-
-@property(nonatomic, readonly)
-    rtc::scoped_refptr<webrtc::RtpSenderInterface> nativeRtpSender;
-
-/** Initialize an RTCRtpSender with a native RtpSenderInterface. */
-- (instancetype)initWithNativeRtpSender:
-    (rtc::scoped_refptr<webrtc::RtpSenderInterface>)nativeRtpSender
-    NS_DESIGNATED_INITIALIZER;
-
-@end
-
-NS_ASSUME_NONNULL_END
diff --git a/sdk/objc/Framework/Classes/PeerConnection/RTCRtpSender.mm b/sdk/objc/Framework/Classes/PeerConnection/RTCRtpSender.mm
deleted file mode 100644
index 9ecf0ae..0000000
--- a/sdk/objc/Framework/Classes/PeerConnection/RTCRtpSender.mm
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- *  Copyright 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.
- */
-
-#import "RTCRtpSender+Private.h"
-
-#import "NSString+StdString.h"
-#import "RTCMediaStreamTrack+Private.h"
-#import "RTCRtpParameters+Private.h"
-#import "WebRTC/RTCLogging.h"
-
-#include "webrtc/api/mediastreaminterface.h"
-
-@implementation RTCRtpSender {
-  rtc::scoped_refptr<webrtc::RtpSenderInterface> _nativeRtpSender;
-}
-
-- (NSString *)senderId {
-  return [NSString stringForStdString:_nativeRtpSender->id()];
-}
-
-- (RTCRtpParameters *)parameters {
-  return [[RTCRtpParameters alloc]
-      initWithNativeParameters:_nativeRtpSender->GetParameters()];
-}
-
-- (void)setParameters:(RTCRtpParameters *)parameters {
-  if (!_nativeRtpSender->SetParameters(parameters.nativeParameters)) {
-    RTCLogError(@"RTCRtpSender(%p): Failed to set parameters: %@", self,
-        parameters);
-  }
-}
-
-- (RTCMediaStreamTrack *)track {
-  rtc::scoped_refptr<webrtc::MediaStreamTrackInterface> nativeTrack(
-    _nativeRtpSender->track());
-  if (nativeTrack) {
-    return [[RTCMediaStreamTrack alloc] initWithNativeTrack:nativeTrack];
-  }
-  return nil;
-}
-
-- (void)setTrack:(RTCMediaStreamTrack *)track {
-  if (!_nativeRtpSender->SetTrack(track.nativeTrack)) {
-    RTCLogError(@"RTCRtpSender(%p): Failed to set track %@", self, track);
-  }
-}
-
-- (NSString *)description {
-  return [NSString stringWithFormat:@"RTCRtpSender {\n  senderId: %@\n}",
-      self.senderId];
-}
-
-- (BOOL)isEqual:(id)object {
-  if (self == object) {
-    return YES;
-  }
-  if (object == nil) {
-    return NO;
-  }
-  if (![object isMemberOfClass:[self class]]) {
-    return NO;
-  }
-  RTCRtpSender *sender = (RTCRtpSender *)object;
-  return _nativeRtpSender == sender.nativeRtpSender;
-}
-
-- (NSUInteger)hash {
-  return (NSUInteger)_nativeRtpSender.get();
-}
-
-#pragma mark - Private
-
-- (rtc::scoped_refptr<webrtc::RtpSenderInterface>)nativeRtpSender {
-  return _nativeRtpSender;
-}
-
-- (instancetype)initWithNativeRtpSender:
-    (rtc::scoped_refptr<webrtc::RtpSenderInterface>)nativeRtpSender {
-  NSParameterAssert(nativeRtpSender);
-  if (self = [super init]) {
-    _nativeRtpSender = nativeRtpSender;
-    RTCLogInfo(@"RTCRtpSender(%p): created sender: %@", self, self.description);
-  }
-  return self;
-}
-
-@end
diff --git a/sdk/objc/Framework/Classes/PeerConnection/RTCSSLAdapter.mm b/sdk/objc/Framework/Classes/PeerConnection/RTCSSLAdapter.mm
deleted file mode 100644
index 4a14670..0000000
--- a/sdk/objc/Framework/Classes/PeerConnection/RTCSSLAdapter.mm
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- *  Copyright 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.
- */
-
-#import "WebRTC/RTCSSLAdapter.h"
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/ssladapter.h"
-
-BOOL RTCInitializeSSL() {
-  BOOL initialized = rtc::InitializeSSL();
-  RTC_DCHECK(initialized);
-  return initialized;
-}
-
-BOOL RTCCleanupSSL() {
-  BOOL cleanedUp = rtc::CleanupSSL();
-  RTC_DCHECK(cleanedUp);
-  return cleanedUp;
-}
diff --git a/sdk/objc/Framework/Classes/PeerConnection/RTCSessionDescription+Private.h b/sdk/objc/Framework/Classes/PeerConnection/RTCSessionDescription+Private.h
deleted file mode 100644
index 04b6fbe..0000000
--- a/sdk/objc/Framework/Classes/PeerConnection/RTCSessionDescription+Private.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-#import "WebRTC/RTCSessionDescription.h"
-
-#include "webrtc/api/jsep.h"
-
-NS_ASSUME_NONNULL_BEGIN
-
-@interface RTCSessionDescription ()
-
-/**
- * The native SessionDescriptionInterface representation of this
- * RTCSessionDescription object. This is needed to pass to the underlying C++
- * APIs.
- */
-@property(nonatomic, readonly)
-    webrtc::SessionDescriptionInterface *nativeDescription;
-
-/**
- * Initialize an RTCSessionDescription from a native
- * SessionDescriptionInterface. No ownership is taken of the native session
- * description.
- */
-- (instancetype)initWithNativeDescription:
-    (const webrtc::SessionDescriptionInterface *)nativeDescription;
-
-+ (std::string)stdStringForType:(RTCSdpType)type;
-
-+ (RTCSdpType)typeForStdString:(const std::string &)string;
-
-@end
-
-NS_ASSUME_NONNULL_END
diff --git a/sdk/objc/Framework/Classes/PeerConnection/RTCSessionDescription.mm b/sdk/objc/Framework/Classes/PeerConnection/RTCSessionDescription.mm
deleted file mode 100644
index 66a1186..0000000
--- a/sdk/objc/Framework/Classes/PeerConnection/RTCSessionDescription.mm
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-#import "RTCSessionDescription+Private.h"
-
-#import "NSString+StdString.h"
-#import "WebRTC/RTCLogging.h"
-
-#include "webrtc/rtc_base/checks.h"
-
-@implementation RTCSessionDescription
-
-@synthesize type = _type;
-@synthesize sdp = _sdp;
-
-+ (NSString *)stringForType:(RTCSdpType)type {
-  std::string string = [[self class] stdStringForType:type];
-  return [NSString stringForStdString:string];
-}
-
-+ (RTCSdpType)typeForString:(NSString *)string {
-  std::string typeString = string.stdString;
-  return [[self class] typeForStdString:typeString];
-}
-
-- (instancetype)initWithType:(RTCSdpType)type sdp:(NSString *)sdp {
-  NSParameterAssert(sdp.length);
-  if (self = [super init]) {
-    _type = type;
-    _sdp = [sdp copy];
-  }
-  return self;
-}
-
-- (NSString *)description {
-  return [NSString stringWithFormat:@"RTCSessionDescription:\n%@\n%@",
-                                    [[self class] stringForType:_type],
-                                    _sdp];
-}
-
-#pragma mark - Private
-
-- (webrtc::SessionDescriptionInterface *)nativeDescription {
-  webrtc::SdpParseError error;
-
-  webrtc::SessionDescriptionInterface *description =
-      webrtc::CreateSessionDescription([[self class] stdStringForType:_type],
-                                       _sdp.stdString,
-                                       &error);
-
-  if (!description) {
-    RTCLogError(@"Failed to create session description: %s\nline: %s",
-                error.description.c_str(),
-                error.line.c_str());
-  }
-
-  return description;
-}
-
-- (instancetype)initWithNativeDescription:
-    (const webrtc::SessionDescriptionInterface *)nativeDescription {
-  NSParameterAssert(nativeDescription);
-  std::string sdp;
-  nativeDescription->ToString(&sdp);
-  RTCSdpType type = [[self class] typeForStdString:nativeDescription->type()];
-
-  return [self initWithType:type
-                        sdp:[NSString stringForStdString:sdp]];
-}
-
-+ (std::string)stdStringForType:(RTCSdpType)type {
-  switch (type) {
-    case RTCSdpTypeOffer:
-      return webrtc::SessionDescriptionInterface::kOffer;
-    case RTCSdpTypePrAnswer:
-      return webrtc::SessionDescriptionInterface::kPrAnswer;
-    case RTCSdpTypeAnswer:
-      return webrtc::SessionDescriptionInterface::kAnswer;
-  }
-}
-
-+ (RTCSdpType)typeForStdString:(const std::string &)string {
-  if (string == webrtc::SessionDescriptionInterface::kOffer) {
-    return RTCSdpTypeOffer;
-  } else if (string == webrtc::SessionDescriptionInterface::kPrAnswer) {
-    return RTCSdpTypePrAnswer;
-  } else if (string == webrtc::SessionDescriptionInterface::kAnswer) {
-    return RTCSdpTypeAnswer;
-  } else {
-    RTC_NOTREACHED();
-    return RTCSdpTypeOffer;
-  }
-}
-
-@end
diff --git a/sdk/objc/Framework/Classes/PeerConnection/RTCTracing.mm b/sdk/objc/Framework/Classes/PeerConnection/RTCTracing.mm
deleted file mode 100644
index f742e47..0000000
--- a/sdk/objc/Framework/Classes/PeerConnection/RTCTracing.mm
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- *  Copyright 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.
- */
-
-#import "WebRTC/RTCTracing.h"
-
-#include "webrtc/rtc_base/event_tracer.h"
-
-void RTCSetupInternalTracer() {
-  rtc::tracing::SetupInternalTracer();
-}
-
-BOOL RTCStartInternalCapture(NSString *filePath) {
-  return rtc::tracing::StartInternalCapture(filePath.UTF8String);
-}
-
-void RTCStopInternalCapture() {
-  rtc::tracing::StopInternalCapture();
-}
-
-void RTCShutdownInternalTracer() {
-  rtc::tracing::ShutdownInternalTracer();
-}
diff --git a/sdk/objc/Framework/Classes/PeerConnection/RTCVideoCapturer.m b/sdk/objc/Framework/Classes/PeerConnection/RTCVideoCapturer.m
deleted file mode 100644
index 9d4d99d..0000000
--- a/sdk/objc/Framework/Classes/PeerConnection/RTCVideoCapturer.m
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- *  Copyright 2017 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.
- */
-
-#import "WebRTC/RTCVideoCapturer.h"
-
-@implementation RTCVideoCapturer
-
-@synthesize delegate = _delegate;
-
-- (instancetype)initWithDelegate:(id<RTCVideoCapturerDelegate>)delegate {
-  NSAssert(delegate != nil, @"delegate cannot be nil");
-  if (self = [super init]) {
-    _delegate = delegate;
-  }
-  return self;
-}
-
-@end
diff --git a/sdk/objc/Framework/Classes/PeerConnection/RTCVideoCodec+Private.h b/sdk/objc/Framework/Classes/PeerConnection/RTCVideoCodec+Private.h
deleted file mode 100644
index e783126..0000000
--- a/sdk/objc/Framework/Classes/PeerConnection/RTCVideoCodec+Private.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- *  Copyright 2017 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.
- */
-
-#import "WebRTC/RTCVideoCodec.h"
-
-#import "WebRTC/RTCVideoCodecH264.h"
-
-#include "webrtc/common_video/include/video_frame.h"
-#include "webrtc/media/base/codec.h"
-#include "webrtc/modules/video_coding/include/video_codec_interface.h"
-
-NS_ASSUME_NONNULL_BEGIN
-
-/* Interfaces for converting to/from internal C++ formats. */
-@interface RTCEncodedImage ()
-
-- (instancetype)initWithNativeEncodedImage:(webrtc::EncodedImage)encodedImage;
-- (webrtc::EncodedImage)nativeEncodedImage;
-
-@end
-
-@interface RTCVideoEncoderSettings ()
-
-- (instancetype)initWithNativeVideoCodec:(const webrtc::VideoCodec *__nullable)videoCodec;
-
-@end
-
-@interface RTCCodecSpecificInfoH264 ()
-
-- (webrtc::CodecSpecificInfo)nativeCodecSpecificInfo;
-
-@end
-
-@interface RTCRtpFragmentationHeader ()
-
-- (instancetype)initWithNativeFragmentationHeader:
-        (const webrtc::RTPFragmentationHeader *__nullable)fragmentationHeader;
-- (std::unique_ptr<webrtc::RTPFragmentationHeader>)createNativeFragmentationHeader;
-
-@end
-
-@interface RTCVideoCodecInfo ()
-
-- (instancetype)initWithNativeVideoCodec:(cricket::VideoCodec)videoCodec;
-- (instancetype)initWithPayload:(NSInteger)payload
-                           name:(NSString *)name
-                     parameters:(NSDictionary<NSString *, NSString *> *)parameters;
-- (cricket::VideoCodec)nativeVideoCodec;
-
-@end
-
-NS_ASSUME_NONNULL_END
diff --git a/sdk/objc/Framework/Classes/PeerConnection/RTCVideoCodec.mm b/sdk/objc/Framework/Classes/PeerConnection/RTCVideoCodec.mm
deleted file mode 100644
index 4936568..0000000
--- a/sdk/objc/Framework/Classes/PeerConnection/RTCVideoCodec.mm
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- *  Copyright 2017 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.
- */
-
-#import "WebRTC/RTCVideoCodec.h"
-
-#import "NSString+StdString.h"
-#import "RTCVideoCodec+Private.h"
-#import "WebRTC/RTCVideoCodecFactory.h"
-
-@implementation RTCVideoCodecInfo
-
-@synthesize payload = _payload;
-@synthesize name = _name;
-@synthesize parameters = _parameters;
-
-- (instancetype)initWithName:(NSString *)name
-                  parameters:(nullable NSDictionary<NSString *, NSString *> *)parameters {
-  if (self = [super init]) {
-    _payload = 0;
-    _name = name;
-    _parameters = (parameters ? parameters : @{});
-  }
-
-  return self;
-}
-
-- (instancetype)initWithNativeVideoCodec:(cricket::VideoCodec)videoCodec {
-  NSMutableDictionary *params = [NSMutableDictionary dictionary];
-  for (auto it = videoCodec.params.begin(); it != videoCodec.params.end(); ++it) {
-    [params setObject:[NSString stringForStdString:it->second]
-               forKey:[NSString stringForStdString:it->first]];
-  }
-  return [self initWithPayload:videoCodec.id
-                          name:[NSString stringForStdString:videoCodec.name]
-                    parameters:params];
-}
-
-- (instancetype)initWithPayload:(NSInteger)payload
-                           name:(NSString *)name
-                     parameters:(NSDictionary<NSString *, NSString *> *)parameters {
-  if (self = [self initWithName:name parameters:parameters]) {
-    _payload = payload;
-  }
-
-  return self;
-}
-
-- (cricket::VideoCodec)nativeVideoCodec {
-  cricket::VideoCodec codec([NSString stdStringForString:_name]);
-  for (NSString *paramKey in _parameters.allKeys) {
-    codec.SetParam([NSString stdStringForString:paramKey],
-                   [NSString stdStringForString:_parameters[paramKey]]);
-  }
-
-  return codec;
-}
-
-@end
-
-@implementation RTCVideoEncoderQpThresholds
-
-@synthesize low = _low;
-@synthesize high = _high;
-
-- (instancetype)initWithThresholdsLow:(NSInteger)low high:(NSInteger)high {
-  if (self = [super init]) {
-    _low = low;
-    _high = high;
-  }
-  return self;
-}
-
-@end
diff --git a/sdk/objc/Framework/Classes/PeerConnection/RTCVideoCodecH264.mm b/sdk/objc/Framework/Classes/PeerConnection/RTCVideoCodecH264.mm
deleted file mode 100644
index 341363e..0000000
--- a/sdk/objc/Framework/Classes/PeerConnection/RTCVideoCodecH264.mm
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- *  Copyright 2017 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.
- */
-
-#import "WebRTC/RTCVideoCodecH264.h"
-
-#include <vector>
-
-#import "RTCVideoCodec+Private.h"
-#import "WebRTC/RTCVideoCodec.h"
-
-#include "webrtc/rtc_base/timeutils.h"
-#include "webrtc/sdk/objc/Framework/Classes/Video/objc_frame_buffer.h"
-#include "webrtc/system_wrappers/include/field_trial.h"
-
-const char kHighProfileExperiment[] = "WebRTC-H264HighProfile";
-static NSString *kLevel31ConstrainedHigh = @"640c1f";
-static NSString *kLevel31ConstrainedBaseline = @"42e01f";
-
-bool IsHighProfileEnabled() {
-  return webrtc::field_trial::IsEnabled(kHighProfileExperiment);
-}
-
-// H264 specific settings.
-@implementation RTCCodecSpecificInfoH264
-
-@synthesize packetizationMode = _packetizationMode;
-
-- (webrtc::CodecSpecificInfo)nativeCodecSpecificInfo {
-  webrtc::CodecSpecificInfo codecSpecificInfo;
-  codecSpecificInfo.codecType = webrtc::kVideoCodecH264;
-  codecSpecificInfo.codec_name = "H264";
-  codecSpecificInfo.codecSpecific.H264.packetization_mode =
-      (webrtc::H264PacketizationMode)_packetizationMode;
-
-  return codecSpecificInfo;
-}
-
-@end
-
-// Encoder factory.
-@implementation RTCVideoEncoderFactoryH264
-
-- (NSArray<RTCVideoCodecInfo *> *)supportedCodecs {
-  NSMutableArray<RTCVideoCodecInfo *> *codecs = [NSMutableArray array];
-  NSString *codecName = [NSString stringWithUTF8String:cricket::kH264CodecName];
-
-  if (IsHighProfileEnabled()) {
-    NSDictionary<NSString *, NSString *> *constrainedHighParams = @{
-      @"profile-level-id" : kLevel31ConstrainedHigh,
-      @"level-asymmetry-allowed" : @"1",
-      @"packetization-mode" : @"1",
-    };
-    RTCVideoCodecInfo *constrainedHighInfo =
-        [[RTCVideoCodecInfo alloc] initWithName:codecName parameters:constrainedHighParams];
-    [codecs addObject:constrainedHighInfo];
-  }
-
-  NSDictionary<NSString *, NSString *> *constrainedBaselineParams = @{
-    @"profile-level-id" : kLevel31ConstrainedBaseline,
-    @"level-asymmetry-allowed" : @"1",
-    @"packetization-mode" : @"1",
-  };
-  RTCVideoCodecInfo *constrainedBaselineInfo =
-      [[RTCVideoCodecInfo alloc] initWithName:codecName parameters:constrainedBaselineParams];
-  [codecs addObject:constrainedBaselineInfo];
-
-  return [codecs copy];
-}
-
-- (id<RTCVideoEncoder>)createEncoder:(RTCVideoCodecInfo *)info {
-  return [[RTCVideoEncoderH264 alloc] initWithCodecInfo:info];
-}
-
-@end
-
-// Decoder factory.
-@implementation RTCVideoDecoderFactoryH264
-
-- (id<RTCVideoDecoder>)createDecoder:(RTCVideoCodecInfo *)info {
-  return [[RTCVideoDecoderH264 alloc] init];
-}
-
-- (NSArray<RTCVideoCodecInfo *> *)supportedCodecs {
-  NSString *codecName = [NSString stringWithUTF8String:cricket::kH264CodecName];
-  return @[ [[RTCVideoCodecInfo alloc] initWithName:codecName parameters:nil] ];
-}
-
-@end
diff --git a/sdk/objc/Framework/Classes/PeerConnection/RTCVideoEncoderSettings.mm b/sdk/objc/Framework/Classes/PeerConnection/RTCVideoEncoderSettings.mm
deleted file mode 100644
index 0fb8e46..0000000
--- a/sdk/objc/Framework/Classes/PeerConnection/RTCVideoEncoderSettings.mm
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- *  Copyright 2017 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.
- */
-
-#import "WebRTC/RTCVideoCodec.h"
-
-#import "NSString+StdString.h"
-#import "RTCVideoCodec+Private.h"
-#import "WebRTC/RTCVideoCodecFactory.h"
-
-@implementation RTCVideoEncoderSettings
-
-@synthesize name = _name;
-@synthesize width = _width;
-@synthesize height = _height;
-@synthesize startBitrate = _startBitrate;
-@synthesize maxBitrate = _maxBitrate;
-@synthesize minBitrate = _minBitrate;
-@synthesize targetBitrate = _targetBitrate;
-@synthesize maxFramerate = _maxFramerate;
-@synthesize qpMax = _qpMax;
-@synthesize mode = _mode;
-
-- (instancetype)initWithNativeVideoCodec:(const webrtc::VideoCodec *)videoCodec {
-  if (self = [super init]) {
-    if (videoCodec) {
-      const char *codecName = CodecTypeToPayloadString(videoCodec->codecType);
-      _name = [NSString stringWithUTF8String:codecName];
-
-      _width = videoCodec->width;
-      _height = videoCodec->height;
-      _startBitrate = videoCodec->startBitrate;
-      _maxBitrate = videoCodec->maxBitrate;
-      _minBitrate = videoCodec->minBitrate;
-      _targetBitrate = videoCodec->targetBitrate;
-      _maxFramerate = videoCodec->maxFramerate;
-      _qpMax = videoCodec->qpMax;
-      _mode = (RTCVideoCodecMode)videoCodec->mode;
-    }
-  }
-
-  return self;
-}
-
-@end
diff --git a/sdk/objc/Framework/Classes/PeerConnection/RTCVideoFrame.mm b/sdk/objc/Framework/Classes/PeerConnection/RTCVideoFrame.mm
deleted file mode 100644
index cf4216e..0000000
--- a/sdk/objc/Framework/Classes/PeerConnection/RTCVideoFrame.mm
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-#import "WebRTC/RTCVideoFrame.h"
-#import "WebRTC/RTCVideoFrameBuffer.h"
-
-@implementation RTCVideoFrame {
-  RTCVideoRotation _rotation;
-  int64_t _timeStampNs;
-}
-
-@synthesize buffer = _buffer;
-@synthesize timeStamp;
-
-- (int)width {
-  return _buffer.width;
-}
-
-- (int)height {
-  return _buffer.height;
-}
-
-- (RTCVideoRotation)rotation {
-  return _rotation;
-}
-
-- (int64_t)timeStampNs {
-  return _timeStampNs;
-}
-
-- (RTCVideoFrame *)newI420VideoFrame {
-  return [[RTCVideoFrame alloc] initWithBuffer:[_buffer toI420]
-                                      rotation:_rotation
-                                   timeStampNs:_timeStampNs];
-}
-
-- (instancetype)initWithPixelBuffer:(CVPixelBufferRef)pixelBuffer
-                           rotation:(RTCVideoRotation)rotation
-                        timeStampNs:(int64_t)timeStampNs {
-  return [self initWithBuffer:[[RTCCVPixelBuffer alloc] initWithPixelBuffer:pixelBuffer]
-                     rotation:rotation
-                  timeStampNs:timeStampNs];
-}
-
-- (instancetype)initWithPixelBuffer:(CVPixelBufferRef)pixelBuffer
-                        scaledWidth:(int)scaledWidth
-                       scaledHeight:(int)scaledHeight
-                          cropWidth:(int)cropWidth
-                         cropHeight:(int)cropHeight
-                              cropX:(int)cropX
-                              cropY:(int)cropY
-                           rotation:(RTCVideoRotation)rotation
-                        timeStampNs:(int64_t)timeStampNs {
-  RTCCVPixelBuffer *rtcPixelBuffer = [[RTCCVPixelBuffer alloc] initWithPixelBuffer:pixelBuffer
-                                                                      adaptedWidth:scaledWidth
-                                                                     adaptedHeight:scaledHeight
-                                                                         cropWidth:cropWidth
-                                                                        cropHeight:cropHeight
-                                                                             cropX:cropX
-                                                                             cropY:cropY];
-  return [self initWithBuffer:rtcPixelBuffer rotation:rotation timeStampNs:timeStampNs];
-}
-
-- (instancetype)initWithBuffer:(id<RTCVideoFrameBuffer>)buffer
-                      rotation:(RTCVideoRotation)rotation
-                   timeStampNs:(int64_t)timeStampNs {
-  if (self = [super init]) {
-    _buffer = buffer;
-    _rotation = rotation;
-    _timeStampNs = timeStampNs;
-  }
-
-  return self;
-}
-
-@end
diff --git a/sdk/objc/Framework/Classes/PeerConnection/RTCVideoRendererAdapter+Private.h b/sdk/objc/Framework/Classes/PeerConnection/RTCVideoRendererAdapter+Private.h
deleted file mode 100644
index 0c6f065..0000000
--- a/sdk/objc/Framework/Classes/PeerConnection/RTCVideoRendererAdapter+Private.h
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-#import "RTCVideoRendererAdapter.h"
-
-#import "WebRTC/RTCVideoRenderer.h"
-
-#include "webrtc/api/mediastreaminterface.h"
-
-NS_ASSUME_NONNULL_BEGIN
-
-@interface RTCVideoRendererAdapter ()
-
-/**
- * The Objective-C video renderer passed to this adapter during construction.
- * Calls made to the webrtc::VideoRenderInterface will be adapted and passed to
- * this video renderer.
- */
-@property(nonatomic, readonly) id<RTCVideoRenderer> videoRenderer;
-
-/**
- * The native VideoSinkInterface surface exposed by this adapter. Calls made
- * to this interface will be adapted and passed to the RTCVideoRenderer supplied
- * during construction. This pointer is unsafe and owned by this class.
- */
-@property(nonatomic, readonly)
-    rtc::VideoSinkInterface<webrtc::VideoFrame> *nativeVideoRenderer;
-
-/** Initialize an RTCVideoRendererAdapter with an RTCVideoRenderer. */
-- (instancetype)initWithNativeRenderer:(id<RTCVideoRenderer>)videoRenderer
-    NS_DESIGNATED_INITIALIZER;
-
-@end
-
-NS_ASSUME_NONNULL_END
diff --git a/sdk/objc/Framework/Classes/PeerConnection/RTCVideoRendererAdapter.h b/sdk/objc/Framework/Classes/PeerConnection/RTCVideoRendererAdapter.h
deleted file mode 100644
index b0b6f04..0000000
--- a/sdk/objc/Framework/Classes/PeerConnection/RTCVideoRendererAdapter.h
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-#import <Foundation/Foundation.h>
-
-NS_ASSUME_NONNULL_BEGIN
-
-/*
- * Creates a rtc::VideoSinkInterface surface for an RTCVideoRenderer. The
- * rtc::VideoSinkInterface is used by WebRTC rendering code - this
- * adapter adapts calls made to that interface to the RTCVideoRenderer supplied
- * during construction.
- */
-@interface RTCVideoRendererAdapter : NSObject
-
-- (instancetype)init NS_UNAVAILABLE;
-
-@end
-
-NS_ASSUME_NONNULL_END
diff --git a/sdk/objc/Framework/Classes/PeerConnection/RTCVideoRendererAdapter.mm b/sdk/objc/Framework/Classes/PeerConnection/RTCVideoRendererAdapter.mm
deleted file mode 100644
index 736803b..0000000
--- a/sdk/objc/Framework/Classes/PeerConnection/RTCVideoRendererAdapter.mm
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-#import "RTCI420Buffer+Private.h"
-#import "RTCVideoRendererAdapter+Private.h"
-#import "WebRTC/RTCVideoFrame.h"
-#import "WebRTC/RTCVideoFrameBuffer.h"
-#import "objc_frame_buffer.h"
-
-#include <memory>
-
-namespace webrtc {
-
-class VideoRendererAdapter
-    : public rtc::VideoSinkInterface<webrtc::VideoFrame> {
- public:
-  VideoRendererAdapter(RTCVideoRendererAdapter* adapter) {
-    adapter_ = adapter;
-    size_ = CGSizeZero;
-  }
-
-  void OnFrame(const webrtc::VideoFrame& nativeVideoFrame) override {
-    rtc::scoped_refptr<VideoFrameBuffer> video_frame_buffer = nativeVideoFrame.video_frame_buffer();
-    id<RTCVideoFrameBuffer> rtc_frame_buffer;
-    if (video_frame_buffer->type() == VideoFrameBuffer::Type::kNative) {
-      rtc::scoped_refptr<ObjCFrameBuffer> objc_frame_buffer(
-          static_cast<ObjCFrameBuffer*>(video_frame_buffer.get()));
-      rtc_frame_buffer = (id<RTCVideoFrameBuffer>)objc_frame_buffer->wrapped_frame_buffer();
-    } else {
-      rtc_frame_buffer = [[RTCI420Buffer alloc] initWithFrameBuffer:video_frame_buffer->ToI420()];
-    }
-    RTCVideoFrame* videoFrame = [[RTCVideoFrame alloc]
-        initWithBuffer:rtc_frame_buffer
-              rotation:static_cast<RTCVideoRotation>(nativeVideoFrame.rotation())
-           timeStampNs:nativeVideoFrame.timestamp_us() * rtc::kNumNanosecsPerMicrosec];
-
-    CGSize current_size = (videoFrame.rotation % 180 == 0)
-                              ? CGSizeMake(videoFrame.width, videoFrame.height)
-                              : CGSizeMake(videoFrame.height, videoFrame.width);
-
-    if (!CGSizeEqualToSize(size_, current_size)) {
-      size_ = current_size;
-      [adapter_.videoRenderer setSize:size_];
-    }
-    [adapter_.videoRenderer renderFrame:videoFrame];
-  }
-
- private:
-  __weak RTCVideoRendererAdapter *adapter_;
-  CGSize size_;
-};
-}
-
-@implementation RTCVideoRendererAdapter {
-  std::unique_ptr<webrtc::VideoRendererAdapter> _adapter;
-}
-
-@synthesize videoRenderer = _videoRenderer;
-
-- (instancetype)initWithNativeRenderer:(id<RTCVideoRenderer>)videoRenderer {
-  NSParameterAssert(videoRenderer);
-  if (self = [super init]) {
-    _videoRenderer = videoRenderer;
-    _adapter.reset(new webrtc::VideoRendererAdapter(self));
-  }
-  return self;
-}
-
-- (rtc::VideoSinkInterface<webrtc::VideoFrame> *)nativeVideoRenderer {
-  return _adapter.get();
-}
-
-@end
diff --git a/sdk/objc/Framework/Classes/PeerConnection/RTCVideoSource+Private.h b/sdk/objc/Framework/Classes/PeerConnection/RTCVideoSource+Private.h
deleted file mode 100644
index f6e202c..0000000
--- a/sdk/objc/Framework/Classes/PeerConnection/RTCVideoSource+Private.h
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-#import "WebRTC/RTCVideoSource.h"
-
-#import "RTCMediaSource+Private.h"
-
-#include "webrtc/api/mediastreaminterface.h"
-
-NS_ASSUME_NONNULL_BEGIN
-
-@interface RTCVideoSource ()
-
-/**
- * The VideoTrackSourceInterface object passed to this RTCVideoSource during
- * construction.
- */
-@property(nonatomic, readonly)
-    rtc::scoped_refptr<webrtc::VideoTrackSourceInterface>
-        nativeVideoSource;
-
-/** Initialize an RTCVideoSource from a native VideoTrackSourceInterface. */
-- (instancetype)initWithNativeVideoSource:
-    (rtc::scoped_refptr<webrtc::VideoTrackSourceInterface>)nativeVideoSource
-    NS_DESIGNATED_INITIALIZER;
-
-- (instancetype)initWithNativeMediaSource:
-    (rtc::scoped_refptr<webrtc::MediaSourceInterface>)nativeMediaSource
-                                     type:(RTCMediaSourceType)type NS_UNAVAILABLE;
-
-@end
-
-NS_ASSUME_NONNULL_END
diff --git a/sdk/objc/Framework/Classes/PeerConnection/RTCVideoSource.mm b/sdk/objc/Framework/Classes/PeerConnection/RTCVideoSource.mm
deleted file mode 100644
index 341a522..0000000
--- a/sdk/objc/Framework/Classes/PeerConnection/RTCVideoSource.mm
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-#import "RTCVideoSource+Private.h"
-
-#include "webrtc/api/videosourceproxy.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/sdk/objc/Framework/Classes/Video/objcvideotracksource.h"
-
-static webrtc::ObjcVideoTrackSource *getObjcVideoSource(
-    const rtc::scoped_refptr<webrtc::VideoTrackSourceInterface> nativeSource) {
-  webrtc::VideoTrackSourceProxy *proxy_source =
-      static_cast<webrtc::VideoTrackSourceProxy *>(nativeSource.get());
-  return static_cast<webrtc::ObjcVideoTrackSource *>(proxy_source->internal());
-}
-
-// TODO(magjed): Refactor this class and target ObjcVideoTrackSource only once
-// RTCAVFoundationVideoSource is gone. See http://crbug/webrtc/7177 for more
-// info.
-@implementation RTCVideoSource {
-  rtc::scoped_refptr<webrtc::VideoTrackSourceInterface> _nativeVideoSource;
-}
-
-- (instancetype)initWithNativeVideoSource:
-    (rtc::scoped_refptr<webrtc::VideoTrackSourceInterface>)nativeVideoSource {
-  RTC_DCHECK(nativeVideoSource);
-  if (self = [super initWithNativeMediaSource:nativeVideoSource
-                                         type:RTCMediaSourceTypeVideo]) {
-    _nativeVideoSource = nativeVideoSource;
-  }
-  return self;
-}
-
-- (instancetype)initWithNativeMediaSource:
-    (rtc::scoped_refptr<webrtc::MediaSourceInterface>)nativeMediaSource
-                                     type:(RTCMediaSourceType)type {
-  RTC_NOTREACHED();
-  return nil;
-}
-
-- (NSString *)description {
-  NSString *stateString = [[self class] stringForState:self.state];
-  return [NSString stringWithFormat:@"RTCVideoSource( %p ): %@", self, stateString];
-}
-
-- (void)capturer:(RTCVideoCapturer *)capturer didCaptureVideoFrame:(RTCVideoFrame *)frame {
-  getObjcVideoSource(_nativeVideoSource)->OnCapturedFrame(frame);
-}
-
-- (void)adaptOutputFormatToWidth:(int)width height:(int)height fps:(int)fps {
-  getObjcVideoSource(_nativeVideoSource)->OnOutputFormatRequest(width, height, fps);
-}
-
-#pragma mark - Private
-
-- (rtc::scoped_refptr<webrtc::VideoTrackSourceInterface>)nativeVideoSource {
-  return _nativeVideoSource;
-}
-
-@end
diff --git a/sdk/objc/Framework/Classes/PeerConnection/RTCVideoTrack+Private.h b/sdk/objc/Framework/Classes/PeerConnection/RTCVideoTrack+Private.h
deleted file mode 100644
index 5199be3..0000000
--- a/sdk/objc/Framework/Classes/PeerConnection/RTCVideoTrack+Private.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-#import "WebRTC/RTCVideoTrack.h"
-
-#include "webrtc/api/mediastreaminterface.h"
-
-NS_ASSUME_NONNULL_BEGIN
-
-@interface RTCVideoTrack ()
-
-/** VideoTrackInterface created or passed in at construction. */
-@property(nonatomic, readonly)
-    rtc::scoped_refptr<webrtc::VideoTrackInterface> nativeVideoTrack;
-
-/** Initialize an RTCVideoTrack with its source and an id. */
-- (instancetype)initWithFactory:(RTCPeerConnectionFactory *)factory
-                         source:(RTCVideoSource *)source
-                        trackId:(NSString *)trackId;
-
-@end
-
-NS_ASSUME_NONNULL_END
diff --git a/sdk/objc/Framework/Classes/PeerConnection/RTCVideoTrack.mm b/sdk/objc/Framework/Classes/PeerConnection/RTCVideoTrack.mm
deleted file mode 100644
index 9fa6111..0000000
--- a/sdk/objc/Framework/Classes/PeerConnection/RTCVideoTrack.mm
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-#import "RTCVideoTrack+Private.h"
-
-#import "NSString+StdString.h"
-#import "RTCMediaStreamTrack+Private.h"
-#import "RTCPeerConnectionFactory+Private.h"
-#import "RTCVideoRendererAdapter+Private.h"
-#import "RTCVideoSource+Private.h"
-
-@implementation RTCVideoTrack {
-  NSMutableArray *_adapters;
-}
-
-@synthesize source = _source;
-
-- (instancetype)initWithFactory:(RTCPeerConnectionFactory *)factory
-                         source:(RTCVideoSource *)source
-                        trackId:(NSString *)trackId {
-  NSParameterAssert(factory);
-  NSParameterAssert(source);
-  NSParameterAssert(trackId.length);
-  std::string nativeId = [NSString stdStringForString:trackId];
-  rtc::scoped_refptr<webrtc::VideoTrackInterface> track =
-      factory.nativeFactory->CreateVideoTrack(nativeId,
-                                              source.nativeVideoSource);
-  if ([self initWithNativeTrack:track type:RTCMediaStreamTrackTypeVideo]) {
-    _source = source;
-  }
-  return self;
-}
-
-- (instancetype)initWithNativeTrack:
-    (rtc::scoped_refptr<webrtc::MediaStreamTrackInterface>)nativeMediaTrack
-                               type:(RTCMediaStreamTrackType)type {
-  NSParameterAssert(nativeMediaTrack);
-  NSParameterAssert(type == RTCMediaStreamTrackTypeVideo);
-  if (self = [super initWithNativeTrack:nativeMediaTrack type:type]) {
-    _adapters = [NSMutableArray array];
-  }
-  return self;
-}
-
-- (void)dealloc {
-  for (RTCVideoRendererAdapter *adapter in _adapters) {
-    self.nativeVideoTrack->RemoveSink(adapter.nativeVideoRenderer);
-  }
-}
-
-- (RTCVideoSource *)source {
-  if (!_source) {
-    rtc::scoped_refptr<webrtc::VideoTrackSourceInterface> source =
-        self.nativeVideoTrack->GetSource();
-    if (source) {
-      _source = [[RTCVideoSource alloc] initWithNativeVideoSource:source.get()];
-    }
-  }
-  return _source;
-}
-
-- (void)addRenderer:(id<RTCVideoRenderer>)renderer {
-  // Make sure we don't have this renderer yet.
-  for (RTCVideoRendererAdapter *adapter in _adapters) {
-    if (adapter.videoRenderer == renderer) {
-      NSAssert(NO, @"|renderer| is already attached to this track");
-      return;
-    }
-  }
-  // Create a wrapper that provides a native pointer for us.
-  RTCVideoRendererAdapter* adapter =
-      [[RTCVideoRendererAdapter alloc] initWithNativeRenderer:renderer];
-  [_adapters addObject:adapter];
-  self.nativeVideoTrack->AddOrUpdateSink(adapter.nativeVideoRenderer,
-                                         rtc::VideoSinkWants());
-}
-
-- (void)removeRenderer:(id<RTCVideoRenderer>)renderer {
-  __block NSUInteger indexToRemove = NSNotFound;
-  [_adapters enumerateObjectsUsingBlock:^(RTCVideoRendererAdapter *adapter,
-                                          NSUInteger idx,
-                                          BOOL *stop) {
-    if (adapter.videoRenderer == renderer) {
-      indexToRemove = idx;
-      *stop = YES;
-    }
-  }];
-  if (indexToRemove == NSNotFound) {
-    return;
-  }
-  RTCVideoRendererAdapter *adapterToRemove =
-      [_adapters objectAtIndex:indexToRemove];
-  self.nativeVideoTrack->RemoveSink(adapterToRemove.nativeVideoRenderer);
-  [_adapters removeObjectAtIndex:indexToRemove];
-}
-
-#pragma mark - Private
-
-- (rtc::scoped_refptr<webrtc::VideoTrackInterface>)nativeVideoTrack {
-  return static_cast<webrtc::VideoTrackInterface *>(self.nativeTrack.get());
-}
-
-@end
diff --git a/sdk/objc/Framework/Classes/UI/RTCCameraPreviewView.m b/sdk/objc/Framework/Classes/UI/RTCCameraPreviewView.m
deleted file mode 100644
index 8af3384..0000000
--- a/sdk/objc/Framework/Classes/UI/RTCCameraPreviewView.m
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-#import "WebRTC/RTCCameraPreviewView.h"
-
-#import <AVFoundation/AVFoundation.h>
-#import <UIKit/UIKit.h>
-
-#import "RTCDispatcher+Private.h"
-
-@implementation RTCCameraPreviewView
-
-@synthesize captureSession = _captureSession;
-
-+ (Class)layerClass {
-  return [AVCaptureVideoPreviewLayer class];
-}
-
-- (void)setCaptureSession:(AVCaptureSession *)captureSession {
-  if (_captureSession == captureSession) {
-    return;
-  }
-  [RTCDispatcher dispatchAsyncOnType:RTCDispatcherTypeMain
-                               block:^{
-    _captureSession = captureSession;
-    AVCaptureVideoPreviewLayer *previewLayer = [self previewLayer];
-    [RTCDispatcher dispatchAsyncOnType:RTCDispatcherTypeCaptureSession
-                                 block:^{
-      previewLayer.session = captureSession;
-    }];
-  }];
-}
-
-- (void)layoutSubviews {
-  [super layoutSubviews];
-
-  // Update the video orientation based on the device orientation.
-  [self setCorrectVideoOrientation];
-}
-
-- (void)setCorrectVideoOrientation {
-  // Get current device orientation.
-  UIDeviceOrientation deviceOrientation = [UIDevice currentDevice].orientation;
-  AVCaptureVideoPreviewLayer *previewLayer = [self previewLayer];
-
-  // First check if we are allowed to set the video orientation.
-  if (previewLayer.connection.isVideoOrientationSupported) {
-    // Set the video orientation based on device orientation.
-    if (deviceOrientation == UIInterfaceOrientationPortraitUpsideDown) {
-      previewLayer.connection.videoOrientation =
-          AVCaptureVideoOrientationPortraitUpsideDown;
-    } else if (deviceOrientation == UIInterfaceOrientationLandscapeRight) {
-      previewLayer.connection.videoOrientation =
-          AVCaptureVideoOrientationLandscapeRight;
-    } else if (deviceOrientation == UIInterfaceOrientationLandscapeLeft) {
-      previewLayer.connection.videoOrientation =
-          AVCaptureVideoOrientationLandscapeLeft;
-    } else {
-      previewLayer.connection.videoOrientation =
-          AVCaptureVideoOrientationPortrait;
-    }
-  }
-}
-
-#pragma mark - Private
-
-- (AVCaptureVideoPreviewLayer *)previewLayer {
-  return (AVCaptureVideoPreviewLayer *)self.layer;
-}
-
-@end
diff --git a/sdk/objc/Framework/Classes/UI/RTCEAGLVideoView.m b/sdk/objc/Framework/Classes/UI/RTCEAGLVideoView.m
deleted file mode 100644
index 80282f0..0000000
--- a/sdk/objc/Framework/Classes/UI/RTCEAGLVideoView.m
+++ /dev/null
@@ -1,328 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-#import "WebRTC/RTCEAGLVideoView.h"
-
-#import <GLKit/GLKit.h>
-
-#import "RTCDefaultShader.h"
-#import "RTCI420TextureCache.h"
-#import "RTCNV12TextureCache.h"
-#import "WebRTC/RTCLogging.h"
-#import "WebRTC/RTCVideoFrame.h"
-#import "WebRTC/RTCVideoFrameBuffer.h"
-
-// RTCDisplayLinkTimer wraps a CADisplayLink and is set to fire every two screen
-// refreshes, which should be 30fps. We wrap the display link in order to avoid
-// a retain cycle since CADisplayLink takes a strong reference onto its target.
-// The timer is paused by default.
-@interface RTCDisplayLinkTimer : NSObject
-
-@property(nonatomic) BOOL isPaused;
-
-- (instancetype)initWithTimerHandler:(void (^)(void))timerHandler;
-- (void)invalidate;
-
-@end
-
-@implementation RTCDisplayLinkTimer {
-  CADisplayLink *_displayLink;
-  void (^_timerHandler)(void);
-}
-
-- (instancetype)initWithTimerHandler:(void (^)(void))timerHandler {
-  NSParameterAssert(timerHandler);
-  if (self = [super init]) {
-    _timerHandler = timerHandler;
-    _displayLink =
-        [CADisplayLink displayLinkWithTarget:self
-                                    selector:@selector(displayLinkDidFire:)];
-    _displayLink.paused = YES;
-    // Set to half of screen refresh, which should be 30fps.
-    [_displayLink setFrameInterval:2];
-    [_displayLink addToRunLoop:[NSRunLoop currentRunLoop]
-                       forMode:NSRunLoopCommonModes];
-  }
-  return self;
-}
-
-- (void)dealloc {
-  [self invalidate];
-}
-
-- (BOOL)isPaused {
-  return _displayLink.paused;
-}
-
-- (void)setIsPaused:(BOOL)isPaused {
-  _displayLink.paused = isPaused;
-}
-
-- (void)invalidate {
-  [_displayLink invalidate];
-}
-
-- (void)displayLinkDidFire:(CADisplayLink *)displayLink {
-  _timerHandler();
-}
-
-@end
-
-// RTCEAGLVideoView wraps a GLKView which is setup with
-// enableSetNeedsDisplay = NO for the purpose of gaining control of
-// exactly when to call -[GLKView display]. This need for extra
-// control is required to avoid triggering method calls on GLKView
-// that results in attempting to bind the underlying render buffer
-// when the drawable size would be empty which would result in the
-// error GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT. -[GLKView display] is
-// the method that will trigger the binding of the render
-// buffer. Because the standard behaviour of -[UIView setNeedsDisplay]
-// is disabled for the reasons above, the RTCEAGLVideoView maintains
-// its own |isDirty| flag.
-
-@interface RTCEAGLVideoView () <GLKViewDelegate>
-// |videoFrame| is set when we receive a frame from a worker thread and is read
-// from the display link callback so atomicity is required.
-@property(atomic, strong) RTCVideoFrame *videoFrame;
-@property(nonatomic, readonly) GLKView *glkView;
-@end
-
-@implementation RTCEAGLVideoView {
-  RTCDisplayLinkTimer *_timer;
-  EAGLContext *_glContext;
-  // This flag should only be set and read on the main thread (e.g. by
-  // setNeedsDisplay)
-  BOOL _isDirty;
-  id<RTCVideoViewShading> _shader;
-  RTCNV12TextureCache *_nv12TextureCache;
-  RTCI420TextureCache *_i420TextureCache;
-  RTCVideoFrame *_lastDrawnFrame;
-}
-
-@synthesize delegate = _delegate;
-@synthesize videoFrame = _videoFrame;
-@synthesize glkView = _glkView;
-
-- (instancetype)initWithFrame:(CGRect)frame {
-  return [self initWithFrame:frame shader:[[RTCDefaultShader alloc] init]];
-}
-
-- (instancetype)initWithCoder:(NSCoder *)aDecoder {
-  return [self initWithCoder:aDecoder shader:[[RTCDefaultShader alloc] init]];
-}
-
-- (instancetype)initWithFrame:(CGRect)frame shader:(id<RTCVideoViewShading>)shader {
-  if (self = [super initWithFrame:frame]) {
-    _shader = shader;
-    if (![self configure]) {
-      return nil;
-    }
-  }
-  return self;
-}
-
-- (instancetype)initWithCoder:(NSCoder *)aDecoder shader:(id<RTCVideoViewShading>)shader {
-  if (self = [super initWithCoder:aDecoder]) {
-    _shader = shader;
-    if (![self configure]) {
-      return nil;
-    }
-  }
-  return self;
-}
-
-- (BOOL)configure {
-  EAGLContext *glContext =
-    [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES3];
-  if (!glContext) {
-    glContext = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
-  }
-  if (!glContext) {
-    RTCLogError(@"Failed to create EAGLContext");
-    return NO;
-  }
-  _glContext = glContext;
-
-  // GLKView manages a framebuffer for us.
-  _glkView = [[GLKView alloc] initWithFrame:CGRectZero
-                                    context:_glContext];
-  _glkView.drawableColorFormat = GLKViewDrawableColorFormatRGBA8888;
-  _glkView.drawableDepthFormat = GLKViewDrawableDepthFormatNone;
-  _glkView.drawableStencilFormat = GLKViewDrawableStencilFormatNone;
-  _glkView.drawableMultisample = GLKViewDrawableMultisampleNone;
-  _glkView.delegate = self;
-  _glkView.layer.masksToBounds = YES;
-  _glkView.enableSetNeedsDisplay = NO;
-  [self addSubview:_glkView];
-
-  // Listen to application state in order to clean up OpenGL before app goes
-  // away.
-  NSNotificationCenter *notificationCenter =
-    [NSNotificationCenter defaultCenter];
-  [notificationCenter addObserver:self
-                         selector:@selector(willResignActive)
-                             name:UIApplicationWillResignActiveNotification
-                           object:nil];
-  [notificationCenter addObserver:self
-                         selector:@selector(didBecomeActive)
-                             name:UIApplicationDidBecomeActiveNotification
-                           object:nil];
-
-  // Frames are received on a separate thread, so we poll for current frame
-  // using a refresh rate proportional to screen refresh frequency. This
-  // occurs on the main thread.
-  __weak RTCEAGLVideoView *weakSelf = self;
-  _timer = [[RTCDisplayLinkTimer alloc] initWithTimerHandler:^{
-      RTCEAGLVideoView *strongSelf = weakSelf;
-      [strongSelf displayLinkTimerDidFire];
-    }];
-  [self setupGL];
-  return YES;
-}
-
-- (void)dealloc {
-  [[NSNotificationCenter defaultCenter] removeObserver:self];
-  UIApplicationState appState =
-      [UIApplication sharedApplication].applicationState;
-  if (appState == UIApplicationStateActive) {
-    [self teardownGL];
-  }
-  [_timer invalidate];
-  if (_glContext && [EAGLContext currentContext] == _glContext) {
-    [EAGLContext setCurrentContext:nil];
-  }
-}
-
-#pragma mark - UIView
-
-- (void)setNeedsDisplay {
-  [super setNeedsDisplay];
-  _isDirty = YES;
-}
-
-- (void)setNeedsDisplayInRect:(CGRect)rect {
-  [super setNeedsDisplayInRect:rect];
-  _isDirty = YES;
-}
-
-- (void)layoutSubviews {
-  [super layoutSubviews];
-  _glkView.frame = self.bounds;
-}
-
-#pragma mark - GLKViewDelegate
-
-// This method is called when the GLKView's content is dirty and needs to be
-// redrawn. This occurs on main thread.
-- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect {
-  // The renderer will draw the frame to the framebuffer corresponding to the
-  // one used by |view|.
-  RTCVideoFrame *frame = self.videoFrame;
-  if (!frame || frame == _lastDrawnFrame) {
-    return;
-  }
-  [self ensureGLContext];
-  glClear(GL_COLOR_BUFFER_BIT);
-  if ([frame.buffer isKindOfClass:[RTCCVPixelBuffer class]]) {
-    if (!_nv12TextureCache) {
-      _nv12TextureCache = [[RTCNV12TextureCache alloc] initWithContext:_glContext];
-    }
-    if (_nv12TextureCache) {
-      [_nv12TextureCache uploadFrameToTextures:frame];
-      [_shader applyShadingForFrameWithWidth:frame.width
-                                      height:frame.height
-                                    rotation:frame.rotation
-                                      yPlane:_nv12TextureCache.yTexture
-                                     uvPlane:_nv12TextureCache.uvTexture];
-      [_nv12TextureCache releaseTextures];
-    }
-  } else {
-    if (!_i420TextureCache) {
-      _i420TextureCache = [[RTCI420TextureCache alloc] initWithContext:_glContext];
-    }
-    [_i420TextureCache uploadFrameToTextures:frame];
-    [_shader applyShadingForFrameWithWidth:frame.width
-                                    height:frame.height
-                                  rotation:frame.rotation
-                                    yPlane:_i420TextureCache.yTexture
-                                    uPlane:_i420TextureCache.uTexture
-                                    vPlane:_i420TextureCache.vTexture];
-  }
-}
-
-#pragma mark - RTCVideoRenderer
-
-// These methods may be called on non-main thread.
-- (void)setSize:(CGSize)size {
-  __weak RTCEAGLVideoView *weakSelf = self;
-  dispatch_async(dispatch_get_main_queue(), ^{
-    RTCEAGLVideoView *strongSelf = weakSelf;
-    [strongSelf.delegate videoView:strongSelf didChangeVideoSize:size];
-  });
-}
-
-- (void)renderFrame:(RTCVideoFrame *)frame {
-  self.videoFrame = frame;
-}
-
-#pragma mark - Private
-
-- (void)displayLinkTimerDidFire {
-  // Don't render unless video frame have changed or the view content
-  // has explicitly been marked dirty.
-  if (!_isDirty && _lastDrawnFrame == self.videoFrame) {
-    return;
-  }
-
-  // Always reset isDirty at this point, even if -[GLKView display]
-  // won't be called in the case the drawable size is empty.
-  _isDirty = NO;
-
-  // Only call -[GLKView display] if the drawable size is
-  // non-empty. Calling display will make the GLKView setup its
-  // render buffer if necessary, but that will fail with error
-  // GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT if size is empty.
-  if (self.bounds.size.width > 0 && self.bounds.size.height > 0) {
-    [_glkView display];
-  }
-}
-
-- (void)setupGL {
-  self.videoFrame = nil;
-  [self ensureGLContext];
-  glDisable(GL_DITHER);
-  _timer.isPaused = NO;
-}
-
-- (void)teardownGL {
-  self.videoFrame = nil;
-  _timer.isPaused = YES;
-  [_glkView deleteDrawable];
-  [self ensureGLContext];
-  _nv12TextureCache = nil;
-  _i420TextureCache = nil;
-}
-
-- (void)didBecomeActive {
-  [self setupGL];
-}
-
-- (void)willResignActive {
-  [self teardownGL];
-}
-
-- (void)ensureGLContext {
-  NSAssert(_glContext, @"context shouldn't be nil");
-  if ([EAGLContext currentContext] != _glContext) {
-    [EAGLContext setCurrentContext:_glContext];
-  }
-}
-
-@end
diff --git a/sdk/objc/Framework/Classes/UI/RTCNSGLVideoView.m b/sdk/objc/Framework/Classes/UI/RTCNSGLVideoView.m
deleted file mode 100644
index 9578f82..0000000
--- a/sdk/objc/Framework/Classes/UI/RTCNSGLVideoView.m
+++ /dev/null
@@ -1,196 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-#import <Foundation/Foundation.h>
-
-#if !TARGET_OS_IPHONE
-
-#import "WebRTC/RTCNSGLVideoView.h"
-
-#import <AppKit/NSOpenGL.h>
-#import <CoreVideo/CVDisplayLink.h>
-#import <OpenGL/gl3.h>
-
-#import "RTCDefaultShader.h"
-#import "RTCI420TextureCache.h"
-#import "WebRTC/RTCLogging.h"
-#import "WebRTC/RTCVideoFrame.h"
-
-@interface RTCNSGLVideoView ()
-// |videoFrame| is set when we receive a frame from a worker thread and is read
-// from the display link callback so atomicity is required.
-@property(atomic, strong) RTCVideoFrame *videoFrame;
-@property(atomic, strong) RTCI420TextureCache *i420TextureCache;
-
-- (void)drawFrame;
-@end
-
-static CVReturn OnDisplayLinkFired(CVDisplayLinkRef displayLink,
-                                   const CVTimeStamp *now,
-                                   const CVTimeStamp *outputTime,
-                                   CVOptionFlags flagsIn,
-                                   CVOptionFlags *flagsOut,
-                                   void *displayLinkContext) {
-  RTCNSGLVideoView *view = (__bridge RTCNSGLVideoView *)displayLinkContext;
-  [view drawFrame];
-  return kCVReturnSuccess;
-}
-
-@implementation RTCNSGLVideoView {
-  CVDisplayLinkRef _displayLink;
-  RTCVideoFrame *_lastDrawnFrame;
-  id<RTCVideoViewShading> _shader;
-}
-
-@synthesize delegate = _delegate;
-@synthesize videoFrame = _videoFrame;
-@synthesize i420TextureCache = _i420TextureCache;
-
-- (instancetype)initWithFrame:(NSRect)frame pixelFormat:(NSOpenGLPixelFormat *)format {
-  return [self initWithFrame:frame pixelFormat:format shader:[[RTCDefaultShader alloc] init]];
-}
-
-- (instancetype)initWithFrame:(NSRect)frame
-                  pixelFormat:(NSOpenGLPixelFormat *)format
-                       shader:(id<RTCVideoViewShading>)shader {
-  if (self = [super initWithFrame:frame pixelFormat:format]) {
-    _shader = shader;
-  }
-  return self;
-}
-
-- (void)dealloc {
-  [self teardownDisplayLink];
-}
-
-- (void)drawRect:(NSRect)rect {
-  [self drawFrame];
-}
-
-- (void)reshape {
-  [super reshape];
-  NSRect frame = [self frame];
-  [self ensureGLContext];
-  CGLLockContext([[self openGLContext] CGLContextObj]);
-  glViewport(0, 0, frame.size.width, frame.size.height);
-  CGLUnlockContext([[self openGLContext] CGLContextObj]);
-}
-
-- (void)lockFocus {
-  NSOpenGLContext *context = [self openGLContext];
-  [super lockFocus];
-  if ([context view] != self) {
-    [context setView:self];
-  }
-  [context makeCurrentContext];
-}
-
-- (void)prepareOpenGL {
-  [super prepareOpenGL];
-  [self ensureGLContext];
-  glDisable(GL_DITHER);
-  [self setupDisplayLink];
-}
-
-- (void)clearGLContext {
-  [self ensureGLContext];
-  self.i420TextureCache = nil;
-  [super clearGLContext];
-}
-
-#pragma mark - RTCVideoRenderer
-
-// These methods may be called on non-main thread.
-- (void)setSize:(CGSize)size {
-  dispatch_async(dispatch_get_main_queue(), ^{
-    [self.delegate videoView:self didChangeVideoSize:size];
-  });
-}
-
-- (void)renderFrame:(RTCVideoFrame *)frame {
-  self.videoFrame = frame;
-}
-
-#pragma mark - Private
-
-- (void)drawFrame {
-  RTCVideoFrame *frame = self.videoFrame;
-  if (!frame || frame == _lastDrawnFrame) {
-    return;
-  }
-  // This method may be called from CVDisplayLink callback which isn't on the
-  // main thread so we have to lock the GL context before drawing.
-  NSOpenGLContext *context = [self openGLContext];
-  CGLLockContext([context CGLContextObj]);
-
-  [self ensureGLContext];
-  glClear(GL_COLOR_BUFFER_BIT);
-
-  // Rendering native CVPixelBuffer is not supported on OS X.
-  // TODO(magjed): Add support for NV12 texture cache on OS X.
-  frame = [frame newI420VideoFrame];
-  if (!self.i420TextureCache) {
-    self.i420TextureCache = [[RTCI420TextureCache alloc] initWithContext:context];
-  }
-  RTCI420TextureCache *i420TextureCache = self.i420TextureCache;
-  if (i420TextureCache) {
-    [i420TextureCache uploadFrameToTextures:frame];
-    [_shader applyShadingForFrameWithWidth:frame.width
-                                    height:frame.height
-                                  rotation:frame.rotation
-                                    yPlane:i420TextureCache.yTexture
-                                    uPlane:i420TextureCache.uTexture
-                                    vPlane:i420TextureCache.vTexture];
-    [context flushBuffer];
-    _lastDrawnFrame = frame;
-  }
-  CGLUnlockContext([context CGLContextObj]);
-}
-
-- (void)setupDisplayLink {
-  if (_displayLink) {
-    return;
-  }
-  // Synchronize buffer swaps with vertical refresh rate.
-  GLint swapInt = 1;
-  [[self openGLContext] setValues:&swapInt forParameter:NSOpenGLCPSwapInterval];
-
-  // Create display link.
-  CVDisplayLinkCreateWithActiveCGDisplays(&_displayLink);
-  CVDisplayLinkSetOutputCallback(_displayLink,
-                                 &OnDisplayLinkFired,
-                                 (__bridge void *)self);
-  // Set the display link for the current renderer.
-  CGLContextObj cglContext = [[self openGLContext] CGLContextObj];
-  CGLPixelFormatObj cglPixelFormat = [[self pixelFormat] CGLPixelFormatObj];
-  CVDisplayLinkSetCurrentCGDisplayFromOpenGLContext(
-      _displayLink, cglContext, cglPixelFormat);
-  CVDisplayLinkStart(_displayLink);
-}
-
-- (void)teardownDisplayLink {
-  if (!_displayLink) {
-    return;
-  }
-  CVDisplayLinkRelease(_displayLink);
-  _displayLink = NULL;
-}
-
-- (void)ensureGLContext {
-  NSOpenGLContext* context = [self openGLContext];
-  NSAssert(context, @"context shouldn't be nil");
-  if ([NSOpenGLContext currentContext] != context) {
-    [context makeCurrentContext];
-  }
-}
-
-@end
-
-#endif  // !TARGET_OS_IPHONE
diff --git a/sdk/objc/Framework/Classes/Video/AVCaptureSession+DevicePosition.h b/sdk/objc/Framework/Classes/Video/AVCaptureSession+DevicePosition.h
deleted file mode 100644
index 32ab687..0000000
--- a/sdk/objc/Framework/Classes/Video/AVCaptureSession+DevicePosition.h
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- *  Copyright 2017 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.
- */
-
-#import <AVFoundation/AVFoundation.h>
-#import <CoreMedia/CoreMedia.h>
-
-NS_ASSUME_NONNULL_BEGIN
-
-@interface AVCaptureSession (DevicePosition)
-
-// Check the image's EXIF for the camera the image came from.
-+ (AVCaptureDevicePosition)devicePositionForSampleBuffer:(CMSampleBufferRef)sampleBuffer;
-
-@end
-
-NS_ASSUME_NONNULL_END
diff --git a/sdk/objc/Framework/Classes/Video/AVCaptureSession+DevicePosition.mm b/sdk/objc/Framework/Classes/Video/AVCaptureSession+DevicePosition.mm
deleted file mode 100644
index 0814ecc..0000000
--- a/sdk/objc/Framework/Classes/Video/AVCaptureSession+DevicePosition.mm
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- *  Copyright 2017 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.
- */
-
-#import "AVCaptureSession+DevicePosition.h"
-
-BOOL CFStringContainsString(CFStringRef theString, CFStringRef stringToFind) {
-  return CFStringFindWithOptions(theString,
-                                 stringToFind,
-                                 CFRangeMake(0, CFStringGetLength(theString)),
-                                 kCFCompareCaseInsensitive,
-                                 nil);
-}
-
-@implementation AVCaptureSession (DevicePosition)
-
-+ (AVCaptureDevicePosition)devicePositionForSampleBuffer:(CMSampleBufferRef)sampleBuffer {
-  // Check the image's EXIF for the camera the image came from.
-  AVCaptureDevicePosition cameraPosition = AVCaptureDevicePositionUnspecified;
-  CFDictionaryRef attachments = CMCopyDictionaryOfAttachments(
-      kCFAllocatorDefault, sampleBuffer, kCMAttachmentMode_ShouldPropagate);
-  if (attachments) {
-    int size = CFDictionaryGetCount(attachments);
-    if (size > 0) {
-      CFDictionaryRef cfExifDictVal = nil;
-      if (CFDictionaryGetValueIfPresent(
-              attachments, (const void *)CFSTR("{Exif}"), (const void **)&cfExifDictVal)) {
-        CFStringRef cfLensModelStrVal;
-        if (CFDictionaryGetValueIfPresent(cfExifDictVal,
-                                          (const void *)CFSTR("LensModel"),
-                                          (const void **)&cfLensModelStrVal)) {
-          if (CFStringContainsString(cfLensModelStrVal, CFSTR("front"))) {
-            cameraPosition = AVCaptureDevicePositionFront;
-          } else if (CFStringContainsString(cfLensModelStrVal, CFSTR("back"))) {
-            cameraPosition = AVCaptureDevicePositionBack;
-          }
-        }
-      }
-    }
-    CFRelease(attachments);
-  }
-  return cameraPosition;
-}
-
-@end
diff --git a/sdk/objc/Framework/Classes/Video/RTCAVFoundationVideoCapturerInternal.h b/sdk/objc/Framework/Classes/Video/RTCAVFoundationVideoCapturerInternal.h
deleted file mode 100644
index 8b73a80..0000000
--- a/sdk/objc/Framework/Classes/Video/RTCAVFoundationVideoCapturerInternal.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- *  Copyright 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.
- */
-
-#import <AVFoundation/AVFoundation.h>
-#import <Foundation/Foundation.h>
-
-#ifdef __cplusplus
-#include "avfoundationvideocapturer.h"
-#endif
-
-NS_ASSUME_NONNULL_BEGIN
-// This class is an implementation detail of AVFoundationVideoCapturer and handles
-// the ObjC integration with the AVFoundation APIs.
-// It is meant to be owned by an instance of AVFoundationVideoCapturer.
-// The reason for this is because other webrtc objects own cricket::VideoCapturer, which is not
-// ref counted. To prevent bad behavior we do not expose this class directly.
-@interface RTCAVFoundationVideoCapturerInternal
-    : NSObject <AVCaptureVideoDataOutputSampleBufferDelegate>
-
-@property(nonatomic, readonly) AVCaptureSession *captureSession;
-@property(nonatomic, readonly) dispatch_queue_t frameQueue;
-@property(nonatomic, readonly) BOOL canUseBackCamera;
-@property(nonatomic, assign) BOOL useBackCamera;  // Defaults to NO.
-@property(atomic, assign) BOOL isRunning;  // Whether the capture session is running.
-@property(atomic, assign) BOOL hasStarted;  // Whether we have an unmatched start.
-
-// We keep a pointer back to AVFoundationVideoCapturer to make callbacks on it
-// when we receive frames. This is safe because this object should be owned by
-// it.
-- (instancetype)initWithCapturer:(webrtc::AVFoundationVideoCapturer *)capturer;
-- (AVCaptureDevice *)getActiveCaptureDevice;
-
-- (nullable AVCaptureDevice *)frontCaptureDevice;
-- (nullable AVCaptureDevice *)backCaptureDevice;
-
-// Starts and stops the capture session asynchronously. We cannot do this
-// synchronously without blocking a WebRTC thread.
-- (void)start;
-- (void)stop;
-
-@end
-NS_ASSUME_NONNULL_END
diff --git a/sdk/objc/Framework/Classes/Video/RTCAVFoundationVideoCapturerInternal.mm b/sdk/objc/Framework/Classes/Video/RTCAVFoundationVideoCapturerInternal.mm
deleted file mode 100644
index 287ecdd..0000000
--- a/sdk/objc/Framework/Classes/Video/RTCAVFoundationVideoCapturerInternal.mm
+++ /dev/null
@@ -1,518 +0,0 @@
-/*
- *  Copyright 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.
- */
-
-#import "RTCAVFoundationVideoCapturerInternal.h"
-
-#import <Foundation/Foundation.h>
-#if TARGET_OS_IPHONE
-#import <UIKit/UIKit.h>
-#import "WebRTC/UIDevice+RTCDevice.h"
-#endif
-
-#import "AVCaptureSession+DevicePosition.h"
-#import "RTCDispatcher+Private.h"
-#import "WebRTC/RTCLogging.h"
-
-#include "avfoundationformatmapper.h"
-
-@implementation RTCAVFoundationVideoCapturerInternal {
-  // Keep pointers to inputs for convenience.
-  AVCaptureDeviceInput *_frontCameraInput;
-  AVCaptureDeviceInput *_backCameraInput;
-  AVCaptureVideoDataOutput *_videoDataOutput;
-  // The cricket::VideoCapturer that owns this class. Should never be NULL.
-  webrtc::AVFoundationVideoCapturer *_capturer;
-  BOOL _hasRetriedOnFatalError;
-  BOOL _isRunning;
-  BOOL _hasStarted;
-  rtc::CriticalSection _crit;
-#if TARGET_OS_IPHONE
-  UIDeviceOrientation _orientation;
-#endif
-}
-
-@synthesize captureSession = _captureSession;
-@synthesize frameQueue = _frameQueue;
-@synthesize useBackCamera = _useBackCamera;
-
-@synthesize isRunning = _isRunning;
-@synthesize hasStarted = _hasStarted;
-
-// This is called from the thread that creates the video source, which is likely
-// the main thread.
-- (instancetype)initWithCapturer:(webrtc::AVFoundationVideoCapturer *)capturer {
-  RTC_DCHECK(capturer);
-  if (self = [super init]) {
-    _capturer = capturer;
-    // Create the capture session and all relevant inputs and outputs. We need
-    // to do this in init because the application may want the capture session
-    // before we start the capturer for e.g. AVCapturePreviewLayer. All objects
-    // created here are retained until dealloc and never recreated.
-    if (![self setupCaptureSession]) {
-      return nil;
-    }
-    NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
-#if TARGET_OS_IPHONE
-    _orientation = UIDeviceOrientationPortrait;
-    [center addObserver:self
-               selector:@selector(deviceOrientationDidChange:)
-                   name:UIDeviceOrientationDidChangeNotification
-                 object:nil];
-    [center addObserver:self
-               selector:@selector(handleCaptureSessionInterruption:)
-                   name:AVCaptureSessionWasInterruptedNotification
-                 object:_captureSession];
-    [center addObserver:self
-               selector:@selector(handleCaptureSessionInterruptionEnded:)
-                   name:AVCaptureSessionInterruptionEndedNotification
-                 object:_captureSession];
-    [center addObserver:self
-               selector:@selector(handleApplicationDidBecomeActive:)
-                   name:UIApplicationDidBecomeActiveNotification
-                 object:[UIApplication sharedApplication]];
-#endif
-    [center addObserver:self
-               selector:@selector(handleCaptureSessionRuntimeError:)
-                   name:AVCaptureSessionRuntimeErrorNotification
-                 object:_captureSession];
-    [center addObserver:self
-               selector:@selector(handleCaptureSessionDidStartRunning:)
-                   name:AVCaptureSessionDidStartRunningNotification
-                 object:_captureSession];
-    [center addObserver:self
-               selector:@selector(handleCaptureSessionDidStopRunning:)
-                   name:AVCaptureSessionDidStopRunningNotification
-                 object:_captureSession];
-  }
-  return self;
-}
-
-- (void)dealloc {
-  RTC_DCHECK(!self.hasStarted);
-  [[NSNotificationCenter defaultCenter] removeObserver:self];
-  _capturer = nullptr;
-}
-
-- (AVCaptureSession *)captureSession {
-  return _captureSession;
-}
-
-- (AVCaptureDevice *)getActiveCaptureDevice {
-  return self.useBackCamera ? _backCameraInput.device : _frontCameraInput.device;
-}
-
-- (nullable AVCaptureDevice *)frontCaptureDevice {
-  return _frontCameraInput.device;
-}
-
-- (nullable AVCaptureDevice *)backCaptureDevice {
-  return _backCameraInput.device;
-}
-
-- (dispatch_queue_t)frameQueue {
-  if (!_frameQueue) {
-    _frameQueue =
-        dispatch_queue_create("org.webrtc.avfoundationvideocapturer.video", DISPATCH_QUEUE_SERIAL);
-    dispatch_set_target_queue(_frameQueue,
-                              dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0));
-  }
-  return _frameQueue;
-}
-
-// Called from any thread (likely main thread).
-- (BOOL)canUseBackCamera {
-  return _backCameraInput != nil;
-}
-
-// Called from any thread (likely main thread).
-- (BOOL)useBackCamera {
-  @synchronized(self) {
-    return _useBackCamera;
-  }
-}
-
-// Called from any thread (likely main thread).
-- (void)setUseBackCamera:(BOOL)useBackCamera {
-  if (!self.canUseBackCamera) {
-    if (useBackCamera) {
-      RTCLogWarning(@"No rear-facing camera exists or it cannot be used;"
-                     "not switching.");
-    }
-    return;
-  }
-  @synchronized(self) {
-    if (_useBackCamera == useBackCamera) {
-      return;
-    }
-    _useBackCamera = useBackCamera;
-    [self updateSessionInputForUseBackCamera:useBackCamera];
-  }
-}
-
-// Called from WebRTC thread.
-- (void)start {
-  if (self.hasStarted) {
-    return;
-  }
-  self.hasStarted = YES;
-  [RTCDispatcher
-      dispatchAsyncOnType:RTCDispatcherTypeCaptureSession
-                    block:^{
-                        [self updateOrientation];
-#if TARGET_OS_IPHONE
-                        [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
-#endif
-                        AVCaptureSession *captureSession = self.captureSession;
-                        [captureSession startRunning];
-                    }];
-}
-
-// Called from same thread as start.
-- (void)stop {
-  if (!self.hasStarted) {
-    return;
-  }
-  self.hasStarted = NO;
-  // Due to this async block, it's possible that the ObjC object outlives the
-  // C++ one. In order to not invoke functions on the C++ object, we set
-  // hasStarted immediately instead of dispatching it async.
-  [RTCDispatcher
-      dispatchAsyncOnType:RTCDispatcherTypeCaptureSession
-                    block:^{
-                        [_videoDataOutput setSampleBufferDelegate:nil queue:nullptr];
-                        [_captureSession stopRunning];
-#if TARGET_OS_IPHONE
-                        [[UIDevice currentDevice] endGeneratingDeviceOrientationNotifications];
-#endif
-                    }];
-}
-
-#pragma mark iOS notifications
-
-#if TARGET_OS_IPHONE
-- (void)deviceOrientationDidChange:(NSNotification *)notification {
-  [RTCDispatcher dispatchAsyncOnType:RTCDispatcherTypeCaptureSession
-                               block:^{
-                                   [self updateOrientation];
-                               }];
-}
-#endif
-
-#pragma mark AVCaptureVideoDataOutputSampleBufferDelegate
-
-- (void)captureOutput:(AVCaptureOutput *)captureOutput
-    didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer
-           fromConnection:(AVCaptureConnection *)connection {
-  NSParameterAssert(captureOutput == _videoDataOutput);
-  if (!self.hasStarted) {
-    return;
-  }
-
-#if TARGET_OS_IPHONE
-  // Default to portrait orientation on iPhone.
-  webrtc::VideoRotation rotation = webrtc::kVideoRotation_90;
-  BOOL usingFrontCamera = NO;
-  // Check the image's EXIF for the camera the image came from as the image could have been
-  // delayed as we set alwaysDiscardsLateVideoFrames to NO.
-  AVCaptureDevicePosition cameraPosition =
-      [AVCaptureSession devicePositionForSampleBuffer:sampleBuffer];
-  if (cameraPosition != AVCaptureDevicePositionUnspecified) {
-    usingFrontCamera = AVCaptureDevicePositionFront == cameraPosition;
-  } else {
-    AVCaptureDeviceInput *deviceInput =
-        (AVCaptureDeviceInput *)((AVCaptureInputPort *)connection.inputPorts.firstObject).input;
-    usingFrontCamera = AVCaptureDevicePositionFront == deviceInput.device.position;
-  }
-  switch (_orientation) {
-    case UIDeviceOrientationPortrait:
-      rotation = webrtc::kVideoRotation_90;
-      break;
-    case UIDeviceOrientationPortraitUpsideDown:
-      rotation = webrtc::kVideoRotation_270;
-      break;
-    case UIDeviceOrientationLandscapeLeft:
-      rotation = usingFrontCamera ? webrtc::kVideoRotation_180 : webrtc::kVideoRotation_0;
-      break;
-    case UIDeviceOrientationLandscapeRight:
-      rotation = usingFrontCamera ? webrtc::kVideoRotation_0 : webrtc::kVideoRotation_180;
-      break;
-    case UIDeviceOrientationFaceUp:
-    case UIDeviceOrientationFaceDown:
-    case UIDeviceOrientationUnknown:
-      // Ignore.
-      break;
-  }
-#else
-  // No rotation on Mac.
-  webrtc::VideoRotation rotation = webrtc::kVideoRotation_0;
-#endif
-
-  _capturer->CaptureSampleBuffer(sampleBuffer, rotation);
-}
-
-- (void)captureOutput:(AVCaptureOutput *)captureOutput
-    didDropSampleBuffer:(CMSampleBufferRef)sampleBuffer
-         fromConnection:(AVCaptureConnection *)connection {
-  RTCLogError(@"Dropped sample buffer.");
-}
-
-#pragma mark - AVCaptureSession notifications
-
-- (void)handleCaptureSessionInterruption:(NSNotification *)notification {
-  NSString *reasonString = nil;
-#if defined(__IPHONE_9_0) && defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && \
-    __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_9_0
-  if ([UIDevice isIOS9OrLater]) {
-    NSNumber *reason = notification.userInfo[AVCaptureSessionInterruptionReasonKey];
-    if (reason) {
-      switch (reason.intValue) {
-        case AVCaptureSessionInterruptionReasonVideoDeviceNotAvailableInBackground:
-          reasonString = @"VideoDeviceNotAvailableInBackground";
-          break;
-        case AVCaptureSessionInterruptionReasonAudioDeviceInUseByAnotherClient:
-          reasonString = @"AudioDeviceInUseByAnotherClient";
-          break;
-        case AVCaptureSessionInterruptionReasonVideoDeviceInUseByAnotherClient:
-          reasonString = @"VideoDeviceInUseByAnotherClient";
-          break;
-        case AVCaptureSessionInterruptionReasonVideoDeviceNotAvailableWithMultipleForegroundApps:
-          reasonString = @"VideoDeviceNotAvailableWithMultipleForegroundApps";
-          break;
-      }
-    }
-  }
-#endif
-  RTCLog(@"Capture session interrupted: %@", reasonString);
-  // TODO(tkchin): Handle this case.
-}
-
-- (void)handleCaptureSessionInterruptionEnded:(NSNotification *)notification {
-  RTCLog(@"Capture session interruption ended.");
-  // TODO(tkchin): Handle this case.
-}
-
-- (void)handleCaptureSessionRuntimeError:(NSNotification *)notification {
-  NSError *error = [notification.userInfo objectForKey:AVCaptureSessionErrorKey];
-  RTCLogError(@"Capture session runtime error: %@", error);
-
-  [RTCDispatcher dispatchAsyncOnType:RTCDispatcherTypeCaptureSession
-                               block:^{
-#if TARGET_OS_IPHONE
-                                   if (error.code == AVErrorMediaServicesWereReset) {
-                                     [self handleNonFatalError];
-                                   } else {
-                                     [self handleFatalError];
-                                   }
-#else
-                                   [self handleFatalError];
-#endif
-                               }];
-}
-
-- (void)handleCaptureSessionDidStartRunning:(NSNotification *)notification {
-  RTCLog(@"Capture session started.");
-
-  self.isRunning = YES;
-  [RTCDispatcher dispatchAsyncOnType:RTCDispatcherTypeCaptureSession
-                               block:^{
-                                   // If we successfully restarted after an unknown error,
-                                   // allow future retries on fatal errors.
-                                   _hasRetriedOnFatalError = NO;
-                               }];
-}
-
-- (void)handleCaptureSessionDidStopRunning:(NSNotification *)notification {
-  RTCLog(@"Capture session stopped.");
-  self.isRunning = NO;
-}
-
-- (void)handleFatalError {
-  [RTCDispatcher
-      dispatchAsyncOnType:RTCDispatcherTypeCaptureSession
-                    block:^{
-                        if (!_hasRetriedOnFatalError) {
-                          RTCLogWarning(@"Attempting to recover from fatal capture error.");
-                          [self handleNonFatalError];
-                          _hasRetriedOnFatalError = YES;
-                        } else {
-                          RTCLogError(@"Previous fatal error recovery failed.");
-                        }
-                    }];
-}
-
-- (void)handleNonFatalError {
-  [RTCDispatcher dispatchAsyncOnType:RTCDispatcherTypeCaptureSession
-                               block:^{
-                                   if (self.hasStarted) {
-                                     RTCLog(@"Restarting capture session after error.");
-                                     [self.captureSession startRunning];
-                                   }
-                               }];
-}
-
-#if TARGET_OS_IPHONE
-
-#pragma mark - UIApplication notifications
-
-- (void)handleApplicationDidBecomeActive:(NSNotification *)notification {
-  [RTCDispatcher dispatchAsyncOnType:RTCDispatcherTypeCaptureSession
-                               block:^{
-                                   if (self.hasStarted && !self.captureSession.isRunning) {
-                                     RTCLog(@"Restarting capture session on active.");
-                                     [self.captureSession startRunning];
-                                   }
-                               }];
-}
-
-#endif  // TARGET_OS_IPHONE
-
-#pragma mark - Private
-
-- (BOOL)setupCaptureSession {
-  AVCaptureSession *captureSession = [[AVCaptureSession alloc] init];
-#if defined(WEBRTC_IOS)
-  captureSession.usesApplicationAudioSession = NO;
-#endif
-  // Add the output.
-  AVCaptureVideoDataOutput *videoDataOutput = [self videoDataOutput];
-  if (![captureSession canAddOutput:videoDataOutput]) {
-    RTCLogError(@"Video data output unsupported.");
-    return NO;
-  }
-  [captureSession addOutput:videoDataOutput];
-
-  // Get the front and back cameras. If there isn't a front camera
-  // give up.
-  AVCaptureDeviceInput *frontCameraInput = [self frontCameraInput];
-  AVCaptureDeviceInput *backCameraInput = [self backCameraInput];
-  if (!frontCameraInput) {
-    RTCLogError(@"No front camera for capture session.");
-    return NO;
-  }
-
-  // Add the inputs.
-  if (![captureSession canAddInput:frontCameraInput] ||
-      (backCameraInput && ![captureSession canAddInput:backCameraInput])) {
-    RTCLogError(@"Session does not support capture inputs.");
-    return NO;
-  }
-  AVCaptureDeviceInput *input = self.useBackCamera ? backCameraInput : frontCameraInput;
-  [captureSession addInput:input];
-
-  _captureSession = captureSession;
-  return YES;
-}
-
-- (AVCaptureVideoDataOutput *)videoDataOutput {
-  if (!_videoDataOutput) {
-    // Make the capturer output NV12. Ideally we want I420 but that's not
-    // currently supported on iPhone / iPad.
-    AVCaptureVideoDataOutput *videoDataOutput = [[AVCaptureVideoDataOutput alloc] init];
-    videoDataOutput.videoSettings = @{
-      (NSString *)
-      // TODO(denicija): Remove this color conversion and use the original capture format directly.
-      kCVPixelBufferPixelFormatTypeKey : @(kCVPixelFormatType_420YpCbCr8BiPlanarFullRange)
-    };
-    videoDataOutput.alwaysDiscardsLateVideoFrames = NO;
-    [videoDataOutput setSampleBufferDelegate:self queue:self.frameQueue];
-    _videoDataOutput = videoDataOutput;
-  }
-  return _videoDataOutput;
-}
-
-- (AVCaptureDevice *)videoCaptureDeviceForPosition:(AVCaptureDevicePosition)position {
-  for (AVCaptureDevice *captureDevice in [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo]) {
-    if (captureDevice.position == position) {
-      return captureDevice;
-    }
-  }
-  return nil;
-}
-
-- (AVCaptureDeviceInput *)frontCameraInput {
-  if (!_frontCameraInput) {
-#if TARGET_OS_IPHONE
-    AVCaptureDevice *frontCameraDevice =
-        [self videoCaptureDeviceForPosition:AVCaptureDevicePositionFront];
-#else
-    AVCaptureDevice *frontCameraDevice =
-        [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
-#endif
-    if (!frontCameraDevice) {
-      RTCLogWarning(@"Failed to find front capture device.");
-      return nil;
-    }
-    NSError *error = nil;
-    AVCaptureDeviceInput *frontCameraInput =
-        [AVCaptureDeviceInput deviceInputWithDevice:frontCameraDevice error:&error];
-    if (!frontCameraInput) {
-      RTCLogError(@"Failed to create front camera input: %@", error.localizedDescription);
-      return nil;
-    }
-    _frontCameraInput = frontCameraInput;
-  }
-  return _frontCameraInput;
-}
-
-- (AVCaptureDeviceInput *)backCameraInput {
-  if (!_backCameraInput) {
-    AVCaptureDevice *backCameraDevice =
-        [self videoCaptureDeviceForPosition:AVCaptureDevicePositionBack];
-    if (!backCameraDevice) {
-      RTCLogWarning(@"Failed to find front capture device.");
-      return nil;
-    }
-    NSError *error = nil;
-    AVCaptureDeviceInput *backCameraInput =
-        [AVCaptureDeviceInput deviceInputWithDevice:backCameraDevice error:&error];
-    if (!backCameraInput) {
-      RTCLogError(@"Failed to create front camera input: %@", error.localizedDescription);
-      return nil;
-    }
-    _backCameraInput = backCameraInput;
-  }
-  return _backCameraInput;
-}
-
-// Called from capture session queue.
-- (void)updateOrientation {
-#if TARGET_OS_IPHONE
-  _orientation = [UIDevice currentDevice].orientation;
-#endif
-}
-
-// Update the current session input to match what's stored in _useBackCamera.
-- (void)updateSessionInputForUseBackCamera:(BOOL)useBackCamera {
-  [RTCDispatcher
-      dispatchAsyncOnType:RTCDispatcherTypeCaptureSession
-                    block:^{
-                      [_captureSession beginConfiguration];
-                      AVCaptureDeviceInput *oldInput = _backCameraInput;
-                      AVCaptureDeviceInput *newInput = _frontCameraInput;
-                      if (useBackCamera) {
-                        oldInput = _frontCameraInput;
-                        newInput = _backCameraInput;
-                      }
-                      if (oldInput) {
-                        // Ok to remove this even if it's not attached. Will be no-op.
-                        [_captureSession removeInput:oldInput];
-                      }
-                      if (newInput) {
-                        [_captureSession addInput:newInput];
-                      }
-                      [self updateOrientation];
-                      AVCaptureDevice *newDevice = newInput.device;
-                      const cricket::VideoFormat *format = _capturer->GetCaptureFormat();
-                      webrtc::SetFormatForCaptureDevice(newDevice, _captureSession, *format);
-                      [_captureSession commitConfiguration];
-                    }];
-}
-
-@end
diff --git a/sdk/objc/Framework/Classes/Video/RTCCVPixelBuffer.mm b/sdk/objc/Framework/Classes/Video/RTCCVPixelBuffer.mm
deleted file mode 100644
index 7d3669f..0000000
--- a/sdk/objc/Framework/Classes/Video/RTCCVPixelBuffer.mm
+++ /dev/null
@@ -1,188 +0,0 @@
-/*
- *  Copyright 2017 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.
- */
-
-#import "WebRTC/RTCVideoFrameBuffer.h"
-
-#include "webrtc/common_video/libyuv/include/webrtc_libyuv.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-
-@implementation RTCCVPixelBuffer {
-  int _width;
-  int _height;
-  int _bufferWidth;
-  int _bufferHeight;
-  int _cropWidth;
-  int _cropHeight;
-}
-
-@synthesize pixelBuffer = _pixelBuffer;
-@synthesize cropX = _cropX;
-@synthesize cropY = _cropY;
-
-- (instancetype)initWithPixelBuffer:(CVPixelBufferRef)pixelBuffer {
-  return [self initWithPixelBuffer:pixelBuffer
-                      adaptedWidth:CVPixelBufferGetWidth(pixelBuffer)
-                     adaptedHeight:CVPixelBufferGetHeight(pixelBuffer)
-                         cropWidth:CVPixelBufferGetWidth(pixelBuffer)
-                        cropHeight:CVPixelBufferGetHeight(pixelBuffer)
-                             cropX:0
-                             cropY:0];
-}
-
-- (instancetype)initWithPixelBuffer:(CVPixelBufferRef)pixelBuffer
-                       adaptedWidth:(int)adaptedWidth
-                      adaptedHeight:(int)adaptedHeight
-                          cropWidth:(int)cropWidth
-                         cropHeight:(int)cropHeight
-                              cropX:(int)cropX
-                              cropY:(int)cropY {
-  if (self = [super init]) {
-    _width = adaptedWidth;
-    _height = adaptedHeight;
-    _pixelBuffer = pixelBuffer;
-    _bufferWidth = CVPixelBufferGetWidth(_pixelBuffer);
-    _bufferHeight = CVPixelBufferGetHeight(_pixelBuffer);
-    _cropWidth = cropWidth;
-    _cropHeight = cropHeight;
-    // Can only crop at even pixels.
-    _cropX = cropX & ~1;
-    _cropY = cropY & ~1;
-    CVBufferRetain(_pixelBuffer);
-  }
-
-  return self;
-}
-
-- (void)dealloc {
-  CVBufferRelease(_pixelBuffer);
-}
-
-- (int)width {
-  return _width;
-}
-
-- (int)height {
-  return _height;
-}
-
-- (BOOL)requiresCropping {
-  return _cropWidth != _bufferWidth || _cropHeight != _bufferHeight;
-}
-
-- (BOOL)requiresScalingToWidth:(int)width height:(int)height {
-  return _cropWidth != width || _cropHeight != height;
-}
-
-- (int)bufferSizeForCroppingAndScalingToWidth:(int)width height:(int)height {
-  int srcChromaWidth = (_cropWidth + 1) / 2;
-  int srcChromaHeight = (_cropHeight + 1) / 2;
-  int dstChromaWidth = (width + 1) / 2;
-  int dstChromaHeight = (height + 1) / 2;
-
-  return srcChromaWidth * srcChromaHeight * 2 + dstChromaWidth * dstChromaHeight * 2;
-}
-
-- (BOOL)cropAndScaleTo:(CVPixelBufferRef)outputPixelBuffer withTempBuffer:(uint8_t*)tmpBuffer {
-  // Prepare output pointers.
-  RTC_DCHECK_EQ(CVPixelBufferGetPixelFormatType(outputPixelBuffer),
-                kCVPixelFormatType_420YpCbCr8BiPlanarFullRange);
-  CVReturn cvRet = CVPixelBufferLockBaseAddress(outputPixelBuffer, 0);
-  if (cvRet != kCVReturnSuccess) {
-    LOG(LS_ERROR) << "Failed to lock base address: " << cvRet;
-    return NO;
-  }
-  const int dstWidth = CVPixelBufferGetWidth(outputPixelBuffer);
-  const int dstHeight = CVPixelBufferGetHeight(outputPixelBuffer);
-  uint8_t* dstY =
-      reinterpret_cast<uint8_t*>(CVPixelBufferGetBaseAddressOfPlane(outputPixelBuffer, 0));
-  const int dstYStride = CVPixelBufferGetBytesPerRowOfPlane(outputPixelBuffer, 0);
-  uint8_t* dstUV =
-      reinterpret_cast<uint8_t*>(CVPixelBufferGetBaseAddressOfPlane(outputPixelBuffer, 1));
-  const int dstUVStride = CVPixelBufferGetBytesPerRowOfPlane(outputPixelBuffer, 1);
-
-  // Prepare source pointers.
-  const OSType srcPixelFormat = CVPixelBufferGetPixelFormatType(_pixelBuffer);
-  RTC_DCHECK(srcPixelFormat == kCVPixelFormatType_420YpCbCr8BiPlanarFullRange ||
-             srcPixelFormat == kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange);
-  CVPixelBufferLockBaseAddress(_pixelBuffer, kCVPixelBufferLock_ReadOnly);
-  const uint8_t* srcY =
-      static_cast<const uint8_t*>(CVPixelBufferGetBaseAddressOfPlane(_pixelBuffer, 0));
-  const int srcYStride = CVPixelBufferGetBytesPerRowOfPlane(_pixelBuffer, 0);
-  const uint8_t* srcUV =
-      static_cast<const uint8_t*>(CVPixelBufferGetBaseAddressOfPlane(_pixelBuffer, 1));
-  const int srcUVStride = CVPixelBufferGetBytesPerRowOfPlane(_pixelBuffer, 1);
-
-  // Crop just by modifying pointers.
-  srcY += srcYStride * _cropY + _cropX;
-  srcUV += srcUVStride * (_cropY / 2) + _cropX;
-
-  webrtc::NV12Scale(tmpBuffer,
-                    srcY,
-                    srcYStride,
-                    srcUV,
-                    srcUVStride,
-                    _cropWidth,
-                    _cropHeight,
-                    dstY,
-                    dstYStride,
-                    dstUV,
-                    dstUVStride,
-                    dstWidth,
-                    dstHeight);
-
-  CVPixelBufferUnlockBaseAddress(_pixelBuffer, kCVPixelBufferLock_ReadOnly);
-  CVPixelBufferUnlockBaseAddress(outputPixelBuffer, 0);
-
-  return YES;
-}
-
-- (id<RTCI420Buffer>)toI420 {
-  const OSType pixelFormat = CVPixelBufferGetPixelFormatType(_pixelBuffer);
-  RTC_DCHECK(pixelFormat == kCVPixelFormatType_420YpCbCr8BiPlanarFullRange ||
-             pixelFormat == kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange);
-
-  CVPixelBufferLockBaseAddress(_pixelBuffer, kCVPixelBufferLock_ReadOnly);
-  const uint8_t* srcY =
-      static_cast<const uint8_t*>(CVPixelBufferGetBaseAddressOfPlane(_pixelBuffer, 0));
-  const int srcYStride = CVPixelBufferGetBytesPerRowOfPlane(_pixelBuffer, 0);
-  const uint8_t* srcUV =
-      static_cast<const uint8_t*>(CVPixelBufferGetBaseAddressOfPlane(_pixelBuffer, 1));
-  const int srcUVStride = CVPixelBufferGetBytesPerRowOfPlane(_pixelBuffer, 1);
-
-  // Crop just by modifying pointers.
-  srcY += srcYStride * _cropY + _cropX;
-  srcUV += srcUVStride * (_cropY / 2) + _cropX;
-
-  // TODO(magjed): Use a frame buffer pool.
-  webrtc::NV12ToI420Scaler nv12ToI420Scaler;
-  RTCMutableI420Buffer* i420Buffer =
-      [[RTCMutableI420Buffer alloc] initWithWidth:[self width] height:[self height]];
-  nv12ToI420Scaler.NV12ToI420Scale(srcY,
-                                   srcYStride,
-                                   srcUV,
-                                   srcUVStride,
-                                   _cropWidth,
-                                   _cropHeight,
-                                   i420Buffer.mutableDataY,
-                                   i420Buffer.strideY,
-                                   i420Buffer.mutableDataU,
-                                   i420Buffer.strideU,
-                                   i420Buffer.mutableDataV,
-                                   i420Buffer.strideV,
-                                   i420Buffer.width,
-                                   i420Buffer.height);
-
-  CVPixelBufferUnlockBaseAddress(_pixelBuffer, kCVPixelBufferLock_ReadOnly);
-
-  return i420Buffer;
-}
-
-@end
diff --git a/sdk/objc/Framework/Classes/Video/RTCDefaultShader.h b/sdk/objc/Framework/Classes/Video/RTCDefaultShader.h
deleted file mode 100644
index ed5125e..0000000
--- a/sdk/objc/Framework/Classes/Video/RTCDefaultShader.h
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- *  Copyright 2017 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.
- */
-
-#import "WebRTC/RTCVideoViewShading.h"
-
-NS_ASSUME_NONNULL_BEGIN
-
-/** Default RTCVideoViewShading that will be used in RTCNSGLVideoView and
- *  RTCEAGLVideoView if no external shader is specified. This shader will render
- *  the video in a rectangle without any color or geometric transformations.
- */
-@interface RTCDefaultShader : NSObject<RTCVideoViewShading>
-
-@end
-
-NS_ASSUME_NONNULL_END
diff --git a/sdk/objc/Framework/Classes/Video/RTCDefaultShader.mm b/sdk/objc/Framework/Classes/Video/RTCDefaultShader.mm
deleted file mode 100644
index 14301ba..0000000
--- a/sdk/objc/Framework/Classes/Video/RTCDefaultShader.mm
+++ /dev/null
@@ -1,207 +0,0 @@
-/*
- *  Copyright 2017 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.
- */
-
-#import "RTCDefaultShader.h"
-
-#if TARGET_OS_IPHONE
-#import <OpenGLES/ES3/gl.h>
-#else
-#import <OpenGL/gl3.h>
-#endif
-
-#import "RTCOpenGLDefines.h"
-#import "RTCShader.h"
-#import "WebRTC/RTCLogging.h"
-
-#include "webrtc/api/optional.h"
-
-static const int kYTextureUnit = 0;
-static const int kUTextureUnit = 1;
-static const int kVTextureUnit = 2;
-static const int kUvTextureUnit = 1;
-
-// Fragment shader converts YUV values from input textures into a final RGB
-// pixel. The conversion formula is from http://www.fourcc.org/fccyvrgb.php.
-static const char kI420FragmentShaderSource[] =
-  SHADER_VERSION
-  "precision highp float;"
-  FRAGMENT_SHADER_IN " vec2 v_texcoord;\n"
-  "uniform lowp sampler2D s_textureY;\n"
-  "uniform lowp sampler2D s_textureU;\n"
-  "uniform lowp sampler2D s_textureV;\n"
-  FRAGMENT_SHADER_OUT
-  "void main() {\n"
-  "    float y, u, v, r, g, b;\n"
-  "    y = " FRAGMENT_SHADER_TEXTURE "(s_textureY, v_texcoord).r;\n"
-  "    u = " FRAGMENT_SHADER_TEXTURE "(s_textureU, v_texcoord).r;\n"
-  "    v = " FRAGMENT_SHADER_TEXTURE "(s_textureV, v_texcoord).r;\n"
-  "    u = u - 0.5;\n"
-  "    v = v - 0.5;\n"
-  "    r = y + 1.403 * v;\n"
-  "    g = y - 0.344 * u - 0.714 * v;\n"
-  "    b = y + 1.770 * u;\n"
-  "    " FRAGMENT_SHADER_COLOR " = vec4(r, g, b, 1.0);\n"
-  "  }\n";
-
-static const char kNV12FragmentShaderSource[] =
-  SHADER_VERSION
-  "precision mediump float;"
-  FRAGMENT_SHADER_IN " vec2 v_texcoord;\n"
-  "uniform lowp sampler2D s_textureY;\n"
-  "uniform lowp sampler2D s_textureUV;\n"
-  FRAGMENT_SHADER_OUT
-  "void main() {\n"
-  "    mediump float y;\n"
-  "    mediump vec2 uv;\n"
-  "    y = " FRAGMENT_SHADER_TEXTURE "(s_textureY, v_texcoord).r;\n"
-  "    uv = " FRAGMENT_SHADER_TEXTURE "(s_textureUV, v_texcoord).ra -\n"
-  "        vec2(0.5, 0.5);\n"
-  "    " FRAGMENT_SHADER_COLOR " = vec4(y + 1.403 * uv.y,\n"
-  "                                     y - 0.344 * uv.x - 0.714 * uv.y,\n"
-  "                                     y + 1.770 * uv.x,\n"
-  "                                     1.0);\n"
-  "  }\n";
-
-@implementation RTCDefaultShader {
-  GLuint _vertexBuffer;
-  GLuint _vertexArray;
-  // Store current rotation and only upload new vertex data when rotation changes.
-  rtc::Optional<RTCVideoRotation> _currentRotation;
-
-  GLuint _i420Program;
-  GLuint _nv12Program;
-}
-
-- (void)dealloc {
-  glDeleteProgram(_i420Program);
-  glDeleteProgram(_nv12Program);
-  glDeleteBuffers(1, &_vertexBuffer);
-  glDeleteVertexArrays(1, &_vertexArray);
-}
-
-- (BOOL)createAndSetupI420Program {
-  NSAssert(!_i420Program, @"I420 program already created");
-  _i420Program = RTCCreateProgramFromFragmentSource(kI420FragmentShaderSource);
-  if (!_i420Program) {
-    return NO;
-  }
-  GLint ySampler = glGetUniformLocation(_i420Program, "s_textureY");
-  GLint uSampler = glGetUniformLocation(_i420Program, "s_textureU");
-  GLint vSampler = glGetUniformLocation(_i420Program, "s_textureV");
-
-  if (ySampler < 0 || uSampler < 0 || vSampler < 0) {
-    RTCLog(@"Failed to get uniform variable locations in I420 shader");
-    glDeleteProgram(_i420Program);
-    _i420Program = 0;
-    return NO;
-  }
-
-  glUseProgram(_i420Program);
-  glUniform1i(ySampler, kYTextureUnit);
-  glUniform1i(uSampler, kUTextureUnit);
-  glUniform1i(vSampler, kVTextureUnit);
-
-  return YES;
-}
-
-- (BOOL)createAndSetupNV12Program {
-  NSAssert(!_nv12Program, @"NV12 program already created");
-  _nv12Program = RTCCreateProgramFromFragmentSource(kNV12FragmentShaderSource);
-  if (!_nv12Program) {
-    return NO;
-  }
-  GLint ySampler = glGetUniformLocation(_nv12Program, "s_textureY");
-  GLint uvSampler = glGetUniformLocation(_nv12Program, "s_textureUV");
-
-  if (ySampler < 0 || uvSampler < 0) {
-    RTCLog(@"Failed to get uniform variable locations in NV12 shader");
-    glDeleteProgram(_nv12Program);
-    _nv12Program = 0;
-    return NO;
-  }
-
-  glUseProgram(_nv12Program);
-  glUniform1i(ySampler, kYTextureUnit);
-  glUniform1i(uvSampler, kUvTextureUnit);
-
-  return YES;
-}
-
-- (BOOL)prepareVertexBufferWithRotation:(RTCVideoRotation)rotation {
-  if (!_vertexBuffer && !RTCCreateVertexBuffer(&_vertexBuffer, &_vertexArray)) {
-    RTCLog(@"Failed to setup vertex buffer");
-    return NO;
-  }
-#if !TARGET_OS_IPHONE
-  glBindVertexArray(_vertexArray);
-#endif
-  glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer);
-  if (!_currentRotation || rotation != *_currentRotation) {
-    _currentRotation = rtc::Optional<RTCVideoRotation>(rotation);
-    RTCSetVertexData(*_currentRotation);
-  }
-  return YES;
-}
-
-- (void)applyShadingForFrameWithWidth:(int)width
-                               height:(int)height
-                             rotation:(RTCVideoRotation)rotation
-                               yPlane:(GLuint)yPlane
-                               uPlane:(GLuint)uPlane
-                               vPlane:(GLuint)vPlane {
-  if (![self prepareVertexBufferWithRotation:rotation]) {
-    return;
-  }
-
-  if (!_i420Program && ![self createAndSetupI420Program]) {
-    RTCLog(@"Failed to setup I420 program");
-    return;
-  }
-
-  glUseProgram(_i420Program);
-
-  glActiveTexture(static_cast<GLenum>(GL_TEXTURE0 + kYTextureUnit));
-  glBindTexture(GL_TEXTURE_2D, yPlane);
-
-  glActiveTexture(static_cast<GLenum>(GL_TEXTURE0 + kUTextureUnit));
-  glBindTexture(GL_TEXTURE_2D, uPlane);
-
-  glActiveTexture(static_cast<GLenum>(GL_TEXTURE0 + kVTextureUnit));
-  glBindTexture(GL_TEXTURE_2D, vPlane);
-
-  glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
-}
-
-- (void)applyShadingForFrameWithWidth:(int)width
-                               height:(int)height
-                             rotation:(RTCVideoRotation)rotation
-                               yPlane:(GLuint)yPlane
-                              uvPlane:(GLuint)uvPlane {
-  if (![self prepareVertexBufferWithRotation:rotation]) {
-    return;
-  }
-
-  if (!_nv12Program && ![self createAndSetupNV12Program]) {
-    RTCLog(@"Failed to setup NV12 shader");
-    return;
-  }
-
-  glUseProgram(_nv12Program);
-
-  glActiveTexture(static_cast<GLenum>(GL_TEXTURE0 + kYTextureUnit));
-  glBindTexture(GL_TEXTURE_2D, yPlane);
-
-  glActiveTexture(static_cast<GLenum>(GL_TEXTURE0 + kUvTextureUnit));
-  glBindTexture(GL_TEXTURE_2D, uvPlane);
-
-  glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
-}
-
-@end
diff --git a/sdk/objc/Framework/Classes/Video/RTCI420Buffer+Private.h b/sdk/objc/Framework/Classes/Video/RTCI420Buffer+Private.h
deleted file mode 100644
index 7883c41..0000000
--- a/sdk/objc/Framework/Classes/Video/RTCI420Buffer+Private.h
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- *  Copyright 2017 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.
- */
-
-#import "WebRTC/RTCVideoFrameBuffer.h"
-
-#include "webrtc/api/video/i420_buffer.h"
-
-NS_ASSUME_NONNULL_BEGIN
-
-@interface RTCI420Buffer ()
-
-/** Initialize an RTCI420Buffer with its backing I420BufferInterface. */
-- (instancetype)initWithFrameBuffer:(rtc::scoped_refptr<webrtc::I420BufferInterface>)i420Buffer;
-
-@end
-
-NS_ASSUME_NONNULL_END
diff --git a/sdk/objc/Framework/Classes/Video/RTCI420Buffer.mm b/sdk/objc/Framework/Classes/Video/RTCI420Buffer.mm
deleted file mode 100644
index 042fcc0..0000000
--- a/sdk/objc/Framework/Classes/Video/RTCI420Buffer.mm
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- *  Copyright 2017 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.
- */
-
-#import "WebRTC/RTCVideoFrameBuffer.h"
-
-#include "webrtc/api/video/i420_buffer.h"
-
-@implementation RTCI420Buffer {
- @protected
-  rtc::scoped_refptr<webrtc::I420BufferInterface> _i420Buffer;
-}
-
-- (instancetype)initWithWidth:(int)width height:(int)height {
-  if (self = [super init]) {
-    _i420Buffer = webrtc::I420Buffer::Create(width, height);
-  }
-
-  return self;
-}
-
-- (instancetype)initWithWidth:(int)width
-                       height:(int)height
-                      strideY:(int)strideY
-                      strideU:(int)strideU
-                      strideV:(int)strideV {
-  if (self = [super init]) {
-    _i420Buffer = webrtc::I420Buffer::Create(width, height, strideY, strideU, strideV);
-  }
-
-  return self;
-}
-
-- (instancetype)initWithFrameBuffer:(rtc::scoped_refptr<webrtc::I420BufferInterface>)i420Buffer {
-  if (self = [super init]) {
-    _i420Buffer = i420Buffer;
-  }
-
-  return self;
-}
-
-- (int)width {
-  return _i420Buffer->width();
-}
-
-- (int)height {
-  return _i420Buffer->height();
-}
-
-- (int)strideY {
-  return _i420Buffer->StrideY();
-}
-
-- (int)strideU {
-  return _i420Buffer->StrideU();
-}
-
-- (int)strideV {
-  return _i420Buffer->StrideV();
-}
-
-- (int)chromaWidth {
-  return _i420Buffer->ChromaWidth();
-}
-
-- (int)chromaHeight {
-  return _i420Buffer->ChromaHeight();
-}
-
-- (const uint8_t *)dataY {
-  return _i420Buffer->DataY();
-}
-
-- (const uint8_t *)dataU {
-  return _i420Buffer->DataU();
-}
-
-- (const uint8_t *)dataV {
-  return _i420Buffer->DataV();
-}
-
-- (id<RTCI420Buffer>)toI420 {
-  return self;
-}
-
-@end
-
-@implementation RTCMutableI420Buffer
-
-- (uint8_t *)mutableDataY {
-  return static_cast<webrtc::I420Buffer *>(_i420Buffer.get())->MutableDataY();
-}
-
-- (uint8_t *)mutableDataU {
-  return static_cast<webrtc::I420Buffer *>(_i420Buffer.get())->MutableDataU();
-}
-
-- (uint8_t *)mutableDataV {
-  return static_cast<webrtc::I420Buffer *>(_i420Buffer.get())->MutableDataV();
-}
-
-@end
diff --git a/sdk/objc/Framework/Classes/Video/RTCI420TextureCache.h b/sdk/objc/Framework/Classes/Video/RTCI420TextureCache.h
deleted file mode 100644
index 19f1bc9..0000000
--- a/sdk/objc/Framework/Classes/Video/RTCI420TextureCache.h
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- *  Copyright 2017 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.
- */
-
-#import "RTCOpenGLDefines.h"
-#import "WebRTC/RTCVideoFrame.h"
-
-@interface RTCI420TextureCache : NSObject
-
-@property(nonatomic, readonly) GLuint yTexture;
-@property(nonatomic, readonly) GLuint uTexture;
-@property(nonatomic, readonly) GLuint vTexture;
-
-- (instancetype)init NS_UNAVAILABLE;
-- (instancetype)initWithContext:(GlContextType *)context NS_DESIGNATED_INITIALIZER;
-
-- (void)uploadFrameToTextures:(RTCVideoFrame *)frame;
-
-@end
diff --git a/sdk/objc/Framework/Classes/Video/RTCI420TextureCache.mm b/sdk/objc/Framework/Classes/Video/RTCI420TextureCache.mm
deleted file mode 100644
index b603130..0000000
--- a/sdk/objc/Framework/Classes/Video/RTCI420TextureCache.mm
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
- *  Copyright 2017 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.
- */
-
-#import "RTCI420TextureCache.h"
-#import "WebRTC/RTCVideoFrameBuffer.h"
-
-#if TARGET_OS_IPHONE
-#import <OpenGLES/ES3/gl.h>
-#else
-#import <OpenGL/gl3.h>
-#endif
-
-#include <vector>
-
-// Two sets of 3 textures are used here, one for each of the Y, U and V planes. Having two sets
-// alleviates CPU blockage in the event that the GPU is asked to render to a texture that is already
-// in use.
-static const GLsizei kNumTextureSets = 2;
-static const GLsizei kNumTexturesPerSet = 3;
-static const GLsizei kNumTextures = kNumTexturesPerSet * kNumTextureSets;
-
-@implementation RTCI420TextureCache {
-  BOOL _hasUnpackRowLength;
-  GLint _currentTextureSet;
-  // Handles for OpenGL constructs.
-  GLuint _textures[kNumTextures];
-  // Used to create a non-padded plane for GPU upload when we receive padded frames.
-  std::vector<uint8_t> _planeBuffer;
-}
-
-- (GLuint)yTexture {
-  return _textures[_currentTextureSet * kNumTexturesPerSet];
-}
-
-- (GLuint)uTexture {
-  return _textures[_currentTextureSet * kNumTexturesPerSet + 1];
-}
-
-- (GLuint)vTexture {
-  return _textures[_currentTextureSet * kNumTexturesPerSet + 2];
-}
-
-- (instancetype)initWithContext:(GlContextType *)context {
-  if (self = [super init]) {
-#if TARGET_OS_IPHONE
-    _hasUnpackRowLength = (context.API == kEAGLRenderingAPIOpenGLES3);
-#else
-    _hasUnpackRowLength = YES;
-#endif
-    glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
-
-    [self setupTextures];
-  }
-  return self;
-}
-
-- (void)dealloc {
-  glDeleteTextures(kNumTextures, _textures);
-}
-
-- (void)setupTextures {
-  glGenTextures(kNumTextures, _textures);
-  // Set parameters for each of the textures we created.
-  for (GLsizei i = 0; i < kNumTextures; i++) {
-    glBindTexture(GL_TEXTURE_2D, _textures[i]);
-    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
-    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
-    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
-    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
-  }
-}
-
-- (void)uploadPlane:(const uint8_t *)plane
-            texture:(GLuint)texture
-              width:(size_t)width
-             height:(size_t)height
-             stride:(int32_t)stride {
-  glBindTexture(GL_TEXTURE_2D, texture);
-
-  const uint8_t *uploadPlane = plane;
-  if ((size_t)stride != width) {
-   if (_hasUnpackRowLength) {
-      // GLES3 allows us to specify stride.
-      glPixelStorei(GL_UNPACK_ROW_LENGTH, stride);
-      glTexImage2D(GL_TEXTURE_2D,
-                   0,
-                   RTC_PIXEL_FORMAT,
-                   static_cast<GLsizei>(width),
-                   static_cast<GLsizei>(height),
-                   0,
-                   RTC_PIXEL_FORMAT,
-                   GL_UNSIGNED_BYTE,
-                   uploadPlane);
-      glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
-      return;
-    } else {
-      // Make an unpadded copy and upload that instead. Quick profiling showed
-      // that this is faster than uploading row by row using glTexSubImage2D.
-      uint8_t *unpaddedPlane = _planeBuffer.data();
-      for (size_t y = 0; y < height; ++y) {
-        memcpy(unpaddedPlane + y * width, plane + y * stride, width);
-      }
-      uploadPlane = unpaddedPlane;
-    }
-  }
-  glTexImage2D(GL_TEXTURE_2D,
-               0,
-               RTC_PIXEL_FORMAT,
-               static_cast<GLsizei>(width),
-               static_cast<GLsizei>(height),
-               0,
-               RTC_PIXEL_FORMAT,
-               GL_UNSIGNED_BYTE,
-               uploadPlane);
-}
-
-- (void)uploadFrameToTextures:(RTCVideoFrame *)frame {
-  _currentTextureSet = (_currentTextureSet + 1) % kNumTextureSets;
-
-  id<RTCI420Buffer> buffer = [frame.buffer toI420];
-
-  const int chromaWidth = buffer.chromaWidth;
-  const int chromaHeight = buffer.chromaHeight;
-  if (buffer.strideY != frame.width || buffer.strideU != chromaWidth ||
-      buffer.strideV != chromaWidth) {
-    _planeBuffer.resize(buffer.width * buffer.height);
-  }
-
-  [self uploadPlane:buffer.dataY
-            texture:self.yTexture
-              width:buffer.width
-             height:buffer.height
-             stride:buffer.strideY];
-
-  [self uploadPlane:buffer.dataU
-            texture:self.uTexture
-              width:chromaWidth
-             height:chromaHeight
-             stride:buffer.strideU];
-
-  [self uploadPlane:buffer.dataV
-            texture:self.vTexture
-              width:chromaWidth
-             height:chromaHeight
-             stride:buffer.strideV];
-}
-
-@end
diff --git a/sdk/objc/Framework/Classes/Video/RTCNV12TextureCache.h b/sdk/objc/Framework/Classes/Video/RTCNV12TextureCache.h
deleted file mode 100644
index 9cba823..0000000
--- a/sdk/objc/Framework/Classes/Video/RTCNV12TextureCache.h
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- *  Copyright 2017 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.
- */
-
-#import <GLKit/GLKit.h>
-
-@class RTCVideoFrame;
-
-NS_ASSUME_NONNULL_BEGIN
-
-@interface RTCNV12TextureCache : NSObject
-
-@property(nonatomic, readonly) GLuint yTexture;
-@property(nonatomic, readonly) GLuint uvTexture;
-
-- (instancetype)init NS_UNAVAILABLE;
-- (nullable instancetype)initWithContext:(EAGLContext *)context NS_DESIGNATED_INITIALIZER;
-
-- (BOOL)uploadFrameToTextures:(RTCVideoFrame *)frame;
-
-- (void)releaseTextures;
-
-@end
-
-NS_ASSUME_NONNULL_END
diff --git a/sdk/objc/Framework/Classes/Video/RTCNV12TextureCache.m b/sdk/objc/Framework/Classes/Video/RTCNV12TextureCache.m
deleted file mode 100644
index 20a6082..0000000
--- a/sdk/objc/Framework/Classes/Video/RTCNV12TextureCache.m
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- *  Copyright 2017 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.
- */
-
-#import "RTCNV12TextureCache.h"
-
-#import "WebRTC/RTCVideoFrame.h"
-#import "WebRTC/RTCVideoFrameBuffer.h"
-
-@implementation RTCNV12TextureCache {
-  CVOpenGLESTextureCacheRef _textureCache;
-  CVOpenGLESTextureRef _yTextureRef;
-  CVOpenGLESTextureRef _uvTextureRef;
-}
-
-- (GLuint)yTexture {
-  return CVOpenGLESTextureGetName(_yTextureRef);
-}
-
-- (GLuint)uvTexture {
-  return CVOpenGLESTextureGetName(_uvTextureRef);
-}
-
-- (instancetype)initWithContext:(EAGLContext *)context {
-  if (self = [super init]) {
-    CVReturn ret = CVOpenGLESTextureCacheCreate(
-        kCFAllocatorDefault, NULL,
-#if COREVIDEO_USE_EAGLCONTEXT_CLASS_IN_API
-        context,
-#else
-        (__bridge void *)context,
-#endif
-        NULL, &_textureCache);
-    if (ret != kCVReturnSuccess) {
-      self = nil;
-    }
-  }
-  return self;
-}
-
-- (BOOL)loadTexture:(CVOpenGLESTextureRef *)textureOut
-        pixelBuffer:(CVPixelBufferRef)pixelBuffer
-         planeIndex:(int)planeIndex
-        pixelFormat:(GLenum)pixelFormat {
-  const int width = CVPixelBufferGetWidthOfPlane(pixelBuffer, planeIndex);
-  const int height = CVPixelBufferGetHeightOfPlane(pixelBuffer, planeIndex);
-
-  if (*textureOut) {
-    CFRelease(*textureOut);
-    *textureOut = nil;
-  }
-  CVReturn ret = CVOpenGLESTextureCacheCreateTextureFromImage(
-      kCFAllocatorDefault, _textureCache, pixelBuffer, NULL, GL_TEXTURE_2D, pixelFormat, width,
-      height, pixelFormat, GL_UNSIGNED_BYTE, planeIndex, textureOut);
-  if (ret != kCVReturnSuccess) {
-    CFRelease(*textureOut);
-    *textureOut = nil;
-    return NO;
-  }
-  NSAssert(CVOpenGLESTextureGetTarget(*textureOut) == GL_TEXTURE_2D,
-           @"Unexpected GLES texture target");
-  glBindTexture(GL_TEXTURE_2D, CVOpenGLESTextureGetName(*textureOut));
-  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
-  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
-  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
-  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
-  return YES;
-}
-
-- (BOOL)uploadFrameToTextures:(RTCVideoFrame *)frame {
-  NSAssert([frame.buffer isKindOfClass:[RTCCVPixelBuffer class]],
-           @"frame must be CVPixelBuffer backed");
-  RTCCVPixelBuffer *rtcPixelBuffer = (RTCCVPixelBuffer *)frame.buffer;
-  CVPixelBufferRef pixelBuffer = rtcPixelBuffer.pixelBuffer;
-  return [self loadTexture:&_yTextureRef
-               pixelBuffer:pixelBuffer
-                planeIndex:0
-               pixelFormat:GL_LUMINANCE] &&
-         [self loadTexture:&_uvTextureRef
-               pixelBuffer:pixelBuffer
-                planeIndex:1
-               pixelFormat:GL_LUMINANCE_ALPHA];
-}
-
-- (void)releaseTextures {
-  if (_uvTextureRef) {
-    CFRelease(_uvTextureRef);
-    _uvTextureRef = nil;
-  }
-  if (_yTextureRef) {
-    CFRelease(_yTextureRef);
-    _yTextureRef = nil;
-  }
-}
-
-- (void)dealloc {
-  [self releaseTextures];
-  if (_textureCache) {
-    CFRelease(_textureCache);
-    _textureCache = nil;
-  }
-}
-
-@end
-
diff --git a/sdk/objc/Framework/Classes/Video/RTCOpenGLDefines.h b/sdk/objc/Framework/Classes/Video/RTCOpenGLDefines.h
deleted file mode 100644
index 4088535..0000000
--- a/sdk/objc/Framework/Classes/Video/RTCOpenGLDefines.h
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- *  Copyright 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.
- */
-
-#import <Foundation/Foundation.h>
-
-#if TARGET_OS_IPHONE
-#define RTC_PIXEL_FORMAT GL_LUMINANCE
-#define SHADER_VERSION
-#define VERTEX_SHADER_IN "attribute"
-#define VERTEX_SHADER_OUT "varying"
-#define FRAGMENT_SHADER_IN "varying"
-#define FRAGMENT_SHADER_OUT
-#define FRAGMENT_SHADER_COLOR "gl_FragColor"
-#define FRAGMENT_SHADER_TEXTURE "texture2D"
-
-@class EAGLContext;
-typedef EAGLContext GlContextType;
-#else
-#define RTC_PIXEL_FORMAT GL_RED
-#define SHADER_VERSION "#version 150\n"
-#define VERTEX_SHADER_IN "in"
-#define VERTEX_SHADER_OUT "out"
-#define FRAGMENT_SHADER_IN "in"
-#define FRAGMENT_SHADER_OUT "out vec4 fragColor;\n"
-#define FRAGMENT_SHADER_COLOR "fragColor"
-#define FRAGMENT_SHADER_TEXTURE "texture"
-
-@class NSOpenGLContext;
-typedef NSOpenGLContext GlContextType;
-#endif
diff --git a/sdk/objc/Framework/Classes/Video/RTCShader.h b/sdk/objc/Framework/Classes/Video/RTCShader.h
deleted file mode 100644
index 4d92d3d..0000000
--- a/sdk/objc/Framework/Classes/Video/RTCShader.h
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- *  Copyright 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.
- */
-
-#import "WebRTC/RTCVideoFrame.h"
-
-RTC_EXTERN const char kRTCVertexShaderSource[];
-
-RTC_EXTERN GLuint RTCCreateShader(GLenum type, const GLchar *source);
-RTC_EXTERN GLuint RTCCreateProgram(GLuint vertexShader, GLuint fragmentShader);
-RTC_EXTERN GLuint RTCCreateProgramFromFragmentSource(const char fragmentShaderSource[]);
-RTC_EXTERN BOOL RTCCreateVertexBuffer(GLuint* vertexBuffer,
-                                      GLuint* vertexArray);
-RTC_EXTERN void RTCSetVertexData(RTCVideoRotation rotation);
diff --git a/sdk/objc/Framework/Classes/Video/RTCShader.mm b/sdk/objc/Framework/Classes/Video/RTCShader.mm
deleted file mode 100644
index 351f241..0000000
--- a/sdk/objc/Framework/Classes/Video/RTCShader.mm
+++ /dev/null
@@ -1,189 +0,0 @@
-/*
- *  Copyright 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.
- */
-
-#import "RTCShader.h"
-
-#if TARGET_OS_IPHONE
-#import <OpenGLES/ES3/gl.h>
-#else
-#import <OpenGL/gl3.h>
-#endif
-
-#include <algorithm>
-#include <array>
-#include <memory>
-
-#import "RTCOpenGLDefines.h"
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-
-// Vertex shader doesn't do anything except pass coordinates through.
-const char kRTCVertexShaderSource[] =
-  SHADER_VERSION
-  VERTEX_SHADER_IN " vec2 position;\n"
-  VERTEX_SHADER_IN " vec2 texcoord;\n"
-  VERTEX_SHADER_OUT " vec2 v_texcoord;\n"
-  "void main() {\n"
-  "    gl_Position = vec4(position.x, position.y, 0.0, 1.0);\n"
-  "    v_texcoord = texcoord;\n"
-  "}\n";
-
-// Compiles a shader of the given |type| with GLSL source |source| and returns
-// the shader handle or 0 on error.
-GLuint RTCCreateShader(GLenum type, const GLchar *source) {
-  GLuint shader = glCreateShader(type);
-  if (!shader) {
-    return 0;
-  }
-  glShaderSource(shader, 1, &source, NULL);
-  glCompileShader(shader);
-  GLint compileStatus = GL_FALSE;
-  glGetShaderiv(shader, GL_COMPILE_STATUS, &compileStatus);
-  if (compileStatus == GL_FALSE) {
-    GLint logLength = 0;
-    // The null termination character is included in the returned log length.
-    glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &logLength);
-    if (logLength > 0) {
-      std::unique_ptr<char[]> compileLog(new char[logLength]);
-      // The returned string is null terminated.
-      glGetShaderInfoLog(shader, logLength, NULL, compileLog.get());
-      LOG(LS_ERROR) << "Shader compile error: " << compileLog.get();
-    }
-    glDeleteShader(shader);
-    shader = 0;
-  }
-  return shader;
-}
-
-// Links a shader program with the given vertex and fragment shaders and
-// returns the program handle or 0 on error.
-GLuint RTCCreateProgram(GLuint vertexShader, GLuint fragmentShader) {
-  if (vertexShader == 0 || fragmentShader == 0) {
-    return 0;
-  }
-  GLuint program = glCreateProgram();
-  if (!program) {
-    return 0;
-  }
-  glAttachShader(program, vertexShader);
-  glAttachShader(program, fragmentShader);
-  glLinkProgram(program);
-  GLint linkStatus = GL_FALSE;
-  glGetProgramiv(program, GL_LINK_STATUS, &linkStatus);
-  if (linkStatus == GL_FALSE) {
-    glDeleteProgram(program);
-    program = 0;
-  }
-  return program;
-}
-
-// Creates and links a shader program with the given fragment shader source and
-// a plain vertex shader. Returns the program handle or 0 on error.
-GLuint RTCCreateProgramFromFragmentSource(const char fragmentShaderSource[]) {
-  GLuint vertexShader = RTCCreateShader(GL_VERTEX_SHADER, kRTCVertexShaderSource);
-  RTC_CHECK(vertexShader) << "failed to create vertex shader";
-  GLuint fragmentShader =
-      RTCCreateShader(GL_FRAGMENT_SHADER, fragmentShaderSource);
-  RTC_CHECK(fragmentShader) << "failed to create fragment shader";
-  GLuint program = RTCCreateProgram(vertexShader, fragmentShader);
-  // Shaders are created only to generate program.
-  if (vertexShader) {
-    glDeleteShader(vertexShader);
-  }
-  if (fragmentShader) {
-    glDeleteShader(fragmentShader);
-  }
-
-  // Set vertex shader variables 'position' and 'texcoord' in program.
-  GLint position = glGetAttribLocation(program, "position");
-  GLint texcoord = glGetAttribLocation(program, "texcoord");
-  if (position < 0 || texcoord < 0) {
-    glDeleteProgram(program);
-    return 0;
-  }
-
-  // Read position attribute with size of 2 and stride of 4 beginning at the start of the array. The
-  // last argument indicates offset of data within the vertex buffer.
-  glVertexAttribPointer(position, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(GLfloat), (void *)0);
-  glEnableVertexAttribArray(position);
-
-  // Read texcoord attribute  with size of 2 and stride of 4 beginning at the first texcoord in the
-  // array. The last argument indicates offset of data within the vertex buffer.
-  glVertexAttribPointer(
-      texcoord, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(GLfloat), (void *)(2 * sizeof(GLfloat)));
-  glEnableVertexAttribArray(texcoord);
-
-  return program;
-}
-
-BOOL RTCCreateVertexBuffer(GLuint *vertexBuffer, GLuint *vertexArray) {
-#if !TARGET_OS_IPHONE
-  glGenVertexArrays(1, vertexArray);
-  if (*vertexArray == 0) {
-    return NO;
-  }
-  glBindVertexArray(*vertexArray);
-#endif
-  glGenBuffers(1, vertexBuffer);
-  if (*vertexBuffer == 0) {
-    glDeleteVertexArrays(1, vertexArray);
-    return NO;
-  }
-  glBindBuffer(GL_ARRAY_BUFFER, *vertexBuffer);
-  glBufferData(GL_ARRAY_BUFFER, 4 * 4 * sizeof(GLfloat), NULL, GL_DYNAMIC_DRAW);
-  return YES;
-}
-
-// Set vertex data to the currently bound vertex buffer.
-void RTCSetVertexData(RTCVideoRotation rotation) {
-  // When modelview and projection matrices are identity (default) the world is
-  // contained in the square around origin with unit size 2. Drawing to these
-  // coordinates is equivalent to drawing to the entire screen. The texture is
-  // stretched over that square using texture coordinates (u, v) that range
-  // from (0, 0) to (1, 1) inclusive. Texture coordinates are flipped vertically
-  // here because the incoming frame has origin in upper left hand corner but
-  // OpenGL expects origin in bottom left corner.
-  std::array<std::array<GLfloat, 2>, 4> UVCoords = {{
-      {{0, 1}},  // Lower left.
-      {{1, 1}},  // Lower right.
-      {{1, 0}},  // Upper right.
-      {{0, 0}},  // Upper left.
-  }};
-
-  // Rotate the UV coordinates.
-  int rotation_offset;
-  switch (rotation) {
-    case RTCVideoRotation_0:
-      rotation_offset = 0;
-      break;
-    case RTCVideoRotation_90:
-      rotation_offset = 1;
-      break;
-    case RTCVideoRotation_180:
-      rotation_offset = 2;
-      break;
-    case RTCVideoRotation_270:
-      rotation_offset = 3;
-      break;
-  }
-  std::rotate(UVCoords.begin(), UVCoords.begin() + rotation_offset,
-              UVCoords.end());
-
-  const GLfloat gVertices[] = {
-      // X, Y, U, V.
-      -1, -1, UVCoords[0][0], UVCoords[0][1],
-       1, -1, UVCoords[1][0], UVCoords[1][1],
-       1,  1, UVCoords[2][0], UVCoords[2][1],
-      -1,  1, UVCoords[3][0], UVCoords[3][1],
-  };
-
-  glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(gVertices), gVertices);
-}
diff --git a/sdk/objc/Framework/Classes/Video/avfoundationformatmapper.h b/sdk/objc/Framework/Classes/Video/avfoundationformatmapper.h
deleted file mode 100644
index 0f357a0..0000000
--- a/sdk/objc/Framework/Classes/Video/avfoundationformatmapper.h
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- *  Copyright 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 <set>
-
-#import <AVFoundation/AVFoundation.h>
-#import <Foundation/Foundation.h>
-
-#include "webrtc/media/base/videocapturer.h"
-
-namespace webrtc {
-// Mapping from AVCaptureDeviceFormat to cricket::VideoFormat for given input
-// device.
-std::set<cricket::VideoFormat> GetSupportedVideoFormatsForDevice(
-    AVCaptureDevice* device);
-
-// Sets device format for the provided capture device. Returns YES/NO depending
-// on success.
-bool SetFormatForCaptureDevice(AVCaptureDevice* device,
-                               AVCaptureSession* session,
-                               const cricket::VideoFormat& format);
-}
diff --git a/sdk/objc/Framework/Classes/Video/avfoundationformatmapper.mm b/sdk/objc/Framework/Classes/Video/avfoundationformatmapper.mm
deleted file mode 100644
index 19afa33..0000000
--- a/sdk/objc/Framework/Classes/Video/avfoundationformatmapper.mm
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
- *  Copyright 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 "avfoundationformatmapper.h"
-
-#import "WebRTC/RTCLogging.h"
-
-// TODO(denicija): add support for higher frame rates.
-// See http://crbug/webrtc/6355 for more info.
-static const int kFramesPerSecond = 30;
-
-static inline BOOL IsMediaSubTypeSupported(FourCharCode mediaSubType) {
-  return (mediaSubType == kCVPixelFormatType_420YpCbCr8PlanarFullRange ||
-          mediaSubType == kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange);
-}
-
-static inline BOOL IsFrameRateWithinRange(int fps, AVFrameRateRange* range) {
-  return range.minFrameRate <= fps && range.maxFrameRate >= fps;
-}
-
-// Returns filtered array of device formats based on predefined constraints our
-// stack imposes.
-static NSArray<AVCaptureDeviceFormat*>* GetEligibleDeviceFormats(
-    const AVCaptureDevice* device,
-    int supportedFps) {
-  NSMutableArray<AVCaptureDeviceFormat*>* eligibleDeviceFormats =
-      [NSMutableArray array];
-
-  for (AVCaptureDeviceFormat* format in device.formats) {
-    // Filter out subTypes that we currently don't support in the stack
-    FourCharCode mediaSubType =
-        CMFormatDescriptionGetMediaSubType(format.formatDescription);
-    if (!IsMediaSubTypeSupported(mediaSubType)) {
-      continue;
-    }
-
-    // Filter out frame rate ranges that we currently don't support in the stack
-    for (AVFrameRateRange* frameRateRange in format.videoSupportedFrameRateRanges) {
-      if (IsFrameRateWithinRange(supportedFps, frameRateRange)) {
-        [eligibleDeviceFormats addObject:format];
-        break;
-      }
-    }
-  }
-
-  return [eligibleDeviceFormats copy];
-}
-
-// Mapping from cricket::VideoFormat to AVCaptureDeviceFormat.
-static AVCaptureDeviceFormat* GetDeviceFormatForVideoFormat(
-    const AVCaptureDevice* device,
-    const cricket::VideoFormat& videoFormat) {
-  AVCaptureDeviceFormat* desiredDeviceFormat = nil;
-  NSArray<AVCaptureDeviceFormat*>* eligibleFormats =
-      GetEligibleDeviceFormats(device, videoFormat.framerate());
-
-  for (AVCaptureDeviceFormat* deviceFormat in eligibleFormats) {
-    CMVideoDimensions dimension =
-        CMVideoFormatDescriptionGetDimensions(deviceFormat.formatDescription);
-    FourCharCode mediaSubType =
-        CMFormatDescriptionGetMediaSubType(deviceFormat.formatDescription);
-
-    if (videoFormat.width == dimension.width &&
-        videoFormat.height == dimension.height) {
-      if (mediaSubType == kCVPixelFormatType_420YpCbCr8BiPlanarFullRange) {
-        // This is the preferred format so no need to wait for better option.
-        return deviceFormat;
-      } else {
-        // This is good candidate, but let's wait for something better.
-        desiredDeviceFormat = deviceFormat;
-      }
-    }
-  }
-
-  return desiredDeviceFormat;
-}
-namespace webrtc {
-std::set<cricket::VideoFormat> GetSupportedVideoFormatsForDevice(
-    AVCaptureDevice* device) {
-  std::set<cricket::VideoFormat> supportedFormats;
-
-  NSArray<AVCaptureDeviceFormat*>* eligibleFormats =
-      GetEligibleDeviceFormats(device, kFramesPerSecond);
-
-  for (AVCaptureDeviceFormat* deviceFormat in eligibleFormats) {
-    CMVideoDimensions dimension =
-        CMVideoFormatDescriptionGetDimensions(deviceFormat.formatDescription);
-    cricket::VideoFormat format = cricket::VideoFormat(
-        dimension.width, dimension.height,
-        cricket::VideoFormat::FpsToInterval(kFramesPerSecond),
-        cricket::FOURCC_NV12);
-    supportedFormats.insert(format);
-  }
-
-  return supportedFormats;
-}
-
-bool SetFormatForCaptureDevice(AVCaptureDevice* device,
-                               AVCaptureSession* session,
-                               const cricket::VideoFormat& format) {
-  AVCaptureDeviceFormat* deviceFormat =
-      GetDeviceFormatForVideoFormat(device, format);
-  const int fps = cricket::VideoFormat::IntervalToFps(format.interval);
-
-  NSError* error = nil;
-  bool success = true;
-  [session beginConfiguration];
-  if ([device lockForConfiguration:&error]) {
-    @try {
-      device.activeFormat = deviceFormat;
-      device.activeVideoMinFrameDuration = CMTimeMake(1, fps);
-    } @catch (NSException* exception) {
-      RTCLogError(@"Failed to set active format!\n User info:%@",
-                  exception.userInfo);
-      success = false;
-    }
-
-    [device unlockForConfiguration];
-  } else {
-    RTCLogError(@"Failed to lock device %@. Error: %@", device, error.userInfo);
-    success = false;
-  }
-  [session commitConfiguration];
-
-  return success;
-}
-
-}  // namespace webrtc
diff --git a/sdk/objc/Framework/Classes/Video/avfoundationvideocapturer.h b/sdk/objc/Framework/Classes/Video/avfoundationvideocapturer.h
deleted file mode 100644
index 45161b6..0000000
--- a/sdk/objc/Framework/Classes/Video/avfoundationvideocapturer.h
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- *  Copyright 2015 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_SDK_OBJC_FRAMEWORK_CLASSES_VIDEO_AVFOUNDATIONVIDEOCAPTURER_H_
-#define WEBRTC_SDK_OBJC_FRAMEWORK_CLASSES_VIDEO_AVFOUNDATIONVIDEOCAPTURER_H_
-
-#import <AVFoundation/AVFoundation.h>
-
-#include "webrtc/api/video/video_frame.h"
-#include "webrtc/common_video/include/i420_buffer_pool.h"
-#include "webrtc/media/base/videocapturer.h"
-
-@class RTCAVFoundationVideoCapturerInternal;
-
-namespace rtc {
-class Thread;
-}  // namespace rtc
-
-namespace webrtc {
-
-class AVFoundationVideoCapturer : public cricket::VideoCapturer {
- public:
-  AVFoundationVideoCapturer();
-  ~AVFoundationVideoCapturer();
-
-  cricket::CaptureState Start(const cricket::VideoFormat& format) override;
-  void Stop() override;
-  bool IsRunning() override;
-  bool IsScreencast() const override {
-    return false;
-  }
-  bool GetPreferredFourccs(std::vector<uint32_t> *fourccs) override {
-    fourccs->push_back(cricket::FOURCC_NV12);
-    return true;
-  }
-
-  // Returns the active capture session. Calls to the capture session should
-  // occur on the RTCDispatcherTypeCaptureSession queue in RTCDispatcher.
-  AVCaptureSession* GetCaptureSession();
-
-  // Returns whether the rear-facing camera can be used.
-  // e.g. It can't be used because it doesn't exist.
-  bool CanUseBackCamera() const;
-
-  // Switches the camera being used (either front or back).
-  void SetUseBackCamera(bool useBackCamera);
-  bool GetUseBackCamera() const;
-
-  // Converts the sample buffer into a cricket::CapturedFrame and signals the
-  // frame for capture.
-  void CaptureSampleBuffer(CMSampleBufferRef sample_buffer,
-                           webrtc::VideoRotation rotation);
-
-  // Called to adjust the size of output frames to supplied |width| and
-  // |height|. Also drops frames to make the output match |fps|.
-  void AdaptOutputFormat(int width, int height, int fps);
-
- private:
-  RTCAVFoundationVideoCapturerInternal *_capturer;
-  webrtc::I420BufferPool _buffer_pool;
-};  // AVFoundationVideoCapturer
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_SDK_OBJC_FRAMEWORK_CLASSES_VIDEO_AVFOUNDATIONVIDEOCAPTURER_H_
diff --git a/sdk/objc/Framework/Classes/Video/avfoundationvideocapturer.mm b/sdk/objc/Framework/Classes/Video/avfoundationvideocapturer.mm
deleted file mode 100644
index 1c8403e..0000000
--- a/sdk/objc/Framework/Classes/Video/avfoundationvideocapturer.mm
+++ /dev/null
@@ -1,179 +0,0 @@
-/*
- *  Copyright 2015 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 "avfoundationvideocapturer.h"
-
-#import <AVFoundation/AVFoundation.h>
-
-#import "RTCAVFoundationVideoCapturerInternal.h"
-#import "RTCDispatcher+Private.h"
-#import "WebRTC/RTCLogging.h"
-#import "WebRTC/RTCVideoFrameBuffer.h"
-
-#include "avfoundationformatmapper.h"
-
-#include "webrtc/api/video/video_rotation.h"
-#include "webrtc/rtc_base/bind.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/thread.h"
-#include "webrtc/sdk/objc/Framework/Classes/Video/objc_frame_buffer.h"
-
-namespace webrtc {
-
-enum AVFoundationVideoCapturerMessageType : uint32_t {
-  kMessageTypeFrame,
-};
-
-AVFoundationVideoCapturer::AVFoundationVideoCapturer() : _capturer(nil) {
-  _capturer =
-      [[RTCAVFoundationVideoCapturerInternal alloc] initWithCapturer:this];
-
-  std::set<cricket::VideoFormat> front_camera_video_formats =
-      GetSupportedVideoFormatsForDevice([_capturer frontCaptureDevice]);
-  std::set<cricket::VideoFormat> back_camera_video_formats =
-      GetSupportedVideoFormatsForDevice([_capturer backCaptureDevice]);
-  std::vector<cricket::VideoFormat> intersection_video_formats;
-  if (back_camera_video_formats.empty()) {
-    intersection_video_formats.assign(front_camera_video_formats.begin(),
-                                      front_camera_video_formats.end());
-
-  } else if (front_camera_video_formats.empty()) {
-    intersection_video_formats.assign(back_camera_video_formats.begin(),
-                                      back_camera_video_formats.end());
-  } else {
-    std::set_intersection(
-        front_camera_video_formats.begin(), front_camera_video_formats.end(),
-        back_camera_video_formats.begin(), back_camera_video_formats.end(),
-        std::back_inserter(intersection_video_formats));
-  }
-  SetSupportedFormats(intersection_video_formats);
-}
-
-AVFoundationVideoCapturer::~AVFoundationVideoCapturer() {
-  _capturer = nil;
-}
-
-cricket::CaptureState AVFoundationVideoCapturer::Start(
-    const cricket::VideoFormat& format) {
-  if (!_capturer) {
-    LOG(LS_ERROR) << "Failed to create AVFoundation capturer.";
-    return cricket::CaptureState::CS_FAILED;
-  }
-  if (_capturer.isRunning) {
-    LOG(LS_ERROR) << "The capturer is already running.";
-    return cricket::CaptureState::CS_FAILED;
-  }
-
-  AVCaptureDevice* device = [_capturer getActiveCaptureDevice];
-  AVCaptureSession* session = _capturer.captureSession;
-
-  if (!SetFormatForCaptureDevice(device, session, format)) {
-    return cricket::CaptureState::CS_FAILED;
-  }
-
-  SetCaptureFormat(&format);
-  // This isn't super accurate because it takes a while for the AVCaptureSession
-  // to spin up, and this call returns async.
-  // TODO(tkchin): make this better.
-  [_capturer start];
-  SetCaptureState(cricket::CaptureState::CS_RUNNING);
-
-  return cricket::CaptureState::CS_STARTING;
-}
-
-void AVFoundationVideoCapturer::Stop() {
-  [_capturer stop];
-  SetCaptureFormat(NULL);
-}
-
-bool AVFoundationVideoCapturer::IsRunning() {
-  return _capturer.isRunning;
-}
-
-AVCaptureSession* AVFoundationVideoCapturer::GetCaptureSession() {
-  return _capturer.captureSession;
-}
-
-bool AVFoundationVideoCapturer::CanUseBackCamera() const {
-  return _capturer.canUseBackCamera;
-}
-
-void AVFoundationVideoCapturer::SetUseBackCamera(bool useBackCamera) {
-  _capturer.useBackCamera = useBackCamera;
-}
-
-bool AVFoundationVideoCapturer::GetUseBackCamera() const {
-  return _capturer.useBackCamera;
-}
-
-void AVFoundationVideoCapturer::AdaptOutputFormat(int width, int height, int fps) {
-  cricket::VideoFormat format(width, height, cricket::VideoFormat::FpsToInterval(fps), 0);
-  video_adapter()->OnOutputFormatRequest(format);
-}
-
-void AVFoundationVideoCapturer::CaptureSampleBuffer(
-    CMSampleBufferRef sample_buffer, VideoRotation rotation) {
-  if (CMSampleBufferGetNumSamples(sample_buffer) != 1 ||
-      !CMSampleBufferIsValid(sample_buffer) ||
-      !CMSampleBufferDataIsReady(sample_buffer)) {
-    return;
-  }
-
-  CVImageBufferRef image_buffer = CMSampleBufferGetImageBuffer(sample_buffer);
-  if (image_buffer == NULL) {
-    return;
-  }
-
-  int captured_width = CVPixelBufferGetWidth(image_buffer);
-  int captured_height = CVPixelBufferGetHeight(image_buffer);
-
-  int adapted_width;
-  int adapted_height;
-  int crop_width;
-  int crop_height;
-  int crop_x;
-  int crop_y;
-  int64_t translated_camera_time_us;
-
-  if (!AdaptFrame(captured_width, captured_height,
-                  rtc::TimeNanos() / rtc::kNumNanosecsPerMicrosec,
-                  rtc::TimeMicros(), &adapted_width, &adapted_height,
-                  &crop_width, &crop_height, &crop_x, &crop_y,
-                  &translated_camera_time_us)) {
-    return;
-  }
-
-  RTCCVPixelBuffer* rtcPixelBuffer = [[RTCCVPixelBuffer alloc] initWithPixelBuffer:image_buffer
-                                                                      adaptedWidth:adapted_width
-                                                                     adaptedHeight:adapted_height
-                                                                         cropWidth:crop_width
-                                                                        cropHeight:crop_height
-                                                                             cropX:crop_x
-                                                                             cropY:crop_y];
-  rtc::scoped_refptr<VideoFrameBuffer> buffer =
-      new rtc::RefCountedObject<ObjCFrameBuffer>(rtcPixelBuffer);
-
-  // Applying rotation is only supported for legacy reasons and performance is
-  // not critical here.
-  if (apply_rotation() && rotation != kVideoRotation_0) {
-    buffer = I420Buffer::Rotate(*buffer->ToI420(), rotation);
-    if (rotation == kVideoRotation_90 || rotation == kVideoRotation_270) {
-      std::swap(captured_width, captured_height);
-    }
-
-    rotation = kVideoRotation_0;
-  }
-
-  OnFrame(webrtc::VideoFrame(buffer, rotation, translated_camera_time_us),
-          captured_width, captured_height);
-}
-
-}  // namespace webrtc
diff --git a/sdk/objc/Framework/Classes/Video/corevideo_frame_buffer.cc b/sdk/objc/Framework/Classes/Video/corevideo_frame_buffer.cc
deleted file mode 100644
index daebb2c..0000000
--- a/sdk/objc/Framework/Classes/Video/corevideo_frame_buffer.cc
+++ /dev/null
@@ -1,178 +0,0 @@
-/*
- *  Copyright 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/sdk/objc/Framework/Classes/Video/corevideo_frame_buffer.h"
-
-#include "libyuv/convert.h"
-#include "webrtc/api/video/i420_buffer.h"
-#include "webrtc/common_video/libyuv/include/webrtc_libyuv.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-
-namespace webrtc {
-
-CoreVideoFrameBuffer::CoreVideoFrameBuffer(CVPixelBufferRef pixel_buffer,
-                                           int adapted_width,
-                                           int adapted_height,
-                                           int crop_width,
-                                           int crop_height,
-                                           int crop_x,
-                                           int crop_y)
-    : pixel_buffer_(pixel_buffer),
-      width_(adapted_width),
-      height_(adapted_height),
-      buffer_width_(CVPixelBufferGetWidth(pixel_buffer)),
-      buffer_height_(CVPixelBufferGetHeight(pixel_buffer)),
-      crop_width_(crop_width),
-      crop_height_(crop_height),
-      // Can only crop at even pixels.
-      crop_x_(crop_x & ~1),
-      crop_y_(crop_y & ~1) {
-  CVBufferRetain(pixel_buffer_);
-}
-
-CoreVideoFrameBuffer::CoreVideoFrameBuffer(CVPixelBufferRef pixel_buffer)
-    : pixel_buffer_(pixel_buffer),
-      width_(CVPixelBufferGetWidth(pixel_buffer)),
-      height_(CVPixelBufferGetHeight(pixel_buffer)),
-      buffer_width_(width_),
-      buffer_height_(height_),
-      crop_width_(width_),
-      crop_height_(height_),
-      crop_x_(0),
-      crop_y_(0) {
-  CVBufferRetain(pixel_buffer_);
-}
-
-CoreVideoFrameBuffer::~CoreVideoFrameBuffer() {
-  CVBufferRelease(pixel_buffer_);
-}
-
-VideoFrameBuffer::Type CoreVideoFrameBuffer::type() const {
-  return Type::kNative;
-}
-
-int CoreVideoFrameBuffer::width() const {
-  return width_;
-}
-
-int CoreVideoFrameBuffer::height() const {
-  return height_;
-}
-
-rtc::scoped_refptr<I420BufferInterface> CoreVideoFrameBuffer::ToI420() {
-  const OSType pixel_format = CVPixelBufferGetPixelFormatType(pixel_buffer_);
-  RTC_DCHECK(pixel_format == kCVPixelFormatType_420YpCbCr8BiPlanarFullRange ||
-             pixel_format == kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange);
-
-  CVPixelBufferLockBaseAddress(pixel_buffer_, kCVPixelBufferLock_ReadOnly);
-  const uint8_t* src_y = static_cast<const uint8_t*>(
-      CVPixelBufferGetBaseAddressOfPlane(pixel_buffer_, 0));
-  const int src_y_stride = CVPixelBufferGetBytesPerRowOfPlane(pixel_buffer_, 0);
-  const uint8_t* src_uv = static_cast<const uint8_t*>(
-      CVPixelBufferGetBaseAddressOfPlane(pixel_buffer_, 1));
-  const int src_uv_stride =
-      CVPixelBufferGetBytesPerRowOfPlane(pixel_buffer_, 1);
-
-  // Crop just by modifying pointers.
-  src_y += src_y_stride * crop_y_ + crop_x_;
-  src_uv += src_uv_stride * (crop_y_ / 2) + crop_x_;
-
-  // TODO(magjed): Use a frame buffer pool.
-  NV12ToI420Scaler nv12_to_i420_scaler;
-  rtc::scoped_refptr<I420Buffer> buffer =
-      new rtc::RefCountedObject<I420Buffer>(width_, height_);
-  nv12_to_i420_scaler.NV12ToI420Scale(
-      src_y, src_y_stride,
-      src_uv, src_uv_stride,
-      crop_width_, crop_height_,
-      buffer->MutableDataY(), buffer->StrideY(),
-      buffer->MutableDataU(), buffer->StrideU(),
-      buffer->MutableDataV(), buffer->StrideV(),
-      buffer->width(), buffer->height());
-
-  CVPixelBufferUnlockBaseAddress(pixel_buffer_, kCVPixelBufferLock_ReadOnly);
-
-  return buffer;
-}
-
-bool CoreVideoFrameBuffer::RequiresCropping() const {
-  return crop_width_ != buffer_width_ || crop_height_ != buffer_height_;
-}
-
-bool CoreVideoFrameBuffer::CropAndScaleTo(
-    std::vector<uint8_t>* tmp_buffer,
-    CVPixelBufferRef output_pixel_buffer) const {
-  // Prepare output pointers.
-  RTC_DCHECK_EQ(CVPixelBufferGetPixelFormatType(output_pixel_buffer),
-                kCVPixelFormatType_420YpCbCr8BiPlanarFullRange);
-  CVReturn cv_ret = CVPixelBufferLockBaseAddress(output_pixel_buffer, 0);
-  if (cv_ret != kCVReturnSuccess) {
-    LOG(LS_ERROR) << "Failed to lock base address: " << cv_ret;
-    return false;
-  }
-  const int dst_width = CVPixelBufferGetWidth(output_pixel_buffer);
-  const int dst_height = CVPixelBufferGetHeight(output_pixel_buffer);
-  uint8_t* dst_y = reinterpret_cast<uint8_t*>(
-      CVPixelBufferGetBaseAddressOfPlane(output_pixel_buffer, 0));
-  const int dst_y_stride =
-      CVPixelBufferGetBytesPerRowOfPlane(output_pixel_buffer, 0);
-  uint8_t* dst_uv = reinterpret_cast<uint8_t*>(
-      CVPixelBufferGetBaseAddressOfPlane(output_pixel_buffer, 1));
-  const int dst_uv_stride =
-      CVPixelBufferGetBytesPerRowOfPlane(output_pixel_buffer, 1);
-
-  // Prepare source pointers.
-  const OSType src_pixel_format =
-      CVPixelBufferGetPixelFormatType(pixel_buffer_);
-  RTC_DCHECK(
-      src_pixel_format == kCVPixelFormatType_420YpCbCr8BiPlanarFullRange ||
-      src_pixel_format == kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange);
-  CVPixelBufferLockBaseAddress(pixel_buffer_, kCVPixelBufferLock_ReadOnly);
-  const uint8_t* src_y = static_cast<const uint8_t*>(
-      CVPixelBufferGetBaseAddressOfPlane(pixel_buffer_, 0));
-  const int src_y_stride = CVPixelBufferGetBytesPerRowOfPlane(pixel_buffer_, 0);
-  const uint8_t* src_uv = static_cast<const uint8_t*>(
-      CVPixelBufferGetBaseAddressOfPlane(pixel_buffer_, 1));
-  const int src_uv_stride =
-      CVPixelBufferGetBytesPerRowOfPlane(pixel_buffer_, 1);
-
-  // Crop just by modifying pointers.
-  src_y += src_y_stride * crop_y_ + crop_x_;
-  src_uv += src_uv_stride * (crop_y_ / 2) + crop_x_;
-
-  if (crop_width_ == dst_width && crop_height_ == dst_height) {
-    tmp_buffer->clear();
-    tmp_buffer->shrink_to_fit();
-  } else {
-    const int src_chroma_width = (crop_width_ + 1) / 2;
-    const int src_chroma_height = (crop_height_ + 1) / 2;
-    const int dst_chroma_width = (dst_width + 1) / 2;
-    const int dst_chroma_height = (dst_height + 1) / 2;
-    tmp_buffer->resize(src_chroma_width * src_chroma_height * 2 +
-                       dst_chroma_width * dst_chroma_height * 2);
-    tmp_buffer->shrink_to_fit();
-  }
-
-  NV12Scale(tmp_buffer->data(),
-            src_y, src_y_stride,
-            src_uv, src_uv_stride,
-            crop_width_, crop_height_,
-            dst_y, dst_y_stride,
-            dst_uv, dst_uv_stride,
-            dst_width, dst_height);
-
-  CVPixelBufferUnlockBaseAddress(pixel_buffer_, kCVPixelBufferLock_ReadOnly);
-  CVPixelBufferUnlockBaseAddress(output_pixel_buffer, 0);
-
-  return true;
-}
-
-}  // namespace webrtc
diff --git a/sdk/objc/Framework/Classes/Video/corevideo_frame_buffer.h b/sdk/objc/Framework/Classes/Video/corevideo_frame_buffer.h
deleted file mode 100644
index 603cbc0..0000000
--- a/sdk/objc/Framework/Classes/Video/corevideo_frame_buffer.h
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- *  Copyright 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_SDK_OBJC_FRAMEWORK_CLASSES_VIDEO_COREVIDEO_FRAME_BUFFER_H_
-#define WEBRTC_SDK_OBJC_FRAMEWORK_CLASSES_VIDEO_COREVIDEO_FRAME_BUFFER_H_
-
-#include <CoreVideo/CoreVideo.h>
-
-#include <vector>
-
-#include "webrtc/common_video/include/video_frame_buffer.h"
-
-namespace webrtc {
-
-class CoreVideoFrameBuffer : public VideoFrameBuffer {
- public:
-  explicit CoreVideoFrameBuffer(CVPixelBufferRef pixel_buffer);
-  CoreVideoFrameBuffer(CVPixelBufferRef pixel_buffer,
-                       int adapted_width,
-                       int adapted_height,
-                       int crop_width,
-                       int crop_height,
-                       int crop_x,
-                       int crop_y);
-  ~CoreVideoFrameBuffer() override;
-
-  CVPixelBufferRef pixel_buffer() { return pixel_buffer_; }
-
-  // Returns true if the internal pixel buffer needs to be cropped.
-  bool RequiresCropping() const;
-  // Crop and scales the internal pixel buffer to the output pixel buffer. The
-  // tmp buffer is used for intermediary splitting the UV channels. This
-  // function returns true if successful.
-  bool CropAndScaleTo(std::vector<uint8_t>* tmp_buffer,
-                      CVPixelBufferRef output_pixel_buffer) const;
-
- private:
-  Type type() const override;
-  int width() const override;
-  int height() const override;
-  rtc::scoped_refptr<I420BufferInterface> ToI420() override;
-
-  CVPixelBufferRef pixel_buffer_;
-  // buffer_width/height is the actual pixel buffer resolution. The
-  // width_/height_ is the resolution we will scale to in ToI420(). Cropping
-  // happens before scaling, so: buffer_width >= crop_width >= width().
-  const int width_;
-  const int height_;
-  const int buffer_width_;
-  const int buffer_height_;
-  const int crop_width_;
-  const int crop_height_;
-  const int crop_x_;
-  const int crop_y_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_SDK_OBJC_FRAMEWORK_CLASSES_VIDEO_COREVIDEO_FRAME_BUFFER_H_
diff --git a/sdk/objc/Framework/Classes/Video/objc_frame_buffer.h b/sdk/objc/Framework/Classes/Video/objc_frame_buffer.h
deleted file mode 100644
index 71099e4..0000000
--- a/sdk/objc/Framework/Classes/Video/objc_frame_buffer.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- *  Copyright 2017 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_SDK_OBJC_FRAMEWORK_CLASSES_VIDEO_OBJC_FRAME_BUFFER_H_
-#define WEBRTC_SDK_OBJC_FRAMEWORK_CLASSES_VIDEO_OBJC_FRAME_BUFFER_H_
-
-#import <CoreVideo/CoreVideo.h>
-
-#include "webrtc/common_video/include/video_frame_buffer.h"
-
-@protocol RTCVideoFrameBuffer;
-
-namespace webrtc {
-
-class ObjCFrameBuffer : public VideoFrameBuffer {
- public:
-  explicit ObjCFrameBuffer(id<RTCVideoFrameBuffer>);
-  ~ObjCFrameBuffer() override;
-
-  Type type() const override;
-
-  int width() const override;
-  int height() const override;
-
-  rtc::scoped_refptr<I420BufferInterface> ToI420() override;
-
-  id<RTCVideoFrameBuffer> wrapped_frame_buffer() const;
-
- private:
-  id<RTCVideoFrameBuffer> frame_buffer_;
-  int width_;
-  int height_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_SDK_OBJC_FRAMEWORK_CLASSES_VIDEO_OBJC_FRAME_BUFFER_H_
diff --git a/sdk/objc/Framework/Classes/Video/objc_frame_buffer.mm b/sdk/objc/Framework/Classes/Video/objc_frame_buffer.mm
deleted file mode 100644
index 74e9c13..0000000
--- a/sdk/objc/Framework/Classes/Video/objc_frame_buffer.mm
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- *  Copyright 2017 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/sdk/objc/Framework/Classes/Video/objc_frame_buffer.h"
-
-#import "WebRTC/RTCVideoFrameBuffer.h"
-
-namespace webrtc {
-
-namespace {
-
-/** ObjCFrameBuffer that conforms to I420BufferInterface by wrapping RTCI420Buffer */
-class ObjCI420FrameBuffer : public I420BufferInterface {
- public:
-  explicit ObjCI420FrameBuffer(id<RTCI420Buffer> frame_buffer)
-      : frame_buffer_(frame_buffer), width_(frame_buffer.width), height_(frame_buffer.height) {}
-  ~ObjCI420FrameBuffer() override{};
-
-  int width() const override { return width_; }
-
-  int height() const override { return height_; }
-
-  const uint8_t* DataY() const override { return frame_buffer_.dataY; }
-
-  const uint8_t* DataU() const override { return frame_buffer_.dataU; }
-
-  const uint8_t* DataV() const override { return frame_buffer_.dataV; }
-
-  int StrideY() const override { return frame_buffer_.strideY; }
-
-  int StrideU() const override { return frame_buffer_.strideU; }
-
-  int StrideV() const override { return frame_buffer_.strideV; }
-
- private:
-  id<RTCI420Buffer> frame_buffer_;
-  int width_;
-  int height_;
-};
-
-}  // namespace
-
-ObjCFrameBuffer::ObjCFrameBuffer(id<RTCVideoFrameBuffer> frame_buffer)
-    : frame_buffer_(frame_buffer), width_(frame_buffer.width), height_(frame_buffer.height) {}
-
-ObjCFrameBuffer::~ObjCFrameBuffer() {}
-
-VideoFrameBuffer::Type ObjCFrameBuffer::type() const {
-  return Type::kNative;
-}
-
-int ObjCFrameBuffer::width() const {
-  return width_;
-}
-
-int ObjCFrameBuffer::height() const {
-  return height_;
-}
-
-rtc::scoped_refptr<I420BufferInterface> ObjCFrameBuffer::ToI420() {
-  rtc::scoped_refptr<I420BufferInterface> buffer =
-      new rtc::RefCountedObject<ObjCI420FrameBuffer>([frame_buffer_ toI420]);
-
-  return buffer;
-}
-
-id<RTCVideoFrameBuffer> ObjCFrameBuffer::wrapped_frame_buffer() const {
-  return frame_buffer_;
-}
-
-}  // namespace webrtc
diff --git a/sdk/objc/Framework/Classes/Video/objcvideotracksource.h b/sdk/objc/Framework/Classes/Video/objcvideotracksource.h
deleted file mode 100644
index b28c001..0000000
--- a/sdk/objc/Framework/Classes/Video/objcvideotracksource.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- *  Copyright (c) 2017 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_SDK_OBJC_FRAMEWORK_CLASSES_VIDEO_OBJCVIDEOTRACKSOURCE_H_
-#define WEBRTC_SDK_OBJC_FRAMEWORK_CLASSES_VIDEO_OBJCVIDEOTRACKSOURCE_H_
-
-#include "WebRTC/RTCMacros.h"
-#include "webrtc/media/base/adaptedvideotracksource.h"
-#include "webrtc/rtc_base/timestampaligner.h"
-
-RTC_FWD_DECL_OBJC_CLASS(RTCVideoFrame);
-
-namespace webrtc {
-
-class ObjcVideoTrackSource : public rtc::AdaptedVideoTrackSource {
- public:
-  ObjcVideoTrackSource();
-
-  // This class can not be used for implementing screen casting. Hopefully, this
-  // function will be removed before we add that to iOS/Mac.
-  bool is_screencast() const override { return false; }
-
-  // Indicates that the encoder should denoise video before encoding it.
-  // If it is not set, the default configuration is used which is different
-  // depending on video codec.
-  rtc::Optional<bool> needs_denoising() const override {
-    return rtc::Optional<bool>(false);
-  }
-
-  SourceState state() const override { return SourceState::kLive; }
-
-  bool remote() const override { return false; }
-
-  // Called by RTCVideoSource.
-  void OnCapturedFrame(RTCVideoFrame* frame);
-  void OnOutputFormatRequest(int width, int height, int fps);
-
- private:
-  rtc::VideoBroadcaster broadcaster_;
-  rtc::TimestampAligner timestamp_aligner_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_SDK_OBJC_FRAMEWORK_CLASSES_VIDEO_OBJCVIDEOTRACKSOURCE_H_
diff --git a/sdk/objc/Framework/Classes/Video/objcvideotracksource.mm b/sdk/objc/Framework/Classes/Video/objcvideotracksource.mm
deleted file mode 100644
index d3ec3bd..0000000
--- a/sdk/objc/Framework/Classes/Video/objcvideotracksource.mm
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- *  Copyright (c) 2017 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/sdk/objc/Framework/Classes/Video/objcvideotracksource.h"
-
-#import "WebRTC/RTCVideoFrame.h"
-#import "WebRTC/RTCVideoFrameBuffer.h"
-
-#include "webrtc/api/video/i420_buffer.h"
-#include "webrtc/sdk/objc/Framework/Classes/Video/objc_frame_buffer.h"
-
-namespace webrtc {
-
-ObjcVideoTrackSource::ObjcVideoTrackSource() {}
-
-void ObjcVideoTrackSource::OnOutputFormatRequest(int width, int height, int fps) {
-  cricket::VideoFormat format(width, height, cricket::VideoFormat::FpsToInterval(fps), 0);
-  video_adapter()->OnOutputFormatRequest(format);
-}
-
-void ObjcVideoTrackSource::OnCapturedFrame(RTCVideoFrame* frame) {
-  const int64_t timestamp_us = frame.timeStampNs / rtc::kNumNanosecsPerMicrosec;
-  const int64_t translated_timestamp_us =
-      timestamp_aligner_.TranslateTimestamp(timestamp_us, rtc::TimeMicros());
-
-  int adapted_width;
-  int adapted_height;
-  int crop_width;
-  int crop_height;
-  int crop_x;
-  int crop_y;
-  if (!AdaptFrame(frame.width, frame.height, timestamp_us, &adapted_width, &adapted_height,
-                  &crop_width, &crop_height, &crop_x, &crop_y)) {
-    return;
-  }
-
-  rtc::scoped_refptr<VideoFrameBuffer> buffer;
-  if (adapted_width == frame.width && adapted_height == frame.height) {
-    // No adaption - optimized path.
-    buffer = new rtc::RefCountedObject<ObjCFrameBuffer>(frame.buffer);
-  } else if ([frame.buffer isKindOfClass:[RTCCVPixelBuffer class]]) {
-    // Adapted CVPixelBuffer frame.
-    RTCCVPixelBuffer *rtcPixelBuffer = (RTCCVPixelBuffer *)frame.buffer;
-    buffer = new rtc::RefCountedObject<ObjCFrameBuffer>([[RTCCVPixelBuffer alloc]
-        initWithPixelBuffer:rtcPixelBuffer.pixelBuffer
-               adaptedWidth:adapted_width
-              adaptedHeight:adapted_height
-                  cropWidth:crop_width
-                 cropHeight:crop_height
-                      cropX:crop_x + rtcPixelBuffer.cropX
-                      cropY:crop_y + rtcPixelBuffer.cropY]);
-  } else {
-    // Adapted I420 frame.
-    // TODO(magjed): Optimize this I420 path.
-    rtc::scoped_refptr<I420Buffer> i420_buffer = I420Buffer::Create(adapted_width, adapted_height);
-    buffer = new rtc::RefCountedObject<ObjCFrameBuffer>(frame.buffer);
-    i420_buffer->CropAndScaleFrom(*buffer->ToI420(), crop_x, crop_y, crop_width, crop_height);
-    buffer = i420_buffer;
-  }
-
-  // Applying rotation is only supported for legacy reasons and performance is
-  // not critical here.
-  webrtc::VideoRotation rotation = static_cast<webrtc::VideoRotation>(frame.rotation);
-  if (apply_rotation() && rotation != kVideoRotation_0) {
-    buffer = I420Buffer::Rotate(*buffer->ToI420(), rotation);
-    rotation = kVideoRotation_0;
-  }
-
-  OnFrame(webrtc::VideoFrame(buffer, rotation, translated_timestamp_us));
-}
-
-}  // namespace webrtc
diff --git a/sdk/objc/Framework/Classes/VideoToolbox/RTCVideoDecoderH264.mm b/sdk/objc/Framework/Classes/VideoToolbox/RTCVideoDecoderH264.mm
deleted file mode 100644
index b19cb43..0000000
--- a/sdk/objc/Framework/Classes/VideoToolbox/RTCVideoDecoderH264.mm
+++ /dev/null
@@ -1,262 +0,0 @@
-/*
- *  Copyright (c) 2015 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.
- *
- */
-
-#import "WebRTC/RTCVideoCodecH264.h"
-
-#import <VideoToolbox/VideoToolbox.h>
-
-#include "webrtc/modules/video_coding/include/video_error_codes.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/timeutils.h"
-#include "webrtc/sdk/objc/Framework/Classes/VideoToolbox/nalu_rewriter.h"
-
-#import "WebRTC/RTCVideoFrame.h"
-#import "WebRTC/RTCVideoFrameBuffer.h"
-#import "helpers.h"
-
-#if defined(WEBRTC_IOS)
-#import "Common/RTCUIApplicationStatusObserver.h"
-#endif
-
-// Struct that we pass to the decoder per frame to decode. We receive it again
-// in the decoder callback.
-struct RTCFrameDecodeParams {
-  RTCFrameDecodeParams(RTCVideoDecoderCallback cb, int64_t ts) : callback(cb), timestamp(ts) {}
-  RTCVideoDecoderCallback callback;
-  int64_t timestamp;
-};
-
-// This is the callback function that VideoToolbox calls when decode is
-// complete.
-void decompressionOutputCallback(void *decoder,
-                                 void *params,
-                                 OSStatus status,
-                                 VTDecodeInfoFlags infoFlags,
-                                 CVImageBufferRef imageBuffer,
-                                 CMTime timestamp,
-                                 CMTime duration) {
-  std::unique_ptr<RTCFrameDecodeParams> decodeParams(
-      reinterpret_cast<RTCFrameDecodeParams *>(params));
-  if (status != noErr) {
-    LOG(LS_ERROR) << "Failed to decode frame. Status: " << status;
-    return;
-  }
-  // TODO(tkchin): Handle CVO properly.
-  RTCCVPixelBuffer *frameBuffer = [[RTCCVPixelBuffer alloc] initWithPixelBuffer:imageBuffer];
-  RTCVideoFrame *decodedFrame =
-      [[RTCVideoFrame alloc] initWithBuffer:frameBuffer
-                                   rotation:RTCVideoRotation_0
-                                timeStampNs:CMTimeGetSeconds(timestamp) * rtc::kNumNanosecsPerSec];
-  decodedFrame.timeStamp = decodeParams->timestamp;
-  decodeParams->callback(decodedFrame);
-}
-
-// Decoder.
-@implementation RTCVideoDecoderH264 {
-  CMVideoFormatDescriptionRef _videoFormat;
-  VTDecompressionSessionRef _decompressionSession;
-  RTCVideoDecoderCallback _callback;
-}
-
-- (instancetype)init {
-  if (self = [super init]) {
-#if defined(WEBRTC_IOS)
-    [RTCUIApplicationStatusObserver prepareForUse];
-#endif
-  }
-
-  return self;
-}
-
-- (void)dealloc {
-  [self destroyDecompressionSession];
-  [self setVideoFormat:nullptr];
-}
-
-- (NSInteger)startDecodeWithSettings:(RTCVideoEncoderSettings *)settings
-                       numberOfCores:(int)numberOfCores {
-  return WEBRTC_VIDEO_CODEC_OK;
-}
-
-- (NSInteger)decode:(RTCEncodedImage *)inputImage
-          missingFrames:(BOOL)missingFrames
-    fragmentationHeader:(RTCRtpFragmentationHeader *)fragmentationHeader
-      codecSpecificInfo:(__nullable id<RTCCodecSpecificInfo>)info
-           renderTimeMs:(int64_t)renderTimeMs {
-  RTC_DCHECK(inputImage.buffer);
-
-#if defined(WEBRTC_IOS)
-  if (![[RTCUIApplicationStatusObserver sharedInstance] isApplicationActive]) {
-    // Ignore all decode requests when app isn't active. In this state, the
-    // hardware decoder has been invalidated by the OS.
-    // Reset video format so that we won't process frames until the next
-    // keyframe.
-    [self setVideoFormat:nullptr];
-    return WEBRTC_VIDEO_CODEC_NO_OUTPUT;
-  }
-#endif
-  CMVideoFormatDescriptionRef inputFormat = nullptr;
-  if (webrtc::H264AnnexBBufferHasVideoFormatDescription((uint8_t *)inputImage.buffer.bytes,
-                                                        inputImage.buffer.length)) {
-    inputFormat = webrtc::CreateVideoFormatDescription((uint8_t *)inputImage.buffer.bytes,
-                                                       inputImage.buffer.length);
-    if (inputFormat) {
-      // Check if the video format has changed, and reinitialize decoder if
-      // needed.
-      if (!CMFormatDescriptionEqual(inputFormat, _videoFormat)) {
-        [self setVideoFormat:inputFormat];
-        [self resetDecompressionSession];
-      }
-      CFRelease(inputFormat);
-    }
-  }
-  if (!_videoFormat) {
-    // We received a frame but we don't have format information so we can't
-    // decode it.
-    // This can happen after backgrounding. We need to wait for the next
-    // sps/pps before we can resume so we request a keyframe by returning an
-    // error.
-    LOG(LS_WARNING) << "Missing video format. Frame with sps/pps required.";
-    return WEBRTC_VIDEO_CODEC_ERROR;
-  }
-  CMSampleBufferRef sampleBuffer = nullptr;
-  if (!webrtc::H264AnnexBBufferToCMSampleBuffer((uint8_t *)inputImage.buffer.bytes,
-                                                inputImage.buffer.length,
-                                                _videoFormat,
-                                                &sampleBuffer)) {
-    return WEBRTC_VIDEO_CODEC_ERROR;
-  }
-  RTC_DCHECK(sampleBuffer);
-  VTDecodeFrameFlags decodeFlags = kVTDecodeFrame_EnableAsynchronousDecompression;
-  std::unique_ptr<RTCFrameDecodeParams> frameDecodeParams;
-  frameDecodeParams.reset(new RTCFrameDecodeParams(_callback, inputImage.timeStamp));
-  OSStatus status = VTDecompressionSessionDecodeFrame(
-      _decompressionSession, sampleBuffer, decodeFlags, frameDecodeParams.release(), nullptr);
-#if defined(WEBRTC_IOS)
-  // Re-initialize the decoder if we have an invalid session while the app is
-  // active and retry the decode request.
-  if (status == kVTInvalidSessionErr && [self resetDecompressionSession] == WEBRTC_VIDEO_CODEC_OK) {
-    frameDecodeParams.reset(new RTCFrameDecodeParams(_callback, inputImage.timeStamp));
-    status = VTDecompressionSessionDecodeFrame(
-        _decompressionSession, sampleBuffer, decodeFlags, frameDecodeParams.release(), nullptr);
-  }
-#endif
-  CFRelease(sampleBuffer);
-  if (status != noErr) {
-    LOG(LS_ERROR) << "Failed to decode frame with code: " << status;
-    return WEBRTC_VIDEO_CODEC_ERROR;
-  }
-  return WEBRTC_VIDEO_CODEC_OK;
-}
-
-- (void)setCallback:(RTCVideoDecoderCallback)callback {
-  _callback = callback;
-}
-
-- (NSInteger)releaseDecoder {
-  // Need to invalidate the session so that callbacks no longer occur and it
-  // is safe to null out the callback.
-  [self destroyDecompressionSession];
-  [self setVideoFormat:nullptr];
-  _callback = nullptr;
-  return WEBRTC_VIDEO_CODEC_OK;
-}
-
-#pragma mark - Private
-
-- (int)resetDecompressionSession {
-  [self destroyDecompressionSession];
-
-  // Need to wait for the first SPS to initialize decoder.
-  if (!_videoFormat) {
-    return WEBRTC_VIDEO_CODEC_OK;
-  }
-
-  // Set keys for OpenGL and IOSurface compatibilty, which makes the encoder
-  // create pixel buffers with GPU backed memory. The intent here is to pass
-  // the pixel buffers directly so we avoid a texture upload later during
-  // rendering. This currently is moot because we are converting back to an
-  // I420 frame after decode, but eventually we will be able to plumb
-  // CVPixelBuffers directly to the renderer.
-  // TODO(tkchin): Maybe only set OpenGL/IOSurface keys if we know that that
-  // we can pass CVPixelBuffers as native handles in decoder output.
-  static size_t const attributesSize = 3;
-  CFTypeRef keys[attributesSize] = {
-#if defined(WEBRTC_IOS)
-    kCVPixelBufferOpenGLESCompatibilityKey,
-#elif defined(WEBRTC_MAC)
-    kCVPixelBufferOpenGLCompatibilityKey,
-#endif
-    kCVPixelBufferIOSurfacePropertiesKey,
-    kCVPixelBufferPixelFormatTypeKey
-  };
-  CFDictionaryRef ioSurfaceValue = CreateCFTypeDictionary(nullptr, nullptr, 0);
-  int64_t nv12type = kCVPixelFormatType_420YpCbCr8BiPlanarFullRange;
-  CFNumberRef pixelFormat = CFNumberCreate(nullptr, kCFNumberLongType, &nv12type);
-  CFTypeRef values[attributesSize] = {kCFBooleanTrue, ioSurfaceValue, pixelFormat};
-  CFDictionaryRef attributes = CreateCFTypeDictionary(keys, values, attributesSize);
-  if (ioSurfaceValue) {
-    CFRelease(ioSurfaceValue);
-    ioSurfaceValue = nullptr;
-  }
-  if (pixelFormat) {
-    CFRelease(pixelFormat);
-    pixelFormat = nullptr;
-  }
-  VTDecompressionOutputCallbackRecord record = {
-      decompressionOutputCallback, nullptr,
-  };
-  OSStatus status = VTDecompressionSessionCreate(
-      nullptr, _videoFormat, nullptr, attributes, &record, &_decompressionSession);
-  CFRelease(attributes);
-  if (status != noErr) {
-    [self destroyDecompressionSession];
-    return WEBRTC_VIDEO_CODEC_ERROR;
-  }
-  [self configureDecompressionSession];
-
-  return WEBRTC_VIDEO_CODEC_OK;
-}
-
-- (void)configureDecompressionSession {
-  RTC_DCHECK(_decompressionSession);
-#if defined(WEBRTC_IOS)
-  VTSessionSetProperty(_decompressionSession, kVTDecompressionPropertyKey_RealTime, kCFBooleanTrue);
-#endif
-}
-
-- (void)destroyDecompressionSession {
-  if (_decompressionSession) {
-    VTDecompressionSessionInvalidate(_decompressionSession);
-    CFRelease(_decompressionSession);
-    _decompressionSession = nullptr;
-  }
-}
-
-- (void)setVideoFormat:(CMVideoFormatDescriptionRef)videoFormat {
-  if (_videoFormat == videoFormat) {
-    return;
-  }
-  if (_videoFormat) {
-    CFRelease(_videoFormat);
-  }
-  _videoFormat = videoFormat;
-  if (_videoFormat) {
-    CFRetain(_videoFormat);
-  }
-}
-
-- (NSString *)implementationName {
-  return @"VideoToolbox";
-}
-
-@end
diff --git a/sdk/objc/Framework/Classes/VideoToolbox/RTCVideoEncoderH264.mm b/sdk/objc/Framework/Classes/VideoToolbox/RTCVideoEncoderH264.mm
deleted file mode 100644
index 6e2b568..0000000
--- a/sdk/objc/Framework/Classes/VideoToolbox/RTCVideoEncoderH264.mm
+++ /dev/null
@@ -1,713 +0,0 @@
-/*
- *  Copyright (c) 2015 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.
- *
- */
-
-#import "WebRTC/RTCVideoCodecH264.h"
-
-#import <VideoToolbox/VideoToolbox.h>
-#include <vector>
-
-#if defined(WEBRTC_IOS)
-#import "Common/RTCUIApplicationStatusObserver.h"
-#import "WebRTC/UIDevice+RTCDevice.h"
-#endif
-#import "PeerConnection/RTCVideoCodec+Private.h"
-#import "WebRTC/RTCVideoCodec.h"
-#import "WebRTC/RTCVideoFrame.h"
-#import "WebRTC/RTCVideoFrameBuffer.h"
-#import "helpers.h"
-#include "libyuv/convert_from.h"
-#include "webrtc/common_video/h264/h264_bitstream_parser.h"
-#include "webrtc/common_video/h264/profile_level_id.h"
-#include "webrtc/common_video/include/bitrate_adjuster.h"
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/modules/video_coding/include/video_error_codes.h"
-#include "webrtc/rtc_base/buffer.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/timeutils.h"
-#include "webrtc/sdk/objc/Framework/Classes/VideoToolbox/nalu_rewriter.h"
-#include "webrtc/system_wrappers/include/clock.h"
-
-@interface RTCVideoEncoderH264 ()
-
-- (void)frameWasEncoded:(OSStatus)status
-                  flags:(VTEncodeInfoFlags)infoFlags
-           sampleBuffer:(CMSampleBufferRef)sampleBuffer
-      codecSpecificInfo:(id<RTCCodecSpecificInfo>)codecSpecificInfo
-                  width:(int32_t)width
-                 height:(int32_t)height
-           renderTimeMs:(int64_t)renderTimeMs
-              timestamp:(uint32_t)timestamp
-               rotation:(RTCVideoRotation)rotation;
-
-@end
-
-// The ratio between kVTCompressionPropertyKey_DataRateLimits and
-// kVTCompressionPropertyKey_AverageBitRate. The data rate limit is set higher
-// than the average bit rate to avoid undershooting the target.
-const float kLimitToAverageBitRateFactor = 1.5f;
-// These thresholds deviate from the default h264 QP thresholds, as they
-// have been found to work better on devices that support VideoToolbox
-const int kLowH264QpThreshold = 28;
-const int kHighH264QpThreshold = 39;
-
-// Struct that we pass to the encoder per frame to encode. We receive it again
-// in the encoder callback.
-struct RTCFrameEncodeParams {
-  RTCFrameEncodeParams(RTCVideoEncoderH264 *e,
-                       RTCCodecSpecificInfoH264 *csi,
-                       int32_t w,
-                       int32_t h,
-                       int64_t rtms,
-                       uint32_t ts,
-                       RTCVideoRotation r)
-      : encoder(e), width(w), height(h), render_time_ms(rtms), timestamp(ts), rotation(r) {
-    if (csi) {
-      codecSpecificInfo = csi;
-    } else {
-      codecSpecificInfo = [[RTCCodecSpecificInfoH264 alloc] init];
-    }
-  }
-
-  RTCVideoEncoderH264 *encoder;
-  RTCCodecSpecificInfoH264 *codecSpecificInfo;
-  int32_t width;
-  int32_t height;
-  int64_t render_time_ms;
-  uint32_t timestamp;
-  RTCVideoRotation rotation;
-};
-
-// We receive I420Frames as input, but we need to feed CVPixelBuffers into the
-// encoder. This performs the copy and format conversion.
-// TODO(tkchin): See if encoder will accept i420 frames and compare performance.
-bool CopyVideoFrameToPixelBuffer(id<RTCI420Buffer> frameBuffer, CVPixelBufferRef pixelBuffer) {
-  RTC_DCHECK(pixelBuffer);
-  RTC_DCHECK_EQ(CVPixelBufferGetPixelFormatType(pixelBuffer),
-                kCVPixelFormatType_420YpCbCr8BiPlanarFullRange);
-  RTC_DCHECK_EQ(CVPixelBufferGetHeightOfPlane(pixelBuffer, 0), frameBuffer.height);
-  RTC_DCHECK_EQ(CVPixelBufferGetWidthOfPlane(pixelBuffer, 0), frameBuffer.width);
-
-  CVReturn cvRet = CVPixelBufferLockBaseAddress(pixelBuffer, 0);
-  if (cvRet != kCVReturnSuccess) {
-    LOG(LS_ERROR) << "Failed to lock base address: " << cvRet;
-    return false;
-  }
-  uint8_t *dstY = reinterpret_cast<uint8_t *>(CVPixelBufferGetBaseAddressOfPlane(pixelBuffer, 0));
-  int dstStrideY = CVPixelBufferGetBytesPerRowOfPlane(pixelBuffer, 0);
-  uint8_t *dstUV = reinterpret_cast<uint8_t *>(CVPixelBufferGetBaseAddressOfPlane(pixelBuffer, 1));
-  int dstStrideUV = CVPixelBufferGetBytesPerRowOfPlane(pixelBuffer, 1);
-  // Convert I420 to NV12.
-  int ret = libyuv::I420ToNV12(frameBuffer.dataY,
-                               frameBuffer.strideY,
-                               frameBuffer.dataU,
-                               frameBuffer.strideU,
-                               frameBuffer.dataV,
-                               frameBuffer.strideV,
-                               dstY,
-                               dstStrideY,
-                               dstUV,
-                               dstStrideUV,
-                               frameBuffer.width,
-                               frameBuffer.height);
-  CVPixelBufferUnlockBaseAddress(pixelBuffer, 0);
-  if (ret) {
-    LOG(LS_ERROR) << "Error converting I420 VideoFrame to NV12 :" << ret;
-    return false;
-  }
-  return true;
-}
-
-CVPixelBufferRef CreatePixelBuffer(CVPixelBufferPoolRef pixel_buffer_pool) {
-  if (!pixel_buffer_pool) {
-    LOG(LS_ERROR) << "Failed to get pixel buffer pool.";
-    return nullptr;
-  }
-  CVPixelBufferRef pixel_buffer;
-  CVReturn ret = CVPixelBufferPoolCreatePixelBuffer(nullptr, pixel_buffer_pool, &pixel_buffer);
-  if (ret != kCVReturnSuccess) {
-    LOG(LS_ERROR) << "Failed to create pixel buffer: " << ret;
-    // We probably want to drop frames here, since failure probably means
-    // that the pool is empty.
-    return nullptr;
-  }
-  return pixel_buffer;
-}
-
-// This is the callback function that VideoToolbox calls when encode is
-// complete. From inspection this happens on its own queue.
-void compressionOutputCallback(void *encoder,
-                               void *params,
-                               OSStatus status,
-                               VTEncodeInfoFlags infoFlags,
-                               CMSampleBufferRef sampleBuffer) {
-  RTC_CHECK(params);
-  std::unique_ptr<RTCFrameEncodeParams> encodeParams(
-      reinterpret_cast<RTCFrameEncodeParams *>(params));
-  RTC_CHECK(encodeParams->encoder);
-  [encodeParams->encoder frameWasEncoded:status
-                                   flags:infoFlags
-                            sampleBuffer:sampleBuffer
-                       codecSpecificInfo:encodeParams->codecSpecificInfo
-                                   width:encodeParams->width
-                                  height:encodeParams->height
-                            renderTimeMs:encodeParams->render_time_ms
-                               timestamp:encodeParams->timestamp
-                                rotation:encodeParams->rotation];
-}
-
-// Extract VideoToolbox profile out of the cricket::VideoCodec. If there is no
-// specific VideoToolbox profile for the specified level, AutoLevel will be
-// returned. The user must initialize the encoder with a resolution and
-// framerate conforming to the selected H264 level regardless.
-CFStringRef ExtractProfile(const cricket::VideoCodec &codec) {
-  const rtc::Optional<webrtc::H264::ProfileLevelId> profile_level_id =
-      webrtc::H264::ParseSdpProfileLevelId(codec.params);
-  RTC_DCHECK(profile_level_id);
-  switch (profile_level_id->profile) {
-    case webrtc::H264::kProfileConstrainedBaseline:
-    case webrtc::H264::kProfileBaseline:
-      switch (profile_level_id->level) {
-        case webrtc::H264::kLevel3:
-          return kVTProfileLevel_H264_Baseline_3_0;
-        case webrtc::H264::kLevel3_1:
-          return kVTProfileLevel_H264_Baseline_3_1;
-        case webrtc::H264::kLevel3_2:
-          return kVTProfileLevel_H264_Baseline_3_2;
-        case webrtc::H264::kLevel4:
-          return kVTProfileLevel_H264_Baseline_4_0;
-        case webrtc::H264::kLevel4_1:
-          return kVTProfileLevel_H264_Baseline_4_1;
-        case webrtc::H264::kLevel4_2:
-          return kVTProfileLevel_H264_Baseline_4_2;
-        case webrtc::H264::kLevel5:
-          return kVTProfileLevel_H264_Baseline_5_0;
-        case webrtc::H264::kLevel5_1:
-          return kVTProfileLevel_H264_Baseline_5_1;
-        case webrtc::H264::kLevel5_2:
-          return kVTProfileLevel_H264_Baseline_5_2;
-        case webrtc::H264::kLevel1:
-        case webrtc::H264::kLevel1_b:
-        case webrtc::H264::kLevel1_1:
-        case webrtc::H264::kLevel1_2:
-        case webrtc::H264::kLevel1_3:
-        case webrtc::H264::kLevel2:
-        case webrtc::H264::kLevel2_1:
-        case webrtc::H264::kLevel2_2:
-          return kVTProfileLevel_H264_Baseline_AutoLevel;
-      }
-
-    case webrtc::H264::kProfileMain:
-      switch (profile_level_id->level) {
-        case webrtc::H264::kLevel3:
-          return kVTProfileLevel_H264_Main_3_0;
-        case webrtc::H264::kLevel3_1:
-          return kVTProfileLevel_H264_Main_3_1;
-        case webrtc::H264::kLevel3_2:
-          return kVTProfileLevel_H264_Main_3_2;
-        case webrtc::H264::kLevel4:
-          return kVTProfileLevel_H264_Main_4_0;
-        case webrtc::H264::kLevel4_1:
-          return kVTProfileLevel_H264_Main_4_1;
-        case webrtc::H264::kLevel4_2:
-          return kVTProfileLevel_H264_Main_4_2;
-        case webrtc::H264::kLevel5:
-          return kVTProfileLevel_H264_Main_5_0;
-        case webrtc::H264::kLevel5_1:
-          return kVTProfileLevel_H264_Main_5_1;
-        case webrtc::H264::kLevel5_2:
-          return kVTProfileLevel_H264_Main_5_2;
-        case webrtc::H264::kLevel1:
-        case webrtc::H264::kLevel1_b:
-        case webrtc::H264::kLevel1_1:
-        case webrtc::H264::kLevel1_2:
-        case webrtc::H264::kLevel1_3:
-        case webrtc::H264::kLevel2:
-        case webrtc::H264::kLevel2_1:
-        case webrtc::H264::kLevel2_2:
-          return kVTProfileLevel_H264_Main_AutoLevel;
-      }
-
-    case webrtc::H264::kProfileConstrainedHigh:
-    case webrtc::H264::kProfileHigh:
-      switch (profile_level_id->level) {
-        case webrtc::H264::kLevel3:
-          return kVTProfileLevel_H264_High_3_0;
-        case webrtc::H264::kLevel3_1:
-          return kVTProfileLevel_H264_High_3_1;
-        case webrtc::H264::kLevel3_2:
-          return kVTProfileLevel_H264_High_3_2;
-        case webrtc::H264::kLevel4:
-          return kVTProfileLevel_H264_High_4_0;
-        case webrtc::H264::kLevel4_1:
-          return kVTProfileLevel_H264_High_4_1;
-        case webrtc::H264::kLevel4_2:
-          return kVTProfileLevel_H264_High_4_2;
-        case webrtc::H264::kLevel5:
-          return kVTProfileLevel_H264_High_5_0;
-        case webrtc::H264::kLevel5_1:
-          return kVTProfileLevel_H264_High_5_1;
-        case webrtc::H264::kLevel5_2:
-          return kVTProfileLevel_H264_High_5_2;
-        case webrtc::H264::kLevel1:
-        case webrtc::H264::kLevel1_b:
-        case webrtc::H264::kLevel1_1:
-        case webrtc::H264::kLevel1_2:
-        case webrtc::H264::kLevel1_3:
-        case webrtc::H264::kLevel2:
-        case webrtc::H264::kLevel2_1:
-        case webrtc::H264::kLevel2_2:
-          return kVTProfileLevel_H264_High_AutoLevel;
-      }
-  }
-}
-
-@implementation RTCVideoEncoderH264 {
-  RTCVideoCodecInfo *_codecInfo;
-  webrtc::BitrateAdjuster *_bitrateAdjuster;
-  uint32_t _targetBitrateBps;
-  uint32_t _encoderBitrateBps;
-  RTCH264PacketizationMode _packetizationMode;
-  CFStringRef _profile;
-  RTCVideoEncoderCallback _callback;
-  int32_t _width;
-  int32_t _height;
-  VTCompressionSessionRef _compressionSession;
-  RTCVideoCodecMode _mode;
-
-  webrtc::H264BitstreamParser _h264BitstreamParser;
-  std::vector<uint8_t> _nv12ScaleBuffer;
-}
-
-// .5 is set as a mininum to prevent overcompensating for large temporary
-// overshoots. We don't want to degrade video quality too badly.
-// .95 is set to prevent oscillations. When a lower bitrate is set on the
-// encoder than previously set, its output seems to have a brief period of
-// drastically reduced bitrate, so we want to avoid that. In steady state
-// conditions, 0.95 seems to give us better overall bitrate over long periods
-// of time.
-- (instancetype)initWithCodecInfo:(RTCVideoCodecInfo *)codecInfo {
-  if (self = [super init]) {
-    _codecInfo = codecInfo;
-    _bitrateAdjuster = new webrtc::BitrateAdjuster(webrtc::Clock::GetRealTimeClock(), .5, .95);
-    _packetizationMode = RTCH264PacketizationModeNonInterleaved;
-    _profile = ExtractProfile([codecInfo nativeVideoCodec]);
-    LOG(LS_INFO) << "Using profile " << CFStringToString(_profile);
-    RTC_CHECK([codecInfo.name isEqualToString:@"H264"]);
-
-#if defined(WEBRTC_IOS)
-    [RTCUIApplicationStatusObserver prepareForUse];
-#endif
-  }
-  return self;
-}
-
-- (void)dealloc {
-  [self destroyCompressionSession];
-}
-
-- (NSInteger)startEncodeWithSettings:(RTCVideoEncoderSettings *)settings
-                       numberOfCores:(int)numberOfCores {
-  RTC_DCHECK(settings);
-  RTC_DCHECK([settings.name isEqualToString:@"H264"]);
-
-  _width = settings.width;
-  _height = settings.height;
-  _mode = settings.mode;
-
-  // We can only set average bitrate on the HW encoder.
-  _targetBitrateBps = settings.startBitrate;
-  _bitrateAdjuster->SetTargetBitrateBps(_targetBitrateBps);
-
-  // TODO(tkchin): Try setting payload size via
-  // kVTCompressionPropertyKey_MaxH264SliceBytes.
-
-  return [self resetCompressionSession];
-}
-
-- (NSInteger)encode:(RTCVideoFrame *)frame
-    codecSpecificInfo:(id<RTCCodecSpecificInfo>)codecSpecificInfo
-           frameTypes:(NSArray<NSNumber *> *)frameTypes {
-  RTC_DCHECK_EQ(frame.width, _width);
-  RTC_DCHECK_EQ(frame.height, _height);
-  if (!_callback || !_compressionSession) {
-    return WEBRTC_VIDEO_CODEC_UNINITIALIZED;
-  }
-#if defined(WEBRTC_IOS)
-  if (![[RTCUIApplicationStatusObserver sharedInstance] isApplicationActive]) {
-    // Ignore all encode requests when app isn't active. In this state, the
-    // hardware encoder has been invalidated by the OS.
-    return WEBRTC_VIDEO_CODEC_OK;
-  }
-#endif
-  BOOL isKeyframeRequired = NO;
-
-  // Get a pixel buffer from the pool and copy frame data over.
-  CVPixelBufferPoolRef pixelBufferPool =
-      VTCompressionSessionGetPixelBufferPool(_compressionSession);
-
-#if defined(WEBRTC_IOS)
-  if (!pixelBufferPool) {
-    // Kind of a hack. On backgrounding, the compression session seems to get
-    // invalidated, which causes this pool call to fail when the application
-    // is foregrounded and frames are being sent for encoding again.
-    // Resetting the session when this happens fixes the issue.
-    // In addition we request a keyframe so video can recover quickly.
-    [self resetCompressionSession];
-    pixelBufferPool = VTCompressionSessionGetPixelBufferPool(_compressionSession);
-    isKeyframeRequired = YES;
-    LOG(LS_INFO) << "Resetting compression session due to invalid pool.";
-  }
-#endif
-
-  CVPixelBufferRef pixelBuffer = nullptr;
-  if ([frame.buffer isKindOfClass:[RTCCVPixelBuffer class]]) {
-    // Native frame buffer
-    RTCCVPixelBuffer *rtcPixelBuffer = (RTCCVPixelBuffer *)frame.buffer;
-    if (![rtcPixelBuffer requiresCropping]) {
-      // This pixel buffer might have a higher resolution than what the
-      // compression session is configured to. The compression session can
-      // handle that and will output encoded frames in the configured
-      // resolution regardless of the input pixel buffer resolution.
-      pixelBuffer = rtcPixelBuffer.pixelBuffer;
-      CVBufferRetain(pixelBuffer);
-    } else {
-      // Cropping required, we need to crop and scale to a new pixel buffer.
-      pixelBuffer = CreatePixelBuffer(pixelBufferPool);
-      if (!pixelBuffer) {
-        return WEBRTC_VIDEO_CODEC_ERROR;
-      }
-      int dstWidth = CVPixelBufferGetWidth(pixelBuffer);
-      int dstHeight = CVPixelBufferGetHeight(pixelBuffer);
-      if ([rtcPixelBuffer requiresScalingToWidth:dstWidth height:dstHeight]) {
-        int size =
-            [rtcPixelBuffer bufferSizeForCroppingAndScalingToWidth:dstWidth height:dstHeight];
-        _nv12ScaleBuffer.resize(size);
-      } else {
-        _nv12ScaleBuffer.clear();
-      }
-      _nv12ScaleBuffer.shrink_to_fit();
-      if (![rtcPixelBuffer cropAndScaleTo:pixelBuffer withTempBuffer:_nv12ScaleBuffer.data()]) {
-        return WEBRTC_VIDEO_CODEC_ERROR;
-      }
-    }
-  }
-
-  if (!pixelBuffer) {
-    // We did not have a native frame buffer
-    pixelBuffer = CreatePixelBuffer(pixelBufferPool);
-    if (!pixelBuffer) {
-      return WEBRTC_VIDEO_CODEC_ERROR;
-    }
-    RTC_DCHECK(pixelBuffer);
-    if (!CopyVideoFrameToPixelBuffer([frame.buffer toI420], pixelBuffer)) {
-      LOG(LS_ERROR) << "Failed to copy frame data.";
-      CVBufferRelease(pixelBuffer);
-      return WEBRTC_VIDEO_CODEC_ERROR;
-    }
-  }
-
-  // Check if we need a keyframe.
-  if (!isKeyframeRequired && frameTypes) {
-    for (NSNumber *frameType in frameTypes) {
-      if ((RTCFrameType)frameType.intValue == RTCFrameTypeVideoFrameKey) {
-        isKeyframeRequired = YES;
-        break;
-      }
-    }
-  }
-
-  CMTime presentationTimeStamp = CMTimeMake(frame.timeStampNs / rtc::kNumNanosecsPerMillisec, 1000);
-  CFDictionaryRef frameProperties = nullptr;
-  if (isKeyframeRequired) {
-    CFTypeRef keys[] = {kVTEncodeFrameOptionKey_ForceKeyFrame};
-    CFTypeRef values[] = {kCFBooleanTrue};
-    frameProperties = CreateCFTypeDictionary(keys, values, 1);
-  }
-
-  std::unique_ptr<RTCFrameEncodeParams> encodeParams;
-  encodeParams.reset(new RTCFrameEncodeParams(self,
-                                              codecSpecificInfo,
-                                              _width,
-                                              _height,
-                                              frame.timeStampNs / rtc::kNumNanosecsPerMillisec,
-                                              frame.timeStamp,
-                                              frame.rotation));
-  encodeParams->codecSpecificInfo.packetizationMode = _packetizationMode;
-
-  // Update the bitrate if needed.
-  [self setBitrateBps:_bitrateAdjuster->GetAdjustedBitrateBps()];
-
-  OSStatus status = VTCompressionSessionEncodeFrame(_compressionSession,
-                                                    pixelBuffer,
-                                                    presentationTimeStamp,
-                                                    kCMTimeInvalid,
-                                                    frameProperties,
-                                                    encodeParams.release(),
-                                                    nullptr);
-  if (frameProperties) {
-    CFRelease(frameProperties);
-  }
-  if (pixelBuffer) {
-    CVBufferRelease(pixelBuffer);
-  }
-  if (status != noErr) {
-    LOG(LS_ERROR) << "Failed to encode frame with code: " << status;
-    return WEBRTC_VIDEO_CODEC_ERROR;
-  }
-  return WEBRTC_VIDEO_CODEC_OK;
-}
-
-- (void)setCallback:(RTCVideoEncoderCallback)callback {
-  _callback = callback;
-}
-
-- (int)setBitrate:(uint32_t)bitrateKbit framerate:(uint32_t)framerate {
-  _targetBitrateBps = 1000 * bitrateKbit;
-  _bitrateAdjuster->SetTargetBitrateBps(_targetBitrateBps);
-  [self setBitrateBps:_bitrateAdjuster->GetAdjustedBitrateBps()];
-  return WEBRTC_VIDEO_CODEC_OK;
-}
-
-#pragma mark - Private
-
-- (NSInteger)releaseEncoder {
-  // Need to destroy so that the session is invalidated and won't use the
-  // callback anymore. Do not remove callback until the session is invalidated
-  // since async encoder callbacks can occur until invalidation.
-  [self destroyCompressionSession];
-  _callback = nullptr;
-  return WEBRTC_VIDEO_CODEC_OK;
-}
-
-- (int)resetCompressionSession {
-  [self destroyCompressionSession];
-
-  // Set source image buffer attributes. These attributes will be present on
-  // buffers retrieved from the encoder's pixel buffer pool.
-  const size_t attributesSize = 3;
-  CFTypeRef keys[attributesSize] = {
-#if defined(WEBRTC_IOS)
-    kCVPixelBufferOpenGLESCompatibilityKey,
-#elif defined(WEBRTC_MAC)
-    kCVPixelBufferOpenGLCompatibilityKey,
-#endif
-    kCVPixelBufferIOSurfacePropertiesKey,
-    kCVPixelBufferPixelFormatTypeKey
-  };
-  CFDictionaryRef ioSurfaceValue = CreateCFTypeDictionary(nullptr, nullptr, 0);
-  int64_t nv12type = kCVPixelFormatType_420YpCbCr8BiPlanarFullRange;
-  CFNumberRef pixelFormat = CFNumberCreate(nullptr, kCFNumberLongType, &nv12type);
-  CFTypeRef values[attributesSize] = {kCFBooleanTrue, ioSurfaceValue, pixelFormat};
-  CFDictionaryRef sourceAttributes = CreateCFTypeDictionary(keys, values, attributesSize);
-  if (ioSurfaceValue) {
-    CFRelease(ioSurfaceValue);
-    ioSurfaceValue = nullptr;
-  }
-  if (pixelFormat) {
-    CFRelease(pixelFormat);
-    pixelFormat = nullptr;
-  }
-  CFMutableDictionaryRef encoder_specs = nullptr;
-#if defined(WEBRTC_MAC) && !defined(WEBRTC_IOS)
-  // Currently hw accl is supported above 360p on mac, below 360p
-  // the compression session will be created with hw accl disabled.
-  encoder_specs = CFDictionaryCreateMutable(
-      nullptr, 1, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
-  CFDictionarySetValue(encoder_specs,
-                       kVTVideoEncoderSpecification_EnableHardwareAcceleratedVideoEncoder,
-                       kCFBooleanTrue);
-#endif
-  OSStatus status =
-      VTCompressionSessionCreate(nullptr,  // use default allocator
-                                 _width,
-                                 _height,
-                                 kCMVideoCodecType_H264,
-                                 encoder_specs,  // use hardware accelerated encoder if available
-                                 sourceAttributes,
-                                 nullptr,  // use default compressed data allocator
-                                 compressionOutputCallback,
-                                 nullptr,
-                                 &_compressionSession);
-  if (sourceAttributes) {
-    CFRelease(sourceAttributes);
-    sourceAttributes = nullptr;
-  }
-  if (encoder_specs) {
-    CFRelease(encoder_specs);
-    encoder_specs = nullptr;
-  }
-  if (status != noErr) {
-    LOG(LS_ERROR) << "Failed to create compression session: " << status;
-    return WEBRTC_VIDEO_CODEC_ERROR;
-  }
-#if defined(WEBRTC_MAC) && !defined(WEBRTC_IOS)
-  CFBooleanRef hwaccl_enabled = nullptr;
-  status = VTSessionCopyProperty(_compressionSession,
-                                 kVTCompressionPropertyKey_UsingHardwareAcceleratedVideoEncoder,
-                                 nullptr,
-                                 &hwaccl_enabled);
-  if (status == noErr && (CFBooleanGetValue(hwaccl_enabled))) {
-    LOG(LS_INFO) << "Compression session created with hw accl enabled";
-  } else {
-    LOG(LS_INFO) << "Compression session created with hw accl disabled";
-  }
-#endif
-  [self configureCompressionSession];
-  return WEBRTC_VIDEO_CODEC_OK;
-}
-
-- (void)configureCompressionSession {
-  RTC_DCHECK(_compressionSession);
-  SetVTSessionProperty(_compressionSession, kVTCompressionPropertyKey_RealTime, true);
-  SetVTSessionProperty(_compressionSession, kVTCompressionPropertyKey_ProfileLevel, _profile);
-  SetVTSessionProperty(_compressionSession, kVTCompressionPropertyKey_AllowFrameReordering, false);
-  [self setEncoderBitrateBps:_targetBitrateBps];
-  // TODO(tkchin): Look at entropy mode and colorspace matrices.
-  // TODO(tkchin): Investigate to see if there's any way to make this work.
-  // May need it to interop with Android. Currently this call just fails.
-  // On inspecting encoder output on iOS8, this value is set to 6.
-  // internal::SetVTSessionProperty(compression_session_,
-  //     kVTCompressionPropertyKey_MaxFrameDelayCount,
-  //     1);
-
-  // Set a relatively large value for keyframe emission (7200 frames or 4 minutes).
-  SetVTSessionProperty(_compressionSession, kVTCompressionPropertyKey_MaxKeyFrameInterval, 7200);
-  SetVTSessionProperty(
-      _compressionSession, kVTCompressionPropertyKey_MaxKeyFrameIntervalDuration, 240);
-}
-
-- (void)destroyCompressionSession {
-  if (_compressionSession) {
-    VTCompressionSessionInvalidate(_compressionSession);
-    CFRelease(_compressionSession);
-    _compressionSession = nullptr;
-  }
-}
-
-- (NSString *)implementationName {
-  return @"VideoToolbox";
-}
-
-- (void)setBitrateBps:(uint32_t)bitrateBps {
-  if (_encoderBitrateBps != bitrateBps) {
-    [self setEncoderBitrateBps:bitrateBps];
-  }
-}
-
-- (void)setEncoderBitrateBps:(uint32_t)bitrateBps {
-  if (_compressionSession) {
-    SetVTSessionProperty(_compressionSession, kVTCompressionPropertyKey_AverageBitRate, bitrateBps);
-
-    // TODO(tkchin): Add a helper method to set array value.
-    int64_t dataLimitBytesPerSecondValue =
-        static_cast<int64_t>(bitrateBps * kLimitToAverageBitRateFactor / 8);
-    CFNumberRef bytesPerSecond =
-        CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt64Type, &dataLimitBytesPerSecondValue);
-    int64_t oneSecondValue = 1;
-    CFNumberRef oneSecond =
-        CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt64Type, &oneSecondValue);
-    const void *nums[2] = {bytesPerSecond, oneSecond};
-    CFArrayRef dataRateLimits = CFArrayCreate(nullptr, nums, 2, &kCFTypeArrayCallBacks);
-    OSStatus status = VTSessionSetProperty(
-        _compressionSession, kVTCompressionPropertyKey_DataRateLimits, dataRateLimits);
-    if (bytesPerSecond) {
-      CFRelease(bytesPerSecond);
-    }
-    if (oneSecond) {
-      CFRelease(oneSecond);
-    }
-    if (dataRateLimits) {
-      CFRelease(dataRateLimits);
-    }
-    if (status != noErr) {
-      LOG(LS_ERROR) << "Failed to set data rate limit";
-    }
-
-    _encoderBitrateBps = bitrateBps;
-  }
-}
-
-- (void)frameWasEncoded:(OSStatus)status
-                  flags:(VTEncodeInfoFlags)infoFlags
-           sampleBuffer:(CMSampleBufferRef)sampleBuffer
-      codecSpecificInfo:(id<RTCCodecSpecificInfo>)codecSpecificInfo
-                  width:(int32_t)width
-                 height:(int32_t)height
-           renderTimeMs:(int64_t)renderTimeMs
-              timestamp:(uint32_t)timestamp
-               rotation:(RTCVideoRotation)rotation {
-  if (status != noErr) {
-    LOG(LS_ERROR) << "H264 encode failed.";
-    return;
-  }
-  if (infoFlags & kVTEncodeInfo_FrameDropped) {
-    LOG(LS_INFO) << "H264 encode dropped frame.";
-    return;
-  }
-
-  BOOL isKeyframe = NO;
-  CFArrayRef attachments = CMSampleBufferGetSampleAttachmentsArray(sampleBuffer, 0);
-  if (attachments != nullptr && CFArrayGetCount(attachments)) {
-    CFDictionaryRef attachment =
-        static_cast<CFDictionaryRef>(CFArrayGetValueAtIndex(attachments, 0));
-    isKeyframe = !CFDictionaryContainsKey(attachment, kCMSampleAttachmentKey_NotSync);
-  }
-
-  if (isKeyframe) {
-    LOG(LS_INFO) << "Generated keyframe";
-  }
-
-  // Convert the sample buffer into a buffer suitable for RTP packetization.
-  // TODO(tkchin): Allocate buffers through a pool.
-  std::unique_ptr<rtc::Buffer> buffer(new rtc::Buffer());
-  RTCRtpFragmentationHeader *header;
-  {
-    std::unique_ptr<webrtc::RTPFragmentationHeader> header_cpp;
-    bool result =
-        H264CMSampleBufferToAnnexBBuffer(sampleBuffer, isKeyframe, buffer.get(), &header_cpp);
-    header = [[RTCRtpFragmentationHeader alloc] initWithNativeFragmentationHeader:header_cpp.get()];
-    if (!result) {
-      return;
-    }
-  }
-
-  RTCEncodedImage *frame = [[RTCEncodedImage alloc] init];
-  frame.buffer = [NSData dataWithBytesNoCopy:buffer->data() length:buffer->size() freeWhenDone:NO];
-  frame.encodedWidth = width;
-  frame.encodedHeight = height;
-  frame.completeFrame = YES;
-  frame.frameType = isKeyframe ? RTCFrameTypeVideoFrameKey : RTCFrameTypeVideoFrameDelta;
-  frame.captureTimeMs = renderTimeMs;
-  frame.timeStamp = timestamp;
-  frame.rotation = rotation;
-  frame.contentType = (_mode == RTCVideoCodecModeScreensharing) ? RTCVideoContentTypeScreenshare :
-                                                                  RTCVideoContentTypeUnspecified;
-  frame.flags = webrtc::TimingFrameFlags::kInvalid;
-
-  int qp;
-  _h264BitstreamParser.ParseBitstream(buffer->data(), buffer->size());
-  _h264BitstreamParser.GetLastSliceQp(&qp);
-  frame.qp = @(qp);
-
-  BOOL res = _callback(frame, codecSpecificInfo, header);
-  if (!res) {
-    LOG(LS_ERROR) << "Encode callback failed";
-    return;
-  }
-  _bitrateAdjuster->Update(frame.buffer.length);
-}
-
-- (RTCVideoEncoderQpThresholds *)scalingSettings {
-  return [[RTCVideoEncoderQpThresholds alloc] initWithThresholdsLow:kLowH264QpThreshold
-                                                               high:kHighH264QpThreshold];
-}
-
-@end
diff --git a/sdk/objc/Framework/Classes/VideoToolbox/helpers.cc b/sdk/objc/Framework/Classes/VideoToolbox/helpers.cc
deleted file mode 100644
index bd06190..0000000
--- a/sdk/objc/Framework/Classes/VideoToolbox/helpers.cc
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- *  Copyright (c) 2017 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 "helpers.h"
-
-#include <string>
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-
-// Copies characters from a CFStringRef into a std::string.
-std::string CFStringToString(const CFStringRef cf_string) {
-  RTC_DCHECK(cf_string);
-  std::string std_string;
-  // Get the size needed for UTF8 plus terminating character.
-  size_t buffer_size =
-      CFStringGetMaximumSizeForEncoding(CFStringGetLength(cf_string),
-                                        kCFStringEncodingUTF8) +
-      1;
-  std::unique_ptr<char[]> buffer(new char[buffer_size]);
-  if (CFStringGetCString(cf_string, buffer.get(), buffer_size,
-                         kCFStringEncodingUTF8)) {
-    // Copy over the characters.
-    std_string.assign(buffer.get());
-  }
-  return std_string;
-}
-
-// Convenience function for setting a VT property.
-void SetVTSessionProperty(VTSessionRef session,
-                          CFStringRef key,
-                          int32_t value) {
-  CFNumberRef cfNum =
-      CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, &value);
-  OSStatus status = VTSessionSetProperty(session, key, cfNum);
-  CFRelease(cfNum);
-  if (status != noErr) {
-    std::string key_string = CFStringToString(key);
-    LOG(LS_ERROR) << "VTSessionSetProperty failed to set: " << key_string
-                  << " to " << value << ": " << status;
-  }
-}
-
-// Convenience function for setting a VT property.
-void SetVTSessionProperty(VTSessionRef session,
-                          CFStringRef key,
-                          uint32_t value) {
-  int64_t value_64 = value;
-  CFNumberRef cfNum =
-      CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt64Type, &value_64);
-  OSStatus status = VTSessionSetProperty(session, key, cfNum);
-  CFRelease(cfNum);
-  if (status != noErr) {
-    std::string key_string = CFStringToString(key);
-    LOG(LS_ERROR) << "VTSessionSetProperty failed to set: " << key_string
-                  << " to " << value << ": " << status;
-  }
-}
-
-// Convenience function for setting a VT property.
-void SetVTSessionProperty(VTSessionRef session, CFStringRef key, bool value) {
-  CFBooleanRef cf_bool = (value) ? kCFBooleanTrue : kCFBooleanFalse;
-  OSStatus status = VTSessionSetProperty(session, key, cf_bool);
-  if (status != noErr) {
-    std::string key_string = CFStringToString(key);
-    LOG(LS_ERROR) << "VTSessionSetProperty failed to set: " << key_string
-                  << " to " << value << ": " << status;
-  }
-}
-
-// Convenience function for setting a VT property.
-void SetVTSessionProperty(VTSessionRef session,
-                          CFStringRef key,
-                          CFStringRef value) {
-  OSStatus status = VTSessionSetProperty(session, key, value);
-  if (status != noErr) {
-    std::string key_string = CFStringToString(key);
-    std::string val_string = CFStringToString(value);
-    LOG(LS_ERROR) << "VTSessionSetProperty failed to set: " << key_string
-                  << " to " << val_string << ": " << status;
-  }
-}
diff --git a/sdk/objc/Framework/Classes/VideoToolbox/helpers.h b/sdk/objc/Framework/Classes/VideoToolbox/helpers.h
deleted file mode 100644
index 11c19ad..0000000
--- a/sdk/objc/Framework/Classes/VideoToolbox/helpers.h
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- *  Copyright (c) 2017 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_SDK_OBJC_FRAMEWORK_CLASSES_VIDEOTOOLBOX_HELPERS_H_
-#define WEBRTC_SDK_OBJC_FRAMEWORK_CLASSES_VIDEOTOOLBOX_HELPERS_H_
-
-#include <CoreFoundation/CoreFoundation.h>
-#include <VideoToolbox/VideoToolbox.h>
-#include <string>
-
-// Convenience function for creating a dictionary.
-inline CFDictionaryRef CreateCFTypeDictionary(CFTypeRef* keys,
-                                              CFTypeRef* values,
-                                              size_t size) {
-  return CFDictionaryCreate(kCFAllocatorDefault, keys, values, size,
-                            &kCFTypeDictionaryKeyCallBacks,
-                            &kCFTypeDictionaryValueCallBacks);
-}
-
-// Copies characters from a CFStringRef into a std::string.
-std::string CFStringToString(const CFStringRef cf_string);
-
-// Convenience function for setting a VT property.
-void SetVTSessionProperty(VTSessionRef session, CFStringRef key, int32_t value);
-
-// Convenience function for setting a VT property.
-void SetVTSessionProperty(VTSessionRef session,
-                          CFStringRef key,
-                          uint32_t value);
-
-// Convenience function for setting a VT property.
-void SetVTSessionProperty(VTSessionRef session, CFStringRef key, bool value);
-
-// Convenience function for setting a VT property.
-void SetVTSessionProperty(VTSessionRef session,
-                          CFStringRef key,
-                          CFStringRef value);
-
-#endif  // WEBRTC_SDK_OBJC_FRAMEWORK_CLASSES_VIDEOTOOLBOX_HELPERS_H_
diff --git a/sdk/objc/Framework/Classes/VideoToolbox/nalu_rewriter.cc b/sdk/objc/Framework/Classes/VideoToolbox/nalu_rewriter.cc
deleted file mode 100644
index 2804254..0000000
--- a/sdk/objc/Framework/Classes/VideoToolbox/nalu_rewriter.cc
+++ /dev/null
@@ -1,364 +0,0 @@
-/*
- *  Copyright (c) 2015 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/sdk/objc/Framework/Classes/VideoToolbox/nalu_rewriter.h"
-
-#include <CoreFoundation/CoreFoundation.h>
-#include <memory>
-#include <vector>
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-
-namespace webrtc {
-
-using H264::kAud;
-using H264::kSps;
-using H264::NaluIndex;
-using H264::NaluType;
-using H264::ParseNaluType;
-
-const char kAnnexBHeaderBytes[4] = {0, 0, 0, 1};
-const size_t kAvccHeaderByteSize = sizeof(uint32_t);
-
-bool H264CMSampleBufferToAnnexBBuffer(
-    CMSampleBufferRef avcc_sample_buffer,
-    bool is_keyframe,
-    rtc::Buffer* annexb_buffer,
-    std::unique_ptr<RTPFragmentationHeader> *out_header) {
-  RTC_DCHECK(avcc_sample_buffer);
-  RTC_DCHECK(out_header);
-  out_header->reset(nullptr);
-
-  // Get format description from the sample buffer.
-  CMVideoFormatDescriptionRef description =
-      CMSampleBufferGetFormatDescription(avcc_sample_buffer);
-  if (description == nullptr) {
-    LOG(LS_ERROR) << "Failed to get sample buffer's description.";
-    return false;
-  }
-
-  // Get parameter set information.
-  int nalu_header_size = 0;
-  size_t param_set_count = 0;
-  OSStatus status = CMVideoFormatDescriptionGetH264ParameterSetAtIndex(
-      description, 0, nullptr, nullptr, &param_set_count, &nalu_header_size);
-  if (status != noErr) {
-    LOG(LS_ERROR) << "Failed to get parameter set.";
-    return false;
-  }
-  RTC_CHECK_EQ(nalu_header_size, kAvccHeaderByteSize);
-  RTC_DCHECK_EQ(param_set_count, 2);
-
-  // Truncate any previous data in the buffer without changing its capacity.
-  annexb_buffer->SetSize(0);
-
-  size_t nalu_offset = 0;
-  std::vector<size_t> frag_offsets;
-  std::vector<size_t> frag_lengths;
-
-  // Place all parameter sets at the front of buffer.
-  if (is_keyframe) {
-    size_t param_set_size = 0;
-    const uint8_t* param_set = nullptr;
-    for (size_t i = 0; i < param_set_count; ++i) {
-      status = CMVideoFormatDescriptionGetH264ParameterSetAtIndex(
-          description, i, &param_set, &param_set_size, nullptr, nullptr);
-      if (status != noErr) {
-        LOG(LS_ERROR) << "Failed to get parameter set.";
-        return false;
-      }
-      // Update buffer.
-      annexb_buffer->AppendData(kAnnexBHeaderBytes, sizeof(kAnnexBHeaderBytes));
-      annexb_buffer->AppendData(reinterpret_cast<const char*>(param_set),
-                                param_set_size);
-      // Update fragmentation.
-      frag_offsets.push_back(nalu_offset + sizeof(kAnnexBHeaderBytes));
-      frag_lengths.push_back(param_set_size);
-      nalu_offset += sizeof(kAnnexBHeaderBytes) + param_set_size;
-    }
-  }
-
-  // Get block buffer from the sample buffer.
-  CMBlockBufferRef block_buffer =
-      CMSampleBufferGetDataBuffer(avcc_sample_buffer);
-  if (block_buffer == nullptr) {
-    LOG(LS_ERROR) << "Failed to get sample buffer's block buffer.";
-    return false;
-  }
-  CMBlockBufferRef contiguous_buffer = nullptr;
-  // Make sure block buffer is contiguous.
-  if (!CMBlockBufferIsRangeContiguous(block_buffer, 0, 0)) {
-    status = CMBlockBufferCreateContiguous(
-        nullptr, block_buffer, nullptr, nullptr, 0, 0, 0, &contiguous_buffer);
-    if (status != noErr) {
-      LOG(LS_ERROR) << "Failed to flatten non-contiguous block buffer: "
-                    << status;
-      return false;
-    }
-  } else {
-    contiguous_buffer = block_buffer;
-    // Retain to make cleanup easier.
-    CFRetain(contiguous_buffer);
-    block_buffer = nullptr;
-  }
-
-  // Now copy the actual data.
-  char* data_ptr = nullptr;
-  size_t block_buffer_size = CMBlockBufferGetDataLength(contiguous_buffer);
-  status = CMBlockBufferGetDataPointer(contiguous_buffer, 0, nullptr, nullptr,
-                                       &data_ptr);
-  if (status != noErr) {
-    LOG(LS_ERROR) << "Failed to get block buffer data.";
-    CFRelease(contiguous_buffer);
-    return false;
-  }
-  size_t bytes_remaining = block_buffer_size;
-  while (bytes_remaining > 0) {
-    // The size type here must match |nalu_header_size|, we expect 4 bytes.
-    // Read the length of the next packet of data. Must convert from big endian
-    // to host endian.
-    RTC_DCHECK_GE(bytes_remaining, (size_t)nalu_header_size);
-    uint32_t* uint32_data_ptr = reinterpret_cast<uint32_t*>(data_ptr);
-    uint32_t packet_size = CFSwapInt32BigToHost(*uint32_data_ptr);
-    // Update buffer.
-    annexb_buffer->AppendData(kAnnexBHeaderBytes, sizeof(kAnnexBHeaderBytes));
-    annexb_buffer->AppendData(data_ptr + nalu_header_size, packet_size);
-    // Update fragmentation.
-    frag_offsets.push_back(nalu_offset + sizeof(kAnnexBHeaderBytes));
-    frag_lengths.push_back(packet_size);
-    nalu_offset += sizeof(kAnnexBHeaderBytes) + packet_size;
-
-    size_t bytes_written = packet_size + sizeof(kAnnexBHeaderBytes);
-    bytes_remaining -= bytes_written;
-    data_ptr += bytes_written;
-  }
-  RTC_DCHECK_EQ(bytes_remaining, (size_t)0);
-
-  std::unique_ptr<RTPFragmentationHeader> header(new RTPFragmentationHeader());
-  header->VerifyAndAllocateFragmentationHeader(frag_offsets.size());
-  RTC_DCHECK_EQ(frag_lengths.size(), frag_offsets.size());
-  for (size_t i = 0; i < frag_offsets.size(); ++i) {
-    header->fragmentationOffset[i] = frag_offsets[i];
-    header->fragmentationLength[i] = frag_lengths[i];
-    header->fragmentationPlType[i] = 0;
-    header->fragmentationTimeDiff[i] = 0;
-  }
-  *out_header = std::move(header);
-  CFRelease(contiguous_buffer);
-  return true;
-}
-
-bool H264AnnexBBufferToCMSampleBuffer(const uint8_t* annexb_buffer,
-                                      size_t annexb_buffer_size,
-                                      CMVideoFormatDescriptionRef video_format,
-                                      CMSampleBufferRef* out_sample_buffer) {
-  RTC_DCHECK(annexb_buffer);
-  RTC_DCHECK(out_sample_buffer);
-  RTC_DCHECK(video_format);
-  *out_sample_buffer = nullptr;
-
-  AnnexBBufferReader reader(annexb_buffer, annexb_buffer_size);
-  if (H264AnnexBBufferHasVideoFormatDescription(annexb_buffer,
-                                                annexb_buffer_size)) {
-    // Advance past the SPS and PPS.
-    const uint8_t* data = nullptr;
-    size_t data_len = 0;
-    if (!reader.ReadNalu(&data, &data_len)) {
-      LOG(LS_ERROR) << "Failed to read SPS";
-      return false;
-    }
-    if (!reader.ReadNalu(&data, &data_len)) {
-      LOG(LS_ERROR) << "Failed to read PPS";
-      return false;
-    }
-  }
-
-  // Allocate memory as a block buffer.
-  // TODO(tkchin): figure out how to use a pool.
-  CMBlockBufferRef block_buffer = nullptr;
-  OSStatus status = CMBlockBufferCreateWithMemoryBlock(
-      nullptr, nullptr, reader.BytesRemaining(), nullptr, nullptr, 0,
-      reader.BytesRemaining(), kCMBlockBufferAssureMemoryNowFlag,
-      &block_buffer);
-  if (status != kCMBlockBufferNoErr) {
-    LOG(LS_ERROR) << "Failed to create block buffer.";
-    return false;
-  }
-
-  // Make sure block buffer is contiguous.
-  CMBlockBufferRef contiguous_buffer = nullptr;
-  if (!CMBlockBufferIsRangeContiguous(block_buffer, 0, 0)) {
-    status = CMBlockBufferCreateContiguous(
-        nullptr, block_buffer, nullptr, nullptr, 0, 0, 0, &contiguous_buffer);
-    if (status != noErr) {
-      LOG(LS_ERROR) << "Failed to flatten non-contiguous block buffer: "
-                    << status;
-      CFRelease(block_buffer);
-      return false;
-    }
-  } else {
-    contiguous_buffer = block_buffer;
-    block_buffer = nullptr;
-  }
-
-  // Get a raw pointer into allocated memory.
-  size_t block_buffer_size = 0;
-  char* data_ptr = nullptr;
-  status = CMBlockBufferGetDataPointer(contiguous_buffer, 0, nullptr,
-                                       &block_buffer_size, &data_ptr);
-  if (status != kCMBlockBufferNoErr) {
-    LOG(LS_ERROR) << "Failed to get block buffer data pointer.";
-    CFRelease(contiguous_buffer);
-    return false;
-  }
-  RTC_DCHECK(block_buffer_size == reader.BytesRemaining());
-
-  // Write Avcc NALUs into block buffer memory.
-  AvccBufferWriter writer(reinterpret_cast<uint8_t*>(data_ptr),
-                          block_buffer_size);
-  while (reader.BytesRemaining() > 0) {
-    const uint8_t* nalu_data_ptr = nullptr;
-    size_t nalu_data_size = 0;
-    if (reader.ReadNalu(&nalu_data_ptr, &nalu_data_size)) {
-      writer.WriteNalu(nalu_data_ptr, nalu_data_size);
-    }
-  }
-
-  // Create sample buffer.
-  status = CMSampleBufferCreate(nullptr, contiguous_buffer, true, nullptr,
-                                nullptr, video_format, 1, 0, nullptr, 0,
-                                nullptr, out_sample_buffer);
-  if (status != noErr) {
-    LOG(LS_ERROR) << "Failed to create sample buffer.";
-    CFRelease(contiguous_buffer);
-    return false;
-  }
-  CFRelease(contiguous_buffer);
-  return true;
-}
-
-bool H264AnnexBBufferHasVideoFormatDescription(const uint8_t* annexb_buffer,
-                                               size_t annexb_buffer_size) {
-  RTC_DCHECK(annexb_buffer);
-  RTC_DCHECK_GT(annexb_buffer_size, 4);
-
-  // The buffer we receive via RTP has 00 00 00 01 start code artifically
-  // embedded by the RTP depacketizer. Extract NALU information.
-  // TODO(tkchin): handle potential case where sps and pps are delivered
-  // separately.
-  NaluType first_nalu_type = ParseNaluType(annexb_buffer[4]);
-  bool is_first_nalu_type_sps = first_nalu_type == kSps;
-  if (is_first_nalu_type_sps)
-    return true;
-  bool is_first_nalu_type_aud = first_nalu_type == kAud;
-  // Start code + access unit delimiter + start code = 4 + 2 + 4 = 10.
-  if (!is_first_nalu_type_aud || annexb_buffer_size <= 10u)
-    return false;
-  NaluType second_nalu_type = ParseNaluType(annexb_buffer[10]);
-  bool is_second_nalu_type_sps = second_nalu_type == kSps;
-  return is_second_nalu_type_sps;
-}
-
-CMVideoFormatDescriptionRef CreateVideoFormatDescription(
-    const uint8_t* annexb_buffer,
-    size_t annexb_buffer_size) {
-  if (!H264AnnexBBufferHasVideoFormatDescription(annexb_buffer,
-                                                 annexb_buffer_size)) {
-    return nullptr;
-  }
-  AnnexBBufferReader reader(annexb_buffer, annexb_buffer_size);
-  CMVideoFormatDescriptionRef description = nullptr;
-  OSStatus status = noErr;
-  // Parse the SPS and PPS into a CMVideoFormatDescription.
-  const uint8_t* param_set_ptrs[2] = {};
-  size_t param_set_sizes[2] = {};
-  // Skip AUD.
-  if (ParseNaluType(annexb_buffer[4]) == kAud) {
-    if (!reader.ReadNalu(&param_set_ptrs[0], &param_set_sizes[0])) {
-      LOG(LS_ERROR) << "Failed to read AUD";
-      return nullptr;
-    }
-  }
-  if (!reader.ReadNalu(&param_set_ptrs[0], &param_set_sizes[0])) {
-    LOG(LS_ERROR) << "Failed to read SPS";
-    return nullptr;
-  }
-  if (!reader.ReadNalu(&param_set_ptrs[1], &param_set_sizes[1])) {
-    LOG(LS_ERROR) << "Failed to read PPS";
-    return nullptr;
-  }
-  status = CMVideoFormatDescriptionCreateFromH264ParameterSets(
-      kCFAllocatorDefault, 2, param_set_ptrs, param_set_sizes, 4,
-      &description);
-  if (status != noErr) {
-    LOG(LS_ERROR) << "Failed to create video format description.";
-    return nullptr;
-  }
-  return description;
-}
-
-AnnexBBufferReader::AnnexBBufferReader(const uint8_t* annexb_buffer,
-                                       size_t length)
-    : start_(annexb_buffer), length_(length) {
-  RTC_DCHECK(annexb_buffer);
-  offsets_ = H264::FindNaluIndices(annexb_buffer, length);
-  offset_ = offsets_.begin();
-}
-
-bool AnnexBBufferReader::ReadNalu(const uint8_t** out_nalu,
-                                  size_t* out_length) {
-  RTC_DCHECK(out_nalu);
-  RTC_DCHECK(out_length);
-  *out_nalu = nullptr;
-  *out_length = 0;
-
-  if (offset_ == offsets_.end()) {
-    return false;
-  }
-  *out_nalu = start_ + offset_->payload_start_offset;
-  *out_length = offset_->payload_size;
-  ++offset_;
-  return true;
-}
-
-size_t AnnexBBufferReader::BytesRemaining() const {
-  if (offset_ == offsets_.end()) {
-    return 0;
-  }
-  return length_ - offset_->start_offset;
-}
-
-AvccBufferWriter::AvccBufferWriter(uint8_t* const avcc_buffer, size_t length)
-    : start_(avcc_buffer), offset_(0), length_(length) {
-  RTC_DCHECK(avcc_buffer);
-}
-
-bool AvccBufferWriter::WriteNalu(const uint8_t* data, size_t data_size) {
-  // Check if we can write this length of data.
-  if (data_size + kAvccHeaderByteSize > BytesRemaining()) {
-    return false;
-  }
-  // Write length header, which needs to be big endian.
-  uint32_t big_endian_length = CFSwapInt32HostToBig(data_size);
-  memcpy(start_ + offset_, &big_endian_length, sizeof(big_endian_length));
-  offset_ += sizeof(big_endian_length);
-  // Write data.
-  memcpy(start_ + offset_, data, data_size);
-  offset_ += data_size;
-  return true;
-}
-
-size_t AvccBufferWriter::BytesRemaining() const {
-  return length_ - offset_;
-}
-
-}  // namespace webrtc
diff --git a/sdk/objc/Framework/Classes/VideoToolbox/nalu_rewriter.h b/sdk/objc/Framework/Classes/VideoToolbox/nalu_rewriter.h
deleted file mode 100644
index 3d7a88f..0000000
--- a/sdk/objc/Framework/Classes/VideoToolbox/nalu_rewriter.h
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- *  Copyright (c) 2015 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_SDK_OBJC_FRAMEWORK_CLASSES_VIDEOTOOLBOX_NALU_REWRITER_H_
-#define WEBRTC_SDK_OBJC_FRAMEWORK_CLASSES_VIDEOTOOLBOX_NALU_REWRITER_H_
-
-#include "webrtc/modules/video_coding/codecs/h264/include/h264.h"
-
-#include <CoreMedia/CoreMedia.h>
-#include <vector>
-
-#include "webrtc/common_video/h264/h264_common.h"
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/rtc_base/buffer.h"
-
-using webrtc::H264::NaluIndex;
-
-namespace webrtc {
-
-// Converts a sample buffer emitted from the VideoToolbox encoder into a buffer
-// suitable for RTP. The sample buffer is in avcc format whereas the rtp buffer
-// needs to be in Annex B format. Data is written directly to |annexb_buffer|
-// and a new RTPFragmentationHeader is returned in |out_header|.
-bool H264CMSampleBufferToAnnexBBuffer(
-    CMSampleBufferRef avcc_sample_buffer,
-    bool is_keyframe,
-    rtc::Buffer* annexb_buffer,
-    std::unique_ptr<RTPFragmentationHeader> *out_header);
-
-// Converts a buffer received from RTP into a sample buffer suitable for the
-// VideoToolbox decoder. The RTP buffer is in annex b format whereas the sample
-// buffer is in avcc format.
-// If |is_keyframe| is true then |video_format| is ignored since the format will
-// be read from the buffer. Otherwise |video_format| must be provided.
-// Caller is responsible for releasing the created sample buffer.
-bool H264AnnexBBufferToCMSampleBuffer(const uint8_t* annexb_buffer,
-                                      size_t annexb_buffer_size,
-                                      CMVideoFormatDescriptionRef video_format,
-                                      CMSampleBufferRef* out_sample_buffer);
-
-// Returns true if the type of the first NALU in the supplied Annex B buffer is
-// the SPS type.
-bool H264AnnexBBufferHasVideoFormatDescription(const uint8_t* annexb_buffer,
-                                               size_t annexb_buffer_size);
-
-// Returns a video format description created from the sps/pps information in
-// the Annex B buffer. If there is no such information, nullptr is returned.
-// The caller is responsible for releasing the description.
-CMVideoFormatDescriptionRef CreateVideoFormatDescription(
-    const uint8_t* annexb_buffer,
-    size_t annexb_buffer_size);
-
-// Helper class for reading NALUs from an RTP Annex B buffer.
-class AnnexBBufferReader final {
- public:
-  AnnexBBufferReader(const uint8_t* annexb_buffer, size_t length);
-  ~AnnexBBufferReader() {}
-  AnnexBBufferReader(const AnnexBBufferReader& other) = delete;
-  void operator=(const AnnexBBufferReader& other) = delete;
-
-  // Returns a pointer to the beginning of the next NALU slice without the
-  // header bytes and its length. Returns false if no more slices remain.
-  bool ReadNalu(const uint8_t** out_nalu, size_t* out_length);
-
-  // Returns the number of unread NALU bytes, including the size of the header.
-  // If the buffer has no remaining NALUs this will return zero.
-  size_t BytesRemaining() const;
-
- private:
-  // Returns the the next offset that contains NALU data.
-  size_t FindNextNaluHeader(const uint8_t* start,
-                            size_t length,
-                            size_t offset) const;
-
-  const uint8_t* const start_;
-  std::vector<NaluIndex> offsets_;
-  std::vector<NaluIndex>::iterator offset_;
-  const size_t length_;
-};
-
-// Helper class for writing NALUs using avcc format into a buffer.
-class AvccBufferWriter final {
- public:
-  AvccBufferWriter(uint8_t* const avcc_buffer, size_t length);
-  ~AvccBufferWriter() {}
-  AvccBufferWriter(const AvccBufferWriter& other) = delete;
-  void operator=(const AvccBufferWriter& other) = delete;
-
-  // Writes the data slice into the buffer. Returns false if there isn't
-  // enough space left.
-  bool WriteNalu(const uint8_t* data, size_t data_size);
-
-  // Returns the unused bytes in the buffer.
-  size_t BytesRemaining() const;
-
- private:
-  uint8_t* const start_;
-  size_t offset_;
-  const size_t length_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_SDK_OBJC_FRAMEWORK_CLASSES_VIDEOTOOLBOX_NALU_REWRITER_H_
diff --git a/sdk/objc/Framework/Classes/VideoToolbox/nalu_rewriter_unittest.cc b/sdk/objc/Framework/Classes/VideoToolbox/nalu_rewriter_unittest.cc
deleted file mode 100644
index 0a680fc..0000000
--- a/sdk/objc/Framework/Classes/VideoToolbox/nalu_rewriter_unittest.cc
+++ /dev/null
@@ -1,204 +0,0 @@
-/*
- *  Copyright (c) 2015 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 <memory>
-
-#include "webrtc/rtc_base/arraysize.h"
-#include "webrtc/sdk/objc/Framework/Classes/VideoToolbox/nalu_rewriter.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-static const uint8_t NALU_TEST_DATA_0[] = {0xAA, 0xBB, 0xCC};
-static const uint8_t NALU_TEST_DATA_1[] = {0xDE, 0xAD, 0xBE, 0xEF};
-
-TEST(H264VideoToolboxNaluTest, TestHasVideoFormatDescription) {
-  const uint8_t sps_buffer[] = {0x00, 0x00, 0x00, 0x01, 0x27};
-  EXPECT_TRUE(H264AnnexBBufferHasVideoFormatDescription(sps_buffer,
-                                                        arraysize(sps_buffer)));
-  const uint8_t aud_sps_buffer[] = {0x00, 0x00, 0x00, 0x01, 0x29, 0x10,
-                                    0x00, 0x00, 0x00, 0x01, 0x27, 0xFF};
-  EXPECT_TRUE(H264AnnexBBufferHasVideoFormatDescription(
-      aud_sps_buffer, arraysize(aud_sps_buffer)));
-  const uint8_t other_buffer[] = {0x00, 0x00, 0x00, 0x01, 0x28};
-  EXPECT_FALSE(H264AnnexBBufferHasVideoFormatDescription(
-      other_buffer, arraysize(other_buffer)));
-  const uint8_t aud_other_buffer[] = {0x00, 0x00, 0x00, 0x01, 0x29,
-                                      0x00, 0x00, 0x00, 0x01, 0x28};
-  EXPECT_FALSE(H264AnnexBBufferHasVideoFormatDescription(
-      aud_other_buffer, arraysize(aud_other_buffer)));
-}
-
-TEST(H264VideoToolboxNaluTest, TestCreateVideoFormatDescription) {
-  const uint8_t sps_pps_buffer[] = {
-    // SPS nalu.
-    0x00, 0x00, 0x00, 0x01,
-    0x27, 0x42, 0x00, 0x1E, 0xAB, 0x40, 0xF0, 0x28, 0xD3, 0x70, 0x20, 0x20,
-    0x20, 0x20,
-    // PPS nalu.
-    0x00, 0x00, 0x00, 0x01,
-    0x28, 0xCE, 0x3C, 0x30
-  };
-  CMVideoFormatDescriptionRef description =
-      CreateVideoFormatDescription(sps_pps_buffer, arraysize(sps_pps_buffer));
-  EXPECT_TRUE(description);
-  if (description) {
-    CFRelease(description);
-    description = nullptr;
-  }
-  const uint8_t other_buffer[] = {0x00, 0x00, 0x00, 0x01, 0x28};
-  EXPECT_FALSE(CreateVideoFormatDescription(other_buffer,
-                                            arraysize(other_buffer)));
-}
-
-TEST(AnnexBBufferReaderTest, TestReadEmptyInput) {
-  const uint8_t annex_b_test_data[] = {0x00};
-  AnnexBBufferReader reader(annex_b_test_data, 0);
-  const uint8_t* nalu = nullptr;
-  size_t nalu_length = 0;
-  EXPECT_EQ(0u, reader.BytesRemaining());
-  EXPECT_FALSE(reader.ReadNalu(&nalu, &nalu_length));
-  EXPECT_EQ(nullptr, nalu);
-  EXPECT_EQ(0u, nalu_length);
-}
-
-TEST(AnnexBBufferReaderTest, TestReadSingleNalu) {
-  const uint8_t annex_b_test_data[] = {0x00, 0x00, 0x00, 0x01, 0xAA};
-  AnnexBBufferReader reader(annex_b_test_data, arraysize(annex_b_test_data));
-  const uint8_t* nalu = nullptr;
-  size_t nalu_length = 0;
-  EXPECT_EQ(arraysize(annex_b_test_data), reader.BytesRemaining());
-  EXPECT_TRUE(reader.ReadNalu(&nalu, &nalu_length));
-  EXPECT_EQ(annex_b_test_data + 4, nalu);
-  EXPECT_EQ(1u, nalu_length);
-  EXPECT_EQ(0u, reader.BytesRemaining());
-  EXPECT_FALSE(reader.ReadNalu(&nalu, &nalu_length));
-  EXPECT_EQ(nullptr, nalu);
-  EXPECT_EQ(0u, nalu_length);
-}
-
-TEST(AnnexBBufferReaderTest, TestReadSingleNalu3ByteHeader) {
-  const uint8_t annex_b_test_data[] = {0x00, 0x00, 0x01, 0xAA};
-  AnnexBBufferReader reader(annex_b_test_data, arraysize(annex_b_test_data));
-  const uint8_t* nalu = nullptr;
-  size_t nalu_length = 0;
-  EXPECT_EQ(arraysize(annex_b_test_data), reader.BytesRemaining());
-  EXPECT_TRUE(reader.ReadNalu(&nalu, &nalu_length));
-  EXPECT_EQ(annex_b_test_data + 3, nalu);
-  EXPECT_EQ(1u, nalu_length);
-  EXPECT_EQ(0u, reader.BytesRemaining());
-  EXPECT_FALSE(reader.ReadNalu(&nalu, &nalu_length));
-  EXPECT_EQ(nullptr, nalu);
-  EXPECT_EQ(0u, nalu_length);
-}
-
-TEST(AnnexBBufferReaderTest, TestReadMissingNalu) {
-  // clang-format off
-  const uint8_t annex_b_test_data[] = {0x01,
-                                       0x00, 0x01,
-                                       0x00, 0x00, 0x00, 0xFF};
-  // clang-format on
-  AnnexBBufferReader reader(annex_b_test_data, arraysize(annex_b_test_data));
-  const uint8_t* nalu = nullptr;
-  size_t nalu_length = 0;
-  EXPECT_EQ(0u, reader.BytesRemaining());
-  EXPECT_FALSE(reader.ReadNalu(&nalu, &nalu_length));
-  EXPECT_EQ(nullptr, nalu);
-  EXPECT_EQ(0u, nalu_length);
-}
-
-TEST(AnnexBBufferReaderTest, TestReadMultipleNalus) {
-  // clang-format off
-  const uint8_t annex_b_test_data[] = {0x00, 0x00, 0x00, 0x01, 0xFF,
-                                       0x01,
-                                       0x00, 0x01,
-                                       0x00, 0x00, 0x00, 0xFF,
-                                       0x00, 0x00, 0x01, 0xAA, 0xBB};
-  // clang-format on
-  AnnexBBufferReader reader(annex_b_test_data, arraysize(annex_b_test_data));
-  const uint8_t* nalu = nullptr;
-  size_t nalu_length = 0;
-  EXPECT_EQ(arraysize(annex_b_test_data), reader.BytesRemaining());
-  EXPECT_TRUE(reader.ReadNalu(&nalu, &nalu_length));
-  EXPECT_EQ(annex_b_test_data + 4, nalu);
-  EXPECT_EQ(8u, nalu_length);
-  EXPECT_EQ(6u, reader.BytesRemaining());
-  EXPECT_TRUE(reader.ReadNalu(&nalu, &nalu_length));
-  EXPECT_EQ(annex_b_test_data + 16, nalu);
-  EXPECT_EQ(2u, nalu_length);
-  EXPECT_EQ(0u, reader.BytesRemaining());
-  EXPECT_FALSE(reader.ReadNalu(&nalu, &nalu_length));
-  EXPECT_EQ(nullptr, nalu);
-  EXPECT_EQ(0u, nalu_length);
-}
-
-TEST(AvccBufferWriterTest, TestEmptyOutputBuffer) {
-  const uint8_t expected_buffer[] = {0x00};
-  const size_t buffer_size = 1;
-  std::unique_ptr<uint8_t[]> buffer(new uint8_t[buffer_size]);
-  memset(buffer.get(), 0, buffer_size);
-  AvccBufferWriter writer(buffer.get(), 0);
-  EXPECT_EQ(0u, writer.BytesRemaining());
-  EXPECT_FALSE(writer.WriteNalu(NALU_TEST_DATA_0, arraysize(NALU_TEST_DATA_0)));
-  EXPECT_EQ(0,
-            memcmp(expected_buffer, buffer.get(), arraysize(expected_buffer)));
-}
-
-TEST(AvccBufferWriterTest, TestWriteSingleNalu) {
-  const uint8_t expected_buffer[] = {
-      0x00, 0x00, 0x00, 0x03, 0xAA, 0xBB, 0xCC,
-  };
-  const size_t buffer_size = arraysize(NALU_TEST_DATA_0) + 4;
-  std::unique_ptr<uint8_t[]> buffer(new uint8_t[buffer_size]);
-  AvccBufferWriter writer(buffer.get(), buffer_size);
-  EXPECT_EQ(buffer_size, writer.BytesRemaining());
-  EXPECT_TRUE(writer.WriteNalu(NALU_TEST_DATA_0, arraysize(NALU_TEST_DATA_0)));
-  EXPECT_EQ(0u, writer.BytesRemaining());
-  EXPECT_FALSE(writer.WriteNalu(NALU_TEST_DATA_1, arraysize(NALU_TEST_DATA_1)));
-  EXPECT_EQ(0,
-            memcmp(expected_buffer, buffer.get(), arraysize(expected_buffer)));
-}
-
-TEST(AvccBufferWriterTest, TestWriteMultipleNalus) {
-  // clang-format off
-  const uint8_t expected_buffer[] = {
-      0x00, 0x00, 0x00, 0x03, 0xAA, 0xBB, 0xCC,
-      0x00, 0x00, 0x00, 0x04, 0xDE, 0xAD, 0xBE, 0xEF
-  };
-  // clang-format on
-  const size_t buffer_size =
-      arraysize(NALU_TEST_DATA_0) + arraysize(NALU_TEST_DATA_1) + 8;
-  std::unique_ptr<uint8_t[]> buffer(new uint8_t[buffer_size]);
-  AvccBufferWriter writer(buffer.get(), buffer_size);
-  EXPECT_EQ(buffer_size, writer.BytesRemaining());
-  EXPECT_TRUE(writer.WriteNalu(NALU_TEST_DATA_0, arraysize(NALU_TEST_DATA_0)));
-  EXPECT_EQ(buffer_size - (arraysize(NALU_TEST_DATA_0) + 4),
-            writer.BytesRemaining());
-  EXPECT_TRUE(writer.WriteNalu(NALU_TEST_DATA_1, arraysize(NALU_TEST_DATA_1)));
-  EXPECT_EQ(0u, writer.BytesRemaining());
-  EXPECT_EQ(0,
-            memcmp(expected_buffer, buffer.get(), arraysize(expected_buffer)));
-}
-
-TEST(AvccBufferWriterTest, TestOverflow) {
-  const uint8_t expected_buffer[] = {0x00, 0x00, 0x00};
-  const size_t buffer_size = arraysize(NALU_TEST_DATA_0);
-  std::unique_ptr<uint8_t[]> buffer(new uint8_t[buffer_size]);
-  memset(buffer.get(), 0, buffer_size);
-  AvccBufferWriter writer(buffer.get(), buffer_size);
-  EXPECT_EQ(buffer_size, writer.BytesRemaining());
-  EXPECT_FALSE(writer.WriteNalu(NALU_TEST_DATA_0, arraysize(NALU_TEST_DATA_0)));
-  EXPECT_EQ(buffer_size, writer.BytesRemaining());
-  EXPECT_EQ(0,
-            memcmp(expected_buffer, buffer.get(), arraysize(expected_buffer)));
-}
-
-}  // namespace webrtc
diff --git a/sdk/objc/Framework/Classes/VideoToolbox/objc_video_decoder_factory.h b/sdk/objc/Framework/Classes/VideoToolbox/objc_video_decoder_factory.h
deleted file mode 100644
index 8fd8c48..0000000
--- a/sdk/objc/Framework/Classes/VideoToolbox/objc_video_decoder_factory.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- *  Copyright 2017 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_SDK_OBJC_FRAMEWORK_CLASSES_PEERCONNECTION_OBJC_VIDEO_DECODER_FACTORY_H_
-#define WEBRTC_SDK_OBJC_FRAMEWORK_CLASSES_PEERCONNECTION_OBJC_VIDEO_DECODER_FACTORY_H_
-
-#include "webrtc/media/base/codec.h"
-#include "webrtc/media/engine/webrtcvideodecoderfactory.h"
-
-@protocol RTCVideoDecoderFactory;
-
-namespace webrtc {
-
-class ObjCVideoDecoderFactory : public cricket::WebRtcVideoDecoderFactory {
- public:
-  explicit ObjCVideoDecoderFactory(id<RTCVideoDecoderFactory>);
-  ~ObjCVideoDecoderFactory();
-
-  id<RTCVideoDecoderFactory> wrapped_decoder_factory() const;
-
-  VideoDecoder* CreateVideoDecoderWithParams(
-      const cricket::VideoCodec& codec,
-      cricket::VideoDecoderParams params) override;
-
-  void DestroyVideoDecoder(webrtc::VideoDecoder* decoder) override;
-
- private:
-  id<RTCVideoDecoderFactory> decoder_factory_;
-  std::vector<cricket::VideoCodec> supported_codecs_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_SDK_OBJC_FRAMEWORK_CLASSES_PEERCONNECTION_OBJC_VIDEO_DECODER_FACTORY_H_
diff --git a/sdk/objc/Framework/Classes/VideoToolbox/objc_video_decoder_factory.mm b/sdk/objc/Framework/Classes/VideoToolbox/objc_video_decoder_factory.mm
deleted file mode 100644
index d126f84..0000000
--- a/sdk/objc/Framework/Classes/VideoToolbox/objc_video_decoder_factory.mm
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- *  Copyright 2017 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/sdk/objc/Framework/Classes/VideoToolbox/objc_video_decoder_factory.h"
-
-#import "NSString+StdString.h"
-#import "RTCVideoCodec+Private.h"
-#import "WebRTC/RTCVideoCodec.h"
-#import "WebRTC/RTCVideoCodecFactory.h"
-#import "WebRTC/RTCVideoCodecH264.h"
-#import "WebRTC/RTCVideoFrame.h"
-#import "WebRTC/RTCVideoFrameBuffer.h"
-
-#include "webrtc/api/video_codecs/video_decoder.h"
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/modules/video_coding/include/video_codec_interface.h"
-#include "webrtc/modules/video_coding/include/video_error_codes.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/timeutils.h"
-#include "webrtc/sdk/objc/Framework/Classes/Video/objc_frame_buffer.h"
-
-namespace webrtc {
-
-namespace {
-class ObjCVideoDecoder : public VideoDecoder {
- public:
-  ObjCVideoDecoder(id<RTCVideoDecoder> decoder)
-      : decoder_(decoder), implementation_name_([decoder implementationName].stdString) {}
-
-  int32_t InitDecode(const VideoCodec *codec_settings, int32_t number_of_cores) {
-    RTCVideoEncoderSettings *settings =
-        [[RTCVideoEncoderSettings alloc] initWithNativeVideoCodec:codec_settings];
-    return [decoder_ startDecodeWithSettings:settings numberOfCores:number_of_cores];
-  }
-
-  int32_t Decode(const EncodedImage &input_image,
-                 bool missing_frames,
-                 const RTPFragmentationHeader *fragmentation,
-                 const CodecSpecificInfo *codec_specific_info = NULL,
-                 int64_t render_time_ms = -1) {
-    RTCEncodedImage *encodedImage =
-        [[RTCEncodedImage alloc] initWithNativeEncodedImage:input_image];
-    RTCRtpFragmentationHeader *header =
-        [[RTCRtpFragmentationHeader alloc] initWithNativeFragmentationHeader:fragmentation];
-
-    // webrtc::CodecSpecificInfo only handles a hard coded list of codecs
-    id<RTCCodecSpecificInfo> rtcCodecSpecificInfo = nil;
-    if (codec_specific_info) {
-      if (codec_specific_info->codecType == kVideoCodecH264) {
-        RTCCodecSpecificInfoH264 *h264Info = [[RTCCodecSpecificInfoH264 alloc] init];
-        h264Info.packetizationMode =
-            (RTCH264PacketizationMode)codec_specific_info->codecSpecific.H264.packetization_mode;
-        rtcCodecSpecificInfo = h264Info;
-      }
-    }
-
-    return [decoder_ decode:encodedImage
-              missingFrames:missing_frames
-        fragmentationHeader:header
-          codecSpecificInfo:rtcCodecSpecificInfo
-               renderTimeMs:render_time_ms];
-  }
-
-  int32_t RegisterDecodeCompleteCallback(DecodedImageCallback *callback) {
-    [decoder_ setCallback:^(RTCVideoFrame *frame) {
-      const rtc::scoped_refptr<VideoFrameBuffer> buffer =
-          new rtc::RefCountedObject<ObjCFrameBuffer>(frame.buffer);
-      VideoFrame videoFrame(buffer,
-                            (uint32_t)(frame.timeStampNs / rtc::kNumNanosecsPerMicrosec),
-                            0,
-                            (VideoRotation)frame.rotation);
-      videoFrame.set_timestamp(frame.timeStamp);
-
-      callback->Decoded(videoFrame);
-    }];
-
-    return WEBRTC_VIDEO_CODEC_OK;
-  }
-
-  int32_t Release() { return [decoder_ releaseDecoder]; }
-
-  const char *ImplementationName() const { return implementation_name_.c_str(); }
-
- private:
-  id<RTCVideoDecoder> decoder_;
-  const std::string implementation_name_;
-};
-}  // namespace
-
-ObjCVideoDecoderFactory::ObjCVideoDecoderFactory(id<RTCVideoDecoderFactory> decoder_factory)
-    : decoder_factory_(decoder_factory) {}
-
-ObjCVideoDecoderFactory::~ObjCVideoDecoderFactory() {}
-
-id<RTCVideoDecoderFactory> ObjCVideoDecoderFactory::wrapped_decoder_factory() const {
-  return decoder_factory_;
-}
-
-VideoDecoder *ObjCVideoDecoderFactory::CreateVideoDecoderWithParams(
-    const cricket::VideoCodec &codec, cricket::VideoDecoderParams params) {
-  NSString *codecName = [NSString stringWithUTF8String:codec.name.c_str()];
-  for (RTCVideoCodecInfo *codecInfo in decoder_factory_.supportedCodecs) {
-    if ([codecName isEqualToString:codecInfo.name]) {
-      id<RTCVideoDecoder> decoder = [decoder_factory_ createDecoder:codecInfo];
-      return new ObjCVideoDecoder(decoder);
-    }
-  }
-
-  return nullptr;
-}
-
-void ObjCVideoDecoderFactory::DestroyVideoDecoder(VideoDecoder *decoder) {
-  delete decoder;
-  decoder = nullptr;
-}
-
-}  // namespace webrtc
diff --git a/sdk/objc/Framework/Classes/VideoToolbox/objc_video_encoder_factory.h b/sdk/objc/Framework/Classes/VideoToolbox/objc_video_encoder_factory.h
deleted file mode 100644
index b0c4588..0000000
--- a/sdk/objc/Framework/Classes/VideoToolbox/objc_video_encoder_factory.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- *  Copyright 2017 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_SDK_OBJC_FRAMEWORK_CLASSES_PEERCONNECTION_OBJC_VIDEO_ENCODER_FACTORY_H_
-#define WEBRTC_SDK_OBJC_FRAMEWORK_CLASSES_PEERCONNECTION_OBJC_VIDEO_ENCODER_FACTORY_H_
-
-#import <Foundation/Foundation.h>
-
-#include "webrtc/media/engine/webrtcvideoencoderfactory.h"
-
-@protocol RTCVideoEncoderFactory;
-
-namespace webrtc {
-
-class ObjCVideoEncoderFactory : public cricket::WebRtcVideoEncoderFactory {
- public:
-  explicit ObjCVideoEncoderFactory(id<RTCVideoEncoderFactory>);
-  ~ObjCVideoEncoderFactory();
-
-  id<RTCVideoEncoderFactory> wrapped_encoder_factory() const;
-
-  webrtc::VideoEncoder* CreateVideoEncoder(
-      const cricket::VideoCodec& codec) override;
-  const std::vector<cricket::VideoCodec>& supported_codecs() const override;
-  void DestroyVideoEncoder(webrtc::VideoEncoder* encoder) override;
-
- private:
-  id<RTCVideoEncoderFactory> encoder_factory_;
-  mutable std::vector<cricket::VideoCodec> supported_codecs_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_SDK_OBJC_FRAMEWORK_CLASSES_PEERCONNECTION_OBJC_VIDEO_ENCODER_FACTORY_H_
diff --git a/sdk/objc/Framework/Classes/VideoToolbox/objc_video_encoder_factory.mm b/sdk/objc/Framework/Classes/VideoToolbox/objc_video_encoder_factory.mm
deleted file mode 100644
index 75b4a34..0000000
--- a/sdk/objc/Framework/Classes/VideoToolbox/objc_video_encoder_factory.mm
+++ /dev/null
@@ -1,167 +0,0 @@
-/*
- *  Copyright 2017 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/sdk/objc/Framework/Classes/VideoToolbox/objc_video_encoder_factory.h"
-
-#include <string>
-
-#import "NSString+StdString.h"
-#import "RTCI420Buffer+Private.h"
-#import "RTCVideoCodec+Private.h"
-#import "WebRTC/RTCVideoCodec.h"
-#import "WebRTC/RTCVideoCodecFactory.h"
-#import "WebRTC/RTCVideoCodecH264.h"
-#import "WebRTC/RTCVideoFrame.h"
-#import "WebRTC/RTCVideoFrameBuffer.h"
-
-#include "webrtc/api/video/video_frame.h"
-#include "webrtc/api/video_codecs/video_encoder.h"
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/modules/video_coding/include/video_codec_interface.h"
-#include "webrtc/modules/video_coding/include/video_error_codes.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/timeutils.h"
-#include "webrtc/sdk/objc/Framework/Classes/Common/helpers.h"
-#include "webrtc/sdk/objc/Framework/Classes/Video/objc_frame_buffer.h"
-
-namespace webrtc {
-
-namespace {
-
-id<RTCVideoFrameBuffer> nativeToRtcFrameBuffer(const rtc::scoped_refptr<VideoFrameBuffer> &buffer) {
-  return buffer->type() == VideoFrameBuffer::Type::kNative ?
-      static_cast<ObjCFrameBuffer *>(buffer.get())->wrapped_frame_buffer() :
-      [[RTCI420Buffer alloc] initWithFrameBuffer:buffer->ToI420()];
-}
-
-RTCVideoFrame *nativeToRtcFrame(const VideoFrame &frame) {
-  RTCVideoFrame *rtcFrame =
-      [[RTCVideoFrame alloc] initWithBuffer:nativeToRtcFrameBuffer(frame.video_frame_buffer())
-                                   rotation:RTCVideoRotation(frame.rotation())
-                                timeStampNs:frame.timestamp_us() * rtc::kNumNanosecsPerMicrosec];
-  rtcFrame.timeStamp = frame.timestamp();
-  return rtcFrame;
-}
-
-class ObjCVideoEncoder : public VideoEncoder {
- public:
-  ObjCVideoEncoder(id<RTCVideoEncoder> encoder)
-      : encoder_(encoder), implementation_name_([encoder implementationName].stdString) {}
-
-  int32_t InitEncode(const VideoCodec *codec_settings,
-                     int32_t number_of_cores,
-                     size_t max_payload_size) {
-    RTCVideoEncoderSettings *settings =
-        [[RTCVideoEncoderSettings alloc] initWithNativeVideoCodec:codec_settings];
-    return [encoder_ startEncodeWithSettings:settings numberOfCores:number_of_cores];
-  }
-
-  int32_t RegisterEncodeCompleteCallback(EncodedImageCallback *callback) {
-    [encoder_ setCallback:^BOOL(RTCEncodedImage *_Nonnull frame,
-                                id<RTCCodecSpecificInfo> _Nonnull info,
-                                RTCRtpFragmentationHeader *_Nonnull header) {
-      EncodedImage encodedImage = [frame nativeEncodedImage];
-
-      // Handle types than can be converted into one of CodecSpecificInfo's hard coded cases.
-      CodecSpecificInfo codecSpecificInfo;
-      if ([info isKindOfClass:[RTCCodecSpecificInfoH264 class]]) {
-        codecSpecificInfo = [(RTCCodecSpecificInfoH264 *)info nativeCodecSpecificInfo];
-      }
-
-      std::unique_ptr<RTPFragmentationHeader> fragmentationHeader =
-          [header createNativeFragmentationHeader];
-      EncodedImageCallback::Result res =
-          callback->OnEncodedImage(encodedImage, &codecSpecificInfo, fragmentationHeader.get());
-      return res.error == EncodedImageCallback::Result::OK;
-    }];
-
-    return WEBRTC_VIDEO_CODEC_OK;
-  }
-
-  int32_t Release() { return [encoder_ releaseEncoder]; }
-
-  int32_t Encode(const VideoFrame &frame,
-                 const CodecSpecificInfo *codec_specific_info,
-                 const std::vector<FrameType> *frame_types) {
-    // CodecSpecificInfo only handles a hard coded list of codecs
-    id<RTCCodecSpecificInfo> rtcCodecSpecificInfo = nil;
-    if (codec_specific_info) {
-      if (strcmp(codec_specific_info->codec_name, "H264") == 0) {
-        RTCCodecSpecificInfoH264 *h264Info = [[RTCCodecSpecificInfoH264 alloc] init];
-        h264Info.packetizationMode =
-            (RTCH264PacketizationMode)codec_specific_info->codecSpecific.H264.packetization_mode;
-        rtcCodecSpecificInfo = h264Info;
-      }
-    }
-
-    NSMutableArray<NSNumber *> *rtcFrameTypes = [NSMutableArray array];
-    for (size_t i = 0; i < frame_types->size(); ++i) {
-      [rtcFrameTypes addObject:@(RTCFrameType(frame_types->at(i)))];
-    }
-
-    return [encoder_ encode:nativeToRtcFrame(frame)
-          codecSpecificInfo:rtcCodecSpecificInfo
-                 frameTypes:rtcFrameTypes];
-  }
-
-  int32_t SetChannelParameters(uint32_t packet_loss, int64_t rtt) { return WEBRTC_VIDEO_CODEC_OK; }
-
-  int32_t SetRates(uint32_t bitrate, uint32_t framerate) {
-    return [encoder_ setBitrate:bitrate framerate:framerate];
-  }
-
-  bool SupportsNativeHandle() const { return true; }
-
-  VideoEncoder::ScalingSettings GetScalingSettings() const {
-    RTCVideoEncoderQpThresholds* qp_thresholds = [encoder_ scalingSettings];
-    return qp_thresholds ?
-        ScalingSettings(true /* enabled */, qp_thresholds.low, qp_thresholds.high) :
-        ScalingSettings(false /* enabled */);
-  }
-
-  const char *ImplementationName() const { return implementation_name_.c_str(); }
-
- private:
-  id<RTCVideoEncoder> encoder_;
-  const std::string implementation_name_;
-};
-}  // namespace
-
-ObjCVideoEncoderFactory::ObjCVideoEncoderFactory(id<RTCVideoEncoderFactory> encoder_factory)
-    : encoder_factory_(encoder_factory) {}
-
-ObjCVideoEncoderFactory::~ObjCVideoEncoderFactory() {}
-
-id<RTCVideoEncoderFactory> ObjCVideoEncoderFactory::wrapped_encoder_factory() const {
-  return encoder_factory_;
-}
-
-VideoEncoder *ObjCVideoEncoderFactory::CreateVideoEncoder(const cricket::VideoCodec &codec) {
-  RTCVideoCodecInfo *info = [[RTCVideoCodecInfo alloc] initWithNativeVideoCodec:codec];
-  id<RTCVideoEncoder> encoder = [encoder_factory_ createEncoder:info];
-  return new ObjCVideoEncoder(encoder);
-}
-
-const std::vector<cricket::VideoCodec> &ObjCVideoEncoderFactory::supported_codecs() const {
-  supported_codecs_.clear();
-  for (RTCVideoCodecInfo *supportedCodec in encoder_factory_.supportedCodecs) {
-    cricket::VideoCodec codec = [supportedCodec nativeVideoCodec];
-    supported_codecs_.push_back(codec);
-  }
-
-  return supported_codecs_;
-}
-
-void ObjCVideoEncoderFactory::DestroyVideoEncoder(VideoEncoder *encoder) {
-  delete encoder;
-  encoder = nullptr;
-}
-
-}  // namespace webrtc
diff --git a/sdk/objc/Framework/Headers/WebRTC/OWNERS b/sdk/objc/Framework/Headers/WebRTC/OWNERS
deleted file mode 100644
index 4b431af..0000000
--- a/sdk/objc/Framework/Headers/WebRTC/OWNERS
+++ /dev/null
@@ -1,27 +0,0 @@
-# Headers for classes closely related to the PeerConnection interface.
-per-file RTCAudioSource.h=deadbeef@webrtc.org
-per-file RTCAudioTrack.h=deadbeef@webrtc.org
-per-file RTCConfiguration.h=deadbeef@webrtc.org
-per-file RTCDataChannelConfiguration.h=deadbeef@webrtc.org
-per-file RTCDataChannel.h=deadbeef@webrtc.org
-per-file RTCIceCandidate.h=deadbeef@webrtc.org
-per-file RTCIceServer.h=deadbeef@webrtc.org
-per-file RTCIntervalRange.h=deadbeef@webrtc.org
-per-file RTCLegacyStatsReport.h=deadbeef@webrtc.org
-per-file RTCMediaConstraints.h=deadbeef@webrtc.org
-per-file RTCMediaSource.h=deadbeef@webrtc.org
-per-file RTCMediaStream.h=deadbeef@webrtc.org
-per-file RTCMediaStreamTrack.h=deadbeef@webrtc.org
-per-file RTCPeerConnectionFactory.h=deadbeef@webrtc.org
-per-file RTCPeerConnection.h=deadbeef@webrtc.org
-per-file RTCRtpCodecParameters.h=deadbeef@webrtc.org
-per-file RTCRtpEncodingParameters.h=deadbeef@webrtc.org
-per-file RTCRtpParameters.h=deadbeef@webrtc.org
-per-file RTCRtpReceiver.h=deadbeef@webrtc.org
-per-file RTCRtpSender.h=deadbeef@webrtc.org
-per-file RTCSessionDescription.h=deadbeef@webrtc.org
-per-file RTCSSLAdapter.h=deadbeef@webrtc.org
-per-file RTCTracing.h=deadbeef@webrtc.org
-per-file RTCVideoCapturer.h=deadbeef@webrtc.org
-per-file RTCVideoSource.h=deadbeef@webrtc.org
-per-file RTCVideoTrack.h=deadbeef@webrtc.org
diff --git a/sdk/objc/Framework/Headers/WebRTC/RTCAVFoundationVideoSource.h b/sdk/objc/Framework/Headers/WebRTC/RTCAVFoundationVideoSource.h
deleted file mode 100644
index 6d369b3..0000000
--- a/sdk/objc/Framework/Headers/WebRTC/RTCAVFoundationVideoSource.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-#import <WebRTC/RTCMacros.h>
-#import <WebRTC/RTCVideoSource.h>
-
-@class AVCaptureSession;
-@class RTCMediaConstraints;
-@class RTCPeerConnectionFactory;
-
-NS_ASSUME_NONNULL_BEGIN
-
-/**
- * DEPRECATED Use RTCCameraVideoCapturer instead.
- *
- * RTCAVFoundationVideoSource is a video source that uses
- * webrtc::AVFoundationVideoCapturer. We do not currently provide a wrapper for
- * that capturer because cricket::VideoCapturer is not ref counted and we cannot
- * guarantee its lifetime. Instead, we expose its properties through the ref
- * counted video source interface.
- */
-RTC_EXPORT
-@interface RTCAVFoundationVideoSource : RTCVideoSource
-
-- (instancetype)init NS_UNAVAILABLE;
-
-/**
- * Calling this function will cause frames to be scaled down to the
- * requested resolution. Also, frames will be cropped to match the
- * requested aspect ratio, and frames will be dropped to match the
- * requested fps. The requested aspect ratio is orientation agnostic and
- * will be adjusted to maintain the input orientation, so it doesn't
- * matter if e.g. 1280x720 or 720x1280 is requested.
- */
-- (void)adaptOutputFormatToWidth:(int)width height:(int)height fps:(int)fps;
-
-/** Returns whether rear-facing camera is available for use. */
-@property(nonatomic, readonly) BOOL canUseBackCamera;
-
-/** Switches the camera being used (either front or back). */
-@property(nonatomic, assign) BOOL useBackCamera;
-
-/** Returns the active capture session. */
-@property(nonatomic, readonly) AVCaptureSession *captureSession;
-
-@end
-
-NS_ASSUME_NONNULL_END
diff --git a/sdk/objc/Framework/Headers/WebRTC/RTCAudioSession.h b/sdk/objc/Framework/Headers/WebRTC/RTCAudioSession.h
deleted file mode 100644
index 751734a..0000000
--- a/sdk/objc/Framework/Headers/WebRTC/RTCAudioSession.h
+++ /dev/null
@@ -1,248 +0,0 @@
-/*
- *  Copyright 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.
- */
-
-#import <AVFoundation/AVFoundation.h>
-#import <Foundation/Foundation.h>
-
-#import "webrtc/sdk/objc/Framework/Headers/WebRTC/RTCMacros.h"
-
-NS_ASSUME_NONNULL_BEGIN
-
-extern NSString * const kRTCAudioSessionErrorDomain;
-/** Method that requires lock was called without lock. */
-extern NSInteger const kRTCAudioSessionErrorLockRequired;
-/** Unknown configuration error occurred. */
-extern NSInteger const kRTCAudioSessionErrorConfiguration;
-
-@class RTCAudioSession;
-@class RTCAudioSessionConfiguration;
-
-// Surfaces AVAudioSession events. WebRTC will listen directly for notifications
-// from AVAudioSession and handle them before calling these delegate methods,
-// at which point applications can perform additional processing if required.
-RTC_EXPORT
-@protocol RTCAudioSessionDelegate <NSObject>
-
-@optional
-/** Called on a system notification thread when AVAudioSession starts an
- *  interruption event.
- */
-- (void)audioSessionDidBeginInterruption:(RTCAudioSession *)session;
-
-/** Called on a system notification thread when AVAudioSession ends an
- *  interruption event.
- */
-- (void)audioSessionDidEndInterruption:(RTCAudioSession *)session
-                   shouldResumeSession:(BOOL)shouldResumeSession;
-
-/** Called on a system notification thread when AVAudioSession changes the
- *  route.
- */
-- (void)audioSessionDidChangeRoute:(RTCAudioSession *)session
-           reason:(AVAudioSessionRouteChangeReason)reason
-    previousRoute:(AVAudioSessionRouteDescription *)previousRoute;
-
-/** Called on a system notification thread when AVAudioSession media server
- *  terminates.
- */
-- (void)audioSessionMediaServerTerminated:(RTCAudioSession *)session;
-
-/** Called on a system notification thread when AVAudioSession media server
- *  restarts.
- */
-- (void)audioSessionMediaServerReset:(RTCAudioSession *)session;
-
-// TODO(tkchin): Maybe handle SilenceSecondaryAudioHintNotification.
-
-- (void)audioSession:(RTCAudioSession *)session
-    didChangeCanPlayOrRecord:(BOOL)canPlayOrRecord;
-
-/** Called on a WebRTC thread when the audio device is notified to begin
- *  playback or recording.
- */
-- (void)audioSessionDidStartPlayOrRecord:(RTCAudioSession *)session;
-
-/** Called on a WebRTC thread when the audio device is notified to stop
- *  playback or recording.
- */
-- (void)audioSessionDidStopPlayOrRecord:(RTCAudioSession *)session;
-
-/** Called when the AVAudioSession output volume value changes. */
-- (void)audioSession:(RTCAudioSession *)audioSession
-    didChangeOutputVolume:(float)outputVolume;
-
-/** Called when the audio device detects a playout glitch. The argument is the
- *  number of glitches detected so far in the current audio playout session.
- */
-- (void)audioSession:(RTCAudioSession *)audioSession
-    didDetectPlayoutGlitch:(int64_t)totalNumberOfGlitches;
-
-@end
-
-/** This is a protocol used to inform RTCAudioSession when the audio session
- *  activation state has changed outside of RTCAudioSession. The current known use
- *  case of this is when CallKit activates the audio session for the application
- */
-RTC_EXPORT
-@protocol RTCAudioSessionActivationDelegate <NSObject>
-
-/** Called when the audio session is activated outside of the app by iOS. */
-- (void)audioSessionDidActivate:(AVAudioSession *)session;
-
-/** Called when the audio session is deactivated outside of the app by iOS. */
-- (void)audioSessionDidDeactivate:(AVAudioSession *)session;
-
-@end
-
-/** Proxy class for AVAudioSession that adds a locking mechanism similar to
- *  AVCaptureDevice. This is used to that interleaving configurations between
- *  WebRTC and the application layer are avoided.
- *
- *  RTCAudioSession also coordinates activation so that the audio session is
- *  activated only once. See |setActive:error:|.
- */
-RTC_EXPORT
-@interface RTCAudioSession : NSObject <RTCAudioSessionActivationDelegate>
-
-/** Convenience property to access the AVAudioSession singleton. Callers should
- *  not call setters on AVAudioSession directly, but other method invocations
- *  are fine.
- */
-@property(nonatomic, readonly) AVAudioSession *session;
-
-/** Our best guess at whether the session is active based on results of calls to
- *  AVAudioSession.
- */
-@property(nonatomic, readonly) BOOL isActive;
-/** Whether RTCAudioSession is currently locked for configuration. */
-@property(nonatomic, readonly) BOOL isLocked;
-
-/** If YES, WebRTC will not initialize the audio unit automatically when an
- *  audio track is ready for playout or recording. Instead, applications should
- *  call setIsAudioEnabled. If NO, WebRTC will initialize the audio unit
- *  as soon as an audio track is ready for playout or recording.
- */
-@property(nonatomic, assign) BOOL useManualAudio;
-
-/** This property is only effective if useManualAudio is YES.
- *  Represents permission for WebRTC to initialize the VoIP audio unit.
- *  When set to NO, if the VoIP audio unit used by WebRTC is active, it will be
- *  stopped and uninitialized. This will stop incoming and outgoing audio.
- *  When set to YES, WebRTC will initialize and start the audio unit when it is
- *  needed (e.g. due to establishing an audio connection).
- *  This property was introduced to work around an issue where if an AVPlayer is
- *  playing audio while the VoIP audio unit is initialized, its audio would be
- *  either cut off completely or played at a reduced volume. By preventing
- *  the audio unit from being initialized until after the audio has completed,
- *  we are able to prevent the abrupt cutoff.
- */
-@property(nonatomic, assign) BOOL isAudioEnabled;
-
-// Proxy properties.
-@property(readonly) NSString *category;
-@property(readonly) AVAudioSessionCategoryOptions categoryOptions;
-@property(readonly) NSString *mode;
-@property(readonly) BOOL secondaryAudioShouldBeSilencedHint;
-@property(readonly) AVAudioSessionRouteDescription *currentRoute;
-@property(readonly) NSInteger maximumInputNumberOfChannels;
-@property(readonly) NSInteger maximumOutputNumberOfChannels;
-@property(readonly) float inputGain;
-@property(readonly) BOOL inputGainSettable;
-@property(readonly) BOOL inputAvailable;
-@property(readonly, nullable)
-    NSArray<AVAudioSessionDataSourceDescription *> * inputDataSources;
-@property(readonly, nullable)
-  AVAudioSessionDataSourceDescription *inputDataSource;
-@property(readonly, nullable)
-    NSArray<AVAudioSessionDataSourceDescription *> * outputDataSources;
-@property(readonly, nullable)
-    AVAudioSessionDataSourceDescription *outputDataSource;
-@property(readonly) double sampleRate;
-@property(readonly) double preferredSampleRate;
-@property(readonly) NSInteger inputNumberOfChannels;
-@property(readonly) NSInteger outputNumberOfChannels;
-@property(readonly) float outputVolume;
-@property(readonly) NSTimeInterval inputLatency;
-@property(readonly) NSTimeInterval outputLatency;
-@property(readonly) NSTimeInterval IOBufferDuration;
-@property(readonly) NSTimeInterval preferredIOBufferDuration;
-
-/** Default constructor. */
-+ (instancetype)sharedInstance;
-- (instancetype)init NS_UNAVAILABLE;
-
-/** Adds a delegate, which is held weakly. */
-- (void)addDelegate:(id<RTCAudioSessionDelegate>)delegate;
-/** Removes an added delegate. */
-- (void)removeDelegate:(id<RTCAudioSessionDelegate>)delegate;
-
-/** Request exclusive access to the audio session for configuration. This call
- *  will block if the lock is held by another object.
- */
-- (void)lockForConfiguration;
-/** Relinquishes exclusive access to the audio session. */
-- (void)unlockForConfiguration;
-
-/** If |active|, activates the audio session if it isn't already active.
- *  Successful calls must be balanced with a setActive:NO when activation is no
- *  longer required. If not |active|, deactivates the audio session if one is
- *  active and this is the last balanced call. When deactivating, the
- *  AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation option is passed to
- *  AVAudioSession.
- */
-- (BOOL)setActive:(BOOL)active
-            error:(NSError **)outError;
-
-// The following methods are proxies for the associated methods on
-// AVAudioSession. |lockForConfiguration| must be called before using them
-// otherwise they will fail with kRTCAudioSessionErrorLockRequired.
-
-- (BOOL)setCategory:(NSString *)category
-        withOptions:(AVAudioSessionCategoryOptions)options
-              error:(NSError **)outError;
-- (BOOL)setMode:(NSString *)mode error:(NSError **)outError;
-- (BOOL)setInputGain:(float)gain error:(NSError **)outError;
-- (BOOL)setPreferredSampleRate:(double)sampleRate error:(NSError **)outError;
-- (BOOL)setPreferredIOBufferDuration:(NSTimeInterval)duration
-                               error:(NSError **)outError;
-- (BOOL)setPreferredInputNumberOfChannels:(NSInteger)count
-                                    error:(NSError **)outError;
-- (BOOL)setPreferredOutputNumberOfChannels:(NSInteger)count
-                                     error:(NSError **)outError;
-- (BOOL)overrideOutputAudioPort:(AVAudioSessionPortOverride)portOverride
-                          error:(NSError **)outError;
-- (BOOL)setPreferredInput:(AVAudioSessionPortDescription *)inPort
-                    error:(NSError **)outError;
-- (BOOL)setInputDataSource:(AVAudioSessionDataSourceDescription *)dataSource
-                     error:(NSError **)outError;
-- (BOOL)setOutputDataSource:(AVAudioSessionDataSourceDescription *)dataSource
-                      error:(NSError **)outError;
-@end
-
-@interface RTCAudioSession (Configuration)
-
-/** Applies the configuration to the current session. Attempts to set all
- *  properties even if previous ones fail. Only the last error will be
- *  returned.
- *  |lockForConfiguration| must be called first.
- */
-- (BOOL)setConfiguration:(RTCAudioSessionConfiguration *)configuration
-                   error:(NSError **)outError;
-
-/** Convenience method that calls both setConfiguration and setActive.
- *  |lockForConfiguration| must be called first.
- */
-- (BOOL)setConfiguration:(RTCAudioSessionConfiguration *)configuration
-                  active:(BOOL)active
-                   error:(NSError **)outError;
-
-@end
-
-NS_ASSUME_NONNULL_END
diff --git a/sdk/objc/Framework/Headers/WebRTC/RTCAudioSessionConfiguration.h b/sdk/objc/Framework/Headers/WebRTC/RTCAudioSessionConfiguration.h
deleted file mode 100644
index 6a02751..0000000
--- a/sdk/objc/Framework/Headers/WebRTC/RTCAudioSessionConfiguration.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- *  Copyright 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.
- */
-
-#import <AVFoundation/AVFoundation.h>
-#import <Foundation/Foundation.h>
-
-#import "WebRTC/RTCMacros.h"
-
-NS_ASSUME_NONNULL_BEGIN
-
-extern const int kRTCAudioSessionPreferredNumberOfChannels;
-extern const double kRTCAudioSessionHighPerformanceSampleRate;
-extern const double kRTCAudioSessionLowComplexitySampleRate;
-extern const double kRTCAudioSessionHighPerformanceIOBufferDuration;
-extern const double kRTCAudioSessionLowComplexityIOBufferDuration;
-
-// Struct to hold configuration values.
-RTC_EXPORT
-@interface RTCAudioSessionConfiguration : NSObject
-
-@property(nonatomic, strong) NSString *category;
-@property(nonatomic, assign) AVAudioSessionCategoryOptions categoryOptions;
-@property(nonatomic, strong) NSString *mode;
-@property(nonatomic, assign) double sampleRate;
-@property(nonatomic, assign) NSTimeInterval ioBufferDuration;
-@property(nonatomic, assign) NSInteger inputNumberOfChannels;
-@property(nonatomic, assign) NSInteger outputNumberOfChannels;
-
-/** Initializes configuration to defaults. */
-- (instancetype)init NS_DESIGNATED_INITIALIZER;
-
-/** Returns the current configuration of the audio session. */
-+ (instancetype)currentConfiguration;
-/** Returns the configuration that WebRTC needs. */
-+ (instancetype)webRTCConfiguration;
-/** Provide a way to override the default configuration. */
-+ (void)setWebRTCConfiguration:(RTCAudioSessionConfiguration *)configuration;
-
-@end
-
-NS_ASSUME_NONNULL_END
diff --git a/sdk/objc/Framework/Headers/WebRTC/RTCAudioSource.h b/sdk/objc/Framework/Headers/WebRTC/RTCAudioSource.h
deleted file mode 100644
index 3db3157..0000000
--- a/sdk/objc/Framework/Headers/WebRTC/RTCAudioSource.h
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- *  Copyright 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.
- */
-
-#import <Foundation/Foundation.h>
-
-#import <WebRTC/RTCMacros.h>
-#import <WebRTC/RTCMediaSource.h>
-
-NS_ASSUME_NONNULL_BEGIN
-
-RTC_EXPORT
-@interface RTCAudioSource : RTCMediaSource
-
-- (instancetype)init NS_UNAVAILABLE;
-
-// Sets the volume for the RTCMediaSource. |volume| is a gain value in the range
-// [0, 10].
-// Temporary fix to be able to modify volume of remote audio tracks.
-// TODO(kthelgason): Property stays here temporarily until a proper volume-api
-// is available on the surface exposed by webrtc.
-@property(nonatomic, assign) double volume;
-
-@end
-
-NS_ASSUME_NONNULL_END
diff --git a/sdk/objc/Framework/Headers/WebRTC/RTCAudioTrack.h b/sdk/objc/Framework/Headers/WebRTC/RTCAudioTrack.h
deleted file mode 100644
index b83eede..0000000
--- a/sdk/objc/Framework/Headers/WebRTC/RTCAudioTrack.h
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-#import <WebRTC/RTCMacros.h>
-#import <WebRTC/RTCMediaStreamTrack.h>
-
-NS_ASSUME_NONNULL_BEGIN
-
-@class RTCAudioSource;
-
-RTC_EXPORT
-@interface RTCAudioTrack : RTCMediaStreamTrack
-
-- (instancetype)init NS_UNAVAILABLE;
-
-/** The audio source for this audio track. */
-@property(nonatomic, readonly) RTCAudioSource *source;
-
-@end
-
-NS_ASSUME_NONNULL_END
diff --git a/sdk/objc/Framework/Headers/WebRTC/RTCCameraPreviewView.h b/sdk/objc/Framework/Headers/WebRTC/RTCCameraPreviewView.h
deleted file mode 100644
index 9018aec..0000000
--- a/sdk/objc/Framework/Headers/WebRTC/RTCCameraPreviewView.h
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-#import <Foundation/Foundation.h>
-#import <UIKit/UIKit.h>
-
-#import <WebRTC/RTCMacros.h>
-
-@class AVCaptureSession;
-@class RTCAVFoundationVideoSource;
-
-/** RTCCameraPreviewView is a view that renders local video from an
- *  AVCaptureSession.
- */
-RTC_EXPORT
-@interface RTCCameraPreviewView : UIView
-
-/** The capture session being rendered in the view. Capture session
- *  is assigned to AVCaptureVideoPreviewLayer async in the same
- *  queue that the AVCaptureSession is started/stopped.
- */
-@property(nonatomic, strong) AVCaptureSession *captureSession;
-
-@end
diff --git a/sdk/objc/Framework/Headers/WebRTC/RTCCameraVideoCapturer.h b/sdk/objc/Framework/Headers/WebRTC/RTCCameraVideoCapturer.h
deleted file mode 100644
index 943ddc8..0000000
--- a/sdk/objc/Framework/Headers/WebRTC/RTCCameraVideoCapturer.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- *  Copyright 2017 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.
- */
-
-#import <Foundation/Foundation.h>
-#import <AVFoundation/AVFoundation.h>
-
-#import <WebRTC/RTCMacros.h>
-#import <WebRTC/RTCVideoCapturer.h>
-
-NS_ASSUME_NONNULL_BEGIN
-
-RTC_EXPORT
-// Camera capture that implements RTCVideoCapturer. Delivers frames to a RTCVideoCapturerDelegate
-// (usually RTCVideoSource).
-@interface RTCCameraVideoCapturer : RTCVideoCapturer
-
-// Capture session that is used for capturing. Valid from initialization to dealloc.
-@property(readonly, nonatomic) AVCaptureSession *captureSession;
-
-// Returns list of available capture devices that support video capture.
-+ (NSArray<AVCaptureDevice *> *)captureDevices;
-// Returns list of formats that are supported by this class for this device.
-+ (NSArray<AVCaptureDeviceFormat *> *)supportedFormatsForDevice:(AVCaptureDevice *)device;
-
-// Starts and stops the capture session asynchronously.
-- (void)startCaptureWithDevice:(AVCaptureDevice *)device
-                        format:(AVCaptureDeviceFormat *)format
-                           fps:(NSInteger)fps;
-// Stops the capture session asynchronously.
-- (void)stopCapture;
-
-@end
-
-NS_ASSUME_NONNULL_END
diff --git a/sdk/objc/Framework/Headers/WebRTC/RTCConfiguration.h b/sdk/objc/Framework/Headers/WebRTC/RTCConfiguration.h
deleted file mode 100644
index fcb62b9..0000000
--- a/sdk/objc/Framework/Headers/WebRTC/RTCConfiguration.h
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-#import <Foundation/Foundation.h>
-
-#import <WebRTC/RTCMacros.h>
-
-@class RTCIceServer;
-@class RTCIntervalRange;
-
-/**
- * Represents the ice transport policy. This exposes the same states in C++,
- * which include one more state than what exists in the W3C spec.
- */
-typedef NS_ENUM(NSInteger, RTCIceTransportPolicy) {
-  RTCIceTransportPolicyNone,
-  RTCIceTransportPolicyRelay,
-  RTCIceTransportPolicyNoHost,
-  RTCIceTransportPolicyAll
-};
-
-/** Represents the bundle policy. */
-typedef NS_ENUM(NSInteger, RTCBundlePolicy) {
-  RTCBundlePolicyBalanced,
-  RTCBundlePolicyMaxCompat,
-  RTCBundlePolicyMaxBundle
-};
-
-/** Represents the rtcp mux policy. */
-typedef NS_ENUM(NSInteger, RTCRtcpMuxPolicy) {
-  RTCRtcpMuxPolicyNegotiate,
-  RTCRtcpMuxPolicyRequire
-};
-
-/** Represents the tcp candidate policy. */
-typedef NS_ENUM(NSInteger, RTCTcpCandidatePolicy) {
-  RTCTcpCandidatePolicyEnabled,
-  RTCTcpCandidatePolicyDisabled
-};
-
-/** Represents the candidate network policy. */
-typedef NS_ENUM(NSInteger, RTCCandidateNetworkPolicy) {
-  RTCCandidateNetworkPolicyAll,
-  RTCCandidateNetworkPolicyLowCost
-};
-
-/** Represents the continual gathering policy. */
-typedef NS_ENUM(NSInteger, RTCContinualGatheringPolicy) {
-  RTCContinualGatheringPolicyGatherOnce,
-  RTCContinualGatheringPolicyGatherContinually
-};
-
-/** Represents the encryption key type. */
-typedef NS_ENUM(NSInteger, RTCEncryptionKeyType) {
-  RTCEncryptionKeyTypeRSA,
-  RTCEncryptionKeyTypeECDSA,
-};
-
-NS_ASSUME_NONNULL_BEGIN
-
-RTC_EXPORT
-@interface RTCConfiguration : NSObject
-
-/** An array of Ice Servers available to be used by ICE. */
-@property(nonatomic, copy) NSArray<RTCIceServer *> *iceServers;
-
-/** Which candidates the ICE agent is allowed to use. The W3C calls it
- * |iceTransportPolicy|, while in C++ it is called |type|. */
-@property(nonatomic, assign) RTCIceTransportPolicy iceTransportPolicy;
-
-/** The media-bundling policy to use when gathering ICE candidates. */
-@property(nonatomic, assign) RTCBundlePolicy bundlePolicy;
-
-/** The rtcp-mux policy to use when gathering ICE candidates. */
-@property(nonatomic, assign) RTCRtcpMuxPolicy rtcpMuxPolicy;
-@property(nonatomic, assign) RTCTcpCandidatePolicy tcpCandidatePolicy;
-@property(nonatomic, assign) RTCCandidateNetworkPolicy candidateNetworkPolicy;
-@property(nonatomic, assign)
-    RTCContinualGatheringPolicy continualGatheringPolicy;
-
-/** By default, the PeerConnection will use a limited number of IPv6 network
- *  interfaces, in order to avoid too many ICE candidate pairs being created
- *  and delaying ICE completion.
- *
- *  Can be set to INT_MAX to effectively disable the limit.
- */
-@property(nonatomic, assign) int maxIPv6Networks;
-
-@property(nonatomic, assign) int audioJitterBufferMaxPackets;
-@property(nonatomic, assign) BOOL audioJitterBufferFastAccelerate;
-@property(nonatomic, assign) int iceConnectionReceivingTimeout;
-@property(nonatomic, assign) int iceBackupCandidatePairPingInterval;
-
-/** Key type used to generate SSL identity. Default is ECDSA. */
-@property(nonatomic, assign) RTCEncryptionKeyType keyType;
-
-/** ICE candidate pool size as defined in JSEP. Default is 0. */
-@property(nonatomic, assign) int iceCandidatePoolSize;
-
-/** Prune turn ports on the same network to the same turn server.
- *  Default is NO.
- */
-@property(nonatomic, assign) BOOL shouldPruneTurnPorts;
-
-/** If set to YES, this means the ICE transport should presume TURN-to-TURN
- *  candidate pairs will succeed, even before a binding response is received.
- */
-@property(nonatomic, assign) BOOL shouldPresumeWritableWhenFullyRelayed;
-
-/** If set to non-nil, controls the minimal interval between consecutive ICE
- *  check packets.
- */
-@property(nonatomic, copy, nullable) NSNumber *iceCheckMinInterval;
-
-/** ICE Periodic Regathering
- *  If set, WebRTC will periodically create and propose candidates without
- *  starting a new ICE generation. The regathering happens continuously with
- *  interval specified in milliseconds by the uniform distribution [a, b].
- */
-@property(nonatomic, strong, nullable) RTCIntervalRange *iceRegatherIntervalRange;
-
-- (instancetype)init;
-
-@end
-
-NS_ASSUME_NONNULL_END
diff --git a/sdk/objc/Framework/Headers/WebRTC/RTCDataChannel.h b/sdk/objc/Framework/Headers/WebRTC/RTCDataChannel.h
deleted file mode 100644
index 893bd0a..0000000
--- a/sdk/objc/Framework/Headers/WebRTC/RTCDataChannel.h
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-#import <AvailabilityMacros.h>
-#import <Foundation/Foundation.h>
-
-#import <WebRTC/RTCMacros.h>
-
-NS_ASSUME_NONNULL_BEGIN
-
-RTC_EXPORT
-@interface RTCDataBuffer : NSObject
-
-/** NSData representation of the underlying buffer. */
-@property(nonatomic, readonly) NSData *data;
-
-/** Indicates whether |data| contains UTF-8 or binary data. */
-@property(nonatomic, readonly) BOOL isBinary;
-
-- (instancetype)init NS_UNAVAILABLE;
-
-/**
- * Initialize an RTCDataBuffer from NSData. |isBinary| indicates whether |data|
- * contains UTF-8 or binary data.
- */
-- (instancetype)initWithData:(NSData *)data isBinary:(BOOL)isBinary;
-
-@end
-
-
-@class RTCDataChannel;
-RTC_EXPORT
-@protocol RTCDataChannelDelegate <NSObject>
-
-/** The data channel state changed. */
-- (void)dataChannelDidChangeState:(RTCDataChannel *)dataChannel;
-
-/** The data channel successfully received a data buffer. */
-- (void)dataChannel:(RTCDataChannel *)dataChannel
-    didReceiveMessageWithBuffer:(RTCDataBuffer *)buffer;
-
-@optional
-/** The data channel's |bufferedAmount| changed. */
-- (void)dataChannel:(RTCDataChannel *)dataChannel
-    didChangeBufferedAmount:(uint64_t)amount;
-
-@end
-
-
-/** Represents the state of the data channel. */
-typedef NS_ENUM(NSInteger, RTCDataChannelState) {
-  RTCDataChannelStateConnecting,
-  RTCDataChannelStateOpen,
-  RTCDataChannelStateClosing,
-  RTCDataChannelStateClosed,
-};
-
-RTC_EXPORT
-@interface RTCDataChannel : NSObject
-
-/**
- * A label that can be used to distinguish this data channel from other data
- * channel objects.
- */
-@property(nonatomic, readonly) NSString *label;
-
-/** Whether the data channel can send messages in unreliable mode. */
-@property(nonatomic, readonly) BOOL isReliable DEPRECATED_ATTRIBUTE;
-
-/** Returns whether this data channel is ordered or not. */
-@property(nonatomic, readonly) BOOL isOrdered;
-
-/** Deprecated. Use maxPacketLifeTime. */
-@property(nonatomic, readonly) NSUInteger maxRetransmitTime
-    DEPRECATED_ATTRIBUTE;
-
-/**
- * The length of the time window (in milliseconds) during which transmissions
- * and retransmissions may occur in unreliable mode.
- */
-@property(nonatomic, readonly) uint16_t maxPacketLifeTime;
-
-/**
- * The maximum number of retransmissions that are attempted in unreliable mode.
- */
-@property(nonatomic, readonly) uint16_t maxRetransmits;
-
-/**
- * The name of the sub-protocol used with this data channel, if any. Otherwise
- * this returns an empty string.
- */
-@property(nonatomic, readonly) NSString *protocol;
-
-/**
- * Returns whether this data channel was negotiated by the application or not.
- */
-@property(nonatomic, readonly) BOOL isNegotiated;
-
-/** Deprecated. Use channelId. */
-@property(nonatomic, readonly) NSInteger streamId DEPRECATED_ATTRIBUTE;
-
-/** The identifier for this data channel. */
-@property(nonatomic, readonly) int channelId;
-
-/** The state of the data channel. */
-@property(nonatomic, readonly) RTCDataChannelState readyState;
-
-/**
- * The number of bytes of application data that have been queued using
- * |sendData:| but that have not yet been transmitted to the network.
- */
-@property(nonatomic, readonly) uint64_t bufferedAmount;
-
-/** The delegate for this data channel. */
-@property(nonatomic, weak) id<RTCDataChannelDelegate> delegate;
-
-- (instancetype)init NS_UNAVAILABLE;
-
-/** Closes the data channel. */
-- (void)close;
-
-/** Attempt to send |data| on this data channel's underlying data transport. */
-- (BOOL)sendData:(RTCDataBuffer *)data;
-
-@end
-
-NS_ASSUME_NONNULL_END
diff --git a/sdk/objc/Framework/Headers/WebRTC/RTCDataChannelConfiguration.h b/sdk/objc/Framework/Headers/WebRTC/RTCDataChannelConfiguration.h
deleted file mode 100644
index 65f5931..0000000
--- a/sdk/objc/Framework/Headers/WebRTC/RTCDataChannelConfiguration.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-#import <AvailabilityMacros.h>
-#import <Foundation/Foundation.h>
-
-#import <WebRTC/RTCMacros.h>
-
-NS_ASSUME_NONNULL_BEGIN
-
-RTC_EXPORT
-@interface RTCDataChannelConfiguration : NSObject
-
-/** Set to YES if ordered delivery is required. */
-@property(nonatomic, assign) BOOL isOrdered;
-
-/** Deprecated. Use maxPacketLifeTime. */
-@property(nonatomic, assign) NSInteger maxRetransmitTimeMs DEPRECATED_ATTRIBUTE;
-
-/**
- * Max period in milliseconds in which retransmissions will be sent. After this
- * time, no more retransmissions will be sent. -1 if unset.
- */
-@property(nonatomic, assign) int maxPacketLifeTime;
-
-/** The max number of retransmissions. -1 if unset. */
-@property(nonatomic, assign) int maxRetransmits;
-
-/** Set to YES if the channel has been externally negotiated and we do not send
- * an in-band signalling in the form of an "open" message.
- */
-@property(nonatomic, assign) BOOL isNegotiated;
-
-/** Deprecated. Use channelId. */
-@property(nonatomic, assign) int streamId DEPRECATED_ATTRIBUTE;
-
-/** The id of the data channel. */
-@property(nonatomic, assign) int channelId;
-
-/** Set by the application and opaque to the WebRTC implementation. */
-@property(nonatomic) NSString *protocol;
-
-@end
-
-NS_ASSUME_NONNULL_END
diff --git a/sdk/objc/Framework/Headers/WebRTC/RTCDispatcher.h b/sdk/objc/Framework/Headers/WebRTC/RTCDispatcher.h
deleted file mode 100644
index 3dddead..0000000
--- a/sdk/objc/Framework/Headers/WebRTC/RTCDispatcher.h
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-#import <Foundation/Foundation.h>
-
-#import <WebRTC/RTCMacros.h>
-
-typedef NS_ENUM(NSInteger, RTCDispatcherQueueType) {
-  // Main dispatcher queue.
-  RTCDispatcherTypeMain,
-  // Used for starting/stopping AVCaptureSession, and assigning
-  // capture session to AVCaptureVideoPreviewLayer.
-  RTCDispatcherTypeCaptureSession,
-  // Used for operations on AVAudioSession.
-  RTCDispatcherTypeAudioSession,
-};
-
-/** Dispatcher that asynchronously dispatches blocks to a specific
- *  shared dispatch queue.
- */
-RTC_EXPORT
-@interface RTCDispatcher : NSObject
-
-- (instancetype)init NS_UNAVAILABLE;
-
-/** Dispatch the block asynchronously on the queue for dispatchType.
- *  @param dispatchType The queue type to dispatch on.
- *  @param block The block to dispatch asynchronously.
- */
-+ (void)dispatchAsyncOnType:(RTCDispatcherQueueType)dispatchType
-                      block:(dispatch_block_t)block;
-
-/** Returns YES if run on queue for the dispatchType otherwise NO.
- *  Useful for asserting that a method is run on a correct queue.
- */
-+ (BOOL)isOnQueueForType:(RTCDispatcherQueueType)dispatchType;
-
-@end
diff --git a/sdk/objc/Framework/Headers/WebRTC/RTCEAGLVideoView.h b/sdk/objc/Framework/Headers/WebRTC/RTCEAGLVideoView.h
deleted file mode 100644
index 60c624e..0000000
--- a/sdk/objc/Framework/Headers/WebRTC/RTCEAGLVideoView.h
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-#import <Foundation/Foundation.h>
-#import <UIKit/UIKit.h>
-
-#import <WebRTC/RTCMacros.h>
-#import <WebRTC/RTCVideoRenderer.h>
-#import <WebRTC/RTCVideoViewShading.h>
-
-NS_ASSUME_NONNULL_BEGIN
-
-@class RTCEAGLVideoView;
-RTC_EXPORT
-@protocol RTCEAGLVideoViewDelegate
-
-- (void)videoView:(RTCEAGLVideoView *)videoView didChangeVideoSize:(CGSize)size;
-
-@end
-
-/**
- * RTCEAGLVideoView is an RTCVideoRenderer which renders video frames in its
- * bounds using OpenGLES 2.0 or OpenGLES 3.0.
- */
-RTC_EXPORT
-@interface RTCEAGLVideoView : UIView <RTCVideoRenderer>
-
-@property(nonatomic, weak) id<RTCEAGLVideoViewDelegate> delegate;
-
-- (instancetype)initWithFrame:(CGRect)frame
-                       shader:(id<RTCVideoViewShading>)shader NS_DESIGNATED_INITIALIZER;
-
-- (instancetype)initWithCoder:(NSCoder *)aDecoder
-                       shader:(id<RTCVideoViewShading>)shader NS_DESIGNATED_INITIALIZER;
-
-@end
-
-NS_ASSUME_NONNULL_END
diff --git a/sdk/objc/Framework/Headers/WebRTC/RTCFieldTrials.h b/sdk/objc/Framework/Headers/WebRTC/RTCFieldTrials.h
deleted file mode 100644
index 78d6961..0000000
--- a/sdk/objc/Framework/Headers/WebRTC/RTCFieldTrials.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- *  Copyright 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.
- */
-
-#import <Foundation/Foundation.h>
-
-#import <WebRTC/RTCMacros.h>
-
-/** The only valid value for the following if set is kRTCFieldTrialEnabledValue. */
-RTC_EXTERN NSString * const kRTCFieldTrialAudioSendSideBweKey;
-RTC_EXTERN NSString * const kRTCFieldTrialSendSideBweWithOverheadKey;
-RTC_EXTERN NSString * const kRTCFieldTrialFlexFec03AdvertisedKey;
-RTC_EXTERN NSString * const kRTCFieldTrialFlexFec03Key;
-RTC_EXTERN NSString * const kRTCFieldTrialImprovedBitrateEstimateKey;
-RTC_EXTERN NSString * const kRTCFieldTrialH264HighProfileKey;
-RTC_EXTERN NSString * const kRTCFieldTrialMinimizeResamplingOnMobileKey;
-
-/** The valid value for field trials above. */
-RTC_EXTERN NSString * const kRTCFieldTrialEnabledValue;
-
-/** Use a string returned by RTCFieldTrialMedianSlopeFilterValue as the value. */
-RTC_EXTERN NSString * const kRTCFieldTrialMedianSlopeFilterKey;
-RTC_EXTERN NSString *RTCFieldTrialMedianSlopeFilterValue(
-    size_t windowSize, double thresholdGain);
-
-/** Use a string returned by RTCFieldTrialTrendlineFilterValue as the value. */
-RTC_EXTERN NSString * const kRTCFieldTrialTrendlineFilterKey;
-/** Returns a valid value for kRTCFieldTrialTrendlineFilterKey. */
-RTC_EXTERN NSString *RTCFieldTrialTrendlineFilterValue(
-    size_t windowSize, double smoothingCoeff, double thresholdGain);
-
-/** Initialize field trials using a dictionary mapping field trial keys to their values. See above
- *  for valid keys and values.
- *  Must be called before any other call into WebRTC. See:
- *  webrtc/system_wrappers/include/field_trial_default.h
- */
-RTC_EXTERN void RTCInitFieldTrialDictionary(NSDictionary<NSString *, NSString *> *fieldTrials);
diff --git a/sdk/objc/Framework/Headers/WebRTC/RTCFileLogger.h b/sdk/objc/Framework/Headers/WebRTC/RTCFileLogger.h
deleted file mode 100644
index 5656b7b..0000000
--- a/sdk/objc/Framework/Headers/WebRTC/RTCFileLogger.h
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-#import <Foundation/Foundation.h>
-
-#import <WebRTC/RTCMacros.h>
-
-typedef NS_ENUM(NSUInteger, RTCFileLoggerSeverity) {
-  RTCFileLoggerSeverityVerbose,
-  RTCFileLoggerSeverityInfo,
-  RTCFileLoggerSeverityWarning,
-  RTCFileLoggerSeverityError
-};
-
-typedef NS_ENUM(NSUInteger, RTCFileLoggerRotationType) {
-  RTCFileLoggerTypeCall,
-  RTCFileLoggerTypeApp,
-};
-
-NS_ASSUME_NONNULL_BEGIN
-
-// This class intercepts WebRTC logs and saves them to a file. The file size
-// will not exceed the given maximum bytesize. When the maximum bytesize is
-// reached, logs are rotated according to the rotationType specified.
-// For kRTCFileLoggerTypeCall, logs from the beginning and the end
-// are preserved while the middle section is overwritten instead.
-// For kRTCFileLoggerTypeApp, the oldest log is overwritten.
-// This class is not threadsafe.
-RTC_EXPORT
-@interface RTCFileLogger : NSObject
-
-// The severity level to capture. The default is kRTCFileLoggerSeverityInfo.
-@property(nonatomic, assign) RTCFileLoggerSeverity severity;
-
-// The rotation type for this file logger. The default is
-// kRTCFileLoggerTypeCall.
-@property(nonatomic, readonly) RTCFileLoggerRotationType rotationType;
-
-// Disables buffering disk writes. Should be set before |start|. Buffering
-// is enabled by default for performance.
-@property(nonatomic, assign) BOOL shouldDisableBuffering;
-
-// Default constructor provides default settings for dir path, file size and
-// rotation type.
-- (instancetype)init;
-
-// Create file logger with default rotation type.
-- (instancetype)initWithDirPath:(NSString *)dirPath
-                    maxFileSize:(NSUInteger)maxFileSize;
-
-- (instancetype)initWithDirPath:(NSString *)dirPath
-                    maxFileSize:(NSUInteger)maxFileSize
-                   rotationType:(RTCFileLoggerRotationType)rotationType
-    NS_DESIGNATED_INITIALIZER;
-
-// Starts writing WebRTC logs to disk if not already started. Overwrites any
-// existing file(s).
-- (void)start;
-
-// Stops writing WebRTC logs to disk. This method is also called on dealloc.
-- (void)stop;
-
-// Returns the current contents of the logs, or nil if start has been called
-// without a stop.
-- (NSData *)logData;
-
-@end
-
-NS_ASSUME_NONNULL_END
-
diff --git a/sdk/objc/Framework/Headers/WebRTC/RTCIceCandidate.h b/sdk/objc/Framework/Headers/WebRTC/RTCIceCandidate.h
deleted file mode 100644
index 3b7f3e2..0000000
--- a/sdk/objc/Framework/Headers/WebRTC/RTCIceCandidate.h
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-#import <Foundation/Foundation.h>
-
-#import <WebRTC/RTCMacros.h>
-
-NS_ASSUME_NONNULL_BEGIN
-
-RTC_EXPORT
-@interface RTCIceCandidate : NSObject
-
-/**
- * If present, the identifier of the "media stream identification" for the media
- * component this candidate is associated with.
- */
-@property(nonatomic, readonly, nullable) NSString *sdpMid;
-
-/**
- * The index (starting at zero) of the media description this candidate is
- * associated with in the SDP.
- */
-@property(nonatomic, readonly) int sdpMLineIndex;
-
-/** The SDP string for this candidate. */
-@property(nonatomic, readonly) NSString *sdp;
-
-/** The URL of the ICE server which this candidate is gathered from. */
-@property(nonatomic, readonly, nullable) NSString *serverUrl;
-
-- (instancetype)init NS_UNAVAILABLE;
-
-/**
- * Initialize an RTCIceCandidate from SDP.
- */
-- (instancetype)initWithSdp:(NSString *)sdp
-              sdpMLineIndex:(int)sdpMLineIndex
-                     sdpMid:(nullable NSString *)sdpMid
-    NS_DESIGNATED_INITIALIZER;
-
-@end
-
-NS_ASSUME_NONNULL_END
diff --git a/sdk/objc/Framework/Headers/WebRTC/RTCIceServer.h b/sdk/objc/Framework/Headers/WebRTC/RTCIceServer.h
deleted file mode 100644
index 727da8a..0000000
--- a/sdk/objc/Framework/Headers/WebRTC/RTCIceServer.h
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-#import <Foundation/Foundation.h>
-
-#import <WebRTC/RTCMacros.h>
-
-typedef NS_ENUM(NSUInteger, RTCTlsCertPolicy) {
-  RTCTlsCertPolicySecure,
-  RTCTlsCertPolicyInsecureNoCheck
-};
-
-NS_ASSUME_NONNULL_BEGIN
-
-RTC_EXPORT
-@interface RTCIceServer : NSObject
-
-/** URI(s) for this server represented as NSStrings. */
-@property(nonatomic, readonly) NSArray<NSString *> *urlStrings;
-
-/** Username to use if this RTCIceServer object is a TURN server. */
-@property(nonatomic, readonly, nullable) NSString *username;
-
-/** Credential to use if this RTCIceServer object is a TURN server. */
-@property(nonatomic, readonly, nullable) NSString *credential;
-
-/**
- * TLS certificate policy to use if this RTCIceServer object is a TURN server.
- */
-@property(nonatomic, readonly) RTCTlsCertPolicy tlsCertPolicy;
-
-/**
-  If the URIs in |urls| only contain IP addresses, this field can be used
-  to indicate the hostname, which may be necessary for TLS (using the SNI
-  extension). If |urls| itself contains the hostname, this isn't necessary.
- */
-@property(nonatomic, readonly, nullable) NSString *hostname;
-
-/** List of protocols to be used in the TLS ALPN extension. */
-@property(nonatomic, readonly) NSArray<NSString *> *tlsAlpnProtocols;
-
-/**
-  List elliptic curves to be used in the TLS elliptic curves extension.
-  Only curve names supported by OpenSSL should be used (eg. "P-256","X25519").
-  */
-@property(nonatomic, readonly) NSArray<NSString *> *tlsEllipticCurves;
-
-- (nonnull instancetype)init NS_UNAVAILABLE;
-
-/** Convenience initializer for a server with no authentication (e.g. STUN). */
-- (instancetype)initWithURLStrings:(NSArray<NSString *> *)urlStrings;
-
-/**
- * Initialize an RTCIceServer with its associated URLs, optional username,
- * optional credential, and credentialType.
- */
-- (instancetype)initWithURLStrings:(NSArray<NSString *> *)urlStrings
-                          username:(nullable NSString *)username
-                        credential:(nullable NSString *)credential;
-
-/**
- * Initialize an RTCIceServer with its associated URLs, optional username,
- * optional credential, and TLS cert policy.
- */
-- (instancetype)initWithURLStrings:(NSArray<NSString *> *)urlStrings
-                          username:(nullable NSString *)username
-                        credential:(nullable NSString *)credential
-                     tlsCertPolicy:(RTCTlsCertPolicy)tlsCertPolicy;
-
-/**
- * Initialize an RTCIceServer with its associated URLs, optional username,
- * optional credential, TLS cert policy and hostname.
- */
-- (instancetype)initWithURLStrings:(NSArray<NSString *> *)urlStrings
-                          username:(nullable NSString *)username
-                        credential:(nullable NSString *)credential
-                     tlsCertPolicy:(RTCTlsCertPolicy)tlsCertPolicy
-                          hostname:(nullable NSString *)hostname;
-
-/**
- * Initialize an RTCIceServer with its associated URLs, optional username,
- * optional credential, TLS cert policy, hostname and ALPN protocols.
- */
-- (instancetype)initWithURLStrings:(NSArray<NSString *> *)urlStrings
-                          username:(nullable NSString *)username
-                        credential:(nullable NSString *)credential
-                     tlsCertPolicy:(RTCTlsCertPolicy)tlsCertPolicy
-                          hostname:(nullable NSString *)hostname
-                  tlsAlpnProtocols:(NSArray<NSString *> *)tlsAlpnProtocols;
-
-/**
- * Initialize an RTCIceServer with its associated URLs, optional username,
- * optional credential, TLS cert policy, hostname, ALPN protocols and
- * elliptic curves.
- */
-- (instancetype)initWithURLStrings:(NSArray<NSString *> *)urlStrings
-                          username:(nullable NSString *)username
-                        credential:(nullable NSString *)credential
-                     tlsCertPolicy:(RTCTlsCertPolicy)tlsCertPolicy
-                          hostname:(nullable NSString *)hostname
-                  tlsAlpnProtocols:(nullable NSArray<NSString *> *)tlsAlpnProtocols
-                 tlsEllipticCurves:(nullable NSArray<NSString *> *)tlsEllipticCurves
-    NS_DESIGNATED_INITIALIZER;
-
-@end
-
-NS_ASSUME_NONNULL_END
diff --git a/sdk/objc/Framework/Headers/WebRTC/RTCIntervalRange.h b/sdk/objc/Framework/Headers/WebRTC/RTCIntervalRange.h
deleted file mode 100644
index 9384b15..0000000
--- a/sdk/objc/Framework/Headers/WebRTC/RTCIntervalRange.h
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- *  Copyright 2017 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.
- */
-
-#import <Foundation/Foundation.h>
-
-NS_ASSUME_NONNULL_BEGIN
-
-@interface RTCIntervalRange : NSObject
-
-@property(nonatomic, readonly) NSInteger min;
-@property(nonatomic, readonly) NSInteger max;
-
-- (instancetype)init;
-- (instancetype)initWithMin:(NSInteger)min
-                        max:(NSInteger)max
-    NS_DESIGNATED_INITIALIZER;
-
-@end
-
-NS_ASSUME_NONNULL_END
-
diff --git a/sdk/objc/Framework/Headers/WebRTC/RTCLegacyStatsReport.h b/sdk/objc/Framework/Headers/WebRTC/RTCLegacyStatsReport.h
deleted file mode 100644
index 14d996c..0000000
--- a/sdk/objc/Framework/Headers/WebRTC/RTCLegacyStatsReport.h
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-#import <Foundation/Foundation.h>
-
-#import <WebRTC/RTCMacros.h>
-
-NS_ASSUME_NONNULL_BEGIN
-
-/** This does not currently conform to the spec. */
-RTC_EXPORT
-@interface RTCLegacyStatsReport : NSObject
-
-/** Time since 1970-01-01T00:00:00Z in milliseconds. */
-@property(nonatomic, readonly) CFTimeInterval timestamp;
-
-/** The type of stats held by this object. */
-@property(nonatomic, readonly) NSString *type;
-
-/** The identifier for this object. */
-@property(nonatomic, readonly) NSString *reportId;
-
-/** A dictionary holding the actual stats. */
-@property(nonatomic, readonly) NSDictionary<NSString *, NSString *> *values;
-
-- (instancetype)init NS_UNAVAILABLE;
-
-@end
-
-NS_ASSUME_NONNULL_END
diff --git a/sdk/objc/Framework/Headers/WebRTC/RTCLogging.h b/sdk/objc/Framework/Headers/WebRTC/RTCLogging.h
deleted file mode 100644
index e4f1920..0000000
--- a/sdk/objc/Framework/Headers/WebRTC/RTCLogging.h
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-#import <Foundation/Foundation.h>
-
-#import <WebRTC/RTCMacros.h>
-
-// Subset of rtc::LoggingSeverity.
-typedef NS_ENUM(NSInteger, RTCLoggingSeverity) {
-  RTCLoggingSeverityVerbose,
-  RTCLoggingSeverityInfo,
-  RTCLoggingSeverityWarning,
-  RTCLoggingSeverityError,
-};
-
-// Wrapper for C++ LOG(sev) macros.
-// Logs the log string to the webrtc logstream for the given severity.
-RTC_EXTERN void RTCLogEx(RTCLoggingSeverity severity, NSString* log_string);
-
-// Wrapper for rtc::LogMessage::LogToDebug.
-// Sets the minimum severity to be logged to console.
-RTC_EXTERN void RTCSetMinDebugLogLevel(RTCLoggingSeverity severity);
-
-// Returns the filename with the path prefix removed.
-RTC_EXTERN NSString* RTCFileName(const char* filePath);
-
-// Some convenience macros.
-
-#define RTCLogString(format, ...)                    \
-  [NSString stringWithFormat:@"(%@:%d %s): " format, \
-      RTCFileName(__FILE__),                         \
-      __LINE__,                                      \
-      __FUNCTION__,                                  \
-      ##__VA_ARGS__]
-
-#define RTCLogFormat(severity, format, ...)                     \
-  do {                                                          \
-    NSString* log_string = RTCLogString(format, ##__VA_ARGS__); \
-    RTCLogEx(severity, log_string);                             \
-  } while (false)
-
-#define RTCLogVerbose(format, ...)                                \
-  RTCLogFormat(RTCLoggingSeverityVerbose, format, ##__VA_ARGS__) \
-
-#define RTCLogInfo(format, ...)                                   \
-  RTCLogFormat(RTCLoggingSeverityInfo, format, ##__VA_ARGS__)    \
-
-#define RTCLogWarning(format, ...)                                \
-  RTCLogFormat(RTCLoggingSeverityWarning, format, ##__VA_ARGS__) \
-
-#define RTCLogError(format, ...)                                  \
-  RTCLogFormat(RTCLoggingSeverityError, format, ##__VA_ARGS__)   \
-
-#if !defined(NDEBUG)
-#define RTCLogDebug(format, ...) RTCLogInfo(format, ##__VA_ARGS__)
-#else
-#define RTCLogDebug(format, ...) \
-  do {                           \
-  } while (false)
-#endif
-
-#define RTCLog(format, ...) RTCLogInfo(format, ##__VA_ARGS__)
diff --git a/sdk/objc/Framework/Headers/WebRTC/RTCMTLNSVideoView.h b/sdk/objc/Framework/Headers/WebRTC/RTCMTLNSVideoView.h
deleted file mode 100644
index 4990e25..0000000
--- a/sdk/objc/Framework/Headers/WebRTC/RTCMTLNSVideoView.h
+++ /dev/null
@@ -1,17 +0,0 @@
-/*
- *  Copyright 2017 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.
- */
-
-#import <Cocoa/Cocoa.h>
-#import "WebRTC/RTCVideoRenderer.h"
-
-NS_AVAILABLE_MAC(10.11)
-@interface RTCMTLNSVideoView : NSView<RTCVideoRenderer>
-+ (BOOL)isMetalAvailable;
-@end
diff --git a/sdk/objc/Framework/Headers/WebRTC/RTCMTLVideoView.h b/sdk/objc/Framework/Headers/WebRTC/RTCMTLVideoView.h
deleted file mode 100644
index 226c62a..0000000
--- a/sdk/objc/Framework/Headers/WebRTC/RTCMTLVideoView.h
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- *  Copyright 2017 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.
- */
-
-#import <Foundation/Foundation.h>
-
-#import "WebRTC/RTCVideoRenderer.h"
-
-// Check if metal is supported in WebRTC.
-// NOTE: Currently arm64 == Metal.
-#if defined(__aarch64__)
-#define RTC_SUPPORTS_METAL
-#endif
-
-NS_ASSUME_NONNULL_BEGIN
-
-/**
- * RTCMTLVideoView is thin wrapper around MTKView.
- *
- * It has id<RTCVideoRenderer> property that renders video frames in the view's
- * bounds using Metal.
- * NOTE: always check if metal is available on the running device via
- * RTC_SUPPORTS_METAL macro before initializing this class.
- */
-NS_CLASS_AVAILABLE_IOS(9)
-
-RTC_EXPORT
-@interface RTCMTLVideoView : UIView <RTCVideoRenderer>
-
-@end
-NS_ASSUME_NONNULL_END
diff --git a/sdk/objc/Framework/Headers/WebRTC/RTCMacros.h b/sdk/objc/Framework/Headers/WebRTC/RTCMacros.h
deleted file mode 100644
index a989074..0000000
--- a/sdk/objc/Framework/Headers/WebRTC/RTCMacros.h
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- *  Copyright 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_SDK_OBJC_FRAMEWORK_HEADERS_WEBRTC_RTCMACROS_H_
-#define WEBRTC_SDK_OBJC_FRAMEWORK_HEADERS_WEBRTC_RTCMACROS_H_
-
-#define RTC_EXPORT __attribute__((visibility("default")))
-
-#if defined(__cplusplus)
-#define RTC_EXTERN extern "C" RTC_EXPORT
-#else
-#define RTC_EXTERN extern RTC_EXPORT
-#endif
-
-#ifdef __OBJC__
-#define RTC_FWD_DECL_OBJC_CLASS(classname) @class classname
-#else
-#define RTC_FWD_DECL_OBJC_CLASS(classname) typedef struct objc_object classname
-#endif
-
-#endif  // WEBRTC_SDK_OBJC_FRAMEWORK_HEADERS_WEBRTC_RTCMACROS_H_
diff --git a/sdk/objc/Framework/Headers/WebRTC/RTCMediaConstraints.h b/sdk/objc/Framework/Headers/WebRTC/RTCMediaConstraints.h
deleted file mode 100644
index 26a1168..0000000
--- a/sdk/objc/Framework/Headers/WebRTC/RTCMediaConstraints.h
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-#import <Foundation/Foundation.h>
-
-#import <WebRTC/RTCMacros.h>
-
-NS_ASSUME_NONNULL_BEGIN
-
-/** Constraint keys for media sources. */
-RTC_EXTERN NSString * const kRTCMediaConstraintsMinAspectRatio;
-RTC_EXTERN NSString * const kRTCMediaConstraintsMaxAspectRatio;
-RTC_EXTERN NSString * const kRTCMediaConstraintsMaxWidth;
-RTC_EXTERN NSString * const kRTCMediaConstraintsMinWidth;
-RTC_EXTERN NSString * const kRTCMediaConstraintsMaxHeight;
-RTC_EXTERN NSString * const kRTCMediaConstraintsMinHeight;
-RTC_EXTERN NSString * const kRTCMediaConstraintsMaxFrameRate;
-RTC_EXTERN NSString * const kRTCMediaConstraintsMinFrameRate;
-RTC_EXTERN NSString * const kRTCMediaConstraintsLevelControl;
-/** The value for this key should be a base64 encoded string containing
- *  the data from the serialized configuration proto.
- */
-RTC_EXTERN NSString * const kRTCMediaConstraintsAudioNetworkAdaptorConfig;
-
-/** Constraint keys for generating offers and answers. */
-RTC_EXTERN NSString * const kRTCMediaConstraintsIceRestart;
-RTC_EXTERN NSString * const kRTCMediaConstraintsOfferToReceiveAudio;
-RTC_EXTERN NSString * const kRTCMediaConstraintsOfferToReceiveVideo;
-RTC_EXTERN NSString * const kRTCMediaConstraintsVoiceActivityDetection;
-
-/** Constraint values for Boolean parameters. */
-RTC_EXTERN NSString * const kRTCMediaConstraintsValueTrue;
-RTC_EXTERN NSString * const kRTCMediaConstraintsValueFalse;
-
-RTC_EXPORT
-@interface RTCMediaConstraints : NSObject
-
-- (instancetype)init NS_UNAVAILABLE;
-
-/** Initialize with mandatory and/or optional constraints. */
-- (instancetype)initWithMandatoryConstraints:
-    (nullable NSDictionary<NSString *, NSString *> *)mandatory
-                         optionalConstraints:
-    (nullable NSDictionary<NSString *, NSString *> *)optional
-    NS_DESIGNATED_INITIALIZER;
-
-@end
-
-NS_ASSUME_NONNULL_END
diff --git a/sdk/objc/Framework/Headers/WebRTC/RTCMediaSource.h b/sdk/objc/Framework/Headers/WebRTC/RTCMediaSource.h
deleted file mode 100644
index 6cfcb7d..0000000
--- a/sdk/objc/Framework/Headers/WebRTC/RTCMediaSource.h
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- *  Copyright 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.
- */
-
-#import <Foundation/Foundation.h>
-
-#import <WebRTC/RTCMacros.h>
-
-typedef NS_ENUM(NSInteger, RTCSourceState) {
-  RTCSourceStateInitializing,
-  RTCSourceStateLive,
-  RTCSourceStateEnded,
-  RTCSourceStateMuted,
-};
-
-NS_ASSUME_NONNULL_BEGIN
-
-RTC_EXPORT
-@interface RTCMediaSource : NSObject
-
-/** The current state of the RTCMediaSource. */
-@property(nonatomic, readonly) RTCSourceState state;
-
-- (instancetype)init NS_UNAVAILABLE;
-
-@end
-
-NS_ASSUME_NONNULL_END
diff --git a/sdk/objc/Framework/Headers/WebRTC/RTCMediaStream.h b/sdk/objc/Framework/Headers/WebRTC/RTCMediaStream.h
deleted file mode 100644
index b97960d..0000000
--- a/sdk/objc/Framework/Headers/WebRTC/RTCMediaStream.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-#import <Foundation/Foundation.h>
-
-#import <WebRTC/RTCMacros.h>
-
-NS_ASSUME_NONNULL_BEGIN
-
-@class RTCAudioTrack;
-@class RTCPeerConnectionFactory;
-@class RTCVideoTrack;
-
-RTC_EXPORT
-@interface RTCMediaStream : NSObject
-
-/** The audio tracks in this stream. */
-@property(nonatomic, strong, readonly) NSArray<RTCAudioTrack *> *audioTracks;
-
-/** The video tracks in this stream. */
-@property(nonatomic, strong, readonly) NSArray<RTCVideoTrack *> *videoTracks;
-
-/** An identifier for this media stream. */
-@property(nonatomic, readonly) NSString *streamId;
-
-- (instancetype)init NS_UNAVAILABLE;
-
-/** Adds the given audio track to this media stream. */
-- (void)addAudioTrack:(RTCAudioTrack *)audioTrack;
-
-/** Adds the given video track to this media stream. */
-- (void)addVideoTrack:(RTCVideoTrack *)videoTrack;
-
-/** Removes the given audio track to this media stream. */
-- (void)removeAudioTrack:(RTCAudioTrack *)audioTrack;
-
-/** Removes the given video track to this media stream. */
-- (void)removeVideoTrack:(RTCVideoTrack *)videoTrack;
-
-@end
-
-NS_ASSUME_NONNULL_END
diff --git a/sdk/objc/Framework/Headers/WebRTC/RTCMediaStreamTrack.h b/sdk/objc/Framework/Headers/WebRTC/RTCMediaStreamTrack.h
deleted file mode 100644
index c42f0cf..0000000
--- a/sdk/objc/Framework/Headers/WebRTC/RTCMediaStreamTrack.h
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-#import <Foundation/Foundation.h>
-
-#import <WebRTC/RTCMacros.h>
-
-/**
- * Represents the state of the track. This exposes the same states in C++.
- */
-typedef NS_ENUM(NSInteger, RTCMediaStreamTrackState) {
-  RTCMediaStreamTrackStateLive,
-  RTCMediaStreamTrackStateEnded
-};
-
-NS_ASSUME_NONNULL_BEGIN
-
-RTC_EXTERN NSString * const kRTCMediaStreamTrackKindAudio;
-RTC_EXTERN NSString * const kRTCMediaStreamTrackKindVideo;
-
-RTC_EXPORT
-@interface RTCMediaStreamTrack : NSObject
-
-/**
- * The kind of track. For example, "audio" if this track represents an audio
- * track and "video" if this track represents a video track.
- */
-@property(nonatomic, readonly) NSString *kind;
-
-/** An identifier string. */
-@property(nonatomic, readonly) NSString *trackId;
-
-/** The enabled state of the track. */
-@property(nonatomic, assign) BOOL isEnabled;
-
-/** The state of the track. */
-@property(nonatomic, readonly) RTCMediaStreamTrackState readyState;
-
-- (instancetype)init NS_UNAVAILABLE;
-
-@end
-
-NS_ASSUME_NONNULL_END
diff --git a/sdk/objc/Framework/Headers/WebRTC/RTCMetrics.h b/sdk/objc/Framework/Headers/WebRTC/RTCMetrics.h
deleted file mode 100644
index fa2d48f..0000000
--- a/sdk/objc/Framework/Headers/WebRTC/RTCMetrics.h
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- *  Copyright 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.
- */
-
-#import <Foundation/Foundation.h>
-
-#import <WebRTC/RTCMacros.h>
-#import <WebRTC/RTCMetricsSampleInfo.h>
-
-/**
- * Enables gathering of metrics (which can be fetched with
- * RTCGetAndResetMetrics). Must be called before any other call into WebRTC.
- */
-RTC_EXTERN void RTCEnableMetrics();
-
-/** Gets and clears native histograms. */
-RTC_EXTERN NSArray<RTCMetricsSampleInfo *> *RTCGetAndResetMetrics();
diff --git a/sdk/objc/Framework/Headers/WebRTC/RTCMetricsSampleInfo.h b/sdk/objc/Framework/Headers/WebRTC/RTCMetricsSampleInfo.h
deleted file mode 100644
index f01bea9..0000000
--- a/sdk/objc/Framework/Headers/WebRTC/RTCMetricsSampleInfo.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- *  Copyright 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.
- */
-
-#import <Foundation/Foundation.h>
-
-#import <WebRTC/RTCMacros.h>
-
-NS_ASSUME_NONNULL_BEGIN
-
-RTC_EXPORT
-@interface RTCMetricsSampleInfo : NSObject
-
-/**
- * Example of RTCMetricsSampleInfo:
- * name: "WebRTC.Video.InputFramesPerSecond"
- * min: 1
- * max: 100
- * bucketCount: 50
- * samples: [29]:2 [30]:1
- */
-
-/** The name of the histogram. */
-@property(nonatomic, readonly) NSString *name;
-
-/** The minimum bucket value. */
-@property(nonatomic, readonly) int min;
-
-/** The maximum bucket value. */
-@property(nonatomic, readonly) int max;
-
-/** The number of buckets. */
-@property(nonatomic, readonly) int bucketCount;
-
-/** A dictionary holding the samples <value, # of events>. */
-@property(nonatomic, readonly) NSDictionary<NSNumber *, NSNumber *> *samples;
-
-- (instancetype)init NS_UNAVAILABLE;
-
-@end
-
-NS_ASSUME_NONNULL_END
diff --git a/sdk/objc/Framework/Headers/WebRTC/RTCNSGLVideoView.h b/sdk/objc/Framework/Headers/WebRTC/RTCNSGLVideoView.h
deleted file mode 100644
index 9e6a9ce..0000000
--- a/sdk/objc/Framework/Headers/WebRTC/RTCNSGLVideoView.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-#import <Foundation/Foundation.h>
-
-#if !TARGET_OS_IPHONE
-
-#import <AppKit/NSOpenGLView.h>
-
-#import <WebRTC/RTCVideoRenderer.h>
-#import <WebRTC/RTCVideoViewShading.h>
-
-NS_ASSUME_NONNULL_BEGIN
-
-@class RTCNSGLVideoView;
-@protocol RTCNSGLVideoViewDelegate
-
-- (void)videoView:(RTCNSGLVideoView *)videoView didChangeVideoSize:(CGSize)size;
-
-@end
-
-@interface RTCNSGLVideoView : NSOpenGLView <RTCVideoRenderer>
-
-@property(nonatomic, weak) id<RTCNSGLVideoViewDelegate> delegate;
-
-- (instancetype)initWithFrame:(NSRect)frameRect
-                  pixelFormat:(NSOpenGLPixelFormat *)format
-                       shader:(id<RTCVideoViewShading>)shader NS_DESIGNATED_INITIALIZER;
-
-@end
-
-NS_ASSUME_NONNULL_END
-
-#endif
diff --git a/sdk/objc/Framework/Headers/WebRTC/RTCPeerConnection.h b/sdk/objc/Framework/Headers/WebRTC/RTCPeerConnection.h
deleted file mode 100644
index 7b0c449..0000000
--- a/sdk/objc/Framework/Headers/WebRTC/RTCPeerConnection.h
+++ /dev/null
@@ -1,233 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-#import <Foundation/Foundation.h>
-
-#import <WebRTC/RTCMacros.h>
-
-@class RTCConfiguration;
-@class RTCDataChannel;
-@class RTCDataChannelConfiguration;
-@class RTCIceCandidate;
-@class RTCMediaConstraints;
-@class RTCMediaStream;
-@class RTCMediaStreamTrack;
-@class RTCPeerConnectionFactory;
-@class RTCRtpReceiver;
-@class RTCRtpSender;
-@class RTCSessionDescription;
-@class RTCLegacyStatsReport;
-
-NS_ASSUME_NONNULL_BEGIN
-
-extern NSString * const kRTCPeerConnectionErrorDomain;
-extern int const kRTCSessionDescriptionErrorCode;
-
-/** Represents the signaling state of the peer connection. */
-typedef NS_ENUM(NSInteger, RTCSignalingState) {
-  RTCSignalingStateStable,
-  RTCSignalingStateHaveLocalOffer,
-  RTCSignalingStateHaveLocalPrAnswer,
-  RTCSignalingStateHaveRemoteOffer,
-  RTCSignalingStateHaveRemotePrAnswer,
-  // Not an actual state, represents the total number of states.
-  RTCSignalingStateClosed,
-};
-
-/** Represents the ice connection state of the peer connection. */
-typedef NS_ENUM(NSInteger, RTCIceConnectionState) {
-  RTCIceConnectionStateNew,
-  RTCIceConnectionStateChecking,
-  RTCIceConnectionStateConnected,
-  RTCIceConnectionStateCompleted,
-  RTCIceConnectionStateFailed,
-  RTCIceConnectionStateDisconnected,
-  RTCIceConnectionStateClosed,
-  RTCIceConnectionStateCount,
-};
-
-/** Represents the ice gathering state of the peer connection. */
-typedef NS_ENUM(NSInteger, RTCIceGatheringState) {
-  RTCIceGatheringStateNew,
-  RTCIceGatheringStateGathering,
-  RTCIceGatheringStateComplete,
-};
-
-/** Represents the stats output level. */
-typedef NS_ENUM(NSInteger, RTCStatsOutputLevel) {
-  RTCStatsOutputLevelStandard,
-  RTCStatsOutputLevelDebug,
-};
-
-@class RTCPeerConnection;
-
-RTC_EXPORT
-@protocol RTCPeerConnectionDelegate <NSObject>
-
-/** Called when the SignalingState changed. */
-- (void)peerConnection:(RTCPeerConnection *)peerConnection
-    didChangeSignalingState:(RTCSignalingState)stateChanged;
-
-/** Called when media is received on a new stream from remote peer. */
-- (void)peerConnection:(RTCPeerConnection *)peerConnection
-          didAddStream:(RTCMediaStream *)stream;
-
-/** Called when a remote peer closes a stream. */
-- (void)peerConnection:(RTCPeerConnection *)peerConnection
-       didRemoveStream:(RTCMediaStream *)stream;
-
-/** Called when negotiation is needed, for example ICE has restarted. */
-- (void)peerConnectionShouldNegotiate:(RTCPeerConnection *)peerConnection;
-
-/** Called any time the IceConnectionState changes. */
-- (void)peerConnection:(RTCPeerConnection *)peerConnection
-    didChangeIceConnectionState:(RTCIceConnectionState)newState;
-
-/** Called any time the IceGatheringState changes. */
-- (void)peerConnection:(RTCPeerConnection *)peerConnection
-    didChangeIceGatheringState:(RTCIceGatheringState)newState;
-
-/** New ice candidate has been found. */
-- (void)peerConnection:(RTCPeerConnection *)peerConnection
-    didGenerateIceCandidate:(RTCIceCandidate *)candidate;
-
-/** Called when a group of local Ice candidates have been removed. */
-- (void)peerConnection:(RTCPeerConnection *)peerConnection
-    didRemoveIceCandidates:(NSArray<RTCIceCandidate *> *)candidates;
-
-/** New data channel has been opened. */
-- (void)peerConnection:(RTCPeerConnection *)peerConnection
-    didOpenDataChannel:(RTCDataChannel *)dataChannel;
-
-@end
-
-RTC_EXPORT
-@interface RTCPeerConnection : NSObject
-
-/** The object that will be notifed about events such as state changes and
- *  streams being added or removed.
- */
-@property(nonatomic, weak, nullable) id<RTCPeerConnectionDelegate> delegate;
-@property(nonatomic, readonly) NSArray<RTCMediaStream *> *localStreams;
-@property(nonatomic, readonly, nullable)
-    RTCSessionDescription *localDescription;
-@property(nonatomic, readonly, nullable)
-    RTCSessionDescription *remoteDescription;
-@property(nonatomic, readonly) RTCSignalingState signalingState;
-@property(nonatomic, readonly) RTCIceConnectionState iceConnectionState;
-@property(nonatomic, readonly) RTCIceGatheringState iceGatheringState;
-@property(nonatomic, readonly, copy) RTCConfiguration *configuration;
-
-/** Gets all RTCRtpSenders associated with this peer connection.
- *  Note: reading this property returns different instances of RTCRtpSender.
- *  Use isEqual: instead of == to compare RTCRtpSender instances.
- */
-@property(nonatomic, readonly) NSArray<RTCRtpSender *> *senders;
-
-/** Gets all RTCRtpReceivers associated with this peer connection.
- *  Note: reading this property returns different instances of RTCRtpReceiver.
- *  Use isEqual: instead of == to compare RTCRtpReceiver instances.
- */
-@property(nonatomic, readonly) NSArray<RTCRtpReceiver *> *receivers;
-
-- (instancetype)init NS_UNAVAILABLE;
-
-/** Sets the PeerConnection's global configuration to |configuration|.
- *  Any changes to STUN/TURN servers or ICE candidate policy will affect the
- *  next gathering phase, and cause the next call to createOffer to generate
- *  new ICE credentials. Note that the BUNDLE and RTCP-multiplexing policies
- *  cannot be changed with this method.
- */
-- (BOOL)setConfiguration:(RTCConfiguration *)configuration;
-
-/** Terminate all media and close the transport. */
-- (void)close;
-
-/** Provide a remote candidate to the ICE Agent. */
-- (void)addIceCandidate:(RTCIceCandidate *)candidate;
-
-/** Remove a group of remote candidates from the ICE Agent. */
-- (void)removeIceCandidates:(NSArray<RTCIceCandidate *> *)candidates;
-
-/** Add a new media stream to be sent on this peer connection. */
-- (void)addStream:(RTCMediaStream *)stream;
-
-/** Remove the given media stream from this peer connection. */
-- (void)removeStream:(RTCMediaStream *)stream;
-
-/** Generate an SDP offer. */
-- (void)offerForConstraints:(RTCMediaConstraints *)constraints
-          completionHandler:(nullable void (^)
-    (RTCSessionDescription * _Nullable sdp,
-     NSError * _Nullable error))completionHandler;
-
-/** Generate an SDP answer. */
-- (void)answerForConstraints:(RTCMediaConstraints *)constraints
-           completionHandler:(nullable void (^)
-    (RTCSessionDescription * _Nullable sdp,
-     NSError * _Nullable error))completionHandler;
-
-/** Apply the supplied RTCSessionDescription as the local description. */
-- (void)setLocalDescription:(RTCSessionDescription *)sdp
-          completionHandler:
-    (nullable void (^)(NSError * _Nullable error))completionHandler;
-
-/** Apply the supplied RTCSessionDescription as the remote description. */
-- (void)setRemoteDescription:(RTCSessionDescription *)sdp
-           completionHandler:
-    (nullable void (^)(NSError * _Nullable error))completionHandler;
-
-/** Limits the bandwidth allocated for all RTP streams sent by this
- *  PeerConnection. Nil parameters will be unchanged. Setting
- * |currentBitrateBps| will force the available bitrate estimate to the given
- *  value. Returns YES if the parameters were successfully updated.
- */
-- (BOOL)setBweMinBitrateBps:(nullable NSNumber *)minBitrateBps
-          currentBitrateBps:(nullable NSNumber *)currentBitrateBps
-              maxBitrateBps:(nullable NSNumber *)maxBitrateBps;
-
-/** Start or stop recording an Rtc EventLog. */
-- (BOOL)startRtcEventLogWithFilePath:(NSString *)filePath
-                      maxSizeInBytes:(int64_t)maxSizeInBytes;
-- (void)stopRtcEventLog;
-
-@end
-
-@interface RTCPeerConnection (Media)
-
-/** Create an RTCRtpSender with the specified kind and media stream ID.
- *  See RTCMediaStreamTrack.h for available kinds.
- */
-- (RTCRtpSender *)senderWithKind:(NSString *)kind streamId:(NSString *)streamId;
-
-@end
-
-@interface RTCPeerConnection (DataChannel)
-
-/** Create a new data channel with the given label and configuration. */
-- (RTCDataChannel *)dataChannelForLabel:(NSString *)label
-    configuration:(RTCDataChannelConfiguration *)configuration;
-
-@end
-
-@interface RTCPeerConnection (Stats)
-
-/** Gather stats for the given RTCMediaStreamTrack. If |mediaStreamTrack| is nil
- *  statistics are gathered for all tracks.
- */
-- (void)statsForTrack:
-    (nullable RTCMediaStreamTrack *)mediaStreamTrack
-     statsOutputLevel:(RTCStatsOutputLevel)statsOutputLevel
-    completionHandler:
-    (nullable void (^)(NSArray<RTCLegacyStatsReport *> *stats))completionHandler;
-
-@end
-
-NS_ASSUME_NONNULL_END
diff --git a/sdk/objc/Framework/Headers/WebRTC/RTCPeerConnectionFactory.h b/sdk/objc/Framework/Headers/WebRTC/RTCPeerConnectionFactory.h
deleted file mode 100644
index 42acbfc..0000000
--- a/sdk/objc/Framework/Headers/WebRTC/RTCPeerConnectionFactory.h
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-#import <Foundation/Foundation.h>
-
-#import <WebRTC/RTCMacros.h>
-
-NS_ASSUME_NONNULL_BEGIN
-
-@class RTCAVFoundationVideoSource;
-@class RTCAudioSource;
-@class RTCAudioTrack;
-@class RTCConfiguration;
-@class RTCMediaConstraints;
-@class RTCMediaStream;
-@class RTCPeerConnection;
-@class RTCVideoSource;
-@class RTCVideoTrack;
-@protocol RTCPeerConnectionDelegate;
-@protocol RTCVideoDecoderFactory;
-@protocol RTCVideoEncoderFactory;
-
-RTC_EXPORT
-@interface RTCPeerConnectionFactory : NSObject
-
-/* Initialize object with default H264 video encoder/decoder factories */
-- (instancetype)init;
-
-/* Initialize object with injectable video encoder/decoder factories */
-- (instancetype)initWithEncoderFactory:(nullable id<RTCVideoEncoderFactory>)encoderFactory
-                        decoderFactory:(nullable id<RTCVideoDecoderFactory>)decoderFactory;
-
-/** Initialize an RTCAudioSource with constraints. */
-- (RTCAudioSource *)audioSourceWithConstraints:(nullable RTCMediaConstraints *)constraints;
-
-/** Initialize an RTCAudioTrack with an id. Convenience ctor to use an audio source with no
- *  constraints.
- */
-- (RTCAudioTrack *)audioTrackWithTrackId:(NSString *)trackId;
-
-/** Initialize an RTCAudioTrack with a source and an id. */
-- (RTCAudioTrack *)audioTrackWithSource:(RTCAudioSource *)source
-                                trackId:(NSString *)trackId;
-
-/** Initialize an RTCAVFoundationVideoSource with constraints. */
-- (RTCAVFoundationVideoSource *)avFoundationVideoSourceWithConstraints:
-    (nullable RTCMediaConstraints *)constraints;
-
-/** Initialize a generic RTCVideoSource. The RTCVideoSource should be passed to a RTCVideoCapturer
- *  implementation, e.g. RTCCameraVideoCapturer, in order to produce frames.
- */
-- (RTCVideoSource *)videoSource;
-
-/** Initialize an RTCVideoTrack with a source and an id. */
-- (RTCVideoTrack *)videoTrackWithSource:(RTCVideoSource *)source
-                                trackId:(NSString *)trackId;
-
-/** Initialize an RTCMediaStream with an id. */
-- (RTCMediaStream *)mediaStreamWithStreamId:(NSString *)streamId;
-
-/** Initialize an RTCPeerConnection with a configuration, constraints, and
- *  delegate.
- */
-- (RTCPeerConnection *)peerConnectionWithConfiguration:
-    (RTCConfiguration *)configuration
-                                           constraints:
-    (RTCMediaConstraints *)constraints
-                                              delegate:
-    (nullable id<RTCPeerConnectionDelegate>)delegate;
-
-/** Start an AecDump recording. This API call will likely change in the future. */
-- (BOOL)startAecDumpWithFilePath:(NSString *)filePath
-                  maxSizeInBytes:(int64_t)maxSizeInBytes;
-
-/* Stop an active AecDump recording */
-- (void)stopAecDump;
-
-@end
-
-NS_ASSUME_NONNULL_END
diff --git a/sdk/objc/Framework/Headers/WebRTC/RTCRtpCodecParameters.h b/sdk/objc/Framework/Headers/WebRTC/RTCRtpCodecParameters.h
deleted file mode 100644
index c7ca2f5..0000000
--- a/sdk/objc/Framework/Headers/WebRTC/RTCRtpCodecParameters.h
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- *  Copyright 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.
- */
-
-#import <Foundation/Foundation.h>
-
-#import <WebRTC/RTCMacros.h>
-
-NS_ASSUME_NONNULL_BEGIN
-
-RTC_EXTERN const NSString * const kRTCRtxCodecName;
-RTC_EXTERN const NSString * const kRTCRedCodecName;
-RTC_EXTERN const NSString * const kRTCUlpfecCodecName;
-RTC_EXTERN const NSString * const kRTCFlexfecCodecName;
-RTC_EXTERN const NSString * const kRTCOpusCodecName;
-RTC_EXTERN const NSString * const kRTCIsacCodecName;
-RTC_EXTERN const NSString * const kRTCL16CodecName;
-RTC_EXTERN const NSString * const kRTCG722CodecName;
-RTC_EXTERN const NSString * const kRTCIlbcCodecName;
-RTC_EXTERN const NSString * const kRTCPcmuCodecName;
-RTC_EXTERN const NSString * const kRTCPcmaCodecName;
-RTC_EXTERN const NSString * const kRTCDtmfCodecName;
-RTC_EXTERN const NSString * const kRTCComfortNoiseCodecName;
-RTC_EXTERN const NSString * const kRTCVp8CodecName;
-RTC_EXTERN const NSString * const kRTCVp9CodecName;
-RTC_EXTERN const NSString * const kRTCH264CodecName;
-
-/** Defined in http://w3c.github.io/webrtc-pc/#idl-def-RTCRtpCodecParameters */
-RTC_EXPORT
-@interface RTCRtpCodecParameters : NSObject
-
-/** The RTP payload type. */
-@property(nonatomic, assign) int payloadType;
-
-/**
- * The codec MIME subtype. Valid types are listed in:
- * http://www.iana.org/assignments/rtp-parameters/rtp-parameters.xhtml#rtp-parameters-2
- *
- * Several supported types are represented by the constants above.
- */
-@property(nonatomic, readonly, nonnull) NSString *name;
-
-/**
- * The media type of this codec. Equivalent to MIME top-level type.
- *
- * Valid values are kRTCMediaStreamTrackKindAudio and
- * kRTCMediaStreamTrackKindVideo.
- */
-@property(nonatomic, readonly, nonnull) NSString *kind;
-
-/** The codec clock rate expressed in Hertz. */
-@property(nonatomic, readonly, nullable) NSNumber *clockRate;
-
-/**
- * The number of channels (mono=1, stereo=2).
- * Set to null for video codecs.
- **/
-@property(nonatomic, readonly, nullable) NSNumber *numChannels;
-
-- (instancetype)init NS_DESIGNATED_INITIALIZER;
-
-@end
-
-NS_ASSUME_NONNULL_END
diff --git a/sdk/objc/Framework/Headers/WebRTC/RTCRtpEncodingParameters.h b/sdk/objc/Framework/Headers/WebRTC/RTCRtpEncodingParameters.h
deleted file mode 100644
index a956f0d..0000000
--- a/sdk/objc/Framework/Headers/WebRTC/RTCRtpEncodingParameters.h
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- *  Copyright 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.
- */
-
-#import <Foundation/Foundation.h>
-
-#import <WebRTC/RTCMacros.h>
-
-NS_ASSUME_NONNULL_BEGIN
-
-RTC_EXPORT
-@interface RTCRtpEncodingParameters : NSObject
-
-/** Controls whether the encoding is currently transmitted. */
-@property(nonatomic, assign) BOOL isActive;
-
-/** The maximum bitrate to use for the encoding, or nil if there is no
- *  limit.
- */
-@property(nonatomic, copy, nullable) NSNumber *maxBitrateBps;
-
-/** The SSRC being used by this encoding. */
-@property(nonatomic, readonly, nullable) NSNumber *ssrc;
-
-- (instancetype)init NS_DESIGNATED_INITIALIZER;
-
-@end
-
-NS_ASSUME_NONNULL_END
diff --git a/sdk/objc/Framework/Headers/WebRTC/RTCRtpParameters.h b/sdk/objc/Framework/Headers/WebRTC/RTCRtpParameters.h
deleted file mode 100644
index bdebf84..0000000
--- a/sdk/objc/Framework/Headers/WebRTC/RTCRtpParameters.h
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- *  Copyright 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.
- */
-
-#import <Foundation/Foundation.h>
-
-#import <WebRTC/RTCMacros.h>
-#import <WebRTC/RTCRtpCodecParameters.h>
-#import <WebRTC/RTCRtpEncodingParameters.h>
-
-NS_ASSUME_NONNULL_BEGIN
-
-RTC_EXPORT
-@interface RTCRtpParameters : NSObject
-
-/** The currently active encodings in the order of preference. */
-@property(nonatomic, copy) NSArray<RTCRtpEncodingParameters *> *encodings;
-
-/** The negotiated set of send codecs in order of preference. */
-@property(nonatomic, copy) NSArray<RTCRtpCodecParameters *> *codecs;
-
-- (instancetype)init NS_DESIGNATED_INITIALIZER;
-
-@end
-
-NS_ASSUME_NONNULL_END
diff --git a/sdk/objc/Framework/Headers/WebRTC/RTCRtpReceiver.h b/sdk/objc/Framework/Headers/WebRTC/RTCRtpReceiver.h
deleted file mode 100644
index 6c39a25..0000000
--- a/sdk/objc/Framework/Headers/WebRTC/RTCRtpReceiver.h
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- *  Copyright 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.
- */
-
-#import <Foundation/Foundation.h>
-
-#import <WebRTC/RTCMacros.h>
-#import <WebRTC/RTCMediaStreamTrack.h>
-#import <WebRTC/RTCRtpParameters.h>
-
-NS_ASSUME_NONNULL_BEGIN
-
-/** Represents the media type of the RtpReceiver. */
-typedef NS_ENUM(NSInteger, RTCRtpMediaType) {
-  RTCRtpMediaTypeAudio,
-  RTCRtpMediaTypeVideo,
-  RTCRtpMediaTypeData,
-};
-
-@class RTCRtpReceiver;
-
-RTC_EXPORT
-@protocol RTCRtpReceiverDelegate <NSObject>
-
-/** Called when the first RTP packet is received.
- *
- *  Note: Currently if there are multiple RtpReceivers of the same media type,
- *  they will all call OnFirstPacketReceived at once.
- *
- *  For example, if we create three audio receivers, A/B/C, they will listen to
- *  the same signal from the underneath network layer. Whenever the first audio packet
- *  is received, the underneath signal will be fired. All the receivers A/B/C will be
- *  notified and the callback of the receiver's delegate will be called.
- *
- *  The process is the same for video receivers.
- */
-- (void)rtpReceiver:(RTCRtpReceiver *)rtpReceiver
-    didReceiveFirstPacketForMediaType:(RTCRtpMediaType)mediaType;
-
-@end
-
-RTC_EXPORT
-@protocol RTCRtpReceiver <NSObject>
-
-/** A unique identifier for this receiver. */
-@property(nonatomic, readonly) NSString *receiverId;
-
-/** The currently active RTCRtpParameters, as defined in
- *  https://www.w3.org/TR/webrtc/#idl-def-RTCRtpParameters.
- *
- *  The WebRTC specification only defines RTCRtpParameters in terms of senders,
- *  but this API also applies them to receivers, similar to ORTC:
- *  http://ortc.org/wp-content/uploads/2016/03/ortc.html#rtcrtpparameters*.
- */
-@property(nonatomic, readonly) RTCRtpParameters *parameters;
-
-/** The RTCMediaStreamTrack associated with the receiver.
- *  Note: reading this property returns a new instance of
- *  RTCMediaStreamTrack. Use isEqual: instead of == to compare
- *  RTCMediaStreamTrack instances.
- */
-@property(nonatomic, readonly) RTCMediaStreamTrack *track;
-
-/** The delegate for this RtpReceiver. */
-@property(nonatomic, weak) id<RTCRtpReceiverDelegate> delegate;
-
-@end
-
-RTC_EXPORT
-@interface RTCRtpReceiver : NSObject <RTCRtpReceiver>
-
-- (instancetype)init NS_UNAVAILABLE;
-
-@end
-
-NS_ASSUME_NONNULL_END
diff --git a/sdk/objc/Framework/Headers/WebRTC/RTCRtpSender.h b/sdk/objc/Framework/Headers/WebRTC/RTCRtpSender.h
deleted file mode 100644
index d910c6c..0000000
--- a/sdk/objc/Framework/Headers/WebRTC/RTCRtpSender.h
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- *  Copyright 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.
- */
-
-#import <Foundation/Foundation.h>
-
-#import <WebRTC/RTCMacros.h>
-#import <WebRTC/RTCMediaStreamTrack.h>
-#import <WebRTC/RTCRtpParameters.h>
-
-NS_ASSUME_NONNULL_BEGIN
-
-RTC_EXPORT
-@protocol RTCRtpSender <NSObject>
-
-/** A unique identifier for this sender. */
-@property(nonatomic, readonly) NSString *senderId;
-
-/** The currently active RTCRtpParameters, as defined in
- *  https://www.w3.org/TR/webrtc/#idl-def-RTCRtpParameters.
- */
-@property(nonatomic, copy) RTCRtpParameters *parameters;
-
-/** The RTCMediaStreamTrack associated with the sender.
- *  Note: reading this property returns a new instance of
- *  RTCMediaStreamTrack. Use isEqual: instead of == to compare
- *  RTCMediaStreamTrack instances.
- */
-@property(nonatomic, copy, nullable) RTCMediaStreamTrack *track;
-
-@end
-
-RTC_EXPORT
-@interface RTCRtpSender : NSObject <RTCRtpSender>
-
-- (instancetype)init NS_UNAVAILABLE;
-
-@end
-
-NS_ASSUME_NONNULL_END
diff --git a/sdk/objc/Framework/Headers/WebRTC/RTCSSLAdapter.h b/sdk/objc/Framework/Headers/WebRTC/RTCSSLAdapter.h
deleted file mode 100644
index c862d29..0000000
--- a/sdk/objc/Framework/Headers/WebRTC/RTCSSLAdapter.h
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- *  Copyright 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.
- */
-
-#import <Foundation/Foundation.h>
-
-#import <WebRTC/RTCMacros.h>
-
-/**
- * Initialize and clean up the SSL library. Failure is fatal. These call the
- * corresponding functions in webrtc/rtc_base/ssladapter.h.
- */
-RTC_EXTERN BOOL RTCInitializeSSL();
-RTC_EXTERN BOOL RTCCleanupSSL();
diff --git a/sdk/objc/Framework/Headers/WebRTC/RTCSessionDescription.h b/sdk/objc/Framework/Headers/WebRTC/RTCSessionDescription.h
deleted file mode 100644
index 4143980..0000000
--- a/sdk/objc/Framework/Headers/WebRTC/RTCSessionDescription.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-#import <Foundation/Foundation.h>
-
-#import <WebRTC/RTCMacros.h>
-
-/**
- * Represents the session description type. This exposes the same types that are
- * in C++, which doesn't include the rollback type that is in the W3C spec.
- */
-typedef NS_ENUM(NSInteger, RTCSdpType) {
-  RTCSdpTypeOffer,
-  RTCSdpTypePrAnswer,
-  RTCSdpTypeAnswer,
-};
-
-NS_ASSUME_NONNULL_BEGIN
-
-RTC_EXPORT
-@interface RTCSessionDescription : NSObject
-
-/** The type of session description. */
-@property(nonatomic, readonly) RTCSdpType type;
-
-/** The SDP string representation of this session description. */
-@property(nonatomic, readonly) NSString *sdp;
-
-- (instancetype)init NS_UNAVAILABLE;
-
-/** Initialize a session description with a type and SDP string. */
-- (instancetype)initWithType:(RTCSdpType)type sdp:(NSString *)sdp
-    NS_DESIGNATED_INITIALIZER;
-
-+ (NSString *)stringForType:(RTCSdpType)type;
-
-+ (RTCSdpType)typeForString:(NSString *)string;
-
-@end
-
-NS_ASSUME_NONNULL_END
diff --git a/sdk/objc/Framework/Headers/WebRTC/RTCTracing.h b/sdk/objc/Framework/Headers/WebRTC/RTCTracing.h
deleted file mode 100644
index 1364791..0000000
--- a/sdk/objc/Framework/Headers/WebRTC/RTCTracing.h
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- *  Copyright 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.
- */
-
-#import <Foundation/Foundation.h>
-
-#import <WebRTC/RTCMacros.h>
-
-RTC_EXTERN void RTCSetupInternalTracer();
-/** Starts capture to specified file. Must be a valid writable path.
- *  Returns YES if capture starts.
- */
-RTC_EXTERN BOOL RTCStartInternalCapture(NSString *filePath);
-RTC_EXTERN void RTCStopInternalCapture();
-RTC_EXTERN void RTCShutdownInternalTracer();
diff --git a/sdk/objc/Framework/Headers/WebRTC/RTCVideoCapturer.h b/sdk/objc/Framework/Headers/WebRTC/RTCVideoCapturer.h
deleted file mode 100644
index 3addec8..0000000
--- a/sdk/objc/Framework/Headers/WebRTC/RTCVideoCapturer.h
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- *  Copyright 2017 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.
- */
-
-#import <WebRTC/RTCVideoFrame.h>
-
-NS_ASSUME_NONNULL_BEGIN
-
-@class RTCVideoCapturer;
-
-RTC_EXPORT
-@protocol RTCVideoCapturerDelegate <NSObject>
-- (void)capturer:(RTCVideoCapturer *)capturer didCaptureVideoFrame:(RTCVideoFrame *)frame;
-@end
-
-RTC_EXPORT
-@interface RTCVideoCapturer : NSObject
-
-@property(nonatomic, readonly, weak) id<RTCVideoCapturerDelegate> delegate;
-
-- (instancetype)initWithDelegate:(id<RTCVideoCapturerDelegate>)delegate;
-
-@end
-
-NS_ASSUME_NONNULL_END
diff --git a/sdk/objc/Framework/Headers/WebRTC/RTCVideoCodec.h b/sdk/objc/Framework/Headers/WebRTC/RTCVideoCodec.h
deleted file mode 100644
index 2f287dd..0000000
--- a/sdk/objc/Framework/Headers/WebRTC/RTCVideoCodec.h
+++ /dev/null
@@ -1,184 +0,0 @@
-/*
- *  Copyright 2017 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.
- */
-
-#import <Foundation/Foundation.h>
-
-#import <WebRTC/RTCMacros.h>
-#import <WebRTC/RTCVideoFrame.h>
-
-NS_ASSUME_NONNULL_BEGIN
-
-/** Represents an encoded frame's type. */
-typedef NS_ENUM(NSUInteger, RTCFrameType) {
-  RTCFrameTypeEmptyFrame = 0,
-  RTCFrameTypeAudioFrameSpeech = 1,
-  RTCFrameTypeAudioFrameCN = 2,
-  RTCFrameTypeVideoFrameKey = 3,
-  RTCFrameTypeVideoFrameDelta = 4,
-};
-
-typedef NS_ENUM(NSUInteger, RTCVideoContentType) {
-  RTCVideoContentTypeUnspecified,
-  RTCVideoContentTypeScreenshare,
-};
-
-/** Represents an encoded frame. Corresponds to webrtc::EncodedImage. */
-RTC_EXPORT
-@interface RTCEncodedImage : NSObject
-
-@property(nonatomic, strong) NSData *buffer;
-@property(nonatomic, assign) int32_t encodedWidth;
-@property(nonatomic, assign) int32_t encodedHeight;
-@property(nonatomic, assign) uint32_t timeStamp;
-@property(nonatomic, assign) int64_t captureTimeMs;
-@property(nonatomic, assign) int64_t ntpTimeMs;
-@property(nonatomic, assign) uint8_t flags;
-@property(nonatomic, assign) int64_t encodeStartMs;
-@property(nonatomic, assign) int64_t encodeFinishMs;
-@property(nonatomic, assign) RTCFrameType frameType;
-@property(nonatomic, assign) RTCVideoRotation rotation;
-@property(nonatomic, assign) BOOL completeFrame;
-@property(nonatomic, strong) NSNumber *qp;
-@property(nonatomic, assign) RTCVideoContentType contentType;
-
-@end
-
-/** Information for header. Corresponds to webrtc::RTPFragmentationHeader. */
-RTC_EXPORT
-@interface RTCRtpFragmentationHeader : NSObject
-
-@property(nonatomic, strong) NSArray<NSNumber *> *fragmentationOffset;
-@property(nonatomic, strong) NSArray<NSNumber *> *fragmentationLength;
-@property(nonatomic, strong) NSArray<NSNumber *> *fragmentationTimeDiff;
-@property(nonatomic, strong) NSArray<NSNumber *> *fragmentationPlType;
-
-@end
-
-/** Implement this protocol to pass codec specific info from the encoder.
- *  Corresponds to webrtc::CodecSpecificInfo.
- */
-RTC_EXPORT
-@protocol RTCCodecSpecificInfo <NSObject>
-
-@end
-
-/** Class for H264 specific config. */
-typedef NS_ENUM(NSUInteger, RTCH264PacketizationMode) {
-  RTCH264PacketizationModeNonInterleaved = 0,  // Mode 1 - STAP-A, FU-A is allowed
-  RTCH264PacketizationModeSingleNalUnit        // Mode 0 - only single NALU allowed
-};
-
-RTC_EXPORT
-@interface RTCCodecSpecificInfoH264 : NSObject<RTCCodecSpecificInfo>
-
-@property(nonatomic, assign) RTCH264PacketizationMode packetizationMode;
-
-@end
-
-/** Callback block for encoder. */
-typedef BOOL (^RTCVideoEncoderCallback)(RTCEncodedImage *frame,
-                                        id<RTCCodecSpecificInfo> info,
-                                        RTCRtpFragmentationHeader *header);
-
-/** Callback block for decoder. */
-typedef void (^RTCVideoDecoderCallback)(RTCVideoFrame *frame);
-
-typedef NS_ENUM(NSUInteger, RTCVideoCodecMode) {
-  RTCVideoCodecModeRealtimeVideo,
-  RTCVideoCodecModeScreensharing,
-};
-
-/** Holds information to identify a codec. Corresponds to cricket::VideoCodec. */
-RTC_EXPORT
-@interface RTCVideoCodecInfo : NSObject
-
-- (instancetype)init NS_UNAVAILABLE;
-
-- (instancetype)initWithName:(NSString *)name
-                  parameters:(nullable NSDictionary<NSString *, NSString *> *)parameters
-    NS_DESIGNATED_INITIALIZER;
-
-@property(nonatomic, readonly) NSInteger payload;
-@property(nonatomic, readonly) NSString *name;
-@property(nonatomic, readonly) NSDictionary<NSString *, NSString *> *parameters;
-
-@end
-
-/** Settings for encoder. Corresponds to webrtc::VideoCodec. */
-RTC_EXPORT
-@interface RTCVideoEncoderSettings : NSObject
-
-@property(nonatomic, strong) NSString *name;
-
-@property(nonatomic, assign) unsigned short width;
-@property(nonatomic, assign) unsigned short height;
-
-@property(nonatomic, assign) unsigned int startBitrate;  // kilobits/sec.
-@property(nonatomic, assign) unsigned int maxBitrate;
-@property(nonatomic, assign) unsigned int minBitrate;
-@property(nonatomic, assign) unsigned int targetBitrate;
-
-@property(nonatomic, assign) uint32_t maxFramerate;
-
-@property(nonatomic, assign) unsigned int qpMax;
-@property(nonatomic, assign) RTCVideoCodecMode mode;
-
-@end
-
-/** QP thresholds for encoder. Corresponds to webrtc::VideoEncoder::QpThresholds. */
-RTC_EXPORT
-@interface RTCVideoEncoderQpThresholds : NSObject
-
-- (instancetype)initWithThresholdsLow:(NSInteger)low high:(NSInteger)high;
-
-@property(nonatomic, readonly) NSInteger low;
-@property(nonatomic, readonly) NSInteger high;
-
-@end
-
-/** Protocol for encoder implementations. */
-RTC_EXPORT
-@protocol RTCVideoEncoder <NSObject>
-
-- (void)setCallback:(RTCVideoEncoderCallback)callback;
-- (NSInteger)startEncodeWithSettings:(RTCVideoEncoderSettings *)settings
-                       numberOfCores:(int)numberOfCores;
-- (NSInteger)releaseEncoder;
-- (NSInteger)encode:(RTCVideoFrame *)frame
-    codecSpecificInfo:(id<RTCCodecSpecificInfo>)info
-           frameTypes:(NSArray<NSNumber *> *)frameTypes;
-- (int)setBitrate:(uint32_t)bitrateKbit framerate:(uint32_t)framerate;
-- (NSString *)implementationName;
-
-/** Returns QP scaling settings for encoder. The quality scaler adjusts the resolution in order to
- *  keep the QP from the encoded images within the given range. Returning nil from this function
- *  disables quality scaling. */
-- (RTCVideoEncoderQpThresholds *)scalingSettings;
-
-@end
-
-/** Protocol for decoder implementations. */
-RTC_EXPORT
-@protocol RTCVideoDecoder <NSObject>
-
-- (void)setCallback:(RTCVideoDecoderCallback)callback;
-- (NSInteger)startDecodeWithSettings:(RTCVideoEncoderSettings *)settings
-                       numberOfCores:(int)numberOfCores;
-- (NSInteger)releaseDecoder;
-- (NSInteger)decode:(RTCEncodedImage *)encodedImage
-          missingFrames:(BOOL)missingFrames
-    fragmentationHeader:(RTCRtpFragmentationHeader *)fragmentationHeader
-      codecSpecificInfo:(__nullable id<RTCCodecSpecificInfo>)info
-           renderTimeMs:(int64_t)renderTimeMs;
-- (NSString *)implementationName;
-
-@end
-
-NS_ASSUME_NONNULL_END
diff --git a/sdk/objc/Framework/Headers/WebRTC/RTCVideoCodecFactory.h b/sdk/objc/Framework/Headers/WebRTC/RTCVideoCodecFactory.h
deleted file mode 100644
index 42842eb..0000000
--- a/sdk/objc/Framework/Headers/WebRTC/RTCVideoCodecFactory.h
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- *  Copyright 2017 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.
- */
-
-#import <Foundation/Foundation.h>
-
-#import <WebRTC/RTCMacros.h>
-#import <WebRTC/RTCVideoCodec.h>
-
-NS_ASSUME_NONNULL_BEGIN
-
-/** RTCVideoEncoderFactory is an Objective-C version of cricket::WebRtcVideoEncoderFactory. */
-RTC_EXPORT
-@protocol RTCVideoEncoderFactory <NSObject>
-
-- (id<RTCVideoEncoder>)createEncoder:(RTCVideoCodecInfo *)info;
-- (NSArray<RTCVideoCodecInfo *> *)supportedCodecs;
-
-@end
-
-/** RTCVideoDecoderFactory is an Objective-C version of cricket::WebRtcVideoDecoderFactory. */
-RTC_EXPORT
-@protocol RTCVideoDecoderFactory <NSObject>
-
-- (id<RTCVideoDecoder>)createDecoder:(RTCVideoCodecInfo *)info;
-- (NSArray<RTCVideoCodecInfo *> *)supportedCodecs;
-
-@end
-
-NS_ASSUME_NONNULL_END
diff --git a/sdk/objc/Framework/Headers/WebRTC/RTCVideoCodecH264.h b/sdk/objc/Framework/Headers/WebRTC/RTCVideoCodecH264.h
deleted file mode 100644
index 449fcbb..0000000
--- a/sdk/objc/Framework/Headers/WebRTC/RTCVideoCodecH264.h
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- *  Copyright 2017 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.
- */
-
-#import <Foundation/Foundation.h>
-
-#import <WebRTC/RTCMacros.h>
-#import <WebRTC/RTCVideoCodecFactory.h>
-
-/** Encoder. */
-RTC_EXPORT
-@interface RTCVideoEncoderH264 : NSObject<RTCVideoEncoder>
-
-- (instancetype)initWithCodecInfo:(RTCVideoCodecInfo *)codecInfo;
-
-@end
-
-/** Decoder. */
-RTC_EXPORT
-@interface RTCVideoDecoderH264 : NSObject<RTCVideoDecoder>
-@end
-
-/** Encoder factory. */
-RTC_EXPORT
-@interface RTCVideoEncoderFactoryH264 : NSObject<RTCVideoEncoderFactory>
-@end
-
-/** Decoder factory. */
-RTC_EXPORT
-@interface RTCVideoDecoderFactoryH264 : NSObject<RTCVideoDecoderFactory>
-@end
diff --git a/sdk/objc/Framework/Headers/WebRTC/RTCVideoFrame.h b/sdk/objc/Framework/Headers/WebRTC/RTCVideoFrame.h
deleted file mode 100644
index dcc4c6e..0000000
--- a/sdk/objc/Framework/Headers/WebRTC/RTCVideoFrame.h
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-#import <AVFoundation/AVFoundation.h>
-#import <Foundation/Foundation.h>
-
-#import <WebRTC/RTCMacros.h>
-
-NS_ASSUME_NONNULL_BEGIN
-
-typedef NS_ENUM(NSInteger, RTCVideoRotation) {
-  RTCVideoRotation_0 = 0,
-  RTCVideoRotation_90 = 90,
-  RTCVideoRotation_180 = 180,
-  RTCVideoRotation_270 = 270,
-};
-
-@protocol RTCVideoFrameBuffer;
-
-// RTCVideoFrame is an ObjectiveC version of webrtc::VideoFrame.
-RTC_EXPORT
-@interface RTCVideoFrame : NSObject
-
-/** Width without rotation applied. */
-@property(nonatomic, readonly) int width;
-
-/** Height without rotation applied. */
-@property(nonatomic, readonly) int height;
-@property(nonatomic, readonly) RTCVideoRotation rotation;
-
-/** Timestamp in nanoseconds. */
-@property(nonatomic, readonly) int64_t timeStampNs;
-
-/** Timestamp 90 kHz. */
-@property(nonatomic, assign) int32_t timeStamp;
-
-@property(nonatomic, readonly) id<RTCVideoFrameBuffer> buffer;
-
-- (instancetype)init NS_UNAVAILABLE;
-- (instancetype)new NS_UNAVAILABLE;
-
-/** Initialize an RTCVideoFrame from a pixel buffer, rotation, and timestamp.
- *  Deprecated - initialize with a RTCCVPixelBuffer instead
- */
-- (instancetype)initWithPixelBuffer:(CVPixelBufferRef)pixelBuffer
-                           rotation:(RTCVideoRotation)rotation
-                        timeStampNs:(int64_t)timeStampNs
-    DEPRECATED_MSG_ATTRIBUTE("use initWithBuffer instead");
-
-/** Initialize an RTCVideoFrame from a pixel buffer combined with cropping and
- *  scaling. Cropping will be applied first on the pixel buffer, followed by
- *  scaling to the final resolution of scaledWidth x scaledHeight.
- */
-- (instancetype)initWithPixelBuffer:(CVPixelBufferRef)pixelBuffer
-                        scaledWidth:(int)scaledWidth
-                       scaledHeight:(int)scaledHeight
-                          cropWidth:(int)cropWidth
-                         cropHeight:(int)cropHeight
-                              cropX:(int)cropX
-                              cropY:(int)cropY
-                           rotation:(RTCVideoRotation)rotation
-                        timeStampNs:(int64_t)timeStampNs
-    DEPRECATED_MSG_ATTRIBUTE("use initWithBuffer instead");
-
-/** Initialize an RTCVideoFrame from a frame buffer, rotation, and timestamp.
- */
-- (instancetype)initWithBuffer:(id<RTCVideoFrameBuffer>)frameBuffer
-                      rotation:(RTCVideoRotation)rotation
-                   timeStampNs:(int64_t)timeStampNs;
-
-/** Return a frame that is guaranteed to be I420, i.e. it is possible to access
- *  the YUV data on it.
- */
-- (RTCVideoFrame *)newI420VideoFrame;
-
-@end
-
-NS_ASSUME_NONNULL_END
diff --git a/sdk/objc/Framework/Headers/WebRTC/RTCVideoFrameBuffer.h b/sdk/objc/Framework/Headers/WebRTC/RTCVideoFrameBuffer.h
deleted file mode 100644
index ffcdf26..0000000
--- a/sdk/objc/Framework/Headers/WebRTC/RTCVideoFrameBuffer.h
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- *  Copyright 2017 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.
- */
-
-#import <AVFoundation/AVFoundation.h>
-#import <WebRTC/RTCMacros.h>
-
-NS_ASSUME_NONNULL_BEGIN
-
-@protocol RTCI420Buffer;
-
-// RTCVideoFrameBuffer is an ObjectiveC version of webrtc::VideoFrameBuffer.
-RTC_EXPORT
-@protocol RTCVideoFrameBuffer <NSObject>
-
-@property(nonatomic, readonly) int width;
-@property(nonatomic, readonly) int height;
-
-- (id<RTCI420Buffer>)toI420;
-
-@end
-
-/** Protocol for RTCVideoFrameBuffers containing YUV planar data. */
-@protocol RTCYUVPlanarBuffer <RTCVideoFrameBuffer>
-
-@property(nonatomic, readonly) int chromaWidth;
-@property(nonatomic, readonly) int chromaHeight;
-@property(nonatomic, readonly) const uint8_t *dataY;
-@property(nonatomic, readonly) const uint8_t *dataU;
-@property(nonatomic, readonly) const uint8_t *dataV;
-@property(nonatomic, readonly) int strideY;
-@property(nonatomic, readonly) int strideU;
-@property(nonatomic, readonly) int strideV;
-
-- (instancetype)initWithWidth:(int)width height:(int)height;
-- (instancetype)initWithWidth:(int)width
-                       height:(int)height
-                      strideY:(int)strideY
-                      strideU:(int)strideU
-                      strideV:(int)strideV;
-
-@end
-
-/** Extension of the YUV planar data buffer with mutable data access */
-@protocol RTCMutableYUVPlanarBuffer <RTCYUVPlanarBuffer>
-
-@property(nonatomic, readonly) uint8_t *mutableDataY;
-@property(nonatomic, readonly) uint8_t *mutableDataU;
-@property(nonatomic, readonly) uint8_t *mutableDataV;
-
-@end
-
-/** Protocol for RTCYUVPlanarBuffers containing I420 data */
-@protocol RTCI420Buffer <RTCYUVPlanarBuffer>
-@end
-
-/** Extension of the I420 buffer with mutable data access */
-@protocol RTCMutableI420Buffer <RTCI420Buffer, RTCMutableYUVPlanarBuffer>
-@end
-
-/** RTCVideoFrameBuffer containing a CVPixelBufferRef */
-RTC_EXPORT
-@interface RTCCVPixelBuffer : NSObject <RTCVideoFrameBuffer>
-
-@property(nonatomic, readonly) CVPixelBufferRef pixelBuffer;
-@property(nonatomic, readonly) int cropX;
-@property(nonatomic, readonly) int cropY;
-
-- (instancetype)initWithPixelBuffer:(CVPixelBufferRef)pixelBuffer;
-- (instancetype)initWithPixelBuffer:(CVPixelBufferRef)pixelBuffer
-                       adaptedWidth:(int)adaptedWidth
-                      adaptedHeight:(int)adaptedHeight
-                          cropWidth:(int)cropWidth
-                         cropHeight:(int)cropHeight
-                              cropX:(int)cropX
-                              cropY:(int)cropY;
-
-- (BOOL)requiresCropping;
-- (BOOL)requiresScalingToWidth:(int)width height:(int)height;
-- (int)bufferSizeForCroppingAndScalingToWidth:(int)width height:(int)height;
-/** The minimum size of the |tmpBuffer| must be the number of bytes returned from the
- * bufferSizeForCroppingAndScalingToWidth:height: method.
- */
-- (BOOL)cropAndScaleTo:(CVPixelBufferRef)outputPixelBuffer withTempBuffer:(uint8_t *)tmpBuffer;
-
-@end
-
-/** RTCI420Buffer implements the RTCI420Buffer protocol */
-RTC_EXPORT
-@interface RTCI420Buffer : NSObject <RTCI420Buffer>
-@end
-
-/** Mutable version of RTCI420Buffer */
-RTC_EXPORT
-@interface RTCMutableI420Buffer : RTCI420Buffer <RTCMutableI420Buffer>
-@end
-
-NS_ASSUME_NONNULL_END
diff --git a/sdk/objc/Framework/Headers/WebRTC/RTCVideoRenderer.h b/sdk/objc/Framework/Headers/WebRTC/RTCVideoRenderer.h
deleted file mode 100644
index 5e2e820..0000000
--- a/sdk/objc/Framework/Headers/WebRTC/RTCVideoRenderer.h
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-#import <Foundation/Foundation.h>
-#if TARGET_OS_IPHONE
-#import <UIKit/UIKit.h>
-#endif
-
-#import <WebRTC/RTCMacros.h>
-
-NS_ASSUME_NONNULL_BEGIN
-
-@class RTCVideoFrame;
-
-RTC_EXPORT
-@protocol RTCVideoRenderer <NSObject>
-
-/** The size of the frame. */
-- (void)setSize:(CGSize)size;
-
-/** The frame to be displayed. */
-- (void)renderFrame:(nullable RTCVideoFrame *)frame;
-
-@end
-
-NS_ASSUME_NONNULL_END
diff --git a/sdk/objc/Framework/Headers/WebRTC/RTCVideoSource.h b/sdk/objc/Framework/Headers/WebRTC/RTCVideoSource.h
deleted file mode 100644
index a9ebc06..0000000
--- a/sdk/objc/Framework/Headers/WebRTC/RTCVideoSource.h
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-#import <Foundation/Foundation.h>
-
-#import <WebRTC/RTCMacros.h>
-#import <WebRTC/RTCMediaSource.h>
-#import <WebRTC/RTCVideoCapturer.h>
-
-NS_ASSUME_NONNULL_BEGIN
-
-RTC_EXPORT
-
-@interface RTCVideoSource : RTCMediaSource <RTCVideoCapturerDelegate>
-
-- (instancetype)init NS_UNAVAILABLE;
-
-/**
- * Calling this function will cause frames to be scaled down to the
- * requested resolution. Also, frames will be cropped to match the
- * requested aspect ratio, and frames will be dropped to match the
- * requested fps. The requested aspect ratio is orientation agnostic and
- * will be adjusted to maintain the input orientation, so it doesn't
- * matter if e.g. 1280x720 or 720x1280 is requested.
- */
-- (void)adaptOutputFormatToWidth:(int)width height:(int)height fps:(int)fps;
-
-@end
-
-NS_ASSUME_NONNULL_END
diff --git a/sdk/objc/Framework/Headers/WebRTC/RTCVideoTrack.h b/sdk/objc/Framework/Headers/WebRTC/RTCVideoTrack.h
deleted file mode 100644
index 899d7c3..0000000
--- a/sdk/objc/Framework/Headers/WebRTC/RTCVideoTrack.h
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-#import <WebRTC/RTCMediaStreamTrack.h>
-
-#import <WebRTC/RTCMacros.h>
-
-NS_ASSUME_NONNULL_BEGIN
-
-@protocol RTCVideoRenderer;
-@class RTCPeerConnectionFactory;
-@class RTCVideoSource;
-
-RTC_EXPORT
-@interface RTCVideoTrack : RTCMediaStreamTrack
-
-/** The video source for this video track. */
-@property(nonatomic, readonly) RTCVideoSource *source;
-
-- (instancetype)init NS_UNAVAILABLE;
-
-/** Register a renderer that will render all frames received on this track. */
-- (void)addRenderer:(id<RTCVideoRenderer>)renderer;
-
-/** Deregister a renderer. */
-- (void)removeRenderer:(id<RTCVideoRenderer>)renderer;
-
-@end
-
-NS_ASSUME_NONNULL_END
diff --git a/sdk/objc/Framework/Headers/WebRTC/RTCVideoViewShading.h b/sdk/objc/Framework/Headers/WebRTC/RTCVideoViewShading.h
deleted file mode 100644
index 6f3ece9..0000000
--- a/sdk/objc/Framework/Headers/WebRTC/RTCVideoViewShading.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- *  Copyright 2017 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.
- */
-
-#import <Foundation/Foundation.h>
-
-#import <WebRTC/RTCVideoFrame.h>
-
-NS_ASSUME_NONNULL_BEGIN
-
-/**
- * RTCVideoViewShading provides a way for apps to customize the OpenGL(ES) shaders used in
- * rendering for the RTCEAGLVideoView/RTCNSGLVideoView.
- */
-RTC_EXPORT
-@protocol RTCVideoViewShading <NSObject>
-
-/** Callback for I420 frames. Each plane is given as a texture. */
-- (void)applyShadingForFrameWithWidth:(int)width
-                               height:(int)height
-                             rotation:(RTCVideoRotation)rotation
-                               yPlane:(GLuint)yPlane
-                               uPlane:(GLuint)uPlane
-                               vPlane:(GLuint)vPlane;
-
-/** Callback for NV12 frames. Each plane is given as a texture. */
-- (void)applyShadingForFrameWithWidth:(int)width
-                               height:(int)height
-                             rotation:(RTCVideoRotation)rotation
-                               yPlane:(GLuint)yPlane
-                              uvPlane:(GLuint)uvPlane;
-
-@end
-
-NS_ASSUME_NONNULL_END
diff --git a/sdk/objc/Framework/Headers/WebRTC/UIDevice+RTCDevice.h b/sdk/objc/Framework/Headers/WebRTC/UIDevice+RTCDevice.h
deleted file mode 100644
index 29e4801..0000000
--- a/sdk/objc/Framework/Headers/WebRTC/UIDevice+RTCDevice.h
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- *  Copyright 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.
- */
-
-#import <UIKit/UIKit.h>
-
-typedef NS_ENUM(NSInteger, RTCDeviceType) {
-  RTCDeviceTypeUnknown,
-  RTCDeviceTypeIPhone1G,
-  RTCDeviceTypeIPhone3G,
-  RTCDeviceTypeIPhone3GS,
-  RTCDeviceTypeIPhone4,
-  RTCDeviceTypeIPhone4Verizon,
-  RTCDeviceTypeIPhone4S,
-  RTCDeviceTypeIPhone5GSM,
-  RTCDeviceTypeIPhone5GSM_CDMA,
-  RTCDeviceTypeIPhone5CGSM,
-  RTCDeviceTypeIPhone5CGSM_CDMA,
-  RTCDeviceTypeIPhone5SGSM,
-  RTCDeviceTypeIPhone5SGSM_CDMA,
-  RTCDeviceTypeIPhone6Plus,
-  RTCDeviceTypeIPhone6,
-  RTCDeviceTypeIPhone6S,
-  RTCDeviceTypeIPhone6SPlus,
-  RTCDeviceTypeIPodTouch1G,
-  RTCDeviceTypeIPodTouch2G,
-  RTCDeviceTypeIPodTouch3G,
-  RTCDeviceTypeIPodTouch4G,
-  RTCDeviceTypeIPodTouch5G,
-  RTCDeviceTypeIPad,
-  RTCDeviceTypeIPad2Wifi,
-  RTCDeviceTypeIPad2GSM,
-  RTCDeviceTypeIPad2CDMA,
-  RTCDeviceTypeIPad2Wifi2,
-  RTCDeviceTypeIPadMiniWifi,
-  RTCDeviceTypeIPadMiniGSM,
-  RTCDeviceTypeIPadMiniGSM_CDMA,
-  RTCDeviceTypeIPad3Wifi,
-  RTCDeviceTypeIPad3GSM_CDMA,
-  RTCDeviceTypeIPad3GSM,
-  RTCDeviceTypeIPad4Wifi,
-  RTCDeviceTypeIPad4GSM,
-  RTCDeviceTypeIPad4GSM_CDMA,
-  RTCDeviceTypeIPadAirWifi,
-  RTCDeviceTypeIPadAirCellular,
-  RTCDeviceTypeIPadMini2GWifi,
-  RTCDeviceTypeIPadMini2GCellular,
-  RTCDeviceTypeSimulatori386,
-  RTCDeviceTypeSimulatorx86_64,
-};
-
-@interface UIDevice (RTCDevice)
-
-+ (RTCDeviceType)deviceType;
-+ (NSString *)stringForDeviceType:(RTCDeviceType)deviceType;
-+ (BOOL)isIOS9OrLater;
-
-@end
diff --git a/sdk/objc/Framework/Headers/WebRTC/WebRTC.h b/sdk/objc/Framework/Headers/WebRTC/WebRTC.h
deleted file mode 100644
index 64ca544..0000000
--- a/sdk/objc/Framework/Headers/WebRTC/WebRTC.h
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- *  Copyright 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.
- */
-
-#import <WebRTC/RTCAVFoundationVideoSource.h>
-#if TARGET_OS_IPHONE
-#import <WebRTC/RTCAudioSession.h>
-#import <WebRTC/RTCAudioSessionConfiguration.h>
-#endif
-#import <WebRTC/RTCAudioSource.h>
-#import <WebRTC/RTCAudioTrack.h>
-#import <WebRTC/RTCCameraVideoCapturer.h>
-#import <WebRTC/RTCVideoCapturer.h>
-#if TARGET_OS_IPHONE
-#import <WebRTC/RTCCameraPreviewView.h>
-#endif
-#import <WebRTC/RTCConfiguration.h>
-#import <WebRTC/RTCDataChannel.h>
-#import <WebRTC/RTCDataChannelConfiguration.h>
-#import <WebRTC/RTCDispatcher.h>
-#if TARGET_OS_IPHONE
-#import <WebRTC/RTCEAGLVideoView.h>
-#import <WebRTC/RTCMTLVideoView.h>
-#import <WebRTC/RTCVideoViewShading.h>
-#endif
-#import <WebRTC/RTCFieldTrials.h>
-#import <WebRTC/RTCFileLogger.h>
-#import <WebRTC/RTCIceCandidate.h>
-#import <WebRTC/RTCIceServer.h>
-#import <WebRTC/RTCIntervalRange.h>
-#import <WebRTC/RTCLegacyStatsReport.h>
-#import <WebRTC/RTCLogging.h>
-#import <WebRTC/RTCMacros.h>
-#import <WebRTC/RTCMediaConstraints.h>
-#import <WebRTC/RTCMediaSource.h>
-#import <WebRTC/RTCMediaStream.h>
-#import <WebRTC/RTCMediaStreamTrack.h>
-#import <WebRTC/RTCMetrics.h>
-#import <WebRTC/RTCMetricsSampleInfo.h>
-#import <WebRTC/RTCPeerConnection.h>
-#import <WebRTC/RTCPeerConnectionFactory.h>
-#import <WebRTC/RTCRtpCodecParameters.h>
-#import <WebRTC/RTCRtpEncodingParameters.h>
-#import <WebRTC/RTCRtpParameters.h>
-#import <WebRTC/RTCRtpReceiver.h>
-#import <WebRTC/RTCRtpSender.h>
-#import <WebRTC/RTCSSLAdapter.h>
-#import <WebRTC/RTCSessionDescription.h>
-#import <WebRTC/RTCTracing.h>
-#import <WebRTC/RTCVideoCodec.h>
-#import <WebRTC/RTCVideoCodecFactory.h>
-#import <WebRTC/RTCVideoCodecH264.h>
-#import <WebRTC/RTCVideoFrame.h>
-#import <WebRTC/RTCVideoFrameBuffer.h>
-#import <WebRTC/RTCVideoRenderer.h>
-#import <WebRTC/RTCVideoSource.h>
-#import <WebRTC/RTCVideoTrack.h>
-#if TARGET_OS_IPHONE
-#import <WebRTC/UIDevice+RTCDevice.h>
-#endif
diff --git a/sdk/objc/Framework/Info.plist b/sdk/objc/Framework/Info.plist
deleted file mode 100644
index 38c437e..0000000
--- a/sdk/objc/Framework/Info.plist
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
-	<key>CFBundleDevelopmentRegion</key>
-	<string>en</string>
-	<key>CFBundleExecutable</key>
-	<string>WebRTC</string>
-	<key>CFBundleIdentifier</key>
-	<string>org.webrtc.WebRTC</string>
-	<key>CFBundleInfoDictionaryVersion</key>
-	<string>6.0</string>
-	<key>CFBundleName</key>
-	<string>WebRTC</string>
-	<key>CFBundlePackageType</key>
-	<string>FMWK</string>
-	<key>CFBundleShortVersionString</key>
-	<string>1.0</string>
-	<key>CFBundleSignature</key>
-	<string>????</string>
-	<key>CFBundleVersion</key>
-	<string>1.0</string>
-	<key>NSPrincipalClass</key>
-	<string></string>
-</dict>
-</plist>
diff --git a/sdk/objc/Framework/Modules/module.modulemap b/sdk/objc/Framework/Modules/module.modulemap
deleted file mode 100644
index cd485a4..0000000
--- a/sdk/objc/Framework/Modules/module.modulemap
+++ /dev/null
@@ -1,6 +0,0 @@
-framework module WebRTC {
-  umbrella header "WebRTC.h"
-
-  export *
-  module * { export * }
-}
diff --git a/sdk/objc/Framework/UnitTests/RTCAudioSessionTest.mm b/sdk/objc/Framework/UnitTests/RTCAudioSessionTest.mm
deleted file mode 100644
index 41618c3..0000000
--- a/sdk/objc/Framework/UnitTests/RTCAudioSessionTest.mm
+++ /dev/null
@@ -1,338 +0,0 @@
-/*
- *  Copyright 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.
- */
-
-#import <Foundation/Foundation.h>
-#import <OCMock/OCMock.h>
-
-#include "webrtc/rtc_base/gunit.h"
-
-#import "RTCAudioSession+Private.h"
-
-#import "WebRTC/RTCAudioSession.h"
-#import "WebRTC/RTCAudioSessionConfiguration.h"
-
-@interface RTCAudioSessionTestDelegate : NSObject <RTCAudioSessionDelegate>
-
-@property (nonatomic, readonly) float outputVolume;
-
-@end
-
-@implementation RTCAudioSessionTestDelegate
-
-@synthesize outputVolume = _outputVolume;
-
-- (instancetype)init {
-  if (self = [super init]) {
-    _outputVolume = -1;
-  }
-  return self;
-}
-
-- (void)audioSessionDidBeginInterruption:(RTCAudioSession *)session {
-}
-
-- (void)audioSessionDidEndInterruption:(RTCAudioSession *)session
-                   shouldResumeSession:(BOOL)shouldResumeSession {
-}
-
-- (void)audioSessionDidChangeRoute:(RTCAudioSession *)session
-           reason:(AVAudioSessionRouteChangeReason)reason
-    previousRoute:(AVAudioSessionRouteDescription *)previousRoute {
-}
-
-- (void)audioSessionMediaServerTerminated:(RTCAudioSession *)session {
-}
-
-- (void)audioSessionMediaServerReset:(RTCAudioSession *)session {
-}
-
-- (void)audioSessionShouldConfigure:(RTCAudioSession *)session {
-}
-
-- (void)audioSessionShouldUnconfigure:(RTCAudioSession *)session {
-}
-
-- (void)audioSession:(RTCAudioSession *)audioSession
-    didChangeOutputVolume:(float)outputVolume {
-  _outputVolume = outputVolume;
-}
-
-@end
-
-// A delegate that adds itself to the audio session on init and removes itself
-// in its dealloc.
-@interface RTCTestRemoveOnDeallocDelegate : RTCAudioSessionTestDelegate
-@end
-
-@implementation RTCTestRemoveOnDeallocDelegate
-
-- (instancetype)init {
-  if (self = [super init]) {
-    RTCAudioSession *session = [RTCAudioSession sharedInstance];
-    [session addDelegate:self];
-  }
-  return self;
-}
-
-- (void)dealloc {
-  RTCAudioSession *session = [RTCAudioSession sharedInstance];
-  [session removeDelegate:self];
-}
-
-@end
-
-
-@interface RTCAudioSessionTest : NSObject
-
-- (void)testLockForConfiguration;
-
-@end
-
-@implementation RTCAudioSessionTest
-
-- (void)testLockForConfiguration {
-  RTCAudioSession *session = [RTCAudioSession sharedInstance];
-
-  for (size_t i = 0; i < 2; i++) {
-    [session lockForConfiguration];
-    EXPECT_TRUE(session.isLocked);
-  }
-  for (size_t i = 0; i < 2; i++) {
-    EXPECT_TRUE(session.isLocked);
-    [session unlockForConfiguration];
-  }
-  EXPECT_FALSE(session.isLocked);
-}
-
-- (void)testAddAndRemoveDelegates {
-  RTCAudioSession *session = [RTCAudioSession sharedInstance];
-  NSMutableArray *delegates = [NSMutableArray array];
-  const size_t count = 5;
-  for (size_t i = 0; i < count; ++i) {
-    RTCAudioSessionTestDelegate *delegate =
-        [[RTCAudioSessionTestDelegate alloc] init];
-    [session addDelegate:delegate];
-    [delegates addObject:delegate];
-    EXPECT_EQ(i + 1, session.delegates.size());
-  }
-  [delegates enumerateObjectsUsingBlock:^(RTCAudioSessionTestDelegate *obj,
-                                          NSUInteger idx,
-                                          BOOL *stop) {
-    [session removeDelegate:obj];
-  }];
-  EXPECT_EQ(0u, session.delegates.size());
-}
-
-- (void)testPushDelegate {
-  RTCAudioSession *session = [RTCAudioSession sharedInstance];
-  NSMutableArray *delegates = [NSMutableArray array];
-  const size_t count = 2;
-  for (size_t i = 0; i < count; ++i) {
-    RTCAudioSessionTestDelegate *delegate =
-        [[RTCAudioSessionTestDelegate alloc] init];
-    [session addDelegate:delegate];
-    [delegates addObject:delegate];
-  }
-  // Test that it gets added to the front of the list.
-  RTCAudioSessionTestDelegate *pushedDelegate =
-      [[RTCAudioSessionTestDelegate alloc] init];
-  [session pushDelegate:pushedDelegate];
-  EXPECT_TRUE(pushedDelegate == session.delegates[0]);
-
-  // Test that it stays at the front of the list.
-  for (size_t i = 0; i < count; ++i) {
-    RTCAudioSessionTestDelegate *delegate =
-        [[RTCAudioSessionTestDelegate alloc] init];
-    [session addDelegate:delegate];
-    [delegates addObject:delegate];
-  }
-  EXPECT_TRUE(pushedDelegate == session.delegates[0]);
-
-  // Test that the next one goes to the front too.
-  pushedDelegate = [[RTCAudioSessionTestDelegate alloc] init];
-  [session pushDelegate:pushedDelegate];
-  EXPECT_TRUE(pushedDelegate == session.delegates[0]);
-}
-
-// Tests that delegates added to the audio session properly zero out. This is
-// checking an implementation detail (that vectors of __weak work as expected).
-- (void)testZeroingWeakDelegate {
-  RTCAudioSession *session = [RTCAudioSession sharedInstance];
-  @autoreleasepool {
-    // Add a delegate to the session. There should be one delegate at this
-    // point.
-    RTCAudioSessionTestDelegate *delegate =
-        [[RTCAudioSessionTestDelegate alloc] init];
-    [session addDelegate:delegate];
-    EXPECT_EQ(1u, session.delegates.size());
-    EXPECT_TRUE(session.delegates[0]);
-  }
-  // The previously created delegate should've de-alloced, leaving a nil ptr.
-  EXPECT_FALSE(session.delegates[0]);
-  RTCAudioSessionTestDelegate *delegate =
-      [[RTCAudioSessionTestDelegate alloc] init];
-  [session addDelegate:delegate];
-  // On adding a new delegate, nil ptrs should've been cleared.
-  EXPECT_EQ(1u, session.delegates.size());
-  EXPECT_TRUE(session.delegates[0]);
-}
-
-// Tests that we don't crash when removing delegates in dealloc.
-// Added as a regression test.
-- (void)testRemoveDelegateOnDealloc {
-  @autoreleasepool {
-    RTCTestRemoveOnDeallocDelegate *delegate =
-        [[RTCTestRemoveOnDeallocDelegate alloc] init];
-    EXPECT_TRUE(delegate);
-  }
-  RTCAudioSession *session = [RTCAudioSession sharedInstance];
-  EXPECT_EQ(0u, session.delegates.size());
-}
-
-- (void)testAudioSessionActivation {
-  RTCAudioSession *audioSession = [RTCAudioSession sharedInstance];
-  EXPECT_EQ(0, audioSession.activationCount);
-  [audioSession audioSessionDidActivate:[AVAudioSession sharedInstance]];
-  EXPECT_EQ(1, audioSession.activationCount);
-  [audioSession audioSessionDidDeactivate:[AVAudioSession sharedInstance]];
-  EXPECT_EQ(0, audioSession.activationCount);
-}
-
-// Hack - fixes OCMVerify link error
-// Link error is: Undefined symbols for architecture i386:
-// "OCMMakeLocation(objc_object*, char const*, int)", referenced from:
-// -[RTCAudioSessionTest testConfigureWebRTCSession] in RTCAudioSessionTest.o
-// ld: symbol(s) not found for architecture i386
-// REASON: https://github.com/erikdoe/ocmock/issues/238
-OCMLocation *OCMMakeLocation(id testCase, const char *fileCString, int line){
-  return [OCMLocation locationWithTestCase:testCase
-                                      file:[NSString stringWithUTF8String:fileCString]
-                                      line:line];
-}
-
-- (void)testConfigureWebRTCSession {
-  NSError *error = nil;
-
-  void (^setActiveBlock)(NSInvocation *invocation) = ^(NSInvocation *invocation) {
-    __autoreleasing NSError **retError;
-    [invocation getArgument:&retError atIndex:4];
-    *retError = [NSError errorWithDomain:@"AVAudioSession"
-                                    code:AVAudioSessionErrorInsufficientPriority
-                                userInfo:nil];
-    BOOL failure = NO;
-    [invocation setReturnValue:&failure];
-  };
-
-  id mockAVAudioSession = OCMPartialMock([AVAudioSession sharedInstance]);
-  OCMStub([[mockAVAudioSession ignoringNonObjectArgs]
-      setActive:YES withOptions:0 error:((NSError __autoreleasing **)[OCMArg anyPointer])]).
-      andDo(setActiveBlock);
-
-  id mockAudioSession = OCMPartialMock([RTCAudioSession sharedInstance]);
-  OCMStub([mockAudioSession session]).andReturn(mockAVAudioSession);
-
-  RTCAudioSession *audioSession = mockAudioSession;
-  EXPECT_EQ(0, audioSession.activationCount);
-  [audioSession lockForConfiguration];
-  EXPECT_TRUE([audioSession checkLock:nil]);
-  // configureWebRTCSession is forced to fail in the above mock interface,
-  // so activationCount should remain 0
-  OCMExpect([[mockAVAudioSession ignoringNonObjectArgs]
-      setActive:YES withOptions:0 error:((NSError __autoreleasing **)[OCMArg anyPointer])]).
-      andDo(setActiveBlock);
-  OCMExpect([mockAudioSession session]).andReturn(mockAVAudioSession);
-  EXPECT_FALSE([audioSession configureWebRTCSession:&error]);
-  EXPECT_EQ(0, audioSession.activationCount);
-
-  id session = audioSession.session;
-  EXPECT_EQ(session, mockAVAudioSession);
-  EXPECT_EQ(NO, [mockAVAudioSession setActive:YES withOptions:0 error:&error]);
-  [audioSession unlockForConfiguration];
-
-  OCMVerify([mockAudioSession session]);
-  OCMVerify([[mockAVAudioSession ignoringNonObjectArgs] setActive:YES withOptions:0 error:&error]);
-  OCMVerify([[mockAVAudioSession ignoringNonObjectArgs] setActive:NO withOptions:0 error:&error]);
-
-  [mockAVAudioSession stopMocking];
-  [mockAudioSession stopMocking];
-}
-
-- (void)testAudioVolumeDidNotify {
-  RTCAudioSession *session = [RTCAudioSession sharedInstance];
-  RTCAudioSessionTestDelegate *delegate =
-      [[RTCAudioSessionTestDelegate alloc] init];
-  [session addDelegate:delegate];
-
-  [session observeValueForKeyPath:@"outputVolume"
-                         ofObject:[AVAudioSession sharedInstance]
-                           change:
-        @{NSKeyValueChangeNewKey :
-            @([AVAudioSession sharedInstance].outputVolume) }
-                          context:nil];
-
-  EXPECT_NE(delegate.outputVolume, -1);
-  EXPECT_EQ([AVAudioSession sharedInstance].outputVolume, delegate.outputVolume);
-}
-
-@end
-
-namespace webrtc {
-
-class AudioSessionTest : public ::testing::Test {
- protected:
-  void TearDown() {
-    RTCAudioSession *session = [RTCAudioSession sharedInstance];
-    for (id<RTCAudioSessionDelegate> delegate : session.delegates) {
-      [session removeDelegate:delegate];
-    }
-  }
-};
-
-TEST_F(AudioSessionTest, LockForConfiguration) {
-  RTCAudioSessionTest *test = [[RTCAudioSessionTest alloc] init];
-  [test testLockForConfiguration];
-}
-
-TEST_F(AudioSessionTest, AddAndRemoveDelegates) {
-  RTCAudioSessionTest *test = [[RTCAudioSessionTest alloc] init];
-  [test testAddAndRemoveDelegates];
-}
-
-TEST_F(AudioSessionTest, PushDelegate) {
-  RTCAudioSessionTest *test = [[RTCAudioSessionTest alloc] init];
-  [test testPushDelegate];
-}
-
-TEST_F(AudioSessionTest, ZeroingWeakDelegate) {
-  RTCAudioSessionTest *test = [[RTCAudioSessionTest alloc] init];
-  [test testZeroingWeakDelegate];
-}
-
-TEST_F(AudioSessionTest, RemoveDelegateOnDealloc) {
-  RTCAudioSessionTest *test = [[RTCAudioSessionTest alloc] init];
-  [test testRemoveDelegateOnDealloc];
-}
-
-TEST_F(AudioSessionTest, AudioSessionActivation) {
-  RTCAudioSessionTest *test = [[RTCAudioSessionTest alloc] init];
-  [test testAudioSessionActivation];
-}
-
-TEST_F(AudioSessionTest, ConfigureWebRTCSession) {
-  RTCAudioSessionTest *test = [[RTCAudioSessionTest alloc] init];
-  [test testConfigureWebRTCSession];
-}
-
-TEST_F(AudioSessionTest, AudioVolumeDidNotify) {
-  RTCAudioSessionTest *test = [[RTCAudioSessionTest alloc] init];
-  [test testAudioVolumeDidNotify];
-}
-
-}  // namespace webrtc
diff --git a/sdk/objc/Framework/UnitTests/RTCCameraVideoCapturerTests.mm b/sdk/objc/Framework/UnitTests/RTCCameraVideoCapturerTests.mm
deleted file mode 100644
index 66ac117..0000000
--- a/sdk/objc/Framework/UnitTests/RTCCameraVideoCapturerTests.mm
+++ /dev/null
@@ -1,448 +0,0 @@
-/*
- *  Copyright 2017 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.
- */
-
-#import <OCMock/OCMock.h>
-
-#if TARGET_OS_IPHONE
-#import <UIKit/UIKit.h>
-#endif
-
-#include "webrtc/rtc_base/gunit.h"
-
-#import <WebRTC/RTCCameraVideoCapturer.h>
-#import <WebRTC/RTCDispatcher.h>
-#import <WebRTC/RTCVideoFrame.h>
-#import "AVCaptureSession+DevicePosition.h"
-
-#if TARGET_OS_IPHONE
-// Helper method.
-CMSampleBufferRef createTestSampleBufferRef() {
-
-  // This image is already in the testing bundle.
-  UIImage *image = [UIImage imageNamed:@"Default.png"];
-  CGSize size = image.size;
-  CGImageRef imageRef = [image CGImage];
-
-  CVPixelBufferRef pixelBuffer = nullptr;
-  CVPixelBufferCreate(kCFAllocatorDefault, size.width, size.height, kCVPixelFormatType_32ARGB, nil,
-                      &pixelBuffer);
-
-  CGColorSpaceRef rgbColorSpace = CGColorSpaceCreateDeviceRGB();
-  // We don't care about bitsPerComponent and bytesPerRow so arbitrary value of 8 for both.
-  CGContextRef context = CGBitmapContextCreate(nil, size.width, size.height, 8, 8 * size.width,
-                                               rgbColorSpace, kCGImageAlphaPremultipliedFirst);
-
-  CGContextDrawImage(
-      context, CGRectMake(0, 0, CGImageGetWidth(imageRef), CGImageGetHeight(imageRef)), imageRef);
-
-  CGColorSpaceRelease(rgbColorSpace);
-  CGContextRelease(context);
-
-  // We don't really care about the timing.
-  CMSampleTimingInfo timing = {kCMTimeInvalid, kCMTimeInvalid, kCMTimeInvalid};
-  CMVideoFormatDescriptionRef description = nullptr;
-  CMVideoFormatDescriptionCreateForImageBuffer(NULL, pixelBuffer, &description);
-
-  CMSampleBufferRef sampleBuffer = nullptr;
-  CMSampleBufferCreateForImageBuffer(kCFAllocatorDefault, pixelBuffer, YES, NULL, NULL, description,
-                                     &timing, &sampleBuffer);
-  CFRelease(pixelBuffer);
-
-  return sampleBuffer;
-
-}
-#endif
-@interface RTCCameraVideoCapturer (Tests)<AVCaptureVideoDataOutputSampleBufferDelegate>
-@end
-
-@interface RTCCameraVideoCapturerTests : NSObject
-@property(nonatomic, strong) id delegateMock;
-@property(nonatomic, strong) id deviceMock;
-@property(nonatomic, strong) id captureConnectionMock;
-@property(nonatomic, strong) RTCCameraVideoCapturer *capturer;
-@end
-
-@implementation RTCCameraVideoCapturerTests
-@synthesize delegateMock = _delegateMock;
-@synthesize captureConnectionMock = _captureConnectionMock;
-@synthesize capturer = _capturer;
-@synthesize deviceMock = _deviceMock;
-
-- (void)setup {
-  self.delegateMock = OCMProtocolMock(@protocol(RTCVideoCapturerDelegate));
-  self.captureConnectionMock = OCMClassMock([AVCaptureConnection class]);
-  self.capturer = [[RTCCameraVideoCapturer alloc] initWithDelegate:self.delegateMock];
-  self.deviceMock = [self createDeviceMock];
-}
-
-- (void)tearDown {
-  [self.delegateMock stopMocking];
-  [self.deviceMock stopMocking];
-  self.delegateMock = nil;
-  self.deviceMock = nil;
-  self.capturer = nil;
-}
-
-#pragma mark - utils
-
-- (id)createDeviceMock {
-  return OCMClassMock([AVCaptureDevice class]);
-}
-
-#pragma mark - test cases
-
-- (void)testSetupSession {
-  AVCaptureSession *session = self.capturer.captureSession;
-  EXPECT_TRUE(session != nil);
-
-#if TARGET_OS_IPHONE
-  EXPECT_EQ(session.sessionPreset, AVCaptureSessionPresetInputPriority);
-  EXPECT_EQ(session.usesApplicationAudioSession, NO);
-#endif
-  EXPECT_EQ(session.outputs.count, 1u);
-}
-
-- (void)testSetupSessionOutput {
-  AVCaptureVideoDataOutput *videoOutput = self.capturer.captureSession.outputs[0];
-  EXPECT_EQ(videoOutput.alwaysDiscardsLateVideoFrames, NO);
-  EXPECT_EQ(videoOutput.sampleBufferDelegate, self.capturer);
-}
-
-- (void)testSupportedFormatsForDevice {
-  // given
-  id validFormat1 = OCMClassMock([AVCaptureDeviceFormat class]);
-  CMVideoFormatDescriptionRef format;
-
-  // We don't care about width and heigth so arbitrary 123 and 456 values.
-  int width = 123;
-  int height = 456;
-  CMVideoFormatDescriptionCreate(nil, kCVPixelFormatType_420YpCbCr8PlanarFullRange, width, height,
-                                 nil, &format);
-  OCMStub([validFormat1 formatDescription]).andReturn(format);
-
-  id validFormat2 = OCMClassMock([AVCaptureDeviceFormat class]);
-  CMVideoFormatDescriptionCreate(nil, kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange, width,
-                                 height, nil, &format);
-  OCMStub([validFormat2 formatDescription]).andReturn(format);
-
-  id invalidFormat = OCMClassMock([AVCaptureDeviceFormat class]);
-  CMVideoFormatDescriptionCreate(nil, kCVPixelFormatType_422YpCbCr8_yuvs, width, height, nil,
-                                 &format);
-  OCMStub([invalidFormat formatDescription]).andReturn(format);
-
-  NSArray *formats = @[ validFormat1, validFormat2, invalidFormat ];
-  OCMStub([self.deviceMock formats]).andReturn(formats);
-
-  // when
-  NSArray *supportedFormats = [RTCCameraVideoCapturer supportedFormatsForDevice:self.deviceMock];
-
-  // then
-  EXPECT_EQ(supportedFormats.count, 2u);
-  EXPECT_TRUE([supportedFormats containsObject:validFormat1]);
-  EXPECT_TRUE([supportedFormats containsObject:validFormat2]);
-  // cleanup
-  [validFormat1 stopMocking];
-  [validFormat2 stopMocking];
-  [invalidFormat stopMocking];
-  validFormat1 = nil;
-  validFormat2 = nil;
-  invalidFormat = nil;
-}
-
-- (void)testCaptureDevices {
-  OCMStub([self.deviceMock devicesWithMediaType:AVMediaTypeVideo]).andReturn(@[ [NSObject new] ]);
-  OCMStub([self.deviceMock devicesWithMediaType:AVMediaTypeAudio]).andReturn(@[ [NSObject new] ]);
-
-  NSArray *captureDevices = [RTCCameraVideoCapturer captureDevices];
-
-  EXPECT_EQ(captureDevices.count, 1u);
-}
-
-- (void)testDelegateCallbackNotCalledWhenInvalidBuffer {
-  // given
-  CMSampleBufferRef sampleBuffer = nullptr;
-  [[self.delegateMock reject] capturer:[OCMArg any] didCaptureVideoFrame:[OCMArg any]];
-
-  // when
-  [self.capturer captureOutput:self.capturer.captureSession.outputs[0]
-         didOutputSampleBuffer:sampleBuffer
-                fromConnection:self.captureConnectionMock];
-
-  // then
-  [self.delegateMock verify];
-}
-
-
-- (void)testDelegateCallbackWithValidBufferAndOrientationUpdate {
-#if TARGET_OS_IPHONE
-  // given
-  UIDevice *currentDeviceMock = OCMClassMock([UIDevice class]);
-  // UpsideDown -> RTCVideoRotation_270.
-  OCMStub(currentDeviceMock.orientation).andReturn(UIDeviceOrientationPortraitUpsideDown);
-  id classMock = OCMClassMock([UIDevice class]);
-  OCMStub([classMock currentDevice]).andReturn(currentDeviceMock);
-
-  CMSampleBufferRef sampleBuffer = createTestSampleBufferRef();
-
-  // then
-  [[self.delegateMock expect] capturer:self.capturer
-                  didCaptureVideoFrame:[OCMArg checkWithBlock:^BOOL(RTCVideoFrame *expectedFrame) {
-                    EXPECT_EQ(expectedFrame.rotation, RTCVideoRotation_270);
-                    return YES;
-                  }]];
-
-  // when
-  NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
-  [center postNotificationName:UIDeviceOrientationDidChangeNotification object:nil];
-
-  // We need to wait for the dispatch to finish.
-  WAIT(0, 1000);
-
-  [self.capturer captureOutput:self.capturer.captureSession.outputs[0]
-         didOutputSampleBuffer:sampleBuffer
-                fromConnection:self.captureConnectionMock];
-
-  [self.delegateMock verify];
-
-  [(id)currentDeviceMock stopMocking];
-  currentDeviceMock = nil;
-  [classMock stopMocking];
-  classMock = nil;
-  CFRelease(sampleBuffer);
-#endif
-}
-
-- (void)testRotationCamera:(AVCaptureDevicePosition)camera
-           withOrientation:(UIDeviceOrientation)deviceOrientation {
-#if TARGET_OS_IPHONE
-  // Mock the AVCaptureConnection as we will get the camera position from the connection's
-  // input ports.
-  AVCaptureDeviceInput *inputPortMock = OCMClassMock([AVCaptureDeviceInput class]);
-  AVCaptureInputPort *captureInputPort = OCMClassMock([AVCaptureInputPort class]);
-  NSArray *inputPortsArrayMock = @[captureInputPort];
-  AVCaptureDevice *captureDeviceMock = OCMClassMock([AVCaptureDevice class]);
-  OCMStub(((AVCaptureConnection *)self.captureConnectionMock).inputPorts).
-      andReturn(inputPortsArrayMock);
-  OCMStub(captureInputPort.input).andReturn(inputPortMock);
-  OCMStub(inputPortMock.device).andReturn(captureDeviceMock);
-  OCMStub(captureDeviceMock.position).andReturn(camera);
-
-  // UpsideDown -> RTCVideoRotation_0.
-  UIDevice *currentDeviceMock = OCMClassMock([UIDevice class]);
-  OCMStub(currentDeviceMock.orientation).andReturn(deviceOrientation);
-  id classMock = OCMClassMock([UIDevice class]);
-  OCMStub([classMock currentDevice]).andReturn(currentDeviceMock);
-
-  CMSampleBufferRef sampleBuffer = createTestSampleBufferRef();
-
-  [[self.delegateMock expect] capturer:self.capturer
-                  didCaptureVideoFrame:[OCMArg checkWithBlock:^BOOL(RTCVideoFrame *expectedFrame) {
-    if (camera == AVCaptureDevicePositionFront) {
-      if (deviceOrientation == UIDeviceOrientationLandscapeLeft) {
-        EXPECT_EQ(expectedFrame.rotation, RTCVideoRotation_180);
-      } else if (deviceOrientation == UIDeviceOrientationLandscapeRight) {
-        EXPECT_EQ(expectedFrame.rotation, RTCVideoRotation_0);
-      }
-    } else if (camera == AVCaptureDevicePositionBack) {
-      if (deviceOrientation == UIDeviceOrientationLandscapeLeft) {
-        EXPECT_EQ(expectedFrame.rotation, RTCVideoRotation_0);
-      } else if (deviceOrientation == UIDeviceOrientationLandscapeRight) {
-        EXPECT_EQ(expectedFrame.rotation, RTCVideoRotation_180);
-      }
-    }
-    return YES;
-  }]];
-
-  NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
-  [center postNotificationName:UIDeviceOrientationDidChangeNotification object:nil];
-
-  // We need to wait for the dispatch to finish.
-  WAIT(0, 1000);
-
-  [self.capturer captureOutput:self.capturer.captureSession.outputs[0]
-         didOutputSampleBuffer:sampleBuffer
-                fromConnection:self.captureConnectionMock];
-
-  [self.delegateMock verify];
-
-  [(id)currentDeviceMock stopMocking];
-  currentDeviceMock = nil;
-  [classMock stopMocking];
-  classMock = nil;
-  CFRelease(sampleBuffer);
-#endif
-}
-
-- (void)setExif:(CMSampleBufferRef)sampleBuffer {
-  CFMutableDictionaryRef exif = CFDictionaryCreateMutable(kCFAllocatorDefault, 0, NULL, NULL);
-  CFDictionarySetValue(exif, CFSTR("LensModel"), CFSTR("iPhone SE back camera 4.15mm f/2.2"));
-  CMSetAttachment(sampleBuffer, CFSTR("{Exif}"), exif, kCMAttachmentMode_ShouldPropagate);
-}
-
-- (void)testRotationFrame {
-#if TARGET_OS_IPHONE
-  // Mock the AVCaptureConnection as we will get the camera position from the connection's
-  // input ports.
-  AVCaptureDeviceInput *inputPortMock = OCMClassMock([AVCaptureDeviceInput class]);
-  AVCaptureInputPort *captureInputPort = OCMClassMock([AVCaptureInputPort class]);
-  NSArray *inputPortsArrayMock = @[captureInputPort];
-  AVCaptureDevice *captureDeviceMock = OCMClassMock([AVCaptureDevice class]);
-  OCMStub(((AVCaptureConnection *)self.captureConnectionMock).inputPorts).
-      andReturn(inputPortsArrayMock);
-  OCMStub(captureInputPort.input).andReturn(inputPortMock);
-  OCMStub(inputPortMock.device).andReturn(captureDeviceMock);
-  OCMStub(captureDeviceMock.position).andReturn(AVCaptureDevicePositionFront);
-
-  // UpsideDown -> RTCVideoRotation_0.
-  UIDevice *currentDeviceMock = OCMClassMock([UIDevice class]);
-  OCMStub(currentDeviceMock.orientation).andReturn(UIDeviceOrientationLandscapeLeft);
-  id classMock = OCMClassMock([UIDevice class]);
-  OCMStub([classMock currentDevice]).andReturn(currentDeviceMock);
-
-  CMSampleBufferRef sampleBuffer = createTestSampleBufferRef();
-
-  [[self.delegateMock expect] capturer:self.capturer
-                  didCaptureVideoFrame:[OCMArg checkWithBlock:^BOOL(RTCVideoFrame *expectedFrame) {
-    // Front camera and landscape left should return 180. But the frame says its from the back
-    // camera, so rotation should be 0.
-    EXPECT_EQ(expectedFrame.rotation, RTCVideoRotation_0);
-    return YES;
-  }]];
-
-  NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
-  [center postNotificationName:UIDeviceOrientationDidChangeNotification object:nil];
-
-  // We need to wait for the dispatch to finish.
-  WAIT(0, 1000);
-
-  [self setExif:sampleBuffer];
-
-  [self.capturer captureOutput:self.capturer.captureSession.outputs[0]
-         didOutputSampleBuffer:sampleBuffer
-                fromConnection:self.captureConnectionMock];
-
-  [self.delegateMock verify];
-
-  [(id)currentDeviceMock stopMocking];
-  currentDeviceMock = nil;
-  [classMock stopMocking];
-  classMock = nil;
-  CFRelease(sampleBuffer);
-#endif
-}
-
-- (void)testImageExif {
-#if TARGET_OS_IPHONE
-  CMSampleBufferRef sampleBuffer = createTestSampleBufferRef();
-  [self setExif:sampleBuffer];
-
-  AVCaptureDevicePosition cameraPosition = [AVCaptureSession
-                                            devicePositionForSampleBuffer:sampleBuffer];
-  EXPECT_EQ(cameraPosition, AVCaptureDevicePositionBack);
-#endif
-}
-
-@end
-
-// TODO(kthelgason): Reenable these tests on simulator.
-// See bugs.webrtc.org/7813
-#if TARGET_IPHONE_SIMULATOR
-#define MAYBE_TEST(f, name) TEST(f, DISABLED_##name)
-#else
-#define MAYBE_TEST TEST
-#endif
-
-MAYBE_TEST(RTCCameraVideoCapturerTests, SetupSession) {
-  RTCCameraVideoCapturerTests *test = [[RTCCameraVideoCapturerTests alloc] init];
-  [test setup];
-  [test testSetupSession];
-  [test tearDown];
-}
-
-MAYBE_TEST(RTCCameraVideoCapturerTests, SetupSessionOutput) {
-  RTCCameraVideoCapturerTests *test = [[RTCCameraVideoCapturerTests alloc] init];
-  [test setup];
-  [test testSetupSessionOutput];
-  [test tearDown];
-}
-
-MAYBE_TEST(RTCCameraVideoCapturerTests, SupportedFormatsForDevice) {
-  RTCCameraVideoCapturerTests *test = [[RTCCameraVideoCapturerTests alloc] init];
-  [test setup];
-  [test testSupportedFormatsForDevice];
-  [test tearDown];
-}
-
-MAYBE_TEST(RTCCameraVideoCapturerTests, CaptureDevices) {
-  RTCCameraVideoCapturerTests *test = [[RTCCameraVideoCapturerTests alloc] init];
-  [test setup];
-  [test testCaptureDevices];
-  [test tearDown];
-}
-
-MAYBE_TEST(RTCCameraVideoCapturerTests, DelegateCallbackNotCalledWhenInvalidBuffer) {
-  RTCCameraVideoCapturerTests *test = [[RTCCameraVideoCapturerTests alloc] init];
-  [test setup];
-  [test testDelegateCallbackNotCalledWhenInvalidBuffer];
-  [test tearDown];
-}
-
-MAYBE_TEST(RTCCameraVideoCapturerTests, DelegateCallbackWithValidBufferAndOrientationUpdate) {
-  RTCCameraVideoCapturerTests *test = [[RTCCameraVideoCapturerTests alloc] init];
-  [test setup];
-  [test testDelegateCallbackWithValidBufferAndOrientationUpdate];
-  [test tearDown];
-}
-
-MAYBE_TEST(RTCCameraVideoCapturerTests, RotationCameraBackLandscapeLeft) {
-  RTCCameraVideoCapturerTests *test = [[RTCCameraVideoCapturerTests alloc] init];
-  [test setup];
-  [test testRotationCamera:AVCaptureDevicePositionBack
-           withOrientation:UIDeviceOrientationLandscapeLeft];
-  [test tearDown];
-}
-
-MAYBE_TEST(RTCCameraVideoCapturerTests, RotationCameraFrontLandscapeLeft) {
-  RTCCameraVideoCapturerTests *test = [[RTCCameraVideoCapturerTests alloc] init];
-  [test setup];
-  [test testRotationCamera:AVCaptureDevicePositionFront
-           withOrientation:UIDeviceOrientationLandscapeLeft];
-  [test tearDown];
-}
-
-MAYBE_TEST(RTCCameraVideoCapturerTests, RotationCameraBackLandscapeRight) {
-  RTCCameraVideoCapturerTests *test = [[RTCCameraVideoCapturerTests alloc] init];
-  [test setup];
-  [test testRotationCamera:AVCaptureDevicePositionBack
-           withOrientation:UIDeviceOrientationLandscapeRight];
-  [test tearDown];
-}
-
-MAYBE_TEST(RTCCameraVideoCapturerTests, RotationCameraFrontLandscapeRight) {
-  RTCCameraVideoCapturerTests *test = [[RTCCameraVideoCapturerTests alloc] init];
-  [test setup];
-  [test testRotationCamera:AVCaptureDevicePositionFront
-           withOrientation:UIDeviceOrientationLandscapeRight];
-  [test tearDown];
-}
-
-MAYBE_TEST(RTCCameraVideoCapturerTests, RotationCameraFrame) {
-  RTCCameraVideoCapturerTests *test = [[RTCCameraVideoCapturerTests alloc] init];
-  [test setup];
-  [test testRotationFrame];
-  [test tearDown];
-}
-
-MAYBE_TEST(RTCCameraVideoCapturerTests, ImageExif) {
-  RTCCameraVideoCapturerTests *test = [[RTCCameraVideoCapturerTests alloc] init];
-  [test setup];
-  [test testImageExif];
-  [test tearDown];
-}
diff --git a/sdk/objc/Framework/UnitTests/RTCConfigurationTest.mm b/sdk/objc/Framework/UnitTests/RTCConfigurationTest.mm
deleted file mode 100644
index 4b44fb1..0000000
--- a/sdk/objc/Framework/UnitTests/RTCConfigurationTest.mm
+++ /dev/null
@@ -1,144 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-#import <Foundation/Foundation.h>
-
-#include <vector>
-
-#include "webrtc/rtc_base/gunit.h"
-
-#import "NSString+StdString.h"
-#import "RTCConfiguration+Private.h"
-#import "WebRTC/RTCConfiguration.h"
-#import "WebRTC/RTCIceServer.h"
-#import "WebRTC/RTCIntervalRange.h"
-
-@interface RTCConfigurationTest : NSObject
-- (void)testConversionToNativeConfiguration;
-- (void)testNativeConversionToConfiguration;
-@end
-
-@implementation RTCConfigurationTest
-
-- (void)testConversionToNativeConfiguration {
-  NSArray *urlStrings = @[ @"stun:stun1.example.net" ];
-  RTCIceServer *server = [[RTCIceServer alloc] initWithURLStrings:urlStrings];
-  RTCIntervalRange *range = [[RTCIntervalRange alloc] initWithMin:0 max:100];
-
-  RTCConfiguration *config = [[RTCConfiguration alloc] init];
-  config.iceServers = @[ server ];
-  config.iceTransportPolicy = RTCIceTransportPolicyRelay;
-  config.bundlePolicy = RTCBundlePolicyMaxBundle;
-  config.rtcpMuxPolicy = RTCRtcpMuxPolicyNegotiate;
-  config.tcpCandidatePolicy = RTCTcpCandidatePolicyDisabled;
-  config.candidateNetworkPolicy = RTCCandidateNetworkPolicyLowCost;
-  const int maxPackets = 60;
-  const int timeout = 1;
-  const int interval = 2;
-  config.audioJitterBufferMaxPackets = maxPackets;
-  config.audioJitterBufferFastAccelerate = YES;
-  config.iceConnectionReceivingTimeout = timeout;
-  config.iceBackupCandidatePairPingInterval = interval;
-  config.continualGatheringPolicy =
-      RTCContinualGatheringPolicyGatherContinually;
-  config.shouldPruneTurnPorts = YES;
-  config.iceRegatherIntervalRange = range;
-
-  std::unique_ptr<webrtc::PeerConnectionInterface::RTCConfiguration>
-      nativeConfig([config createNativeConfiguration]);
-  EXPECT_TRUE(nativeConfig.get());
-  EXPECT_EQ(1u, nativeConfig->servers.size());
-  webrtc::PeerConnectionInterface::IceServer nativeServer =
-      nativeConfig->servers.front();
-  EXPECT_EQ(1u, nativeServer.urls.size());
-  EXPECT_EQ("stun:stun1.example.net", nativeServer.urls.front());
-
-  EXPECT_EQ(webrtc::PeerConnectionInterface::kRelay, nativeConfig->type);
-  EXPECT_EQ(webrtc::PeerConnectionInterface::kBundlePolicyMaxBundle,
-            nativeConfig->bundle_policy);
-  EXPECT_EQ(webrtc::PeerConnectionInterface::kRtcpMuxPolicyNegotiate,
-            nativeConfig->rtcp_mux_policy);
-  EXPECT_EQ(webrtc::PeerConnectionInterface::kTcpCandidatePolicyDisabled,
-            nativeConfig->tcp_candidate_policy);
-  EXPECT_EQ(webrtc::PeerConnectionInterface::kCandidateNetworkPolicyLowCost,
-            nativeConfig->candidate_network_policy);
-  EXPECT_EQ(maxPackets, nativeConfig->audio_jitter_buffer_max_packets);
-  EXPECT_EQ(true, nativeConfig->audio_jitter_buffer_fast_accelerate);
-  EXPECT_EQ(timeout, nativeConfig->ice_connection_receiving_timeout);
-  EXPECT_EQ(interval, nativeConfig->ice_backup_candidate_pair_ping_interval);
-  EXPECT_EQ(webrtc::PeerConnectionInterface::GATHER_CONTINUALLY,
-            nativeConfig->continual_gathering_policy);
-  EXPECT_EQ(true, nativeConfig->prune_turn_ports);
-  EXPECT_EQ(range.min, nativeConfig->ice_regather_interval_range->min());
-  EXPECT_EQ(range.max, nativeConfig->ice_regather_interval_range->max());
-}
-
-- (void)testNativeConversionToConfiguration {
-  NSArray *urlStrings = @[ @"stun:stun1.example.net" ];
-  RTCIceServer *server = [[RTCIceServer alloc] initWithURLStrings:urlStrings];
-  RTCIntervalRange *range = [[RTCIntervalRange alloc] initWithMin:0 max:100];
-
-  RTCConfiguration *config = [[RTCConfiguration alloc] init];
-  config.iceServers = @[ server ];
-  config.iceTransportPolicy = RTCIceTransportPolicyRelay;
-  config.bundlePolicy = RTCBundlePolicyMaxBundle;
-  config.rtcpMuxPolicy = RTCRtcpMuxPolicyNegotiate;
-  config.tcpCandidatePolicy = RTCTcpCandidatePolicyDisabled;
-  config.candidateNetworkPolicy = RTCCandidateNetworkPolicyLowCost;
-  const int maxPackets = 60;
-  const int timeout = 1;
-  const int interval = 2;
-  config.audioJitterBufferMaxPackets = maxPackets;
-  config.audioJitterBufferFastAccelerate = YES;
-  config.iceConnectionReceivingTimeout = timeout;
-  config.iceBackupCandidatePairPingInterval = interval;
-  config.continualGatheringPolicy =
-      RTCContinualGatheringPolicyGatherContinually;
-  config.shouldPruneTurnPorts = YES;
-  config.iceRegatherIntervalRange = range;
-
-  webrtc::PeerConnectionInterface::RTCConfiguration *nativeConfig =
-      [config createNativeConfiguration];
-  RTCConfiguration *newConfig = [[RTCConfiguration alloc]
-      initWithNativeConfiguration:*nativeConfig];
-  EXPECT_EQ([config.iceServers count], newConfig.iceServers.count);
-  RTCIceServer *newServer = newConfig.iceServers[0];
-  RTCIceServer *origServer = config.iceServers[0];
-  EXPECT_EQ(origServer.urlStrings.count, server.urlStrings.count);
-  std::string origUrl = origServer.urlStrings.firstObject.UTF8String;
-  std::string url = newServer.urlStrings.firstObject.UTF8String;
-  EXPECT_EQ(origUrl, url);
-
-  EXPECT_EQ(config.iceTransportPolicy, newConfig.iceTransportPolicy);
-  EXPECT_EQ(config.bundlePolicy, newConfig.bundlePolicy);
-  EXPECT_EQ(config.rtcpMuxPolicy, newConfig.rtcpMuxPolicy);
-  EXPECT_EQ(config.tcpCandidatePolicy, newConfig.tcpCandidatePolicy);
-  EXPECT_EQ(config.candidateNetworkPolicy, newConfig.candidateNetworkPolicy);
-  EXPECT_EQ(config.audioJitterBufferMaxPackets, newConfig.audioJitterBufferMaxPackets);
-  EXPECT_EQ(config.audioJitterBufferFastAccelerate, newConfig.audioJitterBufferFastAccelerate);
-  EXPECT_EQ(config.iceConnectionReceivingTimeout, newConfig.iceConnectionReceivingTimeout);
-  EXPECT_EQ(config.iceBackupCandidatePairPingInterval,
-            newConfig.iceBackupCandidatePairPingInterval);
-  EXPECT_EQ(config.continualGatheringPolicy, newConfig.continualGatheringPolicy);
-  EXPECT_EQ(config.shouldPruneTurnPorts, newConfig.shouldPruneTurnPorts);
-  EXPECT_EQ(config.iceRegatherIntervalRange.min, newConfig.iceRegatherIntervalRange.min);
-  EXPECT_EQ(config.iceRegatherIntervalRange.max, newConfig.iceRegatherIntervalRange.max);
-}
-
-@end
-
-TEST(RTCConfigurationTest, NativeConfigurationConversionTest) {
-  @autoreleasepool {
-    RTCConfigurationTest *test = [[RTCConfigurationTest alloc] init];
-    [test testConversionToNativeConfiguration];
-    [test testNativeConversionToConfiguration];
-  }
-}
-
diff --git a/sdk/objc/Framework/UnitTests/RTCDataChannelConfigurationTest.mm b/sdk/objc/Framework/UnitTests/RTCDataChannelConfigurationTest.mm
deleted file mode 100644
index ec8ecaa..0000000
--- a/sdk/objc/Framework/UnitTests/RTCDataChannelConfigurationTest.mm
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-#import <Foundation/Foundation.h>
-
-#include "webrtc/rtc_base/gunit.h"
-
-#import "NSString+StdString.h"
-#import "RTCDataChannelConfiguration+Private.h"
-#import "WebRTC/RTCDataChannelConfiguration.h"
-
-@interface RTCDataChannelConfigurationTest : NSObject
-- (void)testConversionToNativeDataChannelInit;
-@end
-
-@implementation RTCDataChannelConfigurationTest
-
-- (void)testConversionToNativeDataChannelInit {
-  BOOL isOrdered = NO;
-  int maxPacketLifeTime = 5;
-  int maxRetransmits = 4;
-  BOOL isNegotiated = YES;
-  int channelId = 4;
-  NSString *protocol = @"protocol";
-
-  RTCDataChannelConfiguration *dataChannelConfig =
-      [[RTCDataChannelConfiguration alloc] init];
-  dataChannelConfig.isOrdered = isOrdered;
-  dataChannelConfig.maxPacketLifeTime = maxPacketLifeTime;
-  dataChannelConfig.maxRetransmits = maxRetransmits;
-  dataChannelConfig.isNegotiated = isNegotiated;
-  dataChannelConfig.channelId = channelId;
-  dataChannelConfig.protocol = protocol;
-
-  webrtc::DataChannelInit nativeInit = dataChannelConfig.nativeDataChannelInit;
-  EXPECT_EQ(isOrdered, nativeInit.ordered);
-  EXPECT_EQ(maxPacketLifeTime, nativeInit.maxRetransmitTime);
-  EXPECT_EQ(maxRetransmits, nativeInit.maxRetransmits);
-  EXPECT_EQ(isNegotiated, nativeInit.negotiated);
-  EXPECT_EQ(channelId, nativeInit.id);
-  EXPECT_EQ(protocol.stdString, nativeInit.protocol);
-}
-
-@end
-
-TEST(RTCDataChannelConfiguration, NativeDataChannelInitConversionTest) {
-  @autoreleasepool {
-    RTCDataChannelConfigurationTest *test =
-        [[RTCDataChannelConfigurationTest alloc] init];
-    [test testConversionToNativeDataChannelInit];
-  }
-}
diff --git a/sdk/objc/Framework/UnitTests/RTCIceCandidateTest.mm b/sdk/objc/Framework/UnitTests/RTCIceCandidateTest.mm
deleted file mode 100644
index 9f0eb59..0000000
--- a/sdk/objc/Framework/UnitTests/RTCIceCandidateTest.mm
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-#import <Foundation/Foundation.h>
-
-#include <memory>
-
-#include "webrtc/rtc_base/gunit.h"
-
-#import "NSString+StdString.h"
-#import "RTCIceCandidate+Private.h"
-#import "WebRTC/RTCIceCandidate.h"
-
-@interface RTCIceCandidateTest : NSObject
-- (void)testCandidate;
-- (void)testInitFromNativeCandidate;
-@end
-
-@implementation RTCIceCandidateTest
-
-- (void)testCandidate {
-  NSString *sdp = @"candidate:4025901590 1 udp 2122265343 "
-                   "fdff:2642:12a6:fe38:c001:beda:fcf9:51aa "
-                   "59052 typ host generation 0";
-
-  RTCIceCandidate *candidate = [[RTCIceCandidate alloc] initWithSdp:sdp
-                                                      sdpMLineIndex:0
-                                                             sdpMid:@"audio"];
-
-  std::unique_ptr<webrtc::IceCandidateInterface> nativeCandidate =
-      candidate.nativeCandidate;
-  EXPECT_EQ("audio", nativeCandidate->sdp_mid());
-  EXPECT_EQ(0, nativeCandidate->sdp_mline_index());
-
-  std::string sdpString;
-  nativeCandidate->ToString(&sdpString);
-  EXPECT_EQ(sdp.stdString, sdpString);
-}
-
-- (void)testInitFromNativeCandidate {
-  std::string sdp("candidate:4025901590 1 udp 2122265343 "
-                  "fdff:2642:12a6:fe38:c001:beda:fcf9:51aa "
-                  "59052 typ host generation 0");
-  webrtc::IceCandidateInterface *nativeCandidate =
-      webrtc::CreateIceCandidate("audio", 0, sdp, nullptr);
-
-  RTCIceCandidate *iceCandidate =
-      [[RTCIceCandidate alloc] initWithNativeCandidate:nativeCandidate];
-  EXPECT_TRUE([@"audio" isEqualToString:iceCandidate.sdpMid]);
-  EXPECT_EQ(0, iceCandidate.sdpMLineIndex);
-
-  EXPECT_EQ(sdp, iceCandidate.sdp.stdString);
-}
-
-@end
-
-TEST(RTCIceCandidateTest, CandidateTest) {
-  @autoreleasepool {
-    RTCIceCandidateTest *test = [[RTCIceCandidateTest alloc] init];
-    [test testCandidate];
-  }
-}
-
-TEST(RTCIceCandidateTest, InitFromCandidateTest) {
-  @autoreleasepool {
-    RTCIceCandidateTest *test = [[RTCIceCandidateTest alloc] init];
-    [test testInitFromNativeCandidate];
-  }
-}
diff --git a/sdk/objc/Framework/UnitTests/RTCIceServerTest.mm b/sdk/objc/Framework/UnitTests/RTCIceServerTest.mm
deleted file mode 100644
index 669ede6..0000000
--- a/sdk/objc/Framework/UnitTests/RTCIceServerTest.mm
+++ /dev/null
@@ -1,171 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-#import <Foundation/Foundation.h>
-
-#include <vector>
-
-#include "webrtc/rtc_base/gunit.h"
-
-#import "NSString+StdString.h"
-#import "RTCIceServer+Private.h"
-#import "WebRTC/RTCIceServer.h"
-
-@interface RTCIceServerTest : NSObject
-- (void)testOneURLServer;
-- (void)testTwoURLServer;
-- (void)testPasswordCredential;
-- (void)testInitFromNativeServer;
-@end
-
-@implementation RTCIceServerTest
-
-- (void)testOneURLServer {
-  RTCIceServer *server = [[RTCIceServer alloc] initWithURLStrings:@[
-      @"stun:stun1.example.net" ]];
-
-  webrtc::PeerConnectionInterface::IceServer iceStruct = server.nativeServer;
-  EXPECT_EQ(1u, iceStruct.urls.size());
-  EXPECT_EQ("stun:stun1.example.net", iceStruct.urls.front());
-  EXPECT_EQ("", iceStruct.username);
-  EXPECT_EQ("", iceStruct.password);
-}
-
-- (void)testTwoURLServer {
-  RTCIceServer *server = [[RTCIceServer alloc] initWithURLStrings:@[
-      @"turn1:turn1.example.net", @"turn2:turn2.example.net" ]];
-
-  webrtc::PeerConnectionInterface::IceServer iceStruct = server.nativeServer;
-  EXPECT_EQ(2u, iceStruct.urls.size());
-  EXPECT_EQ("turn1:turn1.example.net", iceStruct.urls.front());
-  EXPECT_EQ("turn2:turn2.example.net", iceStruct.urls.back());
-  EXPECT_EQ("", iceStruct.username);
-  EXPECT_EQ("", iceStruct.password);
-}
-
-- (void)testPasswordCredential {
-  RTCIceServer *server = [[RTCIceServer alloc]
-      initWithURLStrings:@[ @"turn1:turn1.example.net" ]
-                username:@"username"
-              credential:@"credential"];
-  webrtc::PeerConnectionInterface::IceServer iceStruct = server.nativeServer;
-  EXPECT_EQ(1u, iceStruct.urls.size());
-  EXPECT_EQ("turn1:turn1.example.net", iceStruct.urls.front());
-  EXPECT_EQ("username", iceStruct.username);
-  EXPECT_EQ("credential", iceStruct.password);
-}
-
-- (void)testHostname {
-  RTCIceServer *server = [[RTCIceServer alloc] initWithURLStrings:@[ @"turn1:turn1.example.net" ]
-                                                         username:@"username"
-                                                       credential:@"credential"
-                                                    tlsCertPolicy:RTCTlsCertPolicySecure
-                                                         hostname:@"hostname"];
-  webrtc::PeerConnectionInterface::IceServer iceStruct = server.nativeServer;
-  EXPECT_EQ(1u, iceStruct.urls.size());
-  EXPECT_EQ("turn1:turn1.example.net", iceStruct.urls.front());
-  EXPECT_EQ("username", iceStruct.username);
-  EXPECT_EQ("credential", iceStruct.password);
-  EXPECT_EQ("hostname", iceStruct.hostname);
-}
-
-- (void)testTlsAlpnProtocols {
-  RTCIceServer *server = [[RTCIceServer alloc] initWithURLStrings:@[ @"turn1:turn1.example.net" ]
-                                                         username:@"username"
-                                                       credential:@"credential"
-                                                    tlsCertPolicy:RTCTlsCertPolicySecure
-                                                         hostname:@"hostname"
-                                                 tlsAlpnProtocols:@[ @"proto1", @"proto2" ]];
-  webrtc::PeerConnectionInterface::IceServer iceStruct = server.nativeServer;
-  EXPECT_EQ(1u, iceStruct.urls.size());
-  EXPECT_EQ("turn1:turn1.example.net", iceStruct.urls.front());
-  EXPECT_EQ("username", iceStruct.username);
-  EXPECT_EQ("credential", iceStruct.password);
-  EXPECT_EQ("hostname", iceStruct.hostname);
-  EXPECT_EQ(2u, iceStruct.tls_alpn_protocols.size());
-}
-
-- (void)testTlsEllipticCurves {
-  RTCIceServer *server = [[RTCIceServer alloc] initWithURLStrings:@[ @"turn1:turn1.example.net" ]
-                                                         username:@"username"
-                                                       credential:@"credential"
-                                                    tlsCertPolicy:RTCTlsCertPolicySecure
-                                                         hostname:@"hostname"
-                                                 tlsAlpnProtocols:@[ @"proto1", @"proto2" ]
-                                                tlsEllipticCurves:@[ @"curve1", @"curve2" ]];
-  webrtc::PeerConnectionInterface::IceServer iceStruct = server.nativeServer;
-  EXPECT_EQ(1u, iceStruct.urls.size());
-  EXPECT_EQ("turn1:turn1.example.net", iceStruct.urls.front());
-  EXPECT_EQ("username", iceStruct.username);
-  EXPECT_EQ("credential", iceStruct.password);
-  EXPECT_EQ("hostname", iceStruct.hostname);
-  EXPECT_EQ(2u, iceStruct.tls_alpn_protocols.size());
-  EXPECT_EQ(2u, iceStruct.tls_elliptic_curves.size());
-}
-
-- (void)testInitFromNativeServer {
-  webrtc::PeerConnectionInterface::IceServer nativeServer;
-  nativeServer.username = "username";
-  nativeServer.password = "password";
-  nativeServer.urls.push_back("stun:stun.example.net");
-  nativeServer.hostname = "hostname";
-  nativeServer.tls_alpn_protocols.push_back("proto1");
-  nativeServer.tls_alpn_protocols.push_back("proto2");
-  nativeServer.tls_elliptic_curves.push_back("curve1");
-  nativeServer.tls_elliptic_curves.push_back("curve2");
-
-  RTCIceServer *iceServer =
-      [[RTCIceServer alloc] initWithNativeServer:nativeServer];
-  EXPECT_EQ(1u, iceServer.urlStrings.count);
-  EXPECT_EQ("stun:stun.example.net",
-      [NSString stdStringForString:iceServer.urlStrings.firstObject]);
-  EXPECT_EQ("username", [NSString stdStringForString:iceServer.username]);
-  EXPECT_EQ("password", [NSString stdStringForString:iceServer.credential]);
-  EXPECT_EQ("hostname", [NSString stdStringForString:iceServer.hostname]);
-  EXPECT_EQ(2u, iceServer.tlsAlpnProtocols.count);
-  EXPECT_EQ(2u, iceServer.tlsEllipticCurves.count);
-}
-
-@end
-
-TEST(RTCIceServerTest, OneURLTest) {
-  @autoreleasepool {
-    RTCIceServerTest *test = [[RTCIceServerTest alloc] init];
-    [test testOneURLServer];
-  }
-}
-
-TEST(RTCIceServerTest, TwoURLTest) {
-  @autoreleasepool {
-    RTCIceServerTest *test = [[RTCIceServerTest alloc] init];
-    [test testTwoURLServer];
-  }
-}
-
-TEST(RTCIceServerTest, PasswordCredentialTest) {
-  @autoreleasepool {
-    RTCIceServerTest *test = [[RTCIceServerTest alloc] init];
-    [test testPasswordCredential];
-  }
-}
-
-TEST(RTCIceServerTest, HostnameTest) {
-  @autoreleasepool {
-    RTCIceServerTest *test = [[RTCIceServerTest alloc] init];
-    [test testHostname];
-  }
-}
-
-TEST(RTCIceServerTest, InitFromNativeServerTest) {
-  @autoreleasepool {
-    RTCIceServerTest *test = [[RTCIceServerTest alloc] init];
-    [test testInitFromNativeServer];
-  }
-}
diff --git a/sdk/objc/Framework/UnitTests/RTCIntervalRangeTests.mm b/sdk/objc/Framework/UnitTests/RTCIntervalRangeTests.mm
deleted file mode 100644
index b995221..0000000
--- a/sdk/objc/Framework/UnitTests/RTCIntervalRangeTests.mm
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- *  Copyright 2017 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.
- */
-
-#import <Foundation/Foundation.h>
-
-#include "webrtc/rtc_base/gunit.h"
-
-#import "RTCIntervalRange+Private.h"
-#import "WebRTC/RTCIntervalRange.h"
-
-@interface RTCIntervalRangeTest : NSObject
-- (void)testConversionToNativeConfiguration;
-- (void)testNativeConversionToConfiguration;
-@end
-
-@implementation RTCIntervalRangeTest
-
-- (void)testConversionToNativeConfiguration {
-  NSInteger min = 0;
-  NSInteger max = 100;
-  RTCIntervalRange *range = [[RTCIntervalRange alloc] initWithMin:min max:max];
-  EXPECT_EQ(min, range.min);
-  EXPECT_EQ(max, range.max);
-  std::unique_ptr<rtc::IntervalRange> nativeRange = range.nativeIntervalRange;
-  EXPECT_EQ(min, nativeRange->min());
-  EXPECT_EQ(max, nativeRange->max());
-}
-
-- (void)testNativeConversionToConfiguration {
-  NSInteger min = 0;
-  NSInteger max = 100;
-  rtc::IntervalRange nativeRange((int)min, (int)max);
-  RTCIntervalRange *range =
-      [[RTCIntervalRange alloc] initWithNativeIntervalRange:nativeRange];
-  EXPECT_EQ(min, range.min);
-  EXPECT_EQ(max, range.max);
-}
-
-@end
-
-TEST(RTCIntervalRangeTest, NativeConfigurationConversionTest) {
-  @autoreleasepool {
-    RTCIntervalRangeTest *test = [[RTCIntervalRangeTest alloc] init];
-    [test testConversionToNativeConfiguration];
-    [test testNativeConversionToConfiguration];
-  }
-}
diff --git a/sdk/objc/Framework/UnitTests/RTCMTLVideoViewTests.mm b/sdk/objc/Framework/UnitTests/RTCMTLVideoViewTests.mm
deleted file mode 100644
index a978498..0000000
--- a/sdk/objc/Framework/UnitTests/RTCMTLVideoViewTests.mm
+++ /dev/null
@@ -1,196 +0,0 @@
-/*
- *  Copyright 2017 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.
- */
-
-#import <Foundation/Foundation.h>
-#import <OCMock/OCMock.h>
-
-#include "webrtc/rtc_base/gunit.h"
-
-#include <Metal/RTCMTLNV12Renderer.h>
-#include <WebRTC/RTCMTLVideoView.h>
-#include <WebRTC/RTCVideoFrameBuffer.h>
-
-// Extension of RTCMTLVideoView for testing purposes.
-@interface RTCMTLVideoView (Testing)
-
-+ (BOOL)isMetalAvailable;
-+ (UIView*)createMetalView:(CGRect)frame;
-+ (id<RTCMTLRenderer>)createNV12Renderer;
-+ (id<RTCMTLRenderer>)createI420Renderer;
-- (void)drawInMTKView:(id)view;
-@end
-
-@interface RTCMTLVideoViewTests : NSObject
-@property(nonatomic, strong) id classMock;
-@property(nonatomic, strong) id metalViewMock;
-@property(nonatomic, strong) id rendererNV12Mock;
-@property(nonatomic, strong) id rendererI420Mock;
-@property(nonatomic, strong) id frameMock;
-@end
-
-@implementation RTCMTLVideoViewTests
-
-@synthesize classMock = _classMock;
-@synthesize metalViewMock = _metalViewMock;
-@synthesize rendererNV12Mock = _rendererNV12Mock;
-@synthesize rendererI420Mock = _rendererI420Mock;
-@synthesize frameMock = _frameMock;
-
-- (void)setup {
-  self.classMock = OCMClassMock([RTCMTLVideoView class]);
-}
-
-- (void)tearDown {
-  [self.classMock stopMocking];
-  [self.rendererI420Mock stopMocking];
-  [self.rendererNV12Mock stopMocking];
-  [self.metalViewMock stopMocking];
-  [self.frameMock stopMocking];
-  self.classMock = nil;
-  self.rendererI420Mock = nil;
-  self.rendererNV12Mock = nil;
-  self.metalViewMock = nil;
-  self.frameMock = nil;
-}
-
-- (id)frameMockWithCVPixelBuffer:(BOOL)hasCVPixelBuffer {
-  id frameMock = OCMClassMock([RTCVideoFrame class]);
-  if (hasCVPixelBuffer) {
-    CVPixelBufferRef pixelBufferRef;
-    CVPixelBufferCreate(kCFAllocatorDefault,
-                        200,
-                        200,
-                        kCVPixelFormatType_420YpCbCr8Planar,
-                        nullptr,
-                        &pixelBufferRef);
-    OCMStub([frameMock buffer])
-        .andReturn([[RTCCVPixelBuffer alloc] initWithPixelBuffer:pixelBufferRef]);
-  } else {
-    OCMStub([frameMock buffer]).andReturn([[RTCI420Buffer alloc] initWithWidth:200 height:200]);
-  }
-  return frameMock;
-}
-
-- (id)rendererMockWithSuccessfulSetup:(BOOL)sucess {
-  id rendererMock = OCMProtocolMock(@protocol(RTCMTLRenderer));
-  OCMStub([rendererMock addRenderingDestination:[OCMArg any]]).andReturn(sucess);
-
-  return rendererMock;
-}
-
-#pragma mark - Test cases
-- (void)testInitAssertsIfMetalUnavailabe {
-  // given
-  OCMStub([self.classMock isMetalAvailable]).andReturn(NO);
-
-  // when
-  BOOL asserts = NO;
-  @try {
-    RTCMTLVideoView *realView = [[RTCMTLVideoView alloc] initWithFrame:CGRectZero];
-    (void)realView;
-  } @catch (NSException *ex) {
-    asserts = YES;
-  }
-
-  EXPECT_TRUE(asserts);
-}
-
-- (void)testRTCVideoRenderNilFrameCallback {
-  // given
-  OCMStub([self.classMock isMetalAvailable]).andReturn(YES);
-  RTCMTLVideoView *realView = [[RTCMTLVideoView alloc] init];
-  self.frameMock = OCMClassMock([RTCVideoFrame class]);
-
-  [[self.frameMock reject] buffer];
-  [[self.classMock reject] createNV12Renderer];
-  [[self.classMock reject] createI420Renderer];
-
-  // when
-  [realView renderFrame:nil];
-  [realView drawInMTKView:self.metalViewMock];
-
-  // then
-  [self.frameMock verify];
-  [self.classMock verify];
-}
-
-- (void)testRTCVideoRenderFrameCallbackI420 {
-  // given
-  OCMStub([self.classMock isMetalAvailable]).andReturn(YES);
-  self.rendererI420Mock = [self rendererMockWithSuccessfulSetup:YES];
-  self.frameMock = [self frameMockWithCVPixelBuffer:NO];
-
-  OCMExpect([self.rendererI420Mock drawFrame:self.frameMock]);
-  OCMExpect([self.classMock createI420Renderer]).andReturn(self.rendererI420Mock);
-  [[self.classMock reject] createNV12Renderer];
-
-  RTCMTLVideoView *realView = [[RTCMTLVideoView alloc] init];
-
-  // when
-  [realView renderFrame:self.frameMock];
-  [realView drawInMTKView:self.metalViewMock];
-
-  // then
-  [self.rendererI420Mock verify];
-  [self.classMock verify];
-}
-
-- (void)testRTCVideoRenderFrameCallbackNV12 {
-  // given
-  OCMStub([self.classMock isMetalAvailable]).andReturn(YES);
-  self.rendererNV12Mock = [self rendererMockWithSuccessfulSetup:YES];
-  self.frameMock = [self frameMockWithCVPixelBuffer:YES];
-
-  OCMExpect([self.rendererNV12Mock drawFrame:self.frameMock]);
-  OCMExpect([self.classMock createNV12Renderer]).andReturn(self.rendererNV12Mock);
-  [[self.classMock reject] createI420Renderer];
-
-  RTCMTLVideoView *realView = [[RTCMTLVideoView alloc] init];
-
-  // when
-  [realView renderFrame:self.frameMock];
-  [realView drawInMTKView:self.metalViewMock];
-
-  // then
-  [self.rendererNV12Mock verify];
-  [self.classMock verify];
-}
-@end
-
-TEST(RTCMTLVideoViewTests, InitAssertsIfMetalUnavailabe) {
-  RTCMTLVideoViewTests *test = [[RTCMTLVideoViewTests alloc] init];
-  [test setup];
-
-  [test testInitAssertsIfMetalUnavailabe];
-  [test tearDown];
-}
-
-TEST(RTCMTLVideoViewTests, RTCVideoRenderNilFrameCallback) {
-  RTCMTLVideoViewTests *test = [[RTCMTLVideoViewTests alloc] init];
-  [test setup];
-  [test testRTCVideoRenderNilFrameCallback];
-  [test tearDown];
-}
-
-TEST(RTCMTLVideoViewTests, RTCVideoRenderFrameCallbackI420) {
-  RTCMTLVideoViewTests *test = [[RTCMTLVideoViewTests alloc] init];
-  [test setup];
-
-  [test testRTCVideoRenderFrameCallbackI420];
-  [test tearDown];
-}
-
-TEST(RTCMTLVideoViewTests, RTCVideoRenderFrameCallbackNV12) {
-  RTCMTLVideoViewTests *test = [[RTCMTLVideoViewTests alloc] init];
-  [test setup];
-
-  [test testRTCVideoRenderFrameCallbackNV12];
-  [test tearDown];
-}
diff --git a/sdk/objc/Framework/UnitTests/RTCMediaConstraintsTest.mm b/sdk/objc/Framework/UnitTests/RTCMediaConstraintsTest.mm
deleted file mode 100644
index 095e031..0000000
--- a/sdk/objc/Framework/UnitTests/RTCMediaConstraintsTest.mm
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-#import <Foundation/Foundation.h>
-
-#include <memory>
-
-#include "webrtc/rtc_base/gunit.h"
-
-#import "NSString+StdString.h"
-#import "RTCMediaConstraints+Private.h"
-#import "WebRTC/RTCMediaConstraints.h"
-
-@interface RTCMediaConstraintsTest : NSObject
-- (void)testMediaConstraints;
-@end
-
-@implementation RTCMediaConstraintsTest
-
-- (void)testMediaConstraints {
-  NSDictionary *mandatory = @{@"key1": @"value1", @"key2": @"value2"};
-  NSDictionary *optional = @{@"key3": @"value3", @"key4": @"value4"};
-
-  RTCMediaConstraints *constraints = [[RTCMediaConstraints alloc]
-      initWithMandatoryConstraints:mandatory
-               optionalConstraints:optional];
-  std::unique_ptr<webrtc::MediaConstraints> nativeConstraints =
-      [constraints nativeConstraints];
-
-  webrtc::MediaConstraintsInterface::Constraints nativeMandatory =
-      nativeConstraints->GetMandatory();
-  [self expectConstraints:mandatory inNativeConstraints:nativeMandatory];
-
-  webrtc::MediaConstraintsInterface::Constraints nativeOptional =
-      nativeConstraints->GetOptional();
-  [self expectConstraints:optional inNativeConstraints:nativeOptional];
-}
-
-- (void)expectConstraints:(NSDictionary *)constraints
-      inNativeConstraints:
-    (webrtc::MediaConstraintsInterface::Constraints)nativeConstraints {
-  EXPECT_EQ(constraints.count, nativeConstraints.size());
-
-  for (NSString *key in constraints) {
-    NSString *value = [constraints objectForKey:key];
-
-    std::string nativeValue;
-    bool found = nativeConstraints.FindFirst(key.stdString, &nativeValue);
-    EXPECT_TRUE(found);
-    EXPECT_EQ(value.stdString, nativeValue);
-  }
-}
-
-@end
-
-TEST(RTCMediaConstraintsTest, MediaConstraintsTest) {
-  @autoreleasepool {
-    RTCMediaConstraintsTest *test = [[RTCMediaConstraintsTest alloc] init];
-    [test testMediaConstraints];
-  }
-}
diff --git a/sdk/objc/Framework/UnitTests/RTCPeerConnectionTest.mm b/sdk/objc/Framework/UnitTests/RTCPeerConnectionTest.mm
deleted file mode 100644
index bf3fc33..0000000
--- a/sdk/objc/Framework/UnitTests/RTCPeerConnectionTest.mm
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-#import <Foundation/Foundation.h>
-
-#include <vector>
-
-#include "webrtc/rtc_base/gunit.h"
-
-#import "NSString+StdString.h"
-#import "RTCConfiguration+Private.h"
-#import "WebRTC/RTCConfiguration.h"
-#import "WebRTC/RTCPeerConnection.h"
-#import "WebRTC/RTCPeerConnectionFactory.h"
-#import "WebRTC/RTCIceServer.h"
-#import "WebRTC/RTCMediaConstraints.h"
-
-@interface RTCPeerConnectionTest : NSObject
-- (void)testConfigurationGetter;
-@end
-
-@implementation RTCPeerConnectionTest
-
-- (void)testConfigurationGetter {
-  NSArray *urlStrings = @[ @"stun:stun1.example.net" ];
-  RTCIceServer *server = [[RTCIceServer alloc] initWithURLStrings:urlStrings];
-
-  RTCConfiguration *config = [[RTCConfiguration alloc] init];
-  config.iceServers = @[ server ];
-  config.iceTransportPolicy = RTCIceTransportPolicyRelay;
-  config.bundlePolicy = RTCBundlePolicyMaxBundle;
-  config.rtcpMuxPolicy = RTCRtcpMuxPolicyNegotiate;
-  config.tcpCandidatePolicy = RTCTcpCandidatePolicyDisabled;
-  config.candidateNetworkPolicy = RTCCandidateNetworkPolicyLowCost;
-  const int maxPackets = 60;
-  const int timeout = 1;
-  const int interval = 2;
-  config.audioJitterBufferMaxPackets = maxPackets;
-  config.audioJitterBufferFastAccelerate = YES;
-  config.iceConnectionReceivingTimeout = timeout;
-  config.iceBackupCandidatePairPingInterval = interval;
-  config.continualGatheringPolicy =
-      RTCContinualGatheringPolicyGatherContinually;
-  config.shouldPruneTurnPorts = YES;
-
-  RTCMediaConstraints *contraints = [[RTCMediaConstraints alloc] initWithMandatoryConstraints:@{}
-      optionalConstraints:nil];
-  RTCPeerConnectionFactory *factory = [[RTCPeerConnectionFactory alloc] init];
-
-  RTCConfiguration *newConfig;
-  @autoreleasepool {
-    RTCPeerConnection *peerConnection =
-        [factory peerConnectionWithConfiguration:config constraints:contraints delegate:nil];
-    newConfig = peerConnection.configuration;
-
-    EXPECT_TRUE([peerConnection setBweMinBitrateBps:[NSNumber numberWithInt:100000]
-                                  currentBitrateBps:[NSNumber numberWithInt:5000000]
-                                      maxBitrateBps:[NSNumber numberWithInt:500000000]]);
-    EXPECT_FALSE([peerConnection setBweMinBitrateBps:[NSNumber numberWithInt:2]
-                                   currentBitrateBps:[NSNumber numberWithInt:1]
-                                       maxBitrateBps:nil]);
-  }
-
-  EXPECT_EQ([config.iceServers count], [newConfig.iceServers count]);
-  RTCIceServer *newServer = newConfig.iceServers[0];
-  RTCIceServer *origServer = config.iceServers[0];
-  std::string origUrl = origServer.urlStrings.firstObject.UTF8String;
-  std::string url = newServer.urlStrings.firstObject.UTF8String;
-  EXPECT_EQ(origUrl, url);
-
-  EXPECT_EQ(config.iceTransportPolicy, newConfig.iceTransportPolicy);
-  EXPECT_EQ(config.bundlePolicy, newConfig.bundlePolicy);
-  EXPECT_EQ(config.rtcpMuxPolicy, newConfig.rtcpMuxPolicy);
-  EXPECT_EQ(config.tcpCandidatePolicy, newConfig.tcpCandidatePolicy);
-  EXPECT_EQ(config.candidateNetworkPolicy, newConfig.candidateNetworkPolicy);
-  EXPECT_EQ(config.audioJitterBufferMaxPackets, newConfig.audioJitterBufferMaxPackets);
-  EXPECT_EQ(config.audioJitterBufferFastAccelerate, newConfig.audioJitterBufferFastAccelerate);
-  EXPECT_EQ(config.iceConnectionReceivingTimeout, newConfig.iceConnectionReceivingTimeout);
-  EXPECT_EQ(config.iceBackupCandidatePairPingInterval,
-            newConfig.iceBackupCandidatePairPingInterval);
-  EXPECT_EQ(config.continualGatheringPolicy, newConfig.continualGatheringPolicy);
-  EXPECT_EQ(config.shouldPruneTurnPorts, newConfig.shouldPruneTurnPorts);
-}
-
-@end
-
-TEST(RTCPeerConnectionTest, ConfigurationGetterTest) {
-  @autoreleasepool {
-    RTCPeerConnectionTest *test = [[RTCPeerConnectionTest alloc] init];
-    [test testConfigurationGetter];
-  }
-}
-
-
diff --git a/sdk/objc/Framework/UnitTests/RTCSessionDescriptionTest.mm b/sdk/objc/Framework/UnitTests/RTCSessionDescriptionTest.mm
deleted file mode 100644
index a6b9f8a..0000000
--- a/sdk/objc/Framework/UnitTests/RTCSessionDescriptionTest.mm
+++ /dev/null
@@ -1,144 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-#import <Foundation/Foundation.h>
-
-#include "webrtc/rtc_base/gunit.h"
-
-#import "NSString+StdString.h"
-#import "RTCSessionDescription+Private.h"
-#import "WebRTC/RTCSessionDescription.h"
-
-@interface RTCSessionDescriptionTest : NSObject
-- (void)testSessionDescriptionConversion;
-- (void)testInitFromNativeSessionDescription;
-@end
-
-@implementation RTCSessionDescriptionTest
-
-/**
- * Test conversion of an Objective-C RTCSessionDescription to a native
- * SessionDescriptionInterface (based on the types and SDP strings being equal).
- */
-- (void)testSessionDescriptionConversion {
-  RTCSessionDescription *description =
-      [[RTCSessionDescription alloc] initWithType:RTCSdpTypeAnswer
-                                              sdp:[self sdp]];
-
-  webrtc::SessionDescriptionInterface *nativeDescription =
-      description.nativeDescription;
-
-  EXPECT_EQ(RTCSdpTypeAnswer,
-      [RTCSessionDescription typeForStdString:nativeDescription->type()]);
-
-  std::string sdp;
-  nativeDescription->ToString(&sdp);
-  EXPECT_EQ([self sdp].stdString, sdp);
-}
-
-- (void)testInitFromNativeSessionDescription {
-  webrtc::SessionDescriptionInterface *nativeDescription;
-
-  nativeDescription = webrtc::CreateSessionDescription(
-      webrtc::SessionDescriptionInterface::kAnswer,
-      [self sdp].stdString,
-      nullptr);
-
-  RTCSessionDescription *description =
-      [[RTCSessionDescription alloc] initWithNativeDescription:
-      nativeDescription];
-  EXPECT_EQ(webrtc::SessionDescriptionInterface::kAnswer,
-      [RTCSessionDescription stdStringForType:description.type]);
-  EXPECT_TRUE([[self sdp] isEqualToString:description.sdp]);
-}
-
-- (NSString *)sdp {
-    return @"v=0\r\n"
-           "o=- 5319989746393411314 2 IN IP4 127.0.0.1\r\n"
-           "s=-\r\n"
-           "t=0 0\r\n"
-           "a=group:BUNDLE audio video\r\n"
-           "a=msid-semantic: WMS ARDAMS\r\n"
-           "m=audio 9 UDP/TLS/RTP/SAVPF 111 103 9 0 8 126\r\n"
-           "c=IN IP4 0.0.0.0\r\n"
-           "a=rtcp:9 IN IP4 0.0.0.0\r\n"
-           "a=ice-ufrag:f3o+0HG7l9nwIWFY\r\n"
-           "a=ice-pwd:VDctmJNCptR2TB7+meDpw7w5\r\n"
-           "a=fingerprint:sha-256 A9:D5:8D:A8:69:22:39:60:92:AD:94:1A:22:2D:5E:"
-           "A5:4A:A9:18:C2:35:5D:46:5E:59:BD:1C:AF:38:9F:E6:E1\r\n"
-           "a=setup:active\r\n"
-           "a=mid:audio\r\n"
-           "a=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level\r\n"
-           "a=extmap:3 http://www.webrtc.org/experiments/rtp-hdrext/"
-           "abs-send-time\r\n"
-           "a=sendrecv\r\n"
-           "a=rtcp-mux\r\n"
-           "a=rtpmap:111 opus/48000/2\r\n"
-           "a=fmtp:111 minptime=10;useinbandfec=1\r\n"
-           "a=rtpmap:103 ISAC/16000\r\n"
-           "a=rtpmap:9 G722/8000\r\n"
-           "a=rtpmap:0 PCMU/8000\r\n"
-           "a=rtpmap:8 PCMA/8000\r\n"
-           "a=rtpmap:126 telephone-event/8000\r\n"
-           "a=maxptime:60\r\n"
-           "a=ssrc:1504474588 cname:V+FdIC5AJpxLhdYQ\r\n"
-           "a=ssrc:1504474588 msid:ARDAMS ARDAMSa0\r\n"
-           "a=ssrc:1504474588 mslabel:ARDAMS\r\n"
-           "a=ssrc:1504474588 label:ARDAMSa0\r\n"
-           "m=video 9 UDP/TLS/RTP/SAVPF 100 116 117 96\r\n"
-           "c=IN IP4 0.0.0.0\r\n"
-           "a=rtcp:9 IN IP4 0.0.0.0\r\n"
-           "a=ice-ufrag:f3o+0HG7l9nwIWFY\r\n"
-           "a=ice-pwd:VDctmJNCptR2TB7+meDpw7w5\r\n"
-           "a=fingerprint:sha-256 A9:D5:8D:A8:69:22:39:60:92:AD:94:1A:22:2D:5E:"
-           "A5:4A:A9:18:C2:35:5D:46:5E:59:BD:1C:AF:38:9F:E6:E1\r\n"
-           "a=setup:active\r\n"
-           "a=mid:video\r\n"
-           "a=extmap:2 urn:ietf:params:rtp-hdrext:toffset\r\n"
-           "a=extmap:3 http://www.webrtc.org/experiments/rtp-hdrext/"
-           "abs-send-time\r\n"
-           "a=extmap:4 urn:3gpp:video-orientation\r\n"
-           "a=sendrecv\r\n"
-           "a=rtcp-mux\r\n"
-           "a=rtpmap:100 VP8/90000\r\n"
-           "a=rtcp-fb:100 ccm fir\r\n"
-           "a=rtcp-fb:100 nack\r\n"
-           "a=rtcp-fb:100 nack pli\r\n"
-           "a=rtcp-fb:100 goog-remb\r\n"
-           "a=rtpmap:116 red/90000\r\n"
-           "a=rtpmap:117 ulpfec/90000\r\n"
-           "a=rtpmap:96 rtx/90000\r\n"
-           "a=fmtp:96 apt=100\r\n"
-           "a=ssrc-group:FID 498297514 1644357692\r\n"
-           "a=ssrc:498297514 cname:V+FdIC5AJpxLhdYQ\r\n"
-           "a=ssrc:498297514 msid:ARDAMS ARDAMSv0\r\n"
-           "a=ssrc:498297514 mslabel:ARDAMS\r\n"
-           "a=ssrc:498297514 label:ARDAMSv0\r\n"
-           "a=ssrc:1644357692 cname:V+FdIC5AJpxLhdYQ\r\n"
-           "a=ssrc:1644357692 msid:ARDAMS ARDAMSv0\r\n"
-           "a=ssrc:1644357692 mslabel:ARDAMS\r\n"
-           "a=ssrc:1644357692 label:ARDAMSv0\r\n";
-}
-
-@end
-
-TEST(RTCSessionDescriptionTest, SessionDescriptionConversionTest) {
-  @autoreleasepool {
-    RTCSessionDescriptionTest *test = [[RTCSessionDescriptionTest alloc] init];
-    [test testSessionDescriptionConversion];
-  }
-}
-
-TEST(RTCSessionDescriptionTest, InitFromSessionDescriptionTest) {
-  @autoreleasepool {
-    RTCSessionDescriptionTest *test = [[RTCSessionDescriptionTest alloc] init];
-    [test testInitFromNativeSessionDescription];
-  }
-}
diff --git a/sdk/objc/Framework/UnitTests/RTCTracingTest.mm b/sdk/objc/Framework/UnitTests/RTCTracingTest.mm
deleted file mode 100644
index 49cc812..0000000
--- a/sdk/objc/Framework/UnitTests/RTCTracingTest.mm
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- *  Copyright 2017 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.
- */
-
-#import <Foundation/Foundation.h>
-
-#include <vector>
-
-#include "webrtc/rtc_base/gunit.h"
-
-#import "NSString+StdString.h"
-#import "WebRTC/RTCTracing.h"
-
-@interface RTCTracingTest : NSObject
-- (void)tracingTestNoInitialization;
-@end
-
-@implementation RTCTracingTest
-
-- (NSString *)documentsFilePathForFileName:(NSString *)fileName {
-  NSParameterAssert(fileName.length);
-  NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
-  NSString *documentsDirPath = paths.firstObject;
-  NSString *filePath =
-  [documentsDirPath stringByAppendingPathComponent:fileName];
-  return filePath;
-}
-
-- (void)tracingTestNoInitialization {
-  NSString *filePath = [self documentsFilePathForFileName:@"webrtc-trace.txt"];
-  EXPECT_EQ(NO, RTCStartInternalCapture(filePath));
-  RTCStopInternalCapture();
-}
-
-@end
-
-
-TEST(RTCTracingTest, TracingTestNoInitialization) {
-  @autoreleasepool {
-    RTCTracingTest *test = [[RTCTracingTest alloc] init];
-    [test tracingTestNoInitialization];
-  }
-}
-
diff --git a/sdk/objc/Framework/UnitTests/avformatmappertests.mm b/sdk/objc/Framework/UnitTests/avformatmappertests.mm
deleted file mode 100644
index eb0d951..0000000
--- a/sdk/objc/Framework/UnitTests/avformatmappertests.mm
+++ /dev/null
@@ -1,246 +0,0 @@
-/*
- *  Copyright 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.
- */
-
-#import <Foundation/Foundation.h>
-#import <OCMock/OCMock.h>
-
-#include "webrtc/rtc_base/gunit.h"
-
-#include "Video/avfoundationformatmapper.h"
-
-
-// Width and height don't play any role so lets use predefined values throughout
-// the tests.
-static const int kFormatWidth = 789;
-static const int kFormatHeight = 987;
-
-// Hardcoded framrate to be used throughout the tests.
-static const int kFramerate = 30;
-
-// Same width and height is used so it's ok to expect same cricket::VideoFormat
-static cricket::VideoFormat expectedFormat =
-    cricket::VideoFormat(kFormatWidth,
-                         kFormatHeight,
-                         cricket::VideoFormat::FpsToInterval(kFramerate),
-                         cricket::FOURCC_NV12);
-
-// Mock class for AVCaptureDeviceFormat.
-// Custom implementation needed because OCMock cannot handle the
-// CMVideoDescriptionRef mocking.
-@interface AVCaptureDeviceFormatMock : NSObject
-
-@property (nonatomic, assign) CMVideoFormatDescriptionRef format;
-@property (nonatomic, strong) OCMockObject *rangeMock;
-
-- (instancetype)initWithMediaSubtype:(FourCharCode)subtype
-                              minFps:(float)minFps
-                              maxFps:(float)maxFps;
-+ (instancetype)validFormat;
-+ (instancetype)invalidFpsFormat;
-+ (instancetype)invalidMediaSubtypeFormat;
-
-@end
-
-@implementation AVCaptureDeviceFormatMock
-
-@synthesize format = _format;
-@synthesize rangeMock = _rangeMock;
-
-- (instancetype)initWithMediaSubtype:(FourCharCode)subtype
-                              minFps:(float)minFps
-                              maxFps:(float)maxFps {
-  if (self = [super init]) {
-    CMVideoFormatDescriptionCreate(nil, subtype, kFormatWidth, kFormatHeight,
-                                   nil, &_format);
-    // We can use OCMock for the range.
-    _rangeMock = [OCMockObject mockForClass:[AVFrameRateRange class]];
-    [[[_rangeMock stub] andReturnValue:@(minFps)] minFrameRate];
-    [[[_rangeMock stub] andReturnValue:@(maxFps)] maxFrameRate];
-  }
-
-  return self;
-}
-
-+ (instancetype)validFormat {
-  AVCaptureDeviceFormatMock *instance = [[AVCaptureDeviceFormatMock alloc]
-      initWithMediaSubtype:kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange
-                    minFps:0.0
-                    maxFps:30.0];
-  return instance;
-}
-
-+ (instancetype)invalidFpsFormat {
-  AVCaptureDeviceFormatMock *instance = [[AVCaptureDeviceFormatMock alloc]
-      initWithMediaSubtype:kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange
-                    minFps:0.0
-                    maxFps:22.0];
-  return instance;
-}
-
-+ (instancetype)invalidMediaSubtypeFormat {
-  AVCaptureDeviceFormatMock *instance = [[AVCaptureDeviceFormatMock alloc]
-      initWithMediaSubtype:kCVPixelFormatType_420YpCbCr8Planar
-                    minFps:0.0
-                    maxFps:60.0];
-  return instance;
-}
-
-- (void)dealloc {
-  if (_format != nil) {
-    CFRelease(_format);
-    _format = nil;
-  }
-}
-
-// Redefinition of AVCaptureDevice methods we want to mock.
-- (CMVideoFormatDescriptionRef)formatDescription {
-  return self.format;
-}
-
-- (NSArray *)videoSupportedFrameRateRanges {
-  return @[ self.rangeMock ];
-}
-
-@end
-
-TEST(AVFormatMapperTest, SuportedCricketFormatsWithInvalidFramerateFormats) {
-  // given
-  id mockDevice = OCMClassMock([AVCaptureDevice class]);
-
-  // Valid media subtype, invalid framerate
-  AVCaptureDeviceFormatMock* mock =
-      [AVCaptureDeviceFormatMock invalidFpsFormat];
-  OCMStub([mockDevice formats]).andReturn(@[ mock ]);
-
-  // when
-  std::set<cricket::VideoFormat> result =
-      webrtc::GetSupportedVideoFormatsForDevice(mockDevice);
-
-  // then
-  EXPECT_TRUE(result.empty());
-}
-
-TEST(AVFormatMapperTest, SuportedCricketFormatsWithInvalidFormats) {
-  // given
-  id mockDevice = OCMClassMock([AVCaptureDevice class]);
-
-  // Invalid media subtype, valid framerate
-  AVCaptureDeviceFormatMock* mock =
-      [AVCaptureDeviceFormatMock invalidMediaSubtypeFormat];
-  OCMStub([mockDevice formats]).andReturn(@[ mock ]);
-
-  // when
-  std::set<cricket::VideoFormat> result =
-      webrtc::GetSupportedVideoFormatsForDevice(mockDevice);
-
-  // then
-  EXPECT_TRUE(result.empty());
-}
-
-TEST(AVFormatMapperTest, SuportedCricketFormats) {
-  // given
-  id mockDevice = OCMClassMock([AVCaptureDevice class]);
-
-  // valid media subtype, valid framerate
-  AVCaptureDeviceFormatMock* mock = [AVCaptureDeviceFormatMock validFormat];
-  OCMStub([mockDevice formats]).andReturn(@[ mock ]);
-
-  // when
-  std::set<cricket::VideoFormat> result =
-      webrtc::GetSupportedVideoFormatsForDevice(mockDevice);
-
-  // then
-  EXPECT_EQ(1u, result.size());
-  // make sure the set has the expected format
-  EXPECT_EQ(expectedFormat, *result.begin());
-}
-
-TEST(AVFormatMapperTest, MediaSubtypePreference) {
-  // given
-  id mockDevice = OCMClassMock([AVCaptureDevice class]);
-
-  // valid media subtype, valid framerate
-  AVCaptureDeviceFormatMock* mockOne = [[AVCaptureDeviceFormatMock alloc]
-      initWithMediaSubtype:kCVPixelFormatType_420YpCbCr8BiPlanarFullRange
-                    minFps:0.0
-                    maxFps:30.0];
-  // valid media subtype, valid framerate.
-  // This media subtype should be the preffered one.
-  AVCaptureDeviceFormatMock* mockTwo = [[AVCaptureDeviceFormatMock alloc]
-      initWithMediaSubtype:kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange
-                    minFps:0.0
-                    maxFps:30.0];
-  OCMStub([mockDevice lockForConfiguration:[OCMArg setTo:nil]]).andReturn(YES);
-  OCMStub([mockDevice unlockForConfiguration]);
-  NSArray* array = @[ mockOne, mockTwo ];
-  OCMStub([mockDevice formats]).andReturn(array);
-
-  // to verify
-  OCMExpect([mockDevice setActiveFormat:(AVCaptureDeviceFormat*)mockTwo]);
-  OCMExpect(
-      [mockDevice setActiveVideoMinFrameDuration:CMTimeMake(1, kFramerate)]);
-
-  // when
-  bool resultFormat =
-      webrtc::SetFormatForCaptureDevice(mockDevice, nil, expectedFormat);
-
-  // then
-  EXPECT_TRUE(resultFormat);
-  [mockDevice verify];
-}
-
-TEST(AVFormatMapperTest, SetFormatWhenDeviceCannotLock) {
-  // given
-  id mockDevice = OCMClassMock([AVCaptureDevice class]);
-  [[[mockDevice stub] andReturnValue:@(NO)]
-      lockForConfiguration:[OCMArg setTo:nil]];
-  [[[mockDevice stub] andReturn:@[]] formats];
-
-  // when
-  bool resultFormat = webrtc::SetFormatForCaptureDevice(mockDevice, nil,
-                                                        cricket::VideoFormat());
-
-  // then
-  EXPECT_FALSE(resultFormat);
-}
-
-TEST(AVFormatMapperTest, SetFormatWhenFormatIsIncompatible) {
-  // given
-  id mockDevice = OCMClassMock([AVCaptureDevice class]);
-  OCMStub([mockDevice formats]).andReturn(@[]);
-  OCMStub([mockDevice lockForConfiguration:[OCMArg setTo:nil]]).andReturn(YES);
-  NSException* testException =
-      [NSException exceptionWithName:@"Test exception"
-                              reason:@"Raised from unit tests"
-                            userInfo:nil];
-  OCMStub([mockDevice setActiveFormat:[OCMArg any]]).andThrow(testException);
-  OCMExpect([mockDevice unlockForConfiguration]);
-
-  // when
-  bool resultFormat = webrtc::SetFormatForCaptureDevice(mockDevice, nil,
-                                                        cricket::VideoFormat());
-
-  // then
-  EXPECT_FALSE(resultFormat);
-
-  // TODO(denicija): Remove try-catch when Chromium rolls this change:
-  // https://github.com/erikdoe/ocmock/commit/de1419415581dc307045e54bfe9c98c86efea96b
-  // Without it, stubbed exceptions are being re-raised on [mock verify].
-  // More information here:
-  //https://github.com/erikdoe/ocmock/issues/241
-  @try {
-    [mockDevice verify];
-  } @catch (NSException* exception) {
-    if ([exception.reason isEqual:testException.reason]) {
-      // Nothing dangerous here
-      EXPECT_TRUE([exception.reason isEqualToString:exception.reason]);
-    }
-  }
-}
diff --git a/sdk/objc/Framework/UnitTests/objc_video_decoder_factory_tests.mm b/sdk/objc/Framework/UnitTests/objc_video_decoder_factory_tests.mm
deleted file mode 100644
index 6fcc422..0000000
--- a/sdk/objc/Framework/UnitTests/objc_video_decoder_factory_tests.mm
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- *  Copyright 2017 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.
- */
-
-#import <Foundation/Foundation.h>
-#import <OCMock/OCMock.h>
-
-#include "webrtc/sdk/objc/Framework/Classes/VideoToolbox/objc_video_decoder_factory.h"
-
-#import "WebRTC/RTCVideoCodec.h"
-#import "WebRTC/RTCVideoCodecFactory.h"
-#include "webrtc/media/base/codec.h"
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/modules/video_coding/include/video_codec_interface.h"
-#include "webrtc/modules/video_coding/include/video_error_codes.h"
-#include "webrtc/rtc_base/gunit.h"
-
-id<RTCVideoDecoderFactory> CreateDecoderFactoryReturning(int return_code) {
-  id decoderMock = OCMProtocolMock(@protocol(RTCVideoDecoder));
-  OCMStub([decoderMock startDecodeWithSettings:[OCMArg any] numberOfCores:1])
-      .andReturn(return_code);
-  OCMStub([decoderMock decode:[OCMArg any]
-                    missingFrames:NO
-              fragmentationHeader:[OCMArg any]
-                codecSpecificInfo:[OCMArg any]
-                     renderTimeMs:0])
-      .andReturn(return_code);
-  OCMStub([decoderMock releaseDecoder]).andReturn(return_code);
-
-  id decoderFactoryMock = OCMProtocolMock(@protocol(RTCVideoDecoderFactory));
-  RTCVideoCodecInfo *supported = [[RTCVideoCodecInfo alloc] initWithName:@"H264" parameters:nil];
-  OCMStub([decoderFactoryMock supportedCodecs]).andReturn(@[ supported ]);
-  OCMStub([decoderFactoryMock createDecoder:[OCMArg any]]).andReturn(decoderMock);
-  return decoderFactoryMock;
-}
-
-id<RTCVideoDecoderFactory> CreateOKDecoderFactory() {
-  return CreateDecoderFactoryReturning(WEBRTC_VIDEO_CODEC_OK);
-}
-
-id<RTCVideoDecoderFactory> CreateErrorDecoderFactory() {
-  return CreateDecoderFactoryReturning(WEBRTC_VIDEO_CODEC_ERROR);
-}
-
-webrtc::VideoDecoder *GetObjCDecoder(id<RTCVideoDecoderFactory> factory) {
-  webrtc::ObjCVideoDecoderFactory decoder_factory(factory);
-  return decoder_factory.CreateVideoDecoderWithParams(cricket::VideoCodec(cricket::kH264CodecName),
-                                                      {});
-}
-
-#pragma mark -
-
-TEST(ObjCVideoDecoderFactoryTest, InitDecodeReturnsOKOnSuccess) {
-  webrtc::VideoDecoder *decoder = GetObjCDecoder(CreateOKDecoderFactory());
-
-  auto settings = new webrtc::VideoCodec();
-  EXPECT_EQ(decoder->InitDecode(settings, 1), WEBRTC_VIDEO_CODEC_OK);
-}
-
-TEST(ObjCVideoDecoderFactoryTest, InitDecodeReturnsErrorOnFail) {
-  webrtc::VideoDecoder *decoder = GetObjCDecoder(CreateErrorDecoderFactory());
-
-  auto settings = new webrtc::VideoCodec();
-  EXPECT_EQ(decoder->InitDecode(settings, 1), WEBRTC_VIDEO_CODEC_ERROR);
-}
-
-TEST(ObjCVideoDecoderFactoryTest, DecodeReturnsOKOnSuccess) {
-  webrtc::VideoDecoder *decoder = GetObjCDecoder(CreateOKDecoderFactory());
-
-  webrtc::EncodedImage encoded_image;
-  webrtc::RTPFragmentationHeader header;
-  webrtc::CodecSpecificInfo info;
-  info.codecType = webrtc::kVideoCodecH264;
-
-  EXPECT_EQ(decoder->Decode(encoded_image, false, &header, &info, 0), WEBRTC_VIDEO_CODEC_OK);
-}
-
-TEST(ObjCVideoDecoderFactoryTest, DecodeReturnsErrorOnFail) {
-  webrtc::VideoDecoder *decoder = GetObjCDecoder(CreateErrorDecoderFactory());
-
-  webrtc::EncodedImage encoded_image;
-  webrtc::RTPFragmentationHeader header;
-  webrtc::CodecSpecificInfo info;
-  info.codecType = webrtc::kVideoCodecH264;
-
-  EXPECT_EQ(decoder->Decode(encoded_image, false, &header, &info, 0), WEBRTC_VIDEO_CODEC_ERROR);
-}
-
-TEST(ObjCVideoDecoderFactoryTest, ReleaseDecodeReturnsOKOnSuccess) {
-  webrtc::VideoDecoder *decoder = GetObjCDecoder(CreateOKDecoderFactory());
-
-  EXPECT_EQ(decoder->Release(), WEBRTC_VIDEO_CODEC_OK);
-}
-
-TEST(ObjCVideoDecoderFactoryTest, ReleaseDecodeReturnsErrorOnFail) {
-  webrtc::VideoDecoder *decoder = GetObjCDecoder(CreateErrorDecoderFactory());
-
-  EXPECT_EQ(decoder->Release(), WEBRTC_VIDEO_CODEC_ERROR);
-}
diff --git a/sdk/objc/Framework/UnitTests/objc_video_encoder_factory_tests.mm b/sdk/objc/Framework/UnitTests/objc_video_encoder_factory_tests.mm
deleted file mode 100644
index ed29bc2..0000000
--- a/sdk/objc/Framework/UnitTests/objc_video_encoder_factory_tests.mm
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- *  Copyright 2017 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.
- */
-
-#import <Foundation/Foundation.h>
-#import <OCMock/OCMock.h>
-
-#include "webrtc/sdk/objc/Framework/Classes/VideoToolbox/objc_video_encoder_factory.h"
-
-#import "WebRTC/RTCVideoCodec.h"
-#import "WebRTC/RTCVideoCodecFactory.h"
-#import "WebRTC/RTCVideoFrameBuffer.h"
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/modules/video_coding/include/video_codec_interface.h"
-#include "webrtc/modules/video_coding/include/video_error_codes.h"
-#include "webrtc/rtc_base/gunit.h"
-#include "webrtc/sdk/objc/Framework/Classes/Video/objc_frame_buffer.h"
-
-id<RTCVideoEncoderFactory> CreateEncoderFactoryReturning(int return_code) {
-  id encoderMock = OCMProtocolMock(@protocol(RTCVideoEncoder));
-  OCMStub([encoderMock startEncodeWithSettings:[OCMArg any] numberOfCores:1])
-      .andReturn(return_code);
-  OCMStub([encoderMock encode:[OCMArg any] codecSpecificInfo:[OCMArg any] frameTypes:[OCMArg any]])
-      .andReturn(return_code);
-  OCMStub([encoderMock releaseEncoder]).andReturn(return_code);
-  OCMStub([encoderMock setBitrate:0 framerate:0]).andReturn(return_code);
-
-  id encoderFactoryMock = OCMProtocolMock(@protocol(RTCVideoEncoderFactory));
-  RTCVideoCodecInfo *supported = [[RTCVideoCodecInfo alloc] initWithName:@"H264" parameters:nil];
-  OCMStub([encoderFactoryMock supportedCodecs]).andReturn(@[ supported ]);
-  OCMStub([encoderFactoryMock createEncoder:[OCMArg any]]).andReturn(encoderMock);
-  return encoderFactoryMock;
-}
-
-id<RTCVideoEncoderFactory> CreateOKEncoderFactory() {
-  return CreateEncoderFactoryReturning(WEBRTC_VIDEO_CODEC_OK);
-}
-
-id<RTCVideoEncoderFactory> CreateErrorEncoderFactory() {
-  return CreateEncoderFactoryReturning(WEBRTC_VIDEO_CODEC_ERROR);
-}
-
-webrtc::VideoEncoder *GetObjCEncoder(id<RTCVideoEncoderFactory> factory) {
-  webrtc::ObjCVideoEncoderFactory encoder_factory(factory);
-  cricket::VideoCodec codec("H264");
-  return encoder_factory.CreateVideoEncoder(codec);
-}
-
-#pragma mark -
-
-TEST(ObjCVideoEncoderFactoryTest, InitEncodeReturnsOKOnSuccess) {
-  webrtc::VideoEncoder *encoder = GetObjCEncoder(CreateOKEncoderFactory());
-
-  auto settings = new webrtc::VideoCodec();
-  EXPECT_EQ(encoder->InitEncode(settings, 1, 0), WEBRTC_VIDEO_CODEC_OK);
-}
-
-TEST(ObjCVideoEncoderFactoryTest, InitEncodeReturnsErrorOnFail) {
-  webrtc::VideoEncoder *encoder = GetObjCEncoder(CreateErrorEncoderFactory());
-
-  auto settings = new webrtc::VideoCodec();
-  EXPECT_EQ(encoder->InitEncode(settings, 1, 0), WEBRTC_VIDEO_CODEC_ERROR);
-}
-
-TEST(ObjCVideoEncoderFactoryTest, EncodeReturnsOKOnSuccess) {
-  webrtc::VideoEncoder *encoder = GetObjCEncoder(CreateOKEncoderFactory());
-
-  CVPixelBufferRef pixel_buffer;
-  CVPixelBufferCreate(kCFAllocatorDefault, 640, 480, kCVPixelFormatType_32ARGB, nil, &pixel_buffer);
-  rtc::scoped_refptr<webrtc::VideoFrameBuffer> buffer =
-      new rtc::RefCountedObject<webrtc::ObjCFrameBuffer>(
-          [[RTCCVPixelBuffer alloc] initWithPixelBuffer:pixel_buffer]);
-  webrtc::VideoFrame frame(buffer, webrtc::kVideoRotation_0, 0);
-  webrtc::CodecSpecificInfo info;
-  info.codecType = webrtc::kVideoCodecH264;
-  info.codec_name = "H264";
-  std::vector<webrtc::FrameType> frame_types;
-
-  EXPECT_EQ(encoder->Encode(frame, &info, &frame_types), WEBRTC_VIDEO_CODEC_OK);
-}
-
-TEST(ObjCVideoEncoderFactoryTest, EncodeReturnsErrorOnFail) {
-  webrtc::VideoEncoder *encoder = GetObjCEncoder(CreateErrorEncoderFactory());
-
-  CVPixelBufferRef pixel_buffer;
-  CVPixelBufferCreate(kCFAllocatorDefault, 640, 480, kCVPixelFormatType_32ARGB, nil, &pixel_buffer);
-  rtc::scoped_refptr<webrtc::VideoFrameBuffer> buffer =
-      new rtc::RefCountedObject<webrtc::ObjCFrameBuffer>(
-          [[RTCCVPixelBuffer alloc] initWithPixelBuffer:pixel_buffer]);
-  webrtc::VideoFrame frame(buffer, webrtc::kVideoRotation_0, 0);
-  webrtc::CodecSpecificInfo info;
-  info.codecType = webrtc::kVideoCodecH264;
-  info.codec_name = "H264";
-  std::vector<webrtc::FrameType> frame_types;
-
-  EXPECT_EQ(encoder->Encode(frame, &info, &frame_types), WEBRTC_VIDEO_CODEC_ERROR);
-}
-
-TEST(ObjCVideoEncoderFactoryTest, ReleaseEncodeReturnsOKOnSuccess) {
-  webrtc::VideoEncoder *encoder = GetObjCEncoder(CreateOKEncoderFactory());
-
-  EXPECT_EQ(encoder->Release(), WEBRTC_VIDEO_CODEC_OK);
-}
-
-TEST(ObjCVideoEncoderFactoryTest, ReleaseEncodeReturnsErrorOnFail) {
-  webrtc::VideoEncoder *encoder = GetObjCEncoder(CreateErrorEncoderFactory());
-
-  EXPECT_EQ(encoder->Release(), WEBRTC_VIDEO_CODEC_ERROR);
-}
-
-TEST(ObjCVideoEncoderFactoryTest, SetChannelParametersAlwaysReturnsOK) {
-  webrtc::VideoEncoder *encoder = GetObjCEncoder(CreateErrorEncoderFactory());
-
-  EXPECT_EQ(encoder->SetChannelParameters(1, 1), WEBRTC_VIDEO_CODEC_OK);
-}
-
-TEST(ObjCVideoEncoderFactoryTest, SetRatesReturnsOKOnSuccess) {
-  webrtc::VideoEncoder *encoder = GetObjCEncoder(CreateOKEncoderFactory());
-
-  EXPECT_EQ(encoder->SetRates(0, 0), WEBRTC_VIDEO_CODEC_OK);
-}
-
-TEST(ObjCVideoEncoderFactoryTest, SetRatesReturnsErrorOnFail) {
-  webrtc::VideoEncoder *encoder = GetObjCEncoder(CreateErrorEncoderFactory());
-
-  EXPECT_EQ(encoder->SetRates(0, 0), WEBRTC_VIDEO_CODEC_ERROR);
-}
diff --git a/sdk/objc/OWNERS b/sdk/objc/OWNERS
deleted file mode 100644
index 17414d1..0000000
--- a/sdk/objc/OWNERS
+++ /dev/null
@@ -1,9 +0,0 @@
-denicija@webrtc.org
-kthelgason@webrtc.org
-magjed@webrtc.org
-tkchin@webrtc.org
-
-# These are for the common case of adding or renaming files. If you're doing
-# structural changes, please get a review from a reviewer in this file.
-per-file *.gn=*
-per-file *.gni=*
diff --git a/sdk/objc/WebRTC.podspec b/sdk/objc/WebRTC.podspec
deleted file mode 100644
index 37ab166..0000000
--- a/sdk/objc/WebRTC.podspec
+++ /dev/null
@@ -1,18 +0,0 @@
-Pod::Spec.new do |s|
-  s.name         = "WebRTC"
-  s.version      = "${FRAMEWORK_VERSION_NUMBER}"
-  s.summary      = "WebRTC SDK for iOS"
-  s.description  = <<-DESC
-    WebRTC is a free, open project that provides browsers and mobile
-    applications with Real-Time Communications (RTC) capabilities via simple
-    APIs.
-                   DESC
-  s.homepage     = "http://webrtc.org/"
-  s.license      = { :type => "BSD", :file => "LICENSE" }
-  s.author    = "Google Inc."
-
-  s.platform     = :ios, "8.0"
-
-  s.public_header_files = "WebRTC.framework/Headers/**/*.h"
-  s.vendored_frameworks = "WebRTC.framework"
-end
diff --git a/stats/BUILD.gn b/stats/BUILD.gn
deleted file mode 100644
index 06ce45d..0000000
--- a/stats/BUILD.gn
+++ /dev/null
@@ -1,73 +0,0 @@
-# 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.
-
-import("../webrtc.gni")
-
-group("stats") {
-  public_deps = [
-    ":rtc_stats",
-  ]
-}
-
-rtc_static_library("rtc_stats") {
-  cflags = []
-  sources = [
-    "rtcstats.cc",
-    "rtcstats_objects.cc",
-    "rtcstatsreport.cc",
-  ]
-
-  deps = [
-    "../api:rtc_stats_api",
-    "../rtc_base:rtc_base_approved",
-  ]
-}
-
-rtc_source_set("rtc_stats_test_utils") {
-  cflags = []
-  sources = [
-    "test/rtcteststats.cc",
-    "test/rtcteststats.h",
-  ]
-
-  deps = [
-    ":rtc_stats",
-    "../api:rtc_stats_api",
-  ]
-}
-
-if (rtc_include_tests) {
-  rtc_test("rtc_stats_unittests") {
-    testonly = true
-    sources = [
-      "rtcstats_unittest.cc",
-      "rtcstatsreport_unittest.cc",
-    ]
-
-    if (!build_with_chromium && is_clang) {
-      # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-    }
-
-    deps = [
-      ":rtc_stats",
-      ":rtc_stats_test_utils",
-      "../api:rtc_stats_api",
-      "../rtc_base:rtc_base_approved",
-      "../rtc_base:rtc_base_tests_main",
-      "../rtc_base:rtc_base_tests_utils",
-      "../rtc_base:rtc_json",
-      "../system_wrappers:metrics_default",
-      "//testing/gmock",
-    ]
-
-    if (is_android) {
-      deps += [ "//testing/android/native_test:native_test_native_code" ]
-    }
-  }
-}
diff --git a/stats/DEPS b/stats/DEPS
deleted file mode 100644
index 276073f..0000000
--- a/stats/DEPS
+++ /dev/null
@@ -1,4 +0,0 @@
-include_rules = [
-  "+webrtc/api",
-  "+webrtc/media",
-]
diff --git a/stats/OWNERS b/stats/OWNERS
deleted file mode 100644
index 633d6b9..0000000
--- a/stats/OWNERS
+++ /dev/null
@@ -1,7 +0,0 @@
-hbos@webrtc.org
-hta@webrtc.org
-
-# These are for the common case of adding or renaming files. If you're doing
-# structural changes, please get a review from a reviewer in this file.
-per-file *.gn=*
-per-file *.gni=*
diff --git a/stats/rtcstats.cc b/stats/rtcstats.cc
deleted file mode 100644
index 0ef49c1..0000000
--- a/stats/rtcstats.cc
+++ /dev/null
@@ -1,236 +0,0 @@
-/*
- *  Copyright 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/api/stats/rtcstats.h"
-
-#include <iomanip>
-#include <sstream>
-
-#include "webrtc/rtc_base/stringencode.h"
-
-namespace webrtc {
-
-namespace {
-
-// Produces "[a,b,c]". Works for non-vector |RTCStatsMemberInterface::Type|
-// types.
-template<typename T>
-std::string VectorToString(const std::vector<T>& vector) {
-  if (vector.empty())
-    return "[]";
-  std::ostringstream oss;
-  oss << "[" << rtc::ToString<T>(vector[0]);
-  for (size_t i = 1; i < vector.size(); ++i) {
-    oss << "," << rtc::ToString<T>(vector[i]);
-  }
-  oss << "]";
-  return oss.str();
-}
-
-// Produces "[\"a\",\"b\",\"c\"]". Works for vectors of both const char* and
-// std::string element types.
-template<typename T>
-std::string VectorOfStringsToString(const std::vector<T>& strings) {
-  if (strings.empty())
-    return "[]";
-  std::ostringstream oss;
-  oss << "[\"" << rtc::ToString<T>(strings[0]) << '\"';
-  for (size_t i = 1; i < strings.size(); ++i) {
-    oss << ",\"" << rtc::ToString<T>(strings[i]) << '\"';
-  }
-  oss << "]";
-  return oss.str();
-}
-
-template <typename T>
-std::string ToStringAsDouble(const T value) {
-  // JSON represents numbers as floating point numbers with about 15 decimal
-  // digits of precision.
-  const int JSON_PRECISION = 16;
-  std::ostringstream oss;
-  oss << std::setprecision(JSON_PRECISION) << static_cast<double>(value);
-  return oss.str();
-}
-
-template <typename T>
-std::string VectorToStringAsDouble(const std::vector<T>& vector) {
-  if (vector.empty())
-    return "[]";
-  std::ostringstream oss;
-  oss << "[" << ToStringAsDouble<T>(vector[0]);
-  for (size_t i = 1; i < vector.size(); ++i) {
-    oss << "," << ToStringAsDouble<T>(vector[i]);
-  }
-  oss << "]";
-  return oss.str();
-}
-
-}  // namespace
-
-bool RTCStats::operator==(const RTCStats& other) const {
-  if (type() != other.type() || id() != other.id())
-    return false;
-  std::vector<const RTCStatsMemberInterface*> members = Members();
-  std::vector<const RTCStatsMemberInterface*> other_members = other.Members();
-  RTC_DCHECK_EQ(members.size(), other_members.size());
-  for (size_t i = 0; i < members.size(); ++i) {
-    const RTCStatsMemberInterface* member = members[i];
-    const RTCStatsMemberInterface* other_member = other_members[i];
-    RTC_DCHECK_EQ(member->type(), other_member->type());
-    RTC_DCHECK_EQ(member->name(), other_member->name());
-    if (*member != *other_member)
-      return false;
-  }
-  return true;
-}
-
-bool RTCStats::operator!=(const RTCStats& other) const {
-  return !(*this == other);
-}
-
-std::string RTCStats::ToJson() const {
-  std::ostringstream oss;
-  oss << "{\"type\":\"" << type() << "\","
-      << "\"id\":\"" << id_ << "\","
-      << "\"timestamp\":" << timestamp_us_;
-  for (const RTCStatsMemberInterface* member : Members()) {
-    if (member->is_defined()) {
-      oss << ",\"" << member->name() << "\":";
-      if (member->is_string())
-        oss << '"' << member->ValueToJson() << '"';
-      else
-        oss << member->ValueToJson();
-    }
-  }
-  oss << "}";
-  return oss.str();
-}
-
-std::vector<const RTCStatsMemberInterface*> RTCStats::Members() const {
-  return MembersOfThisObjectAndAncestors(0);
-}
-
-std::vector<const RTCStatsMemberInterface*>
-RTCStats::MembersOfThisObjectAndAncestors(
-    size_t additional_capacity) const {
-  std::vector<const RTCStatsMemberInterface*> members;
-  members.reserve(additional_capacity);
-  return members;
-}
-
-#define WEBRTC_DEFINE_RTCSTATSMEMBER(T, type, is_seq, is_str, to_str, to_json) \
-  template <>                                                                  \
-  const RTCStatsMemberInterface::Type RTCStatsMember<T>::kType =               \
-      RTCStatsMemberInterface::type;                                           \
-  template <>                                                                  \
-  bool RTCStatsMember<T>::is_sequence() const {                                \
-    return is_seq;                                                             \
-  }                                                                            \
-  template <>                                                                  \
-  bool RTCStatsMember<T>::is_string() const {                                  \
-    return is_str;                                                             \
-  }                                                                            \
-  template <>                                                                  \
-  std::string RTCStatsMember<T>::ValueToString() const {                       \
-    RTC_DCHECK(is_defined_);                                                   \
-    return to_str;                                                             \
-  }                                                                            \
-  template <>                                                                  \
-  std::string RTCStatsMember<T>::ValueToJson() const {                         \
-    RTC_DCHECK(is_defined_);                                                   \
-    return to_json;                                                            \
-  }
-
-WEBRTC_DEFINE_RTCSTATSMEMBER(bool,
-                             kBool,
-                             false,
-                             false,
-                             rtc::ToString(value_),
-                             rtc::ToString(value_));
-WEBRTC_DEFINE_RTCSTATSMEMBER(int32_t,
-                             kInt32,
-                             false,
-                             false,
-                             rtc::ToString(value_),
-                             rtc::ToString(value_));
-WEBRTC_DEFINE_RTCSTATSMEMBER(uint32_t,
-                             kUint32,
-                             false,
-                             false,
-                             rtc::ToString(value_),
-                             rtc::ToString(value_));
-WEBRTC_DEFINE_RTCSTATSMEMBER(int64_t,
-                             kInt64,
-                             false,
-                             false,
-                             rtc::ToString(value_),
-                             ToStringAsDouble(value_));
-WEBRTC_DEFINE_RTCSTATSMEMBER(uint64_t,
-                             kUint64,
-                             false,
-                             false,
-                             rtc::ToString(value_),
-                             ToStringAsDouble(value_));
-WEBRTC_DEFINE_RTCSTATSMEMBER(double,
-                             kDouble,
-                             false,
-                             false,
-                             rtc::ToString(value_),
-                             ToStringAsDouble(value_));
-WEBRTC_DEFINE_RTCSTATSMEMBER(std::string,
-                             kString,
-                             false,
-                             true,
-                             value_,
-                             value_);
-WEBRTC_DEFINE_RTCSTATSMEMBER(std::vector<bool>,
-                             kSequenceBool,
-                             true,
-                             false,
-                             VectorToString(value_),
-                             VectorToString(value_));
-WEBRTC_DEFINE_RTCSTATSMEMBER(std::vector<int32_t>,
-                             kSequenceInt32,
-                             true,
-                             false,
-                             VectorToString(value_),
-                             VectorToString(value_));
-WEBRTC_DEFINE_RTCSTATSMEMBER(std::vector<uint32_t>,
-                             kSequenceUint32,
-                             true,
-                             false,
-                             VectorToString(value_),
-                             VectorToString(value_));
-WEBRTC_DEFINE_RTCSTATSMEMBER(std::vector<int64_t>,
-                             kSequenceInt64,
-                             true,
-                             false,
-                             VectorToString(value_),
-                             VectorToStringAsDouble(value_));
-WEBRTC_DEFINE_RTCSTATSMEMBER(std::vector<uint64_t>,
-                             kSequenceUint64,
-                             true,
-                             false,
-                             VectorToString(value_),
-                             VectorToStringAsDouble(value_));
-WEBRTC_DEFINE_RTCSTATSMEMBER(std::vector<double>,
-                             kSequenceDouble,
-                             true,
-                             false,
-                             VectorToString(value_),
-                             VectorToStringAsDouble(value_));
-WEBRTC_DEFINE_RTCSTATSMEMBER(std::vector<std::string>,
-                             kSequenceString,
-                             true,
-                             false,
-                             VectorOfStringsToString(value_),
-                             VectorOfStringsToString(value_));
-
-}  // namespace webrtc
diff --git a/stats/rtcstats_objects.cc b/stats/rtcstats_objects.cc
deleted file mode 100644
index 284dfe0..0000000
--- a/stats/rtcstats_objects.cc
+++ /dev/null
@@ -1,691 +0,0 @@
-/*
- *  Copyright 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/api/stats/rtcstats_objects.h"
-
-namespace webrtc {
-
-const char* const RTCDataChannelState::kConnecting = "connecting";
-const char* const RTCDataChannelState::kOpen = "open";
-const char* const RTCDataChannelState::kClosing = "closing";
-const char* const RTCDataChannelState::kClosed = "closed";
-
-const char* const RTCStatsIceCandidatePairState::kFrozen = "frozen";
-const char* const RTCStatsIceCandidatePairState::kWaiting = "waiting";
-const char* const RTCStatsIceCandidatePairState::kInProgress = "in-progress";
-const char* const RTCStatsIceCandidatePairState::kFailed = "failed";
-const char* const RTCStatsIceCandidatePairState::kSucceeded = "succeeded";
-
-// Strings defined in https://tools.ietf.org/html/rfc5245.
-const char* const RTCIceCandidateType::kHost = "host";
-const char* const RTCIceCandidateType::kSrflx = "srflx";
-const char* const RTCIceCandidateType::kPrflx = "prflx";
-const char* const RTCIceCandidateType::kRelay = "relay";
-
-const char* const RTCDtlsTransportState::kNew = "new";
-const char* const RTCDtlsTransportState::kConnecting = "connecting";
-const char* const RTCDtlsTransportState::kConnected = "connected";
-const char* const RTCDtlsTransportState::kClosed = "closed";
-const char* const RTCDtlsTransportState::kFailed = "failed";
-
-const char* const RTCMediaStreamTrackKind::kAudio = "audio";
-const char* const RTCMediaStreamTrackKind::kVideo = "video";
-
-// clang-format off
-WEBRTC_RTCSTATS_IMPL(RTCCertificateStats, RTCStats, "certificate",
-    &fingerprint,
-    &fingerprint_algorithm,
-    &base64_certificate,
-    &issuer_certificate_id);
-// clang-format on
-
-RTCCertificateStats::RTCCertificateStats(
-    const std::string& id, int64_t timestamp_us)
-    : RTCCertificateStats(std::string(id), timestamp_us) {
-}
-
-RTCCertificateStats::RTCCertificateStats(
-    std::string&& id, int64_t timestamp_us)
-    : RTCStats(std::move(id), timestamp_us),
-      fingerprint("fingerprint"),
-      fingerprint_algorithm("fingerprintAlgorithm"),
-      base64_certificate("base64Certificate"),
-      issuer_certificate_id("issuerCertificateId") {
-}
-
-RTCCertificateStats::RTCCertificateStats(
-    const RTCCertificateStats& other)
-    : RTCStats(other.id(), other.timestamp_us()),
-      fingerprint(other.fingerprint),
-      fingerprint_algorithm(other.fingerprint_algorithm),
-      base64_certificate(other.base64_certificate),
-      issuer_certificate_id(other.issuer_certificate_id) {
-}
-
-RTCCertificateStats::~RTCCertificateStats() {
-}
-
-// clang-format off
-WEBRTC_RTCSTATS_IMPL(RTCCodecStats, RTCStats, "codec",
-    &payload_type,
-    &mime_type,
-    &clock_rate,
-    &channels,
-    &sdp_fmtp_line,
-    &implementation);
-// clang-format on
-
-RTCCodecStats::RTCCodecStats(
-    const std::string& id, int64_t timestamp_us)
-    : RTCCodecStats(std::string(id), timestamp_us) {
-}
-
-RTCCodecStats::RTCCodecStats(
-    std::string&& id, int64_t timestamp_us)
-    : RTCStats(std::move(id), timestamp_us),
-      payload_type("payloadType"),
-      mime_type("mimeType"),
-      clock_rate("clockRate"),
-      channels("channels"),
-      sdp_fmtp_line("sdpFmtpLine"),
-      implementation("implementation") {
-}
-
-RTCCodecStats::RTCCodecStats(
-    const RTCCodecStats& other)
-    : RTCStats(other.id(), other.timestamp_us()),
-      payload_type(other.payload_type),
-      mime_type(other.mime_type),
-      clock_rate(other.clock_rate),
-      channels(other.channels),
-      sdp_fmtp_line(other.sdp_fmtp_line),
-      implementation(other.implementation) {
-}
-
-RTCCodecStats::~RTCCodecStats() {
-}
-
-// clang-format off
-WEBRTC_RTCSTATS_IMPL(RTCDataChannelStats, RTCStats, "data-channel",
-    &label,
-    &protocol,
-    &datachannelid,
-    &state,
-    &messages_sent,
-    &bytes_sent,
-    &messages_received,
-    &bytes_received);
-// clang-format on
-
-RTCDataChannelStats::RTCDataChannelStats(
-    const std::string& id, int64_t timestamp_us)
-    : RTCDataChannelStats(std::string(id), timestamp_us) {
-}
-
-RTCDataChannelStats::RTCDataChannelStats(
-    std::string&& id, int64_t timestamp_us)
-    : RTCStats(std::move(id), timestamp_us),
-      label("label"),
-      protocol("protocol"),
-      datachannelid("datachannelid"),
-      state("state"),
-      messages_sent("messagesSent"),
-      bytes_sent("bytesSent"),
-      messages_received("messagesReceived"),
-      bytes_received("bytesReceived") {
-}
-
-RTCDataChannelStats::RTCDataChannelStats(
-    const RTCDataChannelStats& other)
-    : RTCStats(other.id(), other.timestamp_us()),
-      label(other.label),
-      protocol(other.protocol),
-      datachannelid(other.datachannelid),
-      state(other.state),
-      messages_sent(other.messages_sent),
-      bytes_sent(other.bytes_sent),
-      messages_received(other.messages_received),
-      bytes_received(other.bytes_received) {
-}
-
-RTCDataChannelStats::~RTCDataChannelStats() {
-}
-
-// clang-format off
-WEBRTC_RTCSTATS_IMPL(RTCIceCandidatePairStats, RTCStats, "candidate-pair",
-    &transport_id,
-    &local_candidate_id,
-    &remote_candidate_id,
-    &state,
-    &priority,
-    &nominated,
-    &writable,
-    &readable,
-    &bytes_sent,
-    &bytes_received,
-    &total_round_trip_time,
-    &current_round_trip_time,
-    &available_outgoing_bitrate,
-    &available_incoming_bitrate,
-    &requests_received,
-    &requests_sent,
-    &responses_received,
-    &responses_sent,
-    &retransmissions_received,
-    &retransmissions_sent,
-    &consent_requests_received,
-    &consent_requests_sent,
-    &consent_responses_received,
-    &consent_responses_sent);
-// clang-format on
-
-RTCIceCandidatePairStats::RTCIceCandidatePairStats(
-    const std::string& id, int64_t timestamp_us)
-    : RTCIceCandidatePairStats(std::string(id), timestamp_us) {
-}
-
-RTCIceCandidatePairStats::RTCIceCandidatePairStats(
-    std::string&& id, int64_t timestamp_us)
-    : RTCStats(std::move(id), timestamp_us),
-      transport_id("transportId"),
-      local_candidate_id("localCandidateId"),
-      remote_candidate_id("remoteCandidateId"),
-      state("state"),
-      priority("priority"),
-      nominated("nominated"),
-      writable("writable"),
-      readable("readable"),
-      bytes_sent("bytesSent"),
-      bytes_received("bytesReceived"),
-      total_round_trip_time("totalRoundTripTime"),
-      current_round_trip_time("currentRoundTripTime"),
-      available_outgoing_bitrate("availableOutgoingBitrate"),
-      available_incoming_bitrate("availableIncomingBitrate"),
-      requests_received("requestsReceived"),
-      requests_sent("requestsSent"),
-      responses_received("responsesReceived"),
-      responses_sent("responsesSent"),
-      retransmissions_received("retransmissionsReceived"),
-      retransmissions_sent("retransmissionsSent"),
-      consent_requests_received("consentRequestsReceived"),
-      consent_requests_sent("consentRequestsSent"),
-      consent_responses_received("consentResponsesReceived"),
-      consent_responses_sent("consentResponsesSent") {
-}
-
-RTCIceCandidatePairStats::RTCIceCandidatePairStats(
-    const RTCIceCandidatePairStats& other)
-    : RTCStats(other.id(), other.timestamp_us()),
-      transport_id(other.transport_id),
-      local_candidate_id(other.local_candidate_id),
-      remote_candidate_id(other.remote_candidate_id),
-      state(other.state),
-      priority(other.priority),
-      nominated(other.nominated),
-      writable(other.writable),
-      readable(other.readable),
-      bytes_sent(other.bytes_sent),
-      bytes_received(other.bytes_received),
-      total_round_trip_time(other.total_round_trip_time),
-      current_round_trip_time(other.current_round_trip_time),
-      available_outgoing_bitrate(other.available_outgoing_bitrate),
-      available_incoming_bitrate(other.available_incoming_bitrate),
-      requests_received(other.requests_received),
-      requests_sent(other.requests_sent),
-      responses_received(other.responses_received),
-      responses_sent(other.responses_sent),
-      retransmissions_received(other.retransmissions_received),
-      retransmissions_sent(other.retransmissions_sent),
-      consent_requests_received(other.consent_requests_received),
-      consent_requests_sent(other.consent_requests_sent),
-      consent_responses_received(other.consent_responses_received),
-      consent_responses_sent(other.consent_responses_sent) {
-}
-
-RTCIceCandidatePairStats::~RTCIceCandidatePairStats() {
-}
-
-// clang-format off
-WEBRTC_RTCSTATS_IMPL(RTCIceCandidateStats, RTCStats, "ice-candidate",
-    &transport_id,
-    &is_remote,
-    &ip,
-    &port,
-    &protocol,
-    &candidate_type,
-    &priority,
-    &url,
-    &deleted);
-// clang-format on
-
-RTCIceCandidateStats::RTCIceCandidateStats(
-    const std::string& id, int64_t timestamp_us, bool is_remote)
-    : RTCIceCandidateStats(std::string(id), timestamp_us, is_remote) {
-}
-
-RTCIceCandidateStats::RTCIceCandidateStats(
-    std::string&& id, int64_t timestamp_us, bool is_remote)
-    : RTCStats(std::move(id), timestamp_us),
-      transport_id("transportId"),
-      is_remote("isRemote", is_remote),
-      ip("ip"),
-      port("port"),
-      protocol("protocol"),
-      candidate_type("candidateType"),
-      priority("priority"),
-      url("url"),
-      deleted("deleted", false) {
-}
-
-RTCIceCandidateStats::RTCIceCandidateStats(const RTCIceCandidateStats& other)
-    : RTCStats(other.id(), other.timestamp_us()),
-      transport_id(other.transport_id),
-      is_remote(other.is_remote),
-      ip(other.ip),
-      port(other.port),
-      protocol(other.protocol),
-      candidate_type(other.candidate_type),
-      priority(other.priority),
-      url(other.url),
-      deleted(other.deleted) {
-}
-
-RTCIceCandidateStats::~RTCIceCandidateStats() {
-}
-
-const char RTCLocalIceCandidateStats::kType[] = "local-candidate";
-
-RTCLocalIceCandidateStats::RTCLocalIceCandidateStats(
-    const std::string& id, int64_t timestamp_us)
-    : RTCIceCandidateStats(id, timestamp_us, false) {
-}
-
-RTCLocalIceCandidateStats::RTCLocalIceCandidateStats(
-    std::string&& id, int64_t timestamp_us)
-    : RTCIceCandidateStats(std::move(id), timestamp_us, false) {
-}
-
-const char* RTCLocalIceCandidateStats::type() const {
-  return kType;
-}
-
-const char RTCRemoteIceCandidateStats::kType[] = "remote-candidate";
-
-RTCRemoteIceCandidateStats::RTCRemoteIceCandidateStats(
-    const std::string& id, int64_t timestamp_us)
-    : RTCIceCandidateStats(id, timestamp_us, true) {
-}
-
-RTCRemoteIceCandidateStats::RTCRemoteIceCandidateStats(
-    std::string&& id, int64_t timestamp_us)
-    : RTCIceCandidateStats(std::move(id), timestamp_us, true) {
-}
-
-const char* RTCRemoteIceCandidateStats::type() const {
-  return kType;
-}
-
-// clang-format off
-WEBRTC_RTCSTATS_IMPL(RTCMediaStreamStats, RTCStats, "stream",
-    &stream_identifier,
-    &track_ids);
-// clang-format on
-
-RTCMediaStreamStats::RTCMediaStreamStats(
-    const std::string& id, int64_t timestamp_us)
-    : RTCMediaStreamStats(std::string(id), timestamp_us) {
-}
-
-RTCMediaStreamStats::RTCMediaStreamStats(
-    std::string&& id, int64_t timestamp_us)
-    : RTCStats(std::move(id), timestamp_us),
-      stream_identifier("streamIdentifier"),
-      track_ids("trackIds") {
-}
-
-RTCMediaStreamStats::RTCMediaStreamStats(
-    const RTCMediaStreamStats& other)
-    : RTCStats(other.id(), other.timestamp_us()),
-      stream_identifier(other.stream_identifier),
-      track_ids(other.track_ids) {
-}
-
-RTCMediaStreamStats::~RTCMediaStreamStats() {
-}
-
-// clang-format off
-WEBRTC_RTCSTATS_IMPL(RTCMediaStreamTrackStats, RTCStats, "track",
-                     &track_identifier,
-                     &remote_source,
-                     &ended,
-                     &detached,
-                     &kind,
-                     &frame_width,
-                     &frame_height,
-                     &frames_per_second,
-                     &frames_sent,
-                     &frames_received,
-                     &frames_decoded,
-                     &frames_dropped,
-                     &frames_corrupted,
-                     &partial_frames_lost,
-                     &full_frames_lost,
-                     &audio_level,
-                     &total_audio_energy,
-                     &echo_return_loss,
-                     &echo_return_loss_enhancement,
-                     &total_samples_received,
-                     &total_samples_duration,
-                     &concealed_samples);
-// clang-format on
-
-RTCMediaStreamTrackStats::RTCMediaStreamTrackStats(
-    const std::string& id, int64_t timestamp_us, const char* kind)
-    : RTCMediaStreamTrackStats(std::string(id), timestamp_us, kind) {
-}
-
-RTCMediaStreamTrackStats::RTCMediaStreamTrackStats(std::string&& id,
-                                                   int64_t timestamp_us,
-                                                   const char* kind)
-    : RTCStats(std::move(id), timestamp_us),
-      track_identifier("trackIdentifier"),
-      remote_source("remoteSource"),
-      ended("ended"),
-      detached("detached"),
-      kind("kind", kind),
-      frame_width("frameWidth"),
-      frame_height("frameHeight"),
-      frames_per_second("framesPerSecond"),
-      frames_sent("framesSent"),
-      frames_received("framesReceived"),
-      frames_decoded("framesDecoded"),
-      frames_dropped("framesDropped"),
-      frames_corrupted("framesCorrupted"),
-      partial_frames_lost("partialFramesLost"),
-      full_frames_lost("fullFramesLost"),
-      audio_level("audioLevel"),
-      total_audio_energy("totalAudioEnergy"),
-      echo_return_loss("echoReturnLoss"),
-      echo_return_loss_enhancement("echoReturnLossEnhancement"),
-      total_samples_received("totalSamplesReceived"),
-      total_samples_duration("totalSamplesDuration"),
-      concealed_samples("concealedSamples") {
-  RTC_DCHECK(kind == RTCMediaStreamTrackKind::kAudio ||
-             kind == RTCMediaStreamTrackKind::kVideo);
-}
-
-RTCMediaStreamTrackStats::RTCMediaStreamTrackStats(
-    const RTCMediaStreamTrackStats& other)
-    : RTCStats(other.id(), other.timestamp_us()),
-      track_identifier(other.track_identifier),
-      remote_source(other.remote_source),
-      ended(other.ended),
-      detached(other.detached),
-      kind(other.kind),
-      frame_width(other.frame_width),
-      frame_height(other.frame_height),
-      frames_per_second(other.frames_per_second),
-      frames_sent(other.frames_sent),
-      frames_received(other.frames_received),
-      frames_decoded(other.frames_decoded),
-      frames_dropped(other.frames_dropped),
-      frames_corrupted(other.frames_corrupted),
-      partial_frames_lost(other.partial_frames_lost),
-      full_frames_lost(other.full_frames_lost),
-      audio_level(other.audio_level),
-      total_audio_energy(other.total_audio_energy),
-      echo_return_loss(other.echo_return_loss),
-      echo_return_loss_enhancement(other.echo_return_loss_enhancement),
-      total_samples_received(other.total_samples_received),
-      total_samples_duration(other.total_samples_duration),
-      concealed_samples(other.concealed_samples) {}
-
-RTCMediaStreamTrackStats::~RTCMediaStreamTrackStats() {
-}
-
-// clang-format off
-WEBRTC_RTCSTATS_IMPL(RTCPeerConnectionStats, RTCStats, "peer-connection",
-    &data_channels_opened,
-    &data_channels_closed);
-// clang-format on
-
-RTCPeerConnectionStats::RTCPeerConnectionStats(
-    const std::string& id, int64_t timestamp_us)
-    : RTCPeerConnectionStats(std::string(id), timestamp_us) {
-}
-
-RTCPeerConnectionStats::RTCPeerConnectionStats(
-    std::string&& id, int64_t timestamp_us)
-    : RTCStats(std::move(id), timestamp_us),
-      data_channels_opened("dataChannelsOpened"),
-      data_channels_closed("dataChannelsClosed") {
-}
-
-RTCPeerConnectionStats::RTCPeerConnectionStats(
-    const RTCPeerConnectionStats& other)
-    : RTCStats(other.id(), other.timestamp_us()),
-      data_channels_opened(other.data_channels_opened),
-      data_channels_closed(other.data_channels_closed) {
-}
-
-RTCPeerConnectionStats::~RTCPeerConnectionStats() {
-}
-
-// clang-format off
-WEBRTC_RTCSTATS_IMPL(RTCRTPStreamStats, RTCStats, "rtp",
-    &ssrc,
-    &associate_stats_id,
-    &is_remote,
-    &media_type,
-    &track_id,
-    &transport_id,
-    &codec_id,
-    &fir_count,
-    &pli_count,
-    &nack_count,
-    &sli_count,
-    &qp_sum);
-// clang-format on
-
-RTCRTPStreamStats::RTCRTPStreamStats(
-    const std::string& id, int64_t timestamp_us)
-    : RTCRTPStreamStats(std::string(id), timestamp_us) {
-}
-
-RTCRTPStreamStats::RTCRTPStreamStats(
-    std::string&& id, int64_t timestamp_us)
-    : RTCStats(std::move(id), timestamp_us),
-      ssrc("ssrc"),
-      associate_stats_id("associateStatsId"),
-      is_remote("isRemote", false),
-      media_type("mediaType"),
-      track_id("trackId"),
-      transport_id("transportId"),
-      codec_id("codecId"),
-      fir_count("firCount"),
-      pli_count("pliCount"),
-      nack_count("nackCount"),
-      sli_count("sliCount"),
-      qp_sum("qpSum") {
-}
-
-RTCRTPStreamStats::RTCRTPStreamStats(
-    const RTCRTPStreamStats& other)
-    : RTCStats(other.id(), other.timestamp_us()),
-      ssrc(other.ssrc),
-      associate_stats_id(other.associate_stats_id),
-      is_remote(other.is_remote),
-      media_type(other.media_type),
-      track_id(other.track_id),
-      transport_id(other.transport_id),
-      codec_id(other.codec_id),
-      fir_count(other.fir_count),
-      pli_count(other.pli_count),
-      nack_count(other.nack_count),
-      sli_count(other.sli_count),
-      qp_sum(other.qp_sum) {
-}
-
-RTCRTPStreamStats::~RTCRTPStreamStats() {
-}
-
-// clang-format off
-WEBRTC_RTCSTATS_IMPL(
-    RTCInboundRTPStreamStats, RTCRTPStreamStats, "inbound-rtp",
-    &packets_received,
-    &bytes_received,
-    &packets_lost,
-    &jitter,
-    &fraction_lost,
-    &round_trip_time,
-    &packets_discarded,
-    &packets_repaired,
-    &burst_packets_lost,
-    &burst_packets_discarded,
-    &burst_loss_count,
-    &burst_discard_count,
-    &burst_loss_rate,
-    &burst_discard_rate,
-    &gap_loss_rate,
-    &gap_discard_rate,
-    &frames_decoded);
-// clang-format on
-
-RTCInboundRTPStreamStats::RTCInboundRTPStreamStats(
-    const std::string& id, int64_t timestamp_us)
-    : RTCInboundRTPStreamStats(std::string(id), timestamp_us) {
-}
-
-RTCInboundRTPStreamStats::RTCInboundRTPStreamStats(
-    std::string&& id, int64_t timestamp_us)
-    : RTCRTPStreamStats(std::move(id), timestamp_us),
-      packets_received("packetsReceived"),
-      bytes_received("bytesReceived"),
-      packets_lost("packetsLost"),
-      jitter("jitter"),
-      fraction_lost("fractionLost"),
-      round_trip_time("roundTripTime"),
-      packets_discarded("packetsDiscarded"),
-      packets_repaired("packetsRepaired"),
-      burst_packets_lost("burstPacketsLost"),
-      burst_packets_discarded("burstPacketsDiscarded"),
-      burst_loss_count("burstLossCount"),
-      burst_discard_count("burstDiscardCount"),
-      burst_loss_rate("burstLossRate"),
-      burst_discard_rate("burstDiscardRate"),
-      gap_loss_rate("gapLossRate"),
-      gap_discard_rate("gapDiscardRate"),
-      frames_decoded("framesDecoded") {
-}
-
-RTCInboundRTPStreamStats::RTCInboundRTPStreamStats(
-    const RTCInboundRTPStreamStats& other)
-    : RTCRTPStreamStats(other),
-      packets_received(other.packets_received),
-      bytes_received(other.bytes_received),
-      packets_lost(other.packets_lost),
-      jitter(other.jitter),
-      fraction_lost(other.fraction_lost),
-      round_trip_time(other.round_trip_time),
-      packets_discarded(other.packets_discarded),
-      packets_repaired(other.packets_repaired),
-      burst_packets_lost(other.burst_packets_lost),
-      burst_packets_discarded(other.burst_packets_discarded),
-      burst_loss_count(other.burst_loss_count),
-      burst_discard_count(other.burst_discard_count),
-      burst_loss_rate(other.burst_loss_rate),
-      burst_discard_rate(other.burst_discard_rate),
-      gap_loss_rate(other.gap_loss_rate),
-      gap_discard_rate(other.gap_discard_rate),
-      frames_decoded(other.frames_decoded) {
-}
-
-RTCInboundRTPStreamStats::~RTCInboundRTPStreamStats() {
-}
-
-// clang-format off
-WEBRTC_RTCSTATS_IMPL(
-    RTCOutboundRTPStreamStats, RTCRTPStreamStats, "outbound-rtp",
-    &packets_sent,
-    &bytes_sent,
-    &target_bitrate,
-    &frames_encoded);
-// clang-format on
-
-RTCOutboundRTPStreamStats::RTCOutboundRTPStreamStats(
-    const std::string& id, int64_t timestamp_us)
-    : RTCOutboundRTPStreamStats(std::string(id), timestamp_us) {
-}
-
-RTCOutboundRTPStreamStats::RTCOutboundRTPStreamStats(
-    std::string&& id, int64_t timestamp_us)
-    : RTCRTPStreamStats(std::move(id), timestamp_us),
-      packets_sent("packetsSent"),
-      bytes_sent("bytesSent"),
-      target_bitrate("targetBitrate"),
-      frames_encoded("framesEncoded") {
-}
-
-RTCOutboundRTPStreamStats::RTCOutboundRTPStreamStats(
-    const RTCOutboundRTPStreamStats& other)
-    : RTCRTPStreamStats(other),
-      packets_sent(other.packets_sent),
-      bytes_sent(other.bytes_sent),
-      target_bitrate(other.target_bitrate),
-      frames_encoded(other.frames_encoded) {
-}
-
-RTCOutboundRTPStreamStats::~RTCOutboundRTPStreamStats() {
-}
-
-// clang-format off
-WEBRTC_RTCSTATS_IMPL(RTCTransportStats, RTCStats, "transport",
-    &bytes_sent,
-    &bytes_received,
-    &rtcp_transport_stats_id,
-    &dtls_state,
-    &selected_candidate_pair_id,
-    &local_certificate_id,
-    &remote_certificate_id);
-// clang-format on
-
-RTCTransportStats::RTCTransportStats(
-    const std::string& id, int64_t timestamp_us)
-    : RTCTransportStats(std::string(id), timestamp_us) {
-}
-
-RTCTransportStats::RTCTransportStats(
-    std::string&& id, int64_t timestamp_us)
-    : RTCStats(std::move(id), timestamp_us),
-      bytes_sent("bytesSent"),
-      bytes_received("bytesReceived"),
-      rtcp_transport_stats_id("rtcpTransportStatsId"),
-      dtls_state("dtlsState"),
-      selected_candidate_pair_id("selectedCandidatePairId"),
-      local_certificate_id("localCertificateId"),
-      remote_certificate_id("remoteCertificateId") {
-}
-
-RTCTransportStats::RTCTransportStats(
-    const RTCTransportStats& other)
-    : RTCStats(other.id(), other.timestamp_us()),
-      bytes_sent(other.bytes_sent),
-      bytes_received(other.bytes_received),
-      rtcp_transport_stats_id(other.rtcp_transport_stats_id),
-      dtls_state(other.dtls_state),
-      selected_candidate_pair_id(other.selected_candidate_pair_id),
-      local_certificate_id(other.local_certificate_id),
-      remote_certificate_id(other.remote_certificate_id) {
-}
-
-RTCTransportStats::~RTCTransportStats() {
-}
-
-}  // namespace webrtc
diff --git a/stats/rtcstats_unittest.cc b/stats/rtcstats_unittest.cc
deleted file mode 100644
index b4f82a7..0000000
--- a/stats/rtcstats_unittest.cc
+++ /dev/null
@@ -1,352 +0,0 @@
-/*
- *  Copyright 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/api/stats/rtcstats.h"
-
-#include <cmath>
-#include <cstring>
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/gunit.h"
-#include "webrtc/rtc_base/json.h"
-#include "webrtc/stats/test/rtcteststats.h"
-
-namespace webrtc {
-
-namespace {
-
-// JSON stores numbers as floating point numbers with 53 significant bits, which
-// amounts to about 15.95 decimal digits. Thus, when comparing large numbers
-// processed by JSON, that's all the precision we should expect.
-const double JSON_EPSILON = 1e-15;
-
-// We do this since Google Test doesn't support relative error.
-// This is computed as follows:
-// If |a - b| / |a| < EPS, then |a - b| < |a| * EPS, so |a| * EPS is the
-// maximum expected error.
-double GetExpectedError(const double expected_value) {
-  return JSON_EPSILON * fabs(expected_value);
-}
-
-}  // namespace
-
-class RTCChildStats : public RTCStats {
- public:
-  WEBRTC_RTCSTATS_DECL();
-
-  RTCChildStats(const std::string& id, int64_t timestamp_us)
-      : RTCStats(id, timestamp_us),
-        child_int("childInt") {}
-
-  RTCStatsMember<int32_t> child_int;
-};
-
-WEBRTC_RTCSTATS_IMPL(RTCChildStats, RTCStats, "child-stats",
-    &child_int);
-
-class RTCGrandChildStats : public RTCChildStats {
- public:
-  WEBRTC_RTCSTATS_DECL();
-
-  RTCGrandChildStats(const std::string& id, int64_t timestamp_us)
-      : RTCChildStats(id, timestamp_us),
-        grandchild_int("grandchildInt") {}
-
-  RTCStatsMember<int32_t> grandchild_int;
-};
-
-WEBRTC_RTCSTATS_IMPL(RTCGrandChildStats, RTCChildStats, "grandchild-stats",
-      &grandchild_int);
-
-TEST(RTCStatsTest, RTCStatsAndMembers) {
-  RTCTestStats stats("testId", 42);
-  EXPECT_EQ(stats.id(), "testId");
-  EXPECT_EQ(stats.timestamp_us(), static_cast<int64_t>(42));
-  std::vector<const RTCStatsMemberInterface*> members = stats.Members();
-  EXPECT_EQ(members.size(), static_cast<size_t>(14));
-  for (const RTCStatsMemberInterface* member : members) {
-    EXPECT_FALSE(member->is_defined());
-  }
-  stats.m_bool = true;
-  stats.m_int32 = 123;
-  stats.m_uint32 = 123;
-  stats.m_int64 = 123;
-  stats.m_uint64 = 123;
-  stats.m_double = 123.0;
-  stats.m_string = std::string("123");
-
-  std::vector<bool> sequence_bool;
-  sequence_bool.push_back(true);
-  std::vector<int32_t> sequence_int32;
-  sequence_int32.push_back(static_cast<int32_t>(1));
-  std::vector<uint32_t> sequence_uint32;
-  sequence_uint32.push_back(static_cast<uint32_t>(2));
-  std::vector<int64_t> sequence_int64;
-  sequence_int64.push_back(static_cast<int64_t>(3));
-  std::vector<uint64_t> sequence_uint64;
-  sequence_uint64.push_back(static_cast<uint64_t>(4));
-  std::vector<double> sequence_double;
-  sequence_double.push_back(5.0);
-  std::vector<std::string> sequence_string;
-  sequence_string.push_back(std::string("six"));
-
-  stats.m_sequence_bool = sequence_bool;
-  stats.m_sequence_int32 = sequence_int32;
-  stats.m_sequence_uint32 = sequence_uint32;
-  EXPECT_FALSE(stats.m_sequence_int64.is_defined());
-  stats.m_sequence_int64 = sequence_int64;
-  stats.m_sequence_uint64 = sequence_uint64;
-  stats.m_sequence_double = sequence_double;
-  stats.m_sequence_string = sequence_string;
-  for (const RTCStatsMemberInterface* member : members) {
-    EXPECT_TRUE(member->is_defined());
-  }
-  EXPECT_EQ(*stats.m_bool, true);
-  EXPECT_EQ(*stats.m_int32, static_cast<int32_t>(123));
-  EXPECT_EQ(*stats.m_uint32, static_cast<uint32_t>(123));
-  EXPECT_EQ(*stats.m_int64, static_cast<int64_t>(123));
-  EXPECT_EQ(*stats.m_uint64, static_cast<uint64_t>(123));
-  EXPECT_EQ(*stats.m_double, 123.0);
-  EXPECT_EQ(*stats.m_string, std::string("123"));
-  EXPECT_EQ(*stats.m_sequence_bool, sequence_bool);
-  EXPECT_EQ(*stats.m_sequence_int32, sequence_int32);
-  EXPECT_EQ(*stats.m_sequence_uint32, sequence_uint32);
-  EXPECT_EQ(*stats.m_sequence_int64, sequence_int64);
-  EXPECT_EQ(*stats.m_sequence_uint64, sequence_uint64);
-  EXPECT_EQ(*stats.m_sequence_double, sequence_double);
-  EXPECT_EQ(*stats.m_sequence_string, sequence_string);
-
-  int32_t numbers[] = { 4, 8, 15, 16, 23, 42 };
-  std::vector<int32_t> numbers_sequence(&numbers[0], &numbers[6]);
-  stats.m_sequence_int32->clear();
-  stats.m_sequence_int32->insert(stats.m_sequence_int32->end(),
-                                 numbers_sequence.begin(),
-                                 numbers_sequence.end());
-  EXPECT_EQ(*stats.m_sequence_int32, numbers_sequence);
-}
-
-TEST(RTCStatsTest, EqualityOperator) {
-  RTCTestStats empty_stats("testId", 123);
-  EXPECT_EQ(empty_stats, empty_stats);
-
-  RTCTestStats stats_with_all_values = empty_stats;
-  stats_with_all_values.m_bool = true;
-  stats_with_all_values.m_int32 = 123;
-  stats_with_all_values.m_uint32 = 123;
-  stats_with_all_values.m_int64 = 123;
-  stats_with_all_values.m_uint64 = 123;
-  stats_with_all_values.m_double = 123.0;
-  stats_with_all_values.m_string = "123";
-  stats_with_all_values.m_sequence_bool = std::vector<bool>();
-  stats_with_all_values.m_sequence_int32 = std::vector<int32_t>();
-  stats_with_all_values.m_sequence_uint32 = std::vector<uint32_t>();
-  stats_with_all_values.m_sequence_int64 = std::vector<int64_t>();
-  stats_with_all_values.m_sequence_uint64 = std::vector<uint64_t>();
-  stats_with_all_values.m_sequence_double = std::vector<double>();
-  stats_with_all_values.m_sequence_string = std::vector<std::string>();
-  EXPECT_NE(stats_with_all_values, empty_stats);
-  EXPECT_EQ(stats_with_all_values, stats_with_all_values);
-  EXPECT_NE(stats_with_all_values.m_int32, stats_with_all_values.m_uint32);
-
-  RTCTestStats one_member_different[] = {
-    stats_with_all_values, stats_with_all_values, stats_with_all_values,
-    stats_with_all_values, stats_with_all_values, stats_with_all_values,
-    stats_with_all_values, stats_with_all_values, stats_with_all_values,
-    stats_with_all_values, stats_with_all_values, stats_with_all_values,
-    stats_with_all_values, stats_with_all_values,
-  };
-  for (size_t i = 0; i < 14; ++i) {
-    EXPECT_EQ(stats_with_all_values, one_member_different[i]);
-  }
-  one_member_different[0].m_bool = false;
-  one_member_different[1].m_int32 = 321;
-  one_member_different[2].m_uint32 = 321;
-  one_member_different[3].m_int64 = 321;
-  one_member_different[4].m_uint64 = 321;
-  one_member_different[5].m_double = 321.0;
-  one_member_different[6].m_string = "321";
-  one_member_different[7].m_sequence_bool->push_back(false);
-  one_member_different[8].m_sequence_int32->push_back(321);
-  one_member_different[9].m_sequence_uint32->push_back(321);
-  one_member_different[10].m_sequence_int64->push_back(321);
-  one_member_different[11].m_sequence_uint64->push_back(321);
-  one_member_different[12].m_sequence_double->push_back(321.0);
-  one_member_different[13].m_sequence_string->push_back("321");
-  for (size_t i = 0; i < 14; ++i) {
-    EXPECT_NE(stats_with_all_values, one_member_different[i]);
-  }
-
-  RTCTestStats empty_stats_different_id("testId2", 123);
-  EXPECT_NE(empty_stats, empty_stats_different_id);
-  RTCTestStats empty_stats_different_timestamp("testId", 321);
-  EXPECT_EQ(empty_stats, empty_stats_different_timestamp);
-
-  RTCChildStats child("childId", 42);
-  RTCGrandChildStats grandchild("grandchildId", 42);
-  EXPECT_NE(child, grandchild);
-
-  RTCChildStats stats_with_defined_member("leId", 0);
-  stats_with_defined_member.child_int = 0;
-  RTCChildStats stats_with_undefined_member("leId", 0);
-  EXPECT_NE(stats_with_defined_member, stats_with_undefined_member);
-  EXPECT_NE(stats_with_undefined_member, stats_with_defined_member);
-}
-
-TEST(RTCStatsTest, RTCStatsGrandChild) {
-  RTCGrandChildStats stats("grandchild", 0.0);
-  stats.child_int = 1;
-  stats.grandchild_int = 2;
-  int32_t sum = 0;
-  for (const RTCStatsMemberInterface* member : stats.Members()) {
-    sum += *member->cast_to<const RTCStatsMember<int32_t>>();
-  }
-  EXPECT_EQ(sum, static_cast<int32_t>(3));
-
-  std::unique_ptr<RTCStats> copy_ptr = stats.copy();
-  const RTCGrandChildStats& copy = copy_ptr->cast_to<RTCGrandChildStats>();
-  EXPECT_EQ(*copy.child_int, *stats.child_int);
-  EXPECT_EQ(*copy.grandchild_int, *stats.grandchild_int);
-}
-
-TEST(RTCStatsTest, RTCStatsPrintsValidJson) {
-  std::string id = "statsId";
-  int timestamp = 42;
-  bool m_bool = true;
-  int m_int32 = 123;
-  int64_t m_int64 = 1234567890123456499L;
-  double m_double = 123.4567890123456499;
-  std::string m_string = "123";
-
-  std::vector<bool> sequence_bool;
-  std::vector<int32_t> sequence_int32;
-  sequence_int32.push_back(static_cast<int32_t>(1));
-  std::vector<int64_t> sequence_int64;
-  sequence_int64.push_back(static_cast<int64_t>(-1234567890123456499L));
-  sequence_int64.push_back(static_cast<int64_t>(1));
-  sequence_int64.push_back(static_cast<int64_t>(1234567890123456499L));
-  std::vector<double> sequence_double;
-  sequence_double.push_back(123.4567890123456499);
-  sequence_double.push_back(1234567890123.456499);
-  std::vector<std::string> sequence_string;
-  sequence_string.push_back(std::string("four"));
-
-  RTCTestStats stats(id, timestamp);
-  stats.m_bool = m_bool;
-  stats.m_int32 = m_int32;
-  stats.m_int64 = m_int64;
-  stats.m_double = m_double;
-  stats.m_string = m_string;
-  stats.m_sequence_bool = sequence_bool;
-  stats.m_sequence_int32 = sequence_int32;
-  stats.m_sequence_int64 = sequence_int64;
-  stats.m_sequence_double = sequence_double;
-  stats.m_sequence_string = sequence_string;
-
-  Json::Value json_output;
-  EXPECT_TRUE(Json::Reader().parse(stats.ToJson(), json_output));
-
-  EXPECT_TRUE(rtc::GetStringFromJsonObject(json_output, "id", &id));
-  EXPECT_TRUE(rtc::GetIntFromJsonObject(json_output, "timestamp", &timestamp));
-  EXPECT_TRUE(rtc::GetBoolFromJsonObject(json_output, "mBool", &m_bool));
-  EXPECT_TRUE(rtc::GetIntFromJsonObject(json_output, "mInt32", &m_int32));
-  EXPECT_TRUE(rtc::GetDoubleFromJsonObject(json_output, "mDouble", &m_double));
-  EXPECT_TRUE(rtc::GetStringFromJsonObject(json_output, "mString", &m_string));
-
-  Json::Value json_array;
-
-  EXPECT_TRUE(
-      rtc::GetValueFromJsonObject(json_output, "mSequenceBool", &json_array));
-  EXPECT_TRUE(rtc::JsonArrayToBoolVector(json_array, &sequence_bool));
-
-  EXPECT_TRUE(
-      rtc::GetValueFromJsonObject(json_output, "mSequenceInt32", &json_array));
-  EXPECT_TRUE(rtc::JsonArrayToIntVector(json_array, &sequence_int32));
-
-  EXPECT_TRUE(
-      rtc::GetValueFromJsonObject(json_output, "mSequenceDouble", &json_array));
-  EXPECT_TRUE(rtc::JsonArrayToDoubleVector(json_array, &sequence_double));
-
-  EXPECT_TRUE(
-      rtc::GetValueFromJsonObject(json_output, "mSequenceString", &json_array));
-  EXPECT_TRUE(rtc::JsonArrayToStringVector(json_array, &sequence_string));
-
-  EXPECT_EQ(id, stats.id());
-  EXPECT_EQ(timestamp, stats.timestamp_us());
-  EXPECT_EQ(m_bool, *stats.m_bool);
-  EXPECT_EQ(m_int32, *stats.m_int32);
-  EXPECT_EQ(m_string, *stats.m_string);
-  EXPECT_EQ(sequence_bool, *stats.m_sequence_bool);
-  EXPECT_EQ(sequence_int32, *stats.m_sequence_int32);
-  EXPECT_EQ(sequence_string, *stats.m_sequence_string);
-
-  EXPECT_NEAR(m_double, *stats.m_double, GetExpectedError(*stats.m_double));
-
-  EXPECT_EQ(sequence_double.size(), stats.m_sequence_double->size());
-  for (size_t i = 0; i < stats.m_sequence_double->size(); ++i) {
-    EXPECT_NEAR(sequence_double[i], stats.m_sequence_double->at(i),
-                GetExpectedError(stats.m_sequence_double->at(i)));
-  }
-
-  // We read mInt64 as double since JSON stores all numbers as doubles, so there
-  // is not enough precision to represent large numbers.
-  double m_int64_as_double;
-  std::vector<double> sequence_int64_as_double;
-
-  EXPECT_TRUE(
-      rtc::GetDoubleFromJsonObject(json_output, "mInt64", &m_int64_as_double));
-
-  EXPECT_TRUE(
-      rtc::GetValueFromJsonObject(json_output, "mSequenceInt64", &json_array));
-  EXPECT_TRUE(
-      rtc::JsonArrayToDoubleVector(json_array, &sequence_int64_as_double));
-
-  double stats_m_int64_as_double = static_cast<double>(*stats.m_int64);
-  EXPECT_NEAR(m_int64_as_double, stats_m_int64_as_double,
-              GetExpectedError(stats_m_int64_as_double));
-
-  EXPECT_EQ(sequence_int64_as_double.size(), stats.m_sequence_int64->size());
-  for (size_t i = 0; i < stats.m_sequence_int64->size(); ++i) {
-    const double stats_value_as_double =
-        static_cast<double>((*stats.m_sequence_int64)[i]);
-    EXPECT_NEAR(sequence_int64_as_double[i], stats_value_as_double,
-                GetExpectedError(stats_value_as_double));
-  }
-
-  // Neither stats.m_uint32 nor stats.m_uint64 are defined, so "mUint64" and
-  // "mUint32" should not be part of the generated JSON object.
-  int m_uint32;
-  int m_uint64;
-  EXPECT_FALSE(stats.m_uint32.is_defined());
-  EXPECT_FALSE(stats.m_uint64.is_defined());
-  EXPECT_FALSE(rtc::GetIntFromJsonObject(json_output, "mUint32", &m_uint32));
-  EXPECT_FALSE(rtc::GetIntFromJsonObject(json_output, "mUint64", &m_uint64));
-
-  std::cout << stats.ToJson() << std::endl;
-}
-
-// Death tests.
-// Disabled on Android because death tests misbehave on Android, see
-// base/test/gtest_util.h.
-#if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
-
-TEST(RTCStatsDeathTest, ValueOfUndefinedMember) {
-  RTCTestStats stats("testId", 0.0);
-  EXPECT_FALSE(stats.m_int32.is_defined());
-  EXPECT_DEATH(*stats.m_int32, "");
-}
-
-TEST(RTCStatsDeathTest, InvalidCasting) {
-  RTCGrandChildStats stats("grandchild", 0.0);
-  EXPECT_DEATH(stats.cast_to<RTCChildStats>(), "");
-}
-
-#endif  // RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
-
-}  // namespace webrtc
diff --git a/stats/rtcstatsreport.cc b/stats/rtcstatsreport.cc
deleted file mode 100644
index 322d536..0000000
--- a/stats/rtcstatsreport.cc
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- *  Copyright 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/api/stats/rtcstatsreport.h"
-
-#include <sstream>
-
-namespace webrtc {
-
-RTCStatsReport::ConstIterator::ConstIterator(
-    const rtc::scoped_refptr<const RTCStatsReport>& report,
-    StatsMap::const_iterator it)
-    : report_(report),
-      it_(it) {
-}
-
-RTCStatsReport::ConstIterator::ConstIterator(const ConstIterator&& other)
-    : report_(std::move(other.report_)),
-      it_(std::move(other.it_)) {
-}
-
-RTCStatsReport::ConstIterator::~ConstIterator() {
-}
-
-RTCStatsReport::ConstIterator& RTCStatsReport::ConstIterator::operator++() {
-  ++it_;
-  return *this;
-}
-
-RTCStatsReport::ConstIterator& RTCStatsReport::ConstIterator::operator++(int) {
-  return ++(*this);
-}
-
-const RTCStats& RTCStatsReport::ConstIterator::operator*() const {
-  return *it_->second.get();
-}
-
-const RTCStats* RTCStatsReport::ConstIterator::operator->() const {
-  return it_->second.get();
-}
-
-bool RTCStatsReport::ConstIterator::operator==(
-    const RTCStatsReport::ConstIterator& other) const {
-  return it_ == other.it_;
-}
-
-bool RTCStatsReport::ConstIterator::operator!=(
-    const RTCStatsReport::ConstIterator& other) const {
-  return !(*this == other);
-}
-
-rtc::scoped_refptr<RTCStatsReport> RTCStatsReport::Create(
-    int64_t timestamp_us) {
-  return rtc::scoped_refptr<RTCStatsReport>(
-      new rtc::RefCountedObject<RTCStatsReport>(timestamp_us));
-}
-
-RTCStatsReport::RTCStatsReport(int64_t timestamp_us)
-    : timestamp_us_(timestamp_us) {
-}
-
-RTCStatsReport::~RTCStatsReport() {
-}
-
-void RTCStatsReport::AddStats(std::unique_ptr<const RTCStats> stats) {
-  auto result = stats_.insert(std::make_pair(std::string(stats->id()),
-                              std::move(stats)));
-  RTC_DCHECK(result.second) <<
-      "A stats object with ID " << result.first->second->id() << " is already "
-      "present in this stats report.";
-}
-
-const RTCStats* RTCStatsReport::Get(const std::string& id) const {
-  StatsMap::const_iterator it = stats_.find(id);
-  if (it != stats_.cend())
-    return it->second.get();
-  return nullptr;
-}
-
-void RTCStatsReport::TakeMembersFrom(
-    rtc::scoped_refptr<RTCStatsReport> victim) {
-  for (StatsMap::iterator it = victim->stats_.begin();
-       it != victim->stats_.end(); ++it) {
-    AddStats(std::unique_ptr<const RTCStats>(it->second.release()));
-  }
-  victim->stats_.clear();
-}
-
-RTCStatsReport::ConstIterator RTCStatsReport::begin() const {
-  return ConstIterator(rtc::scoped_refptr<const RTCStatsReport>(this),
-                       stats_.cbegin());
-}
-
-RTCStatsReport::ConstIterator RTCStatsReport::end() const {
-  return ConstIterator(rtc::scoped_refptr<const RTCStatsReport>(this),
-                       stats_.cend());
-}
-
-std::string RTCStatsReport::ToJson() const {
-  std::ostringstream oss;
-  ConstIterator it = begin();
-  if (it != end()) {
-    oss << '[' << it->ToJson();
-    for (++it; it != end(); ++it) {
-      oss << "," << it->ToJson();
-    }
-    oss << ']';
-  }
-  return oss.str();
-}
-
-}  // namespace webrtc
diff --git a/stats/rtcstatsreport_unittest.cc b/stats/rtcstatsreport_unittest.cc
deleted file mode 100644
index 25ac3a2..0000000
--- a/stats/rtcstatsreport_unittest.cc
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
- *  Copyright 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/api/stats/rtcstatsreport.h"
-
-#include "webrtc/api/stats/rtcstats.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/gunit.h"
-
-namespace webrtc {
-
-class RTCTestStats1 : public RTCStats {
- public:
-  WEBRTC_RTCSTATS_DECL();
-
-  RTCTestStats1(const std::string& id, int64_t timestamp_us)
-      : RTCStats(id, timestamp_us),
-        integer("integer") {}
-
-  RTCStatsMember<int32_t> integer;
-};
-
-WEBRTC_RTCSTATS_IMPL(RTCTestStats1, RTCStats, "test-stats-1",
-    &integer);
-
-class RTCTestStats2 : public RTCStats {
- public:
-  WEBRTC_RTCSTATS_DECL();
-
-  RTCTestStats2(const std::string& id, int64_t timestamp_us)
-      : RTCStats(id, timestamp_us),
-        number("number") {}
-
-  RTCStatsMember<double> number;
-};
-
-WEBRTC_RTCSTATS_IMPL(RTCTestStats2, RTCStats, "test-stats-2",
-    &number);
-
-class RTCTestStats3 : public RTCStats {
- public:
-  WEBRTC_RTCSTATS_DECL();
-
-  RTCTestStats3(const std::string& id, int64_t timestamp_us)
-      : RTCStats(id, timestamp_us),
-        string("string") {}
-
-  RTCStatsMember<std::string> string;
-};
-
-WEBRTC_RTCSTATS_IMPL(RTCTestStats3, RTCStats, "test-stats-3",
-    &string);
-
-TEST(RTCStatsReport, AddAndGetStats) {
-  rtc::scoped_refptr<RTCStatsReport> report = RTCStatsReport::Create(1337);
-  EXPECT_EQ(report->timestamp_us(), 1337u);
-  EXPECT_EQ(report->size(), static_cast<size_t>(0));
-  report->AddStats(std::unique_ptr<RTCStats>(new RTCTestStats1("a0", 1)));
-  report->AddStats(std::unique_ptr<RTCStats>(new RTCTestStats1("a1", 2)));
-  report->AddStats(std::unique_ptr<RTCStats>(new RTCTestStats2("b0", 4)));
-  report->AddStats(std::unique_ptr<RTCStats>(new RTCTestStats2("b1", 8)));
-  report->AddStats(std::unique_ptr<RTCStats>(new RTCTestStats1("a2", 16)));
-  report->AddStats(std::unique_ptr<RTCStats>(new RTCTestStats2("b2", 32)));
-  EXPECT_EQ(report->size(), static_cast<size_t>(6));
-
-  EXPECT_EQ(report->Get("missing"), nullptr);
-  EXPECT_EQ(report->Get("a0")->id(), "a0");
-  EXPECT_EQ(report->Get("b2")->id(), "b2");
-
-  std::vector<const RTCTestStats1*> a = report->GetStatsOfType<RTCTestStats1>();
-  EXPECT_EQ(a.size(), static_cast<size_t>(3));
-  int64_t mask = 0;
-  for (const RTCTestStats1* stats : a)
-    mask |= stats->timestamp_us();
-  EXPECT_EQ(mask, static_cast<int64_t>(1 | 2 | 16));
-
-  std::vector<const RTCTestStats2*> b = report->GetStatsOfType<RTCTestStats2>();
-  EXPECT_EQ(b.size(), static_cast<size_t>(3));
-  mask = 0;
-  for (const RTCTestStats2* stats : b)
-    mask |= stats->timestamp_us();
-  EXPECT_EQ(mask, static_cast<int64_t>(4 | 8 | 32));
-
-  EXPECT_EQ(report->GetStatsOfType<RTCTestStats3>().size(),
-            static_cast<size_t>(0));
-}
-
-TEST(RTCStatsReport, StatsOrder) {
-  rtc::scoped_refptr<RTCStatsReport> report = RTCStatsReport::Create(1337);
-  EXPECT_EQ(report->timestamp_us(), 1337u);
-  report->AddStats(std::unique_ptr<RTCStats>(new RTCTestStats1("C", 2)));
-  report->AddStats(std::unique_ptr<RTCStats>(new RTCTestStats1("D", 3)));
-  report->AddStats(std::unique_ptr<RTCStats>(new RTCTestStats2("B", 1)));
-  report->AddStats(std::unique_ptr<RTCStats>(new RTCTestStats2("A", 0)));
-  report->AddStats(std::unique_ptr<RTCStats>(new RTCTestStats2("E", 4)));
-  report->AddStats(std::unique_ptr<RTCStats>(new RTCTestStats2("F", 5)));
-  report->AddStats(std::unique_ptr<RTCStats>(new RTCTestStats2("G", 6)));
-  int64_t i = 0;
-  for (const RTCStats& stats : *report) {
-    EXPECT_EQ(stats.timestamp_us(), i);
-    ++i;
-  }
-  EXPECT_EQ(i, static_cast<int64_t>(7));
-}
-
-TEST(RTCStatsReport, TakeMembersFrom) {
-  rtc::scoped_refptr<RTCStatsReport> a = RTCStatsReport::Create(1337);
-  EXPECT_EQ(a->timestamp_us(), 1337u);
-  a->AddStats(std::unique_ptr<RTCStats>(new RTCTestStats1("B", 1)));
-  a->AddStats(std::unique_ptr<RTCStats>(new RTCTestStats1("C", 2)));
-  a->AddStats(std::unique_ptr<RTCStats>(new RTCTestStats1("E", 4)));
-  rtc::scoped_refptr<RTCStatsReport> b = RTCStatsReport::Create(1338);
-  EXPECT_EQ(b->timestamp_us(), 1338u);
-  b->AddStats(std::unique_ptr<RTCStats>(new RTCTestStats1("A", 0)));
-  b->AddStats(std::unique_ptr<RTCStats>(new RTCTestStats1("D", 3)));
-  b->AddStats(std::unique_ptr<RTCStats>(new RTCTestStats1("F", 5)));
-
-  a->TakeMembersFrom(b);
-  EXPECT_EQ(b->size(), static_cast<size_t>(0));
-  int64_t i = 0;
-  for (const RTCStats& stats : *a) {
-    EXPECT_EQ(stats.timestamp_us(), i);
-    ++i;
-  }
-  EXPECT_EQ(i, static_cast<int64_t>(6));
-}
-
-}  // namespace webrtc
diff --git a/stats/test/rtcteststats.cc b/stats/test/rtcteststats.cc
deleted file mode 100644
index f60bd0f..0000000
--- a/stats/test/rtcteststats.cc
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- *  Copyright 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/stats/test/rtcteststats.h"
-
-namespace webrtc {
-
-WEBRTC_RTCSTATS_IMPL(RTCTestStats, RTCStats, "test-stats",
-    &m_bool,
-    &m_int32,
-    &m_uint32,
-    &m_int64,
-    &m_uint64,
-    &m_double,
-    &m_string,
-    &m_sequence_bool,
-    &m_sequence_int32,
-    &m_sequence_uint32,
-    &m_sequence_int64,
-    &m_sequence_uint64,
-    &m_sequence_double,
-    &m_sequence_string);
-
-RTCTestStats::RTCTestStats(const std::string& id, int64_t timestamp_us)
-    : RTCStats(id, timestamp_us),
-      m_bool("mBool"),
-      m_int32("mInt32"),
-      m_uint32("mUint32"),
-      m_int64("mInt64"),
-      m_uint64("mUint64"),
-      m_double("mDouble"),
-      m_string("mString"),
-      m_sequence_bool("mSequenceBool"),
-      m_sequence_int32("mSequenceInt32"),
-      m_sequence_uint32("mSequenceUint32"),
-      m_sequence_int64("mSequenceInt64"),
-      m_sequence_uint64("mSequenceUint64"),
-      m_sequence_double("mSequenceDouble"),
-      m_sequence_string("mSequenceString") {
-}
-
-RTCTestStats::RTCTestStats(const RTCTestStats& other)
-    : RTCStats(other.id(), other.timestamp_us()),
-      m_bool(other.m_bool),
-      m_int32(other.m_int32),
-      m_uint32(other.m_uint32),
-      m_int64(other.m_int64),
-      m_uint64(other.m_uint64),
-      m_double(other.m_double),
-      m_string(other.m_string),
-      m_sequence_bool(other.m_sequence_bool),
-      m_sequence_int32(other.m_sequence_int32),
-      m_sequence_uint32(other.m_sequence_uint32),
-      m_sequence_int64(other.m_sequence_int64),
-      m_sequence_uint64(other.m_sequence_uint64),
-      m_sequence_double(other.m_sequence_double),
-      m_sequence_string(other.m_sequence_string) {
-}
-
-RTCTestStats::~RTCTestStats() {
-}
-
-}  // namespace webrtc
diff --git a/stats/test/rtcteststats.h b/stats/test/rtcteststats.h
deleted file mode 100644
index a0ac8a1..0000000
--- a/stats/test/rtcteststats.h
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- *  Copyright 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_STATS_TEST_RTCTESTSTATS_H_
-#define WEBRTC_STATS_TEST_RTCTESTSTATS_H_
-
-#include <string>
-#include <vector>
-
-#include "webrtc/api/stats/rtcstats.h"
-
-namespace webrtc {
-
-class RTCTestStats : public RTCStats {
- public:
-  WEBRTC_RTCSTATS_DECL();
-
-  RTCTestStats(const std::string& id, int64_t timestamp_us);
-  RTCTestStats(const RTCTestStats& other);
-  ~RTCTestStats() override;
-
-  RTCStatsMember<bool> m_bool;
-  RTCStatsMember<int32_t> m_int32;
-  RTCStatsMember<uint32_t> m_uint32;
-  RTCStatsMember<int64_t> m_int64;
-  RTCStatsMember<uint64_t> m_uint64;
-  RTCStatsMember<double> m_double;
-  RTCStatsMember<std::string> m_string;
-  RTCStatsMember<std::vector<bool>> m_sequence_bool;
-  RTCStatsMember<std::vector<int32_t>> m_sequence_int32;
-  RTCStatsMember<std::vector<uint32_t>> m_sequence_uint32;
-  RTCStatsMember<std::vector<int64_t>> m_sequence_int64;
-  RTCStatsMember<std::vector<uint64_t>> m_sequence_uint64;
-  RTCStatsMember<std::vector<double>> m_sequence_double;
-  RTCStatsMember<std::vector<std::string>> m_sequence_string;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_STATS_TEST_RTCTESTSTATS_H_
diff --git a/system_wrappers/BUILD.gn b/system_wrappers/BUILD.gn
deleted file mode 100644
index 29ee8b8..0000000
--- a/system_wrappers/BUILD.gn
+++ /dev/null
@@ -1,242 +0,0 @@
-# Copyright (c) 2014 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.
-
-if (is_android) {
-  import("//build/config/android/config.gni")
-  import("//build/config/android/rules.gni")
-}
-import("../webrtc.gni")
-
-rtc_static_library("system_wrappers") {
-  sources = [
-    "include/aligned_array.h",
-    "include/aligned_malloc.h",
-    "include/atomic32.h",
-    "include/clock.h",
-    "include/cpu_info.h",
-    "include/event_wrapper.h",
-    "include/file_wrapper.h",
-    "include/fix_interlocked_exchange_pointer_win.h",
-    "include/ntp_time.h",
-    "include/rtp_to_ntp_estimator.h",
-    "include/rw_lock_wrapper.h",
-    "include/sleep.h",
-    "include/static_instance.h",
-    "include/timestamp_extrapolator.h",
-    "include/trace.h",
-    "source/aligned_malloc.cc",
-    "source/atomic32_win.cc",
-    "source/clock.cc",
-    "source/cpu_features.cc",
-    "source/cpu_info.cc",
-    "source/event.cc",
-    "source/event_timer_posix.cc",
-    "source/event_timer_posix.h",
-    "source/event_timer_win.cc",
-    "source/event_timer_win.h",
-    "source/file_impl.cc",
-    "source/rtp_to_ntp_estimator.cc",
-    "source/rw_lock.cc",
-    "source/rw_lock_posix.cc",
-    "source/rw_lock_posix.h",
-    "source/rw_lock_win.cc",
-    "source/rw_lock_win.h",
-    "source/sleep.cc",
-    "source/timestamp_extrapolator.cc",
-    "source/trace_impl.cc",
-    "source/trace_impl.h",
-    "source/trace_posix.cc",
-    "source/trace_posix.h",
-    "source/trace_win.cc",
-    "source/trace_win.h",
-  ]
-
-  defines = []
-  libs = []
-  deps = [
-    "..:webrtc_common",
-  ]
-  public_deps = [
-    ":cpu_features_api",
-    ":field_trial_api",
-    ":metrics_api",
-  ]
-
-  if (is_android) {
-    sources += [
-      "include/logcat_trace_context.h",
-      "source/logcat_trace_context.cc",
-    ]
-
-    defines += [ "WEBRTC_THREAD_RR" ]
-
-    deps += [ ":cpu_features_android" ]
-
-    libs += [ "log" ]
-  }
-
-  if (is_linux) {
-    defines += [ "WEBRTC_THREAD_RR" ]
-
-    if (!build_with_chromium) {
-      deps += [ ":cpu_features_linux" ]
-    }
-
-    libs += [ "rt" ]
-  }
-
-  if (is_linux || is_android) {
-    sources += [ "source/atomic32_non_darwin_unix.cc" ]
-  }
-
-  if (is_ios || is_mac) {
-    defines += [ "WEBRTC_THREAD_RR" ]
-    sources += [ "source/atomic32_darwin.cc" ]
-  }
-
-  # TODO(jschuh): Bug 1348: fix this warning.
-  configs += [ "//build/config/compiler:no_size_t_to_int_warning" ]
-
-  if (is_win) {
-    libs += [ "winmm.lib" ]
-
-    cflags = [ "/wd4334" ]  # Ignore warning on shift operator promotion.
-
-    # Windows needs ../rtc_base:rtc_base due to include of
-    # webrtc/rtc_base/win32.h in source/clock.cc.
-    # TODO(kjellander): Remove (bugs.webrtc.org/6828)
-    deps += [ "../rtc_base:rtc_base" ]
-  }
-
-  if (is_win && is_clang) {
-    # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-    suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-  }
-
-  deps += [ "../rtc_base:rtc_base_approved" ]
-}
-
-rtc_source_set("cpu_features_api") {
-  sources = [
-    "include/cpu_features_wrapper.h",
-  ]
-  deps = [
-    "..:webrtc_common",
-  ]
-}
-
-rtc_source_set("asm_defines") {
-  sources = [
-    "include/asm_defines.h",
-  ]
-}
-
-rtc_source_set("field_trial_api") {
-  sources = [
-    "include/field_trial.h",
-  ]
-}
-
-rtc_source_set("metrics_api") {
-  sources = [
-    "include/metrics.h",
-  ]
-  deps = [
-    "..:webrtc_common",
-    "../rtc_base:rtc_base_approved",
-  ]
-}
-
-rtc_static_library("field_trial_default") {
-  sources = [
-    "include/field_trial_default.h",
-    "source/field_trial_default.cc",
-  ]
-  deps = [
-    ":field_trial_api",
-  ]
-}
-
-rtc_static_library("metrics_default") {
-  sources = [
-    "include/metrics_default.h",
-    "source/metrics_default.cc",
-  ]
-  deps = [
-    ":metrics_api",
-    "../rtc_base:rtc_base_approved",
-  ]
-}
-
-group("system_wrappers_default") {
-  deps = [
-    ":field_trial_default",
-    ":metrics_default",
-    ":system_wrappers",
-  ]
-}
-
-if (is_android) {
-  rtc_static_library("cpu_features_android") {
-    sources = [
-      "source/cpu_features_android.c",
-    ]
-
-    deps = [
-      "//third_party/android_tools:cpu_features",
-    ]
-  }
-}
-
-if (is_linux) {
-  rtc_static_library("cpu_features_linux") {
-    sources = [
-      "source/cpu_features_linux.c",
-    ]
-    deps = [
-      ":cpu_features_api",
-    ]
-  }
-}
-
-if (rtc_include_tests) {
-  rtc_test("system_wrappers_unittests") {
-    testonly = true
-    sources = [
-      "source/aligned_array_unittest.cc",
-      "source/aligned_malloc_unittest.cc",
-      "source/clock_unittest.cc",
-      "source/event_timer_posix_unittest.cc",
-      "source/metrics_default_unittest.cc",
-      "source/metrics_unittest.cc",
-      "source/ntp_time_unittest.cc",
-      "source/rtp_to_ntp_estimator_unittest.cc",
-    ]
-    configs += [ "//build/config/compiler:no_size_t_to_int_warning" ]
-
-    if (!build_with_chromium && is_clang) {
-      # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-    }
-
-    deps = [
-      ":metrics_default",
-      ":system_wrappers",
-      "..:webrtc_common",
-      "../rtc_base:rtc_base_approved",
-      "../test:test_main",
-      "//testing/gtest",
-    ]
-
-    if (is_android) {
-      deps += [ "//testing/android/native_test:native_test_support" ]
-
-      shard_timeout = 900
-    }
-  }
-}
diff --git a/system_wrappers/DEPS b/system_wrappers/DEPS
deleted file mode 100644
index f1bede5..0000000
--- a/system_wrappers/DEPS
+++ /dev/null
@@ -1,3 +0,0 @@
-include_rules = [
-]
-
diff --git a/system_wrappers/OWNERS b/system_wrappers/OWNERS
deleted file mode 100644
index ca99100..0000000
--- a/system_wrappers/OWNERS
+++ /dev/null
@@ -1,10 +0,0 @@
-perkj@webrtc.org
-henrika@webrtc.org
-henrikg@webrtc.org
-mflodman@webrtc.org
-niklas.enbom@webrtc.org
-
-# These are for the common case of adding or renaming files. If you're doing
-# structural changes, please get a review from a reviewer in this file.
-per-file *.gn=*
-per-file *.gni=*
diff --git a/system_wrappers/include/aligned_array.h b/system_wrappers/include/aligned_array.h
deleted file mode 100644
index 7cc1c02..0000000
--- a/system_wrappers/include/aligned_array.h
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- *  Copyright (c) 2014 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_SYSTEM_WRAPPERS_INCLUDE_ALIGNED_ARRAY_
-#define WEBRTC_SYSTEM_WRAPPERS_INCLUDE_ALIGNED_ARRAY_
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/system_wrappers/include/aligned_malloc.h"
-
-namespace webrtc {
-
-// Wrapper class for aligned arrays. Every row (and the first dimension) are
-// aligned to the given byte alignment.
-template<typename T> class AlignedArray {
- public:
-  AlignedArray(size_t rows, size_t cols, size_t alignment)
-      : rows_(rows),
-        cols_(cols) {
-    RTC_CHECK_GT(alignment, 0);
-    head_row_ = static_cast<T**>(AlignedMalloc(rows_ * sizeof(*head_row_),
-                                               alignment));
-    for (size_t i = 0; i < rows_; ++i) {
-      head_row_[i] = static_cast<T*>(AlignedMalloc(cols_ * sizeof(**head_row_),
-                                                   alignment));
-    }
-  }
-
-  ~AlignedArray() {
-    for (size_t i = 0; i < rows_; ++i) {
-      AlignedFree(head_row_[i]);
-    }
-    AlignedFree(head_row_);
-  }
-
-  T* const* Array() {
-    return head_row_;
-  }
-
-  const T* const* Array() const {
-    return head_row_;
-  }
-
-  T* Row(size_t row) {
-    RTC_CHECK_LE(row, rows_);
-    return head_row_[row];
-  }
-
-  const T* Row(size_t row) const {
-    RTC_CHECK_LE(row, rows_);
-    return head_row_[row];
-  }
-
-  T& At(size_t row, size_t col) {
-    RTC_CHECK_LE(col, cols_);
-    return Row(row)[col];
-  }
-
-  const T& At(size_t row, size_t col) const {
-    RTC_CHECK_LE(col, cols_);
-    return Row(row)[col];
-  }
-
-  size_t rows() const {
-    return rows_;
-  }
-
-  size_t cols() const {
-    return cols_;
-  }
-
- private:
-  size_t rows_;
-  size_t cols_;
-  T** head_row_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_SYSTEM_WRAPPERS_INCLUDE_ALIGNED_ARRAY_
diff --git a/system_wrappers/include/aligned_malloc.h b/system_wrappers/include/aligned_malloc.h
deleted file mode 100644
index bdd82cc..0000000
--- a/system_wrappers/include/aligned_malloc.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- *  Copyright (c) 2011 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_SYSTEM_WRAPPERS_INCLUDE_ALIGNED_MALLOC_H_
-#define WEBRTC_SYSTEM_WRAPPERS_INCLUDE_ALIGNED_MALLOC_H_
-
-// The functions declared here
-// 1) Allocates block of aligned memory.
-// 2) Re-calculates a pointer such that it is aligned to a higher or equal
-//    address.
-// Note: alignment must be a power of two. The alignment is in bytes.
-
-#include <stddef.h>
-
-namespace webrtc {
-
-// Returns a pointer to the first boundry of |alignment| bytes following the
-// address of |ptr|.
-// Note that there is no guarantee that the memory in question is available.
-// |ptr| has no requirements other than it can't be NULL.
-void* GetRightAlign(const void* ptr, size_t alignment);
-
-// Allocates memory of |size| bytes aligned on an |alignment| boundry.
-// The return value is a pointer to the memory. Note that the memory must
-// be de-allocated using AlignedFree.
-void* AlignedMalloc(size_t size, size_t alignment);
-// De-allocates memory created using the AlignedMalloc() API.
-void AlignedFree(void* mem_block);
-
-// Templated versions to facilitate usage of aligned malloc without casting
-// to and from void*.
-template<typename T>
-T* GetRightAlign(const T* ptr, size_t alignment) {
-  return reinterpret_cast<T*>(GetRightAlign(reinterpret_cast<const void*>(ptr),
-                                            alignment));
-}
-template<typename T>
-T* AlignedMalloc(size_t size, size_t alignment) {
-  return reinterpret_cast<T*>(AlignedMalloc(size, alignment));
-}
-
-// Deleter for use with unique_ptr. E.g., use as
-//   std::unique_ptr<Foo, AlignedFreeDeleter> foo;
-struct AlignedFreeDeleter {
-  inline void operator()(void* ptr) const {
-    AlignedFree(ptr);
-  }
-};
-
-}  // namespace webrtc
-
-#endif // WEBRTC_SYSTEM_WRAPPERS_INCLUDE_ALIGNED_MALLOC_H_
diff --git a/system_wrappers/include/asm_defines.h b/system_wrappers/include/asm_defines.h
deleted file mode 100644
index fe4c05e..0000000
--- a/system_wrappers/include/asm_defines.h
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- *  Copyright (c) 2012 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_SYSTEM_WRAPPERS_INCLUDE_ASM_DEFINES_H_
-#define WEBRTC_SYSTEM_WRAPPERS_INCLUDE_ASM_DEFINES_H_
-
-#if defined(__linux__) && defined(__ELF__)
-.section .note.GNU-stack,"",%progbits
-#endif
-
-// Define the macros used in ARM assembly code, so that for Mac or iOS builds
-// we add leading underscores for the function names.
-#ifdef __APPLE__
-.macro GLOBAL_FUNCTION name
-.global _\name
-.private_extern _\name
-.endm
-.macro DEFINE_FUNCTION name
-_\name:
-.endm
-.macro CALL_FUNCTION name
-bl _\name
-.endm
-.macro GLOBAL_LABEL name
-.global _\name
-.private_extern _\name
-.endm
-#else
-.macro GLOBAL_FUNCTION name
-.global \name
-.hidden \name
-.endm
-.macro DEFINE_FUNCTION name
-#if defined(__linux__) && defined(__ELF__)
-.type \name,%function
-#endif
-\name:
-.endm
-.macro CALL_FUNCTION name
-bl \name
-.endm
-.macro GLOBAL_LABEL name
-.global \name
-.hidden \name
-.endm
-#endif
-
-// With Apple's clang compiler, for instructions ldrb, strh, etc.,
-// the condition code is after the width specifier. Here we define
-// only the ones that are actually used in the assembly files.
-#if (defined __llvm__) && (defined __APPLE__)
-.macro streqh reg1, reg2, num
-strheq \reg1, \reg2, \num
-.endm
-#endif
-
-.text
-
-#endif  // WEBRTC_SYSTEM_WRAPPERS_INCLUDE_ASM_DEFINES_H_
diff --git a/system_wrappers/include/atomic32.h b/system_wrappers/include/atomic32.h
deleted file mode 100644
index ef3d576..0000000
--- a/system_wrappers/include/atomic32.h
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- *  Copyright (c) 2012 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.
- */
-
-// Atomic, system independent 32-bit integer.  Unless you know what you're
-// doing, use locks instead! :-)
-//
-// Note: assumes 32-bit (or higher) system
-#ifndef WEBRTC_SYSTEM_WRAPPERS_INCLUDE_ATOMIC32_H_
-#define WEBRTC_SYSTEM_WRAPPERS_INCLUDE_ATOMIC32_H_
-
-#include <stddef.h>
-
-#include "webrtc/common_types.h"
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace webrtc {
-
-// 32 bit atomic variable.  Note that this class relies on the compiler to
-// align the 32 bit value correctly (on a 32 bit boundary), so as long as you're
-// not doing things like reinterpret_cast over some custom allocated memory
-// without being careful with alignment, you should be fine.
-class Atomic32 {
- public:
-  Atomic32(int32_t initial_value = 0);
-  ~Atomic32();
-
-  // Prefix operator!
-  int32_t operator++();
-  int32_t operator--();
-
-  int32_t operator+=(int32_t value);
-  int32_t operator-=(int32_t value);
-
-  // Sets the value atomically to new_value if the value equals compare value.
-  // The function returns true if the exchange happened.
-  bool CompareExchange(int32_t new_value, int32_t compare_value);
-  int32_t Value() {
-    return *this += 0;
-  }
-
- private:
-  // Disable the + and - operator since it's unclear what these operations
-  // should do.
-  Atomic32 operator+(const Atomic32& other);
-  Atomic32 operator-(const Atomic32& other);
-
-  // Checks if |_value| is 32bit aligned.
-  inline bool Is32bitAligned() const {
-    return (reinterpret_cast<ptrdiff_t>(&value_) & 3) == 0;
-  }
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(Atomic32);
-
-  int32_t value_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_SYSTEM_WRAPPERS_INCLUDE_ATOMIC32_H_
diff --git a/system_wrappers/include/clock.h b/system_wrappers/include/clock.h
deleted file mode 100644
index 36721fa..0000000
--- a/system_wrappers/include/clock.h
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- *  Copyright (c) 2013 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_SYSTEM_WRAPPERS_INCLUDE_CLOCK_H_
-#define WEBRTC_SYSTEM_WRAPPERS_INCLUDE_CLOCK_H_
-
-#include <memory>
-
-#include "webrtc/system_wrappers/include/ntp_time.h"
-#include "webrtc/system_wrappers/include/rw_lock_wrapper.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-// January 1970, in NTP seconds.
-const uint32_t kNtpJan1970 = 2208988800UL;
-
-// Magic NTP fractional unit.
-const double kMagicNtpFractionalUnit = 4.294967296E+9;
-
-// A clock interface that allows reading of absolute and relative timestamps.
-class Clock {
- public:
-  virtual ~Clock() {}
-
-  // Return a timestamp in milliseconds relative to some arbitrary source; the
-  // source is fixed for this clock.
-  virtual int64_t TimeInMilliseconds() const = 0;
-
-  // Return a timestamp in microseconds relative to some arbitrary source; the
-  // source is fixed for this clock.
-  virtual int64_t TimeInMicroseconds() const = 0;
-
-  // Retrieve an NTP absolute timestamp.
-  virtual NtpTime CurrentNtpTime() const = 0;
-
-  // Retrieve an NTP absolute timestamp in milliseconds.
-  virtual int64_t CurrentNtpInMilliseconds() const = 0;
-
-  // Converts an NTP timestamp to a millisecond timestamp.
-  static int64_t NtpToMs(uint32_t seconds, uint32_t fractions) {
-    return NtpTime(seconds, fractions).ToMs();
-  }
-
-  // Returns an instance of the real-time system clock implementation.
-  static Clock* GetRealTimeClock();
-};
-
-class SimulatedClock : public Clock {
- public:
-  explicit SimulatedClock(int64_t initial_time_us);
-
-  ~SimulatedClock() override;
-
-  // Return a timestamp in milliseconds relative to some arbitrary source; the
-  // source is fixed for this clock.
-  int64_t TimeInMilliseconds() const override;
-
-  // Return a timestamp in microseconds relative to some arbitrary source; the
-  // source is fixed for this clock.
-  int64_t TimeInMicroseconds() const override;
-
-  // Retrieve an NTP absolute timestamp.
-  NtpTime CurrentNtpTime() const override;
-
-  // Converts an NTP timestamp to a millisecond timestamp.
-  int64_t CurrentNtpInMilliseconds() const override;
-
-  // Advance the simulated clock with a given number of milliseconds or
-  // microseconds.
-  void AdvanceTimeMilliseconds(int64_t milliseconds);
-  void AdvanceTimeMicroseconds(int64_t microseconds);
-
- private:
-  int64_t time_us_;
-  std::unique_ptr<RWLockWrapper> lock_;
-};
-
-};  // namespace webrtc
-
-#endif  // WEBRTC_SYSTEM_WRAPPERS_INCLUDE_CLOCK_H_
diff --git a/system_wrappers/include/cpu_features_wrapper.h b/system_wrappers/include/cpu_features_wrapper.h
deleted file mode 100644
index 9838d94..0000000
--- a/system_wrappers/include/cpu_features_wrapper.h
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- *  Copyright (c) 2011 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_SYSTEM_WRAPPERS_INCLUDE_CPU_FEATURES_WRAPPER_H_
-#define WEBRTC_SYSTEM_WRAPPERS_INCLUDE_CPU_FEATURES_WRAPPER_H_
-
-#if defined(__cplusplus) || defined(c_plusplus)
-extern "C" {
-#endif
-
-#include "webrtc/typedefs.h"
-
-// List of features in x86.
-typedef enum {
-  kSSE2,
-  kSSE3
-} CPUFeature;
-
-// List of features in ARM.
-enum {
-  kCPUFeatureARMv7       = (1 << 0),
-  kCPUFeatureVFPv3       = (1 << 1),
-  kCPUFeatureNEON        = (1 << 2),
-  kCPUFeatureLDREXSTREX  = (1 << 3)
-};
-
-typedef int (*WebRtc_CPUInfo)(CPUFeature feature);
-
-// Returns true if the CPU supports the feature.
-extern WebRtc_CPUInfo WebRtc_GetCPUInfo;
-
-// No CPU feature is available => straight C path.
-extern WebRtc_CPUInfo WebRtc_GetCPUInfoNoASM;
-
-// Return the features in an ARM device.
-// It detects the features in the hardware platform, and returns supported
-// values in the above enum definition as a bitmask.
-extern uint64_t WebRtc_GetCPUFeaturesARM(void);
-
-#if defined(__cplusplus) || defined(c_plusplus)
-}  // extern "C"
-#endif
-
-#endif // WEBRTC_SYSTEM_WRAPPERS_INCLUDE_CPU_FEATURES_WRAPPER_H_
diff --git a/system_wrappers/include/cpu_info.h b/system_wrappers/include/cpu_info.h
deleted file mode 100644
index 3c00d33..0000000
--- a/system_wrappers/include/cpu_info.h
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- *  Copyright (c) 2011 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_SYSTEM_WRAPPERS_INCLUDE_CPU_INFO_H_
-#define WEBRTC_SYSTEM_WRAPPERS_INCLUDE_CPU_INFO_H_
-
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-class CpuInfo {
- public:
-  static uint32_t DetectNumberOfCores();
-
- private:
-  CpuInfo() {}
-};
-
-}  // namespace webrtc
-
-#endif // WEBRTC_SYSTEM_WRAPPERS_INCLUDE_CPU_INFO_H_
diff --git a/system_wrappers/include/event_wrapper.h b/system_wrappers/include/event_wrapper.h
deleted file mode 100644
index cc3722b..0000000
--- a/system_wrappers/include/event_wrapper.h
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- *  Copyright (c) 2011 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_SYSTEM_WRAPPERS_INCLUDE_EVENT_WRAPPER_H_
-#define WEBRTC_SYSTEM_WRAPPERS_INCLUDE_EVENT_WRAPPER_H_
-
-namespace webrtc {
-enum EventTypeWrapper {
-  kEventSignaled = 1,
-  kEventError = 2,
-  kEventTimeout = 3
-};
-
-#define WEBRTC_EVENT_INFINITE 0xffffffff
-
-class EventTimerWrapper;
-
-class EventWrapper {
- public:
-  // Factory method. Constructor disabled.
-  static EventWrapper* Create();
-
-  virtual ~EventWrapper() {}
-
-  // Releases threads who are calling Wait() and has started waiting. Please
-  // note that a thread calling Wait() will not start waiting immediately.
-  // assumptions to the contrary is a very common source of issues in
-  // multithreaded programming.
-  // Set is sticky in the sense that it will release at least one thread
-  // either immediately or some time in the future.
-  virtual bool Set() = 0;
-
-  // Puts the calling thread into a wait state. The thread may be released
-  // by a Set() call depending on if other threads are waiting and if so on
-  // timing. The thread that was released will reset the event before leaving
-  // preventing more threads from being released. If multiple threads
-  // are waiting for the same Set(), only one (random) thread is guaranteed to
-  // be released. It is possible that multiple (random) threads are released
-  // Depending on timing.
-  //
-  // |max_time| is the maximum time to wait in milliseconds or
-  // WEBRTC_EVENT_INFINITE to wait infinitely.
-  virtual EventTypeWrapper Wait(unsigned long max_time) = 0;
-};
-
-class EventTimerWrapper : public EventWrapper {
- public:
-  static EventTimerWrapper* Create();
-
-  // Starts a timer that will call a non-sticky version of Set() either once
-  // or periodically. If the timer is periodic it ensures that there is no
-  // drift over time relative to the system clock.
-  //
-  // |time| is in milliseconds.
-  virtual bool StartTimer(bool periodic, unsigned long time) = 0;
-
-  virtual bool StopTimer() = 0;
-
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_SYSTEM_WRAPPERS_INCLUDE_EVENT_WRAPPER_H_
diff --git a/system_wrappers/include/field_trial.h b/system_wrappers/include/field_trial.h
deleted file mode 100644
index b94be2c..0000000
--- a/system_wrappers/include/field_trial.h
+++ /dev/null
@@ -1,75 +0,0 @@
-//
-// Copyright (c) 2014 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_SYSTEM_WRAPPERS_INCLUDE_FIELD_TRIAL_H_
-#define WEBRTC_SYSTEM_WRAPPERS_INCLUDE_FIELD_TRIAL_H_
-
-#include <string>
-
-// Field trials allow webrtc clients (such as Chrome) to turn on feature code
-// in binaries out in the field and gather information with that.
-//
-// WebRTC clients MUST provide an implementation of:
-//
-//   std::string webrtc::field_trial::FindFullName(const std::string& trial).
-//
-// Or link with a default one provided in:
-//
-//   system_wrappers/system_wrappers.gyp:field_trial_default
-//
-//
-// They are designed to wire up directly to chrome field trials and to speed up
-// developers by reducing the need to wire APIs to control whether a feature is
-// on/off. E.g. to experiment with a new method that could lead to a different
-// trade-off between CPU/bandwidth:
-//
-// 1 - Develop the feature with default behaviour off:
-//
-//   if (FieldTrial::FindFullName("WebRTCExperimenMethod2") == "Enabled")
-//     method2();
-//   else
-//     method1();
-//
-// 2 - Once the changes are rolled to chrome, the new code path can be
-//     controlled as normal chrome field trials.
-//
-// 3 - Evaluate the new feature and clean the code paths.
-//
-// Notes:
-//   - NOT every feature is a candidate to be controlled by this mechanism as
-//     it may require negotation between involved parties (e.g. SDP).
-//
-// TODO(andresp): since chrome --force-fieldtrials does not marks the trial
-//     as active it does not gets propaged to renderer process. For now one
-//     needs to push a config with start_active:true or run a local finch
-//     server.
-//
-// TODO(andresp): find out how to get bots to run tests with trials enabled.
-
-namespace webrtc {
-namespace field_trial {
-
-// Returns the group name chosen for the named trial, or the empty string
-// if the trial does not exists.
-//
-// Note: To keep things tidy append all the trial names with WebRTC.
-std::string FindFullName(const std::string& name);
-
-// Convenience method, returns true iff FindFullName(name) return a string that
-// starts with "Enabled".
-// TODO(tommi): Make sure all implementations support this.
-inline bool IsEnabled(const char* name) {
-  return FindFullName(name).find("Enabled") == 0;
-}
-
-}  // namespace field_trial
-}  // namespace webrtc
-
-#endif  // WEBRTC_SYSTEM_WRAPPERS_INCLUDE_FIELD_TRIAL_H_
diff --git a/system_wrappers/include/field_trial_default.h b/system_wrappers/include/field_trial_default.h
deleted file mode 100644
index 7417ced..0000000
--- a/system_wrappers/include/field_trial_default.h
+++ /dev/null
@@ -1,28 +0,0 @@
-//
-// Copyright (c) 2015 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_SYSTEM_WRAPPERS_INCLUDE_FIELD_TRIAL_DEFAULT_H_
-#define WEBRTC_SYSTEM_WRAPPERS_INCLUDE_FIELD_TRIAL_DEFAULT_H_
-
-namespace webrtc {
-namespace field_trial {
-
-// Optionally initialize field trial from a string.
-// This method can be called at most once before any other call into webrtc.
-// E.g. before the peer connection factory is constructed.
-// Note: trials_string must never be destroyed.
-void InitFieldTrialsFromString(const char* trials_string);
-
-const char* GetFieldTrialString();
-
-}  // namespace field_trial
-}  // namespace webrtc
-
-#endif  // WEBRTC_SYSTEM_WRAPPERS_INCLUDE_FIELD_TRIAL_DEFAULT_H_
diff --git a/system_wrappers/include/file_wrapper.h b/system_wrappers/include/file_wrapper.h
deleted file mode 100644
index 4fe5899..0000000
--- a/system_wrappers/include/file_wrapper.h
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- *  Copyright (c) 2011 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_SYSTEM_WRAPPERS_INCLUDE_FILE_WRAPPER_H_
-#define WEBRTC_SYSTEM_WRAPPERS_INCLUDE_FILE_WRAPPER_H_
-
-#include <stddef.h>
-#include <stdio.h>
-
-#include "webrtc/common_types.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/typedefs.h"
-
-// Implementation of an InStream and OutStream that can read (exclusive) or
-// write from/to a file.
-
-namespace webrtc {
-
-// TODO(tommi): Remove the base classes, rename to rtc::File and move to base.
-class FileWrapper : public InStream, public OutStream {
- public:
-  static const size_t kMaxFileNameSize = 1024;
-
-  // Factory methods.
-  // TODO(tommi): Remove Create().
-  static FileWrapper* Create();
-  static FileWrapper Open(const char* file_name_utf8, bool read_only);
-
-  FileWrapper(FILE* file, size_t max_size);
-  ~FileWrapper() override;
-
-  // Support for move semantics.
-  FileWrapper(FileWrapper&& other);
-  FileWrapper& operator=(FileWrapper&& other);
-
-  // Returns true if a file has been opened.
-  bool is_open() const { return file_ != nullptr; }
-
-  // Opens a file in read or write mode, decided by the read_only parameter.
-  bool OpenFile(const char* file_name_utf8, bool read_only);
-
-  // Initializes the wrapper from an existing handle.  The wrapper
-  // takes ownership of |handle| and closes it in CloseFile().
-  bool OpenFromFileHandle(FILE* handle);
-
-  void CloseFile();
-
-  // Limits the file size to |bytes|. Writing will fail after the cap
-  // is hit. Pass zero to use an unlimited size.
-  // TODO(tommi): Could we move this out into a separate class?
-  void SetMaxFileSize(size_t bytes);
-
-  // Flush any pending writes.  Note: Flushing when closing, is not required.
-  int Flush();
-
-  // Rewinds the file to the start.
-  int Rewind() override;
-  int Read(void* buf, size_t length) override;
-  bool Write(const void* buf, size_t length) override;
-
- private:
-  FileWrapper();
-
-  void CloseFileImpl();
-  int FlushImpl();
-
-  // TODO(tommi): Remove the lock.
-  rtc::CriticalSection lock_;
-
-  FILE* file_ = nullptr;
-  size_t position_ = 0;
-  size_t max_size_in_bytes_ = 0;
-
-  // Copying is not supported.
-  FileWrapper(const FileWrapper&) = delete;
-  FileWrapper& operator=(const FileWrapper&) = delete;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_SYSTEM_WRAPPERS_INCLUDE_FILE_WRAPPER_H_
diff --git a/system_wrappers/include/fix_interlocked_exchange_pointer_win.h b/system_wrappers/include/fix_interlocked_exchange_pointer_win.h
deleted file mode 100644
index 8fb32ef..0000000
--- a/system_wrappers/include/fix_interlocked_exchange_pointer_win.h
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- *  Copyright (c) 2013 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.
- */
-
-// Various inline functions and macros to fix compilation of 32 bit target
-// on MSVC with /Wp64 flag enabled.
-
-// The original code can be found here:
-// http://src.chromium.org/svn/trunk/src/base/fix_wp64.h
-
-#ifndef WEBRTC_SYSTEM_WRAPPERS_SOURCE_FIX_INTERLOCKED_EXCHANGE_POINTER_WINDOWS_H_
-#define WEBRTC_SYSTEM_WRAPPERS_SOURCE_FIX_INTERLOCKED_EXCHANGE_POINTER_WINDOWS_H_
-
-#include <windows.h>
-
-// Platform SDK fixes when building with /Wp64 for a 32 bits target.
-#if !defined(_WIN64) && defined(_Wp64)
-
-#ifdef InterlockedExchangePointer
-#undef InterlockedExchangePointer
-// The problem is that the macro provided for InterlockedExchangePointer() is
-// doing a (LONG) C-style cast that triggers invariably the warning C4312 when
-// building on 32 bits.
-inline void* InterlockedExchangePointer(void* volatile* target, void* value) {
-  return reinterpret_cast<void*>(static_cast<LONG_PTR>(InterlockedExchange(
-      reinterpret_cast<volatile LONG*>(target),
-      static_cast<LONG>(reinterpret_cast<LONG_PTR>(value)))));
-}
-#endif  // #ifdef InterlockedExchangePointer
-
-#endif // #if !defined(_WIN64) && defined(_Wp64)
-
-#endif // WEBRTC_SYSTEM_WRAPPERS_SOURCE_FIX_INTERLOCKED_EXCHANGE_POINTER_WINDOWS_H_
diff --git a/system_wrappers/include/logcat_trace_context.h b/system_wrappers/include/logcat_trace_context.h
deleted file mode 100644
index fc36386..0000000
--- a/system_wrappers/include/logcat_trace_context.h
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- *  Copyright (c) 2013 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_SYSTEM_WRAPPERS_INCLUDE_LOGCAT_TRACE_CONTEXT_H_
-#define WEBRTC_SYSTEM_WRAPPERS_INCLUDE_LOGCAT_TRACE_CONTEXT_H_
-
-#include "webrtc/system_wrappers/include/trace.h"
-
-#ifndef ANDROID
-#error This file only makes sense to include on Android!
-#endif
-
-namespace webrtc {
-
-// Scoped helper class for directing Traces to Android's logcat facility.  While
-// this object lives, Trace output will be sent to logcat.
-class LogcatTraceContext : public webrtc::TraceCallback {
- public:
-  LogcatTraceContext();
-  ~LogcatTraceContext() override;
-
-  // TraceCallback impl.
-  void Print(TraceLevel level, const char* message, int length) override;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_SYSTEM_WRAPPERS_INCLUDE_LOGCAT_TRACE_CONTEXT_H_
diff --git a/system_wrappers/include/metrics.h b/system_wrappers/include/metrics.h
deleted file mode 100644
index a10ee33..0000000
--- a/system_wrappers/include/metrics.h
+++ /dev/null
@@ -1,274 +0,0 @@
-//
-// Copyright (c) 2014 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_SYSTEM_WRAPPERS_INCLUDE_METRICS_H_
-#define WEBRTC_SYSTEM_WRAPPERS_INCLUDE_METRICS_H_
-
-#include <string>
-
-#include "webrtc/common_types.h"
-#include "webrtc/rtc_base/atomicops.h"
-#include "webrtc/rtc_base/checks.h"
-
-// Macros for allowing WebRTC clients (e.g. Chrome) to gather and aggregate
-// statistics.
-//
-// Histogram for counters.
-// RTC_HISTOGRAM_COUNTS(name, sample, min, max, bucket_count);
-//
-// Histogram for enumerators.
-// The boundary should be above the max enumerator sample.
-// RTC_HISTOGRAM_ENUMERATION(name, sample, boundary);
-//
-//
-// The macros use the methods HistogramFactoryGetCounts,
-// HistogramFactoryGetEnumeration and HistogramAdd.
-//
-// Therefore, WebRTC clients must either:
-//
-// - provide implementations of
-//   Histogram* webrtc::metrics::HistogramFactoryGetCounts(
-//       const std::string& name, int sample, int min, int max,
-//       int bucket_count);
-//   Histogram* webrtc::metrics::HistogramFactoryGetEnumeration(
-//       const std::string& name, int sample, int boundary);
-//   void webrtc::metrics::HistogramAdd(
-//       Histogram* histogram_pointer, const std::string& name, int sample);
-//
-// - or link with the default implementations (i.e.
-//   system_wrappers:metrics_default).
-//
-//
-// Example usage:
-//
-// RTC_HISTOGRAM_COUNTS("WebRTC.Video.NacksSent", nacks_sent, 1, 100000, 100);
-//
-// enum Types {
-//   kTypeX,
-//   kTypeY,
-//   kBoundary,
-// };
-//
-// RTC_HISTOGRAM_ENUMERATION("WebRTC.Types", kTypeX, kBoundary);
-//
-// NOTE: It is recommended to do the Chromium review for modifications to
-// histograms.xml before new metrics are committed to WebRTC.
-
-
-// Macros for adding samples to a named histogram.
-
-// Histogram for counters (exponentially spaced buckets).
-#define RTC_HISTOGRAM_COUNTS_100(name, sample) \
-  RTC_HISTOGRAM_COUNTS(name, sample, 1, 100, 50)
-
-#define RTC_HISTOGRAM_COUNTS_200(name, sample) \
-  RTC_HISTOGRAM_COUNTS(name, sample, 1, 200, 50)
-
-#define RTC_HISTOGRAM_COUNTS_500(name, sample) \
-  RTC_HISTOGRAM_COUNTS(name, sample, 1, 500, 50)
-
-#define RTC_HISTOGRAM_COUNTS_1000(name, sample) \
-  RTC_HISTOGRAM_COUNTS(name, sample, 1, 1000, 50)
-
-#define RTC_HISTOGRAM_COUNTS_10000(name, sample) \
-  RTC_HISTOGRAM_COUNTS(name, sample, 1, 10000, 50)
-
-#define RTC_HISTOGRAM_COUNTS_100000(name, sample) \
-  RTC_HISTOGRAM_COUNTS(name, sample, 1, 100000, 50)
-
-#define RTC_HISTOGRAM_COUNTS(name, sample, min, max, bucket_count) \
-  RTC_HISTOGRAM_COMMON_BLOCK(name, sample, \
-      webrtc::metrics::HistogramFactoryGetCounts(name, min, max, bucket_count))
-
-#define RTC_HISTOGRAM_COUNTS_LINEAR(name, sample, min, max, bucket_count)      \
-  RTC_HISTOGRAM_COMMON_BLOCK(name, sample,                                     \
-                             webrtc::metrics::HistogramFactoryGetCountsLinear( \
-                                 name, min, max, bucket_count))
-
-// Slow metrics: pointer to metric is acquired at each call and is not cached.
-//
-#define RTC_HISTOGRAM_COUNTS_SPARSE_100(name, sample) \
-  RTC_HISTOGRAM_COUNTS_SPARSE(name, sample, 1, 100, 50)
-
-#define RTC_HISTOGRAM_COUNTS_SPARSE_200(name, sample) \
-  RTC_HISTOGRAM_COUNTS_SPARSE(name, sample, 1, 200, 50)
-
-#define RTC_HISTOGRAM_COUNTS_SPARSE_500(name, sample) \
-  RTC_HISTOGRAM_COUNTS_SPARSE(name, sample, 1, 500, 50)
-
-#define RTC_HISTOGRAM_COUNTS_SPARSE_1000(name, sample) \
-  RTC_HISTOGRAM_COUNTS_SPARSE(name, sample, 1, 1000, 50)
-
-#define RTC_HISTOGRAM_COUNTS_SPARSE_10000(name, sample) \
-  RTC_HISTOGRAM_COUNTS_SPARSE(name, sample, 1, 10000, 50)
-
-#define RTC_HISTOGRAM_COUNTS_SPARSE_100000(name, sample) \
-  RTC_HISTOGRAM_COUNTS_SPARSE(name, sample, 1, 100000, 50)
-
-#define RTC_HISTOGRAM_COUNTS_SPARSE(name, sample, min, max, bucket_count) \
-  RTC_HISTOGRAM_COMMON_BLOCK_SLOW(name, sample, \
-      webrtc::metrics::HistogramFactoryGetCounts(name, min, max, bucket_count))
-
-// Histogram for percentage (evenly spaced buckets).
-#define RTC_HISTOGRAM_PERCENTAGE_SPARSE(name, sample) \
-  RTC_HISTOGRAM_ENUMERATION_SPARSE(name, sample, 101)
-
-// Histogram for booleans.
-#define RTC_HISTOGRAM_BOOLEAN_SPARSE(name, sample) \
-  RTC_HISTOGRAM_ENUMERATION_SPARSE(name, sample, 2)
-
-// Histogram for enumerators (evenly spaced buckets).
-// |boundary| should be above the max enumerator sample.
-#define RTC_HISTOGRAM_ENUMERATION_SPARSE(name, sample, boundary) \
-  RTC_HISTOGRAM_COMMON_BLOCK_SLOW(                               \
-      name, sample,                                              \
-      webrtc::metrics::HistogramFactoryGetEnumeration(name, boundary))
-
-// Histogram for percentage (evenly spaced buckets).
-#define RTC_HISTOGRAM_PERCENTAGE(name, sample) \
-  RTC_HISTOGRAM_ENUMERATION(name, sample, 101)
-
-// Histogram for booleans.
-#define RTC_HISTOGRAM_BOOLEAN(name, sample) \
-  RTC_HISTOGRAM_ENUMERATION(name, sample, 2)
-
-// Histogram for enumerators (evenly spaced buckets).
-// |boundary| should be above the max enumerator sample.
-#define RTC_HISTOGRAM_ENUMERATION(name, sample, boundary) \
-  RTC_HISTOGRAM_COMMON_BLOCK(name, sample, \
-      webrtc::metrics::HistogramFactoryGetEnumeration(name, boundary))
-
-// The name of the histogram should not vary.
-// TODO(asapersson): Consider changing string to const char*.
-#define RTC_HISTOGRAM_COMMON_BLOCK(constant_name, sample,                  \
-                                   factory_get_invocation)                 \
-  do {                                                                     \
-    static webrtc::metrics::Histogram* atomic_histogram_pointer = nullptr; \
-    webrtc::metrics::Histogram* histogram_pointer =                        \
-        rtc::AtomicOps::AcquireLoadPtr(&atomic_histogram_pointer);         \
-    if (!histogram_pointer) {                                              \
-      histogram_pointer = factory_get_invocation;                          \
-      webrtc::metrics::Histogram* prev_pointer =                           \
-          rtc::AtomicOps::CompareAndSwapPtr(                               \
-              &atomic_histogram_pointer,                                   \
-              static_cast<webrtc::metrics::Histogram*>(nullptr),           \
-              histogram_pointer);                                          \
-      RTC_DCHECK(prev_pointer == nullptr ||                                \
-                 prev_pointer == histogram_pointer);                       \
-    }                                                                      \
-    if (histogram_pointer) {                                               \
-      RTC_DCHECK_EQ(constant_name,                                         \
-                    webrtc::metrics::GetHistogramName(histogram_pointer))  \
-          << "The name should not vary.";                                  \
-      webrtc::metrics::HistogramAdd(histogram_pointer, sample);            \
-    }                                                                      \
-  } while (0)
-
-// Deprecated.
-// The histogram is constructed/found for each call.
-// May be used for histograms with infrequent updates.`
-#define RTC_HISTOGRAM_COMMON_BLOCK_SLOW(name, sample, factory_get_invocation) \
-  do {                                                                        \
-    webrtc::metrics::Histogram* histogram_pointer = factory_get_invocation;   \
-    if (histogram_pointer) {                                                  \
-      webrtc::metrics::HistogramAdd(histogram_pointer, sample);               \
-    }                                                                         \
-  } while (0)
-
-// Helper macros.
-// Macros for calling a histogram with varying name (e.g. when using a metric
-// in different modes such as real-time vs screenshare). Fast, because pointer
-// is cached. |index| should be different for different names. Allowed |index|
-// values are 0, 1, and 2.
-#define RTC_HISTOGRAMS_COUNTS_100(index, name, sample) \
-  RTC_HISTOGRAMS_COMMON(index, name, sample, \
-      RTC_HISTOGRAM_COUNTS(name, sample, 1, 100, 50))
-
-#define RTC_HISTOGRAMS_COUNTS_200(index, name, sample) \
-  RTC_HISTOGRAMS_COMMON(index, name, sample, \
-      RTC_HISTOGRAM_COUNTS(name, sample, 1, 200, 50))
-
-#define RTC_HISTOGRAMS_COUNTS_500(index, name, sample) \
-  RTC_HISTOGRAMS_COMMON(index, name, sample, \
-      RTC_HISTOGRAM_COUNTS(name, sample, 1, 500, 50))
-
-#define RTC_HISTOGRAMS_COUNTS_1000(index, name, sample) \
-  RTC_HISTOGRAMS_COMMON(index, name, sample, \
-      RTC_HISTOGRAM_COUNTS(name, sample, 1, 1000, 50))
-
-#define RTC_HISTOGRAMS_COUNTS_10000(index, name, sample) \
-  RTC_HISTOGRAMS_COMMON(index, name, sample, \
-      RTC_HISTOGRAM_COUNTS(name, sample, 1, 10000, 50))
-
-#define RTC_HISTOGRAMS_COUNTS_100000(index, name, sample) \
-  RTC_HISTOGRAMS_COMMON(index, name, sample, \
-      RTC_HISTOGRAM_COUNTS(name, sample, 1, 100000, 50))
-
-#define RTC_HISTOGRAMS_ENUMERATION(index, name, sample, boundary) \
-  RTC_HISTOGRAMS_COMMON(index, name, sample, \
-      RTC_HISTOGRAM_ENUMERATION(name, sample, boundary))
-
-#define RTC_HISTOGRAMS_PERCENTAGE(index, name, sample) \
-  RTC_HISTOGRAMS_COMMON(index, name, sample, \
-      RTC_HISTOGRAM_PERCENTAGE(name, sample))
-
-#define RTC_HISTOGRAMS_COMMON(index, name, sample, macro_invocation) \
-  do {                                                               \
-    switch (index) {                                                 \
-      case 0:                                                        \
-        macro_invocation;                                            \
-        break;                                                       \
-      case 1:                                                        \
-        macro_invocation;                                            \
-        break;                                                       \
-      case 2:                                                        \
-        macro_invocation;                                            \
-        break;                                                       \
-      default:                                                       \
-        RTC_NOTREACHED();                                            \
-    }                                                                \
-  } while (0)
-
-namespace webrtc {
-namespace metrics {
-
-// Time that should have elapsed for stats that are gathered once per call.
-enum { kMinRunTimeInSeconds = 10 };
-
-class Histogram;
-
-// Functions for getting pointer to histogram (constructs or finds the named
-// histogram).
-
-// Get histogram for counters.
-Histogram* HistogramFactoryGetCounts(
-    const std::string& name, int min, int max, int bucket_count);
-
-// Get histogram for counters with linear bucket spacing.
-Histogram* HistogramFactoryGetCountsLinear(const std::string& name,
-                                           int min,
-                                           int max,
-                                           int bucket_count);
-
-// Get histogram for enumerators.
-// |boundary| should be above the max enumerator sample.
-Histogram* HistogramFactoryGetEnumeration(
-    const std::string& name, int boundary);
-
-// Returns name of the histogram.
-const std::string& GetHistogramName(Histogram* histogram_pointer);
-
-// Function for adding a |sample| to a histogram.
-void HistogramAdd(Histogram* histogram_pointer, int sample);
-
-}  // namespace metrics
-}  // namespace webrtc
-
-#endif  // WEBRTC_SYSTEM_WRAPPERS_INCLUDE_METRICS_H_
diff --git a/system_wrappers/include/metrics_default.h b/system_wrappers/include/metrics_default.h
deleted file mode 100644
index e262198..0000000
--- a/system_wrappers/include/metrics_default.h
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- *  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_SYSTEM_WRAPPERS_INCLUDE_METRICS_DEFAULT_H_
-#define WEBRTC_SYSTEM_WRAPPERS_INCLUDE_METRICS_DEFAULT_H_
-
-#include <map>
-#include <memory>
-#include <string>
-
-namespace webrtc {
-namespace metrics {
-
-// This class does not actually exist. It is casted to an implementation defined
-// pointer inside the functions.
-class Histogram;
-
-struct SampleInfo {
-  SampleInfo(const std::string& name, int min, int max, size_t bucket_count);
-  ~SampleInfo();
-
-  const std::string name;
-  const int min;
-  const int max;
-  const size_t bucket_count;
-  std::map<int, int> samples;  // <value, # of events>
-};
-
-// Enables collection of samples.
-// This method should be called before any other call into webrtc.
-void Enable();
-
-// Gets histograms and clears all samples.
-void GetAndReset(
-    std::map<std::string, std::unique_ptr<SampleInfo>>* histograms);
-
-// Functions below are mainly for testing.
-
-// Clears all samples.
-void Reset();
-
-// Returns the number of times the |sample| has been added to the histogram.
-int NumEvents(const std::string& name, int sample);
-
-// Returns the total number of added samples to the histogram.
-int NumSamples(const std::string& name);
-
-// Returns the minimum sample value (or -1 if the histogram has no samples).
-int MinSample(const std::string& name);
-
-}  // namespace metrics
-}  // namespace webrtc
-
-#endif  // WEBRTC_SYSTEM_WRAPPERS_INCLUDE_METRICS_DEFAULT_H_
diff --git a/system_wrappers/include/ntp_time.h b/system_wrappers/include/ntp_time.h
deleted file mode 100644
index 5e53064..0000000
--- a/system_wrappers/include/ntp_time.h
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
-*  Copyright (c) 2015 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_SYSTEM_WRAPPERS_INCLUDE_NTP_TIME_H_
-#define WEBRTC_SYSTEM_WRAPPERS_INCLUDE_NTP_TIME_H_
-
-#include <stdint.h>
-
-namespace webrtc {
-
-class NtpTime {
- public:
-  static constexpr uint64_t kFractionsPerSecond = 0x100000000;
-  NtpTime() : value_(0) {}
-  explicit NtpTime(uint64_t value) : value_(value) {}
-  NtpTime(uint32_t seconds, uint32_t fractions)
-      : value_(seconds * kFractionsPerSecond + fractions) {}
-
-  NtpTime(const NtpTime&) = default;
-  NtpTime& operator=(const NtpTime&) = default;
-  explicit operator uint64_t() const { return value_; }
-
-  void Set(uint32_t seconds, uint32_t fractions) {
-    value_ = seconds * kFractionsPerSecond + fractions;
-  }
-  void Reset() { value_ = 0; }
-
-  int64_t ToMs() const {
-    static constexpr double kNtpFracPerMs = 4.294967296E6;  // 2^32 / 1000.
-    const double frac_ms = static_cast<double>(fractions()) / kNtpFracPerMs;
-    return 1000 * static_cast<int64_t>(seconds()) +
-           static_cast<int64_t>(frac_ms + 0.5);
-  }
-  // NTP standard (RFC1305, section 3.1) explicitly state value 0 is invalid.
-  bool Valid() const { return value_ != 0; }
-
-  uint32_t seconds() const { return value_ / kFractionsPerSecond; }
-  uint32_t fractions() const { return value_ % kFractionsPerSecond; }
-
- private:
-  uint64_t value_;
-};
-
-inline bool operator==(const NtpTime& n1, const NtpTime& n2) {
-  return static_cast<uint64_t>(n1) == static_cast<uint64_t>(n2);
-}
-inline bool operator!=(const NtpTime& n1, const NtpTime& n2) {
-  return !(n1 == n2);
-}
-
-}  // namespace webrtc
-#endif  // WEBRTC_SYSTEM_WRAPPERS_INCLUDE_NTP_TIME_H_
diff --git a/system_wrappers/include/rtp_to_ntp_estimator.h b/system_wrappers/include/rtp_to_ntp_estimator.h
deleted file mode 100644
index 9d6da05..0000000
--- a/system_wrappers/include/rtp_to_ntp_estimator.h
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- *  Copyright (c) 2012 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_SYSTEM_WRAPPERS_INCLUDE_RTP_TO_NTP_ESTIMATOR_H_
-#define WEBRTC_SYSTEM_WRAPPERS_INCLUDE_RTP_TO_NTP_ESTIMATOR_H_
-
-#include <list>
-
-#include "webrtc/system_wrappers/include/ntp_time.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-// Class for converting an RTP timestamp to the NTP domain in milliseconds.
-// The class needs to be trained with (at least 2) RTP/NTP timestamp pairs from
-// RTCP sender reports before the convertion can be done.
-class RtpToNtpEstimator {
- public:
-  RtpToNtpEstimator();
-  ~RtpToNtpEstimator();
-
-  // RTP and NTP timestamp pair from a RTCP SR report.
-  struct RtcpMeasurement {
-    RtcpMeasurement(uint32_t ntp_secs, uint32_t ntp_frac, uint32_t timestamp);
-    bool IsEqual(const RtcpMeasurement& other) const;
-
-    NtpTime ntp_time;
-    uint32_t rtp_timestamp;
-  };
-
-  // Estimated parameters from RTP and NTP timestamp pairs in |measurements_|.
-  struct Parameters {
-    double frequency_khz = 0.0;
-    double offset_ms = 0.0;
-    bool calculated = false;
-  };
-
-  // Updates measurements with RTP/NTP timestamp pair from a RTCP sender report.
-  // |new_rtcp_sr| is set to true if a new report is added.
-  bool UpdateMeasurements(uint32_t ntp_secs,
-                          uint32_t ntp_frac,
-                          uint32_t rtp_timestamp,
-                          bool* new_rtcp_sr);
-
-  // Converts an RTP timestamp to the NTP domain in milliseconds.
-  // Returns true on success, false otherwise.
-  bool Estimate(int64_t rtp_timestamp, int64_t* rtp_timestamp_ms) const;
-
-  const Parameters& params() const { return params_; }
-
-  static const int kMaxInvalidSamples = 3;
-
- private:
-  void UpdateParameters();
-
-  int consecutive_invalid_samples_;
-  std::list<RtcpMeasurement> measurements_;
-  Parameters params_;
-};
-
-// Returns:
-//  1: forward wrap around.
-//  0: no wrap around.
-// -1: backwards wrap around (i.e. reordering).
-int CheckForWrapArounds(uint32_t new_timestamp, uint32_t old_timestamp);
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_SYSTEM_WRAPPERS_INCLUDE_RTP_TO_NTP_ESTIMATOR_H_
diff --git a/system_wrappers/include/rw_lock_wrapper.h b/system_wrappers/include/rw_lock_wrapper.h
deleted file mode 100644
index 62e75b4..0000000
--- a/system_wrappers/include/rw_lock_wrapper.h
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- *  Copyright (c) 2011 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_SYSTEM_WRAPPERS_INCLUDE_RW_LOCK_WRAPPER_H_
-#define WEBRTC_SYSTEM_WRAPPERS_INCLUDE_RW_LOCK_WRAPPER_H_
-
-#include "webrtc/rtc_base/thread_annotations.h"
-
-// Note, Windows pre-Vista version of RW locks are not supported natively. For
-// these OSs regular critical sections have been used to approximate RW lock
-// functionality and will therefore have worse performance.
-
-namespace webrtc {
-
-class RTC_LOCKABLE RWLockWrapper {
- public:
-  static RWLockWrapper* CreateRWLock();
-  virtual ~RWLockWrapper() {}
-
-  virtual void AcquireLockExclusive() RTC_EXCLUSIVE_LOCK_FUNCTION() = 0;
-  virtual void ReleaseLockExclusive() RTC_UNLOCK_FUNCTION() = 0;
-
-  virtual void AcquireLockShared() RTC_SHARED_LOCK_FUNCTION() = 0;
-  virtual void ReleaseLockShared() RTC_UNLOCK_FUNCTION() = 0;
-};
-
-// RAII extensions of the RW lock. Prevents Acquire/Release missmatches and
-// provides more compact locking syntax.
-class RTC_SCOPED_LOCKABLE ReadLockScoped {
- public:
-  ReadLockScoped(RWLockWrapper& rw_lock) RTC_SHARED_LOCK_FUNCTION(rw_lock)
-      : rw_lock_(rw_lock) {
-    rw_lock_.AcquireLockShared();
-  }
-
-  ~ReadLockScoped() RTC_UNLOCK_FUNCTION() { rw_lock_.ReleaseLockShared(); }
-
- private:
-  RWLockWrapper& rw_lock_;
-};
-
-class RTC_SCOPED_LOCKABLE WriteLockScoped {
- public:
-  WriteLockScoped(RWLockWrapper& rw_lock) RTC_EXCLUSIVE_LOCK_FUNCTION(rw_lock)
-      : rw_lock_(rw_lock) {
-    rw_lock_.AcquireLockExclusive();
-  }
-
-  ~WriteLockScoped() RTC_UNLOCK_FUNCTION() { rw_lock_.ReleaseLockExclusive(); }
-
- private:
-  RWLockWrapper& rw_lock_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_SYSTEM_WRAPPERS_INCLUDE_RW_LOCK_WRAPPER_H_
diff --git a/system_wrappers/include/sleep.h b/system_wrappers/include/sleep.h
deleted file mode 100644
index e7ed8b3..0000000
--- a/system_wrappers/include/sleep.h
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- *  Copyright (c) 2012 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.
- */
-// An OS-independent sleep function.
-
-#ifndef WEBRTC_SYSTEM_WRAPPERS_INCLUDE_SLEEP_H_
-#define WEBRTC_SYSTEM_WRAPPERS_INCLUDE_SLEEP_H_
-
-namespace webrtc {
-
-// This function sleeps for the specified number of milliseconds.
-// It may return early if the thread is woken by some other event,
-// such as the delivery of a signal on Unix.
-void SleepMs(int msecs);
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_SYSTEM_WRAPPERS_INCLUDE_SLEEP_H_
diff --git a/system_wrappers/include/static_instance.h b/system_wrappers/include/static_instance.h
deleted file mode 100644
index f85a912..0000000
--- a/system_wrappers/include/static_instance.h
+++ /dev/null
@@ -1,147 +0,0 @@
-/*
- *  Copyright (c) 2012 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_SYSTEM_WRAPPERS_INCLUDE_STATIC_INSTANCE_H_
-#define WEBRTC_SYSTEM_WRAPPERS_INCLUDE_STATIC_INSTANCE_H_
-
-#include <assert.h>
-
-#include "webrtc/rtc_base/criticalsection.h"
-#ifdef _WIN32
-#include "webrtc/system_wrappers/include/fix_interlocked_exchange_pointer_win.h"
-#endif
-
-namespace webrtc {
-
-enum CountOperation {
-  kRelease,
-  kAddRef,
-  kAddRefNoCreate
-};
-enum CreateOperation {
-  kInstanceExists,
-  kCreate,
-  kDestroy
-};
-
-template <class T>
-// Construct On First Use idiom. Avoids
-// "static initialization order fiasco".
-static T* GetStaticInstance(CountOperation count_operation) {
-  // TODO (hellner): use atomic wrapper instead.
-  static volatile long instance_count = 0;
-  static T* volatile instance = NULL;
-  CreateOperation state = kInstanceExists;
-#ifndef _WIN32
-  static rtc::CriticalSection crit_sect;
-  rtc::CritScope lock(&crit_sect);
-
-  if (count_operation ==
-      kAddRefNoCreate && instance_count == 0) {
-    return NULL;
-  }
-  if (count_operation ==
-      kAddRef ||
-      count_operation == kAddRefNoCreate) {
-    instance_count++;
-    if (instance_count == 1) {
-      state = kCreate;
-    }
-  } else {
-    instance_count--;
-    if (instance_count == 0) {
-      state = kDestroy;
-    }
-  }
-  if (state == kCreate) {
-    instance = T::CreateInstance();
-  } else if (state == kDestroy) {
-    T* old_instance = instance;
-    instance = NULL;
-    // The state will not change past this point. Release the critical
-    // section while deleting the object in case it would be blocking on
-    // access back to this object. (This is the case for the tracing class
-    // since the thread owned by the tracing class also traces).
-    // TODO(hellner): this is a bit out of place but here goes, de-couple
-    // thread implementation with trace implementation.
-    crit_sect.Leave();
-    if (old_instance) {
-      delete old_instance;
-    }
-    // Re-acquire the lock since the scoped critical section will release
-    // it.
-    crit_sect.Enter();
-    return NULL;
-  }
-#else  // _WIN32
-  if (count_operation ==
-      kAddRefNoCreate && instance_count == 0) {
-    return NULL;
-  }
-  if (count_operation == kAddRefNoCreate) {
-    if (1 == InterlockedIncrement(&instance_count)) {
-      // The instance has been destroyed by some other thread. Rollback.
-      InterlockedDecrement(&instance_count);
-      assert(false);
-      return NULL;
-    }
-    // Sanity to catch corrupt state.
-    if (instance == NULL) {
-      assert(false);
-      InterlockedDecrement(&instance_count);
-      return NULL;
-    }
-  } else if (count_operation == kAddRef) {
-    if (instance_count == 0) {
-      state = kCreate;
-    } else {
-      if (1 == InterlockedIncrement(&instance_count)) {
-        // InterlockedDecrement because reference count should not be
-        // updated just yet (that's done when the instance is created).
-        InterlockedDecrement(&instance_count);
-        state = kCreate;
-      }
-    }
-  } else {
-    int new_value = InterlockedDecrement(&instance_count);
-    if (new_value == 0) {
-      state = kDestroy;
-    }
-  }
-
-  if (state == kCreate) {
-    // Create instance and let whichever thread finishes first assign its
-    // local copy to the global instance. All other threads reclaim their
-    // local copy.
-    T* new_instance = T::CreateInstance();
-    if (1 == InterlockedIncrement(&instance_count)) {
-      InterlockedExchangePointer(reinterpret_cast<void * volatile*>(&instance),
-                                 new_instance);
-    } else {
-      InterlockedDecrement(&instance_count);
-      if (new_instance) {
-        delete static_cast<T*>(new_instance);
-      }
-    }
-  } else if (state == kDestroy) {
-    T* old_value = static_cast<T*>(InterlockedExchangePointer(
-        reinterpret_cast<void * volatile*>(&instance), NULL));
-    if (old_value) {
-      delete static_cast<T*>(old_value);
-    }
-    return NULL;
-  }
-#endif  // #ifndef _WIN32
-  return instance;
-}
-
-}  // namspace webrtc
-
-#endif  // WEBRTC_SYSTEM_WRAPPERS_INCLUDE_STATIC_INSTANCE_H_
diff --git a/system_wrappers/include/timestamp_extrapolator.h b/system_wrappers/include/timestamp_extrapolator.h
deleted file mode 100644
index d9c5c6f..0000000
--- a/system_wrappers/include/timestamp_extrapolator.h
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- *  Copyright (c) 2011 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 SYSTEM_WRAPPERS_INCLUDE_TIMESTAMP_EXTRAPOLATOR_H_
-#define SYSTEM_WRAPPERS_INCLUDE_TIMESTAMP_EXTRAPOLATOR_H_
-
-#include "webrtc/system_wrappers/include/rw_lock_wrapper.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc
-{
-
-class TimestampExtrapolator
-{
-public:
-    explicit TimestampExtrapolator(int64_t start_ms);
-    ~TimestampExtrapolator();
-    void Update(int64_t tMs, uint32_t ts90khz);
-    int64_t ExtrapolateLocalTime(uint32_t timestamp90khz);
-    void Reset(int64_t start_ms);
-
-private:
-    void CheckForWrapArounds(uint32_t ts90khz);
-    bool DelayChangeDetection(double error);
-    RWLockWrapper*        _rwLock;
-    double                _w[2];
-    double                _pP[2][2];
-    int64_t         _startMs;
-    int64_t         _prevMs;
-    uint32_t        _firstTimestamp;
-    int32_t         _wrapArounds;
-    int64_t         _prevUnwrappedTimestamp;
-    int64_t         _prevWrapTimestamp;
-    const double          _lambda;
-    bool                  _firstAfterReset;
-    uint32_t        _packetCount;
-    const uint32_t  _startUpFilterDelayInPackets;
-
-    double              _detectorAccumulatorPos;
-    double              _detectorAccumulatorNeg;
-    const double        _alarmThreshold;
-    const double        _accDrift;
-    const double        _accMaxError;
-    const double        _pP11;
-};
-
-}  // namespace webrtc
-
-#endif // SYSTEM_WRAPPERS_INCLUDE_TIMESTAMP_EXTRAPOLATOR_H_
diff --git a/system_wrappers/include/trace.h b/system_wrappers/include/trace.h
deleted file mode 100644
index e3ca3c6..0000000
--- a/system_wrappers/include/trace.h
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- *  Copyright (c) 2012 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.
- *
- *  System independent wrapper for logging runtime information to file.
- *  Note: All log messages will be written to the same trace file.
- *  Note: If too many messages are written to file there will be a build up of
- *  messages. Apply filtering to avoid that.
- */
-
-#ifndef WEBRTC_SYSTEM_WRAPPERS_INCLUDE_TRACE_H_
-#define WEBRTC_SYSTEM_WRAPPERS_INCLUDE_TRACE_H_
-
-#include "webrtc/common_types.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-#if defined(WEBRTC_RESTRICT_LOGGING)
-// Disable all TRACE macros. The LOG macro is still functional.
-#define WEBRTC_TRACE true ? (void) 0 : Trace::Add
-#else
-#define WEBRTC_TRACE Trace::Add
-#endif
-
-class Trace {
- public:
-  // The length of the trace text preceeding the log message.
-  static const int kBoilerplateLength;
-  // The position of the timestamp text within a trace.
-  static const int kTimestampPosition;
-  // The length of the timestamp (without "delta" field).
-  static const int kTimestampLength;
-
-  // Increments the reference count to the trace.
-  static void CreateTrace();
-  // Decrements the reference count to the trace.
-  static void ReturnTrace();
-  // Note: any instance that writes to the trace file should increment and
-  // decrement the reference count on construction and destruction,
-  // respectively.
-
-  // Specifies what type of messages should be written to the trace file. The
-  // filter parameter is a bitmask where each message type is enumerated by the
-  // TraceLevel enumerator. TODO(hellner): why is the TraceLevel enumerator not
-  // defined in this file?
-  static void set_level_filter(int filter);
-
-  // Returns what type of messages are written to the trace file.
-  static int level_filter();
-
-  // Sets the file name. If add_file_counter is false the same file will be
-  // reused when it fills up. If it's true a new file with incremented name
-  // will be used.
-  static int32_t SetTraceFile(const char* file_name,
-                              const bool add_file_counter = false);
-
-  // Registers callback to receive trace messages.
-  // TODO(hellner): Why not use OutStream instead? Why is TraceCallback not
-  // defined in this file?
-  static int32_t SetTraceCallback(TraceCallback* callback);
-
-  // Adds a trace message for writing to file. The message is put in a queue
-  // for writing to file whenever possible for performance reasons. I.e. there
-  // is a crash it is possible that the last, vital logs are not logged yet.
-  // level is the type of message to log. If that type of messages is
-  // filtered it will not be written to file. module is an identifier for what
-  // part of the code the message is coming.
-  // id is an identifier that should be unique for that set of classes that
-  // are associated (e.g. all instances owned by an engine).
-  // msg and the ellipsis are the same as e.g. sprintf.
-  // TODO(hellner) Why is TraceModule not defined in this file?
-  static void Add(const TraceLevel level,
-                  const TraceModule module,
-                  const int32_t id,
-                  const char* msg, ...);
-
- private:
-  static volatile int level_filter_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_SYSTEM_WRAPPERS_INCLUDE_TRACE_H_
diff --git a/system_wrappers/source/aligned_array_unittest.cc b/system_wrappers/source/aligned_array_unittest.cc
deleted file mode 100644
index 5f3cdf7..0000000
--- a/system_wrappers/source/aligned_array_unittest.cc
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- *  Copyright (c) 2014 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/system_wrappers/include/aligned_array.h"
-
-#include <stdint.h>
-
-#include "webrtc/test/gtest.h"
-
-namespace {
-
-bool IsAligned(const void* ptr, size_t alignment) {
-  return reinterpret_cast<uintptr_t>(ptr) % alignment == 0;
-}
-
-}  // namespace
-
-namespace webrtc {
-
-TEST(AlignedArrayTest, CheckAlignment) {
-  AlignedArray<bool> arr(10, 7, 128);
-  ASSERT_TRUE(IsAligned(arr.Array(), 128));
-  for (size_t i = 0; i < 10; ++i) {
-    ASSERT_TRUE(IsAligned(arr.Row(i), 128));
-    ASSERT_EQ(arr.Row(i), arr.Array()[i]);
-  }
-}
-
-TEST(AlignedArrayTest, CheckOverlap) {
-  AlignedArray<size_t> arr(10, 7, 128);
-
-  for (size_t i = 0; i < 10; ++i) {
-    for (size_t j = 0; j < 7; ++j) {
-      arr.At(i, j) = 20 * i + j;
-    }
-  }
-
-  for (size_t i = 0; i < 10; ++i) {
-    for (size_t j = 0; j < 7; ++j) {
-      ASSERT_EQ(arr.At(i, j), 20 * i + j);
-      ASSERT_EQ(arr.Row(i)[j], 20 * i + j);
-      ASSERT_EQ(arr.Array()[i][j], 20 * i + j);
-    }
-  }
-}
-
-TEST(AlignedArrayTest, CheckRowsCols) {
-  AlignedArray<bool> arr(10, 7, 128);
-  ASSERT_EQ(arr.rows(), 10u);
-  ASSERT_EQ(arr.cols(), 7u);
-}
-
-}  // namespace webrtc
diff --git a/system_wrappers/source/aligned_malloc.cc b/system_wrappers/source/aligned_malloc.cc
deleted file mode 100644
index f700f8b..0000000
--- a/system_wrappers/source/aligned_malloc.cc
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- *  Copyright (c) 2011 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/system_wrappers/include/aligned_malloc.h"
-
-#include <memory.h>
-#include <stdlib.h>
-
-#ifdef _WIN32
-#include <windows.h>
-#else
-#include <stdint.h>
-#endif
-
-#include "webrtc/typedefs.h"
-
-// Reference on memory alignment:
-// http://stackoverflow.com/questions/227897/solve-the-memory-alignment-in-c-interview-question-that-stumped-me
-namespace webrtc {
-
-uintptr_t GetRightAlign(uintptr_t start_pos, size_t alignment) {
-  // The pointer should be aligned with |alignment| bytes. The - 1 guarantees
-  // that it is aligned towards the closest higher (right) address.
-  return (start_pos + alignment - 1) & ~(alignment - 1);
-}
-
-// Alignment must be an integer power of two.
-bool ValidAlignment(size_t alignment) {
-  if (!alignment) {
-    return false;
-  }
-  return (alignment & (alignment - 1)) == 0;
-}
-
-void* GetRightAlign(const void* pointer, size_t alignment) {
-  if (!pointer) {
-    return NULL;
-  }
-  if (!ValidAlignment(alignment)) {
-    return NULL;
-  }
-  uintptr_t start_pos = reinterpret_cast<uintptr_t>(pointer);
-  return reinterpret_cast<void*>(GetRightAlign(start_pos, alignment));
-}
-
-void* AlignedMalloc(size_t size, size_t alignment) {
-  if (size == 0) {
-    return NULL;
-  }
-  if (!ValidAlignment(alignment)) {
-    return NULL;
-  }
-
-  // The memory is aligned towards the lowest address that so only
-  // alignment - 1 bytes needs to be allocated.
-  // A pointer to the start of the memory must be stored so that it can be
-  // retreived for deletion, ergo the sizeof(uintptr_t).
-  void* memory_pointer = malloc(size + sizeof(uintptr_t) + alignment - 1);
-  if (memory_pointer == NULL) {
-    return NULL;
-  }
-
-  // Aligning after the sizeof(uintptr_t) bytes will leave room for the header
-  // in the same memory block.
-  uintptr_t align_start_pos = reinterpret_cast<uintptr_t>(memory_pointer);
-  align_start_pos += sizeof(uintptr_t);
-  uintptr_t aligned_pos = GetRightAlign(align_start_pos, alignment);
-  void* aligned_pointer = reinterpret_cast<void*>(aligned_pos);
-
-  // Store the address to the beginning of the memory just before the aligned
-  // memory.
-  uintptr_t header_pos = aligned_pos - sizeof(uintptr_t);
-  void* header_pointer = reinterpret_cast<void*>(header_pos);
-  uintptr_t memory_start = reinterpret_cast<uintptr_t>(memory_pointer);
-  memcpy(header_pointer, &memory_start, sizeof(uintptr_t));
-
-  return aligned_pointer;
-}
-
-void AlignedFree(void* mem_block) {
-  if (mem_block == NULL) {
-    return;
-  }
-  uintptr_t aligned_pos = reinterpret_cast<uintptr_t>(mem_block);
-  uintptr_t header_pos = aligned_pos - sizeof(uintptr_t);
-
-  // Read out the address of the AlignedMemory struct from the header.
-  uintptr_t memory_start_pos = *reinterpret_cast<uintptr_t*>(header_pos);
-  void* memory_start = reinterpret_cast<void*>(memory_start_pos);
-  free(memory_start);
-}
-
-}  // namespace webrtc
diff --git a/system_wrappers/source/aligned_malloc_unittest.cc b/system_wrappers/source/aligned_malloc_unittest.cc
deleted file mode 100644
index fbd5d6e..0000000
--- a/system_wrappers/source/aligned_malloc_unittest.cc
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- *  Copyright (c) 2012 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/system_wrappers/include/aligned_malloc.h"
-
-#include <memory>
-
-#ifdef _WIN32
-#include <windows.h>
-#else
-#include <stdint.h>
-#endif
-
-#include "webrtc/test/gtest.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-// Returns true if |size| and |alignment| are valid combinations.
-bool CorrectUsage(size_t size, size_t alignment) {
-  std::unique_ptr<char, AlignedFreeDeleter> scoped(
-      static_cast<char*>(AlignedMalloc(size, alignment)));
-  if (scoped.get() == NULL) {
-    return false;
-  }
-  const uintptr_t scoped_address = reinterpret_cast<uintptr_t> (scoped.get());
-  return 0u == scoped_address % alignment;
-}
-
-TEST(AlignedMalloc, GetRightAlign) {
-  const size_t size = 100;
-  const size_t alignment = 32;
-  const size_t left_misalignment = 1;
-  std::unique_ptr<char, AlignedFreeDeleter> scoped(
-      static_cast<char*>(AlignedMalloc(size, alignment)));
-  EXPECT_TRUE(scoped.get() != NULL);
-  const uintptr_t aligned_address = reinterpret_cast<uintptr_t> (scoped.get());
-  const uintptr_t misaligned_address = aligned_address - left_misalignment;
-  const char* misaligned_ptr = reinterpret_cast<const char*>(
-      misaligned_address);
-  const char* realigned_ptr = GetRightAlign(misaligned_ptr, alignment);
-  EXPECT_EQ(scoped.get(), realigned_ptr);
-}
-
-TEST(AlignedMalloc, IncorrectSize) {
-  const size_t incorrect_size = 0;
-  const size_t alignment = 64;
-  EXPECT_FALSE(CorrectUsage(incorrect_size, alignment));
-}
-
-TEST(AlignedMalloc, IncorrectAlignment) {
-  const size_t size = 100;
-  const size_t incorrect_alignment = 63;
-  EXPECT_FALSE(CorrectUsage(size, incorrect_alignment));
-}
-
-TEST(AlignedMalloc, AlignTo2Bytes) {
-  size_t size = 100;
-  size_t alignment = 2;
-  EXPECT_TRUE(CorrectUsage(size, alignment));
-}
-
-TEST(AlignedMalloc, AlignTo32Bytes) {
-  size_t size = 100;
-  size_t alignment = 32;
-  EXPECT_TRUE(CorrectUsage(size, alignment));
-}
-
-TEST(AlignedMalloc, AlignTo128Bytes) {
-  size_t size = 100;
-  size_t alignment = 128;
-  EXPECT_TRUE(CorrectUsage(size, alignment));
-}
-
-}  // namespace webrtc
-
diff --git a/system_wrappers/source/atomic32_darwin.cc b/system_wrappers/source/atomic32_darwin.cc
deleted file mode 100644
index 7c77d09..0000000
--- a/system_wrappers/source/atomic32_darwin.cc
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- *  Copyright (c) 2012 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/system_wrappers/include/atomic32.h"
-
-#include <assert.h>
-#include <libkern/OSAtomic.h>
-#include <stdlib.h>
-
-#include "webrtc/common_types.h"
-
-namespace webrtc {
-
-Atomic32::Atomic32(int32_t initial_value)
-    : value_(initial_value) {
-  assert(Is32bitAligned());
-}
-
-Atomic32::~Atomic32() {
-}
-
-int32_t Atomic32::operator++() {
-  return OSAtomicIncrement32Barrier(&value_);
-}
-
-int32_t Atomic32::operator--() {
-  return OSAtomicDecrement32Barrier(&value_);
-}
-
-int32_t Atomic32::operator+=(int32_t value) {
-  return OSAtomicAdd32Barrier(value, &value_);
-}
-
-int32_t Atomic32::operator-=(int32_t value) {
-  return OSAtomicAdd32Barrier(-value, &value_);
-}
-
-bool Atomic32::CompareExchange(int32_t new_value, int32_t compare_value) {
-  return OSAtomicCompareAndSwap32Barrier(compare_value, new_value, &value_);
-}
-
-}  // namespace webrtc
diff --git a/system_wrappers/source/atomic32_non_darwin_unix.cc b/system_wrappers/source/atomic32_non_darwin_unix.cc
deleted file mode 100644
index fbc9c29..0000000
--- a/system_wrappers/source/atomic32_non_darwin_unix.cc
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- *  Copyright (c) 2012 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/system_wrappers/include/atomic32.h"
-
-#include <assert.h>
-#include <inttypes.h>
-#include <malloc.h>
-
-#include "webrtc/common_types.h"
-
-namespace webrtc {
-
-Atomic32::Atomic32(int32_t initial_value)
-    : value_(initial_value) {
-  assert(Is32bitAligned());
-}
-
-Atomic32::~Atomic32() {
-}
-
-int32_t Atomic32::operator++() {
-  return __sync_fetch_and_add(&value_, 1) + 1;
-}
-
-int32_t Atomic32::operator--() {
-  return __sync_fetch_and_sub(&value_, 1) - 1;
-}
-
-int32_t Atomic32::operator+=(int32_t value) {
-  int32_t return_value = __sync_fetch_and_add(&value_, value);
-  return_value += value;
-  return return_value;
-}
-
-int32_t Atomic32::operator-=(int32_t value) {
-  int32_t return_value = __sync_fetch_and_sub(&value_, value);
-  return_value -= value;
-  return return_value;
-}
-
-bool Atomic32::CompareExchange(int32_t new_value, int32_t compare_value) {
-  return __sync_bool_compare_and_swap(&value_, compare_value, new_value);
-}
-
-}  // namespace webrtc
diff --git a/system_wrappers/source/atomic32_win.cc b/system_wrappers/source/atomic32_win.cc
deleted file mode 100644
index cd4ce08..0000000
--- a/system_wrappers/source/atomic32_win.cc
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- *  Copyright (c) 2012 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/system_wrappers/include/atomic32.h"
-
-#include <assert.h>
-#include <windows.h>
-
-#include "webrtc/common_types.h"
-
-namespace webrtc {
-
-Atomic32::Atomic32(int32_t initial_value)
-    : value_(initial_value) {
-  static_assert(sizeof(value_) == sizeof(LONG),
-                "counter variable is the expected size");
-  assert(Is32bitAligned());
-}
-
-Atomic32::~Atomic32() {
-}
-
-int32_t Atomic32::operator++() {
-  return static_cast<int32_t>(InterlockedIncrement(
-      reinterpret_cast<volatile LONG*>(&value_)));
-}
-
-int32_t Atomic32::operator--() {
-  return static_cast<int32_t>(InterlockedDecrement(
-      reinterpret_cast<volatile LONG*>(&value_)));
-}
-
-int32_t Atomic32::operator+=(int32_t value) {
-  return InterlockedExchangeAdd(reinterpret_cast<volatile LONG*>(&value_),
-                                value);
-}
-
-int32_t Atomic32::operator-=(int32_t value) {
-  return InterlockedExchangeAdd(reinterpret_cast<volatile LONG*>(&value_),
-                                -value);
-}
-
-bool Atomic32::CompareExchange(int32_t new_value, int32_t compare_value) {
-  const LONG old_value = InterlockedCompareExchange(
-      reinterpret_cast<volatile LONG*>(&value_),
-      new_value,
-      compare_value);
-
-  // If the old value and the compare value is the same an exchange happened.
-  return (old_value == compare_value);
-}
-
-}  // namespace webrtc
diff --git a/system_wrappers/source/clock.cc b/system_wrappers/source/clock.cc
deleted file mode 100644
index f4533fb..0000000
--- a/system_wrappers/source/clock.cc
+++ /dev/null
@@ -1,266 +0,0 @@
-/*
- *  Copyright (c) 2013 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/system_wrappers/include/clock.h"
-
-#if defined(_WIN32)
-// Windows needs to be included before mmsystem.h
-#include "webrtc/rtc_base/win32.h"
-#include <MMSystem.h>
-#elif ((defined WEBRTC_LINUX) || (defined WEBRTC_MAC))
-#include <sys/time.h>
-#include <time.h>
-#endif
-
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/timeutils.h"
-#include "webrtc/system_wrappers/include/rw_lock_wrapper.h"
-
-namespace webrtc {
-
-class RealTimeClock : public Clock {
-  // Return a timestamp in milliseconds relative to some arbitrary source; the
-  // source is fixed for this clock.
-  int64_t TimeInMilliseconds() const override {
-    return rtc::TimeMillis();
-  }
-
-  // Return a timestamp in microseconds relative to some arbitrary source; the
-  // source is fixed for this clock.
-  int64_t TimeInMicroseconds() const override {
-    return rtc::TimeMicros();
-  }
-
-  // Retrieve an NTP absolute timestamp.
-  NtpTime CurrentNtpTime() const override {
-    timeval tv = CurrentTimeVal();
-    double microseconds_in_seconds;
-    uint32_t seconds;
-    Adjust(tv, &seconds, &microseconds_in_seconds);
-    uint32_t fractions = static_cast<uint32_t>(
-        microseconds_in_seconds * kMagicNtpFractionalUnit + 0.5);
-    return NtpTime(seconds, fractions);
-  }
-
-  // Retrieve an NTP absolute timestamp in milliseconds.
-  int64_t CurrentNtpInMilliseconds() const override {
-    timeval tv = CurrentTimeVal();
-    uint32_t seconds;
-    double microseconds_in_seconds;
-    Adjust(tv, &seconds, &microseconds_in_seconds);
-    return 1000 * static_cast<int64_t>(seconds) +
-        static_cast<int64_t>(1000.0 * microseconds_in_seconds + 0.5);
-  }
-
- protected:
-  virtual timeval CurrentTimeVal() const = 0;
-
-  static void Adjust(const timeval& tv, uint32_t* adjusted_s,
-                     double* adjusted_us_in_s) {
-    *adjusted_s = tv.tv_sec + kNtpJan1970;
-    *adjusted_us_in_s = tv.tv_usec / 1e6;
-
-    if (*adjusted_us_in_s >= 1) {
-      *adjusted_us_in_s -= 1;
-      ++*adjusted_s;
-    } else if (*adjusted_us_in_s < -1) {
-      *adjusted_us_in_s += 1;
-      --*adjusted_s;
-    }
-  }
-};
-
-#if defined(_WIN32)
-// TODO(pbos): Consider modifying the implementation to synchronize itself
-// against system time (update ref_point_, make it non-const) periodically to
-// prevent clock drift.
-class WindowsRealTimeClock : public RealTimeClock {
- public:
-  WindowsRealTimeClock()
-      : last_time_ms_(0),
-        num_timer_wraps_(0),
-        ref_point_(GetSystemReferencePoint()) {}
-
-  virtual ~WindowsRealTimeClock() {}
-
- protected:
-  struct ReferencePoint {
-    FILETIME file_time;
-    LARGE_INTEGER counter_ms;
-  };
-
-  timeval CurrentTimeVal() const override {
-    const uint64_t FILETIME_1970 = 0x019db1ded53e8000;
-
-    FILETIME StartTime;
-    uint64_t Time;
-    struct timeval tv;
-
-    // We can't use query performance counter since they can change depending on
-    // speed stepping.
-    GetTime(&StartTime);
-
-    Time = (((uint64_t) StartTime.dwHighDateTime) << 32) +
-           (uint64_t) StartTime.dwLowDateTime;
-
-    // Convert the hecto-nano second time to tv format.
-    Time -= FILETIME_1970;
-
-    tv.tv_sec = (uint32_t)(Time / (uint64_t)10000000);
-    tv.tv_usec = (uint32_t)((Time % (uint64_t)10000000) / 10);
-    return tv;
-  }
-
-  void GetTime(FILETIME* current_time) const {
-    DWORD t;
-    LARGE_INTEGER elapsed_ms;
-    {
-      rtc::CritScope lock(&crit_);
-      // time MUST be fetched inside the critical section to avoid non-monotonic
-      // last_time_ms_ values that'll register as incorrect wraparounds due to
-      // concurrent calls to GetTime.
-      t = timeGetTime();
-      if (t < last_time_ms_)
-        num_timer_wraps_++;
-      last_time_ms_ = t;
-      elapsed_ms.HighPart = num_timer_wraps_;
-    }
-    elapsed_ms.LowPart = t;
-    elapsed_ms.QuadPart = elapsed_ms.QuadPart - ref_point_.counter_ms.QuadPart;
-
-    // Translate to 100-nanoseconds intervals (FILETIME resolution)
-    // and add to reference FILETIME to get current FILETIME.
-    ULARGE_INTEGER filetime_ref_as_ul;
-    filetime_ref_as_ul.HighPart = ref_point_.file_time.dwHighDateTime;
-    filetime_ref_as_ul.LowPart = ref_point_.file_time.dwLowDateTime;
-    filetime_ref_as_ul.QuadPart +=
-        static_cast<ULONGLONG>((elapsed_ms.QuadPart) * 1000 * 10);
-
-    // Copy to result
-    current_time->dwHighDateTime = filetime_ref_as_ul.HighPart;
-    current_time->dwLowDateTime = filetime_ref_as_ul.LowPart;
-  }
-
-  static ReferencePoint GetSystemReferencePoint() {
-    ReferencePoint ref = {};
-    FILETIME ft0 = {};
-    FILETIME ft1 = {};
-    // Spin waiting for a change in system time. As soon as this change happens,
-    // get the matching call for timeGetTime() as soon as possible. This is
-    // assumed to be the most accurate offset that we can get between
-    // timeGetTime() and system time.
-
-    // Set timer accuracy to 1 ms.
-    timeBeginPeriod(1);
-    GetSystemTimeAsFileTime(&ft0);
-    do {
-      GetSystemTimeAsFileTime(&ft1);
-
-      ref.counter_ms.QuadPart = timeGetTime();
-      Sleep(0);
-    } while ((ft0.dwHighDateTime == ft1.dwHighDateTime) &&
-             (ft0.dwLowDateTime == ft1.dwLowDateTime));
-    ref.file_time = ft1;
-    timeEndPeriod(1);
-    return ref;
-  }
-
-  // mutable as time-accessing functions are const.
-  rtc::CriticalSection crit_;
-  mutable DWORD last_time_ms_;
-  mutable LONG num_timer_wraps_;
-  const ReferencePoint ref_point_;
-};
-
-#elif ((defined WEBRTC_LINUX) || (defined WEBRTC_MAC))
-class UnixRealTimeClock : public RealTimeClock {
- public:
-  UnixRealTimeClock() {}
-
-  ~UnixRealTimeClock() override {}
-
- protected:
-  timeval CurrentTimeVal() const override {
-    struct timeval tv;
-    struct timezone tz;
-    tz.tz_minuteswest = 0;
-    tz.tz_dsttime = 0;
-    gettimeofday(&tv, &tz);
-    return tv;
-  }
-};
-#endif
-
-#if defined(_WIN32)
-static WindowsRealTimeClock* volatile g_shared_clock = nullptr;
-#endif
-Clock* Clock::GetRealTimeClock() {
-#if defined(_WIN32)
-  // This read relies on volatile read being atomic-load-acquire. This is
-  // true in MSVC since at least 2005:
-  // "A read of a volatile object (volatile read) has Acquire semantics"
-  if (g_shared_clock != nullptr)
-    return g_shared_clock;
-  WindowsRealTimeClock* clock = new WindowsRealTimeClock;
-  if (InterlockedCompareExchangePointer(
-          reinterpret_cast<void* volatile*>(&g_shared_clock), clock, nullptr) !=
-      nullptr) {
-    // g_shared_clock was assigned while we constructed/tried to assign our
-    // instance, delete our instance and use the existing one.
-    delete clock;
-  }
-  return g_shared_clock;
-#elif defined(WEBRTC_LINUX) || defined(WEBRTC_MAC)
-  static UnixRealTimeClock clock;
-  return &clock;
-#else
-  return NULL;
-#endif
-}
-
-SimulatedClock::SimulatedClock(int64_t initial_time_us)
-    : time_us_(initial_time_us), lock_(RWLockWrapper::CreateRWLock()) {
-}
-
-SimulatedClock::~SimulatedClock() {
-}
-
-int64_t SimulatedClock::TimeInMilliseconds() const {
-  ReadLockScoped synchronize(*lock_);
-  return (time_us_ + 500) / 1000;
-}
-
-int64_t SimulatedClock::TimeInMicroseconds() const {
-  ReadLockScoped synchronize(*lock_);
-  return time_us_;
-}
-
-NtpTime SimulatedClock::CurrentNtpTime() const {
-  int64_t now_ms = TimeInMilliseconds();
-  uint32_t seconds = (now_ms / 1000) + kNtpJan1970;
-  uint32_t fractions =
-      static_cast<uint32_t>((now_ms % 1000) * kMagicNtpFractionalUnit / 1000);
-  return NtpTime(seconds, fractions);
-}
-
-int64_t SimulatedClock::CurrentNtpInMilliseconds() const {
-  return TimeInMilliseconds() + 1000 * static_cast<int64_t>(kNtpJan1970);
-}
-
-void SimulatedClock::AdvanceTimeMilliseconds(int64_t milliseconds) {
-  AdvanceTimeMicroseconds(1000 * milliseconds);
-}
-
-void SimulatedClock::AdvanceTimeMicroseconds(int64_t microseconds) {
-  WriteLockScoped synchronize(*lock_);
-  time_us_ += microseconds;
-}
-
-};  // namespace webrtc
diff --git a/system_wrappers/source/clock_unittest.cc b/system_wrappers/source/clock_unittest.cc
deleted file mode 100644
index dcd9327..0000000
--- a/system_wrappers/source/clock_unittest.cc
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- *  Copyright (c) 2012 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/system_wrappers/include/clock.h"
-
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-TEST(ClockTest, NtpTime) {
-  Clock* clock = Clock::GetRealTimeClock();
-
-  // To ensure the test runs correctly even on a heavily loaded system, do not
-  // compare the seconds/fractions and millisecond values directly. Instead,
-  // we check that the NTP time is between the "milliseconds" values returned
-  // right before and right after the call.
-  // The comparison includes 1 ms of margin to account for the rounding error in
-  // the conversion.
-  int64_t milliseconds_lower_bound = clock->CurrentNtpInMilliseconds();
-  NtpTime ntp_time = clock->CurrentNtpTime();
-  int64_t milliseconds_upper_bound = clock->CurrentNtpInMilliseconds();
-  EXPECT_GT(milliseconds_lower_bound / 1000, kNtpJan1970);
-  EXPECT_LE(milliseconds_lower_bound - 1, ntp_time.ToMs());
-  EXPECT_GE(milliseconds_upper_bound + 1, ntp_time.ToMs());
-}
-
-}  // namespace webrtc
diff --git a/system_wrappers/source/cpu_features.cc b/system_wrappers/source/cpu_features.cc
deleted file mode 100644
index 49840eb..0000000
--- a/system_wrappers/source/cpu_features.cc
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-// Parts of this file derived from Chromium's base/cpu.cc.
-
-#include "webrtc/system_wrappers/include/cpu_features_wrapper.h"
-
-#if defined(WEBRTC_ARCH_X86_FAMILY) && defined(_MSC_VER)
-#include <intrin.h>
-#endif
-
-#include "webrtc/typedefs.h"
-
-// No CPU feature is available => straight C path.
-int GetCPUInfoNoASM(CPUFeature feature) {
-  (void)feature;
-  return 0;
-}
-
-#if defined(WEBRTC_ARCH_X86_FAMILY)
-#ifndef _MSC_VER
-// Intrinsic for "cpuid".
-#if defined(__pic__) && defined(__i386__)
-static inline void __cpuid(int cpu_info[4], int info_type) {
-  __asm__ volatile(
-    "mov %%ebx, %%edi\n"
-    "cpuid\n"
-    "xchg %%edi, %%ebx\n"
-    : "=a"(cpu_info[0]), "=D"(cpu_info[1]), "=c"(cpu_info[2]), "=d"(cpu_info[3])
-    : "a"(info_type));
-}
-#else
-static inline void __cpuid(int cpu_info[4], int info_type) {
-  __asm__ volatile(
-    "cpuid\n"
-    : "=a"(cpu_info[0]), "=b"(cpu_info[1]), "=c"(cpu_info[2]), "=d"(cpu_info[3])
-    : "a"(info_type));
-}
-#endif
-#endif  // _MSC_VER
-#endif  // WEBRTC_ARCH_X86_FAMILY
-
-#if defined(WEBRTC_ARCH_X86_FAMILY)
-// Actual feature detection for x86.
-static int GetCPUInfo(CPUFeature feature) {
-  int cpu_info[4];
-  __cpuid(cpu_info, 1);
-  if (feature == kSSE2) {
-    return 0 != (cpu_info[3] & 0x04000000);
-  }
-  if (feature == kSSE3) {
-    return 0 != (cpu_info[2] & 0x00000001);
-  }
-  return 0;
-}
-#else
-// Default to straight C for other platforms.
-static int GetCPUInfo(CPUFeature feature) {
-  (void)feature;
-  return 0;
-}
-#endif
-
-WebRtc_CPUInfo WebRtc_GetCPUInfo = GetCPUInfo;
-WebRtc_CPUInfo WebRtc_GetCPUInfoNoASM = GetCPUInfoNoASM;
diff --git a/system_wrappers/source/cpu_features_android.c b/system_wrappers/source/cpu_features_android.c
deleted file mode 100644
index 0cb3a6c..0000000
--- a/system_wrappers/source/cpu_features_android.c
+++ /dev/null
@@ -1,15 +0,0 @@
-/*
- *  Copyright (c) 2012 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 <cpu-features.h>
-
-uint64_t WebRtc_GetCPUFeaturesARM(void) {
-  return android_getCpuFeatures();
-}
diff --git a/system_wrappers/source/cpu_features_linux.c b/system_wrappers/source/cpu_features_linux.c
deleted file mode 100644
index 112ad03..0000000
--- a/system_wrappers/source/cpu_features_linux.c
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- *  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 <stdlib.h>
-#include <string.h>
-#include <features.h>
-#ifndef __GLIBC_PREREQ
-#define __GLIBC_PREREQ(a, b) 0
-#endif
-#if __GLIBC_PREREQ(2, 16)
-#include <sys/auxv.h>
-#else
-#include <fcntl.h>
-#include <unistd.h>
-#include <errno.h>
-#include <link.h>
-#endif
-#include "webrtc/system_wrappers/include/cpu_features_wrapper.h"
-
-#if defined(WEBRTC_ARCH_ARM_FAMILY)
-#include <asm/hwcap.h>
-
-uint64_t WebRtc_GetCPUFeaturesARM(void) {
-  uint64_t result = 0;
-  int architecture = 0;
-  unsigned long hwcap = 0;
-  const char* platform = NULL;
-#if __GLIBC_PREREQ(2, 16)
-  hwcap = getauxval(AT_HWCAP);
-  platform = (const char*)getauxval(AT_PLATFORM);
-#else
-  ElfW(auxv_t) auxv;
-  int fd = open("/proc/self/auxv", O_RDONLY);
-  if (fd >= 0) {
-    while (hwcap == 0 || platform == NULL) {
-      if (read(fd, &auxv, sizeof(auxv)) < (ssize_t)sizeof(auxv)) {
-        if (errno == EINTR)
-          continue;
-        break;
-      }
-      switch (auxv.a_type) {
-        case AT_HWCAP:
-          hwcap = auxv.a_un.a_val;
-          break;
-        case AT_PLATFORM:
-          platform = (const char*)auxv.a_un.a_val;
-          break;
-      }
-    }
-    close(fd);
-  }
-#endif  // __GLIBC_PREREQ(2,16)
-#if defined(__aarch64__)
-  architecture = 8;
-  if ((hwcap & HWCAP_FP) != 0)
-    result |= kCPUFeatureVFPv3;
-  if ((hwcap & HWCAP_ASIMD) != 0)
-    result |= kCPUFeatureNEON;
-#else
-  if (platform != NULL) {
-    /* expect a string in the form "v6l" or "v7l", etc.
-     */
-    if (platform[0] == 'v' && '0' <= platform[1] && platform[1] <= '9' &&
-        (platform[2] == 'l' || platform[2] == 'b')) {
-      architecture = platform[1] - '0';
-    }
-  }
-  if ((hwcap & HWCAP_VFPv3) != 0)
-    result |= kCPUFeatureVFPv3;
-  if ((hwcap & HWCAP_NEON) != 0)
-    result |= kCPUFeatureNEON;
-#endif
-  if (architecture >= 7)
-    result |= kCPUFeatureARMv7;
-  if (architecture >= 6)
-    result |= kCPUFeatureLDREXSTREX;
-  return result;
-}
-#endif  // WEBRTC_ARCH_ARM_FAMILY
diff --git a/system_wrappers/source/cpu_info.cc b/system_wrappers/source/cpu_info.cc
deleted file mode 100644
index 590d2d9..0000000
--- a/system_wrappers/source/cpu_info.cc
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- *  Copyright (c) 2011 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/system_wrappers/include/cpu_info.h"
-
-#if defined(WEBRTC_WIN)
-#include <winsock2.h>
-#include <windows.h>
-#ifndef EXCLUDE_D3D9
-#include <d3d9.h>
-#endif
-#elif defined(WEBRTC_LINUX)
-#include <unistd.h>
-#endif
-#if defined(WEBRTC_MAC)
-#include <sys/sysctl.h>
-#endif
-
-#include "webrtc/rtc_base/logging.h"
-
-namespace internal {
-static int DetectNumberOfCores() {
-  // We fall back on assuming a single core in case of errors.
-  int number_of_cores = 1;
-
-#if defined(WEBRTC_WIN)
-  SYSTEM_INFO si;
-  GetNativeSystemInfo(&si);
-  number_of_cores = static_cast<int>(si.dwNumberOfProcessors);
-#elif defined(WEBRTC_LINUX) || defined(WEBRTC_ANDROID)
-  number_of_cores = static_cast<int>(sysconf(_SC_NPROCESSORS_ONLN));
-#elif defined(WEBRTC_MAC)
-  int name[] = {CTL_HW, HW_AVAILCPU};
-  size_t size = sizeof(number_of_cores);
-  if (0 != sysctl(name, 2, &number_of_cores, &size, NULL, 0)) {
-    LOG(LS_ERROR) << "Failed to get number of cores";
-    number_of_cores = 1;
-  }
-#else
-  LOG(LS_ERROR) << "No function to get number of cores";
-#endif
-
-  LOG(LS_INFO) << "Available number of cores: " << number_of_cores;
-
-  return number_of_cores;
-}
-}
-
-namespace webrtc {
-
-uint32_t CpuInfo::DetectNumberOfCores() {
-  // Statically cache the number of system cores available since if the process
-  // is running in a sandbox, we may only be able to read the value once (before
-  // the sandbox is initialized) and not thereafter.
-  // For more information see crbug.com/176522.
-  static uint32_t logical_cpus = 0;
-  if (!logical_cpus)
-    logical_cpus = static_cast<uint32_t>(internal::DetectNumberOfCores());
-  return logical_cpus;
-}
-
-}  // namespace webrtc
diff --git a/system_wrappers/source/event.cc b/system_wrappers/source/event.cc
deleted file mode 100644
index 2f08a1a..0000000
--- a/system_wrappers/source/event.cc
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- *  Copyright (c) 2011 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/system_wrappers/include/event_wrapper.h"
-
-#if defined(_WIN32)
-#include <windows.h>
-#include "webrtc/system_wrappers/source/event_timer_win.h"
-#elif defined(WEBRTC_MAC) && !defined(WEBRTC_IOS)
-#include <ApplicationServices/ApplicationServices.h>
-#include <pthread.h>
-#include "webrtc/system_wrappers/source/event_timer_posix.h"
-#else
-#include <pthread.h>
-#include "webrtc/system_wrappers/source/event_timer_posix.h"
-#endif
-
-#include "webrtc/rtc_base/event.h"
-
-namespace webrtc {
-
-class EventWrapperImpl : public EventWrapper {
- public:
-  EventWrapperImpl() : event_(false, false) {}
-  ~EventWrapperImpl() override {}
-
-  bool Set() override {
-    event_.Set();
-    return true;
-  }
-
-  EventTypeWrapper Wait(unsigned long max_time) override {
-    int to_wait = max_time == WEBRTC_EVENT_INFINITE ?
-        rtc::Event::kForever : static_cast<int>(max_time);
-    return event_.Wait(to_wait) ? kEventSignaled : kEventTimeout;
-  }
-
- private:
-  rtc::Event event_;
-};
-
-// static
-EventWrapper* EventWrapper::Create() {
-  return new EventWrapperImpl();
-}
-
-}  // namespace webrtc
diff --git a/system_wrappers/source/event_timer_posix.cc b/system_wrappers/source/event_timer_posix.cc
deleted file mode 100644
index dead7c9..0000000
--- a/system_wrappers/source/event_timer_posix.cc
+++ /dev/null
@@ -1,261 +0,0 @@
-/*
- *  Copyright (c) 2011 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/system_wrappers/source/event_timer_posix.h"
-
-#include <errno.h>
-#include <pthread.h>
-#include <signal.h>
-#include <stdio.h>
-#include <string.h>
-#include <sys/time.h>
-#include <unistd.h>
-
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-
-// static
-EventTimerWrapper* EventTimerWrapper::Create() {
-  return new EventTimerPosix();
-}
-
-const int64_t kNanosecondsPerMillisecond = 1000000;
-const int64_t kNanosecondsPerSecond = 1000000000;
-
-EventTimerPosix::EventTimerPosix()
-    : event_set_(false),
-      timer_thread_(nullptr),
-      created_at_(),
-      periodic_(false),
-      time_ms_(0),
-      count_(0),
-      is_stopping_(false) {
-  pthread_mutexattr_t attr;
-  pthread_mutexattr_init(&attr);
-  pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
-  pthread_mutex_init(&mutex_, &attr);
-  pthread_condattr_t cond_attr;
-  pthread_condattr_init(&cond_attr);
-// TODO(sprang): Remove HAVE_PTHREAD_COND_TIMEDWAIT_MONOTONIC special case once
-// all supported Android platforms support pthread_condattr_setclock.
-// TODO(sprang): Add support for monotonic clock on Apple platforms.
-#if !(defined(WEBRTC_MAC) || defined(WEBRTC_IOS)) && \
-    !(defined(WEBRTC_ANDROID) &&                     \
-      defined(HAVE_PTHREAD_COND_TIMEDWAIT_MONOTONIC))
-  pthread_condattr_setclock(&cond_attr, CLOCK_MONOTONIC);
-#endif
-  pthread_cond_init(&cond_, &cond_attr);
-  pthread_condattr_destroy(&cond_attr);
-}
-
-EventTimerPosix::~EventTimerPosix() {
-  StopTimer();
-  pthread_cond_destroy(&cond_);
-  pthread_mutex_destroy(&mutex_);
-}
-
-// TODO(pbos): Make this void.
-bool EventTimerPosix::Set() {
-  RTC_CHECK_EQ(0, pthread_mutex_lock(&mutex_));
-  event_set_ = true;
-  pthread_cond_signal(&cond_);
-  pthread_mutex_unlock(&mutex_);
-  return true;
-}
-
-EventTypeWrapper EventTimerPosix::Wait(unsigned long timeout_ms) {
-  int ret_val = 0;
-  RTC_CHECK_EQ(0, pthread_mutex_lock(&mutex_));
-
-  if (!event_set_) {
-    if (WEBRTC_EVENT_INFINITE != timeout_ms) {
-      timespec end_at;
-#ifndef WEBRTC_MAC
-      clock_gettime(CLOCK_MONOTONIC, &end_at);
-#else
-      timeval value;
-      struct timezone time_zone;
-      time_zone.tz_minuteswest = 0;
-      time_zone.tz_dsttime = 0;
-      gettimeofday(&value, &time_zone);
-      TIMEVAL_TO_TIMESPEC(&value, &end_at);
-#endif
-      end_at.tv_sec += timeout_ms / 1000;
-      end_at.tv_nsec += (timeout_ms % 1000) * kNanosecondsPerMillisecond;
-
-      if (end_at.tv_nsec >= kNanosecondsPerSecond) {
-        end_at.tv_sec++;
-        end_at.tv_nsec -= kNanosecondsPerSecond;
-      }
-      while (ret_val == 0 && !event_set_) {
-#if defined(WEBRTC_ANDROID) && defined(HAVE_PTHREAD_COND_TIMEDWAIT_MONOTONIC)
-        ret_val = pthread_cond_timedwait_monotonic_np(&cond_, &mutex_, &end_at);
-#else
-        ret_val = pthread_cond_timedwait(&cond_, &mutex_, &end_at);
-#endif  // WEBRTC_ANDROID && HAVE_PTHREAD_COND_TIMEDWAIT_MONOTONIC
-      }
-    } else {
-      while (ret_val == 0 && !event_set_)
-        ret_val = pthread_cond_wait(&cond_, &mutex_);
-    }
-  }
-
-  RTC_DCHECK(ret_val == 0 || ret_val == ETIMEDOUT);
-
-  // Reset and signal if set, regardless of why the thread woke up.
-  if (event_set_) {
-    ret_val = 0;
-    event_set_ = false;
-  }
-  pthread_mutex_unlock(&mutex_);
-
-  return ret_val == 0 ? kEventSignaled : kEventTimeout;
-}
-
-EventTypeWrapper EventTimerPosix::Wait(timespec* end_at, bool reset_event) {
-  int ret_val = 0;
-  RTC_CHECK_EQ(0, pthread_mutex_lock(&mutex_));
-  if (reset_event) {
-    // Only wake for new events or timeouts.
-    event_set_ = false;
-  }
-
-  while (ret_val == 0 && !event_set_) {
-#if defined(WEBRTC_ANDROID) && defined(HAVE_PTHREAD_COND_TIMEDWAIT_MONOTONIC)
-    ret_val = pthread_cond_timedwait_monotonic_np(&cond_, &mutex_, end_at);
-#else
-    ret_val = pthread_cond_timedwait(&cond_, &mutex_, end_at);
-#endif  // WEBRTC_ANDROID && HAVE_PTHREAD_COND_TIMEDWAIT_MONOTONIC
-  }
-
-  RTC_DCHECK(ret_val == 0 || ret_val == ETIMEDOUT);
-
-  // Reset and signal if set, regardless of why the thread woke up.
-  if (event_set_) {
-    ret_val = 0;
-    event_set_ = false;
-  }
-  pthread_mutex_unlock(&mutex_);
-
-  return ret_val == 0 ? kEventSignaled : kEventTimeout;
-}
-
-rtc::PlatformThread* EventTimerPosix::CreateThread() {
-  const char* kThreadName = "WebRtc_event_timer_thread";
-  return new rtc::PlatformThread(Run, this, kThreadName);
-}
-
-bool EventTimerPosix::StartTimer(bool periodic, unsigned long time_ms) {
-  pthread_mutex_lock(&mutex_);
-  if (timer_thread_) {
-    if (periodic_) {
-      // Timer already started.
-      pthread_mutex_unlock(&mutex_);
-      return false;
-    } else  {
-      // New one shot timer.
-      time_ms_ = time_ms;
-      created_at_.tv_sec = 0;
-      timer_event_->Set();
-      pthread_mutex_unlock(&mutex_);
-      return true;
-    }
-  }
-
-  // Start the timer thread.
-  timer_event_.reset(new EventTimerPosix());
-  timer_thread_.reset(CreateThread());
-  periodic_ = periodic;
-  time_ms_ = time_ms;
-  timer_thread_->Start();
-  timer_thread_->SetPriority(rtc::kRealtimePriority);
-  pthread_mutex_unlock(&mutex_);
-
-  return true;
-}
-
-bool EventTimerPosix::Run(void* obj) {
-  return static_cast<EventTimerPosix*>(obj)->Process();
-}
-
-bool EventTimerPosix::Process() {
-  pthread_mutex_lock(&mutex_);
-  if (is_stopping_) {
-    pthread_mutex_unlock(&mutex_);
-    return false;
-  }
-  if (created_at_.tv_sec == 0) {
-#ifndef WEBRTC_MAC
-    RTC_CHECK_EQ(0, clock_gettime(CLOCK_MONOTONIC, &created_at_));
-#else
-    timeval value;
-    struct timezone time_zone;
-    time_zone.tz_minuteswest = 0;
-    time_zone.tz_dsttime = 0;
-    gettimeofday(&value, &time_zone);
-    TIMEVAL_TO_TIMESPEC(&value, &created_at_);
-#endif
-    count_ = 0;
-  }
-
-  timespec end_at;
-  unsigned long long total_delta_ms = time_ms_ * ++count_;
-  if (!periodic_ && count_ >= 1) {
-    // No need to wake up often if we're not going to signal waiting threads.
-    total_delta_ms =
-        std::min<uint64_t>(total_delta_ms, 60 * kNanosecondsPerSecond);
-  }
-
-  end_at.tv_sec = created_at_.tv_sec + total_delta_ms / 1000;
-  end_at.tv_nsec = created_at_.tv_nsec +
-                   (total_delta_ms % 1000) * kNanosecondsPerMillisecond;
-
-  if (end_at.tv_nsec >= kNanosecondsPerSecond) {
-    end_at.tv_sec++;
-    end_at.tv_nsec -= kNanosecondsPerSecond;
-  }
-
-  pthread_mutex_unlock(&mutex_);
-  // Reset event on first call so that we don't immediately return here if this
-  // thread was not blocked on timer_event_->Wait when the StartTimer() call
-  // was made.
-  if (timer_event_->Wait(&end_at, count_ == 1) == kEventSignaled)
-    return true;
-
-  pthread_mutex_lock(&mutex_);
-  if (periodic_ || count_ == 1)
-    Set();
-  pthread_mutex_unlock(&mutex_);
-
-  return true;
-}
-
-bool EventTimerPosix::StopTimer() {
-  pthread_mutex_lock(&mutex_);
-  is_stopping_ = true;
-  pthread_mutex_unlock(&mutex_);
-
-  if (timer_event_)
-    timer_event_->Set();
-
-  if (timer_thread_) {
-    timer_thread_->Stop();
-    timer_thread_.reset();
-  }
-  timer_event_.reset();
-
-  // Set time to zero to force new reference time for the timer.
-  memset(&created_at_, 0, sizeof(created_at_));
-  count_ = 0;
-  return true;
-}
-
-}  // namespace webrtc
diff --git a/system_wrappers/source/event_timer_posix.h b/system_wrappers/source/event_timer_posix.h
deleted file mode 100644
index 1b01e4b..0000000
--- a/system_wrappers/source/event_timer_posix.h
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- *  Copyright (c) 2011 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_SYSTEM_WRAPPERS_SOURCE_EVENT_POSIX_H_
-#define WEBRTC_SYSTEM_WRAPPERS_SOURCE_EVENT_POSIX_H_
-
-#include "webrtc/system_wrappers/include/event_wrapper.h"
-
-#include <memory>
-
-#include <pthread.h>
-#include <time.h>
-
-#include "webrtc/rtc_base/platform_thread.h"
-
-namespace webrtc {
-
-enum State {
-  kUp = 1,
-  kDown = 2
-};
-
-class EventTimerPosix : public EventTimerWrapper {
- public:
-  EventTimerPosix();
-  ~EventTimerPosix() override;
-
-  EventTypeWrapper Wait(unsigned long max_time) override;
-  bool Set() override;
-
-  bool StartTimer(bool periodic, unsigned long time) override;
-  bool StopTimer() override;
-
- private:
-  friend class EventTimerPosixTest;
-
-  static bool Run(void* obj);
-  bool Process();
-  EventTypeWrapper Wait(timespec* end_at, bool reset_state);
-
-  virtual rtc::PlatformThread* CreateThread();
-
-  pthread_cond_t  cond_;
-  pthread_mutex_t mutex_;
-  bool event_set_;
-
-  // TODO(pbos): Remove unique_ptr and use PlatformThread directly.
-  std::unique_ptr<rtc::PlatformThread> timer_thread_;
-  std::unique_ptr<EventTimerPosix> timer_event_;
-  timespec       created_at_;
-
-  bool          periodic_;
-  unsigned long time_ms_;
-  unsigned long count_;
-  bool is_stopping_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_SYSTEM_WRAPPERS_SOURCE_EVENT_POSIX_H_
diff --git a/system_wrappers/source/event_timer_posix_unittest.cc b/system_wrappers/source/event_timer_posix_unittest.cc
deleted file mode 100644
index 5feac80..0000000
--- a/system_wrappers/source/event_timer_posix_unittest.cc
+++ /dev/null
@@ -1,198 +0,0 @@
-/*
- *  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/system_wrappers/source/event_timer_posix.h"
-
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/event.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-enum class ThreadState {
-  kNotStarted,
-  kWaiting,
-  kRequestProcessCall,
-  kCallingProcess,
-  kProcessDone,
-  kContinue,
-  kExiting,
-  kDead
-};
-
-class EventTimerPosixTest : public testing::Test, public EventTimerPosix {
- public:
-  EventTimerPosixTest()
-      : thread_state_(ThreadState::kNotStarted),
-        process_event_(false, true),
-        main_event_(false, true),
-        process_thread_id_(0),
-        process_thread_(nullptr) {}
-  virtual ~EventTimerPosixTest() {}
-
-  rtc::PlatformThread* CreateThread() override {
-    EXPECT_TRUE(process_thread_ == nullptr);
-    process_thread_ =
-        new rtc::PlatformThread(Run, this, "EventTimerPosixTestThread");
-    return process_thread_;
-  }
-
-  static bool Run(void* obj) {
-    return static_cast<EventTimerPosixTest*>(obj)->Process();
-  }
-
-  bool Process() {
-    bool res = ProcessInternal();
-    if (!res) {
-      rtc::CritScope cs(&lock_);
-      thread_state_ = ThreadState::kDead;
-      main_event_.Set();
-    }
-    return res;
-  }
-
-  bool ProcessInternal() {
-    {
-      rtc::CritScope cs(&lock_);
-      if (thread_state_ == ThreadState::kNotStarted) {
-        if (!ChangeThreadState(ThreadState::kNotStarted,
-                               ThreadState::kContinue)) {
-          ADD_FAILURE() << "Unable to start process thread";
-          return false;
-        }
-        process_thread_id_ = rtc::CurrentThreadId();
-      }
-    }
-
-    if (!ChangeThreadState(ThreadState::kContinue, ThreadState::kWaiting))
-      return false;
-
-    if (!AwaitThreadState(ThreadState::kRequestProcessCall,
-                          rtc::Event::kForever))
-      return false;
-
-    if (!ChangeThreadState(ThreadState::kRequestProcessCall,
-                           ThreadState::kCallingProcess))
-      return false;
-
-    EventTimerPosix::Process();
-
-    if (!ChangeThreadState(ThreadState::kCallingProcess,
-                           ThreadState::kProcessDone))
-      return false;
-
-    if (!AwaitThreadState(ThreadState::kContinue, rtc::Event::kForever))
-      return false;
-
-    return true;
-  }
-
-  bool IsProcessThread() {
-    rtc::CritScope cs(&lock_);
-    return process_thread_id_ == rtc::CurrentThreadId();
-  }
-
-  bool ChangeThreadState(ThreadState prev_state, ThreadState new_state) {
-    rtc::CritScope cs(&lock_);
-    if (thread_state_ != prev_state)
-      return false;
-    thread_state_ = new_state;
-    if (IsProcessThread()) {
-      main_event_.Set();
-    } else {
-      process_event_.Set();
-    }
-    return true;
-  }
-
-  bool AwaitThreadState(ThreadState state, int timeout) {
-    rtc::Event* event = IsProcessThread() ? &process_event_ : &main_event_;
-    do {
-      rtc::CritScope cs(&lock_);
-      if (state != ThreadState::kDead && thread_state_ == ThreadState::kExiting)
-        return false;
-      if (thread_state_ == state)
-        return true;
-    } while (event->Wait(timeout));
-    return false;
-  }
-
-  bool CallProcess(int timeout_ms) {
-    return AwaitThreadState(ThreadState::kWaiting, timeout_ms) &&
-           ChangeThreadState(ThreadState::kWaiting,
-                             ThreadState::kRequestProcessCall);
-  }
-
-  bool AwaitProcessDone(int timeout_ms) {
-    return AwaitThreadState(ThreadState::kProcessDone, timeout_ms) &&
-           ChangeThreadState(ThreadState::kProcessDone, ThreadState::kContinue);
-  }
-
-  void TearDown() override {
-    if (process_thread_) {
-      {
-        rtc::CritScope cs(&lock_);
-        if (thread_state_ != ThreadState::kDead) {
-          thread_state_ = ThreadState::kExiting;
-          process_event_.Set();
-        }
-      }
-      ASSERT_TRUE(AwaitThreadState(ThreadState::kDead, 5000));
-    }
-  }
-
-  ThreadState thread_state_;
-  rtc::CriticalSection lock_;
-  rtc::Event process_event_;
-  rtc::Event main_event_;
-  rtc::PlatformThreadId process_thread_id_;
-  rtc::PlatformThread* process_thread_;
-};
-
-TEST_F(EventTimerPosixTest, WaiterBlocksUntilTimeout) {
-  const int kTimerIntervalMs = 100;
-  const int kTimeoutMs = 5000;
-  ASSERT_TRUE(StartTimer(false, kTimerIntervalMs));
-  ASSERT_TRUE(CallProcess(kTimeoutMs));
-  EventTypeWrapper res = Wait(kTimeoutMs);
-  EXPECT_EQ(kEventSignaled, res);
-  ASSERT_TRUE(AwaitProcessDone(kTimeoutMs));
-}
-
-TEST_F(EventTimerPosixTest, WaiterWakesImmediatelyAfterTimeout) {
-  const int kTimerIntervalMs = 100;
-  const int kTimeoutMs = 5000;
-  ASSERT_TRUE(StartTimer(false, kTimerIntervalMs));
-  ASSERT_TRUE(CallProcess(kTimeoutMs));
-  ASSERT_TRUE(AwaitProcessDone(kTimeoutMs));
-  EventTypeWrapper res = Wait(0);
-  EXPECT_EQ(kEventSignaled, res);
-}
-
-TEST_F(EventTimerPosixTest, WaiterBlocksUntilTimeoutProcessInactiveOnStart) {
-  const int kTimerIntervalMs = 100;
-  const int kTimeoutMs = 5000;
-  // First call to StartTimer initializes thread.
-  ASSERT_TRUE(StartTimer(false, kTimerIntervalMs));
-
-  // Process thread currently _not_ blocking on Process() call.
-  ASSERT_TRUE(AwaitThreadState(ThreadState::kWaiting, kTimeoutMs));
-
-  // Start new one-off timer, then call Process().
-  ASSERT_TRUE(StartTimer(false, kTimerIntervalMs));
-  ASSERT_TRUE(CallProcess(kTimeoutMs));
-
-  EventTypeWrapper res = Wait(kTimeoutMs);
-  EXPECT_EQ(kEventSignaled, res);
-
-  ASSERT_TRUE(AwaitProcessDone(kTimeoutMs));
-}
-
-}  // namespace webrtc
diff --git a/system_wrappers/source/event_timer_win.cc b/system_wrappers/source/event_timer_win.cc
deleted file mode 100644
index 4c58698..0000000
--- a/system_wrappers/source/event_timer_win.cc
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- *  Copyright (c) 2012 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/system_wrappers/source/event_timer_win.h"
-
-#include "Mmsystem.h"
-
-namespace webrtc {
-
-// static
-EventTimerWrapper* EventTimerWrapper::Create() {
-  return new EventTimerWin();
-}
-
-EventTimerWin::EventTimerWin()
-    : event_(::CreateEvent(NULL,    // security attributes
-                           FALSE,   // manual reset
-                           FALSE,   // initial state
-                           NULL)),  // name of event
-    timerID_(NULL) {
-}
-
-EventTimerWin::~EventTimerWin() {
-  StopTimer();
-  CloseHandle(event_);
-}
-
-bool EventTimerWin::Set() {
-  // Note: setting an event that is already set has no effect.
-  return SetEvent(event_) == 1;
-}
-
-EventTypeWrapper EventTimerWin::Wait(unsigned long max_time) {
-  unsigned long res = WaitForSingleObject(event_, max_time);
-  switch (res) {
-    case WAIT_OBJECT_0:
-      return kEventSignaled;
-    case WAIT_TIMEOUT:
-      return kEventTimeout;
-    default:
-      return kEventError;
-  }
-}
-
-bool EventTimerWin::StartTimer(bool periodic, unsigned long time) {
-  if (timerID_ != NULL) {
-    timeKillEvent(timerID_);
-    timerID_ = NULL;
-  }
-
-  if (periodic) {
-    timerID_ = timeSetEvent(time, 0, (LPTIMECALLBACK)HANDLE(event_), 0,
-                            TIME_PERIODIC | TIME_CALLBACK_EVENT_PULSE);
-  } else {
-    timerID_ = timeSetEvent(time, 0, (LPTIMECALLBACK)HANDLE(event_), 0,
-                            TIME_ONESHOT | TIME_CALLBACK_EVENT_SET);
-  }
-
-  return timerID_ != NULL;
-}
-
-bool EventTimerWin::StopTimer() {
-  if (timerID_ != NULL) {
-    timeKillEvent(timerID_);
-    timerID_ = NULL;
-  }
-
-  return true;
-}
-
-}  // namespace webrtc
diff --git a/system_wrappers/source/event_timer_win.h b/system_wrappers/source/event_timer_win.h
deleted file mode 100644
index 163cdde..0000000
--- a/system_wrappers/source/event_timer_win.h
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- *  Copyright (c) 2011 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_SYSTEM_WRAPPERS_SOURCE_EVENT_WIN_H_
-#define WEBRTC_SYSTEM_WRAPPERS_SOURCE_EVENT_WIN_H_
-
-#include <windows.h>
-
-#include "webrtc/system_wrappers/include/event_wrapper.h"
-
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-class EventTimerWin : public EventTimerWrapper {
- public:
-  EventTimerWin();
-  virtual ~EventTimerWin();
-
-  virtual EventTypeWrapper Wait(unsigned long max_time);
-  virtual bool Set();
-
-  virtual bool StartTimer(bool periodic, unsigned long time);
-  virtual bool StopTimer();
-
- private:
-  HANDLE  event_;
-  uint32_t timerID_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_SYSTEM_WRAPPERS_SOURCE_EVENT_WIN_H_
diff --git a/system_wrappers/source/field_trial_default.cc b/system_wrappers/source/field_trial_default.cc
deleted file mode 100644
index 0e2c286..0000000
--- a/system_wrappers/source/field_trial_default.cc
+++ /dev/null
@@ -1,66 +0,0 @@
-// Copyright (c) 2014 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/system_wrappers/include/field_trial.h"
-#include "webrtc/system_wrappers/include/field_trial_default.h"
-
-#include <string>
-
-// Simple field trial implementation, which allows client to
-// specify desired flags in InitFieldTrialsFromString.
-namespace webrtc {
-namespace field_trial {
-
-static const char *trials_init_string = NULL;
-
-std::string FindFullName(const std::string& name) {
-  if (trials_init_string == NULL)
-    return std::string();
-
-  std::string trials_string(trials_init_string);
-  if (trials_string.empty())
-    return std::string();
-
-  static const char kPersistentStringSeparator = '/';
-  size_t next_item = 0;
-  while (next_item < trials_string.length()) {
-
-    // Find next name/value pair in field trial configuration string.
-    size_t field_name_end = trials_string.find(
-        kPersistentStringSeparator, next_item);
-    if (field_name_end == trials_string.npos || field_name_end == next_item)
-      break;
-    size_t field_value_end = trials_string.find(
-        kPersistentStringSeparator, field_name_end + 1);
-    if (field_value_end == trials_string.npos ||
-        field_value_end == field_name_end + 1)
-      break;
-    std::string field_name(trials_string, next_item,
-        field_name_end - next_item);
-    std::string field_value(trials_string, field_name_end + 1,
-        field_value_end - field_name_end - 1);
-    next_item = field_value_end + 1;
-
-    if (name == field_name)
-      return field_value;
-  }
-  return std::string();
-}
-
-// Optionally initialize field trial from a string.
-void InitFieldTrialsFromString(const char* trials_string) {
-  trials_init_string = trials_string;
-}
-
-const char* GetFieldTrialString() {
-  return trials_init_string;
-}
-
-}  // namespace field_trial
-}  // namespace webrtc
diff --git a/system_wrappers/source/file_impl.cc b/system_wrappers/source/file_impl.cc
deleted file mode 100644
index f62e712..0000000
--- a/system_wrappers/source/file_impl.cc
+++ /dev/null
@@ -1,152 +0,0 @@
-/*
- *  Copyright (c) 2012 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/system_wrappers/include/file_wrapper.h"
-
-#ifdef _WIN32
-#include <Windows.h>
-#else
-#include <stdarg.h>
-#include <string.h>
-#endif
-
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-namespace {
-FILE* FileOpen(const char* file_name_utf8, bool read_only) {
-#if defined(_WIN32)
-  int len = MultiByteToWideChar(CP_UTF8, 0, file_name_utf8, -1, nullptr, 0);
-  std::wstring wstr(len, 0);
-  MultiByteToWideChar(CP_UTF8, 0, file_name_utf8, -1, &wstr[0], len);
-  FILE* file = _wfopen(wstr.c_str(), read_only ? L"rb" : L"wb");
-#else
-  FILE* file = fopen(file_name_utf8, read_only ? "rb" : "wb");
-#endif
-  return file;
-}
-}  // namespace
-
-// static
-FileWrapper* FileWrapper::Create() {
-  return new FileWrapper();
-}
-
-// static
-FileWrapper FileWrapper::Open(const char* file_name_utf8, bool read_only) {
-  return FileWrapper(FileOpen(file_name_utf8, read_only), 0);
-}
-
-FileWrapper::FileWrapper() {}
-
-FileWrapper::FileWrapper(FILE* file, size_t max_size)
-    : file_(file), max_size_in_bytes_(max_size) {}
-
-FileWrapper::~FileWrapper() {
-  CloseFileImpl();
-}
-
-FileWrapper::FileWrapper(FileWrapper&& other) {
-  operator=(std::move(other));
-}
-
-FileWrapper& FileWrapper::operator=(FileWrapper&& other) {
-  file_ = other.file_;
-  max_size_in_bytes_ = other.max_size_in_bytes_;
-  position_ = other.position_;
-  other.file_ = nullptr;
-  return *this;
-}
-
-void FileWrapper::CloseFile() {
-  rtc::CritScope lock(&lock_);
-  CloseFileImpl();
-}
-
-int FileWrapper::Rewind() {
-  rtc::CritScope lock(&lock_);
-  if (file_ != nullptr) {
-    position_ = 0;
-    return fseek(file_, 0, SEEK_SET);
-  }
-  return -1;
-}
-
-void FileWrapper::SetMaxFileSize(size_t bytes) {
-  rtc::CritScope lock(&lock_);
-  max_size_in_bytes_ = bytes;
-}
-
-int FileWrapper::Flush() {
-  rtc::CritScope lock(&lock_);
-  return FlushImpl();
-}
-
-bool FileWrapper::OpenFile(const char* file_name_utf8, bool read_only) {
-  size_t length = strlen(file_name_utf8);
-  if (length > kMaxFileNameSize - 1)
-    return false;
-
-  rtc::CritScope lock(&lock_);
-  if (file_ != nullptr)
-    return false;
-
-  file_ = FileOpen(file_name_utf8, read_only);
-  return file_ != nullptr;
-}
-
-bool FileWrapper::OpenFromFileHandle(FILE* handle) {
-  if (!handle)
-    return false;
-  rtc::CritScope lock(&lock_);
-  CloseFileImpl();
-  file_ = handle;
-  return true;
-}
-
-int FileWrapper::Read(void* buf, size_t length) {
-  rtc::CritScope lock(&lock_);
-  if (file_ == nullptr)
-    return -1;
-
-  size_t bytes_read = fread(buf, 1, length, file_);
-  return static_cast<int>(bytes_read);
-}
-
-bool FileWrapper::Write(const void* buf, size_t length) {
-  if (buf == nullptr)
-    return false;
-
-  rtc::CritScope lock(&lock_);
-
-  if (file_ == nullptr)
-    return false;
-
-  // Check if it's time to stop writing.
-  if (max_size_in_bytes_ > 0 && (position_ + length) > max_size_in_bytes_)
-    return false;
-
-  size_t num_bytes = fwrite(buf, 1, length, file_);
-  position_ += num_bytes;
-
-  return num_bytes == length;
-}
-
-void FileWrapper::CloseFileImpl() {
-  if (file_ != nullptr)
-    fclose(file_);
-  file_ = nullptr;
-}
-
-int FileWrapper::FlushImpl() {
-  return (file_ != nullptr) ? fflush(file_) : -1;
-}
-
-}  // namespace webrtc
diff --git a/system_wrappers/source/logcat_trace_context.cc b/system_wrappers/source/logcat_trace_context.cc
deleted file mode 100644
index 7ad1b1d..0000000
--- a/system_wrappers/source/logcat_trace_context.cc
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- *  Copyright (c) 2013 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/system_wrappers/include/logcat_trace_context.h"
-
-#include <android/log.h>
-#include <assert.h>
-
-#include "webrtc/rtc_base/logging.h"
-
-namespace webrtc {
-
-static android_LogPriority AndroidLogPriorityFromWebRtcLogLevel(
-    TraceLevel webrtc_level) {
-  // NOTE: this mapping is somewhat arbitrary.  StateInfo and Info are mapped
-  // to DEBUG because they are highly verbose in webrtc code (which is
-  // unfortunate).
-  switch (webrtc_level) {
-    case webrtc::kTraceStateInfo: return ANDROID_LOG_DEBUG;
-    case webrtc::kTraceWarning: return ANDROID_LOG_WARN;
-    case webrtc::kTraceError: return ANDROID_LOG_ERROR;
-    case webrtc::kTraceCritical: return ANDROID_LOG_FATAL;
-    case webrtc::kTraceApiCall: return ANDROID_LOG_VERBOSE;
-    case webrtc::kTraceModuleCall: return ANDROID_LOG_VERBOSE;
-    case webrtc::kTraceMemory: return ANDROID_LOG_VERBOSE;
-    case webrtc::kTraceTimer: return ANDROID_LOG_VERBOSE;
-    case webrtc::kTraceStream: return ANDROID_LOG_VERBOSE;
-    case webrtc::kTraceDebug: return ANDROID_LOG_DEBUG;
-    case webrtc::kTraceInfo: return ANDROID_LOG_DEBUG;
-    case webrtc::kTraceTerseInfo: return ANDROID_LOG_INFO;
-    default:
-      LOG(LS_ERROR) << "Unexpected log level" << webrtc_level;
-      return ANDROID_LOG_FATAL;
-  }
-}
-
-LogcatTraceContext::LogcatTraceContext() {
-  webrtc::Trace::CreateTrace();
-  if (webrtc::Trace::SetTraceCallback(this) != 0)
-    assert(false);
-}
-
-LogcatTraceContext::~LogcatTraceContext() {
-  if (webrtc::Trace::SetTraceCallback(NULL) != 0)
-    assert(false);
-  webrtc::Trace::ReturnTrace();
-}
-
-void LogcatTraceContext::Print(TraceLevel level,
-                               const char* message,
-                               int length) {
-  __android_log_print(AndroidLogPriorityFromWebRtcLogLevel(level),
-                      "WEBRTC", "%.*s", length, message);
-}
-
-}  // namespace webrtc
diff --git a/system_wrappers/source/metrics_default.cc b/system_wrappers/source/metrics_default.cc
deleted file mode 100644
index 6e5715e..0000000
--- a/system_wrappers/source/metrics_default.cc
+++ /dev/null
@@ -1,308 +0,0 @@
-// Copyright (c) 2014 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/system_wrappers/include/metrics_default.h"
-
-#include <algorithm>
-
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/thread_annotations.h"
-#include "webrtc/system_wrappers/include/metrics.h"
-
-// Default implementation of histogram methods for WebRTC clients that do not
-// want to provide their own implementation.
-
-namespace webrtc {
-namespace metrics {
-class Histogram;
-
-namespace {
-// Limit for the maximum number of sample values that can be stored.
-// TODO(asapersson): Consider using bucket count (and set up
-// linearly/exponentially spaced buckets) if samples are logged more frequently.
-const int kMaxSampleMapSize = 300;
-
-class RtcHistogram {
- public:
-  RtcHistogram(const std::string& name, int min, int max, int bucket_count)
-      : min_(min), max_(max), info_(name, min, max, bucket_count) {
-    RTC_DCHECK_GT(bucket_count, 0);
-  }
-
-  void Add(int sample) {
-    sample = std::min(sample, max_);
-    sample = std::max(sample, min_ - 1);  // Underflow bucket.
-
-    rtc::CritScope cs(&crit_);
-    if (info_.samples.size() == kMaxSampleMapSize &&
-        info_.samples.find(sample) == info_.samples.end()) {
-      return;
-    }
-    ++info_.samples[sample];
-  }
-
-  // Returns a copy (or nullptr if there are no samples) and clears samples.
-  std::unique_ptr<SampleInfo> GetAndReset() {
-    rtc::CritScope cs(&crit_);
-    if (info_.samples.empty())
-      return nullptr;
-
-    SampleInfo* copy =
-        new SampleInfo(info_.name, info_.min, info_.max, info_.bucket_count);
-
-    std::swap(info_.samples, copy->samples);
-
-    return std::unique_ptr<SampleInfo>(copy);
-  }
-
-  const std::string& name() const { return info_.name; }
-
-  // Functions only for testing.
-  void Reset() {
-    rtc::CritScope cs(&crit_);
-    info_.samples.clear();
-  }
-
-  int NumEvents(int sample) const {
-    rtc::CritScope cs(&crit_);
-    const auto it = info_.samples.find(sample);
-    return (it == info_.samples.end()) ? 0 : it->second;
-  }
-
-  int NumSamples() const {
-    int num_samples = 0;
-    rtc::CritScope cs(&crit_);
-    for (const auto& sample : info_.samples) {
-      num_samples += sample.second;
-    }
-    return num_samples;
-  }
-
-  int MinSample() const {
-    rtc::CritScope cs(&crit_);
-    return (info_.samples.empty()) ? -1 : info_.samples.begin()->first;
-  }
-
- private:
-  rtc::CriticalSection crit_;
-  const int min_;
-  const int max_;
-  SampleInfo info_ RTC_GUARDED_BY(crit_);
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(RtcHistogram);
-};
-
-class RtcHistogramMap {
- public:
-  RtcHistogramMap() {}
-  ~RtcHistogramMap() {}
-
-  Histogram* GetCountsHistogram(const std::string& name,
-                                int min,
-                                int max,
-                                int bucket_count) {
-    rtc::CritScope cs(&crit_);
-    const auto& it = map_.find(name);
-    if (it != map_.end())
-      return reinterpret_cast<Histogram*>(it->second.get());
-
-    RtcHistogram* hist = new RtcHistogram(name, min, max, bucket_count);
-    map_[name].reset(hist);
-    return reinterpret_cast<Histogram*>(hist);
-  }
-
-  Histogram* GetEnumerationHistogram(const std::string& name, int boundary) {
-    rtc::CritScope cs(&crit_);
-    const auto& it = map_.find(name);
-    if (it != map_.end())
-      return reinterpret_cast<Histogram*>(it->second.get());
-
-    RtcHistogram* hist = new RtcHistogram(name, 1, boundary, boundary + 1);
-    map_[name].reset(hist);
-    return reinterpret_cast<Histogram*>(hist);
-  }
-
-  void GetAndReset(
-      std::map<std::string, std::unique_ptr<SampleInfo>>* histograms) {
-    rtc::CritScope cs(&crit_);
-    for (const auto& kv : map_) {
-      std::unique_ptr<SampleInfo> info = kv.second->GetAndReset();
-      if (info)
-        histograms->insert(std::make_pair(kv.first, std::move(info)));
-    }
-  }
-
-  // Functions only for testing.
-  void Reset() {
-    rtc::CritScope cs(&crit_);
-    for (const auto& kv : map_)
-      kv.second->Reset();
-  }
-
-  int NumEvents(const std::string& name, int sample) const {
-    rtc::CritScope cs(&crit_);
-    const auto& it = map_.find(name);
-    return (it == map_.end()) ? 0 : it->second->NumEvents(sample);
-  }
-
-  int NumSamples(const std::string& name) const {
-    rtc::CritScope cs(&crit_);
-    const auto& it = map_.find(name);
-    return (it == map_.end()) ? 0 : it->second->NumSamples();
-  }
-
-  int MinSample(const std::string& name) const {
-    rtc::CritScope cs(&crit_);
-    const auto& it = map_.find(name);
-    return (it == map_.end()) ? -1 : it->second->MinSample();
-  }
-
- private:
-  rtc::CriticalSection crit_;
-  std::map<std::string, std::unique_ptr<RtcHistogram>> map_
-      RTC_GUARDED_BY(crit_);
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(RtcHistogramMap);
-};
-
-// RtcHistogramMap is allocated upon call to Enable().
-// The histogram getter functions, which return pointer values to the histograms
-// in the map, are cached in WebRTC. Therefore, this memory is not freed by the
-// application (the memory will be reclaimed by the OS).
-static RtcHistogramMap* volatile g_rtc_histogram_map = nullptr;
-
-void CreateMap() {
-  RtcHistogramMap* map = rtc::AtomicOps::AcquireLoadPtr(&g_rtc_histogram_map);
-  if (map == nullptr) {
-    RtcHistogramMap* new_map = new RtcHistogramMap();
-    RtcHistogramMap* old_map = rtc::AtomicOps::CompareAndSwapPtr(
-        &g_rtc_histogram_map, static_cast<RtcHistogramMap*>(nullptr), new_map);
-    if (old_map != nullptr)
-      delete new_map;
-  }
-}
-
-// Set the first time we start using histograms. Used to make sure Enable() is
-// not called thereafter.
-#if RTC_DCHECK_IS_ON
-static volatile int g_rtc_histogram_called = 0;
-#endif
-
-// Gets the map (or nullptr).
-RtcHistogramMap* GetMap() {
-#if RTC_DCHECK_IS_ON
-  rtc::AtomicOps::ReleaseStore(&g_rtc_histogram_called, 1);
-#endif
-  return g_rtc_histogram_map;
-}
-}  // namespace
-
-// Implementation of histogram methods in
-// webrtc/system_wrappers/interface/metrics.h.
-
-// Histogram with exponentially spaced buckets.
-// Creates (or finds) histogram.
-// The returned histogram pointer is cached (and used for adding samples in
-// subsequent calls).
-Histogram* HistogramFactoryGetCounts(const std::string& name,
-                                     int min,
-                                     int max,
-                                     int bucket_count) {
-  // TODO(asapersson): Alternative implementation will be needed if this
-  // histogram type should be truly exponential.
-  return HistogramFactoryGetCountsLinear(name, min, max, bucket_count);
-}
-
-// Histogram with linearly spaced buckets.
-// Creates (or finds) histogram.
-// The returned histogram pointer is cached (and used for adding samples in
-// subsequent calls).
-Histogram* HistogramFactoryGetCountsLinear(const std::string& name,
-                                           int min,
-                                           int max,
-                                           int bucket_count) {
-  RtcHistogramMap* map = GetMap();
-  if (!map)
-    return nullptr;
-
-  return map->GetCountsHistogram(name, min, max, bucket_count);
-}
-
-// Histogram with linearly spaced buckets.
-// Creates (or finds) histogram.
-// The returned histogram pointer is cached (and used for adding samples in
-// subsequent calls).
-Histogram* HistogramFactoryGetEnumeration(const std::string& name,
-                                          int boundary) {
-  RtcHistogramMap* map = GetMap();
-  if (!map)
-    return nullptr;
-
-  return map->GetEnumerationHistogram(name, boundary);
-}
-
-const std::string& GetHistogramName(Histogram* histogram_pointer) {
-  RtcHistogram* ptr = reinterpret_cast<RtcHistogram*>(histogram_pointer);
-  return ptr->name();
-}
-
-// Fast path. Adds |sample| to cached |histogram_pointer|.
-void HistogramAdd(Histogram* histogram_pointer, int sample) {
-  RtcHistogram* ptr = reinterpret_cast<RtcHistogram*>(histogram_pointer);
-  ptr->Add(sample);
-}
-
-SampleInfo::SampleInfo(const std::string& name,
-                       int min,
-                       int max,
-                       size_t bucket_count)
-    : name(name), min(min), max(max), bucket_count(bucket_count) {}
-
-SampleInfo::~SampleInfo() {}
-
-// Implementation of global functions in metrics_default.h.
-void Enable() {
-  RTC_DCHECK(g_rtc_histogram_map == nullptr);
-#if RTC_DCHECK_IS_ON
-  RTC_DCHECK_EQ(0, rtc::AtomicOps::AcquireLoad(&g_rtc_histogram_called));
-#endif
-  CreateMap();
-}
-
-void GetAndReset(
-    std::map<std::string, std::unique_ptr<SampleInfo>>* histograms) {
-  histograms->clear();
-  RtcHistogramMap* map = GetMap();
-  if (map)
-    map->GetAndReset(histograms);
-}
-
-void Reset() {
-  RtcHistogramMap* map = GetMap();
-  if (map)
-    map->Reset();
-}
-
-int NumEvents(const std::string& name, int sample) {
-  RtcHistogramMap* map = GetMap();
-  return map ? map->NumEvents(name, sample) : 0;
-}
-
-int NumSamples(const std::string& name) {
-  RtcHistogramMap* map = GetMap();
-  return map ? map->NumSamples(name) : 0;
-}
-
-int MinSample(const std::string& name) {
-  RtcHistogramMap* map = GetMap();
-  return map ? map->MinSample(name) : -1;
-}
-
-}  // namespace metrics
-}  // namespace webrtc
diff --git a/system_wrappers/source/metrics_default_unittest.cc b/system_wrappers/source/metrics_default_unittest.cc
deleted file mode 100644
index 0414bc7..0000000
--- a/system_wrappers/source/metrics_default_unittest.cc
+++ /dev/null
@@ -1,163 +0,0 @@
-/*
- *  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/system_wrappers/include/metrics.h"
-#include "webrtc/system_wrappers/include/metrics_default.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-namespace {
-const int kSample = 22;
-const char kName[] = "Name";
-
-int NumSamples(
-    const std::string& name,
-    const std::map<std::string, std::unique_ptr<metrics::SampleInfo>>&
-        histograms) {
-  const auto it = histograms.find(name);
-  if (it == histograms.end())
-    return 0;
-
-  int num_samples = 0;
-  for (const auto& sample : it->second->samples)
-    num_samples += sample.second;
-
-  return num_samples;
-}
-
-int NumEvents(const std::string& name,
-              int sample,
-              const std::map<std::string, std::unique_ptr<metrics::SampleInfo>>&
-                  histograms) {
-  const auto it = histograms.find(name);
-  if (it == histograms.end())
-    return 0;
-
-  const auto it_sample = it->second->samples.find(sample);
-  if (it_sample == it->second->samples.end())
-    return 0;
-
-  return it_sample->second;
-}
-}  // namespace
-
-class MetricsDefaultTest : public ::testing::Test {
- public:
-  MetricsDefaultTest() {}
-
- protected:
-  virtual void SetUp() {
-    metrics::Reset();
-  }
-};
-
-TEST_F(MetricsDefaultTest, Reset) {
-  RTC_HISTOGRAM_PERCENTAGE(kName, kSample);
-  EXPECT_EQ(1, metrics::NumSamples(kName));
-  metrics::Reset();
-  EXPECT_EQ(0, metrics::NumSamples(kName));
-}
-
-TEST_F(MetricsDefaultTest, NumSamples) {
-  RTC_HISTOGRAM_PERCENTAGE(kName, 5);
-  RTC_HISTOGRAM_PERCENTAGE(kName, 5);
-  RTC_HISTOGRAM_PERCENTAGE(kName, 10);
-  EXPECT_EQ(3, metrics::NumSamples(kName));
-  EXPECT_EQ(0, metrics::NumSamples("NonExisting"));
-}
-
-TEST_F(MetricsDefaultTest, NumEvents) {
-  RTC_HISTOGRAM_PERCENTAGE(kName, 5);
-  RTC_HISTOGRAM_PERCENTAGE(kName, 5);
-  RTC_HISTOGRAM_PERCENTAGE(kName, 10);
-  EXPECT_EQ(2, metrics::NumEvents(kName, 5));
-  EXPECT_EQ(1, metrics::NumEvents(kName, 10));
-  EXPECT_EQ(0, metrics::NumEvents(kName, 11));
-  EXPECT_EQ(0, metrics::NumEvents("NonExisting", 5));
-}
-
-TEST_F(MetricsDefaultTest, MinSample) {
-  RTC_HISTOGRAM_PERCENTAGE(kName, kSample);
-  RTC_HISTOGRAM_PERCENTAGE(kName, kSample + 1);
-  EXPECT_EQ(kSample, metrics::MinSample(kName));
-  EXPECT_EQ(-1, metrics::MinSample("NonExisting"));
-}
-
-TEST_F(MetricsDefaultTest, Overflow) {
-  const std::string kName = "Overflow";
-  // Samples should end up in overflow bucket.
-  RTC_HISTOGRAM_PERCENTAGE(kName, 101);
-  EXPECT_EQ(1, metrics::NumSamples(kName));
-  EXPECT_EQ(1, metrics::NumEvents(kName, 101));
-  RTC_HISTOGRAM_PERCENTAGE(kName, 102);
-  EXPECT_EQ(2, metrics::NumSamples(kName));
-  EXPECT_EQ(2, metrics::NumEvents(kName, 101));
-}
-
-TEST_F(MetricsDefaultTest, Underflow) {
-  const std::string kName = "Underflow";
-  // Samples should end up in underflow bucket.
-  RTC_HISTOGRAM_COUNTS_10000(kName, 0);
-  EXPECT_EQ(1, metrics::NumSamples(kName));
-  EXPECT_EQ(1, metrics::NumEvents(kName, 0));
-  RTC_HISTOGRAM_COUNTS_10000(kName, -1);
-  EXPECT_EQ(2, metrics::NumSamples(kName));
-  EXPECT_EQ(2, metrics::NumEvents(kName, 0));
-}
-
-TEST_F(MetricsDefaultTest, GetAndReset) {
-  std::map<std::string, std::unique_ptr<metrics::SampleInfo>> histograms;
-  metrics::GetAndReset(&histograms);
-  EXPECT_EQ(0u, histograms.size());
-  RTC_HISTOGRAM_PERCENTAGE("Histogram1", 4);
-  RTC_HISTOGRAM_PERCENTAGE("Histogram1", 5);
-  RTC_HISTOGRAM_PERCENTAGE("Histogram1", 5);
-  RTC_HISTOGRAM_PERCENTAGE("Histogram2", 10);
-  EXPECT_EQ(3, metrics::NumSamples("Histogram1"));
-  EXPECT_EQ(1, metrics::NumSamples("Histogram2"));
-
-  metrics::GetAndReset(&histograms);
-  EXPECT_EQ(2u, histograms.size());
-  EXPECT_EQ(0, metrics::NumSamples("Histogram1"));
-  EXPECT_EQ(0, metrics::NumSamples("Histogram2"));
-
-  EXPECT_EQ(3, NumSamples("Histogram1", histograms));
-  EXPECT_EQ(1, NumSamples("Histogram2", histograms));
-  EXPECT_EQ(1, NumEvents("Histogram1", 4, histograms));
-  EXPECT_EQ(2, NumEvents("Histogram1", 5, histograms));
-  EXPECT_EQ(1, NumEvents("Histogram2", 10, histograms));
-
-  // Add samples after reset.
-  metrics::GetAndReset(&histograms);
-  EXPECT_EQ(0u, histograms.size());
-  RTC_HISTOGRAM_PERCENTAGE("Histogram1", 50);
-  RTC_HISTOGRAM_PERCENTAGE("Histogram2", 8);
-  EXPECT_EQ(1, metrics::NumSamples("Histogram1"));
-  EXPECT_EQ(1, metrics::NumSamples("Histogram2"));
-  EXPECT_EQ(1, metrics::NumEvents("Histogram1", 50));
-  EXPECT_EQ(1, metrics::NumEvents("Histogram2", 8));
-}
-
-TEST_F(MetricsDefaultTest, TestMinMaxBucket) {
-  const std::string kName = "MinMaxCounts100";
-  RTC_HISTOGRAM_COUNTS_100(kName, 4);
-
-  std::map<std::string, std::unique_ptr<metrics::SampleInfo>> histograms;
-  metrics::GetAndReset(&histograms);
-  EXPECT_EQ(1u, histograms.size());
-  EXPECT_EQ(kName, histograms.begin()->second->name);
-  EXPECT_EQ(1, histograms.begin()->second->min);
-  EXPECT_EQ(100, histograms.begin()->second->max);
-  EXPECT_EQ(50u, histograms.begin()->second->bucket_count);
-  EXPECT_EQ(1u, histograms.begin()->second->samples.size());
-}
-
-}  // namespace webrtc
diff --git a/system_wrappers/source/metrics_unittest.cc b/system_wrappers/source/metrics_unittest.cc
deleted file mode 100644
index d7be229..0000000
--- a/system_wrappers/source/metrics_unittest.cc
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- *  Copyright (c) 2015 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/system_wrappers/include/metrics.h"
-#include "webrtc/system_wrappers/include/metrics_default.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-namespace {
-const int kSample = 22;
-
-void AddSparseSample(const std::string& name, int sample) {
-  RTC_HISTOGRAM_COUNTS_SPARSE_100(name, sample);
-}
-void AddSampleWithVaryingName(int index, const std::string& name, int sample) {
-  RTC_HISTOGRAMS_COUNTS_100(index, name, sample);
-}
-#if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
-void AddSample(const std::string& name, int sample) {
-  RTC_HISTOGRAM_COUNTS_100(name, sample);
-}
-#endif  // RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
-}  // namespace
-
-class MetricsTest : public ::testing::Test {
- public:
-  MetricsTest() {}
-
- protected:
-  virtual void SetUp() {
-    metrics::Reset();
-  }
-};
-
-TEST_F(MetricsTest, InitiallyNoSamples) {
-  EXPECT_EQ(0, metrics::NumSamples("NonExisting"));
-  EXPECT_EQ(0, metrics::NumEvents("NonExisting", kSample));
-}
-
-TEST_F(MetricsTest, RtcHistogramPercent_AddSample) {
-  const std::string kName = "Percentage";
-  RTC_HISTOGRAM_PERCENTAGE(kName, kSample);
-  EXPECT_EQ(1, metrics::NumSamples(kName));
-  EXPECT_EQ(1, metrics::NumEvents(kName, kSample));
-}
-
-TEST_F(MetricsTest, RtcHistogramEnumeration_AddSample) {
-  const std::string kName = "Enumeration";
-  RTC_HISTOGRAM_ENUMERATION(kName, kSample, kSample + 1);
-  EXPECT_EQ(1, metrics::NumSamples(kName));
-  EXPECT_EQ(1, metrics::NumEvents(kName, kSample));
-}
-
-TEST_F(MetricsTest, RtcHistogramBoolean_AddSample) {
-  const std::string kName = "Boolean";
-  const int kSample = 0;
-  RTC_HISTOGRAM_BOOLEAN(kName, kSample);
-  EXPECT_EQ(1, metrics::NumSamples(kName));
-  EXPECT_EQ(1, metrics::NumEvents(kName, kSample));
-}
-
-TEST_F(MetricsTest, RtcHistogramCountsSparse_AddSample) {
-  const std::string kName = "CountsSparse100";
-  RTC_HISTOGRAM_COUNTS_SPARSE_100(kName, kSample);
-  EXPECT_EQ(1, metrics::NumSamples(kName));
-  EXPECT_EQ(1, metrics::NumEvents(kName, kSample));
-}
-
-TEST_F(MetricsTest, RtcHistogramCounts_AddSample) {
-  const std::string kName = "Counts100";
-  RTC_HISTOGRAM_COUNTS_100(kName, kSample);
-  EXPECT_EQ(1, metrics::NumSamples(kName));
-  EXPECT_EQ(1, metrics::NumEvents(kName, kSample));
-}
-
-TEST_F(MetricsTest, RtcHistogramCounts_AddMultipleSamples) {
-  const std::string kName = "Counts200";
-  const int kNumSamples = 10;
-  for (int i = 1; i <= kNumSamples; ++i) {
-    RTC_HISTOGRAM_COUNTS_200(kName, i);
-    EXPECT_EQ(1, metrics::NumEvents(kName, i));
-    EXPECT_EQ(i, metrics::NumSamples(kName));
-  }
-}
-
-TEST_F(MetricsTest, RtcHistogramsCounts_AddSample) {
-  AddSampleWithVaryingName(0, "Name1", kSample);
-  AddSampleWithVaryingName(1, "Name2", kSample + 1);
-  AddSampleWithVaryingName(2, "Name3", kSample + 2);
-  EXPECT_EQ(1, metrics::NumSamples("Name1"));
-  EXPECT_EQ(1, metrics::NumSamples("Name2"));
-  EXPECT_EQ(1, metrics::NumSamples("Name3"));
-  EXPECT_EQ(1, metrics::NumEvents("Name1", kSample + 0));
-  EXPECT_EQ(1, metrics::NumEvents("Name2", kSample + 1));
-  EXPECT_EQ(1, metrics::NumEvents("Name3", kSample + 2));
-}
-
-#if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
-TEST_F(MetricsTest, RtcHistogramsCounts_InvalidIndex) {
-  EXPECT_DEATH(RTC_HISTOGRAMS_COUNTS_1000(-1, "Name", kSample), "");
-  EXPECT_DEATH(RTC_HISTOGRAMS_COUNTS_1000(3, "Name", kSample), "");
-  EXPECT_DEATH(RTC_HISTOGRAMS_COUNTS_1000(3u, "Name", kSample), "");
-}
-#endif
-
-TEST_F(MetricsTest, RtcHistogramSparse_NonConstantNameWorks) {
-  AddSparseSample("Sparse1", kSample);
-  AddSparseSample("Sparse2", kSample);
-  EXPECT_EQ(1, metrics::NumSamples("Sparse1"));
-  EXPECT_EQ(1, metrics::NumSamples("Sparse2"));
-}
-
-#if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
-TEST_F(MetricsTest, RtcHistogram_FailsForNonConstantName) {
-  AddSample("ConstantName1", kSample);
-  EXPECT_DEATH(AddSample("NotConstantName1", kSample), "");
-}
-#endif
-
-}  // namespace webrtc
diff --git a/system_wrappers/source/ntp_time_unittest.cc b/system_wrappers/source/ntp_time_unittest.cc
deleted file mode 100644
index 9a2a926..0000000
--- a/system_wrappers/source/ntp_time_unittest.cc
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- *  Copyright (c) 2014 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/system_wrappers/include/clock.h"
-#include "webrtc/system_wrappers/include/ntp_time.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-namespace {
-
-const uint32_t kNtpSec = 0x12345678;
-const uint32_t kNtpFrac = 0x23456789;
-
-TEST(NtpTimeTest, NoValueMeansInvalid) {
-  NtpTime ntp;
-  EXPECT_FALSE(ntp.Valid());
-}
-
-TEST(NtpTimeTest, CanResetValue) {
-  NtpTime ntp(kNtpSec, kNtpFrac);
-  EXPECT_TRUE(ntp.Valid());
-  ntp.Reset();
-  EXPECT_FALSE(ntp.Valid());
-}
-
-TEST(NtpTimeTest, CanGetWhatIsSet) {
-  NtpTime ntp;
-  ntp.Set(kNtpSec, kNtpFrac);
-  EXPECT_EQ(kNtpSec, ntp.seconds());
-  EXPECT_EQ(kNtpFrac, ntp.fractions());
-}
-
-TEST(NtpTimeTest, SetIsSameAs2ParameterConstructor) {
-  NtpTime ntp1(kNtpSec, kNtpFrac);
-  NtpTime ntp2;
-  EXPECT_NE(ntp1, ntp2);
-
-  ntp2.Set(kNtpSec, kNtpFrac);
-  EXPECT_EQ(ntp1, ntp2);
-}
-
-TEST(NtpTimeTest, ToMsMeansToNtpMilliseconds) {
-  SimulatedClock clock(0x123456789abc);
-
-  NtpTime ntp = clock.CurrentNtpTime();
-  EXPECT_EQ(ntp.ToMs(), Clock::NtpToMs(ntp.seconds(), ntp.fractions()));
-  EXPECT_EQ(ntp.ToMs(), clock.CurrentNtpInMilliseconds());
-}
-
-TEST(NtpTimeTest, CanExplicitlyConvertToAndFromUint64) {
-  uint64_t untyped_time = 0x123456789;
-  NtpTime time(untyped_time);
-  EXPECT_EQ(untyped_time, static_cast<uint64_t>(time));
-  EXPECT_EQ(NtpTime(0x12345678, 0x90abcdef), NtpTime(0x1234567890abcdef));
-}
-
-}  // namespace
-}  // namespace webrtc
diff --git a/system_wrappers/source/rtp_to_ntp_estimator.cc b/system_wrappers/source/rtp_to_ntp_estimator.cc
deleted file mode 100644
index 4227599..0000000
--- a/system_wrappers/source/rtp_to_ntp_estimator.cc
+++ /dev/null
@@ -1,198 +0,0 @@
-/*
- *  Copyright (c) 2012 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/system_wrappers/include/rtp_to_ntp_estimator.h"
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/system_wrappers/include/clock.h"
-
-namespace webrtc {
-namespace {
-// Number of RTCP SR reports to use to map between RTP and NTP.
-const size_t kNumRtcpReportsToUse = 2;
-
-// Calculates the RTP timestamp frequency from two pairs of NTP/RTP timestamps.
-bool CalculateFrequency(int64_t ntp_ms1,
-                        uint32_t rtp_timestamp1,
-                        int64_t ntp_ms2,
-                        uint32_t rtp_timestamp2,
-                        double* frequency_khz) {
-  if (ntp_ms1 <= ntp_ms2)
-    return false;
-
-  *frequency_khz = static_cast<double>(rtp_timestamp1 - rtp_timestamp2) /
-                   static_cast<double>(ntp_ms1 - ntp_ms2);
-  return true;
-}
-
-// Detects if there has been a wraparound between |old_timestamp| and
-// |new_timestamp|, and compensates by adding 2^32 if that is the case.
-bool CompensateForWrapAround(uint32_t new_timestamp,
-                             uint32_t old_timestamp,
-                             int64_t* compensated_timestamp) {
-  int64_t wraps = CheckForWrapArounds(new_timestamp, old_timestamp);
-  if (wraps < 0) {
-    // Reordering, don't use this packet.
-    return false;
-  }
-  *compensated_timestamp = new_timestamp + (wraps << 32);
-  return true;
-}
-
-bool Contains(const std::list<RtpToNtpEstimator::RtcpMeasurement>& measurements,
-              const RtpToNtpEstimator::RtcpMeasurement& other) {
-  for (const auto& measurement : measurements) {
-    if (measurement.IsEqual(other))
-      return true;
-  }
-  return false;
-}
-}  // namespace
-
-RtpToNtpEstimator::RtcpMeasurement::RtcpMeasurement(uint32_t ntp_secs,
-                                                    uint32_t ntp_frac,
-                                                    uint32_t timestamp)
-    : ntp_time(ntp_secs, ntp_frac), rtp_timestamp(timestamp) {}
-
-bool RtpToNtpEstimator::RtcpMeasurement::IsEqual(
-    const RtcpMeasurement& other) const {
-  // Use || since two equal timestamps will result in zero frequency and in
-  // RtpToNtpMs, |rtp_timestamp_ms| is estimated by dividing by the frequency.
-  return (ntp_time == other.ntp_time) || (rtp_timestamp == other.rtp_timestamp);
-}
-
-// Class for converting an RTP timestamp to the NTP domain.
-RtpToNtpEstimator::RtpToNtpEstimator() : consecutive_invalid_samples_(0) {}
-RtpToNtpEstimator::~RtpToNtpEstimator() {}
-
-void RtpToNtpEstimator::UpdateParameters() {
-  if (measurements_.size() != kNumRtcpReportsToUse)
-    return;
-
-  int64_t timestamp_new = measurements_.front().rtp_timestamp;
-  int64_t timestamp_old = measurements_.back().rtp_timestamp;
-  if (!CompensateForWrapAround(timestamp_new, timestamp_old, &timestamp_new))
-    return;
-
-  int64_t ntp_ms_new = measurements_.front().ntp_time.ToMs();
-  int64_t ntp_ms_old = measurements_.back().ntp_time.ToMs();
-
-  if (!CalculateFrequency(ntp_ms_new, timestamp_new, ntp_ms_old, timestamp_old,
-                          &params_.frequency_khz)) {
-    return;
-  }
-  params_.offset_ms = timestamp_new - params_.frequency_khz * ntp_ms_new;
-  params_.calculated = true;
-}
-
-bool RtpToNtpEstimator::UpdateMeasurements(uint32_t ntp_secs,
-                                           uint32_t ntp_frac,
-                                           uint32_t rtp_timestamp,
-                                           bool* new_rtcp_sr) {
-  *new_rtcp_sr = false;
-
-  RtcpMeasurement new_measurement(ntp_secs, ntp_frac, rtp_timestamp);
-  if (Contains(measurements_, new_measurement)) {
-    // RTCP SR report already added.
-    return true;
-  }
-  if (!new_measurement.ntp_time.Valid())
-    return false;
-
-  int64_t ntp_ms_new = new_measurement.ntp_time.ToMs();
-  bool invalid_sample = false;
-  for (const auto& measurement : measurements_) {
-    if (ntp_ms_new <= measurement.ntp_time.ToMs()) {
-      // Old report.
-      invalid_sample = true;
-      break;
-    }
-    int64_t timestamp_new = new_measurement.rtp_timestamp;
-    if (!CompensateForWrapAround(timestamp_new, measurement.rtp_timestamp,
-                                 &timestamp_new)) {
-      invalid_sample = true;
-      break;
-    }
-    if (timestamp_new <= measurement.rtp_timestamp) {
-      LOG(LS_WARNING)
-          << "Newer RTCP SR report with older RTP timestamp, dropping";
-      invalid_sample = true;
-      break;
-    }
-  }
-  if (invalid_sample) {
-    ++consecutive_invalid_samples_;
-    if (consecutive_invalid_samples_ < kMaxInvalidSamples) {
-      return false;
-    }
-    LOG(LS_WARNING) << "Multiple consecutively invalid RTCP SR reports, "
-                       "clearing measurements.";
-    measurements_.clear();
-  }
-  consecutive_invalid_samples_ = 0;
-
-  // Insert new RTCP SR report.
-  if (measurements_.size() == kNumRtcpReportsToUse)
-    measurements_.pop_back();
-
-  measurements_.push_front(new_measurement);
-  *new_rtcp_sr = true;
-
-  // List updated, calculate new parameters.
-  UpdateParameters();
-  return true;
-}
-
-bool RtpToNtpEstimator::Estimate(int64_t rtp_timestamp,
-                                 int64_t* rtp_timestamp_ms) const {
-  if (!params_.calculated || measurements_.empty())
-    return false;
-
-  uint32_t rtp_timestamp_old = measurements_.back().rtp_timestamp;
-  int64_t rtp_timestamp_unwrapped;
-  if (!CompensateForWrapAround(rtp_timestamp, rtp_timestamp_old,
-                               &rtp_timestamp_unwrapped)) {
-    return false;
-  }
-
-  // params_.calculated should not be true unless params_.frequency_khz has been
-  // set to something non-zero.
-  RTC_DCHECK_NE(params_.frequency_khz, 0.0);
-  double rtp_ms =
-      (static_cast<double>(rtp_timestamp_unwrapped) - params_.offset_ms) /
-          params_.frequency_khz +
-      0.5f;
-
-  if (rtp_ms < 0)
-    return false;
-
-  *rtp_timestamp_ms = rtp_ms;
-  return true;
-}
-
-int CheckForWrapArounds(uint32_t new_timestamp, uint32_t old_timestamp) {
-  if (new_timestamp < old_timestamp) {
-    // This difference should be less than -2^31 if we have had a wrap around
-    // (e.g. |new_timestamp| = 1, |rtcp_rtp_timestamp| = 2^32 - 1). Since it is
-    // cast to a int32_t, it should be positive.
-    if (static_cast<int32_t>(new_timestamp - old_timestamp) > 0) {
-      // Forward wrap around.
-      return 1;
-    }
-  } else if (static_cast<int32_t>(old_timestamp - new_timestamp) > 0) {
-    // This difference should be less than -2^31 if we have had a backward wrap
-    // around. Since it is cast to a int32_t, it should be positive.
-    return -1;
-  }
-  return 0;
-}
-
-}  // namespace webrtc
diff --git a/system_wrappers/source/rtp_to_ntp_estimator_unittest.cc b/system_wrappers/source/rtp_to_ntp_estimator_unittest.cc
deleted file mode 100644
index cfcb13b..0000000
--- a/system_wrappers/source/rtp_to_ntp_estimator_unittest.cc
+++ /dev/null
@@ -1,294 +0,0 @@
-/*
- *  Copyright (c) 2012 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/system_wrappers/include/rtp_to_ntp_estimator.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-namespace {
-const uint32_t kOneMsInNtpFrac = 4294967;
-const uint32_t kTimestampTicksPerMs = 90;
-}  // namespace
-
-TEST(WrapAroundTests, NoWrap) {
-  EXPECT_EQ(0, CheckForWrapArounds(0xFFFFFFFF, 0xFFFFFFFE));
-  EXPECT_EQ(0, CheckForWrapArounds(1, 0));
-  EXPECT_EQ(0, CheckForWrapArounds(0x00010000, 0x0000FFFF));
-}
-
-TEST(WrapAroundTests, ForwardWrap) {
-  EXPECT_EQ(1, CheckForWrapArounds(0, 0xFFFFFFFF));
-  EXPECT_EQ(1, CheckForWrapArounds(0, 0xFFFF0000));
-  EXPECT_EQ(1, CheckForWrapArounds(0x0000FFFF, 0xFFFFFFFF));
-  EXPECT_EQ(1, CheckForWrapArounds(0x0000FFFF, 0xFFFF0000));
-}
-
-TEST(WrapAroundTests, BackwardWrap) {
-  EXPECT_EQ(-1, CheckForWrapArounds(0xFFFFFFFF, 0));
-  EXPECT_EQ(-1, CheckForWrapArounds(0xFFFF0000, 0));
-  EXPECT_EQ(-1, CheckForWrapArounds(0xFFFFFFFF, 0x0000FFFF));
-  EXPECT_EQ(-1, CheckForWrapArounds(0xFFFF0000, 0x0000FFFF));
-}
-
-TEST(WrapAroundTests, OldRtcpWrapped_OldRtpTimestamp) {
-  RtpToNtpEstimator estimator;
-  bool new_sr;
-  uint32_t ntp_sec = 0;
-  uint32_t ntp_frac = 1;
-  uint32_t timestamp = 0;
-  EXPECT_TRUE(
-      estimator.UpdateMeasurements(ntp_sec, ntp_frac, timestamp, &new_sr));
-  ntp_frac += kOneMsInNtpFrac;
-  timestamp -= kTimestampTicksPerMs;
-  // Expected to fail since the older RTCP has a smaller RTP timestamp than the
-  // newer (old:0, new:4294967206).
-  EXPECT_FALSE(
-      estimator.UpdateMeasurements(ntp_sec, ntp_frac, timestamp, &new_sr));
-}
-
-TEST(WrapAroundTests, NewRtcpWrapped) {
-  RtpToNtpEstimator estimator;
-  bool new_sr;
-  uint32_t ntp_sec = 0;
-  uint32_t ntp_frac = 1;
-  uint32_t timestamp = 0xFFFFFFFF;
-  EXPECT_TRUE(
-      estimator.UpdateMeasurements(ntp_sec, ntp_frac, timestamp, &new_sr));
-  ntp_frac += kOneMsInNtpFrac;
-  timestamp += kTimestampTicksPerMs;
-  EXPECT_TRUE(
-      estimator.UpdateMeasurements(ntp_sec, ntp_frac, timestamp, &new_sr));
-  int64_t timestamp_ms = -1;
-  EXPECT_TRUE(estimator.Estimate(0xFFFFFFFF, &timestamp_ms));
-  // Since this RTP packet has the same timestamp as the RTCP packet constructed
-  // at time 0 it should be mapped to 0 as well.
-  EXPECT_EQ(0, timestamp_ms);
-}
-
-TEST(WrapAroundTests, RtpWrapped) {
-  RtpToNtpEstimator estimator;
-  bool new_sr;
-  uint32_t ntp_sec = 0;
-  uint32_t ntp_frac = 1;
-  uint32_t timestamp = 0xFFFFFFFF - 2 * kTimestampTicksPerMs;
-  EXPECT_TRUE(
-      estimator.UpdateMeasurements(ntp_sec, ntp_frac, timestamp, &new_sr));
-  ntp_frac += kOneMsInNtpFrac;
-  timestamp += kTimestampTicksPerMs;
-  EXPECT_TRUE(
-      estimator.UpdateMeasurements(ntp_sec, ntp_frac, timestamp, &new_sr));
-
-  int64_t timestamp_ms = -1;
-  EXPECT_TRUE(estimator.Estimate(0xFFFFFFFF - 2 * kTimestampTicksPerMs,
-                                 &timestamp_ms));
-  // Since this RTP packet has the same timestamp as the RTCP packet constructed
-  // at time 0 it should be mapped to 0 as well.
-  EXPECT_EQ(0, timestamp_ms);
-  // Two kTimestampTicksPerMs advanced.
-  timestamp += kTimestampTicksPerMs;
-  EXPECT_TRUE(estimator.Estimate(timestamp, &timestamp_ms));
-  EXPECT_EQ(2, timestamp_ms);
-  // Wrapped rtp.
-  timestamp += kTimestampTicksPerMs;
-  EXPECT_TRUE(estimator.Estimate(timestamp, &timestamp_ms));
-  EXPECT_EQ(3, timestamp_ms);
-}
-
-TEST(WrapAroundTests, OldRtp_RtcpsWrapped) {
-  RtpToNtpEstimator estimator;
-  bool new_sr;
-  uint32_t ntp_sec = 0;
-  uint32_t ntp_frac = 1;
-  uint32_t timestamp = 0;
-  EXPECT_TRUE(
-      estimator.UpdateMeasurements(ntp_sec, ntp_frac, timestamp, &new_sr));
-  ntp_frac += kOneMsInNtpFrac;
-  timestamp += kTimestampTicksPerMs;
-  EXPECT_TRUE(
-      estimator.UpdateMeasurements(ntp_sec, ntp_frac, timestamp, &new_sr));
-  timestamp -= 2 * kTimestampTicksPerMs;
-  int64_t timestamp_ms = -1;
-  EXPECT_FALSE(estimator.Estimate(timestamp, &timestamp_ms));
-}
-
-TEST(WrapAroundTests, OldRtp_NewRtcpWrapped) {
-  RtpToNtpEstimator estimator;
-  bool new_sr;
-  uint32_t ntp_sec = 0;
-  uint32_t ntp_frac = 1;
-  uint32_t timestamp = 0xFFFFFFFF;
-  EXPECT_TRUE(
-      estimator.UpdateMeasurements(ntp_sec, ntp_frac, timestamp, &new_sr));
-  ntp_frac += kOneMsInNtpFrac;
-  timestamp += kTimestampTicksPerMs;
-  EXPECT_TRUE(
-      estimator.UpdateMeasurements(ntp_sec, ntp_frac, timestamp, &new_sr));
-  timestamp -= kTimestampTicksPerMs;
-  int64_t timestamp_ms = -1;
-  EXPECT_TRUE(estimator.Estimate(timestamp, &timestamp_ms));
-  // Constructed at the same time as the first RTCP and should therefore be
-  // mapped to zero.
-  EXPECT_EQ(0, timestamp_ms);
-}
-
-TEST(WrapAroundTests, GracefullyHandleRtpJump) {
-  RtpToNtpEstimator estimator;
-  bool new_sr;
-  uint32_t ntp_sec = 0;
-  uint32_t ntp_frac = 1;
-  uint32_t timestamp = 0;
-  EXPECT_TRUE(
-      estimator.UpdateMeasurements(ntp_sec, ntp_frac, timestamp, &new_sr));
-  ntp_frac += kOneMsInNtpFrac;
-  timestamp += kTimestampTicksPerMs;
-  EXPECT_TRUE(
-      estimator.UpdateMeasurements(ntp_sec, ntp_frac, timestamp, &new_sr));
-  ntp_frac += kOneMsInNtpFrac;
-  timestamp -= kTimestampTicksPerMs;
-  int64_t timestamp_ms = -1;
-  EXPECT_TRUE(estimator.Estimate(timestamp, &timestamp_ms));
-  // Constructed at the same time as the first RTCP and should therefore be
-  // mapped to zero.
-  EXPECT_EQ(0, timestamp_ms);
-
-  timestamp -= 0xFFFFF;
-  for (int i = 0; i < RtpToNtpEstimator::kMaxInvalidSamples - 1; ++i) {
-    EXPECT_FALSE(
-        estimator.UpdateMeasurements(ntp_sec, ntp_frac, timestamp, &new_sr));
-    ntp_frac += kOneMsInNtpFrac;
-    timestamp += kTimestampTicksPerMs;
-  }
-  EXPECT_TRUE(
-      estimator.UpdateMeasurements(ntp_sec, ntp_frac, timestamp, &new_sr));
-  ntp_frac += kOneMsInNtpFrac;
-  timestamp += kTimestampTicksPerMs;
-  EXPECT_TRUE(
-      estimator.UpdateMeasurements(ntp_sec, ntp_frac, timestamp, &new_sr));
-  ntp_frac += kOneMsInNtpFrac;
-  timestamp += kTimestampTicksPerMs;
-
-  timestamp_ms = -1;
-  EXPECT_TRUE(estimator.Estimate(timestamp, &timestamp_ms));
-  // 6 milliseconds has passed since the start of the test.
-  EXPECT_EQ(6, timestamp_ms);
-}
-
-TEST(UpdateRtcpMeasurementTests, FailsForZeroNtp) {
-  RtpToNtpEstimator estimator;
-  uint32_t ntp_sec = 0;
-  uint32_t ntp_frac = 0;
-  uint32_t timestamp = 0x12345678;
-  bool new_sr;
-  EXPECT_FALSE(
-      estimator.UpdateMeasurements(ntp_sec, ntp_frac, timestamp, &new_sr));
-  EXPECT_FALSE(new_sr);
-}
-
-TEST(UpdateRtcpMeasurementTests, FailsForEqualNtp) {
-  RtpToNtpEstimator estimator;
-  uint32_t ntp_sec = 0;
-  uint32_t ntp_frac = 699925050;
-  uint32_t timestamp = 0x12345678;
-  bool new_sr;
-  EXPECT_TRUE(
-      estimator.UpdateMeasurements(ntp_sec, ntp_frac, timestamp, &new_sr));
-  EXPECT_TRUE(new_sr);
-  // Ntp time already added, list not updated.
-  ++timestamp;
-  EXPECT_TRUE(
-      estimator.UpdateMeasurements(ntp_sec, ntp_frac, timestamp, &new_sr));
-  EXPECT_FALSE(new_sr);
-}
-
-TEST(UpdateRtcpMeasurementTests, FailsForOldNtp) {
-  RtpToNtpEstimator estimator;
-  uint32_t ntp_sec = 1;
-  uint32_t ntp_frac = 699925050;
-  uint32_t timestamp = 0x12345678;
-  bool new_sr;
-  EXPECT_TRUE(
-      estimator.UpdateMeasurements(ntp_sec, ntp_frac, timestamp, &new_sr));
-  EXPECT_TRUE(new_sr);
-  // Old ntp time, list not updated.
-  ntp_frac -= kOneMsInNtpFrac;
-  timestamp += kTimestampTicksPerMs;
-  EXPECT_FALSE(
-      estimator.UpdateMeasurements(ntp_sec, ntp_frac, timestamp, &new_sr));
-}
-
-TEST(UpdateRtcpMeasurementTests, FailsForEqualTimestamp) {
-  RtpToNtpEstimator estimator;
-  uint32_t ntp_sec = 0;
-  uint32_t ntp_frac = 2;
-  uint32_t timestamp = 0x12345678;
-  bool new_sr;
-  EXPECT_TRUE(
-      estimator.UpdateMeasurements(ntp_sec, ntp_frac, timestamp, &new_sr));
-  EXPECT_TRUE(new_sr);
-  // Timestamp already added, list not updated.
-  ++ntp_frac;
-  EXPECT_TRUE(
-      estimator.UpdateMeasurements(ntp_sec, ntp_frac, timestamp, &new_sr));
-  EXPECT_FALSE(new_sr);
-}
-
-TEST(UpdateRtcpMeasurementTests, FailsForOldRtpTimestamp) {
-  RtpToNtpEstimator estimator;
-  uint32_t ntp_sec = 0;
-  uint32_t ntp_frac = 2;
-  uint32_t timestamp = 0x12345678;
-  bool new_sr;
-  EXPECT_TRUE(
-      estimator.UpdateMeasurements(ntp_sec, ntp_frac, timestamp, &new_sr));
-  EXPECT_TRUE(new_sr);
-  // Old timestamp, list not updated.
-  ntp_frac += kOneMsInNtpFrac;
-  timestamp -= kTimestampTicksPerMs;
-  EXPECT_FALSE(
-      estimator.UpdateMeasurements(ntp_sec, ntp_frac, timestamp, &new_sr));
-  EXPECT_FALSE(new_sr);
-}
-
-TEST(UpdateRtcpMeasurementTests, VerifyParameters) {
-  RtpToNtpEstimator estimator;
-  uint32_t ntp_sec = 1;
-  uint32_t ntp_frac = 2;
-  uint32_t timestamp = 0x12345678;
-  bool new_sr;
-  EXPECT_TRUE(
-      estimator.UpdateMeasurements(ntp_sec, ntp_frac, timestamp, &new_sr));
-  EXPECT_TRUE(new_sr);
-  EXPECT_FALSE(estimator.params().calculated);
-  // Add second report, parameters should be calculated.
-  ntp_frac += kOneMsInNtpFrac;
-  timestamp += kTimestampTicksPerMs;
-  EXPECT_TRUE(
-      estimator.UpdateMeasurements(ntp_sec, ntp_frac, timestamp, &new_sr));
-  EXPECT_TRUE(estimator.params().calculated);
-  EXPECT_DOUBLE_EQ(90.0, estimator.params().frequency_khz);
-  EXPECT_NE(0.0, estimator.params().offset_ms);
-}
-
-TEST(RtpToNtpTests, FailsForNoParameters) {
-  RtpToNtpEstimator estimator;
-  uint32_t ntp_sec = 1;
-  uint32_t ntp_frac = 2;
-  uint32_t timestamp = 0x12345678;
-  bool new_sr;
-  EXPECT_TRUE(
-      estimator.UpdateMeasurements(ntp_sec, ntp_frac, timestamp, &new_sr));
-  EXPECT_TRUE(new_sr);
-  // Parameters are not calculated, conversion of RTP to NTP time should fail.
-  EXPECT_FALSE(estimator.params().calculated);
-  int64_t timestamp_ms = -1;
-  EXPECT_FALSE(estimator.Estimate(timestamp, &timestamp_ms));
-}
-
-};  // namespace webrtc
diff --git a/system_wrappers/source/rw_lock.cc b/system_wrappers/source/rw_lock.cc
deleted file mode 100644
index ff53e8d..0000000
--- a/system_wrappers/source/rw_lock.cc
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- *  Copyright (c) 2012 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/system_wrappers/include/rw_lock_wrapper.h"
-
-#include <assert.h>
-
-#if defined(_WIN32)
-#include "webrtc/system_wrappers/source/rw_lock_win.h"
-#else
-#include "webrtc/system_wrappers/source/rw_lock_posix.h"
-#endif
-
-namespace webrtc {
-
-RWLockWrapper* RWLockWrapper::CreateRWLock() {
-#ifdef _WIN32
-  return RWLockWin::Create();
-#else
-  return RWLockPosix::Create();
-#endif
-}
-
-}  // namespace webrtc
diff --git a/system_wrappers/source/rw_lock_posix.cc b/system_wrappers/source/rw_lock_posix.cc
deleted file mode 100644
index cdcb7fb..0000000
--- a/system_wrappers/source/rw_lock_posix.cc
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- *  Copyright (c) 2011 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/system_wrappers/source/rw_lock_posix.h"
-
-namespace webrtc {
-
-RWLockPosix::RWLockPosix() : lock_() {
-}
-
-RWLockPosix::~RWLockPosix() {
-  pthread_rwlock_destroy(&lock_);
-}
-
-RWLockPosix* RWLockPosix::Create() {
-  RWLockPosix* ret_val = new RWLockPosix();
-  if (!ret_val->Init()) {
-    delete ret_val;
-    return NULL;
-  }
-  return ret_val;
-}
-
-bool RWLockPosix::Init() {
-  return pthread_rwlock_init(&lock_, 0) == 0;
-}
-
-void RWLockPosix::AcquireLockExclusive() {
-  pthread_rwlock_wrlock(&lock_);
-}
-
-void RWLockPosix::ReleaseLockExclusive() {
-  pthread_rwlock_unlock(&lock_);
-}
-
-void RWLockPosix::AcquireLockShared() {
-  pthread_rwlock_rdlock(&lock_);
-}
-
-void RWLockPosix::ReleaseLockShared() {
-  pthread_rwlock_unlock(&lock_);
-}
-
-}  // namespace webrtc
diff --git a/system_wrappers/source/rw_lock_posix.h b/system_wrappers/source/rw_lock_posix.h
deleted file mode 100644
index 0ce7305..0000000
--- a/system_wrappers/source/rw_lock_posix.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- *  Copyright (c) 2011 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_SYSTEM_WRAPPERS_SOURCE_RW_LOCK_POSIX_H_
-#define WEBRTC_SYSTEM_WRAPPERS_SOURCE_RW_LOCK_POSIX_H_
-
-#include "webrtc/system_wrappers/include/rw_lock_wrapper.h"
-#include "webrtc/typedefs.h"
-
-#include <pthread.h>
-
-namespace webrtc {
-
-class RWLockPosix : public RWLockWrapper {
- public:
-  static RWLockPosix* Create();
-  ~RWLockPosix() override;
-
-  void AcquireLockExclusive() override;
-  void ReleaseLockExclusive() override;
-
-  void AcquireLockShared() override;
-  void ReleaseLockShared() override;
-
- private:
-  RWLockPosix();
-  bool Init();
-
-  pthread_rwlock_t lock_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_SYSTEM_WRAPPERS_SOURCE_RW_LOCK_POSIX_H_
diff --git a/system_wrappers/source/rw_lock_win.cc b/system_wrappers/source/rw_lock_win.cc
deleted file mode 100644
index 2372b9b..0000000
--- a/system_wrappers/source/rw_lock_win.cc
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- *  Copyright (c) 2012 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/system_wrappers/source/rw_lock_win.h"
-
-#include "webrtc/system_wrappers/include/trace.h"
-
-namespace webrtc {
-
-static bool native_rw_locks_supported = false;
-static bool module_load_attempted = false;
-static HMODULE library = NULL;
-
-typedef void (WINAPI* InitializeSRWLock)(PSRWLOCK);
-
-typedef void (WINAPI* AcquireSRWLockExclusive)(PSRWLOCK);
-typedef void (WINAPI* ReleaseSRWLockExclusive)(PSRWLOCK);
-
-typedef void (WINAPI* AcquireSRWLockShared)(PSRWLOCK);
-typedef void (WINAPI* ReleaseSRWLockShared)(PSRWLOCK);
-
-InitializeSRWLock       initialize_srw_lock;
-AcquireSRWLockExclusive acquire_srw_lock_exclusive;
-AcquireSRWLockShared    acquire_srw_lock_shared;
-ReleaseSRWLockShared    release_srw_lock_shared;
-ReleaseSRWLockExclusive release_srw_lock_exclusive;
-
-RWLockWin::RWLockWin() {
-  initialize_srw_lock(&lock_);
-}
-
-RWLockWin* RWLockWin::Create() {
-  if (!LoadModule()) {
-    return NULL;
-  }
-  return new RWLockWin();
-}
-
-void RWLockWin::AcquireLockExclusive() {
-  acquire_srw_lock_exclusive(&lock_);
-}
-
-void RWLockWin::ReleaseLockExclusive() {
-  release_srw_lock_exclusive(&lock_);
-}
-
-void RWLockWin::AcquireLockShared() {
-  acquire_srw_lock_shared(&lock_);
-}
-
-void RWLockWin::ReleaseLockShared() {
-  release_srw_lock_shared(&lock_);
-}
-
-bool RWLockWin::LoadModule() {
-  if (module_load_attempted) {
-    return native_rw_locks_supported;
-  }
-  module_load_attempted = true;
-  // Use native implementation if supported (i.e Vista+)
-  library = LoadLibrary(TEXT("Kernel32.dll"));
-  if (!library) {
-    return false;
-  }
-  WEBRTC_TRACE(kTraceStateInfo, kTraceUtility, -1, "Loaded Kernel.dll");
-
-  initialize_srw_lock =
-    (InitializeSRWLock)GetProcAddress(library, "InitializeSRWLock");
-
-  acquire_srw_lock_exclusive =
-    (AcquireSRWLockExclusive)GetProcAddress(library,
-                                            "AcquireSRWLockExclusive");
-  release_srw_lock_exclusive =
-    (ReleaseSRWLockExclusive)GetProcAddress(library,
-                                            "ReleaseSRWLockExclusive");
-  acquire_srw_lock_shared =
-    (AcquireSRWLockShared)GetProcAddress(library, "AcquireSRWLockShared");
-  release_srw_lock_shared =
-    (ReleaseSRWLockShared)GetProcAddress(library, "ReleaseSRWLockShared");
-
-  if (initialize_srw_lock && acquire_srw_lock_exclusive &&
-      release_srw_lock_exclusive && acquire_srw_lock_shared &&
-      release_srw_lock_shared) {
-    WEBRTC_TRACE(kTraceStateInfo, kTraceUtility, -1, "Loaded Native RW Lock");
-    native_rw_locks_supported = true;
-  }
-  return native_rw_locks_supported;
-}
-
-}  // namespace webrtc
diff --git a/system_wrappers/source/rw_lock_win.h b/system_wrappers/source/rw_lock_win.h
deleted file mode 100644
index c279eab..0000000
--- a/system_wrappers/source/rw_lock_win.h
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- *  Copyright (c) 2012 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_SYSTEM_WRAPPERS_SOURCE_RW_LOCK_WIN_H_
-#define WEBRTC_SYSTEM_WRAPPERS_SOURCE_RW_LOCK_WIN_H_
-
-#include "webrtc/system_wrappers/include/rw_lock_wrapper.h"
-
-#include <Windows.h>
-
-namespace webrtc {
-
-class RWLockWin : public RWLockWrapper {
- public:
-  static RWLockWin* Create();
-  ~RWLockWin() {}
-
-  virtual void AcquireLockExclusive();
-  virtual void ReleaseLockExclusive();
-
-  virtual void AcquireLockShared();
-  virtual void ReleaseLockShared();
-
- private:
-  RWLockWin();
-  static bool LoadModule();
-
-  SRWLOCK lock_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_SYSTEM_WRAPPERS_SOURCE_RW_LOCK_WIN_H_
diff --git a/system_wrappers/source/sleep.cc b/system_wrappers/source/sleep.cc
deleted file mode 100644
index 181381f..0000000
--- a/system_wrappers/source/sleep.cc
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- *  Copyright (c) 2012 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.
- */
-// An OS-independent sleep function.
-
-#include "webrtc/system_wrappers/include/sleep.h"
-
-#ifdef _WIN32
-// For Sleep()
-#include <windows.h>
-#else
-// For nanosleep()
-#include <time.h>
-#endif
-
-namespace webrtc {
-
-void SleepMs(int msecs) {
-#ifdef _WIN32
-  Sleep(msecs);
-#else
-  struct timespec short_wait;
-  struct timespec remainder;
-  short_wait.tv_sec = msecs / 1000;
-  short_wait.tv_nsec = (msecs % 1000) * 1000 * 1000;
-  nanosleep(&short_wait, &remainder);
-#endif
-}
-
-}  // namespace webrtc
diff --git a/system_wrappers/source/timestamp_extrapolator.cc b/system_wrappers/source/timestamp_extrapolator.cc
deleted file mode 100644
index b9243ca..0000000
--- a/system_wrappers/source/timestamp_extrapolator.cc
+++ /dev/null
@@ -1,235 +0,0 @@
-/*
- *  Copyright (c) 2011 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/system_wrappers/include/timestamp_extrapolator.h"
-
-#include <algorithm>
-
-namespace webrtc {
-
-TimestampExtrapolator::TimestampExtrapolator(int64_t start_ms)
-    : _rwLock(RWLockWrapper::CreateRWLock()),
-      _startMs(0),
-      _firstTimestamp(0),
-      _wrapArounds(0),
-      _prevUnwrappedTimestamp(-1),
-      _prevWrapTimestamp(-1),
-      _lambda(1),
-      _firstAfterReset(true),
-      _packetCount(0),
-      _startUpFilterDelayInPackets(2),
-      _detectorAccumulatorPos(0),
-      _detectorAccumulatorNeg(0),
-      _alarmThreshold(60e3),
-      _accDrift(6600),  // in timestamp ticks, i.e. 15 ms
-      _accMaxError(7000),
-      _pP11(1e10) {
-    Reset(start_ms);
-}
-
-TimestampExtrapolator::~TimestampExtrapolator()
-{
-    delete _rwLock;
-}
-
-void TimestampExtrapolator::Reset(int64_t start_ms)
-{
-    WriteLockScoped wl(*_rwLock);
-    _startMs = start_ms;
-    _prevMs = _startMs;
-    _firstTimestamp = 0;
-    _w[0] = 90.0;
-    _w[1] = 0;
-    _pP[0][0] = 1;
-    _pP[1][1] = _pP11;
-    _pP[0][1] = _pP[1][0] = 0;
-    _firstAfterReset = true;
-    _prevUnwrappedTimestamp = -1;
-    _prevWrapTimestamp = -1;
-    _wrapArounds = 0;
-    _packetCount = 0;
-    _detectorAccumulatorPos = 0;
-    _detectorAccumulatorNeg = 0;
-}
-
-void
-TimestampExtrapolator::Update(int64_t tMs, uint32_t ts90khz)
-{
-
-    _rwLock->AcquireLockExclusive();
-    if (tMs - _prevMs > 10e3)
-    {
-        // Ten seconds without a complete frame.
-        // Reset the extrapolator
-        _rwLock->ReleaseLockExclusive();
-        Reset(tMs);
-        _rwLock->AcquireLockExclusive();
-    }
-    else
-    {
-        _prevMs = tMs;
-    }
-
-    // Remove offset to prevent badly scaled matrices
-    tMs -= _startMs;
-
-    CheckForWrapArounds(ts90khz);
-
-    int64_t unwrapped_ts90khz = static_cast<int64_t>(ts90khz) +
-        _wrapArounds * ((static_cast<int64_t>(1) << 32) - 1);
-
-    if (_firstAfterReset)
-    {
-        // Make an initial guess of the offset,
-        // should be almost correct since tMs - _startMs
-        // should about zero at this time.
-        _w[1] = -_w[0] * tMs;
-        _firstTimestamp = unwrapped_ts90khz;
-        _firstAfterReset = false;
-    }
-
-    double residual =
-        (static_cast<double>(unwrapped_ts90khz) - _firstTimestamp) -
-        static_cast<double>(tMs) * _w[0] - _w[1];
-    if (DelayChangeDetection(residual) &&
-        _packetCount >= _startUpFilterDelayInPackets)
-    {
-        // A sudden change of average network delay has been detected.
-        // Force the filter to adjust its offset parameter by changing
-        // the offset uncertainty. Don't do this during startup.
-        _pP[1][1] = _pP11;
-    }
-
-    if (_prevUnwrappedTimestamp >= 0 &&
-        unwrapped_ts90khz < _prevUnwrappedTimestamp)
-    {
-        // Drop reordered frames.
-        _rwLock->ReleaseLockExclusive();
-        return;
-    }
-
-    //T = [t(k) 1]';
-    //that = T'*w;
-    //K = P*T/(lambda + T'*P*T);
-    double K[2];
-    K[0] = _pP[0][0] * tMs + _pP[0][1];
-    K[1] = _pP[1][0] * tMs + _pP[1][1];
-    double TPT = _lambda + tMs * K[0] + K[1];
-    K[0] /= TPT;
-    K[1] /= TPT;
-    //w = w + K*(ts(k) - that);
-    _w[0] = _w[0] + K[0] * residual;
-    _w[1] = _w[1] + K[1] * residual;
-    //P = 1/lambda*(P - K*T'*P);
-    double p00 = 1 / _lambda *
-        (_pP[0][0] - (K[0] * tMs * _pP[0][0] + K[0] * _pP[1][0]));
-    double p01 = 1 / _lambda *
-        (_pP[0][1] - (K[0] * tMs * _pP[0][1] + K[0] * _pP[1][1]));
-    _pP[1][0] = 1 / _lambda *
-        (_pP[1][0] - (K[1] * tMs * _pP[0][0] + K[1] * _pP[1][0]));
-    _pP[1][1] = 1 / _lambda *
-        (_pP[1][1] - (K[1] * tMs * _pP[0][1] + K[1] * _pP[1][1]));
-    _pP[0][0] = p00;
-    _pP[0][1] = p01;
-    _prevUnwrappedTimestamp = unwrapped_ts90khz;
-    if (_packetCount < _startUpFilterDelayInPackets)
-    {
-        _packetCount++;
-    }
-    _rwLock->ReleaseLockExclusive();
-}
-
-int64_t
-TimestampExtrapolator::ExtrapolateLocalTime(uint32_t timestamp90khz)
-{
-    ReadLockScoped rl(*_rwLock);
-    int64_t localTimeMs = 0;
-    CheckForWrapArounds(timestamp90khz);
-    double unwrapped_ts90khz = static_cast<double>(timestamp90khz) +
-        _wrapArounds * ((static_cast<int64_t>(1) << 32) - 1);
-    if (_packetCount == 0)
-    {
-        localTimeMs = -1;
-    }
-    else if (_packetCount < _startUpFilterDelayInPackets)
-    {
-        localTimeMs = _prevMs + static_cast<int64_t>(
-            static_cast<double>(unwrapped_ts90khz - _prevUnwrappedTimestamp) /
-            90.0 + 0.5);
-    }
-    else
-    {
-        if (_w[0] < 1e-3)
-        {
-            localTimeMs = _startMs;
-        }
-        else
-        {
-            double timestampDiff = unwrapped_ts90khz -
-                static_cast<double>(_firstTimestamp);
-            localTimeMs = static_cast<int64_t>(
-                static_cast<double>(_startMs) + (timestampDiff - _w[1]) /
-                _w[0] + 0.5);
-        }
-    }
-    return localTimeMs;
-}
-
-// Investigates if the timestamp clock has overflowed since the last timestamp and
-// keeps track of the number of wrap arounds since reset.
-void
-TimestampExtrapolator::CheckForWrapArounds(uint32_t ts90khz)
-{
-    if (_prevWrapTimestamp == -1)
-    {
-        _prevWrapTimestamp = ts90khz;
-        return;
-    }
-    if (ts90khz < _prevWrapTimestamp)
-    {
-        // This difference will probably be less than -2^31 if we have had a wrap around
-        // (e.g. timestamp = 1, _previousTimestamp = 2^32 - 1). Since it is casted to a Word32,
-        // it should be positive.
-        if (static_cast<int32_t>(ts90khz - _prevWrapTimestamp) > 0)
-        {
-            // Forward wrap around
-            _wrapArounds++;
-        }
-    }
-    // This difference will probably be less than -2^31 if we have had a backward wrap around.
-    // Since it is casted to a Word32, it should be positive.
-    else if (static_cast<int32_t>(_prevWrapTimestamp - ts90khz) > 0)
-    {
-        // Backward wrap around
-        _wrapArounds--;
-    }
-    _prevWrapTimestamp = ts90khz;
-}
-
-bool
-TimestampExtrapolator::DelayChangeDetection(double error)
-{
-    // CUSUM detection of sudden delay changes
-    error = (error > 0) ? std::min(error, _accMaxError) :
-                          std::max(error, -_accMaxError);
-    _detectorAccumulatorPos =
-        std::max(_detectorAccumulatorPos + error - _accDrift, (double)0);
-    _detectorAccumulatorNeg =
-        std::min(_detectorAccumulatorNeg + error + _accDrift, (double)0);
-    if (_detectorAccumulatorPos > _alarmThreshold || _detectorAccumulatorNeg < -_alarmThreshold)
-    {
-        // Alarm
-        _detectorAccumulatorPos = _detectorAccumulatorNeg = 0;
-        return true;
-    }
-    return false;
-}
-
-}
diff --git a/system_wrappers/source/trace_impl.cc b/system_wrappers/source/trace_impl.cc
deleted file mode 100644
index 513327e..0000000
--- a/system_wrappers/source/trace_impl.cc
+++ /dev/null
@@ -1,583 +0,0 @@
-/*
- *  Copyright (c) 2012 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/system_wrappers/source/trace_impl.h"
-
-#include <assert.h>
-#include <stdarg.h>
-#include <stdio.h>
-#include <string.h>
-
-#include "webrtc/rtc_base/atomicops.h"
-#include "webrtc/rtc_base/platform_thread.h"
-#ifdef _WIN32
-#include "webrtc/system_wrappers/source/trace_win.h"
-#else
-#include "webrtc/system_wrappers/source/trace_posix.h"
-#endif  // _WIN32
-
-#define KEY_LEN_CHARS 31
-
-#ifdef _WIN32
-#pragma warning(disable:4355)
-#endif  // _WIN32
-
-namespace webrtc {
-
-const int Trace::kBoilerplateLength = 71;
-const int Trace::kTimestampPosition = 13;
-const int Trace::kTimestampLength = 12;
-volatile int Trace::level_filter_ = kTraceDefault;
-
-// Construct On First Use idiom. Avoids "static initialization order fiasco".
-TraceImpl* TraceImpl::StaticInstance(CountOperation count_operation,
-                                     const TraceLevel level) {
-  // Sanities to avoid taking lock unless absolutely necessary (for
-  // performance reasons). count_operation == kAddRefNoCreate implies that a
-  // message will be written to file.
-  if ((level != kTraceAll) && (count_operation == kAddRefNoCreate)) {
-    if (!(level & level_filter())) {
-      return NULL;
-    }
-  }
-  TraceImpl* impl =
-    GetStaticInstance<TraceImpl>(count_operation);
-  return impl;
-}
-
-TraceImpl* TraceImpl::GetTrace(const TraceLevel level) {
-  return StaticInstance(kAddRefNoCreate, level);
-}
-
-TraceImpl* TraceImpl::CreateInstance() {
-#if defined(_WIN32)
-  return new TraceWindows();
-#else
-  return new TracePosix();
-#endif
-}
-
-TraceImpl::TraceImpl()
-    : callback_(NULL),
-      row_count_text_(0),
-      file_count_text_(0),
-      trace_file_(FileWrapper::Create()) {
-}
-
-TraceImpl::~TraceImpl() {
-  trace_file_->CloseFile();
-}
-
-int32_t TraceImpl::AddThreadId(char* trace_message) const {
-  uint32_t thread_id = rtc::CurrentThreadId();
-  // Messages is 12 characters.
-  return sprintf(trace_message, "%10u; ", thread_id);
-}
-
-int32_t TraceImpl::AddLevel(char* sz_message, const TraceLevel level) const {
-  const int kMessageLength = 12;
-  switch (level) {
-    case kTraceTerseInfo:
-      // Add the appropriate amount of whitespace.
-      memset(sz_message, ' ', kMessageLength);
-      sz_message[kMessageLength] = '\0';
-      break;
-    case kTraceStateInfo:
-      sprintf(sz_message, "STATEINFO ; ");
-      break;
-    case kTraceWarning:
-      sprintf(sz_message, "WARNING   ; ");
-      break;
-    case kTraceError:
-      sprintf(sz_message, "ERROR     ; ");
-      break;
-    case kTraceCritical:
-      sprintf(sz_message, "CRITICAL  ; ");
-      break;
-    case kTraceInfo:
-      sprintf(sz_message, "DEBUGINFO ; ");
-      break;
-    case kTraceModuleCall:
-      sprintf(sz_message, "MODULECALL; ");
-      break;
-    case kTraceMemory:
-      sprintf(sz_message, "MEMORY    ; ");
-      break;
-    case kTraceTimer:
-      sprintf(sz_message, "TIMER     ; ");
-      break;
-    case kTraceStream:
-      sprintf(sz_message, "STREAM    ; ");
-      break;
-    case kTraceApiCall:
-      sprintf(sz_message, "APICALL   ; ");
-      break;
-    case kTraceDebug:
-      sprintf(sz_message, "DEBUG     ; ");
-      break;
-    default:
-      assert(false);
-      return 0;
-  }
-  // All messages are 12 characters.
-  return kMessageLength;
-}
-
-int32_t TraceImpl::AddModuleAndId(char* trace_message,
-                                  const TraceModule module,
-                                  const int32_t id) const {
-  // Use long int to prevent problems with different definitions of
-  // int32_t.
-  // TODO(hellner): is this actually a problem? If so, it should be better to
-  //                clean up int32_t
-  const long int idl = id;
-  const int kMessageLength = 25;
-  if (idl != -1) {
-    const unsigned long int id_engine = id >> 16;
-    const unsigned long int id_channel = id & 0xffff;
-
-    switch (module) {
-      case kTraceUndefined:
-        // Add the appropriate amount of whitespace.
-        memset(trace_message, ' ', kMessageLength);
-        trace_message[kMessageLength] = '\0';
-        break;
-      case kTraceVoice:
-        sprintf(trace_message, "       VOICE:%5ld %5ld;", id_engine,
-                id_channel);
-        break;
-      case kTraceVideo:
-        sprintf(trace_message, "       VIDEO:%5ld %5ld;", id_engine,
-                id_channel);
-        break;
-      case kTraceUtility:
-        sprintf(trace_message, "     UTILITY:%5ld %5ld;", id_engine,
-                id_channel);
-        break;
-      case kTraceRtpRtcp:
-        sprintf(trace_message, "    RTP/RTCP:%5ld %5ld;", id_engine,
-                id_channel);
-        break;
-      case kTraceTransport:
-        sprintf(trace_message, "   TRANSPORT:%5ld %5ld;", id_engine,
-                id_channel);
-        break;
-      case kTraceAudioCoding:
-        sprintf(trace_message, "AUDIO CODING:%5ld %5ld;", id_engine,
-                id_channel);
-        break;
-      case kTraceSrtp:
-        sprintf(trace_message, "        SRTP:%5ld %5ld;", id_engine,
-                id_channel);
-        break;
-      case kTraceAudioMixerServer:
-        sprintf(trace_message, " AUDIO MIX/S:%5ld %5ld;", id_engine,
-                id_channel);
-        break;
-      case kTraceAudioMixerClient:
-        sprintf(trace_message, " AUDIO MIX/C:%5ld %5ld;", id_engine,
-                id_channel);
-        break;
-      case kTraceVideoCoding:
-        sprintf(trace_message, "VIDEO CODING:%5ld %5ld;", id_engine,
-                id_channel);
-        break;
-      case kTraceVideoMixer:
-        // Print sleep time and API call
-        sprintf(trace_message, "   VIDEO MIX:%5ld %5ld;", id_engine,
-                id_channel);
-        break;
-      case kTraceFile:
-        sprintf(trace_message, "        FILE:%5ld %5ld;", id_engine,
-                id_channel);
-        break;
-      case kTraceAudioProcessing:
-        sprintf(trace_message, "  AUDIO PROC:%5ld %5ld;", id_engine,
-                id_channel);
-        break;
-      case kTraceAudioDevice:
-        sprintf(trace_message, "AUDIO DEVICE:%5ld %5ld;", id_engine,
-                id_channel);
-        break;
-      case kTraceVideoRenderer:
-        sprintf(trace_message, "VIDEO RENDER:%5ld %5ld;", id_engine,
-                id_channel);
-        break;
-      case kTraceVideoCapture:
-        sprintf(trace_message, "VIDEO CAPTUR:%5ld %5ld;", id_engine,
-                id_channel);
-        break;
-      case kTraceRemoteBitrateEstimator:
-        sprintf(trace_message, "     BWE RBE:%5ld %5ld;", id_engine,
-                id_channel);
-        break;
-    }
-  } else {
-    switch (module) {
-      case kTraceUndefined:
-        // Add the appropriate amount of whitespace.
-        memset(trace_message, ' ', kMessageLength);
-        trace_message[kMessageLength] = '\0';
-        break;
-      case kTraceVoice:
-        sprintf(trace_message, "       VOICE:%11ld;", idl);
-        break;
-      case kTraceVideo:
-        sprintf(trace_message, "       VIDEO:%11ld;", idl);
-        break;
-      case kTraceUtility:
-        sprintf(trace_message, "     UTILITY:%11ld;", idl);
-        break;
-      case kTraceRtpRtcp:
-        sprintf(trace_message, "    RTP/RTCP:%11ld;", idl);
-        break;
-      case kTraceTransport:
-        sprintf(trace_message, "   TRANSPORT:%11ld;", idl);
-        break;
-      case kTraceAudioCoding:
-        sprintf(trace_message, "AUDIO CODING:%11ld;", idl);
-        break;
-      case kTraceSrtp:
-        sprintf(trace_message, "        SRTP:%11ld;", idl);
-        break;
-      case kTraceAudioMixerServer:
-        sprintf(trace_message, " AUDIO MIX/S:%11ld;", idl);
-        break;
-      case kTraceAudioMixerClient:
-        sprintf(trace_message, " AUDIO MIX/C:%11ld;", idl);
-        break;
-      case kTraceVideoCoding:
-        sprintf(trace_message, "VIDEO CODING:%11ld;", idl);
-        break;
-      case kTraceVideoMixer:
-        sprintf(trace_message, "   VIDEO MIX:%11ld;", idl);
-        break;
-      case kTraceFile:
-        sprintf(trace_message, "        FILE:%11ld;", idl);
-        break;
-      case kTraceAudioProcessing:
-        sprintf(trace_message, "  AUDIO PROC:%11ld;", idl);
-        break;
-      case kTraceAudioDevice:
-        sprintf(trace_message, "AUDIO DEVICE:%11ld;", idl);
-        break;
-      case kTraceVideoRenderer:
-        sprintf(trace_message, "VIDEO RENDER:%11ld;", idl);
-        break;
-      case kTraceVideoCapture:
-        sprintf(trace_message, "VIDEO CAPTUR:%11ld;", idl);
-        break;
-      case kTraceRemoteBitrateEstimator:
-        sprintf(trace_message, "     BWE RBE:%11ld;", idl);
-        break;
-    }
-  }
-  return kMessageLength;
-}
-
-int32_t TraceImpl::SetTraceFileImpl(const char* file_name_utf8,
-                                    const bool add_file_counter) {
-  rtc::CritScope lock(&crit_);
-
-  trace_file_->CloseFile();
-  trace_file_path_.clear();
-
-  if (file_name_utf8) {
-    if (add_file_counter) {
-      file_count_text_ = 1;
-
-      char file_name_with_counter_utf8[FileWrapper::kMaxFileNameSize];
-      CreateFileName(file_name_utf8, file_name_with_counter_utf8,
-                     file_count_text_);
-      if (!trace_file_->OpenFile(file_name_with_counter_utf8, false)) {
-        return -1;
-      }
-      trace_file_path_ = file_name_with_counter_utf8;
-    } else {
-      file_count_text_ = 0;
-      if (!trace_file_->OpenFile(file_name_utf8, false)) {
-        return -1;
-      }
-      trace_file_path_ = file_name_utf8;
-    }
-  }
-  row_count_text_ = 0;
-  return 0;
-}
-
-int32_t TraceImpl::SetTraceCallbackImpl(TraceCallback* callback) {
-  rtc::CritScope lock(&crit_);
-  callback_ = callback;
-  return 0;
-}
-
-int32_t TraceImpl::AddMessage(
-    char* trace_message,
-    const char msg[WEBRTC_TRACE_MAX_MESSAGE_SIZE],
-    const uint16_t written_so_far) const {
-  int length = 0;
-  if (written_so_far >= WEBRTC_TRACE_MAX_MESSAGE_SIZE) {
-    return -1;
-  }
-  // - 2 to leave room for newline and NULL termination.
-#ifdef _WIN32
-  length = _snprintf(trace_message,
-                     WEBRTC_TRACE_MAX_MESSAGE_SIZE - written_so_far - 2,
-                     "%s", msg);
-  if (length < 0) {
-    length = WEBRTC_TRACE_MAX_MESSAGE_SIZE - written_so_far - 2;
-    trace_message[length] = 0;
-  }
-#else
-  length = snprintf(trace_message,
-                    WEBRTC_TRACE_MAX_MESSAGE_SIZE - written_so_far - 2,
-                    "%s", msg);
-  if (length < 0 ||
-      length > WEBRTC_TRACE_MAX_MESSAGE_SIZE - written_so_far - 2) {
-    length = WEBRTC_TRACE_MAX_MESSAGE_SIZE - written_so_far - 2;
-    trace_message[length] = 0;
-  }
-#endif
-  // Length with NULL termination.
-  return length + 1;
-}
-
-void TraceImpl::AddMessageToList(
-    const char trace_message[WEBRTC_TRACE_MAX_MESSAGE_SIZE],
-    const uint16_t length,
-    const TraceLevel level) {
-  rtc::CritScope lock(&crit_);
-  if (callback_)
-    callback_->Print(level, trace_message, length);
-  WriteToFile(trace_message, length);
-}
-
-void TraceImpl::WriteToFile(const char* msg, uint16_t length) {
-  if (!trace_file_->is_open())
-    return;
-
-  if (row_count_text_ > WEBRTC_TRACE_MAX_FILE_SIZE) {
-    // wrap file
-    row_count_text_ = 0;
-    trace_file_->Flush();
-
-    if (file_count_text_ == 0) {
-      trace_file_->Rewind();
-    } else {
-      char new_file_name[FileWrapper::kMaxFileNameSize];
-
-      // get current name
-      file_count_text_++;
-      UpdateFileName(new_file_name, file_count_text_);
-
-      trace_file_->CloseFile();
-      trace_file_path_.clear();
-
-      if (!trace_file_->OpenFile(new_file_name, false)) {
-        return;
-      }
-      trace_file_path_ = new_file_name;
-    }
-  }
-  if (row_count_text_ == 0) {
-    char message[WEBRTC_TRACE_MAX_MESSAGE_SIZE + 1];
-    int32_t length = AddDateTimeInfo(message);
-    if (length != -1) {
-      message[length] = 0;
-      message[length - 1] = '\n';
-      trace_file_->Write(message, length);
-      row_count_text_++;
-    }
-  }
-
-  char trace_message[WEBRTC_TRACE_MAX_MESSAGE_SIZE];
-  memcpy(trace_message, msg, length);
-  trace_message[length] = 0;
-  trace_message[length - 1] = '\n';
-  trace_file_->Write(trace_message, length);
-  row_count_text_++;
-}
-
-void TraceImpl::AddImpl(const TraceLevel level,
-                        const TraceModule module,
-                        const int32_t id,
-                        const char msg[WEBRTC_TRACE_MAX_MESSAGE_SIZE]) {
-  if (!TraceCheck(level))
-    return;
-
-  char trace_message[WEBRTC_TRACE_MAX_MESSAGE_SIZE];
-  char* message_ptr = &trace_message[0];
-  int32_t len = AddLevel(message_ptr, level);
-  if (len == -1)
-    return;
-
-  message_ptr += len;
-  int32_t ack_len = len;
-
-  len = AddTime(message_ptr, level);
-  if (len == -1)
-    return;
-
-  message_ptr += len;
-  ack_len += len;
-
-  len = AddModuleAndId(message_ptr, module, id);
-  if (len == -1)
-    return;
-
-  message_ptr += len;
-  ack_len += len;
-
-  len = AddThreadId(message_ptr);
-  if (len < 0)
-    return;
-
-  message_ptr += len;
-  ack_len += len;
-
-  len = AddMessage(message_ptr, msg, static_cast<uint16_t>(ack_len));
-  if (len == -1)
-    return;
-
-  ack_len += len;
-  AddMessageToList(trace_message, static_cast<uint16_t>(ack_len), level);
-}
-
-bool TraceImpl::TraceCheck(const TraceLevel level) const {
-  return (level & level_filter()) ? true : false;
-}
-
-bool TraceImpl::UpdateFileName(
-    char file_name_with_counter_utf8[FileWrapper::kMaxFileNameSize],
-    const uint32_t new_count) const {
-  int32_t length = static_cast<int32_t>(trace_file_path_.length());
-
-  int32_t length_without_file_ending = length - 1;
-  while (length_without_file_ending > 0) {
-    if (trace_file_path_[length_without_file_ending] == '.') {
-      break;
-    } else {
-      length_without_file_ending--;
-    }
-  }
-  if (length_without_file_ending == 0) {
-    length_without_file_ending = length;
-  }
-  int32_t length_to_ = length_without_file_ending - 1;
-  while (length_to_ > 0) {
-    if (trace_file_path_[length_to_] == '_') {
-      break;
-    } else {
-      length_to_--;
-    }
-  }
-
-  memcpy(file_name_with_counter_utf8, &trace_file_path_[0], length_to_);
-  sprintf(file_name_with_counter_utf8 + length_to_, "_%lu%s",
-          static_cast<long unsigned int>(new_count),
-          &trace_file_path_[length_without_file_ending]);
-  return true;
-}
-
-bool TraceImpl::CreateFileName(
-    const char file_name_utf8[FileWrapper::kMaxFileNameSize],
-    char file_name_with_counter_utf8[FileWrapper::kMaxFileNameSize],
-    const uint32_t new_count) const {
-  int32_t length = (int32_t)strlen(file_name_utf8);
-  if (length < 0) {
-    return false;
-  }
-
-  int32_t length_without_file_ending = length - 1;
-  while (length_without_file_ending > 0) {
-    if (file_name_utf8[length_without_file_ending] == '.') {
-      break;
-    } else {
-      length_without_file_ending--;
-    }
-  }
-  if (length_without_file_ending == 0) {
-    length_without_file_ending = length;
-  }
-  memcpy(file_name_with_counter_utf8, file_name_utf8,
-         length_without_file_ending);
-  sprintf(file_name_with_counter_utf8 + length_without_file_ending, "_%lu%s",
-          static_cast<long unsigned int>(new_count),
-          file_name_utf8 + length_without_file_ending);
-  return true;
-}
-
-// static
-void Trace::CreateTrace() {
-  TraceImpl::StaticInstance(kAddRef);
-}
-
-// static
-void Trace::ReturnTrace() {
-  TraceImpl::StaticInstance(kRelease);
-}
-
-// static
-void Trace::set_level_filter(int filter) {
-  rtc::AtomicOps::ReleaseStore(&level_filter_, filter);
-}
-
-// static
-int Trace::level_filter() {
-  return rtc::AtomicOps::AcquireLoad(&level_filter_);
-}
-
-// static
-int32_t Trace::SetTraceFile(const char* file_name,
-                            const bool add_file_counter) {
-  TraceImpl* trace = TraceImpl::GetTrace();
-  if (trace) {
-    int ret_val = trace->SetTraceFileImpl(file_name, add_file_counter);
-    ReturnTrace();
-    return ret_val;
-  }
-  return -1;
-}
-
-int32_t Trace::SetTraceCallback(TraceCallback* callback) {
-  TraceImpl* trace = TraceImpl::GetTrace();
-  if (trace) {
-    int ret_val = trace->SetTraceCallbackImpl(callback);
-    ReturnTrace();
-    return ret_val;
-  }
-  return -1;
-}
-
-void Trace::Add(const TraceLevel level, const TraceModule module,
-                const int32_t id, const char* msg, ...) {
-  TraceImpl* trace = TraceImpl::GetTrace(level);
-  if (trace) {
-    if (trace->TraceCheck(level)) {
-      char temp_buff[WEBRTC_TRACE_MAX_MESSAGE_SIZE];
-      char* buff = 0;
-      if (msg) {
-        va_list args;
-        va_start(args, msg);
-#ifdef _WIN32
-        _vsnprintf(temp_buff, WEBRTC_TRACE_MAX_MESSAGE_SIZE - 1, msg, args);
-#else
-        vsnprintf(temp_buff, WEBRTC_TRACE_MAX_MESSAGE_SIZE - 1, msg, args);
-#endif
-        va_end(args);
-        buff = temp_buff;
-      }
-      trace->AddImpl(level, module, id, buff);
-    }
-    ReturnTrace();
-  }
-}
-
-}  // namespace webrtc
diff --git a/system_wrappers/source/trace_impl.h b/system_wrappers/source/trace_impl.h
deleted file mode 100644
index 0e36aff..0000000
--- a/system_wrappers/source/trace_impl.h
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- *  Copyright (c) 2012 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_SYSTEM_WRAPPERS_SOURCE_TRACE_IMPL_H_
-#define WEBRTC_SYSTEM_WRAPPERS_SOURCE_TRACE_IMPL_H_
-
-#include <memory>
-
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/platform_thread.h"
-#include "webrtc/system_wrappers/include/event_wrapper.h"
-#include "webrtc/system_wrappers/include/file_wrapper.h"
-#include "webrtc/system_wrappers/include/static_instance.h"
-#include "webrtc/system_wrappers/include/trace.h"
-
-namespace webrtc {
-
-#define WEBRTC_TRACE_MAX_MESSAGE_SIZE 1024
-// Total buffer size is WEBRTC_TRACE_NUM_ARRAY (number of buffer partitions) *
-// WEBRTC_TRACE_MAX_QUEUE (number of lines per buffer partition) *
-// WEBRTC_TRACE_MAX_MESSAGE_SIZE (number of 1 byte charachters per line) =
-// 1 or 4 Mbyte.
-
-#define WEBRTC_TRACE_MAX_FILE_SIZE 100*1000
-// Number of rows that may be written to file. On average 110 bytes per row (max
-// 256 bytes per row). So on average 110*100*1000 = 11 Mbyte, max 256*100*1000 =
-// 25.6 Mbyte
-
-class TraceImpl : public Trace {
- public:
-  virtual ~TraceImpl();
-
-  static TraceImpl* CreateInstance();
-  static TraceImpl* GetTrace(const TraceLevel level = kTraceAll);
-
-  int32_t SetTraceFileImpl(const char* file_name, const bool add_file_counter);
-  int32_t SetTraceCallbackImpl(TraceCallback* callback);
-
-  void AddImpl(const TraceLevel level, const TraceModule module,
-               const int32_t id, const char* msg);
-
-  bool TraceCheck(const TraceLevel level) const;
-
- protected:
-  TraceImpl();
-
-  static TraceImpl* StaticInstance(CountOperation count_operation,
-                                   const TraceLevel level = kTraceAll);
-
-  int32_t AddThreadId(char* trace_message) const;
-
-  // OS specific implementations.
-  virtual int32_t AddTime(char* trace_message,
-                          const TraceLevel level) const = 0;
-
-  virtual int32_t AddDateTimeInfo(char* trace_message) const = 0;
-
- private:
-  friend class Trace;
-
-  int32_t AddLevel(char* sz_message, const TraceLevel level) const;
-
-  int32_t AddModuleAndId(char* trace_message, const TraceModule module,
-                         const int32_t id) const;
-
-  int32_t AddMessage(char* trace_message,
-                     const char msg[WEBRTC_TRACE_MAX_MESSAGE_SIZE],
-                     const uint16_t written_so_far) const;
-
-  void AddMessageToList(
-    const char trace_message[WEBRTC_TRACE_MAX_MESSAGE_SIZE],
-    const uint16_t length,
-    const TraceLevel level);
-
-  bool UpdateFileName(
-      char file_name_with_counter_utf8[FileWrapper::kMaxFileNameSize],
-      const uint32_t new_count) const RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_);
-
-  bool CreateFileName(
-    const char file_name_utf8[FileWrapper::kMaxFileNameSize],
-    char file_name_with_counter_utf8[FileWrapper::kMaxFileNameSize],
-    const uint32_t new_count) const;
-
-  void WriteToFile(const char* msg, uint16_t length)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_);
-
-  TraceCallback* callback_ RTC_GUARDED_BY(crit_);
-  uint32_t row_count_text_ RTC_GUARDED_BY(crit_);
-  uint32_t file_count_text_ RTC_GUARDED_BY(crit_);
-
-  const std::unique_ptr<FileWrapper> trace_file_ RTC_GUARDED_BY(crit_);
-  std::string trace_file_path_ RTC_GUARDED_BY(crit_);
-  rtc::CriticalSection crit_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_SYSTEM_WRAPPERS_SOURCE_TRACE_IMPL_H_
diff --git a/system_wrappers/source/trace_posix.cc b/system_wrappers/source/trace_posix.cc
deleted file mode 100644
index f181ad2..0000000
--- a/system_wrappers/source/trace_posix.cc
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- *  Copyright (c) 2012 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/system_wrappers/source/trace_posix.h"
-
-#include <assert.h>
-#include <stdarg.h>
-#include <stdio.h>
-#include <string.h>
-#include <sys/time.h>
-#include <time.h>
-
-namespace webrtc {
-
-TracePosix::TracePosix() {
-  struct timeval system_time_high_res;
-  gettimeofday(&system_time_high_res, 0);
-  prev_api_tick_count_ = prev_tick_count_ = system_time_high_res.tv_sec;
-}
-
-int32_t TracePosix::AddTime(char* trace_message, const TraceLevel level) const {
-  struct timeval system_time_high_res;
-  if (gettimeofday(&system_time_high_res, 0) == -1) {
-    return -1;
-  }
-  struct tm buffer;
-  const struct tm* system_time =
-    localtime_r(&system_time_high_res.tv_sec, &buffer);
-
-  const uint32_t ms_time = system_time_high_res.tv_usec / 1000;
-  uint32_t prev_tickCount = 0;
-  {
-    rtc::CritScope lock(&crit_sect_);
-    if (level == kTraceApiCall) {
-      prev_tickCount = prev_tick_count_;
-      prev_tick_count_ = ms_time;
-    } else {
-      prev_tickCount = prev_api_tick_count_;
-      prev_api_tick_count_ = ms_time;
-    }
-  }
-
-  uint32_t dw_delta_time = ms_time - prev_tickCount;
-  if (prev_tickCount == 0) {
-    dw_delta_time = 0;
-  }
-  if (dw_delta_time > 0x0fffffff) {
-    // Either wraparound or data race.
-    dw_delta_time = 0;
-  }
-  if (dw_delta_time > 99999) {
-    dw_delta_time = 99999;
-  }
-
-  sprintf(trace_message, "(%2u:%2u:%2u:%3u |%5lu) ", system_time->tm_hour,
-          system_time->tm_min, system_time->tm_sec, ms_time,
-          static_cast<unsigned long>(dw_delta_time));
-  // Messages are 22 characters.
-  return 22;
-}
-
-int32_t TracePosix::AddDateTimeInfo(char* trace_message) const {
-  time_t t;
-  time(&t);
-  char buffer[26];  // man ctime says buffer should have room for >=26 bytes.
-  sprintf(trace_message, "Local Date: %s", ctime_r(&t, buffer));
-  int32_t len = static_cast<int32_t>(strlen(trace_message));
-
-  if ('\n' == trace_message[len - 1]) {
-    trace_message[len - 1] = '\0';
-    --len;
-  }
-
-  // Messages is 12 characters.
-  return len + 1;
-}
-
-}  // namespace webrtc
diff --git a/system_wrappers/source/trace_posix.h b/system_wrappers/source/trace_posix.h
deleted file mode 100644
index 4387895..0000000
--- a/system_wrappers/source/trace_posix.h
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- *  Copyright (c) 2011 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_SYSTEM_WRAPPERS_SOURCE_TRACE_POSIX_H_
-#define WEBRTC_SYSTEM_WRAPPERS_SOURCE_TRACE_POSIX_H_
-
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/system_wrappers/source/trace_impl.h"
-
-namespace webrtc {
-
-class TracePosix : public TraceImpl {
- public:
-  TracePosix();
-  ~TracePosix() override = default;
-
-  // This method can be called on several different threads different from
-  // the creating thread.
-  int32_t AddTime(char* trace_message, const TraceLevel level) const override;
-
-  int32_t AddDateTimeInfo(char* trace_message) const override;
-
- private:
-  volatile mutable uint32_t  prev_api_tick_count_;
-  volatile mutable uint32_t  prev_tick_count_;
-
-  rtc::CriticalSection crit_sect_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_SYSTEM_WRAPPERS_SOURCE_TRACE_POSIX_H_
diff --git a/system_wrappers/source/trace_win.cc b/system_wrappers/source/trace_win.cc
deleted file mode 100644
index 4caedfc..0000000
--- a/system_wrappers/source/trace_win.cc
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- *  Copyright (c) 2012 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/system_wrappers/source/trace_win.h"
-
-#include <assert.h>
-#include <stdarg.h>
-
-#include "Mmsystem.h"
-
-namespace webrtc {
-TraceWindows::TraceWindows()
-    : prev_api_tick_count_(0),
-      prev_tick_count_(0) {
-}
-
-TraceWindows::~TraceWindows() {
-}
-
-int32_t TraceWindows::AddTime(char* trace_message,
-                              const TraceLevel level) const {
-  uint32_t dw_current_time = timeGetTime();
-  SYSTEMTIME system_time;
-  GetSystemTime(&system_time);
-
-  if (level == kTraceApiCall) {
-    uint32_t dw_delta_time = dw_current_time - prev_tick_count_;
-    prev_tick_count_ = dw_current_time;
-
-    if (prev_tick_count_ == 0) {
-      dw_delta_time = 0;
-    }
-    if (dw_delta_time > 0x0fffffff) {
-      // Either wrap-around or data race.
-      dw_delta_time = 0;
-    }
-    if (dw_delta_time > 99999) {
-      dw_delta_time = 99999;
-    }
-
-    sprintf(trace_message, "(%2u:%2u:%2u:%3u |%5u) ", system_time.wHour,
-            system_time.wMinute, system_time.wSecond,
-            system_time.wMilliseconds, dw_delta_time);
-  } else {
-    uint32_t dw_delta_time = dw_current_time - prev_api_tick_count_;
-    prev_api_tick_count_ = dw_current_time;
-
-    if (prev_api_tick_count_ == 0) {
-      dw_delta_time = 0;
-    }
-    if (dw_delta_time > 0x0fffffff) {
-      // Either wraparound or data race.
-      dw_delta_time = 0;
-    }
-    if (dw_delta_time > 99999) {
-      dw_delta_time = 99999;
-    }
-    sprintf(trace_message, "(%2u:%2u:%2u:%3u |%5u) ", system_time.wHour,
-            system_time.wMinute, system_time.wSecond,
-            system_time.wMilliseconds, dw_delta_time);
-  }
-  return 22;
-}
-
-int32_t TraceWindows::AddDateTimeInfo(char* trace_message) const {
-  prev_api_tick_count_ = timeGetTime();
-  prev_tick_count_ = prev_api_tick_count_;
-
-  SYSTEMTIME sys_time;
-  GetLocalTime(&sys_time);
-
-  TCHAR sz_date_str[20];
-  TCHAR sz_time_str[20];
-
-  // Create date string (e.g. Apr 04 2002)
-  GetDateFormat(LOCALE_SYSTEM_DEFAULT, 0, &sys_time, TEXT("MMM dd yyyy"),
-                sz_date_str, 20);
-
-  // Create time string (e.g. 15:32:08)
-  GetTimeFormat(LOCALE_SYSTEM_DEFAULT, 0, &sys_time, TEXT("HH':'mm':'ss"),
-                sz_time_str, 20);
-
-  sprintf(trace_message, "Local Date: %ls Local Time: %ls", sz_date_str,
-          sz_time_str);
-
-  // Include NULL termination (hence + 1).
-  return static_cast<int32_t>(strlen(trace_message) + 1);
-}
-
-}  // namespace webrtc
diff --git a/system_wrappers/source/trace_win.h b/system_wrappers/source/trace_win.h
deleted file mode 100644
index 1311b23..0000000
--- a/system_wrappers/source/trace_win.h
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- *  Copyright (c) 2011 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_SYSTEM_WRAPPERS_SOURCE_TRACE_WIN_H_
-#define WEBRTC_SYSTEM_WRAPPERS_SOURCE_TRACE_WIN_H_
-
-#include <stdio.h>
-#include <windows.h>
-
-#include "webrtc/system_wrappers/source/trace_impl.h"
-
-namespace webrtc {
-
-class TraceWindows : public TraceImpl {
- public:
-  TraceWindows();
-  virtual ~TraceWindows();
-
-  virtual int32_t AddTime(char* trace_message, const TraceLevel level) const;
-
-  virtual int32_t AddDateTimeInfo(char* trace_message) const;
- private:
-  volatile mutable uint32_t prev_api_tick_count_;
-  volatile mutable uint32_t prev_tick_count_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_SYSTEM_WRAPPERS_SOURCE_TRACE_WIN_H_
diff --git a/test/BUILD.gn b/test/BUILD.gn
deleted file mode 100644
index dc696c4..0000000
--- a/test/BUILD.gn
+++ /dev/null
@@ -1,730 +0,0 @@
-# Copyright (c) 2014 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.
-
-import("../webrtc.gni")
-import("//build/config/ui.gni")
-if (is_android) {
-  import("//build/config/android/rules.gni")
-}
-if (rtc_use_memcheck) {
-  import("//tools_webrtc/valgrind/valgrind-webrtc.gni")
-}
-
-group("test") {
-  testonly = true
-
-  deps = [
-    ":field_trial",
-    ":rtp_test_utils",
-    ":test_common",
-    ":test_renderer",
-    ":test_support",
-    ":video_test_common",
-  ]
-
-  if (!build_with_chromium) {
-    deps += [
-      ":test_main",
-      ":test_support_unittests",
-    ]
-  }
-}
-
-rtc_source_set("video_test_common") {
-  testonly = true
-  sources = [
-    "fake_texture_frame.cc",
-    "fake_texture_frame.h",
-    "frame_generator.cc",
-    "frame_generator.h",
-    "frame_generator_capturer.cc",
-    "frame_generator_capturer.h",
-    "frame_utils.cc",
-    "frame_utils.h",
-    "vcm_capturer.cc",
-    "vcm_capturer.h",
-    "video_capturer.cc",
-    "video_capturer.h",
-    "video_codec_settings.h",
-  ]
-
-  if (!build_with_chromium && is_clang) {
-    # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-    suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-  }
-
-  deps = [
-    "..:webrtc_common",
-    "../api:optional",
-    "../api/video_codecs:video_codecs_api",
-    "../call:video_stream_api",
-    "../common_video",
-    "../media:rtc_media_base",
-    "../modules/video_capture:video_capture_module",
-    "../rtc_base:rtc_base_approved",
-    "../rtc_base:rtc_task_queue",
-    "../system_wrappers",
-  ]
-}
-
-rtc_source_set("rtp_test_utils") {
-  testonly = true
-  sources = [
-    "rtcp_packet_parser.cc",
-    "rtcp_packet_parser.h",
-    "rtp_file_reader.cc",
-    "rtp_file_reader.h",
-    "rtp_file_writer.cc",
-    "rtp_file_writer.h",
-  ]
-
-  if (!build_with_chromium && is_clang) {
-    # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-    suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-  }
-
-  deps = [
-    "..:webrtc_common",
-    "../api:array_view",
-    "../modules/rtp_rtcp",
-    "../rtc_base:rtc_base_approved",
-    "//testing/gtest",
-  ]
-}
-
-rtc_source_set("field_trial") {
-  testonly = true
-  sources = [
-    "field_trial.cc",
-    "field_trial.h",
-  ]
-
-  deps = [
-    "..:webrtc_common",
-    "../system_wrappers",
-    "../system_wrappers:field_trial_default",
-  ]
-}
-
-if (is_ios) {
-  rtc_source_set("test_support_objc") {
-    testonly = true
-    visibility = [ ":test_support" ]
-    sources = [
-      "ios/test_support.h",
-      "ios/test_support.mm",
-    ]
-    deps = [
-      "../sdk:common_objc",
-    ]
-  }
-}
-
-rtc_source_set("test_support") {
-  testonly = true
-
-  sources = [
-    "gmock.h",
-    "gtest.h",
-    "testsupport/packet_reader.cc",
-    "testsupport/packet_reader.h",
-    "testsupport/perf_test.cc",
-    "testsupport/perf_test.h",
-    "testsupport/trace_to_stderr.cc",
-    "testsupport/trace_to_stderr.h",
-    "testsupport/unittest_utils.h",
-  ]
-
-  public_deps = [
-    ":fileutils",
-  ]
-  if (is_ios) {
-    public_deps += [ ":test_support_objc" ]
-  }
-
-  deps = [
-    "..:webrtc_common",
-    "../common_video",
-    "../rtc_base:gtest_prod",
-    "../rtc_base:rtc_base_approved",
-    "../system_wrappers",
-    "//testing/gmock",
-    "//testing/gtest",
-  ]
-
-  if (!build_with_chromium && is_clang) {
-    # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-    suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-  }
-
-  if (is_android) {
-    deps += [ "//base:base" ]
-  }
-
-  if (is_ios && !build_with_chromium) {
-    deps += [ "../sdk:common_objc" ]
-  }
-
-  if (rtc_use_memcheck) {
-    data = valgrind_webrtc_dependencies
-  }
-}
-
-if (!build_with_chromium) {
-  # This target used to depend on //third_party/gflags which Chromium does not
-  # provide. TODO(oprypin): remove the conditional.
-  rtc_source_set("test_main") {
-    testonly = true
-    sources = [
-      "test_main.cc",
-    ]
-
-    public_deps = [
-      ":test_support",
-    ]
-    deps = [
-      ":field_trial",
-      "../rtc_base:rtc_base_approved",
-      "../system_wrappers:metrics_default",
-      "//testing/gmock",
-      "//testing/gtest",
-    ]
-  }
-
-  rtc_source_set("video_test_support") {
-    testonly = true
-
-    sources = [
-      "testsupport/frame_reader.h",
-      "testsupport/frame_writer.h",
-      "testsupport/metrics/video_metrics.cc",
-      "testsupport/metrics/video_metrics.h",
-      "testsupport/mock/mock_frame_reader.h",
-      "testsupport/mock/mock_frame_writer.h",
-      "testsupport/y4m_frame_writer.cc",
-      "testsupport/yuv_frame_reader.cc",
-      "testsupport/yuv_frame_writer.cc",
-    ]
-
-    deps = [
-      ":test_support",
-      ":video_test_common",
-      "..:webrtc_common",
-      "../api:video_frame_api",
-      "../common_video",
-      "../rtc_base:rtc_base_approved",
-      "../system_wrappers",
-      "//testing/gmock",
-      "//testing/gtest",
-    ]
-
-    if (!is_ios) {
-      deps += [ "//third_party:jpeg" ]
-      sources += [ "testsupport/jpeg_frame_writer.cc" ]
-    } else {
-      sources += [ "testsupport/jpeg_frame_writer_ios.cc" ]
-    }
-
-    public_deps = [
-      ":fileutils",
-    ]
-
-    if (!build_with_chromium && is_clang) {
-      # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-    }
-
-    if (is_android) {
-      deps += [ "//base:base" ]
-    }
-
-    if (is_ios) {
-      deps += [ "../sdk:common_objc" ]
-    }
-
-    if (rtc_use_memcheck) {
-      data = valgrind_webrtc_dependencies
-    }
-  }
-
-  rtc_source_set("test_support_test_output") {
-    testonly = true
-    sources = [
-      "testsupport/test_output.cc",
-      "testsupport/test_output.h",
-    ]
-    deps = [
-      ":fileutils",
-      "../rtc_base:rtc_base_approved",
-    ]
-  }
-
-  test_support_unittests_resources = [
-    "../../resources/foreman_cif_short.yuv",
-    "../../resources/video_coding/frame-ethernet-ii.pcap",
-    "../../resources/video_coding/frame-loopback.pcap",
-    "../../resources/video_coding/pltype103.rtp",
-    "../../resources/video_coding/pltype103_header_only.rtp",
-    "../../resources/video_coding/ssrcs-2.pcap",
-    "../../resources/video_coding/ssrcs-3.pcap",
-  ]
-
-  if (is_ios) {
-    bundle_data("test_support_unittests_bundle_data") {
-      testonly = true
-      sources = test_support_unittests_resources
-      outputs = [
-        "{{bundle_resources_dir}}/{{source_file_part}}",
-      ]
-    }
-  }
-
-  rtc_test("test_support_unittests") {
-    deps = [
-      ":fake_audio_device",
-      ":rtp_test_utils",
-      "../api:video_frame_api",
-      "../call:call_interfaces",
-      "../common_audio",
-      "../modules/rtp_rtcp",
-      "../rtc_base:rtc_base_approved",
-      "../system_wrappers",
-    ]
-    sources = [
-      "fake_audio_device_unittest.cc",
-      "fake_network_pipe_unittest.cc",
-      "frame_generator_unittest.cc",
-      "rtp_file_reader_unittest.cc",
-      "rtp_file_writer_unittest.cc",
-      "single_threaded_task_queue_unittest.cc",
-      "testsupport/always_passing_unittest.cc",
-      "testsupport/metrics/video_metrics_unittest.cc",
-      "testsupport/packet_reader_unittest.cc",
-      "testsupport/perf_test_unittest.cc",
-      "testsupport/test_output_unittest.cc",
-      "testsupport/y4m_frame_writer_unittest.cc",
-      "testsupport/yuv_frame_reader_unittest.cc",
-      "testsupport/yuv_frame_writer_unittest.cc",
-    ]
-
-    # TODO(jschuh): Bug 1348: fix this warning.
-    configs += [ "//build/config/compiler:no_size_t_to_int_warning" ]
-
-    if (is_win) {
-      # virtual override w/different const/volatile signature.
-      cflags = [ "/wd4373" ]
-    }
-
-    if (!build_with_chromium && is_clang) {
-      # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-    }
-
-    data = test_support_unittests_resources
-    if (is_android) {
-      deps += [ "//testing/android/native_test:native_test_support" ]
-      shard_timeout = 900
-    }
-
-    if (is_ios) {
-      deps += [ ":test_support_unittests_bundle_data" ]
-    }
-
-    deps += [
-      ":direct_transport",
-      ":fileutils_unittests",
-      ":test_common",
-      ":test_main",
-      ":test_support_test_output",
-      ":video_test_common",
-      ":video_test_support",
-      "../modules/video_capture",
-      "../rtc_base:rtc_base_approved",
-      "//testing/gmock",
-      "//testing/gtest",
-    ]
-  }
-}
-
-if (is_ios) {
-  rtc_source_set("fileutils_objc") {
-    visibility = [ ":fileutils" ]
-    sources = [
-      "testsupport/iosfileutils.mm",
-    ]
-    deps = [
-      "..:webrtc_common",
-      "../rtc_base:rtc_base_approved",
-      "../sdk:common_objc",
-    ]
-  }
-}
-
-rtc_source_set("fileutils") {
-  testonly = true
-  visibility = [
-    ":fileutils_unittests",
-    ":test_support_test_output",
-    ":test_support",
-    ":video_test_support",
-  ]
-  sources = [
-    "testsupport/fileutils.cc",
-    "testsupport/fileutils.h",
-  ]
-  deps = [
-    "..:webrtc_common",
-    "../api:optional",
-    "../rtc_base:rtc_base_approved",
-  ]
-  if (is_ios) {
-    deps += [ ":fileutils_objc" ]
-  }
-  if (is_win) {
-    deps += [ "../rtc_base:rtc_base" ]
-  }
-}
-
-rtc_source_set("run_test") {
-  testonly = true
-  if (is_mac) {
-    public_deps = [
-      ":run_test_objc",
-    ]
-  } else {
-    public_deps = [
-      ":run_test_generic",
-    ]
-  }
-}
-
-rtc_source_set("run_test_interface") {
-  sources = [
-    "run_test.h",
-  ]
-}
-
-if (is_mac) {
-  rtc_source_set("run_test_objc") {
-    testonly = true
-    visibility = [ ":run_test" ]
-    sources = [
-      "mac/run_test.mm",
-    ]
-    deps = [
-      ":run_test_interface",
-    ]
-  }
-}
-
-rtc_source_set("run_test_generic") {
-  testonly = true
-  visibility = [ ":run_test" ]
-  sources = [
-    "run_test.cc",
-  ]
-  deps = [
-    ":run_test_interface",
-  ]
-}
-
-rtc_source_set("fileutils_unittests") {
-  testonly = true
-  visibility = [ ":*" ]  # Only targets in this file can depend on this.
-  sources = [
-    "testsupport/fileutils_unittest.cc",
-  ]
-  deps = [
-    ":fileutils",
-    ":test_support",
-    "../api:optional",
-    "../rtc_base:rtc_base_approved",
-    "//testing/gmock",
-    "//testing/gtest",
-  ]
-}
-
-rtc_source_set("direct_transport") {
-  testonly = true
-  sources = [
-    "direct_transport.cc",
-    "direct_transport.h",
-    "fake_network_pipe.cc",
-    "fake_network_pipe.h",
-  ]
-  if (!build_with_chromium && is_clang) {
-    # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-    suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-  }
-  deps = [
-    "..:webrtc_common",
-    "../api:transport_api",
-    "../call",
-    "../modules/rtp_rtcp",
-    "../rtc_base:rtc_base_approved",
-    "../rtc_base:sequenced_task_checker",
-    "../system_wrappers",
-  ]
-  public_deps = [
-    ":single_threaded_task_queue",
-  ]
-}
-
-rtc_source_set("single_threaded_task_queue") {
-  testonly = true
-  sources = [
-    "single_threaded_task_queue.cc",
-    "single_threaded_task_queue.h",
-  ]
-  deps = [
-    "../rtc_base:rtc_base_approved",
-  ]
-}
-
-rtc_source_set("fake_audio_device") {
-  testonly = true
-  sources = [
-    "fake_audio_device.cc",
-    "fake_audio_device.h",
-  ]
-  if (!build_with_chromium && is_clang) {
-    # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-    suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-  }
-  deps = [
-    "..:webrtc_common",
-    "../api:array_view",
-    "../common_audio:common_audio",
-    "../modules/audio_device:audio_device",
-    "../rtc_base:rtc_base_approved",
-    "../system_wrappers:system_wrappers",
-  ]
-}
-
-rtc_source_set("test_common") {
-  testonly = true
-  sources = [
-    "call_test.cc",
-    "call_test.h",
-    "configurable_frame_size_encoder.cc",
-    "configurable_frame_size_encoder.h",
-    "constants.cc",
-    "constants.h",
-    "drifting_clock.cc",
-    "drifting_clock.h",
-    "encoder_settings.cc",
-    "encoder_settings.h",
-    "fake_decoder.cc",
-    "fake_decoder.h",
-    "fake_encoder.cc",
-    "fake_encoder.h",
-    "fake_videorenderer.h",
-    "layer_filtering_transport.cc",
-    "layer_filtering_transport.h",
-    "mock_transport.h",
-    "mock_voe_channel_proxy.h",
-    "mock_voice_engine.h",
-    "null_transport.cc",
-    "null_transport.h",
-    "rtp_rtcp_observer.h",
-    "statistics.cc",
-    "statistics.h",
-    "win/run_loop_win.cc",
-  ]
-  if (!is_win) {
-    sources += [
-      "run_loop.cc",
-      "run_loop.h",
-    ]
-  }
-
-  if (!build_with_chromium && is_clang) {
-    # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-    suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-  }
-
-  deps = [
-    ":direct_transport",
-    ":fake_audio_device",
-    ":rtp_test_utils",
-    ":test_support",
-    ":video_test_common",
-    "..:webrtc_common",
-    "../api:transport_api",
-    "../api:video_frame_api",
-    "../api/audio_codecs:builtin_audio_decoder_factory",
-    "../api/audio_codecs:builtin_audio_encoder_factory",
-    "../api/video_codecs:video_codecs_api",
-    "../audio",
-    "../call",
-    "../call:rtp_sender",
-    "../call:video_stream_api",
-    "../common_video",
-    "../logging:rtc_event_log_api",
-    "../modules/audio_device:mock_audio_device",
-    "../modules/audio_mixer:audio_mixer_impl",
-    "../modules/audio_processing",
-    "../modules/rtp_rtcp",
-    "../modules/rtp_rtcp:mock_rtp_rtcp",
-    "../modules/video_coding:webrtc_h264",
-    "../modules/video_coding:webrtc_vp8",
-    "../modules/video_coding:webrtc_vp9",
-    "../rtc_base:rtc_base_approved",
-    "../rtc_base:rtc_task_queue",
-    "../rtc_base:sequenced_task_checker",
-    "../system_wrappers",
-    "../video",
-    "../voice_engine",
-    "//testing/gmock",
-    "//testing/gtest",
-  ]
-  if (!is_android && !build_with_chromium) {
-    deps += [ "../modules/video_capture:video_capture_internal_impl" ]
-  }
-}
-
-config("test_renderer_exported_config") {
-  if (is_win && is_clang) {
-    # GN orders flags on a target before flags from configs. The default config
-    # adds -Wall, and this flag have to be after -Wall -- so they need to
-    # come from a config and cannot be on the target directly.
-    cflags = [
-      "-Wno-bool-conversion",
-      "-Wno-comment",
-      "-Wno-delete-non-virtual-dtor",
-    ]
-  }
-}
-
-rtc_source_set("test_renderer") {
-  public_deps = [
-    ":test_renderer_generic",
-  ]
-  testonly = true
-  if (is_mac) {
-    public_deps += [ ":test_renderer_objc" ]
-  }
-}
-
-if (is_mac) {
-  rtc_source_set("test_renderer_objc") {
-    testonly = true
-    visibility = [ ":test_renderer" ]
-    sources = [
-      "mac/video_renderer_mac.h",
-      "mac/video_renderer_mac.mm",
-    ]
-    deps = [
-      ":test_renderer_generic",
-      "../rtc_base:rtc_base_approved",
-    ]
-    libs = [
-      "Cocoa.framework",
-      "OpenGL.framework",
-      "CoreVideo.framework",
-    ]
-    if (!build_with_chromium && is_clang) {
-      # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-    }
-  }
-}
-
-rtc_source_set("test_renderer_generic") {
-  testonly = true
-  visibility = [
-    ":test_renderer",
-    ":test_renderer_objc",
-  ]
-  libs = []
-  sources = [
-    "linux/glx_renderer.cc",
-    "linux/glx_renderer.h",
-    "linux/video_renderer_linux.cc",
-    "video_renderer.cc",
-    "video_renderer.h",
-    "win/d3d_renderer.cc",
-    "win/d3d_renderer.h",
-  ]
-  deps = [
-    ":test_support",
-    "..:webrtc_common",
-    "../common_video",
-    "../modules/media_file",
-    "../rtc_base:rtc_base_approved",
-    "//testing/gtest",
-  ]
-  if (!is_linux && !is_mac && !is_win) {
-    sources += [ "null_platform_renderer.cc" ]
-  }
-  if (is_linux || is_mac) {
-    sources += [
-      "gl/gl_renderer.cc",
-      "gl/gl_renderer.h",
-    ]
-  }
-
-  if (is_linux) {
-    libs += [
-      "Xext",
-      "X11",
-      "GL",
-    ]
-  }
-  if (is_android) {
-    libs += [
-      "GLESv2",
-      "log",
-    ]
-  }
-
-  public_configs = [ ":test_renderer_exported_config" ]
-
-  if (!build_with_chromium && is_clang) {
-    # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-    suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-  }
-}
-
-rtc_source_set("audio_codec_mocks") {
-  testonly = true
-  sources = [
-    "mock_audio_decoder.cc",
-    "mock_audio_decoder.h",
-    "mock_audio_decoder_factory.h",
-    "mock_audio_encoder.cc",
-    "mock_audio_encoder.h",
-    "mock_audio_encoder_factory.h",
-  ]
-
-  deps = [
-    ":test_support",
-    "../api:array_view",
-    "../api/audio_codecs:audio_codecs_api",
-    "../api/audio_codecs:builtin_audio_decoder_factory",
-    "../rtc_base:rtc_base_approved",
-    "//testing/gmock",
-  ]
-}
-
-if (!build_with_chromium && is_android) {
-  android_library("native_test_java") {
-    testonly = true
-    java_files = [
-      "android/org/webrtc/native_test/RTCNativeUnitTest.java",
-      "android/org/webrtc/native_test/RTCNativeUnitTestActivity.java",
-    ]
-    deps = [
-      "../rtc_base:base_java",
-      "//testing/android/native_test:native_test_java",
-    ]
-
-    # TODO(sakal): Fix build hooks crbug.com/webrtc/8148
-    no_build_hooks = true
-  }
-}
diff --git a/test/DEPS b/test/DEPS
deleted file mode 100644
index 5aaae76..0000000
--- a/test/DEPS
+++ /dev/null
@@ -1,43 +0,0 @@
-include_rules = [
-  "+third_party/libjpeg",
-  "+third_party/libjpeg_turbo",
-  "+webrtc/call",
-  "+webrtc/common_audio",
-  "+webrtc/common_video",
-  "+webrtc/logging/rtc_event_log",
-  "+webrtc/media/base",
-  "+webrtc/modules/audio_coding",
-  "+webrtc/modules/audio_device",
-  "+webrtc/modules/audio_mixer",
-  "+webrtc/modules/audio_processing",
-  "+webrtc/modules/media_file",
-  "+webrtc/modules/rtp_rtcp",
-  "+webrtc/modules/video_capture",
-  "+webrtc/modules/video_coding",
-  "+webrtc/sdk",
-  "+webrtc/system_wrappers",
-  "+webrtc/voice_engine",
-]
-
-specific_include_rules = {
-  "gmock\.h": [
-    "+testing/gmock/include/gmock",
-  ],
-  "gtest\.h": [
-    "+testing/gtest/include/gtest",
-  ],
-  ".*congestion_controller_feedback_fuzzer\.cc": [
-    "+webrtc/modules/congestion_controller/include/receive_side_congestion_controller.h",
-    "+webrtc/modules/pacing/packet_router.h",
-    "+webrtc/modules/remote_bitrate_estimator/include/remote_bitrate_estimator.h",
-  ],
-  ".*pseudotcp_parser_fuzzer\.cc": [
-    "+webrtc/p2p/base/pseudotcp.h",
-  ],
-  ".*stun_parser_fuzzer\.cc": [
-    "+webrtc/p2p/base/stun.h",
-  ],
-  ".*stun_validator_fuzzer\.cc": [
-    "+webrtc/p2p/base/stun.h",
-  ],
-}
diff --git a/test/OWNERS b/test/OWNERS
deleted file mode 100644
index a9ecfb8..0000000
--- a/test/OWNERS
+++ /dev/null
@@ -1,4 +0,0 @@
-kjellander@webrtc.org
-pbos@webrtc.org
-phoglund@webrtc.org
-stefan@webrtc.org
diff --git a/test/android/AndroidManifest.xml b/test/android/AndroidManifest.xml
deleted file mode 100644
index b5157a7..0000000
--- a/test/android/AndroidManifest.xml
+++ /dev/null
@@ -1,46 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-Copyright 2017 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.
--->
-
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-      package="org.webrtc.native_test"
-      android:versionCode="1"
-      android:versionName="1.0">
-
-    <uses-sdk android:minSdkVersion="16" android:targetSdkVersion="23" />
-    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
-    <uses-permission android:name="android.permission.BLUETOOTH"/>
-    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
-    <uses-permission android:name="android.permission.CAMERA" />
-    <uses-permission android:name="android.permission.INTERNET"/>
-    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>
-    <uses-permission android:name="android.permission.RECORD_AUDIO"/>
-    <uses-permission android:name="android.permission.WAKE_LOCK"/>
-    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
-
-    <application android:label="NativeTests"
-            android:name="org.chromium.base.BaseChromiumApplication">
-        <uses-library android:name="android.test.runner"/>
-        <activity android:name=".RTCNativeUnitTestActivity"
-                android:label="NativeTest"
-                android:configChanges="orientation|keyboardHidden"
-                android:process=":test_process">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN" />
-                <category android:name="android.intent.category.LAUNCHER" />
-            </intent-filter>
-        </activity>
-    </application>
-
-    <instrumentation android:name="org.chromium.native_test.NativeTestInstrumentationTestRunner"
-            android:targetPackage="org.webrtc.native_test"
-            android:label="Instrumentation entry point for org.webrtc.native_test"/>
-
-</manifest>
diff --git a/test/android/org/webrtc/native_test/RTCNativeUnitTest.java b/test/android/org/webrtc/native_test/RTCNativeUnitTest.java
deleted file mode 100644
index dede7ed..0000000
--- a/test/android/org/webrtc/native_test/RTCNativeUnitTest.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- *  Copyright 2017 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.
- */
-
-package org.webrtc.native_test;
-
-import android.app.Activity;
-import org.chromium.native_test.NativeUnitTest;
-import org.webrtc.ContextUtils;
-
-/**
- * Native unit test that calls ContextUtils.initialize for WebRTC.
- */
-public class RTCNativeUnitTest extends NativeUnitTest {
-  @Override
-  public void preCreate(Activity activity) {
-    super.preCreate(activity);
-    ContextUtils.initialize(activity.getApplicationContext());
-  }
-}
diff --git a/test/android/org/webrtc/native_test/RTCNativeUnitTestActivity.java b/test/android/org/webrtc/native_test/RTCNativeUnitTestActivity.java
deleted file mode 100644
index 2a41368..0000000
--- a/test/android/org/webrtc/native_test/RTCNativeUnitTestActivity.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- *  Copyright 2017 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.
- */
-
-package org.webrtc.native_test;
-
-import android.app.Activity;
-import android.os.Bundle;
-
-/**
- * Activity that uses RTCNativeUnitTest to run the tests.
- */
-public class RTCNativeUnitTestActivity extends Activity {
-  private RTCNativeUnitTest mTest = new RTCNativeUnitTest();
-
-  @Override
-  public void onCreate(Bundle savedInstanceState) {
-    mTest.preCreate(this);
-    super.onCreate(savedInstanceState);
-    mTest.postCreate(this);
-  }
-
-  @Override
-  public void onStart() {
-    super.onStart();
-    mTest.postStart(this, false);
-  }
-}
diff --git a/test/call_test.cc b/test/call_test.cc
deleted file mode 100644
index d4084d5..0000000
--- a/test/call_test.cc
+++ /dev/null
@@ -1,612 +0,0 @@
-/*
- *  Copyright (c) 2014 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/test/call_test.h"
-
-#include <algorithm>
-
-#include "webrtc/api/audio_codecs/builtin_audio_decoder_factory.h"
-#include "webrtc/api/audio_codecs/builtin_audio_encoder_factory.h"
-#include "webrtc/call/rtp_transport_controller_send.h"
-#include "webrtc/call/video_config.h"
-#include "webrtc/modules/audio_mixer/audio_mixer_impl.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/event.h"
-#include "webrtc/rtc_base/ptr_util.h"
-#include "webrtc/test/testsupport/fileutils.h"
-#include "webrtc/voice_engine/include/voe_base.h"
-
-namespace webrtc {
-namespace test {
-
-namespace {
-const int kVideoRotationRtpExtensionId = 4;
-}
-
-CallTest::CallTest()
-    : clock_(Clock::GetRealTimeClock()),
-      event_log_(RtcEventLog::CreateNull()),
-      sender_call_transport_controller_(nullptr),
-      video_send_config_(nullptr),
-      video_send_stream_(nullptr),
-      audio_send_config_(nullptr),
-      audio_send_stream_(nullptr),
-      fake_encoder_(clock_),
-      num_video_streams_(1),
-      num_audio_streams_(0),
-      num_flexfec_streams_(0),
-      decoder_factory_(CreateBuiltinAudioDecoderFactory()),
-      encoder_factory_(CreateBuiltinAudioEncoderFactory()),
-      task_queue_("CallTestTaskQueue"),
-      fake_send_audio_device_(nullptr),
-      fake_recv_audio_device_(nullptr) {}
-
-CallTest::~CallTest() {
-  task_queue_.SendTask([this]() {
-    fake_send_audio_device_.reset();
-    fake_recv_audio_device_.reset();
-    frame_generator_capturer_.reset();
-  });
-}
-
-void CallTest::RunBaseTest(BaseTest* test) {
-  task_queue_.SendTask([this, test]() {
-    num_video_streams_ = test->GetNumVideoStreams();
-    num_audio_streams_ = test->GetNumAudioStreams();
-    num_flexfec_streams_ = test->GetNumFlexfecStreams();
-    RTC_DCHECK(num_video_streams_ > 0 || num_audio_streams_ > 0);
-    Call::Config send_config(test->GetSenderCallConfig());
-    if (num_audio_streams_ > 0) {
-      CreateFakeAudioDevices(test->CreateCapturer(), test->CreateRenderer());
-      test->OnFakeAudioDevicesCreated(fake_send_audio_device_.get(),
-                                      fake_recv_audio_device_.get());
-      apm_send_ = AudioProcessing::Create();
-      apm_recv_ = AudioProcessing::Create();
-      CreateVoiceEngines();
-      AudioState::Config audio_state_config;
-      audio_state_config.voice_engine = voe_send_.voice_engine;
-      audio_state_config.audio_mixer = AudioMixerImpl::Create();
-      audio_state_config.audio_processing = apm_send_;
-      send_config.audio_state = AudioState::Create(audio_state_config);
-    }
-    CreateSenderCall(send_config);
-    if (sender_call_transport_controller_ != nullptr) {
-      test->OnRtpTransportControllerSendCreated(
-          sender_call_transport_controller_);
-    }
-    if (test->ShouldCreateReceivers()) {
-      Call::Config recv_config(test->GetReceiverCallConfig());
-      if (num_audio_streams_ > 0) {
-        AudioState::Config audio_state_config;
-        audio_state_config.voice_engine = voe_recv_.voice_engine;
-        audio_state_config.audio_mixer = AudioMixerImpl::Create();
-        audio_state_config.audio_processing = apm_recv_;
-        recv_config.audio_state = AudioState::Create(audio_state_config);
-      }
-      CreateReceiverCall(recv_config);
-    }
-    test->OnCallsCreated(sender_call_.get(), receiver_call_.get());
-    receive_transport_.reset(test->CreateReceiveTransport(&task_queue_));
-    send_transport_.reset(
-        test->CreateSendTransport(&task_queue_, sender_call_.get()));
-
-    if (test->ShouldCreateReceivers()) {
-      send_transport_->SetReceiver(receiver_call_->Receiver());
-      receive_transport_->SetReceiver(sender_call_->Receiver());
-      if (num_video_streams_ > 0)
-        receiver_call_->SignalChannelNetworkState(MediaType::VIDEO, kNetworkUp);
-      if (num_audio_streams_ > 0)
-        receiver_call_->SignalChannelNetworkState(MediaType::AUDIO, kNetworkUp);
-    } else {
-      // Sender-only call delivers to itself.
-      send_transport_->SetReceiver(sender_call_->Receiver());
-      receive_transport_->SetReceiver(nullptr);
-    }
-
-    CreateSendConfig(num_video_streams_, num_audio_streams_,
-                     num_flexfec_streams_, send_transport_.get());
-    if (test->ShouldCreateReceivers()) {
-      CreateMatchingReceiveConfigs(receive_transport_.get());
-    }
-    if (num_video_streams_ > 0) {
-      test->ModifyVideoConfigs(&video_send_config_, &video_receive_configs_,
-                               &video_encoder_config_);
-    }
-    if (num_audio_streams_ > 0) {
-      test->ModifyAudioConfigs(&audio_send_config_, &audio_receive_configs_);
-    }
-    if (num_flexfec_streams_ > 0) {
-      test->ModifyFlexfecConfigs(&flexfec_receive_configs_);
-    }
-
-    if (num_flexfec_streams_ > 0) {
-      CreateFlexfecStreams();
-      test->OnFlexfecStreamsCreated(flexfec_receive_streams_);
-    }
-    if (num_video_streams_ > 0) {
-      CreateVideoStreams();
-      test->OnVideoStreamsCreated(video_send_stream_, video_receive_streams_);
-    }
-    if (num_audio_streams_ > 0) {
-      CreateAudioStreams();
-      test->OnAudioStreamsCreated(audio_send_stream_, audio_receive_streams_);
-    }
-
-    if (num_video_streams_ > 0) {
-      int width = kDefaultWidth;
-      int height = kDefaultHeight;
-      int frame_rate = kDefaultFramerate;
-      test->ModifyVideoCaptureStartResolution(&width, &height, &frame_rate);
-      CreateFrameGeneratorCapturer(frame_rate, width, height);
-      test->OnFrameGeneratorCapturerCreated(frame_generator_capturer_.get());
-    }
-
-    Start();
-  });
-
-  test->PerformTest();
-
-  task_queue_.SendTask([this, test]() {
-    Stop();
-    test->OnStreamsStopped();
-    DestroyStreams();
-    send_transport_.reset();
-    receive_transport_.reset();
-    DestroyCalls();
-    if (num_audio_streams_ > 0)
-      DestroyVoiceEngines();
-  });
-}
-
-void CallTest::CreateCalls(const Call::Config& sender_config,
-                           const Call::Config& receiver_config) {
-  CreateSenderCall(sender_config);
-  CreateReceiverCall(receiver_config);
-}
-
-void CallTest::CreateSenderCall(const Call::Config& config) {
-  sender_call_transport_controller_ = new RtpTransportControllerSend(
-      Clock::GetRealTimeClock(), config.event_log);
-
-  sender_call_.reset(
-      Call::Create(config, std::unique_ptr<RtpTransportControllerSend>(
-                               sender_call_transport_controller_)));
-}
-
-void CallTest::CreateReceiverCall(const Call::Config& config) {
-  receiver_call_.reset(Call::Create(config));
-}
-
-void CallTest::DestroyCalls() {
-  sender_call_.reset();
-  receiver_call_.reset();
-}
-
-void CallTest::CreateSendConfig(size_t num_video_streams,
-                                size_t num_audio_streams,
-                                size_t num_flexfec_streams,
-                                Transport* send_transport) {
-  RTC_DCHECK(num_video_streams <= kNumSsrcs);
-  RTC_DCHECK_LE(num_audio_streams, 1);
-  RTC_DCHECK_LE(num_flexfec_streams, 1);
-  RTC_DCHECK(num_audio_streams == 0 || voe_send_.channel_id >= 0);
-  if (num_video_streams > 0) {
-    video_send_config_ = VideoSendStream::Config(send_transport);
-    video_send_config_.encoder_settings.encoder = &fake_encoder_;
-    video_send_config_.encoder_settings.payload_name = "FAKE";
-    video_send_config_.encoder_settings.payload_type =
-        kFakeVideoSendPayloadType;
-    video_send_config_.rtp.extensions.push_back(
-        RtpExtension(RtpExtension::kTransportSequenceNumberUri,
-                     kTransportSequenceNumberExtensionId));
-    video_send_config_.rtp.extensions.push_back(RtpExtension(
-        RtpExtension::kVideoContentTypeUri, kVideoContentTypeExtensionId));
-    FillEncoderConfiguration(num_video_streams, &video_encoder_config_);
-
-    for (size_t i = 0; i < num_video_streams; ++i)
-      video_send_config_.rtp.ssrcs.push_back(kVideoSendSsrcs[i]);
-    video_send_config_.rtp.extensions.push_back(RtpExtension(
-        RtpExtension::kVideoRotationUri, kVideoRotationRtpExtensionId));
-  }
-
-  if (num_audio_streams > 0) {
-    audio_send_config_ = AudioSendStream::Config(send_transport);
-    audio_send_config_.voe_channel_id = voe_send_.channel_id;
-    audio_send_config_.rtp.ssrc = kAudioSendSsrc;
-    audio_send_config_.send_codec_spec =
-        rtc::Optional<AudioSendStream::Config::SendCodecSpec>(
-            {kAudioSendPayloadType, {"opus", 48000, 2, {{"stereo", "1"}}}});
-    audio_send_config_.encoder_factory = encoder_factory_;
-  }
-
-  // TODO(brandtr): Update this when we support multistream protection.
-  if (num_flexfec_streams > 0) {
-    video_send_config_.rtp.flexfec.payload_type = kFlexfecPayloadType;
-    video_send_config_.rtp.flexfec.ssrc = kFlexfecSendSsrc;
-    video_send_config_.rtp.flexfec.protected_media_ssrcs = {kVideoSendSsrcs[0]};
-  }
-}
-
-void CallTest::CreateMatchingReceiveConfigs(Transport* rtcp_send_transport) {
-  video_receive_configs_.clear();
-  allocated_decoders_.clear();
-  if (num_video_streams_ > 0) {
-    RTC_DCHECK(!video_send_config_.rtp.ssrcs.empty());
-    VideoReceiveStream::Config video_config(rtcp_send_transport);
-    video_config.rtp.remb = false;
-    video_config.rtp.transport_cc = true;
-    video_config.rtp.local_ssrc = kReceiverLocalVideoSsrc;
-    for (const RtpExtension& extension : video_send_config_.rtp.extensions)
-      video_config.rtp.extensions.push_back(extension);
-    video_config.renderer = &fake_renderer_;
-    for (size_t i = 0; i < video_send_config_.rtp.ssrcs.size(); ++i) {
-      VideoReceiveStream::Decoder decoder =
-          test::CreateMatchingDecoder(video_send_config_.encoder_settings);
-      allocated_decoders_.push_back(
-          std::unique_ptr<VideoDecoder>(decoder.decoder));
-      video_config.decoders.clear();
-      video_config.decoders.push_back(decoder);
-      video_config.rtp.remote_ssrc = video_send_config_.rtp.ssrcs[i];
-      video_receive_configs_.push_back(video_config.Copy());
-    }
-  }
-
-  RTC_DCHECK_GE(1, num_audio_streams_);
-  if (num_audio_streams_ == 1) {
-    RTC_DCHECK_LE(0, voe_send_.channel_id);
-    AudioReceiveStream::Config audio_config;
-    audio_config.rtp.local_ssrc = kReceiverLocalAudioSsrc;
-    audio_config.rtcp_send_transport = rtcp_send_transport;
-    audio_config.voe_channel_id = voe_recv_.channel_id;
-    audio_config.rtp.remote_ssrc = audio_send_config_.rtp.ssrc;
-    audio_config.decoder_factory = decoder_factory_;
-    audio_config.decoder_map = {{kAudioSendPayloadType, {"opus", 48000, 2}}};
-    audio_receive_configs_.push_back(audio_config);
-  }
-
-  // TODO(brandtr): Update this when we support multistream protection.
-  RTC_DCHECK(num_flexfec_streams_ <= 1);
-  if (num_flexfec_streams_ == 1) {
-    FlexfecReceiveStream::Config config(rtcp_send_transport);
-    config.payload_type = kFlexfecPayloadType;
-    config.remote_ssrc = kFlexfecSendSsrc;
-    config.protected_media_ssrcs = {kVideoSendSsrcs[0]};
-    config.local_ssrc = kReceiverLocalVideoSsrc;
-    for (const RtpExtension& extension : video_send_config_.rtp.extensions)
-      config.rtp_header_extensions.push_back(extension);
-    flexfec_receive_configs_.push_back(config);
-  }
-}
-
-void CallTest::CreateFrameGeneratorCapturerWithDrift(Clock* clock,
-                                                     float speed,
-                                                     int framerate,
-                                                     int width,
-                                                     int height) {
-  frame_generator_capturer_.reset(test::FrameGeneratorCapturer::Create(
-      width, height, framerate * speed, clock));
-  video_send_stream_->SetSource(
-      frame_generator_capturer_.get(),
-      VideoSendStream::DegradationPreference::kMaintainFramerate);
-}
-
-void CallTest::CreateFrameGeneratorCapturer(int framerate,
-                                            int width,
-                                            int height) {
-  frame_generator_capturer_.reset(
-      test::FrameGeneratorCapturer::Create(width, height, framerate, clock_));
-  video_send_stream_->SetSource(
-      frame_generator_capturer_.get(),
-      VideoSendStream::DegradationPreference::kMaintainFramerate);
-}
-
-void CallTest::CreateFakeAudioDevices(
-    std::unique_ptr<FakeAudioDevice::Capturer> capturer,
-    std::unique_ptr<FakeAudioDevice::Renderer> renderer) {
-  fake_send_audio_device_.reset(new FakeAudioDevice(
-      std::move(capturer), nullptr, 1.f));
-  fake_recv_audio_device_.reset(new FakeAudioDevice(
-      nullptr, std::move(renderer), 1.f));
-}
-
-void CallTest::CreateVideoStreams() {
-  RTC_DCHECK(video_send_stream_ == nullptr);
-  RTC_DCHECK(video_receive_streams_.empty());
-  RTC_DCHECK(audio_send_stream_ == nullptr);
-  RTC_DCHECK(audio_receive_streams_.empty());
-
-  video_send_stream_ = sender_call_->CreateVideoSendStream(
-      video_send_config_.Copy(), video_encoder_config_.Copy());
-  for (size_t i = 0; i < video_receive_configs_.size(); ++i) {
-    video_receive_streams_.push_back(receiver_call_->CreateVideoReceiveStream(
-        video_receive_configs_[i].Copy()));
-  }
-
-  AssociateFlexfecStreamsWithVideoStreams();
-}
-
-void CallTest::CreateAudioStreams() {
-  audio_send_stream_ = sender_call_->CreateAudioSendStream(audio_send_config_);
-  for (size_t i = 0; i < audio_receive_configs_.size(); ++i) {
-    audio_receive_streams_.push_back(
-        receiver_call_->CreateAudioReceiveStream(audio_receive_configs_[i]));
-  }
-}
-
-void CallTest::CreateFlexfecStreams() {
-  for (size_t i = 0; i < flexfec_receive_configs_.size(); ++i) {
-    flexfec_receive_streams_.push_back(
-        receiver_call_->CreateFlexfecReceiveStream(
-            flexfec_receive_configs_[i]));
-  }
-
-  AssociateFlexfecStreamsWithVideoStreams();
-}
-
-void CallTest::AssociateFlexfecStreamsWithVideoStreams() {
-  // All FlexFEC streams protect all of the video streams.
-  for (FlexfecReceiveStream* flexfec_recv_stream : flexfec_receive_streams_) {
-    for (VideoReceiveStream* video_recv_stream : video_receive_streams_) {
-      video_recv_stream->AddSecondarySink(flexfec_recv_stream);
-    }
-  }
-}
-
-void CallTest::DissociateFlexfecStreamsFromVideoStreams() {
-  for (FlexfecReceiveStream* flexfec_recv_stream : flexfec_receive_streams_) {
-    for (VideoReceiveStream* video_recv_stream : video_receive_streams_) {
-      video_recv_stream->RemoveSecondarySink(flexfec_recv_stream);
-    }
-  }
-}
-
-void CallTest::Start() {
-  if (video_send_stream_)
-    video_send_stream_->Start();
-  for (VideoReceiveStream* video_recv_stream : video_receive_streams_)
-    video_recv_stream->Start();
-  if (audio_send_stream_) {
-    audio_send_stream_->Start();
-  }
-  for (AudioReceiveStream* audio_recv_stream : audio_receive_streams_)
-    audio_recv_stream->Start();
-  if (frame_generator_capturer_.get() != NULL)
-    frame_generator_capturer_->Start();
-}
-
-void CallTest::Stop() {
-  if (frame_generator_capturer_.get() != NULL)
-    frame_generator_capturer_->Stop();
-  for (AudioReceiveStream* audio_recv_stream : audio_receive_streams_)
-    audio_recv_stream->Stop();
-  if (audio_send_stream_) {
-    audio_send_stream_->Stop();
-  }
-  for (VideoReceiveStream* video_recv_stream : video_receive_streams_)
-    video_recv_stream->Stop();
-  if (video_send_stream_)
-    video_send_stream_->Stop();
-}
-
-void CallTest::DestroyStreams() {
-  DissociateFlexfecStreamsFromVideoStreams();
-
-  if (audio_send_stream_)
-    sender_call_->DestroyAudioSendStream(audio_send_stream_);
-  audio_send_stream_ = nullptr;
-  for (AudioReceiveStream* audio_recv_stream : audio_receive_streams_)
-    receiver_call_->DestroyAudioReceiveStream(audio_recv_stream);
-
-  if (video_send_stream_)
-    sender_call_->DestroyVideoSendStream(video_send_stream_);
-  video_send_stream_ = nullptr;
-
-  for (VideoReceiveStream* video_recv_stream : video_receive_streams_)
-    receiver_call_->DestroyVideoReceiveStream(video_recv_stream);
-
-  for (FlexfecReceiveStream* flexfec_recv_stream : flexfec_receive_streams_)
-    receiver_call_->DestroyFlexfecReceiveStream(flexfec_recv_stream);
-
-  video_receive_streams_.clear();
-  allocated_decoders_.clear();
-}
-
-void CallTest::SetFakeVideoCaptureRotation(VideoRotation rotation) {
-  frame_generator_capturer_->SetFakeRotation(rotation);
-}
-
-void CallTest::CreateVoiceEngines() {
-  voe_send_.voice_engine = VoiceEngine::Create();
-  voe_send_.base = VoEBase::GetInterface(voe_send_.voice_engine);
-  EXPECT_EQ(0, voe_send_.base->Init(fake_send_audio_device_.get(),
-                                    apm_send_.get(), decoder_factory_));
-  VoEBase::ChannelConfig config;
-  config.enable_voice_pacing = true;
-  voe_send_.channel_id = voe_send_.base->CreateChannel(config);
-  EXPECT_GE(voe_send_.channel_id, 0);
-
-  voe_recv_.voice_engine = VoiceEngine::Create();
-  voe_recv_.base = VoEBase::GetInterface(voe_recv_.voice_engine);
-  EXPECT_EQ(0, voe_recv_.base->Init(fake_recv_audio_device_.get(),
-                                    apm_recv_.get(), decoder_factory_));
-  voe_recv_.channel_id = voe_recv_.base->CreateChannel();
-  EXPECT_GE(voe_recv_.channel_id, 0);
-}
-
-void CallTest::DestroyVoiceEngines() {
-  voe_recv_.base->DeleteChannel(voe_recv_.channel_id);
-  voe_recv_.channel_id = -1;
-  voe_recv_.base->Release();
-  voe_recv_.base = nullptr;
-
-  voe_send_.base->DeleteChannel(voe_send_.channel_id);
-  voe_send_.channel_id = -1;
-  voe_send_.base->Release();
-  voe_send_.base = nullptr;
-
-  VoiceEngine::Delete(voe_send_.voice_engine);
-  voe_send_.voice_engine = nullptr;
-  VoiceEngine::Delete(voe_recv_.voice_engine);
-  voe_recv_.voice_engine = nullptr;
-}
-
-const int CallTest::kDefaultWidth;
-const int CallTest::kDefaultHeight;
-const int CallTest::kDefaultFramerate;
-const int CallTest::kDefaultTimeoutMs = 30 * 1000;
-const int CallTest::kLongTimeoutMs = 120 * 1000;
-const uint8_t CallTest::kVideoSendPayloadType = 100;
-const uint8_t CallTest::kFakeVideoSendPayloadType = 125;
-const uint8_t CallTest::kSendRtxPayloadType = 98;
-const uint8_t CallTest::kRedPayloadType = 118;
-const uint8_t CallTest::kRtxRedPayloadType = 99;
-const uint8_t CallTest::kUlpfecPayloadType = 119;
-const uint8_t CallTest::kFlexfecPayloadType = 120;
-const uint8_t CallTest::kAudioSendPayloadType = 103;
-const uint8_t CallTest::kPayloadTypeH264 = 122;
-const uint8_t CallTest::kPayloadTypeVP8 = 123;
-const uint8_t CallTest::kPayloadTypeVP9 = 124;
-const uint32_t CallTest::kSendRtxSsrcs[kNumSsrcs] = {0xBADCAFD, 0xBADCAFE,
-                                                     0xBADCAFF};
-const uint32_t CallTest::kVideoSendSsrcs[kNumSsrcs] = {0xC0FFED, 0xC0FFEE,
-                                                       0xC0FFEF};
-const uint32_t CallTest::kAudioSendSsrc = 0xDEADBEEF;
-const uint32_t CallTest::kFlexfecSendSsrc = 0xBADBEEF;
-const uint32_t CallTest::kReceiverLocalVideoSsrc = 0x123456;
-const uint32_t CallTest::kReceiverLocalAudioSsrc = 0x1234567;
-const int CallTest::kNackRtpHistoryMs = 1000;
-
-const uint8_t CallTest::kDefaultKeepalivePayloadType =
-    RtpKeepAliveConfig().payload_type;
-
-const std::map<uint8_t, MediaType> CallTest::payload_type_map_ = {
-    {CallTest::kVideoSendPayloadType, MediaType::VIDEO},
-    {CallTest::kFakeVideoSendPayloadType, MediaType::VIDEO},
-    {CallTest::kSendRtxPayloadType, MediaType::VIDEO},
-    {CallTest::kRedPayloadType, MediaType::VIDEO},
-    {CallTest::kRtxRedPayloadType, MediaType::VIDEO},
-    {CallTest::kUlpfecPayloadType, MediaType::VIDEO},
-    {CallTest::kFlexfecPayloadType, MediaType::VIDEO},
-    {CallTest::kAudioSendPayloadType, MediaType::AUDIO},
-    {CallTest::kDefaultKeepalivePayloadType, MediaType::ANY}};
-
-BaseTest::BaseTest() : event_log_(RtcEventLog::CreateNull()) {}
-
-BaseTest::BaseTest(unsigned int timeout_ms)
-    : RtpRtcpObserver(timeout_ms), event_log_(RtcEventLog::CreateNull()) {}
-
-BaseTest::~BaseTest() {
-}
-
-std::unique_ptr<FakeAudioDevice::Capturer> BaseTest::CreateCapturer() {
-  return FakeAudioDevice::CreatePulsedNoiseCapturer(256, 48000);
-}
-
-std::unique_ptr<FakeAudioDevice::Renderer> BaseTest::CreateRenderer() {
-  return FakeAudioDevice::CreateDiscardRenderer(48000);
-}
-
-void BaseTest::OnFakeAudioDevicesCreated(FakeAudioDevice* send_audio_device,
-                                         FakeAudioDevice* recv_audio_device) {
-}
-
-Call::Config BaseTest::GetSenderCallConfig() {
-  return Call::Config(event_log_.get());
-}
-
-Call::Config BaseTest::GetReceiverCallConfig() {
-  return Call::Config(event_log_.get());
-}
-
-void BaseTest::OnRtpTransportControllerSendCreated(
-    RtpTransportControllerSend* controller) {}
-
-void BaseTest::OnCallsCreated(Call* sender_call, Call* receiver_call) {
-}
-
-test::PacketTransport* BaseTest::CreateSendTransport(
-    SingleThreadedTaskQueueForTesting* task_queue,
-    Call* sender_call) {
-  return new PacketTransport(
-      task_queue, sender_call, this, test::PacketTransport::kSender,
-      CallTest::payload_type_map_, FakeNetworkPipe::Config());
-}
-
-test::PacketTransport* BaseTest::CreateReceiveTransport(
-    SingleThreadedTaskQueueForTesting* task_queue) {
-  return new PacketTransport(
-      task_queue, nullptr, this, test::PacketTransport::kReceiver,
-      CallTest::payload_type_map_, FakeNetworkPipe::Config());
-}
-
-size_t BaseTest::GetNumVideoStreams() const {
-  return 1;
-}
-
-size_t BaseTest::GetNumAudioStreams() const {
-  return 0;
-}
-
-size_t BaseTest::GetNumFlexfecStreams() const {
-  return 0;
-}
-
-void BaseTest::ModifyVideoConfigs(
-    VideoSendStream::Config* send_config,
-    std::vector<VideoReceiveStream::Config>* receive_configs,
-    VideoEncoderConfig* encoder_config) {}
-
-void BaseTest::ModifyVideoCaptureStartResolution(int* width,
-                                                 int* heigt,
-                                                 int* frame_rate) {}
-
-void BaseTest::OnVideoStreamsCreated(
-    VideoSendStream* send_stream,
-    const std::vector<VideoReceiveStream*>& receive_streams) {}
-
-void BaseTest::ModifyAudioConfigs(
-    AudioSendStream::Config* send_config,
-    std::vector<AudioReceiveStream::Config>* receive_configs) {}
-
-void BaseTest::OnAudioStreamsCreated(
-    AudioSendStream* send_stream,
-    const std::vector<AudioReceiveStream*>& receive_streams) {}
-
-void BaseTest::ModifyFlexfecConfigs(
-    std::vector<FlexfecReceiveStream::Config>* receive_configs) {}
-
-void BaseTest::OnFlexfecStreamsCreated(
-    const std::vector<FlexfecReceiveStream*>& receive_streams) {}
-
-void BaseTest::OnFrameGeneratorCapturerCreated(
-    FrameGeneratorCapturer* frame_generator_capturer) {
-}
-
-void BaseTest::OnStreamsStopped() {
-}
-
-SendTest::SendTest(unsigned int timeout_ms) : BaseTest(timeout_ms) {
-}
-
-bool SendTest::ShouldCreateReceivers() const {
-  return false;
-}
-
-EndToEndTest::EndToEndTest() {}
-
-EndToEndTest::EndToEndTest(unsigned int timeout_ms) : BaseTest(timeout_ms) {
-}
-
-bool EndToEndTest::ShouldCreateReceivers() const {
-  return true;
-}
-
-}  // namespace test
-}  // namespace webrtc
diff --git a/test/call_test.h b/test/call_test.h
deleted file mode 100644
index 3372015..0000000
--- a/test/call_test.h
+++ /dev/null
@@ -1,249 +0,0 @@
-/*
- *  Copyright (c) 2014 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_TEST_CALL_TEST_H_
-#define WEBRTC_TEST_CALL_TEST_H_
-
-#include <memory>
-#include <vector>
-
-#include "webrtc/call/call.h"
-#include "webrtc/call/rtp_transport_controller_send.h"
-#include "webrtc/logging/rtc_event_log/rtc_event_log.h"
-#include "webrtc/test/encoder_settings.h"
-#include "webrtc/test/fake_audio_device.h"
-#include "webrtc/test/fake_decoder.h"
-#include "webrtc/test/fake_encoder.h"
-#include "webrtc/test/fake_videorenderer.h"
-#include "webrtc/test/frame_generator_capturer.h"
-#include "webrtc/test/rtp_rtcp_observer.h"
-#include "webrtc/test/single_threaded_task_queue.h"
-
-namespace webrtc {
-
-class VoEBase;
-
-namespace test {
-
-class BaseTest;
-
-class CallTest : public ::testing::Test {
- public:
-  CallTest();
-  virtual ~CallTest();
-
-  static const size_t kNumSsrcs = 3;
-  static const int kDefaultWidth = 320;
-  static const int kDefaultHeight = 180;
-  static const int kDefaultFramerate = 30;
-  static const int kDefaultTimeoutMs;
-  static const int kLongTimeoutMs;
-  static const uint8_t kVideoSendPayloadType;
-  static const uint8_t kSendRtxPayloadType;
-  static const uint8_t kFakeVideoSendPayloadType;
-  static const uint8_t kRedPayloadType;
-  static const uint8_t kRtxRedPayloadType;
-  static const uint8_t kUlpfecPayloadType;
-  static const uint8_t kFlexfecPayloadType;
-  static const uint8_t kAudioSendPayloadType;
-  static const uint8_t kPayloadTypeH264;
-  static const uint8_t kPayloadTypeVP8;
-  static const uint8_t kPayloadTypeVP9;
-  static const uint32_t kSendRtxSsrcs[kNumSsrcs];
-  static const uint32_t kVideoSendSsrcs[kNumSsrcs];
-  static const uint32_t kAudioSendSsrc;
-  static const uint32_t kFlexfecSendSsrc;
-  static const uint32_t kReceiverLocalVideoSsrc;
-  static const uint32_t kReceiverLocalAudioSsrc;
-  static const int kNackRtpHistoryMs;
-  static const uint8_t kDefaultKeepalivePayloadType;
-  static const std::map<uint8_t, MediaType> payload_type_map_;
-
- protected:
-  // RunBaseTest overwrites the audio_state and the voice_engine of the send and
-  // receive Call configs to simplify test code and avoid having old VoiceEngine
-  // APIs in the tests.
-  void RunBaseTest(BaseTest* test);
-
-  void CreateCalls(const Call::Config& sender_config,
-                   const Call::Config& receiver_config);
-  void CreateSenderCall(const Call::Config& config);
-  void CreateReceiverCall(const Call::Config& config);
-  void DestroyCalls();
-
-  void CreateSendConfig(size_t num_video_streams,
-                        size_t num_audio_streams,
-                        size_t num_flexfec_streams,
-                        Transport* send_transport);
-
-  void CreateMatchingReceiveConfigs(Transport* rtcp_send_transport);
-
-  void CreateFrameGeneratorCapturerWithDrift(Clock* drift_clock,
-                                             float speed,
-                                             int framerate,
-                                             int width,
-                                             int height);
-  void CreateFrameGeneratorCapturer(int framerate, int width, int height);
-  void CreateFakeAudioDevices(
-      std::unique_ptr<FakeAudioDevice::Capturer> capturer,
-      std::unique_ptr<FakeAudioDevice::Renderer> renderer);
-
-  void CreateVideoStreams();
-  void CreateAudioStreams();
-  void CreateFlexfecStreams();
-
-  void AssociateFlexfecStreamsWithVideoStreams();
-  void DissociateFlexfecStreamsFromVideoStreams();
-
-  void Start();
-  void Stop();
-  void DestroyStreams();
-  void SetFakeVideoCaptureRotation(VideoRotation rotation);
-
-  Clock* const clock_;
-
-  std::unique_ptr<webrtc::RtcEventLog> event_log_;
-  std::unique_ptr<Call> sender_call_;
-  RtpTransportControllerSend* sender_call_transport_controller_;
-  std::unique_ptr<PacketTransport> send_transport_;
-  VideoSendStream::Config video_send_config_;
-  VideoEncoderConfig video_encoder_config_;
-  VideoSendStream* video_send_stream_;
-  AudioSendStream::Config audio_send_config_;
-  AudioSendStream* audio_send_stream_;
-
-  std::unique_ptr<Call> receiver_call_;
-  std::unique_ptr<PacketTransport> receive_transport_;
-  std::vector<VideoReceiveStream::Config> video_receive_configs_;
-  std::vector<VideoReceiveStream*> video_receive_streams_;
-  std::vector<AudioReceiveStream::Config> audio_receive_configs_;
-  std::vector<AudioReceiveStream*> audio_receive_streams_;
-  std::vector<FlexfecReceiveStream::Config> flexfec_receive_configs_;
-  std::vector<FlexfecReceiveStream*> flexfec_receive_streams_;
-
-  std::unique_ptr<test::FrameGeneratorCapturer> frame_generator_capturer_;
-  test::FakeEncoder fake_encoder_;
-  std::vector<std::unique_ptr<VideoDecoder>> allocated_decoders_;
-  size_t num_video_streams_;
-  size_t num_audio_streams_;
-  size_t num_flexfec_streams_;
-  rtc::scoped_refptr<AudioDecoderFactory> decoder_factory_;
-  rtc::scoped_refptr<AudioEncoderFactory> encoder_factory_;
-  test::FakeVideoRenderer fake_renderer_;
-
-  SingleThreadedTaskQueueForTesting task_queue_;
-
- private:
-  // TODO(holmer): Remove once VoiceEngine is fully refactored to the new API.
-  // These methods are used to set up legacy voice engines and channels which is
-  // necessary while voice engine is being refactored to the new stream API.
-  struct VoiceEngineState {
-    VoiceEngineState()
-        : voice_engine(nullptr),
-          base(nullptr),
-          channel_id(-1) {}
-
-    VoiceEngine* voice_engine;
-    VoEBase* base;
-    int channel_id;
-  };
-
-  void CreateVoiceEngines();
-  void DestroyVoiceEngines();
-
-  VoiceEngineState voe_send_;
-  VoiceEngineState voe_recv_;
-  rtc::scoped_refptr<AudioProcessing> apm_send_;
-  rtc::scoped_refptr<AudioProcessing> apm_recv_;
-
-  // The audio devices must outlive the voice engines.
-  std::unique_ptr<test::FakeAudioDevice> fake_send_audio_device_;
-  std::unique_ptr<test::FakeAudioDevice> fake_recv_audio_device_;
-};
-
-class BaseTest : public RtpRtcpObserver {
- public:
-  BaseTest();
-  explicit BaseTest(unsigned int timeout_ms);
-  virtual ~BaseTest();
-
-  virtual void PerformTest() = 0;
-  virtual bool ShouldCreateReceivers() const = 0;
-
-  virtual size_t GetNumVideoStreams() const;
-  virtual size_t GetNumAudioStreams() const;
-  virtual size_t GetNumFlexfecStreams() const;
-
-  virtual std::unique_ptr<FakeAudioDevice::Capturer> CreateCapturer();
-  virtual std::unique_ptr<FakeAudioDevice::Renderer> CreateRenderer();
-  virtual void OnFakeAudioDevicesCreated(FakeAudioDevice* send_audio_device,
-                                         FakeAudioDevice* recv_audio_device);
-
-  virtual Call::Config GetSenderCallConfig();
-  virtual Call::Config GetReceiverCallConfig();
-  virtual void OnRtpTransportControllerSendCreated(
-      RtpTransportControllerSend* controller);
-  virtual void OnCallsCreated(Call* sender_call, Call* receiver_call);
-
-  virtual test::PacketTransport* CreateSendTransport(
-      SingleThreadedTaskQueueForTesting* task_queue,
-      Call* sender_call);
-  virtual test::PacketTransport* CreateReceiveTransport(
-      SingleThreadedTaskQueueForTesting* task_queue);
-
-  virtual void ModifyVideoConfigs(
-      VideoSendStream::Config* send_config,
-      std::vector<VideoReceiveStream::Config>* receive_configs,
-      VideoEncoderConfig* encoder_config);
-  virtual void ModifyVideoCaptureStartResolution(int* width,
-                                                 int* heigt,
-                                                 int* frame_rate);
-  virtual void OnVideoStreamsCreated(
-      VideoSendStream* send_stream,
-      const std::vector<VideoReceiveStream*>& receive_streams);
-
-  virtual void ModifyAudioConfigs(
-      AudioSendStream::Config* send_config,
-      std::vector<AudioReceiveStream::Config>* receive_configs);
-  virtual void OnAudioStreamsCreated(
-      AudioSendStream* send_stream,
-      const std::vector<AudioReceiveStream*>& receive_streams);
-
-  virtual void ModifyFlexfecConfigs(
-      std::vector<FlexfecReceiveStream::Config>* receive_configs);
-  virtual void OnFlexfecStreamsCreated(
-      const std::vector<FlexfecReceiveStream*>& receive_streams);
-
-  virtual void OnFrameGeneratorCapturerCreated(
-      FrameGeneratorCapturer* frame_generator_capturer);
-
-  virtual void OnStreamsStopped();
-
-  std::unique_ptr<webrtc::RtcEventLog> event_log_;
-};
-
-class SendTest : public BaseTest {
- public:
-  explicit SendTest(unsigned int timeout_ms);
-
-  bool ShouldCreateReceivers() const override;
-};
-
-class EndToEndTest : public BaseTest {
- public:
-  EndToEndTest();
-  explicit EndToEndTest(unsigned int timeout_ms);
-
-  bool ShouldCreateReceivers() const override;
-};
-
-}  // namespace test
-}  // namespace webrtc
-
-#endif  // WEBRTC_TEST_CALL_TEST_H_
diff --git a/test/configurable_frame_size_encoder.cc b/test/configurable_frame_size_encoder.cc
deleted file mode 100644
index c81833f..0000000
--- a/test/configurable_frame_size_encoder.cc
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- *  Copyright (c) 2013 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/test/configurable_frame_size_encoder.h"
-
-#include <string.h>
-
-#include "webrtc/common_video/include/video_frame.h"
-#include "webrtc/modules/video_coding/include/video_codec_interface.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-namespace test {
-
-ConfigurableFrameSizeEncoder::ConfigurableFrameSizeEncoder(
-    size_t max_frame_size)
-    : callback_(NULL),
-      max_frame_size_(max_frame_size),
-      current_frame_size_(max_frame_size),
-      buffer_(new uint8_t[max_frame_size]) {
-  memset(buffer_.get(), 0, max_frame_size);
-}
-
-ConfigurableFrameSizeEncoder::~ConfigurableFrameSizeEncoder() {}
-
-int32_t ConfigurableFrameSizeEncoder::InitEncode(
-    const VideoCodec* codec_settings,
-    int32_t number_of_cores,
-    size_t max_payload_size) {
-  return WEBRTC_VIDEO_CODEC_OK;
-}
-
-int32_t ConfigurableFrameSizeEncoder::Encode(
-    const VideoFrame& inputImage,
-    const CodecSpecificInfo* codecSpecificInfo,
-    const std::vector<FrameType>* frame_types) {
-  EncodedImage encodedImage(
-      buffer_.get(), current_frame_size_, max_frame_size_);
-  encodedImage._completeFrame = true;
-  encodedImage._encodedHeight = inputImage.height();
-  encodedImage._encodedWidth = inputImage.width();
-  encodedImage._frameType = kVideoFrameKey;
-  encodedImage._timeStamp = inputImage.timestamp();
-  encodedImage.capture_time_ms_ = inputImage.render_time_ms();
-  RTPFragmentationHeader* fragmentation = NULL;
-  CodecSpecificInfo specific;
-  memset(&specific, 0, sizeof(specific));
-  callback_->OnEncodedImage(encodedImage, &specific, fragmentation);
-
-  return WEBRTC_VIDEO_CODEC_OK;
-}
-
-int32_t ConfigurableFrameSizeEncoder::RegisterEncodeCompleteCallback(
-    EncodedImageCallback* callback) {
-  callback_ = callback;
-  return WEBRTC_VIDEO_CODEC_OK;
-}
-
-int32_t ConfigurableFrameSizeEncoder::Release() {
-  return WEBRTC_VIDEO_CODEC_OK;
-}
-
-int32_t ConfigurableFrameSizeEncoder::SetChannelParameters(uint32_t packet_loss,
-                                                           int64_t rtt) {
-  return WEBRTC_VIDEO_CODEC_OK;
-}
-
-int32_t ConfigurableFrameSizeEncoder::SetRateAllocation(
-    const BitrateAllocation& allocation,
-    uint32_t framerate) {
-  return WEBRTC_VIDEO_CODEC_OK;
-}
-
-int32_t ConfigurableFrameSizeEncoder::SetPeriodicKeyFrames(bool enable) {
-  return WEBRTC_VIDEO_CODEC_OK;
-}
-
-int32_t ConfigurableFrameSizeEncoder::SetFrameSize(size_t size) {
-  RTC_DCHECK_LE(size, max_frame_size_);
-  current_frame_size_ = size;
-  return WEBRTC_VIDEO_CODEC_OK;
-}
-
-}  // namespace test
-}  // namespace webrtc
diff --git a/test/configurable_frame_size_encoder.h b/test/configurable_frame_size_encoder.h
deleted file mode 100644
index 886c546..0000000
--- a/test/configurable_frame_size_encoder.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- *  Copyright (c) 2013 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_TEST_CONFIGURABLE_FRAME_SIZE_ENCODER_H_
-#define WEBRTC_TEST_CONFIGURABLE_FRAME_SIZE_ENCODER_H_
-
-#include <memory>
-#include <vector>
-
-#include "webrtc/api/video_codecs/video_encoder.h"
-
-namespace webrtc {
-namespace test {
-
-class ConfigurableFrameSizeEncoder : public VideoEncoder {
- public:
-  explicit ConfigurableFrameSizeEncoder(size_t max_frame_size);
-  virtual ~ConfigurableFrameSizeEncoder();
-
-  int32_t InitEncode(const VideoCodec* codec_settings,
-                     int32_t number_of_cores,
-                     size_t max_payload_size) override;
-
-  int32_t Encode(const VideoFrame& input_image,
-                 const CodecSpecificInfo* codec_specific_info,
-                 const std::vector<FrameType>* frame_types) override;
-
-  int32_t RegisterEncodeCompleteCallback(
-      EncodedImageCallback* callback) override;
-
-  int32_t Release() override;
-
-  int32_t SetChannelParameters(uint32_t packet_loss, int64_t rtt) override;
-
-  int32_t SetRateAllocation(const BitrateAllocation& allocation,
-                            uint32_t framerate) override;
-
-  int32_t SetPeriodicKeyFrames(bool enable) override;
-
-  int32_t SetFrameSize(size_t size);
-
- private:
-  EncodedImageCallback* callback_;
-  const size_t max_frame_size_;
-  size_t current_frame_size_;
-  std::unique_ptr<uint8_t[]> buffer_;
-};
-
-}  // namespace test
-}  // namespace webrtc
-
-#endif  // WEBRTC_TEST_CONFIGURABLE_FRAME_SIZE_ENCODER_H_
diff --git a/test/constants.cc b/test/constants.cc
deleted file mode 100644
index 3faa83a..0000000
--- a/test/constants.cc
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- *  Copyright (c) 2015 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/test/constants.h"
-
-namespace webrtc {
-namespace test {
-
-const int kTOffsetExtensionId = 6;
-const int kAbsSendTimeExtensionId = 7;
-const int kTransportSequenceNumberExtensionId = 8;
-const int kVideoRotationExtensionId = 9;
-const int kVideoContentTypeExtensionId = 10;
-const int kVideoTimingExtensionId = 11;
-
-}  // namespace test
-}  // namespace webrtc
diff --git a/test/constants.h b/test/constants.h
deleted file mode 100644
index e41e0da..0000000
--- a/test/constants.h
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- *  Copyright (c) 2015 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.
- */
-
-namespace webrtc {
-namespace test {
-
-extern const int kTOffsetExtensionId;
-extern const int kAbsSendTimeExtensionId;
-extern const int kTransportSequenceNumberExtensionId;
-extern const int kVideoRotationExtensionId;
-extern const int kVideoContentTypeExtensionId;
-extern const int kVideoTimingExtensionId;
-}  // namespace test
-}  // namespace webrtc
diff --git a/test/direct_transport.cc b/test/direct_transport.cc
deleted file mode 100644
index 35f3f92..0000000
--- a/test/direct_transport.cc
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- *  Copyright (c) 2013 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/test/direct_transport.h"
-
-#include "webrtc/call/call.h"
-#include "webrtc/rtc_base/ptr_util.h"
-#include "webrtc/system_wrappers/include/clock.h"
-#include "webrtc/test/single_threaded_task_queue.h"
-
-namespace webrtc {
-namespace test {
-
-DirectTransport::DirectTransport(
-    SingleThreadedTaskQueueForTesting* task_queue,
-    Call* send_call,
-    const std::map<uint8_t, MediaType>& payload_type_map)
-    : DirectTransport(task_queue,
-                      FakeNetworkPipe::Config(),
-                      send_call,
-                      payload_type_map) {
-}
-
-DirectTransport::DirectTransport(
-    SingleThreadedTaskQueueForTesting* task_queue,
-    const FakeNetworkPipe::Config& config,
-    Call* send_call,
-    const std::map<uint8_t, MediaType>& payload_type_map)
-    : DirectTransport(
-          task_queue,
-          config,
-          send_call,
-          std::unique_ptr<Demuxer>(new DemuxerImpl(payload_type_map))) {
-}
-
-DirectTransport::DirectTransport(SingleThreadedTaskQueueForTesting* task_queue,
-                                 const FakeNetworkPipe::Config& config,
-                                 Call* send_call,
-                                 std::unique_ptr<Demuxer> demuxer)
-    : send_call_(send_call),
-      clock_(Clock::GetRealTimeClock()),
-      task_queue_(task_queue),
-      fake_network_(clock_, config, std::move(demuxer)) {
-  RTC_DCHECK(task_queue);
-  if (send_call_) {
-    send_call_->SignalChannelNetworkState(MediaType::AUDIO, kNetworkUp);
-    send_call_->SignalChannelNetworkState(MediaType::VIDEO, kNetworkUp);
-  }
-  SendPackets();
-}
-
-DirectTransport::~DirectTransport() {
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&sequence_checker_);
-  // Constructor updates |next_scheduled_task_|, so it's guaranteed to
-  // be initialized.
-  task_queue_->CancelTask(next_scheduled_task_);
-}
-
-void DirectTransport::SetConfig(const FakeNetworkPipe::Config& config) {
-  fake_network_.SetConfig(config);
-}
-
-void DirectTransport::StopSending() {
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&sequence_checker_);
-  task_queue_->CancelTask(next_scheduled_task_);
-}
-
-void DirectTransport::SetReceiver(PacketReceiver* receiver) {
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&sequence_checker_);
-  fake_network_.SetReceiver(receiver);
-}
-
-bool DirectTransport::SendRtp(const uint8_t* data,
-                              size_t length,
-                              const PacketOptions& options) {
-  if (send_call_) {
-    rtc::SentPacket sent_packet(options.packet_id,
-                                clock_->TimeInMilliseconds());
-    send_call_->OnSentPacket(sent_packet);
-  }
-  fake_network_.SendPacket(data, length);
-  return true;
-}
-
-bool DirectTransport::SendRtcp(const uint8_t* data, size_t length) {
-  fake_network_.SendPacket(data, length);
-  return true;
-}
-
-int DirectTransport::GetAverageDelayMs() {
-  return fake_network_.AverageDelay();
-}
-
-void DirectTransport::SendPackets() {
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&sequence_checker_);
-
-  fake_network_.Process();
-
-  int64_t delay_ms = fake_network_.TimeUntilNextProcess();
-  next_scheduled_task_ = task_queue_->PostDelayedTask([this]() {
-    SendPackets();
-  }, delay_ms);
-}
-}  // namespace test
-}  // namespace webrtc
diff --git a/test/direct_transport.h b/test/direct_transport.h
deleted file mode 100644
index c60157d..0000000
--- a/test/direct_transport.h
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- *  Copyright (c) 2013 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_TEST_DIRECT_TRANSPORT_H_
-#define WEBRTC_TEST_DIRECT_TRANSPORT_H_
-
-#include <assert.h>
-
-#include <memory>
-
-#include "webrtc/api/call/transport.h"
-#include "webrtc/call/call.h"
-#include "webrtc/rtc_base/sequenced_task_checker.h"
-#include "webrtc/rtc_base/thread_annotations.h"
-#include "webrtc/test/fake_network_pipe.h"
-#include "webrtc/test/single_threaded_task_queue.h"
-
-namespace webrtc {
-
-class Clock;
-class PacketReceiver;
-
-namespace test {
-
-// Objects of this class are expected to be allocated and destroyed  on the
-// same task-queue - the one that's passed in via the constructor.
-class DirectTransport : public Transport {
- public:
-  DirectTransport(SingleThreadedTaskQueueForTesting* task_queue,
-                  Call* send_call,
-                  const std::map<uint8_t, MediaType>& payload_type_map);
-
-  DirectTransport(SingleThreadedTaskQueueForTesting* task_queue,
-                  const FakeNetworkPipe::Config& config,
-                  Call* send_call,
-                  const std::map<uint8_t, MediaType>& payload_type_map);
-
-  DirectTransport(SingleThreadedTaskQueueForTesting* task_queue,
-                  const FakeNetworkPipe::Config& config,
-                  Call* send_call,
-                  std::unique_ptr<Demuxer> demuxer);
-
-  ~DirectTransport() override;
-
-  void SetConfig(const FakeNetworkPipe::Config& config);
-
-  RTC_DEPRECATED void StopSending();
-
-  // TODO(holmer): Look into moving this to the constructor.
-  virtual void SetReceiver(PacketReceiver* receiver);
-
-  bool SendRtp(const uint8_t* data,
-               size_t length,
-               const PacketOptions& options) override;
-  bool SendRtcp(const uint8_t* data, size_t length) override;
-
-  int GetAverageDelayMs();
-
- private:
-  void SendPackets();
-
-  Call* const send_call_;
-  Clock* const clock_;
-
-  SingleThreadedTaskQueueForTesting* const task_queue_;
-  SingleThreadedTaskQueueForTesting::TaskId next_scheduled_task_
-      RTC_GUARDED_BY(&sequence_checker_);
-
-  FakeNetworkPipe fake_network_;
-
-  rtc::SequencedTaskChecker sequence_checker_;
-};
-}  // namespace test
-}  // namespace webrtc
-
-#endif  // WEBRTC_TEST_DIRECT_TRANSPORT_H_
diff --git a/test/drifting_clock.cc b/test/drifting_clock.cc
deleted file mode 100644
index c1539fd..0000000
--- a/test/drifting_clock.cc
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- *  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/test/drifting_clock.h"
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-namespace test {
-const float DriftingClock::kDoubleSpeed = 2.0f;
-const float DriftingClock::kNoDrift = 1.0f;
-const float DriftingClock::kHalfSpeed = 0.5f;
-
-DriftingClock::DriftingClock(Clock* clock, float speed)
-    : clock_(clock),
-      drift_(speed - 1.0f),
-      start_time_(clock_->TimeInMicroseconds()) {
-  RTC_CHECK(clock);
-  RTC_CHECK_GT(speed, 0.0f);
-}
-
-float DriftingClock::Drift() const {
-  int64_t now = clock_->TimeInMicroseconds();
-  RTC_DCHECK_GE(now, start_time_);
-  return (now - start_time_) * drift_;
-}
-
-int64_t DriftingClock::TimeInMilliseconds() const {
-  return clock_->TimeInMilliseconds() + Drift() / 1000.;
-}
-
-int64_t DriftingClock::TimeInMicroseconds() const {
-  return clock_->TimeInMicroseconds() + Drift();
-}
-
-NtpTime DriftingClock::CurrentNtpTime() const {
-  // NTP precision is 1/2^32 seconds, i.e. 2^32 ntp fractions = 1 second.
-  const double kNtpFracPerMicroSecond = 4294.967296;  // = 2^32 / 10^6
-
-  NtpTime ntp = clock_->CurrentNtpTime();
-  uint64_t total_fractions = static_cast<uint64_t>(ntp);
-  total_fractions += Drift() * kNtpFracPerMicroSecond;
-  return NtpTime(total_fractions);
-}
-
-int64_t DriftingClock::CurrentNtpInMilliseconds() const {
-  return clock_->CurrentNtpInMilliseconds() + Drift() / 1000.;
-}
-}  // namespace test
-}  // namespace webrtc
diff --git a/test/drifting_clock.h b/test/drifting_clock.h
deleted file mode 100644
index 43708da..0000000
--- a/test/drifting_clock.h
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- *  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_TEST_DRIFTING_CLOCK_H_
-#define WEBRTC_TEST_DRIFTING_CLOCK_H_
-
-#include "webrtc/system_wrappers/include/clock.h"
-
-namespace webrtc {
-namespace test {
-class DriftingClock : public Clock {
- public:
-  // TODO(danilchap): Make this constants constexpr when it would be supported.
-  static const float kDoubleSpeed;  // 2.0f;
-  static const float kNoDrift;      // 1.0f;
-  static const float kHalfSpeed;    // 0.5f;
-
-  DriftingClock(Clock* clock, float speed);
-
-  // TODO(danilchap): Make this functions constexpr when it would be supported.
-  static float PercentsFaster(float percent) { return 1.0f + percent / 100.0f; }
-  static float PercentsSlower(float percent) { return 1.0f - percent / 100.0f; }
-
-  int64_t TimeInMilliseconds() const override;
-  int64_t TimeInMicroseconds() const override;
-  NtpTime CurrentNtpTime() const override;
-  int64_t CurrentNtpInMilliseconds() const override;
-
- private:
-  float Drift() const;
-
-  Clock* const clock_;
-  const float drift_;
-  const int64_t start_time_;
-};
-}  // namespace test
-}  // namespace webrtc
-
-#endif  // WEBRTC_TEST_DRIFTING_CLOCK_H_
diff --git a/test/encoder_settings.cc b/test/encoder_settings.cc
deleted file mode 100644
index 570fff5..0000000
--- a/test/encoder_settings.cc
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- *  Copyright (c) 2014 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/test/encoder_settings.h"
-
-#include <algorithm>
-#include <string>
-
-#include "webrtc/modules/video_coding/codecs/h264/include/h264.h"
-#include "webrtc/modules/video_coding/codecs/vp8/include/vp8.h"
-#include "webrtc/modules/video_coding/codecs/vp9/include/vp9.h"
-#include "webrtc/test/fake_decoder.h"
-
-namespace webrtc {
-namespace test {
-
-const size_t DefaultVideoStreamFactory::kMaxNumberOfStreams;
-const int DefaultVideoStreamFactory::kMaxBitratePerStream[] = {150000, 450000,
-                                                               1500000};
-const int DefaultVideoStreamFactory::kDefaultMinBitratePerStream[] = {
-    30000, 200000, 700000};
-
-// static
-std::vector<VideoStream> CreateVideoStreams(
-    int width,
-    int height,
-    const webrtc::VideoEncoderConfig& encoder_config) {
-  RTC_DCHECK(encoder_config.number_of_streams <=
-             DefaultVideoStreamFactory::kMaxNumberOfStreams);
-
-  std::vector<VideoStream> stream_settings(encoder_config.number_of_streams);
-  int bitrate_left_bps = encoder_config.max_bitrate_bps;
-
-  for (size_t i = 0; i < encoder_config.number_of_streams; ++i) {
-    stream_settings[i].width =
-        (i + 1) * width / encoder_config.number_of_streams;
-    stream_settings[i].height =
-        (i + 1) * height / encoder_config.number_of_streams;
-    stream_settings[i].max_framerate = 30;
-    stream_settings[i].min_bitrate_bps =
-        DefaultVideoStreamFactory::kDefaultMinBitratePerStream[i];
-    stream_settings[i].target_bitrate_bps = stream_settings[i].max_bitrate_bps =
-        std::min(bitrate_left_bps,
-                 DefaultVideoStreamFactory::kMaxBitratePerStream[i]);
-    stream_settings[i].max_qp = 56;
-    bitrate_left_bps -= stream_settings[i].target_bitrate_bps;
-  }
-
-  stream_settings[encoder_config.number_of_streams - 1].max_bitrate_bps +=
-      bitrate_left_bps;
-
-  return stream_settings;
-}
-
-DefaultVideoStreamFactory::DefaultVideoStreamFactory() {}
-
-std::vector<VideoStream> DefaultVideoStreamFactory::CreateEncoderStreams(
-    int width,
-    int height,
-    const webrtc::VideoEncoderConfig& encoder_config) {
-  return CreateVideoStreams(width, height, encoder_config);
-}
-
-void FillEncoderConfiguration(size_t num_streams,
-                              VideoEncoderConfig* configuration) {
-  RTC_DCHECK_LE(num_streams, DefaultVideoStreamFactory::kMaxNumberOfStreams);
-
-  configuration->number_of_streams = num_streams;
-  configuration->video_stream_factory =
-      new rtc::RefCountedObject<DefaultVideoStreamFactory>();
-  configuration->max_bitrate_bps = 0;
-  for (size_t i = 0; i < num_streams; ++i) {
-    configuration->max_bitrate_bps +=
-        DefaultVideoStreamFactory::kMaxBitratePerStream[i];
-  }
-}
-
-VideoReceiveStream::Decoder CreateMatchingDecoder(
-    const VideoSendStream::Config::EncoderSettings& encoder_settings) {
-  VideoReceiveStream::Decoder decoder;
-  decoder.payload_type = encoder_settings.payload_type;
-  decoder.payload_name = encoder_settings.payload_name;
-  if (encoder_settings.payload_name == "H264") {
-    decoder.decoder = H264Decoder::Create();
-  } else if (encoder_settings.payload_name == "VP8") {
-    decoder.decoder = VP8Decoder::Create();
-  } else if (encoder_settings.payload_name == "VP9") {
-    decoder.decoder = VP9Decoder::Create();
-  } else {
-    decoder.decoder = new FakeDecoder();
-  }
-  return decoder;
-}
-}  // namespace test
-}  // namespace webrtc
diff --git a/test/encoder_settings.h b/test/encoder_settings.h
deleted file mode 100644
index 4c4fa4e..0000000
--- a/test/encoder_settings.h
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- *  Copyright (c) 2014 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_TEST_ENCODER_SETTINGS_H_
-#define WEBRTC_TEST_ENCODER_SETTINGS_H_
-
-#include <vector>
-
-#include "webrtc/call/video_receive_stream.h"
-#include "webrtc/call/video_send_stream.h"
-
-namespace webrtc {
-namespace test {
-
-class DefaultVideoStreamFactory
-    : public VideoEncoderConfig::VideoStreamFactoryInterface {
- public:
-  DefaultVideoStreamFactory();
-
-  static const size_t kMaxNumberOfStreams = 3;
-  // Defined as {150000, 450000, 1500000};
-  static const int kMaxBitratePerStream[];
-  // Defined as {50000, 200000, 700000};
-  static const int kDefaultMinBitratePerStream[];
-
- private:
-  std::vector<VideoStream> CreateEncoderStreams(
-      int width,
-      int height,
-      const VideoEncoderConfig& encoder_config) override;
-};
-
-// Creates |encoder_config.number_of_streams| VideoStreams where index
-// |encoder_config.number_of_streams -1| have width = |width|, height =
-// |height|. The total max bitrate of all VideoStreams is
-// |encoder_config.max_bitrate_bps|.
-std::vector<VideoStream> CreateVideoStreams(
-    int width,
-    int height,
-    const webrtc::VideoEncoderConfig& encoder_config);
-
-void FillEncoderConfiguration(size_t num_streams,
-                              VideoEncoderConfig* configuration);
-
-VideoReceiveStream::Decoder CreateMatchingDecoder(
-    const VideoSendStream::Config::EncoderSettings& encoder_settings);
-}  // namespace test
-}  // namespace webrtc
-
-#endif  // WEBRTC_TEST_ENCODER_SETTINGS_H_
diff --git a/test/fake_audio_device.cc b/test/fake_audio_device.cc
deleted file mode 100644
index 97299e1..0000000
--- a/test/fake_audio_device.cc
+++ /dev/null
@@ -1,380 +0,0 @@
-/*
- *  Copyright (c) 2013 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/test/fake_audio_device.h"
-
-#include <algorithm>
-#include <utility>
-
-#include "webrtc/common_audio/wav_file.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/random.h"
-#include "webrtc/system_wrappers/include/event_wrapper.h"
-
-namespace webrtc {
-
-namespace {
-
-constexpr int kFrameLengthMs = 10;
-constexpr int kFramesPerSecond = 1000 / kFrameLengthMs;
-
-// Assuming 10ms audio packets..
-class PulsedNoiseCapturer final : public test::FakeAudioDevice::Capturer {
- public:
-  PulsedNoiseCapturer(int16_t max_amplitude, int sampling_frequency_in_hz)
-      : sampling_frequency_in_hz_(sampling_frequency_in_hz),
-        fill_with_zero_(false),
-        random_generator_(1),
-        max_amplitude_(max_amplitude) {
-    RTC_DCHECK_GT(max_amplitude, 0);
-  }
-
-  int SamplingFrequency() const override {
-    return sampling_frequency_in_hz_;
-  }
-
-  bool Capture(rtc::BufferT<int16_t>* buffer) override {
-    fill_with_zero_ = !fill_with_zero_;
-    buffer->SetData(
-        test::FakeAudioDevice::SamplesPerFrame(sampling_frequency_in_hz_),
-        [&](rtc::ArrayView<int16_t> data) {
-      if (fill_with_zero_) {
-        std::fill(data.begin(), data.end(), 0);
-      } else {
-        std::generate(data.begin(), data.end(), [&]() {
-          return random_generator_.Rand(-max_amplitude_, max_amplitude_);
-        });
-      }
-      return data.size();
-    });
-    return true;
-  }
-
- private:
-  int sampling_frequency_in_hz_;
-  bool fill_with_zero_;
-  Random random_generator_;
-  const int16_t max_amplitude_;
-};
-
-class WavFileReader final : public test::FakeAudioDevice::Capturer {
- public:
-  WavFileReader(std::string filename, int sampling_frequency_in_hz)
-      : sampling_frequency_in_hz_(sampling_frequency_in_hz),
-        wav_reader_(filename) {
-    RTC_CHECK_EQ(wav_reader_.sample_rate(), sampling_frequency_in_hz);
-    RTC_CHECK_EQ(wav_reader_.num_channels(), 1);
-  }
-
-  int SamplingFrequency() const override {
-    return sampling_frequency_in_hz_;
-  }
-
-  bool Capture(rtc::BufferT<int16_t>* buffer) override {
-    buffer->SetData(
-        test::FakeAudioDevice::SamplesPerFrame(sampling_frequency_in_hz_),
-        [&](rtc::ArrayView<int16_t> data) {
-      return wav_reader_.ReadSamples(data.size(), data.data());
-    });
-    return buffer->size() > 0;
-  }
-
- private:
-  int sampling_frequency_in_hz_;
-  WavReader wav_reader_;
-};
-
-class WavFileWriter final : public test::FakeAudioDevice::Renderer {
- public:
-  WavFileWriter(std::string filename, int sampling_frequency_in_hz)
-      : sampling_frequency_in_hz_(sampling_frequency_in_hz),
-        wav_writer_(filename, sampling_frequency_in_hz, 1) {}
-
-  int SamplingFrequency() const override {
-    return sampling_frequency_in_hz_;
-  }
-
-  bool Render(rtc::ArrayView<const int16_t> data) override {
-    wav_writer_.WriteSamples(data.data(), data.size());
-    return true;
-  }
-
- private:
-  int sampling_frequency_in_hz_;
-  WavWriter wav_writer_;
-};
-
-class BoundedWavFileWriter : public test::FakeAudioDevice::Renderer {
- public:
-  BoundedWavFileWriter(std::string filename, int sampling_frequency_in_hz)
-      : sampling_frequency_in_hz_(sampling_frequency_in_hz),
-        wav_writer_(filename, sampling_frequency_in_hz, 1),
-        silent_audio_(test::FakeAudioDevice::SamplesPerFrame(
-            sampling_frequency_in_hz), 0),
-        started_writing_(false),
-        trailing_zeros_(0) {}
-
-  int SamplingFrequency() const override {
-    return sampling_frequency_in_hz_;
-  }
-
-  bool Render(rtc::ArrayView<const int16_t> data) override {
-    const int16_t kAmplitudeThreshold = 5;
-
-    const int16_t* begin = data.begin();
-    const int16_t* end = data.end();
-    if (!started_writing_) {
-      // Cut off silence at the beginning.
-      while (begin < end) {
-        if (std::abs(*begin) > kAmplitudeThreshold) {
-          started_writing_ = true;
-          break;
-        }
-        ++begin;
-      }
-    }
-    if (started_writing_) {
-      // Cut off silence at the end.
-      while (begin < end) {
-        if (*(end - 1) != 0) {
-          break;
-        }
-        --end;
-      }
-      if (begin < end) {
-        // If it turns out that the silence was not final, need to write all the
-        // skipped zeros and continue writing audio.
-        while (trailing_zeros_ > 0) {
-          const size_t zeros_to_write = std::min(trailing_zeros_,
-                                                 silent_audio_.size());
-          wav_writer_.WriteSamples(silent_audio_.data(), zeros_to_write);
-          trailing_zeros_ -= zeros_to_write;
-        }
-        wav_writer_.WriteSamples(begin, end - begin);
-      }
-      // Save the number of zeros we skipped in case this needs to be restored.
-      trailing_zeros_ += data.end() - end;
-    }
-    return true;
-  }
-
- private:
-  int sampling_frequency_in_hz_;
-  WavWriter wav_writer_;
-  std::vector<int16_t> silent_audio_;
-  bool started_writing_;
-  size_t trailing_zeros_;
-};
-
-
-class DiscardRenderer final : public test::FakeAudioDevice::Renderer {
- public:
-  explicit DiscardRenderer(int sampling_frequency_in_hz)
-      : sampling_frequency_in_hz_(sampling_frequency_in_hz) {}
-
-  int SamplingFrequency() const override {
-    return sampling_frequency_in_hz_;
-  }
-
-  bool Render(rtc::ArrayView<const int16_t> data) override {
-    return true;
-  }
-
- private:
-  int sampling_frequency_in_hz_;
-};
-
-}  // namespace
-namespace test {
-
-size_t FakeAudioDevice::SamplesPerFrame(int sampling_frequency_in_hz) {
-  return rtc::CheckedDivExact(sampling_frequency_in_hz, kFramesPerSecond);
-}
-
-std::unique_ptr<FakeAudioDevice::Capturer>
-    FakeAudioDevice::CreatePulsedNoiseCapturer(
-        int16_t max_amplitude, int sampling_frequency_in_hz) {
-  return std::unique_ptr<FakeAudioDevice::Capturer>(
-      new PulsedNoiseCapturer(max_amplitude, sampling_frequency_in_hz));
-}
-
-std::unique_ptr<FakeAudioDevice::Capturer> FakeAudioDevice::CreateWavFileReader(
-    std::string filename, int sampling_frequency_in_hz) {
-  return std::unique_ptr<FakeAudioDevice::Capturer>(
-      new WavFileReader(filename, sampling_frequency_in_hz));
-}
-
-std::unique_ptr<FakeAudioDevice::Capturer> FakeAudioDevice::CreateWavFileReader(
-    std::string filename) {
-  int sampling_frequency_in_hz = WavReader(filename).sample_rate();
-  return std::unique_ptr<FakeAudioDevice::Capturer>(
-      new WavFileReader(filename, sampling_frequency_in_hz));
-}
-
-std::unique_ptr<FakeAudioDevice::Renderer> FakeAudioDevice::CreateWavFileWriter(
-    std::string filename, int sampling_frequency_in_hz) {
-  return std::unique_ptr<FakeAudioDevice::Renderer>(
-      new WavFileWriter(filename, sampling_frequency_in_hz));
-}
-
-std::unique_ptr<FakeAudioDevice::Renderer>
-    FakeAudioDevice::CreateBoundedWavFileWriter(
-        std::string filename, int sampling_frequency_in_hz) {
-  return std::unique_ptr<FakeAudioDevice::Renderer>(
-      new BoundedWavFileWriter(filename, sampling_frequency_in_hz));
-}
-
-std::unique_ptr<FakeAudioDevice::Renderer>
-    FakeAudioDevice::CreateDiscardRenderer(int sampling_frequency_in_hz) {
-  return std::unique_ptr<FakeAudioDevice::Renderer>(
-      new DiscardRenderer(sampling_frequency_in_hz));
-}
-
-
-FakeAudioDevice::FakeAudioDevice(std::unique_ptr<Capturer> capturer,
-                                 std::unique_ptr<Renderer> renderer,
-                                 float speed)
-    : capturer_(std::move(capturer)),
-      renderer_(std::move(renderer)),
-      speed_(speed),
-      audio_callback_(nullptr),
-      rendering_(false),
-      capturing_(false),
-      done_rendering_(true, true),
-      done_capturing_(true, true),
-      tick_(EventTimerWrapper::Create()),
-      thread_(FakeAudioDevice::Run, this, "FakeAudioDevice") {
-  auto good_sample_rate = [](int sr) {
-    return sr == 8000 || sr == 16000 || sr == 32000
-        || sr == 44100 || sr == 48000;
-  };
-
-  if (renderer_) {
-    const int sample_rate = renderer_->SamplingFrequency();
-    playout_buffer_.resize(SamplesPerFrame(sample_rate), 0);
-    RTC_CHECK(good_sample_rate(sample_rate));
-  }
-  if (capturer_) {
-    RTC_CHECK(good_sample_rate(capturer_->SamplingFrequency()));
-  }
-}
-
-FakeAudioDevice::~FakeAudioDevice() {
-  StopPlayout();
-  StopRecording();
-  thread_.Stop();
-}
-
-int32_t FakeAudioDevice::StartPlayout() {
-  rtc::CritScope cs(&lock_);
-  RTC_CHECK(renderer_);
-  rendering_ = true;
-  done_rendering_.Reset();
-  return 0;
-}
-
-int32_t FakeAudioDevice::StopPlayout() {
-  rtc::CritScope cs(&lock_);
-  rendering_ = false;
-  done_rendering_.Set();
-  return 0;
-}
-
-int32_t FakeAudioDevice::StartRecording() {
-  rtc::CritScope cs(&lock_);
-  RTC_CHECK(capturer_);
-  capturing_ = true;
-  done_capturing_.Reset();
-  return 0;
-}
-
-int32_t FakeAudioDevice::StopRecording() {
-  rtc::CritScope cs(&lock_);
-  capturing_ = false;
-  done_capturing_.Set();
-  return 0;
-}
-
-int32_t FakeAudioDevice::Init() {
-  RTC_CHECK(tick_->StartTimer(true, kFrameLengthMs / speed_));
-  thread_.Start();
-  thread_.SetPriority(rtc::kHighPriority);
-  return 0;
-}
-
-int32_t FakeAudioDevice::RegisterAudioCallback(AudioTransport* callback) {
-  rtc::CritScope cs(&lock_);
-  RTC_DCHECK(callback || audio_callback_);
-  audio_callback_ = callback;
-  return 0;
-}
-
-bool FakeAudioDevice::Playing() const {
-  rtc::CritScope cs(&lock_);
-  return rendering_;
-}
-
-bool FakeAudioDevice::Recording() const {
-  rtc::CritScope cs(&lock_);
-  return capturing_;
-}
-
-bool FakeAudioDevice::WaitForPlayoutEnd(int timeout_ms) {
-  return done_rendering_.Wait(timeout_ms);
-}
-
-bool FakeAudioDevice::WaitForRecordingEnd(int timeout_ms) {
-  return done_capturing_.Wait(timeout_ms);
-}
-
-bool FakeAudioDevice::Run(void* obj) {
-  static_cast<FakeAudioDevice*>(obj)->ProcessAudio();
-  return true;
-}
-
-void FakeAudioDevice::ProcessAudio() {
-  {
-    rtc::CritScope cs(&lock_);
-    if (capturing_) {
-      // Capture 10ms of audio. 2 bytes per sample.
-      const bool keep_capturing = capturer_->Capture(&recording_buffer_);
-      uint32_t new_mic_level;
-      if (recording_buffer_.size() > 0) {
-        audio_callback_->RecordedDataIsAvailable(
-            recording_buffer_.data(), recording_buffer_.size(), 2, 1,
-            capturer_->SamplingFrequency(), 0, 0, 0, false, new_mic_level);
-      }
-      if (!keep_capturing) {
-        capturing_ = false;
-        done_capturing_.Set();
-      }
-    }
-    if (rendering_) {
-      size_t samples_out;
-      int64_t elapsed_time_ms;
-      int64_t ntp_time_ms;
-      const int sampling_frequency = renderer_->SamplingFrequency();
-      audio_callback_->NeedMorePlayData(
-          SamplesPerFrame(sampling_frequency), 2, 1, sampling_frequency,
-          playout_buffer_.data(), samples_out, &elapsed_time_ms, &ntp_time_ms);
-      const bool keep_rendering = renderer_->Render(
-          rtc::ArrayView<const int16_t>(playout_buffer_.data(), samples_out));
-      if (!keep_rendering) {
-        rendering_ = false;
-        done_rendering_.Set();
-      }
-    }
-  }
-  tick_->Wait(WEBRTC_EVENT_INFINITE);
-}
-
-
-}  // namespace test
-}  // namespace webrtc
diff --git a/test/fake_audio_device.h b/test/fake_audio_device.h
deleted file mode 100644
index 939d16a..0000000
--- a/test/fake_audio_device.h
+++ /dev/null
@@ -1,144 +0,0 @@
-/*
- *  Copyright (c) 2013 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_TEST_FAKE_AUDIO_DEVICE_H_
-#define WEBRTC_TEST_FAKE_AUDIO_DEVICE_H_
-
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "webrtc/api/array_view.h"
-#include "webrtc/modules/audio_device/include/fake_audio_device.h"
-#include "webrtc/rtc_base/buffer.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/event.h"
-#include "webrtc/rtc_base/platform_thread.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-class EventTimerWrapper;
-
-namespace test {
-
-// FakeAudioDevice implements an AudioDevice module that can act both as a
-// capturer and a renderer. It will use 10ms audio frames.
-class FakeAudioDevice : public FakeAudioDeviceModule {
- public:
-  // Returns the number of samples that Capturers and Renderers with this
-  // sampling frequency will work with every time Capture or Render is called.
-  static size_t SamplesPerFrame(int sampling_frequency_in_hz);
-
-  class Capturer {
-   public:
-    virtual ~Capturer() {}
-    // Returns the sampling frequency in Hz of the audio data that this
-    // capturer produces.
-    virtual int SamplingFrequency() const = 0;
-    // Replaces the contents of |buffer| with 10ms of captured audio data
-    // (see FakeAudioDevice::SamplesPerFrame). Returns true if the capturer can
-    // keep producing data, or false when the capture finishes.
-    virtual bool Capture(rtc::BufferT<int16_t>* buffer) = 0;
-  };
-
-  class Renderer {
-   public:
-    virtual ~Renderer() {}
-    // Returns the sampling frequency in Hz of the audio data that this
-    // renderer receives.
-    virtual int SamplingFrequency() const = 0;
-    // Renders the passed audio data and returns true if the renderer wants
-    // to keep receiving data, or false otherwise.
-    virtual bool Render(rtc::ArrayView<const int16_t> data) = 0;
-  };
-
-  // Creates a new FakeAudioDevice. When capturing or playing, 10 ms audio
-  // frames will be processed every 10ms / |speed|.
-  // |capturer| is an object that produces audio data. Can be nullptr if this
-  // device is never used for recording.
-  // |renderer| is an object that receives audio data that would have been
-  // played out. Can be nullptr if this device is never used for playing.
-  // Use one of the Create... functions to get these instances.
-  FakeAudioDevice(std::unique_ptr<Capturer> capturer,
-                  std::unique_ptr<Renderer> renderer,
-                  float speed = 1);
-  ~FakeAudioDevice() override;
-
-  // Returns a Capturer instance that generates a signal where every second
-  // frame is zero and every second frame is evenly distributed random noise
-  // with max amplitude |max_amplitude|.
-  static std::unique_ptr<Capturer> CreatePulsedNoiseCapturer(
-      int16_t max_amplitude, int sampling_frequency_in_hz);
-
-  // Returns a Capturer instance that gets its data from a file.
-  static std::unique_ptr<Capturer> CreateWavFileReader(
-      std::string filename, int sampling_frequency_in_hz);
-
-  // Returns a Capturer instance that gets its data from a file.
-  // Automatically detects sample rate.
-  static std::unique_ptr<Capturer> CreateWavFileReader(std::string filename);
-
-  // Returns a Renderer instance that writes its data to a file.
-  static std::unique_ptr<Renderer> CreateWavFileWriter(
-      std::string filename, int sampling_frequency_in_hz);
-
-  // Returns a Renderer instance that writes its data to a WAV file, cutting
-  // off silence at the beginning (not necessarily perfect silence, see
-  // kAmplitudeThreshold) and at the end (only actual 0 samples in this case).
-  static std::unique_ptr<Renderer> CreateBoundedWavFileWriter(
-      std::string filename, int sampling_frequency_in_hz);
-
-  // Returns a Renderer instance that does nothing with the audio data.
-  static std::unique_ptr<Renderer> CreateDiscardRenderer(
-      int sampling_frequency_in_hz);
-
-  int32_t Init() override;
-  int32_t RegisterAudioCallback(AudioTransport* callback) override;
-
-  int32_t StartPlayout() override;
-  int32_t StopPlayout() override;
-  int32_t StartRecording() override;
-  int32_t StopRecording() override;
-
-  bool Playing() const override;
-  bool Recording() const override;
-
-  // Blocks until the Renderer refuses to receive data.
-  // Returns false if |timeout_ms| passes before that happens.
-  bool WaitForPlayoutEnd(int timeout_ms = rtc::Event::kForever);
-  // Blocks until the Recorder stops producing data.
-  // Returns false if |timeout_ms| passes before that happens.
-  bool WaitForRecordingEnd(int timeout_ms = rtc::Event::kForever);
-
- private:
-  static bool Run(void* obj);
-  void ProcessAudio();
-
-  const std::unique_ptr<Capturer> capturer_ RTC_GUARDED_BY(lock_);
-  const std::unique_ptr<Renderer> renderer_ RTC_GUARDED_BY(lock_);
-  const float speed_;
-
-  rtc::CriticalSection lock_;
-  AudioTransport* audio_callback_ RTC_GUARDED_BY(lock_);
-  bool rendering_ RTC_GUARDED_BY(lock_);
-  bool capturing_ RTC_GUARDED_BY(lock_);
-  rtc::Event done_rendering_;
-  rtc::Event done_capturing_;
-
-  std::vector<int16_t> playout_buffer_ RTC_GUARDED_BY(lock_);
-  rtc::BufferT<int16_t> recording_buffer_ RTC_GUARDED_BY(lock_);
-
-  std::unique_ptr<EventTimerWrapper> tick_;
-  rtc::PlatformThread thread_;
-};
-}  // namespace test
-}  // namespace webrtc
-
-#endif  // WEBRTC_TEST_FAKE_AUDIO_DEVICE_H_
diff --git a/test/fake_audio_device_unittest.cc b/test/fake_audio_device_unittest.cc
deleted file mode 100644
index d4f8acc..0000000
--- a/test/fake_audio_device_unittest.cc
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- *  Copyright (c) 2017 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 <algorithm>
-#include <array>
-
-#include "webrtc/common_audio/wav_file.h"
-#include "webrtc/common_audio/wav_header.h"
-#include "webrtc/test/fake_audio_device.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/testsupport/fileutils.h"
-
-namespace webrtc {
-namespace test {
-
-namespace {
-void RunTest(const std::vector<int16_t>& input_samples,
-             const std::vector<int16_t>& expected_samples,
-             size_t samples_per_frame) {
-  const ::testing::TestInfo* const test_info =
-      ::testing::UnitTest::GetInstance()->current_test_info();
-
-  const std::string output_filename = test::OutputPath() +
-      "BoundedWavFileWriterTest_" + test_info->name() + ".wav";
-
-  static const size_t kSamplesPerFrame = 8;
-  static const int kSampleRate = kSamplesPerFrame * 100;
-  EXPECT_EQ(FakeAudioDevice::SamplesPerFrame(kSampleRate), kSamplesPerFrame);
-
-  {
-    std::unique_ptr<FakeAudioDevice::Renderer> writer =
-        FakeAudioDevice::CreateBoundedWavFileWriter(output_filename, 800);
-
-    for (size_t i = 0; i < input_samples.size(); i += kSamplesPerFrame) {
-      EXPECT_TRUE(writer->Render(rtc::ArrayView<const int16_t>(
-          &input_samples[i],
-          std::min(kSamplesPerFrame, input_samples.size() - i))));
-    }
-  }
-
-  {
-    WavReader reader(output_filename);
-    std::vector<int16_t> read_samples(expected_samples.size());
-    EXPECT_EQ(expected_samples.size(),
-              reader.ReadSamples(read_samples.size(), read_samples.data()));
-    EXPECT_EQ(expected_samples, read_samples);
-
-    EXPECT_EQ(0u, reader.ReadSamples(read_samples.size(), read_samples.data()));
-  }
-
-  remove(output_filename.c_str());
-}
-}  // namespace
-
-TEST(BoundedWavFileWriterTest, NoSilence) {
-  static const std::vector<int16_t> kInputSamples = {
-      75, 1234, 243, -1231, -22222, 0, 3, 88,
-      1222, -1213, -13222, -7, -3525, 5787, -25247, 8
-  };
-  static const std::vector<int16_t> kExpectedSamples = kInputSamples;
-  RunTest(kInputSamples, kExpectedSamples, 8);
-}
-
-TEST(BoundedWavFileWriterTest, SomeStartSilence) {
-  static const std::vector<int16_t> kInputSamples = {
-      0, 0, 0, 0, 3, 0, 0, 0,
-      0, 3, -13222, -7, -3525, 5787, -25247, 8
-  };
-  static const std::vector<int16_t> kExpectedSamples(kInputSamples.begin() + 10,
-                                                     kInputSamples.end());
-  RunTest(kInputSamples, kExpectedSamples, 8);
-}
-
-TEST(BoundedWavFileWriterTest, NegativeStartSilence) {
-  static const std::vector<int16_t> kInputSamples = {
-      0, -4, -6, 0, 3, 0, 0, 0,
-      0, 3, -13222, -7, -3525, 5787, -25247, 8
-  };
-  static const std::vector<int16_t> kExpectedSamples(kInputSamples.begin() + 2,
-                                                     kInputSamples.end());
-  RunTest(kInputSamples, kExpectedSamples, 8);
-}
-
-TEST(BoundedWavFileWriterTest, SomeEndSilence) {
-  static const std::vector<int16_t> kInputSamples = {
-      75, 1234, 243, -1231, -22222, 0, 1, 0,
-      0, 0, 0, 0, 0, 0, 0, 0
-  };
-  static const std::vector<int16_t> kExpectedSamples(kInputSamples.begin(),
-                                                     kInputSamples.end() - 9);
-  RunTest(kInputSamples, kExpectedSamples, 8);
-}
-
-TEST(BoundedWavFileWriterTest, DoubleEndSilence) {
-  static const std::vector<int16_t> kInputSamples = {
-      75, 1234, 243, -1231, -22222, 0, 0, 0,
-      0, -1213, -13222, -7, -3525, 5787, 0, 0
-  };
-  static const std::vector<int16_t> kExpectedSamples(kInputSamples.begin(),
-                                                     kInputSamples.end() - 2);
-  RunTest(kInputSamples, kExpectedSamples, 8);
-}
-
-TEST(BoundedWavFileWriterTest, DoubleSilence) {
-  static const std::vector<int16_t> kInputSamples = {
-      0, -1213, -13222, -7, -3525, 5787, 0, 0
-  };
-  static const std::vector<int16_t> kExpectedSamples(kInputSamples.begin() + 1,
-                                                     kInputSamples.end() - 2);
-  RunTest(kInputSamples, kExpectedSamples, 8);
-}
-
-TEST(BoundedWavFileWriterTest, EndSilenceCutoff) {
-  static const std::vector<int16_t> kInputSamples = {
-      75, 1234, 243, -1231, -22222, 0, 1, 0,
-      0, 0, 0
-  };
-  static const std::vector<int16_t> kExpectedSamples(kInputSamples.begin(),
-                                                     kInputSamples.end() - 4);
-  RunTest(kInputSamples, kExpectedSamples, 8);
-}
-
-}  // namespace test
-}  // namespace webrtc
diff --git a/test/fake_decoder.cc b/test/fake_decoder.cc
deleted file mode 100644
index f2823b5..0000000
--- a/test/fake_decoder.cc
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- *  Copyright (c) 2013 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/test/fake_decoder.h"
-
-#include "webrtc/api/video/i420_buffer.h"
-#include "webrtc/rtc_base/timeutils.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-namespace test {
-
-FakeDecoder::FakeDecoder() : callback_(NULL) {}
-
-int32_t FakeDecoder::InitDecode(const VideoCodec* config,
-                                int32_t number_of_cores) {
-  config_ = *config;
-  return WEBRTC_VIDEO_CODEC_OK;
-}
-
-int32_t FakeDecoder::Decode(const EncodedImage& input,
-                            bool missing_frames,
-                            const RTPFragmentationHeader* fragmentation,
-                            const CodecSpecificInfo* codec_specific_info,
-                            int64_t render_time_ms) {
-  VideoFrame frame(I420Buffer::Create(config_.width, config_.height),
-                   webrtc::kVideoRotation_0,
-                   render_time_ms * rtc::kNumMicrosecsPerMillisec);
-  frame.set_timestamp(input._timeStamp);
-  frame.set_ntp_time_ms(input.ntp_time_ms_);
-
-  callback_->Decoded(frame);
-
-  return WEBRTC_VIDEO_CODEC_OK;
-}
-
-int32_t FakeDecoder::RegisterDecodeCompleteCallback(
-    DecodedImageCallback* callback) {
-  callback_ = callback;
-  return WEBRTC_VIDEO_CODEC_OK;
-}
-
-int32_t FakeDecoder::Release() {
-  return WEBRTC_VIDEO_CODEC_OK;
-}
-
-const char* FakeDecoder::kImplementationName = "fake_decoder";
-const char* FakeDecoder::ImplementationName() const {
-  return kImplementationName;
-}
-
-int32_t FakeH264Decoder::Decode(const EncodedImage& input,
-                                bool missing_frames,
-                                const RTPFragmentationHeader* fragmentation,
-                                const CodecSpecificInfo* codec_specific_info,
-                                int64_t render_time_ms) {
-  uint8_t value = 0;
-  for (size_t i = 0; i < input._length; ++i) {
-    uint8_t kStartCode[] = {0, 0, 0, 1};
-    if (i < input._length - sizeof(kStartCode) &&
-        !memcmp(&input._buffer[i], kStartCode, sizeof(kStartCode))) {
-      i += sizeof(kStartCode) + 1;  // Skip start code and NAL header.
-    }
-    if (input._buffer[i] != value) {
-      EXPECT_EQ(value, input._buffer[i])
-          << "Bitstream mismatch between sender and receiver.";
-      return -1;
-    }
-    ++value;
-  }
-  return FakeDecoder::Decode(input,
-                             missing_frames,
-                             fragmentation,
-                             codec_specific_info,
-                             render_time_ms);
-}
-
-}  // namespace test
-}  // namespace webrtc
diff --git a/test/fake_decoder.h b/test/fake_decoder.h
deleted file mode 100644
index b3120a0..0000000
--- a/test/fake_decoder.h
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- *  Copyright (c) 2013 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_TEST_FAKE_DECODER_H_
-#define WEBRTC_TEST_FAKE_DECODER_H_
-
-#include <vector>
-
-#include "webrtc/modules/video_coding/include/video_codec_interface.h"
-#include "webrtc/system_wrappers/include/clock.h"
-
-namespace webrtc {
-namespace test {
-
-class FakeDecoder : public VideoDecoder {
- public:
-  FakeDecoder();
-  virtual ~FakeDecoder() {}
-
-  int32_t InitDecode(const VideoCodec* config,
-                     int32_t number_of_cores) override;
-
-  int32_t Decode(const EncodedImage& input,
-                 bool missing_frames,
-                 const RTPFragmentationHeader* fragmentation,
-                 const CodecSpecificInfo* codec_specific_info,
-                 int64_t render_time_ms) override;
-
-  int32_t RegisterDecodeCompleteCallback(
-      DecodedImageCallback* callback) override;
-
-  int32_t Release() override;
-
-  const char* ImplementationName() const override;
-
-  static const char* kImplementationName;
-
- private:
-  VideoCodec config_;
-  DecodedImageCallback* callback_;
-};
-
-class FakeH264Decoder : public FakeDecoder {
- public:
-  virtual ~FakeH264Decoder() {}
-
-  int32_t Decode(const EncodedImage& input,
-                 bool missing_frames,
-                 const RTPFragmentationHeader* fragmentation,
-                 const CodecSpecificInfo* codec_specific_info,
-                 int64_t render_time_ms) override;
-};
-
-class FakeNullDecoder : public FakeDecoder {
- public:
-  virtual ~FakeNullDecoder() {}
-
-  int32_t Decode(const EncodedImage& input,
-                 bool missing_frames,
-                 const RTPFragmentationHeader* fragmentation,
-                 const CodecSpecificInfo* codec_specific_info,
-                 int64_t render_time_ms) override {
-    return 0;
-  }
-};
-}  // namespace test
-}  // namespace webrtc
-
-#endif  // WEBRTC_TEST_FAKE_DECODER_H_
diff --git a/test/fake_encoder.cc b/test/fake_encoder.cc
deleted file mode 100644
index 7c0870e..0000000
--- a/test/fake_encoder.cc
+++ /dev/null
@@ -1,377 +0,0 @@
-/*
- *  Copyright (c) 2013 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/test/fake_encoder.h"
-
-#include <string.h>
-
-#include <algorithm>
-#include <memory>
-
-#include "webrtc/common_types.h"
-#include "webrtc/modules/video_coding/include/video_codec_interface.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/system_wrappers/include/sleep.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-namespace test {
-
-const int kKeyframeSizeFactor = 10;
-
-FakeEncoder::FakeEncoder(Clock* clock)
-    : clock_(clock),
-      callback_(nullptr),
-      configured_input_framerate_(-1),
-      max_target_bitrate_kbps_(-1),
-      pending_keyframe_(true),
-      debt_bytes_(0) {
-  // Generate some arbitrary not-all-zero data
-  for (size_t i = 0; i < sizeof(encoded_buffer_); ++i) {
-    encoded_buffer_[i] = static_cast<uint8_t>(i);
-  }
-}
-
-void FakeEncoder::SetMaxBitrate(int max_kbps) {
-  RTC_DCHECK_GE(max_kbps, -1);  // max_kbps == -1 disables it.
-  rtc::CritScope cs(&crit_sect_);
-  max_target_bitrate_kbps_ = max_kbps;
-}
-
-int32_t FakeEncoder::InitEncode(const VideoCodec* config,
-                                int32_t number_of_cores,
-                                size_t max_payload_size) {
-  rtc::CritScope cs(&crit_sect_);
-  config_ = *config;
-  target_bitrate_.SetBitrate(0, 0, config_.startBitrate * 1000);
-  configured_input_framerate_ = config_.maxFramerate;
-  pending_keyframe_ = true;
-  return 0;
-}
-
-int32_t FakeEncoder::Encode(const VideoFrame& input_image,
-                            const CodecSpecificInfo* codec_specific_info,
-                            const std::vector<FrameType>* frame_types) {
-  unsigned char max_framerate;
-  unsigned char num_simulcast_streams;
-  SimulcastStream simulcast_streams[kMaxSimulcastStreams];
-  EncodedImageCallback* callback;
-  uint32_t target_bitrate_sum_kbps;
-  int max_target_bitrate_kbps;
-  size_t num_encoded_bytes;
-  int framerate;
-  VideoCodecMode mode;
-  bool keyframe;
-  {
-    rtc::CritScope cs(&crit_sect_);
-    max_framerate = config_.maxFramerate;
-    num_simulcast_streams = config_.numberOfSimulcastStreams;
-    for (int i = 0; i < num_simulcast_streams; ++i) {
-      simulcast_streams[i] = config_.simulcastStream[i];
-    }
-    callback = callback_;
-    target_bitrate_sum_kbps = target_bitrate_.get_sum_kbps();
-    max_target_bitrate_kbps = max_target_bitrate_kbps_;
-    num_encoded_bytes = sizeof(encoded_buffer_);
-    mode = config_.mode;
-    if (configured_input_framerate_ > 0) {
-      framerate = configured_input_framerate_;
-    } else {
-      framerate = max_framerate;
-    }
-    keyframe = pending_keyframe_;
-    pending_keyframe_ = false;
-  }
-
-  for (FrameType frame_type : *frame_types) {
-    if (frame_type == kVideoFrameKey) {
-      keyframe = true;
-      break;
-    }
-  }
-
-  RTC_DCHECK_GT(max_framerate, 0);
-
-  size_t bitrate =
-      std::max(target_bitrate_sum_kbps, simulcast_streams[0].minBitrate);
-  if (max_target_bitrate_kbps > 0)
-    bitrate = std::min(bitrate, static_cast<size_t>(max_target_bitrate_kbps));
-
-  size_t bits_available = bitrate * 1000 / framerate;
-
-  RTC_DCHECK_GT(num_simulcast_streams, 0);
-  for (unsigned char i = 0; i < num_simulcast_streams; ++i) {
-    CodecSpecificInfo specifics;
-    memset(&specifics, 0, sizeof(specifics));
-    specifics.codecType = kVideoCodecGeneric;
-    specifics.codecSpecific.generic.simulcast_idx = i;
-    size_t min_stream_bits = static_cast<size_t>(
-        (simulcast_streams[i].minBitrate * 1000) / framerate);
-    size_t max_stream_bits = static_cast<size_t>(
-        (simulcast_streams[i].maxBitrate * 1000) / framerate);
-    size_t stream_bits = (bits_available > max_stream_bits) ? max_stream_bits :
-        bits_available;
-    size_t stream_bytes = (stream_bits + 7) / 8;
-    if (keyframe) {
-      // The first frame is a key frame and should be larger.
-      // Store the overshoot bytes and distribute them over the coming frames,
-      // so that we on average meet the bitrate target.
-      debt_bytes_ += (kKeyframeSizeFactor - 1) * stream_bytes;
-      stream_bytes *= kKeyframeSizeFactor;
-    } else {
-      if (debt_bytes_ > 0) {
-        // Pay at most half of the frame size for old debts.
-        size_t payment_size = std::min(stream_bytes / 2, debt_bytes_);
-        debt_bytes_ -= payment_size;
-        stream_bytes -= payment_size;
-      }
-    }
-
-    if (stream_bytes > num_encoded_bytes)
-      stream_bytes = num_encoded_bytes;
-
-    // Always encode something on the first frame.
-    if (min_stream_bits > bits_available && i > 0)
-      continue;
-
-    std::unique_ptr<uint8_t[]> encoded_buffer(new uint8_t[num_encoded_bytes]);
-    memcpy(encoded_buffer.get(), encoded_buffer_, num_encoded_bytes);
-    EncodedImage encoded(encoded_buffer.get(), stream_bytes, num_encoded_bytes);
-    encoded._timeStamp = input_image.timestamp();
-    encoded.capture_time_ms_ = input_image.render_time_ms();
-    encoded._frameType = (*frame_types)[i];
-    encoded._encodedWidth = simulcast_streams[i].width;
-    encoded._encodedHeight = simulcast_streams[i].height;
-    encoded.rotation_ = input_image.rotation();
-    encoded.content_type_ = (mode == kScreensharing)
-                                ? VideoContentType::SCREENSHARE
-                                : VideoContentType::UNSPECIFIED;
-    specifics.codec_name = ImplementationName();
-    specifics.codecSpecific.generic.simulcast_idx = i;
-    RTC_DCHECK(callback);
-    if (callback->OnEncodedImage(encoded, &specifics, nullptr).error !=
-        EncodedImageCallback::Result::OK) {
-      return -1;
-    }
-    bits_available -= std::min(encoded._length * 8, bits_available);
-  }
-  return 0;
-}
-
-int32_t FakeEncoder::RegisterEncodeCompleteCallback(
-    EncodedImageCallback* callback) {
-  rtc::CritScope cs(&crit_sect_);
-  callback_ = callback;
-  return 0;
-}
-
-int32_t FakeEncoder::Release() { return 0; }
-
-int32_t FakeEncoder::SetChannelParameters(uint32_t packet_loss, int64_t rtt) {
-  return 0;
-}
-
-int32_t FakeEncoder::SetRateAllocation(const BitrateAllocation& rate_allocation,
-                                       uint32_t framerate) {
-  rtc::CritScope cs(&crit_sect_);
-  target_bitrate_ = rate_allocation;
-  configured_input_framerate_ = framerate;
-  return 0;
-}
-
-const char* FakeEncoder::kImplementationName = "fake_encoder";
-const char* FakeEncoder::ImplementationName() const {
-  return kImplementationName;
-}
-
-int FakeEncoder::GetConfiguredInputFramerate() const {
-  rtc::CritScope cs(&crit_sect_);
-  return configured_input_framerate_;
-}
-
-FakeH264Encoder::FakeH264Encoder(Clock* clock)
-    : FakeEncoder(clock), callback_(nullptr), idr_counter_(0) {
-  FakeEncoder::RegisterEncodeCompleteCallback(this);
-}
-
-int32_t FakeH264Encoder::RegisterEncodeCompleteCallback(
-    EncodedImageCallback* callback) {
-  rtc::CritScope cs(&local_crit_sect_);
-  callback_ = callback;
-  return 0;
-}
-
-EncodedImageCallback::Result FakeH264Encoder::OnEncodedImage(
-    const EncodedImage& encoded_image,
-    const CodecSpecificInfo* codec_specific_info,
-    const RTPFragmentationHeader* fragments) {
-  const size_t kSpsSize = 8;
-  const size_t kPpsSize = 11;
-  const int kIdrFrequency = 10;
-  EncodedImageCallback* callback;
-  int current_idr_counter;
-  {
-    rtc::CritScope cs(&local_crit_sect_);
-    callback = callback_;
-    current_idr_counter = idr_counter_;
-    ++idr_counter_;
-  }
-  RTPFragmentationHeader fragmentation;
-  if (current_idr_counter % kIdrFrequency == 0 &&
-      encoded_image._length > kSpsSize + kPpsSize + 1) {
-    const size_t kNumSlices = 3;
-    fragmentation.VerifyAndAllocateFragmentationHeader(kNumSlices);
-    fragmentation.fragmentationOffset[0] = 0;
-    fragmentation.fragmentationLength[0] = kSpsSize;
-    fragmentation.fragmentationOffset[1] = kSpsSize;
-    fragmentation.fragmentationLength[1] = kPpsSize;
-    fragmentation.fragmentationOffset[2] = kSpsSize + kPpsSize;
-    fragmentation.fragmentationLength[2] =
-        encoded_image._length - (kSpsSize + kPpsSize);
-    const size_t kSpsNalHeader = 0x67;
-    const size_t kPpsNalHeader = 0x68;
-    const size_t kIdrNalHeader = 0x65;
-    encoded_image._buffer[fragmentation.fragmentationOffset[0]] = kSpsNalHeader;
-    encoded_image._buffer[fragmentation.fragmentationOffset[1]] = kPpsNalHeader;
-    encoded_image._buffer[fragmentation.fragmentationOffset[2]] = kIdrNalHeader;
-  } else {
-    const size_t kNumSlices = 1;
-    fragmentation.VerifyAndAllocateFragmentationHeader(kNumSlices);
-    fragmentation.fragmentationOffset[0] = 0;
-    fragmentation.fragmentationLength[0] = encoded_image._length;
-    const size_t kNalHeader = 0x41;
-    encoded_image._buffer[fragmentation.fragmentationOffset[0]] = kNalHeader;
-  }
-  uint8_t value = 0;
-  int fragment_counter = 0;
-  for (size_t i = 0; i < encoded_image._length; ++i) {
-    if (fragment_counter == fragmentation.fragmentationVectorSize ||
-        i != fragmentation.fragmentationOffset[fragment_counter]) {
-      encoded_image._buffer[i] = value++;
-    } else {
-      ++fragment_counter;
-    }
-  }
-  CodecSpecificInfo specifics;
-  memset(&specifics, 0, sizeof(specifics));
-  specifics.codecType = kVideoCodecH264;
-  specifics.codecSpecific.H264.packetization_mode =
-      H264PacketizationMode::NonInterleaved;
-  RTC_DCHECK(callback);
-  return callback->OnEncodedImage(encoded_image, &specifics, &fragmentation);
-}
-
-DelayedEncoder::DelayedEncoder(Clock* clock, int delay_ms)
-    : test::FakeEncoder(clock), delay_ms_(delay_ms) {
-  // The encoder could be created on a different thread than
-  // it is being used on.
-  sequence_checker_.Detach();
-}
-
-void DelayedEncoder::SetDelay(int delay_ms) {
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&sequence_checker_);
-  delay_ms_ = delay_ms;
-}
-
-int32_t DelayedEncoder::Encode(const VideoFrame& input_image,
-                               const CodecSpecificInfo* codec_specific_info,
-                               const std::vector<FrameType>* frame_types) {
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&sequence_checker_);
-
-  SleepMs(delay_ms_);
-
-  return FakeEncoder::Encode(input_image, codec_specific_info, frame_types);
-}
-
-MultithreadedFakeH264Encoder::MultithreadedFakeH264Encoder(Clock* clock)
-    : test::FakeH264Encoder(clock),
-      current_queue_(0),
-      queue1_(nullptr),
-      queue2_(nullptr) {
-  // The encoder could be created on a different thread than
-  // it is being used on.
-  sequence_checker_.Detach();
-}
-
-int32_t MultithreadedFakeH264Encoder::InitEncode(const VideoCodec* config,
-                                                 int32_t number_of_cores,
-                                                 size_t max_payload_size) {
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&sequence_checker_);
-
-  queue1_.reset(new rtc::TaskQueue("Queue 1"));
-  queue2_.reset(new rtc::TaskQueue("Queue 2"));
-
-  return FakeH264Encoder::InitEncode(config, number_of_cores, max_payload_size);
-}
-
-class MultithreadedFakeH264Encoder::EncodeTask : public rtc::QueuedTask {
- public:
-  EncodeTask(MultithreadedFakeH264Encoder* encoder,
-             const VideoFrame& input_image,
-             const CodecSpecificInfo* codec_specific_info,
-             const std::vector<FrameType>* frame_types)
-      : encoder_(encoder),
-        input_image_(input_image),
-        codec_specific_info_(),
-        frame_types_(*frame_types) {
-    if (codec_specific_info)
-      codec_specific_info_ = *codec_specific_info;
-  }
-
- private:
-  bool Run() override {
-    encoder_->EncodeCallback(input_image_, &codec_specific_info_,
-                             &frame_types_);
-    return true;
-  }
-
-  MultithreadedFakeH264Encoder* const encoder_;
-  VideoFrame input_image_;
-  CodecSpecificInfo codec_specific_info_;
-  std::vector<FrameType> frame_types_;
-};
-
-int32_t MultithreadedFakeH264Encoder::Encode(
-    const VideoFrame& input_image,
-    const CodecSpecificInfo* codec_specific_info,
-    const std::vector<FrameType>* frame_types) {
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&sequence_checker_);
-
-  std::unique_ptr<rtc::TaskQueue>& queue =
-      (current_queue_++ % 2 == 0) ? queue1_ : queue2_;
-
-  if (!queue) {
-    return WEBRTC_VIDEO_CODEC_UNINITIALIZED;
-  }
-
-  queue->PostTask(std::unique_ptr<rtc::QueuedTask>(
-      new EncodeTask(this, input_image, codec_specific_info, frame_types)));
-
-  return WEBRTC_VIDEO_CODEC_OK;
-}
-
-int32_t MultithreadedFakeH264Encoder::EncodeCallback(
-    const VideoFrame& input_image,
-    const CodecSpecificInfo* codec_specific_info,
-    const std::vector<FrameType>* frame_types) {
-  return FakeH264Encoder::Encode(input_image, codec_specific_info, frame_types);
-}
-
-int32_t MultithreadedFakeH264Encoder::Release() {
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&sequence_checker_);
-
-  queue1_.reset();
-  queue2_.reset();
-
-  return FakeH264Encoder::Release();
-}
-
-}  // namespace test
-}  // namespace webrtc
diff --git a/test/fake_encoder.h b/test/fake_encoder.h
deleted file mode 100644
index c8912a1..0000000
--- a/test/fake_encoder.h
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
- *  Copyright (c) 2013 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_TEST_FAKE_ENCODER_H_
-#define WEBRTC_TEST_FAKE_ENCODER_H_
-
-#include <vector>
-#include <memory>
-
-#include "webrtc/api/video_codecs/video_encoder.h"
-#include "webrtc/common_types.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/sequenced_task_checker.h"
-#include "webrtc/rtc_base/task_queue.h"
-#include "webrtc/system_wrappers/include/clock.h"
-
-namespace webrtc {
-namespace test {
-
-class FakeEncoder : public VideoEncoder {
- public:
-  explicit FakeEncoder(Clock* clock);
-  virtual ~FakeEncoder() = default;
-
-  // Sets max bitrate. Not thread-safe, call before registering the encoder.
-  void SetMaxBitrate(int max_kbps);
-
-  int32_t InitEncode(const VideoCodec* config,
-                     int32_t number_of_cores,
-                     size_t max_payload_size) override;
-  int32_t Encode(const VideoFrame& input_image,
-                 const CodecSpecificInfo* codec_specific_info,
-                 const std::vector<FrameType>* frame_types) override;
-  int32_t RegisterEncodeCompleteCallback(
-      EncodedImageCallback* callback) override;
-  int32_t Release() override;
-  int32_t SetChannelParameters(uint32_t packet_loss, int64_t rtt) override;
-  int32_t SetRateAllocation(const BitrateAllocation& rate_allocation,
-                            uint32_t framerate) override;
-  const char* ImplementationName() const override;
-  int GetConfiguredInputFramerate() const;
-
-  static const char* kImplementationName;
-
- protected:
-  Clock* const clock_;
-  VideoCodec config_ RTC_GUARDED_BY(crit_sect_);
-  EncodedImageCallback* callback_ RTC_GUARDED_BY(crit_sect_);
-  BitrateAllocation target_bitrate_ RTC_GUARDED_BY(crit_sect_);
-  int configured_input_framerate_ RTC_GUARDED_BY(crit_sect_);
-  int max_target_bitrate_kbps_ RTC_GUARDED_BY(crit_sect_);
-  bool pending_keyframe_ RTC_GUARDED_BY(crit_sect_);
-  rtc::CriticalSection crit_sect_;
-
-  uint8_t encoded_buffer_[100000];
-
-  // Current byte debt to be payed over a number of frames.
-  // The debt is acquired by keyframes overshooting the bitrate target.
-  size_t debt_bytes_;
-};
-
-class FakeH264Encoder : public FakeEncoder, public EncodedImageCallback {
- public:
-  explicit FakeH264Encoder(Clock* clock);
-  virtual ~FakeH264Encoder() = default;
-
-  int32_t RegisterEncodeCompleteCallback(
-      EncodedImageCallback* callback) override;
-
-  Result OnEncodedImage(const EncodedImage& encodedImage,
-                        const CodecSpecificInfo* codecSpecificInfo,
-                        const RTPFragmentationHeader* fragments) override;
-
- private:
-  EncodedImageCallback* callback_ RTC_GUARDED_BY(local_crit_sect_);
-  int idr_counter_ RTC_GUARDED_BY(local_crit_sect_);
-  rtc::CriticalSection local_crit_sect_;
-};
-
-class DelayedEncoder : public test::FakeEncoder {
- public:
-  DelayedEncoder(Clock* clock, int delay_ms);
-  virtual ~DelayedEncoder() = default;
-
-  void SetDelay(int delay_ms);
-  int32_t Encode(const VideoFrame& input_image,
-                 const CodecSpecificInfo* codec_specific_info,
-                 const std::vector<FrameType>* frame_types) override;
-
- private:
-  int delay_ms_ RTC_ACCESS_ON(sequence_checker_);
-  rtc::SequencedTaskChecker sequence_checker_;
-};
-
-// This class implements a multi-threaded fake encoder by posting
-// FakeH264Encoder::Encode(.) tasks to |queue1_| and |queue2_|, in an
-// alternating fashion. The class itself does not need to be thread safe,
-// as it is called from the task queue in VideoStreamEncoder.
-class MultithreadedFakeH264Encoder : public test::FakeH264Encoder {
- public:
-  explicit MultithreadedFakeH264Encoder(Clock* clock);
-  virtual ~MultithreadedFakeH264Encoder() = default;
-
-  int32_t InitEncode(const VideoCodec* config,
-                     int32_t number_of_cores,
-                     size_t max_payload_size) override;
-
-  int32_t Encode(const VideoFrame& input_image,
-                 const CodecSpecificInfo* codec_specific_info,
-                 const std::vector<FrameType>* frame_types) override;
-
-  int32_t EncodeCallback(const VideoFrame& input_image,
-                         const CodecSpecificInfo* codec_specific_info,
-                         const std::vector<FrameType>* frame_types);
-
-  int32_t Release() override;
-
- protected:
-  class EncodeTask;
-
-  int current_queue_ RTC_ACCESS_ON(sequence_checker_);
-  std::unique_ptr<rtc::TaskQueue> queue1_ RTC_ACCESS_ON(sequence_checker_);
-  std::unique_ptr<rtc::TaskQueue> queue2_ RTC_ACCESS_ON(sequence_checker_);
-  rtc::SequencedTaskChecker sequence_checker_;
-};
-
-}  // namespace test
-}  // namespace webrtc
-
-#endif  // WEBRTC_TEST_FAKE_ENCODER_H_
diff --git a/test/fake_network_pipe.cc b/test/fake_network_pipe.cc
deleted file mode 100644
index 61ac918..0000000
--- a/test/fake_network_pipe.cc
+++ /dev/null
@@ -1,255 +0,0 @@
-/*
- *  Copyright (c) 2012 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/test/fake_network_pipe.h"
-
-#include <assert.h>
-#include <math.h>
-#include <string.h>
-
-#include <algorithm>
-#include <cmath>
-
-#include "webrtc/call/call.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_header_parser.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/system_wrappers/include/clock.h"
-
-namespace webrtc {
-
-namespace {
-constexpr int64_t kDefaultProcessIntervalMs = 5;
-}
-
-DemuxerImpl::DemuxerImpl(const std::map<uint8_t, MediaType>& payload_type_map)
-    : packet_receiver_(nullptr), payload_type_map_(payload_type_map) {}
-
-void DemuxerImpl::SetReceiver(PacketReceiver* receiver) {
-  packet_receiver_ = receiver;
-}
-
-void DemuxerImpl::DeliverPacket(const NetworkPacket* packet,
-                                const PacketTime& packet_time) {
-  // No packet receiver means that this demuxer will terminate the flow of
-  // packets.
-  if (!packet_receiver_)
-    return;
-  const uint8_t* const packet_data = packet->data();
-  const size_t packet_length = packet->data_length();
-  MediaType media_type = MediaType::ANY;
-  if (!RtpHeaderParser::IsRtcp(packet_data, packet_length)) {
-    RTC_CHECK_GE(packet_length, 2);
-    const uint8_t payload_type = packet_data[1] & 0x7f;
-    std::map<uint8_t, MediaType>::const_iterator it =
-        payload_type_map_.find(payload_type);
-    RTC_CHECK(it != payload_type_map_.end())
-        << "payload type " << static_cast<int>(payload_type) << " unknown.";
-    media_type = it->second;
-  }
-  packet_receiver_->DeliverPacket(media_type, packet_data, packet_length,
-                                  packet_time);
-}
-
-FakeNetworkPipe::FakeNetworkPipe(Clock* clock,
-                                 const FakeNetworkPipe::Config& config,
-                                 std::unique_ptr<Demuxer> demuxer)
-    : FakeNetworkPipe(clock, config, std::move(demuxer), 1) {}
-
-FakeNetworkPipe::FakeNetworkPipe(Clock* clock,
-                                 const FakeNetworkPipe::Config& config,
-                                 std::unique_ptr<Demuxer> demuxer,
-                                 uint64_t seed)
-    : clock_(clock),
-      demuxer_(std::move(demuxer)),
-      random_(seed),
-      config_(),
-      dropped_packets_(0),
-      sent_packets_(0),
-      total_packet_delay_(0),
-      bursting_(false),
-      next_process_time_(clock_->TimeInMilliseconds()),
-      last_log_time_(clock_->TimeInMilliseconds()) {
-  SetConfig(config);
-}
-
-FakeNetworkPipe::~FakeNetworkPipe() {
-  while (!capacity_link_.empty()) {
-    delete capacity_link_.front();
-    capacity_link_.pop();
-  }
-  while (!delay_link_.empty()) {
-    delete *delay_link_.begin();
-    delay_link_.erase(delay_link_.begin());
-  }
-}
-
-void FakeNetworkPipe::SetReceiver(PacketReceiver* receiver) {
-  RTC_CHECK(demuxer_);
-  demuxer_->SetReceiver(receiver);
-}
-
-void FakeNetworkPipe::SetConfig(const FakeNetworkPipe::Config& config) {
-  rtc::CritScope crit(&lock_);
-  config_ = config;  // Shallow copy of the struct.
-  double prob_loss = config.loss_percent / 100.0;
-  if (config_.avg_burst_loss_length == -1) {
-    // Uniform loss
-    prob_loss_bursting_ = prob_loss;
-    prob_start_bursting_ = prob_loss;
-  } else {
-    // Lose packets according to a gilbert-elliot model.
-    int avg_burst_loss_length = config.avg_burst_loss_length;
-    int min_avg_burst_loss_length = std::ceil(prob_loss / (1 - prob_loss));
-
-    RTC_CHECK_GT(avg_burst_loss_length, min_avg_burst_loss_length)
-        << "For a total packet loss of " << config.loss_percent << "%% then"
-        << " avg_burst_loss_length must be " << min_avg_burst_loss_length + 1
-        << " or higher.";
-
-    prob_loss_bursting_ = (1.0 - 1.0 / avg_burst_loss_length);
-    prob_start_bursting_ = prob_loss / (1 - prob_loss) / avg_burst_loss_length;
-  }
-}
-
-void FakeNetworkPipe::SendPacket(const uint8_t* data, size_t data_length) {
-  RTC_CHECK(demuxer_);
-  rtc::CritScope crit(&lock_);
-  if (config_.queue_length_packets > 0 &&
-      capacity_link_.size() >= config_.queue_length_packets) {
-    // Too many packet on the link, drop this one.
-    ++dropped_packets_;
-    return;
-  }
-
-  int64_t time_now = clock_->TimeInMilliseconds();
-
-  // Delay introduced by the link capacity.
-  int64_t capacity_delay_ms = 0;
-  if (config_.link_capacity_kbps > 0) {
-    const int bytes_per_millisecond = config_.link_capacity_kbps / 8;
-    // To round to the closest millisecond we add half a milliseconds worth of
-    // bytes to the delay calculation.
-    capacity_delay_ms = (data_length + capacity_delay_error_bytes_ +
-                         bytes_per_millisecond / 2) /
-                        bytes_per_millisecond;
-    capacity_delay_error_bytes_ +=
-        data_length - capacity_delay_ms * bytes_per_millisecond;
-  }
-  int64_t network_start_time = time_now;
-
-  // Check if there already are packets on the link and change network start
-  // time forward if there is.
-  if (!capacity_link_.empty() &&
-      network_start_time < capacity_link_.back()->arrival_time())
-    network_start_time = capacity_link_.back()->arrival_time();
-
-  int64_t arrival_time = network_start_time + capacity_delay_ms;
-  NetworkPacket* packet = new NetworkPacket(data, data_length, time_now,
-                                            arrival_time);
-  capacity_link_.push(packet);
-}
-
-float FakeNetworkPipe::PercentageLoss() {
-  rtc::CritScope crit(&lock_);
-  if (sent_packets_ == 0)
-    return 0;
-
-  return static_cast<float>(dropped_packets_) /
-      (sent_packets_ + dropped_packets_);
-}
-
-int FakeNetworkPipe::AverageDelay() {
-  rtc::CritScope crit(&lock_);
-  if (sent_packets_ == 0)
-    return 0;
-
-  return static_cast<int>(total_packet_delay_ /
-                          static_cast<int64_t>(sent_packets_));
-}
-
-void FakeNetworkPipe::Process() {
-  int64_t time_now = clock_->TimeInMilliseconds();
-  std::queue<NetworkPacket*> packets_to_deliver;
-  {
-    rtc::CritScope crit(&lock_);
-    if (time_now - last_log_time_ > 5000) {
-      int64_t queueing_delay_ms = 0;
-      if (!capacity_link_.empty()) {
-        queueing_delay_ms = time_now - capacity_link_.front()->send_time();
-      }
-      LOG(LS_INFO) << "Network queue: " << queueing_delay_ms << " ms.";
-      last_log_time_ = time_now;
-    }
-    // Check the capacity link first.
-    while (!capacity_link_.empty() &&
-           time_now >= capacity_link_.front()->arrival_time()) {
-      // Time to get this packet.
-      NetworkPacket* packet = capacity_link_.front();
-      capacity_link_.pop();
-
-      // Drop packets at an average rate of |config_.loss_percent| with
-      // and average loss burst length of |config_.avg_burst_loss_length|.
-      if ((bursting_ && random_.Rand<double>() < prob_loss_bursting_) ||
-          (!bursting_ && random_.Rand<double>() < prob_start_bursting_)) {
-        bursting_ = true;
-        delete packet;
-        continue;
-      } else {
-        bursting_ = false;
-      }
-
-      int arrival_time_jitter = random_.Gaussian(
-          config_.queue_delay_ms, config_.delay_standard_deviation_ms);
-
-      // If reordering is not allowed then adjust arrival_time_jitter
-      // to make sure all packets are sent in order.
-      if (!config_.allow_reordering && !delay_link_.empty() &&
-          packet->arrival_time() + arrival_time_jitter <
-              (*delay_link_.rbegin())->arrival_time()) {
-        arrival_time_jitter =
-            (*delay_link_.rbegin())->arrival_time() - packet->arrival_time();
-      }
-      packet->IncrementArrivalTime(arrival_time_jitter);
-      delay_link_.insert(packet);
-    }
-
-    // Check the extra delay queue.
-    while (!delay_link_.empty() &&
-           time_now >= (*delay_link_.begin())->arrival_time()) {
-      // Deliver this packet.
-      NetworkPacket* packet = *delay_link_.begin();
-      packets_to_deliver.push(packet);
-      delay_link_.erase(delay_link_.begin());
-      // |time_now| might be later than when the packet should have arrived, due
-      // to NetworkProcess being called too late. For stats, use the time it
-      // should have been on the link.
-      total_packet_delay_ += packet->arrival_time() - packet->send_time();
-    }
-    sent_packets_ += packets_to_deliver.size();
-  }
-  while (!packets_to_deliver.empty()) {
-    NetworkPacket* packet = packets_to_deliver.front();
-    packets_to_deliver.pop();
-    demuxer_->DeliverPacket(packet, PacketTime());
-    delete packet;
-  }
-
-  next_process_time_ = !delay_link_.empty()
-                           ? (*delay_link_.begin())->arrival_time()
-                           : time_now + kDefaultProcessIntervalMs;
-}
-
-int64_t FakeNetworkPipe::TimeUntilNextProcess() const {
-  rtc::CritScope crit(&lock_);
-  return std::max<int64_t>(next_process_time_ - clock_->TimeInMilliseconds(),
-                           0);
-}
-
-}  // namespace webrtc
diff --git a/test/fake_network_pipe.h b/test/fake_network_pipe.h
deleted file mode 100644
index d7e0c5d..0000000
--- a/test/fake_network_pipe.h
+++ /dev/null
@@ -1,186 +0,0 @@
-/*
- *  Copyright (c) 2012 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_TEST_FAKE_NETWORK_PIPE_H_
-#define WEBRTC_TEST_FAKE_NETWORK_PIPE_H_
-
-#include <string.h>
-#include <map>
-#include <memory>
-#include <queue>
-#include <set>
-
-#include "webrtc/common_types.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/random.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-class Clock;
-class PacketReceiver;
-enum class MediaType;
-
-class NetworkPacket {
- public:
-  NetworkPacket(const uint8_t* data,
-                size_t length,
-                int64_t send_time,
-                int64_t arrival_time)
-      : data_(new uint8_t[length]),
-        data_length_(length),
-        send_time_(send_time),
-        arrival_time_(arrival_time) {
-    memcpy(data_.get(), data, length);
-  }
-
-  uint8_t* data() const { return data_.get(); }
-  size_t data_length() const { return data_length_; }
-  int64_t send_time() const { return send_time_; }
-  int64_t arrival_time() const { return arrival_time_; }
-  void IncrementArrivalTime(int64_t extra_delay) {
-    arrival_time_ += extra_delay;
-  }
-
- private:
-  // The packet data.
-  std::unique_ptr<uint8_t[]> data_;
-  // Length of data_.
-  size_t data_length_;
-  // The time the packet was sent out on the network.
-  const int64_t send_time_;
-  // The time the packet should arrive at the receiver.
-  int64_t arrival_time_;
-};
-
-class Demuxer {
- public:
-  virtual ~Demuxer() = default;
-  virtual void SetReceiver(PacketReceiver* receiver) = 0;
-  virtual void DeliverPacket(const NetworkPacket* packet,
-                             const PacketTime& packet_time) = 0;
-};
-
-class DemuxerImpl final : public Demuxer {
- public:
-  explicit DemuxerImpl(const std::map<uint8_t, MediaType>& payload_type_map);
-
-  void SetReceiver(PacketReceiver* receiver) override;
-  void DeliverPacket(const NetworkPacket* packet,
-                     const PacketTime& packet_time) override;
-
- private:
-  PacketReceiver* packet_receiver_;
-  const std::map<uint8_t, MediaType> payload_type_map_;
-  RTC_DISALLOW_COPY_AND_ASSIGN(DemuxerImpl);
-};
-
-// Class faking a network link. This is a simple and naive solution just faking
-// capacity and adding an extra transport delay in addition to the capacity
-// introduced delay.
-
-class FakeNetworkPipe {
- public:
-  struct Config {
-    Config() {}
-    // Queue length in number of packets.
-    size_t queue_length_packets = 0;
-    // Delay in addition to capacity induced delay.
-    int queue_delay_ms = 0;
-    // Standard deviation of the extra delay.
-    int delay_standard_deviation_ms = 0;
-    // Link capacity in kbps.
-    int link_capacity_kbps = 0;
-    // Random packet loss.
-    int loss_percent = 0;
-    // If packets are allowed to be reordered.
-    bool allow_reordering = false;
-    // The average length of a burst of lost packets.
-    int avg_burst_loss_length = -1;
-  };
-
-  FakeNetworkPipe(Clock* clock,
-                  const FakeNetworkPipe::Config& config,
-                  std::unique_ptr<Demuxer> demuxer);
-  FakeNetworkPipe(Clock* clock,
-                  const FakeNetworkPipe::Config& config,
-                  std::unique_ptr<Demuxer> demuxer,
-                  uint64_t seed);
-  ~FakeNetworkPipe();
-
-
-  // Sets a new configuration. This won't affect packets already in the pipe.
-  void SetConfig(const FakeNetworkPipe::Config& config);
-
-  // Sends a new packet to the link.
-  void SendPacket(const uint8_t* packet, size_t packet_length);
-
-  // Must not be called in parallel with SendPacket or Process.
-  void SetReceiver(PacketReceiver* receiver);
-
-  // Processes the network queues and trigger PacketReceiver::IncomingPacket for
-  // packets ready to be delivered.
-  void Process();
-  int64_t TimeUntilNextProcess() const;
-
-  // Get statistics.
-  float PercentageLoss();
-  int AverageDelay();
-  size_t dropped_packets() { return dropped_packets_; }
-  size_t sent_packets() { return sent_packets_; }
-
- private:
-  Clock* const clock_;
-  rtc::CriticalSection lock_;
-  const std::unique_ptr<Demuxer> demuxer_;
-  std::queue<NetworkPacket*> capacity_link_;
-  Random random_;
-
-  // Since we need to access both the packet with the earliest and latest
-  // arrival time we need to use a multiset to keep all packets sorted,
-  // hence, we cannot use a priority queue.
-  struct PacketArrivalTimeComparator {
-    bool operator()(const NetworkPacket* p1, const NetworkPacket* p2) {
-      return p1->arrival_time() < p2->arrival_time();
-    }
-  };
-  std::multiset<NetworkPacket*, PacketArrivalTimeComparator> delay_link_;
-
-  // Link configuration.
-  Config config_;
-
-  // Statistics.
-  size_t dropped_packets_;
-  size_t sent_packets_;
-  int64_t total_packet_delay_;
-
-  // Are we currently dropping a burst of packets?
-  bool bursting_;
-
-  // The probability to drop the packet if we are currently dropping a
-  // burst of packet
-  double prob_loss_bursting_;
-
-  // The probability to drop a burst of packets.
-  double prob_start_bursting_;
-
-  int64_t next_process_time_;
-
-  int64_t last_log_time_;
-
-  int64_t capacity_delay_error_bytes_ = 0;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(FakeNetworkPipe);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_TEST_FAKE_NETWORK_PIPE_H_
diff --git a/test/fake_network_pipe_unittest.cc b/test/fake_network_pipe_unittest.cc
deleted file mode 100644
index 92619e1..0000000
--- a/test/fake_network_pipe_unittest.cc
+++ /dev/null
@@ -1,445 +0,0 @@
-/*
- *  Copyright (c) 2012 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 <memory>
-
-#include "webrtc/call/call.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_header_parser.h"
-#include "webrtc/system_wrappers/include/clock.h"
-#include "webrtc/test/fake_network_pipe.h"
-#include "webrtc/test/gmock.h"
-#include "webrtc/test/gtest.h"
-
-using ::testing::_;
-using ::testing::AnyNumber;
-using ::testing::Return;
-using ::testing::Invoke;
-
-namespace webrtc {
-
-class TestDemuxer : public Demuxer {
- public:
-  void IncomingPacket(NetworkPacket* packet) {
-    DeliverPacket(packet, PacketTime());
-  }
-
-  MOCK_METHOD1(SetReceiver, void(PacketReceiver* receiver));
-  MOCK_METHOD2(DeliverPacket,
-               void(const NetworkPacket* packet,
-                    const PacketTime& packet_time));
-};
-
-class ReorderTestDemuxer : public TestDemuxer {
- public:
-  void DeliverPacket(const NetworkPacket* packet,
-                     const PacketTime& packet_time) override {
-    RTC_DCHECK_GE(packet->data_length(), sizeof(int));
-    int seq_num;
-    memcpy(&seq_num, packet->data(), sizeof(int));
-    delivered_sequence_numbers_.push_back(seq_num);
-  }
-  std::vector<int> delivered_sequence_numbers_;
-};
-
-class MockReceiver : public PacketReceiver {
- public:
-  MOCK_METHOD4(
-      DeliverPacket,
-      DeliveryStatus(MediaType, const uint8_t*, size_t, const PacketTime&));
-};
-
-class FakeNetworkPipeTest : public ::testing::Test {
- public:
-  FakeNetworkPipeTest() : fake_clock_(12345) {}
-
- protected:
-  void SendPackets(FakeNetworkPipe* pipe, int number_packets, int packet_size) {
-    RTC_DCHECK_GE(packet_size, sizeof(int));
-    std::unique_ptr<uint8_t[]> packet(new uint8_t[packet_size]);
-    for (int i = 0; i < number_packets; ++i) {
-      // Set a sequence number for the packets by
-      // using the first bytes in the packet.
-      memcpy(packet.get(), &i, sizeof(int));
-      pipe->SendPacket(packet.get(), packet_size);
-    }
-  }
-
-  int PacketTimeMs(int capacity_kbps, int packet_size) const {
-    return 8 * packet_size / capacity_kbps;
-  }
-
-  SimulatedClock fake_clock_;
-};
-
-// Test the capacity link and verify we get as many packets as we expect.
-TEST_F(FakeNetworkPipeTest, CapacityTest) {
-  FakeNetworkPipe::Config config;
-  config.queue_length_packets = 20;
-  config.link_capacity_kbps = 80;
-  TestDemuxer* demuxer = new TestDemuxer();
-  std::unique_ptr<FakeNetworkPipe> pipe(new FakeNetworkPipe(
-      &fake_clock_, config, std::unique_ptr<Demuxer>(demuxer)));
-
-  // Add 10 packets of 1000 bytes, = 80 kb, and verify it takes one second to
-  // get through the pipe.
-  const int kNumPackets = 10;
-  const int kPacketSize = 1000;
-  SendPackets(pipe.get(), kNumPackets, kPacketSize);
-
-  // Time to get one packet through the link.
-  const int kPacketTimeMs = PacketTimeMs(config.link_capacity_kbps,
-                                         kPacketSize);
-
-  // Time haven't increased yet, so we souldn't get any packets.
-  EXPECT_CALL(*demuxer, DeliverPacket(_, _)).Times(0);
-  pipe->Process();
-
-  // Advance enough time to release one packet.
-  fake_clock_.AdvanceTimeMilliseconds(kPacketTimeMs);
-  EXPECT_CALL(*demuxer, DeliverPacket(_, _)).Times(1);
-  pipe->Process();
-
-  // Release all but one packet
-  fake_clock_.AdvanceTimeMilliseconds(9 * kPacketTimeMs - 1);
-  EXPECT_CALL(*demuxer, DeliverPacket(_, _)).Times(8);
-  pipe->Process();
-
-  // And the last one.
-  fake_clock_.AdvanceTimeMilliseconds(1);
-  EXPECT_CALL(*demuxer, DeliverPacket(_, _)).Times(1);
-  pipe->Process();
-}
-
-// Test the extra network delay.
-TEST_F(FakeNetworkPipeTest, ExtraDelayTest) {
-  FakeNetworkPipe::Config config;
-  config.queue_length_packets = 20;
-  config.queue_delay_ms = 100;
-  config.link_capacity_kbps = 80;
-  TestDemuxer* demuxer = new TestDemuxer();
-  std::unique_ptr<FakeNetworkPipe> pipe(new FakeNetworkPipe(
-      &fake_clock_, config, std::unique_ptr<Demuxer>(demuxer)));
-
-  const int kNumPackets = 2;
-  const int kPacketSize = 1000;
-  SendPackets(pipe.get(), kNumPackets, kPacketSize);
-
-  // Time to get one packet through the link.
-  const int kPacketTimeMs = PacketTimeMs(config.link_capacity_kbps,
-                                         kPacketSize);
-
-  // Increase more than kPacketTimeMs, but not more than the extra delay.
-  fake_clock_.AdvanceTimeMilliseconds(kPacketTimeMs);
-  EXPECT_CALL(*demuxer, DeliverPacket(_, _)).Times(0);
-  pipe->Process();
-
-  // Advance the network delay to get the first packet.
-  fake_clock_.AdvanceTimeMilliseconds(config.queue_delay_ms);
-  EXPECT_CALL(*demuxer, DeliverPacket(_, _)).Times(1);
-  pipe->Process();
-
-  // Advance one more kPacketTimeMs to get the last packet.
-  fake_clock_.AdvanceTimeMilliseconds(kPacketTimeMs);
-  EXPECT_CALL(*demuxer, DeliverPacket(_, _)).Times(1);
-  pipe->Process();
-}
-
-// Test the number of buffers and packets are dropped when sending too many
-// packets too quickly.
-TEST_F(FakeNetworkPipeTest, QueueLengthTest) {
-  FakeNetworkPipe::Config config;
-  config.queue_length_packets = 2;
-  config.link_capacity_kbps = 80;
-  TestDemuxer* demuxer = new TestDemuxer();
-  std::unique_ptr<FakeNetworkPipe> pipe(new FakeNetworkPipe(
-      &fake_clock_, config, std::unique_ptr<Demuxer>(demuxer)));
-
-  const int kPacketSize = 1000;
-  const int kPacketTimeMs = PacketTimeMs(config.link_capacity_kbps,
-                                         kPacketSize);
-
-  // Send three packets and verify only 2 are delivered.
-  SendPackets(pipe.get(), 3, kPacketSize);
-
-  // Increase time enough to deliver all three packets, verify only two are
-  // delivered.
-  fake_clock_.AdvanceTimeMilliseconds(3 * kPacketTimeMs);
-  EXPECT_CALL(*demuxer, DeliverPacket(_, _)).Times(2);
-  pipe->Process();
-}
-
-// Test we get statistics as expected.
-TEST_F(FakeNetworkPipeTest, StatisticsTest) {
-  FakeNetworkPipe::Config config;
-  config.queue_length_packets = 2;
-  config.queue_delay_ms = 20;
-  config.link_capacity_kbps = 80;
-  TestDemuxer* demuxer = new TestDemuxer();
-  std::unique_ptr<FakeNetworkPipe> pipe(new FakeNetworkPipe(
-      &fake_clock_, config, std::unique_ptr<Demuxer>(demuxer)));
-
-  const int kPacketSize = 1000;
-  const int kPacketTimeMs = PacketTimeMs(config.link_capacity_kbps,
-                                         kPacketSize);
-
-  // Send three packets and verify only 2 are delivered.
-  SendPackets(pipe.get(), 3, kPacketSize);
-  fake_clock_.AdvanceTimeMilliseconds(3 * kPacketTimeMs +
-                                      config.queue_delay_ms);
-
-  EXPECT_CALL(*demuxer, DeliverPacket(_, _)).Times(2);
-  pipe->Process();
-
-  // Packet 1: kPacketTimeMs + config.queue_delay_ms,
-  // packet 2: 2 * kPacketTimeMs + config.queue_delay_ms => 170 ms average.
-  EXPECT_EQ(pipe->AverageDelay(), 170);
-  EXPECT_EQ(pipe->sent_packets(), 2u);
-  EXPECT_EQ(pipe->dropped_packets(), 1u);
-  EXPECT_EQ(pipe->PercentageLoss(), 1/3.f);
-}
-
-// Change the link capacity half-way through the test and verify that the
-// delivery times change accordingly.
-TEST_F(FakeNetworkPipeTest, ChangingCapacityWithEmptyPipeTest) {
-  FakeNetworkPipe::Config config;
-  config.queue_length_packets = 20;
-  config.link_capacity_kbps = 80;
-  TestDemuxer* demuxer = new TestDemuxer();
-  std::unique_ptr<FakeNetworkPipe> pipe(new FakeNetworkPipe(
-      &fake_clock_, config, std::unique_ptr<Demuxer>(demuxer)));
-
-  // Add 10 packets of 1000 bytes, = 80 kb, and verify it takes one second to
-  // get through the pipe.
-  const int kNumPackets = 10;
-  const int kPacketSize = 1000;
-  SendPackets(pipe.get(), kNumPackets, kPacketSize);
-
-  // Time to get one packet through the link.
-  int packet_time_ms = PacketTimeMs(config.link_capacity_kbps, kPacketSize);
-
-  // Time hasn't increased yet, so we souldn't get any packets.
-  EXPECT_CALL(*demuxer, DeliverPacket(_, _)).Times(0);
-  pipe->Process();
-
-  // Advance time in steps to release one packet at a time.
-  for (int i = 0; i < kNumPackets; ++i) {
-    fake_clock_.AdvanceTimeMilliseconds(packet_time_ms);
-    EXPECT_CALL(*demuxer, DeliverPacket(_, _)).Times(1);
-    pipe->Process();
-  }
-
-  // Change the capacity.
-  config.link_capacity_kbps /= 2;  // Reduce to 50%.
-  pipe->SetConfig(config);
-
-  // Add another 10 packets of 1000 bytes, = 80 kb, and verify it takes two
-  // seconds to get them through the pipe.
-  SendPackets(pipe.get(), kNumPackets, kPacketSize);
-
-  // Time to get one packet through the link.
-  packet_time_ms = PacketTimeMs(config.link_capacity_kbps, kPacketSize);
-
-  // Time hasn't increased yet, so we souldn't get any packets.
-  EXPECT_CALL(*demuxer, DeliverPacket(_, _)).Times(0);
-  pipe->Process();
-
-  // Advance time in steps to release one packet at a time.
-  for (int i = 0; i < kNumPackets; ++i) {
-    fake_clock_.AdvanceTimeMilliseconds(packet_time_ms);
-    EXPECT_CALL(*demuxer, DeliverPacket(_, _)).Times(1);
-    pipe->Process();
-  }
-
-  // Check that all the packets were sent.
-  EXPECT_EQ(static_cast<size_t>(2 * kNumPackets), pipe->sent_packets());
-  fake_clock_.AdvanceTimeMilliseconds(pipe->TimeUntilNextProcess());
-  EXPECT_CALL(*demuxer, DeliverPacket(_, _)).Times(0);
-  pipe->Process();
-}
-
-// Change the link capacity half-way through the test and verify that the
-// delivery times change accordingly.
-TEST_F(FakeNetworkPipeTest, ChangingCapacityWithPacketsInPipeTest) {
-  FakeNetworkPipe::Config config;
-  config.queue_length_packets = 20;
-  config.link_capacity_kbps = 80;
-  TestDemuxer* demuxer = new TestDemuxer();
-  std::unique_ptr<FakeNetworkPipe> pipe(new FakeNetworkPipe(
-      &fake_clock_, config, std::unique_ptr<Demuxer>(demuxer)));
-
-  // Add 10 packets of 1000 bytes, = 80 kb.
-  const int kNumPackets = 10;
-  const int kPacketSize = 1000;
-  SendPackets(pipe.get(), kNumPackets, kPacketSize);
-
-  // Time to get one packet through the link at the initial speed.
-  int packet_time_1_ms = PacketTimeMs(config.link_capacity_kbps, kPacketSize);
-
-  // Change the capacity.
-  config.link_capacity_kbps *= 2;  // Double the capacity.
-  pipe->SetConfig(config);
-
-  // Add another 10 packets of 1000 bytes, = 80 kb, and verify it takes two
-  // seconds to get them through the pipe.
-  SendPackets(pipe.get(), kNumPackets, kPacketSize);
-
-  // Time to get one packet through the link at the new capacity.
-  int packet_time_2_ms = PacketTimeMs(config.link_capacity_kbps, kPacketSize);
-
-  // Time hasn't increased yet, so we souldn't get any packets.
-  EXPECT_CALL(*demuxer, DeliverPacket(_, _)).Times(0);
-  pipe->Process();
-
-  // Advance time in steps to release one packet at a time.
-  for (int i = 0; i < kNumPackets; ++i) {
-    fake_clock_.AdvanceTimeMilliseconds(packet_time_1_ms);
-    EXPECT_CALL(*demuxer, DeliverPacket(_, _)).Times(1);
-    pipe->Process();
-  }
-
-  // Advance time in steps to release one packet at a time.
-  for (int i = 0; i < kNumPackets; ++i) {
-    fake_clock_.AdvanceTimeMilliseconds(packet_time_2_ms);
-    EXPECT_CALL(*demuxer, DeliverPacket(_, _)).Times(1);
-    pipe->Process();
-  }
-
-  // Check that all the packets were sent.
-  EXPECT_EQ(static_cast<size_t>(2 * kNumPackets), pipe->sent_packets());
-  fake_clock_.AdvanceTimeMilliseconds(pipe->TimeUntilNextProcess());
-  EXPECT_CALL(*demuxer, DeliverPacket(_, _)).Times(0);
-  pipe->Process();
-}
-
-// At first disallow reordering and then allow reordering.
-TEST_F(FakeNetworkPipeTest, DisallowReorderingThenAllowReordering) {
-  FakeNetworkPipe::Config config;
-  config.queue_length_packets = 1000;
-  config.link_capacity_kbps = 800;
-  config.queue_delay_ms = 100;
-  config.delay_standard_deviation_ms = 10;
-  ReorderTestDemuxer* demuxer = new ReorderTestDemuxer();
-  std::unique_ptr<FakeNetworkPipe> pipe(new FakeNetworkPipe(
-      &fake_clock_, config, std::unique_ptr<Demuxer>(demuxer)));
-
-  const uint32_t kNumPackets = 100;
-  const int kPacketSize = 10;
-  SendPackets(pipe.get(), kNumPackets, kPacketSize);
-  fake_clock_.AdvanceTimeMilliseconds(1000);
-  pipe->Process();
-
-  // Confirm that all packets have been delivered in order.
-  EXPECT_EQ(kNumPackets, demuxer->delivered_sequence_numbers_.size());
-  int last_seq_num = -1;
-  for (int seq_num : demuxer->delivered_sequence_numbers_) {
-    EXPECT_GT(seq_num, last_seq_num);
-    last_seq_num = seq_num;
-  }
-
-  config.allow_reordering = true;
-  pipe->SetConfig(config);
-  SendPackets(pipe.get(), kNumPackets, kPacketSize);
-  fake_clock_.AdvanceTimeMilliseconds(1000);
-  demuxer->delivered_sequence_numbers_.clear();
-  pipe->Process();
-
-  // Confirm that all packets have been delivered
-  // and that reordering has occured.
-  EXPECT_EQ(kNumPackets, demuxer->delivered_sequence_numbers_.size());
-  bool reordering_has_occured = false;
-  last_seq_num = -1;
-  for (int seq_num : demuxer->delivered_sequence_numbers_) {
-    if (last_seq_num > seq_num) {
-      reordering_has_occured = true;
-      break;
-    }
-    last_seq_num = seq_num;
-  }
-  EXPECT_TRUE(reordering_has_occured);
-}
-
-TEST_F(FakeNetworkPipeTest, BurstLoss) {
-  const int kLossPercent = 5;
-  const int kAvgBurstLength = 3;
-  const int kNumPackets = 10000;
-  const int kPacketSize = 10;
-
-  FakeNetworkPipe::Config config;
-  config.queue_length_packets = kNumPackets;
-  config.loss_percent = kLossPercent;
-  config.avg_burst_loss_length = kAvgBurstLength;
-  ReorderTestDemuxer* demuxer = new ReorderTestDemuxer();
-  std::unique_ptr<FakeNetworkPipe> pipe(new FakeNetworkPipe(
-      &fake_clock_, config, std::unique_ptr<Demuxer>(demuxer)));
-
-  SendPackets(pipe.get(), kNumPackets, kPacketSize);
-  fake_clock_.AdvanceTimeMilliseconds(1000);
-  pipe->Process();
-
-  // Check that the average loss is |kLossPercent| percent.
-  int lost_packets = kNumPackets - demuxer->delivered_sequence_numbers_.size();
-  double loss_fraction = lost_packets / static_cast<double>(kNumPackets);
-
-  EXPECT_NEAR(kLossPercent / 100.0, loss_fraction, 0.05);
-
-  // Find the number of bursts that has occurred.
-  size_t received_packets = demuxer->delivered_sequence_numbers_.size();
-  int num_bursts = 0;
-  for (size_t i = 0; i < received_packets - 1; ++i) {
-    int diff = demuxer->delivered_sequence_numbers_[i + 1] -
-               demuxer->delivered_sequence_numbers_[i];
-    if (diff > 1)
-      ++num_bursts;
-  }
-
-  double average_burst_length = static_cast<double>(lost_packets) / num_bursts;
-
-  EXPECT_NEAR(kAvgBurstLength, average_burst_length, 0.3);
-}
-
-TEST_F(FakeNetworkPipeTest, SetReceiver) {
-  FakeNetworkPipe::Config config;
-  TestDemuxer* demuxer = new TestDemuxer();
-  std::unique_ptr<FakeNetworkPipe> pipe(new FakeNetworkPipe(
-      &fake_clock_, config, std::unique_ptr<Demuxer>(demuxer)));
-  MockReceiver packet_receiver;
-  EXPECT_CALL(*demuxer, SetReceiver(&packet_receiver)).Times(1);
-  pipe->SetReceiver(&packet_receiver);
-}
-
-TEST(DemuxerImplTest, Demuxing) {
-  constexpr uint8_t kVideoPayloadType = 100;
-  constexpr uint8_t kAudioPayloadType = 101;
-  constexpr int64_t kTimeNow = 12345;
-  constexpr int64_t kArrivalTime = kTimeNow - 1;
-  constexpr size_t kPacketSize = 10;
-  DemuxerImpl demuxer({{kVideoPayloadType, MediaType::VIDEO},
-                       {kAudioPayloadType, MediaType::AUDIO}});
-
-  MockReceiver mock_receiver;
-  demuxer.SetReceiver(&mock_receiver);
-
-  std::vector<uint8_t> data(kPacketSize);
-  data[1] = kVideoPayloadType;
-  std::unique_ptr<NetworkPacket> packet(
-      new NetworkPacket(&data[0], kPacketSize, kTimeNow, kArrivalTime));
-  EXPECT_CALL(mock_receiver, DeliverPacket(MediaType::VIDEO, _, _, _))
-      .WillOnce(Return(PacketReceiver::DELIVERY_OK));
-  demuxer.DeliverPacket(packet.get(), PacketTime());
-
-  data[1] = kAudioPayloadType;
-  packet.reset(
-      new NetworkPacket(&data[0], kPacketSize, kTimeNow, kArrivalTime));
-  EXPECT_CALL(mock_receiver, DeliverPacket(MediaType::AUDIO, _, _, _))
-      .WillOnce(Return(PacketReceiver::DELIVERY_OK));
-  demuxer.DeliverPacket(packet.get(), PacketTime());
-}
-
-}  // namespace webrtc
diff --git a/test/fake_texture_frame.cc b/test/fake_texture_frame.cc
deleted file mode 100644
index a73380d..0000000
--- a/test/fake_texture_frame.cc
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- *  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/test/fake_texture_frame.h"
-
-namespace webrtc {
-namespace test {
-
-VideoFrame FakeNativeBuffer::CreateFrame(int width,
-                                         int height,
-                                         uint32_t timestamp,
-                                         int64_t render_time_ms,
-                                         VideoRotation rotation) {
-  return VideoFrame(new rtc::RefCountedObject<FakeNativeBuffer>(width, height),
-                    timestamp, render_time_ms, rotation);
-}
-}  // namespace test
-}  // namespace webrtc
diff --git a/test/fake_texture_frame.h b/test/fake_texture_frame.h
deleted file mode 100644
index ce5963e..0000000
--- a/test/fake_texture_frame.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- *  Copyright (c) 2015 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_TEST_FAKE_TEXTURE_FRAME_H_
-#define WEBRTC_TEST_FAKE_TEXTURE_FRAME_H_
-
-#include "webrtc/api/video/i420_buffer.h"
-#include "webrtc/api/video/video_frame.h"
-#include "webrtc/common_video/include/video_frame_buffer.h"
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-namespace test {
-
-class FakeNativeBuffer : public VideoFrameBuffer {
- public:
-  static VideoFrame CreateFrame(int width,
-                                int height,
-                                uint32_t timestamp,
-                                int64_t render_time_ms,
-                                VideoRotation rotation);
-
-  FakeNativeBuffer(int width, int height) : width_(width), height_(height) {}
-
-  Type type() const override { return Type::kNative; }
-  int width() const override { return width_; }
-  int height() const override { return height_; }
-
- private:
-  rtc::scoped_refptr<I420BufferInterface> ToI420() override {
-    rtc::scoped_refptr<I420Buffer> buffer = I420Buffer::Create(width_, height_);
-    I420Buffer::SetBlack(buffer);
-    return buffer;
-  }
-
-  const int width_;
-  const int height_;
-};
-
-}  // namespace test
-}  // namespace webrtc
-#endif  //  WEBRTC_TEST_FAKE_TEXTURE_FRAME_H_
diff --git a/test/fake_videorenderer.h b/test/fake_videorenderer.h
deleted file mode 100644
index 6a4015d..0000000
--- a/test/fake_videorenderer.h
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- *  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_TEST_FAKE_VIDEORENDERER_H_
-#define WEBRTC_TEST_FAKE_VIDEORENDERER_H_
-
-#include "webrtc/api/video/video_frame.h"
-#include "webrtc/media/base/videosinkinterface.h"
-
-namespace webrtc {
-namespace test {
-
-class FakeVideoRenderer : public rtc::VideoSinkInterface<webrtc::VideoFrame> {
- public:
-  void OnFrame(const webrtc::VideoFrame& frame) override {}
-};
-
-}  // namespace test
-}  // namespace webrtc
-
-#endif  // WEBRTC_TEST_FAKE_VIDEORENDERER_H_
diff --git a/test/field_trial.cc b/test/field_trial.cc
deleted file mode 100644
index c40d078..0000000
--- a/test/field_trial.cc
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- *  Copyright (c) 2014 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/test/field_trial.h"
-
-#include <algorithm>
-#include <cassert>
-#include <cstdio>
-#include <cstdlib>
-#include <map>
-#include <string>
-
-#include "webrtc/system_wrappers/include/field_trial.h"
-#include "webrtc/system_wrappers/include/field_trial_default.h"
-
-namespace webrtc {
-namespace {
-bool field_trials_initiated_ = false;
-}  // namespace
-
-namespace test {
-// Note: this code is copied from src/base/metrics/field_trial.cc since the aim
-// is to mimic chromium --force-fieldtrials.
-void InitFieldTrialsFromString(const std::string& trials_string) {
-  static const char kPersistentStringSeparator = '/';
-
-  // Catch an error if this is called more than once.
-  assert(!field_trials_initiated_);
-  field_trials_initiated_ = true;
-
-  if (trials_string.empty())
-    return;
-
-  size_t next_item = 0;
-  std::map<std::string, std::string> field_trials;
-  while (next_item < trials_string.length()) {
-    size_t name_end = trials_string.find(kPersistentStringSeparator, next_item);
-    if (name_end == trials_string.npos || next_item == name_end)
-      break;
-    size_t group_name_end = trials_string.find(kPersistentStringSeparator,
-                                               name_end + 1);
-    if (group_name_end == trials_string.npos || name_end + 1 == group_name_end)
-      break;
-    std::string name(trials_string, next_item, name_end - next_item);
-    std::string group_name(trials_string, name_end + 1,
-                           group_name_end - name_end - 1);
-    next_item = group_name_end + 1;
-
-    // Fail if duplicate with different group name.
-    if (field_trials.find(name) != field_trials.end() &&
-        field_trials.find(name)->second != group_name) {
-      break;
-    }
-
-    field_trials[name] = group_name;
-
-    // Successfully parsed all field trials from the string.
-    if (next_item == trials_string.length()) {
-      webrtc::field_trial::InitFieldTrialsFromString(trials_string.c_str());
-      return;
-    }
-  }
-  // Using fprintf as LOG does not print when this is called early in main.
-  fprintf(stderr, "Invalid field trials string.\n");
-
-  // Using abort so it crashes in both debug and release mode.
-  abort();
-}
-
-ScopedFieldTrials::ScopedFieldTrials(const std::string& config)
-  : previous_field_trials_(webrtc::field_trial::GetFieldTrialString()) {
-  assert(field_trials_initiated_);
-  field_trials_initiated_ = false;
-  current_field_trials_ = config;
-  InitFieldTrialsFromString(current_field_trials_);
-}
-
-ScopedFieldTrials::~ScopedFieldTrials() {
-  // Should still be initialized, since InitFieldTrials is called from ctor.
-  // That's why we don't restore the flag.
-  assert(field_trials_initiated_);
-  webrtc::field_trial::InitFieldTrialsFromString(previous_field_trials_);
-}
-
-}  // namespace test
-}  // namespace webrtc
diff --git a/test/field_trial.h b/test/field_trial.h
deleted file mode 100644
index 735aa1f..0000000
--- a/test/field_trial.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- *  Copyright (c) 2014 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_TEST_FIELD_TRIAL_H_
-#define WEBRTC_TEST_FIELD_TRIAL_H_
-
-#include <string>
-#include <map>
-
-namespace webrtc {
-namespace test {
-
-// Parses enabled field trials from a string config, such as the one passed
-// to chrome's argument --force-fieldtrials and initializes webrtc::field_trial
-// with such a config.
-//  E.g.:
-//    "WebRTC-experimentFoo/Enabled/WebRTC-experimentBar/Enabled100kbps/"
-//    Assigns the process to group "Enabled" on WebRTCExperimentFoo trial
-//    and to group "Enabled100kbps" on WebRTCExperimentBar.
-//
-//  E.g. invalid config:
-//    "WebRTC-experiment1/Enabled"  (note missing / separator at the end).
-//
-// Note: This method crashes with an error message if an invalid config is
-// passed to it. That can be used to find out if a binary is parsing the flags.
-void InitFieldTrialsFromString(const std::string& config);
-
-// This class is used to override field-trial configs within specific tests.
-// After this class goes out of scope previous field trials will be restored.
-class ScopedFieldTrials {
- public:
-  explicit ScopedFieldTrials(const std::string& config);
-  ~ScopedFieldTrials();
- private:
-  std::string current_field_trials_;
-  const char* previous_field_trials_;
-};
-
-}  // namespace test
-}  // namespace webrtc
-
-#endif  // WEBRTC_TEST_FIELD_TRIAL_H_
diff --git a/test/frame_generator.cc b/test/frame_generator.cc
deleted file mode 100644
index eff2ec2..0000000
--- a/test/frame_generator.cc
+++ /dev/null
@@ -1,450 +0,0 @@
-/*
- *  Copyright (c) 2013 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/test/frame_generator.h"
-
-#include <math.h>
-#include <stdio.h>
-#include <string.h>
-
-#include <memory>
-
-#include "webrtc/api/video/i420_buffer.h"
-#include "webrtc/common_video/include/video_frame_buffer.h"
-#include "webrtc/common_video/libyuv/include/webrtc_libyuv.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/keep_ref_until_done.h"
-#include "webrtc/rtc_base/random.h"
-#include "webrtc/system_wrappers/include/clock.h"
-#include "webrtc/test/frame_utils.h"
-
-namespace webrtc {
-namespace test {
-namespace {
-
-// SquareGenerator is a FrameGenerator that draws 10 randomly sized and colored
-// squares. Between each new generated frame, the squares are moved slightly
-// towards the lower right corner.
-class SquareGenerator : public FrameGenerator {
- public:
-  SquareGenerator(int width, int height) {
-    ChangeResolution(width, height);
-    for (int i = 0; i < 10; ++i) {
-      squares_.emplace_back(new Square(width, height, i + 1));
-    }
-  }
-
-  void ChangeResolution(size_t width, size_t height) override {
-    rtc::CritScope lock(&crit_);
-    width_ = static_cast<int>(width);
-    height_ = static_cast<int>(height);
-    RTC_CHECK(width_ > 0);
-    RTC_CHECK(height_ > 0);
-  }
-
-  VideoFrame* NextFrame() override {
-    rtc::CritScope lock(&crit_);
-
-    rtc::scoped_refptr<I420Buffer> buffer(I420Buffer::Create(width_, height_));
-
-    memset(buffer->MutableDataY(), 127, height_ * buffer->StrideY());
-    memset(buffer->MutableDataU(), 127,
-           buffer->ChromaHeight() * buffer->StrideU());
-    memset(buffer->MutableDataV(), 127,
-           buffer->ChromaHeight() * buffer->StrideV());
-
-    for (const auto& square : squares_)
-      square->Draw(buffer);
-
-    frame_.reset(new VideoFrame(buffer, 0, 0, webrtc::kVideoRotation_0));
-    return frame_.get();
-  }
-
- private:
-  class Square {
-   public:
-    Square(int width, int height, int seed)
-        : random_generator_(seed),
-          x_(random_generator_.Rand(0, width)),
-          y_(random_generator_.Rand(0, height)),
-          length_(random_generator_.Rand(1, width > 4 ? width / 4 : 1)),
-          yuv_y_(random_generator_.Rand(0, 255)),
-          yuv_u_(random_generator_.Rand(0, 255)),
-          yuv_v_(random_generator_.Rand(0, 255)) {}
-
-    void Draw(const rtc::scoped_refptr<I420Buffer>& buffer) {
-      x_ = (x_ + random_generator_.Rand(0, 4)) % (buffer->width() - length_);
-      y_ = (y_ + random_generator_.Rand(0, 4)) % (buffer->height() - length_);
-        for (int y = y_; y < y_ + length_; ++y) {
-          uint8_t* pos_y =
-              (buffer->MutableDataY() + x_ + y * buffer->StrideY());
-          memset(pos_y, yuv_y_, length_);
-        }
-
-        for (int y = y_; y < y_ + length_; y = y + 2) {
-          uint8_t* pos_u =
-              (buffer->MutableDataU() + x_ / 2 + y / 2 * buffer->StrideU());
-          memset(pos_u, yuv_u_, length_ / 2);
-          uint8_t* pos_v =
-              (buffer->MutableDataV() + x_ / 2 + y / 2 * buffer->StrideV());
-          memset(pos_v, yuv_v_, length_ / 2);
-        }
-    }
-
-   private:
-    Random random_generator_;
-    int x_;
-    int y_;
-    const int length_;
-    const uint8_t yuv_y_;
-    const uint8_t yuv_u_;
-    const uint8_t yuv_v_;
-  };
-
-  rtc::CriticalSection crit_;
-  int width_ RTC_GUARDED_BY(&crit_);
-  int height_ RTC_GUARDED_BY(&crit_);
-  std::vector<std::unique_ptr<Square>> squares_ RTC_GUARDED_BY(&crit_);
-  std::unique_ptr<VideoFrame> frame_ RTC_GUARDED_BY(&crit_);
-};
-
-class YuvFileGenerator : public FrameGenerator {
- public:
-  YuvFileGenerator(std::vector<FILE*> files,
-                   size_t width,
-                   size_t height,
-                   int frame_repeat_count)
-      : file_index_(0),
-        files_(files),
-        width_(width),
-        height_(height),
-        frame_size_(CalcBufferSize(VideoType::kI420,
-                                   static_cast<int>(width_),
-                                   static_cast<int>(height_))),
-        frame_buffer_(new uint8_t[frame_size_]),
-        frame_display_count_(frame_repeat_count),
-        current_display_count_(0) {
-    RTC_DCHECK_GT(width, 0);
-    RTC_DCHECK_GT(height, 0);
-    RTC_DCHECK_GT(frame_repeat_count, 0);
-  }
-
-  virtual ~YuvFileGenerator() {
-    for (FILE* file : files_)
-      fclose(file);
-  }
-
-  VideoFrame* NextFrame() override {
-    if (current_display_count_ == 0)
-      ReadNextFrame();
-    if (++current_display_count_ >= frame_display_count_)
-      current_display_count_ = 0;
-
-    temp_frame_.reset(
-        new VideoFrame(last_read_buffer_, 0, 0, webrtc::kVideoRotation_0));
-    return temp_frame_.get();
-  }
-
-  void ReadNextFrame() {
-    last_read_buffer_ =
-        test::ReadI420Buffer(static_cast<int>(width_),
-                             static_cast<int>(height_),
-                             files_[file_index_]);
-    if (!last_read_buffer_) {
-      // No more frames to read in this file, rewind and move to next file.
-      rewind(files_[file_index_]);
-      file_index_ = (file_index_ + 1) % files_.size();
-      last_read_buffer_ =
-          test::ReadI420Buffer(static_cast<int>(width_),
-                               static_cast<int>(height_),
-                               files_[file_index_]);
-      RTC_CHECK(last_read_buffer_);
-    }
-  }
-
- private:
-  size_t file_index_;
-  const std::vector<FILE*> files_;
-  const size_t width_;
-  const size_t height_;
-  const size_t frame_size_;
-  const std::unique_ptr<uint8_t[]> frame_buffer_;
-  const int frame_display_count_;
-  int current_display_count_;
-  rtc::scoped_refptr<I420Buffer> last_read_buffer_;
-  std::unique_ptr<VideoFrame> temp_frame_;
-};
-
-// SlideGenerator works similarly to YuvFileGenerator but it fills the frames
-// with randomly sized and colored squares instead of reading their content
-// from files.
-class SlideGenerator : public FrameGenerator {
- public:
-  SlideGenerator(int width, int height, int frame_repeat_count)
-      : width_(width),
-        height_(height),
-        frame_display_count_(frame_repeat_count),
-        current_display_count_(0),
-        random_generator_(1234) {
-    RTC_DCHECK_GT(width, 0);
-    RTC_DCHECK_GT(height, 0);
-    RTC_DCHECK_GT(frame_repeat_count, 0);
-  }
-
-  VideoFrame* NextFrame() override {
-    if (current_display_count_ == 0)
-      GenerateNewFrame();
-    if (++current_display_count_ >= frame_display_count_)
-      current_display_count_ = 0;
-
-    frame_.reset(
-        new VideoFrame(buffer_, 0, 0, webrtc::kVideoRotation_0));
-    return frame_.get();
-  }
-
-  // Generates some randomly sized and colored squares scattered
-  // over the frame.
-  void GenerateNewFrame() {
-    // The squares should have a varying order of magnitude in order
-    // to simulate variation in the slides' complexity.
-    const int kSquareNum =  1 << (4 + (random_generator_.Rand(0, 3) * 4));
-
-    buffer_ = I420Buffer::Create(width_, height_);
-    memset(buffer_->MutableDataY(), 127, height_ * buffer_->StrideY());
-    memset(buffer_->MutableDataU(), 127,
-           buffer_->ChromaHeight() * buffer_->StrideU());
-    memset(buffer_->MutableDataV(), 127,
-           buffer_->ChromaHeight() * buffer_->StrideV());
-
-    for (int i = 0; i < kSquareNum; ++i) {
-      int length = random_generator_.Rand(1, width_ > 4 ? width_ / 4 : 1);
-      // Limit the length of later squares so that they don't overwrite the
-      // previous ones too much.
-      length = (length * (kSquareNum - i)) / kSquareNum;
-
-      int x = random_generator_.Rand(0, width_ - length);
-      int y = random_generator_.Rand(0, height_ - length);
-      uint8_t yuv_y = random_generator_.Rand(0, 255);
-      uint8_t yuv_u = random_generator_.Rand(0, 255);
-      uint8_t yuv_v = random_generator_.Rand(0, 255);
-
-      for (int yy = y; yy < y + length; ++yy) {
-        uint8_t* pos_y =
-            (buffer_->MutableDataY() + x + yy * buffer_->StrideY());
-        memset(pos_y, yuv_y, length);
-      }
-      for (int yy = y; yy < y + length; yy += 2) {
-        uint8_t* pos_u =
-            (buffer_->MutableDataU() + x / 2 + yy / 2 * buffer_->StrideU());
-        memset(pos_u, yuv_u, length / 2);
-        uint8_t* pos_v =
-            (buffer_->MutableDataV() + x / 2 + yy / 2 * buffer_->StrideV());
-        memset(pos_v, yuv_v, length / 2);
-      }
-    }
-  }
-
- private:
-  const int width_;
-  const int height_;
-  const int frame_display_count_;
-  int current_display_count_;
-  Random random_generator_;
-  rtc::scoped_refptr<I420Buffer> buffer_;
-  std::unique_ptr<VideoFrame> frame_;
-};
-
-class ScrollingImageFrameGenerator : public FrameGenerator {
- public:
-  ScrollingImageFrameGenerator(Clock* clock,
-                               const std::vector<FILE*>& files,
-                               size_t source_width,
-                               size_t source_height,
-                               size_t target_width,
-                               size_t target_height,
-                               int64_t scroll_time_ms,
-                               int64_t pause_time_ms)
-      : clock_(clock),
-        start_time_(clock->TimeInMilliseconds()),
-        scroll_time_(scroll_time_ms),
-        pause_time_(pause_time_ms),
-        num_frames_(files.size()),
-        target_width_(static_cast<int>(target_width)),
-        target_height_(static_cast<int>(target_height)),
-        current_frame_num_(num_frames_ - 1),
-        current_source_frame_(nullptr),
-        file_generator_(files, source_width, source_height, 1) {
-    RTC_DCHECK(clock_ != nullptr);
-    RTC_DCHECK_GT(num_frames_, 0);
-    RTC_DCHECK_GE(source_height, target_height);
-    RTC_DCHECK_GE(source_width, target_width);
-    RTC_DCHECK_GE(scroll_time_ms, 0);
-    RTC_DCHECK_GE(pause_time_ms, 0);
-    RTC_DCHECK_GT(scroll_time_ms + pause_time_ms, 0);
-  }
-
-  virtual ~ScrollingImageFrameGenerator() {}
-
-  VideoFrame* NextFrame() override {
-    const int64_t kFrameDisplayTime = scroll_time_ + pause_time_;
-    const int64_t now = clock_->TimeInMilliseconds();
-    int64_t ms_since_start = now - start_time_;
-
-    size_t frame_num = (ms_since_start / kFrameDisplayTime) % num_frames_;
-    UpdateSourceFrame(frame_num);
-
-    double scroll_factor;
-    int64_t time_into_frame = ms_since_start % kFrameDisplayTime;
-    if (time_into_frame < scroll_time_) {
-      scroll_factor = static_cast<double>(time_into_frame) / scroll_time_;
-    } else {
-      scroll_factor = 1.0;
-    }
-    CropSourceToScrolledImage(scroll_factor);
-
-    return current_frame_ ? &*current_frame_ : nullptr;
-  }
-
-  void UpdateSourceFrame(size_t frame_num) {
-    while (current_frame_num_ != frame_num) {
-      current_source_frame_ = file_generator_.NextFrame();
-      current_frame_num_ = (current_frame_num_ + 1) % num_frames_;
-    }
-    RTC_DCHECK(current_source_frame_ != nullptr);
-  }
-
-  void CropSourceToScrolledImage(double scroll_factor) {
-    int scroll_margin_x = current_source_frame_->width() - target_width_;
-    int pixels_scrolled_x =
-        static_cast<int>(scroll_margin_x * scroll_factor + 0.5);
-    int scroll_margin_y = current_source_frame_->height() - target_height_;
-    int pixels_scrolled_y =
-        static_cast<int>(scroll_margin_y * scroll_factor + 0.5);
-
-    rtc::scoped_refptr<I420BufferInterface> i420_buffer =
-        current_source_frame_->video_frame_buffer()->ToI420();
-    int offset_y =
-        (i420_buffer->StrideY() * pixels_scrolled_y) + pixels_scrolled_x;
-    int offset_u = (i420_buffer->StrideU() * (pixels_scrolled_y / 2)) +
-                   (pixels_scrolled_x / 2);
-    int offset_v = (i420_buffer->StrideV() * (pixels_scrolled_y / 2)) +
-                   (pixels_scrolled_x / 2);
-
-    current_frame_ = rtc::Optional<webrtc::VideoFrame>(webrtc::VideoFrame(
-        new rtc::RefCountedObject<webrtc::WrappedI420Buffer>(
-            target_width_, target_height_, &i420_buffer->DataY()[offset_y],
-            i420_buffer->StrideY(), &i420_buffer->DataU()[offset_u],
-            i420_buffer->StrideU(), &i420_buffer->DataV()[offset_v],
-            i420_buffer->StrideV(), KeepRefUntilDone(i420_buffer)),
-        kVideoRotation_0, 0));
-  }
-
-  Clock* const clock_;
-  const int64_t start_time_;
-  const int64_t scroll_time_;
-  const int64_t pause_time_;
-  const size_t num_frames_;
-  const int target_width_;
-  const int target_height_;
-
-  size_t current_frame_num_;
-  VideoFrame* current_source_frame_;
-  rtc::Optional<VideoFrame> current_frame_;
-  YuvFileGenerator file_generator_;
-};
-
-}  // namespace
-
-FrameForwarder::FrameForwarder() : sink_(nullptr) {}
-FrameForwarder::~FrameForwarder() {}
-
-void FrameForwarder::IncomingCapturedFrame(const VideoFrame& video_frame) {
-  rtc::CritScope lock(&crit_);
-  if (sink_)
-    sink_->OnFrame(video_frame);
-}
-
-void FrameForwarder::AddOrUpdateSink(rtc::VideoSinkInterface<VideoFrame>* sink,
-                                     const rtc::VideoSinkWants& wants) {
-  rtc::CritScope lock(&crit_);
-  RTC_DCHECK(!sink_ || sink_ == sink);
-  sink_ = sink;
-  sink_wants_ = wants;
-}
-
-void FrameForwarder::RemoveSink(rtc::VideoSinkInterface<VideoFrame>* sink) {
-  rtc::CritScope lock(&crit_);
-  RTC_DCHECK_EQ(sink, sink_);
-  sink_ = nullptr;
-}
-
-rtc::VideoSinkWants FrameForwarder::sink_wants() const {
-  rtc::CritScope lock(&crit_);
-  return sink_wants_;
-}
-
-bool FrameForwarder::has_sinks() const {
-  rtc::CritScope lock(&crit_);
-  return sink_ != nullptr;
-}
-
-std::unique_ptr<FrameGenerator> FrameGenerator::CreateSquareGenerator(
-    int width,
-    int height) {
-  return std::unique_ptr<FrameGenerator>(new SquareGenerator(width, height));
-}
-
-std::unique_ptr<FrameGenerator> FrameGenerator::CreateSlideGenerator(
-    int width, int height, int frame_repeat_count) {
-  return std::unique_ptr<FrameGenerator>(new SlideGenerator(
-      width, height, frame_repeat_count));
-}
-
-std::unique_ptr<FrameGenerator> FrameGenerator::CreateFromYuvFile(
-    std::vector<std::string> filenames,
-    size_t width,
-    size_t height,
-    int frame_repeat_count) {
-  RTC_DCHECK(!filenames.empty());
-  std::vector<FILE*> files;
-  for (const std::string& filename : filenames) {
-    FILE* file = fopen(filename.c_str(), "rb");
-    RTC_DCHECK(file != nullptr);
-    files.push_back(file);
-  }
-
-  return std::unique_ptr<FrameGenerator>(
-      new YuvFileGenerator(files, width, height, frame_repeat_count));
-}
-
-std::unique_ptr<FrameGenerator>
-FrameGenerator::CreateScrollingInputFromYuvFiles(
-    Clock* clock,
-    std::vector<std::string> filenames,
-    size_t source_width,
-    size_t source_height,
-    size_t target_width,
-    size_t target_height,
-    int64_t scroll_time_ms,
-    int64_t pause_time_ms) {
-  RTC_DCHECK(!filenames.empty());
-  std::vector<FILE*> files;
-  for (const std::string& filename : filenames) {
-    FILE* file = fopen(filename.c_str(), "rb");
-    RTC_DCHECK(file != nullptr);
-    files.push_back(file);
-  }
-
-  return std::unique_ptr<FrameGenerator>(new ScrollingImageFrameGenerator(
-      clock, files, source_width, source_height, target_width, target_height,
-      scroll_time_ms, pause_time_ms));
-}
-
-}  // namespace test
-}  // namespace webrtc
diff --git a/test/frame_generator.h b/test/frame_generator.h
deleted file mode 100644
index d42f226..0000000
--- a/test/frame_generator.h
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- *  Copyright (c) 2013 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_TEST_FRAME_GENERATOR_H_
-#define WEBRTC_TEST_FRAME_GENERATOR_H_
-
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "webrtc/api/video/video_frame.h"
-#include "webrtc/media/base/videosourceinterface.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-class Clock;
-namespace test {
-
-// FrameForwarder can be used as an implementation
-// of rtc::VideoSourceInterface<VideoFrame> where the caller controls when
-// a frame should be forwarded to its sink.
-// Currently this implementation only support one sink.
-class FrameForwarder : public rtc::VideoSourceInterface<VideoFrame> {
- public:
-  FrameForwarder();
-  virtual ~FrameForwarder();
-  // Forwards |video_frame| to the registered |sink_|.
-  virtual void IncomingCapturedFrame(const VideoFrame& video_frame);
-  rtc::VideoSinkWants sink_wants() const;
-  bool has_sinks() const;
-
- protected:
-  void AddOrUpdateSink(rtc::VideoSinkInterface<VideoFrame>* sink,
-                       const rtc::VideoSinkWants& wants) override;
-  void RemoveSink(rtc::VideoSinkInterface<VideoFrame>* sink) override;
-
-  rtc::CriticalSection crit_;
-  rtc::VideoSinkInterface<VideoFrame>* sink_ RTC_GUARDED_BY(crit_);
-  rtc::VideoSinkWants sink_wants_ RTC_GUARDED_BY(crit_);
-};
-
-class FrameGenerator {
- public:
-  virtual ~FrameGenerator() = default;
-
-  // Returns video frame that remains valid until next call.
-  virtual VideoFrame* NextFrame() = 0;
-
-  // Change the capture resolution.
-  virtual void ChangeResolution(size_t width, size_t height) {
-    RTC_NOTREACHED();
-  }
-
-  // Creates a frame generator that produces frames with small squares that
-  // move randomly towards the lower right corner.
-  static std::unique_ptr<FrameGenerator> CreateSquareGenerator(int width,
-                                                               int height);
-
-  // Creates a frame generator that repeatedly plays a set of yuv files.
-  // The frame_repeat_count determines how many times each frame is shown,
-  // with 1 = show each frame once, etc.
-  static std::unique_ptr<FrameGenerator> CreateFromYuvFile(
-      std::vector<std::string> files,
-      size_t width,
-      size_t height,
-      int frame_repeat_count);
-
-  // Creates a frame generator which takes a set of yuv files (wrapping a
-  // frame generator created by CreateFromYuvFile() above), but outputs frames
-  // that have been cropped to specified resolution: source_width/source_height
-  // is the size of the source images, target_width/target_height is the size of
-  // the cropped output. For each source image read, the cropped viewport will
-  // be scrolled top to bottom/left to right for scroll_tim_ms milliseconds.
-  // After that the image will stay in place for pause_time_ms milliseconds,
-  // and then this will be repeated with the next file from the input set.
-  static std::unique_ptr<FrameGenerator> CreateScrollingInputFromYuvFiles(
-      Clock* clock,
-      std::vector<std::string> filenames,
-      size_t source_width,
-      size_t source_height,
-      size_t target_width,
-      size_t target_height,
-      int64_t scroll_time_ms,
-      int64_t pause_time_ms);
-
-  // Creates a frame generator that produces randomly generated slides.
-  // frame_repeat_count determines how many times each slide is shown.
-  static std::unique_ptr<FrameGenerator> CreateSlideGenerator(
-      int width, int height, int frame_repeat_count);
-};
-}  // namespace test
-}  // namespace webrtc
-
-#endif  // WEBRTC_TEST_FRAME_GENERATOR_H_
diff --git a/test/frame_generator_capturer.cc b/test/frame_generator_capturer.cc
deleted file mode 100644
index 095a204..0000000
--- a/test/frame_generator_capturer.cc
+++ /dev/null
@@ -1,259 +0,0 @@
-/*
- *  Copyright (c) 2013 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/test/frame_generator_capturer.h"
-
-#include <utility>
-#include <vector>
-
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/platform_thread.h"
-#include "webrtc/rtc_base/task_queue.h"
-#include "webrtc/rtc_base/timeutils.h"
-#include "webrtc/system_wrappers/include/clock.h"
-#include "webrtc/test/frame_generator.h"
-#include "webrtc/call/video_send_stream.h"
-
-namespace webrtc {
-namespace test {
-
-class FrameGeneratorCapturer::InsertFrameTask : public rtc::QueuedTask {
- public:
-  // Repeats in |repeat_interval_ms|. One-time if |repeat_interval_ms| == 0.
-  InsertFrameTask(
-      webrtc::test::FrameGeneratorCapturer* frame_generator_capturer,
-      uint32_t repeat_interval_ms)
-      : frame_generator_capturer_(frame_generator_capturer),
-        repeat_interval_ms_(repeat_interval_ms),
-        intended_run_time_ms_(-1) {}
-
- private:
-  bool Run() override {
-    bool task_completed = true;
-    if (repeat_interval_ms_ > 0) {
-      // This is not a one-off frame. Check if the frame interval for this
-      // task queue is the same same as the current configured frame rate.
-      uint32_t current_interval_ms =
-          1000 / frame_generator_capturer_->GetCurrentConfiguredFramerate();
-      if (repeat_interval_ms_ != current_interval_ms) {
-        // Frame rate has changed since task was started, create a new instance.
-        rtc::TaskQueue::Current()->PostDelayedTask(
-            std::unique_ptr<rtc::QueuedTask>(new InsertFrameTask(
-                frame_generator_capturer_, current_interval_ms)),
-            current_interval_ms);
-      } else {
-        // Schedule the next frame capture event to happen at approximately the
-        // correct absolute time point.
-        int64_t delay_ms;
-        int64_t time_now_ms = rtc::TimeMillis();
-        if (intended_run_time_ms_ > 0) {
-          delay_ms = time_now_ms - intended_run_time_ms_;
-        } else {
-          delay_ms = 0;
-          intended_run_time_ms_ = time_now_ms;
-        }
-        intended_run_time_ms_ += repeat_interval_ms_;
-        if (delay_ms < repeat_interval_ms_) {
-          rtc::TaskQueue::Current()->PostDelayedTask(
-              std::unique_ptr<rtc::QueuedTask>(this),
-              repeat_interval_ms_ - delay_ms);
-        } else {
-          rtc::TaskQueue::Current()->PostDelayedTask(
-              std::unique_ptr<rtc::QueuedTask>(this), 0);
-          LOG(LS_ERROR)
-              << "Frame Generator Capturer can't keep up with requested fps";
-        }
-        // Repost of this instance, make sure it is not deleted.
-        task_completed = false;
-      }
-    }
-    frame_generator_capturer_->InsertFrame();
-    // Task should be deleted only if it's not repeating.
-    return task_completed;
-  }
-
-  webrtc::test::FrameGeneratorCapturer* const frame_generator_capturer_;
-  const uint32_t repeat_interval_ms_;
-  int64_t intended_run_time_ms_;
-};
-
-FrameGeneratorCapturer* FrameGeneratorCapturer::Create(int width,
-                                                       int height,
-                                                       int target_fps,
-                                                       Clock* clock) {
-  std::unique_ptr<FrameGeneratorCapturer> capturer(new FrameGeneratorCapturer(
-      clock, FrameGenerator::CreateSquareGenerator(width, height), target_fps));
-  if (!capturer->Init())
-    return nullptr;
-
-  return capturer.release();
-}
-
-FrameGeneratorCapturer* FrameGeneratorCapturer::CreateFromYuvFile(
-    const std::string& file_name,
-    size_t width,
-    size_t height,
-    int target_fps,
-    Clock* clock) {
-  std::unique_ptr<FrameGeneratorCapturer> capturer(new FrameGeneratorCapturer(
-      clock,
-      FrameGenerator::CreateFromYuvFile(std::vector<std::string>(1, file_name),
-                                        width, height, 1),
-      target_fps));
-  if (!capturer->Init())
-    return nullptr;
-
-  return capturer.release();
-}
-
-FrameGeneratorCapturer* FrameGeneratorCapturer::CreateSlideGenerator(
-    int width,
-    int height,
-    int frame_repeat_count,
-    int target_fps,
-    Clock* clock) {
-  std::unique_ptr<FrameGeneratorCapturer> capturer(new FrameGeneratorCapturer(
-      clock, FrameGenerator::CreateSlideGenerator(width, height,
-                                                  frame_repeat_count),
-      target_fps));
-  if (!capturer->Init())
-    return nullptr;
-
-  return capturer.release();
-}
-
-FrameGeneratorCapturer::FrameGeneratorCapturer(
-    Clock* clock,
-    std::unique_ptr<FrameGenerator> frame_generator,
-    int target_fps)
-    : clock_(clock),
-      sending_(false),
-      sink_(nullptr),
-      sink_wants_observer_(nullptr),
-      frame_generator_(std::move(frame_generator)),
-      target_fps_(target_fps),
-      first_frame_capture_time_(-1),
-      task_queue_("FrameGenCapQ",
-                  rtc::TaskQueue::Priority::HIGH) {
-  RTC_DCHECK(frame_generator_);
-  RTC_DCHECK_GT(target_fps, 0);
-}
-
-FrameGeneratorCapturer::~FrameGeneratorCapturer() {
-  Stop();
-}
-
-void FrameGeneratorCapturer::SetFakeRotation(VideoRotation rotation) {
-  rtc::CritScope cs(&lock_);
-  fake_rotation_ = rotation;
-}
-
-bool FrameGeneratorCapturer::Init() {
-  // This check is added because frame_generator_ might be file based and should
-  // not crash because a file moved.
-  if (frame_generator_.get() == nullptr)
-    return false;
-
-  int framerate_fps = GetCurrentConfiguredFramerate();
-  task_queue_.PostDelayedTask(
-      std::unique_ptr<rtc::QueuedTask>(
-          new InsertFrameTask(this, 1000 / framerate_fps)),
-      1000 / framerate_fps);
-
-  return true;
-}
-
-void FrameGeneratorCapturer::InsertFrame() {
-  rtc::CritScope cs(&lock_);
-  if (sending_) {
-    VideoFrame* frame = frame_generator_->NextFrame();
-    frame->set_timestamp_us(clock_->TimeInMicroseconds());
-    frame->set_ntp_time_ms(clock_->CurrentNtpInMilliseconds());
-    frame->set_rotation(fake_rotation_);
-    if (first_frame_capture_time_ == -1) {
-      first_frame_capture_time_ = frame->ntp_time_ms();
-    }
-
-    if (sink_) {
-      rtc::Optional<VideoFrame> out_frame = AdaptFrame(*frame);
-      if (out_frame)
-        sink_->OnFrame(*out_frame);
-    }
-  }
-}
-
-void FrameGeneratorCapturer::Start() {
-  rtc::CritScope cs(&lock_);
-  sending_ = true;
-}
-
-void FrameGeneratorCapturer::Stop() {
-  rtc::CritScope cs(&lock_);
-  sending_ = false;
-}
-
-void FrameGeneratorCapturer::ChangeResolution(size_t width, size_t height) {
-  rtc::CritScope cs(&lock_);
-  frame_generator_->ChangeResolution(width, height);
-}
-
-void FrameGeneratorCapturer::SetSinkWantsObserver(SinkWantsObserver* observer) {
-  rtc::CritScope cs(&lock_);
-  RTC_DCHECK(!sink_wants_observer_);
-  sink_wants_observer_ = observer;
-}
-
-void FrameGeneratorCapturer::AddOrUpdateSink(
-    rtc::VideoSinkInterface<VideoFrame>* sink,
-    const rtc::VideoSinkWants& wants) {
-  rtc::CritScope cs(&lock_);
-  RTC_CHECK(!sink_ || sink_ == sink);
-  sink_ = sink;
-  if (sink_wants_observer_)
-    sink_wants_observer_->OnSinkWantsChanged(sink, wants);
-
-  // Handle framerate within this class, just pass on resolution for possible
-  // adaptation.
-  rtc::VideoSinkWants resolution_wants = wants;
-  resolution_wants.max_framerate_fps = std::numeric_limits<int>::max();
-  VideoCapturer::AddOrUpdateSink(sink, resolution_wants);
-
-  // Ignore any requests for framerate higher than initially configured.
-  if (wants.max_framerate_fps < target_fps_) {
-    wanted_fps_.emplace(wants.max_framerate_fps);
-  } else {
-    wanted_fps_.reset();
-  }
-}
-
-void FrameGeneratorCapturer::RemoveSink(
-    rtc::VideoSinkInterface<VideoFrame>* sink) {
-  rtc::CritScope cs(&lock_);
-  RTC_CHECK(sink_ == sink);
-  sink_ = nullptr;
-}
-
-void FrameGeneratorCapturer::ForceFrame() {
-  // One-time non-repeating task,
-  // therefore repeat_interval_ms is 0 in InsertFrameTask()
-  task_queue_.PostTask(
-      std::unique_ptr<rtc::QueuedTask>(new InsertFrameTask(this, 0)));
-}
-
-int FrameGeneratorCapturer::GetCurrentConfiguredFramerate() {
-  rtc::CritScope cs(&lock_);
-  if (wanted_fps_ && *wanted_fps_ < target_fps_)
-    return *wanted_fps_;
-  return target_fps_;
-}
-
-}  // namespace test
-}  // namespace webrtc
diff --git a/test/frame_generator_capturer.h b/test/frame_generator_capturer.h
deleted file mode 100644
index 8f3232c..0000000
--- a/test/frame_generator_capturer.h
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- *  Copyright (c) 2013 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_TEST_FRAME_GENERATOR_CAPTURER_H_
-#define WEBRTC_TEST_FRAME_GENERATOR_CAPTURER_H_
-
-#include <memory>
-#include <string>
-
-#include "webrtc/api/video/video_frame.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/task_queue.h"
-#include "webrtc/test/video_capturer.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-class EventTimerWrapper;
-
-namespace test {
-
-class FrameGenerator;
-
-class FrameGeneratorCapturer : public VideoCapturer {
- public:
-  class SinkWantsObserver {
-   public:
-    // OnSinkWantsChanged is called when FrameGeneratorCapturer::AddOrUpdateSink
-    // is called.
-    virtual void OnSinkWantsChanged(rtc::VideoSinkInterface<VideoFrame>* sink,
-                                    const rtc::VideoSinkWants& wants) = 0;
-
-   protected:
-    virtual ~SinkWantsObserver() {}
-  };
-
-  static FrameGeneratorCapturer* Create(int width,
-                                        int height,
-                                        int target_fps,
-                                        Clock* clock);
-
-  static FrameGeneratorCapturer* CreateFromYuvFile(const std::string& file_name,
-                                                   size_t width,
-                                                   size_t height,
-                                                   int target_fps,
-                                                   Clock* clock);
-
-  static FrameGeneratorCapturer* CreateSlideGenerator(int width,
-                                                      int height,
-                                                      int frame_repeat_count,
-                                                      int target_fps,
-                                                      Clock* clock);
-  virtual ~FrameGeneratorCapturer();
-
-  void Start() override;
-  void Stop() override;
-  void ChangeResolution(size_t width, size_t height);
-
-  void SetSinkWantsObserver(SinkWantsObserver* observer);
-
-  void AddOrUpdateSink(rtc::VideoSinkInterface<VideoFrame>* sink,
-                       const rtc::VideoSinkWants& wants) override;
-  void RemoveSink(rtc::VideoSinkInterface<VideoFrame>* sink) override;
-
-  void ForceFrame();
-  void SetFakeRotation(VideoRotation rotation);
-
-  int64_t first_frame_capture_time() const { return first_frame_capture_time_; }
-
-  FrameGeneratorCapturer(Clock* clock,
-                         std::unique_ptr<FrameGenerator> frame_generator,
-                         int target_fps);
-  bool Init();
-
- private:
-  class InsertFrameTask;
-
-  void InsertFrame();
-  static bool Run(void* obj);
-  int GetCurrentConfiguredFramerate();
-
-  Clock* const clock_;
-  bool sending_;
-  rtc::VideoSinkInterface<VideoFrame>* sink_ RTC_GUARDED_BY(&lock_);
-  SinkWantsObserver* sink_wants_observer_ RTC_GUARDED_BY(&lock_);
-
-  rtc::CriticalSection lock_;
-  std::unique_ptr<FrameGenerator> frame_generator_;
-
-  int target_fps_ RTC_GUARDED_BY(&lock_);
-  rtc::Optional<int> wanted_fps_ RTC_GUARDED_BY(&lock_);
-  VideoRotation fake_rotation_ = kVideoRotation_0;
-
-  int64_t first_frame_capture_time_;
-  // Must be the last field, so it will be deconstructed first as tasks
-  // in the TaskQueue access other fields of the instance of this class.
-  rtc::TaskQueue task_queue_;
-};
-}  // namespace test
-}  // namespace webrtc
-
-#endif  // WEBRTC_TEST_FRAME_GENERATOR_CAPTURER_H_
diff --git a/test/frame_generator_unittest.cc b/test/frame_generator_unittest.cc
deleted file mode 100644
index 79e7b63..0000000
--- a/test/frame_generator_unittest.cc
+++ /dev/null
@@ -1,189 +0,0 @@
-/*
- *  Copyright (c) 2015 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 <stdio.h>
-
-#include <memory>
-#include <string>
-
-#include "webrtc/test/frame_generator.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/testsupport/fileutils.h"
-
-namespace webrtc {
-namespace test {
-
-static const int kFrameWidth = 4;
-static const int kFrameHeight = 4;
-
-class FrameGeneratorTest : public ::testing::Test {
- public:
-  void SetUp() override {
-    two_frame_filename_ =
-        test::TempFilename(test::OutputPath(), "2_frame_yuv_file");
-    one_frame_filename_ =
-        test::TempFilename(test::OutputPath(), "1_frame_yuv_file");
-
-    FILE* file = fopen(two_frame_filename_.c_str(), "wb");
-    WriteYuvFile(file, 0, 0, 0);
-    WriteYuvFile(file, 127, 127, 127);
-    fclose(file);
-    file = fopen(one_frame_filename_.c_str(), "wb");
-    WriteYuvFile(file, 255, 255, 255);
-    fclose(file);
-  }
-  void TearDown() override {
-    remove(one_frame_filename_.c_str());
-    remove(two_frame_filename_.c_str());
-  }
-
- protected:
-  void WriteYuvFile(FILE* file, uint8_t y, uint8_t u, uint8_t v) {
-    assert(file);
-    std::unique_ptr<uint8_t[]> plane_buffer(new uint8_t[y_size]);
-    memset(plane_buffer.get(), y, y_size);
-    fwrite(plane_buffer.get(), 1, y_size, file);
-    memset(plane_buffer.get(), u, uv_size);
-    fwrite(plane_buffer.get(), 1, uv_size, file);
-    memset(plane_buffer.get(), v, uv_size);
-    fwrite(plane_buffer.get(), 1, uv_size, file);
-  }
-
-  void CheckFrameAndMutate(VideoFrame* frame, uint8_t y, uint8_t u, uint8_t v) {
-    // Check that frame is valid, has the correct color and timestamp are clean.
-    ASSERT_NE(nullptr, frame);
-    rtc::scoped_refptr<I420BufferInterface> i420_buffer =
-        frame->video_frame_buffer()->ToI420();
-    const uint8_t* buffer;
-    buffer = i420_buffer->DataY();
-    for (int i = 0; i < y_size; ++i)
-      ASSERT_EQ(y, buffer[i]);
-    buffer = i420_buffer->DataU();
-    for (int i = 0; i < uv_size; ++i)
-      ASSERT_EQ(u, buffer[i]);
-    buffer = i420_buffer->DataV();
-    for (int i = 0; i < uv_size; ++i)
-      ASSERT_EQ(v, buffer[i]);
-    EXPECT_EQ(0, frame->ntp_time_ms());
-    EXPECT_EQ(0, frame->render_time_ms());
-    EXPECT_EQ(0u, frame->timestamp());
-
-    // Mutate to something arbitrary non-zero.
-    frame->set_ntp_time_ms(11);
-    frame->set_timestamp_us(12);
-    frame->set_timestamp(13);
-  }
-
-  uint64_t Hash(VideoFrame* frame) {
-    // Generate a 64-bit hash from the frame's buffer.
-    uint64_t hash = 19;
-    rtc::scoped_refptr<I420BufferInterface> i420_buffer =
-        frame->video_frame_buffer()->ToI420();
-    const uint8_t* buffer = i420_buffer->DataY();
-    for (int i = 0; i < y_size; ++i) {
-      hash = (37 * hash) + buffer[i];
-    }
-    buffer = i420_buffer->DataU();
-    for (int i = 0; i < uv_size; ++i) {
-      hash = (37 * hash) + buffer[i];
-    }
-    buffer = i420_buffer->DataV();
-    for (int i = 0; i < uv_size; ++i) {
-      hash = (37 * hash) + buffer[i];
-    }
-    return hash;
-  }
-
-  std::string two_frame_filename_;
-  std::string one_frame_filename_;
-  const int y_size = kFrameWidth * kFrameHeight;
-  const int uv_size = ((kFrameHeight + 1) / 2) * ((kFrameWidth + 1) / 2);
-};
-
-TEST_F(FrameGeneratorTest, SingleFrameFile) {
-  std::unique_ptr<FrameGenerator> generator(FrameGenerator::CreateFromYuvFile(
-      std::vector<std::string>(1, one_frame_filename_), kFrameWidth,
-      kFrameHeight, 1));
-  CheckFrameAndMutate(generator->NextFrame(), 255, 255, 255);
-  CheckFrameAndMutate(generator->NextFrame(), 255, 255, 255);
-}
-
-TEST_F(FrameGeneratorTest, TwoFrameFile) {
-  std::unique_ptr<FrameGenerator> generator(FrameGenerator::CreateFromYuvFile(
-      std::vector<std::string>(1, two_frame_filename_), kFrameWidth,
-      kFrameHeight, 1));
-  CheckFrameAndMutate(generator->NextFrame(), 0, 0, 0);
-  CheckFrameAndMutate(generator->NextFrame(), 127, 127, 127);
-  CheckFrameAndMutate(generator->NextFrame(), 0, 0, 0);
-}
-
-TEST_F(FrameGeneratorTest, MultipleFrameFiles) {
-  std::vector<std::string> files;
-  files.push_back(two_frame_filename_);
-  files.push_back(one_frame_filename_);
-
-  std::unique_ptr<FrameGenerator> generator(
-      FrameGenerator::CreateFromYuvFile(files, kFrameWidth, kFrameHeight, 1));
-  CheckFrameAndMutate(generator->NextFrame(), 0, 0, 0);
-  CheckFrameAndMutate(generator->NextFrame(), 127, 127, 127);
-  CheckFrameAndMutate(generator->NextFrame(), 255, 255, 255);
-  CheckFrameAndMutate(generator->NextFrame(), 0, 0, 0);
-}
-
-TEST_F(FrameGeneratorTest, TwoFrameFileWithRepeat) {
-  const int kRepeatCount = 3;
-  std::unique_ptr<FrameGenerator> generator(FrameGenerator::CreateFromYuvFile(
-      std::vector<std::string>(1, two_frame_filename_), kFrameWidth,
-      kFrameHeight, kRepeatCount));
-  for (int i = 0; i < kRepeatCount; ++i)
-    CheckFrameAndMutate(generator->NextFrame(), 0, 0, 0);
-  for (int i = 0; i < kRepeatCount; ++i)
-    CheckFrameAndMutate(generator->NextFrame(), 127, 127, 127);
-  CheckFrameAndMutate(generator->NextFrame(), 0, 0, 0);
-}
-
-TEST_F(FrameGeneratorTest, MultipleFrameFilesWithRepeat) {
-  const int kRepeatCount = 3;
-  std::vector<std::string> files;
-  files.push_back(two_frame_filename_);
-  files.push_back(one_frame_filename_);
-  std::unique_ptr<FrameGenerator> generator(FrameGenerator::CreateFromYuvFile(
-      files, kFrameWidth, kFrameHeight, kRepeatCount));
-  for (int i = 0; i < kRepeatCount; ++i)
-    CheckFrameAndMutate(generator->NextFrame(), 0, 0, 0);
-  for (int i = 0; i < kRepeatCount; ++i)
-    CheckFrameAndMutate(generator->NextFrame(), 127, 127, 127);
-  for (int i = 0; i < kRepeatCount; ++i)
-    CheckFrameAndMutate(generator->NextFrame(), 255, 255, 255);
-  CheckFrameAndMutate(generator->NextFrame(), 0, 0, 0);
-}
-
-TEST_F(FrameGeneratorTest, SlideGenerator) {
-  const int kGenCount = 9;
-  const int kRepeatCount = 3;
-  std::unique_ptr<FrameGenerator> generator(
-      FrameGenerator::CreateSlideGenerator(
-          kFrameWidth, kFrameHeight, kRepeatCount));
-  uint64_t hashes[kGenCount];
-  for (int i = 0; i < kGenCount; ++i) {
-    hashes[i] = Hash(generator->NextFrame());
-  }
-  // Check that the buffer changes only every |kRepeatCount| frames.
-  for (int i = 1; i < kGenCount; ++i) {
-    if (i % kRepeatCount == 0) {
-      EXPECT_NE(hashes[i-1], hashes[i]);
-    } else {
-      EXPECT_EQ(hashes[i-1], hashes[i]);
-    }
-  }
-}
-
-}  // namespace test
-}  // namespace webrtc
diff --git a/test/frame_utils.cc b/test/frame_utils.cc
deleted file mode 100644
index bc8ec4b..0000000
--- a/test/frame_utils.cc
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- *  Copyright (c) 2013 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 <stdio.h>
-#include <string.h>
-
-#include "webrtc/api/video/i420_buffer.h"
-#include "webrtc/api/video/video_frame.h"
-#include "webrtc/test/frame_utils.h"
-
-namespace webrtc {
-namespace test {
-
-bool EqualPlane(const uint8_t* data1,
-                const uint8_t* data2,
-                int stride1,
-                int stride2,
-                int width,
-                int height) {
-  for (int y = 0; y < height; ++y) {
-    if (memcmp(data1, data2, width) != 0)
-      return false;
-    data1 += stride1;
-    data2 += stride2;
-  }
-  return true;
-}
-
-bool FramesEqual(const webrtc::VideoFrame& f1, const webrtc::VideoFrame& f2) {
-  if (f1.timestamp() != f2.timestamp() ||
-      f1.ntp_time_ms() != f2.ntp_time_ms() ||
-      f1.render_time_ms() != f2.render_time_ms()) {
-    return false;
-  }
-  return FrameBufsEqual(f1.video_frame_buffer(), f2.video_frame_buffer());
-}
-
-bool FrameBufsEqual(const rtc::scoped_refptr<webrtc::VideoFrameBuffer>& f1,
-                    const rtc::scoped_refptr<webrtc::VideoFrameBuffer>& f2) {
-  if (f1 == f2) {
-    return true;
-  }
-  // Exlude nullptr (except if both are nullptr, as above)
-  if (!f1 || !f2) {
-    return false;
-  }
-
-  if (f1->width() != f2->width() || f1->height() != f2->height() ||
-      f1->type() != f2->type()) {
-    return false;
-  }
-
-  rtc::scoped_refptr<webrtc::I420BufferInterface> f1_i420 = f1->ToI420();
-  rtc::scoped_refptr<webrtc::I420BufferInterface> f2_i420 = f2->ToI420();
-  return EqualPlane(f1_i420->DataY(), f2_i420->DataY(),
-                    f1_i420->StrideY(), f2_i420->StrideY(),
-                    f1_i420->width(), f1_i420->height()) &&
-         EqualPlane(f1_i420->DataU(), f2_i420->DataU(),
-                    f1_i420->StrideU(), f2_i420->StrideU(),
-                    f1_i420->ChromaWidth(), f1_i420->ChromaHeight()) &&
-         EqualPlane(f1_i420->DataV(), f2_i420->DataV(),
-                    f1_i420->StrideV(), f2_i420->StrideV(),
-                    f1_i420->ChromaWidth(), f1_i420->ChromaHeight());
-}
-
-rtc::scoped_refptr<I420Buffer> ReadI420Buffer(int width, int height, FILE *f) {
-  int half_width = (width + 1) / 2;
-  rtc::scoped_refptr<I420Buffer> buffer(
-      // Explicit stride, no padding between rows.
-      I420Buffer::Create(width, height, width, half_width, half_width));
-  size_t size_y = static_cast<size_t>(width) * height;
-  size_t size_uv = static_cast<size_t>(half_width) * ((height + 1) / 2);
-
-  if (fread(buffer->MutableDataY(), 1, size_y, f) < size_y)
-    return nullptr;
-  if (fread(buffer->MutableDataU(), 1, size_uv, f) < size_uv)
-    return nullptr;
-  if (fread(buffer->MutableDataV(), 1, size_uv, f) < size_uv)
-    return nullptr;
-  return buffer;
-}
-
-}  // namespace test
-}  // namespace webrtc
diff --git a/test/frame_utils.h b/test/frame_utils.h
deleted file mode 100644
index 4953db4..0000000
--- a/test/frame_utils.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- *  Copyright (c) 2013 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_TEST_FRAME_UTILS_H_
-#define WEBRTC_TEST_FRAME_UTILS_H_
-
-#include <stdint.h>
-
-#include "webrtc/rtc_base/scoped_ref_ptr.h"
-
-namespace webrtc {
-class I420Buffer;
-class VideoFrame;
-class VideoFrameBuffer;
-namespace test {
-
-bool EqualPlane(const uint8_t* data1,
-                const uint8_t* data2,
-                int stride1,
-                int stride2,
-                int width,
-                int height);
-
-static inline bool EqualPlane(const uint8_t* data1,
-                              const uint8_t* data2,
-                              int stride,
-                              int width,
-                              int height) {
-  return EqualPlane(data1, data2, stride, stride, width, height);
-}
-
-bool FramesEqual(const webrtc::VideoFrame& f1, const webrtc::VideoFrame& f2);
-
-bool FrameBufsEqual(const rtc::scoped_refptr<webrtc::VideoFrameBuffer>& f1,
-                    const rtc::scoped_refptr<webrtc::VideoFrameBuffer>& f2);
-
-rtc::scoped_refptr<I420Buffer> ReadI420Buffer(int width, int height, FILE *);
-
-}  // namespace test
-}  // namespace webrtc
-
-#endif  // WEBRTC_TEST_FRAME_UTILS_H_
diff --git a/test/fuzzers/BUILD.gn b/test/fuzzers/BUILD.gn
deleted file mode 100644
index 6035cd9..0000000
--- a/test/fuzzers/BUILD.gn
+++ /dev/null
@@ -1,378 +0,0 @@
-# Copyright (c) 2015 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.
-
-import("../../webrtc.gni")
-import("//build/config/features.gni")
-import("//testing/libfuzzer/fuzzer_test.gni")
-
-rtc_static_library("webrtc_fuzzer_main") {
-  sources = [
-    "webrtc_fuzzer_main.cc",
-  ]
-  deps = [
-    "../../rtc_base:rtc_base_approved",
-    "../../system_wrappers:field_trial_default",
-    "../../system_wrappers:metrics_default",
-    "//testing/libfuzzer:libfuzzer_main",
-  ]
-}
-
-template("webrtc_fuzzer_test") {
-  fuzzer_test(target_name) {
-    forward_variables_from(invoker, "*")
-    deps += [ ":webrtc_fuzzer_main" ]
-    if (!build_with_chromium && is_clang) {
-      # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-      suppressed_configs = [ "//build/config/clang:find_bad_constructs" ]
-    }
-  }
-}
-
-webrtc_fuzzer_test("h264_depacketizer_fuzzer") {
-  sources = [
-    "h264_depacketizer_fuzzer.cc",
-  ]
-  deps = [
-    "../../modules/rtp_rtcp",
-  ]
-}
-
-webrtc_fuzzer_test("vp8_depacketizer_fuzzer") {
-  sources = [
-    "vp8_depacketizer_fuzzer.cc",
-  ]
-  deps = [
-    "../../modules/rtp_rtcp",
-  ]
-}
-
-webrtc_fuzzer_test("vp9_depacketizer_fuzzer") {
-  sources = [
-    "vp9_depacketizer_fuzzer.cc",
-  ]
-  deps = [
-    "../../modules/rtp_rtcp",
-  ]
-}
-
-webrtc_fuzzer_test("vp8_qp_parser_fuzzer") {
-  sources = [
-    "vp8_qp_parser_fuzzer.cc",
-  ]
-  deps = [
-    "../../modules/video_coding:video_coding_utility",
-    "../../modules/video_coding/",
-  ]
-}
-
-webrtc_fuzzer_test("vp9_qp_parser_fuzzer") {
-  sources = [
-    "vp9_qp_parser_fuzzer.cc",
-  ]
-  deps = [
-    "../../modules/video_coding:video_coding_utility",
-    "../../modules/video_coding/",
-  ]
-}
-
-webrtc_fuzzer_test("h264_bitstream_parser_fuzzer") {
-  sources = [
-    "h264_bitstream_parser_fuzzer.cc",
-  ]
-  deps = [
-    "../../common_video",
-    "../../modules/video_coding/",
-  ]
-}
-
-webrtc_fuzzer_test("flexfec_header_reader_fuzzer") {
-  sources = [
-    "flexfec_header_reader_fuzzer.cc",
-  ]
-  deps = [
-    "../../modules/rtp_rtcp",
-    "../../rtc_base:rtc_base_approved",
-  ]
-}
-
-webrtc_fuzzer_test("flexfec_sender_fuzzer") {
-  sources = [
-    "flexfec_sender_fuzzer.cc",
-  ]
-  deps = [
-    "../../modules/rtp_rtcp",
-    "../../system_wrappers",
-  ]
-  libfuzzer_options = [ "max_len=200" ]
-}
-
-webrtc_fuzzer_test("ulpfec_header_reader_fuzzer") {
-  sources = [
-    "ulpfec_header_reader_fuzzer.cc",
-  ]
-  deps = [
-    "../../modules/rtp_rtcp",
-    "../../modules/rtp_rtcp:fec_test_helper",
-    "../../rtc_base:rtc_base_approved",
-  ]
-}
-
-webrtc_fuzzer_test("ulpfec_generator_fuzzer") {
-  sources = [
-    "ulpfec_generator_fuzzer.cc",
-  ]
-  deps = [
-    "../../modules/rtp_rtcp",
-    "../../modules/rtp_rtcp:fec_test_helper",
-    "../../rtc_base:rtc_base_approved",
-  ]
-}
-
-webrtc_fuzzer_test("flexfec_receiver_fuzzer") {
-  sources = [
-    "flexfec_receiver_fuzzer.cc",
-  ]
-  deps = [
-    "../../modules/rtp_rtcp",
-    "../../rtc_base:rtc_base_approved",
-  ]
-  libfuzzer_options = [ "max_len=2000" ]
-}
-
-webrtc_fuzzer_test("packet_buffer_fuzzer") {
-  sources = [
-    "packet_buffer_fuzzer.cc",
-  ]
-  deps = [
-    "../../modules/video_coding/",
-    "../../system_wrappers",
-  ]
-  libfuzzer_options = [ "max_len=2000" ]
-}
-
-webrtc_fuzzer_test("rtcp_receiver_fuzzer") {
-  sources = [
-    "rtcp_receiver_fuzzer.cc",
-  ]
-  deps = [
-    "../../modules/rtp_rtcp",
-    "../../rtc_base:rtc_base_approved",
-    "../../system_wrappers:system_wrappers",
-  ]
-  seed_corpus = "corpora/rtcp-corpus"
-}
-
-webrtc_fuzzer_test("rtp_packet_fuzzer") {
-  sources = [
-    "rtp_packet_fuzzer.cc",
-  ]
-  deps = [
-    "../../modules/rtp_rtcp",
-  ]
-  seed_corpus = "corpora/rtp-corpus"
-}
-
-webrtc_fuzzer_test("rtp_header_fuzzer") {
-  sources = [
-    "rtp_header_fuzzer.cc",
-  ]
-  deps = [
-    "../../modules/rtp_rtcp",
-  ]
-}
-
-webrtc_fuzzer_test("congestion_controller_feedback_fuzzer") {
-  sources = [
-    "congestion_controller_feedback_fuzzer.cc",
-  ]
-  deps = [
-    "../../logging:rtc_event_log_api",
-    "../../logging:rtc_event_log_impl",
-    "../../modules/congestion_controller",
-    "../../modules/pacing",
-    "../../modules/remote_bitrate_estimator:remote_bitrate_estimator",
-    "../../modules/rtp_rtcp",
-  ]
-}
-
-rtc_static_library("audio_decoder_fuzzer") {
-  sources = [
-    "audio_decoder_fuzzer.cc",
-    "audio_decoder_fuzzer.h",
-  ]
-  deps = [
-    "../..:webrtc_common",
-    "../../api:optional",
-    "../../api/audio_codecs:audio_codecs_api",
-    "../../modules/rtp_rtcp",
-    "../../rtc_base:rtc_base_approved",
-  ]
-}
-
-webrtc_fuzzer_test("audio_decoder_ilbc_fuzzer") {
-  sources = [
-    "audio_decoder_ilbc_fuzzer.cc",
-  ]
-  deps = [
-    ":audio_decoder_fuzzer",
-    "../../modules/audio_coding:ilbc",
-  ]
-}
-
-webrtc_fuzzer_test("audio_decoder_isac_fuzzer") {
-  sources = [
-    "audio_decoder_isac_fuzzer.cc",
-  ]
-  deps = [
-    ":audio_decoder_fuzzer",
-    "../../modules/audio_coding:isac",
-  ]
-}
-
-webrtc_fuzzer_test("audio_decoder_isac_incoming_packet_fuzzer") {
-  sources = [
-    "audio_decoder_isac_incoming_packet_fuzzer.cc",
-  ]
-  deps = [
-    ":audio_decoder_fuzzer",
-    "../../modules/audio_coding:isac",
-  ]
-}
-
-webrtc_fuzzer_test("audio_decoder_isacfix_fuzzer") {
-  sources = [
-    "audio_decoder_isacfix_fuzzer.cc",
-  ]
-  deps = [
-    ":audio_decoder_fuzzer",
-    "../../modules/audio_coding:isac_fix",
-  ]
-}
-
-webrtc_fuzzer_test("audio_decoder_opus_fuzzer") {
-  sources = [
-    "audio_decoder_opus_fuzzer.cc",
-  ]
-  deps = [
-    ":audio_decoder_fuzzer",
-    "../../modules/audio_coding:webrtc_opus",
-  ]
-}
-
-webrtc_fuzzer_test("audio_decoder_opus_redundant_fuzzer") {
-  sources = [
-    "audio_decoder_opus_redundant_fuzzer.cc",
-  ]
-  deps = [
-    ":audio_decoder_fuzzer",
-    "../../modules/audio_coding:webrtc_opus",
-  ]
-}
-
-webrtc_fuzzer_test("turn_unwrap_fuzzer") {
-  sources = [
-    "turn_unwrap_fuzzer.cc",
-  ]
-  deps = [
-    "../../media:media",
-  ]
-}
-
-webrtc_fuzzer_test("neteq_rtp_fuzzer") {
-  sources = [
-    "neteq_rtp_fuzzer.cc",
-  ]
-  deps = [
-    "../../api:array_view",
-    "../../modules/audio_coding:neteq",
-    "../../modules/audio_coding:neteq_test_tools",
-    "../../modules/audio_coding:neteq_tools_minimal",
-    "../../modules/audio_coding:pcm16b",
-    "../../modules/rtp_rtcp",
-    "../../rtc_base:rtc_base_approved",
-    "../../rtc_base:rtc_base_tests_utils",
-  ]
-}
-
-webrtc_fuzzer_test("residual_echo_detector_fuzzer") {
-  sources = [
-    "residual_echo_detector_fuzzer.cc",
-  ]
-  deps = [
-    "../../modules/audio_processing:audio_processing",
-    "../../rtc_base:rtc_base_approved",
-  ]
-}
-
-webrtc_fuzzer_test("sdp_parser_fuzzer") {
-  sources = [
-    "sdp_parser_fuzzer.cc",
-  ]
-  deps = [
-    "../../pc:libjingle_peerconnection",
-  ]
-  seed_corpus = "corpora/sdp-corpus"
-}
-
-webrtc_fuzzer_test("stun_parser_fuzzer") {
-  sources = [
-    "stun_parser_fuzzer.cc",
-  ]
-  deps = [
-    "../../p2p:rtc_p2p",
-  ]
-  seed_corpus = "corpora/stun-corpus"
-  dict = "corpora/stun.tokens"
-}
-
-webrtc_fuzzer_test("stun_validator_fuzzer") {
-  sources = [
-    "stun_validator_fuzzer.cc",
-  ]
-  deps = [
-    "../../p2p:rtc_p2p",
-  ]
-  seed_corpus = "corpora/stun-corpus"
-  dict = "corpora/stun.tokens"
-}
-
-webrtc_fuzzer_test("pseudotcp_parser_fuzzer") {
-  sources = [
-    "pseudotcp_parser_fuzzer.cc",
-  ]
-  deps = [
-    "../../p2p:rtc_p2p",
-    "../../rtc_base:rtc_base",
-  ]
-}
-
-webrtc_fuzzer_test("transport_feedback_packet_loss_tracker_fuzzer") {
-  sources = [
-    "transport_feedback_packet_loss_tracker_fuzzer.cc",
-  ]
-  deps = [
-    "../../api:array_view",
-    "../../modules/rtp_rtcp",
-    "../../rtc_base:rtc_base_approved",
-    "../../voice_engine",
-  ]
-}
-
-webrtc_fuzzer_test("audio_processing_fuzzer") {
-  sources = [
-    "audio_processing_fuzzer.cc",
-    "audio_processing_fuzzer.h",
-    "audio_processing_fuzzer_configs.cc",
-  ]
-  deps = [
-    "../../api:optional",
-    "../../modules:module_api",
-    "../../modules/audio_processing",
-    "../../rtc_base:rtc_base_approved",
-  ]
-}
diff --git a/test/fuzzers/DEPS b/test/fuzzers/DEPS
deleted file mode 100644
index cdbb566..0000000
--- a/test/fuzzers/DEPS
+++ /dev/null
@@ -1,3 +0,0 @@
-include_rules = [
-  "+webrtc",
-]
diff --git a/test/fuzzers/OWNERS b/test/fuzzers/OWNERS
deleted file mode 100644
index b12969a..0000000
--- a/test/fuzzers/OWNERS
+++ /dev/null
@@ -1,2 +0,0 @@
-pbos@webrtc.org
-henrik.lundin@webrtc.org
diff --git a/test/fuzzers/audio_decoder_fuzzer.cc b/test/fuzzers/audio_decoder_fuzzer.cc
deleted file mode 100644
index 441b12b..0000000
--- a/test/fuzzers/audio_decoder_fuzzer.cc
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- *  Copyright (c) 2015 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/test/fuzzers/audio_decoder_fuzzer.h"
-
-#include <limits>
-
-#include "webrtc/api/audio_codecs/audio_decoder.h"
-#include "webrtc/api/optional.h"
-#include "webrtc/modules/rtp_rtcp/source/byte_io.h"
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-namespace {
-template <typename T, unsigned int B = sizeof(T)>
-bool ParseInt(const uint8_t** data, size_t* remaining_size, T* value) {
-  static_assert(std::numeric_limits<T>::is_integer, "Type must be an integer.");
-  static_assert(sizeof(T) <= sizeof(uint64_t),
-                "Cannot read wider than uint64_t.");
-  static_assert(B <= sizeof(T), "T must be at least B bytes wide.");
-  if (B > *remaining_size)
-    return false;
-  uint64_t val = ByteReader<uint64_t, B>::ReadBigEndian(*data);
-  *data += B;
-  *remaining_size -= B;
-  *value = static_cast<T>(val);
-  return true;
-}
-}  // namespace
-
-// This function reads two bytes from the beginning of |data|, interprets them
-// as the first packet length, and reads this many bytes if available. The
-// payload is inserted into the decoder, and the process continues until no more
-// data is available. Either AudioDecoder::Decode or
-// AudioDecoder::DecodeRedundant is used, depending on the value of
-// |decode_type|.
-void FuzzAudioDecoder(DecoderFunctionType decode_type,
-                      const uint8_t* data,
-                      size_t size,
-                      AudioDecoder* decoder,
-                      int sample_rate_hz,
-                      size_t max_decoded_bytes,
-                      int16_t* decoded) {
-  const uint8_t* data_ptr = data;
-  size_t remaining_size = size;
-  size_t packet_len;
-  while (ParseInt<size_t, 2>(&data_ptr, &remaining_size, &packet_len) &&
-         packet_len <= remaining_size) {
-    AudioDecoder::SpeechType speech_type;
-    switch (decode_type) {
-      case DecoderFunctionType::kNormalDecode:
-        decoder->Decode(data_ptr, packet_len, sample_rate_hz, max_decoded_bytes,
-                        decoded, &speech_type);
-        break;
-      case DecoderFunctionType::kRedundantDecode:
-        decoder->DecodeRedundant(data_ptr, packet_len, sample_rate_hz,
-                                 max_decoded_bytes, decoded, &speech_type);
-        break;
-    }
-    data_ptr += packet_len;
-    remaining_size -= packet_len;
-  }
-}
-
-// This function is similar to FuzzAudioDecoder, but also reads fuzzed data into
-// RTP header values. The fuzzed data and values are sent to the decoder's
-// IncomingPacket method.
-void FuzzAudioDecoderIncomingPacket(const uint8_t* data,
-                                    size_t size,
-                                    AudioDecoder* decoder) {
-  const uint8_t* data_ptr = data;
-  size_t remaining_size = size;
-  size_t packet_len;
-  while (ParseInt<size_t, 2>(&data_ptr, &remaining_size, &packet_len)) {
-    uint16_t rtp_sequence_number;
-    if (!ParseInt(&data_ptr, &remaining_size, &rtp_sequence_number))
-      break;
-    uint32_t rtp_timestamp;
-    if (!ParseInt(&data_ptr, &remaining_size, &rtp_timestamp))
-      break;
-    uint32_t arrival_timestamp;
-    if (!ParseInt(&data_ptr, &remaining_size, &arrival_timestamp))
-      break;
-    if (remaining_size < packet_len)
-      break;
-    decoder->IncomingPacket(data_ptr, packet_len, rtp_sequence_number,
-                            rtp_timestamp, arrival_timestamp);
-    data_ptr += packet_len;
-    remaining_size -= packet_len;
-  }
-}
-}  // namespace webrtc
diff --git a/test/fuzzers/audio_decoder_fuzzer.h b/test/fuzzers/audio_decoder_fuzzer.h
deleted file mode 100644
index 29179eb..0000000
--- a/test/fuzzers/audio_decoder_fuzzer.h
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- *  Copyright (c) 2015 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_TEST_FUZZERS_AUDIO_DECODER_FUZZER_H_
-#define WEBRTC_TEST_FUZZERS_AUDIO_DECODER_FUZZER_H_
-
-#include <stddef.h>
-
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-class AudioDecoder;
-
-enum class DecoderFunctionType {
-  kNormalDecode,
-  kRedundantDecode,
-};
-
-void FuzzAudioDecoder(DecoderFunctionType decode_type,
-                      const uint8_t* data,
-                      size_t size,
-                      AudioDecoder* decoder,
-                      int sample_rate_hz,
-                      size_t max_decoded_bytes,
-                      int16_t* decoded);
-
-void FuzzAudioDecoderIncomingPacket(const uint8_t* data,
-                                    size_t size,
-                                    AudioDecoder* decoder);
-}  // namespace webrtc
-
-#endif  // WEBRTC_TEST_FUZZERS_AUDIO_DECODER_FUZZER_H_
diff --git a/test/fuzzers/audio_decoder_ilbc_fuzzer.cc b/test/fuzzers/audio_decoder_ilbc_fuzzer.cc
deleted file mode 100644
index fbc9d66..0000000
--- a/test/fuzzers/audio_decoder_ilbc_fuzzer.cc
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- *  Copyright (c) 2015 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/codecs/ilbc/audio_decoder_ilbc.h"
-#include "webrtc/test/fuzzers/audio_decoder_fuzzer.h"
-
-namespace webrtc {
-void FuzzOneInput(const uint8_t* data, size_t size) {
-  AudioDecoderIlbcImpl dec;
-  static const int kSampleRateHz = 8000;
-  static const size_t kAllocatedOuputSizeSamples = kSampleRateHz / 10;
-  int16_t output[kAllocatedOuputSizeSamples];
-  FuzzAudioDecoder(DecoderFunctionType::kNormalDecode, data, size, &dec,
-                   kSampleRateHz, sizeof(output), output);
-}
-}  // namespace webrtc
diff --git a/test/fuzzers/audio_decoder_isac_fuzzer.cc b/test/fuzzers/audio_decoder_isac_fuzzer.cc
deleted file mode 100644
index 1022776..0000000
--- a/test/fuzzers/audio_decoder_isac_fuzzer.cc
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- *  Copyright (c) 2015 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/codecs/isac/main/include/audio_decoder_isac.h"
-#include "webrtc/test/fuzzers/audio_decoder_fuzzer.h"
-
-namespace webrtc {
-void FuzzOneInput(const uint8_t* data, size_t size) {
-  const int sample_rate_hz = size % 2 == 0 ? 16000 : 32000;     // 16 or 32 kHz.
-  static const size_t kAllocatedOuputSizeSamples = 32000 / 10;  // 100 ms.
-  int16_t output[kAllocatedOuputSizeSamples];
-  AudioDecoderIsacFloatImpl dec(sample_rate_hz);
-  FuzzAudioDecoder(DecoderFunctionType::kNormalDecode, data, size, &dec,
-                   sample_rate_hz, sizeof(output), output);
-}
-}  // namespace webrtc
diff --git a/test/fuzzers/audio_decoder_isac_incoming_packet_fuzzer.cc b/test/fuzzers/audio_decoder_isac_incoming_packet_fuzzer.cc
deleted file mode 100644
index 9acebbb..0000000
--- a/test/fuzzers/audio_decoder_isac_incoming_packet_fuzzer.cc
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- *  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/codecs/isac/main/include/audio_decoder_isac.h"
-#include "webrtc/test/fuzzers/audio_decoder_fuzzer.h"
-
-namespace webrtc {
-void FuzzOneInput(const uint8_t* data, size_t size) {
-  AudioDecoderIsacFloatImpl dec(16000);
-  FuzzAudioDecoderIncomingPacket(data, size, &dec);
-}
-}  // namespace webrtc
diff --git a/test/fuzzers/audio_decoder_isacfix_fuzzer.cc b/test/fuzzers/audio_decoder_isacfix_fuzzer.cc
deleted file mode 100644
index 64cdccb..0000000
--- a/test/fuzzers/audio_decoder_isacfix_fuzzer.cc
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- *  Copyright (c) 2015 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/codecs/isac/fix/include/audio_decoder_isacfix.h"
-#include "webrtc/test/fuzzers/audio_decoder_fuzzer.h"
-
-namespace webrtc {
-void FuzzOneInput(const uint8_t* data, size_t size) {
-  static const int kSampleRateHz = 16000;
-  static const size_t kAllocatedOuputSizeSamples = 16000 / 10;  // 100 ms.
-  int16_t output[kAllocatedOuputSizeSamples];
-  AudioDecoderIsacFixImpl dec(kSampleRateHz);
-  FuzzAudioDecoder(DecoderFunctionType::kNormalDecode, data, size, &dec,
-                   kSampleRateHz, sizeof(output), output);
-}
-}  // namespace webrtc
diff --git a/test/fuzzers/audio_decoder_opus_fuzzer.cc b/test/fuzzers/audio_decoder_opus_fuzzer.cc
deleted file mode 100644
index 23b65a6..0000000
--- a/test/fuzzers/audio_decoder_opus_fuzzer.cc
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- *  Copyright (c) 2015 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/codecs/opus/audio_decoder_opus.h"
-#include "webrtc/test/fuzzers/audio_decoder_fuzzer.h"
-
-namespace webrtc {
-void FuzzOneInput(const uint8_t* data, size_t size) {
-  const size_t channels = (size % 2) + 1;  // 1 or 2 channels.
-  AudioDecoderOpusImpl dec(channels);
-  const int kSampleRateHz = 48000;
-  const size_t kAllocatedOuputSizeSamples = kSampleRateHz / 10;  // 100 ms.
-  int16_t output[kAllocatedOuputSizeSamples];
-  FuzzAudioDecoder(DecoderFunctionType::kNormalDecode, data, size, &dec,
-                   kSampleRateHz, sizeof(output), output);
-}
-}  // namespace webrtc
diff --git a/test/fuzzers/audio_decoder_opus_redundant_fuzzer.cc b/test/fuzzers/audio_decoder_opus_redundant_fuzzer.cc
deleted file mode 100644
index e623301..0000000
--- a/test/fuzzers/audio_decoder_opus_redundant_fuzzer.cc
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- *  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/codecs/opus/audio_decoder_opus.h"
-#include "webrtc/test/fuzzers/audio_decoder_fuzzer.h"
-
-namespace webrtc {
-void FuzzOneInput(const uint8_t* data, size_t size) {
-  const size_t channels = (size % 2) + 1;  // 1 or 2 channels.
-  AudioDecoderOpusImpl dec(channels);
-  const int kSampleRateHz = 48000;
-  const size_t kAllocatedOuputSizeSamples = kSampleRateHz / 10;  // 100 ms.
-  int16_t output[kAllocatedOuputSizeSamples];
-  FuzzAudioDecoder(DecoderFunctionType::kRedundantDecode, data, size, &dec,
-                   kSampleRateHz, sizeof(output), output);
-}
-}  // namespace webrtc
diff --git a/test/fuzzers/audio_processing_fuzzer.cc b/test/fuzzers/audio_processing_fuzzer.cc
deleted file mode 100644
index e31c057..0000000
--- a/test/fuzzers/audio_processing_fuzzer.cc
+++ /dev/null
@@ -1,157 +0,0 @@
-/*
- *  Copyright (c) 2017 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/test/fuzzers/audio_processing_fuzzer.h"
-
-#include <algorithm>
-#include <array>
-#include <cmath>
-
-#include "webrtc/modules/audio_processing/include/audio_processing.h"
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-namespace {
-size_t ByteToNativeRate(uint8_t data) {
-  using Rate = AudioProcessing::NativeRate;
-  switch (data % 4) {
-    case 0:
-    // Breaks AEC3.
-    // return static_cast<size_t>(Rate::kSampleRate8kHz);
-    case 1:
-      return static_cast<size_t>(Rate::kSampleRate16kHz);
-    case 2:
-      return static_cast<size_t>(Rate::kSampleRate32kHz);
-    default:
-      return static_cast<size_t>(Rate::kSampleRate48kHz);
-  }
-}
-
-template <class T>
-bool ParseSequence(size_t size,
-                   const uint8_t** data,
-                   size_t* remaining_size,
-                   T* result_data) {
-  const size_t data_size_bytes = sizeof(T) * size;
-  if (data_size_bytes > *remaining_size) {
-    return false;
-  }
-
-  std::copy(*data, *data + data_size_bytes,
-            reinterpret_cast<uint8_t*>(result_data));
-
-  *data += data_size_bytes;
-  *remaining_size -= data_size_bytes;
-  return true;
-}
-
-void FuzzAudioProcessing(const uint8_t* data,
-                         size_t size,
-                         bool is_float,
-                         AudioProcessing* apm) {
-  AudioFrame fixed_frame;
-  std::array<float, 480> float_frame{};
-  float* const first_channel = &float_frame[0];
-
-  while (size > 0) {
-    // Decide input/output rate for this iteration.
-    const auto input_rate_byte = ParseByte(&data, &size);
-    const auto output_rate_byte = ParseByte(&data, &size);
-    if (!input_rate_byte || !output_rate_byte) {
-      return;
-    }
-    const auto input_rate_hz = ByteToNativeRate(*input_rate_byte);
-    const auto output_rate_hz = ByteToNativeRate(*output_rate_byte);
-
-    const size_t samples_per_input_channel =
-        rtc::CheckedDivExact(input_rate_hz, 100ul);
-    fixed_frame.samples_per_channel_ = samples_per_input_channel;
-    fixed_frame.sample_rate_hz_ = input_rate_hz;
-
-    // Two channels breaks AEC3.
-    fixed_frame.num_channels_ = 1;
-
-    // Fill the arrays with audio samples from the data.
-    if (is_float) {
-      if (!ParseSequence(samples_per_input_channel, &data, &size,
-                         &float_frame[0])) {
-        return;
-      }
-    } else if (!ParseSequence(samples_per_input_channel, &data, &size,
-                              fixed_frame.mutable_data())) {
-      return;
-    }
-
-    // Filter obviously wrong values like inf/nan and values that will
-    // lead to inf/nan in calculations. 1e6 leads to DCHECKS failing.
-    for (auto& x : float_frame) {
-      if (!std::isnormal(x) || std::abs(x) > 1e5) {
-        x = 0;
-      }
-    }
-
-    // Make the APM call depending on capture/render mode and float /
-    // fix interface.
-    const auto is_capture = ParseBool(&data, &size);
-    if (!is_capture) {
-      return;
-    }
-    if (*is_capture) {
-      auto apm_return_code =
-          is_float ? (apm->ProcessStream(
-                         &first_channel, StreamConfig(input_rate_hz, 1),
-                         StreamConfig(output_rate_hz, 1), &first_channel))
-                   : (apm->ProcessStream(&fixed_frame));
-      RTC_DCHECK_NE(apm_return_code, AudioProcessing::kBadDataLengthError);
-    } else {
-      auto apm_return_code =
-          is_float ? (apm->ProcessReverseStream(
-                         &first_channel, StreamConfig(input_rate_hz, 1),
-                         StreamConfig(output_rate_hz, 1), &first_channel))
-                   : (apm->ProcessReverseStream(&fixed_frame));
-      RTC_DCHECK_NE(apm_return_code, AudioProcessing::kBadDataLengthError);
-    }
-  }
-}
-
-}  // namespace
-
-rtc::Optional<bool> ParseBool(const uint8_t** data, size_t* remaining_size) {
-  if (1 > *remaining_size) {
-    return rtc::Optional<bool>();
-  }
-  auto res = rtc::Optional<bool>((**data) % 2);
-  *data += 1;
-  *remaining_size -= 1;
-  return res;
-}
-
-rtc::Optional<uint8_t> ParseByte(const uint8_t** data, size_t* remaining_size) {
-  if (1 > *remaining_size) {
-    return rtc::Optional<uint8_t>();
-  }
-  auto res = rtc::Optional<uint8_t>((**data));
-  *data += 1;
-  *remaining_size -= 1;
-  return res;
-}
-
-void FuzzAudioProcessing(const uint8_t* data,
-                         size_t size,
-                         std::unique_ptr<AudioProcessing> apm) {
-  const auto is_float = ParseBool(&data, &size);
-  if (!is_float) {
-    return;
-  }
-
-  FuzzAudioProcessing(data, size, *is_float, apm.get());
-}
-}  // namespace webrtc
diff --git a/test/fuzzers/audio_processing_fuzzer.h b/test/fuzzers/audio_processing_fuzzer.h
deleted file mode 100644
index 4a54d69..0000000
--- a/test/fuzzers/audio_processing_fuzzer.h
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- *  Copyright (c) 2017 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_TEST_FUZZERS_AUDIO_PROCESSING_FUZZER_H_
-#define WEBRTC_TEST_FUZZERS_AUDIO_PROCESSING_FUZZER_H_
-
-#include <memory>
-
-#include "webrtc/modules/audio_processing/include/audio_processing.h"
-namespace webrtc {
-
-rtc::Optional<bool> ParseBool(const uint8_t** data, size_t* remaining_size);
-rtc::Optional<uint8_t> ParseByte(const uint8_t** data, size_t* remaining_size);
-
-void FuzzAudioProcessing(const uint8_t* data,
-                         size_t size,
-                         std::unique_ptr<AudioProcessing> apm);
-}  // namespace webrtc
-
-#endif  // WEBRTC_TEST_FUZZERS_AUDIO_PROCESSING_FUZZER_H_
diff --git a/test/fuzzers/audio_processing_fuzzer_configs.cc b/test/fuzzers/audio_processing_fuzzer_configs.cc
deleted file mode 100644
index 21810ad..0000000
--- a/test/fuzzers/audio_processing_fuzzer_configs.cc
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- *  Copyright (c) 2017 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_processing/include/audio_processing.h"
-#include "webrtc/test/fuzzers/audio_processing_fuzzer.h"
-
-#include "webrtc/api/optional.h"
-
-namespace webrtc {
-
-std::unique_ptr<AudioProcessing> CreateAPM(const uint8_t** data,
-                                           size_t* remaining_size) {
-  // Parse boolean values for optionally enabling different
-  // configurable public components of APM.
-  auto exp_agc = ParseBool(data, remaining_size);
-  auto exp_ns = ParseBool(data, remaining_size);
-  auto bf = ParseBool(data, remaining_size);
-  auto ef = ParseBool(data, remaining_size);
-  auto raf = ParseBool(data, remaining_size);
-  auto da = ParseBool(data, remaining_size);
-  auto ie = ParseBool(data, remaining_size);
-  auto red = ParseBool(data, remaining_size);
-  auto lc = ParseBool(data, remaining_size);
-  auto hpf = ParseBool(data, remaining_size);
-  auto aec3 = ParseBool(data, remaining_size);
-
-  if (!(exp_agc && exp_ns && bf && ef && raf && da && ie && red && lc && hpf &&
-        aec3)) {
-    return nullptr;
-  }
-
-  // Components can be enabled through webrtc::Config and
-  // webrtc::AudioProcessingConfig.
-  Config config;
-
-  config.Set<ExperimentalAgc>(new ExperimentalAgc(*exp_agc));
-  config.Set<ExperimentalNs>(new ExperimentalNs(*exp_ns));
-  if (*bf) {
-    config.Set<Beamforming>(new Beamforming());
-  }
-  config.Set<ExtendedFilter>(new ExtendedFilter(*ef));
-  config.Set<RefinedAdaptiveFilter>(new RefinedAdaptiveFilter(*raf));
-  config.Set<DelayAgnostic>(new DelayAgnostic(*da));
-  config.Set<Intelligibility>(new Intelligibility(*ie));
-
-  std::unique_ptr<AudioProcessing> apm(AudioProcessing::Create(config));
-
-  webrtc::AudioProcessing::Config apm_config;
-  apm_config.residual_echo_detector.enabled = *red;
-  apm_config.level_controller.enabled = *lc;
-  apm_config.high_pass_filter.enabled = *hpf;
-  apm_config.echo_canceller3.enabled = *aec3;
-
-  apm->ApplyConfig(apm_config);
-
-  return apm;
-}
-
-void FuzzOneInput(const uint8_t* data, size_t size) {
-  auto apm = CreateAPM(&data, &size);
-  FuzzAudioProcessing(data, size, std::move(apm));
-}
-}  // namespace webrtc
diff --git a/test/fuzzers/congestion_controller_feedback_fuzzer.cc b/test/fuzzers/congestion_controller_feedback_fuzzer.cc
deleted file mode 100644
index e9dec3d..0000000
--- a/test/fuzzers/congestion_controller_feedback_fuzzer.cc
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- *  Copyright (c) 2015 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/congestion_controller/include/receive_side_congestion_controller.h"
-#include "webrtc/modules/pacing/packet_router.h"
-#include "webrtc/modules/remote_bitrate_estimator/include/remote_bitrate_estimator.h"
-#include "webrtc/modules/rtp_rtcp/source/byte_io.h"
-
-namespace webrtc {
-
-void FuzzOneInput(const uint8_t* data, size_t size) {
-  size_t i = 0;
-  if (size < sizeof(int64_t) + sizeof(uint8_t) + sizeof(uint32_t))
-    return;
-  SimulatedClock clock(data[i++]);
-  PacketRouter packet_router;
-  ReceiveSideCongestionController cc(&clock, &packet_router);
-  RemoteBitrateEstimator* rbe = cc.GetRemoteBitrateEstimator(true);
-  RTPHeader header;
-  header.ssrc = ByteReader<uint32_t>::ReadBigEndian(&data[i]);
-  i += sizeof(uint32_t);
-  header.extension.hasTransportSequenceNumber = true;
-  int64_t arrival_time_ms =
-      std::max<int64_t>(ByteReader<int64_t>::ReadBigEndian(&data[i]), 0);
-  i += sizeof(int64_t);
-  const size_t kMinPacketSize =
-      sizeof(size_t) + sizeof(uint16_t) + sizeof(uint8_t);
-  while (i + kMinPacketSize < size) {
-    size_t payload_size = ByteReader<size_t>::ReadBigEndian(&data[i]) % 1500;
-    i += sizeof(size_t);
-    header.extension.transportSequenceNumber =
-        ByteReader<uint16_t>::ReadBigEndian(&data[i]);
-    i += sizeof(uint16_t);
-    rbe->IncomingPacket(arrival_time_ms, payload_size, header);
-    clock.AdvanceTimeMilliseconds(5);
-    arrival_time_ms += ByteReader<uint8_t>::ReadBigEndian(&data[i]);
-    arrival_time_ms += sizeof(uint8_t);
-  }
-  rbe->Process();
-}
-}  // namespace webrtc
diff --git a/test/fuzzers/corpora/README b/test/fuzzers/corpora/README
deleted file mode 100644
index d29e169..0000000
--- a/test/fuzzers/corpora/README
+++ /dev/null
@@ -1,34 +0,0 @@
-This is a collection of corpora for various WebRTC fuzzers. To use
-them, the gn targets define seed_corpus=$corpus_dir, which causes the
-ClusterFuzz upload bot to bundle $corpus_dir and upload it.
-
-The format is simple: one file per test case. Specific notes are
-included below.
-
-### SDP ###
-This corpus was initially assembled manually from the following
-sources:
-
-  - curl --silent https://www.ietf.org/rfc/rfc4317.txt | grep '^[ a-z]*=[^=]*$' | sed 's/^[[:space:]]*//' | awk -v RS='(^|\n)v=' '/./ {print "v="$0 > NR".sdp"}'
-  - all the SDPs used in the parser unit tests
-  - some manually gathered SDPs from Firefox and Opera
-
-The SDP tokens come from:
-
- -  grep "^static const " webrtc/api/webrtcsdp.cc | cut -d'=' -f2 | cut -d ';' -f1 | tr -d '"' | tr -d "'" | tr -d ' ' | sort -u | grep -v '^(\n|\r|\r\n)$|^$' | sed -e 's/^/"/' -e 's/$/"/' | tail -n +2
-
-### STUN ###
-This corpus was initially assembled from the STUN unit tests, together
-with a crash that it found relatively quickly.
-
-### RT(C)P ###
-This corpus was initially assembled from the unittests. RTCP was
-minimised first.
-
-There is also rt(c?)p-corpus-with-extra-byte, in which each sample is
-prefixed by the byte 0xff. Some of the rtp fuzzers need to decide
-which header extensions to enable, and the first byte of the fuzz data
-is used for this.
-
-### PseudoTCP ###
-Very small corpus minimised from the unit tests.
\ No newline at end of file
diff --git a/test/fuzzers/corpora/pseudotcp-corpus/785b96587d0eb44dd5d75b7a886f37e2ac504511 b/test/fuzzers/corpora/pseudotcp-corpus/785b96587d0eb44dd5d75b7a886f37e2ac504511
deleted file mode 100644
index 21f5cff..0000000
--- a/test/fuzzers/corpora/pseudotcp-corpus/785b96587d0eb44dd5d75b7a886f37e2ac504511
+++ /dev/null
Binary files differ
diff --git a/test/fuzzers/corpora/rtcp-corpus/0.rtcp b/test/fuzzers/corpora/rtcp-corpus/0.rtcp
deleted file mode 100644
index 802eecf..0000000
--- a/test/fuzzers/corpora/rtcp-corpus/0.rtcp
+++ /dev/null
Binary files differ
diff --git a/test/fuzzers/corpora/rtcp-corpus/1.rtcp b/test/fuzzers/corpora/rtcp-corpus/1.rtcp
deleted file mode 100644
index c062793..0000000
--- a/test/fuzzers/corpora/rtcp-corpus/1.rtcp
+++ /dev/null
Binary files differ
diff --git a/test/fuzzers/corpora/rtcp-corpus/10.rtcp b/test/fuzzers/corpora/rtcp-corpus/10.rtcp
deleted file mode 100644
index fdc7780..0000000
--- a/test/fuzzers/corpora/rtcp-corpus/10.rtcp
+++ /dev/null
Binary files differ
diff --git a/test/fuzzers/corpora/rtcp-corpus/11.rtcp b/test/fuzzers/corpora/rtcp-corpus/11.rtcp
deleted file mode 100644
index 994f721..0000000
--- a/test/fuzzers/corpora/rtcp-corpus/11.rtcp
+++ /dev/null
Binary files differ
diff --git a/test/fuzzers/corpora/rtcp-corpus/12.rtcp b/test/fuzzers/corpora/rtcp-corpus/12.rtcp
deleted file mode 100644
index 557fe9c..0000000
--- a/test/fuzzers/corpora/rtcp-corpus/12.rtcp
+++ /dev/null
Binary files differ
diff --git a/test/fuzzers/corpora/rtcp-corpus/13.rtcp b/test/fuzzers/corpora/rtcp-corpus/13.rtcp
deleted file mode 100644
index 0f1b180..0000000
--- a/test/fuzzers/corpora/rtcp-corpus/13.rtcp
+++ /dev/null
Binary files differ
diff --git a/test/fuzzers/corpora/rtcp-corpus/14.rtcp b/test/fuzzers/corpora/rtcp-corpus/14.rtcp
deleted file mode 100644
index df6bfed..0000000
--- a/test/fuzzers/corpora/rtcp-corpus/14.rtcp
+++ /dev/null
Binary files differ
diff --git a/test/fuzzers/corpora/rtcp-corpus/15.rtcp b/test/fuzzers/corpora/rtcp-corpus/15.rtcp
deleted file mode 100644
index 3b31b30..0000000
--- a/test/fuzzers/corpora/rtcp-corpus/15.rtcp
+++ /dev/null
Binary files differ
diff --git a/test/fuzzers/corpora/rtcp-corpus/16.rtcp b/test/fuzzers/corpora/rtcp-corpus/16.rtcp
deleted file mode 100644
index 0496ddf..0000000
--- a/test/fuzzers/corpora/rtcp-corpus/16.rtcp
+++ /dev/null
Binary files differ
diff --git a/test/fuzzers/corpora/rtcp-corpus/17.rtcp b/test/fuzzers/corpora/rtcp-corpus/17.rtcp
deleted file mode 100644
index 755b719..0000000
--- a/test/fuzzers/corpora/rtcp-corpus/17.rtcp
+++ /dev/null
Binary files differ
diff --git a/test/fuzzers/corpora/rtcp-corpus/18.rtcp b/test/fuzzers/corpora/rtcp-corpus/18.rtcp
deleted file mode 100644
index 04fd1e3..0000000
--- a/test/fuzzers/corpora/rtcp-corpus/18.rtcp
+++ /dev/null
Binary files differ
diff --git a/test/fuzzers/corpora/rtcp-corpus/19.rtcp b/test/fuzzers/corpora/rtcp-corpus/19.rtcp
deleted file mode 100644
index 8ae9812..0000000
--- a/test/fuzzers/corpora/rtcp-corpus/19.rtcp
+++ /dev/null
Binary files differ
diff --git a/test/fuzzers/corpora/rtcp-corpus/2.rtcp b/test/fuzzers/corpora/rtcp-corpus/2.rtcp
deleted file mode 100644
index ba38a0a..0000000
--- a/test/fuzzers/corpora/rtcp-corpus/2.rtcp
+++ /dev/null
Binary files differ
diff --git a/test/fuzzers/corpora/rtcp-corpus/20.rtcp b/test/fuzzers/corpora/rtcp-corpus/20.rtcp
deleted file mode 100644
index debb7de..0000000
--- a/test/fuzzers/corpora/rtcp-corpus/20.rtcp
+++ /dev/null
Binary files differ
diff --git a/test/fuzzers/corpora/rtcp-corpus/21.rtcp b/test/fuzzers/corpora/rtcp-corpus/21.rtcp
deleted file mode 100644
index 3fcbd40..0000000
--- a/test/fuzzers/corpora/rtcp-corpus/21.rtcp
+++ /dev/null
Binary files differ
diff --git a/test/fuzzers/corpora/rtcp-corpus/22.rtcp b/test/fuzzers/corpora/rtcp-corpus/22.rtcp
deleted file mode 100644
index 3defd8c..0000000
--- a/test/fuzzers/corpora/rtcp-corpus/22.rtcp
+++ /dev/null
Binary files differ
diff --git a/test/fuzzers/corpora/rtcp-corpus/23.rtcp b/test/fuzzers/corpora/rtcp-corpus/23.rtcp
deleted file mode 100644
index 211ccbd..0000000
--- a/test/fuzzers/corpora/rtcp-corpus/23.rtcp
+++ /dev/null
Binary files differ
diff --git a/test/fuzzers/corpora/rtcp-corpus/24.rtcp b/test/fuzzers/corpora/rtcp-corpus/24.rtcp
deleted file mode 100644
index 8ded9be..0000000
--- a/test/fuzzers/corpora/rtcp-corpus/24.rtcp
+++ /dev/null
Binary files differ
diff --git a/test/fuzzers/corpora/rtcp-corpus/25.rtcp b/test/fuzzers/corpora/rtcp-corpus/25.rtcp
deleted file mode 100644
index b5c8146..0000000
--- a/test/fuzzers/corpora/rtcp-corpus/25.rtcp
+++ /dev/null
Binary files differ
diff --git a/test/fuzzers/corpora/rtcp-corpus/26.rtcp b/test/fuzzers/corpora/rtcp-corpus/26.rtcp
deleted file mode 100644
index 0fd4f25..0000000
--- a/test/fuzzers/corpora/rtcp-corpus/26.rtcp
+++ /dev/null
Binary files differ
diff --git a/test/fuzzers/corpora/rtcp-corpus/27.rtcp b/test/fuzzers/corpora/rtcp-corpus/27.rtcp
deleted file mode 100644
index 2c8bb63..0000000
--- a/test/fuzzers/corpora/rtcp-corpus/27.rtcp
+++ /dev/null
Binary files differ
diff --git a/test/fuzzers/corpora/rtcp-corpus/28.rtcp b/test/fuzzers/corpora/rtcp-corpus/28.rtcp
deleted file mode 100644
index 6a20bc2..0000000
--- a/test/fuzzers/corpora/rtcp-corpus/28.rtcp
+++ /dev/null
Binary files differ
diff --git a/test/fuzzers/corpora/rtcp-corpus/29.rtcp b/test/fuzzers/corpora/rtcp-corpus/29.rtcp
deleted file mode 100644
index 76fd214..0000000
--- a/test/fuzzers/corpora/rtcp-corpus/29.rtcp
+++ /dev/null
Binary files differ
diff --git a/test/fuzzers/corpora/rtcp-corpus/3.rtcp b/test/fuzzers/corpora/rtcp-corpus/3.rtcp
deleted file mode 100644
index 72307e0..0000000
--- a/test/fuzzers/corpora/rtcp-corpus/3.rtcp
+++ /dev/null
Binary files differ
diff --git a/test/fuzzers/corpora/rtcp-corpus/30.rtcp b/test/fuzzers/corpora/rtcp-corpus/30.rtcp
deleted file mode 100644
index cfa38fa..0000000
--- a/test/fuzzers/corpora/rtcp-corpus/30.rtcp
+++ /dev/null
Binary files differ
diff --git a/test/fuzzers/corpora/rtcp-corpus/31.rtcp b/test/fuzzers/corpora/rtcp-corpus/31.rtcp
deleted file mode 100644
index 8abf725..0000000
--- a/test/fuzzers/corpora/rtcp-corpus/31.rtcp
+++ /dev/null
Binary files differ
diff --git a/test/fuzzers/corpora/rtcp-corpus/32.rtcp b/test/fuzzers/corpora/rtcp-corpus/32.rtcp
deleted file mode 100644
index 76518c8..0000000
--- a/test/fuzzers/corpora/rtcp-corpus/32.rtcp
+++ /dev/null
Binary files differ
diff --git a/test/fuzzers/corpora/rtcp-corpus/33.rtcp b/test/fuzzers/corpora/rtcp-corpus/33.rtcp
deleted file mode 100644
index 9296496..0000000
--- a/test/fuzzers/corpora/rtcp-corpus/33.rtcp
+++ /dev/null
Binary files differ
diff --git a/test/fuzzers/corpora/rtcp-corpus/34.rtcp b/test/fuzzers/corpora/rtcp-corpus/34.rtcp
deleted file mode 100644
index 9045c15..0000000
--- a/test/fuzzers/corpora/rtcp-corpus/34.rtcp
+++ /dev/null
Binary files differ
diff --git a/test/fuzzers/corpora/rtcp-corpus/35.rtcp b/test/fuzzers/corpora/rtcp-corpus/35.rtcp
deleted file mode 100644
index f86df02..0000000
--- a/test/fuzzers/corpora/rtcp-corpus/35.rtcp
+++ /dev/null
Binary files differ
diff --git a/test/fuzzers/corpora/rtcp-corpus/36.rtcp b/test/fuzzers/corpora/rtcp-corpus/36.rtcp
deleted file mode 100644
index d274d41..0000000
--- a/test/fuzzers/corpora/rtcp-corpus/36.rtcp
+++ /dev/null
Binary files differ
diff --git a/test/fuzzers/corpora/rtcp-corpus/37.rtcp b/test/fuzzers/corpora/rtcp-corpus/37.rtcp
deleted file mode 100644
index b4f04f4..0000000
--- a/test/fuzzers/corpora/rtcp-corpus/37.rtcp
+++ /dev/null
Binary files differ
diff --git a/test/fuzzers/corpora/rtcp-corpus/38.rtcp b/test/fuzzers/corpora/rtcp-corpus/38.rtcp
deleted file mode 100644
index 8d65e0f..0000000
--- a/test/fuzzers/corpora/rtcp-corpus/38.rtcp
+++ /dev/null
Binary files differ
diff --git a/test/fuzzers/corpora/rtcp-corpus/39.rtcp b/test/fuzzers/corpora/rtcp-corpus/39.rtcp
deleted file mode 100644
index fb969f8..0000000
--- a/test/fuzzers/corpora/rtcp-corpus/39.rtcp
+++ /dev/null
Binary files differ
diff --git a/test/fuzzers/corpora/rtcp-corpus/4.rtcp b/test/fuzzers/corpora/rtcp-corpus/4.rtcp
deleted file mode 100644
index 5170185..0000000
--- a/test/fuzzers/corpora/rtcp-corpus/4.rtcp
+++ /dev/null
Binary files differ
diff --git a/test/fuzzers/corpora/rtcp-corpus/40.rtcp b/test/fuzzers/corpora/rtcp-corpus/40.rtcp
deleted file mode 100644
index 279047c..0000000
--- a/test/fuzzers/corpora/rtcp-corpus/40.rtcp
+++ /dev/null
Binary files differ
diff --git a/test/fuzzers/corpora/rtcp-corpus/41.rtcp b/test/fuzzers/corpora/rtcp-corpus/41.rtcp
deleted file mode 100644
index 09a8a58..0000000
--- a/test/fuzzers/corpora/rtcp-corpus/41.rtcp
+++ /dev/null
Binary files differ
diff --git a/test/fuzzers/corpora/rtcp-corpus/42.rtcp b/test/fuzzers/corpora/rtcp-corpus/42.rtcp
deleted file mode 100644
index f727b19..0000000
--- a/test/fuzzers/corpora/rtcp-corpus/42.rtcp
+++ /dev/null
Binary files differ
diff --git a/test/fuzzers/corpora/rtcp-corpus/43.rtcp b/test/fuzzers/corpora/rtcp-corpus/43.rtcp
deleted file mode 100644
index 9aab33a..0000000
--- a/test/fuzzers/corpora/rtcp-corpus/43.rtcp
+++ /dev/null
Binary files differ
diff --git a/test/fuzzers/corpora/rtcp-corpus/44.rtcp b/test/fuzzers/corpora/rtcp-corpus/44.rtcp
deleted file mode 100644
index 2eba529..0000000
--- a/test/fuzzers/corpora/rtcp-corpus/44.rtcp
+++ /dev/null
Binary files differ
diff --git a/test/fuzzers/corpora/rtcp-corpus/45.rtcp b/test/fuzzers/corpora/rtcp-corpus/45.rtcp
deleted file mode 100644
index 50c0bea..0000000
--- a/test/fuzzers/corpora/rtcp-corpus/45.rtcp
+++ /dev/null
Binary files differ
diff --git a/test/fuzzers/corpora/rtcp-corpus/46.rtcp b/test/fuzzers/corpora/rtcp-corpus/46.rtcp
deleted file mode 100644
index 2de424a..0000000
--- a/test/fuzzers/corpora/rtcp-corpus/46.rtcp
+++ /dev/null
Binary files differ
diff --git a/test/fuzzers/corpora/rtcp-corpus/47.rtcp b/test/fuzzers/corpora/rtcp-corpus/47.rtcp
deleted file mode 100644
index 71d530b..0000000
--- a/test/fuzzers/corpora/rtcp-corpus/47.rtcp
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/test/fuzzers/corpora/rtcp-corpus/48.rtcp b/test/fuzzers/corpora/rtcp-corpus/48.rtcp
deleted file mode 100644
index 6656950..0000000
--- a/test/fuzzers/corpora/rtcp-corpus/48.rtcp
+++ /dev/null
Binary files differ
diff --git a/test/fuzzers/corpora/rtcp-corpus/49.rtcp b/test/fuzzers/corpora/rtcp-corpus/49.rtcp
deleted file mode 100644
index 33b0f3d..0000000
--- a/test/fuzzers/corpora/rtcp-corpus/49.rtcp
+++ /dev/null
Binary files differ
diff --git a/test/fuzzers/corpora/rtcp-corpus/5.rtcp b/test/fuzzers/corpora/rtcp-corpus/5.rtcp
deleted file mode 100644
index 46bef32..0000000
--- a/test/fuzzers/corpora/rtcp-corpus/5.rtcp
+++ /dev/null
Binary files differ
diff --git a/test/fuzzers/corpora/rtcp-corpus/50.rtcp b/test/fuzzers/corpora/rtcp-corpus/50.rtcp
deleted file mode 100644
index 5bec125..0000000
--- a/test/fuzzers/corpora/rtcp-corpus/50.rtcp
+++ /dev/null
Binary files differ
diff --git a/test/fuzzers/corpora/rtcp-corpus/51.rtcp b/test/fuzzers/corpora/rtcp-corpus/51.rtcp
deleted file mode 100644
index ff94fb8..0000000
--- a/test/fuzzers/corpora/rtcp-corpus/51.rtcp
+++ /dev/null
Binary files differ
diff --git a/test/fuzzers/corpora/rtcp-corpus/52.rtcp b/test/fuzzers/corpora/rtcp-corpus/52.rtcp
deleted file mode 100644
index 55cc76c..0000000
--- a/test/fuzzers/corpora/rtcp-corpus/52.rtcp
+++ /dev/null
Binary files differ
diff --git a/test/fuzzers/corpora/rtcp-corpus/53.rtcp b/test/fuzzers/corpora/rtcp-corpus/53.rtcp
deleted file mode 100644
index ac11523..0000000
--- a/test/fuzzers/corpora/rtcp-corpus/53.rtcp
+++ /dev/null
Binary files differ
diff --git a/test/fuzzers/corpora/rtcp-corpus/54.rtcp b/test/fuzzers/corpora/rtcp-corpus/54.rtcp
deleted file mode 100644
index f3f0bb8..0000000
--- a/test/fuzzers/corpora/rtcp-corpus/54.rtcp
+++ /dev/null
Binary files differ
diff --git a/test/fuzzers/corpora/rtcp-corpus/55.rtcp b/test/fuzzers/corpora/rtcp-corpus/55.rtcp
deleted file mode 100644
index e69de29..0000000
--- a/test/fuzzers/corpora/rtcp-corpus/55.rtcp
+++ /dev/null
diff --git a/test/fuzzers/corpora/rtcp-corpus/56.rtcp b/test/fuzzers/corpora/rtcp-corpus/56.rtcp
deleted file mode 100644
index f0012f1..0000000
--- a/test/fuzzers/corpora/rtcp-corpus/56.rtcp
+++ /dev/null
Binary files differ
diff --git a/test/fuzzers/corpora/rtcp-corpus/57.rtcp b/test/fuzzers/corpora/rtcp-corpus/57.rtcp
deleted file mode 100644
index 61517f0..0000000
--- a/test/fuzzers/corpora/rtcp-corpus/57.rtcp
+++ /dev/null
Binary files differ
diff --git a/test/fuzzers/corpora/rtcp-corpus/58.rtcp b/test/fuzzers/corpora/rtcp-corpus/58.rtcp
deleted file mode 100644
index 3688310..0000000
--- a/test/fuzzers/corpora/rtcp-corpus/58.rtcp
+++ /dev/null
Binary files differ
diff --git a/test/fuzzers/corpora/rtcp-corpus/59.rtcp b/test/fuzzers/corpora/rtcp-corpus/59.rtcp
deleted file mode 100644
index e914f83..0000000
--- a/test/fuzzers/corpora/rtcp-corpus/59.rtcp
+++ /dev/null
Binary files differ
diff --git a/test/fuzzers/corpora/rtcp-corpus/6.rtcp b/test/fuzzers/corpora/rtcp-corpus/6.rtcp
deleted file mode 100644
index dcad8f6..0000000
--- a/test/fuzzers/corpora/rtcp-corpus/6.rtcp
+++ /dev/null
Binary files differ
diff --git a/test/fuzzers/corpora/rtcp-corpus/60.rtcp b/test/fuzzers/corpora/rtcp-corpus/60.rtcp
deleted file mode 100644
index 8e999e7..0000000
--- a/test/fuzzers/corpora/rtcp-corpus/60.rtcp
+++ /dev/null
Binary files differ
diff --git a/test/fuzzers/corpora/rtcp-corpus/61.rtcp b/test/fuzzers/corpora/rtcp-corpus/61.rtcp
deleted file mode 100644
index eb38d23..0000000
--- a/test/fuzzers/corpora/rtcp-corpus/61.rtcp
+++ /dev/null
Binary files differ
diff --git a/test/fuzzers/corpora/rtcp-corpus/62.rtcp b/test/fuzzers/corpora/rtcp-corpus/62.rtcp
deleted file mode 100644
index 6df94b7..0000000
--- a/test/fuzzers/corpora/rtcp-corpus/62.rtcp
+++ /dev/null
Binary files differ
diff --git a/test/fuzzers/corpora/rtcp-corpus/63.rtcp b/test/fuzzers/corpora/rtcp-corpus/63.rtcp
deleted file mode 100644
index a3b2acb..0000000
--- a/test/fuzzers/corpora/rtcp-corpus/63.rtcp
+++ /dev/null
Binary files differ
diff --git a/test/fuzzers/corpora/rtcp-corpus/64.rtcp b/test/fuzzers/corpora/rtcp-corpus/64.rtcp
deleted file mode 100644
index 4d50c0f..0000000
--- a/test/fuzzers/corpora/rtcp-corpus/64.rtcp
+++ /dev/null
Binary files differ
diff --git a/test/fuzzers/corpora/rtcp-corpus/65.rtcp b/test/fuzzers/corpora/rtcp-corpus/65.rtcp
deleted file mode 100644
index 537d10c..0000000
--- a/test/fuzzers/corpora/rtcp-corpus/65.rtcp
+++ /dev/null
Binary files differ
diff --git a/test/fuzzers/corpora/rtcp-corpus/66.rtcp b/test/fuzzers/corpora/rtcp-corpus/66.rtcp
deleted file mode 100644
index f280f3c..0000000
--- a/test/fuzzers/corpora/rtcp-corpus/66.rtcp
+++ /dev/null
Binary files differ
diff --git a/test/fuzzers/corpora/rtcp-corpus/7.rtcp b/test/fuzzers/corpora/rtcp-corpus/7.rtcp
deleted file mode 100644
index f8f74e1..0000000
--- a/test/fuzzers/corpora/rtcp-corpus/7.rtcp
+++ /dev/null
Binary files differ
diff --git a/test/fuzzers/corpora/rtcp-corpus/8.rtcp b/test/fuzzers/corpora/rtcp-corpus/8.rtcp
deleted file mode 100644
index f0ceba8..0000000
--- a/test/fuzzers/corpora/rtcp-corpus/8.rtcp
+++ /dev/null
Binary files differ
diff --git a/test/fuzzers/corpora/rtcp-corpus/9.rtcp b/test/fuzzers/corpora/rtcp-corpus/9.rtcp
deleted file mode 100644
index 7cc0789..0000000
--- a/test/fuzzers/corpora/rtcp-corpus/9.rtcp
+++ /dev/null
Binary files differ
diff --git a/test/fuzzers/corpora/rtp-corpus/rtp-0 b/test/fuzzers/corpora/rtp-corpus/rtp-0
deleted file mode 100644
index c93ce82..0000000
--- a/test/fuzzers/corpora/rtp-corpus/rtp-0
+++ /dev/null
Binary files differ
diff --git a/test/fuzzers/corpora/rtp-corpus/rtp-1 b/test/fuzzers/corpora/rtp-corpus/rtp-1
deleted file mode 100644
index 84834ae..0000000
--- a/test/fuzzers/corpora/rtp-corpus/rtp-1
+++ /dev/null
Binary files differ
diff --git a/test/fuzzers/corpora/rtp-corpus/rtp-2 b/test/fuzzers/corpora/rtp-corpus/rtp-2
deleted file mode 100644
index 3a5aedb..0000000
--- a/test/fuzzers/corpora/rtp-corpus/rtp-2
+++ /dev/null
Binary files differ
diff --git a/test/fuzzers/corpora/rtp-corpus/rtp-3 b/test/fuzzers/corpora/rtp-corpus/rtp-3
deleted file mode 100644
index 300309f..0000000
--- a/test/fuzzers/corpora/rtp-corpus/rtp-3
+++ /dev/null
Binary files differ
diff --git a/test/fuzzers/corpora/rtp-corpus/rtp-4 b/test/fuzzers/corpora/rtp-corpus/rtp-4
deleted file mode 100644
index 84834ae..0000000
--- a/test/fuzzers/corpora/rtp-corpus/rtp-4
+++ /dev/null
Binary files differ
diff --git a/test/fuzzers/corpora/sdp-corpus/10.sdp b/test/fuzzers/corpora/sdp-corpus/10.sdp
deleted file mode 100644
index 36319c4..0000000
--- a/test/fuzzers/corpora/sdp-corpus/10.sdp
+++ /dev/null
@@ -1,11 +0,0 @@
-v=0
-o=alice 2890844526 2890844526 IN IP4 host.atlanta.example.com
-s=
-c=IN IP4 host.atlanta.example.com
-t=0 0
-m=audio 49170 RTP/AVP 0 97
-a=rtpmap:0 PCMU/8000
-a=rtpmap:97 iLBC/8000
-m=audio 49172 RTP/AVP 98
-a=rtpmap:98 telephone-event/8000
-a=sendonly
diff --git a/test/fuzzers/corpora/sdp-corpus/11.sdp b/test/fuzzers/corpora/sdp-corpus/11.sdp
deleted file mode 100644
index c3dbce4..0000000
--- a/test/fuzzers/corpora/sdp-corpus/11.sdp
+++ /dev/null
@@ -1,10 +0,0 @@
-v=0
-o=bob 2808844564 2808844564 IN IP4 host.biloxi.example.com
-s=
-c=IN IP4 host.biloxi.example.com
-t=0 0
-m=audio 49172 RTP/AVP 97
-a=rtpmap:97 iLBC/8000
-m=audio 49174 RTP/AVP 98
-a=rtpmap:98 telephone-event/8000
-a=recvonly
diff --git a/test/fuzzers/corpora/sdp-corpus/12.sdp b/test/fuzzers/corpora/sdp-corpus/12.sdp
deleted file mode 100644
index 26d4ff6..0000000
--- a/test/fuzzers/corpora/sdp-corpus/12.sdp
+++ /dev/null
@@ -1,9 +0,0 @@
-v=0
-o=alice 2890844526 2890844526 IN IP4 host.atlanta.example.com
-s=
-c=IN IP4 host.atlanta.example.com
-t=0 0
-m=audio 49170 RTP/AVP 97
-a=rtpmap:97 iLBC/8000
-m=video 51372 RTP/AVP 31
-a=rtpmap:31 H261/90000
diff --git a/test/fuzzers/corpora/sdp-corpus/13.sdp b/test/fuzzers/corpora/sdp-corpus/13.sdp
deleted file mode 100644
index f625e38..0000000
--- a/test/fuzzers/corpora/sdp-corpus/13.sdp
+++ /dev/null
@@ -1,9 +0,0 @@
-v=0
-o=bob 2808844564 2808844564 IN IP4 host.biloxi.example.com
-s=
-c=IN IP4 host.biloxi.example.com
-t=0 0
-m=audio 49174 RTP/AVP 97
-a=rtpmap:97 iLBC/8000
-m=video 49170 RTP/AVP 31
-a=rtpmap:31 H261/90000
diff --git a/test/fuzzers/corpora/sdp-corpus/14.sdp b/test/fuzzers/corpora/sdp-corpus/14.sdp
deleted file mode 100644
index c36b9fe..0000000
--- a/test/fuzzers/corpora/sdp-corpus/14.sdp
+++ /dev/null
@@ -1,9 +0,0 @@
-v=0
-o=bob 2808844564 2808844565 IN IP4 host.biloxi.example.com
-s=
-c=IN IP4 newhost.biloxi.example.com
-t=0 0
-m=audio 49178 RTP/AVP 97
-a=rtpmap:97 iLBC/8000
-m=video 49188 RTP/AVP 31
-a=rtpmap:31 H261/90000
diff --git a/test/fuzzers/corpora/sdp-corpus/15.sdp b/test/fuzzers/corpora/sdp-corpus/15.sdp
deleted file mode 100644
index 26d4ff6..0000000
--- a/test/fuzzers/corpora/sdp-corpus/15.sdp
+++ /dev/null
@@ -1,9 +0,0 @@
-v=0
-o=alice 2890844526 2890844526 IN IP4 host.atlanta.example.com
-s=
-c=IN IP4 host.atlanta.example.com
-t=0 0
-m=audio 49170 RTP/AVP 97
-a=rtpmap:97 iLBC/8000
-m=video 51372 RTP/AVP 31
-a=rtpmap:31 H261/90000
diff --git a/test/fuzzers/corpora/sdp-corpus/16.sdp b/test/fuzzers/corpora/sdp-corpus/16.sdp
deleted file mode 100644
index 1d187a0..0000000
--- a/test/fuzzers/corpora/sdp-corpus/16.sdp
+++ /dev/null
@@ -1,10 +0,0 @@
-v=0
-o=alice 2890844526 2890844526 IN IP4 host.atlanta.example.com
-s=
-c=IN IP4 host.atlanta.example.com
-t=0 0
-m=audio 49170 RTP/AVP 0
-a=rtpmap:0 PCMU/8000
-m=audio 51372 RTP/AVP 97 101
-a=rtpmap:97 iLBC/8000
-a=rtpmap:101 telephone-event/8000
diff --git a/test/fuzzers/corpora/sdp-corpus/17.sdp b/test/fuzzers/corpora/sdp-corpus/17.sdp
deleted file mode 100644
index a328d16..0000000
--- a/test/fuzzers/corpora/sdp-corpus/17.sdp
+++ /dev/null
@@ -1,10 +0,0 @@
-v=0
-o=bob 2808844564 2808844564 IN IP4 host.biloxi.example.com
-s=
-c=IN IP4 host.biloxi.example.com
-t=0 0
-m=audio 0 RTP/AVP 0
-a=rtpmap:0 PCMU/8000
-m=audio 49170 RTP/AVP 97 101
-a=rtpmap:97 iLBC/8000
-a=rtpmap:101 telephone-event/8000
diff --git a/test/fuzzers/corpora/sdp-corpus/18.sdp b/test/fuzzers/corpora/sdp-corpus/18.sdp
deleted file mode 100644
index 1e0d3f5..0000000
--- a/test/fuzzers/corpora/sdp-corpus/18.sdp
+++ /dev/null
@@ -1,9 +0,0 @@
-v=0
-o=alice 2890844526 2890844526 IN IP4 host.atlanta.example.com
-s=
-c=IN IP4 host.atlanta.example.com
-t=0 0
-m=audio 49170 RTP/AVP 99
-a=rtpmap:99 iLBC/8000
-m=video 51372 RTP/AVP 31
-a=rtpmap:31 H261/90000
diff --git a/test/fuzzers/corpora/sdp-corpus/19.sdp b/test/fuzzers/corpora/sdp-corpus/19.sdp
deleted file mode 100644
index a9a5e12..0000000
--- a/test/fuzzers/corpora/sdp-corpus/19.sdp
+++ /dev/null
@@ -1,9 +0,0 @@
-v=0
-o=bob 2808844564 2808844564 IN IP4 host.biloxi.example.com
-s=
-c=IN IP4 host.biloxi.example.com
-t=0 0
-m=audio 49172 RTP/AVP 99
-a=rtpmap:99 iLBC/8000
-m=video 51374 RTP/AVP 31
-a=rtpmap:31 H261/90000
diff --git a/test/fuzzers/corpora/sdp-corpus/2.sdp b/test/fuzzers/corpora/sdp-corpus/2.sdp
deleted file mode 100644
index 96c4975..0000000
--- a/test/fuzzers/corpora/sdp-corpus/2.sdp
+++ /dev/null
@@ -1,12 +0,0 @@
-v=0
-o=alice 2890844526 2890844526 IN IP4 host.atlanta.example.com
-s=
-c=IN IP4 host.atlanta.example.com
-t=0 0
-m=audio 49170 RTP/AVP 0 8 97
-a=rtpmap:0 PCMU/8000
-a=rtpmap:8 PCMA/8000
-a=rtpmap:97 iLBC/8000
-m=video 51372 RTP/AVP 31 32
-a=rtpmap:31 H261/90000
-a=rtpmap:32 MPV/90000
diff --git a/test/fuzzers/corpora/sdp-corpus/20.sdp b/test/fuzzers/corpora/sdp-corpus/20.sdp
deleted file mode 100644
index b2c072a..0000000
--- a/test/fuzzers/corpora/sdp-corpus/20.sdp
+++ /dev/null
@@ -1,10 +0,0 @@
-v=0
-o=alice 2890844526 2890844527 IN IP4 host.atlanta.example.com
-s=
-c=IN IP4 host.atlanta.example.com
-t=0 0
-m=audio 49170 RTP/AVP 99
-a=rtpmap:99 iLBC/8000
-m=video 51372 RTP/AVP 31 32
-a=rtpmap:31 H261/90000
-a=rtpmap:32 MPV/90000
diff --git a/test/fuzzers/corpora/sdp-corpus/21.sdp b/test/fuzzers/corpora/sdp-corpus/21.sdp
deleted file mode 100644
index 28e9491..0000000
--- a/test/fuzzers/corpora/sdp-corpus/21.sdp
+++ /dev/null
@@ -1,10 +0,0 @@
-v=0
-o=bob 2808844564 2808844565 IN IP4 host.biloxi.example.com
-s=
-c=IN IP4 host.biloxi.example.com
-t=0 0
-m=audio 49172 RTP/AVP 99
-a=rtpmap:99 iLBC/8000
-m=video 51374 RTP/AVP 31 32
-a=rtpmap:31 H261/90000
-a=rtpmap:32 MPV/90000
diff --git a/test/fuzzers/corpora/sdp-corpus/22.sdp b/test/fuzzers/corpora/sdp-corpus/22.sdp
deleted file mode 100644
index 96c4975..0000000
--- a/test/fuzzers/corpora/sdp-corpus/22.sdp
+++ /dev/null
@@ -1,12 +0,0 @@
-v=0
-o=alice 2890844526 2890844526 IN IP4 host.atlanta.example.com
-s=
-c=IN IP4 host.atlanta.example.com
-t=0 0
-m=audio 49170 RTP/AVP 0 8 97
-a=rtpmap:0 PCMU/8000
-a=rtpmap:8 PCMA/8000
-a=rtpmap:97 iLBC/8000
-m=video 51372 RTP/AVP 31 32
-a=rtpmap:31 H261/90000
-a=rtpmap:32 MPV/90000
diff --git a/test/fuzzers/corpora/sdp-corpus/23.sdp b/test/fuzzers/corpora/sdp-corpus/23.sdp
deleted file mode 100644
index 36c7d70..0000000
--- a/test/fuzzers/corpora/sdp-corpus/23.sdp
+++ /dev/null
@@ -1,10 +0,0 @@
-v=0
-o=bob 2808844564 2808844564 IN IP4 host.biloxi.example.com
-s=
-c=IN IP4 host.biloxi.example.com
-t=0 0
-m=audio 49174 RTP/AVP 0
-a=rtpmap:0 PCMU/8000
-m=video 49172 RTP/AVP 32
-c=IN IP4 otherhost.biloxi.example.com
-a=rtpmap:32 MPV/90000
diff --git a/test/fuzzers/corpora/sdp-corpus/24.sdp b/test/fuzzers/corpora/sdp-corpus/24.sdp
deleted file mode 100644
index 6cf5dc5..0000000
--- a/test/fuzzers/corpora/sdp-corpus/24.sdp
+++ /dev/null
@@ -1,8 +0,0 @@
-v=0
-o=alice 2890844526 2890844526 IN IP4 host.atlanta.example.com
-s=
-c=IN IP4 host.atlanta.example.com
-t=0 0
-m=audio 49170 RTP/AVP 0 97
-a=rtpmap:0 PCMU/8000
-a=rtpmap:97 iLBC/8000
diff --git a/test/fuzzers/corpora/sdp-corpus/25.sdp b/test/fuzzers/corpora/sdp-corpus/25.sdp
deleted file mode 100644
index ac1ec85..0000000
--- a/test/fuzzers/corpora/sdp-corpus/25.sdp
+++ /dev/null
@@ -1,8 +0,0 @@
-v=0
-o=bob 2808844564 2808844564 IN IP4 host.biloxi.example.com
-s=
-c=IN IP4 placeholder.biloxi.example.com
-t=0 0
-m=audio 49172 RTP/AVP 97
-a=rtpmap:97 iLBC/8000
-a=sendonly
diff --git a/test/fuzzers/corpora/sdp-corpus/26.sdp b/test/fuzzers/corpora/sdp-corpus/26.sdp
deleted file mode 100644
index f0eb0d6..0000000
--- a/test/fuzzers/corpora/sdp-corpus/26.sdp
+++ /dev/null
@@ -1,7 +0,0 @@
-v=0
-o=bob 2808844564 2808844565 IN IP4 host.biloxi.example.com
-s=
-c=IN IP4 host.biloxi.example.com
-t=0 0
-m=audio 49170 RTP/AVP 97
-a=rtpmap:97 iLBC/8000
diff --git a/test/fuzzers/corpora/sdp-corpus/27.sdp b/test/fuzzers/corpora/sdp-corpus/27.sdp
deleted file mode 100644
index 1e4f3b3..0000000
--- a/test/fuzzers/corpora/sdp-corpus/27.sdp
+++ /dev/null
@@ -1,7 +0,0 @@
-v=0
-o=alice 2890844526 2890844527 IN IP4 host.atlanta.example.com
-s=
-c=IN IP4 host.atlanta.example.com
-t=0 0
-m=audio 49178 RTP/AVP 97
-a=rtpmap:97 iLBC/8000
diff --git a/test/fuzzers/corpora/sdp-corpus/28.sdp b/test/fuzzers/corpora/sdp-corpus/28.sdp
deleted file mode 100644
index 36319c4..0000000
--- a/test/fuzzers/corpora/sdp-corpus/28.sdp
+++ /dev/null
@@ -1,11 +0,0 @@
-v=0
-o=alice 2890844526 2890844526 IN IP4 host.atlanta.example.com
-s=
-c=IN IP4 host.atlanta.example.com
-t=0 0
-m=audio 49170 RTP/AVP 0 97
-a=rtpmap:0 PCMU/8000
-a=rtpmap:97 iLBC/8000
-m=audio 49172 RTP/AVP 98
-a=rtpmap:98 telephone-event/8000
-a=sendonly
diff --git a/test/fuzzers/corpora/sdp-corpus/29.sdp b/test/fuzzers/corpora/sdp-corpus/29.sdp
deleted file mode 100644
index c3dbce4..0000000
--- a/test/fuzzers/corpora/sdp-corpus/29.sdp
+++ /dev/null
@@ -1,10 +0,0 @@
-v=0
-o=bob 2808844564 2808844564 IN IP4 host.biloxi.example.com
-s=
-c=IN IP4 host.biloxi.example.com
-t=0 0
-m=audio 49172 RTP/AVP 97
-a=rtpmap:97 iLBC/8000
-m=audio 49174 RTP/AVP 98
-a=rtpmap:98 telephone-event/8000
-a=recvonly
diff --git a/test/fuzzers/corpora/sdp-corpus/3.sdp b/test/fuzzers/corpora/sdp-corpus/3.sdp
deleted file mode 100644
index b0142f5..0000000
--- a/test/fuzzers/corpora/sdp-corpus/3.sdp
+++ /dev/null
@@ -1,9 +0,0 @@
-v=0
-o=bob 2808844564 2808844564 IN IP4 host.biloxi.example.com
-s=
-c=IN IP4 host.biloxi.example.com
-t=0 0
-m=audio 49174 RTP/AVP 0
-a=rtpmap:0 PCMU/8000
-m=video 49170 RTP/AVP 32
-a=rtpmap:32 MPV/90000
diff --git a/test/fuzzers/corpora/sdp-corpus/30.sdp b/test/fuzzers/corpora/sdp-corpus/30.sdp
deleted file mode 100644
index 0798631..0000000
--- a/test/fuzzers/corpora/sdp-corpus/30.sdp
+++ /dev/null
@@ -1,11 +0,0 @@
-v=0
-o=bob 2808844564 2808844565 IN IP4 host.biloxi.example.com
-s=
-c=IN IP4 host.biloxi.example.com
-t=0 0
-m=audio 49172 RTP/AVP 97
-a=rtpmap:97 iLBC/8000
-a=sendonly
-m=audio 49174 RTP/AVP 98
-a=rtpmap:98 telephone-event/8000
-a=recvonly
diff --git a/test/fuzzers/corpora/sdp-corpus/31.sdp b/test/fuzzers/corpora/sdp-corpus/31.sdp
deleted file mode 100644
index 78efdd8..0000000
--- a/test/fuzzers/corpora/sdp-corpus/31.sdp
+++ /dev/null
@@ -1,11 +0,0 @@
-v=0
-o=alice 2890844526 2890844527 IN IP4 host.atlanta.example.com
-s=
-c=IN IP4 host.atlanta.example.com
-t=0 0
-m=audio 49170 RTP/AVP 0 97
-a=rtpmap:0 PCMU/8000
-a=rtpmap:97 iLBC/8000
-m=audio 49172 RTP/AVP 98
-a=rtpmap:98 telephone-event/8000
-a=sendonly
diff --git a/test/fuzzers/corpora/sdp-corpus/32.sdp b/test/fuzzers/corpora/sdp-corpus/32.sdp
deleted file mode 100644
index 6cf5dc5..0000000
--- a/test/fuzzers/corpora/sdp-corpus/32.sdp
+++ /dev/null
@@ -1,8 +0,0 @@
-v=0
-o=alice 2890844526 2890844526 IN IP4 host.atlanta.example.com
-s=
-c=IN IP4 host.atlanta.example.com
-t=0 0
-m=audio 49170 RTP/AVP 0 97
-a=rtpmap:0 PCMU/8000
-a=rtpmap:97 iLBC/8000
diff --git a/test/fuzzers/corpora/sdp-corpus/33.sdp b/test/fuzzers/corpora/sdp-corpus/33.sdp
deleted file mode 100644
index 23f462f..0000000
--- a/test/fuzzers/corpora/sdp-corpus/33.sdp
+++ /dev/null
@@ -1,7 +0,0 @@
-v=0
-o=bob 2808844564 2808844564 IN IP4 host.biloxi.example.com
-s=
-c=IN IP4 host.biloxi.example.com
-t=0 0
-m=audio 49170 RTP/AVP 97
-a=rtpmap:97 iLBC/8000
diff --git a/test/fuzzers/corpora/sdp-corpus/34.sdp b/test/fuzzers/corpora/sdp-corpus/34.sdp
deleted file mode 100644
index b52b947..0000000
--- a/test/fuzzers/corpora/sdp-corpus/34.sdp
+++ /dev/null
@@ -1,11 +0,0 @@
-v=0
-o=bob 2808844564 2808844565 IN IP4 host.biloxi.example.com
-s=
-c=IN IP4 host.biloxi.example.com
-t=0 0
-m=audio 49170 RTP/AVP 97
-a=rtpmap:97 iLBC/8000
-m=audio 48282 RTP/AVP 98
-c=IN IP4 mediaserver.biloxi.example.com
-a=rtpmap:98 telephone-event/8000
-a=recvonly
diff --git a/test/fuzzers/corpora/sdp-corpus/35.sdp b/test/fuzzers/corpora/sdp-corpus/35.sdp
deleted file mode 100644
index 07ad4f8..0000000
--- a/test/fuzzers/corpora/sdp-corpus/35.sdp
+++ /dev/null
@@ -1,11 +0,0 @@
-v=0
-o=alice 2890844526 2890844527 IN IP4 host.atlanta.example.com
-s=
-c=IN IP4 host.atlanta.example.com
-t=0 0
-m=audio 49170 RTP/AVP 97
-a=rtpmap:97 iLBC/8000
-m=audio 49172 RTP/AVP 98
-c=IN IP4 host.atlanta.example.com
-a=rtpmap:98 telephone-event/8000
-a=sendonly
diff --git a/test/fuzzers/corpora/sdp-corpus/36.sdp b/test/fuzzers/corpora/sdp-corpus/36.sdp
deleted file mode 100644
index c75c697..0000000
--- a/test/fuzzers/corpora/sdp-corpus/36.sdp
+++ /dev/null
@@ -1,7 +0,0 @@
-v=0
-o=alice 2890844526 2890844526 IN IP4 host.atlanta.example.com
-s=
-c=IN IP4 host.atlanta.example.com
-t=0 0
-m=audio 49170 RTP/AVP 0
-a=rtpmap:0 PCMU/8000
diff --git a/test/fuzzers/corpora/sdp-corpus/37.sdp b/test/fuzzers/corpora/sdp-corpus/37.sdp
deleted file mode 100644
index d05dbd6..0000000
--- a/test/fuzzers/corpora/sdp-corpus/37.sdp
+++ /dev/null
@@ -1,7 +0,0 @@
-v=0
-o=bob 2808844564 2808844564 IN IP4 host.biloxi.example.com
-s=
-c=IN IP4 host.biloxi.example.com
-t=0 0
-m=audio 49172 RTP/AVP 0
-a=rtpmap:0 PCMU/8000
diff --git a/test/fuzzers/corpora/sdp-corpus/38.sdp b/test/fuzzers/corpora/sdp-corpus/38.sdp
deleted file mode 100644
index 253ac07..0000000
--- a/test/fuzzers/corpora/sdp-corpus/38.sdp
+++ /dev/null
@@ -1,9 +0,0 @@
-v=0
-o=alice 2890844526 2890844527 IN IP4 host.atlanta.example.com
-s=
-c=IN IP4 host.atlanta.example.com
-t=0 0
-m=audio 49170 RTP/AVP 0
-a=rtpmap:0 PCMU/8000
-m=video 49172 RTP/AVP 31
-a=rtpmap:31 H261/90000
diff --git a/test/fuzzers/corpora/sdp-corpus/39.sdp b/test/fuzzers/corpora/sdp-corpus/39.sdp
deleted file mode 100644
index 57d3203..0000000
--- a/test/fuzzers/corpora/sdp-corpus/39.sdp
+++ /dev/null
@@ -1,9 +0,0 @@
-v=0
-o=bob 2808844564 2808844565 IN IP4 host.biloxi.example.com
-s=
-c=IN IP4 host.biloxi.example.com
-t=0 0
-m=audio 49172 RTP/AVP 0
-a=rtpmap:0 PCMU/8000
-m=video 49168 RTP/AVP 31
-a=rtpmap:31 H261/90000
diff --git a/test/fuzzers/corpora/sdp-corpus/4.sdp b/test/fuzzers/corpora/sdp-corpus/4.sdp
deleted file mode 100644
index 96c4975..0000000
--- a/test/fuzzers/corpora/sdp-corpus/4.sdp
+++ /dev/null
@@ -1,12 +0,0 @@
-v=0
-o=alice 2890844526 2890844526 IN IP4 host.atlanta.example.com
-s=
-c=IN IP4 host.atlanta.example.com
-t=0 0
-m=audio 49170 RTP/AVP 0 8 97
-a=rtpmap:0 PCMU/8000
-a=rtpmap:8 PCMA/8000
-a=rtpmap:97 iLBC/8000
-m=video 51372 RTP/AVP 31 32
-a=rtpmap:31 H261/90000
-a=rtpmap:32 MPV/90000
diff --git a/test/fuzzers/corpora/sdp-corpus/40.sdp b/test/fuzzers/corpora/sdp-corpus/40.sdp
deleted file mode 100644
index 26d4ff6..0000000
--- a/test/fuzzers/corpora/sdp-corpus/40.sdp
+++ /dev/null
@@ -1,9 +0,0 @@
-v=0
-o=alice 2890844526 2890844526 IN IP4 host.atlanta.example.com
-s=
-c=IN IP4 host.atlanta.example.com
-t=0 0
-m=audio 49170 RTP/AVP 97
-a=rtpmap:97 iLBC/8000
-m=video 51372 RTP/AVP 31
-a=rtpmap:31 H261/90000
diff --git a/test/fuzzers/corpora/sdp-corpus/41.sdp b/test/fuzzers/corpora/sdp-corpus/41.sdp
deleted file mode 100644
index f625e38..0000000
--- a/test/fuzzers/corpora/sdp-corpus/41.sdp
+++ /dev/null
@@ -1,9 +0,0 @@
-v=0
-o=bob 2808844564 2808844564 IN IP4 host.biloxi.example.com
-s=
-c=IN IP4 host.biloxi.example.com
-t=0 0
-m=audio 49174 RTP/AVP 97
-a=rtpmap:97 iLBC/8000
-m=video 49170 RTP/AVP 31
-a=rtpmap:31 H261/90000
diff --git a/test/fuzzers/corpora/sdp-corpus/42.sdp b/test/fuzzers/corpora/sdp-corpus/42.sdp
deleted file mode 100644
index 2dda9bb..0000000
--- a/test/fuzzers/corpora/sdp-corpus/42.sdp
+++ /dev/null
@@ -1,9 +0,0 @@
-v=0
-o=bob 2808844564 2808844565 IN IP4 host.biloxi.example.com
-s=
-c=IN IP4 host.biloxi.example.com
-t=0 0
-m=audio 49174 RTP/AVP 97
-a=rtpmap:97 iLBC/8000
-m=video 0 RTP/AVP 31
-a=rtpmap:31 H261/90000
diff --git a/test/fuzzers/corpora/sdp-corpus/43.sdp b/test/fuzzers/corpora/sdp-corpus/43.sdp
deleted file mode 100644
index 83a2bf9..0000000
--- a/test/fuzzers/corpora/sdp-corpus/43.sdp
+++ /dev/null
@@ -1,9 +0,0 @@
-v=0
-o=alice 2890844526 2890844527 IN IP4 host.atlanta.example.com
-s=
-c=IN IP4 host.atlanta.example.com
-t=0 0
-m=audio 49170 RTP/AVP 97
-a=rtpmap:97 iLBC/8000
-m=video 0 RTP/AVP 31
-a=rtpmap:31 H261/90000
diff --git a/test/fuzzers/corpora/sdp-corpus/44.sdp b/test/fuzzers/corpora/sdp-corpus/44.sdp
deleted file mode 100644
index e187d7d..0000000
--- a/test/fuzzers/corpora/sdp-corpus/44.sdp
+++ /dev/null
@@ -1,5 +0,0 @@
-v=0
-o=alice 2890844526 2890844526 IN IP4 host.atlanta.example.com
-s=
-c=IN IP4 host.atlanta.example.com
-t=0 0
diff --git a/test/fuzzers/corpora/sdp-corpus/45.sdp b/test/fuzzers/corpora/sdp-corpus/45.sdp
deleted file mode 100644
index 9e344f0..0000000
--- a/test/fuzzers/corpora/sdp-corpus/45.sdp
+++ /dev/null
@@ -1,5 +0,0 @@
-v=0
-o=bob 2808844564 2808844564 IN IP4 host.biloxi.example.com
-s=
-c=IN IP4 host.biloxi.example.com
-t=0 0
diff --git a/test/fuzzers/corpora/sdp-corpus/46.sdp b/test/fuzzers/corpora/sdp-corpus/46.sdp
deleted file mode 100644
index 8a63ca0..0000000
--- a/test/fuzzers/corpora/sdp-corpus/46.sdp
+++ /dev/null
@@ -1,7 +0,0 @@
-v=0
-o=alice 2890844526 2890844527 IN IP4 host.atlanta.example.com
-s=
-c=IN IP4 host.atlanta.example.com
-t=0 0
-m=audio 49170 RTP/AVP 97
-a=rtpmap:97 iLBC/8000
diff --git a/test/fuzzers/corpora/sdp-corpus/47.sdp b/test/fuzzers/corpora/sdp-corpus/47.sdp
deleted file mode 100644
index 66dadbb..0000000
--- a/test/fuzzers/corpora/sdp-corpus/47.sdp
+++ /dev/null
@@ -1,7 +0,0 @@
-v=0
-o=bob 2808844564 2808844565 IN IP4 host.biloxi.example.com
-s=
-c=IN IP4 host.biloxi.example.com
-t=0 0
-m=audio 49172 RTP/AVP 97
-a=rtpmap:97 iLBC/8000
diff --git a/test/fuzzers/corpora/sdp-corpus/48.sdp b/test/fuzzers/corpora/sdp-corpus/48.sdp
deleted file mode 100644
index 6df76ab..0000000
--- a/test/fuzzers/corpora/sdp-corpus/48.sdp
+++ /dev/null
@@ -1,7 +0,0 @@
-v=0
-o=alice 2890844526 2890844526 IN IP4 host.atlanta.example.com
-s=
-c=IN IP4 0.0.0.0
-t=0 0
-m=audio 23442 RTP/AVP 97
-a=rtpmap:97 iLBC/8000
diff --git a/test/fuzzers/corpora/sdp-corpus/49.sdp b/test/fuzzers/corpora/sdp-corpus/49.sdp
deleted file mode 100644
index 23f462f..0000000
--- a/test/fuzzers/corpora/sdp-corpus/49.sdp
+++ /dev/null
@@ -1,7 +0,0 @@
-v=0
-o=bob 2808844564 2808844564 IN IP4 host.biloxi.example.com
-s=
-c=IN IP4 host.biloxi.example.com
-t=0 0
-m=audio 49170 RTP/AVP 97
-a=rtpmap:97 iLBC/8000
diff --git a/test/fuzzers/corpora/sdp-corpus/5.sdp b/test/fuzzers/corpora/sdp-corpus/5.sdp
deleted file mode 100644
index 264ab80..0000000
--- a/test/fuzzers/corpora/sdp-corpus/5.sdp
+++ /dev/null
@@ -1,10 +0,0 @@
-v=0
-o=bob 2808844564 2808844564 IN IP4 host.biloxi.example.com
-s=
-c=IN IP4 host.biloxi.example.com
-t=0 0
-m=audio 49172 RTP/AVP 0 8
-a=rtpmap:0 PCMU/8000
-a=rtpmap:8 PCMA/8000
-m=video 0 RTP/AVP 31
-a=rtpmap:31 H261/90000
diff --git a/test/fuzzers/corpora/sdp-corpus/50.sdp b/test/fuzzers/corpora/sdp-corpus/50.sdp
deleted file mode 100644
index 8a63ca0..0000000
--- a/test/fuzzers/corpora/sdp-corpus/50.sdp
+++ /dev/null
@@ -1,7 +0,0 @@
-v=0
-o=alice 2890844526 2890844527 IN IP4 host.atlanta.example.com
-s=
-c=IN IP4 host.atlanta.example.com
-t=0 0
-m=audio 49170 RTP/AVP 97
-a=rtpmap:97 iLBC/8000
diff --git a/test/fuzzers/corpora/sdp-corpus/51.sdp b/test/fuzzers/corpora/sdp-corpus/51.sdp
deleted file mode 100644
index 23f462f..0000000
--- a/test/fuzzers/corpora/sdp-corpus/51.sdp
+++ /dev/null
@@ -1,7 +0,0 @@
-v=0
-o=bob 2808844564 2808844564 IN IP4 host.biloxi.example.com
-s=
-c=IN IP4 host.biloxi.example.com
-t=0 0
-m=audio 49170 RTP/AVP 97
-a=rtpmap:97 iLBC/8000
diff --git a/test/fuzzers/corpora/sdp-corpus/52.sdp b/test/fuzzers/corpora/sdp-corpus/52.sdp
deleted file mode 100644
index 7c1730e..0000000
--- a/test/fuzzers/corpora/sdp-corpus/52.sdp
+++ /dev/null
@@ -1,7 +0,0 @@
-v=0
-o=alice 2890844526 2890844526 IN IP4 host.atlanta.example.com
-s=
-c=IN IP4 host.atlanta.example.com
-t=0 0
-m=audio 49170 RTP/AVP 97
-a=rtpmap:97 iLBC/8000
diff --git a/test/fuzzers/corpora/sdp-corpus/53.sdp b/test/fuzzers/corpora/sdp-corpus/53.sdp
deleted file mode 100644
index 5991576..0000000
--- a/test/fuzzers/corpora/sdp-corpus/53.sdp
+++ /dev/null
@@ -1,7 +0,0 @@
-v=0
-o=bob 2808844564 2808844564 IN IP4 host.biloxi.example.com
-s=
-c=IN IP4 0.0.0.0
-t=0 0
-m=audio 9322 RTP/AVP 97
-a=rtpmap:97 iLBC/8000
diff --git a/test/fuzzers/corpora/sdp-corpus/54.sdp b/test/fuzzers/corpora/sdp-corpus/54.sdp
deleted file mode 100644
index 66dadbb..0000000
--- a/test/fuzzers/corpora/sdp-corpus/54.sdp
+++ /dev/null
@@ -1,7 +0,0 @@
-v=0
-o=bob 2808844564 2808844565 IN IP4 host.biloxi.example.com
-s=
-c=IN IP4 host.biloxi.example.com
-t=0 0
-m=audio 49172 RTP/AVP 97
-a=rtpmap:97 iLBC/8000
diff --git a/test/fuzzers/corpora/sdp-corpus/55.sdp b/test/fuzzers/corpora/sdp-corpus/55.sdp
deleted file mode 100644
index bd724c4..0000000
--- a/test/fuzzers/corpora/sdp-corpus/55.sdp
+++ /dev/null
@@ -1,8 +0,0 @@
-v=0
-o=alice 2890844526 2890844526 IN IP4 host.atlanta.example.com
-s=
-c=IN IP4 host.atlanta.example.com
-t=0 0
-m=audio 49170 RTP/AVP 97
-a=rtpmap:97 iLBC/8000
-
diff --git a/test/fuzzers/corpora/sdp-corpus/6.sdp b/test/fuzzers/corpora/sdp-corpus/6.sdp
deleted file mode 100644
index 3f80345..0000000
--- a/test/fuzzers/corpora/sdp-corpus/6.sdp
+++ /dev/null
@@ -1,9 +0,0 @@
-v=0
-o=alice 2890844526 2890844527 IN IP4 host.atlanta.example.com
-s=
-c=IN IP4 host.atlanta.example.com
-t=0 0
-m=audio 51372 RTP/AVP 0
-a=rtpmap:0 PCMU/8000
-m=video 0 RTP/AVP 31
-a=rtpmap:31 H261/90000
diff --git a/test/fuzzers/corpora/sdp-corpus/7.sdp b/test/fuzzers/corpora/sdp-corpus/7.sdp
deleted file mode 100644
index 920ad82..0000000
--- a/test/fuzzers/corpora/sdp-corpus/7.sdp
+++ /dev/null
@@ -1,9 +0,0 @@
-v=0
-o=bob 2808844564 2808844565 IN IP4 host.biloxi.example.com
-s=
-c=IN IP4 host.biloxi.example.com
-t=0 0
-m=audio 49172 RTP/AVP 0
-a=rtpmap:0 PCMU/8000
-m=video 0 RTP/AVP 31
-a=rtpmap:31 H261/90000
diff --git a/test/fuzzers/corpora/sdp-corpus/8.sdp b/test/fuzzers/corpora/sdp-corpus/8.sdp
deleted file mode 100644
index 96c4975..0000000
--- a/test/fuzzers/corpora/sdp-corpus/8.sdp
+++ /dev/null
@@ -1,12 +0,0 @@
-v=0
-o=alice 2890844526 2890844526 IN IP4 host.atlanta.example.com
-s=
-c=IN IP4 host.atlanta.example.com
-t=0 0
-m=audio 49170 RTP/AVP 0 8 97
-a=rtpmap:0 PCMU/8000
-a=rtpmap:8 PCMA/8000
-a=rtpmap:97 iLBC/8000
-m=video 51372 RTP/AVP 31 32
-a=rtpmap:31 H261/90000
-a=rtpmap:32 MPV/90000
diff --git a/test/fuzzers/corpora/sdp-corpus/9.sdp b/test/fuzzers/corpora/sdp-corpus/9.sdp
deleted file mode 100644
index a9a5e12..0000000
--- a/test/fuzzers/corpora/sdp-corpus/9.sdp
+++ /dev/null
@@ -1,9 +0,0 @@
-v=0
-o=bob 2808844564 2808844564 IN IP4 host.biloxi.example.com
-s=
-c=IN IP4 host.biloxi.example.com
-t=0 0
-m=audio 49172 RTP/AVP 99
-a=rtpmap:99 iLBC/8000
-m=video 51374 RTP/AVP 31
-a=rtpmap:31 H261/90000
diff --git a/test/fuzzers/corpora/sdp-corpus/firefox-1.sdp b/test/fuzzers/corpora/sdp-corpus/firefox-1.sdp
deleted file mode 100644
index 6d664bc..0000000
--- a/test/fuzzers/corpora/sdp-corpus/firefox-1.sdp
+++ /dev/null
@@ -1,58 +0,0 @@
-v=0
-o=mozilla...THIS_IS_SDPARTA-46.0.1 5115930144083302970 0 IN IP4 0.0.0.0
-s=-
-t=0 0
-a=fingerprint:sha-256 24:67:5E:1B:9A:B9:CF:36:C5:30:8F:35:F7:B1:50:66:88:81:92:CB:29:BA:53:A5:02:C8:0A:A5:4E:9C:AE:D9
-a=group:BUNDLE sdparta_0 sdparta_1 sdparta_2
-a=ice-options:trickle
-a=msid-semantic:WMS *
-m=audio 9 UDP/TLS/RTP/SAVPF 109 9 0 8
-c=IN IP4 0.0.0.0
-a=sendrecv
-a=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level
-a=fmtp:109 maxplaybackrate=48000;stereo=1
-a=ice-pwd:b9f3911b591ae61e2d7f6af0531fd2a3
-a=ice-ufrag:3edc9012
-a=mid:sdparta_0
-a=msid:{258e92fb-547c-40ca-92e9-efe0cedb4cba} {bd1fafff-bfd0-40d4-b0a3-2a87cff307ee}
-a=rtcp-mux
-a=rtpmap:109 opus/48000/2
-a=rtpmap:9 G722/8000/1
-a=rtpmap:0 PCMU/8000
-a=rtpmap:8 PCMA/8000
-a=setup:actpass
-a=ssrc:2121669360 cname:{387b0735-bde2-43a4-8484-7f5663b60f24}
-m=video 9 UDP/TLS/RTP/SAVPF 120 126 97
-c=IN IP4 0.0.0.0
-a=sendrecv
-a=fmtp:126 profile-level-id=42e01f;level-asymmetry-allowed=1;packetization-mode=1
-a=fmtp:97 profile-level-id=42e01f;level-asymmetry-allowed=1
-a=fmtp:120 max-fs=12288;max-fr=60
-a=ice-pwd:b9f3911b591ae61e2d7f6af0531fd2a3
-a=ice-ufrag:3edc9012
-a=mid:sdparta_1
-a=msid:{258e92fb-547c-40ca-92e9-efe0cedb4cba} {9e8f5867-a9aa-4489-8bd4-3a8a57a5e592}
-a=rtcp-fb:120 nack
-a=rtcp-fb:120 nack pli
-a=rtcp-fb:120 ccm fir
-a=rtcp-fb:126 nack
-a=rtcp-fb:126 nack pli
-a=rtcp-fb:126 ccm fir
-a=rtcp-fb:97 nack
-a=rtcp-fb:97 nack pli
-a=rtcp-fb:97 ccm fir
-a=rtcp-mux
-a=rtpmap:120 VP8/90000
-a=rtpmap:126 H264/90000
-a=rtpmap:97 H264/90000
-a=setup:actpass
-a=ssrc:2158832026 cname:{387b0735-bde2-43a4-8484-7f5663b60f24}
-m=application 9 DTLS/SCTP 5000
-c=IN IP4 0.0.0.0
-a=sendrecv
-a=ice-pwd:b9f3911b591ae61e2d7f6af0531fd2a3
-a=ice-ufrag:3edc9012
-a=mid:sdparta_2
-a=sctpmap:5000 webrtc-datachannel 256
-a=setup:actpass
-a=ssrc:2670959794 cname:{387b0735-bde2-43a4-8484-7f5663b60f24}
diff --git a/test/fuzzers/corpora/sdp-corpus/firefox-2.sdp b/test/fuzzers/corpora/sdp-corpus/firefox-2.sdp
deleted file mode 100644
index 07806eb..0000000
--- a/test/fuzzers/corpora/sdp-corpus/firefox-2.sdp
+++ /dev/null
@@ -1,43 +0,0 @@
-v=0
-o=mozilla...THIS_IS_SDPARTA-46.0.1 3068771576687940834 0 IN IP4 0.0.0.0
-s=-
-t=0 0
-a=fingerprint:sha-256 AD:87:B3:11:E4:E2:BA:EF:D2:3F:2E:AC:24:57:8E:DC:1F:67:41:29:44:C4:96:E3:62:90:CC:90:59:CA:2C:84
-a=group:BUNDLE sdparta_0 sdparta_1 sdparta_2
-a=ice-options:trickle
-a=msid-semantic:WMS *
-m=audio 9 UDP/TLS/RTP/SAVPF 109
-c=IN IP4 0.0.0.0
-a=recvonly
-a=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level
-a=fmtp:109 maxplaybackrate=48000;stereo=1
-a=ice-pwd:ff4c4dc6fe92e1f22d2c10352d8967d5
-a=ice-ufrag:a539544b
-a=mid:sdparta_0
-a=rtcp-mux
-a=rtpmap:109 opus/48000/2
-a=setup:active
-a=ssrc:600995474 cname:{5b598a29-a81b-4ffe-a2c5-507778057e7a}
-m=video 9 UDP/TLS/RTP/SAVPF 120
-c=IN IP4 0.0.0.0
-a=recvonly
-a=fmtp:120 max-fs=12288;max-fr=60
-a=ice-pwd:ff4c4dc6fe92e1f22d2c10352d8967d5
-a=ice-ufrag:a539544b
-a=mid:sdparta_1
-a=rtcp-fb:120 nack
-a=rtcp-fb:120 nack pli
-a=rtcp-fb:120 ccm fir
-a=rtcp-mux
-a=rtpmap:120 VP8/90000
-a=setup:active
-a=ssrc:3480150809 cname:{5b598a29-a81b-4ffe-a2c5-507778057e7a}
-m=application 9 DTLS/SCTP 5000
-c=IN IP4 0.0.0.0
-a=sendrecv
-a=ice-pwd:ff4c4dc6fe92e1f22d2c10352d8967d5
-a=ice-ufrag:a539544b
-a=mid:sdparta_2
-a=sctpmap:5000 webrtc-datachannel 256
-a=setup:active
-a=ssrc:3021788991 cname:{5b598a29-a81b-4ffe-a2c5-507778057e7a}
diff --git a/test/fuzzers/corpora/sdp-corpus/opera-1.sdp b/test/fuzzers/corpora/sdp-corpus/opera-1.sdp
deleted file mode 100644
index 42d15e8..0000000
--- a/test/fuzzers/corpora/sdp-corpus/opera-1.sdp
+++ /dev/null
@@ -1,85 +0,0 @@
-v=0
-o=- 1656229333038673902 2 IN IP4 127.0.0.1
-s=-
-t=0 0
-a=group:BUNDLE audio video data
-a=msid-semantic: WMS Ppsa09YmDLBombOh5e8HqfqxEIPF69a46Hd4
-m=audio 9 UDP/TLS/RTP/SAVPF 111 103 104 9 0 8 106 105 13 126
-c=IN IP4 0.0.0.0
-a=rtcp:9 IN IP4 0.0.0.0
-a=ice-ufrag:1Jyk4q3nLIL5NiMx
-a=ice-pwd:GL8/iarMqPIhImfnsG2dyXlH
-a=fingerprint:sha-256 5A:16:96:94:B2:AC:60:27:64:C5:FE:46:6C:02:C0:CD:49:E3:E2:0B:5B:C9:D4:86:C4:B3:A4:F2:23:80:7A:DA
-a=setup:actpass
-a=mid:audio
-a=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level
-a=extmap:3 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
-a=sendrecv
-a=rtcp-mux
-a=rtpmap:111 opus/48000/2
-a=rtcp-fb:111 transport-cc
-a=fmtp:111 minptime=10; useinbandfec=1
-a=rtpmap:103 ISAC/16000
-a=rtpmap:104 ISAC/32000
-a=rtpmap:9 G722/8000
-a=rtpmap:0 PCMU/8000
-a=rtpmap:8 PCMA/8000
-a=rtpmap:106 CN/32000
-a=rtpmap:105 CN/16000
-a=rtpmap:13 CN/8000
-a=rtpmap:126 telephone-event/8000
-a=maxptime:60
-a=ssrc:2233075910 cname:VhHMGYCjn4alR9zP
-a=ssrc:2233075910 msid:Ppsa09YmDLBombOh5e8HqfqxEIPF69a46Hd4 689d3496-0896-4d52-bce6-8e90512a368b
-a=ssrc:2233075910 mslabel:Ppsa09YmDLBombOh5e8HqfqxEIPF69a46Hd4
-a=ssrc:2233075910 label:689d3496-0896-4d52-bce6-8e90512a368b
-m=video 9 UDP/TLS/RTP/SAVPF 100 101 116 117 96 97 98
-c=IN IP4 0.0.0.0
-a=rtcp:9 IN IP4 0.0.0.0
-a=ice-ufrag:1Jyk4q3nLIL5NiMx
-a=ice-pwd:GL8/iarMqPIhImfnsG2dyXlH
-a=fingerprint:sha-256 5A:16:96:94:B2:AC:60:27:64:C5:FE:46:6C:02:C0:CD:49:E3:E2:0B:5B:C9:D4:86:C4:B3:A4:F2:23:80:7A:DA
-a=setup:actpass
-a=mid:video
-a=extmap:2 urn:ietf:params:rtp-hdrext:toffset
-a=extmap:3 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
-a=extmap:4 urn:3gpp:video-orientation
-a=sendrecv
-a=rtcp-mux
-a=rtpmap:100 VP8/90000
-a=rtcp-fb:100 ccm fir
-a=rtcp-fb:100 nack
-a=rtcp-fb:100 nack pli
-a=rtcp-fb:100 goog-remb
-a=rtcp-fb:100 transport-cc
-a=rtpmap:101 VP9/90000
-a=rtcp-fb:101 ccm fir
-a=rtcp-fb:101 nack
-a=rtcp-fb:101 nack pli
-a=rtcp-fb:101 goog-remb
-a=rtcp-fb:101 transport-cc
-a=rtpmap:116 red/90000
-a=rtpmap:117 ulpfec/90000
-a=rtpmap:96 rtx/90000
-a=fmtp:96 apt=100
-a=rtpmap:97 rtx/90000
-a=fmtp:97 apt=101
-a=rtpmap:98 rtx/90000
-a=fmtp:98 apt=116
-a=ssrc-group:FID 50498894 2399294607
-a=ssrc:50498894 cname:VhHMGYCjn4alR9zP
-a=ssrc:50498894 msid:Ppsa09YmDLBombOh5e8HqfqxEIPF69a46Hd4 1aef96f4-fc4c-4f86-98f3-0fbf4f625f70
-a=ssrc:50498894 mslabel:Ppsa09YmDLBombOh5e8HqfqxEIPF69a46Hd4
-a=ssrc:50498894 label:1aef96f4-fc4c-4f86-98f3-0fbf4f625f70
-a=ssrc:2399294607 cname:VhHMGYCjn4alR9zP
-a=ssrc:2399294607 msid:Ppsa09YmDLBombOh5e8HqfqxEIPF69a46Hd4 1aef96f4-fc4c-4f86-98f3-0fbf4f625f70
-a=ssrc:2399294607 mslabel:Ppsa09YmDLBombOh5e8HqfqxEIPF69a46Hd4
-a=ssrc:2399294607 label:1aef96f4-fc4c-4f86-98f3-0fbf4f625f70
-m=application 9 DTLS/SCTP 5000
-c=IN IP4 0.0.0.0
-a=ice-ufrag:1Jyk4q3nLIL5NiMx
-a=ice-pwd:GL8/iarMqPIhImfnsG2dyXlH
-a=fingerprint:sha-256 5A:16:96:94:B2:AC:60:27:64:C5:FE:46:6C:02:C0:CD:49:E3:E2:0B:5B:C9:D4:86:C4:B3:A4:F2:23:80:7A:DA
-a=setup:actpass
-a=mid:data
-a=sctpmap:5000 webrtc-datachannel 1024
diff --git a/test/fuzzers/corpora/sdp-corpus/opera-2.sdp b/test/fuzzers/corpora/sdp-corpus/opera-2.sdp
deleted file mode 100644
index 6ed4e3b..0000000
--- a/test/fuzzers/corpora/sdp-corpus/opera-2.sdp
+++ /dev/null
@@ -1,73 +0,0 @@
-v=0
-o=- 2013283641453412290 2 IN IP4 127.0.0.1
-s=-
-t=0 0
-a=group:BUNDLE audio video data
-a=msid-semantic: WMS
-m=audio 9 UDP/TLS/RTP/SAVPF 111 103 104 9 0 8 106 105 13 126
-c=IN IP4 0.0.0.0
-a=rtcp:9 IN IP4 0.0.0.0
-a=ice-ufrag:YVa3KTlFDCwsfPOQ
-a=ice-pwd:ByUn1Od88VokVM0rtQ/bbeZa
-a=fingerprint:sha-256 5A:16:96:94:B2:AC:60:27:64:C5:FE:46:6C:02:C0:CD:49:E3:E2:0B:5B:C9:D4:86:C4:B3:A4:F2:23:80:7A:DA
-a=setup:active
-a=mid:audio
-a=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level
-a=extmap:3 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
-a=recvonly
-a=rtcp-mux
-a=rtpmap:111 opus/48000/2
-a=rtcp-fb:111 transport-cc
-a=fmtp:111 minptime=10; useinbandfec=1
-a=rtpmap:103 ISAC/16000
-a=rtpmap:104 ISAC/32000
-a=rtpmap:9 G722/8000
-a=rtpmap:0 PCMU/8000
-a=rtpmap:8 PCMA/8000
-a=rtpmap:106 CN/32000
-a=rtpmap:105 CN/16000
-a=rtpmap:13 CN/8000
-a=rtpmap:126 telephone-event/8000
-a=maxptime:60
-m=video 9 UDP/TLS/RTP/SAVPF 100 101 116 117 96 97 98
-c=IN IP4 0.0.0.0
-a=rtcp:9 IN IP4 0.0.0.0
-a=ice-ufrag:YVa3KTlFDCwsfPOQ
-a=ice-pwd:ByUn1Od88VokVM0rtQ/bbeZa
-a=fingerprint:sha-256 5A:16:96:94:B2:AC:60:27:64:C5:FE:46:6C:02:C0:CD:49:E3:E2:0B:5B:C9:D4:86:C4:B3:A4:F2:23:80:7A:DA
-a=setup:active
-a=mid:video
-a=extmap:2 urn:ietf:params:rtp-hdrext:toffset
-a=extmap:3 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
-a=extmap:4 urn:3gpp:video-orientation
-a=recvonly
-a=rtcp-mux
-a=rtpmap:100 VP8/90000
-a=rtcp-fb:100 ccm fir
-a=rtcp-fb:100 nack
-a=rtcp-fb:100 nack pli
-a=rtcp-fb:100 goog-remb
-a=rtcp-fb:100 transport-cc
-a=rtpmap:101 VP9/90000
-a=rtcp-fb:101 ccm fir
-a=rtcp-fb:101 nack
-a=rtcp-fb:101 nack pli
-a=rtcp-fb:101 goog-remb
-a=rtcp-fb:101 transport-cc
-a=rtpmap:116 red/90000
-a=rtpmap:117 ulpfec/90000
-a=rtpmap:96 rtx/90000
-a=fmtp:96 apt=100
-a=rtpmap:97 rtx/90000
-a=fmtp:97 apt=101
-a=rtpmap:98 rtx/90000
-a=fmtp:98 apt=116
-m=application 9 DTLS/SCTP 5000
-c=IN IP4 0.0.0.0
-b=AS:30
-a=ice-ufrag:YVa3KTlFDCwsfPOQ
-a=ice-pwd:ByUn1Od88VokVM0rtQ/bbeZa
-a=fingerprint:sha-256 5A:16:96:94:B2:AC:60:27:64:C5:FE:46:6C:02:C0:CD:49:E3:E2:0B:5B:C9:D4:86:C4:B3:A4:F2:23:80:7A:DA
-a=setup:active
-a=mid:data
-a=sctpmap:5000 webrtc-datachannel 1024
diff --git a/test/fuzzers/corpora/sdp-corpus/unittest-1.sdp b/test/fuzzers/corpora/sdp-corpus/unittest-1.sdp
deleted file mode 100644
index ce349ac..0000000
--- a/test/fuzzers/corpora/sdp-corpus/unittest-1.sdp
+++ /dev/null
@@ -1,52 +0,0 @@
-v=0
-o=- 18446744069414584320 18446462598732840960 IN IP4 127.0.0.1
-s=-
-t=0 0
-a=msid-semantic: WMS local_stream_1
-m=audio 2345 RTP/SAVPF 111 103 104
-c=IN IP4 74.125.127.126
-a=rtcp:2347 IN IP4 74.125.127.126
-a=candidate:a0+B/1 1 udp 2130706432 192.168.1.5 1234 typ host generation 2
-a=candidate:a0+B/1 2 udp 2130706432 192.168.1.5 1235 typ host generation 2
-a=candidate:a0+B/2 1 udp 2130706432 ::1 1238 typ host generation 2
-a=candidate:a0+B/2 2 udp 2130706432 ::1 1239 typ host generation 2
-a=candidate:a0+B/3 1 udp 2130706432 74.125.127.126 2345 typ srflx raddr 192.168.1.5 rport 2346 generation 2
-a=candidate:a0+B/3 2 udp 2130706432 74.125.127.126 2347 typ srflx raddr 192.168.1.5 rport 2348 generation 2
-a=ice-ufrag:ufrag_voice
-a=ice-pwd:pwd_voice
-a=mid:audio_content_name
-a=sendrecv
-a=rtcp-mux
-a=rtcp-rsize
-a=crypto:1 AES_CM_128_HMAC_SHA1_32 inline:NzB4d1BINUAvLEw6UzF3WSJ+PSdFcGdUJShpX1Zj|2^20|1:32 dummy_session_params
-a=rtpmap:111 opus/48000/2
-a=rtpmap:103 ISAC/16000
-a=rtpmap:104 ISAC/32000
-a=ssrc:1 cname:stream_1_cname
-a=ssrc:1 msid:local_stream_1 audio_track_id_1
-a=ssrc:1 mslabel:local_stream_1
-a=ssrc:1 label:audio_track_id_1
-m=video 3457 RTP/SAVPF 120
-c=IN IP4 74.125.224.39
-a=rtcp:3456 IN IP4 74.125.224.39
-a=candidate:a0+B/1 2 udp 2130706432 192.168.1.5 1236 typ host generation 2
-a=candidate:a0+B/1 1 udp 2130706432 192.168.1.5 1237 typ host generation 2
-a=candidate:a0+B/2 2 udp 2130706432 ::1 1240 typ host generation 2
-a=candidate:a0+B/2 1 udp 2130706432 ::1 1241 typ host generation 2
-a=candidate:a0+B/4 2 udp 2130706432 74.125.224.39 3456 typ relay generation 2
-a=candidate:a0+B/4 1 udp 2130706432 74.125.224.39 3457 typ relay generation 2
-a=ice-ufrag:ufrag_video
-a=ice-pwd:pwd_video
-a=mid:video_content_name
-a=sendrecv
-a=crypto:1 AES_CM_128_HMAC_SHA1_80 inline:d0RmdmcmVCspeEc3QGZiNWpVLFJhQX1cfHAwJSoj|2^20|1:32
-a=rtpmap:120 VP8/90000
-a=ssrc-group:FEC 2 3
-a=ssrc:2 cname:stream_1_cname
-a=ssrc:2 msid:local_stream_1 video_track_id_1
-a=ssrc:2 mslabel:local_stream_1
-a=ssrc:2 label:video_track_id_1
-a=ssrc:3 cname:stream_1_cname
-a=ssrc:3 msid:local_stream_1 video_track_id_1
-a=ssrc:3 mslabel:local_stream_1
-a=ssrc:3 label:video_track_id_1
diff --git a/test/fuzzers/corpora/sdp-corpus/unittest-2.sdp b/test/fuzzers/corpora/sdp-corpus/unittest-2.sdp
deleted file mode 100644
index a353925..0000000
--- a/test/fuzzers/corpora/sdp-corpus/unittest-2.sdp
+++ /dev/null
@@ -1,40 +0,0 @@
-v=0
-o=- 18446744069414584320 18446462598732840960 IN IP4 127.0.0.1
-s=-
-t=0 0
-a=msid-semantic: WMS local_stream_1
-m=audio 9 RTP/SAVPF 111 103 104
-c=IN IP4 0.0.0.0
-a=rtcp:9 IN IP4 0.0.0.0
-a=ice-ufrag:ufrag_voice
-a=ice-pwd:pwd_voice
-a=mid:audio_content_name
-a=sendrecv
-a=rtcp-mux
-a=rtcp-rsize
-a=crypto:1 AES_CM_128_HMAC_SHA1_32 inline:NzB4d1BINUAvLEw6UzF3WSJ+PSdFcGdUJShpX1Zj|2^20|1:32 dummy_session_params
-a=rtpmap:111 opus/48000/2
-a=rtpmap:103 ISAC/16000
-a=rtpmap:104 ISAC/32000
-a=ssrc:1 cname:stream_1_cname
-a=ssrc:1 msid:local_stream_1 audio_track_id_1
-a=ssrc:1 mslabel:local_stream_1
-a=ssrc:1 label:audio_track_id_1
-m=video 9 RTP/SAVPF 120
-c=IN IP4 0.0.0.0
-a=rtcp:9 IN IP4 0.0.0.0
-a=ice-ufrag:ufrag_video
-a=ice-pwd:pwd_video
-a=mid:video_content_name
-a=sendrecv
-a=crypto:1 AES_CM_128_HMAC_SHA1_80 inline:d0RmdmcmVCspeEc3QGZiNWpVLFJhQX1cfHAwJSoj|2^20|1:32
-a=rtpmap:120 VP8/90000
-a=ssrc-group:FEC 2 3
-a=ssrc:2 cname:stream_1_cname
-a=ssrc:2 msid:local_stream_1 video_track_id_1
-a=ssrc:2 mslabel:local_stream_1
-a=ssrc:2 label:video_track_id_1
-a=ssrc:3 cname:stream_1_cname
-a=ssrc:3 msid:local_stream_1 video_track_id_1
-a=ssrc:3 mslabel:local_stream_1
-a=ssrc:3 label:video_track_id_1
diff --git a/test/fuzzers/corpora/sdp-corpus/unittest-3.sdp b/test/fuzzers/corpora/sdp-corpus/unittest-3.sdp
deleted file mode 100644
index 50f8e55..0000000
--- a/test/fuzzers/corpora/sdp-corpus/unittest-3.sdp
+++ /dev/null
@@ -1,13 +0,0 @@
-m=application 9 RTP/SAVPF 101
-c=IN IP4 0.0.0.0
-a=rtcp:9 IN IP4 0.0.0.0
-a=ice-ufrag:ufrag_data
-a=ice-pwd:pwd_data
-a=mid:data_content_name
-a=sendrecv
-a=crypto:1 AES_CM_128_HMAC_SHA1_80 inline:FvLcvU2P3ZWmQxgPAgcDu7Zl9vftYElFOjEzhWs5
-a=rtpmap:101 google-data/90000
-a=ssrc:10 cname:data_channel_cname
-a=ssrc:10 msid:data_channel data_channeld0
-a=ssrc:10 mslabel:data_channel
-a=ssrc:10 label:data_channeld0
diff --git a/test/fuzzers/corpora/sdp-corpus/unittest-4.sdp b/test/fuzzers/corpora/sdp-corpus/unittest-4.sdp
deleted file mode 100644
index 709db42..0000000
--- a/test/fuzzers/corpora/sdp-corpus/unittest-4.sdp
+++ /dev/null
@@ -1,11 +0,0 @@
-v=0
-o=- 18446744069414584320 18446462598732840960 IN IP4 127.0.0.1
-s=-
-t=0 0
-a=msid-semantic: WMS
-m=audio 9 RTP/SAVPF 111 103 104
-c=IN IP4 0.0.0.0
-a=x-google-flag:conference
-m=video 9 RTP/SAVPF 120
-c=IN IP4 0.0.0.0
-a=x-google-flag:conference
diff --git a/test/fuzzers/corpora/sdp-corpus/unittest-5.sdp b/test/fuzzers/corpora/sdp-corpus/unittest-5.sdp
deleted file mode 100644
index c440386..0000000
--- a/test/fuzzers/corpora/sdp-corpus/unittest-5.sdp
+++ /dev/null
@@ -1,5 +0,0 @@
-v=0
-o=- 18446744069414584320 18446462598732840960 IN IP4 127.0.0.1
-s=-
-t=0 0
-a=msid-semantic: WMS local_stream
diff --git a/test/fuzzers/corpora/sdp-corpus/unittest-6.sdp b/test/fuzzers/corpora/sdp-corpus/unittest-6.sdp
deleted file mode 100644
index e07b564..0000000
--- a/test/fuzzers/corpora/sdp-corpus/unittest-6.sdp
+++ /dev/null
@@ -1,12 +0,0 @@
-m=audio 9 RTP/SAVPF 111
-c=IN IP4 0.0.0.0
-a=rtcp:9 IN IP4 0.0.0.0
-a=ice-ufrag:ufrag_voice
-a=ice-pwd:pwd_voice
-a=mid:audio_content_name
-a=sendrecv
-a=rtpmap:111 opus/48000/2
-a=ssrc:1 cname:stream_1_cname
-a=ssrc:1 msid:local_stream audio_track_id_1
-a=ssrc:1 mslabel:local_stream
-a=ssrc:1 label:audio_track_id_1
diff --git a/test/fuzzers/corpora/sdp-corpus/unittest-7.sdp b/test/fuzzers/corpora/sdp-corpus/unittest-7.sdp
deleted file mode 100644
index 8bdacc2..0000000
--- a/test/fuzzers/corpora/sdp-corpus/unittest-7.sdp
+++ /dev/null
@@ -1,12 +0,0 @@
-m=video 9 RTP/SAVPF 120
-c=IN IP4 0.0.0.0
-a=rtcp:9 IN IP4 0.0.0.0
-a=ice-ufrag:ufrag_video
-a=ice-pwd:pwd_video
-a=mid:video_content_name
-a=sendrecv
-a=rtpmap:120 VP8/90000
-a=ssrc:2 cname:stream_1_cname
-a=ssrc:2 msid:local_stream video_track_id_1
-a=ssrc:2 mslabel:local_stream
-a=ssrc:2 label:video_track_id_1
diff --git a/test/fuzzers/corpora/sdp-corpus/unittest-8.sdp b/test/fuzzers/corpora/sdp-corpus/unittest-8.sdp
deleted file mode 100644
index 9688fc4..0000000
--- a/test/fuzzers/corpora/sdp-corpus/unittest-8.sdp
+++ /dev/null
@@ -1,64 +0,0 @@
-v=0
-o=- 18446744069414584320 18446462598732840960 IN IP4 127.0.0.1
-s=-
-t=0 0
-a=msid-semantic: WMS local_stream_1 local_stream_2
-m=audio 2345 RTP/SAVPF 111 103 104
-c=IN IP4 74.125.127.126
-a=rtcp:2347 IN IP4 74.125.127.126
-a=candidate:a0+B/1 1 udp 2130706432 192.168.1.5 1234 typ host generation 2
-a=candidate:a0+B/1 2 udp 2130706432 192.168.1.5 1235 typ host generation 2
-a=candidate:a0+B/2 1 udp 2130706432 ::1 1238 typ host generation 2
-a=candidate:a0+B/2 2 udp 2130706432 ::1 1239 typ host generation 2
-a=candidate:a0+B/3 1 udp 2130706432 74.125.127.126 2345 typ srflx raddr 192.168.1.5 rport 2346 generation 2
-a=candidate:a0+B/3 2 udp 2130706432 74.125.127.126 2347 typ srflx raddr 192.168.1.5 rport 2348 generation 2
-a=ice-ufrag:ufrag_voice
-a=ice-pwd:pwd_voice
-a=mid:audio_content_name
-a=sendrecv
-a=rtcp-mux
-a=rtcp-rsize
-a=crypto:1 AES_CM_128_HMAC_SHA1_32 inline:NzB4d1BINUAvLEw6UzF3WSJ+PSdFcGdUJShpX1Zj|2^20|1:32 dummy_session_params
-a=rtpmap:111 opus/48000/2
-a=rtpmap:103 ISAC/16000
-a=rtpmap:104 ISAC/32000
-a=ssrc:1 cname:stream_1_cname
-a=ssrc:1 msid:local_stream_1 audio_track_id_1
-a=ssrc:1 mslabel:local_stream_1
-a=ssrc:1 label:audio_track_id_1
-a=ssrc:4 cname:stream_2_cname
-a=ssrc:4 msid:local_stream_2 audio_track_id_2
-a=ssrc:4 mslabel:local_stream_2
-a=ssrc:4 label:audio_track_id_2
-m=video 3457 RTP/SAVPF 120
-c=IN IP4 74.125.224.39
-a=rtcp:3456 IN IP4 74.125.224.39
-a=candidate:a0+B/1 2 udp 2130706432 192.168.1.5 1236 typ host generation 2
-a=candidate:a0+B/1 1 udp 2130706432 192.168.1.5 1237 typ host generation 2
-a=candidate:a0+B/2 2 udp 2130706432 ::1 1240 typ host generation 2
-a=candidate:a0+B/2 1 udp 2130706432 ::1 1241 typ host generation 2
-a=candidate:a0+B/4 2 udp 2130706432 74.125.224.39 3456 typ relay generation 2
-a=candidate:a0+B/4 1 udp 2130706432 74.125.224.39 3457 typ relay generation 2
-a=ice-ufrag:ufrag_video
-a=ice-pwd:pwd_video
-a=mid:video_content_name
-a=sendrecv
-a=crypto:1 AES_CM_128_HMAC_SHA1_80 inline:d0RmdmcmVCspeEc3QGZiNWpVLFJhQX1cfHAwJSoj|2^20|1:32
-a=rtpmap:120 VP8/90000
-a=ssrc-group:FEC 2 3
-a=ssrc:2 cname:stream_1_cname
-a=ssrc:2 msid:local_stream_1 video_track_id_1
-a=ssrc:2 mslabel:local_stream_1
-a=ssrc:2 label:video_track_id_1
-a=ssrc:3 cname:stream_1_cname
-a=ssrc:3 msid:local_stream_1 video_track_id_1
-a=ssrc:3 mslabel:local_stream_1
-a=ssrc:3 label:video_track_id_1
-a=ssrc:5 cname:stream_2_cname
-a=ssrc:5 msid:local_stream_2 video_track_id_2
-a=ssrc:5 mslabel:local_stream_2
-a=ssrc:5 label:video_track_id_2
-a=ssrc:6 cname:stream_2_cname
-a=ssrc:6 msid:local_stream_2 video_track_id_3
-a=ssrc:6 mslabel:local_stream_2
-a=ssrc:6 label:video_track_id_3
diff --git a/test/fuzzers/corpora/sdp-corpus/unittest-9.sdp b/test/fuzzers/corpora/sdp-corpus/unittest-9.sdp
deleted file mode 100644
index 8c7c4c7..0000000
--- a/test/fuzzers/corpora/sdp-corpus/unittest-9.sdp
+++ /dev/null
@@ -1,66 +0,0 @@
-v=0
-o=- 18446744069414584320 18446462598732840960 IN IP4 127.0.0.1
-s=-
-t=0 0
-a=msid-semantic: WMS local_stream_1 local_stream_2
-m=audio 2345 RTP/SAVPF 111 103 104
-c=IN IP4 74.125.127.126
-a=rtcp:2347 IN IP4 74.125.127.126
-a=candidate:a0+B/1 1 udp 2130706432 192.168.1.5 1234 typ host generation 2
-a=candidate:a0+B/1 2 udp 2130706432 192.168.1.5 1235 typ host generation 2
-a=candidate:a0+B/2 1 udp 2130706432 ::1 1238 typ host generation 2
-a=candidate:a0+B/2 2 udp 2130706432 ::1 1239 typ host generation 2
-a=candidate:a0+B/3 1 udp 2130706432 74.125.127.126 2345 typ srflx raddr 192.168.1.5 rport 2346 generation 2
-a=candidate:a0+B/3 2 udp 2130706432 74.125.127.126 2347 typ srflx raddr 192.168.1.5 rport 2348 generation 2
-a=ice-ufrag:ufrag_voice
-a=ice-pwd:pwd_voice
-a=mid:audio_content_name
-a=msid:local_stream_1 audio_track_id_1
-a=sendrecv
-a=rtcp-mux
-a=rtcp-rsize
-a=crypto:1 AES_CM_128_HMAC_SHA1_32 inline:NzB4d1BINUAvLEw6UzF3WSJ+PSdFcGdUJShpX1Zj|2^20|1:32 dummy_session_params
-a=rtpmap:111 opus/48000/2
-a=rtpmap:103 ISAC/16000
-a=rtpmap:104 ISAC/32000
-a=ssrc:1 cname:stream_1_cname
-a=ssrc:1 msid:local_stream_1 audio_track_id_1
-a=ssrc:1 mslabel:local_stream_1
-a=ssrc:1 label:audio_track_id_1
-a=ssrc:4 cname:stream_2_cname
-a=ssrc:4 msid:local_stream_2 audio_track_id_2
-a=ssrc:4 mslabel:local_stream_2
-a=ssrc:4 label:audio_track_id_2
-m=video 3457 RTP/SAVPF 120
-c=IN IP4 74.125.224.39
-a=rtcp:3456 IN IP4 74.125.224.39
-a=candidate:a0+B/1 2 udp 2130706432 192.168.1.5 1236 typ host generation 2
-a=candidate:a0+B/1 1 udp 2130706432 192.168.1.5 1237 typ host generation 2
-a=candidate:a0+B/2 2 udp 2130706432 ::1 1240 typ host generation 2
-a=candidate:a0+B/2 1 udp 2130706432 ::1 1241 typ host generation 2
-a=candidate:a0+B/4 2 udp 2130706432 74.125.224.39 3456 typ relay generation 2
-a=candidate:a0+B/4 1 udp 2130706432 74.125.224.39 3457 typ relay generation 2
-a=ice-ufrag:ufrag_video
-a=ice-pwd:pwd_video
-a=mid:video_content_name
-a=msid:local_stream_1 video_track_id_1
-a=sendrecv
-a=crypto:1 AES_CM_128_HMAC_SHA1_80 inline:d0RmdmcmVCspeEc3QGZiNWpVLFJhQX1cfHAwJSoj|2^20|1:32
-a=rtpmap:120 VP8/90000
-a=ssrc-group:FEC 2 3
-a=ssrc:2 cname:stream_1_cname
-a=ssrc:2 msid:local_stream_1 video_track_id_1
-a=ssrc:2 mslabel:local_stream_1
-a=ssrc:2 label:video_track_id_1
-a=ssrc:3 cname:stream_1_cname
-a=ssrc:3 msid:local_stream_1 video_track_id_1
-a=ssrc:3 mslabel:local_stream_1
-a=ssrc:3 label:video_track_id_1
-a=ssrc:5 cname:stream_2_cname
-a=ssrc:5 msid:local_stream_2 video_track_id_2
-a=ssrc:5 mslabel:local_stream_2
-a=ssrc:5 label:video_track_id_2
-a=ssrc:6 cname:stream_2_cname
-a=ssrc:6 msid:local_stream_2 video_track_id_3
-a=ssrc:6 mslabel:local_stream_2
-a=ssrc:6 label:video_track_id_3
diff --git a/test/fuzzers/corpora/sdp.tokens b/test/fuzzers/corpora/sdp.tokens
deleted file mode 100644
index ddfdad5..0000000
--- a/test/fuzzers/corpora/sdp.tokens
+++ /dev/null
@@ -1,56 +0,0 @@
-"0.0.0.0"
-"127.0.0.1"
-"application"
-"audio"
-"candidate"
-"cname"
-"conference"
-"crypto"
-"default"
-"extmap"
-"fingerprint"
-"fmtp"
-"generation"
-"group"
-"host"
-"ice-lite"
-"ice-options"
-"ice-pwd"
-"ice-ufrag"
-"inactive"
-"IP4"
-"IP6"
-"ISAC"
-"label"
-"mid"
-"msid"
-"msid-semantic"
-"mslabel"
-"network-cost"
-"network-id"
-"prflx"
-"pwd"
-"raddr"
-"recvonly"
-"relay"
-"rport"
-"rtcp"
-"rtcp-fb"
-"rtcp-mux"
-"rtcp-rsize"
-"rtpmap"
-"sctpmap"
-"sctp-port"
-"sendonly"
-"sendrecv"
-"setup"
-"srflx"
-"ssrc"
-"ssrc-group"
-"tcptype"
-"typ"
-"ufrag"
-"video"
-"webrtc-datachannel"
-"WMS"
-"x-google-flag"
\ No newline at end of file
diff --git a/test/fuzzers/corpora/stun-corpus/0.stun b/test/fuzzers/corpora/stun-corpus/0.stun
deleted file mode 100644
index 2059977..0000000
--- a/test/fuzzers/corpora/stun-corpus/0.stun
+++ /dev/null
Binary files differ
diff --git a/test/fuzzers/corpora/stun-corpus/1.stun b/test/fuzzers/corpora/stun-corpus/1.stun
deleted file mode 100644
index 1f82c03..0000000
--- a/test/fuzzers/corpora/stun-corpus/1.stun
+++ /dev/null
Binary files differ
diff --git a/test/fuzzers/corpora/stun-corpus/10.stun b/test/fuzzers/corpora/stun-corpus/10.stun
deleted file mode 100644
index a6b06b2..0000000
--- a/test/fuzzers/corpora/stun-corpus/10.stun
+++ /dev/null
Binary files differ
diff --git a/test/fuzzers/corpora/stun-corpus/11.stun b/test/fuzzers/corpora/stun-corpus/11.stun
deleted file mode 100644
index 1f82c03..0000000
--- a/test/fuzzers/corpora/stun-corpus/11.stun
+++ /dev/null
Binary files differ
diff --git a/test/fuzzers/corpora/stun-corpus/12.stun b/test/fuzzers/corpora/stun-corpus/12.stun
deleted file mode 100644
index cb91baa..0000000
--- a/test/fuzzers/corpora/stun-corpus/12.stun
+++ /dev/null
Binary files differ
diff --git a/test/fuzzers/corpora/stun-corpus/13.stun b/test/fuzzers/corpora/stun-corpus/13.stun
deleted file mode 100644
index 63298fc..0000000
--- a/test/fuzzers/corpora/stun-corpus/13.stun
+++ /dev/null
Binary files differ
diff --git a/test/fuzzers/corpora/stun-corpus/14.stun b/test/fuzzers/corpora/stun-corpus/14.stun
deleted file mode 100644
index 31f9f73..0000000
--- a/test/fuzzers/corpora/stun-corpus/14.stun
+++ /dev/null
Binary files differ
diff --git a/test/fuzzers/corpora/stun-corpus/15.stun b/test/fuzzers/corpora/stun-corpus/15.stun
deleted file mode 100644
index 3d15a67..0000000
--- a/test/fuzzers/corpora/stun-corpus/15.stun
+++ /dev/null
Binary files differ
diff --git a/test/fuzzers/corpora/stun-corpus/16.stun b/test/fuzzers/corpora/stun-corpus/16.stun
deleted file mode 100644
index 8ccf0af..0000000
--- a/test/fuzzers/corpora/stun-corpus/16.stun
+++ /dev/null
Binary files differ
diff --git a/test/fuzzers/corpora/stun-corpus/17.stun b/test/fuzzers/corpora/stun-corpus/17.stun
deleted file mode 100644
index 9c3efa0..0000000
--- a/test/fuzzers/corpora/stun-corpus/17.stun
+++ /dev/null
Binary files differ
diff --git a/test/fuzzers/corpora/stun-corpus/2.stun b/test/fuzzers/corpora/stun-corpus/2.stun
deleted file mode 100644
index 50fe614..0000000
--- a/test/fuzzers/corpora/stun-corpus/2.stun
+++ /dev/null
Binary files differ
diff --git a/test/fuzzers/corpora/stun-corpus/3.stun b/test/fuzzers/corpora/stun-corpus/3.stun
deleted file mode 100644
index 50fe614..0000000
--- a/test/fuzzers/corpora/stun-corpus/3.stun
+++ /dev/null
Binary files differ
diff --git a/test/fuzzers/corpora/stun-corpus/4.stun b/test/fuzzers/corpora/stun-corpus/4.stun
deleted file mode 100644
index a6b06b2..0000000
--- a/test/fuzzers/corpora/stun-corpus/4.stun
+++ /dev/null
Binary files differ
diff --git a/test/fuzzers/corpora/stun-corpus/5.stun b/test/fuzzers/corpora/stun-corpus/5.stun
deleted file mode 100644
index c0a79fa..0000000
--- a/test/fuzzers/corpora/stun-corpus/5.stun
+++ /dev/null
Binary files differ
diff --git a/test/fuzzers/corpora/stun-corpus/6.stun b/test/fuzzers/corpora/stun-corpus/6.stun
deleted file mode 100644
index 1f43a47..0000000
--- a/test/fuzzers/corpora/stun-corpus/6.stun
+++ /dev/null
Binary files differ
diff --git a/test/fuzzers/corpora/stun-corpus/7.stun b/test/fuzzers/corpora/stun-corpus/7.stun
deleted file mode 100644
index f5e824a..0000000
--- a/test/fuzzers/corpora/stun-corpus/7.stun
+++ /dev/null
Binary files differ
diff --git a/test/fuzzers/corpora/stun-corpus/8.stun b/test/fuzzers/corpora/stun-corpus/8.stun
deleted file mode 100644
index 99f4e3b..0000000
--- a/test/fuzzers/corpora/stun-corpus/8.stun
+++ /dev/null
Binary files differ
diff --git a/test/fuzzers/corpora/stun-corpus/9.stun b/test/fuzzers/corpora/stun-corpus/9.stun
deleted file mode 100644
index cbbcab4..0000000
--- a/test/fuzzers/corpora/stun-corpus/9.stun
+++ /dev/null
Binary files differ
diff --git a/test/fuzzers/corpora/stun-corpus/validator-crash-1.stun b/test/fuzzers/corpora/stun-corpus/validator-crash-1.stun
deleted file mode 100644
index 5428c38..0000000
--- a/test/fuzzers/corpora/stun-corpus/validator-crash-1.stun
+++ /dev/null
Binary files differ
diff --git a/test/fuzzers/corpora/stun.tokens b/test/fuzzers/corpora/stun.tokens
deleted file mode 100644
index e01130f..0000000
--- a/test/fuzzers/corpora/stun.tokens
+++ /dev/null
@@ -1,2 +0,0 @@
-"2112A442"
-"12214A24"
diff --git a/test/fuzzers/flexfec_header_reader_fuzzer.cc b/test/fuzzers/flexfec_header_reader_fuzzer.cc
deleted file mode 100644
index f253ca9..0000000
--- a/test/fuzzers/flexfec_header_reader_fuzzer.cc
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- *  Copyright (c) 2015 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 <algorithm>
-
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
-#include "webrtc/modules/rtp_rtcp/source/flexfec_header_reader_writer.h"
-#include "webrtc/modules/rtp_rtcp/source/forward_error_correction.h"
-#include "webrtc/rtc_base/scoped_ref_ptr.h"
-
-namespace webrtc {
-
-using Packet = ForwardErrorCorrection::Packet;
-using ReceivedFecPacket = ForwardErrorCorrection::ReceivedFecPacket;
-
-void FuzzOneInput(const uint8_t* data, size_t size) {
-  ReceivedFecPacket packet;
-  packet.pkt = rtc::scoped_refptr<Packet>(new Packet());
-  const size_t packet_size =
-      std::min(size, static_cast<size_t>(IP_PACKET_SIZE));
-  memcpy(packet.pkt->data, data, packet_size);
-  packet.pkt->length = packet_size;
-
-  FlexfecHeaderReader flexfec_reader;
-  flexfec_reader.ReadFecHeader(&packet);
-}
-
-}  // namespace webrtc
diff --git a/test/fuzzers/flexfec_receiver_fuzzer.cc b/test/fuzzers/flexfec_receiver_fuzzer.cc
deleted file mode 100644
index b0da803..0000000
--- a/test/fuzzers/flexfec_receiver_fuzzer.cc
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- *  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 <algorithm>
-
-#include "webrtc/modules/rtp_rtcp/include/flexfec_receiver.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
-#include "webrtc/modules/rtp_rtcp/source/byte_io.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_packet_received.h"
-#include "webrtc/rtc_base/basictypes.h"
-
-namespace webrtc {
-
-namespace {
-class DummyCallback : public RecoveredPacketReceiver {
-  void OnRecoveredPacket(const uint8_t* packet, size_t length) override {}
-};
-}  // namespace
-
-void FuzzOneInput(const uint8_t* data, size_t size) {
-  constexpr size_t kMinDataNeeded = 12;
-  if (size < kMinDataNeeded) {
-    return;
-  }
-
-  uint32_t flexfec_ssrc;
-  memcpy(&flexfec_ssrc, data + 0, 4);
-  uint16_t flexfec_seq_num;
-  memcpy(&flexfec_seq_num, data + 4, 2);
-  uint32_t media_ssrc;
-  memcpy(&media_ssrc, data + 6, 4);
-  uint16_t media_seq_num;
-  memcpy(&media_seq_num, data + 10, 2);
-
-  DummyCallback callback;
-  FlexfecReceiver receiver(flexfec_ssrc, media_ssrc, &callback);
-
-  std::unique_ptr<uint8_t[]> packet;
-  size_t packet_length;
-  size_t i = kMinDataNeeded;
-  while (i < size) {
-    packet_length = kRtpHeaderSize + data[i++];
-    packet = std::unique_ptr<uint8_t[]>(new uint8_t[packet_length]);
-    if (i + packet_length >= size) {
-      break;
-    }
-    memcpy(packet.get(), data + i, packet_length);
-    i += packet_length;
-    if (i < size && data[i++] % 2 == 0) {
-      // Simulate FlexFEC packet.
-      ByteWriter<uint16_t>::WriteBigEndian(packet.get() + 2, flexfec_seq_num++);
-      ByteWriter<uint32_t>::WriteBigEndian(packet.get() + 8, flexfec_ssrc);
-    } else {
-      // Simulate media packet.
-      ByteWriter<uint16_t>::WriteBigEndian(packet.get() + 2, media_seq_num++);
-      ByteWriter<uint32_t>::WriteBigEndian(packet.get() + 8, media_ssrc);
-    }
-    RtpPacketReceived parsed_packet;
-    if (parsed_packet.Parse(packet.get(), packet_length)) {
-      receiver.OnRtpPacket(parsed_packet);
-    }
-  }
-}
-
-}  // namespace webrtc
diff --git a/test/fuzzers/flexfec_sender_fuzzer.cc b/test/fuzzers/flexfec_sender_fuzzer.cc
deleted file mode 100644
index 44ac079..0000000
--- a/test/fuzzers/flexfec_sender_fuzzer.cc
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- *  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 <memory>
-
-#include "webrtc/modules/rtp_rtcp/include/flexfec_sender.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_packet_to_send.h"
-#include "webrtc/modules/rtp_rtcp/source/byte_io.h"
-#include "webrtc/system_wrappers/include/clock.h"
-
-namespace webrtc {
-
-namespace {
-
-constexpr int kFlexfecPayloadType = 123;
-constexpr uint32_t kMediaSsrc = 1234;
-constexpr uint32_t kFlexfecSsrc = 5678;
-const std::vector<RtpExtension> kNoRtpHeaderExtensions;
-const std::vector<RtpExtensionSize> kNoRtpHeaderExtensionSizes;
-
-}  // namespace
-
-void FuzzOneInput(const uint8_t* data, size_t size) {
-  size_t i = 0;
-  if (size < 5) {
-    return;
-  }
-
-  SimulatedClock clock(1 + data[i++]);
-  FlexfecSender sender(kFlexfecPayloadType, kFlexfecSsrc, kMediaSsrc,
-                       kNoRtpHeaderExtensions, kNoRtpHeaderExtensionSizes,
-                       nullptr /* rtp_state */, &clock);
-  FecProtectionParams params = {
-      data[i++], static_cast<int>(data[i++] % 100),
-      data[i++] <= 127 ? kFecMaskRandom : kFecMaskBursty};
-  sender.SetFecParameters(params);
-  uint16_t seq_num = data[i++];
-
-  while (i + 1 < size) {
-    // Everything past the base RTP header (12 bytes) is payload,
-    // from the perspective of FlexFEC.
-    size_t payload_size = data[i++];
-    if (i + kRtpHeaderSize + payload_size >= size)
-      break;
-    std::unique_ptr<uint8_t[]> packet(
-        new uint8_t[kRtpHeaderSize + payload_size]);
-    memcpy(packet.get(), &data[i], kRtpHeaderSize + payload_size);
-    i += kRtpHeaderSize + payload_size;
-    ByteWriter<uint16_t>::WriteBigEndian(&packet[2], seq_num++);
-    ByteWriter<uint32_t>::WriteBigEndian(&packet[8], kMediaSsrc);
-    RtpPacketToSend rtp_packet(nullptr);
-    if (!rtp_packet.Parse(packet.get(), kRtpHeaderSize + payload_size))
-      break;
-    sender.AddRtpPacketAndGenerateFec(rtp_packet);
-    if (sender.FecAvailable()) {
-      std::vector<std::unique_ptr<RtpPacketToSend>> fec_packets =
-          sender.GetFecPackets();
-    }
-  }
-}
-
-}  // namespace webrtc
diff --git a/test/fuzzers/h264_bitstream_parser_fuzzer.cc b/test/fuzzers/h264_bitstream_parser_fuzzer.cc
deleted file mode 100644
index 5661188..0000000
--- a/test/fuzzers/h264_bitstream_parser_fuzzer.cc
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- *  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 <stdint.h>
-
-#include "webrtc/common_video/h264/h264_bitstream_parser.h"
-
-namespace webrtc {
-void FuzzOneInput(const uint8_t* data, size_t size) {
-  H264BitstreamParser h264_bitstream_parser;
-  h264_bitstream_parser.ParseBitstream(data, size);
-  int qp;
-  h264_bitstream_parser.GetLastSliceQp(&qp);
-}
-}  // namespace webrtc
diff --git a/test/fuzzers/h264_depacketizer_fuzzer.cc b/test/fuzzers/h264_depacketizer_fuzzer.cc
deleted file mode 100644
index ca73d94..0000000
--- a/test/fuzzers/h264_depacketizer_fuzzer.cc
+++ /dev/null
@@ -1,18 +0,0 @@
-/*
- *  Copyright (c) 2015 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/rtp_rtcp/source/rtp_format_h264.h"
-
-namespace webrtc {
-void FuzzOneInput(const uint8_t* data, size_t size) {
-  RtpDepacketizerH264 depacketizer;
-  RtpDepacketizer::ParsedPayload parsed_payload;
-  depacketizer.Parse(&parsed_payload, data, size);
-}
-}  // namespace webrtc
diff --git a/test/fuzzers/neteq_rtp_fuzzer.cc b/test/fuzzers/neteq_rtp_fuzzer.cc
deleted file mode 100644
index 5eba72c..0000000
--- a/test/fuzzers/neteq_rtp_fuzzer.cc
+++ /dev/null
@@ -1,168 +0,0 @@
-/*
- *  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 <cmath>
-#include <memory>
-#include <vector>
-
-#include "webrtc/api/array_view.h"
-#include "webrtc/modules/audio_coding/codecs/pcm16b/audio_encoder_pcm16b.h"
-#include "webrtc/modules/audio_coding/neteq/tools/audio_checksum.h"
-#include "webrtc/modules/audio_coding/neteq/tools/encode_neteq_input.h"
-#include "webrtc/modules/audio_coding/neteq/tools/neteq_test.h"
-#include "webrtc/modules/rtp_rtcp/source/byte_io.h"
-
-namespace webrtc {
-namespace test {
-namespace {
-constexpr int kPayloadType = 95;
-
-class SineGenerator : public EncodeNetEqInput::Generator {
- public:
-  explicit SineGenerator(int sample_rate_hz)
-      : sample_rate_hz_(sample_rate_hz) {}
-
-  rtc::ArrayView<const int16_t> Generate(size_t num_samples) override {
-    if (samples_.size() < num_samples) {
-      samples_.resize(num_samples);
-    }
-
-    rtc::ArrayView<int16_t> output(samples_.data(), num_samples);
-    for (auto& x : output) {
-      x = static_cast<int16_t>(2000.0 * std::sin(phase_));
-      phase_ += 2 * kPi * kFreqHz / sample_rate_hz_;
-    }
-    return output;
-  }
-
- private:
-  static constexpr int kFreqHz = 300;  // The sinewave frequency.
-  const int sample_rate_hz_;
-  const double kPi = std::acos(-1);
-  std::vector<int16_t> samples_;
-  double phase_ = 0.0;
-};
-
-class FuzzRtpInput : public NetEqInput {
- public:
-  explicit FuzzRtpInput(rtc::ArrayView<const uint8_t> data) : data_(data) {
-    AudioEncoderPcm16B::Config config;
-    config.payload_type = kPayloadType;
-    config.sample_rate_hz = 32000;
-    std::unique_ptr<AudioEncoder> encoder(new AudioEncoderPcm16B(config));
-    std::unique_ptr<EncodeNetEqInput::Generator> generator(
-        new SineGenerator(config.sample_rate_hz));
-    input_.reset(new EncodeNetEqInput(std::move(generator), std::move(encoder),
-                                      std::numeric_limits<int64_t>::max()));
-    packet_ = input_->PopPacket();
-    FuzzHeader();
-  }
-
-  rtc::Optional<int64_t> NextPacketTime() const override {
-    return rtc::Optional<int64_t>(packet_->time_ms);
-  }
-
-  rtc::Optional<int64_t> NextOutputEventTime() const override {
-    return input_->NextOutputEventTime();
-  }
-
-  std::unique_ptr<PacketData> PopPacket() override {
-    RTC_DCHECK(packet_);
-    std::unique_ptr<PacketData> packet_to_return = std::move(packet_);
-    packet_ = input_->PopPacket();
-    FuzzHeader();
-    return packet_to_return;
-  }
-
-  void AdvanceOutputEvent() override { return input_->AdvanceOutputEvent(); }
-
-  bool ended() const override { return ended_; }
-
-  rtc::Optional<RTPHeader> NextHeader() const override {
-    RTC_DCHECK(packet_);
-    return rtc::Optional<RTPHeader>(packet_->header);
-  }
-
- private:
-  void FuzzHeader() {
-    constexpr size_t kNumBytesToFuzz = 11;
-    if (data_ix_ + kNumBytesToFuzz > data_.size()) {
-      ended_ = true;
-      return;
-    }
-    RTC_DCHECK(packet_);
-    const size_t start_ix = data_ix_;
-    packet_->header.payloadType =
-        ByteReader<uint8_t>::ReadLittleEndian(&data_[data_ix_]);
-    packet_->header.payloadType &= 0x7F;
-    data_ix_ += sizeof(uint8_t);
-    packet_->header.sequenceNumber =
-        ByteReader<uint16_t>::ReadLittleEndian(&data_[data_ix_]);
-    data_ix_ += sizeof(uint16_t);
-    packet_->header.timestamp =
-        ByteReader<uint32_t>::ReadLittleEndian(&data_[data_ix_]);
-    data_ix_ += sizeof(uint32_t);
-    packet_->header.ssrc =
-        ByteReader<uint32_t>::ReadLittleEndian(&data_[data_ix_]);
-    data_ix_ += sizeof(uint32_t);
-    RTC_CHECK_EQ(data_ix_ - start_ix, kNumBytesToFuzz);
-  }
-
-  bool ended_ = false;
-  rtc::ArrayView<const uint8_t> data_;
-  size_t data_ix_ = 0;
-  std::unique_ptr<EncodeNetEqInput> input_;
-  std::unique_ptr<PacketData> packet_;
-};
-}  // namespace
-
-void FuzzOneInputTest(const uint8_t* data, size_t size) {
-  std::unique_ptr<FuzzRtpInput> input(
-      new FuzzRtpInput(rtc::ArrayView<const uint8_t>(data, size)));
-  std::unique_ptr<AudioChecksum> output(new AudioChecksum);
-  NetEqTest::Callbacks callbacks;
-  NetEq::Config config;
-  NetEqTest::DecoderMap codecs;
-  codecs[0] = std::make_pair(NetEqDecoder::kDecoderPCMu, "pcmu");
-  codecs[8] = std::make_pair(NetEqDecoder::kDecoderPCMa, "pcma");
-  codecs[103] = std::make_pair(NetEqDecoder::kDecoderISAC, "isac");
-  codecs[104] = std::make_pair(NetEqDecoder::kDecoderISACswb, "isac-swb");
-  codecs[111] = std::make_pair(NetEqDecoder::kDecoderOpus, "opus");
-  codecs[93] = std::make_pair(NetEqDecoder::kDecoderPCM16B, "pcm16-nb");
-  codecs[94] = std::make_pair(NetEqDecoder::kDecoderPCM16Bwb, "pcm16-wb");
-  codecs[96] =
-      std::make_pair(NetEqDecoder::kDecoderPCM16Bswb48kHz, "pcm16-swb48");
-  codecs[9] = std::make_pair(NetEqDecoder::kDecoderG722, "g722");
-  codecs[106] = std::make_pair(NetEqDecoder::kDecoderAVT, "avt");
-  codecs[114] = std::make_pair(NetEqDecoder::kDecoderAVT16kHz, "avt-16");
-  codecs[115] = std::make_pair(NetEqDecoder::kDecoderAVT32kHz, "avt-32");
-  codecs[116] = std::make_pair(NetEqDecoder::kDecoderAVT48kHz, "avt-48");
-  codecs[117] = std::make_pair(NetEqDecoder::kDecoderRED, "red");
-  codecs[13] = std::make_pair(NetEqDecoder::kDecoderCNGnb, "cng-nb");
-  codecs[98] = std::make_pair(NetEqDecoder::kDecoderCNGwb, "cng-wb");
-  codecs[99] = std::make_pair(NetEqDecoder::kDecoderCNGswb32kHz, "cng-swb32");
-  codecs[100] = std::make_pair(NetEqDecoder::kDecoderCNGswb48kHz, "cng-swb48");
-  // This is the payload type that will be used for encoding.
-  codecs[kPayloadType] =
-      std::make_pair(NetEqDecoder::kDecoderPCM16Bswb32kHz, "pcm16-swb32");
-  NetEqTest::ExtDecoderMap ext_codecs;
-
-  NetEqTest test(config, codecs, ext_codecs, std::move(input),
-                 std::move(output), callbacks);
-  test.Run();
-}
-
-}  // namespace test
-
-void FuzzOneInput(const uint8_t* data, size_t size) {
-  test::FuzzOneInputTest(data, size);
-}
-
-}  // namespace webrtc
diff --git a/test/fuzzers/packet_buffer_fuzzer.cc b/test/fuzzers/packet_buffer_fuzzer.cc
deleted file mode 100644
index 099fe21..0000000
--- a/test/fuzzers/packet_buffer_fuzzer.cc
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- *  Copyright (c) 2017 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/video_coding/packet_buffer.h"
-#include "webrtc/system_wrappers/include/clock.h"
-
-namespace webrtc {
-
-namespace {
-class NullCallback : public video_coding::OnReceivedFrameCallback {
-  void OnReceivedFrame(std::unique_ptr<video_coding::RtpFrameObject> frame) {}
-};
-}  // namespace
-
-void FuzzOneInput(const uint8_t* data, size_t size) {
-  // Two bytes for the sequence number,
-  // one byte for |is_first_packet_in_frame| and |markerBit|.
-  constexpr size_t kMinDataNeeded = 3;
-  if (size < kMinDataNeeded) {
-    return;
-  }
-
-  VCMPacket packet;
-  NullCallback callback;
-  SimulatedClock clock(0);
-  rtc::scoped_refptr<video_coding::PacketBuffer> packet_buffer(
-      video_coding::PacketBuffer::Create(&clock, 8, 1024, &callback));
-
-  size_t i = kMinDataNeeded;
-  while (i < size) {
-    memcpy(&packet.seqNum, &data[i - kMinDataNeeded], 2);
-    packet.is_first_packet_in_frame = data[i] & 1;
-    packet.markerBit = data[i] & 2;
-    packet_buffer->InsertPacket(&packet);
-    i += kMinDataNeeded;
-  }
-}
-
-}  // namespace webrtc
diff --git a/test/fuzzers/pseudotcp_parser_fuzzer.cc b/test/fuzzers/pseudotcp_parser_fuzzer.cc
deleted file mode 100644
index ac5331b..0000000
--- a/test/fuzzers/pseudotcp_parser_fuzzer.cc
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
-*  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 <stddef.h>
-#include <stdint.h>
-
-#include "webrtc/p2p/base/pseudotcp.h"
-#include "webrtc/rtc_base/thread.h"
-
-namespace webrtc {
-class FakeIPseudoTcpNotify : public cricket::IPseudoTcpNotify {
- public:
-  void OnTcpOpen(cricket::PseudoTcp* tcp) {}
-  void OnTcpReadable(cricket::PseudoTcp* tcp) {}
-  void OnTcpWriteable(cricket::PseudoTcp* tcp) {}
-  void OnTcpClosed(cricket::PseudoTcp* tcp, uint32_t error) {}
-
-  cricket::IPseudoTcpNotify::WriteResult TcpWritePacket(cricket::PseudoTcp* tcp,
-                                                        const char* buffer,
-                                                        size_t len) {
-    return cricket::IPseudoTcpNotify::WriteResult::WR_SUCCESS;
-  }
-};
-
-struct Environment {
-  explicit Environment(cricket::IPseudoTcpNotify* notifier):
-      ptcp(notifier, 0) {
-  }
-
-  // We need the thread to avoid some uninteresting crashes, since the
-  // production code expects there to be a thread object available.
-  rtc::AutoThread thread;
-  cricket::PseudoTcp ptcp;
-};
-
-Environment* env = new Environment(new FakeIPseudoTcpNotify());
-
-void FuzzOneInput(const uint8_t* data, size_t size) {
-  env->ptcp.NotifyPacket(reinterpret_cast<const char*>(data), size);
-}
-}  // namespace webrtc
diff --git a/test/fuzzers/residual_echo_detector_fuzzer.cc b/test/fuzzers/residual_echo_detector_fuzzer.cc
deleted file mode 100644
index 8250c15..0000000
--- a/test/fuzzers/residual_echo_detector_fuzzer.cc
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- *  Copyright (c) 2017 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 <math.h>
-#include <string.h>
-
-#include <algorithm>
-#include <bitset>
-#include <vector>
-
-#include "webrtc/modules/audio_processing/residual_echo_detector.h"
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-
-void FuzzOneInput(const uint8_t* data, size_t size) {
-  // Number of times to update the echo detector.
-  constexpr size_t kNrOfUpdates = 7;
-  // Each round of updates requires a call to both AnalyzeRender and
-  // AnalyzeCapture, so the amount of needed input bytes doubles. Also, two
-  // bytes are used to set the call order.
-  constexpr size_t kNrOfNeededInputBytes = 2 * kNrOfUpdates * sizeof(float) + 2;
-  // The maximum audio energy that an audio frame can have is equal to the
-  // number of samples in the frame multiplied by 2^30. We use a single sample
-  // to represent an audio frame in this test, so it should have a maximum value
-  // equal to the square root of that value.
-  const float maxFuzzedValue = sqrtf(20 * 48) * 32768;
-  if (size < kNrOfNeededInputBytes) {
-    return;
-  }
-  size_t read_idx = 0;
-  // Use the first two bytes to choose the call order.
-  uint16_t call_order_int;
-  memcpy(&call_order_int, &data[read_idx], 2);
-  read_idx += 2;
-  std::bitset<16> call_order(call_order_int);
-
-  ResidualEchoDetector echo_detector;
-  std::vector<float> input(1);
-  // Call AnalyzeCaptureAudio once to prevent the flushing of the buffer.
-  echo_detector.AnalyzeCaptureAudio(input);
-  for (size_t i = 0; i < 2 * kNrOfUpdates; ++i) {
-    // Convert 4 input bytes to a float.
-    RTC_DCHECK_LE(read_idx + sizeof(float), size);
-    memcpy(input.data(), &data[read_idx], sizeof(float));
-    read_idx += sizeof(float);
-    if (!isfinite(input[0]) || fabs(input[0]) > maxFuzzedValue) {
-      // Ignore infinity, nan values and values that are unrealistically large.
-      continue;
-    }
-    if (call_order[i]) {
-      echo_detector.AnalyzeRenderAudio(input);
-    } else {
-      echo_detector.AnalyzeCaptureAudio(input);
-    }
-  }
-}
-
-}  // namespace webrtc
diff --git a/test/fuzzers/rtcp_receiver_fuzzer.cc b/test/fuzzers/rtcp_receiver_fuzzer.cc
deleted file mode 100644
index 9d93f83..0000000
--- a/test/fuzzers/rtcp_receiver_fuzzer.cc
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- *  Copyright (c) 2015 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/rtp_rtcp/source/rtcp_receiver.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/system_wrappers/include/clock.h"
-
-namespace webrtc {
-namespace {
-
-class NullModuleRtpRtcp : public RTCPReceiver::ModuleRtpRtcp {
- public:
-  void SetTmmbn(std::vector<rtcp::TmmbItem>) override {}
-  void OnRequestSendReport() override {}
-  void OnReceivedNack(const std::vector<uint16_t>&) override {};
-  void OnReceivedRtcpReportBlocks(const ReportBlockList&) override {};
-};
-
-}
-
-void FuzzOneInput(const uint8_t* data, size_t size) {
-  NullModuleRtpRtcp rtp_rtcp_module;
-  SimulatedClock clock(1234);
-
-  RTCPReceiver receiver(&clock, false, nullptr, nullptr, nullptr, nullptr,
-                        nullptr, &rtp_rtcp_module);
-
-  receiver.IncomingPacket(data, size);
-}
-}  // namespace webrtc
-
diff --git a/test/fuzzers/rtp_header_fuzzer.cc b/test/fuzzers/rtp_header_fuzzer.cc
deleted file mode 100644
index 9e111a8..0000000
--- a/test/fuzzers/rtp_header_fuzzer.cc
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- *  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 <bitset>
-
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_packet_received.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_utility.h"
-
-namespace webrtc {
-// We decide which header extensions to register by reading two bytes
-// from the beginning of |data| and interpreting it as a bitmask over
-// the RTPExtensionType enum. This assert ensures two bytes are enough.
-static_assert(kRtpExtensionNumberOfExtensions <= 16,
-              "Insufficient bits read to configure all header extensions. Add "
-              "an extra byte and update the switches.");
-
-void FuzzOneInput(const uint8_t* data, size_t size) {
-  if (size <= 2)
-    return;
-
-  // Don't use the configuration byte as part of the packet.
-  std::bitset<16> extensionMask(*reinterpret_cast<const uint16_t*>(data));
-  data += 2;
-  size -= 2;
-
-  RtpPacketReceived::ExtensionManager extensions;
-  // Skip i = 0 since it maps to ExtensionNone and extension id = 0 is invalid.
-  for (int i = 0; i < kRtpExtensionNumberOfExtensions; i++) {
-    RTPExtensionType extension_type = static_cast<RTPExtensionType>(i);
-    if (extensionMask[i] && extension_type != kRtpExtensionNone) {
-      // Extensions are registered with an ID, which you signal to the
-      // peer so they know what to expect. This code only cares about
-      // parsing so the value of the ID isn't relevant; we use i.
-      extensions.RegisterByType(i, extension_type);
-    }
-  }
-
-  RTPHeader rtp_header;
-  RtpUtility::RtpHeaderParser rtp_parser(data, size);
-  rtp_parser.Parse(&rtp_header, &extensions);
-}
-}  // namespace webrtc
diff --git a/test/fuzzers/rtp_packet_fuzzer.cc b/test/fuzzers/rtp_packet_fuzzer.cc
deleted file mode 100644
index 3e33699..0000000
--- a/test/fuzzers/rtp_packet_fuzzer.cc
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- *  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/rtp_rtcp/include/rtp_header_extension_map.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_header_extensions.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_packet_received.h"
-
-namespace webrtc {
-
-// We decide which header extensions to register by reading two bytes
-// from the beginning of |data| and interpreting it as a bitmask over
-// the RTPExtensionType enum. This assert ensures two bytes are enough.
-static_assert(kRtpExtensionNumberOfExtensions <= 16,
-              "Insufficient bits read to configure all header extensions. Add "
-              "an extra byte and update the switches.");
-
-void FuzzOneInput(const uint8_t* data, size_t size) {
-  if (size <= 2)
-    return;
-
-  // Don't use the configuration bytes as part of the packet.
-  std::bitset<16> extensionMask(*reinterpret_cast<const uint16_t*>(data));
-  data += 2;
-  size -= 2;
-
-  RtpPacketReceived::ExtensionManager extensions;
-  // Skip i = 0 since it maps to ExtensionNone and extension id = 0 is invalid.
-  for (int i = 1; i < kRtpExtensionNumberOfExtensions; i++) {
-    RTPExtensionType extension_type = static_cast<RTPExtensionType>(i);
-    if (extensionMask[i] && extension_type != kRtpExtensionNone) {
-      // Extensions are registered with an ID, which you signal to the
-      // peer so they know what to expect. This code only cares about
-      // parsing so the value of the ID isn't relevant; we use i.
-      extensions.RegisterByType(i, extension_type);
-    }
-  }
-
-  RtpPacketReceived packet(&extensions);
-  packet.Parse(data, size);
-
-  // Call packet accessors because they have extra checks.
-  packet.Marker();
-  packet.PayloadType();
-  packet.SequenceNumber();
-  packet.Timestamp();
-  packet.Ssrc();
-  packet.Csrcs();
-
-  // Each extension has its own getter. It is supported behaviour to
-  // call GetExtension on an extension which was not registered, so we
-  // don't check the bitmask here.
-  for (int i = 0; i < kRtpExtensionNumberOfExtensions; i++) {
-    switch (static_cast<RTPExtensionType>(i)) {
-      case kRtpExtensionNone:
-      case kRtpExtensionNumberOfExtensions:
-        break;
-      case kRtpExtensionTransmissionTimeOffset:
-        int32_t offset;
-        packet.GetExtension<TransmissionOffset>(&offset);
-        break;
-      case kRtpExtensionAudioLevel:
-        bool voice_activity;
-        uint8_t audio_level;
-        packet.GetExtension<AudioLevel>(&voice_activity, &audio_level);
-        break;
-      case kRtpExtensionAbsoluteSendTime:
-        uint32_t sendtime;
-        packet.GetExtension<AbsoluteSendTime>(&sendtime);
-        break;
-      case kRtpExtensionVideoRotation:
-        uint8_t rotation;
-        packet.GetExtension<VideoOrientation>(&rotation);
-        break;
-      case kRtpExtensionTransportSequenceNumber:
-        uint16_t seqnum;
-        packet.GetExtension<TransportSequenceNumber>(&seqnum);
-        break;
-      case kRtpExtensionPlayoutDelay:
-        PlayoutDelay playout;
-        packet.GetExtension<PlayoutDelayLimits>(&playout);
-        break;
-      case kRtpExtensionVideoContentType:
-        VideoContentType content_type;
-        packet.GetExtension<VideoContentTypeExtension>(&content_type);
-        break;
-      case kRtpExtensionVideoTiming:
-        VideoSendTiming timing;
-        packet.GetExtension<VideoTimingExtension>(&timing);
-        break;
-      case kRtpExtensionRtpStreamId: {
-        std::string rsid;
-        packet.GetExtension<RtpStreamId>(&rsid);
-        break;
-      }
-      case kRtpExtensionRepairedRtpStreamId: {
-        std::string rsid;
-        packet.GetExtension<RepairedRtpStreamId>(&rsid);
-        break;
-      }
-      case kRtpExtensionMid: {
-        std::string mid;
-        packet.GetExtension<RtpMid>(&mid);
-        break;
-      }
-    }
-  }
-}
-}  // namespace webrtc
diff --git a/test/fuzzers/sdp_parser_fuzzer.cc b/test/fuzzers/sdp_parser_fuzzer.cc
deleted file mode 100644
index f21c991..0000000
--- a/test/fuzzers/sdp_parser_fuzzer.cc
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- *  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 <stddef.h>
-#include <stdint.h>
-
-#include "webrtc/api/jsepsessiondescription.h"
-
-namespace webrtc {
-void FuzzOneInput(const uint8_t* data, size_t size) {
-  std::string message(reinterpret_cast<const char*>(data), size);
-  webrtc::SdpParseError error;
-
-  std::unique_ptr<webrtc::SessionDescriptionInterface> sdp(
-      CreateSessionDescription("offer", message, &error));
-}
-
-}  // namespace webrtc
diff --git a/test/fuzzers/stun_parser_fuzzer.cc b/test/fuzzers/stun_parser_fuzzer.cc
deleted file mode 100644
index 02f10b1..0000000
--- a/test/fuzzers/stun_parser_fuzzer.cc
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- *  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 <stddef.h>
-#include <stdint.h>
-
-#include "webrtc/p2p/base/stun.h"
-
-namespace webrtc {
-void FuzzOneInput(const uint8_t* data, size_t size) {
-  const char* message = reinterpret_cast<const char*>(data);
-
-  // Normally we'd check the integrity first, but those checks are
-  // fuzzed separately in stun_validator_fuzzer.cc. We still want to
-  // fuzz this target since the integrity checks could be forged by a
-  // malicious adversary who receives a call.
-  std::unique_ptr<cricket::IceMessage> stun_msg(new cricket::IceMessage());
-  rtc::ByteBufferReader buf(message, size);
-  stun_msg->Read(&buf);
-}
-}  // namespace webrtc
diff --git a/test/fuzzers/stun_validator_fuzzer.cc b/test/fuzzers/stun_validator_fuzzer.cc
deleted file mode 100644
index 1f919f5..0000000
--- a/test/fuzzers/stun_validator_fuzzer.cc
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- *  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 <stddef.h>
-#include <stdint.h>
-
-#include "webrtc/p2p/base/stun.h"
-
-namespace webrtc {
-void FuzzOneInput(const uint8_t* data, size_t size) {
-  const char* message = reinterpret_cast<const char*>(data);
-
-  cricket::StunMessage::ValidateFingerprint(message, size);
-  cricket::StunMessage::ValidateMessageIntegrity(message, size, "");
-}
-}  // namespace webrtc
diff --git a/test/fuzzers/transport_feedback_packet_loss_tracker_fuzzer.cc b/test/fuzzers/transport_feedback_packet_loss_tracker_fuzzer.cc
deleted file mode 100644
index bfd03fa..0000000
--- a/test/fuzzers/transport_feedback_packet_loss_tracker_fuzzer.cc
+++ /dev/null
@@ -1,279 +0,0 @@
-/*
- *  Copyright (c) 2017 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 <algorithm>
-
-#include "webrtc/api/array_view.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
-#include "webrtc/modules/rtp_rtcp/source/byte_io.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/transport_feedback.h"
-#include "webrtc/voice_engine/transport_feedback_packet_loss_tracker.h"
-
-namespace webrtc {
-
-namespace {
-
-template <typename T>
-T FuzzInput(const uint8_t** data, size_t* size) {
-  RTC_CHECK_GE(*size, sizeof(T));
-  T rc = ByteReader<T>::ReadBigEndian(*data);
-  *data += sizeof(T);
-  *size -= sizeof(T);
-  return rc;
-}
-
-size_t FuzzInRange(const uint8_t** data,
-                   size_t* size,
-                   size_t lower,
-                   size_t upper) {
-  // Achieve a close-to-uniform distribution.
-  RTC_CHECK_LE(lower, upper);
-  RTC_CHECK_LT(upper - lower, 1 << (8 * sizeof(uint16_t)));
-  const size_t range = upper - lower;
-  const uint16_t fuzzed = FuzzInput<uint16_t>(data, size);
-  const size_t offset = (static_cast<float>(fuzzed) / 0x10000) * (range + 1);
-  RTC_CHECK_LE(offset, range);  // (fuzzed <= 0xffff) -> (offset < range + 1)
-  return lower + offset;
-}
-
-class TransportFeedbackGenerator {
- public:
-  explicit TransportFeedbackGenerator(const uint8_t** data, size_t* size)
-      : data_(data), size_(size) {}
-
-  bool GetNextTransportFeedbackVector(
-      std::vector<PacketFeedback>* feedback_vector) {
-    RTC_CHECK(feedback_vector->empty());
-
-    uint16_t remaining_packets = 0;
-    if (!ReadData<uint16_t>(&remaining_packets)) {
-      return false;
-    }
-
-    if (remaining_packets == 0) {
-      return true;
-    }
-
-    uint16_t seq_num;
-    if (!ReadData<uint16_t>(&seq_num)) {  // Fuzz base sequence number.
-      return false;
-    }
-
-    while (remaining_packets > 0) {
-      uint8_t status_byte = 0;
-      if (!ReadData<uint8_t>(&status_byte)) {
-        return false;
-      }
-      // Each status byte contains 8 statuses.
-      for (size_t i = 0; i < 8 && remaining_packets > 0; ++i) {
-        // Any positive integer signals reception. kNotReceived signals loss.
-        // Other values are just illegal.
-        constexpr int64_t kArrivalTimeMs = 1234;
-
-        const bool received = (status_byte & (0x01 << i));
-        feedback_vector->emplace_back(PacketFeedback(
-            received ? kArrivalTimeMs : PacketFeedback::kNotReceived,
-            seq_num++));
-        --remaining_packets;
-      }
-    }
-
-    return true;
-  }
-
- private:
-  template <typename T>
-  bool ReadData(T* value) {
-    if (*size_ < sizeof(T)) {
-      return false;
-    } else {
-      *value = FuzzInput<T>(data_, size_);
-      return true;
-    }
-  }
-
-  const uint8_t** data_;
-  size_t* size_;
-};
-
-bool Setup(const uint8_t** data,
-           size_t* size,
-           std::unique_ptr<TransportFeedbackPacketLossTracker>* tracker) {
-  if (*size < 3 * sizeof(uint16_t)) {
-    return false;
-  }
-
-  constexpr size_t kSeqNumHalf = 0x8000u;
-
-  const int64_t max_window_size_ms = FuzzInRange(data, size, 1, 1 << 16);
-  const size_t plr_min_num_packets = FuzzInRange(data, size, 1, kSeqNumHalf);
-  const size_t rplr_min_num_pairs = FuzzInRange(data, size, 1, kSeqNumHalf - 1);
-
-  tracker->reset(new TransportFeedbackPacketLossTracker(
-      max_window_size_ms, plr_min_num_packets, rplr_min_num_pairs));
-
-  return true;
-}
-
-bool FuzzSequenceNumberDelta(const uint8_t** data,
-                             size_t* size,
-                             uint16_t* delta) {
-  // Fuzz with a higher likelihood for immediately consecutive pairs
-  // than you would by just fuzzing 1-256.
-  // Note: Values higher than 256 still possible, but that would be in a new
-  // packet-sending block.
-  // * Fuzzed value in [0 : 127]   (50% chance) -> delta is 1.
-  // * Fuzzed value in [128 : 255] (50% chance) -> delta in range [2 : 129].
-  if (*size < sizeof(uint8_t)) {
-    return false;
-  }
-  uint8_t fuzzed = FuzzInput<uint8_t>(data, size);
-  *delta = (fuzzed < 128) ? 1 : (fuzzed - 128 + 2);
-  return true;
-}
-
-bool FuzzClockAdvancement(const uint8_t** data,
-                          size_t* size,
-                          int64_t* time_ms) {
-  // Fuzzing 64-bit worth of delta would be extreme overkill, as 32-bit is
-  // already ~49 days long. We'll fuzz deltas up to a smaller value, and this
-  // way also guarantee that wrap-around is impossible, as in real life.
-
-  // Higher likelihood for more likely cases:
-  //  5% chance of delta = 0.
-  // 20% chance of delta in range [1 : 10] (uniformly distributed)
-  // 55% chance of delta in range [11 : 500] (uniformly distributed)
-  // 20% chance of delta in range [501 : 10000] (uniformly distributed)
-  struct ProbabilityDistribution {
-    float probability;
-    size_t lower;
-    size_t higher;
-  };
-  constexpr ProbabilityDistribution clock_probability_distribution[] = {
-      {0.05, 0, 0}, {0.20, 1, 10}, {0.55, 11, 500}, {0.20, 501, 10000}};
-
-  if (*size < sizeof(uint8_t)) {
-    return false;
-  }
-  const float fuzzed = FuzzInput<uint8_t>(data, size) / 256.0f;
-
-  float cumulative_probability = 0;
-  for (const auto& dist : clock_probability_distribution) {
-    cumulative_probability += dist.probability;
-    if (fuzzed < cumulative_probability) {
-      if (dist.lower == dist.higher) {
-        *time_ms += dist.lower;
-        return true;
-      } else if (*size < sizeof(uint16_t)) {
-        return false;
-      } else {
-        *time_ms += FuzzInRange(data, size, dist.lower, dist.higher);
-        return true;
-      }
-    }
-  }
-
-  RTC_NOTREACHED();
-  return false;
-}
-
-bool FuzzPacketSendBlock(
-    std::unique_ptr<TransportFeedbackPacketLossTracker>& tracker,
-    const uint8_t** data,
-    size_t* size,
-    int64_t* time_ms) {
-  // We want to test with block lengths between 1 and 2^16, inclusive.
-  if (*size < sizeof(uint8_t)) {
-    return false;
-  }
-  size_t packet_block_len = 1 + FuzzInput<uint8_t>(data, size);
-
-  // First sent sequence number uniformly selected.
-  if (*size < sizeof(uint16_t)) {
-    return false;
-  }
-  uint16_t seq_num = FuzzInput<uint16_t>(data, size);
-  tracker->OnPacketAdded(seq_num, *time_ms);
-  tracker->Validate();
-
-  bool may_continue = FuzzClockAdvancement(data, size, time_ms);
-  if (!may_continue) {
-    return false;
-  }
-
-  for (size_t i = 1; i < packet_block_len; i++) {
-    uint16_t delta;
-    may_continue = FuzzSequenceNumberDelta(data, size, &delta);
-    if (!may_continue)
-      return false;
-    may_continue = FuzzClockAdvancement(data, size, time_ms);
-    if (!may_continue)
-      return false;
-    seq_num += delta;
-    tracker->OnPacketAdded(seq_num, *time_ms);
-    tracker->Validate();
-  }
-
-  return true;
-}
-
-bool FuzzTransportFeedbackBlock(
-    std::unique_ptr<TransportFeedbackPacketLossTracker>& tracker,
-    const uint8_t** data,
-    size_t* size) {
-  // Fuzz the number of back-to-back feedbacks. At least one, or this would
-  // be meaningless - we'd go straight back to fuzzing another packet
-  // transmission block.
-  if (*size < sizeof(uint8_t)) {
-    return false;
-  }
-
-  size_t feedbacks_num = 1 + (FuzzInput<uint8_t>(data, size) & 0x3f);
-  TransportFeedbackGenerator feedback_generator(data, size);
-
-  for (size_t i = 0; i < feedbacks_num; i++) {
-    std::vector<PacketFeedback> feedback_vector;
-    bool may_continue =
-        feedback_generator.GetNextTransportFeedbackVector(&feedback_vector);
-    if (!may_continue) {
-      return false;
-    }
-    tracker->OnPacketFeedbackVector(feedback_vector);
-    tracker->Validate();
-  }
-
-  return true;
-}
-
-}  // namespace
-
-void FuzzOneInput(const uint8_t* data, size_t size) {
-  std::unique_ptr<TransportFeedbackPacketLossTracker> tracker;
-  bool may_continue;
-
-  may_continue = Setup(&data, &size, &tracker);
-
-  // We never expect this to wrap around, so it makes sense to just start with
-  // a sane value, and keep on incrementing by a fuzzed delta.
-  if (size < sizeof(uint32_t)) {
-    return;
-  }
-  int64_t time_ms = FuzzInput<uint32_t>(&data, &size);
-
-  while (may_continue) {
-    may_continue = FuzzPacketSendBlock(tracker, &data, &size, &time_ms);
-    if (!may_continue) {
-      return;
-    }
-    may_continue = FuzzTransportFeedbackBlock(tracker, &data, &size);
-  }
-}
-
-}  // namespace webrtc
diff --git a/test/fuzzers/turn_unwrap_fuzzer.cc b/test/fuzzers/turn_unwrap_fuzzer.cc
deleted file mode 100644
index 818fbe9..0000000
--- a/test/fuzzers/turn_unwrap_fuzzer.cc
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- *  Copyright (c) 2015 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 <stddef.h>
-#include <stdint.h>
-
-#include "webrtc/media/base/turnutils.h"
-
-namespace webrtc {
-void FuzzOneInput(const uint8_t* data, size_t size) {
-  size_t content_position;
-  size_t content_size;
-  cricket::UnwrapTurnPacket(data, size, &content_position, &content_size);
-}
-}  // namespace webrtc
diff --git a/test/fuzzers/ulpfec_generator_fuzzer.cc b/test/fuzzers/ulpfec_generator_fuzzer.cc
deleted file mode 100644
index 01729ef..0000000
--- a/test/fuzzers/ulpfec_generator_fuzzer.cc
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- *  Copyright (c) 2015 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 <memory>
-
-#include "webrtc/modules/rtp_rtcp/source/byte_io.h"
-#include "webrtc/modules/rtp_rtcp/source/fec_test_helper.h"
-#include "webrtc/modules/rtp_rtcp/source/ulpfec_generator.h"
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-
-namespace {
-constexpr uint8_t kFecPayloadType = 96;
-constexpr uint8_t kRedPayloadType = 97;
-}  // namespace
-
-void FuzzOneInput(const uint8_t* data, size_t size) {
-  UlpfecGenerator generator;
-  size_t i = 0;
-  if (size < 4)
-    return;
-  FecProtectionParams params = {
-      data[i++] % 128, static_cast<int>(data[i++] % 10), kFecMaskBursty};
-  generator.SetFecParameters(params);
-  uint16_t seq_num = data[i++];
-
-  while (i + 3 < size) {
-    size_t rtp_header_length = data[i++] % 10 + 12;
-    size_t payload_size = data[i++] % 10;
-    if (i + payload_size + rtp_header_length + 2 > size)
-      break;
-    std::unique_ptr<uint8_t[]> packet(
-        new uint8_t[payload_size + rtp_header_length]);
-    memcpy(packet.get(), &data[i], payload_size + rtp_header_length);
-    ByteWriter<uint16_t>::WriteBigEndian(&packet[2], seq_num++);
-    i += payload_size + rtp_header_length;
-    // Make sure sequence numbers are increasing.
-    std::unique_ptr<RedPacket> red_packet = UlpfecGenerator::BuildRedPacket(
-        packet.get(), payload_size, rtp_header_length, kRedPayloadType);
-    const bool protect = data[i++] % 2 == 1;
-    if (protect) {
-      generator.AddRtpPacketAndGenerateFec(packet.get(), payload_size,
-                                           rtp_header_length);
-    }
-    const size_t num_fec_packets = generator.NumAvailableFecPackets();
-    if (num_fec_packets > 0) {
-      std::vector<std::unique_ptr<RedPacket>> fec_packets =
-          generator.GetUlpfecPacketsAsRed(kRedPayloadType, kFecPayloadType, 100,
-                                          rtp_header_length);
-      RTC_CHECK_EQ(num_fec_packets, fec_packets.size());
-    }
-  }
-}
-}  // namespace webrtc
diff --git a/test/fuzzers/ulpfec_header_reader_fuzzer.cc b/test/fuzzers/ulpfec_header_reader_fuzzer.cc
deleted file mode 100644
index e69f463..0000000
--- a/test/fuzzers/ulpfec_header_reader_fuzzer.cc
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- *  Copyright (c) 2015 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 <algorithm>
-
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
-#include "webrtc/modules/rtp_rtcp/source/forward_error_correction.h"
-#include "webrtc/modules/rtp_rtcp/source/ulpfec_header_reader_writer.h"
-#include "webrtc/rtc_base/scoped_ref_ptr.h"
-
-namespace webrtc {
-
-using Packet = ForwardErrorCorrection::Packet;
-using ReceivedFecPacket = ForwardErrorCorrection::ReceivedFecPacket;
-
-void FuzzOneInput(const uint8_t* data, size_t size) {
-  ReceivedFecPacket packet;
-  packet.pkt = rtc::scoped_refptr<Packet>(new Packet());
-  const size_t packet_size =
-      std::min(size, static_cast<size_t>(IP_PACKET_SIZE));
-  memcpy(packet.pkt->data, data, packet_size);
-  packet.pkt->length = packet_size;
-
-  UlpfecHeaderReader ulpfec_reader;
-  ulpfec_reader.ReadFecHeader(&packet);
-}
-
-}  // namespace webrtc
diff --git a/test/fuzzers/vp8_depacketizer_fuzzer.cc b/test/fuzzers/vp8_depacketizer_fuzzer.cc
deleted file mode 100644
index d048372..0000000
--- a/test/fuzzers/vp8_depacketizer_fuzzer.cc
+++ /dev/null
@@ -1,18 +0,0 @@
-/*
- *  Copyright (c) 2015 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/rtp_rtcp/source/rtp_format_vp8.h"
-
-namespace webrtc {
-void FuzzOneInput(const uint8_t* data, size_t size) {
-  RtpDepacketizerVp8 depacketizer;
-  RtpDepacketizer::ParsedPayload parsed_payload;
-  depacketizer.Parse(&parsed_payload, data, size);
-}
-}  // namespace webrtc
diff --git a/test/fuzzers/vp8_qp_parser_fuzzer.cc b/test/fuzzers/vp8_qp_parser_fuzzer.cc
deleted file mode 100644
index 5135f1a..0000000
--- a/test/fuzzers/vp8_qp_parser_fuzzer.cc
+++ /dev/null
@@ -1,17 +0,0 @@
-/*
- *  Copyright (c) 2015 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/video_coding/utility/vp8_header_parser.h"
-
-namespace webrtc {
-void FuzzOneInput(const uint8_t* data, size_t size) {
-  int qp;
-  vp8::GetQp(data, size, &qp);
-}
-}  // namespace webrtc
diff --git a/test/fuzzers/vp9_depacketizer_fuzzer.cc b/test/fuzzers/vp9_depacketizer_fuzzer.cc
deleted file mode 100644
index 02a7cc0..0000000
--- a/test/fuzzers/vp9_depacketizer_fuzzer.cc
+++ /dev/null
@@ -1,18 +0,0 @@
-/*
- *  Copyright (c) 2015 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/rtp_rtcp/source/rtp_format_vp9.h"
-
-namespace webrtc {
-void FuzzOneInput(const uint8_t* data, size_t size) {
-  RtpDepacketizerVp9 depacketizer;
-  RtpDepacketizer::ParsedPayload parsed_payload;
-  depacketizer.Parse(&parsed_payload, data, size);
-}
-}  // namespace webrtc
diff --git a/test/fuzzers/vp9_qp_parser_fuzzer.cc b/test/fuzzers/vp9_qp_parser_fuzzer.cc
deleted file mode 100644
index 7dbed2e..0000000
--- a/test/fuzzers/vp9_qp_parser_fuzzer.cc
+++ /dev/null
@@ -1,18 +0,0 @@
-/*
- *  Copyright (c) 2017 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/video_coding/utility/vp9_uncompressed_header_parser.h"
-
-namespace webrtc {
-void FuzzOneInput(const uint8_t* data, size_t size) {
-  int qp;
-  vp9::GetQp(data, size, &qp);
-}
-}  // namespace webrtc
diff --git a/test/fuzzers/webrtc_fuzzer_main.cc b/test/fuzzers/webrtc_fuzzer_main.cc
deleted file mode 100644
index a5d5ed1..0000000
--- a/test/fuzzers/webrtc_fuzzer_main.cc
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- *  Copyright (c) 2015 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.
- */
-
-// This file is intended to provide a common interface for fuzzing functions.
-// It's intended to set sane defaults, such as removing logging for further
-// fuzzing efficiency.
-
-#include "webrtc/rtc_base/logging.h"
-
-namespace {
-bool g_initialized = false;
-void InitializeWebRtcFuzzDefaults() {
-  if (g_initialized)
-    return;
-
-  // Remove default logging to prevent huge slowdowns.
-  // TODO(pbos): Disable in Chromium: http://crbug.com/561667
-#if !defined(WEBRTC_CHROMIUM_BUILD)
-  rtc::LogMessage::LogToDebug(rtc::LS_NONE);
-#endif  // !defined(WEBRTC_CHROMIUM_BUILD)
-
-  g_initialized = true;
-}
-}
-
-namespace webrtc {
-extern void FuzzOneInput(const uint8_t* data, size_t size);
-}  // namespace webrtc
-
-extern "C" int LLVMFuzzerTestOneInput(const unsigned char *data, size_t size) {
-  InitializeWebRtcFuzzDefaults();
-  webrtc::FuzzOneInput(data, size);
-  return 0;
-}
diff --git a/test/gl/gl_renderer.cc b/test/gl/gl_renderer.cc
deleted file mode 100644
index c55f347..0000000
--- a/test/gl/gl_renderer.cc
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- *  Copyright (c) 2013 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/test/gl/gl_renderer.h"
-
-#include <string.h>
-
-#include "webrtc/common_video/libyuv/include/webrtc_libyuv.h"
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-namespace test {
-
-GlRenderer::GlRenderer()
-    : is_init_(false), buffer_(NULL), width_(0), height_(0) {}
-
-void GlRenderer::Init() {
-  RTC_DCHECK(!is_init_);
-  is_init_ = true;
-
-  glGenTextures(1, &texture_);
-}
-
-void GlRenderer::Destroy() {
-  if (!is_init_) {
-    return;
-  }
-
-  is_init_ = false;
-
-  delete[] buffer_;
-  buffer_ = NULL;
-
-  glDeleteTextures(1, &texture_);
-}
-
-void GlRenderer::ResizeViewport(size_t width, size_t height) {
-  // TODO(pbos): Aspect ratio, letterbox the video.
-  glViewport(0, 0, width, height);
-
-  glMatrixMode(GL_PROJECTION);
-  glLoadIdentity();
-  glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
-  glOrtho(0.0f, 1.0f, 1.0f, 0.0f, -1.0f, 1.0f);
-  glMatrixMode(GL_MODELVIEW);
-}
-
-void GlRenderer::ResizeVideo(size_t width, size_t height) {
-  RTC_DCHECK(is_init_);
-  width_ = width;
-  height_ = height;
-
-  buffer_size_ = width * height * 4;  // BGRA
-
-  delete[] buffer_;
-  buffer_ = new uint8_t[buffer_size_];
-  RTC_DCHECK(buffer_);
-  memset(buffer_, 0, buffer_size_);
-  glBindTexture(GL_TEXTURE_2D, texture_);
-  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0);
-  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0);
-  glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_BGRA,
-               GL_UNSIGNED_INT_8_8_8_8, static_cast<GLvoid*>(buffer_));
-}
-
-void GlRenderer::OnFrame(const webrtc::VideoFrame& frame) {
-  RTC_DCHECK(is_init_);
-
-  if (static_cast<size_t>(frame.width()) != width_ ||
-      static_cast<size_t>(frame.height()) != height_) {
-    ResizeVideo(frame.width(), frame.height());
-  }
-
-  webrtc::ConvertFromI420(frame, VideoType::kBGRA, 0, buffer_);
-
-  glEnable(GL_TEXTURE_2D);
-  glBindTexture(GL_TEXTURE_2D, texture_);
-  glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width_, height_, GL_BGRA,
-                  GL_UNSIGNED_INT_8_8_8_8, buffer_);
-
-  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-
-  glLoadIdentity();
-
-  glBegin(GL_QUADS);
-  {
-    glTexCoord2f(0.0f, 0.0f);
-    glVertex3f(0.0f, 0.0f, 0.0f);
-
-    glTexCoord2f(0.0f, 1.0f);
-    glVertex3f(0.0f, 1.0f, 0.0f);
-
-    glTexCoord2f(1.0f, 1.0f);
-    glVertex3f(1.0f, 1.0f, 0.0f);
-
-    glTexCoord2f(1.0f, 0.0f);
-    glVertex3f(1.0f, 0.0f, 0.0f);
-  }
-  glEnd();
-
-  glBindTexture(GL_TEXTURE_2D, 0);
-  glFlush();
-}
-}  // test
-}  // webrtc
diff --git a/test/gl/gl_renderer.h b/test/gl/gl_renderer.h
deleted file mode 100644
index 01dc18d..0000000
--- a/test/gl/gl_renderer.h
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- *  Copyright (c) 2013 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_TEST_GL_GL_RENDERER_H_
-#define WEBRTC_TEST_GL_GL_RENDERER_H_
-
-#ifdef WEBRTC_MAC
-#include <OpenGL/gl.h>
-#else
-#include <GL/gl.h>
-#endif
-
-#include "webrtc/test/video_renderer.h"
-#include "webrtc/typedefs.h"
-
-
-namespace webrtc {
-namespace test {
-
-class GlRenderer : public VideoRenderer {
- public:
-  void OnFrame(const webrtc::VideoFrame& frame) override;
-
- protected:
-  GlRenderer();
-
-  void Init();
-  void Destroy();
-
-  void ResizeViewport(size_t width, size_t height);
-
- private:
-  bool is_init_;
-  uint8_t* buffer_;
-  GLuint texture_;
-  size_t width_, height_, buffer_size_;
-
-  void ResizeVideo(size_t width, size_t height);
-};
-}  // test
-}  // webrtc
-
-#endif  // WEBRTC_TEST_GL_GL_RENDERER_H_
diff --git a/test/gmock.h b/test/gmock.h
deleted file mode 100644
index 8e321a0..0000000
--- a/test/gmock.h
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- *  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_TEST_GMOCK_H_
-#define WEBRTC_TEST_GMOCK_H_
-
-#include "webrtc/rtc_base/ignore_wundef.h"
-
-RTC_PUSH_IGNORING_WUNDEF()
-#include "testing/gmock/include/gmock/gmock.h"
-RTC_POP_IGNORING_WUNDEF()
-
-#endif  // WEBRTC_TEST_GMOCK_H_
diff --git a/test/gtest.h b/test/gtest.h
deleted file mode 100644
index 886e7b8..0000000
--- a/test/gtest.h
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- *  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_TEST_GTEST_H_
-#define WEBRTC_TEST_GTEST_H_
-
-#include "webrtc/rtc_base/ignore_wundef.h"
-
-RTC_PUSH_IGNORING_WUNDEF()
-#include "testing/gtest/include/gtest/gtest.h"
-RTC_POP_IGNORING_WUNDEF()
-
-// GTEST_HAS_DEATH_TEST is set to 1 when death tests are supported, but appears
-// to be left unset if they're not supported. Rather than depend on this, we
-// set it to 0 ourselves here.
-#ifndef GTEST_HAS_DEATH_TEST
-#define GTEST_HAS_DEATH_TEST 0
-#endif
-
-#endif  // WEBRTC_TEST_GTEST_H_
diff --git a/test/ios/Info.plist b/test/ios/Info.plist
deleted file mode 100644
index e02ce91..0000000
--- a/test/ios/Info.plist
+++ /dev/null
@@ -1,45 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
-	<key>CFBundleDevelopmentRegion</key>
-	<string>English</string>
-	<key>CFBundleDisplayName</key>
-	<string>${PRODUCT_NAME}</string>
-	<key>CFBundleExecutable</key>
-	<string>${EXECUTABLE_NAME}</string>
-	<key>CFBundleIdentifier</key>
-	<string>${IOS_BUNDLE_ID_PREFIX}.gtest.${GTEST_BUNDLE_ID_SUFFIX:rfc1034identifier}</string>
-	<key>CFBundleInfoDictionaryVersion</key>
-	<string>6.0</string>
-	<key>CFBundleName</key>
-	<string>${PRODUCT_NAME}</string>
-	<key>CFBundlePackageType</key>
-	<string>APPL</string>
-	<key>CFBundleSignature</key>
-	<string>????</string>
-	<key>CFBundleVersion</key>
-	<string>1.0</string>
-	<key>LSRequiresIPhoneOS</key>
-	<true/>
-	<key>NSAppTransportSecurity</key>
-	<dict>
-		<key>NSAllowsArbitraryLoads</key>
-		<true/>
-	</dict>
-	<key>UIFileSharingEnabled</key>
-	<true/>
-	<key>UISupportedInterfaceOrientation</key>
-	<array>
-		<string>UIInterfaceOrientationPortrait</string>
-		<string>UIInterfaceOrientationLandscapeLeft</string>
-		<string>UIInterfaceOrientationLandscapeRight</string>
-	</array>
-	<key>UIBackgroundModes</key>
-	<array>
-		<string>fetch</string>
-	</array>
-	<key>NSMicrophoneUsageDescription</key>
-	<string>For testing purposes</string>
-</dict>
-</plist>
diff --git a/test/ios/test_support.h b/test/ios/test_support.h
deleted file mode 100644
index a962003..0000000
--- a/test/ios/test_support.h
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- *  Copyright 2017 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_TEST_IOS_TEST_SUPPORT_H_
-#define WEBRTC_TEST_IOS_TEST_SUPPORT_H_
-
-namespace rtc {
-namespace test {
-// Launches an iOS app that serves as a host for a test suite.
-// This is necessary as iOS doesn't like processes without a gui
-// running for longer than a few seconds.
-void RunTestsFromIOSApp();
-void InitTestSuite(int (*test_suite)(void), int argc, char* argv[]);
-
-}  // namespace test
-}  // namespace rtc
-
-#endif  // WEBRTC_TEST_IOS_TEST_SUPPORT_H_
diff --git a/test/ios/test_support.mm b/test/ios/test_support.mm
deleted file mode 100644
index a01b03c..0000000
--- a/test/ios/test_support.mm
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- *  Copyright 2017 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.
- */
-
-#import <UIKit/UIKit.h>
-
-#include "webrtc/test/ios/test_support.h"
-
-#import "webrtc/sdk/objc/Framework/Classes/Common/RTCUIApplicationStatusObserver.h"
-
-// Springboard will kill any iOS app that fails to check in after launch within
-// a given time. Starting a UIApplication before invoking TestSuite::Run
-// prevents this from happening.
-
-// InitIOSRunHook saves the TestSuite and argc/argv, then invoking
-// RunTestsFromIOSApp calls UIApplicationMain(), providing an application
-// delegate class: WebRtcUnitTestDelegate. The delegate implements
-// application:didFinishLaunchingWithOptions: to invoke the TestSuite's Run
-// method.
-
-// Since the executable isn't likely to be a real iOS UI, the delegate puts up a
-// window displaying the app name. If a bunch of apps using MainHook are being
-// run in a row, this provides an indication of which one is currently running.
-
-static int (*g_test_suite)(void) = NULL;
-static int g_argc;
-static char **g_argv;
-
-@interface UIApplication (Testing)
-- (void)_terminateWithStatus:(int)status;
-@end
-
-@interface WebRtcUnitTestDelegate : NSObject {
-  UIWindow *_window;
-}
-- (void)runTests;
-@end
-
-@implementation WebRtcUnitTestDelegate
-
-- (BOOL)application:(UIApplication *)application
-    didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
-  CGRect bounds = [[UIScreen mainScreen] bounds];
-
-  _window = [[UIWindow alloc] initWithFrame:bounds];
-  [_window setBackgroundColor:[UIColor whiteColor]];
-  [_window makeKeyAndVisible];
-
-  // Add a label with the app name.
-  UILabel *label = [[UILabel alloc] initWithFrame:bounds];
-  label.text = [[NSProcessInfo processInfo] processName];
-  label.textAlignment = NSTextAlignmentCenter;
-  [_window addSubview:label];
-
-  // An NSInternalInconsistencyException is thrown if the app doesn't have a
-  // root view controller. Set an empty one here.
-  [_window setRootViewController:[[UIViewController alloc] init]];
-
-  // We want to call `RTCUIApplicationStatusObserver sharedInstance` as early as
-  // possible in the application lifecycle to set observation properly.
-  __unused RTCUIApplicationStatusObserver *observer =
-      [RTCUIApplicationStatusObserver sharedInstance];
-
-  // Queue up the test run.
-  [self performSelector:@selector(runTests) withObject:nil afterDelay:0.1];
-  return YES;
-}
-
-- (void)runTests {
-  int exitStatus = g_test_suite();
-
-  // If a test app is too fast, it will exit before Instruments has has a
-  // a chance to initialize and no test results will be seen.
-  // TODO(crbug.com/137010): Figure out how much time is actually needed, and
-  // sleep only to make sure that much time has elapsed since launch.
-  [NSThread sleepUntilDate:[NSDate dateWithTimeIntervalSinceNow:2.0]];
-
-  // Use the hidden selector to try and cleanly take down the app (otherwise
-  // things can think the app crashed even on a zero exit status).
-  UIApplication *application = [UIApplication sharedApplication];
-  [application _terminateWithStatus:exitStatus];
-
-  exit(exitStatus);
-}
-
-@end
-namespace rtc {
-namespace test {
-
-void InitTestSuite(int (*test_suite)(void), int argc, char *argv[]) {
-  g_test_suite = test_suite;
-  g_argc = argc;
-  g_argv = argv;
-}
-
-void RunTestsFromIOSApp() {
-  @autoreleasepool {
-    exit(UIApplicationMain(g_argc, g_argv, nil, @"WebRtcUnitTestDelegate"));
-  }
-}
-}  // namespace test
-}  // namespace rtc
diff --git a/test/layer_filtering_transport.cc b/test/layer_filtering_transport.cc
deleted file mode 100644
index 7d7288a..0000000
--- a/test/layer_filtering_transport.cc
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- *  Copyright (c) 2015 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 <memory>
-
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
-#include "webrtc/modules/rtp_rtcp/source/byte_io.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_format.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_utility.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/test/layer_filtering_transport.h"
-
-namespace webrtc {
-namespace test {
-
-LayerFilteringTransport::LayerFilteringTransport(
-    SingleThreadedTaskQueueForTesting* task_queue,
-    const FakeNetworkPipe::Config& config,
-    Call* send_call,
-    uint8_t vp8_video_payload_type,
-    uint8_t vp9_video_payload_type,
-    int selected_tl,
-    int selected_sl,
-    const std::map<uint8_t, MediaType>& payload_type_map)
-    : DirectTransport(task_queue, config, send_call, payload_type_map),
-      vp8_video_payload_type_(vp8_video_payload_type),
-      vp9_video_payload_type_(vp9_video_payload_type),
-      selected_tl_(selected_tl),
-      selected_sl_(selected_sl),
-      discarded_last_packet_(false) {}
-
-bool LayerFilteringTransport::DiscardedLastPacket() const {
-  return discarded_last_packet_;
-}
-
-bool LayerFilteringTransport::SendRtp(const uint8_t* packet,
-                                      size_t length,
-                                      const PacketOptions& options) {
-  if (selected_tl_ == -1 && selected_sl_ == -1) {
-    // Nothing to change, forward the packet immediately.
-    return test::DirectTransport::SendRtp(packet, length, options);
-  }
-
-  bool set_marker_bit = false;
-  RtpUtility::RtpHeaderParser parser(packet, length);
-  RTPHeader header;
-  parser.Parse(&header);
-
-  RTC_DCHECK_LE(length, IP_PACKET_SIZE);
-  uint8_t temp_buffer[IP_PACKET_SIZE];
-  memcpy(temp_buffer, packet, length);
-
-  if (header.payloadType == vp8_video_payload_type_ ||
-      header.payloadType == vp9_video_payload_type_) {
-    const uint8_t* payload = packet + header.headerLength;
-    RTC_DCHECK_GT(length, header.headerLength);
-    const size_t payload_length = length - header.headerLength;
-    RTC_DCHECK_GT(payload_length, header.paddingLength);
-    const size_t payload_data_length = payload_length - header.paddingLength;
-
-    const bool is_vp8 = header.payloadType == vp8_video_payload_type_;
-    std::unique_ptr<RtpDepacketizer> depacketizer(
-        RtpDepacketizer::Create(is_vp8 ? kRtpVideoVp8 : kRtpVideoVp9));
-    RtpDepacketizer::ParsedPayload parsed_payload;
-    if (depacketizer->Parse(&parsed_payload, payload, payload_data_length)) {
-      const int temporal_idx = static_cast<int>(
-          is_vp8 ? parsed_payload.type.Video.codecHeader.VP8.temporalIdx
-                 : parsed_payload.type.Video.codecHeader.VP9.temporal_idx);
-      const int spatial_idx = static_cast<int>(
-          is_vp8 ? kNoSpatialIdx
-                 : parsed_payload.type.Video.codecHeader.VP9.spatial_idx);
-      if (selected_sl_ >= 0 && spatial_idx == selected_sl_ &&
-          parsed_payload.type.Video.codecHeader.VP9.end_of_frame) {
-        // This layer is now the last in the superframe.
-        set_marker_bit = true;
-      } else if ((selected_tl_ >= 0 && temporal_idx != kNoTemporalIdx &&
-                  temporal_idx > selected_tl_) ||
-                 (selected_sl_ >= 0 && spatial_idx != kNoSpatialIdx &&
-                  spatial_idx > selected_sl_)) {
-        // Truncate packet to a padding packet.
-        length = header.headerLength + 1;
-        temp_buffer[0] |= (1 << 5);  // P = 1.
-        temp_buffer[1] &= 0x7F;      // M = 0.
-        discarded_last_packet_ = true;
-        temp_buffer[header.headerLength] = 1;  // One byte of padding.
-      }
-    } else {
-      RTC_NOTREACHED() << "Parse error";
-    }
-  }
-
-  // We are discarding some of the packets (specifically, whole layers), so
-  // make sure the marker bit is set properly, and that sequence numbers are
-  // continuous.
-  if (set_marker_bit)
-    temp_buffer[1] |= kRtpMarkerBitMask;
-
-  return test::DirectTransport::SendRtp(temp_buffer, length, options);
-}
-
-}  // namespace test
-}  // namespace webrtc
diff --git a/test/layer_filtering_transport.h b/test/layer_filtering_transport.h
deleted file mode 100644
index 32eb4c5..0000000
--- a/test/layer_filtering_transport.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- *  Copyright (c) 2015 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_TEST_LAYER_FILTERING_TRANSPORT_H_
-#define WEBRTC_TEST_LAYER_FILTERING_TRANSPORT_H_
-
-#include "webrtc/call/call.h"
-#include "webrtc/test/direct_transport.h"
-#include "webrtc/test/fake_network_pipe.h"
-#include "webrtc/test/single_threaded_task_queue.h"
-
-#include <map>
-
-namespace webrtc {
-
-namespace test {
-
-class LayerFilteringTransport : public test::DirectTransport {
- public:
-  LayerFilteringTransport(SingleThreadedTaskQueueForTesting* task_queue,
-                          const FakeNetworkPipe::Config& config,
-                          Call* send_call,
-                          uint8_t vp8_video_payload_type,
-                          uint8_t vp9_video_payload_type,
-                          int selected_tl,
-                          int selected_sl,
-                          const std::map<uint8_t, MediaType>& payload_type_map);
-  bool DiscardedLastPacket() const;
-  bool SendRtp(const uint8_t* data,
-               size_t length,
-               const PacketOptions& options) override;
-
- private:
-  // Used to distinguish between VP8 and VP9.
-  const uint8_t vp8_video_payload_type_;
-  const uint8_t vp9_video_payload_type_;
-  // Discard or invalidate all temporal/spatial layers with id greater than the
-  // selected one. -1 to disable filtering.
-  const int selected_tl_;
-  const int selected_sl_;
-  bool discarded_last_packet_;
-};
-
-}  // namespace test
-}  // namespace webrtc
-
-#endif  // WEBRTC_TEST_LAYER_FILTERING_TRANSPORT_H_
diff --git a/test/linux/glx_renderer.cc b/test/linux/glx_renderer.cc
deleted file mode 100644
index d6979c8..0000000
--- a/test/linux/glx_renderer.cc
+++ /dev/null
@@ -1,178 +0,0 @@
-/*
- *  Copyright (c) 2013 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/test/linux/glx_renderer.h"
-
-#include <assert.h>
-#include <stdlib.h>
-
-#include <X11/Xatom.h>
-#include <X11/Xlib.h>
-
-#include "webrtc/common_video/libyuv/include/webrtc_libyuv.h"
-
-namespace webrtc {
-namespace test {
-
-GlxRenderer::GlxRenderer(size_t width, size_t height)
-    : width_(width),
-      height_(height),
-      display_(NULL),
-      context_(NULL) {
-  assert(width > 0);
-  assert(height > 0);
-}
-
-GlxRenderer::~GlxRenderer() { Destroy(); }
-
-bool GlxRenderer::Init(const char* window_title) {
-  if ((display_ = XOpenDisplay(NULL)) == NULL) {
-    Destroy();
-    return false;
-  }
-
-  int screen = DefaultScreen(display_);
-
-  XVisualInfo* vi;
-  int attr_list[] = { GLX_DOUBLEBUFFER, GLX_RGBA, GLX_RED_SIZE, 4,
-                      GLX_GREEN_SIZE, 4, GLX_BLUE_SIZE, 4, GLX_DEPTH_SIZE, 16,
-                      None, };
-
-  if ((vi = glXChooseVisual(display_, screen, attr_list)) == NULL) {
-    Destroy();
-    return false;
-  }
-
-  context_ = glXCreateContext(display_, vi, 0, true);
-  if (context_ == NULL) {
-    Destroy();
-    return false;
-  }
-
-  XSetWindowAttributes window_attributes;
-  window_attributes.colormap = XCreateColormap(
-      display_, RootWindow(display_, vi->screen), vi->visual, AllocNone);
-  window_attributes.border_pixel = 0;
-  window_attributes.event_mask = StructureNotifyMask | ExposureMask;
-  window_ = XCreateWindow(display_, RootWindow(display_, vi->screen), 0, 0,
-                          width_, height_, 0, vi->depth, InputOutput,
-                          vi->visual, CWBorderPixel | CWColormap | CWEventMask,
-                          &window_attributes);
-  XFree(vi);
-
-  XSetStandardProperties(display_, window_, window_title, window_title, None,
-                         NULL, 0, NULL);
-
-  Atom wm_delete = XInternAtom(display_, "WM_DELETE_WINDOW", True);
-  if (wm_delete != None) {
-    XSetWMProtocols(display_, window_, &wm_delete, 1);
-  }
-
-  XMapRaised(display_, window_);
-
-  if (!glXMakeCurrent(display_, window_, context_)) {
-    Destroy();
-    return false;
-  }
-  GlRenderer::Init();
-  if (!glXMakeCurrent(display_, None, NULL)) {
-    Destroy();
-    return false;
-  }
-
-  Resize(width_, height_);
-  return true;
-}
-
-void GlxRenderer::Destroy() {
-  if (context_ != NULL) {
-    glXMakeCurrent(display_, window_, context_);
-    GlRenderer::Destroy();
-    glXMakeCurrent(display_, None, NULL);
-    glXDestroyContext(display_, context_);
-    context_ = NULL;
-  }
-
-  if (display_ != NULL) {
-    XCloseDisplay(display_);
-    display_ = NULL;
-  }
-}
-
-GlxRenderer* GlxRenderer::Create(const char* window_title, size_t width,
-                                 size_t height) {
-  GlxRenderer* glx_renderer = new GlxRenderer(width, height);
-  if (!glx_renderer->Init(window_title)) {
-    // TODO(pbos): Add GLX-failed warning here?
-    delete glx_renderer;
-    return NULL;
-  }
-  return glx_renderer;
-}
-
-void GlxRenderer::Resize(size_t width, size_t height) {
-  width_ = width;
-  height_ = height;
-  if (!glXMakeCurrent(display_, window_, context_)) {
-    abort();
-  }
-  GlRenderer::ResizeViewport(width_, height_);
-  if (!glXMakeCurrent(display_, None, NULL)) {
-    abort();
-  }
-
-  XSizeHints* size_hints = XAllocSizeHints();
-  if (size_hints == NULL) {
-    abort();
-  }
-  size_hints->flags = PAspect;
-  size_hints->min_aspect.x = size_hints->max_aspect.x = width_;
-  size_hints->min_aspect.y = size_hints->max_aspect.y = height_;
-  XSetWMNormalHints(display_, window_, size_hints);
-  XFree(size_hints);
-
-  XWindowChanges wc;
-  wc.width = static_cast<int>(width);
-  wc.height = static_cast<int>(height);
-  XConfigureWindow(display_, window_, CWWidth | CWHeight, &wc);
-}
-
-void GlxRenderer::OnFrame(const webrtc::VideoFrame& frame) {
-  if (static_cast<size_t>(frame.width()) != width_ ||
-      static_cast<size_t>(frame.height()) != height_) {
-    Resize(static_cast<size_t>(frame.width()),
-           static_cast<size_t>(frame.height()));
-  }
-
-  XEvent event;
-  if (!glXMakeCurrent(display_, window_, context_)) {
-    abort();
-  }
-  while (XPending(display_)) {
-    XNextEvent(display_, &event);
-    switch (event.type) {
-      case ConfigureNotify:
-        GlRenderer::ResizeViewport(event.xconfigure.width,
-                                   event.xconfigure.height);
-        break;
-      default:
-        break;
-    }
-  }
-
-  GlRenderer::OnFrame(frame);
-  glXSwapBuffers(display_, window_);
-
-  if (!glXMakeCurrent(display_, None, NULL)) {
-    abort();
-  }
-}
-}  // test
-}  // webrtc
diff --git a/test/linux/glx_renderer.h b/test/linux/glx_renderer.h
deleted file mode 100644
index 4a758db..0000000
--- a/test/linux/glx_renderer.h
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- *  Copyright (c) 2013 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_TEST_LINUX_GLX_RENDERER_H_
-#define WEBRTC_TEST_LINUX_GLX_RENDERER_H_
-
-#include <GL/glx.h>
-#include <X11/Xlib.h>
-
-#include "webrtc/test/gl/gl_renderer.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-namespace test {
-
-class GlxRenderer : public GlRenderer {
- public:
-  static GlxRenderer* Create(const char* window_title, size_t width,
-                             size_t height);
-  virtual ~GlxRenderer();
-
-  void OnFrame(const webrtc::VideoFrame& frame) override;
-
- private:
-  GlxRenderer(size_t width, size_t height);
-
-  bool Init(const char* window_title);
-  void Resize(size_t width, size_t height);
-  void Destroy();
-
-  size_t width_, height_;
-
-  Display* display_;
-  Window window_;
-  GLXContext context_;
-};
-}  // test
-}  // webrtc
-
-#endif  // WEBRTC_TEST_LINUX_GLX_RENDERER_H_
diff --git a/test/linux/video_renderer_linux.cc b/test/linux/video_renderer_linux.cc
deleted file mode 100644
index 6f69dd7..0000000
--- a/test/linux/video_renderer_linux.cc
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- *  Copyright (c) 2013 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/test/video_renderer.h"
-
-#include "webrtc/test/linux/glx_renderer.h"
-
-namespace webrtc {
-namespace test {
-
-VideoRenderer* VideoRenderer::CreatePlatformRenderer(const char* window_title,
-                                                     size_t width,
-                                                     size_t height) {
-  GlxRenderer* glx_renderer = GlxRenderer::Create(window_title, width, height);
-  if (glx_renderer != NULL) {
-    return glx_renderer;
-  }
-  return NULL;
-}
-}  // test
-}  // webrtc
diff --git a/test/mac/run_test.mm b/test/mac/run_test.mm
deleted file mode 100644
index 7576b55..0000000
--- a/test/mac/run_test.mm
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- *  Copyright (c) 2013 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.
- */
-
-#import <Cocoa/Cocoa.h>
-
-#include "webrtc/test/run_test.h"
-
-// Converting a C++ function pointer to an Objective-C block.
-typedef void(^TestBlock)();
-TestBlock functionToBlock(void(*function)()) {
-  return [^(void) { function(); } copy];
-}
-
-// Class calling the test function on the platform specific thread.
-@interface TestRunner : NSObject {
-  BOOL running_;
-}
-- (void)runAllTests:(TestBlock)ignored;
-- (BOOL)running;
-@end
-
-@implementation TestRunner
-- (id)init {
-  self = [super init];
-  if (self) {
-    running_ = YES;
-  }
-  return self;
-}
-
-- (void)runAllTests:(TestBlock)testBlock {
-  @autoreleasepool {
-    testBlock();
-    running_ = NO;
-  }
-}
-
-- (BOOL)running {
-  return running_;
-}
-@end
-
-namespace webrtc {
-namespace test {
-
-void RunTest(void(*test)()) {
-  @autoreleasepool {
-    [NSApplication sharedApplication];
-
-    // Convert the function pointer to an Objective-C block and call on a
-    // separate thread, to avoid blocking the main thread.
-    TestRunner *testRunner = [[TestRunner alloc] init];
-    TestBlock testBlock = functionToBlock(test);
-    [NSThread detachNewThreadSelector:@selector(runAllTests:)
-                             toTarget:testRunner
-                           withObject:testBlock];
-
-    NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
-    while ([testRunner running] && [runLoop runMode:NSDefaultRunLoopMode
-                                         beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]])
-      ;
-  }
-}
-
-}  // namespace test
-}  // namespace webrtc
diff --git a/test/mac/video_renderer_mac.h b/test/mac/video_renderer_mac.h
deleted file mode 100644
index 2d55163..0000000
--- a/test/mac/video_renderer_mac.h
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- *  Copyright (c) 2013 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_TEST_MAC_VIDEO_RENDERER_MAC_H_
-#define WEBRTC_TEST_MAC_VIDEO_RENDERER_MAC_H_
-
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/test/gl/gl_renderer.h"
-
-@class CocoaWindow;
-
-namespace webrtc {
-namespace test {
-
-class MacRenderer : public GlRenderer {
- public:
-  MacRenderer();
-  virtual ~MacRenderer();
-
-  bool Init(const char* window_title, int width, int height);
-
-  // Implements GlRenderer.
-  void OnFrame(const VideoFrame& frame) override;
-
- private:
-  CocoaWindow* window_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(MacRenderer);
-};
-}  // test
-}  // webrtc
-
-#endif  // WEBRTC_TEST_MAC_VIDEO_RENDERER_MAC_H_
diff --git a/test/mac/video_renderer_mac.mm b/test/mac/video_renderer_mac.mm
deleted file mode 100644
index 411a7d0..0000000
--- a/test/mac/video_renderer_mac.mm
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- *  Copyright (c) 2013 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/test/mac/video_renderer_mac.h"
-
-#import <Cocoa/Cocoa.h>
-
-// Creates a Cocoa Window with an OpenGL context, used together with an OpenGL
-// renderer.
-@interface CocoaWindow : NSObject {
- @private
-  NSWindow *window_;
-  NSOpenGLContext *context_;
-  NSString *title_;
-  int width_;
-  int height_;
-}
-
-- (id)initWithTitle:(NSString *)title width:(int)width height:(int)height;
-// 'createWindow' must be called on the main thread.
-- (void)createWindow:(NSObject *)ignored;
-- (void)makeCurrentContext;
-
-@end
-
-@implementation CocoaWindow
-  static NSInteger nextXOrigin_;
-  static NSInteger nextYOrigin_;
-
-- (id)initWithTitle:(NSString *)title width:(int)width height:(int)height {
-  if (self = [super init]) {
-    title_ = title;
-    width_ = width;
-    height_ = height;
-  }
-  return self;
-}
-
-- (void)createWindow:(NSObject *)ignored {
-  NSInteger xOrigin = nextXOrigin_;
-  NSRect screenFrame = [[NSScreen mainScreen] frame];
-  if (nextXOrigin_ + width_ < screenFrame.size.width) {
-    nextXOrigin_ += width_;
-  } else {
-    xOrigin = 0;
-    nextXOrigin_ = 0;
-    nextYOrigin_ += height_;
-  }
-  if (nextYOrigin_ + height_ > screenFrame.size.height) {
-    xOrigin = 0;
-    nextXOrigin_ = 0;
-    nextYOrigin_ = 0;
-  }
-  NSInteger yOrigin = nextYOrigin_;
-  NSRect windowFrame = NSMakeRect(xOrigin, yOrigin, width_, height_);
-  window_ = [[NSWindow alloc] initWithContentRect:windowFrame
-                                        styleMask:NSTitledWindowMask
-                                          backing:NSBackingStoreBuffered
-                                            defer:NO];
-
-  NSRect viewFrame = NSMakeRect(0, 0, width_, height_);
-  NSOpenGLView *view = [[NSOpenGLView alloc] initWithFrame:viewFrame pixelFormat:nil];
-  context_ = [view openGLContext];
-
-  [[window_ contentView] addSubview:view];
-  [window_ setTitle:title_];
-  [window_ makeKeyAndOrderFront:NSApp];
-}
-
-- (void)makeCurrentContext {
-  [context_ makeCurrentContext];
-}
-
-@end
-
-namespace webrtc {
-namespace test {
-
-VideoRenderer* VideoRenderer::CreatePlatformRenderer(const char* window_title,
-                                                     size_t width,
-                                                     size_t height) {
-  MacRenderer* renderer = new MacRenderer();
-  if (!renderer->Init(window_title, width, height)) {
-    delete renderer;
-    return NULL;
-  }
-  return renderer;
-}
-
-MacRenderer::MacRenderer()
-    : window_(NULL) {}
-
-MacRenderer::~MacRenderer() {
-  GlRenderer::Destroy();
-}
-
-bool MacRenderer::Init(const char* window_title, int width, int height) {
-  window_ = [[CocoaWindow alloc]
-      initWithTitle:[NSString stringWithUTF8String:window_title]
-                                             width:width
-                                            height:height];
-  if (!window_)
-    return false;
-  [window_ performSelectorOnMainThread:@selector(createWindow:)
-                            withObject:nil
-                         waitUntilDone:YES];
-
-  [window_ makeCurrentContext];
-  GlRenderer::Init();
-  GlRenderer::ResizeViewport(width, height);
-  return true;
-}
-
-void MacRenderer::OnFrame(const VideoFrame& frame) {
-  [window_ makeCurrentContext];
-  GlRenderer::OnFrame(frame);
-}
-
-}  // test
-}  // webrtc
diff --git a/test/mock_audio_decoder.cc b/test/mock_audio_decoder.cc
deleted file mode 100644
index 102ba79..0000000
--- a/test/mock_audio_decoder.cc
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- *  Copyright (c) 2017 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/test/mock_audio_decoder.h"
-
-namespace webrtc {
-
-MockAudioDecoder::MockAudioDecoder() = default;
-MockAudioDecoder::~MockAudioDecoder() {
-  Die();
-}
-
-}  // namespace webrtc
diff --git a/test/mock_audio_decoder.h b/test/mock_audio_decoder.h
deleted file mode 100644
index d124b0f..0000000
--- a/test/mock_audio_decoder.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- *  Copyright (c) 2012 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_TEST_MOCK_AUDIO_DECODER_H_
-#define WEBRTC_TEST_MOCK_AUDIO_DECODER_H_
-
-#include "webrtc/api/audio_codecs/audio_decoder.h"
-#include "webrtc/test/gmock.h"
-
-namespace webrtc {
-
-class MockAudioDecoder : public AudioDecoder {
- public:
-  MockAudioDecoder();
-  ~MockAudioDecoder();
-  MOCK_METHOD0(Die, void());
-  MOCK_METHOD5(DecodeInternal,
-               int(const uint8_t*, size_t, int, int16_t*, SpeechType*));
-  MOCK_CONST_METHOD0(HasDecodePlc, bool());
-  MOCK_METHOD2(DecodePlc, size_t(size_t, int16_t*));
-  MOCK_METHOD0(Reset, void());
-  MOCK_METHOD5(IncomingPacket,
-               int(const uint8_t*, size_t, uint16_t, uint32_t, uint32_t));
-  MOCK_METHOD0(ErrorCode, int());
-  MOCK_CONST_METHOD2(PacketDuration, int(const uint8_t*, size_t));
-  MOCK_CONST_METHOD0(Channels, size_t());
-  MOCK_CONST_METHOD0(SampleRateHz, int());
-};
-
-}  // namespace webrtc
-#endif  // WEBRTC_TEST_MOCK_AUDIO_DECODER_H_
diff --git a/test/mock_audio_decoder_factory.h b/test/mock_audio_decoder_factory.h
deleted file mode 100644
index ae7cc42..0000000
--- a/test/mock_audio_decoder_factory.h
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- *  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_TEST_MOCK_AUDIO_DECODER_FACTORY_H_
-#define WEBRTC_TEST_MOCK_AUDIO_DECODER_FACTORY_H_
-
-#include <memory>
-#include <vector>
-
-#include "webrtc/api/audio_codecs/audio_decoder_factory.h"
-#include "webrtc/api/audio_codecs/builtin_audio_decoder_factory.h"
-#include "webrtc/rtc_base/scoped_ref_ptr.h"
-#include "webrtc/test/gmock.h"
-
-namespace webrtc {
-
-class MockAudioDecoderFactory : public AudioDecoderFactory {
- public:
-  MOCK_METHOD0(GetSupportedDecoders, std::vector<AudioCodecSpec>());
-  MOCK_METHOD1(IsSupportedDecoder, bool(const SdpAudioFormat&));
-  std::unique_ptr<AudioDecoder> MakeAudioDecoder(const SdpAudioFormat& format) {
-    std::unique_ptr<AudioDecoder> return_value;
-    MakeAudioDecoderMock(format, &return_value);
-    return return_value;
-  }
-  MOCK_METHOD2(MakeAudioDecoderMock,
-               void(const SdpAudioFormat& format,
-                    std::unique_ptr<AudioDecoder>* return_value));
-
-  // Creates a MockAudioDecoderFactory with no formats and that may not be
-  // invoked to create a codec - useful for initializing a voice engine, for
-  // example.
-  static rtc::scoped_refptr<webrtc::MockAudioDecoderFactory>
-  CreateUnusedFactory() {
-    using testing::_;
-    using testing::AnyNumber;
-    using testing::Return;
-
-    rtc::scoped_refptr<webrtc::MockAudioDecoderFactory> factory =
-        new rtc::RefCountedObject<webrtc::MockAudioDecoderFactory>;
-    ON_CALL(*factory.get(), GetSupportedDecoders())
-        .WillByDefault(Return(std::vector<webrtc::AudioCodecSpec>()));
-    EXPECT_CALL(*factory.get(), GetSupportedDecoders()).Times(AnyNumber());
-    ON_CALL(*factory, IsSupportedDecoder(_)).WillByDefault(Return(false));
-    EXPECT_CALL(*factory, IsSupportedDecoder(_)).Times(AnyNumber());
-    EXPECT_CALL(*factory.get(), MakeAudioDecoderMock(_, _)).Times(0);
-    return factory;
-  }
-
-  // Creates a MockAudioDecoderFactory with no formats that may be invoked to
-  // create a codec any number of times. It will, though, return nullptr on each
-  // call, since it supports no codecs.
-  static rtc::scoped_refptr<webrtc::MockAudioDecoderFactory>
-  CreateEmptyFactory() {
-    using testing::_;
-    using testing::AnyNumber;
-    using testing::Return;
-    using testing::SetArgPointee;
-
-    rtc::scoped_refptr<webrtc::MockAudioDecoderFactory> factory =
-        new rtc::RefCountedObject<webrtc::MockAudioDecoderFactory>;
-    ON_CALL(*factory.get(), GetSupportedDecoders())
-        .WillByDefault(Return(std::vector<webrtc::AudioCodecSpec>()));
-    EXPECT_CALL(*factory.get(), GetSupportedDecoders()).Times(AnyNumber());
-    ON_CALL(*factory, IsSupportedDecoder(_)).WillByDefault(Return(false));
-    EXPECT_CALL(*factory, IsSupportedDecoder(_)).Times(AnyNumber());
-    ON_CALL(*factory.get(), MakeAudioDecoderMock(_, _))
-        .WillByDefault(SetArgPointee<1>(nullptr));
-    EXPECT_CALL(*factory.get(), MakeAudioDecoderMock(_, _)).Times(AnyNumber());
-    return factory;
-  }
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_TEST_MOCK_AUDIO_DECODER_FACTORY_H_
diff --git a/test/mock_audio_encoder.cc b/test/mock_audio_encoder.cc
deleted file mode 100644
index 5365ef0..0000000
--- a/test/mock_audio_encoder.cc
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- *  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/test/mock_audio_encoder.h"
-
-namespace webrtc {
-
-MockAudioEncoder::MockAudioEncoder() = default;
-MockAudioEncoder::~MockAudioEncoder() {
-  Die();
-}
-
-MockAudioEncoder::FakeEncoding::FakeEncoding(
-    const AudioEncoder::EncodedInfo& info)
-    : info_(info) {}
-
-MockAudioEncoder::FakeEncoding::FakeEncoding(size_t encoded_bytes) {
-  info_.encoded_bytes = encoded_bytes;
-}
-
-AudioEncoder::EncodedInfo MockAudioEncoder::FakeEncoding::operator()(
-    uint32_t timestamp,
-    rtc::ArrayView<const int16_t> audio,
-    rtc::Buffer* encoded) {
-  encoded->SetSize(encoded->size() + info_.encoded_bytes);
-  return info_;
-}
-
-MockAudioEncoder::CopyEncoding::~CopyEncoding() = default;
-
-MockAudioEncoder::CopyEncoding::CopyEncoding(
-    AudioEncoder::EncodedInfo info,
-    rtc::ArrayView<const uint8_t> payload)
-    : info_(info), payload_(payload) {}
-
-MockAudioEncoder::CopyEncoding::CopyEncoding(
-    rtc::ArrayView<const uint8_t> payload)
-    : payload_(payload) {
-  info_.encoded_bytes = payload_.size();
-}
-
-AudioEncoder::EncodedInfo MockAudioEncoder::CopyEncoding::operator()(
-    uint32_t timestamp,
-    rtc::ArrayView<const int16_t> audio,
-    rtc::Buffer* encoded) {
-  RTC_CHECK(encoded);
-  RTC_CHECK_LE(info_.encoded_bytes, payload_.size());
-  encoded->AppendData(payload_.data(), info_.encoded_bytes);
-  return info_;
-}
-
-}  // namespace webrtc
diff --git a/test/mock_audio_encoder.h b/test/mock_audio_encoder.h
deleted file mode 100644
index c30b35e..0000000
--- a/test/mock_audio_encoder.h
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- *  Copyright (c) 2014 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_TEST_MOCK_AUDIO_ENCODER_H_
-#define WEBRTC_TEST_MOCK_AUDIO_ENCODER_H_
-
-#include <string>
-
-#include "webrtc/api/array_view.h"
-#include "webrtc/api/audio_codecs/audio_encoder.h"
-#include "webrtc/test/gmock.h"
-
-namespace webrtc {
-
-class MockAudioEncoder : public AudioEncoder {
- public:
-  // TODO(nisse): Valid overrides commented out, because the gmock
-  // methods don't use any override declarations, and we want to avoid
-  // warnings from -Winconsistent-missing-override. See
-  // http://crbug.com/428099.
-  MockAudioEncoder();
-  ~MockAudioEncoder();
-  MOCK_METHOD0(Die, void());
-  MOCK_METHOD1(Mark, void(std::string desc));
-  MOCK_CONST_METHOD0(SampleRateHz, int());
-  MOCK_CONST_METHOD0(NumChannels, size_t());
-  MOCK_CONST_METHOD0(RtpTimestampRateHz, int());
-  MOCK_CONST_METHOD0(Num10MsFramesInNextPacket, size_t());
-  MOCK_CONST_METHOD0(Max10MsFramesInAPacket, size_t());
-  MOCK_CONST_METHOD0(GetTargetBitrate, int());
-  MOCK_METHOD0(Reset, void());
-  MOCK_METHOD1(SetFec, bool(bool enable));
-  MOCK_METHOD1(SetDtx, bool(bool enable));
-  MOCK_METHOD1(SetApplication, bool(Application application));
-  MOCK_METHOD1(SetMaxPlaybackRate, void(int frequency_hz));
-  MOCK_METHOD1(SetMaxBitrate, void(int max_bps));
-  MOCK_METHOD1(SetMaxPayloadSize, void(int max_payload_size_bytes));
-  MOCK_METHOD2(OnReceivedUplinkBandwidth,
-               void(int target_audio_bitrate_bps,
-                    rtc::Optional<int64_t> probing_interval_ms));
-  MOCK_METHOD1(OnReceivedUplinkPacketLossFraction,
-               void(float uplink_packet_loss_fraction));
-
-  MOCK_METHOD2(EnableAudioNetworkAdaptor,
-               bool(const std::string& config_string, RtcEventLog* event_log));
-
-  // Note, we explicitly chose not to create a mock for the Encode method.
-  MOCK_METHOD3(EncodeImpl,
-               EncodedInfo(uint32_t timestamp,
-                           rtc::ArrayView<const int16_t> audio,
-                           rtc::Buffer* encoded));
-
-  class FakeEncoding {
-   public:
-    // Creates a functor that will return |info| and adjust the rtc::Buffer
-    // given as input to it, so it is info.encoded_bytes larger.
-    explicit FakeEncoding(const AudioEncoder::EncodedInfo& info);
-
-    // Shorthand version of the constructor above, for when only setting
-    // encoded_bytes in the EncodedInfo object matters.
-    explicit FakeEncoding(size_t encoded_bytes);
-
-    AudioEncoder::EncodedInfo operator()(uint32_t timestamp,
-                                         rtc::ArrayView<const int16_t> audio,
-                                         rtc::Buffer* encoded);
-
-   private:
-    AudioEncoder::EncodedInfo info_;
-  };
-
-  class CopyEncoding {
-   public:
-    ~CopyEncoding();
-
-    // Creates a functor that will return |info| and append the data in the
-    // payload to the buffer given as input to it. Up to info.encoded_bytes are
-    // appended - make sure the payload is big enough!  Since it uses an
-    // ArrayView, it _does not_ copy the payload. Make sure it doesn't fall out
-    // of scope!
-    CopyEncoding(AudioEncoder::EncodedInfo info,
-                 rtc::ArrayView<const uint8_t> payload);
-
-    // Shorthand version of the constructor above, for when you wish to append
-    // the whole payload and do not care about any EncodedInfo attribute other
-    // than encoded_bytes.
-    explicit CopyEncoding(rtc::ArrayView<const uint8_t> payload);
-
-    AudioEncoder::EncodedInfo operator()(uint32_t timestamp,
-                                         rtc::ArrayView<const int16_t> audio,
-                                         rtc::Buffer* encoded);
-
-   private:
-    AudioEncoder::EncodedInfo info_;
-    rtc::ArrayView<const uint8_t> payload_;
-  };
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_TEST_MOCK_AUDIO_ENCODER_H_
diff --git a/test/mock_audio_encoder_factory.h b/test/mock_audio_encoder_factory.h
deleted file mode 100644
index c095197..0000000
--- a/test/mock_audio_encoder_factory.h
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- *  Copyright (c) 2017 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_TEST_MOCK_AUDIO_ENCODER_FACTORY_H_
-#define WEBRTC_TEST_MOCK_AUDIO_ENCODER_FACTORY_H_
-
-#include <memory>
-#include <vector>
-
-#include "webrtc/api/audio_codecs/audio_encoder_factory.h"
-#include "webrtc/rtc_base/scoped_ref_ptr.h"
-#include "webrtc/test/gmock.h"
-
-namespace webrtc {
-
-class MockAudioEncoderFactory : public AudioEncoderFactory {
- public:
-  MOCK_METHOD0(GetSupportedEncoders, std::vector<AudioCodecSpec>());
-  MOCK_METHOD1(QueryAudioEncoder,
-               rtc::Optional<AudioCodecInfo>(const SdpAudioFormat& format));
-
-  std::unique_ptr<AudioEncoder> MakeAudioEncoder(int payload_type,
-                                                 const SdpAudioFormat& format) {
-    std::unique_ptr<AudioEncoder> return_value;
-    MakeAudioEncoderMock(payload_type, format, &return_value);
-    return return_value;
-  }
-  MOCK_METHOD3(MakeAudioEncoderMock,
-               void(int payload_type,
-                    const SdpAudioFormat& format,
-                    std::unique_ptr<AudioEncoder>* return_value));
-
-  // Creates a MockAudioEncoderFactory with no formats and that may not be
-  // invoked to create a codec - useful for initializing a voice engine, for
-  // example.
-  static rtc::scoped_refptr<webrtc::MockAudioEncoderFactory>
-  CreateUnusedFactory() {
-    using testing::_;
-    using testing::AnyNumber;
-    using testing::Return;
-
-    rtc::scoped_refptr<webrtc::MockAudioEncoderFactory> factory =
-        new rtc::RefCountedObject<webrtc::MockAudioEncoderFactory>;
-    ON_CALL(*factory.get(), GetSupportedEncoders())
-        .WillByDefault(Return(std::vector<webrtc::AudioCodecSpec>()));
-    ON_CALL(*factory.get(), QueryAudioEncoder(_))
-        .WillByDefault(Return(rtc::Optional<AudioCodecInfo>()));
-
-    EXPECT_CALL(*factory.get(), GetSupportedEncoders()).Times(AnyNumber());
-    EXPECT_CALL(*factory.get(), QueryAudioEncoder(_)).Times(AnyNumber());
-    EXPECT_CALL(*factory.get(), MakeAudioEncoderMock(_, _, _)).Times(0);
-    return factory;
-  }
-
-  // Creates a MockAudioEncoderFactory with no formats that may be invoked to
-  // create a codec any number of times. It will, though, return nullptr on each
-  // call, since it supports no codecs.
-  static rtc::scoped_refptr<webrtc::MockAudioEncoderFactory>
-  CreateEmptyFactory() {
-    using testing::_;
-    using testing::AnyNumber;
-    using testing::Return;
-    using testing::SetArgPointee;
-
-    rtc::scoped_refptr<webrtc::MockAudioEncoderFactory> factory =
-        new rtc::RefCountedObject<webrtc::MockAudioEncoderFactory>;
-    ON_CALL(*factory.get(), GetSupportedEncoders())
-        .WillByDefault(Return(std::vector<webrtc::AudioCodecSpec>()));
-    ON_CALL(*factory.get(), QueryAudioEncoder(_))
-        .WillByDefault(Return(rtc::Optional<AudioCodecInfo>()));
-    ON_CALL(*factory.get(), MakeAudioEncoderMock(_, _, _))
-        .WillByDefault(SetArgPointee<2>(nullptr));
-
-    EXPECT_CALL(*factory.get(), GetSupportedEncoders()).Times(AnyNumber());
-    EXPECT_CALL(*factory.get(), QueryAudioEncoder(_)).Times(AnyNumber());
-    EXPECT_CALL(*factory.get(), MakeAudioEncoderMock(_, _, _))
-        .Times(AnyNumber());
-    return factory;
-  }
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_TEST_MOCK_AUDIO_ENCODER_FACTORY_H_
diff --git a/test/mock_transport.h b/test/mock_transport.h
deleted file mode 100644
index d76dc6e..0000000
--- a/test/mock_transport.h
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- *  Copyright (c) 2013 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_TEST_MOCK_TRANSPORT_H_
-#define WEBRTC_TEST_MOCK_TRANSPORT_H_
-
-#include "webrtc/api/call/transport.h"
-#include "webrtc/test/gmock.h"
-
-namespace webrtc {
-
-class MockTransport : public Transport {
- public:
-  MOCK_METHOD3(SendRtp,
-               bool(const uint8_t* data,
-                    size_t len,
-                    const PacketOptions& options));
-  MOCK_METHOD2(SendRtcp, bool(const uint8_t* data, size_t len));
-};
-}  // namespace webrtc
-#endif  // WEBRTC_TEST_MOCK_TRANSPORT_H_
diff --git a/test/mock_voe_channel_proxy.h b/test/mock_voe_channel_proxy.h
deleted file mode 100644
index b151aa8..0000000
--- a/test/mock_voe_channel_proxy.h
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- *  Copyright (c) 2015 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_TEST_MOCK_VOE_CHANNEL_PROXY_H_
-#define WEBRTC_TEST_MOCK_VOE_CHANNEL_PROXY_H_
-
-#include <string>
-
-#include "webrtc/modules/rtp_rtcp/source/rtp_packet_received.h"
-#include "webrtc/test/gmock.h"
-#include "webrtc/voice_engine/channel_proxy.h"
-
-namespace webrtc {
-namespace test {
-
-class MockVoEChannelProxy : public voe::ChannelProxy {
- public:
-  // GTest doesn't like move-only types, like std::unique_ptr
-  bool SetEncoder(int payload_type,
-                  std::unique_ptr<AudioEncoder> encoder) {
-    return SetEncoderForMock(payload_type, &encoder);
-  }
-  MOCK_METHOD2(SetEncoderForMock,
-               bool(int payload_type,
-                    std::unique_ptr<AudioEncoder>* encoder));
-  MOCK_METHOD1(
-      ModifyEncoder,
-      void(rtc::FunctionView<void(std::unique_ptr<AudioEncoder>*)> modifier));
-  MOCK_METHOD1(SetRTCPStatus, void(bool enable));
-  MOCK_METHOD1(SetLocalSSRC, void(uint32_t ssrc));
-  MOCK_METHOD1(SetRTCP_CNAME, void(const std::string& c_name));
-  MOCK_METHOD2(SetNACKStatus, void(bool enable, int max_packets));
-  MOCK_METHOD2(SetSendAudioLevelIndicationStatus, void(bool enable, int id));
-  MOCK_METHOD2(SetReceiveAudioLevelIndicationStatus, void(bool enable, int id));
-  MOCK_METHOD1(EnableSendTransportSequenceNumber, void(int id));
-  MOCK_METHOD1(EnableReceiveTransportSequenceNumber, void(int id));
-  MOCK_METHOD2(RegisterSenderCongestionControlObjects,
-               void(RtpTransportControllerSendInterface* transport,
-                    RtcpBandwidthObserver* bandwidth_observer));
-  MOCK_METHOD1(RegisterReceiverCongestionControlObjects,
-               void(PacketRouter* packet_router));
-  MOCK_METHOD0(ResetSenderCongestionControlObjects, void());
-  MOCK_METHOD0(ResetReceiverCongestionControlObjects, void());
-  MOCK_CONST_METHOD0(GetRTCPStatistics, CallStatistics());
-  MOCK_CONST_METHOD0(GetRemoteRTCPReportBlocks, std::vector<ReportBlock>());
-  MOCK_CONST_METHOD0(GetNetworkStatistics, NetworkStatistics());
-  MOCK_CONST_METHOD0(GetDecodingCallStatistics, AudioDecodingCallStats());
-  MOCK_CONST_METHOD0(GetANAStatistics, ANAStats());
-  MOCK_CONST_METHOD0(GetSpeechOutputLevel, int());
-  MOCK_CONST_METHOD0(GetSpeechOutputLevelFullRange, int());
-  MOCK_CONST_METHOD0(GetTotalOutputEnergy, double());
-  MOCK_CONST_METHOD0(GetTotalOutputDuration, double());
-  MOCK_CONST_METHOD0(GetDelayEstimate, uint32_t());
-  MOCK_METHOD2(SetSendTelephoneEventPayloadType, bool(int payload_type,
-                                                      int payload_frequency));
-  MOCK_METHOD2(SendTelephoneEventOutband, bool(int event, int duration_ms));
-  MOCK_METHOD2(SetBitrate, void(int bitrate_bps, int64_t probing_interval_ms));
-  // TODO(solenberg): Talk the compiler into accepting this mock method:
-  // MOCK_METHOD1(SetSink, void(std::unique_ptr<AudioSinkInterface> sink));
-  MOCK_METHOD1(SetInputMute, void(bool muted));
-  MOCK_METHOD1(RegisterExternalTransport, void(Transport* transport));
-  MOCK_METHOD0(DeRegisterExternalTransport, void());
-  MOCK_METHOD1(OnRtpPacket, void(const RtpPacketReceived& packet));
-  MOCK_METHOD2(ReceivedRTCPPacket, bool(const uint8_t* packet, size_t length));
-  MOCK_CONST_METHOD0(GetAudioDecoderFactory,
-                     const rtc::scoped_refptr<AudioDecoderFactory>&());
-  MOCK_METHOD1(SetChannelOutputVolumeScaling, void(float scaling));
-  MOCK_METHOD1(SetRtcEventLog, void(RtcEventLog* event_log));
-  MOCK_METHOD1(SetRtcpRttStats, void(RtcpRttStats* rtcp_rtt_stats));
-  MOCK_METHOD2(GetAudioFrameWithInfo,
-      AudioMixer::Source::AudioFrameInfo(int sample_rate_hz,
-                                         AudioFrame* audio_frame));
-  MOCK_CONST_METHOD0(NeededFrequency, int());
-  MOCK_METHOD1(SetTransportOverhead, void(int transport_overhead_per_packet));
-  MOCK_METHOD1(AssociateSendChannel,
-               void(const ChannelProxy& send_channel_proxy));
-  MOCK_METHOD0(DisassociateSendChannel, void());
-  MOCK_CONST_METHOD2(GetRtpRtcp, void(RtpRtcp** rtp_rtcp,
-                                      RtpReceiver** rtp_receiver));
-  MOCK_CONST_METHOD0(GetPlayoutTimestamp, uint32_t());
-  MOCK_METHOD1(SetMinimumPlayoutDelay, void(int delay_ms));
-  MOCK_CONST_METHOD1(GetRecCodec, bool(CodecInst* codec_inst));
-  MOCK_METHOD1(SetReceiveCodecs,
-               void(const std::map<int, SdpAudioFormat>& codecs));
-  MOCK_METHOD1(OnTwccBasedUplinkPacketLossRate, void(float packet_loss_rate));
-  MOCK_METHOD1(OnRecoverableUplinkPacketLossRate,
-               void(float recoverable_packet_loss_rate));
-  MOCK_CONST_METHOD0(GetSources, std::vector<RtpSource>());
-};
-}  // namespace test
-}  // namespace webrtc
-
-#endif  // WEBRTC_TEST_MOCK_VOE_CHANNEL_PROXY_H_
diff --git a/test/mock_voice_engine.h b/test/mock_voice_engine.h
deleted file mode 100644
index 79443b9..0000000
--- a/test/mock_voice_engine.h
+++ /dev/null
@@ -1,261 +0,0 @@
-/*
- *  Copyright (c) 2015 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_AUDIO_MOCK_VOICE_ENGINE_H_
-#define WEBRTC_AUDIO_MOCK_VOICE_ENGINE_H_
-
-#include <memory>
-
-#include "webrtc/modules/audio_device/include/mock_audio_device.h"
-#include "webrtc/modules/audio_device/include/mock_audio_transport.h"
-#include "webrtc/modules/rtp_rtcp/mocks/mock_rtp_rtcp.h"
-#include "webrtc/test/gmock.h"
-#include "webrtc/test/mock_voe_channel_proxy.h"
-#include "webrtc/voice_engine/voice_engine_impl.h"
-
-namespace webrtc {
-namespace voe {
-class TransmitMixer;
-}  // namespace voe
-
-namespace test {
-
-// NOTE: This class inherits from VoiceEngineImpl so that its clients will be
-// able to get the various interfaces as usual, via T::GetInterface().
-class MockVoiceEngine : public VoiceEngineImpl {
- public:
-  // TODO(nisse): Valid overrides commented out, because the gmock
-  // methods don't use any override declarations, and we want to avoid
-  // warnings from -Winconsistent-missing-override. See
-  // http://crbug.com/428099.
-  MockVoiceEngine(
-      rtc::scoped_refptr<AudioDecoderFactory> decoder_factory = nullptr)
-      : decoder_factory_(decoder_factory) {
-    // Increase ref count so this object isn't automatically deleted whenever
-    // interfaces are Release():d.
-    ++_ref_count;
-    // We add this default behavior to make the mock easier to use in tests. It
-    // will create a NiceMock of a voe::ChannelProxy.
-    // TODO(ossu): As long as AudioReceiveStream is implemented as a wrapper
-    // around Channel, we need to make sure ChannelProxy returns the same
-    // decoder factory as the one passed in when creating an AudioReceiveStream.
-    ON_CALL(*this, ChannelProxyFactory(testing::_))
-        .WillByDefault(testing::Invoke([this](int channel_id) {
-          auto* proxy =
-              new testing::NiceMock<webrtc::test::MockVoEChannelProxy>();
-          EXPECT_CALL(*proxy, GetAudioDecoderFactory())
-              .WillRepeatedly(testing::ReturnRef(decoder_factory_));
-          EXPECT_CALL(*proxy, SetReceiveCodecs(testing::_))
-              .WillRepeatedly(testing::Invoke(
-                  [](const std::map<int, SdpAudioFormat>& codecs) {
-                    EXPECT_THAT(codecs, testing::IsEmpty());
-                  }));
-          EXPECT_CALL(*proxy, GetRtpRtcp(testing::_, testing::_))
-              .WillRepeatedly(
-                  testing::SetArgPointee<0>(GetMockRtpRtcp(channel_id)));
-          return proxy;
-        }));
-
-    ON_CALL(mock_audio_device_, TimeUntilNextProcess())
-        .WillByDefault(testing::Return(1000));
-    ON_CALL(*this, audio_device_module())
-        .WillByDefault(testing::Return(&mock_audio_device_));
-    ON_CALL(*this, audio_transport())
-        .WillByDefault(testing::Return(&mock_audio_transport_));
-  }
-  virtual ~MockVoiceEngine() /* override */ {
-    // Decrease ref count before base class d-tor is called; otherwise it will
-    // trigger an assertion.
-    --_ref_count;
-  }
-
-  // These need to be the same each call to channel_id and must not leak.
-  MockRtpRtcp* GetMockRtpRtcp(int channel_id) {
-    if (mock_rtp_rtcps_.find(channel_id) == mock_rtp_rtcps_.end()) {
-      mock_rtp_rtcps_[channel_id].reset(new ::testing::NiceMock<MockRtpRtcp>);
-    }
-    return mock_rtp_rtcps_[channel_id].get();
-  }
-
-  // Allows injecting a ChannelProxy factory.
-  MOCK_METHOD1(ChannelProxyFactory, voe::ChannelProxy*(int channel_id));
-
-  // VoiceEngineImpl
-  virtual std::unique_ptr<voe::ChannelProxy> GetChannelProxy(
-      int channel_id) /* override */ {
-    return std::unique_ptr<voe::ChannelProxy>(ChannelProxyFactory(channel_id));
-  }
-
-  // VoEBase
-  MOCK_METHOD1(RegisterVoiceEngineObserver, int(VoiceEngineObserver& observer));
-  MOCK_METHOD0(DeRegisterVoiceEngineObserver, int());
-  MOCK_METHOD3(
-      Init,
-      int(AudioDeviceModule* external_adm,
-          AudioProcessing* external_apm,
-          const rtc::scoped_refptr<AudioDecoderFactory>& decoder_factory));
-  MOCK_METHOD0(audio_device_module, AudioDeviceModule*());
-  MOCK_METHOD0(transmit_mixer, voe::TransmitMixer*());
-  MOCK_METHOD0(Terminate, int());
-  MOCK_METHOD0(CreateChannel, int());
-  MOCK_METHOD1(CreateChannel, int(const ChannelConfig& config));
-  MOCK_METHOD1(DeleteChannel, int(int channel));
-  MOCK_METHOD1(StartReceive, int(int channel));
-  MOCK_METHOD1(StopReceive, int(int channel));
-  MOCK_METHOD1(StartPlayout, int(int channel));
-  MOCK_METHOD1(StopPlayout, int(int channel));
-  MOCK_METHOD1(StartSend, int(int channel));
-  MOCK_METHOD1(StopSend, int(int channel));
-  MOCK_METHOD1(GetVersion, int(char version[1024]));
-  MOCK_METHOD0(LastError, int());
-  MOCK_METHOD0(audio_transport, AudioTransport*());
-  MOCK_METHOD2(AssociateSendChannel,
-               int(int channel, int accociate_send_channel));
-
-  // VoECodec
-  MOCK_METHOD0(NumOfCodecs, int());
-  MOCK_METHOD2(GetCodec, int(int index, CodecInst& codec));
-  MOCK_METHOD2(SetSendCodec, int(int channel, const CodecInst& codec));
-  MOCK_METHOD2(GetSendCodec, int(int channel, CodecInst& codec));
-  MOCK_METHOD2(SetBitRate, int(int channel, int bitrate_bps));
-  MOCK_METHOD2(GetRecCodec, int(int channel, CodecInst& codec));
-  MOCK_METHOD2(SetRecPayloadType, int(int channel, const CodecInst& codec));
-  MOCK_METHOD2(GetRecPayloadType, int(int channel, CodecInst& codec));
-  MOCK_METHOD3(SetSendCNPayloadType,
-               int(int channel, int type, PayloadFrequencies frequency));
-  MOCK_METHOD2(SetFECStatus, int(int channel, bool enable));
-  MOCK_METHOD2(GetFECStatus, int(int channel, bool& enabled));
-  MOCK_METHOD4(SetVADStatus,
-               int(int channel, bool enable, VadModes mode, bool disableDTX));
-  MOCK_METHOD4(
-      GetVADStatus,
-      int(int channel, bool& enabled, VadModes& mode, bool& disabledDTX));
-  MOCK_METHOD2(SetOpusMaxPlaybackRate, int(int channel, int frequency_hz));
-  MOCK_METHOD2(SetOpusDtx, int(int channel, bool enable_dtx));
-
-  // VoEFile
-  MOCK_METHOD7(StartPlayingFileLocally,
-               int(int channel,
-                   const char fileNameUTF8[1024],
-                   bool loop,
-                   FileFormats format,
-                   float volumeScaling,
-                   int startPointMs,
-                   int stopPointMs));
-  MOCK_METHOD6(StartPlayingFileLocally,
-               int(int channel,
-                   InStream* stream,
-                   FileFormats format,
-                   float volumeScaling,
-                   int startPointMs,
-                   int stopPointMs));
-  MOCK_METHOD1(StopPlayingFileLocally, int(int channel));
-  MOCK_METHOD1(IsPlayingFileLocally, int(int channel));
-  MOCK_METHOD6(StartPlayingFileAsMicrophone,
-               int(int channel,
-                   const char fileNameUTF8[1024],
-                   bool loop,
-                   bool mixWithMicrophone,
-                   FileFormats format,
-                   float volumeScaling));
-  MOCK_METHOD5(StartPlayingFileAsMicrophone,
-               int(int channel,
-                   InStream* stream,
-                   bool mixWithMicrophone,
-                   FileFormats format,
-                   float volumeScaling));
-  MOCK_METHOD1(StopPlayingFileAsMicrophone, int(int channel));
-  MOCK_METHOD1(IsPlayingFileAsMicrophone, int(int channel));
-  MOCK_METHOD4(StartRecordingPlayout,
-               int(int channel,
-                   const char* fileNameUTF8,
-                   CodecInst* compression,
-                   int maxSizeBytes));
-  MOCK_METHOD1(StopRecordingPlayout, int(int channel));
-  MOCK_METHOD3(StartRecordingPlayout,
-               int(int channel, OutStream* stream, CodecInst* compression));
-  MOCK_METHOD3(StartRecordingMicrophone,
-               int(const char* fileNameUTF8,
-                   CodecInst* compression,
-                   int maxSizeBytes));
-  MOCK_METHOD2(StartRecordingMicrophone,
-               int(OutStream* stream, CodecInst* compression));
-  MOCK_METHOD0(StopRecordingMicrophone, int());
-
-  // VoENetwork
-  MOCK_METHOD2(RegisterExternalTransport,
-               int(int channel, Transport& transport));
-  MOCK_METHOD1(DeRegisterExternalTransport, int(int channel));
-  MOCK_METHOD3(ReceivedRTPPacket,
-               int(int channel, const void* data, size_t length));
-  MOCK_METHOD4(ReceivedRTPPacket,
-               int(int channel,
-                   const void* data,
-                   size_t length,
-                   const PacketTime& packet_time));
-  MOCK_METHOD3(ReceivedRTCPPacket,
-               int(int channel, const void* data, size_t length));
-
-  // VoERTP_RTCP
-  MOCK_METHOD2(SetLocalSSRC, int(int channel, unsigned int ssrc));
-  MOCK_METHOD2(GetLocalSSRC, int(int channel, unsigned int& ssrc));
-  MOCK_METHOD2(GetRemoteSSRC, int(int channel, unsigned int& ssrc));
-  MOCK_METHOD3(SetSendAudioLevelIndicationStatus,
-               int(int channel, bool enable, unsigned char id));
-  MOCK_METHOD3(SetReceiveAudioLevelIndicationStatus,
-               int(int channel, bool enable, unsigned char id));
-  MOCK_METHOD3(SetSendAbsoluteSenderTimeStatus,
-               int(int channel, bool enable, unsigned char id));
-  MOCK_METHOD3(SetReceiveAbsoluteSenderTimeStatus,
-               int(int channel, bool enable, unsigned char id));
-  MOCK_METHOD2(SetRTCPStatus, int(int channel, bool enable));
-  MOCK_METHOD2(GetRTCPStatus, int(int channel, bool& enabled));
-  MOCK_METHOD2(SetRTCP_CNAME, int(int channel, const char cName[256]));
-  MOCK_METHOD2(GetRTCP_CNAME, int(int channel, char cName[256]));
-  MOCK_METHOD2(GetRemoteRTCP_CNAME, int(int channel, char cName[256]));
-  MOCK_METHOD7(GetRemoteRTCPData,
-               int(int channel,
-                   unsigned int& NTPHigh,
-                   unsigned int& NTPLow,
-                   unsigned int& timestamp,
-                   unsigned int& playoutTimestamp,
-                   unsigned int* jitter,
-                   unsigned short* fraction_lost));
-  MOCK_METHOD4(GetRTPStatistics,
-               int(int channel,
-                   unsigned int& averageJitterMs,
-                   unsigned int& maxJitterMs,
-                   unsigned int& discardedPackets));
-  MOCK_METHOD2(GetRTCPStatistics, int(int channel, CallStatistics& stats));
-  MOCK_METHOD2(GetRemoteRTCPReportBlocks,
-               int(int channel, std::vector<ReportBlock>* receive_blocks));
-  MOCK_METHOD3(SetREDStatus, int(int channel, bool enable, int redPayloadtype));
-  MOCK_METHOD3(GetREDStatus,
-               int(int channel, bool& enable, int& redPayloadtype));
-  MOCK_METHOD3(SetNACKStatus, int(int channel, bool enable, int maxNoPackets));
-
- private:
-  // TODO(ossu): I'm not particularly happy about keeping the decoder factory
-  // here, but due to how gmock is implemented, I cannot just keep it in the
-  // functor implementing the default version of ChannelProxyFactory, above.
-  // GMock creates an unfortunate copy of the functor, which would cause us to
-  // return a dangling reference. Fortunately, this should go away once
-  // voe::Channel does.
-  rtc::scoped_refptr<AudioDecoderFactory> decoder_factory_;
-
-  std::map<int, std::unique_ptr<MockRtpRtcp>> mock_rtp_rtcps_;
-
-  MockAudioDeviceModule mock_audio_device_;
-  MockAudioTransport mock_audio_transport_;
-};
-}  // namespace test
-}  // namespace webrtc
-
-#endif  // WEBRTC_AUDIO_MOCK_VOICE_ENGINE_H_
diff --git a/test/null_platform_renderer.cc b/test/null_platform_renderer.cc
deleted file mode 100644
index 362f7db..0000000
--- a/test/null_platform_renderer.cc
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- *  Copyright (c) 2013 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/test/video_renderer.h"
-
-namespace webrtc {
-namespace test {
-
-VideoRenderer* VideoRenderer::CreatePlatformRenderer(const char* window_title,
-                                                     size_t width,
-                                                     size_t height) {
-  return NULL;
-}
-}  // test
-}  // webrtc
diff --git a/test/null_transport.cc b/test/null_transport.cc
deleted file mode 100644
index 7fa36d1..0000000
--- a/test/null_transport.cc
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- *  Copyright (c) 2013 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/test/null_transport.h"
-
-namespace webrtc {
-namespace test {
-
-bool NullTransport::SendRtp(const uint8_t* packet,
-                            size_t length,
-                            const PacketOptions& options) {
-  return true;
-}
-
-bool NullTransport::SendRtcp(const uint8_t* packet, size_t length) {
-  return true;
-}
-
-}  // namespace test
-}  // namespace webrtc
diff --git a/test/null_transport.h b/test/null_transport.h
deleted file mode 100644
index 41c4759..0000000
--- a/test/null_transport.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- *  Copyright (c) 2013 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_TEST_NULL_TRANSPORT_H_
-#define WEBRTC_TEST_NULL_TRANSPORT_H_
-
-#include "webrtc/api/call/transport.h"
-
-namespace webrtc {
-
-class PacketReceiver;
-
-namespace test {
-class NullTransport : public Transport {
- public:
-  bool SendRtp(const uint8_t* packet,
-               size_t length,
-               const PacketOptions& options) override;
-  bool SendRtcp(const uint8_t* packet, size_t length) override;
-};
-}  // namespace test
-}  // namespace webrtc
-
-#endif  // WEBRTC_TEST_NULL_TRANSPORT_H_
diff --git a/test/rtcp_packet_parser.cc b/test/rtcp_packet_parser.cc
deleted file mode 100644
index ad90ce6..0000000
--- a/test/rtcp_packet_parser.cc
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- *  Copyright (c) 2014 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/test/rtcp_packet_parser.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-
-namespace webrtc {
-namespace test {
-
-RtcpPacketParser::RtcpPacketParser() = default;
-RtcpPacketParser::~RtcpPacketParser() = default;
-
-bool RtcpPacketParser::Parse(const void* data, size_t length) {
-  const uint8_t* const buffer = static_cast<const uint8_t*>(data);
-  const uint8_t* const buffer_end = buffer + length;
-  rtcp::CommonHeader header;
-  for (const uint8_t* next_packet = buffer; next_packet != buffer_end;
-       next_packet = header.NextPacket()) {
-    RTC_DCHECK_GT(buffer_end - next_packet, 0);
-    if (!header.Parse(next_packet, buffer_end - next_packet)) {
-      LOG(LS_WARNING)
-          << "Invalid rtcp header or unaligned rtcp packet at position "
-          << (next_packet - buffer);
-      return false;
-    }
-    switch (header.type()) {
-      case rtcp::App::kPacketType:
-        app_.Parse(header);
-        break;
-      case rtcp::Bye::kPacketType:
-        bye_.Parse(header, &sender_ssrc_);
-        break;
-      case rtcp::ExtendedReports::kPacketType:
-        xr_.Parse(header, &sender_ssrc_);
-        break;
-      case rtcp::ExtendedJitterReport::kPacketType:
-        ij_.Parse(header);
-        break;
-      case rtcp::Psfb::kPacketType:
-        switch (header.fmt()) {
-          case rtcp::Fir::kFeedbackMessageType:
-            fir_.Parse(header, &sender_ssrc_);
-            break;
-          case rtcp::Pli::kFeedbackMessageType:
-            pli_.Parse(header, &sender_ssrc_);
-            break;
-          case rtcp::Remb::kFeedbackMessageType:
-            remb_.Parse(header, &sender_ssrc_);
-            break;
-          default:
-            LOG(LS_WARNING) << "Unknown rtcp payload specific feedback type "
-                            << header.fmt();
-            break;
-        }
-        break;
-      case rtcp::ReceiverReport::kPacketType:
-        receiver_report_.Parse(header, &sender_ssrc_);
-        break;
-      case rtcp::Rtpfb::kPacketType:
-        switch (header.fmt()) {
-          case rtcp::Nack::kFeedbackMessageType:
-            nack_.Parse(header, &sender_ssrc_);
-            break;
-          case rtcp::RapidResyncRequest::kFeedbackMessageType:
-            rrr_.Parse(header, &sender_ssrc_);
-            break;
-          case rtcp::Tmmbn::kFeedbackMessageType:
-            tmmbn_.Parse(header, &sender_ssrc_);
-            break;
-          case rtcp::Tmmbr::kFeedbackMessageType:
-            tmmbr_.Parse(header, &sender_ssrc_);
-            break;
-          case rtcp::TransportFeedback::kFeedbackMessageType:
-            transport_feedback_.Parse(header, &sender_ssrc_);
-            break;
-          default:
-            LOG(LS_WARNING) << "Unknown rtcp transport feedback type "
-                            << header.fmt();
-            break;
-        }
-        break;
-      case rtcp::Sdes::kPacketType:
-        sdes_.Parse(header);
-        break;
-      case rtcp::SenderReport::kPacketType:
-        sender_report_.Parse(header, &sender_ssrc_);
-        break;
-      default:
-        LOG(LS_WARNING) << "Unknown rtcp packet type " << header.type();
-        break;
-    }
-  }
-  return true;
-}
-
-}  // namespace test
-}  // namespace webrtc
diff --git a/test/rtcp_packet_parser.h b/test/rtcp_packet_parser.h
deleted file mode 100644
index 997c343..0000000
--- a/test/rtcp_packet_parser.h
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- *  Copyright (c) 2014 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_TEST_RTCP_PACKET_PARSER_H_
-#define WEBRTC_TEST_RTCP_PACKET_PARSER_H_
-
-#include "webrtc/api/array_view.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/app.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/bye.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/common_header.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/extended_jitter_report.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/extended_reports.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/fir.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/nack.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/pli.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/rapid_resync_request.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/receiver_report.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/remb.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/sdes.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/sender_report.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/tmmbn.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/tmmbr.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/transport_feedback.h"
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-namespace test {
-// Parse RTCP packet of given type. Assumes RTCP header is valid and that there
-// is excatly one packet of correct type in the buffer.
-template <typename Packet>
-bool ParseSinglePacket(const uint8_t* buffer, size_t size, Packet* packet) {
-  rtcp::CommonHeader header;
-  RTC_CHECK(header.Parse(buffer, size));
-  RTC_CHECK_EQ(size, header.NextPacket() - buffer);
-  return packet->Parse(header);
-}
-// Same function, but takes raw buffer as single argument instead of pair.
-template <typename Packet>
-bool ParseSinglePacket(rtc::ArrayView<const uint8_t> buffer, Packet* packet) {
-  return ParseSinglePacket(buffer.data(), buffer.size(), packet);
-}
-
-class RtcpPacketParser {
- public:
-  // Keeps last parsed packet, count number of parsed packets of given type.
-  template <typename TypedRtcpPacket>
-  class PacketCounter : public TypedRtcpPacket {
-   public:
-    int num_packets() const { return num_packets_; }
-    void Parse(const rtcp::CommonHeader& header) {
-      if (TypedRtcpPacket::Parse(header))
-        ++num_packets_;
-    }
-    void Parse(const rtcp::CommonHeader& header, uint32_t* sender_ssrc) {
-      if (TypedRtcpPacket::Parse(header)) {
-        ++num_packets_;
-        if (*sender_ssrc == 0)  // Use first sender ssrc in compound packet.
-          *sender_ssrc = TypedRtcpPacket::sender_ssrc();
-      }
-    }
-
-   private:
-    int num_packets_ = 0;
-  };
-
-  RtcpPacketParser();
-  ~RtcpPacketParser();
-
-  bool Parse(const void* packet, size_t packet_len);
-
-  PacketCounter<rtcp::App>* app() { return &app_; }
-  PacketCounter<rtcp::Bye>* bye() { return &bye_; }
-  PacketCounter<rtcp::ExtendedJitterReport>* ij() { return &ij_; }
-  PacketCounter<rtcp::ExtendedReports>* xr() { return &xr_; }
-  PacketCounter<rtcp::Fir>* fir() { return &fir_; }
-  PacketCounter<rtcp::Nack>* nack() { return &nack_; }
-  PacketCounter<rtcp::Pli>* pli() { return &pli_; }
-  PacketCounter<rtcp::RapidResyncRequest>* rrr() { return &rrr_; }
-  PacketCounter<rtcp::ReceiverReport>* receiver_report() {
-    return &receiver_report_;
-  }
-  PacketCounter<rtcp::Remb>* remb() { return &remb_; }
-  PacketCounter<rtcp::Sdes>* sdes() { return &sdes_; }
-  PacketCounter<rtcp::SenderReport>* sender_report() { return &sender_report_; }
-  PacketCounter<rtcp::Tmmbn>* tmmbn() { return &tmmbn_; }
-  PacketCounter<rtcp::Tmmbr>* tmmbr() { return &tmmbr_; }
-  PacketCounter<rtcp::TransportFeedback>* transport_feedback() {
-    return &transport_feedback_;
-  }
-  uint32_t sender_ssrc() const { return sender_ssrc_; }
-
- private:
-  PacketCounter<rtcp::App> app_;
-  PacketCounter<rtcp::Bye> bye_;
-  PacketCounter<rtcp::ExtendedJitterReport> ij_;
-  PacketCounter<rtcp::ExtendedReports> xr_;
-  PacketCounter<rtcp::Fir> fir_;
-  PacketCounter<rtcp::Nack> nack_;
-  PacketCounter<rtcp::Pli> pli_;
-  PacketCounter<rtcp::RapidResyncRequest> rrr_;
-  PacketCounter<rtcp::ReceiverReport> receiver_report_;
-  PacketCounter<rtcp::Remb> remb_;
-  PacketCounter<rtcp::Sdes> sdes_;
-  PacketCounter<rtcp::SenderReport> sender_report_;
-  PacketCounter<rtcp::Tmmbn> tmmbn_;
-  PacketCounter<rtcp::Tmmbr> tmmbr_;
-  PacketCounter<rtcp::TransportFeedback> transport_feedback_;
-  uint32_t sender_ssrc_ = 0;
-};
-
-}  // namespace test
-}  // namespace webrtc
-#endif  // WEBRTC_TEST_RTCP_PACKET_PARSER_H_
diff --git a/test/rtp_file_reader.cc b/test/rtp_file_reader.cc
deleted file mode 100644
index 36ad33a..0000000
--- a/test/rtp_file_reader.cc
+++ /dev/null
@@ -1,667 +0,0 @@
-/*
- *  Copyright (c) 2014 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/test/rtp_file_reader.h"
-
-#include <stdio.h>
-
-#include <map>
-#include <string>
-#include <vector>
-
-#include "webrtc/modules/rtp_rtcp/source/rtp_utility.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/format_macros.h"
-#include "webrtc/rtc_base/logging.h"
-
-namespace webrtc {
-namespace test {
-
-static const size_t kFirstLineLength = 40;
-static uint16_t kPacketHeaderSize = 8;
-
-#define TRY(expr)                                      \
-  do {                                                 \
-    if (!(expr)) {                                     \
-      LOG(LS_INFO) << "Failed to read";                \
-      return false;                                    \
-    }                                                  \
-  } while (0)
-
-bool ReadUint32(uint32_t* out, FILE* file) {
-  *out = 0;
-  for (size_t i = 0; i < 4; ++i) {
-    *out <<= 8;
-    uint8_t tmp;
-    if (fread(&tmp, 1, sizeof(uint8_t), file) != sizeof(uint8_t))
-      return false;
-    *out |= tmp;
-  }
-  return true;
-}
-
-bool ReadUint16(uint16_t* out, FILE* file) {
-  *out = 0;
-  for (size_t i = 0; i < 2; ++i) {
-    *out <<= 8;
-    uint8_t tmp;
-    if (fread(&tmp, 1, sizeof(uint8_t), file) != sizeof(uint8_t))
-      return false;
-    *out |= tmp;
-  }
-  return true;
-}
-
-class RtpFileReaderImpl : public RtpFileReader {
- public:
-  virtual bool Init(const std::string& filename,
-                    const std::set<uint32_t>& ssrc_filter) = 0;
-};
-
-class InterleavedRtpFileReader : public RtpFileReaderImpl {
- public:
-  virtual ~InterleavedRtpFileReader() {
-    if (file_ != NULL) {
-      fclose(file_);
-      file_ = NULL;
-    }
-  }
-
-  virtual bool Init(const std::string& filename,
-                    const std::set<uint32_t>& ssrc_filter) {
-    file_ = fopen(filename.c_str(), "rb");
-    if (file_ == NULL) {
-      printf("ERROR: Can't open file: %s\n", filename.c_str());
-      return false;
-    }
-    return true;
-  }
-  virtual bool NextPacket(RtpPacket* packet) {
-    assert(file_ != NULL);
-    packet->length = RtpPacket::kMaxPacketBufferSize;
-    uint32_t len = 0;
-    TRY(ReadUint32(&len, file_));
-    if (packet->length < len) {
-      FATAL() << "Packet is too large to fit: " << len << " bytes vs "
-              << packet->length
-              << " bytes allocated. Consider increasing the buffer "
-                 "size";
-    }
-    if (fread(packet->data, 1, len, file_) != len)
-      return false;
-
-    packet->length = len;
-    packet->original_length = len;
-    packet->time_ms = time_ms_;
-    time_ms_ += 5;
-    return true;
-  }
-
- private:
-  FILE* file_ = NULL;
-  int64_t time_ms_ = 0;
-};
-
-// Read RTP packets from file in rtpdump format, as documented at:
-// http://www.cs.columbia.edu/irt/software/rtptools/
-class RtpDumpReader : public RtpFileReaderImpl {
- public:
-  RtpDumpReader() : file_(NULL) {}
-  virtual ~RtpDumpReader() {
-    if (file_ != NULL) {
-      fclose(file_);
-      file_ = NULL;
-    }
-  }
-
-  bool Init(const std::string& filename,
-            const std::set<uint32_t>& ssrc_filter) override {
-    file_ = fopen(filename.c_str(), "rb");
-    if (file_ == NULL) {
-      printf("ERROR: Can't open file: %s\n", filename.c_str());
-      return false;
-    }
-
-    char firstline[kFirstLineLength + 1] = {0};
-    if (fgets(firstline, kFirstLineLength, file_) == NULL) {
-      LOG(LS_INFO) << "Can't read from file";
-      return false;
-    }
-    if (strncmp(firstline, "#!rtpplay", 9) == 0) {
-      if (strncmp(firstline, "#!rtpplay1.0", 12) != 0) {
-        LOG(LS_INFO) <<  "Wrong rtpplay version, must be 1.0";
-        return false;
-      }
-    } else if (strncmp(firstline, "#!RTPencode", 11) == 0) {
-      if (strncmp(firstline, "#!RTPencode1.0", 14) != 0) {
-        LOG(LS_INFO) << "Wrong RTPencode version, must be 1.0";
-        return false;
-      }
-    } else {
-      LOG(LS_INFO) << "Wrong file format of input file";
-      return false;
-    }
-
-    uint32_t start_sec;
-    uint32_t start_usec;
-    uint32_t source;
-    uint16_t port;
-    uint16_t padding;
-    TRY(ReadUint32(&start_sec, file_));
-    TRY(ReadUint32(&start_usec, file_));
-    TRY(ReadUint32(&source, file_));
-    TRY(ReadUint16(&port, file_));
-    TRY(ReadUint16(&padding, file_));
-
-    return true;
-  }
-
-  bool NextPacket(RtpPacket* packet) override {
-    uint8_t* rtp_data = packet->data;
-    packet->length = RtpPacket::kMaxPacketBufferSize;
-
-    uint16_t len;
-    uint16_t plen;
-    uint32_t offset;
-    TRY(ReadUint16(&len, file_));
-    TRY(ReadUint16(&plen, file_));
-    TRY(ReadUint32(&offset, file_));
-
-    // Use 'len' here because a 'plen' of 0 specifies rtcp.
-    len -= kPacketHeaderSize;
-    if (packet->length < len) {
-      FATAL() << "Packet is too large to fit: " << len << " bytes vs "
-              << packet->length
-              << " bytes allocated. Consider increasing the buffer "
-                 "size";
-    }
-    if (fread(rtp_data, 1, len, file_) != len) {
-      return false;
-    }
-
-    packet->length = len;
-    packet->original_length = plen;
-    packet->time_ms = offset;
-    return true;
-  }
-
- private:
-  FILE* file_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(RtpDumpReader);
-};
-
-enum {
-  kResultFail = -1,
-  kResultSuccess = 0,
-  kResultSkip = 1,
-
-  kPcapVersionMajor = 2,
-  kPcapVersionMinor = 4,
-  kLinktypeNull = 0,
-  kLinktypeEthernet = 1,
-  kBsdNullLoopback1 = 0x00000002,
-  kBsdNullLoopback2 = 0x02000000,
-  kEthernetIIHeaderMacSkip = 12,
-  kEthertypeIp = 0x0800,
-  kIpVersion4 = 4,
-  kMinIpHeaderLength = 20,
-  kFragmentOffsetClear = 0x0000,
-  kFragmentOffsetDoNotFragment = 0x4000,
-  kProtocolTcp = 0x06,
-  kProtocolUdp = 0x11,
-  kUdpHeaderLength = 8,
-  kMaxReadBufferSize = 4096
-};
-
-const uint32_t kPcapBOMSwapOrder = 0xd4c3b2a1UL;
-const uint32_t kPcapBOMNoSwapOrder = 0xa1b2c3d4UL;
-
-#define TRY_PCAP(expr)                                 \
-  do {                                                 \
-    int r = (expr);                                    \
-    if (r == kResultFail) {                            \
-      LOG(LS_INFO) << "FAIL at " << __FILE__  << ":" << __LINE__; \
-      return kResultFail;                              \
-    } else if (r == kResultSkip) {                     \
-      return kResultSkip;                              \
-    }                                                  \
-  } while (0)
-
-// Read RTP packets from file in tcpdump/libpcap format, as documented at:
-// http://wiki.wireshark.org/Development/LibpcapFileFormat
-class PcapReader : public RtpFileReaderImpl {
- public:
-  PcapReader()
-    : file_(NULL),
-      swap_pcap_byte_order_(false),
-#ifdef WEBRTC_ARCH_BIG_ENDIAN
-      swap_network_byte_order_(false),
-#else
-      swap_network_byte_order_(true),
-#endif
-      read_buffer_(),
-      packets_by_ssrc_(),
-      packets_(),
-      next_packet_it_() {
-  }
-
-  virtual ~PcapReader() {
-    if (file_ != NULL) {
-      fclose(file_);
-      file_ = NULL;
-    }
-  }
-
-  bool Init(const std::string& filename,
-            const std::set<uint32_t>& ssrc_filter) override {
-    return Initialize(filename, ssrc_filter) == kResultSuccess;
-  }
-
-  int Initialize(const std::string& filename,
-                 const std::set<uint32_t>& ssrc_filter) {
-    file_ = fopen(filename.c_str(), "rb");
-    if (file_ == NULL) {
-      printf("ERROR: Can't open file: %s\n", filename.c_str());
-      return kResultFail;
-    }
-
-    if (ReadGlobalHeader() < 0) {
-      return kResultFail;
-    }
-
-    int total_packet_count = 0;
-    uint32_t stream_start_ms = 0;
-    int32_t next_packet_pos = ftell(file_);
-    for (;;) {
-      TRY_PCAP(fseek(file_, next_packet_pos, SEEK_SET));
-      int result = ReadPacket(&next_packet_pos, stream_start_ms,
-                              ++total_packet_count, ssrc_filter);
-      if (result == kResultFail) {
-        break;
-      } else if (result == kResultSuccess && packets_.size() == 1) {
-        assert(stream_start_ms == 0);
-        PacketIterator it = packets_.begin();
-        stream_start_ms = it->time_offset_ms;
-        it->time_offset_ms = 0;
-      }
-    }
-
-    if (feof(file_) == 0) {
-      printf("Failed reading file!\n");
-      return kResultFail;
-    }
-
-    printf("Total packets in file: %d\n", total_packet_count);
-    printf("Total RTP/RTCP packets: %" PRIuS "\n", packets_.size());
-
-    for (SsrcMapIterator mit = packets_by_ssrc_.begin();
-        mit != packets_by_ssrc_.end(); ++mit) {
-      uint32_t ssrc = mit->first;
-      const std::vector<uint32_t>& packet_indices = mit->second;
-      uint8_t pt = packets_[packet_indices[0]].rtp_header.payloadType;
-      printf("SSRC: %08x, %" PRIuS " packets, pt=%d\n", ssrc,
-             packet_indices.size(), pt);
-    }
-
-    // TODO(solenberg): Better validation of identified SSRC streams.
-    //
-    // Since we're dealing with raw network data here, we will wrongly identify
-    // some packets as RTP. When these packets are consumed by RtpPlayer, they
-    // are unlikely to cause issues as they will ultimately be filtered out by
-    // the RtpRtcp module. However, we should really do better filtering here,
-    // which we can accomplish in a number of ways, e.g.:
-    //
-    // - Verify that the time stamps and sequence numbers for RTP packets are
-    //   both increasing/decreasing. If they move in different directions, the
-    //   SSRC is likely bogus and can be dropped. (Normally they should be inc-
-    //   reasing but we must allow packet reordering).
-    // - If RTP sequence number is not changing, drop the stream.
-    // - Can also use srcip:port->dstip:port pairs, assuming few SSRC collisions
-    //   for up/down streams.
-
-    next_packet_it_ = packets_.begin();
-    return kResultSuccess;
-  }
-
-  bool NextPacket(RtpPacket* packet) override {
-    uint32_t length = RtpPacket::kMaxPacketBufferSize;
-    if (NextPcap(packet->data, &length, &packet->time_ms) != kResultSuccess)
-      return false;
-    packet->length = static_cast<size_t>(length);
-    packet->original_length = packet->length;
-    return true;
-  }
-
-  virtual int NextPcap(uint8_t* data, uint32_t* length, uint32_t* time_ms) {
-    assert(data);
-    assert(length);
-    assert(time_ms);
-
-    if (next_packet_it_ == packets_.end()) {
-      return -1;
-    }
-    if (*length < next_packet_it_->payload_length) {
-      return -1;
-    }
-    TRY_PCAP(fseek(file_, next_packet_it_->pos_in_file, SEEK_SET));
-    TRY_PCAP(Read(data, next_packet_it_->payload_length));
-    *length = next_packet_it_->payload_length;
-    *time_ms = next_packet_it_->time_offset_ms;
-    next_packet_it_++;
-
-    return 0;
-  }
-
- private:
-  // A marker of an RTP packet within the file.
-  struct RtpPacketMarker {
-    uint32_t packet_number;   // One-based index (like in WireShark)
-    uint32_t time_offset_ms;
-    uint32_t source_ip;
-    uint32_t dest_ip;
-    uint16_t source_port;
-    uint16_t dest_port;
-    RTPHeader rtp_header;
-    int32_t pos_in_file;      // Byte offset of payload from start of file.
-    uint32_t payload_length;
-  };
-
-  typedef std::vector<RtpPacketMarker>::iterator PacketIterator;
-  typedef std::map<uint32_t, std::vector<uint32_t> > SsrcMap;
-  typedef std::map<uint32_t, std::vector<uint32_t> >::iterator SsrcMapIterator;
-
-  int ReadGlobalHeader() {
-    uint32_t magic;
-    TRY_PCAP(Read(&magic, false));
-    if (magic == kPcapBOMSwapOrder) {
-      swap_pcap_byte_order_ = true;
-    } else if (magic == kPcapBOMNoSwapOrder) {
-      swap_pcap_byte_order_ = false;
-    } else {
-      return kResultFail;
-    }
-
-    uint16_t version_major;
-    uint16_t version_minor;
-    TRY_PCAP(Read(&version_major, false));
-    TRY_PCAP(Read(&version_minor, false));
-    if (version_major != kPcapVersionMajor ||
-        version_minor != kPcapVersionMinor) {
-      return kResultFail;
-    }
-
-    int32_t this_zone;  // GMT to local correction.
-    uint32_t sigfigs;   // Accuracy of timestamps.
-    uint32_t snaplen;   // Max length of captured packets, in octets.
-    uint32_t network;   // Data link type.
-    TRY_PCAP(Read(&this_zone, false));
-    TRY_PCAP(Read(&sigfigs, false));
-    TRY_PCAP(Read(&snaplen, false));
-    TRY_PCAP(Read(&network, false));
-
-    // Accept only LINKTYPE_NULL and LINKTYPE_ETHERNET.
-    // See: http://www.tcpdump.org/linktypes.html
-    if (network != kLinktypeNull && network != kLinktypeEthernet) {
-      return kResultFail;
-    }
-
-    return kResultSuccess;
-  }
-
-  int ReadPacket(int32_t* next_packet_pos,
-                 uint32_t stream_start_ms,
-                 uint32_t number,
-                 const std::set<uint32_t>& ssrc_filter) {
-    assert(next_packet_pos);
-
-    uint32_t ts_sec;    // Timestamp seconds.
-    uint32_t ts_usec;   // Timestamp microseconds.
-    uint32_t incl_len;  // Number of octets of packet saved in file.
-    uint32_t orig_len;  // Actual length of packet.
-    TRY_PCAP(Read(&ts_sec, false));
-    TRY_PCAP(Read(&ts_usec, false));
-    TRY_PCAP(Read(&incl_len, false));
-    TRY_PCAP(Read(&orig_len, false));
-
-    *next_packet_pos = ftell(file_) + incl_len;
-
-    RtpPacketMarker marker = {0};
-    marker.packet_number = number;
-    marker.time_offset_ms = CalcTimeDelta(ts_sec, ts_usec, stream_start_ms);
-    TRY_PCAP(ReadPacketHeader(&marker));
-    marker.pos_in_file = ftell(file_);
-
-    if (marker.payload_length > sizeof(read_buffer_)) {
-      printf("Packet too large!\n");
-      return kResultFail;
-    }
-    TRY_PCAP(Read(read_buffer_, marker.payload_length));
-
-    RtpUtility::RtpHeaderParser rtp_parser(read_buffer_, marker.payload_length);
-    if (rtp_parser.RTCP()) {
-      rtp_parser.ParseRtcp(&marker.rtp_header);
-      packets_.push_back(marker);
-    } else {
-      if (!rtp_parser.Parse(&marker.rtp_header, nullptr)) {
-        LOG(LS_INFO) << "Not recognized as RTP/RTCP";
-        return kResultSkip;
-      }
-
-      uint32_t ssrc = marker.rtp_header.ssrc;
-      if (ssrc_filter.empty() || ssrc_filter.find(ssrc) != ssrc_filter.end()) {
-        packets_by_ssrc_[ssrc].push_back(
-            static_cast<uint32_t>(packets_.size()));
-        packets_.push_back(marker);
-      } else {
-        return kResultSkip;
-      }
-    }
-
-    return kResultSuccess;
-  }
-
-  int ReadPacketHeader(RtpPacketMarker* marker) {
-    int32_t file_pos = ftell(file_);
-
-    // Check for BSD null/loopback frame header. The header is just 4 bytes in
-    // native byte order, so we check for both versions as we don't care about
-    // the header as such and will likely fail reading the IP header if this is
-    // something else than null/loopback.
-    uint32_t protocol;
-    TRY_PCAP(Read(&protocol, true));
-    if (protocol == kBsdNullLoopback1 || protocol == kBsdNullLoopback2) {
-      int result = ReadXxpIpHeader(marker);
-      LOG(LS_INFO) << "Recognized loopback frame";
-      if (result != kResultSkip) {
-        return result;
-      }
-    }
-
-    TRY_PCAP(fseek(file_, file_pos, SEEK_SET));
-
-    // Check for Ethernet II, IP frame header.
-    uint16_t type;
-    TRY_PCAP(Skip(kEthernetIIHeaderMacSkip));  // Source+destination MAC.
-    TRY_PCAP(Read(&type, true));
-    if (type == kEthertypeIp) {
-      int result = ReadXxpIpHeader(marker);
-      LOG(LS_INFO) << "Recognized ethernet 2 frame";
-      if (result != kResultSkip) {
-        return result;
-      }
-    }
-
-    return kResultSkip;
-  }
-
-  uint32_t CalcTimeDelta(uint32_t ts_sec, uint32_t ts_usec, uint32_t start_ms) {
-    // Round to nearest ms.
-    uint64_t t2_ms = ((static_cast<uint64_t>(ts_sec) * 1000000) + ts_usec +
-        500) / 1000;
-    uint64_t t1_ms = static_cast<uint64_t>(start_ms);
-    if (t2_ms < t1_ms) {
-      return 0;
-    } else {
-      return t2_ms - t1_ms;
-    }
-  }
-
-  int ReadXxpIpHeader(RtpPacketMarker* marker) {
-    assert(marker);
-
-    uint16_t version;
-    uint16_t length;
-    uint16_t id;
-    uint16_t fragment;
-    uint16_t protocol;
-    uint16_t checksum;
-    TRY_PCAP(Read(&version, true));
-    TRY_PCAP(Read(&length, true));
-    TRY_PCAP(Read(&id, true));
-    TRY_PCAP(Read(&fragment, true));
-    TRY_PCAP(Read(&protocol, true));
-    TRY_PCAP(Read(&checksum, true));
-    TRY_PCAP(Read(&marker->source_ip, true));
-    TRY_PCAP(Read(&marker->dest_ip, true));
-
-    if (((version >> 12) & 0x000f) != kIpVersion4) {
-      LOG(LS_INFO) << "IP header is not IPv4";
-      return kResultSkip;
-    }
-
-    if (fragment != kFragmentOffsetClear &&
-        fragment != kFragmentOffsetDoNotFragment) {
-      LOG(LS_INFO) << "IP fragments cannot be handled";
-      return kResultSkip;
-    }
-
-    // Skip remaining fields of IP header.
-    uint16_t header_length = (version & 0x0f00) >> (8 - 2);
-    assert(header_length >= kMinIpHeaderLength);
-    TRY_PCAP(Skip(header_length - kMinIpHeaderLength));
-
-    protocol = protocol & 0x00ff;
-    if (protocol == kProtocolTcp) {
-      LOG(LS_INFO) << "TCP packets are not handled";
-      return kResultSkip;
-    } else if (protocol == kProtocolUdp) {
-      uint16_t length;
-      uint16_t checksum;
-      TRY_PCAP(Read(&marker->source_port, true));
-      TRY_PCAP(Read(&marker->dest_port, true));
-      TRY_PCAP(Read(&length, true));
-      TRY_PCAP(Read(&checksum, true));
-      marker->payload_length = length - kUdpHeaderLength;
-    } else {
-      LOG(LS_INFO) << "Unknown transport (expected UDP or TCP)";
-      return kResultSkip;
-    }
-
-    return kResultSuccess;
-  }
-
-  int Read(uint32_t* out, bool expect_network_order) {
-    uint32_t tmp = 0;
-    if (fread(&tmp, 1, sizeof(uint32_t), file_) != sizeof(uint32_t)) {
-      return kResultFail;
-    }
-    if ((!expect_network_order && swap_pcap_byte_order_) ||
-        (expect_network_order && swap_network_byte_order_)) {
-      tmp = ((tmp >> 24) & 0x000000ff) | (tmp << 24) |
-          ((tmp >> 8) & 0x0000ff00) | ((tmp << 8) & 0x00ff0000);
-    }
-    *out = tmp;
-    return kResultSuccess;
-  }
-
-  int Read(uint16_t* out, bool expect_network_order) {
-    uint16_t tmp = 0;
-    if (fread(&tmp, 1, sizeof(uint16_t), file_) != sizeof(uint16_t)) {
-      return kResultFail;
-    }
-    if ((!expect_network_order && swap_pcap_byte_order_) ||
-        (expect_network_order && swap_network_byte_order_)) {
-      tmp = ((tmp >> 8) & 0x00ff) | (tmp << 8);
-    }
-    *out = tmp;
-    return kResultSuccess;
-  }
-
-  int Read(uint8_t* out, uint32_t count) {
-    if (fread(out, 1, count, file_) != count) {
-      return kResultFail;
-    }
-    return kResultSuccess;
-  }
-
-  int Read(int32_t* out, bool expect_network_order) {
-    int32_t tmp = 0;
-    if (fread(&tmp, 1, sizeof(uint32_t), file_) != sizeof(uint32_t)) {
-      return kResultFail;
-    }
-    if ((!expect_network_order && swap_pcap_byte_order_) ||
-        (expect_network_order && swap_network_byte_order_)) {
-      tmp = ((tmp >> 24) & 0x000000ff) | (tmp << 24) |
-          ((tmp >> 8) & 0x0000ff00) | ((tmp << 8) & 0x00ff0000);
-    }
-    *out = tmp;
-    return kResultSuccess;
-  }
-
-  int Skip(uint32_t length) {
-    if (fseek(file_, length, SEEK_CUR) != 0) {
-      return kResultFail;
-    }
-    return kResultSuccess;
-  }
-
-  FILE* file_;
-  bool swap_pcap_byte_order_;
-  const bool swap_network_byte_order_;
-  uint8_t read_buffer_[kMaxReadBufferSize];
-
-  SsrcMap packets_by_ssrc_;
-  std::vector<RtpPacketMarker> packets_;
-  PacketIterator next_packet_it_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(PcapReader);
-};
-
-RtpFileReader* RtpFileReader::Create(FileFormat format,
-                                     const std::string& filename,
-                                     const std::set<uint32_t>& ssrc_filter) {
-  RtpFileReaderImpl* reader = NULL;
-  switch (format) {
-    case kPcap:
-      reader = new PcapReader();
-      break;
-    case kRtpDump:
-      reader = new RtpDumpReader();
-      break;
-    case kLengthPacketInterleaved:
-      reader = new InterleavedRtpFileReader();
-      break;
-  }
-  if (!reader->Init(filename, ssrc_filter)) {
-    delete reader;
-    return NULL;
-  }
-  return reader;
-}
-
-RtpFileReader* RtpFileReader::Create(FileFormat format,
-                                     const std::string& filename) {
-  return RtpFileReader::Create(format, filename, std::set<uint32_t>());
-}
-
-}  // namespace test
-}  // namespace webrtc
diff --git a/test/rtp_file_reader.h b/test/rtp_file_reader.h
deleted file mode 100644
index c132d31..0000000
--- a/test/rtp_file_reader.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- *  Copyright (c) 2014 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_TEST_RTP_FILE_READER_H_
-#define WEBRTC_TEST_RTP_FILE_READER_H_
-
-#include <set>
-#include <string>
-
-#include "webrtc/common_types.h"
-
-namespace webrtc {
-namespace test {
-
-struct RtpPacket {
-  // Accommodate for 50 ms packets of 32 kHz PCM16 samples (3200 bytes) plus
-  // some overhead.
-  static const size_t kMaxPacketBufferSize = 3500;
-  uint8_t data[kMaxPacketBufferSize];
-  size_t length;
-  // The length the packet had on wire. Will be different from |length| when
-  // reading a header-only RTP dump.
-  size_t original_length;
-
-  uint32_t time_ms;
-};
-
-class RtpFileReader {
- public:
-  enum FileFormat { kPcap, kRtpDump, kLengthPacketInterleaved };
-
-  virtual ~RtpFileReader() {}
-  static RtpFileReader* Create(FileFormat format,
-                               const std::string& filename);
-  static RtpFileReader* Create(FileFormat format,
-                               const std::string& filename,
-                               const std::set<uint32_t>& ssrc_filter);
-
-  virtual bool NextPacket(RtpPacket* packet) = 0;
-};
-}  // namespace test
-}  // namespace webrtc
-#endif  // WEBRTC_TEST_RTP_FILE_READER_H_
diff --git a/test/rtp_file_reader_unittest.cc b/test/rtp_file_reader_unittest.cc
deleted file mode 100644
index a9cd098..0000000
--- a/test/rtp_file_reader_unittest.cc
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
- *  Copyright (c) 2013 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 <map>
-#include <memory>
-
-#include "webrtc/modules/rtp_rtcp/source/rtp_utility.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/rtp_file_reader.h"
-#include "webrtc/test/testsupport/fileutils.h"
-
-namespace webrtc {
-
-class TestRtpFileReader : public ::testing::Test {
- public:
-  void Init(const std::string& filename, bool headers_only_file) {
-    std::string filepath =
-        test::ResourcePath("video_coding/" + filename, "rtp");
-    rtp_packet_source_.reset(
-        test::RtpFileReader::Create(test::RtpFileReader::kRtpDump, filepath));
-    ASSERT_TRUE(rtp_packet_source_.get() != NULL);
-    headers_only_file_ = headers_only_file;
-  }
-
-  int CountRtpPackets() {
-    test::RtpPacket packet;
-    int c = 0;
-    while (rtp_packet_source_->NextPacket(&packet)) {
-      if (headers_only_file_)
-        EXPECT_LT(packet.length, packet.original_length);
-      else
-        EXPECT_EQ(packet.length, packet.original_length);
-      c++;
-    }
-    return c;
-  }
-
- private:
-  std::unique_ptr<test::RtpFileReader> rtp_packet_source_;
-  bool headers_only_file_;
-};
-
-TEST_F(TestRtpFileReader, Test60Packets) {
-  Init("pltype103", false);
-  EXPECT_EQ(60, CountRtpPackets());
-}
-
-TEST_F(TestRtpFileReader, Test60PacketsHeaderOnly) {
-  Init("pltype103_header_only", true);
-  EXPECT_EQ(60, CountRtpPackets());
-}
-
-typedef std::map<uint32_t, int> PacketsPerSsrc;
-
-class TestPcapFileReader : public ::testing::Test {
- public:
-  void Init(const std::string& filename) {
-    std::string filepath =
-        test::ResourcePath("video_coding/" + filename, "pcap");
-    rtp_packet_source_.reset(
-        test::RtpFileReader::Create(test::RtpFileReader::kPcap, filepath));
-    ASSERT_TRUE(rtp_packet_source_.get() != NULL);
-  }
-
-  int CountRtpPackets() {
-    int c = 0;
-    test::RtpPacket packet;
-    while (rtp_packet_source_->NextPacket(&packet)) {
-      EXPECT_EQ(packet.length, packet.original_length);
-      c++;
-    }
-    return c;
-  }
-
-  PacketsPerSsrc CountRtpPacketsPerSsrc() {
-    PacketsPerSsrc pps;
-    test::RtpPacket packet;
-    while (rtp_packet_source_->NextPacket(&packet)) {
-      RtpUtility::RtpHeaderParser rtp_header_parser(packet.data, packet.length);
-      webrtc::RTPHeader header;
-      if (!rtp_header_parser.RTCP() &&
-          rtp_header_parser.Parse(&header, nullptr)) {
-        pps[header.ssrc]++;
-      }
-    }
-    return pps;
-  }
-
- private:
-  std::unique_ptr<test::RtpFileReader> rtp_packet_source_;
-};
-
-TEST_F(TestPcapFileReader, TestEthernetIIFrame) {
-  Init("frame-ethernet-ii");
-  EXPECT_EQ(368, CountRtpPackets());
-}
-
-TEST_F(TestPcapFileReader, TestLoopbackFrame) {
-  Init("frame-loopback");
-  EXPECT_EQ(491, CountRtpPackets());
-}
-
-TEST_F(TestPcapFileReader, TestTwoSsrc) {
-  Init("ssrcs-2");
-  PacketsPerSsrc pps = CountRtpPacketsPerSsrc();
-  EXPECT_EQ(2UL, pps.size());
-  EXPECT_EQ(370, pps[0x78d48f61]);
-  EXPECT_EQ(60, pps[0xae94130b]);
-}
-
-TEST_F(TestPcapFileReader, TestThreeSsrc) {
-  Init("ssrcs-3");
-  PacketsPerSsrc pps = CountRtpPacketsPerSsrc();
-  EXPECT_EQ(3UL, pps.size());
-  EXPECT_EQ(162, pps[0x938c5eaa]);
-  EXPECT_EQ(113, pps[0x59fe6ef0]);
-  EXPECT_EQ(61, pps[0xed2bd2ac]);
-}
-}  // namespace webrtc
diff --git a/test/rtp_file_writer.cc b/test/rtp_file_writer.cc
deleted file mode 100644
index 596c234..0000000
--- a/test/rtp_file_writer.cc
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- *  Copyright (c) 2014 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/test/rtp_file_writer.h"
-
-#include <stdio.h>
-
-#include <string>
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace webrtc {
-namespace test {
-
-static const uint16_t kPacketHeaderSize = 8;
-static const char kFirstLine[] = "#!rtpplay1.0 0.0.0.0/0\n";
-
-// Write RTP packets to file in rtpdump format, as documented at:
-// http://www.cs.columbia.edu/irt/software/rtptools/
-class RtpDumpWriter : public RtpFileWriter {
- public:
-  explicit RtpDumpWriter(FILE* file) : file_(file) {
-    RTC_CHECK(file_ != NULL);
-    Init();
-  }
-  virtual ~RtpDumpWriter() {
-    if (file_ != NULL) {
-      fclose(file_);
-      file_ = NULL;
-    }
-  }
-
-  bool WritePacket(const RtpPacket* packet) override {
-    uint16_t len = static_cast<uint16_t>(packet->length + kPacketHeaderSize);
-    uint16_t plen = static_cast<uint16_t>(packet->original_length);
-    uint32_t offset = packet->time_ms;
-    RTC_CHECK(WriteUint16(len));
-    RTC_CHECK(WriteUint16(plen));
-    RTC_CHECK(WriteUint32(offset));
-    return fwrite(packet->data, sizeof(uint8_t), packet->length, file_) ==
-           packet->length;
-  }
-
- private:
-  bool Init() {
-    fprintf(file_, "%s", kFirstLine);
-
-    RTC_CHECK(WriteUint32(0));
-    RTC_CHECK(WriteUint32(0));
-    RTC_CHECK(WriteUint32(0));
-    RTC_CHECK(WriteUint16(0));
-    RTC_CHECK(WriteUint16(0));
-
-    return true;
-  }
-
-  bool WriteUint32(uint32_t in) {
-    // Loop through shifts = {24, 16, 8, 0}.
-    for (int shifts = 24; shifts >= 0; shifts -= 8) {
-      uint8_t tmp = static_cast<uint8_t>((in >> shifts) & 0xFF);
-      if (fwrite(&tmp, sizeof(uint8_t), 1, file_) != 1)
-        return false;
-    }
-    return true;
-  }
-
-  bool WriteUint16(uint16_t in) {
-    // Write 8 MSBs.
-    uint8_t tmp = static_cast<uint8_t>((in >> 8) & 0xFF);
-    if (fwrite(&tmp, sizeof(uint8_t), 1, file_) != 1)
-      return false;
-    // Write 8 LSBs.
-    tmp = static_cast<uint8_t>(in & 0xFF);
-    if (fwrite(&tmp, sizeof(uint8_t), 1, file_) != 1)
-      return false;
-    return true;
-  }
-
-  FILE* file_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(RtpDumpWriter);
-};
-
-RtpFileWriter* RtpFileWriter::Create(FileFormat format,
-                                     const std::string& filename) {
-  FILE* file = fopen(filename.c_str(), "wb");
-  if (file == NULL) {
-    printf("ERROR: Can't open file: %s\n", filename.c_str());
-    return NULL;
-  }
-  switch (format) {
-    case kRtpDump:
-      return new RtpDumpWriter(file);
-  }
-  fclose(file);
-  return NULL;
-}
-
-}  // namespace test
-}  // namespace webrtc
diff --git a/test/rtp_file_writer.h b/test/rtp_file_writer.h
deleted file mode 100644
index 453b2776..0000000
--- a/test/rtp_file_writer.h
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- *  Copyright (c) 2014 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_TEST_RTP_FILE_WRITER_H_
-#define WEBRTC_TEST_RTP_FILE_WRITER_H_
-
-#include <string>
-
-#include "webrtc/common_types.h"
-#include "webrtc/test/rtp_file_reader.h"
-
-namespace webrtc {
-namespace test {
-class RtpFileWriter {
- public:
-  enum FileFormat {
-    kRtpDump,
-  };
-
-  virtual ~RtpFileWriter() {}
-  static RtpFileWriter* Create(FileFormat format, const std::string& filename);
-
-  virtual bool WritePacket(const RtpPacket* packet) = 0;
-};
-}  // namespace test
-}  // namespace webrtc
-#endif  // WEBRTC_TEST_RTP_FILE_WRITER_H_
diff --git a/test/rtp_file_writer_unittest.cc b/test/rtp_file_writer_unittest.cc
deleted file mode 100644
index fa7d79d..0000000
--- a/test/rtp_file_writer_unittest.cc
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- *  Copyright (c) 2014 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 <string.h>
-
-#include <memory>
-
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/rtp_file_reader.h"
-#include "webrtc/test/rtp_file_writer.h"
-#include "webrtc/test/testsupport/fileutils.h"
-
-namespace webrtc {
-
-class RtpFileWriterTest : public ::testing::Test {
- public:
-  void Init(const std::string& filename) {
-    filename_ = test::OutputPath() + filename;
-    rtp_writer_.reset(
-        test::RtpFileWriter::Create(test::RtpFileWriter::kRtpDump, filename_));
-  }
-
-  void WriteRtpPackets(int num_packets) {
-    ASSERT_TRUE(rtp_writer_.get() != NULL);
-    test::RtpPacket packet;
-    for (int i = 1; i <= num_packets; ++i) {
-      packet.length = i;
-      packet.original_length = i;
-      packet.time_ms = i;
-      memset(packet.data, i, packet.length);
-      EXPECT_TRUE(rtp_writer_->WritePacket(&packet));
-    }
-  }
-
-  void CloseOutputFile() { rtp_writer_.reset(); }
-
-  void VerifyFileContents(int expected_packets) {
-    ASSERT_TRUE(rtp_writer_.get() == NULL)
-        << "Must call CloseOutputFile before VerifyFileContents";
-    std::unique_ptr<test::RtpFileReader> rtp_reader(
-        test::RtpFileReader::Create(test::RtpFileReader::kRtpDump, filename_));
-    ASSERT_TRUE(rtp_reader.get() != NULL);
-    test::RtpPacket packet;
-    int i = 0;
-    while (rtp_reader->NextPacket(&packet)) {
-      ++i;
-      EXPECT_EQ(static_cast<size_t>(i), packet.length);
-      EXPECT_EQ(static_cast<size_t>(i), packet.original_length);
-      EXPECT_EQ(static_cast<uint32_t>(i), packet.time_ms);
-      for (int j = 0; j < i; ++j) {
-        EXPECT_EQ(i, packet.data[j]);
-      }
-    }
-    EXPECT_EQ(expected_packets, i);
-  }
-
- private:
-  std::unique_ptr<test::RtpFileWriter> rtp_writer_;
-  std::string filename_;
-};
-
-TEST_F(RtpFileWriterTest, WriteToRtpDump) {
-  Init("test_rtp_file_writer.rtp");
-  WriteRtpPackets(10);
-  CloseOutputFile();
-  VerifyFileContents(10);
-}
-
-}  // namespace webrtc
diff --git a/test/rtp_rtcp_observer.h b/test/rtp_rtcp_observer.h
deleted file mode 100644
index 8d6fefd..0000000
--- a/test/rtp_rtcp_observer.h
+++ /dev/null
@@ -1,157 +0,0 @@
-/*
- *  Copyright (c) 2013 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_TEST_RTP_RTCP_OBSERVER_H_
-#define WEBRTC_TEST_RTP_RTCP_OBSERVER_H_
-
-#include <map>
-#include <memory>
-#include <vector>
-
-#include "webrtc/modules/rtp_rtcp/include/rtp_header_parser.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/event.h"
-#include "webrtc/system_wrappers/include/field_trial.h"
-#include "webrtc/test/constants.h"
-#include "webrtc/test/direct_transport.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/typedefs.h"
-#include "webrtc/call/video_send_stream.h"
-
-namespace {
-const int kShortTimeoutMs = 500;
-}
-
-namespace webrtc {
-namespace test {
-
-class PacketTransport;
-class SingleThreadedTaskQueueForTesting;
-
-class RtpRtcpObserver {
- public:
-  enum Action {
-    SEND_PACKET,
-    DROP_PACKET,
-  };
-
-  virtual ~RtpRtcpObserver() {}
-
-  virtual bool Wait() {
-    if (field_trial::IsEnabled("WebRTC-QuickPerfTest")) {
-      observation_complete_.Wait(kShortTimeoutMs);
-      return true;
-    }
-    return observation_complete_.Wait(timeout_ms_);
-  }
-
-  virtual Action OnSendRtp(const uint8_t* packet, size_t length) {
-    return SEND_PACKET;
-  }
-
-  virtual Action OnSendRtcp(const uint8_t* packet, size_t length) {
-    return SEND_PACKET;
-  }
-
-  virtual Action OnReceiveRtp(const uint8_t* packet, size_t length) {
-    return SEND_PACKET;
-  }
-
-  virtual Action OnReceiveRtcp(const uint8_t* packet, size_t length) {
-    return SEND_PACKET;
-  }
-
- protected:
-  RtpRtcpObserver() : RtpRtcpObserver(0) {}
-  explicit RtpRtcpObserver(int event_timeout_ms)
-      : observation_complete_(false, false),
-        parser_(RtpHeaderParser::Create()),
-        timeout_ms_(event_timeout_ms) {
-    parser_->RegisterRtpHeaderExtension(kRtpExtensionTransmissionTimeOffset,
-                                        kTOffsetExtensionId);
-    parser_->RegisterRtpHeaderExtension(kRtpExtensionAbsoluteSendTime,
-                                        kAbsSendTimeExtensionId);
-    parser_->RegisterRtpHeaderExtension(kRtpExtensionTransportSequenceNumber,
-                                        kTransportSequenceNumberExtensionId);
-  }
-
-  rtc::Event observation_complete_;
-  const std::unique_ptr<RtpHeaderParser> parser_;
-
- private:
-  const int timeout_ms_;
-};
-
-class PacketTransport : public test::DirectTransport {
- public:
-  enum TransportType { kReceiver, kSender };
-
-  PacketTransport(SingleThreadedTaskQueueForTesting* task_queue,
-                  Call* send_call,
-                  RtpRtcpObserver* observer,
-                  TransportType transport_type,
-                  const std::map<uint8_t, MediaType>& payload_type_map,
-                  const FakeNetworkPipe::Config& configuration)
-      : test::DirectTransport(task_queue,
-                              configuration,
-                              send_call,
-                              payload_type_map),
-        observer_(observer),
-        transport_type_(transport_type) {}
-
- private:
-  bool SendRtp(const uint8_t* packet,
-               size_t length,
-               const PacketOptions& options) override {
-    EXPECT_FALSE(RtpHeaderParser::IsRtcp(packet, length));
-    RtpRtcpObserver::Action action;
-    {
-      if (transport_type_ == kSender) {
-        action = observer_->OnSendRtp(packet, length);
-      } else {
-        action = observer_->OnReceiveRtp(packet, length);
-      }
-    }
-    switch (action) {
-      case RtpRtcpObserver::DROP_PACKET:
-        // Drop packet silently.
-        return true;
-      case RtpRtcpObserver::SEND_PACKET:
-        return test::DirectTransport::SendRtp(packet, length, options);
-    }
-    return true;  // Will never happen, makes compiler happy.
-  }
-
-  bool SendRtcp(const uint8_t* packet, size_t length) override {
-    EXPECT_TRUE(RtpHeaderParser::IsRtcp(packet, length));
-    RtpRtcpObserver::Action action;
-    {
-      if (transport_type_ == kSender) {
-        action = observer_->OnSendRtcp(packet, length);
-      } else {
-        action = observer_->OnReceiveRtcp(packet, length);
-      }
-    }
-    switch (action) {
-      case RtpRtcpObserver::DROP_PACKET:
-        // Drop packet silently.
-        return true;
-      case RtpRtcpObserver::SEND_PACKET:
-        return test::DirectTransport::SendRtcp(packet, length);
-    }
-    return true;  // Will never happen, makes compiler happy.
-  }
-
-  RtpRtcpObserver* const observer_;
-  TransportType transport_type_;
-};
-}  // namespace test
-}  // namespace webrtc
-
-#endif  // WEBRTC_TEST_RTP_RTCP_OBSERVER_H_
diff --git a/test/run_loop.cc b/test/run_loop.cc
deleted file mode 100644
index 92f85dd..0000000
--- a/test/run_loop.cc
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- *  Copyright (c) 2013 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/test/run_loop.h"
-
-#include <stdio.h>
-
-namespace webrtc {
-namespace test {
-
-void PressEnterToContinue() {
-  puts(">> Press ENTER to continue...");
-  while (getc(stdin) != '\n' && !feof(stdin));
-}
-}  // namespace test
-}  // namespace webrtc
diff --git a/test/run_loop.h b/test/run_loop.h
deleted file mode 100644
index 238e2dc..0000000
--- a/test/run_loop.h
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- *  Copyright (c) 2013 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_TEST_RUN_LOOP_H_
-#define WEBRTC_TEST_RUN_LOOP_H_
-
-namespace webrtc {
-namespace test {
-
-// Blocks until the user presses enter.
-void PressEnterToContinue();
-
-}  // namespace test
-}  // namespace webrtc
-
-#endif  // WEBRTC_TEST_RUN_LOOP_H_
diff --git a/test/run_test.cc b/test/run_test.cc
deleted file mode 100644
index 4daea42..0000000
--- a/test/run_test.cc
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- *  Copyright (c) 2013 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/test/run_test.h"
-
-#include <stdio.h>
-
-namespace webrtc {
-namespace test {
-
-void RunTest(void(*test)()) {
-  (*test)();
-}
-
-}  // namespace test
-}  // namespace webrtc
diff --git a/test/run_test.h b/test/run_test.h
deleted file mode 100644
index b515254..0000000
--- a/test/run_test.h
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- *  Copyright (c) 2013 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_TEST_RUN_TEST_H
-#define WEBRTC_TEST_RUN_TEST_H
-
-namespace webrtc {
-namespace test {
-
-// Running a test function on a separate thread, if required by the OS.
-void RunTest(void(*test)());
-
-}  // namespace test
-}  // namespace webrtc
-
-#endif  // WEBRTC_TEST_RUN_TEST_H
diff --git a/test/single_threaded_task_queue.cc b/test/single_threaded_task_queue.cc
deleted file mode 100644
index bee5981..0000000
--- a/test/single_threaded_task_queue.cc
+++ /dev/null
@@ -1,144 +0,0 @@
-/*
- *  Copyright (c) 2017 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/test/single_threaded_task_queue.h"
-
-#include <utility>
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/ptr_util.h"
-#include "webrtc/rtc_base/safe_conversions.h"
-#include "webrtc/rtc_base/timeutils.h"
-
-namespace webrtc {
-namespace test {
-
-SingleThreadedTaskQueueForTesting::QueuedTask::QueuedTask(
-    SingleThreadedTaskQueueForTesting::TaskId task_id,
-    int64_t earliest_execution_time,
-    SingleThreadedTaskQueueForTesting::Task task)
-    : task_id(task_id),
-      earliest_execution_time(earliest_execution_time),
-      task(task) {}
-
-SingleThreadedTaskQueueForTesting::QueuedTask::~QueuedTask() = default;
-
-SingleThreadedTaskQueueForTesting::SingleThreadedTaskQueueForTesting(
-    const char* name)
-    : thread_(Run, this, name),
-      running_(true),
-      next_task_id_(0),
-      wake_up_(false, false) {
-  thread_.Start();
-}
-
-SingleThreadedTaskQueueForTesting::~SingleThreadedTaskQueueForTesting() {
-  RTC_DCHECK_RUN_ON(&owner_thread_checker_);
-  {
-    rtc::CritScope lock(&cs_);
-    running_ = false;
-  }
-  wake_up_.Set();
-  thread_.Stop();
-}
-
-SingleThreadedTaskQueueForTesting::TaskId
-SingleThreadedTaskQueueForTesting::PostTask(Task task) {
-  return PostDelayedTask(task, 0);
-}
-
-SingleThreadedTaskQueueForTesting::TaskId
-SingleThreadedTaskQueueForTesting::PostDelayedTask(Task task,
-                                                   int64_t delay_ms) {
-  int64_t earliest_exec_time = rtc::TimeAfter(delay_ms);
-
-  rtc::CritScope lock(&cs_);
-
-  TaskId id = next_task_id_++;
-
-  // Insert after any other tasks with an earlier-or-equal target time.
-  auto it = tasks_.begin();
-  for (; it != tasks_.end(); it++) {
-    if (earliest_exec_time < (*it)->earliest_execution_time) {
-      break;
-    }
-  }
-  tasks_.insert(it, rtc::MakeUnique<QueuedTask>(id, earliest_exec_time, task));
-
-  // This class is optimized for simplicty, not for performance. This will wake
-  // the thread up even if the next task in the queue is only scheduled for
-  // quite some time from now. In that case, the thread will just send itself
-  // back to sleep.
-  wake_up_.Set();
-
-  return id;
-}
-
-void SingleThreadedTaskQueueForTesting::SendTask(Task task) {
-  rtc::Event done(true, false);
-  PostTask([&task, &done]() {
-    task();
-    done.Set();
-  });
-  done.Wait(rtc::Event::kForever);
-}
-
-bool SingleThreadedTaskQueueForTesting::CancelTask(TaskId task_id) {
-  rtc::CritScope lock(&cs_);
-  for (auto it = tasks_.begin(); it != tasks_.end(); it++) {
-    if ((*it)->task_id == task_id) {
-      tasks_.erase(it);
-      return true;
-    }
-  }
-  return false;
-}
-
-void SingleThreadedTaskQueueForTesting::Run(void* obj) {
-  static_cast<SingleThreadedTaskQueueForTesting*>(obj)->RunLoop();
-}
-
-void SingleThreadedTaskQueueForTesting::RunLoop() {
-  while (true) {
-    std::unique_ptr<QueuedTask> queued_task;
-
-    // An empty queue would lead to sleeping until the queue becoems non-empty.
-    // A queue where the earliest task is shceduled for later than now, will
-    // lead to sleeping until the time of the next scheduled task (or until
-    // more tasks are scheduled).
-    int wait_time = rtc::Event::kForever;
-
-    {
-      rtc::CritScope lock(&cs_);
-      if (!running_) {
-        return;
-      }
-      if (!tasks_.empty()) {
-        int64_t remaining_delay_ms = rtc::TimeDiff(
-            tasks_.front()->earliest_execution_time, rtc::TimeMillis());
-        if (remaining_delay_ms <= 0) {
-          queued_task = std::move(tasks_.front());
-          tasks_.pop_front();
-        } else {
-          wait_time = rtc::saturated_cast<int>(remaining_delay_ms);
-        }
-      }
-    }
-
-    if (queued_task) {
-      queued_task->task();
-    } else {
-      wake_up_.Wait(wait_time);
-    }
-  }
-}
-
-}  // namespace test
-}  // namespace webrtc
diff --git a/test/single_threaded_task_queue.h b/test/single_threaded_task_queue.h
deleted file mode 100644
index c078bdd..0000000
--- a/test/single_threaded_task_queue.h
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- *  Copyright (c) 2017 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_TEST_SINGLE_THREADED_TASK_QUEUE_H_
-#define WEBRTC_TEST_SINGLE_THREADED_TASK_QUEUE_H_
-
-#include <functional>
-#include <list>
-#include <memory>
-
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/event.h"
-#include "webrtc/rtc_base/platform_thread.h"
-#include "webrtc/rtc_base/thread_checker.h"
-
-namespace webrtc {
-namespace test {
-
-// This class gives capabilities similar to rtc::TaskQueue, but ensures
-// everything happens on the same thread. This is intended to make the
-// threading model of unit-tests (specifically end-to-end tests) more closely
-// resemble that of real WebRTC, thereby allowing us to replace some critical
-// sections by thread-checkers.
-// This task is NOT tuned for performance, but rather for simplicity.
-class SingleThreadedTaskQueueForTesting {
- public:
-  using Task = std::function<void()>;
-  using TaskId = size_t;
-
-  explicit SingleThreadedTaskQueueForTesting(const char* name);
-  ~SingleThreadedTaskQueueForTesting();
-
-  // Sends one task to the task-queue, and returns a handle by which the
-  // task can be cancelled.
-  // This mimics the behavior of TaskQueue, but only for lambdas, rather than
-  // for both lambdas and QueuedTask objects.
-  TaskId PostTask(Task task);
-
-  // Same as PostTask(), but ensures that the task will not begin execution
-  // less than |delay_ms| milliseconds after being posted; an upper bound
-  // is not provided.
-  TaskId PostDelayedTask(Task task, int64_t delay_ms);
-
-  // Send one task to the queue. The function does not return until the task
-  // has finished executing. No support for canceling the task.
-  void SendTask(Task task);
-
-  // Given an identifier to the task, attempts to eject it from the queue.
-  // Returns true if the task was found and cancelled. Failure possible
-  // only for invalid task IDs, or for tasks which have already been executed.
-  bool CancelTask(TaskId task_id);
-
- private:
-  struct QueuedTask {
-    QueuedTask(TaskId task_id, int64_t earliest_execution_time, Task task);
-    ~QueuedTask();
-
-    TaskId task_id;
-    int64_t earliest_execution_time;
-    Task task;
-  };
-
-  static void Run(void* obj);
-
-  void RunLoop();
-
-  rtc::CriticalSection cs_;
-  std::list<std::unique_ptr<QueuedTask>> tasks_ RTC_GUARDED_BY(cs_);
-  rtc::ThreadChecker owner_thread_checker_;
-  rtc::PlatformThread thread_;
-  bool running_ RTC_GUARDED_BY(cs_);
-
-  TaskId next_task_id_;
-
-  // The task-queue will sleep when not executing a task. Wake up occurs when:
-  // * Upon destruction, to make sure that the |thead_| terminates, so that it
-  //   may be joined. [Event will be set.]
-  // * New task added. Because we optimize for simplicity rahter than for
-  //   performance (this class is a testing facility only), waking up occurs
-  //   when we get a new task even if it is scheduled with a delay. The RunLoop
-  //   is in charge of sending itself back to sleep if the next task is only
-  //   to be executed at a later time. [Event will be set.]
-  // * When the next task in the queue is a delayed-task, and the time for
-  //   its execution has come. [Event will time-out.]
-  rtc::Event wake_up_;
-};
-
-}  // namespace test
-}  // namespace webrtc
-
-#endif  // WEBRTC_TEST_SINGLE_THREADED_TASK_QUEUE_H_
diff --git a/test/single_threaded_task_queue_unittest.cc b/test/single_threaded_task_queue_unittest.cc
deleted file mode 100644
index 8ad8b4f..0000000
--- a/test/single_threaded_task_queue_unittest.cc
+++ /dev/null
@@ -1,364 +0,0 @@
-/*
- *  Copyright (c) 2017 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/test/single_threaded_task_queue.h"
-
-#include <atomic>
-#include <memory>
-#include <vector>
-
-#include "webrtc/rtc_base/event.h"
-#include "webrtc/rtc_base/ptr_util.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-namespace test {
-
-namespace {
-
-using TaskId = SingleThreadedTaskQueueForTesting::TaskId;
-
-// Test should not rely on the object under test not being faulty. If the task
-// queue ever blocks forever, we want the tests to fail, rather than hang.
-constexpr int kMaxWaitTimeMs = 10000;
-
-TEST(SingleThreadedTaskQueueForTestingTest, SanityConstructionDestruction) {
-  SingleThreadedTaskQueueForTesting task_queue("task_queue");
-}
-
-TEST(SingleThreadedTaskQueueForTestingTest, ExecutesPostedTasks) {
-  SingleThreadedTaskQueueForTesting task_queue("task_queue");
-
-  std::atomic<bool> executed(false);
-  rtc::Event done(true, false);
-
-  task_queue.PostTask([&executed, &done]() {
-    executed.store(true);
-    done.Set();
-  });
-  ASSERT_TRUE(done.Wait(kMaxWaitTimeMs));
-
-  EXPECT_TRUE(executed.load());
-}
-
-TEST(SingleThreadedTaskQueueForTestingTest,
-     PostMultipleTasksFromSameExternalThread) {
-  SingleThreadedTaskQueueForTesting task_queue("task_queue");
-
-  constexpr size_t kCount = 3;
-  std::atomic<bool> executed[kCount];
-  for (std::atomic<bool>& exec : executed) {
-    exec.store(false);
-  }
-
-  std::vector<std::unique_ptr<rtc::Event>> done_events;
-  for (size_t i = 0; i < kCount; i++) {
-    done_events.emplace_back(rtc::MakeUnique<rtc::Event>(false, false));
-  }
-
-  // To avoid the tasks which comprise the actual test from running before they
-  // have all be posted, which could result in only one task ever being in the
-  // queue at any given time, post one waiting task that would block the
-  // task-queue, and unblock only after all tasks have been posted.
-  rtc::Event rendezvous(true, false);
-  task_queue.PostTask([&rendezvous]() {
-    ASSERT_TRUE(rendezvous.Wait(kMaxWaitTimeMs));
-  });
-
-  // Post the tasks which comprise the test.
-  for (size_t i = 0; i < kCount; i++) {
-    task_queue.PostTask([&executed, &done_events, i]() {  // |i| by value.
-      executed[i].store(true);
-      done_events[i]->Set();
-    });
-  }
-
-  rendezvous.Set();  // Release the task-queue.
-
-  // Wait until the task queue has executed all the tasks.
-  for (size_t i = 0; i < kCount; i++) {
-    ASSERT_TRUE(done_events[i]->Wait(kMaxWaitTimeMs));
-  }
-
-  for (size_t i = 0; i < kCount; i++) {
-    EXPECT_TRUE(executed[i].load());
-  }
-}
-
-TEST(SingleThreadedTaskQueueForTestingTest, PostToTaskQueueFromOwnThread) {
-  SingleThreadedTaskQueueForTesting task_queue("task_queue");
-
-  std::atomic<bool> executed(false);
-  rtc::Event done(true, false);
-
-  auto internally_posted_task = [&executed, &done]() {
-    executed.store(true);
-    done.Set();
-  };
-
-  auto externally_posted_task = [&task_queue, &internally_posted_task]() {
-    task_queue.PostTask(internally_posted_task);
-  };
-
-  task_queue.PostTask(externally_posted_task);
-
-  ASSERT_TRUE(done.Wait(kMaxWaitTimeMs));
-  EXPECT_TRUE(executed.load());
-}
-
-TEST(SingleThreadedTaskQueueForTestingTest, TasksExecutedInSequence) {
-  SingleThreadedTaskQueueForTesting task_queue("task_queue");
-
-  // The first task would perform:
-  // accumulator = 10 * accumulator + i
-  // Where |i| is 1, 2 and 3 for the 1st, 2nd and 3rd tasks, respectively.
-  // The result would be 123 if and only iff the tasks were executed in order.
-  size_t accumulator = 0;
-  size_t expected_value = 0;  // Updates to the correct value.
-
-  // Prevent the chain from being set in motion before we've had time to
-  // schedule it all, lest the queue only contain one task at a time.
-  rtc::Event rendezvous(true, false);
-  task_queue.PostTask([&rendezvous]() {
-    ASSERT_TRUE(rendezvous.Wait(kMaxWaitTimeMs));
-  });
-
-  for (size_t i = 0; i < 3; i++) {
-    task_queue.PostTask([&accumulator, i]() {  // |i| passed by value.
-      accumulator = 10 * accumulator + i;
-    });
-    expected_value = 10 * expected_value + i;
-  }
-
-  // The test will wait for the task-queue to finish.
-  rtc::Event done(true, false);
-  task_queue.PostTask([&done]() {
-    done.Set();
-  });
-
-  rendezvous.Set();  // Set the chain in motion.
-
-  ASSERT_TRUE(done.Wait(kMaxWaitTimeMs));
-
-  EXPECT_EQ(accumulator, expected_value);
-}
-
-TEST(SingleThreadedTaskQueueForTestingTest, ExecutesPostedDelayedTask) {
-  SingleThreadedTaskQueueForTesting task_queue("task_queue");
-
-  std::atomic<bool> executed(false);
-  rtc::Event done(true, false);
-
-  constexpr int64_t delay_ms = 20;
-  static_assert(delay_ms < kMaxWaitTimeMs / 2, "Delay too long for tests.");
-
-  task_queue.PostDelayedTask([&executed, &done]() {
-    executed.store(true);
-    done.Set();
-  }, delay_ms);
-  ASSERT_TRUE(done.Wait(kMaxWaitTimeMs));
-
-  EXPECT_TRUE(executed.load());
-}
-
-TEST(SingleThreadedTaskQueueForTestingTest, DoesNotExecuteDelayedTaskTooSoon) {
-  SingleThreadedTaskQueueForTesting task_queue("task_queue");
-
-  std::atomic<bool> executed(false);
-
-  constexpr int64_t delay_ms = 2000;
-  static_assert(delay_ms < kMaxWaitTimeMs / 2, "Delay too long for tests.");
-
-  task_queue.PostDelayedTask([&executed]() {
-    executed.store(true);
-  }, delay_ms);
-
-  // Wait less than is enough, make sure the task was not yet executed.
-  rtc::Event not_done(true, false);
-  ASSERT_FALSE(not_done.Wait(delay_ms / 2));
-  EXPECT_FALSE(executed.load());
-}
-
-TEST(SingleThreadedTaskQueueForTestingTest,
-     TaskWithLesserDelayPostedAfterFirstDelayedTaskExectuedBeforeFirst) {
-  SingleThreadedTaskQueueForTesting task_queue("task_queue");
-
-  std::atomic<bool> earlier_executed(false);
-  constexpr int64_t earlier_delay_ms = 500;
-
-  std::atomic<bool> later_executed(false);
-  constexpr int64_t later_delay_ms = 1000;
-
-  static_assert(earlier_delay_ms + later_delay_ms < kMaxWaitTimeMs / 2,
-                "Delay too long for tests.");
-
-  rtc::Event done(true, false);
-
-  auto earlier_task = [&earlier_executed, &later_executed]() {
-    EXPECT_FALSE(later_executed.load());
-    earlier_executed.store(true);
-  };
-
-  auto later_task = [&earlier_executed, &later_executed, &done]() {
-    EXPECT_TRUE(earlier_executed.load());
-    later_executed.store(true);
-    done.Set();
-  };
-
-  task_queue.PostDelayedTask(later_task, later_delay_ms);
-  task_queue.PostDelayedTask(earlier_task, earlier_delay_ms);
-
-  ASSERT_TRUE(done.Wait(kMaxWaitTimeMs));
-  ASSERT_TRUE(earlier_executed);
-  ASSERT_TRUE(later_executed);
-}
-
-TEST(SingleThreadedTaskQueueForTestingTest,
-     TaskWithGreaterDelayPostedAfterFirstDelayedTaskExectuedAfterFirst) {
-  SingleThreadedTaskQueueForTesting task_queue("task_queue");
-
-  std::atomic<bool> earlier_executed(false);
-  constexpr int64_t earlier_delay_ms = 500;
-
-  std::atomic<bool> later_executed(false);
-  constexpr int64_t later_delay_ms = 1000;
-
-  static_assert(earlier_delay_ms + later_delay_ms < kMaxWaitTimeMs / 2,
-                "Delay too long for tests.");
-
-  rtc::Event done(true, false);
-
-  auto earlier_task = [&earlier_executed, &later_executed]() {
-    EXPECT_FALSE(later_executed.load());
-    earlier_executed.store(true);
-  };
-
-  auto later_task = [&earlier_executed, &later_executed, &done]() {
-    EXPECT_TRUE(earlier_executed.load());
-    later_executed.store(true);
-    done.Set();
-  };
-
-  task_queue.PostDelayedTask(earlier_task, earlier_delay_ms);
-  task_queue.PostDelayedTask(later_task, later_delay_ms);
-
-  ASSERT_TRUE(done.Wait(kMaxWaitTimeMs));
-  ASSERT_TRUE(earlier_executed);
-  ASSERT_TRUE(later_executed);
-}
-
-TEST(SingleThreadedTaskQueueForTestingTest, ExternalThreadCancelsTask) {
-  SingleThreadedTaskQueueForTesting task_queue("task_queue");
-
-  rtc::Event done(true, false);
-
-  // Prevent the to-be-cancelled task from being executed before we've had
-  // time to cancel it.
-  rtc::Event rendezvous(true, false);
-  task_queue.PostTask([&rendezvous]() {
-    ASSERT_TRUE(rendezvous.Wait(kMaxWaitTimeMs));
-  });
-
-  TaskId cancelled_task_id = task_queue.PostTask([]() {
-    EXPECT_TRUE(false);
-  });
-  task_queue.PostTask([&done]() {
-    done.Set();
-  });
-
-  task_queue.CancelTask(cancelled_task_id);
-
-  // Set the tasks in motion; the cancelled task does not run (otherwise the
-  // test would fail). The last task ends the test, showing that the queue
-  // progressed beyond the cancelled task.
-  rendezvous.Set();
-  ASSERT_TRUE(done.Wait(kMaxWaitTimeMs));
-}
-
-// In this test, we'll set off a chain where the first task cancels the second
-// task, then a third task runs (showing that we really cancelled the task,
-// rather than just halted the task-queue).
-TEST(SingleThreadedTaskQueueForTestingTest, InternalThreadCancelsTask) {
-  SingleThreadedTaskQueueForTesting task_queue("task_queue");
-
-  rtc::Event done(true, false);
-
-  // Prevent the chain from being set-off before we've set everything up.
-  rtc::Event rendezvous(true, false);
-  task_queue.PostTask([&rendezvous]() {
-    ASSERT_TRUE(rendezvous.Wait(kMaxWaitTimeMs));
-  });
-
-  // This is the canceller-task. It takes cancelled_task_id by reference,
-  // because the ID will only become known after the cancelled task is
-  // scheduled.
-  TaskId cancelled_task_id;
-  auto canceller_task = [&task_queue, &cancelled_task_id]() {
-    task_queue.CancelTask(cancelled_task_id);
-  };
-  task_queue.PostTask(canceller_task);
-
-  // This task will be cancelled by the task before it.
-  auto cancelled_task = []() {
-    EXPECT_TRUE(false);
-  };
-  cancelled_task_id = task_queue.PostTask(cancelled_task);
-
-  // When this task runs, it will allow the test to be finished.
-  auto completion_marker_task = [&done]() {
-    done.Set();
-  };
-  task_queue.PostTask(completion_marker_task);
-
-  rendezvous.Set();  // Set the chain in motion.
-
-  ASSERT_TRUE(done.Wait(kMaxWaitTimeMs));
-}
-
-TEST(SingleThreadedTaskQueueForTestingTest, SendTask) {
-  SingleThreadedTaskQueueForTesting task_queue("task_queue");
-
-  std::atomic<bool> executed(false);
-
-  task_queue.SendTask([&executed]() {
-    // Intentionally delay, so that if SendTask didn't block, the sender thread
-    // would have time to read |executed|.
-    rtc::Event delay(true, false);
-    ASSERT_FALSE(delay.Wait(1000));
-    executed.store(true);
-  });
-
-  EXPECT_TRUE(executed);
-}
-
-TEST(SingleThreadedTaskQueueForTestingTest,
-     DestructTaskQueueWhileTasksPending) {
-  auto task_queue =
-      rtc::MakeUnique<SingleThreadedTaskQueueForTesting>("task_queue");
-
-  std::atomic<size_t> counter(0);
-
-  constexpr size_t tasks = 10;
-  for (size_t i = 0; i < tasks; i++) {
-    task_queue->PostTask([&counter]() {
-      std::atomic_fetch_add(&counter, static_cast<size_t>(1));
-      rtc::Event delay(true, false);
-      ASSERT_FALSE(delay.Wait(500));
-    });
-  }
-
-  task_queue.reset();
-
-  EXPECT_LT(counter, tasks);
-}
-
-}  // namespace
-}  // namespace test
-}  // namespace webrtc
diff --git a/test/statistics.cc b/test/statistics.cc
deleted file mode 100644
index 0075d4c..0000000
--- a/test/statistics.cc
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- *  Copyright (c) 2013 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/test/statistics.h"
-
-#include <math.h>
-
-namespace webrtc {
-namespace test {
-
-Statistics::Statistics() : sum_(0.0), sum_squared_(0.0), count_(0) {}
-
-void Statistics::AddSample(double sample) {
-  sum_ += sample;
-  sum_squared_ += sample * sample;
-  ++count_;
-}
-
-double Statistics::Mean() const {
-  if (count_ == 0)
-    return 0.0;
-  return sum_ / count_;
-}
-
-double Statistics::Variance() const {
-  if (count_ == 0)
-    return 0.0;
-  return sum_squared_ / count_ - Mean() * Mean();
-}
-
-double Statistics::StandardDeviation() const {
-  return sqrt(Variance());
-}
-}  // namespace test
-}  // namespace webrtc
diff --git a/test/statistics.h b/test/statistics.h
deleted file mode 100644
index d4a111e..0000000
--- a/test/statistics.h
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- *  Copyright (c) 2013 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_TEST_STATISTICS_H_
-#define WEBRTC_TEST_STATISTICS_H_
-
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-namespace test {
-
-class Statistics {
- public:
-  Statistics();
-
-  void AddSample(double sample);
-
-  double Mean() const;
-  double Variance() const;
-  double StandardDeviation() const;
-
- private:
-  double sum_;
-  double sum_squared_;
-  uint64_t count_;
-};
-}  // namespace test
-}  // namespace webrtc
-
-#endif  // WEBRTC_TEST_STATISTICS_H_
diff --git a/test/test_main.cc b/test/test_main.cc
deleted file mode 100644
index 3790a68..0000000
--- a/test/test_main.cc
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- *  Copyright (c) 2013 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/rtc_base/flags.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/system_wrappers/include/metrics_default.h"
-#include "webrtc/test/field_trial.h"
-#include "webrtc/test/gmock.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/testsupport/fileutils.h"
-#include "webrtc/test/testsupport/trace_to_stderr.h"
-
-#if defined(WEBRTC_IOS)
-#include "webrtc/test/ios/test_support.h"
-
-DEFINE_string(NSTreatUnknownArgumentsAsOpen, "",
-    "Intentionally ignored flag intended for iOS simulator.");
-DEFINE_string(ApplePersistenceIgnoreState, "",
-    "Intentionally ignored flag intended for iOS simulator.");
-#endif
-
-DEFINE_bool(logs, false, "print logs to stderr");
-
-DEFINE_string(force_fieldtrials, "",
-    "Field trials control experimental feature code which can be forced. "
-    "E.g. running with --force_fieldtrials=WebRTC-FooFeature/Enable/"
-    " will assign the group Enable to field trial WebRTC-FooFeature.");
-
-DEFINE_bool(help, false, "Print this message.");
-
-int main(int argc, char* argv[]) {
-  ::testing::InitGoogleMock(&argc, argv);
-
-  // Default to LS_INFO, even for release builds to provide better test logging.
-  // TODO(pbos): Consider adding a command-line override.
-  if (rtc::LogMessage::GetLogToDebug() > rtc::LS_INFO)
-    rtc::LogMessage::LogToDebug(rtc::LS_INFO);
-
-  if (rtc::FlagList::SetFlagsFromCommandLine(&argc, argv, false)) {
-    return 1;
-  }
-  if (FLAG_help) {
-    rtc::FlagList::Print(nullptr, false);
-    return 0;
-  }
-
-  webrtc::test::SetExecutablePath(argv[0]);
-  std::string fieldtrials = FLAG_force_fieldtrials;
-  webrtc::test::InitFieldTrialsFromString(fieldtrials);
-  webrtc::metrics::Enable();
-
-  rtc::LogMessage::SetLogToStderr(FLAG_logs);
-  std::unique_ptr<webrtc::test::TraceToStderr> trace_to_stderr;
-  if (FLAG_logs)
-      trace_to_stderr.reset(new webrtc::test::TraceToStderr);
-#if defined(WEBRTC_IOS)
-  rtc::test::InitTestSuite(RUN_ALL_TESTS, argc, argv);
-  rtc::test::RunTestsFromIOSApp();
-#endif
-
-  return RUN_ALL_TESTS();
-}
diff --git a/test/testsupport/always_passing_unittest.cc b/test/testsupport/always_passing_unittest.cc
deleted file mode 100644
index 79a4869..0000000
--- a/test/testsupport/always_passing_unittest.cc
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- *  Copyright (c) 2014 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/test/gtest.h"
-
-namespace webrtc {
-
-// A test that always passes. Useful when all tests in a executable are
-// disabled, since a gtest returns exit code 1 if no tests have executed.
-TEST(AlwaysPassingTest, AlwaysPassingTest) {}
-
-}  // namespace webrtc
diff --git a/test/testsupport/fileutils.cc b/test/testsupport/fileutils.cc
deleted file mode 100644
index deb9cf0..0000000
--- a/test/testsupport/fileutils.cc
+++ /dev/null
@@ -1,363 +0,0 @@
-/*
- *  Copyright (c) 2012 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/test/testsupport/fileutils.h"
-
-#include <assert.h>
-
-#ifdef WIN32
-#include <direct.h>
-#include <tchar.h>
-#include <windows.h>
-#include <algorithm>
-
-#include "Shlwapi.h"
-#include "WinDef.h"
-
-#include "webrtc/rtc_base/win32.h"
-#define GET_CURRENT_DIR _getcwd
-#else
-#include <dirent.h>
-#include <unistd.h>
-
-#define GET_CURRENT_DIR getcwd
-#endif
-
-#include <sys/stat.h>  // To check for directory existence.
-#ifndef S_ISDIR  // Not defined in stat.h on Windows.
-#define S_ISDIR(mode) (((mode) & S_IFMT) == S_IFDIR)
-#endif
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include <memory>
-#include <utility>
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/typedefs.h"  // For architecture defines
-
-namespace webrtc {
-namespace test {
-
-#if defined(WEBRTC_IOS)
-// Defined in iosfileutils.mm.  No header file to discourage use elsewhere.
-std::string IOSOutputPath();
-std::string IOSRootPath();
-std::string IOSResourcePath(std::string name, std::string extension);
-#endif
-
-namespace {
-
-#ifdef WIN32
-const char* kPathDelimiter = "\\";
-#else
-const char* kPathDelimiter = "/";
-#endif
-
-#ifdef WEBRTC_ANDROID
-const char* kRootDirName = "/sdcard/chromium_tests_root/";
-#else
-#if !defined(WEBRTC_IOS)
-const char* kOutputDirName = "out";
-#endif
-const char* kFallbackPath = "./";
-#endif  // !defined(WEBRTC_ANDROID)
-
-#if !defined(WEBRTC_IOS)
-const char* kResourcesDirName = "resources";
-#endif
-
-char relative_dir_path[FILENAME_MAX];
-bool relative_dir_path_set = false;
-
-}  // namespace
-
-const char* kCannotFindProjectRootDir = "ERROR_CANNOT_FIND_PROJECT_ROOT_DIR";
-
-void SetExecutablePath(const std::string& path) {
-  std::string working_dir = WorkingDir();
-  std::string temp_path = path;
-
-  // Handle absolute paths; convert them to relative paths to the working dir.
-  if (path.find(working_dir) != std::string::npos) {
-    temp_path = path.substr(working_dir.length() + 1);
-  }
-  // On Windows, when tests are run under memory tools like DrMemory and TSan,
-  // slashes occur in the path as directory separators. Make sure we replace
-  // such cases with backslashes in order for the paths to be correct.
-#ifdef WIN32
-  std::replace(temp_path.begin(), temp_path.end(), '/', '\\');
-#endif
-
-  // Trim away the executable name; only store the relative dir path.
-  temp_path = temp_path.substr(0, temp_path.find_last_of(kPathDelimiter));
-  strncpy(relative_dir_path, temp_path.c_str(), FILENAME_MAX);
-  relative_dir_path_set = true;
-}
-
-bool FileExists(const std::string& file_name) {
-  struct stat file_info = {0};
-  return stat(file_name.c_str(), &file_info) == 0;
-}
-
-bool DirExists(const std::string& directory_name) {
-  struct stat directory_info = {0};
-  return stat(directory_name.c_str(), &directory_info) == 0 && S_ISDIR(
-      directory_info.st_mode);
-}
-
-#ifdef WEBRTC_ANDROID
-
-std::string ProjectRootPath() {
-  return kRootDirName;
-}
-
-std::string OutputPath() {
-  return kRootDirName;
-}
-
-std::string WorkingDir() {
-  return kRootDirName;
-}
-
-#else  // WEBRTC_ANDROID
-
-std::string ProjectRootPath() {
-#if defined(WEBRTC_IOS)
-  return IOSRootPath();
-#else
-  std::string path = WorkingDir();
-  if (path == kFallbackPath) {
-    return kCannotFindProjectRootDir;
-  }
-  if (relative_dir_path_set) {
-    path = path + kPathDelimiter + relative_dir_path;
-  }
-  path = path + kPathDelimiter + ".." + kPathDelimiter + "..";
-  char canonical_path[FILENAME_MAX];
-#ifdef WIN32
-  BOOL succeeded = PathCanonicalizeA(canonical_path, path.c_str());
-#else
-  bool succeeded = realpath(path.c_str(), canonical_path) != NULL;
-#endif
-  if (succeeded) {
-    path = std::string(canonical_path) + kPathDelimiter;
-    return path;
-  } else {
-    fprintf(stderr, "Cannot find project root directory!\n");
-    return kCannotFindProjectRootDir;
-  }
-#endif
-}
-
-std::string OutputPath() {
-#if defined(WEBRTC_IOS)
-  return IOSOutputPath();
-#else
-  std::string path = ProjectRootPath();
-  if (path == kCannotFindProjectRootDir) {
-    return kFallbackPath;
-  }
-  path += kOutputDirName;
-  if (!CreateDir(path)) {
-    return kFallbackPath;
-  }
-  return path + kPathDelimiter;
-#endif
-}
-
-std::string WorkingDir() {
-  char path_buffer[FILENAME_MAX];
-  if (!GET_CURRENT_DIR(path_buffer, sizeof(path_buffer))) {
-    fprintf(stderr, "Cannot get current directory!\n");
-    return kFallbackPath;
-  } else {
-    return std::string(path_buffer);
-  }
-}
-
-#endif  // !WEBRTC_ANDROID
-
-// Generate a temporary filename in a safe way.
-// Largely copied from talk/base/{unixfilesystem,win32filesystem}.cc.
-std::string TempFilename(const std::string &dir, const std::string &prefix) {
-#ifdef WIN32
-  wchar_t filename[MAX_PATH];
-  if (::GetTempFileName(rtc::ToUtf16(dir).c_str(),
-                        rtc::ToUtf16(prefix).c_str(), 0, filename) != 0)
-    return rtc::ToUtf8(filename);
-  assert(false);
-  return "";
-#else
-  int len = dir.size() + prefix.size() + 2 + 6;
-  std::unique_ptr<char[]> tempname(new char[len]);
-
-  snprintf(tempname.get(), len, "%s/%sXXXXXX", dir.c_str(),
-           prefix.c_str());
-  int fd = ::mkstemp(tempname.get());
-  if (fd == -1) {
-    assert(false);
-    return "";
-  } else {
-    ::close(fd);
-  }
-  std::string ret(tempname.get());
-  return ret;
-#endif
-}
-
-rtc::Optional<std::vector<std::string>> ReadDirectory(std::string path) {
-  if (path.length() == 0)
-    return rtc::Optional<std::vector<std::string>>();
-
-#if defined(WEBRTC_WIN)
-  // Append separator character if needed.
-  if (path.back() != '\\')
-    path += '\\';
-
-  // Init.
-  WIN32_FIND_DATA data;
-  HANDLE handle = ::FindFirstFile(rtc::ToUtf16(path + '*').c_str(), &data);
-  if (handle == INVALID_HANDLE_VALUE)
-    return rtc::Optional<std::vector<std::string>>();
-
-  // Populate output.
-  std::vector<std::string> found_entries;
-  do {
-    const std::string name = rtc::ToUtf8(data.cFileName);
-    if (name != "." && name != "..")
-      found_entries.emplace_back(path + name);
-  } while (::FindNextFile(handle, &data) == TRUE);
-
-  // Release resources.
-  if (handle != INVALID_HANDLE_VALUE)
-    ::FindClose(handle);
-#else
-  // Append separator character if needed.
-  if (path.back() != '/')
-    path += '/';
-
-  // Init.
-  DIR* dir = ::opendir(path.c_str());
-  if (dir == nullptr)
-    return rtc::Optional<std::vector<std::string>>();
-
-  // Populate output.
-  std::vector<std::string> found_entries;
-  while (dirent* dirent = readdir(dir)) {
-    const std::string& name = dirent->d_name;
-    if (name != "." && name != "..")
-      found_entries.emplace_back(path + name);
-  }
-
-  // Release resources.
-  closedir(dir);
-#endif
-
-  return rtc::Optional<std::vector<std::string>>(std::move(found_entries));
-}
-
-bool CreateDir(const std::string& directory_name) {
-  struct stat path_info = {0};
-  // Check if the path exists already:
-  if (stat(directory_name.c_str(), &path_info) == 0) {
-    if (!S_ISDIR(path_info.st_mode)) {
-      fprintf(stderr, "Path %s exists but is not a directory! Remove this "
-              "file and re-run to create the directory.\n",
-              directory_name.c_str());
-      return false;
-    }
-  } else {
-#ifdef WIN32
-    return _mkdir(directory_name.c_str()) == 0;
-#else
-    return mkdir(directory_name.c_str(),  S_IRWXU | S_IRWXG | S_IRWXO) == 0;
-#endif
-  }
-  return true;
-}
-
-bool RemoveDir(const std::string& directory_name) {
-#ifdef WIN32
-    return RemoveDirectoryA(directory_name.c_str()) != FALSE;
-#else
-    return rmdir(directory_name.c_str()) == 0;
-#endif
-}
-
-bool RemoveFile(const std::string& file_name) {
-#ifdef WIN32
-  return DeleteFileA(file_name.c_str()) != FALSE;
-#else
-  return unlink(file_name.c_str()) == 0;
-#endif
-}
-
-std::string ResourcePath(const std::string& name,
-                         const std::string& extension) {
-#if defined(WEBRTC_IOS)
-  return IOSResourcePath(name, extension);
-#else
-  std::string platform = "win";
-#ifdef WEBRTC_LINUX
-  platform = "linux";
-#endif  // WEBRTC_LINUX
-#ifdef WEBRTC_MAC
-  platform = "mac";
-#endif  // WEBRTC_MAC
-#ifdef WEBRTC_ANDROID
-  platform = "android";
-#endif  // WEBRTC_ANDROID
-
-#ifdef WEBRTC_ARCH_64_BITS
-  std::string architecture = "64";
-#else
-  std::string architecture = "32";
-#endif  // WEBRTC_ARCH_64_BITS
-
-  std::string resources_path = ProjectRootPath() + kResourcesDirName +
-      kPathDelimiter;
-  std::string resource_file = resources_path + name + "_" + platform + "_" +
-      architecture + "." + extension;
-  if (FileExists(resource_file)) {
-    return resource_file;
-  }
-  // Try without architecture.
-  resource_file = resources_path + name + "_" + platform + "." + extension;
-  if (FileExists(resource_file)) {
-    return resource_file;
-  }
-  // Try without platform.
-  resource_file = resources_path + name + "_" + architecture + "." + extension;
-  if (FileExists(resource_file)) {
-    return resource_file;
-  }
-
-  // Fall back on name without architecture or platform.
-  return resources_path + name + "." + extension;
-#endif  // defined (WEBRTC_IOS)
-}
-
-size_t GetFileSize(const std::string& filename) {
-  FILE* f = fopen(filename.c_str(), "rb");
-  size_t size = 0;
-  if (f != NULL) {
-    if (fseek(f, 0, SEEK_END) == 0) {
-      size = ftell(f);
-    }
-    fclose(f);
-  }
-  return size;
-}
-
-}  // namespace test
-}  // namespace webrtc
diff --git a/test/testsupport/fileutils.h b/test/testsupport/fileutils.h
deleted file mode 100644
index 5ea7d31..0000000
--- a/test/testsupport/fileutils.h
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- *  Copyright (c) 2011 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 <stdio.h>
-
-#ifndef WEBRTC_TEST_TESTSUPPORT_FILEUTILS_H_
-#define WEBRTC_TEST_TESTSUPPORT_FILEUTILS_H_
-
-#include <string>
-#include <vector>
-
-#include "webrtc/api/optional.h"
-
-namespace webrtc {
-namespace test {
-
-// This is the "directory" returned if the ProjectPath() function fails
-// to find the project root.
-extern const char* kCannotFindProjectRootDir;
-
-// Creates and returns the absolute path to the output directory where log files
-// and other test artifacts should be put. The output directory is generally a
-// directory named "out" at the top-level of the project, i.e. a subfolder to
-// the path returned by ProjectRootPath(). The exception is Android where we use
-// /sdcard/ instead.
-//
-// If symbolic links occur in the path they will be resolved and the actual
-// directory will be returned.
-//
-// Returns the path WITH a trailing path delimiter. If the project root is not
-// found, the current working directory ("./") is returned as a fallback.
-std::string OutputPath();
-
-// Generates an empty file with a unique name in the specified directory and
-// returns the file name and path.
-std::string TempFilename(const std::string &dir, const std::string &prefix);
-
-// Returns a path to a resource file for the currently executing platform.
-// Adapts to what filenames are currently present in the
-// [project-root]/resources/ dir.
-// Returns an absolute path according to this priority list (the directory
-// part of the path is left out for readability):
-// 1. [name]_[platform]_[architecture].[extension]
-// 2. [name]_[platform].[extension]
-// 3. [name]_[architecture].[extension]
-// 4. [name].[extension]
-// Where
-// * platform is either of "win", "mac" or "linux".
-// * architecture is either of "32" or "64".
-//
-// Arguments:
-//    name - Name of the resource file. If a plain filename (no directory path)
-//           is supplied, the file is assumed to be located in resources/
-//           If a directory path is prepended to the filename, a subdirectory
-//           hierarchy reflecting that path is assumed to be present.
-//    extension - File extension, without the dot, i.e. "bmp" or "yuv".
-std::string ResourcePath(const std::string& name,
-                         const std::string& extension);
-
-// Gets the current working directory for the executing program.
-// Returns "./" if for some reason it is not possible to find the working
-// directory.
-std::string WorkingDir();
-
-// Reads the content of a directory and, in case of success, returns a vector
-// of strings with one element for each found file or directory. Each element is
-// a path created by prepending |dir| to the file/directory name. "." and ".."
-// are never added in the returned vector.
-rtc::Optional<std::vector<std::string>> ReadDirectory(std::string path);
-
-// Creates a directory if it not already exists.
-// Returns true if successful. Will print an error message to stderr and return
-// false if a file with the same name already exists.
-bool CreateDir(const std::string& directory_name);
-
-// Removes a directory, which must already be empty.
-bool RemoveDir(const std::string& directory_name);
-
-// Removes a file.
-bool RemoveFile(const std::string& file_name);
-
-// Checks if a file exists.
-bool FileExists(const std::string& file_name);
-
-// Checks if a directory exists.
-bool DirExists(const std::string& directory_name);
-
-// File size of the supplied file in bytes. Will return 0 if the file is
-// empty or if the file does not exist/is readable.
-size_t GetFileSize(const std::string& filename);
-
-// Sets the executable path, i.e. the path to the executable that is being used
-// when launching it. This is usually the path relative to the working directory
-// but can also be an absolute path. The intention with this function is to pass
-// the argv[0] being sent into the main function to make it possible for
-// fileutils.h to find the correct project paths even when the working directory
-// is outside the project tree (which happens in some cases).
-void SetExecutablePath(const std::string& path_to_executable);
-
-}  // namespace test
-}  // namespace webrtc
-
-#endif  // WEBRTC_TEST_TESTSUPPORT_FILEUTILS_H_
diff --git a/test/testsupport/fileutils_unittest.cc b/test/testsupport/fileutils_unittest.cc
deleted file mode 100644
index fb780be..0000000
--- a/test/testsupport/fileutils_unittest.cc
+++ /dev/null
@@ -1,240 +0,0 @@
-/*
- *  Copyright (c) 2012 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/test/testsupport/fileutils.h"
-
-#include <stdio.h>
-
-#include <fstream>
-#include <iostream>
-#include <list>
-#include <string>
-
-#include "webrtc/api/optional.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/pathutils.h"
-#include "webrtc/test/gtest.h"
-
-#ifdef WIN32
-#define chdir _chdir
-static const char* kPathDelimiter = "\\";
-#else
-static const char* kPathDelimiter = "/";
-#endif
-
-static const char kTestName[] = "fileutils_unittest";
-static const char kExtension[] = "tmp";
-
-namespace webrtc {
-namespace test {
-
-namespace {
-
-// Remove files and directories in a directory non-recursively and writes the
-// number of deleted items in |num_deleted_entries|.
-void CleanDir(const std::string& dir, size_t* num_deleted_entries) {
-  RTC_DCHECK(num_deleted_entries);
-  *num_deleted_entries = 0;
-  rtc::Optional<std::vector<std::string>> dir_content = ReadDirectory(dir);
-  EXPECT_TRUE(dir_content);
-  for (const auto& entry : *dir_content) {
-    if (DirExists(entry)) {
-      EXPECT_TRUE(RemoveDir(entry));
-      (*num_deleted_entries)++;
-    } else if (FileExists(entry)) {
-      EXPECT_TRUE(RemoveFile(entry));
-      (*num_deleted_entries)++;
-    } else {
-      FAIL();
-    }
-  }
-}
-
-void WriteStringInFile(const std::string& what, const std::string& file_path) {
-  std::ofstream out(file_path);
-  out << what;
-  out.close();
-}
-
-}  // namespace
-
-// Test fixture to restore the working directory between each test, since some
-// of them change it with chdir during execution (not restored by the
-// gtest framework).
-class FileUtilsTest : public testing::Test {
- protected:
-  FileUtilsTest() {
-  }
-  ~FileUtilsTest() override {}
-  // Runs before the first test
-  static void SetUpTestCase() {
-    original_working_dir_ = webrtc::test::WorkingDir();
-  }
-  void SetUp() override {
-    ASSERT_EQ(chdir(original_working_dir_.c_str()), 0);
-  }
-  void TearDown() override {
-    ASSERT_EQ(chdir(original_working_dir_.c_str()), 0);
-  }
- private:
-  static std::string original_working_dir_;
-};
-
-std::string FileUtilsTest::original_working_dir_ = "";
-
-// Tests that the project output dir path is returned for the default working
-// directory that is automatically set when the test executable is launched.
-// The test is not fully testing the implementation, since we cannot be sure
-// of where the executable was launched from.
-#if defined(WEBRTC_ANDROID) || defined(WEBRTC_IOS)
-#define MAYBE_OutputPathFromUnchangedWorkingDir \
-  DISABLED_OutputPathFromUnchangedWorkingDir
-#else
-#define MAYBE_OutputPathFromUnchangedWorkingDir \
-  OutputPathFromUnchangedWorkingDir
-#endif
-TEST_F(FileUtilsTest, MAYBE_OutputPathFromUnchangedWorkingDir) {
-  std::string path = webrtc::test::OutputPath();
-  std::string expected_end = "out";
-  expected_end = kPathDelimiter + expected_end + kPathDelimiter;
-  ASSERT_EQ(path.length() - expected_end.length(), path.find(expected_end));
-}
-
-// Tests with current working directory set to a directory higher up in the
-// directory tree than the project root dir.
-#if defined(WEBRTC_ANDROID) || defined(WIN32) || defined(WEBRTC_IOS)
-#define MAYBE_OutputPathFromRootWorkingDir DISABLED_OutputPathFromRootWorkingDir
-#else
-#define MAYBE_OutputPathFromRootWorkingDir OutputPathFromRootWorkingDir
-#endif
-TEST_F(FileUtilsTest, MAYBE_OutputPathFromRootWorkingDir) {
-  ASSERT_EQ(0, chdir(kPathDelimiter));
-  ASSERT_EQ("./", webrtc::test::OutputPath());
-}
-
-TEST_F(FileUtilsTest, TempFilename) {
-  std::string temp_filename = webrtc::test::TempFilename(
-      webrtc::test::OutputPath(), "TempFilenameTest");
-  ASSERT_TRUE(webrtc::test::FileExists(temp_filename))
-      << "Couldn't find file: " << temp_filename;
-  remove(temp_filename.c_str());
-}
-
-// Only tests that the code executes
-#if defined(WEBRTC_IOS)
-#define MAYBE_CreateDir DISABLED_CreateDir
-#else
-#define MAYBE_CreateDir CreateDir
-#endif
-TEST_F(FileUtilsTest, MAYBE_CreateDir) {
-  std::string directory = "fileutils-unittest-empty-dir";
-  // Make sure it's removed if a previous test has failed:
-  remove(directory.c_str());
-  ASSERT_TRUE(webrtc::test::CreateDir(directory));
-  remove(directory.c_str());
-}
-
-TEST_F(FileUtilsTest, WorkingDirReturnsValue) {
-  // Hard to cover all platforms. Just test that it returns something without
-  // crashing:
-  std::string working_dir = webrtc::test::WorkingDir();
-  ASSERT_GT(working_dir.length(), 0u);
-}
-
-// Due to multiple platforms, it is hard to make a complete test for
-// ResourcePath. Manual testing has been performed by removing files and
-// verified the result confirms with the specified documentation for the
-// function.
-TEST_F(FileUtilsTest, ResourcePathReturnsValue) {
-  std::string resource = webrtc::test::ResourcePath(kTestName, kExtension);
-  ASSERT_GT(resource.find(kTestName), 0u);
-  ASSERT_GT(resource.find(kExtension), 0u);
-}
-
-TEST_F(FileUtilsTest, ResourcePathFromRootWorkingDir) {
-  ASSERT_EQ(0, chdir(kPathDelimiter));
-  std::string resource = webrtc::test::ResourcePath(kTestName, kExtension);
-#if !defined(WEBRTC_IOS)
-  ASSERT_NE(resource.find("resources"), std::string::npos);
-#endif
-  ASSERT_GT(resource.find(kTestName), 0u);
-  ASSERT_GT(resource.find(kExtension), 0u);
-}
-
-TEST_F(FileUtilsTest, GetFileSizeExistingFile) {
-  // Create a file with some dummy data in.
-  std::string temp_filename = webrtc::test::TempFilename(
-      webrtc::test::OutputPath(), "fileutils_unittest");
-  FILE* file = fopen(temp_filename.c_str(), "wb");
-  ASSERT_TRUE(file != NULL) << "Failed to open file: " << temp_filename;
-  ASSERT_GT(fprintf(file, "%s",  "Dummy data"), 0) <<
-      "Failed to write to file: " << temp_filename;
-  fclose(file);
-  ASSERT_GT(webrtc::test::GetFileSize(std::string(temp_filename.c_str())), 0u);
-  remove(temp_filename.c_str());
-}
-
-TEST_F(FileUtilsTest, GetFileSizeNonExistingFile) {
-  ASSERT_EQ(0u, webrtc::test::GetFileSize("non-existing-file.tmp"));
-}
-
-TEST_F(FileUtilsTest, DirExists) {
-  // Check that an existing directory is recognized as such.
-  ASSERT_TRUE(webrtc::test::DirExists(webrtc::test::OutputPath()))
-      << "Existing directory not found";
-
-  // Check that a non-existing directory is recognized as such.
-  std::string directory = "direxists-unittest-non_existing-dir";
-  ASSERT_FALSE(webrtc::test::DirExists(directory))
-      << "Non-existing directory found";
-
-  // Check that an existing file is not recognized as an existing directory.
-  std::string temp_filename = webrtc::test::TempFilename(
-      webrtc::test::OutputPath(), "TempFilenameTest");
-  ASSERT_TRUE(webrtc::test::FileExists(temp_filename))
-      << "Couldn't find file: " << temp_filename;
-  ASSERT_FALSE(webrtc::test::DirExists(temp_filename))
-      << "Existing file recognized as existing directory";
-  remove(temp_filename.c_str());
-}
-
-TEST_F(FileUtilsTest, WriteReadDeleteFilesAndDirs) {
-  size_t num_deleted_entries;
-
-  // Create an empty temporary directory for this test.
-  const std::string temp_directory =
-      OutputPath() + "TempFileUtilsTestReadDirectory" + kPathDelimiter;
-  CreateDir(temp_directory);
-  EXPECT_NO_FATAL_FAILURE(CleanDir(temp_directory, &num_deleted_entries));
-  EXPECT_TRUE(DirExists(temp_directory));
-
-  // Add a file.
-  const std::string temp_filename = temp_directory + "TempFilenameTest";
-  WriteStringInFile("test\n", temp_filename);
-  EXPECT_TRUE(FileExists(temp_filename));
-
-  // Add an empty directory.
-  const std::string temp_subdir = temp_directory + "subdir" + kPathDelimiter;
-  EXPECT_TRUE(CreateDir(temp_subdir));
-  EXPECT_TRUE(DirExists(temp_subdir));
-
-  // Checks.
-  rtc::Optional<std::vector<std::string>> dir_content =
-      ReadDirectory(temp_directory);
-  EXPECT_TRUE(dir_content);
-  EXPECT_EQ(2u, dir_content->size());
-  EXPECT_NO_FATAL_FAILURE(CleanDir(temp_directory, &num_deleted_entries));
-  EXPECT_EQ(2u, num_deleted_entries);
-  EXPECT_TRUE(RemoveDir(temp_directory));
-  EXPECT_FALSE(DirExists(temp_directory));
-}
-
-}  // namespace test
-}  // namespace webrtc
diff --git a/test/testsupport/frame_reader.h b/test/testsupport/frame_reader.h
deleted file mode 100644
index a8fe73f..0000000
--- a/test/testsupport/frame_reader.h
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- *  Copyright (c) 2011 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_TEST_TESTSUPPORT_FRAME_READER_H_
-#define WEBRTC_TEST_TESTSUPPORT_FRAME_READER_H_
-
-#include <stdio.h>
-
-#include <string>
-
-#include "webrtc/rtc_base/scoped_ref_ptr.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-class I420Buffer;
-namespace test {
-
-// Handles reading of I420 frames from video files.
-class FrameReader {
- public:
-  virtual ~FrameReader() {}
-
-  // Initializes the frame reader, i.e. opens the input file.
-  // This must be called before reading of frames has started.
-  // Returns false if an error has occurred, in addition to printing to stderr.
-  virtual bool Init() = 0;
-
-  // Reads a frame from the input file. On success, returns the frame.
-  // Returns nullptr if encountering end of file or a read error.
-  virtual rtc::scoped_refptr<I420Buffer> ReadFrame() = 0;
-
-  // Closes the input file if open. Essentially makes this class impossible
-  // to use anymore. Will also be invoked by the destructor.
-  virtual void Close() = 0;
-
-  // Frame length in bytes of a single frame image.
-  virtual size_t FrameLength() = 0;
-  // Total number of frames in the input video source.
-  virtual int NumberOfFrames() = 0;
-};
-
-class YuvFrameReaderImpl : public FrameReader {
- public:
-  // Creates a file handler. The input file is assumed to exist and be readable.
-  // Parameters:
-  //   input_filename          The file to read from.
-  //   width, height           Size of each frame to read.
-  YuvFrameReaderImpl(std::string input_filename, int width, int height);
-  ~YuvFrameReaderImpl() override;
-  bool Init() override;
-  rtc::scoped_refptr<I420Buffer> ReadFrame() override;
-  void Close() override;
-  size_t FrameLength() override;
-  int NumberOfFrames() override;
-
- private:
-  const std::string input_filename_;
-  size_t frame_length_in_bytes_;
-  const int width_;
-  const int height_;
-  int number_of_frames_;
-  FILE* input_file_;
-};
-
-}  // namespace test
-}  // namespace webrtc
-
-#endif  // WEBRTC_TEST_TESTSUPPORT_FRAME_READER_H_
diff --git a/test/testsupport/frame_writer.h b/test/testsupport/frame_writer.h
deleted file mode 100644
index faab50e..0000000
--- a/test/testsupport/frame_writer.h
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- *  Copyright (c) 2012 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_TEST_TESTSUPPORT_FRAME_WRITER_H_
-#define WEBRTC_TEST_TESTSUPPORT_FRAME_WRITER_H_
-
-#include <stdio.h>
-
-#include <string>
-
-#include "webrtc/api/video/video_frame.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-namespace test {
-
-// Handles writing of video files.
-class FrameWriter {
- public:
-  virtual ~FrameWriter() {}
-
-  // Initializes the file handler, i.e. opens the input and output files etc.
-  // This must be called before reading or writing frames has started.
-  // Returns false if an error has occurred, in addition to printing to stderr.
-  virtual bool Init() = 0;
-
-  // Writes a frame of the configured frame length to the output file.
-  // Returns true if the write was successful, false otherwise.
-  virtual bool WriteFrame(uint8_t* frame_buffer) = 0;
-
-  // Closes the output file if open. Essentially makes this class impossible
-  // to use anymore. Will also be invoked by the destructor.
-  virtual void Close() = 0;
-
-  // Frame length in bytes of a single frame image.
-  virtual size_t FrameLength() = 0;
-};
-
-// Writes raw I420 frames in sequence.
-class YuvFrameWriterImpl : public FrameWriter {
- public:
-  // Creates a file handler. The input file is assumed to exist and be readable
-  // and the output file must be writable.
-  // Parameters:
-  //   output_filename         The file to write. Will be overwritten if already
-  //                           existing.
-  //   width, height           Size of each frame to read.
-  YuvFrameWriterImpl(std::string output_filename, int width, int height);
-  ~YuvFrameWriterImpl() override;
-  bool Init() override;
-  bool WriteFrame(uint8_t* frame_buffer) override;
-  void Close() override;
-  size_t FrameLength() override;
-
- protected:
-  const std::string output_filename_;
-  size_t frame_length_in_bytes_;
-  const int width_;
-  const int height_;
-  FILE* output_file_;
-};
-
-// Writes raw I420 frames in sequence, but with Y4M file and frame headers for
-// more convenient playback in external media players.
-class Y4mFrameWriterImpl : public YuvFrameWriterImpl {
- public:
-  Y4mFrameWriterImpl(std::string output_filename,
-                     int width,
-                     int height,
-                     int frame_rate);
-  ~Y4mFrameWriterImpl() override;
-  bool Init() override;
-  bool WriteFrame(uint8_t* frame_buffer) override;
-
- private:
-  const int frame_rate_;
-};
-
-// LibJpeg is not available on iOS. This class will do nothing on iOS.
-class JpegFrameWriter {
- public:
-  JpegFrameWriter(const std::string &output_filename);
-  // Quality can be from 0 (worst) to 100 (best). Best quality is still lossy.
-  // WriteFrame can be called only once. Subsequent calls will fail.
-  bool WriteFrame(const VideoFrame& input_frame, int quality);
-
-#if !defined(WEBRTC_IOS)
- private:
-  bool frame_written_;
-  const std::string output_filename_;
-  FILE* output_file_;
-#endif
-};
-
-}  // namespace test
-}  // namespace webrtc
-
-#endif  // WEBRTC_TEST_TESTSUPPORT_FRAME_WRITER_H_
diff --git a/test/testsupport/iosfileutils.mm b/test/testsupport/iosfileutils.mm
deleted file mode 100644
index b3262c5..0000000
--- a/test/testsupport/iosfileutils.mm
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- *  Copyright 2015 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.
- */
-
-#if defined(WEBRTC_IOS)
-
-#import <Foundation/Foundation.h>
-#include <string.h>
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/sdk/objc/Framework/Classes/Common/helpers.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-namespace test {
-
-using webrtc::ios::NSStringFromStdString;
-using webrtc::ios::StdStringFromNSString;
-
-// For iOS, resource files are added to the application bundle in the root
-// and not in separate folders as is the case for other platforms. This method
-// therefore removes any prepended folders and uses only the actual file name.
-std::string IOSResourcePath(std::string name, std::string extension) {
-  @autoreleasepool {
-    NSString* path = NSStringFromStdString(name);
-    NSString* fileName = path.lastPathComponent;
-    NSString* fileType = NSStringFromStdString(extension);
-    // Get full pathname for the resource identified by the name and extension.
-    NSString* pathString = [[NSBundle mainBundle] pathForResource:fileName
-                                                           ofType:fileType];
-    return StdStringFromNSString(pathString);
-  }
-}
-
-std::string IOSRootPath() {
-  @autoreleasepool {
-    NSBundle* mainBundle = [NSBundle mainBundle];
-    return StdStringFromNSString(mainBundle.bundlePath) + "/";
-  }
-}
-
-// For iOS, we don't have access to the output directory. Return the path to the
-// temporary directory instead. This is mostly used by tests that need to write
-// output files to disk.
-std::string IOSOutputPath()  {
-  @autoreleasepool {
-    NSString* tempDir = NSTemporaryDirectory();
-    if (tempDir == nil)
-        tempDir = @"/tmp";
-    return StdStringFromNSString(tempDir);
-  }
-}
-
-}  // namespace test
-}  // namespace webrtc
-
-#endif  // defined(WEBRTC_IOS)
diff --git a/test/testsupport/jpeg_frame_writer.cc b/test/testsupport/jpeg_frame_writer.cc
deleted file mode 100644
index 8174cc2..0000000
--- a/test/testsupport/jpeg_frame_writer.cc
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- *  Copyright (c) 2017 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 <stdio.h>
-
-
-#include "webrtc/common_types.h"
-#include "webrtc/common_video/libyuv/include/webrtc_libyuv.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/test/testsupport/frame_writer.h"
-
-extern "C" {
-#if defined(USE_SYSTEM_LIBJPEG)
-#include <jpeglib.h>
-#else
-// Include directory supplied by gn
-#include "jpeglib.h"  // NOLINT
-#endif
-}
-
-namespace webrtc {
-namespace test {
-
-JpegFrameWriter::JpegFrameWriter(const std::string &output_filename)
-    : frame_written_(false),
-      output_filename_(output_filename),
-      output_file_(nullptr) {}
-
-bool JpegFrameWriter::WriteFrame(const VideoFrame& input_frame, int quality) {
-  if (frame_written_) {
-    LOG(LS_ERROR) << "Only a single frame can be saved to Jpeg.";
-    return false;
-  }
-  const int kColorPlanes = 3;  // R, G and B.
-  size_t rgb_len = input_frame.height() * input_frame.width() * kColorPlanes;
-  std::unique_ptr<uint8_t[]> rgb_buf(new uint8_t[rgb_len]);
-
-  // kRGB24 actually corresponds to FourCC 24BG which is 24-bit BGR.
-  if (ConvertFromI420(input_frame, VideoType::kRGB24, 0, rgb_buf.get()) < 0) {
-    LOG(LS_ERROR) << "Could not convert input frame to RGB.";
-    return false;
-  }
-  output_file_ = fopen(output_filename_.c_str(), "wb");
-  if (!output_file_) {
-    LOG(LS_ERROR) << "Couldn't open file to write jpeg frame to:" <<
-        output_filename_;
-    return false;
-  }
-
-  // Invoking LIBJPEG
-  struct jpeg_compress_struct cinfo;
-  struct jpeg_error_mgr jerr;
-  JSAMPROW row_pointer[1];
-  cinfo.err = jpeg_std_error(&jerr);
-  jpeg_create_compress(&cinfo);
-
-  jpeg_stdio_dest(&cinfo, output_file_);
-
-  cinfo.image_width = input_frame.width();
-  cinfo.image_height = input_frame.height();
-  cinfo.input_components = kColorPlanes;
-  cinfo.in_color_space = JCS_EXT_BGR;
-  jpeg_set_defaults(&cinfo);
-  jpeg_set_quality(&cinfo, quality, TRUE);
-
-  jpeg_start_compress(&cinfo, TRUE);
-  int row_stride = input_frame.width() * kColorPlanes;
-  while (cinfo.next_scanline < cinfo.image_height) {
-    row_pointer[0] = &rgb_buf.get()[cinfo.next_scanline * row_stride];
-    jpeg_write_scanlines(&cinfo, row_pointer, 1);
-  }
-
-  jpeg_finish_compress(&cinfo);
-  jpeg_destroy_compress(&cinfo);
-  fclose(output_file_);
-
-  frame_written_ = true;
-  return true;
-}
-
-}  // namespace test
-}  // namespace webrtc
diff --git a/test/testsupport/jpeg_frame_writer_ios.cc b/test/testsupport/jpeg_frame_writer_ios.cc
deleted file mode 100644
index 835a8ad..0000000
--- a/test/testsupport/jpeg_frame_writer_ios.cc
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- *  Copyright (c) 2017 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/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/test/testsupport/frame_writer.h"
-
-
-namespace webrtc {
-namespace test {
-
-JpegFrameWriter::JpegFrameWriter(const std::string& /*output_filename*/) {}
-
-bool JpegFrameWriter::WriteFrame(const VideoFrame& /*input_frame*/,
-                                 int /*quality*/) {
-  LOG(LS_WARNING) << "Libjpeg isn't available on IOS. Jpeg frame writer is not "
-      "supported. No frame will be saved.";
-  // Don't fail.
-  return true;
-}
-
-}  // namespace test
-}  // namespace webrtc
diff --git a/test/testsupport/metrics/video_metrics.cc b/test/testsupport/metrics/video_metrics.cc
deleted file mode 100644
index e150f36..0000000
--- a/test/testsupport/metrics/video_metrics.cc
+++ /dev/null
@@ -1,193 +0,0 @@
-/*
- *  Copyright (c) 2012 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/test/testsupport/metrics/video_metrics.h"
-
-#include <assert.h>
-#include <stdio.h>
-
-#include <algorithm>  // min_element, max_element
-#include <memory>
-
-#include "webrtc/api/video/i420_buffer.h"
-#include "webrtc/api/video/video_frame.h"
-#include "webrtc/common_video/libyuv/include/webrtc_libyuv.h"
-#include "webrtc/test/frame_utils.h"
-#include "libyuv/convert.h"
-
-namespace webrtc {
-namespace test {
-
-// Copy here so our callers won't need to include libyuv for this constant.
-double kMetricsPerfectPSNR = kPerfectPSNR;
-
-// Used for calculating min and max values.
-static bool LessForFrameResultValue(const FrameResult& s1,
-                                    const FrameResult& s2) {
-  return s1.value < s2.value;
-}
-
-enum VideoMetricsType { kPSNR, kSSIM, kBoth };
-
-// Calculates metrics for a frame and adds statistics to the result for it.
-void CalculateFrame(VideoMetricsType video_metrics_type,
-                    const I420BufferInterface& ref,
-                    const I420BufferInterface& test,
-                    int frame_number,
-                    QualityMetricsResult* result) {
-  FrameResult frame_result = {0, 0};
-  frame_result.frame_number = frame_number;
-  switch (video_metrics_type) {
-    case kPSNR:
-      frame_result.value = I420PSNR(ref, test);
-      break;
-    case kSSIM:
-      frame_result.value = I420SSIM(ref, test);
-      break;
-    default:
-      assert(false);
-  }
-  result->frames.push_back(frame_result);
-}
-
-// Calculates average, min and max values for the supplied struct, if non-NULL.
-void CalculateStats(QualityMetricsResult* result) {
-  if (result == NULL || result->frames.size() == 0) {
-    return;
-  }
-  // Calculate average.
-  std::vector<FrameResult>::iterator iter;
-  double metrics_values_sum = 0.0;
-  for (iter = result->frames.begin(); iter != result->frames.end(); ++iter) {
-    metrics_values_sum += iter->value;
-  }
-  result->average = metrics_values_sum / result->frames.size();
-
-  // Calculate min/max statistics.
-  iter = std::min_element(result->frames.begin(), result->frames.end(),
-                     LessForFrameResultValue);
-  result->min = iter->value;
-  result->min_frame_number = iter->frame_number;
-  iter = std::max_element(result->frames.begin(), result->frames.end(),
-                     LessForFrameResultValue);
-  result->max = iter->value;
-  result->max_frame_number = iter->frame_number;
-}
-
-// Single method that handles all combinations of video metrics calculation, to
-// minimize code duplication. Either psnr_result or ssim_result may be NULL,
-// depending on which VideoMetricsType is targeted.
-int CalculateMetrics(VideoMetricsType video_metrics_type,
-                     const char* ref_filename,
-                     const char* test_filename,
-                     int width,
-                     int height,
-                     QualityMetricsResult* psnr_result,
-                     QualityMetricsResult* ssim_result) {
-  assert(ref_filename != NULL);
-  assert(test_filename != NULL);
-  assert(width > 0);
-  assert(height > 0);
-
-  FILE* ref_fp = fopen(ref_filename, "rb");
-  if (ref_fp == NULL) {
-    // Cannot open reference file.
-    fprintf(stderr, "Cannot open file %s\n", ref_filename);
-    return -1;
-  }
-  FILE* test_fp = fopen(test_filename, "rb");
-  if (test_fp == NULL) {
-    // Cannot open test file.
-    fprintf(stderr, "Cannot open file %s\n", test_filename);
-    fclose(ref_fp);
-    return -2;
-  }
-  int frame_number = 0;
-
-  // Read reference and test frames.
-  for (;;) {
-    rtc::scoped_refptr<I420Buffer> ref_i420_buffer(
-        test::ReadI420Buffer(width, height, ref_fp));
-    if (!ref_i420_buffer)
-      break;
-
-    rtc::scoped_refptr<I420Buffer> test_i420_buffer(
-        test::ReadI420Buffer(width, height, test_fp));
-
-    if (!test_i420_buffer)
-      break;
-
-    switch (video_metrics_type) {
-      case kPSNR:
-        CalculateFrame(kPSNR, *ref_i420_buffer, *test_i420_buffer, frame_number,
-                       psnr_result);
-        break;
-      case kSSIM:
-        CalculateFrame(kSSIM, *ref_i420_buffer, *test_i420_buffer, frame_number,
-                       ssim_result);
-        break;
-      case kBoth:
-        CalculateFrame(kPSNR, *ref_i420_buffer, *test_i420_buffer, frame_number,
-                       psnr_result);
-        CalculateFrame(kSSIM, *ref_i420_buffer, *test_i420_buffer, frame_number,
-                       ssim_result);
-        break;
-    }
-    frame_number++;
-  }
-  int return_code = 0;
-  if (frame_number == 0) {
-    fprintf(stderr, "Tried to measure video metrics from empty files "
-            "(reference file: %s  test file: %s)\n", ref_filename,
-            test_filename);
-    return_code = -3;
-  } else {
-    CalculateStats(psnr_result);
-    CalculateStats(ssim_result);
-  }
-  fclose(ref_fp);
-  fclose(test_fp);
-  return return_code;
-}
-
-int I420MetricsFromFiles(const char* ref_filename,
-                         const char* test_filename,
-                         int width,
-                         int height,
-                         QualityMetricsResult* psnr_result,
-                         QualityMetricsResult* ssim_result) {
-  assert(psnr_result != NULL);
-  assert(ssim_result != NULL);
-  return CalculateMetrics(kBoth, ref_filename, test_filename, width, height,
-                          psnr_result, ssim_result);
-}
-
-int I420PSNRFromFiles(const char* ref_filename,
-                      const char* test_filename,
-                      int width,
-                      int height,
-                      QualityMetricsResult* result) {
-  assert(result != NULL);
-  return CalculateMetrics(kPSNR, ref_filename, test_filename, width, height,
-                          result, NULL);
-}
-
-int I420SSIMFromFiles(const char* ref_filename,
-                      const char* test_filename,
-                      int width,
-                      int height,
-                      QualityMetricsResult* result) {
-  assert(result != NULL);
-  return CalculateMetrics(kSSIM, ref_filename, test_filename, width, height,
-                          NULL, result);
-}
-
-}  // namespace test
-}  // namespace webrtc
diff --git a/test/testsupport/metrics/video_metrics.h b/test/testsupport/metrics/video_metrics.h
deleted file mode 100644
index 8448ccf..0000000
--- a/test/testsupport/metrics/video_metrics.h
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- *  Copyright (c) 2011 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_TESTSUPPORT_METRICS_VIDEO_METRICS_H_
-#define WEBRTC_TESTSUPPORT_METRICS_VIDEO_METRICS_H_
-
-#include <limits>
-#include <vector>
-
-namespace webrtc {
-namespace test {
-
-// The highest PSNR value our algorithms will return.
-extern double kMetricsPerfectPSNR;
-
-// Contains video quality metrics result for a single frame.
-struct FrameResult {
-  int frame_number;
-  double value;
-};
-
-// Result from a PSNR/SSIM calculation operation.
-// The frames in this data structure are 0-indexed.
-struct QualityMetricsResult {
-  QualityMetricsResult() :
-    average(0.0),
-    min(std::numeric_limits<double>::max()),
-    max(std::numeric_limits<double>::min()),
-    min_frame_number(-1),
-    max_frame_number(-1)
-  {};
-  double average;
-  double min;
-  double max;
-  int min_frame_number;
-  int max_frame_number;
-  std::vector<FrameResult> frames;
-};
-
-// Calculates PSNR and SSIM values for the reference and test video files
-// (must be in I420 format). All calculated values are filled into the
-// QualityMetricsResult structs.
-//
-// PSNR values have the unit decibel (dB) where a high value means the test file
-// is similar to the reference file. The higher value, the more similar. The
-// maximum PSNR value is kMetricsInfinitePSNR. For more info about PSNR, see
-// http://en.wikipedia.org/wiki/PSNR.
-//
-// SSIM values range between -1.0 and 1.0, where 1.0 means the files are
-// identical. For more info about SSIM, see http://en.wikipedia.org/wiki/SSIM
-// This function only compares video frames up to the point when the shortest
-// video ends.
-// Return value:
-//  0 if successful, negative on errors:
-// -1 if the source file cannot be opened
-// -2 if the test file cannot be opened
-// -3 if any of the files are empty
-// -4 if any arguments are invalid.
-int I420MetricsFromFiles(const char* ref_filename,
-                         const char* test_filename,
-                         int width,
-                         int height,
-                         QualityMetricsResult* psnr_result,
-                         QualityMetricsResult* ssim_result);
-
-// Calculates PSNR values for the reference and test video files (must be in
-// I420 format). All calculated values are filled into the QualityMetricsResult
-// struct.
-//
-// PSNR values have the unit decibel (dB) where a high value means the test file
-// is similar to the reference file. The higher value, the more similar. The
-// maximum PSNR value is kMetricsInfinitePSNR. For more info about PSNR, see
-// http://en.wikipedia.org/wiki/PSNR.
-//
-// This function only compares video frames up to the point when the shortest
-// video ends.
-//
-// Return value:
-//  0 if successful, negative on errors:
-// -1 if the source file cannot be opened
-// -2 if the test file cannot be opened
-// -3 if any of the files are empty
-// -4 if any arguments are invalid.
-int I420PSNRFromFiles(const char* ref_filename,
-                      const char* test_filename,
-                      int width,
-                      int height,
-                      QualityMetricsResult* result);
-
-// Calculates SSIM values for the reference and test video files (must be in
-// I420 format). All calculated values are filled into the QualityMetricsResult
-// struct.
-// SSIM values range between -1.0 and 1.0, where 1.0 means the files are
-// identical.
-// This function only compares video frames up to the point when the shortest
-// video ends.
-// For more info about SSIM, see http://en.wikipedia.org/wiki/SSIM
-//
-// Return value:
-//  0 if successful, negative on errors:
-// -1 if the source file cannot be opened
-// -2 if the test file cannot be opened
-// -3 if any of the files are empty
-// -4 if any arguments are invalid.
-int I420SSIMFromFiles(const char* ref_filename,
-                      const char* test_filename,
-                      int width,
-                      int height,
-                      QualityMetricsResult* result);
-
-}  // namespace test
-}  // namespace webrtc
-
-#endif // WEBRTC_TESTSUPPORT_METRICS_VIDEO_METRICS_H_
diff --git a/test/testsupport/metrics/video_metrics_unittest.cc b/test/testsupport/metrics/video_metrics_unittest.cc
deleted file mode 100644
index 83a34a3..0000000
--- a/test/testsupport/metrics/video_metrics_unittest.cc
+++ /dev/null
@@ -1,147 +0,0 @@
-/*
- *  Copyright (c) 2011 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/test/testsupport/metrics/video_metrics.h"
-
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/testsupport/fileutils.h"
-
-namespace webrtc {
-
-static const int kWidth = 352;
-static const int kHeight = 288;
-
-static const int kMissingReferenceFileReturnCode = -1;
-static const int kMissingTestFileReturnCode = -2;
-static const int kEmptyFileReturnCode = -3;
-static const double kPsnrPerfectResult =  48.0;
-static const double kSsimPerfectResult = 1.0;
-
-class VideoMetricsTest: public testing::Test {
- protected:
-  VideoMetricsTest() {
-    video_file_ = webrtc::test::ResourcePath("foreman_cif_short", "yuv");
-  }
-  virtual ~VideoMetricsTest() {}
-  void SetUp() {
-    non_existing_file_ = webrtc::test::OutputPath() +
-        "video_metrics_unittest_non_existing";
-    remove(non_existing_file_.c_str());  // To be sure it doesn't exist.
-
-    // Create an empty file:
-    empty_file_ = webrtc::test::TempFilename(
-        webrtc::test::OutputPath(), "video_metrics_unittest_empty_file");
-    FILE* dummy = fopen(empty_file_.c_str(), "wb");
-    fclose(dummy);
-  }
-  void TearDown() {
-    remove(empty_file_.c_str());
-  }
-  webrtc::test::QualityMetricsResult psnr_result_;
-  webrtc::test::QualityMetricsResult ssim_result_;
-  std::string non_existing_file_;
-  std::string empty_file_;
-  std::string video_file_;
-};
-
-// Tests that it is possible to run with the same reference as test file
-TEST_F(VideoMetricsTest, ReturnsPerfectResultForIdenticalFilesPSNR) {
-  EXPECT_EQ(0, I420PSNRFromFiles(video_file_.c_str(), video_file_.c_str(),
-                                 kWidth, kHeight, &psnr_result_));
-  EXPECT_EQ(kPsnrPerfectResult, psnr_result_.average);
-}
-
-TEST_F(VideoMetricsTest, ReturnsPerfectResultForIdenticalFilesSSIM) {
-  EXPECT_EQ(0, I420SSIMFromFiles(video_file_.c_str(), video_file_.c_str(),
-                                 kWidth, kHeight, &ssim_result_));
-  EXPECT_EQ(kSsimPerfectResult, ssim_result_.average);
-}
-
-TEST_F(VideoMetricsTest, ReturnsPerfectResultForIdenticalFilesBothMetrics) {
-  EXPECT_EQ(0, I420MetricsFromFiles(video_file_.c_str(), video_file_.c_str(),
-                                    kWidth, kHeight, &psnr_result_,
-                                    &ssim_result_));
-  EXPECT_EQ(kPsnrPerfectResult, psnr_result_.average);
-  EXPECT_EQ(kSsimPerfectResult, ssim_result_.average);
-}
-
-// Tests that the right return code is given when the reference file is missing.
-TEST_F(VideoMetricsTest, MissingReferenceFilePSNR) {
-  EXPECT_EQ(kMissingReferenceFileReturnCode,
-            I420PSNRFromFiles(non_existing_file_.c_str(),
-                              video_file_.c_str(), kWidth, kHeight,
-                              &ssim_result_));
-}
-
-TEST_F(VideoMetricsTest, MissingReferenceFileSSIM) {
-  EXPECT_EQ(kMissingReferenceFileReturnCode,
-            I420SSIMFromFiles(non_existing_file_.c_str(),
-                              video_file_.c_str(), kWidth, kHeight,
-                              &ssim_result_));
-}
-
-TEST_F(VideoMetricsTest, MissingReferenceFileBothMetrics) {
-  EXPECT_EQ(kMissingReferenceFileReturnCode,
-            I420MetricsFromFiles(non_existing_file_.c_str(),
-                                 video_file_.c_str(), kWidth, kHeight,
-                                 &psnr_result_, &ssim_result_));
-}
-
-// Tests that the right return code is given when the test file is missing.
-TEST_F(VideoMetricsTest, MissingTestFilePSNR) {
-  EXPECT_EQ(kMissingTestFileReturnCode,
-            I420PSNRFromFiles(video_file_.c_str(), non_existing_file_.c_str(),
-                              kWidth, kHeight, &ssim_result_));
-}
-
-TEST_F(VideoMetricsTest, MissingTestFileSSIM) {
-  EXPECT_EQ(kMissingTestFileReturnCode,
-            I420SSIMFromFiles(video_file_.c_str(), non_existing_file_.c_str(),
-                              kWidth, kHeight, &ssim_result_));
-}
-
-TEST_F(VideoMetricsTest, MissingTestFileBothMetrics) {
-  EXPECT_EQ(kMissingTestFileReturnCode,
-            I420MetricsFromFiles(video_file_.c_str(),
-                                 non_existing_file_.c_str(), kWidth, kHeight,
-                                 &psnr_result_, &ssim_result_));
-}
-
-// Tests that the method can be executed with empty files.
-TEST_F(VideoMetricsTest, EmptyFilesPSNR) {
-  EXPECT_EQ(kEmptyFileReturnCode,
-            I420PSNRFromFiles(empty_file_.c_str(), video_file_.c_str(),
-                              kWidth, kHeight, &ssim_result_));
-  EXPECT_EQ(kEmptyFileReturnCode,
-            I420PSNRFromFiles(video_file_.c_str(), empty_file_.c_str(),
-                              kWidth, kHeight, &ssim_result_));
-}
-
-TEST_F(VideoMetricsTest, EmptyFilesSSIM) {
-  EXPECT_EQ(kEmptyFileReturnCode,
-            I420SSIMFromFiles(empty_file_.c_str(), video_file_.c_str(),
-                              kWidth, kHeight, &ssim_result_));
-  EXPECT_EQ(kEmptyFileReturnCode,
-            I420SSIMFromFiles(video_file_.c_str(), empty_file_.c_str(),
-                              kWidth, kHeight, &ssim_result_));
-}
-
-TEST_F(VideoMetricsTest, EmptyFilesBothMetrics) {
-  EXPECT_EQ(kEmptyFileReturnCode,
-            I420MetricsFromFiles(empty_file_.c_str(), video_file_.c_str(),
-                                 kWidth, kHeight,
-                                 &psnr_result_, &ssim_result_));
-  EXPECT_EQ(kEmptyFileReturnCode,
-              I420MetricsFromFiles(video_file_.c_str(), empty_file_.c_str(),
-                                   kWidth, kHeight,
-                                   &psnr_result_, &ssim_result_));
-}
-
-}  // namespace webrtc
diff --git a/test/testsupport/mock/mock_frame_reader.h b/test/testsupport/mock/mock_frame_reader.h
deleted file mode 100644
index 5fd2873..0000000
--- a/test/testsupport/mock/mock_frame_reader.h
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- *  Copyright (c) 2011 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_TEST_TESTSUPPORT_MOCK_MOCK_FRAME_READER_H_
-#define WEBRTC_TEST_TESTSUPPORT_MOCK_MOCK_FRAME_READER_H_
-
-#include "webrtc/test/testsupport/frame_reader.h"
-
-#include "webrtc/test/gmock.h"
-
-namespace webrtc {
-namespace test {
-
-class MockFrameReader : public FrameReader {
- public:
-  MOCK_METHOD0(Init, bool());
-  MOCK_METHOD0(ReadFrame, rtc::scoped_refptr<I420Buffer>());
-  MOCK_METHOD0(Close, void());
-  MOCK_METHOD0(FrameLength, size_t());
-  MOCK_METHOD0(NumberOfFrames, int());
-};
-
-}  // namespace test
-}  // namespace webrtc
-
-#endif  // WEBRTC_TEST_TESTSUPPORT_MOCK_MOCK_FRAME_READER_H_
diff --git a/test/testsupport/mock/mock_frame_writer.h b/test/testsupport/mock/mock_frame_writer.h
deleted file mode 100644
index 8ba96bc..0000000
--- a/test/testsupport/mock/mock_frame_writer.h
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- *  Copyright (c) 2011 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_TEST_TESTSUPPORT_MOCK_MOCK_FRAME_WRITER_H_
-#define WEBRTC_TEST_TESTSUPPORT_MOCK_MOCK_FRAME_WRITER_H_
-
-#include "webrtc/test/testsupport/frame_writer.h"
-
-#include "webrtc/test/gmock.h"
-
-namespace webrtc {
-namespace test {
-
-class MockFrameWriter : public FrameWriter {
- public:
-  MOCK_METHOD0(Init, bool());
-  MOCK_METHOD1(WriteFrame, bool(uint8_t* frame_buffer));
-  MOCK_METHOD0(Close, void());
-  MOCK_METHOD0(FrameLength, size_t());
-};
-
-}  // namespace test
-}  // namespace webrtc
-
-#endif  // WEBRTC_TEST_TESTSUPPORT_MOCK_MOCK_FRAME_WRITER_H_
diff --git a/test/testsupport/packet_reader.cc b/test/testsupport/packet_reader.cc
deleted file mode 100644
index e27ec22..0000000
--- a/test/testsupport/packet_reader.cc
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- *  Copyright (c) 2011 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/test/testsupport/packet_reader.h"
-
-#include <assert.h>
-#include <stdio.h>
-#include <algorithm>
-
-namespace webrtc {
-namespace test {
-
-PacketReader::PacketReader()
-    : initialized_(false) {}
-
-PacketReader::~PacketReader() {}
-
-void PacketReader::InitializeReading(uint8_t* data,
-                                     size_t data_length_in_bytes,
-                                     size_t packet_size_in_bytes) {
-  assert(data);
-  assert(packet_size_in_bytes > 0);
-  data_ = data;
-  data_length_ = data_length_in_bytes;
-  packet_size_ = packet_size_in_bytes;
-  currentIndex_ = 0;
-  initialized_ = true;
-}
-
-int PacketReader::NextPacket(uint8_t** packet_pointer) {
-  if (!initialized_) {
-    fprintf(stderr, "Attempting to use uninitialized PacketReader!\n");
-    return -1;
-  }
-  *packet_pointer = data_ + currentIndex_;
-  size_t old_index = currentIndex_;
-  currentIndex_ = std::min(currentIndex_ + packet_size_, data_length_);
-  return static_cast<int>(currentIndex_ - old_index);
-}
-
-}  // namespace test
-}  // namespace webrtc
diff --git a/test/testsupport/packet_reader.h b/test/testsupport/packet_reader.h
deleted file mode 100644
index b58db4d..0000000
--- a/test/testsupport/packet_reader.h
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- *  Copyright (c) 2011 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_TEST_TESTSUPPORT_PACKET_READER_H_
-#define WEBRTC_TEST_TESTSUPPORT_PACKET_READER_H_
-
-#include <cstddef>
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-namespace test {
-
-// Reads chunks of data to simulate network packets from a byte array.
-class PacketReader {
- public:
-  PacketReader();
-  virtual ~PacketReader();
-
-  // Inizializes a new reading operation. Must be done before invoking the
-  // NextPacket method.
-  // * data_length_in_bytes is the length of the data byte array.
-  //   0 length will result in no packets are read.
-  // * packet_size_in_bytes is the number of bytes to read in each NextPacket
-  //   method call. Must be > 0
-  virtual void InitializeReading(uint8_t* data, size_t data_length_in_bytes,
-                                 size_t packet_size_in_bytes);
-
-  // Moves the supplied pointer to the beginning of the next packet.
-  // Returns:
-  // *  The size of the packet ready to read (lower than the packet size for
-  //    the last packet)
-  // *  0 if there are no more packets to read
-  // * -1 if InitializeReading has not been called (also prints to stderr).
-  virtual int NextPacket(uint8_t** packet_pointer);
-
- private:
-  uint8_t* data_;
-  size_t data_length_;
-  size_t packet_size_;
-  size_t currentIndex_;
-  bool initialized_;
-};
-
-}  // namespace test
-}  // namespace webrtc
-
-#endif  // WEBRTC_TEST_TESTSUPPORT_PACKET_READER_H_
diff --git a/test/testsupport/packet_reader_unittest.cc b/test/testsupport/packet_reader_unittest.cc
deleted file mode 100644
index ded1db3..0000000
--- a/test/testsupport/packet_reader_unittest.cc
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- *  Copyright (c) 2012 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/test/testsupport/packet_reader.h"
-
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/testsupport/unittest_utils.h"
-
-namespace webrtc {
-namespace test {
-
-class PacketReaderTest: public PacketRelatedTest {
- protected:
-  PacketReaderTest() {}
-  virtual ~PacketReaderTest() {}
-  void SetUp() {
-    reader_ = new PacketReader();
-  }
-  void TearDown() {
-    delete reader_;
-  }
-  void VerifyPacketData(size_t expected_length,
-                        int actual_length,
-                        uint8_t* original_data_pointer,
-                        uint8_t* new_data_pointer) {
-    EXPECT_EQ(static_cast<int>(expected_length), actual_length);
-    EXPECT_EQ(*original_data_pointer, *new_data_pointer);
-    EXPECT_EQ(0, memcmp(original_data_pointer, new_data_pointer,
-                        actual_length));
-  }
-  PacketReader* reader_;
-};
-
-// Test lack of initialization
-TEST_F(PacketReaderTest, Uninitialized) {
-  uint8_t* data_pointer = NULL;
-  EXPECT_EQ(-1, reader_->NextPacket(&data_pointer));
-  EXPECT_EQ(NULL, data_pointer);
-}
-
-TEST_F(PacketReaderTest, InitializeZeroLengthArgument) {
-  reader_->InitializeReading(packet_data_, 0, kPacketSizeInBytes);
-  ASSERT_EQ(0, reader_->NextPacket(&packet_data_pointer_));
-}
-
-// Test with something smaller than one packet
-TEST_F(PacketReaderTest, NormalSmallData) {
-  const int kDataLengthInBytes = 1499;
-  uint8_t data[kDataLengthInBytes];
-  uint8_t* data_pointer = data;
-  memset(data, 1, kDataLengthInBytes);
-
-  reader_->InitializeReading(data, kDataLengthInBytes, kPacketSizeInBytes);
-  int length_to_read = reader_->NextPacket(&data_pointer);
-  VerifyPacketData(kDataLengthInBytes, length_to_read, data, data_pointer);
-  EXPECT_EQ(0, data_pointer - data);  // pointer hasn't moved
-
-  // Reading another one shall result in 0 bytes:
-  length_to_read = reader_->NextPacket(&data_pointer);
-  EXPECT_EQ(0, length_to_read);
-  EXPECT_EQ(kDataLengthInBytes, data_pointer - data);
-}
-
-// Test with data length that exactly matches one packet
-TEST_F(PacketReaderTest, NormalOnePacketData) {
-  uint8_t data[kPacketSizeInBytes];
-  uint8_t* data_pointer = data;
-  memset(data, 1, kPacketSizeInBytes);
-
-  reader_->InitializeReading(data, kPacketSizeInBytes, kPacketSizeInBytes);
-  int length_to_read = reader_->NextPacket(&data_pointer);
-  VerifyPacketData(kPacketSizeInBytes, length_to_read, data, data_pointer);
-  EXPECT_EQ(0, data_pointer - data);  // pointer hasn't moved
-
-  // Reading another one shall result in 0 bytes:
-  length_to_read = reader_->NextPacket(&data_pointer);
-  EXPECT_EQ(0, length_to_read);
-  EXPECT_EQ(kPacketSizeInBytes, static_cast<size_t>(data_pointer - data));
-}
-
-// Test with data length that will result in 3 packets
-TEST_F(PacketReaderTest, NormalLargeData) {
-  reader_->InitializeReading(packet_data_, kPacketDataLength,
-                             kPacketSizeInBytes);
-
-  int length_to_read = reader_->NextPacket(&packet_data_pointer_);
-  VerifyPacketData(kPacketSizeInBytes, length_to_read,
-                   packet1_, packet_data_pointer_);
-
-  length_to_read = reader_->NextPacket(&packet_data_pointer_);
-  VerifyPacketData(kPacketSizeInBytes, length_to_read,
-                   packet2_, packet_data_pointer_);
-
-  length_to_read = reader_->NextPacket(&packet_data_pointer_);
-  VerifyPacketData(1u, length_to_read,
-                   packet3_, packet_data_pointer_);
-
-  // Reading another one shall result in 0 bytes:
-  length_to_read = reader_->NextPacket(&packet_data_pointer_);
-  EXPECT_EQ(0, length_to_read);
-  EXPECT_EQ(kPacketDataLength,
-            static_cast<size_t>(packet_data_pointer_ - packet_data_));
-}
-
-// Test with empty data.
-TEST_F(PacketReaderTest, EmptyData) {
-  const int kDataLengthInBytes = 0;
-  // But don't really try to allocate a zero-length array...
-  uint8_t data[kPacketSizeInBytes];
-  uint8_t* data_pointer = data;
-  reader_->InitializeReading(data, kDataLengthInBytes, kPacketSizeInBytes);
-  EXPECT_EQ(kDataLengthInBytes, reader_->NextPacket(&data_pointer));
-  // Do it again to make sure nothing changes
-  EXPECT_EQ(kDataLengthInBytes, reader_->NextPacket(&data_pointer));
-}
-
-}  // namespace test
-}  // namespace webrtc
diff --git a/test/testsupport/perf_test.cc b/test/testsupport/perf_test.cc
deleted file mode 100644
index 3266bb7..0000000
--- a/test/testsupport/perf_test.cc
+++ /dev/null
@@ -1,177 +0,0 @@
-/*
- *  Copyright (c) 2012 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.
- */
-
-// A stripped-down version of Chromium's chrome/test/perf/perf_test.cc.
-// ResultsToString(), PrintResult(size_t value) and AppendResult(size_t value)
-// have been modified. The remainder are identical to the Chromium version.
-
-#include "webrtc/test/testsupport/perf_test.h"
-
-#include <sstream>
-#include <stdio.h>
-
-namespace {
-
-std::string ResultsToString(const std::string& measurement,
-                            const std::string& modifier,
-                            const std::string& trace,
-                            const std::string& values,
-                            const std::string& prefix,
-                            const std::string& suffix,
-                            const std::string& units,
-                            bool important) {
-  // <*>RESULT <graph_name>: <trace_name>= <value> <units>
-  // <*>RESULT <graph_name>: <trace_name>= {<mean>, <std deviation>} <units>
-  // <*>RESULT <graph_name>: <trace_name>= [<value>,value,value,...,] <units>
-
-  // TODO(ajm): Use of a stream here may violate the style guide (depending on
-  // one's definition of "logging"). Consider adding StringPrintf-like
-  // functionality as in the original Chromium implementation.
-  std::ostringstream stream;
-  if (important) {
-    stream << "*";
-  }
-  stream << "RESULT " << measurement << modifier << ": " << trace << "= "
-         << prefix << values << suffix << " " << units << std::endl;
-  return stream.str();
-}
-
-void PrintResultsImpl(const std::string& measurement,
-                      const std::string& modifier,
-                      const std::string& trace,
-                      const std::string& values,
-                      const std::string& prefix,
-                      const std::string& suffix,
-                      const std::string& units,
-                      bool important) {
-  printf("%s", ResultsToString(measurement, modifier, trace, values,
-                               prefix, suffix, units, important).c_str());
-}
-
-}  // namespace
-
-namespace webrtc {
-namespace test {
-
-void PrintResult(const std::string& measurement,
-                 const std::string& modifier,
-                 const std::string& trace,
-                 size_t value,
-                 const std::string& units,
-                 bool important) {
-  std::ostringstream value_stream;
-  value_stream << value;
-  PrintResultsImpl(measurement, modifier, trace, value_stream.str(), "", "",
-                   units, important);
-}
-
-void AppendResult(std::string& output,
-                  const std::string& measurement,
-                  const std::string& modifier,
-                  const std::string& trace,
-                  size_t value,
-                  const std::string& units,
-                  bool important) {
-  std::ostringstream value_stream;
-  value_stream << value;
-  output += ResultsToString(measurement, modifier, trace,
-                            value_stream.str(),
-                            "", "", units, important);
-}
-
-void PrintResult(const std::string& measurement,
-                 const std::string& modifier,
-                 const std::string& trace,
-                 const std::string& value,
-                 const std::string& units,
-                 bool important) {
-  PrintResultsImpl(measurement, modifier, trace, value, "", "", units,
-                   important);
-}
-
-void AppendResult(std::string& output,
-                  const std::string& measurement,
-                  const std::string& modifier,
-                  const std::string& trace,
-                  const std::string& value,
-                  const std::string& units,
-                  bool important) {
-  output += ResultsToString(measurement, modifier, trace, value, "", "", units,
-                            important);
-}
-
-void PrintResultMeanAndError(const std::string& measurement,
-                             const std::string& modifier,
-                             const std::string& trace,
-                             const std::string& mean_and_error,
-                             const std::string& units,
-                             bool important) {
-  PrintResultsImpl(measurement, modifier, trace, mean_and_error,
-                   "{", "}", units, important);
-}
-
-void AppendResultMeanAndError(std::string& output,
-                              const std::string& measurement,
-                              const std::string& modifier,
-                              const std::string& trace,
-                              const std::string& mean_and_error,
-                              const std::string& units,
-                              bool important) {
-  output += ResultsToString(measurement, modifier, trace, mean_and_error,
-                            "{", "}", units, important);
-}
-
-void PrintResultList(const std::string& measurement,
-                     const std::string& modifier,
-                     const std::string& trace,
-                     const std::string& values,
-                     const std::string& units,
-                     bool important) {
-  PrintResultsImpl(measurement, modifier, trace, values,
-                   "[", "]", units, important);
-}
-
-void AppendResultList(std::string& output,
-                      const std::string& measurement,
-                      const std::string& modifier,
-                      const std::string& trace,
-                      const std::string& values,
-                      const std::string& units,
-                      bool important) {
-  output += ResultsToString(measurement, modifier, trace, values,
-                            "[", "]", units, important);
-}
-
-void PrintSystemCommitCharge(const std::string& test_name,
-                             size_t charge,
-                             bool important) {
-  PrintSystemCommitCharge(stdout, test_name, charge, important);
-}
-
-void PrintSystemCommitCharge(FILE* target,
-                             const std::string& test_name,
-                             size_t charge,
-                             bool important) {
-  fprintf(target, "%s", SystemCommitChargeToString(test_name, charge,
-                                                   important).c_str());
-}
-
-std::string SystemCommitChargeToString(const std::string& test_name,
-                                       size_t charge,
-                                       bool important) {
-  std::string trace_name(test_name);
-  std::string output;
-  AppendResult(output, "commit_charge", "", "cc" + trace_name, charge, "kb",
-               important);
-  return output;
-}
-
-}  // namespace test
-}  // namespace webrtc
diff --git a/test/testsupport/perf_test.h b/test/testsupport/perf_test.h
deleted file mode 100644
index 6e49ac9..0000000
--- a/test/testsupport/perf_test.h
+++ /dev/null
@@ -1,140 +0,0 @@
-/*
- *  Copyright (c) 2012 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.
- */
-
-// A stripped-down version of Chromium's chrome/test/perf/perf_test.h.
-// Several functions have been removed; the prototypes of the remainder have
-// not been changed.
-
-#ifndef WEBRTC_TEST_TESTSUPPORT_PERF_TEST_H_
-#define WEBRTC_TEST_TESTSUPPORT_PERF_TEST_H_
-
-#include <sstream>
-#include <string>
-
-namespace webrtc {
-namespace test {
-
-// Prints numerical information to stdout in a controlled format, for
-// post-processing. |measurement| is a description of the quantity being
-// measured, e.g. "vm_peak"; |modifier| is provided as a convenience and
-// will be appended directly to the name of the |measurement|, e.g.
-// "_browser"; |trace| is a description of the particular data point, e.g.
-// "reference"; |value| is the measured value; and |units| is a description
-// of the units of measure, e.g. "bytes". If |important| is true, the output
-// line will be specially marked, to notify the post-processor. The strings
-// may be empty.  They should not contain any colons (:) or equals signs (=).
-// A typical post-processing step would be to produce graphs of the data
-// produced for various builds, using the combined |measurement| + |modifier|
-// string to specify a particular graph and the |trace| to identify a trace
-// (i.e., data series) on that graph.
-void PrintResult(const std::string& measurement,
-                 const std::string& modifier,
-                 const std::string& trace,
-                 size_t value,
-                 const std::string& units,
-                 bool important);
-
-void AppendResult(std::string& output,
-                  const std::string& measurement,
-                  const std::string& modifier,
-                  const std::string& trace,
-                  size_t value,
-                  const std::string& units,
-                  bool important);
-
-// Like the above version of PrintResult(), but takes a std::string value
-// instead of a size_t.
-void PrintResult(const std::string& measurement,
-                 const std::string& modifier,
-                 const std::string& trace,
-                 const std::string& value,
-                 const std::string& units,
-                 bool important);
-
-void AppendResult(std::string& output,
-                  const std::string& measurement,
-                  const std::string& modifier,
-                  const std::string& trace,
-                  const std::string& value,
-                  const std::string& units,
-                  bool important);
-
-// Like PrintResult(), but prints a (mean, standard deviation) result pair.
-// The |<values>| should be two comma-separated numbers, the mean and
-// standard deviation (or other error metric) of the measurement.
-void PrintResultMeanAndError(const std::string& measurement,
-                             const std::string& modifier,
-                             const std::string& trace,
-                             const std::string& mean_and_error,
-                             const std::string& units,
-                             bool important);
-
-void AppendResultMeanAndError(std::string& output,
-                              const std::string& measurement,
-                              const std::string& modifier,
-                              const std::string& trace,
-                              const std::string& mean_and_error,
-                              const std::string& units,
-                              bool important);
-
-// Like PrintResult(), but prints an entire list of results. The |values|
-// will generally be a list of comma-separated numbers. A typical
-// post-processing step might produce plots of their mean and standard
-// deviation.
-void PrintResultList(const std::string& measurement,
-                     const std::string& modifier,
-                     const std::string& trace,
-                     const std::string& values,
-                     const std::string& units,
-                     bool important);
-
-void AppendResultList(std::string& output,
-                      const std::string& measurement,
-                      const std::string& modifier,
-                      const std::string& trace,
-                      const std::string& values,
-                      const std::string& units,
-                      bool important);
-
-// Prints memory commit charge stats for use by perf graphs.
-void PrintSystemCommitCharge(const std::string& test_name,
-                             size_t charge,
-                             bool important);
-
-void PrintSystemCommitCharge(FILE* target,
-                             const std::string& test_name,
-                             size_t charge,
-                             bool important);
-
-std::string SystemCommitChargeToString(const std::string& test_name,
-                                       size_t charge,
-                                       bool important);
-
-// Converts list of values into comma-separated string for PrintResultList.
-template <typename Container>
-std::string ValuesToString(const Container& container) {
-  if (container.empty())
-    return "";
-
-  std::stringstream ss;
-  auto it = container.begin();
-  while (true) {
-    ss << *it;
-    if (++it == container.end())
-      break;
-    ss << ',';
-  }
-  return ss.str();
-}
-
-}  // namespace test
-}  // namespace webrtc
-
-#endif  // WEBRTC_TEST_TESTSUPPORT_PERF_TEST_H_
diff --git a/test/testsupport/perf_test_unittest.cc b/test/testsupport/perf_test_unittest.cc
deleted file mode 100644
index 4516b99..0000000
--- a/test/testsupport/perf_test_unittest.cc
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- *  Copyright (c) 2012 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/test/testsupport/perf_test.h"
-
-#include <string>
-
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-namespace test {
-
-TEST(PerfTest, AppendResult) {
-  std::string expected = "RESULT measurementmodifier: trace= 42 units\n";
-  std::string output;
-  AppendResult(output, "measurement", "modifier", "trace", 42, "units", false);
-  EXPECT_EQ(expected, output);
-  std::cout << output;
-
-  expected += "*RESULT foobar: baz= 7 widgets\n";
-  AppendResult(output, "foo", "bar", "baz", 7, "widgets", true);
-  EXPECT_EQ(expected, output);
-  std::cout << output;
-}
-
-}  // namespace test
-}  // namespace webrtc
diff --git a/test/testsupport/test_output.cc b/test/testsupport/test_output.cc
deleted file mode 100644
index f9d64b4..0000000
--- a/test/testsupport/test_output.cc
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- *  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/test/testsupport/test_output.h"
-
-#include <string.h>
-
-#include "webrtc/rtc_base/file.h"
-#include "webrtc/rtc_base/flags.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/pathutils.h"
-#include "webrtc/test/testsupport/fileutils.h"
-
-namespace {
-const std::string& DefaultOutputPath() {
-  static const std::string path = webrtc::test::OutputPath();
-  return path;
-}
-}
-
-DEFINE_string(test_output_dir,
-              DefaultOutputPath().c_str(),
-              "The output folder where test output should be saved.");
-
-namespace webrtc {
-namespace test {
-
-bool GetTestOutputDir(std::string* out_dir) {
-  if (strlen(FLAG_test_output_dir) == 0) {
-    LOG(LS_WARNING) << "No test_out_dir defined.";
-    return false;
-  }
-  *out_dir = FLAG_test_output_dir;
-  return true;
-}
-
-bool WriteToTestOutput(const char* filename,
-                       const uint8_t* buffer,
-                       size_t length) {
-  if (strlen(FLAG_test_output_dir) == 0) {
-    LOG(LS_WARNING) << "No test_out_dir defined.";
-    return false;
-  }
-
-  if (filename == nullptr || strlen(filename) == 0) {
-    LOG(LS_WARNING) << "filename must be provided.";
-    return false;
-  }
-
-  rtc::File output =
-      rtc::File::Create(rtc::Pathname(FLAG_test_output_dir, filename));
-
-  return output.IsOpen() && output.Write(buffer, length) == length;
-}
-
-bool WriteToTestOutput(const char* filename, const std::string& content) {
-  return WriteToTestOutput(filename,
-                           reinterpret_cast<const uint8_t*>(content.c_str()),
-                           content.length());
-}
-
-}  // namespace test
-}  // namespace webrtc
diff --git a/test/testsupport/test_output.h b/test/testsupport/test_output.h
deleted file mode 100644
index c502ea3..0000000
--- a/test/testsupport/test_output.h
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- *  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_TEST_TESTSUPPORT_TEST_OUTPUT_H_
-#define WEBRTC_TEST_TESTSUPPORT_TEST_OUTPUT_H_
-
-#include <stdlib.h>
-
-#include <string>
-
-namespace webrtc {
-namespace test {
-
-// If the test_output_dir flag is set, returns true and copies the location of
-// the dir to |out_dir|. Otherwise, return false.
-bool GetTestOutputDir(std::string* out_dir);
-
-// Writes a |length| bytes array |buffer| to |filename| in isolated output
-// directory defined by swarming. If the file is existing, content will be
-// appended. Otherwise a new file will be created. This function returns false
-// if isolated output directory has not been defined, or |filename| indicates an
-// invalid or non-writable file, or underlying file system errors.
-bool WriteToTestOutput(const char* filename,
-                       const uint8_t* buffer,
-                       size_t length);
-
-bool WriteToTestOutput(const char* filename, const std::string& content);
-
-}  // namespace test
-}  // namespace webrtc
-
-#endif  // WEBRTC_TEST_TESTSUPPORT_TEST_OUTPUT_H_
diff --git a/test/testsupport/test_output_unittest.cc b/test/testsupport/test_output_unittest.cc
deleted file mode 100644
index a082dc1..0000000
--- a/test/testsupport/test_output_unittest.cc
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- *  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/test/testsupport/test_output.h"
-
-#include <string.h>
-
-#include <string>
-
-#include "webrtc/rtc_base/file.h"
-#include "webrtc/rtc_base/flags.h"
-#include "webrtc/rtc_base/pathutils.h"
-#include "webrtc/rtc_base/platform_file.h"
-#include "webrtc/test/gtest.h"
-
-DECLARE_string(test_output_dir);
-
-namespace webrtc {
-namespace test {
-
-TEST(IsolatedOutputTest, ShouldRejectInvalidIsolatedOutDir) {
-  const char* backup = FLAG_test_output_dir;
-  FLAG_test_output_dir = "";
-  ASSERT_FALSE(WriteToTestOutput("a-file", "some-contents"));
-  FLAG_test_output_dir = backup;
-}
-
-TEST(IsolatedOutputTest, ShouldRejectInvalidFileName) {
-  ASSERT_FALSE(WriteToTestOutput(nullptr, "some-contents"));
-  ASSERT_FALSE(WriteToTestOutput("", "some-contents"));
-}
-
-// Sets isolated_out_dir=<a-writable-path> to execute this test.
-TEST(IsolatedOutputTest, ShouldBeAbleToWriteContent) {
-  const char* filename = "a-file";
-  const char* content = "some-contents";
-  if (WriteToTestOutput(filename, content)) {
-    rtc::Pathname out_file(FLAG_test_output_dir, filename);
-    rtc::File input = rtc::File::Open(out_file);
-    EXPECT_TRUE(input.IsOpen());
-    EXPECT_TRUE(input.Seek(0));
-    uint8_t buffer[32];
-    EXPECT_EQ(input.Read(buffer, strlen(content)), strlen(content));
-    buffer[strlen(content)] = 0;
-    EXPECT_EQ(std::string(content),
-              std::string(reinterpret_cast<char*>(buffer)));
-    input.Close();
-
-    EXPECT_TRUE(rtc::File::Remove(out_file));
-  }
-}
-
-}  // namespace test
-}  // namespace webrtc
diff --git a/test/testsupport/trace_to_stderr.cc b/test/testsupport/trace_to_stderr.cc
deleted file mode 100644
index 7338441..0000000
--- a/test/testsupport/trace_to_stderr.cc
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- *  Copyright (c) 2013 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/test/testsupport/trace_to_stderr.h"
-
-#include <assert.h>
-#include <stdio.h>
-
-#include <string>
-
-namespace webrtc {
-namespace test {
-
-static const int kLevelFilter = kTraceError | kTraceWarning | kTraceTerseInfo;
-
-TraceToStderr::TraceToStderr()
-    : override_time_(false),
-      time_seconds_(0) {
-  Trace::set_level_filter(kLevelFilter);
-  Trace::CreateTrace();
-  Trace::SetTraceCallback(this);
-}
-
-TraceToStderr::TraceToStderr(bool override_time)
-    : override_time_(override_time),
-      time_seconds_(0) {
-  Trace::set_level_filter(kLevelFilter);
-  Trace::CreateTrace();
-  Trace::SetTraceCallback(this);
-}
-
-TraceToStderr::~TraceToStderr() {
-  Trace::SetTraceCallback(NULL);
-  Trace::ReturnTrace();
-}
-
-void TraceToStderr::SetTimeSeconds(float time) { time_seconds_ = time; }
-
-void TraceToStderr::Print(TraceLevel level, const char* msg_array, int length) {
-  if (level & kLevelFilter) {
-    assert(length > Trace::kBoilerplateLength);
-    std::string msg = msg_array;
-    std::string msg_log = msg.substr(Trace::kBoilerplateLength);
-    if (override_time_) {
-      fprintf(stderr, "%.2fs %s\n", time_seconds_, msg_log.c_str());
-    } else {
-      std::string msg_time = msg.substr(Trace::kTimestampPosition,
-                                        Trace::kTimestampLength);
-      fprintf(stderr, "%s %s\n", msg_time.c_str(), msg_log.c_str());
-    }
-    fflush(stderr);
-  }
-}
-
-}  // namespace test
-}  // namespace webrtc
diff --git a/test/testsupport/trace_to_stderr.h b/test/testsupport/trace_to_stderr.h
deleted file mode 100644
index a713b79..0000000
--- a/test/testsupport/trace_to_stderr.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- *  Copyright (c) 2013 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_TEST_TEST_SUPPORT_TRACE_TO_STDERR_H_
-#define WEBRTC_TEST_TEST_SUPPORT_TRACE_TO_STDERR_H_
-
-#include "webrtc/system_wrappers/include/trace.h"
-
-namespace webrtc {
-namespace test {
-
-// Upon constructing an instance of this class, all traces will be redirected
-// to stderr. At destruction, redirection is halted.
-class TraceToStderr : public TraceCallback {
- public:
-  TraceToStderr();
-  // Set |override_time| to true to control the time printed with each trace
-  // through SetTimeSeconds(). Otherwise, the trace's usual wallclock time is
-  // used.
-  //
-  // This is useful for offline test tools, where the file time is much more
-  // informative than the real time.
-  explicit TraceToStderr(bool override_time);
-  ~TraceToStderr() override;
-
-  // Every subsequent trace printout will use |time|. Has no effect if
-  // |override_time| in the constructor was set to false.
-  //
-  // No attempt is made to ensure thread-safety between the trace writing and
-  // time updating. In tests, since traces will normally be triggered by the
-  // main thread doing the time updating, this should be of no concern.
-  virtual void SetTimeSeconds(float time);
-
-  // Implements TraceCallback.
-  void Print(TraceLevel level, const char* msg_array, int length) override;
-
- private:
-  bool override_time_;
-  float time_seconds_;
-};
-
-}  // namespace test
-}  // namespace webrtc
-
-#endif  // WEBRTC_TEST_TEST_SUPPORT_TRACE_TO_STDERR_H_
diff --git a/test/testsupport/unittest_utils.h b/test/testsupport/unittest_utils.h
deleted file mode 100644
index ba6db98..0000000
--- a/test/testsupport/unittest_utils.h
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- *  Copyright (c) 2012 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_TEST_TESTSUPPORT_UNITTEST_UTILS_H_
-#define WEBRTC_TEST_TESTSUPPORT_UNITTEST_UTILS_H_
-
-namespace webrtc {
-namespace test {
-
-const size_t kPacketSizeInBytes = 1500;
-const size_t kPacketDataLength = kPacketSizeInBytes * 2 + 1;
-const int kPacketDataNumberOfPackets = 3;
-
-// A base test fixture for packet related tests. Contains
-// two full prepared packets with 1s, 2s in their data and a third packet with
-// a single 3 in it (size=1).
-// A packet data structure is also available, that contains these three packets
-// in order.
-class PacketRelatedTest: public testing::Test {
- protected:
-  // Tree packet byte arrays with data used for verification:
-  uint8_t packet1_[kPacketSizeInBytes];
-  uint8_t packet2_[kPacketSizeInBytes];
-  uint8_t packet3_[1];
-  // Construct a data structure containing these packets
-  uint8_t packet_data_[kPacketDataLength];
-  uint8_t* packet_data_pointer_;
-
-  PacketRelatedTest() {
-    packet_data_pointer_ = packet_data_;
-
-    memset(packet1_, 1, kPacketSizeInBytes);
-    memset(packet2_, 2, kPacketSizeInBytes);
-    memset(packet3_, 3, 1);
-    // Fill the packet_data:
-    memcpy(packet_data_pointer_, packet1_, kPacketSizeInBytes);
-    memcpy(packet_data_pointer_ + kPacketSizeInBytes, packet2_,
-           kPacketSizeInBytes);
-    memcpy(packet_data_pointer_ + kPacketSizeInBytes * 2, packet3_, 1);
-  }
-  virtual ~PacketRelatedTest() {}
-  void SetUp() {}
-  void TearDown() {}
-};
-
-}  // namespace test
-}  // namespace webrtc
-
-#endif  // WEBRTC_TEST_TESTSUPPORT_UNITTEST_UTILS_H_
diff --git a/test/testsupport/y4m_frame_writer.cc b/test/testsupport/y4m_frame_writer.cc
deleted file mode 100644
index e338982..0000000
--- a/test/testsupport/y4m_frame_writer.cc
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- *  Copyright (c) 2017 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/rtc_base/checks.h"
-#include "webrtc/test/testsupport/frame_writer.h"
-
-namespace webrtc {
-namespace test {
-
-Y4mFrameWriterImpl::Y4mFrameWriterImpl(std::string output_filename,
-                                       int width,
-                                       int height,
-                                       int frame_rate)
-    : YuvFrameWriterImpl(output_filename, width, height),
-      frame_rate_(frame_rate) {}
-
-Y4mFrameWriterImpl::~Y4mFrameWriterImpl() = default;
-
-bool Y4mFrameWriterImpl::Init() {
-  if (!YuvFrameWriterImpl::Init()) {
-    return false;
-  }
-  int bytes_written = fprintf(output_file_, "YUV4MPEG2 W%d H%d F%d:1 C420\n",
-                              width_, height_, frame_rate_);
-  if (bytes_written < 0) {
-    fprintf(stderr, "Failed to write Y4M file header to file %s\n",
-            output_filename_.c_str());
-    return false;
-  }
-  return true;
-}
-
-bool Y4mFrameWriterImpl::WriteFrame(uint8_t* frame_buffer) {
-  if (output_file_ == nullptr) {
-    fprintf(stderr,
-            "Y4mFrameWriterImpl is not initialized (output file is NULL)\n");
-    return false;
-  }
-  int bytes_written = fprintf(output_file_, "FRAME\n");
-  if (bytes_written < 0) {
-    fprintf(stderr, "Failed to write Y4M frame header to file %s\n",
-            output_filename_.c_str());
-    return false;
-  }
-  return YuvFrameWriterImpl::WriteFrame(frame_buffer);
-}
-
-}  // namespace test
-}  // namespace webrtc
diff --git a/test/testsupport/y4m_frame_writer_unittest.cc b/test/testsupport/y4m_frame_writer_unittest.cc
deleted file mode 100644
index a4e4172..0000000
--- a/test/testsupport/y4m_frame_writer_unittest.cc
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- *  Copyright (c) 2017 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 <memory>
-#include <string>
-
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/testsupport/fileutils.h"
-#include "webrtc/test/testsupport/frame_writer.h"
-
-namespace webrtc {
-namespace test {
-
-namespace {
-const size_t kFrameWidth = 50;
-const size_t kFrameHeight = 20;
-const size_t kFrameLength = 3 * kFrameWidth * kFrameHeight / 2;  // I420.
-const size_t kFrameRate = 30;
-
-const std::string kFileHeader = "YUV4MPEG2 W50 H20 F30:1 C420\n";
-const std::string kFrameHeader = "FRAME\n";
-}  // namespace
-
-class Y4mFrameWriterTest : public testing::Test {
- protected:
-  Y4mFrameWriterTest() = default;
-  ~Y4mFrameWriterTest() override = default;
-
-  void SetUp() override {
-    temp_filename_ = webrtc::test::TempFilename(webrtc::test::OutputPath(),
-                                                "y4m_frame_writer_unittest");
-    frame_writer_.reset(new Y4mFrameWriterImpl(temp_filename_, kFrameWidth,
-                                               kFrameHeight, kFrameRate));
-    ASSERT_TRUE(frame_writer_->Init());
-  }
-
-  void TearDown() override { remove(temp_filename_.c_str()); }
-
-  std::unique_ptr<FrameWriter> frame_writer_;
-  std::string temp_filename_;
-};
-
-TEST_F(Y4mFrameWriterTest, InitSuccess) {}
-
-TEST_F(Y4mFrameWriterTest, FrameLength) {
-  EXPECT_EQ(kFrameLength, frame_writer_->FrameLength());
-}
-
-TEST_F(Y4mFrameWriterTest, WriteFrame) {
-  uint8_t buffer[kFrameLength];
-  memset(buffer, 9, kFrameLength);  // Write lots of 9s to the buffer.
-  bool result = frame_writer_->WriteFrame(buffer);
-  ASSERT_TRUE(result);
-  result = frame_writer_->WriteFrame(buffer);
-  ASSERT_TRUE(result);
-
-  frame_writer_->Close();
-  EXPECT_EQ(kFileHeader.size() + 2 * kFrameHeader.size() + 2 * kFrameLength,
-            GetFileSize(temp_filename_));
-}
-
-TEST_F(Y4mFrameWriterTest, WriteFrameUninitialized) {
-  uint8_t buffer[kFrameLength];
-  Y4mFrameWriterImpl frame_writer(temp_filename_, kFrameWidth, kFrameHeight,
-                                  kFrameRate);
-  EXPECT_FALSE(frame_writer.WriteFrame(buffer));
-}
-
-}  // namespace test
-}  // namespace webrtc
diff --git a/test/testsupport/yuv_frame_reader.cc b/test/testsupport/yuv_frame_reader.cc
deleted file mode 100644
index 3fe481e..0000000
--- a/test/testsupport/yuv_frame_reader.cc
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- *  Copyright (c) 2017 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/test/testsupport/frame_reader.h"
-
-#include "webrtc/api/video/i420_buffer.h"
-#include "webrtc/test/frame_utils.h"
-#include "webrtc/test/testsupport/fileutils.h"
-
-namespace webrtc {
-namespace test {
-
-YuvFrameReaderImpl::YuvFrameReaderImpl(std::string input_filename,
-                                       int width,
-                                       int height)
-    : input_filename_(input_filename),
-      frame_length_in_bytes_(0),
-      width_(width),
-      height_(height),
-      number_of_frames_(-1),
-      input_file_(nullptr) {}
-
-YuvFrameReaderImpl::~YuvFrameReaderImpl() {
-  Close();
-}
-
-bool YuvFrameReaderImpl::Init() {
-  if (width_ <= 0 || height_ <= 0) {
-    fprintf(stderr, "Frame width and height must be >0, was %d x %d\n", width_,
-            height_);
-    return false;
-  }
-  frame_length_in_bytes_ =
-      width_ * height_ + 2 * ((width_ + 1) / 2) * ((height_ + 1) / 2);
-
-  input_file_ = fopen(input_filename_.c_str(), "rb");
-  if (input_file_ == nullptr) {
-    fprintf(stderr, "Couldn't open input file for reading: %s\n",
-            input_filename_.c_str());
-    return false;
-  }
-  // Calculate total number of frames.
-  size_t source_file_size = GetFileSize(input_filename_);
-  if (source_file_size <= 0u) {
-    fprintf(stderr, "Found empty file: %s\n", input_filename_.c_str());
-    return false;
-  }
-  number_of_frames_ =
-      static_cast<int>(source_file_size / frame_length_in_bytes_);
-  return true;
-}
-
-rtc::scoped_refptr<I420Buffer> YuvFrameReaderImpl::ReadFrame() {
-  if (input_file_ == nullptr) {
-    fprintf(stderr,
-            "YuvFrameReaderImpl is not initialized (input file is NULL)\n");
-    return nullptr;
-  }
-  rtc::scoped_refptr<I420Buffer> buffer(
-      ReadI420Buffer(width_, height_, input_file_));
-  if (!buffer && ferror(input_file_)) {
-    fprintf(stderr, "Error reading from input file: %s\n",
-            input_filename_.c_str());
-  }
-  return buffer;
-}
-
-void YuvFrameReaderImpl::Close() {
-  if (input_file_ != nullptr) {
-    fclose(input_file_);
-    input_file_ = nullptr;
-  }
-}
-
-size_t YuvFrameReaderImpl::FrameLength() {
-  return frame_length_in_bytes_;
-}
-
-int YuvFrameReaderImpl::NumberOfFrames() {
-  return number_of_frames_;
-}
-
-}  // namespace test
-}  // namespace webrtc
diff --git a/test/testsupport/yuv_frame_reader_unittest.cc b/test/testsupport/yuv_frame_reader_unittest.cc
deleted file mode 100644
index 87d51c2..0000000
--- a/test/testsupport/yuv_frame_reader_unittest.cc
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- *  Copyright (c) 2017 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 <memory>
-#include <string>
-
-#include "webrtc/api/video/i420_buffer.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/testsupport/fileutils.h"
-#include "webrtc/test/testsupport/frame_reader.h"
-
-namespace webrtc {
-namespace test {
-
-namespace {
-const std::string kInputFileContents = "bazouk";
-
-const size_t kFrameWidth = 2;
-const size_t kFrameHeight = 2;
-const size_t kFrameLength = 3 * kFrameWidth * kFrameHeight / 2;  // I420.
-}  // namespace
-
-class YuvFrameReaderTest : public testing::Test {
- protected:
-  YuvFrameReaderTest() = default;
-  ~YuvFrameReaderTest() override = default;
-
-  void SetUp() override {
-    temp_filename_ = webrtc::test::TempFilename(webrtc::test::OutputPath(),
-                                                "yuv_frame_reader_unittest");
-    FILE* dummy = fopen(temp_filename_.c_str(), "wb");
-    fprintf(dummy, "%s", kInputFileContents.c_str());
-    fclose(dummy);
-
-    frame_reader_.reset(
-        new YuvFrameReaderImpl(temp_filename_, kFrameWidth, kFrameHeight));
-    ASSERT_TRUE(frame_reader_->Init());
-  }
-
-  void TearDown() override { remove(temp_filename_.c_str()); }
-
-  std::unique_ptr<FrameReader> frame_reader_;
-  std::string temp_filename_;
-};
-
-TEST_F(YuvFrameReaderTest, InitSuccess) {}
-
-TEST_F(YuvFrameReaderTest, FrameLength) {
-  EXPECT_EQ(kFrameLength, frame_reader_->FrameLength());
-}
-
-TEST_F(YuvFrameReaderTest, NumberOfFrames) {
-  EXPECT_EQ(1, frame_reader_->NumberOfFrames());
-}
-
-TEST_F(YuvFrameReaderTest, ReadFrame) {
-  rtc::scoped_refptr<I420BufferInterface> buffer = frame_reader_->ReadFrame();
-  ASSERT_TRUE(buffer);
-  // Expect I420 packed as YUV.
-  EXPECT_EQ(kInputFileContents[0], buffer->DataY()[0]);
-  EXPECT_EQ(kInputFileContents[1], buffer->DataY()[1]);
-  EXPECT_EQ(kInputFileContents[2], buffer->DataY()[2]);
-  EXPECT_EQ(kInputFileContents[3], buffer->DataY()[3]);
-  EXPECT_EQ(kInputFileContents[4], buffer->DataU()[0]);
-  EXPECT_EQ(kInputFileContents[5], buffer->DataV()[0]);
-  EXPECT_FALSE(frame_reader_->ReadFrame());  // End of file.
-}
-
-TEST_F(YuvFrameReaderTest, ReadFrameUninitialized) {
-  YuvFrameReaderImpl file_reader(temp_filename_, kFrameWidth, kFrameHeight);
-  EXPECT_FALSE(file_reader.ReadFrame());
-}
-
-}  // namespace test
-}  // namespace webrtc
diff --git a/test/testsupport/yuv_frame_writer.cc b/test/testsupport/yuv_frame_writer.cc
deleted file mode 100644
index 84fba7e..0000000
--- a/test/testsupport/yuv_frame_writer.cc
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- *  Copyright (c) 2017 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/rtc_base/checks.h"
-#include "webrtc/test/testsupport/frame_writer.h"
-
-namespace webrtc {
-namespace test {
-
-YuvFrameWriterImpl::YuvFrameWriterImpl(std::string output_filename,
-                                       int width,
-                                       int height)
-    : output_filename_(output_filename),
-      frame_length_in_bytes_(0),
-      width_(width),
-      height_(height),
-      output_file_(nullptr) {}
-
-YuvFrameWriterImpl::~YuvFrameWriterImpl() {
-  Close();
-}
-
-bool YuvFrameWriterImpl::Init() {
-  if (width_ <= 0 || height_ <= 0) {
-    fprintf(stderr, "Frame width and height must be >0, was %d x %d\n", width_,
-            height_);
-    return false;
-  }
-  frame_length_in_bytes_ =
-      width_ * height_ + 2 * ((width_ + 1) / 2) * ((height_ + 1) / 2);
-
-  output_file_ = fopen(output_filename_.c_str(), "wb");
-  if (output_file_ == nullptr) {
-    fprintf(stderr, "Couldn't open output file for writing: %s\n",
-            output_filename_.c_str());
-    return false;
-  }
-  return true;
-}
-
-bool YuvFrameWriterImpl::WriteFrame(uint8_t* frame_buffer) {
-  RTC_DCHECK(frame_buffer);
-  if (output_file_ == nullptr) {
-    fprintf(stderr,
-            "YuvFrameWriterImpl is not initialized (output file is NULL)\n");
-    return false;
-  }
-  size_t bytes_written =
-      fwrite(frame_buffer, 1, frame_length_in_bytes_, output_file_);
-  if (bytes_written != frame_length_in_bytes_) {
-    fprintf(stderr, "Failed to write %zu bytes to file %s\n",
-            frame_length_in_bytes_, output_filename_.c_str());
-    return false;
-  }
-  return true;
-}
-
-void YuvFrameWriterImpl::Close() {
-  if (output_file_ != nullptr) {
-    fclose(output_file_);
-    output_file_ = nullptr;
-  }
-}
-
-size_t YuvFrameWriterImpl::FrameLength() {
-  return frame_length_in_bytes_;
-}
-
-}  // namespace test
-}  // namespace webrtc
diff --git a/test/testsupport/yuv_frame_writer_unittest.cc b/test/testsupport/yuv_frame_writer_unittest.cc
deleted file mode 100644
index 5e3cc5c..0000000
--- a/test/testsupport/yuv_frame_writer_unittest.cc
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- *  Copyright (c) 2017 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 <memory>
-
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/testsupport/fileutils.h"
-#include "webrtc/test/testsupport/frame_writer.h"
-
-namespace webrtc {
-namespace test {
-
-namespace {
-const size_t kFrameWidth = 50;
-const size_t kFrameHeight = 20;
-const size_t kFrameLength = 3 * kFrameWidth * kFrameHeight / 2;  // I420.
-}  // namespace
-
-class YuvFrameWriterTest : public testing::Test {
- protected:
-  YuvFrameWriterTest() = default;
-  ~YuvFrameWriterTest() override = default;
-
-  void SetUp() override {
-    temp_filename_ = webrtc::test::TempFilename(webrtc::test::OutputPath(),
-                                                "yuv_frame_writer_unittest");
-    frame_writer_.reset(
-        new YuvFrameWriterImpl(temp_filename_, kFrameWidth, kFrameHeight));
-    ASSERT_TRUE(frame_writer_->Init());
-  }
-
-  void TearDown() override { remove(temp_filename_.c_str()); }
-
-  std::unique_ptr<FrameWriter> frame_writer_;
-  std::string temp_filename_;
-};
-
-TEST_F(YuvFrameWriterTest, InitSuccess) {}
-
-TEST_F(YuvFrameWriterTest, FrameLength) {
-  EXPECT_EQ(kFrameLength, frame_writer_->FrameLength());
-}
-
-TEST_F(YuvFrameWriterTest, WriteFrame) {
-  uint8_t buffer[kFrameLength];
-  memset(buffer, 9, kFrameLength);  // Write lots of 9s to the buffer.
-  bool result = frame_writer_->WriteFrame(buffer);
-  ASSERT_TRUE(result);
-
-  frame_writer_->Close();
-  EXPECT_EQ(kFrameLength, GetFileSize(temp_filename_));
-}
-
-TEST_F(YuvFrameWriterTest, WriteFrameUninitialized) {
-  uint8_t buffer[kFrameLength];
-  YuvFrameWriterImpl frame_writer(temp_filename_, kFrameWidth, kFrameHeight);
-  EXPECT_FALSE(frame_writer.WriteFrame(buffer));
-}
-
-}  // namespace test
-}  // namespace webrtc
diff --git a/test/vcm_capturer.cc b/test/vcm_capturer.cc
deleted file mode 100644
index 0c6ded0..0000000
--- a/test/vcm_capturer.cc
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- *  Copyright (c) 2013 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/test/vcm_capturer.h"
-
-#include "webrtc/modules/video_capture/video_capture_factory.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/call/video_send_stream.h"
-namespace webrtc {
-namespace test {
-
-VcmCapturer::VcmCapturer() : started_(false), sink_(nullptr), vcm_(nullptr) {}
-
-bool VcmCapturer::Init(size_t width,
-                       size_t height,
-                       size_t target_fps,
-                       size_t capture_device_index) {
-  std::unique_ptr<VideoCaptureModule::DeviceInfo> device_info(
-      VideoCaptureFactory::CreateDeviceInfo());
-
-  char device_name[256];
-  char unique_name[256];
-  if (device_info->GetDeviceName(static_cast<uint32_t>(capture_device_index),
-                                 device_name, sizeof(device_name), unique_name,
-                                 sizeof(unique_name)) != 0) {
-    Destroy();
-    return false;
-  }
-
-  vcm_ = webrtc::VideoCaptureFactory::Create(unique_name);
-  vcm_->RegisterCaptureDataCallback(this);
-
-  device_info->GetCapability(vcm_->CurrentDeviceName(), 0, capability_);
-
-  capability_.width = static_cast<int32_t>(width);
-  capability_.height = static_cast<int32_t>(height);
-  capability_.maxFPS = static_cast<int32_t>(target_fps);
-  capability_.videoType = VideoType::kI420;
-
-  if (vcm_->StartCapture(capability_) != 0) {
-    Destroy();
-    return false;
-  }
-
-  RTC_CHECK(vcm_->CaptureStarted());
-
-  return true;
-}
-
-VcmCapturer* VcmCapturer::Create(size_t width,
-                                 size_t height,
-                                 size_t target_fps,
-                                 size_t capture_device_index) {
-  std::unique_ptr<VcmCapturer> vcm_capturer(new VcmCapturer());
-  if (!vcm_capturer->Init(width, height, target_fps, capture_device_index)) {
-    LOG(LS_WARNING) << "Failed to create VcmCapturer(w = " << width
-                    << ", h = " << height << ", fps = " << target_fps << ")";
-    return nullptr;
-  }
-  return vcm_capturer.release();
-}
-
-
-void VcmCapturer::Start() {
-  rtc::CritScope lock(&crit_);
-  started_ = true;
-}
-
-void VcmCapturer::Stop() {
-  rtc::CritScope lock(&crit_);
-  started_ = false;
-}
-
-void VcmCapturer::AddOrUpdateSink(rtc::VideoSinkInterface<VideoFrame>* sink,
-                                  const rtc::VideoSinkWants& wants) {
-  rtc::CritScope lock(&crit_);
-  RTC_CHECK(!sink_ || sink_ == sink);
-  sink_ = sink;
-  VideoCapturer::AddOrUpdateSink(sink, wants);
-}
-
-void VcmCapturer::RemoveSink(rtc::VideoSinkInterface<VideoFrame>* sink) {
-  rtc::CritScope lock(&crit_);
-  RTC_CHECK(sink_ == sink);
-  sink_ = nullptr;
-}
-
-void VcmCapturer::Destroy() {
-  if (!vcm_)
-    return;
-
-  vcm_->StopCapture();
-  vcm_->DeRegisterCaptureDataCallback();
-  // Release reference to VCM.
-  vcm_ = nullptr;
-}
-
-VcmCapturer::~VcmCapturer() { Destroy(); }
-
-void VcmCapturer::OnFrame(const VideoFrame& frame) {
-  rtc::CritScope lock(&crit_);
-  if (started_ && sink_) {
-    rtc::Optional<VideoFrame> out_frame = AdaptFrame(frame);
-    if (out_frame)
-      sink_->OnFrame(*out_frame);
-  }
-}
-
-}  // test
-}  // webrtc
diff --git a/test/vcm_capturer.h b/test/vcm_capturer.h
deleted file mode 100644
index 2b4323c..0000000
--- a/test/vcm_capturer.h
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- *  Copyright (c) 2013 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_TEST_VCM_CAPTURER_H_
-#define WEBRTC_TEST_VCM_CAPTURER_H_
-
-#include <memory>
-
-#include "webrtc/common_types.h"
-#include "webrtc/common_video/libyuv/include/webrtc_libyuv.h"
-#include "webrtc/modules/video_capture/video_capture.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/scoped_ref_ptr.h"
-#include "webrtc/test/video_capturer.h"
-
-namespace webrtc {
-namespace test {
-
-class VcmCapturer
-    : public VideoCapturer,
-      public rtc::VideoSinkInterface<VideoFrame> {
- public:
-  static VcmCapturer* Create(size_t width,
-                             size_t height,
-                             size_t target_fps,
-                             size_t capture_device_index);
-  virtual ~VcmCapturer();
-
-  void Start() override;
-  void Stop() override;
-  void AddOrUpdateSink(rtc::VideoSinkInterface<VideoFrame>* sink,
-                       const rtc::VideoSinkWants& wants) override;
-  void RemoveSink(rtc::VideoSinkInterface<VideoFrame>* sink) override;
-
-  void OnFrame(const VideoFrame& frame) override;
-
- private:
-  VcmCapturer();
-  bool Init(size_t width,
-            size_t height,
-            size_t target_fps,
-            size_t capture_device_index);
-  void Destroy();
-
-  rtc::CriticalSection crit_;
-  bool started_ RTC_GUARDED_BY(crit_);
-  rtc::VideoSinkInterface<VideoFrame>* sink_ RTC_GUARDED_BY(crit_);
-  rtc::scoped_refptr<VideoCaptureModule> vcm_;
-  VideoCaptureCapability capability_;
-};
-
-}  // test
-}  // webrtc
-
-#endif  // WEBRTC_TEST_VCM_CAPTURER_H_
diff --git a/test/video_capturer.cc b/test/video_capturer.cc
deleted file mode 100644
index cb75fa2..0000000
--- a/test/video_capturer.cc
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- *  Copyright (c) 2017 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/test/video_capturer.h"
-
-#include "webrtc/rtc_base/basictypes.h"
-#include "webrtc/rtc_base/constructormagic.h"
-
-namespace webrtc {
-namespace test {
-VideoCapturer::VideoCapturer() : video_adapter_(new cricket::VideoAdapter()) {}
-VideoCapturer::~VideoCapturer() {}
-
-rtc::Optional<VideoFrame> VideoCapturer::AdaptFrame(const VideoFrame& frame) {
-  int cropped_width = 0;
-  int cropped_height = 0;
-  int out_width = 0;
-  int out_height = 0;
-
-  if (!video_adapter_->AdaptFrameResolution(
-          frame.width(), frame.height(), frame.timestamp_us() * 1000,
-          &cropped_width, &cropped_height, &out_width, &out_height)) {
-    // Drop frame in order to respect frame rate constraint.
-    return rtc::Optional<VideoFrame>();
-  }
-
-  rtc::Optional<VideoFrame> out_frame;
-  if (out_height != frame.height() || out_width != frame.width()) {
-    // Video adapter has requested a down-scale. Allocate a new buffer and
-    // return scaled version.
-    rtc::scoped_refptr<I420Buffer> scaled_buffer =
-        I420Buffer::Create(out_width, out_height);
-    scaled_buffer->ScaleFrom(*frame.video_frame_buffer()->ToI420());
-    out_frame.emplace(
-        VideoFrame(scaled_buffer, kVideoRotation_0, frame.timestamp_us()));
-  } else {
-    // No adaptations needed, just return the frame as is.
-    out_frame.emplace(frame);
-  }
-
-  return out_frame;
-}
-
-void VideoCapturer::AddOrUpdateSink(rtc::VideoSinkInterface<VideoFrame>* sink,
-                                    const rtc::VideoSinkWants& wants) {
-  video_adapter_->OnResolutionFramerateRequest(
-      wants.target_pixel_count, wants.max_pixel_count, wants.max_framerate_fps);
-}
-
-}  // namespace test
-}  // namespace webrtc
diff --git a/test/video_capturer.h b/test/video_capturer.h
deleted file mode 100644
index deeb5c8..0000000
--- a/test/video_capturer.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- *  Copyright (c) 2013 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_TEST_VIDEO_CAPTURER_H_
-#define WEBRTC_TEST_VIDEO_CAPTURER_H_
-
-#include <stddef.h>
-
-#include <memory>
-
-#include "webrtc/api/optional.h"
-#include "webrtc/api/video/i420_buffer.h"
-#include "webrtc/api/video/video_frame.h"
-#include "webrtc/media/base/videoadapter.h"
-#include "webrtc/media/base/videosourceinterface.h"
-#include "webrtc/rtc_base/criticalsection.h"
-
-namespace cricket {
-class VideoAdapter;
-}  // namespace cricket
-
-namespace webrtc {
-class Clock;
-namespace test {
-
-class VideoCapturer : public rtc::VideoSourceInterface<VideoFrame> {
- public:
-  VideoCapturer();
-  virtual ~VideoCapturer();
-
-  virtual void Start() = 0;
-  virtual void Stop() = 0;
-
-  void AddOrUpdateSink(rtc::VideoSinkInterface<VideoFrame>* sink,
-                       const rtc::VideoSinkWants& wants) override;
-
- protected:
-  rtc::Optional<VideoFrame> AdaptFrame(const VideoFrame& frame);
-  rtc::VideoSinkWants GetSinkWants();
-
- private:
-  const std::unique_ptr<cricket::VideoAdapter> video_adapter_;
-};
-}  // namespace test
-}  // namespace webrtc
-
-#endif  // WEBRTC_TEST_VIDEO_CAPTURER_H_
diff --git a/test/video_codec_settings.h b/test/video_codec_settings.h
deleted file mode 100644
index 1487393..0000000
--- a/test/video_codec_settings.h
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- *  Copyright (c) 2017 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_TEST_VIDEO_CODEC_SETTINGS_H_
-#define WEBRTC_TEST_VIDEO_CODEC_SETTINGS_H_
-
-#include "webrtc/api/video_codecs/video_encoder.h"
-
-namespace webrtc {
-namespace test {
-
-const uint16_t kTestWidth = 352;
-const uint16_t kTestHeight = 288;
-const uint32_t kTestFrameRate = 30;
-const unsigned int kTestMinBitrateKbps = 30;
-const unsigned int kTestStartBitrateKbps = 300;
-const uint8_t kTestPayloadType = 100;
-const int64_t kTestTimingFramesDelayMs = 200;
-const uint16_t kTestOutlierFrameSizePercent = 250;
-
-static void CodecSettings(VideoCodecType codec_type, VideoCodec* settings) {
-  memset(settings, 0, sizeof(VideoCodec));
-  switch (codec_type) {
-    case kVideoCodecVP8:
-      strncpy(settings->plName, "VP8", 4);
-      settings->codecType = kVideoCodecVP8;
-      // 96 to 127 dynamic payload types for video codecs.
-      settings->plType = kTestPayloadType;
-      settings->startBitrate = kTestStartBitrateKbps;
-      settings->minBitrate = kTestMinBitrateKbps;
-      settings->maxBitrate = 0;
-      settings->maxFramerate = kTestFrameRate;
-      settings->width = kTestWidth;
-      settings->height = kTestHeight;
-      settings->numberOfSimulcastStreams = 0;
-      settings->qpMax = 56;
-      settings->timing_frame_thresholds = {
-          kTestTimingFramesDelayMs, kTestOutlierFrameSizePercent,
-      };
-      *(settings->VP8()) = VideoEncoder::GetDefaultVp8Settings();
-      return;
-    case kVideoCodecVP9:
-      strncpy(settings->plName, "VP9", 4);
-      settings->codecType = kVideoCodecVP9;
-      // 96 to 127 dynamic payload types for video codecs.
-      settings->plType = kTestPayloadType;
-      settings->startBitrate = 100;
-      settings->minBitrate = kTestMinBitrateKbps;
-      settings->maxBitrate = 0;
-      settings->maxFramerate = kTestFrameRate;
-      settings->width = kTestWidth;
-      settings->height = kTestHeight;
-      settings->numberOfSimulcastStreams = 0;
-      settings->qpMax = 56;
-      settings->timing_frame_thresholds = {
-          kTestTimingFramesDelayMs, kTestOutlierFrameSizePercent,
-      };
-      *(settings->VP9()) = VideoEncoder::GetDefaultVp9Settings();
-      return;
-    case kVideoCodecH264:
-      strncpy(settings->plName, "H264", 5);
-      settings->codecType = kVideoCodecH264;
-      // 96 to 127 dynamic payload types for video codecs.
-      settings->plType = kTestPayloadType;
-      settings->startBitrate = kTestStartBitrateKbps;
-      settings->minBitrate = kTestMinBitrateKbps;
-      settings->maxBitrate = 0;
-      settings->maxFramerate = kTestFrameRate;
-      settings->width = kTestWidth;
-      settings->height = kTestHeight;
-      settings->numberOfSimulcastStreams = 0;
-      settings->qpMax = 56;
-      settings->timing_frame_thresholds = {
-          kTestTimingFramesDelayMs, kTestOutlierFrameSizePercent,
-      };
-      *(settings->H264()) = VideoEncoder::GetDefaultH264Settings();
-      return;
-    case kVideoCodecI420:
-      strncpy(settings->plName, "I420", 5);
-      settings->codecType = kVideoCodecI420;
-      // 96 to 127 dynamic payload types for video codecs.
-      settings->plType = kTestPayloadType;
-      // Bitrate needed for this size and framerate.
-      settings->startBitrate =
-          3 * kTestWidth * kTestHeight * 8 * kTestFrameRate / 1000 / 2;
-      settings->maxBitrate = settings->startBitrate;
-      settings->maxFramerate = kTestFrameRate;
-      settings->width = kTestWidth;
-      settings->height = kTestHeight;
-      settings->minBitrate = kTestMinBitrateKbps;
-      settings->numberOfSimulcastStreams = 0;
-      return;
-    case kVideoCodecRED:
-    case kVideoCodecULPFEC:
-    case kVideoCodecFlexfec:
-    case kVideoCodecGeneric:
-    case kVideoCodecUnknown:
-      RTC_NOTREACHED();
-      return;
-  }
-}
-}  // namespace test
-}  // namespace webrtc
-
-#endif  // WEBRTC_TEST_VIDEO_CODEC_SETTINGS_H_
diff --git a/test/video_renderer.cc b/test/video_renderer.cc
deleted file mode 100644
index 7f04683..0000000
--- a/test/video_renderer.cc
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- *  Copyright (c) 2013 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/test/video_renderer.h"
-
-// TODO(pbos): Android renderer
-
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-namespace test {
-
-class NullRenderer : public VideoRenderer {
-  void OnFrame(const VideoFrame& video_frame) override {}
-};
-
-VideoRenderer* VideoRenderer::Create(const char* window_title,
-                                     size_t width,
-                                     size_t height) {
-  VideoRenderer* renderer = CreatePlatformRenderer(window_title, width, height);
-  if (renderer != nullptr)
-    return renderer;
-
-  return new NullRenderer();
-}
-}  // namespace test
-}  // namespace webrtc
diff --git a/test/video_renderer.h b/test/video_renderer.h
deleted file mode 100644
index 49d2fa3..0000000
--- a/test/video_renderer.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- *  Copyright (c) 2013 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_TEST_VIDEO_RENDERER_H_
-#define WEBRTC_TEST_VIDEO_RENDERER_H_
-
-#include <stddef.h>
-
-#include "webrtc/media/base/videosinkinterface.h"
-
-namespace webrtc {
-class VideoFrame;
-
-namespace test {
-class VideoRenderer : public rtc::VideoSinkInterface<VideoFrame> {
- public:
-  // Creates a platform-specific renderer if possible, or a null implementation
-  // if failing.
-  static VideoRenderer* Create(const char* window_title, size_t width,
-                               size_t height);
-  // Returns a renderer rendering to a platform specific window if possible,
-  // NULL if none can be created.
-  // Creates a platform-specific renderer if possible, returns NULL if a
-  // platform renderer could not be created. This occurs, for instance, when
-  // running without an X environment on Linux.
-  static VideoRenderer* CreatePlatformRenderer(const char* window_title,
-                                               size_t width, size_t height);
-  virtual ~VideoRenderer() {}
- protected:
-  VideoRenderer() {}
-};
-}  // namespace test
-}  // namespace webrtc
-
-#endif  // WEBRTC_TEST_VIDEO_RENDERER_H_
diff --git a/test/win/d3d_renderer.cc b/test/win/d3d_renderer.cc
deleted file mode 100644
index e73bad6..0000000
--- a/test/win/d3d_renderer.cc
+++ /dev/null
@@ -1,220 +0,0 @@
-/*
- *  Copyright (c) 2013 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/test/win/d3d_renderer.h"
-
-#include "webrtc/common_video/libyuv/include/webrtc_libyuv.h"
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-namespace test {
-
-#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_TEX1)
-
-struct D3dCustomVertex {
-  float x, y, z;
-  float u, v;
-};
-
-const char kD3DClassName[] = "d3d_renderer";
-
-VideoRenderer* VideoRenderer::CreatePlatformRenderer(const char* window_title,
-                                                     size_t width,
-                                                     size_t height) {
-  return D3dRenderer::Create(window_title, width, height);
-}
-
-D3dRenderer::D3dRenderer(size_t width, size_t height)
-    : width_(width),
-      height_(height),
-      hwnd_(NULL),
-      d3d_(NULL),
-      d3d_device_(NULL),
-      texture_(NULL),
-      vertex_buffer_(NULL) {
-  RTC_DCHECK_GT(width, 0);
-  RTC_DCHECK_GT(height, 0);
-}
-
-D3dRenderer::~D3dRenderer() { Destroy(); }
-
-LRESULT WINAPI D3dRenderer::WindowProc(HWND hwnd, UINT msg, WPARAM wparam,
-                                       LPARAM lparam) {
-  if (msg == WM_DESTROY || (msg == WM_CHAR && wparam == VK_RETURN)) {
-    PostQuitMessage(0);
-    return 0;
-  }
-
-  return DefWindowProcA(hwnd, msg, wparam, lparam);
-}
-
-void D3dRenderer::Destroy() {
-  texture_ = NULL;
-  vertex_buffer_ = NULL;
-  d3d_device_ = NULL;
-  d3d_ = NULL;
-
-  if (hwnd_ != NULL) {
-    DestroyWindow(hwnd_);
-    RTC_DCHECK(!IsWindow(hwnd_));
-    hwnd_ = NULL;
-  }
-}
-
-bool D3dRenderer::Init(const char* window_title) {
-  hwnd_ = CreateWindowA(kD3DClassName,
-                        window_title,
-                        WS_OVERLAPPEDWINDOW,
-                        0,
-                        0,
-                        static_cast<int>(width_),
-                        static_cast<int>(height_),
-                        NULL,
-                        NULL,
-                        NULL,
-                        NULL);
-
-  if (hwnd_ == NULL) {
-    Destroy();
-    return false;
-  }
-
-  d3d_ = Direct3DCreate9(D3D_SDK_VERSION);
-  if (d3d_ == NULL) {
-    Destroy();
-    return false;
-  }
-
-  D3DPRESENT_PARAMETERS d3d_params = {};
-
-  d3d_params.Windowed = TRUE;
-  d3d_params.SwapEffect = D3DSWAPEFFECT_COPY;
-
-  IDirect3DDevice9* d3d_device;
-  if (d3d_->CreateDevice(D3DADAPTER_DEFAULT,
-                         D3DDEVTYPE_HAL,
-                         hwnd_,
-                         D3DCREATE_SOFTWARE_VERTEXPROCESSING,
-                         &d3d_params,
-                         &d3d_device) != D3D_OK) {
-    Destroy();
-    return false;
-  }
-  d3d_device_ = d3d_device;
-  d3d_device->Release();
-
-  IDirect3DVertexBuffer9* vertex_buffer;
-  const int kRectVertices = 4;
-  if (d3d_device_->CreateVertexBuffer(kRectVertices * sizeof(D3dCustomVertex),
-                                      0,
-                                      D3DFVF_CUSTOMVERTEX,
-                                      D3DPOOL_MANAGED,
-                                      &vertex_buffer,
-                                      NULL) != D3D_OK) {
-    Destroy();
-    return false;
-  }
-  vertex_buffer_ = vertex_buffer;
-  vertex_buffer->Release();
-
-  d3d_device_->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
-  d3d_device_->SetRenderState(D3DRS_LIGHTING, FALSE);
-  Resize(width_, height_);
-
-  ShowWindow(hwnd_, SW_SHOWNOACTIVATE);
-  d3d_device_->Present(NULL, NULL, NULL, NULL);
-
-  return true;
-}
-
-D3dRenderer* D3dRenderer::Create(const char* window_title,
-                                 size_t width,
-                                 size_t height) {
-  static ATOM wc_atom = 0;
-  if (wc_atom == 0) {
-    WNDCLASSA wc = {};
-
-    wc.style = CS_HREDRAW | CS_VREDRAW;
-    wc.lpfnWndProc = WindowProc;
-    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
-    wc.hbrBackground = reinterpret_cast<HBRUSH>(COLOR_WINDOW);
-    wc.lpszClassName = kD3DClassName;
-
-    wc_atom = RegisterClassA(&wc);
-    if (wc_atom == 0)
-      return false;
-  }
-
-  D3dRenderer* d3d_renderer = new D3dRenderer(width, height);
-  if (!d3d_renderer->Init(window_title)) {
-    delete d3d_renderer;
-    return NULL;
-  }
-
-  return d3d_renderer;
-}
-
-void D3dRenderer::Resize(size_t width, size_t height) {
-  width_ = width;
-  height_ = height;
-  IDirect3DTexture9* texture;
-
-  d3d_device_->CreateTexture(static_cast<UINT>(width_),
-                             static_cast<UINT>(height_),
-                             1,
-                             0,
-                             D3DFMT_A8R8G8B8,
-                             D3DPOOL_MANAGED,
-                             &texture,
-                             NULL);
-  texture_ = texture;
-  texture->Release();
-
-  // Vertices for the video frame to be rendered to.
-  static const D3dCustomVertex rect[] = {
-    {-1.0f, -1.0f, 0.0f, 0.0f, 1.0f},
-    {-1.0f, 1.0f, 0.0f, 0.0f, 0.0f},
-    {1.0f, -1.0f, 0.0f, 1.0f, 1.0f},
-    {1.0f, 1.0f, 0.0f, 1.0f, 0.0f},
-  };
-
-  void* buf_data;
-  if (vertex_buffer_->Lock(0, 0, &buf_data, 0) != D3D_OK)
-    return;
-
-  memcpy(buf_data, &rect, sizeof(rect));
-  vertex_buffer_->Unlock();
-}
-
-void D3dRenderer::OnFrame(const webrtc::VideoFrame& frame) {
-  if (static_cast<size_t>(frame.width()) != width_ ||
-      static_cast<size_t>(frame.height()) != height_) {
-    Resize(static_cast<size_t>(frame.width()),
-           static_cast<size_t>(frame.height()));
-  }
-
-  D3DLOCKED_RECT lock_rect;
-  if (texture_->LockRect(0, &lock_rect, NULL, 0) != D3D_OK)
-    return;
-
-  ConvertFromI420(frame, VideoType::kARGB, 0,
-                  static_cast<uint8_t*>(lock_rect.pBits));
-  texture_->UnlockRect(0);
-
-  d3d_device_->BeginScene();
-  d3d_device_->SetFVF(D3DFVF_CUSTOMVERTEX);
-  d3d_device_->SetStreamSource(0, vertex_buffer_, 0, sizeof(D3dCustomVertex));
-  d3d_device_->SetTexture(0, texture_);
-  d3d_device_->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2);
-  d3d_device_->EndScene();
-
-  d3d_device_->Present(NULL, NULL, NULL, NULL);
-}
-}  // namespace test
-}  // namespace webrtc
diff --git a/test/win/d3d_renderer.h b/test/win/d3d_renderer.h
deleted file mode 100644
index c3e9f7d..0000000
--- a/test/win/d3d_renderer.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- *  Copyright (c) 2013 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_TEST_WIN_D3D_RENDERER_H_
-#define WEBRTC_TEST_WIN_D3D_RENDERER_H_
-
-#include <Windows.h>
-#include <d3d9.h>
-#pragma comment(lib, "d3d9.lib")       // located in DirectX SDK
-
-#include "webrtc/rtc_base/scoped_ref_ptr.h"
-#include "webrtc/test/video_renderer.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-namespace test {
-
-class D3dRenderer : public VideoRenderer {
- public:
-  static D3dRenderer* Create(const char* window_title, size_t width,
-                             size_t height);
-  virtual ~D3dRenderer();
-
-  void OnFrame(const webrtc::VideoFrame& frame) override;
-
- private:
-  D3dRenderer(size_t width, size_t height);
-
-  static LRESULT WINAPI WindowProc(HWND hwnd, UINT msg, WPARAM wparam,
-                                   LPARAM lparam);
-  bool Init(const char* window_title);
-  void Resize(size_t width, size_t height);
-  void Destroy();
-
-  size_t width_, height_;
-
-  HWND hwnd_;
-  rtc::scoped_refptr<IDirect3D9> d3d_;
-  rtc::scoped_refptr<IDirect3DDevice9> d3d_device_;
-
-  rtc::scoped_refptr<IDirect3DTexture9> texture_;
-  rtc::scoped_refptr<IDirect3DVertexBuffer9> vertex_buffer_;
-};
-}  // namespace test
-}  // namespace webrtc
-
-#endif  // WEBRTC_TEST_WIN_D3D_RENDERER_H_
diff --git a/test/win/run_loop_win.cc b/test/win/run_loop_win.cc
deleted file mode 100644
index ec29cc5..0000000
--- a/test/win/run_loop_win.cc
+++ /dev/null
@@ -1,33 +0,0 @@
-﻿/*
- *  Copyright (c) 2013 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/test/run_loop.h"
-
-#include <assert.h>
-
-#include <conio.h>
-#include <stdio.h>
-#include <Windows.h>
-
-namespace webrtc {
-namespace test {
-
-void PressEnterToContinue() {
-  puts(">> Press ENTER to continue...");
-
-  MSG msg;
-  BOOL ret;
-  while ((ret = GetMessage(&msg, NULL, 0, 0)) != 0) {
-    assert(ret != -1);
-    TranslateMessage(&msg);
-    DispatchMessage(&msg);
-  }
-}
-}  // namespace test
-}  // namespace webrtc
diff --git a/typedefs.h b/typedefs.h
deleted file mode 100644
index bd0bee7..0000000
--- a/typedefs.h
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- *  Copyright (c) 2012 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.
- */
-
-// This file contains platform-specific typedefs and defines.
-// Much of it is derived from Chromium's build/build_config.h.
-
-#ifndef WEBRTC_TYPEDEFS_H_
-#define WEBRTC_TYPEDEFS_H_
-
-// Processor architecture detection.  For more info on what's defined, see:
-//   http://msdn.microsoft.com/en-us/library/b0084kay.aspx
-//   http://www.agner.org/optimize/calling_conventions.pdf
-//   or with gcc, run: "echo | gcc -E -dM -"
-#if defined(_M_X64) || defined(__x86_64__)
-#define WEBRTC_ARCH_X86_FAMILY
-#define WEBRTC_ARCH_X86_64
-#define WEBRTC_ARCH_64_BITS
-#define WEBRTC_ARCH_LITTLE_ENDIAN
-#elif defined(__aarch64__)
-#define WEBRTC_ARCH_ARM_FAMILY
-#define WEBRTC_ARCH_64_BITS
-#define WEBRTC_ARCH_LITTLE_ENDIAN
-#elif defined(_M_IX86) || defined(__i386__)
-#define WEBRTC_ARCH_X86_FAMILY
-#define WEBRTC_ARCH_X86
-#define WEBRTC_ARCH_32_BITS
-#define WEBRTC_ARCH_LITTLE_ENDIAN
-#elif defined(__ARMEL__)
-#define WEBRTC_ARCH_ARM_FAMILY
-#define WEBRTC_ARCH_32_BITS
-#define WEBRTC_ARCH_LITTLE_ENDIAN
-#elif defined(__MIPSEL__)
-#define WEBRTC_ARCH_MIPS_FAMILY
-#if defined(__LP64__)
-#define WEBRTC_ARCH_64_BITS
-#else
-#define WEBRTC_ARCH_32_BITS
-#endif
-#define WEBRTC_ARCH_LITTLE_ENDIAN
-#elif defined(__pnacl__)
-#define WEBRTC_ARCH_32_BITS
-#define WEBRTC_ARCH_LITTLE_ENDIAN
-#else
-#error Please add support for your architecture in typedefs.h
-#endif
-
-#if !(defined(WEBRTC_ARCH_LITTLE_ENDIAN) ^ defined(WEBRTC_ARCH_BIG_ENDIAN))
-#error Define either WEBRTC_ARCH_LITTLE_ENDIAN or WEBRTC_ARCH_BIG_ENDIAN
-#endif
-
-// TODO(zhongwei.yao): WEBRTC_CPU_DETECTION is only used in one place; we should
-// probably just remove it.
-#if (defined(WEBRTC_ARCH_X86_FAMILY) && !defined(__SSE2__))
-#define WEBRTC_CPU_DETECTION
-#endif
-
-#include <stdint.h>
-
-// Annotate a function indicating the caller must examine the return value.
-// Use like:
-//   int foo() RTC_WARN_UNUSED_RESULT;
-// To explicitly ignore a result, cast to void.
-// TODO(kwiberg): Remove when we can use [[nodiscard]] from C++17.
-#if defined(__clang__)
-#define RTC_WARN_UNUSED_RESULT __attribute__((__warn_unused_result__))
-#elif defined(__GNUC__)
-// gcc has a __warn_unused_result__ attribute, but you can't quiet it by
-// casting to void, so we don't use it.
-#define RTC_WARN_UNUSED_RESULT
-#else
-#define RTC_WARN_UNUSED_RESULT
-#endif
-
-// Put after a variable that might not be used, to prevent compiler warnings:
-//   int result ATTRIBUTE_UNUSED = DoSomething();
-//   assert(result == 17);
-// Deprecated since it only works with GCC & clang. See RTC_UNUSED below.
-// TODO(terelius): Remove.
-#ifndef ATTRIBUTE_UNUSED
-#if defined(__GNUC__) || defined(__clang__)
-#define ATTRIBUTE_UNUSED __attribute__ ((__unused__))
-#else
-#define ATTRIBUTE_UNUSED
-#endif
-#endif
-
-// Macro to be used for switch-case fallthrough (required for enabling
-// -Wimplicit-fallthrough warning on Clang).
-#ifndef FALLTHROUGH
-#if defined(__clang__)
-#define FALLTHROUGH() [[clang::fallthrough]]
-#else
-#define FALLTHROUGH() do { } while (0)
-#endif
-#endif
-
-#ifndef NO_RETURN
-// Annotate a function that will not return control flow to the caller.
-#if defined(_MSC_VER)
-#define NO_RETURN __declspec(noreturn)
-#elif defined(__GNUC__)
-#define NO_RETURN __attribute__ ((__noreturn__))
-#else
-#define NO_RETURN
-#endif
-#endif
-
-// Prevent the compiler from warning about an unused variable. For example:
-//   int result = DoSomething();
-//   assert(result == 17);
-//   RTC_UNUSED(result);
-// Note: In most cases it is better to remove the unused variable rather than
-// suppressing the compiler warning.
-#ifndef RTC_UNUSED
-#define RTC_UNUSED(x) static_cast<void>(x)
-#endif  // RTC_UNUSED
-
-#endif  // WEBRTC_TYPEDEFS_H_
diff --git a/video/BUILD.gn b/video/BUILD.gn
deleted file mode 100644
index 16f6bd0..0000000
--- a/video/BUILD.gn
+++ /dev/null
@@ -1,320 +0,0 @@
-# Copyright (c) 2014 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.
-
-import("../webrtc.gni")
-
-rtc_static_library("video") {
-  sources = [
-    "call_stats.cc",
-    "call_stats.h",
-    "encoder_rtcp_feedback.cc",
-    "encoder_rtcp_feedback.h",
-    "overuse_frame_detector.cc",
-    "overuse_frame_detector.h",
-    "payload_router.cc",
-    "payload_router.h",
-    "quality_threshold.cc",
-    "quality_threshold.h",
-    "receive_statistics_proxy.cc",
-    "receive_statistics_proxy.h",
-    "report_block_stats.cc",
-    "report_block_stats.h",
-    "rtp_streams_synchronizer.cc",
-    "rtp_streams_synchronizer.h",
-    "rtp_video_stream_receiver.cc",
-    "rtp_video_stream_receiver.h",
-    "send_delay_stats.cc",
-    "send_delay_stats.h",
-    "send_statistics_proxy.cc",
-    "send_statistics_proxy.h",
-    "stats_counter.cc",
-    "stats_counter.h",
-    "stream_synchronization.cc",
-    "stream_synchronization.h",
-    "transport_adapter.cc",
-    "transport_adapter.h",
-    "video_receive_stream.cc",
-    "video_receive_stream.h",
-    "video_send_stream.cc",
-    "video_send_stream.h",
-    "video_stream_decoder.cc",
-    "video_stream_decoder.h",
-    "video_stream_encoder.cc",
-    "video_stream_encoder.h",
-  ]
-
-  if (!build_with_chromium && is_clang) {
-    # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-    suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-  }
-
-  deps = [
-    "..:webrtc_common",
-    "../api:optional",
-    "../api:transport_api",
-    "../api/video_codecs:video_codecs_api",
-    "../call:call_interfaces",
-    "../call:rtp_interfaces",
-    "../call:video_stream_api",
-
-    # For RtxReceiveStream.
-    "../call:rtp_receiver",
-    "../common_video",
-    "../logging:rtc_event_log_api",
-    "../media:rtc_media_base",
-    "../modules:module_api",
-    "../modules/bitrate_controller",
-    "../modules/congestion_controller",
-    "../modules/pacing",
-    "../modules/remote_bitrate_estimator",
-    "../modules/rtp_rtcp",
-    "../modules/utility",
-    "../modules/video_coding",
-    "../modules/video_coding:video_coding_utility",
-    "../modules/video_coding:webrtc_vp8",
-    "../modules/video_processing",
-    "../rtc_base:rtc_base_approved",
-    "../rtc_base:rtc_numerics",
-    "../rtc_base:rtc_task_queue",
-    "../rtc_base:sequenced_task_checker",
-    "../rtc_base:weak_ptr",
-    "../system_wrappers",
-    "../voice_engine",
-  ]
-}
-
-if (rtc_include_tests) {
-  rtc_source_set("video_quality_test") {
-    testonly = true
-    visibility = [ ":*" ]  # Only targets in this file can depend on this.
-    sources = [
-      "video_quality_test.cc",
-      "video_quality_test.h",
-    ]
-    deps = [
-      "../api:optional",
-      "../call:call_interfaces",
-      "../common_video",
-      "../logging:rtc_event_log_api",
-      "../media:rtc_media",
-      "../media:rtc_media_base",
-      "../modules/audio_mixer:audio_mixer_impl",
-      "../modules/rtp_rtcp",
-      "../modules/video_coding:webrtc_h264",
-      "../modules/video_coding:webrtc_vp8",
-      "../modules/video_coding:webrtc_vp9",
-      "../rtc_base:rtc_base_approved",
-      "../rtc_base:rtc_base_tests_utils",
-      "../rtc_base:rtc_task_queue",
-      "../system_wrappers",
-      "../test:rtp_test_utils",
-      "../test:test_common",
-      "../test:test_renderer",
-      "../test:test_renderer",
-      "../test:test_support",
-      "../test:test_support_test_output",
-      "../test:video_test_common",
-      "../test:video_test_common",
-      "../test:video_test_support",
-      "../voice_engine",
-      "//testing/gtest",
-    ]
-    if (!build_with_chromium && is_clang) {
-      # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-    }
-  }
-
-  rtc_source_set("video_full_stack_tests") {
-    testonly = true
-
-    # Skip restricting visibility on mobile platforms since the tests on those
-    # gets additional generated targets which would require many lines here to
-    # cover (which would be confusing to read and hard to maintain).
-    if (!is_android && !is_ios) {
-      visibility = [ "..:webrtc_perf_tests" ]
-    }
-    sources = [
-      "full_stack_tests.cc",
-    ]
-    deps = [
-      ":video_quality_test",
-      "../modules/pacing:pacing",
-      "../test:field_trial",
-      "../test:test_common",
-      "../test:test_support",
-      "//testing/gtest",
-    ]
-    if (!build_with_chromium && is_clang) {
-      # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-    }
-    if (rtc_use_h264) {
-      defines = [ "WEBRTC_USE_H264" ]
-    }
-  }
-
-  rtc_executable("video_loopback") {
-    testonly = true
-    sources = [
-      "video_loopback.cc",
-    ]
-    deps = [
-      ":video_quality_test",
-      "../rtc_base:rtc_base_approved",
-      "../system_wrappers:metrics_default",
-      "../test:field_trial",
-      "../test:run_test",
-      "../test:run_test_interface",
-      "../test:test_common",
-      "../test:test_renderer",
-      "../test:test_support",
-      "//testing/gmock",
-      "//testing/gtest",
-    ]
-    if (!build_with_chromium && is_clang) {
-      # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-    }
-  }
-
-  rtc_executable("screenshare_loopback") {
-    testonly = true
-    sources = [
-      "screenshare_loopback.cc",
-    ]
-
-    deps = [
-      ":video_quality_test",
-      "../rtc_base:rtc_base_approved",
-      "../system_wrappers:metrics_default",
-      "../test:field_trial",
-      "../test:run_test",
-      "../test:run_test_interface",
-      "../test:test_common",
-      "../test:test_renderer",
-      "../test:test_support",
-    ]
-    if (!build_with_chromium && is_clang) {
-      # Suppress warnings from Chrome's Clang plugins.
-      # See http://code.google.com/p/webrtc/issues/detail?id=163 for details.
-      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-    }
-  }
-
-  rtc_executable("video_replay") {
-    testonly = true
-    sources = [
-      "replay.cc",
-    ]
-    deps = [
-      "..:webrtc_common",
-      "../api/video_codecs:video_codecs_api",
-      "../call:call_interfaces",
-      "../common_video",
-      "../logging:rtc_event_log_api",
-      "../modules/rtp_rtcp",
-      "../rtc_base:rtc_base_approved",
-      "../system_wrappers",
-      "../system_wrappers:metrics_default",
-      "../test:field_trial",
-      "../test:rtp_test_utils",
-      "../test:run_test",
-      "../test:run_test_interface",
-      "../test:test_common",
-      "../test:test_renderer",
-      "../test:test_support",
-      "../test:video_test_common",
-      "../test:video_test_support",
-    ]
-    if (!build_with_chromium && is_clang) {
-      # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-    }
-  }
-
-  # TODO(pbos): Rename test suite.
-  rtc_source_set("video_tests") {
-    testonly = true
-
-    # Skip restricting visibility on mobile platforms since the tests on those
-    # gets additional generated targets which would require many lines here to
-    # cover (which would be confusing to read and hard to maintain).
-    if (!is_android && !is_ios) {
-      visibility = [ "..:video_engine_tests" ]
-    }
-    defines = []
-    sources = [
-      "call_stats_unittest.cc",
-      "encoder_rtcp_feedback_unittest.cc",
-      "end_to_end_tests.cc",
-      "overuse_frame_detector_unittest.cc",
-      "payload_router_unittest.cc",
-      "picture_id_tests.cc",
-      "quality_threshold_unittest.cc",
-      "receive_statistics_proxy_unittest.cc",
-      "report_block_stats_unittest.cc",
-      "rtp_video_stream_receiver_unittest.cc",
-      "send_delay_stats_unittest.cc",
-      "send_statistics_proxy_unittest.cc",
-      "stats_counter_unittest.cc",
-      "stream_synchronization_unittest.cc",
-      "video_receive_stream_unittest.cc",
-      "video_send_stream_tests.cc",
-      "video_stream_encoder_unittest.cc",
-    ]
-    deps = [
-      ":video",
-      "../api:optional",
-      "../api:video_frame_api",
-      "../api/video_codecs:video_codecs_api",
-      "../call:call_interfaces",
-      "../call:mock_rtp_interfaces",
-      "../call:rtp_receiver",
-      "../call:rtp_sender",
-      "../call:video_stream_api",
-      "../common_video",
-      "../logging:rtc_event_log_api",
-      "../media:rtc_media",
-      "../media:rtc_media_base",
-      "../media:rtc_media_tests_utils",
-      "../modules:module_api",
-      "../modules/pacing",
-      "../modules/rtp_rtcp",
-      "../modules/rtp_rtcp:mock_rtp_rtcp",
-      "../modules/utility",
-      "../modules/utility:mock_process_thread",
-      "../modules/video_coding",
-      "../modules/video_coding:video_coding_utility",
-      "../modules/video_coding:webrtc_h264",
-      "../modules/video_coding:webrtc_vp8",
-      "../modules/video_coding:webrtc_vp9",
-      "../rtc_base:rtc_base_approved",
-      "../rtc_base:rtc_base_tests_utils",
-      "../system_wrappers",
-      "../system_wrappers:field_trial_default",
-      "../system_wrappers:metrics_api",
-      "../system_wrappers:metrics_default",
-      "../test:direct_transport",
-      "../test:field_trial",
-      "../test:rtp_test_utils",
-      "../test:test_common",
-      "../test:test_support",
-      "../test:video_test_common",
-      "//testing/gmock",
-      "//testing/gtest",
-    ]
-    if (!build_with_chromium && is_clang) {
-      # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-    }
-    if (rtc_use_h264) {
-      defines += [ "WEBRTC_USE_H264" ]
-    }
-  }
-}
diff --git a/video/DEPS b/video/DEPS
deleted file mode 100644
index b80e1c9..0000000
--- a/video/DEPS
+++ /dev/null
@@ -1,19 +0,0 @@
-include_rules = [
-  "+webrtc/call",
-  "+webrtc/common_video",
-  "+webrtc/logging/rtc_event_log",
-  "+webrtc/media/base",
-  "+webrtc/media/engine",
-  "+webrtc/modules/audio_mixer",
-  "+webrtc/modules/bitrate_controller",
-  "+webrtc/modules/congestion_controller",
-  "+webrtc/modules/pacing",
-  "+webrtc/modules/remote_bitrate_estimator",
-  "+webrtc/modules/rtp_rtcp",
-  "+webrtc/modules/utility",
-  "+webrtc/modules/video_coding",
-  "+webrtc/modules/video_capture",
-  "+webrtc/modules/video_processing",
-  "+webrtc/system_wrappers",
-  "+webrtc/voice_engine",
-]
diff --git a/video/OWNERS b/video/OWNERS
deleted file mode 100644
index 39f4c71..0000000
--- a/video/OWNERS
+++ /dev/null
@@ -1,9 +0,0 @@
-mflodman@webrtc.org
-stefan@webrtc.org
-asapersson@webrtc.org
-sprang@webrtc.org
-
-# These are for the common case of adding or renaming files. If you're doing
-# structural changes, please get a review from a reviewer in this file.
-per-file *.gn=*
-per-file *.gni=*
diff --git a/video/call_stats.cc b/video/call_stats.cc
deleted file mode 100644
index 9864d4e..0000000
--- a/video/call_stats.cc
+++ /dev/null
@@ -1,189 +0,0 @@
-/*
- *  Copyright (c) 2012 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/video/call_stats.h"
-
-#include <algorithm>
-
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/system_wrappers/include/metrics.h"
-
-namespace webrtc {
-namespace {
-// Time interval for updating the observers.
-const int64_t kUpdateIntervalMs = 1000;
-// Weight factor to apply to the average rtt.
-const float kWeightFactor = 0.3f;
-
-void RemoveOldReports(int64_t now, std::list<CallStats::RttTime>* reports) {
-  // A rtt report is considered valid for this long.
-  const int64_t kRttTimeoutMs = 1500;
-  while (!reports->empty() &&
-         (now - reports->front().time) > kRttTimeoutMs) {
-    reports->pop_front();
-  }
-}
-
-int64_t GetMaxRttMs(std::list<CallStats::RttTime>* reports) {
-  if (reports->empty())
-    return -1;
-  int64_t max_rtt_ms = 0;
-  for (const CallStats::RttTime& rtt_time : *reports)
-    max_rtt_ms = std::max(rtt_time.rtt, max_rtt_ms);
-  return max_rtt_ms;
-}
-
-int64_t GetAvgRttMs(std::list<CallStats::RttTime>* reports) {
-  if (reports->empty()) {
-    return -1;
-  }
-  int64_t sum = 0;
-  for (std::list<CallStats::RttTime>::const_iterator it = reports->begin();
-       it != reports->end(); ++it) {
-    sum += it->rtt;
-  }
-  return sum / reports->size();
-}
-
-void UpdateAvgRttMs(std::list<CallStats::RttTime>* reports, int64_t* avg_rtt) {
-  int64_t cur_rtt_ms = GetAvgRttMs(reports);
-  if (cur_rtt_ms == -1) {
-    // Reset.
-    *avg_rtt = -1;
-    return;
-  }
-  if (*avg_rtt == -1) {
-    // Initialize.
-    *avg_rtt = cur_rtt_ms;
-    return;
-  }
-  *avg_rtt = *avg_rtt * (1.0f - kWeightFactor) + cur_rtt_ms * kWeightFactor;
-}
-}  // namespace
-
-class RtcpObserver : public RtcpRttStats {
- public:
-  explicit RtcpObserver(CallStats* owner) : owner_(owner) {}
-  virtual ~RtcpObserver() {}
-
-  virtual void OnRttUpdate(int64_t rtt) {
-    owner_->OnRttUpdate(rtt);
-  }
-
-  // Returns the average RTT.
-  virtual int64_t LastProcessedRtt() const {
-    return owner_->avg_rtt_ms();
-  }
-
- private:
-  CallStats* owner_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(RtcpObserver);
-};
-
-CallStats::CallStats(Clock* clock)
-    : clock_(clock),
-      rtcp_rtt_stats_(new RtcpObserver(this)),
-      last_process_time_(clock_->TimeInMilliseconds()),
-      max_rtt_ms_(-1),
-      avg_rtt_ms_(-1),
-      sum_avg_rtt_ms_(0),
-      num_avg_rtt_(0),
-      time_of_first_rtt_ms_(-1) {}
-
-CallStats::~CallStats() {
-  RTC_DCHECK(observers_.empty());
-  UpdateHistograms();
-}
-
-int64_t CallStats::TimeUntilNextProcess() {
-  return last_process_time_ + kUpdateIntervalMs - clock_->TimeInMilliseconds();
-}
-
-void CallStats::Process() {
-  rtc::CritScope cs(&crit_);
-  int64_t now = clock_->TimeInMilliseconds();
-  if (now < last_process_time_ + kUpdateIntervalMs)
-    return;
-
-  last_process_time_ = now;
-
-  RemoveOldReports(now, &reports_);
-  max_rtt_ms_ = GetMaxRttMs(&reports_);
-  UpdateAvgRttMs(&reports_, &avg_rtt_ms_);
-
-  // If there is a valid rtt, update all observers with the max rtt.
-  if (max_rtt_ms_ >= 0) {
-    RTC_DCHECK_GE(avg_rtt_ms_, 0);
-    for (std::list<CallStatsObserver*>::iterator it = observers_.begin();
-         it != observers_.end(); ++it) {
-      (*it)->OnRttUpdate(avg_rtt_ms_, max_rtt_ms_);
-    }
-    // Sum for Histogram of average RTT reported over the entire call.
-    sum_avg_rtt_ms_ += avg_rtt_ms_;
-    ++num_avg_rtt_;
-  }
-}
-
-int64_t CallStats::avg_rtt_ms() const {
-  rtc::CritScope cs(&crit_);
-  return avg_rtt_ms_;
-}
-
-RtcpRttStats* CallStats::rtcp_rtt_stats() const {
-  return rtcp_rtt_stats_.get();
-}
-
-void CallStats::RegisterStatsObserver(CallStatsObserver* observer) {
-  rtc::CritScope cs(&crit_);
-  for (std::list<CallStatsObserver*>::iterator it = observers_.begin();
-       it != observers_.end(); ++it) {
-    if (*it == observer)
-      return;
-  }
-  observers_.push_back(observer);
-}
-
-void CallStats::DeregisterStatsObserver(CallStatsObserver* observer) {
-  rtc::CritScope cs(&crit_);
-  for (std::list<CallStatsObserver*>::iterator it = observers_.begin();
-       it != observers_.end(); ++it) {
-    if (*it == observer) {
-      observers_.erase(it);
-      return;
-    }
-  }
-}
-
-void CallStats::OnRttUpdate(int64_t rtt) {
-  rtc::CritScope cs(&crit_);
-  int64_t now_ms = clock_->TimeInMilliseconds();
-  reports_.push_back(RttTime(rtt, now_ms));
-  if (time_of_first_rtt_ms_ == -1)
-    time_of_first_rtt_ms_ = now_ms;
-}
-
-void CallStats::UpdateHistograms() {
-  rtc::CritScope cs(&crit_);
-  if (time_of_first_rtt_ms_ == -1 || num_avg_rtt_ < 1)
-    return;
-
-  int64_t elapsed_sec =
-      (clock_->TimeInMilliseconds() - time_of_first_rtt_ms_) / 1000;
-  if (elapsed_sec >= metrics::kMinRunTimeInSeconds) {
-    int64_t avg_rtt_ms = (sum_avg_rtt_ms_ + num_avg_rtt_ / 2) / num_avg_rtt_;
-    RTC_HISTOGRAM_COUNTS_10000(
-        "WebRTC.Video.AverageRoundTripTimeInMilliseconds", avg_rtt_ms);
-  }
-}
-
-}  // namespace webrtc
diff --git a/video/call_stats.h b/video/call_stats.h
deleted file mode 100644
index efa98ad..0000000
--- a/video/call_stats.h
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- *  Copyright (c) 2012 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_VIDEO_CALL_STATS_H_
-#define WEBRTC_VIDEO_CALL_STATS_H_
-
-#include <list>
-#include <memory>
-
-#include "webrtc/modules/include/module.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/system_wrappers/include/clock.h"
-
-namespace webrtc {
-
-class CallStatsObserver;
-class RtcpRttStats;
-
-// CallStats keeps track of statistics for a call.
-class CallStats : public Module {
- public:
-  friend class RtcpObserver;
-
-  explicit CallStats(Clock* clock);
-  ~CallStats();
-
-  // Implements Module, to use the process thread.
-  int64_t TimeUntilNextProcess() override;
-  void Process() override;
-
-  // Returns a RtcpRttStats to register at a statistics provider. The object
-  // has the same lifetime as the CallStats instance.
-  RtcpRttStats* rtcp_rtt_stats() const;
-
-  // Registers/deregisters a new observer to receive statistics updates.
-  void RegisterStatsObserver(CallStatsObserver* observer);
-  void DeregisterStatsObserver(CallStatsObserver* observer);
-
-  // Helper struct keeping track of the time a rtt value is reported.
-  struct RttTime {
-    RttTime(int64_t new_rtt, int64_t rtt_time)
-        : rtt(new_rtt), time(rtt_time) {}
-    const int64_t rtt;
-    const int64_t time;
-  };
-
- protected:
-  void OnRttUpdate(int64_t rtt);
-
-  int64_t avg_rtt_ms() const;
-
- private:
-  void UpdateHistograms();
-
-  Clock* const clock_;
-  // Protecting all members.
-  rtc::CriticalSection crit_;
-  // Observer receiving statistics updates.
-  std::unique_ptr<RtcpRttStats> rtcp_rtt_stats_;
-  // The last time 'Process' resulted in statistic update.
-  int64_t last_process_time_;
-  // The last RTT in the statistics update (zero if there is no valid estimate).
-  int64_t max_rtt_ms_;
-  int64_t avg_rtt_ms_;
-  int64_t sum_avg_rtt_ms_ RTC_GUARDED_BY(crit_);
-  int64_t num_avg_rtt_ RTC_GUARDED_BY(crit_);
-  int64_t time_of_first_rtt_ms_ RTC_GUARDED_BY(crit_);
-
-  // All Rtt reports within valid time interval, oldest first.
-  std::list<RttTime> reports_;
-
-  // Observers getting stats reports.
-  std::list<CallStatsObserver*> observers_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(CallStats);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_VIDEO_CALL_STATS_H_
diff --git a/video/call_stats_unittest.cc b/video/call_stats_unittest.cc
deleted file mode 100644
index 8a2a89a..0000000
--- a/video/call_stats_unittest.cc
+++ /dev/null
@@ -1,221 +0,0 @@
-/*
- *  Copyright (c) 2012 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 <memory>
-
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
-#include "webrtc/system_wrappers/include/metrics.h"
-#include "webrtc/system_wrappers/include/metrics_default.h"
-#include "webrtc/test/gmock.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/video/call_stats.h"
-
-using ::testing::_;
-using ::testing::AnyNumber;
-using ::testing::Return;
-
-namespace webrtc {
-
-class MockStatsObserver : public CallStatsObserver {
- public:
-  MockStatsObserver() {}
-  virtual ~MockStatsObserver() {}
-
-  MOCK_METHOD2(OnRttUpdate, void(int64_t, int64_t));
-};
-
-class CallStatsTest : public ::testing::Test {
- public:
-  CallStatsTest() : fake_clock_(12345) {}
-
- protected:
-  virtual void SetUp() { call_stats_.reset(new CallStats(&fake_clock_)); }
-  SimulatedClock fake_clock_;
-  std::unique_ptr<CallStats> call_stats_;
-};
-
-TEST_F(CallStatsTest, AddAndTriggerCallback) {
-  MockStatsObserver stats_observer;
-  RtcpRttStats* rtcp_rtt_stats = call_stats_->rtcp_rtt_stats();
-  call_stats_->RegisterStatsObserver(&stats_observer);
-  fake_clock_.AdvanceTimeMilliseconds(1000);
-  EXPECT_EQ(-1, rtcp_rtt_stats->LastProcessedRtt());
-
-  const int64_t kRtt = 25;
-  rtcp_rtt_stats->OnRttUpdate(kRtt);
-  EXPECT_CALL(stats_observer, OnRttUpdate(kRtt, kRtt)).Times(1);
-  call_stats_->Process();
-  EXPECT_EQ(kRtt, rtcp_rtt_stats->LastProcessedRtt());
-
-  const int64_t kRttTimeOutMs = 1500 + 10;
-  fake_clock_.AdvanceTimeMilliseconds(kRttTimeOutMs);
-  EXPECT_CALL(stats_observer, OnRttUpdate(_, _)).Times(0);
-  call_stats_->Process();
-  EXPECT_EQ(-1, rtcp_rtt_stats->LastProcessedRtt());
-
-  call_stats_->DeregisterStatsObserver(&stats_observer);
-}
-
-TEST_F(CallStatsTest, ProcessTime) {
-  MockStatsObserver stats_observer;
-  call_stats_->RegisterStatsObserver(&stats_observer);
-  RtcpRttStats* rtcp_rtt_stats = call_stats_->rtcp_rtt_stats();
-  rtcp_rtt_stats->OnRttUpdate(100);
-
-  // Time isn't updated yet.
-  EXPECT_CALL(stats_observer, OnRttUpdate(_, _)).Times(0);
-  call_stats_->Process();
-
-  // Advance clock and verify we get an update.
-  fake_clock_.AdvanceTimeMilliseconds(1000);
-  EXPECT_CALL(stats_observer, OnRttUpdate(_, _)).Times(1);
-  call_stats_->Process();
-
-  // Advance clock just too little to get an update.
-  fake_clock_.AdvanceTimeMilliseconds(999);
-  rtcp_rtt_stats->OnRttUpdate(100);
-  EXPECT_CALL(stats_observer, OnRttUpdate(_, _)).Times(0);
-  call_stats_->Process();
-
-  // Advance enough to trigger a new update.
-  fake_clock_.AdvanceTimeMilliseconds(1);
-  EXPECT_CALL(stats_observer, OnRttUpdate(_, _)).Times(1);
-  call_stats_->Process();
-
-  call_stats_->DeregisterStatsObserver(&stats_observer);
-}
-
-// Verify all observers get correct estimates and observers can be added and
-// removed.
-TEST_F(CallStatsTest, MultipleObservers) {
-  MockStatsObserver stats_observer_1;
-  call_stats_->RegisterStatsObserver(&stats_observer_1);
-  // Add the second observer twice, there should still be only one report to the
-  // observer.
-  MockStatsObserver stats_observer_2;
-  call_stats_->RegisterStatsObserver(&stats_observer_2);
-  call_stats_->RegisterStatsObserver(&stats_observer_2);
-
-  RtcpRttStats* rtcp_rtt_stats = call_stats_->rtcp_rtt_stats();
-  const int64_t kRtt = 100;
-  rtcp_rtt_stats->OnRttUpdate(kRtt);
-
-  // Verify both observers are updated.
-  fake_clock_.AdvanceTimeMilliseconds(1000);
-  EXPECT_CALL(stats_observer_1, OnRttUpdate(kRtt, kRtt)).Times(1);
-  EXPECT_CALL(stats_observer_2, OnRttUpdate(kRtt, kRtt)).Times(1);
-  call_stats_->Process();
-
-  // Deregister the second observer and verify update is only sent to the first
-  // observer.
-  call_stats_->DeregisterStatsObserver(&stats_observer_2);
-  rtcp_rtt_stats->OnRttUpdate(kRtt);
-  fake_clock_.AdvanceTimeMilliseconds(1000);
-  EXPECT_CALL(stats_observer_1, OnRttUpdate(kRtt, kRtt)).Times(1);
-  EXPECT_CALL(stats_observer_2, OnRttUpdate(kRtt, kRtt)).Times(0);
-  call_stats_->Process();
-
-  // Deregister the first observer.
-  call_stats_->DeregisterStatsObserver(&stats_observer_1);
-  rtcp_rtt_stats->OnRttUpdate(kRtt);
-  fake_clock_.AdvanceTimeMilliseconds(1000);
-  EXPECT_CALL(stats_observer_1, OnRttUpdate(kRtt, kRtt)).Times(0);
-  EXPECT_CALL(stats_observer_2, OnRttUpdate(kRtt, kRtt)).Times(0);
-  call_stats_->Process();
-}
-
-// Verify increasing and decreasing rtt triggers callbacks with correct values.
-TEST_F(CallStatsTest, ChangeRtt) {
-  MockStatsObserver stats_observer;
-  call_stats_->RegisterStatsObserver(&stats_observer);
-  RtcpRttStats* rtcp_rtt_stats = call_stats_->rtcp_rtt_stats();
-
-  // Advance clock to be ready for an update.
-  fake_clock_.AdvanceTimeMilliseconds(1000);
-
-  // Set a first value and verify the callback is triggered.
-  const int64_t kFirstRtt = 100;
-  rtcp_rtt_stats->OnRttUpdate(kFirstRtt);
-  EXPECT_CALL(stats_observer, OnRttUpdate(kFirstRtt, kFirstRtt)).Times(1);
-  call_stats_->Process();
-
-  // Increase rtt and verify the new value is reported.
-  fake_clock_.AdvanceTimeMilliseconds(1000);
-  const int64_t kHighRtt = kFirstRtt + 20;
-  const int64_t kAvgRtt1 = 103;
-  rtcp_rtt_stats->OnRttUpdate(kHighRtt);
-  EXPECT_CALL(stats_observer, OnRttUpdate(kAvgRtt1, kHighRtt)).Times(1);
-  call_stats_->Process();
-
-  // Increase time enough for a new update, but not too much to make the
-  // rtt invalid. Report a lower rtt and verify the old/high value still is sent
-  // in the callback.
-  fake_clock_.AdvanceTimeMilliseconds(1000);
-  const int64_t kLowRtt = kFirstRtt - 20;
-  const int64_t kAvgRtt2 = 102;
-  rtcp_rtt_stats->OnRttUpdate(kLowRtt);
-  EXPECT_CALL(stats_observer, OnRttUpdate(kAvgRtt2, kHighRtt)).Times(1);
-  call_stats_->Process();
-
-  // Advance time to make the high report invalid, the lower rtt should now be
-  // in the callback.
-  fake_clock_.AdvanceTimeMilliseconds(1000);
-  const int64_t kAvgRtt3 = 95;
-  EXPECT_CALL(stats_observer, OnRttUpdate(kAvgRtt3, kLowRtt)).Times(1);
-  call_stats_->Process();
-
-  call_stats_->DeregisterStatsObserver(&stats_observer);
-}
-
-TEST_F(CallStatsTest, LastProcessedRtt) {
-  MockStatsObserver stats_observer;
-  call_stats_->RegisterStatsObserver(&stats_observer);
-  RtcpRttStats* rtcp_rtt_stats = call_stats_->rtcp_rtt_stats();
-  fake_clock_.AdvanceTimeMilliseconds(1000);
-
-  // Set a first values and verify that LastProcessedRtt initially returns the
-  // average rtt.
-  const int64_t kRttLow = 10;
-  const int64_t kRttHigh = 30;
-  const int64_t kAvgRtt = 20;
-  rtcp_rtt_stats->OnRttUpdate(kRttLow);
-  rtcp_rtt_stats->OnRttUpdate(kRttHigh);
-  EXPECT_CALL(stats_observer, OnRttUpdate(kAvgRtt, kRttHigh)).Times(1);
-  call_stats_->Process();
-  EXPECT_EQ(kAvgRtt, rtcp_rtt_stats->LastProcessedRtt());
-
-  // Update values and verify LastProcessedRtt.
-  fake_clock_.AdvanceTimeMilliseconds(1000);
-  rtcp_rtt_stats->OnRttUpdate(kRttLow);
-  rtcp_rtt_stats->OnRttUpdate(kRttHigh);
-  EXPECT_CALL(stats_observer, OnRttUpdate(kAvgRtt, kRttHigh)).Times(1);
-  call_stats_->Process();
-  EXPECT_EQ(kAvgRtt, rtcp_rtt_stats->LastProcessedRtt());
-
-  call_stats_->DeregisterStatsObserver(&stats_observer);
-}
-
-TEST_F(CallStatsTest, ProducesHistogramMetrics) {
-  metrics::Reset();
-  const int64_t kRtt = 123;
-  RtcpRttStats* rtcp_rtt_stats = call_stats_->rtcp_rtt_stats();
-  rtcp_rtt_stats->OnRttUpdate(kRtt);
-  fake_clock_.AdvanceTimeMilliseconds(metrics::kMinRunTimeInSeconds * 1000);
-  rtcp_rtt_stats->OnRttUpdate(kRtt);
-  call_stats_->Process();
-  call_stats_.reset();
-
-  EXPECT_EQ(1, metrics::NumSamples(
-                   "WebRTC.Video.AverageRoundTripTimeInMilliseconds"));
-  EXPECT_EQ(1, metrics::NumEvents(
-                   "WebRTC.Video.AverageRoundTripTimeInMilliseconds", kRtt));
-}
-
-}  // namespace webrtc
diff --git a/video/encoder_rtcp_feedback.cc b/video/encoder_rtcp_feedback.cc
deleted file mode 100644
index 1c5a31e..0000000
--- a/video/encoder_rtcp_feedback.cc
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- *  Copyright (c) 2012 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/video/encoder_rtcp_feedback.h"
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/video/video_stream_encoder.h"
-
-static const int kMinKeyFrameRequestIntervalMs = 300;
-
-namespace webrtc {
-
-EncoderRtcpFeedback::EncoderRtcpFeedback(Clock* clock,
-                                         const std::vector<uint32_t>& ssrcs,
-                                         VideoStreamEncoder* encoder)
-    : clock_(clock),
-      ssrcs_(ssrcs),
-      video_stream_encoder_(encoder),
-      time_last_intra_request_ms_(ssrcs.size(), -1) {
-  RTC_DCHECK(!ssrcs.empty());
-}
-
-bool EncoderRtcpFeedback::HasSsrc(uint32_t ssrc) {
-  for (uint32_t registered_ssrc : ssrcs_) {
-    if (registered_ssrc == ssrc) {
-      return true;
-    }
-  }
-  return false;
-}
-
-size_t EncoderRtcpFeedback::GetStreamIndex(uint32_t ssrc) {
-  for (size_t i = 0; i < ssrcs_.size(); ++i) {
-    if (ssrcs_[i] == ssrc)
-      return i;
-  }
-  RTC_NOTREACHED() << "Unknown ssrc " << ssrc;
-  return 0;
-}
-
-void EncoderRtcpFeedback::OnReceivedIntraFrameRequest(uint32_t ssrc) {
-  RTC_DCHECK(HasSsrc(ssrc));
-  size_t index = GetStreamIndex(ssrc);
-  {
-    // TODO(mflodman): Move to VideoStreamEncoder after some more changes making
-    // it easier to test there.
-    int64_t now_ms = clock_->TimeInMilliseconds();
-    rtc::CritScope lock(&crit_);
-    if (time_last_intra_request_ms_[index] + kMinKeyFrameRequestIntervalMs >
-        now_ms) {
-      return;
-    }
-    time_last_intra_request_ms_[index] = now_ms;
-  }
-
-  video_stream_encoder_->OnReceivedIntraFrameRequest(index);
-}
-
-}  // namespace webrtc
diff --git a/video/encoder_rtcp_feedback.h b/video/encoder_rtcp_feedback.h
deleted file mode 100644
index 0e5b13b..0000000
--- a/video/encoder_rtcp_feedback.h
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- *  Copyright (c) 2012 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_VIDEO_ENCODER_RTCP_FEEDBACK_H_
-#define WEBRTC_VIDEO_ENCODER_RTCP_FEEDBACK_H_
-
-#include <vector>
-
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/system_wrappers/include/clock.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-class VideoStreamEncoder;
-
-class EncoderRtcpFeedback : public RtcpIntraFrameObserver {
- public:
-  EncoderRtcpFeedback(Clock* clock,
-                       const std::vector<uint32_t>& ssrcs,
-                       VideoStreamEncoder* encoder);
-  void OnReceivedIntraFrameRequest(uint32_t ssrc) override;
-
- private:
-  bool HasSsrc(uint32_t ssrc);
-  size_t GetStreamIndex(uint32_t ssrc);
-
-  Clock* const clock_;
-  const std::vector<uint32_t> ssrcs_;
-  VideoStreamEncoder* const video_stream_encoder_;
-
-  rtc::CriticalSection crit_;
-  std::vector<int64_t> time_last_intra_request_ms_ RTC_GUARDED_BY(crit_);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_VIDEO_ENCODER_RTCP_FEEDBACK_H_
diff --git a/video/encoder_rtcp_feedback_unittest.cc b/video/encoder_rtcp_feedback_unittest.cc
deleted file mode 100644
index 718ecac..0000000
--- a/video/encoder_rtcp_feedback_unittest.cc
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- *  Copyright (c) 2012 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/video/encoder_rtcp_feedback.h"
-
-#include <memory>
-
-#include "webrtc/modules/utility/include/mock/mock_process_thread.h"
-#include "webrtc/test/gmock.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/video/send_statistics_proxy.h"
-#include "webrtc/video/video_stream_encoder.h"
-
-using ::testing::NiceMock;
-
-namespace webrtc {
-
-class MockVideoStreamEncoder : public VideoStreamEncoder {
- public:
-  explicit MockVideoStreamEncoder(SendStatisticsProxy* send_stats_proxy)
-      : VideoStreamEncoder(1,
-                           send_stats_proxy,
-                           VideoSendStream::Config::EncoderSettings("fake", 0,
-                                                                    nullptr),
-                           nullptr,
-                           nullptr,
-                           std::unique_ptr<OveruseFrameDetector>()) {}
-  ~MockVideoStreamEncoder() { Stop(); }
-
-  MOCK_METHOD1(OnReceivedIntraFrameRequest, void(size_t));
-};
-
-class VieKeyRequestTest : public ::testing::Test {
- public:
-  VieKeyRequestTest()
-      : simulated_clock_(123456789),
-        send_stats_proxy_(&simulated_clock_,
-                          VideoSendStream::Config(nullptr),
-                          VideoEncoderConfig::ContentType::kRealtimeVideo),
-        encoder_(&send_stats_proxy_),
-        encoder_rtcp_feedback_(
-            &simulated_clock_,
-            std::vector<uint32_t>(1, VieKeyRequestTest::kSsrc),
-            &encoder_) {}
-
- protected:
-  const uint32_t kSsrc = 1234;
-
-  SimulatedClock simulated_clock_;
-  SendStatisticsProxy send_stats_proxy_;
-  MockVideoStreamEncoder encoder_;
-  EncoderRtcpFeedback encoder_rtcp_feedback_;
-};
-
-TEST_F(VieKeyRequestTest, CreateAndTriggerRequests) {
-  EXPECT_CALL(encoder_, OnReceivedIntraFrameRequest(0)).Times(1);
-  encoder_rtcp_feedback_.OnReceivedIntraFrameRequest(kSsrc);
-}
-
-TEST_F(VieKeyRequestTest, TooManyOnReceivedIntraFrameRequest) {
-  EXPECT_CALL(encoder_, OnReceivedIntraFrameRequest(0)).Times(1);
-  encoder_rtcp_feedback_.OnReceivedIntraFrameRequest(kSsrc);
-  encoder_rtcp_feedback_.OnReceivedIntraFrameRequest(kSsrc);
-  simulated_clock_.AdvanceTimeMilliseconds(10);
-  encoder_rtcp_feedback_.OnReceivedIntraFrameRequest(kSsrc);
-
-  EXPECT_CALL(encoder_, OnReceivedIntraFrameRequest(0)).Times(1);
-  simulated_clock_.AdvanceTimeMilliseconds(300);
-  encoder_rtcp_feedback_.OnReceivedIntraFrameRequest(kSsrc);
-  encoder_rtcp_feedback_.OnReceivedIntraFrameRequest(kSsrc);
-  encoder_rtcp_feedback_.OnReceivedIntraFrameRequest(kSsrc);
-}
-
-}  // namespace webrtc
diff --git a/video/end_to_end_tests.cc b/video/end_to_end_tests.cc
deleted file mode 100644
index e92d8fe..0000000
--- a/video/end_to_end_tests.cc
+++ /dev/null
@@ -1,5028 +0,0 @@
-/*
- *  Copyright (c) 2013 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 <algorithm>
-#include <list>
-#include <map>
-#include <memory>
-#include <sstream>
-#include <string>
-#include <vector>
-
-#include "webrtc/api/optional.h"
-#include "webrtc/api/video_codecs/video_encoder.h"
-#include "webrtc/call/call.h"
-#include "webrtc/common_video/include/frame_callback.h"
-#include "webrtc/logging/rtc_event_log/rtc_event_log.h"
-#include "webrtc/media/base/fakevideorenderer.h"
-#include "webrtc/media/base/mediaconstants.h"
-#include "webrtc/media/engine/internalencoderfactory.h"
-#include "webrtc/media/engine/simulcast_encoder_adapter.h"
-#include "webrtc/media/engine/webrtcvideoencoderfactory.h"
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp.h"
-#include "webrtc/modules/rtp_rtcp/source/byte_io.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/nack.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/rapid_resync_request.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_format.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_utility.h"
-#include "webrtc/modules/video_coding/codecs/h264/include/h264.h"
-#include "webrtc/modules/video_coding/codecs/vp8/include/vp8.h"
-#include "webrtc/modules/video_coding/codecs/vp9/include/vp9.h"
-#include "webrtc/modules/video_coding/include/video_coding_defines.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/event.h"
-#include "webrtc/rtc_base/file.h"
-#include "webrtc/rtc_base/ptr_util.h"
-#include "webrtc/rtc_base/random.h"
-#include "webrtc/rtc_base/rate_limiter.h"
-#include "webrtc/system_wrappers/include/metrics.h"
-#include "webrtc/system_wrappers/include/metrics_default.h"
-#include "webrtc/system_wrappers/include/sleep.h"
-#include "webrtc/test/call_test.h"
-#include "webrtc/test/direct_transport.h"
-#include "webrtc/test/encoder_settings.h"
-#include "webrtc/test/fake_decoder.h"
-#include "webrtc/test/fake_encoder.h"
-#include "webrtc/test/field_trial.h"
-#include "webrtc/test/frame_generator.h"
-#include "webrtc/test/frame_generator_capturer.h"
-#include "webrtc/test/gmock.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/null_transport.h"
-#include "webrtc/test/rtcp_packet_parser.h"
-#include "webrtc/test/rtp_rtcp_observer.h"
-#include "webrtc/test/testsupport/fileutils.h"
-#include "webrtc/test/testsupport/perf_test.h"
-#include "webrtc/video/transport_adapter.h"
-
-// Flaky under MemorySanitizer: bugs.webrtc.org/7419
-#if defined(MEMORY_SANITIZER)
-#define MAYBE_InitialProbing DISABLED_InitialProbing
-// Fails on iOS bots: bugs.webrtc.org/7851
-#elif defined(TARGET_IPHONE_SIMULATOR) && TARGET_IPHONE_SIMULATOR
-#define MAYBE_InitialProbing DISABLED_InitialProbing
-#else
-#define MAYBE_InitialProbing InitialProbing
-#endif
-
-namespace webrtc {
-
-namespace {
-constexpr int kSilenceTimeoutMs = 2000;
-}
-
-class EndToEndTest : public test::CallTest {
- public:
-  EndToEndTest() {}
-
-  virtual ~EndToEndTest() {
-    EXPECT_EQ(nullptr, video_send_stream_);
-    EXPECT_TRUE(video_receive_streams_.empty());
-  }
-
- protected:
-  class UnusedTransport : public Transport {
-   private:
-    bool SendRtp(const uint8_t* packet,
-                 size_t length,
-                 const PacketOptions& options) override {
-      ADD_FAILURE() << "Unexpected RTP sent.";
-      return false;
-    }
-
-    bool SendRtcp(const uint8_t* packet, size_t length) override {
-      ADD_FAILURE() << "Unexpected RTCP sent.";
-      return false;
-    }
-  };
-
-  class RequiredTransport : public Transport {
-   public:
-    RequiredTransport(bool rtp_required, bool rtcp_required)
-        : need_rtp_(rtp_required), need_rtcp_(rtcp_required) {}
-    ~RequiredTransport() {
-      if (need_rtp_) {
-        ADD_FAILURE() << "Expected RTP packet not sent.";
-      }
-      if (need_rtcp_) {
-        ADD_FAILURE() << "Expected RTCP packet not sent.";
-      }
-    }
-
-   private:
-    bool SendRtp(const uint8_t* packet,
-                 size_t length,
-                 const PacketOptions& options) override {
-      rtc::CritScope lock(&crit_);
-      need_rtp_ = false;
-      return true;
-    }
-
-    bool SendRtcp(const uint8_t* packet, size_t length) override {
-      rtc::CritScope lock(&crit_);
-      need_rtcp_ = false;
-      return true;
-    }
-    bool need_rtp_;
-    bool need_rtcp_;
-    rtc::CriticalSection crit_;
-  };
-
-  void DecodesRetransmittedFrame(bool enable_rtx, bool enable_red);
-  void ReceivesPliAndRecovers(int rtp_history_ms);
-  void RespectsRtcpMode(RtcpMode rtcp_mode);
-  void TestSendsSetSsrcs(size_t num_ssrcs, bool send_single_ssrc_first);
-  void TestRtpStatePreservation(bool use_rtx, bool provoke_rtcpsr_before_rtp);
-  void VerifyHistogramStats(bool use_rtx, bool use_red, bool screenshare);
-  void VerifyNewVideoSendStreamsRespectNetworkState(
-      MediaType network_to_bring_up,
-      VideoEncoder* encoder,
-      Transport* transport);
-  void VerifyNewVideoReceiveStreamsRespectNetworkState(
-      MediaType network_to_bring_up,
-      Transport* transport);
-};
-
-TEST_F(EndToEndTest, ReceiverCanBeStartedTwice) {
-  CreateCalls(Call::Config(event_log_.get()), Call::Config(event_log_.get()));
-
-  test::NullTransport transport;
-  CreateSendConfig(1, 0, 0, &transport);
-  CreateMatchingReceiveConfigs(&transport);
-
-  CreateVideoStreams();
-
-  video_receive_streams_[0]->Start();
-  video_receive_streams_[0]->Start();
-
-  DestroyStreams();
-}
-
-TEST_F(EndToEndTest, ReceiverCanBeStoppedTwice) {
-  CreateCalls(Call::Config(event_log_.get()), Call::Config(event_log_.get()));
-
-  test::NullTransport transport;
-  CreateSendConfig(1, 0, 0, &transport);
-  CreateMatchingReceiveConfigs(&transport);
-
-  CreateVideoStreams();
-
-  video_receive_streams_[0]->Stop();
-  video_receive_streams_[0]->Stop();
-
-  DestroyStreams();
-}
-
-TEST_F(EndToEndTest, ReceiverCanBeStoppedAndRestarted) {
-  CreateCalls(Call::Config(event_log_.get()), Call::Config(event_log_.get()));
-
-  test::NullTransport transport;
-  CreateSendConfig(1, 0, 0, &transport);
-  CreateMatchingReceiveConfigs(&transport);
-
-  CreateVideoStreams();
-
-  video_receive_streams_[0]->Stop();
-  video_receive_streams_[0]->Start();
-  video_receive_streams_[0]->Stop();
-
-  DestroyStreams();
-}
-
-TEST_F(EndToEndTest, RendersSingleDelayedFrame) {
-  static const int kWidth = 320;
-  static const int kHeight = 240;
-  // This constant is chosen to be higher than the timeout in the video_render
-  // module. This makes sure that frames aren't dropped if there are no other
-  // frames in the queue.
-  static const int kRenderDelayMs = 1000;
-
-  class Renderer : public rtc::VideoSinkInterface<VideoFrame> {
-   public:
-    Renderer() : event_(false, false) {}
-
-    void OnFrame(const VideoFrame& video_frame) override {
-      SleepMs(kRenderDelayMs);
-      event_.Set();
-    }
-
-    bool Wait() { return event_.Wait(kDefaultTimeoutMs); }
-
-    rtc::Event event_;
-  } renderer;
-
-  test::FrameForwarder frame_forwarder;
-  std::unique_ptr<test::DirectTransport> sender_transport;
-  std::unique_ptr<test::DirectTransport> receiver_transport;
-
-  task_queue_.SendTask([this, &renderer, &frame_forwarder, &sender_transport,
-                        &receiver_transport]() {
-    CreateCalls(Call::Config(event_log_.get()), Call::Config(event_log_.get()));
-
-    sender_transport = rtc::MakeUnique<test::DirectTransport>(
-        &task_queue_, sender_call_.get(), payload_type_map_);
-    receiver_transport = rtc::MakeUnique<test::DirectTransport>(
-        &task_queue_, receiver_call_.get(), payload_type_map_);
-    sender_transport->SetReceiver(receiver_call_->Receiver());
-    receiver_transport->SetReceiver(sender_call_->Receiver());
-
-    CreateSendConfig(1, 0, 0, sender_transport.get());
-    CreateMatchingReceiveConfigs(receiver_transport.get());
-
-    video_receive_configs_[0].renderer = &renderer;
-
-    CreateVideoStreams();
-    Start();
-
-    // Create frames that are smaller than the send width/height, this is done
-    // to check that the callbacks are done after processing video.
-    std::unique_ptr<test::FrameGenerator> frame_generator(
-        test::FrameGenerator::CreateSquareGenerator(kWidth, kHeight));
-    video_send_stream_->SetSource(
-        &frame_forwarder,
-        VideoSendStream::DegradationPreference::kMaintainFramerate);
-
-    frame_forwarder.IncomingCapturedFrame(*frame_generator->NextFrame());
-  });
-
-  EXPECT_TRUE(renderer.Wait())
-      << "Timed out while waiting for the frame to render.";
-
-  task_queue_.SendTask([this, &sender_transport, &receiver_transport]() {
-    Stop();
-    DestroyStreams();
-    sender_transport.reset();
-    receiver_transport.reset();
-    DestroyCalls();
-  });
-}
-
-TEST_F(EndToEndTest, TransmitsFirstFrame) {
-  class Renderer : public rtc::VideoSinkInterface<VideoFrame> {
-   public:
-    Renderer() : event_(false, false) {}
-
-    void OnFrame(const VideoFrame& video_frame) override { event_.Set(); }
-
-    bool Wait() { return event_.Wait(kDefaultTimeoutMs); }
-
-    rtc::Event event_;
-  } renderer;
-
-  std::unique_ptr<test::FrameGenerator> frame_generator;
-  test::FrameForwarder frame_forwarder;
-
-  std::unique_ptr<test::DirectTransport> sender_transport;
-  std::unique_ptr<test::DirectTransport> receiver_transport;
-
-  task_queue_.SendTask([this, &renderer, &frame_generator, &frame_forwarder,
-                        &sender_transport, &receiver_transport]() {
-    CreateCalls(Call::Config(event_log_.get()), Call::Config(event_log_.get()));
-
-    sender_transport = rtc::MakeUnique<test::DirectTransport>(
-        &task_queue_, sender_call_.get(), payload_type_map_);
-    receiver_transport = rtc::MakeUnique<test::DirectTransport>(
-        &task_queue_, receiver_call_.get(), payload_type_map_);
-    sender_transport->SetReceiver(receiver_call_->Receiver());
-    receiver_transport->SetReceiver(sender_call_->Receiver());
-
-    CreateSendConfig(1, 0, 0, sender_transport.get());
-    CreateMatchingReceiveConfigs(receiver_transport.get());
-    video_receive_configs_[0].renderer = &renderer;
-
-    CreateVideoStreams();
-    Start();
-
-    frame_generator = test::FrameGenerator::CreateSquareGenerator(
-        kDefaultWidth, kDefaultHeight);
-    video_send_stream_->SetSource(
-        &frame_forwarder,
-        VideoSendStream::DegradationPreference::kMaintainFramerate);
-    frame_forwarder.IncomingCapturedFrame(*frame_generator->NextFrame());
-  });
-
-  EXPECT_TRUE(renderer.Wait())
-      << "Timed out while waiting for the frame to render.";
-
-  task_queue_.SendTask([this, &sender_transport, &receiver_transport]() {
-    Stop();
-    DestroyStreams();
-    sender_transport.reset();
-    receiver_transport.reset();
-    DestroyCalls();
-  });
-}
-
-class CodecObserver : public test::EndToEndTest,
-                      public rtc::VideoSinkInterface<VideoFrame> {
- public:
-  CodecObserver(int no_frames_to_wait_for,
-                VideoRotation rotation_to_test,
-                const std::string& payload_name,
-                webrtc::VideoEncoder* encoder,
-                webrtc::VideoDecoder* decoder)
-      : EndToEndTest(4 * webrtc::EndToEndTest::kDefaultTimeoutMs),
-        // TODO(hta): This timeout (120 seconds) is excessive.
-        // https://bugs.webrtc.org/6830
-        no_frames_to_wait_for_(no_frames_to_wait_for),
-        expected_rotation_(rotation_to_test),
-        payload_name_(payload_name),
-        encoder_(encoder),
-        decoder_(decoder),
-        frame_counter_(0) {}
-
-  void PerformTest() override {
-    EXPECT_TRUE(Wait())
-        << "Timed out while waiting for enough frames to be decoded.";
-  }
-
-  void ModifyVideoConfigs(
-      VideoSendStream::Config* send_config,
-      std::vector<VideoReceiveStream::Config>* receive_configs,
-      VideoEncoderConfig* encoder_config) override {
-    send_config->encoder_settings.encoder = encoder_.get();
-    send_config->encoder_settings.payload_name = payload_name_;
-    send_config->encoder_settings.payload_type =
-        test::CallTest::kVideoSendPayloadType;
-
-    (*receive_configs)[0].renderer = this;
-    (*receive_configs)[0].decoders.resize(1);
-    (*receive_configs)[0].decoders[0].payload_type =
-        send_config->encoder_settings.payload_type;
-    (*receive_configs)[0].decoders[0].payload_name =
-        send_config->encoder_settings.payload_name;
-    (*receive_configs)[0].decoders[0].decoder = decoder_.get();
-  }
-
-  void OnFrame(const VideoFrame& video_frame) override {
-    EXPECT_EQ(expected_rotation_, video_frame.rotation());
-    if (++frame_counter_ == no_frames_to_wait_for_)
-      observation_complete_.Set();
-  }
-
-  void OnFrameGeneratorCapturerCreated(
-      test::FrameGeneratorCapturer* frame_generator_capturer) override {
-    frame_generator_capturer->SetFakeRotation(expected_rotation_);
-  }
-
- private:
-  int no_frames_to_wait_for_;
-  VideoRotation expected_rotation_;
-  std::string payload_name_;
-  std::unique_ptr<webrtc::VideoEncoder> encoder_;
-  std::unique_ptr<webrtc::VideoDecoder> decoder_;
-  int frame_counter_;
-};
-
-TEST_F(EndToEndTest, SendsAndReceivesVP8) {
-  CodecObserver test(5, kVideoRotation_0, "VP8", VP8Encoder::Create(),
-                     VP8Decoder::Create());
-  RunBaseTest(&test);
-}
-
-TEST_F(EndToEndTest, SendsAndReceivesVP8Rotation90) {
-  CodecObserver test(5, kVideoRotation_90, "VP8", VP8Encoder::Create(),
-                     VP8Decoder::Create());
-  RunBaseTest(&test);
-}
-
-#if !defined(RTC_DISABLE_VP9)
-TEST_F(EndToEndTest, SendsAndReceivesVP9) {
-  CodecObserver test(500, kVideoRotation_0, "VP9", VP9Encoder::Create(),
-                     VP9Decoder::Create());
-  RunBaseTest(&test);
-}
-
-TEST_F(EndToEndTest, SendsAndReceivesVP9VideoRotation90) {
-  CodecObserver test(5, kVideoRotation_90, "VP9", VP9Encoder::Create(),
-                     VP9Decoder::Create());
-  RunBaseTest(&test);
-}
-#endif  // !defined(RTC_DISABLE_VP9)
-
-#if defined(WEBRTC_USE_H264)
-TEST_F(EndToEndTest, SendsAndReceivesH264) {
-  CodecObserver test(500, kVideoRotation_0, "H264",
-                     H264Encoder::Create(cricket::VideoCodec("H264")),
-                     H264Decoder::Create());
-  RunBaseTest(&test);
-}
-
-TEST_F(EndToEndTest, SendsAndReceivesH264VideoRotation90) {
-  CodecObserver test(5, kVideoRotation_90, "H264",
-                     H264Encoder::Create(cricket::VideoCodec("H264")),
-                     H264Decoder::Create());
-  RunBaseTest(&test);
-}
-
-TEST_F(EndToEndTest, SendsAndReceivesH264PacketizationMode0) {
-  cricket::VideoCodec codec = cricket::VideoCodec("H264");
-  codec.SetParam(cricket::kH264FmtpPacketizationMode, "0");
-  CodecObserver test(500, kVideoRotation_0, "H264", H264Encoder::Create(codec),
-                     H264Decoder::Create());
-  RunBaseTest(&test);
-}
-
-TEST_F(EndToEndTest, SendsAndReceivesH264PacketizationMode1) {
-  cricket::VideoCodec codec = cricket::VideoCodec("H264");
-  codec.SetParam(cricket::kH264FmtpPacketizationMode, "1");
-  CodecObserver test(500, kVideoRotation_0, "H264", H264Encoder::Create(codec),
-                     H264Decoder::Create());
-  RunBaseTest(&test);
-}
-
-#endif  // defined(WEBRTC_USE_H264)
-
-TEST_F(EndToEndTest, ReceiverUsesLocalSsrc) {
-  class SyncRtcpObserver : public test::EndToEndTest {
-   public:
-    SyncRtcpObserver() : EndToEndTest(kDefaultTimeoutMs) {}
-
-    Action OnReceiveRtcp(const uint8_t* packet, size_t length) override {
-      test::RtcpPacketParser parser;
-      EXPECT_TRUE(parser.Parse(packet, length));
-      EXPECT_EQ(kReceiverLocalVideoSsrc, parser.sender_ssrc());
-      observation_complete_.Set();
-
-      return SEND_PACKET;
-    }
-
-    void PerformTest() override {
-      EXPECT_TRUE(Wait())
-          << "Timed out while waiting for a receiver RTCP packet to be sent.";
-    }
-  } test;
-
-  RunBaseTest(&test);
-}
-
-TEST_F(EndToEndTest, ReceivesAndRetransmitsNack) {
-  static const int kNumberOfNacksToObserve = 2;
-  static const int kLossBurstSize = 2;
-  static const int kPacketsBetweenLossBursts = 9;
-  class NackObserver : public test::EndToEndTest {
-   public:
-    NackObserver()
-        : EndToEndTest(kLongTimeoutMs),
-          sent_rtp_packets_(0),
-          packets_left_to_drop_(0),
-          nacks_left_(kNumberOfNacksToObserve) {}
-
-   private:
-    Action OnSendRtp(const uint8_t* packet, size_t length) override {
-      rtc::CritScope lock(&crit_);
-      RTPHeader header;
-      EXPECT_TRUE(parser_->Parse(packet, length, &header));
-
-      // Never drop retransmitted packets.
-      if (dropped_packets_.find(header.sequenceNumber) !=
-          dropped_packets_.end()) {
-        retransmitted_packets_.insert(header.sequenceNumber);
-        return SEND_PACKET;
-      }
-
-      if (nacks_left_ <= 0 &&
-          retransmitted_packets_.size() == dropped_packets_.size()) {
-        observation_complete_.Set();
-      }
-
-      ++sent_rtp_packets_;
-
-      // Enough NACKs received, stop dropping packets.
-      if (nacks_left_ <= 0)
-        return SEND_PACKET;
-
-      // Check if it's time for a new loss burst.
-      if (sent_rtp_packets_ % kPacketsBetweenLossBursts == 0)
-        packets_left_to_drop_ = kLossBurstSize;
-
-      // Never drop padding packets as those won't be retransmitted.
-      if (packets_left_to_drop_ > 0 && header.paddingLength == 0) {
-        --packets_left_to_drop_;
-        dropped_packets_.insert(header.sequenceNumber);
-        return DROP_PACKET;
-      }
-
-      return SEND_PACKET;
-    }
-
-    Action OnReceiveRtcp(const uint8_t* packet, size_t length) override {
-      rtc::CritScope lock(&crit_);
-      test::RtcpPacketParser parser;
-      EXPECT_TRUE(parser.Parse(packet, length));
-      nacks_left_ -= parser.nack()->num_packets();
-      return SEND_PACKET;
-    }
-
-    void ModifyVideoConfigs(
-        VideoSendStream::Config* send_config,
-        std::vector<VideoReceiveStream::Config>* receive_configs,
-        VideoEncoderConfig* encoder_config) override {
-      send_config->rtp.nack.rtp_history_ms = kNackRtpHistoryMs;
-      (*receive_configs)[0].rtp.nack.rtp_history_ms = kNackRtpHistoryMs;
-    }
-
-    void PerformTest() override {
-      EXPECT_TRUE(Wait())
-          << "Timed out waiting for packets to be NACKed, retransmitted and "
-             "rendered.";
-    }
-
-    rtc::CriticalSection crit_;
-    std::set<uint16_t> dropped_packets_;
-    std::set<uint16_t> retransmitted_packets_;
-    uint64_t sent_rtp_packets_;
-    int packets_left_to_drop_;
-    int nacks_left_ RTC_GUARDED_BY(&crit_);
-  } test;
-
-  RunBaseTest(&test);
-}
-
-TEST_F(EndToEndTest, ReceivesNackAndRetransmitsAudio) {
-  class NackObserver : public test::EndToEndTest {
-   public:
-    NackObserver()
-        : EndToEndTest(kLongTimeoutMs),
-          local_ssrc_(0),
-          remote_ssrc_(0),
-          receive_transport_(nullptr) {}
-
-   private:
-    size_t GetNumVideoStreams() const override { return 0; }
-    size_t GetNumAudioStreams() const override { return 1; }
-
-    test::PacketTransport* CreateReceiveTransport(
-        test::SingleThreadedTaskQueueForTesting* task_queue) override {
-      test::PacketTransport* receive_transport = new test::PacketTransport(
-          task_queue, nullptr, this, test::PacketTransport::kReceiver,
-          payload_type_map_, FakeNetworkPipe::Config());
-      receive_transport_ = receive_transport;
-      return receive_transport;
-    }
-
-    Action OnSendRtp(const uint8_t* packet, size_t length) override {
-      RTPHeader header;
-      EXPECT_TRUE(parser_->Parse(packet, length, &header));
-
-      if (!sequence_number_to_retransmit_) {
-        sequence_number_to_retransmit_ =
-            rtc::Optional<uint16_t>(header.sequenceNumber);
-
-        // Don't ask for retransmission straight away, may be deduped in pacer.
-      } else if (header.sequenceNumber == *sequence_number_to_retransmit_) {
-        observation_complete_.Set();
-      } else {
-        // Send a NACK as often as necessary until retransmission is received.
-        rtcp::Nack nack;
-        nack.SetSenderSsrc(local_ssrc_);
-        nack.SetMediaSsrc(remote_ssrc_);
-        uint16_t nack_list[] = {*sequence_number_to_retransmit_};
-        nack.SetPacketIds(nack_list, 1);
-        rtc::Buffer buffer = nack.Build();
-
-        EXPECT_TRUE(receive_transport_->SendRtcp(buffer.data(), buffer.size()));
-      }
-
-      return SEND_PACKET;
-    }
-
-    void ModifyAudioConfigs(
-        AudioSendStream::Config* send_config,
-        std::vector<AudioReceiveStream::Config>* receive_configs) override {
-      send_config->rtp.nack.rtp_history_ms = kNackRtpHistoryMs;
-      (*receive_configs)[0].rtp.nack.rtp_history_ms = kNackRtpHistoryMs;
-      local_ssrc_ = (*receive_configs)[0].rtp.local_ssrc;
-      remote_ssrc_ = (*receive_configs)[0].rtp.remote_ssrc;
-    }
-
-    void PerformTest() override {
-      EXPECT_TRUE(Wait())
-          << "Timed out waiting for packets to be NACKed, retransmitted and "
-             "rendered.";
-    }
-
-    uint32_t local_ssrc_;
-    uint32_t remote_ssrc_;
-    Transport* receive_transport_;
-    rtc::Optional<uint16_t> sequence_number_to_retransmit_;
-  } test;
-
-  RunBaseTest(&test);
-}
-
-TEST_F(EndToEndTest, ReceivesUlpfec) {
-  class UlpfecRenderObserver : public test::EndToEndTest,
-                               public rtc::VideoSinkInterface<VideoFrame> {
-   public:
-    UlpfecRenderObserver()
-        : EndToEndTest(kDefaultTimeoutMs),
-          encoder_(VP8Encoder::Create()),
-          random_(0xcafef00d1),
-          num_packets_sent_(0) {}
-
-   private:
-    Action OnSendRtp(const uint8_t* packet, size_t length) override {
-      rtc::CritScope lock(&crit_);
-      RTPHeader header;
-      EXPECT_TRUE(parser_->Parse(packet, length, &header));
-
-      EXPECT_TRUE(header.payloadType == kVideoSendPayloadType ||
-                  header.payloadType == kRedPayloadType)
-          << "Unknown payload type received.";
-      EXPECT_EQ(kVideoSendSsrcs[0], header.ssrc) << "Unknown SSRC received.";
-
-      // Parse RED header.
-      int encapsulated_payload_type = -1;
-      if (header.payloadType == kRedPayloadType) {
-        encapsulated_payload_type =
-            static_cast<int>(packet[header.headerLength]);
-
-        EXPECT_TRUE(encapsulated_payload_type == kVideoSendPayloadType ||
-                    encapsulated_payload_type == kUlpfecPayloadType)
-            << "Unknown encapsulated payload type received.";
-      }
-
-      // To minimize test flakiness, always let ULPFEC packets through.
-      if (encapsulated_payload_type == kUlpfecPayloadType) {
-        return SEND_PACKET;
-      }
-
-      // Simulate 5% video packet loss after rampup period. Record the
-      // corresponding timestamps that were dropped.
-      if (num_packets_sent_++ > 100 && random_.Rand(1, 100) <= 5) {
-        if (encapsulated_payload_type == kVideoSendPayloadType) {
-          dropped_sequence_numbers_.insert(header.sequenceNumber);
-          dropped_timestamps_.insert(header.timestamp);
-        }
-        return DROP_PACKET;
-      }
-
-      return SEND_PACKET;
-    }
-
-    void OnFrame(const VideoFrame& video_frame) override {
-      rtc::CritScope lock(&crit_);
-      // Rendering frame with timestamp of packet that was dropped -> FEC
-      // protection worked.
-      auto it = dropped_timestamps_.find(video_frame.timestamp());
-      if (it != dropped_timestamps_.end()) {
-        observation_complete_.Set();
-      }
-    }
-
-    void ModifyVideoConfigs(
-        VideoSendStream::Config* send_config,
-        std::vector<VideoReceiveStream::Config>* receive_configs,
-        VideoEncoderConfig* encoder_config) override {
-      // Use VP8 instead of FAKE, since the latter does not have PictureID
-      // in the packetization headers.
-      send_config->encoder_settings.encoder = encoder_.get();
-      send_config->encoder_settings.payload_name = "VP8";
-      send_config->encoder_settings.payload_type = kVideoSendPayloadType;
-      VideoReceiveStream::Decoder decoder =
-          test::CreateMatchingDecoder(send_config->encoder_settings);
-      decoder_.reset(decoder.decoder);
-      (*receive_configs)[0].decoders.clear();
-      (*receive_configs)[0].decoders.push_back(decoder);
-
-      // Enable ULPFEC over RED.
-      send_config->rtp.ulpfec.red_payload_type = kRedPayloadType;
-      send_config->rtp.ulpfec.ulpfec_payload_type = kUlpfecPayloadType;
-      (*receive_configs)[0].rtp.ulpfec.red_payload_type = kRedPayloadType;
-      (*receive_configs)[0].rtp.ulpfec.ulpfec_payload_type = kUlpfecPayloadType;
-
-      (*receive_configs)[0].renderer = this;
-    }
-
-    void PerformTest() override {
-      EXPECT_TRUE(Wait())
-          << "Timed out waiting for dropped frames to be rendered.";
-    }
-
-    rtc::CriticalSection crit_;
-    std::unique_ptr<VideoEncoder> encoder_;
-    std::unique_ptr<VideoDecoder> decoder_;
-    std::set<uint32_t> dropped_sequence_numbers_ RTC_GUARDED_BY(crit_);
-    // Several packets can have the same timestamp.
-    std::multiset<uint32_t> dropped_timestamps_ RTC_GUARDED_BY(crit_);
-    Random random_;
-    int num_packets_sent_ RTC_GUARDED_BY(crit_);
-  } test;
-
-  RunBaseTest(&test);
-}
-
-class FlexfecRenderObserver : public test::EndToEndTest,
-                              public rtc::VideoSinkInterface<VideoFrame> {
- public:
-  static constexpr uint32_t kVideoLocalSsrc = 123;
-  static constexpr uint32_t kFlexfecLocalSsrc = 456;
-
-  explicit FlexfecRenderObserver(bool enable_nack, bool expect_flexfec_rtcp)
-      : test::EndToEndTest(test::CallTest::kDefaultTimeoutMs),
-        enable_nack_(enable_nack),
-        expect_flexfec_rtcp_(expect_flexfec_rtcp),
-        received_flexfec_rtcp_(false),
-        random_(0xcafef00d1),
-        num_packets_sent_(0) {}
-
-  size_t GetNumFlexfecStreams() const override { return 1; }
-
- private:
-  Action OnSendRtp(const uint8_t* packet, size_t length) override {
-    rtc::CritScope lock(&crit_);
-    RTPHeader header;
-    EXPECT_TRUE(parser_->Parse(packet, length, &header));
-
-    EXPECT_TRUE(header.payloadType ==
-                    test::CallTest::kFakeVideoSendPayloadType ||
-                header.payloadType == test::CallTest::kFlexfecPayloadType ||
-                (enable_nack_ &&
-                 header.payloadType == test::CallTest::kSendRtxPayloadType))
-        << "Unknown payload type received.";
-    EXPECT_TRUE(
-        header.ssrc == test::CallTest::kVideoSendSsrcs[0] ||
-        header.ssrc == test::CallTest::kFlexfecSendSsrc ||
-        (enable_nack_ && header.ssrc == test::CallTest::kSendRtxSsrcs[0]))
-        << "Unknown SSRC received.";
-
-    // To reduce test flakiness, always let FlexFEC packets through.
-    if (header.payloadType == test::CallTest::kFlexfecPayloadType) {
-      EXPECT_EQ(test::CallTest::kFlexfecSendSsrc, header.ssrc);
-
-      return SEND_PACKET;
-    }
-
-    // To reduce test flakiness, always let RTX packets through.
-    if (header.payloadType == test::CallTest::kSendRtxPayloadType) {
-      EXPECT_EQ(test::CallTest::kSendRtxSsrcs[0], header.ssrc);
-
-      // Parse RTX header.
-      uint16_t original_sequence_number =
-          ByteReader<uint16_t>::ReadBigEndian(&packet[header.headerLength]);
-
-      // From the perspective of FEC, a retransmitted packet is no longer
-      // dropped, so remove it from list of dropped packets.
-      auto seq_num_it =
-          dropped_sequence_numbers_.find(original_sequence_number);
-      if (seq_num_it != dropped_sequence_numbers_.end()) {
-        dropped_sequence_numbers_.erase(seq_num_it);
-        auto ts_it = dropped_timestamps_.find(header.timestamp);
-        EXPECT_NE(ts_it, dropped_timestamps_.end());
-        dropped_timestamps_.erase(ts_it);
-      }
-
-      return SEND_PACKET;
-    }
-
-    // Simulate 5% video packet loss after rampup period. Record the
-    // corresponding timestamps that were dropped.
-    if (num_packets_sent_++ > 100 && random_.Rand(1, 100) <= 5) {
-      EXPECT_EQ(test::CallTest::kFakeVideoSendPayloadType, header.payloadType);
-      EXPECT_EQ(test::CallTest::kVideoSendSsrcs[0], header.ssrc);
-
-      dropped_sequence_numbers_.insert(header.sequenceNumber);
-      dropped_timestamps_.insert(header.timestamp);
-
-      return DROP_PACKET;
-    }
-
-    return SEND_PACKET;
-  }
-
-  Action OnReceiveRtcp(const uint8_t* data, size_t length) override {
-    test::RtcpPacketParser parser;
-
-    parser.Parse(data, length);
-    if (parser.sender_ssrc() == kFlexfecLocalSsrc) {
-      EXPECT_EQ(1, parser.receiver_report()->num_packets());
-      const std::vector<rtcp::ReportBlock>& report_blocks =
-          parser.receiver_report()->report_blocks();
-      if (!report_blocks.empty()) {
-        EXPECT_EQ(1U, report_blocks.size());
-        EXPECT_EQ(test::CallTest::kFlexfecSendSsrc,
-                  report_blocks[0].source_ssrc());
-        rtc::CritScope lock(&crit_);
-        received_flexfec_rtcp_ = true;
-      }
-    }
-
-    return SEND_PACKET;
-  }
-
-  test::PacketTransport* CreateSendTransport(
-      test::SingleThreadedTaskQueueForTesting* task_queue,
-      Call* sender_call) override {
-    // At low RTT (< kLowRttNackMs) -> NACK only, no FEC.
-    const int kNetworkDelayMs = 100;
-    FakeNetworkPipe::Config config;
-    config.queue_delay_ms = kNetworkDelayMs;
-    return new test::PacketTransport(task_queue, sender_call, this,
-                                     test::PacketTransport::kSender,
-                                     test::CallTest::payload_type_map_, config);
-  }
-
-  void OnFrame(const VideoFrame& video_frame) override {
-    EXPECT_EQ(kVideoRotation_90, video_frame.rotation());
-
-    rtc::CritScope lock(&crit_);
-    // Rendering frame with timestamp of packet that was dropped -> FEC
-    // protection worked.
-    auto it = dropped_timestamps_.find(video_frame.timestamp());
-    if (it != dropped_timestamps_.end()) {
-      if (!expect_flexfec_rtcp_ || received_flexfec_rtcp_) {
-        observation_complete_.Set();
-      }
-    }
-  }
-
-  void ModifyVideoConfigs(
-      VideoSendStream::Config* send_config,
-      std::vector<VideoReceiveStream::Config>* receive_configs,
-      VideoEncoderConfig* encoder_config) override {
-    (*receive_configs)[0].rtp.local_ssrc = kVideoLocalSsrc;
-    (*receive_configs)[0].renderer = this;
-
-    if (enable_nack_) {
-      send_config->rtp.nack.rtp_history_ms = test::CallTest::kNackRtpHistoryMs;
-      send_config->rtp.ulpfec.red_rtx_payload_type =
-          test::CallTest::kRtxRedPayloadType;
-      send_config->rtp.rtx.ssrcs.push_back(test::CallTest::kSendRtxSsrcs[0]);
-      send_config->rtp.rtx.payload_type = test::CallTest::kSendRtxPayloadType;
-
-      (*receive_configs)[0].rtp.nack.rtp_history_ms =
-          test::CallTest::kNackRtpHistoryMs;
-      (*receive_configs)[0].rtp.ulpfec.red_rtx_payload_type =
-          test::CallTest::kRtxRedPayloadType;
-
-      (*receive_configs)[0].rtp.rtx_ssrc = test::CallTest::kSendRtxSsrcs[0];
-      (*receive_configs)[0]
-          .rtp
-          .rtx_associated_payload_types[test::CallTest::kSendRtxPayloadType] =
-          test::CallTest::kVideoSendPayloadType;
-    }
-  }
-
-  void OnFrameGeneratorCapturerCreated(
-      test::FrameGeneratorCapturer* frame_generator_capturer) override {
-    frame_generator_capturer->SetFakeRotation(kVideoRotation_90);
-  }
-
-  void ModifyFlexfecConfigs(
-      std::vector<FlexfecReceiveStream::Config>* receive_configs) override {
-    (*receive_configs)[0].local_ssrc = kFlexfecLocalSsrc;
-  }
-
-  void PerformTest() override {
-    EXPECT_TRUE(Wait())
-        << "Timed out waiting for dropped frames to be rendered.";
-  }
-
-  rtc::CriticalSection crit_;
-  std::set<uint32_t> dropped_sequence_numbers_ RTC_GUARDED_BY(crit_);
-  // Several packets can have the same timestamp.
-  std::multiset<uint32_t> dropped_timestamps_ RTC_GUARDED_BY(crit_);
-  const bool enable_nack_;
-  const bool expect_flexfec_rtcp_;
-  bool received_flexfec_rtcp_ RTC_GUARDED_BY(crit_);
-  Random random_;
-  int num_packets_sent_;
-};
-
-TEST_F(EndToEndTest, RecoversWithFlexfec) {
-  FlexfecRenderObserver test(false, false);
-  RunBaseTest(&test);
-}
-
-TEST_F(EndToEndTest, RecoversWithFlexfecAndNack) {
-  FlexfecRenderObserver test(true, false);
-  RunBaseTest(&test);
-}
-
-TEST_F(EndToEndTest, RecoversWithFlexfecAndSendsCorrespondingRtcp) {
-  FlexfecRenderObserver test(false, true);
-  RunBaseTest(&test);
-}
-
-TEST_F(EndToEndTest, ReceivedUlpfecPacketsNotNacked) {
-  class UlpfecNackObserver : public test::EndToEndTest {
-   public:
-    UlpfecNackObserver()
-        : EndToEndTest(kDefaultTimeoutMs),
-          state_(kFirstPacket),
-          ulpfec_sequence_number_(0),
-          has_last_sequence_number_(false),
-          last_sequence_number_(0),
-          encoder_(VP8Encoder::Create()),
-          decoder_(VP8Decoder::Create()) {}
-
-   private:
-    Action OnSendRtp(const uint8_t* packet, size_t length) override {
-      rtc::CritScope lock_(&crit_);
-      RTPHeader header;
-      EXPECT_TRUE(parser_->Parse(packet, length, &header));
-
-      int encapsulated_payload_type = -1;
-      if (header.payloadType == kRedPayloadType) {
-        encapsulated_payload_type =
-            static_cast<int>(packet[header.headerLength]);
-        if (encapsulated_payload_type != kFakeVideoSendPayloadType)
-          EXPECT_EQ(kUlpfecPayloadType, encapsulated_payload_type);
-      } else {
-        EXPECT_EQ(kFakeVideoSendPayloadType, header.payloadType);
-      }
-
-      if (has_last_sequence_number_ &&
-          !IsNewerSequenceNumber(header.sequenceNumber,
-                                 last_sequence_number_)) {
-        // Drop retransmitted packets.
-        return DROP_PACKET;
-      }
-      last_sequence_number_ = header.sequenceNumber;
-      has_last_sequence_number_ = true;
-
-      bool ulpfec_packet = encapsulated_payload_type == kUlpfecPayloadType;
-      switch (state_) {
-        case kFirstPacket:
-          state_ = kDropEveryOtherPacketUntilUlpfec;
-          break;
-        case kDropEveryOtherPacketUntilUlpfec:
-          if (ulpfec_packet) {
-            state_ = kDropAllMediaPacketsUntilUlpfec;
-          } else if (header.sequenceNumber % 2 == 0) {
-            return DROP_PACKET;
-          }
-          break;
-        case kDropAllMediaPacketsUntilUlpfec:
-          if (!ulpfec_packet)
-            return DROP_PACKET;
-          ulpfec_sequence_number_ = header.sequenceNumber;
-          state_ = kDropOneMediaPacket;
-          break;
-        case kDropOneMediaPacket:
-          if (ulpfec_packet)
-            return DROP_PACKET;
-          state_ = kPassOneMediaPacket;
-          return DROP_PACKET;
-          break;
-        case kPassOneMediaPacket:
-          if (ulpfec_packet)
-            return DROP_PACKET;
-          // Pass one media packet after dropped packet after last FEC,
-          // otherwise receiver might never see a seq_no after
-          // |ulpfec_sequence_number_|
-          state_ = kVerifyUlpfecPacketNotInNackList;
-          break;
-        case kVerifyUlpfecPacketNotInNackList:
-          // Continue to drop packets. Make sure no frame can be decoded.
-          if (ulpfec_packet || header.sequenceNumber % 2 == 0)
-            return DROP_PACKET;
-          break;
-      }
-      return SEND_PACKET;
-    }
-
-    Action OnReceiveRtcp(const uint8_t* packet, size_t length) override {
-      rtc::CritScope lock_(&crit_);
-      if (state_ == kVerifyUlpfecPacketNotInNackList) {
-        test::RtcpPacketParser rtcp_parser;
-        rtcp_parser.Parse(packet, length);
-        const std::vector<uint16_t>& nacks = rtcp_parser.nack()->packet_ids();
-        EXPECT_TRUE(std::find(nacks.begin(), nacks.end(),
-                              ulpfec_sequence_number_) == nacks.end())
-            << "Got nack for ULPFEC packet";
-        if (!nacks.empty() &&
-            IsNewerSequenceNumber(nacks.back(), ulpfec_sequence_number_)) {
-          observation_complete_.Set();
-        }
-      }
-      return SEND_PACKET;
-    }
-
-    test::PacketTransport* CreateSendTransport(
-        test::SingleThreadedTaskQueueForTesting* task_queue,
-        Call* sender_call) override {
-      // At low RTT (< kLowRttNackMs) -> NACK only, no FEC.
-      // Configure some network delay.
-      const int kNetworkDelayMs = 50;
-      FakeNetworkPipe::Config config;
-      config.queue_delay_ms = kNetworkDelayMs;
-      return new test::PacketTransport(task_queue, sender_call, this,
-                                       test::PacketTransport::kSender,
-                                       payload_type_map_, config);
-    }
-
-    // TODO(holmer): Investigate why we don't send FEC packets when the bitrate
-    // is 10 kbps.
-    Call::Config GetSenderCallConfig() override {
-      Call::Config config(event_log_.get());
-      const int kMinBitrateBps = 30000;
-      config.bitrate_config.min_bitrate_bps = kMinBitrateBps;
-      return config;
-    }
-
-    void ModifyVideoConfigs(
-        VideoSendStream::Config* send_config,
-        std::vector<VideoReceiveStream::Config>* receive_configs,
-        VideoEncoderConfig* encoder_config) override {
-      // Configure hybrid NACK/FEC.
-      send_config->rtp.nack.rtp_history_ms = kNackRtpHistoryMs;
-      send_config->rtp.ulpfec.red_payload_type = kRedPayloadType;
-      send_config->rtp.ulpfec.ulpfec_payload_type = kUlpfecPayloadType;
-      // Set codec to VP8, otherwise NACK/FEC hybrid will be disabled.
-      send_config->encoder_settings.encoder = encoder_.get();
-      send_config->encoder_settings.payload_name = "VP8";
-      send_config->encoder_settings.payload_type = kFakeVideoSendPayloadType;
-
-      (*receive_configs)[0].rtp.nack.rtp_history_ms = kNackRtpHistoryMs;
-      (*receive_configs)[0].rtp.ulpfec.red_payload_type = kRedPayloadType;
-      (*receive_configs)[0].rtp.ulpfec.ulpfec_payload_type = kUlpfecPayloadType;
-
-      (*receive_configs)[0].decoders.resize(1);
-      (*receive_configs)[0].decoders[0].payload_type =
-          send_config->encoder_settings.payload_type;
-      (*receive_configs)[0].decoders[0].payload_name =
-          send_config->encoder_settings.payload_name;
-      (*receive_configs)[0].decoders[0].decoder = decoder_.get();
-    }
-
-    void PerformTest() override {
-      EXPECT_TRUE(Wait())
-          << "Timed out while waiting for FEC packets to be received.";
-    }
-
-    enum {
-      kFirstPacket,
-      kDropEveryOtherPacketUntilUlpfec,
-      kDropAllMediaPacketsUntilUlpfec,
-      kDropOneMediaPacket,
-      kPassOneMediaPacket,
-      kVerifyUlpfecPacketNotInNackList,
-    } state_;
-
-    rtc::CriticalSection crit_;
-    uint16_t ulpfec_sequence_number_ RTC_GUARDED_BY(&crit_);
-    bool has_last_sequence_number_;
-    uint16_t last_sequence_number_;
-    std::unique_ptr<webrtc::VideoEncoder> encoder_;
-    std::unique_ptr<webrtc::VideoDecoder> decoder_;
-  } test;
-
-  RunBaseTest(&test);
-}
-
-// This test drops second RTP packet with a marker bit set, makes sure it's
-// retransmitted and renders. Retransmission SSRCs are also checked.
-void EndToEndTest::DecodesRetransmittedFrame(bool enable_rtx, bool enable_red) {
-  static const int kDroppedFrameNumber = 10;
-  class RetransmissionObserver : public test::EndToEndTest,
-                                 public rtc::VideoSinkInterface<VideoFrame> {
-   public:
-    RetransmissionObserver(bool enable_rtx, bool enable_red)
-        : EndToEndTest(kDefaultTimeoutMs),
-          payload_type_(GetPayloadType(false, enable_red)),
-          retransmission_ssrc_(enable_rtx ? kSendRtxSsrcs[0]
-                                          : kVideoSendSsrcs[0]),
-          retransmission_payload_type_(GetPayloadType(enable_rtx, enable_red)),
-          encoder_(VP8Encoder::Create()),
-          marker_bits_observed_(0),
-          retransmitted_timestamp_(0) {}
-
-   private:
-    Action OnSendRtp(const uint8_t* packet, size_t length) override {
-      rtc::CritScope lock(&crit_);
-      RTPHeader header;
-      EXPECT_TRUE(parser_->Parse(packet, length, &header));
-
-      // Ignore padding-only packets over RTX.
-      if (header.payloadType != payload_type_) {
-        EXPECT_EQ(retransmission_ssrc_, header.ssrc);
-        if (length == header.headerLength + header.paddingLength)
-          return SEND_PACKET;
-      }
-
-      if (header.timestamp == retransmitted_timestamp_) {
-        EXPECT_EQ(retransmission_ssrc_, header.ssrc);
-        EXPECT_EQ(retransmission_payload_type_, header.payloadType);
-        return SEND_PACKET;
-      }
-
-      // Found the final packet of the frame to inflict loss to, drop this and
-      // expect a retransmission.
-      if (header.payloadType == payload_type_ && header.markerBit &&
-          ++marker_bits_observed_ == kDroppedFrameNumber) {
-        // This should be the only dropped packet.
-        EXPECT_EQ(0u, retransmitted_timestamp_);
-        retransmitted_timestamp_ = header.timestamp;
-        if (std::find(rendered_timestamps_.begin(), rendered_timestamps_.end(),
-                      retransmitted_timestamp_) != rendered_timestamps_.end()) {
-          // Frame was rendered before last packet was scheduled for sending.
-          // This is extremly rare but possible scenario because prober able to
-          // resend packet before it was send.
-          // TODO(danilchap): Remove this corner case when prober would not be
-          // able to sneak in between packet saved to history for resending and
-          // pacer notified about existance of that packet for sending.
-          // See https://bugs.chromium.org/p/webrtc/issues/detail?id=5540 for
-          // details.
-          observation_complete_.Set();
-        }
-        return DROP_PACKET;
-      }
-
-      return SEND_PACKET;
-    }
-
-    void OnFrame(const VideoFrame& frame) override {
-      EXPECT_EQ(kVideoRotation_90, frame.rotation());
-      {
-        rtc::CritScope lock(&crit_);
-        if (frame.timestamp() == retransmitted_timestamp_)
-          observation_complete_.Set();
-        rendered_timestamps_.push_back(frame.timestamp());
-      }
-      orig_renderer_->OnFrame(frame);
-    }
-
-    void ModifyVideoConfigs(
-        VideoSendStream::Config* send_config,
-        std::vector<VideoReceiveStream::Config>* receive_configs,
-        VideoEncoderConfig* encoder_config) override {
-      send_config->rtp.nack.rtp_history_ms = kNackRtpHistoryMs;
-
-      // Insert ourselves into the rendering pipeline.
-      RTC_DCHECK(!orig_renderer_);
-      orig_renderer_ = (*receive_configs)[0].renderer;
-      RTC_DCHECK(orig_renderer_);
-      (*receive_configs)[0].disable_prerenderer_smoothing = true;
-      (*receive_configs)[0].renderer = this;
-
-      (*receive_configs)[0].rtp.nack.rtp_history_ms = kNackRtpHistoryMs;
-
-      if (payload_type_ == kRedPayloadType) {
-        send_config->rtp.ulpfec.ulpfec_payload_type = kUlpfecPayloadType;
-        send_config->rtp.ulpfec.red_payload_type = kRedPayloadType;
-        if (retransmission_ssrc_ == kSendRtxSsrcs[0])
-          send_config->rtp.ulpfec.red_rtx_payload_type = kRtxRedPayloadType;
-        (*receive_configs)[0].rtp.ulpfec.ulpfec_payload_type =
-            send_config->rtp.ulpfec.ulpfec_payload_type;
-        (*receive_configs)[0].rtp.ulpfec.red_payload_type =
-            send_config->rtp.ulpfec.red_payload_type;
-        (*receive_configs)[0].rtp.ulpfec.red_rtx_payload_type =
-            send_config->rtp.ulpfec.red_rtx_payload_type;
-      }
-
-      if (retransmission_ssrc_ == kSendRtxSsrcs[0]) {
-        send_config->rtp.rtx.ssrcs.push_back(kSendRtxSsrcs[0]);
-        send_config->rtp.rtx.payload_type = kSendRtxPayloadType;
-        (*receive_configs)[0].rtp.rtx_ssrc = kSendRtxSsrcs[0];
-        (*receive_configs)[0]
-            .rtp.rtx_associated_payload_types[(payload_type_ == kRedPayloadType)
-                                                  ? kRtxRedPayloadType
-                                                  : kSendRtxPayloadType] =
-            payload_type_;
-      }
-      // Configure encoding and decoding with VP8, since generic packetization
-      // doesn't support FEC with NACK.
-      RTC_DCHECK_EQ(1, (*receive_configs)[0].decoders.size());
-      send_config->encoder_settings.encoder = encoder_.get();
-      send_config->encoder_settings.payload_name = "VP8";
-      (*receive_configs)[0].decoders[0].payload_name = "VP8";
-    }
-
-    void OnFrameGeneratorCapturerCreated(
-        test::FrameGeneratorCapturer* frame_generator_capturer) override {
-      frame_generator_capturer->SetFakeRotation(kVideoRotation_90);
-    }
-
-    void PerformTest() override {
-      EXPECT_TRUE(Wait())
-          << "Timed out while waiting for retransmission to render.";
-    }
-
-    int GetPayloadType(bool use_rtx, bool use_red) {
-      if (use_red) {
-        if (use_rtx)
-          return kRtxRedPayloadType;
-        return kRedPayloadType;
-      }
-      if (use_rtx)
-        return kSendRtxPayloadType;
-      return kFakeVideoSendPayloadType;
-    }
-
-    rtc::CriticalSection crit_;
-    rtc::VideoSinkInterface<VideoFrame>* orig_renderer_ = nullptr;
-    const int payload_type_;
-    const uint32_t retransmission_ssrc_;
-    const int retransmission_payload_type_;
-    std::unique_ptr<VideoEncoder> encoder_;
-    const std::string payload_name_;
-    int marker_bits_observed_;
-    uint32_t retransmitted_timestamp_ RTC_GUARDED_BY(&crit_);
-    std::vector<uint32_t> rendered_timestamps_ RTC_GUARDED_BY(&crit_);
-  } test(enable_rtx, enable_red);
-
-  RunBaseTest(&test);
-}
-
-TEST_F(EndToEndTest, DecodesRetransmittedFrame) {
-  DecodesRetransmittedFrame(false, false);
-}
-
-TEST_F(EndToEndTest, DecodesRetransmittedFrameOverRtx) {
-  DecodesRetransmittedFrame(true, false);
-}
-
-TEST_F(EndToEndTest, DecodesRetransmittedFrameByRed) {
-  DecodesRetransmittedFrame(false, true);
-}
-
-TEST_F(EndToEndTest, DecodesRetransmittedFrameByRedOverRtx) {
-  DecodesRetransmittedFrame(true, true);
-}
-
-void EndToEndTest::ReceivesPliAndRecovers(int rtp_history_ms) {
-  static const int kPacketsToDrop = 1;
-
-  class PliObserver : public test::EndToEndTest,
-                      public rtc::VideoSinkInterface<VideoFrame> {
-   public:
-    explicit PliObserver(int rtp_history_ms)
-        : EndToEndTest(kLongTimeoutMs),
-          rtp_history_ms_(rtp_history_ms),
-          nack_enabled_(rtp_history_ms > 0),
-          highest_dropped_timestamp_(0),
-          frames_to_drop_(0),
-          received_pli_(false) {}
-
-   private:
-    Action OnSendRtp(const uint8_t* packet, size_t length) override {
-      rtc::CritScope lock(&crit_);
-      RTPHeader header;
-      EXPECT_TRUE(parser_->Parse(packet, length, &header));
-
-      // Drop all retransmitted packets to force a PLI.
-      if (header.timestamp <= highest_dropped_timestamp_)
-        return DROP_PACKET;
-
-      if (frames_to_drop_ > 0) {
-        highest_dropped_timestamp_ = header.timestamp;
-        --frames_to_drop_;
-        return DROP_PACKET;
-      }
-
-      return SEND_PACKET;
-    }
-
-    Action OnReceiveRtcp(const uint8_t* packet, size_t length) override {
-      rtc::CritScope lock(&crit_);
-      test::RtcpPacketParser parser;
-      EXPECT_TRUE(parser.Parse(packet, length));
-      if (!nack_enabled_)
-        EXPECT_EQ(0, parser.nack()->num_packets());
-      if (parser.pli()->num_packets() > 0)
-        received_pli_ = true;
-      return SEND_PACKET;
-    }
-
-    void OnFrame(const VideoFrame& video_frame) override {
-      rtc::CritScope lock(&crit_);
-      if (received_pli_ &&
-          video_frame.timestamp() > highest_dropped_timestamp_) {
-        observation_complete_.Set();
-      }
-      if (!received_pli_)
-        frames_to_drop_ = kPacketsToDrop;
-    }
-
-    void ModifyVideoConfigs(
-        VideoSendStream::Config* send_config,
-        std::vector<VideoReceiveStream::Config>* receive_configs,
-        VideoEncoderConfig* encoder_config) override {
-      send_config->rtp.nack.rtp_history_ms = rtp_history_ms_;
-      (*receive_configs)[0].rtp.nack.rtp_history_ms = rtp_history_ms_;
-      (*receive_configs)[0].renderer = this;
-    }
-
-    void PerformTest() override {
-      EXPECT_TRUE(Wait()) << "Timed out waiting for PLI to be "
-                             "received and a frame to be "
-                             "rendered afterwards.";
-    }
-
-    rtc::CriticalSection crit_;
-    int rtp_history_ms_;
-    bool nack_enabled_;
-    uint32_t highest_dropped_timestamp_ RTC_GUARDED_BY(&crit_);
-    int frames_to_drop_ RTC_GUARDED_BY(&crit_);
-    bool received_pli_ RTC_GUARDED_BY(&crit_);
-  } test(rtp_history_ms);
-
-  RunBaseTest(&test);
-}
-
-TEST_F(EndToEndTest, ReceivesPliAndRecoversWithNack) {
-  ReceivesPliAndRecovers(1000);
-}
-
-TEST_F(EndToEndTest, ReceivesPliAndRecoversWithoutNack) {
-  ReceivesPliAndRecovers(0);
-}
-
-TEST_F(EndToEndTest, UnknownRtpPacketGivesUnknownSsrcReturnCode) {
-  class PacketInputObserver : public PacketReceiver {
-   public:
-    explicit PacketInputObserver(PacketReceiver* receiver)
-        : receiver_(receiver), delivered_packet_(false, false) {}
-
-    bool Wait() { return delivered_packet_.Wait(kDefaultTimeoutMs); }
-
-   private:
-    DeliveryStatus DeliverPacket(MediaType media_type,
-                                 const uint8_t* packet,
-                                 size_t length,
-                                 const PacketTime& packet_time) override {
-      if (RtpHeaderParser::IsRtcp(packet, length)) {
-        return receiver_->DeliverPacket(media_type, packet, length,
-                                        packet_time);
-      } else {
-        DeliveryStatus delivery_status =
-            receiver_->DeliverPacket(media_type, packet, length, packet_time);
-        EXPECT_EQ(DELIVERY_UNKNOWN_SSRC, delivery_status);
-        delivered_packet_.Set();
-        return delivery_status;
-      }
-    }
-
-    PacketReceiver* receiver_;
-    rtc::Event delivered_packet_;
-  };
-
-  std::unique_ptr<test::DirectTransport> send_transport;
-  std::unique_ptr<test::DirectTransport> receive_transport;
-  std::unique_ptr<PacketInputObserver> input_observer;
-
-  task_queue_.SendTask([this, &send_transport, &receive_transport,
-                        &input_observer]() {
-    CreateCalls(Call::Config(event_log_.get()), Call::Config(event_log_.get()));
-
-    send_transport = rtc::MakeUnique<test::DirectTransport>(
-        &task_queue_, sender_call_.get(), payload_type_map_);
-    receive_transport = rtc::MakeUnique<test::DirectTransport>(
-        &task_queue_, receiver_call_.get(), payload_type_map_);
-    input_observer =
-        rtc::MakeUnique<PacketInputObserver>(receiver_call_->Receiver());
-    send_transport->SetReceiver(input_observer.get());
-    receive_transport->SetReceiver(sender_call_->Receiver());
-
-    CreateSendConfig(1, 0, 0, send_transport.get());
-    CreateMatchingReceiveConfigs(receive_transport.get());
-
-    CreateVideoStreams();
-    CreateFrameGeneratorCapturer(kDefaultFramerate, kDefaultWidth,
-                                 kDefaultHeight);
-    Start();
-
-    receiver_call_->DestroyVideoReceiveStream(video_receive_streams_[0]);
-    video_receive_streams_.clear();
-  });
-
-  // Wait() waits for a received packet.
-  EXPECT_TRUE(input_observer->Wait());
-
-  task_queue_.SendTask([this, &send_transport, &receive_transport]() {
-    Stop();
-    DestroyStreams();
-    send_transport.reset();
-    receive_transport.reset();
-    DestroyCalls();
-  });
-}
-
-void EndToEndTest::RespectsRtcpMode(RtcpMode rtcp_mode) {
-  static const int kNumCompoundRtcpPacketsToObserve = 10;
-  class RtcpModeObserver : public test::EndToEndTest {
-   public:
-    explicit RtcpModeObserver(RtcpMode rtcp_mode)
-        : EndToEndTest(kDefaultTimeoutMs),
-          rtcp_mode_(rtcp_mode),
-          sent_rtp_(0),
-          sent_rtcp_(0) {}
-
-   private:
-    Action OnSendRtp(const uint8_t* packet, size_t length) override {
-      rtc::CritScope lock(&crit_);
-      if (++sent_rtp_ % 3 == 0)
-        return DROP_PACKET;
-
-      return SEND_PACKET;
-    }
-
-    Action OnReceiveRtcp(const uint8_t* packet, size_t length) override {
-      rtc::CritScope lock(&crit_);
-      ++sent_rtcp_;
-      test::RtcpPacketParser parser;
-      EXPECT_TRUE(parser.Parse(packet, length));
-
-      EXPECT_EQ(0, parser.sender_report()->num_packets());
-
-      switch (rtcp_mode_) {
-        case RtcpMode::kCompound:
-          // TODO(holmer): We shouldn't send transport feedback alone if
-          // compound RTCP is negotiated.
-          if (parser.receiver_report()->num_packets() == 0 &&
-              parser.transport_feedback()->num_packets() == 0) {
-            ADD_FAILURE() << "Received RTCP packet without receiver report for "
-                             "RtcpMode::kCompound.";
-            observation_complete_.Set();
-          }
-
-          if (sent_rtcp_ >= kNumCompoundRtcpPacketsToObserve)
-            observation_complete_.Set();
-
-          break;
-        case RtcpMode::kReducedSize:
-          if (parser.receiver_report()->num_packets() == 0)
-            observation_complete_.Set();
-          break;
-        case RtcpMode::kOff:
-          RTC_NOTREACHED();
-          break;
-      }
-
-      return SEND_PACKET;
-    }
-
-    void ModifyVideoConfigs(
-        VideoSendStream::Config* send_config,
-        std::vector<VideoReceiveStream::Config>* receive_configs,
-        VideoEncoderConfig* encoder_config) override {
-      send_config->rtp.nack.rtp_history_ms = kNackRtpHistoryMs;
-      (*receive_configs)[0].rtp.nack.rtp_history_ms = kNackRtpHistoryMs;
-      (*receive_configs)[0].rtp.rtcp_mode = rtcp_mode_;
-    }
-
-    void PerformTest() override {
-      EXPECT_TRUE(Wait())
-          << (rtcp_mode_ == RtcpMode::kCompound
-                  ? "Timed out before observing enough compound packets."
-                  : "Timed out before receiving a non-compound RTCP packet.");
-    }
-
-    RtcpMode rtcp_mode_;
-    rtc::CriticalSection crit_;
-    // Must be protected since RTCP can be sent by both the process thread
-    // and the pacer thread.
-    int sent_rtp_ RTC_GUARDED_BY(&crit_);
-    int sent_rtcp_ RTC_GUARDED_BY(&crit_);
-  } test(rtcp_mode);
-
-  RunBaseTest(&test);
-}
-
-TEST_F(EndToEndTest, UsesRtcpCompoundMode) {
-  RespectsRtcpMode(RtcpMode::kCompound);
-}
-
-TEST_F(EndToEndTest, UsesRtcpReducedSizeMode) {
-  RespectsRtcpMode(RtcpMode::kReducedSize);
-}
-
-// Test sets up a Call multiple senders with different resolutions and SSRCs.
-// Another is set up to receive all three of these with different renderers.
-class MultiStreamTest {
- public:
-  static constexpr size_t kNumStreams = 3;
-  const uint8_t kVideoPayloadType = 124;
-  const std::map<uint8_t, MediaType> payload_type_map_ = {
-      {kVideoPayloadType, MediaType::VIDEO}};
-
-  struct CodecSettings {
-    uint32_t ssrc;
-    int width;
-    int height;
-  } codec_settings[kNumStreams];
-
-  explicit MultiStreamTest(test::SingleThreadedTaskQueueForTesting* task_queue)
-      : task_queue_(task_queue) {
-    // TODO(sprang): Cleanup when msvc supports explicit initializers for array.
-    codec_settings[0] = {1, 640, 480};
-    codec_settings[1] = {2, 320, 240};
-    codec_settings[2] = {3, 240, 160};
-  }
-
-  virtual ~MultiStreamTest() {}
-
-  void RunTest() {
-    webrtc::RtcEventLogNullImpl event_log;
-    Call::Config config(&event_log);
-    std::unique_ptr<Call> sender_call;
-    std::unique_ptr<Call> receiver_call;
-    std::unique_ptr<test::DirectTransport> sender_transport;
-    std::unique_ptr<test::DirectTransport> receiver_transport;
-
-    VideoSendStream* send_streams[kNumStreams];
-    VideoReceiveStream* receive_streams[kNumStreams];
-    test::FrameGeneratorCapturer* frame_generators[kNumStreams];
-    std::vector<std::unique_ptr<VideoDecoder>> allocated_decoders;
-    std::unique_ptr<VideoEncoder> encoders[kNumStreams];
-
-    task_queue_->SendTask([&]() {
-      sender_call = rtc::WrapUnique(Call::Create(config));
-      receiver_call = rtc::WrapUnique(Call::Create(config));
-      sender_transport =
-          rtc::WrapUnique(CreateSendTransport(task_queue_, sender_call.get()));
-      receiver_transport = rtc::WrapUnique(
-          CreateReceiveTransport(task_queue_, receiver_call.get()));
-
-      sender_transport->SetReceiver(receiver_call->Receiver());
-      receiver_transport->SetReceiver(sender_call->Receiver());
-
-      for (size_t i = 0; i < kNumStreams; ++i)
-        encoders[i].reset(VP8Encoder::Create());
-
-      for (size_t i = 0; i < kNumStreams; ++i) {
-        uint32_t ssrc = codec_settings[i].ssrc;
-        int width = codec_settings[i].width;
-        int height = codec_settings[i].height;
-
-        VideoSendStream::Config send_config(sender_transport.get());
-        send_config.rtp.ssrcs.push_back(ssrc);
-        send_config.encoder_settings.encoder = encoders[i].get();
-        send_config.encoder_settings.payload_name = "VP8";
-        send_config.encoder_settings.payload_type = kVideoPayloadType;
-        VideoEncoderConfig encoder_config;
-        test::FillEncoderConfiguration(1, &encoder_config);
-        encoder_config.max_bitrate_bps = 100000;
-
-        UpdateSendConfig(i, &send_config, &encoder_config,
-                         &frame_generators[i]);
-
-        send_streams[i] = sender_call->CreateVideoSendStream(
-            send_config.Copy(), encoder_config.Copy());
-        send_streams[i]->Start();
-
-        VideoReceiveStream::Config receive_config(receiver_transport.get());
-        receive_config.rtp.remote_ssrc = ssrc;
-        receive_config.rtp.local_ssrc = test::CallTest::kReceiverLocalVideoSsrc;
-        VideoReceiveStream::Decoder decoder =
-            test::CreateMatchingDecoder(send_config.encoder_settings);
-        allocated_decoders.push_back(
-            std::unique_ptr<VideoDecoder>(decoder.decoder));
-        receive_config.decoders.push_back(decoder);
-
-        UpdateReceiveConfig(i, &receive_config);
-
-        receive_streams[i] =
-            receiver_call->CreateVideoReceiveStream(std::move(receive_config));
-        receive_streams[i]->Start();
-
-        frame_generators[i] = test::FrameGeneratorCapturer::Create(
-            width, height, 30, Clock::GetRealTimeClock());
-        send_streams[i]->SetSource(
-            frame_generators[i],
-            VideoSendStream::DegradationPreference::kMaintainFramerate);
-        frame_generators[i]->Start();
-      }
-    });
-
-    Wait();
-
-    task_queue_->SendTask([&]() {
-      for (size_t i = 0; i < kNumStreams; ++i) {
-        frame_generators[i]->Stop();
-        sender_call->DestroyVideoSendStream(send_streams[i]);
-        receiver_call->DestroyVideoReceiveStream(receive_streams[i]);
-        delete frame_generators[i];
-      }
-
-      sender_transport.reset();
-      receiver_transport.reset();
-
-      sender_call.reset();
-      receiver_call.reset();
-    });
-  }
-
- protected:
-  virtual void Wait() = 0;
-  // Note: frame_generator is a point-to-pointer, since the actual instance
-  // hasn't been created at the time of this call. Only when packets/frames
-  // start flowing should this be dereferenced.
-  virtual void UpdateSendConfig(
-      size_t stream_index,
-      VideoSendStream::Config* send_config,
-      VideoEncoderConfig* encoder_config,
-      test::FrameGeneratorCapturer** frame_generator) {}
-  virtual void UpdateReceiveConfig(size_t stream_index,
-                                   VideoReceiveStream::Config* receive_config) {
-  }
-  virtual test::DirectTransport* CreateSendTransport(
-      test::SingleThreadedTaskQueueForTesting* task_queue,
-      Call* sender_call) {
-    return new test::DirectTransport(task_queue, sender_call,
-                                     payload_type_map_);
-  }
-  virtual test::DirectTransport* CreateReceiveTransport(
-      test::SingleThreadedTaskQueueForTesting* task_queue,
-      Call* receiver_call) {
-    return new test::DirectTransport(task_queue, receiver_call,
-                                     payload_type_map_);
-  }
-
-  test::SingleThreadedTaskQueueForTesting* const task_queue_;
-};
-
-// Each renderer verifies that it receives the expected resolution, and as soon
-// as every renderer has received a frame, the test finishes.
-TEST_F(EndToEndTest, SendsAndReceivesMultipleStreams) {
-  class VideoOutputObserver : public rtc::VideoSinkInterface<VideoFrame> {
-   public:
-    VideoOutputObserver(const MultiStreamTest::CodecSettings& settings,
-                        uint32_t ssrc,
-                        test::FrameGeneratorCapturer** frame_generator)
-        : settings_(settings),
-          ssrc_(ssrc),
-          frame_generator_(frame_generator),
-          done_(false, false) {}
-
-    void OnFrame(const VideoFrame& video_frame) override {
-      EXPECT_EQ(settings_.width, video_frame.width());
-      EXPECT_EQ(settings_.height, video_frame.height());
-      (*frame_generator_)->Stop();
-      done_.Set();
-    }
-
-    uint32_t Ssrc() { return ssrc_; }
-
-    bool Wait() { return done_.Wait(kDefaultTimeoutMs); }
-
-   private:
-    const MultiStreamTest::CodecSettings& settings_;
-    const uint32_t ssrc_;
-    test::FrameGeneratorCapturer** const frame_generator_;
-    rtc::Event done_;
-  };
-
-  class Tester : public MultiStreamTest {
-   public:
-    explicit Tester(test::SingleThreadedTaskQueueForTesting* task_queue)
-        : MultiStreamTest(task_queue) {}
-    virtual ~Tester() {}
-
-   protected:
-    void Wait() override {
-      for (const auto& observer : observers_) {
-        EXPECT_TRUE(observer->Wait()) << "Time out waiting for from on ssrc "
-                                      << observer->Ssrc();
-      }
-    }
-
-    void UpdateSendConfig(
-        size_t stream_index,
-        VideoSendStream::Config* send_config,
-        VideoEncoderConfig* encoder_config,
-        test::FrameGeneratorCapturer** frame_generator) override {
-      observers_[stream_index].reset(new VideoOutputObserver(
-          codec_settings[stream_index], send_config->rtp.ssrcs.front(),
-          frame_generator));
-    }
-
-    void UpdateReceiveConfig(
-        size_t stream_index,
-        VideoReceiveStream::Config* receive_config) override {
-      receive_config->renderer = observers_[stream_index].get();
-    }
-
-   private:
-    std::unique_ptr<VideoOutputObserver> observers_[kNumStreams];
-  } tester(&task_queue_);
-
-  tester.RunTest();
-}
-
-TEST_F(EndToEndTest, AssignsTransportSequenceNumbers) {
-  static const int kExtensionId = 5;
-
-  class RtpExtensionHeaderObserver : public test::DirectTransport {
-   public:
-    RtpExtensionHeaderObserver(
-        test::SingleThreadedTaskQueueForTesting* task_queue,
-        Call* sender_call,
-        const uint32_t& first_media_ssrc,
-        const std::map<uint32_t, uint32_t>& ssrc_map,
-        const std::map<uint8_t, MediaType>& payload_type_map)
-        : DirectTransport(task_queue, sender_call, payload_type_map),
-          done_(false, false),
-          parser_(RtpHeaderParser::Create()),
-          first_media_ssrc_(first_media_ssrc),
-          rtx_to_media_ssrcs_(ssrc_map),
-          padding_observed_(false),
-          rtx_padding_observed_(false),
-          retransmit_observed_(false),
-          started_(false) {
-      parser_->RegisterRtpHeaderExtension(kRtpExtensionTransportSequenceNumber,
-                                          kExtensionId);
-    }
-    virtual ~RtpExtensionHeaderObserver() {}
-
-    bool SendRtp(const uint8_t* data,
-                 size_t length,
-                 const PacketOptions& options) override {
-      {
-        rtc::CritScope cs(&lock_);
-
-        if (IsDone())
-          return false;
-
-        if (started_) {
-          RTPHeader header;
-          EXPECT_TRUE(parser_->Parse(data, length, &header));
-          bool drop_packet = false;
-
-          EXPECT_TRUE(header.extension.hasTransportSequenceNumber);
-          EXPECT_EQ(options.packet_id,
-                    header.extension.transportSequenceNumber);
-          if (!streams_observed_.empty()) {
-            // Unwrap packet id and verify uniqueness.
-            int64_t packet_id = unwrapper_.Unwrap(options.packet_id);
-            EXPECT_TRUE(received_packed_ids_.insert(packet_id).second);
-          }
-
-          // Drop (up to) every 17th packet, so we get retransmits.
-          // Only drop media, and not on the first stream (otherwise it will be
-          // hard to distinguish from padding, which is always sent on the first
-          // stream).
-          if (header.payloadType != kSendRtxPayloadType &&
-              header.ssrc != first_media_ssrc_ &&
-              header.extension.transportSequenceNumber % 17 == 0) {
-            dropped_seq_[header.ssrc].insert(header.sequenceNumber);
-            drop_packet = true;
-          }
-
-          if (header.payloadType == kSendRtxPayloadType) {
-            uint16_t original_sequence_number =
-                ByteReader<uint16_t>::ReadBigEndian(&data[header.headerLength]);
-            uint32_t original_ssrc =
-                rtx_to_media_ssrcs_.find(header.ssrc)->second;
-            std::set<uint16_t>* seq_no_map = &dropped_seq_[original_ssrc];
-            auto it = seq_no_map->find(original_sequence_number);
-            if (it != seq_no_map->end()) {
-              retransmit_observed_ = true;
-              seq_no_map->erase(it);
-            } else {
-              rtx_padding_observed_ = true;
-            }
-          } else {
-            streams_observed_.insert(header.ssrc);
-          }
-
-          if (IsDone())
-            done_.Set();
-
-          if (drop_packet)
-            return true;
-        }
-      }
-
-      return test::DirectTransport::SendRtp(data, length, options);
-    }
-
-    bool IsDone() {
-      bool observed_types_ok =
-          streams_observed_.size() == MultiStreamTest::kNumStreams &&
-          retransmit_observed_ && rtx_padding_observed_;
-      if (!observed_types_ok)
-        return false;
-      // We should not have any gaps in the sequence number range.
-      size_t seqno_range =
-          *received_packed_ids_.rbegin() - *received_packed_ids_.begin() + 1;
-      return seqno_range == received_packed_ids_.size();
-    }
-
-    bool Wait() {
-      {
-        // Can't be sure until this point that rtx_to_media_ssrcs_ etc have
-        // been initialized and are OK to read.
-        rtc::CritScope cs(&lock_);
-        started_ = true;
-      }
-      return done_.Wait(kDefaultTimeoutMs);
-    }
-
-    rtc::CriticalSection lock_;
-    rtc::Event done_;
-    std::unique_ptr<RtpHeaderParser> parser_;
-    SequenceNumberUnwrapper unwrapper_;
-    std::set<int64_t> received_packed_ids_;
-    std::set<uint32_t> streams_observed_;
-    std::map<uint32_t, std::set<uint16_t>> dropped_seq_;
-    const uint32_t& first_media_ssrc_;
-    const std::map<uint32_t, uint32_t>& rtx_to_media_ssrcs_;
-    bool padding_observed_;
-    bool rtx_padding_observed_;
-    bool retransmit_observed_;
-    bool started_;
-  };
-
-  class TransportSequenceNumberTester : public MultiStreamTest {
-   public:
-    explicit TransportSequenceNumberTester(
-        test::SingleThreadedTaskQueueForTesting* task_queue)
-        : MultiStreamTest(task_queue),
-          first_media_ssrc_(0),
-          observer_(nullptr) {}
-    virtual ~TransportSequenceNumberTester() {}
-
-   protected:
-    void Wait() override {
-      RTC_DCHECK(observer_);
-      EXPECT_TRUE(observer_->Wait());
-    }
-
-    void UpdateSendConfig(
-        size_t stream_index,
-        VideoSendStream::Config* send_config,
-        VideoEncoderConfig* encoder_config,
-        test::FrameGeneratorCapturer** frame_generator) override {
-      send_config->rtp.extensions.clear();
-      send_config->rtp.extensions.push_back(RtpExtension(
-          RtpExtension::kTransportSequenceNumberUri, kExtensionId));
-
-      // Force some padding to be sent. Note that since we do send media
-      // packets we can not guarantee that a padding only packet is sent.
-      // Instead, padding will most likely be send as an RTX packet.
-      const int kPaddingBitrateBps = 50000;
-      encoder_config->max_bitrate_bps = 200000;
-      encoder_config->min_transmit_bitrate_bps =
-          encoder_config->max_bitrate_bps + kPaddingBitrateBps;
-
-      // Configure RTX for redundant payload padding.
-      send_config->rtp.nack.rtp_history_ms = kNackRtpHistoryMs;
-      send_config->rtp.rtx.ssrcs.push_back(kSendRtxSsrcs[stream_index]);
-      send_config->rtp.rtx.payload_type = kSendRtxPayloadType;
-      rtx_to_media_ssrcs_[kSendRtxSsrcs[stream_index]] =
-          send_config->rtp.ssrcs[0];
-
-      if (stream_index == 0)
-        first_media_ssrc_ = send_config->rtp.ssrcs[0];
-    }
-
-    void UpdateReceiveConfig(
-        size_t stream_index,
-        VideoReceiveStream::Config* receive_config) override {
-      receive_config->rtp.nack.rtp_history_ms = kNackRtpHistoryMs;
-      receive_config->rtp.extensions.clear();
-      receive_config->rtp.extensions.push_back(RtpExtension(
-          RtpExtension::kTransportSequenceNumberUri, kExtensionId));
-      receive_config->renderer = &fake_renderer_;
-    }
-
-    test::DirectTransport* CreateSendTransport(
-        test::SingleThreadedTaskQueueForTesting* task_queue,
-        Call* sender_call) override {
-      std::map<uint8_t, MediaType> payload_type_map =
-          MultiStreamTest::payload_type_map_;
-      RTC_DCHECK(payload_type_map.find(kSendRtxPayloadType) ==
-                 payload_type_map.end());
-      payload_type_map[kSendRtxPayloadType] = MediaType::VIDEO;
-      observer_ = new RtpExtensionHeaderObserver(
-          task_queue, sender_call, first_media_ssrc_, rtx_to_media_ssrcs_,
-          payload_type_map);
-      return observer_;
-    }
-
-   private:
-    test::FakeVideoRenderer fake_renderer_;
-    uint32_t first_media_ssrc_;
-    std::map<uint32_t, uint32_t> rtx_to_media_ssrcs_;
-    RtpExtensionHeaderObserver* observer_;
-  } tester(&task_queue_);
-
-  tester.RunTest();
-}
-
-class TransportFeedbackTester : public test::EndToEndTest {
- public:
-  TransportFeedbackTester(bool feedback_enabled,
-                          size_t num_video_streams,
-                          size_t num_audio_streams)
-      : EndToEndTest(::webrtc::EndToEndTest::kDefaultTimeoutMs),
-        feedback_enabled_(feedback_enabled),
-        num_video_streams_(num_video_streams),
-        num_audio_streams_(num_audio_streams),
-        receiver_call_(nullptr) {
-    // Only one stream of each supported for now.
-    EXPECT_LE(num_video_streams, 1u);
-    EXPECT_LE(num_audio_streams, 1u);
-  }
-
- protected:
-  Action OnSendRtcp(const uint8_t* data, size_t length) override {
-    EXPECT_FALSE(HasTransportFeedback(data, length));
-    return SEND_PACKET;
-  }
-
-  Action OnReceiveRtcp(const uint8_t* data, size_t length) override {
-    if (HasTransportFeedback(data, length))
-      observation_complete_.Set();
-    return SEND_PACKET;
-  }
-
-  bool HasTransportFeedback(const uint8_t* data, size_t length) const {
-    test::RtcpPacketParser parser;
-    EXPECT_TRUE(parser.Parse(data, length));
-    return parser.transport_feedback()->num_packets() > 0;
-  }
-
-  void PerformTest() override {
-    const int64_t kDisabledFeedbackTimeoutMs = 5000;
-    EXPECT_EQ(feedback_enabled_,
-              observation_complete_.Wait(feedback_enabled_
-                                             ? test::CallTest::kDefaultTimeoutMs
-                                             : kDisabledFeedbackTimeoutMs));
-  }
-
-  void OnCallsCreated(Call* sender_call, Call* receiver_call) override {
-    receiver_call_ = receiver_call;
-  }
-
-  size_t GetNumVideoStreams() const override { return num_video_streams_; }
-  size_t GetNumAudioStreams() const override { return num_audio_streams_; }
-
-  void ModifyVideoConfigs(
-      VideoSendStream::Config* send_config,
-      std::vector<VideoReceiveStream::Config>* receive_configs,
-      VideoEncoderConfig* encoder_config) override {
-    (*receive_configs)[0].rtp.transport_cc = feedback_enabled_;
-  }
-
-  void ModifyAudioConfigs(
-      AudioSendStream::Config* send_config,
-      std::vector<AudioReceiveStream::Config>* receive_configs) override {
-    send_config->rtp.extensions.clear();
-    send_config->rtp.extensions.push_back(
-        RtpExtension(RtpExtension::kTransportSequenceNumberUri, kExtensionId));
-    (*receive_configs)[0].rtp.extensions.clear();
-    (*receive_configs)[0].rtp.extensions = send_config->rtp.extensions;
-    (*receive_configs)[0].rtp.transport_cc = feedback_enabled_;
-  }
-
- private:
-  static const int kExtensionId = 5;
-  const bool feedback_enabled_;
-  const size_t num_video_streams_;
-  const size_t num_audio_streams_;
-  Call* receiver_call_;
-};
-
-TEST_F(EndToEndTest, VideoReceivesTransportFeedback) {
-  TransportFeedbackTester test(true, 1, 0);
-  RunBaseTest(&test);
-}
-
-TEST_F(EndToEndTest, VideoTransportFeedbackNotConfigured) {
-  TransportFeedbackTester test(false, 1, 0);
-  RunBaseTest(&test);
-}
-
-TEST_F(EndToEndTest, AudioReceivesTransportFeedback) {
-  TransportFeedbackTester test(true, 0, 1);
-  RunBaseTest(&test);
-}
-
-TEST_F(EndToEndTest, AudioTransportFeedbackNotConfigured) {
-  TransportFeedbackTester test(false, 0, 1);
-  RunBaseTest(&test);
-}
-
-TEST_F(EndToEndTest, AudioVideoReceivesTransportFeedback) {
-  TransportFeedbackTester test(true, 1, 1);
-  RunBaseTest(&test);
-}
-
-TEST_F(EndToEndTest, StopsSendingMediaWithoutFeedback) {
-  test::ScopedFieldTrials override_field_trials(
-      "WebRTC-CwndExperiment/Enabled-250/");
-
-  class TransportFeedbackTester : public test::EndToEndTest {
-   public:
-    TransportFeedbackTester(size_t num_video_streams, size_t num_audio_streams)
-        : EndToEndTest(::webrtc::EndToEndTest::kDefaultTimeoutMs),
-          num_video_streams_(num_video_streams),
-          num_audio_streams_(num_audio_streams),
-          media_sent_(0),
-          padding_sent_(0) {
-      // Only one stream of each supported for now.
-      EXPECT_LE(num_video_streams, 1u);
-      EXPECT_LE(num_audio_streams, 1u);
-    }
-
-   protected:
-    Action OnSendRtp(const uint8_t* packet, size_t length) override {
-      RTPHeader header;
-      EXPECT_TRUE(parser_->Parse(packet, length, &header));
-      const bool only_padding =
-          header.headerLength + header.paddingLength == length;
-      rtc::CritScope lock(&crit_);
-      if (only_padding) {
-        ++padding_sent_;
-      } else {
-        ++media_sent_;
-        EXPECT_LT(media_sent_, 40) << "Media sent without feedback.";
-      }
-
-      return SEND_PACKET;
-    }
-
-    Action OnReceiveRtcp(const uint8_t* data, size_t length) override {
-      rtc::CritScope lock(&crit_);
-      if (media_sent_ > 20 && HasTransportFeedback(data, length)) {
-        return DROP_PACKET;
-      }
-      return SEND_PACKET;
-    }
-
-    bool HasTransportFeedback(const uint8_t* data, size_t length) const {
-      test::RtcpPacketParser parser;
-      EXPECT_TRUE(parser.Parse(data, length));
-      return parser.transport_feedback()->num_packets() > 0;
-    }
-
-    Call::Config GetSenderCallConfig() override {
-      Call::Config config = EndToEndTest::GetSenderCallConfig();
-      config.bitrate_config.max_bitrate_bps = 300000;
-      return config;
-    }
-
-    void PerformTest() override {
-      const int64_t kDisabledFeedbackTimeoutMs = 10000;
-      observation_complete_.Wait(kDisabledFeedbackTimeoutMs);
-      rtc::CritScope lock(&crit_);
-      EXPECT_GT(padding_sent_, 0);
-    }
-
-    size_t GetNumVideoStreams() const override { return num_video_streams_; }
-    size_t GetNumAudioStreams() const override { return num_audio_streams_; }
-
-   private:
-    const size_t num_video_streams_;
-    const size_t num_audio_streams_;
-    rtc::CriticalSection crit_;
-    int media_sent_ RTC_GUARDED_BY(crit_);
-    int padding_sent_ RTC_GUARDED_BY(crit_);
-  } test(1, 0);
-  RunBaseTest(&test);
-}
-
-TEST_F(EndToEndTest, ObserversEncodedFrames) {
-  class EncodedFrameTestObserver : public EncodedFrameObserver {
-   public:
-    EncodedFrameTestObserver()
-        : length_(0), frame_type_(kEmptyFrame), called_(false, false) {}
-    virtual ~EncodedFrameTestObserver() {}
-
-    virtual void EncodedFrameCallback(const EncodedFrame& encoded_frame) {
-      frame_type_ = encoded_frame.frame_type_;
-      length_ = encoded_frame.length_;
-      buffer_.reset(new uint8_t[length_]);
-      memcpy(buffer_.get(), encoded_frame.data_, length_);
-      called_.Set();
-    }
-
-    bool Wait() { return called_.Wait(kDefaultTimeoutMs); }
-
-    void ExpectEqualFrames(const EncodedFrameTestObserver& observer) {
-      ASSERT_EQ(length_, observer.length_)
-          << "Observed frames are of different lengths.";
-      EXPECT_EQ(frame_type_, observer.frame_type_)
-          << "Observed frames have different frame types.";
-      EXPECT_EQ(0, memcmp(buffer_.get(), observer.buffer_.get(), length_))
-          << "Observed encoded frames have different content.";
-    }
-
-   private:
-    std::unique_ptr<uint8_t[]> buffer_;
-    size_t length_;
-    FrameType frame_type_;
-    rtc::Event called_;
-  };
-
-  EncodedFrameTestObserver post_encode_observer;
-  EncodedFrameTestObserver pre_decode_observer;
-  test::FrameForwarder forwarder;
-  std::unique_ptr<test::FrameGenerator> frame_generator;
-
-  std::unique_ptr<test::DirectTransport> sender_transport;
-  std::unique_ptr<test::DirectTransport> receiver_transport;
-
-  task_queue_.SendTask([&]() {
-    CreateCalls(Call::Config(event_log_.get()), Call::Config(event_log_.get()));
-
-    sender_transport = rtc::MakeUnique<test::DirectTransport>(
-        &task_queue_, sender_call_.get(), payload_type_map_);
-    receiver_transport = rtc::MakeUnique<test::DirectTransport>(
-        &task_queue_, receiver_call_.get(), payload_type_map_);
-    sender_transport->SetReceiver(receiver_call_->Receiver());
-    receiver_transport->SetReceiver(sender_call_->Receiver());
-
-    CreateSendConfig(1, 0, 0, sender_transport.get());
-    CreateMatchingReceiveConfigs(receiver_transport.get());
-    video_send_config_.post_encode_callback = &post_encode_observer;
-    video_receive_configs_[0].pre_decode_callback = &pre_decode_observer;
-
-    CreateVideoStreams();
-    Start();
-
-    frame_generator = test::FrameGenerator::CreateSquareGenerator(
-        kDefaultWidth, kDefaultHeight);
-    video_send_stream_->SetSource(
-        &forwarder, VideoSendStream::DegradationPreference::kMaintainFramerate);
-    forwarder.IncomingCapturedFrame(*frame_generator->NextFrame());
-  });
-
-  EXPECT_TRUE(post_encode_observer.Wait())
-      << "Timed out while waiting for send-side encoded-frame callback.";
-
-  EXPECT_TRUE(pre_decode_observer.Wait())
-      << "Timed out while waiting for pre-decode encoded-frame callback.";
-
-  post_encode_observer.ExpectEqualFrames(pre_decode_observer);
-
-  task_queue_.SendTask([this, &sender_transport, &receiver_transport]() {
-    Stop();
-    DestroyStreams();
-    sender_transport.reset();
-    receiver_transport.reset();
-    DestroyCalls();
-  });
-}
-
-TEST_F(EndToEndTest, ReceiveStreamSendsRemb) {
-  class RembObserver : public test::EndToEndTest {
-   public:
-    RembObserver() : EndToEndTest(kDefaultTimeoutMs) {}
-
-    void ModifyVideoConfigs(
-        VideoSendStream::Config* send_config,
-        std::vector<VideoReceiveStream::Config>* receive_configs,
-        VideoEncoderConfig* encoder_config) override {
-      send_config->rtp.extensions.clear();
-      send_config->rtp.extensions.push_back(RtpExtension(
-          RtpExtension::kAbsSendTimeUri, test::kAbsSendTimeExtensionId));
-      (*receive_configs)[0].rtp.remb = true;
-      (*receive_configs)[0].rtp.transport_cc = false;
-    }
-
-    Action OnReceiveRtcp(const uint8_t* packet, size_t length) override {
-      test::RtcpPacketParser parser;
-      EXPECT_TRUE(parser.Parse(packet, length));
-
-      if (parser.remb()->num_packets() > 0) {
-        EXPECT_EQ(kReceiverLocalVideoSsrc, parser.remb()->sender_ssrc());
-        EXPECT_LT(0U, parser.remb()->bitrate_bps());
-        EXPECT_EQ(1U, parser.remb()->ssrcs().size());
-        EXPECT_EQ(kVideoSendSsrcs[0], parser.remb()->ssrcs()[0]);
-        observation_complete_.Set();
-      }
-
-      return SEND_PACKET;
-    }
-    void PerformTest() override {
-      EXPECT_TRUE(Wait()) << "Timed out while waiting for a "
-                             "receiver RTCP REMB packet to be "
-                             "sent.";
-    }
-  } test;
-
-  RunBaseTest(&test);
-}
-
-class BandwidthStatsTest : public test::EndToEndTest {
- public:
-  explicit BandwidthStatsTest(bool send_side_bwe)
-      : EndToEndTest(test::CallTest::kDefaultTimeoutMs),
-        sender_call_(nullptr),
-        receiver_call_(nullptr),
-        has_seen_pacer_delay_(false),
-        send_side_bwe_(send_side_bwe) {}
-
-  void ModifyVideoConfigs(
-      VideoSendStream::Config* send_config,
-      std::vector<VideoReceiveStream::Config>* receive_configs,
-      VideoEncoderConfig* encoder_config) override {
-    if (!send_side_bwe_) {
-      send_config->rtp.extensions.clear();
-      send_config->rtp.extensions.push_back(RtpExtension(
-          RtpExtension::kAbsSendTimeUri, test::kAbsSendTimeExtensionId));
-      (*receive_configs)[0].rtp.remb = true;
-      (*receive_configs)[0].rtp.transport_cc = false;
-    }
-  }
-
-  Action OnSendRtp(const uint8_t* packet, size_t length) override {
-    Call::Stats sender_stats = sender_call_->GetStats();
-    Call::Stats receiver_stats = receiver_call_->GetStats();
-    if (!has_seen_pacer_delay_)
-      has_seen_pacer_delay_ = sender_stats.pacer_delay_ms > 0;
-    if (sender_stats.send_bandwidth_bps > 0 && has_seen_pacer_delay_) {
-      if (send_side_bwe_ || receiver_stats.recv_bandwidth_bps > 0)
-        observation_complete_.Set();
-    }
-    return SEND_PACKET;
-  }
-
-  void OnCallsCreated(Call* sender_call, Call* receiver_call) override {
-    sender_call_ = sender_call;
-    receiver_call_ = receiver_call;
-  }
-
-  void PerformTest() override {
-    EXPECT_TRUE(Wait()) << "Timed out while waiting for "
-                           "non-zero bandwidth stats.";
-  }
-
- private:
-  Call* sender_call_;
-  Call* receiver_call_;
-  bool has_seen_pacer_delay_;
-  const bool send_side_bwe_;
-};
-
-TEST_F(EndToEndTest, VerifySendSideBweStats) {
-  BandwidthStatsTest test(true);
-  RunBaseTest(&test);
-}
-
-TEST_F(EndToEndTest, VerifyRecvSideBweStats) {
-  BandwidthStatsTest test(false);
-  RunBaseTest(&test);
-}
-
-// Verifies that it's possible to limit the send BWE by sending a REMB.
-// This is verified by allowing the send BWE to ramp-up to >1000 kbps,
-// then have the test generate a REMB of 500 kbps and verify that the send BWE
-// is reduced to exactly 500 kbps. Then a REMB of 1000 kbps is generated and the
-// test verifies that the send BWE ramps back up to exactly 1000 kbps.
-TEST_F(EndToEndTest, RembWithSendSideBwe) {
-  class BweObserver : public test::EndToEndTest {
-   public:
-    BweObserver()
-        : EndToEndTest(kDefaultTimeoutMs),
-          sender_call_(nullptr),
-          clock_(Clock::GetRealTimeClock()),
-          sender_ssrc_(0),
-          remb_bitrate_bps_(1000000),
-          receive_transport_(nullptr),
-          stop_event_(false, false),
-          poller_thread_(&BitrateStatsPollingThread,
-                         this,
-                         "BitrateStatsPollingThread"),
-          state_(kWaitForFirstRampUp),
-          retransmission_rate_limiter_(clock_, 1000) {}
-
-    ~BweObserver() {}
-
-    test::PacketTransport* CreateReceiveTransport(
-        test::SingleThreadedTaskQueueForTesting* task_queue) override {
-      receive_transport_ = new test::PacketTransport(
-          task_queue, nullptr, this, test::PacketTransport::kReceiver,
-          payload_type_map_, FakeNetworkPipe::Config());
-      return receive_transport_;
-    }
-
-    Call::Config GetSenderCallConfig() override {
-      Call::Config config(event_log_.get());
-      // Set a high start bitrate to reduce the test completion time.
-      config.bitrate_config.start_bitrate_bps = remb_bitrate_bps_;
-      return config;
-    }
-
-    void ModifyVideoConfigs(
-        VideoSendStream::Config* send_config,
-        std::vector<VideoReceiveStream::Config>* receive_configs,
-        VideoEncoderConfig* encoder_config) override {
-      ASSERT_EQ(1u, send_config->rtp.ssrcs.size());
-      sender_ssrc_ = send_config->rtp.ssrcs[0];
-
-      encoder_config->max_bitrate_bps = 2000000;
-
-      ASSERT_EQ(1u, receive_configs->size());
-      RtpRtcp::Configuration config;
-      config.receiver_only = true;
-      config.clock = clock_;
-      config.outgoing_transport = receive_transport_;
-      config.retransmission_rate_limiter = &retransmission_rate_limiter_;
-      rtp_rtcp_.reset(RtpRtcp::CreateRtpRtcp(config));
-      rtp_rtcp_->SetRemoteSSRC((*receive_configs)[0].rtp.remote_ssrc);
-      rtp_rtcp_->SetSSRC((*receive_configs)[0].rtp.local_ssrc);
-      rtp_rtcp_->SetREMBStatus(true);
-      rtp_rtcp_->SetRTCPStatus(RtcpMode::kReducedSize);
-    }
-
-    void OnCallsCreated(Call* sender_call, Call* receiver_call) override {
-      sender_call_ = sender_call;
-    }
-
-    static void BitrateStatsPollingThread(void* obj) {
-      static_cast<BweObserver*>(obj)->PollStats();
-    }
-
-    void PollStats() {
-      do {
-        if (sender_call_) {
-          Call::Stats stats = sender_call_->GetStats();
-          switch (state_) {
-            case kWaitForFirstRampUp:
-              if (stats.send_bandwidth_bps >= remb_bitrate_bps_) {
-                state_ = kWaitForRemb;
-                remb_bitrate_bps_ /= 2;
-                rtp_rtcp_->SetREMBData(
-                    remb_bitrate_bps_,
-                    std::vector<uint32_t>(&sender_ssrc_, &sender_ssrc_ + 1));
-                rtp_rtcp_->SendRTCP(kRtcpRr);
-              }
-              break;
-
-            case kWaitForRemb:
-              if (stats.send_bandwidth_bps == remb_bitrate_bps_) {
-                state_ = kWaitForSecondRampUp;
-                remb_bitrate_bps_ *= 2;
-                rtp_rtcp_->SetREMBData(
-                    remb_bitrate_bps_,
-                    std::vector<uint32_t>(&sender_ssrc_, &sender_ssrc_ + 1));
-                rtp_rtcp_->SendRTCP(kRtcpRr);
-              }
-              break;
-
-            case kWaitForSecondRampUp:
-              if (stats.send_bandwidth_bps == remb_bitrate_bps_) {
-                observation_complete_.Set();
-              }
-              break;
-          }
-        }
-      } while (!stop_event_.Wait(1000));
-    }
-
-    void PerformTest() override {
-      poller_thread_.Start();
-      EXPECT_TRUE(Wait())
-          << "Timed out while waiting for bitrate to change according to REMB.";
-      stop_event_.Set();
-      poller_thread_.Stop();
-    }
-
-   private:
-    enum TestState { kWaitForFirstRampUp, kWaitForRemb, kWaitForSecondRampUp };
-
-    Call* sender_call_;
-    Clock* const clock_;
-    uint32_t sender_ssrc_;
-    int remb_bitrate_bps_;
-    std::unique_ptr<RtpRtcp> rtp_rtcp_;
-    test::PacketTransport* receive_transport_;
-    rtc::Event stop_event_;
-    rtc::PlatformThread poller_thread_;
-    TestState state_;
-    RateLimiter retransmission_rate_limiter_;
-  } test;
-
-  RunBaseTest(&test);
-}
-
-TEST_F(EndToEndTest, StopSendingKeyframeRequestsForInactiveStream) {
-  class KeyframeRequestObserver : public test::EndToEndTest {
-   public:
-    explicit KeyframeRequestObserver(
-        test::SingleThreadedTaskQueueForTesting* task_queue)
-        : clock_(Clock::GetRealTimeClock()), task_queue_(task_queue) {}
-
-    void OnVideoStreamsCreated(
-        VideoSendStream* send_stream,
-        const std::vector<VideoReceiveStream*>& receive_streams) override {
-      RTC_DCHECK_EQ(1, receive_streams.size());
-      send_stream_ = send_stream;
-      receive_stream_ = receive_streams[0];
-    }
-
-    void PerformTest() override {
-      bool frame_decoded = false;
-      int64_t start_time = clock_->TimeInMilliseconds();
-      while (clock_->TimeInMilliseconds() - start_time <= 5000) {
-        if (receive_stream_->GetStats().frames_decoded > 0) {
-          frame_decoded = true;
-          break;
-        }
-        SleepMs(100);
-      }
-      ASSERT_TRUE(frame_decoded);
-      task_queue_->SendTask([this]() { send_stream_->Stop(); });
-      SleepMs(10000);
-      ASSERT_EQ(
-          1U, receive_stream_->GetStats().rtcp_packet_type_counts.pli_packets);
-    }
-
-   private:
-    Clock* clock_;
-    VideoSendStream* send_stream_;
-    VideoReceiveStream* receive_stream_;
-    test::SingleThreadedTaskQueueForTesting* const task_queue_;
-  } test(&task_queue_);
-
-  RunBaseTest(&test);
-}
-
-class ProbingTest : public test::EndToEndTest {
- public:
-  explicit ProbingTest(int start_bitrate_bps)
-      : clock_(Clock::GetRealTimeClock()),
-        start_bitrate_bps_(start_bitrate_bps),
-        state_(0),
-        sender_call_(nullptr) {}
-
-  ~ProbingTest() {}
-
-  Call::Config GetSenderCallConfig() override {
-    Call::Config config(event_log_.get());
-    config.bitrate_config.start_bitrate_bps = start_bitrate_bps_;
-    return config;
-  }
-
-  void OnCallsCreated(Call* sender_call, Call* receiver_call) override {
-    sender_call_ = sender_call;
-  }
-
- protected:
-  Clock* const clock_;
-  const int start_bitrate_bps_;
-  int state_;
-  Call* sender_call_;
-};
-
-TEST_F(EndToEndTest, MAYBE_InitialProbing) {
-  class InitialProbingTest : public ProbingTest {
-   public:
-    explicit InitialProbingTest(bool* success)
-        : ProbingTest(300000), success_(success) {
-      *success_ = false;
-    }
-
-    void PerformTest() override {
-      int64_t start_time_ms = clock_->TimeInMilliseconds();
-      do {
-        if (clock_->TimeInMilliseconds() - start_time_ms > kTimeoutMs)
-          break;
-
-        Call::Stats stats = sender_call_->GetStats();
-        // Initial probing is done with a x3 and x6 multiplier of the start
-        // bitrate, so a x4 multiplier is a high enough threshold.
-        if (stats.send_bandwidth_bps > 4 * 300000) {
-          *success_ = true;
-          break;
-        }
-      } while (!observation_complete_.Wait(20));
-    }
-
-   private:
-    const int kTimeoutMs = 1000;
-    bool* const success_;
-  };
-
-  bool success = false;
-  const int kMaxAttempts = 3;
-  for (int i = 0; i < kMaxAttempts; ++i) {
-    InitialProbingTest test(&success);
-    RunBaseTest(&test);
-    if (success)
-      return;
-  }
-  EXPECT_TRUE(success) << "Failed to perform mid initial probing ("
-                       << kMaxAttempts << " attempts).";
-}
-
-// Fails on Linux MSan: bugs.webrtc.org/7428
-#if defined(MEMORY_SANITIZER)
-TEST_F(EndToEndTest, DISABLED_TriggerMidCallProbing) {
-// Fails on iOS bots: bugs.webrtc.org/7851
-#elif defined(TARGET_IPHONE_SIMULATOR) && TARGET_IPHONE_SIMULATOR
-TEST_F(EndToEndTest, DISABLED_TriggerMidCallProbing) {
-#else
-TEST_F(EndToEndTest, TriggerMidCallProbing) {
-#endif
-
-  class TriggerMidCallProbingTest : public ProbingTest {
-   public:
-    TriggerMidCallProbingTest(
-        test::SingleThreadedTaskQueueForTesting* task_queue,
-        bool* success)
-        : ProbingTest(300000), success_(success), task_queue_(task_queue) {}
-
-    void PerformTest() override {
-      *success_ = false;
-      int64_t start_time_ms = clock_->TimeInMilliseconds();
-      do {
-        if (clock_->TimeInMilliseconds() - start_time_ms > kTimeoutMs)
-          break;
-
-        Call::Stats stats = sender_call_->GetStats();
-
-        switch (state_) {
-          case 0:
-            if (stats.send_bandwidth_bps > 5 * 300000) {
-              Call::Config::BitrateConfig bitrate_config;
-              bitrate_config.max_bitrate_bps = 100000;
-              task_queue_->SendTask([this, &bitrate_config]() {
-                sender_call_->SetBitrateConfig(bitrate_config);
-              });
-              ++state_;
-            }
-            break;
-          case 1:
-            if (stats.send_bandwidth_bps < 110000) {
-              Call::Config::BitrateConfig bitrate_config;
-              bitrate_config.max_bitrate_bps = 2500000;
-              task_queue_->SendTask([this, &bitrate_config]() {
-                sender_call_->SetBitrateConfig(bitrate_config);
-              });
-              ++state_;
-            }
-            break;
-          case 2:
-            // During high cpu load the pacer will not be able to pace packets
-            // at the correct speed, but if we go from 110 to 1250 kbps
-            // in 5 seconds then it is due to probing.
-            if (stats.send_bandwidth_bps > 1250000) {
-              *success_ = true;
-              observation_complete_.Set();
-            }
-            break;
-        }
-      } while (!observation_complete_.Wait(20));
-    }
-
-   private:
-    const int kTimeoutMs = 5000;
-    bool* const success_;
-    test::SingleThreadedTaskQueueForTesting* const task_queue_;
-  };
-
-  bool success = false;
-  const int kMaxAttempts = 3;
-  for (int i = 0; i < kMaxAttempts; ++i) {
-    TriggerMidCallProbingTest test(&task_queue_, &success);
-    RunBaseTest(&test);
-    if (success)
-      return;
-  }
-  EXPECT_TRUE(success) << "Failed to perform mid call probing (" << kMaxAttempts
-                       << " attempts).";
-}
-
-TEST_F(EndToEndTest, VerifyNackStats) {
-  static const int kPacketNumberToDrop = 200;
-  class NackObserver : public test::EndToEndTest {
-   public:
-    NackObserver()
-        : EndToEndTest(kLongTimeoutMs),
-          sent_rtp_packets_(0),
-          dropped_rtp_packet_(0),
-          dropped_rtp_packet_requested_(false),
-          send_stream_(nullptr),
-          start_runtime_ms_(-1) {}
-
-   private:
-    Action OnSendRtp(const uint8_t* packet, size_t length) override {
-      rtc::CritScope lock(&crit_);
-      if (++sent_rtp_packets_ == kPacketNumberToDrop) {
-        std::unique_ptr<RtpHeaderParser> parser(RtpHeaderParser::Create());
-        RTPHeader header;
-        EXPECT_TRUE(parser->Parse(packet, length, &header));
-        dropped_rtp_packet_ = header.sequenceNumber;
-        return DROP_PACKET;
-      }
-      VerifyStats();
-      return SEND_PACKET;
-    }
-
-    Action OnReceiveRtcp(const uint8_t* packet, size_t length) override {
-      rtc::CritScope lock(&crit_);
-      test::RtcpPacketParser rtcp_parser;
-      rtcp_parser.Parse(packet, length);
-      const std::vector<uint16_t>& nacks = rtcp_parser.nack()->packet_ids();
-      if (!nacks.empty() && std::find(
-          nacks.begin(), nacks.end(), dropped_rtp_packet_) != nacks.end()) {
-        dropped_rtp_packet_requested_ = true;
-      }
-      return SEND_PACKET;
-    }
-
-    void VerifyStats() RTC_EXCLUSIVE_LOCKS_REQUIRED(&crit_) {
-      if (!dropped_rtp_packet_requested_)
-        return;
-      int send_stream_nack_packets = 0;
-      int receive_stream_nack_packets = 0;
-      VideoSendStream::Stats stats = send_stream_->GetStats();
-      for (std::map<uint32_t, VideoSendStream::StreamStats>::const_iterator it =
-           stats.substreams.begin(); it != stats.substreams.end(); ++it) {
-        const VideoSendStream::StreamStats& stream_stats = it->second;
-        send_stream_nack_packets +=
-            stream_stats.rtcp_packet_type_counts.nack_packets;
-      }
-      for (size_t i = 0; i < receive_streams_.size(); ++i) {
-        VideoReceiveStream::Stats stats = receive_streams_[i]->GetStats();
-        receive_stream_nack_packets +=
-            stats.rtcp_packet_type_counts.nack_packets;
-      }
-      if (send_stream_nack_packets >= 1 && receive_stream_nack_packets >= 1) {
-        // NACK packet sent on receive stream and received on sent stream.
-        if (MinMetricRunTimePassed())
-          observation_complete_.Set();
-      }
-    }
-
-    bool MinMetricRunTimePassed() {
-      int64_t now = Clock::GetRealTimeClock()->TimeInMilliseconds();
-      if (start_runtime_ms_ == -1) {
-        start_runtime_ms_ = now;
-        return false;
-      }
-      int64_t elapsed_sec = (now - start_runtime_ms_) / 1000;
-      return elapsed_sec > metrics::kMinRunTimeInSeconds;
-    }
-
-    void ModifyVideoConfigs(
-        VideoSendStream::Config* send_config,
-        std::vector<VideoReceiveStream::Config>* receive_configs,
-        VideoEncoderConfig* encoder_config) override {
-      send_config->rtp.nack.rtp_history_ms = kNackRtpHistoryMs;
-      (*receive_configs)[0].rtp.nack.rtp_history_ms = kNackRtpHistoryMs;
-      (*receive_configs)[0].renderer = &fake_renderer_;
-    }
-
-    void OnVideoStreamsCreated(
-        VideoSendStream* send_stream,
-        const std::vector<VideoReceiveStream*>& receive_streams) override {
-      send_stream_ = send_stream;
-      receive_streams_ = receive_streams;
-    }
-
-    void PerformTest() override {
-      EXPECT_TRUE(Wait()) << "Timed out waiting for packet to be NACKed.";
-    }
-
-    test::FakeVideoRenderer fake_renderer_;
-    rtc::CriticalSection crit_;
-    uint64_t sent_rtp_packets_;
-    uint16_t dropped_rtp_packet_ RTC_GUARDED_BY(&crit_);
-    bool dropped_rtp_packet_requested_ RTC_GUARDED_BY(&crit_);
-    std::vector<VideoReceiveStream*> receive_streams_;
-    VideoSendStream* send_stream_;
-    int64_t start_runtime_ms_;
-  } test;
-
-  metrics::Reset();
-  RunBaseTest(&test);
-
-  EXPECT_EQ(
-      1, metrics::NumSamples("WebRTC.Video.UniqueNackRequestsSentInPercent"));
-  EXPECT_EQ(1, metrics::NumSamples(
-                   "WebRTC.Video.UniqueNackRequestsReceivedInPercent"));
-  EXPECT_GT(metrics::MinSample("WebRTC.Video.NackPacketsSentPerMinute"), 0);
-}
-
-void EndToEndTest::VerifyHistogramStats(bool use_rtx,
-                                        bool use_red,
-                                        bool screenshare) {
-  class StatsObserver : public test::EndToEndTest,
-                        public rtc::VideoSinkInterface<VideoFrame> {
-   public:
-    StatsObserver(bool use_rtx, bool use_red, bool screenshare)
-        : EndToEndTest(kLongTimeoutMs),
-          use_rtx_(use_rtx),
-          use_red_(use_red),
-          screenshare_(screenshare),
-          // This test uses NACK, so to send FEC we can't use a fake encoder.
-          vp8_encoder_(use_red ? VP8Encoder::Create() : nullptr),
-          sender_call_(nullptr),
-          receiver_call_(nullptr),
-          start_runtime_ms_(-1),
-          num_frames_received_(0) {}
-
-   private:
-    void OnFrame(const VideoFrame& video_frame) override {
-      // The RTT is needed to estimate |ntp_time_ms| which is used by
-      // end-to-end delay stats. Therefore, start counting received frames once
-      // |ntp_time_ms| is valid.
-      if (video_frame.ntp_time_ms() > 0 &&
-          Clock::GetRealTimeClock()->CurrentNtpInMilliseconds() >=
-              video_frame.ntp_time_ms()) {
-        rtc::CritScope lock(&crit_);
-        ++num_frames_received_;
-      }
-    }
-
-    Action OnSendRtp(const uint8_t* packet, size_t length) override {
-      if (MinMetricRunTimePassed() && MinNumberOfFramesReceived())
-        observation_complete_.Set();
-
-      return SEND_PACKET;
-    }
-
-    bool MinMetricRunTimePassed() {
-      int64_t now = Clock::GetRealTimeClock()->TimeInMilliseconds();
-      if (start_runtime_ms_ == -1) {
-        start_runtime_ms_ = now;
-        return false;
-      }
-      int64_t elapsed_sec = (now - start_runtime_ms_) / 1000;
-      return elapsed_sec > metrics::kMinRunTimeInSeconds * 2;
-    }
-
-    bool MinNumberOfFramesReceived() const {
-      const int kMinRequiredHistogramSamples = 200;
-      rtc::CritScope lock(&crit_);
-      return num_frames_received_ > kMinRequiredHistogramSamples;
-    }
-
-    void ModifyVideoConfigs(
-        VideoSendStream::Config* send_config,
-        std::vector<VideoReceiveStream::Config>* receive_configs,
-        VideoEncoderConfig* encoder_config) override {
-      // NACK
-      send_config->rtp.nack.rtp_history_ms = kNackRtpHistoryMs;
-      (*receive_configs)[0].rtp.nack.rtp_history_ms = kNackRtpHistoryMs;
-      (*receive_configs)[0].renderer = this;
-      // FEC
-      if (use_red_) {
-        send_config->rtp.ulpfec.ulpfec_payload_type = kUlpfecPayloadType;
-        send_config->rtp.ulpfec.red_payload_type = kRedPayloadType;
-        send_config->encoder_settings.encoder = vp8_encoder_.get();
-        send_config->encoder_settings.payload_name = "VP8";
-        (*receive_configs)[0].decoders[0].payload_name = "VP8";
-        (*receive_configs)[0].rtp.ulpfec.red_payload_type = kRedPayloadType;
-        (*receive_configs)[0].rtp.ulpfec.ulpfec_payload_type =
-            kUlpfecPayloadType;
-      }
-      // RTX
-      if (use_rtx_) {
-        send_config->rtp.rtx.ssrcs.push_back(kSendRtxSsrcs[0]);
-        send_config->rtp.rtx.payload_type = kSendRtxPayloadType;
-        (*receive_configs)[0].rtp.rtx_ssrc = kSendRtxSsrcs[0];
-        (*receive_configs)[0]
-            .rtp.rtx_associated_payload_types[kSendRtxPayloadType] =
-            kFakeVideoSendPayloadType;
-      }
-      // RTT needed for RemoteNtpTimeEstimator for the receive stream.
-      (*receive_configs)[0].rtp.rtcp_xr.receiver_reference_time_report = true;
-      encoder_config->content_type =
-          screenshare_ ? VideoEncoderConfig::ContentType::kScreen
-                       : VideoEncoderConfig::ContentType::kRealtimeVideo;
-    }
-
-    void OnCallsCreated(Call* sender_call, Call* receiver_call) override {
-      sender_call_ = sender_call;
-      receiver_call_ = receiver_call;
-    }
-
-    void PerformTest() override {
-      EXPECT_TRUE(Wait()) << "Timed out waiting for packet to be NACKed.";
-    }
-
-    rtc::CriticalSection crit_;
-    const bool use_rtx_;
-    const bool use_red_;
-    const bool screenshare_;
-    const std::unique_ptr<VideoEncoder> vp8_encoder_;
-    Call* sender_call_;
-    Call* receiver_call_;
-    int64_t start_runtime_ms_;
-    int num_frames_received_ RTC_GUARDED_BY(&crit_);
-  } test(use_rtx, use_red, screenshare);
-
-  metrics::Reset();
-  RunBaseTest(&test);
-
-  std::string video_prefix =
-      screenshare ? "WebRTC.Video.Screenshare." : "WebRTC.Video.";
-  // The content type extension is disabled in non screenshare test,
-  // therefore no slicing on simulcast id should be present.
-  std::string video_suffix = screenshare ? ".S0" : "";
-  // Verify that stats have been updated once.
-  EXPECT_EQ(2, metrics::NumSamples("WebRTC.Call.LifetimeInSeconds"));
-  EXPECT_EQ(1, metrics::NumSamples(
-                   "WebRTC.Call.TimeReceivingVideoRtpPacketsInSeconds"));
-  EXPECT_EQ(1, metrics::NumSamples("WebRTC.Call.VideoBitrateReceivedInKbps"));
-  EXPECT_EQ(1, metrics::NumSamples("WebRTC.Call.RtcpBitrateReceivedInBps"));
-  EXPECT_EQ(1, metrics::NumSamples("WebRTC.Call.BitrateReceivedInKbps"));
-  EXPECT_EQ(1, metrics::NumSamples("WebRTC.Call.EstimatedSendBitrateInKbps"));
-  EXPECT_EQ(1, metrics::NumSamples("WebRTC.Call.PacerBitrateInKbps"));
-
-  EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.SendStreamLifetimeInSeconds"));
-  EXPECT_EQ(1,
-            metrics::NumSamples("WebRTC.Video.ReceiveStreamLifetimeInSeconds"));
-
-  EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.NackPacketsSentPerMinute"));
-  EXPECT_EQ(1,
-            metrics::NumSamples(video_prefix + "NackPacketsReceivedPerMinute"));
-  EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.FirPacketsSentPerMinute"));
-  EXPECT_EQ(1,
-            metrics::NumSamples(video_prefix + "FirPacketsReceivedPerMinute"));
-  EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.PliPacketsSentPerMinute"));
-  EXPECT_EQ(1,
-            metrics::NumSamples(video_prefix + "PliPacketsReceivedPerMinute"));
-
-  EXPECT_EQ(1, metrics::NumSamples(video_prefix + "KeyFramesSentInPermille"));
-  EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.KeyFramesReceivedInPermille"));
-
-  EXPECT_EQ(1, metrics::NumSamples(video_prefix + "SentPacketsLostInPercent"));
-  EXPECT_EQ(1,
-            metrics::NumSamples("WebRTC.Video.ReceivedPacketsLostInPercent"));
-
-  EXPECT_EQ(1, metrics::NumSamples(video_prefix + "InputWidthInPixels"));
-  EXPECT_EQ(1, metrics::NumSamples(video_prefix + "InputHeightInPixels"));
-  EXPECT_EQ(1, metrics::NumSamples(video_prefix + "SentWidthInPixels"));
-  EXPECT_EQ(1, metrics::NumSamples(video_prefix + "SentHeightInPixels"));
-  EXPECT_EQ(1, metrics::NumSamples(video_prefix + "ReceivedWidthInPixels"));
-  EXPECT_EQ(1, metrics::NumSamples(video_prefix + "ReceivedHeightInPixels"));
-
-  EXPECT_EQ(1, metrics::NumEvents(video_prefix + "InputWidthInPixels",
-                                  kDefaultWidth));
-  EXPECT_EQ(1, metrics::NumEvents(video_prefix + "InputHeightInPixels",
-                                  kDefaultHeight));
-  EXPECT_EQ(
-      1, metrics::NumEvents(video_prefix + "SentWidthInPixels", kDefaultWidth));
-  EXPECT_EQ(1, metrics::NumEvents(video_prefix + "SentHeightInPixels",
-                                  kDefaultHeight));
-  EXPECT_EQ(1, metrics::NumEvents(video_prefix + "ReceivedWidthInPixels",
-                                  kDefaultWidth));
-  EXPECT_EQ(1, metrics::NumEvents(video_prefix + "ReceivedHeightInPixels",
-                                  kDefaultHeight));
-
-  EXPECT_EQ(1, metrics::NumSamples(video_prefix + "InputFramesPerSecond"));
-  EXPECT_EQ(1, metrics::NumSamples(video_prefix + "SentFramesPerSecond"));
-  EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.DecodedFramesPerSecond"));
-  EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.RenderFramesPerSecond"));
-
-  EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.JitterBufferDelayInMs"));
-  EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.TargetDelayInMs"));
-  EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.CurrentDelayInMs"));
-  EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.OnewayDelayInMs"));
-
-  EXPECT_EQ(1, metrics::NumSamples(video_prefix + "EndToEndDelayInMs" +
-                                   video_suffix));
-  EXPECT_EQ(1, metrics::NumSamples(video_prefix + "EndToEndDelayMaxInMs" +
-                                   video_suffix));
-  EXPECT_EQ(1, metrics::NumSamples(video_prefix + "InterframeDelayInMs" +
-                                   video_suffix));
-  EXPECT_EQ(1, metrics::NumSamples(video_prefix + "InterframeDelayMaxInMs" +
-                                   video_suffix));
-
-  EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.RenderSqrtPixelsPerSecond"));
-
-  EXPECT_EQ(1, metrics::NumSamples(video_prefix + "EncodeTimeInMs"));
-  EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.DecodeTimeInMs"));
-
-  EXPECT_EQ(1, metrics::NumSamples(video_prefix + "NumberOfPauseEvents"));
-  EXPECT_EQ(1, metrics::NumSamples(video_prefix + "PausedTimeInPercent"));
-
-  EXPECT_EQ(1, metrics::NumSamples(video_prefix + "BitrateSentInKbps"));
-  EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.BitrateReceivedInKbps"));
-  EXPECT_EQ(1, metrics::NumSamples(video_prefix + "MediaBitrateSentInKbps"));
-  EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.MediaBitrateReceivedInKbps"));
-  EXPECT_EQ(1, metrics::NumSamples(video_prefix + "PaddingBitrateSentInKbps"));
-  EXPECT_EQ(1,
-            metrics::NumSamples("WebRTC.Video.PaddingBitrateReceivedInKbps"));
-  EXPECT_EQ(
-      1, metrics::NumSamples(video_prefix + "RetransmittedBitrateSentInKbps"));
-  EXPECT_EQ(1, metrics::NumSamples(
-                   "WebRTC.Video.RetransmittedBitrateReceivedInKbps"));
-
-  EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.SendDelayInMs"));
-  EXPECT_EQ(1, metrics::NumSamples(video_prefix + "SendSideDelayInMs"));
-  EXPECT_EQ(1, metrics::NumSamples(video_prefix + "SendSideDelayMaxInMs"));
-
-  int num_rtx_samples = use_rtx ? 1 : 0;
-  EXPECT_EQ(num_rtx_samples,
-            metrics::NumSamples("WebRTC.Video.RtxBitrateSentInKbps"));
-  EXPECT_EQ(num_rtx_samples,
-            metrics::NumSamples("WebRTC.Video.RtxBitrateReceivedInKbps"));
-
-  int num_red_samples = use_red ? 1 : 0;
-  EXPECT_EQ(num_red_samples,
-            metrics::NumSamples("WebRTC.Video.FecBitrateSentInKbps"));
-  EXPECT_EQ(num_red_samples,
-            metrics::NumSamples("WebRTC.Video.FecBitrateReceivedInKbps"));
-  EXPECT_EQ(num_red_samples,
-            metrics::NumSamples("WebRTC.Video.ReceivedFecPacketsInPercent"));
-}
-
-#if defined(WEBRTC_WIN)
-// Disabled due to flakiness on Windows (bugs.webrtc.org/7483).
-#define MAYBE_ContentTypeSwitches DISABLED_ContentTypeSwitches
-#else
-#define MAYBE_ContentTypeSwitches ContentTypeSwitches
-#endif
-TEST_F(EndToEndTest, MAYBE_ContentTypeSwitches) {
-  class StatsObserver : public test::BaseTest,
-                        public rtc::VideoSinkInterface<VideoFrame> {
-   public:
-    StatsObserver() : BaseTest(kLongTimeoutMs), num_frames_received_(0) {}
-
-    bool ShouldCreateReceivers() const override { return true; }
-
-    void OnFrame(const VideoFrame& video_frame) override {
-      // The RTT is needed to estimate |ntp_time_ms| which is used by
-      // end-to-end delay stats. Therefore, start counting received frames once
-      // |ntp_time_ms| is valid.
-      if (video_frame.ntp_time_ms() > 0 &&
-          Clock::GetRealTimeClock()->CurrentNtpInMilliseconds() >=
-              video_frame.ntp_time_ms()) {
-        rtc::CritScope lock(&crit_);
-        ++num_frames_received_;
-      }
-    }
-
-    Action OnSendRtp(const uint8_t* packet, size_t length) override {
-      if (MinNumberOfFramesReceived())
-        observation_complete_.Set();
-      return SEND_PACKET;
-    }
-
-    bool MinNumberOfFramesReceived() const {
-      // Have some room for frames with wrong content type during switch.
-      const int kMinRequiredHistogramSamples = 200+50;
-      rtc::CritScope lock(&crit_);
-      return num_frames_received_ > kMinRequiredHistogramSamples;
-    }
-
-    // May be called several times.
-    void PerformTest() override {
-      EXPECT_TRUE(Wait()) << "Timed out waiting for enough packets.";
-      // Reset frame counter so next PerformTest() call will do something.
-      {
-        rtc::CritScope lock(&crit_);
-        num_frames_received_ = 0;
-      }
-    }
-
-    rtc::CriticalSection crit_;
-    int num_frames_received_ RTC_GUARDED_BY(&crit_);
-  } test;
-
-  metrics::Reset();
-
-  Call::Config send_config(test.GetSenderCallConfig());
-  Call::Config recv_config(test.GetReceiverCallConfig());
-  VideoEncoderConfig encoder_config_with_screenshare;
-
-  task_queue_.SendTask([this, &test, &send_config,
-                        &recv_config, &encoder_config_with_screenshare]() {
-    CreateSenderCall(send_config);
-    CreateReceiverCall(recv_config);
-
-    receive_transport_.reset(test.CreateReceiveTransport(&task_queue_));
-    send_transport_.reset(
-        test.CreateSendTransport(&task_queue_, sender_call_.get()));
-    send_transport_->SetReceiver(receiver_call_->Receiver());
-    receive_transport_->SetReceiver(sender_call_->Receiver());
-
-    receiver_call_->SignalChannelNetworkState(MediaType::VIDEO, kNetworkUp);
-    CreateSendConfig(1, 0, 0, send_transport_.get());
-    CreateMatchingReceiveConfigs(receive_transport_.get());
-
-    // Modify send and receive configs.
-    video_send_config_.rtp.nack.rtp_history_ms = kNackRtpHistoryMs;
-    video_receive_configs_[0].rtp.nack.rtp_history_ms = kNackRtpHistoryMs;
-    video_receive_configs_[0].renderer = &test;
-    // RTT needed for RemoteNtpTimeEstimator for the receive stream.
-    video_receive_configs_[0].rtp.rtcp_xr.receiver_reference_time_report = true;
-    // Start with realtime video.
-    video_encoder_config_.content_type =
-        VideoEncoderConfig::ContentType::kRealtimeVideo;
-    // Second encoder config for the second part of the test uses screenshare
-    encoder_config_with_screenshare = video_encoder_config_.Copy();
-    encoder_config_with_screenshare.content_type =
-        VideoEncoderConfig::ContentType::kScreen;
-
-    CreateVideoStreams();
-    CreateFrameGeneratorCapturer(kDefaultFramerate, kDefaultWidth,
-                                 kDefaultHeight);
-    Start();
-  });
-
-  test.PerformTest();
-
-  // Replace old send stream.
-  task_queue_.SendTask([this, &encoder_config_with_screenshare]() {
-    sender_call_->DestroyVideoSendStream(video_send_stream_);
-    video_send_stream_ = sender_call_->CreateVideoSendStream(
-        video_send_config_.Copy(), encoder_config_with_screenshare.Copy());
-    video_send_stream_->SetSource(
-        frame_generator_capturer_.get(),
-        VideoSendStream::DegradationPreference::kBalanced);
-    video_send_stream_->Start();
-  });
-
-  // Continue to run test but now with screenshare.
-  test.PerformTest();
-
-  task_queue_.SendTask([this]() {
-    Stop();
-    DestroyStreams();
-    send_transport_.reset();
-    receive_transport_.reset();
-    DestroyCalls();
-  });
-
-  // Verify that stats have been updated for both screenshare and video.
-  EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.EndToEndDelayInMs"));
-  EXPECT_EQ(1,
-            metrics::NumSamples("WebRTC.Video.Screenshare.EndToEndDelayInMs"));
-  EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.EndToEndDelayMaxInMs"));
-  EXPECT_EQ(
-      1, metrics::NumSamples("WebRTC.Video.Screenshare.EndToEndDelayMaxInMs"));
-  EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.InterframeDelayInMs"));
-  EXPECT_EQ(1,
-            metrics::NumSamples(
-                "WebRTC.Video.Screenshare.InterframeDelayInMs"));
-  EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.InterframeDelayMaxInMs"));
-  EXPECT_EQ(1,
-            metrics::NumSamples(
-                "WebRTC.Video.Screenshare.InterframeDelayMaxInMs"));
-}
-
-TEST_F(EndToEndTest, VerifyHistogramStatsWithRtx) {
-  const bool kEnabledRtx = true;
-  const bool kEnabledRed = false;
-  const bool kScreenshare = false;
-  VerifyHistogramStats(kEnabledRtx, kEnabledRed, kScreenshare);
-}
-
-TEST_F(EndToEndTest, VerifyHistogramStatsWithRed) {
-  const bool kEnabledRtx = false;
-  const bool kEnabledRed = true;
-  const bool kScreenshare = false;
-  VerifyHistogramStats(kEnabledRtx, kEnabledRed, kScreenshare);
-}
-
-TEST_F(EndToEndTest, VerifyHistogramStatsWithScreenshare) {
-  const bool kEnabledRtx = false;
-  const bool kEnabledRed = false;
-  const bool kScreenshare = true;
-  VerifyHistogramStats(kEnabledRtx, kEnabledRed, kScreenshare);
-}
-
-void EndToEndTest::TestSendsSetSsrcs(size_t num_ssrcs,
-                                     bool send_single_ssrc_first) {
-  class SendsSetSsrcs : public test::EndToEndTest {
-   public:
-    SendsSetSsrcs(const uint32_t* ssrcs,
-                  size_t num_ssrcs,
-                  bool send_single_ssrc_first)
-        : EndToEndTest(kDefaultTimeoutMs),
-          num_ssrcs_(num_ssrcs),
-          send_single_ssrc_first_(send_single_ssrc_first),
-          ssrcs_to_observe_(num_ssrcs),
-          expect_single_ssrc_(send_single_ssrc_first),
-          send_stream_(nullptr) {
-      for (size_t i = 0; i < num_ssrcs; ++i)
-        valid_ssrcs_[ssrcs[i]] = true;
-    }
-
-   private:
-    Action OnSendRtp(const uint8_t* packet, size_t length) override {
-      RTPHeader header;
-      EXPECT_TRUE(parser_->Parse(packet, length, &header));
-
-      EXPECT_TRUE(valid_ssrcs_[header.ssrc])
-          << "Received unknown SSRC: " << header.ssrc;
-
-      if (!valid_ssrcs_[header.ssrc])
-        observation_complete_.Set();
-
-      if (!is_observed_[header.ssrc]) {
-        is_observed_[header.ssrc] = true;
-        --ssrcs_to_observe_;
-        if (expect_single_ssrc_) {
-          expect_single_ssrc_ = false;
-          observation_complete_.Set();
-        }
-      }
-
-      if (ssrcs_to_observe_ == 0)
-        observation_complete_.Set();
-
-      return SEND_PACKET;
-    }
-
-    size_t GetNumVideoStreams() const override { return num_ssrcs_; }
-
-    // This test use other VideoStream settings than the the default settings
-    // implemented in DefaultVideoStreamFactory. Therefore  this test implement
-    // its own VideoEncoderConfig::VideoStreamFactoryInterface which is created
-    // in ModifyVideoConfigs.
-    class VideoStreamFactory
-        : public VideoEncoderConfig::VideoStreamFactoryInterface {
-     public:
-      VideoStreamFactory() {}
-
-     private:
-      std::vector<VideoStream> CreateEncoderStreams(
-          int width,
-          int height,
-          const VideoEncoderConfig& encoder_config) override {
-        std::vector<VideoStream> streams =
-            test::CreateVideoStreams(width, height, encoder_config);
-        // Set low simulcast bitrates to not have to wait for bandwidth ramp-up.
-        for (size_t i = 0; i < encoder_config.number_of_streams; ++i) {
-          streams[i].min_bitrate_bps = 10000;
-          streams[i].target_bitrate_bps = 15000;
-          streams[i].max_bitrate_bps = 20000;
-        }
-        return streams;
-      }
-    };
-
-    void ModifyVideoConfigs(
-        VideoSendStream::Config* send_config,
-        std::vector<VideoReceiveStream::Config>* receive_configs,
-        VideoEncoderConfig* encoder_config) override {
-      encoder_config->video_stream_factory =
-          new rtc::RefCountedObject<VideoStreamFactory>();
-      video_encoder_config_all_streams_ = encoder_config->Copy();
-      if (send_single_ssrc_first_)
-        encoder_config->number_of_streams = 1;
-    }
-
-    void OnVideoStreamsCreated(
-        VideoSendStream* send_stream,
-        const std::vector<VideoReceiveStream*>& receive_streams) override {
-      send_stream_ = send_stream;
-    }
-
-    void PerformTest() override {
-      EXPECT_TRUE(Wait()) << "Timed out while waiting for "
-                          << (send_single_ssrc_first_ ? "first SSRC."
-                                                      : "SSRCs.");
-
-      if (send_single_ssrc_first_) {
-        // Set full simulcast and continue with the rest of the SSRCs.
-        send_stream_->ReconfigureVideoEncoder(
-            std::move(video_encoder_config_all_streams_));
-        EXPECT_TRUE(Wait()) << "Timed out while waiting on additional SSRCs.";
-      }
-    }
-
-   private:
-    std::map<uint32_t, bool> valid_ssrcs_;
-    std::map<uint32_t, bool> is_observed_;
-
-    const size_t num_ssrcs_;
-    const bool send_single_ssrc_first_;
-
-    size_t ssrcs_to_observe_;
-    bool expect_single_ssrc_;
-
-    VideoSendStream* send_stream_;
-    VideoEncoderConfig video_encoder_config_all_streams_;
-  } test(kVideoSendSsrcs, num_ssrcs, send_single_ssrc_first);
-
-  RunBaseTest(&test);
-}
-
-TEST_F(EndToEndTest, ReportsSetEncoderRates) {
-  class EncoderRateStatsTest : public test::EndToEndTest,
-                               public test::FakeEncoder {
-   public:
-    explicit EncoderRateStatsTest(
-        test::SingleThreadedTaskQueueForTesting* task_queue)
-        : EndToEndTest(kDefaultTimeoutMs),
-          FakeEncoder(Clock::GetRealTimeClock()),
-          task_queue_(task_queue),
-          send_stream_(nullptr),
-          bitrate_kbps_(0) {}
-
-    void OnVideoStreamsCreated(
-        VideoSendStream* send_stream,
-        const std::vector<VideoReceiveStream*>& receive_streams) override {
-      send_stream_ = send_stream;
-    }
-
-    void ModifyVideoConfigs(
-        VideoSendStream::Config* send_config,
-        std::vector<VideoReceiveStream::Config>* receive_configs,
-        VideoEncoderConfig* encoder_config) override {
-      send_config->encoder_settings.encoder = this;
-      RTC_DCHECK_EQ(1, encoder_config->number_of_streams);
-    }
-
-    int32_t SetRateAllocation(const BitrateAllocation& rate_allocation,
-                              uint32_t framerate) override {
-      // Make sure not to trigger on any default zero bitrates.
-      if (rate_allocation.get_sum_bps() == 0)
-        return 0;
-      rtc::CritScope lock(&crit_);
-      bitrate_kbps_ = rate_allocation.get_sum_kbps();
-      observation_complete_.Set();
-      return 0;
-    }
-
-    void PerformTest() override {
-      ASSERT_TRUE(Wait())
-          << "Timed out while waiting for encoder SetRates() call.";
-
-      task_queue_->SendTask([this]() {
-        WaitForEncoderTargetBitrateMatchStats();
-        send_stream_->Stop();
-        WaitForStatsReportZeroTargetBitrate();
-        send_stream_->Start();
-        WaitForEncoderTargetBitrateMatchStats();
-      });
-    }
-
-    void WaitForEncoderTargetBitrateMatchStats() {
-      for (int i = 0; i < kDefaultTimeoutMs; ++i) {
-        VideoSendStream::Stats stats = send_stream_->GetStats();
-        {
-          rtc::CritScope lock(&crit_);
-          if ((stats.target_media_bitrate_bps + 500) / 1000 ==
-              static_cast<int>(bitrate_kbps_)) {
-            return;
-          }
-        }
-        SleepMs(1);
-      }
-      FAIL()
-          << "Timed out waiting for stats reporting the currently set bitrate.";
-    }
-
-    void WaitForStatsReportZeroTargetBitrate() {
-      for (int i = 0; i < kDefaultTimeoutMs; ++i) {
-        if (send_stream_->GetStats().target_media_bitrate_bps == 0) {
-          return;
-        }
-        SleepMs(1);
-      }
-      FAIL() << "Timed out waiting for stats reporting zero bitrate.";
-    }
-
-   private:
-    test::SingleThreadedTaskQueueForTesting* const task_queue_;
-    rtc::CriticalSection crit_;
-    VideoSendStream* send_stream_;
-    uint32_t bitrate_kbps_ RTC_GUARDED_BY(crit_);
-  } test(&task_queue_);
-
-  RunBaseTest(&test);
-}
-
-TEST_F(EndToEndTest, GetStats) {
-  static const int kStartBitrateBps = 3000000;
-  static const int kExpectedRenderDelayMs = 20;
-
-  class ReceiveStreamRenderer : public rtc::VideoSinkInterface<VideoFrame> {
-   public:
-    ReceiveStreamRenderer() {}
-
-   private:
-    void OnFrame(const VideoFrame& video_frame) override {}
-  };
-
-  class StatsObserver : public test::EndToEndTest,
-                        public rtc::VideoSinkInterface<VideoFrame> {
-   public:
-    StatsObserver()
-        : EndToEndTest(kLongTimeoutMs),
-          encoder_(Clock::GetRealTimeClock(), 10),
-          send_stream_(nullptr),
-          expected_send_ssrcs_(),
-          check_stats_event_(false, false) {}
-
-   private:
-    Action OnSendRtp(const uint8_t* packet, size_t length) override {
-      // Drop every 25th packet => 4% loss.
-      static const int kPacketLossFrac = 25;
-      RTPHeader header;
-      RtpUtility::RtpHeaderParser parser(packet, length);
-      if (parser.Parse(&header) &&
-          expected_send_ssrcs_.find(header.ssrc) !=
-              expected_send_ssrcs_.end() &&
-          header.sequenceNumber % kPacketLossFrac == 0) {
-        return DROP_PACKET;
-      }
-      check_stats_event_.Set();
-      return SEND_PACKET;
-    }
-
-    Action OnSendRtcp(const uint8_t* packet, size_t length) override {
-      check_stats_event_.Set();
-      return SEND_PACKET;
-    }
-
-    Action OnReceiveRtp(const uint8_t* packet, size_t length) override {
-      check_stats_event_.Set();
-      return SEND_PACKET;
-    }
-
-    Action OnReceiveRtcp(const uint8_t* packet, size_t length) override {
-      check_stats_event_.Set();
-      return SEND_PACKET;
-    }
-
-    void OnFrame(const VideoFrame& video_frame) override {
-      // Ensure that we have at least 5ms send side delay.
-      SleepMs(5);
-    }
-
-    bool CheckReceiveStats() {
-      for (size_t i = 0; i < receive_streams_.size(); ++i) {
-        VideoReceiveStream::Stats stats = receive_streams_[i]->GetStats();
-        EXPECT_EQ(expected_receive_ssrcs_[i], stats.ssrc);
-
-        // Make sure all fields have been populated.
-        // TODO(pbos): Use CompoundKey if/when we ever know that all stats are
-        // always filled for all receivers.
-        receive_stats_filled_["IncomingRate"] |=
-            stats.network_frame_rate != 0 || stats.total_bitrate_bps != 0;
-
-        send_stats_filled_["DecoderImplementationName"] |=
-            stats.decoder_implementation_name ==
-            test::FakeDecoder::kImplementationName;
-        receive_stats_filled_["RenderDelayAsHighAsExpected"] |=
-            stats.render_delay_ms >= kExpectedRenderDelayMs;
-
-        receive_stats_filled_["FrameCallback"] |= stats.decode_frame_rate != 0;
-
-        receive_stats_filled_["FrameRendered"] |= stats.render_frame_rate != 0;
-
-        receive_stats_filled_["StatisticsUpdated"] |=
-            stats.rtcp_stats.packets_lost != 0 ||
-            stats.rtcp_stats.extended_highest_sequence_number != 0 ||
-            stats.rtcp_stats.fraction_lost != 0 || stats.rtcp_stats.jitter != 0;
-
-        receive_stats_filled_["DataCountersUpdated"] |=
-            stats.rtp_stats.transmitted.payload_bytes != 0 ||
-            stats.rtp_stats.fec.packets != 0 ||
-            stats.rtp_stats.transmitted.header_bytes != 0 ||
-            stats.rtp_stats.transmitted.packets != 0 ||
-            stats.rtp_stats.transmitted.padding_bytes != 0 ||
-            stats.rtp_stats.retransmitted.packets != 0;
-
-        receive_stats_filled_["CodecStats"] |=
-            stats.target_delay_ms != 0 || stats.discarded_packets != 0;
-
-        receive_stats_filled_["FrameCounts"] |=
-            stats.frame_counts.key_frames != 0 ||
-            stats.frame_counts.delta_frames != 0;
-
-        receive_stats_filled_["CName"] |= !stats.c_name.empty();
-
-        receive_stats_filled_["RtcpPacketTypeCount"] |=
-            stats.rtcp_packet_type_counts.fir_packets != 0 ||
-            stats.rtcp_packet_type_counts.nack_packets != 0 ||
-            stats.rtcp_packet_type_counts.pli_packets != 0 ||
-            stats.rtcp_packet_type_counts.nack_requests != 0 ||
-            stats.rtcp_packet_type_counts.unique_nack_requests != 0;
-
-        assert(stats.current_payload_type == -1 ||
-               stats.current_payload_type == kFakeVideoSendPayloadType);
-        receive_stats_filled_["IncomingPayloadType"] |=
-            stats.current_payload_type == kFakeVideoSendPayloadType;
-      }
-
-      return AllStatsFilled(receive_stats_filled_);
-    }
-
-    bool CheckSendStats() {
-      RTC_DCHECK(send_stream_);
-      VideoSendStream::Stats stats = send_stream_->GetStats();
-
-      size_t expected_num_streams = kNumSsrcs + expected_send_ssrcs_.size();
-      send_stats_filled_["NumStreams"] |=
-          stats.substreams.size() == expected_num_streams;
-
-      send_stats_filled_["CpuOveruseMetrics"] |=
-          stats.avg_encode_time_ms != 0 && stats.encode_usage_percent != 0;
-
-      send_stats_filled_["EncoderImplementationName"] |=
-          stats.encoder_implementation_name ==
-          test::FakeEncoder::kImplementationName;
-
-      send_stats_filled_["EncoderPreferredBitrate"] |=
-          stats.preferred_media_bitrate_bps > 0;
-
-      for (std::map<uint32_t, VideoSendStream::StreamStats>::const_iterator it =
-               stats.substreams.begin();
-           it != stats.substreams.end(); ++it) {
-        if (expected_send_ssrcs_.find(it->first) == expected_send_ssrcs_.end())
-          continue;  // Probably RTX.
-
-        send_stats_filled_[CompoundKey("CapturedFrameRate", it->first)] |=
-            stats.input_frame_rate != 0;
-
-        const VideoSendStream::StreamStats& stream_stats = it->second;
-
-        send_stats_filled_[CompoundKey("StatisticsUpdated", it->first)] |=
-            stream_stats.rtcp_stats.packets_lost != 0 ||
-            stream_stats.rtcp_stats.extended_highest_sequence_number != 0 ||
-            stream_stats.rtcp_stats.fraction_lost != 0;
-
-        send_stats_filled_[CompoundKey("DataCountersUpdated", it->first)] |=
-            stream_stats.rtp_stats.fec.packets != 0 ||
-            stream_stats.rtp_stats.transmitted.padding_bytes != 0 ||
-            stream_stats.rtp_stats.retransmitted.packets != 0 ||
-            stream_stats.rtp_stats.transmitted.packets != 0;
-
-        send_stats_filled_[CompoundKey("BitrateStatisticsObserver.Total",
-                                       it->first)] |=
-            stream_stats.total_bitrate_bps != 0;
-
-        send_stats_filled_[CompoundKey("BitrateStatisticsObserver.Retransmit",
-                                       it->first)] |=
-            stream_stats.retransmit_bitrate_bps != 0;
-
-        send_stats_filled_[CompoundKey("FrameCountObserver", it->first)] |=
-            stream_stats.frame_counts.delta_frames != 0 ||
-            stream_stats.frame_counts.key_frames != 0;
-
-        send_stats_filled_[CompoundKey("OutgoingRate", it->first)] |=
-            stats.encode_frame_rate != 0;
-
-        send_stats_filled_[CompoundKey("Delay", it->first)] |=
-            stream_stats.avg_delay_ms != 0 || stream_stats.max_delay_ms != 0;
-
-        // TODO(pbos): Use CompoundKey when the test makes sure that all SSRCs
-        // report dropped packets.
-        send_stats_filled_["RtcpPacketTypeCount"] |=
-            stream_stats.rtcp_packet_type_counts.fir_packets != 0 ||
-            stream_stats.rtcp_packet_type_counts.nack_packets != 0 ||
-            stream_stats.rtcp_packet_type_counts.pli_packets != 0 ||
-            stream_stats.rtcp_packet_type_counts.nack_requests != 0 ||
-            stream_stats.rtcp_packet_type_counts.unique_nack_requests != 0;
-      }
-
-      return AllStatsFilled(send_stats_filled_);
-    }
-
-    std::string CompoundKey(const char* name, uint32_t ssrc) {
-      std::ostringstream oss;
-      oss << name << "_" << ssrc;
-      return oss.str();
-    }
-
-    bool AllStatsFilled(const std::map<std::string, bool>& stats_map) {
-      for (const auto& stat : stats_map) {
-        if (!stat.second)
-          return false;
-      }
-      return true;
-    }
-
-    test::PacketTransport* CreateSendTransport(
-        test::SingleThreadedTaskQueueForTesting* task_queue,
-        Call* sender_call) override {
-      FakeNetworkPipe::Config network_config;
-      network_config.loss_percent = 5;
-      return new test::PacketTransport(task_queue, sender_call, this,
-                                       test::PacketTransport::kSender,
-                                       payload_type_map_, network_config);
-    }
-
-    Call::Config GetSenderCallConfig() override {
-      Call::Config config = EndToEndTest::GetSenderCallConfig();
-      config.bitrate_config.start_bitrate_bps = kStartBitrateBps;
-      return config;
-    }
-
-    // This test use other VideoStream settings than the the default settings
-    // implemented in DefaultVideoStreamFactory. Therefore  this test implement
-    // its own VideoEncoderConfig::VideoStreamFactoryInterface which is created
-    // in ModifyVideoConfigs.
-    class VideoStreamFactory
-        : public VideoEncoderConfig::VideoStreamFactoryInterface {
-     public:
-      VideoStreamFactory() {}
-
-     private:
-      std::vector<VideoStream> CreateEncoderStreams(
-          int width,
-          int height,
-          const VideoEncoderConfig& encoder_config) override {
-        std::vector<VideoStream> streams =
-            test::CreateVideoStreams(width, height, encoder_config);
-        // Set low simulcast bitrates to not have to wait for bandwidth ramp-up.
-        for (size_t i = 0; i < encoder_config.number_of_streams; ++i) {
-          streams[i].min_bitrate_bps = 10000;
-          streams[i].target_bitrate_bps = 15000;
-          streams[i].max_bitrate_bps = 20000;
-        }
-        return streams;
-      }
-    };
-
-    void ModifyVideoConfigs(
-        VideoSendStream::Config* send_config,
-        std::vector<VideoReceiveStream::Config>* receive_configs,
-        VideoEncoderConfig* encoder_config) override {
-      encoder_config->video_stream_factory =
-          new rtc::RefCountedObject<VideoStreamFactory>();
-      send_config->pre_encode_callback = this;  // Used to inject delay.
-      expected_cname_ = send_config->rtp.c_name = "SomeCName";
-
-      send_config->rtp.nack.rtp_history_ms = kNackRtpHistoryMs;
-      send_config->rtp.rtx.payload_type = kSendRtxPayloadType;
-
-      const std::vector<uint32_t>& ssrcs = send_config->rtp.ssrcs;
-      for (size_t i = 0; i < ssrcs.size(); ++i) {
-        expected_send_ssrcs_.insert(ssrcs[i]);
-        expected_receive_ssrcs_.push_back(
-            (*receive_configs)[i].rtp.remote_ssrc);
-        (*receive_configs)[i].render_delay_ms = kExpectedRenderDelayMs;
-        (*receive_configs)[i].renderer = &receive_stream_renderer_;
-        (*receive_configs)[i].rtp.nack.rtp_history_ms = kNackRtpHistoryMs;
-
-        (*receive_configs)[i].rtp.rtx_ssrc = kSendRtxSsrcs[i];
-        (*receive_configs)[i]
-            .rtp.rtx_associated_payload_types[kSendRtxPayloadType] =
-            kFakeVideoSendPayloadType;
-      }
-
-      for (size_t i = 0; i < kNumSsrcs; ++i)
-        send_config->rtp.rtx.ssrcs.push_back(kSendRtxSsrcs[i]);
-
-      // Use a delayed encoder to make sure we see CpuOveruseMetrics stats that
-      // are non-zero.
-      send_config->encoder_settings.encoder = &encoder_;
-    }
-
-    size_t GetNumVideoStreams() const override { return kNumSsrcs; }
-
-    void OnVideoStreamsCreated(
-        VideoSendStream* send_stream,
-        const std::vector<VideoReceiveStream*>& receive_streams) override {
-      send_stream_ = send_stream;
-      receive_streams_ = receive_streams;
-    }
-
-    void PerformTest() override {
-      Clock* clock = Clock::GetRealTimeClock();
-      int64_t now = clock->TimeInMilliseconds();
-      int64_t stop_time = now + test::CallTest::kLongTimeoutMs;
-      bool receive_ok = false;
-      bool send_ok = false;
-
-      while (now < stop_time) {
-        if (!receive_ok)
-          receive_ok = CheckReceiveStats();
-        if (!send_ok)
-          send_ok = CheckSendStats();
-
-        if (receive_ok && send_ok)
-          return;
-
-        int64_t time_until_timout_ = stop_time - now;
-        if (time_until_timout_ > 0)
-          check_stats_event_.Wait(time_until_timout_);
-        now = clock->TimeInMilliseconds();
-      }
-
-      ADD_FAILURE() << "Timed out waiting for filled stats.";
-      for (std::map<std::string, bool>::const_iterator it =
-               receive_stats_filled_.begin();
-           it != receive_stats_filled_.end(); ++it) {
-        if (!it->second) {
-          ADD_FAILURE() << "Missing receive stats: " << it->first;
-        }
-      }
-
-      for (std::map<std::string, bool>::const_iterator it =
-               send_stats_filled_.begin();
-           it != send_stats_filled_.end(); ++it) {
-        if (!it->second) {
-          ADD_FAILURE() << "Missing send stats: " << it->first;
-        }
-      }
-    }
-
-    test::DelayedEncoder encoder_;
-    std::vector<VideoReceiveStream*> receive_streams_;
-    std::map<std::string, bool> receive_stats_filled_;
-
-    VideoSendStream* send_stream_;
-    std::map<std::string, bool> send_stats_filled_;
-
-    std::vector<uint32_t> expected_receive_ssrcs_;
-    std::set<uint32_t> expected_send_ssrcs_;
-    std::string expected_cname_;
-
-    rtc::Event check_stats_event_;
-    ReceiveStreamRenderer receive_stream_renderer_;
-  } test;
-
-  RunBaseTest(&test);
-}
-
-TEST_F(EndToEndTest, TimingFramesAreReported) {
-  static const int kExtensionId = 5;
-
-  class StatsObserver : public test::EndToEndTest {
-   public:
-    StatsObserver() : EndToEndTest(kLongTimeoutMs) {}
-
-   private:
-    void ModifyVideoConfigs(
-        VideoSendStream::Config* send_config,
-        std::vector<VideoReceiveStream::Config>* receive_configs,
-        VideoEncoderConfig* encoder_config) override {
-      send_config->rtp.extensions.clear();
-      send_config->rtp.extensions.push_back(
-          RtpExtension(RtpExtension::kVideoTimingUri, kExtensionId));
-      for (size_t i = 0; i < receive_configs->size(); ++i) {
-        (*receive_configs)[i].rtp.extensions.clear();
-        (*receive_configs)[i].rtp.extensions.push_back(
-            RtpExtension(RtpExtension::kVideoTimingUri, kExtensionId));
-      }
-    }
-
-    void OnVideoStreamsCreated(
-        VideoSendStream* send_stream,
-        const std::vector<VideoReceiveStream*>& receive_streams) override {
-      receive_streams_ = receive_streams;
-    }
-
-    void PerformTest() override {
-      // No frames reported initially.
-      for (size_t i = 0; i < receive_streams_.size(); ++i) {
-        EXPECT_FALSE(receive_streams_[i]->GetStats().timing_frame_info);
-      }
-      // Wait for at least one timing frame to be sent with 100ms grace period.
-      SleepMs(kDefaultTimingFramesDelayMs + 100);
-      // Check that timing frames are reported for each stream.
-      for (size_t i = 0; i < receive_streams_.size(); ++i) {
-        EXPECT_TRUE(receive_streams_[i]->GetStats().timing_frame_info);
-      }
-    }
-
-    std::vector<VideoReceiveStream*> receive_streams_;
-  } test;
-
-  RunBaseTest(&test);
-}
-
-class RtcpXrObserver : public test::EndToEndTest {
- public:
-  RtcpXrObserver(bool enable_rrtr, bool enable_target_bitrate)
-      : EndToEndTest(test::CallTest::kDefaultTimeoutMs),
-        enable_rrtr_(enable_rrtr),
-        enable_target_bitrate_(enable_target_bitrate),
-        sent_rtcp_sr_(0),
-        sent_rtcp_rr_(0),
-        sent_rtcp_rrtr_(0),
-        sent_rtcp_target_bitrate_(false),
-        sent_rtcp_dlrr_(0) {}
-
- private:
-  // Receive stream should send RR packets (and RRTR packets if enabled).
-  Action OnReceiveRtcp(const uint8_t* packet, size_t length) override {
-    rtc::CritScope lock(&crit_);
-    test::RtcpPacketParser parser;
-    EXPECT_TRUE(parser.Parse(packet, length));
-
-    sent_rtcp_rr_ += parser.receiver_report()->num_packets();
-    EXPECT_EQ(0, parser.sender_report()->num_packets());
-    EXPECT_GE(1, parser.xr()->num_packets());
-    if (parser.xr()->num_packets() > 0) {
-      if (parser.xr()->rrtr())
-        ++sent_rtcp_rrtr_;
-      EXPECT_FALSE(parser.xr()->dlrr());
-    }
-
-    return SEND_PACKET;
-  }
-  // Send stream should send SR packets (and DLRR packets if enabled).
-  Action OnSendRtcp(const uint8_t* packet, size_t length) override {
-    rtc::CritScope lock(&crit_);
-    test::RtcpPacketParser parser;
-    EXPECT_TRUE(parser.Parse(packet, length));
-
-    sent_rtcp_sr_ += parser.sender_report()->num_packets();
-    EXPECT_LE(parser.xr()->num_packets(), 1);
-    if (parser.xr()->num_packets() > 0) {
-      EXPECT_FALSE(parser.xr()->rrtr());
-      if (parser.xr()->dlrr())
-        ++sent_rtcp_dlrr_;
-      if (parser.xr()->target_bitrate())
-        sent_rtcp_target_bitrate_ = true;
-    }
-
-    if (sent_rtcp_sr_ > kNumRtcpReportPacketsToObserve &&
-        sent_rtcp_rr_ > kNumRtcpReportPacketsToObserve &&
-        (sent_rtcp_target_bitrate_ || !enable_target_bitrate_)) {
-      if (enable_rrtr_) {
-        EXPECT_GT(sent_rtcp_rrtr_, 0);
-        EXPECT_GT(sent_rtcp_dlrr_, 0);
-      } else {
-        EXPECT_EQ(sent_rtcp_rrtr_, 0);
-        EXPECT_EQ(sent_rtcp_dlrr_, 0);
-      }
-      EXPECT_EQ(enable_target_bitrate_, sent_rtcp_target_bitrate_);
-      observation_complete_.Set();
-    }
-    return SEND_PACKET;
-  }
-
-  void ModifyVideoConfigs(
-      VideoSendStream::Config* send_config,
-      std::vector<VideoReceiveStream::Config>* receive_configs,
-      VideoEncoderConfig* encoder_config) override {
-    if (enable_target_bitrate_) {
-      // TargetBitrate only signaled for screensharing.
-      encoder_config->content_type = VideoEncoderConfig::ContentType::kScreen;
-    }
-    (*receive_configs)[0].rtp.rtcp_mode = RtcpMode::kReducedSize;
-    (*receive_configs)[0].rtp.rtcp_xr.receiver_reference_time_report =
-        enable_rrtr_;
-  }
-
-  void PerformTest() override {
-    EXPECT_TRUE(Wait())
-        << "Timed out while waiting for RTCP SR/RR packets to be sent.";
-  }
-
-  static const int kNumRtcpReportPacketsToObserve = 5;
-
-  rtc::CriticalSection crit_;
-  const bool enable_rrtr_;
-  const bool enable_target_bitrate_;
-  int sent_rtcp_sr_;
-  int sent_rtcp_rr_ RTC_GUARDED_BY(&crit_);
-  int sent_rtcp_rrtr_ RTC_GUARDED_BY(&crit_);
-  bool sent_rtcp_target_bitrate_ RTC_GUARDED_BY(&crit_);
-  int sent_rtcp_dlrr_;
-};
-
-TEST_F(EndToEndTest, TestExtendedReportsWithRrtrWithoutTargetBitrate) {
-  RtcpXrObserver test(true, false);
-  RunBaseTest(&test);
-}
-
-TEST_F(EndToEndTest, TestExtendedReportsWithoutRrtrWithoutTargetBitrate) {
-  RtcpXrObserver test(false, false);
-  RunBaseTest(&test);
-}
-
-TEST_F(EndToEndTest, TestExtendedReportsWithRrtrWithTargetBitrate) {
-  RtcpXrObserver test(true, true);
-  RunBaseTest(&test);
-}
-
-TEST_F(EndToEndTest, TestExtendedReportsWithoutRrtrWithTargetBitrate) {
-  RtcpXrObserver test(false, true);
-  RunBaseTest(&test);
-}
-
-TEST_F(EndToEndTest, TestReceivedRtpPacketStats) {
-  static const size_t kNumRtpPacketsToSend = 5;
-  class ReceivedRtpStatsObserver : public test::EndToEndTest {
-   public:
-    ReceivedRtpStatsObserver()
-        : EndToEndTest(kDefaultTimeoutMs),
-          receive_stream_(nullptr),
-          sent_rtp_(0) {}
-
-   private:
-    void OnVideoStreamsCreated(
-        VideoSendStream* send_stream,
-        const std::vector<VideoReceiveStream*>& receive_streams) override {
-      receive_stream_ = receive_streams[0];
-    }
-
-    Action OnSendRtp(const uint8_t* packet, size_t length) override {
-      if (sent_rtp_ >= kNumRtpPacketsToSend) {
-        VideoReceiveStream::Stats stats = receive_stream_->GetStats();
-        if (kNumRtpPacketsToSend == stats.rtp_stats.transmitted.packets) {
-          observation_complete_.Set();
-        }
-        return DROP_PACKET;
-      }
-      ++sent_rtp_;
-      return SEND_PACKET;
-    }
-
-    void PerformTest() override {
-      EXPECT_TRUE(Wait())
-          << "Timed out while verifying number of received RTP packets.";
-    }
-
-    VideoReceiveStream* receive_stream_;
-    uint32_t sent_rtp_;
-  } test;
-
-  RunBaseTest(&test);
-}
-
-TEST_F(EndToEndTest, SendsSetSsrc) {
-  TestSendsSetSsrcs(1, false);
-}
-
-TEST_F(EndToEndTest, SendsSetSimulcastSsrcs) {
-  TestSendsSetSsrcs(kNumSsrcs, false);
-}
-
-TEST_F(EndToEndTest, CanSwitchToUseAllSsrcs) {
-  TestSendsSetSsrcs(kNumSsrcs, true);
-}
-
-TEST_F(EndToEndTest, DISABLED_RedundantPayloadsTransmittedOnAllSsrcs) {
-  class ObserveRedundantPayloads: public test::EndToEndTest {
-   public:
-    ObserveRedundantPayloads()
-        : EndToEndTest(kDefaultTimeoutMs), ssrcs_to_observe_(kNumSsrcs) {
-          for (size_t i = 0; i < kNumSsrcs; ++i) {
-            registered_rtx_ssrc_[kSendRtxSsrcs[i]] = true;
-          }
-        }
-
-   private:
-    Action OnSendRtp(const uint8_t* packet, size_t length) override {
-      RTPHeader header;
-      EXPECT_TRUE(parser_->Parse(packet, length, &header));
-
-      if (!registered_rtx_ssrc_[header.ssrc])
-        return SEND_PACKET;
-
-      EXPECT_LE(header.headerLength + header.paddingLength, length);
-      const bool packet_is_redundant_payload =
-          header.headerLength + header.paddingLength < length;
-
-      if (!packet_is_redundant_payload)
-        return SEND_PACKET;
-
-      if (!observed_redundant_retransmission_[header.ssrc]) {
-        observed_redundant_retransmission_[header.ssrc] = true;
-        if (--ssrcs_to_observe_ == 0)
-          observation_complete_.Set();
-      }
-
-      return SEND_PACKET;
-    }
-
-    size_t GetNumVideoStreams() const override { return kNumSsrcs; }
-
-    // This test use other VideoStream settings than the the default settings
-    // implemented in DefaultVideoStreamFactory. Therefore  this test implement
-    // its own VideoEncoderConfig::VideoStreamFactoryInterface which is created
-    // in ModifyVideoConfigs.
-    class VideoStreamFactory
-        : public VideoEncoderConfig::VideoStreamFactoryInterface {
-     public:
-      VideoStreamFactory() {}
-
-     private:
-      std::vector<VideoStream> CreateEncoderStreams(
-          int width,
-          int height,
-          const VideoEncoderConfig& encoder_config) override {
-        std::vector<VideoStream> streams =
-            test::CreateVideoStreams(width, height, encoder_config);
-        // Set low simulcast bitrates to not have to wait for bandwidth ramp-up.
-        for (size_t i = 0; i < encoder_config.number_of_streams; ++i) {
-          streams[i].min_bitrate_bps = 10000;
-          streams[i].target_bitrate_bps = 15000;
-          streams[i].max_bitrate_bps = 20000;
-        }
-        return streams;
-      }
-    };
-
-    void ModifyVideoConfigs(
-        VideoSendStream::Config* send_config,
-        std::vector<VideoReceiveStream::Config>* receive_configs,
-        VideoEncoderConfig* encoder_config) override {
-      // Set low simulcast bitrates to not have to wait for bandwidth ramp-up.
-      encoder_config->video_stream_factory =
-          new rtc::RefCountedObject<VideoStreamFactory>();
-      send_config->rtp.rtx.payload_type = kSendRtxPayloadType;
-
-      for (size_t i = 0; i < kNumSsrcs; ++i)
-        send_config->rtp.rtx.ssrcs.push_back(kSendRtxSsrcs[i]);
-
-      // Significantly higher than max bitrates for all video streams -> forcing
-      // padding to trigger redundant padding on all RTX SSRCs.
-      encoder_config->min_transmit_bitrate_bps = 100000;
-    }
-
-    void PerformTest() override {
-      EXPECT_TRUE(Wait())
-          << "Timed out while waiting for redundant payloads on all SSRCs.";
-    }
-
-   private:
-    size_t ssrcs_to_observe_;
-    std::map<uint32_t, bool> observed_redundant_retransmission_;
-    std::map<uint32_t, bool> registered_rtx_ssrc_;
-  } test;
-
-  RunBaseTest(&test);
-}
-
-void EndToEndTest::TestRtpStatePreservation(bool use_rtx,
-                                            bool provoke_rtcpsr_before_rtp) {
-  // This test uses other VideoStream settings than the the default settings
-  // implemented in DefaultVideoStreamFactory. Therefore this test implements
-  // its own VideoEncoderConfig::VideoStreamFactoryInterface which is created
-  // in ModifyVideoConfigs.
-  class VideoStreamFactory
-      : public VideoEncoderConfig::VideoStreamFactoryInterface {
-   public:
-    VideoStreamFactory() {}
-
-   private:
-    std::vector<VideoStream> CreateEncoderStreams(
-        int width,
-        int height,
-        const VideoEncoderConfig& encoder_config) override {
-      std::vector<VideoStream> streams =
-          test::CreateVideoStreams(width, height, encoder_config);
-
-      if (encoder_config.number_of_streams > 1) {
-        // Lower bitrates so that all streams send initially.
-        RTC_DCHECK_EQ(3, encoder_config.number_of_streams);
-        for (size_t i = 0; i < encoder_config.number_of_streams; ++i) {
-          streams[i].min_bitrate_bps = 10000;
-          streams[i].target_bitrate_bps = 15000;
-          streams[i].max_bitrate_bps = 20000;
-        }
-      } else {
-        // Use the same total bitrates when sending a single stream to avoid
-        // lowering
-        // the bitrate estimate and requiring a subsequent rampup.
-        streams[0].min_bitrate_bps = 3 * 10000;
-        streams[0].target_bitrate_bps = 3 * 15000;
-        streams[0].max_bitrate_bps = 3 * 20000;
-      }
-      return streams;
-    }
-  };
-
-  class RtpSequenceObserver : public test::RtpRtcpObserver {
-   public:
-    explicit RtpSequenceObserver(bool use_rtx)
-        : test::RtpRtcpObserver(kDefaultTimeoutMs),
-          ssrcs_to_observe_(kNumSsrcs) {
-      for (size_t i = 0; i < kNumSsrcs; ++i) {
-        ssrc_is_rtx_[kVideoSendSsrcs[i]] = false;
-        if (use_rtx)
-          ssrc_is_rtx_[kSendRtxSsrcs[i]] = true;
-      }
-    }
-
-    void ResetExpectedSsrcs(size_t num_expected_ssrcs) {
-      rtc::CritScope lock(&crit_);
-      ssrc_observed_.clear();
-      ssrcs_to_observe_ = num_expected_ssrcs;
-    }
-
-   private:
-    void ValidateTimestampGap(uint32_t ssrc,
-                              uint32_t timestamp,
-                              bool only_padding)
-        RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_) {
-      static const int32_t kMaxTimestampGap = kDefaultTimeoutMs * 90;
-      auto timestamp_it = last_observed_timestamp_.find(ssrc);
-      if (timestamp_it == last_observed_timestamp_.end()) {
-        EXPECT_FALSE(only_padding);
-        last_observed_timestamp_[ssrc] = timestamp;
-      } else {
-        // Verify timestamps are reasonably close.
-        uint32_t latest_observed = timestamp_it->second;
-        // Wraparound handling is unnecessary here as long as an int variable
-        // is used to store the result.
-        int32_t timestamp_gap = timestamp - latest_observed;
-        EXPECT_LE(std::abs(timestamp_gap), kMaxTimestampGap)
-            << "Gap in timestamps (" << latest_observed << " -> " << timestamp
-            << ") too large for SSRC: " << ssrc << ".";
-        timestamp_it->second = timestamp;
-      }
-    }
-
-    Action OnSendRtp(const uint8_t* packet, size_t length) override {
-      RTPHeader header;
-      EXPECT_TRUE(parser_->Parse(packet, length, &header));
-      const uint32_t ssrc = header.ssrc;
-      const int64_t sequence_number =
-          seq_numbers_unwrapper_.Unwrap(header.sequenceNumber);
-      const uint32_t timestamp = header.timestamp;
-      const bool only_padding =
-          header.headerLength + header.paddingLength == length;
-
-      EXPECT_TRUE(ssrc_is_rtx_.find(ssrc) != ssrc_is_rtx_.end())
-          << "Received SSRC that wasn't configured: " << ssrc;
-
-      static const int64_t kMaxSequenceNumberGap = 100;
-      std::list<int64_t>* seq_numbers = &last_observed_seq_numbers_[ssrc];
-      if (seq_numbers->empty()) {
-        seq_numbers->push_back(sequence_number);
-      } else {
-        // We shouldn't get replays of previous sequence numbers.
-        for (int64_t observed : *seq_numbers) {
-          EXPECT_NE(observed, sequence_number)
-              << "Received sequence number " << sequence_number
-              << " for SSRC " << ssrc << " 2nd time.";
-        }
-        // Verify sequence numbers are reasonably close.
-        int64_t latest_observed = seq_numbers->back();
-        int64_t sequence_number_gap = sequence_number - latest_observed;
-        EXPECT_LE(std::abs(sequence_number_gap), kMaxSequenceNumberGap)
-            << "Gap in sequence numbers (" << latest_observed << " -> "
-            << sequence_number << ") too large for SSRC: " << ssrc << ".";
-        seq_numbers->push_back(sequence_number);
-        if (seq_numbers->size() >= kMaxSequenceNumberGap) {
-          seq_numbers->pop_front();
-        }
-      }
-
-      if (!ssrc_is_rtx_[ssrc]) {
-        rtc::CritScope lock(&crit_);
-        ValidateTimestampGap(ssrc, timestamp, only_padding);
-
-        // Wait for media packets on all ssrcs.
-        if (!ssrc_observed_[ssrc] && !only_padding) {
-          ssrc_observed_[ssrc] = true;
-          if (--ssrcs_to_observe_ == 0)
-            observation_complete_.Set();
-        }
-      }
-
-      return SEND_PACKET;
-    }
-
-    Action OnSendRtcp(const uint8_t* packet, size_t length) override {
-      test::RtcpPacketParser rtcp_parser;
-      rtcp_parser.Parse(packet, length);
-      if (rtcp_parser.sender_report()->num_packets() > 0) {
-        uint32_t ssrc = rtcp_parser.sender_report()->sender_ssrc();
-        uint32_t rtcp_timestamp = rtcp_parser.sender_report()->rtp_timestamp();
-
-        rtc::CritScope lock(&crit_);
-        ValidateTimestampGap(ssrc, rtcp_timestamp, false);
-      }
-      return SEND_PACKET;
-    }
-
-    SequenceNumberUnwrapper seq_numbers_unwrapper_;
-    std::map<uint32_t, std::list<int64_t>> last_observed_seq_numbers_;
-    std::map<uint32_t, uint32_t> last_observed_timestamp_;
-    std::map<uint32_t, bool> ssrc_is_rtx_;
-
-    rtc::CriticalSection crit_;
-    size_t ssrcs_to_observe_ RTC_GUARDED_BY(crit_);
-    std::map<uint32_t, bool> ssrc_observed_ RTC_GUARDED_BY(crit_);
-  } observer(use_rtx);
-
-  std::unique_ptr<test::PacketTransport> send_transport;
-  std::unique_ptr<test::PacketTransport> receive_transport;
-
-  Call::Config config(event_log_.get());
-  VideoEncoderConfig one_stream;
-
-  task_queue_.SendTask([this, &observer, &send_transport, &receive_transport,
-                        &config, &one_stream, use_rtx]() {
-    CreateCalls(config, config);
-
-    send_transport = rtc::MakeUnique<test::PacketTransport>(
-        &task_queue_, sender_call_.get(), &observer,
-        test::PacketTransport::kSender, payload_type_map_,
-        FakeNetworkPipe::Config());
-    receive_transport = rtc::MakeUnique<test::PacketTransport>(
-        &task_queue_, nullptr, &observer, test::PacketTransport::kReceiver,
-        payload_type_map_, FakeNetworkPipe::Config());
-    send_transport->SetReceiver(receiver_call_->Receiver());
-    receive_transport->SetReceiver(sender_call_->Receiver());
-
-    CreateSendConfig(kNumSsrcs, 0, 0, send_transport.get());
-
-    if (use_rtx) {
-      for (size_t i = 0; i < kNumSsrcs; ++i) {
-        video_send_config_.rtp.rtx.ssrcs.push_back(kSendRtxSsrcs[i]);
-      }
-      video_send_config_.rtp.rtx.payload_type = kSendRtxPayloadType;
-    }
-
-    video_encoder_config_.video_stream_factory =
-        new rtc::RefCountedObject<VideoStreamFactory>();
-    // Use the same total bitrates when sending a single stream to avoid
-    // lowering the bitrate estimate and requiring a subsequent rampup.
-    one_stream = video_encoder_config_.Copy();
-    // one_stream.streams.resize(1);
-    one_stream.number_of_streams = 1;
-    CreateMatchingReceiveConfigs(receive_transport.get());
-
-    CreateVideoStreams();
-    CreateFrameGeneratorCapturer(30, 1280, 720);
-
-    Start();
-  });
-
-  EXPECT_TRUE(observer.Wait())
-      << "Timed out waiting for all SSRCs to send packets.";
-
-  // Test stream resetting more than once to make sure that the state doesn't
-  // get set once (this could be due to using std::map::insert for instance).
-  for (size_t i = 0; i < 3; ++i) {
-    task_queue_.SendTask([&]() {
-      frame_generator_capturer_->Stop();
-      sender_call_->DestroyVideoSendStream(video_send_stream_);
-
-      // Re-create VideoSendStream with only one stream.
-      video_send_stream_ = sender_call_->CreateVideoSendStream(
-          video_send_config_.Copy(), one_stream.Copy());
-      video_send_stream_->Start();
-      if (provoke_rtcpsr_before_rtp) {
-        // Rapid Resync Request forces sending RTCP Sender Report back.
-        // Using this request speeds up this test because then there is no need
-        // to wait for a second for periodic Sender Report.
-        rtcp::RapidResyncRequest force_send_sr_back_request;
-        rtc::Buffer packet = force_send_sr_back_request.Build();
-        static_cast<webrtc::test::DirectTransport*>(receive_transport.get())
-            ->SendRtcp(packet.data(), packet.size());
-      }
-      CreateFrameGeneratorCapturer(30, 1280, 720);
-      frame_generator_capturer_->Start();
-    });
-
-    observer.ResetExpectedSsrcs(1);
-    EXPECT_TRUE(observer.Wait()) << "Timed out waiting for single RTP packet.";
-
-    // Reconfigure back to use all streams.
-    task_queue_.SendTask([this]() {
-      video_send_stream_->ReconfigureVideoEncoder(video_encoder_config_.Copy());
-    });
-    observer.ResetExpectedSsrcs(kNumSsrcs);
-    EXPECT_TRUE(observer.Wait())
-        << "Timed out waiting for all SSRCs to send packets.";
-
-    // Reconfigure down to one stream.
-    task_queue_.SendTask([this, &one_stream]() {
-      video_send_stream_->ReconfigureVideoEncoder(one_stream.Copy());
-    });
-    observer.ResetExpectedSsrcs(1);
-    EXPECT_TRUE(observer.Wait()) << "Timed out waiting for single RTP packet.";
-
-    // Reconfigure back to use all streams.
-    task_queue_.SendTask([this]() {
-      video_send_stream_->ReconfigureVideoEncoder(video_encoder_config_.Copy());
-    });
-    observer.ResetExpectedSsrcs(kNumSsrcs);
-    EXPECT_TRUE(observer.Wait())
-        << "Timed out waiting for all SSRCs to send packets.";
-  }
-
-  task_queue_.SendTask([this, &send_transport, &receive_transport]() {
-    Stop();
-    DestroyStreams();
-    send_transport.reset();
-    receive_transport.reset();
-    DestroyCalls();
-  });
-}
-
-TEST_F(EndToEndTest, RestartingSendStreamPreservesRtpState) {
-  TestRtpStatePreservation(false, false);
-}
-
-TEST_F(EndToEndTest, RestartingSendStreamPreservesRtpStatesWithRtx) {
-  TestRtpStatePreservation(true, false);
-}
-
-TEST_F(EndToEndTest, RestartingSendStreamKeepsRtpAndRtcpTimestampsSynced) {
-  TestRtpStatePreservation(true, true);
-}
-
-// This test is flaky on linux_memcheck. Disable on all linux bots until
-// flakyness has been fixed.
-// https://bugs.chromium.org/p/webrtc/issues/detail?id=7737
-#if defined(WEBRTC_LINUX)
-#define MAYBE_TestFlexfecRtpStatePreservation \
-  DISABLED_TestFlexfecRtpStatePreservation
-#else
-#define MAYBE_TestFlexfecRtpStatePreservation TestFlexfecRtpStatePreservation
-#endif
-TEST_F(EndToEndTest, MAYBE_TestFlexfecRtpStatePreservation) {
-  class RtpSequenceObserver : public test::RtpRtcpObserver {
-   public:
-    RtpSequenceObserver()
-        : test::RtpRtcpObserver(kDefaultTimeoutMs),
-          num_flexfec_packets_sent_(0) {}
-
-    void ResetPacketCount() {
-      rtc::CritScope lock(&crit_);
-      num_flexfec_packets_sent_ = 0;
-    }
-
-   private:
-    Action OnSendRtp(const uint8_t* packet, size_t length) override {
-      rtc::CritScope lock(&crit_);
-
-      RTPHeader header;
-      EXPECT_TRUE(parser_->Parse(packet, length, &header));
-      const uint16_t sequence_number = header.sequenceNumber;
-      const uint32_t timestamp = header.timestamp;
-      const uint32_t ssrc = header.ssrc;
-
-      if (ssrc == kVideoSendSsrcs[0] || ssrc == kSendRtxSsrcs[0]) {
-        return SEND_PACKET;
-      }
-      EXPECT_EQ(kFlexfecSendSsrc, ssrc) << "Unknown SSRC sent.";
-
-      ++num_flexfec_packets_sent_;
-
-      // If this is the first packet, we have nothing to compare to.
-      if (!last_observed_sequence_number_) {
-        last_observed_sequence_number_.emplace(sequence_number);
-        last_observed_timestamp_.emplace(timestamp);
-
-        return SEND_PACKET;
-      }
-
-      // Verify continuity and monotonicity of RTP sequence numbers.
-      EXPECT_EQ(static_cast<uint16_t>(*last_observed_sequence_number_ + 1),
-                sequence_number);
-      last_observed_sequence_number_.emplace(sequence_number);
-
-      // Timestamps should be non-decreasing...
-      const bool timestamp_is_same_or_newer =
-          timestamp == *last_observed_timestamp_ ||
-          IsNewerTimestamp(timestamp, *last_observed_timestamp_);
-      EXPECT_TRUE(timestamp_is_same_or_newer);
-      // ...but reasonably close in time.
-      const int k10SecondsInRtpTimestampBase = 10 * kVideoPayloadTypeFrequency;
-      EXPECT_TRUE(IsNewerTimestamp(
-          *last_observed_timestamp_ + k10SecondsInRtpTimestampBase, timestamp));
-      last_observed_timestamp_.emplace(timestamp);
-
-      // Pass test when enough packets have been let through.
-      if (num_flexfec_packets_sent_ >= 10) {
-        observation_complete_.Set();
-      }
-
-      return SEND_PACKET;
-    }
-
-    rtc::Optional<uint16_t> last_observed_sequence_number_
-        RTC_GUARDED_BY(crit_);
-    rtc::Optional<uint32_t> last_observed_timestamp_ RTC_GUARDED_BY(crit_);
-    size_t num_flexfec_packets_sent_ RTC_GUARDED_BY(crit_);
-    rtc::CriticalSection crit_;
-  } observer;
-
-  static constexpr int kFrameMaxWidth = 320;
-  static constexpr int kFrameMaxHeight = 180;
-  static constexpr int kFrameRate = 15;
-
-  Call::Config config(event_log_.get());
-
-  std::unique_ptr<test::PacketTransport> send_transport;
-  std::unique_ptr<test::PacketTransport> receive_transport;
-  std::unique_ptr<VideoEncoder> encoder;
-
-  task_queue_.SendTask([&]() {
-    CreateCalls(config, config);
-
-    FakeNetworkPipe::Config lossy_delayed_link;
-    lossy_delayed_link.loss_percent = 2;
-    lossy_delayed_link.queue_delay_ms = 50;
-
-    send_transport = rtc::MakeUnique<test::PacketTransport>(
-        &task_queue_, sender_call_.get(), &observer,
-        test::PacketTransport::kSender, payload_type_map_, lossy_delayed_link);
-    send_transport->SetReceiver(receiver_call_->Receiver());
-
-    FakeNetworkPipe::Config flawless_link;
-    receive_transport = rtc::MakeUnique<test::PacketTransport>(
-        &task_queue_, nullptr, &observer, test::PacketTransport::kReceiver,
-        payload_type_map_, flawless_link);
-    receive_transport->SetReceiver(sender_call_->Receiver());
-
-    // For reduced flakyness, we use a real VP8 encoder together with NACK
-    // and RTX.
-    const int kNumVideoStreams = 1;
-    const int kNumFlexfecStreams = 1;
-    CreateSendConfig(kNumVideoStreams, 0, kNumFlexfecStreams,
-                     send_transport.get());
-    encoder = rtc::WrapUnique(VP8Encoder::Create());
-    video_send_config_.encoder_settings.encoder = encoder.get();
-    video_send_config_.encoder_settings.payload_name = "VP8";
-    video_send_config_.encoder_settings.payload_type = kVideoSendPayloadType;
-    video_send_config_.rtp.nack.rtp_history_ms = kNackRtpHistoryMs;
-    video_send_config_.rtp.rtx.ssrcs.push_back(kSendRtxSsrcs[0]);
-    video_send_config_.rtp.rtx.payload_type = kSendRtxPayloadType;
-
-    CreateMatchingReceiveConfigs(receive_transport.get());
-    video_receive_configs_[0].rtp.nack.rtp_history_ms = kNackRtpHistoryMs;
-    video_receive_configs_[0].rtp.rtx_ssrc = kSendRtxSsrcs[0];
-    video_receive_configs_[0]
-        .rtp.rtx_associated_payload_types[kSendRtxPayloadType] =
-        kVideoSendPayloadType;
-
-    // The matching FlexFEC receive config is not created by
-    // CreateMatchingReceiveConfigs since this is not a test::BaseTest.
-    // Set up the receive config manually instead.
-    FlexfecReceiveStream::Config flexfec_receive_config(
-        receive_transport.get());
-    flexfec_receive_config.payload_type =
-        video_send_config_.rtp.flexfec.payload_type;
-    flexfec_receive_config.remote_ssrc = video_send_config_.rtp.flexfec.ssrc;
-    flexfec_receive_config.protected_media_ssrcs =
-        video_send_config_.rtp.flexfec.protected_media_ssrcs;
-    flexfec_receive_config.local_ssrc = kReceiverLocalVideoSsrc;
-    flexfec_receive_config.transport_cc = true;
-    flexfec_receive_config.rtp_header_extensions.emplace_back(
-        RtpExtension::kTransportSequenceNumberUri,
-        test::kTransportSequenceNumberExtensionId);
-    flexfec_receive_configs_.push_back(flexfec_receive_config);
-
-    CreateFlexfecStreams();
-    CreateVideoStreams();
-
-    // RTCP might be disabled if the network is "down".
-    sender_call_->SignalChannelNetworkState(MediaType::VIDEO, kNetworkUp);
-    receiver_call_->SignalChannelNetworkState(MediaType::VIDEO, kNetworkUp);
-
-    CreateFrameGeneratorCapturer(kFrameRate, kFrameMaxWidth, kFrameMaxHeight);
-
-    Start();
-  });
-
-  // Initial test.
-  EXPECT_TRUE(observer.Wait()) << "Timed out waiting for packets.";
-
-  task_queue_.SendTask([this, &observer]() {
-    // Ensure monotonicity when the VideoSendStream is restarted.
-    Stop();
-    observer.ResetPacketCount();
-    Start();
-  });
-
-  EXPECT_TRUE(observer.Wait()) << "Timed out waiting for packets.";
-
-  task_queue_.SendTask([this, &observer]() {
-    // Ensure monotonicity when the VideoSendStream is recreated.
-    frame_generator_capturer_->Stop();
-    sender_call_->DestroyVideoSendStream(video_send_stream_);
-    observer.ResetPacketCount();
-    video_send_stream_ = sender_call_->CreateVideoSendStream(
-        video_send_config_.Copy(), video_encoder_config_.Copy());
-    video_send_stream_->Start();
-    CreateFrameGeneratorCapturer(kFrameRate, kFrameMaxWidth, kFrameMaxHeight);
-    frame_generator_capturer_->Start();
-  });
-
-  EXPECT_TRUE(observer.Wait()) << "Timed out waiting for packets.";
-
-  // Cleanup.
-  task_queue_.SendTask([this, &send_transport, &receive_transport]() {
-    Stop();
-    DestroyStreams();
-    send_transport.reset();
-    receive_transport.reset();
-    DestroyCalls();
-  });
-}
-
-TEST_F(EndToEndTest, RespectsNetworkState) {
-  // TODO(pbos): Remove accepted downtime packets etc. when signaling network
-  // down blocks until no more packets will be sent.
-
-  // Pacer will send from its packet list and then send required padding before
-  // checking paused_ again. This should be enough for one round of pacing,
-  // otherwise increase.
-  static const int kNumAcceptedDowntimeRtp = 5;
-  // A single RTCP may be in the pipeline.
-  static const int kNumAcceptedDowntimeRtcp = 1;
-  class NetworkStateTest : public test::EndToEndTest, public test::FakeEncoder {
-   public:
-    explicit NetworkStateTest(
-        test::SingleThreadedTaskQueueForTesting* task_queue)
-        : EndToEndTest(kDefaultTimeoutMs),
-          FakeEncoder(Clock::GetRealTimeClock()),
-          task_queue_(task_queue),
-          encoded_frames_(false, false),
-          packet_event_(false, false),
-          sender_call_(nullptr),
-          receiver_call_(nullptr),
-          sender_state_(kNetworkUp),
-          sender_rtp_(0),
-          sender_padding_(0),
-          sender_rtcp_(0),
-          receiver_rtcp_(0),
-          down_frames_(0) {}
-
-    Action OnSendRtp(const uint8_t* packet, size_t length) override {
-      rtc::CritScope lock(&test_crit_);
-      RTPHeader header;
-      EXPECT_TRUE(parser_->Parse(packet, length, &header));
-      if (length == header.headerLength + header.paddingLength)
-        ++sender_padding_;
-      ++sender_rtp_;
-      packet_event_.Set();
-      return SEND_PACKET;
-    }
-
-    Action OnSendRtcp(const uint8_t* packet, size_t length) override {
-      rtc::CritScope lock(&test_crit_);
-      ++sender_rtcp_;
-      packet_event_.Set();
-      return SEND_PACKET;
-    }
-
-    Action OnReceiveRtp(const uint8_t* packet, size_t length) override {
-      ADD_FAILURE() << "Unexpected receiver RTP, should not be sending.";
-      return SEND_PACKET;
-    }
-
-    Action OnReceiveRtcp(const uint8_t* packet, size_t length) override {
-      rtc::CritScope lock(&test_crit_);
-      ++receiver_rtcp_;
-      packet_event_.Set();
-      return SEND_PACKET;
-    }
-
-    void OnCallsCreated(Call* sender_call, Call* receiver_call) override {
-      sender_call_ = sender_call;
-      receiver_call_ = receiver_call;
-    }
-
-    void ModifyVideoConfigs(
-        VideoSendStream::Config* send_config,
-        std::vector<VideoReceiveStream::Config>* receive_configs,
-        VideoEncoderConfig* encoder_config) override {
-      send_config->encoder_settings.encoder = this;
-    }
-
-    void PerformTest() override {
-      EXPECT_TRUE(encoded_frames_.Wait(kDefaultTimeoutMs))
-          << "No frames received by the encoder.";
-
-      task_queue_->SendTask([this]() {
-        // Wait for packets from both sender/receiver.
-        WaitForPacketsOrSilence(false, false);
-
-        // Sender-side network down for audio; there should be no effect on
-        // video
-        sender_call_->SignalChannelNetworkState(MediaType::AUDIO, kNetworkDown);
-        WaitForPacketsOrSilence(false, false);
-
-        // Receiver-side network down for audio; no change expected
-        receiver_call_->SignalChannelNetworkState(MediaType::AUDIO,
-                                                  kNetworkDown);
-        WaitForPacketsOrSilence(false, false);
-
-        // Sender-side network down.
-        sender_call_->SignalChannelNetworkState(MediaType::VIDEO, kNetworkDown);
-        {
-          rtc::CritScope lock(&test_crit_);
-          // After network goes down we shouldn't be encoding more frames.
-          sender_state_ = kNetworkDown;
-        }
-        // Wait for receiver-packets and no sender packets.
-        WaitForPacketsOrSilence(true, false);
-
-        // Receiver-side network down.
-        receiver_call_->SignalChannelNetworkState(MediaType::VIDEO,
-                                                  kNetworkDown);
-        WaitForPacketsOrSilence(true, true);
-
-        // Network up for audio for both sides; video is still not expected to
-        // start
-        sender_call_->SignalChannelNetworkState(MediaType::AUDIO, kNetworkUp);
-        receiver_call_->SignalChannelNetworkState(MediaType::AUDIO, kNetworkUp);
-        WaitForPacketsOrSilence(true, true);
-
-        // Network back up again for both.
-        {
-          rtc::CritScope lock(&test_crit_);
-          // It's OK to encode frames again, as we're about to bring up the
-          // network.
-          sender_state_ = kNetworkUp;
-        }
-        sender_call_->SignalChannelNetworkState(MediaType::VIDEO, kNetworkUp);
-        receiver_call_->SignalChannelNetworkState(MediaType::VIDEO, kNetworkUp);
-        WaitForPacketsOrSilence(false, false);
-
-        // TODO(skvlad): add tests to verify that the audio streams are stopped
-        // when the network goes down for audio once the workaround in
-        // paced_sender.cc is removed.
-      });
-    }
-
-    int32_t Encode(const VideoFrame& input_image,
-                   const CodecSpecificInfo* codec_specific_info,
-                   const std::vector<FrameType>* frame_types) override {
-      {
-        rtc::CritScope lock(&test_crit_);
-        if (sender_state_ == kNetworkDown) {
-          ++down_frames_;
-          EXPECT_LE(down_frames_, 1)
-              << "Encoding more than one frame while network is down.";
-          if (down_frames_ > 1)
-            encoded_frames_.Set();
-        } else {
-          encoded_frames_.Set();
-        }
-      }
-      return test::FakeEncoder::Encode(
-          input_image, codec_specific_info, frame_types);
-    }
-
-   private:
-    void WaitForPacketsOrSilence(bool sender_down, bool receiver_down) {
-      int64_t initial_time_ms = clock_->TimeInMilliseconds();
-      int initial_sender_rtp;
-      int initial_sender_rtcp;
-      int initial_receiver_rtcp;
-      {
-        rtc::CritScope lock(&test_crit_);
-        initial_sender_rtp = sender_rtp_;
-        initial_sender_rtcp = sender_rtcp_;
-        initial_receiver_rtcp = receiver_rtcp_;
-      }
-      bool sender_done = false;
-      bool receiver_done = false;
-      while (!sender_done || !receiver_done) {
-        packet_event_.Wait(kSilenceTimeoutMs);
-        int64_t time_now_ms = clock_->TimeInMilliseconds();
-        rtc::CritScope lock(&test_crit_);
-        if (sender_down) {
-          ASSERT_LE(sender_rtp_ - initial_sender_rtp - sender_padding_,
-                    kNumAcceptedDowntimeRtp)
-              << "RTP sent during sender-side downtime.";
-          ASSERT_LE(sender_rtcp_ - initial_sender_rtcp,
-                    kNumAcceptedDowntimeRtcp)
-              << "RTCP sent during sender-side downtime.";
-          if (time_now_ms - initial_time_ms >=
-              static_cast<int64_t>(kSilenceTimeoutMs)) {
-            sender_done = true;
-          }
-        } else {
-          if (sender_rtp_ > initial_sender_rtp + kNumAcceptedDowntimeRtp)
-            sender_done = true;
-        }
-        if (receiver_down) {
-          ASSERT_LE(receiver_rtcp_ - initial_receiver_rtcp,
-                    kNumAcceptedDowntimeRtcp)
-              << "RTCP sent during receiver-side downtime.";
-          if (time_now_ms - initial_time_ms >=
-              static_cast<int64_t>(kSilenceTimeoutMs)) {
-            receiver_done = true;
-          }
-        } else {
-          if (receiver_rtcp_ > initial_receiver_rtcp + kNumAcceptedDowntimeRtcp)
-            receiver_done = true;
-        }
-      }
-    }
-
-    test::SingleThreadedTaskQueueForTesting* const task_queue_;
-    rtc::CriticalSection test_crit_;
-    rtc::Event encoded_frames_;
-    rtc::Event packet_event_;
-    Call* sender_call_;
-    Call* receiver_call_;
-    NetworkState sender_state_ RTC_GUARDED_BY(test_crit_);
-    int sender_rtp_ RTC_GUARDED_BY(test_crit_);
-    int sender_padding_ RTC_GUARDED_BY(test_crit_);
-    int sender_rtcp_ RTC_GUARDED_BY(test_crit_);
-    int receiver_rtcp_ RTC_GUARDED_BY(test_crit_);
-    int down_frames_ RTC_GUARDED_BY(test_crit_);
-  } test(&task_queue_);
-
-  RunBaseTest(&test);
-}
-
-TEST_F(EndToEndTest, CallReportsRttForSender) {
-  static const int kSendDelayMs = 30;
-  static const int kReceiveDelayMs = 70;
-
-  std::unique_ptr<test::DirectTransport> sender_transport;
-  std::unique_ptr<test::DirectTransport> receiver_transport;
-
-  task_queue_.SendTask([this, &sender_transport, &receiver_transport]() {
-    FakeNetworkPipe::Config config;
-    config.queue_delay_ms = kSendDelayMs;
-    CreateCalls(Call::Config(event_log_.get()), Call::Config(event_log_.get()));
-    sender_transport = rtc::MakeUnique<test::DirectTransport>(
-        &task_queue_, config, sender_call_.get(), payload_type_map_);
-    config.queue_delay_ms = kReceiveDelayMs;
-    receiver_transport = rtc::MakeUnique<test::DirectTransport>(
-        &task_queue_, config, receiver_call_.get(), payload_type_map_);
-    sender_transport->SetReceiver(receiver_call_->Receiver());
-    receiver_transport->SetReceiver(sender_call_->Receiver());
-
-    CreateSendConfig(1, 0, 0, sender_transport.get());
-    CreateMatchingReceiveConfigs(receiver_transport.get());
-
-    CreateVideoStreams();
-    CreateFrameGeneratorCapturer(kDefaultFramerate, kDefaultWidth,
-                                 kDefaultHeight);
-    Start();
-  });
-
-  int64_t start_time_ms = clock_->TimeInMilliseconds();
-  while (true) {
-    Call::Stats stats = sender_call_->GetStats();
-    ASSERT_GE(start_time_ms + kDefaultTimeoutMs,
-              clock_->TimeInMilliseconds())
-        << "No RTT stats before timeout!";
-    if (stats.rtt_ms != -1) {
-      // To avoid failures caused by rounding or minor ntp clock adjustments,
-      // relax expectation by 1ms.
-      constexpr int kAllowedErrorMs = 1;
-      EXPECT_GE(stats.rtt_ms, kSendDelayMs + kReceiveDelayMs - kAllowedErrorMs);
-      break;
-    }
-    SleepMs(10);
-  }
-
-  task_queue_.SendTask([this, &sender_transport, &receiver_transport]() {
-    Stop();
-    DestroyStreams();
-    sender_transport.reset();
-    receiver_transport.reset();
-    DestroyCalls();
-  });
-}
-
-void EndToEndTest::VerifyNewVideoSendStreamsRespectNetworkState(
-    MediaType network_to_bring_up,
-    VideoEncoder* encoder,
-    Transport* transport) {
-  task_queue_.SendTask([this, network_to_bring_up, encoder, transport]() {
-    CreateSenderCall(Call::Config(event_log_.get()));
-    sender_call_->SignalChannelNetworkState(network_to_bring_up, kNetworkUp);
-
-    CreateSendConfig(1, 0, 0, transport);
-    video_send_config_.encoder_settings.encoder = encoder;
-    CreateVideoStreams();
-    CreateFrameGeneratorCapturer(kDefaultFramerate, kDefaultWidth,
-                                 kDefaultHeight);
-
-    Start();
-  });
-
-  SleepMs(kSilenceTimeoutMs);
-
-  task_queue_.SendTask([this]() {
-    Stop();
-    DestroyStreams();
-    DestroyCalls();
-  });
-}
-
-void EndToEndTest::VerifyNewVideoReceiveStreamsRespectNetworkState(
-    MediaType network_to_bring_up,
-    Transport* transport) {
-  std::unique_ptr<test::DirectTransport> sender_transport;
-
-  task_queue_.SendTask([this, &sender_transport, network_to_bring_up,
-                        transport]() {
-    Call::Config config(event_log_.get());
-    CreateCalls(config, config);
-    receiver_call_->SignalChannelNetworkState(network_to_bring_up, kNetworkUp);
-    sender_transport = rtc::MakeUnique<test::DirectTransport>(
-        &task_queue_, sender_call_.get(), payload_type_map_);
-    sender_transport->SetReceiver(receiver_call_->Receiver());
-    CreateSendConfig(1, 0, 0, sender_transport.get());
-    CreateMatchingReceiveConfigs(transport);
-    CreateVideoStreams();
-    CreateFrameGeneratorCapturer(kDefaultFramerate, kDefaultWidth,
-                                 kDefaultHeight);
-    Start();
-  });
-
-  SleepMs(kSilenceTimeoutMs);
-
-  task_queue_.SendTask([this, &sender_transport]() {
-    Stop();
-    DestroyStreams();
-    sender_transport.reset();
-    DestroyCalls();
-  });
-}
-
-TEST_F(EndToEndTest, NewVideoSendStreamsRespectVideoNetworkDown) {
-  class UnusedEncoder : public test::FakeEncoder {
-   public:
-    UnusedEncoder() : FakeEncoder(Clock::GetRealTimeClock()) {}
-
-    int32_t InitEncode(const VideoCodec* config,
-                       int32_t number_of_cores,
-                       size_t max_payload_size) override {
-      EXPECT_GT(config->startBitrate, 0u);
-      return 0;
-    }
-    int32_t Encode(const VideoFrame& input_image,
-                   const CodecSpecificInfo* codec_specific_info,
-                   const std::vector<FrameType>* frame_types) override {
-      ADD_FAILURE() << "Unexpected frame encode.";
-      return test::FakeEncoder::Encode(input_image, codec_specific_info,
-                                       frame_types);
-    }
-  };
-
-  UnusedEncoder unused_encoder;
-  UnusedTransport unused_transport;
-  VerifyNewVideoSendStreamsRespectNetworkState(
-      MediaType::AUDIO, &unused_encoder, &unused_transport);
-}
-
-TEST_F(EndToEndTest, NewVideoSendStreamsIgnoreAudioNetworkDown) {
-  class RequiredEncoder : public test::FakeEncoder {
-   public:
-    RequiredEncoder()
-        : FakeEncoder(Clock::GetRealTimeClock()), encoded_frame_(false) {}
-    ~RequiredEncoder() {
-      if (!encoded_frame_) {
-        ADD_FAILURE() << "Didn't encode an expected frame";
-      }
-    }
-    int32_t Encode(const VideoFrame& input_image,
-                   const CodecSpecificInfo* codec_specific_info,
-                   const std::vector<FrameType>* frame_types) override {
-      encoded_frame_ = true;
-      return test::FakeEncoder::Encode(input_image, codec_specific_info,
-                                       frame_types);
-    }
-
-   private:
-    bool encoded_frame_;
-  };
-
-  RequiredTransport required_transport(true /*rtp*/, false /*rtcp*/);
-  RequiredEncoder required_encoder;
-  VerifyNewVideoSendStreamsRespectNetworkState(
-      MediaType::VIDEO, &required_encoder, &required_transport);
-}
-
-TEST_F(EndToEndTest, NewVideoReceiveStreamsRespectVideoNetworkDown) {
-  UnusedTransport transport;
-  VerifyNewVideoReceiveStreamsRespectNetworkState(MediaType::AUDIO, &transport);
-}
-
-TEST_F(EndToEndTest, NewVideoReceiveStreamsIgnoreAudioNetworkDown) {
-  RequiredTransport transport(false /*rtp*/, true /*rtcp*/);
-  VerifyNewVideoReceiveStreamsRespectNetworkState(MediaType::VIDEO, &transport);
-}
-
-void VerifyEmptyNackConfig(const NackConfig& config) {
-  EXPECT_EQ(0, config.rtp_history_ms)
-      << "Enabling NACK requires rtcp-fb: nack negotiation.";
-}
-
-void VerifyEmptyUlpfecConfig(const UlpfecConfig& config) {
-  EXPECT_EQ(-1, config.ulpfec_payload_type)
-      << "Enabling ULPFEC requires rtpmap: ulpfec negotiation.";
-  EXPECT_EQ(-1, config.red_payload_type)
-      << "Enabling ULPFEC requires rtpmap: red negotiation.";
-  EXPECT_EQ(-1, config.red_rtx_payload_type)
-      << "Enabling RTX in ULPFEC requires rtpmap: rtx negotiation.";
-}
-
-void VerifyEmptyFlexfecConfig(
-    const VideoSendStream::Config::Rtp::Flexfec& config) {
-  EXPECT_EQ(-1, config.payload_type)
-      << "Enabling FlexFEC requires rtpmap: flexfec negotiation.";
-  EXPECT_EQ(0U, config.ssrc)
-      << "Enabling FlexFEC requires ssrc-group: FEC-FR negotiation.";
-  EXPECT_TRUE(config.protected_media_ssrcs.empty())
-      << "Enabling FlexFEC requires ssrc-group: FEC-FR negotiation.";
-}
-
-TEST_F(EndToEndTest, VerifyDefaultSendConfigParameters) {
-  VideoSendStream::Config default_send_config(nullptr);
-  EXPECT_EQ(0, default_send_config.rtp.nack.rtp_history_ms)
-      << "Enabling NACK require rtcp-fb: nack negotiation.";
-  EXPECT_TRUE(default_send_config.rtp.rtx.ssrcs.empty())
-      << "Enabling RTX requires rtpmap: rtx negotiation.";
-  EXPECT_TRUE(default_send_config.rtp.extensions.empty())
-      << "Enabling RTP extensions require negotiation.";
-
-  VerifyEmptyNackConfig(default_send_config.rtp.nack);
-  VerifyEmptyUlpfecConfig(default_send_config.rtp.ulpfec);
-  VerifyEmptyFlexfecConfig(default_send_config.rtp.flexfec);
-}
-
-TEST_F(EndToEndTest, VerifyDefaultVideoReceiveConfigParameters) {
-  VideoReceiveStream::Config default_receive_config(nullptr);
-  EXPECT_EQ(RtcpMode::kCompound, default_receive_config.rtp.rtcp_mode)
-      << "Reduced-size RTCP require rtcp-rsize to be negotiated.";
-  EXPECT_FALSE(default_receive_config.rtp.remb)
-      << "REMB require rtcp-fb: goog-remb to be negotiated.";
-  EXPECT_FALSE(
-      default_receive_config.rtp.rtcp_xr.receiver_reference_time_report)
-      << "RTCP XR settings require rtcp-xr to be negotiated.";
-  EXPECT_EQ(0U, default_receive_config.rtp.rtx_ssrc)
-      << "Enabling RTX requires ssrc-group: FID negotiation";
-  EXPECT_TRUE(default_receive_config.rtp.rtx_associated_payload_types.empty())
-      << "Enabling RTX requires rtpmap: rtx negotiation.";
-  EXPECT_TRUE(default_receive_config.rtp.extensions.empty())
-      << "Enabling RTP extensions require negotiation.";
-
-  VerifyEmptyNackConfig(default_receive_config.rtp.nack);
-  VerifyEmptyUlpfecConfig(default_receive_config.rtp.ulpfec);
-}
-
-TEST_F(EndToEndTest, VerifyDefaultFlexfecReceiveConfigParameters) {
-  test::NullTransport rtcp_send_transport;
-  FlexfecReceiveStream::Config default_receive_config(&rtcp_send_transport);
-  EXPECT_EQ(-1, default_receive_config.payload_type)
-      << "Enabling FlexFEC requires rtpmap: flexfec negotiation.";
-  EXPECT_EQ(0U, default_receive_config.remote_ssrc)
-      << "Enabling FlexFEC requires ssrc-group: FEC-FR negotiation.";
-  EXPECT_TRUE(default_receive_config.protected_media_ssrcs.empty())
-      << "Enabling FlexFEC requires ssrc-group: FEC-FR negotiation.";
-}
-
-TEST_F(EndToEndTest, TransportSeqNumOnAudioAndVideo) {
-  static constexpr int kExtensionId = 8;
-  static constexpr size_t kMinPacketsToWaitFor = 50;
-  class TransportSequenceNumberTest : public test::EndToEndTest {
-   public:
-    TransportSequenceNumberTest()
-        : EndToEndTest(kDefaultTimeoutMs),
-          video_observed_(false),
-          audio_observed_(false) {
-      parser_->RegisterRtpHeaderExtension(kRtpExtensionTransportSequenceNumber,
-                                          kExtensionId);
-    }
-
-    size_t GetNumVideoStreams() const override { return 1; }
-    size_t GetNumAudioStreams() const override { return 1; }
-
-    void ModifyAudioConfigs(
-        AudioSendStream::Config* send_config,
-        std::vector<AudioReceiveStream::Config>* receive_configs) override {
-      send_config->rtp.extensions.clear();
-      send_config->rtp.extensions.push_back(RtpExtension(
-          RtpExtension::kTransportSequenceNumberUri, kExtensionId));
-      (*receive_configs)[0].rtp.extensions.clear();
-      (*receive_configs)[0].rtp.extensions = send_config->rtp.extensions;
-    }
-
-    Action OnSendRtp(const uint8_t* packet, size_t length) override {
-      RTPHeader header;
-      EXPECT_TRUE(parser_->Parse(packet, length, &header));
-      EXPECT_TRUE(header.extension.hasTransportSequenceNumber);
-      // Unwrap packet id and verify uniqueness.
-      int64_t packet_id =
-          unwrapper_.Unwrap(header.extension.transportSequenceNumber);
-      EXPECT_TRUE(received_packet_ids_.insert(packet_id).second);
-
-      if (header.ssrc == kVideoSendSsrcs[0])
-        video_observed_ = true;
-      if (header.ssrc == kAudioSendSsrc)
-        audio_observed_ = true;
-      if (audio_observed_ && video_observed_ &&
-          received_packet_ids_.size() >= kMinPacketsToWaitFor) {
-        size_t packet_id_range =
-            *received_packet_ids_.rbegin() - *received_packet_ids_.begin() + 1;
-        EXPECT_EQ(received_packet_ids_.size(), packet_id_range);
-        observation_complete_.Set();
-      }
-      return SEND_PACKET;
-    }
-
-    void PerformTest() override {
-      EXPECT_TRUE(Wait()) << "Timed out while waiting for audio and video "
-                             "packets with transport sequence number.";
-    }
-
-    void ExpectSuccessful() {
-      EXPECT_TRUE(video_observed_);
-      EXPECT_TRUE(audio_observed_);
-      EXPECT_GE(received_packet_ids_.size(), kMinPacketsToWaitFor);
-    }
-
-   private:
-    bool video_observed_;
-    bool audio_observed_;
-    SequenceNumberUnwrapper unwrapper_;
-    std::set<int64_t> received_packet_ids_;
-  } test;
-
-  RunBaseTest(&test);
-  // Double check conditions for successful test to produce better error
-  // message when the test fail.
-  test.ExpectSuccessful();
-}
-
-class EndToEndLogTest : public EndToEndTest {
-  void SetUp() { paths_.clear(); }
-  void TearDown() {
-    for (const auto& path : paths_) {
-      rtc::RemoveFile(path);
-    }
-  }
-
- public:
-  int AddFile() {
-    paths_.push_back(test::TempFilename(test::OutputPath(), "test_file"));
-    return static_cast<int>(paths_.size()) - 1;
-  }
-
-  rtc::PlatformFile OpenFile(int idx) {
-    return rtc::OpenPlatformFile(paths_[idx]);
-  }
-
-  void LogSend(bool open) {
-    if (open) {
-      video_send_stream_->EnableEncodedFrameRecording(
-          std::vector<rtc::PlatformFile>(1, OpenFile(AddFile())), 0);
-    } else {
-      video_send_stream_->DisableEncodedFrameRecording();
-    }
-  }
-  void LogReceive(bool open) {
-    if (open) {
-      video_receive_streams_[0]->EnableEncodedFrameRecording(
-          OpenFile(AddFile()), 0);
-    } else {
-      video_receive_streams_[0]->DisableEncodedFrameRecording();
-    }
-  }
-
-  std::vector<std::string> paths_;
-};
-
-TEST_F(EndToEndLogTest, LogsEncodedFramesWhenRequested) {
-  static const int kNumFramesToRecord = 10;
-  class LogEncodingObserver : public test::EndToEndTest,
-                              public EncodedFrameObserver {
-   public:
-    explicit LogEncodingObserver(EndToEndLogTest* fixture)
-        : EndToEndTest(kDefaultTimeoutMs),
-          fixture_(fixture),
-          recorded_frames_(0) {}
-
-    void PerformTest() override {
-      fixture_->LogSend(true);
-      fixture_->LogReceive(true);
-      ASSERT_TRUE(Wait()) << "Timed out while waiting for frame logging.";
-    }
-
-    void ModifyVideoConfigs(
-        VideoSendStream::Config* send_config,
-        std::vector<VideoReceiveStream::Config>* receive_configs,
-        VideoEncoderConfig* encoder_config) override {
-      encoder_.reset(VP8Encoder::Create());
-      decoder_.reset(VP8Decoder::Create());
-
-      send_config->post_encode_callback = this;
-      send_config->encoder_settings.payload_name = "VP8";
-      send_config->encoder_settings.encoder = encoder_.get();
-
-      (*receive_configs)[0].decoders.resize(1);
-      (*receive_configs)[0].decoders[0].payload_type =
-          send_config->encoder_settings.payload_type;
-      (*receive_configs)[0].decoders[0].payload_name =
-          send_config->encoder_settings.payload_name;
-      (*receive_configs)[0].decoders[0].decoder = decoder_.get();
-    }
-
-    void EncodedFrameCallback(const EncodedFrame& encoded_frame) override {
-      rtc::CritScope lock(&crit_);
-      if (recorded_frames_++ > kNumFramesToRecord) {
-        fixture_->LogSend(false);
-        fixture_->LogReceive(false);
-        rtc::File send_file(fixture_->OpenFile(0));
-        rtc::File receive_file(fixture_->OpenFile(1));
-        uint8_t out[100];
-        // If logging has worked correctly neither file should be empty, i.e.
-        // we should be able to read something from them.
-        EXPECT_LT(0u, send_file.Read(out, 100));
-        EXPECT_LT(0u, receive_file.Read(out, 100));
-        observation_complete_.Set();
-      }
-    }
-
-   private:
-    EndToEndLogTest* const fixture_;
-    std::unique_ptr<VideoEncoder> encoder_;
-    std::unique_ptr<VideoDecoder> decoder_;
-    rtc::CriticalSection crit_;
-    int recorded_frames_ RTC_GUARDED_BY(crit_);
-  } test(this);
-
-  RunBaseTest(&test);
-}
-
-}  // namespace webrtc
diff --git a/video/full_stack_tests.cc b/video/full_stack_tests.cc
deleted file mode 100644
index 24c3625..0000000
--- a/video/full_stack_tests.cc
+++ /dev/null
@@ -1,839 +0,0 @@
-/*
- *  Copyright (c) 2013 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 <stdio.h>
-
-#include "webrtc/modules/pacing/alr_detector.h"
-#include "webrtc/test/field_trial.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/video/video_quality_test.h"
-
-namespace webrtc {
-
-namespace {
-static const int kFullStackTestDurationSecs = 45;
-}  // namespace
-
-class FullStackTest : public VideoQualityTest {
- public:
-  void RunTest(const VideoQualityTest::Params &params) {
-    RunWithAnalyzer(params);
-  }
-
- protected:
-  const std::string kScreenshareSimulcastExperiment =
-      "WebRTC-SimulcastScreenshare/Enabled/";
-  const std::string kAlrProbingExperiment =
-      std::string(AlrDetector::kScreenshareProbingBweExperimentName) +
-      "/1.1,2875,85,20,-20,0/";
-};
-
-// VideoQualityTest::Params params = {
-//   { ... },      // Common.
-//   { ... },      // Video-specific settings.
-//   { ... },      // Screenshare-specific settings.
-//   { ... },      // Analyzer settings.
-//   pipe,         // FakeNetworkPipe::Config
-//   { ... },      // Spatial scalability.
-//   logs          // bool
-// };
-
-#if !defined(RTC_DISABLE_VP9)
-TEST_F(FullStackTest, ForemanCifWithoutPacketLossVp9) {
-  // TODO(pbos): Decide on psnr/ssim thresholds for foreman_cif.
-  VideoQualityTest::Params foreman_cif;
-  foreman_cif.call.send_side_bwe = true;
-  foreman_cif.video = {true,  352, 288, 30, 700000, 700000, 700000,       false,
-                       "VP9", 1,   0,   0,  false,  false,  "foreman_cif"};
-  foreman_cif.analyzer = {"foreman_cif_net_delay_0_0_plr_0_VP9", 0.0, 0.0,
-                          kFullStackTestDurationSecs};
-  RunTest(foreman_cif);
-}
-
-TEST_F(FullStackTest, ForemanCifPlr5Vp9) {
-  VideoQualityTest::Params foreman_cif;
-  foreman_cif.call.send_side_bwe = true;
-  foreman_cif.video = {true,  352, 288, 30, 30000, 500000, 2000000,      false,
-                       "VP9", 1,   0,   0,  false, false,  "foreman_cif"};
-  foreman_cif.analyzer = {"foreman_cif_delay_50_0_plr_5_VP9", 0.0, 0.0,
-                          kFullStackTestDurationSecs};
-  foreman_cif.pipe.loss_percent = 5;
-  foreman_cif.pipe.queue_delay_ms = 50;
-  RunTest(foreman_cif);
-}
-#endif  // !defined(RTC_DISABLE_VP9)
-
-TEST_F(FullStackTest, ParisQcifWithoutPacketLoss) {
-  VideoQualityTest::Params paris_qcif;
-  paris_qcif.call.send_side_bwe = true;
-  paris_qcif.video = {true,  176, 144, 30, 300000, 300000, 300000,      false,
-                      "VP8", 1,   0,   0,  false,  false,  "paris_qcif"};
-  paris_qcif.analyzer = {"net_delay_0_0_plr_0", 36.0, 0.96,
-                         kFullStackTestDurationSecs};
-  RunTest(paris_qcif);
-}
-
-TEST_F(FullStackTest, ForemanCifWithoutPacketLoss) {
-  // TODO(pbos): Decide on psnr/ssim thresholds for foreman_cif.
-  VideoQualityTest::Params foreman_cif;
-  foreman_cif.call.send_side_bwe = true;
-  foreman_cif.video = {true,  352, 288, 30, 700000, 700000, 700000,       false,
-                       "VP8", 1,   0,   0,  false,  false,  "foreman_cif"};
-  foreman_cif.analyzer = {"foreman_cif_net_delay_0_0_plr_0", 0.0, 0.0,
-                          kFullStackTestDurationSecs};
-  RunTest(foreman_cif);
-}
-
-TEST_F(FullStackTest, ForemanCif30kbpsWithoutPacketLoss) {
-  VideoQualityTest::Params foreman_cif;
-  foreman_cif.call.send_side_bwe = true;
-  foreman_cif.video = {true,  352, 288, 10, 30000, 30000, 30000,        false,
-                       "VP8", 1,   0,   0,  false, false, "foreman_cif"};
-  foreman_cif.analyzer = {"foreman_cif_30kbps_net_delay_0_0_plr_0", 0.0, 0.0,
-                          kFullStackTestDurationSecs};
-  RunTest(foreman_cif);
-}
-
-TEST_F(FullStackTest, ForemanCifPlr5) {
-  VideoQualityTest::Params foreman_cif;
-  foreman_cif.call.send_side_bwe = true;
-  foreman_cif.video = {true,  352, 288, 30, 30000, 500000, 2000000,      false,
-                       "VP8", 1,   0,   0,  false, false,  "foreman_cif"};
-  foreman_cif.analyzer = {"foreman_cif_delay_50_0_plr_5", 0.0, 0.0,
-                          kFullStackTestDurationSecs};
-  foreman_cif.pipe.loss_percent = 5;
-  foreman_cif.pipe.queue_delay_ms = 50;
-  RunTest(foreman_cif);
-}
-
-TEST_F(FullStackTest, ForemanCifPlr5Ulpfec) {
-  VideoQualityTest::Params foreman_cif;
-  foreman_cif.call.send_side_bwe = true;
-  foreman_cif.video = {true,  352, 288, 30, 30000, 500000, 2000000,      false,
-                       "VP8", 1,   0,   0,  true,  false,  "foreman_cif"};
-  foreman_cif.analyzer = {"foreman_cif_delay_50_0_plr_5_ulpfec", 0.0, 0.0,
-                          kFullStackTestDurationSecs};
-  foreman_cif.pipe.loss_percent = 5;
-  foreman_cif.pipe.queue_delay_ms = 50;
-  RunTest(foreman_cif);
-}
-
-TEST_F(FullStackTest, ForemanCifPlr5Flexfec) {
-  VideoQualityTest::Params foreman_cif;
-  foreman_cif.call.send_side_bwe = true;
-  foreman_cif.video = {true,  352, 288, 30, 30000, 500000, 2000000,      false,
-                       "VP8", 1,   0,   0,  false, true,   "foreman_cif"};
-  foreman_cif.analyzer = {"foreman_cif_delay_50_0_plr_5_flexfec", 0.0, 0.0,
-                          kFullStackTestDurationSecs};
-  foreman_cif.pipe.loss_percent = 5;
-  foreman_cif.pipe.queue_delay_ms = 50;
-  RunTest(foreman_cif);
-}
-
-TEST_F(FullStackTest, ForemanCif500kbpsPlr3Flexfec) {
-  VideoQualityTest::Params foreman_cif;
-  foreman_cif.call.send_side_bwe = true;
-  foreman_cif.video = {true,  352, 288, 30, 30000, 500000, 2000000,      false,
-                       "VP8", 1,   0,   0,  false, true,   "foreman_cif"};
-  foreman_cif.analyzer = {"foreman_cif_500kbps_delay_50_0_plr_3_flexfec", 0.0,
-                          0.0, kFullStackTestDurationSecs};
-  foreman_cif.pipe.loss_percent = 3;
-  foreman_cif.pipe.link_capacity_kbps = 500;
-  foreman_cif.pipe.queue_delay_ms = 50;
-  RunTest(foreman_cif);
-}
-
-TEST_F(FullStackTest, ForemanCif500kbpsPlr3Ulpfec) {
-  VideoQualityTest::Params foreman_cif;
-  foreman_cif.call.send_side_bwe = true;
-  foreman_cif.video = {true,  352, 288, 30, 30000, 500000, 2000000,      false,
-                       "VP8", 1,   0,   0,  true,  false,  "foreman_cif"};
-  foreman_cif.analyzer = {"foreman_cif_500kbps_delay_50_0_plr_3_ulpfec", 0.0,
-                          0.0, kFullStackTestDurationSecs};
-  foreman_cif.pipe.loss_percent = 3;
-  foreman_cif.pipe.link_capacity_kbps = 500;
-  foreman_cif.pipe.queue_delay_ms = 50;
-  RunTest(foreman_cif);
-}
-
-#if defined(WEBRTC_USE_H264)
-TEST_F(FullStackTest, ForemanCifWithoutPacketlossH264) {
-  // TODO(pbos): Decide on psnr/ssim thresholds for foreman_cif.
-  VideoQualityTest::Params foreman_cif;
-  foreman_cif.call.send_side_bwe = true;
-  foreman_cif.video = {true,   352,    288,   30,     700000,
-                       700000, 700000, false, "H264", 1,
-                       0,      0,      false, false,  "foreman_cif"};
-  foreman_cif.analyzer = {"foreman_cif_net_delay_0_0_plr_0_H264", 0.0, 0.0,
-                          kFullStackTestDurationSecs};
-  RunTest(foreman_cif);
-}
-
-TEST_F(FullStackTest, ForemanCif30kbpsWithoutPacketlossH264) {
-  VideoQualityTest::Params foreman_cif;
-  foreman_cif.call.send_side_bwe = true;
-  foreman_cif.video = {true,   352, 288, 10, 30000, 30000, 30000,        false,
-                       "H264", 1,   0,   0,  false, false, "foreman_cif"};
-  foreman_cif.analyzer = {"foreman_cif_30kbps_net_delay_0_0_plr_0_H264", 0.0,
-                          0.0, kFullStackTestDurationSecs};
-  RunTest(foreman_cif);
-}
-
-TEST_F(FullStackTest, ForemanCifPlr5H264) {
-  VideoQualityTest::Params foreman_cif;
-  foreman_cif.call.send_side_bwe = true;
-  foreman_cif.video = {true,   352, 288, 30, 30000, 500000, 2000000,      false,
-                       "H264", 1,   0,   0,  false, false,  "foreman_cif"};
-  std::string fec_description;
-  foreman_cif.analyzer = {"foreman_cif_delay_50_0_plr_5_H264", 0.0, 0.0,
-                          kFullStackTestDurationSecs};
-  foreman_cif.pipe.loss_percent = 5;
-  foreman_cif.pipe.queue_delay_ms = 50;
-  RunTest(foreman_cif);
-}
-
-// Verify that this is worth the bot time, before enabling.
-TEST_F(FullStackTest, ForemanCifPlr5H264Flexfec) {
-  VideoQualityTest::Params foreman_cif;
-  foreman_cif.call.send_side_bwe = true;
-  foreman_cif.video = {true,   352, 288, 30, 30000, 500000, 2000000,      false,
-                       "H264", 1,   0,   0,  false, true,   "foreman_cif"};
-  foreman_cif.analyzer = {"foreman_cif_delay_50_0_plr_5_H264_flexfec", 0.0, 0.0,
-                          kFullStackTestDurationSecs};
-  foreman_cif.pipe.loss_percent = 5;
-  foreman_cif.pipe.queue_delay_ms = 50;
-  RunTest(foreman_cif);
-}
-
-// Ulpfec with H264 is an unsupported combination, so this test is only useful
-// for debugging. It is therefore disabled by default.
-TEST_F(FullStackTest, DISABLED_ForemanCifPlr5H264Ulpfec) {
-  VideoQualityTest::Params foreman_cif;
-  foreman_cif.call.send_side_bwe = true;
-  foreman_cif.video = {true,   352, 288, 30, 30000, 500000, 2000000,      false,
-                       "H264", 1,   0,   0,  true,  false,  "foreman_cif"};
-  foreman_cif.analyzer = {"foreman_cif_delay_50_0_plr_5_H264_ulpfec", 0.0, 0.0,
-                          kFullStackTestDurationSecs};
-  foreman_cif.pipe.loss_percent = 5;
-  foreman_cif.pipe.queue_delay_ms = 50;
-  RunTest(foreman_cif);
-}
-#endif  // defined(WEBRTC_USE_H264)
-
-TEST_F(FullStackTest, ForemanCif500kbps) {
-  VideoQualityTest::Params foreman_cif;
-  foreman_cif.call.send_side_bwe = true;
-  foreman_cif.video = {true,  352, 288, 30, 30000, 500000, 2000000,      false,
-                       "VP8", 1,   0,   0,  false, false,  "foreman_cif"};
-  foreman_cif.analyzer = {"foreman_cif_500kbps", 0.0, 0.0,
-                          kFullStackTestDurationSecs};
-  foreman_cif.pipe.queue_length_packets = 0;
-  foreman_cif.pipe.queue_delay_ms = 0;
-  foreman_cif.pipe.link_capacity_kbps = 500;
-  RunTest(foreman_cif);
-}
-
-TEST_F(FullStackTest, ForemanCif500kbpsLimitedQueue) {
-  VideoQualityTest::Params foreman_cif;
-  foreman_cif.call.send_side_bwe = true;
-  foreman_cif.video = {true,  352, 288, 30, 30000, 500000, 2000000,      false,
-                       "VP8", 1,   0,   0,  false, false,  "foreman_cif"};
-  foreman_cif.analyzer = {"foreman_cif_500kbps_32pkts_queue", 0.0, 0.0,
-                          kFullStackTestDurationSecs};
-  foreman_cif.pipe.queue_length_packets = 32;
-  foreman_cif.pipe.queue_delay_ms = 0;
-  foreman_cif.pipe.link_capacity_kbps = 500;
-  RunTest(foreman_cif);
-}
-
-TEST_F(FullStackTest, ForemanCif500kbps100ms) {
-  VideoQualityTest::Params foreman_cif;
-  foreman_cif.call.send_side_bwe = true;
-  foreman_cif.video = {true,  352, 288, 30, 30000, 500000, 2000000,      false,
-                       "VP8", 1,   0,   0,  false, false,  "foreman_cif"};
-  foreman_cif.analyzer = {"foreman_cif_500kbps_100ms", 0.0, 0.0,
-                          kFullStackTestDurationSecs};
-  foreman_cif.pipe.queue_length_packets = 0;
-  foreman_cif.pipe.queue_delay_ms = 100;
-  foreman_cif.pipe.link_capacity_kbps = 500;
-  RunTest(foreman_cif);
-}
-
-TEST_F(FullStackTest, ForemanCif500kbps100msLimitedQueue) {
-  VideoQualityTest::Params foreman_cif;
-  foreman_cif.call.send_side_bwe = true;
-  foreman_cif.video = {true,  352, 288, 30, 30000, 500000, 2000000,      false,
-                       "VP8", 1,   0,   0,  false, false,  "foreman_cif"};
-  foreman_cif.analyzer = {"foreman_cif_500kbps_100ms_32pkts_queue", 0.0, 0.0,
-                          kFullStackTestDurationSecs};
-  foreman_cif.pipe.queue_length_packets = 32;
-  foreman_cif.pipe.queue_delay_ms = 100;
-  foreman_cif.pipe.link_capacity_kbps = 500;
-  RunTest(foreman_cif);
-}
-
-TEST_F(FullStackTest, ForemanCif500kbps100msLimitedQueueRecvBwe) {
-  VideoQualityTest::Params foreman_cif;
-  foreman_cif.call.send_side_bwe = false;
-  foreman_cif.video = {true,  352, 288, 30, 30000, 500000, 2000000,      false,
-                       "VP8", 1,   0,   0,  false, false,  "foreman_cif"};
-  foreman_cif.analyzer = {"foreman_cif_500kbps_100ms_32pkts_queue_recv_bwe",
-                          0.0, 0.0, kFullStackTestDurationSecs};
-  foreman_cif.pipe.queue_length_packets = 32;
-  foreman_cif.pipe.queue_delay_ms = 100;
-  foreman_cif.pipe.link_capacity_kbps = 500;
-  RunTest(foreman_cif);
-}
-
-TEST_F(FullStackTest, ForemanCif1000kbps100msLimitedQueue) {
-  VideoQualityTest::Params foreman_cif;
-  foreman_cif.call.send_side_bwe = true;
-  foreman_cif.video = {true,  352, 288, 30, 30000, 2000000, 2000000,      false,
-                       "VP8", 1,   0,   0,  false, false,   "foreman_cif"};
-  foreman_cif.analyzer = {"foreman_cif_1000kbps_100ms_32pkts_queue", 0.0, 0.0,
-                          kFullStackTestDurationSecs};
-  foreman_cif.pipe.queue_length_packets = 32;
-  foreman_cif.pipe.queue_delay_ms = 100;
-  foreman_cif.pipe.link_capacity_kbps = 1000;
-  RunTest(foreman_cif);
-}
-
-// TODO(sprang): Remove this if we have the similar ModerateLimits below?
-TEST_F(FullStackTest, ConferenceMotionHd2000kbps100msLimitedQueue) {
-  VideoQualityTest::Params conf_motion_hd;
-  conf_motion_hd.call.send_side_bwe = true;
-  conf_motion_hd.video = {
-      true,    1280,    720,   50,    30000,
-      3000000, 3000000, false, "VP8", 1,
-      0,       0,       false, false, "ConferenceMotion_1280_720_50"};
-  conf_motion_hd.analyzer = {"conference_motion_hd_2000kbps_100ms_32pkts_queue",
-                             0.0, 0.0, kFullStackTestDurationSecs};
-  conf_motion_hd.pipe.queue_length_packets = 32;
-  conf_motion_hd.pipe.queue_delay_ms = 100;
-  conf_motion_hd.pipe.link_capacity_kbps = 2000;
-  RunTest(conf_motion_hd);
-}
-
-TEST_F(FullStackTest, ConferenceMotionHd1TLModerateLimits) {
-  VideoQualityTest::Params conf_motion_hd;
-  conf_motion_hd.call.send_side_bwe = true;
-  conf_motion_hd.video = {
-      true,    1280,    720,   50,    30000,
-      3000000, 3000000, false, "VP8", 1,
-      -1,      0,       false, false, "ConferenceMotion_1280_720_50"};
-  conf_motion_hd.analyzer = {"conference_motion_hd_1tl_moderate_limits", 0.0,
-                             0.0, kFullStackTestDurationSecs};
-  conf_motion_hd.pipe.queue_length_packets = 50;
-  conf_motion_hd.pipe.loss_percent = 3;
-  conf_motion_hd.pipe.queue_delay_ms = 100;
-  conf_motion_hd.pipe.link_capacity_kbps = 2000;
-  RunTest(conf_motion_hd);
-}
-
-TEST_F(FullStackTest, ConferenceMotionHd2TLModerateLimits) {
-  VideoQualityTest::Params conf_motion_hd;
-  conf_motion_hd.call.send_side_bwe = true;
-  conf_motion_hd.video = {
-      true,    1280,    720,   50,    30000,
-      3000000, 3000000, false, "VP8", 2,
-      -1,      0,       false, false, "ConferenceMotion_1280_720_50"};
-  conf_motion_hd.analyzer = {"conference_motion_hd_2tl_moderate_limits", 0.0,
-                             0.0, kFullStackTestDurationSecs};
-  conf_motion_hd.pipe.queue_length_packets = 50;
-  conf_motion_hd.pipe.loss_percent = 3;
-  conf_motion_hd.pipe.queue_delay_ms = 100;
-  conf_motion_hd.pipe.link_capacity_kbps = 2000;
-  RunTest(conf_motion_hd);
-}
-
-TEST_F(FullStackTest, ConferenceMotionHd3TLModerateLimits) {
-  VideoQualityTest::Params conf_motion_hd;
-  conf_motion_hd.call.send_side_bwe = true;
-  conf_motion_hd.video = {
-      true,    1280,    720,   50,    30000,
-      3000000, 3000000, false, "VP8", 3,
-      -1,      0,       false, false, "ConferenceMotion_1280_720_50"};
-  conf_motion_hd.analyzer = {"conference_motion_hd_3tl_moderate_limits", 0.0,
-                             0.0, kFullStackTestDurationSecs};
-  conf_motion_hd.pipe.queue_length_packets = 50;
-  conf_motion_hd.pipe.loss_percent = 3;
-  conf_motion_hd.pipe.queue_delay_ms = 100;
-  conf_motion_hd.pipe.link_capacity_kbps = 2000;
-  RunTest(conf_motion_hd);
-}
-
-TEST_F(FullStackTest, ConferenceMotionHd4TLModerateLimits) {
-  VideoQualityTest::Params conf_motion_hd;
-  conf_motion_hd.call.send_side_bwe = true;
-  conf_motion_hd.video = {
-      true,    1280,    720,   50,    30000,
-      3000000, 3000000, false, "VP8", 4,
-      -1,      0,       false, false, "ConferenceMotion_1280_720_50"};
-  conf_motion_hd.analyzer = {"conference_motion_hd_4tl_moderate_limits", 0.0,
-                             0.0, kFullStackTestDurationSecs};
-  conf_motion_hd.pipe.queue_length_packets = 50;
-  conf_motion_hd.pipe.loss_percent = 3;
-  conf_motion_hd.pipe.queue_delay_ms = 100;
-  conf_motion_hd.pipe.link_capacity_kbps = 2000;
-  RunTest(conf_motion_hd);
-}
-
-TEST_F(FullStackTest, ConferenceMotionHd3TLModerateLimitsAltTLPattern) {
-  test::ScopedFieldTrials field_trial("WebRTC-UseShortVP8TL3Pattern/Enabled/");
-  VideoQualityTest::Params conf_motion_hd;
-  conf_motion_hd.call.send_side_bwe = true;
-  conf_motion_hd.video = {
-      true,    1280,    720,   50,    30000,
-      3000000, 3000000, false, "VP8", 3,
-      -1,      0,       false, false, "ConferenceMotion_1280_720_50"};
-  conf_motion_hd.analyzer = {"conference_motion_hd_3tl_alt_moderate_limits",
-                             0.0, 0.0, kFullStackTestDurationSecs};
-  conf_motion_hd.pipe.queue_length_packets = 50;
-  conf_motion_hd.pipe.loss_percent = 3;
-  conf_motion_hd.pipe.queue_delay_ms = 100;
-  conf_motion_hd.pipe.link_capacity_kbps = 2000;
-  RunTest(conf_motion_hd);
-}
-
-#if !defined(RTC_DISABLE_VP9)
-TEST_F(FullStackTest, ConferenceMotionHd2000kbps100msLimitedQueueVP9) {
-  VideoQualityTest::Params conf_motion_hd;
-  conf_motion_hd.call.send_side_bwe = true;
-  conf_motion_hd.video = {
-      true,    1280,    720,   50,    30000,
-      3000000, 3000000, false, "VP9", 1,
-      0,       0,       false, false, "ConferenceMotion_1280_720_50"};
-  conf_motion_hd.analyzer = {
-      "conference_motion_hd_2000kbps_100ms_32pkts_queue_vp9", 0.0, 0.0,
-      kFullStackTestDurationSecs};
-  conf_motion_hd.pipe.queue_length_packets = 32;
-  conf_motion_hd.pipe.queue_delay_ms = 100;
-  conf_motion_hd.pipe.link_capacity_kbps = 2000;
-  RunTest(conf_motion_hd);
-}
-#endif
-
-TEST_F(FullStackTest, ScreenshareSlidesVP8_2TL) {
-  VideoQualityTest::Params screenshare;
-  screenshare.call.send_side_bwe = true;
-  screenshare.video = {true,  1850, 1110, 5,      50000, 200000, 2000000, false,
-                       "VP8", 2,    1,    400000, false, false,  ""};
-  screenshare.screenshare = {true, false, 10};
-  screenshare.analyzer = {"screenshare_slides", 0.0, 0.0,
-                          kFullStackTestDurationSecs};
-  RunTest(screenshare);
-}
-
-TEST_F(FullStackTest, ScreenshareSlidesVP8_3TL_Simulcast) {
-  test::ScopedFieldTrials field_trial(kScreenshareSimulcastExperiment);
-  VideoQualityTest::Params screenshare;
-  screenshare.call.send_side_bwe = true;
-  screenshare.screenshare = {true, false, 10};
-  screenshare.video = {true,    1850,    1110,  5,     800000,
-                       2500000, 2500000, false, "VP8", 3,
-                       2,       400000,  false, false, ""};
-  screenshare.analyzer = {"screenshare_slides_simulcast", 0.0, 0.0,
-                          kFullStackTestDurationSecs};
-  VideoQualityTest::Params screenshare_params_high;
-  screenshare_params_high.video = {true,    1850,    1110,  5,     800000,
-                                   2500000, 2500000, false, "VP8", 3,
-                                   0,       400000,  false, false, ""};
-  VideoQualityTest::Params screenshare_params_low;
-  screenshare_params_low.video = {true,   1850,    1110,  5,     50000,
-                                  200000, 2000000, false, "VP8", 2,
-                                  0,      400000,  false, false, ""};
-
-  std::vector<VideoStream> streams = {
-      DefaultVideoStream(screenshare_params_low),
-      DefaultVideoStream(screenshare_params_high)};
-  screenshare.ss = {streams, 1, 1, 0, std::vector<SpatialLayer>(), false};
-  RunTest(screenshare);
-}
-
-TEST_F(FullStackTest, ScreenshareSlidesVP8_2TL_Scroll) {
-  VideoQualityTest::Params config;
-  config.call.send_side_bwe = true;
-  config.video = {true,  1850, 1110 / 2, 5,      50000, 200000, 2000000, false,
-                  "VP8", 2,    1,        400000, false, false,  ""};
-  config.screenshare = {true, false, 10, 2};
-  config.analyzer = {"screenshare_slides_scrolling", 0.0, 0.0,
-                     kFullStackTestDurationSecs};
-  RunTest(config);
-}
-
-TEST_F(FullStackTest, ScreenshareSlidesVP8_2TL_LossyNet) {
-  VideoQualityTest::Params screenshare;
-  screenshare.call.send_side_bwe = true;
-  screenshare.video = {true,  1850, 1110, 5,      50000, 200000, 2000000, false,
-                       "VP8", 2,    1,    400000, false, false,  ""};
-  screenshare.screenshare = {true, false, 10};
-  screenshare.analyzer = {"screenshare_slides_lossy_net", 0.0, 0.0,
-                          kFullStackTestDurationSecs};
-  screenshare.pipe.loss_percent = 5;
-  screenshare.pipe.queue_delay_ms = 200;
-  screenshare.pipe.link_capacity_kbps = 500;
-  RunTest(screenshare);
-}
-
-TEST_F(FullStackTest, ScreenshareSlidesVP8_2TL_VeryLossyNet) {
-  VideoQualityTest::Params screenshare;
-  screenshare.call.send_side_bwe = true;
-  screenshare.video = {true,  1850, 1110, 5,      50000, 200000, 2000000, false,
-                       "VP8", 2,    1,    400000, false, false,  ""};
-  screenshare.screenshare = {true, false, 10};
-  screenshare.analyzer = {"screenshare_slides_very_lossy", 0.0, 0.0,
-                          kFullStackTestDurationSecs};
-  screenshare.pipe.loss_percent = 10;
-  screenshare.pipe.queue_delay_ms = 200;
-  screenshare.pipe.link_capacity_kbps = 500;
-  RunTest(screenshare);
-}
-
-TEST_F(FullStackTest, ScreenshareSlidesVP8_2TL_LossyNetRestrictedQueue) {
-  VideoQualityTest::Params screenshare;
-  screenshare.call.send_side_bwe = true;
-  screenshare.video = {true,  1850, 1110, 5,      50000, 200000, 2000000, false,
-                       "VP8", 2,    1,    400000, false, false,  ""};
-  screenshare.screenshare = {true, false, 10};
-  screenshare.analyzer = {"screenshare_slides_lossy_limited", 0.0, 0.0,
-                          kFullStackTestDurationSecs};
-  screenshare.pipe.loss_percent = 5;
-  screenshare.pipe.link_capacity_kbps = 200;
-  screenshare.pipe.queue_length_packets = 30;
-
-  RunTest(screenshare);
-}
-
-TEST_F(FullStackTest, ScreenshareSlidesVP8_2TL_ModeratelyRestricted) {
-  VideoQualityTest::Params screenshare;
-  screenshare.call.send_side_bwe = true;
-  screenshare.video = {true,  1850, 1110, 5,      50000, 200000, 2000000, false,
-                       "VP8", 2,    1,    400000, false, false,  ""};
-  screenshare.screenshare = {true, false, 10};
-  screenshare.analyzer = {"screenshare_slides_moderately_restricted", 0.0, 0.0,
-                          kFullStackTestDurationSecs};
-  screenshare.pipe.loss_percent = 1;
-  screenshare.pipe.link_capacity_kbps = 1200;
-  screenshare.pipe.queue_length_packets = 30;
-
-  RunTest(screenshare);
-}
-
-// TODO(sprang): Retire these tests once experiment is removed.
-TEST_F(FullStackTest, ScreenshareSlidesVP8_2TL_LossyNetRestrictedQueue_ALR) {
-  test::ScopedFieldTrials field_trial(kAlrProbingExperiment);
-  VideoQualityTest::Params screenshare;
-  screenshare.call.send_side_bwe = true;
-  screenshare.video = {true,  1850, 1110, 5,      50000, 200000, 2000000, false,
-                       "VP8", 2,    1,    400000, false, false,  ""};
-  screenshare.screenshare = {true, false, 10};
-  screenshare.analyzer = {"screenshare_slides_lossy_limited_ALR", 0.0, 0.0,
-                          kFullStackTestDurationSecs};
-  screenshare.pipe.loss_percent = 5;
-  screenshare.pipe.link_capacity_kbps = 200;
-  screenshare.pipe.queue_length_packets = 30;
-
-  RunTest(screenshare);
-}
-
-TEST_F(FullStackTest, ScreenshareSlidesVP8_2TL_ALR) {
-  test::ScopedFieldTrials field_trial(kAlrProbingExperiment);
-  VideoQualityTest::Params screenshare;
-  screenshare.call.send_side_bwe = true;
-  screenshare.video = {true,  1850, 1110, 5,      50000, 200000, 2000000, false,
-                       "VP8", 2,    1,    400000, false, false,  ""};
-  screenshare.screenshare = {true, false, 10};
-  screenshare.analyzer = {"screenshare_slides_ALR", 0.0, 0.0,
-                          kFullStackTestDurationSecs};
-  RunTest(screenshare);
-}
-
-TEST_F(FullStackTest, ScreenshareSlidesVP8_2TL_ModeratelyRestricted_ALR) {
-  test::ScopedFieldTrials field_trial(kAlrProbingExperiment);
-  VideoQualityTest::Params screenshare;
-  screenshare.call.send_side_bwe = true;
-  screenshare.video = {true,  1850, 1110, 5,      50000, 200000, 2000000, false,
-                       "VP8", 2,    1,    400000, false, false,  ""};
-  screenshare.screenshare = {true, false, 10};
-  screenshare.analyzer = {"screenshare_slides_moderately_restricted_ALR", 0.0,
-                          0.0, kFullStackTestDurationSecs};
-  screenshare.pipe.loss_percent = 1;
-  screenshare.pipe.link_capacity_kbps = 1200;
-  screenshare.pipe.queue_length_packets = 30;
-
-  RunTest(screenshare);
-}
-
-TEST_F(FullStackTest, ScreenshareSlidesVP8_3TL_Simulcast_ALR) {
-  test::ScopedFieldTrials field_trial(kScreenshareSimulcastExperiment +
-                                      kAlrProbingExperiment);
-  VideoQualityTest::Params screenshare;
-  screenshare.call.send_side_bwe = true;
-  screenshare.screenshare = {true, false, 10};
-  screenshare.video = {true,    1850,    1110,  5,     800000,
-                       2500000, 2500000, false, "VP8", 3,
-                       2,       400000,  false, false, ""};
-  screenshare.analyzer = {"screenshare_slides_simulcast_alr", 0.0, 0.0,
-                          kFullStackTestDurationSecs};
-  VideoQualityTest::Params screenshare_params_high;
-  screenshare_params_high.video = {true,    1850,    1110,  5,     800000,
-                                   2500000, 2500000, false, "VP8", 3,
-                                   0,       400000,  false, false, ""};
-  VideoQualityTest::Params screenshare_params_low;
-  screenshare_params_low.video = {true,   1850,    1110,  5,     50000,
-                                  200000, 2000000, false, "VP8", 2,
-                                  0,      400000,  false, false, ""};
-
-  std::vector<VideoStream> streams = {
-      DefaultVideoStream(screenshare_params_low),
-      DefaultVideoStream(screenshare_params_high)};
-  screenshare.ss = {streams, 1, 1, 0, std::vector<SpatialLayer>(), false};
-  RunTest(screenshare);
-}
-
-const VideoQualityTest::Params::Video kSvcVp9Video = {
-    true,    1280,    720,   30,    800000,
-    2500000, 2500000, false, "VP9", 3,
-    2,       400000,  false, false, "ConferenceMotion_1280_720_50"};
-
-const VideoQualityTest::Params::Video kSimulcastVp8VideoHigh = {
-    true,    1280,    720,   30,    800000,
-    2500000, 2500000, false, "VP8", 3,
-    2,       400000,  false, false, "ConferenceMotion_1280_720_50"};
-
-const VideoQualityTest::Params::Video kSimulcastVp8VideoMedium = {
-    true,   640,    360,   30,    150000,
-    500000, 700000, false, "VP8", 3,
-    2,      400000, false, false, "ConferenceMotion_1280_720_50"};
-
-const VideoQualityTest::Params::Video kSimulcastVp8VideoLow = {
-    true,   320,    180,   30,    30000,
-    150000, 200000, false, "VP8", 3,
-    2,      400000, false, false, "ConferenceMotion_1280_720_50"};
-
-#if !defined(RTC_DISABLE_VP9)
-TEST_F(FullStackTest, ScreenshareSlidesVP9_2SL) {
-  VideoQualityTest::Params screenshare;
-  screenshare.call.send_side_bwe = true;
-  screenshare.video = {true,  1850, 1110, 5,      50000, 200000, 2000000, false,
-                       "VP9", 1,    0,    400000, false, false,  ""};
-  screenshare.screenshare = {true, false, 10};
-  screenshare.analyzer = {"screenshare_slides_vp9_2sl", 0.0, 0.0,
-                          kFullStackTestDurationSecs};
-  screenshare.ss = {std::vector<VideoStream>(),  0,    2, 1,
-                    std::vector<SpatialLayer>(), false};
-  RunTest(screenshare);
-}
-
-TEST_F(FullStackTest, VP9SVC_3SL_High) {
-  VideoQualityTest::Params simulcast;
-  simulcast.call.send_side_bwe = true;
-  simulcast.video = kSvcVp9Video;
-  simulcast.analyzer = {"vp9svc_3sl_high", 0.0, 0.0,
-                        kFullStackTestDurationSecs};
-  simulcast.ss = {std::vector<VideoStream>(),  0,    3, 2,
-                  std::vector<SpatialLayer>(), false};
-  RunTest(simulcast);
-}
-
-TEST_F(FullStackTest, VP9SVC_3SL_Medium) {
-  VideoQualityTest::Params simulcast;
-  simulcast.call.send_side_bwe = true;
-  simulcast.video = kSvcVp9Video;
-  simulcast.analyzer = {"vp9svc_3sl_medium", 0.0, 0.0,
-                        kFullStackTestDurationSecs};
-  simulcast.ss = {std::vector<VideoStream>(),  0,    3, 1,
-                  std::vector<SpatialLayer>(), false};
-  RunTest(simulcast);
-}
-
-TEST_F(FullStackTest, VP9SVC_3SL_Low) {
-  VideoQualityTest::Params simulcast;
-  simulcast.call.send_side_bwe = true;
-  simulcast.video = kSvcVp9Video;
-  simulcast.analyzer = {"vp9svc_3sl_low", 0.0, 0.0, kFullStackTestDurationSecs};
-  simulcast.ss = {std::vector<VideoStream>(),  0,    3, 0,
-                  std::vector<SpatialLayer>(), false};
-  RunTest(simulcast);
-}
-#endif  // !defined(RTC_DISABLE_VP9)
-
-// Android bots can't handle FullHD, so disable the test.
-#if defined(WEBRTC_ANDROID)
-#define MAYBE_SimulcastFullHdOveruse DISABLED_SimulcastFullHdOveruse
-#else
-#define MAYBE_SimulcastFullHdOveruse SimulcastFullHdOveruse
-#endif
-
-TEST_F(FullStackTest, MAYBE_SimulcastFullHdOveruse) {
-  VideoQualityTest::Params simulcast;
-  simulcast.call.send_side_bwe = true;
-  simulcast.video = {true,    1920,    1080,  30,    800000,
-                     2500000, 2500000, false, "VP8", 3,
-                     2,       400000,  false, false, "Generator"};
-  simulcast.analyzer = {"simulcast_HD_high", 0.0, 0.0,
-                        kFullStackTestDurationSecs};
-  simulcast.pipe.loss_percent = 0;
-  simulcast.pipe.queue_delay_ms = 100;
-  std::vector<VideoStream> streams = {DefaultVideoStream(simulcast),
-                                      DefaultVideoStream(simulcast),
-                                      DefaultVideoStream(simulcast)};
-  simulcast.ss = {streams, 2, 1, 0, std::vector<SpatialLayer>(), true};
-  webrtc::test::ScopedFieldTrials override_trials(
-      "WebRTC-ForceSimulatedOveruseIntervalMs/1000-50000-300/");
-  RunTest(simulcast);
-}
-
-TEST_F(FullStackTest, SimulcastVP8_3SL_High) {
-  VideoQualityTest::Params simulcast;
-  simulcast.call.send_side_bwe = true;
-  simulcast.video = kSimulcastVp8VideoHigh;
-  simulcast.analyzer = {"simulcast_vp8_3sl_high", 0.0, 0.0,
-                        kFullStackTestDurationSecs};
-  simulcast.pipe.loss_percent = 0;
-  simulcast.pipe.queue_delay_ms = 100;
-  VideoQualityTest::Params video_params_high;
-  video_params_high.video = kSimulcastVp8VideoHigh;
-  VideoQualityTest::Params video_params_medium;
-  video_params_medium.video = kSimulcastVp8VideoMedium;
-  VideoQualityTest::Params video_params_low;
-  video_params_low.video = kSimulcastVp8VideoLow;
-
-  std::vector<VideoStream> streams = {DefaultVideoStream(video_params_low),
-                                      DefaultVideoStream(video_params_medium),
-                                      DefaultVideoStream(video_params_high)};
-  simulcast.ss = {streams, 2, 1, 0, std::vector<SpatialLayer>(), false};
-  RunTest(simulcast);
-}
-
-TEST_F(FullStackTest, SimulcastVP8_3SL_Medium) {
-  VideoQualityTest::Params simulcast;
-  simulcast.call.send_side_bwe = true;
-  simulcast.video = kSimulcastVp8VideoHigh;
-  simulcast.analyzer = {"simulcast_vp8_3sl_medium", 0.0, 0.0,
-                        kFullStackTestDurationSecs};
-  simulcast.pipe.loss_percent = 0;
-  simulcast.pipe.queue_delay_ms = 100;
-  VideoQualityTest::Params video_params_high;
-  video_params_high.video = kSimulcastVp8VideoHigh;
-  VideoQualityTest::Params video_params_medium;
-  video_params_medium.video = kSimulcastVp8VideoMedium;
-  VideoQualityTest::Params video_params_low;
-  video_params_low.video = kSimulcastVp8VideoLow;
-
-  std::vector<VideoStream> streams = {DefaultVideoStream(video_params_low),
-                                      DefaultVideoStream(video_params_medium),
-                                      DefaultVideoStream(video_params_high)};
-  simulcast.ss = {streams, 1, 1, 0, std::vector<SpatialLayer>(), false};
-  RunTest(simulcast);
-}
-
-TEST_F(FullStackTest, SimulcastVP8_3SL_Low) {
-  VideoQualityTest::Params simulcast;
-  simulcast.call.send_side_bwe = true;
-  simulcast.video = kSimulcastVp8VideoHigh;
-  simulcast.analyzer = {"simulcast_vp8_3sl_low", 0.0, 0.0,
-                        kFullStackTestDurationSecs};
-  simulcast.pipe.loss_percent = 0;
-  simulcast.pipe.queue_delay_ms = 100;
-  VideoQualityTest::Params video_params_high;
-  video_params_high.video = kSimulcastVp8VideoHigh;
-  VideoQualityTest::Params video_params_medium;
-  video_params_medium.video = kSimulcastVp8VideoMedium;
-  VideoQualityTest::Params video_params_low;
-  video_params_low.video = kSimulcastVp8VideoLow;
-
-  std::vector<VideoStream> streams = {DefaultVideoStream(video_params_low),
-                                      DefaultVideoStream(video_params_medium),
-                                      DefaultVideoStream(video_params_high)};
-  simulcast.ss = {streams, 0, 1, 0, std::vector<SpatialLayer>(), false};
-  RunTest(simulcast);
-}
-
-TEST_F(FullStackTest, LargeRoomVP8_5thumb) {
-  VideoQualityTest::Params large_room;
-  large_room.call.send_side_bwe = true;
-  large_room.video = kSimulcastVp8VideoHigh;
-  large_room.analyzer = {"largeroom_5thumb", 0.0, 0.0,
-                         kFullStackTestDurationSecs};
-  large_room.pipe.loss_percent = 0;
-  large_room.pipe.queue_delay_ms = 100;
-  VideoQualityTest::Params video_params_high;
-  video_params_high.video = kSimulcastVp8VideoHigh;
-  VideoQualityTest::Params video_params_medium;
-  video_params_medium.video = kSimulcastVp8VideoMedium;
-  VideoQualityTest::Params video_params_low;
-  video_params_low.video = kSimulcastVp8VideoLow;
-
-  std::vector<VideoStream> streams = {DefaultVideoStream(video_params_low),
-                                      DefaultVideoStream(video_params_medium),
-                                      DefaultVideoStream(video_params_high)};
-  large_room.call.num_thumbnails = 5;
-  large_room.ss = {streams, 2, 1, 0, std::vector<SpatialLayer>(), false};
-  RunTest(large_room);
-}
-
-#if defined(WEBRTC_ANDROID)
-// Fails on Android:
-// https://bugs.chromium.org/p/webrtc/issues/detail?id=7301
-#define MAYBE_LargeRoomVP8_50thumb DISABLED_LargeRoomVP8_50thumb
-#define MAYBE_LargeRoomVP8_15thumb DISABLED_LargeRoomVP8_15thumb
-#else
-#define MAYBE_LargeRoomVP8_50thumb LargeRoomVP8_50thumb
-#define MAYBE_LargeRoomVP8_15thumb LargeRoomVP8_15thumb
-#endif
-
-TEST_F(FullStackTest, MAYBE_LargeRoomVP8_15thumb) {
-  VideoQualityTest::Params large_room;
-  large_room.call.send_side_bwe = true;
-  large_room.video = kSimulcastVp8VideoHigh;
-  large_room.analyzer = {"largeroom_15thumb", 0.0, 0.0,
-                         kFullStackTestDurationSecs};
-  large_room.pipe.loss_percent = 0;
-  large_room.pipe.queue_delay_ms = 100;
-  VideoQualityTest::Params video_params_high;
-  video_params_high.video = kSimulcastVp8VideoHigh;
-  VideoQualityTest::Params video_params_medium;
-  video_params_medium.video = kSimulcastVp8VideoMedium;
-  VideoQualityTest::Params video_params_low;
-  video_params_low.video = kSimulcastVp8VideoLow;
-
-  std::vector<VideoStream> streams = {DefaultVideoStream(video_params_low),
-                                      DefaultVideoStream(video_params_medium),
-                                      DefaultVideoStream(video_params_high)};
-  large_room.call.num_thumbnails = 15;
-  large_room.ss = {streams, 2, 1, 0, std::vector<SpatialLayer>(), false};
-  RunTest(large_room);
-}
-
-TEST_F(FullStackTest, MAYBE_LargeRoomVP8_50thumb) {
-  VideoQualityTest::Params large_room;
-  large_room.call.send_side_bwe = true;
-  large_room.video = kSimulcastVp8VideoHigh;
-  large_room.analyzer = {"largeroom_50thumb", 0.0, 0.0,
-                         kFullStackTestDurationSecs};
-  large_room.pipe.loss_percent = 0;
-  large_room.pipe.queue_delay_ms = 100;
-  VideoQualityTest::Params video_params_high;
-  video_params_high.video = kSimulcastVp8VideoHigh;
-  VideoQualityTest::Params video_params_medium;
-  video_params_medium.video = kSimulcastVp8VideoMedium;
-  VideoQualityTest::Params video_params_low;
-  video_params_low.video = kSimulcastVp8VideoLow;
-
-  std::vector<VideoStream> streams = {DefaultVideoStream(video_params_low),
-                                      DefaultVideoStream(video_params_medium),
-                                      DefaultVideoStream(video_params_high)};
-  large_room.call.num_thumbnails = 50;
-  large_room.ss = {streams, 2, 1, 0, std::vector<SpatialLayer>(), false};
-  RunTest(large_room);
-}
-
-
-}  // namespace webrtc
diff --git a/video/full_stack_tests_plot.py b/video/full_stack_tests_plot.py
deleted file mode 100755
index 3b324da..0000000
--- a/video/full_stack_tests_plot.py
+++ /dev/null
@@ -1,414 +0,0 @@
-#!/usr/bin/env python
-# Copyright (c) 2015 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.
-
-"""Generate graphs for data generated by loopback tests.
-
-Usage examples:
-  Show end to end time for a single full stack test.
-  ./full_stack_tests_plot.py -df end_to_end -o 600 --frames 1000 vp9_data.txt
-
-  Show simultaneously PSNR and encoded frame size for two different runs of
-  full stack test. Averaged over a cycle of 200 frames. Used e.g. for
-  screenshare slide test.
-  ./full_stack_tests_plot.py -c 200 -df psnr -drf encoded_frame_size \\
-                             before.txt after.txt
-
-  Similar to the previous test, but multiple graphs.
-  ./full_stack_tests_plot.py -c 200 -df psnr vp8.txt vp9.txt --next \\
-                             -c 200 -df sender_time vp8.txt vp9.txt --next \\
-                             -c 200 -df end_to_end vp8.txt vp9.txt
-"""
-
-import argparse
-from collections import defaultdict
-import itertools
-import sys
-import matplotlib.pyplot as plt
-import numpy
-
-# Fields
-DROPPED = 0
-INPUT_TIME = 1              # ms (timestamp)
-SEND_TIME = 2               # ms (timestamp)
-RECV_TIME = 3               # ms (timestamp)
-RENDER_TIME = 4             # ms (timestamp)
-ENCODED_FRAME_SIZE = 5      # bytes
-PSNR = 6
-SSIM = 7
-ENCODE_TIME = 8             # ms (time interval)
-
-TOTAL_RAW_FIELDS = 9
-
-SENDER_TIME = TOTAL_RAW_FIELDS + 0
-RECEIVER_TIME = TOTAL_RAW_FIELDS + 1
-END_TO_END = TOTAL_RAW_FIELDS + 2
-RENDERED_DELTA = TOTAL_RAW_FIELDS + 3
-
-FIELD_MASK = 255
-
-# Options
-HIDE_DROPPED = 256
-RIGHT_Y_AXIS = 512
-
-# internal field id, field name, title
-_FIELDS = [
-    # Raw
-    (DROPPED, "dropped", "dropped"),
-    (INPUT_TIME, "input_time_ms", "input time"),
-    (SEND_TIME, "send_time_ms", "send time"),
-    (RECV_TIME, "recv_time_ms", "recv time"),
-    (ENCODED_FRAME_SIZE, "encoded_frame_size", "encoded frame size"),
-    (PSNR, "psnr", "PSNR"),
-    (SSIM, "ssim", "SSIM"),
-    (RENDER_TIME, "render_time_ms", "render time"),
-    (ENCODE_TIME, "encode_time_ms", "encode time"),
-    # Auto-generated
-    (SENDER_TIME, "sender_time", "sender time"),
-    (RECEIVER_TIME, "receiver_time", "receiver time"),
-    (END_TO_END, "end_to_end", "end to end"),
-    (RENDERED_DELTA, "rendered_delta", "rendered delta"),
-]
-
-NAME_TO_ID = {field[1]: field[0] for field in _FIELDS}
-ID_TO_TITLE = {field[0]: field[2] for field in _FIELDS}
-
-def FieldArgToId(arg):
-  if arg == "none":
-    return None
-  if arg in NAME_TO_ID:
-    return NAME_TO_ID[arg]
-  if arg + "_ms" in NAME_TO_ID:
-    return NAME_TO_ID[arg + "_ms"]
-  raise Exception("Unrecognized field name \"{}\"".format(arg))
-
-
-class PlotLine(object):
-  """Data for a single graph line."""
-
-  def __init__(self, label, values, flags):
-    self.label = label
-    self.values = values
-    self.flags = flags
-
-
-class Data(object):
-  """Object representing one full stack test."""
-
-  def __init__(self, filename):
-    self.title = ""
-    self.length = 0
-    self.samples = defaultdict(list)
-
-    self._ReadSamples(filename)
-
-  def _ReadSamples(self, filename):
-    """Reads graph data from the given file."""
-    f = open(filename)
-    it = iter(f)
-
-    self.title = it.next().strip()
-    self.length = int(it.next())
-    field_names = [name.strip() for name in it.next().split()]
-    field_ids = [NAME_TO_ID[name] for name in field_names]
-
-    for field_id in field_ids:
-      self.samples[field_id] = [0.0] * self.length
-
-    for sample_id in xrange(self.length):
-      for col, value in enumerate(it.next().split()):
-        self.samples[field_ids[col]][sample_id] = float(value)
-
-    self._SubtractFirstInputTime()
-    self._GenerateAdditionalData()
-
-    f.close()
-
-  def _SubtractFirstInputTime(self):
-    offset = self.samples[INPUT_TIME][0]
-    for field in [INPUT_TIME, SEND_TIME, RECV_TIME, RENDER_TIME]:
-      if field in self.samples:
-        self.samples[field] = [x - offset for x in self.samples[field]]
-
-  def _GenerateAdditionalData(self):
-    """Calculates sender time, receiver time etc. from the raw data."""
-    s = self.samples
-    last_render_time = 0
-    for field_id in [SENDER_TIME, RECEIVER_TIME, END_TO_END, RENDERED_DELTA]:
-      s[field_id] = [0] * self.length
-
-    for k in range(self.length):
-      s[SENDER_TIME][k] = s[SEND_TIME][k] - s[INPUT_TIME][k]
-
-      decoded_time = s[RENDER_TIME][k]
-      s[RECEIVER_TIME][k] = decoded_time - s[RECV_TIME][k]
-      s[END_TO_END][k] = decoded_time - s[INPUT_TIME][k]
-      if not s[DROPPED][k]:
-        if k > 0:
-          s[RENDERED_DELTA][k] = decoded_time - last_render_time
-        last_render_time = decoded_time
-
-  def _Hide(self, values):
-    """
-    Replaces values for dropped frames with None.
-    These values are then skipped by the Plot() method.
-    """
-
-    return [None if self.samples[DROPPED][k] else values[k]
-            for k in range(len(values))]
-
-  def AddSamples(self, config, target_lines_list):
-    """Creates graph lines from the current data set with given config."""
-    for field in config.fields:
-      # field is None means the user wants just to skip the color.
-      if field is None:
-        target_lines_list.append(None)
-        continue
-
-      field_id = field & FIELD_MASK
-      values = self.samples[field_id]
-
-      if field & HIDE_DROPPED:
-        values = self._Hide(values)
-
-      target_lines_list.append(PlotLine(
-          self.title + " " + ID_TO_TITLE[field_id],
-          values, field & ~FIELD_MASK))
-
-
-def AverageOverCycle(values, length):
-  """
-  Returns the list:
-    [
-        avg(values[0], values[length], ...),
-        avg(values[1], values[length + 1], ...),
-        ...
-        avg(values[length - 1], values[2 * length - 1], ...),
-    ]
-
-  Skips None values when calculating the average value.
-  """
-
-  total = [0.0] * length
-  count = [0] * length
-  for k in range(len(values)):
-    if values[k] is not None:
-      total[k % length] += values[k]
-      count[k % length] += 1
-
-  result = [0.0] * length
-  for k in range(length):
-    result[k] = total[k] / count[k] if count[k] else None
-  return result
-
-
-class PlotConfig(object):
-  """Object representing a single graph."""
-
-  def __init__(self, fields, data_list, cycle_length=None, frames=None,
-               offset=0, output_filename=None, title="Graph"):
-    self.fields = fields
-    self.data_list = data_list
-    self.cycle_length = cycle_length
-    self.frames = frames
-    self.offset = offset
-    self.output_filename = output_filename
-    self.title = title
-
-  def Plot(self, ax1):
-    lines = []
-    for data in self.data_list:
-      if not data:
-        # Add None lines to skip the colors.
-        lines.extend([None] * len(self.fields))
-      else:
-        data.AddSamples(self, lines)
-
-    def _SliceValues(values):
-      if self.offset:
-        values = values[self.offset:]
-      if self.frames:
-        values = values[:self.frames]
-      return values
-
-    length = None
-    for line in lines:
-      if line is None:
-        continue
-
-      line.values = _SliceValues(line.values)
-      if self.cycle_length:
-        line.values = AverageOverCycle(line.values, self.cycle_length)
-
-      if length is None:
-        length = len(line.values)
-      elif length != len(line.values):
-        raise Exception("All arrays should have the same length!")
-
-    ax1.set_xlabel("Frame", fontsize="large")
-    if any(line.flags & RIGHT_Y_AXIS for line in lines if line):
-      ax2 = ax1.twinx()
-      ax2.set_xlabel("Frame", fontsize="large")
-    else:
-      ax2 = None
-
-    # Have to implement color_cycle manually, due to two scales in a graph.
-    color_cycle = ["b", "r", "g", "c", "m", "y", "k"]
-    color_iter = itertools.cycle(color_cycle)
-
-    for line in lines:
-      if not line:
-        color_iter.next()
-        continue
-
-      if self.cycle_length:
-        x = numpy.array(range(self.cycle_length))
-      else:
-        x = numpy.array(range(self.offset, self.offset + len(line.values)))
-      y = numpy.array(line.values)
-      ax = ax2 if line.flags & RIGHT_Y_AXIS else ax1
-      ax.Plot(x, y, "o-", label=line.label, markersize=3.0, linewidth=1.0,
-              color=color_iter.next())
-
-    ax1.grid(True)
-    if ax2:
-      ax1.legend(loc="upper left", shadow=True, fontsize="large")
-      ax2.legend(loc="upper right", shadow=True, fontsize="large")
-    else:
-      ax1.legend(loc="best", shadow=True, fontsize="large")
-
-
-def LoadFiles(filenames):
-  result = []
-  for filename in filenames:
-    if filename in LoadFiles.cache:
-      result.append(LoadFiles.cache[filename])
-    else:
-      data = Data(filename)
-      LoadFiles.cache[filename] = data
-      result.append(data)
-  return result
-LoadFiles.cache = {}
-
-
-def GetParser():
-  class CustomAction(argparse.Action):
-    def __call__(self, parser, namespace, values, option_string=None):
-      if "ordered_args" not in namespace:
-        namespace.ordered_args = []
-      namespace.ordered_args.append((self.dest, values))
-
-  parser = argparse.ArgumentParser(
-      description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter)
-
-  parser.add_argument(
-      "-c", "--cycle_length", nargs=1, action=CustomAction,
-      type=int, help="Cycle length over which to average the values.")
-  parser.add_argument(
-      "-f", "--field", nargs=1, action=CustomAction,
-      help="Name of the field to show. Use 'none' to skip a color.")
-  parser.add_argument("-r", "--right", nargs=0, action=CustomAction,
-                      help="Use right Y axis for given field.")
-  parser.add_argument("-d", "--drop", nargs=0, action=CustomAction,
-                      help="Hide values for dropped frames.")
-  parser.add_argument("-o", "--offset", nargs=1, action=CustomAction, type=int,
-                      help="Frame offset.")
-  parser.add_argument("-n", "--next", nargs=0, action=CustomAction,
-                      help="Separator for multiple graphs.")
-  parser.add_argument(
-      "--frames", nargs=1, action=CustomAction, type=int,
-      help="Frame count to show or take into account while averaging.")
-  parser.add_argument("-t", "--title", nargs=1, action=CustomAction,
-                      help="Title of the graph.")
-  parser.add_argument(
-      "-O", "--output_filename", nargs=1, action=CustomAction,
-      help="Use to save the graph into a file. "
-           "Otherwise, a window will be shown.")
-  parser.add_argument(
-      "files", nargs="+", action=CustomAction,
-      help="List of text-based files generated by loopback tests.")
-  return parser
-
-
-def _PlotConfigFromArgs(args, graph_num):
-  # Pylint complains about using kwargs, so have to do it this way.
-  cycle_length = None
-  frames = None
-  offset = 0
-  output_filename = None
-  title = "Graph"
-
-  fields = []
-  files = []
-  mask = 0
-  for key, values in args:
-    if key == "cycle_length":
-      cycle_length = values[0]
-    elif key == "frames":
-      frames = values[0]
-    elif key == "offset":
-      offset = values[0]
-    elif key == "output_filename":
-      output_filename = values[0]
-    elif key == "title":
-      title = values[0]
-    elif key == "drop":
-      mask |= HIDE_DROPPED
-    elif key == "right":
-      mask |= RIGHT_Y_AXIS
-    elif key == "field":
-      field_id = FieldArgToId(values[0])
-      fields.append(field_id | mask if field_id is not None else None)
-      mask = 0  # Reset mask after the field argument.
-    elif key == "files":
-      files.extend(values)
-
-  if not files:
-    raise Exception("Missing file argument(s) for graph #{}".format(graph_num))
-  if not fields:
-    raise Exception("Missing field argument(s) for graph #{}".format(graph_num))
-
-  return PlotConfig(fields, LoadFiles(files), cycle_length=cycle_length,
-      frames=frames, offset=offset, output_filename=output_filename,
-      title=title)
-
-
-def PlotConfigsFromArgs(args):
-  """Generates plot configs for given command line arguments."""
-  # The way it works:
-  #   First we detect separators -n/--next and split arguments into groups, one
-  #   for each plot. For each group, we partially parse it with
-  #   argparse.ArgumentParser, modified to remember the order of arguments.
-  #   Then we traverse the argument list and fill the PlotConfig.
-  args = itertools.groupby(args, lambda x: x in ["-n", "--next"])
-  args = list(list(group) for match, group in args if not match)
-
-  parser = GetParser()
-  plot_configs = []
-  for index, raw_args in enumerate(args):
-    graph_args = parser.parse_args(raw_args).ordered_args
-    plot_configs.append(_PlotConfigFromArgs(graph_args, index))
-  return plot_configs
-
-
-def ShowOrSavePlots(plot_configs):
-  for config in plot_configs:
-    fig = plt.figure(figsize=(14.0, 10.0))
-    ax = fig.add_subPlot(1, 1, 1)
-
-    plt.title(config.title)
-    config.Plot(ax)
-    if config.output_filename:
-      print "Saving to", config.output_filename
-      fig.savefig(config.output_filename)
-      plt.close(fig)
-
-  plt.show()
-
-if __name__ == "__main__":
-  ShowOrSavePlots(PlotConfigsFromArgs(sys.argv[1:]))
diff --git a/video/overuse_frame_detector.cc b/video/overuse_frame_detector.cc
deleted file mode 100644
index 1d8bc0b..0000000
--- a/video/overuse_frame_detector.cc
+++ /dev/null
@@ -1,562 +0,0 @@
-/*
- *  Copyright (c) 2013 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/video/overuse_frame_detector.h"
-
-#include <assert.h>
-#include <math.h>
-
-#include <algorithm>
-#include <list>
-#include <map>
-#include <string>
-#include <utility>
-
-#include "webrtc/api/video/video_frame.h"
-#include "webrtc/common_video/include/frame_callback.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/numerics/exp_filter.h"
-#include "webrtc/rtc_base/timeutils.h"
-#include "webrtc/system_wrappers/include/field_trial.h"
-
-#if defined(WEBRTC_MAC) && !defined(WEBRTC_IOS)
-#include <mach/mach.h>
-#endif  // defined(WEBRTC_MAC) && !defined(WEBRTC_IOS)
-
-namespace webrtc {
-
-namespace {
-const int64_t kCheckForOveruseIntervalMs = 5000;
-const int64_t kTimeToFirstCheckForOveruseMs = 100;
-
-// Delay between consecutive rampups. (Used for quick recovery.)
-const int kQuickRampUpDelayMs = 10 * 1000;
-// Delay between rampup attempts. Initially uses standard, scales up to max.
-const int kStandardRampUpDelayMs = 40 * 1000;
-const int kMaxRampUpDelayMs = 240 * 1000;
-// Expontential back-off factor, to prevent annoying up-down behaviour.
-const double kRampUpBackoffFactor = 2.0;
-
-// Max number of overuses detected before always applying the rampup delay.
-const int kMaxOverusesBeforeApplyRampupDelay = 4;
-
-// The maximum exponent to use in VCMExpFilter.
-const float kMaxExp = 7.0f;
-// Default value used before first reconfiguration.
-const int kDefaultFrameRate = 30;
-// Default sample diff, default frame rate.
-const float kDefaultSampleDiffMs = 1000.0f / kDefaultFrameRate;
-// A factor applied to the sample diff on OnTargetFramerateUpdated to determine
-// a max limit for the sample diff. For instance, with a framerate of 30fps,
-// the sample diff is capped to (1000 / 30) * 1.35 = 45ms. This prevents
-// triggering too soon if there are individual very large outliers.
-const float kMaxSampleDiffMarginFactor = 1.35f;
-// Minimum framerate allowed for usage calculation. This prevents crazy long
-// encode times from being accepted if the frame rate happens to be low.
-const int kMinFramerate = 7;
-const int kMaxFramerate = 30;
-
-const auto kScaleReasonCpu = AdaptationObserverInterface::AdaptReason::kCpu;
-}  // namespace
-
-CpuOveruseOptions::CpuOveruseOptions()
-    : high_encode_usage_threshold_percent(85),
-      frame_timeout_interval_ms(1500),
-      min_frame_samples(120),
-      min_process_count(3),
-      high_threshold_consecutive_count(2) {
-#if defined(WEBRTC_MAC) && !defined(WEBRTC_IOS)
-  // This is proof-of-concept code for letting the physical core count affect
-  // the interval into which we attempt to scale. For now, the code is Mac OS
-  // specific, since that's the platform were we saw most problems.
-  // TODO(torbjorng): Enhance SystemInfo to return this metric.
-
-  mach_port_t mach_host = mach_host_self();
-  host_basic_info hbi = {};
-  mach_msg_type_number_t info_count = HOST_BASIC_INFO_COUNT;
-  kern_return_t kr =
-      host_info(mach_host, HOST_BASIC_INFO, reinterpret_cast<host_info_t>(&hbi),
-                &info_count);
-  mach_port_deallocate(mach_task_self(), mach_host);
-
-  int n_physical_cores;
-  if (kr != KERN_SUCCESS) {
-    // If we couldn't get # of physical CPUs, don't panic. Assume we have 1.
-    n_physical_cores = 1;
-    LOG(LS_ERROR) << "Failed to determine number of physical cores, assuming 1";
-  } else {
-    n_physical_cores = hbi.physical_cpu;
-    LOG(LS_INFO) << "Number of physical cores:" << n_physical_cores;
-  }
-
-  // Change init list default for few core systems. The assumption here is that
-  // encoding, which we measure here, takes about 1/4 of the processing of a
-  // two-way call. This is roughly true for x86 using both vp8 and vp9 without
-  // hardware encoding. Since we don't affect the incoming stream here, we only
-  // control about 1/2 of the total processing needs, but this is not taken into
-  // account.
-  if (n_physical_cores == 1)
-    high_encode_usage_threshold_percent = 20;  // Roughly 1/4 of 100%.
-  else if (n_physical_cores == 2)
-    high_encode_usage_threshold_percent = 40;  // Roughly 1/4 of 200%.
-#endif  // defined(WEBRTC_MAC) && !defined(WEBRTC_IOS)
-
-  // Note that we make the interval 2x+epsilon wide, since libyuv scaling steps
-  // are close to that (when squared). This wide interval makes sure that
-  // scaling up or down does not jump all the way across the interval.
-  low_encode_usage_threshold_percent =
-      (high_encode_usage_threshold_percent - 1) / 2;
-}
-
-// Class for calculating the processing usage on the send-side (the average
-// processing time of a frame divided by the average time difference between
-// captured frames).
-class OveruseFrameDetector::SendProcessingUsage {
- public:
-  explicit SendProcessingUsage(const CpuOveruseOptions& options)
-      : kWeightFactorFrameDiff(0.998f),
-        kWeightFactorProcessing(0.995f),
-        kInitialSampleDiffMs(40.0f),
-        count_(0),
-        options_(options),
-        max_sample_diff_ms_(kDefaultSampleDiffMs * kMaxSampleDiffMarginFactor),
-        filtered_processing_ms_(new rtc::ExpFilter(kWeightFactorProcessing)),
-        filtered_frame_diff_ms_(new rtc::ExpFilter(kWeightFactorFrameDiff)) {
-    Reset();
-  }
-  virtual ~SendProcessingUsage() {}
-
-  void Reset() {
-    count_ = 0;
-    max_sample_diff_ms_ = kDefaultSampleDiffMs * kMaxSampleDiffMarginFactor;
-    filtered_frame_diff_ms_->Reset(kWeightFactorFrameDiff);
-    filtered_frame_diff_ms_->Apply(1.0f, kInitialSampleDiffMs);
-    filtered_processing_ms_->Reset(kWeightFactorProcessing);
-    filtered_processing_ms_->Apply(1.0f, InitialProcessingMs());
-  }
-
-  void SetMaxSampleDiffMs(float diff_ms) { max_sample_diff_ms_ = diff_ms; }
-
-  void AddCaptureSample(float sample_ms) {
-    float exp = sample_ms / kDefaultSampleDiffMs;
-    exp = std::min(exp, kMaxExp);
-    filtered_frame_diff_ms_->Apply(exp, sample_ms);
-  }
-
-  void AddSample(float processing_ms, int64_t diff_last_sample_ms) {
-    ++count_;
-    float exp = diff_last_sample_ms / kDefaultSampleDiffMs;
-    exp = std::min(exp, kMaxExp);
-    filtered_processing_ms_->Apply(exp, processing_ms);
-  }
-
-  virtual int Value() {
-    if (count_ < static_cast<uint32_t>(options_.min_frame_samples)) {
-      return static_cast<int>(InitialUsageInPercent() + 0.5f);
-    }
-    float frame_diff_ms = std::max(filtered_frame_diff_ms_->filtered(), 1.0f);
-    frame_diff_ms = std::min(frame_diff_ms, max_sample_diff_ms_);
-    float encode_usage_percent =
-        100.0f * filtered_processing_ms_->filtered() / frame_diff_ms;
-    return static_cast<int>(encode_usage_percent + 0.5);
-  }
-
- private:
-  float InitialUsageInPercent() const {
-    // Start in between the underuse and overuse threshold.
-    return (options_.low_encode_usage_threshold_percent +
-            options_.high_encode_usage_threshold_percent) / 2.0f;
-  }
-
-  float InitialProcessingMs() const {
-    return InitialUsageInPercent() * kInitialSampleDiffMs / 100;
-  }
-
-  const float kWeightFactorFrameDiff;
-  const float kWeightFactorProcessing;
-  const float kInitialSampleDiffMs;
-  uint64_t count_;
-  const CpuOveruseOptions options_;
-  float max_sample_diff_ms_;
-  std::unique_ptr<rtc::ExpFilter> filtered_processing_ms_;
-  std::unique_ptr<rtc::ExpFilter> filtered_frame_diff_ms_;
-};
-
-// Class used for manual testing of overuse, enabled via field trial flag.
-class OveruseFrameDetector::OverdoseInjector
-    : public OveruseFrameDetector::SendProcessingUsage {
- public:
-  OverdoseInjector(const CpuOveruseOptions& options,
-                   int64_t normal_period_ms,
-                   int64_t overuse_period_ms,
-                   int64_t underuse_period_ms)
-      : OveruseFrameDetector::SendProcessingUsage(options),
-        normal_period_ms_(normal_period_ms),
-        overuse_period_ms_(overuse_period_ms),
-        underuse_period_ms_(underuse_period_ms),
-        state_(State::kNormal),
-        last_toggling_ms_(-1) {
-    RTC_DCHECK_GT(overuse_period_ms, 0);
-    RTC_DCHECK_GT(normal_period_ms, 0);
-    LOG(LS_INFO) << "Simulating overuse with intervals " << normal_period_ms
-                 << "ms normal mode, " << overuse_period_ms
-                 << "ms overuse mode.";
-  }
-
-  ~OverdoseInjector() override {}
-
-  int Value() override {
-    int64_t now_ms = rtc::TimeMillis();
-    if (last_toggling_ms_ == -1) {
-      last_toggling_ms_ = now_ms;
-    } else {
-      switch (state_) {
-        case State::kNormal:
-          if (now_ms > last_toggling_ms_ + normal_period_ms_) {
-            state_ = State::kOveruse;
-            last_toggling_ms_ = now_ms;
-            LOG(LS_INFO) << "Simulating CPU overuse.";
-          }
-          break;
-        case State::kOveruse:
-          if (now_ms > last_toggling_ms_ + overuse_period_ms_) {
-            state_ = State::kUnderuse;
-            last_toggling_ms_ = now_ms;
-            LOG(LS_INFO) << "Simulating CPU underuse.";
-          }
-          break;
-        case State::kUnderuse:
-          if (now_ms > last_toggling_ms_ + underuse_period_ms_) {
-            state_ = State::kNormal;
-            last_toggling_ms_ = now_ms;
-            LOG(LS_INFO) << "Actual CPU overuse measurements in effect.";
-          }
-          break;
-      }
-    }
-
-    rtc::Optional<int> overried_usage_value;
-    switch (state_) {
-      case State::kNormal:
-        break;
-      case State::kOveruse:
-        overried_usage_value.emplace(250);
-        break;
-      case State::kUnderuse:
-        overried_usage_value.emplace(5);
-        break;
-    }
-
-    return overried_usage_value.value_or(SendProcessingUsage::Value());
-  }
-
- private:
-  const int64_t normal_period_ms_;
-  const int64_t overuse_period_ms_;
-  const int64_t underuse_period_ms_;
-  enum class State { kNormal, kOveruse, kUnderuse } state_;
-  int64_t last_toggling_ms_;
-};
-
-std::unique_ptr<OveruseFrameDetector::SendProcessingUsage>
-OveruseFrameDetector::CreateSendProcessingUsage(
-    const CpuOveruseOptions& options) {
-  std::unique_ptr<SendProcessingUsage> instance;
-  std::string toggling_interval =
-      field_trial::FindFullName("WebRTC-ForceSimulatedOveruseIntervalMs");
-  if (!toggling_interval.empty()) {
-    int normal_period_ms = 0;
-    int overuse_period_ms = 0;
-    int underuse_period_ms = 0;
-    if (sscanf(toggling_interval.c_str(), "%d-%d-%d", &normal_period_ms,
-               &overuse_period_ms, &underuse_period_ms) == 3) {
-      if (normal_period_ms > 0 && overuse_period_ms > 0 &&
-          underuse_period_ms > 0) {
-        instance.reset(new OverdoseInjector(
-            options, normal_period_ms, overuse_period_ms, underuse_period_ms));
-      } else {
-        LOG(LS_WARNING)
-            << "Invalid (non-positive) normal/overuse/underuse periods: "
-            << normal_period_ms << " / " << overuse_period_ms << " / "
-            << underuse_period_ms;
-      }
-    } else {
-      LOG(LS_WARNING) << "Malformed toggling interval: " << toggling_interval;
-    }
-  }
-
-  if (!instance) {
-    // No valid overuse simulation parameters set, use normal usage class.
-    instance.reset(new SendProcessingUsage(options));
-  }
-
-  return instance;
-}
-
-class OveruseFrameDetector::CheckOveruseTask : public rtc::QueuedTask {
- public:
-  explicit CheckOveruseTask(OveruseFrameDetector* overuse_detector)
-      : overuse_detector_(overuse_detector) {
-    rtc::TaskQueue::Current()->PostDelayedTask(
-        std::unique_ptr<rtc::QueuedTask>(this), kTimeToFirstCheckForOveruseMs);
-  }
-
-  void Stop() {
-    RTC_CHECK(task_checker_.CalledSequentially());
-    overuse_detector_ = nullptr;
-  }
-
- private:
-  bool Run() override {
-    RTC_CHECK(task_checker_.CalledSequentially());
-    if (!overuse_detector_)
-      return true;  // This will make the task queue delete this task.
-    overuse_detector_->CheckForOveruse();
-
-    rtc::TaskQueue::Current()->PostDelayedTask(
-        std::unique_ptr<rtc::QueuedTask>(this), kCheckForOveruseIntervalMs);
-    // Return false to prevent this task from being deleted. Ownership has been
-    // transferred to the task queue when PostDelayedTask was called.
-    return false;
-  }
-  rtc::SequencedTaskChecker task_checker_;
-  OveruseFrameDetector* overuse_detector_;
-};
-
-OveruseFrameDetector::OveruseFrameDetector(
-    const CpuOveruseOptions& options,
-    AdaptationObserverInterface* observer,
-    EncodedFrameObserver* encoder_timing,
-    CpuOveruseMetricsObserver* metrics_observer)
-    : check_overuse_task_(nullptr),
-      options_(options),
-      observer_(observer),
-      encoder_timing_(encoder_timing),
-      metrics_observer_(metrics_observer),
-      num_process_times_(0),
-      // TODO(nisse): Use rtc::Optional
-      last_capture_time_us_(-1),
-      last_processed_capture_time_us_(-1),
-      num_pixels_(0),
-      max_framerate_(kDefaultFrameRate),
-      last_overuse_time_ms_(-1),
-      checks_above_threshold_(0),
-      num_overuse_detections_(0),
-      last_rampup_time_ms_(-1),
-      in_quick_rampup_(false),
-      current_rampup_delay_ms_(kStandardRampUpDelayMs),
-      usage_(CreateSendProcessingUsage(options)) {
-  task_checker_.Detach();
-}
-
-OveruseFrameDetector::~OveruseFrameDetector() {
-  RTC_DCHECK(!check_overuse_task_) << "StopCheckForOverUse must be called.";
-}
-
-void OveruseFrameDetector::StartCheckForOveruse() {
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&task_checker_);
-  RTC_DCHECK(!check_overuse_task_);
-  check_overuse_task_ = new CheckOveruseTask(this);
-}
-void OveruseFrameDetector::StopCheckForOveruse() {
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&task_checker_);
-  check_overuse_task_->Stop();
-  check_overuse_task_ = nullptr;
-}
-
-void OveruseFrameDetector::EncodedFrameTimeMeasured(int encode_duration_ms) {
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&task_checker_);
-  if (!metrics_)
-    metrics_ = rtc::Optional<CpuOveruseMetrics>(CpuOveruseMetrics());
-  metrics_->encode_usage_percent = usage_->Value();
-
-  metrics_observer_->OnEncodedFrameTimeMeasured(encode_duration_ms, *metrics_);
-}
-
-bool OveruseFrameDetector::FrameSizeChanged(int num_pixels) const {
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&task_checker_);
-  if (num_pixels != num_pixels_) {
-    return true;
-  }
-  return false;
-}
-
-bool OveruseFrameDetector::FrameTimeoutDetected(int64_t now_us) const {
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&task_checker_);
-  if (last_capture_time_us_ == -1)
-    return false;
-  return (now_us - last_capture_time_us_) >
-      options_.frame_timeout_interval_ms * rtc::kNumMicrosecsPerMillisec;
-}
-
-void OveruseFrameDetector::ResetAll(int num_pixels) {
-  // Reset state, as a result resolution being changed. Do not however change
-  // the current frame rate back to the default.
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&task_checker_);
-  num_pixels_ = num_pixels;
-  usage_->Reset();
-  frame_timing_.clear();
-  last_capture_time_us_ = -1;
-  last_processed_capture_time_us_ = -1;
-  num_process_times_ = 0;
-  metrics_ = rtc::Optional<CpuOveruseMetrics>();
-  OnTargetFramerateUpdated(max_framerate_);
-}
-
-void OveruseFrameDetector::OnTargetFramerateUpdated(int framerate_fps) {
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&task_checker_);
-  RTC_DCHECK_GE(framerate_fps, 0);
-  max_framerate_ = std::min(kMaxFramerate, framerate_fps);
-  usage_->SetMaxSampleDiffMs((1000 / std::max(kMinFramerate, max_framerate_)) *
-                             kMaxSampleDiffMarginFactor);
-}
-
-void OveruseFrameDetector::FrameCaptured(const VideoFrame& frame,
-                                         int64_t time_when_first_seen_us) {
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&task_checker_);
-
-  if (FrameSizeChanged(frame.width() * frame.height()) ||
-      FrameTimeoutDetected(time_when_first_seen_us)) {
-    ResetAll(frame.width() * frame.height());
-  }
-
-  if (last_capture_time_us_ != -1)
-    usage_->AddCaptureSample(
-        1e-3 * (time_when_first_seen_us - last_capture_time_us_));
-
-  last_capture_time_us_ = time_when_first_seen_us;
-
-  frame_timing_.push_back(FrameTiming(frame.timestamp_us(), frame.timestamp(),
-                                      time_when_first_seen_us));
-}
-
-void OveruseFrameDetector::FrameSent(uint32_t timestamp,
-                                     int64_t time_sent_in_us) {
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&task_checker_);
-  // Delay before reporting actual encoding time, used to have the ability to
-  // detect total encoding time when encoding more than one layer. Encoding is
-  // here assumed to finish within a second (or that we get enough long-time
-  // samples before one second to trigger an overuse even when this is not the
-  // case).
-  static const int64_t kEncodingTimeMeasureWindowMs = 1000;
-  for (auto& it : frame_timing_) {
-    if (it.timestamp == timestamp) {
-      it.last_send_us = time_sent_in_us;
-      break;
-    }
-  }
-  // TODO(pbos): Handle the case/log errors when not finding the corresponding
-  // frame (either very slow encoding or incorrect wrong timestamps returned
-  // from the encoder).
-  // This is currently the case for all frames on ChromeOS, so logging them
-  // would be spammy, and triggering overuse would be wrong.
-  // https://crbug.com/350106
-  while (!frame_timing_.empty()) {
-    FrameTiming timing = frame_timing_.front();
-    if (time_sent_in_us - timing.capture_us <
-        kEncodingTimeMeasureWindowMs * rtc::kNumMicrosecsPerMillisec) {
-      break;
-    }
-    if (timing.last_send_us != -1) {
-      int encode_duration_us =
-          static_cast<int>(timing.last_send_us - timing.capture_us);
-      if (encoder_timing_) {
-        // TODO(nisse): Update encoder_timing_ to also use us units.
-        encoder_timing_->OnEncodeTiming(timing.capture_time_us /
-                                        rtc::kNumMicrosecsPerMillisec,
-                                        encode_duration_us /
-                                        rtc::kNumMicrosecsPerMillisec);
-      }
-      if (last_processed_capture_time_us_ != -1) {
-        int64_t diff_us = timing.capture_us - last_processed_capture_time_us_;
-        usage_->AddSample(1e-3 * encode_duration_us, 1e-3 * diff_us);
-      }
-      last_processed_capture_time_us_ = timing.capture_us;
-      EncodedFrameTimeMeasured(encode_duration_us /
-                               rtc::kNumMicrosecsPerMillisec);
-    }
-    frame_timing_.pop_front();
-  }
-}
-
-void OveruseFrameDetector::CheckForOveruse() {
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&task_checker_);
-  ++num_process_times_;
-  if (num_process_times_ <= options_.min_process_count || !metrics_)
-    return;
-
-  int64_t now_ms = rtc::TimeMillis();
-
-  if (IsOverusing(*metrics_)) {
-    // If the last thing we did was going up, and now have to back down, we need
-    // to check if this peak was short. If so we should back off to avoid going
-    // back and forth between this load, the system doesn't seem to handle it.
-    bool check_for_backoff = last_rampup_time_ms_ > last_overuse_time_ms_;
-    if (check_for_backoff) {
-      if (now_ms - last_rampup_time_ms_ < kStandardRampUpDelayMs ||
-          num_overuse_detections_ > kMaxOverusesBeforeApplyRampupDelay) {
-        // Going up was not ok for very long, back off.
-        current_rampup_delay_ms_ *= kRampUpBackoffFactor;
-        if (current_rampup_delay_ms_ > kMaxRampUpDelayMs)
-          current_rampup_delay_ms_ = kMaxRampUpDelayMs;
-      } else {
-        // Not currently backing off, reset rampup delay.
-        current_rampup_delay_ms_ = kStandardRampUpDelayMs;
-      }
-    }
-
-    last_overuse_time_ms_ = now_ms;
-    in_quick_rampup_ = false;
-    checks_above_threshold_ = 0;
-    ++num_overuse_detections_;
-
-    if (observer_)
-      observer_->AdaptDown(kScaleReasonCpu);
-  } else if (IsUnderusing(*metrics_, now_ms)) {
-    last_rampup_time_ms_ = now_ms;
-    in_quick_rampup_ = true;
-
-    if (observer_)
-      observer_->AdaptUp(kScaleReasonCpu);
-  }
-
-  int rampup_delay =
-      in_quick_rampup_ ? kQuickRampUpDelayMs : current_rampup_delay_ms_;
-
-  LOG(LS_VERBOSE) << " Frame stats: "
-                  << " encode usage " << metrics_->encode_usage_percent
-                  << " overuse detections " << num_overuse_detections_
-                  << " rampup delay " << rampup_delay;
-}
-
-bool OveruseFrameDetector::IsOverusing(const CpuOveruseMetrics& metrics) {
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&task_checker_);
-
-  if (metrics.encode_usage_percent >=
-      options_.high_encode_usage_threshold_percent) {
-    ++checks_above_threshold_;
-  } else {
-    checks_above_threshold_ = 0;
-  }
-  return checks_above_threshold_ >= options_.high_threshold_consecutive_count;
-}
-
-bool OveruseFrameDetector::IsUnderusing(const CpuOveruseMetrics& metrics,
-                                        int64_t time_now) {
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&task_checker_);
-  int delay = in_quick_rampup_ ? kQuickRampUpDelayMs : current_rampup_delay_ms_;
-  if (time_now < last_rampup_time_ms_ + delay)
-    return false;
-
-  return metrics.encode_usage_percent <
-         options_.low_encode_usage_threshold_percent;
-}
-}  // namespace webrtc
diff --git a/video/overuse_frame_detector.h b/video/overuse_frame_detector.h
deleted file mode 100644
index a4f4588..0000000
--- a/video/overuse_frame_detector.h
+++ /dev/null
@@ -1,164 +0,0 @@
-/*
- *  Copyright (c) 2013 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_VIDEO_OVERUSE_FRAME_DETECTOR_H_
-#define WEBRTC_VIDEO_OVERUSE_FRAME_DETECTOR_H_
-
-#include <list>
-#include <memory>
-
-#include "webrtc/api/optional.h"
-#include "webrtc/modules/video_coding/utility/quality_scaler.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/numerics/exp_filter.h"
-#include "webrtc/rtc_base/sequenced_task_checker.h"
-#include "webrtc/rtc_base/task_queue.h"
-#include "webrtc/rtc_base/thread_annotations.h"
-
-namespace webrtc {
-
-class EncodedFrameObserver;
-class VideoFrame;
-
-struct CpuOveruseOptions {
-  CpuOveruseOptions();
-
-  int low_encode_usage_threshold_percent;  // Threshold for triggering underuse.
-  int high_encode_usage_threshold_percent;  // Threshold for triggering overuse.
-  // General settings.
-  int frame_timeout_interval_ms;  // The maximum allowed interval between two
-                                  // frames before resetting estimations.
-  int min_frame_samples;  // The minimum number of frames required.
-  int min_process_count;  // The number of initial process times required before
-                          // triggering an overuse/underuse.
-  int high_threshold_consecutive_count;  // The number of consecutive checks
-                                         // above the high threshold before
-                                         // triggering an overuse.
-};
-
-struct CpuOveruseMetrics {
-  CpuOveruseMetrics() : encode_usage_percent(-1) {}
-
-  int encode_usage_percent;  // Average encode time divided by the average time
-                             // difference between incoming captured frames.
-};
-
-class CpuOveruseMetricsObserver {
- public:
-  virtual ~CpuOveruseMetricsObserver() {}
-  virtual void OnEncodedFrameTimeMeasured(int encode_duration_ms,
-                                          const CpuOveruseMetrics& metrics) = 0;
-};
-
-// Use to detect system overuse based on the send-side processing time of
-// incoming frames. All methods must be called on a single task queue but it can
-// be created and destroyed on an arbitrary thread.
-// OveruseFrameDetector::StartCheckForOveruse  must be called to periodically
-// check for overuse.
-class OveruseFrameDetector {
- public:
-  OveruseFrameDetector(const CpuOveruseOptions& options,
-                       AdaptationObserverInterface* overuse_observer,
-                       EncodedFrameObserver* encoder_timing_,
-                       CpuOveruseMetricsObserver* metrics_observer);
-  virtual ~OveruseFrameDetector();
-
-  // Start to periodically check for overuse.
-  void StartCheckForOveruse();
-
-  // StopCheckForOveruse must be called before destruction if
-  // StartCheckForOveruse has been called.
-  void StopCheckForOveruse();
-
-  // Defines the current maximum framerate targeted by the capturer. This is
-  // used to make sure the encode usage percent doesn't drop unduly if the
-  // capturer has quiet periods (for instance caused by screen capturers with
-  // variable capture rate depending on content updates), otherwise we might
-  // experience adaptation toggling.
-  virtual void OnTargetFramerateUpdated(int framerate_fps);
-
-  // Called for each captured frame.
-  void FrameCaptured(const VideoFrame& frame, int64_t time_when_first_seen_us);
-
-  // Called for each sent frame.
-  void FrameSent(uint32_t timestamp, int64_t time_sent_in_us);
-
- protected:
-  void CheckForOveruse();  // Protected for test purposes.
-
- private:
-  class OverdoseInjector;
-  class SendProcessingUsage;
-  class CheckOveruseTask;
-  struct FrameTiming {
-    FrameTiming(int64_t capture_time_us, uint32_t timestamp, int64_t now)
-        : capture_time_us(capture_time_us),
-          timestamp(timestamp),
-          capture_us(now),
-          last_send_us(-1) {}
-    int64_t capture_time_us;
-    uint32_t timestamp;
-    int64_t capture_us;
-    int64_t last_send_us;
-  };
-
-  void EncodedFrameTimeMeasured(int encode_duration_ms);
-  bool IsOverusing(const CpuOveruseMetrics& metrics);
-  bool IsUnderusing(const CpuOveruseMetrics& metrics, int64_t time_now);
-
-  bool FrameTimeoutDetected(int64_t now) const;
-  bool FrameSizeChanged(int num_pixels) const;
-
-  void ResetAll(int num_pixels);
-
-  static std::unique_ptr<SendProcessingUsage> CreateSendProcessingUsage(
-      const CpuOveruseOptions& options);
-
-  rtc::SequencedTaskChecker task_checker_;
-  // Owned by the task queue from where StartCheckForOveruse is called.
-  CheckOveruseTask* check_overuse_task_;
-
-  const CpuOveruseOptions options_;
-
-  // Observer getting overuse reports.
-  AdaptationObserverInterface* const observer_;
-  EncodedFrameObserver* const encoder_timing_;
-
-  // Stats metrics.
-  CpuOveruseMetricsObserver* const metrics_observer_;
-  rtc::Optional<CpuOveruseMetrics> metrics_ RTC_GUARDED_BY(task_checker_);
-
-  int64_t num_process_times_ RTC_GUARDED_BY(task_checker_);
-
-  int64_t last_capture_time_us_ RTC_GUARDED_BY(task_checker_);
-  int64_t last_processed_capture_time_us_ RTC_GUARDED_BY(task_checker_);
-
-  // Number of pixels of last captured frame.
-  int num_pixels_ RTC_GUARDED_BY(task_checker_);
-  int max_framerate_ RTC_GUARDED_BY(task_checker_);
-  int64_t last_overuse_time_ms_ RTC_GUARDED_BY(task_checker_);
-  int checks_above_threshold_ RTC_GUARDED_BY(task_checker_);
-  int num_overuse_detections_ RTC_GUARDED_BY(task_checker_);
-  int64_t last_rampup_time_ms_ RTC_GUARDED_BY(task_checker_);
-  bool in_quick_rampup_ RTC_GUARDED_BY(task_checker_);
-  int current_rampup_delay_ms_ RTC_GUARDED_BY(task_checker_);
-
-  // TODO(asapersson): Can these be regular members (avoid separate heap
-  // allocs)?
-  const std::unique_ptr<SendProcessingUsage> usage_
-      RTC_GUARDED_BY(task_checker_);
-  std::list<FrameTiming> frame_timing_ RTC_GUARDED_BY(task_checker_);
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(OveruseFrameDetector);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_VIDEO_OVERUSE_FRAME_DETECTOR_H_
diff --git a/video/overuse_frame_detector_unittest.cc b/video/overuse_frame_detector_unittest.cc
deleted file mode 100644
index 80faf65..0000000
--- a/video/overuse_frame_detector_unittest.cc
+++ /dev/null
@@ -1,483 +0,0 @@
-/*
- *  Copyright (c) 2013 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 <memory>
-
-#include "webrtc/api/video/i420_buffer.h"
-#include "webrtc/common_video/include/video_frame.h"
-#include "webrtc/modules/video_coding/utility/quality_scaler.h"
-#include "webrtc/rtc_base/event.h"
-#include "webrtc/rtc_base/fakeclock.h"
-#include "webrtc/test/gmock.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/video/overuse_frame_detector.h"
-
-namespace webrtc {
-
-using ::testing::InvokeWithoutArgs;
-
-namespace {
-  const int kWidth = 640;
-  const int kHeight = 480;
-  const int kFrameIntervalUs = 33 * rtc::kNumMicrosecsPerMillisec;
-  const int kProcessTimeUs = 5 * rtc::kNumMicrosecsPerMillisec;
-}  // namespace
-
-class MockCpuOveruseObserver : public AdaptationObserverInterface {
- public:
-  MockCpuOveruseObserver() {}
-  virtual ~MockCpuOveruseObserver() {}
-
-  MOCK_METHOD1(AdaptUp, void(AdaptReason));
-  MOCK_METHOD1(AdaptDown, void(AdaptReason));
-};
-
-class CpuOveruseObserverImpl : public AdaptationObserverInterface {
- public:
-  CpuOveruseObserverImpl() :
-    overuse_(0),
-    normaluse_(0) {}
-  virtual ~CpuOveruseObserverImpl() {}
-
-  void AdaptDown(AdaptReason) { ++overuse_; }
-  void AdaptUp(AdaptReason) { ++normaluse_; }
-
-  int overuse_;
-  int normaluse_;
-};
-
-class OveruseFrameDetectorUnderTest : public OveruseFrameDetector {
- public:
-  OveruseFrameDetectorUnderTest(const CpuOveruseOptions& options,
-                                AdaptationObserverInterface* overuse_observer,
-                                EncodedFrameObserver* encoder_timing,
-                                CpuOveruseMetricsObserver* metrics_observer)
-      : OveruseFrameDetector(options,
-                             overuse_observer,
-                             encoder_timing,
-                             metrics_observer) {}
-  ~OveruseFrameDetectorUnderTest() {}
-
-  using OveruseFrameDetector::CheckForOveruse;
-};
-
-class OveruseFrameDetectorTest : public ::testing::Test,
-                                 public CpuOveruseMetricsObserver {
- protected:
-  void SetUp() override {
-    observer_.reset(new MockCpuOveruseObserver());
-    options_.min_process_count = 0;
-    ReinitializeOveruseDetector();
-  }
-
-  void ReinitializeOveruseDetector() {
-    overuse_detector_.reset(new OveruseFrameDetectorUnderTest(
-        options_, observer_.get(), nullptr, this));
-  }
-
-  void OnEncodedFrameTimeMeasured(int encode_time_ms,
-                                  const CpuOveruseMetrics& metrics) override {
-    metrics_ = metrics;
-  }
-
-  int InitialUsage() {
-    return ((options_.low_encode_usage_threshold_percent +
-             options_.high_encode_usage_threshold_percent) / 2.0f) + 0.5;
-  }
-
-  void InsertAndSendFramesWithInterval(int num_frames,
-                                       int interval_us,
-                                       int width,
-                                       int height,
-                                       int delay_us) {
-    VideoFrame frame(I420Buffer::Create(width, height),
-                     webrtc::kVideoRotation_0, 0);
-    uint32_t timestamp = 0;
-    while (num_frames-- > 0) {
-      frame.set_timestamp(timestamp);
-      overuse_detector_->FrameCaptured(frame, rtc::TimeMicros());
-      clock_.AdvanceTimeMicros(delay_us);
-      overuse_detector_->FrameSent(timestamp, rtc::TimeMicros());
-      clock_.AdvanceTimeMicros(interval_us - delay_us);
-      timestamp += interval_us * 90 / 1000;
-    }
-  }
-
-  void ForceUpdate(int width, int height) {
-    // Insert one frame, wait a second and then put in another to force update
-    // the usage. From the tests where these are used, adding another sample
-    // doesn't affect the expected outcome (this is mainly to check initial
-    // values and whether the overuse detector has been reset or not).
-    InsertAndSendFramesWithInterval(2, rtc::kNumMicrosecsPerSec,
-                                    width, height, kFrameIntervalUs);
-  }
-  void TriggerOveruse(int num_times) {
-    const int kDelayUs = 32 * rtc::kNumMicrosecsPerMillisec;
-    for (int i = 0; i < num_times; ++i) {
-      InsertAndSendFramesWithInterval(
-          1000, kFrameIntervalUs, kWidth, kHeight, kDelayUs);
-      overuse_detector_->CheckForOveruse();
-    }
-  }
-
-  void TriggerUnderuse() {
-    const int kDelayUs1 = 5000;
-    const int kDelayUs2 = 6000;
-    InsertAndSendFramesWithInterval(
-        1300, kFrameIntervalUs, kWidth, kHeight, kDelayUs1);
-    InsertAndSendFramesWithInterval(
-        1, kFrameIntervalUs, kWidth, kHeight, kDelayUs2);
-    overuse_detector_->CheckForOveruse();
-  }
-
-  int UsagePercent() { return metrics_.encode_usage_percent; }
-
-  int64_t OveruseProcessingTimeLimitForFramerate(int fps) const {
-    int64_t frame_interval = rtc::kNumMicrosecsPerSec / fps;
-    int64_t max_processing_time_us =
-        (frame_interval * options_.high_encode_usage_threshold_percent) / 100;
-    return max_processing_time_us;
-  }
-
-  int64_t UnderuseProcessingTimeLimitForFramerate(int fps) const {
-    int64_t frame_interval = rtc::kNumMicrosecsPerSec / fps;
-    int64_t max_processing_time_us =
-        (frame_interval * options_.low_encode_usage_threshold_percent) / 100;
-    return max_processing_time_us;
-  }
-
-  CpuOveruseOptions options_;
-  rtc::ScopedFakeClock clock_;
-  std::unique_ptr<MockCpuOveruseObserver> observer_;
-  std::unique_ptr<OveruseFrameDetectorUnderTest> overuse_detector_;
-  CpuOveruseMetrics metrics_;
-
-  static const auto reason_ = AdaptationObserverInterface::AdaptReason::kCpu;
-};
-
-
-// UsagePercent() > high_encode_usage_threshold_percent => overuse.
-// UsagePercent() < low_encode_usage_threshold_percent => underuse.
-TEST_F(OveruseFrameDetectorTest, TriggerOveruse) {
-  // usage > high => overuse
-  EXPECT_CALL(*(observer_.get()), AdaptDown(reason_)).Times(1);
-  TriggerOveruse(options_.high_threshold_consecutive_count);
-}
-
-TEST_F(OveruseFrameDetectorTest, OveruseAndRecover) {
-  // usage > high => overuse
-  EXPECT_CALL(*(observer_.get()), AdaptDown(reason_)).Times(1);
-  TriggerOveruse(options_.high_threshold_consecutive_count);
-  // usage < low => underuse
-  EXPECT_CALL(*(observer_.get()), AdaptUp(reason_)).Times(testing::AtLeast(1));
-  TriggerUnderuse();
-}
-
-TEST_F(OveruseFrameDetectorTest, OveruseAndRecoverWithNoObserver) {
-  overuse_detector_.reset(new OveruseFrameDetectorUnderTest(
-      options_, nullptr, nullptr, this));
-  EXPECT_CALL(*(observer_.get()), AdaptDown(reason_)).Times(0);
-  TriggerOveruse(options_.high_threshold_consecutive_count);
-  EXPECT_CALL(*(observer_.get()), AdaptUp(reason_)).Times(0);
-  TriggerUnderuse();
-}
-
-TEST_F(OveruseFrameDetectorTest, DoubleOveruseAndRecover) {
-  EXPECT_CALL(*(observer_.get()), AdaptDown(reason_)).Times(2);
-  TriggerOveruse(options_.high_threshold_consecutive_count);
-  TriggerOveruse(options_.high_threshold_consecutive_count);
-  EXPECT_CALL(*(observer_.get()), AdaptUp(reason_)).Times(testing::AtLeast(1));
-  TriggerUnderuse();
-}
-
-TEST_F(OveruseFrameDetectorTest, TriggerUnderuseWithMinProcessCount) {
-  const int kProcessIntervalUs = 5 * rtc::kNumMicrosecsPerSec;
-  options_.min_process_count = 1;
-  CpuOveruseObserverImpl overuse_observer;
-  overuse_detector_.reset(new OveruseFrameDetectorUnderTest(
-      options_, &overuse_observer, nullptr, this));
-  InsertAndSendFramesWithInterval(
-      1200, kFrameIntervalUs, kWidth, kHeight, kProcessTimeUs);
-  overuse_detector_->CheckForOveruse();
-  EXPECT_EQ(0, overuse_observer.normaluse_);
-  clock_.AdvanceTimeMicros(kProcessIntervalUs);
-  overuse_detector_->CheckForOveruse();
-  EXPECT_EQ(1, overuse_observer.normaluse_);
-}
-
-TEST_F(OveruseFrameDetectorTest, ConstantOveruseGivesNoNormalUsage) {
-  EXPECT_CALL(*(observer_.get()), AdaptUp(reason_)).Times(0);
-  EXPECT_CALL(*(observer_.get()), AdaptDown(reason_)).Times(64);
-  for (size_t i = 0; i < 64; ++i) {
-    TriggerOveruse(options_.high_threshold_consecutive_count);
-  }
-}
-
-TEST_F(OveruseFrameDetectorTest, ConsecutiveCountTriggersOveruse) {
-  EXPECT_CALL(*(observer_.get()), AdaptDown(reason_)).Times(1);
-  options_.high_threshold_consecutive_count = 2;
-  ReinitializeOveruseDetector();
-  TriggerOveruse(2);
-}
-
-TEST_F(OveruseFrameDetectorTest, IncorrectConsecutiveCountTriggersNoOveruse) {
-  EXPECT_CALL(*(observer_.get()), AdaptDown(reason_)).Times(0);
-  options_.high_threshold_consecutive_count = 2;
-  ReinitializeOveruseDetector();
-  TriggerOveruse(1);
-}
-
-TEST_F(OveruseFrameDetectorTest, ProcessingUsage) {
-  InsertAndSendFramesWithInterval(
-      1000, kFrameIntervalUs, kWidth, kHeight, kProcessTimeUs);
-  EXPECT_EQ(kProcessTimeUs * 100 / kFrameIntervalUs, UsagePercent());
-}
-
-TEST_F(OveruseFrameDetectorTest, ResetAfterResolutionChange) {
-  ForceUpdate(kWidth, kHeight);
-  EXPECT_EQ(InitialUsage(), UsagePercent());
-  InsertAndSendFramesWithInterval(
-      1000, kFrameIntervalUs, kWidth, kHeight, kProcessTimeUs);
-  EXPECT_NE(InitialUsage(), UsagePercent());
-  // Verify reset (with new width/height).
-  ForceUpdate(kWidth, kHeight + 1);
-  EXPECT_EQ(InitialUsage(), UsagePercent());
-}
-
-TEST_F(OveruseFrameDetectorTest, ResetAfterFrameTimeout) {
-  ForceUpdate(kWidth, kHeight);
-  EXPECT_EQ(InitialUsage(), UsagePercent());
-  InsertAndSendFramesWithInterval(
-      1000, kFrameIntervalUs, kWidth, kHeight, kProcessTimeUs);
-  EXPECT_NE(InitialUsage(), UsagePercent());
-  InsertAndSendFramesWithInterval(
-      2, options_.frame_timeout_interval_ms *
-      rtc::kNumMicrosecsPerMillisec, kWidth, kHeight, kProcessTimeUs);
-  EXPECT_NE(InitialUsage(), UsagePercent());
-  // Verify reset.
-  InsertAndSendFramesWithInterval(
-      2, (options_.frame_timeout_interval_ms + 1) *
-      rtc::kNumMicrosecsPerMillisec, kWidth, kHeight, kProcessTimeUs);
-  ForceUpdate(kWidth, kHeight);
-  EXPECT_EQ(InitialUsage(), UsagePercent());
-}
-
-TEST_F(OveruseFrameDetectorTest, MinFrameSamplesBeforeUpdating) {
-  options_.min_frame_samples = 40;
-  ReinitializeOveruseDetector();
-  InsertAndSendFramesWithInterval(
-      40, kFrameIntervalUs, kWidth, kHeight, kProcessTimeUs);
-  EXPECT_EQ(InitialUsage(), UsagePercent());
-  // Pass time far enough to digest all previous samples.
-  clock_.AdvanceTimeMicros(rtc::kNumMicrosecsPerSec);
-  InsertAndSendFramesWithInterval(1, kFrameIntervalUs, kWidth, kHeight,
-                                  kProcessTimeUs);
-  // The last sample has not been processed here.
-  EXPECT_EQ(InitialUsage(), UsagePercent());
-
-  // Pass time far enough to digest all previous samples, 41 in total.
-  clock_.AdvanceTimeMicros(rtc::kNumMicrosecsPerSec);
-  InsertAndSendFramesWithInterval(
-      1, kFrameIntervalUs, kWidth, kHeight, kProcessTimeUs);
-  EXPECT_NE(InitialUsage(), UsagePercent());
-}
-
-TEST_F(OveruseFrameDetectorTest, InitialProcessingUsage) {
-  ForceUpdate(kWidth, kHeight);
-  EXPECT_EQ(InitialUsage(), UsagePercent());
-}
-
-TEST_F(OveruseFrameDetectorTest, MeasuresMultipleConcurrentSamples) {
-  EXPECT_CALL(*(observer_.get()), AdaptDown(reason_))
-      .Times(testing::AtLeast(1));
-  static const int kIntervalUs = 33 * rtc::kNumMicrosecsPerMillisec;
-  static const size_t kNumFramesEncodingDelay = 3;
-  VideoFrame frame(I420Buffer::Create(kWidth, kHeight),
-                   webrtc::kVideoRotation_0, 0);
-  for (size_t i = 0; i < 1000; ++i) {
-    // Unique timestamps.
-    frame.set_timestamp(static_cast<uint32_t>(i));
-    overuse_detector_->FrameCaptured(frame, rtc::TimeMicros());
-    clock_.AdvanceTimeMicros(kIntervalUs);
-    if (i > kNumFramesEncodingDelay) {
-      overuse_detector_->FrameSent(
-          static_cast<uint32_t>(i - kNumFramesEncodingDelay),
-          rtc::TimeMicros());
-    }
-    overuse_detector_->CheckForOveruse();
-  }
-}
-
-TEST_F(OveruseFrameDetectorTest, UpdatesExistingSamples) {
-  // >85% encoding time should trigger overuse.
-  EXPECT_CALL(*(observer_.get()), AdaptDown(reason_))
-      .Times(testing::AtLeast(1));
-  static const int kIntervalUs = 33 * rtc::kNumMicrosecsPerMillisec;
-  static const int kDelayUs = 30 * rtc::kNumMicrosecsPerMillisec;
-  VideoFrame frame(I420Buffer::Create(kWidth, kHeight),
-                   webrtc::kVideoRotation_0, 0);
-  uint32_t timestamp = 0;
-  for (size_t i = 0; i < 1000; ++i) {
-    frame.set_timestamp(timestamp);
-    overuse_detector_->FrameCaptured(frame, rtc::TimeMicros());
-    // Encode and send first parts almost instantly.
-    clock_.AdvanceTimeMicros(rtc::kNumMicrosecsPerMillisec);
-    overuse_detector_->FrameSent(timestamp, rtc::TimeMicros());
-    // Encode heavier part, resulting in >85% usage total.
-    clock_.AdvanceTimeMicros(kDelayUs - rtc::kNumMicrosecsPerMillisec);
-    overuse_detector_->FrameSent(timestamp, rtc::TimeMicros());
-    clock_.AdvanceTimeMicros(kIntervalUs - kDelayUs);
-    timestamp += kIntervalUs * 90 / 1000;
-    overuse_detector_->CheckForOveruse();
-  }
-}
-
-TEST_F(OveruseFrameDetectorTest, RunOnTqNormalUsage) {
-  rtc::TaskQueue queue("OveruseFrameDetectorTestQueue");
-
-  rtc::Event event(false, false);
-  queue.PostTask([this, &event] {
-    overuse_detector_->StartCheckForOveruse();
-    event.Set();
-  });
-  event.Wait(rtc::Event::kForever);
-
-  // Expect NormalUsage(). When called, stop the |overuse_detector_| and then
-  // set |event| to end the test.
-  EXPECT_CALL(*(observer_.get()), AdaptUp(reason_))
-      .WillOnce(InvokeWithoutArgs([this, &event] {
-        overuse_detector_->StopCheckForOveruse();
-        event.Set();
-      }));
-
-  queue.PostTask([this] {
-    const int kDelayUs1 = 5 * rtc::kNumMicrosecsPerMillisec;
-    const int kDelayUs2 = 6 * rtc::kNumMicrosecsPerMillisec;
-    InsertAndSendFramesWithInterval(1300, kFrameIntervalUs, kWidth, kHeight,
-                                    kDelayUs1);
-    InsertAndSendFramesWithInterval(1, kFrameIntervalUs, kWidth, kHeight,
-                                    kDelayUs2);
-  });
-
-  EXPECT_TRUE(event.Wait(10000));
-}
-
-TEST_F(OveruseFrameDetectorTest, MaxIntervalScalesWithFramerate) {
-  const int kCapturerMaxFrameRate = 30;
-  const int kEncodeMaxFrameRate = 20;  // Maximum fps the encoder can sustain.
-
-  // Trigger overuse.
-  int64_t frame_interval_us = rtc::kNumMicrosecsPerSec / kCapturerMaxFrameRate;
-  // Processing time just below over use limit given kEncodeMaxFrameRate.
-  int64_t processing_time_us =
-      (98 * OveruseProcessingTimeLimitForFramerate(kEncodeMaxFrameRate)) / 100;
-  EXPECT_CALL(*(observer_.get()), AdaptDown(reason_)).Times(1);
-  for (int i = 0; i < options_.high_threshold_consecutive_count; ++i) {
-    InsertAndSendFramesWithInterval(1200, frame_interval_us, kWidth, kHeight,
-                                    processing_time_us);
-    overuse_detector_->CheckForOveruse();
-  }
-
-  // Simulate frame rate reduction and normal usage.
-  frame_interval_us = rtc::kNumMicrosecsPerSec / kEncodeMaxFrameRate;
-  overuse_detector_->OnTargetFramerateUpdated(kEncodeMaxFrameRate);
-  EXPECT_CALL(*(observer_.get()), AdaptDown(reason_)).Times(0);
-  for (int i = 0; i < options_.high_threshold_consecutive_count; ++i) {
-    InsertAndSendFramesWithInterval(1200, frame_interval_us, kWidth, kHeight,
-                                    processing_time_us);
-    overuse_detector_->CheckForOveruse();
-  }
-
-  // Reduce processing time to trigger underuse.
-  processing_time_us =
-      (98 * UnderuseProcessingTimeLimitForFramerate(kEncodeMaxFrameRate)) / 100;
-  EXPECT_CALL(*(observer_.get()), AdaptUp(reason_)).Times(1);
-  InsertAndSendFramesWithInterval(1200, frame_interval_us, kWidth, kHeight,
-                                  processing_time_us);
-  overuse_detector_->CheckForOveruse();
-}
-
-TEST_F(OveruseFrameDetectorTest, RespectsMinFramerate) {
-  const int kMinFrameRate = 7;  // Minimum fps allowed by current detector impl.
-  overuse_detector_->OnTargetFramerateUpdated(kMinFrameRate);
-
-  // Normal usage just at the limit.
-  int64_t frame_interval_us = rtc::kNumMicrosecsPerSec / kMinFrameRate;
-  // Processing time just below over use limit given kEncodeMaxFrameRate.
-  int64_t processing_time_us =
-      (98 * OveruseProcessingTimeLimitForFramerate(kMinFrameRate)) / 100;
-  EXPECT_CALL(*(observer_.get()), AdaptDown(reason_)).Times(0);
-  for (int i = 0; i < options_.high_threshold_consecutive_count; ++i) {
-    InsertAndSendFramesWithInterval(1200, frame_interval_us, kWidth, kHeight,
-                                    processing_time_us);
-    overuse_detector_->CheckForOveruse();
-  }
-
-  // Over the limit to overuse.
-  processing_time_us =
-      (102 * OveruseProcessingTimeLimitForFramerate(kMinFrameRate)) / 100;
-  EXPECT_CALL(*(observer_.get()), AdaptDown(reason_)).Times(1);
-  for (int i = 0; i < options_.high_threshold_consecutive_count; ++i) {
-    InsertAndSendFramesWithInterval(1200, frame_interval_us, kWidth, kHeight,
-                                    processing_time_us);
-    overuse_detector_->CheckForOveruse();
-  }
-
-  // Reduce input frame rate. Should still trigger overuse.
-  overuse_detector_->OnTargetFramerateUpdated(kMinFrameRate - 1);
-  EXPECT_CALL(*(observer_.get()), AdaptDown(reason_)).Times(1);
-  for (int i = 0; i < options_.high_threshold_consecutive_count; ++i) {
-    InsertAndSendFramesWithInterval(1200, frame_interval_us, kWidth, kHeight,
-                                    processing_time_us);
-    overuse_detector_->CheckForOveruse();
-  }
-}
-
-TEST_F(OveruseFrameDetectorTest, LimitsMaxFrameInterval) {
-  const int kMaxFrameRate = 20;
-  overuse_detector_->OnTargetFramerateUpdated(kMaxFrameRate);
-  int64_t frame_interval_us = rtc::kNumMicrosecsPerSec / kMaxFrameRate;
-  // Maximum frame interval allowed is 35% above ideal.
-  int64_t max_frame_interval_us = (135 * frame_interval_us) / 100;
-  // Maximum processing time, without triggering overuse, allowed with the above
-  // frame interval.
-  int64_t max_processing_time_us =
-      (max_frame_interval_us * options_.high_encode_usage_threshold_percent) /
-      100;
-
-  // Processing time just below overuse limit given kMaxFrameRate.
-  int64_t processing_time_us = (98 * max_processing_time_us) / 100;
-  EXPECT_CALL(*(observer_.get()), AdaptDown(reason_)).Times(0);
-  for (int i = 0; i < options_.high_threshold_consecutive_count; ++i) {
-    InsertAndSendFramesWithInterval(1200, max_frame_interval_us, kWidth,
-                                    kHeight, processing_time_us);
-    overuse_detector_->CheckForOveruse();
-  }
-
-  // Go above limit, trigger overuse.
-  processing_time_us = (102 * max_processing_time_us) / 100;
-  EXPECT_CALL(*(observer_.get()), AdaptDown(reason_)).Times(1);
-  for (int i = 0; i < options_.high_threshold_consecutive_count; ++i) {
-    InsertAndSendFramesWithInterval(1200, max_frame_interval_us, kWidth,
-                                    kHeight, processing_time_us);
-    overuse_detector_->CheckForOveruse();
-  }
-
-  // Increase frame interval, should still trigger overuse.
-  max_frame_interval_us *= 2;
-  EXPECT_CALL(*(observer_.get()), AdaptDown(reason_)).Times(1);
-  for (int i = 0; i < options_.high_threshold_consecutive_count; ++i) {
-    InsertAndSendFramesWithInterval(1200, max_frame_interval_us, kWidth,
-                                    kHeight, processing_time_us);
-    overuse_detector_->CheckForOveruse();
-  }
-}
-
-}  // namespace webrtc
diff --git a/video/payload_router.cc b/video/payload_router.cc
deleted file mode 100644
index eabde40..0000000
--- a/video/payload_router.cc
+++ /dev/null
@@ -1,187 +0,0 @@
-/*
- *  Copyright (c) 2015 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/video/payload_router.h"
-
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
-#include "webrtc/modules/video_coding/include/video_codec_interface.h"
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-
-namespace {
-// Map information from info into rtp.
-void CopyCodecSpecific(const CodecSpecificInfo* info, RTPVideoHeader* rtp) {
-  RTC_DCHECK(info);
-  switch (info->codecType) {
-    case kVideoCodecVP8: {
-      rtp->codec = kRtpVideoVp8;
-      rtp->codecHeader.VP8.InitRTPVideoHeaderVP8();
-      rtp->codecHeader.VP8.pictureId = info->codecSpecific.VP8.pictureId;
-      rtp->codecHeader.VP8.nonReference = info->codecSpecific.VP8.nonReference;
-      rtp->codecHeader.VP8.temporalIdx = info->codecSpecific.VP8.temporalIdx;
-      rtp->codecHeader.VP8.layerSync = info->codecSpecific.VP8.layerSync;
-      rtp->codecHeader.VP8.tl0PicIdx = info->codecSpecific.VP8.tl0PicIdx;
-      rtp->codecHeader.VP8.keyIdx = info->codecSpecific.VP8.keyIdx;
-      rtp->simulcastIdx = info->codecSpecific.VP8.simulcastIdx;
-      return;
-    }
-    case kVideoCodecVP9: {
-      rtp->codec = kRtpVideoVp9;
-      rtp->codecHeader.VP9.InitRTPVideoHeaderVP9();
-      rtp->codecHeader.VP9.inter_pic_predicted =
-          info->codecSpecific.VP9.inter_pic_predicted;
-      rtp->codecHeader.VP9.flexible_mode =
-          info->codecSpecific.VP9.flexible_mode;
-      rtp->codecHeader.VP9.ss_data_available =
-          info->codecSpecific.VP9.ss_data_available;
-      rtp->codecHeader.VP9.picture_id = info->codecSpecific.VP9.picture_id;
-      rtp->codecHeader.VP9.tl0_pic_idx = info->codecSpecific.VP9.tl0_pic_idx;
-      rtp->codecHeader.VP9.temporal_idx = info->codecSpecific.VP9.temporal_idx;
-      rtp->codecHeader.VP9.spatial_idx = info->codecSpecific.VP9.spatial_idx;
-      rtp->codecHeader.VP9.temporal_up_switch =
-          info->codecSpecific.VP9.temporal_up_switch;
-      rtp->codecHeader.VP9.inter_layer_predicted =
-          info->codecSpecific.VP9.inter_layer_predicted;
-      rtp->codecHeader.VP9.gof_idx = info->codecSpecific.VP9.gof_idx;
-      rtp->codecHeader.VP9.num_spatial_layers =
-          info->codecSpecific.VP9.num_spatial_layers;
-
-      if (info->codecSpecific.VP9.ss_data_available) {
-        rtp->codecHeader.VP9.spatial_layer_resolution_present =
-            info->codecSpecific.VP9.spatial_layer_resolution_present;
-        if (info->codecSpecific.VP9.spatial_layer_resolution_present) {
-          for (size_t i = 0; i < info->codecSpecific.VP9.num_spatial_layers;
-               ++i) {
-            rtp->codecHeader.VP9.width[i] = info->codecSpecific.VP9.width[i];
-            rtp->codecHeader.VP9.height[i] = info->codecSpecific.VP9.height[i];
-          }
-        }
-        rtp->codecHeader.VP9.gof.CopyGofInfoVP9(info->codecSpecific.VP9.gof);
-      }
-
-      rtp->codecHeader.VP9.num_ref_pics = info->codecSpecific.VP9.num_ref_pics;
-      for (int i = 0; i < info->codecSpecific.VP9.num_ref_pics; ++i)
-        rtp->codecHeader.VP9.pid_diff[i] = info->codecSpecific.VP9.p_diff[i];
-      return;
-    }
-    case kVideoCodecH264:
-      rtp->codec = kRtpVideoH264;
-      rtp->codecHeader.H264.packetization_mode =
-          info->codecSpecific.H264.packetization_mode;
-      return;
-    case kVideoCodecGeneric:
-      rtp->codec = kRtpVideoGeneric;
-      rtp->simulcastIdx = info->codecSpecific.generic.simulcast_idx;
-      return;
-    default:
-      return;
-  }
-}
-
-}  // namespace
-
-PayloadRouter::PayloadRouter(const std::vector<RtpRtcp*>& rtp_modules,
-                             int payload_type)
-    : active_(false),
-      rtp_modules_(rtp_modules),
-      payload_type_(payload_type) {
-}
-
-PayloadRouter::~PayloadRouter() {}
-
-void PayloadRouter::SetActive(bool active) {
-  rtc::CritScope lock(&crit_);
-  if (active_ == active)
-    return;
-  active_ = active;
-
-  for (auto& module : rtp_modules_) {
-    module->SetSendingStatus(active_);
-    module->SetSendingMediaStatus(active_);
-  }
-}
-
-bool PayloadRouter::IsActive() {
-  rtc::CritScope lock(&crit_);
-  return active_ && !rtp_modules_.empty();
-}
-
-EncodedImageCallback::Result PayloadRouter::OnEncodedImage(
-    const EncodedImage& encoded_image,
-    const CodecSpecificInfo* codec_specific_info,
-    const RTPFragmentationHeader* fragmentation) {
-  rtc::CritScope lock(&crit_);
-  RTC_DCHECK(!rtp_modules_.empty());
-  if (!active_)
-    return Result(Result::ERROR_SEND_FAILED);
-
-  RTPVideoHeader rtp_video_header;
-  memset(&rtp_video_header, 0, sizeof(RTPVideoHeader));
-  if (codec_specific_info)
-    CopyCodecSpecific(codec_specific_info, &rtp_video_header);
-  rtp_video_header.rotation = encoded_image.rotation_;
-  rtp_video_header.content_type = encoded_image.content_type_;
-  if (encoded_image.timing_.flags != TimingFrameFlags::kInvalid) {
-    rtp_video_header.video_timing.encode_start_delta_ms =
-        VideoSendTiming::GetDeltaCappedMs(
-            encoded_image.capture_time_ms_,
-            encoded_image.timing_.encode_start_ms);
-    rtp_video_header.video_timing.encode_finish_delta_ms =
-        VideoSendTiming::GetDeltaCappedMs(
-            encoded_image.capture_time_ms_,
-            encoded_image.timing_.encode_finish_ms);
-    rtp_video_header.video_timing.packetization_finish_delta_ms = 0;
-    rtp_video_header.video_timing.pacer_exit_delta_ms = 0;
-    rtp_video_header.video_timing.network_timstamp_delta_ms = 0;
-    rtp_video_header.video_timing.network2_timstamp_delta_ms = 0;
-  }
-  rtp_video_header.video_timing.flags = encoded_image.timing_.flags;
-  rtp_video_header.playout_delay = encoded_image.playout_delay_;
-
-  int stream_index = rtp_video_header.simulcastIdx;
-  RTC_DCHECK_LT(stream_index, rtp_modules_.size());
-  uint32_t frame_id;
-  bool send_result = rtp_modules_[stream_index]->SendOutgoingData(
-      encoded_image._frameType, payload_type_, encoded_image._timeStamp,
-      encoded_image.capture_time_ms_, encoded_image._buffer,
-      encoded_image._length, fragmentation, &rtp_video_header, &frame_id);
-  if (!send_result)
-    return Result(Result::ERROR_SEND_FAILED);
-
-  return Result(Result::OK, frame_id);
-}
-
-void PayloadRouter::OnBitrateAllocationUpdated(
-    const BitrateAllocation& bitrate) {
-  rtc::CritScope lock(&crit_);
-  if (IsActive()) {
-    if (rtp_modules_.size() == 1) {
-      // If spatial scalability is enabled, it is covered by a single stream.
-      rtp_modules_[0]->SetVideoBitrateAllocation(bitrate);
-    } else {
-      // Simulcast is in use, split the BitrateAllocation into one struct per
-      // rtp stream, moving over the temporal layer allocation.
-      for (size_t si = 0; si < rtp_modules_.size(); ++si) {
-        // Don't send empty TargetBitrate messages on streams not being relayed.
-        if (bitrate.GetSpatialLayerSum(si) == 0)
-          break;
-
-        BitrateAllocation layer_bitrate;
-        for (int tl = 0; tl < kMaxTemporalStreams; ++tl)
-          layer_bitrate.SetBitrate(0, tl, bitrate.GetBitrate(si, tl));
-        rtp_modules_[si]->SetVideoBitrateAllocation(layer_bitrate);
-      }
-    }
-  }
-}
-
-}  // namespace webrtc
diff --git a/video/payload_router.h b/video/payload_router.h
deleted file mode 100644
index 082ba36..0000000
--- a/video/payload_router.h
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- *  Copyright (c) 2015 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_VIDEO_PAYLOAD_ROUTER_H_
-#define WEBRTC_VIDEO_PAYLOAD_ROUTER_H_
-
-#include <vector>
-
-#include "webrtc/api/video_codecs/video_encoder.h"
-#include "webrtc/common_types.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/thread_annotations.h"
-
-namespace webrtc {
-
-class RTPFragmentationHeader;
-class RtpRtcp;
-struct RTPVideoHeader;
-
-// PayloadRouter routes outgoing data to the correct sending RTP module, based
-// on the simulcast layer in RTPVideoHeader.
-class PayloadRouter : public EncodedImageCallback {
- public:
-  // Rtp modules are assumed to be sorted in simulcast index order.
-  PayloadRouter(const std::vector<RtpRtcp*>& rtp_modules,
-                int payload_type);
-  ~PayloadRouter();
-
-  // PayloadRouter will only route packets if being active, all packets will be
-  // dropped otherwise.
-  void SetActive(bool active);
-  bool IsActive();
-
-  // Implements EncodedImageCallback.
-  // Returns 0 if the packet was routed / sent, -1 otherwise.
-  EncodedImageCallback::Result OnEncodedImage(
-      const EncodedImage& encoded_image,
-      const CodecSpecificInfo* codec_specific_info,
-      const RTPFragmentationHeader* fragmentation) override;
-
-  void OnBitrateAllocationUpdated(const BitrateAllocation& bitrate);
-
- private:
-  void UpdateModuleSendingState() RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_);
-
-  rtc::CriticalSection crit_;
-  bool active_ RTC_GUARDED_BY(crit_);
-
-  // Rtp modules are assumed to be sorted in simulcast index order. Not owned.
-  const std::vector<RtpRtcp*> rtp_modules_;
-  const int payload_type_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(PayloadRouter);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_VIDEO_PAYLOAD_ROUTER_H_
diff --git a/video/payload_router_unittest.cc b/video/payload_router_unittest.cc
deleted file mode 100644
index 2293a24..0000000
--- a/video/payload_router_unittest.cc
+++ /dev/null
@@ -1,223 +0,0 @@
-/*
- *  Copyright (c) 2015 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 <memory>
-
-#include "webrtc/call/video_config.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp.h"
-#include "webrtc/modules/rtp_rtcp/mocks/mock_rtp_rtcp.h"
-#include "webrtc/modules/video_coding/include/video_codec_interface.h"
-#include "webrtc/test/gmock.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/video/payload_router.h"
-
-using ::testing::_;
-using ::testing::AnyNumber;
-using ::testing::NiceMock;
-using ::testing::Return;
-
-namespace webrtc {
-
-TEST(PayloadRouterTest, SendOnOneModule) {
-  NiceMock<MockRtpRtcp> rtp;
-  std::vector<RtpRtcp*> modules(1, &rtp);
-  std::vector<VideoStream> streams(1);
-
-  uint8_t payload = 'a';
-  int8_t payload_type = 96;
-  EncodedImage encoded_image;
-  encoded_image._timeStamp = 1;
-  encoded_image.capture_time_ms_ = 2;
-  encoded_image._frameType = kVideoFrameKey;
-  encoded_image._buffer = &payload;
-  encoded_image._length = 1;
-
-  PayloadRouter payload_router(modules, payload_type);
-
-  EXPECT_CALL(rtp, SendOutgoingData(encoded_image._frameType, payload_type,
-                                    encoded_image._timeStamp,
-                                    encoded_image.capture_time_ms_, &payload,
-                                    encoded_image._length, nullptr, _, _))
-      .Times(0);
-  EXPECT_NE(
-      EncodedImageCallback::Result::OK,
-      payload_router.OnEncodedImage(encoded_image, nullptr, nullptr).error);
-
-  payload_router.SetActive(true);
-  EXPECT_CALL(rtp, SendOutgoingData(encoded_image._frameType, payload_type,
-                                    encoded_image._timeStamp,
-                                    encoded_image.capture_time_ms_, &payload,
-                                    encoded_image._length, nullptr, _, _))
-      .Times(1)
-      .WillOnce(Return(true));
-  EXPECT_EQ(
-      EncodedImageCallback::Result::OK,
-      payload_router.OnEncodedImage(encoded_image, nullptr, nullptr).error);
-
-  payload_router.SetActive(false);
-  EXPECT_CALL(rtp, SendOutgoingData(encoded_image._frameType, payload_type,
-                                    encoded_image._timeStamp,
-                                    encoded_image.capture_time_ms_, &payload,
-                                    encoded_image._length, nullptr, _, _))
-      .Times(0);
-  EXPECT_NE(
-      EncodedImageCallback::Result::OK,
-      payload_router.OnEncodedImage(encoded_image, nullptr, nullptr).error);
-
-  payload_router.SetActive(true);
-  EXPECT_CALL(rtp, SendOutgoingData(encoded_image._frameType, payload_type,
-                                    encoded_image._timeStamp,
-                                    encoded_image.capture_time_ms_, &payload,
-                                    encoded_image._length, nullptr, _, _))
-      .Times(1)
-      .WillOnce(Return(true));
-  EXPECT_EQ(
-      EncodedImageCallback::Result::OK,
-      payload_router.OnEncodedImage(encoded_image, nullptr, nullptr).error);
-}
-
-TEST(PayloadRouterTest, SendSimulcast) {
-  NiceMock<MockRtpRtcp> rtp_1;
-  NiceMock<MockRtpRtcp> rtp_2;
-  std::vector<RtpRtcp*> modules;
-  modules.push_back(&rtp_1);
-  modules.push_back(&rtp_2);
-  std::vector<VideoStream> streams(2);
-
-  int8_t payload_type = 96;
-  uint8_t payload = 'a';
-  EncodedImage encoded_image;
-  encoded_image._timeStamp = 1;
-  encoded_image.capture_time_ms_ = 2;
-  encoded_image._frameType = kVideoFrameKey;
-  encoded_image._buffer = &payload;
-  encoded_image._length = 1;
-
-  PayloadRouter payload_router(modules, payload_type);
-
-  CodecSpecificInfo codec_info_1;
-  memset(&codec_info_1, 0, sizeof(CodecSpecificInfo));
-  codec_info_1.codecType = kVideoCodecVP8;
-  codec_info_1.codecSpecific.VP8.simulcastIdx = 0;
-
-  payload_router.SetActive(true);
-  EXPECT_CALL(rtp_1, SendOutgoingData(encoded_image._frameType, payload_type,
-                                      encoded_image._timeStamp,
-                                      encoded_image.capture_time_ms_, &payload,
-                                      encoded_image._length, nullptr, _, _))
-      .Times(1)
-      .WillOnce(Return(true));
-  EXPECT_CALL(rtp_2, SendOutgoingData(_, _, _, _, _, _, _, _, _)).Times(0);
-  EXPECT_EQ(EncodedImageCallback::Result::OK,
-            payload_router.OnEncodedImage(encoded_image, &codec_info_1, nullptr)
-                .error);
-
-  CodecSpecificInfo codec_info_2;
-  memset(&codec_info_2, 0, sizeof(CodecSpecificInfo));
-  codec_info_2.codecType = kVideoCodecVP8;
-  codec_info_2.codecSpecific.VP8.simulcastIdx = 1;
-
-  EXPECT_CALL(rtp_2, SendOutgoingData(encoded_image._frameType, payload_type,
-                                      encoded_image._timeStamp,
-                                      encoded_image.capture_time_ms_, &payload,
-                                      encoded_image._length, nullptr, _, _))
-      .Times(1)
-      .WillOnce(Return(true));
-  EXPECT_CALL(rtp_1, SendOutgoingData(_, _, _, _, _, _, _, _, _))
-      .Times(0);
-  EXPECT_EQ(EncodedImageCallback::Result::OK,
-            payload_router.OnEncodedImage(encoded_image, &codec_info_2, nullptr)
-                .error);
-
-  // Inactive.
-  payload_router.SetActive(false);
-  EXPECT_CALL(rtp_1, SendOutgoingData(_, _, _, _, _, _, _, _, _))
-      .Times(0);
-  EXPECT_CALL(rtp_2, SendOutgoingData(_, _, _, _, _, _, _, _, _))
-      .Times(0);
-  EXPECT_NE(EncodedImageCallback::Result::OK,
-            payload_router.OnEncodedImage(encoded_image, &codec_info_1, nullptr)
-                .error);
-  EXPECT_NE(EncodedImageCallback::Result::OK,
-            payload_router.OnEncodedImage(encoded_image, &codec_info_2, nullptr)
-                .error);
-}
-
-TEST(PayloadRouterTest, SimulcastTargetBitrate) {
-  NiceMock<MockRtpRtcp> rtp_1;
-  NiceMock<MockRtpRtcp> rtp_2;
-  std::vector<RtpRtcp*> modules;
-  modules.push_back(&rtp_1);
-  modules.push_back(&rtp_2);
-  PayloadRouter payload_router(modules, 42);
-  payload_router.SetActive(true);
-
-  BitrateAllocation bitrate;
-  bitrate.SetBitrate(0, 0, 10000);
-  bitrate.SetBitrate(0, 1, 20000);
-  bitrate.SetBitrate(1, 0, 40000);
-  bitrate.SetBitrate(1, 1, 80000);
-
-  BitrateAllocation layer0_bitrate;
-  layer0_bitrate.SetBitrate(0, 0, 10000);
-  layer0_bitrate.SetBitrate(0, 1, 20000);
-
-  BitrateAllocation layer1_bitrate;
-  layer1_bitrate.SetBitrate(0, 0, 40000);
-  layer1_bitrate.SetBitrate(0, 1, 80000);
-
-  EXPECT_CALL(rtp_1, SetVideoBitrateAllocation(layer0_bitrate)).Times(1);
-  EXPECT_CALL(rtp_2, SetVideoBitrateAllocation(layer1_bitrate)).Times(1);
-
-  payload_router.OnBitrateAllocationUpdated(bitrate);
-}
-
-TEST(PayloadRouterTest, SimulcastTargetBitrateWithInactiveStream) {
-  // Set up two active rtp modules.
-  NiceMock<MockRtpRtcp> rtp_1;
-  NiceMock<MockRtpRtcp> rtp_2;
-  std::vector<RtpRtcp*> modules;
-  modules.push_back(&rtp_1);
-  modules.push_back(&rtp_2);
-  PayloadRouter payload_router(modules, 42);
-  payload_router.SetActive(true);
-
-  // Create bitrate allocation with bitrate only for the first stream.
-  BitrateAllocation bitrate;
-  bitrate.SetBitrate(0, 0, 10000);
-  bitrate.SetBitrate(0, 1, 20000);
-
-  // Expect only the first rtp module to be asked to send a TargetBitrate
-  // message. (No target bitrate with 0bps sent from the second one.)
-  EXPECT_CALL(rtp_1, SetVideoBitrateAllocation(bitrate)).Times(1);
-  EXPECT_CALL(rtp_2, SetVideoBitrateAllocation(_)).Times(0);
-
-  payload_router.OnBitrateAllocationUpdated(bitrate);
-}
-
-TEST(PayloadRouterTest, SvcTargetBitrate) {
-  NiceMock<MockRtpRtcp> rtp_1;
-  std::vector<RtpRtcp*> modules;
-  modules.push_back(&rtp_1);
-  PayloadRouter payload_router(modules, 42);
-  payload_router.SetActive(true);
-
-  BitrateAllocation bitrate;
-  bitrate.SetBitrate(0, 0, 10000);
-  bitrate.SetBitrate(0, 1, 20000);
-  bitrate.SetBitrate(1, 0, 40000);
-  bitrate.SetBitrate(1, 1, 80000);
-
-  EXPECT_CALL(rtp_1, SetVideoBitrateAllocation(bitrate)).Times(1);
-
-  payload_router.OnBitrateAllocationUpdated(bitrate);
-}
-
-}  // namespace webrtc
diff --git a/video/picture_id_tests.cc b/video/picture_id_tests.cc
deleted file mode 100644
index 0c83796..0000000
--- a/video/picture_id_tests.cc
+++ /dev/null
@@ -1,356 +0,0 @@
-/*
- *  Copyright (c) 2013 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/media/engine/internalencoderfactory.h"
-#include "webrtc/media/engine/simulcast_encoder_adapter.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_format.h"
-#include "webrtc/modules/video_coding/sequence_number_util.h"
-#include "webrtc/test/call_test.h"
-
-namespace webrtc {
-
-const int kFrameMaxWidth = 1280;
-const int kFrameMaxHeight = 720;
-const int kFrameRate = 30;
-const int kMaxSecondsLost = 5;
-const int kMaxFramesLost = kFrameRate * kMaxSecondsLost;
-const int kMinPacketsToObserve = 10;
-const int kEncoderBitrateBps = 100000;
-const uint32_t kPictureIdWraparound = (1 << 15);
-
-class PictureIdObserver : public test::RtpRtcpObserver {
- public:
-  PictureIdObserver()
-      : test::RtpRtcpObserver(test::CallTest::kDefaultTimeoutMs),
-        max_expected_picture_id_gap_(0),
-        num_ssrcs_to_observe_(1) {}
-
-  void SetExpectedSsrcs(size_t num_expected_ssrcs) {
-    rtc::CritScope lock(&crit_);
-    num_ssrcs_to_observe_ = num_expected_ssrcs;
-  }
-
-  void ResetObservedSsrcs() {
-    rtc::CritScope lock(&crit_);
-    // Do not clear the timestamp and picture_id, to ensure that we check
-    // consistency between reinits and recreations.
-    num_packets_sent_.clear();
-    observed_ssrcs_.clear();
-  }
-
-  void SetMaxExpectedPictureIdGap(int max_expected_picture_id_gap) {
-    rtc::CritScope lock(&crit_);
-    max_expected_picture_id_gap_ = max_expected_picture_id_gap;
-  }
-
- private:
-  Action OnSendRtp(const uint8_t* packet, size_t length) override {
-    rtc::CritScope lock(&crit_);
-
-    // RTP header.
-    RTPHeader header;
-    EXPECT_TRUE(parser_->Parse(packet, length, &header));
-    const uint32_t timestamp = header.timestamp;
-    const uint32_t ssrc = header.ssrc;
-
-    const bool known_ssrc = (ssrc == test::CallTest::kVideoSendSsrcs[0] ||
-                             ssrc == test::CallTest::kVideoSendSsrcs[1] ||
-                             ssrc == test::CallTest::kVideoSendSsrcs[2]);
-    EXPECT_TRUE(known_ssrc) << "Unknown SSRC sent.";
-
-    const bool is_padding =
-        (length == header.headerLength + header.paddingLength);
-    if (is_padding) {
-      return SEND_PACKET;
-    }
-
-    // VP8 header.
-    std::unique_ptr<RtpDepacketizer> depacketizer(
-        RtpDepacketizer::Create(kRtpVideoVp8));
-    RtpDepacketizer::ParsedPayload parsed_payload;
-    EXPECT_TRUE(depacketizer->Parse(
-        &parsed_payload, &packet[header.headerLength],
-        length - header.headerLength - header.paddingLength));
-    const uint16_t picture_id =
-        parsed_payload.type.Video.codecHeader.VP8.pictureId;
-
-    // If this is the first packet, we have nothing to compare to.
-    if (last_observed_timestamp_.find(ssrc) == last_observed_timestamp_.end()) {
-      last_observed_timestamp_[ssrc] = timestamp;
-      last_observed_picture_id_[ssrc] = picture_id;
-      ++num_packets_sent_[ssrc];
-
-      return SEND_PACKET;
-    }
-
-    // Verify continuity and monotonicity of picture_id sequence.
-    if (last_observed_timestamp_[ssrc] == timestamp) {
-      // Packet belongs to same frame as before.
-      EXPECT_EQ(last_observed_picture_id_[ssrc], picture_id);
-    } else {
-      // Packet is a new frame.
-
-      // Picture id should be increasing.
-      const bool picture_id_is_increasing =
-          AheadOf<uint16_t, kPictureIdWraparound>(
-              picture_id, last_observed_picture_id_[ssrc]);
-      EXPECT_TRUE(picture_id_is_increasing);
-
-      // Picture id should not increase more than expected.
-      const int picture_id_diff = ForwardDiff<uint16_t, kPictureIdWraparound>(
-          last_observed_picture_id_[ssrc], picture_id);
-      EXPECT_LE(picture_id_diff - 1, max_expected_picture_id_gap_);
-    }
-    last_observed_timestamp_[ssrc] = timestamp;
-    last_observed_picture_id_[ssrc] = picture_id;
-
-    // Pass the test when enough media packets have been received
-    // on all streams.
-    if (++num_packets_sent_[ssrc] >= kMinPacketsToObserve &&
-        observed_ssrcs_.find(ssrc) == observed_ssrcs_.end()) {
-      observed_ssrcs_.insert(ssrc);
-      if (observed_ssrcs_.size() == num_ssrcs_to_observe_) {
-        observation_complete_.Set();
-      }
-    }
-
-    return SEND_PACKET;
-  }
-
-  rtc::CriticalSection crit_;
-  std::map<uint32_t, uint32_t> last_observed_timestamp_ RTC_GUARDED_BY(crit_);
-  std::map<uint32_t, uint16_t> last_observed_picture_id_ RTC_GUARDED_BY(crit_);
-  std::map<uint32_t, size_t> num_packets_sent_ RTC_GUARDED_BY(crit_);
-  int max_expected_picture_id_gap_ RTC_GUARDED_BY(crit_);
-  size_t num_ssrcs_to_observe_ RTC_GUARDED_BY(crit_);
-  std::set<uint32_t> observed_ssrcs_ RTC_GUARDED_BY(crit_);
-};
-
-class PictureIdTest : public test::CallTest {
- public:
-  PictureIdTest() {}
-
-  virtual ~PictureIdTest() {
-    EXPECT_EQ(nullptr, video_send_stream_);
-    EXPECT_TRUE(video_receive_streams_.empty());
-
-    task_queue_.SendTask([this]() {
-      Stop();
-      DestroyStreams();
-      send_transport_.reset();
-      receive_transport_.reset();
-      DestroyCalls();
-    });
-  }
-
-  void SetupEncoder(VideoEncoder* encoder);
-  void TestPictureIdContinuousAfterReconfigure(
-      const std::vector<int>& ssrc_counts);
-  void TestPictureIdIncreaseAfterRecreateStreams(
-      const std::vector<int>& ssrc_counts);
-
- private:
-  PictureIdObserver observer;
-};
-
-// Use a special stream factory to ensure that all simulcast streams are being
-// sent.
-class VideoStreamFactory
-    : public VideoEncoderConfig::VideoStreamFactoryInterface {
- public:
-  VideoStreamFactory() = default;
-
- private:
-  std::vector<VideoStream> CreateEncoderStreams(
-      int width,
-      int height,
-      const VideoEncoderConfig& encoder_config) override {
-    std::vector<VideoStream> streams =
-        test::CreateVideoStreams(width, height, encoder_config);
-
-    if (encoder_config.number_of_streams > 1) {
-      RTC_DCHECK_EQ(3, encoder_config.number_of_streams);
-
-      for (size_t i = 0; i < encoder_config.number_of_streams; ++i) {
-        streams[i].min_bitrate_bps = kEncoderBitrateBps;
-        streams[i].target_bitrate_bps = kEncoderBitrateBps;
-        streams[i].max_bitrate_bps = kEncoderBitrateBps;
-      }
-
-      // test::CreateVideoStreams does not return frame sizes for the lower
-      // streams that are accepted by VP8Impl::InitEncode.
-      // TODO(brandtr): Fix the problem in test::CreateVideoStreams, rather
-      // than overriding the values here.
-      streams[1].width = streams[2].width / 2;
-      streams[1].height = streams[2].height / 2;
-      streams[0].width = streams[1].width / 2;
-      streams[0].height = streams[1].height / 2;
-    } else {
-      // Use the same total bitrates when sending a single stream to avoid
-      // lowering the bitrate estimate and requiring a subsequent rampup.
-      streams[0].min_bitrate_bps = 3 * kEncoderBitrateBps;
-      streams[0].target_bitrate_bps = 3 * kEncoderBitrateBps;
-      streams[0].max_bitrate_bps = 3 * kEncoderBitrateBps;
-    }
-
-    return streams;
-  }
-};
-
-void PictureIdTest::SetupEncoder(VideoEncoder* encoder) {
-  task_queue_.SendTask([this, &encoder]() {
-    Call::Config config(event_log_.get());
-    CreateCalls(config, config);
-
-    send_transport_.reset(new test::PacketTransport(
-        &task_queue_, sender_call_.get(), &observer,
-        test::PacketTransport::kSender, payload_type_map_,
-        FakeNetworkPipe::Config()));
-
-    CreateSendConfig(kNumSsrcs, 0, 0, send_transport_.get());
-    video_send_config_.encoder_settings.encoder = encoder;
-    video_send_config_.encoder_settings.payload_name = "VP8";
-    video_encoder_config_.video_stream_factory =
-        new rtc::RefCountedObject<VideoStreamFactory>();
-    video_encoder_config_.number_of_streams = 1;
-  });
-}
-
-void PictureIdTest::TestPictureIdContinuousAfterReconfigure(
-    const std::vector<int>& ssrc_counts) {
-  task_queue_.SendTask([this]() {
-    CreateVideoStreams();
-    CreateFrameGeneratorCapturer(kFrameRate, kFrameMaxWidth, kFrameMaxHeight);
-
-    // Initial test with a single stream.
-    Start();
-  });
-
-  EXPECT_TRUE(observer.Wait()) << "Timed out waiting for packets.";
-
-  // Reconfigure VideoEncoder and test picture id increase.
-  // Expect continously increasing picture id, equivalent to no gaps.
-  observer.SetMaxExpectedPictureIdGap(0);
-  for (int ssrc_count : ssrc_counts) {
-    video_encoder_config_.number_of_streams = ssrc_count;
-    observer.SetExpectedSsrcs(ssrc_count);
-    observer.ResetObservedSsrcs();
-    // Make sure the picture_id sequence is continuous on reinit and recreate.
-    task_queue_.SendTask([this]() {
-      video_send_stream_->ReconfigureVideoEncoder(video_encoder_config_.Copy());
-    });
-    EXPECT_TRUE(observer.Wait()) << "Timed out waiting for packets.";
-  }
-
-  task_queue_.SendTask([this]() {
-    Stop();
-    DestroyStreams();
-    send_transport_.reset();
-    receive_transport_.reset();
-    DestroyCalls();
-  });
-}
-
-void PictureIdTest::TestPictureIdIncreaseAfterRecreateStreams(
-    const std::vector<int>& ssrc_counts) {
-  task_queue_.SendTask([this]() {
-    CreateVideoStreams();
-    CreateFrameGeneratorCapturer(kFrameRate, kFrameMaxWidth, kFrameMaxHeight);
-
-    // Initial test with a single stream.
-    Start();
-  });
-
-  EXPECT_TRUE(observer.Wait()) << "Timed out waiting for packets.";
-
-  // Recreate VideoSendStream and test picture id increase.
-  // When the VideoSendStream is destroyed, any frames still in queue is lost
-  // with it, therefore it is expected that some frames might be lost.
-  observer.SetMaxExpectedPictureIdGap(kMaxFramesLost);
-  for (int ssrc_count : ssrc_counts) {
-    task_queue_.SendTask([this, &ssrc_count]() {
-      video_encoder_config_.number_of_streams = ssrc_count;
-
-      frame_generator_capturer_->Stop();
-      sender_call_->DestroyVideoSendStream(video_send_stream_);
-
-      observer.SetExpectedSsrcs(ssrc_count);
-      observer.ResetObservedSsrcs();
-
-      video_send_stream_ = sender_call_->CreateVideoSendStream(
-          video_send_config_.Copy(), video_encoder_config_.Copy());
-      video_send_stream_->Start();
-      CreateFrameGeneratorCapturer(kFrameRate, kFrameMaxWidth, kFrameMaxHeight);
-      frame_generator_capturer_->Start();
-    });
-
-    EXPECT_TRUE(observer.Wait()) << "Timed out waiting for packets.";
-  }
-
-  task_queue_.SendTask([this]() {
-    Stop();
-    DestroyStreams();
-    send_transport_.reset();
-    receive_transport_.reset();
-  });
-}
-
-TEST_F(PictureIdTest, PictureIdContinuousAfterReconfigureVp8) {
-  std::unique_ptr<VideoEncoder> encoder(VP8Encoder::Create());
-  SetupEncoder(encoder.get());
-  TestPictureIdContinuousAfterReconfigure({1, 3, 3, 1, 1});
-}
-
-TEST_F(PictureIdTest, PictureIdIncreasingAfterRecreateStreamVp8) {
-  std::unique_ptr<VideoEncoder> encoder(VP8Encoder::Create());
-  SetupEncoder(encoder.get());
-  TestPictureIdIncreaseAfterRecreateStreams({1, 3, 3, 1, 1});
-}
-
-TEST_F(PictureIdTest, PictureIdIncreasingAfterStreamCountChangeVp8) {
-  std::unique_ptr<VideoEncoder> encoder(VP8Encoder::Create());
-  // Make sure that that the picture id is not reset if the stream count goes
-  // down and then up.
-  std::vector<int> ssrc_counts = {3, 1, 3};
-  SetupEncoder(encoder.get());
-  TestPictureIdContinuousAfterReconfigure(ssrc_counts);
-}
-
-TEST_F(PictureIdTest,
-       PictureIdContinuousAfterReconfigureSimulcastEncoderAdapter) {
-  cricket::InternalEncoderFactory internal_encoder_factory;
-  SimulcastEncoderAdapter simulcast_encoder_adapter(&internal_encoder_factory);
-  SetupEncoder(&simulcast_encoder_adapter);
-  TestPictureIdContinuousAfterReconfigure({1, 3, 3, 1, 1});
-}
-
-TEST_F(PictureIdTest,
-       PictureIdIncreasingAfterRecreateStreamSimulcastEncoderAdapter) {
-  cricket::InternalEncoderFactory internal_encoder_factory;
-  SimulcastEncoderAdapter simulcast_encoder_adapter(&internal_encoder_factory);
-  SetupEncoder(&simulcast_encoder_adapter);
-  TestPictureIdIncreaseAfterRecreateStreams({1, 3, 3, 1, 1});
-}
-
-// When using the simulcast encoder adapter, the picture id is randomly set
-// when the ssrc count is reduced and then increased. This means that we are
-// not spec compliant in that particular case.
-TEST_F(
-    PictureIdTest,
-    DISABLED_PictureIdIncreasingAfterStreamCountChangeSimulcastEncoderAdapter) {
-  cricket::InternalEncoderFactory internal_encoder_factory;
-  SimulcastEncoderAdapter simulcast_encoder_adapter(&internal_encoder_factory);
-  // Make sure that that the picture id is not reset if the stream count goes
-  // down and then up.
-  std::vector<int> ssrc_counts = {3, 1, 3};
-  SetupEncoder(&simulcast_encoder_adapter);
-  TestPictureIdContinuousAfterReconfigure(ssrc_counts);
-}
-
-}  // namespace webrtc
diff --git a/video/quality_threshold.cc b/video/quality_threshold.cc
deleted file mode 100644
index 370fe6b..0000000
--- a/video/quality_threshold.cc
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- *  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/video/quality_threshold.h"
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-
-namespace webrtc {
-
-QualityThreshold::QualityThreshold(int low_threshold,
-                                   int high_threshold,
-                                   float fraction,
-                                   int max_measurements)
-    : buffer_(new int[max_measurements]),
-      max_measurements_(max_measurements),
-      fraction_(fraction),
-      low_threshold_(low_threshold),
-      high_threshold_(high_threshold),
-      until_full_(max_measurements),
-      next_index_(0),
-      sum_(0),
-      count_low_(0),
-      count_high_(0),
-      num_high_states_(0),
-      num_certain_states_(0) {
-  RTC_CHECK_GT(fraction, 0.5f);
-  RTC_CHECK_GT(max_measurements, 1);
-  RTC_CHECK_LT(low_threshold, high_threshold);
-}
-
-void QualityThreshold::AddMeasurement(int measurement) {
-  int prev_val = until_full_ > 0 ? 0 : buffer_[next_index_];
-  buffer_[next_index_] = measurement;
-  next_index_ = (next_index_ + 1) % max_measurements_;
-
-  sum_ += measurement - prev_val;
-
-  if (until_full_ == 0) {
-    if (prev_val <= low_threshold_) {
-      --count_low_;
-    } else if (prev_val >= high_threshold_) {
-      --count_high_;
-    }
-  }
-
-  if (measurement <= low_threshold_) {
-    ++count_low_;
-  } else if (measurement >= high_threshold_) {
-    ++count_high_;
-  }
-
-  float sufficient_majority = fraction_ * max_measurements_;
-  if (count_high_ >= sufficient_majority) {
-    is_high_ = rtc::Optional<bool>(true);
-  } else if (count_low_ >= sufficient_majority) {
-    is_high_ = rtc::Optional<bool>(false);
-  }
-
-  if (until_full_ > 0)
-    --until_full_;
-
-  if (is_high_) {
-    if (*is_high_)
-      ++num_high_states_;
-    ++num_certain_states_;
-  }
-}
-
-rtc::Optional<bool> QualityThreshold::IsHigh() const {
-  return is_high_;
-}
-
-rtc::Optional<double> QualityThreshold::CalculateVariance() const {
-  if (until_full_ > 0) {
-    return rtc::Optional<double>();
-  }
-
-  double variance = 0;
-  double mean = static_cast<double>(sum_) / max_measurements_;
-  for (int i = 0; i < max_measurements_; ++i) {
-    variance += (buffer_[i] - mean) * (buffer_[i] - mean);
-  }
-  return rtc::Optional<double>(variance / (max_measurements_ - 1));
-}
-
-rtc::Optional<double> QualityThreshold::FractionHigh(
-    int min_required_samples) const {
-  RTC_DCHECK_GT(min_required_samples, 0);
-  if (num_certain_states_ < min_required_samples)
-    return rtc::Optional<double>();
-
-  return rtc::Optional<double>(static_cast<double>(num_high_states_) /
-                               num_certain_states_);
-}
-
-}  // namespace webrtc
diff --git a/video/quality_threshold.h b/video/quality_threshold.h
deleted file mode 100644
index a142d4e..0000000
--- a/video/quality_threshold.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- *  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_VIDEO_QUALITY_THRESHOLD_H_
-#define WEBRTC_VIDEO_QUALITY_THRESHOLD_H_
-
-#include <memory>
-
-#include "webrtc/api/optional.h"
-
-namespace webrtc {
-
-class QualityThreshold {
- public:
-  // Both thresholds are inclusive, i.e. measurement >= high signifies a high
-  // state, while measurement <= low signifies a low state.
-  QualityThreshold(int low_threshold,
-                   int high_threshold,
-                   float fraction,
-                   int max_measurements);
-
-  void AddMeasurement(int measurement);
-  rtc::Optional<bool> IsHigh() const;
-  rtc::Optional<double> CalculateVariance() const;
-  rtc::Optional<double> FractionHigh(int min_required_samples) const;
-
- private:
-  const std::unique_ptr<int[]> buffer_;
-  const int max_measurements_;
-  const float fraction_;
-  const int low_threshold_;
-  const int high_threshold_;
-  int until_full_;
-  int next_index_;
-  rtc::Optional<bool> is_high_;
-  int sum_;
-  int count_low_;
-  int count_high_;
-  int num_high_states_;
-  int num_certain_states_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_VIDEO_QUALITY_THRESHOLD_H_
diff --git a/video/quality_threshold_unittest.cc b/video/quality_threshold_unittest.cc
deleted file mode 100644
index 6aa70c5..0000000
--- a/video/quality_threshold_unittest.cc
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- *  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/video/quality_threshold.h"
-
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-
-TEST(QualityThresholdTest, BackAndForth) {
-  const int kLowThreshold = 0;
-  const int kHighThreshold = 1;
-  const float kFraction = 0.75f;
-  const int kMaxMeasurements = 10;
-
-  QualityThreshold thresh(kLowThreshold, kHighThreshold, kFraction,
-                          kMaxMeasurements);
-
-  const int kNeededMeasurements =
-      static_cast<int>(kFraction * kMaxMeasurements + 1);
-  for (int i = 0; i < kNeededMeasurements; ++i) {
-    EXPECT_FALSE(thresh.IsHigh());
-    thresh.AddMeasurement(kLowThreshold);
-  }
-  ASSERT_TRUE(thresh.IsHigh());
-  for (int i = 0; i < kNeededMeasurements; ++i) {
-    EXPECT_FALSE(*thresh.IsHigh());
-    thresh.AddMeasurement(kHighThreshold);
-  }
-  EXPECT_TRUE(*thresh.IsHigh());
-
-  for (int i = 0; i < kNeededMeasurements; ++i) {
-    EXPECT_TRUE(*thresh.IsHigh());
-    thresh.AddMeasurement(kLowThreshold);
-  }
-  EXPECT_FALSE(*thresh.IsHigh());
-}
-
-TEST(QualityThresholdTest, Variance) {
-  const int kLowThreshold = 0;
-  const int kHighThreshold = 1;
-  const float kFraction = 0.8f;
-  const int kMaxMeasurements = 10;
-  const double kMaxError = 0.01;
-
-  // Previously randomly generated values...
-  int values[] = {51, 79, 80, 56, 19, 20, 48, 57, 48, 25, 2, 25, 38, 37, 25};
-  // ...with precomputed variances.
-  double variances[] = {476.9, 687.6, 552, 336.4, 278.767, 265.167};
-
-  QualityThreshold thresh(kLowThreshold, kHighThreshold, kFraction,
-                          kMaxMeasurements);
-
-  for (int i = 0; i < kMaxMeasurements; ++i) {
-    EXPECT_FALSE(thresh.CalculateVariance());
-    thresh.AddMeasurement(values[i]);
-  }
-
-  ASSERT_TRUE(thresh.CalculateVariance());
-  EXPECT_NEAR(variances[0], *thresh.CalculateVariance(), kMaxError);
-  for (unsigned int i = 1; i < sizeof(variances) / sizeof(double); ++i) {
-    thresh.AddMeasurement(values[i + kMaxMeasurements - 1]);
-    EXPECT_NEAR(variances[i], *thresh.CalculateVariance(), kMaxError);
-  }
-
-  for (int i = 0; i < kMaxMeasurements; ++i) {
-    thresh.AddMeasurement(42);
-  }
-  EXPECT_NEAR(0, *thresh.CalculateVariance(), kMaxError);
-}
-
-TEST(QualityThresholdTest, BetweenThresholds) {
-  const int kLowThreshold = 0;
-  const int kHighThreshold = 2;
-  const float kFraction = 0.6f;
-  const int kMaxMeasurements = 10;
-
-  const int kBetweenThresholds = (kLowThreshold + kHighThreshold) / 2;
-
-  QualityThreshold thresh(kLowThreshold, kHighThreshold, kFraction,
-                          kMaxMeasurements);
-
-  for (int i = 0; i < 2 * kMaxMeasurements; ++i) {
-    EXPECT_FALSE(thresh.IsHigh());
-    thresh.AddMeasurement(kBetweenThresholds);
-  }
-  EXPECT_FALSE(thresh.IsHigh());
-}
-
-TEST(QualityThresholdTest, FractionHigh) {
-  const int kLowThreshold = 0;
-  const int kHighThreshold = 2;
-  const float kFraction = 0.75f;
-  const int kMaxMeasurements = 10;
-
-  const int kBetweenThresholds = (kLowThreshold + kHighThreshold) / 2;
-  const int kNeededMeasurements =
-      static_cast<int>(kFraction * kMaxMeasurements + 1);
-
-  QualityThreshold thresh(kLowThreshold, kHighThreshold, kFraction,
-                          kMaxMeasurements);
-
-  for (int i = 0; i < kMaxMeasurements; ++i) {
-    EXPECT_FALSE(thresh.FractionHigh(1));
-    thresh.AddMeasurement(kBetweenThresholds);
-  }
-
-  for (int i = 0; i < kNeededMeasurements; i++) {
-    EXPECT_FALSE(thresh.FractionHigh(1));
-    thresh.AddMeasurement(kHighThreshold);
-  }
-  EXPECT_FALSE(thresh.FractionHigh(2));
-  ASSERT_TRUE(thresh.FractionHigh(1));
-  EXPECT_NEAR(*thresh.FractionHigh(1), 1, 0.001);
-
-  for (int i = 0; i < kNeededMeasurements; i++) {
-    EXPECT_NEAR(*thresh.FractionHigh(1), 1, 0.001);
-    thresh.AddMeasurement(kLowThreshold);
-  }
-  EXPECT_NEAR(
-      *thresh.FractionHigh(1),
-      static_cast<double>(kNeededMeasurements) / (kNeededMeasurements + 1),
-      0.001);
-}
-
-}  // namespace webrtc
diff --git a/video/receive_statistics_proxy.cc b/video/receive_statistics_proxy.cc
deleted file mode 100644
index ff4c6fe..0000000
--- a/video/receive_statistics_proxy.cc
+++ /dev/null
@@ -1,804 +0,0 @@
-/*
- *  Copyright (c) 2013 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/video/receive_statistics_proxy.h"
-
-#include <algorithm>
-#include <cmath>
-#include <sstream>
-#include <utility>
-
-#include "webrtc/modules/pacing/alr_detector.h"
-#include "webrtc/modules/video_coding/include/video_codec_interface.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/system_wrappers/include/clock.h"
-#include "webrtc/system_wrappers/include/metrics.h"
-
-namespace webrtc {
-namespace {
-// Periodic time interval for processing samples for |freq_offset_counter_|.
-const int64_t kFreqOffsetProcessIntervalMs = 40000;
-
-// Configuration for bad call detection.
-const int kBadCallMinRequiredSamples = 10;
-const int kMinSampleLengthMs = 990;
-const int kNumMeasurements = 10;
-const int kNumMeasurementsVariance = kNumMeasurements * 1.5;
-const float kBadFraction = 0.8f;
-// For fps:
-// Low means low enough to be bad, high means high enough to be good
-const int kLowFpsThreshold = 12;
-const int kHighFpsThreshold = 14;
-// For qp and fps variance:
-// Low means low enough to be good, high means high enough to be bad
-const int kLowQpThresholdVp8 = 60;
-const int kHighQpThresholdVp8 = 70;
-const int kLowVarianceThreshold = 1;
-const int kHighVarianceThreshold = 2;
-
-// Some metrics are reported as a maximum over this period.
-const int kMovingMaxWindowMs = 10000;
-
-// How large window we use to calculate the framerate/bitrate.
-const int kRateStatisticsWindowSizeMs = 1000;
-
-std::string UmaPrefixForContentType(VideoContentType content_type) {
-  std::stringstream ss;
-  ss << "WebRTC.Video";
-  if (videocontenttypehelpers::IsScreenshare(content_type)) {
-    ss << ".Screenshare";
-  }
-  return ss.str();
-}
-
-std::string UmaSuffixForContentType(VideoContentType content_type) {
-  std::stringstream ss;
-  int simulcast_id = videocontenttypehelpers::GetSimulcastId(content_type);
-  if (simulcast_id > 0) {
-    ss << ".S" << simulcast_id - 1;
-  }
-  int experiment_id = videocontenttypehelpers::GetExperimentId(content_type);
-  if (experiment_id > 0) {
-    ss << ".ExperimentGroup" << experiment_id - 1;
-  }
-  return ss.str();
-}
-}  // namespace
-
-ReceiveStatisticsProxy::ReceiveStatisticsProxy(
-    const VideoReceiveStream::Config* config,
-    Clock* clock)
-    : clock_(clock),
-      config_(*config),
-      start_ms_(clock->TimeInMilliseconds()),
-      last_sample_time_(clock->TimeInMilliseconds()),
-      fps_threshold_(kLowFpsThreshold,
-                     kHighFpsThreshold,
-                     kBadFraction,
-                     kNumMeasurements),
-      qp_threshold_(kLowQpThresholdVp8,
-                    kHighQpThresholdVp8,
-                    kBadFraction,
-                    kNumMeasurements),
-      variance_threshold_(kLowVarianceThreshold,
-                          kHighVarianceThreshold,
-                          kBadFraction,
-                          kNumMeasurementsVariance),
-      num_bad_states_(0),
-      num_certain_states_(0),
-      // 1000ms window, scale 1000 for ms to s.
-      decode_fps_estimator_(1000, 1000),
-      renders_fps_estimator_(1000, 1000),
-      render_fps_tracker_(100, 10u),
-      render_pixel_tracker_(100, 10u),
-      total_byte_tracker_(100, 10u),  // bucket_interval_ms, bucket_count
-      interframe_delay_max_moving_(kMovingMaxWindowMs),
-      freq_offset_counter_(clock, nullptr, kFreqOffsetProcessIntervalMs),
-      first_report_block_time_ms_(-1),
-      avg_rtt_ms_(0),
-      last_content_type_(VideoContentType::UNSPECIFIED),
-      timing_frame_info_counter_(kMovingMaxWindowMs) {
-  stats_.ssrc = config_.rtp.remote_ssrc;
-  // TODO(brandtr): Replace |rtx_stats_| with a single instance of
-  // StreamDataCounters.
-  if (config_.rtp.rtx_ssrc) {
-    rtx_stats_[config_.rtp.rtx_ssrc] = StreamDataCounters();
-  }
-}
-
-ReceiveStatisticsProxy::~ReceiveStatisticsProxy() {
-  UpdateHistograms();
-}
-
-void ReceiveStatisticsProxy::UpdateHistograms() {
-  int stream_duration_sec = (clock_->TimeInMilliseconds() - start_ms_) / 1000;
-  if (stats_.frame_counts.key_frames > 0 ||
-      stats_.frame_counts.delta_frames > 0) {
-    RTC_HISTOGRAM_COUNTS_100000("WebRTC.Video.ReceiveStreamLifetimeInSeconds",
-                                stream_duration_sec);
-    LOG(LS_INFO) << "WebRTC.Video.ReceiveStreamLifetimeInSeconds "
-                 << stream_duration_sec;
-  }
-
-  if (first_report_block_time_ms_ != -1 &&
-      ((clock_->TimeInMilliseconds() - first_report_block_time_ms_) / 1000) >=
-          metrics::kMinRunTimeInSeconds) {
-    int fraction_lost = report_block_stats_.FractionLostInPercent();
-    if (fraction_lost != -1) {
-      RTC_HISTOGRAM_PERCENTAGE("WebRTC.Video.ReceivedPacketsLostInPercent",
-                               fraction_lost);
-      LOG(LS_INFO) << "WebRTC.Video.ReceivedPacketsLostInPercent "
-                   << fraction_lost;
-    }
-  }
-
-  const int kMinRequiredSamples = 200;
-  int samples = static_cast<int>(render_fps_tracker_.TotalSampleCount());
-  if (samples >= kMinRequiredSamples) {
-    RTC_HISTOGRAM_COUNTS_100("WebRTC.Video.RenderFramesPerSecond",
-                             round(render_fps_tracker_.ComputeTotalRate()));
-    RTC_HISTOGRAM_COUNTS_100000(
-        "WebRTC.Video.RenderSqrtPixelsPerSecond",
-        round(render_pixel_tracker_.ComputeTotalRate()));
-  }
-
-  int sync_offset_ms = sync_offset_counter_.Avg(kMinRequiredSamples);
-  if (sync_offset_ms != -1) {
-    RTC_HISTOGRAM_COUNTS_10000("WebRTC.Video.AVSyncOffsetInMs", sync_offset_ms);
-    LOG(LS_INFO) << "WebRTC.Video.AVSyncOffsetInMs " << sync_offset_ms;
-  }
-  AggregatedStats freq_offset_stats = freq_offset_counter_.GetStats();
-  if (freq_offset_stats.num_samples > 0) {
-    RTC_HISTOGRAM_COUNTS_10000("WebRTC.Video.RtpToNtpFreqOffsetInKhz",
-                               freq_offset_stats.average);
-    LOG(LS_INFO) << "WebRTC.Video.RtpToNtpFreqOffsetInKhz, "
-                 << freq_offset_stats.ToString();
-  }
-
-  int num_total_frames =
-      stats_.frame_counts.key_frames + stats_.frame_counts.delta_frames;
-  if (num_total_frames >= kMinRequiredSamples) {
-    int num_key_frames = stats_.frame_counts.key_frames;
-    int key_frames_permille =
-        (num_key_frames * 1000 + num_total_frames / 2) / num_total_frames;
-    RTC_HISTOGRAM_COUNTS_1000("WebRTC.Video.KeyFramesReceivedInPermille",
-                              key_frames_permille);
-    LOG(LS_INFO) << "WebRTC.Video.KeyFramesReceivedInPermille "
-                 << key_frames_permille;
-  }
-
-  int qp = qp_counters_.vp8.Avg(kMinRequiredSamples);
-  if (qp != -1) {
-    RTC_HISTOGRAM_COUNTS_200("WebRTC.Video.Decoded.Vp8.Qp", qp);
-    LOG(LS_INFO) << "WebRTC.Video.Decoded.Vp8.Qp " << qp;
-  }
-  int decode_ms = decode_time_counter_.Avg(kMinRequiredSamples);
-  if (decode_ms != -1) {
-    RTC_HISTOGRAM_COUNTS_1000("WebRTC.Video.DecodeTimeInMs", decode_ms);
-    LOG(LS_INFO) << "WebRTC.Video.DecodeTimeInMs " << decode_ms;
-  }
-  int jb_delay_ms = jitter_buffer_delay_counter_.Avg(kMinRequiredSamples);
-  if (jb_delay_ms != -1) {
-    RTC_HISTOGRAM_COUNTS_10000("WebRTC.Video.JitterBufferDelayInMs",
-                               jb_delay_ms);
-    LOG(LS_INFO) << "WebRTC.Video.JitterBufferDelayInMs " << jb_delay_ms;
-  }
-
-  int target_delay_ms = target_delay_counter_.Avg(kMinRequiredSamples);
-  if (target_delay_ms != -1) {
-    RTC_HISTOGRAM_COUNTS_10000("WebRTC.Video.TargetDelayInMs", target_delay_ms);
-    LOG(LS_INFO) << "WebRTC.Video.TargetDelayInMs " << target_delay_ms;
-  }
-  int current_delay_ms = current_delay_counter_.Avg(kMinRequiredSamples);
-  if (current_delay_ms != -1) {
-    RTC_HISTOGRAM_COUNTS_10000("WebRTC.Video.CurrentDelayInMs",
-                               current_delay_ms);
-    LOG(LS_INFO) << "WebRTC.Video.CurrentDelayInMs " << current_delay_ms;
-  }
-  int delay_ms = delay_counter_.Avg(kMinRequiredSamples);
-  if (delay_ms != -1)
-    RTC_HISTOGRAM_COUNTS_10000("WebRTC.Video.OnewayDelayInMs", delay_ms);
-
-  // Aggregate content_specific_stats_ by removing experiment or simulcast
-  // information;
-  std::map<VideoContentType, ContentSpecificStats> aggregated_stats;
-  for (auto it : content_specific_stats_) {
-    // Calculate simulcast specific metrics (".S0" ... ".S2" suffixes).
-    VideoContentType content_type = it.first;
-    if (videocontenttypehelpers::GetSimulcastId(content_type) > 0) {
-      // Aggregate on experiment id.
-      videocontenttypehelpers::SetExperimentId(&content_type, 0);
-      aggregated_stats[content_type].Add(it.second);
-    }
-    // Calculate experiment specific metrics (".ExperimentGroup[0-7]" suffixes).
-    content_type = it.first;
-    if (videocontenttypehelpers::GetExperimentId(content_type) > 0) {
-      // Aggregate on simulcast id.
-      videocontenttypehelpers::SetSimulcastId(&content_type, 0);
-      aggregated_stats[content_type].Add(it.second);
-    }
-    // Calculate aggregated metrics (no suffixes. Aggregated on everything).
-    content_type = it.first;
-    videocontenttypehelpers::SetSimulcastId(&content_type, 0);
-    videocontenttypehelpers::SetExperimentId(&content_type, 0);
-    aggregated_stats[content_type].Add(it.second);
-  }
-
-  for (auto it : aggregated_stats) {
-    // For the metric Foo we report the following slices:
-    // WebRTC.Video.Foo,
-    // WebRTC.Video.Screenshare.Foo,
-    // WebRTC.Video.Foo.S[0-3],
-    // WebRTC.Video.Foo.ExperimentGroup[0-7],
-    // WebRTC.Video.Screenshare.Foo.S[0-3],
-    // WebRTC.Video.Screenshare.Foo.ExperimentGroup[0-7].
-    auto content_type = it.first;
-    auto stats = it.second;
-    std::string uma_prefix = UmaPrefixForContentType(content_type);
-    std::string uma_suffix = UmaSuffixForContentType(content_type);
-    // Metrics can be sliced on either simulcast id or experiment id but not
-    // both.
-    RTC_DCHECK(videocontenttypehelpers::GetExperimentId(content_type) == 0 ||
-               videocontenttypehelpers::GetSimulcastId(content_type) == 0);
-
-    int e2e_delay_ms = stats.e2e_delay_counter.Avg(kMinRequiredSamples);
-    if (e2e_delay_ms != -1) {
-      RTC_HISTOGRAM_COUNTS_SPARSE_10000(
-          uma_prefix + ".EndToEndDelayInMs" + uma_suffix, e2e_delay_ms);
-      LOG(LS_INFO) << uma_prefix << ".EndToEndDelayInMs" << uma_suffix << " "
-                   << e2e_delay_ms;
-    }
-    int e2e_delay_max_ms = stats.e2e_delay_counter.Max();
-    if (e2e_delay_max_ms != -1 && e2e_delay_ms != -1) {
-      RTC_HISTOGRAM_COUNTS_SPARSE_100000(
-          uma_prefix + ".EndToEndDelayMaxInMs" + uma_suffix, e2e_delay_max_ms);
-      LOG(LS_INFO) << uma_prefix << ".EndToEndDelayMaxInMs" << uma_suffix << " "
-                   << e2e_delay_max_ms;
-    }
-    int interframe_delay_ms =
-        stats.interframe_delay_counter.Avg(kMinRequiredSamples);
-    if (interframe_delay_ms != -1) {
-      RTC_HISTOGRAM_COUNTS_SPARSE_10000(
-          uma_prefix + ".InterframeDelayInMs" + uma_suffix,
-          interframe_delay_ms);
-      LOG(LS_INFO) << uma_prefix << ".InterframeDelayInMs" << uma_suffix << " "
-                   << interframe_delay_ms;
-    }
-    int interframe_delay_max_ms = stats.interframe_delay_counter.Max();
-    if (interframe_delay_max_ms != -1 && interframe_delay_ms != -1) {
-      RTC_HISTOGRAM_COUNTS_SPARSE_10000(
-          uma_prefix + ".InterframeDelayMaxInMs" + uma_suffix,
-          interframe_delay_max_ms);
-      LOG(LS_INFO) << uma_prefix << ".InterframeDelayMaxInMs" << uma_suffix
-                   << " " << interframe_delay_max_ms;
-    }
-
-    int width = stats.received_width.Avg(kMinRequiredSamples);
-    if (width != -1) {
-      RTC_HISTOGRAM_COUNTS_SPARSE_10000(
-          uma_prefix + ".ReceivedWidthInPixels" + uma_suffix, width);
-      LOG(LS_INFO) << uma_prefix << ".ReceivedWidthInPixels" << uma_suffix
-                   << " " << width;
-    }
-
-    int height = stats.received_height.Avg(kMinRequiredSamples);
-    if (height != -1) {
-      RTC_HISTOGRAM_COUNTS_SPARSE_10000(
-          uma_prefix + ".ReceivedHeightInPixels" + uma_suffix, height);
-      LOG(LS_INFO) << uma_prefix << ".ReceivedHeightInPixels" << uma_suffix
-                   << " " << height;
-    }
-
-    if (content_type != VideoContentType::UNSPECIFIED) {
-      // Don't report these 3 metrics unsliced, as more precise variants
-      // are reported separately in this method.
-      float flow_duration_sec = stats.flow_duration_ms / 1000.0;
-      if (flow_duration_sec >= metrics::kMinRunTimeInSeconds) {
-        int media_bitrate_kbps = static_cast<int>(stats.total_media_bytes * 8 /
-                                                  flow_duration_sec / 1000);
-        RTC_HISTOGRAM_COUNTS_SPARSE_10000(
-            uma_prefix + ".MediaBitrateReceivedInKbps" + uma_suffix,
-            media_bitrate_kbps);
-        LOG(LS_INFO) << uma_prefix << ".MediaBitrateReceivedInKbps"
-                     << uma_suffix << " " << media_bitrate_kbps;
-      }
-
-      int num_total_frames =
-          stats.frame_counts.key_frames + stats.frame_counts.delta_frames;
-      if (num_total_frames >= kMinRequiredSamples) {
-        int num_key_frames = stats.frame_counts.key_frames;
-        int key_frames_permille =
-            (num_key_frames * 1000 + num_total_frames / 2) / num_total_frames;
-        RTC_HISTOGRAM_COUNTS_SPARSE_1000(
-            uma_prefix + ".KeyFramesReceivedInPermille" + uma_suffix,
-            key_frames_permille);
-        LOG(LS_INFO) << uma_prefix << ".KeyFramesReceivedInPermille"
-                     << uma_suffix << " " << key_frames_permille;
-      }
-
-      int qp = stats.qp_counter.Avg(kMinRequiredSamples);
-      if (qp != -1) {
-        RTC_HISTOGRAM_COUNTS_SPARSE_200(
-            uma_prefix + ".Decoded.Vp8.Qp" + uma_suffix, qp);
-        LOG(LS_INFO) << uma_prefix << ".Decoded.Vp8.Qp" << uma_suffix << " "
-                     << qp;
-      }
-    }
-  }
-
-  StreamDataCounters rtp = stats_.rtp_stats;
-  StreamDataCounters rtx;
-  for (auto it : rtx_stats_)
-    rtx.Add(it.second);
-  StreamDataCounters rtp_rtx = rtp;
-  rtp_rtx.Add(rtx);
-  int64_t elapsed_sec =
-      rtp_rtx.TimeSinceFirstPacketInMs(clock_->TimeInMilliseconds()) / 1000;
-  if (elapsed_sec >= metrics::kMinRunTimeInSeconds) {
-    RTC_HISTOGRAM_COUNTS_10000(
-        "WebRTC.Video.BitrateReceivedInKbps",
-        static_cast<int>(rtp_rtx.transmitted.TotalBytes() * 8 / elapsed_sec /
-                         1000));
-    int media_bitrate_kbs =
-        static_cast<int>(rtp.MediaPayloadBytes() * 8 / elapsed_sec / 1000);
-    RTC_HISTOGRAM_COUNTS_10000("WebRTC.Video.MediaBitrateReceivedInKbps",
-                               media_bitrate_kbs);
-    LOG(LS_INFO) << "WebRTC.Video.MediaBitrateReceivedInKbps "
-                 << media_bitrate_kbs;
-    RTC_HISTOGRAM_COUNTS_10000(
-        "WebRTC.Video.PaddingBitrateReceivedInKbps",
-        static_cast<int>(rtp_rtx.transmitted.padding_bytes * 8 / elapsed_sec /
-                         1000));
-    RTC_HISTOGRAM_COUNTS_10000(
-        "WebRTC.Video.RetransmittedBitrateReceivedInKbps",
-        static_cast<int>(rtp_rtx.retransmitted.TotalBytes() * 8 / elapsed_sec /
-                         1000));
-    if (!rtx_stats_.empty()) {
-      RTC_HISTOGRAM_COUNTS_10000("WebRTC.Video.RtxBitrateReceivedInKbps",
-                                 static_cast<int>(rtx.transmitted.TotalBytes() *
-                                                  8 / elapsed_sec / 1000));
-    }
-    if (config_.rtp.ulpfec.ulpfec_payload_type != -1) {
-      RTC_HISTOGRAM_COUNTS_10000(
-          "WebRTC.Video.FecBitrateReceivedInKbps",
-          static_cast<int>(rtp_rtx.fec.TotalBytes() * 8 / elapsed_sec / 1000));
-    }
-    const RtcpPacketTypeCounter& counters = stats_.rtcp_packet_type_counts;
-    RTC_HISTOGRAM_COUNTS_10000("WebRTC.Video.NackPacketsSentPerMinute",
-                               counters.nack_packets * 60 / elapsed_sec);
-    RTC_HISTOGRAM_COUNTS_10000("WebRTC.Video.FirPacketsSentPerMinute",
-                               counters.fir_packets * 60 / elapsed_sec);
-    RTC_HISTOGRAM_COUNTS_10000("WebRTC.Video.PliPacketsSentPerMinute",
-                               counters.pli_packets * 60 / elapsed_sec);
-    if (counters.nack_requests > 0) {
-      RTC_HISTOGRAM_PERCENTAGE("WebRTC.Video.UniqueNackRequestsSentInPercent",
-                               counters.UniqueNackRequestsInPercent());
-    }
-  }
-
-  if (num_certain_states_ >= kBadCallMinRequiredSamples) {
-    RTC_HISTOGRAM_PERCENTAGE("WebRTC.Video.BadCall.Any",
-                             100 * num_bad_states_ / num_certain_states_);
-  }
-  rtc::Optional<double> fps_fraction =
-      fps_threshold_.FractionHigh(kBadCallMinRequiredSamples);
-  if (fps_fraction) {
-    RTC_HISTOGRAM_PERCENTAGE("WebRTC.Video.BadCall.FrameRate",
-                             static_cast<int>(100 * (1 - *fps_fraction)));
-  }
-  rtc::Optional<double> variance_fraction =
-      variance_threshold_.FractionHigh(kBadCallMinRequiredSamples);
-  if (variance_fraction) {
-    RTC_HISTOGRAM_PERCENTAGE("WebRTC.Video.BadCall.FrameRateVariance",
-                             static_cast<int>(100 * *variance_fraction));
-  }
-  rtc::Optional<double> qp_fraction =
-      qp_threshold_.FractionHigh(kBadCallMinRequiredSamples);
-  if (qp_fraction) {
-    RTC_HISTOGRAM_PERCENTAGE("WebRTC.Video.BadCall.Qp",
-                             static_cast<int>(100 * *qp_fraction));
-  }
-}
-
-void ReceiveStatisticsProxy::QualitySample() {
-  int64_t now = clock_->TimeInMilliseconds();
-  if (last_sample_time_ + kMinSampleLengthMs > now)
-    return;
-
-  double fps =
-      render_fps_tracker_.ComputeRateForInterval(now - last_sample_time_);
-  int qp = qp_sample_.Avg(1);
-
-  bool prev_fps_bad = !fps_threshold_.IsHigh().value_or(true);
-  bool prev_qp_bad = qp_threshold_.IsHigh().value_or(false);
-  bool prev_variance_bad = variance_threshold_.IsHigh().value_or(false);
-  bool prev_any_bad = prev_fps_bad || prev_qp_bad || prev_variance_bad;
-
-  fps_threshold_.AddMeasurement(static_cast<int>(fps));
-  if (qp != -1)
-    qp_threshold_.AddMeasurement(qp);
-  rtc::Optional<double> fps_variance_opt = fps_threshold_.CalculateVariance();
-  double fps_variance = fps_variance_opt.value_or(0);
-  if (fps_variance_opt) {
-    variance_threshold_.AddMeasurement(static_cast<int>(fps_variance));
-  }
-
-  bool fps_bad = !fps_threshold_.IsHigh().value_or(true);
-  bool qp_bad = qp_threshold_.IsHigh().value_or(false);
-  bool variance_bad = variance_threshold_.IsHigh().value_or(false);
-  bool any_bad = fps_bad || qp_bad || variance_bad;
-
-  if (!prev_any_bad && any_bad) {
-    LOG(LS_INFO) << "Bad call (any) start: " << now;
-  } else if (prev_any_bad && !any_bad) {
-    LOG(LS_INFO) << "Bad call (any) end: " << now;
-  }
-
-  if (!prev_fps_bad && fps_bad) {
-    LOG(LS_INFO) << "Bad call (fps) start: " << now;
-  } else if (prev_fps_bad && !fps_bad) {
-    LOG(LS_INFO) << "Bad call (fps) end: " << now;
-  }
-
-  if (!prev_qp_bad && qp_bad) {
-    LOG(LS_INFO) << "Bad call (qp) start: " << now;
-  } else if (prev_qp_bad && !qp_bad) {
-    LOG(LS_INFO) << "Bad call (qp) end: " << now;
-  }
-
-  if (!prev_variance_bad && variance_bad) {
-    LOG(LS_INFO) << "Bad call (variance) start: " << now;
-  } else if (prev_variance_bad && !variance_bad) {
-    LOG(LS_INFO) << "Bad call (variance) end: " << now;
-  }
-
-  LOG(LS_VERBOSE) << "SAMPLE: sample_length: " << (now - last_sample_time_)
-                  << " fps: " << fps << " fps_bad: " << fps_bad << " qp: " << qp
-                  << " qp_bad: " << qp_bad << " variance_bad: " << variance_bad
-                  << " fps_variance: " << fps_variance;
-
-  last_sample_time_ = now;
-  qp_sample_.Reset();
-
-  if (fps_threshold_.IsHigh() || variance_threshold_.IsHigh() ||
-      qp_threshold_.IsHigh()) {
-    if (any_bad)
-      ++num_bad_states_;
-    ++num_certain_states_;
-  }
-}
-
-void ReceiveStatisticsProxy::UpdateFramerate(int64_t now_ms) const {
-  int64_t old_frames_ms = now_ms - kRateStatisticsWindowSizeMs;
-  while (!frame_window_.empty() &&
-         frame_window_.begin()->first < old_frames_ms) {
-    frame_window_.erase(frame_window_.begin());
-  }
-
-  size_t framerate =
-      (frame_window_.size() * 1000 + 500) / kRateStatisticsWindowSizeMs;
-  stats_.network_frame_rate = static_cast<int>(framerate);
-}
-
-VideoReceiveStream::Stats ReceiveStatisticsProxy::GetStats() const {
-  rtc::CritScope lock(&crit_);
-  // Get current frame rates here, as only updating them on new frames prevents
-  // us from ever correctly displaying frame rate of 0.
-  int64_t now_ms = clock_->TimeInMilliseconds();
-  UpdateFramerate(now_ms);
-  stats_.render_frame_rate = renders_fps_estimator_.Rate(now_ms).value_or(0);
-  stats_.decode_frame_rate = decode_fps_estimator_.Rate(now_ms).value_or(0);
-  stats_.total_bitrate_bps =
-      static_cast<int>(total_byte_tracker_.ComputeRate() * 8);
-  stats_.interframe_delay_max_ms =
-      interframe_delay_max_moving_.Max(now_ms).value_or(-1);
-  stats_.timing_frame_info = timing_frame_info_counter_.Max(now_ms);
-  stats_.content_type = last_content_type_;
-  return stats_;
-}
-
-void ReceiveStatisticsProxy::OnIncomingPayloadType(int payload_type) {
-  rtc::CritScope lock(&crit_);
-  stats_.current_payload_type = payload_type;
-}
-
-void ReceiveStatisticsProxy::OnDecoderImplementationName(
-    const char* implementation_name) {
-  rtc::CritScope lock(&crit_);
-  stats_.decoder_implementation_name = implementation_name;
-}
-void ReceiveStatisticsProxy::OnIncomingRate(unsigned int framerate,
-                                            unsigned int bitrate_bps) {
-  rtc::CritScope lock(&crit_);
-  if (stats_.rtp_stats.first_packet_time_ms != -1)
-    QualitySample();
-}
-
-void ReceiveStatisticsProxy::OnFrameBufferTimingsUpdated(
-    int decode_ms,
-    int max_decode_ms,
-    int current_delay_ms,
-    int target_delay_ms,
-    int jitter_buffer_ms,
-    int min_playout_delay_ms,
-    int render_delay_ms) {
-  rtc::CritScope lock(&crit_);
-  stats_.decode_ms = decode_ms;
-  stats_.max_decode_ms = max_decode_ms;
-  stats_.current_delay_ms = current_delay_ms;
-  stats_.target_delay_ms = target_delay_ms;
-  stats_.jitter_buffer_ms = jitter_buffer_ms;
-  stats_.min_playout_delay_ms = min_playout_delay_ms;
-  stats_.render_delay_ms = render_delay_ms;
-  decode_time_counter_.Add(decode_ms);
-  jitter_buffer_delay_counter_.Add(jitter_buffer_ms);
-  target_delay_counter_.Add(target_delay_ms);
-  current_delay_counter_.Add(current_delay_ms);
-  // Network delay (rtt/2) + target_delay_ms (jitter delay + decode time +
-  // render delay).
-  delay_counter_.Add(target_delay_ms + avg_rtt_ms_ / 2);
-}
-
-void ReceiveStatisticsProxy::OnTimingFrameInfoUpdated(
-    const TimingFrameInfo& info) {
-  int64_t now_ms = clock_->TimeInMilliseconds();
-  rtc::CritScope lock(&crit_);
-  timing_frame_info_counter_.Add(info, now_ms);
-}
-
-void ReceiveStatisticsProxy::RtcpPacketTypesCounterUpdated(
-    uint32_t ssrc,
-    const RtcpPacketTypeCounter& packet_counter) {
-  rtc::CritScope lock(&crit_);
-  if (stats_.ssrc != ssrc)
-    return;
-  stats_.rtcp_packet_type_counts = packet_counter;
-}
-
-void ReceiveStatisticsProxy::StatisticsUpdated(
-    const webrtc::RtcpStatistics& statistics,
-    uint32_t ssrc) {
-  rtc::CritScope lock(&crit_);
-  // TODO(pbos): Handle both local and remote ssrcs here and RTC_DCHECK that we
-  // receive stats from one of them.
-  if (stats_.ssrc != ssrc)
-    return;
-  stats_.rtcp_stats = statistics;
-  report_block_stats_.Store(statistics, ssrc, 0);
-
-  if (first_report_block_time_ms_ == -1)
-    first_report_block_time_ms_ = clock_->TimeInMilliseconds();
-}
-
-void ReceiveStatisticsProxy::CNameChanged(const char* cname, uint32_t ssrc) {
-  rtc::CritScope lock(&crit_);
-  // TODO(pbos): Handle both local and remote ssrcs here and RTC_DCHECK that we
-  // receive stats from one of them.
-  if (stats_.ssrc != ssrc)
-    return;
-  stats_.c_name = cname;
-}
-
-void ReceiveStatisticsProxy::DataCountersUpdated(
-    const webrtc::StreamDataCounters& counters,
-    uint32_t ssrc) {
-  size_t last_total_bytes = 0;
-  size_t total_bytes = 0;
-  rtc::CritScope lock(&crit_);
-  if (ssrc == stats_.ssrc) {
-    last_total_bytes = stats_.rtp_stats.transmitted.TotalBytes();
-    total_bytes = counters.transmitted.TotalBytes();
-    stats_.rtp_stats = counters;
-  } else {
-    auto it = rtx_stats_.find(ssrc);
-    if (it != rtx_stats_.end()) {
-      last_total_bytes = it->second.transmitted.TotalBytes();
-      total_bytes = counters.transmitted.TotalBytes();
-      it->second = counters;
-    } else {
-      RTC_NOTREACHED() << "Unexpected stream ssrc: " << ssrc;
-    }
-  }
-  if (total_bytes > last_total_bytes)
-    total_byte_tracker_.AddSamples(total_bytes - last_total_bytes);
-}
-
-void ReceiveStatisticsProxy::OnDecodedFrame(rtc::Optional<uint8_t> qp,
-                                            VideoContentType content_type) {
-  uint64_t now = clock_->TimeInMilliseconds();
-
-  rtc::CritScope lock(&crit_);
-
-  ContentSpecificStats* content_specific_stats =
-      &content_specific_stats_[content_type];
-  ++stats_.frames_decoded;
-  if (qp) {
-    if (!stats_.qp_sum) {
-      if (stats_.frames_decoded != 1) {
-        LOG(LS_WARNING)
-            << "Frames decoded was not 1 when first qp value was received.";
-        stats_.frames_decoded = 1;
-      }
-      stats_.qp_sum = rtc::Optional<uint64_t>(0);
-    }
-    *stats_.qp_sum += *qp;
-    content_specific_stats->qp_counter.Add(*qp);
-  } else if (stats_.qp_sum) {
-    LOG(LS_WARNING)
-        << "QP sum was already set and no QP was given for a frame.";
-    stats_.qp_sum = rtc::Optional<uint64_t>();
-  }
-  last_content_type_ = content_type;
-  decode_fps_estimator_.Update(1, now);
-  if (last_decoded_frame_time_ms_) {
-    int64_t interframe_delay_ms = now - *last_decoded_frame_time_ms_;
-    RTC_DCHECK_GE(interframe_delay_ms, 0);
-    interframe_delay_max_moving_.Add(interframe_delay_ms, now);
-    content_specific_stats->interframe_delay_counter.Add(interframe_delay_ms);
-    content_specific_stats->flow_duration_ms += interframe_delay_ms;
-  }
-  last_decoded_frame_time_ms_.emplace(now);
-}
-
-void ReceiveStatisticsProxy::OnRenderedFrame(const VideoFrame& frame) {
-  int width = frame.width();
-  int height = frame.height();
-  RTC_DCHECK_GT(width, 0);
-  RTC_DCHECK_GT(height, 0);
-  uint64_t now = clock_->TimeInMilliseconds();
-  rtc::CritScope lock(&crit_);
-  ContentSpecificStats* content_specific_stats =
-      &content_specific_stats_[last_content_type_];
-  renders_fps_estimator_.Update(1, now);
-  ++stats_.frames_rendered;
-  stats_.width = width;
-  stats_.height = height;
-  render_fps_tracker_.AddSamples(1);
-  render_pixel_tracker_.AddSamples(sqrt(width * height));
-  content_specific_stats->received_width.Add(width);
-  content_specific_stats->received_height.Add(height);
-
-  if (frame.ntp_time_ms() > 0) {
-    int64_t delay_ms = clock_->CurrentNtpInMilliseconds() - frame.ntp_time_ms();
-    if (delay_ms >= 0) {
-      content_specific_stats->e2e_delay_counter.Add(delay_ms);
-    }
-  }
-}
-
-void ReceiveStatisticsProxy::OnSyncOffsetUpdated(int64_t sync_offset_ms,
-                                                 double estimated_freq_khz) {
-  rtc::CritScope lock(&crit_);
-  sync_offset_counter_.Add(std::abs(sync_offset_ms));
-  stats_.sync_offset_ms = sync_offset_ms;
-
-  const double kMaxFreqKhz = 10000.0;
-  int offset_khz = kMaxFreqKhz;
-  // Should not be zero or negative. If so, report max.
-  if (estimated_freq_khz < kMaxFreqKhz && estimated_freq_khz > 0.0)
-    offset_khz = static_cast<int>(std::fabs(estimated_freq_khz - 90.0) + 0.5);
-
-  freq_offset_counter_.Add(offset_khz);
-}
-
-void ReceiveStatisticsProxy::OnReceiveRatesUpdated(uint32_t bitRate,
-                                                   uint32_t frameRate) {
-}
-
-void ReceiveStatisticsProxy::OnCompleteFrame(bool is_keyframe,
-                                             size_t size_bytes,
-                                             VideoContentType content_type) {
-  rtc::CritScope lock(&crit_);
-  if (is_keyframe) {
-    ++stats_.frame_counts.key_frames;
-  } else {
-    ++stats_.frame_counts.delta_frames;
-  }
-
-  ContentSpecificStats* content_specific_stats =
-      &content_specific_stats_[content_type];
-
-  content_specific_stats->total_media_bytes += size_bytes;
-  if (is_keyframe) {
-    ++content_specific_stats->frame_counts.key_frames;
-  } else {
-    ++content_specific_stats->frame_counts.delta_frames;
-  }
-
-  int64_t now_ms = clock_->TimeInMilliseconds();
-  frame_window_.insert(std::make_pair(now_ms, size_bytes));
-  UpdateFramerate(now_ms);
-}
-
-void ReceiveStatisticsProxy::OnFrameCountsUpdated(
-    const FrameCounts& frame_counts) {
-  rtc::CritScope lock(&crit_);
-  stats_.frame_counts = frame_counts;
-}
-
-void ReceiveStatisticsProxy::OnDiscardedPacketsUpdated(int discarded_packets) {
-  rtc::CritScope lock(&crit_);
-  stats_.discarded_packets = discarded_packets;
-}
-
-void ReceiveStatisticsProxy::OnPreDecode(
-    const EncodedImage& encoded_image,
-    const CodecSpecificInfo* codec_specific_info) {
-  if (!codec_specific_info || encoded_image.qp_ == -1) {
-    return;
-  }
-  if (codec_specific_info->codecType == kVideoCodecVP8) {
-    qp_counters_.vp8.Add(encoded_image.qp_);
-    rtc::CritScope lock(&crit_);
-    qp_sample_.Add(encoded_image.qp_);
-  }
-}
-
-void ReceiveStatisticsProxy::OnStreamInactive() {
-  // TODO(sprang): Figure out any other state that should be reset.
-
-  rtc::CritScope lock(&crit_);
-  // Don't report inter-frame delay if stream was paused.
-  last_decoded_frame_time_ms_.reset();
-}
-
-void ReceiveStatisticsProxy::SampleCounter::Add(int sample) {
-  sum += sample;
-  ++num_samples;
-  if (!max || sample > *max) {
-    max.emplace(sample);
-  }
-}
-
-void ReceiveStatisticsProxy::SampleCounter::Add(const SampleCounter& other) {
-  sum += other.sum;
-  num_samples += other.num_samples;
-  if (other.max && (!max || *max < *other.max))
-    max = other.max;
-}
-
-int ReceiveStatisticsProxy::SampleCounter::Avg(
-    int64_t min_required_samples) const {
-  if (num_samples < min_required_samples || num_samples == 0)
-    return -1;
-  return static_cast<int>(sum / num_samples);
-}
-
-int ReceiveStatisticsProxy::SampleCounter::Max() const {
-  return max.value_or(-1);
-}
-
-void ReceiveStatisticsProxy::SampleCounter::Reset() {
-  num_samples = 0;
-  sum = 0;
-  max.reset();
-}
-
-void ReceiveStatisticsProxy::OnRttUpdate(int64_t avg_rtt_ms,
-                                         int64_t max_rtt_ms) {
-  rtc::CritScope lock(&crit_);
-  avg_rtt_ms_ = avg_rtt_ms;
-}
-
-void ReceiveStatisticsProxy::ContentSpecificStats::Add(
-    const ContentSpecificStats& other) {
-  e2e_delay_counter.Add(other.e2e_delay_counter);
-  interframe_delay_counter.Add(other.interframe_delay_counter);
-  flow_duration_ms += other.flow_duration_ms;
-  total_media_bytes += other.total_media_bytes;
-  received_height.Add(other.received_height);
-  received_width.Add(other.received_width);
-  qp_counter.Add(other.qp_counter);
-  frame_counts.key_frames += other.frame_counts.key_frames;
-  frame_counts.delta_frames += other.frame_counts.delta_frames;
-}
-
-}  // namespace webrtc
diff --git a/video/receive_statistics_proxy.h b/video/receive_statistics_proxy.h
deleted file mode 100644
index 262be64..0000000
--- a/video/receive_statistics_proxy.h
+++ /dev/null
@@ -1,188 +0,0 @@
-/*
- *  Copyright (c) 2013 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_VIDEO_RECEIVE_STATISTICS_PROXY_H_
-#define WEBRTC_VIDEO_RECEIVE_STATISTICS_PROXY_H_
-
-#include <map>
-#include <string>
-
-#include "webrtc/api/optional.h"
-#include "webrtc/call/video_receive_stream.h"
-#include "webrtc/common_types.h"
-#include "webrtc/common_video/include/frame_callback.h"
-#include "webrtc/modules/video_coding/include/video_coding_defines.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/moving_max_counter.h"
-#include "webrtc/rtc_base/rate_statistics.h"
-#include "webrtc/rtc_base/ratetracker.h"
-#include "webrtc/rtc_base/thread_annotations.h"
-#include "webrtc/video/quality_threshold.h"
-#include "webrtc/video/report_block_stats.h"
-#include "webrtc/video/stats_counter.h"
-#include "webrtc/video/video_stream_decoder.h"
-
-namespace webrtc {
-
-class Clock;
-class ViECodec;
-class ViEDecoderObserver;
-struct CodecSpecificInfo;
-
-class ReceiveStatisticsProxy : public VCMReceiveStatisticsCallback,
-                               public RtcpStatisticsCallback,
-                               public RtcpPacketTypeCounterObserver,
-                               public StreamDataCountersCallback,
-                               public CallStatsObserver {
- public:
-  ReceiveStatisticsProxy(const VideoReceiveStream::Config* config,
-                         Clock* clock);
-  virtual ~ReceiveStatisticsProxy();
-
-  VideoReceiveStream::Stats GetStats() const;
-
-  void OnDecodedFrame(rtc::Optional<uint8_t> qp, VideoContentType content_type);
-  void OnSyncOffsetUpdated(int64_t sync_offset_ms, double estimated_freq_khz);
-  void OnRenderedFrame(const VideoFrame& frame);
-  void OnIncomingPayloadType(int payload_type);
-  void OnDecoderImplementationName(const char* implementation_name);
-  void OnIncomingRate(unsigned int framerate, unsigned int bitrate_bps);
-
-  void OnPreDecode(const EncodedImage& encoded_image,
-                   const CodecSpecificInfo* codec_specific_info);
-
-  // Indicates video stream has been paused (no incoming packets).
-  void OnStreamInactive();
-
-  // Overrides VCMReceiveStatisticsCallback.
-  void OnReceiveRatesUpdated(uint32_t bitRate, uint32_t frameRate) override;
-  void OnFrameCountsUpdated(const FrameCounts& frame_counts) override;
-  void OnDiscardedPacketsUpdated(int discarded_packets) override;
-  void OnCompleteFrame(bool is_keyframe,
-                       size_t size_bytes,
-                       VideoContentType content_type) override;
-  void OnFrameBufferTimingsUpdated(int decode_ms,
-                                   int max_decode_ms,
-                                   int current_delay_ms,
-                                   int target_delay_ms,
-                                   int jitter_buffer_ms,
-                                   int min_playout_delay_ms,
-                                   int render_delay_ms) override;
-
-  void OnTimingFrameInfoUpdated(const TimingFrameInfo& info) override;
-
-  // Overrides RtcpStatisticsCallback.
-  void StatisticsUpdated(const webrtc::RtcpStatistics& statistics,
-                         uint32_t ssrc) override;
-  void CNameChanged(const char* cname, uint32_t ssrc) override;
-
-  // Overrides RtcpPacketTypeCounterObserver.
-  void RtcpPacketTypesCounterUpdated(
-      uint32_t ssrc,
-      const RtcpPacketTypeCounter& packet_counter) override;
-  // Overrides StreamDataCountersCallback.
-  void DataCountersUpdated(const webrtc::StreamDataCounters& counters,
-                           uint32_t ssrc) override;
-
-  // Implements CallStatsObserver.
-  void OnRttUpdate(int64_t avg_rtt_ms, int64_t max_rtt_ms) override;
-
- private:
-  struct SampleCounter {
-    SampleCounter() : sum(0), num_samples(0) {}
-    void Add(int sample);
-    int Avg(int64_t min_required_samples) const;
-    int Max() const;
-    void Reset();
-    void Add(const SampleCounter& other);
-
-   private:
-    int64_t sum;
-    int64_t num_samples;
-    rtc::Optional<int> max;
-  };
-
-  struct QpCounters {
-    SampleCounter vp8;
-  };
-
-  struct ContentSpecificStats {
-    void Add(const ContentSpecificStats& other);
-
-    SampleCounter e2e_delay_counter;
-    SampleCounter interframe_delay_counter;
-    int64_t flow_duration_ms = 0;
-    int64_t total_media_bytes = 0;
-    SampleCounter received_width;
-    SampleCounter received_height;
-    SampleCounter qp_counter;
-    FrameCounts frame_counts;
-  };
-
-  void UpdateHistograms() RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_);
-
-  void QualitySample() RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_);
-
-  // Removes info about old frames and then updates the framerate.
-  void UpdateFramerate(int64_t now_ms) const
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_);
-
-  Clock* const clock_;
-  // Ownership of this object lies with the owner of the ReceiveStatisticsProxy
-  // instance.  Lifetime is guaranteed to outlive |this|.
-  // TODO(tommi): In practice the config_ reference is only used for accessing
-  // config_.rtp.ulpfec.ulpfec_payload_type.  Instead of holding a pointer back,
-  // we could just store the value of ulpfec_payload_type and change the
-  // ReceiveStatisticsProxy() ctor to accept a const& of Config (since we'll
-  // then no longer store a pointer to the object).
-  const VideoReceiveStream::Config& config_;
-  const int64_t start_ms_;
-
-  rtc::CriticalSection crit_;
-  int64_t last_sample_time_ RTC_GUARDED_BY(crit_);
-  QualityThreshold fps_threshold_ RTC_GUARDED_BY(crit_);
-  QualityThreshold qp_threshold_ RTC_GUARDED_BY(crit_);
-  QualityThreshold variance_threshold_ RTC_GUARDED_BY(crit_);
-  SampleCounter qp_sample_ RTC_GUARDED_BY(crit_);
-  int num_bad_states_ RTC_GUARDED_BY(crit_);
-  int num_certain_states_ RTC_GUARDED_BY(crit_);
-  mutable VideoReceiveStream::Stats stats_ RTC_GUARDED_BY(crit_);
-  RateStatistics decode_fps_estimator_ RTC_GUARDED_BY(crit_);
-  RateStatistics renders_fps_estimator_ RTC_GUARDED_BY(crit_);
-  rtc::RateTracker render_fps_tracker_ RTC_GUARDED_BY(crit_);
-  rtc::RateTracker render_pixel_tracker_ RTC_GUARDED_BY(crit_);
-  rtc::RateTracker total_byte_tracker_ RTC_GUARDED_BY(crit_);
-  SampleCounter sync_offset_counter_ RTC_GUARDED_BY(crit_);
-  SampleCounter decode_time_counter_ RTC_GUARDED_BY(crit_);
-  SampleCounter jitter_buffer_delay_counter_ RTC_GUARDED_BY(crit_);
-  SampleCounter target_delay_counter_ RTC_GUARDED_BY(crit_);
-  SampleCounter current_delay_counter_ RTC_GUARDED_BY(crit_);
-  SampleCounter delay_counter_ RTC_GUARDED_BY(crit_);
-  mutable rtc::MovingMaxCounter<int> interframe_delay_max_moving_
-      RTC_GUARDED_BY(crit_);
-  std::map<VideoContentType, ContentSpecificStats> content_specific_stats_
-      RTC_GUARDED_BY(crit_);
-  MaxCounter freq_offset_counter_ RTC_GUARDED_BY(crit_);
-  int64_t first_report_block_time_ms_ RTC_GUARDED_BY(crit_);
-  ReportBlockStats report_block_stats_ RTC_GUARDED_BY(crit_);
-  QpCounters qp_counters_;  // Only accessed on the decoding thread.
-  std::map<uint32_t, StreamDataCounters> rtx_stats_ RTC_GUARDED_BY(crit_);
-  int64_t avg_rtt_ms_ RTC_GUARDED_BY(crit_);
-  mutable std::map<int64_t, size_t> frame_window_ RTC_GUARDED_BY(&crit_);
-  VideoContentType last_content_type_ RTC_GUARDED_BY(&crit_);
-  rtc::Optional<int64_t> last_decoded_frame_time_ms_ RTC_GUARDED_BY(&crit_);
-  // Mutable because calling Max() on MovingMaxCounter is not const. Yet it is
-  // called from const GetStats().
-  mutable rtc::MovingMaxCounter<TimingFrameInfo> timing_frame_info_counter_
-      RTC_GUARDED_BY(&crit_);
-};
-
-}  // namespace webrtc
-#endif  // WEBRTC_VIDEO_RECEIVE_STATISTICS_PROXY_H_
diff --git a/video/receive_statistics_proxy_unittest.cc b/video/receive_statistics_proxy_unittest.cc
deleted file mode 100644
index 068b221..0000000
--- a/video/receive_statistics_proxy_unittest.cc
+++ /dev/null
@@ -1,972 +0,0 @@
-/*
- *  Copyright 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/video/receive_statistics_proxy.h"
-
-#include <limits>
-#include <memory>
-
-#include "webrtc/api/video/i420_buffer.h"
-#include "webrtc/api/video/video_frame.h"
-#include "webrtc/api/video/video_rotation.h"
-#include "webrtc/modules/video_coding/include/video_codec_interface.h"
-#include "webrtc/system_wrappers/include/metrics.h"
-#include "webrtc/system_wrappers/include/metrics_default.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-namespace {
-const int64_t kFreqOffsetProcessIntervalInMs = 40000;
-const uint32_t kLocalSsrc = 123;
-const uint32_t kRemoteSsrc = 456;
-const int kMinRequiredSamples = 200;
-}  // namespace
-
-// TODO(sakal): ReceiveStatisticsProxy is lacking unittesting.
-class ReceiveStatisticsProxyTest
-    : public ::testing::TestWithParam<webrtc::VideoContentType> {
- public:
-  ReceiveStatisticsProxyTest() : fake_clock_(1234), config_(GetTestConfig()) {}
-  virtual ~ReceiveStatisticsProxyTest() {}
-
- protected:
-  virtual void SetUp() {
-    metrics::Reset();
-    statistics_proxy_.reset(new ReceiveStatisticsProxy(&config_, &fake_clock_));
-  }
-
-  VideoReceiveStream::Config GetTestConfig() {
-    VideoReceiveStream::Config config(nullptr);
-    config.rtp.local_ssrc = kLocalSsrc;
-    config.rtp.remote_ssrc = kRemoteSsrc;
-    return config;
-  }
-
-  void InsertFirstRtpPacket(uint32_t ssrc) {
-    StreamDataCounters counters;
-    counters.first_packet_time_ms = fake_clock_.TimeInMilliseconds();
-    statistics_proxy_->DataCountersUpdated(counters, ssrc);
-  }
-
-  VideoFrame CreateFrame(int width, int height) {
-    VideoFrame frame(I420Buffer::Create(width, height), 0, 0, kVideoRotation_0);
-    frame.set_ntp_time_ms(fake_clock_.CurrentNtpInMilliseconds());
-    return frame;
-  }
-
-  SimulatedClock fake_clock_;
-  const VideoReceiveStream::Config config_;
-  std::unique_ptr<ReceiveStatisticsProxy> statistics_proxy_;
-};
-
-TEST_F(ReceiveStatisticsProxyTest, OnDecodedFrameIncreasesFramesDecoded) {
-  EXPECT_EQ(0u, statistics_proxy_->GetStats().frames_decoded);
-  for (uint32_t i = 1; i <= 3; ++i) {
-    statistics_proxy_->OnDecodedFrame(rtc::Optional<uint8_t>(),
-                                      VideoContentType::UNSPECIFIED);
-    EXPECT_EQ(i, statistics_proxy_->GetStats().frames_decoded);
-  }
-}
-
-TEST_F(ReceiveStatisticsProxyTest, OnDecodedFrameWithQpResetsFramesDecoded) {
-  EXPECT_EQ(0u, statistics_proxy_->GetStats().frames_decoded);
-  for (uint32_t i = 1; i <= 3; ++i) {
-    statistics_proxy_->OnDecodedFrame(rtc::Optional<uint8_t>(),
-                                      VideoContentType::UNSPECIFIED);
-    EXPECT_EQ(i, statistics_proxy_->GetStats().frames_decoded);
-  }
-  statistics_proxy_->OnDecodedFrame(rtc::Optional<uint8_t>(1u),
-                                    VideoContentType::UNSPECIFIED);
-  EXPECT_EQ(1u, statistics_proxy_->GetStats().frames_decoded);
-}
-
-TEST_F(ReceiveStatisticsProxyTest, OnDecodedFrameIncreasesQpSum) {
-  EXPECT_EQ(rtc::Optional<uint64_t>(), statistics_proxy_->GetStats().qp_sum);
-  statistics_proxy_->OnDecodedFrame(rtc::Optional<uint8_t>(3u),
-                                    VideoContentType::UNSPECIFIED);
-  EXPECT_EQ(rtc::Optional<uint64_t>(3u), statistics_proxy_->GetStats().qp_sum);
-  statistics_proxy_->OnDecodedFrame(rtc::Optional<uint8_t>(127u),
-                                    VideoContentType::UNSPECIFIED);
-  EXPECT_EQ(rtc::Optional<uint64_t>(130u),
-            statistics_proxy_->GetStats().qp_sum);
-}
-
-TEST_F(ReceiveStatisticsProxyTest, ReportsContentType) {
-  const std::string kRealtimeString("realtime");
-  const std::string kScreenshareString("screen");
-  EXPECT_EQ(kRealtimeString, videocontenttypehelpers::ToString(
-                            statistics_proxy_->GetStats().content_type));
-  statistics_proxy_->OnDecodedFrame(rtc::Optional<uint8_t>(3u),
-                                    VideoContentType::SCREENSHARE);
-  EXPECT_EQ(kScreenshareString, videocontenttypehelpers::ToString(
-                          statistics_proxy_->GetStats().content_type));
-  statistics_proxy_->OnDecodedFrame(rtc::Optional<uint8_t>(3u),
-                                    VideoContentType::UNSPECIFIED);
-  EXPECT_EQ(kRealtimeString, videocontenttypehelpers::ToString(
-                            statistics_proxy_->GetStats().content_type));
-}
-
-TEST_F(ReceiveStatisticsProxyTest, ReportsMaxInterframeDelay) {
-  const int64_t kInterframeDelayMs1 = 100;
-  const int64_t kInterframeDelayMs2 = 200;
-  const int64_t kInterframeDelayMs3 = 100;
-  EXPECT_EQ(-1, statistics_proxy_->GetStats().interframe_delay_max_ms);
-  statistics_proxy_->OnDecodedFrame(rtc::Optional<uint8_t>(3u),
-                                    VideoContentType::UNSPECIFIED);
-  EXPECT_EQ(-1, statistics_proxy_->GetStats().interframe_delay_max_ms);
-
-  fake_clock_.AdvanceTimeMilliseconds(kInterframeDelayMs1);
-  statistics_proxy_->OnDecodedFrame(rtc::Optional<uint8_t>(127u),
-                                    VideoContentType::UNSPECIFIED);
-  EXPECT_EQ(kInterframeDelayMs1,
-            statistics_proxy_->GetStats().interframe_delay_max_ms);
-
-  fake_clock_.AdvanceTimeMilliseconds(kInterframeDelayMs2);
-  statistics_proxy_->OnDecodedFrame(rtc::Optional<uint8_t>(127u),
-                                    VideoContentType::UNSPECIFIED);
-  EXPECT_EQ(kInterframeDelayMs2,
-            statistics_proxy_->GetStats().interframe_delay_max_ms);
-
-  fake_clock_.AdvanceTimeMilliseconds(kInterframeDelayMs3);
-  statistics_proxy_->OnDecodedFrame(rtc::Optional<uint8_t>(127u),
-                                    VideoContentType::UNSPECIFIED);
-  // kInterframeDelayMs3 is smaller than kInterframeDelayMs2.
-  EXPECT_EQ(kInterframeDelayMs2,
-            statistics_proxy_->GetStats().interframe_delay_max_ms);
-}
-
-TEST_F(ReceiveStatisticsProxyTest, ReportInterframeDelayInWindow) {
-  const int64_t kInterframeDelayMs1 = 9000;
-  const int64_t kInterframeDelayMs2 = 7500;
-  const int64_t kInterframeDelayMs3 = 7000;
-  EXPECT_EQ(-1, statistics_proxy_->GetStats().interframe_delay_max_ms);
-  statistics_proxy_->OnDecodedFrame(rtc::Optional<uint8_t>(3u),
-                                    VideoContentType::UNSPECIFIED);
-  EXPECT_EQ(-1, statistics_proxy_->GetStats().interframe_delay_max_ms);
-
-  fake_clock_.AdvanceTimeMilliseconds(kInterframeDelayMs1);
-  statistics_proxy_->OnDecodedFrame(rtc::Optional<uint8_t>(127u),
-                                    VideoContentType::UNSPECIFIED);
-  EXPECT_EQ(kInterframeDelayMs1,
-            statistics_proxy_->GetStats().interframe_delay_max_ms);
-
-  fake_clock_.AdvanceTimeMilliseconds(kInterframeDelayMs2);
-  statistics_proxy_->OnDecodedFrame(rtc::Optional<uint8_t>(127u),
-                                    VideoContentType::UNSPECIFIED);
-  // Still first delay is the maximum
-  EXPECT_EQ(kInterframeDelayMs1,
-            statistics_proxy_->GetStats().interframe_delay_max_ms);
-
-  fake_clock_.AdvanceTimeMilliseconds(kInterframeDelayMs3);
-  statistics_proxy_->OnDecodedFrame(rtc::Optional<uint8_t>(127u),
-                                    VideoContentType::UNSPECIFIED);
-  // Now the first sample is out of the window, so the second is the maximum.
-  EXPECT_EQ(kInterframeDelayMs2,
-            statistics_proxy_->GetStats().interframe_delay_max_ms);
-}
-
-TEST_F(ReceiveStatisticsProxyTest, OnDecodedFrameWithoutQpQpSumWontExist) {
-  EXPECT_EQ(rtc::Optional<uint64_t>(), statistics_proxy_->GetStats().qp_sum);
-  statistics_proxy_->OnDecodedFrame(rtc::Optional<uint8_t>(),
-                                    VideoContentType::UNSPECIFIED);
-  EXPECT_EQ(rtc::Optional<uint64_t>(), statistics_proxy_->GetStats().qp_sum);
-}
-
-TEST_F(ReceiveStatisticsProxyTest, OnDecodedFrameWithoutQpResetsQpSum) {
-  EXPECT_EQ(rtc::Optional<uint64_t>(), statistics_proxy_->GetStats().qp_sum);
-  statistics_proxy_->OnDecodedFrame(rtc::Optional<uint8_t>(3u),
-                                    VideoContentType::UNSPECIFIED);
-  EXPECT_EQ(rtc::Optional<uint64_t>(3u), statistics_proxy_->GetStats().qp_sum);
-  statistics_proxy_->OnDecodedFrame(rtc::Optional<uint8_t>(),
-                                    VideoContentType::UNSPECIFIED);
-  EXPECT_EQ(rtc::Optional<uint64_t>(), statistics_proxy_->GetStats().qp_sum);
-}
-
-TEST_F(ReceiveStatisticsProxyTest, OnRenderedFrameIncreasesFramesRendered) {
-  EXPECT_EQ(0u, statistics_proxy_->GetStats().frames_rendered);
-  webrtc::VideoFrame frame(webrtc::I420Buffer::Create(1, 1), 0, 0,
-                           webrtc::kVideoRotation_0);
-  for (uint32_t i = 1; i <= 3; ++i) {
-    statistics_proxy_->OnRenderedFrame(frame);
-    EXPECT_EQ(i, statistics_proxy_->GetStats().frames_rendered);
-  }
-}
-
-TEST_F(ReceiveStatisticsProxyTest, GetStatsReportsSsrc) {
-  EXPECT_EQ(kRemoteSsrc, statistics_proxy_->GetStats().ssrc);
-}
-
-TEST_F(ReceiveStatisticsProxyTest, GetStatsReportsIncomingPayloadType) {
-  const int kPayloadType = 111;
-  statistics_proxy_->OnIncomingPayloadType(kPayloadType);
-  EXPECT_EQ(kPayloadType, statistics_proxy_->GetStats().current_payload_type);
-}
-
-TEST_F(ReceiveStatisticsProxyTest, GetStatsReportsDecoderImplementationName) {
-  const char* kName = "decoderName";
-  statistics_proxy_->OnDecoderImplementationName(kName);
-  EXPECT_STREQ(
-      kName, statistics_proxy_->GetStats().decoder_implementation_name.c_str());
-}
-
-TEST_F(ReceiveStatisticsProxyTest, GetStatsReportsOnCompleteFrame) {
-  const int kFrameSizeBytes = 1000;
-  statistics_proxy_->OnCompleteFrame(true, kFrameSizeBytes,
-                                     VideoContentType::UNSPECIFIED);
-  VideoReceiveStream::Stats stats = statistics_proxy_->GetStats();
-  EXPECT_EQ(1, stats.network_frame_rate);
-  EXPECT_EQ(1, stats.frame_counts.key_frames);
-  EXPECT_EQ(0, stats.frame_counts.delta_frames);
-}
-
-TEST_F(ReceiveStatisticsProxyTest, GetStatsReportsDecodeTimingStats) {
-  const int kDecodeMs = 1;
-  const int kMaxDecodeMs = 2;
-  const int kCurrentDelayMs = 3;
-  const int kTargetDelayMs = 4;
-  const int kJitterBufferMs = 5;
-  const int kMinPlayoutDelayMs = 6;
-  const int kRenderDelayMs = 7;
-  const int64_t kRttMs = 8;
-  statistics_proxy_->OnRttUpdate(kRttMs, 0);
-  statistics_proxy_->OnFrameBufferTimingsUpdated(
-      kDecodeMs, kMaxDecodeMs, kCurrentDelayMs, kTargetDelayMs, kJitterBufferMs,
-      kMinPlayoutDelayMs, kRenderDelayMs);
-  VideoReceiveStream::Stats stats = statistics_proxy_->GetStats();
-  EXPECT_EQ(kDecodeMs, stats.decode_ms);
-  EXPECT_EQ(kMaxDecodeMs, stats.max_decode_ms);
-  EXPECT_EQ(kCurrentDelayMs, stats.current_delay_ms);
-  EXPECT_EQ(kTargetDelayMs, stats.target_delay_ms);
-  EXPECT_EQ(kJitterBufferMs, stats.jitter_buffer_ms);
-  EXPECT_EQ(kMinPlayoutDelayMs, stats.min_playout_delay_ms);
-  EXPECT_EQ(kRenderDelayMs, stats.render_delay_ms);
-}
-
-TEST_F(ReceiveStatisticsProxyTest, GetStatsReportsRtcpPacketTypeCounts) {
-  const uint32_t kFirPackets = 33;
-  const uint32_t kPliPackets = 44;
-  const uint32_t kNackPackets = 55;
-  RtcpPacketTypeCounter counter;
-  counter.fir_packets = kFirPackets;
-  counter.pli_packets = kPliPackets;
-  counter.nack_packets = kNackPackets;
-  statistics_proxy_->RtcpPacketTypesCounterUpdated(kRemoteSsrc, counter);
-  VideoReceiveStream::Stats stats = statistics_proxy_->GetStats();
-  EXPECT_EQ(kFirPackets, stats.rtcp_packet_type_counts.fir_packets);
-  EXPECT_EQ(kPliPackets, stats.rtcp_packet_type_counts.pli_packets);
-  EXPECT_EQ(kNackPackets, stats.rtcp_packet_type_counts.nack_packets);
-}
-
-TEST_F(ReceiveStatisticsProxyTest,
-       GetStatsReportsNoRtcpPacketTypeCountsForUnknownSsrc) {
-  RtcpPacketTypeCounter counter;
-  counter.fir_packets = 33;
-  statistics_proxy_->RtcpPacketTypesCounterUpdated(kRemoteSsrc + 1, counter);
-  EXPECT_EQ(0u,
-            statistics_proxy_->GetStats().rtcp_packet_type_counts.fir_packets);
-}
-
-TEST_F(ReceiveStatisticsProxyTest, GetStatsReportsFrameCounts) {
-  const int kKeyFrames = 3;
-  const int kDeltaFrames = 22;
-  FrameCounts frame_counts;
-  frame_counts.key_frames = kKeyFrames;
-  frame_counts.delta_frames = kDeltaFrames;
-  statistics_proxy_->OnFrameCountsUpdated(frame_counts);
-  VideoReceiveStream::Stats stats = statistics_proxy_->GetStats();
-  EXPECT_EQ(kKeyFrames, stats.frame_counts.key_frames);
-  EXPECT_EQ(kDeltaFrames, stats.frame_counts.delta_frames);
-}
-
-TEST_F(ReceiveStatisticsProxyTest, GetStatsReportsDiscardedPackets) {
-  const int kDiscardedPackets = 12;
-  statistics_proxy_->OnDiscardedPacketsUpdated(kDiscardedPackets);
-  EXPECT_EQ(kDiscardedPackets, statistics_proxy_->GetStats().discarded_packets);
-}
-
-TEST_F(ReceiveStatisticsProxyTest, GetStatsReportsRtcpStats) {
-  const uint8_t kFracLost = 0;
-  const uint32_t kCumLost = 1;
-  const uint32_t kExtSeqNum = 10;
-  const uint32_t kJitter = 4;
-
-  RtcpStatistics rtcp_stats;
-  rtcp_stats.fraction_lost = kFracLost;
-  rtcp_stats.packets_lost = kCumLost;
-  rtcp_stats.extended_highest_sequence_number = kExtSeqNum;
-  rtcp_stats.jitter = kJitter;
-  statistics_proxy_->StatisticsUpdated(rtcp_stats, kRemoteSsrc);
-
-  VideoReceiveStream::Stats stats = statistics_proxy_->GetStats();
-  EXPECT_EQ(kFracLost, stats.rtcp_stats.fraction_lost);
-  EXPECT_EQ(kCumLost, stats.rtcp_stats.packets_lost);
-  EXPECT_EQ(kExtSeqNum, stats.rtcp_stats.extended_highest_sequence_number);
-  EXPECT_EQ(kJitter, stats.rtcp_stats.jitter);
-}
-
-TEST_F(ReceiveStatisticsProxyTest, GetStatsReportsCName) {
-  const char* kName = "cName";
-  statistics_proxy_->CNameChanged(kName, kRemoteSsrc);
-  EXPECT_STREQ(kName, statistics_proxy_->GetStats().c_name.c_str());
-}
-
-TEST_F(ReceiveStatisticsProxyTest, GetStatsReportsNoCNameForUnknownSsrc) {
-  const char* kName = "cName";
-  statistics_proxy_->CNameChanged(kName, kRemoteSsrc + 1);
-  EXPECT_STREQ("", statistics_proxy_->GetStats().c_name.c_str());
-}
-
-TEST_F(ReceiveStatisticsProxyTest,
-       ReportsLongestTimingFrameInfo) {
-  const int64_t kShortEndToEndDelay = 10;
-  const int64_t kMedEndToEndDelay = 20;
-  const int64_t kLongEndToEndDelay = 100;
-  const uint32_t kExpectedRtpTimestamp = 2;
-  TimingFrameInfo info;
-  rtc::Optional<TimingFrameInfo> result;
-  info.rtp_timestamp = kExpectedRtpTimestamp - 1;
-  info.capture_time_ms = 0;
-  info.decode_finish_ms = kShortEndToEndDelay;
-  statistics_proxy_->OnTimingFrameInfoUpdated(info);
-  info.rtp_timestamp =
-      kExpectedRtpTimestamp;  // this frame should be reported in the end.
-  info.capture_time_ms = 0;
-  info.decode_finish_ms = kLongEndToEndDelay;
-  statistics_proxy_->OnTimingFrameInfoUpdated(info);
-  info.rtp_timestamp = kExpectedRtpTimestamp + 1;
-  info.capture_time_ms = 0;
-  info.decode_finish_ms = kMedEndToEndDelay;
-  statistics_proxy_->OnTimingFrameInfoUpdated(info);
-  result = statistics_proxy_->GetStats().timing_frame_info;
-  EXPECT_TRUE(result);
-  EXPECT_EQ(kExpectedRtpTimestamp, result->rtp_timestamp);
-}
-
-TEST_F(ReceiveStatisticsProxyTest, RespectsReportingIntervalForTimingFrames) {
-  TimingFrameInfo info;
-  const int64_t kShortEndToEndDelay = 10;
-  const uint32_t kExpectedRtpTimestamp = 2;
-  const int64_t kShortDelayMs = 1000;
-  const int64_t kLongDelayMs = 10000;
-  rtc::Optional<TimingFrameInfo> result;
-  info.rtp_timestamp = kExpectedRtpTimestamp;
-  info.capture_time_ms = 0;
-  info.decode_finish_ms = kShortEndToEndDelay;
-  statistics_proxy_->OnTimingFrameInfoUpdated(info);
-  fake_clock_.AdvanceTimeMilliseconds(kShortDelayMs);
-  result = statistics_proxy_->GetStats().timing_frame_info;
-  EXPECT_TRUE(result);
-  EXPECT_EQ(kExpectedRtpTimestamp, result->rtp_timestamp);
-  fake_clock_.AdvanceTimeMilliseconds(kLongDelayMs);
-  result = statistics_proxy_->GetStats().timing_frame_info;
-  EXPECT_FALSE(result);
-}
-
-TEST_F(ReceiveStatisticsProxyTest, LifetimeHistogramIsUpdated) {
-  const int64_t kTimeSec = 3;
-  fake_clock_.AdvanceTimeMilliseconds(kTimeSec * 1000);
-  // Need at least one frame to report stream lifetime.
-  statistics_proxy_->OnCompleteFrame(true, 1000, VideoContentType::UNSPECIFIED);
-  // Histograms are updated when the statistics_proxy_ is deleted.
-  statistics_proxy_.reset();
-  EXPECT_EQ(1,
-            metrics::NumSamples("WebRTC.Video.ReceiveStreamLifetimeInSeconds"));
-  EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.ReceiveStreamLifetimeInSeconds",
-                                  kTimeSec));
-}
-
-TEST_F(ReceiveStatisticsProxyTest,
-       LifetimeHistogramNotReportedForEmptyStreams) {
-  const int64_t kTimeSec = 3;
-  fake_clock_.AdvanceTimeMilliseconds(kTimeSec * 1000);
-  // No frames received.
-  // Histograms are updated when the statistics_proxy_ is deleted.
-  statistics_proxy_.reset();
-  EXPECT_EQ(0,
-            metrics::NumSamples("WebRTC.Video.ReceiveStreamLifetimeInSeconds"));
-}
-
-TEST_F(ReceiveStatisticsProxyTest, BadCallHistogramsAreUpdated) {
-  // Based on the tuning parameters this will produce 7 uncertain states,
-  // then 10 certainly bad states. There has to be 10 certain states before
-  // any histograms are recorded.
-  const int kNumBadSamples = 17;
-
-  StreamDataCounters counters;
-  counters.first_packet_time_ms = fake_clock_.TimeInMilliseconds();
-  statistics_proxy_->DataCountersUpdated(counters, config_.rtp.remote_ssrc);
-
-  for (int i = 0; i < kNumBadSamples; ++i) {
-    // Since OnRenderedFrame is never called the fps in each sample will be 0,
-    // i.e. bad
-    fake_clock_.AdvanceTimeMilliseconds(1000);
-    statistics_proxy_->OnIncomingRate(0, 0);
-  }
-  // Histograms are updated when the statistics_proxy_ is deleted.
-  statistics_proxy_.reset();
-  EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.BadCall.Any"));
-  EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.BadCall.Any", 100));
-
-  EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.BadCall.FrameRate"));
-  EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.BadCall.FrameRate", 100));
-
-  EXPECT_EQ(0, metrics::NumSamples("WebRTC.Video.BadCall.FrameRateVariance"));
-
-  EXPECT_EQ(0, metrics::NumSamples("WebRTC.Video.BadCall.Qp"));
-}
-
-TEST_F(ReceiveStatisticsProxyTest, PacketLossHistogramIsUpdated) {
-  const uint32_t kCumLost1 = 1;
-  const uint32_t kExtSeqNum1 = 10;
-  const uint32_t kCumLost2 = 2;
-  const uint32_t kExtSeqNum2 = 20;
-
-  // One report block received.
-  RtcpStatistics rtcp_stats1;
-  rtcp_stats1.packets_lost = kCumLost1;
-  rtcp_stats1.extended_highest_sequence_number = kExtSeqNum1;
-  statistics_proxy_->StatisticsUpdated(rtcp_stats1, kRemoteSsrc);
-
-  // Two report blocks received.
-  RtcpStatistics rtcp_stats2;
-  rtcp_stats2.packets_lost = kCumLost2;
-  rtcp_stats2.extended_highest_sequence_number = kExtSeqNum2;
-  statistics_proxy_->StatisticsUpdated(rtcp_stats2, kRemoteSsrc);
-
-  // Two received report blocks but min run time has not passed.
-  fake_clock_.AdvanceTimeMilliseconds(metrics::kMinRunTimeInSeconds * 1000 - 1);
-  SetUp();  // Reset stat proxy causes histograms to be updated.
-  EXPECT_EQ(0,
-            metrics::NumSamples("WebRTC.Video.ReceivedPacketsLostInPercent"));
-
-  // Two report blocks received.
-  statistics_proxy_->StatisticsUpdated(rtcp_stats1, kRemoteSsrc);
-  statistics_proxy_->StatisticsUpdated(rtcp_stats2, kRemoteSsrc);
-
-  // Two received report blocks and min run time has passed.
-  fake_clock_.AdvanceTimeMilliseconds(metrics::kMinRunTimeInSeconds * 1000);
-  SetUp();
-  EXPECT_EQ(1,
-            metrics::NumSamples("WebRTC.Video.ReceivedPacketsLostInPercent"));
-  EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.ReceivedPacketsLostInPercent",
-                                  (kCumLost2 - kCumLost1) * 100 /
-                                      (kExtSeqNum2 - kExtSeqNum1)));
-}
-
-TEST_F(ReceiveStatisticsProxyTest,
-       PacketLossHistogramIsNotUpdatedIfLessThanTwoReportBlocksAreReceived) {
-  RtcpStatistics rtcp_stats1;
-  rtcp_stats1.packets_lost = 1;
-  rtcp_stats1.extended_highest_sequence_number = 10;
-
-  // Min run time has passed but no received report block.
-  fake_clock_.AdvanceTimeMilliseconds(metrics::kMinRunTimeInSeconds * 1000);
-  SetUp();  // Reset stat proxy causes histograms to be updated.
-  EXPECT_EQ(0,
-            metrics::NumSamples("WebRTC.Video.ReceivedPacketsLostInPercent"));
-
-  // Min run time has passed but only one received report block.
-  statistics_proxy_->StatisticsUpdated(rtcp_stats1, kRemoteSsrc);
-  fake_clock_.AdvanceTimeMilliseconds(metrics::kMinRunTimeInSeconds * 1000);
-  SetUp();
-  EXPECT_EQ(0,
-            metrics::NumSamples("WebRTC.Video.ReceivedPacketsLostInPercent"));
-}
-
-TEST_F(ReceiveStatisticsProxyTest, GetStatsReportsAvSyncOffset) {
-  const int64_t kSyncOffsetMs = 22;
-  const double kFreqKhz = 90.0;
-  EXPECT_EQ(std::numeric_limits<int>::max(),
-            statistics_proxy_->GetStats().sync_offset_ms);
-  statistics_proxy_->OnSyncOffsetUpdated(kSyncOffsetMs, kFreqKhz);
-  EXPECT_EQ(kSyncOffsetMs, statistics_proxy_->GetStats().sync_offset_ms);
-}
-
-TEST_F(ReceiveStatisticsProxyTest, AvSyncOffsetHistogramIsUpdated) {
-  const int64_t kSyncOffsetMs = 22;
-  const double kFreqKhz = 90.0;
-  for (int i = 0; i < kMinRequiredSamples; ++i)
-    statistics_proxy_->OnSyncOffsetUpdated(kSyncOffsetMs, kFreqKhz);
-  // Histograms are updated when the statistics_proxy_ is deleted.
-  statistics_proxy_.reset();
-  EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.AVSyncOffsetInMs"));
-  EXPECT_EQ(1,
-            metrics::NumEvents("WebRTC.Video.AVSyncOffsetInMs", kSyncOffsetMs));
-}
-
-TEST_F(ReceiveStatisticsProxyTest, RtpToNtpFrequencyOffsetHistogramIsUpdated) {
-  const int64_t kSyncOffsetMs = 22;
-  const double kFreqKhz = 90.0;
-  statistics_proxy_->OnSyncOffsetUpdated(kSyncOffsetMs, kFreqKhz);
-  statistics_proxy_->OnSyncOffsetUpdated(kSyncOffsetMs, kFreqKhz + 2.2);
-  fake_clock_.AdvanceTimeMilliseconds(kFreqOffsetProcessIntervalInMs);
-  // Process interval passed, max diff: 2.
-  statistics_proxy_->OnSyncOffsetUpdated(kSyncOffsetMs, kFreqKhz + 1.1);
-  statistics_proxy_->OnSyncOffsetUpdated(kSyncOffsetMs, kFreqKhz - 4.2);
-  statistics_proxy_->OnSyncOffsetUpdated(kSyncOffsetMs, kFreqKhz - 0.9);
-  fake_clock_.AdvanceTimeMilliseconds(kFreqOffsetProcessIntervalInMs);
-  // Process interval passed, max diff: 4.
-  statistics_proxy_->OnSyncOffsetUpdated(kSyncOffsetMs, kFreqKhz);
-  statistics_proxy_.reset();
-  // Average reported: (2 + 4) / 2 = 3.
-  EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.RtpToNtpFreqOffsetInKhz"));
-  EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.RtpToNtpFreqOffsetInKhz", 3));
-}
-
-TEST_F(ReceiveStatisticsProxyTest, Vp8QpHistogramIsUpdated) {
-  const int kQp = 22;
-  EncodedImage encoded_image;
-  encoded_image.qp_ = kQp;
-  CodecSpecificInfo codec_info;
-  codec_info.codecType = kVideoCodecVP8;
-
-  for (int i = 0; i < kMinRequiredSamples; ++i)
-    statistics_proxy_->OnPreDecode(encoded_image, &codec_info);
-
-  statistics_proxy_.reset();
-  EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.Decoded.Vp8.Qp"));
-  EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.Decoded.Vp8.Qp", kQp));
-}
-
-TEST_F(ReceiveStatisticsProxyTest, Vp8QpHistogramIsNotUpdatedForTooFewSamples) {
-  EncodedImage encoded_image;
-  encoded_image.qp_ = 22;
-  CodecSpecificInfo codec_info;
-  codec_info.codecType = kVideoCodecVP8;
-
-  for (int i = 0; i < kMinRequiredSamples - 1; ++i)
-    statistics_proxy_->OnPreDecode(encoded_image, &codec_info);
-
-  statistics_proxy_.reset();
-  EXPECT_EQ(0, metrics::NumSamples("WebRTC.Video.Decoded.Vp8.Qp"));
-}
-
-TEST_F(ReceiveStatisticsProxyTest, Vp8QpHistogramIsNotUpdatedIfNoQpValue) {
-  EncodedImage encoded_image;
-  CodecSpecificInfo codec_info;
-  codec_info.codecType = kVideoCodecVP8;
-
-  for (int i = 0; i < kMinRequiredSamples; ++i)
-    statistics_proxy_->OnPreDecode(encoded_image, &codec_info);
-
-  statistics_proxy_.reset();
-  EXPECT_EQ(0, metrics::NumSamples("WebRTC.Video.Decoded.Vp8.Qp"));
-}
-
-TEST_F(ReceiveStatisticsProxyTest,
-       KeyFrameHistogramNotUpdatedForTooFewSamples) {
-  const bool kIsKeyFrame = false;
-  const int kFrameSizeBytes = 1000;
-
-  for (int i = 0; i < kMinRequiredSamples - 1; ++i)
-    statistics_proxy_->OnCompleteFrame(kIsKeyFrame, kFrameSizeBytes,
-                                       VideoContentType::UNSPECIFIED);
-
-  EXPECT_EQ(0, statistics_proxy_->GetStats().frame_counts.key_frames);
-  EXPECT_EQ(kMinRequiredSamples - 1,
-            statistics_proxy_->GetStats().frame_counts.delta_frames);
-
-  statistics_proxy_.reset();
-  EXPECT_EQ(0, metrics::NumSamples("WebRTC.Video.KeyFramesReceivedInPermille"));
-}
-
-TEST_F(ReceiveStatisticsProxyTest,
-       KeyFrameHistogramUpdatedForMinRequiredSamples) {
-  const bool kIsKeyFrame = false;
-  const int kFrameSizeBytes = 1000;
-
-  for (int i = 0; i < kMinRequiredSamples; ++i)
-    statistics_proxy_->OnCompleteFrame(kIsKeyFrame, kFrameSizeBytes,
-                                       VideoContentType::UNSPECIFIED);
-
-  EXPECT_EQ(0, statistics_proxy_->GetStats().frame_counts.key_frames);
-  EXPECT_EQ(kMinRequiredSamples,
-            statistics_proxy_->GetStats().frame_counts.delta_frames);
-
-  statistics_proxy_.reset();
-  EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.KeyFramesReceivedInPermille"));
-  EXPECT_EQ(1,
-            metrics::NumEvents("WebRTC.Video.KeyFramesReceivedInPermille", 0));
-}
-
-TEST_F(ReceiveStatisticsProxyTest, KeyFrameHistogramIsUpdated) {
-  const int kFrameSizeBytes = 1000;
-
-  for (int i = 0; i < kMinRequiredSamples; ++i)
-    statistics_proxy_->OnCompleteFrame(true, kFrameSizeBytes,
-                                       VideoContentType::UNSPECIFIED);
-
-  for (int i = 0; i < kMinRequiredSamples; ++i)
-    statistics_proxy_->OnCompleteFrame(false, kFrameSizeBytes,
-                                       VideoContentType::UNSPECIFIED);
-
-  EXPECT_EQ(kMinRequiredSamples,
-            statistics_proxy_->GetStats().frame_counts.key_frames);
-  EXPECT_EQ(kMinRequiredSamples,
-            statistics_proxy_->GetStats().frame_counts.delta_frames);
-
-  statistics_proxy_.reset();
-  EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.KeyFramesReceivedInPermille"));
-  EXPECT_EQ(
-      1, metrics::NumEvents("WebRTC.Video.KeyFramesReceivedInPermille", 500));
-}
-
-TEST_F(ReceiveStatisticsProxyTest, TimingHistogramsNotUpdatedForTooFewSamples) {
-  const int kDecodeMs = 1;
-  const int kMaxDecodeMs = 2;
-  const int kCurrentDelayMs = 3;
-  const int kTargetDelayMs = 4;
-  const int kJitterBufferMs = 5;
-  const int kMinPlayoutDelayMs = 6;
-  const int kRenderDelayMs = 7;
-
-  for (int i = 0; i < kMinRequiredSamples - 1; ++i) {
-    statistics_proxy_->OnFrameBufferTimingsUpdated(
-        kDecodeMs, kMaxDecodeMs, kCurrentDelayMs, kTargetDelayMs,
-        kJitterBufferMs, kMinPlayoutDelayMs, kRenderDelayMs);
-  }
-
-  statistics_proxy_.reset();
-  EXPECT_EQ(0, metrics::NumSamples("WebRTC.Video.DecodeTimeInMs"));
-  EXPECT_EQ(0, metrics::NumSamples("WebRTC.Video.JitterBufferDelayInMs"));
-  EXPECT_EQ(0, metrics::NumSamples("WebRTC.Video.TargetDelayInMs"));
-  EXPECT_EQ(0, metrics::NumSamples("WebRTC.Video.CurrentDelayInMs"));
-  EXPECT_EQ(0, metrics::NumSamples("WebRTC.Video.OnewayDelayInMs"));
-}
-
-TEST_F(ReceiveStatisticsProxyTest, TimingHistogramsAreUpdated) {
-  const int kDecodeMs = 1;
-  const int kMaxDecodeMs = 2;
-  const int kCurrentDelayMs = 3;
-  const int kTargetDelayMs = 4;
-  const int kJitterBufferMs = 5;
-  const int kMinPlayoutDelayMs = 6;
-  const int kRenderDelayMs = 7;
-
-  for (int i = 0; i < kMinRequiredSamples; ++i) {
-    statistics_proxy_->OnFrameBufferTimingsUpdated(
-        kDecodeMs, kMaxDecodeMs, kCurrentDelayMs, kTargetDelayMs,
-        kJitterBufferMs, kMinPlayoutDelayMs, kRenderDelayMs);
-  }
-
-  statistics_proxy_.reset();
-  EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.DecodeTimeInMs"));
-  EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.JitterBufferDelayInMs"));
-  EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.TargetDelayInMs"));
-  EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.CurrentDelayInMs"));
-  EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.OnewayDelayInMs"));
-
-  EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.DecodeTimeInMs", kDecodeMs));
-  EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.JitterBufferDelayInMs",
-                                  kJitterBufferMs));
-  EXPECT_EQ(1,
-            metrics::NumEvents("WebRTC.Video.TargetDelayInMs", kTargetDelayMs));
-  EXPECT_EQ(
-      1, metrics::NumEvents("WebRTC.Video.CurrentDelayInMs", kCurrentDelayMs));
-  EXPECT_EQ(1,
-            metrics::NumEvents("WebRTC.Video.OnewayDelayInMs", kTargetDelayMs));
-}
-
-TEST_F(ReceiveStatisticsProxyTest, DoesNotReportStaleFramerates) {
-  const int kDefaultFps = 30;
-  const int kWidth = 320;
-  const int kHeight = 240;
-
-  rtc::scoped_refptr<VideoFrameBuffer> video_frame_buffer(
-      I420Buffer::Create(kWidth, kHeight));
-  VideoFrame frame(video_frame_buffer, kVideoRotation_0, 0);
-
-  for (int i = 0; i < kDefaultFps; ++i) {
-    // Since OnRenderedFrame is never called the fps in each sample will be 0,
-    // i.e. bad
-    frame.set_ntp_time_ms(fake_clock_.CurrentNtpInMilliseconds());
-    statistics_proxy_->OnDecodedFrame(rtc::Optional<uint8_t>(),
-                                      VideoContentType::UNSPECIFIED);
-    statistics_proxy_->OnRenderedFrame(frame);
-    fake_clock_.AdvanceTimeMilliseconds(1000 / kDefaultFps);
-  }
-
-  EXPECT_EQ(kDefaultFps, statistics_proxy_->GetStats().decode_frame_rate);
-  EXPECT_EQ(kDefaultFps, statistics_proxy_->GetStats().render_frame_rate);
-
-  // FPS trackers in stats proxy have a 1000ms sliding window.
-  fake_clock_.AdvanceTimeMilliseconds(1000);
-  EXPECT_EQ(0, statistics_proxy_->GetStats().decode_frame_rate);
-  EXPECT_EQ(0, statistics_proxy_->GetStats().render_frame_rate);
-}
-
-TEST_F(ReceiveStatisticsProxyTest, GetStatsReportsReceivedFrameStats) {
-  const int kWidth = 160;
-  const int kHeight = 120;
-  EXPECT_EQ(0, statistics_proxy_->GetStats().width);
-  EXPECT_EQ(0, statistics_proxy_->GetStats().height);
-  EXPECT_EQ(0u, statistics_proxy_->GetStats().frames_rendered);
-
-  statistics_proxy_->OnRenderedFrame(CreateFrame(kWidth, kHeight));
-
-  EXPECT_EQ(kWidth, statistics_proxy_->GetStats().width);
-  EXPECT_EQ(kHeight, statistics_proxy_->GetStats().height);
-  EXPECT_EQ(1u, statistics_proxy_->GetStats().frames_rendered);
-}
-
-TEST_F(ReceiveStatisticsProxyTest,
-       ReceivedFrameHistogramsAreNotUpdatedForTooFewSamples) {
-  const int kWidth = 160;
-  const int kHeight = 120;
-
-  for (int i = 0; i < kMinRequiredSamples - 1; ++i)
-    statistics_proxy_->OnRenderedFrame(CreateFrame(kWidth, kHeight));
-
-  statistics_proxy_.reset();
-  EXPECT_EQ(0, metrics::NumSamples("WebRTC.Video.ReceivedWidthInPixels"));
-  EXPECT_EQ(0, metrics::NumSamples("WebRTC.Video.ReceivedHeightInPixels"));
-  EXPECT_EQ(0, metrics::NumSamples("WebRTC.Video.RenderFramesPerSecond"));
-  EXPECT_EQ(0, metrics::NumSamples("WebRTC.Video.RenderSqrtPixelsPerSecond"));
-}
-
-TEST_F(ReceiveStatisticsProxyTest, ReceivedFrameHistogramsAreUpdated) {
-  const int kWidth = 160;
-  const int kHeight = 120;
-
-  for (int i = 0; i < kMinRequiredSamples; ++i)
-    statistics_proxy_->OnRenderedFrame(CreateFrame(kWidth, kHeight));
-
-  statistics_proxy_.reset();
-  EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.ReceivedWidthInPixels"));
-  EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.ReceivedHeightInPixels"));
-  EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.RenderFramesPerSecond"));
-  EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.RenderSqrtPixelsPerSecond"));
-  EXPECT_EQ(1,
-            metrics::NumEvents("WebRTC.Video.ReceivedWidthInPixels", kWidth));
-  EXPECT_EQ(1,
-            metrics::NumEvents("WebRTC.Video.ReceivedHeightInPixels", kHeight));
-}
-
-TEST_F(ReceiveStatisticsProxyTest,
-       RtcpHistogramsNotUpdatedIfMinRuntimeHasNotPassed) {
-  InsertFirstRtpPacket(kRemoteSsrc);
-  fake_clock_.AdvanceTimeMilliseconds((metrics::kMinRunTimeInSeconds * 1000) -
-                                      1);
-
-  RtcpPacketTypeCounter counter;
-  statistics_proxy_->RtcpPacketTypesCounterUpdated(kRemoteSsrc, counter);
-
-  statistics_proxy_.reset();
-  EXPECT_EQ(0, metrics::NumSamples("WebRTC.Video.FirPacketsSentPerMinute"));
-  EXPECT_EQ(0, metrics::NumSamples("WebRTC.Video.PliPacketsSentPerMinute"));
-  EXPECT_EQ(0, metrics::NumSamples("WebRTC.Video.NackPacketsSentPerMinute"));
-}
-
-TEST_F(ReceiveStatisticsProxyTest, RtcpHistogramsAreUpdated) {
-  InsertFirstRtpPacket(kRemoteSsrc);
-  fake_clock_.AdvanceTimeMilliseconds(metrics::kMinRunTimeInSeconds * 1000);
-
-  const uint32_t kFirPackets = 100;
-  const uint32_t kPliPackets = 200;
-  const uint32_t kNackPackets = 300;
-
-  RtcpPacketTypeCounter counter;
-  counter.fir_packets = kFirPackets;
-  counter.pli_packets = kPliPackets;
-  counter.nack_packets = kNackPackets;
-  statistics_proxy_->RtcpPacketTypesCounterUpdated(kRemoteSsrc, counter);
-
-  statistics_proxy_.reset();
-  EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.FirPacketsSentPerMinute"));
-  EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.PliPacketsSentPerMinute"));
-  EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.NackPacketsSentPerMinute"));
-  EXPECT_EQ(
-      1, metrics::NumEvents("WebRTC.Video.FirPacketsSentPerMinute",
-                            kFirPackets * 60 / metrics::kMinRunTimeInSeconds));
-  EXPECT_EQ(
-      1, metrics::NumEvents("WebRTC.Video.PliPacketsSentPerMinute",
-                            kPliPackets * 60 / metrics::kMinRunTimeInSeconds));
-  EXPECT_EQ(
-      1, metrics::NumEvents("WebRTC.Video.NackPacketsSentPerMinute",
-                            kNackPackets * 60 / metrics::kMinRunTimeInSeconds));
-}
-
-INSTANTIATE_TEST_CASE_P(ContentTypes,
-                        ReceiveStatisticsProxyTest,
-                        ::testing::Values(VideoContentType::UNSPECIFIED,
-                                          VideoContentType::SCREENSHARE));
-
-TEST_P(ReceiveStatisticsProxyTest, InterFrameDelaysAreReported) {
-  const VideoContentType content_type = GetParam();
-  const int kInterFrameDelayMs = 33;
-  for (int i = 0; i < kMinRequiredSamples; ++i) {
-    statistics_proxy_->OnDecodedFrame(rtc::Optional<uint8_t>(), content_type);
-    fake_clock_.AdvanceTimeMilliseconds(kInterFrameDelayMs);
-  }
-  // One extra with with double the interval.
-  fake_clock_.AdvanceTimeMilliseconds(kInterFrameDelayMs);
-  statistics_proxy_->OnDecodedFrame(rtc::Optional<uint8_t>(), content_type);
-
-  statistics_proxy_.reset();
-  const int kExpectedInterFrame =
-      (kInterFrameDelayMs * (kMinRequiredSamples - 1) +
-       kInterFrameDelayMs * 2) /
-      kMinRequiredSamples;
-  if (videocontenttypehelpers::IsScreenshare(content_type)) {
-    EXPECT_EQ(
-        kExpectedInterFrame,
-        metrics::MinSample("WebRTC.Video.Screenshare.InterframeDelayInMs"));
-    EXPECT_EQ(
-        kInterFrameDelayMs * 2,
-        metrics::MinSample("WebRTC.Video.Screenshare.InterframeDelayMaxInMs"));
-  } else {
-    EXPECT_EQ(kExpectedInterFrame,
-              metrics::MinSample("WebRTC.Video.InterframeDelayInMs"));
-    EXPECT_EQ(kInterFrameDelayMs * 2,
-              metrics::MinSample("WebRTC.Video.InterframeDelayMaxInMs"));
-  }
-}
-
-TEST_P(ReceiveStatisticsProxyTest, MaxInterFrameDelayOnlyWithValidAverage) {
-  const VideoContentType content_type = GetParam();
-  const int kInterFrameDelayMs = 33;
-  for (int i = 0; i < kMinRequiredSamples; ++i) {
-    statistics_proxy_->OnDecodedFrame(rtc::Optional<uint8_t>(), content_type);
-    fake_clock_.AdvanceTimeMilliseconds(kInterFrameDelayMs);
-  }
-
-  // |kMinRequiredSamples| samples, and thereby intervals, is required. That
-  // means we're one frame short of having a valid data set.
-  statistics_proxy_.reset();
-  EXPECT_EQ(0, metrics::NumSamples("WebRTC.Video.InterframeDelayInMs"));
-  EXPECT_EQ(0, metrics::NumSamples("WebRTC.Video.InterframeDelayMaxInMs"));
-  EXPECT_EQ(
-      0, metrics::NumSamples("WebRTC.Video.Screenshare.InterframeDelayInMs"));
-  EXPECT_EQ(0, metrics::NumSamples(
-                   "WebRTC.Video.Screenshare.InterframeDelayMaxInMs"));
-}
-
-TEST_P(ReceiveStatisticsProxyTest, MaxInterFrameDelayOnlyWithPause) {
-  const VideoContentType content_type = GetParam();
-  const int kInterFrameDelayMs = 33;
-  for (int i = 0; i <= kMinRequiredSamples; ++i) {
-    statistics_proxy_->OnDecodedFrame(rtc::Optional<uint8_t>(), content_type);
-    fake_clock_.AdvanceTimeMilliseconds(kInterFrameDelayMs);
-  }
-
-  // At this state, we should have a valid inter-frame delay.
-  // Indicate stream paused and make a large jump in time.
-  statistics_proxy_->OnStreamInactive();
-  fake_clock_.AdvanceTimeMilliseconds(5000);
-
-  // Insert two more frames. The interval during the pause should be disregarded
-  // in the stats.
-  statistics_proxy_->OnDecodedFrame(rtc::Optional<uint8_t>(), content_type);
-  fake_clock_.AdvanceTimeMilliseconds(kInterFrameDelayMs);
-  statistics_proxy_->OnDecodedFrame(rtc::Optional<uint8_t>(), content_type);
-
-  statistics_proxy_.reset();
-  if (videocontenttypehelpers::IsScreenshare(content_type)) {
-    EXPECT_EQ(
-        1, metrics::NumSamples("WebRTC.Video.Screenshare.InterframeDelayInMs"));
-    EXPECT_EQ(1, metrics::NumSamples(
-                     "WebRTC.Video.Screenshare.InterframeDelayMaxInMs"));
-    EXPECT_EQ(
-        kInterFrameDelayMs,
-        metrics::MinSample("WebRTC.Video.Screenshare.InterframeDelayInMs"));
-    EXPECT_EQ(
-        kInterFrameDelayMs,
-        metrics::MinSample("WebRTC.Video.Screenshare.InterframeDelayMaxInMs"));
-  } else {
-    EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.InterframeDelayInMs"));
-    EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.InterframeDelayMaxInMs"));
-    EXPECT_EQ(kInterFrameDelayMs,
-              metrics::MinSample("WebRTC.Video.InterframeDelayInMs"));
-    EXPECT_EQ(kInterFrameDelayMs,
-              metrics::MinSample("WebRTC.Video.InterframeDelayMaxInMs"));
-  }
-}
-
-TEST_P(ReceiveStatisticsProxyTest, StatsAreSlicedOnSimulcastAndExperiment) {
-  VideoContentType content_type = GetParam();
-  const uint8_t experiment_id = 1;
-  videocontenttypehelpers::SetExperimentId(&content_type, experiment_id);
-  const int kInterFrameDelayMs1 = 30;
-  const int kInterFrameDelayMs2 = 50;
-
-  videocontenttypehelpers::SetSimulcastId(&content_type, 1);
-  for (int i = 0; i <= kMinRequiredSamples; ++i) {
-    fake_clock_.AdvanceTimeMilliseconds(kInterFrameDelayMs1);
-    statistics_proxy_->OnDecodedFrame(rtc::Optional<uint8_t>(), content_type);
-  }
-
-  videocontenttypehelpers::SetSimulcastId(&content_type, 2);
-  for (int i = 0; i <= kMinRequiredSamples; ++i) {
-    fake_clock_.AdvanceTimeMilliseconds(kInterFrameDelayMs2);
-    statistics_proxy_->OnDecodedFrame(rtc::Optional<uint8_t>(), content_type);
-  }
-  statistics_proxy_.reset();
-
-  if (videocontenttypehelpers::IsScreenshare(content_type)) {
-    EXPECT_EQ(
-        1, metrics::NumSamples("WebRTC.Video.Screenshare.InterframeDelayInMs"));
-    EXPECT_EQ(1, metrics::NumSamples(
-                     "WebRTC.Video.Screenshare.InterframeDelayMaxInMs"));
-    EXPECT_EQ(1, metrics::NumSamples(
-                     "WebRTC.Video.Screenshare.InterframeDelayInMs.S0"));
-    EXPECT_EQ(1, metrics::NumSamples(
-                     "WebRTC.Video.Screenshare.InterframeDelayMaxInMs.S0"));
-    EXPECT_EQ(1, metrics::NumSamples(
-                     "WebRTC.Video.Screenshare.InterframeDelayInMs.S1"));
-    EXPECT_EQ(1, metrics::NumSamples(
-                     "WebRTC.Video.Screenshare.InterframeDelayMaxInMs.S1"));
-    EXPECT_EQ(1,
-              metrics::NumSamples("WebRTC.Video.Screenshare.InterframeDelayInMs"
-                                  ".ExperimentGroup0"));
-    EXPECT_EQ(
-        1, metrics::NumSamples("WebRTC.Video.Screenshare.InterframeDelayMaxInMs"
-                               ".ExperimentGroup0"));
-    EXPECT_EQ(
-        kInterFrameDelayMs1,
-        metrics::MinSample("WebRTC.Video.Screenshare.InterframeDelayInMs.S0"));
-    EXPECT_EQ(
-        kInterFrameDelayMs2,
-        metrics::MinSample("WebRTC.Video.Screenshare.InterframeDelayInMs.S1"));
-    EXPECT_EQ(
-        (kInterFrameDelayMs1 + kInterFrameDelayMs2) / 2,
-        metrics::MinSample("WebRTC.Video.Screenshare.InterframeDelayInMs"));
-    EXPECT_EQ(
-        kInterFrameDelayMs2,
-        metrics::MinSample("WebRTC.Video.Screenshare.InterframeDelayMaxInMs"));
-    EXPECT_EQ(
-        (kInterFrameDelayMs1 + kInterFrameDelayMs2) / 2,
-        metrics::MinSample(
-            "WebRTC.Video.Screenshare.InterframeDelayInMs.ExperimentGroup0"));
-  } else {
-    EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.InterframeDelayInMs"));
-    EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.InterframeDelayMaxInMs"));
-    EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.InterframeDelayInMs.S0"));
-    EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.InterframeDelayMaxInMs.S0"));
-    EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.InterframeDelayInMs.S1"));
-    EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.InterframeDelayMaxInMs.S1"));
-    EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.InterframeDelayInMs"
-                                     ".ExperimentGroup0"));
-    EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.InterframeDelayMaxInMs"
-                                     ".ExperimentGroup0"));
-    EXPECT_EQ(kInterFrameDelayMs1,
-              metrics::MinSample("WebRTC.Video.InterframeDelayInMs.S0"));
-    EXPECT_EQ(kInterFrameDelayMs2,
-              metrics::MinSample("WebRTC.Video.InterframeDelayInMs.S1"));
-    EXPECT_EQ((kInterFrameDelayMs1 + kInterFrameDelayMs2) / 2,
-              metrics::MinSample("WebRTC.Video.InterframeDelayInMs"));
-    EXPECT_EQ(kInterFrameDelayMs2,
-              metrics::MinSample("WebRTC.Video.InterframeDelayMaxInMs"));
-    EXPECT_EQ((kInterFrameDelayMs1 + kInterFrameDelayMs2) / 2,
-              metrics::MinSample(
-                  "WebRTC.Video.InterframeDelayInMs.ExperimentGroup0"));
-  }
-}
-
-}  // namespace webrtc
diff --git a/video/replay.cc b/video/replay.cc
deleted file mode 100644
index c93017a..0000000
--- a/video/replay.cc
+++ /dev/null
@@ -1,349 +0,0 @@
-/*
- *  Copyright (c) 2014 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 <stdio.h>
-
-#include <map>
-#include <memory>
-#include <sstream>
-
-#include "webrtc/api/video_codecs/video_decoder.h"
-#include "webrtc/call/call.h"
-#include "webrtc/common_video/libyuv/include/webrtc_libyuv.h"
-#include "webrtc/logging/rtc_event_log/rtc_event_log.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_header_parser.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/flags.h"
-#include "webrtc/rtc_base/string_to_number.h"
-#include "webrtc/system_wrappers/include/clock.h"
-#include "webrtc/system_wrappers/include/sleep.h"
-#include "webrtc/test/call_test.h"
-#include "webrtc/test/encoder_settings.h"
-#include "webrtc/test/fake_decoder.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/null_transport.h"
-#include "webrtc/test/rtp_file_reader.h"
-#include "webrtc/test/run_loop.h"
-#include "webrtc/test/run_test.h"
-#include "webrtc/test/testsupport/frame_writer.h"
-#include "webrtc/test/video_capturer.h"
-#include "webrtc/test/video_renderer.h"
-#include "webrtc/typedefs.h"
-
-namespace {
-
-static bool ValidatePayloadType(int32_t payload_type) {
-  return payload_type > 0 && payload_type <= 127;
-}
-
-static bool ValidateSsrc(const char* ssrc_string) {
-  return rtc::StringToNumber<uint32_t>(ssrc_string).has_value();
-}
-
-static bool ValidateOptionalPayloadType(int32_t payload_type) {
-  return payload_type == -1 || ValidatePayloadType(payload_type);
-}
-
-static bool ValidateRtpHeaderExtensionId(int32_t extension_id) {
-  return extension_id >= -1 && extension_id < 15;
-}
-
-bool ValidateInputFilenameNotEmpty(const std::string& string) {
-  return !string.empty();
-}
-
-}  // namespace
-
-namespace webrtc {
-namespace flags {
-
-// TODO(pbos): Multiple receivers.
-
-// Flag for payload type.
-DEFINE_int(payload_type, test::CallTest::kPayloadTypeVP8, "Payload type");
-static int PayloadType() { return static_cast<int>(FLAG_payload_type); }
-
-DEFINE_int(payload_type_rtx,
-           test::CallTest::kSendRtxPayloadType,
-           "RTX payload type");
-static int PayloadTypeRtx() {
-  return static_cast<int>(FLAG_payload_type_rtx);
-}
-
-// Flag for SSRC.
-const std::string& DefaultSsrc() {
-  static const std::string ssrc = std::to_string(
-      test::CallTest::kVideoSendSsrcs[0]);
-  return ssrc;
-}
-DEFINE_string(ssrc, DefaultSsrc().c_str(), "Incoming SSRC");
-static uint32_t Ssrc() {
-  return rtc::StringToNumber<uint32_t>(FLAG_ssrc).value();
-}
-
-const std::string& DefaultSsrcRtx() {
-  static const std::string ssrc_rtx = std::to_string(
-      test::CallTest::kSendRtxSsrcs[0]);
-  return ssrc_rtx;
-}
-DEFINE_string(ssrc_rtx, DefaultSsrcRtx().c_str(), "Incoming RTX SSRC");
-static uint32_t SsrcRtx() {
-  return rtc::StringToNumber<uint32_t>(FLAG_ssrc_rtx).value();
-}
-
-// Flag for RED payload type.
-DEFINE_int(red_payload_type, -1, "RED payload type");
-static int RedPayloadType() {
-  return static_cast<int>(FLAG_red_payload_type);
-}
-
-// Flag for ULPFEC payload type.
-DEFINE_int(fec_payload_type, -1, "ULPFEC payload type");
-static int FecPayloadType() {
-  return static_cast<int>(FLAG_fec_payload_type);
-}
-
-// Flag for abs-send-time id.
-DEFINE_int(abs_send_time_id, -1, "RTP extension ID for abs-send-time");
-static int AbsSendTimeId() { return static_cast<int>(FLAG_abs_send_time_id); }
-
-// Flag for transmission-offset id.
-DEFINE_int(transmission_offset_id,
-           -1,
-           "RTP extension ID for transmission-offset");
-static int TransmissionOffsetId() {
-  return static_cast<int>(FLAG_transmission_offset_id);
-}
-
-// Flag for rtpdump input file.
-DEFINE_string(input_file, "", "input file");
-static std::string InputFile() {
-  return static_cast<std::string>(FLAG_input_file);
-}
-
-// Flag for raw output files.
-DEFINE_string(out_base, "", "Basename (excluding .jpg) for raw output");
-static std::string OutBase() {
-  return static_cast<std::string>(FLAG_out_base);
-}
-
-DEFINE_string(decoder_bitstream_filename, "", "Decoder bitstream output file");
-static std::string DecoderBitstreamFilename() {
-  return static_cast<std::string>(FLAG_decoder_bitstream_filename);
-}
-
-// Flag for video codec.
-DEFINE_string(codec, "VP8", "Video codec");
-static std::string Codec() { return static_cast<std::string>(FLAG_codec); }
-
-DEFINE_bool(help, false, "Print this message.");
-}  // namespace flags
-
-static const uint32_t kReceiverLocalSsrc = 0x123456;
-
-class FileRenderPassthrough : public rtc::VideoSinkInterface<VideoFrame> {
- public:
-  FileRenderPassthrough(const std::string& basename,
-                        rtc::VideoSinkInterface<VideoFrame>* renderer)
-      : basename_(basename), renderer_(renderer), file_(nullptr), count_(0) {}
-
-  ~FileRenderPassthrough() {
-    if (file_)
-      fclose(file_);
-  }
-
- private:
-  void OnFrame(const VideoFrame& video_frame) override {
-    if (renderer_)
-      renderer_->OnFrame(video_frame);
-
-    if (basename_.empty())
-      return;
-
-    std::stringstream filename;
-    filename << basename_ << count_++ << "_" << video_frame.timestamp()
-             << ".jpg";
-
-    test::JpegFrameWriter frame_writer(filename.str());
-    RTC_CHECK(frame_writer.WriteFrame(video_frame, 100));
-  }
-
-  const std::string basename_;
-  rtc::VideoSinkInterface<VideoFrame>* const renderer_;
-  FILE* file_;
-  size_t count_;
-};
-
-class DecoderBitstreamFileWriter : public EncodedFrameObserver {
- public:
-  explicit DecoderBitstreamFileWriter(const char* filename)
-      : file_(fopen(filename, "wb")) {
-    RTC_DCHECK(file_);
-  }
-  ~DecoderBitstreamFileWriter() { fclose(file_); }
-
-  virtual void EncodedFrameCallback(const EncodedFrame& encoded_frame) {
-    fwrite(encoded_frame.data_, 1, encoded_frame.length_, file_);
-  }
-
- private:
-  FILE* file_;
-};
-
-void RtpReplay() {
-  std::stringstream window_title;
-  window_title << "Playback Video (" << flags::InputFile() << ")";
-  std::unique_ptr<test::VideoRenderer> playback_video(
-      test::VideoRenderer::Create(window_title.str().c_str(), 640, 480));
-  FileRenderPassthrough file_passthrough(flags::OutBase(),
-                                         playback_video.get());
-
-  webrtc::RtcEventLogNullImpl event_log;
-  std::unique_ptr<Call> call(Call::Create(Call::Config(&event_log)));
-
-  test::NullTransport transport;
-  VideoReceiveStream::Config receive_config(&transport);
-  receive_config.rtp.remote_ssrc = flags::Ssrc();
-  receive_config.rtp.local_ssrc = kReceiverLocalSsrc;
-  receive_config.rtp.rtx_ssrc = flags::SsrcRtx();
-  receive_config.rtp.rtx_associated_payload_types[flags::PayloadTypeRtx()] =
-      flags::PayloadType();
-  receive_config.rtp.ulpfec.ulpfec_payload_type = flags::FecPayloadType();
-  receive_config.rtp.ulpfec.red_payload_type = flags::RedPayloadType();
-  receive_config.rtp.nack.rtp_history_ms = 1000;
-  if (flags::TransmissionOffsetId() != -1) {
-    receive_config.rtp.extensions.push_back(RtpExtension(
-        RtpExtension::kTimestampOffsetUri, flags::TransmissionOffsetId()));
-  }
-  if (flags::AbsSendTimeId() != -1) {
-    receive_config.rtp.extensions.push_back(
-        RtpExtension(RtpExtension::kAbsSendTimeUri, flags::AbsSendTimeId()));
-  }
-  receive_config.renderer = &file_passthrough;
-
-  VideoSendStream::Config::EncoderSettings encoder_settings;
-  encoder_settings.payload_name = flags::Codec();
-  encoder_settings.payload_type = flags::PayloadType();
-  VideoReceiveStream::Decoder decoder;
-  std::unique_ptr<DecoderBitstreamFileWriter> bitstream_writer;
-  if (!flags::DecoderBitstreamFilename().empty()) {
-    bitstream_writer.reset(new DecoderBitstreamFileWriter(
-        flags::DecoderBitstreamFilename().c_str()));
-    receive_config.pre_decode_callback = bitstream_writer.get();
-  }
-  decoder = test::CreateMatchingDecoder(encoder_settings);
-  if (!flags::DecoderBitstreamFilename().empty()) {
-    // Replace with a null decoder if we're writing the bitstream to a file
-    // instead.
-    delete decoder.decoder;
-    decoder.decoder = new test::FakeNullDecoder();
-  }
-  receive_config.decoders.push_back(decoder);
-
-  VideoReceiveStream* receive_stream =
-      call->CreateVideoReceiveStream(std::move(receive_config));
-
-  std::unique_ptr<test::RtpFileReader> rtp_reader(test::RtpFileReader::Create(
-      test::RtpFileReader::kRtpDump, flags::InputFile()));
-  if (!rtp_reader) {
-    rtp_reader.reset(test::RtpFileReader::Create(test::RtpFileReader::kPcap,
-                                                 flags::InputFile()));
-    if (!rtp_reader) {
-      fprintf(stderr,
-              "Couldn't open input file as either a rtpdump or .pcap. Note "
-              "that .pcapng is not supported.\nTrying to interpret the file as "
-              "length/packet interleaved.\n");
-      rtp_reader.reset(test::RtpFileReader::Create(
-          test::RtpFileReader::kLengthPacketInterleaved, flags::InputFile()));
-      if (!rtp_reader) {
-        fprintf(stderr,
-                "Unable to open input file with any supported format\n");
-        return;
-      }
-    }
-  }
-  receive_stream->Start();
-
-  uint32_t last_time_ms = 0;
-  int num_packets = 0;
-  std::map<uint32_t, int> unknown_packets;
-  while (true) {
-    test::RtpPacket packet;
-    if (!rtp_reader->NextPacket(&packet))
-      break;
-    ++num_packets;
-    switch (call->Receiver()->DeliverPacket(
-        webrtc::MediaType::VIDEO, packet.data, packet.length, PacketTime())) {
-      case PacketReceiver::DELIVERY_OK:
-        break;
-      case PacketReceiver::DELIVERY_UNKNOWN_SSRC: {
-        RTPHeader header;
-        std::unique_ptr<RtpHeaderParser> parser(RtpHeaderParser::Create());
-        parser->Parse(packet.data, packet.length, &header);
-        if (unknown_packets[header.ssrc] == 0)
-          fprintf(stderr, "Unknown SSRC: %u!\n", header.ssrc);
-        ++unknown_packets[header.ssrc];
-        break;
-      }
-      case PacketReceiver::DELIVERY_PACKET_ERROR: {
-        fprintf(stderr, "Packet error, corrupt packets or incorrect setup?\n");
-        RTPHeader header;
-        std::unique_ptr<RtpHeaderParser> parser(RtpHeaderParser::Create());
-        parser->Parse(packet.data, packet.length, &header);
-        fprintf(stderr, "Packet len=%zu pt=%u seq=%u ts=%u ssrc=0x%8x\n",
-                packet.length, header.payloadType, header.sequenceNumber,
-                header.timestamp, header.ssrc);
-        break;
-      }
-    }
-    if (last_time_ms != 0 && last_time_ms != packet.time_ms) {
-      SleepMs(packet.time_ms - last_time_ms);
-    }
-    last_time_ms = packet.time_ms;
-  }
-  fprintf(stderr, "num_packets: %d\n", num_packets);
-
-  for (std::map<uint32_t, int>::const_iterator it = unknown_packets.begin();
-       it != unknown_packets.end();
-       ++it) {
-    fprintf(
-        stderr, "Packets for unknown ssrc '%u': %d\n", it->first, it->second);
-  }
-
-  call->DestroyVideoReceiveStream(receive_stream);
-
-  delete decoder.decoder;
-}
-}  // namespace webrtc
-
-int main(int argc, char* argv[]) {
-  ::testing::InitGoogleTest(&argc, argv);
-  if (rtc::FlagList::SetFlagsFromCommandLine(&argc, argv, true)) {
-    return 1;
-  }
-  if (webrtc::flags::FLAG_help) {
-    rtc::FlagList::Print(nullptr, false);
-    return 0;
-  }
-
-  RTC_CHECK(ValidatePayloadType(webrtc::flags::FLAG_payload_type));
-  RTC_CHECK(ValidatePayloadType(webrtc::flags::FLAG_payload_type_rtx));
-  RTC_CHECK(ValidateSsrc(webrtc::flags::FLAG_ssrc));
-  RTC_CHECK(ValidateSsrc(webrtc::flags::FLAG_ssrc_rtx));
-  RTC_CHECK(ValidateOptionalPayloadType(webrtc::flags::FLAG_red_payload_type));
-  RTC_CHECK(ValidateOptionalPayloadType(webrtc::flags::FLAG_fec_payload_type));
-  RTC_CHECK(ValidateRtpHeaderExtensionId(webrtc::flags::FLAG_abs_send_time_id));
-  RTC_CHECK(ValidateRtpHeaderExtensionId(
-      webrtc::flags::FLAG_transmission_offset_id));
-  RTC_CHECK(ValidateInputFilenameNotEmpty(webrtc::flags::FLAG_input_file));
-
-  webrtc::test::RunTest(webrtc::RtpReplay);
-  return 0;
-}
diff --git a/video/report_block_stats.cc b/video/report_block_stats.cc
deleted file mode 100644
index ac5041d..0000000
--- a/video/report_block_stats.cc
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- *  Copyright (c) 2014 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/video/report_block_stats.h"
-
-namespace webrtc {
-
-namespace {
-int FractionLost(uint32_t num_lost_sequence_numbers,
-                 uint32_t num_sequence_numbers) {
-  if (num_sequence_numbers == 0) {
-    return 0;
-  }
-  return ((num_lost_sequence_numbers * 255) + (num_sequence_numbers / 2)) /
-      num_sequence_numbers;
-}
-}  // namespace
-
-
-// Helper class for rtcp statistics.
-ReportBlockStats::ReportBlockStats()
-    : num_sequence_numbers_(0),
-      num_lost_sequence_numbers_(0) {
-}
-
-void ReportBlockStats::Store(const RtcpStatistics& rtcp_stats,
-                             uint32_t remote_ssrc,
-                             uint32_t source_ssrc) {
-  RTCPReportBlock block;
-  block.packets_lost = rtcp_stats.packets_lost;
-  block.fraction_lost = rtcp_stats.fraction_lost;
-  block.extended_highest_sequence_number =
-      rtcp_stats.extended_highest_sequence_number;
-  block.jitter = rtcp_stats.jitter;
-  block.sender_ssrc = remote_ssrc;
-  block.source_ssrc = source_ssrc;
-  uint32_t num_sequence_numbers = 0;
-  uint32_t num_lost_sequence_numbers = 0;
-  StoreAndAddPacketIncrement(
-      block, &num_sequence_numbers, &num_lost_sequence_numbers);
-}
-
-RTCPReportBlock ReportBlockStats::AggregateAndStore(
-    const ReportBlockVector& report_blocks) {
-  RTCPReportBlock aggregate;
-  if (report_blocks.empty()) {
-    return aggregate;
-  }
-  uint32_t num_sequence_numbers = 0;
-  uint32_t num_lost_sequence_numbers = 0;
-  ReportBlockVector::const_iterator report_block = report_blocks.begin();
-  for (; report_block != report_blocks.end(); ++report_block) {
-    aggregate.packets_lost += report_block->packets_lost;
-    aggregate.jitter += report_block->jitter;
-    StoreAndAddPacketIncrement(*report_block,
-                               &num_sequence_numbers,
-                               &num_lost_sequence_numbers);
-  }
-
-  if (report_blocks.size() == 1) {
-    // No aggregation needed.
-    return report_blocks[0];
-  }
-  // Fraction lost since previous report block.
-  aggregate.fraction_lost =
-      FractionLost(num_lost_sequence_numbers, num_sequence_numbers);
-  aggregate.jitter = static_cast<uint32_t>(
-      (aggregate.jitter + report_blocks.size() / 2) / report_blocks.size());
-  return aggregate;
-}
-
-void ReportBlockStats::StoreAndAddPacketIncrement(
-    const RTCPReportBlock& report_block,
-    uint32_t* num_sequence_numbers,
-    uint32_t* num_lost_sequence_numbers) {
-  // Get diff with previous report block.
-  ReportBlockMap::iterator prev_report_block =
-      prev_report_blocks_.find(report_block.source_ssrc);
-  if (prev_report_block != prev_report_blocks_.end()) {
-    int seq_num_diff =
-        report_block.extended_highest_sequence_number -
-        prev_report_block->second.extended_highest_sequence_number;
-    int cum_loss_diff =
-        report_block.packets_lost - prev_report_block->second.packets_lost;
-    if (seq_num_diff >= 0 && cum_loss_diff >= 0) {
-      *num_sequence_numbers += seq_num_diff;
-      *num_lost_sequence_numbers += cum_loss_diff;
-      // Update total number of packets/lost packets.
-      num_sequence_numbers_ += seq_num_diff;
-      num_lost_sequence_numbers_ += cum_loss_diff;
-    }
-  }
-  // Store current report block.
-  prev_report_blocks_[report_block.source_ssrc] = report_block;
-}
-
-int ReportBlockStats::FractionLostInPercent() const {
-  if (num_sequence_numbers_ == 0) {
-    return -1;
-  }
-  return FractionLost(
-      num_lost_sequence_numbers_, num_sequence_numbers_) * 100 / 255;
-}
-
-}  // namespace webrtc
-
diff --git a/video/report_block_stats.h b/video/report_block_stats.h
deleted file mode 100644
index c54e467..0000000
--- a/video/report_block_stats.h
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- *  Copyright (c) 2014 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_VIDEO_REPORT_BLOCK_STATS_H_
-#define WEBRTC_VIDEO_REPORT_BLOCK_STATS_H_
-
-#include <map>
-#include <vector>
-
-#include "webrtc/common_types.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
-
-namespace webrtc {
-
-// Helper class for rtcp statistics.
-class ReportBlockStats {
- public:
-  typedef std::map<uint32_t, RTCPReportBlock> ReportBlockMap;
-  typedef std::vector<RTCPReportBlock> ReportBlockVector;
-  ReportBlockStats();
-  ~ReportBlockStats() {}
-
-  // Updates stats and stores report blocks.
-  // Returns an aggregate of the |report_blocks|.
-  RTCPReportBlock AggregateAndStore(const ReportBlockVector& report_blocks);
-
-  // Updates stats and stores report block.
-  void Store(const RtcpStatistics& rtcp_stats,
-             uint32_t remote_ssrc,
-             uint32_t source_ssrc);
-
-  // Returns the total fraction of lost packets (or -1 if less than two report
-  // blocks have been stored).
-  int FractionLostInPercent() const;
-
- private:
-  // Updates the total number of packets/lost packets.
-  // Stores the report block.
-  // Returns the number of packets/lost packets since previous report block.
-  void StoreAndAddPacketIncrement(const RTCPReportBlock& report_block,
-                                  uint32_t* num_sequence_numbers,
-                                  uint32_t* num_lost_sequence_numbers);
-
-  // The total number of packets/lost packets.
-  uint32_t num_sequence_numbers_;
-  uint32_t num_lost_sequence_numbers_;
-
-  // Map holding the last stored report block (mapped by the source SSRC).
-  ReportBlockMap prev_report_blocks_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_VIDEO_REPORT_BLOCK_STATS_H_
-
diff --git a/video/report_block_stats_unittest.cc b/video/report_block_stats_unittest.cc
deleted file mode 100644
index 3ce49ee..0000000
--- a/video/report_block_stats_unittest.cc
+++ /dev/null
@@ -1,146 +0,0 @@
-/*
- *  Copyright (c) 2014 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/test/gtest.h"
-#include "webrtc/video/report_block_stats.h"
-
-namespace webrtc {
-
-class ReportBlockStatsTest : public ::testing::Test {
- protected:
-  ReportBlockStatsTest() : kSsrc1(0x12345), kSsrc2(0x23456) {}
-
-  void SetUp() override {
-    // kSsrc1: block 1-3.
-    block1_1_.packets_lost = 10;
-    block1_1_.fraction_lost = 123;
-    block1_1_.extended_highest_sequence_number = 24000;
-    block1_1_.jitter = 777;
-    block1_1_.source_ssrc = kSsrc1;
-    block1_2_.packets_lost = 15;
-    block1_2_.fraction_lost = 0;
-    block1_2_.extended_highest_sequence_number = 24100;
-    block1_2_.jitter = 222;
-    block1_2_.source_ssrc = kSsrc1;
-    block1_3_.packets_lost = 50;
-    block1_3_.fraction_lost = 0;
-    block1_3_.extended_highest_sequence_number = 24200;
-    block1_3_.jitter = 333;
-    block1_3_.source_ssrc = kSsrc1;
-    // kSsrc2: block 1,2.
-    block2_1_.packets_lost = 111;
-    block2_1_.fraction_lost = 222;
-    block2_1_.extended_highest_sequence_number = 8500;
-    block2_1_.jitter = 555;
-    block2_1_.source_ssrc = kSsrc2;
-    block2_2_.packets_lost = 136;
-    block2_2_.fraction_lost = 0;
-    block2_2_.extended_highest_sequence_number = 8800;
-    block2_2_.jitter = 888;
-    block2_2_.source_ssrc = kSsrc2;
-
-    ssrc1block1_.push_back(block1_1_);
-    ssrc1block2_.push_back(block1_2_);
-    ssrc12block1_.push_back(block1_1_);
-    ssrc12block1_.push_back(block2_1_);
-    ssrc12block2_.push_back(block1_2_);
-    ssrc12block2_.push_back(block2_2_);
-  }
-
-  RtcpStatistics RtcpReportBlockToRtcpStatistics(
-      const RTCPReportBlock& stats) {
-    RtcpStatistics block;
-    block.packets_lost = stats.packets_lost;
-    block.fraction_lost = stats.fraction_lost;
-    block.extended_highest_sequence_number =
-        stats.extended_highest_sequence_number;
-    block.jitter = stats.jitter;
-    return block;
-  }
-
-  const uint32_t kSsrc1;
-  const uint32_t kSsrc2;
-  RTCPReportBlock block1_1_;
-  RTCPReportBlock block1_2_;
-  RTCPReportBlock block1_3_;
-  RTCPReportBlock block2_1_;
-  RTCPReportBlock block2_2_;
-  std::vector<RTCPReportBlock> ssrc1block1_;
-  std::vector<RTCPReportBlock> ssrc1block2_;
-  std::vector<RTCPReportBlock> ssrc12block1_;
-  std::vector<RTCPReportBlock> ssrc12block2_;
-};
-
-TEST_F(ReportBlockStatsTest, AggregateAndStore_NoSsrc) {
-  ReportBlockStats stats;
-  std::vector<RTCPReportBlock> empty;
-  RTCPReportBlock aggregated = stats.AggregateAndStore(empty);
-  EXPECT_EQ(0U, aggregated.fraction_lost);
-  EXPECT_EQ(0U, aggregated.packets_lost);
-  EXPECT_EQ(0U, aggregated.jitter);
-  EXPECT_EQ(0U, aggregated.extended_highest_sequence_number);
-}
-
-TEST_F(ReportBlockStatsTest, AggregateAndStore_OneSsrc) {
-  ReportBlockStats stats;
-  RTCPReportBlock aggregated = stats.AggregateAndStore(ssrc1block1_);
-  // One ssrc, no aggregation done.
-  EXPECT_EQ(123U, aggregated.fraction_lost);
-  EXPECT_EQ(10U, aggregated.packets_lost);
-  EXPECT_EQ(777U, aggregated.jitter);
-  EXPECT_EQ(24000U, aggregated.extended_highest_sequence_number);
-
-  aggregated = stats.AggregateAndStore(ssrc1block2_);
-  EXPECT_EQ(0U, aggregated.fraction_lost);
-  EXPECT_EQ(15U, aggregated.packets_lost);
-  EXPECT_EQ(222U, aggregated.jitter);
-  EXPECT_EQ(24100U, aggregated.extended_highest_sequence_number);
-
-  // fl: 100 * (15-10) / (24100-24000) = 5%
-  EXPECT_EQ(5, stats.FractionLostInPercent());
-}
-
-TEST_F(ReportBlockStatsTest, AggregateAndStore_TwoSsrcs) {
-  ReportBlockStats stats;
-  RTCPReportBlock aggregated = stats.AggregateAndStore(ssrc12block1_);
-  EXPECT_EQ(0U, aggregated.fraction_lost);
-  EXPECT_EQ(10U + 111U, aggregated.packets_lost);
-  EXPECT_EQ((777U + 555U) / 2, aggregated.jitter);
-  EXPECT_EQ(0U, aggregated.extended_highest_sequence_number);
-
-  aggregated = stats.AggregateAndStore(ssrc12block2_);
-  // fl: 255 * ((15-10) + (136-111)) / ((24100-24000) + (8800-8500)) = 19
-  EXPECT_EQ(19U, aggregated.fraction_lost);
-  EXPECT_EQ(15U + 136U, aggregated.packets_lost);
-  EXPECT_EQ((222U + 888U) / 2, aggregated.jitter);
-  EXPECT_EQ(0U, aggregated.extended_highest_sequence_number);
-
-  // fl: 100 * ((15-10) + (136-111)) / ((24100-24000) + (8800-8500)) = 7%
-  EXPECT_EQ(7, stats.FractionLostInPercent());
-}
-
-TEST_F(ReportBlockStatsTest, StoreAndGetFractionLost) {
-  const uint32_t kRemoteSsrc = 1;
-  ReportBlockStats stats;
-  EXPECT_EQ(-1, stats.FractionLostInPercent());
-
-  // First block.
-  stats.Store(RtcpReportBlockToRtcpStatistics(block1_1_), kRemoteSsrc, kSsrc1);
-  EXPECT_EQ(-1, stats.FractionLostInPercent());
-  // fl: 100 * (15-10) / (24100-24000) = 5%
-  stats.Store(RtcpReportBlockToRtcpStatistics(block1_2_), kRemoteSsrc, kSsrc1);
-  EXPECT_EQ(5, stats.FractionLostInPercent());
-  // fl: 100 * (50-10) / (24200-24000) = 20%
-  stats.Store(RtcpReportBlockToRtcpStatistics(block1_3_), kRemoteSsrc, kSsrc1);
-  EXPECT_EQ(20, stats.FractionLostInPercent());
-}
-
-}  // namespace webrtc
-
diff --git a/video/rtp_streams_synchronizer.cc b/video/rtp_streams_synchronizer.cc
deleted file mode 100644
index ad7cf42..0000000
--- a/video/rtp_streams_synchronizer.cc
+++ /dev/null
@@ -1,154 +0,0 @@
-/*
- *  Copyright (c) 2012 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/video/rtp_streams_synchronizer.h"
-
-#include "webrtc/call/syncable.h"
-#include "webrtc/modules/video_coding/video_coding_impl.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/timeutils.h"
-#include "webrtc/rtc_base/trace_event.h"
-
-namespace webrtc {
-namespace {
-bool UpdateMeasurements(StreamSynchronization::Measurements* stream,
-                        const Syncable::Info& info) {
-  RTC_DCHECK(stream);
-  stream->latest_timestamp = info.latest_received_capture_timestamp;
-  stream->latest_receive_time_ms = info.latest_receive_time_ms;
-  bool new_rtcp_sr = false;
-  if (!stream->rtp_to_ntp.UpdateMeasurements(info.capture_time_ntp_secs,
-                                             info.capture_time_ntp_frac,
-                                             info.capture_time_source_clock,
-                                             &new_rtcp_sr)) {
-    return false;
-  }
-  return true;
-}
-}  // namespace
-
-RtpStreamsSynchronizer::RtpStreamsSynchronizer(Syncable* syncable_video)
-    : syncable_video_(syncable_video),
-      syncable_audio_(nullptr),
-      sync_(),
-      last_sync_time_(rtc::TimeNanos()) {
-  RTC_DCHECK(syncable_video);
-  process_thread_checker_.DetachFromThread();
-}
-
-void RtpStreamsSynchronizer::ConfigureSync(Syncable* syncable_audio) {
-  rtc::CritScope lock(&crit_);
-  if (syncable_audio == syncable_audio_) {
-    // This prevents expensive no-ops.
-    return;
-  }
-
-  syncable_audio_ = syncable_audio;
-  sync_.reset(nullptr);
-  if (syncable_audio_) {
-    sync_.reset(new StreamSynchronization(syncable_video_->id(),
-                                          syncable_audio_->id()));
-  }
-}
-
-int64_t RtpStreamsSynchronizer::TimeUntilNextProcess() {
-  RTC_DCHECK_RUN_ON(&process_thread_checker_);
-  const int64_t kSyncIntervalMs = 1000;
-  return kSyncIntervalMs -
-      (rtc::TimeNanos() - last_sync_time_) / rtc::kNumNanosecsPerMillisec;
-}
-
-void RtpStreamsSynchronizer::Process() {
-  RTC_DCHECK_RUN_ON(&process_thread_checker_);
-  last_sync_time_ = rtc::TimeNanos();
-
-  rtc::CritScope lock(&crit_);
-  if (!syncable_audio_) {
-    return;
-  }
-  RTC_DCHECK(sync_.get());
-
-  rtc::Optional<Syncable::Info> audio_info = syncable_audio_->GetInfo();
-  if (!audio_info || !UpdateMeasurements(&audio_measurement_, *audio_info)) {
-    return;
-  }
-
-  int64_t last_video_receive_ms = video_measurement_.latest_receive_time_ms;
-  rtc::Optional<Syncable::Info> video_info = syncable_video_->GetInfo();
-  if (!video_info || !UpdateMeasurements(&video_measurement_, *video_info)) {
-    return;
-  }
-
-  if (last_video_receive_ms == video_measurement_.latest_receive_time_ms) {
-    // No new video packet has been received since last update.
-    return;
-  }
-
-  int relative_delay_ms;
-  // Calculate how much later or earlier the audio stream is compared to video.
-  if (!sync_->ComputeRelativeDelay(audio_measurement_, video_measurement_,
-                                   &relative_delay_ms)) {
-    return;
-  }
-
-  TRACE_COUNTER1("webrtc", "SyncCurrentVideoDelay",
-      video_info->current_delay_ms);
-  TRACE_COUNTER1("webrtc", "SyncCurrentAudioDelay",
-      audio_info->current_delay_ms);
-  TRACE_COUNTER1("webrtc", "SyncRelativeDelay", relative_delay_ms);
-  int target_audio_delay_ms = 0;
-  int target_video_delay_ms = video_info->current_delay_ms;
-  // Calculate the necessary extra audio delay and desired total video
-  // delay to get the streams in sync.
-  if (!sync_->ComputeDelays(relative_delay_ms,
-                            audio_info->current_delay_ms,
-                            &target_audio_delay_ms,
-                            &target_video_delay_ms)) {
-    return;
-  }
-
-  syncable_audio_->SetMinimumPlayoutDelay(target_audio_delay_ms);
-  syncable_video_->SetMinimumPlayoutDelay(target_video_delay_ms);
-}
-
-bool RtpStreamsSynchronizer::GetStreamSyncOffsetInMs(
-    uint32_t timestamp,
-    int64_t render_time_ms,
-    int64_t* stream_offset_ms,
-    double* estimated_freq_khz) const {
-  rtc::CritScope lock(&crit_);
-  if (!syncable_audio_) {
-    return false;
-  }
-
-  uint32_t playout_timestamp = syncable_audio_->GetPlayoutTimestamp();
-
-  int64_t latest_audio_ntp;
-  if (!audio_measurement_.rtp_to_ntp.Estimate(playout_timestamp,
-                                              &latest_audio_ntp)) {
-    return false;
-  }
-
-  int64_t latest_video_ntp;
-  if (!video_measurement_.rtp_to_ntp.Estimate(timestamp, &latest_video_ntp)) {
-    return false;
-  }
-
-  int64_t time_to_render_ms = render_time_ms - rtc::TimeMillis();
-  if (time_to_render_ms > 0)
-    latest_video_ntp += time_to_render_ms;
-
-  *stream_offset_ms = latest_audio_ntp - latest_video_ntp;
-  *estimated_freq_khz = video_measurement_.rtp_to_ntp.params().frequency_khz;
-  return true;
-}
-
-}  // namespace webrtc
diff --git a/video/rtp_streams_synchronizer.h b/video/rtp_streams_synchronizer.h
deleted file mode 100644
index c8f2d2a..0000000
--- a/video/rtp_streams_synchronizer.h
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- *  Copyright (c) 2012 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.
- */
-
-// RtpStreamsSynchronizer is responsible for synchronization audio and video for
-// a given voice engine channel and video receive stream.
-
-#ifndef WEBRTC_VIDEO_RTP_STREAMS_SYNCHRONIZER_H_
-#define WEBRTC_VIDEO_RTP_STREAMS_SYNCHRONIZER_H_
-
-#include <memory>
-
-#include "webrtc/modules/include/module.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/thread_checker.h"
-#include "webrtc/video/stream_synchronization.h"
-
-namespace webrtc {
-
-class Syncable;
-
-namespace vcm {
-class VideoReceiver;
-}  // namespace vcm
-
-class RtpStreamsSynchronizer : public Module {
- public:
-  explicit RtpStreamsSynchronizer(Syncable* syncable_video);
-
-  void ConfigureSync(Syncable* syncable_audio);
-
-  // Implements Module.
-  int64_t TimeUntilNextProcess() override;
-  void Process() override;
-
-  // Gets the sync offset between the current played out audio frame and the
-  // video |frame|. Returns true on success, false otherwise.
-  // The estimated frequency is the frequency used in the RTP to NTP timestamp
-  // conversion.
-  bool GetStreamSyncOffsetInMs(uint32_t timestamp,
-                               int64_t render_time_ms,
-                               int64_t* stream_offset_ms,
-                               double* estimated_freq_khz) const;
-
- private:
-  Syncable* syncable_video_;
-
-  rtc::CriticalSection crit_;
-  Syncable* syncable_audio_ RTC_GUARDED_BY(crit_);
-  std::unique_ptr<StreamSynchronization> sync_ RTC_GUARDED_BY(crit_);
-  StreamSynchronization::Measurements audio_measurement_ RTC_GUARDED_BY(crit_);
-  StreamSynchronization::Measurements video_measurement_ RTC_GUARDED_BY(crit_);
-
-  rtc::ThreadChecker process_thread_checker_;
-  int64_t last_sync_time_ RTC_ACCESS_ON(&process_thread_checker_);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_VIDEO_RTP_STREAMS_SYNCHRONIZER_H_
diff --git a/video/rtp_video_stream_receiver.cc b/video/rtp_video_stream_receiver.cc
deleted file mode 100644
index 5aff226..0000000
--- a/video/rtp_video_stream_receiver.cc
+++ /dev/null
@@ -1,682 +0,0 @@
-/*
- *  Copyright (c) 2012 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/video/rtp_video_stream_receiver.h"
-
-#include <algorithm>
-#include <utility>
-#include <vector>
-
-#include "webrtc/call/video_config.h"
-#include "webrtc/common_types.h"
-#include "webrtc/media/base/mediaconstants.h"
-#include "webrtc/modules/pacing/packet_router.h"
-#include "webrtc/modules/remote_bitrate_estimator/include/remote_bitrate_estimator.h"
-#include "webrtc/modules/rtp_rtcp/include/receive_statistics.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_cvo.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_header_parser.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_receiver.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp.h"
-#include "webrtc/modules/rtp_rtcp/include/ulpfec_receiver.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_header_extensions.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_packet_received.h"
-#include "webrtc/modules/video_coding/frame_object.h"
-#include "webrtc/modules/video_coding/h264_sprop_parameter_sets.h"
-#include "webrtc/modules/video_coding/h264_sps_pps_tracker.h"
-#include "webrtc/modules/video_coding/packet_buffer.h"
-#include "webrtc/modules/video_coding/video_coding_impl.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/location.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/system_wrappers/include/field_trial.h"
-#include "webrtc/system_wrappers/include/metrics.h"
-#include "webrtc/system_wrappers/include/timestamp_extrapolator.h"
-#include "webrtc/video/receive_statistics_proxy.h"
-
-namespace webrtc {
-
-namespace {
-// TODO(philipel): Change kPacketBufferStartSize back to 32 in M63 see:
-//                 crbug.com/752886
-constexpr int kPacketBufferStartSize = 512;
-constexpr int kPacketBufferMaxSixe = 2048;
-}
-
-std::unique_ptr<RtpRtcp> CreateRtpRtcpModule(
-    ReceiveStatistics* receive_statistics,
-    Transport* outgoing_transport,
-    RtcpRttStats* rtt_stats,
-    RtcpPacketTypeCounterObserver* rtcp_packet_type_counter_observer,
-    TransportSequenceNumberAllocator* transport_sequence_number_allocator) {
-  RtpRtcp::Configuration configuration;
-  configuration.audio = false;
-  configuration.receiver_only = true;
-  configuration.receive_statistics = receive_statistics;
-  configuration.outgoing_transport = outgoing_transport;
-  configuration.intra_frame_callback = nullptr;
-  configuration.rtt_stats = rtt_stats;
-  configuration.rtcp_packet_type_counter_observer =
-      rtcp_packet_type_counter_observer;
-  configuration.transport_sequence_number_allocator =
-      transport_sequence_number_allocator;
-  configuration.send_bitrate_observer = nullptr;
-  configuration.send_frame_count_observer = nullptr;
-  configuration.send_side_delay_observer = nullptr;
-  configuration.send_packet_observer = nullptr;
-  configuration.bandwidth_callback = nullptr;
-  configuration.transport_feedback_callback = nullptr;
-
-  std::unique_ptr<RtpRtcp> rtp_rtcp(RtpRtcp::CreateRtpRtcp(configuration));
-  rtp_rtcp->SetRTCPStatus(RtcpMode::kCompound);
-
-  return rtp_rtcp;
-}
-
-static const int kPacketLogIntervalMs = 10000;
-
-RtpVideoStreamReceiver::RtpVideoStreamReceiver(
-    Transport* transport,
-    RtcpRttStats* rtt_stats,
-    PacketRouter* packet_router,
-    const VideoReceiveStream::Config* config,
-    ReceiveStatistics* rtp_receive_statistics,
-    ReceiveStatisticsProxy* receive_stats_proxy,
-    ProcessThread* process_thread,
-    NackSender* nack_sender,
-    KeyFrameRequestSender* keyframe_request_sender,
-    video_coding::OnCompleteFrameCallback* complete_frame_callback,
-    VCMTiming* timing)
-    : clock_(Clock::GetRealTimeClock()),
-      config_(*config),
-      packet_router_(packet_router),
-      process_thread_(process_thread),
-      ntp_estimator_(clock_),
-      rtp_header_parser_(RtpHeaderParser::Create()),
-      rtp_receiver_(RtpReceiver::CreateVideoReceiver(clock_,
-                                                     this,
-                                                     this,
-                                                     &rtp_payload_registry_)),
-      rtp_receive_statistics_(rtp_receive_statistics),
-      ulpfec_receiver_(UlpfecReceiver::Create(config->rtp.remote_ssrc, this)),
-      receiving_(false),
-      last_packet_log_ms_(-1),
-      rtp_rtcp_(CreateRtpRtcpModule(rtp_receive_statistics_,
-                                    transport,
-                                    rtt_stats,
-                                    receive_stats_proxy,
-                                    packet_router)),
-      complete_frame_callback_(complete_frame_callback),
-      keyframe_request_sender_(keyframe_request_sender),
-      timing_(timing),
-      has_received_frame_(false) {
-  constexpr bool remb_candidate = true;
-  packet_router_->AddReceiveRtpModule(rtp_rtcp_.get(), remb_candidate);
-  rtp_receive_statistics_->RegisterRtpStatisticsCallback(receive_stats_proxy);
-  rtp_receive_statistics_->RegisterRtcpStatisticsCallback(receive_stats_proxy);
-
-  RTC_DCHECK(config_.rtp.rtcp_mode != RtcpMode::kOff)
-      << "A stream should not be configured with RTCP disabled. This value is "
-         "reserved for internal usage.";
-  RTC_DCHECK(config_.rtp.remote_ssrc != 0);
-  // TODO(pbos): What's an appropriate local_ssrc for receive-only streams?
-  RTC_DCHECK(config_.rtp.local_ssrc != 0);
-  RTC_DCHECK(config_.rtp.remote_ssrc != config_.rtp.local_ssrc);
-
-  rtp_rtcp_->SetRTCPStatus(config_.rtp.rtcp_mode);
-  rtp_rtcp_->SetSSRC(config_.rtp.local_ssrc);
-  rtp_rtcp_->SetRemoteSSRC(config_.rtp.remote_ssrc);
-  rtp_rtcp_->SetKeyFrameRequestMethod(kKeyFrameReqPliRtcp);
-
-  for (size_t i = 0; i < config_.rtp.extensions.size(); ++i) {
-    EnableReceiveRtpHeaderExtension(config_.rtp.extensions[i].uri,
-                                    config_.rtp.extensions[i].id);
-  }
-
-  static const int kMaxPacketAgeToNack = 450;
-  const int max_reordering_threshold = (config_.rtp.nack.rtp_history_ms > 0)
-                                           ? kMaxPacketAgeToNack
-                                           : kDefaultMaxReorderingThreshold;
-  rtp_receive_statistics_->SetMaxReorderingThreshold(max_reordering_threshold);
-
-  if (config_.rtp.rtx_ssrc) {
-    // Needed for rtp_payload_registry_.RtxEnabled().
-    rtp_payload_registry_.SetRtxSsrc(config_.rtp.rtx_ssrc);
-  }
-
-  if (IsUlpfecEnabled()) {
-    VideoCodec ulpfec_codec = {};
-    ulpfec_codec.codecType = kVideoCodecULPFEC;
-    strncpy(ulpfec_codec.plName, "ulpfec", sizeof(ulpfec_codec.plName));
-    ulpfec_codec.plType = config_.rtp.ulpfec.ulpfec_payload_type;
-    RTC_CHECK(AddReceiveCodec(ulpfec_codec));
-  }
-
-  if (IsRedEnabled()) {
-    VideoCodec red_codec = {};
-    red_codec.codecType = kVideoCodecRED;
-    strncpy(red_codec.plName, "red", sizeof(red_codec.plName));
-    red_codec.plType = config_.rtp.ulpfec.red_payload_type;
-    RTC_CHECK(AddReceiveCodec(red_codec));
-  }
-
-  if (config_.rtp.rtcp_xr.receiver_reference_time_report)
-    rtp_rtcp_->SetRtcpXrRrtrStatus(true);
-
-  // Stats callback for CNAME changes.
-  rtp_rtcp_->RegisterRtcpStatisticsCallback(receive_stats_proxy);
-
-  process_thread_->RegisterModule(rtp_rtcp_.get(), RTC_FROM_HERE);
-
-  if (config_.rtp.nack.rtp_history_ms != 0) {
-    nack_module_.reset(
-        new NackModule(clock_, nack_sender, keyframe_request_sender));
-    process_thread_->RegisterModule(nack_module_.get(), RTC_FROM_HERE);
-  }
-
-  packet_buffer_ = video_coding::PacketBuffer::Create(
-      clock_, kPacketBufferStartSize, kPacketBufferMaxSixe, this);
-  reference_finder_.reset(new video_coding::RtpFrameReferenceFinder(this));
-}
-
-RtpVideoStreamReceiver::~RtpVideoStreamReceiver() {
-  RTC_DCHECK(secondary_sinks_.empty());
-
-  if (nack_module_) {
-    process_thread_->DeRegisterModule(nack_module_.get());
-  }
-
-  process_thread_->DeRegisterModule(rtp_rtcp_.get());
-
-  packet_router_->RemoveReceiveRtpModule(rtp_rtcp_.get());
-  UpdateHistograms();
-}
-
-bool RtpVideoStreamReceiver::AddReceiveCodec(
-    const VideoCodec& video_codec,
-    const std::map<std::string, std::string>& codec_params) {
-  pt_codec_params_.insert(make_pair(video_codec.plType, codec_params));
-  return AddReceiveCodec(video_codec);
-}
-
-bool RtpVideoStreamReceiver::AddReceiveCodec(const VideoCodec& video_codec) {
-  int8_t old_pltype = -1;
-  if (rtp_payload_registry_.ReceivePayloadType(video_codec, &old_pltype) !=
-      -1) {
-    rtp_payload_registry_.DeRegisterReceivePayload(old_pltype);
-  }
-  return rtp_payload_registry_.RegisterReceivePayload(video_codec) == 0;
-}
-
-uint32_t RtpVideoStreamReceiver::GetRemoteSsrc() const {
-  return config_.rtp.remote_ssrc;
-}
-
-int RtpVideoStreamReceiver::GetCsrcs(uint32_t* csrcs) const {
-  return rtp_receiver_->CSRCs(csrcs);
-}
-
-RtpReceiver* RtpVideoStreamReceiver::GetRtpReceiver() const {
-  return rtp_receiver_.get();
-}
-
-int32_t RtpVideoStreamReceiver::OnReceivedPayloadData(
-    const uint8_t* payload_data,
-    size_t payload_size,
-    const WebRtcRTPHeader* rtp_header) {
-  WebRtcRTPHeader rtp_header_with_ntp = *rtp_header;
-  rtp_header_with_ntp.ntp_time_ms =
-      ntp_estimator_.Estimate(rtp_header->header.timestamp);
-  VCMPacket packet(payload_data, payload_size, rtp_header_with_ntp);
-  packet.timesNacked =
-      nack_module_ ? nack_module_->OnReceivedPacket(packet) : -1;
-  packet.receive_time_ms = clock_->TimeInMilliseconds();
-
-  // In the case of a video stream without picture ids and no rtx the
-  // RtpFrameReferenceFinder will need to know about padding to
-  // correctly calculate frame references.
-  if (packet.sizeBytes == 0) {
-    reference_finder_->PaddingReceived(packet.seqNum);
-    packet_buffer_->PaddingReceived(packet.seqNum);
-    return 0;
-  }
-
-  if (packet.codec == kVideoCodecH264) {
-    // Only when we start to receive packets will we know what payload type
-    // that will be used. When we know the payload type insert the correct
-    // sps/pps into the tracker.
-    if (packet.payloadType != last_payload_type_) {
-      last_payload_type_ = packet.payloadType;
-      InsertSpsPpsIntoTracker(packet.payloadType);
-    }
-
-    switch (tracker_.CopyAndFixBitstream(&packet)) {
-      case video_coding::H264SpsPpsTracker::kRequestKeyframe:
-        keyframe_request_sender_->RequestKeyFrame();
-        FALLTHROUGH();
-      case video_coding::H264SpsPpsTracker::kDrop:
-        return 0;
-      case video_coding::H264SpsPpsTracker::kInsert:
-        break;
-    }
-
-  } else {
-    uint8_t* data = new uint8_t[packet.sizeBytes];
-    memcpy(data, packet.dataPtr, packet.sizeBytes);
-    packet.dataPtr = data;
-  }
-
-  packet_buffer_->InsertPacket(&packet);
-  return 0;
-}
-
-// TODO(nisse): Try to delete this method. Obstacles: It is used by
-// ParseAndHandleEncapsulatingHeader, for handling Rtx packets, and
-// for callbacks from |ulpfec_receiver_|.
-void RtpVideoStreamReceiver::OnRecoveredPacket(const uint8_t* rtp_packet,
-                                               size_t rtp_packet_length) {
-  RTPHeader header;
-  if (!rtp_header_parser_->Parse(rtp_packet, rtp_packet_length, &header)) {
-    return;
-  }
-  header.payload_type_frequency = kVideoPayloadTypeFrequency;
-  bool in_order = IsPacketInOrder(header);
-  ReceivePacket(rtp_packet, rtp_packet_length, header, in_order);
-}
-
-// TODO(pbos): Remove as soon as audio can handle a changing payload type
-// without this callback.
-int32_t RtpVideoStreamReceiver::OnInitializeDecoder(
-    const int8_t payload_type,
-    const char payload_name[RTP_PAYLOAD_NAME_SIZE],
-    const int frequency,
-    const size_t channels,
-    const uint32_t rate) {
-  RTC_NOTREACHED();
-  return 0;
-}
-
-// This method handles both regular RTP packets and packets recovered
-// via FlexFEC.
-void RtpVideoStreamReceiver::OnRtpPacket(const RtpPacketReceived& packet) {
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&worker_task_checker_);
-
-  if (!receiving_) {
-    return;
-  }
-
-  if (!packet.recovered()) {
-    int64_t now_ms = clock_->TimeInMilliseconds();
-
-    // Periodically log the RTP header of incoming packets.
-    if (now_ms - last_packet_log_ms_ > kPacketLogIntervalMs) {
-      std::stringstream ss;
-      ss << "Packet received on SSRC: " << packet.Ssrc()
-         << " with payload type: " << static_cast<int>(packet.PayloadType())
-         << ", timestamp: " << packet.Timestamp()
-         << ", sequence number: " << packet.SequenceNumber()
-         << ", arrival time: " << packet.arrival_time_ms();
-      int32_t time_offset;
-      if (packet.GetExtension<TransmissionOffset>(&time_offset)) {
-        ss << ", toffset: " << time_offset;
-      }
-      uint32_t send_time;
-      if (packet.GetExtension<AbsoluteSendTime>(&send_time)) {
-        ss << ", abs send time: " << send_time;
-      }
-      LOG(LS_INFO) << ss.str();
-      last_packet_log_ms_ = now_ms;
-    }
-  }
-
-  // TODO(nisse): Delete use of GetHeader, but needs refactoring of
-  // ReceivePacket and IncomingPacket methods below.
-  RTPHeader header;
-  packet.GetHeader(&header);
-
-  header.payload_type_frequency = kVideoPayloadTypeFrequency;
-
-  bool in_order = IsPacketInOrder(header);
-  if (!packet.recovered()) {
-    // TODO(nisse): Why isn't this done for recovered packets?
-    rtp_payload_registry_.SetIncomingPayloadType(header);
-  }
-  ReceivePacket(packet.data(), packet.size(), header, in_order);
-  // Update receive statistics after ReceivePacket.
-  // Receive statistics will be reset if the payload type changes (make sure
-  // that the first packet is included in the stats).
-  if (!packet.recovered()) {
-    // TODO(nisse): We should pass a recovered flag to stats, to aid
-    // fixing bug bugs.webrtc.org/6339.
-    rtp_receive_statistics_->IncomingPacket(
-        header, packet.size(), IsPacketRetransmitted(header, in_order));
-  }
-
-  for (RtpPacketSinkInterface* secondary_sink : secondary_sinks_) {
-    secondary_sink->OnRtpPacket(packet);
-  }
-}
-
-int32_t RtpVideoStreamReceiver::RequestKeyFrame() {
-  return rtp_rtcp_->RequestKeyFrame();
-}
-
-bool RtpVideoStreamReceiver::IsUlpfecEnabled() const {
-  return config_.rtp.ulpfec.ulpfec_payload_type != -1;
-}
-
-bool RtpVideoStreamReceiver::IsRedEnabled() const {
-  return config_.rtp.ulpfec.red_payload_type != -1;
-}
-
-bool RtpVideoStreamReceiver::IsRetransmissionsEnabled() const {
-  return config_.rtp.nack.rtp_history_ms > 0;
-}
-
-void RtpVideoStreamReceiver::RequestPacketRetransmit(
-    const std::vector<uint16_t>& sequence_numbers) {
-  rtp_rtcp_->SendNack(sequence_numbers);
-}
-
-int32_t RtpVideoStreamReceiver::ResendPackets(const uint16_t* sequence_numbers,
-                                              uint16_t length) {
-  return rtp_rtcp_->SendNACK(sequence_numbers, length);
-}
-
-void RtpVideoStreamReceiver::OnReceivedFrame(
-    std::unique_ptr<video_coding::RtpFrameObject> frame) {
-  if (!has_received_frame_) {
-    has_received_frame_ = true;
-    if (frame->FrameType() != kVideoFrameKey)
-      keyframe_request_sender_->RequestKeyFrame();
-  }
-
-  if (!frame->delayed_by_retransmission())
-    timing_->IncomingTimestamp(frame->timestamp, clock_->TimeInMilliseconds());
-  reference_finder_->ManageFrame(std::move(frame));
-}
-
-void RtpVideoStreamReceiver::OnCompleteFrame(
-    std::unique_ptr<video_coding::FrameObject> frame) {
-  {
-    rtc::CritScope lock(&last_seq_num_cs_);
-    video_coding::RtpFrameObject* rtp_frame =
-        static_cast<video_coding::RtpFrameObject*>(frame.get());
-    last_seq_num_for_pic_id_[rtp_frame->picture_id] = rtp_frame->last_seq_num();
-  }
-  complete_frame_callback_->OnCompleteFrame(std::move(frame));
-}
-
-void RtpVideoStreamReceiver::OnRttUpdate(int64_t avg_rtt_ms,
-                                         int64_t max_rtt_ms) {
-  if (nack_module_)
-    nack_module_->UpdateRtt(max_rtt_ms);
-}
-
-rtc::Optional<int64_t> RtpVideoStreamReceiver::LastReceivedPacketMs() const {
-  return packet_buffer_->LastReceivedPacketMs();
-}
-
-rtc::Optional<int64_t> RtpVideoStreamReceiver::LastReceivedKeyframePacketMs()
-    const {
-  return packet_buffer_->LastReceivedKeyframePacketMs();
-}
-
-void RtpVideoStreamReceiver::AddSecondarySink(RtpPacketSinkInterface* sink) {
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&worker_task_checker_);
-  RTC_DCHECK(std::find(secondary_sinks_.cbegin(), secondary_sinks_.cend(),
-                       sink) == secondary_sinks_.cend());
-  secondary_sinks_.push_back(sink);
-}
-
-void RtpVideoStreamReceiver::RemoveSecondarySink(
-    const RtpPacketSinkInterface* sink) {
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&worker_task_checker_);
-  auto it = std::find(secondary_sinks_.begin(), secondary_sinks_.end(), sink);
-  if (it == secondary_sinks_.end()) {
-    // We might be rolling-back a call whose setup failed mid-way. In such a
-    // case, it's simpler to remove "everything" rather than remember what
-    // has already been added.
-    LOG(LS_WARNING) << "Removal of unknown sink.";
-    return;
-  }
-  secondary_sinks_.erase(it);
-}
-
-void RtpVideoStreamReceiver::ReceivePacket(const uint8_t* packet,
-                                           size_t packet_length,
-                                           const RTPHeader& header,
-                                           bool in_order) {
-  if (rtp_payload_registry_.IsRed(header)) {
-    ParseAndHandleEncapsulatingHeader(packet, packet_length, header);
-    return;
-  }
-  const uint8_t* payload = packet + header.headerLength;
-  assert(packet_length >= header.headerLength);
-  size_t payload_length = packet_length - header.headerLength;
-  PayloadUnion payload_specific;
-  if (!rtp_payload_registry_.GetPayloadSpecifics(header.payloadType,
-                                                 &payload_specific)) {
-    return;
-  }
-  rtp_receiver_->IncomingRtpPacket(header, payload, payload_length,
-                                   payload_specific, in_order);
-}
-
-void RtpVideoStreamReceiver::ParseAndHandleEncapsulatingHeader(
-    const uint8_t* packet, size_t packet_length, const RTPHeader& header) {
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&worker_task_checker_);
-  if (rtp_payload_registry_.IsRed(header)) {
-    int8_t ulpfec_pt = rtp_payload_registry_.ulpfec_payload_type();
-    if (packet[header.headerLength] == ulpfec_pt) {
-      rtp_receive_statistics_->FecPacketReceived(header, packet_length);
-      // Notify video_receiver about received FEC packets to avoid NACKing these
-      // packets.
-      NotifyReceiverOfFecPacket(header);
-    }
-    if (ulpfec_receiver_->AddReceivedRedPacket(header, packet, packet_length,
-                                               ulpfec_pt) != 0) {
-      return;
-    }
-    ulpfec_receiver_->ProcessReceivedFec();
-  }
-}
-
-void RtpVideoStreamReceiver::NotifyReceiverOfFecPacket(
-    const RTPHeader& header) {
-  int8_t last_media_payload_type =
-      rtp_payload_registry_.last_received_media_payload_type();
-  if (last_media_payload_type < 0) {
-    LOG(LS_WARNING) << "Failed to get last media payload type.";
-    return;
-  }
-  // Fake an empty media packet.
-  WebRtcRTPHeader rtp_header = {};
-  rtp_header.header = header;
-  rtp_header.header.payloadType = last_media_payload_type;
-  rtp_header.header.paddingLength = 0;
-  PayloadUnion payload_specific;
-  if (!rtp_payload_registry_.GetPayloadSpecifics(last_media_payload_type,
-                                                 &payload_specific)) {
-    LOG(LS_WARNING) << "Failed to get payload specifics.";
-    return;
-  }
-  rtp_header.type.Video.codec = payload_specific.Video.videoCodecType;
-  rtp_header.type.Video.rotation = kVideoRotation_0;
-  if (header.extension.hasVideoRotation) {
-    rtp_header.type.Video.rotation = header.extension.videoRotation;
-  }
-  rtp_header.type.Video.content_type = VideoContentType::UNSPECIFIED;
-  if (header.extension.hasVideoContentType) {
-    rtp_header.type.Video.content_type = header.extension.videoContentType;
-  }
-  rtp_header.type.Video.video_timing = {0u, 0u, 0u, 0u, 0u, 0u, false};
-  if (header.extension.has_video_timing) {
-    rtp_header.type.Video.video_timing = header.extension.video_timing;
-  }
-  rtp_header.type.Video.playout_delay = header.extension.playout_delay;
-
-  OnReceivedPayloadData(nullptr, 0, &rtp_header);
-}
-
-bool RtpVideoStreamReceiver::DeliverRtcp(const uint8_t* rtcp_packet,
-                                         size_t rtcp_packet_length) {
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&worker_task_checker_);
-
-  if (!receiving_) {
-    return false;
-  }
-
-  rtp_rtcp_->IncomingRtcpPacket(rtcp_packet, rtcp_packet_length);
-
-  int64_t rtt = 0;
-  rtp_rtcp_->RTT(rtp_receiver_->SSRC(), &rtt, nullptr, nullptr, nullptr);
-  if (rtt == 0) {
-    // Waiting for valid rtt.
-    return true;
-  }
-  uint32_t ntp_secs = 0;
-  uint32_t ntp_frac = 0;
-  uint32_t rtp_timestamp = 0;
-  if (rtp_rtcp_->RemoteNTP(&ntp_secs, &ntp_frac, nullptr, nullptr,
-                           &rtp_timestamp) != 0) {
-    // Waiting for RTCP.
-    return true;
-  }
-  ntp_estimator_.UpdateRtcpTimestamp(rtt, ntp_secs, ntp_frac, rtp_timestamp);
-
-  return true;
-}
-
-void RtpVideoStreamReceiver::FrameContinuous(int64_t picture_id) {
-  if (!nack_module_)
-    return;
-
-  int seq_num = -1;
-  {
-    rtc::CritScope lock(&last_seq_num_cs_);
-    auto seq_num_it = last_seq_num_for_pic_id_.find(picture_id);
-    if (seq_num_it != last_seq_num_for_pic_id_.end())
-      seq_num = seq_num_it->second;
-  }
-  if (seq_num != -1)
-    nack_module_->ClearUpTo(seq_num);
-}
-
-void RtpVideoStreamReceiver::FrameDecoded(int64_t picture_id) {
-  int seq_num = -1;
-  {
-    rtc::CritScope lock(&last_seq_num_cs_);
-    auto seq_num_it = last_seq_num_for_pic_id_.find(picture_id);
-    if (seq_num_it != last_seq_num_for_pic_id_.end()) {
-      seq_num = seq_num_it->second;
-      last_seq_num_for_pic_id_.erase(last_seq_num_for_pic_id_.begin(),
-                                     ++seq_num_it);
-    }
-  }
-  if (seq_num != -1) {
-    packet_buffer_->ClearTo(seq_num);
-    reference_finder_->ClearTo(seq_num);
-  }
-}
-
-void RtpVideoStreamReceiver::SignalNetworkState(NetworkState state) {
-  rtp_rtcp_->SetRTCPStatus(state == kNetworkUp ? config_.rtp.rtcp_mode
-                                               : RtcpMode::kOff);
-}
-
-void RtpVideoStreamReceiver::StartReceive() {
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&worker_task_checker_);
-  receiving_ = true;
-}
-
-void RtpVideoStreamReceiver::StopReceive() {
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&worker_task_checker_);
-  receiving_ = false;
-}
-
-bool RtpVideoStreamReceiver::IsPacketInOrder(const RTPHeader& header) const {
-  StreamStatistician* statistician =
-      rtp_receive_statistics_->GetStatistician(header.ssrc);
-  if (!statistician)
-    return false;
-  return statistician->IsPacketInOrder(header.sequenceNumber);
-}
-
-bool RtpVideoStreamReceiver::IsPacketRetransmitted(const RTPHeader& header,
-                                                   bool in_order) const {
-  // Retransmissions are handled separately if RTX is enabled.
-  if (rtp_payload_registry_.RtxEnabled())
-    return false;
-  StreamStatistician* statistician =
-      rtp_receive_statistics_->GetStatistician(header.ssrc);
-  if (!statistician)
-    return false;
-  // Check if this is a retransmission.
-  int64_t min_rtt = 0;
-  rtp_rtcp_->RTT(config_.rtp.remote_ssrc, nullptr, nullptr, &min_rtt, nullptr);
-  return !in_order &&
-      statistician->IsRetransmitOfOldPacket(header, min_rtt);
-}
-
-void RtpVideoStreamReceiver::UpdateHistograms() {
-  FecPacketCounter counter = ulpfec_receiver_->GetPacketCounter();
-  if (counter.first_packet_time_ms == -1)
-    return;
-
-  int64_t elapsed_sec =
-      (clock_->TimeInMilliseconds() - counter.first_packet_time_ms) / 1000;
-  if (elapsed_sec < metrics::kMinRunTimeInSeconds)
-    return;
-
-  if (counter.num_packets > 0) {
-    RTC_HISTOGRAM_PERCENTAGE(
-        "WebRTC.Video.ReceivedFecPacketsInPercent",
-        static_cast<int>(counter.num_fec_packets * 100 / counter.num_packets));
-  }
-  if (counter.num_fec_packets > 0) {
-    RTC_HISTOGRAM_PERCENTAGE("WebRTC.Video.RecoveredMediaPacketsInPercentOfFec",
-                             static_cast<int>(counter.num_recovered_packets *
-                                              100 / counter.num_fec_packets));
-  }
-}
-
-void RtpVideoStreamReceiver::EnableReceiveRtpHeaderExtension(
-    const std::string& extension, int id) {
-  // One-byte-extension local identifiers are in the range 1-14 inclusive.
-  RTC_DCHECK_GE(id, 1);
-  RTC_DCHECK_LE(id, 14);
-  RTC_DCHECK(RtpExtension::IsSupportedForVideo(extension));
-  RTC_CHECK(rtp_header_parser_->RegisterRtpHeaderExtension(
-      StringToRtpExtensionType(extension), id));
-}
-
-void RtpVideoStreamReceiver::InsertSpsPpsIntoTracker(uint8_t payload_type) {
-  auto codec_params_it = pt_codec_params_.find(payload_type);
-  if (codec_params_it == pt_codec_params_.end())
-    return;
-
-  LOG(LS_INFO) << "Found out of band supplied codec parameters for"
-               << " payload type: " << static_cast<int>(payload_type);
-
-  H264SpropParameterSets sprop_decoder;
-  auto sprop_base64_it =
-      codec_params_it->second.find(cricket::kH264FmtpSpropParameterSets);
-
-  if (sprop_base64_it == codec_params_it->second.end())
-    return;
-
-  if (!sprop_decoder.DecodeSprop(sprop_base64_it->second.c_str()))
-    return;
-
-  tracker_.InsertSpsPpsNalus(sprop_decoder.sps_nalu(),
-                             sprop_decoder.pps_nalu());
-}
-
-}  // namespace webrtc
diff --git a/video/rtp_video_stream_receiver.h b/video/rtp_video_stream_receiver.h
deleted file mode 100644
index 994ef55..0000000
--- a/video/rtp_video_stream_receiver.h
+++ /dev/null
@@ -1,218 +0,0 @@
-/*
- *  Copyright (c) 2012 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_VIDEO_RTP_VIDEO_STREAM_RECEIVER_H_
-#define WEBRTC_VIDEO_RTP_VIDEO_STREAM_RECEIVER_H_
-
-#include <list>
-#include <map>
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "webrtc/call/rtp_packet_sink_interface.h"
-#include "webrtc/call/video_receive_stream.h"
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/modules/rtp_rtcp/include/receive_statistics.h"
-#include "webrtc/modules/rtp_rtcp/include/remote_ntp_time_estimator.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_payload_registry.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
-#include "webrtc/modules/video_coding/h264_sps_pps_tracker.h"
-#include "webrtc/modules/video_coding/include/video_coding_defines.h"
-#include "webrtc/modules/video_coding/packet_buffer.h"
-#include "webrtc/modules/video_coding/rtp_frame_reference_finder.h"
-#include "webrtc/modules/video_coding/sequence_number_util.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/sequenced_task_checker.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-class NackModule;
-class PacedSender;
-class PacketRouter;
-class ProcessThread;
-class ReceiveStatistics;
-class ReceiveStatisticsProxy;
-class RemoteNtpTimeEstimator;
-class RtcpRttStats;
-class RtpHeaderParser;
-class RtpPacketReceived;
-class RTPPayloadRegistry;
-class RtpReceiver;
-class Transport;
-class UlpfecReceiver;
-class VCMTiming;
-
-namespace vcm {
-class VideoReceiver;
-}  // namespace vcm
-
-class RtpVideoStreamReceiver : public RtpData,
-                               public RecoveredPacketReceiver,
-                               public RtpFeedback,
-                               public RtpPacketSinkInterface,
-                               public VCMFrameTypeCallback,
-                               public VCMPacketRequestCallback,
-                               public video_coding::OnReceivedFrameCallback,
-                               public video_coding::OnCompleteFrameCallback,
-                               public CallStatsObserver {
- public:
-  RtpVideoStreamReceiver(
-      Transport* transport,
-      RtcpRttStats* rtt_stats,
-      PacketRouter* packet_router,
-      const VideoReceiveStream::Config* config,
-      ReceiveStatistics* rtp_receive_statistics,
-      ReceiveStatisticsProxy* receive_stats_proxy,
-      ProcessThread* process_thread,
-      NackSender* nack_sender,
-      KeyFrameRequestSender* keyframe_request_sender,
-      video_coding::OnCompleteFrameCallback* complete_frame_callback,
-      VCMTiming* timing);
-  ~RtpVideoStreamReceiver();
-
-  bool AddReceiveCodec(const VideoCodec& video_codec,
-                       const std::map<std::string, std::string>& codec_params);
-  uint32_t GetRemoteSsrc() const;
-  int GetCsrcs(uint32_t* csrcs) const;
-
-  RtpReceiver* GetRtpReceiver() const;
-  RtpRtcp* rtp_rtcp() const { return rtp_rtcp_.get(); }
-
-  void StartReceive();
-  void StopReceive();
-
-  bool DeliverRtcp(const uint8_t* rtcp_packet, size_t rtcp_packet_length);
-
-  void FrameContinuous(int64_t seq_num);
-
-  void FrameDecoded(int64_t seq_num);
-
-  void SignalNetworkState(NetworkState state);
-
-  // Implements RtpPacketSinkInterface.
-  void OnRtpPacket(const RtpPacketReceived& packet) override;
-
-  // Implements RtpData.
-  int32_t OnReceivedPayloadData(const uint8_t* payload_data,
-                                size_t payload_size,
-                                const WebRtcRTPHeader* rtp_header) override;
-  // Implements RecoveredPacketReceiver.
-  void OnRecoveredPacket(const uint8_t* packet, size_t packet_length) override;
-
-  // Implements RtpFeedback.
-  int32_t OnInitializeDecoder(int8_t payload_type,
-                              const char payload_name[RTP_PAYLOAD_NAME_SIZE],
-                              int frequency,
-                              size_t channels,
-                              uint32_t rate) override;
-  void OnIncomingSSRCChanged(uint32_t ssrc) override {}
-  void OnIncomingCSRCChanged(uint32_t CSRC, bool added) override {}
-
-  // Implements VCMFrameTypeCallback.
-  int32_t RequestKeyFrame() override;
-
-  bool IsUlpfecEnabled() const;
-  bool IsRetransmissionsEnabled() const;
-  // Don't use, still experimental.
-  void RequestPacketRetransmit(const std::vector<uint16_t>& sequence_numbers);
-
-  // Implements VCMPacketRequestCallback.
-  int32_t ResendPackets(const uint16_t* sequenceNumbers,
-                        uint16_t length) override;
-
-  // Implements OnReceivedFrameCallback.
-  void OnReceivedFrame(
-      std::unique_ptr<video_coding::RtpFrameObject> frame) override;
-
-  // Implements OnCompleteFrameCallback.
-  void OnCompleteFrame(
-      std::unique_ptr<video_coding::FrameObject> frame) override;
-
-  void OnRttUpdate(int64_t avg_rtt_ms, int64_t max_rtt_ms) override;
-
-  rtc::Optional<int64_t> LastReceivedPacketMs() const;
-  rtc::Optional<int64_t> LastReceivedKeyframePacketMs() const;
-
-  // RtpDemuxer only forwards a given RTP packet to one sink. However, some
-  // sinks, such as FlexFEC, might wish to be informed of all of the packets
-  // a given sink receives (or any set of sinks). They may do so by registering
-  // themselves as secondary sinks.
-  void AddSecondarySink(RtpPacketSinkInterface* sink);
-  void RemoveSecondarySink(const RtpPacketSinkInterface* sink);
-
- private:
-  bool AddReceiveCodec(const VideoCodec& video_codec);
-  void ReceivePacket(const uint8_t* packet,
-                     size_t packet_length,
-                     const RTPHeader& header,
-                     bool in_order);
-  // Parses and handles for instance RTX and RED headers.
-  // This function assumes that it's being called from only one thread.
-  void ParseAndHandleEncapsulatingHeader(const uint8_t* packet,
-                                         size_t packet_length,
-                                         const RTPHeader& header);
-  void NotifyReceiverOfFecPacket(const RTPHeader& header);
-  bool IsPacketInOrder(const RTPHeader& header) const;
-  bool IsPacketRetransmitted(const RTPHeader& header, bool in_order) const;
-  void UpdateHistograms();
-  void EnableReceiveRtpHeaderExtension(const std::string& extension, int id);
-  bool IsRedEnabled() const;
-  void InsertSpsPpsIntoTracker(uint8_t payload_type);
-
-  Clock* const clock_;
-  // Ownership of this object lies with VideoReceiveStream, which owns |this|.
-  const VideoReceiveStream::Config& config_;
-  PacketRouter* const packet_router_;
-  ProcessThread* const process_thread_;
-
-  RemoteNtpTimeEstimator ntp_estimator_;
-  RTPPayloadRegistry rtp_payload_registry_;
-
-  const std::unique_ptr<RtpHeaderParser> rtp_header_parser_;
-  const std::unique_ptr<RtpReceiver> rtp_receiver_;
-  ReceiveStatistics* const rtp_receive_statistics_;
-  std::unique_ptr<UlpfecReceiver> ulpfec_receiver_;
-
-  rtc::SequencedTaskChecker worker_task_checker_;
-  bool receiving_ RTC_GUARDED_BY(worker_task_checker_);
-  int64_t last_packet_log_ms_ RTC_GUARDED_BY(worker_task_checker_);
-
-  const std::unique_ptr<RtpRtcp> rtp_rtcp_;
-
-  // Members for the new jitter buffer experiment.
-  video_coding::OnCompleteFrameCallback* complete_frame_callback_;
-  KeyFrameRequestSender* keyframe_request_sender_;
-  VCMTiming* timing_;
-  std::unique_ptr<NackModule> nack_module_;
-  rtc::scoped_refptr<video_coding::PacketBuffer> packet_buffer_;
-  std::unique_ptr<video_coding::RtpFrameReferenceFinder> reference_finder_;
-  rtc::CriticalSection last_seq_num_cs_;
-  std::map<int64_t, uint16_t> last_seq_num_for_pic_id_
-      RTC_GUARDED_BY(last_seq_num_cs_);
-  video_coding::H264SpsPpsTracker tracker_;
-  // TODO(johan): Remove pt_codec_params_ once
-  // https://bugs.chromium.org/p/webrtc/issues/detail?id=6883 is resolved.
-  // Maps a payload type to a map of out-of-band supplied codec parameters.
-  std::map<uint8_t, std::map<std::string, std::string>> pt_codec_params_;
-  int16_t last_payload_type_ = -1;
-
-  bool has_received_frame_;
-
-  std::vector<RtpPacketSinkInterface*> secondary_sinks_
-      RTC_GUARDED_BY(worker_task_checker_);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_VIDEO_RTP_VIDEO_STREAM_RECEIVER_H_
diff --git a/video/rtp_video_stream_receiver_unittest.cc b/video/rtp_video_stream_receiver_unittest.cc
deleted file mode 100644
index 4f2dca7..0000000
--- a/video/rtp_video_stream_receiver_unittest.cc
+++ /dev/null
@@ -1,465 +0,0 @@
-/*
- *  Copyright 2017 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/test/gtest.h"
-#include "webrtc/test/gmock.h"
-
-#include "webrtc/common_video/h264/h264_common.h"
-#include "webrtc/media/base/mediaconstants.h"
-#include "webrtc/modules/pacing/packet_router.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_packet_received.h"
-#include "webrtc/modules/utility/include/process_thread.h"
-#include "webrtc/modules/video_coding/frame_object.h"
-#include "webrtc/modules/video_coding/include/video_coding_defines.h"
-#include "webrtc/modules/video_coding/packet.h"
-#include "webrtc/modules/video_coding/rtp_frame_reference_finder.h"
-#include "webrtc/modules/video_coding/timing.h"
-#include "webrtc/rtc_base/bytebuffer.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/ptr_util.h"
-#include "webrtc/system_wrappers/include/clock.h"
-#include "webrtc/system_wrappers/include/field_trial_default.h"
-#include "webrtc/test/field_trial.h"
-#include "webrtc/video/rtp_video_stream_receiver.h"
-
-using testing::_;
-
-namespace webrtc {
-
-namespace {
-
-const char kNewJitterBufferFieldTrialEnabled[] =
-    "WebRTC-NewVideoJitterBuffer/Enabled/";
-const uint8_t kH264StartCode[] = {0x00, 0x00, 0x00, 0x01};
-
-class MockTransport : public Transport {
- public:
-  MOCK_METHOD3(SendRtp,
-               bool(const uint8_t* packet,
-                    size_t length,
-                    const PacketOptions& options));
-  MOCK_METHOD2(SendRtcp, bool(const uint8_t* packet, size_t length));
-};
-
-class MockNackSender : public NackSender {
- public:
-  MOCK_METHOD1(SendNack, void(const std::vector<uint16_t>& sequence_numbers));
-};
-
-class MockKeyFrameRequestSender : public KeyFrameRequestSender {
- public:
-  MOCK_METHOD0(RequestKeyFrame, void());
-};
-
-class MockOnCompleteFrameCallback
-    : public video_coding::OnCompleteFrameCallback {
- public:
-  MockOnCompleteFrameCallback() : buffer_(rtc::ByteBuffer::ORDER_NETWORK) {}
-
-  MOCK_METHOD1(DoOnCompleteFrame, void(video_coding::FrameObject* frame));
-  MOCK_METHOD1(DoOnCompleteFrameFailNullptr,
-               void(video_coding::FrameObject* frame));
-  MOCK_METHOD1(DoOnCompleteFrameFailLength,
-               void(video_coding::FrameObject* frame));
-  MOCK_METHOD1(DoOnCompleteFrameFailBitstream,
-               void(video_coding::FrameObject* frame));
-  void OnCompleteFrame(std::unique_ptr<video_coding::FrameObject> frame) {
-    if (!frame) {
-      DoOnCompleteFrameFailNullptr(nullptr);
-      return;
-    }
-    EXPECT_EQ(buffer_.Length(), frame->size());
-    if (buffer_.Length() != frame->size()) {
-      DoOnCompleteFrameFailLength(frame.get());
-      return;
-    }
-    std::vector<uint8_t> actual_data(frame->size());
-    frame->GetBitstream(actual_data.data());
-    if (memcmp(buffer_.Data(), actual_data.data(), buffer_.Length()) != 0) {
-      DoOnCompleteFrameFailBitstream(frame.get());
-      return;
-    }
-    DoOnCompleteFrame(frame.get());
-  }
-  void AppendExpectedBitstream(const uint8_t data[], size_t size_in_bytes) {
-    // TODO(Johan): Let rtc::ByteBuffer handle uint8_t* instead of char*.
-    buffer_.WriteBytes(reinterpret_cast<const char*>(data), size_in_bytes);
-  }
-  rtc::ByteBufferWriter buffer_;
-};
-
-class MockRtpPacketSink : public RtpPacketSinkInterface {
- public:
-  MOCK_METHOD1(OnRtpPacket, void(const RtpPacketReceived&));
-};
-
-constexpr uint32_t kSsrc = 111;
-constexpr uint16_t kSequenceNumber = 222;
-std::unique_ptr<RtpPacketReceived> CreateRtpPacketReceived(
-    uint32_t ssrc = kSsrc,
-    uint16_t sequence_number = kSequenceNumber) {
-  auto packet = rtc::MakeUnique<RtpPacketReceived>();
-  packet->SetSsrc(ssrc);
-  packet->SetSequenceNumber(sequence_number);
-  return packet;
-}
-
-MATCHER_P(SamePacketAs, other, "") {
-  return arg.Ssrc() == other.Ssrc() &&
-         arg.SequenceNumber() == other.SequenceNumber();
-}
-
-}  // namespace
-
-class RtpVideoStreamReceiverTest : public testing::Test {
- public:
-  RtpVideoStreamReceiverTest()
-      : config_(CreateConfig()),
-        timing_(Clock::GetRealTimeClock()),
-        process_thread_(ProcessThread::Create("TestThread")) {}
-
-  void SetUp() {
-    rtp_receive_statistics_ =
-        rtc::WrapUnique(ReceiveStatistics::Create(Clock::GetRealTimeClock()));
-    rtp_video_stream_receiver_ = rtc::MakeUnique<RtpVideoStreamReceiver>(
-        &mock_transport_, nullptr, &packet_router_, &config_,
-        rtp_receive_statistics_.get(), nullptr, process_thread_.get(),
-        &mock_nack_sender_,
-        &mock_key_frame_request_sender_, &mock_on_complete_frame_callback_,
-        &timing_);
-  }
-
-  WebRtcRTPHeader GetDefaultPacket() {
-    WebRtcRTPHeader packet;
-    memset(&packet, 0, sizeof(packet));
-    packet.type.Video.codec = kRtpVideoH264;
-    return packet;
-  }
-
-  // TODO(Johan): refactor h264_sps_pps_tracker_unittests.cc to avoid duplicate
-  // code.
-  void AddSps(WebRtcRTPHeader* packet,
-              uint8_t sps_id,
-              std::vector<uint8_t>* data) {
-    NaluInfo info;
-    info.type = H264::NaluType::kSps;
-    info.sps_id = sps_id;
-    info.pps_id = -1;
-    data->push_back(H264::NaluType::kSps);
-    data->push_back(sps_id);
-    packet->type.Video.codecHeader.H264
-        .nalus[packet->type.Video.codecHeader.H264.nalus_length++] = info;
-  }
-
-  void AddPps(WebRtcRTPHeader* packet,
-              uint8_t sps_id,
-              uint8_t pps_id,
-              std::vector<uint8_t>* data) {
-    NaluInfo info;
-    info.type = H264::NaluType::kPps;
-    info.sps_id = sps_id;
-    info.pps_id = pps_id;
-    data->push_back(H264::NaluType::kPps);
-    data->push_back(pps_id);
-    packet->type.Video.codecHeader.H264
-        .nalus[packet->type.Video.codecHeader.H264.nalus_length++] = info;
-  }
-
-  void AddIdr(WebRtcRTPHeader* packet, int pps_id) {
-    NaluInfo info;
-    info.type = H264::NaluType::kIdr;
-    info.sps_id = -1;
-    info.pps_id = pps_id;
-    packet->type.Video.codecHeader.H264
-        .nalus[packet->type.Video.codecHeader.H264.nalus_length++] = info;
-  }
-
- protected:
-  static VideoReceiveStream::Config CreateConfig() {
-    VideoReceiveStream::Config config(nullptr);
-    config.rtp.remote_ssrc = 1111;
-    config.rtp.local_ssrc = 2222;
-    return config;
-  }
-
-  webrtc::test::ScopedFieldTrials override_field_trials_{
-      kNewJitterBufferFieldTrialEnabled};
-  VideoReceiveStream::Config config_;
-  MockNackSender mock_nack_sender_;
-  MockKeyFrameRequestSender mock_key_frame_request_sender_;
-  MockTransport mock_transport_;
-  MockOnCompleteFrameCallback mock_on_complete_frame_callback_;
-  PacketRouter packet_router_;
-  VCMTiming timing_;
-  std::unique_ptr<ProcessThread> process_thread_;
-  std::unique_ptr<ReceiveStatistics> rtp_receive_statistics_;
-  std::unique_ptr<RtpVideoStreamReceiver> rtp_video_stream_receiver_;
-};
-
-TEST_F(RtpVideoStreamReceiverTest, GenericKeyFrame) {
-  WebRtcRTPHeader rtp_header;
-  const std::vector<uint8_t> data({1, 2, 3, 4});
-  memset(&rtp_header, 0, sizeof(rtp_header));
-  rtp_header.header.sequenceNumber = 1;
-  rtp_header.header.markerBit = 1;
-  rtp_header.type.Video.is_first_packet_in_frame = true;
-  rtp_header.frameType = kVideoFrameKey;
-  rtp_header.type.Video.codec = kRtpVideoGeneric;
-  mock_on_complete_frame_callback_.AppendExpectedBitstream(data.data(),
-                                                           data.size());
-  EXPECT_CALL(mock_on_complete_frame_callback_, DoOnCompleteFrame(_));
-  rtp_video_stream_receiver_->OnReceivedPayloadData(data.data(), data.size(),
-                                                    &rtp_header);
-}
-
-TEST_F(RtpVideoStreamReceiverTest, GenericKeyFrameBitstreamError) {
-  WebRtcRTPHeader rtp_header;
-  const std::vector<uint8_t> data({1, 2, 3, 4});
-  memset(&rtp_header, 0, sizeof(rtp_header));
-  rtp_header.header.sequenceNumber = 1;
-  rtp_header.header.markerBit = 1;
-  rtp_header.type.Video.is_first_packet_in_frame = true;
-  rtp_header.frameType = kVideoFrameKey;
-  rtp_header.type.Video.codec = kRtpVideoGeneric;
-  constexpr uint8_t expected_bitsteam[] = {1, 2, 3, 0xff};
-  mock_on_complete_frame_callback_.AppendExpectedBitstream(
-      expected_bitsteam, sizeof(expected_bitsteam));
-  EXPECT_CALL(mock_on_complete_frame_callback_,
-              DoOnCompleteFrameFailBitstream(_));
-  rtp_video_stream_receiver_->OnReceivedPayloadData(data.data(), data.size(),
-                                                    &rtp_header);
-}
-
-TEST_F(RtpVideoStreamReceiverTest, InBandSpsPps) {
-  std::vector<uint8_t> sps_data;
-  WebRtcRTPHeader sps_packet = GetDefaultPacket();
-  AddSps(&sps_packet, 0, &sps_data);
-  sps_packet.header.sequenceNumber = 0;
-  sps_packet.type.Video.is_first_packet_in_frame = true;
-  mock_on_complete_frame_callback_.AppendExpectedBitstream(
-      kH264StartCode, sizeof(kH264StartCode));
-  mock_on_complete_frame_callback_.AppendExpectedBitstream(sps_data.data(),
-                                                           sps_data.size());
-  rtp_video_stream_receiver_->OnReceivedPayloadData(
-      sps_data.data(), sps_data.size(), &sps_packet);
-
-  std::vector<uint8_t> pps_data;
-  WebRtcRTPHeader pps_packet = GetDefaultPacket();
-  AddPps(&pps_packet, 0, 1, &pps_data);
-  pps_packet.header.sequenceNumber = 1;
-  pps_packet.type.Video.is_first_packet_in_frame = true;
-  mock_on_complete_frame_callback_.AppendExpectedBitstream(
-      kH264StartCode, sizeof(kH264StartCode));
-  mock_on_complete_frame_callback_.AppendExpectedBitstream(pps_data.data(),
-                                                           pps_data.size());
-  rtp_video_stream_receiver_->OnReceivedPayloadData(
-      pps_data.data(), pps_data.size(), &pps_packet);
-
-  std::vector<uint8_t> idr_data;
-  WebRtcRTPHeader idr_packet = GetDefaultPacket();
-  AddIdr(&idr_packet, 1);
-  idr_packet.type.Video.is_first_packet_in_frame = true;
-  idr_packet.header.sequenceNumber = 2;
-  idr_packet.header.markerBit = 1;
-  idr_packet.frameType = kVideoFrameKey;
-  idr_data.insert(idr_data.end(), {0x65, 1, 2, 3});
-  mock_on_complete_frame_callback_.AppendExpectedBitstream(
-      kH264StartCode, sizeof(kH264StartCode));
-  mock_on_complete_frame_callback_.AppendExpectedBitstream(idr_data.data(),
-                                                           idr_data.size());
-  EXPECT_CALL(mock_on_complete_frame_callback_, DoOnCompleteFrame(_));
-  rtp_video_stream_receiver_->OnReceivedPayloadData(
-      idr_data.data(), idr_data.size(), &idr_packet);
-}
-
-TEST_F(RtpVideoStreamReceiverTest, OutOfBandFmtpSpsPps) {
-  constexpr int kPayloadType = 99;
-  VideoCodec codec;
-  codec.plType = kPayloadType;
-  std::map<std::string, std::string> codec_params;
-  // Example parameter sets from https://tools.ietf.org/html/rfc3984#section-8.2
-  // .
-  codec_params.insert(
-      {cricket::kH264FmtpSpropParameterSets, "Z0IACpZTBYmI,aMljiA=="});
-  rtp_video_stream_receiver_->AddReceiveCodec(codec, codec_params);
-  const uint8_t binary_sps[] = {0x67, 0x42, 0x00, 0x0a, 0x96,
-                                0x53, 0x05, 0x89, 0x88};
-  mock_on_complete_frame_callback_.AppendExpectedBitstream(
-      kH264StartCode, sizeof(kH264StartCode));
-  mock_on_complete_frame_callback_.AppendExpectedBitstream(binary_sps,
-                                                           sizeof(binary_sps));
-  const uint8_t binary_pps[] = {0x68, 0xc9, 0x63, 0x88};
-  mock_on_complete_frame_callback_.AppendExpectedBitstream(
-      kH264StartCode, sizeof(kH264StartCode));
-  mock_on_complete_frame_callback_.AppendExpectedBitstream(binary_pps,
-                                                           sizeof(binary_pps));
-
-  std::vector<uint8_t> data;
-  WebRtcRTPHeader idr_packet = GetDefaultPacket();
-  AddIdr(&idr_packet, 0);
-  idr_packet.header.payloadType = kPayloadType;
-  idr_packet.type.Video.is_first_packet_in_frame = true;
-  idr_packet.header.sequenceNumber = 2;
-  idr_packet.header.markerBit = 1;
-  idr_packet.type.Video.is_first_packet_in_frame = true;
-  idr_packet.frameType = kVideoFrameKey;
-  idr_packet.type.Video.codec = kRtpVideoH264;
-  data.insert(data.end(), {1, 2, 3});
-  mock_on_complete_frame_callback_.AppendExpectedBitstream(
-      kH264StartCode, sizeof(kH264StartCode));
-  mock_on_complete_frame_callback_.AppendExpectedBitstream(data.data(),
-                                                           data.size());
-  EXPECT_CALL(mock_on_complete_frame_callback_, DoOnCompleteFrame(_));
-  rtp_video_stream_receiver_->OnReceivedPayloadData(data.data(), data.size(),
-                                                    &idr_packet);
-}
-
-TEST_F(RtpVideoStreamReceiverTest, PaddingInMediaStream) {
-  WebRtcRTPHeader header = GetDefaultPacket();
-  std::vector<uint8_t> data;
-  data.insert(data.end(), {1, 2, 3});
-  header.header.payloadType = 99;
-  header.type.Video.is_first_packet_in_frame = true;
-  header.header.sequenceNumber = 2;
-  header.header.markerBit = true;
-  header.frameType = kVideoFrameKey;
-  header.type.Video.codec = kRtpVideoGeneric;
-  mock_on_complete_frame_callback_.AppendExpectedBitstream(data.data(),
-                                                           data.size());
-
-  EXPECT_CALL(mock_on_complete_frame_callback_, DoOnCompleteFrame(_));
-  rtp_video_stream_receiver_->OnReceivedPayloadData(data.data(), data.size(),
-                                                    &header);
-
-  header.header.sequenceNumber = 3;
-  rtp_video_stream_receiver_->OnReceivedPayloadData(nullptr, 0, &header);
-
-  header.frameType = kVideoFrameDelta;
-  header.header.sequenceNumber = 4;
-  EXPECT_CALL(mock_on_complete_frame_callback_, DoOnCompleteFrame(_));
-  rtp_video_stream_receiver_->OnReceivedPayloadData(data.data(), data.size(),
-                                                    &header);
-
-  header.header.sequenceNumber = 6;
-  rtp_video_stream_receiver_->OnReceivedPayloadData(data.data(), data.size(),
-                                                    &header);
-
-  EXPECT_CALL(mock_on_complete_frame_callback_, DoOnCompleteFrame(_));
-  header.header.sequenceNumber = 5;
-  rtp_video_stream_receiver_->OnReceivedPayloadData(nullptr, 0, &header);
-}
-
-TEST_F(RtpVideoStreamReceiverTest, RequestKeyframeIfFirstFrameIsDelta) {
-  WebRtcRTPHeader rtp_header;
-  const std::vector<uint8_t> data({1, 2, 3, 4});
-  memset(&rtp_header, 0, sizeof(rtp_header));
-  rtp_header.header.sequenceNumber = 1;
-  rtp_header.header.markerBit = 1;
-  rtp_header.type.Video.is_first_packet_in_frame = true;
-  rtp_header.frameType = kVideoFrameDelta;
-  rtp_header.type.Video.codec = kRtpVideoGeneric;
-
-  EXPECT_CALL(mock_key_frame_request_sender_, RequestKeyFrame());
-  rtp_video_stream_receiver_->OnReceivedPayloadData(data.data(), data.size(),
-                                                    &rtp_header);
-}
-
-TEST_F(RtpVideoStreamReceiverTest, SecondarySinksGetRtpNotifications) {
-  rtp_video_stream_receiver_->StartReceive();
-
-  MockRtpPacketSink secondary_sink_1;
-  MockRtpPacketSink secondary_sink_2;
-
-  rtp_video_stream_receiver_->AddSecondarySink(&secondary_sink_1);
-  rtp_video_stream_receiver_->AddSecondarySink(&secondary_sink_2);
-
-  auto rtp_packet = CreateRtpPacketReceived();
-  EXPECT_CALL(secondary_sink_1, OnRtpPacket(SamePacketAs(*rtp_packet)));
-  EXPECT_CALL(secondary_sink_2, OnRtpPacket(SamePacketAs(*rtp_packet)));
-
-  rtp_video_stream_receiver_->OnRtpPacket(*rtp_packet);
-
-  // Test tear-down.
-  rtp_video_stream_receiver_->StopReceive();
-  rtp_video_stream_receiver_->RemoveSecondarySink(&secondary_sink_1);
-  rtp_video_stream_receiver_->RemoveSecondarySink(&secondary_sink_2);
-}
-
-TEST_F(RtpVideoStreamReceiverTest, RemovedSecondarySinksGetNoRtpNotifications) {
-  rtp_video_stream_receiver_->StartReceive();
-
-  MockRtpPacketSink secondary_sink;
-
-  rtp_video_stream_receiver_->AddSecondarySink(&secondary_sink);
-  rtp_video_stream_receiver_->RemoveSecondarySink(&secondary_sink);
-
-  auto rtp_packet = CreateRtpPacketReceived();
-
-  EXPECT_CALL(secondary_sink, OnRtpPacket(_)).Times(0);
-
-  rtp_video_stream_receiver_->OnRtpPacket(*rtp_packet);
-
-  // Test tear-down.
-  rtp_video_stream_receiver_->StopReceive();
-}
-
-TEST_F(RtpVideoStreamReceiverTest,
-       OnlyRemovedSecondarySinksExcludedFromNotifications) {
-  rtp_video_stream_receiver_->StartReceive();
-
-  MockRtpPacketSink kept_secondary_sink;
-  MockRtpPacketSink removed_secondary_sink;
-
-  rtp_video_stream_receiver_->AddSecondarySink(&kept_secondary_sink);
-  rtp_video_stream_receiver_->AddSecondarySink(&removed_secondary_sink);
-  rtp_video_stream_receiver_->RemoveSecondarySink(&removed_secondary_sink);
-
-  auto rtp_packet = CreateRtpPacketReceived();
-  EXPECT_CALL(kept_secondary_sink, OnRtpPacket(SamePacketAs(*rtp_packet)));
-
-  rtp_video_stream_receiver_->OnRtpPacket(*rtp_packet);
-
-  // Test tear-down.
-  rtp_video_stream_receiver_->StopReceive();
-  rtp_video_stream_receiver_->RemoveSecondarySink(&kept_secondary_sink);
-}
-
-TEST_F(RtpVideoStreamReceiverTest,
-       SecondariesOfNonStartedStreamGetNoNotifications) {
-  // Explicitly showing that the stream is not in the |started| state,
-  // regardless of whether streams start out |started| or |stopped|.
-  rtp_video_stream_receiver_->StopReceive();
-
-  MockRtpPacketSink secondary_sink;
-  rtp_video_stream_receiver_->AddSecondarySink(&secondary_sink);
-
-  auto rtp_packet = CreateRtpPacketReceived();
-  EXPECT_CALL(secondary_sink, OnRtpPacket(_)).Times(0);
-
-  rtp_video_stream_receiver_->OnRtpPacket(*rtp_packet);
-
-  // Test tear-down.
-  rtp_video_stream_receiver_->RemoveSecondarySink(&secondary_sink);
-}
-
-#if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
-TEST_F(RtpVideoStreamReceiverTest, RepeatedSecondarySinkDisallowed) {
-  MockRtpPacketSink secondary_sink;
-
-  rtp_video_stream_receiver_->AddSecondarySink(&secondary_sink);
-  EXPECT_DEATH(rtp_video_stream_receiver_->AddSecondarySink(&secondary_sink),
-               "");
-
-  // Test tear-down.
-  rtp_video_stream_receiver_->RemoveSecondarySink(&secondary_sink);
-}
-#endif
-
-}  // namespace webrtc
diff --git a/video/screenshare_loopback.cc b/video/screenshare_loopback.cc
deleted file mode 100644
index 17fd8de..0000000
--- a/video/screenshare_loopback.cc
+++ /dev/null
@@ -1,336 +0,0 @@
-/*
- *  Copyright (c) 2015 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 <stdio.h>
-
-#include "webrtc/rtc_base/flags.h"
-#include "webrtc/rtc_base/stringencode.h"
-#include "webrtc/test/field_trial.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/run_test.h"
-#include "webrtc/video/video_quality_test.h"
-
-namespace webrtc {
-namespace flags {
-
-// Flags common with video loopback, with different default values.
-DEFINE_int(width, 1850, "Video width (crops source).");
-size_t Width() {
-  return static_cast<size_t>(FLAG_width);
-}
-
-DEFINE_int(height, 1110, "Video height (crops source).");
-size_t Height() {
-  return static_cast<size_t>(FLAG_height);
-}
-
-DEFINE_int(fps, 5, "Frames per second.");
-int Fps() {
-  return static_cast<int>(FLAG_fps);
-}
-
-DEFINE_int(min_bitrate, 50, "Call and stream min bitrate in kbps.");
-int MinBitrateKbps() {
-  return static_cast<int>(FLAG_min_bitrate);
-}
-
-DEFINE_int(start_bitrate,
-           Call::Config::kDefaultStartBitrateBps / 1000,
-           "Call start bitrate in kbps.");
-int StartBitrateKbps() {
-  return static_cast<int>(FLAG_start_bitrate);
-}
-
-DEFINE_int(target_bitrate, 200, "Stream target bitrate in kbps.");
-int TargetBitrateKbps() {
-  return static_cast<int>(FLAG_target_bitrate);
-}
-
-DEFINE_int(max_bitrate, 2000, "Call and stream max bitrate in kbps.");
-int MaxBitrateKbps() {
-  return static_cast<int>(FLAG_max_bitrate);
-}
-
-DEFINE_int(num_temporal_layers, 2, "Number of temporal layers to use.");
-int NumTemporalLayers() {
-  return static_cast<int>(FLAG_num_temporal_layers);
-}
-
-// Flags common with video loopback, with equal default values.
-DEFINE_string(codec, "VP8", "Video codec to use.");
-std::string Codec() {
-  return static_cast<std::string>(FLAG_codec);
-}
-
-DEFINE_string(rtc_event_log_name, "", "Filename for rtc event log.");
-std::string RtcEventLogName() {
-  return static_cast<std::string>(FLAG_rtc_event_log_name);
-}
-
-DEFINE_string(rtp_dump_name, "", "Filename for dumped received RTP stream.");
-std::string RtpDumpName() {
-  return static_cast<std::string>(FLAG_rtp_dump_name);
-}
-
-DEFINE_int(selected_tl,
-           -1,
-           "Temporal layer to show or analyze. -1 to disable filtering.");
-int SelectedTL() {
-  return static_cast<int>(FLAG_selected_tl);
-}
-
-DEFINE_int(
-    duration,
-    0,
-    "Duration of the test in seconds. If 0, rendered will be shown instead.");
-int DurationSecs() {
-  return static_cast<int>(FLAG_duration);
-}
-
-DEFINE_string(output_filename, "", "Target graph data filename.");
-std::string OutputFilename() {
-  return static_cast<std::string>(FLAG_output_filename);
-}
-
-DEFINE_string(graph_title,
-              "",
-              "If empty, title will be generated automatically.");
-std::string GraphTitle() {
-  return static_cast<std::string>(FLAG_graph_title);
-}
-
-DEFINE_int(loss_percent, 0, "Percentage of packets randomly lost.");
-int LossPercent() {
-  return static_cast<int>(FLAG_loss_percent);
-}
-
-DEFINE_int(link_capacity,
-           0,
-           "Capacity (kbps) of the fake link. 0 means infinite.");
-int LinkCapacityKbps() {
-  return static_cast<int>(FLAG_link_capacity);
-}
-
-DEFINE_int(queue_size, 0, "Size of the bottleneck link queue in packets.");
-int QueueSize() {
-  return static_cast<int>(FLAG_queue_size);
-}
-
-DEFINE_int(avg_propagation_delay_ms,
-           0,
-           "Average link propagation delay in ms.");
-int AvgPropagationDelayMs() {
-  return static_cast<int>(FLAG_avg_propagation_delay_ms);
-}
-
-DEFINE_int(std_propagation_delay_ms,
-           0,
-           "Link propagation delay standard deviation in ms.");
-int StdPropagationDelayMs() {
-  return static_cast<int>(FLAG_std_propagation_delay_ms);
-}
-
-DEFINE_int(num_streams, 0, "Number of streams to show or analyze.");
-int NumStreams() {
-  return static_cast<int>(FLAG_num_streams);
-}
-
-DEFINE_int(selected_stream,
-           0,
-           "ID of the stream to show or analyze. "
-           "Set to the number of streams to show them all.");
-int SelectedStream() {
-  return static_cast<int>(FLAG_selected_stream);
-}
-
-DEFINE_int(num_spatial_layers, 1, "Number of spatial layers to use.");
-int NumSpatialLayers() {
-  return static_cast<int>(FLAG_num_spatial_layers);
-}
-
-DEFINE_int(selected_sl,
-           -1,
-           "Spatial layer to show or analyze. -1 to disable filtering.");
-int SelectedSL() {
-  return static_cast<int>(FLAG_selected_sl);
-}
-
-DEFINE_string(stream0,
-              "",
-              "Comma separated values describing VideoStream for stream #0.");
-std::string Stream0() {
-  return static_cast<std::string>(FLAG_stream0);
-}
-
-DEFINE_string(stream1,
-              "",
-              "Comma separated values describing VideoStream for stream #1.");
-std::string Stream1() {
-  return static_cast<std::string>(FLAG_stream1);
-}
-
-DEFINE_string(sl0,
-              "",
-              "Comma separated values describing SpatialLayer for layer #0.");
-std::string SL0() {
-  return static_cast<std::string>(FLAG_sl0);
-}
-
-DEFINE_string(sl1,
-              "",
-              "Comma separated values describing SpatialLayer for layer #1.");
-std::string SL1() {
-  return static_cast<std::string>(FLAG_sl1);
-}
-
-DEFINE_string(encoded_frame_path,
-              "",
-              "The base path for encoded frame logs. Created files will have "
-              "the form <encoded_frame_path>.<n>.(recv|send.<m>).ivf");
-std::string EncodedFramePath() {
-  return static_cast<std::string>(FLAG_encoded_frame_path);
-}
-
-DEFINE_bool(logs, false, "print logs to stderr");
-
-DEFINE_bool(send_side_bwe, true, "Use send-side bandwidth estimation");
-
-DEFINE_bool(allow_reordering, false, "Allow packet reordering to occur");
-
-DEFINE_string(
-    force_fieldtrials,
-    "",
-    "Field trials control experimental feature code which can be forced. "
-    "E.g. running with --force_fieldtrials=WebRTC-FooFeature/Enable/"
-    " will assign the group Enable to field trial WebRTC-FooFeature. Multiple "
-    "trials are separated by \"/\"");
-
-// Screenshare-specific flags.
-DEFINE_int(min_transmit_bitrate, 400, "Min transmit bitrate incl. padding.");
-int MinTransmitBitrateKbps() {
-  return FLAG_min_transmit_bitrate;
-}
-
-DEFINE_bool(generate_slides,
-           false,
-           "Whether to use randomly generated slides or read them from files.");
-bool GenerateSlides() {
-  return static_cast<int>(FLAG_generate_slides);
-}
-
-DEFINE_int(slide_change_interval,
-           10,
-           "Interval (in seconds) between simulated slide changes.");
-int SlideChangeInterval() {
-  return static_cast<int>(FLAG_slide_change_interval);
-}
-
-DEFINE_int(
-    scroll_duration,
-    0,
-    "Duration (in seconds) during which a slide will be scrolled into place.");
-int ScrollDuration() {
-  return static_cast<int>(FLAG_scroll_duration);
-}
-
-DEFINE_string(slides,
-              "",
-              "Comma-separated list of *.yuv files to display as slides.");
-std::vector<std::string> Slides() {
-  std::vector<std::string> slides;
-  std::string slides_list = FLAG_slides;
-  rtc::tokenize(slides_list, ',', &slides);
-  return slides;
-}
-
-DEFINE_bool(help, false, "prints this message");
-
-}  // namespace flags
-
-void Loopback() {
-  FakeNetworkPipe::Config pipe_config;
-  pipe_config.loss_percent = flags::LossPercent();
-  pipe_config.link_capacity_kbps = flags::LinkCapacityKbps();
-  pipe_config.queue_length_packets = flags::QueueSize();
-  pipe_config.queue_delay_ms = flags::AvgPropagationDelayMs();
-  pipe_config.delay_standard_deviation_ms = flags::StdPropagationDelayMs();
-  pipe_config.allow_reordering = flags::FLAG_allow_reordering;
-
-  Call::Config::BitrateConfig call_bitrate_config;
-  call_bitrate_config.min_bitrate_bps = flags::MinBitrateKbps() * 1000;
-  call_bitrate_config.start_bitrate_bps = flags::StartBitrateKbps() * 1000;
-  call_bitrate_config.max_bitrate_bps = flags::MaxBitrateKbps() * 1000;
-
-  VideoQualityTest::Params params;
-  params.call = {flags::FLAG_send_side_bwe, call_bitrate_config};
-  params.video = {true,
-                  flags::Width(),
-                  flags::Height(),
-                  flags::Fps(),
-                  flags::MinBitrateKbps() * 1000,
-                  flags::TargetBitrateKbps() * 1000,
-                  flags::MaxBitrateKbps() * 1000,
-                  false,
-                  flags::Codec(),
-                  flags::NumTemporalLayers(),
-                  flags::SelectedTL(),
-                  flags::MinTransmitBitrateKbps() * 1000,
-                  false,  // ULPFEC disabled.
-                  false,  // FlexFEC disabled.
-                  ""};
-  params.screenshare = {true, flags::GenerateSlides(),
-                        flags::SlideChangeInterval(),
-                        flags::ScrollDuration(), flags::Slides()};
-  params.analyzer = {"screenshare", 0.0, 0.0, flags::DurationSecs(),
-      flags::OutputFilename(), flags::GraphTitle()};
-  params.pipe = pipe_config;
-  params.logging = {flags::FLAG_logs, flags::RtcEventLogName(),
-                    flags::RtpDumpName(), flags::EncodedFramePath()};
-
-  if (flags::NumStreams() > 1 && flags::Stream0().empty() &&
-      flags::Stream1().empty()) {
-    params.ss.infer_streams = true;
-  }
-
-  std::vector<std::string> stream_descriptors;
-  stream_descriptors.push_back(flags::Stream0());
-  stream_descriptors.push_back(flags::Stream1());
-  std::vector<std::string> SL_descriptors;
-  SL_descriptors.push_back(flags::SL0());
-  SL_descriptors.push_back(flags::SL1());
-  VideoQualityTest::FillScalabilitySettings(
-      &params, stream_descriptors, flags::NumStreams(), flags::SelectedStream(),
-      flags::NumSpatialLayers(), flags::SelectedSL(), SL_descriptors);
-
-  VideoQualityTest test;
-  if (flags::DurationSecs()) {
-    test.RunWithAnalyzer(params);
-  } else {
-    test.RunWithRenderers(params);
-  }
-}
-}  // namespace webrtc
-
-int main(int argc, char* argv[]) {
-  ::testing::InitGoogleTest(&argc, argv);
-  rtc::FlagList::SetFlagsFromCommandLine(&argc, argv, true);
-  if (webrtc::flags::FLAG_help) {
-    rtc::FlagList::Print(nullptr, false);
-    return 0;
-  }
-
-  // InitFieldTrialsFromString needs a reference to an std::string instance,
-  // with a scope that outlives the test.
-  std::string field_trials = webrtc::flags::FLAG_force_fieldtrials;
-  webrtc::test::InitFieldTrialsFromString(field_trials);
-
-  webrtc::test::RunTest(webrtc::Loopback);
-  return 0;
-}
diff --git a/video/send_delay_stats.cc b/video/send_delay_stats.cc
deleted file mode 100644
index b7c6658..0000000
--- a/video/send_delay_stats.cc
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- *  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/video/send_delay_stats.h"
-
-#include <utility>
-
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/system_wrappers/include/metrics.h"
-
-namespace webrtc {
-namespace {
-// Packet with a larger delay are removed and excluded from the delay stats.
-// Set to larger than max histogram delay which is 10000.
-const int64_t kMaxSentPacketDelayMs = 11000;
-const size_t kMaxPacketMapSize = 2000;
-
-// Limit for the maximum number of streams to calculate stats for.
-const size_t kMaxSsrcMapSize = 50;
-const int kMinRequiredPeriodicSamples = 5;
-}  // namespace
-
-SendDelayStats::SendDelayStats(Clock* clock)
-    : clock_(clock), num_old_packets_(0), num_skipped_packets_(0) {}
-
-SendDelayStats::~SendDelayStats() {
-  if (num_old_packets_ > 0 || num_skipped_packets_ > 0) {
-    LOG(LS_WARNING) << "Delay stats: number of old packets " << num_old_packets_
-                    << ", skipped packets " << num_skipped_packets_
-                    << ". Number of streams " << send_delay_counters_.size();
-  }
-  UpdateHistograms();
-}
-
-void SendDelayStats::UpdateHistograms() {
-  rtc::CritScope lock(&crit_);
-  for (const auto& it : send_delay_counters_) {
-    AggregatedStats stats = it.second->GetStats();
-    if (stats.num_samples >= kMinRequiredPeriodicSamples) {
-      RTC_HISTOGRAM_COUNTS_10000("WebRTC.Video.SendDelayInMs", stats.average);
-      LOG(LS_INFO) << "WebRTC.Video.SendDelayInMs, " << stats.ToString();
-    }
-  }
-}
-
-void SendDelayStats::AddSsrcs(const VideoSendStream::Config& config) {
-  rtc::CritScope lock(&crit_);
-  if (ssrcs_.size() > kMaxSsrcMapSize)
-    return;
-  for (const auto& ssrc : config.rtp.ssrcs)
-    ssrcs_.insert(ssrc);
-}
-
-AvgCounter* SendDelayStats::GetSendDelayCounter(uint32_t ssrc) {
-  const auto& it = send_delay_counters_.find(ssrc);
-  if (it != send_delay_counters_.end())
-    return it->second.get();
-
-  AvgCounter* counter = new AvgCounter(clock_, nullptr, false);
-  send_delay_counters_[ssrc].reset(counter);
-  return counter;
-}
-
-void SendDelayStats::OnSendPacket(uint16_t packet_id,
-                                  int64_t capture_time_ms,
-                                  uint32_t ssrc) {
-  // Packet sent to transport.
-  rtc::CritScope lock(&crit_);
-  if (ssrcs_.find(ssrc) == ssrcs_.end())
-    return;
-
-  int64_t now = clock_->TimeInMilliseconds();
-  RemoveOld(now, &packets_);
-
-  if (packets_.size() > kMaxPacketMapSize) {
-    ++num_skipped_packets_;
-    return;
-  }
-  packets_.insert(
-      std::make_pair(packet_id, Packet(ssrc, capture_time_ms, now)));
-}
-
-bool SendDelayStats::OnSentPacket(int packet_id, int64_t time_ms) {
-  // Packet leaving socket.
-  if (packet_id == -1)
-    return false;
-
-  rtc::CritScope lock(&crit_);
-  auto it = packets_.find(packet_id);
-  if (it == packets_.end())
-    return false;
-
-  // TODO(asapersson): Remove SendSideDelayUpdated(), use capture -> sent.
-  // Elapsed time from send (to transport) -> sent (leaving socket).
-  int diff_ms = time_ms - it->second.send_time_ms;
-  GetSendDelayCounter(it->second.ssrc)->Add(diff_ms);
-  packets_.erase(it);
-  return true;
-}
-
-void SendDelayStats::RemoveOld(int64_t now, PacketMap* packets) {
-  while (!packets->empty()) {
-    auto it = packets->begin();
-    if (now - it->second.capture_time_ms < kMaxSentPacketDelayMs)
-      break;
-
-    packets->erase(it);
-    ++num_old_packets_;
-  }
-}
-
-}  // namespace webrtc
diff --git a/video/send_delay_stats.h b/video/send_delay_stats.h
deleted file mode 100644
index 230fa9d..0000000
--- a/video/send_delay_stats.h
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- *  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_VIDEO_SEND_DELAY_STATS_H_
-#define WEBRTC_VIDEO_SEND_DELAY_STATS_H_
-
-#include <map>
-#include <memory>
-#include <set>
-
-#include "webrtc/common_types.h"
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/thread_annotations.h"
-#include "webrtc/system_wrappers/include/clock.h"
-#include "webrtc/video/stats_counter.h"
-#include "webrtc/call/video_send_stream.h"
-
-namespace webrtc {
-
-class SendDelayStats : public SendPacketObserver {
- public:
-  explicit SendDelayStats(Clock* clock);
-  virtual ~SendDelayStats();
-
-  // Adds the configured ssrcs for the rtp streams.
-  // Stats will be calculated for these streams.
-  void AddSsrcs(const VideoSendStream::Config& config);
-
-  // Called when a packet is sent (leaving socket).
-  bool OnSentPacket(int packet_id, int64_t time_ms);
-
- protected:
-  // From SendPacketObserver.
-  // Called when a packet is sent to the transport.
-  void OnSendPacket(uint16_t packet_id,
-                    int64_t capture_time_ms,
-                    uint32_t ssrc) override;
-
- private:
-  // Map holding sent packets (mapped by sequence number).
-  struct SequenceNumberOlderThan {
-    bool operator()(uint16_t seq1, uint16_t seq2) const {
-      return IsNewerSequenceNumber(seq2, seq1);
-    }
-  };
-  struct Packet {
-    Packet(uint32_t ssrc, int64_t capture_time_ms, int64_t send_time_ms)
-        : ssrc(ssrc),
-          capture_time_ms(capture_time_ms),
-          send_time_ms(send_time_ms) {}
-    uint32_t ssrc;
-    int64_t capture_time_ms;
-    int64_t send_time_ms;
-  };
-  typedef std::map<uint16_t, Packet, SequenceNumberOlderThan> PacketMap;
-
-  void UpdateHistograms();
-  void RemoveOld(int64_t now, PacketMap* packets)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_);
-  AvgCounter* GetSendDelayCounter(uint32_t ssrc)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_);
-
-  Clock* const clock_;
-  rtc::CriticalSection crit_;
-
-  PacketMap packets_ RTC_GUARDED_BY(crit_);
-  size_t num_old_packets_ RTC_GUARDED_BY(crit_);
-  size_t num_skipped_packets_ RTC_GUARDED_BY(crit_);
-
-  std::set<uint32_t> ssrcs_ RTC_GUARDED_BY(crit_);
-
-  // Mapped by SSRC.
-  std::map<uint32_t, std::unique_ptr<AvgCounter>> send_delay_counters_
-      RTC_GUARDED_BY(crit_);
-};
-
-}  // namespace webrtc
-#endif  // WEBRTC_VIDEO_SEND_DELAY_STATS_H_
diff --git a/video/send_delay_stats_unittest.cc b/video/send_delay_stats_unittest.cc
deleted file mode 100644
index 0644ad2..0000000
--- a/video/send_delay_stats_unittest.cc
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- *  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/video/send_delay_stats.h"
-
-#include "webrtc/system_wrappers/include/metrics.h"
-#include "webrtc/system_wrappers/include/metrics_default.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-namespace {
-const uint32_t kSsrc1 = 17;
-const uint32_t kSsrc2 = 42;
-const uint32_t kRtxSsrc1 = 18;
-const uint32_t kRtxSsrc2 = 43;
-const uint16_t kPacketId = 2345;
-const int64_t kMaxPacketDelayMs = 11000;
-const int kMinRequiredPeriodicSamples = 5;
-const int kProcessIntervalMs = 2000;
-}  // namespace
-
-class SendDelayStatsTest : public ::testing::Test {
- public:
-  SendDelayStatsTest() : clock_(1234), config_(CreateConfig()) {}
-  virtual ~SendDelayStatsTest() {}
-
- protected:
-  virtual void SetUp() {
-    stats_.reset(new SendDelayStats(&clock_));
-    stats_->AddSsrcs(config_);
-  }
-
-  VideoSendStream::Config CreateConfig() {
-    VideoSendStream::Config config(nullptr);
-    config.rtp.ssrcs.push_back(kSsrc1);
-    config.rtp.ssrcs.push_back(kSsrc2);
-    config.rtp.rtx.ssrcs.push_back(kRtxSsrc1);
-    config.rtp.rtx.ssrcs.push_back(kRtxSsrc2);
-    return config;
-  }
-
-  void OnSendPacket(uint16_t id, uint32_t ssrc) {
-    OnSendPacket(id, ssrc, clock_.TimeInMilliseconds());
-  }
-
-  void OnSendPacket(uint16_t id, uint32_t ssrc, int64_t capture_ms) {
-    SendPacketObserver* observer = stats_.get();
-    observer->OnSendPacket(id, capture_ms, ssrc);
-  }
-
-  bool OnSentPacket(uint16_t id) {
-    return stats_->OnSentPacket(id, clock_.TimeInMilliseconds());
-  }
-
-  SimulatedClock clock_;
-  VideoSendStream::Config config_;
-  std::unique_ptr<SendDelayStats> stats_;
-};
-
-TEST_F(SendDelayStatsTest, SentPacketFound) {
-  EXPECT_FALSE(OnSentPacket(kPacketId));
-  OnSendPacket(kPacketId, kSsrc1);
-  EXPECT_TRUE(OnSentPacket(kPacketId));   // Packet found.
-  EXPECT_FALSE(OnSentPacket(kPacketId));  // Packet removed when found.
-}
-
-TEST_F(SendDelayStatsTest, SentPacketNotFoundForNonRegisteredSsrc) {
-  OnSendPacket(kPacketId, kSsrc1);
-  EXPECT_TRUE(OnSentPacket(kPacketId));
-  OnSendPacket(kPacketId + 1, kSsrc2);
-  EXPECT_TRUE(OnSentPacket(kPacketId + 1));
-  OnSendPacket(kPacketId + 2, kRtxSsrc1);  // RTX SSRC not registered.
-  EXPECT_FALSE(OnSentPacket(kPacketId + 2));
-}
-
-TEST_F(SendDelayStatsTest, SentPacketFoundWithMaxSendDelay) {
-  OnSendPacket(kPacketId, kSsrc1);
-  clock_.AdvanceTimeMilliseconds(kMaxPacketDelayMs - 1);
-  OnSendPacket(kPacketId + 1, kSsrc1);       // kPacketId -> not old/removed.
-  EXPECT_TRUE(OnSentPacket(kPacketId));      // Packet found.
-  EXPECT_TRUE(OnSentPacket(kPacketId + 1));  // Packet found.
-}
-
-TEST_F(SendDelayStatsTest, OldPacketsRemoved) {
-  const int64_t kCaptureTimeMs = clock_.TimeInMilliseconds();
-  OnSendPacket(0xffffu, kSsrc1, kCaptureTimeMs);
-  OnSendPacket(0u, kSsrc1, kCaptureTimeMs);
-  OnSendPacket(1u, kSsrc1, kCaptureTimeMs + 1);
-  clock_.AdvanceTimeMilliseconds(kMaxPacketDelayMs);  // 0xffff, 0 -> old.
-  OnSendPacket(2u, kSsrc1, kCaptureTimeMs + 2);
-
-  EXPECT_FALSE(OnSentPacket(0xffffu));  // Old removed.
-  EXPECT_FALSE(OnSentPacket(0u));       // Old removed.
-  EXPECT_TRUE(OnSentPacket(1u));
-  EXPECT_TRUE(OnSentPacket(2u));
-}
-
-TEST_F(SendDelayStatsTest, HistogramsAreUpdated) {
-  metrics::Reset();
-  const int64_t kDelayMs1 = 5;
-  const int64_t kDelayMs2 = 15;
-  const int kNumSamples = kMinRequiredPeriodicSamples * kProcessIntervalMs /
-                          (kDelayMs1 + kDelayMs2) + 1;
-
-  uint16_t id = 0;
-  for (int i = 0; i < kNumSamples; ++i) {
-    OnSendPacket(++id, kSsrc1);
-    clock_.AdvanceTimeMilliseconds(kDelayMs1);
-    EXPECT_TRUE(OnSentPacket(id));
-    OnSendPacket(++id, kSsrc2);
-    clock_.AdvanceTimeMilliseconds(kDelayMs2);
-    EXPECT_TRUE(OnSentPacket(id));
-  }
-  stats_.reset();
-  EXPECT_EQ(2, metrics::NumSamples("WebRTC.Video.SendDelayInMs"));
-  EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.SendDelayInMs", kDelayMs1));
-  EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.SendDelayInMs", kDelayMs2));
-}
-
-}  // namespace webrtc
diff --git a/video/send_statistics_proxy.cc b/video/send_statistics_proxy.cc
deleted file mode 100644
index 00dd7bf..0000000
--- a/video/send_statistics_proxy.cc
+++ /dev/null
@@ -1,944 +0,0 @@
-/*
- *  Copyright (c) 2013 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/video/send_statistics_proxy.h"
-
-#include <algorithm>
-#include <cmath>
-#include <map>
-#include <vector>
-
-#include "webrtc/common_types.h"
-#include "webrtc/modules/video_coding/include/video_codec_interface.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/system_wrappers/include/metrics.h"
-
-namespace webrtc {
-namespace {
-const float kEncodeTimeWeigthFactor = 0.5f;
-
-// Used by histograms. Values of entries should not be changed.
-enum HistogramCodecType {
-  kVideoUnknown = 0,
-  kVideoVp8 = 1,
-  kVideoVp9 = 2,
-  kVideoH264 = 3,
-  kVideoMax = 64,
-};
-
-const char* kRealtimePrefix = "WebRTC.Video.";
-const char* kScreenPrefix = "WebRTC.Video.Screenshare.";
-
-const char* GetUmaPrefix(VideoEncoderConfig::ContentType content_type) {
-  switch (content_type) {
-    case VideoEncoderConfig::ContentType::kRealtimeVideo:
-      return kRealtimePrefix;
-    case VideoEncoderConfig::ContentType::kScreen:
-      return kScreenPrefix;
-  }
-  RTC_NOTREACHED();
-  return nullptr;
-}
-
-HistogramCodecType PayloadNameToHistogramCodecType(
-    const std::string& payload_name) {
-  VideoCodecType codecType = PayloadStringToCodecType(payload_name);
-  switch (codecType) {
-    case kVideoCodecVP8:
-      return kVideoVp8;
-    case kVideoCodecVP9:
-      return kVideoVp9;
-    case kVideoCodecH264:
-      return kVideoH264;
-    default:
-      return kVideoUnknown;
-  }
-}
-
-void UpdateCodecTypeHistogram(const std::string& payload_name) {
-  RTC_HISTOGRAM_ENUMERATION("WebRTC.Video.Encoder.CodecType",
-                            PayloadNameToHistogramCodecType(payload_name),
-                            kVideoMax);
-}
-}  // namespace
-
-
-const int SendStatisticsProxy::kStatsTimeoutMs = 5000;
-
-SendStatisticsProxy::SendStatisticsProxy(
-    Clock* clock,
-    const VideoSendStream::Config& config,
-    VideoEncoderConfig::ContentType content_type)
-    : clock_(clock),
-      payload_name_(config.encoder_settings.payload_name),
-      rtp_config_(config.rtp),
-      content_type_(content_type),
-      start_ms_(clock->TimeInMilliseconds()),
-      last_sent_frame_timestamp_(0),
-      encode_time_(kEncodeTimeWeigthFactor),
-      quality_downscales_(-1),
-      cpu_downscales_(-1),
-      uma_container_(
-          new UmaSamplesContainer(GetUmaPrefix(content_type_), stats_, clock)) {
-}
-
-SendStatisticsProxy::~SendStatisticsProxy() {
-  rtc::CritScope lock(&crit_);
-  uma_container_->UpdateHistograms(rtp_config_, stats_);
-
-  int64_t elapsed_sec = (clock_->TimeInMilliseconds() - start_ms_) / 1000;
-  RTC_HISTOGRAM_COUNTS_100000("WebRTC.Video.SendStreamLifetimeInSeconds",
-                              elapsed_sec);
-
-  if (elapsed_sec >= metrics::kMinRunTimeInSeconds)
-    UpdateCodecTypeHistogram(payload_name_);
-}
-
-SendStatisticsProxy::UmaSamplesContainer::UmaSamplesContainer(
-    const char* prefix,
-    const VideoSendStream::Stats& stats,
-    Clock* const clock)
-    : uma_prefix_(prefix),
-      clock_(clock),
-      max_sent_width_per_timestamp_(0),
-      max_sent_height_per_timestamp_(0),
-      input_frame_rate_tracker_(100, 10u),
-      input_fps_counter_(clock, nullptr, true),
-      sent_fps_counter_(clock, nullptr, true),
-      total_byte_counter_(clock, nullptr, true),
-      media_byte_counter_(clock, nullptr, true),
-      rtx_byte_counter_(clock, nullptr, true),
-      padding_byte_counter_(clock, nullptr, true),
-      retransmit_byte_counter_(clock, nullptr, true),
-      fec_byte_counter_(clock, nullptr, true),
-      first_rtcp_stats_time_ms_(-1),
-      first_rtp_stats_time_ms_(-1),
-      start_stats_(stats) {
-  InitializeBitrateCounters(stats);
-}
-
-SendStatisticsProxy::UmaSamplesContainer::~UmaSamplesContainer() {}
-
-void SendStatisticsProxy::UmaSamplesContainer::InitializeBitrateCounters(
-    const VideoSendStream::Stats& stats) {
-  for (const auto& it : stats.substreams) {
-    uint32_t ssrc = it.first;
-    total_byte_counter_.SetLast(it.second.rtp_stats.transmitted.TotalBytes(),
-                                ssrc);
-    padding_byte_counter_.SetLast(it.second.rtp_stats.transmitted.padding_bytes,
-                                  ssrc);
-    retransmit_byte_counter_.SetLast(
-        it.second.rtp_stats.retransmitted.TotalBytes(), ssrc);
-    fec_byte_counter_.SetLast(it.second.rtp_stats.fec.TotalBytes(), ssrc);
-    if (it.second.is_rtx) {
-      rtx_byte_counter_.SetLast(it.second.rtp_stats.transmitted.TotalBytes(),
-                                ssrc);
-    } else {
-      media_byte_counter_.SetLast(it.second.rtp_stats.MediaPayloadBytes(),
-                                  ssrc);
-    }
-  }
-}
-
-void SendStatisticsProxy::UmaSamplesContainer::UpdateHistograms(
-    const VideoSendStream::Config::Rtp& rtp_config,
-    const VideoSendStream::Stats& current_stats) {
-  RTC_DCHECK(uma_prefix_ == kRealtimePrefix || uma_prefix_ == kScreenPrefix);
-  const int kIndex = uma_prefix_ == kScreenPrefix ? 1 : 0;
-  const int kMinRequiredPeriodicSamples = 6;
-  int in_width = input_width_counter_.Avg(kMinRequiredMetricsSamples);
-  int in_height = input_height_counter_.Avg(kMinRequiredMetricsSamples);
-  if (in_width != -1) {
-    RTC_HISTOGRAMS_COUNTS_10000(kIndex, uma_prefix_ + "InputWidthInPixels",
-                                in_width);
-    RTC_HISTOGRAMS_COUNTS_10000(kIndex, uma_prefix_ + "InputHeightInPixels",
-                                in_height);
-    LOG(LS_INFO) << uma_prefix_ << "InputWidthInPixels " << in_width;
-    LOG(LS_INFO) << uma_prefix_ << "InputHeightInPixels " << in_height;
-  }
-  AggregatedStats in_fps = input_fps_counter_.GetStats();
-  if (in_fps.num_samples >= kMinRequiredPeriodicSamples) {
-    RTC_HISTOGRAMS_COUNTS_100(kIndex, uma_prefix_ + "InputFramesPerSecond",
-                              in_fps.average);
-    LOG(LS_INFO) << uma_prefix_ + "InputFramesPerSecond, " << in_fps.ToString();
-  }
-
-  int sent_width = sent_width_counter_.Avg(kMinRequiredMetricsSamples);
-  int sent_height = sent_height_counter_.Avg(kMinRequiredMetricsSamples);
-  if (sent_width != -1) {
-    RTC_HISTOGRAMS_COUNTS_10000(kIndex, uma_prefix_ + "SentWidthInPixels",
-                                sent_width);
-    RTC_HISTOGRAMS_COUNTS_10000(kIndex, uma_prefix_ + "SentHeightInPixels",
-                                sent_height);
-    LOG(LS_INFO) << uma_prefix_ << "SentWidthInPixels " << sent_width;
-    LOG(LS_INFO) << uma_prefix_ << "SentHeightInPixels " << sent_height;
-  }
-  AggregatedStats sent_fps = sent_fps_counter_.GetStats();
-  if (sent_fps.num_samples >= kMinRequiredPeriodicSamples) {
-    RTC_HISTOGRAMS_COUNTS_100(kIndex, uma_prefix_ + "SentFramesPerSecond",
-                              sent_fps.average);
-    LOG(LS_INFO) << uma_prefix_ + "SentFramesPerSecond, "
-                 << sent_fps.ToString();
-  }
-
-  if (in_fps.num_samples > kMinRequiredPeriodicSamples &&
-      sent_fps.num_samples >= kMinRequiredPeriodicSamples) {
-    int in_fps_avg = in_fps.average;
-    if (in_fps_avg > 0) {
-      int sent_fps_avg = sent_fps.average;
-      int sent_to_in_fps_ratio_percent =
-          (100 * sent_fps_avg + in_fps_avg / 2) / in_fps_avg;
-      // If reported period is small, it may happen that sent_fps is larger than
-      // input_fps briefly on average. This should be treated as 100% sent to
-      // input ratio.
-      if (sent_to_in_fps_ratio_percent > 100)
-        sent_to_in_fps_ratio_percent = 100;
-      RTC_HISTOGRAMS_PERCENTAGE(kIndex,
-                                uma_prefix_ + "SentToInputFpsRatioPercent",
-                                sent_to_in_fps_ratio_percent);
-      LOG(LS_INFO) << uma_prefix_ << "SentToInputFpsRatioPercent "
-                   << sent_to_in_fps_ratio_percent;
-    }
-  }
-
-  int encode_ms = encode_time_counter_.Avg(kMinRequiredMetricsSamples);
-  if (encode_ms != -1) {
-    RTC_HISTOGRAMS_COUNTS_1000(kIndex, uma_prefix_ + "EncodeTimeInMs",
-                               encode_ms);
-    LOG(LS_INFO) << uma_prefix_ << "EncodeTimeInMs " << encode_ms;
-  }
-  int key_frames_permille =
-      key_frame_counter_.Permille(kMinRequiredMetricsSamples);
-  if (key_frames_permille != -1) {
-    RTC_HISTOGRAMS_COUNTS_1000(kIndex, uma_prefix_ + "KeyFramesSentInPermille",
-                               key_frames_permille);
-    LOG(LS_INFO) << uma_prefix_ << "KeyFramesSentInPermille "
-                 << key_frames_permille;
-  }
-  int quality_limited =
-      quality_limited_frame_counter_.Percent(kMinRequiredMetricsSamples);
-  if (quality_limited != -1) {
-    RTC_HISTOGRAMS_PERCENTAGE(kIndex,
-                              uma_prefix_ + "QualityLimitedResolutionInPercent",
-                              quality_limited);
-    LOG(LS_INFO) << uma_prefix_ << "QualityLimitedResolutionInPercent "
-                 << quality_limited;
-  }
-  int downscales = quality_downscales_counter_.Avg(kMinRequiredMetricsSamples);
-  if (downscales != -1) {
-    RTC_HISTOGRAMS_ENUMERATION(
-        kIndex, uma_prefix_ + "QualityLimitedResolutionDownscales", downscales,
-        20);
-  }
-  int cpu_limited =
-      cpu_limited_frame_counter_.Percent(kMinRequiredMetricsSamples);
-  if (cpu_limited != -1) {
-    RTC_HISTOGRAMS_PERCENTAGE(
-        kIndex, uma_prefix_ + "CpuLimitedResolutionInPercent", cpu_limited);
-  }
-  int bw_limited =
-      bw_limited_frame_counter_.Percent(kMinRequiredMetricsSamples);
-  if (bw_limited != -1) {
-    RTC_HISTOGRAMS_PERCENTAGE(
-        kIndex, uma_prefix_ + "BandwidthLimitedResolutionInPercent",
-        bw_limited);
-  }
-  int num_disabled =
-      bw_resolutions_disabled_counter_.Avg(kMinRequiredMetricsSamples);
-  if (num_disabled != -1) {
-    RTC_HISTOGRAMS_ENUMERATION(
-        kIndex, uma_prefix_ + "BandwidthLimitedResolutionsDisabled",
-        num_disabled, 10);
-  }
-  int delay_ms = delay_counter_.Avg(kMinRequiredMetricsSamples);
-  if (delay_ms != -1)
-    RTC_HISTOGRAMS_COUNTS_100000(kIndex, uma_prefix_ + "SendSideDelayInMs",
-                                 delay_ms);
-
-  int max_delay_ms = max_delay_counter_.Avg(kMinRequiredMetricsSamples);
-  if (max_delay_ms != -1) {
-    RTC_HISTOGRAMS_COUNTS_100000(kIndex, uma_prefix_ + "SendSideDelayMaxInMs",
-                                 max_delay_ms);
-  }
-
-  for (const auto& it : qp_counters_) {
-    int qp_vp8 = it.second.vp8.Avg(kMinRequiredMetricsSamples);
-    if (qp_vp8 != -1) {
-      int spatial_idx = it.first;
-      if (spatial_idx == -1) {
-        RTC_HISTOGRAMS_COUNTS_200(kIndex, uma_prefix_ + "Encoded.Qp.Vp8",
-                                  qp_vp8);
-      } else if (spatial_idx == 0) {
-        RTC_HISTOGRAMS_COUNTS_200(kIndex, uma_prefix_ + "Encoded.Qp.Vp8.S0",
-                                  qp_vp8);
-      } else if (spatial_idx == 1) {
-        RTC_HISTOGRAMS_COUNTS_200(kIndex, uma_prefix_ + "Encoded.Qp.Vp8.S1",
-                                  qp_vp8);
-      } else if (spatial_idx == 2) {
-        RTC_HISTOGRAMS_COUNTS_200(kIndex, uma_prefix_ + "Encoded.Qp.Vp8.S2",
-                                  qp_vp8);
-      } else {
-        LOG(LS_WARNING) << "QP stats not recorded for VP8 spatial idx "
-                        << spatial_idx;
-      }
-    }
-    int qp_vp9 = it.second.vp9.Avg(kMinRequiredMetricsSamples);
-    if (qp_vp9 != -1) {
-      int spatial_idx = it.first;
-      if (spatial_idx == -1) {
-        RTC_HISTOGRAMS_COUNTS_500(kIndex, uma_prefix_ + "Encoded.Qp.Vp9",
-                                  qp_vp9);
-      } else if (spatial_idx == 0) {
-        RTC_HISTOGRAMS_COUNTS_500(kIndex, uma_prefix_ + "Encoded.Qp.Vp9.S0",
-                                  qp_vp9);
-      } else if (spatial_idx == 1) {
-        RTC_HISTOGRAMS_COUNTS_500(kIndex, uma_prefix_ + "Encoded.Qp.Vp9.S1",
-                                  qp_vp9);
-      } else if (spatial_idx == 2) {
-        RTC_HISTOGRAMS_COUNTS_500(kIndex, uma_prefix_ + "Encoded.Qp.Vp9.S2",
-                                  qp_vp9);
-      } else {
-        LOG(LS_WARNING) << "QP stats not recorded for VP9 spatial layer "
-                        << spatial_idx;
-      }
-    }
-    int qp_h264 = it.second.h264.Avg(kMinRequiredMetricsSamples);
-    if (qp_h264 != -1) {
-      int spatial_idx = it.first;
-      RTC_DCHECK_EQ(-1, spatial_idx);
-      RTC_HISTOGRAMS_COUNTS_100(kIndex, uma_prefix_ + "Encoded.Qp.H264",
-                                qp_h264);
-    }
-  }
-
-  if (first_rtp_stats_time_ms_ != -1) {
-    quality_adapt_timer_.Stop(clock_->TimeInMilliseconds());
-    int64_t elapsed_sec = quality_adapt_timer_.total_ms / 1000;
-    if (elapsed_sec >= metrics::kMinRunTimeInSeconds) {
-      int quality_changes = current_stats.number_of_quality_adapt_changes -
-                            start_stats_.number_of_quality_adapt_changes;
-      RTC_HISTOGRAMS_COUNTS_100(kIndex,
-                                uma_prefix_ + "AdaptChangesPerMinute.Quality",
-                                quality_changes * 60 / elapsed_sec);
-    }
-    cpu_adapt_timer_.Stop(clock_->TimeInMilliseconds());
-    elapsed_sec = cpu_adapt_timer_.total_ms / 1000;
-    if (elapsed_sec >= metrics::kMinRunTimeInSeconds) {
-      int cpu_changes = current_stats.number_of_cpu_adapt_changes -
-                        start_stats_.number_of_cpu_adapt_changes;
-      RTC_HISTOGRAMS_COUNTS_100(kIndex,
-                                uma_prefix_ + "AdaptChangesPerMinute.Cpu",
-                                cpu_changes * 60 / elapsed_sec);
-    }
-  }
-
-  if (first_rtcp_stats_time_ms_ != -1) {
-    int64_t elapsed_sec =
-        (clock_->TimeInMilliseconds() - first_rtcp_stats_time_ms_) / 1000;
-    if (elapsed_sec >= metrics::kMinRunTimeInSeconds) {
-      int fraction_lost = report_block_stats_.FractionLostInPercent();
-      if (fraction_lost != -1) {
-        RTC_HISTOGRAMS_PERCENTAGE(
-            kIndex, uma_prefix_ + "SentPacketsLostInPercent", fraction_lost);
-        LOG(LS_INFO) << uma_prefix_ << "SentPacketsLostInPercent "
-                     << fraction_lost;
-      }
-
-      // The RTCP packet type counters, delivered via the
-      // RtcpPacketTypeCounterObserver interface, are aggregates over the entire
-      // life of the send stream and are not reset when switching content type.
-      // For the purpose of these statistics though, we want new counts when
-      // switching since we switch histogram name. On every reset of the
-      // UmaSamplesContainer, we save the initial state of the counters, so that
-      // we can calculate the delta here and aggregate over all ssrcs.
-      RtcpPacketTypeCounter counters;
-      for (uint32_t ssrc : rtp_config.ssrcs) {
-        auto kv = current_stats.substreams.find(ssrc);
-        if (kv == current_stats.substreams.end())
-          continue;
-
-        RtcpPacketTypeCounter stream_counters =
-            kv->second.rtcp_packet_type_counts;
-        kv = start_stats_.substreams.find(ssrc);
-        if (kv != start_stats_.substreams.end())
-          stream_counters.Subtract(kv->second.rtcp_packet_type_counts);
-
-        counters.Add(stream_counters);
-      }
-      RTC_HISTOGRAMS_COUNTS_10000(kIndex,
-                                  uma_prefix_ + "NackPacketsReceivedPerMinute",
-                                  counters.nack_packets * 60 / elapsed_sec);
-      RTC_HISTOGRAMS_COUNTS_10000(kIndex,
-                                  uma_prefix_ + "FirPacketsReceivedPerMinute",
-                                  counters.fir_packets * 60 / elapsed_sec);
-      RTC_HISTOGRAMS_COUNTS_10000(kIndex,
-                                  uma_prefix_ + "PliPacketsReceivedPerMinute",
-                                  counters.pli_packets * 60 / elapsed_sec);
-      if (counters.nack_requests > 0) {
-        RTC_HISTOGRAMS_PERCENTAGE(
-            kIndex, uma_prefix_ + "UniqueNackRequestsReceivedInPercent",
-            counters.UniqueNackRequestsInPercent());
-      }
-    }
-  }
-
-  if (first_rtp_stats_time_ms_ != -1) {
-    int64_t elapsed_sec =
-        (clock_->TimeInMilliseconds() - first_rtp_stats_time_ms_) / 1000;
-    if (elapsed_sec >= metrics::kMinRunTimeInSeconds) {
-      RTC_HISTOGRAMS_COUNTS_100(kIndex, uma_prefix_ + "NumberOfPauseEvents",
-                                target_rate_updates_.pause_resume_events);
-      LOG(LS_INFO) << uma_prefix_ << "NumberOfPauseEvents "
-                   << target_rate_updates_.pause_resume_events;
-
-      int paused_time_percent =
-          paused_time_counter_.Percent(metrics::kMinRunTimeInSeconds * 1000);
-      if (paused_time_percent != -1) {
-        RTC_HISTOGRAMS_PERCENTAGE(kIndex, uma_prefix_ + "PausedTimeInPercent",
-                                  paused_time_percent);
-        LOG(LS_INFO) << uma_prefix_ << "PausedTimeInPercent "
-                     << paused_time_percent;
-      }
-    }
-  }
-
-  AggregatedStats total_bytes_per_sec = total_byte_counter_.GetStats();
-  if (total_bytes_per_sec.num_samples > kMinRequiredPeriodicSamples) {
-    RTC_HISTOGRAMS_COUNTS_10000(kIndex, uma_prefix_ + "BitrateSentInKbps",
-                                total_bytes_per_sec.average * 8 / 1000);
-    LOG(LS_INFO) << uma_prefix_ << "BitrateSentInBps, "
-                 << total_bytes_per_sec.ToStringWithMultiplier(8);
-  }
-  AggregatedStats media_bytes_per_sec = media_byte_counter_.GetStats();
-  if (media_bytes_per_sec.num_samples > kMinRequiredPeriodicSamples) {
-    RTC_HISTOGRAMS_COUNTS_10000(kIndex, uma_prefix_ + "MediaBitrateSentInKbps",
-                                media_bytes_per_sec.average * 8 / 1000);
-    LOG(LS_INFO) << uma_prefix_ << "MediaBitrateSentInBps, "
-                 << media_bytes_per_sec.ToStringWithMultiplier(8);
-  }
-  AggregatedStats padding_bytes_per_sec = padding_byte_counter_.GetStats();
-  if (padding_bytes_per_sec.num_samples > kMinRequiredPeriodicSamples) {
-    RTC_HISTOGRAMS_COUNTS_10000(kIndex,
-                                uma_prefix_ + "PaddingBitrateSentInKbps",
-                                padding_bytes_per_sec.average * 8 / 1000);
-    LOG(LS_INFO) << uma_prefix_ << "PaddingBitrateSentInBps, "
-                 << padding_bytes_per_sec.ToStringWithMultiplier(8);
-  }
-  AggregatedStats retransmit_bytes_per_sec =
-      retransmit_byte_counter_.GetStats();
-  if (retransmit_bytes_per_sec.num_samples > kMinRequiredPeriodicSamples) {
-    RTC_HISTOGRAMS_COUNTS_10000(kIndex,
-                                uma_prefix_ + "RetransmittedBitrateSentInKbps",
-                                retransmit_bytes_per_sec.average * 8 / 1000);
-    LOG(LS_INFO) << uma_prefix_ << "RetransmittedBitrateSentInBps, "
-                 << retransmit_bytes_per_sec.ToStringWithMultiplier(8);
-  }
-  if (!rtp_config.rtx.ssrcs.empty()) {
-    AggregatedStats rtx_bytes_per_sec = rtx_byte_counter_.GetStats();
-    int rtx_bytes_per_sec_avg = -1;
-    if (rtx_bytes_per_sec.num_samples > kMinRequiredPeriodicSamples) {
-      rtx_bytes_per_sec_avg = rtx_bytes_per_sec.average;
-      LOG(LS_INFO) << uma_prefix_ << "RtxBitrateSentInBps, "
-                   << rtx_bytes_per_sec.ToStringWithMultiplier(8);
-    } else if (total_bytes_per_sec.num_samples > kMinRequiredPeriodicSamples) {
-      rtx_bytes_per_sec_avg = 0;  // RTX enabled but no RTX data sent, record 0.
-    }
-    if (rtx_bytes_per_sec_avg != -1) {
-      RTC_HISTOGRAMS_COUNTS_10000(kIndex, uma_prefix_ + "RtxBitrateSentInKbps",
-                                  rtx_bytes_per_sec_avg * 8 / 1000);
-    }
-  }
-  if (rtp_config.flexfec.payload_type != -1 ||
-      rtp_config.ulpfec.red_payload_type != -1) {
-    AggregatedStats fec_bytes_per_sec = fec_byte_counter_.GetStats();
-    if (fec_bytes_per_sec.num_samples > kMinRequiredPeriodicSamples) {
-      RTC_HISTOGRAMS_COUNTS_10000(kIndex, uma_prefix_ + "FecBitrateSentInKbps",
-                                  fec_bytes_per_sec.average * 8 / 1000);
-      LOG(LS_INFO) << uma_prefix_ << "FecBitrateSentInBps, "
-                   << fec_bytes_per_sec.ToStringWithMultiplier(8);
-    }
-  }
-}
-
-void SendStatisticsProxy::OnEncoderReconfigured(
-    const VideoEncoderConfig& config,
-    uint32_t preferred_bitrate_bps) {
-  rtc::CritScope lock(&crit_);
-  stats_.preferred_media_bitrate_bps = preferred_bitrate_bps;
-
-  if (content_type_ != config.content_type) {
-    uma_container_->UpdateHistograms(rtp_config_, stats_);
-    uma_container_.reset(new UmaSamplesContainer(
-        GetUmaPrefix(config.content_type), stats_, clock_));
-    content_type_ = config.content_type;
-  }
-}
-
-void SendStatisticsProxy::OnEncoderStatsUpdate(uint32_t framerate,
-                                               uint32_t bitrate) {
-  rtc::CritScope lock(&crit_);
-  stats_.encode_frame_rate = framerate;
-  stats_.media_bitrate_bps = bitrate;
-}
-
-void SendStatisticsProxy::OnEncodedFrameTimeMeasured(
-    int encode_time_ms,
-    const CpuOveruseMetrics& metrics) {
-  rtc::CritScope lock(&crit_);
-  uma_container_->encode_time_counter_.Add(encode_time_ms);
-  encode_time_.Apply(1.0f, encode_time_ms);
-  stats_.avg_encode_time_ms = round(encode_time_.filtered());
-  stats_.encode_usage_percent = metrics.encode_usage_percent;
-}
-
-void SendStatisticsProxy::OnSuspendChange(bool is_suspended) {
-  int64_t now_ms = clock_->TimeInMilliseconds();
-  rtc::CritScope lock(&crit_);
-  stats_.suspended = is_suspended;
-  if (is_suspended) {
-    // Pause framerate (add min pause time since there may be frames/packets
-    // that are not yet sent).
-    const int64_t kMinMs = 500;
-    uma_container_->input_fps_counter_.ProcessAndPauseForDuration(kMinMs);
-    uma_container_->sent_fps_counter_.ProcessAndPauseForDuration(kMinMs);
-    // Pause bitrate stats.
-    uma_container_->total_byte_counter_.ProcessAndPauseForDuration(kMinMs);
-    uma_container_->media_byte_counter_.ProcessAndPauseForDuration(kMinMs);
-    uma_container_->rtx_byte_counter_.ProcessAndPauseForDuration(kMinMs);
-    uma_container_->padding_byte_counter_.ProcessAndPauseForDuration(kMinMs);
-    uma_container_->retransmit_byte_counter_.ProcessAndPauseForDuration(kMinMs);
-    uma_container_->fec_byte_counter_.ProcessAndPauseForDuration(kMinMs);
-    // Stop adaptation stats.
-    uma_container_->cpu_adapt_timer_.Stop(now_ms);
-    uma_container_->quality_adapt_timer_.Stop(now_ms);
-  } else {
-    // Start adaptation stats if scaling is enabled.
-    if (cpu_downscales_ >= 0)
-      uma_container_->cpu_adapt_timer_.Start(now_ms);
-    if (quality_downscales_ >= 0)
-      uma_container_->quality_adapt_timer_.Start(now_ms);
-    // Stop pause explicitly for stats that may be zero/not updated for some
-    // time.
-    uma_container_->rtx_byte_counter_.ProcessAndStopPause();
-    uma_container_->padding_byte_counter_.ProcessAndStopPause();
-    uma_container_->retransmit_byte_counter_.ProcessAndStopPause();
-    uma_container_->fec_byte_counter_.ProcessAndStopPause();
-  }
-}
-
-VideoSendStream::Stats SendStatisticsProxy::GetStats() {
-  rtc::CritScope lock(&crit_);
-  PurgeOldStats();
-  stats_.input_frame_rate =
-      round(uma_container_->input_frame_rate_tracker_.ComputeRate());
-  stats_.content_type =
-      content_type_ == VideoEncoderConfig::ContentType::kRealtimeVideo
-          ? VideoContentType::UNSPECIFIED
-          : VideoContentType::SCREENSHARE;
-  return stats_;
-}
-
-void SendStatisticsProxy::PurgeOldStats() {
-  int64_t old_stats_ms = clock_->TimeInMilliseconds() - kStatsTimeoutMs;
-  for (std::map<uint32_t, VideoSendStream::StreamStats>::iterator it =
-           stats_.substreams.begin();
-       it != stats_.substreams.end(); ++it) {
-    uint32_t ssrc = it->first;
-    if (update_times_[ssrc].resolution_update_ms <= old_stats_ms) {
-      it->second.width = 0;
-      it->second.height = 0;
-    }
-  }
-}
-
-VideoSendStream::StreamStats* SendStatisticsProxy::GetStatsEntry(
-    uint32_t ssrc) {
-  std::map<uint32_t, VideoSendStream::StreamStats>::iterator it =
-      stats_.substreams.find(ssrc);
-  if (it != stats_.substreams.end())
-    return &it->second;
-
-  bool is_media = std::find(rtp_config_.ssrcs.begin(), rtp_config_.ssrcs.end(),
-                            ssrc) != rtp_config_.ssrcs.end();
-  bool is_flexfec = rtp_config_.flexfec.payload_type != -1 &&
-                    ssrc == rtp_config_.flexfec.ssrc;
-  bool is_rtx =
-      std::find(rtp_config_.rtx.ssrcs.begin(), rtp_config_.rtx.ssrcs.end(),
-                ssrc) != rtp_config_.rtx.ssrcs.end();
-  if (!is_media && !is_flexfec && !is_rtx)
-    return nullptr;
-
-  // Insert new entry and return ptr.
-  VideoSendStream::StreamStats* entry = &stats_.substreams[ssrc];
-  entry->is_rtx = is_rtx;
-  entry->is_flexfec = is_flexfec;
-
-  return entry;
-}
-
-void SendStatisticsProxy::OnInactiveSsrc(uint32_t ssrc) {
-  rtc::CritScope lock(&crit_);
-  VideoSendStream::StreamStats* stats = GetStatsEntry(ssrc);
-  if (!stats)
-    return;
-
-  stats->total_bitrate_bps = 0;
-  stats->retransmit_bitrate_bps = 0;
-  stats->height = 0;
-  stats->width = 0;
-}
-
-void SendStatisticsProxy::OnSetEncoderTargetRate(uint32_t bitrate_bps) {
-  rtc::CritScope lock(&crit_);
-  if (uma_container_->target_rate_updates_.last_ms == -1 && bitrate_bps == 0)
-    return;  // Start on first non-zero bitrate, may initially be zero.
-
-  int64_t now = clock_->TimeInMilliseconds();
-  if (uma_container_->target_rate_updates_.last_ms != -1) {
-    bool was_paused = stats_.target_media_bitrate_bps == 0;
-    int64_t diff_ms = now - uma_container_->target_rate_updates_.last_ms;
-    uma_container_->paused_time_counter_.Add(was_paused, diff_ms);
-
-    // Use last to not include update when stream is stopped and video disabled.
-    if (uma_container_->target_rate_updates_.last_paused_or_resumed)
-      ++uma_container_->target_rate_updates_.pause_resume_events;
-
-    // Check if video is paused/resumed.
-    uma_container_->target_rate_updates_.last_paused_or_resumed =
-        (bitrate_bps == 0) != was_paused;
-  }
-  uma_container_->target_rate_updates_.last_ms = now;
-
-  stats_.target_media_bitrate_bps = bitrate_bps;
-}
-
-void SendStatisticsProxy::OnSendEncodedImage(
-    const EncodedImage& encoded_image,
-    const CodecSpecificInfo* codec_info) {
-  size_t simulcast_idx = 0;
-
-  rtc::CritScope lock(&crit_);
-  ++stats_.frames_encoded;
-  if (codec_info) {
-    if (codec_info->codecType == kVideoCodecVP8) {
-      simulcast_idx = codec_info->codecSpecific.VP8.simulcastIdx;
-    } else if (codec_info->codecType == kVideoCodecGeneric) {
-      simulcast_idx = codec_info->codecSpecific.generic.simulcast_idx;
-    }
-    if (codec_info->codec_name) {
-      stats_.encoder_implementation_name = codec_info->codec_name;
-    }
-  }
-
-  if (simulcast_idx >= rtp_config_.ssrcs.size()) {
-    LOG(LS_ERROR) << "Encoded image outside simulcast range (" << simulcast_idx
-                  << " >= " << rtp_config_.ssrcs.size() << ").";
-    return;
-  }
-  uint32_t ssrc = rtp_config_.ssrcs[simulcast_idx];
-
-  VideoSendStream::StreamStats* stats = GetStatsEntry(ssrc);
-  if (!stats)
-    return;
-
-  stats->width = encoded_image._encodedWidth;
-  stats->height = encoded_image._encodedHeight;
-  update_times_[ssrc].resolution_update_ms = clock_->TimeInMilliseconds();
-
-  uma_container_->key_frame_counter_.Add(encoded_image._frameType ==
-                                         kVideoFrameKey);
-  stats_.bw_limited_resolution =
-      encoded_image.adapt_reason_.bw_resolutions_disabled > 0 ||
-      quality_downscales_ > 0;
-
-  if (quality_downscales_ != -1) {
-    uma_container_->quality_limited_frame_counter_.Add(quality_downscales_ > 0);
-    if (quality_downscales_ > 0)
-      uma_container_->quality_downscales_counter_.Add(quality_downscales_);
-  }
-  if (encoded_image.adapt_reason_.bw_resolutions_disabled != -1) {
-    bool bw_limited = encoded_image.adapt_reason_.bw_resolutions_disabled > 0;
-    uma_container_->bw_limited_frame_counter_.Add(bw_limited);
-    if (bw_limited) {
-      uma_container_->bw_resolutions_disabled_counter_.Add(
-          encoded_image.adapt_reason_.bw_resolutions_disabled);
-    }
-  }
-
-  if (encoded_image.qp_ != -1) {
-    if (!stats_.qp_sum)
-      stats_.qp_sum = rtc::Optional<uint64_t>(0);
-    *stats_.qp_sum += encoded_image.qp_;
-
-    if (codec_info) {
-      if (codec_info->codecType == kVideoCodecVP8) {
-        int spatial_idx = (rtp_config_.ssrcs.size() == 1)
-                              ? -1
-                              : static_cast<int>(simulcast_idx);
-        uma_container_->qp_counters_[spatial_idx].vp8.Add(encoded_image.qp_);
-      } else if (codec_info->codecType == kVideoCodecVP9) {
-        int spatial_idx =
-            (codec_info->codecSpecific.VP9.num_spatial_layers == 1)
-                ? -1
-                : codec_info->codecSpecific.VP9.spatial_idx;
-        uma_container_->qp_counters_[spatial_idx].vp9.Add(encoded_image.qp_);
-      } else if (codec_info->codecType == kVideoCodecH264) {
-        int spatial_idx = -1;
-        uma_container_->qp_counters_[spatial_idx].h264.Add(encoded_image.qp_);
-      }
-    }
-  }
-
-  // TODO(asapersson): This is incorrect if simulcast layers are encoded on
-  // different threads and there is no guarantee that one frame of all layers
-  // are encoded before the next start.
-  if (last_sent_frame_timestamp_ > 0 &&
-      encoded_image._timeStamp != last_sent_frame_timestamp_) {
-    uma_container_->sent_fps_counter_.Add(1);
-    uma_container_->sent_width_counter_.Add(
-        uma_container_->max_sent_width_per_timestamp_);
-    uma_container_->sent_height_counter_.Add(
-        uma_container_->max_sent_height_per_timestamp_);
-    uma_container_->max_sent_width_per_timestamp_ = 0;
-    uma_container_->max_sent_height_per_timestamp_ = 0;
-  }
-  last_sent_frame_timestamp_ = encoded_image._timeStamp;
-  uma_container_->max_sent_width_per_timestamp_ =
-      std::max(uma_container_->max_sent_width_per_timestamp_,
-               static_cast<int>(encoded_image._encodedWidth));
-  uma_container_->max_sent_height_per_timestamp_ =
-      std::max(uma_container_->max_sent_height_per_timestamp_,
-               static_cast<int>(encoded_image._encodedHeight));
-}
-
-int SendStatisticsProxy::GetSendFrameRate() const {
-  rtc::CritScope lock(&crit_);
-  return stats_.encode_frame_rate;
-}
-
-void SendStatisticsProxy::OnIncomingFrame(int width, int height) {
-  rtc::CritScope lock(&crit_);
-  uma_container_->input_frame_rate_tracker_.AddSamples(1);
-  uma_container_->input_fps_counter_.Add(1);
-  uma_container_->input_width_counter_.Add(width);
-  uma_container_->input_height_counter_.Add(height);
-  if (cpu_downscales_ >= 0) {
-    uma_container_->cpu_limited_frame_counter_.Add(
-        stats_.cpu_limited_resolution);
-  }
-}
-
-void SendStatisticsProxy::SetAdaptationStats(
-    const VideoStreamEncoder::AdaptCounts& cpu_counts,
-    const VideoStreamEncoder::AdaptCounts& quality_counts) {
-  rtc::CritScope lock(&crit_);
-  SetAdaptTimer(cpu_counts, &uma_container_->cpu_adapt_timer_);
-  SetAdaptTimer(quality_counts, &uma_container_->quality_adapt_timer_);
-  UpdateAdaptationStats(cpu_counts, quality_counts);
-}
-
-void SendStatisticsProxy::OnCpuAdaptationChanged(
-    const VideoStreamEncoder::AdaptCounts& cpu_counts,
-    const VideoStreamEncoder::AdaptCounts& quality_counts) {
-  rtc::CritScope lock(&crit_);
-  ++stats_.number_of_cpu_adapt_changes;
-  UpdateAdaptationStats(cpu_counts, quality_counts);
-}
-
-void SendStatisticsProxy::OnQualityAdaptationChanged(
-    const VideoStreamEncoder::AdaptCounts& cpu_counts,
-    const VideoStreamEncoder::AdaptCounts& quality_counts) {
-  rtc::CritScope lock(&crit_);
-  ++stats_.number_of_quality_adapt_changes;
-  UpdateAdaptationStats(cpu_counts, quality_counts);
-}
-
-void SendStatisticsProxy::UpdateAdaptationStats(
-    const VideoStreamEncoder::AdaptCounts& cpu_counts,
-    const VideoStreamEncoder::AdaptCounts& quality_counts) {
-  cpu_downscales_ = cpu_counts.resolution;
-  quality_downscales_ = quality_counts.resolution;
-
-  stats_.cpu_limited_resolution = cpu_counts.resolution > 0;
-  stats_.cpu_limited_framerate = cpu_counts.fps > 0;
-  stats_.bw_limited_resolution = quality_counts.resolution > 0;
-  stats_.bw_limited_framerate = quality_counts.fps > 0;
-}
-
-void SendStatisticsProxy::SetAdaptTimer(
-    const VideoStreamEncoder::AdaptCounts& counts,
-    StatsTimer* timer) {
-  if (counts.resolution >= 0 || counts.fps >= 0) {
-    // Adaptation enabled.
-    if (!stats_.suspended)
-      timer->Start(clock_->TimeInMilliseconds());
-    return;
-  }
-  timer->Stop(clock_->TimeInMilliseconds());
-}
-
-void SendStatisticsProxy::RtcpPacketTypesCounterUpdated(
-    uint32_t ssrc,
-    const RtcpPacketTypeCounter& packet_counter) {
-  rtc::CritScope lock(&crit_);
-  VideoSendStream::StreamStats* stats = GetStatsEntry(ssrc);
-  if (!stats)
-    return;
-
-  stats->rtcp_packet_type_counts = packet_counter;
-  if (uma_container_->first_rtcp_stats_time_ms_ == -1)
-    uma_container_->first_rtcp_stats_time_ms_ = clock_->TimeInMilliseconds();
-}
-
-void SendStatisticsProxy::StatisticsUpdated(const RtcpStatistics& statistics,
-                                            uint32_t ssrc) {
-  rtc::CritScope lock(&crit_);
-  VideoSendStream::StreamStats* stats = GetStatsEntry(ssrc);
-  if (!stats)
-    return;
-
-  stats->rtcp_stats = statistics;
-  uma_container_->report_block_stats_.Store(statistics, 0, ssrc);
-}
-
-void SendStatisticsProxy::CNameChanged(const char* cname, uint32_t ssrc) {}
-
-void SendStatisticsProxy::DataCountersUpdated(
-    const StreamDataCounters& counters,
-    uint32_t ssrc) {
-  rtc::CritScope lock(&crit_);
-  VideoSendStream::StreamStats* stats = GetStatsEntry(ssrc);
-  RTC_DCHECK(stats) << "DataCountersUpdated reported for unknown ssrc " << ssrc;
-
-  if (stats->is_flexfec) {
-    // The same counters are reported for both the media ssrc and flexfec ssrc.
-    // Bitrate stats are summed for all SSRCs. Use fec stats from media update.
-    return;
-  }
-
-  stats->rtp_stats = counters;
-  if (uma_container_->first_rtp_stats_time_ms_ == -1) {
-    int64_t now_ms = clock_->TimeInMilliseconds();
-    uma_container_->first_rtp_stats_time_ms_ = now_ms;
-    uma_container_->cpu_adapt_timer_.Restart(now_ms);
-    uma_container_->quality_adapt_timer_.Restart(now_ms);
-  }
-
-  uma_container_->total_byte_counter_.Set(counters.transmitted.TotalBytes(),
-                                          ssrc);
-  uma_container_->padding_byte_counter_.Set(counters.transmitted.padding_bytes,
-                                            ssrc);
-  uma_container_->retransmit_byte_counter_.Set(
-      counters.retransmitted.TotalBytes(), ssrc);
-  uma_container_->fec_byte_counter_.Set(counters.fec.TotalBytes(), ssrc);
-  if (stats->is_rtx) {
-    uma_container_->rtx_byte_counter_.Set(counters.transmitted.TotalBytes(),
-                                          ssrc);
-  } else {
-    uma_container_->media_byte_counter_.Set(counters.MediaPayloadBytes(), ssrc);
-  }
-}
-
-void SendStatisticsProxy::Notify(uint32_t total_bitrate_bps,
-                                 uint32_t retransmit_bitrate_bps,
-                                 uint32_t ssrc) {
-  rtc::CritScope lock(&crit_);
-  VideoSendStream::StreamStats* stats = GetStatsEntry(ssrc);
-  if (!stats)
-    return;
-
-  stats->total_bitrate_bps = total_bitrate_bps;
-  stats->retransmit_bitrate_bps = retransmit_bitrate_bps;
-}
-
-void SendStatisticsProxy::FrameCountUpdated(const FrameCounts& frame_counts,
-                                            uint32_t ssrc) {
-  rtc::CritScope lock(&crit_);
-  VideoSendStream::StreamStats* stats = GetStatsEntry(ssrc);
-  if (!stats)
-    return;
-
-  stats->frame_counts = frame_counts;
-}
-
-void SendStatisticsProxy::SendSideDelayUpdated(int avg_delay_ms,
-                                               int max_delay_ms,
-                                               uint32_t ssrc) {
-  rtc::CritScope lock(&crit_);
-  VideoSendStream::StreamStats* stats = GetStatsEntry(ssrc);
-  if (!stats)
-    return;
-  stats->avg_delay_ms = avg_delay_ms;
-  stats->max_delay_ms = max_delay_ms;
-
-  uma_container_->delay_counter_.Add(avg_delay_ms);
-  uma_container_->max_delay_counter_.Add(max_delay_ms);
-}
-
-void SendStatisticsProxy::StatsTimer::Start(int64_t now_ms) {
-  if (start_ms == -1)
-    start_ms = now_ms;
-}
-
-void SendStatisticsProxy::StatsTimer::Stop(int64_t now_ms) {
-  if (start_ms != -1) {
-    total_ms += now_ms - start_ms;
-    start_ms = -1;
-  }
-}
-
-void SendStatisticsProxy::StatsTimer::Restart(int64_t now_ms) {
-  total_ms = 0;
-  if (start_ms != -1)
-    start_ms = now_ms;
-}
-
-void SendStatisticsProxy::SampleCounter::Add(int sample) {
-  sum += sample;
-  ++num_samples;
-}
-
-int SendStatisticsProxy::SampleCounter::Avg(
-    int64_t min_required_samples) const {
-  if (num_samples < min_required_samples || num_samples == 0)
-    return -1;
-  return static_cast<int>((sum + (num_samples / 2)) / num_samples);
-}
-
-void SendStatisticsProxy::BoolSampleCounter::Add(bool sample) {
-  if (sample)
-    ++sum;
-  ++num_samples;
-}
-
-void SendStatisticsProxy::BoolSampleCounter::Add(bool sample, int64_t count) {
-  if (sample)
-    sum += count;
-  num_samples += count;
-}
-int SendStatisticsProxy::BoolSampleCounter::Percent(
-    int64_t min_required_samples) const {
-  return Fraction(min_required_samples, 100.0f);
-}
-
-int SendStatisticsProxy::BoolSampleCounter::Permille(
-    int64_t min_required_samples) const {
-  return Fraction(min_required_samples, 1000.0f);
-}
-
-int SendStatisticsProxy::BoolSampleCounter::Fraction(
-    int64_t min_required_samples,
-    float multiplier) const {
-  if (num_samples < min_required_samples || num_samples == 0)
-    return -1;
-  return static_cast<int>((sum * multiplier / num_samples) + 0.5f);
-}
-}  // namespace webrtc
diff --git a/video/send_statistics_proxy.h b/video/send_statistics_proxy.h
deleted file mode 100644
index d6e91d7..0000000
--- a/video/send_statistics_proxy.h
+++ /dev/null
@@ -1,246 +0,0 @@
-/*
- *  Copyright (c) 2013 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_VIDEO_SEND_STATISTICS_PROXY_H_
-#define WEBRTC_VIDEO_SEND_STATISTICS_PROXY_H_
-
-#include <map>
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "webrtc/common_types.h"
-#include "webrtc/modules/video_coding/include/video_codec_interface.h"
-#include "webrtc/modules/video_coding/include/video_coding_defines.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/numerics/exp_filter.h"
-#include "webrtc/rtc_base/ratetracker.h"
-#include "webrtc/rtc_base/thread_annotations.h"
-#include "webrtc/system_wrappers/include/clock.h"
-#include "webrtc/video/overuse_frame_detector.h"
-#include "webrtc/video/report_block_stats.h"
-#include "webrtc/video/stats_counter.h"
-#include "webrtc/video/video_stream_encoder.h"
-#include "webrtc/call/video_send_stream.h"
-
-namespace webrtc {
-
-class SendStatisticsProxy : public CpuOveruseMetricsObserver,
-                            public RtcpStatisticsCallback,
-                            public RtcpPacketTypeCounterObserver,
-                            public StreamDataCountersCallback,
-                            public BitrateStatisticsObserver,
-                            public FrameCountObserver,
-                            public SendSideDelayObserver {
- public:
-  static const int kStatsTimeoutMs;
-  // Number of required samples to be collected before a metric is added
-  // to a rtc histogram.
-  static const int kMinRequiredMetricsSamples = 200;
-
-  SendStatisticsProxy(Clock* clock,
-                      const VideoSendStream::Config& config,
-                      VideoEncoderConfig::ContentType content_type);
-  virtual ~SendStatisticsProxy();
-
-  virtual VideoSendStream::Stats GetStats();
-
-  virtual void OnSendEncodedImage(const EncodedImage& encoded_image,
-                                  const CodecSpecificInfo* codec_info);
-  // Used to update incoming frame rate.
-  void OnIncomingFrame(int width, int height);
-
-  // Adaptation stats.
-  void SetAdaptationStats(
-      const VideoStreamEncoder::AdaptCounts& cpu_counts,
-      const VideoStreamEncoder::AdaptCounts& quality_counts);
-  void OnCpuAdaptationChanged(
-      const VideoStreamEncoder::AdaptCounts& cpu_counts,
-      const VideoStreamEncoder::AdaptCounts& quality_counts);
-  void OnQualityAdaptationChanged(
-      const VideoStreamEncoder::AdaptCounts& cpu_counts,
-      const VideoStreamEncoder::AdaptCounts& quality_counts);
-
-  void OnEncoderStatsUpdate(uint32_t framerate, uint32_t bitrate);
-  void OnSuspendChange(bool is_suspended);
-  void OnInactiveSsrc(uint32_t ssrc);
-
-  // Used to indicate change in content type, which may require a change in
-  // how stats are collected and set the configured preferred media bitrate.
-  void OnEncoderReconfigured(const VideoEncoderConfig& encoder_config,
-                             uint32_t preferred_bitrate_bps);
-
-  // Used to update the encoder target rate.
-  void OnSetEncoderTargetRate(uint32_t bitrate_bps);
-
-  // Implements CpuOveruseMetricsObserver.
-  void OnEncodedFrameTimeMeasured(int encode_time_ms,
-                                  const CpuOveruseMetrics& metrics) override;
-
-  int GetSendFrameRate() const;
-
- protected:
-  // From RtcpStatisticsCallback.
-  void StatisticsUpdated(const RtcpStatistics& statistics,
-                         uint32_t ssrc) override;
-  void CNameChanged(const char* cname, uint32_t ssrc) override;
-  // From RtcpPacketTypeCounterObserver.
-  void RtcpPacketTypesCounterUpdated(
-      uint32_t ssrc,
-      const RtcpPacketTypeCounter& packet_counter) override;
-  // From StreamDataCountersCallback.
-  void DataCountersUpdated(const StreamDataCounters& counters,
-                           uint32_t ssrc) override;
-
-  // From BitrateStatisticsObserver.
-  void Notify(uint32_t total_bitrate_bps,
-              uint32_t retransmit_bitrate_bps,
-              uint32_t ssrc) override;
-
-  // From FrameCountObserver.
-  void FrameCountUpdated(const FrameCounts& frame_counts,
-                         uint32_t ssrc) override;
-
-  void SendSideDelayUpdated(int avg_delay_ms,
-                            int max_delay_ms,
-                            uint32_t ssrc) override;
-
- private:
-  class SampleCounter {
-   public:
-    SampleCounter() : sum(0), num_samples(0) {}
-    ~SampleCounter() {}
-    void Add(int sample);
-    int Avg(int64_t min_required_samples) const;
-
-   private:
-    int64_t sum;
-    int64_t num_samples;
-  };
-  class BoolSampleCounter {
-   public:
-    BoolSampleCounter() : sum(0), num_samples(0) {}
-    ~BoolSampleCounter() {}
-    void Add(bool sample);
-    void Add(bool sample, int64_t count);
-    int Percent(int64_t min_required_samples) const;
-    int Permille(int64_t min_required_samples) const;
-
-   private:
-    int Fraction(int64_t min_required_samples, float multiplier) const;
-    int64_t sum;
-    int64_t num_samples;
-  };
-  struct StatsUpdateTimes {
-    StatsUpdateTimes() : resolution_update_ms(0), bitrate_update_ms(0) {}
-    int64_t resolution_update_ms;
-    int64_t bitrate_update_ms;
-  };
-  struct TargetRateUpdates {
-    TargetRateUpdates()
-        : pause_resume_events(0), last_paused_or_resumed(false), last_ms(-1) {}
-    int pause_resume_events;
-    bool last_paused_or_resumed;
-    int64_t last_ms;
-  };
-  struct StatsTimer {
-    void Start(int64_t now_ms);
-    void Stop(int64_t now_ms);
-    void Restart(int64_t now_ms);
-    int64_t start_ms = -1;
-    int64_t total_ms = 0;
-  };
-  struct QpCounters {
-    SampleCounter vp8;   // QP range: 0-127.
-    SampleCounter vp9;   // QP range: 0-255.
-    SampleCounter h264;  // QP range: 0-51.
-  };
-  void PurgeOldStats() RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_);
-  VideoSendStream::StreamStats* GetStatsEntry(uint32_t ssrc)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_);
-
-  void SetAdaptTimer(const VideoStreamEncoder::AdaptCounts& counts,
-                     StatsTimer* timer) RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_);
-  void UpdateAdaptationStats(
-      const VideoStreamEncoder::AdaptCounts& cpu_counts,
-      const VideoStreamEncoder::AdaptCounts& quality_counts)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_);
-
-  Clock* const clock_;
-  const std::string payload_name_;
-  const VideoSendStream::Config::Rtp rtp_config_;
-  rtc::CriticalSection crit_;
-  VideoEncoderConfig::ContentType content_type_ RTC_GUARDED_BY(crit_);
-  const int64_t start_ms_;
-  VideoSendStream::Stats stats_ RTC_GUARDED_BY(crit_);
-  uint32_t last_sent_frame_timestamp_ RTC_GUARDED_BY(crit_);
-  std::map<uint32_t, StatsUpdateTimes> update_times_ RTC_GUARDED_BY(crit_);
-  rtc::ExpFilter encode_time_ RTC_GUARDED_BY(crit_);
-  int quality_downscales_ RTC_GUARDED_BY(crit_);
-  int cpu_downscales_ RTC_GUARDED_BY(crit_);
-
-  // Contains stats used for UMA histograms. These stats will be reset if
-  // content type changes between real-time video and screenshare, since these
-  // will be reported separately.
-  struct UmaSamplesContainer {
-    UmaSamplesContainer(const char* prefix,
-                        const VideoSendStream::Stats& start_stats,
-                        Clock* clock);
-    ~UmaSamplesContainer();
-
-    void UpdateHistograms(const VideoSendStream::Config::Rtp& rtp_config,
-                          const VideoSendStream::Stats& current_stats);
-
-    void InitializeBitrateCounters(const VideoSendStream::Stats& stats);
-
-    const std::string uma_prefix_;
-    Clock* const clock_;
-    int max_sent_width_per_timestamp_;
-    int max_sent_height_per_timestamp_;
-    SampleCounter input_width_counter_;
-    SampleCounter input_height_counter_;
-    SampleCounter sent_width_counter_;
-    SampleCounter sent_height_counter_;
-    SampleCounter encode_time_counter_;
-    BoolSampleCounter key_frame_counter_;
-    BoolSampleCounter quality_limited_frame_counter_;
-    SampleCounter quality_downscales_counter_;
-    BoolSampleCounter cpu_limited_frame_counter_;
-    BoolSampleCounter bw_limited_frame_counter_;
-    SampleCounter bw_resolutions_disabled_counter_;
-    SampleCounter delay_counter_;
-    SampleCounter max_delay_counter_;
-    rtc::RateTracker input_frame_rate_tracker_;
-    RateCounter input_fps_counter_;
-    RateCounter sent_fps_counter_;
-    RateAccCounter total_byte_counter_;
-    RateAccCounter media_byte_counter_;
-    RateAccCounter rtx_byte_counter_;
-    RateAccCounter padding_byte_counter_;
-    RateAccCounter retransmit_byte_counter_;
-    RateAccCounter fec_byte_counter_;
-    int64_t first_rtcp_stats_time_ms_;
-    int64_t first_rtp_stats_time_ms_;
-    StatsTimer cpu_adapt_timer_;
-    StatsTimer quality_adapt_timer_;
-    BoolSampleCounter paused_time_counter_;
-    TargetRateUpdates target_rate_updates_;
-    ReportBlockStats report_block_stats_;
-    const VideoSendStream::Stats start_stats_;
-
-    std::map<int, QpCounters>
-        qp_counters_;  // QP counters mapped by spatial idx.
-  };
-
-  std::unique_ptr<UmaSamplesContainer> uma_container_ RTC_GUARDED_BY(crit_);
-};
-
-}  // namespace webrtc
-#endif  // WEBRTC_VIDEO_SEND_STATISTICS_PROXY_H_
diff --git a/video/send_statistics_proxy_unittest.cc b/video/send_statistics_proxy_unittest.cc
deleted file mode 100644
index de42fe8..0000000
--- a/video/send_statistics_proxy_unittest.cc
+++ /dev/null
@@ -1,1802 +0,0 @@
-/*
- *  Copyright (c) 2013 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/video/send_statistics_proxy.h"
-
-#include <map>
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "webrtc/system_wrappers/include/metrics.h"
-#include "webrtc/system_wrappers/include/metrics_default.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-namespace {
-const uint32_t kFirstSsrc = 17;
-const uint32_t kSecondSsrc = 42;
-const uint32_t kFirstRtxSsrc = 18;
-const uint32_t kSecondRtxSsrc = 43;
-const uint32_t kFlexFecSsrc = 55;
-const int kFpsPeriodicIntervalMs = 2000;
-const int kWidth = 640;
-const int kHeight = 480;
-const int kQpIdx0 = 21;
-const int kQpIdx1 = 39;
-const CodecSpecificInfo kDefaultCodecInfo = []() {
-  CodecSpecificInfo codec_info;
-  codec_info.codecType = kVideoCodecVP8;
-  codec_info.codecSpecific.VP8.simulcastIdx = 0;
-  return codec_info;
-}();
-}  // namespace
-
-class SendStatisticsProxyTest : public ::testing::Test {
- public:
-  SendStatisticsProxyTest()
-      : fake_clock_(1234), config_(GetTestConfig()), avg_delay_ms_(0),
-        max_delay_ms_(0) {}
-  virtual ~SendStatisticsProxyTest() {}
-
- protected:
-  virtual void SetUp() {
-    metrics::Reset();
-    statistics_proxy_.reset(new SendStatisticsProxy(
-        &fake_clock_, GetTestConfig(),
-        VideoEncoderConfig::ContentType::kRealtimeVideo));
-    expected_ = VideoSendStream::Stats();
-    for (const auto& ssrc : config_.rtp.ssrcs)
-      expected_.substreams[ssrc].is_rtx = false;
-    for (const auto& ssrc : config_.rtp.rtx.ssrcs)
-      expected_.substreams[ssrc].is_rtx = true;
-  }
-
-  VideoSendStream::Config GetTestConfig() {
-    VideoSendStream::Config config(nullptr);
-    config.rtp.ssrcs.push_back(kFirstSsrc);
-    config.rtp.ssrcs.push_back(kSecondSsrc);
-    config.rtp.rtx.ssrcs.push_back(kFirstRtxSsrc);
-    config.rtp.rtx.ssrcs.push_back(kSecondRtxSsrc);
-    config.rtp.ulpfec.red_payload_type = 17;
-    return config;
-  }
-
-  VideoSendStream::Config GetTestConfigWithFlexFec() {
-    VideoSendStream::Config config(nullptr);
-    config.rtp.ssrcs.push_back(kFirstSsrc);
-    config.rtp.ssrcs.push_back(kSecondSsrc);
-    config.rtp.rtx.ssrcs.push_back(kFirstRtxSsrc);
-    config.rtp.rtx.ssrcs.push_back(kSecondRtxSsrc);
-    config.rtp.flexfec.payload_type = 50;
-    config.rtp.flexfec.ssrc = kFlexFecSsrc;
-    return config;
-  }
-
-  VideoSendStream::StreamStats GetStreamStats(uint32_t ssrc) {
-    VideoSendStream::Stats stats = statistics_proxy_->GetStats();
-    std::map<uint32_t, VideoSendStream::StreamStats>::iterator it =
-        stats.substreams.find(ssrc);
-    EXPECT_NE(it, stats.substreams.end());
-    return it->second;
-  }
-
-  void UpdateDataCounters(uint32_t ssrc) {
-    StreamDataCountersCallback* proxy =
-        static_cast<StreamDataCountersCallback*>(statistics_proxy_.get());
-    StreamDataCounters counters;
-    proxy->DataCountersUpdated(counters, ssrc);
-  }
-
-  void ExpectEqual(VideoSendStream::Stats one, VideoSendStream::Stats other) {
-    EXPECT_EQ(one.input_frame_rate, other.input_frame_rate);
-    EXPECT_EQ(one.encode_frame_rate, other.encode_frame_rate);
-    EXPECT_EQ(one.media_bitrate_bps, other.media_bitrate_bps);
-    EXPECT_EQ(one.preferred_media_bitrate_bps,
-              other.preferred_media_bitrate_bps);
-    EXPECT_EQ(one.suspended, other.suspended);
-
-    EXPECT_EQ(one.substreams.size(), other.substreams.size());
-    for (std::map<uint32_t, VideoSendStream::StreamStats>::const_iterator it =
-             one.substreams.begin();
-         it != one.substreams.end(); ++it) {
-      std::map<uint32_t, VideoSendStream::StreamStats>::const_iterator
-          corresponding_it = other.substreams.find(it->first);
-      ASSERT_TRUE(corresponding_it != other.substreams.end());
-      const VideoSendStream::StreamStats& a = it->second;
-      const VideoSendStream::StreamStats& b = corresponding_it->second;
-
-      EXPECT_EQ(a.is_rtx, b.is_rtx);
-      EXPECT_EQ(a.frame_counts.key_frames, b.frame_counts.key_frames);
-      EXPECT_EQ(a.frame_counts.delta_frames, b.frame_counts.delta_frames);
-      EXPECT_EQ(a.total_bitrate_bps, b.total_bitrate_bps);
-      EXPECT_EQ(a.avg_delay_ms, b.avg_delay_ms);
-      EXPECT_EQ(a.max_delay_ms, b.max_delay_ms);
-
-      EXPECT_EQ(a.rtp_stats.transmitted.payload_bytes,
-                b.rtp_stats.transmitted.payload_bytes);
-      EXPECT_EQ(a.rtp_stats.transmitted.header_bytes,
-                b.rtp_stats.transmitted.header_bytes);
-      EXPECT_EQ(a.rtp_stats.transmitted.padding_bytes,
-                b.rtp_stats.transmitted.padding_bytes);
-      EXPECT_EQ(a.rtp_stats.transmitted.packets,
-                b.rtp_stats.transmitted.packets);
-      EXPECT_EQ(a.rtp_stats.retransmitted.packets,
-                b.rtp_stats.retransmitted.packets);
-      EXPECT_EQ(a.rtp_stats.fec.packets, b.rtp_stats.fec.packets);
-
-      EXPECT_EQ(a.rtcp_stats.fraction_lost, b.rtcp_stats.fraction_lost);
-      EXPECT_EQ(a.rtcp_stats.packets_lost, b.rtcp_stats.packets_lost);
-      EXPECT_EQ(a.rtcp_stats.extended_highest_sequence_number,
-                b.rtcp_stats.extended_highest_sequence_number);
-      EXPECT_EQ(a.rtcp_stats.jitter, b.rtcp_stats.jitter);
-    }
-  }
-
-  SimulatedClock fake_clock_;
-  std::unique_ptr<SendStatisticsProxy> statistics_proxy_;
-  VideoSendStream::Config config_;
-  int avg_delay_ms_;
-  int max_delay_ms_;
-  VideoSendStream::Stats expected_;
-  typedef std::map<uint32_t, VideoSendStream::StreamStats>::const_iterator
-      StreamIterator;
-};
-
-TEST_F(SendStatisticsProxyTest, RtcpStatistics) {
-  RtcpStatisticsCallback* callback = statistics_proxy_.get();
-  for (const auto& ssrc : config_.rtp.ssrcs) {
-    VideoSendStream::StreamStats& ssrc_stats = expected_.substreams[ssrc];
-
-    // Add statistics with some arbitrary, but unique, numbers.
-    uint32_t offset = ssrc * sizeof(RtcpStatistics);
-    ssrc_stats.rtcp_stats.packets_lost = offset;
-    ssrc_stats.rtcp_stats.extended_highest_sequence_number = offset + 1;
-    ssrc_stats.rtcp_stats.fraction_lost = offset + 2;
-    ssrc_stats.rtcp_stats.jitter = offset + 3;
-    callback->StatisticsUpdated(ssrc_stats.rtcp_stats, ssrc);
-  }
-  for (const auto& ssrc : config_.rtp.rtx.ssrcs) {
-    VideoSendStream::StreamStats& ssrc_stats = expected_.substreams[ssrc];
-
-    // Add statistics with some arbitrary, but unique, numbers.
-    uint32_t offset = ssrc * sizeof(RtcpStatistics);
-    ssrc_stats.rtcp_stats.packets_lost = offset;
-    ssrc_stats.rtcp_stats.extended_highest_sequence_number = offset + 1;
-    ssrc_stats.rtcp_stats.fraction_lost = offset + 2;
-    ssrc_stats.rtcp_stats.jitter = offset + 3;
-    callback->StatisticsUpdated(ssrc_stats.rtcp_stats, ssrc);
-  }
-  VideoSendStream::Stats stats = statistics_proxy_->GetStats();
-  ExpectEqual(expected_, stats);
-}
-
-TEST_F(SendStatisticsProxyTest, EncodedBitrateAndFramerate) {
-  int media_bitrate_bps = 500;
-  int encode_fps = 29;
-
-  statistics_proxy_->OnEncoderStatsUpdate(encode_fps, media_bitrate_bps);
-
-  VideoSendStream::Stats stats = statistics_proxy_->GetStats();
-  EXPECT_EQ(media_bitrate_bps, stats.media_bitrate_bps);
-  EXPECT_EQ(encode_fps, stats.encode_frame_rate);
-}
-
-TEST_F(SendStatisticsProxyTest, Suspended) {
-  // Verify that the value is false by default.
-  EXPECT_FALSE(statistics_proxy_->GetStats().suspended);
-
-  // Verify that we can set it to true.
-  statistics_proxy_->OnSuspendChange(true);
-  EXPECT_TRUE(statistics_proxy_->GetStats().suspended);
-
-  // Verify that we can set it back to false again.
-  statistics_proxy_->OnSuspendChange(false);
-  EXPECT_FALSE(statistics_proxy_->GetStats().suspended);
-}
-
-TEST_F(SendStatisticsProxyTest, FrameCounts) {
-  FrameCountObserver* observer = statistics_proxy_.get();
-  for (const auto& ssrc : config_.rtp.ssrcs) {
-    // Add statistics with some arbitrary, but unique, numbers.
-    VideoSendStream::StreamStats& stats = expected_.substreams[ssrc];
-    uint32_t offset = ssrc * sizeof(VideoSendStream::StreamStats);
-    FrameCounts frame_counts;
-    frame_counts.key_frames = offset;
-    frame_counts.delta_frames = offset + 1;
-    stats.frame_counts = frame_counts;
-    observer->FrameCountUpdated(frame_counts, ssrc);
-  }
-  for (const auto& ssrc : config_.rtp.rtx.ssrcs) {
-    // Add statistics with some arbitrary, but unique, numbers.
-    VideoSendStream::StreamStats& stats = expected_.substreams[ssrc];
-    uint32_t offset = ssrc * sizeof(VideoSendStream::StreamStats);
-    FrameCounts frame_counts;
-    frame_counts.key_frames = offset;
-    frame_counts.delta_frames = offset + 1;
-    stats.frame_counts = frame_counts;
-    observer->FrameCountUpdated(frame_counts, ssrc);
-  }
-
-  VideoSendStream::Stats stats = statistics_proxy_->GetStats();
-  ExpectEqual(expected_, stats);
-}
-
-TEST_F(SendStatisticsProxyTest, DataCounters) {
-  StreamDataCountersCallback* callback = statistics_proxy_.get();
-  for (const auto& ssrc : config_.rtp.ssrcs) {
-    StreamDataCounters& counters = expected_.substreams[ssrc].rtp_stats;
-    // Add statistics with some arbitrary, but unique, numbers.
-    size_t offset = ssrc * sizeof(StreamDataCounters);
-    uint32_t offset_uint32 = static_cast<uint32_t>(offset);
-    counters.transmitted.payload_bytes = offset;
-    counters.transmitted.header_bytes = offset + 1;
-    counters.fec.packets = offset_uint32 + 2;
-    counters.transmitted.padding_bytes = offset + 3;
-    counters.retransmitted.packets = offset_uint32 + 4;
-    counters.transmitted.packets = offset_uint32 + 5;
-    callback->DataCountersUpdated(counters, ssrc);
-  }
-  for (const auto& ssrc : config_.rtp.rtx.ssrcs) {
-    StreamDataCounters& counters = expected_.substreams[ssrc].rtp_stats;
-    // Add statistics with some arbitrary, but unique, numbers.
-    size_t offset = ssrc * sizeof(StreamDataCounters);
-    uint32_t offset_uint32 = static_cast<uint32_t>(offset);
-    counters.transmitted.payload_bytes = offset;
-    counters.transmitted.header_bytes = offset + 1;
-    counters.fec.packets = offset_uint32 + 2;
-    counters.transmitted.padding_bytes = offset + 3;
-    counters.retransmitted.packets = offset_uint32 + 4;
-    counters.transmitted.packets = offset_uint32 + 5;
-    callback->DataCountersUpdated(counters, ssrc);
-  }
-
-  VideoSendStream::Stats stats = statistics_proxy_->GetStats();
-  ExpectEqual(expected_, stats);
-}
-
-TEST_F(SendStatisticsProxyTest, Bitrate) {
-  BitrateStatisticsObserver* observer = statistics_proxy_.get();
-  for (const auto& ssrc : config_.rtp.ssrcs) {
-    uint32_t total;
-    uint32_t retransmit;
-    // Use ssrc as bitrate_bps to get a unique value for each stream.
-    total = ssrc;
-    retransmit = ssrc + 1;
-    observer->Notify(total, retransmit, ssrc);
-    expected_.substreams[ssrc].total_bitrate_bps = total;
-    expected_.substreams[ssrc].retransmit_bitrate_bps = retransmit;
-  }
-  for (const auto& ssrc : config_.rtp.rtx.ssrcs) {
-    uint32_t total;
-    uint32_t retransmit;
-    // Use ssrc as bitrate_bps to get a unique value for each stream.
-    total = ssrc;
-    retransmit = ssrc + 1;
-    observer->Notify(total, retransmit, ssrc);
-    expected_.substreams[ssrc].total_bitrate_bps = total;
-    expected_.substreams[ssrc].retransmit_bitrate_bps = retransmit;
-  }
-
-  VideoSendStream::Stats stats = statistics_proxy_->GetStats();
-  ExpectEqual(expected_, stats);
-}
-
-TEST_F(SendStatisticsProxyTest, SendSideDelay) {
-  SendSideDelayObserver* observer = statistics_proxy_.get();
-  for (const auto& ssrc : config_.rtp.ssrcs) {
-    // Use ssrc as avg_delay_ms and max_delay_ms to get a unique value for each
-    // stream.
-    int avg_delay_ms = ssrc;
-    int max_delay_ms = ssrc + 1;
-    observer->SendSideDelayUpdated(avg_delay_ms, max_delay_ms, ssrc);
-    expected_.substreams[ssrc].avg_delay_ms = avg_delay_ms;
-    expected_.substreams[ssrc].max_delay_ms = max_delay_ms;
-  }
-  for (const auto& ssrc : config_.rtp.rtx.ssrcs) {
-    // Use ssrc as avg_delay_ms and max_delay_ms to get a unique value for each
-    // stream.
-    int avg_delay_ms = ssrc;
-    int max_delay_ms = ssrc + 1;
-    observer->SendSideDelayUpdated(avg_delay_ms, max_delay_ms, ssrc);
-    expected_.substreams[ssrc].avg_delay_ms = avg_delay_ms;
-    expected_.substreams[ssrc].max_delay_ms = max_delay_ms;
-  }
-  VideoSendStream::Stats stats = statistics_proxy_->GetStats();
-  ExpectEqual(expected_, stats);
-}
-
-TEST_F(SendStatisticsProxyTest, OnEncodedFrameTimeMeasured) {
-  const int kEncodeTimeMs = 11;
-  CpuOveruseMetrics metrics;
-  metrics.encode_usage_percent = 80;
-  statistics_proxy_->OnEncodedFrameTimeMeasured(kEncodeTimeMs, metrics);
-
-  VideoSendStream::Stats stats = statistics_proxy_->GetStats();
-  EXPECT_EQ(kEncodeTimeMs, stats.avg_encode_time_ms);
-  EXPECT_EQ(metrics.encode_usage_percent, stats.encode_usage_percent);
-}
-
-TEST_F(SendStatisticsProxyTest, OnEncoderReconfiguredChangePreferredBitrate) {
-  VideoSendStream::Stats stats = statistics_proxy_->GetStats();
-  EXPECT_EQ(0, stats.preferred_media_bitrate_bps);
-  const int kPreferredMediaBitrateBps = 50;
-
-  VideoEncoderConfig config;
-  statistics_proxy_->OnEncoderReconfigured(config, kPreferredMediaBitrateBps);
-  stats = statistics_proxy_->GetStats();
-  EXPECT_EQ(kPreferredMediaBitrateBps, stats.preferred_media_bitrate_bps);
-}
-
-TEST_F(SendStatisticsProxyTest, OnSendEncodedImageIncreasesFramesEncoded) {
-  EncodedImage encoded_image;
-  CodecSpecificInfo codec_info;
-  EXPECT_EQ(0u, statistics_proxy_->GetStats().frames_encoded);
-  for (uint32_t i = 1; i <= 3; ++i) {
-    statistics_proxy_->OnSendEncodedImage(encoded_image, &codec_info);
-    EXPECT_EQ(i, statistics_proxy_->GetStats().frames_encoded);
-  }
-}
-
-TEST_F(SendStatisticsProxyTest, OnSendEncodedImageIncreasesQpSum) {
-  EncodedImage encoded_image;
-  CodecSpecificInfo codec_info;
-  EXPECT_EQ(rtc::Optional<uint64_t>(), statistics_proxy_->GetStats().qp_sum);
-  encoded_image.qp_ = 3;
-  statistics_proxy_->OnSendEncodedImage(encoded_image, &codec_info);
-  EXPECT_EQ(rtc::Optional<uint64_t>(3u), statistics_proxy_->GetStats().qp_sum);
-  encoded_image.qp_ = 127;
-  statistics_proxy_->OnSendEncodedImage(encoded_image, &codec_info);
-  EXPECT_EQ(rtc::Optional<uint64_t>(130u),
-            statistics_proxy_->GetStats().qp_sum);
-}
-
-TEST_F(SendStatisticsProxyTest, OnSendEncodedImageWithoutQpQpSumWontExist) {
-  EncodedImage encoded_image;
-  CodecSpecificInfo codec_info;
-  encoded_image.qp_ = -1;
-  EXPECT_EQ(rtc::Optional<uint64_t>(), statistics_proxy_->GetStats().qp_sum);
-  statistics_proxy_->OnSendEncodedImage(encoded_image, &codec_info);
-  EXPECT_EQ(rtc::Optional<uint64_t>(), statistics_proxy_->GetStats().qp_sum);
-}
-
-TEST_F(SendStatisticsProxyTest, GetCpuAdaptationStats) {
-  VideoStreamEncoder::AdaptCounts cpu_counts;
-  VideoStreamEncoder::AdaptCounts quality_counts;
-  EXPECT_FALSE(statistics_proxy_->GetStats().cpu_limited_framerate);
-  EXPECT_FALSE(statistics_proxy_->GetStats().cpu_limited_resolution);
-  cpu_counts.fps = 1;
-  cpu_counts.resolution = 0;
-  statistics_proxy_->SetAdaptationStats(cpu_counts, quality_counts);
-  EXPECT_TRUE(statistics_proxy_->GetStats().cpu_limited_framerate);
-  EXPECT_FALSE(statistics_proxy_->GetStats().cpu_limited_resolution);
-  cpu_counts.fps = 0;
-  cpu_counts.resolution = 1;
-  statistics_proxy_->SetAdaptationStats(cpu_counts, quality_counts);
-  EXPECT_FALSE(statistics_proxy_->GetStats().cpu_limited_framerate);
-  EXPECT_TRUE(statistics_proxy_->GetStats().cpu_limited_resolution);
-  cpu_counts.fps = 1;
-  cpu_counts.resolution = -1;
-  statistics_proxy_->SetAdaptationStats(cpu_counts, quality_counts);
-  EXPECT_TRUE(statistics_proxy_->GetStats().cpu_limited_framerate);
-  EXPECT_FALSE(statistics_proxy_->GetStats().cpu_limited_resolution);
-  cpu_counts.fps = -1;
-  cpu_counts.resolution = -1;
-  statistics_proxy_->SetAdaptationStats(cpu_counts, quality_counts);
-  EXPECT_FALSE(statistics_proxy_->GetStats().cpu_limited_framerate);
-  EXPECT_FALSE(statistics_proxy_->GetStats().cpu_limited_resolution);
-}
-
-TEST_F(SendStatisticsProxyTest, GetQualityAdaptationStats) {
-  VideoStreamEncoder::AdaptCounts cpu_counts;
-  VideoStreamEncoder::AdaptCounts quality_counts;
-  EXPECT_FALSE(statistics_proxy_->GetStats().bw_limited_framerate);
-  EXPECT_FALSE(statistics_proxy_->GetStats().bw_limited_resolution);
-  quality_counts.fps = 1;
-  quality_counts.resolution = 0;
-  statistics_proxy_->SetAdaptationStats(cpu_counts, quality_counts);
-  EXPECT_TRUE(statistics_proxy_->GetStats().bw_limited_framerate);
-  EXPECT_FALSE(statistics_proxy_->GetStats().bw_limited_resolution);
-  quality_counts.fps = 0;
-  quality_counts.resolution = 1;
-  statistics_proxy_->SetAdaptationStats(cpu_counts, quality_counts);
-  EXPECT_FALSE(statistics_proxy_->GetStats().bw_limited_framerate);
-  EXPECT_TRUE(statistics_proxy_->GetStats().bw_limited_resolution);
-  quality_counts.fps = 1;
-  quality_counts.resolution = -1;
-  statistics_proxy_->SetAdaptationStats(cpu_counts, quality_counts);
-  EXPECT_TRUE(statistics_proxy_->GetStats().bw_limited_framerate);
-  EXPECT_FALSE(statistics_proxy_->GetStats().bw_limited_resolution);
-  quality_counts.fps = -1;
-  quality_counts.resolution = -1;
-  statistics_proxy_->SetAdaptationStats(cpu_counts, quality_counts);
-  EXPECT_FALSE(statistics_proxy_->GetStats().bw_limited_framerate);
-  EXPECT_FALSE(statistics_proxy_->GetStats().bw_limited_resolution);
-}
-
-TEST_F(SendStatisticsProxyTest, GetStatsReportsCpuAdaptChanges) {
-  VideoStreamEncoder::AdaptCounts cpu_counts;
-  VideoStreamEncoder::AdaptCounts quality_counts;
-  EXPECT_EQ(0, statistics_proxy_->GetStats().number_of_cpu_adapt_changes);
-
-  cpu_counts.resolution = 1;
-  statistics_proxy_->OnCpuAdaptationChanged(cpu_counts, quality_counts);
-  EXPECT_FALSE(statistics_proxy_->GetStats().cpu_limited_framerate);
-  EXPECT_TRUE(statistics_proxy_->GetStats().cpu_limited_resolution);
-  EXPECT_EQ(1, statistics_proxy_->GetStats().number_of_cpu_adapt_changes);
-
-  cpu_counts.resolution = 2;
-  statistics_proxy_->OnCpuAdaptationChanged(cpu_counts, quality_counts);
-  EXPECT_FALSE(statistics_proxy_->GetStats().cpu_limited_framerate);
-  EXPECT_TRUE(statistics_proxy_->GetStats().cpu_limited_resolution);
-  EXPECT_EQ(2, statistics_proxy_->GetStats().number_of_cpu_adapt_changes);
-  EXPECT_EQ(0, statistics_proxy_->GetStats().number_of_quality_adapt_changes);
-}
-
-TEST_F(SendStatisticsProxyTest, GetStatsReportsQualityAdaptChanges) {
-  VideoStreamEncoder::AdaptCounts cpu_counts;
-  VideoStreamEncoder::AdaptCounts quality_counts;
-  EXPECT_EQ(0, statistics_proxy_->GetStats().number_of_quality_adapt_changes);
-
-  quality_counts.fps = 1;
-  statistics_proxy_->OnQualityAdaptationChanged(cpu_counts, quality_counts);
-  EXPECT_TRUE(statistics_proxy_->GetStats().bw_limited_framerate);
-  EXPECT_FALSE(statistics_proxy_->GetStats().bw_limited_resolution);
-  EXPECT_EQ(1, statistics_proxy_->GetStats().number_of_quality_adapt_changes);
-
-  quality_counts.fps = 0;
-  statistics_proxy_->OnQualityAdaptationChanged(cpu_counts, quality_counts);
-  EXPECT_FALSE(statistics_proxy_->GetStats().bw_limited_framerate);
-  EXPECT_FALSE(statistics_proxy_->GetStats().bw_limited_resolution);
-  EXPECT_EQ(2, statistics_proxy_->GetStats().number_of_quality_adapt_changes);
-  EXPECT_EQ(0, statistics_proxy_->GetStats().number_of_cpu_adapt_changes);
-}
-
-TEST_F(SendStatisticsProxyTest, AdaptChangesNotReported_AdaptationNotEnabled) {
-  // First RTP packet sent.
-  UpdateDataCounters(kFirstSsrc);
-  // Min runtime has passed.
-  fake_clock_.AdvanceTimeMilliseconds(metrics::kMinRunTimeInSeconds * 1000);
-  statistics_proxy_.reset();
-  EXPECT_EQ(0, metrics::NumSamples("WebRTC.Video.AdaptChangesPerMinute.Cpu"));
-  EXPECT_EQ(0,
-            metrics::NumSamples("WebRTC.Video.AdaptChangesPerMinute.Quality"));
-}
-
-TEST_F(SendStatisticsProxyTest, AdaptChangesNotReported_MinRuntimeNotPassed) {
-  // First RTP packet sent.
-  UpdateDataCounters(kFirstSsrc);
-  // Enable adaptation.
-  VideoStreamEncoder::AdaptCounts cpu_counts;
-  VideoStreamEncoder::AdaptCounts quality_counts;
-  statistics_proxy_->SetAdaptationStats(cpu_counts, quality_counts);
-  // Min runtime has not passed.
-  fake_clock_.AdvanceTimeMilliseconds(metrics::kMinRunTimeInSeconds * 1000 - 1);
-  statistics_proxy_.reset();
-  EXPECT_EQ(0, metrics::NumSamples("WebRTC.Video.AdaptChangesPerMinute.Cpu"));
-  EXPECT_EQ(0,
-            metrics::NumSamples("WebRTC.Video.AdaptChangesPerMinute.Quality"));
-}
-
-TEST_F(SendStatisticsProxyTest, ZeroAdaptChangesReported) {
-  // First RTP packet sent.
-  UpdateDataCounters(kFirstSsrc);
-  // Enable adaptation.
-  VideoStreamEncoder::AdaptCounts cpu_counts;
-  VideoStreamEncoder::AdaptCounts quality_counts;
-  statistics_proxy_->SetAdaptationStats(cpu_counts, quality_counts);
-  // Min runtime has passed.
-  fake_clock_.AdvanceTimeMilliseconds(metrics::kMinRunTimeInSeconds * 1000);
-  statistics_proxy_.reset();
-  EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.AdaptChangesPerMinute.Cpu"));
-  EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.AdaptChangesPerMinute.Cpu", 0));
-  EXPECT_EQ(1,
-            metrics::NumSamples("WebRTC.Video.AdaptChangesPerMinute.Quality"));
-  EXPECT_EQ(
-      1, metrics::NumEvents("WebRTC.Video.AdaptChangesPerMinute.Quality", 0));
-}
-
-TEST_F(SendStatisticsProxyTest, CpuAdaptChangesReported) {
-  // First RTP packet sent.
-  UpdateDataCounters(kFirstSsrc);
-  // Enable adaptation.
-  VideoStreamEncoder::AdaptCounts cpu_counts;
-  VideoStreamEncoder::AdaptCounts quality_counts;
-  statistics_proxy_->SetAdaptationStats(cpu_counts, quality_counts);
-  // Adapt changes: 1, elapsed time: 10 sec => 6 per minute.
-  statistics_proxy_->OnCpuAdaptationChanged(cpu_counts, quality_counts);
-  fake_clock_.AdvanceTimeMilliseconds(10000);
-  statistics_proxy_.reset();
-  EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.AdaptChangesPerMinute.Cpu"));
-  EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.AdaptChangesPerMinute.Cpu", 6));
-}
-
-TEST_F(SendStatisticsProxyTest, AdaptChangesStatsExcludesDisabledTime) {
-  // First RTP packet sent.
-  UpdateDataCounters(kFirstSsrc);
-
-  // Disable quality adaptation.
-  VideoStreamEncoder::AdaptCounts cpu_counts;
-  VideoStreamEncoder::AdaptCounts quality_counts;
-  quality_counts.fps = -1;
-  quality_counts.resolution = -1;
-  statistics_proxy_->SetAdaptationStats(cpu_counts, quality_counts);
-  fake_clock_.AdvanceTimeMilliseconds(10000);
-
-  // Enable quality adaptation.
-  // Adapt changes: 2, elapsed time: 20 sec.
-  quality_counts.fps = 0;
-  statistics_proxy_->SetAdaptationStats(cpu_counts, quality_counts);
-  fake_clock_.AdvanceTimeMilliseconds(5000);
-  statistics_proxy_->SetAdaptationStats(cpu_counts, quality_counts);
-  fake_clock_.AdvanceTimeMilliseconds(9000);
-  statistics_proxy_->OnQualityAdaptationChanged(cpu_counts, quality_counts);
-  fake_clock_.AdvanceTimeMilliseconds(6000);
-  statistics_proxy_->OnQualityAdaptationChanged(cpu_counts, quality_counts);
-
-  // Disable quality adaptation.
-  quality_counts.fps = -1;
-  statistics_proxy_->SetAdaptationStats(cpu_counts, quality_counts);
-  fake_clock_.AdvanceTimeMilliseconds(30000);
-
-  // Enable quality adaptation.
-  // Adapt changes: 1, elapsed time: 10 sec.
-  quality_counts.resolution = 0;
-  statistics_proxy_->SetAdaptationStats(cpu_counts, quality_counts);
-  statistics_proxy_->OnQualityAdaptationChanged(cpu_counts, quality_counts);
-  fake_clock_.AdvanceTimeMilliseconds(10000);
-
-  // Disable quality adaptation.
-  quality_counts.resolution = -1;
-  statistics_proxy_->SetAdaptationStats(cpu_counts, quality_counts);
-  fake_clock_.AdvanceTimeMilliseconds(5000);
-  statistics_proxy_->SetAdaptationStats(cpu_counts, quality_counts);
-  fake_clock_.AdvanceTimeMilliseconds(20000);
-
-  // Adapt changes: 3, elapsed time: 30 sec => 6 per minute.
-  statistics_proxy_.reset();
-  EXPECT_EQ(1,
-            metrics::NumSamples("WebRTC.Video.AdaptChangesPerMinute.Quality"));
-  EXPECT_EQ(
-      1, metrics::NumEvents("WebRTC.Video.AdaptChangesPerMinute.Quality", 6));
-}
-
-TEST_F(SendStatisticsProxyTest,
-       AdaptChangesNotReported_ScalingNotEnabledVideoResumed) {
-  // First RTP packet sent.
-  UpdateDataCounters(kFirstSsrc);
-
-  // Suspend and resume video.
-  statistics_proxy_->OnSuspendChange(true);
-  fake_clock_.AdvanceTimeMilliseconds(5000);
-  statistics_proxy_->OnSuspendChange(false);
-
-  // Min runtime has passed but scaling not enabled.
-  fake_clock_.AdvanceTimeMilliseconds(metrics::kMinRunTimeInSeconds * 1000);
-  statistics_proxy_.reset();
-  EXPECT_EQ(0, metrics::NumSamples("WebRTC.Video.AdaptChangesPerMinute.Cpu"));
-  EXPECT_EQ(0,
-            metrics::NumSamples("WebRTC.Video.AdaptChangesPerMinute.Quality"));
-}
-
-TEST_F(SendStatisticsProxyTest, QualityAdaptChangesStatsExcludesSuspendedTime) {
-  // First RTP packet sent.
-  UpdateDataCounters(kFirstSsrc);
-
-  // Enable adaptation.
-  VideoStreamEncoder::AdaptCounts cpu_counts;
-  VideoStreamEncoder::AdaptCounts quality_counts;
-  // Adapt changes: 2, elapsed time: 20 sec.
-  statistics_proxy_->SetAdaptationStats(cpu_counts, quality_counts);
-  fake_clock_.AdvanceTimeMilliseconds(20000);
-  statistics_proxy_->OnQualityAdaptationChanged(cpu_counts, quality_counts);
-  statistics_proxy_->OnQualityAdaptationChanged(cpu_counts, quality_counts);
-
-  // Suspend and resume video.
-  statistics_proxy_->OnSuspendChange(true);
-  fake_clock_.AdvanceTimeMilliseconds(30000);
-  statistics_proxy_->OnSuspendChange(false);
-
-  // Adapt changes: 1, elapsed time: 10 sec.
-  statistics_proxy_->OnQualityAdaptationChanged(cpu_counts, quality_counts);
-  fake_clock_.AdvanceTimeMilliseconds(10000);
-
-  // Adapt changes: 3, elapsed time: 30 sec => 6 per minute.
-  statistics_proxy_.reset();
-  EXPECT_EQ(1,
-            metrics::NumSamples("WebRTC.Video.AdaptChangesPerMinute.Quality"));
-  EXPECT_EQ(
-      1, metrics::NumEvents("WebRTC.Video.AdaptChangesPerMinute.Quality", 6));
-}
-
-TEST_F(SendStatisticsProxyTest, CpuAdaptChangesStatsExcludesSuspendedTime) {
-  // First RTP packet sent.
-  UpdateDataCounters(kFirstSsrc);
-
-  // Video not suspended.
-  statistics_proxy_->OnSuspendChange(false);
-  fake_clock_.AdvanceTimeMilliseconds(30000);
-
-  // Enable adaptation.
-  VideoStreamEncoder::AdaptCounts cpu_counts;
-  VideoStreamEncoder::AdaptCounts quality_counts;
-  // Adapt changes: 1, elapsed time: 20 sec.
-  statistics_proxy_->SetAdaptationStats(cpu_counts, quality_counts);
-  fake_clock_.AdvanceTimeMilliseconds(10000);
-  statistics_proxy_->OnCpuAdaptationChanged(cpu_counts, quality_counts);
-
-  // Video not suspended, stats time already started.
-  statistics_proxy_->OnSuspendChange(false);
-  fake_clock_.AdvanceTimeMilliseconds(10000);
-
-  // Disable adaptation.
-  cpu_counts.fps = -1;
-  cpu_counts.resolution = -1;
-  statistics_proxy_->SetAdaptationStats(cpu_counts, quality_counts);
-  fake_clock_.AdvanceTimeMilliseconds(30000);
-
-  // Suspend and resume video, stats time not started when scaling not enabled.
-  statistics_proxy_->OnSuspendChange(true);
-  fake_clock_.AdvanceTimeMilliseconds(30000);
-  statistics_proxy_->OnSuspendChange(false);
-  fake_clock_.AdvanceTimeMilliseconds(30000);
-
-  // Enable adaptation.
-  // Adapt changes: 1, elapsed time: 10 sec.
-  cpu_counts.fps = 0;
-  cpu_counts.resolution = 0;
-  statistics_proxy_->SetAdaptationStats(cpu_counts, quality_counts);
-  fake_clock_.AdvanceTimeMilliseconds(10000);
-  statistics_proxy_->OnCpuAdaptationChanged(cpu_counts, quality_counts);
-
-  // Adapt changes: 2, elapsed time: 30 sec => 4 per minute.
-  statistics_proxy_.reset();
-  EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.AdaptChangesPerMinute.Cpu"));
-  EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.AdaptChangesPerMinute.Cpu", 4));
-}
-
-TEST_F(SendStatisticsProxyTest, AdaptChangesStatsNotStartedIfVideoSuspended) {
-  // First RTP packet sent.
-  UpdateDataCounters(kFirstSsrc);
-
-  // Video suspended.
-  statistics_proxy_->OnSuspendChange(true);
-
-  // Enable adaptation, stats time not started when suspended.
-  VideoStreamEncoder::AdaptCounts cpu_counts;
-  VideoStreamEncoder::AdaptCounts quality_counts;
-  statistics_proxy_->SetAdaptationStats(cpu_counts, quality_counts);
-  fake_clock_.AdvanceTimeMilliseconds(10000);
-
-  // Resume video, stats time started.
-  // Adapt changes: 1, elapsed time: 10 sec.
-  statistics_proxy_->OnSuspendChange(false);
-  fake_clock_.AdvanceTimeMilliseconds(10000);
-  statistics_proxy_->OnCpuAdaptationChanged(cpu_counts, quality_counts);
-
-  // Adapt changes: 1, elapsed time: 10 sec => 6 per minute.
-  statistics_proxy_.reset();
-  EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.AdaptChangesPerMinute.Cpu"));
-  EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.AdaptChangesPerMinute.Cpu", 6));
-}
-
-TEST_F(SendStatisticsProxyTest, AdaptChangesStatsRestartsOnFirstSentPacket) {
-  // Send first packet, adaptation enabled.
-  // Elapsed time before first packet is sent should be excluded.
-  VideoStreamEncoder::AdaptCounts cpu_counts;
-  VideoStreamEncoder::AdaptCounts quality_counts;
-  statistics_proxy_->SetAdaptationStats(cpu_counts, quality_counts);
-  fake_clock_.AdvanceTimeMilliseconds(10000);
-  UpdateDataCounters(kFirstSsrc);
-
-  // Adapt changes: 1, elapsed time: 10 sec.
-  fake_clock_.AdvanceTimeMilliseconds(10000);
-  statistics_proxy_->OnQualityAdaptationChanged(cpu_counts, quality_counts);
-  UpdateDataCounters(kFirstSsrc);
-
-  // Adapt changes: 1, elapsed time: 10 sec => 6 per minute.
-  statistics_proxy_.reset();
-  EXPECT_EQ(1,
-            metrics::NumSamples("WebRTC.Video.AdaptChangesPerMinute.Quality"));
-  EXPECT_EQ(
-      1, metrics::NumEvents("WebRTC.Video.AdaptChangesPerMinute.Quality", 6));
-}
-
-TEST_F(SendStatisticsProxyTest, AdaptChangesStatsStartedAfterFirstSentPacket) {
-  // Enable and disable adaptation.
-  VideoStreamEncoder::AdaptCounts cpu_counts;
-  VideoStreamEncoder::AdaptCounts quality_counts;
-  statistics_proxy_->SetAdaptationStats(cpu_counts, quality_counts);
-  fake_clock_.AdvanceTimeMilliseconds(60000);
-  cpu_counts.fps = -1;
-  cpu_counts.resolution = -1;
-  statistics_proxy_->SetAdaptationStats(cpu_counts, quality_counts);
-
-  // Send first packet, scaling disabled.
-  // Elapsed time before first packet is sent should be excluded.
-  UpdateDataCounters(kFirstSsrc);
-  fake_clock_.AdvanceTimeMilliseconds(60000);
-
-  // Enable adaptation.
-  cpu_counts.resolution = 0;
-  statistics_proxy_->SetAdaptationStats(cpu_counts, quality_counts);
-  fake_clock_.AdvanceTimeMilliseconds(10000);
-  UpdateDataCounters(kFirstSsrc);
-
-  // Adapt changes: 1, elapsed time: 20 sec.
-  fake_clock_.AdvanceTimeMilliseconds(10000);
-  statistics_proxy_->OnCpuAdaptationChanged(cpu_counts, quality_counts);
-
-  // Adapt changes: 1, elapsed time: 20 sec => 3 per minute.
-  statistics_proxy_.reset();
-  EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.AdaptChangesPerMinute.Cpu"));
-  EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.AdaptChangesPerMinute.Cpu", 3));
-}
-
-TEST_F(SendStatisticsProxyTest, AdaptChangesReportedAfterContentSwitch) {
-  // First RTP packet sent, cpu adaptation enabled.
-  UpdateDataCounters(kFirstSsrc);
-  VideoStreamEncoder::AdaptCounts cpu_counts;
-  VideoStreamEncoder::AdaptCounts quality_counts;
-  quality_counts.fps = -1;
-  quality_counts.resolution = -1;
-  statistics_proxy_->SetAdaptationStats(cpu_counts, quality_counts);
-
-  // Adapt changes: 2, elapsed time: 15 sec => 8 per minute.
-  statistics_proxy_->OnCpuAdaptationChanged(cpu_counts, quality_counts);
-  fake_clock_.AdvanceTimeMilliseconds(6000);
-  statistics_proxy_->OnCpuAdaptationChanged(cpu_counts, quality_counts);
-  fake_clock_.AdvanceTimeMilliseconds(9000);
-
-  // Switch content type, real-time stats should be updated.
-  VideoEncoderConfig config;
-  config.content_type = VideoEncoderConfig::ContentType::kScreen;
-  statistics_proxy_->OnEncoderReconfigured(config, 50);
-  EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.AdaptChangesPerMinute.Cpu"));
-  EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.AdaptChangesPerMinute.Cpu", 8));
-  EXPECT_EQ(0,
-            metrics::NumSamples("WebRTC.Video.AdaptChangesPerMinute.Quality"));
-
-  // First RTP packet sent, scaling enabled.
-  UpdateDataCounters(kFirstSsrc);
-  statistics_proxy_->SetAdaptationStats(cpu_counts, quality_counts);
-
-  // Adapt changes: 4, elapsed time: 120 sec => 2 per minute.
-  statistics_proxy_->OnCpuAdaptationChanged(cpu_counts, quality_counts);
-  statistics_proxy_->OnCpuAdaptationChanged(cpu_counts, quality_counts);
-  statistics_proxy_->OnCpuAdaptationChanged(cpu_counts, quality_counts);
-  statistics_proxy_->OnCpuAdaptationChanged(cpu_counts, quality_counts);
-  fake_clock_.AdvanceTimeMilliseconds(120000);
-
-  statistics_proxy_.reset();
-  EXPECT_EQ(1, metrics::NumSamples(
-                   "WebRTC.Video.Screenshare.AdaptChangesPerMinute.Cpu"));
-  EXPECT_EQ(1, metrics::NumEvents(
-                   "WebRTC.Video.Screenshare.AdaptChangesPerMinute.Cpu", 2));
-  EXPECT_EQ(0, metrics::NumSamples(
-                   "WebRTC.Video.Screenshare.AdaptChangesPerMinute.Quality"));
-}
-
-TEST_F(SendStatisticsProxyTest, SwitchContentTypeUpdatesHistograms) {
-  for (int i = 0; i < SendStatisticsProxy::kMinRequiredMetricsSamples; ++i)
-    statistics_proxy_->OnIncomingFrame(kWidth, kHeight);
-
-  // No switch, stats should not be updated.
-  VideoEncoderConfig config;
-  config.content_type = VideoEncoderConfig::ContentType::kRealtimeVideo;
-  statistics_proxy_->OnEncoderReconfigured(config, 50);
-  EXPECT_EQ(0, metrics::NumSamples("WebRTC.Video.InputWidthInPixels"));
-
-  // Switch to screenshare, real-time stats should be updated.
-  config.content_type = VideoEncoderConfig::ContentType::kScreen;
-  statistics_proxy_->OnEncoderReconfigured(config, 50);
-  EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.InputWidthInPixels"));
-}
-
-TEST_F(SendStatisticsProxyTest, InputResolutionHistogramsAreUpdated) {
-  for (int i = 0; i < SendStatisticsProxy::kMinRequiredMetricsSamples; ++i)
-    statistics_proxy_->OnIncomingFrame(kWidth, kHeight);
-
-  statistics_proxy_.reset();
-  EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.InputWidthInPixels"));
-  EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.InputWidthInPixels", kWidth));
-  EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.InputHeightInPixels"));
-  EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.InputHeightInPixels", kHeight));
-}
-
-TEST_F(SendStatisticsProxyTest, SentResolutionHistogramsAreUpdated) {
-  EncodedImage encoded_image;
-  encoded_image._encodedWidth = kWidth;
-  encoded_image._encodedHeight = kHeight;
-  for (int i = 0; i <= SendStatisticsProxy::kMinRequiredMetricsSamples; ++i) {
-    encoded_image._timeStamp = i + 1;
-    statistics_proxy_->OnSendEncodedImage(encoded_image, nullptr);
-  }
-  statistics_proxy_.reset();
-  EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.SentWidthInPixels"));
-  EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.SentWidthInPixels", kWidth));
-  EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.SentHeightInPixels"));
-  EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.SentHeightInPixels", kHeight));
-}
-
-TEST_F(SendStatisticsProxyTest, InputFpsHistogramIsUpdated) {
-  const int kFps = 20;
-  const int kMinPeriodicSamples = 6;
-  int frames = kMinPeriodicSamples * kFpsPeriodicIntervalMs * kFps / 1000;
-  for (int i = 0; i <= frames; ++i) {
-    fake_clock_.AdvanceTimeMilliseconds(1000 / kFps);
-    statistics_proxy_->OnIncomingFrame(kWidth, kHeight);
-  }
-  statistics_proxy_.reset();
-  EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.InputFramesPerSecond"));
-  EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.InputFramesPerSecond", kFps));
-}
-
-TEST_F(SendStatisticsProxyTest, SentFpsHistogramIsUpdated) {
-  EncodedImage encoded_image;
-  const int kFps = 20;
-  const int kMinPeriodicSamples = 6;
-  int frames = kMinPeriodicSamples * kFpsPeriodicIntervalMs * kFps / 1000 + 1;
-  for (int i = 0; i <= frames; ++i) {
-    fake_clock_.AdvanceTimeMilliseconds(1000 / kFps);
-    encoded_image._timeStamp = i + 1;
-    statistics_proxy_->OnSendEncodedImage(encoded_image, nullptr);
-  }
-  statistics_proxy_.reset();
-  EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.SentFramesPerSecond"));
-  EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.SentFramesPerSecond", kFps));
-}
-
-TEST_F(SendStatisticsProxyTest, InputFpsHistogramExcludesSuspendedTime) {
-  const int kFps = 20;
-  const int kSuspendTimeMs = 10000;
-  const int kMinPeriodicSamples = 6;
-  int frames = kMinPeriodicSamples * kFpsPeriodicIntervalMs * kFps / 1000;
-  for (int i = 0; i < frames; ++i) {
-    fake_clock_.AdvanceTimeMilliseconds(1000 / kFps);
-    statistics_proxy_->OnIncomingFrame(kWidth, kHeight);
-  }
-  // Suspend.
-  statistics_proxy_->OnSuspendChange(true);
-  fake_clock_.AdvanceTimeMilliseconds(kSuspendTimeMs);
-
-  for (int i = 0; i < frames; ++i) {
-    fake_clock_.AdvanceTimeMilliseconds(1000 / kFps);
-    statistics_proxy_->OnIncomingFrame(kWidth, kHeight);
-  }
-  // Suspended time interval should not affect the framerate.
-  statistics_proxy_.reset();
-  EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.InputFramesPerSecond"));
-  EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.InputFramesPerSecond", kFps));
-}
-
-TEST_F(SendStatisticsProxyTest, SentFpsHistogramExcludesSuspendedTime) {
-  EncodedImage encoded_image;
-  const int kFps = 20;
-  const int kSuspendTimeMs = 10000;
-  const int kMinPeriodicSamples = 6;
-  int frames = kMinPeriodicSamples * kFpsPeriodicIntervalMs * kFps / 1000;
-  for (int i = 0; i <= frames; ++i) {
-    fake_clock_.AdvanceTimeMilliseconds(1000 / kFps);
-    encoded_image._timeStamp = i + 1;
-    statistics_proxy_->OnSendEncodedImage(encoded_image, nullptr);
-  }
-  // Suspend.
-  statistics_proxy_->OnSuspendChange(true);
-  fake_clock_.AdvanceTimeMilliseconds(kSuspendTimeMs);
-
-  for (int i = 0; i <= frames; ++i) {
-    fake_clock_.AdvanceTimeMilliseconds(1000 / kFps);
-    encoded_image._timeStamp = i + 1;
-    statistics_proxy_->OnSendEncodedImage(encoded_image, nullptr);
-  }
-  // Suspended time interval should not affect the framerate.
-  statistics_proxy_.reset();
-  EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.SentFramesPerSecond"));
-  EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.SentFramesPerSecond", kFps));
-}
-
-TEST_F(SendStatisticsProxyTest, CpuLimitedHistogramNotUpdatedWhenDisabled) {
-  VideoStreamEncoder::AdaptCounts cpu_counts;
-  VideoStreamEncoder::AdaptCounts quality_counts;
-  cpu_counts.resolution = -1;
-  statistics_proxy_->SetAdaptationStats(cpu_counts, quality_counts);
-
-  for (int i = 0; i < SendStatisticsProxy::kMinRequiredMetricsSamples; ++i)
-    statistics_proxy_->OnIncomingFrame(kWidth, kHeight);
-
-  statistics_proxy_.reset();
-  EXPECT_EQ(0,
-            metrics::NumSamples("WebRTC.Video.CpuLimitedResolutionInPercent"));
-}
-
-TEST_F(SendStatisticsProxyTest, CpuLimitedHistogramUpdated) {
-  VideoStreamEncoder::AdaptCounts cpu_counts;
-  VideoStreamEncoder::AdaptCounts quality_counts;
-  cpu_counts.resolution = 0;
-  statistics_proxy_->SetAdaptationStats(cpu_counts, quality_counts);
-
-  for (int i = 0; i < SendStatisticsProxy::kMinRequiredMetricsSamples; ++i)
-    statistics_proxy_->OnIncomingFrame(kWidth, kHeight);
-
-  cpu_counts.resolution = 1;
-  statistics_proxy_->OnCpuAdaptationChanged(cpu_counts, quality_counts);
-
-  for (int i = 0; i < SendStatisticsProxy::kMinRequiredMetricsSamples; ++i)
-    statistics_proxy_->OnIncomingFrame(kWidth, kHeight);
-
-  statistics_proxy_.reset();
-  EXPECT_EQ(1,
-            metrics::NumSamples("WebRTC.Video.CpuLimitedResolutionInPercent"));
-  EXPECT_EQ(
-      1, metrics::NumEvents("WebRTC.Video.CpuLimitedResolutionInPercent", 50));
-}
-
-TEST_F(SendStatisticsProxyTest, LifetimeHistogramIsUpdated) {
-  const int64_t kTimeSec = 3;
-  fake_clock_.AdvanceTimeMilliseconds(kTimeSec * 1000);
-  statistics_proxy_.reset();
-  EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.SendStreamLifetimeInSeconds"));
-  EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.SendStreamLifetimeInSeconds",
-                                  kTimeSec));
-}
-
-TEST_F(SendStatisticsProxyTest, CodecTypeHistogramIsUpdated) {
-  fake_clock_.AdvanceTimeMilliseconds(metrics::kMinRunTimeInSeconds * 1000);
-  statistics_proxy_.reset();
-  EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.Encoder.CodecType"));
-}
-
-TEST_F(SendStatisticsProxyTest, PauseEventHistogramIsUpdated) {
-  // First RTP packet sent.
-  UpdateDataCounters(kFirstSsrc);
-
-  // Min runtime has passed.
-  fake_clock_.AdvanceTimeMilliseconds(metrics::kMinRunTimeInSeconds * 1000);
-  statistics_proxy_.reset();
-  EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.NumberOfPauseEvents"));
-  EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.NumberOfPauseEvents", 0));
-}
-
-TEST_F(SendStatisticsProxyTest,
-       PauseEventHistogramIsNotUpdatedIfMinRuntimeHasNotPassed) {
-  // First RTP packet sent.
-  UpdateDataCounters(kFirstSsrc);
-
-  // Min runtime has not passed.
-  fake_clock_.AdvanceTimeMilliseconds(metrics::kMinRunTimeInSeconds * 1000 - 1);
-  statistics_proxy_.reset();
-  EXPECT_EQ(0, metrics::NumSamples("WebRTC.Video.NumberOfPauseEvents"));
-  EXPECT_EQ(0, metrics::NumSamples("WebRTC.Video.PausedTimeInPercent"));
-}
-
-TEST_F(SendStatisticsProxyTest,
-       PauseEventHistogramIsNotUpdatedIfNoMediaIsSent) {
-  // First RTP packet not sent.
-  fake_clock_.AdvanceTimeMilliseconds(metrics::kMinRunTimeInSeconds * 1000);
-  statistics_proxy_.reset();
-  EXPECT_EQ(0, metrics::NumSamples("WebRTC.Video.NumberOfPauseEvents"));
-}
-
-TEST_F(SendStatisticsProxyTest, NoPauseEvent) {
-  // First RTP packet sent and min runtime passed.
-  UpdateDataCounters(kFirstSsrc);
-
-  // No change. Video: 10000 ms, paused: 0 ms (0%).
-  statistics_proxy_->OnSetEncoderTargetRate(50000);
-  fake_clock_.AdvanceTimeMilliseconds(metrics::kMinRunTimeInSeconds * 1000);
-  statistics_proxy_->OnSetEncoderTargetRate(0);  // VideoSendStream::Stop
-
-  statistics_proxy_.reset();
-  EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.NumberOfPauseEvents"));
-  EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.NumberOfPauseEvents", 0));
-  EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.PausedTimeInPercent"));
-  EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.PausedTimeInPercent", 0));
-}
-
-TEST_F(SendStatisticsProxyTest, OnePauseEvent) {
-  // First RTP packet sent and min runtime passed.
-  UpdateDataCounters(kFirstSsrc);
-
-  // One change. Video: 7000 ms, paused: 3000 ms (30%).
-  statistics_proxy_->OnSetEncoderTargetRate(50000);
-  fake_clock_.AdvanceTimeMilliseconds(7000);
-  statistics_proxy_->OnSetEncoderTargetRate(0);
-  fake_clock_.AdvanceTimeMilliseconds(3000);
-  statistics_proxy_->OnSetEncoderTargetRate(0);  // VideoSendStream::Stop
-
-  statistics_proxy_.reset();
-  EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.NumberOfPauseEvents"));
-  EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.NumberOfPauseEvents", 1));
-  EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.PausedTimeInPercent"));
-  EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.PausedTimeInPercent", 30));
-}
-
-TEST_F(SendStatisticsProxyTest, TwoPauseEvents) {
-  // First RTP packet sent.
-  UpdateDataCounters(kFirstSsrc);
-
-  // Two changes. Video: 19000 ms, paused: 1000 ms (5%).
-  statistics_proxy_->OnSetEncoderTargetRate(0);
-  fake_clock_.AdvanceTimeMilliseconds(1000);
-  statistics_proxy_->OnSetEncoderTargetRate(50000);  // Starts on bitrate > 0.
-  fake_clock_.AdvanceTimeMilliseconds(7000);
-  statistics_proxy_->OnSetEncoderTargetRate(60000);
-  fake_clock_.AdvanceTimeMilliseconds(3000);
-  statistics_proxy_->OnSetEncoderTargetRate(0);
-  fake_clock_.AdvanceTimeMilliseconds(250);
-  statistics_proxy_->OnSetEncoderTargetRate(0);
-  fake_clock_.AdvanceTimeMilliseconds(750);
-  statistics_proxy_->OnSetEncoderTargetRate(60000);
-  fake_clock_.AdvanceTimeMilliseconds(5000);
-  statistics_proxy_->OnSetEncoderTargetRate(50000);
-  fake_clock_.AdvanceTimeMilliseconds(4000);
-  statistics_proxy_->OnSetEncoderTargetRate(0);  // VideoSendStream::Stop
-
-  statistics_proxy_.reset();
-  EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.NumberOfPauseEvents"));
-  EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.NumberOfPauseEvents", 2));
-  EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.PausedTimeInPercent"));
-  EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.PausedTimeInPercent", 5));
-}
-
-TEST_F(SendStatisticsProxyTest,
-       PausedTimeHistogramIsNotUpdatedIfMinRuntimeHasNotPassed) {
-  // First RTP packet sent.
-  UpdateDataCounters(kFirstSsrc);
-  fake_clock_.AdvanceTimeMilliseconds(metrics::kMinRunTimeInSeconds * 1000);
-
-  // Min runtime has not passed.
-  statistics_proxy_->OnSetEncoderTargetRate(50000);
-  fake_clock_.AdvanceTimeMilliseconds(metrics::kMinRunTimeInSeconds * 1000 - 1);
-  statistics_proxy_->OnSetEncoderTargetRate(0);  // VideoSendStream::Stop
-
-  statistics_proxy_.reset();
-  EXPECT_EQ(0, metrics::NumSamples("WebRTC.Video.PausedTimeInPercent"));
-}
-
-TEST_F(SendStatisticsProxyTest, VerifyQpHistogramStats_Vp8) {
-  EncodedImage encoded_image;
-  CodecSpecificInfo codec_info;
-  codec_info.codecType = kVideoCodecVP8;
-
-  for (int i = 0; i < SendStatisticsProxy::kMinRequiredMetricsSamples; ++i) {
-    codec_info.codecSpecific.VP8.simulcastIdx = 0;
-    encoded_image.qp_ = kQpIdx0;
-    statistics_proxy_->OnSendEncodedImage(encoded_image, &codec_info);
-    codec_info.codecSpecific.VP8.simulcastIdx = 1;
-    encoded_image.qp_ = kQpIdx1;
-    statistics_proxy_->OnSendEncodedImage(encoded_image, &codec_info);
-  }
-  statistics_proxy_.reset();
-  EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.Encoded.Qp.Vp8.S0"));
-  EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.Encoded.Qp.Vp8.S0", kQpIdx0));
-  EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.Encoded.Qp.Vp8.S1"));
-  EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.Encoded.Qp.Vp8.S1", kQpIdx1));
-}
-
-TEST_F(SendStatisticsProxyTest, VerifyQpHistogramStats_Vp8OneSsrc) {
-  VideoSendStream::Config config(nullptr);
-  config.rtp.ssrcs.push_back(kFirstSsrc);
-  statistics_proxy_.reset(new SendStatisticsProxy(
-      &fake_clock_, config, VideoEncoderConfig::ContentType::kRealtimeVideo));
-
-  EncodedImage encoded_image;
-  CodecSpecificInfo codec_info;
-  codec_info.codecType = kVideoCodecVP8;
-
-  for (int i = 0; i < SendStatisticsProxy::kMinRequiredMetricsSamples; ++i) {
-    codec_info.codecSpecific.VP8.simulcastIdx = 0;
-    encoded_image.qp_ = kQpIdx0;
-    statistics_proxy_->OnSendEncodedImage(encoded_image, &codec_info);
-  }
-  statistics_proxy_.reset();
-  EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.Encoded.Qp.Vp8"));
-  EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.Encoded.Qp.Vp8", kQpIdx0));
-}
-
-TEST_F(SendStatisticsProxyTest, VerifyQpHistogramStats_Vp9) {
-  EncodedImage encoded_image;
-  CodecSpecificInfo codec_info;
-  codec_info.codecType = kVideoCodecVP9;
-  codec_info.codecSpecific.VP9.num_spatial_layers = 2;
-
-  for (int i = 0; i < SendStatisticsProxy::kMinRequiredMetricsSamples; ++i) {
-    encoded_image.qp_ = kQpIdx0;
-    codec_info.codecSpecific.VP9.spatial_idx = 0;
-    statistics_proxy_->OnSendEncodedImage(encoded_image, &codec_info);
-    encoded_image.qp_ = kQpIdx1;
-    codec_info.codecSpecific.VP9.spatial_idx = 1;
-    statistics_proxy_->OnSendEncodedImage(encoded_image, &codec_info);
-  }
-  statistics_proxy_.reset();
-  EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.Encoded.Qp.Vp9.S0"));
-  EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.Encoded.Qp.Vp9.S0", kQpIdx0));
-  EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.Encoded.Qp.Vp9.S1"));
-  EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.Encoded.Qp.Vp9.S1", kQpIdx1));
-}
-
-TEST_F(SendStatisticsProxyTest, VerifyQpHistogramStats_Vp9OneSpatialLayer) {
-  VideoSendStream::Config config(nullptr);
-  config.rtp.ssrcs.push_back(kFirstSsrc);
-  statistics_proxy_.reset(new SendStatisticsProxy(
-      &fake_clock_, config, VideoEncoderConfig::ContentType::kRealtimeVideo));
-
-  EncodedImage encoded_image;
-  CodecSpecificInfo codec_info;
-  codec_info.codecType = kVideoCodecVP9;
-  codec_info.codecSpecific.VP9.num_spatial_layers = 1;
-
-  for (int i = 0; i < SendStatisticsProxy::kMinRequiredMetricsSamples; ++i) {
-    encoded_image.qp_ = kQpIdx0;
-    codec_info.codecSpecific.VP9.spatial_idx = 0;
-    statistics_proxy_->OnSendEncodedImage(encoded_image, &codec_info);
-  }
-  statistics_proxy_.reset();
-  EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.Encoded.Qp.Vp9"));
-  EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.Encoded.Qp.Vp9", kQpIdx0));
-}
-
-TEST_F(SendStatisticsProxyTest, VerifyQpHistogramStats_H264) {
-  EncodedImage encoded_image;
-  CodecSpecificInfo codec_info;
-  codec_info.codecType = kVideoCodecH264;
-
-  for (int i = 0; i < SendStatisticsProxy::kMinRequiredMetricsSamples; ++i) {
-    encoded_image.qp_ = kQpIdx0;
-    statistics_proxy_->OnSendEncodedImage(encoded_image, &codec_info);
-  }
-  statistics_proxy_.reset();
-  EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.Encoded.Qp.H264"));
-  EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.Encoded.Qp.H264", kQpIdx0));
-}
-
-TEST_F(SendStatisticsProxyTest,
-       BandwidthLimitedHistogramsNotUpdatedWhenDisabled) {
-  EncodedImage encoded_image;
-  // encoded_image.adapt_reason_.bw_resolutions_disabled by default: -1
-  for (int i = 0; i < SendStatisticsProxy::kMinRequiredMetricsSamples; ++i)
-    statistics_proxy_->OnSendEncodedImage(encoded_image, nullptr);
-
-  // Histograms are updated when the statistics_proxy_ is deleted.
-  statistics_proxy_.reset();
-  EXPECT_EQ(0, metrics::NumSamples(
-                   "WebRTC.Video.BandwidthLimitedResolutionInPercent"));
-  EXPECT_EQ(0, metrics::NumSamples(
-                   "WebRTC.Video.BandwidthLimitedResolutionsDisabled"));
-}
-
-TEST_F(SendStatisticsProxyTest,
-       BandwidthLimitedHistogramsUpdatedWhenEnabled_NoResolutionDisabled) {
-  const int kResolutionsDisabled = 0;
-  EncodedImage encoded_image;
-  encoded_image.adapt_reason_.bw_resolutions_disabled = kResolutionsDisabled;
-  for (int i = 0; i < SendStatisticsProxy::kMinRequiredMetricsSamples; ++i)
-    statistics_proxy_->OnSendEncodedImage(encoded_image, nullptr);
-
-  // Histograms are updated when the statistics_proxy_ is deleted.
-  statistics_proxy_.reset();
-  EXPECT_EQ(1, metrics::NumSamples(
-                   "WebRTC.Video.BandwidthLimitedResolutionInPercent"));
-  EXPECT_EQ(1, metrics::NumEvents(
-                   "WebRTC.Video.BandwidthLimitedResolutionInPercent", 0));
-  // No resolution disabled.
-  EXPECT_EQ(0, metrics::NumSamples(
-                   "WebRTC.Video.BandwidthLimitedResolutionsDisabled"));
-}
-
-TEST_F(SendStatisticsProxyTest,
-       BandwidthLimitedHistogramsUpdatedWhenEnabled_OneResolutionDisabled) {
-  const int kResolutionsDisabled = 1;
-  EncodedImage encoded_image;
-  encoded_image.adapt_reason_.bw_resolutions_disabled = kResolutionsDisabled;
-  for (int i = 0; i < SendStatisticsProxy::kMinRequiredMetricsSamples; ++i)
-    statistics_proxy_->OnSendEncodedImage(encoded_image, nullptr);
-
-  // Histograms are updated when the statistics_proxy_ is deleted.
-  statistics_proxy_.reset();
-  EXPECT_EQ(1, metrics::NumSamples(
-                   "WebRTC.Video.BandwidthLimitedResolutionInPercent"));
-  EXPECT_EQ(1, metrics::NumEvents(
-                   "WebRTC.Video.BandwidthLimitedResolutionInPercent", 100));
-  // Resolutions disabled.
-  EXPECT_EQ(1, metrics::NumSamples(
-                   "WebRTC.Video.BandwidthLimitedResolutionsDisabled"));
-  EXPECT_EQ(
-      1, metrics::NumEvents("WebRTC.Video.BandwidthLimitedResolutionsDisabled",
-                            kResolutionsDisabled));
-}
-
-TEST_F(SendStatisticsProxyTest,
-       QualityLimitedHistogramsNotUpdatedWhenDisabled) {
-  VideoStreamEncoder::AdaptCounts cpu_counts;
-  VideoStreamEncoder::AdaptCounts quality_counts;
-  quality_counts.resolution = -1;
-  statistics_proxy_->SetAdaptationStats(cpu_counts, quality_counts);
-  EncodedImage encoded_image;
-  for (int i = 0; i < SendStatisticsProxy::kMinRequiredMetricsSamples; ++i)
-    statistics_proxy_->OnSendEncodedImage(encoded_image, &kDefaultCodecInfo);
-
-  // Histograms are updated when the statistics_proxy_ is deleted.
-  statistics_proxy_.reset();
-  EXPECT_EQ(
-      0, metrics::NumSamples("WebRTC.Video.QualityLimitedResolutionInPercent"));
-  EXPECT_EQ(0, metrics::NumSamples(
-                   "WebRTC.Video.QualityLimitedResolutionDownscales"));
-}
-
-TEST_F(SendStatisticsProxyTest,
-       QualityLimitedHistogramsUpdatedWhenEnabled_NoResolutionDownscale) {
-  VideoStreamEncoder::AdaptCounts cpu_counts;
-  VideoStreamEncoder::AdaptCounts quality_counts;
-  quality_counts.resolution = 0;
-  statistics_proxy_->SetAdaptationStats(cpu_counts, quality_counts);
-  EncodedImage encoded_image;
-  for (int i = 0; i < SendStatisticsProxy::kMinRequiredMetricsSamples; ++i)
-    statistics_proxy_->OnSendEncodedImage(encoded_image, &kDefaultCodecInfo);
-
-  // Histograms are updated when the statistics_proxy_ is deleted.
-  statistics_proxy_.reset();
-  EXPECT_EQ(
-      1, metrics::NumSamples("WebRTC.Video.QualityLimitedResolutionInPercent"));
-  EXPECT_EQ(1, metrics::NumEvents(
-                   "WebRTC.Video.QualityLimitedResolutionInPercent", 0));
-  // No resolution downscale.
-  EXPECT_EQ(0, metrics::NumSamples(
-                   "WebRTC.Video.QualityLimitedResolutionDownscales"));
-}
-
-TEST_F(SendStatisticsProxyTest,
-       QualityLimitedHistogramsUpdatedWhenEnabled_TwoResolutionDownscales) {
-  const int kDownscales = 2;
-  VideoStreamEncoder::AdaptCounts cpu_counts;
-  VideoStreamEncoder::AdaptCounts quality_counts;
-  quality_counts.resolution = kDownscales;
-  statistics_proxy_->SetAdaptationStats(cpu_counts, quality_counts);
-  EncodedImage encoded_image;
-  for (int i = 0; i < SendStatisticsProxy::kMinRequiredMetricsSamples; ++i)
-    statistics_proxy_->OnSendEncodedImage(encoded_image, &kDefaultCodecInfo);
-  // Histograms are updated when the statistics_proxy_ is deleted.
-  statistics_proxy_.reset();
-  EXPECT_EQ(
-      1, metrics::NumSamples("WebRTC.Video.QualityLimitedResolutionInPercent"));
-  EXPECT_EQ(1, metrics::NumEvents(
-                   "WebRTC.Video.QualityLimitedResolutionInPercent", 100));
-  // Resolution downscales.
-  EXPECT_EQ(1, metrics::NumSamples(
-                   "WebRTC.Video.QualityLimitedResolutionDownscales"));
-  EXPECT_EQ(
-      1, metrics::NumEvents("WebRTC.Video.QualityLimitedResolutionDownscales",
-                            kDownscales));
-}
-
-TEST_F(SendStatisticsProxyTest, GetStatsReportsBandwidthLimitedResolution) {
-  // Initially false.
-  EXPECT_FALSE(statistics_proxy_->GetStats().bw_limited_resolution);
-  // No resolution scale by default.
-  EncodedImage encoded_image;
-  statistics_proxy_->OnSendEncodedImage(encoded_image, nullptr);
-  EXPECT_FALSE(statistics_proxy_->GetStats().bw_limited_resolution);
-
-  // Simulcast disabled resolutions
-  encoded_image.adapt_reason_.bw_resolutions_disabled = 1;
-  statistics_proxy_->OnSendEncodedImage(encoded_image, nullptr);
-  EXPECT_TRUE(statistics_proxy_->GetStats().bw_limited_resolution);
-
-  encoded_image.adapt_reason_.bw_resolutions_disabled = 0;
-  statistics_proxy_->OnSendEncodedImage(encoded_image, nullptr);
-  EXPECT_FALSE(statistics_proxy_->GetStats().bw_limited_resolution);
-
-  // Resolution scaled due to quality.
-  VideoStreamEncoder::AdaptCounts cpu_counts;
-  VideoStreamEncoder::AdaptCounts quality_counts;
-  quality_counts.resolution = 1;
-  statistics_proxy_->OnQualityAdaptationChanged(cpu_counts, quality_counts);
-  statistics_proxy_->OnSendEncodedImage(encoded_image, nullptr);
-  EXPECT_TRUE(statistics_proxy_->GetStats().bw_limited_resolution);
-}
-
-TEST_F(SendStatisticsProxyTest, GetStatsReportsTargetMediaBitrate) {
-  // Initially zero.
-  EXPECT_EQ(0, statistics_proxy_->GetStats().target_media_bitrate_bps);
-
-  const int kBitrate = 100000;
-  statistics_proxy_->OnSetEncoderTargetRate(kBitrate);
-  EXPECT_EQ(kBitrate, statistics_proxy_->GetStats().target_media_bitrate_bps);
-
-  statistics_proxy_->OnSetEncoderTargetRate(0);
-  EXPECT_EQ(0, statistics_proxy_->GetStats().target_media_bitrate_bps);
-}
-
-TEST_F(SendStatisticsProxyTest, NoSubstreams) {
-  uint32_t excluded_ssrc =
-      std::max(
-          *std::max_element(config_.rtp.ssrcs.begin(), config_.rtp.ssrcs.end()),
-          *std::max_element(config_.rtp.rtx.ssrcs.begin(),
-                            config_.rtp.rtx.ssrcs.end())) +
-      1;
-  // From RtcpStatisticsCallback.
-  RtcpStatistics rtcp_stats;
-  RtcpStatisticsCallback* rtcp_callback = statistics_proxy_.get();
-  rtcp_callback->StatisticsUpdated(rtcp_stats, excluded_ssrc);
-
-  // From BitrateStatisticsObserver.
-  uint32_t total = 0;
-  uint32_t retransmit = 0;
-  BitrateStatisticsObserver* bitrate_observer = statistics_proxy_.get();
-  bitrate_observer->Notify(total, retransmit, excluded_ssrc);
-
-  // From FrameCountObserver.
-  FrameCountObserver* fps_observer = statistics_proxy_.get();
-  FrameCounts frame_counts;
-  frame_counts.key_frames = 1;
-  fps_observer->FrameCountUpdated(frame_counts, excluded_ssrc);
-
-  VideoSendStream::Stats stats = statistics_proxy_->GetStats();
-  EXPECT_TRUE(stats.substreams.empty());
-}
-
-TEST_F(SendStatisticsProxyTest, EncodedResolutionTimesOut) {
-  static const int kEncodedWidth = 123;
-  static const int kEncodedHeight = 81;
-  EncodedImage encoded_image;
-  encoded_image._encodedWidth = kEncodedWidth;
-  encoded_image._encodedHeight = kEncodedHeight;
-
-  CodecSpecificInfo codec_info;
-  codec_info.codecType = kVideoCodecVP8;
-  codec_info.codecSpecific.VP8.simulcastIdx = 0;
-
-  statistics_proxy_->OnSendEncodedImage(encoded_image, &codec_info);
-  codec_info.codecSpecific.VP8.simulcastIdx = 1;
-  statistics_proxy_->OnSendEncodedImage(encoded_image, &codec_info);
-
-  VideoSendStream::Stats stats = statistics_proxy_->GetStats();
-  EXPECT_EQ(kEncodedWidth, stats.substreams[config_.rtp.ssrcs[0]].width);
-  EXPECT_EQ(kEncodedHeight, stats.substreams[config_.rtp.ssrcs[0]].height);
-  EXPECT_EQ(kEncodedWidth, stats.substreams[config_.rtp.ssrcs[1]].width);
-  EXPECT_EQ(kEncodedHeight, stats.substreams[config_.rtp.ssrcs[1]].height);
-
-  // Forward almost to timeout, this should not have removed stats.
-  fake_clock_.AdvanceTimeMilliseconds(SendStatisticsProxy::kStatsTimeoutMs - 1);
-  stats = statistics_proxy_->GetStats();
-  EXPECT_EQ(kEncodedWidth, stats.substreams[config_.rtp.ssrcs[0]].width);
-  EXPECT_EQ(kEncodedHeight, stats.substreams[config_.rtp.ssrcs[0]].height);
-
-  // Update the first SSRC with bogus RTCP stats to make sure that encoded
-  // resolution still times out (no global timeout for all stats).
-  RtcpStatistics rtcp_statistics;
-  RtcpStatisticsCallback* rtcp_stats = statistics_proxy_.get();
-  rtcp_stats->StatisticsUpdated(rtcp_statistics, config_.rtp.ssrcs[0]);
-
-  // Report stats for second SSRC to make sure it's not outdated along with the
-  // first SSRC.
-  codec_info.codecSpecific.VP8.simulcastIdx = 1;
-  statistics_proxy_->OnSendEncodedImage(encoded_image, &codec_info);
-
-  // Forward 1 ms, reach timeout, substream 0 should have no resolution
-  // reported, but substream 1 should.
-  fake_clock_.AdvanceTimeMilliseconds(1);
-  stats = statistics_proxy_->GetStats();
-  EXPECT_EQ(0, stats.substreams[config_.rtp.ssrcs[0]].width);
-  EXPECT_EQ(0, stats.substreams[config_.rtp.ssrcs[0]].height);
-  EXPECT_EQ(kEncodedWidth, stats.substreams[config_.rtp.ssrcs[1]].width);
-  EXPECT_EQ(kEncodedHeight, stats.substreams[config_.rtp.ssrcs[1]].height);
-}
-
-TEST_F(SendStatisticsProxyTest, ClearsResolutionFromInactiveSsrcs) {
-  static const int kEncodedWidth = 123;
-  static const int kEncodedHeight = 81;
-  EncodedImage encoded_image;
-  encoded_image._encodedWidth = kEncodedWidth;
-  encoded_image._encodedHeight = kEncodedHeight;
-
-  CodecSpecificInfo codec_info;
-  codec_info.codecType = kVideoCodecVP8;
-  codec_info.codecSpecific.VP8.simulcastIdx = 0;
-
-  statistics_proxy_->OnSendEncodedImage(encoded_image, &codec_info);
-  codec_info.codecSpecific.VP8.simulcastIdx = 1;
-  statistics_proxy_->OnSendEncodedImage(encoded_image, &codec_info);
-
-  statistics_proxy_->OnInactiveSsrc(config_.rtp.ssrcs[1]);
-  VideoSendStream::Stats stats = statistics_proxy_->GetStats();
-  EXPECT_EQ(kEncodedWidth, stats.substreams[config_.rtp.ssrcs[0]].width);
-  EXPECT_EQ(kEncodedHeight, stats.substreams[config_.rtp.ssrcs[0]].height);
-  EXPECT_EQ(0, stats.substreams[config_.rtp.ssrcs[1]].width);
-  EXPECT_EQ(0, stats.substreams[config_.rtp.ssrcs[1]].height);
-}
-
-TEST_F(SendStatisticsProxyTest, ClearsBitratesFromInactiveSsrcs) {
-  uint32_t bitrate = 42;
-  BitrateStatisticsObserver* observer = statistics_proxy_.get();
-  observer->Notify(bitrate, bitrate, config_.rtp.ssrcs[0]);
-  observer->Notify(bitrate, bitrate, config_.rtp.ssrcs[1]);
-
-  statistics_proxy_->OnInactiveSsrc(config_.rtp.ssrcs[1]);
-
-  VideoSendStream::Stats stats = statistics_proxy_->GetStats();
-  EXPECT_EQ(static_cast<int>(bitrate),
-            stats.substreams[config_.rtp.ssrcs[0]].total_bitrate_bps);
-  EXPECT_EQ(static_cast<int>(bitrate),
-            stats.substreams[config_.rtp.ssrcs[0]].retransmit_bitrate_bps);
-  EXPECT_EQ(0, stats.substreams[config_.rtp.ssrcs[1]].total_bitrate_bps);
-  EXPECT_EQ(0, stats.substreams[config_.rtp.ssrcs[1]].retransmit_bitrate_bps);
-}
-
-TEST_F(SendStatisticsProxyTest, ResetsRtcpCountersOnContentChange) {
-  RtcpPacketTypeCounterObserver* proxy =
-      static_cast<RtcpPacketTypeCounterObserver*>(statistics_proxy_.get());
-  RtcpPacketTypeCounter counters;
-  counters.first_packet_time_ms = fake_clock_.TimeInMilliseconds();
-  proxy->RtcpPacketTypesCounterUpdated(kFirstSsrc, counters);
-  proxy->RtcpPacketTypesCounterUpdated(kSecondSsrc, counters);
-
-  fake_clock_.AdvanceTimeMilliseconds(1000 * metrics::kMinRunTimeInSeconds);
-
-  counters.nack_packets += 1 * metrics::kMinRunTimeInSeconds;
-  counters.fir_packets += 2 * metrics::kMinRunTimeInSeconds;
-  counters.pli_packets += 3 * metrics::kMinRunTimeInSeconds;
-  counters.unique_nack_requests += 4 * metrics::kMinRunTimeInSeconds;
-  counters.nack_requests += 5 * metrics::kMinRunTimeInSeconds;
-
-  proxy->RtcpPacketTypesCounterUpdated(kFirstSsrc, counters);
-  proxy->RtcpPacketTypesCounterUpdated(kSecondSsrc, counters);
-
-  // Changing content type causes histograms to be reported.
-  VideoEncoderConfig config;
-  config.content_type = VideoEncoderConfig::ContentType::kScreen;
-  statistics_proxy_->OnEncoderReconfigured(config, 50);
-
-  EXPECT_EQ(1,
-            metrics::NumSamples("WebRTC.Video.NackPacketsReceivedPerMinute"));
-  EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.FirPacketsReceivedPerMinute"));
-  EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.PliPacketsReceivedPerMinute"));
-  EXPECT_EQ(1, metrics::NumSamples(
-                   "WebRTC.Video.UniqueNackRequestsReceivedInPercent"));
-
-  const int kRate = 60 * 2;  // Packets per minute with two streams.
-
-  EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.NackPacketsReceivedPerMinute",
-                                  1 * kRate));
-  EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.FirPacketsReceivedPerMinute",
-                                  2 * kRate));
-  EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.PliPacketsReceivedPerMinute",
-                                  3 * kRate));
-  EXPECT_EQ(
-      1, metrics::NumEvents("WebRTC.Video.UniqueNackRequestsReceivedInPercent",
-                            4 * 100 / 5));
-
-  // New start time but same counter values.
-  proxy->RtcpPacketTypesCounterUpdated(kFirstSsrc, counters);
-  proxy->RtcpPacketTypesCounterUpdated(kSecondSsrc, counters);
-
-  fake_clock_.AdvanceTimeMilliseconds(1000 * metrics::kMinRunTimeInSeconds);
-
-  counters.nack_packets += 1 * metrics::kMinRunTimeInSeconds;
-  counters.fir_packets += 2 * metrics::kMinRunTimeInSeconds;
-  counters.pli_packets += 3 * metrics::kMinRunTimeInSeconds;
-  counters.unique_nack_requests += 4 * metrics::kMinRunTimeInSeconds;
-  counters.nack_requests += 5 * metrics::kMinRunTimeInSeconds;
-
-  proxy->RtcpPacketTypesCounterUpdated(kFirstSsrc, counters);
-  proxy->RtcpPacketTypesCounterUpdated(kSecondSsrc, counters);
-
-  SetUp();  // Reset stats proxy also causes histograms to be reported.
-
-  EXPECT_EQ(1, metrics::NumSamples(
-                   "WebRTC.Video.Screenshare.NackPacketsReceivedPerMinute"));
-  EXPECT_EQ(1, metrics::NumSamples(
-                   "WebRTC.Video.Screenshare.FirPacketsReceivedPerMinute"));
-  EXPECT_EQ(1, metrics::NumSamples(
-                   "WebRTC.Video.Screenshare.PliPacketsReceivedPerMinute"));
-  EXPECT_EQ(
-      1, metrics::NumSamples(
-             "WebRTC.Video.Screenshare.UniqueNackRequestsReceivedInPercent"));
-
-  EXPECT_EQ(1, metrics::NumEvents(
-                   "WebRTC.Video.Screenshare.NackPacketsReceivedPerMinute",
-                   1 * kRate));
-  EXPECT_EQ(1, metrics::NumEvents(
-                   "WebRTC.Video.Screenshare.FirPacketsReceivedPerMinute",
-                   2 * kRate));
-  EXPECT_EQ(1, metrics::NumEvents(
-                   "WebRTC.Video.Screenshare.PliPacketsReceivedPerMinute",
-                   3 * kRate));
-  EXPECT_EQ(1,
-            metrics::NumEvents(
-                "WebRTC.Video.Screenshare.UniqueNackRequestsReceivedInPercent",
-                4 * 100 / 5));
-}
-
-TEST_F(SendStatisticsProxyTest, GetStatsReportsIsFlexFec) {
-  statistics_proxy_.reset(
-      new SendStatisticsProxy(&fake_clock_, GetTestConfigWithFlexFec(),
-                              VideoEncoderConfig::ContentType::kRealtimeVideo));
-
-  StreamDataCountersCallback* proxy =
-      static_cast<StreamDataCountersCallback*>(statistics_proxy_.get());
-  StreamDataCounters counters;
-  proxy->DataCountersUpdated(counters, kFirstSsrc);
-  proxy->DataCountersUpdated(counters, kFlexFecSsrc);
-
-  EXPECT_FALSE(GetStreamStats(kFirstSsrc).is_flexfec);
-  EXPECT_TRUE(GetStreamStats(kFlexFecSsrc).is_flexfec);
-}
-
-TEST_F(SendStatisticsProxyTest, SendBitratesAreReportedWithFlexFecEnabled) {
-  statistics_proxy_.reset(
-      new SendStatisticsProxy(&fake_clock_, GetTestConfigWithFlexFec(),
-                              VideoEncoderConfig::ContentType::kRealtimeVideo));
-
-  StreamDataCountersCallback* proxy =
-      static_cast<StreamDataCountersCallback*>(statistics_proxy_.get());
-  StreamDataCounters counters;
-  StreamDataCounters rtx_counters;
-
-  const int kMinRequiredPeriodSamples = 8;
-  const int kPeriodIntervalMs = 2000;
-  for (int i = 0; i < kMinRequiredPeriodSamples; ++i) {
-    counters.transmitted.packets += 20;
-    counters.transmitted.header_bytes += 500;
-    counters.transmitted.padding_bytes += 1000;
-    counters.transmitted.payload_bytes += 2000;
-    counters.retransmitted.packets += 2;
-    counters.retransmitted.header_bytes += 25;
-    counters.retransmitted.padding_bytes += 100;
-    counters.retransmitted.payload_bytes += 250;
-    counters.fec = counters.retransmitted;
-    rtx_counters.transmitted = counters.transmitted;
-    // Advance one interval and update counters.
-    fake_clock_.AdvanceTimeMilliseconds(kPeriodIntervalMs);
-    proxy->DataCountersUpdated(counters, kFirstSsrc);
-    proxy->DataCountersUpdated(counters, kSecondSsrc);
-    proxy->DataCountersUpdated(rtx_counters, kFirstRtxSsrc);
-    proxy->DataCountersUpdated(rtx_counters, kSecondRtxSsrc);
-    proxy->DataCountersUpdated(counters, kFlexFecSsrc);
-  }
-
-  statistics_proxy_.reset();
-  // Interval: 3500 bytes * 4 / 2 sec = 7000 bytes / sec  = 56 kbps
-  EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.BitrateSentInKbps"));
-  EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.BitrateSentInKbps", 56));
-  // Interval: 3500 bytes * 2 / 2 sec = 3500 bytes / sec  = 28 kbps
-  EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.RtxBitrateSentInKbps"));
-  EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.RtxBitrateSentInKbps", 28));
-  // Interval: (2000 - 2 * 250) bytes / 2 sec = 1500 bytes / sec  = 12 kbps
-  EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.MediaBitrateSentInKbps"));
-  EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.MediaBitrateSentInKbps", 12));
-  // Interval: 1000 bytes * 4 / 2 sec = 2000 bytes / sec = 16 kbps
-  EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.PaddingBitrateSentInKbps"));
-  EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.PaddingBitrateSentInKbps", 16));
-  // Interval: 375 bytes * 2 / 2 sec = 375 bytes / sec = 3 kbps
-  EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.FecBitrateSentInKbps"));
-  EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.FecBitrateSentInKbps", 3));
-  // Interval: 375 bytes * 2 / 2 sec = 375 bytes / sec = 3 kbps
-  EXPECT_EQ(1,
-            metrics::NumSamples("WebRTC.Video.RetransmittedBitrateSentInKbps"));
-  EXPECT_EQ(
-      1, metrics::NumEvents("WebRTC.Video.RetransmittedBitrateSentInKbps", 3));
-}
-
-TEST_F(SendStatisticsProxyTest, ResetsRtpCountersOnContentChange) {
-  StreamDataCountersCallback* proxy =
-      static_cast<StreamDataCountersCallback*>(statistics_proxy_.get());
-  StreamDataCounters counters;
-  StreamDataCounters rtx_counters;
-  counters.first_packet_time_ms = fake_clock_.TimeInMilliseconds();
-
-  const int kMinRequiredPeriodSamples = 8;
-  const int kPeriodIntervalMs = 2000;
-  for (int i = 0; i < kMinRequiredPeriodSamples; ++i) {
-    counters.transmitted.packets += 20;
-    counters.transmitted.header_bytes += 500;
-    counters.transmitted.padding_bytes += 1000;
-    counters.transmitted.payload_bytes += 2000;
-    counters.retransmitted.packets += 2;
-    counters.retransmitted.header_bytes += 25;
-    counters.retransmitted.padding_bytes += 100;
-    counters.retransmitted.payload_bytes += 250;
-    counters.fec = counters.retransmitted;
-    rtx_counters.transmitted = counters.transmitted;
-    // Advance one interval and update counters.
-    fake_clock_.AdvanceTimeMilliseconds(kPeriodIntervalMs);
-    proxy->DataCountersUpdated(counters, kFirstSsrc);
-    proxy->DataCountersUpdated(counters, kSecondSsrc);
-    proxy->DataCountersUpdated(rtx_counters, kFirstRtxSsrc);
-    proxy->DataCountersUpdated(rtx_counters, kSecondRtxSsrc);
-  }
-
-  // Changing content type causes histograms to be reported.
-  VideoEncoderConfig config;
-  config.content_type = VideoEncoderConfig::ContentType::kScreen;
-  statistics_proxy_->OnEncoderReconfigured(config, 50000);
-
-  // Interval: 3500 bytes * 4 / 2 sec = 7000 bytes / sec  = 56 kbps
-  EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.BitrateSentInKbps"));
-  EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.BitrateSentInKbps", 56));
-  // Interval: 3500 bytes * 2 / 2 sec = 3500 bytes / sec  = 28 kbps
-  EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.RtxBitrateSentInKbps"));
-  EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.RtxBitrateSentInKbps", 28));
-  // Interval: (2000 - 2 * 250) bytes / 2 sec = 1500 bytes / sec  = 12 kbps
-  EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.MediaBitrateSentInKbps"));
-  EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.MediaBitrateSentInKbps", 12));
-  // Interval: 1000 bytes * 4 / 2 sec = 2000 bytes / sec = 16 kbps
-  EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.PaddingBitrateSentInKbps"));
-  EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.PaddingBitrateSentInKbps", 16));
-  // Interval: 375 bytes * 2 / 2 sec = 375 bytes / sec = 3 kbps
-  EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.FecBitrateSentInKbps"));
-  EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.FecBitrateSentInKbps", 3));
-  // Interval: 375 bytes * 2 / 2 sec = 375 bytes / sec = 3 kbps
-  EXPECT_EQ(1,
-            metrics::NumSamples("WebRTC.Video.RetransmittedBitrateSentInKbps"));
-  EXPECT_EQ(
-      1, metrics::NumEvents("WebRTC.Video.RetransmittedBitrateSentInKbps", 3));
-
-  // New metric counters but same data counters.
-  // Double counter values, this should result in the same counts as before but
-  // with new histogram names.
-  for (int i = 0; i < kMinRequiredPeriodSamples; ++i) {
-    counters.transmitted.packets += 20;
-    counters.transmitted.header_bytes += 500;
-    counters.transmitted.padding_bytes += 1000;
-    counters.transmitted.payload_bytes += 2000;
-    counters.retransmitted.packets += 2;
-    counters.retransmitted.header_bytes += 25;
-    counters.retransmitted.padding_bytes += 100;
-    counters.retransmitted.payload_bytes += 250;
-    counters.fec = counters.retransmitted;
-    rtx_counters.transmitted = counters.transmitted;
-    // Advance one interval and update counters.
-    fake_clock_.AdvanceTimeMilliseconds(kPeriodIntervalMs);
-    proxy->DataCountersUpdated(counters, kFirstSsrc);
-    proxy->DataCountersUpdated(counters, kSecondSsrc);
-    proxy->DataCountersUpdated(rtx_counters, kFirstRtxSsrc);
-    proxy->DataCountersUpdated(rtx_counters, kSecondRtxSsrc);
-  }
-
-  // Reset stats proxy also causes histograms to be reported.
-  statistics_proxy_.reset();
-
-  // Interval: 3500 bytes * 4 / 2 sec = 7000 bytes / sec  = 56 kbps
-  EXPECT_EQ(1,
-            metrics::NumSamples("WebRTC.Video.Screenshare.BitrateSentInKbps"));
-  EXPECT_EQ(
-      1, metrics::NumEvents("WebRTC.Video.Screenshare.BitrateSentInKbps", 56));
-  // Interval: 3500 bytes * 2 / 2 sec = 3500 bytes / sec  = 28 kbps
-  EXPECT_EQ(
-      1, metrics::NumSamples("WebRTC.Video.Screenshare.RtxBitrateSentInKbps"));
-  EXPECT_EQ(1, metrics::NumEvents(
-                   "WebRTC.Video.Screenshare.RtxBitrateSentInKbps", 28));
-  // Interval: (2000 - 2 * 250) bytes / 2 sec = 1500 bytes / sec  = 12 kbps
-  EXPECT_EQ(1, metrics::NumSamples(
-                   "WebRTC.Video.Screenshare.MediaBitrateSentInKbps"));
-  EXPECT_EQ(1, metrics::NumEvents(
-                   "WebRTC.Video.Screenshare.MediaBitrateSentInKbps", 12));
-  // Interval: 1000 bytes * 4 / 2 sec = 2000 bytes / sec = 16 kbps
-  EXPECT_EQ(1, metrics::NumSamples(
-                   "WebRTC.Video.Screenshare.PaddingBitrateSentInKbps"));
-  EXPECT_EQ(1, metrics::NumEvents(
-                   "WebRTC.Video.Screenshare.PaddingBitrateSentInKbps", 16));
-  // Interval: 375 bytes * 2 / 2 sec = 375 bytes / sec = 3 kbps
-  EXPECT_EQ(
-      1, metrics::NumSamples("WebRTC.Video.Screenshare.FecBitrateSentInKbps"));
-  EXPECT_EQ(1, metrics::NumEvents(
-                   "WebRTC.Video.Screenshare.FecBitrateSentInKbps", 3));
-  // Interval: 375 bytes * 2 / 2 sec = 375 bytes / sec = 3 kbps
-  EXPECT_EQ(1, metrics::NumSamples(
-                   "WebRTC.Video.Screenshare.RetransmittedBitrateSentInKbps"));
-  EXPECT_EQ(1,
-            metrics::NumEvents(
-                "WebRTC.Video.Screenshare.RetransmittedBitrateSentInKbps", 3));
-}
-
-TEST_F(SendStatisticsProxyTest, RtxBitrateIsZeroWhenEnabledAndNoRtxDataIsSent) {
-  StreamDataCountersCallback* proxy =
-      static_cast<StreamDataCountersCallback*>(statistics_proxy_.get());
-  StreamDataCounters counters;
-  StreamDataCounters rtx_counters;
-
-  const int kMinRequiredPeriodSamples = 8;
-  const int kPeriodIntervalMs = 2000;
-  for (int i = 0; i < kMinRequiredPeriodSamples; ++i) {
-    counters.transmitted.packets += 20;
-    counters.transmitted.header_bytes += 500;
-    counters.transmitted.payload_bytes += 2000;
-    counters.fec = counters.retransmitted;
-    // Advance one interval and update counters.
-    fake_clock_.AdvanceTimeMilliseconds(kPeriodIntervalMs);
-    proxy->DataCountersUpdated(counters, kFirstSsrc);
-  }
-
-  // RTX enabled. No data sent over RTX.
-  statistics_proxy_.reset();
-  EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.RtxBitrateSentInKbps"));
-  EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.RtxBitrateSentInKbps", 0));
-}
-
-TEST_F(SendStatisticsProxyTest, RtxBitrateNotReportedWhenNotEnabled) {
-  VideoSendStream::Config config(nullptr);
-  config.rtp.ssrcs.push_back(kFirstSsrc);  // RTX not configured.
-  statistics_proxy_.reset(new SendStatisticsProxy(
-      &fake_clock_, config, VideoEncoderConfig::ContentType::kRealtimeVideo));
-
-  StreamDataCountersCallback* proxy =
-      static_cast<StreamDataCountersCallback*>(statistics_proxy_.get());
-  StreamDataCounters counters;
-
-  const int kMinRequiredPeriodSamples = 8;
-  const int kPeriodIntervalMs = 2000;
-  for (int i = 0; i < kMinRequiredPeriodSamples; ++i) {
-    counters.transmitted.packets += 20;
-    counters.transmitted.header_bytes += 500;
-    counters.transmitted.payload_bytes += 2000;
-    counters.fec = counters.retransmitted;
-    // Advance one interval and update counters.
-    fake_clock_.AdvanceTimeMilliseconds(kPeriodIntervalMs);
-    proxy->DataCountersUpdated(counters, kFirstSsrc);
-  }
-
-  // RTX not enabled.
-  statistics_proxy_.reset();
-  EXPECT_EQ(0, metrics::NumSamples("WebRTC.Video.RtxBitrateSentInKbps"));
-}
-
-TEST_F(SendStatisticsProxyTest, FecBitrateIsZeroWhenEnabledAndNoFecDataIsSent) {
-  StreamDataCountersCallback* proxy =
-      static_cast<StreamDataCountersCallback*>(statistics_proxy_.get());
-  StreamDataCounters counters;
-  StreamDataCounters rtx_counters;
-
-  const int kMinRequiredPeriodSamples = 8;
-  const int kPeriodIntervalMs = 2000;
-  for (int i = 0; i < kMinRequiredPeriodSamples; ++i) {
-    counters.transmitted.packets += 20;
-    counters.transmitted.header_bytes += 500;
-    counters.transmitted.payload_bytes += 2000;
-    // Advance one interval and update counters.
-    fake_clock_.AdvanceTimeMilliseconds(kPeriodIntervalMs);
-    proxy->DataCountersUpdated(counters, kFirstSsrc);
-  }
-
-  // FEC enabled. No FEC data sent.
-  statistics_proxy_.reset();
-  EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.FecBitrateSentInKbps"));
-  EXPECT_EQ(1, metrics::NumEvents("WebRTC.Video.FecBitrateSentInKbps", 0));
-}
-
-TEST_F(SendStatisticsProxyTest, FecBitrateNotReportedWhenNotEnabled) {
-  VideoSendStream::Config config(nullptr);
-  config.rtp.ssrcs.push_back(kFirstSsrc);  // FEC not configured.
-  statistics_proxy_.reset(new SendStatisticsProxy(
-      &fake_clock_, config, VideoEncoderConfig::ContentType::kRealtimeVideo));
-
-  StreamDataCountersCallback* proxy =
-      static_cast<StreamDataCountersCallback*>(statistics_proxy_.get());
-  StreamDataCounters counters;
-
-  const int kMinRequiredPeriodSamples = 8;
-  const int kPeriodIntervalMs = 2000;
-  for (int i = 0; i < kMinRequiredPeriodSamples; ++i) {
-    counters.transmitted.packets += 20;
-    counters.transmitted.header_bytes += 500;
-    counters.transmitted.payload_bytes += 2000;
-    counters.fec = counters.retransmitted;
-    // Advance one interval and update counters.
-    fake_clock_.AdvanceTimeMilliseconds(kPeriodIntervalMs);
-    proxy->DataCountersUpdated(counters, kFirstSsrc);
-  }
-
-  // FEC not enabled.
-  statistics_proxy_.reset();
-  EXPECT_EQ(0, metrics::NumSamples("WebRTC.Video.FecBitrateSentInKbps"));
-}
-
-}  // namespace webrtc
diff --git a/video/stats_counter.cc b/video/stats_counter.cc
deleted file mode 100644
index adc0129..0000000
--- a/video/stats_counter.cc
+++ /dev/null
@@ -1,462 +0,0 @@
-/*
- *  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/video/stats_counter.h"
-
-#include <algorithm>
-#include <limits>
-#include <map>
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/system_wrappers/include/clock.h"
-
-namespace webrtc {
-
-namespace {
-// Default periodic time interval for processing samples.
-const int64_t kDefaultProcessIntervalMs = 2000;
-const uint32_t kStreamId0 = 0;
-}  // namespace
-
-std::string AggregatedStats::ToString() const {
-  return ToStringWithMultiplier(1);
-}
-
-std::string AggregatedStats::ToStringWithMultiplier(int multiplier) const {
-  std::stringstream ss;
-  ss << "periodic_samples:" << num_samples << ", {";
-  ss << "min:" << (min * multiplier) << ", ";
-  ss << "avg:" << (average * multiplier) << ", ";
-  ss << "max:" << (max * multiplier) << "}";
-  return ss.str();
-}
-
-// Class holding periodically computed metrics.
-class AggregatedCounter {
- public:
-  AggregatedCounter() : last_sample_(0), sum_samples_(0) {}
-  ~AggregatedCounter() {}
-
-  void Add(int sample) {
-    last_sample_ = sample;
-    sum_samples_ += sample;
-    ++stats_.num_samples;
-    if (stats_.num_samples == 1) {
-      stats_.min = sample;
-      stats_.max = sample;
-    }
-    stats_.min = std::min(sample, stats_.min);
-    stats_.max = std::max(sample, stats_.max);
-  }
-
-  AggregatedStats ComputeStats() {
-    Compute();
-    return stats_;
-  }
-
-  bool Empty() const { return stats_.num_samples == 0; }
-
-  int last_sample() const { return last_sample_; }
-
- private:
-  void Compute() {
-    if (stats_.num_samples == 0)
-      return;
-
-    stats_.average =
-        (sum_samples_ + stats_.num_samples / 2) / stats_.num_samples;
-  }
-  int last_sample_;
-  int64_t sum_samples_;
-  AggregatedStats stats_;
-};
-
-// Class holding gathered samples within a process interval.
-class Samples {
- public:
-  Samples() : total_count_(0) {}
-  ~Samples() {}
-
-  void Add(int sample, uint32_t stream_id) {
-    samples_[stream_id].Add(sample);
-    ++total_count_;
-  }
-  void Set(int64_t sample, uint32_t stream_id) {
-    samples_[stream_id].Set(sample);
-    ++total_count_;
-  }
-  void SetLast(int64_t sample, uint32_t stream_id) {
-    samples_[stream_id].SetLast(sample);
-  }
-  int64_t GetLast(uint32_t stream_id) { return samples_[stream_id].GetLast(); }
-
-  int64_t Count() const { return total_count_; }
-  bool Empty() const { return total_count_ == 0; }
-
-  int64_t Sum() const {
-    int64_t sum = 0;
-    for (const auto& it : samples_)
-      sum += it.second.sum_;
-    return sum;
-  }
-
-  int Max() const {
-    int max = std::numeric_limits<int>::min();
-    for (const auto& it : samples_)
-      max = std::max(it.second.max_, max);
-    return max;
-  }
-
-  void Reset() {
-    for (auto& it : samples_)
-      it.second.Reset();
-    total_count_ = 0;
-  }
-
-  int64_t Diff() const {
-    int64_t sum_diff = 0;
-    int count = 0;
-    for (const auto& it : samples_) {
-      if (it.second.count_ > 0) {
-        int64_t diff = it.second.sum_ - it.second.last_sum_;
-        if (diff >= 0) {
-          sum_diff += diff;
-          ++count;
-        }
-      }
-    }
-    return (count > 0) ? sum_diff : -1;
-  }
-
- private:
-  struct Stats {
-    void Add(int sample) {
-      sum_ += sample;
-      ++count_;
-      max_ = std::max(sample, max_);
-    }
-    void Set(int64_t sample) {
-      sum_ = sample;
-      ++count_;
-    }
-    void SetLast(int64_t sample) { last_sum_ = sample; }
-    int64_t GetLast() const { return last_sum_; }
-    void Reset() {
-      if (count_ > 0)
-        last_sum_ = sum_;
-      sum_ = 0;
-      count_ = 0;
-      max_ = std::numeric_limits<int>::min();
-    }
-
-    int max_ = std::numeric_limits<int>::min();
-    int64_t count_ = 0;
-    int64_t sum_ = 0;
-    int64_t last_sum_ = 0;
-  };
-
-  int64_t total_count_;
-  std::map<uint32_t, Stats> samples_;  // Gathered samples mapped by stream id.
-};
-
-// StatsCounter class.
-StatsCounter::StatsCounter(Clock* clock,
-                           int64_t process_intervals_ms,
-                           bool include_empty_intervals,
-                           StatsCounterObserver* observer)
-    : include_empty_intervals_(include_empty_intervals),
-      process_intervals_ms_(process_intervals_ms),
-      aggregated_counter_(new AggregatedCounter()),
-      samples_(new Samples()),
-      clock_(clock),
-      observer_(observer),
-      last_process_time_ms_(-1),
-      paused_(false),
-      pause_time_ms_(-1),
-      min_pause_time_ms_(0) {
-  RTC_DCHECK_GT(process_intervals_ms_, 0);
-}
-
-StatsCounter::~StatsCounter() {}
-
-AggregatedStats StatsCounter::GetStats() {
-  return aggregated_counter_->ComputeStats();
-}
-
-AggregatedStats StatsCounter::ProcessAndGetStats() {
-  if (HasSample())
-    TryProcess();
-  return aggregated_counter_->ComputeStats();
-}
-
-void StatsCounter::ProcessAndPauseForDuration(int64_t min_pause_time_ms) {
-  ProcessAndPause();
-  min_pause_time_ms_ = min_pause_time_ms;
-}
-
-void StatsCounter::ProcessAndPause() {
-  if (HasSample())
-    TryProcess();
-  paused_ = true;
-  pause_time_ms_ = clock_->TimeInMilliseconds();
-}
-
-void StatsCounter::ProcessAndStopPause() {
-  if (HasSample())
-    TryProcess();
-  Resume();
-}
-
-bool StatsCounter::HasSample() const {
-  return last_process_time_ms_ != -1;
-}
-
-bool StatsCounter::TimeToProcess(int* elapsed_intervals) {
-  int64_t now = clock_->TimeInMilliseconds();
-  if (last_process_time_ms_ == -1)
-    last_process_time_ms_ = now;
-
-  int64_t diff_ms = now - last_process_time_ms_;
-  if (diff_ms < process_intervals_ms_)
-    return false;
-
-  // Advance number of complete |process_intervals_ms_| that have passed.
-  int64_t num_intervals = diff_ms / process_intervals_ms_;
-  last_process_time_ms_ += num_intervals * process_intervals_ms_;
-
-  *elapsed_intervals = num_intervals;
-  return true;
-}
-
-void StatsCounter::Add(int sample) {
-  TryProcess();
-  samples_->Add(sample, kStreamId0);
-  ResumeIfMinTimePassed();
-}
-
-void StatsCounter::Set(int64_t sample, uint32_t stream_id) {
-  if (paused_ && sample == samples_->GetLast(stream_id)) {
-    // Do not add same sample while paused (will reset pause).
-    return;
-  }
-  TryProcess();
-  samples_->Set(sample, stream_id);
-  ResumeIfMinTimePassed();
-}
-
-void StatsCounter::SetLast(int64_t sample, uint32_t stream_id) {
-  RTC_DCHECK(!HasSample()) << "Should be set before first sample is added.";
-  samples_->SetLast(sample, stream_id);
-}
-
-// Reports periodically computed metric.
-void StatsCounter::ReportMetricToAggregatedCounter(
-    int value,
-    int num_values_to_add) const {
-  for (int i = 0; i < num_values_to_add; ++i) {
-    aggregated_counter_->Add(value);
-    if (observer_)
-      observer_->OnMetricUpdated(value);
-  }
-}
-
-void StatsCounter::TryProcess() {
-  int elapsed_intervals;
-  if (!TimeToProcess(&elapsed_intervals))
-    return;
-
-  // Get and report periodically computed metric.
-  int metric;
-  if (GetMetric(&metric))
-    ReportMetricToAggregatedCounter(metric, 1);
-
-  // Report value for elapsed intervals without samples.
-  if (IncludeEmptyIntervals()) {
-    // If there are no samples, all elapsed intervals are empty (otherwise one
-    // interval contains sample(s), discard this interval).
-    int empty_intervals =
-        samples_->Empty() ? elapsed_intervals : (elapsed_intervals - 1);
-    ReportMetricToAggregatedCounter(GetValueForEmptyInterval(),
-                                    empty_intervals);
-  }
-
-  // Reset samples for elapsed interval.
-  samples_->Reset();
-}
-
-bool StatsCounter::IncludeEmptyIntervals() const {
-  return include_empty_intervals_ && !paused_ && !aggregated_counter_->Empty();
-}
-void StatsCounter::ResumeIfMinTimePassed() {
-  if (paused_ &&
-      (clock_->TimeInMilliseconds() - pause_time_ms_) >= min_pause_time_ms_) {
-    Resume();
-  }
-}
-
-void StatsCounter::Resume() {
-  paused_ = false;
-  min_pause_time_ms_ = 0;
-}
-
-// StatsCounter sub-classes.
-AvgCounter::AvgCounter(Clock* clock,
-                       StatsCounterObserver* observer,
-                       bool include_empty_intervals)
-    : StatsCounter(clock,
-                   kDefaultProcessIntervalMs,
-                   include_empty_intervals,
-                   observer) {}
-
-void AvgCounter::Add(int sample) {
-  StatsCounter::Add(sample);
-}
-
-bool AvgCounter::GetMetric(int* metric) const {
-  int64_t count = samples_->Count();
-  if (count == 0)
-    return false;
-
-  *metric = (samples_->Sum() + count / 2) / count;
-  return true;
-}
-
-int AvgCounter::GetValueForEmptyInterval() const {
-  return aggregated_counter_->last_sample();
-}
-
-MaxCounter::MaxCounter(Clock* clock,
-                       StatsCounterObserver* observer,
-                       int64_t process_intervals_ms)
-    : StatsCounter(clock,
-                   process_intervals_ms,
-                   false,  // |include_empty_intervals|
-                   observer) {}
-
-void MaxCounter::Add(int sample) {
-  StatsCounter::Add(sample);
-}
-
-bool MaxCounter::GetMetric(int* metric) const {
-  if (samples_->Empty())
-    return false;
-
-  *metric = samples_->Max();
-  return true;
-}
-
-int MaxCounter::GetValueForEmptyInterval() const {
-  RTC_NOTREACHED();
-  return 0;
-}
-
-PercentCounter::PercentCounter(Clock* clock, StatsCounterObserver* observer)
-    : StatsCounter(clock,
-                   kDefaultProcessIntervalMs,
-                   false,  // |include_empty_intervals|
-                   observer) {}
-
-void PercentCounter::Add(bool sample) {
-  StatsCounter::Add(sample ? 1 : 0);
-}
-
-bool PercentCounter::GetMetric(int* metric) const {
-  int64_t count = samples_->Count();
-  if (count == 0)
-    return false;
-
-  *metric = (samples_->Sum() * 100 + count / 2) / count;
-  return true;
-}
-
-int PercentCounter::GetValueForEmptyInterval() const {
-  RTC_NOTREACHED();
-  return 0;
-}
-
-PermilleCounter::PermilleCounter(Clock* clock, StatsCounterObserver* observer)
-    : StatsCounter(clock,
-                   kDefaultProcessIntervalMs,
-                   false,  // |include_empty_intervals|
-                   observer) {}
-
-void PermilleCounter::Add(bool sample) {
-  StatsCounter::Add(sample ? 1 : 0);
-}
-
-bool PermilleCounter::GetMetric(int* metric) const {
-  int64_t count = samples_->Count();
-  if (count == 0)
-    return false;
-
-  *metric = (samples_->Sum() * 1000 + count / 2) / count;
-  return true;
-}
-
-int PermilleCounter::GetValueForEmptyInterval() const {
-  RTC_NOTREACHED();
-  return 0;
-}
-
-RateCounter::RateCounter(Clock* clock,
-                         StatsCounterObserver* observer,
-                         bool include_empty_intervals)
-    : StatsCounter(clock,
-                   kDefaultProcessIntervalMs,
-                   include_empty_intervals,
-                   observer) {}
-
-void RateCounter::Add(int sample) {
-  StatsCounter::Add(sample);
-}
-
-bool RateCounter::GetMetric(int* metric) const {
-  if (samples_->Empty())
-    return false;
-
-  *metric = (samples_->Sum() * 1000 + process_intervals_ms_ / 2) /
-            process_intervals_ms_;
-  return true;
-}
-
-int RateCounter::GetValueForEmptyInterval() const {
-  return 0;
-}
-
-RateAccCounter::RateAccCounter(Clock* clock,
-                               StatsCounterObserver* observer,
-                               bool include_empty_intervals)
-    : StatsCounter(clock,
-                   kDefaultProcessIntervalMs,
-                   include_empty_intervals,
-                   observer) {}
-
-void RateAccCounter::Set(int64_t sample, uint32_t stream_id) {
-  StatsCounter::Set(sample, stream_id);
-}
-
-void RateAccCounter::SetLast(int64_t sample, uint32_t stream_id) {
-  StatsCounter::SetLast(sample, stream_id);
-}
-
-bool RateAccCounter::GetMetric(int* metric) const {
-  int64_t diff = samples_->Diff();
-  if (diff < 0 || (!include_empty_intervals_ && diff == 0))
-    return false;
-
-  *metric = (diff * 1000 + process_intervals_ms_ / 2) / process_intervals_ms_;
-  return true;
-}
-
-int RateAccCounter::GetValueForEmptyInterval() const {
-  return 0;
-}
-
-}  // namespace webrtc
diff --git a/video/stats_counter.h b/video/stats_counter.h
deleted file mode 100644
index 4beb5bf..0000000
--- a/video/stats_counter.h
+++ /dev/null
@@ -1,293 +0,0 @@
-/*
- *  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_VIDEO_STATS_COUNTER_H_
-#define WEBRTC_VIDEO_STATS_COUNTER_H_
-
-#include <memory>
-#include <string>
-
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-class AggregatedCounter;
-class Clock;
-class Samples;
-
-// |StatsCounterObserver| is called periodically when a metric is updated.
-class StatsCounterObserver {
- public:
-  virtual void OnMetricUpdated(int sample) = 0;
-
-  virtual ~StatsCounterObserver() {}
-};
-
-struct AggregatedStats {
-  std::string ToString() const;
-  std::string ToStringWithMultiplier(int multiplier) const;
-
-  int64_t num_samples = 0;
-  int min = -1;
-  int max = -1;
-  int average = -1;
-  // TODO(asapersson): Consider adding median/percentiles.
-};
-
-// Classes which periodically computes a metric.
-//
-// During a period, |kProcessIntervalMs|, different metrics can be computed e.g:
-// - |AvgCounter|: average of samples
-// - |PercentCounter|: percentage of samples
-// - |PermilleCounter|: permille of samples
-//
-// Each periodic metric can be either:
-// - reported to an |observer| each period
-// - aggregated during the call (e.g. min, max, average)
-//
-//                 periodically computed
-//                    GetMetric()            GetMetric()   => AggregatedStats
-//                        ^                      ^            (e.g. min/max/avg)
-//                        |                      |
-// |   *    *  *       *  |  **    *   * *     * | ...
-// |<- process interval ->|
-//
-// (*) - samples
-//
-//
-// Example usage:
-//
-// AvgCounter counter(&clock, nullptr);
-// counter.Add(5);
-// counter.Add(1);
-// counter.Add(6);   // process interval passed -> GetMetric() avg:4
-// counter.Add(7);
-// counter.Add(3);   // process interval passed -> GetMetric() avg:5
-// counter.Add(10);
-// counter.Add(20);  // process interval passed -> GetMetric() avg:15
-// AggregatedStats stats = counter.GetStats();
-// stats: {min:4, max:15, avg:8}
-//
-
-// Note: StatsCounter takes ownership of |observer|.
-
-class StatsCounter {
- public:
-  virtual ~StatsCounter();
-
-  // Gets metric within an interval. Returns true on success false otherwise.
-  virtual bool GetMetric(int* metric) const = 0;
-
-  // Gets the value to use for an interval without samples.
-  virtual int GetValueForEmptyInterval() const = 0;
-
-  // Gets aggregated stats (i.e. aggregate of periodically computed metrics).
-  AggregatedStats GetStats();
-
-  // Reports metrics for elapsed intervals to AggregatedCounter and GetStats.
-  AggregatedStats ProcessAndGetStats();
-
-  // Reports metrics for elapsed intervals to AggregatedCounter and pauses stats
-  // (i.e. empty intervals will be discarded until next sample is added).
-  void ProcessAndPause();
-
-  // As above with a minimum pause time. Added samples within this interval will
-  // not resume the stats (i.e. stop the pause).
-  void ProcessAndPauseForDuration(int64_t min_pause_time_ms);
-
-  // Reports metrics for elapsed intervals to AggregatedCounter and stops pause.
-  void ProcessAndStopPause();
-
-  // Checks if a sample has been added (i.e. Add or Set called).
-  bool HasSample() const;
-
- protected:
-  StatsCounter(Clock* clock,
-               int64_t process_intervals_ms,
-               bool include_empty_intervals,
-               StatsCounterObserver* observer);
-
-  void Add(int sample);
-  void Set(int64_t sample, uint32_t stream_id);
-  void SetLast(int64_t sample, uint32_t stream_id);
-
-  const bool include_empty_intervals_;
-  const int64_t process_intervals_ms_;
-  const std::unique_ptr<AggregatedCounter> aggregated_counter_;
-  const std::unique_ptr<Samples> samples_;
-
- private:
-  bool TimeToProcess(int* num_elapsed_intervals);
-  void TryProcess();
-  void ReportMetricToAggregatedCounter(int value, int num_values_to_add) const;
-  bool IncludeEmptyIntervals() const;
-  void Resume();
-  void ResumeIfMinTimePassed();
-
-  Clock* const clock_;
-  const std::unique_ptr<StatsCounterObserver> observer_;
-  int64_t last_process_time_ms_;
-  bool paused_;
-  int64_t pause_time_ms_;
-  int64_t min_pause_time_ms_;
-};
-
-// AvgCounter: average of samples
-//
-//           | *      *      *      | *           *       | ...
-//           | Add(5) Add(1) Add(6) | Add(5)      Add(5)  |
-// GetMetric | (5 + 1 + 6) / 3      | (5 + 5) / 2         |
-//
-// |include_empty_intervals|: If set, intervals without samples will be included
-//                            in the stats. The value for an interval is
-//                            determined by GetValueForEmptyInterval().
-//
-class AvgCounter : public StatsCounter {
- public:
-  AvgCounter(Clock* clock,
-             StatsCounterObserver* observer,
-             bool include_empty_intervals);
-  ~AvgCounter() override {}
-
-  void Add(int sample);
-
- private:
-  bool GetMetric(int* metric) const override;
-
-  // Returns the last computed metric (i.e. from GetMetric).
-  int GetValueForEmptyInterval() const override;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(AvgCounter);
-};
-
-// MaxCounter: maximum of samples
-//
-//           | *      *      *      | *           *       | ...
-//           | Add(5) Add(1) Add(6) | Add(5)      Add(5)  |
-// GetMetric | max: (5, 1, 6)       | max: (5, 5)         |
-//
-class MaxCounter : public StatsCounter {
- public:
-  MaxCounter(Clock* clock,
-             StatsCounterObserver* observer,
-             int64_t process_intervals_ms);
-  ~MaxCounter() override {}
-
-  void Add(int sample);
-
- private:
-  bool GetMetric(int* metric) const override;
-  int GetValueForEmptyInterval() const override;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(MaxCounter);
-};
-
-// PercentCounter: percentage of samples
-//
-//           | *      *      *      | *           *       | ...
-//           | Add(T) Add(F) Add(T) | Add(F)      Add(T)  |
-// GetMetric | 100 * 2 / 3          | 100 * 1 / 2         |
-//
-class PercentCounter : public StatsCounter {
- public:
-  PercentCounter(Clock* clock, StatsCounterObserver* observer);
-  ~PercentCounter() override {}
-
-  void Add(bool sample);
-
- private:
-  bool GetMetric(int* metric) const override;
-  int GetValueForEmptyInterval() const override;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(PercentCounter);
-};
-
-// PermilleCounter: permille of samples
-//
-//           | *      *      *      | *         *         | ...
-//           | Add(T) Add(F) Add(T) | Add(F)    Add(T)    |
-// GetMetric | 1000 *  2 / 3        | 1000 * 1 / 2        |
-//
-class PermilleCounter : public StatsCounter {
- public:
-  PermilleCounter(Clock* clock, StatsCounterObserver* observer);
-  ~PermilleCounter() override {}
-
-  void Add(bool sample);
-
- private:
-  bool GetMetric(int* metric) const override;
-  int GetValueForEmptyInterval() const override;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(PermilleCounter);
-};
-
-// RateCounter: units per second
-//
-//           | *      *      *      | *           *       | ...
-//           | Add(5) Add(1) Add(6) | Add(5)      Add(5)  |
-//           |<------ 2 sec ------->|                     |
-// GetMetric | (5 + 1 + 6) / 2      | (5 + 5) / 2         |
-//
-// |include_empty_intervals|: If set, intervals without samples will be included
-//                            in the stats. The value for an interval is
-//                            determined by GetValueForEmptyInterval().
-//
-class RateCounter : public StatsCounter {
- public:
-  RateCounter(Clock* clock,
-              StatsCounterObserver* observer,
-              bool include_empty_intervals);
-  ~RateCounter() override {}
-
-  void Add(int sample);
-
- private:
-  bool GetMetric(int* metric) const override;
-  int GetValueForEmptyInterval() const override;  // Returns zero.
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(RateCounter);
-};
-
-// RateAccCounter: units per second (used for counters)
-//
-//           | *      *      *      | *         *         | ...
-//           | Set(5) Set(6) Set(8) | Set(11)   Set(13)   |
-//           |<------ 2 sec ------->|                     |
-// GetMetric | (8 - 0) / 2          | (13 - 8) / 2        |
-//
-// |include_empty_intervals|: If set, intervals without samples will be included
-//                            in the stats. The value for an interval is
-//                            determined by GetValueForEmptyInterval().
-//
-class RateAccCounter : public StatsCounter {
- public:
-  RateAccCounter(Clock* clock,
-                 StatsCounterObserver* observer,
-                 bool include_empty_intervals);
-  ~RateAccCounter() override {}
-
-  void Set(int64_t sample, uint32_t stream_id);
-
-  // Sets the value for previous interval.
-  // To be used if a value other than zero is initially required.
-  void SetLast(int64_t sample, uint32_t stream_id);
-
- private:
-  bool GetMetric(int* metric) const override;
-  int GetValueForEmptyInterval() const override;  // Returns zero.
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(RateAccCounter);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_VIDEO_STATS_COUNTER_H_
diff --git a/video/stats_counter_unittest.cc b/video/stats_counter_unittest.cc
deleted file mode 100644
index 183f260..0000000
--- a/video/stats_counter_unittest.cc
+++ /dev/null
@@ -1,603 +0,0 @@
-/*
- *  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/video/stats_counter.h"
-
-#include "webrtc/system_wrappers/include/clock.h"
-#include "webrtc/test/gtest.h"
-
-namespace webrtc {
-namespace {
-const int kDefaultProcessIntervalMs = 2000;
-const uint32_t kStreamId = 123456;
-
-class StatsCounterObserverImpl : public StatsCounterObserver {
- public:
-  StatsCounterObserverImpl() : num_calls_(0), last_sample_(-1) {}
-  void OnMetricUpdated(int sample) override {
-    ++num_calls_;
-    last_sample_ = sample;
-  }
-  int num_calls_;
-  int last_sample_;
-};
-}  // namespace
-
-class StatsCounterTest : public ::testing::Test {
- protected:
-  StatsCounterTest()
-      : clock_(1234) {}
-
-  void AddSampleAndAdvance(int sample, int interval_ms, AvgCounter* counter) {
-    counter->Add(sample);
-    clock_.AdvanceTimeMilliseconds(interval_ms);
-  }
-
-  void SetSampleAndAdvance(int sample,
-                           int interval_ms,
-                           RateAccCounter* counter) {
-    counter->Set(sample, kStreamId);
-    clock_.AdvanceTimeMilliseconds(interval_ms);
-  }
-
-  void VerifyStatsIsNotSet(const AggregatedStats& stats) {
-    EXPECT_EQ(0, stats.num_samples);
-    EXPECT_EQ(-1, stats.min);
-    EXPECT_EQ(-1, stats.max);
-    EXPECT_EQ(-1, stats.average);
-  }
-
-  SimulatedClock clock_;
-};
-
-TEST_F(StatsCounterTest, NoSamples) {
-  AvgCounter counter(&clock_, nullptr, false);
-  VerifyStatsIsNotSet(counter.GetStats());
-}
-
-TEST_F(StatsCounterTest, TestRegisterObserver) {
-  StatsCounterObserverImpl* observer = new StatsCounterObserverImpl();
-  const int kSample = 22;
-  AvgCounter counter(&clock_, observer, false);
-  AddSampleAndAdvance(kSample, kDefaultProcessIntervalMs, &counter);
-  // Trigger process (sample included in next interval).
-  counter.Add(111);
-  EXPECT_EQ(1, observer->num_calls_);
-}
-
-TEST_F(StatsCounterTest, HasSample) {
-  AvgCounter counter(&clock_, nullptr, false);
-  EXPECT_FALSE(counter.HasSample());
-  counter.Add(1);
-  EXPECT_TRUE(counter.HasSample());
-}
-
-TEST_F(StatsCounterTest, VerifyProcessInterval) {
-  StatsCounterObserverImpl* observer = new StatsCounterObserverImpl();
-  AvgCounter counter(&clock_, observer, false);
-  counter.Add(4);
-  clock_.AdvanceTimeMilliseconds(kDefaultProcessIntervalMs - 1);
-  // Try trigger process (interval has not passed).
-  counter.Add(8);
-  EXPECT_EQ(0, observer->num_calls_);
-  VerifyStatsIsNotSet(counter.GetStats());
-  // Make process interval pass.
-  clock_.AdvanceTimeMilliseconds(1);
-  // Trigger process (sample included in next interval).
-  counter.Add(111);
-  EXPECT_EQ(1, observer->num_calls_);
-  EXPECT_EQ(6, observer->last_sample_);
-  // Aggregated stats.
-  AggregatedStats stats = counter.GetStats();
-  EXPECT_EQ(1, stats.num_samples);
-}
-
-TEST_F(StatsCounterTest, TestMetric_AvgCounter) {
-  StatsCounterObserverImpl* observer = new StatsCounterObserverImpl();
-  AvgCounter counter(&clock_, observer, false);
-  counter.Add(4);
-  counter.Add(8);
-  counter.Add(9);
-  clock_.AdvanceTimeMilliseconds(kDefaultProcessIntervalMs);
-  // Trigger process (sample included in next interval).
-  counter.Add(111);
-  // Average per interval.
-  EXPECT_EQ(1, observer->num_calls_);
-  EXPECT_EQ(7, observer->last_sample_);
-  // Aggregated stats.
-  AggregatedStats stats = counter.GetStats();
-  EXPECT_EQ(1, stats.num_samples);
-  EXPECT_EQ(7, stats.min);
-  EXPECT_EQ(7, stats.max);
-  EXPECT_EQ(7, stats.average);
-}
-
-TEST_F(StatsCounterTest, TestMetric_MaxCounter) {
-  const int64_t kProcessIntervalMs = 1000;
-  StatsCounterObserverImpl* observer = new StatsCounterObserverImpl();
-  MaxCounter counter(&clock_, observer, kProcessIntervalMs);
-  counter.Add(4);
-  counter.Add(9);
-  counter.Add(8);
-  clock_.AdvanceTimeMilliseconds(kProcessIntervalMs);
-  // Trigger process (sample included in next interval).
-  counter.Add(111);
-  // Average per interval.
-  EXPECT_EQ(1, observer->num_calls_);
-  EXPECT_EQ(9, observer->last_sample_);
-  // Aggregated stats.
-  AggregatedStats stats = counter.GetStats();
-  EXPECT_EQ(1, stats.num_samples);
-  EXPECT_EQ(9, stats.min);
-  EXPECT_EQ(9, stats.max);
-  EXPECT_EQ(9, stats.average);
-}
-
-TEST_F(StatsCounterTest, TestMetric_PercentCounter) {
-  StatsCounterObserverImpl* observer = new StatsCounterObserverImpl();
-  PercentCounter counter(&clock_, observer);
-  counter.Add(true);
-  counter.Add(false);
-  clock_.AdvanceTimeMilliseconds(kDefaultProcessIntervalMs);
-  // Trigger process (sample included in next interval).
-  counter.Add(false);
-  // Percentage per interval.
-  EXPECT_EQ(1, observer->num_calls_);
-  EXPECT_EQ(50, observer->last_sample_);
-  // Aggregated stats.
-  AggregatedStats stats = counter.GetStats();
-  EXPECT_EQ(1, stats.num_samples);
-  EXPECT_EQ(50, stats.min);
-  EXPECT_EQ(50, stats.max);
-}
-
-TEST_F(StatsCounterTest, TestMetric_PermilleCounter) {
-  StatsCounterObserverImpl* observer = new StatsCounterObserverImpl();
-  PermilleCounter counter(&clock_, observer);
-  counter.Add(true);
-  counter.Add(false);
-  clock_.AdvanceTimeMilliseconds(kDefaultProcessIntervalMs);
-  // Trigger process (sample included in next interval).
-  counter.Add(false);
-  // Permille per interval.
-  EXPECT_EQ(1, observer->num_calls_);
-  EXPECT_EQ(500, observer->last_sample_);
-  // Aggregated stats.
-  AggregatedStats stats = counter.GetStats();
-  EXPECT_EQ(1, stats.num_samples);
-  EXPECT_EQ(500, stats.min);
-  EXPECT_EQ(500, stats.max);
-}
-
-TEST_F(StatsCounterTest, TestMetric_RateCounter) {
-  StatsCounterObserverImpl* observer = new StatsCounterObserverImpl();
-  RateCounter counter(&clock_, observer, true);
-  counter.Add(186);
-  counter.Add(350);
-  counter.Add(22);
-  clock_.AdvanceTimeMilliseconds(kDefaultProcessIntervalMs);
-  // Trigger process (sample included in next interval).
-  counter.Add(111);
-  // Rate per interval, (186 + 350 + 22) / 2 sec = 279 samples/sec
-  EXPECT_EQ(1, observer->num_calls_);
-  EXPECT_EQ(279, observer->last_sample_);
-  // Aggregated stats.
-  AggregatedStats stats = counter.GetStats();
-  EXPECT_EQ(1, stats.num_samples);
-  EXPECT_EQ(279, stats.min);
-  EXPECT_EQ(279, stats.max);
-}
-
-TEST_F(StatsCounterTest, TestMetric_RateAccCounter) {
-  StatsCounterObserverImpl* observer = new StatsCounterObserverImpl();
-  RateAccCounter counter(&clock_, observer, true);
-  counter.Set(175, kStreamId);
-  counter.Set(188, kStreamId);
-  clock_.AdvanceTimeMilliseconds(kDefaultProcessIntervalMs);
-  // Trigger process (sample included in next interval).
-  counter.Set(192, kStreamId);
-  // Rate per interval: (188 - 0) / 2 sec = 94 samples/sec
-  EXPECT_EQ(1, observer->num_calls_);
-  EXPECT_EQ(94, observer->last_sample_);
-  // Aggregated stats.
-  AggregatedStats stats = counter.GetStats();
-  EXPECT_EQ(1, stats.num_samples);
-  EXPECT_EQ(94, stats.min);
-  EXPECT_EQ(94, stats.max);
-}
-
-TEST_F(StatsCounterTest, TestMetric_RateAccCounterWithSetLast) {
-  StatsCounterObserverImpl* observer = new StatsCounterObserverImpl();
-  RateAccCounter counter(&clock_, observer, true);
-  counter.SetLast(98, kStreamId);
-  counter.Set(175, kStreamId);
-  counter.Set(188, kStreamId);
-  clock_.AdvanceTimeMilliseconds(kDefaultProcessIntervalMs);
-  // Trigger process (sample included in next interval).
-  counter.Set(192, kStreamId);
-  // Rate per interval: (188 - 98) / 2 sec = 45 samples/sec
-  EXPECT_EQ(1, observer->num_calls_);
-  EXPECT_EQ(45, observer->last_sample_);
-}
-
-TEST_F(StatsCounterTest, TestMetric_RateAccCounterWithMultipleStreamIds) {
-  StatsCounterObserverImpl* observer = new StatsCounterObserverImpl();
-  RateAccCounter counter(&clock_, observer, true);
-  counter.Set(175, kStreamId);
-  counter.Set(188, kStreamId);
-  counter.Set(100, kStreamId + 1);
-  clock_.AdvanceTimeMilliseconds(kDefaultProcessIntervalMs);
-  // Trigger process (sample included in next interval).
-  counter.Set(150, kStreamId + 1);
-  // Rate per interval: ((188 - 0) + (100 - 0)) / 2 sec = 144 samples/sec
-  EXPECT_EQ(1, observer->num_calls_);
-  EXPECT_EQ(144, observer->last_sample_);
-  clock_.AdvanceTimeMilliseconds(kDefaultProcessIntervalMs);
-  // Trigger process (sample included in next interval).
-  counter.Set(198, kStreamId);
-  // Rate per interval: (0 + (150 - 100)) / 2 sec = 25 samples/sec
-  EXPECT_EQ(2, observer->num_calls_);
-  EXPECT_EQ(25, observer->last_sample_);
-  clock_.AdvanceTimeMilliseconds(kDefaultProcessIntervalMs);
-  // Trigger process (sample included in next interval).
-  counter.Set(200, kStreamId);
-  // Rate per interval: ((198 - 188) + (0)) / 2 sec = 5 samples/sec
-  EXPECT_EQ(3, observer->num_calls_);
-  EXPECT_EQ(5, observer->last_sample_);
-  // Aggregated stats.
-  AggregatedStats stats = counter.GetStats();
-  EXPECT_EQ(3, stats.num_samples);
-  EXPECT_EQ(5, stats.min);
-  EXPECT_EQ(144, stats.max);
-}
-
-TEST_F(StatsCounterTest, TestGetStats_MultipleIntervals) {
-  AvgCounter counter(&clock_, nullptr, false);
-  const int kSample1 = 1;
-  const int kSample2 = 5;
-  const int kSample3 = 8;
-  const int kSample4 = 11;
-  const int kSample5 = 50;
-  AddSampleAndAdvance(kSample1, kDefaultProcessIntervalMs, &counter);
-  AddSampleAndAdvance(kSample2, kDefaultProcessIntervalMs, &counter);
-  AddSampleAndAdvance(kSample3, kDefaultProcessIntervalMs, &counter);
-  AddSampleAndAdvance(kSample4, kDefaultProcessIntervalMs, &counter);
-  AddSampleAndAdvance(kSample5, kDefaultProcessIntervalMs, &counter);
-  // Trigger process (sample included in next interval).
-  counter.Add(111);
-  AggregatedStats stats = counter.GetStats();
-  EXPECT_EQ(5, stats.num_samples);
-  EXPECT_EQ(kSample1, stats.min);
-  EXPECT_EQ(kSample5, stats.max);
-  EXPECT_EQ(15, stats.average);
-}
-
-TEST_F(StatsCounterTest, TestGetStatsTwice) {
-  const int kSample1 = 4;
-  const int kSample2 = 7;
-  AvgCounter counter(&clock_, nullptr, false);
-  AddSampleAndAdvance(kSample1, kDefaultProcessIntervalMs, &counter);
-  // Trigger process (sample included in next interval).
-  counter.Add(kSample2);
-  AggregatedStats stats = counter.GetStats();
-  EXPECT_EQ(1, stats.num_samples);
-  EXPECT_EQ(kSample1, stats.min);
-  EXPECT_EQ(kSample1, stats.max);
-  // Trigger process (sample included in next interval).
-  clock_.AdvanceTimeMilliseconds(kDefaultProcessIntervalMs);
-  counter.Add(111);
-  stats = counter.GetStats();
-  EXPECT_EQ(2, stats.num_samples);
-  EXPECT_EQ(kSample1, stats.min);
-  EXPECT_EQ(kSample2, stats.max);
-  EXPECT_EQ(6, stats.average);
-}
-
-TEST_F(StatsCounterTest, TestRateAccCounter_NegativeRateIgnored) {
-  StatsCounterObserverImpl* observer = new StatsCounterObserverImpl();
-  const int kSample1 = 200;  //  200 / 2 sec
-  const int kSample2 = 100;  // -100 / 2 sec - negative ignored
-  const int kSample3 = 700;  //  600 / 2 sec
-  RateAccCounter counter(&clock_, observer, true);
-  SetSampleAndAdvance(kSample1, kDefaultProcessIntervalMs, &counter);
-  SetSampleAndAdvance(kSample2, kDefaultProcessIntervalMs, &counter);
-  SetSampleAndAdvance(kSample3, kDefaultProcessIntervalMs, &counter);
-  EXPECT_EQ(1, observer->num_calls_);
-  EXPECT_EQ(100, observer->last_sample_);
-  // Trigger process (sample included in next interval).
-  counter.Set(2000, kStreamId);
-  EXPECT_EQ(2, observer->num_calls_);
-  EXPECT_EQ(300, observer->last_sample_);
-  // Aggregated stats.
-  AggregatedStats stats = counter.GetStats();
-  EXPECT_EQ(2, stats.num_samples);
-  EXPECT_EQ(100, stats.min);
-  EXPECT_EQ(300, stats.max);
-  EXPECT_EQ(200, stats.average);
-}
-
-TEST_F(StatsCounterTest, TestAvgCounter_IntervalsWithoutSamplesIncluded) {
-  // Samples: | 6 | x | x | 8 |  // x: empty interval
-  // Stats:   | 6 | 6 | 6 | 8 |  // x -> last value reported
-  StatsCounterObserverImpl* observer = new StatsCounterObserverImpl();
-  AvgCounter counter(&clock_, observer, true);
-  AddSampleAndAdvance(6, kDefaultProcessIntervalMs * 4 - 1, &counter);
-  // Trigger process (sample included in next interval).
-  counter.Add(8);
-  // [6:3], 3 intervals passed (2 without samples -> last value reported).
-  AggregatedStats stats = counter.ProcessAndGetStats();
-  EXPECT_EQ(3, stats.num_samples);
-  EXPECT_EQ(6, stats.min);
-  EXPECT_EQ(6, stats.max);
-  // Make next interval pass and verify stats: [6:3],[8:1]
-  clock_.AdvanceTimeMilliseconds(1);
-  counter.ProcessAndGetStats();
-  EXPECT_EQ(4, observer->num_calls_);
-  EXPECT_EQ(8, observer->last_sample_);
-}
-
-TEST_F(StatsCounterTest, TestAvgCounter_WithPause) {
-  // Samples: | 6 | x | x | x | - | 22 | x  |  // x: empty interval, -: paused
-  // Stats:   | 6 | 6 | 6 | 6 | - | 22 | 22 |  // x -> last value reported
-  StatsCounterObserverImpl* observer = new StatsCounterObserverImpl();
-  AvgCounter counter(&clock_, observer, true);
-  // Add sample and advance 3 intervals (2 w/o samples -> last value reported).
-  AddSampleAndAdvance(6, kDefaultProcessIntervalMs * 4 - 1, &counter);
-  // Trigger process and verify stats: [6:3]
-  counter.ProcessAndGetStats();
-  EXPECT_EQ(3, observer->num_calls_);
-  EXPECT_EQ(6, observer->last_sample_);
-  // Make next interval pass (1 without samples).
-  // Process and pause. Verify stats: [6:4].
-  clock_.AdvanceTimeMilliseconds(1);
-  counter.ProcessAndPause();
-  EXPECT_EQ(4, observer->num_calls_);  // Last value reported.
-  EXPECT_EQ(6, observer->last_sample_);
-  // Make next interval pass (1 without samples -> ignored while paused).
-  clock_.AdvanceTimeMilliseconds(kDefaultProcessIntervalMs * 2 - 1);
-  counter.Add(22);  // Stops pause.
-  EXPECT_EQ(4, observer->num_calls_);
-  EXPECT_EQ(6, observer->last_sample_);
-  // Make next interval pass, [6:4][22:1]
-  clock_.AdvanceTimeMilliseconds(1);
-  counter.ProcessAndGetStats();
-  EXPECT_EQ(5, observer->num_calls_);
-  EXPECT_EQ(22, observer->last_sample_);
-  // Make 1 interval pass (1 w/o samples -> pause stopped, last value reported).
-  clock_.AdvanceTimeMilliseconds(kDefaultProcessIntervalMs);
-  counter.ProcessAndGetStats();
-  EXPECT_EQ(6, observer->num_calls_);
-  EXPECT_EQ(22, observer->last_sample_);
-}
-
-TEST_F(StatsCounterTest, TestRateAccCounter_AddSampleStopsPause) {
-  // Samples: | 12 | 24 |  // -: paused
-  // Stats:   | 6  | 6  |
-  StatsCounterObserverImpl* observer = new StatsCounterObserverImpl();
-  RateAccCounter counter(&clock_, observer, true);
-  // Add sample and advance 1 intervals.
-  counter.Set(12, kStreamId);
-  clock_.AdvanceTimeMilliseconds(kDefaultProcessIntervalMs);
-  // Trigger process and verify stats: [6:1]
-  counter.ProcessAndPause();
-  EXPECT_EQ(1, observer->num_calls_);
-  EXPECT_EQ(6, observer->last_sample_);
-  // Add sample and advance 1 intervals.
-  counter.Set(24, kStreamId);  // Pause stopped.
-  clock_.AdvanceTimeMilliseconds(kDefaultProcessIntervalMs);
-  counter.ProcessAndGetStats();
-  EXPECT_EQ(2, observer->num_calls_);
-  EXPECT_EQ(6, observer->last_sample_);
-}
-
-TEST_F(StatsCounterTest, TestRateAccCounter_AddSameSampleDoesNotStopPause) {
-  // Samples: | 12 | 12 | 24 |  // -: paused
-  // Stats:   | 6  | -  | 6  |
-  StatsCounterObserverImpl* observer = new StatsCounterObserverImpl();
-  RateAccCounter counter(&clock_, observer, true);
-  // Add sample and advance 1 intervals.
-  counter.Set(12, kStreamId);
-  clock_.AdvanceTimeMilliseconds(kDefaultProcessIntervalMs);
-  // Trigger process and verify stats: [6:1]
-  counter.ProcessAndPause();
-  EXPECT_EQ(1, observer->num_calls_);
-  EXPECT_EQ(6, observer->last_sample_);
-  // Add same sample and advance 1 intervals.
-  counter.Set(12, kStreamId);  // Pause not stopped.
-  clock_.AdvanceTimeMilliseconds(kDefaultProcessIntervalMs);
-  counter.ProcessAndGetStats();
-  EXPECT_EQ(1, observer->num_calls_);
-  EXPECT_EQ(6, observer->last_sample_);
-  // Add new sample and advance 1 intervals.
-  counter.Set(24, kStreamId);  // Pause stopped.
-  clock_.AdvanceTimeMilliseconds(kDefaultProcessIntervalMs);
-  counter.ProcessAndGetStats();
-  EXPECT_EQ(2, observer->num_calls_);
-  EXPECT_EQ(6, observer->last_sample_);
-}
-
-TEST_F(StatsCounterTest, TestRateAccCounter_PauseAndStopPause) {
-  // Samples: | 12 | 12 | 12 |  // -: paused
-  // Stats:   | 6  | -  | 0  |
-  StatsCounterObserverImpl* observer = new StatsCounterObserverImpl();
-  RateAccCounter counter(&clock_, observer, true);
-  // Add sample and advance 1 intervals.
-  counter.Set(12, kStreamId);
-  clock_.AdvanceTimeMilliseconds(kDefaultProcessIntervalMs);
-  // Trigger process and verify stats: [6:1]
-  counter.ProcessAndPause();
-  EXPECT_EQ(1, observer->num_calls_);
-  EXPECT_EQ(6, observer->last_sample_);
-  // Add same sample and advance 1 intervals.
-  counter.Set(12, kStreamId);  // Pause not stopped.
-  clock_.AdvanceTimeMilliseconds(kDefaultProcessIntervalMs);
-  counter.ProcessAndGetStats();
-  EXPECT_EQ(1, observer->num_calls_);
-  EXPECT_EQ(6, observer->last_sample_);
-  // Stop pause, add sample and advance 1 intervals.
-  counter.ProcessAndStopPause();
-  counter.Set(12, kStreamId);
-  clock_.AdvanceTimeMilliseconds(kDefaultProcessIntervalMs);
-  counter.ProcessAndGetStats();
-  EXPECT_EQ(2, observer->num_calls_);
-  EXPECT_EQ(0, observer->last_sample_);
-}
-
-TEST_F(StatsCounterTest, TestAvgCounter_WithoutMinPauseTimePassed) {
-  // Samples: | 6 | 2 | - |  // x: empty interval, -: paused
-  // Stats:   | 6 | 2 | - |  // x -> last value reported
-  StatsCounterObserverImpl* observer = new StatsCounterObserverImpl();
-  AvgCounter counter(&clock_, observer, true);
-  // Add sample and advance 1 intervals.
-  AddSampleAndAdvance(6, kDefaultProcessIntervalMs, &counter);
-  // Process and pause. Verify stats: [6:1].
-  const int64_t kMinMs = 500;
-  counter.ProcessAndPauseForDuration(kMinMs);
-  EXPECT_EQ(1, observer->num_calls_);  // Last value reported.
-  EXPECT_EQ(6, observer->last_sample_);
-  // Min pause time has not pass.
-  clock_.AdvanceTimeMilliseconds(kMinMs - 1);
-  counter.Add(2);  // Pause not stopped.
-  // Make two intervals pass (1 without samples -> ignored while paused).
-  clock_.AdvanceTimeMilliseconds(kDefaultProcessIntervalMs * 2 - (kMinMs - 1));
-  counter.ProcessAndGetStats();
-  EXPECT_EQ(2, observer->num_calls_);
-  EXPECT_EQ(2, observer->last_sample_);
-}
-
-TEST_F(StatsCounterTest, TestAvgCounter_WithMinPauseTimePassed) {
-  // Samples: | 6 | 2 | x |  // x: empty interval, -: paused
-  // Stats:   | 6 | 2 | 2 |  // x -> last value reported
-  StatsCounterObserverImpl* observer = new StatsCounterObserverImpl();
-  AvgCounter counter(&clock_, observer, true);
-  // Add sample and advance 1 intervals.
-  AddSampleAndAdvance(6, kDefaultProcessIntervalMs, &counter);
-  // Process and pause. Verify stats: [6:1].
-  const int64_t kMinMs = 500;
-  counter.ProcessAndPauseForDuration(kMinMs);
-  EXPECT_EQ(1, observer->num_calls_);  // Last value reported.
-  EXPECT_EQ(6, observer->last_sample_);
-  // Make min pause time pass.
-  clock_.AdvanceTimeMilliseconds(kMinMs);
-  counter.Add(2);  // Stop pause.
-  // Make two intervals pass (1 without samples -> last value reported).
-  clock_.AdvanceTimeMilliseconds(kDefaultProcessIntervalMs * 2 - kMinMs);
-  counter.ProcessAndGetStats();
-  EXPECT_EQ(3, observer->num_calls_);
-  EXPECT_EQ(2, observer->last_sample_);
-}
-
-TEST_F(StatsCounterTest, TestRateCounter_IntervalsWithoutSamplesIgnored) {
-  // Samples: | 50 | x | 20 |  // x: empty interval
-  // Stats:   | 25 | x | 10 |  // x -> ignored
-  const bool kIncludeEmptyIntervals = false;
-  StatsCounterObserverImpl* observer = new StatsCounterObserverImpl();
-  const int kSample1 = 50;  //  50 / 2 sec
-  const int kSample2 = 20;  //  20 / 2 sec
-  RateCounter counter(&clock_, observer, kIncludeEmptyIntervals);
-  counter.Add(kSample1);
-  clock_.AdvanceTimeMilliseconds(kDefaultProcessIntervalMs * 3 - 1);
-  // Trigger process (sample included in next interval).
-  counter.Add(kSample2);
-  // [25:1], 2 intervals passed (1 without samples -> ignored).
-  EXPECT_EQ(1, observer->num_calls_);
-  EXPECT_EQ(25, observer->last_sample_);
-  // Make next interval pass and verify stats: [10:1],[25:1]
-  clock_.AdvanceTimeMilliseconds(1);
-  counter.ProcessAndGetStats();
-  EXPECT_EQ(2, observer->num_calls_);
-  EXPECT_EQ(10, observer->last_sample_);
-}
-
-TEST_F(StatsCounterTest, TestRateCounter_IntervalsWithoutSamplesIncluded) {
-  // Samples: | 50 | x | 20 |  // x: empty interval
-  // Stats:   | 25 | 0 | 10 |  // x -> zero reported
-  const bool kIncludeEmptyIntervals = true;
-  StatsCounterObserverImpl* observer = new StatsCounterObserverImpl();
-  const int kSample1 = 50;  //  50 / 2 sec
-  const int kSample2 = 20;  //  20 / 2 sec
-  RateCounter counter(&clock_, observer, kIncludeEmptyIntervals);
-  counter.Add(kSample1);
-  clock_.AdvanceTimeMilliseconds(kDefaultProcessIntervalMs * 3 - 1);
-  // Trigger process (sample included in next interval).
-  counter.Add(kSample2);
-  // [0:1],[25:1], 2 intervals passed (1 without samples -> zero reported).
-  EXPECT_EQ(2, observer->num_calls_);
-  EXPECT_EQ(0, observer->last_sample_);
-  // Make last interval pass and verify stats: [0:1],[10:1],[25:1]
-  clock_.AdvanceTimeMilliseconds(1);
-  AggregatedStats stats = counter.ProcessAndGetStats();
-  EXPECT_EQ(25, stats.max);
-  EXPECT_EQ(3, observer->num_calls_);
-  EXPECT_EQ(10, observer->last_sample_);
-}
-
-TEST_F(StatsCounterTest, TestRateAccCounter_IntervalsWithoutSamplesIncluded) {
-  // Samples: | 12 | x | x | x | 60 |  // x: empty interval
-  // Stats:   | 6  | 0 | 0 | 0 | 24 |  // x -> zero reported
-  StatsCounterObserverImpl* observer = new StatsCounterObserverImpl();
-  RateAccCounter counter(&clock_, observer, true);
-  VerifyStatsIsNotSet(counter.ProcessAndGetStats());
-  // Advance one interval and verify stats.
-  clock_.AdvanceTimeMilliseconds(kDefaultProcessIntervalMs);
-  VerifyStatsIsNotSet(counter.ProcessAndGetStats());
-  // Add sample and advance 3 intervals (2 w/o samples -> zero reported).
-  counter.Set(12, kStreamId);
-  clock_.AdvanceTimeMilliseconds(kDefaultProcessIntervalMs * 4 - 1);
-  // Trigger process and verify stats: [0:2][6:1]
-  counter.ProcessAndGetStats();
-  EXPECT_EQ(3, observer->num_calls_);
-  EXPECT_EQ(0, observer->last_sample_);
-  // Make next interval pass (1 w/o samples -> zero reported), [0:3][6:1]
-  clock_.AdvanceTimeMilliseconds(1);
-  counter.ProcessAndGetStats();
-  EXPECT_EQ(4, observer->num_calls_);
-  EXPECT_EQ(0, observer->last_sample_);
-  // Insert sample and advance non-complete interval, no change, [0:3][6:1]
-  clock_.AdvanceTimeMilliseconds(kDefaultProcessIntervalMs - 1);
-  counter.Set(60, kStreamId);
-  EXPECT_EQ(4, observer->num_calls_);
-  // Make next interval pass, [0:3][6:1][24:1]
-  clock_.AdvanceTimeMilliseconds(1);
-  AggregatedStats stats = counter.ProcessAndGetStats();
-  EXPECT_EQ(5, observer->num_calls_);
-  EXPECT_EQ(24, observer->last_sample_);
-  EXPECT_EQ(6, stats.average);
-}
-
-TEST_F(StatsCounterTest, TestRateAccCounter_IntervalsWithoutSamplesIgnored) {
-  // Samples: | 12 | x | x | x | 60 |  // x: empty interval
-  // Stats:   | 6  | x | x | x | 24 |  // x -> ignored
-  StatsCounterObserverImpl* observer = new StatsCounterObserverImpl();
-  RateAccCounter counter(&clock_, observer, false);
-  // Add sample and advance 3 intervals (2 w/o samples -> ignored).
-  counter.Set(12, kStreamId);
-  clock_.AdvanceTimeMilliseconds(kDefaultProcessIntervalMs * 4 - 1);
-  // Trigger process and verify stats: [6:1]
-  counter.ProcessAndGetStats();
-  EXPECT_EQ(1, observer->num_calls_);
-  EXPECT_EQ(6, observer->last_sample_);
-  // Make next interval pass (1 w/o samples -> ignored), [6:1]
-  clock_.AdvanceTimeMilliseconds(1);
-  counter.ProcessAndGetStats();
-  EXPECT_EQ(1, observer->num_calls_);
-  // Insert sample and advance non-complete interval, no change, [6:1]
-  clock_.AdvanceTimeMilliseconds(kDefaultProcessIntervalMs - 1);
-  counter.Set(60, kStreamId);
-  counter.ProcessAndGetStats();
-  EXPECT_EQ(1, observer->num_calls_);
-  // Make next interval pass, [6:1][24:1]
-  clock_.AdvanceTimeMilliseconds(1);
-  counter.ProcessAndGetStats();
-  EXPECT_EQ(2, observer->num_calls_);
-  EXPECT_EQ(24, observer->last_sample_);
-}
-
-}  // namespace webrtc
diff --git a/video/stream_synchronization.cc b/video/stream_synchronization.cc
deleted file mode 100644
index fc9ab32..0000000
--- a/video/stream_synchronization.cc
+++ /dev/null
@@ -1,198 +0,0 @@
-/*
- *  Copyright (c) 2012 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/video/stream_synchronization.h"
-
-#include <assert.h>
-#include <math.h>
-#include <stdlib.h>
-
-#include <algorithm>
-
-#include "webrtc/rtc_base/logging.h"
-
-namespace webrtc {
-
-static const int kMaxChangeMs = 80;
-static const int kMaxDeltaDelayMs = 10000;
-static const int kFilterLength = 4;
-// Minimum difference between audio and video to warrant a change.
-static const int kMinDeltaMs = 30;
-
-StreamSynchronization::StreamSynchronization(int video_stream_id,
-                                             int audio_stream_id)
-    : video_stream_id_(video_stream_id),
-      audio_stream_id_(audio_stream_id),
-      base_target_delay_ms_(0),
-      avg_diff_ms_(0) {
-}
-
-bool StreamSynchronization::ComputeRelativeDelay(
-    const Measurements& audio_measurement,
-    const Measurements& video_measurement,
-    int* relative_delay_ms) {
-  assert(relative_delay_ms);
-  int64_t audio_last_capture_time_ms;
-  if (!audio_measurement.rtp_to_ntp.Estimate(audio_measurement.latest_timestamp,
-                                             &audio_last_capture_time_ms)) {
-    return false;
-  }
-  int64_t video_last_capture_time_ms;
-  if (!video_measurement.rtp_to_ntp.Estimate(video_measurement.latest_timestamp,
-                                             &video_last_capture_time_ms)) {
-    return false;
-  }
-  if (video_last_capture_time_ms < 0) {
-    return false;
-  }
-  // Positive diff means that video_measurement is behind audio_measurement.
-  *relative_delay_ms = video_measurement.latest_receive_time_ms -
-      audio_measurement.latest_receive_time_ms -
-      (video_last_capture_time_ms - audio_last_capture_time_ms);
-  if (*relative_delay_ms > kMaxDeltaDelayMs ||
-      *relative_delay_ms < -kMaxDeltaDelayMs) {
-    return false;
-  }
-  return true;
-}
-
-bool StreamSynchronization::ComputeDelays(int relative_delay_ms,
-                                          int current_audio_delay_ms,
-                                          int* total_audio_delay_target_ms,
-                                          int* total_video_delay_target_ms) {
-  assert(total_audio_delay_target_ms && total_video_delay_target_ms);
-
-  int current_video_delay_ms = *total_video_delay_target_ms;
-  LOG(LS_VERBOSE) << "Audio delay: " << current_audio_delay_ms
-                  << " current diff: " << relative_delay_ms
-                  << " for stream " << audio_stream_id_;
-  // Calculate the difference between the lowest possible video delay and
-  // the current audio delay.
-  int current_diff_ms = current_video_delay_ms - current_audio_delay_ms +
-      relative_delay_ms;
-
-  avg_diff_ms_ = ((kFilterLength - 1) * avg_diff_ms_ +
-      current_diff_ms) / kFilterLength;
-  if (abs(avg_diff_ms_) < kMinDeltaMs) {
-    // Don't adjust if the diff is within our margin.
-    return false;
-  }
-
-  // Make sure we don't move too fast.
-  int diff_ms = avg_diff_ms_ / 2;
-  diff_ms = std::min(diff_ms, kMaxChangeMs);
-  diff_ms = std::max(diff_ms, -kMaxChangeMs);
-
-  // Reset the average after a move to prevent overshooting reaction.
-  avg_diff_ms_ = 0;
-
-  if (diff_ms > 0) {
-    // The minimum video delay is longer than the current audio delay.
-    // We need to decrease extra video delay, or add extra audio delay.
-    if (channel_delay_.extra_video_delay_ms > base_target_delay_ms_) {
-      // We have extra delay added to ViE. Reduce this delay before adding
-      // extra delay to VoE.
-      channel_delay_.extra_video_delay_ms -= diff_ms;
-      channel_delay_.extra_audio_delay_ms = base_target_delay_ms_;
-    } else {  // channel_delay_.extra_video_delay_ms > 0
-      // We have no extra video delay to remove, increase the audio delay.
-      channel_delay_.extra_audio_delay_ms += diff_ms;
-      channel_delay_.extra_video_delay_ms = base_target_delay_ms_;
-    }
-  } else {  // if (diff_ms > 0)
-    // The video delay is lower than the current audio delay.
-    // We need to decrease extra audio delay, or add extra video delay.
-    if (channel_delay_.extra_audio_delay_ms > base_target_delay_ms_) {
-      // We have extra delay in VoiceEngine.
-      // Start with decreasing the voice delay.
-      // Note: diff_ms is negative; add the negative difference.
-      channel_delay_.extra_audio_delay_ms += diff_ms;
-      channel_delay_.extra_video_delay_ms = base_target_delay_ms_;
-    } else {  // channel_delay_.extra_audio_delay_ms > base_target_delay_ms_
-      // We have no extra delay in VoiceEngine, increase the video delay.
-      // Note: diff_ms is negative; subtract the negative difference.
-      channel_delay_.extra_video_delay_ms -= diff_ms;  // X - (-Y) = X + Y.
-      channel_delay_.extra_audio_delay_ms = base_target_delay_ms_;
-    }
-  }
-
-  // Make sure that video is never below our target.
-  channel_delay_.extra_video_delay_ms = std::max(
-      channel_delay_.extra_video_delay_ms, base_target_delay_ms_);
-
-  int new_video_delay_ms;
-  if (channel_delay_.extra_video_delay_ms > base_target_delay_ms_) {
-    new_video_delay_ms = channel_delay_.extra_video_delay_ms;
-  } else {
-    // No change to the extra video delay. We are changing audio and we only
-    // allow to change one at the time.
-    new_video_delay_ms = channel_delay_.last_video_delay_ms;
-  }
-
-  // Make sure that we don't go below the extra video delay.
-  new_video_delay_ms = std::max(
-      new_video_delay_ms, channel_delay_.extra_video_delay_ms);
-
-  // Verify we don't go above the maximum allowed video delay.
-  new_video_delay_ms =
-      std::min(new_video_delay_ms, base_target_delay_ms_ + kMaxDeltaDelayMs);
-
-  int new_audio_delay_ms;
-  if (channel_delay_.extra_audio_delay_ms > base_target_delay_ms_) {
-    new_audio_delay_ms = channel_delay_.extra_audio_delay_ms;
-  } else {
-    // No change to the audio delay. We are changing video and we only
-    // allow to change one at the time.
-    new_audio_delay_ms = channel_delay_.last_audio_delay_ms;
-  }
-
-  // Make sure that we don't go below the extra audio delay.
-  new_audio_delay_ms = std::max(
-      new_audio_delay_ms, channel_delay_.extra_audio_delay_ms);
-
-  // Verify we don't go above the maximum allowed audio delay.
-  new_audio_delay_ms =
-      std::min(new_audio_delay_ms, base_target_delay_ms_ + kMaxDeltaDelayMs);
-
-  // Remember our last audio and video delays.
-  channel_delay_.last_video_delay_ms = new_video_delay_ms;
-  channel_delay_.last_audio_delay_ms = new_audio_delay_ms;
-
-  LOG(LS_VERBOSE) << "Sync video delay " << new_video_delay_ms
-                  << " for video stream " << video_stream_id_
-                  << " and audio delay " << channel_delay_.extra_audio_delay_ms
-                  << " for audio stream " << audio_stream_id_;
-
-  // Return values.
-  *total_video_delay_target_ms = new_video_delay_ms;
-  *total_audio_delay_target_ms = new_audio_delay_ms;
-  return true;
-}
-
-void StreamSynchronization::SetTargetBufferingDelay(int target_delay_ms) {
-  // Initial extra delay for audio (accounting for existing extra delay).
-  channel_delay_.extra_audio_delay_ms +=
-      target_delay_ms - base_target_delay_ms_;
-  channel_delay_.last_audio_delay_ms +=
-      target_delay_ms - base_target_delay_ms_;
-
-  // The video delay is compared to the last value (and how much we can update
-  // is limited by that as well).
-  channel_delay_.last_video_delay_ms +=
-      target_delay_ms - base_target_delay_ms_;
-
-  channel_delay_.extra_video_delay_ms +=
-      target_delay_ms - base_target_delay_ms_;
-
-  // Video is already delayed by the desired amount.
-  base_target_delay_ms_ = target_delay_ms;
-}
-
-}  // namespace webrtc
diff --git a/video/stream_synchronization.h b/video/stream_synchronization.h
deleted file mode 100644
index d32966b..0000000
--- a/video/stream_synchronization.h
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- *  Copyright (c) 2012 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_VIDEO_STREAM_SYNCHRONIZATION_H_
-#define WEBRTC_VIDEO_STREAM_SYNCHRONIZATION_H_
-
-#include <list>
-
-#include "webrtc/system_wrappers/include/rtp_to_ntp_estimator.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-class StreamSynchronization {
- public:
-  struct Measurements {
-    Measurements() : latest_receive_time_ms(0), latest_timestamp(0) {}
-    RtpToNtpEstimator rtp_to_ntp;
-    int64_t latest_receive_time_ms;
-    uint32_t latest_timestamp;
-  };
-
-  StreamSynchronization(int video_stream_id, int audio_stream_id);
-
-  bool ComputeDelays(int relative_delay_ms,
-                     int current_audio_delay_ms,
-                     int* extra_audio_delay_ms,
-                     int* total_video_delay_target_ms);
-
-  // On success |relative_delay| contains the number of milliseconds later video
-  // is rendered relative audio. If audio is played back later than video a
-  // |relative_delay| will be negative.
-  static bool ComputeRelativeDelay(const Measurements& audio_measurement,
-                                   const Measurements& video_measurement,
-                                   int* relative_delay_ms);
-  // Set target buffering delay - All audio and video will be delayed by at
-  // least target_delay_ms.
-  void SetTargetBufferingDelay(int target_delay_ms);
-
- private:
-  struct SynchronizationDelays {
-    int extra_video_delay_ms = 0;
-    int last_video_delay_ms = 0;
-    int extra_audio_delay_ms = 0;
-    int last_audio_delay_ms = 0;
-  };
-
-  SynchronizationDelays channel_delay_;
-  const int video_stream_id_;
-  const int audio_stream_id_;
-  int base_target_delay_ms_;
-  int avg_diff_ms_;
-};
-}  // namespace webrtc
-
-#endif  // WEBRTC_VIDEO_STREAM_SYNCHRONIZATION_H_
diff --git a/video/stream_synchronization_unittest.cc b/video/stream_synchronization_unittest.cc
deleted file mode 100644
index d5607a8..0000000
--- a/video/stream_synchronization_unittest.cc
+++ /dev/null
@@ -1,568 +0,0 @@
-/*
- *  Copyright (c) 2012 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 <math.h>
-
-#include <algorithm>
-
-#include "webrtc/test/gtest.h"
-#include "webrtc/video/stream_synchronization.h"
-
-namespace webrtc {
-
-// These correspond to the same constants defined in vie_sync_module.cc.
-enum { kMaxVideoDiffMs = 80 };
-enum { kMaxAudioDiffMs = 80 };
-enum { kMaxDelay = 1500 };
-
-// Test constants.
-enum { kDefaultAudioFrequency = 8000 };
-enum { kDefaultVideoFrequency = 90000 };
-const double kNtpFracPerMs = 4.294967296E6;
-static const int kSmoothingFilter = 4 * 2;
-
-class Time {
- public:
-  explicit Time(int64_t offset)
-      : kNtpJan1970(2208988800UL),
-        time_now_ms_(offset) {}
-
-  NtpTime GetNowNtp() const {
-    uint32_t ntp_secs = time_now_ms_ / 1000 + kNtpJan1970;
-    int64_t remainder_ms = time_now_ms_ % 1000;
-    uint32_t ntp_frac = static_cast<uint32_t>(
-        static_cast<double>(remainder_ms) * kNtpFracPerMs + 0.5);
-    return NtpTime(ntp_secs, ntp_frac);
-  }
-
-  uint32_t GetNowRtp(int frequency, uint32_t offset) const {
-    return frequency * time_now_ms_ / 1000 + offset;
-  }
-
-  void IncreaseTimeMs(int64_t inc) {
-    time_now_ms_ += inc;
-  }
-
-  int64_t time_now_ms() const {
-    return time_now_ms_;
-  }
-
- private:
-  // January 1970, in NTP seconds.
-  const uint32_t kNtpJan1970;
-  int64_t time_now_ms_;
-};
-
-class StreamSynchronizationTest : public ::testing::Test {
- protected:
-  virtual void SetUp() {
-    sync_ = new StreamSynchronization(0, 0);
-    send_time_ = new Time(kSendTimeOffsetMs);
-    receive_time_ = new Time(kReceiveTimeOffsetMs);
-    audio_clock_drift_ = 1.0;
-    video_clock_drift_ = 1.0;
-  }
-
-  virtual void TearDown() {
-    delete sync_;
-    delete send_time_;
-    delete receive_time_;
-  }
-
-  // Generates the necessary RTCP measurements and RTP timestamps and computes
-  // the audio and video delays needed to get the two streams in sync.
-  // |audio_delay_ms| and |video_delay_ms| are the number of milliseconds after
-  // capture which the frames are rendered.
-  // |current_audio_delay_ms| is the number of milliseconds which audio is
-  // currently being delayed by the receiver.
-  bool DelayedStreams(int audio_delay_ms,
-                      int video_delay_ms,
-                      int current_audio_delay_ms,
-                      int* extra_audio_delay_ms,
-                      int* total_video_delay_ms) {
-    int audio_frequency = static_cast<int>(kDefaultAudioFrequency *
-                                           audio_clock_drift_ + 0.5);
-    int audio_offset = 0;
-    int video_frequency = static_cast<int>(kDefaultVideoFrequency *
-                                           video_clock_drift_ + 0.5);
-    bool new_sr;
-    int video_offset = 0;
-    StreamSynchronization::Measurements audio;
-    StreamSynchronization::Measurements video;
-    // Generate NTP/RTP timestamp pair for both streams corresponding to RTCP.
-    NtpTime ntp_time = send_time_->GetNowNtp();
-    uint32_t rtp_timestamp =
-        send_time_->GetNowRtp(audio_frequency, audio_offset);
-    EXPECT_TRUE(audio.rtp_to_ntp.UpdateMeasurements(
-        ntp_time.seconds(), ntp_time.fractions(), rtp_timestamp, &new_sr));
-    send_time_->IncreaseTimeMs(100);
-    receive_time_->IncreaseTimeMs(100);
-    ntp_time = send_time_->GetNowNtp();
-    rtp_timestamp = send_time_->GetNowRtp(video_frequency, video_offset);
-    EXPECT_TRUE(video.rtp_to_ntp.UpdateMeasurements(
-        ntp_time.seconds(), ntp_time.fractions(), rtp_timestamp, &new_sr));
-    send_time_->IncreaseTimeMs(900);
-    receive_time_->IncreaseTimeMs(900);
-    ntp_time = send_time_->GetNowNtp();
-    rtp_timestamp = send_time_->GetNowRtp(audio_frequency, audio_offset);
-    EXPECT_TRUE(audio.rtp_to_ntp.UpdateMeasurements(
-        ntp_time.seconds(), ntp_time.fractions(), rtp_timestamp, &new_sr));
-    send_time_->IncreaseTimeMs(100);
-    receive_time_->IncreaseTimeMs(100);
-    ntp_time = send_time_->GetNowNtp();
-    rtp_timestamp = send_time_->GetNowRtp(video_frequency, video_offset);
-    EXPECT_TRUE(video.rtp_to_ntp.UpdateMeasurements(
-        ntp_time.seconds(), ntp_time.fractions(), rtp_timestamp, &new_sr));
-
-    send_time_->IncreaseTimeMs(900);
-    receive_time_->IncreaseTimeMs(900);
-
-    // Capture an audio and a video frame at the same time.
-    audio.latest_timestamp =
-        send_time_->GetNowRtp(audio_frequency, audio_offset);
-    video.latest_timestamp =
-        send_time_->GetNowRtp(video_frequency, video_offset);
-
-    if (audio_delay_ms > video_delay_ms) {
-      // Audio later than video.
-      receive_time_->IncreaseTimeMs(video_delay_ms);
-      video.latest_receive_time_ms = receive_time_->time_now_ms();
-      receive_time_->IncreaseTimeMs(audio_delay_ms - video_delay_ms);
-      audio.latest_receive_time_ms = receive_time_->time_now_ms();
-    } else {
-      // Video later than audio.
-      receive_time_->IncreaseTimeMs(audio_delay_ms);
-      audio.latest_receive_time_ms = receive_time_->time_now_ms();
-      receive_time_->IncreaseTimeMs(video_delay_ms - audio_delay_ms);
-      video.latest_receive_time_ms = receive_time_->time_now_ms();
-    }
-    int relative_delay_ms;
-    StreamSynchronization::ComputeRelativeDelay(audio, video,
-                                                &relative_delay_ms);
-    EXPECT_EQ(video_delay_ms - audio_delay_ms, relative_delay_ms);
-    return sync_->ComputeDelays(relative_delay_ms,
-                                current_audio_delay_ms,
-                                extra_audio_delay_ms,
-                                total_video_delay_ms);
-  }
-
-  // Simulate audio playback 300 ms after capture and video rendering 100 ms
-  // after capture. Verify that the correct extra delays are calculated for
-  // audio and video, and that they change correctly when we simulate that
-  // NetEQ or the VCM adds more delay to the streams.
-  // TODO(holmer): This is currently wrong! We should simply change
-  // audio_delay_ms or video_delay_ms since those now include VCM and NetEQ
-  // delays.
-  void BothDelayedAudioLaterTest(int base_target_delay) {
-    int current_audio_delay_ms = base_target_delay;
-    int audio_delay_ms = base_target_delay + 300;
-    int video_delay_ms = base_target_delay + 100;
-    int extra_audio_delay_ms = 0;
-    int total_video_delay_ms = base_target_delay;
-    int filtered_move = (audio_delay_ms - video_delay_ms) / kSmoothingFilter;
-    const int kNeteqDelayIncrease = 50;
-    const int kNeteqDelayDecrease = 10;
-
-    EXPECT_TRUE(DelayedStreams(audio_delay_ms,
-                               video_delay_ms,
-                               current_audio_delay_ms,
-                               &extra_audio_delay_ms,
-                               &total_video_delay_ms));
-    EXPECT_EQ(base_target_delay + filtered_move, total_video_delay_ms);
-    EXPECT_EQ(base_target_delay, extra_audio_delay_ms);
-    current_audio_delay_ms = extra_audio_delay_ms;
-
-    send_time_->IncreaseTimeMs(1000);
-    receive_time_->IncreaseTimeMs(1000 - std::max(audio_delay_ms,
-                                                  video_delay_ms));
-    // Simulate base_target_delay minimum delay in the VCM.
-    total_video_delay_ms = base_target_delay;
-    EXPECT_TRUE(DelayedStreams(audio_delay_ms,
-                               video_delay_ms,
-                               current_audio_delay_ms,
-                               &extra_audio_delay_ms,
-                               &total_video_delay_ms));
-    EXPECT_EQ(base_target_delay + 2 * filtered_move, total_video_delay_ms);
-    EXPECT_EQ(base_target_delay, extra_audio_delay_ms);
-    current_audio_delay_ms = extra_audio_delay_ms;
-
-    send_time_->IncreaseTimeMs(1000);
-    receive_time_->IncreaseTimeMs(1000 - std::max(audio_delay_ms,
-                                                  video_delay_ms));
-    // Simulate base_target_delay minimum delay in the VCM.
-    total_video_delay_ms = base_target_delay;
-    EXPECT_TRUE(DelayedStreams(audio_delay_ms,
-                               video_delay_ms,
-                               current_audio_delay_ms,
-                               &extra_audio_delay_ms,
-                               &total_video_delay_ms));
-    EXPECT_EQ(base_target_delay + 3 * filtered_move, total_video_delay_ms);
-    EXPECT_EQ(base_target_delay, extra_audio_delay_ms);
-
-    // Simulate that NetEQ introduces some audio delay.
-    current_audio_delay_ms = base_target_delay + kNeteqDelayIncrease;
-    send_time_->IncreaseTimeMs(1000);
-    receive_time_->IncreaseTimeMs(1000 - std::max(audio_delay_ms,
-                                                  video_delay_ms));
-    // Simulate base_target_delay minimum delay in the VCM.
-    total_video_delay_ms = base_target_delay;
-    EXPECT_TRUE(DelayedStreams(audio_delay_ms,
-                               video_delay_ms,
-                               current_audio_delay_ms,
-                               &extra_audio_delay_ms,
-                               &total_video_delay_ms));
-    filtered_move = 3 * filtered_move +
-        (kNeteqDelayIncrease + audio_delay_ms - video_delay_ms) /
-        kSmoothingFilter;
-    EXPECT_EQ(base_target_delay + filtered_move, total_video_delay_ms);
-    EXPECT_EQ(base_target_delay, extra_audio_delay_ms);
-
-    // Simulate that NetEQ reduces its delay.
-    current_audio_delay_ms = base_target_delay + kNeteqDelayDecrease;
-    send_time_->IncreaseTimeMs(1000);
-    receive_time_->IncreaseTimeMs(1000 - std::max(audio_delay_ms,
-                                                  video_delay_ms));
-    // Simulate base_target_delay minimum delay in the VCM.
-    total_video_delay_ms = base_target_delay;
-    EXPECT_TRUE(DelayedStreams(audio_delay_ms,
-                               video_delay_ms,
-                               current_audio_delay_ms,
-                               &extra_audio_delay_ms,
-                               &total_video_delay_ms));
-
-    filtered_move = filtered_move +
-        (kNeteqDelayDecrease + audio_delay_ms - video_delay_ms) /
-        kSmoothingFilter;
-
-    EXPECT_EQ(base_target_delay + filtered_move, total_video_delay_ms);
-    EXPECT_EQ(base_target_delay, extra_audio_delay_ms);
-  }
-
-  void BothDelayedVideoLaterTest(int base_target_delay) {
-    int current_audio_delay_ms = base_target_delay;
-    int audio_delay_ms = base_target_delay + 100;
-    int video_delay_ms = base_target_delay + 300;
-    int extra_audio_delay_ms = 0;
-    int total_video_delay_ms = base_target_delay;
-
-    EXPECT_TRUE(DelayedStreams(audio_delay_ms,
-                               video_delay_ms,
-                               current_audio_delay_ms,
-                               &extra_audio_delay_ms,
-                               &total_video_delay_ms));
-    EXPECT_EQ(base_target_delay, total_video_delay_ms);
-    // The audio delay is not allowed to change more than this in 1 second.
-    EXPECT_GE(base_target_delay + kMaxAudioDiffMs, extra_audio_delay_ms);
-    current_audio_delay_ms = extra_audio_delay_ms;
-    int current_extra_delay_ms = extra_audio_delay_ms;
-
-    send_time_->IncreaseTimeMs(1000);
-    receive_time_->IncreaseTimeMs(800);
-    EXPECT_TRUE(DelayedStreams(audio_delay_ms,
-                               video_delay_ms,
-                               current_audio_delay_ms,
-                               &extra_audio_delay_ms,
-                               &total_video_delay_ms));
-    EXPECT_EQ(base_target_delay, total_video_delay_ms);
-    // The audio delay is not allowed to change more than the half of the
-    // required change in delay.
-    EXPECT_EQ(current_extra_delay_ms + MaxAudioDelayIncrease(
-        current_audio_delay_ms,
-        base_target_delay + video_delay_ms - audio_delay_ms),
-        extra_audio_delay_ms);
-    current_audio_delay_ms = extra_audio_delay_ms;
-    current_extra_delay_ms = extra_audio_delay_ms;
-
-    send_time_->IncreaseTimeMs(1000);
-    receive_time_->IncreaseTimeMs(800);
-    EXPECT_TRUE(DelayedStreams(audio_delay_ms,
-                               video_delay_ms,
-                               current_audio_delay_ms,
-                               &extra_audio_delay_ms,
-                               &total_video_delay_ms));
-    EXPECT_EQ(base_target_delay, total_video_delay_ms);
-    // The audio delay is not allowed to change more than the half of the
-    // required change in delay.
-    EXPECT_EQ(current_extra_delay_ms + MaxAudioDelayIncrease(
-        current_audio_delay_ms,
-        base_target_delay + video_delay_ms - audio_delay_ms),
-        extra_audio_delay_ms);
-    current_extra_delay_ms = extra_audio_delay_ms;
-
-    // Simulate that NetEQ for some reason reduced the delay.
-    current_audio_delay_ms = base_target_delay + 10;
-    send_time_->IncreaseTimeMs(1000);
-    receive_time_->IncreaseTimeMs(800);
-    EXPECT_TRUE(DelayedStreams(audio_delay_ms,
-                               video_delay_ms,
-                               current_audio_delay_ms,
-                               &extra_audio_delay_ms,
-                               &total_video_delay_ms));
-    EXPECT_EQ(base_target_delay, total_video_delay_ms);
-    // Since we only can ask NetEQ for a certain amount of extra delay, and
-    // we only measure the total NetEQ delay, we will ask for additional delay
-    // here to try to stay in sync.
-    EXPECT_EQ(current_extra_delay_ms + MaxAudioDelayIncrease(
-        current_audio_delay_ms,
-        base_target_delay + video_delay_ms - audio_delay_ms),
-        extra_audio_delay_ms);
-    current_extra_delay_ms = extra_audio_delay_ms;
-
-    // Simulate that NetEQ for some reason significantly increased the delay.
-    current_audio_delay_ms = base_target_delay + 350;
-    send_time_->IncreaseTimeMs(1000);
-    receive_time_->IncreaseTimeMs(800);
-    EXPECT_TRUE(DelayedStreams(audio_delay_ms,
-                               video_delay_ms,
-                               current_audio_delay_ms,
-                               &extra_audio_delay_ms,
-                               &total_video_delay_ms));
-    EXPECT_EQ(base_target_delay, total_video_delay_ms);
-    // The audio delay is not allowed to change more than the half of the
-    // required change in delay.
-    EXPECT_EQ(current_extra_delay_ms + MaxAudioDelayIncrease(
-        current_audio_delay_ms,
-        base_target_delay + video_delay_ms - audio_delay_ms),
-        extra_audio_delay_ms);
-  }
-
-  int MaxAudioDelayIncrease(int current_audio_delay_ms, int delay_ms) {
-    return std::min((delay_ms - current_audio_delay_ms) / kSmoothingFilter,
-                     static_cast<int>(kMaxAudioDiffMs));
-  }
-
-  int MaxAudioDelayDecrease(int current_audio_delay_ms, int delay_ms) {
-    return std::max((delay_ms - current_audio_delay_ms) / kSmoothingFilter,
-                    -kMaxAudioDiffMs);
-  }
-
-  enum { kSendTimeOffsetMs = 98765 };
-  enum { kReceiveTimeOffsetMs = 43210 };
-
-  StreamSynchronization* sync_;
-  Time* send_time_;  // The simulated clock at the sender.
-  Time* receive_time_;  // The simulated clock at the receiver.
-  double audio_clock_drift_;
-  double video_clock_drift_;
-};
-
-TEST_F(StreamSynchronizationTest, NoDelay) {
-  uint32_t current_audio_delay_ms = 0;
-  int extra_audio_delay_ms = 0;
-  int total_video_delay_ms = 0;
-
-  EXPECT_FALSE(DelayedStreams(0, 0, current_audio_delay_ms,
-                              &extra_audio_delay_ms, &total_video_delay_ms));
-  EXPECT_EQ(0, extra_audio_delay_ms);
-  EXPECT_EQ(0, total_video_delay_ms);
-}
-
-TEST_F(StreamSynchronizationTest, VideoDelay) {
-  uint32_t current_audio_delay_ms = 0;
-  int delay_ms = 200;
-  int extra_audio_delay_ms = 0;
-  int total_video_delay_ms = 0;
-
-  EXPECT_TRUE(DelayedStreams(delay_ms, 0, current_audio_delay_ms,
-                             &extra_audio_delay_ms, &total_video_delay_ms));
-  EXPECT_EQ(0, extra_audio_delay_ms);
-  // The video delay is not allowed to change more than this in 1 second.
-  EXPECT_EQ(delay_ms / kSmoothingFilter, total_video_delay_ms);
-
-  send_time_->IncreaseTimeMs(1000);
-  receive_time_->IncreaseTimeMs(800);
-  // Simulate 0 minimum delay in the VCM.
-  total_video_delay_ms = 0;
-  EXPECT_TRUE(DelayedStreams(delay_ms, 0, current_audio_delay_ms,
-                             &extra_audio_delay_ms, &total_video_delay_ms));
-  EXPECT_EQ(0, extra_audio_delay_ms);
-  // The video delay is not allowed to change more than this in 1 second.
-  EXPECT_EQ(2 * delay_ms / kSmoothingFilter, total_video_delay_ms);
-
-  send_time_->IncreaseTimeMs(1000);
-  receive_time_->IncreaseTimeMs(800);
-  // Simulate 0 minimum delay in the VCM.
-  total_video_delay_ms = 0;
-  EXPECT_TRUE(DelayedStreams(delay_ms, 0, current_audio_delay_ms,
-                             &extra_audio_delay_ms, &total_video_delay_ms));
-  EXPECT_EQ(0, extra_audio_delay_ms);
-  EXPECT_EQ(3 * delay_ms / kSmoothingFilter, total_video_delay_ms);
-}
-
-TEST_F(StreamSynchronizationTest, AudioDelay) {
-  int current_audio_delay_ms = 0;
-  int delay_ms = 200;
-  int extra_audio_delay_ms = 0;
-  int total_video_delay_ms = 0;
-
-  EXPECT_TRUE(DelayedStreams(0, delay_ms, current_audio_delay_ms,
-                             &extra_audio_delay_ms, &total_video_delay_ms));
-  EXPECT_EQ(0, total_video_delay_ms);
-  // The audio delay is not allowed to change more than this in 1 second.
-  EXPECT_EQ(delay_ms / kSmoothingFilter, extra_audio_delay_ms);
-  current_audio_delay_ms = extra_audio_delay_ms;
-  int current_extra_delay_ms = extra_audio_delay_ms;
-
-  send_time_->IncreaseTimeMs(1000);
-  receive_time_->IncreaseTimeMs(800);
-  EXPECT_TRUE(DelayedStreams(0, delay_ms, current_audio_delay_ms,
-                             &extra_audio_delay_ms, &total_video_delay_ms));
-  EXPECT_EQ(0, total_video_delay_ms);
-  // The audio delay is not allowed to change more than the half of the required
-  // change in delay.
-  EXPECT_EQ(current_extra_delay_ms +
-            MaxAudioDelayIncrease(current_audio_delay_ms, delay_ms),
-            extra_audio_delay_ms);
-  current_audio_delay_ms = extra_audio_delay_ms;
-  current_extra_delay_ms = extra_audio_delay_ms;
-
-  send_time_->IncreaseTimeMs(1000);
-  receive_time_->IncreaseTimeMs(800);
-  EXPECT_TRUE(DelayedStreams(0, delay_ms, current_audio_delay_ms,
-                             &extra_audio_delay_ms, &total_video_delay_ms));
-  EXPECT_EQ(0, total_video_delay_ms);
-  // The audio delay is not allowed to change more than the half of the required
-  // change in delay.
-  EXPECT_EQ(current_extra_delay_ms +
-            MaxAudioDelayIncrease(current_audio_delay_ms, delay_ms),
-            extra_audio_delay_ms);
-  current_extra_delay_ms = extra_audio_delay_ms;
-
-  // Simulate that NetEQ for some reason reduced the delay.
-  current_audio_delay_ms = 10;
-  send_time_->IncreaseTimeMs(1000);
-  receive_time_->IncreaseTimeMs(800);
-  EXPECT_TRUE(DelayedStreams(0, delay_ms, current_audio_delay_ms,
-                             &extra_audio_delay_ms, &total_video_delay_ms));
-  EXPECT_EQ(0, total_video_delay_ms);
-  // Since we only can ask NetEQ for a certain amount of extra delay, and
-  // we only measure the total NetEQ delay, we will ask for additional delay
-  // here to try to
-  EXPECT_EQ(current_extra_delay_ms +
-            MaxAudioDelayIncrease(current_audio_delay_ms, delay_ms),
-            extra_audio_delay_ms);
-  current_extra_delay_ms = extra_audio_delay_ms;
-
-  // Simulate that NetEQ for some reason significantly increased the delay.
-  current_audio_delay_ms = 350;
-  send_time_->IncreaseTimeMs(1000);
-  receive_time_->IncreaseTimeMs(800);
-  EXPECT_TRUE(DelayedStreams(0, delay_ms, current_audio_delay_ms,
-                             &extra_audio_delay_ms, &total_video_delay_ms));
-  EXPECT_EQ(0, total_video_delay_ms);
-  // The audio delay is not allowed to change more than the half of the required
-  // change in delay.
-  EXPECT_EQ(current_extra_delay_ms +
-            MaxAudioDelayDecrease(current_audio_delay_ms, delay_ms),
-            extra_audio_delay_ms);
-}
-
-TEST_F(StreamSynchronizationTest, BothDelayedVideoLater) {
-  BothDelayedVideoLaterTest(0);
-}
-
-TEST_F(StreamSynchronizationTest, BothDelayedVideoLaterAudioClockDrift) {
-  audio_clock_drift_ = 1.05;
-  BothDelayedVideoLaterTest(0);
-}
-
-TEST_F(StreamSynchronizationTest, BothDelayedVideoLaterVideoClockDrift) {
-  video_clock_drift_ = 1.05;
-  BothDelayedVideoLaterTest(0);
-}
-
-TEST_F(StreamSynchronizationTest, BothDelayedAudioLater) {
-  BothDelayedAudioLaterTest(0);
-}
-
-TEST_F(StreamSynchronizationTest, BothDelayedAudioClockDrift) {
-  audio_clock_drift_ = 1.05;
-  BothDelayedAudioLaterTest(0);
-}
-
-TEST_F(StreamSynchronizationTest, BothDelayedVideoClockDrift) {
-  video_clock_drift_ = 1.05;
-  BothDelayedAudioLaterTest(0);
-}
-
-TEST_F(StreamSynchronizationTest, BaseDelay) {
-  int base_target_delay_ms = 2000;
-  int current_audio_delay_ms = 2000;
-  int extra_audio_delay_ms = 0;
-  int total_video_delay_ms = base_target_delay_ms;
-  sync_->SetTargetBufferingDelay(base_target_delay_ms);
-  // We are in sync don't change.
-  EXPECT_FALSE(DelayedStreams(base_target_delay_ms, base_target_delay_ms,
-                              current_audio_delay_ms,
-                              &extra_audio_delay_ms, &total_video_delay_ms));
-  // Triggering another call with the same values. Delay should not be modified.
-  base_target_delay_ms = 2000;
-  current_audio_delay_ms = base_target_delay_ms;
-  total_video_delay_ms = base_target_delay_ms;
-  sync_->SetTargetBufferingDelay(base_target_delay_ms);
-  // We are in sync don't change.
-  EXPECT_FALSE(DelayedStreams(base_target_delay_ms, base_target_delay_ms,
-                              current_audio_delay_ms,
-                              &extra_audio_delay_ms, &total_video_delay_ms));
-  // Changing delay value - intended to test this module only. In practice it
-  // would take VoE time to adapt.
-  base_target_delay_ms = 5000;
-  current_audio_delay_ms = base_target_delay_ms;
-  total_video_delay_ms = base_target_delay_ms;
-  sync_->SetTargetBufferingDelay(base_target_delay_ms);
-  // We are in sync don't change.
-  EXPECT_FALSE(DelayedStreams(base_target_delay_ms, base_target_delay_ms,
-                              current_audio_delay_ms,
-                              &extra_audio_delay_ms, &total_video_delay_ms));
-}
-
-TEST_F(StreamSynchronizationTest, BothDelayedAudioLaterWithBaseDelay) {
-  int base_target_delay_ms = 3000;
-  sync_->SetTargetBufferingDelay(base_target_delay_ms);
-  BothDelayedAudioLaterTest(base_target_delay_ms);
-}
-
-TEST_F(StreamSynchronizationTest, BothDelayedAudioClockDriftWithBaseDelay) {
-  int base_target_delay_ms = 3000;
-  sync_->SetTargetBufferingDelay(base_target_delay_ms);
-  audio_clock_drift_ = 1.05;
-  BothDelayedAudioLaterTest(base_target_delay_ms);
-}
-
-TEST_F(StreamSynchronizationTest, BothDelayedVideoClockDriftWithBaseDelay) {
-  int base_target_delay_ms = 3000;
-  sync_->SetTargetBufferingDelay(base_target_delay_ms);
-  video_clock_drift_ = 1.05;
-  BothDelayedAudioLaterTest(base_target_delay_ms);
-}
-
-TEST_F(StreamSynchronizationTest, BothDelayedVideoLaterWithBaseDelay) {
-  int base_target_delay_ms = 2000;
-  sync_->SetTargetBufferingDelay(base_target_delay_ms);
-  BothDelayedVideoLaterTest(base_target_delay_ms);
-}
-
-TEST_F(StreamSynchronizationTest,
-       BothDelayedVideoLaterAudioClockDriftWithBaseDelay) {
-  int base_target_delay_ms = 2000;
-  audio_clock_drift_ = 1.05;
-  sync_->SetTargetBufferingDelay(base_target_delay_ms);
-  BothDelayedVideoLaterTest(base_target_delay_ms);
-}
-
-TEST_F(StreamSynchronizationTest,
-       BothDelayedVideoLaterVideoClockDriftWithBaseDelay) {
-  int base_target_delay_ms = 2000;
-  video_clock_drift_ = 1.05;
-  sync_->SetTargetBufferingDelay(base_target_delay_ms);
-  BothDelayedVideoLaterTest(base_target_delay_ms);
-}
-
-}  // namespace webrtc
diff --git a/video/transport_adapter.cc b/video/transport_adapter.cc
deleted file mode 100644
index 4f4dd98..0000000
--- a/video/transport_adapter.cc
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- *  Copyright (c) 2013 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/video/transport_adapter.h"
-
-#include "webrtc/rtc_base/checks.h"
-
-namespace webrtc {
-namespace internal {
-
-TransportAdapter::TransportAdapter(Transport* transport)
-    : transport_(transport), enabled_(0) {
-  RTC_DCHECK(nullptr != transport);
-}
-
-bool TransportAdapter::SendRtp(const uint8_t* packet,
-                               size_t length,
-                               const PacketOptions& options) {
-  if (enabled_.Value() == 0)
-    return false;
-
-  return transport_->SendRtp(packet, length, options);
-}
-
-bool TransportAdapter::SendRtcp(const uint8_t* packet, size_t length) {
-  if (enabled_.Value() == 0)
-    return false;
-
-  return transport_->SendRtcp(packet, length);
-}
-
-void TransportAdapter::Enable() {
-  // If this exchange fails it means enabled_ was already true, no need to
-  // check result and iterate.
-  enabled_.CompareExchange(1, 0);
-}
-
-void TransportAdapter::Disable() { enabled_.CompareExchange(0, 1); }
-
-}  // namespace internal
-}  // namespace webrtc
diff --git a/video/transport_adapter.h b/video/transport_adapter.h
deleted file mode 100644
index 3312094..0000000
--- a/video/transport_adapter.h
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- *  Copyright (c) 2013 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_VIDEO_TRANSPORT_ADAPTER_H_
-#define WEBRTC_VIDEO_TRANSPORT_ADAPTER_H_
-
-#include "webrtc/api/call/transport.h"
-#include "webrtc/common_types.h"
-#include "webrtc/system_wrappers/include/atomic32.h"
-
-namespace webrtc {
-namespace internal {
-
-class TransportAdapter : public Transport {
- public:
-  explicit TransportAdapter(Transport* transport);
-
-  bool SendRtp(const uint8_t* packet,
-               size_t length,
-               const PacketOptions& options) override;
-  bool SendRtcp(const uint8_t* packet, size_t length) override;
-
-  void Enable();
-  void Disable();
-
- private:
-  Transport *transport_;
-  Atomic32 enabled_;
-};
-}  // namespace internal
-}  // namespace webrtc
-
-#endif  // WEBRTC_VIDEO_TRANSPORT_ADAPTER_H_
diff --git a/video/video_loopback.cc b/video/video_loopback.cc
deleted file mode 100644
index bf00609..0000000
--- a/video/video_loopback.cc
+++ /dev/null
@@ -1,334 +0,0 @@
-/*
- *  Copyright (c) 2015 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 <stdio.h>
-
-#include "webrtc/rtc_base/flags.h"
-#include "webrtc/test/field_trial.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/run_test.h"
-#include "webrtc/video/video_quality_test.h"
-
-namespace webrtc {
-namespace flags {
-
-// Flags common with screenshare loopback, with different default values.
-DEFINE_int(width, 640, "Video width.");
-size_t Width() {
-  return static_cast<size_t>(FLAG_width);
-}
-
-DEFINE_int(height, 480, "Video height.");
-size_t Height() {
-  return static_cast<size_t>(FLAG_height);
-}
-
-DEFINE_int(fps, 30, "Frames per second.");
-int Fps() {
-  return static_cast<int>(FLAG_fps);
-}
-
-DEFINE_int(capture_device_index, 0, "Capture device to select");
-size_t GetCaptureDevice() {
-  return static_cast<size_t>(FLAG_capture_device_index);
-}
-
-DEFINE_int(min_bitrate, 50, "Call and stream min bitrate in kbps.");
-int MinBitrateKbps() {
-  return static_cast<int>(FLAG_min_bitrate);
-}
-
-DEFINE_int(start_bitrate, 300, "Call start bitrate in kbps.");
-int StartBitrateKbps() {
-  return static_cast<int>(FLAG_start_bitrate);
-}
-
-DEFINE_int(target_bitrate, 800, "Stream target bitrate in kbps.");
-int TargetBitrateKbps() {
-  return static_cast<int>(FLAG_target_bitrate);
-}
-
-DEFINE_int(max_bitrate, 800, "Call and stream max bitrate in kbps.");
-int MaxBitrateKbps() {
-  return static_cast<int>(FLAG_max_bitrate);
-}
-
-DEFINE_bool(suspend_below_min_bitrate,
-            false,
-            "Suspends video below the configured min bitrate.");
-
-DEFINE_int(num_temporal_layers,
-           1,
-           "Number of temporal layers. Set to 1-4 to override.");
-int NumTemporalLayers() {
-  return static_cast<int>(FLAG_num_temporal_layers);
-}
-
-// Flags common with screenshare loopback, with equal default values.
-DEFINE_string(codec, "VP8", "Video codec to use.");
-std::string Codec() {
-  return static_cast<std::string>(FLAG_codec);
-}
-
-DEFINE_int(selected_tl,
-           -1,
-           "Temporal layer to show or analyze. -1 to disable filtering.");
-int SelectedTL() {
-  return static_cast<int>(FLAG_selected_tl);
-}
-
-DEFINE_int(
-    duration,
-    0,
-    "Duration of the test in seconds. If 0, rendered will be shown instead.");
-int DurationSecs() {
-  return static_cast<int>(FLAG_duration);
-}
-
-DEFINE_string(output_filename, "", "Target graph data filename.");
-std::string OutputFilename() {
-  return static_cast<std::string>(FLAG_output_filename);
-}
-
-DEFINE_string(graph_title,
-              "",
-              "If empty, title will be generated automatically.");
-std::string GraphTitle() {
-  return static_cast<std::string>(FLAG_graph_title);
-}
-
-DEFINE_int(loss_percent, 0, "Percentage of packets randomly lost.");
-int LossPercent() {
-  return static_cast<int>(FLAG_loss_percent);
-}
-
-DEFINE_int(avg_burst_loss_length, -1, "Average burst length of lost packets.");
-int AvgBurstLossLength() {
-  return static_cast<int>(FLAG_avg_burst_loss_length);
-}
-
-DEFINE_int(link_capacity,
-           0,
-           "Capacity (kbps) of the fake link. 0 means infinite.");
-int LinkCapacityKbps() {
-  return static_cast<int>(FLAG_link_capacity);
-}
-
-DEFINE_int(queue_size, 0, "Size of the bottleneck link queue in packets.");
-int QueueSize() {
-  return static_cast<int>(FLAG_queue_size);
-}
-
-DEFINE_int(avg_propagation_delay_ms,
-           0,
-           "Average link propagation delay in ms.");
-int AvgPropagationDelayMs() {
-  return static_cast<int>(FLAG_avg_propagation_delay_ms);
-}
-
-DEFINE_string(rtc_event_log_name, "", "Filename for rtc event log.");
-std::string RtcEventLogName() {
-  return static_cast<std::string>(FLAG_rtc_event_log_name);
-}
-
-DEFINE_string(rtp_dump_name, "", "Filename for dumped received RTP stream.");
-std::string RtpDumpName() {
-  return static_cast<std::string>(FLAG_rtp_dump_name);
-}
-
-DEFINE_int(std_propagation_delay_ms,
-           0,
-           "Link propagation delay standard deviation in ms.");
-int StdPropagationDelayMs() {
-  return static_cast<int>(FLAG_std_propagation_delay_ms);
-}
-
-DEFINE_int(num_streams, 0, "Number of streams to show or analyze.");
-int NumStreams() {
-  return static_cast<int>(FLAG_num_streams);
-}
-
-DEFINE_int(selected_stream,
-           0,
-           "ID of the stream to show or analyze. "
-           "Set to the number of streams to show them all.");
-int SelectedStream() {
-  return static_cast<int>(FLAG_selected_stream);
-}
-
-DEFINE_int(num_spatial_layers, 1, "Number of spatial layers to use.");
-int NumSpatialLayers() {
-  return static_cast<int>(FLAG_num_spatial_layers);
-}
-
-DEFINE_int(selected_sl,
-           -1,
-           "Spatial layer to show or analyze. -1 to disable filtering.");
-int SelectedSL() {
-  return static_cast<int>(FLAG_selected_sl);
-}
-
-DEFINE_string(stream0,
-              "",
-              "Comma separated values describing VideoStream for stream #0.");
-std::string Stream0() {
-  return static_cast<std::string>(FLAG_stream0);
-}
-
-DEFINE_string(stream1,
-              "",
-              "Comma separated values describing VideoStream for stream #1.");
-std::string Stream1() {
-  return static_cast<std::string>(FLAG_stream1);
-}
-
-DEFINE_string(sl0,
-              "",
-              "Comma separated values describing SpatialLayer for layer #0.");
-std::string SL0() {
-  return static_cast<std::string>(FLAG_sl0);
-}
-
-DEFINE_string(sl1,
-              "",
-              "Comma separated values describing SpatialLayer for layer #1.");
-std::string SL1() {
-  return static_cast<std::string>(FLAG_sl1);
-}
-
-DEFINE_string(encoded_frame_path,
-              "",
-              "The base path for encoded frame logs. Created files will have "
-              "the form <encoded_frame_path>.<n>.(recv|send.<m>).ivf");
-std::string EncodedFramePath() {
-  return static_cast<std::string>(FLAG_encoded_frame_path);
-}
-
-DEFINE_bool(logs, false, "print logs to stderr");
-
-DEFINE_bool(send_side_bwe, true, "Use send-side bandwidth estimation");
-
-DEFINE_bool(allow_reordering, false, "Allow packet reordering to occur");
-
-DEFINE_bool(use_ulpfec, false, "Use RED+ULPFEC forward error correction.");
-
-DEFINE_bool(use_flexfec, false, "Use FlexFEC forward error correction.");
-
-DEFINE_bool(audio, false, "Add audio stream");
-
-DEFINE_bool(audio_video_sync, false, "Sync audio and video stream (no effect if"
-    " audio is false)");
-
-DEFINE_bool(audio_dtx, false, "Enable audio DTX (no effect if audio is false)");
-
-DEFINE_bool(video, true, "Add video stream");
-
-DEFINE_string(
-    force_fieldtrials,
-    "",
-    "Field trials control experimental feature code which can be forced. "
-    "E.g. running with --force_fieldtrials=WebRTC-FooFeature/Enable/"
-    " will assign the group Enable to field trial WebRTC-FooFeature. Multiple "
-    "trials are separated by \"/\"");
-
-// Video-specific flags.
-DEFINE_string(clip,
-              "",
-              "Name of the clip to show. If empty, using chroma generator.");
-std::string Clip() {
-  return static_cast<std::string>(FLAG_clip);
-}
-
-DEFINE_bool(help, false, "prints this message");
-
-}  // namespace flags
-
-void Loopback() {
-  FakeNetworkPipe::Config pipe_config;
-  pipe_config.loss_percent = flags::LossPercent();
-  pipe_config.avg_burst_loss_length = flags::AvgBurstLossLength();
-  pipe_config.link_capacity_kbps = flags::LinkCapacityKbps();
-  pipe_config.queue_length_packets = flags::QueueSize();
-  pipe_config.queue_delay_ms = flags::AvgPropagationDelayMs();
-  pipe_config.delay_standard_deviation_ms = flags::StdPropagationDelayMs();
-  pipe_config.allow_reordering = flags::FLAG_allow_reordering;
-
-  Call::Config::BitrateConfig call_bitrate_config;
-  call_bitrate_config.min_bitrate_bps = flags::MinBitrateKbps() * 1000;
-  call_bitrate_config.start_bitrate_bps = flags::StartBitrateKbps() * 1000;
-  call_bitrate_config.max_bitrate_bps = flags::MaxBitrateKbps() * 1000;
-
-  VideoQualityTest::Params params;
-  params.call = {flags::FLAG_send_side_bwe, call_bitrate_config, 0};
-  params.video = {flags::FLAG_video,
-                  flags::Width(),
-                  flags::Height(),
-                  flags::Fps(),
-                  flags::MinBitrateKbps() * 1000,
-                  flags::TargetBitrateKbps() * 1000,
-                  flags::MaxBitrateKbps() * 1000,
-                  flags::FLAG_suspend_below_min_bitrate,
-                  flags::Codec(),
-                  flags::NumTemporalLayers(),
-                  flags::SelectedTL(),
-                  0,  // No min transmit bitrate.
-                  flags::FLAG_use_ulpfec,
-                  flags::FLAG_use_flexfec,
-                  flags::Clip(),
-                  flags::GetCaptureDevice()};
-  params.audio = {flags::FLAG_audio, flags::FLAG_audio_video_sync,
-                  flags::FLAG_audio_dtx};
-  params.logging = {flags::FLAG_logs, flags::FLAG_rtc_event_log_name,
-                    flags::FLAG_rtp_dump_name, flags::FLAG_encoded_frame_path};
-  params.screenshare.enabled = false;
-  params.analyzer = {"video", 0.0, 0.0, flags::DurationSecs(),
-      flags::OutputFilename(), flags::GraphTitle()};
-  params.pipe = pipe_config;
-
-  if (flags::NumStreams() > 1 && flags::Stream0().empty() &&
-      flags::Stream1().empty()) {
-    params.ss.infer_streams = true;
-  }
-
-  std::vector<std::string> stream_descriptors;
-  stream_descriptors.push_back(flags::Stream0());
-  stream_descriptors.push_back(flags::Stream1());
-  std::vector<std::string> SL_descriptors;
-  SL_descriptors.push_back(flags::SL0());
-  SL_descriptors.push_back(flags::SL1());
-  VideoQualityTest::FillScalabilitySettings(
-      &params, stream_descriptors, flags::NumStreams(), flags::SelectedStream(),
-      flags::NumSpatialLayers(), flags::SelectedSL(), SL_descriptors);
-
-  VideoQualityTest test;
-  if (flags::DurationSecs()) {
-    test.RunWithAnalyzer(params);
-  } else {
-    test.RunWithRenderers(params);
-  }
-}
-}  // namespace webrtc
-
-int main(int argc, char* argv[]) {
-  ::testing::InitGoogleTest(&argc, argv);
-  rtc::FlagList::SetFlagsFromCommandLine(&argc, argv, true);
-  if (webrtc::flags::FLAG_help) {
-    rtc::FlagList::Print(nullptr, false);
-    return 0;
-  }
-
-  // InitFieldTrialsFromString needs a reference to an std::string instance,
-  // with a scope that outlives the test.
-  std::string field_trials = webrtc::flags::FLAG_force_fieldtrials;
-  webrtc::test::InitFieldTrialsFromString(field_trials);
-
-  webrtc::test::RunTest(webrtc::Loopback);
-  return 0;
-}
diff --git a/video/video_quality_test.cc b/video/video_quality_test.cc
deleted file mode 100644
index 6294184..0000000
--- a/video/video_quality_test.cc
+++ /dev/null
@@ -1,2189 +0,0 @@
-/*
- *  Copyright (c) 2015 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/video/video_quality_test.h"
-
-#include <stdio.h>
-#include <algorithm>
-#include <deque>
-#include <map>
-#include <set>
-#include <sstream>
-#include <string>
-#include <vector>
-
-#include "webrtc/api/optional.h"
-#include "webrtc/call/call.h"
-#include "webrtc/common_video/libyuv/include/webrtc_libyuv.h"
-#include "webrtc/logging/rtc_event_log/rtc_event_log.h"
-#include "webrtc/media/engine/webrtcvideoengine.h"
-#include "webrtc/modules/audio_mixer/audio_mixer_impl.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_header_parser.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_format.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_utility.h"
-#include "webrtc/modules/video_coding/codecs/h264/include/h264.h"
-#include "webrtc/modules/video_coding/codecs/vp8/include/vp8.h"
-#include "webrtc/modules/video_coding/codecs/vp8/include/vp8_common_types.h"
-#include "webrtc/modules/video_coding/codecs/vp9/include/vp9.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/cpu_time.h"
-#include "webrtc/rtc_base/event.h"
-#include "webrtc/rtc_base/flags.h"
-#include "webrtc/rtc_base/format_macros.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/memory_usage.h"
-#include "webrtc/rtc_base/pathutils.h"
-#include "webrtc/rtc_base/platform_file.h"
-#include "webrtc/rtc_base/ptr_util.h"
-#include "webrtc/rtc_base/timeutils.h"
-#include "webrtc/system_wrappers/include/cpu_info.h"
-#include "webrtc/system_wrappers/include/field_trial.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/layer_filtering_transport.h"
-#include "webrtc/test/run_loop.h"
-#include "webrtc/test/statistics.h"
-#include "webrtc/test/testsupport/fileutils.h"
-#include "webrtc/test/testsupport/frame_writer.h"
-#include "webrtc/test/testsupport/test_output.h"
-#include "webrtc/test/vcm_capturer.h"
-#include "webrtc/test/video_renderer.h"
-#include "webrtc/voice_engine/include/voe_base.h"
-
-#include "webrtc/test/rtp_file_writer.h"
-
-DEFINE_bool(save_worst_frame,
-            false,
-            "Enable saving a frame with the lowest PSNR to a jpeg file in the "
-            "test_output_dir");
-
-namespace {
-
-constexpr int kSendStatsPollingIntervalMs = 1000;
-
-constexpr size_t kMaxComparisons = 10;
-constexpr char kSyncGroup[] = "av_sync";
-constexpr int kOpusMinBitrateBps = 6000;
-constexpr int kOpusBitrateFbBps = 32000;
-constexpr int kFramesSentInQuickTest = 1;
-constexpr uint32_t kThumbnailSendSsrcStart = 0xE0000;
-constexpr uint32_t kThumbnailRtxSsrcStart = 0xF0000;
-
-constexpr int kDefaultMaxQp = cricket::WebRtcVideoChannel::kDefaultQpMax;
-
-struct VoiceEngineState {
-  VoiceEngineState()
-      : voice_engine(nullptr),
-        base(nullptr),
-        send_channel_id(-1),
-        receive_channel_id(-1) {}
-
-  webrtc::VoiceEngine* voice_engine;
-  webrtc::VoEBase* base;
-  int send_channel_id;
-  int receive_channel_id;
-};
-
-void CreateVoiceEngine(
-    VoiceEngineState* voe,
-    webrtc::AudioProcessing* apm,
-    rtc::scoped_refptr<webrtc::AudioDecoderFactory> decoder_factory) {
-  voe->voice_engine = webrtc::VoiceEngine::Create();
-  voe->base = webrtc::VoEBase::GetInterface(voe->voice_engine);
-  EXPECT_EQ(0, voe->base->Init(nullptr, apm, decoder_factory));
-  webrtc::VoEBase::ChannelConfig config;
-  config.enable_voice_pacing = true;
-  voe->send_channel_id = voe->base->CreateChannel(config);
-  EXPECT_GE(voe->send_channel_id, 0);
-  voe->receive_channel_id = voe->base->CreateChannel();
-  EXPECT_GE(voe->receive_channel_id, 0);
-}
-
-void DestroyVoiceEngine(VoiceEngineState* voe) {
-  voe->base->DeleteChannel(voe->send_channel_id);
-  voe->send_channel_id = -1;
-  voe->base->DeleteChannel(voe->receive_channel_id);
-  voe->receive_channel_id = -1;
-  voe->base->Release();
-  voe->base = nullptr;
-
-  webrtc::VoiceEngine::Delete(voe->voice_engine);
-  voe->voice_engine = nullptr;
-}
-
-class VideoStreamFactory
-    : public webrtc::VideoEncoderConfig::VideoStreamFactoryInterface {
- public:
-  explicit VideoStreamFactory(const std::vector<webrtc::VideoStream>& streams)
-      : streams_(streams) {}
-
- private:
-  std::vector<webrtc::VideoStream> CreateEncoderStreams(
-      int width,
-      int height,
-      const webrtc::VideoEncoderConfig& encoder_config) override {
-    // The highest layer must match the incoming resolution.
-    std::vector<webrtc::VideoStream> streams = streams_;
-    streams[streams_.size() - 1].height = height;
-    streams[streams_.size() - 1].width = width;
-    return streams;
-  }
-
-  std::vector<webrtc::VideoStream> streams_;
-};
-
-bool IsFlexfec(int payload_type) {
-  return payload_type == webrtc::VideoQualityTest::kFlexfecPayloadType;
-}
-
-}  // namespace
-
-namespace webrtc {
-
-class VideoAnalyzer : public PacketReceiver,
-                      public Transport,
-                      public rtc::VideoSinkInterface<VideoFrame> {
- public:
-  VideoAnalyzer(test::LayerFilteringTransport* transport,
-                const std::string& test_label,
-                double avg_psnr_threshold,
-                double avg_ssim_threshold,
-                int duration_frames,
-                FILE* graph_data_output_file,
-                const std::string& graph_title,
-                uint32_t ssrc_to_analyze,
-                uint32_t rtx_ssrc_to_analyze,
-                size_t selected_stream,
-                int selected_sl,
-                int selected_tl,
-                bool is_quick_test_enabled,
-                Clock* clock,
-                std::string rtp_dump_name)
-      : transport_(transport),
-        receiver_(nullptr),
-        call_(nullptr),
-        send_stream_(nullptr),
-        receive_stream_(nullptr),
-        captured_frame_forwarder_(this, clock),
-        test_label_(test_label),
-        graph_data_output_file_(graph_data_output_file),
-        graph_title_(graph_title),
-        ssrc_to_analyze_(ssrc_to_analyze),
-        rtx_ssrc_to_analyze_(rtx_ssrc_to_analyze),
-        selected_stream_(selected_stream),
-        selected_sl_(selected_sl),
-        selected_tl_(selected_tl),
-        pre_encode_proxy_(this),
-        encode_timing_proxy_(this),
-        last_fec_bytes_(0),
-        frames_to_process_(duration_frames),
-        frames_recorded_(0),
-        frames_processed_(0),
-        dropped_frames_(0),
-        dropped_frames_before_first_encode_(0),
-        dropped_frames_before_rendering_(0),
-        last_render_time_(0),
-        rtp_timestamp_delta_(0),
-        total_media_bytes_(0),
-        first_sending_time_(0),
-        last_sending_time_(0),
-        cpu_time_(0),
-        wallclock_time_(0),
-        avg_psnr_threshold_(avg_psnr_threshold),
-        avg_ssim_threshold_(avg_ssim_threshold),
-        is_quick_test_enabled_(is_quick_test_enabled),
-        stats_polling_thread_(&PollStatsThread, this, "StatsPoller"),
-        comparison_available_event_(false, false),
-        done_(true, false),
-        clock_(clock),
-        start_ms_(clock->TimeInMilliseconds()) {
-    // Create thread pool for CPU-expensive PSNR/SSIM calculations.
-
-    // Try to use about as many threads as cores, but leave kMinCoresLeft alone,
-    // so that we don't accidentally starve "real" worker threads (codec etc).
-    // Also, don't allocate more than kMaxComparisonThreads, even if there are
-    // spare cores.
-
-    uint32_t num_cores = CpuInfo::DetectNumberOfCores();
-    RTC_DCHECK_GE(num_cores, 1);
-    static const uint32_t kMinCoresLeft = 4;
-    static const uint32_t kMaxComparisonThreads = 8;
-
-    if (num_cores <= kMinCoresLeft) {
-      num_cores = 1;
-    } else {
-      num_cores -= kMinCoresLeft;
-      num_cores = std::min(num_cores, kMaxComparisonThreads);
-    }
-
-    for (uint32_t i = 0; i < num_cores; ++i) {
-      rtc::PlatformThread* thread =
-          new rtc::PlatformThread(&FrameComparisonThread, this, "Analyzer");
-      thread->Start();
-      comparison_thread_pool_.push_back(thread);
-    }
-
-    if (!rtp_dump_name.empty()) {
-      fprintf(stdout, "Writing rtp dump to %s\n", rtp_dump_name.c_str());
-      rtp_file_writer_.reset(test::RtpFileWriter::Create(
-          test::RtpFileWriter::kRtpDump, rtp_dump_name));
-    }
-  }
-
-  ~VideoAnalyzer() {
-    for (rtc::PlatformThread* thread : comparison_thread_pool_) {
-      thread->Stop();
-      delete thread;
-    }
-  }
-
-  virtual void SetReceiver(PacketReceiver* receiver) { receiver_ = receiver; }
-
-  void SetSource(test::VideoCapturer* video_capturer, bool respect_sink_wants) {
-    if (respect_sink_wants)
-      captured_frame_forwarder_.SetSource(video_capturer);
-    rtc::VideoSinkWants wants;
-    video_capturer->AddOrUpdateSink(InputInterface(), wants);
-  }
-
-  void SetCall(Call* call) {
-    rtc::CritScope lock(&crit_);
-    RTC_DCHECK(!call_);
-    call_ = call;
-  }
-
-  void SetSendStream(VideoSendStream* stream) {
-    rtc::CritScope lock(&crit_);
-    RTC_DCHECK(!send_stream_);
-    send_stream_ = stream;
-  }
-
-  void SetReceiveStream(VideoReceiveStream* stream) {
-    rtc::CritScope lock(&crit_);
-    RTC_DCHECK(!receive_stream_);
-    receive_stream_ = stream;
-  }
-
-  rtc::VideoSinkInterface<VideoFrame>* InputInterface() {
-    return &captured_frame_forwarder_;
-  }
-  rtc::VideoSourceInterface<VideoFrame>* OutputInterface() {
-    return &captured_frame_forwarder_;
-  }
-
-  DeliveryStatus DeliverPacket(MediaType media_type,
-                               const uint8_t* packet,
-                               size_t length,
-                               const PacketTime& packet_time) override {
-    // Ignore timestamps of RTCP packets. They're not synchronized with
-    // RTP packet timestamps and so they would confuse wrap_handler_.
-    if (RtpHeaderParser::IsRtcp(packet, length)) {
-      return receiver_->DeliverPacket(media_type, packet, length, packet_time);
-    }
-
-    if (rtp_file_writer_) {
-      test::RtpPacket p;
-      memcpy(p.data, packet, length);
-      p.length = length;
-      p.original_length = length;
-      p.time_ms = clock_->TimeInMilliseconds() - start_ms_;
-      rtp_file_writer_->WritePacket(&p);
-    }
-
-    RtpUtility::RtpHeaderParser parser(packet, length);
-    RTPHeader header;
-    parser.Parse(&header);
-    if (!IsFlexfec(header.payloadType) &&
-        (header.ssrc == ssrc_to_analyze_ ||
-         header.ssrc == rtx_ssrc_to_analyze_)) {
-      // Ignore FlexFEC timestamps, to avoid collisions with media timestamps.
-      // (FlexFEC and media are sent on different SSRCs, which have different
-      // timestamps spaces.)
-      // Also ignore packets from wrong SSRC, but include retransmits.
-      rtc::CritScope lock(&crit_);
-      int64_t timestamp =
-          wrap_handler_.Unwrap(header.timestamp - rtp_timestamp_delta_);
-      recv_times_[timestamp] =
-          Clock::GetRealTimeClock()->CurrentNtpInMilliseconds();
-    }
-
-    return receiver_->DeliverPacket(media_type, packet, length, packet_time);
-  }
-
-  void MeasuredEncodeTiming(int64_t ntp_time_ms, int encode_time_ms) {
-    rtc::CritScope crit(&comparison_lock_);
-    samples_encode_time_ms_[ntp_time_ms] = encode_time_ms;
-  }
-
-  void PreEncodeOnFrame(const VideoFrame& video_frame) {
-    rtc::CritScope lock(&crit_);
-    if (!first_encoded_timestamp_) {
-      while (frames_.front().timestamp() != video_frame.timestamp()) {
-        ++dropped_frames_before_first_encode_;
-        frames_.pop_front();
-        RTC_CHECK(!frames_.empty());
-      }
-      first_encoded_timestamp_ =
-          rtc::Optional<uint32_t>(video_frame.timestamp());
-    }
-  }
-
-  void PostEncodeFrameCallback(const EncodedFrame& encoded_frame) {
-    rtc::CritScope lock(&crit_);
-    if (!first_sent_timestamp_ &&
-        encoded_frame.stream_id_ == selected_stream_) {
-      first_sent_timestamp_ = rtc::Optional<uint32_t>(encoded_frame.timestamp_);
-    }
-  }
-
-  bool SendRtp(const uint8_t* packet,
-               size_t length,
-               const PacketOptions& options) override {
-    RtpUtility::RtpHeaderParser parser(packet, length);
-    RTPHeader header;
-    parser.Parse(&header);
-
-    int64_t current_time =
-        Clock::GetRealTimeClock()->CurrentNtpInMilliseconds();
-
-    bool result = transport_->SendRtp(packet, length, options);
-    {
-      rtc::CritScope lock(&crit_);
-      if (rtp_timestamp_delta_ == 0 && header.ssrc == ssrc_to_analyze_) {
-        RTC_CHECK(static_cast<bool>(first_sent_timestamp_));
-        rtp_timestamp_delta_ = header.timestamp - *first_sent_timestamp_;
-      }
-
-      if (!IsFlexfec(header.payloadType) && header.ssrc == ssrc_to_analyze_) {
-        // Ignore FlexFEC timestamps, to avoid collisions with media timestamps.
-        // (FlexFEC and media are sent on different SSRCs, which have different
-        // timestamps spaces.)
-        // Also ignore packets from wrong SSRC and retransmits.
-        int64_t timestamp =
-            wrap_handler_.Unwrap(header.timestamp - rtp_timestamp_delta_);
-        send_times_[timestamp] = current_time;
-
-        if (IsInSelectedSpatialAndTemporalLayer(packet, length, header)) {
-          encoded_frame_sizes_[timestamp] +=
-              length - (header.headerLength + header.paddingLength);
-          total_media_bytes_ +=
-              length - (header.headerLength + header.paddingLength);
-        }
-        if (first_sending_time_ == 0)
-          first_sending_time_ = current_time;
-        last_sending_time_ = current_time;
-      }
-    }
-    return result;
-  }
-
-  bool SendRtcp(const uint8_t* packet, size_t length) override {
-    return transport_->SendRtcp(packet, length);
-  }
-
-  void OnFrame(const VideoFrame& video_frame) override {
-    int64_t render_time_ms =
-        Clock::GetRealTimeClock()->CurrentNtpInMilliseconds();
-
-    rtc::CritScope lock(&crit_);
-
-    StartExcludingCpuThreadTime();
-
-    int64_t send_timestamp =
-        wrap_handler_.Unwrap(video_frame.timestamp() - rtp_timestamp_delta_);
-
-    while (wrap_handler_.Unwrap(frames_.front().timestamp()) < send_timestamp) {
-      if (!last_rendered_frame_) {
-        // No previous frame rendered, this one was dropped after sending but
-        // before rendering.
-        ++dropped_frames_before_rendering_;
-      } else {
-        AddFrameComparison(frames_.front(), *last_rendered_frame_, true,
-                           render_time_ms);
-      }
-      frames_.pop_front();
-      RTC_DCHECK(!frames_.empty());
-    }
-
-    VideoFrame reference_frame = frames_.front();
-    frames_.pop_front();
-    int64_t reference_timestamp =
-        wrap_handler_.Unwrap(reference_frame.timestamp());
-    if (send_timestamp == reference_timestamp - 1) {
-      // TODO(ivica): Make this work for > 2 streams.
-      // Look at RTPSender::BuildRTPHeader.
-      ++send_timestamp;
-    }
-    ASSERT_EQ(reference_timestamp, send_timestamp);
-
-    AddFrameComparison(reference_frame, video_frame, false, render_time_ms);
-
-    last_rendered_frame_ = rtc::Optional<VideoFrame>(video_frame);
-
-    StopExcludingCpuThreadTime();
-  }
-
-  void Wait() {
-    // Frame comparisons can be very expensive. Wait for test to be done, but
-    // at time-out check if frames_processed is going up. If so, give it more
-    // time, otherwise fail. Hopefully this will reduce test flakiness.
-
-    stats_polling_thread_.Start();
-
-    int last_frames_processed = -1;
-    int iteration = 0;
-    while (!done_.Wait(VideoQualityTest::kDefaultTimeoutMs)) {
-      int frames_processed;
-      {
-        rtc::CritScope crit(&comparison_lock_);
-        frames_processed = frames_processed_;
-      }
-
-      // Print some output so test infrastructure won't think we've crashed.
-      const char* kKeepAliveMessages[3] = {
-          "Uh, I'm-I'm not quite dead, sir.",
-          "Uh, I-I think uh, I could pull through, sir.",
-          "Actually, I think I'm all right to come with you--"};
-      printf("- %s\n", kKeepAliveMessages[iteration++ % 3]);
-
-      if (last_frames_processed == -1) {
-        last_frames_processed = frames_processed;
-        continue;
-      }
-      if (frames_processed == last_frames_processed) {
-        EXPECT_GT(frames_processed, last_frames_processed)
-            << "Analyzer stalled while waiting for test to finish.";
-        done_.Set();
-        break;
-      }
-      last_frames_processed = frames_processed;
-    }
-
-    if (iteration > 0)
-      printf("- Farewell, sweet Concorde!\n");
-
-    stats_polling_thread_.Stop();
-  }
-
-  rtc::VideoSinkInterface<VideoFrame>* pre_encode_proxy() {
-    return &pre_encode_proxy_;
-  }
-  EncodedFrameObserver* encode_timing_proxy() { return &encode_timing_proxy_; }
-
-  void StartMeasuringCpuProcessTime() {
-    rtc::CritScope lock(&cpu_measurement_lock_);
-    cpu_time_ -= rtc::GetProcessCpuTimeNanos();
-    wallclock_time_ -= rtc::SystemTimeNanos();
-  }
-
-  void StopMeasuringCpuProcessTime() {
-    rtc::CritScope lock(&cpu_measurement_lock_);
-    cpu_time_ += rtc::GetProcessCpuTimeNanos();
-    wallclock_time_ += rtc::SystemTimeNanos();
-  }
-
-  void StartExcludingCpuThreadTime() {
-    rtc::CritScope lock(&cpu_measurement_lock_);
-    cpu_time_ += rtc::GetThreadCpuTimeNanos();
-  }
-
-  void StopExcludingCpuThreadTime() {
-    rtc::CritScope lock(&cpu_measurement_lock_);
-    cpu_time_ -= rtc::GetThreadCpuTimeNanos();
-  }
-
-  double GetCpuUsagePercent() {
-    rtc::CritScope lock(&cpu_measurement_lock_);
-    return static_cast<double>(cpu_time_) / wallclock_time_ * 100.0;
-  }
-
-  test::LayerFilteringTransport* const transport_;
-  PacketReceiver* receiver_;
-
- private:
-  struct FrameComparison {
-    FrameComparison()
-        : dropped(false),
-          input_time_ms(0),
-          send_time_ms(0),
-          recv_time_ms(0),
-          render_time_ms(0),
-          encoded_frame_size(0) {}
-
-    FrameComparison(const VideoFrame& reference,
-                    const VideoFrame& render,
-                    bool dropped,
-                    int64_t input_time_ms,
-                    int64_t send_time_ms,
-                    int64_t recv_time_ms,
-                    int64_t render_time_ms,
-                    size_t encoded_frame_size)
-        : reference(reference),
-          render(render),
-          dropped(dropped),
-          input_time_ms(input_time_ms),
-          send_time_ms(send_time_ms),
-          recv_time_ms(recv_time_ms),
-          render_time_ms(render_time_ms),
-          encoded_frame_size(encoded_frame_size) {}
-
-    FrameComparison(bool dropped,
-                    int64_t input_time_ms,
-                    int64_t send_time_ms,
-                    int64_t recv_time_ms,
-                    int64_t render_time_ms,
-                    size_t encoded_frame_size)
-        : dropped(dropped),
-          input_time_ms(input_time_ms),
-          send_time_ms(send_time_ms),
-          recv_time_ms(recv_time_ms),
-          render_time_ms(render_time_ms),
-          encoded_frame_size(encoded_frame_size) {}
-
-    rtc::Optional<VideoFrame> reference;
-    rtc::Optional<VideoFrame> render;
-    bool dropped;
-    int64_t input_time_ms;
-    int64_t send_time_ms;
-    int64_t recv_time_ms;
-    int64_t render_time_ms;
-    size_t encoded_frame_size;
-  };
-
-  struct Sample {
-    Sample(int dropped,
-           int64_t input_time_ms,
-           int64_t send_time_ms,
-           int64_t recv_time_ms,
-           int64_t render_time_ms,
-           size_t encoded_frame_size,
-           double psnr,
-           double ssim)
-        : dropped(dropped),
-          input_time_ms(input_time_ms),
-          send_time_ms(send_time_ms),
-          recv_time_ms(recv_time_ms),
-          render_time_ms(render_time_ms),
-          encoded_frame_size(encoded_frame_size),
-          psnr(psnr),
-          ssim(ssim) {}
-
-    int dropped;
-    int64_t input_time_ms;
-    int64_t send_time_ms;
-    int64_t recv_time_ms;
-    int64_t render_time_ms;
-    size_t encoded_frame_size;
-    double psnr;
-    double ssim;
-  };
-
-  // This class receives the send-side OnEncodeTiming and is provided to not
-  // conflict with the receiver-side pre_decode_callback.
-  class OnEncodeTimingProxy : public EncodedFrameObserver {
-   public:
-    explicit OnEncodeTimingProxy(VideoAnalyzer* parent) : parent_(parent) {}
-
-    void OnEncodeTiming(int64_t ntp_time_ms, int encode_time_ms) override {
-      parent_->MeasuredEncodeTiming(ntp_time_ms, encode_time_ms);
-    }
-    void EncodedFrameCallback(const EncodedFrame& frame) override {
-      parent_->PostEncodeFrameCallback(frame);
-    }
-
-   private:
-    VideoAnalyzer* const parent_;
-  };
-
-  // This class receives the send-side OnFrame callback and is provided to not
-  // conflict with the receiver-side renderer callback.
-  class PreEncodeProxy : public rtc::VideoSinkInterface<VideoFrame> {
-   public:
-    explicit PreEncodeProxy(VideoAnalyzer* parent) : parent_(parent) {}
-
-    void OnFrame(const VideoFrame& video_frame) override {
-      parent_->PreEncodeOnFrame(video_frame);
-    }
-
-   private:
-    VideoAnalyzer* const parent_;
-  };
-
-  bool IsInSelectedSpatialAndTemporalLayer(const uint8_t* packet,
-                                           size_t length,
-                                           const RTPHeader& header) {
-    if (header.payloadType != test::CallTest::kPayloadTypeVP9 &&
-        header.payloadType != test::CallTest::kPayloadTypeVP8) {
-      return true;
-    } else {
-      // Get VP8 and VP9 specific header to check layers indexes.
-      const uint8_t* payload = packet + header.headerLength;
-      const size_t payload_length = length - header.headerLength;
-      const size_t payload_data_length = payload_length - header.paddingLength;
-      const bool is_vp8 = header.payloadType == test::CallTest::kPayloadTypeVP8;
-      std::unique_ptr<RtpDepacketizer> depacketizer(
-          RtpDepacketizer::Create(is_vp8 ? kRtpVideoVp8 : kRtpVideoVp9));
-      RtpDepacketizer::ParsedPayload parsed_payload;
-      bool result =
-          depacketizer->Parse(&parsed_payload, payload, payload_data_length);
-      RTC_DCHECK(result);
-      const int temporal_idx = static_cast<int>(
-          is_vp8 ? parsed_payload.type.Video.codecHeader.VP8.temporalIdx
-                 : parsed_payload.type.Video.codecHeader.VP9.temporal_idx);
-      const int spatial_idx = static_cast<int>(
-          is_vp8 ? kNoSpatialIdx
-                 : parsed_payload.type.Video.codecHeader.VP9.spatial_idx);
-      return (selected_tl_ < 0 || temporal_idx == kNoTemporalIdx ||
-              temporal_idx <= selected_tl_) &&
-             (selected_sl_ < 0 || spatial_idx == kNoSpatialIdx ||
-              spatial_idx <= selected_sl_);
-    }
-  }
-
-  void AddFrameComparison(const VideoFrame& reference,
-                          const VideoFrame& render,
-                          bool dropped,
-                          int64_t render_time_ms)
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_) {
-    int64_t reference_timestamp = wrap_handler_.Unwrap(reference.timestamp());
-    int64_t send_time_ms = send_times_[reference_timestamp];
-    send_times_.erase(reference_timestamp);
-    int64_t recv_time_ms = recv_times_[reference_timestamp];
-    recv_times_.erase(reference_timestamp);
-
-    // TODO(ivica): Make this work for > 2 streams.
-    auto it = encoded_frame_sizes_.find(reference_timestamp);
-    if (it == encoded_frame_sizes_.end())
-      it = encoded_frame_sizes_.find(reference_timestamp - 1);
-    size_t encoded_size = it == encoded_frame_sizes_.end() ? 0 : it->second;
-    if (it != encoded_frame_sizes_.end())
-      encoded_frame_sizes_.erase(it);
-
-    rtc::CritScope crit(&comparison_lock_);
-    if (comparisons_.size() < kMaxComparisons) {
-      comparisons_.push_back(FrameComparison(reference, render, dropped,
-                                             reference.ntp_time_ms(),
-                                             send_time_ms, recv_time_ms,
-                                             render_time_ms, encoded_size));
-    } else {
-      comparisons_.push_back(FrameComparison(dropped,
-                                             reference.ntp_time_ms(),
-                                             send_time_ms, recv_time_ms,
-                                             render_time_ms, encoded_size));
-    }
-    comparison_available_event_.Set();
-  }
-
-  static void PollStatsThread(void* obj) {
-    static_cast<VideoAnalyzer*>(obj)->PollStats();
-  }
-
-  void PollStats() {
-    while (!done_.Wait(kSendStatsPollingIntervalMs)) {
-      rtc::CritScope crit(&comparison_lock_);
-
-      Call::Stats call_stats = call_->GetStats();
-      send_bandwidth_bps_.AddSample(call_stats.send_bandwidth_bps);
-
-      VideoSendStream::Stats send_stats = send_stream_->GetStats();
-      // It's not certain that we yet have estimates for any of these stats.
-      // Check that they are positive before mixing them in.
-      if (send_stats.encode_frame_rate > 0)
-        encode_frame_rate_.AddSample(send_stats.encode_frame_rate);
-      if (send_stats.avg_encode_time_ms > 0)
-        encode_time_ms_.AddSample(send_stats.avg_encode_time_ms);
-      if (send_stats.encode_usage_percent > 0)
-        encode_usage_percent_.AddSample(send_stats.encode_usage_percent);
-      if (send_stats.media_bitrate_bps > 0)
-        media_bitrate_bps_.AddSample(send_stats.media_bitrate_bps);
-      size_t fec_bytes = 0;
-      for (auto kv : send_stats.substreams) {
-        fec_bytes += kv.second.rtp_stats.fec.payload_bytes +
-                     kv.second.rtp_stats.fec.padding_bytes;
-      }
-      fec_bitrate_bps_.AddSample((fec_bytes - last_fec_bytes_) * 8);
-      last_fec_bytes_ = fec_bytes;
-
-      if (receive_stream_ != nullptr) {
-        VideoReceiveStream::Stats receive_stats = receive_stream_->GetStats();
-        if (receive_stats.decode_ms > 0)
-          decode_time_ms_.AddSample(receive_stats.decode_ms);
-        if (receive_stats.max_decode_ms > 0)
-          decode_time_max_ms_.AddSample(receive_stats.max_decode_ms);
-      }
-
-      memory_usage_.AddSample(rtc::GetProcessResidentSizeBytes());
-    }
-  }
-
-  static bool FrameComparisonThread(void* obj) {
-    return static_cast<VideoAnalyzer*>(obj)->CompareFrames();
-  }
-
-  bool CompareFrames() {
-    if (AllFramesRecorded())
-      return false;
-
-    FrameComparison comparison;
-
-    if (!PopComparison(&comparison)) {
-      // Wait until new comparison task is available, or test is done.
-      // If done, wake up remaining threads waiting.
-      comparison_available_event_.Wait(1000);
-      if (AllFramesRecorded()) {
-        comparison_available_event_.Set();
-        return false;
-      }
-      return true;  // Try again.
-    }
-
-    StartExcludingCpuThreadTime();
-
-    PerformFrameComparison(comparison);
-
-    StopExcludingCpuThreadTime();
-
-    if (FrameProcessed()) {
-      PrintResults();
-      if (graph_data_output_file_)
-        PrintSamplesToFile();
-      done_.Set();
-      comparison_available_event_.Set();
-      return false;
-    }
-
-    return true;
-  }
-
-  bool PopComparison(FrameComparison* comparison) {
-    rtc::CritScope crit(&comparison_lock_);
-    // If AllFramesRecorded() is true, it means we have already popped
-    // frames_to_process_ frames from comparisons_, so there is no more work
-    // for this thread to be done. frames_processed_ might still be lower if
-    // all comparisons are not done, but those frames are currently being
-    // worked on by other threads.
-    if (comparisons_.empty() || AllFramesRecorded())
-      return false;
-
-    *comparison = comparisons_.front();
-    comparisons_.pop_front();
-
-    FrameRecorded();
-    return true;
-  }
-
-  // Increment counter for number of frames received for comparison.
-  void FrameRecorded() {
-    rtc::CritScope crit(&comparison_lock_);
-    ++frames_recorded_;
-  }
-
-  // Returns true if all frames to be compared have been taken from the queue.
-  bool AllFramesRecorded() {
-    rtc::CritScope crit(&comparison_lock_);
-    assert(frames_recorded_ <= frames_to_process_);
-    return frames_recorded_ == frames_to_process_;
-  }
-
-  // Increase count of number of frames processed. Returns true if this was the
-  // last frame to be processed.
-  bool FrameProcessed() {
-    rtc::CritScope crit(&comparison_lock_);
-    ++frames_processed_;
-    assert(frames_processed_ <= frames_to_process_);
-    return frames_processed_ == frames_to_process_;
-  }
-
-  void PrintResults() {
-    StopMeasuringCpuProcessTime();
-    rtc::CritScope crit(&comparison_lock_);
-    PrintResult("psnr", psnr_, " dB");
-    PrintResult("ssim", ssim_, " score");
-    PrintResult("sender_time", sender_time_, " ms");
-    PrintResult("receiver_time", receiver_time_, " ms");
-    PrintResult("total_delay_incl_network", end_to_end_, " ms");
-    PrintResult("time_between_rendered_frames", rendered_delta_, " ms");
-    PrintResult("encode_frame_rate", encode_frame_rate_, " fps");
-    PrintResult("encode_time", encode_time_ms_, " ms");
-    PrintResult("media_bitrate", media_bitrate_bps_, " bps");
-    PrintResult("fec_bitrate", fec_bitrate_bps_, " bps");
-    PrintResult("send_bandwidth", send_bandwidth_bps_, " bps");
-
-    if (worst_frame_) {
-      printf("RESULT min_psnr: %s = %lf dB\n", test_label_.c_str(),
-             worst_frame_->psnr);
-    }
-
-    if (receive_stream_ != nullptr) {
-      PrintResult("decode_time", decode_time_ms_, " ms");
-    }
-
-    printf("RESULT dropped_frames: %s = %d frames\n", test_label_.c_str(),
-           dropped_frames_);
-    printf("RESULT cpu_usage: %s = %lf %%\n", test_label_.c_str(),
-           GetCpuUsagePercent());
-
-#if defined(WEBRTC_WIN)
-      // On Linux and Mac in Resident Set some unused pages may be counted.
-      // Therefore this metric will depend on order in which tests are run and
-      // will be flaky.
-    PrintResult("memory_usage", memory_usage_, " bytes");
-#endif
-
-    // Saving only the worst frame for manual analysis. Intention here is to
-    // only detect video corruptions and not to track picture quality. Thus,
-    // jpeg is used here.
-    if (FLAG_save_worst_frame && worst_frame_) {
-      std::string output_dir;
-      test::GetTestOutputDir(&output_dir);
-      std::string output_path =
-          rtc::Pathname(output_dir, test_label_ + ".jpg").pathname();
-      LOG(LS_INFO) << "Saving worst frame to " << output_path;
-      test::JpegFrameWriter frame_writer(output_path);
-      RTC_CHECK(frame_writer.WriteFrame(worst_frame_->frame,
-                                        100 /*best quality*/));
-    }
-
-    //  Disable quality check for quick test, as quality checks may fail
-    //  because too few samples were collected.
-    if (!is_quick_test_enabled_) {
-      EXPECT_GT(psnr_.Mean(), avg_psnr_threshold_);
-      EXPECT_GT(ssim_.Mean(), avg_ssim_threshold_);
-    }
-  }
-
-  void PerformFrameComparison(const FrameComparison& comparison) {
-    // Perform expensive psnr and ssim calculations while not holding lock.
-    double psnr = -1.0;
-    double ssim = -1.0;
-    if (comparison.reference && !comparison.dropped) {
-      psnr = I420PSNR(&*comparison.reference, &*comparison.render);
-      ssim = I420SSIM(&*comparison.reference, &*comparison.render);
-    }
-
-    rtc::CritScope crit(&comparison_lock_);
-
-    if (psnr >= 0.0 && (!worst_frame_ || worst_frame_->psnr > psnr)) {
-      worst_frame_.emplace(FrameWithPsnr{psnr, *comparison.render});
-    }
-
-    if (graph_data_output_file_) {
-      samples_.push_back(Sample(
-          comparison.dropped, comparison.input_time_ms, comparison.send_time_ms,
-          comparison.recv_time_ms, comparison.render_time_ms,
-          comparison.encoded_frame_size, psnr, ssim));
-    }
-    if (psnr >= 0.0)
-      psnr_.AddSample(psnr);
-    if (ssim >= 0.0)
-      ssim_.AddSample(ssim);
-
-    if (comparison.dropped) {
-      ++dropped_frames_;
-      return;
-    }
-    if (last_render_time_ != 0)
-      rendered_delta_.AddSample(comparison.render_time_ms - last_render_time_);
-    last_render_time_ = comparison.render_time_ms;
-
-    sender_time_.AddSample(comparison.send_time_ms - comparison.input_time_ms);
-    if (comparison.recv_time_ms > 0) {
-      // If recv_time_ms == 0, this frame consisted of a packets which were all
-      // lost in the transport. Since we were able to render the frame, however,
-      // the dropped packets were recovered by FlexFEC. The FlexFEC recovery
-      // happens internally in Call, and we can therefore here not know which
-      // FEC packets that protected the lost media packets. Consequently, we
-      // were not able to record a meaningful recv_time_ms. We therefore skip
-      // this sample.
-      //
-      // The reasoning above does not hold for ULPFEC and RTX, as for those
-      // strategies the timestamp of the received packets is set to the
-      // timestamp of the protected/retransmitted media packet. I.e., then
-      // recv_time_ms != 0, even though the media packets were lost.
-      receiver_time_.AddSample(comparison.render_time_ms -
-                               comparison.recv_time_ms);
-    }
-    end_to_end_.AddSample(comparison.render_time_ms - comparison.input_time_ms);
-    encoded_frame_size_.AddSample(comparison.encoded_frame_size);
-  }
-
-  void PrintResult(const char* result_type,
-                   test::Statistics stats,
-                   const char* unit) {
-    printf("RESULT %s: %s = {%f, %f}%s\n",
-           result_type,
-           test_label_.c_str(),
-           stats.Mean(),
-           stats.StandardDeviation(),
-           unit);
-  }
-
-  void PrintSamplesToFile(void) {
-    FILE* out = graph_data_output_file_;
-    rtc::CritScope crit(&comparison_lock_);
-    std::sort(samples_.begin(), samples_.end(),
-              [](const Sample& A, const Sample& B) -> bool {
-                return A.input_time_ms < B.input_time_ms;
-              });
-
-    fprintf(out, "%s\n", graph_title_.c_str());
-    fprintf(out, "%" PRIuS "\n", samples_.size());
-    fprintf(out,
-            "dropped "
-            "input_time_ms "
-            "send_time_ms "
-            "recv_time_ms "
-            "render_time_ms "
-            "encoded_frame_size "
-            "psnr "
-            "ssim "
-            "encode_time_ms\n");
-    int missing_encode_time_samples = 0;
-    for (const Sample& sample : samples_) {
-      auto it = samples_encode_time_ms_.find(sample.input_time_ms);
-      int encode_time_ms;
-      if (it != samples_encode_time_ms_.end()) {
-        encode_time_ms = it->second;
-      } else {
-        ++missing_encode_time_samples;
-        encode_time_ms = -1;
-      }
-      fprintf(out, "%d %" PRId64 " %" PRId64 " %" PRId64 " %" PRId64 " %" PRIuS
-                   " %lf %lf %d\n",
-              sample.dropped, sample.input_time_ms, sample.send_time_ms,
-              sample.recv_time_ms, sample.render_time_ms,
-              sample.encoded_frame_size, sample.psnr, sample.ssim,
-              encode_time_ms);
-    }
-    if (missing_encode_time_samples) {
-      fprintf(stderr,
-              "Warning: Missing encode_time_ms samples for %d frame(s).\n",
-              missing_encode_time_samples);
-    }
-  }
-
-  double GetAverageMediaBitrateBps() {
-    if (last_sending_time_ == first_sending_time_) {
-      return 0;
-    } else {
-      return static_cast<double>(total_media_bytes_) * 8 /
-             (last_sending_time_ - first_sending_time_) *
-             rtc::kNumMillisecsPerSec;
-    }
-  }
-
-  // Implements VideoSinkInterface to receive captured frames from a
-  // FrameGeneratorCapturer. Implements VideoSourceInterface to be able to act
-  // as a source to VideoSendStream.
-  // It forwards all input frames to the VideoAnalyzer for later comparison and
-  // forwards the captured frames to the VideoSendStream.
-  class CapturedFrameForwarder : public rtc::VideoSinkInterface<VideoFrame>,
-                                 public rtc::VideoSourceInterface<VideoFrame> {
-   public:
-    explicit CapturedFrameForwarder(VideoAnalyzer* analyzer, Clock* clock)
-        : analyzer_(analyzer),
-          send_stream_input_(nullptr),
-          video_capturer_(nullptr),
-          clock_(clock) {}
-
-    void SetSource(test::VideoCapturer* video_capturer) {
-      video_capturer_ = video_capturer;
-    }
-
-   private:
-    void OnFrame(const VideoFrame& video_frame) override {
-      VideoFrame copy = video_frame;
-      // Frames from the capturer does not have a rtp timestamp.
-      // Create one so it can be used for comparison.
-      RTC_DCHECK_EQ(0, video_frame.timestamp());
-      if (video_frame.ntp_time_ms() == 0)
-        copy.set_ntp_time_ms(clock_->CurrentNtpInMilliseconds());
-      copy.set_timestamp(copy.ntp_time_ms() * 90);
-      analyzer_->AddCapturedFrameForComparison(copy);
-      rtc::CritScope lock(&crit_);
-      if (send_stream_input_)
-        send_stream_input_->OnFrame(copy);
-    }
-
-    // Called when |send_stream_.SetSource()| is called.
-    void AddOrUpdateSink(rtc::VideoSinkInterface<VideoFrame>* sink,
-                         const rtc::VideoSinkWants& wants) override {
-      {
-        rtc::CritScope lock(&crit_);
-        RTC_DCHECK(!send_stream_input_ || send_stream_input_ == sink);
-        send_stream_input_ = sink;
-      }
-      if (video_capturer_) {
-        video_capturer_->AddOrUpdateSink(this, wants);
-      }
-    }
-
-    // Called by |send_stream_| when |send_stream_.SetSource()| is called.
-    void RemoveSink(rtc::VideoSinkInterface<VideoFrame>* sink) override {
-      rtc::CritScope lock(&crit_);
-      RTC_DCHECK(sink == send_stream_input_);
-      send_stream_input_ = nullptr;
-    }
-
-    VideoAnalyzer* const analyzer_;
-    rtc::CriticalSection crit_;
-    rtc::VideoSinkInterface<VideoFrame>* send_stream_input_
-        RTC_GUARDED_BY(crit_);
-    test::VideoCapturer* video_capturer_;
-    Clock* clock_;
-  };
-
-  void AddCapturedFrameForComparison(const VideoFrame& video_frame) {
-    rtc::CritScope lock(&crit_);
-    frames_.push_back(video_frame);
-  }
-
-  Call* call_;
-  VideoSendStream* send_stream_;
-  VideoReceiveStream* receive_stream_;
-  CapturedFrameForwarder captured_frame_forwarder_;
-  const std::string test_label_;
-  FILE* const graph_data_output_file_;
-  const std::string graph_title_;
-  const uint32_t ssrc_to_analyze_;
-  const uint32_t rtx_ssrc_to_analyze_;
-  const size_t selected_stream_;
-  const int selected_sl_;
-  const int selected_tl_;
-  PreEncodeProxy pre_encode_proxy_;
-  OnEncodeTimingProxy encode_timing_proxy_;
-  std::vector<Sample> samples_ RTC_GUARDED_BY(comparison_lock_);
-  std::map<int64_t, int> samples_encode_time_ms_
-      RTC_GUARDED_BY(comparison_lock_);
-  test::Statistics sender_time_ RTC_GUARDED_BY(comparison_lock_);
-  test::Statistics receiver_time_ RTC_GUARDED_BY(comparison_lock_);
-  test::Statistics psnr_ RTC_GUARDED_BY(comparison_lock_);
-  test::Statistics ssim_ RTC_GUARDED_BY(comparison_lock_);
-  test::Statistics end_to_end_ RTC_GUARDED_BY(comparison_lock_);
-  test::Statistics rendered_delta_ RTC_GUARDED_BY(comparison_lock_);
-  test::Statistics encoded_frame_size_ RTC_GUARDED_BY(comparison_lock_);
-  test::Statistics encode_frame_rate_ RTC_GUARDED_BY(comparison_lock_);
-  test::Statistics encode_time_ms_ RTC_GUARDED_BY(comparison_lock_);
-  test::Statistics encode_usage_percent_ RTC_GUARDED_BY(comparison_lock_);
-  test::Statistics decode_time_ms_ RTC_GUARDED_BY(comparison_lock_);
-  test::Statistics decode_time_max_ms_ RTC_GUARDED_BY(comparison_lock_);
-  test::Statistics media_bitrate_bps_ RTC_GUARDED_BY(comparison_lock_);
-  test::Statistics fec_bitrate_bps_ RTC_GUARDED_BY(comparison_lock_);
-  test::Statistics send_bandwidth_bps_ RTC_GUARDED_BY(comparison_lock_);
-  test::Statistics memory_usage_ RTC_GUARDED_BY(comparison_lock_);
-
-  struct FrameWithPsnr {
-    double psnr;
-    VideoFrame frame;
-  };
-
-  // Rendered frame with worst PSNR is saved for further analysis.
-  rtc::Optional<FrameWithPsnr> worst_frame_ RTC_GUARDED_BY(comparison_lock_);
-
-  size_t last_fec_bytes_;
-
-  const int frames_to_process_;
-  int frames_recorded_;
-  int frames_processed_;
-  int dropped_frames_;
-  int dropped_frames_before_first_encode_;
-  int dropped_frames_before_rendering_;
-  int64_t last_render_time_;
-  uint32_t rtp_timestamp_delta_;
-  int64_t total_media_bytes_;
-  int64_t first_sending_time_;
-  int64_t last_sending_time_;
-
-  int64_t cpu_time_ RTC_GUARDED_BY(cpu_measurement_lock_);
-  int64_t wallclock_time_ RTC_GUARDED_BY(cpu_measurement_lock_);
-  rtc::CriticalSection cpu_measurement_lock_;
-
-  rtc::CriticalSection crit_;
-  std::deque<VideoFrame> frames_ RTC_GUARDED_BY(crit_);
-  rtc::Optional<VideoFrame> last_rendered_frame_ RTC_GUARDED_BY(crit_);
-  rtc::TimestampWrapAroundHandler wrap_handler_ RTC_GUARDED_BY(crit_);
-  std::map<int64_t, int64_t> send_times_ RTC_GUARDED_BY(crit_);
-  std::map<int64_t, int64_t> recv_times_ RTC_GUARDED_BY(crit_);
-  std::map<int64_t, size_t> encoded_frame_sizes_ RTC_GUARDED_BY(crit_);
-  rtc::Optional<uint32_t> first_encoded_timestamp_ RTC_GUARDED_BY(crit_);
-  rtc::Optional<uint32_t> first_sent_timestamp_ RTC_GUARDED_BY(crit_);
-  const double avg_psnr_threshold_;
-  const double avg_ssim_threshold_;
-  bool is_quick_test_enabled_;
-
-  rtc::CriticalSection comparison_lock_;
-  std::vector<rtc::PlatformThread*> comparison_thread_pool_;
-  rtc::PlatformThread stats_polling_thread_;
-  rtc::Event comparison_available_event_;
-  std::deque<FrameComparison> comparisons_ RTC_GUARDED_BY(comparison_lock_);
-  rtc::Event done_;
-
-  std::unique_ptr<test::RtpFileWriter> rtp_file_writer_;
-  Clock* const clock_;
-  const int64_t start_ms_;
-};
-
-class Vp8EncoderFactory : public cricket::WebRtcVideoEncoderFactory {
- public:
-  Vp8EncoderFactory() {
-    supported_codecs_.push_back(cricket::VideoCodec("VP8"));
-  }
-  ~Vp8EncoderFactory() override { RTC_CHECK(live_encoders_.empty()); }
-
-  const std::vector<cricket::VideoCodec>& supported_codecs() const override {
-    return supported_codecs_;
-  }
-
-  VideoEncoder* CreateVideoEncoder(const cricket::VideoCodec& codec) override {
-    VideoEncoder* encoder = VP8Encoder::Create();
-    live_encoders_.insert(encoder);
-    return encoder;
-  }
-
-  void DestroyVideoEncoder(VideoEncoder* encoder) override {
-    auto it = live_encoders_.find(encoder);
-    RTC_CHECK(it != live_encoders_.end());
-    live_encoders_.erase(it);
-    delete encoder;
-  }
-
- private:
-  std::vector<cricket::VideoCodec> supported_codecs_;
-  std::set<VideoEncoder*> live_encoders_;
-};
-
-VideoQualityTest::VideoQualityTest()
-    : clock_(Clock::GetRealTimeClock()), receive_logs_(0), send_logs_(0) {
-  payload_type_map_ = test::CallTest::payload_type_map_;
-  RTC_DCHECK(payload_type_map_.find(kPayloadTypeH264) ==
-             payload_type_map_.end());
-  RTC_DCHECK(payload_type_map_.find(kPayloadTypeVP8) ==
-             payload_type_map_.end());
-  RTC_DCHECK(payload_type_map_.find(kPayloadTypeVP9) ==
-             payload_type_map_.end());
-  payload_type_map_[kPayloadTypeH264] = webrtc::MediaType::VIDEO;
-  payload_type_map_[kPayloadTypeVP8] = webrtc::MediaType::VIDEO;
-  payload_type_map_[kPayloadTypeVP9] = webrtc::MediaType::VIDEO;
-}
-
-VideoQualityTest::Params::Params()
-    : call({false, Call::Config::BitrateConfig(), 0}),
-      video({false, 640, 480, 30, 50, 800, 800, false, "VP8", 1, -1, 0, false,
-             false, ""}),
-      audio({false, false, false}),
-      screenshare({false, false, 10, 0}),
-      analyzer({"", 0.0, 0.0, 0, "", ""}),
-      pipe(),
-      ss({std::vector<VideoStream>(), 0, 0, -1, std::vector<SpatialLayer>()}),
-      logging({false, "", "", ""}) {}
-
-VideoQualityTest::Params::~Params() = default;
-
-void VideoQualityTest::TestBody() {}
-
-std::string VideoQualityTest::GenerateGraphTitle() const {
-  std::stringstream ss;
-  ss << params_.video.codec;
-  ss << " (" << params_.video.target_bitrate_bps / 1000 << "kbps";
-  ss << ", " << params_.video.fps << " FPS";
-  if (params_.screenshare.scroll_duration)
-    ss << ", " << params_.screenshare.scroll_duration << "s scroll";
-  if (params_.ss.streams.size() > 1)
-    ss << ", Stream #" << params_.ss.selected_stream;
-  if (params_.ss.num_spatial_layers > 1)
-    ss << ", Layer #" << params_.ss.selected_sl;
-  ss << ")";
-  return ss.str();
-}
-
-void VideoQualityTest::CheckParams() {
-  if (!params_.video.enabled)
-    return;
-  // Add a default stream in none specified.
-  if (params_.ss.streams.empty())
-    params_.ss.streams.push_back(VideoQualityTest::DefaultVideoStream(params_));
-  if (params_.ss.num_spatial_layers == 0)
-    params_.ss.num_spatial_layers = 1;
-
-  if (params_.pipe.loss_percent != 0 ||
-      params_.pipe.queue_length_packets != 0) {
-    // Since LayerFilteringTransport changes the sequence numbers, we can't
-    // use that feature with pack loss, since the NACK request would end up
-    // retransmitting the wrong packets.
-    RTC_CHECK(params_.ss.selected_sl == -1 ||
-              params_.ss.selected_sl == params_.ss.num_spatial_layers - 1);
-    RTC_CHECK(params_.video.selected_tl == -1 ||
-              params_.video.selected_tl ==
-                  params_.video.num_temporal_layers - 1);
-  }
-
-  // TODO(ivica): Should max_bitrate_bps == -1 represent inf max bitrate, as it
-  // does in some parts of the code?
-  RTC_CHECK_GE(params_.video.max_bitrate_bps, params_.video.target_bitrate_bps);
-  RTC_CHECK_GE(params_.video.target_bitrate_bps, params_.video.min_bitrate_bps);
-  RTC_CHECK_LT(params_.video.selected_tl, params_.video.num_temporal_layers);
-  RTC_CHECK_LE(params_.ss.selected_stream, params_.ss.streams.size());
-  for (const VideoStream& stream : params_.ss.streams) {
-    RTC_CHECK_GE(stream.min_bitrate_bps, 0);
-    RTC_CHECK_GE(stream.target_bitrate_bps, stream.min_bitrate_bps);
-    RTC_CHECK_GE(stream.max_bitrate_bps, stream.target_bitrate_bps);
-  }
-  // TODO(ivica): Should we check if the sum of all streams/layers is equal to
-  // the total bitrate? We anyway have to update them in the case bitrate
-  // estimator changes the total bitrates.
-  RTC_CHECK_GE(params_.ss.num_spatial_layers, 1);
-  RTC_CHECK_LE(params_.ss.selected_sl, params_.ss.num_spatial_layers);
-  RTC_CHECK(params_.ss.spatial_layers.empty() ||
-            params_.ss.spatial_layers.size() ==
-                static_cast<size_t>(params_.ss.num_spatial_layers));
-  if (params_.video.codec == "VP8") {
-    RTC_CHECK_EQ(params_.ss.num_spatial_layers, 1);
-  } else if (params_.video.codec == "VP9") {
-    RTC_CHECK_EQ(params_.ss.streams.size(), 1);
-  }
-  RTC_CHECK_GE(params_.call.num_thumbnails, 0);
-  if (params_.call.num_thumbnails > 0) {
-    RTC_CHECK_EQ(params_.ss.num_spatial_layers, 1);
-    RTC_CHECK_EQ(params_.ss.streams.size(), 3);
-    RTC_CHECK_EQ(params_.video.num_temporal_layers, 3);
-    RTC_CHECK_EQ(params_.video.codec, "VP8");
-  }
-}
-
-// Static.
-std::vector<int> VideoQualityTest::ParseCSV(const std::string& str) {
-  // Parse comma separated nonnegative integers, where some elements may be
-  // empty. The empty values are replaced with -1.
-  // E.g. "10,-20,,30,40" --> {10, 20, -1, 30,40}
-  // E.g. ",,10,,20," --> {-1, -1, 10, -1, 20, -1}
-  std::vector<int> result;
-  if (str.empty())
-    return result;
-
-  const char* p = str.c_str();
-  int value = -1;
-  int pos;
-  while (*p) {
-    if (*p == ',') {
-      result.push_back(value);
-      value = -1;
-      ++p;
-      continue;
-    }
-    RTC_CHECK_EQ(sscanf(p, "%d%n", &value, &pos), 1)
-        << "Unexpected non-number value.";
-    p += pos;
-  }
-  result.push_back(value);
-  return result;
-}
-
-// Static.
-VideoStream VideoQualityTest::DefaultVideoStream(const Params& params) {
-  VideoStream stream;
-  stream.width = params.video.width;
-  stream.height = params.video.height;
-  stream.max_framerate = params.video.fps;
-  stream.min_bitrate_bps = params.video.min_bitrate_bps;
-  stream.target_bitrate_bps = params.video.target_bitrate_bps;
-  stream.max_bitrate_bps = params.video.max_bitrate_bps;
-  stream.max_qp = kDefaultMaxQp;
-  // TODO(sprang): Can we make this less of a hack?
-  if (params.video.num_temporal_layers == 2) {
-    stream.temporal_layer_thresholds_bps.push_back(stream.target_bitrate_bps);
-  } else if (params.video.num_temporal_layers == 3) {
-    stream.temporal_layer_thresholds_bps.push_back(stream.max_bitrate_bps / 4);
-    stream.temporal_layer_thresholds_bps.push_back(stream.target_bitrate_bps);
-  } else {
-    RTC_CHECK_LE(params.video.num_temporal_layers, kMaxTemporalStreams);
-    for (int i = 0; i < params.video.num_temporal_layers - 1; ++i) {
-      stream.temporal_layer_thresholds_bps.push_back(static_cast<int>(
-          stream.max_bitrate_bps * kVp8LayerRateAlloction[0][i] + 0.5));
-    }
-  }
-  return stream;
-}
-
-// Static.
-VideoStream VideoQualityTest::DefaultThumbnailStream() {
-  VideoStream stream;
-  stream.width = 320;
-  stream.height = 180;
-  stream.max_framerate = 7;
-  stream.min_bitrate_bps = 7500;
-  stream.target_bitrate_bps = 37500;
-  stream.max_bitrate_bps = 50000;
-  stream.max_qp = kDefaultMaxQp;
-  return stream;
-}
-
-// Static.
-void VideoQualityTest::FillScalabilitySettings(
-    Params* params,
-    const std::vector<std::string>& stream_descriptors,
-    int num_streams,
-    size_t selected_stream,
-    int num_spatial_layers,
-    int selected_sl,
-    const std::vector<std::string>& sl_descriptors) {
-  if (params->ss.streams.empty() && params->ss.infer_streams) {
-    webrtc::VideoEncoderConfig encoder_config;
-    encoder_config.content_type =
-        params->screenshare.enabled
-            ? webrtc::VideoEncoderConfig::ContentType::kScreen
-            : webrtc::VideoEncoderConfig::ContentType::kRealtimeVideo;
-    encoder_config.max_bitrate_bps = params->video.max_bitrate_bps;
-    encoder_config.min_transmit_bitrate_bps = params->video.min_transmit_bps;
-    encoder_config.number_of_streams = num_streams;
-    encoder_config.spatial_layers = params->ss.spatial_layers;
-    encoder_config.video_stream_factory =
-        new rtc::RefCountedObject<cricket::EncoderStreamFactory>(
-            params->video.codec, kDefaultMaxQp, params->video.fps,
-            params->screenshare.enabled, true);
-    params->ss.streams =
-        encoder_config.video_stream_factory->CreateEncoderStreams(
-            static_cast<int>(params->video.width),
-            static_cast<int>(params->video.height), encoder_config);
-  } else {
-    // Read VideoStream and SpatialLayer elements from a list of comma separated
-    // lists. To use a default value for an element, use -1 or leave empty.
-    // Validity checks performed in CheckParams.
-    RTC_CHECK(params->ss.streams.empty());
-    for (auto descriptor : stream_descriptors) {
-      if (descriptor.empty())
-        continue;
-      VideoStream stream = VideoQualityTest::DefaultVideoStream(*params);
-      std::vector<int> v = VideoQualityTest::ParseCSV(descriptor);
-      if (v[0] != -1)
-        stream.width = static_cast<size_t>(v[0]);
-      if (v[1] != -1)
-        stream.height = static_cast<size_t>(v[1]);
-      if (v[2] != -1)
-        stream.max_framerate = v[2];
-      if (v[3] != -1)
-        stream.min_bitrate_bps = v[3];
-      if (v[4] != -1)
-        stream.target_bitrate_bps = v[4];
-      if (v[5] != -1)
-        stream.max_bitrate_bps = v[5];
-      if (v.size() > 6 && v[6] != -1)
-        stream.max_qp = v[6];
-      if (v.size() > 7) {
-        stream.temporal_layer_thresholds_bps.clear();
-        stream.temporal_layer_thresholds_bps.insert(
-            stream.temporal_layer_thresholds_bps.end(), v.begin() + 7, v.end());
-      } else {
-        // Automatic TL thresholds for more than two layers not supported.
-        RTC_CHECK_LE(params->video.num_temporal_layers, 2);
-      }
-      params->ss.streams.push_back(stream);
-    }
-  }
-
-  params->ss.num_spatial_layers = std::max(1, num_spatial_layers);
-  params->ss.selected_stream = selected_stream;
-
-  params->ss.selected_sl = selected_sl;
-  RTC_CHECK(params->ss.spatial_layers.empty());
-  for (auto descriptor : sl_descriptors) {
-    if (descriptor.empty())
-      continue;
-    std::vector<int> v = VideoQualityTest::ParseCSV(descriptor);
-    RTC_CHECK_GT(v[2], 0);
-
-    SpatialLayer layer;
-    layer.scaling_factor_num = v[0] == -1 ? 1 : v[0];
-    layer.scaling_factor_den = v[1] == -1 ? 1 : v[1];
-    layer.target_bitrate_bps = v[2];
-    params->ss.spatial_layers.push_back(layer);
-  }
-}
-
-void VideoQualityTest::SetupVideo(Transport* send_transport,
-                                  Transport* recv_transport) {
-  if (params_.logging.logs)
-    trace_to_stderr_.reset(new test::TraceToStderr);
-
-  size_t num_video_streams = params_.ss.streams.size();
-  size_t num_flexfec_streams = params_.video.flexfec ? 1 : 0;
-  CreateSendConfig(num_video_streams, 0, num_flexfec_streams, send_transport);
-
-  int payload_type;
-  if (params_.video.codec == "H264") {
-    video_encoder_.reset(H264Encoder::Create(cricket::VideoCodec("H264")));
-    payload_type = kPayloadTypeH264;
-  } else if (params_.video.codec == "VP8") {
-    if (params_.screenshare.enabled && params_.ss.streams.size() > 1) {
-      // Simulcast screenshare needs a simulcast encoder adapter to work, since
-      // encoders usually can't natively do simulcast with different frame rates
-      // for the different layers.
-      video_encoder_.reset(
-          new SimulcastEncoderAdapter(new Vp8EncoderFactory()));
-    } else {
-      video_encoder_.reset(VP8Encoder::Create());
-    }
-    payload_type = kPayloadTypeVP8;
-  } else if (params_.video.codec == "VP9") {
-    video_encoder_.reset(VP9Encoder::Create());
-    payload_type = kPayloadTypeVP9;
-  } else {
-    RTC_NOTREACHED() << "Codec not supported!";
-    return;
-  }
-  video_send_config_.encoder_settings.encoder = video_encoder_.get();
-  video_send_config_.encoder_settings.payload_name = params_.video.codec;
-  video_send_config_.encoder_settings.payload_type = payload_type;
-  video_send_config_.rtp.nack.rtp_history_ms = kNackRtpHistoryMs;
-  video_send_config_.rtp.rtx.payload_type = kSendRtxPayloadType;
-  for (size_t i = 0; i < num_video_streams; ++i)
-    video_send_config_.rtp.rtx.ssrcs.push_back(kSendRtxSsrcs[i]);
-
-  video_send_config_.rtp.extensions.clear();
-  if (params_.call.send_side_bwe) {
-    video_send_config_.rtp.extensions.push_back(
-        RtpExtension(RtpExtension::kTransportSequenceNumberUri,
-                     test::kTransportSequenceNumberExtensionId));
-  } else {
-    video_send_config_.rtp.extensions.push_back(RtpExtension(
-        RtpExtension::kAbsSendTimeUri, test::kAbsSendTimeExtensionId));
-  }
-  video_send_config_.rtp.extensions.push_back(RtpExtension(
-      RtpExtension::kVideoContentTypeUri, test::kVideoContentTypeExtensionId));
-  video_send_config_.rtp.extensions.push_back(RtpExtension(
-      RtpExtension::kVideoTimingUri, test::kVideoTimingExtensionId));
-
-  video_encoder_config_.min_transmit_bitrate_bps =
-      params_.video.min_transmit_bps;
-
-  video_send_config_.suspend_below_min_bitrate =
-      params_.video.suspend_below_min_bitrate;
-
-  video_encoder_config_.number_of_streams = params_.ss.streams.size();
-  video_encoder_config_.max_bitrate_bps = 0;
-  for (size_t i = 0; i < params_.ss.streams.size(); ++i) {
-    video_encoder_config_.max_bitrate_bps +=
-        params_.ss.streams[i].max_bitrate_bps;
-  }
-  if (params_.ss.infer_streams) {
-    video_encoder_config_.video_stream_factory =
-        new rtc::RefCountedObject<cricket::EncoderStreamFactory>(
-            params_.video.codec, params_.ss.streams[0].max_qp,
-            params_.video.fps, params_.screenshare.enabled, true);
-  } else {
-    video_encoder_config_.video_stream_factory =
-        new rtc::RefCountedObject<VideoStreamFactory>(params_.ss.streams);
-  }
-
-  video_encoder_config_.spatial_layers = params_.ss.spatial_layers;
-
-  CreateMatchingReceiveConfigs(recv_transport);
-
-  const bool decode_all_receive_streams =
-      params_.ss.selected_stream == params_.ss.streams.size();
-
-  for (size_t i = 0; i < num_video_streams; ++i) {
-    video_receive_configs_[i].rtp.nack.rtp_history_ms = kNackRtpHistoryMs;
-    video_receive_configs_[i].rtp.rtx_ssrc = kSendRtxSsrcs[i];
-    video_receive_configs_[i]
-        .rtp.rtx_associated_payload_types[kSendRtxPayloadType] = payload_type;
-    video_receive_configs_[i].rtp.transport_cc = params_.call.send_side_bwe;
-    video_receive_configs_[i].rtp.remb = !params_.call.send_side_bwe;
-    // Enable RTT calculation so NTP time estimator will work.
-    video_receive_configs_[i].rtp.rtcp_xr.receiver_reference_time_report = true;
-    // Force fake decoders on non-selected simulcast streams.
-    if (!decode_all_receive_streams && i != params_.ss.selected_stream) {
-      VideoReceiveStream::Decoder decoder;
-      decoder.decoder = new test::FakeDecoder();
-      decoder.payload_type = video_send_config_.encoder_settings.payload_type;
-      decoder.payload_name = video_send_config_.encoder_settings.payload_name;
-      video_receive_configs_[i].decoders.clear();
-      allocated_decoders_.emplace_back(decoder.decoder);
-      video_receive_configs_[i].decoders.push_back(decoder);
-    }
-  }
-
-  if (params_.video.flexfec) {
-    // Override send config constructed by CreateSendConfig.
-    if (decode_all_receive_streams) {
-      for (uint32_t media_ssrc : video_send_config_.rtp.ssrcs) {
-        video_send_config_.rtp.flexfec.protected_media_ssrcs.push_back(
-            media_ssrc);
-      }
-    } else {
-      video_send_config_.rtp.flexfec.protected_media_ssrcs = {
-          kVideoSendSsrcs[params_.ss.selected_stream]};
-    }
-
-    // The matching receive config is _not_ created by
-    // CreateMatchingReceiveConfigs, since VideoQualityTest is not a BaseTest.
-    // Set up the receive config manually instead.
-    FlexfecReceiveStream::Config flexfec_receive_config(recv_transport);
-    flexfec_receive_config.payload_type =
-        video_send_config_.rtp.flexfec.payload_type;
-    flexfec_receive_config.remote_ssrc = video_send_config_.rtp.flexfec.ssrc;
-    flexfec_receive_config.protected_media_ssrcs =
-        video_send_config_.rtp.flexfec.protected_media_ssrcs;
-    flexfec_receive_config.local_ssrc = kReceiverLocalVideoSsrc;
-    flexfec_receive_config.transport_cc = params_.call.send_side_bwe;
-    if (params_.call.send_side_bwe) {
-      flexfec_receive_config.rtp_header_extensions.push_back(
-          RtpExtension(RtpExtension::kTransportSequenceNumberUri,
-                       test::kTransportSequenceNumberExtensionId));
-    } else {
-      flexfec_receive_config.rtp_header_extensions.push_back(RtpExtension(
-          RtpExtension::kAbsSendTimeUri, test::kAbsSendTimeExtensionId));
-    }
-    flexfec_receive_configs_.push_back(flexfec_receive_config);
-  }
-
-  if (params_.video.ulpfec) {
-    video_send_config_.rtp.ulpfec.red_payload_type = kRedPayloadType;
-    video_send_config_.rtp.ulpfec.ulpfec_payload_type = kUlpfecPayloadType;
-    video_send_config_.rtp.ulpfec.red_rtx_payload_type = kRtxRedPayloadType;
-
-    if (decode_all_receive_streams) {
-      for (auto it = video_receive_configs_.begin();
-           it != video_receive_configs_.end(); ++it) {
-        it->rtp.ulpfec.red_payload_type =
-            video_send_config_.rtp.ulpfec.red_payload_type;
-        it->rtp.ulpfec.ulpfec_payload_type =
-            video_send_config_.rtp.ulpfec.ulpfec_payload_type;
-        it->rtp.ulpfec.red_rtx_payload_type =
-            video_send_config_.rtp.ulpfec.red_rtx_payload_type;
-        it->rtp.rtx_associated_payload_types[video_send_config_.rtp.ulpfec
-                                                 .red_rtx_payload_type] =
-            video_send_config_.rtp.ulpfec.red_payload_type;
-      }
-    } else {
-      video_receive_configs_[params_.ss.selected_stream]
-          .rtp.ulpfec.red_payload_type =
-          video_send_config_.rtp.ulpfec.red_payload_type;
-      video_receive_configs_[params_.ss.selected_stream]
-          .rtp.ulpfec.ulpfec_payload_type =
-          video_send_config_.rtp.ulpfec.ulpfec_payload_type;
-      video_receive_configs_[params_.ss.selected_stream]
-          .rtp.ulpfec.red_rtx_payload_type =
-          video_send_config_.rtp.ulpfec.red_rtx_payload_type;
-      video_receive_configs_[params_.ss.selected_stream]
-          .rtp.rtx_associated_payload_types[video_send_config_.rtp.ulpfec
-                                                .red_rtx_payload_type] =
-          video_send_config_.rtp.ulpfec.red_payload_type;
-    }
-  }
-}
-
-void VideoQualityTest::SetupThumbnails(Transport* send_transport,
-                                       Transport* recv_transport) {
-  for (int i = 0; i < params_.call.num_thumbnails; ++i) {
-    thumbnail_encoders_.emplace_back(VP8Encoder::Create());
-
-    // Thumbnails will be send in the other way: from receiver_call to
-    // sender_call.
-    VideoSendStream::Config thumbnail_send_config(recv_transport);
-    thumbnail_send_config.rtp.ssrcs.push_back(kThumbnailSendSsrcStart + i);
-    thumbnail_send_config.encoder_settings.encoder =
-        thumbnail_encoders_.back().get();
-    thumbnail_send_config.encoder_settings.payload_name = params_.video.codec;
-    thumbnail_send_config.encoder_settings.payload_type = kPayloadTypeVP8;
-    thumbnail_send_config.rtp.nack.rtp_history_ms = kNackRtpHistoryMs;
-    thumbnail_send_config.rtp.rtx.payload_type = kSendRtxPayloadType;
-    thumbnail_send_config.rtp.rtx.ssrcs.push_back(kThumbnailRtxSsrcStart + i);
-    thumbnail_send_config.rtp.extensions.clear();
-    if (params_.call.send_side_bwe) {
-      thumbnail_send_config.rtp.extensions.push_back(
-          RtpExtension(RtpExtension::kTransportSequenceNumberUri,
-                       test::kTransportSequenceNumberExtensionId));
-    } else {
-      thumbnail_send_config.rtp.extensions.push_back(RtpExtension(
-          RtpExtension::kAbsSendTimeUri, test::kAbsSendTimeExtensionId));
-    }
-
-    VideoEncoderConfig thumbnail_encoder_config;
-    thumbnail_encoder_config.min_transmit_bitrate_bps = 7500;
-    thumbnail_send_config.suspend_below_min_bitrate =
-        params_.video.suspend_below_min_bitrate;
-    thumbnail_encoder_config.number_of_streams = 1;
-    thumbnail_encoder_config.max_bitrate_bps = 50000;
-    if (params_.ss.infer_streams) {
-      thumbnail_encoder_config.video_stream_factory =
-          new rtc::RefCountedObject<VideoStreamFactory>(params_.ss.streams);
-    } else {
-      thumbnail_encoder_config.video_stream_factory =
-          new rtc::RefCountedObject<cricket::EncoderStreamFactory>(
-              params_.video.codec, params_.ss.streams[0].max_qp,
-              params_.video.fps, params_.screenshare.enabled, true);
-    }
-    thumbnail_encoder_config.spatial_layers = params_.ss.spatial_layers;
-
-    VideoReceiveStream::Config thumbnail_receive_config(send_transport);
-    thumbnail_receive_config.rtp.remb = false;
-    thumbnail_receive_config.rtp.transport_cc = true;
-    thumbnail_receive_config.rtp.local_ssrc = kReceiverLocalVideoSsrc;
-    for (const RtpExtension& extension : thumbnail_send_config.rtp.extensions)
-      thumbnail_receive_config.rtp.extensions.push_back(extension);
-    thumbnail_receive_config.renderer = &fake_renderer_;
-
-    VideoReceiveStream::Decoder decoder =
-        test::CreateMatchingDecoder(thumbnail_send_config.encoder_settings);
-    allocated_decoders_.push_back(
-        std::unique_ptr<VideoDecoder>(decoder.decoder));
-    thumbnail_receive_config.decoders.clear();
-    thumbnail_receive_config.decoders.push_back(decoder);
-    thumbnail_receive_config.rtp.remote_ssrc =
-        thumbnail_send_config.rtp.ssrcs[0];
-
-    thumbnail_receive_config.rtp.nack.rtp_history_ms = kNackRtpHistoryMs;
-    thumbnail_receive_config.rtp.rtx_ssrc = kThumbnailRtxSsrcStart + i;
-    thumbnail_receive_config.rtp
-        .rtx_associated_payload_types[kSendRtxPayloadType] = kPayloadTypeVP8;
-    thumbnail_receive_config.rtp.transport_cc = params_.call.send_side_bwe;
-    thumbnail_receive_config.rtp.remb = !params_.call.send_side_bwe;
-
-    thumbnail_encoder_configs_.push_back(thumbnail_encoder_config.Copy());
-    thumbnail_send_configs_.push_back(thumbnail_send_config.Copy());
-    thumbnail_receive_configs_.push_back(thumbnail_receive_config.Copy());
-  }
-
-  for (int i = 0; i < params_.call.num_thumbnails; ++i) {
-    thumbnail_send_streams_.push_back(receiver_call_->CreateVideoSendStream(
-        thumbnail_send_configs_[i].Copy(),
-        thumbnail_encoder_configs_[i].Copy()));
-    thumbnail_receive_streams_.push_back(sender_call_->CreateVideoReceiveStream(
-        thumbnail_receive_configs_[i].Copy()));
-  }
-}
-
-void VideoQualityTest::DestroyThumbnailStreams() {
-  for (VideoSendStream* thumbnail_send_stream : thumbnail_send_streams_)
-    receiver_call_->DestroyVideoSendStream(thumbnail_send_stream);
-  thumbnail_send_streams_.clear();
-  for (VideoReceiveStream* thumbnail_receive_stream :
-       thumbnail_receive_streams_)
-    sender_call_->DestroyVideoReceiveStream(thumbnail_receive_stream);
-  thumbnail_send_streams_.clear();
-  thumbnail_receive_streams_.clear();
-  for (std::unique_ptr<test::VideoCapturer>& video_caputurer :
-       thumbnail_capturers_) {
-    video_caputurer.reset();
-  }
-}
-
-void VideoQualityTest::SetupScreenshareOrSVC() {
-  if (params_.screenshare.enabled) {
-    // Fill out codec settings.
-    video_encoder_config_.content_type =
-        VideoEncoderConfig::ContentType::kScreen;
-    degradation_preference_ =
-        VideoSendStream::DegradationPreference::kMaintainResolution;
-    if (params_.video.codec == "VP8") {
-      VideoCodecVP8 vp8_settings = VideoEncoder::GetDefaultVp8Settings();
-      vp8_settings.denoisingOn = false;
-      vp8_settings.frameDroppingOn = false;
-      vp8_settings.numberOfTemporalLayers =
-          static_cast<unsigned char>(params_.video.num_temporal_layers);
-      video_encoder_config_.encoder_specific_settings =
-          new rtc::RefCountedObject<
-              VideoEncoderConfig::Vp8EncoderSpecificSettings>(vp8_settings);
-    } else if (params_.video.codec == "VP9") {
-      VideoCodecVP9 vp9_settings = VideoEncoder::GetDefaultVp9Settings();
-      vp9_settings.denoisingOn = false;
-      vp9_settings.frameDroppingOn = false;
-      vp9_settings.numberOfTemporalLayers =
-          static_cast<unsigned char>(params_.video.num_temporal_layers);
-      vp9_settings.numberOfSpatialLayers =
-          static_cast<unsigned char>(params_.ss.num_spatial_layers);
-      video_encoder_config_.encoder_specific_settings =
-          new rtc::RefCountedObject<
-              VideoEncoderConfig::Vp9EncoderSpecificSettings>(vp9_settings);
-    }
-    // Setup frame generator.
-    const size_t kWidth = 1850;
-    const size_t kHeight = 1110;
-    if (params_.screenshare.generate_slides) {
-      frame_generator_ = test::FrameGenerator::CreateSlideGenerator(
-          kWidth, kHeight,
-          params_.screenshare.slide_change_interval * params_.video.fps);
-    } else {
-      std::vector<std::string> slides = params_.screenshare.slides;
-      if (slides.size() == 0) {
-        slides.push_back(test::ResourcePath("web_screenshot_1850_1110", "yuv"));
-        slides.push_back(test::ResourcePath("presentation_1850_1110", "yuv"));
-        slides.push_back(test::ResourcePath("photo_1850_1110", "yuv"));
-        slides.push_back(
-            test::ResourcePath("difficult_photo_1850_1110", "yuv"));
-      }
-      if (params_.screenshare.scroll_duration == 0) {
-        // Cycle image every slide_change_interval seconds.
-        frame_generator_ = test::FrameGenerator::CreateFromYuvFile(
-            slides, kWidth, kHeight,
-            params_.screenshare.slide_change_interval * params_.video.fps);
-      } else {
-        RTC_CHECK_LE(params_.video.width, kWidth);
-        RTC_CHECK_LE(params_.video.height, kHeight);
-        RTC_CHECK_GT(params_.screenshare.slide_change_interval, 0);
-        const int kPauseDurationMs =
-            (params_.screenshare.slide_change_interval -
-             params_.screenshare.scroll_duration) *
-            1000;
-        RTC_CHECK_LE(params_.screenshare.scroll_duration,
-                     params_.screenshare.slide_change_interval);
-
-        frame_generator_ =
-            test::FrameGenerator::CreateScrollingInputFromYuvFiles(
-                clock_, slides, kWidth, kHeight, params_.video.width,
-                params_.video.height,
-                params_.screenshare.scroll_duration * 1000, kPauseDurationMs);
-      }
-    }
-  } else if (params_.ss.num_spatial_layers > 1) {  // For non-screenshare case.
-    RTC_CHECK(params_.video.codec == "VP9");
-    VideoCodecVP9 vp9_settings = VideoEncoder::GetDefaultVp9Settings();
-    vp9_settings.numberOfTemporalLayers =
-        static_cast<unsigned char>(params_.video.num_temporal_layers);
-    vp9_settings.numberOfSpatialLayers =
-        static_cast<unsigned char>(params_.ss.num_spatial_layers);
-    video_encoder_config_.encoder_specific_settings = new rtc::RefCountedObject<
-        VideoEncoderConfig::Vp9EncoderSpecificSettings>(vp9_settings);
-  }
-}
-
-void VideoQualityTest::SetupThumbnailCapturers(size_t num_thumbnail_streams) {
-  VideoStream thumbnail = DefaultThumbnailStream();
-  for (size_t i = 0; i < num_thumbnail_streams; ++i) {
-    thumbnail_capturers_.emplace_back(test::FrameGeneratorCapturer::Create(
-        static_cast<int>(thumbnail.width), static_cast<int>(thumbnail.height),
-        thumbnail.max_framerate, clock_));
-    RTC_DCHECK(thumbnail_capturers_.back());
-  }
-}
-
-void VideoQualityTest::CreateCapturer() {
-  if (params_.screenshare.enabled) {
-    test::FrameGeneratorCapturer* frame_generator_capturer =
-        new test::FrameGeneratorCapturer(clock_, std::move(frame_generator_),
-                                         params_.video.fps);
-    EXPECT_TRUE(frame_generator_capturer->Init());
-    video_capturer_.reset(frame_generator_capturer);
-  } else {
-    if (params_.video.clip_name == "Generator") {
-      video_capturer_.reset(test::FrameGeneratorCapturer::Create(
-          static_cast<int>(params_.video.width),
-          static_cast<int>(params_.video.height), params_.video.fps, clock_));
-    } else if (params_.video.clip_name.empty()) {
-      video_capturer_.reset(test::VcmCapturer::Create(
-          params_.video.width, params_.video.height, params_.video.fps,
-          params_.video.capture_device_index));
-      if (!video_capturer_) {
-        // Failed to get actual camera, use chroma generator as backup.
-        video_capturer_.reset(test::FrameGeneratorCapturer::Create(
-            static_cast<int>(params_.video.width),
-            static_cast<int>(params_.video.height), params_.video.fps, clock_));
-      }
-    } else {
-      video_capturer_.reset(test::FrameGeneratorCapturer::CreateFromYuvFile(
-          test::ResourcePath(params_.video.clip_name, "yuv"),
-          params_.video.width, params_.video.height, params_.video.fps,
-          clock_));
-      ASSERT_TRUE(video_capturer_) << "Could not create capturer for "
-                                   << params_.video.clip_name
-                                   << ".yuv. Is this resource file present?";
-    }
-  }
-  RTC_DCHECK(video_capturer_.get());
-}
-
-void VideoQualityTest::RunWithAnalyzer(const Params& params) {
-  std::unique_ptr<test::LayerFilteringTransport> send_transport;
-  std::unique_ptr<test::DirectTransport> recv_transport;
-  FILE* graph_data_output_file = nullptr;
-  std::unique_ptr<VideoAnalyzer> analyzer;
-
-  params_ = params;
-
-  RTC_CHECK(!params_.audio.enabled);
-  // TODO(ivica): Merge with RunWithRenderer and use a flag / argument to
-  // differentiate between the analyzer and the renderer case.
-  CheckParams();
-
-  if (!params_.analyzer.graph_data_output_filename.empty()) {
-    graph_data_output_file =
-        fopen(params_.analyzer.graph_data_output_filename.c_str(), "w");
-    RTC_CHECK(graph_data_output_file)
-        << "Can't open the file " << params_.analyzer.graph_data_output_filename
-        << "!";
-  }
-
-  if (!params.logging.rtc_event_log_name.empty()) {
-    event_log_ = RtcEventLog::Create(clock_);
-    bool event_log_started =
-        event_log_->StartLogging(params.logging.rtc_event_log_name, -1);
-    RTC_DCHECK(event_log_started);
-  }
-
-  Call::Config call_config(event_log_.get());
-  call_config.bitrate_config = params.call.call_bitrate_config;
-
-  task_queue_.SendTask([this, &call_config, &send_transport,
-                        &recv_transport]() {
-    CreateCalls(call_config, call_config);
-
-    send_transport = rtc::MakeUnique<test::LayerFilteringTransport>(
-        &task_queue_, params_.pipe, sender_call_.get(), kPayloadTypeVP8,
-        kPayloadTypeVP9, params_.video.selected_tl, params_.ss.selected_sl,
-        payload_type_map_);
-
-    recv_transport = rtc::MakeUnique<test::DirectTransport>(
-        &task_queue_, params_.pipe, receiver_call_.get(), payload_type_map_);
-  });
-
-  std::string graph_title = params_.analyzer.graph_title;
-  if (graph_title.empty())
-    graph_title = VideoQualityTest::GenerateGraphTitle();
-  bool is_quick_test_enabled = field_trial::IsEnabled("WebRTC-QuickPerfTest");
-  analyzer = rtc::MakeUnique<VideoAnalyzer>(
-      send_transport.get(), params_.analyzer.test_label,
-      params_.analyzer.avg_psnr_threshold, params_.analyzer.avg_ssim_threshold,
-      is_quick_test_enabled
-          ? kFramesSentInQuickTest
-          : params_.analyzer.test_durations_secs * params_.video.fps,
-      graph_data_output_file, graph_title,
-      kVideoSendSsrcs[params_.ss.selected_stream],
-      kSendRtxSsrcs[params_.ss.selected_stream],
-      static_cast<size_t>(params_.ss.selected_stream), params.ss.selected_sl,
-      params_.video.selected_tl, is_quick_test_enabled, clock_,
-      params_.logging.rtp_dump_name);
-
-  task_queue_.SendTask([&]() {
-    analyzer->SetCall(sender_call_.get());
-    analyzer->SetReceiver(receiver_call_->Receiver());
-    send_transport->SetReceiver(analyzer.get());
-    recv_transport->SetReceiver(sender_call_->Receiver());
-
-    SetupVideo(analyzer.get(), recv_transport.get());
-    SetupThumbnails(analyzer.get(), recv_transport.get());
-    video_receive_configs_[params_.ss.selected_stream].renderer =
-        analyzer.get();
-    video_send_config_.pre_encode_callback = analyzer->pre_encode_proxy();
-    RTC_DCHECK(!video_send_config_.post_encode_callback);
-    video_send_config_.post_encode_callback = analyzer->encode_timing_proxy();
-
-    SetupScreenshareOrSVC();
-
-    CreateFlexfecStreams();
-    CreateVideoStreams();
-    analyzer->SetSendStream(video_send_stream_);
-    if (video_receive_streams_.size() == 1)
-      analyzer->SetReceiveStream(video_receive_streams_[0]);
-
-    video_send_stream_->SetSource(analyzer->OutputInterface(),
-                                  degradation_preference_);
-
-    SetupThumbnailCapturers(params_.call.num_thumbnails);
-    for (size_t i = 0; i < thumbnail_send_streams_.size(); ++i) {
-      thumbnail_send_streams_[i]->SetSource(thumbnail_capturers_[i].get(),
-                                            degradation_preference_);
-    }
-
-    CreateCapturer();
-
-    analyzer->SetSource(video_capturer_.get(), params_.ss.infer_streams);
-
-    StartEncodedFrameLogs(video_send_stream_);
-    StartEncodedFrameLogs(video_receive_streams_[params_.ss.selected_stream]);
-    video_send_stream_->Start();
-    for (VideoSendStream* thumbnail_send_stream : thumbnail_send_streams_)
-      thumbnail_send_stream->Start();
-    for (VideoReceiveStream* receive_stream : video_receive_streams_)
-      receive_stream->Start();
-    for (VideoReceiveStream* thumbnail_receive_stream :
-         thumbnail_receive_streams_)
-      thumbnail_receive_stream->Start();
-
-    analyzer->StartMeasuringCpuProcessTime();
-
-    video_capturer_->Start();
-    for (std::unique_ptr<test::VideoCapturer>& video_caputurer :
-         thumbnail_capturers_) {
-      video_caputurer->Start();
-    }
-  });
-
-  analyzer->Wait();
-
-  task_queue_.SendTask([&]() {
-    for (std::unique_ptr<test::VideoCapturer>& video_caputurer :
-         thumbnail_capturers_)
-      video_caputurer->Stop();
-    video_capturer_->Stop();
-    for (VideoReceiveStream* thumbnail_receive_stream :
-         thumbnail_receive_streams_)
-      thumbnail_receive_stream->Stop();
-    for (VideoReceiveStream* receive_stream : video_receive_streams_)
-      receive_stream->Stop();
-    for (VideoSendStream* thumbnail_send_stream : thumbnail_send_streams_)
-      thumbnail_send_stream->Stop();
-    video_send_stream_->Stop();
-
-    DestroyStreams();
-    DestroyThumbnailStreams();
-
-    event_log_->StopLogging();
-    if (graph_data_output_file)
-      fclose(graph_data_output_file);
-
-    video_capturer_.reset();
-    send_transport.reset();
-    recv_transport.reset();
-
-    DestroyCalls();
-  });
-}
-
-void VideoQualityTest::SetupAudio(int send_channel_id,
-                                  int receive_channel_id,
-                                  Transport* transport,
-                                  AudioReceiveStream** audio_receive_stream) {
-  audio_send_config_ = AudioSendStream::Config(transport);
-  audio_send_config_.voe_channel_id = send_channel_id;
-  audio_send_config_.rtp.ssrc = kAudioSendSsrc;
-
-  // Add extension to enable audio send side BWE, and allow audio bit rate
-  // adaptation.
-  audio_send_config_.rtp.extensions.clear();
-  if (params_.call.send_side_bwe) {
-    audio_send_config_.rtp.extensions.push_back(
-        webrtc::RtpExtension(webrtc::RtpExtension::kTransportSequenceNumberUri,
-                             test::kTransportSequenceNumberExtensionId));
-    audio_send_config_.min_bitrate_bps = kOpusMinBitrateBps;
-    audio_send_config_.max_bitrate_bps = kOpusBitrateFbBps;
-  }
-  audio_send_config_.send_codec_spec =
-      rtc::Optional<AudioSendStream::Config::SendCodecSpec>(
-          {kAudioSendPayloadType,
-           {"OPUS", 48000, 2,
-            {{"usedtx", (params_.audio.dtx ? "1" : "0")},
-              {"stereo", "1"}}}});
-  audio_send_config_.encoder_factory = encoder_factory_;
-  audio_send_stream_ = sender_call_->CreateAudioSendStream(audio_send_config_);
-
-  AudioReceiveStream::Config audio_config;
-  audio_config.rtp.local_ssrc = kReceiverLocalAudioSsrc;
-  audio_config.rtcp_send_transport = transport;
-  audio_config.voe_channel_id = receive_channel_id;
-  audio_config.rtp.remote_ssrc = audio_send_config_.rtp.ssrc;
-  audio_config.rtp.transport_cc = params_.call.send_side_bwe;
-  audio_config.rtp.extensions = audio_send_config_.rtp.extensions;
-  audio_config.decoder_factory = decoder_factory_;
-  audio_config.decoder_map = {{kAudioSendPayloadType, {"OPUS", 48000, 2}}};
-  if (params_.video.enabled && params_.audio.sync_video)
-    audio_config.sync_group = kSyncGroup;
-
-  *audio_receive_stream =
-      receiver_call_->CreateAudioReceiveStream(audio_config);
-}
-
-void VideoQualityTest::RunWithRenderers(const Params& params) {
-  std::unique_ptr<test::LayerFilteringTransport> send_transport;
-  std::unique_ptr<test::DirectTransport> recv_transport;
-  ::VoiceEngineState voe;
-  std::unique_ptr<test::VideoRenderer> local_preview;
-  std::vector<std::unique_ptr<test::VideoRenderer>> loopback_renderers;
-  AudioReceiveStream* audio_receive_stream = nullptr;
-
-  task_queue_.SendTask([&]() {
-    params_ = params;
-    CheckParams();
-
-    // TODO(ivica): Remove bitrate_config and use the default Call::Config(), to
-    // match the full stack tests.
-    Call::Config call_config(event_log_.get());
-    call_config.bitrate_config = params_.call.call_bitrate_config;
-
-    rtc::scoped_refptr<webrtc::AudioProcessing> audio_processing(
-        webrtc::AudioProcessing::Create());
-
-    if (params_.audio.enabled) {
-      CreateVoiceEngine(&voe, audio_processing.get(), decoder_factory_);
-      AudioState::Config audio_state_config;
-      audio_state_config.voice_engine = voe.voice_engine;
-      audio_state_config.audio_mixer = AudioMixerImpl::Create();
-      audio_state_config.audio_processing = audio_processing;
-      call_config.audio_state = AudioState::Create(audio_state_config);
-    }
-
-    CreateCalls(call_config, call_config);
-
-    // TODO(minyue): consider if this is a good transport even for audio only
-    // calls.
-    send_transport = rtc::MakeUnique<test::LayerFilteringTransport>(
-        &task_queue_, params.pipe, sender_call_.get(), kPayloadTypeVP8,
-        kPayloadTypeVP9, params.video.selected_tl, params_.ss.selected_sl,
-        payload_type_map_);
-
-    recv_transport = rtc::MakeUnique<test::DirectTransport>(
-        &task_queue_, params_.pipe, receiver_call_.get(), payload_type_map_);
-
-    // TODO(ivica): Use two calls to be able to merge with RunWithAnalyzer or at
-    // least share as much code as possible. That way this test would also match
-    // the full stack tests better.
-    send_transport->SetReceiver(receiver_call_->Receiver());
-    recv_transport->SetReceiver(sender_call_->Receiver());
-
-    if (params_.video.enabled) {
-      // Create video renderers.
-      local_preview.reset(test::VideoRenderer::Create(
-          "Local Preview", params_.video.width, params_.video.height));
-
-      const size_t selected_stream_id = params_.ss.selected_stream;
-      const size_t num_streams = params_.ss.streams.size();
-
-      if (selected_stream_id == num_streams) {
-        for (size_t stream_id = 0; stream_id < num_streams; ++stream_id) {
-          std::ostringstream oss;
-          oss << "Loopback Video - Stream #" << static_cast<int>(stream_id);
-          loopback_renderers.emplace_back(test::VideoRenderer::Create(
-              oss.str().c_str(), params_.ss.streams[stream_id].width,
-              params_.ss.streams[stream_id].height));
-        }
-      } else {
-        loopback_renderers.emplace_back(test::VideoRenderer::Create(
-            "Loopback Video", params_.ss.streams[selected_stream_id].width,
-            params_.ss.streams[selected_stream_id].height));
-      }
-
-      SetupVideo(send_transport.get(), recv_transport.get());
-
-      video_send_config_.pre_encode_callback = local_preview.get();
-      if (selected_stream_id == num_streams) {
-        for (size_t stream_id = 0; stream_id < num_streams; ++stream_id) {
-          video_receive_configs_[stream_id].renderer =
-              loopback_renderers[stream_id].get();
-          if (params_.audio.enabled && params_.audio.sync_video)
-            video_receive_configs_[stream_id].sync_group = kSyncGroup;
-        }
-      } else {
-        video_receive_configs_[selected_stream_id].renderer =
-            loopback_renderers.back().get();
-        if (params_.audio.enabled && params_.audio.sync_video)
-          video_receive_configs_[selected_stream_id].sync_group = kSyncGroup;
-      }
-
-      if (params_.screenshare.enabled)
-        SetupScreenshareOrSVC();
-
-      CreateFlexfecStreams();
-      CreateVideoStreams();
-
-      CreateCapturer();
-      video_send_stream_->SetSource(video_capturer_.get(),
-                                    degradation_preference_);
-    }
-
-    if (params_.audio.enabled) {
-      SetupAudio(voe.send_channel_id, voe.receive_channel_id,
-                 send_transport.get(), &audio_receive_stream);
-    }
-
-    for (VideoReceiveStream* receive_stream : video_receive_streams_)
-      StartEncodedFrameLogs(receive_stream);
-    StartEncodedFrameLogs(video_send_stream_);
-
-    // Start sending and receiving video.
-    if (params_.video.enabled) {
-      for (VideoReceiveStream* video_receive_stream : video_receive_streams_)
-        video_receive_stream->Start();
-
-      video_send_stream_->Start();
-      video_capturer_->Start();
-    }
-
-    if (params_.audio.enabled) {
-      // Start receiving audio.
-      audio_receive_stream->Start();
-      EXPECT_EQ(0, voe.base->StartPlayout(voe.receive_channel_id));
-
-      // Start sending audio.
-      audio_send_stream_->Start();
-      EXPECT_EQ(0, voe.base->StartSend(voe.send_channel_id));
-    }
-  });
-
-  test::PressEnterToContinue();
-
-  task_queue_.SendTask([&]() {
-    if (params_.audio.enabled) {
-      // Stop sending audio.
-      EXPECT_EQ(0, voe.base->StopSend(voe.send_channel_id));
-      audio_send_stream_->Stop();
-
-      // Stop receiving audio.
-      EXPECT_EQ(0, voe.base->StopPlayout(voe.receive_channel_id));
-      audio_receive_stream->Stop();
-      sender_call_->DestroyAudioSendStream(audio_send_stream_);
-      receiver_call_->DestroyAudioReceiveStream(audio_receive_stream);
-    }
-
-    // Stop receiving and sending video.
-    if (params_.video.enabled) {
-      video_capturer_->Stop();
-      video_send_stream_->Stop();
-      for (FlexfecReceiveStream* flexfec_receive_stream :
-           flexfec_receive_streams_) {
-        for (VideoReceiveStream* video_receive_stream :
-             video_receive_streams_) {
-          video_receive_stream->RemoveSecondarySink(flexfec_receive_stream);
-        }
-        receiver_call_->DestroyFlexfecReceiveStream(flexfec_receive_stream);
-      }
-      for (VideoReceiveStream* receive_stream : video_receive_streams_) {
-        receive_stream->Stop();
-        receiver_call_->DestroyVideoReceiveStream(receive_stream);
-      }
-      sender_call_->DestroyVideoSendStream(video_send_stream_);
-    }
-
-    video_capturer_.reset();
-    send_transport.reset();
-    recv_transport.reset();
-
-    if (params_.audio.enabled)
-      DestroyVoiceEngine(&voe);
-
-    local_preview.reset();
-    loopback_renderers.clear();
-
-    DestroyCalls();
-  });
-}
-
-void VideoQualityTest::StartEncodedFrameLogs(VideoSendStream* stream) {
-  if (!params_.logging.encoded_frame_base_path.empty()) {
-    std::ostringstream str;
-    str << send_logs_++;
-    std::string prefix =
-        params_.logging.encoded_frame_base_path + "." + str.str() + ".send.";
-    stream->EnableEncodedFrameRecording(
-        std::vector<rtc::PlatformFile>(
-            {rtc::CreatePlatformFile(prefix + "1.ivf"),
-             rtc::CreatePlatformFile(prefix + "2.ivf"),
-             rtc::CreatePlatformFile(prefix + "3.ivf")}),
-        100000000);
-  }
-}
-
-void VideoQualityTest::StartEncodedFrameLogs(VideoReceiveStream* stream) {
-  if (!params_.logging.encoded_frame_base_path.empty()) {
-    std::ostringstream str;
-    str << receive_logs_++;
-    std::string path =
-        params_.logging.encoded_frame_base_path + "." + str.str() + ".recv.ivf";
-    stream->EnableEncodedFrameRecording(rtc::CreatePlatformFile(path),
-                                        100000000);
-  }
-}
-}  // namespace webrtc
diff --git a/video/video_quality_test.h b/video/video_quality_test.h
deleted file mode 100644
index 4238447..0000000
--- a/video/video_quality_test.h
+++ /dev/null
@@ -1,167 +0,0 @@
-/*
- *  Copyright (c) 2015 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_VIDEO_VIDEO_QUALITY_TEST_H_
-#define WEBRTC_VIDEO_VIDEO_QUALITY_TEST_H_
-
-#include <map>
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "webrtc/media/engine/simulcast_encoder_adapter.h"
-#include "webrtc/test/call_test.h"
-#include "webrtc/test/frame_generator.h"
-#include "webrtc/test/testsupport/trace_to_stderr.h"
-
-namespace webrtc {
-
-class VideoQualityTest : public test::CallTest {
- public:
-  // Parameters are grouped into smaller structs to make it easier to set
-  // the desired elements and skip unused, using aggregate initialization.
-  // Unfortunately, C++11 (as opposed to C11) doesn't support unnamed structs,
-  // which makes the implementation of VideoQualityTest a bit uglier.
-  struct Params {
-    Params();
-    ~Params();
-    struct CallConfig {
-      bool send_side_bwe;
-      Call::Config::BitrateConfig call_bitrate_config;
-      int num_thumbnails;
-    } call;
-    struct Video {
-      bool enabled;
-      size_t width;
-      size_t height;
-      int32_t fps;
-      int min_bitrate_bps;
-      int target_bitrate_bps;
-      int max_bitrate_bps;
-      bool suspend_below_min_bitrate;
-      std::string codec;
-      int num_temporal_layers;
-      int selected_tl;
-      int min_transmit_bps;
-      bool ulpfec;
-      bool flexfec;
-      std::string clip_name;  // "Generator" to generate frames instead.
-      size_t capture_device_index;
-    } video;
-    struct Audio {
-      bool enabled;
-      bool sync_video;
-      bool dtx;
-    } audio;
-    struct Screenshare {
-      bool enabled;
-      bool generate_slides;
-      int32_t slide_change_interval;
-      int32_t scroll_duration;
-      std::vector<std::string> slides;
-    } screenshare;
-    struct Analyzer {
-      std::string test_label;
-      double avg_psnr_threshold;  // (*)
-      double avg_ssim_threshold;  // (*)
-      int test_durations_secs;
-      std::string graph_data_output_filename;
-      std::string graph_title;
-    } analyzer;
-    FakeNetworkPipe::Config pipe;
-    struct SS {                          // Spatial scalability.
-      std::vector<VideoStream> streams;  // If empty, one stream is assumed.
-      size_t selected_stream;
-      int num_spatial_layers;
-      int selected_sl;
-      // If empty, bitrates are generated in VP9Impl automatically.
-      std::vector<SpatialLayer> spatial_layers;
-      // If set, default parameters will be used instead of |streams|.
-      bool infer_streams;
-    } ss;
-    struct Logging {
-      bool logs;
-      std::string rtc_event_log_name;
-      std::string rtp_dump_name;
-      std::string encoded_frame_base_path;
-    } logging;
-  };
-
-  VideoQualityTest();
-  void RunWithAnalyzer(const Params& params);
-  void RunWithRenderers(const Params& params);
-
-  static void FillScalabilitySettings(
-      Params* params,
-      const std::vector<std::string>& stream_descriptors,
-      int num_streams,
-      size_t selected_stream,
-      int num_spatial_layers,
-      int selected_sl,
-      const std::vector<std::string>& sl_descriptors);
-
- protected:
-  std::map<uint8_t, webrtc::MediaType> payload_type_map_;
-
-  // No-op implementation to be able to instantiate this class from non-TEST_F
-  // locations.
-  void TestBody() override;
-
-  // Helper methods accessing only params_.
-  std::string GenerateGraphTitle() const;
-  void CheckParams();
-
-  // Helper static methods.
-  static VideoStream DefaultVideoStream(const Params& params);
-  static VideoStream DefaultThumbnailStream();
-  static std::vector<int> ParseCSV(const std::string& str);
-
-  // Helper methods for setting up the call.
-  void CreateCapturer();
-  void SetupThumbnailCapturers(size_t num_thumbnail_streams);
-  void SetupVideo(Transport* send_transport, Transport* recv_transport);
-  void SetupThumbnails(Transport* send_transport, Transport* recv_transport);
-  void DestroyThumbnailStreams();
-  void SetupScreenshareOrSVC();
-  void SetupAudio(int send_channel_id,
-                  int receive_channel_id,
-                  Transport* transport,
-                  AudioReceiveStream** audio_receive_stream);
-
-  void StartEncodedFrameLogs(VideoSendStream* stream);
-  void StartEncodedFrameLogs(VideoReceiveStream* stream);
-
-  // We need a more general capturer than the FrameGeneratorCapturer.
-  std::unique_ptr<test::VideoCapturer> video_capturer_;
-  std::vector<std::unique_ptr<test::VideoCapturer>> thumbnail_capturers_;
-  std::unique_ptr<test::TraceToStderr> trace_to_stderr_;
-  std::unique_ptr<test::FrameGenerator> frame_generator_;
-  std::unique_ptr<VideoEncoder> video_encoder_;
-  std::unique_ptr<cricket::WebRtcVideoEncoderFactory> vp8_encoder_factory_;
-
-  std::vector<std::unique_ptr<VideoEncoder>> thumbnail_encoders_;
-  std::vector<VideoSendStream::Config> thumbnail_send_configs_;
-  std::vector<VideoEncoderConfig> thumbnail_encoder_configs_;
-  std::vector<VideoSendStream*> thumbnail_send_streams_;
-  std::vector<VideoReceiveStream::Config> thumbnail_receive_configs_;
-  std::vector<VideoReceiveStream*> thumbnail_receive_streams_;
-
-  Clock* const clock_;
-
-  int receive_logs_;
-  int send_logs_;
-
-  VideoSendStream::DegradationPreference degradation_preference_ =
-      VideoSendStream::DegradationPreference::kMaintainFramerate;
-  Params params_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_VIDEO_VIDEO_QUALITY_TEST_H_
diff --git a/video/video_receive_stream.cc b/video/video_receive_stream.cc
deleted file mode 100644
index a89e3ce..0000000
--- a/video/video_receive_stream.cc
+++ /dev/null
@@ -1,453 +0,0 @@
-/*
- *  Copyright (c) 2013 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/video/video_receive_stream.h"
-
-#include <stdlib.h>
-
-#include <set>
-#include <string>
-#include <utility>
-
-#include "webrtc/api/optional.h"
-#include "webrtc/call/rtp_stream_receiver_controller_interface.h"
-#include "webrtc/call/rtx_receive_stream.h"
-#include "webrtc/common_types.h"
-#include "webrtc/common_video/h264/profile_level_id.h"
-#include "webrtc/common_video/libyuv/include/webrtc_libyuv.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_receiver.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp.h"
-#include "webrtc/modules/utility/include/process_thread.h"
-#include "webrtc/modules/video_coding/frame_object.h"
-#include "webrtc/modules/video_coding/include/video_coding.h"
-#include "webrtc/modules/video_coding/jitter_estimator.h"
-#include "webrtc/modules/video_coding/timing.h"
-#include "webrtc/modules/video_coding/utility/ivf_file_writer.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/location.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/ptr_util.h"
-#include "webrtc/rtc_base/trace_event.h"
-#include "webrtc/system_wrappers/include/clock.h"
-#include "webrtc/system_wrappers/include/field_trial.h"
-#include "webrtc/video/call_stats.h"
-#include "webrtc/video/receive_statistics_proxy.h"
-
-namespace webrtc {
-
-namespace {
-VideoCodec CreateDecoderVideoCodec(const VideoReceiveStream::Decoder& decoder) {
-  VideoCodec codec;
-  memset(&codec, 0, sizeof(codec));
-
-  codec.plType = decoder.payload_type;
-  strncpy(codec.plName, decoder.payload_name.c_str(), sizeof(codec.plName));
-  codec.codecType = PayloadStringToCodecType(decoder.payload_name);
-
-  if (codec.codecType == kVideoCodecVP8) {
-    *(codec.VP8()) = VideoEncoder::GetDefaultVp8Settings();
-  } else if (codec.codecType == kVideoCodecVP9) {
-    *(codec.VP9()) = VideoEncoder::GetDefaultVp9Settings();
-  } else if (codec.codecType == kVideoCodecH264) {
-    *(codec.H264()) = VideoEncoder::GetDefaultH264Settings();
-    codec.H264()->profile =
-        H264::ParseSdpProfileLevelId(decoder.codec_params)->profile;
-  }
-
-  codec.width = 320;
-  codec.height = 180;
-  const int kDefaultStartBitrate = 300;
-  codec.startBitrate = codec.minBitrate = codec.maxBitrate =
-      kDefaultStartBitrate;
-
-  return codec;
-}
-}  // namespace
-
-namespace internal {
-
-VideoReceiveStream::VideoReceiveStream(
-    RtpStreamReceiverControllerInterface* receiver_controller,
-    int num_cpu_cores,
-    PacketRouter* packet_router,
-    VideoReceiveStream::Config config,
-    ProcessThread* process_thread,
-    CallStats* call_stats)
-    : transport_adapter_(config.rtcp_send_transport),
-      config_(std::move(config)),
-      num_cpu_cores_(num_cpu_cores),
-      process_thread_(process_thread),
-      clock_(Clock::GetRealTimeClock()),
-      decode_thread_(&DecodeThreadFunction,
-                     this,
-                     "DecodingThread",
-                     rtc::kHighestPriority),
-      call_stats_(call_stats),
-      rtp_receive_statistics_(ReceiveStatistics::Create(clock_)),
-      timing_(new VCMTiming(clock_)),
-      video_receiver_(clock_, nullptr, this, timing_.get(), this, this),
-      stats_proxy_(&config_, clock_),
-      rtp_video_stream_receiver_(&transport_adapter_,
-                                 call_stats_->rtcp_rtt_stats(),
-                                 packet_router,
-                                 &config_,
-                                 rtp_receive_statistics_.get(),
-                                 &stats_proxy_,
-                                 process_thread_,
-                                 this,  // NackSender
-                                 this,  // KeyFrameRequestSender
-                                 this,  // OnCompleteFrameCallback
-                                 timing_.get()),
-      rtp_stream_sync_(this) {
-  LOG(LS_INFO) << "VideoReceiveStream: " << config_.ToString();
-
-  RTC_DCHECK(process_thread_);
-  RTC_DCHECK(call_stats_);
-
-  module_process_sequence_checker_.Detach();
-
-  RTC_DCHECK(!config_.decoders.empty());
-  std::set<int> decoder_payload_types;
-  for (const Decoder& decoder : config_.decoders) {
-    RTC_CHECK(decoder.decoder);
-    RTC_CHECK(decoder_payload_types.find(decoder.payload_type) ==
-              decoder_payload_types.end())
-        << "Duplicate payload type (" << decoder.payload_type
-        << ") for different decoders.";
-    decoder_payload_types.insert(decoder.payload_type);
-  }
-
-  video_receiver_.SetRenderDelay(config_.render_delay_ms);
-
-  jitter_estimator_.reset(new VCMJitterEstimator(clock_));
-  frame_buffer_.reset(new video_coding::FrameBuffer(
-      clock_, jitter_estimator_.get(), timing_.get(), &stats_proxy_));
-
-  process_thread_->RegisterModule(&rtp_stream_sync_, RTC_FROM_HERE);
-
-  // Register with RtpStreamReceiverController.
-  media_receiver_ = receiver_controller->CreateReceiver(
-      config_.rtp.remote_ssrc, &rtp_video_stream_receiver_);
-  if (config_.rtp.rtx_ssrc) {
-    rtx_receive_stream_ = rtc::MakeUnique<RtxReceiveStream>(
-        &rtp_video_stream_receiver_, config.rtp.rtx_associated_payload_types,
-        config_.rtp.remote_ssrc, rtp_receive_statistics_.get());
-    rtx_receiver_ = receiver_controller->CreateReceiver(
-        config_.rtp.rtx_ssrc, rtx_receive_stream_.get());
-  }
-}
-
-VideoReceiveStream::~VideoReceiveStream() {
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&worker_sequence_checker_);
-  LOG(LS_INFO) << "~VideoReceiveStream: " << config_.ToString();
-  Stop();
-
-  process_thread_->DeRegisterModule(&rtp_stream_sync_);
-}
-
-void VideoReceiveStream::SignalNetworkState(NetworkState state) {
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&worker_sequence_checker_);
-  rtp_video_stream_receiver_.SignalNetworkState(state);
-}
-
-bool VideoReceiveStream::DeliverRtcp(const uint8_t* packet, size_t length) {
-  return rtp_video_stream_receiver_.DeliverRtcp(packet, length);
-}
-
-void VideoReceiveStream::SetSync(Syncable* audio_syncable) {
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&worker_sequence_checker_);
-  rtp_stream_sync_.ConfigureSync(audio_syncable);
-}
-
-void VideoReceiveStream::Start() {
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&worker_sequence_checker_);
-  if (decode_thread_.IsRunning())
-    return;
-
-  bool protected_by_fec = config_.rtp.protected_by_flexfec ||
-                          rtp_video_stream_receiver_.IsUlpfecEnabled();
-
-  frame_buffer_->Start();
-  call_stats_->RegisterStatsObserver(&rtp_video_stream_receiver_);
-
-  if (rtp_video_stream_receiver_.IsRetransmissionsEnabled() &&
-      protected_by_fec) {
-    frame_buffer_->SetProtectionMode(kProtectionNackFEC);
-  }
-
-  transport_adapter_.Enable();
-  rtc::VideoSinkInterface<VideoFrame>* renderer = nullptr;
-  if (config_.renderer) {
-    if (config_.disable_prerenderer_smoothing) {
-      renderer = this;
-    } else {
-      incoming_video_stream_.reset(
-          new IncomingVideoStream(config_.render_delay_ms, this));
-      renderer = incoming_video_stream_.get();
-    }
-  }
-  RTC_DCHECK(renderer != nullptr);
-
-  for (const Decoder& decoder : config_.decoders) {
-    video_receiver_.RegisterExternalDecoder(decoder.decoder,
-                                            decoder.payload_type);
-    VideoCodec codec = CreateDecoderVideoCodec(decoder);
-    RTC_CHECK(rtp_video_stream_receiver_.AddReceiveCodec(codec,
-                                                         decoder.codec_params));
-    RTC_CHECK_EQ(VCM_OK, video_receiver_.RegisterReceiveCodec(
-                             &codec, num_cpu_cores_, false));
-  }
-
-  video_stream_decoder_.reset(new VideoStreamDecoder(
-      &video_receiver_, &rtp_video_stream_receiver_,
-      &rtp_video_stream_receiver_,
-      rtp_video_stream_receiver_.IsRetransmissionsEnabled(), protected_by_fec,
-      &stats_proxy_, renderer));
-  // Register the channel to receive stats updates.
-  call_stats_->RegisterStatsObserver(video_stream_decoder_.get());
-
-  process_thread_->RegisterModule(&video_receiver_, RTC_FROM_HERE);
-
-  // Start the decode thread
-  decode_thread_.Start();
-  rtp_video_stream_receiver_.StartReceive();
-}
-
-void VideoReceiveStream::Stop() {
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&worker_sequence_checker_);
-  rtp_video_stream_receiver_.StopReceive();
-
-  frame_buffer_->Stop();
-  call_stats_->DeregisterStatsObserver(&rtp_video_stream_receiver_);
-  process_thread_->DeRegisterModule(&video_receiver_);
-
-  if (decode_thread_.IsRunning()) {
-    // TriggerDecoderShutdown will release any waiting decoder thread and make
-    // it stop immediately, instead of waiting for a timeout. Needs to be called
-    // before joining the decoder thread.
-    video_receiver_.TriggerDecoderShutdown();
-
-    decode_thread_.Stop();
-    // Deregister external decoders so they are no longer running during
-    // destruction. This effectively stops the VCM since the decoder thread is
-    // stopped, the VCM is deregistered and no asynchronous decoder threads are
-    // running.
-    for (const Decoder& decoder : config_.decoders)
-      video_receiver_.RegisterExternalDecoder(nullptr, decoder.payload_type);
-  }
-
-  call_stats_->DeregisterStatsObserver(video_stream_decoder_.get());
-  video_stream_decoder_.reset();
-  incoming_video_stream_.reset();
-  transport_adapter_.Disable();
-}
-
-VideoReceiveStream::Stats VideoReceiveStream::GetStats() const {
-  return stats_proxy_.GetStats();
-}
-
-void VideoReceiveStream::EnableEncodedFrameRecording(rtc::PlatformFile file,
-                                                     size_t byte_limit) {
-  {
-    rtc::CritScope lock(&ivf_writer_lock_);
-    if (file == rtc::kInvalidPlatformFileValue) {
-      ivf_writer_.reset();
-    } else {
-      ivf_writer_ = IvfFileWriter::Wrap(rtc::File(file), byte_limit);
-    }
-  }
-
-  if (file != rtc::kInvalidPlatformFileValue) {
-    // Make a keyframe appear as early as possible in the logs, to give actually
-    // decodable output.
-    RequestKeyFrame();
-  }
-}
-
-void VideoReceiveStream::AddSecondarySink(RtpPacketSinkInterface* sink) {
-  rtp_video_stream_receiver_.AddSecondarySink(sink);
-}
-
-void VideoReceiveStream::RemoveSecondarySink(
-    const RtpPacketSinkInterface* sink) {
-  rtp_video_stream_receiver_.RemoveSecondarySink(sink);
-}
-
-// TODO(tommi): This method grabs a lock 6 times.
-void VideoReceiveStream::OnFrame(const VideoFrame& video_frame) {
-  int64_t sync_offset_ms;
-  double estimated_freq_khz;
-  // TODO(tommi): GetStreamSyncOffsetInMs grabs three locks.  One inside the
-  // function itself, another in GetChannel() and a third in
-  // GetPlayoutTimestamp.  Seems excessive.  Anyhow, I'm assuming the function
-  // succeeds most of the time, which leads to grabbing a fourth lock.
-  if (rtp_stream_sync_.GetStreamSyncOffsetInMs(video_frame.timestamp(),
-                                               video_frame.render_time_ms(),
-                                               &sync_offset_ms,
-                                               &estimated_freq_khz)) {
-    // TODO(tommi): OnSyncOffsetUpdated grabs a lock.
-    stats_proxy_.OnSyncOffsetUpdated(sync_offset_ms, estimated_freq_khz);
-  }
-  // config_.renderer must never be null if we're getting this callback.
-  config_.renderer->OnFrame(video_frame);
-
-  // TODO(tommi): OnRenderFrame grabs a lock too.
-  stats_proxy_.OnRenderedFrame(video_frame);
-}
-
-// TODO(asapersson): Consider moving callback from video_encoder.h or
-// creating a different callback.
-EncodedImageCallback::Result VideoReceiveStream::OnEncodedImage(
-    const EncodedImage& encoded_image,
-    const CodecSpecificInfo* codec_specific_info,
-    const RTPFragmentationHeader* fragmentation) {
-  stats_proxy_.OnPreDecode(encoded_image, codec_specific_info);
-  size_t simulcast_idx = 0;
-  if (codec_specific_info->codecType == kVideoCodecVP8) {
-    simulcast_idx = codec_specific_info->codecSpecific.VP8.simulcastIdx;
-  }
-  if (config_.pre_decode_callback) {
-    config_.pre_decode_callback->EncodedFrameCallback(EncodedFrame(
-        encoded_image._buffer, encoded_image._length, encoded_image._frameType,
-        simulcast_idx, encoded_image._timeStamp));
-  }
-  {
-    rtc::CritScope lock(&ivf_writer_lock_);
-    if (ivf_writer_.get()) {
-      RTC_DCHECK(codec_specific_info);
-      bool ok = ivf_writer_->WriteFrame(encoded_image,
-                                        codec_specific_info->codecType);
-      RTC_DCHECK(ok);
-    }
-  }
-
-  return Result(Result::OK, encoded_image._timeStamp);
-}
-
-void VideoReceiveStream::SendNack(
-    const std::vector<uint16_t>& sequence_numbers) {
-  rtp_video_stream_receiver_.RequestPacketRetransmit(sequence_numbers);
-}
-
-void VideoReceiveStream::RequestKeyFrame() {
-  rtp_video_stream_receiver_.RequestKeyFrame();
-}
-
-void VideoReceiveStream::OnCompleteFrame(
-    std::unique_ptr<video_coding::FrameObject> frame) {
-  int last_continuous_pid = frame_buffer_->InsertFrame(std::move(frame));
-  if (last_continuous_pid != -1)
-    rtp_video_stream_receiver_.FrameContinuous(last_continuous_pid);
-}
-
-int VideoReceiveStream::id() const {
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&worker_sequence_checker_);
-  return config_.rtp.remote_ssrc;
-}
-
-rtc::Optional<Syncable::Info> VideoReceiveStream::GetInfo() const {
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&module_process_sequence_checker_);
-  Syncable::Info info;
-
-  RtpReceiver* rtp_receiver = rtp_video_stream_receiver_.GetRtpReceiver();
-  RTC_DCHECK(rtp_receiver);
-  if (!rtp_receiver->Timestamp(&info.latest_received_capture_timestamp))
-    return rtc::Optional<Syncable::Info>();
-  if (!rtp_receiver->LastReceivedTimeMs(&info.latest_receive_time_ms))
-    return rtc::Optional<Syncable::Info>();
-
-  RtpRtcp* rtp_rtcp = rtp_video_stream_receiver_.rtp_rtcp();
-  RTC_DCHECK(rtp_rtcp);
-  if (rtp_rtcp->RemoteNTP(&info.capture_time_ntp_secs,
-                          &info.capture_time_ntp_frac,
-                          nullptr,
-                          nullptr,
-                          &info.capture_time_source_clock) != 0) {
-    return rtc::Optional<Syncable::Info>();
-  }
-
-  info.current_delay_ms = video_receiver_.Delay();
-  return rtc::Optional<Syncable::Info>(info);
-}
-
-uint32_t VideoReceiveStream::GetPlayoutTimestamp() const {
-  RTC_NOTREACHED();
-  return 0;
-}
-
-void VideoReceiveStream::SetMinimumPlayoutDelay(int delay_ms) {
-  RTC_DCHECK_CALLED_SEQUENTIALLY(&module_process_sequence_checker_);
-  video_receiver_.SetMinimumPlayoutDelay(delay_ms);
-}
-
-void VideoReceiveStream::DecodeThreadFunction(void* ptr) {
-  while (static_cast<VideoReceiveStream*>(ptr)->Decode()) {
-  }
-}
-
-bool VideoReceiveStream::Decode() {
-  TRACE_EVENT0("webrtc", "VideoReceiveStream::Decode");
-  static const int kMaxWaitForFrameMs = 3000;
-  static const int kMaxWaitForKeyFrameMs = 200;
-
-  int wait_ms = keyframe_required_ ? kMaxWaitForKeyFrameMs : kMaxWaitForFrameMs;
-  std::unique_ptr<video_coding::FrameObject> frame;
-  // TODO(philipel): Call NextFrame with |keyframe_required| argument when
-  //                 downstream project has been fixed.
-  video_coding::FrameBuffer::ReturnReason res =
-      frame_buffer_->NextFrame(wait_ms, &frame);
-
-  if (res == video_coding::FrameBuffer::ReturnReason::kStopped) {
-    video_receiver_.DecodingStopped();
-    return false;
-  }
-
-  if (frame) {
-    RTC_DCHECK_EQ(res, video_coding::FrameBuffer::ReturnReason::kFrameFound);
-    if (video_receiver_.Decode(frame.get()) == VCM_OK) {
-      keyframe_required_ = false;
-      frame_decoded_ = true;
-      rtp_video_stream_receiver_.FrameDecoded(frame->picture_id);
-    } else if (!keyframe_required_ || !frame_decoded_) {
-      keyframe_required_ = true;
-      // TODO(philipel): Remove this keyframe request when downstream project
-      //                 has been fixed.
-      RequestKeyFrame();
-    }
-  } else {
-    RTC_DCHECK_EQ(res, video_coding::FrameBuffer::ReturnReason::kTimeout);
-    int64_t now_ms = clock_->TimeInMilliseconds();
-    rtc::Optional<int64_t> last_packet_ms =
-        rtp_video_stream_receiver_.LastReceivedPacketMs();
-    rtc::Optional<int64_t> last_keyframe_packet_ms =
-        rtp_video_stream_receiver_.LastReceivedKeyframePacketMs();
-
-    // To avoid spamming keyframe requests for a stream that is not active we
-    // check if we have received a packet within the last 5 seconds.
-    bool stream_is_active = last_packet_ms && now_ms - *last_packet_ms < 5000;
-    if (!stream_is_active)
-      stats_proxy_.OnStreamInactive();
-
-    // If we recently have been receiving packets belonging to a keyframe then
-    // we assume a keyframe is currently being received.
-    bool receiving_keyframe =
-        last_keyframe_packet_ms &&
-        now_ms - *last_keyframe_packet_ms < kMaxWaitForKeyFrameMs;
-
-    if (stream_is_active && !receiving_keyframe) {
-      LOG(LS_WARNING) << "No decodable frame in " << wait_ms
-                      << " ms, requesting keyframe.";
-      RequestKeyFrame();
-    }
-  }
-  return true;
-}
-}  // namespace internal
-}  // namespace webrtc
diff --git a/video/video_receive_stream.h b/video/video_receive_stream.h
deleted file mode 100644
index 8b680ae..0000000
--- a/video/video_receive_stream.h
+++ /dev/null
@@ -1,162 +0,0 @@
-/*
- *  Copyright (c) 2013 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_VIDEO_VIDEO_RECEIVE_STREAM_H_
-#define WEBRTC_VIDEO_VIDEO_RECEIVE_STREAM_H_
-
-#include <memory>
-#include <vector>
-
-#include "webrtc/call/rtp_packet_sink_interface.h"
-#include "webrtc/call/syncable.h"
-#include "webrtc/call/video_receive_stream.h"
-#include "webrtc/common_video/include/incoming_video_stream.h"
-#include "webrtc/common_video/libyuv/include/webrtc_libyuv.h"
-#include "webrtc/modules/rtp_rtcp/include/flexfec_receiver.h"
-#include "webrtc/modules/video_coding/frame_buffer2.h"
-#include "webrtc/modules/video_coding/video_coding_impl.h"
-#include "webrtc/rtc_base/sequenced_task_checker.h"
-#include "webrtc/system_wrappers/include/clock.h"
-#include "webrtc/video/receive_statistics_proxy.h"
-#include "webrtc/video/rtp_streams_synchronizer.h"
-#include "webrtc/video/rtp_video_stream_receiver.h"
-#include "webrtc/video/transport_adapter.h"
-#include "webrtc/video/video_stream_decoder.h"
-
-namespace webrtc {
-
-class CallStats;
-class IvfFileWriter;
-class ProcessThread;
-class RTPFragmentationHeader;
-class RtpStreamReceiverInterface;
-class RtpStreamReceiverControllerInterface;
-class RtxReceiveStream;
-class VCMTiming;
-class VCMJitterEstimator;
-
-namespace internal {
-
-class VideoReceiveStream : public webrtc::VideoReceiveStream,
-                           public rtc::VideoSinkInterface<VideoFrame>,
-                           public EncodedImageCallback,
-                           public NackSender,
-                           public KeyFrameRequestSender,
-                           public video_coding::OnCompleteFrameCallback,
-                           public Syncable {
- public:
-  VideoReceiveStream(RtpStreamReceiverControllerInterface* receiver_controller,
-                     int num_cpu_cores,
-                     PacketRouter* packet_router,
-                     VideoReceiveStream::Config config,
-                     ProcessThread* process_thread,
-                     CallStats* call_stats);
-  ~VideoReceiveStream() override;
-
-  const Config& config() const { return config_; }
-
-  void SignalNetworkState(NetworkState state);
-  bool DeliverRtcp(const uint8_t* packet, size_t length);
-
-  void SetSync(Syncable* audio_syncable);
-
-  // Implements webrtc::VideoReceiveStream.
-  void Start() override;
-  void Stop() override;
-
-  webrtc::VideoReceiveStream::Stats GetStats() const override;
-
-  // Takes ownership of the file, is responsible for closing it later.
-  // Calling this method will close and finalize any current log.
-  // Giving rtc::kInvalidPlatformFileValue disables logging.
-  // If a frame to be written would make the log too large the write fails and
-  // the log is closed and finalized. A |byte_limit| of 0 means no limit.
-  void EnableEncodedFrameRecording(rtc::PlatformFile file,
-                                   size_t byte_limit) override;
-
-  void AddSecondarySink(RtpPacketSinkInterface* sink) override;
-  void RemoveSecondarySink(const RtpPacketSinkInterface* sink) override;
-
-  // Implements rtc::VideoSinkInterface<VideoFrame>.
-  void OnFrame(const VideoFrame& video_frame) override;
-
-  // Implements EncodedImageCallback.
-  EncodedImageCallback::Result OnEncodedImage(
-      const EncodedImage& encoded_image,
-      const CodecSpecificInfo* codec_specific_info,
-      const RTPFragmentationHeader* fragmentation) override;
-
-  // Implements NackSender.
-  void SendNack(const std::vector<uint16_t>& sequence_numbers) override;
-
-  // Implements KeyFrameRequestSender.
-  void RequestKeyFrame() override;
-
-  // Implements video_coding::OnCompleteFrameCallback.
-  void OnCompleteFrame(
-      std::unique_ptr<video_coding::FrameObject> frame) override;
-
-  // Implements Syncable.
-  int id() const override;
-  rtc::Optional<Syncable::Info> GetInfo() const override;
-  uint32_t GetPlayoutTimestamp() const override;
-  void SetMinimumPlayoutDelay(int delay_ms) override;
-
- private:
-  static void DecodeThreadFunction(void* ptr);
-  bool Decode();
-
-  rtc::SequencedTaskChecker worker_sequence_checker_;
-  rtc::SequencedTaskChecker module_process_sequence_checker_;
-
-  TransportAdapter transport_adapter_;
-  const VideoReceiveStream::Config config_;
-  const int num_cpu_cores_;
-  ProcessThread* const process_thread_;
-  Clock* const clock_;
-
-  rtc::PlatformThread decode_thread_;
-
-  CallStats* const call_stats_;
-
-  // Shared by media and rtx stream receivers, since the latter has no RtpRtcp
-  // module of its own.
-  const std::unique_ptr<ReceiveStatistics> rtp_receive_statistics_;
-
-  std::unique_ptr<VCMTiming> timing_;  // Jitter buffer experiment.
-  vcm::VideoReceiver video_receiver_;
-  std::unique_ptr<rtc::VideoSinkInterface<VideoFrame>> incoming_video_stream_;
-  ReceiveStatisticsProxy stats_proxy_;
-  RtpVideoStreamReceiver rtp_video_stream_receiver_;
-  std::unique_ptr<VideoStreamDecoder> video_stream_decoder_;
-  RtpStreamsSynchronizer rtp_stream_sync_;
-
-  rtc::CriticalSection ivf_writer_lock_;
-  std::unique_ptr<IvfFileWriter> ivf_writer_ RTC_GUARDED_BY(ivf_writer_lock_);
-
-  // Members for the new jitter buffer experiment.
-  std::unique_ptr<VCMJitterEstimator> jitter_estimator_;
-  std::unique_ptr<video_coding::FrameBuffer> frame_buffer_;
-
-  std::unique_ptr<RtpStreamReceiverInterface> media_receiver_;
-  std::unique_ptr<RtxReceiveStream> rtx_receive_stream_;
-  std::unique_ptr<RtpStreamReceiverInterface> rtx_receiver_;
-
-  // Whenever we are in an undecodable state (stream has just started or due to
-  // a decoding error) we require a keyframe to restart the stream.
-  bool keyframe_required_ = true;
-
-  // If we have successfully decoded any frame.
-  bool frame_decoded_ = false;
-};
-}  // namespace internal
-}  // namespace webrtc
-
-#endif  // WEBRTC_VIDEO_VIDEO_RECEIVE_STREAM_H_
diff --git a/video/video_receive_stream_unittest.cc b/video/video_receive_stream_unittest.cc
deleted file mode 100644
index bce4fd3..0000000
--- a/video/video_receive_stream_unittest.cc
+++ /dev/null
@@ -1,140 +0,0 @@
-/*
- *  Copyright 2017 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 <vector>
-
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/gmock.h"
-
-#include "webrtc/api/video_codecs/video_decoder.h"
-#include "webrtc/call/rtp_stream_receiver_controller.h"
-#include "webrtc/media/base/fakevideorenderer.h"
-#include "webrtc/modules/pacing/packet_router.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_packet_to_send.h"
-#include "webrtc/modules/utility/include/process_thread.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/event.h"
-#include "webrtc/system_wrappers/include/clock.h"
-#include "webrtc/test/field_trial.h"
-#include "webrtc/video/call_stats.h"
-#include "webrtc/video/video_receive_stream.h"
-
-namespace webrtc {
-namespace {
-
-using testing::_;
-using testing::Invoke;
-
-constexpr int kDefaultTimeOutMs = 50;
-
-const char kNewJitterBufferFieldTrialEnabled[] =
-    "WebRTC-NewVideoJitterBuffer/Enabled/";
-
-class MockTransport : public Transport {
- public:
-  MOCK_METHOD3(SendRtp,
-               bool(const uint8_t* packet,
-                    size_t length,
-                    const PacketOptions& options));
-  MOCK_METHOD2(SendRtcp, bool(const uint8_t* packet, size_t length));
-};
-
-class MockVideoDecoder : public VideoDecoder {
- public:
-  MOCK_METHOD2(InitDecode,
-               int32_t(const VideoCodec* config, int32_t number_of_cores));
-  MOCK_METHOD5(Decode,
-               int32_t(const EncodedImage& input,
-                       bool missing_frames,
-                       const RTPFragmentationHeader* fragmentation,
-                       const CodecSpecificInfo* codec_specific_info,
-                       int64_t render_time_ms));
-  MOCK_METHOD1(RegisterDecodeCompleteCallback,
-               int32_t(DecodedImageCallback* callback));
-  MOCK_METHOD0(Release, int32_t(void));
-  const char* ImplementationName() const { return "MockVideoDecoder"; }
-};
-
-}  // namespace
-
-class VideoReceiveStreamTest : public testing::Test {
- public:
-  VideoReceiveStreamTest()
-      : override_field_trials_(kNewJitterBufferFieldTrialEnabled),
-        config_(&mock_transport_),
-        call_stats_(Clock::GetRealTimeClock()),
-        process_thread_(ProcessThread::Create("TestThread")) {}
-
-  void SetUp() {
-    constexpr int kDefaultNumCpuCores = 2;
-    config_.rtp.remote_ssrc = 1111;
-    config_.rtp.local_ssrc = 2222;
-    config_.renderer = &fake_renderer_;
-    VideoReceiveStream::Decoder h264_decoder;
-    h264_decoder.payload_type = 99;
-    h264_decoder.payload_name = "H264";
-    h264_decoder.codec_params.insert(
-        {"sprop-parameter-sets", "Z0IACpZTBYmI,aMljiA=="});
-    h264_decoder.decoder = &mock_h264_video_decoder_;
-    config_.decoders.push_back(h264_decoder);
-    VideoReceiveStream::Decoder null_decoder;
-    null_decoder.payload_type = 98;
-    null_decoder.payload_name = "null";
-    null_decoder.decoder = &mock_null_video_decoder_;
-    config_.decoders.push_back(null_decoder);
-
-    video_receive_stream_.reset(new webrtc::internal::VideoReceiveStream(
-        &rtp_stream_receiver_controller_, kDefaultNumCpuCores,
-        &packet_router_, config_.Copy(), process_thread_.get(), &call_stats_));
-  }
-
- protected:
-  webrtc::test::ScopedFieldTrials override_field_trials_;
-  VideoReceiveStream::Config config_;
-  CallStats call_stats_;
-  MockVideoDecoder mock_h264_video_decoder_;
-  MockVideoDecoder mock_null_video_decoder_;
-  cricket::FakeVideoRenderer fake_renderer_;
-  MockTransport mock_transport_;
-  PacketRouter packet_router_;
-  std::unique_ptr<ProcessThread> process_thread_;
-  RtpStreamReceiverController rtp_stream_receiver_controller_;
-  std::unique_ptr<webrtc::internal::VideoReceiveStream> video_receive_stream_;
-};
-
-TEST_F(VideoReceiveStreamTest, CreateFrameFromH264FmtpSpropAndIdr) {
-  constexpr uint8_t idr_nalu[] = {0x05, 0xFF, 0xFF, 0xFF};
-  RtpPacketToSend rtppacket(nullptr);
-  uint8_t* payload = rtppacket.AllocatePayload(sizeof(idr_nalu));
-  memcpy(payload, idr_nalu, sizeof(idr_nalu));
-  rtppacket.SetMarker(true);
-  rtppacket.SetSsrc(1111);
-  rtppacket.SetPayloadType(99);
-  rtppacket.SetSequenceNumber(1);
-  rtppacket.SetTimestamp(0);
-  rtc::Event init_decode_event_(false, false);
-  EXPECT_CALL(mock_h264_video_decoder_, InitDecode(_, _))
-      .WillOnce(Invoke([&init_decode_event_](const VideoCodec* config,
-                                             int32_t number_of_cores) {
-        init_decode_event_.Set();
-        return 0;
-      }));
-  EXPECT_CALL(mock_h264_video_decoder_, RegisterDecodeCompleteCallback(_));
-  video_receive_stream_->Start();
-  EXPECT_CALL(mock_h264_video_decoder_, Decode(_, false, _, _, _));
-  RtpPacketReceived parsed_packet;
-  ASSERT_TRUE(parsed_packet.Parse(rtppacket.data(), rtppacket.size()));
-  rtp_stream_receiver_controller_.OnRtpPacket(parsed_packet);
-  EXPECT_CALL(mock_h264_video_decoder_, Release());
-  // Make sure the decoder thread had a chance to run.
-  init_decode_event_.Wait(kDefaultTimeOutMs);
-}
-
-}  // namespace webrtc
diff --git a/video/video_send_stream.cc b/video/video_send_stream.cc
deleted file mode 100644
index 61884ca..0000000
--- a/video/video_send_stream.cc
+++ /dev/null
@@ -1,1258 +0,0 @@
-/*
- *  Copyright (c) 2013 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/video/video_send_stream.h"
-
-#include <algorithm>
-#include <cmath>
-#include <sstream>
-#include <string>
-#include <utility>
-#include <vector>
-
-#include "webrtc/call/rtp_transport_controller_send_interface.h"
-#include "webrtc/common_types.h"
-#include "webrtc/common_video/include/video_bitrate_allocator.h"
-#include "webrtc/modules/bitrate_controller/include/bitrate_controller.h"
-#include "webrtc/modules/congestion_controller/include/send_side_congestion_controller.h"
-#include "webrtc/modules/pacing/alr_detector.h"
-#include "webrtc/modules/pacing/packet_router.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_sender.h"
-#include "webrtc/modules/utility/include/process_thread.h"
-#include "webrtc/modules/video_coding/utility/ivf_file_writer.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/file.h"
-#include "webrtc/rtc_base/location.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/trace_event.h"
-#include "webrtc/rtc_base/weak_ptr.h"
-#include "webrtc/system_wrappers/include/field_trial.h"
-#include "webrtc/video/call_stats.h"
-#include "webrtc/video/payload_router.h"
-#include "webrtc/call/video_send_stream.h"
-
-namespace webrtc {
-
-static const int kMinSendSidePacketHistorySize = 600;
-namespace {
-
-// We don't do MTU discovery, so assume that we have the standard ethernet MTU.
-const size_t kPathMTU = 1500;
-
-std::vector<RtpRtcp*> CreateRtpRtcpModules(
-    Transport* outgoing_transport,
-    RtcpIntraFrameObserver* intra_frame_callback,
-    RtcpBandwidthObserver* bandwidth_callback,
-    RtpTransportControllerSendInterface* transport,
-    RtcpRttStats* rtt_stats,
-    FlexfecSender* flexfec_sender,
-    SendStatisticsProxy* stats_proxy,
-    SendDelayStats* send_delay_stats,
-    RtcEventLog* event_log,
-    RateLimiter* retransmission_rate_limiter,
-    OverheadObserver* overhead_observer,
-    size_t num_modules,
-    RtpKeepAliveConfig keepalive_config) {
-  RTC_DCHECK_GT(num_modules, 0);
-  RtpRtcp::Configuration configuration;
-  configuration.audio = false;
-  configuration.receiver_only = false;
-  configuration.flexfec_sender = flexfec_sender;
-  configuration.outgoing_transport = outgoing_transport;
-  configuration.intra_frame_callback = intra_frame_callback;
-  configuration.bandwidth_callback = bandwidth_callback;
-  configuration.transport_feedback_callback =
-      transport->transport_feedback_observer();
-  configuration.rtt_stats = rtt_stats;
-  configuration.rtcp_packet_type_counter_observer = stats_proxy;
-  configuration.paced_sender = transport->packet_sender();
-  configuration.transport_sequence_number_allocator =
-      transport->packet_router();
-  configuration.send_bitrate_observer = stats_proxy;
-  configuration.send_frame_count_observer = stats_proxy;
-  configuration.send_side_delay_observer = stats_proxy;
-  configuration.send_packet_observer = send_delay_stats;
-  configuration.event_log = event_log;
-  configuration.retransmission_rate_limiter = retransmission_rate_limiter;
-  configuration.overhead_observer = overhead_observer;
-  configuration.keepalive_config = keepalive_config;
-  std::vector<RtpRtcp*> modules;
-  for (size_t i = 0; i < num_modules; ++i) {
-    RtpRtcp* rtp_rtcp = RtpRtcp::CreateRtpRtcp(configuration);
-    rtp_rtcp->SetSendingStatus(false);
-    rtp_rtcp->SetSendingMediaStatus(false);
-    rtp_rtcp->SetRTCPStatus(RtcpMode::kCompound);
-    modules.push_back(rtp_rtcp);
-  }
-  return modules;
-}
-
-// TODO(brandtr): Update this function when we support multistream protection.
-std::unique_ptr<FlexfecSender> MaybeCreateFlexfecSender(
-    const VideoSendStream::Config& config,
-    const std::map<uint32_t, RtpState>& suspended_ssrcs) {
-  if (config.rtp.flexfec.payload_type < 0) {
-    return nullptr;
-  }
-  RTC_DCHECK_GE(config.rtp.flexfec.payload_type, 0);
-  RTC_DCHECK_LE(config.rtp.flexfec.payload_type, 127);
-  if (config.rtp.flexfec.ssrc == 0) {
-    LOG(LS_WARNING) << "FlexFEC is enabled, but no FlexFEC SSRC given. "
-                       "Therefore disabling FlexFEC.";
-    return nullptr;
-  }
-  if (config.rtp.flexfec.protected_media_ssrcs.empty()) {
-    LOG(LS_WARNING) << "FlexFEC is enabled, but no protected media SSRC given. "
-                       "Therefore disabling FlexFEC.";
-    return nullptr;
-  }
-
-  if (config.rtp.ssrcs.size() > 1) {
-    LOG(LS_WARNING) << "Both FlexFEC and simulcast are enabled. This "
-                       "combination is however not supported by our current "
-                       "FlexFEC implementation. Therefore disabling FlexFEC.";
-    return nullptr;
-  }
-
-  if (config.rtp.flexfec.protected_media_ssrcs.size() > 1) {
-    LOG(LS_WARNING)
-        << "The supplied FlexfecConfig contained multiple protected "
-           "media streams, but our implementation currently only "
-           "supports protecting a single media stream. "
-           "To avoid confusion, disabling FlexFEC completely.";
-    return nullptr;
-  }
-
-  const RtpState* rtp_state = nullptr;
-  auto it = suspended_ssrcs.find(config.rtp.flexfec.ssrc);
-  if (it != suspended_ssrcs.end()) {
-    rtp_state = &it->second;
-  }
-
-  RTC_DCHECK_EQ(1U, config.rtp.flexfec.protected_media_ssrcs.size());
-  return std::unique_ptr<FlexfecSender>(new FlexfecSender(
-      config.rtp.flexfec.payload_type, config.rtp.flexfec.ssrc,
-      config.rtp.flexfec.protected_media_ssrcs[0], config.rtp.extensions,
-      RTPSender::FecExtensionSizes(), rtp_state, Clock::GetRealTimeClock()));
-}
-
-}  // namespace
-
-namespace {
-
-bool PayloadTypeSupportsSkippingFecPackets(const std::string& payload_name) {
-  const VideoCodecType codecType = PayloadStringToCodecType(payload_name);
-  if (codecType == kVideoCodecVP8 || codecType == kVideoCodecVP9) {
-    return true;
-  }
-  return false;
-}
-
-int CalculateMaxPadBitrateBps(std::vector<VideoStream> streams,
-                              int min_transmit_bitrate_bps,
-                              bool pad_to_min_bitrate) {
-  int pad_up_to_bitrate_bps = 0;
-  // Calculate max padding bitrate for a multi layer codec.
-  if (streams.size() > 1) {
-    // Pad to min bitrate of the highest layer.
-    pad_up_to_bitrate_bps = streams[streams.size() - 1].min_bitrate_bps;
-    // Add target_bitrate_bps of the lower layers.
-    for (size_t i = 0; i < streams.size() - 1; ++i)
-      pad_up_to_bitrate_bps += streams[i].target_bitrate_bps;
-  } else if (pad_to_min_bitrate) {
-    pad_up_to_bitrate_bps = streams[0].min_bitrate_bps;
-  }
-
-  pad_up_to_bitrate_bps =
-      std::max(pad_up_to_bitrate_bps, min_transmit_bitrate_bps);
-
-  return pad_up_to_bitrate_bps;
-}
-
-uint32_t CalculateOverheadRateBps(int packets_per_second,
-                                  size_t overhead_bytes_per_packet,
-                                  uint32_t max_overhead_bps) {
-  uint32_t overhead_bps =
-      static_cast<uint32_t>(8 * overhead_bytes_per_packet * packets_per_second);
-  return std::min(overhead_bps, max_overhead_bps);
-}
-
-int CalculatePacketRate(uint32_t bitrate_bps, size_t packet_size_bytes) {
-  size_t packet_size_bits = 8 * packet_size_bytes;
-  // Ceil for int value of bitrate_bps / packet_size_bits.
-  return static_cast<int>((bitrate_bps + packet_size_bits - 1) /
-                          packet_size_bits);
-}
-
-}  // namespace
-
-namespace internal {
-
-// VideoSendStreamImpl implements internal::VideoSendStream.
-// It is created and destroyed on |worker_queue|. The intent is to decrease the
-// need for locking and to ensure methods are called in sequence.
-// Public methods except |DeliverRtcp| must be called on |worker_queue|.
-// DeliverRtcp is called on the libjingle worker thread or a network thread.
-// An encoder may deliver frames through the EncodedImageCallback on an
-// arbitrary thread.
-class VideoSendStreamImpl : public webrtc::BitrateAllocatorObserver,
-                            public webrtc::OverheadObserver,
-                            public webrtc::VCMProtectionCallback,
-                            public VideoStreamEncoder::EncoderSink,
-                            public VideoBitrateAllocationObserver {
- public:
-  VideoSendStreamImpl(SendStatisticsProxy* stats_proxy,
-                      rtc::TaskQueue* worker_queue,
-                      CallStats* call_stats,
-                      RtpTransportControllerSendInterface* transport,
-                      BitrateAllocator* bitrate_allocator,
-                      SendDelayStats* send_delay_stats,
-                      VideoStreamEncoder* video_stream_encoder,
-                      RtcEventLog* event_log,
-                      const VideoSendStream::Config* config,
-                      int initial_encoder_max_bitrate,
-                      std::map<uint32_t, RtpState> suspended_ssrcs,
-                      VideoEncoderConfig::ContentType content_type);
-  ~VideoSendStreamImpl() override;
-
-  // RegisterProcessThread register |module_process_thread| with those objects
-  // that use it. Registration has to happen on the thread were
-  // |module_process_thread| was created (libjingle's worker thread).
-  // TODO(perkj): Replace the use of |module_process_thread| with a TaskQueue,
-  // maybe |worker_queue|.
-  void RegisterProcessThread(ProcessThread* module_process_thread);
-  void DeRegisterProcessThread();
-
-  void SignalNetworkState(NetworkState state);
-  bool DeliverRtcp(const uint8_t* packet, size_t length);
-  void Start();
-  void Stop();
-
-  VideoSendStream::RtpStateMap GetRtpStates() const;
-
-  void EnableEncodedFrameRecording(const std::vector<rtc::PlatformFile>& files,
-                                   size_t byte_limit);
-
-  void SetTransportOverhead(size_t transport_overhead_per_packet);
-
- private:
-  class CheckEncoderActivityTask;
-  class EncoderReconfiguredTask;
-
-  // Implements BitrateAllocatorObserver.
-  uint32_t OnBitrateUpdated(uint32_t bitrate_bps,
-                            uint8_t fraction_loss,
-                            int64_t rtt,
-                            int64_t probing_interval_ms) override;
-
-  // Implements webrtc::VCMProtectionCallback.
-  int ProtectionRequest(const FecProtectionParams* delta_params,
-                        const FecProtectionParams* key_params,
-                        uint32_t* sent_video_rate_bps,
-                        uint32_t* sent_nack_rate_bps,
-                        uint32_t* sent_fec_rate_bps) override;
-
-  // Implements OverheadObserver.
-  void OnOverheadChanged(size_t overhead_bytes_per_packet) override;
-
-  void OnEncoderConfigurationChanged(std::vector<VideoStream> streams,
-                                     int min_transmit_bitrate_bps) override;
-
-  // Implements EncodedImageCallback. The implementation routes encoded frames
-  // to the |payload_router_| and |config.pre_encode_callback| if set.
-  // Called on an arbitrary encoder callback thread.
-  EncodedImageCallback::Result OnEncodedImage(
-      const EncodedImage& encoded_image,
-      const CodecSpecificInfo* codec_specific_info,
-      const RTPFragmentationHeader* fragmentation) override;
-
-  // Implements VideoBitrateAllocationObserver.
-  void OnBitrateAllocationUpdated(const BitrateAllocation& allocation) override;
-
-  void ConfigureProtection();
-  void ConfigureSsrcs();
-  void SignalEncoderTimedOut();
-  void SignalEncoderActive();
-
-  const bool send_side_bwe_with_overhead_;
-
-  SendStatisticsProxy* const stats_proxy_;
-  const VideoSendStream::Config* const config_;
-  std::map<uint32_t, RtpState> suspended_ssrcs_;
-
-  ProcessThread* module_process_thread_;
-  rtc::ThreadChecker module_process_thread_checker_;
-  rtc::TaskQueue* const worker_queue_;
-
-  rtc::CriticalSection encoder_activity_crit_sect_;
-  CheckEncoderActivityTask* check_encoder_activity_task_
-      RTC_GUARDED_BY(encoder_activity_crit_sect_);
-
-  CallStats* const call_stats_;
-  RtpTransportControllerSendInterface* const transport_;
-  BitrateAllocator* const bitrate_allocator_;
-
-  // TODO(brandtr): Move ownership to PayloadRouter.
-  std::unique_ptr<FlexfecSender> flexfec_sender_;
-
-  rtc::CriticalSection ivf_writers_crit_;
-  std::unique_ptr<IvfFileWriter>
-      file_writers_[kMaxSimulcastStreams] RTC_GUARDED_BY(ivf_writers_crit_);
-
-  int max_padding_bitrate_;
-  int encoder_min_bitrate_bps_;
-  uint32_t encoder_max_bitrate_bps_;
-  uint32_t encoder_target_rate_bps_;
-
-  VideoStreamEncoder* const video_stream_encoder_;
-  EncoderRtcpFeedback encoder_feedback_;
-  ProtectionBitrateCalculator protection_bitrate_calculator_;
-
-  const std::unique_ptr<RtcpBandwidthObserver> bandwidth_observer_;
-  // RtpRtcp modules, declared here as they use other members on construction.
-  const std::vector<RtpRtcp*> rtp_rtcp_modules_;
-  PayloadRouter payload_router_;
-
-  // |weak_ptr_| to our self. This is used since we can not call
-  // |weak_ptr_factory_.GetWeakPtr| from multiple sequences but it is ok to copy
-  // an existing WeakPtr.
-  rtc::WeakPtr<VideoSendStreamImpl> weak_ptr_;
-  // |weak_ptr_factory_| must be declared last to make sure all WeakPtr's are
-  // invalidated before any other members are destroyed.
-  rtc::WeakPtrFactory<VideoSendStreamImpl> weak_ptr_factory_;
-
-  rtc::CriticalSection overhead_bytes_per_packet_crit_;
-  size_t overhead_bytes_per_packet_
-      RTC_GUARDED_BY(overhead_bytes_per_packet_crit_);
-  size_t transport_overhead_bytes_per_packet_;
-};
-
-// TODO(tommi): See if there's a more elegant way to create a task that creates
-// an object on the correct task queue.
-class VideoSendStream::ConstructionTask : public rtc::QueuedTask {
- public:
-  ConstructionTask(std::unique_ptr<VideoSendStreamImpl>* send_stream,
-                   rtc::Event* done_event,
-                   SendStatisticsProxy* stats_proxy,
-                   VideoStreamEncoder* video_stream_encoder,
-                   ProcessThread* module_process_thread,
-                   CallStats* call_stats,
-                   RtpTransportControllerSendInterface* transport,
-                   BitrateAllocator* bitrate_allocator,
-                   SendDelayStats* send_delay_stats,
-                   RtcEventLog* event_log,
-                   const VideoSendStream::Config* config,
-                   int initial_encoder_max_bitrate,
-                   const std::map<uint32_t, RtpState>& suspended_ssrcs,
-                   VideoEncoderConfig::ContentType content_type)
-      : send_stream_(send_stream),
-        done_event_(done_event),
-        stats_proxy_(stats_proxy),
-        video_stream_encoder_(video_stream_encoder),
-        call_stats_(call_stats),
-        transport_(transport),
-        bitrate_allocator_(bitrate_allocator),
-        send_delay_stats_(send_delay_stats),
-        event_log_(event_log),
-        config_(config),
-        initial_encoder_max_bitrate_(initial_encoder_max_bitrate),
-        suspended_ssrcs_(suspended_ssrcs),
-        content_type_(content_type) {}
-
-  ~ConstructionTask() override { done_event_->Set(); }
-
- private:
-  bool Run() override {
-    send_stream_->reset(new VideoSendStreamImpl(
-        stats_proxy_, rtc::TaskQueue::Current(), call_stats_, transport_,
-        bitrate_allocator_, send_delay_stats_, video_stream_encoder_,
-        event_log_, config_, initial_encoder_max_bitrate_,
-        std::move(suspended_ssrcs_), content_type_));
-    return true;
-  }
-
-  std::unique_ptr<VideoSendStreamImpl>* const send_stream_;
-  rtc::Event* const done_event_;
-  SendStatisticsProxy* const stats_proxy_;
-  VideoStreamEncoder* const video_stream_encoder_;
-  CallStats* const call_stats_;
-  RtpTransportControllerSendInterface* const transport_;
-  BitrateAllocator* const bitrate_allocator_;
-  SendDelayStats* const send_delay_stats_;
-  RtcEventLog* const event_log_;
-  const VideoSendStream::Config* config_;
-  int initial_encoder_max_bitrate_;
-  std::map<uint32_t, RtpState> suspended_ssrcs_;
-  const VideoEncoderConfig::ContentType content_type_;
-};
-
-class VideoSendStream::DestructAndGetRtpStateTask : public rtc::QueuedTask {
- public:
-  DestructAndGetRtpStateTask(VideoSendStream::RtpStateMap* state_map,
-                             std::unique_ptr<VideoSendStreamImpl> send_stream,
-                             rtc::Event* done_event)
-      : state_map_(state_map),
-        send_stream_(std::move(send_stream)),
-        done_event_(done_event) {}
-
-  ~DestructAndGetRtpStateTask() override { RTC_CHECK(!send_stream_); }
-
- private:
-  bool Run() override {
-    send_stream_->Stop();
-    *state_map_ = send_stream_->GetRtpStates();
-    send_stream_.reset();
-    done_event_->Set();
-    return true;
-  }
-
-  VideoSendStream::RtpStateMap* state_map_;
-  std::unique_ptr<VideoSendStreamImpl> send_stream_;
-  rtc::Event* done_event_;
-};
-
-// CheckEncoderActivityTask is used for tracking when the encoder last produced
-// and encoded video frame. If the encoder has not produced anything the last
-// kEncoderTimeOutMs we also want to stop sending padding.
-class VideoSendStreamImpl::CheckEncoderActivityTask : public rtc::QueuedTask {
- public:
-  static const int kEncoderTimeOutMs = 2000;
-  explicit CheckEncoderActivityTask(
-      const rtc::WeakPtr<VideoSendStreamImpl>& send_stream)
-      : activity_(0), send_stream_(std::move(send_stream)), timed_out_(false) {}
-
-  void Stop() {
-    RTC_CHECK(task_checker_.CalledSequentially());
-    send_stream_.reset();
-  }
-
-  void UpdateEncoderActivity() {
-    // UpdateEncoderActivity is called from VideoSendStreamImpl::Encoded on
-    // whatever thread the real encoder implementation run on. In the case of
-    // hardware encoders, there might be several encoders
-    // running in parallel on different threads.
-    rtc::AtomicOps::ReleaseStore(&activity_, 1);
-  }
-
- private:
-  bool Run() override {
-    RTC_CHECK(task_checker_.CalledSequentially());
-    if (!send_stream_)
-      return true;
-    if (!rtc::AtomicOps::AcquireLoad(&activity_)) {
-      if (!timed_out_) {
-        send_stream_->SignalEncoderTimedOut();
-      }
-      timed_out_ = true;
-    } else if (timed_out_) {
-      send_stream_->SignalEncoderActive();
-      timed_out_ = false;
-    }
-    rtc::AtomicOps::ReleaseStore(&activity_, 0);
-
-    rtc::TaskQueue::Current()->PostDelayedTask(
-        std::unique_ptr<rtc::QueuedTask>(this), kEncoderTimeOutMs);
-    // Return false to prevent this task from being deleted. Ownership has been
-    // transferred to the task queue when PostDelayedTask was called.
-    return false;
-  }
-  volatile int activity_;
-
-  rtc::SequencedTaskChecker task_checker_;
-  rtc::WeakPtr<VideoSendStreamImpl> send_stream_;
-  bool timed_out_;
-};
-
-class VideoSendStreamImpl::EncoderReconfiguredTask : public rtc::QueuedTask {
- public:
-  EncoderReconfiguredTask(const rtc::WeakPtr<VideoSendStreamImpl>& send_stream,
-                          std::vector<VideoStream> streams,
-                          int min_transmit_bitrate_bps)
-      : send_stream_(std::move(send_stream)),
-        streams_(std::move(streams)),
-        min_transmit_bitrate_bps_(min_transmit_bitrate_bps) {}
-
- private:
-  bool Run() override {
-    if (send_stream_)
-      send_stream_->OnEncoderConfigurationChanged(std::move(streams_),
-                                                  min_transmit_bitrate_bps_);
-    return true;
-  }
-
-  rtc::WeakPtr<VideoSendStreamImpl> send_stream_;
-  std::vector<VideoStream> streams_;
-  int min_transmit_bitrate_bps_;
-};
-
-VideoSendStream::VideoSendStream(
-    int num_cpu_cores,
-    ProcessThread* module_process_thread,
-    rtc::TaskQueue* worker_queue,
-    CallStats* call_stats,
-    RtpTransportControllerSendInterface* transport,
-    BitrateAllocator* bitrate_allocator,
-    SendDelayStats* send_delay_stats,
-    RtcEventLog* event_log,
-    VideoSendStream::Config config,
-    VideoEncoderConfig encoder_config,
-    const std::map<uint32_t, RtpState>& suspended_ssrcs)
-    : worker_queue_(worker_queue),
-      thread_sync_event_(false /* manual_reset */, false),
-      stats_proxy_(Clock::GetRealTimeClock(),
-                   config,
-                   encoder_config.content_type),
-      config_(std::move(config)),
-      content_type_(encoder_config.content_type) {
-  video_stream_encoder_.reset(
-      new VideoStreamEncoder(num_cpu_cores, &stats_proxy_,
-                             config_.encoder_settings,
-                             config_.pre_encode_callback,
-                             config_.post_encode_callback,
-                             std::unique_ptr<OveruseFrameDetector>()));
-  worker_queue_->PostTask(std::unique_ptr<rtc::QueuedTask>(new ConstructionTask(
-      &send_stream_, &thread_sync_event_, &stats_proxy_,
-      video_stream_encoder_.get(), module_process_thread, call_stats, transport,
-      bitrate_allocator, send_delay_stats, event_log, &config_,
-      encoder_config.max_bitrate_bps, suspended_ssrcs,
-      encoder_config.content_type)));
-
-  // Wait for ConstructionTask to complete so that |send_stream_| can be used.
-  // |module_process_thread| must be registered and deregistered on the thread
-  // it was created on.
-  thread_sync_event_.Wait(rtc::Event::kForever);
-  send_stream_->RegisterProcessThread(module_process_thread);
-  // TODO(sprang): Enable this also for regular video calls if it works well.
-  if (encoder_config.content_type == VideoEncoderConfig::ContentType::kScreen) {
-    // Only signal target bitrate for screenshare streams, for now.
-    video_stream_encoder_->SetBitrateObserver(send_stream_.get());
-  }
-  video_stream_encoder_->RegisterProcessThread(module_process_thread);
-
-  ReconfigureVideoEncoder(std::move(encoder_config));
-}
-
-VideoSendStream::~VideoSendStream() {
-  RTC_DCHECK_RUN_ON(&thread_checker_);
-  RTC_DCHECK(!send_stream_);
-}
-
-void VideoSendStream::Start() {
-  RTC_DCHECK_RUN_ON(&thread_checker_);
-  LOG(LS_INFO) << "VideoSendStream::Start";
-  VideoSendStreamImpl* send_stream = send_stream_.get();
-  worker_queue_->PostTask([this, send_stream] {
-    send_stream->Start();
-    thread_sync_event_.Set();
-  });
-
-  // It is expected that after VideoSendStream::Start has been called, incoming
-  // frames are not dropped in VideoStreamEncoder. To ensure this, Start has to
-  // be synchronized.
-  thread_sync_event_.Wait(rtc::Event::kForever);
-}
-
-void VideoSendStream::Stop() {
-  RTC_DCHECK_RUN_ON(&thread_checker_);
-  LOG(LS_INFO) << "VideoSendStream::Stop";
-  VideoSendStreamImpl* send_stream = send_stream_.get();
-  worker_queue_->PostTask([send_stream] { send_stream->Stop(); });
-}
-
-void VideoSendStream::SetSource(
-    rtc::VideoSourceInterface<webrtc::VideoFrame>* source,
-    const DegradationPreference& degradation_preference) {
-  RTC_DCHECK_RUN_ON(&thread_checker_);
-  video_stream_encoder_->SetSource(source, degradation_preference);
-}
-
-void VideoSendStream::ReconfigureVideoEncoder(VideoEncoderConfig config) {
-  // TODO(perkj): Some test cases in VideoSendStreamTest call
-  // ReconfigureVideoEncoder from the network thread.
-  // RTC_DCHECK_RUN_ON(&thread_checker_);
-  RTC_DCHECK(content_type_ == config.content_type);
-  video_stream_encoder_->ConfigureEncoder(std::move(config),
-                                          config_.rtp.max_packet_size,
-                                          config_.rtp.nack.rtp_history_ms > 0);
-}
-
-VideoSendStream::Stats VideoSendStream::GetStats() {
-  // TODO(perkj, solenberg): Some test cases in EndToEndTest call GetStats from
-  // a network thread. See comment in Call::GetStats().
-  // RTC_DCHECK_RUN_ON(&thread_checker_);
-  return stats_proxy_.GetStats();
-}
-
-void VideoSendStream::SignalNetworkState(NetworkState state) {
-  RTC_DCHECK_RUN_ON(&thread_checker_);
-  VideoSendStreamImpl* send_stream = send_stream_.get();
-  worker_queue_->PostTask(
-      [send_stream, state] { send_stream->SignalNetworkState(state); });
-}
-
-VideoSendStream::RtpStateMap VideoSendStream::StopPermanentlyAndGetRtpStates() {
-  RTC_DCHECK_RUN_ON(&thread_checker_);
-  video_stream_encoder_->Stop();
-  video_stream_encoder_->DeRegisterProcessThread();
-  VideoSendStream::RtpStateMap state_map;
-  send_stream_->DeRegisterProcessThread();
-  worker_queue_->PostTask(
-      std::unique_ptr<rtc::QueuedTask>(new DestructAndGetRtpStateTask(
-          &state_map, std::move(send_stream_), &thread_sync_event_)));
-  thread_sync_event_.Wait(rtc::Event::kForever);
-  return state_map;
-}
-
-void VideoSendStream::SetTransportOverhead(
-    size_t transport_overhead_per_packet) {
-  RTC_DCHECK_RUN_ON(&thread_checker_);
-  VideoSendStreamImpl* send_stream = send_stream_.get();
-  worker_queue_->PostTask([send_stream, transport_overhead_per_packet] {
-    send_stream->SetTransportOverhead(transport_overhead_per_packet);
-  });
-}
-
-bool VideoSendStream::DeliverRtcp(const uint8_t* packet, size_t length) {
-  // Called on a network thread.
-  return send_stream_->DeliverRtcp(packet, length);
-}
-
-void VideoSendStream::EnableEncodedFrameRecording(
-    const std::vector<rtc::PlatformFile>& files,
-    size_t byte_limit) {
-  send_stream_->EnableEncodedFrameRecording(files, byte_limit);
-}
-
-VideoSendStreamImpl::VideoSendStreamImpl(
-    SendStatisticsProxy* stats_proxy,
-    rtc::TaskQueue* worker_queue,
-    CallStats* call_stats,
-    RtpTransportControllerSendInterface* transport,
-    BitrateAllocator* bitrate_allocator,
-    SendDelayStats* send_delay_stats,
-    VideoStreamEncoder* video_stream_encoder,
-    RtcEventLog* event_log,
-    const VideoSendStream::Config* config,
-    int initial_encoder_max_bitrate,
-    std::map<uint32_t, RtpState> suspended_ssrcs,
-    VideoEncoderConfig::ContentType content_type)
-    : send_side_bwe_with_overhead_(
-          webrtc::field_trial::IsEnabled("WebRTC-SendSideBwe-WithOverhead")),
-      stats_proxy_(stats_proxy),
-      config_(config),
-      suspended_ssrcs_(std::move(suspended_ssrcs)),
-      module_process_thread_(nullptr),
-      worker_queue_(worker_queue),
-      check_encoder_activity_task_(nullptr),
-      call_stats_(call_stats),
-      transport_(transport),
-      bitrate_allocator_(bitrate_allocator),
-      flexfec_sender_(MaybeCreateFlexfecSender(*config_, suspended_ssrcs_)),
-      max_padding_bitrate_(0),
-      encoder_min_bitrate_bps_(0),
-      encoder_max_bitrate_bps_(initial_encoder_max_bitrate),
-      encoder_target_rate_bps_(0),
-      video_stream_encoder_(video_stream_encoder),
-      encoder_feedback_(Clock::GetRealTimeClock(),
-                        config_->rtp.ssrcs,
-                        video_stream_encoder),
-      protection_bitrate_calculator_(Clock::GetRealTimeClock(), this),
-      bandwidth_observer_(transport->send_side_cc()
-                              ->GetBitrateController()
-                              ->CreateRtcpBandwidthObserver()),
-      rtp_rtcp_modules_(CreateRtpRtcpModules(
-          config_->send_transport,
-          &encoder_feedback_,
-          bandwidth_observer_.get(),
-          transport,
-          call_stats_->rtcp_rtt_stats(),
-          flexfec_sender_.get(),
-          stats_proxy_,
-          send_delay_stats,
-          event_log,
-          transport->send_side_cc()->GetRetransmissionRateLimiter(),
-          this,
-          config_->rtp.ssrcs.size(),
-          transport->keepalive_config())),
-      payload_router_(rtp_rtcp_modules_,
-                      config_->encoder_settings.payload_type),
-      weak_ptr_factory_(this),
-      overhead_bytes_per_packet_(0),
-      transport_overhead_bytes_per_packet_(0) {
-  RTC_DCHECK_RUN_ON(worker_queue_);
-  LOG(LS_INFO) << "VideoSendStreamInternal: " << config_->ToString();
-  weak_ptr_ = weak_ptr_factory_.GetWeakPtr();
-  module_process_thread_checker_.DetachFromThread();
-
-  RTC_DCHECK(!config_->rtp.ssrcs.empty());
-  RTC_DCHECK(call_stats_);
-  RTC_DCHECK(transport_);
-  RTC_DCHECK(transport_->send_side_cc());
-  RTC_CHECK(field_trial::FindFullName(
-                AlrDetector::kStrictPacingAndProbingExperimentName)
-                .empty() ||
-            field_trial::FindFullName(
-                AlrDetector::kScreenshareProbingBweExperimentName)
-                .empty());
-  rtc::Optional<AlrDetector::AlrExperimentSettings> alr_settings;
-  if (content_type == VideoEncoderConfig::ContentType::kScreen) {
-    alr_settings = AlrDetector::ParseAlrSettingsFromFieldTrial(
-        AlrDetector::kScreenshareProbingBweExperimentName);
-  } else {
-    alr_settings = AlrDetector::ParseAlrSettingsFromFieldTrial(
-        AlrDetector::kStrictPacingAndProbingExperimentName);
-  }
-  if (alr_settings) {
-    transport->send_side_cc()->EnablePeriodicAlrProbing(true);
-    transport->pacer()->SetPacingFactor(alr_settings->pacing_factor);
-    transport->pacer()->SetQueueTimeLimit(alr_settings->max_paced_queue_time);
-  }
-
-  if (config_->periodic_alr_bandwidth_probing) {
-    transport->send_side_cc()->EnablePeriodicAlrProbing(true);
-  }
-
-  // RTP/RTCP initialization.
-
-  // We add the highest spatial layer first to ensure it'll be prioritized
-  // when sending padding, with the hope that the packet rate will be smaller,
-  // and that it's more important to protect than the lower layers.
-  for (RtpRtcp* rtp_rtcp : rtp_rtcp_modules_) {
-    constexpr bool remb_candidate = true;
-    transport->packet_router()->AddSendRtpModule(rtp_rtcp, remb_candidate);
-  }
-
-  for (size_t i = 0; i < config_->rtp.extensions.size(); ++i) {
-    const std::string& extension = config_->rtp.extensions[i].uri;
-    int id = config_->rtp.extensions[i].id;
-    // One-byte-extension local identifiers are in the range 1-14 inclusive.
-    RTC_DCHECK_GE(id, 1);
-    RTC_DCHECK_LE(id, 14);
-    RTC_DCHECK(RtpExtension::IsSupportedForVideo(extension));
-    for (RtpRtcp* rtp_rtcp : rtp_rtcp_modules_) {
-      RTC_CHECK_EQ(0, rtp_rtcp->RegisterSendRtpHeaderExtension(
-                          StringToRtpExtensionType(extension), id));
-    }
-  }
-
-  ConfigureProtection();
-  ConfigureSsrcs();
-
-  // TODO(pbos): Should we set CNAME on all RTP modules?
-  rtp_rtcp_modules_.front()->SetCNAME(config_->rtp.c_name.c_str());
-
-  for (RtpRtcp* rtp_rtcp : rtp_rtcp_modules_) {
-    rtp_rtcp->RegisterRtcpStatisticsCallback(stats_proxy_);
-    rtp_rtcp->RegisterSendChannelRtpStatisticsCallback(stats_proxy_);
-    rtp_rtcp->SetMaxRtpPacketSize(config_->rtp.max_packet_size);
-    rtp_rtcp->RegisterVideoSendPayload(
-        config_->encoder_settings.payload_type,
-        config_->encoder_settings.payload_name.c_str());
-  }
-
-  RTC_DCHECK(config_->encoder_settings.encoder);
-  RTC_DCHECK_GE(config_->encoder_settings.payload_type, 0);
-  RTC_DCHECK_LE(config_->encoder_settings.payload_type, 127);
-
-  video_stream_encoder_->SetStartBitrate(
-      bitrate_allocator_->GetStartBitrate(this));
-
-  // Only request rotation at the source when we positively know that the remote
-  // side doesn't support the rotation extension. This allows us to prepare the
-  // encoder in the expectation that rotation is supported - which is the common
-  // case.
-  bool rotation_applied =
-      std::find_if(config_->rtp.extensions.begin(),
-                   config_->rtp.extensions.end(),
-                   [](const RtpExtension& extension) {
-                     return extension.uri == RtpExtension::kVideoRotationUri;
-                   }) == config_->rtp.extensions.end();
-
-  video_stream_encoder_->SetSink(this, rotation_applied);
-}
-
-void VideoSendStreamImpl::RegisterProcessThread(
-    ProcessThread* module_process_thread) {
-  RTC_DCHECK_RUN_ON(&module_process_thread_checker_);
-  RTC_DCHECK(!module_process_thread_);
-  module_process_thread_ = module_process_thread;
-
-  for (RtpRtcp* rtp_rtcp : rtp_rtcp_modules_)
-    module_process_thread_->RegisterModule(rtp_rtcp, RTC_FROM_HERE);
-}
-
-void VideoSendStreamImpl::DeRegisterProcessThread() {
-  RTC_DCHECK_RUN_ON(&module_process_thread_checker_);
-  for (RtpRtcp* rtp_rtcp : rtp_rtcp_modules_)
-    module_process_thread_->DeRegisterModule(rtp_rtcp);
-}
-
-VideoSendStreamImpl::~VideoSendStreamImpl() {
-  RTC_DCHECK_RUN_ON(worker_queue_);
-  RTC_DCHECK(!payload_router_.IsActive())
-      << "VideoSendStreamImpl::Stop not called";
-  LOG(LS_INFO) << "~VideoSendStreamInternal: " << config_->ToString();
-
-  for (RtpRtcp* rtp_rtcp : rtp_rtcp_modules_) {
-    transport_->packet_router()->RemoveSendRtpModule(rtp_rtcp);
-    delete rtp_rtcp;
-  }
-}
-
-bool VideoSendStreamImpl::DeliverRtcp(const uint8_t* packet, size_t length) {
-  // Runs on a network thread.
-  RTC_DCHECK(!worker_queue_->IsCurrent());
-  for (RtpRtcp* rtp_rtcp : rtp_rtcp_modules_)
-    rtp_rtcp->IncomingRtcpPacket(packet, length);
-  return true;
-}
-
-void VideoSendStreamImpl::Start() {
-  RTC_DCHECK_RUN_ON(worker_queue_);
-  LOG(LS_INFO) << "VideoSendStream::Start";
-  if (payload_router_.IsActive())
-    return;
-  TRACE_EVENT_INSTANT0("webrtc", "VideoSendStream::Start");
-  payload_router_.SetActive(true);
-
-  bitrate_allocator_->AddObserver(
-      this, encoder_min_bitrate_bps_, encoder_max_bitrate_bps_,
-      max_padding_bitrate_, !config_->suspend_below_min_bitrate);
-
-  // Start monitoring encoder activity.
-  {
-    rtc::CritScope lock(&encoder_activity_crit_sect_);
-    RTC_DCHECK(!check_encoder_activity_task_);
-    check_encoder_activity_task_ = new CheckEncoderActivityTask(weak_ptr_);
-    worker_queue_->PostDelayedTask(
-        std::unique_ptr<rtc::QueuedTask>(check_encoder_activity_task_),
-        CheckEncoderActivityTask::kEncoderTimeOutMs);
-  }
-
-  video_stream_encoder_->SendKeyFrame();
-}
-
-void VideoSendStreamImpl::Stop() {
-  RTC_DCHECK_RUN_ON(worker_queue_);
-  LOG(LS_INFO) << "VideoSendStream::Stop";
-  if (!payload_router_.IsActive())
-    return;
-  TRACE_EVENT_INSTANT0("webrtc", "VideoSendStream::Stop");
-  payload_router_.SetActive(false);
-  bitrate_allocator_->RemoveObserver(this);
-  {
-    rtc::CritScope lock(&encoder_activity_crit_sect_);
-    check_encoder_activity_task_->Stop();
-    check_encoder_activity_task_ = nullptr;
-  }
-  video_stream_encoder_->OnBitrateUpdated(0, 0, 0);
-  stats_proxy_->OnSetEncoderTargetRate(0);
-}
-
-void VideoSendStreamImpl::SignalEncoderTimedOut() {
-  RTC_DCHECK_RUN_ON(worker_queue_);
-  // If the encoder has not produced anything the last kEncoderTimeOutMs and it
-  // is supposed to, deregister as BitrateAllocatorObserver. This can happen
-  // if a camera stops producing frames.
-  if (encoder_target_rate_bps_ > 0) {
-    LOG(LS_INFO) << "SignalEncoderTimedOut, Encoder timed out.";
-    bitrate_allocator_->RemoveObserver(this);
-  }
-}
-
-void VideoSendStreamImpl::OnBitrateAllocationUpdated(
-    const BitrateAllocation& allocation) {
-  payload_router_.OnBitrateAllocationUpdated(allocation);
-}
-
-void VideoSendStreamImpl::SignalEncoderActive() {
-  RTC_DCHECK_RUN_ON(worker_queue_);
-  LOG(LS_INFO) << "SignalEncoderActive, Encoder is active.";
-  bitrate_allocator_->AddObserver(
-      this, encoder_min_bitrate_bps_, encoder_max_bitrate_bps_,
-      max_padding_bitrate_, !config_->suspend_below_min_bitrate);
-}
-
-void VideoSendStreamImpl::OnEncoderConfigurationChanged(
-    std::vector<VideoStream> streams,
-    int min_transmit_bitrate_bps) {
-  if (!worker_queue_->IsCurrent()) {
-    worker_queue_->PostTask(
-        std::unique_ptr<rtc::QueuedTask>(new EncoderReconfiguredTask(
-            weak_ptr_, std::move(streams), min_transmit_bitrate_bps)));
-    return;
-  }
-  RTC_DCHECK_GE(config_->rtp.ssrcs.size(), streams.size());
-  TRACE_EVENT0("webrtc", "VideoSendStream::OnEncoderConfigurationChanged");
-  RTC_DCHECK_GE(config_->rtp.ssrcs.size(), streams.size());
-  RTC_DCHECK_RUN_ON(worker_queue_);
-
-  const int kEncoderMinBitrateBps = 30000;
-  encoder_min_bitrate_bps_ =
-      std::max(streams[0].min_bitrate_bps, kEncoderMinBitrateBps);
-  encoder_max_bitrate_bps_ = 0;
-  for (const auto& stream : streams)
-    encoder_max_bitrate_bps_ += stream.max_bitrate_bps;
-  max_padding_bitrate_ = CalculateMaxPadBitrateBps(
-      streams, min_transmit_bitrate_bps, config_->suspend_below_min_bitrate);
-
-  // Clear stats for disabled layers.
-  for (size_t i = streams.size(); i < config_->rtp.ssrcs.size(); ++i) {
-    stats_proxy_->OnInactiveSsrc(config_->rtp.ssrcs[i]);
-  }
-
-  size_t number_of_temporal_layers =
-      streams.back().temporal_layer_thresholds_bps.size() + 1;
-  protection_bitrate_calculator_.SetEncodingData(
-      streams[0].width, streams[0].height, number_of_temporal_layers,
-      config_->rtp.max_packet_size);
-
-  if (payload_router_.IsActive()) {
-    // The send stream is started already. Update the allocator with new bitrate
-    // limits.
-    bitrate_allocator_->AddObserver(
-        this, encoder_min_bitrate_bps_, encoder_max_bitrate_bps_,
-        max_padding_bitrate_, !config_->suspend_below_min_bitrate);
-  }
-}
-
-EncodedImageCallback::Result VideoSendStreamImpl::OnEncodedImage(
-    const EncodedImage& encoded_image,
-    const CodecSpecificInfo* codec_specific_info,
-    const RTPFragmentationHeader* fragmentation) {
-  // Encoded is called on whatever thread the real encoder implementation run
-  // on. In the case of hardware encoders, there might be several encoders
-  // running in parallel on different threads.
-  size_t simulcast_idx = 0;
-  if (codec_specific_info->codecType == kVideoCodecVP8) {
-    simulcast_idx = codec_specific_info->codecSpecific.VP8.simulcastIdx;
-  }
-  if (config_->post_encode_callback) {
-    config_->post_encode_callback->EncodedFrameCallback(EncodedFrame(
-        encoded_image._buffer, encoded_image._length, encoded_image._frameType,
-        simulcast_idx, encoded_image._timeStamp));
-  }
-  {
-    rtc::CritScope lock(&encoder_activity_crit_sect_);
-    if (check_encoder_activity_task_)
-      check_encoder_activity_task_->UpdateEncoderActivity();
-  }
-
-  protection_bitrate_calculator_.UpdateWithEncodedData(encoded_image);
-  EncodedImageCallback::Result result = payload_router_.OnEncodedImage(
-      encoded_image, codec_specific_info, fragmentation);
-
-  RTC_DCHECK(codec_specific_info);
-
-  int layer = codec_specific_info->codecType == kVideoCodecVP8
-                  ? codec_specific_info->codecSpecific.VP8.simulcastIdx
-                  : 0;
-  {
-    rtc::CritScope lock(&ivf_writers_crit_);
-    if (file_writers_[layer].get()) {
-      bool ok = file_writers_[layer]->WriteFrame(
-          encoded_image, codec_specific_info->codecType);
-      RTC_DCHECK(ok);
-    }
-  }
-
-  return result;
-}
-
-void VideoSendStreamImpl::ConfigureProtection() {
-  RTC_DCHECK_RUN_ON(worker_queue_);
-
-  // Consistency of FlexFEC parameters is checked in MaybeCreateFlexfecSender.
-  const bool flexfec_enabled = (flexfec_sender_ != nullptr);
-
-  // Consistency of NACK and RED+ULPFEC parameters is checked in this function.
-  const bool nack_enabled = config_->rtp.nack.rtp_history_ms > 0;
-  int red_payload_type = config_->rtp.ulpfec.red_payload_type;
-  int ulpfec_payload_type = config_->rtp.ulpfec.ulpfec_payload_type;
-
-  // Shorthands.
-  auto IsRedEnabled = [&]() { return red_payload_type >= 0; };
-  auto DisableRed = [&]() { red_payload_type = -1; };
-  auto IsUlpfecEnabled = [&]() { return ulpfec_payload_type >= 0; };
-  auto DisableUlpfec = [&]() { ulpfec_payload_type = -1; };
-
-  if (webrtc::field_trial::IsEnabled("WebRTC-DisableUlpFecExperiment")) {
-    LOG(LS_INFO) << "Experiment to disable sending ULPFEC is enabled.";
-    DisableUlpfec();
-  }
-
-  // If enabled, FlexFEC takes priority over RED+ULPFEC.
-  if (flexfec_enabled) {
-    // We can safely disable RED here, because if the remote supports FlexFEC,
-    // we know that it has a receiver without the RED/RTX workaround.
-    // See http://crbug.com/webrtc/6650 for more information.
-    if (IsRedEnabled()) {
-      LOG(LS_INFO) << "Both FlexFEC and RED are configured. Disabling RED.";
-      DisableRed();
-    }
-    if (IsUlpfecEnabled()) {
-      LOG(LS_INFO)
-          << "Both FlexFEC and ULPFEC are configured. Disabling ULPFEC.";
-      DisableUlpfec();
-    }
-  }
-
-  // Payload types without picture ID cannot determine that a stream is complete
-  // without retransmitting FEC, so using ULPFEC + NACK for H.264 (for instance)
-  // is a waste of bandwidth since FEC packets still have to be transmitted.
-  // Note that this is not the case with FlexFEC.
-  if (nack_enabled && IsUlpfecEnabled() &&
-      !PayloadTypeSupportsSkippingFecPackets(
-          config_->encoder_settings.payload_name)) {
-    LOG(LS_WARNING)
-        << "Transmitting payload type without picture ID using "
-           "NACK+ULPFEC is a waste of bandwidth since ULPFEC packets "
-           "also have to be retransmitted. Disabling ULPFEC.";
-    DisableUlpfec();
-  }
-
-  // Verify payload types.
-  //
-  // Due to how old receivers work, we need to always send RED if it has been
-  // negotiated. This is a remnant of an old RED/RTX workaround, see
-  // https://codereview.webrtc.org/2469093003.
-  // TODO(brandtr): This change went into M56, so we can remove it in ~M59.
-  // At that time, we can disable RED whenever ULPFEC is disabled, as there is
-  // no point in using RED without ULPFEC.
-  if (IsRedEnabled()) {
-    RTC_DCHECK_GE(red_payload_type, 0);
-    RTC_DCHECK_LE(red_payload_type, 127);
-  }
-  if (IsUlpfecEnabled()) {
-    RTC_DCHECK_GE(ulpfec_payload_type, 0);
-    RTC_DCHECK_LE(ulpfec_payload_type, 127);
-    if (!IsRedEnabled()) {
-      LOG(LS_WARNING)
-          << "ULPFEC is enabled but RED is disabled. Disabling ULPFEC.";
-      DisableUlpfec();
-    }
-  }
-
-  for (RtpRtcp* rtp_rtcp : rtp_rtcp_modules_) {
-    // Set NACK.
-    rtp_rtcp->SetStorePacketsStatus(
-        true,
-        kMinSendSidePacketHistorySize);
-    // Set RED/ULPFEC information.
-    rtp_rtcp->SetUlpfecConfig(red_payload_type, ulpfec_payload_type);
-  }
-
-  // Currently, both ULPFEC and FlexFEC use the same FEC rate calculation logic,
-  // so enable that logic if either of those FEC schemes are enabled.
-  protection_bitrate_calculator_.SetProtectionMethod(
-      flexfec_enabled || IsUlpfecEnabled(), nack_enabled);
-}
-
-void VideoSendStreamImpl::ConfigureSsrcs() {
-  RTC_DCHECK_RUN_ON(worker_queue_);
-  // Configure regular SSRCs.
-  for (size_t i = 0; i < config_->rtp.ssrcs.size(); ++i) {
-    uint32_t ssrc = config_->rtp.ssrcs[i];
-    RtpRtcp* const rtp_rtcp = rtp_rtcp_modules_[i];
-    rtp_rtcp->SetSSRC(ssrc);
-
-    // Restore RTP state if previous existed.
-    VideoSendStream::RtpStateMap::iterator it = suspended_ssrcs_.find(ssrc);
-    if (it != suspended_ssrcs_.end())
-      rtp_rtcp->SetRtpState(it->second);
-  }
-
-  // Set up RTX if available.
-  if (config_->rtp.rtx.ssrcs.empty())
-    return;
-
-  // Configure RTX SSRCs.
-  RTC_DCHECK_EQ(config_->rtp.rtx.ssrcs.size(), config_->rtp.ssrcs.size());
-  for (size_t i = 0; i < config_->rtp.rtx.ssrcs.size(); ++i) {
-    uint32_t ssrc = config_->rtp.rtx.ssrcs[i];
-    RtpRtcp* const rtp_rtcp = rtp_rtcp_modules_[i];
-    rtp_rtcp->SetRtxSsrc(ssrc);
-    VideoSendStream::RtpStateMap::iterator it = suspended_ssrcs_.find(ssrc);
-    if (it != suspended_ssrcs_.end())
-      rtp_rtcp->SetRtxState(it->second);
-  }
-
-  // Configure RTX payload types.
-  RTC_DCHECK_GE(config_->rtp.rtx.payload_type, 0);
-  for (RtpRtcp* rtp_rtcp : rtp_rtcp_modules_) {
-    rtp_rtcp->SetRtxSendPayloadType(config_->rtp.rtx.payload_type,
-                                    config_->encoder_settings.payload_type);
-    rtp_rtcp->SetRtxSendStatus(kRtxRetransmitted | kRtxRedundantPayloads);
-  }
-  if (config_->rtp.ulpfec.red_payload_type != -1 &&
-      config_->rtp.ulpfec.red_rtx_payload_type != -1) {
-    for (RtpRtcp* rtp_rtcp : rtp_rtcp_modules_) {
-      rtp_rtcp->SetRtxSendPayloadType(config_->rtp.ulpfec.red_rtx_payload_type,
-                                      config_->rtp.ulpfec.red_payload_type);
-    }
-  }
-}
-
-std::map<uint32_t, RtpState> VideoSendStreamImpl::GetRtpStates() const {
-  RTC_DCHECK_RUN_ON(worker_queue_);
-  std::map<uint32_t, RtpState> rtp_states;
-
-  for (size_t i = 0; i < config_->rtp.ssrcs.size(); ++i) {
-    uint32_t ssrc = config_->rtp.ssrcs[i];
-    RTC_DCHECK_EQ(ssrc, rtp_rtcp_modules_[i]->SSRC());
-    rtp_states[ssrc] = rtp_rtcp_modules_[i]->GetRtpState();
-  }
-
-  for (size_t i = 0; i < config_->rtp.rtx.ssrcs.size(); ++i) {
-    uint32_t ssrc = config_->rtp.rtx.ssrcs[i];
-    rtp_states[ssrc] = rtp_rtcp_modules_[i]->GetRtxState();
-  }
-
-  if (flexfec_sender_) {
-    uint32_t ssrc = config_->rtp.flexfec.ssrc;
-    rtp_states[ssrc] = flexfec_sender_->GetRtpState();
-  }
-
-  return rtp_states;
-}
-
-void VideoSendStreamImpl::SignalNetworkState(NetworkState state) {
-  RTC_DCHECK_RUN_ON(worker_queue_);
-  for (RtpRtcp* rtp_rtcp : rtp_rtcp_modules_) {
-    rtp_rtcp->SetRTCPStatus(state == kNetworkUp ? config_->rtp.rtcp_mode
-                                                : RtcpMode::kOff);
-  }
-}
-
-uint32_t VideoSendStreamImpl::OnBitrateUpdated(uint32_t bitrate_bps,
-                                               uint8_t fraction_loss,
-                                               int64_t rtt,
-                                               int64_t probing_interval_ms) {
-  RTC_DCHECK_RUN_ON(worker_queue_);
-  RTC_DCHECK(payload_router_.IsActive())
-      << "VideoSendStream::Start has not been called.";
-
-  // Substract overhead from bitrate.
-  rtc::CritScope lock(&overhead_bytes_per_packet_crit_);
-  uint32_t payload_bitrate_bps = bitrate_bps;
-  if (send_side_bwe_with_overhead_) {
-    payload_bitrate_bps -= CalculateOverheadRateBps(
-        CalculatePacketRate(bitrate_bps,
-                            config_->rtp.max_packet_size +
-                                transport_overhead_bytes_per_packet_),
-        overhead_bytes_per_packet_ + transport_overhead_bytes_per_packet_,
-        bitrate_bps);
-  }
-
-  // Get the encoder target rate. It is the estimated network rate -
-  // protection overhead.
-  encoder_target_rate_bps_ = protection_bitrate_calculator_.SetTargetRates(
-      payload_bitrate_bps, stats_proxy_->GetSendFrameRate(), fraction_loss,
-      rtt);
-
-  uint32_t encoder_overhead_rate_bps =
-      send_side_bwe_with_overhead_
-          ? CalculateOverheadRateBps(
-                CalculatePacketRate(encoder_target_rate_bps_,
-                                    config_->rtp.max_packet_size +
-                                        transport_overhead_bytes_per_packet_ -
-                                        overhead_bytes_per_packet_),
-                overhead_bytes_per_packet_ +
-                    transport_overhead_bytes_per_packet_,
-                bitrate_bps - encoder_target_rate_bps_)
-          : 0;
-
-  // When the field trial "WebRTC-SendSideBwe-WithOverhead" is enabled
-  // protection_bitrate includes overhead.
-  uint32_t protection_bitrate =
-      bitrate_bps - (encoder_target_rate_bps_ + encoder_overhead_rate_bps);
-
-  encoder_target_rate_bps_ =
-      std::min(encoder_max_bitrate_bps_, encoder_target_rate_bps_);
-  video_stream_encoder_->OnBitrateUpdated(encoder_target_rate_bps_,
-                                          fraction_loss, rtt);
-  stats_proxy_->OnSetEncoderTargetRate(encoder_target_rate_bps_);
-  return protection_bitrate;
-}
-
-void VideoSendStreamImpl::EnableEncodedFrameRecording(
-    const std::vector<rtc::PlatformFile>& files,
-    size_t byte_limit) {
-  {
-    rtc::CritScope lock(&ivf_writers_crit_);
-    for (unsigned int i = 0; i < kMaxSimulcastStreams; ++i) {
-      if (i < files.size()) {
-        file_writers_[i] = IvfFileWriter::Wrap(rtc::File(files[i]), byte_limit);
-      } else {
-        file_writers_[i].reset();
-      }
-    }
-  }
-
-  if (!files.empty()) {
-    // Make a keyframe appear as early as possible in the logs, to give actually
-    // decodable output.
-    video_stream_encoder_->SendKeyFrame();
-  }
-}
-
-int VideoSendStreamImpl::ProtectionRequest(
-    const FecProtectionParams* delta_params,
-    const FecProtectionParams* key_params,
-    uint32_t* sent_video_rate_bps,
-    uint32_t* sent_nack_rate_bps,
-    uint32_t* sent_fec_rate_bps) {
-  RTC_DCHECK_RUN_ON(worker_queue_);
-  *sent_video_rate_bps = 0;
-  *sent_nack_rate_bps = 0;
-  *sent_fec_rate_bps = 0;
-  for (RtpRtcp* rtp_rtcp : rtp_rtcp_modules_) {
-    uint32_t not_used = 0;
-    uint32_t module_video_rate = 0;
-    uint32_t module_fec_rate = 0;
-    uint32_t module_nack_rate = 0;
-    rtp_rtcp->SetFecParameters(*delta_params, *key_params);
-    rtp_rtcp->BitrateSent(&not_used, &module_video_rate, &module_fec_rate,
-                          &module_nack_rate);
-    *sent_video_rate_bps += module_video_rate;
-    *sent_nack_rate_bps += module_nack_rate;
-    *sent_fec_rate_bps += module_fec_rate;
-  }
-  return 0;
-}
-
-void VideoSendStreamImpl::OnOverheadChanged(size_t overhead_bytes_per_packet) {
-  rtc::CritScope lock(&overhead_bytes_per_packet_crit_);
-  overhead_bytes_per_packet_ = overhead_bytes_per_packet;
-}
-
-void VideoSendStreamImpl::SetTransportOverhead(
-    size_t transport_overhead_bytes_per_packet) {
-  if (transport_overhead_bytes_per_packet >= static_cast<int>(kPathMTU)) {
-    LOG(LS_ERROR) << "Transport overhead exceeds size of ethernet frame";
-    return;
-  }
-
-  transport_overhead_bytes_per_packet_ = transport_overhead_bytes_per_packet;
-
-  transport_->send_side_cc()->SetTransportOverhead(
-      transport_overhead_bytes_per_packet_);
-
-  size_t rtp_packet_size =
-      std::min(config_->rtp.max_packet_size,
-               kPathMTU - transport_overhead_bytes_per_packet_);
-
-  for (RtpRtcp* rtp_rtcp : rtp_rtcp_modules_) {
-    rtp_rtcp->SetMaxRtpPacketSize(rtp_packet_size);
-  }
-}
-
-}  // namespace internal
-}  // namespace webrtc
diff --git a/video/video_send_stream.h b/video/video_send_stream.h
deleted file mode 100644
index 06fbb36..0000000
--- a/video/video_send_stream.h
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- *  Copyright (c) 2013 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_VIDEO_VIDEO_SEND_STREAM_H_
-#define WEBRTC_VIDEO_VIDEO_SEND_STREAM_H_
-
-#include <map>
-#include <memory>
-#include <vector>
-
-#include "webrtc/call/bitrate_allocator.h"
-#include "webrtc/call/video_receive_stream.h"
-#include "webrtc/call/video_send_stream.h"
-#include "webrtc/common_video/libyuv/include/webrtc_libyuv.h"
-#include "webrtc/modules/video_coding/protection_bitrate_calculator.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/event.h"
-#include "webrtc/rtc_base/task_queue.h"
-#include "webrtc/video/encoder_rtcp_feedback.h"
-#include "webrtc/video/send_delay_stats.h"
-#include "webrtc/video/send_statistics_proxy.h"
-#include "webrtc/video/video_stream_encoder.h"
-
-namespace webrtc {
-
-class CallStats;
-class SendSideCongestionController;
-class IvfFileWriter;
-class ProcessThread;
-class RtpRtcp;
-class RtpTransportControllerSendInterface;
-class RtcEventLog;
-
-namespace internal {
-
-class VideoSendStreamImpl;
-
-// VideoSendStream implements webrtc::VideoSendStream.
-// Internally, it delegates all public methods to VideoSendStreamImpl and / or
-// VideoStreamEncoder. VideoSendStreamInternal is created and deleted on
-// |worker_queue|.
-class VideoSendStream : public webrtc::VideoSendStream {
- public:
-  VideoSendStream(int num_cpu_cores,
-                  ProcessThread* module_process_thread,
-                  rtc::TaskQueue* worker_queue,
-                  CallStats* call_stats,
-                  RtpTransportControllerSendInterface* transport,
-                  BitrateAllocator* bitrate_allocator,
-                  SendDelayStats* send_delay_stats,
-                  RtcEventLog* event_log,
-                  VideoSendStream::Config config,
-                  VideoEncoderConfig encoder_config,
-                  const std::map<uint32_t, RtpState>& suspended_ssrcs);
-
-  ~VideoSendStream() override;
-
-  void SignalNetworkState(NetworkState state);
-  bool DeliverRtcp(const uint8_t* packet, size_t length);
-
-  // webrtc::VideoSendStream implementation.
-  void Start() override;
-  void Stop() override;
-
-  void SetSource(rtc::VideoSourceInterface<webrtc::VideoFrame>* source,
-                 const DegradationPreference& degradation_preference) override;
-
-  void ReconfigureVideoEncoder(VideoEncoderConfig) override;
-  Stats GetStats() override;
-
-  typedef std::map<uint32_t, RtpState> RtpStateMap;
-
-  // Takes ownership of each file, is responsible for closing them later.
-  // Calling this method will close and finalize any current logs.
-  // Giving rtc::kInvalidPlatformFileValue in any position disables logging
-  // for the corresponding stream.
-  // If a frame to be written would make the log too large the write fails and
-  // the log is closed and finalized. A |byte_limit| of 0 means no limit.
-  void EnableEncodedFrameRecording(const std::vector<rtc::PlatformFile>& files,
-                                   size_t byte_limit) override;
-
-  RtpStateMap StopPermanentlyAndGetRtpStates();
-
-  void SetTransportOverhead(size_t transport_overhead_per_packet);
-
- private:
-  class ConstructionTask;
-  class DestructAndGetRtpStateTask;
-
-  rtc::ThreadChecker thread_checker_;
-  rtc::TaskQueue* const worker_queue_;
-  rtc::Event thread_sync_event_;
-
-  SendStatisticsProxy stats_proxy_;
-  const VideoSendStream::Config config_;
-  const VideoEncoderConfig::ContentType content_type_;
-  std::unique_ptr<VideoSendStreamImpl> send_stream_;
-  std::unique_ptr<VideoStreamEncoder> video_stream_encoder_;
-};
-
-}  // namespace internal
-}  // namespace webrtc
-
-#endif  // WEBRTC_VIDEO_VIDEO_SEND_STREAM_H_
diff --git a/video/video_send_stream_tests.cc b/video/video_send_stream_tests.cc
deleted file mode 100644
index 422b983..0000000
--- a/video/video_send_stream_tests.cc
+++ /dev/null
@@ -1,3513 +0,0 @@
-/*
- *  Copyright (c) 2013 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 <algorithm>  // max
-#include <memory>
-#include <vector>
-
-#include "webrtc/call/call.h"
-#include "webrtc/call/rtp_transport_controller_send.h"
-#include "webrtc/common_video/include/frame_callback.h"
-#include "webrtc/common_video/include/video_frame.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_header_parser.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_sender.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_format_vp9.h"
-#include "webrtc/modules/video_coding/codecs/vp8/include/vp8.h"
-#include "webrtc/modules/video_coding/codecs/vp9/include/vp9.h"
-#include "webrtc/rtc_base/bind.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/event.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/platform_thread.h"
-#include "webrtc/rtc_base/rate_limiter.h"
-#include "webrtc/rtc_base/timeutils.h"
-#include "webrtc/system_wrappers/include/sleep.h"
-#include "webrtc/test/call_test.h"
-#include "webrtc/test/configurable_frame_size_encoder.h"
-#include "webrtc/test/fake_texture_frame.h"
-#include "webrtc/test/field_trial.h"
-#include "webrtc/test/frame_generator.h"
-#include "webrtc/test/frame_generator_capturer.h"
-#include "webrtc/test/frame_utils.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/null_transport.h"
-#include "webrtc/test/rtcp_packet_parser.h"
-#include "webrtc/test/testsupport/perf_test.h"
-
-#include "webrtc/video/send_statistics_proxy.h"
-#include "webrtc/video/transport_adapter.h"
-#include "webrtc/call/video_send_stream.h"
-
-namespace webrtc {
-
-enum VideoFormat { kGeneric, kVP8, };
-
-void ExpectEqualFramesVector(const std::vector<VideoFrame>& frames1,
-                             const std::vector<VideoFrame>& frames2);
-VideoFrame CreateVideoFrame(int width, int height, uint8_t data);
-
-class VideoSendStreamTest : public test::CallTest {
- protected:
-  void TestNackRetransmission(uint32_t retransmit_ssrc,
-                              uint8_t retransmit_payload_type);
-  void TestPacketFragmentationSize(VideoFormat format, bool with_fec);
-
-  void TestVp9NonFlexMode(uint8_t num_temporal_layers,
-                          uint8_t num_spatial_layers);
-
-  void TestRequestSourceRotateVideo(bool support_orientation_ext);
-};
-
-TEST_F(VideoSendStreamTest, CanStartStartedStream) {
-  task_queue_.SendTask([this]() {
-    CreateSenderCall(Call::Config(event_log_.get()));
-
-    test::NullTransport transport;
-    CreateSendConfig(1, 0, 0, &transport);
-    CreateVideoStreams();
-    video_send_stream_->Start();
-    video_send_stream_->Start();
-    DestroyStreams();
-    DestroyCalls();
-  });
-}
-
-TEST_F(VideoSendStreamTest, CanStopStoppedStream) {
-  task_queue_.SendTask([this]() {
-    CreateSenderCall(Call::Config(event_log_.get()));
-
-    test::NullTransport transport;
-    CreateSendConfig(1, 0, 0, &transport);
-    CreateVideoStreams();
-    video_send_stream_->Stop();
-    video_send_stream_->Stop();
-    DestroyStreams();
-    DestroyCalls();
-  });
-}
-
-TEST_F(VideoSendStreamTest, SupportsCName) {
-  static std::string kCName = "PjQatC14dGfbVwGPUOA9IH7RlsFDbWl4AhXEiDsBizo=";
-  class CNameObserver : public test::SendTest {
-   public:
-    CNameObserver() : SendTest(kDefaultTimeoutMs) {}
-
-   private:
-    Action OnSendRtcp(const uint8_t* packet, size_t length) override {
-      test::RtcpPacketParser parser;
-      EXPECT_TRUE(parser.Parse(packet, length));
-      if (parser.sdes()->num_packets() > 0) {
-        EXPECT_EQ(1u, parser.sdes()->chunks().size());
-        EXPECT_EQ(kCName, parser.sdes()->chunks()[0].cname);
-
-        observation_complete_.Set();
-      }
-
-      return SEND_PACKET;
-    }
-
-    void ModifyVideoConfigs(
-        VideoSendStream::Config* send_config,
-        std::vector<VideoReceiveStream::Config>* receive_configs,
-        VideoEncoderConfig* encoder_config) override {
-      send_config->rtp.c_name = kCName;
-    }
-
-    void PerformTest() override {
-      EXPECT_TRUE(Wait()) << "Timed out while waiting for RTCP with CNAME.";
-    }
-  } test;
-
-  RunBaseTest(&test);
-}
-
-TEST_F(VideoSendStreamTest, SupportsAbsoluteSendTime) {
-  class AbsoluteSendTimeObserver : public test::SendTest {
-   public:
-    AbsoluteSendTimeObserver() : SendTest(kDefaultTimeoutMs) {
-      EXPECT_TRUE(parser_->RegisterRtpHeaderExtension(
-          kRtpExtensionAbsoluteSendTime, test::kAbsSendTimeExtensionId));
-    }
-
-    Action OnSendRtp(const uint8_t* packet, size_t length) override {
-      RTPHeader header;
-      EXPECT_TRUE(parser_->Parse(packet, length, &header));
-
-      EXPECT_FALSE(header.extension.hasTransmissionTimeOffset);
-      EXPECT_TRUE(header.extension.hasAbsoluteSendTime);
-      EXPECT_EQ(header.extension.transmissionTimeOffset, 0);
-      if (header.extension.absoluteSendTime != 0) {
-        // Wait for at least one packet with a non-zero send time. The send time
-        // is a 16-bit value derived from the system clock, and it is valid
-        // for a packet to have a zero send time. To tell that from an
-        // unpopulated value we'll wait for a packet with non-zero send time.
-        observation_complete_.Set();
-      } else {
-        LOG(LS_WARNING) << "Got a packet with zero absoluteSendTime, waiting"
-                           " for another packet...";
-      }
-
-      return SEND_PACKET;
-    }
-
-    void ModifyVideoConfigs(
-        VideoSendStream::Config* send_config,
-        std::vector<VideoReceiveStream::Config>* receive_configs,
-        VideoEncoderConfig* encoder_config) override {
-      send_config->rtp.extensions.clear();
-      send_config->rtp.extensions.push_back(RtpExtension(
-          RtpExtension::kAbsSendTimeUri, test::kAbsSendTimeExtensionId));
-    }
-
-    void PerformTest() override {
-      EXPECT_TRUE(Wait()) << "Timed out while waiting for single RTP packet.";
-    }
-  } test;
-
-  RunBaseTest(&test);
-}
-
-TEST_F(VideoSendStreamTest, SupportsTransmissionTimeOffset) {
-  static const int kEncodeDelayMs = 5;
-  class TransmissionTimeOffsetObserver : public test::SendTest {
-   public:
-    TransmissionTimeOffsetObserver()
-        : SendTest(kDefaultTimeoutMs),
-          encoder_(Clock::GetRealTimeClock(), kEncodeDelayMs) {
-      EXPECT_TRUE(parser_->RegisterRtpHeaderExtension(
-          kRtpExtensionTransmissionTimeOffset, test::kTOffsetExtensionId));
-    }
-
-   private:
-    Action OnSendRtp(const uint8_t* packet, size_t length) override {
-      RTPHeader header;
-      EXPECT_TRUE(parser_->Parse(packet, length, &header));
-
-      EXPECT_TRUE(header.extension.hasTransmissionTimeOffset);
-      EXPECT_FALSE(header.extension.hasAbsoluteSendTime);
-      EXPECT_GT(header.extension.transmissionTimeOffset, 0);
-      EXPECT_EQ(header.extension.absoluteSendTime, 0u);
-      observation_complete_.Set();
-
-      return SEND_PACKET;
-    }
-
-    void ModifyVideoConfigs(
-        VideoSendStream::Config* send_config,
-        std::vector<VideoReceiveStream::Config>* receive_configs,
-        VideoEncoderConfig* encoder_config) override {
-      send_config->encoder_settings.encoder = &encoder_;
-      send_config->rtp.extensions.clear();
-      send_config->rtp.extensions.push_back(RtpExtension(
-          RtpExtension::kTimestampOffsetUri, test::kTOffsetExtensionId));
-    }
-
-    void PerformTest() override {
-      EXPECT_TRUE(Wait()) << "Timed out while waiting for a single RTP packet.";
-    }
-
-    test::DelayedEncoder encoder_;
-  } test;
-
-  RunBaseTest(&test);
-}
-
-TEST_F(VideoSendStreamTest, SupportsTransportWideSequenceNumbers) {
-  static const uint8_t kExtensionId = test::kTransportSequenceNumberExtensionId;
-  class TransportWideSequenceNumberObserver : public test::SendTest {
-   public:
-    TransportWideSequenceNumberObserver()
-        : SendTest(kDefaultTimeoutMs), encoder_(Clock::GetRealTimeClock()) {
-      EXPECT_TRUE(parser_->RegisterRtpHeaderExtension(
-          kRtpExtensionTransportSequenceNumber, kExtensionId));
-    }
-
-   private:
-    Action OnSendRtp(const uint8_t* packet, size_t length) override {
-      RTPHeader header;
-      EXPECT_TRUE(parser_->Parse(packet, length, &header));
-
-      EXPECT_TRUE(header.extension.hasTransportSequenceNumber);
-      EXPECT_FALSE(header.extension.hasTransmissionTimeOffset);
-      EXPECT_FALSE(header.extension.hasAbsoluteSendTime);
-
-      observation_complete_.Set();
-
-      return SEND_PACKET;
-    }
-
-    void ModifyVideoConfigs(
-        VideoSendStream::Config* send_config,
-        std::vector<VideoReceiveStream::Config>* receive_configs,
-        VideoEncoderConfig* encoder_config) override {
-      send_config->encoder_settings.encoder = &encoder_;
-    }
-
-    void PerformTest() override {
-      EXPECT_TRUE(Wait()) << "Timed out while waiting for a single RTP packet.";
-    }
-
-    test::FakeEncoder encoder_;
-  } test;
-
-  RunBaseTest(&test);
-}
-
-TEST_F(VideoSendStreamTest, SupportsVideoRotation) {
-  class VideoRotationObserver : public test::SendTest {
-   public:
-    VideoRotationObserver() : SendTest(kDefaultTimeoutMs) {
-      EXPECT_TRUE(parser_->RegisterRtpHeaderExtension(
-          kRtpExtensionVideoRotation, test::kVideoRotationExtensionId));
-    }
-
-    Action OnSendRtp(const uint8_t* packet, size_t length) override {
-      RTPHeader header;
-      EXPECT_TRUE(parser_->Parse(packet, length, &header));
-      // Only the last packet of the frame is required to have the extension.
-      if (!header.markerBit)
-        return SEND_PACKET;
-      EXPECT_TRUE(header.extension.hasVideoRotation);
-      EXPECT_EQ(kVideoRotation_90, header.extension.videoRotation);
-      observation_complete_.Set();
-      return SEND_PACKET;
-    }
-
-    void ModifyVideoConfigs(
-        VideoSendStream::Config* send_config,
-        std::vector<VideoReceiveStream::Config>* receive_configs,
-        VideoEncoderConfig* encoder_config) override {
-      send_config->rtp.extensions.clear();
-      send_config->rtp.extensions.push_back(RtpExtension(
-          RtpExtension::kVideoRotationUri, test::kVideoRotationExtensionId));
-    }
-
-    void OnFrameGeneratorCapturerCreated(
-        test::FrameGeneratorCapturer* frame_generator_capturer) override {
-      frame_generator_capturer->SetFakeRotation(kVideoRotation_90);
-    }
-
-    void PerformTest() override {
-      EXPECT_TRUE(Wait()) << "Timed out while waiting for single RTP packet.";
-    }
-  } test;
-
-  RunBaseTest(&test);
-}
-
-TEST_F(VideoSendStreamTest, SupportsVideoContentType) {
-  class VideoContentTypeObserver : public test::SendTest {
-   public:
-    VideoContentTypeObserver() : SendTest(kDefaultTimeoutMs) {
-      EXPECT_TRUE(parser_->RegisterRtpHeaderExtension(
-          kRtpExtensionVideoContentType, test::kVideoContentTypeExtensionId));
-    }
-
-    Action OnSendRtp(const uint8_t* packet, size_t length) override {
-      RTPHeader header;
-      EXPECT_TRUE(parser_->Parse(packet, length, &header));
-      // Only the last packet of the frame must have extension.
-      if (!header.markerBit)
-        return SEND_PACKET;
-      EXPECT_TRUE(header.extension.hasVideoContentType);
-      EXPECT_TRUE(videocontenttypehelpers::IsScreenshare(
-          header.extension.videoContentType));
-      observation_complete_.Set();
-      return SEND_PACKET;
-    }
-
-    void ModifyVideoConfigs(
-        VideoSendStream::Config* send_config,
-        std::vector<VideoReceiveStream::Config>* receive_configs,
-        VideoEncoderConfig* encoder_config) override {
-      send_config->rtp.extensions.clear();
-      send_config->rtp.extensions.push_back(
-          RtpExtension(RtpExtension::kVideoContentTypeUri,
-                       test::kVideoContentTypeExtensionId));
-      encoder_config->content_type = VideoEncoderConfig::ContentType::kScreen;
-    }
-
-    void PerformTest() override {
-      EXPECT_TRUE(Wait()) << "Timed out while waiting for single RTP packet.";
-    }
-  } test;
-
-  RunBaseTest(&test);
-}
-
-TEST_F(VideoSendStreamTest, SupportsVideoTimingFrames) {
-  class VideoTimingObserver : public test::SendTest {
-   public:
-    VideoTimingObserver() : SendTest(kDefaultTimeoutMs) {
-      EXPECT_TRUE(parser_->RegisterRtpHeaderExtension(
-          kRtpExtensionVideoTiming, test::kVideoTimingExtensionId));
-    }
-
-    Action OnSendRtp(const uint8_t* packet, size_t length) override {
-      RTPHeader header;
-      EXPECT_TRUE(parser_->Parse(packet, length, &header));
-      // Only the last packet of the frame must have extension.
-      if (!header.markerBit)
-        return SEND_PACKET;
-      EXPECT_TRUE(header.extension.has_video_timing);
-      observation_complete_.Set();
-      return SEND_PACKET;
-    }
-
-    void ModifyVideoConfigs(
-        VideoSendStream::Config* send_config,
-        std::vector<VideoReceiveStream::Config>* receive_configs,
-        VideoEncoderConfig* encoder_config) override {
-      send_config->rtp.extensions.clear();
-      send_config->rtp.extensions.push_back(RtpExtension(
-          RtpExtension::kVideoTimingUri, test::kVideoTimingExtensionId));
-    }
-
-    void PerformTest() override {
-      EXPECT_TRUE(Wait()) << "Timed out while waiting for timing frames.";
-    }
-  } test;
-
-  RunBaseTest(&test);
-}
-
-class FakeReceiveStatistics : public ReceiveStatisticsProvider {
- public:
-  FakeReceiveStatistics(uint32_t send_ssrc,
-                        uint32_t last_sequence_number,
-                        uint32_t cumulative_lost,
-                        uint8_t fraction_lost) {
-    stat_.SetMediaSsrc(send_ssrc);
-    stat_.SetExtHighestSeqNum(last_sequence_number);
-    stat_.SetCumulativeLost(cumulative_lost);
-    stat_.SetFractionLost(fraction_lost);
-  }
-
-  std::vector<rtcp::ReportBlock> RtcpReportBlocks(size_t max_blocks) override {
-    EXPECT_GE(max_blocks, 1u);
-    return {stat_};
-  }
-
- private:
-  rtcp::ReportBlock stat_;
-};
-
-class UlpfecObserver : public test::EndToEndTest {
- public:
-  UlpfecObserver(bool header_extensions_enabled,
-                 bool use_nack,
-                 bool expect_red,
-                 bool expect_ulpfec,
-                 const std::string& codec,
-                 VideoEncoder* encoder)
-      : EndToEndTest(kTimeoutMs),
-        encoder_(encoder),
-        payload_name_(codec),
-        use_nack_(use_nack),
-        expect_red_(expect_red),
-        expect_ulpfec_(expect_ulpfec),
-        sent_media_(false),
-        sent_ulpfec_(false),
-        header_extensions_enabled_(header_extensions_enabled) {}
-
-  // Some of the test cases are expected to time out and thus we are using
-  // a shorter timeout window than the default here.
-  static constexpr size_t kTimeoutMs = 10000;
-
- private:
-  Action OnSendRtp(const uint8_t* packet, size_t length) override {
-    RTPHeader header;
-    EXPECT_TRUE(parser_->Parse(packet, length, &header));
-
-    int encapsulated_payload_type = -1;
-    if (header.payloadType == VideoSendStreamTest::kRedPayloadType) {
-      EXPECT_TRUE(expect_red_);
-      encapsulated_payload_type = static_cast<int>(packet[header.headerLength]);
-      if (encapsulated_payload_type !=
-          VideoSendStreamTest::kFakeVideoSendPayloadType) {
-        EXPECT_EQ(VideoSendStreamTest::kUlpfecPayloadType,
-                  encapsulated_payload_type);
-      }
-    } else {
-      EXPECT_EQ(VideoSendStreamTest::kFakeVideoSendPayloadType,
-                header.payloadType);
-      if (static_cast<size_t>(header.headerLength + header.paddingLength) <
-          length) {
-        // Not padding-only, media received outside of RED.
-        EXPECT_FALSE(expect_red_);
-        sent_media_ = true;
-      }
-    }
-
-    if (header_extensions_enabled_) {
-      EXPECT_TRUE(header.extension.hasAbsoluteSendTime);
-      uint32_t kHalf24BitsSpace = 0xFFFFFF / 2;
-      if (header.extension.absoluteSendTime <= kHalf24BitsSpace &&
-          prev_header_.extension.absoluteSendTime > kHalf24BitsSpace) {
-        // 24 bits wrap.
-        EXPECT_GT(prev_header_.extension.absoluteSendTime,
-                  header.extension.absoluteSendTime);
-      } else {
-        EXPECT_GE(header.extension.absoluteSendTime,
-                  prev_header_.extension.absoluteSendTime);
-      }
-      EXPECT_TRUE(header.extension.hasTransportSequenceNumber);
-      uint16_t seq_num_diff = header.extension.transportSequenceNumber -
-                              prev_header_.extension.transportSequenceNumber;
-      EXPECT_EQ(1, seq_num_diff);
-    }
-
-    if (encapsulated_payload_type != -1) {
-      if (encapsulated_payload_type ==
-          VideoSendStreamTest::kUlpfecPayloadType) {
-        EXPECT_TRUE(expect_ulpfec_);
-        sent_ulpfec_ = true;
-      } else {
-        sent_media_ = true;
-      }
-    }
-
-    if (sent_media_ && sent_ulpfec_) {
-      observation_complete_.Set();
-    }
-
-    prev_header_ = header;
-
-    return SEND_PACKET;
-  }
-
-  test::PacketTransport* CreateSendTransport(
-      test::SingleThreadedTaskQueueForTesting* task_queue,
-      Call* sender_call) override {
-    // At low RTT (< kLowRttNackMs) -> NACK only, no FEC.
-    // Configure some network delay.
-    const int kNetworkDelayMs = 100;
-    FakeNetworkPipe::Config config;
-    config.loss_percent = 5;
-    config.queue_delay_ms = kNetworkDelayMs;
-    return new test::PacketTransport(
-        task_queue, sender_call, this, test::PacketTransport::kSender,
-        VideoSendStreamTest::payload_type_map_, config);
-  }
-
-  void ModifyVideoConfigs(
-      VideoSendStream::Config* send_config,
-      std::vector<VideoReceiveStream::Config>* receive_configs,
-      VideoEncoderConfig* encoder_config) override {
-    if (use_nack_) {
-      send_config->rtp.nack.rtp_history_ms =
-          (*receive_configs)[0].rtp.nack.rtp_history_ms =
-              VideoSendStreamTest::kNackRtpHistoryMs;
-    }
-    send_config->encoder_settings.encoder = encoder_;
-    send_config->encoder_settings.payload_name = payload_name_;
-    send_config->rtp.ulpfec.red_payload_type =
-        VideoSendStreamTest::kRedPayloadType;
-    send_config->rtp.ulpfec.ulpfec_payload_type =
-        VideoSendStreamTest::kUlpfecPayloadType;
-    EXPECT_FALSE(send_config->rtp.extensions.empty());
-    if (!header_extensions_enabled_) {
-      send_config->rtp.extensions.clear();
-    } else {
-      send_config->rtp.extensions.push_back(RtpExtension(
-          RtpExtension::kAbsSendTimeUri, test::kAbsSendTimeExtensionId));
-    }
-    (*receive_configs)[0].rtp.ulpfec.red_payload_type =
-        send_config->rtp.ulpfec.red_payload_type;
-    (*receive_configs)[0].rtp.ulpfec.ulpfec_payload_type =
-        send_config->rtp.ulpfec.ulpfec_payload_type;
-  }
-
-  void PerformTest() override {
-    EXPECT_EQ(expect_ulpfec_, Wait())
-        << "Timed out waiting for ULPFEC and/or media packets.";
-  }
-
-  VideoEncoder* const encoder_;
-  std::string payload_name_;
-  const bool use_nack_;
-  const bool expect_red_;
-  const bool expect_ulpfec_;
-  bool sent_media_;
-  bool sent_ulpfec_;
-  bool header_extensions_enabled_;
-  RTPHeader prev_header_;
-};
-
-TEST_F(VideoSendStreamTest, SupportsUlpfecWithExtensions) {
-  std::unique_ptr<VideoEncoder> encoder(VP8Encoder::Create());
-  UlpfecObserver test(true, false, true, true, "VP8", encoder.get());
-  RunBaseTest(&test);
-}
-
-TEST_F(VideoSendStreamTest, SupportsUlpfecWithoutExtensions) {
-  std::unique_ptr<VideoEncoder> encoder(VP8Encoder::Create());
-  UlpfecObserver test(false, false, true, true, "VP8", encoder.get());
-  RunBaseTest(&test);
-}
-
-class VideoSendStreamWithoutUlpfecTest : public VideoSendStreamTest {
- protected:
-  VideoSendStreamWithoutUlpfecTest()
-      : field_trial_("WebRTC-DisableUlpFecExperiment/Enabled/") {}
-
-  test::ScopedFieldTrials field_trial_;
-};
-
-TEST_F(VideoSendStreamWithoutUlpfecTest, NoUlpfecIfDisabledThroughFieldTrial) {
-  std::unique_ptr<VideoEncoder> encoder(VP8Encoder::Create());
-  UlpfecObserver test(false, false, true, false, "VP8", encoder.get());
-  RunBaseTest(&test);
-}
-
-// The FEC scheme used is not efficient for H264, so we should not use RED/FEC
-// since we'll still have to re-request FEC packets, effectively wasting
-// bandwidth since the receiver has to wait for FEC retransmissions to determine
-// that the received state is actually decodable.
-TEST_F(VideoSendStreamTest, DoesNotUtilizeUlpfecForH264WithNackEnabled) {
-  std::unique_ptr<VideoEncoder> encoder(
-      new test::FakeH264Encoder(Clock::GetRealTimeClock()));
-  UlpfecObserver test(false, true, true, false, "H264", encoder.get());
-  RunBaseTest(&test);
-}
-
-// Without retransmissions FEC for H264 is fine.
-TEST_F(VideoSendStreamTest, DoesUtilizeUlpfecForH264WithoutNackEnabled) {
-  std::unique_ptr<VideoEncoder> encoder(
-      new test::FakeH264Encoder(Clock::GetRealTimeClock()));
-  UlpfecObserver test(false, false, true, true, "H264", encoder.get());
-  RunBaseTest(&test);
-}
-
-// Disabled as flaky, see https://crbug.com/webrtc/7285 for details.
-TEST_F(VideoSendStreamTest, DISABLED_DoesUtilizeUlpfecForVp8WithNackEnabled) {
-  std::unique_ptr<VideoEncoder> encoder(VP8Encoder::Create());
-  UlpfecObserver test(false, true, true, true, "VP8", encoder.get());
-  RunBaseTest(&test);
-}
-
-#if !defined(RTC_DISABLE_VP9)
-// Disabled as flaky, see https://crbug.com/webrtc/7285 for details.
-TEST_F(VideoSendStreamTest, DISABLED_DoesUtilizeUlpfecForVp9WithNackEnabled) {
-  std::unique_ptr<VideoEncoder> encoder(VP9Encoder::Create());
-  UlpfecObserver test(false, true, true, true, "VP9", encoder.get());
-  RunBaseTest(&test);
-}
-#endif  // !defined(RTC_DISABLE_VP9)
-
-TEST_F(VideoSendStreamTest, SupportsUlpfecWithMultithreadedH264) {
-  std::unique_ptr<VideoEncoder> encoder(
-      new test::MultithreadedFakeH264Encoder(Clock::GetRealTimeClock()));
-  UlpfecObserver test(false, false, true, true, "H264", encoder.get());
-  RunBaseTest(&test);
-}
-
-// TODO(brandtr): Move these FlexFEC tests when we have created
-// FlexfecSendStream.
-class FlexfecObserver : public test::EndToEndTest {
- public:
-  FlexfecObserver(bool header_extensions_enabled,
-                  bool use_nack,
-                  const std::string& codec,
-                  VideoEncoder* encoder)
-      : EndToEndTest(VideoSendStreamTest::kDefaultTimeoutMs),
-        encoder_(encoder),
-        payload_name_(codec),
-        use_nack_(use_nack),
-        sent_media_(false),
-        sent_flexfec_(false),
-        header_extensions_enabled_(header_extensions_enabled) {}
-
-  size_t GetNumFlexfecStreams() const override { return 1; }
-
- private:
-  Action OnSendRtp(const uint8_t* packet, size_t length) override {
-    RTPHeader header;
-    EXPECT_TRUE(parser_->Parse(packet, length, &header));
-
-    if (header.payloadType == VideoSendStreamTest::kFlexfecPayloadType) {
-      EXPECT_EQ(VideoSendStreamTest::kFlexfecSendSsrc, header.ssrc);
-      sent_flexfec_ = true;
-    } else {
-      EXPECT_EQ(VideoSendStreamTest::kFakeVideoSendPayloadType,
-                header.payloadType);
-      EXPECT_EQ(VideoSendStreamTest::kVideoSendSsrcs[0], header.ssrc);
-      sent_media_ = true;
-    }
-
-    if (header_extensions_enabled_) {
-      EXPECT_TRUE(header.extension.hasAbsoluteSendTime);
-      EXPECT_TRUE(header.extension.hasTransmissionTimeOffset);
-      EXPECT_TRUE(header.extension.hasTransportSequenceNumber);
-    }
-
-    if (sent_media_ && sent_flexfec_) {
-      observation_complete_.Set();
-    }
-
-    return SEND_PACKET;
-  }
-
-  test::PacketTransport* CreateSendTransport(
-      test::SingleThreadedTaskQueueForTesting* task_queue,
-      Call* sender_call) override {
-    // At low RTT (< kLowRttNackMs) -> NACK only, no FEC.
-    // Therefore we need some network delay.
-    const int kNetworkDelayMs = 100;
-    FakeNetworkPipe::Config config;
-    config.loss_percent = 5;
-    config.queue_delay_ms = kNetworkDelayMs;
-    return new test::PacketTransport(
-        task_queue, sender_call, this, test::PacketTransport::kSender,
-        VideoSendStreamTest::payload_type_map_, config);
-  }
-
-  void ModifyVideoConfigs(
-      VideoSendStream::Config* send_config,
-      std::vector<VideoReceiveStream::Config>* receive_configs,
-      VideoEncoderConfig* encoder_config) override {
-    if (use_nack_) {
-      send_config->rtp.nack.rtp_history_ms =
-          (*receive_configs)[0].rtp.nack.rtp_history_ms =
-              VideoSendStreamTest::kNackRtpHistoryMs;
-    }
-    send_config->encoder_settings.encoder = encoder_;
-    send_config->encoder_settings.payload_name = payload_name_;
-    if (header_extensions_enabled_) {
-      send_config->rtp.extensions.push_back(RtpExtension(
-          RtpExtension::kAbsSendTimeUri, test::kAbsSendTimeExtensionId));
-      send_config->rtp.extensions.push_back(RtpExtension(
-          RtpExtension::kTimestampOffsetUri, test::kTOffsetExtensionId));
-    } else {
-      send_config->rtp.extensions.clear();
-    }
-  }
-
-  void PerformTest() override {
-    EXPECT_TRUE(Wait())
-        << "Timed out waiting for FlexFEC and/or media packets.";
-  }
-
-  VideoEncoder* const encoder_;
-  std::string payload_name_;
-  const bool use_nack_;
-  bool sent_media_;
-  bool sent_flexfec_;
-  bool header_extensions_enabled_;
-};
-
-TEST_F(VideoSendStreamTest, SupportsFlexfecVp8) {
-  std::unique_ptr<VideoEncoder> encoder(VP8Encoder::Create());
-  FlexfecObserver test(false, false, "VP8", encoder.get());
-  RunBaseTest(&test);
-}
-
-TEST_F(VideoSendStreamTest, SupportsFlexfecWithNackVp8) {
-  std::unique_ptr<VideoEncoder> encoder(VP8Encoder::Create());
-  FlexfecObserver test(false, true, "VP8", encoder.get());
-  RunBaseTest(&test);
-}
-
-TEST_F(VideoSendStreamTest, SupportsFlexfecWithRtpExtensionsVp8) {
-  std::unique_ptr<VideoEncoder> encoder(VP8Encoder::Create());
-  FlexfecObserver test(true, false, "VP8", encoder.get());
-  RunBaseTest(&test);
-}
-
-#if !defined(RTC_DISABLE_VP9)
-TEST_F(VideoSendStreamTest, SupportsFlexfecVp9) {
-  std::unique_ptr<VideoEncoder> encoder(VP9Encoder::Create());
-  FlexfecObserver test(false, false, "VP9", encoder.get());
-  RunBaseTest(&test);
-}
-
-TEST_F(VideoSendStreamTest, SupportsFlexfecWithNackVp9) {
-  std::unique_ptr<VideoEncoder> encoder(VP9Encoder::Create());
-  FlexfecObserver test(false, true, "VP9", encoder.get());
-  RunBaseTest(&test);
-}
-#endif  // defined(RTC_DISABLE_VP9)
-
-TEST_F(VideoSendStreamTest, SupportsFlexfecH264) {
-  std::unique_ptr<VideoEncoder> encoder(
-      new test::FakeH264Encoder(Clock::GetRealTimeClock()));
-  FlexfecObserver test(false, false, "H264", encoder.get());
-  RunBaseTest(&test);
-}
-
-TEST_F(VideoSendStreamTest, SupportsFlexfecWithNackH264) {
-  std::unique_ptr<VideoEncoder> encoder(
-      new test::FakeH264Encoder(Clock::GetRealTimeClock()));
-  FlexfecObserver test(false, true, "H264", encoder.get());
-  RunBaseTest(&test);
-}
-
-TEST_F(VideoSendStreamTest, SupportsFlexfecWithMultithreadedH264) {
-  std::unique_ptr<VideoEncoder> encoder(
-      new test::MultithreadedFakeH264Encoder(Clock::GetRealTimeClock()));
-  FlexfecObserver test(false, false, "H264", encoder.get());
-  RunBaseTest(&test);
-}
-
-void VideoSendStreamTest::TestNackRetransmission(
-    uint32_t retransmit_ssrc,
-    uint8_t retransmit_payload_type) {
-  class NackObserver : public test::SendTest {
-   public:
-    explicit NackObserver(uint32_t retransmit_ssrc,
-                          uint8_t retransmit_payload_type)
-        : SendTest(kDefaultTimeoutMs),
-          send_count_(0),
-          retransmit_ssrc_(retransmit_ssrc),
-          retransmit_payload_type_(retransmit_payload_type),
-          nacked_sequence_number_(-1) {
-    }
-
-   private:
-    Action OnSendRtp(const uint8_t* packet, size_t length) override {
-      RTPHeader header;
-      EXPECT_TRUE(parser_->Parse(packet, length, &header));
-
-      // Nack second packet after receiving the third one.
-      if (++send_count_ == 3) {
-        uint16_t nack_sequence_number = header.sequenceNumber - 1;
-        nacked_sequence_number_ = nack_sequence_number;
-        RTCPSender rtcp_sender(false, Clock::GetRealTimeClock(), nullptr,
-                               nullptr, nullptr, transport_adapter_.get());
-
-        rtcp_sender.SetRTCPStatus(RtcpMode::kReducedSize);
-        rtcp_sender.SetRemoteSSRC(kVideoSendSsrcs[0]);
-
-        RTCPSender::FeedbackState feedback_state;
-
-        EXPECT_EQ(0,
-                  rtcp_sender.SendRTCP(
-                      feedback_state, kRtcpNack, 1, &nack_sequence_number));
-      }
-
-      uint16_t sequence_number = header.sequenceNumber;
-
-      if (header.ssrc == retransmit_ssrc_ &&
-          retransmit_ssrc_ != kVideoSendSsrcs[0]) {
-        // Not kVideoSendSsrcs[0], assume correct RTX packet. Extract sequence
-        // number.
-        const uint8_t* rtx_header = packet + header.headerLength;
-        sequence_number = (rtx_header[0] << 8) + rtx_header[1];
-      }
-
-      if (sequence_number == nacked_sequence_number_) {
-        EXPECT_EQ(retransmit_ssrc_, header.ssrc);
-        EXPECT_EQ(retransmit_payload_type_, header.payloadType);
-        observation_complete_.Set();
-      }
-
-      return SEND_PACKET;
-    }
-
-    void ModifyVideoConfigs(
-        VideoSendStream::Config* send_config,
-        std::vector<VideoReceiveStream::Config>* receive_configs,
-        VideoEncoderConfig* encoder_config) override {
-      transport_adapter_.reset(
-          new internal::TransportAdapter(send_config->send_transport));
-      transport_adapter_->Enable();
-      send_config->rtp.nack.rtp_history_ms = kNackRtpHistoryMs;
-      send_config->rtp.rtx.payload_type = retransmit_payload_type_;
-      if (retransmit_ssrc_ != kVideoSendSsrcs[0])
-        send_config->rtp.rtx.ssrcs.push_back(retransmit_ssrc_);
-    }
-
-    void PerformTest() override {
-      EXPECT_TRUE(Wait()) << "Timed out while waiting for NACK retransmission.";
-    }
-
-    std::unique_ptr<internal::TransportAdapter> transport_adapter_;
-    int send_count_;
-    uint32_t retransmit_ssrc_;
-    uint8_t retransmit_payload_type_;
-    int nacked_sequence_number_;
-  } test(retransmit_ssrc, retransmit_payload_type);
-
-  RunBaseTest(&test);
-}
-
-TEST_F(VideoSendStreamTest, RetransmitsNack) {
-  // Normal NACKs should use the send SSRC.
-  TestNackRetransmission(kVideoSendSsrcs[0], kFakeVideoSendPayloadType);
-}
-
-TEST_F(VideoSendStreamTest, RetransmitsNackOverRtx) {
-  // NACKs over RTX should use a separate SSRC.
-  TestNackRetransmission(kSendRtxSsrcs[0], kSendRtxPayloadType);
-}
-
-void VideoSendStreamTest::TestPacketFragmentationSize(VideoFormat format,
-                                                      bool with_fec) {
-  // Use a fake encoder to output a frame of every size in the range [90, 290],
-  // for each size making sure that the exact number of payload bytes received
-  // is correct and that packets are fragmented to respect max packet size.
-  static const size_t kMaxPacketSize = 128;
-  static const size_t start = 90;
-  static const size_t stop = 290;
-
-  // Observer that verifies that the expected number of packets and bytes
-  // arrive for each frame size, from start_size to stop_size.
-  class FrameFragmentationTest : public test::SendTest,
-                                 public EncodedFrameObserver {
-   public:
-    FrameFragmentationTest(size_t max_packet_size,
-                           size_t start_size,
-                           size_t stop_size,
-                           bool test_generic_packetization,
-                           bool use_fec)
-        : SendTest(kLongTimeoutMs),
-          encoder_(stop),
-          max_packet_size_(max_packet_size),
-          stop_size_(stop_size),
-          test_generic_packetization_(test_generic_packetization),
-          use_fec_(use_fec),
-          packet_count_(0),
-          accumulated_size_(0),
-          accumulated_payload_(0),
-          fec_packet_received_(false),
-          current_size_rtp_(start_size),
-          current_size_frame_(static_cast<int32_t>(start_size)) {
-      // Fragmentation required, this test doesn't make sense without it.
-      encoder_.SetFrameSize(start_size);
-      RTC_DCHECK_GT(stop_size, max_packet_size);
-    }
-
-   private:
-    Action OnSendRtp(const uint8_t* packet, size_t size) override {
-      size_t length = size;
-      RTPHeader header;
-      EXPECT_TRUE(parser_->Parse(packet, length, &header));
-
-      EXPECT_LE(length, max_packet_size_);
-
-      if (use_fec_) {
-        uint8_t payload_type = packet[header.headerLength];
-        bool is_fec = header.payloadType == kRedPayloadType &&
-                      payload_type == kUlpfecPayloadType;
-        if (is_fec) {
-          fec_packet_received_ = true;
-          return SEND_PACKET;
-        }
-      }
-
-      accumulated_size_ += length;
-
-      if (use_fec_)
-        TriggerLossReport(header);
-
-      if (test_generic_packetization_) {
-        size_t overhead = header.headerLength + header.paddingLength;
-        // Only remove payload header and RED header if the packet actually
-        // contains payload.
-        if (length > overhead) {
-          overhead += (1 /* Generic header */);
-          if (use_fec_)
-            overhead += 1;  // RED for FEC header.
-        }
-        EXPECT_GE(length, overhead);
-        accumulated_payload_ += length - overhead;
-      }
-
-      // Marker bit set indicates last packet of a frame.
-      if (header.markerBit) {
-        if (use_fec_ && accumulated_payload_ == current_size_rtp_ - 1) {
-          // With FEC enabled, frame size is incremented asynchronously, so
-          // "old" frames one byte too small may arrive. Accept, but don't
-          // increase expected frame size.
-          accumulated_size_ = 0;
-          accumulated_payload_ = 0;
-          return SEND_PACKET;
-        }
-
-        EXPECT_GE(accumulated_size_, current_size_rtp_);
-        if (test_generic_packetization_) {
-          EXPECT_EQ(current_size_rtp_, accumulated_payload_);
-        }
-
-        // Last packet of frame; reset counters.
-        accumulated_size_ = 0;
-        accumulated_payload_ = 0;
-        if (current_size_rtp_ == stop_size_) {
-          // Done! (Don't increase size again, might arrive more @ stop_size).
-          observation_complete_.Set();
-        } else {
-          // Increase next expected frame size. If testing with FEC, make sure
-          // a FEC packet has been received for this frame size before
-          // proceeding, to make sure that redundancy packets don't exceed
-          // size limit.
-          if (!use_fec_) {
-            ++current_size_rtp_;
-          } else if (fec_packet_received_) {
-            fec_packet_received_ = false;
-            ++current_size_rtp_;
-            ++current_size_frame_;
-          }
-        }
-      }
-
-      return SEND_PACKET;
-    }
-
-    void TriggerLossReport(const RTPHeader& header) {
-      // Send lossy receive reports to trigger FEC enabling.
-      const int kLossPercent = 5;
-      if (packet_count_++ % (100 / kLossPercent) != 0) {
-        FakeReceiveStatistics lossy_receive_stats(
-            kVideoSendSsrcs[0], header.sequenceNumber,
-            (packet_count_ * (100 - kLossPercent)) / 100,  // Cumulative lost.
-            static_cast<uint8_t>((255 * kLossPercent) / 100));  // Loss percent.
-        RTCPSender rtcp_sender(false, Clock::GetRealTimeClock(),
-                               &lossy_receive_stats, nullptr, nullptr,
-                               transport_adapter_.get());
-
-        rtcp_sender.SetRTCPStatus(RtcpMode::kReducedSize);
-        rtcp_sender.SetRemoteSSRC(kVideoSendSsrcs[0]);
-
-        RTCPSender::FeedbackState feedback_state;
-
-        EXPECT_EQ(0, rtcp_sender.SendRTCP(feedback_state, kRtcpRr));
-      }
-    }
-
-    void EncodedFrameCallback(const EncodedFrame& encoded_frame) override {
-      // Increase frame size for next encoded frame, in the context of the
-      // encoder thread.
-      if (!use_fec_ &&
-          current_size_frame_.Value() < static_cast<int32_t>(stop_size_)) {
-        ++current_size_frame_;
-      }
-      encoder_.SetFrameSize(static_cast<size_t>(current_size_frame_.Value()));
-    }
-
-    Call::Config GetSenderCallConfig() override {
-      Call::Config config(event_log_.get());
-      const int kMinBitrateBps = 30000;
-      config.bitrate_config.min_bitrate_bps = kMinBitrateBps;
-      return config;
-    }
-
-    void ModifyVideoConfigs(
-        VideoSendStream::Config* send_config,
-        std::vector<VideoReceiveStream::Config>* receive_configs,
-        VideoEncoderConfig* encoder_config) override {
-      transport_adapter_.reset(
-          new internal::TransportAdapter(send_config->send_transport));
-      transport_adapter_->Enable();
-      if (use_fec_) {
-        send_config->rtp.ulpfec.red_payload_type = kRedPayloadType;
-        send_config->rtp.ulpfec.ulpfec_payload_type = kUlpfecPayloadType;
-      }
-
-      if (!test_generic_packetization_)
-        send_config->encoder_settings.payload_name = "VP8";
-
-      send_config->encoder_settings.encoder = &encoder_;
-      send_config->rtp.max_packet_size = kMaxPacketSize;
-      send_config->post_encode_callback = this;
-
-      // Make sure there is at least one extension header, to make the RTP
-      // header larger than the base length of 12 bytes.
-      EXPECT_FALSE(send_config->rtp.extensions.empty());
-
-      // Setup screen content disables frame dropping which makes this easier.
-      class VideoStreamFactory
-          : public VideoEncoderConfig::VideoStreamFactoryInterface {
-       public:
-        explicit VideoStreamFactory(size_t num_temporal_layers)
-            : num_temporal_layers_(num_temporal_layers) {
-          EXPECT_GT(num_temporal_layers, 0u);
-        }
-
-       private:
-        std::vector<VideoStream> CreateEncoderStreams(
-            int width,
-            int height,
-            const VideoEncoderConfig& encoder_config) override {
-          std::vector<VideoStream> streams =
-              test::CreateVideoStreams(width, height, encoder_config);
-          for (VideoStream& stream : streams) {
-            stream.temporal_layer_thresholds_bps.resize(num_temporal_layers_ -
-                                                        1);
-          }
-          return streams;
-        }
-        const size_t num_temporal_layers_;
-      };
-
-      encoder_config->video_stream_factory =
-          new rtc::RefCountedObject<VideoStreamFactory>(2);
-      encoder_config->content_type = VideoEncoderConfig::ContentType::kScreen;
-    }
-
-    void PerformTest() override {
-      EXPECT_TRUE(Wait()) << "Timed out while observing incoming RTP packets.";
-    }
-
-    std::unique_ptr<internal::TransportAdapter> transport_adapter_;
-    test::ConfigurableFrameSizeEncoder encoder_;
-
-    const size_t max_packet_size_;
-    const size_t stop_size_;
-    const bool test_generic_packetization_;
-    const bool use_fec_;
-
-    uint32_t packet_count_;
-    size_t accumulated_size_;
-    size_t accumulated_payload_;
-    bool fec_packet_received_;
-
-    size_t current_size_rtp_;
-    Atomic32 current_size_frame_;
-  };
-
-  // Don't auto increment if FEC is used; continue sending frame size until
-  // a FEC packet has been received.
-  FrameFragmentationTest test(
-      kMaxPacketSize, start, stop, format == kGeneric, with_fec);
-
-  RunBaseTest(&test);
-}
-
-// TODO(sprang): Is there any way of speeding up these tests?
-TEST_F(VideoSendStreamTest, FragmentsGenericAccordingToMaxPacketSize) {
-  TestPacketFragmentationSize(kGeneric, false);
-}
-
-TEST_F(VideoSendStreamTest, FragmentsGenericAccordingToMaxPacketSizeWithFec) {
-  TestPacketFragmentationSize(kGeneric, true);
-}
-
-TEST_F(VideoSendStreamTest, FragmentsVp8AccordingToMaxPacketSize) {
-  TestPacketFragmentationSize(kVP8, false);
-}
-
-TEST_F(VideoSendStreamTest, FragmentsVp8AccordingToMaxPacketSizeWithFec) {
-  TestPacketFragmentationSize(kVP8, true);
-}
-
-// The test will go through a number of phases.
-// 1. Start sending packets.
-// 2. As soon as the RTP stream has been detected, signal a low REMB value to
-//    suspend the stream.
-// 3. Wait until |kSuspendTimeFrames| have been captured without seeing any RTP
-//    packets.
-// 4. Signal a high REMB and then wait for the RTP stream to start again.
-//    When the stream is detected again, and the stats show that the stream
-//    is no longer suspended, the test ends.
-TEST_F(VideoSendStreamTest, SuspendBelowMinBitrate) {
-  static const int kSuspendTimeFrames = 60;  // Suspend for 2 seconds @ 30 fps.
-
-  class RembObserver : public test::SendTest,
-                       public rtc::VideoSinkInterface<VideoFrame> {
-   public:
-    RembObserver()
-        : SendTest(kDefaultTimeoutMs),
-          clock_(Clock::GetRealTimeClock()),
-          stream_(nullptr),
-          test_state_(kBeforeSuspend),
-          rtp_count_(0),
-          last_sequence_number_(0),
-          suspended_frame_count_(0),
-          low_remb_bps_(0),
-          high_remb_bps_(0) {}
-
-   private:
-    Action OnSendRtp(const uint8_t* packet, size_t length) override {
-      rtc::CritScope lock(&crit_);
-      ++rtp_count_;
-      RTPHeader header;
-      EXPECT_TRUE(parser_->Parse(packet, length, &header));
-      last_sequence_number_ = header.sequenceNumber;
-
-      if (test_state_ == kBeforeSuspend) {
-        // The stream has started. Try to suspend it.
-        SendRtcpFeedback(low_remb_bps_);
-        test_state_ = kDuringSuspend;
-      } else if (test_state_ == kDuringSuspend) {
-        if (header.paddingLength == 0) {
-          // Received non-padding packet during suspension period. Reset the
-          // counter.
-          suspended_frame_count_ = 0;
-        }
-        SendRtcpFeedback(0);  // REMB is only sent if value is > 0.
-      } else if (test_state_ == kWaitingForPacket) {
-        if (header.paddingLength == 0) {
-          // Non-padding packet observed. Test is almost complete. Will just
-          // have to wait for the stats to change.
-          test_state_ = kWaitingForStats;
-        }
-        SendRtcpFeedback(0);  // REMB is only sent if value is > 0.
-      } else if (test_state_ == kWaitingForStats) {
-        VideoSendStream::Stats stats = stream_->GetStats();
-        if (stats.suspended == false) {
-          // Stats flipped to false. Test is complete.
-          observation_complete_.Set();
-        }
-        SendRtcpFeedback(0);  // REMB is only sent if value is > 0.
-      }
-
-      return SEND_PACKET;
-    }
-
-    // This method implements the rtc::VideoSinkInterface. This is called when
-    // a frame is provided to the VideoSendStream.
-    void OnFrame(const VideoFrame& video_frame) override {
-      rtc::CritScope lock(&crit_);
-      if (test_state_ == kDuringSuspend &&
-          ++suspended_frame_count_ > kSuspendTimeFrames) {
-        VideoSendStream::Stats stats = stream_->GetStats();
-        EXPECT_TRUE(stats.suspended);
-        SendRtcpFeedback(high_remb_bps_);
-        test_state_ = kWaitingForPacket;
-      }
-    }
-
-    void set_low_remb_bps(int value) {
-      rtc::CritScope lock(&crit_);
-      low_remb_bps_ = value;
-    }
-
-    void set_high_remb_bps(int value) {
-      rtc::CritScope lock(&crit_);
-      high_remb_bps_ = value;
-    }
-
-    void OnVideoStreamsCreated(
-        VideoSendStream* send_stream,
-        const std::vector<VideoReceiveStream*>& receive_streams) override {
-      stream_ = send_stream;
-    }
-
-    void ModifyVideoConfigs(
-        VideoSendStream::Config* send_config,
-        std::vector<VideoReceiveStream::Config>* receive_configs,
-        VideoEncoderConfig* encoder_config) override {
-      RTC_DCHECK_EQ(1, encoder_config->number_of_streams);
-      transport_adapter_.reset(
-          new internal::TransportAdapter(send_config->send_transport));
-      transport_adapter_->Enable();
-      send_config->rtp.nack.rtp_history_ms = kNackRtpHistoryMs;
-      send_config->pre_encode_callback = this;
-      send_config->suspend_below_min_bitrate = true;
-      int min_bitrate_bps =
-          test::DefaultVideoStreamFactory::kDefaultMinBitratePerStream[0];
-      set_low_remb_bps(min_bitrate_bps - 10000);
-      int threshold_window = std::max(min_bitrate_bps / 10, 20000);
-      ASSERT_GT(encoder_config->max_bitrate_bps,
-                min_bitrate_bps + threshold_window + 5000);
-      set_high_remb_bps(min_bitrate_bps + threshold_window + 5000);
-    }
-
-    void PerformTest() override {
-      EXPECT_TRUE(Wait()) << "Timed out during suspend-below-min-bitrate test.";
-    }
-
-    enum TestState {
-      kBeforeSuspend,
-      kDuringSuspend,
-      kWaitingForPacket,
-      kWaitingForStats
-    };
-
-    virtual void SendRtcpFeedback(int remb_value)
-        RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_) {
-      FakeReceiveStatistics receive_stats(kVideoSendSsrcs[0],
-                                          last_sequence_number_, rtp_count_, 0);
-      RTCPSender rtcp_sender(false, clock_, &receive_stats, nullptr, nullptr,
-                             transport_adapter_.get());
-
-      rtcp_sender.SetRTCPStatus(RtcpMode::kReducedSize);
-      rtcp_sender.SetRemoteSSRC(kVideoSendSsrcs[0]);
-      if (remb_value > 0) {
-        rtcp_sender.SetREMBStatus(true);
-        rtcp_sender.SetREMBData(remb_value, std::vector<uint32_t>());
-      }
-      RTCPSender::FeedbackState feedback_state;
-      EXPECT_EQ(0, rtcp_sender.SendRTCP(feedback_state, kRtcpRr));
-    }
-
-    std::unique_ptr<internal::TransportAdapter> transport_adapter_;
-    Clock* const clock_;
-    VideoSendStream* stream_;
-
-    rtc::CriticalSection crit_;
-    TestState test_state_ RTC_GUARDED_BY(crit_);
-    int rtp_count_ RTC_GUARDED_BY(crit_);
-    int last_sequence_number_ RTC_GUARDED_BY(crit_);
-    int suspended_frame_count_ RTC_GUARDED_BY(crit_);
-    int low_remb_bps_ RTC_GUARDED_BY(crit_);
-    int high_remb_bps_ RTC_GUARDED_BY(crit_);
-  } test;
-
-  RunBaseTest(&test);
-}
-
-// This test that padding stops being send after a while if the Camera stops
-// producing video frames and that padding resumes if the camera restarts.
-TEST_F(VideoSendStreamTest, NoPaddingWhenVideoIsMuted) {
-  class NoPaddingWhenVideoIsMuted : public test::SendTest {
-   public:
-    NoPaddingWhenVideoIsMuted()
-        : SendTest(kDefaultTimeoutMs),
-          clock_(Clock::GetRealTimeClock()),
-          last_packet_time_ms_(-1),
-          capturer_(nullptr) {
-    }
-
-   private:
-    Action OnSendRtp(const uint8_t* packet, size_t length) override {
-      rtc::CritScope lock(&crit_);
-      last_packet_time_ms_ = clock_->TimeInMilliseconds();
-
-      RTPHeader header;
-      parser_->Parse(packet, length, &header);
-      const bool only_padding =
-          header.headerLength + header.paddingLength == length;
-
-      if (test_state_ == kBeforeStopCapture) {
-        capturer_->Stop();
-        test_state_ = kWaitingForPadding;
-      } else if (test_state_ == kWaitingForPadding && only_padding) {
-        test_state_ = kWaitingForNoPackets;
-      } else if (test_state_ == kWaitingForPaddingAfterCameraRestart &&
-                 only_padding) {
-        observation_complete_.Set();
-      }
-      return SEND_PACKET;
-    }
-
-    Action OnSendRtcp(const uint8_t* packet, size_t length) override {
-      rtc::CritScope lock(&crit_);
-      const int kNoPacketsThresholdMs = 2000;
-      if (test_state_ == kWaitingForNoPackets &&
-          (last_packet_time_ms_ > 0 &&
-           clock_->TimeInMilliseconds() - last_packet_time_ms_ >
-               kNoPacketsThresholdMs)) {
-        capturer_->Start();
-        test_state_ = kWaitingForPaddingAfterCameraRestart;
-      }
-      return SEND_PACKET;
-    }
-
-    size_t GetNumVideoStreams() const override { return 3; }
-
-    void OnFrameGeneratorCapturerCreated(
-        test::FrameGeneratorCapturer* frame_generator_capturer) override {
-      rtc::CritScope lock(&crit_);
-      capturer_ = frame_generator_capturer;
-    }
-
-    void PerformTest() override {
-      EXPECT_TRUE(Wait())
-          << "Timed out while waiting for RTP packets to stop being sent.";
-    }
-
-    enum TestState {
-      kBeforeStopCapture,
-      kWaitingForPadding,
-      kWaitingForNoPackets,
-      kWaitingForPaddingAfterCameraRestart
-    };
-
-    TestState test_state_ = kBeforeStopCapture;
-    Clock* const clock_;
-    std::unique_ptr<internal::TransportAdapter> transport_adapter_;
-    rtc::CriticalSection crit_;
-    int64_t last_packet_time_ms_ RTC_GUARDED_BY(crit_);
-    test::FrameGeneratorCapturer* capturer_ RTC_GUARDED_BY(crit_);
-  } test;
-
-  RunBaseTest(&test);
-}
-
-TEST_F(VideoSendStreamTest, PaddingIsPrimarilyRetransmissions) {
-  const int kCapacityKbps = 10000;  // 10 Mbps
-  class PaddingIsPrimarilyRetransmissions : public test::EndToEndTest {
-   public:
-    PaddingIsPrimarilyRetransmissions()
-        : EndToEndTest(kDefaultTimeoutMs),
-          clock_(Clock::GetRealTimeClock()),
-          padding_length_(0),
-          total_length_(0),
-          call_(nullptr) {}
-
-   private:
-    void OnCallsCreated(Call* sender_call, Call* receiver_call) override {
-      call_ = sender_call;
-    }
-
-    Action OnSendRtp(const uint8_t* packet, size_t length) override {
-      rtc::CritScope lock(&crit_);
-
-      RTPHeader header;
-      parser_->Parse(packet, length, &header);
-      padding_length_ += header.paddingLength;
-      total_length_ += length;
-      return SEND_PACKET;
-    }
-
-    test::PacketTransport* CreateSendTransport(
-        test::SingleThreadedTaskQueueForTesting* task_queue,
-        Call* sender_call) override {
-      const int kNetworkDelayMs = 50;
-      FakeNetworkPipe::Config config;
-      config.loss_percent = 10;
-      config.link_capacity_kbps = kCapacityKbps;
-      config.queue_delay_ms = kNetworkDelayMs;
-      return new test::PacketTransport(task_queue, sender_call, this,
-                                       test::PacketTransport::kSender,
-                                       payload_type_map_, config);
-    }
-
-    void ModifyVideoConfigs(
-        VideoSendStream::Config* send_config,
-        std::vector<VideoReceiveStream::Config>* receive_configs,
-        VideoEncoderConfig* encoder_config) override {
-      // Turn on RTX.
-      send_config->rtp.rtx.payload_type = kFakeVideoSendPayloadType;
-      send_config->rtp.rtx.ssrcs.push_back(kVideoSendSsrcs[0]);
-    }
-
-    void PerformTest() override {
-      // TODO(isheriff): Some platforms do not ramp up as expected to full
-      // capacity due to packet scheduling delays. Fix that before getting
-      // rid of this.
-      SleepMs(5000);
-      {
-        rtc::CritScope lock(&crit_);
-        // Expect padding to be a small percentage of total bytes sent.
-        EXPECT_LT(padding_length_, .1 * total_length_);
-      }
-    }
-
-    rtc::CriticalSection crit_;
-    Clock* const clock_;
-    size_t padding_length_ RTC_GUARDED_BY(crit_);
-    size_t total_length_ RTC_GUARDED_BY(crit_);
-    Call* call_;
-  } test;
-
-  RunBaseTest(&test);
-}
-
-// This test first observes "high" bitrate use at which point it sends a REMB to
-// indicate that it should be lowered significantly. The test then observes that
-// the bitrate observed is sinking well below the min-transmit-bitrate threshold
-// to verify that the min-transmit bitrate respects incoming REMB.
-//
-// Note that the test starts at "high" bitrate and does not ramp up to "higher"
-// bitrate since no receiver block or remb is sent in the initial phase.
-TEST_F(VideoSendStreamTest, MinTransmitBitrateRespectsRemb) {
-  static const int kMinTransmitBitrateBps = 400000;
-  static const int kHighBitrateBps = 150000;
-  static const int kRembBitrateBps = 80000;
-  static const int kRembRespectedBitrateBps = 100000;
-  class BitrateObserver : public test::SendTest {
-   public:
-    BitrateObserver()
-        : SendTest(kDefaultTimeoutMs),
-          retranmission_rate_limiter_(Clock::GetRealTimeClock(), 1000),
-          stream_(nullptr),
-          bitrate_capped_(false) {}
-
-   private:
-    Action OnSendRtp(const uint8_t* packet, size_t length) override {
-      if (RtpHeaderParser::IsRtcp(packet, length))
-        return DROP_PACKET;
-
-      RTPHeader header;
-      if (!parser_->Parse(packet, length, &header))
-        return DROP_PACKET;
-      RTC_DCHECK(stream_);
-      VideoSendStream::Stats stats = stream_->GetStats();
-      if (!stats.substreams.empty()) {
-        EXPECT_EQ(1u, stats.substreams.size());
-        int total_bitrate_bps =
-            stats.substreams.begin()->second.total_bitrate_bps;
-        test::PrintResult("bitrate_stats_",
-                          "min_transmit_bitrate_low_remb",
-                          "bitrate_bps",
-                          static_cast<size_t>(total_bitrate_bps),
-                          "bps",
-                          false);
-        if (total_bitrate_bps > kHighBitrateBps) {
-          rtp_rtcp_->SetREMBData(kRembBitrateBps,
-                                 std::vector<uint32_t>(1, header.ssrc));
-          rtp_rtcp_->Process();
-          bitrate_capped_ = true;
-        } else if (bitrate_capped_ &&
-                   total_bitrate_bps < kRembRespectedBitrateBps) {
-          observation_complete_.Set();
-        }
-      }
-      // Packets don't have to be delivered since the test is the receiver.
-      return DROP_PACKET;
-    }
-
-    void OnVideoStreamsCreated(
-        VideoSendStream* send_stream,
-        const std::vector<VideoReceiveStream*>& receive_streams) override {
-      stream_ = send_stream;
-      RtpRtcp::Configuration config;
-      config.outgoing_transport = feedback_transport_.get();
-      config.retransmission_rate_limiter = &retranmission_rate_limiter_;
-      rtp_rtcp_.reset(RtpRtcp::CreateRtpRtcp(config));
-      rtp_rtcp_->SetREMBStatus(true);
-      rtp_rtcp_->SetRTCPStatus(RtcpMode::kReducedSize);
-    }
-
-    void ModifyVideoConfigs(
-        VideoSendStream::Config* send_config,
-        std::vector<VideoReceiveStream::Config>* receive_configs,
-        VideoEncoderConfig* encoder_config) override {
-      feedback_transport_.reset(
-          new internal::TransportAdapter(send_config->send_transport));
-      feedback_transport_->Enable();
-      encoder_config->min_transmit_bitrate_bps = kMinTransmitBitrateBps;
-    }
-
-    void PerformTest() override {
-      EXPECT_TRUE(Wait())
-          << "Timeout while waiting for low bitrate stats after REMB.";
-    }
-
-    std::unique_ptr<RtpRtcp> rtp_rtcp_;
-    std::unique_ptr<internal::TransportAdapter> feedback_transport_;
-    RateLimiter retranmission_rate_limiter_;
-    VideoSendStream* stream_;
-    bool bitrate_capped_;
-  } test;
-
-  RunBaseTest(&test);
-}
-
-TEST_F(VideoSendStreamTest, ChangingNetworkRoute) {
-  static const int kStartBitrateBps = 300000;
-  static const int kNewMaxBitrateBps = 1234567;
-  static const uint8_t kExtensionId = test::kTransportSequenceNumberExtensionId;
-  class ChangingNetworkRouteTest : public test::EndToEndTest {
-   public:
-    explicit ChangingNetworkRouteTest(
-        test::SingleThreadedTaskQueueForTesting* task_queue)
-        : EndToEndTest(test::CallTest::kDefaultTimeoutMs),
-          task_queue_(task_queue),
-          call_(nullptr) {
-      EXPECT_TRUE(parser_->RegisterRtpHeaderExtension(
-          kRtpExtensionTransportSequenceNumber, kExtensionId));
-    }
-
-    void OnCallsCreated(Call* sender_call, Call* receiver_call) override {
-      call_ = sender_call;
-    }
-
-    void ModifyVideoConfigs(
-        VideoSendStream::Config* send_config,
-        std::vector<VideoReceiveStream::Config>* receive_configs,
-        VideoEncoderConfig* encoder_config) override {
-      send_config->rtp.extensions.clear();
-      send_config->rtp.extensions.push_back(RtpExtension(
-          RtpExtension::kTransportSequenceNumberUri, kExtensionId));
-      (*receive_configs)[0].rtp.extensions = send_config->rtp.extensions;
-      (*receive_configs)[0].rtp.transport_cc = true;
-    }
-
-    void ModifyAudioConfigs(
-        AudioSendStream::Config* send_config,
-        std::vector<AudioReceiveStream::Config>* receive_configs) override {
-      send_config->rtp.extensions.clear();
-      send_config->rtp.extensions.push_back(RtpExtension(
-          RtpExtension::kTransportSequenceNumberUri, kExtensionId));
-      (*receive_configs)[0].rtp.extensions.clear();
-      (*receive_configs)[0].rtp.extensions = send_config->rtp.extensions;
-      (*receive_configs)[0].rtp.transport_cc = true;
-    }
-
-    Action OnSendRtp(const uint8_t* packet, size_t length) override {
-      if (call_->GetStats().send_bandwidth_bps > kStartBitrateBps) {
-        observation_complete_.Set();
-      }
-
-      return SEND_PACKET;
-    }
-
-    void PerformTest() override {
-      rtc::NetworkRoute new_route(true, 10, 20, -1);
-      Call::Config::BitrateConfig bitrate_config;
-
-      task_queue_->SendTask([this, &new_route, &bitrate_config]() {
-        call_->OnNetworkRouteChanged("transport", new_route);
-        bitrate_config.start_bitrate_bps = kStartBitrateBps;
-        call_->SetBitrateConfig(bitrate_config);
-      });
-
-      EXPECT_TRUE(Wait())
-          << "Timed out while waiting for start bitrate to be exceeded.";
-
-      task_queue_->SendTask([this, &new_route, &bitrate_config]() {
-        bitrate_config.start_bitrate_bps = -1;
-        bitrate_config.max_bitrate_bps = kNewMaxBitrateBps;
-        call_->SetBitrateConfig(bitrate_config);
-        // TODO(holmer): We should set the last sent packet id here and verify
-        // that we correctly ignore any packet loss reported prior to that id.
-        ++new_route.local_network_id;
-        call_->OnNetworkRouteChanged("transport", new_route);
-        EXPECT_GE(call_->GetStats().send_bandwidth_bps, kStartBitrateBps);
-      });
-    }
-
-   private:
-    test::SingleThreadedTaskQueueForTesting* const task_queue_;
-    Call* call_;
-  } test(&task_queue_);
-
-  RunBaseTest(&test);
-}
-
-TEST_F(VideoSendStreamTest, ChangingTransportOverhead) {
-  class ChangingTransportOverheadTest : public test::EndToEndTest {
-   public:
-    explicit ChangingTransportOverheadTest(
-        test::SingleThreadedTaskQueueForTesting* task_queue)
-        : EndToEndTest(test::CallTest::kDefaultTimeoutMs),
-          task_queue_(task_queue),
-          call_(nullptr),
-          packets_sent_(0),
-          transport_overhead_(0) {}
-
-    void OnCallsCreated(Call* sender_call, Call* receiver_call) override {
-      call_ = sender_call;
-    }
-
-    Action OnSendRtp(const uint8_t* packet, size_t length) override {
-      EXPECT_LE(length, kMaxRtpPacketSize);
-      rtc::CritScope cs(&lock_);
-      if (++packets_sent_ < 100)
-        return SEND_PACKET;
-      observation_complete_.Set();
-      return SEND_PACKET;
-    }
-
-    void ModifyVideoConfigs(
-        VideoSendStream::Config* send_config,
-        std::vector<VideoReceiveStream::Config>* receive_configs,
-        VideoEncoderConfig* encoder_config) override {
-      send_config->rtp.max_packet_size = kMaxRtpPacketSize;
-    }
-
-    void PerformTest() override {
-      task_queue_->SendTask([this]() {
-        transport_overhead_ = 100;
-        call_->OnTransportOverheadChanged(webrtc::MediaType::VIDEO,
-                                          transport_overhead_);
-      });
-
-      EXPECT_TRUE(Wait());
-
-      {
-        rtc::CritScope cs(&lock_);
-        packets_sent_ = 0;
-      }
-
-      task_queue_->SendTask([this]() {
-        transport_overhead_ = 500;
-        call_->OnTransportOverheadChanged(webrtc::MediaType::VIDEO,
-                                          transport_overhead_);
-      });
-
-      EXPECT_TRUE(Wait());
-    }
-
-   private:
-    test::SingleThreadedTaskQueueForTesting* const task_queue_;
-    Call* call_;
-    rtc::CriticalSection lock_;
-    int packets_sent_ RTC_GUARDED_BY(lock_);
-    int transport_overhead_;
-    const size_t kMaxRtpPacketSize = 1000;
-  } test(&task_queue_);
-
-  RunBaseTest(&test);
-}
-
-// Test class takes takes as argument a switch selecting if type switch should
-// occur and a function pointer to reset the send stream. This is necessary
-// since you cannot change the content type of a VideoSendStream, you need to
-// recreate it. Stopping and recreating the stream can only be done on the main
-// thread and in the context of VideoSendStreamTest (not BaseTest).
-template <typename T>
-class MaxPaddingSetTest : public test::SendTest {
- public:
-  static const uint32_t kMinTransmitBitrateBps = 400000;
-  static const uint32_t kActualEncodeBitrateBps = 40000;
-  static const uint32_t kMinPacketsToSend = 50;
-
-  explicit MaxPaddingSetTest(bool test_switch_content_type, T* stream_reset_fun)
-      : SendTest(test::CallTest::kDefaultTimeoutMs),
-        content_switch_event_(false, false),
-        call_(nullptr),
-        send_stream_(nullptr),
-        send_stream_config_(nullptr),
-        packets_sent_(0),
-        running_without_padding_(test_switch_content_type),
-        stream_resetter_(stream_reset_fun) {
-    RTC_DCHECK(stream_resetter_);
-  }
-
-  void OnVideoStreamsCreated(
-      VideoSendStream* send_stream,
-      const std::vector<VideoReceiveStream*>& receive_streams) override {
-    rtc::CritScope lock(&crit_);
-    send_stream_ = send_stream;
-  }
-
-  void ModifyVideoConfigs(
-      VideoSendStream::Config* send_config,
-      std::vector<VideoReceiveStream::Config>* receive_configs,
-      VideoEncoderConfig* encoder_config) override {
-    RTC_DCHECK_EQ(1, encoder_config->number_of_streams);
-    if (RunningWithoutPadding()) {
-      encoder_config->min_transmit_bitrate_bps = 0;
-      encoder_config->content_type =
-          VideoEncoderConfig::ContentType::kRealtimeVideo;
-    } else {
-      encoder_config->min_transmit_bitrate_bps = kMinTransmitBitrateBps;
-      encoder_config->content_type = VideoEncoderConfig::ContentType::kScreen;
-    }
-    send_stream_config_ = send_config->Copy();
-    encoder_config_ = encoder_config->Copy();
-  }
-
-  void OnCallsCreated(Call* sender_call, Call* receiver_call) override {
-    call_ = sender_call;
-  }
-
-  Action OnSendRtp(const uint8_t* packet, size_t length) override {
-    rtc::CritScope lock(&crit_);
-    if (running_without_padding_)
-      EXPECT_EQ(0, call_->GetStats().max_padding_bitrate_bps);
-
-    // Wait until at least kMinPacketsToSend frames have been encoded, so that
-    // we have reliable data.
-    if (++packets_sent_ < kMinPacketsToSend)
-      return SEND_PACKET;
-
-    if (running_without_padding_) {
-      // We've sent kMinPacketsToSend packets with default configuration, switch
-      // to enabling screen content and setting min transmit bitrate.
-      // Note that we need to recreate the stream if changing content type.
-      packets_sent_ = 0;
-      encoder_config_.min_transmit_bitrate_bps = kMinTransmitBitrateBps;
-      encoder_config_.content_type = VideoEncoderConfig::ContentType::kScreen;
-      running_without_padding_ = false;
-      content_switch_event_.Set();
-      return SEND_PACKET;
-    }
-
-    // Make sure the pacer has been configured with a min transmit bitrate.
-    if (call_->GetStats().max_padding_bitrate_bps > 0)
-      observation_complete_.Set();
-
-    return SEND_PACKET;
-  }
-
-  void PerformTest() override {
-    if (RunningWithoutPadding()) {
-      ASSERT_TRUE(
-          content_switch_event_.Wait(test::CallTest::kDefaultTimeoutMs));
-      (*stream_resetter_)(send_stream_config_, encoder_config_);
-    }
-
-    ASSERT_TRUE(Wait()) << "Timed out waiting for a valid padding bitrate.";
-  }
-
- private:
-  bool RunningWithoutPadding() const {
-    rtc::CritScope lock(&crit_);
-    return running_without_padding_;
-  }
-
-  rtc::CriticalSection crit_;
-  rtc::Event content_switch_event_;
-  Call* call_;
-  VideoSendStream* send_stream_ RTC_GUARDED_BY(crit_);
-  VideoSendStream::Config send_stream_config_;
-  VideoEncoderConfig encoder_config_;
-  uint32_t packets_sent_ RTC_GUARDED_BY(crit_);
-  bool running_without_padding_;
-  T* const stream_resetter_;
-};
-
-TEST_F(VideoSendStreamTest, RespectsMinTransmitBitrate) {
-  auto reset_fun = [](const VideoSendStream::Config& send_stream_config,
-                      const VideoEncoderConfig& encoder_config) {};
-  MaxPaddingSetTest<decltype(reset_fun)> test(false, &reset_fun);
-  RunBaseTest(&test);
-}
-
-TEST_F(VideoSendStreamTest, RespectsMinTransmitBitrateAfterContentSwitch) {
-  // Function for removing and recreating the send stream with a new config.
-  auto reset_fun = [this](const VideoSendStream::Config& send_stream_config,
-                          const VideoEncoderConfig& encoder_config) {
-    task_queue_.SendTask([this, &send_stream_config, &encoder_config]() {
-      Stop();
-      sender_call_->DestroyVideoSendStream(video_send_stream_);
-      video_send_config_ = send_stream_config.Copy();
-      video_encoder_config_ = encoder_config.Copy();
-      video_send_stream_ = sender_call_->CreateVideoSendStream(
-          video_send_config_.Copy(), video_encoder_config_.Copy());
-      video_send_stream_->SetSource(
-          frame_generator_capturer_.get(),
-          VideoSendStream::DegradationPreference::kMaintainResolution);
-      Start();
-    });
-  };
-  MaxPaddingSetTest<decltype(reset_fun)> test(true, &reset_fun);
-  RunBaseTest(&test);
-}
-
-// This test verifies that new frame sizes reconfigures encoders even though not
-// (yet) sending. The purpose of this is to permit encoding as quickly as
-// possible once we start sending. Likely the frames being input are from the
-// same source that will be sent later, which just means that we're ready
-// earlier.
-TEST_F(VideoSendStreamTest,
-       EncoderReconfigureOnResolutionChangeWhenNotSending) {
-  class EncoderObserver : public test::FakeEncoder {
-   public:
-    EncoderObserver()
-        : FakeEncoder(Clock::GetRealTimeClock()),
-          init_encode_called_(false, false),
-          number_of_initializations_(0),
-          last_initialized_frame_width_(0),
-          last_initialized_frame_height_(0) {}
-
-    void WaitForResolution(int width, int height) {
-      {
-        rtc::CritScope lock(&crit_);
-        if (last_initialized_frame_width_ == width &&
-            last_initialized_frame_height_ == height) {
-          return;
-        }
-      }
-      EXPECT_TRUE(
-          init_encode_called_.Wait(VideoSendStreamTest::kDefaultTimeoutMs));
-      {
-        rtc::CritScope lock(&crit_);
-        EXPECT_EQ(width, last_initialized_frame_width_);
-        EXPECT_EQ(height, last_initialized_frame_height_);
-      }
-    }
-
-   private:
-    int32_t InitEncode(const VideoCodec* config,
-                       int32_t number_of_cores,
-                       size_t max_payload_size) override {
-      rtc::CritScope lock(&crit_);
-      last_initialized_frame_width_ = config->width;
-      last_initialized_frame_height_ = config->height;
-      ++number_of_initializations_;
-      init_encode_called_.Set();
-      return FakeEncoder::InitEncode(config, number_of_cores, max_payload_size);
-    }
-
-    int32_t Encode(const VideoFrame& input_image,
-                   const CodecSpecificInfo* codec_specific_info,
-                   const std::vector<FrameType>* frame_types) override {
-      ADD_FAILURE()
-          << "Unexpected Encode call since the send stream is not started";
-      return 0;
-    }
-
-    rtc::CriticalSection crit_;
-    rtc::Event init_encode_called_;
-    size_t number_of_initializations_ RTC_GUARDED_BY(&crit_);
-    int last_initialized_frame_width_ RTC_GUARDED_BY(&crit_);
-    int last_initialized_frame_height_ RTC_GUARDED_BY(&crit_);
-  };
-
-  test::NullTransport transport;
-  EncoderObserver encoder;
-
-  task_queue_.SendTask([this, &transport, &encoder]() {
-    CreateSenderCall(Call::Config(event_log_.get()));
-    CreateSendConfig(1, 0, 0, &transport);
-    video_send_config_.encoder_settings.encoder = &encoder;
-    CreateVideoStreams();
-    CreateFrameGeneratorCapturer(kDefaultFramerate, kDefaultWidth,
-                                 kDefaultHeight);
-    frame_generator_capturer_->Start();
-  });
-
-  encoder.WaitForResolution(kDefaultWidth, kDefaultHeight);
-
-  task_queue_.SendTask([this]() {
-    frame_generator_capturer_->ChangeResolution(kDefaultWidth * 2,
-                                                kDefaultHeight * 2);
-  });
-
-  encoder.WaitForResolution(kDefaultWidth * 2, kDefaultHeight * 2);
-
-  task_queue_.SendTask([this]() {
-    DestroyStreams();
-    DestroyCalls();
-  });
-}
-
-TEST_F(VideoSendStreamTest, CanReconfigureToUseStartBitrateAbovePreviousMax) {
-  class StartBitrateObserver : public test::FakeEncoder {
-   public:
-    StartBitrateObserver()
-        : FakeEncoder(Clock::GetRealTimeClock()),
-          start_bitrate_changed_(false, false),
-          start_bitrate_kbps_(0) {}
-    int32_t InitEncode(const VideoCodec* config,
-                       int32_t number_of_cores,
-                       size_t max_payload_size) override {
-      rtc::CritScope lock(&crit_);
-      start_bitrate_kbps_ = config->startBitrate;
-      start_bitrate_changed_.Set();
-      return FakeEncoder::InitEncode(config, number_of_cores, max_payload_size);
-    }
-
-    int32_t SetRates(uint32_t new_target_bitrate, uint32_t framerate) override {
-      rtc::CritScope lock(&crit_);
-      start_bitrate_kbps_ = new_target_bitrate;
-      start_bitrate_changed_.Set();
-      return FakeEncoder::SetRates(new_target_bitrate, framerate);
-    }
-
-    int GetStartBitrateKbps() const {
-      rtc::CritScope lock(&crit_);
-      return start_bitrate_kbps_;
-    }
-
-    bool WaitForStartBitrate() {
-      return start_bitrate_changed_.Wait(
-          VideoSendStreamTest::kDefaultTimeoutMs);
-    }
-
-   private:
-    rtc::CriticalSection crit_;
-    rtc::Event start_bitrate_changed_;
-    int start_bitrate_kbps_ RTC_GUARDED_BY(crit_);
-  };
-
-  CreateSenderCall(Call::Config(event_log_.get()));
-
-  test::NullTransport transport;
-  CreateSendConfig(1, 0, 0, &transport);
-
-  Call::Config::BitrateConfig bitrate_config;
-  bitrate_config.start_bitrate_bps = 2 * video_encoder_config_.max_bitrate_bps;
-  sender_call_->SetBitrateConfig(bitrate_config);
-
-  StartBitrateObserver encoder;
-  video_send_config_.encoder_settings.encoder = &encoder;
-  // Since this test does not use a capturer, set |internal_source| = true.
-  // Encoder configuration is otherwise updated on the next video frame.
-  video_send_config_.encoder_settings.internal_source = true;
-
-  CreateVideoStreams();
-
-  EXPECT_TRUE(encoder.WaitForStartBitrate());
-  EXPECT_EQ(video_encoder_config_.max_bitrate_bps / 1000,
-            encoder.GetStartBitrateKbps());
-
-  video_encoder_config_.max_bitrate_bps = 2 * bitrate_config.start_bitrate_bps;
-  video_send_stream_->ReconfigureVideoEncoder(video_encoder_config_.Copy());
-
-  // New bitrate should be reconfigured above the previous max. As there's no
-  // network connection this shouldn't be flaky, as no bitrate should've been
-  // reported in between.
-  EXPECT_TRUE(encoder.WaitForStartBitrate());
-  EXPECT_EQ(bitrate_config.start_bitrate_bps / 1000,
-            encoder.GetStartBitrateKbps());
-
-  DestroyStreams();
-}
-
-// This test that if the encoder use an internal source, VideoEncoder::SetRates
-// will be called with zero bitrate during initialization and that
-// VideoSendStream::Stop also triggers VideoEncoder::SetRates Start to be called
-// with zero bitrate.
-TEST_F(VideoSendStreamTest, VideoSendStreamStopSetEncoderRateToZero) {
-  class StartStopBitrateObserver : public test::FakeEncoder {
-   public:
-    StartStopBitrateObserver()
-        : FakeEncoder(Clock::GetRealTimeClock()),
-          encoder_init_(false, false),
-          bitrate_changed_(false, false) {}
-    int32_t InitEncode(const VideoCodec* config,
-                       int32_t number_of_cores,
-                       size_t max_payload_size) override {
-      rtc::CritScope lock(&crit_);
-      encoder_init_.Set();
-      return FakeEncoder::InitEncode(config, number_of_cores, max_payload_size);
-    }
-
-    int32_t SetRateAllocation(const BitrateAllocation& bitrate,
-                              uint32_t framerate) override {
-      rtc::CritScope lock(&crit_);
-      bitrate_kbps_ = rtc::Optional<int>(bitrate.get_sum_kbps());
-      bitrate_changed_.Set();
-      return FakeEncoder::SetRateAllocation(bitrate, framerate);
-    }
-
-    bool WaitForEncoderInit() {
-      return encoder_init_.Wait(VideoSendStreamTest::kDefaultTimeoutMs);
-    }
-
-    bool WaitBitrateChanged(bool non_zero) {
-      do {
-        rtc::Optional<int> bitrate_kbps;
-        {
-          rtc::CritScope lock(&crit_);
-          bitrate_kbps = bitrate_kbps_;
-        }
-        if (!bitrate_kbps)
-          continue;
-
-        if ((non_zero && *bitrate_kbps > 0) ||
-            (!non_zero && *bitrate_kbps == 0)) {
-          return true;
-        }
-      } while (bitrate_changed_.Wait(VideoSendStreamTest::kDefaultTimeoutMs));
-      return false;
-    }
-
-   private:
-    rtc::CriticalSection crit_;
-    rtc::Event encoder_init_;
-    rtc::Event bitrate_changed_;
-    rtc::Optional<int> bitrate_kbps_ RTC_GUARDED_BY(crit_);
-  };
-
-  test::NullTransport transport;
-  StartStopBitrateObserver encoder;
-
-  task_queue_.SendTask([this, &transport, &encoder]() {
-    CreateSenderCall(Call::Config(event_log_.get()));
-    CreateSendConfig(1, 0, 0, &transport);
-
-    sender_call_->SignalChannelNetworkState(MediaType::VIDEO, kNetworkUp);
-
-    video_send_config_.encoder_settings.encoder = &encoder;
-    video_send_config_.encoder_settings.internal_source = true;
-
-    CreateVideoStreams();
-  });
-
-  EXPECT_TRUE(encoder.WaitForEncoderInit());
-
-  task_queue_.SendTask([this]() {
-    video_send_stream_->Start();
-  });
-  EXPECT_TRUE(encoder.WaitBitrateChanged(true));
-
-  task_queue_.SendTask([this]() {
-    video_send_stream_->Stop();
-  });
-  EXPECT_TRUE(encoder.WaitBitrateChanged(false));
-
-  task_queue_.SendTask([this]() {
-    video_send_stream_->Start();
-  });
-  EXPECT_TRUE(encoder.WaitBitrateChanged(true));
-
-  task_queue_.SendTask([this]() {
-    DestroyStreams();
-    DestroyCalls();
-  });
-}
-
-TEST_F(VideoSendStreamTest, CapturesTextureAndVideoFrames) {
-  class FrameObserver : public rtc::VideoSinkInterface<VideoFrame> {
-   public:
-    FrameObserver() : output_frame_event_(false, false) {}
-
-    void OnFrame(const VideoFrame& video_frame) override {
-      output_frames_.push_back(video_frame);
-      output_frame_event_.Set();
-    }
-
-    void WaitOutputFrame() {
-      const int kWaitFrameTimeoutMs = 3000;
-      EXPECT_TRUE(output_frame_event_.Wait(kWaitFrameTimeoutMs))
-          << "Timeout while waiting for output frames.";
-    }
-
-    const std::vector<VideoFrame>& output_frames() const {
-      return output_frames_;
-    }
-
-   private:
-    // Delivered output frames.
-    std::vector<VideoFrame> output_frames_;
-
-    // Indicate an output frame has arrived.
-    rtc::Event output_frame_event_;
-  };
-
-  test::NullTransport transport;
-  FrameObserver observer;
-  std::vector<VideoFrame> input_frames;
-
-  task_queue_.SendTask([this, &transport, &observer, &input_frames]() {
-    // Initialize send stream.
-    CreateSenderCall(Call::Config(event_log_.get()));
-
-    CreateSendConfig(1, 0, 0, &transport);
-    video_send_config_.pre_encode_callback = &observer;
-    CreateVideoStreams();
-
-    // Prepare five input frames. Send ordinary VideoFrame and texture frames
-    // alternatively.
-    int width = 168;
-    int height = 132;
-
-    input_frames.push_back(test::FakeNativeBuffer::CreateFrame(
-        width, height, 1, 1, kVideoRotation_0));
-    input_frames.push_back(test::FakeNativeBuffer::CreateFrame(
-        width, height, 2, 2, kVideoRotation_0));
-    input_frames.push_back(CreateVideoFrame(width, height, 3));
-    input_frames.push_back(CreateVideoFrame(width, height, 4));
-    input_frames.push_back(test::FakeNativeBuffer::CreateFrame(
-        width, height, 5, 5, kVideoRotation_0));
-
-    video_send_stream_->Start();
-    test::FrameForwarder forwarder;
-    video_send_stream_->SetSource(
-        &forwarder, VideoSendStream::DegradationPreference::kMaintainFramerate);
-    for (size_t i = 0; i < input_frames.size(); i++) {
-      forwarder.IncomingCapturedFrame(input_frames[i]);
-      // Wait until the output frame is received before sending the next input
-      // frame. Or the previous input frame may be replaced without delivering.
-      observer.WaitOutputFrame();
-    }
-    video_send_stream_->Stop();
-    video_send_stream_->SetSource(
-        nullptr, VideoSendStream::DegradationPreference::kMaintainFramerate);
-  });
-
-  // Test if the input and output frames are the same. render_time_ms and
-  // timestamp are not compared because capturer sets those values.
-  ExpectEqualFramesVector(input_frames, observer.output_frames());
-
-  task_queue_.SendTask([this]() {
-    DestroyStreams();
-    DestroyCalls();
-  });
-}
-
-void ExpectEqualFramesVector(const std::vector<VideoFrame>& frames1,
-                             const std::vector<VideoFrame>& frames2) {
-  EXPECT_EQ(frames1.size(), frames2.size());
-  for (size_t i = 0; i < std::min(frames1.size(), frames2.size()); ++i)
-    // Compare frame buffers, since we don't care about differing timestamps.
-    EXPECT_TRUE(test::FrameBufsEqual(frames1[i].video_frame_buffer(),
-                                     frames2[i].video_frame_buffer()));
-}
-
-VideoFrame CreateVideoFrame(int width, int height, uint8_t data) {
-  const int kSizeY = width * height * 2;
-  std::unique_ptr<uint8_t[]> buffer(new uint8_t[kSizeY]);
-  memset(buffer.get(), data, kSizeY);
-  VideoFrame frame(I420Buffer::Create(width, height), kVideoRotation_0, data);
-  frame.set_timestamp(data);
-  // Use data as a ms timestamp.
-  frame.set_timestamp_us(data * rtc::kNumMicrosecsPerMillisec);
-  return frame;
-}
-
-TEST_F(VideoSendStreamTest, EncoderIsProperlyInitializedAndDestroyed) {
-  class EncoderStateObserver : public test::SendTest, public VideoEncoder {
-   public:
-    explicit EncoderStateObserver(
-        test::SingleThreadedTaskQueueForTesting* task_queue)
-        : SendTest(kDefaultTimeoutMs),
-          task_queue_(task_queue),
-          stream_(nullptr),
-          initialized_(false),
-          callback_registered_(false),
-          num_releases_(0),
-          released_(false) {}
-
-    bool IsReleased() {
-      rtc::CritScope lock(&crit_);
-      return released_;
-    }
-
-    bool IsReadyForEncode() {
-      rtc::CritScope lock(&crit_);
-      return initialized_ && callback_registered_;
-    }
-
-    size_t num_releases() {
-      rtc::CritScope lock(&crit_);
-      return num_releases_;
-    }
-
-   private:
-    int32_t InitEncode(const VideoCodec* codecSettings,
-                       int32_t numberOfCores,
-                       size_t maxPayloadSize) override {
-      rtc::CritScope lock(&crit_);
-      EXPECT_FALSE(initialized_);
-      initialized_ = true;
-      released_ = false;
-      return 0;
-    }
-
-    int32_t Encode(const VideoFrame& inputImage,
-                   const CodecSpecificInfo* codecSpecificInfo,
-                   const std::vector<FrameType>* frame_types) override {
-      EXPECT_TRUE(IsReadyForEncode());
-
-      observation_complete_.Set();
-      return 0;
-    }
-
-    int32_t RegisterEncodeCompleteCallback(
-        EncodedImageCallback* callback) override {
-      rtc::CritScope lock(&crit_);
-      EXPECT_TRUE(initialized_);
-      callback_registered_ = true;
-      return 0;
-    }
-
-    int32_t Release() override {
-      rtc::CritScope lock(&crit_);
-      EXPECT_TRUE(IsReadyForEncode());
-      EXPECT_FALSE(released_);
-      initialized_ = false;
-      callback_registered_ = false;
-      released_ = true;
-      ++num_releases_;
-      return 0;
-    }
-
-    int32_t SetChannelParameters(uint32_t packetLoss, int64_t rtt) override {
-      EXPECT_TRUE(IsReadyForEncode());
-      return 0;
-    }
-
-    int32_t SetRates(uint32_t newBitRate, uint32_t frameRate) override {
-      EXPECT_TRUE(IsReadyForEncode());
-      return 0;
-    }
-
-    void OnVideoStreamsCreated(
-        VideoSendStream* send_stream,
-        const std::vector<VideoReceiveStream*>& receive_streams) override {
-      stream_ = send_stream;
-    }
-
-    void ModifyVideoConfigs(
-        VideoSendStream::Config* send_config,
-        std::vector<VideoReceiveStream::Config>* receive_configs,
-        VideoEncoderConfig* encoder_config) override {
-      send_config->encoder_settings.encoder = this;
-      encoder_config_ = encoder_config->Copy();
-    }
-
-    void PerformTest() override {
-      EXPECT_TRUE(Wait()) << "Timed out while waiting for Encode.";
-
-      task_queue_->SendTask([this]() {
-        EXPECT_EQ(0u, num_releases());
-        stream_->ReconfigureVideoEncoder(std::move(encoder_config_));
-        EXPECT_EQ(0u, num_releases());
-        stream_->Stop();
-        // Encoder should not be released before destroying the VideoSendStream.
-        EXPECT_FALSE(IsReleased());
-        EXPECT_TRUE(IsReadyForEncode());
-        stream_->Start();
-      });
-
-      // Sanity check, make sure we still encode frames with this encoder.
-      EXPECT_TRUE(Wait()) << "Timed out while waiting for Encode.";
-    }
-
-    test::SingleThreadedTaskQueueForTesting* const task_queue_;
-    rtc::CriticalSection crit_;
-    VideoSendStream* stream_;
-    bool initialized_ RTC_GUARDED_BY(crit_);
-    bool callback_registered_ RTC_GUARDED_BY(crit_);
-    size_t num_releases_ RTC_GUARDED_BY(crit_);
-    bool released_ RTC_GUARDED_BY(crit_);
-    VideoEncoderConfig encoder_config_;
-  } test_encoder(&task_queue_);
-
-  RunBaseTest(&test_encoder);
-
-  EXPECT_TRUE(test_encoder.IsReleased());
-  EXPECT_EQ(1u, test_encoder.num_releases());
-}
-
-TEST_F(VideoSendStreamTest, EncoderSetupPropagatesCommonEncoderConfigValues) {
-  class VideoCodecConfigObserver : public test::SendTest,
-                                   public test::FakeEncoder {
-   public:
-    VideoCodecConfigObserver()
-        : SendTest(kDefaultTimeoutMs),
-          FakeEncoder(Clock::GetRealTimeClock()),
-          init_encode_event_(false, false),
-          num_initializations_(0),
-          stream_(nullptr) {}
-
-   private:
-    void ModifyVideoConfigs(
-        VideoSendStream::Config* send_config,
-        std::vector<VideoReceiveStream::Config>* receive_configs,
-        VideoEncoderConfig* encoder_config) override {
-      send_config->encoder_settings.encoder = this;
-      encoder_config->max_bitrate_bps = kFirstMaxBitrateBps;
-      encoder_config_ = encoder_config->Copy();
-    }
-
-    void OnVideoStreamsCreated(
-        VideoSendStream* send_stream,
-        const std::vector<VideoReceiveStream*>& receive_streams) override {
-      stream_ = send_stream;
-    }
-
-    int32_t InitEncode(const VideoCodec* config,
-                       int32_t number_of_cores,
-                       size_t max_payload_size) override {
-      if (num_initializations_ == 0) {
-        // Verify default values.
-        EXPECT_EQ(kFirstMaxBitrateBps / 1000, config->maxBitrate);
-      } else {
-        // Verify that changed values are propagated.
-        EXPECT_EQ(kSecondMaxBitrateBps / 1000, config->maxBitrate);
-      }
-      ++num_initializations_;
-      init_encode_event_.Set();
-      return FakeEncoder::InitEncode(config, number_of_cores, max_payload_size);
-    }
-
-    void PerformTest() override {
-      EXPECT_TRUE(init_encode_event_.Wait(kDefaultTimeoutMs));
-      EXPECT_EQ(1u, num_initializations_) << "VideoEncoder not initialized.";
-
-      encoder_config_.max_bitrate_bps = kSecondMaxBitrateBps;
-      stream_->ReconfigureVideoEncoder(std::move(encoder_config_));
-      EXPECT_TRUE(init_encode_event_.Wait(kDefaultTimeoutMs));
-      EXPECT_EQ(2u, num_initializations_)
-          << "ReconfigureVideoEncoder did not reinitialize the encoder with "
-             "new encoder settings.";
-    }
-
-    const uint32_t kFirstMaxBitrateBps = 1000000;
-    const uint32_t kSecondMaxBitrateBps = 2000000;
-
-    rtc::Event init_encode_event_;
-    size_t num_initializations_;
-    VideoSendStream* stream_;
-    VideoEncoderConfig encoder_config_;
-  } test;
-
-  RunBaseTest(&test);
-}
-
-static const size_t kVideoCodecConfigObserverNumberOfTemporalLayers = 4;
-template <typename T>
-class VideoCodecConfigObserver : public test::SendTest,
-                                 public test::FakeEncoder {
- public:
-  VideoCodecConfigObserver(VideoCodecType video_codec_type,
-                           const char* codec_name)
-      : SendTest(VideoSendStreamTest::kDefaultTimeoutMs),
-        FakeEncoder(Clock::GetRealTimeClock()),
-        video_codec_type_(video_codec_type),
-        codec_name_(codec_name),
-        init_encode_event_(false, false),
-        num_initializations_(0),
-        stream_(nullptr) {
-    memset(&encoder_settings_, 0, sizeof(encoder_settings_));
-  }
-
- private:
-  class VideoStreamFactory
-      : public VideoEncoderConfig::VideoStreamFactoryInterface {
-   public:
-    VideoStreamFactory() {}
-
-   private:
-    std::vector<VideoStream> CreateEncoderStreams(
-        int width,
-        int height,
-        const VideoEncoderConfig& encoder_config) override {
-      std::vector<VideoStream> streams =
-          test::CreateVideoStreams(width, height, encoder_config);
-      for (size_t i = 0; i < streams.size(); ++i) {
-        streams[i].temporal_layer_thresholds_bps.resize(
-            kVideoCodecConfigObserverNumberOfTemporalLayers - 1);
-      }
-      return streams;
-    }
-  };
-
-  void ModifyVideoConfigs(
-      VideoSendStream::Config* send_config,
-      std::vector<VideoReceiveStream::Config>* receive_configs,
-      VideoEncoderConfig* encoder_config) override {
-    send_config->encoder_settings.encoder = this;
-    send_config->encoder_settings.payload_name = codec_name_;
-
-    encoder_config->encoder_specific_settings = GetEncoderSpecificSettings();
-    encoder_config->video_stream_factory =
-        new rtc::RefCountedObject<VideoStreamFactory>();
-    encoder_config_ = encoder_config->Copy();
-  }
-
-  void OnVideoStreamsCreated(
-      VideoSendStream* send_stream,
-      const std::vector<VideoReceiveStream*>& receive_streams) override {
-    stream_ = send_stream;
-  }
-
-  int32_t InitEncode(const VideoCodec* config,
-                     int32_t number_of_cores,
-                     size_t max_payload_size) override {
-    EXPECT_EQ(video_codec_type_, config->codecType);
-    VerifyCodecSpecifics(*config);
-    ++num_initializations_;
-    init_encode_event_.Set();
-    return FakeEncoder::InitEncode(config, number_of_cores, max_payload_size);
-  }
-
-  void VerifyCodecSpecifics(const VideoCodec& config) const;
-  rtc::scoped_refptr<VideoEncoderConfig::EncoderSpecificSettings>
-  GetEncoderSpecificSettings() const;
-
-  void PerformTest() override {
-    EXPECT_TRUE(
-        init_encode_event_.Wait(VideoSendStreamTest::kDefaultTimeoutMs));
-    ASSERT_EQ(1u, num_initializations_) << "VideoEncoder not initialized.";
-
-    encoder_settings_.frameDroppingOn = true;
-    encoder_config_.encoder_specific_settings = GetEncoderSpecificSettings();
-    stream_->ReconfigureVideoEncoder(std::move(encoder_config_));
-    ASSERT_TRUE(
-        init_encode_event_.Wait(VideoSendStreamTest::kDefaultTimeoutMs));
-    EXPECT_EQ(2u, num_initializations_)
-        << "ReconfigureVideoEncoder did not reinitialize the encoder with "
-           "new encoder settings.";
-  }
-
-  int32_t Encode(const VideoFrame& input_image,
-                 const CodecSpecificInfo* codec_specific_info,
-                 const std::vector<FrameType>* frame_types) override {
-    // Silently skip the encode, FakeEncoder::Encode doesn't produce VP8.
-    return 0;
-  }
-
-  T encoder_settings_;
-  const VideoCodecType video_codec_type_;
-  const char* const codec_name_;
-  rtc::Event init_encode_event_;
-  size_t num_initializations_;
-  VideoSendStream* stream_;
-  VideoEncoderConfig encoder_config_;
-};
-
-template <>
-void VideoCodecConfigObserver<VideoCodecH264>::VerifyCodecSpecifics(
-    const VideoCodec& config) const {
-  EXPECT_EQ(
-      0, memcmp(&config.H264(), &encoder_settings_, sizeof(encoder_settings_)));
-}
-
-template <>
-rtc::scoped_refptr<VideoEncoderConfig::EncoderSpecificSettings>
-VideoCodecConfigObserver<VideoCodecH264>::GetEncoderSpecificSettings() const {
-  return new rtc::RefCountedObject<
-      VideoEncoderConfig::H264EncoderSpecificSettings>(encoder_settings_);
-}
-
-template <>
-void VideoCodecConfigObserver<VideoCodecVP8>::VerifyCodecSpecifics(
-    const VideoCodec& config) const {
-  // Check that the number of temporal layers has propagated properly to
-  // VideoCodec.
-  EXPECT_EQ(kVideoCodecConfigObserverNumberOfTemporalLayers,
-            config.VP8().numberOfTemporalLayers);
-
-  for (unsigned char i = 0; i < config.numberOfSimulcastStreams; ++i) {
-    EXPECT_EQ(kVideoCodecConfigObserverNumberOfTemporalLayers,
-              config.simulcastStream[i].numberOfTemporalLayers);
-  }
-
-  // Set expected temporal layers as they should have been set when
-  // reconfiguring the encoder and not match the set config. Also copy the
-  // TemporalLayersFactory pointer that has been injected by VideoStreamEncoder.
-  VideoCodecVP8 encoder_settings = encoder_settings_;
-  encoder_settings.numberOfTemporalLayers =
-      kVideoCodecConfigObserverNumberOfTemporalLayers;
-  encoder_settings.tl_factory = config.VP8().tl_factory;
-  EXPECT_EQ(
-      0, memcmp(&config.VP8(), &encoder_settings, sizeof(encoder_settings_)));
-}
-
-template <>
-rtc::scoped_refptr<VideoEncoderConfig::EncoderSpecificSettings>
-VideoCodecConfigObserver<VideoCodecVP8>::GetEncoderSpecificSettings() const {
-  return new rtc::RefCountedObject<
-      VideoEncoderConfig::Vp8EncoderSpecificSettings>(encoder_settings_);
-}
-
-template <>
-void VideoCodecConfigObserver<VideoCodecVP9>::VerifyCodecSpecifics(
-    const VideoCodec& config) const {
-  // Check that the number of temporal layers has propagated properly to
-  // VideoCodec.
-  EXPECT_EQ(kVideoCodecConfigObserverNumberOfTemporalLayers,
-            config.VP9().numberOfTemporalLayers);
-
-  for (unsigned char i = 0; i < config.numberOfSimulcastStreams; ++i) {
-    EXPECT_EQ(kVideoCodecConfigObserverNumberOfTemporalLayers,
-              config.simulcastStream[i].numberOfTemporalLayers);
-  }
-
-  // Set expected temporal layers as they should have been set when
-  // reconfiguring the encoder and not match the set config.
-  VideoCodecVP9 encoder_settings = encoder_settings_;
-  encoder_settings.numberOfTemporalLayers =
-      kVideoCodecConfigObserverNumberOfTemporalLayers;
-  EXPECT_EQ(
-      0, memcmp(&(config.VP9()), &encoder_settings, sizeof(encoder_settings_)));
-}
-
-template <>
-rtc::scoped_refptr<VideoEncoderConfig::EncoderSpecificSettings>
-VideoCodecConfigObserver<VideoCodecVP9>::GetEncoderSpecificSettings() const {
-  return new rtc::RefCountedObject<
-      VideoEncoderConfig::Vp9EncoderSpecificSettings>(encoder_settings_);
-}
-
-TEST_F(VideoSendStreamTest, EncoderSetupPropagatesVp8Config) {
-  VideoCodecConfigObserver<VideoCodecVP8> test(kVideoCodecVP8, "VP8");
-  RunBaseTest(&test);
-}
-
-TEST_F(VideoSendStreamTest, EncoderSetupPropagatesVp9Config) {
-  VideoCodecConfigObserver<VideoCodecVP9> test(kVideoCodecVP9, "VP9");
-  RunBaseTest(&test);
-}
-
-TEST_F(VideoSendStreamTest, EncoderSetupPropagatesH264Config) {
-  VideoCodecConfigObserver<VideoCodecH264> test(kVideoCodecH264, "H264");
-  RunBaseTest(&test);
-}
-
-TEST_F(VideoSendStreamTest, RtcpSenderReportContainsMediaBytesSent) {
-  class RtcpSenderReportTest : public test::SendTest {
-   public:
-    RtcpSenderReportTest() : SendTest(kDefaultTimeoutMs),
-                             rtp_packets_sent_(0),
-                             media_bytes_sent_(0) {}
-
-   private:
-    Action OnSendRtp(const uint8_t* packet, size_t length) override {
-      rtc::CritScope lock(&crit_);
-      RTPHeader header;
-      EXPECT_TRUE(parser_->Parse(packet, length, &header));
-      ++rtp_packets_sent_;
-      media_bytes_sent_ += length - header.headerLength - header.paddingLength;
-      return SEND_PACKET;
-    }
-
-    Action OnSendRtcp(const uint8_t* packet, size_t length) override {
-      rtc::CritScope lock(&crit_);
-      test::RtcpPacketParser parser;
-      EXPECT_TRUE(parser.Parse(packet, length));
-
-      if (parser.sender_report()->num_packets() > 0) {
-        // Only compare sent media bytes if SenderPacketCount matches the
-        // number of sent rtp packets (a new rtp packet could be sent before
-        // the rtcp packet).
-        if (parser.sender_report()->sender_octet_count() > 0 &&
-            parser.sender_report()->sender_packet_count() ==
-                rtp_packets_sent_) {
-          EXPECT_EQ(media_bytes_sent_,
-                    parser.sender_report()->sender_octet_count());
-          observation_complete_.Set();
-        }
-      }
-
-      return SEND_PACKET;
-    }
-
-    void PerformTest() override {
-      EXPECT_TRUE(Wait()) << "Timed out while waiting for RTCP sender report.";
-    }
-
-    rtc::CriticalSection crit_;
-    size_t rtp_packets_sent_ RTC_GUARDED_BY(&crit_);
-    size_t media_bytes_sent_ RTC_GUARDED_BY(&crit_);
-  } test;
-
-  RunBaseTest(&test);
-}
-
-TEST_F(VideoSendStreamTest, TranslatesTwoLayerScreencastToTargetBitrate) {
-  static const int kScreencastTargetBitrateKbps = 200;
-
-  class VideoStreamFactory
-      : public VideoEncoderConfig::VideoStreamFactoryInterface {
-   public:
-    VideoStreamFactory() {}
-
-   private:
-    std::vector<VideoStream> CreateEncoderStreams(
-        int width,
-        int height,
-        const VideoEncoderConfig& encoder_config) override {
-      std::vector<VideoStream> streams =
-          test::CreateVideoStreams(width, height, encoder_config);
-      EXPECT_TRUE(streams[0].temporal_layer_thresholds_bps.empty());
-      streams[0].temporal_layer_thresholds_bps.push_back(
-          kScreencastTargetBitrateKbps * 1000);
-      return streams;
-    }
-  };
-
-  class ScreencastTargetBitrateTest : public test::SendTest,
-                                      public test::FakeEncoder {
-   public:
-    ScreencastTargetBitrateTest()
-        : SendTest(kDefaultTimeoutMs),
-          test::FakeEncoder(Clock::GetRealTimeClock()) {}
-
-   private:
-    int32_t InitEncode(const VideoCodec* config,
-                       int32_t number_of_cores,
-                       size_t max_payload_size) override {
-      EXPECT_EQ(static_cast<unsigned int>(kScreencastTargetBitrateKbps),
-                config->targetBitrate);
-      observation_complete_.Set();
-      return test::FakeEncoder::InitEncode(
-          config, number_of_cores, max_payload_size);
-    }
-    void ModifyVideoConfigs(
-        VideoSendStream::Config* send_config,
-        std::vector<VideoReceiveStream::Config>* receive_configs,
-        VideoEncoderConfig* encoder_config) override {
-      send_config->encoder_settings.encoder = this;
-      EXPECT_EQ(1u, encoder_config->number_of_streams);
-      encoder_config->video_stream_factory =
-          new rtc::RefCountedObject<VideoStreamFactory>();
-      encoder_config->content_type = VideoEncoderConfig::ContentType::kScreen;
-    }
-
-    void PerformTest() override {
-      EXPECT_TRUE(Wait())
-          << "Timed out while waiting for the encoder to be initialized.";
-    }
-  } test;
-
-  RunBaseTest(&test);
-}
-
-TEST_F(VideoSendStreamTest, ReconfigureBitratesSetsEncoderBitratesCorrectly) {
-  // These are chosen to be "kind of odd" to not be accidentally checked against
-  // default values.
-  static const int kMinBitrateKbps = 137;
-  static const int kStartBitrateKbps = 345;
-  static const int kLowerMaxBitrateKbps = 312;
-  static const int kMaxBitrateKbps = 413;
-  static const int kIncreasedStartBitrateKbps = 451;
-  static const int kIncreasedMaxBitrateKbps = 597;
-  class EncoderBitrateThresholdObserver : public test::SendTest,
-                                          public test::FakeEncoder {
-   public:
-    explicit EncoderBitrateThresholdObserver(
-        test::SingleThreadedTaskQueueForTesting* task_queue)
-        : SendTest(kDefaultTimeoutMs),
-          FakeEncoder(Clock::GetRealTimeClock()),
-          task_queue_(task_queue),
-          init_encode_event_(false, false),
-          bitrate_changed_event_(false, false),
-          target_bitrate_(0),
-          num_initializations_(0),
-          call_(nullptr),
-          send_stream_(nullptr) {}
-
-   private:
-    int32_t InitEncode(const VideoCodec* codecSettings,
-                       int32_t numberOfCores,
-                       size_t maxPayloadSize) override {
-      EXPECT_GE(codecSettings->startBitrate, codecSettings->minBitrate);
-      EXPECT_LE(codecSettings->startBitrate, codecSettings->maxBitrate);
-      if (num_initializations_ == 0) {
-        EXPECT_EQ(static_cast<unsigned int>(kMinBitrateKbps),
-                  codecSettings->minBitrate);
-        EXPECT_EQ(static_cast<unsigned int>(kStartBitrateKbps),
-                  codecSettings->startBitrate);
-        EXPECT_EQ(static_cast<unsigned int>(kMaxBitrateKbps),
-                  codecSettings->maxBitrate);
-        observation_complete_.Set();
-      } else if (num_initializations_ == 1) {
-        EXPECT_EQ(static_cast<unsigned int>(kLowerMaxBitrateKbps),
-                  codecSettings->maxBitrate);
-        // The start bitrate should be kept (-1) and capped to the max bitrate.
-        // Since this is not an end-to-end call no receiver should have been
-        // returning a REMB that could lower this estimate.
-        EXPECT_EQ(codecSettings->startBitrate, codecSettings->maxBitrate);
-      } else if (num_initializations_ == 2) {
-        EXPECT_EQ(static_cast<unsigned int>(kIncreasedMaxBitrateKbps),
-                  codecSettings->maxBitrate);
-        // The start bitrate will be whatever the rate BitRateController
-        // has currently configured but in the span of the set max and min
-        // bitrate.
-      }
-      ++num_initializations_;
-      init_encode_event_.Set();
-
-      return FakeEncoder::InitEncode(codecSettings, numberOfCores,
-                                     maxPayloadSize);
-    }
-
-    int32_t SetRateAllocation(const BitrateAllocation& bitrate,
-                              uint32_t frameRate) override {
-      {
-        rtc::CritScope lock(&crit_);
-        if (target_bitrate_ == bitrate.get_sum_kbps()) {
-          return FakeEncoder::SetRateAllocation(bitrate, frameRate);
-        }
-        target_bitrate_ = bitrate.get_sum_kbps();
-      }
-      bitrate_changed_event_.Set();
-      return FakeEncoder::SetRateAllocation(bitrate, frameRate);
-    }
-
-    void WaitForSetRates(uint32_t expected_bitrate) {
-      EXPECT_TRUE(
-          bitrate_changed_event_.Wait(VideoSendStreamTest::kDefaultTimeoutMs))
-          << "Timed out while waiting encoder rate to be set.";
-      rtc::CritScope lock(&crit_);
-      EXPECT_EQ(expected_bitrate, target_bitrate_);
-    }
-
-    Call::Config GetSenderCallConfig() override {
-      Call::Config config(event_log_.get());
-      config.bitrate_config.min_bitrate_bps = kMinBitrateKbps * 1000;
-      config.bitrate_config.start_bitrate_bps = kStartBitrateKbps * 1000;
-      config.bitrate_config.max_bitrate_bps = kMaxBitrateKbps * 1000;
-      return config;
-    }
-
-    class VideoStreamFactory
-        : public VideoEncoderConfig::VideoStreamFactoryInterface {
-     public:
-      explicit VideoStreamFactory(int min_bitrate_bps)
-          : min_bitrate_bps_(min_bitrate_bps) {}
-
-     private:
-      std::vector<VideoStream> CreateEncoderStreams(
-          int width,
-          int height,
-          const VideoEncoderConfig& encoder_config) override {
-        std::vector<VideoStream> streams =
-            test::CreateVideoStreams(width, height, encoder_config);
-        streams[0].min_bitrate_bps = min_bitrate_bps_;
-        return streams;
-      }
-
-      const int min_bitrate_bps_;
-    };
-
-    void ModifyVideoConfigs(
-        VideoSendStream::Config* send_config,
-        std::vector<VideoReceiveStream::Config>* receive_configs,
-        VideoEncoderConfig* encoder_config) override {
-      send_config->encoder_settings.encoder = this;
-      // Set bitrates lower/higher than min/max to make sure they are properly
-      // capped.
-      encoder_config->max_bitrate_bps = kMaxBitrateKbps * 1000;
-      // Create a new StreamFactory to be able to set
-      // |VideoStream.min_bitrate_bps|.
-      encoder_config->video_stream_factory =
-          new rtc::RefCountedObject<VideoStreamFactory>(kMinBitrateKbps * 1000);
-      encoder_config_ = encoder_config->Copy();
-    }
-
-    void OnCallsCreated(Call* sender_call, Call* receiver_call) override {
-      call_ = sender_call;
-    }
-
-    void OnVideoStreamsCreated(
-        VideoSendStream* send_stream,
-        const std::vector<VideoReceiveStream*>& receive_streams) override {
-      send_stream_ = send_stream;
-    }
-
-    void PerformTest() override {
-      ASSERT_TRUE(
-          init_encode_event_.Wait(VideoSendStreamTest::kDefaultTimeoutMs))
-          << "Timed out while waiting for encoder to be configured.";
-      WaitForSetRates(kStartBitrateKbps);
-      Call::Config::BitrateConfig bitrate_config;
-      bitrate_config.start_bitrate_bps = kIncreasedStartBitrateKbps * 1000;
-      bitrate_config.max_bitrate_bps = kIncreasedMaxBitrateKbps * 1000;
-      task_queue_->SendTask([this, &bitrate_config]() {
-        call_->SetBitrateConfig(bitrate_config);
-      });
-      // Encoder rate is capped by EncoderConfig max_bitrate_bps.
-      WaitForSetRates(kMaxBitrateKbps);
-      encoder_config_.max_bitrate_bps = kLowerMaxBitrateKbps * 1000;
-      send_stream_->ReconfigureVideoEncoder(encoder_config_.Copy());
-      ASSERT_TRUE(
-          init_encode_event_.Wait(VideoSendStreamTest::kDefaultTimeoutMs));
-      EXPECT_EQ(2, num_initializations_)
-          << "Encoder should have been reconfigured with the new value.";
-      WaitForSetRates(kLowerMaxBitrateKbps);
-
-      encoder_config_.max_bitrate_bps = kIncreasedMaxBitrateKbps * 1000;
-      send_stream_->ReconfigureVideoEncoder(encoder_config_.Copy());
-      ASSERT_TRUE(
-          init_encode_event_.Wait(VideoSendStreamTest::kDefaultTimeoutMs));
-      EXPECT_EQ(3, num_initializations_)
-          << "Encoder should have been reconfigured with the new value.";
-      // Expected target bitrate is the start bitrate set in the call to
-      // call_->SetBitrateConfig.
-      WaitForSetRates(kIncreasedStartBitrateKbps);
-    }
-
-    test::SingleThreadedTaskQueueForTesting* const task_queue_;
-    rtc::Event init_encode_event_;
-    rtc::Event bitrate_changed_event_;
-    rtc::CriticalSection crit_;
-    uint32_t target_bitrate_ RTC_GUARDED_BY(&crit_);
-
-    int num_initializations_;
-    webrtc::Call* call_;
-    webrtc::VideoSendStream* send_stream_;
-    webrtc::VideoEncoderConfig encoder_config_;
-  } test(&task_queue_);
-
-  RunBaseTest(&test);
-}
-
-TEST_F(VideoSendStreamTest, ReportsSentResolution) {
-  static const size_t kNumStreams = 3;
-  // Unusual resolutions to make sure that they are the ones being reported.
-  static const struct {
-    int width;
-    int height;
-  } kEncodedResolution[kNumStreams] = {
-      {241, 181}, {300, 121}, {121, 221}};
-  class ScreencastTargetBitrateTest : public test::SendTest,
-                                      public test::FakeEncoder {
-   public:
-    ScreencastTargetBitrateTest()
-        : SendTest(kDefaultTimeoutMs),
-          test::FakeEncoder(Clock::GetRealTimeClock()),
-          send_stream_(nullptr) {}
-
-   private:
-    int32_t Encode(const VideoFrame& input_image,
-                   const CodecSpecificInfo* codecSpecificInfo,
-                   const std::vector<FrameType>* frame_types) override {
-      CodecSpecificInfo specifics;
-      specifics.codecType = kVideoCodecGeneric;
-
-      uint8_t buffer[16] = {0};
-      EncodedImage encoded(buffer, sizeof(buffer), sizeof(buffer));
-      encoded._timeStamp = input_image.timestamp();
-      encoded.capture_time_ms_ = input_image.render_time_ms();
-
-      for (size_t i = 0; i < kNumStreams; ++i) {
-        specifics.codecSpecific.generic.simulcast_idx = static_cast<uint8_t>(i);
-        encoded._frameType = (*frame_types)[i];
-        encoded._encodedWidth = kEncodedResolution[i].width;
-        encoded._encodedHeight = kEncodedResolution[i].height;
-        EncodedImageCallback* callback;
-        {
-          rtc::CritScope cs(&crit_sect_);
-          callback = callback_;
-        }
-        RTC_DCHECK(callback);
-        if (callback->OnEncodedImage(encoded, &specifics, nullptr).error !=
-            EncodedImageCallback::Result::OK) {
-          return -1;
-        }
-      }
-
-      observation_complete_.Set();
-      return 0;
-    }
-    void ModifyVideoConfigs(
-        VideoSendStream::Config* send_config,
-        std::vector<VideoReceiveStream::Config>* receive_configs,
-        VideoEncoderConfig* encoder_config) override {
-      send_config->encoder_settings.encoder = this;
-      EXPECT_EQ(kNumStreams, encoder_config->number_of_streams);
-    }
-
-    size_t GetNumVideoStreams() const override { return kNumStreams; }
-
-    void PerformTest() override {
-      EXPECT_TRUE(Wait())
-          << "Timed out while waiting for the encoder to send one frame.";
-      VideoSendStream::Stats stats = send_stream_->GetStats();
-
-      for (size_t i = 0; i < kNumStreams; ++i) {
-        ASSERT_TRUE(stats.substreams.find(kVideoSendSsrcs[i]) !=
-                    stats.substreams.end())
-            << "No stats for SSRC: " << kVideoSendSsrcs[i]
-            << ", stats should exist as soon as frames have been encoded.";
-        VideoSendStream::StreamStats ssrc_stats =
-            stats.substreams[kVideoSendSsrcs[i]];
-        EXPECT_EQ(kEncodedResolution[i].width, ssrc_stats.width);
-        EXPECT_EQ(kEncodedResolution[i].height, ssrc_stats.height);
-      }
-    }
-
-    void OnVideoStreamsCreated(
-        VideoSendStream* send_stream,
-        const std::vector<VideoReceiveStream*>& receive_streams) override {
-      send_stream_ = send_stream;
-    }
-
-    VideoSendStream* send_stream_;
-  } test;
-
-  RunBaseTest(&test);
-}
-
-#if !defined(RTC_DISABLE_VP9)
-class Vp9HeaderObserver : public test::SendTest {
- public:
-  Vp9HeaderObserver()
-      : SendTest(VideoSendStreamTest::kLongTimeoutMs),
-        vp9_encoder_(VP9Encoder::Create()),
-        vp9_settings_(VideoEncoder::GetDefaultVp9Settings()),
-        packets_sent_(0),
-        frames_sent_(0),
-        expected_width_(0),
-        expected_height_(0) {}
-
-  virtual void ModifyVideoConfigsHook(
-      VideoSendStream::Config* send_config,
-      std::vector<VideoReceiveStream::Config>* receive_configs,
-      VideoEncoderConfig* encoder_config) {}
-
-  virtual void InspectHeader(const RTPVideoHeaderVP9& vp9) = 0;
-
- private:
-  const int kVp9PayloadType = test::CallTest::kVideoSendPayloadType;
-
-  class VideoStreamFactory
-      : public VideoEncoderConfig::VideoStreamFactoryInterface {
-   public:
-    explicit VideoStreamFactory(size_t number_of_temporal_layers)
-        : number_of_temporal_layers_(number_of_temporal_layers) {}
-
-   private:
-    std::vector<VideoStream> CreateEncoderStreams(
-        int width,
-        int height,
-        const VideoEncoderConfig& encoder_config) override {
-      std::vector<VideoStream> streams =
-          test::CreateVideoStreams(width, height, encoder_config);
-      streams[0].temporal_layer_thresholds_bps.resize(
-          number_of_temporal_layers_ - 1);
-      return streams;
-    }
-
-    const size_t number_of_temporal_layers_;
-  };
-
-  void ModifyVideoConfigs(
-      VideoSendStream::Config* send_config,
-      std::vector<VideoReceiveStream::Config>* receive_configs,
-      VideoEncoderConfig* encoder_config) override {
-    send_config->encoder_settings.encoder = vp9_encoder_.get();
-    send_config->encoder_settings.payload_name = "VP9";
-    send_config->encoder_settings.payload_type = kVp9PayloadType;
-    ModifyVideoConfigsHook(send_config, receive_configs, encoder_config);
-    encoder_config->encoder_specific_settings = new rtc::RefCountedObject<
-      VideoEncoderConfig::Vp9EncoderSpecificSettings>(vp9_settings_);
-    EXPECT_EQ(1u, encoder_config->number_of_streams);
-    encoder_config->video_stream_factory =
-        new rtc::RefCountedObject<VideoStreamFactory>(
-            vp9_settings_.numberOfTemporalLayers);
-    encoder_config_ = encoder_config->Copy();
-  }
-
-  void ModifyVideoCaptureStartResolution(int* width,
-                                         int* height,
-                                         int* frame_rate) override {
-    expected_width_ = *width;
-    expected_height_ = *height;
-  }
-
-  void PerformTest() override {
-    EXPECT_TRUE(Wait()) << "Test timed out waiting for VP9 packet, num frames "
-                        << frames_sent_;
-  }
-
-  Action OnSendRtp(const uint8_t* packet, size_t length) override {
-    RTPHeader header;
-    EXPECT_TRUE(parser_->Parse(packet, length, &header));
-
-    EXPECT_EQ(kVp9PayloadType, header.payloadType);
-    const uint8_t* payload = packet + header.headerLength;
-    size_t payload_length = length - header.headerLength - header.paddingLength;
-
-    bool new_packet = packets_sent_ == 0 ||
-                      IsNewerSequenceNumber(header.sequenceNumber,
-                                            last_header_.sequenceNumber);
-    if (payload_length > 0 && new_packet) {
-      RtpDepacketizer::ParsedPayload parsed;
-      RtpDepacketizerVp9 depacketizer;
-      EXPECT_TRUE(depacketizer.Parse(&parsed, payload, payload_length));
-      EXPECT_EQ(RtpVideoCodecTypes::kRtpVideoVp9, parsed.type.Video.codec);
-      // Verify common fields for all configurations.
-      VerifyCommonHeader(parsed.type.Video.codecHeader.VP9);
-      CompareConsecutiveFrames(header, parsed.type.Video);
-      // Verify configuration specific settings.
-      InspectHeader(parsed.type.Video.codecHeader.VP9);
-
-      ++packets_sent_;
-      if (header.markerBit) {
-        ++frames_sent_;
-      }
-      last_header_ = header;
-      last_vp9_ = parsed.type.Video.codecHeader.VP9;
-    }
-    return SEND_PACKET;
-  }
-
- protected:
-  bool ContinuousPictureId(const RTPVideoHeaderVP9& vp9) const {
-    if (last_vp9_.picture_id > vp9.picture_id) {
-      return vp9.picture_id == 0;  // Wrap.
-    } else {
-      return vp9.picture_id == last_vp9_.picture_id + 1;
-    }
-  }
-
-  void VerifySpatialIdxWithinFrame(const RTPVideoHeaderVP9& vp9) const {
-    bool new_layer = vp9.spatial_idx != last_vp9_.spatial_idx;
-    EXPECT_EQ(new_layer, vp9.beginning_of_frame);
-    EXPECT_EQ(new_layer, last_vp9_.end_of_frame);
-    EXPECT_EQ(new_layer ? last_vp9_.spatial_idx + 1 : last_vp9_.spatial_idx,
-              vp9.spatial_idx);
-  }
-
-  void VerifyFixedTemporalLayerStructure(const RTPVideoHeaderVP9& vp9,
-                                         uint8_t num_layers) const {
-    switch (num_layers) {
-      case 0:
-        VerifyTemporalLayerStructure0(vp9);
-        break;
-      case 1:
-        VerifyTemporalLayerStructure1(vp9);
-        break;
-      case 2:
-        VerifyTemporalLayerStructure2(vp9);
-        break;
-      case 3:
-        VerifyTemporalLayerStructure3(vp9);
-        break;
-      default:
-        RTC_NOTREACHED();
-    }
-  }
-
-  void VerifyTemporalLayerStructure0(const RTPVideoHeaderVP9& vp9) const {
-    EXPECT_EQ(kNoTl0PicIdx, vp9.tl0_pic_idx);
-    EXPECT_EQ(kNoTemporalIdx, vp9.temporal_idx);  // no tid
-    EXPECT_FALSE(vp9.temporal_up_switch);
-  }
-
-  void VerifyTemporalLayerStructure1(const RTPVideoHeaderVP9& vp9) const {
-    EXPECT_NE(kNoTl0PicIdx, vp9.tl0_pic_idx);
-    EXPECT_EQ(0, vp9.temporal_idx);  // 0,0,0,...
-    EXPECT_FALSE(vp9.temporal_up_switch);
-  }
-
-  void VerifyTemporalLayerStructure2(const RTPVideoHeaderVP9& vp9) const {
-    EXPECT_NE(kNoTl0PicIdx, vp9.tl0_pic_idx);
-    EXPECT_GE(vp9.temporal_idx, 0);  // 0,1,0,1,... (tid reset on I-frames).
-    EXPECT_LE(vp9.temporal_idx, 1);
-    EXPECT_EQ(vp9.temporal_idx > 0, vp9.temporal_up_switch);
-    if (IsNewPictureId(vp9)) {
-      uint8_t expected_tid =
-          (!vp9.inter_pic_predicted || last_vp9_.temporal_idx == 1) ? 0 : 1;
-      EXPECT_EQ(expected_tid, vp9.temporal_idx);
-    }
-  }
-
-  void VerifyTemporalLayerStructure3(const RTPVideoHeaderVP9& vp9) const {
-    EXPECT_NE(kNoTl0PicIdx, vp9.tl0_pic_idx);
-    EXPECT_GE(vp9.temporal_idx, 0);  // 0,2,1,2,... (tid reset on I-frames).
-    EXPECT_LE(vp9.temporal_idx, 2);
-    if (IsNewPictureId(vp9) && vp9.inter_pic_predicted) {
-      EXPECT_NE(vp9.temporal_idx, last_vp9_.temporal_idx);
-      switch (vp9.temporal_idx) {
-        case 0:
-          EXPECT_EQ(2, last_vp9_.temporal_idx);
-          EXPECT_FALSE(vp9.temporal_up_switch);
-          break;
-        case 1:
-          EXPECT_EQ(2, last_vp9_.temporal_idx);
-          EXPECT_TRUE(vp9.temporal_up_switch);
-          break;
-        case 2:
-          EXPECT_EQ(last_vp9_.temporal_idx == 0, vp9.temporal_up_switch);
-          break;
-      }
-    }
-  }
-
-  void VerifyTl0Idx(const RTPVideoHeaderVP9& vp9) const {
-    if (vp9.tl0_pic_idx == kNoTl0PicIdx)
-      return;
-
-    uint8_t expected_tl0_idx = last_vp9_.tl0_pic_idx;
-    if (vp9.temporal_idx == 0)
-      ++expected_tl0_idx;
-    EXPECT_EQ(expected_tl0_idx, vp9.tl0_pic_idx);
-  }
-
-  bool IsNewPictureId(const RTPVideoHeaderVP9& vp9) const {
-    return frames_sent_ > 0 && (vp9.picture_id != last_vp9_.picture_id);
-  }
-
-  // Flexible mode (F=1):    Non-flexible mode (F=0):
-  //
-  //      +-+-+-+-+-+-+-+-+     +-+-+-+-+-+-+-+-+
-  //      |I|P|L|F|B|E|V|-|     |I|P|L|F|B|E|V|-|
-  //      +-+-+-+-+-+-+-+-+     +-+-+-+-+-+-+-+-+
-  // I:   |M| PICTURE ID  |  I: |M| PICTURE ID  |
-  //      +-+-+-+-+-+-+-+-+     +-+-+-+-+-+-+-+-+
-  // M:   | EXTENDED PID  |  M: | EXTENDED PID  |
-  //      +-+-+-+-+-+-+-+-+     +-+-+-+-+-+-+-+-+
-  // L:   |  T  |U|  S  |D|  L: |  T  |U|  S  |D|
-  //      +-+-+-+-+-+-+-+-+     +-+-+-+-+-+-+-+-+
-  // P,F: | P_DIFF    |X|N|     |   TL0PICIDX   |
-  //      +-+-+-+-+-+-+-+-+     +-+-+-+-+-+-+-+-+
-  // X:   |EXTENDED P_DIFF|  V: | SS  ..        |
-  //      +-+-+-+-+-+-+-+-+     +-+-+-+-+-+-+-+-+
-  // V:   | SS  ..        |
-  //      +-+-+-+-+-+-+-+-+
-  void VerifyCommonHeader(const RTPVideoHeaderVP9& vp9) const {
-    EXPECT_EQ(kMaxTwoBytePictureId, vp9.max_picture_id);       // M:1
-    EXPECT_NE(kNoPictureId, vp9.picture_id);                   // I:1
-    EXPECT_EQ(vp9_settings_.flexibleMode, vp9.flexible_mode);  // F
-    EXPECT_GE(vp9.spatial_idx, 0);                             // S
-    EXPECT_LT(vp9.spatial_idx, vp9_settings_.numberOfSpatialLayers);
-    if (vp9.ss_data_available)  // V
-      VerifySsData(vp9);
-
-    if (frames_sent_ == 0)
-      EXPECT_FALSE(vp9.inter_pic_predicted);  // P
-
-    if (!vp9.inter_pic_predicted) {
-      EXPECT_TRUE(vp9.temporal_idx == 0 || vp9.temporal_idx == kNoTemporalIdx);
-      EXPECT_FALSE(vp9.temporal_up_switch);
-    }
-  }
-
-  // Scalability structure (SS).
-  //
-  //      +-+-+-+-+-+-+-+-+
-  // V:   | N_S |Y|G|-|-|-|
-  //      +-+-+-+-+-+-+-+-+
-  // Y:   |    WIDTH      |  N_S + 1 times
-  //      +-+-+-+-+-+-+-+-+
-  //      |    HEIGHT     |
-  //      +-+-+-+-+-+-+-+-+
-  // G:   |      N_G      |
-  //      +-+-+-+-+-+-+-+-+
-  // N_G: |  T  |U| R |-|-|  N_G times
-  //      +-+-+-+-+-+-+-+-+
-  //      |    P_DIFF     |  R times
-  //      +-+-+-+-+-+-+-+-+
-  void VerifySsData(const RTPVideoHeaderVP9& vp9) const {
-    EXPECT_TRUE(vp9.ss_data_available);             // V
-    EXPECT_EQ(vp9_settings_.numberOfSpatialLayers,  // N_S + 1
-              vp9.num_spatial_layers);
-    EXPECT_TRUE(vp9.spatial_layer_resolution_present);  // Y:1
-    int expected_width = expected_width_;
-    int expected_height = expected_height_;
-    for (int i = static_cast<int>(vp9.num_spatial_layers) - 1; i >= 0; --i) {
-      EXPECT_EQ(expected_width, vp9.width[i]);    // WIDTH
-      EXPECT_EQ(expected_height, vp9.height[i]);  // HEIGHT
-      expected_width /= 2;
-      expected_height /= 2;
-    }
-  }
-
-  void CompareConsecutiveFrames(const RTPHeader& header,
-                                const RTPVideoHeader& video) const {
-    const RTPVideoHeaderVP9& vp9 = video.codecHeader.VP9;
-
-    bool new_frame = packets_sent_ == 0 ||
-                     IsNewerTimestamp(header.timestamp, last_header_.timestamp);
-    EXPECT_EQ(new_frame, video.is_first_packet_in_frame);
-    if (!new_frame) {
-      EXPECT_FALSE(last_header_.markerBit);
-      EXPECT_EQ(last_header_.timestamp, header.timestamp);
-      EXPECT_EQ(last_vp9_.picture_id, vp9.picture_id);
-      EXPECT_EQ(last_vp9_.temporal_idx, vp9.temporal_idx);
-      EXPECT_EQ(last_vp9_.tl0_pic_idx, vp9.tl0_pic_idx);
-      VerifySpatialIdxWithinFrame(vp9);
-      return;
-    }
-    // New frame.
-    EXPECT_TRUE(vp9.beginning_of_frame);
-
-    // Compare with last packet in previous frame.
-    if (frames_sent_ == 0)
-      return;
-    EXPECT_TRUE(last_vp9_.end_of_frame);
-    EXPECT_TRUE(last_header_.markerBit);
-    EXPECT_TRUE(ContinuousPictureId(vp9));
-    VerifyTl0Idx(vp9);
-  }
-
-  std::unique_ptr<VP9Encoder> vp9_encoder_;
-  VideoCodecVP9 vp9_settings_;
-  webrtc::VideoEncoderConfig encoder_config_;
-  RTPHeader last_header_;
-  RTPVideoHeaderVP9 last_vp9_;
-  size_t packets_sent_;
-  size_t frames_sent_;
-  int expected_width_;
-  int expected_height_;
-};
-
-TEST_F(VideoSendStreamTest, Vp9NonFlexMode_1Tl1SLayers) {
-  const uint8_t kNumTemporalLayers = 1;
-  const uint8_t kNumSpatialLayers = 1;
-  TestVp9NonFlexMode(kNumTemporalLayers, kNumSpatialLayers);
-}
-
-TEST_F(VideoSendStreamTest, Vp9NonFlexMode_2Tl1SLayers) {
-  const uint8_t kNumTemporalLayers = 2;
-  const uint8_t kNumSpatialLayers = 1;
-  TestVp9NonFlexMode(kNumTemporalLayers, kNumSpatialLayers);
-}
-
-TEST_F(VideoSendStreamTest, Vp9NonFlexMode_3Tl1SLayers) {
-  const uint8_t kNumTemporalLayers = 3;
-  const uint8_t kNumSpatialLayers = 1;
-  TestVp9NonFlexMode(kNumTemporalLayers, kNumSpatialLayers);
-}
-
-TEST_F(VideoSendStreamTest, Vp9NonFlexMode_1Tl2SLayers) {
-  const uint8_t kNumTemporalLayers = 1;
-  const uint8_t kNumSpatialLayers = 2;
-  TestVp9NonFlexMode(kNumTemporalLayers, kNumSpatialLayers);
-}
-
-TEST_F(VideoSendStreamTest, Vp9NonFlexMode_2Tl2SLayers) {
-  const uint8_t kNumTemporalLayers = 2;
-  const uint8_t kNumSpatialLayers = 2;
-  TestVp9NonFlexMode(kNumTemporalLayers, kNumSpatialLayers);
-}
-
-TEST_F(VideoSendStreamTest, Vp9NonFlexMode_3Tl2SLayers) {
-  const uint8_t kNumTemporalLayers = 3;
-  const uint8_t kNumSpatialLayers = 2;
-  TestVp9NonFlexMode(kNumTemporalLayers, kNumSpatialLayers);
-}
-
-void VideoSendStreamTest::TestVp9NonFlexMode(uint8_t num_temporal_layers,
-                                             uint8_t num_spatial_layers) {
-  static const size_t kNumFramesToSend = 100;
-  // Set to < kNumFramesToSend and coprime to length of temporal layer
-  // structures to verify temporal id reset on key frame.
-  static const int kKeyFrameInterval = 31;
-  class NonFlexibleMode : public Vp9HeaderObserver {
-   public:
-    NonFlexibleMode(uint8_t num_temporal_layers, uint8_t num_spatial_layers)
-        : num_temporal_layers_(num_temporal_layers),
-          num_spatial_layers_(num_spatial_layers),
-          l_field_(num_temporal_layers > 1 || num_spatial_layers > 1) {}
-    void ModifyVideoConfigsHook(
-        VideoSendStream::Config* send_config,
-        std::vector<VideoReceiveStream::Config>* receive_configs,
-        VideoEncoderConfig* encoder_config) override {
-      vp9_settings_.flexibleMode = false;
-      vp9_settings_.frameDroppingOn = false;
-      vp9_settings_.keyFrameInterval = kKeyFrameInterval;
-      vp9_settings_.numberOfTemporalLayers = num_temporal_layers_;
-      vp9_settings_.numberOfSpatialLayers = num_spatial_layers_;
-    }
-
-    void InspectHeader(const RTPVideoHeaderVP9& vp9) override {
-      bool ss_data_expected = !vp9.inter_pic_predicted &&
-                              vp9.beginning_of_frame && vp9.spatial_idx == 0;
-      EXPECT_EQ(ss_data_expected, vp9.ss_data_available);
-      EXPECT_EQ(vp9.spatial_idx > 0, vp9.inter_layer_predicted);  // D
-      EXPECT_EQ(!vp9.inter_pic_predicted,
-                frames_sent_ % kKeyFrameInterval == 0);
-
-      if (IsNewPictureId(vp9)) {
-        EXPECT_EQ(0, vp9.spatial_idx);
-        EXPECT_EQ(num_spatial_layers_ - 1, last_vp9_.spatial_idx);
-      }
-
-      VerifyFixedTemporalLayerStructure(vp9,
-                                        l_field_ ? num_temporal_layers_ : 0);
-
-      if (frames_sent_ > kNumFramesToSend)
-        observation_complete_.Set();
-    }
-    const uint8_t num_temporal_layers_;
-    const uint8_t num_spatial_layers_;
-    const bool l_field_;
-  } test(num_temporal_layers, num_spatial_layers);
-
-  RunBaseTest(&test);
-}
-
-TEST_F(VideoSendStreamTest, Vp9NonFlexModeSmallResolution) {
-  static const size_t kNumFramesToSend = 50;
-  static const int kWidth = 4;
-  static const int kHeight = 4;
-  class NonFlexibleModeResolution : public Vp9HeaderObserver {
-    void ModifyVideoConfigsHook(
-        VideoSendStream::Config* send_config,
-        std::vector<VideoReceiveStream::Config>* receive_configs,
-        VideoEncoderConfig* encoder_config) override {
-      vp9_settings_.flexibleMode = false;
-      vp9_settings_.numberOfTemporalLayers = 1;
-      vp9_settings_.numberOfSpatialLayers = 1;
-
-      EXPECT_EQ(1u, encoder_config->number_of_streams);
-    }
-
-    void InspectHeader(const RTPVideoHeaderVP9& vp9_header) override {
-      if (frames_sent_ > kNumFramesToSend)
-        observation_complete_.Set();
-    }
-
-    void ModifyVideoCaptureStartResolution(int* width,
-                                           int* height,
-                                           int* frame_rate) override {
-      expected_width_ = kWidth;
-      expected_height_ = kHeight;
-      *width = kWidth;
-      *height = kHeight;
-    }
-  } test;
-
-  RunBaseTest(&test);
-}
-
-#if defined(WEBRTC_ANDROID)
-// Crashes on Android; bugs.webrtc.org/7401
-#define MAYBE_Vp9FlexModeRefCount DISABLED_Vp9FlexModeRefCount
-#else
-#define MAYBE_Vp9FlexModeRefCount Vp9FlexModeRefCount
-#endif
-TEST_F(VideoSendStreamTest, MAYBE_Vp9FlexModeRefCount) {
-  class FlexibleMode : public Vp9HeaderObserver {
-    void ModifyVideoConfigsHook(
-        VideoSendStream::Config* send_config,
-        std::vector<VideoReceiveStream::Config>* receive_configs,
-        VideoEncoderConfig* encoder_config) override {
-      encoder_config->content_type = VideoEncoderConfig::ContentType::kScreen;
-      vp9_settings_.flexibleMode = true;
-      vp9_settings_.numberOfTemporalLayers = 1;
-      vp9_settings_.numberOfSpatialLayers = 2;
-    }
-
-    void InspectHeader(const RTPVideoHeaderVP9& vp9_header) override {
-      EXPECT_TRUE(vp9_header.flexible_mode);
-      EXPECT_EQ(kNoTl0PicIdx, vp9_header.tl0_pic_idx);
-      if (vp9_header.inter_pic_predicted) {
-        EXPECT_GT(vp9_header.num_ref_pics, 0u);
-        observation_complete_.Set();
-      }
-    }
-  } test;
-
-  RunBaseTest(&test);
-}
-#endif  // !defined(RTC_DISABLE_VP9)
-
-void VideoSendStreamTest::TestRequestSourceRotateVideo(
-    bool support_orientation_ext) {
-  CreateSenderCall(Call::Config(event_log_.get()));
-
-  test::NullTransport transport;
-  CreateSendConfig(1, 0, 0, &transport);
-  video_send_config_.rtp.extensions.clear();
-  if (support_orientation_ext) {
-    video_send_config_.rtp.extensions.push_back(
-        RtpExtension(RtpExtension::kVideoRotationUri, 1));
-  }
-
-  CreateVideoStreams();
-  test::FrameForwarder forwarder;
-  video_send_stream_->SetSource(
-      &forwarder, VideoSendStream::DegradationPreference::kMaintainFramerate);
-
-  EXPECT_TRUE(forwarder.sink_wants().rotation_applied !=
-              support_orientation_ext);
-
-  DestroyStreams();
-}
-
-TEST_F(VideoSendStreamTest,
-       RequestSourceRotateIfVideoOrientationExtensionNotSupported) {
-  TestRequestSourceRotateVideo(false);
-}
-
-TEST_F(VideoSendStreamTest,
-       DoNotRequestsRotationIfVideoOrientationExtensionSupported) {
-  TestRequestSourceRotateVideo(true);
-}
-
-// This test verifies that overhead is removed from the bandwidth estimate by
-// testing that the maximum possible target payload rate is smaller than the
-// maximum bandwidth estimate by the overhead rate.
-TEST_F(VideoSendStreamTest, RemoveOverheadFromBandwidth) {
-  test::ScopedFieldTrials override_field_trials(
-      "WebRTC-SendSideBwe-WithOverhead/Enabled/");
-  class RemoveOverheadFromBandwidthTest : public test::EndToEndTest,
-                                          public test::FakeEncoder {
-   public:
-    explicit RemoveOverheadFromBandwidthTest(
-        test::SingleThreadedTaskQueueForTesting* task_queue)
-        : EndToEndTest(test::CallTest::kDefaultTimeoutMs),
-          FakeEncoder(Clock::GetRealTimeClock()),
-          task_queue_(task_queue),
-          call_(nullptr),
-          max_bitrate_bps_(0),
-          first_packet_sent_(false),
-          bitrate_changed_event_(false, false) {}
-
-    int32_t SetRateAllocation(const BitrateAllocation& bitrate,
-                              uint32_t frameRate) override {
-      rtc::CritScope lock(&crit_);
-      // Wait for the first sent packet so that videosendstream knows
-      // rtp_overhead.
-      if (first_packet_sent_) {
-        max_bitrate_bps_ = bitrate.get_sum_bps();
-        bitrate_changed_event_.Set();
-      }
-      return FakeEncoder::SetRateAllocation(bitrate, frameRate);
-    }
-
-    void OnCallsCreated(Call* sender_call, Call* receiver_call) override {
-      call_ = sender_call;
-    }
-
-    void ModifyVideoConfigs(
-        VideoSendStream::Config* send_config,
-        std::vector<VideoReceiveStream::Config>* receive_configs,
-        VideoEncoderConfig* encoder_config) override {
-      send_config->rtp.max_packet_size = 1200;
-      send_config->encoder_settings.encoder = this;
-      EXPECT_FALSE(send_config->rtp.extensions.empty());
-    }
-
-    Action OnSendRtp(const uint8_t* packet, size_t length) override {
-      rtc::CritScope lock(&crit_);
-      first_packet_sent_ = true;
-      return SEND_PACKET;
-    }
-
-    void PerformTest() override {
-      Call::Config::BitrateConfig bitrate_config;
-      constexpr int kStartBitrateBps = 60000;
-      constexpr int kMaxBitrateBps = 60000;
-      constexpr int kMinBitrateBps = 10000;
-      bitrate_config.start_bitrate_bps = kStartBitrateBps;
-      bitrate_config.max_bitrate_bps = kMaxBitrateBps;
-      bitrate_config.min_bitrate_bps = kMinBitrateBps;
-      task_queue_->SendTask([this, &bitrate_config]() {
-        call_->SetBitrateConfig(bitrate_config);
-        call_->OnTransportOverheadChanged(webrtc::MediaType::VIDEO, 40);
-      });
-
-      // At a bitrate of 60kbps with a packet size of 1200B video and an
-      // overhead of 40B per packet video produces 2240bps overhead.
-      // So the encoder BW should be set to 57760bps.
-      bitrate_changed_event_.Wait(VideoSendStreamTest::kDefaultTimeoutMs);
-      {
-        rtc::CritScope lock(&crit_);
-        EXPECT_LE(max_bitrate_bps_, 57760u);
-      }
-    }
-
-   private:
-    test::SingleThreadedTaskQueueForTesting* const task_queue_;
-    Call* call_;
-    rtc::CriticalSection crit_;
-    uint32_t max_bitrate_bps_ RTC_GUARDED_BY(&crit_);
-    bool first_packet_sent_ RTC_GUARDED_BY(&crit_);
-    rtc::Event bitrate_changed_event_;
-  } test(&task_queue_);
-  RunBaseTest(&test);
-}
-
-TEST_F(VideoSendStreamTest, SendsKeepAlive) {
-  const int kTimeoutMs = 50;  // Really short timeout for testing.
-
-  class KeepaliveObserver : public test::SendTest {
-   public:
-    KeepaliveObserver() : SendTest(kDefaultTimeoutMs) {}
-
-    void OnRtpTransportControllerSendCreated(
-        RtpTransportControllerSend* controller) override {
-      RtpKeepAliveConfig config;
-      config.timeout_interval_ms = kTimeoutMs;
-      config.payload_type = CallTest::kDefaultKeepalivePayloadType;
-      controller->SetKeepAliveConfig(config);
-    }
-
-   private:
-    Action OnSendRtp(const uint8_t* packet, size_t length) override {
-      RTPHeader header;
-      EXPECT_TRUE(parser_->Parse(packet, length, &header));
-
-      if (header.payloadType != CallTest::kDefaultKeepalivePayloadType) {
-        // The video stream has started. Stop it now.
-        if (capturer_)
-          capturer_->Stop();
-      } else {
-        observation_complete_.Set();
-      }
-
-      return SEND_PACKET;
-    }
-
-    void PerformTest() override {
-      EXPECT_TRUE(Wait()) << "Timed out while waiting for keep-alive packet.";
-    }
-
-    void OnFrameGeneratorCapturerCreated(
-        test::FrameGeneratorCapturer* frame_generator_capturer) override {
-      capturer_ = frame_generator_capturer;
-    }
-
-    test::FrameGeneratorCapturer* capturer_ = nullptr;
-  } test;
-
-  RunBaseTest(&test);
-}
-
-}  // namespace webrtc
diff --git a/video/video_stream_decoder.cc b/video/video_stream_decoder.cc
deleted file mode 100644
index 009a18c..0000000
--- a/video/video_stream_decoder.cc
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
- *  Copyright (c) 2012 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/video/video_stream_decoder.h"
-
-#include <algorithm>
-#include <map>
-#include <vector>
-
-#include "webrtc/common_video/include/frame_callback.h"
-#include "webrtc/modules/video_coding/video_coding_impl.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/system_wrappers/include/metrics.h"
-#include "webrtc/video/call_stats.h"
-#include "webrtc/video/payload_router.h"
-#include "webrtc/video/receive_statistics_proxy.h"
-
-namespace webrtc {
-
-VideoStreamDecoder::VideoStreamDecoder(
-    vcm::VideoReceiver* video_receiver,
-    VCMFrameTypeCallback* vcm_frame_type_callback,
-    VCMPacketRequestCallback* vcm_packet_request_callback,
-    bool enable_nack,
-    bool enable_fec,
-    ReceiveStatisticsProxy* receive_statistics_proxy,
-    rtc::VideoSinkInterface<VideoFrame>* incoming_video_stream)
-    : video_receiver_(video_receiver),
-      receive_stats_callback_(receive_statistics_proxy),
-      incoming_video_stream_(incoming_video_stream),
-      last_rtt_ms_(0) {
-  RTC_DCHECK(video_receiver_);
-
-  static const int kMaxPacketAgeToNack = 450;
-  static const int kMaxNackListSize = 250;
-  video_receiver_->SetNackSettings(kMaxNackListSize,
-                                   kMaxPacketAgeToNack, 0);
-  video_receiver_->RegisterReceiveCallback(this);
-  video_receiver_->RegisterFrameTypeCallback(vcm_frame_type_callback);
-  video_receiver_->RegisterReceiveStatisticsCallback(this);
-
-  VCMVideoProtection video_protection =
-      enable_nack ? (enable_fec ? kProtectionNackFEC : kProtectionNack)
-                  : kProtectionNone;
-
-  VCMDecodeErrorMode decode_error_mode = enable_nack ? kNoErrors : kWithErrors;
-  video_receiver_->SetVideoProtection(video_protection, true);
-  video_receiver_->SetDecodeErrorMode(decode_error_mode);
-  VCMPacketRequestCallback* packet_request_callback =
-      enable_nack ? vcm_packet_request_callback : nullptr;
-  video_receiver_->RegisterPacketRequestCallback(packet_request_callback);
-}
-
-VideoStreamDecoder::~VideoStreamDecoder() {
-  // Note: There's an assumption at this point that the decoder thread is
-  // *not* running. If it was, then there could be a race for each of these
-  // callbacks.
-
-  // Unset all the callback pointers that we set in the ctor.
-  video_receiver_->RegisterPacketRequestCallback(nullptr);
-  video_receiver_->RegisterReceiveStatisticsCallback(nullptr);
-  video_receiver_->RegisterFrameTypeCallback(nullptr);
-  video_receiver_->RegisterReceiveCallback(nullptr);
-}
-
-// Do not acquire the lock of |video_receiver_| in this function. Decode
-// callback won't necessarily be called from the decoding thread. The decoding
-// thread may have held the lock when calling VideoDecoder::Decode, Reset, or
-// Release. Acquiring the same lock in the path of decode callback can deadlock.
-int32_t VideoStreamDecoder::FrameToRender(VideoFrame& video_frame,
-                                          rtc::Optional<uint8_t> qp,
-                                          VideoContentType content_type) {
-  receive_stats_callback_->OnDecodedFrame(qp, content_type);
-  incoming_video_stream_->OnFrame(video_frame);
-  return 0;
-}
-
-int32_t VideoStreamDecoder::ReceivedDecodedReferenceFrame(
-  const uint64_t picture_id) {
-  RTC_NOTREACHED();
-  return 0;
-}
-
-void VideoStreamDecoder::OnIncomingPayloadType(int payload_type) {
-  receive_stats_callback_->OnIncomingPayloadType(payload_type);
-}
-
-void VideoStreamDecoder::OnDecoderImplementationName(
-    const char* implementation_name) {
-  receive_stats_callback_->OnDecoderImplementationName(implementation_name);
-}
-
-void VideoStreamDecoder::OnReceiveRatesUpdated(uint32_t bit_rate,
-                                               uint32_t frame_rate) {
-  receive_stats_callback_->OnIncomingRate(frame_rate, bit_rate);
-}
-
-void VideoStreamDecoder::OnDiscardedPacketsUpdated(int discarded_packets) {
-  receive_stats_callback_->OnDiscardedPacketsUpdated(discarded_packets);
-}
-
-void VideoStreamDecoder::OnFrameCountsUpdated(const FrameCounts& frame_counts) {
-  receive_stats_callback_->OnFrameCountsUpdated(frame_counts);
-}
-
-void VideoStreamDecoder::OnFrameBufferTimingsUpdated(int decode_ms,
-                                                     int max_decode_ms,
-                                                     int current_delay_ms,
-                                                     int target_delay_ms,
-                                                     int jitter_buffer_ms,
-                                                     int min_playout_delay_ms,
-                                                     int render_delay_ms) {}
-
-void VideoStreamDecoder::OnTimingFrameInfoUpdated(const TimingFrameInfo& info) {
-}
-
-void VideoStreamDecoder::OnCompleteFrame(bool is_keyframe,
-                                         size_t size_bytes,
-                                         VideoContentType content_type) {}
-
-void VideoStreamDecoder::OnRttUpdate(int64_t avg_rtt_ms, int64_t max_rtt_ms) {
-  video_receiver_->SetReceiveChannelParameters(max_rtt_ms);
-
-  rtc::CritScope lock(&crit_);
-  last_rtt_ms_ = avg_rtt_ms;
-}
-}  // namespace webrtc
diff --git a/video/video_stream_decoder.h b/video/video_stream_decoder.h
deleted file mode 100644
index 88cff97..0000000
--- a/video/video_stream_decoder.h
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- *  Copyright (c) 2012 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_VIDEO_VIDEO_STREAM_DECODER_H_
-#define WEBRTC_VIDEO_VIDEO_STREAM_DECODER_H_
-
-#include <list>
-#include <map>
-#include <memory>
-#include <vector>
-
-#include "webrtc/media/base/videosinkinterface.h"
-#include "webrtc/modules/remote_bitrate_estimator/include/remote_bitrate_estimator.h"
-#include "webrtc/modules/video_coding/include/video_coding_defines.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/platform_thread.h"
-#include "webrtc/rtc_base/scoped_ref_ptr.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-class CallStatsObserver;
-class ChannelStatsObserver;
-class EncodedImageCallback;
-class ReceiveStatisticsProxy;
-class VideoRenderCallback;
-
-namespace vcm {
-class VideoReceiver;
-}  // namespace vcm
-
-enum StreamType {
-  kViEStreamTypeNormal = 0,  // Normal media stream
-  kViEStreamTypeRtx = 1      // Retransmission media stream
-};
-
-class VideoStreamDecoder : public VCMReceiveCallback,
-                           public VCMReceiveStatisticsCallback,
-                           public CallStatsObserver {
- public:
-  friend class ChannelStatsObserver;
-
-  VideoStreamDecoder(
-      vcm::VideoReceiver* video_receiver,
-      VCMFrameTypeCallback* vcm_frame_type_callback,
-      VCMPacketRequestCallback* vcm_packet_request_callback,
-      bool enable_nack,
-      bool enable_fec,
-      ReceiveStatisticsProxy* receive_statistics_proxy,
-      rtc::VideoSinkInterface<VideoFrame>* incoming_video_stream);
-  ~VideoStreamDecoder();
-
-  // Implements VCMReceiveCallback.
-  int32_t FrameToRender(VideoFrame& video_frame,
-                        rtc::Optional<uint8_t> qp,
-                        VideoContentType content_type) override;
-  int32_t ReceivedDecodedReferenceFrame(const uint64_t picture_id) override;
-  void OnIncomingPayloadType(int payload_type) override;
-  void OnDecoderImplementationName(const char* implementation_name) override;
-
-  // Implements VCMReceiveStatisticsCallback.
-  void OnReceiveRatesUpdated(uint32_t bit_rate, uint32_t frame_rate) override;
-  void OnDiscardedPacketsUpdated(int discarded_packets) override;
-  void OnFrameCountsUpdated(const FrameCounts& frame_counts) override;
-  void OnCompleteFrame(bool is_keyframe,
-                       size_t size_bytes,
-                       VideoContentType content_type) override;
-  void OnFrameBufferTimingsUpdated(int decode_ms,
-                                   int max_decode_ms,
-                                   int current_delay_ms,
-                                   int target_delay_ms,
-                                   int jitter_buffer_ms,
-                                   int min_playout_delay_ms,
-                                   int render_delay_ms) override;
-
-  void OnTimingFrameInfoUpdated(const TimingFrameInfo& info) override;
-
-  void RegisterReceiveStatisticsProxy(
-      ReceiveStatisticsProxy* receive_statistics_proxy);
-
-  // Implements StatsObserver.
-  void OnRttUpdate(int64_t avg_rtt_ms, int64_t max_rtt_ms) override;
-
- private:
-  // Used for all registered callbacks except rendering.
-  rtc::CriticalSection crit_;
-
-  vcm::VideoReceiver* const video_receiver_;
-
-  ReceiveStatisticsProxy* const receive_stats_callback_;
-  rtc::VideoSinkInterface<VideoFrame>* const incoming_video_stream_;
-
-  int64_t last_rtt_ms_ RTC_GUARDED_BY(crit_);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_VIDEO_VIDEO_STREAM_DECODER_H_
diff --git a/video/video_stream_encoder.cc b/video/video_stream_encoder.cc
deleted file mode 100644
index ccd2854..0000000
--- a/video/video_stream_encoder.cc
+++ /dev/null
@@ -1,1260 +0,0 @@
-/*
- *  Copyright (c) 2012 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/video/video_stream_encoder.h"
-
-#include <algorithm>
-#include <limits>
-#include <numeric>
-#include <utility>
-
-#include "webrtc/api/video/i420_buffer.h"
-#include "webrtc/common_video/include/video_bitrate_allocator.h"
-#include "webrtc/common_video/include/video_frame.h"
-#include "webrtc/modules/pacing/paced_sender.h"
-#include "webrtc/modules/video_coding/codecs/vp8/temporal_layers.h"
-#include "webrtc/modules/video_coding/include/video_codec_initializer.h"
-#include "webrtc/modules/video_coding/include/video_coding.h"
-#include "webrtc/modules/video_coding/include/video_coding_defines.h"
-#include "webrtc/rtc_base/arraysize.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/location.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/timeutils.h"
-#include "webrtc/rtc_base/trace_event.h"
-#include "webrtc/video/overuse_frame_detector.h"
-#include "webrtc/video/send_statistics_proxy.h"
-
-namespace webrtc {
-
-namespace {
-
-// Time interval for logging frame counts.
-const int64_t kFrameLogIntervalMs = 60000;
-const int kMinFramerateFps = 2;
-const int kMaxFramerateFps = 120;
-
-// The maximum number of frames to drop at beginning of stream
-// to try and achieve desired bitrate.
-const int kMaxInitialFramedrop = 4;
-
-uint32_t MaximumFrameSizeForBitrate(uint32_t kbps) {
-  if (kbps > 0) {
-    if (kbps < 300 /* qvga */) {
-      return 320 * 240;
-    } else if (kbps < 500 /* vga */) {
-      return 640 * 480;
-    }
-  }
-  return std::numeric_limits<uint32_t>::max();
-}
-
-// Initial limits for kBalanced degradation preference.
-int MinFps(int pixels) {
-  if (pixels <= 320 * 240) {
-    return 7;
-  } else if (pixels <= 480 * 270) {
-    return 10;
-  } else if (pixels <= 640 * 480) {
-    return 15;
-  } else {
-    return std::numeric_limits<int>::max();
-  }
-}
-
-int MaxFps(int pixels) {
-  if (pixels <= 320 * 240) {
-    return 10;
-  } else if (pixels <= 480 * 270) {
-    return 15;
-  } else {
-    return std::numeric_limits<int>::max();
-  }
-}
-
-bool IsResolutionScalingEnabled(
-    VideoSendStream::DegradationPreference degradation_preference) {
-  return degradation_preference ==
-             VideoSendStream::DegradationPreference::kMaintainFramerate ||
-         degradation_preference ==
-             VideoSendStream::DegradationPreference::kBalanced;
-}
-
-bool IsFramerateScalingEnabled(
-    VideoSendStream::DegradationPreference degradation_preference) {
-  return degradation_preference ==
-             VideoSendStream::DegradationPreference::kMaintainResolution ||
-         degradation_preference ==
-             VideoSendStream::DegradationPreference::kBalanced;
-}
-
-}  //  namespace
-
-class VideoStreamEncoder::ConfigureEncoderTask : public rtc::QueuedTask {
- public:
-  ConfigureEncoderTask(VideoStreamEncoder* video_stream_encoder,
-                       VideoEncoderConfig config,
-                       size_t max_data_payload_length,
-                       bool nack_enabled)
-      : video_stream_encoder_(video_stream_encoder),
-        config_(std::move(config)),
-        max_data_payload_length_(max_data_payload_length),
-        nack_enabled_(nack_enabled) {}
-
- private:
-  bool Run() override {
-    video_stream_encoder_->ConfigureEncoderOnTaskQueue(
-        std::move(config_), max_data_payload_length_, nack_enabled_);
-    return true;
-  }
-
-  VideoStreamEncoder* const video_stream_encoder_;
-  VideoEncoderConfig config_;
-  size_t max_data_payload_length_;
-  bool nack_enabled_;
-};
-
-class VideoStreamEncoder::EncodeTask : public rtc::QueuedTask {
- public:
-  EncodeTask(const VideoFrame& frame,
-             VideoStreamEncoder* video_stream_encoder,
-             int64_t time_when_posted_us,
-             bool log_stats)
-      : frame_(frame),
-        video_stream_encoder_(video_stream_encoder),
-        time_when_posted_us_(time_when_posted_us),
-        log_stats_(log_stats) {
-    ++video_stream_encoder_->posted_frames_waiting_for_encode_;
-  }
-
- private:
-  bool Run() override {
-    RTC_DCHECK_RUN_ON(&video_stream_encoder_->encoder_queue_);
-    RTC_DCHECK_GT(
-        video_stream_encoder_->posted_frames_waiting_for_encode_.Value(), 0);
-    video_stream_encoder_->stats_proxy_->OnIncomingFrame(frame_.width(),
-                                                         frame_.height());
-    ++video_stream_encoder_->captured_frame_count_;
-    if (--video_stream_encoder_->posted_frames_waiting_for_encode_ == 0) {
-      video_stream_encoder_->EncodeVideoFrame(frame_, time_when_posted_us_);
-    } else {
-      // There is a newer frame in flight. Do not encode this frame.
-      LOG(LS_VERBOSE)
-          << "Incoming frame dropped due to that the encoder is blocked.";
-      ++video_stream_encoder_->dropped_frame_count_;
-    }
-    if (log_stats_) {
-      LOG(LS_INFO) << "Number of frames: captured "
-                   << video_stream_encoder_->captured_frame_count_
-                   << ", dropped (due to encoder blocked) "
-                   << video_stream_encoder_->dropped_frame_count_
-                   << ", interval_ms "
-                   << kFrameLogIntervalMs;
-      video_stream_encoder_->captured_frame_count_ = 0;
-      video_stream_encoder_->dropped_frame_count_ = 0;
-    }
-    return true;
-  }
-  VideoFrame frame_;
-  VideoStreamEncoder* const video_stream_encoder_;
-  const int64_t time_when_posted_us_;
-  const bool log_stats_;
-};
-
-// VideoSourceProxy is responsible ensuring thread safety between calls to
-// VideoStreamEncoder::SetSource that will happen on libjingle's worker thread
-// when a video capturer is connected to the encoder and the encoder task queue
-// (encoder_queue_) where the encoder reports its VideoSinkWants.
-class VideoStreamEncoder::VideoSourceProxy {
- public:
-  explicit VideoSourceProxy(VideoStreamEncoder* video_stream_encoder)
-      : video_stream_encoder_(video_stream_encoder),
-        degradation_preference_(
-            VideoSendStream::DegradationPreference::kDegradationDisabled),
-        source_(nullptr) {}
-
-  void SetSource(
-      rtc::VideoSourceInterface<VideoFrame>* source,
-      const VideoSendStream::DegradationPreference& degradation_preference) {
-    // Called on libjingle's worker thread.
-    RTC_DCHECK_CALLED_SEQUENTIALLY(&main_checker_);
-    rtc::VideoSourceInterface<VideoFrame>* old_source = nullptr;
-    rtc::VideoSinkWants wants;
-    {
-      rtc::CritScope lock(&crit_);
-      degradation_preference_ = degradation_preference;
-      old_source = source_;
-      source_ = source;
-      wants = GetActiveSinkWantsInternal();
-    }
-
-    if (old_source != source && old_source != nullptr) {
-      old_source->RemoveSink(video_stream_encoder_);
-    }
-
-    if (!source) {
-      return;
-    }
-
-    source->AddOrUpdateSink(video_stream_encoder_, wants);
-  }
-
-  void SetWantsRotationApplied(bool rotation_applied) {
-    rtc::CritScope lock(&crit_);
-    sink_wants_.rotation_applied = rotation_applied;
-    if (source_)
-      source_->AddOrUpdateSink(video_stream_encoder_, sink_wants_);
-  }
-
-  rtc::VideoSinkWants GetActiveSinkWants() {
-    rtc::CritScope lock(&crit_);
-    return GetActiveSinkWantsInternal();
-  }
-
-  void ResetPixelFpsCount() {
-    rtc::CritScope lock(&crit_);
-    sink_wants_.max_pixel_count = std::numeric_limits<int>::max();
-    sink_wants_.target_pixel_count.reset();
-    sink_wants_.max_framerate_fps = std::numeric_limits<int>::max();
-    if (source_)
-      source_->AddOrUpdateSink(video_stream_encoder_, sink_wants_);
-  }
-
-  bool RequestResolutionLowerThan(int pixel_count, int min_pixels_per_frame) {
-    // Called on the encoder task queue.
-    rtc::CritScope lock(&crit_);
-    if (!source_ || !IsResolutionScalingEnabled(degradation_preference_)) {
-      // This can happen since |degradation_preference_| is set on libjingle's
-      // worker thread but the adaptation is done on the encoder task queue.
-      return false;
-    }
-    // The input video frame size will have a resolution less than or equal to
-    // |max_pixel_count| depending on how the source can scale the frame size.
-    const int pixels_wanted = (pixel_count * 3) / 5;
-    if (pixels_wanted < min_pixels_per_frame ||
-        pixels_wanted >= sink_wants_.max_pixel_count) {
-      return false;
-    }
-    LOG(LS_INFO) << "Scaling down resolution, max pixels: " << pixels_wanted;
-    sink_wants_.max_pixel_count = pixels_wanted;
-    sink_wants_.target_pixel_count = rtc::Optional<int>();
-    source_->AddOrUpdateSink(video_stream_encoder_,
-                             GetActiveSinkWantsInternal());
-    return true;
-  }
-
-  int RequestFramerateLowerThan(int fps) {
-    // Called on the encoder task queue.
-    // The input video frame rate will be scaled down to 2/3, rounding down.
-    int framerate_wanted = (fps * 2) / 3;
-    return RestrictFramerate(framerate_wanted) ? framerate_wanted : -1;
-  }
-
-  bool RequestHigherResolutionThan(int pixel_count) {
-    // Called on the encoder task queue.
-    rtc::CritScope lock(&crit_);
-    if (!source_ || !IsResolutionScalingEnabled(degradation_preference_)) {
-      // This can happen since |degradation_preference_| is set on libjingle's
-      // worker thread but the adaptation is done on the encoder task queue.
-      return false;
-    }
-    int max_pixels_wanted = pixel_count;
-    if (max_pixels_wanted != std::numeric_limits<int>::max())
-      max_pixels_wanted = pixel_count * 4;
-
-    if (max_pixels_wanted <= sink_wants_.max_pixel_count)
-      return false;
-
-    sink_wants_.max_pixel_count = max_pixels_wanted;
-    if (max_pixels_wanted == std::numeric_limits<int>::max()) {
-      // Remove any constraints.
-      sink_wants_.target_pixel_count.reset();
-    } else {
-      // On step down we request at most 3/5 the pixel count of the previous
-      // resolution, so in order to take "one step up" we request a resolution
-      // as close as possible to 5/3 of the current resolution. The actual pixel
-      // count selected depends on the capabilities of the source. In order to
-      // not take a too large step up, we cap the requested pixel count to be at
-      // most four time the current number of pixels.
-      sink_wants_.target_pixel_count =
-          rtc::Optional<int>((pixel_count * 5) / 3);
-    }
-    LOG(LS_INFO) << "Scaling up resolution, max pixels: " << max_pixels_wanted;
-    source_->AddOrUpdateSink(video_stream_encoder_,
-                             GetActiveSinkWantsInternal());
-    return true;
-  }
-
-  // Request upgrade in framerate. Returns the new requested frame, or -1 if
-  // no change requested. Note that maxint may be returned if limits due to
-  // adaptation requests are removed completely. In that case, consider
-  // |max_framerate_| to be the current limit (assuming the capturer complies).
-  int RequestHigherFramerateThan(int fps) {
-    // Called on the encoder task queue.
-    // The input frame rate will be scaled up to the last step, with rounding.
-    int framerate_wanted = fps;
-    if (fps != std::numeric_limits<int>::max())
-      framerate_wanted = (fps * 3) / 2;
-
-    return IncreaseFramerate(framerate_wanted) ? framerate_wanted : -1;
-  }
-
-  bool RestrictFramerate(int fps) {
-    // Called on the encoder task queue.
-    rtc::CritScope lock(&crit_);
-    if (!source_ || !IsFramerateScalingEnabled(degradation_preference_))
-      return false;
-
-    const int fps_wanted = std::max(kMinFramerateFps, fps);
-    if (fps_wanted >= sink_wants_.max_framerate_fps)
-      return false;
-
-    LOG(LS_INFO) << "Scaling down framerate: " << fps_wanted;
-    sink_wants_.max_framerate_fps = fps_wanted;
-    source_->AddOrUpdateSink(video_stream_encoder_,
-                             GetActiveSinkWantsInternal());
-    return true;
-  }
-
-  bool IncreaseFramerate(int fps) {
-    // Called on the encoder task queue.
-    rtc::CritScope lock(&crit_);
-    if (!source_ || !IsFramerateScalingEnabled(degradation_preference_))
-      return false;
-
-    const int fps_wanted = std::max(kMinFramerateFps, fps);
-    if (fps_wanted <= sink_wants_.max_framerate_fps)
-      return false;
-
-    LOG(LS_INFO) << "Scaling up framerate: " << fps_wanted;
-    sink_wants_.max_framerate_fps = fps_wanted;
-    source_->AddOrUpdateSink(video_stream_encoder_,
-                             GetActiveSinkWantsInternal());
-    return true;
-  }
-
- private:
-  rtc::VideoSinkWants GetActiveSinkWantsInternal()
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(&crit_) {
-    rtc::VideoSinkWants wants = sink_wants_;
-    // Clear any constraints from the current sink wants that don't apply to
-    // the used degradation_preference.
-    switch (degradation_preference_) {
-      case VideoSendStream::DegradationPreference::kBalanced:
-        break;
-      case VideoSendStream::DegradationPreference::kMaintainFramerate:
-        wants.max_framerate_fps = std::numeric_limits<int>::max();
-        break;
-      case VideoSendStream::DegradationPreference::kMaintainResolution:
-        wants.max_pixel_count = std::numeric_limits<int>::max();
-        wants.target_pixel_count.reset();
-        break;
-      case VideoSendStream::DegradationPreference::kDegradationDisabled:
-        wants.max_pixel_count = std::numeric_limits<int>::max();
-        wants.target_pixel_count.reset();
-        wants.max_framerate_fps = std::numeric_limits<int>::max();
-    }
-    return wants;
-  }
-
-  rtc::CriticalSection crit_;
-  rtc::SequencedTaskChecker main_checker_;
-  VideoStreamEncoder* const video_stream_encoder_;
-  rtc::VideoSinkWants sink_wants_ RTC_GUARDED_BY(&crit_);
-  VideoSendStream::DegradationPreference degradation_preference_
-      RTC_GUARDED_BY(&crit_);
-  rtc::VideoSourceInterface<VideoFrame>* source_ RTC_GUARDED_BY(&crit_);
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(VideoSourceProxy);
-};
-
-VideoStreamEncoder::VideoStreamEncoder(uint32_t number_of_cores,
-                       SendStatisticsProxy* stats_proxy,
-                       const VideoSendStream::Config::EncoderSettings& settings,
-                       rtc::VideoSinkInterface<VideoFrame>* pre_encode_callback,
-                       EncodedFrameObserver* encoder_timing,
-                       std::unique_ptr<OveruseFrameDetector> overuse_detector)
-    : shutdown_event_(true /* manual_reset */, false),
-      number_of_cores_(number_of_cores),
-      initial_rampup_(0),
-      source_proxy_(new VideoSourceProxy(this)),
-      sink_(nullptr),
-      settings_(settings),
-      codec_type_(PayloadStringToCodecType(settings.payload_name)),
-      video_sender_(Clock::GetRealTimeClock(), this, this),
-      overuse_detector_(
-          overuse_detector.get()
-              ? overuse_detector.release()
-              : new OveruseFrameDetector(
-                    GetCpuOveruseOptions(settings.full_overuse_time),
-                    this,
-                    encoder_timing,
-                    stats_proxy)),
-      stats_proxy_(stats_proxy),
-      pre_encode_callback_(pre_encode_callback),
-      module_process_thread_(nullptr),
-      max_framerate_(-1),
-      pending_encoder_reconfiguration_(false),
-      encoder_start_bitrate_bps_(0),
-      max_data_payload_length_(0),
-      nack_enabled_(false),
-      last_observed_bitrate_bps_(0),
-      encoder_paused_and_dropped_frame_(false),
-      clock_(Clock::GetRealTimeClock()),
-      degradation_preference_(
-          VideoSendStream::DegradationPreference::kDegradationDisabled),
-      last_captured_timestamp_(0),
-      delta_ntp_internal_ms_(clock_->CurrentNtpInMilliseconds() -
-                             clock_->TimeInMilliseconds()),
-      last_frame_log_ms_(clock_->TimeInMilliseconds()),
-      captured_frame_count_(0),
-      dropped_frame_count_(0),
-      bitrate_observer_(nullptr),
-      encoder_queue_("EncoderQueue") {
-  RTC_DCHECK(stats_proxy);
-  encoder_queue_.PostTask([this] {
-    RTC_DCHECK_RUN_ON(&encoder_queue_);
-    overuse_detector_->StartCheckForOveruse();
-    video_sender_.RegisterExternalEncoder(
-        settings_.encoder, settings_.payload_type, settings_.internal_source);
-  });
-}
-
-VideoStreamEncoder::~VideoStreamEncoder() {
-  RTC_DCHECK_RUN_ON(&thread_checker_);
-  RTC_DCHECK(shutdown_event_.Wait(0))
-      << "Must call ::Stop() before destruction.";
-}
-
-// TODO(pbos): Lower these thresholds (to closer to 100%) when we handle
-// pipelining encoders better (multiple input frames before something comes
-// out). This should effectively turn off CPU adaptations for systems that
-// remotely cope with the load right now.
-CpuOveruseOptions VideoStreamEncoder::GetCpuOveruseOptions(
-    bool full_overuse_time) {
-  CpuOveruseOptions options;
-  if (full_overuse_time) {
-    options.low_encode_usage_threshold_percent = 150;
-    options.high_encode_usage_threshold_percent = 200;
-  }
-  return options;
-}
-
-void VideoStreamEncoder::Stop() {
-  RTC_DCHECK_RUN_ON(&thread_checker_);
-  source_proxy_->SetSource(nullptr, VideoSendStream::DegradationPreference());
-  encoder_queue_.PostTask([this] {
-    RTC_DCHECK_RUN_ON(&encoder_queue_);
-    overuse_detector_->StopCheckForOveruse();
-    rate_allocator_.reset();
-    bitrate_observer_ = nullptr;
-    video_sender_.RegisterExternalEncoder(nullptr, settings_.payload_type,
-                                          false);
-    quality_scaler_ = nullptr;
-    shutdown_event_.Set();
-  });
-
-  shutdown_event_.Wait(rtc::Event::kForever);
-}
-
-void VideoStreamEncoder::RegisterProcessThread(
-    ProcessThread* module_process_thread) {
-  RTC_DCHECK_RUN_ON(&thread_checker_);
-  RTC_DCHECK(!module_process_thread_);
-  module_process_thread_ = module_process_thread;
-  module_process_thread_->RegisterModule(&video_sender_, RTC_FROM_HERE);
-  module_process_thread_checker_.DetachFromThread();
-}
-
-void VideoStreamEncoder::DeRegisterProcessThread() {
-  RTC_DCHECK_RUN_ON(&thread_checker_);
-  module_process_thread_->DeRegisterModule(&video_sender_);
-}
-
-void VideoStreamEncoder::SetBitrateObserver(
-    VideoBitrateAllocationObserver* bitrate_observer) {
-  RTC_DCHECK_RUN_ON(&thread_checker_);
-  encoder_queue_.PostTask([this, bitrate_observer] {
-    RTC_DCHECK_RUN_ON(&encoder_queue_);
-    RTC_DCHECK(!bitrate_observer_);
-    bitrate_observer_ = bitrate_observer;
-  });
-}
-
-void VideoStreamEncoder::SetSource(
-    rtc::VideoSourceInterface<VideoFrame>* source,
-    const VideoSendStream::DegradationPreference& degradation_preference) {
-  RTC_DCHECK_RUN_ON(&thread_checker_);
-  source_proxy_->SetSource(source, degradation_preference);
-  encoder_queue_.PostTask([this, degradation_preference] {
-    RTC_DCHECK_RUN_ON(&encoder_queue_);
-    if (degradation_preference_ != degradation_preference) {
-      // Reset adaptation state, so that we're not tricked into thinking there's
-      // an already pending request of the same type.
-      last_adaptation_request_.reset();
-      if (degradation_preference ==
-              VideoSendStream::DegradationPreference::kBalanced ||
-          degradation_preference_ ==
-              VideoSendStream::DegradationPreference::kBalanced) {
-        // TODO(asapersson): Consider removing |adapt_counters_| map and use one
-        // AdaptCounter for all modes.
-        source_proxy_->ResetPixelFpsCount();
-        adapt_counters_.clear();
-      }
-    }
-    degradation_preference_ = degradation_preference;
-    bool allow_scaling = IsResolutionScalingEnabled(degradation_preference_);
-    initial_rampup_ = allow_scaling ? 0 : kMaxInitialFramedrop;
-    ConfigureQualityScaler();
-    if (!IsFramerateScalingEnabled(degradation_preference) &&
-        max_framerate_ != -1) {
-      // If frame rate scaling is no longer allowed, remove any potential
-      // allowance for longer frame intervals.
-      overuse_detector_->OnTargetFramerateUpdated(max_framerate_);
-    }
-  });
-}
-
-void VideoStreamEncoder::SetSink(EncoderSink* sink, bool rotation_applied) {
-  source_proxy_->SetWantsRotationApplied(rotation_applied);
-  encoder_queue_.PostTask([this, sink] {
-    RTC_DCHECK_RUN_ON(&encoder_queue_);
-    sink_ = sink;
-  });
-}
-
-void VideoStreamEncoder::SetStartBitrate(int start_bitrate_bps) {
-  encoder_queue_.PostTask([this, start_bitrate_bps] {
-    RTC_DCHECK_RUN_ON(&encoder_queue_);
-    encoder_start_bitrate_bps_ = start_bitrate_bps;
-  });
-}
-
-void VideoStreamEncoder::ConfigureEncoder(VideoEncoderConfig config,
-                                          size_t max_data_payload_length,
-                                          bool nack_enabled) {
-  encoder_queue_.PostTask(
-      std::unique_ptr<rtc::QueuedTask>(new ConfigureEncoderTask(
-          this, std::move(config), max_data_payload_length, nack_enabled)));
-}
-
-void VideoStreamEncoder::ConfigureEncoderOnTaskQueue(
-    VideoEncoderConfig config,
-    size_t max_data_payload_length,
-    bool nack_enabled) {
-  RTC_DCHECK_RUN_ON(&encoder_queue_);
-  RTC_DCHECK(sink_);
-  LOG(LS_INFO) << "ConfigureEncoder requested.";
-
-  max_data_payload_length_ = max_data_payload_length;
-  nack_enabled_ = nack_enabled;
-  encoder_config_ = std::move(config);
-  pending_encoder_reconfiguration_ = true;
-
-  // Reconfigure the encoder now if the encoder has an internal source or
-  // if the frame resolution is known. Otherwise, the reconfiguration is
-  // deferred until the next frame to minimize the number of reconfigurations.
-  // The codec configuration depends on incoming video frame size.
-  if (last_frame_info_) {
-    ReconfigureEncoder();
-  } else if (settings_.internal_source) {
-    last_frame_info_ =
-        rtc::Optional<VideoFrameInfo>(VideoFrameInfo(176, 144, false));
-    ReconfigureEncoder();
-  }
-}
-
-void VideoStreamEncoder::ReconfigureEncoder() {
-  RTC_DCHECK_RUN_ON(&encoder_queue_);
-  RTC_DCHECK(pending_encoder_reconfiguration_);
-  std::vector<VideoStream> streams =
-      encoder_config_.video_stream_factory->CreateEncoderStreams(
-          last_frame_info_->width, last_frame_info_->height, encoder_config_);
-
-  // TODO(ilnik): If configured resolution is significantly less than provided,
-  // e.g. because there are not enough SSRCs for all simulcast streams,
-  // signal new resolutions via SinkWants to video source.
-
-  // Stream dimensions may be not equal to given because of a simulcast
-  // restrictions.
-  int highest_stream_width = static_cast<int>(streams.back().width);
-  int highest_stream_height = static_cast<int>(streams.back().height);
-  // Dimension may be reduced to be, e.g. divisible by 4.
-  RTC_CHECK_GE(last_frame_info_->width, highest_stream_width);
-  RTC_CHECK_GE(last_frame_info_->height, highest_stream_height);
-  crop_width_ = last_frame_info_->width - highest_stream_width;
-  crop_height_ = last_frame_info_->height - highest_stream_height;
-
-  VideoCodec codec;
-  if (!VideoCodecInitializer::SetupCodec(encoder_config_, settings_, streams,
-                                         nack_enabled_, &codec,
-                                         &rate_allocator_)) {
-    LOG(LS_ERROR) << "Failed to create encoder configuration.";
-  }
-
-  codec.startBitrate =
-      std::max(encoder_start_bitrate_bps_ / 1000, codec.minBitrate);
-  codec.startBitrate = std::min(codec.startBitrate, codec.maxBitrate);
-  codec.expect_encode_from_texture = last_frame_info_->is_texture;
-  max_framerate_ = codec.maxFramerate;
-  RTC_DCHECK_LE(max_framerate_, kMaxFramerateFps);
-
-  bool success = video_sender_.RegisterSendCodec(
-                     &codec, number_of_cores_,
-                     static_cast<uint32_t>(max_data_payload_length_)) == VCM_OK;
-  if (!success) {
-    LOG(LS_ERROR) << "Failed to configure encoder.";
-    rate_allocator_.reset();
-  }
-
-  video_sender_.UpdateChannelParemeters(rate_allocator_.get(),
-                                        bitrate_observer_);
-
-  // Get the current actual framerate, as measured by the stats proxy. This is
-  // used to get the correct bitrate layer allocation.
-  int current_framerate = stats_proxy_->GetSendFrameRate();
-  if (current_framerate == 0)
-    current_framerate = codec.maxFramerate;
-  stats_proxy_->OnEncoderReconfigured(
-      encoder_config_,
-      rate_allocator_.get()
-          ? rate_allocator_->GetPreferredBitrateBps(current_framerate)
-          : codec.maxBitrate);
-
-  pending_encoder_reconfiguration_ = false;
-
-  sink_->OnEncoderConfigurationChanged(
-      std::move(streams), encoder_config_.min_transmit_bitrate_bps);
-
-  // Get the current target framerate, ie the maximum framerate as specified by
-  // the current codec configuration, or any limit imposed by cpu adaption in
-  // maintain-resolution or balanced mode. This is used to make sure overuse
-  // detection doesn't needlessly trigger in low and/or variable framerate
-  // scenarios.
-  int target_framerate = std::min(
-      max_framerate_, source_proxy_->GetActiveSinkWants().max_framerate_fps);
-  overuse_detector_->OnTargetFramerateUpdated(target_framerate);
-
-  ConfigureQualityScaler();
-}
-
-void VideoStreamEncoder::ConfigureQualityScaler() {
-  RTC_DCHECK_RUN_ON(&encoder_queue_);
-  const auto scaling_settings = settings_.encoder->GetScalingSettings();
-  const bool quality_scaling_allowed =
-      IsResolutionScalingEnabled(degradation_preference_) &&
-      scaling_settings.enabled;
-
-  if (quality_scaling_allowed) {
-    if (quality_scaler_.get() == nullptr) {
-      // Quality scaler has not already been configured.
-      // Drop frames and scale down until desired quality is achieved.
-      if (scaling_settings.thresholds) {
-        quality_scaler_.reset(
-            new QualityScaler(this, *(scaling_settings.thresholds)));
-      } else {
-        quality_scaler_.reset(new QualityScaler(this, codec_type_));
-      }
-    }
-  } else {
-    quality_scaler_.reset(nullptr);
-    initial_rampup_ = kMaxInitialFramedrop;
-  }
-
-  stats_proxy_->SetAdaptationStats(GetActiveCounts(kCpu),
-                                   GetActiveCounts(kQuality));
-}
-
-void VideoStreamEncoder::OnFrame(const VideoFrame& video_frame) {
-  RTC_DCHECK_RUNS_SERIALIZED(&incoming_frame_race_checker_);
-  VideoFrame incoming_frame = video_frame;
-
-  // Local time in webrtc time base.
-  int64_t current_time_us = clock_->TimeInMicroseconds();
-  int64_t current_time_ms = current_time_us / rtc::kNumMicrosecsPerMillisec;
-  // In some cases, e.g., when the frame from decoder is fed to encoder,
-  // the timestamp may be set to the future. As the encoding pipeline assumes
-  // capture time to be less than present time, we should reset the capture
-  // timestamps here. Otherwise there may be issues with RTP send stream.
-  if (incoming_frame.timestamp_us() > current_time_us)
-    incoming_frame.set_timestamp_us(current_time_us);
-
-  // Capture time may come from clock with an offset and drift from clock_.
-  int64_t capture_ntp_time_ms;
-  if (video_frame.ntp_time_ms() > 0) {
-    capture_ntp_time_ms = video_frame.ntp_time_ms();
-  } else if (video_frame.render_time_ms() != 0) {
-    capture_ntp_time_ms = video_frame.render_time_ms() + delta_ntp_internal_ms_;
-  } else {
-    capture_ntp_time_ms = current_time_ms + delta_ntp_internal_ms_;
-  }
-  incoming_frame.set_ntp_time_ms(capture_ntp_time_ms);
-
-  // Convert NTP time, in ms, to RTP timestamp.
-  const int kMsToRtpTimestamp = 90;
-  incoming_frame.set_timestamp(
-      kMsToRtpTimestamp * static_cast<uint32_t>(incoming_frame.ntp_time_ms()));
-
-  if (incoming_frame.ntp_time_ms() <= last_captured_timestamp_) {
-    // We don't allow the same capture time for two frames, drop this one.
-    LOG(LS_WARNING) << "Same/old NTP timestamp ("
-                    << incoming_frame.ntp_time_ms()
-                    << " <= " << last_captured_timestamp_
-                    << ") for incoming frame. Dropping.";
-    return;
-  }
-
-  bool log_stats = false;
-  if (current_time_ms - last_frame_log_ms_ > kFrameLogIntervalMs) {
-    last_frame_log_ms_ = current_time_ms;
-    log_stats = true;
-  }
-
-  last_captured_timestamp_ = incoming_frame.ntp_time_ms();
-  encoder_queue_.PostTask(std::unique_ptr<rtc::QueuedTask>(new EncodeTask(
-      incoming_frame, this, rtc::TimeMicros(), log_stats)));
-}
-
-bool VideoStreamEncoder::EncoderPaused() const {
-  RTC_DCHECK_RUN_ON(&encoder_queue_);
-  // Pause video if paused by caller or as long as the network is down or the
-  // pacer queue has grown too large in buffered mode.
-  // If the pacer queue has grown too large or the network is down,
-  // last_observed_bitrate_bps_ will be 0.
-  return last_observed_bitrate_bps_ == 0;
-}
-
-void VideoStreamEncoder::TraceFrameDropStart() {
-  RTC_DCHECK_RUN_ON(&encoder_queue_);
-  // Start trace event only on the first frame after encoder is paused.
-  if (!encoder_paused_and_dropped_frame_) {
-    TRACE_EVENT_ASYNC_BEGIN0("webrtc", "EncoderPaused", this);
-  }
-  encoder_paused_and_dropped_frame_ = true;
-}
-
-void VideoStreamEncoder::TraceFrameDropEnd() {
-  RTC_DCHECK_RUN_ON(&encoder_queue_);
-  // End trace event on first frame after encoder resumes, if frame was dropped.
-  if (encoder_paused_and_dropped_frame_) {
-    TRACE_EVENT_ASYNC_END0("webrtc", "EncoderPaused", this);
-  }
-  encoder_paused_and_dropped_frame_ = false;
-}
-
-void VideoStreamEncoder::EncodeVideoFrame(const VideoFrame& video_frame,
-                                          int64_t time_when_posted_us) {
-  RTC_DCHECK_RUN_ON(&encoder_queue_);
-
-  if (pre_encode_callback_)
-    pre_encode_callback_->OnFrame(video_frame);
-
-  if (!last_frame_info_ || video_frame.width() != last_frame_info_->width ||
-      video_frame.height() != last_frame_info_->height ||
-      video_frame.is_texture() != last_frame_info_->is_texture) {
-    pending_encoder_reconfiguration_ = true;
-    last_frame_info_ = rtc::Optional<VideoFrameInfo>(VideoFrameInfo(
-        video_frame.width(), video_frame.height(), video_frame.is_texture()));
-    LOG(LS_INFO) << "Video frame parameters changed: dimensions="
-                 << last_frame_info_->width << "x" << last_frame_info_->height
-                 << ", texture=" << last_frame_info_->is_texture << ".";
-  }
-
-  if (initial_rampup_ < kMaxInitialFramedrop &&
-      video_frame.size() >
-          MaximumFrameSizeForBitrate(encoder_start_bitrate_bps_ / 1000)) {
-    LOG(LS_INFO) << "Dropping frame. Too large for target bitrate.";
-    AdaptDown(kQuality);
-    ++initial_rampup_;
-    return;
-  }
-  initial_rampup_ = kMaxInitialFramedrop;
-
-  int64_t now_ms = clock_->TimeInMilliseconds();
-  if (pending_encoder_reconfiguration_) {
-    ReconfigureEncoder();
-    last_parameters_update_ms_.emplace(now_ms);
-  } else if (!last_parameters_update_ms_ ||
-             now_ms - *last_parameters_update_ms_ >=
-                 vcm::VCMProcessTimer::kDefaultProcessIntervalMs) {
-    video_sender_.UpdateChannelParemeters(rate_allocator_.get(),
-                                          bitrate_observer_);
-    last_parameters_update_ms_.emplace(now_ms);
-  }
-
-  if (EncoderPaused()) {
-    TraceFrameDropStart();
-    return;
-  }
-  TraceFrameDropEnd();
-
-  VideoFrame out_frame(video_frame);
-  // Crop frame if needed.
-  if (crop_width_ > 0 || crop_height_ > 0) {
-    int cropped_width = video_frame.width() - crop_width_;
-    int cropped_height = video_frame.height() - crop_height_;
-    rtc::scoped_refptr<I420Buffer> cropped_buffer =
-        I420Buffer::Create(cropped_width, cropped_height);
-    // TODO(ilnik): Remove scaling if cropping is too big, as it should never
-    // happen after SinkWants signaled correctly from ReconfigureEncoder.
-    if (crop_width_ < 4 && crop_height_ < 4) {
-      cropped_buffer->CropAndScaleFrom(
-          *video_frame.video_frame_buffer()->ToI420(), crop_width_ / 2,
-          crop_height_ / 2, cropped_width, cropped_height);
-    } else {
-      cropped_buffer->ScaleFrom(
-          *video_frame.video_frame_buffer()->ToI420().get());
-    }
-    out_frame =
-        VideoFrame(cropped_buffer, video_frame.timestamp(),
-                   video_frame.render_time_ms(), video_frame.rotation());
-    out_frame.set_ntp_time_ms(video_frame.ntp_time_ms());
-  }
-
-  TRACE_EVENT_ASYNC_STEP0("webrtc", "Video", video_frame.render_time_ms(),
-                          "Encode");
-
-  overuse_detector_->FrameCaptured(out_frame, time_when_posted_us);
-
-  video_sender_.AddVideoFrame(out_frame, nullptr);
-}
-
-void VideoStreamEncoder::SendKeyFrame() {
-  if (!encoder_queue_.IsCurrent()) {
-    encoder_queue_.PostTask([this] { SendKeyFrame(); });
-    return;
-  }
-  RTC_DCHECK_RUN_ON(&encoder_queue_);
-  video_sender_.IntraFrameRequest(0);
-}
-
-EncodedImageCallback::Result VideoStreamEncoder::OnEncodedImage(
-    const EncodedImage& encoded_image,
-    const CodecSpecificInfo* codec_specific_info,
-    const RTPFragmentationHeader* fragmentation) {
-  // Encoded is called on whatever thread the real encoder implementation run
-  // on. In the case of hardware encoders, there might be several encoders
-  // running in parallel on different threads.
-  stats_proxy_->OnSendEncodedImage(encoded_image, codec_specific_info);
-
-  EncodedImageCallback::Result result =
-      sink_->OnEncodedImage(encoded_image, codec_specific_info, fragmentation);
-
-  int64_t time_sent_us = rtc::TimeMicros();
-  uint32_t timestamp = encoded_image._timeStamp;
-  const int qp = encoded_image.qp_;
-  encoder_queue_.PostTask([this, timestamp, time_sent_us, qp] {
-    RTC_DCHECK_RUN_ON(&encoder_queue_);
-    overuse_detector_->FrameSent(timestamp, time_sent_us);
-    if (quality_scaler_ && qp >= 0)
-      quality_scaler_->ReportQP(qp);
-  });
-
-  return result;
-}
-
-void VideoStreamEncoder::OnDroppedFrame() {
-  encoder_queue_.PostTask([this] {
-    RTC_DCHECK_RUN_ON(&encoder_queue_);
-    if (quality_scaler_)
-      quality_scaler_->ReportDroppedFrame();
-  });
-}
-
-void VideoStreamEncoder::SendStatistics(uint32_t bit_rate,
-                                        uint32_t frame_rate) {
-  RTC_DCHECK(module_process_thread_checker_.CalledOnValidThread());
-  stats_proxy_->OnEncoderStatsUpdate(frame_rate, bit_rate);
-}
-
-void VideoStreamEncoder::OnReceivedIntraFrameRequest(size_t stream_index) {
-  if (!encoder_queue_.IsCurrent()) {
-    encoder_queue_.PostTask(
-        [this, stream_index] { OnReceivedIntraFrameRequest(stream_index); });
-    return;
-  }
-  RTC_DCHECK_RUN_ON(&encoder_queue_);
-  // Key frame request from remote side, signal to VCM.
-  TRACE_EVENT0("webrtc", "OnKeyFrameRequest");
-  video_sender_.IntraFrameRequest(stream_index);
-}
-
-void VideoStreamEncoder::OnBitrateUpdated(uint32_t bitrate_bps,
-                                          uint8_t fraction_lost,
-                                          int64_t round_trip_time_ms) {
-  if (!encoder_queue_.IsCurrent()) {
-    encoder_queue_.PostTask(
-        [this, bitrate_bps, fraction_lost, round_trip_time_ms] {
-          OnBitrateUpdated(bitrate_bps, fraction_lost, round_trip_time_ms);
-        });
-    return;
-  }
-  RTC_DCHECK_RUN_ON(&encoder_queue_);
-  RTC_DCHECK(sink_) << "sink_ must be set before the encoder is active.";
-
-  LOG(LS_VERBOSE) << "OnBitrateUpdated, bitrate " << bitrate_bps
-                  << " packet loss " << static_cast<int>(fraction_lost)
-                  << " rtt " << round_trip_time_ms;
-
-  video_sender_.SetChannelParameters(bitrate_bps, fraction_lost,
-                                     round_trip_time_ms, rate_allocator_.get(),
-                                     bitrate_observer_);
-
-  encoder_start_bitrate_bps_ =
-      bitrate_bps != 0 ? bitrate_bps : encoder_start_bitrate_bps_;
-  bool video_is_suspended = bitrate_bps == 0;
-  bool video_suspension_changed = video_is_suspended != EncoderPaused();
-  last_observed_bitrate_bps_ = bitrate_bps;
-
-  if (video_suspension_changed) {
-    LOG(LS_INFO) << "Video suspend state changed to: "
-                 << (video_is_suspended ? "suspended" : "not suspended");
-    stats_proxy_->OnSuspendChange(video_is_suspended);
-  }
-}
-
-void VideoStreamEncoder::AdaptDown(AdaptReason reason) {
-  RTC_DCHECK_RUN_ON(&encoder_queue_);
-  AdaptationRequest adaptation_request = {
-      last_frame_info_->pixel_count(),
-      stats_proxy_->GetStats().input_frame_rate,
-      AdaptationRequest::Mode::kAdaptDown};
-
-  bool downgrade_requested =
-      last_adaptation_request_ &&
-      last_adaptation_request_->mode_ == AdaptationRequest::Mode::kAdaptDown;
-
-  switch (degradation_preference_) {
-    case VideoSendStream::DegradationPreference::kBalanced:
-      break;
-    case VideoSendStream::DegradationPreference::kMaintainFramerate:
-      if (downgrade_requested &&
-          adaptation_request.input_pixel_count_ >=
-              last_adaptation_request_->input_pixel_count_) {
-        // Don't request lower resolution if the current resolution is not
-        // lower than the last time we asked for the resolution to be lowered.
-        return;
-      }
-      break;
-    case VideoSendStream::DegradationPreference::kMaintainResolution:
-      if (adaptation_request.framerate_fps_ <= 0 ||
-          (downgrade_requested &&
-           adaptation_request.framerate_fps_ < kMinFramerateFps)) {
-        // If no input fps estimate available, can't determine how to scale down
-        // framerate. Otherwise, don't request lower framerate if we don't have
-        // a valid frame rate. Since framerate, unlike resolution, is a measure
-        // we have to estimate, and can fluctuate naturally over time, don't
-        // make the same kind of limitations as for resolution, but trust the
-        // overuse detector to not trigger too often.
-        return;
-      }
-      break;
-    case VideoSendStream::DegradationPreference::kDegradationDisabled:
-      return;
-  }
-
-  if (reason == kCpu) {
-    if (GetConstAdaptCounter().ResolutionCount(kCpu) >=
-            kMaxCpuResolutionDowngrades ||
-        GetConstAdaptCounter().FramerateCount(kCpu) >=
-            kMaxCpuFramerateDowngrades) {
-      return;
-    }
-  }
-
-  switch (degradation_preference_) {
-    case VideoSendStream::DegradationPreference::kBalanced: {
-      // Try scale down framerate, if lower.
-      int fps = MinFps(last_frame_info_->pixel_count());
-      if (source_proxy_->RestrictFramerate(fps)) {
-        GetAdaptCounter().IncrementFramerate(reason);
-        break;
-      }
-      // Scale down resolution.
-      FALLTHROUGH();
-    }
-    case VideoSendStream::DegradationPreference::kMaintainFramerate:
-      // Scale down resolution.
-      if (!source_proxy_->RequestResolutionLowerThan(
-              adaptation_request.input_pixel_count_,
-              settings_.encoder->GetScalingSettings().min_pixels_per_frame)) {
-        return;
-      }
-      GetAdaptCounter().IncrementResolution(reason);
-      break;
-    case VideoSendStream::DegradationPreference::kMaintainResolution: {
-      // Scale down framerate.
-      const int requested_framerate = source_proxy_->RequestFramerateLowerThan(
-          adaptation_request.framerate_fps_);
-      if (requested_framerate == -1)
-        return;
-      RTC_DCHECK_NE(max_framerate_, -1);
-      overuse_detector_->OnTargetFramerateUpdated(
-          std::min(max_framerate_, requested_framerate));
-      GetAdaptCounter().IncrementFramerate(reason);
-      break;
-    }
-    case VideoSendStream::DegradationPreference::kDegradationDisabled:
-      RTC_NOTREACHED();
-  }
-
-  last_adaptation_request_.emplace(adaptation_request);
-
-  UpdateAdaptationStats(reason);
-
-  LOG(LS_INFO) << GetConstAdaptCounter().ToString();
-}
-
-void VideoStreamEncoder::AdaptUp(AdaptReason reason) {
-  RTC_DCHECK_RUN_ON(&encoder_queue_);
-
-  const AdaptCounter& adapt_counter = GetConstAdaptCounter();
-  int num_downgrades = adapt_counter.TotalCount(reason);
-  if (num_downgrades == 0)
-    return;
-  RTC_DCHECK_GT(num_downgrades, 0);
-
-  AdaptationRequest adaptation_request = {
-      last_frame_info_->pixel_count(),
-      stats_proxy_->GetStats().input_frame_rate,
-      AdaptationRequest::Mode::kAdaptUp};
-
-  bool adapt_up_requested =
-      last_adaptation_request_ &&
-      last_adaptation_request_->mode_ == AdaptationRequest::Mode::kAdaptUp;
-
-  if (degradation_preference_ ==
-      VideoSendStream::DegradationPreference::kMaintainFramerate) {
-    if (adapt_up_requested &&
-        adaptation_request.input_pixel_count_ <=
-            last_adaptation_request_->input_pixel_count_) {
-      // Don't request higher resolution if the current resolution is not
-      // higher than the last time we asked for the resolution to be higher.
-      return;
-    }
-  }
-
-  switch (degradation_preference_) {
-    case VideoSendStream::DegradationPreference::kBalanced: {
-      // Try scale up framerate, if higher.
-      int fps = MaxFps(last_frame_info_->pixel_count());
-      if (source_proxy_->IncreaseFramerate(fps)) {
-        GetAdaptCounter().DecrementFramerate(reason, fps);
-        // Reset framerate in case of fewer fps steps down than up.
-        if (adapt_counter.FramerateCount() == 0 &&
-            fps != std::numeric_limits<int>::max()) {
-          LOG(LS_INFO) << "Removing framerate down-scaling setting.";
-          source_proxy_->IncreaseFramerate(std::numeric_limits<int>::max());
-        }
-        break;
-      }
-      // Scale up resolution.
-      FALLTHROUGH();
-    }
-    case VideoSendStream::DegradationPreference::kMaintainFramerate: {
-      // Scale up resolution.
-      int pixel_count = adaptation_request.input_pixel_count_;
-      if (adapt_counter.ResolutionCount() == 1) {
-        LOG(LS_INFO) << "Removing resolution down-scaling setting.";
-        pixel_count = std::numeric_limits<int>::max();
-      }
-      if (!source_proxy_->RequestHigherResolutionThan(pixel_count))
-        return;
-      GetAdaptCounter().DecrementResolution(reason);
-      break;
-    }
-    case VideoSendStream::DegradationPreference::kMaintainResolution: {
-      // Scale up framerate.
-      int fps = adaptation_request.framerate_fps_;
-      if (adapt_counter.FramerateCount() == 1) {
-        LOG(LS_INFO) << "Removing framerate down-scaling setting.";
-        fps = std::numeric_limits<int>::max();
-      }
-
-      const int requested_framerate =
-          source_proxy_->RequestHigherFramerateThan(fps);
-      if (requested_framerate == -1) {
-        overuse_detector_->OnTargetFramerateUpdated(max_framerate_);
-        return;
-      }
-      overuse_detector_->OnTargetFramerateUpdated(
-          std::min(max_framerate_, requested_framerate));
-      GetAdaptCounter().DecrementFramerate(reason);
-      break;
-    }
-    case VideoSendStream::DegradationPreference::kDegradationDisabled:
-      return;
-  }
-
-  last_adaptation_request_.emplace(adaptation_request);
-
-  UpdateAdaptationStats(reason);
-
-  LOG(LS_INFO) << adapt_counter.ToString();
-}
-
-void VideoStreamEncoder::UpdateAdaptationStats(AdaptReason reason) {
-  switch (reason) {
-    case kCpu:
-      stats_proxy_->OnCpuAdaptationChanged(GetActiveCounts(kCpu),
-                                           GetActiveCounts(kQuality));
-      break;
-    case kQuality:
-      stats_proxy_->OnQualityAdaptationChanged(GetActiveCounts(kCpu),
-                                               GetActiveCounts(kQuality));
-      break;
-  }
-}
-
-VideoStreamEncoder::AdaptCounts VideoStreamEncoder::GetActiveCounts(
-    AdaptReason reason) {
-  VideoStreamEncoder::AdaptCounts counts =
-      GetConstAdaptCounter().Counts(reason);
-  switch (reason) {
-    case kCpu:
-      if (!IsFramerateScalingEnabled(degradation_preference_))
-        counts.fps = -1;
-      if (!IsResolutionScalingEnabled(degradation_preference_))
-        counts.resolution = -1;
-      break;
-    case kQuality:
-      if (!IsFramerateScalingEnabled(degradation_preference_) ||
-          !quality_scaler_) {
-        counts.fps = -1;
-      }
-      if (!IsResolutionScalingEnabled(degradation_preference_) ||
-          !quality_scaler_) {
-        counts.resolution = -1;
-      }
-      break;
-  }
-  return counts;
-}
-
-VideoStreamEncoder::AdaptCounter& VideoStreamEncoder::GetAdaptCounter() {
-  return adapt_counters_[degradation_preference_];
-}
-
-const VideoStreamEncoder::AdaptCounter&
-VideoStreamEncoder::GetConstAdaptCounter() {
-  return adapt_counters_[degradation_preference_];
-}
-
-// Class holding adaptation information.
-VideoStreamEncoder::AdaptCounter::AdaptCounter() {
-  fps_counters_.resize(kScaleReasonSize);
-  resolution_counters_.resize(kScaleReasonSize);
-  static_assert(kScaleReasonSize == 2, "Update MoveCount.");
-}
-
-VideoStreamEncoder::AdaptCounter::~AdaptCounter() {}
-
-std::string VideoStreamEncoder::AdaptCounter::ToString() const {
-  std::stringstream ss;
-  ss << "Downgrade counts: fps: {" << ToString(fps_counters_);
-  ss << "}, resolution: {" << ToString(resolution_counters_) << "}";
-  return ss.str();
-}
-
-VideoStreamEncoder::AdaptCounts VideoStreamEncoder::AdaptCounter::Counts(
-    int reason) const {
-  AdaptCounts counts;
-  counts.fps = fps_counters_[reason];
-  counts.resolution = resolution_counters_[reason];
-  return counts;
-}
-
-void VideoStreamEncoder::AdaptCounter::IncrementFramerate(int reason) {
-  ++(fps_counters_[reason]);
-}
-
-void VideoStreamEncoder::AdaptCounter::IncrementResolution(int reason) {
-  ++(resolution_counters_[reason]);
-}
-
-void VideoStreamEncoder::AdaptCounter::DecrementFramerate(int reason) {
-  if (fps_counters_[reason] == 0) {
-    // Balanced mode: Adapt up is in a different order, switch reason.
-    // E.g. framerate adapt down: quality (2), framerate adapt up: cpu (3).
-    // 1. Down resolution (cpu):   res={quality:0,cpu:1}, fps={quality:0,cpu:0}
-    // 2. Down fps (quality):      res={quality:0,cpu:1}, fps={quality:1,cpu:0}
-    // 3. Up fps (cpu):            res={quality:1,cpu:0}, fps={quality:0,cpu:0}
-    // 4. Up resolution (quality): res={quality:0,cpu:0}, fps={quality:0,cpu:0}
-    RTC_DCHECK_GT(TotalCount(reason), 0) << "No downgrade for reason.";
-    RTC_DCHECK_GT(FramerateCount(), 0) << "Framerate not downgraded.";
-    MoveCount(&resolution_counters_, reason);
-    MoveCount(&fps_counters_, (reason + 1) % kScaleReasonSize);
-  }
-  --(fps_counters_[reason]);
-  RTC_DCHECK_GE(fps_counters_[reason], 0);
-}
-
-void VideoStreamEncoder::AdaptCounter::DecrementResolution(int reason) {
-  if (resolution_counters_[reason] == 0) {
-    // Balanced mode: Adapt up is in a different order, switch reason.
-    RTC_DCHECK_GT(TotalCount(reason), 0) << "No downgrade for reason.";
-    RTC_DCHECK_GT(ResolutionCount(), 0) << "Resolution not downgraded.";
-    MoveCount(&fps_counters_, reason);
-    MoveCount(&resolution_counters_, (reason + 1) % kScaleReasonSize);
-  }
-  --(resolution_counters_[reason]);
-  RTC_DCHECK_GE(resolution_counters_[reason], 0);
-}
-
-void VideoStreamEncoder::AdaptCounter::DecrementFramerate(int reason,
-                                                          int cur_fps) {
-  DecrementFramerate(reason);
-  // Reset if at max fps (i.e. in case of fewer steps up than down).
-  if (cur_fps == std::numeric_limits<int>::max())
-    std::fill(fps_counters_.begin(), fps_counters_.end(), 0);
-}
-
-int VideoStreamEncoder::AdaptCounter::FramerateCount() const {
-  return Count(fps_counters_);
-}
-
-int VideoStreamEncoder::AdaptCounter::ResolutionCount() const {
-  return Count(resolution_counters_);
-}
-
-int VideoStreamEncoder::AdaptCounter::FramerateCount(int reason) const {
-  return fps_counters_[reason];
-}
-
-int VideoStreamEncoder::AdaptCounter::ResolutionCount(int reason) const {
-  return resolution_counters_[reason];
-}
-
-int VideoStreamEncoder::AdaptCounter::TotalCount(int reason) const {
-  return FramerateCount(reason) + ResolutionCount(reason);
-}
-
-int VideoStreamEncoder::AdaptCounter::Count(
-    const std::vector<int>& counters) const {
-  return std::accumulate(counters.begin(), counters.end(), 0);
-}
-
-void VideoStreamEncoder::AdaptCounter::MoveCount(std::vector<int>* counters,
-                                                 int from_reason) {
-  int to_reason = (from_reason + 1) % kScaleReasonSize;
-  ++((*counters)[to_reason]);
-  --((*counters)[from_reason]);
-}
-
-std::string VideoStreamEncoder::AdaptCounter::ToString(
-    const std::vector<int>& counters) const {
-  std::stringstream ss;
-  for (size_t reason = 0; reason < kScaleReasonSize; ++reason) {
-    ss << (reason ? " cpu" : "quality") << ":" << counters[reason];
-  }
-  return ss.str();
-}
-
-}  // namespace webrtc
diff --git a/video/video_stream_encoder.h b/video/video_stream_encoder.h
deleted file mode 100644
index a0fa2df..0000000
--- a/video/video_stream_encoder.h
+++ /dev/null
@@ -1,319 +0,0 @@
-/*
- *  Copyright (c) 2012 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_VIDEO_VIDEO_STREAM_ENCODER_H_
-#define WEBRTC_VIDEO_VIDEO_STREAM_ENCODER_H_
-
-#include <map>
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "webrtc/api/video/video_rotation.h"
-#include "webrtc/api/video_codecs/video_encoder.h"
-#include "webrtc/call/call.h"
-#include "webrtc/common_types.h"
-#include "webrtc/common_video/include/video_bitrate_allocator.h"
-#include "webrtc/media/base/videosinkinterface.h"
-#include "webrtc/modules/video_coding/include/video_coding_defines.h"
-#include "webrtc/modules/video_coding/utility/quality_scaler.h"
-#include "webrtc/modules/video_coding/video_coding_impl.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/event.h"
-#include "webrtc/rtc_base/sequenced_task_checker.h"
-#include "webrtc/rtc_base/task_queue.h"
-#include "webrtc/system_wrappers/include/atomic32.h"
-#include "webrtc/typedefs.h"
-#include "webrtc/video/overuse_frame_detector.h"
-#include "webrtc/call/video_send_stream.h"
-
-namespace webrtc {
-
-class ProcessThread;
-class SendStatisticsProxy;
-class VideoBitrateAllocationObserver;
-
-// VideoStreamEncoder represent a video encoder that accepts raw video frames as
-// input and produces an encoded bit stream.
-// Usage:
-//  Instantiate.
-//  Call SetSink.
-//  Call SetSource.
-//  Call ConfigureEncoder with the codec settings.
-//  Call Stop() when done.
-class VideoStreamEncoder : public rtc::VideoSinkInterface<VideoFrame>,
-                           public EncodedImageCallback,
-                           public VCMSendStatisticsCallback,
-                           public AdaptationObserverInterface {
- public:
-  // Interface for receiving encoded video frames and notifications about
-  // configuration changes.
-  class EncoderSink : public EncodedImageCallback {
-   public:
-    virtual void OnEncoderConfigurationChanged(
-        std::vector<VideoStream> streams,
-        int min_transmit_bitrate_bps) = 0;
-  };
-
-  // Number of resolution and framerate reductions (-1: disabled).
-  struct AdaptCounts {
-    int resolution = 0;
-    int fps = 0;
-  };
-
-  // Downscale resolution at most 2 times for CPU reasons.
-  static const int kMaxCpuResolutionDowngrades = 2;
-  // Downscale framerate at most 4 times.
-  static const int kMaxCpuFramerateDowngrades = 4;
-
-  VideoStreamEncoder(uint32_t number_of_cores,
-                     SendStatisticsProxy* stats_proxy,
-                     const VideoSendStream::Config::EncoderSettings& settings,
-                     rtc::VideoSinkInterface<VideoFrame>* pre_encode_callback,
-                     EncodedFrameObserver* encoder_timing,
-                     std::unique_ptr<OveruseFrameDetector> overuse_detector);
-  ~VideoStreamEncoder();
-  // RegisterProcessThread register |module_process_thread| with those objects
-  // that use it. Registration has to happen on the thread where
-  // |module_process_thread| was created (libjingle's worker thread).
-  // TODO(perkj): Replace the use of |module_process_thread| with a TaskQueue.
-  void RegisterProcessThread(ProcessThread* module_process_thread);
-  void DeRegisterProcessThread();
-
-  // Sets the source that will provide I420 video frames.
-  // |degradation_preference| control whether or not resolution or frame rate
-  // may be reduced.
-  void SetSource(
-      rtc::VideoSourceInterface<VideoFrame>* source,
-      const VideoSendStream::DegradationPreference& degradation_preference);
-
-  // Sets the |sink| that gets the encoded frames. |rotation_applied| means
-  // that the source must support rotation. Only set |rotation_applied| if the
-  // remote side does not support the rotation extension.
-  void SetSink(EncoderSink* sink, bool rotation_applied);
-
-  // TODO(perkj): Can we remove VideoCodec.startBitrate ?
-  void SetStartBitrate(int start_bitrate_bps);
-
-  void SetBitrateObserver(VideoBitrateAllocationObserver* bitrate_observer);
-
-  void ConfigureEncoder(VideoEncoderConfig config,
-                        size_t max_data_payload_length,
-                        bool nack_enabled);
-
-  // Permanently stop encoding. After this method has returned, it is
-  // guaranteed that no encoded frames will be delivered to the sink.
-  void Stop();
-
-  void SendKeyFrame();
-
-  // virtual to test EncoderStateFeedback with mocks.
-  virtual void OnReceivedIntraFrameRequest(size_t stream_index);
-
-  void OnBitrateUpdated(uint32_t bitrate_bps,
-                        uint8_t fraction_lost,
-                        int64_t round_trip_time_ms);
-
- protected:
-  // Used for testing. For example the |ScalingObserverInterface| methods must
-  // be called on |encoder_queue_|.
-  rtc::TaskQueue* encoder_queue() { return &encoder_queue_; }
-
-  // webrtc::ScalingObserverInterface implementation.
-  // These methods are protected for easier testing.
-  void AdaptUp(AdaptReason reason) override;
-  void AdaptDown(AdaptReason reason) override;
-  static CpuOveruseOptions GetCpuOveruseOptions(bool full_overuse_time);
-
- private:
-  class ConfigureEncoderTask;
-  class EncodeTask;
-  class VideoSourceProxy;
-
-  class VideoFrameInfo {
-   public:
-    VideoFrameInfo(int width,
-                   int height,
-                   bool is_texture)
-        : width(width),
-          height(height),
-          is_texture(is_texture) {}
-    int width;
-    int height;
-    bool is_texture;
-    int pixel_count() const { return width * height; }
-  };
-
-  void ConfigureEncoderOnTaskQueue(VideoEncoderConfig config,
-                                   size_t max_data_payload_length,
-                                   bool nack_enabled);
-  void ReconfigureEncoder();
-
-  void ConfigureQualityScaler();
-
-  // Implements VideoSinkInterface.
-  void OnFrame(const VideoFrame& video_frame) override;
-
-  // Implements VideoSendStatisticsCallback.
-  void SendStatistics(uint32_t bit_rate,
-                      uint32_t frame_rate) override;
-
-  void EncodeVideoFrame(const VideoFrame& frame,
-                        int64_t time_when_posted_in_ms);
-
-  // Implements EncodedImageCallback.
-  EncodedImageCallback::Result OnEncodedImage(
-      const EncodedImage& encoded_image,
-      const CodecSpecificInfo* codec_specific_info,
-      const RTPFragmentationHeader* fragmentation) override;
-
-  void OnDroppedFrame() override;
-
-  bool EncoderPaused() const;
-  void TraceFrameDropStart();
-  void TraceFrameDropEnd();
-
-  // Class holding adaptation information.
-  class AdaptCounter final {
-   public:
-    AdaptCounter();
-    ~AdaptCounter();
-
-    // Get number of adaptation downscales for |reason|.
-    AdaptCounts Counts(int reason) const;
-
-    std::string ToString() const;
-
-    void IncrementFramerate(int reason);
-    void IncrementResolution(int reason);
-    void DecrementFramerate(int reason);
-    void DecrementResolution(int reason);
-    void DecrementFramerate(int reason, int cur_fps);
-
-    // Gets the total number of downgrades (for all adapt reasons).
-    int FramerateCount() const;
-    int ResolutionCount() const;
-
-    // Gets the total number of downgrades for |reason|.
-    int FramerateCount(int reason) const;
-    int ResolutionCount(int reason) const;
-    int TotalCount(int reason) const;
-
-   private:
-    std::string ToString(const std::vector<int>& counters) const;
-    int Count(const std::vector<int>& counters) const;
-    void MoveCount(std::vector<int>* counters, int from_reason);
-
-    // Degradation counters holding number of framerate/resolution reductions
-    // per adapt reason.
-    std::vector<int> fps_counters_;
-    std::vector<int> resolution_counters_;
-  };
-
-  AdaptCounter& GetAdaptCounter() RTC_RUN_ON(&encoder_queue_);
-  const AdaptCounter& GetConstAdaptCounter() RTC_RUN_ON(&encoder_queue_);
-  void UpdateAdaptationStats(AdaptReason reason) RTC_RUN_ON(&encoder_queue_);
-  AdaptCounts GetActiveCounts(AdaptReason reason) RTC_RUN_ON(&encoder_queue_);
-
-  rtc::Event shutdown_event_;
-
-  const uint32_t number_of_cores_;
-  // Counts how many frames we've dropped in the initial rampup phase.
-  int initial_rampup_;
-
-  const std::unique_ptr<VideoSourceProxy> source_proxy_;
-  EncoderSink* sink_;
-  const VideoSendStream::Config::EncoderSettings settings_;
-  const VideoCodecType codec_type_;
-
-  vcm::VideoSender video_sender_ RTC_ACCESS_ON(&encoder_queue_);
-  std::unique_ptr<OveruseFrameDetector> overuse_detector_
-      RTC_ACCESS_ON(&encoder_queue_);
-  std::unique_ptr<QualityScaler> quality_scaler_ RTC_ACCESS_ON(&encoder_queue_);
-
-  SendStatisticsProxy* const stats_proxy_;
-  rtc::VideoSinkInterface<VideoFrame>* const pre_encode_callback_;
-  ProcessThread* module_process_thread_;
-  rtc::ThreadChecker module_process_thread_checker_;
-  // |thread_checker_| checks that public methods that are related to lifetime
-  // of VideoStreamEncoder are called on the same thread.
-  rtc::ThreadChecker thread_checker_;
-
-  VideoEncoderConfig encoder_config_ RTC_ACCESS_ON(&encoder_queue_);
-  std::unique_ptr<VideoBitrateAllocator> rate_allocator_
-      RTC_ACCESS_ON(&encoder_queue_);
-  // The maximum frame rate of the current codec configuration, as determined
-  // at the last ReconfigureEncoder() call.
-  int max_framerate_ RTC_ACCESS_ON(&encoder_queue_);
-
-  // Set when ConfigureEncoder has been called in order to lazy reconfigure the
-  // encoder on the next frame.
-  bool pending_encoder_reconfiguration_ RTC_ACCESS_ON(&encoder_queue_);
-  rtc::Optional<VideoFrameInfo> last_frame_info_ RTC_ACCESS_ON(&encoder_queue_);
-  int crop_width_ RTC_ACCESS_ON(&encoder_queue_);
-  int crop_height_ RTC_ACCESS_ON(&encoder_queue_);
-  uint32_t encoder_start_bitrate_bps_ RTC_ACCESS_ON(&encoder_queue_);
-  size_t max_data_payload_length_ RTC_ACCESS_ON(&encoder_queue_);
-  bool nack_enabled_ RTC_ACCESS_ON(&encoder_queue_);
-  uint32_t last_observed_bitrate_bps_ RTC_ACCESS_ON(&encoder_queue_);
-  bool encoder_paused_and_dropped_frame_ RTC_ACCESS_ON(&encoder_queue_);
-  Clock* const clock_;
-  // Counters used for deciding if the video resolution or framerate is
-  // currently restricted, and if so, why, on a per degradation preference
-  // basis.
-  // TODO(sprang): Replace this with a state holding a relative overuse measure
-  // instead, that can be translated into suitable down-scale or fps limit.
-  std::map<const VideoSendStream::DegradationPreference, AdaptCounter>
-      adapt_counters_ RTC_ACCESS_ON(&encoder_queue_);
-  // Set depending on degradation preferences.
-  VideoSendStream::DegradationPreference degradation_preference_
-      RTC_ACCESS_ON(&encoder_queue_);
-
-  struct AdaptationRequest {
-    // The pixel count produced by the source at the time of the adaptation.
-    int input_pixel_count_;
-    // Framerate received from the source at the time of the adaptation.
-    int framerate_fps_;
-    // Indicates if request was to adapt up or down.
-    enum class Mode { kAdaptUp, kAdaptDown } mode_;
-  };
-  // Stores a snapshot of the last adaptation request triggered by an AdaptUp
-  // or AdaptDown signal.
-  rtc::Optional<AdaptationRequest> last_adaptation_request_
-      RTC_ACCESS_ON(&encoder_queue_);
-
-  rtc::RaceChecker incoming_frame_race_checker_
-      RTC_GUARDED_BY(incoming_frame_race_checker_);
-  Atomic32 posted_frames_waiting_for_encode_;
-  // Used to make sure incoming time stamp is increasing for every frame.
-  int64_t last_captured_timestamp_ RTC_GUARDED_BY(incoming_frame_race_checker_);
-  // Delta used for translating between NTP and internal timestamps.
-  const int64_t delta_ntp_internal_ms_
-      RTC_GUARDED_BY(incoming_frame_race_checker_);
-
-  int64_t last_frame_log_ms_ RTC_GUARDED_BY(incoming_frame_race_checker_);
-  int captured_frame_count_ RTC_ACCESS_ON(&encoder_queue_);
-  int dropped_frame_count_ RTC_ACCESS_ON(&encoder_queue_);
-
-  VideoBitrateAllocationObserver* bitrate_observer_
-      RTC_ACCESS_ON(&encoder_queue_);
-  rtc::Optional<int64_t> last_parameters_update_ms_
-      RTC_ACCESS_ON(&encoder_queue_);
-
-  // All public methods are proxied to |encoder_queue_|. It must must be
-  // destroyed first to make sure no tasks are run that use other members.
-  rtc::TaskQueue encoder_queue_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(VideoStreamEncoder);
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_VIDEO_VIDEO_STREAM_ENCODER_H_
diff --git a/video/video_stream_encoder_unittest.cc b/video/video_stream_encoder_unittest.cc
deleted file mode 100644
index 488486c..0000000
--- a/video/video_stream_encoder_unittest.cc
+++ /dev/null
@@ -1,3280 +0,0 @@
-/*
- *  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 <algorithm>
-#include <limits>
-#include <utility>
-
-#include "webrtc/api/video/i420_buffer.h"
-#include "webrtc/media/base/videoadapter.h"
-#include "webrtc/modules/video_coding/codecs/vp8/temporal_layers.h"
-#include "webrtc/modules/video_coding/utility/default_video_bitrate_allocator.h"
-#include "webrtc/rtc_base/fakeclock.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/system_wrappers/include/metrics_default.h"
-#include "webrtc/system_wrappers/include/sleep.h"
-#include "webrtc/test/encoder_settings.h"
-#include "webrtc/test/fake_encoder.h"
-#include "webrtc/test/frame_generator.h"
-#include "webrtc/test/gmock.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/video/send_statistics_proxy.h"
-#include "webrtc/video/video_stream_encoder.h"
-
-namespace {
-const int kMinPixelsPerFrame = 320 * 180;
-const int kMinFramerateFps = 2;
-const int64_t kFrameTimeoutMs = 100;
-const unsigned char kNumSlDummy = 0;
-}  // namespace
-
-namespace webrtc {
-
-using DegredationPreference = VideoSendStream::DegradationPreference;
-using ScaleReason = AdaptationObserverInterface::AdaptReason;
-using ::testing::_;
-using ::testing::Return;
-
-namespace {
-const size_t kMaxPayloadLength = 1440;
-const int kTargetBitrateBps = 1000000;
-const int kLowTargetBitrateBps = kTargetBitrateBps / 10;
-const int kMaxInitialFramedrop = 4;
-const int kDefaultFramerate = 30;
-
-class TestBuffer : public webrtc::I420Buffer {
- public:
-  TestBuffer(rtc::Event* event, int width, int height)
-      : I420Buffer(width, height), event_(event) {}
-
- private:
-  friend class rtc::RefCountedObject<TestBuffer>;
-  ~TestBuffer() override {
-    if (event_)
-      event_->Set();
-  }
-  rtc::Event* const event_;
-};
-
-class CpuOveruseDetectorProxy : public OveruseFrameDetector {
- public:
-  CpuOveruseDetectorProxy(const CpuOveruseOptions& options,
-                          AdaptationObserverInterface* overuse_observer,
-                          EncodedFrameObserver* encoder_timing_,
-                          CpuOveruseMetricsObserver* metrics_observer)
-      : OveruseFrameDetector(options,
-                             overuse_observer,
-                             encoder_timing_,
-                             metrics_observer),
-        last_target_framerate_fps_(-1) {}
-  virtual ~CpuOveruseDetectorProxy() {}
-
-  void OnTargetFramerateUpdated(int framerate_fps) override {
-    rtc::CritScope cs(&lock_);
-    last_target_framerate_fps_ = framerate_fps;
-    OveruseFrameDetector::OnTargetFramerateUpdated(framerate_fps);
-  }
-
-  int GetLastTargetFramerate() {
-    rtc::CritScope cs(&lock_);
-    return last_target_framerate_fps_;
-  }
-
- private:
-  rtc::CriticalSection lock_;
-  int last_target_framerate_fps_ RTC_GUARDED_BY(lock_);
-};
-
-class VideoStreamEncoderUnderTest : public VideoStreamEncoder {
- public:
-  VideoStreamEncoderUnderTest(SendStatisticsProxy* stats_proxy,
-                      const VideoSendStream::Config::EncoderSettings& settings)
-      : VideoStreamEncoder(
-            1 /* number_of_cores */,
-            stats_proxy,
-            settings,
-            nullptr /* pre_encode_callback */,
-            nullptr /* encoder_timing */,
-            std::unique_ptr<OveruseFrameDetector>(
-                overuse_detector_proxy_ = new CpuOveruseDetectorProxy(
-                    GetCpuOveruseOptions(settings.full_overuse_time),
-                    this,
-                    nullptr,
-                    stats_proxy))) {}
-
-  void PostTaskAndWait(bool down, AdaptReason reason) {
-    rtc::Event event(false, false);
-    encoder_queue()->PostTask([this, &event, reason, down] {
-      down ? AdaptDown(reason) : AdaptUp(reason);
-      event.Set();
-    });
-    ASSERT_TRUE(event.Wait(5000));
-  }
-
-  // This is used as a synchronisation mechanism, to make sure that the
-  // encoder queue is not blocked before we start sending it frames.
-  void WaitUntilTaskQueueIsIdle() {
-    rtc::Event event(false, false);
-    encoder_queue()->PostTask([&event] {
-      event.Set();
-    });
-    ASSERT_TRUE(event.Wait(5000));
-  }
-
-  void TriggerCpuOveruse() { PostTaskAndWait(true, AdaptReason::kCpu); }
-
-  void TriggerCpuNormalUsage() { PostTaskAndWait(false, AdaptReason::kCpu); }
-
-  void TriggerQualityLow() { PostTaskAndWait(true, AdaptReason::kQuality); }
-
-  void TriggerQualityHigh() { PostTaskAndWait(false, AdaptReason::kQuality); }
-
-  CpuOveruseDetectorProxy* overuse_detector_proxy_;
-};
-
-class VideoStreamFactory
-    : public VideoEncoderConfig::VideoStreamFactoryInterface {
- public:
-  explicit VideoStreamFactory(size_t num_temporal_layers, int framerate)
-      : num_temporal_layers_(num_temporal_layers), framerate_(framerate) {
-    EXPECT_GT(num_temporal_layers, 0u);
-    EXPECT_GT(framerate, 0);
-  }
-
- private:
-  std::vector<VideoStream> CreateEncoderStreams(
-      int width,
-      int height,
-      const VideoEncoderConfig& encoder_config) override {
-    std::vector<VideoStream> streams =
-        test::CreateVideoStreams(width, height, encoder_config);
-    for (VideoStream& stream : streams) {
-      stream.temporal_layer_thresholds_bps.resize(num_temporal_layers_ - 1);
-      stream.max_framerate = framerate_;
-    }
-    return streams;
-  }
-
-  const size_t num_temporal_layers_;
-  const int framerate_;
-};
-
-
-class AdaptingFrameForwarder : public test::FrameForwarder {
- public:
-  AdaptingFrameForwarder() : adaptation_enabled_(false) {}
-  ~AdaptingFrameForwarder() override {}
-
-  void set_adaptation_enabled(bool enabled) {
-    rtc::CritScope cs(&crit_);
-    adaptation_enabled_ = enabled;
-  }
-
-  bool adaption_enabled() const {
-    rtc::CritScope cs(&crit_);
-    return adaptation_enabled_;
-  }
-
-  rtc::VideoSinkWants last_wants() const {
-    rtc::CritScope cs(&crit_);
-    return last_wants_;
-  }
-
-  void IncomingCapturedFrame(const VideoFrame& video_frame) override {
-    int cropped_width = 0;
-    int cropped_height = 0;
-    int out_width = 0;
-    int out_height = 0;
-    if (adaption_enabled()) {
-      if (adapter_.AdaptFrameResolution(
-              video_frame.width(), video_frame.height(),
-              video_frame.timestamp_us() * 1000, &cropped_width,
-              &cropped_height, &out_width, &out_height)) {
-        VideoFrame adapted_frame(new rtc::RefCountedObject<TestBuffer>(
-                                     nullptr, out_width, out_height),
-                                 99, 99, kVideoRotation_0);
-        adapted_frame.set_ntp_time_ms(video_frame.ntp_time_ms());
-        test::FrameForwarder::IncomingCapturedFrame(adapted_frame);
-      }
-    } else {
-      test::FrameForwarder::IncomingCapturedFrame(video_frame);
-    }
-  }
-
-  void AddOrUpdateSink(rtc::VideoSinkInterface<VideoFrame>* sink,
-                       const rtc::VideoSinkWants& wants) override {
-    rtc::CritScope cs(&crit_);
-    last_wants_ = sink_wants();
-    adapter_.OnResolutionFramerateRequest(wants.target_pixel_count,
-                                          wants.max_pixel_count,
-                                          wants.max_framerate_fps);
-    test::FrameForwarder::AddOrUpdateSink(sink, wants);
-  }
-  cricket::VideoAdapter adapter_;
-  bool adaptation_enabled_ RTC_GUARDED_BY(crit_);
-  rtc::VideoSinkWants last_wants_ RTC_GUARDED_BY(crit_);
-};
-
-class MockableSendStatisticsProxy : public SendStatisticsProxy {
- public:
-  MockableSendStatisticsProxy(Clock* clock,
-                              const VideoSendStream::Config& config,
-                              VideoEncoderConfig::ContentType content_type)
-      : SendStatisticsProxy(clock, config, content_type) {}
-
-  VideoSendStream::Stats GetStats() override {
-    rtc::CritScope cs(&lock_);
-    if (mock_stats_)
-      return *mock_stats_;
-    return SendStatisticsProxy::GetStats();
-  }
-
-  void SetMockStats(const VideoSendStream::Stats& stats) {
-    rtc::CritScope cs(&lock_);
-    mock_stats_.emplace(stats);
-  }
-
-  void ResetMockStats() {
-    rtc::CritScope cs(&lock_);
-    mock_stats_.reset();
-  }
-
- private:
-  rtc::CriticalSection lock_;
-  rtc::Optional<VideoSendStream::Stats> mock_stats_ RTC_GUARDED_BY(lock_);
-};
-
-class MockBitrateObserver : public VideoBitrateAllocationObserver {
- public:
-  MOCK_METHOD1(OnBitrateAllocationUpdated, void(const BitrateAllocation&));
-};
-
-}  // namespace
-
-class VideoStreamEncoderTest : public ::testing::Test {
- public:
-  static const int kDefaultTimeoutMs = 30 * 1000;
-
-  VideoStreamEncoderTest()
-      : video_send_config_(VideoSendStream::Config(nullptr)),
-        codec_width_(320),
-        codec_height_(240),
-        max_framerate_(30),
-        fake_encoder_(),
-        stats_proxy_(new MockableSendStatisticsProxy(
-            Clock::GetRealTimeClock(),
-            video_send_config_,
-            webrtc::VideoEncoderConfig::ContentType::kRealtimeVideo)),
-        sink_(&fake_encoder_) {}
-
-  void SetUp() override {
-    metrics::Reset();
-    video_send_config_ = VideoSendStream::Config(nullptr);
-    video_send_config_.encoder_settings.encoder = &fake_encoder_;
-    video_send_config_.encoder_settings.payload_name = "FAKE";
-    video_send_config_.encoder_settings.payload_type = 125;
-
-    VideoEncoderConfig video_encoder_config;
-    test::FillEncoderConfiguration(1, &video_encoder_config);
-    video_encoder_config.video_stream_factory =
-        new rtc::RefCountedObject<VideoStreamFactory>(1, max_framerate_);
-    video_encoder_config_ = video_encoder_config.Copy();
-
-    // Framerate limit is specified by the VideoStreamFactory.
-    std::vector<VideoStream> streams =
-        video_encoder_config.video_stream_factory->CreateEncoderStreams(
-            codec_width_, codec_height_, video_encoder_config);
-    max_framerate_ = streams[0].max_framerate;
-    fake_clock_.SetTimeMicros(1234);
-
-    ConfigureEncoder(std::move(video_encoder_config), true /* nack_enabled */);
-  }
-
-  void ConfigureEncoder(VideoEncoderConfig video_encoder_config,
-                        bool nack_enabled) {
-    if (video_stream_encoder_)
-      video_stream_encoder_->Stop();
-    video_stream_encoder_.reset(new VideoStreamEncoderUnderTest(
-        stats_proxy_.get(), video_send_config_.encoder_settings));
-    video_stream_encoder_->SetSink(&sink_, false /* rotation_applied */);
-    video_stream_encoder_->SetSource(
-        &video_source_,
-        VideoSendStream::DegradationPreference::kMaintainFramerate);
-    video_stream_encoder_->SetStartBitrate(kTargetBitrateBps);
-    video_stream_encoder_->ConfigureEncoder(std::move(video_encoder_config),
-                                            kMaxPayloadLength, nack_enabled);
-    video_stream_encoder_->WaitUntilTaskQueueIsIdle();
-  }
-
-  void ResetEncoder(const std::string& payload_name,
-                    size_t num_streams,
-                    size_t num_temporal_layers,
-                    unsigned char num_spatial_layers,
-                    bool nack_enabled,
-                    bool screenshare) {
-    video_send_config_.encoder_settings.payload_name = payload_name;
-
-    VideoEncoderConfig video_encoder_config;
-    video_encoder_config.number_of_streams = num_streams;
-    video_encoder_config.max_bitrate_bps = kTargetBitrateBps;
-    video_encoder_config.video_stream_factory =
-        new rtc::RefCountedObject<VideoStreamFactory>(num_temporal_layers,
-                                                      kDefaultFramerate);
-    video_encoder_config.content_type =
-        screenshare ? VideoEncoderConfig::ContentType::kScreen
-                    : VideoEncoderConfig::ContentType::kRealtimeVideo;
-    if (payload_name == "VP9") {
-      VideoCodecVP9 vp9_settings = VideoEncoder::GetDefaultVp9Settings();
-      vp9_settings.numberOfSpatialLayers = num_spatial_layers;
-      video_encoder_config.encoder_specific_settings =
-          new rtc::RefCountedObject<
-              VideoEncoderConfig::Vp9EncoderSpecificSettings>(vp9_settings);
-    }
-    ConfigureEncoder(std::move(video_encoder_config), nack_enabled);
-  }
-
-  VideoFrame CreateFrame(int64_t ntp_time_ms,
-                         rtc::Event* destruction_event) const {
-    VideoFrame frame(new rtc::RefCountedObject<TestBuffer>(
-                         destruction_event, codec_width_, codec_height_),
-                     99, 99, kVideoRotation_0);
-    frame.set_ntp_time_ms(ntp_time_ms);
-    return frame;
-  }
-
-  VideoFrame CreateFrame(int64_t ntp_time_ms, int width, int height) const {
-    VideoFrame frame(
-        new rtc::RefCountedObject<TestBuffer>(nullptr, width, height), 99, 99,
-        kVideoRotation_0);
-    frame.set_ntp_time_ms(ntp_time_ms);
-    frame.set_timestamp_us(ntp_time_ms * 1000);
-    return frame;
-  }
-
-  void VerifyNoLimitation(const rtc::VideoSinkWants& wants) {
-    EXPECT_EQ(std::numeric_limits<int>::max(), wants.max_framerate_fps);
-    EXPECT_EQ(std::numeric_limits<int>::max(), wants.max_pixel_count);
-    EXPECT_FALSE(wants.target_pixel_count);
-  }
-
-  void VerifyFpsEqResolutionEq(const rtc::VideoSinkWants& wants1,
-                               const rtc::VideoSinkWants& wants2) {
-    EXPECT_EQ(wants1.max_framerate_fps, wants2.max_framerate_fps);
-    EXPECT_EQ(wants1.max_pixel_count, wants2.max_pixel_count);
-  }
-
-  void VerifyFpsMaxResolutionLt(const rtc::VideoSinkWants& wants1,
-                                const rtc::VideoSinkWants& wants2) {
-    EXPECT_EQ(std::numeric_limits<int>::max(), wants1.max_framerate_fps);
-    EXPECT_LT(wants1.max_pixel_count, wants2.max_pixel_count);
-    EXPECT_GT(wants1.max_pixel_count, 0);
-  }
-
-  void VerifyFpsMaxResolutionGt(const rtc::VideoSinkWants& wants1,
-                                const rtc::VideoSinkWants& wants2) {
-    EXPECT_EQ(std::numeric_limits<int>::max(), wants1.max_framerate_fps);
-    EXPECT_GT(wants1.max_pixel_count, wants2.max_pixel_count);
-  }
-
-  void VerifyFpsMaxResolutionEq(const rtc::VideoSinkWants& wants1,
-                                const rtc::VideoSinkWants& wants2) {
-    EXPECT_EQ(std::numeric_limits<int>::max(), wants1.max_framerate_fps);
-    EXPECT_EQ(wants1.max_pixel_count, wants2.max_pixel_count);
-  }
-
-  void VerifyFpsLtResolutionEq(const rtc::VideoSinkWants& wants1,
-                               const rtc::VideoSinkWants& wants2) {
-    EXPECT_LT(wants1.max_framerate_fps, wants2.max_framerate_fps);
-    EXPECT_EQ(wants1.max_pixel_count, wants2.max_pixel_count);
-  }
-
-  void VerifyFpsGtResolutionEq(const rtc::VideoSinkWants& wants1,
-                               const rtc::VideoSinkWants& wants2) {
-    EXPECT_GT(wants1.max_framerate_fps, wants2.max_framerate_fps);
-    EXPECT_EQ(wants1.max_pixel_count, wants2.max_pixel_count);
-  }
-
-  void VerifyFpsEqResolutionLt(const rtc::VideoSinkWants& wants1,
-                               const rtc::VideoSinkWants& wants2) {
-    EXPECT_EQ(wants1.max_framerate_fps, wants2.max_framerate_fps);
-    EXPECT_LT(wants1.max_pixel_count, wants2.max_pixel_count);
-    EXPECT_GT(wants1.max_pixel_count, 0);
-  }
-
-  void VerifyFpsEqResolutionGt(const rtc::VideoSinkWants& wants1,
-                               const rtc::VideoSinkWants& wants2) {
-    EXPECT_EQ(wants1.max_framerate_fps, wants2.max_framerate_fps);
-    EXPECT_GT(wants1.max_pixel_count, wants2.max_pixel_count);
-  }
-
-  void VerifyFpsMaxResolutionLt(const rtc::VideoSinkWants& wants,
-                                int pixel_count) {
-    EXPECT_EQ(std::numeric_limits<int>::max(), wants.max_framerate_fps);
-    EXPECT_LT(wants.max_pixel_count, pixel_count);
-    EXPECT_GT(wants.max_pixel_count, 0);
-  }
-
-  void VerifyFpsLtResolutionMax(const rtc::VideoSinkWants& wants, int fps) {
-    EXPECT_LT(wants.max_framerate_fps, fps);
-    EXPECT_EQ(std::numeric_limits<int>::max(), wants.max_pixel_count);
-    EXPECT_FALSE(wants.target_pixel_count);
-  }
-
-  void VerifyFpsEqResolutionMax(const rtc::VideoSinkWants& wants,
-                                int expected_fps) {
-    EXPECT_EQ(expected_fps, wants.max_framerate_fps);
-    EXPECT_EQ(std::numeric_limits<int>::max(), wants.max_pixel_count);
-    EXPECT_FALSE(wants.target_pixel_count);
-  }
-
-  void WaitForEncodedFrame(int64_t expected_ntp_time) {
-    sink_.WaitForEncodedFrame(expected_ntp_time);
-    fake_clock_.AdvanceTimeMicros(rtc::kNumMicrosecsPerSec / max_framerate_);
-  }
-
-  bool TimedWaitForEncodedFrame(int64_t expected_ntp_time, int64_t timeout_ms) {
-    bool ok = sink_.TimedWaitForEncodedFrame(expected_ntp_time, timeout_ms);
-    fake_clock_.AdvanceTimeMicros(rtc::kNumMicrosecsPerSec / max_framerate_);
-    return ok;
-  }
-
-  void WaitForEncodedFrame(uint32_t expected_width, uint32_t expected_height) {
-    sink_.WaitForEncodedFrame(expected_width, expected_height);
-    fake_clock_.AdvanceTimeMicros(rtc::kNumMicrosecsPerSec / max_framerate_);
-  }
-
-  void ExpectDroppedFrame() {
-    sink_.ExpectDroppedFrame();
-    fake_clock_.AdvanceTimeMicros(rtc::kNumMicrosecsPerSec / max_framerate_);
-  }
-
-  bool WaitForFrame(int64_t timeout_ms) {
-    bool ok = sink_.WaitForFrame(timeout_ms);
-    fake_clock_.AdvanceTimeMicros(rtc::kNumMicrosecsPerSec / max_framerate_);
-    return ok;
-  }
-
-  class TestEncoder : public test::FakeEncoder {
-   public:
-    TestEncoder()
-        : FakeEncoder(Clock::GetRealTimeClock()),
-          continue_encode_event_(false, false) {}
-
-    VideoCodec codec_config() const {
-      rtc::CritScope lock(&crit_sect_);
-      return config_;
-    }
-
-    void BlockNextEncode() {
-      rtc::CritScope lock(&local_crit_sect_);
-      block_next_encode_ = true;
-    }
-
-    VideoEncoder::ScalingSettings GetScalingSettings() const override {
-      rtc::CritScope lock(&local_crit_sect_);
-      if (quality_scaling_)
-        return VideoEncoder::ScalingSettings(true, 1, 2, kMinPixelsPerFrame);
-      return VideoEncoder::ScalingSettings(false);
-    }
-
-    void ContinueEncode() { continue_encode_event_.Set(); }
-
-    void CheckLastTimeStampsMatch(int64_t ntp_time_ms,
-                                  uint32_t timestamp) const {
-      rtc::CritScope lock(&local_crit_sect_);
-      EXPECT_EQ(timestamp_, timestamp);
-      EXPECT_EQ(ntp_time_ms_, ntp_time_ms);
-    }
-
-    void SetQualityScaling(bool b) {
-      rtc::CritScope lock(&local_crit_sect_);
-      quality_scaling_ = b;
-    }
-
-    void ForceInitEncodeFailure(bool force_failure) {
-      rtc::CritScope lock(&local_crit_sect_);
-      force_init_encode_failed_ = force_failure;
-    }
-
-   private:
-    int32_t Encode(const VideoFrame& input_image,
-                   const CodecSpecificInfo* codec_specific_info,
-                   const std::vector<FrameType>* frame_types) override {
-      bool block_encode;
-      {
-        rtc::CritScope lock(&local_crit_sect_);
-        EXPECT_GT(input_image.timestamp(), timestamp_);
-        EXPECT_GT(input_image.ntp_time_ms(), ntp_time_ms_);
-        EXPECT_EQ(input_image.timestamp(), input_image.ntp_time_ms() * 90);
-
-        timestamp_ = input_image.timestamp();
-        ntp_time_ms_ = input_image.ntp_time_ms();
-        last_input_width_ = input_image.width();
-        last_input_height_ = input_image.height();
-        block_encode = block_next_encode_;
-        block_next_encode_ = false;
-      }
-      int32_t result =
-          FakeEncoder::Encode(input_image, codec_specific_info, frame_types);
-      if (block_encode)
-        EXPECT_TRUE(continue_encode_event_.Wait(kDefaultTimeoutMs));
-      return result;
-    }
-
-    int32_t InitEncode(const VideoCodec* config,
-                       int32_t number_of_cores,
-                       size_t max_payload_size) override {
-      int res =
-          FakeEncoder::InitEncode(config, number_of_cores, max_payload_size);
-      rtc::CritScope lock(&local_crit_sect_);
-      if (config->codecType == kVideoCodecVP8 && config->VP8().tl_factory) {
-        // Simulate setting up temporal layers, in order to validate the life
-        // cycle of these objects.
-        int num_streams = std::max<int>(1, config->numberOfSimulcastStreams);
-        int num_temporal_layers =
-            std::max<int>(1, config->VP8().numberOfTemporalLayers);
-        for (int i = 0; i < num_streams; ++i) {
-          allocated_temporal_layers_.emplace_back(
-              config->VP8().tl_factory->Create(i, num_temporal_layers, 42));
-        }
-      }
-      if (force_init_encode_failed_)
-        return -1;
-      return res;
-    }
-
-    rtc::CriticalSection local_crit_sect_;
-    bool block_next_encode_ RTC_GUARDED_BY(local_crit_sect_) = false;
-    rtc::Event continue_encode_event_;
-    uint32_t timestamp_ RTC_GUARDED_BY(local_crit_sect_) = 0;
-    int64_t ntp_time_ms_ RTC_GUARDED_BY(local_crit_sect_) = 0;
-    int last_input_width_ RTC_GUARDED_BY(local_crit_sect_) = 0;
-    int last_input_height_ RTC_GUARDED_BY(local_crit_sect_) = 0;
-    bool quality_scaling_ RTC_GUARDED_BY(local_crit_sect_) = true;
-    std::vector<std::unique_ptr<TemporalLayers>> allocated_temporal_layers_
-        RTC_GUARDED_BY(local_crit_sect_);
-    bool force_init_encode_failed_ RTC_GUARDED_BY(local_crit_sect_) = false;
-  };
-
-  class TestSink : public VideoStreamEncoder::EncoderSink {
-   public:
-    explicit TestSink(TestEncoder* test_encoder)
-        : test_encoder_(test_encoder), encoded_frame_event_(false, false) {}
-
-    void WaitForEncodedFrame(int64_t expected_ntp_time) {
-      EXPECT_TRUE(
-          TimedWaitForEncodedFrame(expected_ntp_time, kDefaultTimeoutMs));
-    }
-
-    bool TimedWaitForEncodedFrame(int64_t expected_ntp_time,
-                                  int64_t timeout_ms) {
-      uint32_t timestamp = 0;
-      if (!encoded_frame_event_.Wait(timeout_ms))
-        return false;
-      {
-        rtc::CritScope lock(&crit_);
-        timestamp = last_timestamp_;
-      }
-      test_encoder_->CheckLastTimeStampsMatch(expected_ntp_time, timestamp);
-      return true;
-    }
-
-    void WaitForEncodedFrame(uint32_t expected_width,
-                             uint32_t expected_height) {
-      EXPECT_TRUE(encoded_frame_event_.Wait(kDefaultTimeoutMs));
-      CheckLastFrameSizeMathces(expected_width, expected_height);
-    }
-
-    void CheckLastFrameSizeMathces(uint32_t expected_width,
-                                   uint32_t expected_height) {
-      uint32_t width = 0;
-      uint32_t height = 0;
-      {
-        rtc::CritScope lock(&crit_);
-        width = last_width_;
-        height = last_height_;
-      }
-      EXPECT_EQ(expected_height, height);
-      EXPECT_EQ(expected_width, width);
-    }
-
-    void ExpectDroppedFrame() { EXPECT_FALSE(encoded_frame_event_.Wait(100)); }
-
-    bool WaitForFrame(int64_t timeout_ms) {
-      return encoded_frame_event_.Wait(timeout_ms);
-    }
-
-    void SetExpectNoFrames() {
-      rtc::CritScope lock(&crit_);
-      expect_frames_ = false;
-    }
-
-    int number_of_reconfigurations() const {
-      rtc::CritScope lock(&crit_);
-      return number_of_reconfigurations_;
-    }
-
-    int last_min_transmit_bitrate() const {
-      rtc::CritScope lock(&crit_);
-      return min_transmit_bitrate_bps_;
-    }
-
-   private:
-    Result OnEncodedImage(
-        const EncodedImage& encoded_image,
-        const CodecSpecificInfo* codec_specific_info,
-        const RTPFragmentationHeader* fragmentation) override {
-      rtc::CritScope lock(&crit_);
-      EXPECT_TRUE(expect_frames_);
-      last_timestamp_ = encoded_image._timeStamp;
-      last_width_ = encoded_image._encodedWidth;
-      last_height_ = encoded_image._encodedHeight;
-      encoded_frame_event_.Set();
-      return Result(Result::OK, last_timestamp_);
-    }
-
-    void OnEncoderConfigurationChanged(std::vector<VideoStream> streams,
-                                       int min_transmit_bitrate_bps) override {
-      rtc::CriticalSection crit_;
-      ++number_of_reconfigurations_;
-      min_transmit_bitrate_bps_ = min_transmit_bitrate_bps;
-    }
-
-    rtc::CriticalSection crit_;
-    TestEncoder* test_encoder_;
-    rtc::Event encoded_frame_event_;
-    uint32_t last_timestamp_ = 0;
-    uint32_t last_height_ = 0;
-    uint32_t last_width_ = 0;
-    bool expect_frames_ = true;
-    int number_of_reconfigurations_ = 0;
-    int min_transmit_bitrate_bps_ = 0;
-  };
-
-  VideoSendStream::Config video_send_config_;
-  VideoEncoderConfig video_encoder_config_;
-  int codec_width_;
-  int codec_height_;
-  int max_framerate_;
-  TestEncoder fake_encoder_;
-  std::unique_ptr<MockableSendStatisticsProxy> stats_proxy_;
-  TestSink sink_;
-  AdaptingFrameForwarder video_source_;
-  std::unique_ptr<VideoStreamEncoderUnderTest> video_stream_encoder_;
-  rtc::ScopedFakeClock fake_clock_;
-};
-
-TEST_F(VideoStreamEncoderTest, EncodeOneFrame) {
-  video_stream_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0);
-  rtc::Event frame_destroyed_event(false, false);
-  video_source_.IncomingCapturedFrame(CreateFrame(1, &frame_destroyed_event));
-  WaitForEncodedFrame(1);
-  EXPECT_TRUE(frame_destroyed_event.Wait(kDefaultTimeoutMs));
-  video_stream_encoder_->Stop();
-}
-
-TEST_F(VideoStreamEncoderTest, DropsFramesBeforeFirstOnBitrateUpdated) {
-  // Dropped since no target bitrate has been set.
-  rtc::Event frame_destroyed_event(false, false);
-  video_source_.IncomingCapturedFrame(CreateFrame(1, &frame_destroyed_event));
-  EXPECT_TRUE(frame_destroyed_event.Wait(kDefaultTimeoutMs));
-
-  video_stream_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0);
-
-  video_source_.IncomingCapturedFrame(CreateFrame(2, nullptr));
-  WaitForEncodedFrame(2);
-  video_stream_encoder_->Stop();
-}
-
-TEST_F(VideoStreamEncoderTest, DropsFramesWhenRateSetToZero) {
-  video_stream_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0);
-  video_source_.IncomingCapturedFrame(CreateFrame(1, nullptr));
-  WaitForEncodedFrame(1);
-
-  video_stream_encoder_->OnBitrateUpdated(0, 0, 0);
-  // Dropped since bitrate is zero.
-  video_source_.IncomingCapturedFrame(CreateFrame(2, nullptr));
-
-  video_stream_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0);
-  video_source_.IncomingCapturedFrame(CreateFrame(3, nullptr));
-  WaitForEncodedFrame(3);
-  video_stream_encoder_->Stop();
-}
-
-TEST_F(VideoStreamEncoderTest, DropsFramesWithSameOrOldNtpTimestamp) {
-  video_stream_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0);
-  video_source_.IncomingCapturedFrame(CreateFrame(1, nullptr));
-  WaitForEncodedFrame(1);
-
-  // This frame will be dropped since it has the same ntp timestamp.
-  video_source_.IncomingCapturedFrame(CreateFrame(1, nullptr));
-
-  video_source_.IncomingCapturedFrame(CreateFrame(2, nullptr));
-  WaitForEncodedFrame(2);
-  video_stream_encoder_->Stop();
-}
-
-TEST_F(VideoStreamEncoderTest, DropsFrameAfterStop) {
-  video_stream_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0);
-
-  video_source_.IncomingCapturedFrame(CreateFrame(1, nullptr));
-  WaitForEncodedFrame(1);
-
-  video_stream_encoder_->Stop();
-  sink_.SetExpectNoFrames();
-  rtc::Event frame_destroyed_event(false, false);
-  video_source_.IncomingCapturedFrame(CreateFrame(2, &frame_destroyed_event));
-  EXPECT_TRUE(frame_destroyed_event.Wait(kDefaultTimeoutMs));
-}
-
-TEST_F(VideoStreamEncoderTest, DropsPendingFramesOnSlowEncode) {
-  video_stream_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0);
-
-  fake_encoder_.BlockNextEncode();
-  video_source_.IncomingCapturedFrame(CreateFrame(1, nullptr));
-  WaitForEncodedFrame(1);
-  // Here, the encoder thread will be blocked in the TestEncoder waiting for a
-  // call to ContinueEncode.
-  video_source_.IncomingCapturedFrame(CreateFrame(2, nullptr));
-  video_source_.IncomingCapturedFrame(CreateFrame(3, nullptr));
-  fake_encoder_.ContinueEncode();
-  WaitForEncodedFrame(3);
-
-  video_stream_encoder_->Stop();
-}
-
-TEST_F(VideoStreamEncoderTest,
-       ConfigureEncoderTriggersOnEncoderConfigurationChanged) {
-  video_stream_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0);
-  EXPECT_EQ(0, sink_.number_of_reconfigurations());
-
-  // Capture a frame and wait for it to synchronize with the encoder thread.
-  video_source_.IncomingCapturedFrame(CreateFrame(1, nullptr));
-  WaitForEncodedFrame(1);
-  // The encoder will have been configured once when the first frame is
-  // received.
-  EXPECT_EQ(1, sink_.number_of_reconfigurations());
-
-  VideoEncoderConfig video_encoder_config;
-  test::FillEncoderConfiguration(1, &video_encoder_config);
-  video_encoder_config.min_transmit_bitrate_bps = 9999;
-  video_stream_encoder_->ConfigureEncoder(std::move(video_encoder_config),
-                                          kMaxPayloadLength,
-                                          true /* nack_enabled */);
-
-  // Capture a frame and wait for it to synchronize with the encoder thread.
-  video_source_.IncomingCapturedFrame(CreateFrame(2, nullptr));
-  WaitForEncodedFrame(2);
-  EXPECT_EQ(2, sink_.number_of_reconfigurations());
-  EXPECT_EQ(9999, sink_.last_min_transmit_bitrate());
-
-  video_stream_encoder_->Stop();
-}
-
-TEST_F(VideoStreamEncoderTest, FrameResolutionChangeReconfigureEncoder) {
-  video_stream_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0);
-
-  // Capture a frame and wait for it to synchronize with the encoder thread.
-  video_source_.IncomingCapturedFrame(CreateFrame(1, nullptr));
-  WaitForEncodedFrame(1);
-  // The encoder will have been configured once.
-  EXPECT_EQ(1, sink_.number_of_reconfigurations());
-  EXPECT_EQ(codec_width_, fake_encoder_.codec_config().width);
-  EXPECT_EQ(codec_height_, fake_encoder_.codec_config().height);
-
-  codec_width_ *= 2;
-  codec_height_ *= 2;
-  // Capture a frame with a higher resolution and wait for it to synchronize
-  // with the encoder thread.
-  video_source_.IncomingCapturedFrame(CreateFrame(2, nullptr));
-  WaitForEncodedFrame(2);
-  EXPECT_EQ(codec_width_, fake_encoder_.codec_config().width);
-  EXPECT_EQ(codec_height_, fake_encoder_.codec_config().height);
-  EXPECT_EQ(2, sink_.number_of_reconfigurations());
-
-  video_stream_encoder_->Stop();
-}
-
-TEST_F(VideoStreamEncoderTest, Vp8ResilienceIsOffFor1S1TLWithNackEnabled) {
-  const bool kNackEnabled = true;
-  const size_t kNumStreams = 1;
-  const size_t kNumTl = 1;
-  ResetEncoder("VP8", kNumStreams, kNumTl, kNumSlDummy, kNackEnabled, false);
-  video_stream_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0);
-
-  // Capture a frame and wait for it to synchronize with the encoder thread.
-  video_source_.IncomingCapturedFrame(CreateFrame(1, nullptr));
-  WaitForEncodedFrame(1);
-  // The encoder have been configured once when the first frame is received.
-  EXPECT_EQ(1, sink_.number_of_reconfigurations());
-  EXPECT_EQ(kVideoCodecVP8, fake_encoder_.codec_config().codecType);
-  EXPECT_EQ(kNumStreams, fake_encoder_.codec_config().numberOfSimulcastStreams);
-  EXPECT_EQ(kNumTl, fake_encoder_.codec_config().VP8()->numberOfTemporalLayers);
-  // Resilience is off for no temporal layers with nack on.
-  EXPECT_EQ(kResilienceOff, fake_encoder_.codec_config().VP8()->resilience);
-  video_stream_encoder_->Stop();
-}
-
-TEST_F(VideoStreamEncoderTest, Vp8ResilienceIsOffFor2S1TlWithNackEnabled) {
-  const bool kNackEnabled = true;
-  const size_t kNumStreams = 2;
-  const size_t kNumTl = 1;
-  ResetEncoder("VP8", kNumStreams, kNumTl, kNumSlDummy, kNackEnabled, false);
-  video_stream_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0);
-
-  // Capture a frame and wait for it to synchronize with the encoder thread.
-  video_source_.IncomingCapturedFrame(CreateFrame(1, nullptr));
-  WaitForEncodedFrame(1);
-  // The encoder have been configured once when the first frame is received.
-  EXPECT_EQ(1, sink_.number_of_reconfigurations());
-  EXPECT_EQ(kVideoCodecVP8, fake_encoder_.codec_config().codecType);
-  EXPECT_EQ(kNumStreams, fake_encoder_.codec_config().numberOfSimulcastStreams);
-  EXPECT_EQ(kNumTl, fake_encoder_.codec_config().VP8()->numberOfTemporalLayers);
-  // Resilience is off for no temporal layers and >1 streams with nack on.
-  EXPECT_EQ(kResilienceOff, fake_encoder_.codec_config().VP8()->resilience);
-  video_stream_encoder_->Stop();
-}
-
-TEST_F(VideoStreamEncoderTest, Vp8ResilienceIsOnFor1S1TLWithNackDisabled) {
-  const bool kNackEnabled = false;
-  const size_t kNumStreams = 1;
-  const size_t kNumTl = 1;
-  ResetEncoder("VP8", kNumStreams, kNumTl, kNumSlDummy, kNackEnabled, false);
-  video_stream_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0);
-
-  // Capture a frame and wait for it to synchronize with the encoder thread.
-  video_source_.IncomingCapturedFrame(CreateFrame(1, nullptr));
-  WaitForEncodedFrame(1);
-  // The encoder have been configured once when the first frame is received.
-  EXPECT_EQ(1, sink_.number_of_reconfigurations());
-  EXPECT_EQ(kVideoCodecVP8, fake_encoder_.codec_config().codecType);
-  EXPECT_EQ(kNumStreams, fake_encoder_.codec_config().numberOfSimulcastStreams);
-  EXPECT_EQ(kNumTl, fake_encoder_.codec_config().VP8()->numberOfTemporalLayers);
-  // Resilience is on for no temporal layers with nack off.
-  EXPECT_EQ(kResilientStream, fake_encoder_.codec_config().VP8()->resilience);
-  video_stream_encoder_->Stop();
-}
-
-TEST_F(VideoStreamEncoderTest, Vp8ResilienceIsOnFor1S2TlWithNackEnabled) {
-  const bool kNackEnabled = true;
-  const size_t kNumStreams = 1;
-  const size_t kNumTl = 2;
-  ResetEncoder("VP8", kNumStreams, kNumTl, kNumSlDummy, kNackEnabled, false);
-  video_stream_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0);
-
-  // Capture a frame and wait for it to synchronize with the encoder thread.
-  video_source_.IncomingCapturedFrame(CreateFrame(1, nullptr));
-  WaitForEncodedFrame(1);
-  // The encoder have been configured once when the first frame is received.
-  EXPECT_EQ(1, sink_.number_of_reconfigurations());
-  EXPECT_EQ(kVideoCodecVP8, fake_encoder_.codec_config().codecType);
-  EXPECT_EQ(kNumStreams, fake_encoder_.codec_config().numberOfSimulcastStreams);
-  EXPECT_EQ(kNumTl, fake_encoder_.codec_config().VP8()->numberOfTemporalLayers);
-  // Resilience is on for temporal layers.
-  EXPECT_EQ(kResilientStream, fake_encoder_.codec_config().VP8()->resilience);
-  video_stream_encoder_->Stop();
-}
-
-TEST_F(VideoStreamEncoderTest, Vp9ResilienceIsOffFor1SL1TLWithNackEnabled) {
-  const bool kNackEnabled = true;
-  const size_t kNumStreams = 1;
-  const size_t kNumTl = 1;
-  const unsigned char kNumSl = 1;
-  ResetEncoder("VP9", kNumStreams, kNumTl, kNumSl, kNackEnabled, false);
-  video_stream_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0);
-
-  // Capture a frame and wait for it to synchronize with the encoder thread.
-  video_source_.IncomingCapturedFrame(CreateFrame(1, nullptr));
-  sink_.WaitForEncodedFrame(1);
-  // The encoder have been configured once when the first frame is received.
-  EXPECT_EQ(1, sink_.number_of_reconfigurations());
-  EXPECT_EQ(kVideoCodecVP9, fake_encoder_.codec_config().codecType);
-  EXPECT_EQ(kNumStreams, fake_encoder_.codec_config().numberOfSimulcastStreams);
-  EXPECT_EQ(kNumTl, fake_encoder_.codec_config().VP9()->numberOfTemporalLayers);
-  EXPECT_EQ(kNumSl, fake_encoder_.codec_config().VP9()->numberOfSpatialLayers);
-  // Resilience is off for no spatial and temporal layers with nack on.
-  EXPECT_FALSE(fake_encoder_.codec_config().VP9()->resilienceOn);
-  video_stream_encoder_->Stop();
-}
-
-TEST_F(VideoStreamEncoderTest, Vp9ResilienceIsOnFor1SL1TLWithNackDisabled) {
-  const bool kNackEnabled = false;
-  const size_t kNumStreams = 1;
-  const size_t kNumTl = 1;
-  const unsigned char kNumSl = 1;
-  ResetEncoder("VP9", kNumStreams, kNumTl, kNumSl, kNackEnabled, false);
-  video_stream_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0);
-
-  // Capture a frame and wait for it to synchronize with the encoder thread.
-  video_source_.IncomingCapturedFrame(CreateFrame(1, nullptr));
-  sink_.WaitForEncodedFrame(1);
-  // The encoder have been configured once when the first frame is received.
-  EXPECT_EQ(1, sink_.number_of_reconfigurations());
-  EXPECT_EQ(kVideoCodecVP9, fake_encoder_.codec_config().codecType);
-  EXPECT_EQ(kNumStreams, fake_encoder_.codec_config().numberOfSimulcastStreams);
-  EXPECT_EQ(kNumTl, fake_encoder_.codec_config().VP9()->numberOfTemporalLayers);
-  EXPECT_EQ(kNumSl, fake_encoder_.codec_config().VP9()->numberOfSpatialLayers);
-  // Resilience is on if nack is off.
-  EXPECT_TRUE(fake_encoder_.codec_config().VP9()->resilienceOn);
-  video_stream_encoder_->Stop();
-}
-
-TEST_F(VideoStreamEncoderTest, Vp9ResilienceIsOnFor2SL1TLWithNackEnabled) {
-  const bool kNackEnabled = true;
-  const size_t kNumStreams = 1;
-  const size_t kNumTl = 1;
-  const unsigned char kNumSl = 2;
-  ResetEncoder("VP9", kNumStreams, kNumTl, kNumSl, kNackEnabled, false);
-  video_stream_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0);
-
-  // Capture a frame and wait for it to synchronize with the encoder thread.
-  video_source_.IncomingCapturedFrame(CreateFrame(1, nullptr));
-  sink_.WaitForEncodedFrame(1);
-  // The encoder have been configured once when the first frame is received.
-  EXPECT_EQ(1, sink_.number_of_reconfigurations());
-  EXPECT_EQ(kVideoCodecVP9, fake_encoder_.codec_config().codecType);
-  EXPECT_EQ(kNumStreams, fake_encoder_.codec_config().numberOfSimulcastStreams);
-  EXPECT_EQ(kNumTl, fake_encoder_.codec_config().VP9()->numberOfTemporalLayers);
-  EXPECT_EQ(kNumSl, fake_encoder_.codec_config().VP9()->numberOfSpatialLayers);
-  // Resilience is on for spatial layers.
-  EXPECT_TRUE(fake_encoder_.codec_config().VP9()->resilienceOn);
-  video_stream_encoder_->Stop();
-}
-
-TEST_F(VideoStreamEncoderTest, Vp9ResilienceIsOnFor1SL2TLWithNackEnabled) {
-  const bool kNackEnabled = true;
-  const size_t kNumStreams = 1;
-  const size_t kNumTl = 2;
-  const unsigned char kNumSl = 1;
-  ResetEncoder("VP9", kNumStreams, kNumTl, kNumSl, kNackEnabled, false);
-  video_stream_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0);
-
-  // Capture a frame and wait for it to synchronize with the encoder thread.
-  video_source_.IncomingCapturedFrame(CreateFrame(1, nullptr));
-  sink_.WaitForEncodedFrame(1);
-  // The encoder have been configured once when the first frame is received.
-  EXPECT_EQ(1, sink_.number_of_reconfigurations());
-  EXPECT_EQ(kVideoCodecVP9, fake_encoder_.codec_config().codecType);
-  EXPECT_EQ(kNumStreams, fake_encoder_.codec_config().numberOfSimulcastStreams);
-  EXPECT_EQ(kNumTl, fake_encoder_.codec_config().VP9()->numberOfTemporalLayers);
-  EXPECT_EQ(kNumSl, fake_encoder_.codec_config().VP9()->numberOfSpatialLayers);
-  // Resilience is on for temporal layers.
-  EXPECT_TRUE(fake_encoder_.codec_config().VP9()->resilienceOn);
-  video_stream_encoder_->Stop();
-}
-
-TEST_F(VideoStreamEncoderTest, SwitchSourceDeregisterEncoderAsSink) {
-  EXPECT_TRUE(video_source_.has_sinks());
-  test::FrameForwarder new_video_source;
-  video_stream_encoder_->SetSource(
-      &new_video_source,
-      VideoSendStream::DegradationPreference::kMaintainFramerate);
-  EXPECT_FALSE(video_source_.has_sinks());
-  EXPECT_TRUE(new_video_source.has_sinks());
-
-  video_stream_encoder_->Stop();
-}
-
-TEST_F(VideoStreamEncoderTest, SinkWantsRotationApplied) {
-  EXPECT_FALSE(video_source_.sink_wants().rotation_applied);
-  video_stream_encoder_->SetSink(&sink_, true /*rotation_applied*/);
-  EXPECT_TRUE(video_source_.sink_wants().rotation_applied);
-  video_stream_encoder_->Stop();
-}
-
-TEST_F(VideoStreamEncoderTest, SinkWantsFromOveruseDetector) {
-  const int kMaxDowngrades = VideoStreamEncoder::kMaxCpuResolutionDowngrades;
-  video_stream_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0);
-
-  VerifyNoLimitation(video_source_.sink_wants());
-
-  int frame_width = 1280;
-  int frame_height = 720;
-
-  // Trigger CPU overuse kMaxCpuDowngrades times. Every time, VideoStreamEncoder
-  // should request lower resolution.
-  for (int i = 1; i <= kMaxDowngrades; ++i) {
-    video_source_.IncomingCapturedFrame(
-        CreateFrame(i, frame_width, frame_height));
-    WaitForEncodedFrame(i);
-
-    video_stream_encoder_->TriggerCpuOveruse();
-
-    EXPECT_FALSE(video_source_.sink_wants().target_pixel_count);
-    EXPECT_LT(video_source_.sink_wants().max_pixel_count,
-              frame_width * frame_height);
-    EXPECT_TRUE(stats_proxy_->GetStats().cpu_limited_resolution);
-    EXPECT_EQ(i, stats_proxy_->GetStats().number_of_cpu_adapt_changes);
-
-    frame_width /= 2;
-    frame_height /= 2;
-  }
-
-  // Trigger CPU overuse one more time. This should not trigger a request for
-  // lower resolution.
-  rtc::VideoSinkWants current_wants = video_source_.sink_wants();
-  video_source_.IncomingCapturedFrame(
-      CreateFrame(kMaxDowngrades + 1, frame_width, frame_height));
-  WaitForEncodedFrame(kMaxDowngrades + 1);
-  video_stream_encoder_->TriggerCpuOveruse();
-  EXPECT_EQ(video_source_.sink_wants().target_pixel_count,
-            current_wants.target_pixel_count);
-  EXPECT_EQ(video_source_.sink_wants().max_pixel_count,
-            current_wants.max_pixel_count);
-  EXPECT_TRUE(stats_proxy_->GetStats().cpu_limited_resolution);
-  EXPECT_EQ(kMaxDowngrades,
-            stats_proxy_->GetStats().number_of_cpu_adapt_changes);
-
-  // Trigger CPU normal use.
-  video_stream_encoder_->TriggerCpuNormalUsage();
-  EXPECT_EQ(frame_width * frame_height * 5 / 3,
-            video_source_.sink_wants().target_pixel_count.value_or(0));
-  EXPECT_EQ(frame_width * frame_height * 4,
-            video_source_.sink_wants().max_pixel_count);
-  EXPECT_TRUE(stats_proxy_->GetStats().cpu_limited_resolution);
-  EXPECT_EQ(kMaxDowngrades + 1,
-            stats_proxy_->GetStats().number_of_cpu_adapt_changes);
-
-  video_stream_encoder_->Stop();
-}
-
-TEST_F(VideoStreamEncoderTest,
-       TestMaxCpuResolutionDowngrades_BalancedMode_NoFpsLimit) {
-  const int kMaxDowngrades = VideoStreamEncoder::kMaxCpuResolutionDowngrades;
-  const int kWidth = 1280;
-  const int kHeight = 720;
-  video_stream_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0);
-
-  // Enable kBalanced preference, no initial limitation.
-  AdaptingFrameForwarder source;
-  source.set_adaptation_enabled(true);
-  video_stream_encoder_->SetSource(
-      &source,
-      VideoSendStream::DegradationPreference::kBalanced);
-  VerifyNoLimitation(source.sink_wants());
-  EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_resolution);
-  EXPECT_EQ(0, stats_proxy_->GetStats().number_of_cpu_adapt_changes);
-
-  // Trigger adapt down kMaxCpuDowngrades times.
-  int t = 1;
-  for (int i = 1; i <= kMaxDowngrades; ++i) {
-    source.IncomingCapturedFrame(CreateFrame(t, kWidth, kHeight));
-    sink_.WaitForEncodedFrame(t++);
-    video_stream_encoder_->TriggerCpuOveruse();
-    VerifyFpsMaxResolutionLt(source.sink_wants(), source.last_wants());
-    EXPECT_TRUE(stats_proxy_->GetStats().cpu_limited_resolution);
-    EXPECT_EQ(i, stats_proxy_->GetStats().number_of_cpu_adapt_changes);
-  }
-
-  // Trigger adapt down, max cpu downgrades reach, expect no change.
-  rtc::VideoSinkWants last_wants = source.sink_wants();
-  source.IncomingCapturedFrame(CreateFrame(t, kWidth, kHeight));
-  sink_.WaitForEncodedFrame(t++);
-  video_stream_encoder_->TriggerCpuOveruse();
-  VerifyFpsEqResolutionEq(source.sink_wants(), last_wants);
-  EXPECT_EQ(last_wants.max_pixel_count, source.sink_wants().max_pixel_count);
-  EXPECT_TRUE(stats_proxy_->GetStats().cpu_limited_resolution);
-  EXPECT_EQ(kMaxDowngrades,
-            stats_proxy_->GetStats().number_of_cpu_adapt_changes);
-
-  // Trigger adapt up kMaxCpuDowngrades times.
-  for (int i = 1; i <= kMaxDowngrades; ++i) {
-    source.IncomingCapturedFrame(CreateFrame(t, kWidth, kHeight));
-    sink_.WaitForEncodedFrame(t++);
-    video_stream_encoder_->TriggerCpuNormalUsage();
-    VerifyFpsMaxResolutionGt(source.sink_wants(), source.last_wants());
-    EXPECT_GT(source.sink_wants().max_pixel_count, last_wants.max_pixel_count);
-    EXPECT_EQ(kMaxDowngrades + i,
-              stats_proxy_->GetStats().number_of_cpu_adapt_changes);
-  }
-
-  VerifyNoLimitation(source.sink_wants());
-  EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_resolution);
-
-  video_stream_encoder_->Stop();
-}
-TEST_F(VideoStreamEncoderTest, SinkWantsStoredByDegradationPreference) {
-  video_stream_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0);
-  VerifyNoLimitation(video_source_.sink_wants());
-
-  const int kFrameWidth = 1280;
-  const int kFrameHeight = 720;
-  const int kFrameIntervalMs = 1000 / 30;
-
-  int frame_timestamp = 1;
-
-  video_source_.IncomingCapturedFrame(
-      CreateFrame(frame_timestamp, kFrameWidth, kFrameHeight));
-  WaitForEncodedFrame(frame_timestamp);
-  frame_timestamp += kFrameIntervalMs;
-
-  // Trigger CPU overuse.
-  video_stream_encoder_->TriggerCpuOveruse();
-  video_source_.IncomingCapturedFrame(
-      CreateFrame(frame_timestamp, kFrameWidth, kFrameHeight));
-  WaitForEncodedFrame(frame_timestamp);
-  frame_timestamp += kFrameIntervalMs;
-
-  // Default degradation preference is maintain-framerate, so will lower max
-  // wanted resolution.
-  EXPECT_FALSE(video_source_.sink_wants().target_pixel_count);
-  EXPECT_LT(video_source_.sink_wants().max_pixel_count,
-            kFrameWidth * kFrameHeight);
-  EXPECT_EQ(std::numeric_limits<int>::max(),
-            video_source_.sink_wants().max_framerate_fps);
-
-  // Set new source, switch to maintain-resolution.
-  test::FrameForwarder new_video_source;
-  video_stream_encoder_->SetSource(
-      &new_video_source,
-      VideoSendStream::DegradationPreference::kMaintainResolution);
-
-  // Initially no degradation registered.
-  VerifyNoLimitation(new_video_source.sink_wants());
-
-  // Force an input frame rate to be available, or the adaptation call won't
-  // know what framerate to adapt form.
-  const int kInputFps = 30;
-  VideoSendStream::Stats stats = stats_proxy_->GetStats();
-  stats.input_frame_rate = kInputFps;
-  stats_proxy_->SetMockStats(stats);
-
-  video_stream_encoder_->TriggerCpuOveruse();
-  new_video_source.IncomingCapturedFrame(
-      CreateFrame(frame_timestamp, kFrameWidth, kFrameHeight));
-  WaitForEncodedFrame(frame_timestamp);
-  frame_timestamp += kFrameIntervalMs;
-
-  // Some framerate constraint should be set.
-  EXPECT_FALSE(new_video_source.sink_wants().target_pixel_count);
-  EXPECT_EQ(std::numeric_limits<int>::max(),
-            new_video_source.sink_wants().max_pixel_count);
-  EXPECT_LT(new_video_source.sink_wants().max_framerate_fps, kInputFps);
-
-  // Turn off degradation completely.
-  video_stream_encoder_->SetSource(
-      &new_video_source,
-      VideoSendStream::DegradationPreference::kDegradationDisabled);
-  VerifyNoLimitation(new_video_source.sink_wants());
-
-  video_stream_encoder_->TriggerCpuOveruse();
-  new_video_source.IncomingCapturedFrame(
-      CreateFrame(frame_timestamp, kFrameWidth, kFrameHeight));
-  WaitForEncodedFrame(frame_timestamp);
-  frame_timestamp += kFrameIntervalMs;
-
-  // Still no degradation.
-  VerifyNoLimitation(new_video_source.sink_wants());
-
-  // Calling SetSource with resolution scaling enabled apply the old SinkWants.
-  video_stream_encoder_->SetSource(
-      &new_video_source,
-      VideoSendStream::DegradationPreference::kMaintainFramerate);
-  EXPECT_LT(new_video_source.sink_wants().max_pixel_count,
-            kFrameWidth * kFrameHeight);
-  EXPECT_FALSE(new_video_source.sink_wants().target_pixel_count);
-  EXPECT_EQ(std::numeric_limits<int>::max(),
-            new_video_source.sink_wants().max_framerate_fps);
-
-  // Calling SetSource with framerate scaling enabled apply the old SinkWants.
-  video_stream_encoder_->SetSource(
-      &new_video_source,
-      VideoSendStream::DegradationPreference::kMaintainResolution);
-  EXPECT_FALSE(new_video_source.sink_wants().target_pixel_count);
-  EXPECT_EQ(std::numeric_limits<int>::max(),
-            new_video_source.sink_wants().max_pixel_count);
-  EXPECT_LT(new_video_source.sink_wants().max_framerate_fps, kInputFps);
-
-  video_stream_encoder_->Stop();
-}
-
-TEST_F(VideoStreamEncoderTest, StatsTracksQualityAdaptationStats) {
-  video_stream_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0);
-
-  const int kWidth = 1280;
-  const int kHeight = 720;
-  video_source_.IncomingCapturedFrame(CreateFrame(1, kWidth, kHeight));
-  WaitForEncodedFrame(1);
-  VideoSendStream::Stats stats = stats_proxy_->GetStats();
-  EXPECT_FALSE(stats.bw_limited_resolution);
-  EXPECT_EQ(0, stats.number_of_quality_adapt_changes);
-
-  // Trigger adapt down.
-  video_stream_encoder_->TriggerQualityLow();
-  video_source_.IncomingCapturedFrame(CreateFrame(2, kWidth, kHeight));
-  WaitForEncodedFrame(2);
-
-  stats = stats_proxy_->GetStats();
-  EXPECT_TRUE(stats.bw_limited_resolution);
-  EXPECT_EQ(1, stats.number_of_quality_adapt_changes);
-
-  // Trigger adapt up.
-  video_stream_encoder_->TriggerQualityHigh();
-  video_source_.IncomingCapturedFrame(CreateFrame(3, kWidth, kHeight));
-  WaitForEncodedFrame(3);
-
-  stats = stats_proxy_->GetStats();
-  EXPECT_FALSE(stats.bw_limited_resolution);
-  EXPECT_EQ(2, stats.number_of_quality_adapt_changes);
-  EXPECT_EQ(0, stats.number_of_cpu_adapt_changes);
-
-  video_stream_encoder_->Stop();
-}
-
-TEST_F(VideoStreamEncoderTest, StatsTracksCpuAdaptationStats) {
-  video_stream_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0);
-
-  const int kWidth = 1280;
-  const int kHeight = 720;
-  video_source_.IncomingCapturedFrame(CreateFrame(1, kWidth, kHeight));
-  WaitForEncodedFrame(1);
-  VideoSendStream::Stats stats = stats_proxy_->GetStats();
-  EXPECT_FALSE(stats.cpu_limited_resolution);
-  EXPECT_EQ(0, stats.number_of_cpu_adapt_changes);
-
-  // Trigger CPU overuse.
-  video_stream_encoder_->TriggerCpuOveruse();
-  video_source_.IncomingCapturedFrame(CreateFrame(2, kWidth, kHeight));
-  WaitForEncodedFrame(2);
-
-  stats = stats_proxy_->GetStats();
-  EXPECT_TRUE(stats.cpu_limited_resolution);
-  EXPECT_EQ(1, stats.number_of_cpu_adapt_changes);
-
-  // Trigger CPU normal use.
-  video_stream_encoder_->TriggerCpuNormalUsage();
-  video_source_.IncomingCapturedFrame(CreateFrame(3, kWidth, kHeight));
-  WaitForEncodedFrame(3);
-
-  stats = stats_proxy_->GetStats();
-  EXPECT_FALSE(stats.cpu_limited_resolution);
-  EXPECT_EQ(2, stats.number_of_cpu_adapt_changes);
-  EXPECT_EQ(0, stats.number_of_quality_adapt_changes);
-
-  video_stream_encoder_->Stop();
-}
-
-TEST_F(VideoStreamEncoderTest, SwitchingSourceKeepsCpuAdaptation) {
-  video_stream_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0);
-
-  const int kWidth = 1280;
-  const int kHeight = 720;
-  video_source_.IncomingCapturedFrame(CreateFrame(1, kWidth, kHeight));
-  WaitForEncodedFrame(1);
-  VideoSendStream::Stats stats = stats_proxy_->GetStats();
-  EXPECT_FALSE(stats.bw_limited_resolution);
-  EXPECT_FALSE(stats.cpu_limited_resolution);
-  EXPECT_EQ(0, stats.number_of_cpu_adapt_changes);
-
-  // Trigger CPU overuse.
-  video_stream_encoder_->TriggerCpuOveruse();
-  video_source_.IncomingCapturedFrame(CreateFrame(2, kWidth, kHeight));
-  WaitForEncodedFrame(2);
-  stats = stats_proxy_->GetStats();
-  EXPECT_FALSE(stats.bw_limited_resolution);
-  EXPECT_TRUE(stats.cpu_limited_resolution);
-  EXPECT_EQ(1, stats.number_of_cpu_adapt_changes);
-
-  // Set new source with adaptation still enabled.
-  test::FrameForwarder new_video_source;
-  video_stream_encoder_->SetSource(
-      &new_video_source,
-      VideoSendStream::DegradationPreference::kMaintainFramerate);
-
-  new_video_source.IncomingCapturedFrame(CreateFrame(3, kWidth, kHeight));
-  WaitForEncodedFrame(3);
-  stats = stats_proxy_->GetStats();
-  EXPECT_FALSE(stats.bw_limited_resolution);
-  EXPECT_TRUE(stats.cpu_limited_resolution);
-  EXPECT_EQ(1, stats.number_of_cpu_adapt_changes);
-
-  // Set adaptation disabled.
-  video_stream_encoder_->SetSource(
-      &new_video_source,
-      VideoSendStream::DegradationPreference::kDegradationDisabled);
-
-  new_video_source.IncomingCapturedFrame(CreateFrame(4, kWidth, kHeight));
-  WaitForEncodedFrame(4);
-  stats = stats_proxy_->GetStats();
-  EXPECT_FALSE(stats.bw_limited_resolution);
-  EXPECT_FALSE(stats.cpu_limited_resolution);
-  EXPECT_EQ(1, stats.number_of_cpu_adapt_changes);
-
-  // Set adaptation back to enabled.
-  video_stream_encoder_->SetSource(
-      &new_video_source,
-      VideoSendStream::DegradationPreference::kMaintainFramerate);
-
-  new_video_source.IncomingCapturedFrame(CreateFrame(5, kWidth, kHeight));
-  WaitForEncodedFrame(5);
-  stats = stats_proxy_->GetStats();
-  EXPECT_FALSE(stats.bw_limited_resolution);
-  EXPECT_TRUE(stats.cpu_limited_resolution);
-  EXPECT_EQ(1, stats.number_of_cpu_adapt_changes);
-
-  // Trigger CPU normal use.
-  video_stream_encoder_->TriggerCpuNormalUsage();
-  new_video_source.IncomingCapturedFrame(CreateFrame(6, kWidth, kHeight));
-  WaitForEncodedFrame(6);
-  stats = stats_proxy_->GetStats();
-  EXPECT_FALSE(stats.bw_limited_resolution);
-  EXPECT_FALSE(stats.cpu_limited_resolution);
-  EXPECT_EQ(2, stats.number_of_cpu_adapt_changes);
-  EXPECT_EQ(0, stats.number_of_quality_adapt_changes);
-
-  video_stream_encoder_->Stop();
-}
-
-TEST_F(VideoStreamEncoderTest, SwitchingSourceKeepsQualityAdaptation) {
-  video_stream_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0);
-
-  const int kWidth = 1280;
-  const int kHeight = 720;
-  video_source_.IncomingCapturedFrame(CreateFrame(1, kWidth, kHeight));
-  WaitForEncodedFrame(1);
-  VideoSendStream::Stats stats = stats_proxy_->GetStats();
-  EXPECT_FALSE(stats.bw_limited_resolution);
-  EXPECT_FALSE(stats.bw_limited_framerate);
-  EXPECT_EQ(0, stats.number_of_quality_adapt_changes);
-
-  // Set new source with adaptation still enabled.
-  test::FrameForwarder new_video_source;
-  video_stream_encoder_->SetSource(
-      &new_video_source,
-      VideoSendStream::DegradationPreference::kBalanced);
-
-  new_video_source.IncomingCapturedFrame(CreateFrame(2, kWidth, kHeight));
-  WaitForEncodedFrame(2);
-  stats = stats_proxy_->GetStats();
-  EXPECT_FALSE(stats.bw_limited_resolution);
-  EXPECT_FALSE(stats.bw_limited_framerate);
-  EXPECT_EQ(0, stats.number_of_quality_adapt_changes);
-
-  // Trigger adapt down.
-  video_stream_encoder_->TriggerQualityLow();
-  new_video_source.IncomingCapturedFrame(CreateFrame(3, kWidth, kHeight));
-  WaitForEncodedFrame(3);
-  stats = stats_proxy_->GetStats();
-  EXPECT_TRUE(stats.bw_limited_resolution);
-  EXPECT_FALSE(stats.bw_limited_framerate);
-  EXPECT_EQ(1, stats.number_of_quality_adapt_changes);
-
-  // Set new source with adaptation still enabled.
-  video_stream_encoder_->SetSource(
-      &new_video_source,
-      VideoSendStream::DegradationPreference::kBalanced);
-
-  new_video_source.IncomingCapturedFrame(CreateFrame(4, kWidth, kHeight));
-  WaitForEncodedFrame(4);
-  stats = stats_proxy_->GetStats();
-  EXPECT_TRUE(stats.bw_limited_resolution);
-  EXPECT_FALSE(stats.bw_limited_framerate);
-  EXPECT_EQ(1, stats.number_of_quality_adapt_changes);
-
-  // Disable resolution scaling.
-  video_stream_encoder_->SetSource(
-      &new_video_source,
-      VideoSendStream::DegradationPreference::kMaintainResolution);
-
-  new_video_source.IncomingCapturedFrame(CreateFrame(5, kWidth, kHeight));
-  WaitForEncodedFrame(5);
-  stats = stats_proxy_->GetStats();
-  EXPECT_FALSE(stats.bw_limited_resolution);
-  EXPECT_FALSE(stats.bw_limited_framerate);
-  EXPECT_EQ(1, stats.number_of_quality_adapt_changes);
-  EXPECT_EQ(0, stats.number_of_cpu_adapt_changes);
-
-  video_stream_encoder_->Stop();
-}
-
-TEST_F(VideoStreamEncoderTest,
-       QualityAdaptationStatsAreResetWhenScalerIsDisabled) {
-  video_stream_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0);
-
-  const int kWidth = 1280;
-  const int kHeight = 720;
-  video_source_.set_adaptation_enabled(true);
-  video_source_.IncomingCapturedFrame(CreateFrame(1, kWidth, kHeight));
-  WaitForEncodedFrame(1);
-  EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_resolution);
-  EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_resolution);
-  EXPECT_EQ(0, stats_proxy_->GetStats().number_of_cpu_adapt_changes);
-
-  // Trigger adapt down.
-  video_stream_encoder_->TriggerQualityLow();
-  video_source_.IncomingCapturedFrame(CreateFrame(2, kWidth, kHeight));
-  WaitForEncodedFrame(2);
-  EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_resolution);
-  EXPECT_TRUE(stats_proxy_->GetStats().bw_limited_resolution);
-  EXPECT_EQ(0, stats_proxy_->GetStats().number_of_cpu_adapt_changes);
-
-  // Trigger overuse.
-  video_stream_encoder_->TriggerCpuOveruse();
-  video_source_.IncomingCapturedFrame(CreateFrame(3, kWidth, kHeight));
-  WaitForEncodedFrame(3);
-  EXPECT_TRUE(stats_proxy_->GetStats().cpu_limited_resolution);
-  EXPECT_TRUE(stats_proxy_->GetStats().bw_limited_resolution);
-  EXPECT_EQ(1, stats_proxy_->GetStats().number_of_cpu_adapt_changes);
-
-  // Set source with adaptation still enabled but quality scaler is off.
-  fake_encoder_.SetQualityScaling(false);
-  video_stream_encoder_->SetSource(
-      &video_source_,
-      VideoSendStream::DegradationPreference::kMaintainFramerate);
-
-  video_source_.IncomingCapturedFrame(CreateFrame(4, kWidth, kHeight));
-  WaitForEncodedFrame(4);
-  EXPECT_TRUE(stats_proxy_->GetStats().cpu_limited_resolution);
-  EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_resolution);
-  EXPECT_EQ(1, stats_proxy_->GetStats().number_of_cpu_adapt_changes);
-
-  video_stream_encoder_->Stop();
-}
-
-TEST_F(VideoStreamEncoderTest,
-       StatsTracksCpuAdaptationStatsWhenSwitchingSource) {
-  video_stream_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0);
-
-  const int kWidth = 1280;
-  const int kHeight = 720;
-  int sequence = 1;
-
-  video_source_.IncomingCapturedFrame(CreateFrame(sequence, kWidth, kHeight));
-  WaitForEncodedFrame(sequence++);
-  VideoSendStream::Stats stats = stats_proxy_->GetStats();
-  EXPECT_FALSE(stats.cpu_limited_resolution);
-  EXPECT_FALSE(stats.cpu_limited_framerate);
-  EXPECT_EQ(0, stats.number_of_cpu_adapt_changes);
-
-  // Trigger CPU overuse, should now adapt down.
-  video_stream_encoder_->TriggerCpuOveruse();
-  video_source_.IncomingCapturedFrame(CreateFrame(sequence, kWidth, kHeight));
-  WaitForEncodedFrame(sequence++);
-  stats = stats_proxy_->GetStats();
-  EXPECT_TRUE(stats.cpu_limited_resolution);
-  EXPECT_FALSE(stats.cpu_limited_framerate);
-  EXPECT_EQ(1, stats.number_of_cpu_adapt_changes);
-
-  // Set new source with adaptation still enabled.
-  test::FrameForwarder new_video_source;
-  video_stream_encoder_->SetSource(
-      &new_video_source,
-      VideoSendStream::DegradationPreference::kMaintainFramerate);
-
-  new_video_source.IncomingCapturedFrame(
-      CreateFrame(sequence, kWidth, kHeight));
-  WaitForEncodedFrame(sequence++);
-  stats = stats_proxy_->GetStats();
-  EXPECT_TRUE(stats.cpu_limited_resolution);
-  EXPECT_FALSE(stats.cpu_limited_framerate);
-  EXPECT_EQ(1, stats.number_of_cpu_adapt_changes);
-
-  // Set cpu adaptation by frame dropping.
-  video_stream_encoder_->SetSource(
-      &new_video_source,
-      VideoSendStream::DegradationPreference::kMaintainResolution);
-  new_video_source.IncomingCapturedFrame(
-      CreateFrame(sequence, kWidth, kHeight));
-  WaitForEncodedFrame(sequence++);
-  stats = stats_proxy_->GetStats();
-  // Not adapted at first.
-  EXPECT_FALSE(stats.cpu_limited_resolution);
-  EXPECT_FALSE(stats.cpu_limited_framerate);
-  EXPECT_EQ(1, stats.number_of_cpu_adapt_changes);
-
-  // Force an input frame rate to be available, or the adaptation call won't
-  // know what framerate to adapt from.
-  VideoSendStream::Stats mock_stats = stats_proxy_->GetStats();
-  mock_stats.input_frame_rate = 30;
-  stats_proxy_->SetMockStats(mock_stats);
-  video_stream_encoder_->TriggerCpuOveruse();
-  stats_proxy_->ResetMockStats();
-
-  new_video_source.IncomingCapturedFrame(
-      CreateFrame(sequence, kWidth, kHeight));
-  WaitForEncodedFrame(sequence++);
-
-  // Framerate now adapted.
-  stats = stats_proxy_->GetStats();
-  EXPECT_FALSE(stats.cpu_limited_resolution);
-  EXPECT_TRUE(stats.cpu_limited_framerate);
-  EXPECT_EQ(2, stats.number_of_cpu_adapt_changes);
-
-  // Disable CPU adaptation.
-  video_stream_encoder_->SetSource(
-      &new_video_source,
-      VideoSendStream::DegradationPreference::kDegradationDisabled);
-  new_video_source.IncomingCapturedFrame(
-      CreateFrame(sequence, kWidth, kHeight));
-  WaitForEncodedFrame(sequence++);
-
-  stats = stats_proxy_->GetStats();
-  EXPECT_FALSE(stats.cpu_limited_resolution);
-  EXPECT_FALSE(stats.cpu_limited_framerate);
-  EXPECT_EQ(2, stats.number_of_cpu_adapt_changes);
-
-  // Try to trigger overuse. Should not succeed.
-  stats_proxy_->SetMockStats(mock_stats);
-  video_stream_encoder_->TriggerCpuOveruse();
-  stats_proxy_->ResetMockStats();
-
-  stats = stats_proxy_->GetStats();
-  EXPECT_FALSE(stats.cpu_limited_resolution);
-  EXPECT_FALSE(stats.cpu_limited_framerate);
-  EXPECT_EQ(2, stats.number_of_cpu_adapt_changes);
-
-  // Switch back the source with resolution adaptation enabled.
-  video_stream_encoder_->SetSource(
-      &video_source_,
-      VideoSendStream::DegradationPreference::kMaintainFramerate);
-  video_source_.IncomingCapturedFrame(CreateFrame(sequence, kWidth, kHeight));
-  WaitForEncodedFrame(sequence++);
-  stats = stats_proxy_->GetStats();
-  EXPECT_TRUE(stats.cpu_limited_resolution);
-  EXPECT_FALSE(stats.cpu_limited_framerate);
-  EXPECT_EQ(2, stats.number_of_cpu_adapt_changes);
-
-  // Trigger CPU normal usage.
-  video_stream_encoder_->TriggerCpuNormalUsage();
-  video_source_.IncomingCapturedFrame(CreateFrame(sequence, kWidth, kHeight));
-  WaitForEncodedFrame(sequence++);
-  stats = stats_proxy_->GetStats();
-  EXPECT_FALSE(stats.cpu_limited_resolution);
-  EXPECT_FALSE(stats.cpu_limited_framerate);
-  EXPECT_EQ(3, stats.number_of_cpu_adapt_changes);
-
-  // Back to the source with adaptation off, set it back to maintain-resolution.
-  video_stream_encoder_->SetSource(
-      &new_video_source,
-      VideoSendStream::DegradationPreference::kMaintainResolution);
-  new_video_source.IncomingCapturedFrame(
-      CreateFrame(sequence, kWidth, kHeight));
-  WaitForEncodedFrame(sequence++);
-  stats = stats_proxy_->GetStats();
-  // Disabled, since we previously switched the source to disabled.
-  EXPECT_FALSE(stats.cpu_limited_resolution);
-  EXPECT_TRUE(stats.cpu_limited_framerate);
-  EXPECT_EQ(3, stats.number_of_cpu_adapt_changes);
-
-  // Trigger CPU normal usage.
-  video_stream_encoder_->TriggerCpuNormalUsage();
-  new_video_source.IncomingCapturedFrame(
-      CreateFrame(sequence, kWidth, kHeight));
-  WaitForEncodedFrame(sequence++);
-  stats = stats_proxy_->GetStats();
-  EXPECT_FALSE(stats.cpu_limited_resolution);
-  EXPECT_FALSE(stats.cpu_limited_framerate);
-  EXPECT_EQ(4, stats.number_of_cpu_adapt_changes);
-  EXPECT_EQ(0, stats.number_of_quality_adapt_changes);
-
-  video_stream_encoder_->Stop();
-}
-
-TEST_F(VideoStreamEncoderTest, StatsTracksPreferredBitrate) {
-  video_stream_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0);
-
-  const int kWidth = 1280;
-  const int kHeight = 720;
-  video_source_.IncomingCapturedFrame(CreateFrame(1, kWidth, kHeight));
-  WaitForEncodedFrame(1);
-
-  VideoSendStream::Stats stats = stats_proxy_->GetStats();
-  EXPECT_EQ(video_encoder_config_.max_bitrate_bps,
-            stats.preferred_media_bitrate_bps);
-
-  video_stream_encoder_->Stop();
-}
-
-TEST_F(VideoStreamEncoderTest,
-       ScalingUpAndDownDoesNothingWithMaintainResolution) {
-  const int kWidth = 1280;
-  const int kHeight = 720;
-  video_stream_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0);
-
-  // Expect no scaling to begin with.
-  VerifyNoLimitation(video_source_.sink_wants());
-
-  video_source_.IncomingCapturedFrame(CreateFrame(1, kWidth, kHeight));
-  WaitForEncodedFrame(1);
-
-  // Trigger scale down.
-  video_stream_encoder_->TriggerQualityLow();
-
-  video_source_.IncomingCapturedFrame(CreateFrame(2, kWidth, kHeight));
-  WaitForEncodedFrame(2);
-
-  // Expect a scale down.
-  EXPECT_TRUE(video_source_.sink_wants().max_pixel_count);
-  EXPECT_LT(video_source_.sink_wants().max_pixel_count, kWidth * kHeight);
-
-  // Set resolution scaling disabled.
-  test::FrameForwarder new_video_source;
-  video_stream_encoder_->SetSource(
-      &new_video_source,
-      VideoSendStream::DegradationPreference::kMaintainResolution);
-
-  // Trigger scale down.
-  video_stream_encoder_->TriggerQualityLow();
-  new_video_source.IncomingCapturedFrame(CreateFrame(3, kWidth, kHeight));
-  WaitForEncodedFrame(3);
-
-  // Expect no scaling.
-  EXPECT_EQ(std::numeric_limits<int>::max(),
-            new_video_source.sink_wants().max_pixel_count);
-
-  // Trigger scale up.
-  video_stream_encoder_->TriggerQualityHigh();
-  new_video_source.IncomingCapturedFrame(CreateFrame(4, kWidth, kHeight));
-  WaitForEncodedFrame(4);
-
-  // Expect nothing to change, still no scaling.
-  EXPECT_EQ(std::numeric_limits<int>::max(),
-            new_video_source.sink_wants().max_pixel_count);
-
-  video_stream_encoder_->Stop();
-}
-
-TEST_F(VideoStreamEncoderTest,
-       SkipsSameAdaptDownRequest_MaintainFramerateMode) {
-  const int kWidth = 1280;
-  const int kHeight = 720;
-  video_stream_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0);
-
-  // Enable kMaintainFramerate preference, no initial limitation.
-  test::FrameForwarder source;
-  video_stream_encoder_->SetSource(
-      &source, VideoSendStream::DegradationPreference::kMaintainFramerate);
-
-  source.IncomingCapturedFrame(CreateFrame(1, kWidth, kHeight));
-  WaitForEncodedFrame(1);
-  VerifyNoLimitation(source.sink_wants());
-  EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_resolution);
-  EXPECT_EQ(0, stats_proxy_->GetStats().number_of_cpu_adapt_changes);
-
-  // Trigger adapt down, expect scaled down resolution.
-  video_stream_encoder_->TriggerCpuOveruse();
-  VerifyFpsMaxResolutionLt(source.sink_wants(), kWidth * kHeight);
-  const int kLastMaxPixelCount = source.sink_wants().max_pixel_count;
-  EXPECT_TRUE(stats_proxy_->GetStats().cpu_limited_resolution);
-  EXPECT_EQ(1, stats_proxy_->GetStats().number_of_cpu_adapt_changes);
-
-  // Trigger adapt down for same input resolution, expect no change.
-  video_stream_encoder_->TriggerCpuOveruse();
-  EXPECT_EQ(kLastMaxPixelCount, source.sink_wants().max_pixel_count);
-  EXPECT_TRUE(stats_proxy_->GetStats().cpu_limited_resolution);
-  EXPECT_EQ(1, stats_proxy_->GetStats().number_of_cpu_adapt_changes);
-
-  video_stream_encoder_->Stop();
-}
-
-TEST_F(VideoStreamEncoderTest, SkipsSameOrLargerAdaptDownRequest_BalancedMode) {
-  const int kWidth = 1280;
-  const int kHeight = 720;
-  video_stream_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0);
-
-  // Enable kBalanced preference, no initial limitation.
-  test::FrameForwarder source;
-  video_stream_encoder_->SetSource(
-      &source,
-      VideoSendStream::DegradationPreference::kBalanced);
-  source.IncomingCapturedFrame(CreateFrame(1, kWidth, kHeight));
-  sink_.WaitForEncodedFrame(1);
-  VerifyNoLimitation(source.sink_wants());
-
-  // Trigger adapt down, expect scaled down resolution.
-  video_stream_encoder_->TriggerQualityLow();
-  VerifyFpsMaxResolutionLt(source.sink_wants(), kWidth * kHeight);
-  EXPECT_TRUE(stats_proxy_->GetStats().bw_limited_resolution);
-  EXPECT_EQ(1, stats_proxy_->GetStats().number_of_quality_adapt_changes);
-  const int kLastMaxPixelCount = source.sink_wants().max_pixel_count;
-
-  // Trigger adapt down for same input resolution, expect no change.
-  source.IncomingCapturedFrame(CreateFrame(2, kWidth, kHeight));
-  sink_.WaitForEncodedFrame(2);
-  video_stream_encoder_->TriggerQualityLow();
-  EXPECT_EQ(kLastMaxPixelCount, source.sink_wants().max_pixel_count);
-  EXPECT_TRUE(stats_proxy_->GetStats().bw_limited_resolution);
-  EXPECT_EQ(1, stats_proxy_->GetStats().number_of_quality_adapt_changes);
-
-  // Trigger adapt down for larger input resolution, expect no change.
-  source.IncomingCapturedFrame(CreateFrame(3, kWidth + 1, kHeight + 1));
-  sink_.WaitForEncodedFrame(3);
-  video_stream_encoder_->TriggerQualityLow();
-  EXPECT_EQ(kLastMaxPixelCount, source.sink_wants().max_pixel_count);
-  EXPECT_TRUE(stats_proxy_->GetStats().bw_limited_resolution);
-  EXPECT_EQ(1, stats_proxy_->GetStats().number_of_quality_adapt_changes);
-
-  video_stream_encoder_->Stop();
-}
-
-TEST_F(VideoStreamEncoderTest,
-       NoChangeForInitialNormalUsage_MaintainFramerateMode) {
-  const int kWidth = 1280;
-  const int kHeight = 720;
-  video_stream_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0);
-
-  // Enable kMaintainFramerate preference, no initial limitation.
-  test::FrameForwarder source;
-  video_stream_encoder_->SetSource(
-      &source, VideoSendStream::DegradationPreference::kMaintainFramerate);
-
-  source.IncomingCapturedFrame(CreateFrame(1, kWidth, kHeight));
-  WaitForEncodedFrame(kWidth, kHeight);
-  VerifyNoLimitation(source.sink_wants());
-  EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_resolution);
-  EXPECT_EQ(0, stats_proxy_->GetStats().number_of_cpu_adapt_changes);
-
-  // Trigger adapt up, expect no change.
-  video_stream_encoder_->TriggerCpuNormalUsage();
-  VerifyNoLimitation(source.sink_wants());
-  EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_resolution);
-  EXPECT_EQ(0, stats_proxy_->GetStats().number_of_cpu_adapt_changes);
-
-  video_stream_encoder_->Stop();
-}
-
-TEST_F(VideoStreamEncoderTest,
-       NoChangeForInitialNormalUsage_MaintainResolutionMode) {
-  const int kWidth = 1280;
-  const int kHeight = 720;
-  video_stream_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0);
-
-  // Enable kMaintainResolution preference, no initial limitation.
-  test::FrameForwarder source;
-  video_stream_encoder_->SetSource(
-      &source, VideoSendStream::DegradationPreference::kMaintainResolution);
-
-  source.IncomingCapturedFrame(CreateFrame(1, kWidth, kHeight));
-  WaitForEncodedFrame(kWidth, kHeight);
-  VerifyNoLimitation(source.sink_wants());
-  EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_framerate);
-  EXPECT_EQ(0, stats_proxy_->GetStats().number_of_cpu_adapt_changes);
-
-  // Trigger adapt up, expect no change.
-  video_stream_encoder_->TriggerCpuNormalUsage();
-  VerifyNoLimitation(source.sink_wants());
-  EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_framerate);
-  EXPECT_EQ(0, stats_proxy_->GetStats().number_of_cpu_adapt_changes);
-
-  video_stream_encoder_->Stop();
-}
-
-TEST_F(VideoStreamEncoderTest, NoChangeForInitialNormalUsage_BalancedMode) {
-  const int kWidth = 1280;
-  const int kHeight = 720;
-  video_stream_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0);
-
-  // Enable kBalanced preference, no initial limitation.
-  test::FrameForwarder source;
-  video_stream_encoder_->SetSource(
-      &source,
-      VideoSendStream::DegradationPreference::kBalanced);
-
-  source.IncomingCapturedFrame(CreateFrame(1, kWidth, kHeight));
-  sink_.WaitForEncodedFrame(kWidth, kHeight);
-  VerifyNoLimitation(source.sink_wants());
-  EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_resolution);
-  EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_framerate);
-  EXPECT_EQ(0, stats_proxy_->GetStats().number_of_quality_adapt_changes);
-
-  // Trigger adapt up, expect no change.
-  video_stream_encoder_->TriggerQualityHigh();
-  VerifyNoLimitation(source.sink_wants());
-  EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_resolution);
-  EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_framerate);
-  EXPECT_EQ(0, stats_proxy_->GetStats().number_of_quality_adapt_changes);
-
-  video_stream_encoder_->Stop();
-}
-
-TEST_F(VideoStreamEncoderTest, NoChangeForInitialNormalUsage_DisabledMode) {
-  const int kWidth = 1280;
-  const int kHeight = 720;
-  video_stream_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0);
-
-  // Enable kDegradationDisabled preference, no initial limitation.
-  test::FrameForwarder source;
-  video_stream_encoder_->SetSource(
-      &source, VideoSendStream::DegradationPreference::kDegradationDisabled);
-
-  source.IncomingCapturedFrame(CreateFrame(1, kWidth, kHeight));
-  sink_.WaitForEncodedFrame(kWidth, kHeight);
-  VerifyNoLimitation(source.sink_wants());
-  EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_resolution);
-  EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_framerate);
-  EXPECT_EQ(0, stats_proxy_->GetStats().number_of_quality_adapt_changes);
-
-  // Trigger adapt up, expect no change.
-  video_stream_encoder_->TriggerQualityHigh();
-  VerifyNoLimitation(source.sink_wants());
-  EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_resolution);
-  EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_framerate);
-  EXPECT_EQ(0, stats_proxy_->GetStats().number_of_quality_adapt_changes);
-
-  video_stream_encoder_->Stop();
-}
-
-TEST_F(VideoStreamEncoderTest,
-       AdaptsResolutionForLowQuality_MaintainFramerateMode) {
-  const int kWidth = 1280;
-  const int kHeight = 720;
-  video_stream_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0);
-
-  // Enable kMaintainFramerate preference, no initial limitation.
-  AdaptingFrameForwarder source;
-  source.set_adaptation_enabled(true);
-  video_stream_encoder_->SetSource(
-      &source, VideoSendStream::DegradationPreference::kMaintainFramerate);
-
-  source.IncomingCapturedFrame(CreateFrame(1, kWidth, kHeight));
-  WaitForEncodedFrame(1);
-  VerifyNoLimitation(source.sink_wants());
-  EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_resolution);
-  EXPECT_EQ(0, stats_proxy_->GetStats().number_of_quality_adapt_changes);
-
-  // Trigger adapt down, expect scaled down resolution.
-  video_stream_encoder_->TriggerQualityLow();
-  source.IncomingCapturedFrame(CreateFrame(2, kWidth, kHeight));
-  WaitForEncodedFrame(2);
-  VerifyFpsMaxResolutionLt(source.sink_wants(), kWidth * kHeight);
-  EXPECT_TRUE(stats_proxy_->GetStats().bw_limited_resolution);
-  EXPECT_EQ(1, stats_proxy_->GetStats().number_of_quality_adapt_changes);
-
-  // Trigger adapt up, expect no restriction.
-  video_stream_encoder_->TriggerQualityHigh();
-  VerifyNoLimitation(source.sink_wants());
-  EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_resolution);
-  EXPECT_EQ(2, stats_proxy_->GetStats().number_of_quality_adapt_changes);
-  EXPECT_EQ(0, stats_proxy_->GetStats().number_of_cpu_adapt_changes);
-
-  video_stream_encoder_->Stop();
-}
-
-TEST_F(VideoStreamEncoderTest,
-       AdaptsFramerateForLowQuality_MaintainResolutionMode) {
-  const int kWidth = 1280;
-  const int kHeight = 720;
-  const int kInputFps = 30;
-  video_stream_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0);
-
-  VideoSendStream::Stats stats = stats_proxy_->GetStats();
-  stats.input_frame_rate = kInputFps;
-  stats_proxy_->SetMockStats(stats);
-
-  // Expect no scaling to begin with (preference: kMaintainFramerate).
-  video_source_.IncomingCapturedFrame(CreateFrame(1, kWidth, kHeight));
-  sink_.WaitForEncodedFrame(1);
-  VerifyNoLimitation(video_source_.sink_wants());
-
-  // Trigger adapt down, expect scaled down resolution.
-  video_stream_encoder_->TriggerQualityLow();
-  video_source_.IncomingCapturedFrame(CreateFrame(2, kWidth, kHeight));
-  sink_.WaitForEncodedFrame(2);
-  VerifyFpsMaxResolutionLt(video_source_.sink_wants(), kWidth * kHeight);
-
-  // Enable kMaintainResolution preference.
-  test::FrameForwarder new_video_source;
-  video_stream_encoder_->SetSource(
-      &new_video_source,
-      VideoSendStream::DegradationPreference::kMaintainResolution);
-  VerifyNoLimitation(new_video_source.sink_wants());
-
-  // Trigger adapt down, expect reduced framerate.
-  video_stream_encoder_->TriggerQualityLow();
-  new_video_source.IncomingCapturedFrame(CreateFrame(3, kWidth, kHeight));
-  sink_.WaitForEncodedFrame(3);
-  VerifyFpsLtResolutionMax(new_video_source.sink_wants(), kInputFps);
-
-  // Trigger adapt up, expect no restriction.
-  video_stream_encoder_->TriggerQualityHigh();
-  VerifyNoLimitation(new_video_source.sink_wants());
-
-  video_stream_encoder_->Stop();
-}
-
-TEST_F(VideoStreamEncoderTest, DoesNotScaleBelowSetResolutionLimit) {
-  const int kWidth = 1280;
-  const int kHeight = 720;
-  const size_t kNumFrames = 10;
-
-  video_stream_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0);
-
-  // Enable adapter, expected input resolutions when downscaling:
-  // 1280x720 -> 960x540 -> 640x360 -> 480x270 -> 320x180 (kMinPixelsPerFrame)
-  video_source_.set_adaptation_enabled(true);
-
-  EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_resolution);
-  EXPECT_EQ(0, stats_proxy_->GetStats().number_of_quality_adapt_changes);
-
-  int downscales = 0;
-  for (size_t i = 1; i <= kNumFrames; i++) {
-    video_source_.IncomingCapturedFrame(CreateFrame(i, kWidth, kHeight));
-    WaitForEncodedFrame(i);
-
-    // Trigger scale down.
-    rtc::VideoSinkWants last_wants = video_source_.sink_wants();
-    video_stream_encoder_->TriggerQualityLow();
-    EXPECT_GE(video_source_.sink_wants().max_pixel_count, kMinPixelsPerFrame);
-
-    if (video_source_.sink_wants().max_pixel_count < last_wants.max_pixel_count)
-      ++downscales;
-
-    EXPECT_TRUE(stats_proxy_->GetStats().bw_limited_resolution);
-    EXPECT_EQ(downscales,
-              stats_proxy_->GetStats().number_of_quality_adapt_changes);
-    EXPECT_GT(downscales, 0);
-  }
-  video_stream_encoder_->Stop();
-}
-
-TEST_F(VideoStreamEncoderTest,
-       AdaptsResolutionUpAndDownTwiceOnOveruse_MaintainFramerateMode) {
-  const int kWidth = 1280;
-  const int kHeight = 720;
-  video_stream_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0);
-
-  // Enable kMaintainFramerate preference, no initial limitation.
-  AdaptingFrameForwarder source;
-  source.set_adaptation_enabled(true);
-  video_stream_encoder_->SetSource(
-      &source, VideoSendStream::DegradationPreference::kMaintainFramerate);
-
-  source.IncomingCapturedFrame(CreateFrame(1, kWidth, kHeight));
-  WaitForEncodedFrame(kWidth, kHeight);
-  VerifyNoLimitation(source.sink_wants());
-  EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_resolution);
-  EXPECT_EQ(0, stats_proxy_->GetStats().number_of_cpu_adapt_changes);
-
-  // Trigger adapt down, expect scaled down resolution.
-  video_stream_encoder_->TriggerCpuOveruse();
-  source.IncomingCapturedFrame(CreateFrame(2, kWidth, kHeight));
-  WaitForEncodedFrame(2);
-  VerifyFpsMaxResolutionLt(source.sink_wants(), kWidth * kHeight);
-  EXPECT_TRUE(stats_proxy_->GetStats().cpu_limited_resolution);
-  EXPECT_EQ(1, stats_proxy_->GetStats().number_of_cpu_adapt_changes);
-
-  // Trigger adapt up, expect no restriction.
-  video_stream_encoder_->TriggerCpuNormalUsage();
-  source.IncomingCapturedFrame(CreateFrame(3, kWidth, kHeight));
-  WaitForEncodedFrame(kWidth, kHeight);
-  VerifyNoLimitation(source.sink_wants());
-  EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_resolution);
-  EXPECT_EQ(2, stats_proxy_->GetStats().number_of_cpu_adapt_changes);
-
-  // Trigger adapt down, expect scaled down resolution.
-  video_stream_encoder_->TriggerCpuOveruse();
-  source.IncomingCapturedFrame(CreateFrame(4, kWidth, kHeight));
-  WaitForEncodedFrame(4);
-  VerifyFpsMaxResolutionLt(source.sink_wants(), kWidth * kHeight);
-  EXPECT_TRUE(stats_proxy_->GetStats().cpu_limited_resolution);
-  EXPECT_EQ(3, stats_proxy_->GetStats().number_of_cpu_adapt_changes);
-
-  // Trigger adapt up, expect no restriction.
-  video_stream_encoder_->TriggerCpuNormalUsage();
-  source.IncomingCapturedFrame(CreateFrame(5, kWidth, kHeight));
-  sink_.WaitForEncodedFrame(kWidth, kHeight);
-  VerifyNoLimitation(source.sink_wants());
-  EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_resolution);
-  EXPECT_EQ(4, stats_proxy_->GetStats().number_of_cpu_adapt_changes);
-
-  video_stream_encoder_->Stop();
-}
-
-TEST_F(VideoStreamEncoderTest,
-       AdaptsResolutionUpAndDownTwiceForLowQuality_BalancedMode_NoFpsLimit) {
-  const int kWidth = 1280;
-  const int kHeight = 720;
-  video_stream_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0);
-
-  // Enable kBalanced preference, no initial limitation.
-  AdaptingFrameForwarder source;
-  source.set_adaptation_enabled(true);
-  video_stream_encoder_->SetSource(
-      &source,
-      VideoSendStream::DegradationPreference::kBalanced);
-
-  source.IncomingCapturedFrame(CreateFrame(1, kWidth, kHeight));
-  sink_.WaitForEncodedFrame(kWidth, kHeight);
-  VerifyNoLimitation(source.sink_wants());
-  EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_resolution);
-  EXPECT_EQ(0, stats_proxy_->GetStats().number_of_quality_adapt_changes);
-
-  // Trigger adapt down, expect scaled down resolution.
-  video_stream_encoder_->TriggerQualityLow();
-  source.IncomingCapturedFrame(CreateFrame(2, kWidth, kHeight));
-  sink_.WaitForEncodedFrame(2);
-  VerifyFpsMaxResolutionLt(source.sink_wants(), kWidth * kHeight);
-  EXPECT_TRUE(stats_proxy_->GetStats().bw_limited_resolution);
-  EXPECT_EQ(1, stats_proxy_->GetStats().number_of_quality_adapt_changes);
-
-  // Trigger adapt up, expect no restriction.
-  video_stream_encoder_->TriggerQualityHigh();
-  source.IncomingCapturedFrame(CreateFrame(3, kWidth, kHeight));
-  sink_.WaitForEncodedFrame(kWidth, kHeight);
-  VerifyNoLimitation(source.sink_wants());
-  EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_resolution);
-  EXPECT_EQ(2, stats_proxy_->GetStats().number_of_quality_adapt_changes);
-
-  // Trigger adapt down, expect scaled down resolution.
-  video_stream_encoder_->TriggerQualityLow();
-  source.IncomingCapturedFrame(CreateFrame(4, kWidth, kHeight));
-  sink_.WaitForEncodedFrame(4);
-  VerifyFpsMaxResolutionLt(source.sink_wants(), kWidth * kHeight);
-  EXPECT_TRUE(stats_proxy_->GetStats().bw_limited_resolution);
-  EXPECT_EQ(3, stats_proxy_->GetStats().number_of_quality_adapt_changes);
-
-  // Trigger adapt up, expect no restriction.
-  video_stream_encoder_->TriggerQualityHigh();
-  source.IncomingCapturedFrame(CreateFrame(5, kWidth, kHeight));
-  sink_.WaitForEncodedFrame(kWidth, kHeight);
-  VerifyNoLimitation(source.sink_wants());
-  EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_resolution);
-  EXPECT_EQ(4, stats_proxy_->GetStats().number_of_quality_adapt_changes);
-
-  video_stream_encoder_->Stop();
-}
-
-TEST_F(VideoStreamEncoderTest,
-       AdaptsResolutionOnOveruseAndLowQuality_MaintainFramerateMode) {
-  const int kWidth = 1280;
-  const int kHeight = 720;
-  video_stream_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0);
-
-  // Enable kMaintainFramerate preference, no initial limitation.
-  AdaptingFrameForwarder source;
-  source.set_adaptation_enabled(true);
-  video_stream_encoder_->SetSource(
-      &source, VideoSendStream::DegradationPreference::kMaintainFramerate);
-
-  source.IncomingCapturedFrame(CreateFrame(1, kWidth, kHeight));
-  WaitForEncodedFrame(kWidth, kHeight);
-  VerifyNoLimitation(source.sink_wants());
-  EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_resolution);
-  EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_resolution);
-  EXPECT_EQ(0, stats_proxy_->GetStats().number_of_cpu_adapt_changes);
-  EXPECT_EQ(0, stats_proxy_->GetStats().number_of_quality_adapt_changes);
-
-  // Trigger cpu adapt down, expect scaled down resolution (960x540).
-  video_stream_encoder_->TriggerCpuOveruse();
-  source.IncomingCapturedFrame(CreateFrame(2, kWidth, kHeight));
-  WaitForEncodedFrame(2);
-  VerifyFpsMaxResolutionLt(source.sink_wants(), kWidth * kHeight);
-  EXPECT_TRUE(stats_proxy_->GetStats().cpu_limited_resolution);
-  EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_resolution);
-  EXPECT_EQ(1, stats_proxy_->GetStats().number_of_cpu_adapt_changes);
-  EXPECT_EQ(0, stats_proxy_->GetStats().number_of_quality_adapt_changes);
-
-  // Trigger cpu adapt down, expect scaled down resolution (640x360).
-  video_stream_encoder_->TriggerCpuOveruse();
-  source.IncomingCapturedFrame(CreateFrame(3, kWidth, kHeight));
-  WaitForEncodedFrame(3);
-  VerifyFpsMaxResolutionLt(source.sink_wants(), source.last_wants());
-  rtc::VideoSinkWants last_wants = source.sink_wants();
-  EXPECT_TRUE(stats_proxy_->GetStats().cpu_limited_resolution);
-  EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_resolution);
-  EXPECT_EQ(2, stats_proxy_->GetStats().number_of_cpu_adapt_changes);
-  EXPECT_EQ(0, stats_proxy_->GetStats().number_of_quality_adapt_changes);
-
-  // Trigger cpu adapt down, max cpu downgrades reached, expect no change.
-  video_stream_encoder_->TriggerCpuOveruse();
-  source.IncomingCapturedFrame(CreateFrame(4, kWidth, kHeight));
-  WaitForEncodedFrame(4);
-  VerifyFpsEqResolutionEq(source.sink_wants(), last_wants);
-  EXPECT_TRUE(stats_proxy_->GetStats().cpu_limited_resolution);
-  EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_resolution);
-  EXPECT_EQ(2, stats_proxy_->GetStats().number_of_cpu_adapt_changes);
-  EXPECT_EQ(0, stats_proxy_->GetStats().number_of_quality_adapt_changes);
-
-  // Trigger quality adapt down, expect scaled down resolution (480x270).
-  video_stream_encoder_->TriggerQualityLow();
-  source.IncomingCapturedFrame(CreateFrame(5, kWidth, kHeight));
-  WaitForEncodedFrame(5);
-  VerifyFpsMaxResolutionLt(source.sink_wants(), source.last_wants());
-  EXPECT_TRUE(stats_proxy_->GetStats().cpu_limited_resolution);
-  EXPECT_TRUE(stats_proxy_->GetStats().bw_limited_resolution);
-  EXPECT_EQ(2, stats_proxy_->GetStats().number_of_cpu_adapt_changes);
-  EXPECT_EQ(1, stats_proxy_->GetStats().number_of_quality_adapt_changes);
-
-  // Trigger cpu adapt up, expect upscaled resolution (640x360).
-  video_stream_encoder_->TriggerCpuNormalUsage();
-  source.IncomingCapturedFrame(CreateFrame(6, kWidth, kHeight));
-  WaitForEncodedFrame(6);
-  VerifyFpsMaxResolutionGt(source.sink_wants(), source.last_wants());
-  EXPECT_TRUE(stats_proxy_->GetStats().cpu_limited_resolution);
-  EXPECT_TRUE(stats_proxy_->GetStats().bw_limited_resolution);
-  EXPECT_EQ(3, stats_proxy_->GetStats().number_of_cpu_adapt_changes);
-  EXPECT_EQ(1, stats_proxy_->GetStats().number_of_quality_adapt_changes);
-
-  // Trigger cpu adapt up, expect upscaled resolution (960x540).
-  video_stream_encoder_->TriggerCpuNormalUsage();
-  source.IncomingCapturedFrame(CreateFrame(7, kWidth, kHeight));
-  WaitForEncodedFrame(7);
-  VerifyFpsMaxResolutionGt(source.sink_wants(), source.last_wants());
-  last_wants = source.sink_wants();
-  EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_resolution);
-  EXPECT_TRUE(stats_proxy_->GetStats().bw_limited_resolution);
-  EXPECT_EQ(4, stats_proxy_->GetStats().number_of_cpu_adapt_changes);
-  EXPECT_EQ(1, stats_proxy_->GetStats().number_of_quality_adapt_changes);
-
-  // Trigger cpu adapt up, no cpu downgrades, expect no change (960x540).
-  video_stream_encoder_->TriggerCpuNormalUsage();
-  source.IncomingCapturedFrame(CreateFrame(8, kWidth, kHeight));
-  WaitForEncodedFrame(8);
-  VerifyFpsEqResolutionEq(source.sink_wants(), last_wants);
-  EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_resolution);
-  EXPECT_TRUE(stats_proxy_->GetStats().bw_limited_resolution);
-  EXPECT_EQ(4, stats_proxy_->GetStats().number_of_cpu_adapt_changes);
-  EXPECT_EQ(1, stats_proxy_->GetStats().number_of_quality_adapt_changes);
-
-  // Trigger quality adapt up, expect no restriction (1280x720).
-  video_stream_encoder_->TriggerQualityHigh();
-  source.IncomingCapturedFrame(CreateFrame(9, kWidth, kHeight));
-  WaitForEncodedFrame(kWidth, kHeight);
-  VerifyFpsMaxResolutionGt(source.sink_wants(), source.last_wants());
-  VerifyNoLimitation(source.sink_wants());
-  EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_resolution);
-  EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_resolution);
-  EXPECT_EQ(4, stats_proxy_->GetStats().number_of_cpu_adapt_changes);
-  EXPECT_EQ(2, stats_proxy_->GetStats().number_of_quality_adapt_changes);
-
-  video_stream_encoder_->Stop();
-}
-
-TEST_F(VideoStreamEncoderTest, CpuLimitedHistogramIsReported) {
-  const int kWidth = 640;
-  const int kHeight = 360;
-
-  video_stream_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0);
-
-  for (int i = 1; i <= SendStatisticsProxy::kMinRequiredMetricsSamples; ++i) {
-    video_source_.IncomingCapturedFrame(CreateFrame(i, kWidth, kHeight));
-    WaitForEncodedFrame(i);
-  }
-
-  video_stream_encoder_->TriggerCpuOveruse();
-  for (int i = 1; i <= SendStatisticsProxy::kMinRequiredMetricsSamples; ++i) {
-    video_source_.IncomingCapturedFrame(CreateFrame(
-        SendStatisticsProxy::kMinRequiredMetricsSamples + i, kWidth, kHeight));
-    WaitForEncodedFrame(SendStatisticsProxy::kMinRequiredMetricsSamples + i);
-  }
-
-  video_stream_encoder_->Stop();
-  video_stream_encoder_.reset();
-  stats_proxy_.reset();
-
-  EXPECT_EQ(1,
-            metrics::NumSamples("WebRTC.Video.CpuLimitedResolutionInPercent"));
-  EXPECT_EQ(
-      1, metrics::NumEvents("WebRTC.Video.CpuLimitedResolutionInPercent", 50));
-}
-
-TEST_F(VideoStreamEncoderTest,
-       CpuLimitedHistogramIsNotReportedForDisabledDegradation) {
-  video_stream_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0);
-  const int kWidth = 640;
-  const int kHeight = 360;
-
-  video_stream_encoder_->SetSource(
-      &video_source_,
-      VideoSendStream::DegradationPreference::kDegradationDisabled);
-
-  for (int i = 1; i <= SendStatisticsProxy::kMinRequiredMetricsSamples; ++i) {
-    video_source_.IncomingCapturedFrame(CreateFrame(i, kWidth, kHeight));
-    WaitForEncodedFrame(i);
-  }
-
-  video_stream_encoder_->Stop();
-  video_stream_encoder_.reset();
-  stats_proxy_.reset();
-
-  EXPECT_EQ(0,
-            metrics::NumSamples("WebRTC.Video.CpuLimitedResolutionInPercent"));
-}
-
-TEST_F(VideoStreamEncoderTest, CallsBitrateObserver) {
-  MockBitrateObserver bitrate_observer;
-  video_stream_encoder_->SetBitrateObserver(&bitrate_observer);
-
-  const int kDefaultFps = 30;
-  const BitrateAllocation expected_bitrate =
-      DefaultVideoBitrateAllocator(fake_encoder_.codec_config())
-          .GetAllocation(kLowTargetBitrateBps, kDefaultFps);
-
-  // First called on bitrate updated, then again on first frame.
-  EXPECT_CALL(bitrate_observer, OnBitrateAllocationUpdated(expected_bitrate))
-      .Times(2);
-  video_stream_encoder_->OnBitrateUpdated(kLowTargetBitrateBps, 0, 0);
-
-  const int64_t kStartTimeMs = 1;
-  video_source_.IncomingCapturedFrame(
-      CreateFrame(kStartTimeMs, codec_width_, codec_height_));
-  WaitForEncodedFrame(kStartTimeMs);
-
-  // Not called on second frame.
-  EXPECT_CALL(bitrate_observer, OnBitrateAllocationUpdated(expected_bitrate))
-      .Times(0);
-  video_source_.IncomingCapturedFrame(
-      CreateFrame(kStartTimeMs + 1, codec_width_, codec_height_));
-  WaitForEncodedFrame(kStartTimeMs + 1);
-
-  // Called after a process interval.
-  const int64_t kProcessIntervalMs =
-      vcm::VCMProcessTimer::kDefaultProcessIntervalMs;
-  fake_clock_.AdvanceTimeMicros(rtc::kNumMicrosecsPerMillisec *
-                                (kProcessIntervalMs + (1000 / kDefaultFps)));
-  EXPECT_CALL(bitrate_observer, OnBitrateAllocationUpdated(expected_bitrate))
-      .Times(1);
-  video_source_.IncomingCapturedFrame(CreateFrame(
-      kStartTimeMs + kProcessIntervalMs, codec_width_, codec_height_));
-  WaitForEncodedFrame(kStartTimeMs + kProcessIntervalMs);
-
-  video_stream_encoder_->Stop();
-}
-
-TEST_F(VideoStreamEncoderTest, OveruseDetectorUpdatedOnReconfigureAndAdaption) {
-  const int kFrameWidth = 1280;
-  const int kFrameHeight = 720;
-  const int kFramerate = 24;
-
-  video_stream_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0);
-  test::FrameForwarder source;
-  video_stream_encoder_->SetSource(
-      &source, VideoSendStream::DegradationPreference::kMaintainResolution);
-
-  // Insert a single frame, triggering initial configuration.
-  source.IncomingCapturedFrame(CreateFrame(1, kFrameWidth, kFrameHeight));
-  video_stream_encoder_->WaitUntilTaskQueueIsIdle();
-
-  EXPECT_EQ(
-      video_stream_encoder_->overuse_detector_proxy_->GetLastTargetFramerate(),
-      kDefaultFramerate);
-
-  // Trigger reconfigure encoder (without resetting the entire instance).
-  VideoEncoderConfig video_encoder_config;
-  video_encoder_config.max_bitrate_bps = kTargetBitrateBps;
-  video_encoder_config.number_of_streams = 1;
-  video_encoder_config.video_stream_factory =
-      new rtc::RefCountedObject<VideoStreamFactory>(1, kFramerate);
-  video_stream_encoder_->ConfigureEncoder(std::move(video_encoder_config),
-                                          kMaxPayloadLength, false);
-  video_stream_encoder_->WaitUntilTaskQueueIsIdle();
-
-  // Detector should be updated with fps limit from codec config.
-  EXPECT_EQ(
-      video_stream_encoder_->overuse_detector_proxy_->GetLastTargetFramerate(),
-      kFramerate);
-
-  // Trigger overuse, max framerate should be reduced.
-  VideoSendStream::Stats stats = stats_proxy_->GetStats();
-  stats.input_frame_rate = kFramerate;
-  stats_proxy_->SetMockStats(stats);
-  video_stream_encoder_->TriggerCpuOveruse();
-  video_stream_encoder_->WaitUntilTaskQueueIsIdle();
-  int adapted_framerate =
-      video_stream_encoder_->overuse_detector_proxy_->GetLastTargetFramerate();
-  EXPECT_LT(adapted_framerate, kFramerate);
-
-  // Trigger underuse, max framerate should go back to codec configured fps.
-  // Set extra low fps, to make sure it's actually reset, not just incremented.
-  stats = stats_proxy_->GetStats();
-  stats.input_frame_rate = adapted_framerate / 2;
-  stats_proxy_->SetMockStats(stats);
-  video_stream_encoder_->TriggerCpuNormalUsage();
-  video_stream_encoder_->WaitUntilTaskQueueIsIdle();
-  EXPECT_EQ(
-      video_stream_encoder_->overuse_detector_proxy_->GetLastTargetFramerate(),
-      kFramerate);
-
-  video_stream_encoder_->Stop();
-}
-
-TEST_F(VideoStreamEncoderTest,
-       OveruseDetectorUpdatedRespectsFramerateAfterUnderuse) {
-  const int kFrameWidth = 1280;
-  const int kFrameHeight = 720;
-  const int kLowFramerate = 15;
-  const int kHighFramerate = 25;
-
-  video_stream_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0);
-  test::FrameForwarder source;
-  video_stream_encoder_->SetSource(
-      &source, VideoSendStream::DegradationPreference::kMaintainResolution);
-
-  // Trigger initial configuration.
-  VideoEncoderConfig video_encoder_config;
-  video_encoder_config.max_bitrate_bps = kTargetBitrateBps;
-  video_encoder_config.number_of_streams = 1;
-  video_encoder_config.video_stream_factory =
-      new rtc::RefCountedObject<VideoStreamFactory>(1, kLowFramerate);
-  source.IncomingCapturedFrame(CreateFrame(1, kFrameWidth, kFrameHeight));
-  video_stream_encoder_->ConfigureEncoder(std::move(video_encoder_config),
-                                          kMaxPayloadLength, false);
-  video_stream_encoder_->WaitUntilTaskQueueIsIdle();
-
-  EXPECT_EQ(
-      video_stream_encoder_->overuse_detector_proxy_->GetLastTargetFramerate(),
-      kLowFramerate);
-
-  // Trigger overuse, max framerate should be reduced.
-  VideoSendStream::Stats stats = stats_proxy_->GetStats();
-  stats.input_frame_rate = kLowFramerate;
-  stats_proxy_->SetMockStats(stats);
-  video_stream_encoder_->TriggerCpuOveruse();
-  video_stream_encoder_->WaitUntilTaskQueueIsIdle();
-  int adapted_framerate =
-      video_stream_encoder_->overuse_detector_proxy_->GetLastTargetFramerate();
-  EXPECT_LT(adapted_framerate, kLowFramerate);
-
-  // Reconfigure the encoder with a new (higher max framerate), max fps should
-  // still respect the adaptation.
-  video_encoder_config.video_stream_factory =
-      new rtc::RefCountedObject<VideoStreamFactory>(1, kHighFramerate);
-  source.IncomingCapturedFrame(CreateFrame(1, kFrameWidth, kFrameHeight));
-  video_stream_encoder_->ConfigureEncoder(std::move(video_encoder_config),
-                                          kMaxPayloadLength, false);
-  video_stream_encoder_->WaitUntilTaskQueueIsIdle();
-
-  EXPECT_EQ(
-      video_stream_encoder_->overuse_detector_proxy_->GetLastTargetFramerate(),
-      adapted_framerate);
-
-  // Trigger underuse, max framerate should go back to codec configured fps.
-  stats = stats_proxy_->GetStats();
-  stats.input_frame_rate = adapted_framerate;
-  stats_proxy_->SetMockStats(stats);
-  video_stream_encoder_->TriggerCpuNormalUsage();
-  video_stream_encoder_->WaitUntilTaskQueueIsIdle();
-  EXPECT_EQ(
-      video_stream_encoder_->overuse_detector_proxy_->GetLastTargetFramerate(),
-      kHighFramerate);
-
-  video_stream_encoder_->Stop();
-}
-
-TEST_F(VideoStreamEncoderTest,
-       OveruseDetectorUpdatedOnDegradationPreferenceChange) {
-  const int kFrameWidth = 1280;
-  const int kFrameHeight = 720;
-  const int kFramerate = 24;
-
-  video_stream_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0);
-  test::FrameForwarder source;
-  video_stream_encoder_->SetSource(
-      &source, VideoSendStream::DegradationPreference::kMaintainResolution);
-
-  // Trigger initial configuration.
-  VideoEncoderConfig video_encoder_config;
-  video_encoder_config.max_bitrate_bps = kTargetBitrateBps;
-  video_encoder_config.number_of_streams = 1;
-  video_encoder_config.video_stream_factory =
-      new rtc::RefCountedObject<VideoStreamFactory>(1, kFramerate);
-  source.IncomingCapturedFrame(CreateFrame(1, kFrameWidth, kFrameHeight));
-  video_stream_encoder_->ConfigureEncoder(std::move(video_encoder_config),
-                                          kMaxPayloadLength, false);
-  video_stream_encoder_->WaitUntilTaskQueueIsIdle();
-
-  EXPECT_EQ(
-      video_stream_encoder_->overuse_detector_proxy_->GetLastTargetFramerate(),
-      kFramerate);
-
-  // Trigger overuse, max framerate should be reduced.
-  VideoSendStream::Stats stats = stats_proxy_->GetStats();
-  stats.input_frame_rate = kFramerate;
-  stats_proxy_->SetMockStats(stats);
-  video_stream_encoder_->TriggerCpuOveruse();
-  video_stream_encoder_->WaitUntilTaskQueueIsIdle();
-  int adapted_framerate =
-      video_stream_encoder_->overuse_detector_proxy_->GetLastTargetFramerate();
-  EXPECT_LT(adapted_framerate, kFramerate);
-
-  // Change degradation preference to not enable framerate scaling. Target
-  // framerate should be changed to codec defined limit.
-  video_stream_encoder_->SetSource(
-      &source, VideoSendStream::DegradationPreference::kMaintainFramerate);
-  video_stream_encoder_->WaitUntilTaskQueueIsIdle();
-  EXPECT_EQ(
-      video_stream_encoder_->overuse_detector_proxy_->GetLastTargetFramerate(),
-      kFramerate);
-
-  video_stream_encoder_->Stop();
-}
-
-TEST_F(VideoStreamEncoderTest, DropsFramesAndScalesWhenBitrateIsTooLow) {
-  const int kTooLowBitrateForFrameSizeBps = 10000;
-  video_stream_encoder_->OnBitrateUpdated(kTooLowBitrateForFrameSizeBps, 0, 0);
-  const int kWidth = 640;
-  const int kHeight = 360;
-
-  video_source_.IncomingCapturedFrame(CreateFrame(1, kWidth, kHeight));
-
-  // Expect to drop this frame, the wait should time out.
-  ExpectDroppedFrame();
-
-  // Expect the sink_wants to specify a scaled frame.
-  EXPECT_LT(video_source_.sink_wants().max_pixel_count, kWidth * kHeight);
-
-  int last_pixel_count = video_source_.sink_wants().max_pixel_count;
-
-  // Next frame is scaled.
-  video_source_.IncomingCapturedFrame(
-      CreateFrame(2, kWidth * 3 / 4, kHeight * 3 / 4));
-
-  // Expect to drop this frame, the wait should time out.
-  ExpectDroppedFrame();
-
-  EXPECT_LT(video_source_.sink_wants().max_pixel_count, last_pixel_count);
-
-  video_stream_encoder_->Stop();
-}
-
-TEST_F(VideoStreamEncoderTest,
-       NumberOfDroppedFramesLimitedWhenBitrateIsTooLow) {
-  const int kTooLowBitrateForFrameSizeBps = 10000;
-  video_stream_encoder_->OnBitrateUpdated(kTooLowBitrateForFrameSizeBps, 0, 0);
-  const int kWidth = 640;
-  const int kHeight = 360;
-
-  // We expect the n initial frames to get dropped.
-  int i;
-  for (i = 1; i <= kMaxInitialFramedrop; ++i) {
-    video_source_.IncomingCapturedFrame(CreateFrame(i, kWidth, kHeight));
-    ExpectDroppedFrame();
-  }
-  // The n+1th frame should not be dropped, even though it's size is too large.
-  video_source_.IncomingCapturedFrame(CreateFrame(i, kWidth, kHeight));
-  WaitForEncodedFrame(i);
-
-  // Expect the sink_wants to specify a scaled frame.
-  EXPECT_LT(video_source_.sink_wants().max_pixel_count, kWidth * kHeight);
-
-  video_stream_encoder_->Stop();
-}
-
-TEST_F(VideoStreamEncoderTest,
-       InitialFrameDropOffWithMaintainResolutionPreference) {
-  const int kWidth = 640;
-  const int kHeight = 360;
-  video_stream_encoder_->OnBitrateUpdated(kLowTargetBitrateBps, 0, 0);
-
-  // Set degradation preference.
-  video_stream_encoder_->SetSource(
-      &video_source_,
-      VideoSendStream::DegradationPreference::kMaintainResolution);
-
-  video_source_.IncomingCapturedFrame(CreateFrame(1, kWidth, kHeight));
-  // Frame should not be dropped, even if it's too large.
-  WaitForEncodedFrame(1);
-
-  video_stream_encoder_->Stop();
-}
-
-TEST_F(VideoStreamEncoderTest, InitialFrameDropOffWhenEncoderDisabledScaling) {
-  const int kWidth = 640;
-  const int kHeight = 360;
-  fake_encoder_.SetQualityScaling(false);
-  video_stream_encoder_->OnBitrateUpdated(kLowTargetBitrateBps, 0, 0);
-
-  // Force quality scaler reconfiguration by resetting the source.
-  video_stream_encoder_->SetSource(
-      &video_source_,
-      VideoSendStream::DegradationPreference::kBalanced);
-
-  video_source_.IncomingCapturedFrame(CreateFrame(1, kWidth, kHeight));
-  // Frame should not be dropped, even if it's too large.
-  WaitForEncodedFrame(1);
-
-  video_stream_encoder_->Stop();
-  fake_encoder_.SetQualityScaling(true);
-}
-
-TEST_F(VideoStreamEncoderTest,
-       ResolutionNotAdaptedForTooSmallFrame_MaintainFramerateMode) {
-  const int kTooSmallWidth = 10;
-  const int kTooSmallHeight = 10;
-  video_stream_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0);
-
-  // Enable kMaintainFramerate preference, no initial limitation.
-  test::FrameForwarder source;
-  video_stream_encoder_->SetSource(
-      &source, VideoSendStream::DegradationPreference::kMaintainFramerate);
-  VerifyNoLimitation(source.sink_wants());
-  EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_resolution);
-
-  // Trigger adapt down, too small frame, expect no change.
-  source.IncomingCapturedFrame(CreateFrame(1, kTooSmallWidth, kTooSmallHeight));
-  WaitForEncodedFrame(1);
-  video_stream_encoder_->TriggerCpuOveruse();
-  VerifyNoLimitation(source.sink_wants());
-  EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_resolution);
-  EXPECT_EQ(0, stats_proxy_->GetStats().number_of_cpu_adapt_changes);
-
-  video_stream_encoder_->Stop();
-}
-
-TEST_F(VideoStreamEncoderTest,
-       ResolutionNotAdaptedForTooSmallFrame_BalancedMode) {
-  const int kTooSmallWidth = 10;
-  const int kTooSmallHeight = 10;
-  const int kFpsLimit = 7;
-  video_stream_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0);
-
-  // Enable kBalanced preference, no initial limitation.
-  test::FrameForwarder source;
-  video_stream_encoder_->SetSource(
-      &source,
-      VideoSendStream::DegradationPreference::kBalanced);
-  VerifyNoLimitation(source.sink_wants());
-  EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_resolution);
-  EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_framerate);
-
-  // Trigger adapt down, expect limited framerate.
-  source.IncomingCapturedFrame(CreateFrame(1, kTooSmallWidth, kTooSmallHeight));
-  WaitForEncodedFrame(1);
-  video_stream_encoder_->TriggerQualityLow();
-  VerifyFpsEqResolutionMax(source.sink_wants(), kFpsLimit);
-  EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_resolution);
-  EXPECT_TRUE(stats_proxy_->GetStats().bw_limited_framerate);
-  EXPECT_EQ(1, stats_proxy_->GetStats().number_of_quality_adapt_changes);
-
-  // Trigger adapt down, too small frame, expect no change.
-  source.IncomingCapturedFrame(CreateFrame(2, kTooSmallWidth, kTooSmallHeight));
-  WaitForEncodedFrame(2);
-  video_stream_encoder_->TriggerQualityLow();
-  VerifyFpsEqResolutionMax(source.sink_wants(), kFpsLimit);
-  EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_resolution);
-  EXPECT_TRUE(stats_proxy_->GetStats().bw_limited_framerate);
-  EXPECT_EQ(1, stats_proxy_->GetStats().number_of_quality_adapt_changes);
-
-  video_stream_encoder_->Stop();
-}
-
-TEST_F(VideoStreamEncoderTest, FailingInitEncodeDoesntCauseCrash) {
-  fake_encoder_.ForceInitEncodeFailure(true);
-  video_stream_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0);
-  ResetEncoder("VP8", 2, 1, 1, true, false);
-  const int kFrameWidth = 1280;
-  const int kFrameHeight = 720;
-  video_source_.IncomingCapturedFrame(
-      CreateFrame(1, kFrameWidth, kFrameHeight));
-  ExpectDroppedFrame();
-  video_stream_encoder_->Stop();
-}
-
-// TODO(sprang): Extend this with fps throttling and any "balanced" extensions.
-TEST_F(VideoStreamEncoderTest,
-       AdaptsResolutionOnOveruse_MaintainFramerateMode) {
-  video_stream_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0);
-
-  const int kFrameWidth = 1280;
-  const int kFrameHeight = 720;
-  // Enabled default VideoAdapter downscaling. First step is 3/4, not 3/5 as
-  // requested by
-  // VideoStreamEncoder::VideoSourceProxy::RequestResolutionLowerThan().
-  video_source_.set_adaptation_enabled(true);
-
-  video_source_.IncomingCapturedFrame(
-      CreateFrame(1, kFrameWidth, kFrameHeight));
-  WaitForEncodedFrame(kFrameWidth, kFrameHeight);
-
-  // Trigger CPU overuse, downscale by 3/4.
-  video_stream_encoder_->TriggerCpuOveruse();
-  video_source_.IncomingCapturedFrame(
-      CreateFrame(2, kFrameWidth, kFrameHeight));
-  WaitForEncodedFrame((kFrameWidth * 3) / 4, (kFrameHeight * 3) / 4);
-
-  // Trigger CPU normal use, return to original resolution.
-  video_stream_encoder_->TriggerCpuNormalUsage();
-  video_source_.IncomingCapturedFrame(
-      CreateFrame(3, kFrameWidth, kFrameHeight));
-  WaitForEncodedFrame(kFrameWidth, kFrameHeight);
-
-  video_stream_encoder_->Stop();
-}
-
-TEST_F(VideoStreamEncoderTest,
-       AdaptsFramerateOnOveruse_MaintainResolutionMode) {
-  const int kFrameWidth = 1280;
-  const int kFrameHeight = 720;
-  int kFrameIntervalMs = rtc::kNumMillisecsPerSec / max_framerate_;
-
-  video_stream_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0);
-  video_stream_encoder_->SetSource(
-      &video_source_,
-      VideoSendStream::DegradationPreference::kMaintainResolution);
-  video_source_.set_adaptation_enabled(true);
-
-  int64_t timestamp_ms = fake_clock_.TimeNanos() / rtc::kNumNanosecsPerMillisec;
-
-  video_source_.IncomingCapturedFrame(
-      CreateFrame(timestamp_ms, kFrameWidth, kFrameHeight));
-  WaitForEncodedFrame(timestamp_ms);
-
-  // Try to trigger overuse. No fps estimate available => no effect.
-  video_stream_encoder_->TriggerCpuOveruse();
-
-  // Insert frames for one second to get a stable estimate.
-  for (int i = 0; i < max_framerate_; ++i) {
-    timestamp_ms += kFrameIntervalMs;
-    video_source_.IncomingCapturedFrame(
-        CreateFrame(timestamp_ms, kFrameWidth, kFrameHeight));
-    WaitForEncodedFrame(timestamp_ms);
-  }
-
-  // Trigger CPU overuse, reduce framerate by 2/3.
-  video_stream_encoder_->TriggerCpuOveruse();
-  int num_frames_dropped = 0;
-  for (int i = 0; i < max_framerate_; ++i) {
-    timestamp_ms += kFrameIntervalMs;
-    video_source_.IncomingCapturedFrame(
-        CreateFrame(timestamp_ms, kFrameWidth, kFrameHeight));
-    if (!WaitForFrame(kFrameTimeoutMs)) {
-      ++num_frames_dropped;
-    } else {
-      sink_.CheckLastFrameSizeMathces(kFrameWidth, kFrameHeight);
-    }
-  }
-
-  // Add some slack to account for frames dropped by the frame dropper.
-  const int kErrorMargin = 1;
-  EXPECT_NEAR(num_frames_dropped, max_framerate_ - (max_framerate_ * 2 / 3),
-              kErrorMargin);
-
-  // Trigger CPU overuse, reduce framerate by 2/3 again.
-  video_stream_encoder_->TriggerCpuOveruse();
-  num_frames_dropped = 0;
-  for (int i = 0; i < max_framerate_; ++i) {
-    timestamp_ms += kFrameIntervalMs;
-    video_source_.IncomingCapturedFrame(
-        CreateFrame(timestamp_ms, kFrameWidth, kFrameHeight));
-    if (!WaitForFrame(kFrameTimeoutMs)) {
-      ++num_frames_dropped;
-    } else {
-      sink_.CheckLastFrameSizeMathces(kFrameWidth, kFrameHeight);
-    }
-  }
-  EXPECT_NEAR(num_frames_dropped, max_framerate_ - (max_framerate_ * 4 / 9),
-              kErrorMargin);
-
-  // Go back up one step.
-  video_stream_encoder_->TriggerCpuNormalUsage();
-  num_frames_dropped = 0;
-  for (int i = 0; i < max_framerate_; ++i) {
-    timestamp_ms += kFrameIntervalMs;
-    video_source_.IncomingCapturedFrame(
-        CreateFrame(timestamp_ms, kFrameWidth, kFrameHeight));
-    if (!WaitForFrame(kFrameTimeoutMs)) {
-      ++num_frames_dropped;
-    } else {
-      sink_.CheckLastFrameSizeMathces(kFrameWidth, kFrameHeight);
-    }
-  }
-  EXPECT_NEAR(num_frames_dropped, max_framerate_ - (max_framerate_ * 2 / 3),
-              kErrorMargin);
-
-  // Go back up to original mode.
-  video_stream_encoder_->TriggerCpuNormalUsage();
-  num_frames_dropped = 0;
-  for (int i = 0; i < max_framerate_; ++i) {
-    timestamp_ms += kFrameIntervalMs;
-    video_source_.IncomingCapturedFrame(
-        CreateFrame(timestamp_ms, kFrameWidth, kFrameHeight));
-    if (!WaitForFrame(kFrameTimeoutMs)) {
-      ++num_frames_dropped;
-    } else {
-      sink_.CheckLastFrameSizeMathces(kFrameWidth, kFrameHeight);
-    }
-  }
-  EXPECT_NEAR(num_frames_dropped, 0, kErrorMargin);
-
-  video_stream_encoder_->Stop();
-}
-
-TEST_F(VideoStreamEncoderTest, DoesntAdaptDownPastMinFramerate) {
-  const int kFramerateFps = 5;
-  const int kFrameIntervalMs = rtc::kNumMillisecsPerSec / kFramerateFps;
-  const int kMinFpsFrameInterval = rtc::kNumMillisecsPerSec / kMinFramerateFps;
-  const int kFrameWidth = 1280;
-  const int kFrameHeight = 720;
-
-  // Reconfigure encoder with two temporal layers and screensharing, which will
-  // disable frame dropping and make testing easier.
-  ResetEncoder("VP8", 1, 2, 1, true, true);
-
-  video_stream_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0);
-  video_stream_encoder_->SetSource(
-      &video_source_,
-      VideoSendStream::DegradationPreference::kMaintainResolution);
-  video_source_.set_adaptation_enabled(true);
-
-  int64_t timestamp_ms = fake_clock_.TimeNanos() / rtc::kNumNanosecsPerMillisec;
-
-  // Trigger overuse as much as we can.
-  for (int i = 0; i < VideoStreamEncoder::kMaxCpuResolutionDowngrades; ++i) {
-    // Insert frames to get a new fps estimate...
-    for (int j = 0; j < kFramerateFps; ++j) {
-      video_source_.IncomingCapturedFrame(
-          CreateFrame(timestamp_ms, kFrameWidth, kFrameHeight));
-      timestamp_ms += kFrameIntervalMs;
-    }
-    // ...and then try to adapt again.
-    video_stream_encoder_->TriggerCpuOveruse();
-  }
-
-  // Drain any frame in the pipeline.
-  WaitForFrame(kDefaultTimeoutMs);
-
-  // Insert frames at min fps, all should go through.
-  for (int i = 0; i < 10; ++i) {
-    timestamp_ms += kMinFpsFrameInterval;
-    video_source_.IncomingCapturedFrame(
-        CreateFrame(timestamp_ms, kFrameWidth, kFrameHeight));
-    WaitForEncodedFrame(timestamp_ms);
-  }
-
-  video_stream_encoder_->Stop();
-}
-
-TEST_F(VideoStreamEncoderTest,
-       AdaptsResolutionAndFramerateForLowQuality_BalancedMode) {
-  const int kWidth = 1280;
-  const int kHeight = 720;
-  const int64_t kFrameIntervalMs = 150;
-  int64_t timestamp_ms = kFrameIntervalMs;
-  video_stream_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0);
-
-  // Enable kBalanced preference, no initial limitation.
-  AdaptingFrameForwarder source;
-  source.set_adaptation_enabled(true);
-  video_stream_encoder_->SetSource(
-      &source,
-      VideoSendStream::DegradationPreference::kBalanced);
-  timestamp_ms += kFrameIntervalMs;
-  source.IncomingCapturedFrame(CreateFrame(timestamp_ms, kWidth, kHeight));
-  WaitForEncodedFrame(kWidth, kHeight);
-  VerifyNoLimitation(source.sink_wants());
-  EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_resolution);
-  EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_framerate);
-  EXPECT_EQ(0, stats_proxy_->GetStats().number_of_quality_adapt_changes);
-
-  // Trigger adapt down, expect scaled down resolution (960x540@30fps).
-  video_stream_encoder_->TriggerQualityLow();
-  timestamp_ms += kFrameIntervalMs;
-  source.IncomingCapturedFrame(CreateFrame(timestamp_ms, kWidth, kHeight));
-  WaitForEncodedFrame(timestamp_ms);
-  VerifyFpsMaxResolutionLt(source.sink_wants(), kWidth * kHeight);
-  EXPECT_TRUE(stats_proxy_->GetStats().bw_limited_resolution);
-  EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_framerate);
-  EXPECT_EQ(1, stats_proxy_->GetStats().number_of_quality_adapt_changes);
-
-  // Trigger adapt down, expect scaled down resolution (640x360@30fps).
-  video_stream_encoder_->TriggerQualityLow();
-  timestamp_ms += kFrameIntervalMs;
-  source.IncomingCapturedFrame(CreateFrame(timestamp_ms, kWidth, kHeight));
-  WaitForEncodedFrame(timestamp_ms);
-  VerifyFpsMaxResolutionLt(source.sink_wants(), source.last_wants());
-  EXPECT_TRUE(stats_proxy_->GetStats().bw_limited_resolution);
-  EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_framerate);
-  EXPECT_EQ(2, stats_proxy_->GetStats().number_of_quality_adapt_changes);
-
-  // Trigger adapt down, expect reduced fps (640x360@15fps).
-  video_stream_encoder_->TriggerQualityLow();
-  timestamp_ms += kFrameIntervalMs;
-  source.IncomingCapturedFrame(CreateFrame(timestamp_ms, kWidth, kHeight));
-  WaitForEncodedFrame(timestamp_ms);
-  VerifyFpsLtResolutionEq(source.sink_wants(), source.last_wants());
-  EXPECT_TRUE(stats_proxy_->GetStats().bw_limited_resolution);
-  EXPECT_TRUE(stats_proxy_->GetStats().bw_limited_framerate);
-  EXPECT_EQ(3, stats_proxy_->GetStats().number_of_quality_adapt_changes);
-
-  // Trigger adapt down, expect scaled down resolution (480x270@15fps).
-  video_stream_encoder_->TriggerQualityLow();
-  timestamp_ms += kFrameIntervalMs;
-  source.IncomingCapturedFrame(CreateFrame(timestamp_ms, kWidth, kHeight));
-  WaitForEncodedFrame(timestamp_ms);
-  VerifyFpsEqResolutionLt(source.sink_wants(), source.last_wants());
-  EXPECT_TRUE(stats_proxy_->GetStats().bw_limited_resolution);
-  EXPECT_TRUE(stats_proxy_->GetStats().bw_limited_framerate);
-  EXPECT_EQ(4, stats_proxy_->GetStats().number_of_quality_adapt_changes);
-
-  // Restrict bitrate, trigger adapt down, expect reduced fps (480x270@10fps).
-  video_stream_encoder_->TriggerQualityLow();
-  timestamp_ms += kFrameIntervalMs;
-  source.IncomingCapturedFrame(CreateFrame(timestamp_ms, kWidth, kHeight));
-  WaitForEncodedFrame(timestamp_ms);
-  VerifyFpsLtResolutionEq(source.sink_wants(), source.last_wants());
-  EXPECT_TRUE(stats_proxy_->GetStats().bw_limited_resolution);
-  EXPECT_TRUE(stats_proxy_->GetStats().bw_limited_framerate);
-  EXPECT_EQ(5, stats_proxy_->GetStats().number_of_quality_adapt_changes);
-
-  // Trigger adapt down, expect scaled down resolution (320x180@10fps).
-  video_stream_encoder_->TriggerQualityLow();
-  timestamp_ms += kFrameIntervalMs;
-  source.IncomingCapturedFrame(CreateFrame(timestamp_ms, kWidth, kHeight));
-  WaitForEncodedFrame(timestamp_ms);
-  VerifyFpsEqResolutionLt(source.sink_wants(), source.last_wants());
-  EXPECT_TRUE(stats_proxy_->GetStats().bw_limited_resolution);
-  EXPECT_TRUE(stats_proxy_->GetStats().bw_limited_framerate);
-  EXPECT_EQ(6, stats_proxy_->GetStats().number_of_quality_adapt_changes);
-
-  // Trigger adapt down, expect reduced fps (320x180@7fps).
-  video_stream_encoder_->TriggerQualityLow();
-  timestamp_ms += kFrameIntervalMs;
-  source.IncomingCapturedFrame(CreateFrame(timestamp_ms, kWidth, kHeight));
-  WaitForEncodedFrame(timestamp_ms);
-  VerifyFpsLtResolutionEq(source.sink_wants(), source.last_wants());
-  rtc::VideoSinkWants last_wants = source.sink_wants();
-  EXPECT_TRUE(stats_proxy_->GetStats().bw_limited_resolution);
-  EXPECT_TRUE(stats_proxy_->GetStats().bw_limited_framerate);
-  EXPECT_EQ(7, stats_proxy_->GetStats().number_of_quality_adapt_changes);
-
-  // Trigger adapt down, min resolution reached, expect no change.
-  video_stream_encoder_->TriggerQualityLow();
-  timestamp_ms += kFrameIntervalMs;
-  source.IncomingCapturedFrame(CreateFrame(timestamp_ms, kWidth, kHeight));
-  WaitForEncodedFrame(timestamp_ms);
-  VerifyFpsEqResolutionEq(source.sink_wants(), last_wants);
-  EXPECT_TRUE(stats_proxy_->GetStats().bw_limited_resolution);
-  EXPECT_TRUE(stats_proxy_->GetStats().bw_limited_framerate);
-  EXPECT_EQ(7, stats_proxy_->GetStats().number_of_quality_adapt_changes);
-
-  // Trigger adapt down, expect expect increased fps (320x180@10fps).
-  video_stream_encoder_->TriggerQualityHigh();
-  timestamp_ms += kFrameIntervalMs;
-  source.IncomingCapturedFrame(CreateFrame(timestamp_ms, kWidth, kHeight));
-  WaitForEncodedFrame(timestamp_ms);
-  VerifyFpsGtResolutionEq(source.sink_wants(), source.last_wants());
-  EXPECT_TRUE(stats_proxy_->GetStats().bw_limited_resolution);
-  EXPECT_TRUE(stats_proxy_->GetStats().bw_limited_framerate);
-  EXPECT_EQ(8, stats_proxy_->GetStats().number_of_quality_adapt_changes);
-
-  // Trigger adapt up, expect upscaled resolution (480x270@10fps).
-  video_stream_encoder_->TriggerQualityHigh();
-  timestamp_ms += kFrameIntervalMs;
-  source.IncomingCapturedFrame(CreateFrame(timestamp_ms, kWidth, kHeight));
-  WaitForEncodedFrame(timestamp_ms);
-  VerifyFpsEqResolutionGt(source.sink_wants(), source.last_wants());
-  EXPECT_TRUE(stats_proxy_->GetStats().bw_limited_resolution);
-  EXPECT_TRUE(stats_proxy_->GetStats().bw_limited_framerate);
-  EXPECT_EQ(9, stats_proxy_->GetStats().number_of_quality_adapt_changes);
-
-  // Increase bitrate, trigger adapt up, expect increased fps (480x270@15fps).
-  video_stream_encoder_->TriggerQualityHigh();
-  timestamp_ms += kFrameIntervalMs;
-  source.IncomingCapturedFrame(CreateFrame(timestamp_ms, kWidth, kHeight));
-  WaitForEncodedFrame(timestamp_ms);
-  VerifyFpsGtResolutionEq(source.sink_wants(), source.last_wants());
-  EXPECT_TRUE(stats_proxy_->GetStats().bw_limited_resolution);
-  EXPECT_TRUE(stats_proxy_->GetStats().bw_limited_framerate);
-  EXPECT_EQ(10, stats_proxy_->GetStats().number_of_quality_adapt_changes);
-
-  // Trigger adapt up, expect upscaled resolution (640x360@15fps).
-  video_stream_encoder_->TriggerQualityHigh();
-  timestamp_ms += kFrameIntervalMs;
-  source.IncomingCapturedFrame(CreateFrame(timestamp_ms, kWidth, kHeight));
-  WaitForEncodedFrame(timestamp_ms);
-  VerifyFpsEqResolutionGt(source.sink_wants(), source.last_wants());
-  EXPECT_TRUE(stats_proxy_->GetStats().bw_limited_resolution);
-  EXPECT_TRUE(stats_proxy_->GetStats().bw_limited_framerate);
-  EXPECT_EQ(11, stats_proxy_->GetStats().number_of_quality_adapt_changes);
-
-  // Trigger adapt up, expect increased fps (640x360@30fps).
-  video_stream_encoder_->TriggerQualityHigh();
-  timestamp_ms += kFrameIntervalMs;
-  source.IncomingCapturedFrame(CreateFrame(timestamp_ms, kWidth, kHeight));
-  WaitForEncodedFrame(timestamp_ms);
-  VerifyFpsMaxResolutionEq(source.sink_wants(), source.last_wants());
-  EXPECT_TRUE(stats_proxy_->GetStats().bw_limited_resolution);
-  EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_framerate);
-  EXPECT_EQ(12, stats_proxy_->GetStats().number_of_quality_adapt_changes);
-
-  // Trigger adapt up, expect upscaled resolution (960x540@30fps).
-  video_stream_encoder_->TriggerQualityHigh();
-  timestamp_ms += kFrameIntervalMs;
-  source.IncomingCapturedFrame(CreateFrame(timestamp_ms, kWidth, kHeight));
-  WaitForEncodedFrame(timestamp_ms);
-  VerifyFpsMaxResolutionGt(source.sink_wants(), source.last_wants());
-  EXPECT_TRUE(stats_proxy_->GetStats().bw_limited_resolution);
-  EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_framerate);
-  EXPECT_EQ(13, stats_proxy_->GetStats().number_of_quality_adapt_changes);
-
-  // Trigger adapt up,  expect no restriction (1280x720fps@30fps).
-  video_stream_encoder_->TriggerQualityHigh();
-  timestamp_ms += kFrameIntervalMs;
-  source.IncomingCapturedFrame(CreateFrame(timestamp_ms, kWidth, kHeight));
-  WaitForEncodedFrame(kWidth, kHeight);
-  VerifyFpsMaxResolutionGt(source.sink_wants(), source.last_wants());
-  VerifyNoLimitation(source.sink_wants());
-  EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_resolution);
-  EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_framerate);
-  EXPECT_EQ(14, stats_proxy_->GetStats().number_of_quality_adapt_changes);
-
-  // Trigger adapt up, expect no change.
-  video_stream_encoder_->TriggerQualityHigh();
-  VerifyNoLimitation(source.sink_wants());
-  EXPECT_EQ(14, stats_proxy_->GetStats().number_of_quality_adapt_changes);
-
-  video_stream_encoder_->Stop();
-}
-
-TEST_F(VideoStreamEncoderTest, AdaptWithTwoReasonsAndDifferentOrder_Framerate) {
-  const int kWidth = 1280;
-  const int kHeight = 720;
-  const int64_t kFrameIntervalMs = 150;
-  int64_t timestamp_ms = kFrameIntervalMs;
-  video_stream_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0);
-
-  // Enable kBalanced preference, no initial limitation.
-  AdaptingFrameForwarder source;
-  source.set_adaptation_enabled(true);
-  video_stream_encoder_->SetSource(
-      &source,
-      VideoSendStream::DegradationPreference::kBalanced);
-  timestamp_ms += kFrameIntervalMs;
-  source.IncomingCapturedFrame(CreateFrame(timestamp_ms, kWidth, kHeight));
-  WaitForEncodedFrame(kWidth, kHeight);
-  VerifyNoLimitation(source.sink_wants());
-  EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_resolution);
-  EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_framerate);
-  EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_resolution);
-  EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_framerate);
-  EXPECT_EQ(0, stats_proxy_->GetStats().number_of_cpu_adapt_changes);
-  EXPECT_EQ(0, stats_proxy_->GetStats().number_of_quality_adapt_changes);
-
-  // Trigger cpu adapt down, expect scaled down resolution (960x540@30fps).
-  video_stream_encoder_->TriggerCpuOveruse();
-  timestamp_ms += kFrameIntervalMs;
-  source.IncomingCapturedFrame(CreateFrame(timestamp_ms, kWidth, kHeight));
-  WaitForEncodedFrame(timestamp_ms);
-  VerifyFpsMaxResolutionLt(source.sink_wants(), kWidth * kHeight);
-  EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_resolution);
-  EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_framerate);
-  EXPECT_TRUE(stats_proxy_->GetStats().cpu_limited_resolution);
-  EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_framerate);
-  EXPECT_EQ(1, stats_proxy_->GetStats().number_of_cpu_adapt_changes);
-  EXPECT_EQ(0, stats_proxy_->GetStats().number_of_quality_adapt_changes);
-
-  // Trigger cpu adapt down, expect scaled down resolution (640x360@30fps).
-  video_stream_encoder_->TriggerCpuOveruse();
-  timestamp_ms += kFrameIntervalMs;
-  source.IncomingCapturedFrame(CreateFrame(timestamp_ms, kWidth, kHeight));
-  WaitForEncodedFrame(timestamp_ms);
-  VerifyFpsMaxResolutionLt(source.sink_wants(), source.last_wants());
-  EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_resolution);
-  EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_framerate);
-  EXPECT_TRUE(stats_proxy_->GetStats().cpu_limited_resolution);
-  EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_framerate);
-  EXPECT_EQ(2, stats_proxy_->GetStats().number_of_cpu_adapt_changes);
-  EXPECT_EQ(0, stats_proxy_->GetStats().number_of_quality_adapt_changes);
-
-  // Trigger quality adapt down, expect reduced fps (640x360@15fps).
-  video_stream_encoder_->TriggerQualityLow();
-  timestamp_ms += kFrameIntervalMs;
-  source.IncomingCapturedFrame(CreateFrame(timestamp_ms, kWidth, kHeight));
-  WaitForEncodedFrame(timestamp_ms);
-  VerifyFpsLtResolutionEq(source.sink_wants(), source.last_wants());
-  EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_resolution);
-  EXPECT_TRUE(stats_proxy_->GetStats().bw_limited_framerate);
-  EXPECT_TRUE(stats_proxy_->GetStats().cpu_limited_resolution);
-  EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_framerate);
-  EXPECT_EQ(2, stats_proxy_->GetStats().number_of_cpu_adapt_changes);
-  EXPECT_EQ(1, stats_proxy_->GetStats().number_of_quality_adapt_changes);
-
-  // Trigger cpu adapt up, expect increased fps (640x360@30fps).
-  video_stream_encoder_->TriggerCpuNormalUsage();
-  timestamp_ms += kFrameIntervalMs;
-  source.IncomingCapturedFrame(CreateFrame(timestamp_ms, kWidth, kHeight));
-  WaitForEncodedFrame(timestamp_ms);
-  VerifyFpsMaxResolutionEq(source.sink_wants(), source.last_wants());
-  EXPECT_TRUE(stats_proxy_->GetStats().bw_limited_resolution);
-  EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_framerate);
-  EXPECT_TRUE(stats_proxy_->GetStats().cpu_limited_resolution);
-  EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_framerate);
-  EXPECT_EQ(3, stats_proxy_->GetStats().number_of_cpu_adapt_changes);
-  EXPECT_EQ(1, stats_proxy_->GetStats().number_of_quality_adapt_changes);
-
-  // Trigger quality adapt up, expect upscaled resolution (960x540@30fps).
-  video_stream_encoder_->TriggerQualityHigh();
-  timestamp_ms += kFrameIntervalMs;
-  source.IncomingCapturedFrame(CreateFrame(timestamp_ms, kWidth, kHeight));
-  WaitForEncodedFrame(timestamp_ms);
-  VerifyFpsMaxResolutionGt(source.sink_wants(), source.last_wants());
-  EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_resolution);
-  EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_framerate);
-  EXPECT_TRUE(stats_proxy_->GetStats().cpu_limited_resolution);
-  EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_framerate);
-  EXPECT_EQ(3, stats_proxy_->GetStats().number_of_cpu_adapt_changes);
-  EXPECT_EQ(2, stats_proxy_->GetStats().number_of_quality_adapt_changes);
-
-  // Trigger cpu adapt up,  expect no restriction (1280x720fps@30fps).
-  video_stream_encoder_->TriggerCpuNormalUsage();
-  timestamp_ms += kFrameIntervalMs;
-  source.IncomingCapturedFrame(CreateFrame(timestamp_ms, kWidth, kHeight));
-  WaitForEncodedFrame(kWidth, kHeight);
-  VerifyFpsMaxResolutionGt(source.sink_wants(), source.last_wants());
-  VerifyNoLimitation(source.sink_wants());
-  EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_resolution);
-  EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_framerate);
-  EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_resolution);
-  EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_framerate);
-  EXPECT_EQ(4, stats_proxy_->GetStats().number_of_cpu_adapt_changes);
-  EXPECT_EQ(2, stats_proxy_->GetStats().number_of_quality_adapt_changes);
-
-  // Trigger adapt up, expect no change.
-  video_stream_encoder_->TriggerQualityHigh();
-  VerifyNoLimitation(source.sink_wants());
-  EXPECT_EQ(4, stats_proxy_->GetStats().number_of_cpu_adapt_changes);
-  EXPECT_EQ(2, stats_proxy_->GetStats().number_of_quality_adapt_changes);
-
-  video_stream_encoder_->Stop();
-}
-
-TEST_F(VideoStreamEncoderTest,
-       AdaptWithTwoReasonsAndDifferentOrder_Resolution) {
-  const int kWidth = 640;
-  const int kHeight = 360;
-  const int kFpsLimit = 15;
-  const int64_t kFrameIntervalMs = 150;
-  int64_t timestamp_ms = kFrameIntervalMs;
-  video_stream_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0);
-
-  // Enable kBalanced preference, no initial limitation.
-  AdaptingFrameForwarder source;
-  source.set_adaptation_enabled(true);
-  video_stream_encoder_->SetSource(
-      &source,
-      VideoSendStream::DegradationPreference::kBalanced);
-  timestamp_ms += kFrameIntervalMs;
-  source.IncomingCapturedFrame(CreateFrame(timestamp_ms, kWidth, kHeight));
-  WaitForEncodedFrame(kWidth, kHeight);
-  VerifyNoLimitation(source.sink_wants());
-  EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_resolution);
-  EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_framerate);
-  EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_resolution);
-  EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_framerate);
-  EXPECT_EQ(0, stats_proxy_->GetStats().number_of_cpu_adapt_changes);
-  EXPECT_EQ(0, stats_proxy_->GetStats().number_of_quality_adapt_changes);
-
-  // Trigger cpu adapt down, expect scaled down framerate (640x360@15fps).
-  video_stream_encoder_->TriggerCpuOveruse();
-  timestamp_ms += kFrameIntervalMs;
-  source.IncomingCapturedFrame(CreateFrame(timestamp_ms, kWidth, kHeight));
-  WaitForEncodedFrame(timestamp_ms);
-  VerifyFpsEqResolutionMax(source.sink_wants(), kFpsLimit);
-  EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_resolution);
-  EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_framerate);
-  EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_resolution);
-  EXPECT_TRUE(stats_proxy_->GetStats().cpu_limited_framerate);
-  EXPECT_EQ(1, stats_proxy_->GetStats().number_of_cpu_adapt_changes);
-  EXPECT_EQ(0, stats_proxy_->GetStats().number_of_quality_adapt_changes);
-
-  // Trigger quality adapt down, expect scaled down resolution (480x270@15fps).
-  video_stream_encoder_->TriggerQualityLow();
-  timestamp_ms += kFrameIntervalMs;
-  source.IncomingCapturedFrame(CreateFrame(timestamp_ms, kWidth, kHeight));
-  WaitForEncodedFrame(timestamp_ms);
-  VerifyFpsEqResolutionLt(source.sink_wants(), source.last_wants());
-  EXPECT_TRUE(stats_proxy_->GetStats().bw_limited_resolution);
-  EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_framerate);
-  EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_resolution);
-  EXPECT_TRUE(stats_proxy_->GetStats().cpu_limited_framerate);
-  EXPECT_EQ(1, stats_proxy_->GetStats().number_of_cpu_adapt_changes);
-  EXPECT_EQ(1, stats_proxy_->GetStats().number_of_quality_adapt_changes);
-
-  // Trigger cpu adapt up, expect upscaled resolution (640x360@15fps).
-  video_stream_encoder_->TriggerCpuNormalUsage();
-  timestamp_ms += kFrameIntervalMs;
-  source.IncomingCapturedFrame(CreateFrame(timestamp_ms, kWidth, kHeight));
-  WaitForEncodedFrame(timestamp_ms);
-  VerifyFpsEqResolutionGt(source.sink_wants(), source.last_wants());
-  EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_resolution);
-  EXPECT_TRUE(stats_proxy_->GetStats().bw_limited_framerate);
-  EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_resolution);
-  EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_framerate);
-  EXPECT_EQ(2, stats_proxy_->GetStats().number_of_cpu_adapt_changes);
-  EXPECT_EQ(1, stats_proxy_->GetStats().number_of_quality_adapt_changes);
-
-  // Trigger quality adapt up, expect increased fps (640x360@30fps).
-  video_stream_encoder_->TriggerQualityHigh();
-  timestamp_ms += kFrameIntervalMs;
-  source.IncomingCapturedFrame(CreateFrame(timestamp_ms, kWidth, kHeight));
-  WaitForEncodedFrame(timestamp_ms);
-  VerifyNoLimitation(source.sink_wants());
-  EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_resolution);
-  EXPECT_FALSE(stats_proxy_->GetStats().bw_limited_framerate);
-  EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_resolution);
-  EXPECT_FALSE(stats_proxy_->GetStats().cpu_limited_framerate);
-  EXPECT_EQ(2, stats_proxy_->GetStats().number_of_cpu_adapt_changes);
-  EXPECT_EQ(2, stats_proxy_->GetStats().number_of_quality_adapt_changes);
-
-  // Trigger adapt up, expect no change.
-  video_stream_encoder_->TriggerQualityHigh();
-  VerifyNoLimitation(source.sink_wants());
-  EXPECT_EQ(2, stats_proxy_->GetStats().number_of_cpu_adapt_changes);
-  EXPECT_EQ(2, stats_proxy_->GetStats().number_of_quality_adapt_changes);
-
-  video_stream_encoder_->Stop();
-}
-
-TEST_F(VideoStreamEncoderTest, AcceptsFullHdAdaptedDownSimulcastFrames) {
-  // Simulates simulcast behavior and makes highest stream resolutions divisible
-  // by 4.
-  class CroppingVideoStreamFactory
-      : public VideoEncoderConfig::VideoStreamFactoryInterface {
-   public:
-    explicit CroppingVideoStreamFactory(size_t num_temporal_layers,
-                                        int framerate)
-        : num_temporal_layers_(num_temporal_layers), framerate_(framerate) {
-      EXPECT_GT(num_temporal_layers, 0u);
-      EXPECT_GT(framerate, 0);
-    }
-
-   private:
-    std::vector<VideoStream> CreateEncoderStreams(
-        int width,
-        int height,
-        const VideoEncoderConfig& encoder_config) override {
-      std::vector<VideoStream> streams =
-          test::CreateVideoStreams(width - width % 4, height - height % 4,
-                                   encoder_config);
-      for (VideoStream& stream : streams) {
-        stream.temporal_layer_thresholds_bps.resize(num_temporal_layers_ - 1);
-        stream.max_framerate = framerate_;
-      }
-      return streams;
-    }
-
-    const size_t num_temporal_layers_;
-    const int framerate_;
-  };
-
-  const int kFrameWidth = 1920;
-  const int kFrameHeight = 1080;
-  // 3/4 of 1920.
-  const int kAdaptedFrameWidth = 1440;
-  // 3/4 of 1080 rounded down to multiple of 4.
-  const int kAdaptedFrameHeight = 808;
-  const int kFramerate = 24;
-
-  video_stream_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0);
-  // Trigger reconfigure encoder (without resetting the entire instance).
-  VideoEncoderConfig video_encoder_config;
-  video_encoder_config.max_bitrate_bps = kTargetBitrateBps;
-  video_encoder_config.number_of_streams = 1;
-  video_encoder_config.video_stream_factory =
-      new rtc::RefCountedObject<CroppingVideoStreamFactory>(1, kFramerate);
-  video_stream_encoder_->ConfigureEncoder(std::move(video_encoder_config),
-                                          kMaxPayloadLength, false);
-  video_stream_encoder_->WaitUntilTaskQueueIsIdle();
-
-  video_source_.set_adaptation_enabled(true);
-
-  video_source_.IncomingCapturedFrame(
-      CreateFrame(1, kFrameWidth, kFrameHeight));
-  WaitForEncodedFrame(kFrameWidth, kFrameHeight);
-
-  // Trigger CPU overuse, downscale by 3/4.
-  video_stream_encoder_->TriggerCpuOveruse();
-  video_source_.IncomingCapturedFrame(
-      CreateFrame(2, kFrameWidth, kFrameHeight));
-  WaitForEncodedFrame(kAdaptedFrameWidth, kAdaptedFrameHeight);
-
-  video_stream_encoder_->Stop();
-}
-
-TEST_F(VideoStreamEncoderTest, PeriodicallyUpdatesChannelParameters) {
-  const int kFrameWidth = 1280;
-  const int kFrameHeight = 720;
-  const int kLowFps = 2;
-  const int kHighFps = 30;
-
-  video_stream_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0);
-
-  int64_t timestamp_ms = fake_clock_.TimeNanos() / rtc::kNumNanosecsPerMillisec;
-  max_framerate_ = kLowFps;
-
-  // Insert 2 seconds of 2fps video.
-  for (int i = 0; i < kLowFps * 2; ++i) {
-    video_source_.IncomingCapturedFrame(
-        CreateFrame(timestamp_ms, kFrameWidth, kFrameHeight));
-    WaitForEncodedFrame(timestamp_ms);
-    timestamp_ms += 1000 / kLowFps;
-  }
-
-  // Make sure encoder is updated with new target.
-  video_stream_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0);
-  video_source_.IncomingCapturedFrame(
-      CreateFrame(timestamp_ms, kFrameWidth, kFrameHeight));
-  WaitForEncodedFrame(timestamp_ms);
-  timestamp_ms += 1000 / kLowFps;
-
-  EXPECT_EQ(kLowFps, fake_encoder_.GetConfiguredInputFramerate());
-
-  // Insert 30fps frames for just a little more than the forced update period.
-  const int kVcmTimerIntervalFrames =
-      (vcm::VCMProcessTimer::kDefaultProcessIntervalMs * kHighFps) / 1000;
-  const int kFrameIntervalMs = 1000 / kHighFps;
-  max_framerate_ = kHighFps;
-  for (int i = 0; i < kVcmTimerIntervalFrames + 2; ++i) {
-    video_source_.IncomingCapturedFrame(
-        CreateFrame(timestamp_ms, kFrameWidth, kFrameHeight));
-    // Wait for encoded frame, but skip ahead if it doesn't arrive as it might
-    // be dropped if the encoder hans't been updated with the new higher target
-    // framerate yet, causing it to overshoot the target bitrate and then
-    // suffering the wrath of the media optimizer.
-    TimedWaitForEncodedFrame(timestamp_ms, 2 * kFrameIntervalMs);
-    timestamp_ms += kFrameIntervalMs;
-  }
-
-  // Don expect correct measurement just yet, but it should be higher than
-  // before.
-  EXPECT_GT(fake_encoder_.GetConfiguredInputFramerate(), kLowFps);
-
-  video_stream_encoder_->Stop();
-}
-
-TEST_F(VideoStreamEncoderTest, DoesNotUpdateBitrateAllocationWhenSuspended) {
-  const int kFrameWidth = 1280;
-  const int kFrameHeight = 720;
-  const int kTargetBitrateBps = 1000000;
-
-  MockBitrateObserver bitrate_observer;
-  video_stream_encoder_->SetBitrateObserver(&bitrate_observer);
-
-  EXPECT_CALL(bitrate_observer, OnBitrateAllocationUpdated(_)).Times(1);
-  // Initial bitrate update.
-  video_stream_encoder_->OnBitrateUpdated(kTargetBitrateBps, 0, 0);
-  video_stream_encoder_->WaitUntilTaskQueueIsIdle();
-
-  // Insert a first video frame, causes another bitrate update.
-  int64_t timestamp_ms = fake_clock_.TimeNanos() / rtc::kNumNanosecsPerMillisec;
-  EXPECT_CALL(bitrate_observer, OnBitrateAllocationUpdated(_)).Times(1);
-  video_source_.IncomingCapturedFrame(
-      CreateFrame(timestamp_ms, kFrameWidth, kFrameHeight));
-  WaitForEncodedFrame(timestamp_ms);
-
-  // Next, simulate video suspension due to pacer queue overrun.
-  video_stream_encoder_->OnBitrateUpdated(0, 0, 1);
-
-  // Skip ahead until a new periodic parameter update should have occured.
-  timestamp_ms += vcm::VCMProcessTimer::kDefaultProcessIntervalMs;
-  fake_clock_.AdvanceTimeMicros(
-      vcm::VCMProcessTimer::kDefaultProcessIntervalMs *
-      rtc::kNumMicrosecsPerMillisec);
-
-  // Bitrate observer should not be called.
-  EXPECT_CALL(bitrate_observer, OnBitrateAllocationUpdated(_)).Times(0);
-  video_source_.IncomingCapturedFrame(
-      CreateFrame(timestamp_ms, kFrameWidth, kFrameHeight));
-  ExpectDroppedFrame();
-
-  video_stream_encoder_->Stop();
-}
-
-}  // namespace webrtc
diff --git a/voice_engine/BUILD.gn b/voice_engine/BUILD.gn
deleted file mode 100644
index 627f412..0000000
--- a/voice_engine/BUILD.gn
+++ /dev/null
@@ -1,310 +0,0 @@
-# Copyright (c) 2014 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.
-
-import("../webrtc.gni")
-
-rtc_static_library("audio_coder") {
-  sources = [
-    "coder.cc",
-    "coder.h",
-  ]
-  deps = [
-    "..:webrtc_common",
-    "../api/audio_codecs:builtin_audio_decoder_factory",
-    "../api/audio_codecs:builtin_audio_encoder_factory",
-    "../modules:module_api",
-    "../modules/audio_coding",
-    "../modules/audio_coding:audio_format_conversion",
-    "../modules/audio_coding:rent_a_codec",
-  ]
-
-  if (!build_with_chromium && is_clang) {
-    # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-    suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-  }
-}
-
-rtc_static_library("file_player") {
-  sources = [
-    "file_player.cc",
-    "file_player.h",
-  ]
-  deps = [
-    ":audio_coder",
-    "..:webrtc_common",
-    "../common_audio",
-    "../modules:module_api",
-    "../modules/media_file",
-    "../rtc_base:rtc_base_approved",
-  ]
-
-  if (!build_with_chromium && is_clang) {
-    # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-    suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-  }
-}
-
-rtc_static_library("file_recorder") {
-  sources = [
-    "file_recorder.cc",
-    "file_recorder.h",
-  ]
-  deps = [
-    ":audio_coder",
-    "..:webrtc_common",
-    "../audio/utility:audio_frame_operations",
-    "../common_audio",
-    "../modules:module_api",
-    "../modules/media_file:media_file",
-    "../rtc_base:rtc_base_approved",
-    "../system_wrappers",
-  ]
-
-  if (!build_with_chromium && is_clang) {
-    # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-    suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-  }
-}
-
-rtc_static_library("voice_engine") {
-  sources = [
-    "channel.cc",
-    "channel.h",
-    "channel_manager.cc",
-    "channel_manager.h",
-    "channel_proxy.cc",
-    "channel_proxy.h",
-    "include/voe_base.h",
-    "include/voe_codec.h",
-    "include/voe_errors.h",
-    "include/voe_file.h",
-    "include/voe_network.h",
-    "include/voe_rtp_rtcp.h",
-    "monitor_module.h",
-    "output_mixer.cc",
-    "output_mixer.h",
-    "shared_data.cc",
-    "shared_data.h",
-    "statistics.cc",
-    "statistics.h",
-    "transmit_mixer.cc",
-    "transmit_mixer.h",
-    "transport_feedback_packet_loss_tracker.cc",
-    "transport_feedback_packet_loss_tracker.h",
-    "utility.cc",
-    "utility.h",
-    "voe_base_impl.cc",
-    "voe_base_impl.h",
-    "voe_codec_impl.cc",
-    "voe_codec_impl.h",
-    "voe_file_impl.cc",
-    "voe_file_impl.h",
-    "voe_network_impl.cc",
-    "voe_network_impl.h",
-    "voe_rtp_rtcp_impl.cc",
-    "voe_rtp_rtcp_impl.h",
-    "voice_engine_defines.h",
-    "voice_engine_impl.cc",
-    "voice_engine_impl.h",
-  ]
-
-  if (is_win) {
-    defines = [ "WEBRTC_DRIFT_COMPENSATION_SUPPORTED" ]
-
-    cflags = [
-      # TODO(kjellander): Bug 261: fix this warning.
-      "/wd4373",  # Virtual function override.
-    ]
-  }
-
-  if (!build_with_chromium && is_clang) {
-    # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-    suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-  }
-
-  public_deps = [
-    "../modules/audio_coding",
-  ]
-  deps = [
-    ":audio_level",
-    ":file_player",
-    ":file_recorder",
-    "..:webrtc_common",
-    "../api:array_view",
-    "../api:audio_mixer_api",
-    "../api:call_api",
-    "../api:libjingle_peerconnection_api",
-    "../api:optional",
-    "../api:transport_api",
-    "../api/audio_codecs:audio_codecs_api",
-    "../api/audio_codecs:builtin_audio_decoder_factory",
-    "../api/audio_codecs:builtin_audio_encoder_factory",
-    "../audio/utility:audio_frame_operations",
-    "../call:rtp_interfaces",
-    "../common_audio",
-    "../logging:rtc_event_log_api",
-    "../modules:module_api",
-    "../modules/audio_coding:audio_format_conversion",
-    "../modules/audio_coding:rent_a_codec",
-    "../modules/audio_conference_mixer",
-    "../modules/audio_device",
-    "../modules/audio_processing",
-    "../modules/bitrate_controller",
-    "../modules/media_file",
-    "../modules/pacing",
-    "../modules/rtp_rtcp",
-    "../modules/utility",
-    "../rtc_base:rtc_base_approved",
-    "../rtc_base:rtc_task_queue",
-    "../system_wrappers",
-  ]
-}
-
-rtc_static_library("audio_level") {
-  sources = [
-    "audio_level.cc",
-    "audio_level.h",
-  ]
-
-  deps = [
-    "..:webrtc_common",
-    "../common_audio",
-    "../modules:module_api",
-    "../rtc_base:rtc_base_approved",
-  ]
-}
-
-if (rtc_include_tests) {
-  rtc_test("voice_engine_unittests") {
-    deps = [
-      ":file_player",
-      ":voice_engine",
-      "../common_audio",
-      "../modules:module_api",
-      "../modules/audio_coding",
-      "../modules/audio_conference_mixer",
-      "../modules/audio_device",
-      "../modules/audio_processing",
-      "../modules/media_file",
-      "../modules/rtp_rtcp",
-      "../modules/utility",
-      "../modules/video_capture:video_capture",
-      "../rtc_base:rtc_base_approved",
-      "../rtc_base:rtc_base_tests_utils",
-      "../system_wrappers",
-      "../test:test_common",
-      "../test:test_main",
-      "../test:video_test_common",
-      "//testing/gmock",
-      "//testing/gtest",
-    ]
-
-    if (is_android) {
-      deps += [ "//testing/android/native_test:native_test_native_code" ]
-      shard_timeout = 900
-    }
-
-    sources = [
-      "channel_unittest.cc",
-      "file_player_unittests.cc",
-      "transport_feedback_packet_loss_tracker_unittest.cc",
-      "utility_unittest.cc",
-      "voe_base_unittest.cc",
-      "voe_codec_unittest.cc",
-      "voe_network_unittest.cc",
-      "voice_engine_fixture.cc",
-      "voice_engine_fixture.h",
-    ]
-
-    data = [
-      "../../resources/utility/encapsulated_pcm16b_8khz.wav",
-      "../../resources/utility/encapsulated_pcmu_8khz.wav",
-    ]
-
-    if (is_win) {
-      defines = [ "WEBRTC_DRIFT_COMPENSATION_SUPPORTED" ]
-
-      cflags = [
-        # TODO(kjellander): Bug 261: fix this warning.
-        "/wd4373",  # Virtual function override.
-      ]
-    }
-
-    if (!build_with_chromium && is_clang) {
-      # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-    }
-  }
-
-  if (!is_ios) {
-    rtc_executable("voe_auto_test") {
-      testonly = true
-
-      deps = [
-        ":voice_engine",
-        "..:webrtc_common",
-        "../logging:rtc_event_log_api",
-        "../modules:module_api",
-        "../modules/audio_device:audio_device",
-        "../modules/audio_processing:audio_processing",
-        "../modules/rtp_rtcp:rtp_rtcp",
-        "../modules/video_capture",
-        "../rtc_base:rtc_base_approved",
-        "../system_wrappers",
-        "../system_wrappers/:system_wrappers_default",
-        "../test/:test_common",
-        "../test/:test_support",
-        "../test/:video_test_common",
-        "//testing/gmock",
-        "//testing/gtest",
-      ]
-
-      sources = [
-        "test/auto_test/automated_mode.cc",
-        "test/auto_test/fixtures/after_initialization_fixture.cc",
-        "test/auto_test/fixtures/after_initialization_fixture.h",
-        "test/auto_test/fixtures/after_streaming_fixture.cc",
-        "test/auto_test/fixtures/after_streaming_fixture.h",
-        "test/auto_test/fixtures/before_initialization_fixture.cc",
-        "test/auto_test/fixtures/before_initialization_fixture.h",
-        "test/auto_test/fixtures/before_streaming_fixture.cc",
-        "test/auto_test/fixtures/before_streaming_fixture.h",
-        "test/auto_test/standard/codec_before_streaming_test.cc",
-        "test/auto_test/standard/codec_test.cc",
-        "test/auto_test/standard/dtmf_test.cc",
-        "test/auto_test/standard/rtp_rtcp_before_streaming_test.cc",
-        "test/auto_test/standard/rtp_rtcp_extensions.cc",
-        "test/auto_test/standard/rtp_rtcp_test.cc",
-        "test/auto_test/voe_standard_test.cc",
-        "test/auto_test/voe_standard_test.h",
-        "test/auto_test/voe_test_defines.h",
-      ]
-
-      defines = []
-
-      if (rtc_enable_protobuf) {
-        defines = [ "ENABLE_RTC_EVENT_LOG" ]
-      }
-
-      if (is_win) {
-        defines += [ "WEBRTC_DRIFT_COMPENSATION_SUPPORTED" ]
-
-        cflags = [
-          "/wd4267",  # size_t to int truncation.
-          "/wd4373",  # Virtual function override.
-                      # TODO(kjellander): Bug 261: fix this warning.
-        ]
-      }
-
-      if (!build_with_chromium && is_clang) {
-        # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
-        suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
-      }
-    }
-  }
-}
diff --git a/voice_engine/DEPS b/voice_engine/DEPS
deleted file mode 100644
index c5a97cc..0000000
--- a/voice_engine/DEPS
+++ /dev/null
@@ -1,15 +0,0 @@
-include_rules = [
-  "+webrtc/audio/utility/audio_frame_operations.h",
-  "+webrtc/call",
-  "+webrtc/common_audio",
-  "+webrtc/logging/rtc_event_log",
-  "+webrtc/modules/audio_coding",
-  "+webrtc/modules/audio_conference_mixer",
-  "+webrtc/modules/audio_device",
-  "+webrtc/modules/audio_processing",
-  "+webrtc/modules/media_file",
-  "+webrtc/modules/pacing",
-  "+webrtc/modules/rtp_rtcp",
-  "+webrtc/modules/utility",
-  "+webrtc/system_wrappers",
-]
diff --git a/voice_engine/OWNERS b/voice_engine/OWNERS
deleted file mode 100644
index 0430ede..0000000
--- a/voice_engine/OWNERS
+++ /dev/null
@@ -1,10 +0,0 @@
-henrikg@webrtc.org
-henrika@webrtc.org
-niklas.enbom@webrtc.org
-solenberg@webrtc.org
-
-
-# These are for the common case of adding or renaming files. If you're doing
-# structural changes, please get a review from a reviewer in this file.
-per-file *.gn=*
-per-file *.gni=*
diff --git a/voice_engine/audio_level.cc b/voice_engine/audio_level.cc
deleted file mode 100644
index ab41149..0000000
--- a/voice_engine/audio_level.cc
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- *  Copyright (c) 2012 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/voice_engine/audio_level.h"
-
-#include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
-#include "webrtc/modules/include/module_common_types.h"
-
-namespace webrtc {
-namespace voe {
-
-// Number of bars on the indicator.
-// Note that the number of elements is specified because we are indexing it
-// in the range of 0-32
-constexpr int8_t kPermutation[33] = {0, 1, 2, 3, 4, 4, 5, 5, 5, 5, 6,
-                                     6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8,
-                                     9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9};
-
-AudioLevel::AudioLevel()
-    : abs_max_(0), count_(0), current_level_(0), current_level_full_range_(0) {
-  WebRtcSpl_Init();
-}
-
-AudioLevel::~AudioLevel() {}
-
-int8_t AudioLevel::Level() const {
-  rtc::CritScope cs(&crit_sect_);
-  return current_level_;
-}
-
-int16_t AudioLevel::LevelFullRange() const {
-  rtc::CritScope cs(&crit_sect_);
-  return current_level_full_range_;
-}
-
-void AudioLevel::Clear() {
-  rtc::CritScope cs(&crit_sect_);
-  abs_max_ = 0;
-  count_ = 0;
-  current_level_ = 0;
-  current_level_full_range_ = 0;
-}
-
-double AudioLevel::TotalEnergy() const {
-  rtc::CritScope cs(&crit_sect_);
-  return total_energy_;
-}
-
-double AudioLevel::TotalDuration() const {
-  rtc::CritScope cs(&crit_sect_);
-  return total_duration_;
-}
-
-void AudioLevel::ComputeLevel(const AudioFrame& audioFrame, double duration) {
-  // Check speech level (works for 2 channels as well)
-  int16_t abs_value = audioFrame.muted() ? 0 :
-      WebRtcSpl_MaxAbsValueW16(
-          audioFrame.data(),
-          audioFrame.samples_per_channel_ * audioFrame.num_channels_);
-
-  // Protect member access using a lock since this method is called on a
-  // dedicated audio thread in the RecordedDataIsAvailable() callback.
-  rtc::CritScope cs(&crit_sect_);
-
-  if (abs_value > abs_max_)
-    abs_max_ = abs_value;
-
-  // Update level approximately 10 times per second
-  if (count_++ == kUpdateFrequency) {
-    current_level_full_range_ = abs_max_;
-
-    count_ = 0;
-
-    // Highest value for a int16_t is 0x7fff = 32767
-    // Divide with 1000 to get in the range of 0-32 which is the range of the
-    // permutation vector
-    int32_t position = abs_max_ / 1000;
-
-    // Make it less likely that the bar stays at position 0. I.e. only if it's
-    // in the range 0-250 (instead of 0-1000)
-    if ((position == 0) && (abs_max_ > 250)) {
-      position = 1;
-    }
-    current_level_ = kPermutation[position];
-
-    // Decay the absolute maximum (divide by 4)
-    abs_max_ >>= 2;
-  }
-
-  // See the description for "totalAudioEnergy" in the WebRTC stats spec
-  // (https://w3c.github.io/webrtc-stats/#dom-rtcmediastreamtrackstats-totalaudioenergy)
-  // for an explanation of these formulas. In short, we need a value that can
-  // be used to compute RMS audio levels over different time intervals, by
-  // taking the difference between the results from two getStats calls. To do
-  // this, the value needs to be of units "squared sample value * time".
-  double additional_energy =
-      static_cast<double>(current_level_full_range_) / INT16_MAX;
-  additional_energy *= additional_energy;
-  total_energy_ += additional_energy * duration;
-  total_duration_ += duration;
-}
-
-}  // namespace voe
-}  // namespace webrtc
diff --git a/voice_engine/audio_level.h b/voice_engine/audio_level.h
deleted file mode 100644
index 33f8fe2..0000000
--- a/voice_engine/audio_level.h
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- *  Copyright (c) 2011 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_VOICE_ENGINE_AUDIO_LEVEL_H_
-#define WEBRTC_VOICE_ENGINE_AUDIO_LEVEL_H_
-
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/thread_annotations.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-class AudioFrame;
-namespace voe {
-
-class AudioLevel {
- public:
-  AudioLevel();
-  ~AudioLevel();
-
-  // Called on "API thread(s)" from APIs like VoEBase::CreateChannel(),
-  // VoEBase::StopSend(), VoEVolumeControl::GetSpeechOutputLevel().
-  int8_t Level() const;
-  int16_t LevelFullRange() const;
-  void Clear();
-  // See the description for "totalAudioEnergy" in the WebRTC stats spec
-  // (https://w3c.github.io/webrtc-stats/#dom-rtcmediastreamtrackstats-totalaudioenergy)
-  double TotalEnergy() const;
-  double TotalDuration() const;
-
-  // Called on a native capture audio thread (platform dependent) from the
-  // AudioTransport::RecordedDataIsAvailable() callback.
-  // In Chrome, this method is called on the AudioInputDevice thread.
-  void ComputeLevel(const AudioFrame& audioFrame, double duration);
-
- private:
-  enum { kUpdateFrequency = 10 };
-
-  rtc::CriticalSection crit_sect_;
-
-  int16_t abs_max_ RTC_GUARDED_BY(crit_sect_);
-  int16_t count_ RTC_GUARDED_BY(crit_sect_);
-  int8_t current_level_ RTC_GUARDED_BY(crit_sect_);
-  int16_t current_level_full_range_ RTC_GUARDED_BY(crit_sect_);
-
-  double total_energy_ RTC_GUARDED_BY(crit_sect_) = 0.0;
-  double total_duration_ RTC_GUARDED_BY(crit_sect_) = 0.0;
-};
-
-}  // namespace voe
-}  // namespace webrtc
-
-#endif  // WEBRTC_VOICE_ENGINE_AUDIO_LEVEL_H_
diff --git a/voice_engine/channel.cc b/voice_engine/channel.cc
deleted file mode 100644
index d1c3a4b..0000000
--- a/voice_engine/channel.cc
+++ /dev/null
@@ -1,3137 +0,0 @@
-/*
- *  Copyright (c) 2012 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/voice_engine/channel.h"
-
-#include <algorithm>
-#include <utility>
-
-#include "webrtc/api/array_view.h"
-#include "webrtc/audio/utility/audio_frame_operations.h"
-#include "webrtc/call/rtp_transport_controller_send_interface.h"
-#include "webrtc/logging/rtc_event_log/rtc_event_log.h"
-#include "webrtc/modules/audio_coding/codecs/audio_format_conversion.h"
-#include "webrtc/modules/audio_device/include/audio_device.h"
-#include "webrtc/modules/audio_processing/include/audio_processing.h"
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/modules/pacing/packet_router.h"
-#include "webrtc/modules/rtp_rtcp/include/receive_statistics.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_payload_registry.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_receiver.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_packet_received.h"
-#include "webrtc/modules/rtp_rtcp/source/rtp_receiver_strategy.h"
-#include "webrtc/modules/utility/include/process_thread.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/format_macros.h"
-#include "webrtc/rtc_base/location.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/rate_limiter.h"
-#include "webrtc/rtc_base/task_queue.h"
-#include "webrtc/rtc_base/thread_checker.h"
-#include "webrtc/rtc_base/timeutils.h"
-#include "webrtc/system_wrappers/include/field_trial.h"
-#include "webrtc/system_wrappers/include/trace.h"
-#include "webrtc/voice_engine/include/voe_rtp_rtcp.h"
-#include "webrtc/voice_engine/output_mixer.h"
-#include "webrtc/voice_engine/statistics.h"
-#include "webrtc/voice_engine/utility.h"
-
-namespace webrtc {
-namespace voe {
-
-namespace {
-
-constexpr double kAudioSampleDurationSeconds = 0.01;
-constexpr int64_t kMaxRetransmissionWindowMs = 1000;
-constexpr int64_t kMinRetransmissionWindowMs = 30;
-
-}  // namespace
-
-const int kTelephoneEventAttenuationdB = 10;
-
-class RtcEventLogProxy final : public webrtc::RtcEventLog {
- public:
-  RtcEventLogProxy() : event_log_(nullptr) {}
-
-  bool StartLogging(const std::string& file_name,
-                    int64_t max_size_bytes) override {
-    RTC_NOTREACHED();
-    return false;
-  }
-
-  bool StartLogging(rtc::PlatformFile log_file,
-                    int64_t max_size_bytes) override {
-    RTC_NOTREACHED();
-    return false;
-  }
-
-  void StopLogging() override { RTC_NOTREACHED(); }
-
-  void LogVideoReceiveStreamConfig(
-      const webrtc::rtclog::StreamConfig&) override {
-    RTC_NOTREACHED();
-  }
-
-  void LogVideoSendStreamConfig(const webrtc::rtclog::StreamConfig&) override {
-    RTC_NOTREACHED();
-  }
-
-  void LogAudioReceiveStreamConfig(
-      const webrtc::rtclog::StreamConfig& config) override {
-    rtc::CritScope lock(&crit_);
-    if (event_log_) {
-      event_log_->LogAudioReceiveStreamConfig(config);
-    }
-  }
-
-  void LogAudioSendStreamConfig(
-      const webrtc::rtclog::StreamConfig& config) override {
-    rtc::CritScope lock(&crit_);
-    if (event_log_) {
-      event_log_->LogAudioSendStreamConfig(config);
-    }
-  }
-
-  void LogRtpHeader(webrtc::PacketDirection direction,
-                    const uint8_t* header,
-                    size_t packet_length) override {
-    LogRtpHeader(direction, header, packet_length, PacedPacketInfo::kNotAProbe);
-  }
-
-  void LogRtpHeader(webrtc::PacketDirection direction,
-                    const uint8_t* header,
-                    size_t packet_length,
-                    int probe_cluster_id) override {
-    rtc::CritScope lock(&crit_);
-    if (event_log_) {
-      event_log_->LogRtpHeader(direction, header, packet_length,
-                               probe_cluster_id);
-    }
-  }
-
-  void LogRtcpPacket(webrtc::PacketDirection direction,
-                     const uint8_t* packet,
-                     size_t length) override {
-    rtc::CritScope lock(&crit_);
-    if (event_log_) {
-      event_log_->LogRtcpPacket(direction, packet, length);
-    }
-  }
-
-  void LogAudioPlayout(uint32_t ssrc) override {
-    rtc::CritScope lock(&crit_);
-    if (event_log_) {
-      event_log_->LogAudioPlayout(ssrc);
-    }
-  }
-
-  void LogLossBasedBweUpdate(int32_t bitrate_bps,
-                             uint8_t fraction_loss,
-                             int32_t total_packets) override {
-    rtc::CritScope lock(&crit_);
-    if (event_log_) {
-      event_log_->LogLossBasedBweUpdate(bitrate_bps, fraction_loss,
-                                        total_packets);
-    }
-  }
-
-  void LogDelayBasedBweUpdate(int32_t bitrate_bps,
-                              BandwidthUsage detector_state) override {
-    rtc::CritScope lock(&crit_);
-    if (event_log_) {
-      event_log_->LogDelayBasedBweUpdate(bitrate_bps, detector_state);
-    }
-  }
-
-  void LogAudioNetworkAdaptation(
-      const AudioEncoderRuntimeConfig& config) override {
-    rtc::CritScope lock(&crit_);
-    if (event_log_) {
-      event_log_->LogAudioNetworkAdaptation(config);
-    }
-  }
-
-  void LogProbeClusterCreated(int id,
-                              int bitrate_bps,
-                              int min_probes,
-                              int min_bytes) override {
-    rtc::CritScope lock(&crit_);
-    if (event_log_) {
-      event_log_->LogProbeClusterCreated(id, bitrate_bps, min_probes,
-                                         min_bytes);
-    }
-  };
-
-  void LogProbeResultSuccess(int id, int bitrate_bps) override {
-    rtc::CritScope lock(&crit_);
-    if (event_log_) {
-      event_log_->LogProbeResultSuccess(id, bitrate_bps);
-    }
-  };
-
-  void LogProbeResultFailure(int id,
-                             ProbeFailureReason failure_reason) override {
-    rtc::CritScope lock(&crit_);
-    if (event_log_) {
-      event_log_->LogProbeResultFailure(id, failure_reason);
-    }
-  };
-
-  void SetEventLog(RtcEventLog* event_log) {
-    rtc::CritScope lock(&crit_);
-    event_log_ = event_log;
-  }
-
- private:
-  rtc::CriticalSection crit_;
-  RtcEventLog* event_log_ RTC_GUARDED_BY(crit_);
-  RTC_DISALLOW_COPY_AND_ASSIGN(RtcEventLogProxy);
-};
-
-class RtcpRttStatsProxy final : public RtcpRttStats {
- public:
-  RtcpRttStatsProxy() : rtcp_rtt_stats_(nullptr) {}
-
-  void OnRttUpdate(int64_t rtt) override {
-    rtc::CritScope lock(&crit_);
-    if (rtcp_rtt_stats_)
-      rtcp_rtt_stats_->OnRttUpdate(rtt);
-  }
-
-  int64_t LastProcessedRtt() const override {
-    rtc::CritScope lock(&crit_);
-    if (!rtcp_rtt_stats_)
-      return 0;
-    return rtcp_rtt_stats_->LastProcessedRtt();
-  }
-
-  void SetRtcpRttStats(RtcpRttStats* rtcp_rtt_stats) {
-    rtc::CritScope lock(&crit_);
-    rtcp_rtt_stats_ = rtcp_rtt_stats;
-  }
-
- private:
-  rtc::CriticalSection crit_;
-  RtcpRttStats* rtcp_rtt_stats_ RTC_GUARDED_BY(crit_);
-  RTC_DISALLOW_COPY_AND_ASSIGN(RtcpRttStatsProxy);
-};
-
-class TransportFeedbackProxy : public TransportFeedbackObserver {
- public:
-  TransportFeedbackProxy() : feedback_observer_(nullptr) {
-    pacer_thread_.DetachFromThread();
-    network_thread_.DetachFromThread();
-  }
-
-  void SetTransportFeedbackObserver(
-      TransportFeedbackObserver* feedback_observer) {
-    RTC_DCHECK(thread_checker_.CalledOnValidThread());
-    rtc::CritScope lock(&crit_);
-    feedback_observer_ = feedback_observer;
-  }
-
-  // Implements TransportFeedbackObserver.
-  void AddPacket(uint32_t ssrc,
-                 uint16_t sequence_number,
-                 size_t length,
-                 const PacedPacketInfo& pacing_info) override {
-    RTC_DCHECK(pacer_thread_.CalledOnValidThread());
-    rtc::CritScope lock(&crit_);
-    if (feedback_observer_)
-      feedback_observer_->AddPacket(ssrc, sequence_number, length, pacing_info);
-  }
-
-  void OnTransportFeedback(const rtcp::TransportFeedback& feedback) override {
-    RTC_DCHECK(network_thread_.CalledOnValidThread());
-    rtc::CritScope lock(&crit_);
-    if (feedback_observer_)
-      feedback_observer_->OnTransportFeedback(feedback);
-  }
-  std::vector<PacketFeedback> GetTransportFeedbackVector() const override {
-    RTC_NOTREACHED();
-    return std::vector<PacketFeedback>();
-  }
-
- private:
-  rtc::CriticalSection crit_;
-  rtc::ThreadChecker thread_checker_;
-  rtc::ThreadChecker pacer_thread_;
-  rtc::ThreadChecker network_thread_;
-  TransportFeedbackObserver* feedback_observer_ RTC_GUARDED_BY(&crit_);
-};
-
-class TransportSequenceNumberProxy : public TransportSequenceNumberAllocator {
- public:
-  TransportSequenceNumberProxy() : seq_num_allocator_(nullptr) {
-    pacer_thread_.DetachFromThread();
-  }
-
-  void SetSequenceNumberAllocator(
-      TransportSequenceNumberAllocator* seq_num_allocator) {
-    RTC_DCHECK(thread_checker_.CalledOnValidThread());
-    rtc::CritScope lock(&crit_);
-    seq_num_allocator_ = seq_num_allocator;
-  }
-
-  // Implements TransportSequenceNumberAllocator.
-  uint16_t AllocateSequenceNumber() override {
-    RTC_DCHECK(pacer_thread_.CalledOnValidThread());
-    rtc::CritScope lock(&crit_);
-    if (!seq_num_allocator_)
-      return 0;
-    return seq_num_allocator_->AllocateSequenceNumber();
-  }
-
- private:
-  rtc::CriticalSection crit_;
-  rtc::ThreadChecker thread_checker_;
-  rtc::ThreadChecker pacer_thread_;
-  TransportSequenceNumberAllocator* seq_num_allocator_ RTC_GUARDED_BY(&crit_);
-};
-
-class RtpPacketSenderProxy : public RtpPacketSender {
- public:
-  RtpPacketSenderProxy() : rtp_packet_sender_(nullptr) {}
-
-  void SetPacketSender(RtpPacketSender* rtp_packet_sender) {
-    RTC_DCHECK(thread_checker_.CalledOnValidThread());
-    rtc::CritScope lock(&crit_);
-    rtp_packet_sender_ = rtp_packet_sender;
-  }
-
-  // Implements RtpPacketSender.
-  void InsertPacket(Priority priority,
-                    uint32_t ssrc,
-                    uint16_t sequence_number,
-                    int64_t capture_time_ms,
-                    size_t bytes,
-                    bool retransmission) override {
-    rtc::CritScope lock(&crit_);
-    if (rtp_packet_sender_) {
-      rtp_packet_sender_->InsertPacket(priority, ssrc, sequence_number,
-                                       capture_time_ms, bytes, retransmission);
-    }
-  }
-
- private:
-  rtc::ThreadChecker thread_checker_;
-  rtc::CriticalSection crit_;
-  RtpPacketSender* rtp_packet_sender_ RTC_GUARDED_BY(&crit_);
-};
-
-class VoERtcpObserver : public RtcpBandwidthObserver {
- public:
-  explicit VoERtcpObserver(Channel* owner)
-      : owner_(owner), bandwidth_observer_(nullptr) {}
-  virtual ~VoERtcpObserver() {}
-
-  void SetBandwidthObserver(RtcpBandwidthObserver* bandwidth_observer) {
-    rtc::CritScope lock(&crit_);
-    bandwidth_observer_ = bandwidth_observer;
-  }
-
-  void OnReceivedEstimatedBitrate(uint32_t bitrate) override {
-    rtc::CritScope lock(&crit_);
-    if (bandwidth_observer_) {
-      bandwidth_observer_->OnReceivedEstimatedBitrate(bitrate);
-    }
-  }
-
-  void OnReceivedRtcpReceiverReport(const ReportBlockList& report_blocks,
-                                    int64_t rtt,
-                                    int64_t now_ms) override {
-    {
-      rtc::CritScope lock(&crit_);
-      if (bandwidth_observer_) {
-        bandwidth_observer_->OnReceivedRtcpReceiverReport(report_blocks, rtt,
-                                                          now_ms);
-      }
-    }
-    // TODO(mflodman): Do we need to aggregate reports here or can we jut send
-    // what we get? I.e. do we ever get multiple reports bundled into one RTCP
-    // report for VoiceEngine?
-    if (report_blocks.empty())
-      return;
-
-    int fraction_lost_aggregate = 0;
-    int total_number_of_packets = 0;
-
-    // If receiving multiple report blocks, calculate the weighted average based
-    // on the number of packets a report refers to.
-    for (ReportBlockList::const_iterator block_it = report_blocks.begin();
-         block_it != report_blocks.end(); ++block_it) {
-      // Find the previous extended high sequence number for this remote SSRC,
-      // to calculate the number of RTP packets this report refers to. Ignore if
-      // we haven't seen this SSRC before.
-      std::map<uint32_t, uint32_t>::iterator seq_num_it =
-          extended_max_sequence_number_.find(block_it->source_ssrc);
-      int number_of_packets = 0;
-      if (seq_num_it != extended_max_sequence_number_.end()) {
-        number_of_packets =
-            block_it->extended_highest_sequence_number - seq_num_it->second;
-      }
-      fraction_lost_aggregate += number_of_packets * block_it->fraction_lost;
-      total_number_of_packets += number_of_packets;
-
-      extended_max_sequence_number_[block_it->source_ssrc] =
-          block_it->extended_highest_sequence_number;
-    }
-    int weighted_fraction_lost = 0;
-    if (total_number_of_packets > 0) {
-      weighted_fraction_lost =
-          (fraction_lost_aggregate + total_number_of_packets / 2) /
-          total_number_of_packets;
-    }
-    owner_->OnUplinkPacketLossRate(weighted_fraction_lost / 255.0f);
-  }
-
- private:
-  Channel* owner_;
-  // Maps remote side ssrc to extended highest sequence number received.
-  std::map<uint32_t, uint32_t> extended_max_sequence_number_;
-  rtc::CriticalSection crit_;
-  RtcpBandwidthObserver* bandwidth_observer_ RTC_GUARDED_BY(crit_);
-};
-
-class Channel::ProcessAndEncodeAudioTask : public rtc::QueuedTask {
- public:
-  ProcessAndEncodeAudioTask(std::unique_ptr<AudioFrame> audio_frame,
-                            Channel* channel)
-      : audio_frame_(std::move(audio_frame)), channel_(channel) {
-    RTC_DCHECK(channel_);
-  }
-
- private:
-  bool Run() override {
-    RTC_DCHECK_RUN_ON(channel_->encoder_queue_);
-    channel_->ProcessAndEncodeAudioOnTaskQueue(audio_frame_.get());
-    return true;
-  }
-
-  std::unique_ptr<AudioFrame> audio_frame_;
-  Channel* const channel_;
-};
-
-int32_t Channel::SendData(FrameType frameType,
-                          uint8_t payloadType,
-                          uint32_t timeStamp,
-                          const uint8_t* payloadData,
-                          size_t payloadSize,
-                          const RTPFragmentationHeader* fragmentation) {
-  RTC_DCHECK_RUN_ON(encoder_queue_);
-  WEBRTC_TRACE(kTraceStream, kTraceVoice, VoEId(_instanceId, _channelId),
-               "Channel::SendData(frameType=%u, payloadType=%u, timeStamp=%u,"
-               " payloadSize=%" PRIuS ", fragmentation=0x%x)",
-               frameType, payloadType, timeStamp, payloadSize, fragmentation);
-
-  if (_includeAudioLevelIndication) {
-    // Store current audio level in the RTP/RTCP module.
-    // The level will be used in combination with voice-activity state
-    // (frameType) to add an RTP header extension
-    _rtpRtcpModule->SetAudioLevel(rms_level_.Average());
-  }
-
-  // Push data from ACM to RTP/RTCP-module to deliver audio frame for
-  // packetization.
-  // This call will trigger Transport::SendPacket() from the RTP/RTCP module.
-  if (!_rtpRtcpModule->SendOutgoingData(
-          (FrameType&)frameType, payloadType, timeStamp,
-          // Leaving the time when this frame was
-          // received from the capture device as
-          // undefined for voice for now.
-          -1, payloadData, payloadSize, fragmentation, nullptr, nullptr)) {
-    _engineStatisticsPtr->SetLastError(
-        VE_RTP_RTCP_MODULE_ERROR, kTraceWarning,
-        "Channel::SendData() failed to send data to RTP/RTCP module");
-    return -1;
-  }
-
-  return 0;
-}
-
-bool Channel::SendRtp(const uint8_t* data,
-                      size_t len,
-                      const PacketOptions& options) {
-  WEBRTC_TRACE(kTraceStream, kTraceVoice, VoEId(_instanceId, _channelId),
-               "Channel::SendPacket(channel=%d, len=%" PRIuS ")", len);
-
-  rtc::CritScope cs(&_callbackCritSect);
-
-  if (_transportPtr == NULL) {
-    WEBRTC_TRACE(kTraceError, kTraceVoice, VoEId(_instanceId, _channelId),
-                 "Channel::SendPacket() failed to send RTP packet due to"
-                 " invalid transport object");
-    return false;
-  }
-
-  uint8_t* bufferToSendPtr = (uint8_t*)data;
-  size_t bufferLength = len;
-
-  if (!_transportPtr->SendRtp(bufferToSendPtr, bufferLength, options)) {
-    std::string transport_name =
-        _externalTransport ? "external transport" : "WebRtc sockets";
-    WEBRTC_TRACE(kTraceError, kTraceVoice, VoEId(_instanceId, _channelId),
-                 "Channel::SendPacket() RTP transmission using %s failed",
-                 transport_name.c_str());
-    return false;
-  }
-  return true;
-}
-
-bool Channel::SendRtcp(const uint8_t* data, size_t len) {
-  WEBRTC_TRACE(kTraceStream, kTraceVoice, VoEId(_instanceId, _channelId),
-               "Channel::SendRtcp(len=%" PRIuS ")", len);
-
-  rtc::CritScope cs(&_callbackCritSect);
-  if (_transportPtr == NULL) {
-    WEBRTC_TRACE(kTraceError, kTraceVoice, VoEId(_instanceId, _channelId),
-                 "Channel::SendRtcp() failed to send RTCP packet"
-                 " due to invalid transport object");
-    return false;
-  }
-
-  uint8_t* bufferToSendPtr = (uint8_t*)data;
-  size_t bufferLength = len;
-
-  int n = _transportPtr->SendRtcp(bufferToSendPtr, bufferLength);
-  if (n < 0) {
-    std::string transport_name =
-        _externalTransport ? "external transport" : "WebRtc sockets";
-    WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId, _channelId),
-                 "Channel::SendRtcp() transmission using %s failed",
-                 transport_name.c_str());
-    return false;
-  }
-  return true;
-}
-
-void Channel::OnIncomingSSRCChanged(uint32_t ssrc) {
-  WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId, _channelId),
-               "Channel::OnIncomingSSRCChanged(SSRC=%d)", ssrc);
-
-  // Update ssrc so that NTP for AV sync can be updated.
-  _rtpRtcpModule->SetRemoteSSRC(ssrc);
-}
-
-void Channel::OnIncomingCSRCChanged(uint32_t CSRC, bool added) {
-  WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId, _channelId),
-               "Channel::OnIncomingCSRCChanged(CSRC=%d, added=%d)", CSRC,
-               added);
-}
-
-int32_t Channel::OnInitializeDecoder(
-    int8_t payloadType,
-    const char payloadName[RTP_PAYLOAD_NAME_SIZE],
-    int frequency,
-    size_t channels,
-    uint32_t rate) {
-  WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId, _channelId),
-               "Channel::OnInitializeDecoder(payloadType=%d, "
-               "payloadName=%s, frequency=%u, channels=%" PRIuS ", rate=%u)",
-               payloadType, payloadName, frequency, channels, rate);
-
-  CodecInst receiveCodec = {0};
-  CodecInst dummyCodec = {0};
-
-  receiveCodec.pltype = payloadType;
-  receiveCodec.plfreq = frequency;
-  receiveCodec.channels = channels;
-  receiveCodec.rate = rate;
-  strncpy(receiveCodec.plname, payloadName, RTP_PAYLOAD_NAME_SIZE - 1);
-
-  audio_coding_->Codec(payloadName, &dummyCodec, frequency, channels);
-  receiveCodec.pacsize = dummyCodec.pacsize;
-
-  // Register the new codec to the ACM
-  if (!audio_coding_->RegisterReceiveCodec(receiveCodec.pltype,
-                                           CodecInstToSdp(receiveCodec))) {
-    WEBRTC_TRACE(kTraceWarning, kTraceVoice, VoEId(_instanceId, _channelId),
-                 "Channel::OnInitializeDecoder() invalid codec ("
-                 "pt=%d, name=%s) received - 1",
-                 payloadType, payloadName);
-    _engineStatisticsPtr->SetLastError(VE_AUDIO_CODING_MODULE_ERROR);
-    return -1;
-  }
-
-  return 0;
-}
-
-int32_t Channel::OnReceivedPayloadData(const uint8_t* payloadData,
-                                       size_t payloadSize,
-                                       const WebRtcRTPHeader* rtpHeader) {
-  WEBRTC_TRACE(kTraceStream, kTraceVoice, VoEId(_instanceId, _channelId),
-               "Channel::OnReceivedPayloadData(payloadSize=%" PRIuS
-               ","
-               " payloadType=%u, audioChannel=%" PRIuS ")",
-               payloadSize, rtpHeader->header.payloadType,
-               rtpHeader->type.Audio.channel);
-
-  if (!channel_state_.Get().playing) {
-    // Avoid inserting into NetEQ when we are not playing. Count the
-    // packet as discarded.
-    WEBRTC_TRACE(kTraceStream, kTraceVoice, VoEId(_instanceId, _channelId),
-                 "received packet is discarded since playing is not"
-                 " activated");
-    return 0;
-  }
-
-  // Push the incoming payload (parsed and ready for decoding) into the ACM
-  if (audio_coding_->IncomingPacket(payloadData, payloadSize, *rtpHeader) !=
-      0) {
-    _engineStatisticsPtr->SetLastError(
-        VE_AUDIO_CODING_MODULE_ERROR, kTraceWarning,
-        "Channel::OnReceivedPayloadData() unable to push data to the ACM");
-    return -1;
-  }
-
-  int64_t round_trip_time = 0;
-  _rtpRtcpModule->RTT(rtp_receiver_->SSRC(), &round_trip_time, NULL, NULL,
-                      NULL);
-
-  std::vector<uint16_t> nack_list = audio_coding_->GetNackList(round_trip_time);
-  if (!nack_list.empty()) {
-    // Can't use nack_list.data() since it's not supported by all
-    // compilers.
-    ResendPackets(&(nack_list[0]), static_cast<int>(nack_list.size()));
-  }
-  return 0;
-}
-
-bool Channel::OnRecoveredPacket(const uint8_t* rtp_packet,
-                                size_t rtp_packet_length) {
-  RTPHeader header;
-  if (!rtp_header_parser_->Parse(rtp_packet, rtp_packet_length, &header)) {
-    WEBRTC_TRACE(kTraceDebug, webrtc::kTraceVoice, _channelId,
-                 "IncomingPacket invalid RTP header");
-    return false;
-  }
-  header.payload_type_frequency =
-      rtp_payload_registry_->GetPayloadTypeFrequency(header.payloadType);
-  if (header.payload_type_frequency < 0)
-    return false;
-  return ReceivePacket(rtp_packet, rtp_packet_length, header, false);
-}
-
-MixerParticipant::AudioFrameInfo Channel::GetAudioFrameWithMuted(
-    int32_t id,
-    AudioFrame* audioFrame) {
-  unsigned int ssrc;
-  RTC_CHECK_EQ(GetRemoteSSRC(ssrc), 0);
-  event_log_proxy_->LogAudioPlayout(ssrc);
-  // Get 10ms raw PCM data from the ACM (mixer limits output frequency)
-  bool muted;
-  if (audio_coding_->PlayoutData10Ms(audioFrame->sample_rate_hz_, audioFrame,
-                                     &muted) == -1) {
-    WEBRTC_TRACE(kTraceError, kTraceVoice, VoEId(_instanceId, _channelId),
-                 "Channel::GetAudioFrame() PlayoutData10Ms() failed!");
-    // In all likelihood, the audio in this frame is garbage. We return an
-    // error so that the audio mixer module doesn't add it to the mix. As
-    // a result, it won't be played out and the actions skipped here are
-    // irrelevant.
-    return MixerParticipant::AudioFrameInfo::kError;
-  }
-
-  if (muted) {
-    // TODO(henrik.lundin): We should be able to do better than this. But we
-    // will have to go through all the cases below where the audio samples may
-    // be used, and handle the muted case in some way.
-    AudioFrameOperations::Mute(audioFrame);
-  }
-
-  // Convert module ID to internal VoE channel ID
-  audioFrame->id_ = VoEChannelId(audioFrame->id_);
-  // Store speech type for dead-or-alive detection
-  _outputSpeechType = audioFrame->speech_type_;
-
-  ChannelState::State state = channel_state_.Get();
-
-  {
-    // Pass the audio buffers to an optional sink callback, before applying
-    // scaling/panning, as that applies to the mix operation.
-    // External recipients of the audio (e.g. via AudioTrack), will do their
-    // own mixing/dynamic processing.
-    rtc::CritScope cs(&_callbackCritSect);
-    if (audio_sink_) {
-      AudioSinkInterface::Data data(
-          audioFrame->data(), audioFrame->samples_per_channel_,
-          audioFrame->sample_rate_hz_, audioFrame->num_channels_,
-          audioFrame->timestamp_);
-      audio_sink_->OnData(data);
-    }
-  }
-
-  float output_gain = 1.0f;
-  {
-    rtc::CritScope cs(&volume_settings_critsect_);
-    output_gain = _outputGain;
-  }
-
-  // Output volume scaling
-  if (output_gain < 0.99f || output_gain > 1.01f) {
-    // TODO(solenberg): Combine with mute state - this can cause clicks!
-    AudioFrameOperations::ScaleWithSat(output_gain, audioFrame);
-  }
-
-  // Mix decoded PCM output with file if file mixing is enabled
-  if (state.output_file_playing) {
-    MixAudioWithFile(*audioFrame, audioFrame->sample_rate_hz_);
-    muted = false;  // We may have added non-zero samples.
-  }
-
-  // Record playout if enabled
-  {
-    rtc::CritScope cs(&_fileCritSect);
-
-    if (_outputFileRecording && output_file_recorder_) {
-      output_file_recorder_->RecordAudioToFile(*audioFrame);
-    }
-  }
-
-  // Measure audio level (0-9)
-  // TODO(henrik.lundin) Use the |muted| information here too.
-  // TODO(deadbeef): Use RmsLevel for |_outputAudioLevel| (see
-  // https://crbug.com/webrtc/7517).
-  _outputAudioLevel.ComputeLevel(*audioFrame, kAudioSampleDurationSeconds);
-
-  if (capture_start_rtp_time_stamp_ < 0 && audioFrame->timestamp_ != 0) {
-    // The first frame with a valid rtp timestamp.
-    capture_start_rtp_time_stamp_ = audioFrame->timestamp_;
-  }
-
-  if (capture_start_rtp_time_stamp_ >= 0) {
-    // audioFrame.timestamp_ should be valid from now on.
-
-    // Compute elapsed time.
-    int64_t unwrap_timestamp =
-        rtp_ts_wraparound_handler_->Unwrap(audioFrame->timestamp_);
-    audioFrame->elapsed_time_ms_ =
-        (unwrap_timestamp - capture_start_rtp_time_stamp_) /
-        (GetRtpTimestampRateHz() / 1000);
-
-    {
-      rtc::CritScope lock(&ts_stats_lock_);
-      // Compute ntp time.
-      audioFrame->ntp_time_ms_ =
-          ntp_estimator_.Estimate(audioFrame->timestamp_);
-      // |ntp_time_ms_| won't be valid until at least 2 RTCP SRs are received.
-      if (audioFrame->ntp_time_ms_ > 0) {
-        // Compute |capture_start_ntp_time_ms_| so that
-        // |capture_start_ntp_time_ms_| + |elapsed_time_ms_| == |ntp_time_ms_|
-        capture_start_ntp_time_ms_ =
-            audioFrame->ntp_time_ms_ - audioFrame->elapsed_time_ms_;
-      }
-    }
-  }
-
-  return muted ? MixerParticipant::AudioFrameInfo::kMuted
-               : MixerParticipant::AudioFrameInfo::kNormal;
-}
-
-AudioMixer::Source::AudioFrameInfo Channel::GetAudioFrameWithInfo(
-    int sample_rate_hz,
-    AudioFrame* audio_frame) {
-  audio_frame->sample_rate_hz_ = sample_rate_hz;
-
-  const auto frame_info = GetAudioFrameWithMuted(-1, audio_frame);
-
-  using FrameInfo = AudioMixer::Source::AudioFrameInfo;
-  FrameInfo new_audio_frame_info = FrameInfo::kError;
-  switch (frame_info) {
-    case MixerParticipant::AudioFrameInfo::kNormal:
-      new_audio_frame_info = FrameInfo::kNormal;
-      break;
-    case MixerParticipant::AudioFrameInfo::kMuted:
-      new_audio_frame_info = FrameInfo::kMuted;
-      break;
-    case MixerParticipant::AudioFrameInfo::kError:
-      new_audio_frame_info = FrameInfo::kError;
-      break;
-  }
-  return new_audio_frame_info;
-}
-
-int32_t Channel::NeededFrequency(int32_t id) const {
-  WEBRTC_TRACE(kTraceStream, kTraceVoice, VoEId(_instanceId, _channelId),
-               "Channel::NeededFrequency(id=%d)", id);
-
-  int highestNeeded = 0;
-
-  // Determine highest needed receive frequency
-  int32_t receiveFrequency = audio_coding_->ReceiveFrequency();
-
-  // Return the bigger of playout and receive frequency in the ACM.
-  if (audio_coding_->PlayoutFrequency() > receiveFrequency) {
-    highestNeeded = audio_coding_->PlayoutFrequency();
-  } else {
-    highestNeeded = receiveFrequency;
-  }
-
-  // Special case, if we're playing a file on the playout side
-  // we take that frequency into consideration as well
-  // This is not needed on sending side, since the codec will
-  // limit the spectrum anyway.
-  if (channel_state_.Get().output_file_playing) {
-    rtc::CritScope cs(&_fileCritSect);
-    if (output_file_player_) {
-      if (output_file_player_->Frequency() > highestNeeded) {
-        highestNeeded = output_file_player_->Frequency();
-      }
-    }
-  }
-
-  return (highestNeeded);
-}
-
-int32_t Channel::CreateChannel(Channel*& channel,
-                               int32_t channelId,
-                               uint32_t instanceId,
-                               const VoEBase::ChannelConfig& config) {
-  WEBRTC_TRACE(kTraceMemory, kTraceVoice, VoEId(instanceId, channelId),
-               "Channel::CreateChannel(channelId=%d, instanceId=%d)", channelId,
-               instanceId);
-
-  channel = new Channel(channelId, instanceId, config);
-  if (channel == NULL) {
-    WEBRTC_TRACE(kTraceMemory, kTraceVoice, VoEId(instanceId, channelId),
-                 "Channel::CreateChannel() unable to allocate memory for"
-                 " channel");
-    return -1;
-  }
-  return 0;
-}
-
-void Channel::PlayNotification(int32_t id, uint32_t durationMs) {
-  WEBRTC_TRACE(kTraceStream, kTraceVoice, VoEId(_instanceId, _channelId),
-               "Channel::PlayNotification(id=%d, durationMs=%d)", id,
-               durationMs);
-
-  // Not implement yet
-}
-
-void Channel::RecordNotification(int32_t id, uint32_t durationMs) {
-  WEBRTC_TRACE(kTraceStream, kTraceVoice, VoEId(_instanceId, _channelId),
-               "Channel::RecordNotification(id=%d, durationMs=%d)", id,
-               durationMs);
-
-  // Not implement yet
-}
-
-void Channel::PlayFileEnded(int32_t id) {
-  WEBRTC_TRACE(kTraceStream, kTraceVoice, VoEId(_instanceId, _channelId),
-               "Channel::PlayFileEnded(id=%d)", id);
-
-  if (id == _inputFilePlayerId) {
-    channel_state_.SetInputFilePlaying(false);
-    WEBRTC_TRACE(kTraceStateInfo, kTraceVoice, VoEId(_instanceId, _channelId),
-                 "Channel::PlayFileEnded() => input file player module is"
-                 " shutdown");
-  } else if (id == _outputFilePlayerId) {
-    channel_state_.SetOutputFilePlaying(false);
-    WEBRTC_TRACE(kTraceStateInfo, kTraceVoice, VoEId(_instanceId, _channelId),
-                 "Channel::PlayFileEnded() => output file player module is"
-                 " shutdown");
-  }
-}
-
-void Channel::RecordFileEnded(int32_t id) {
-  WEBRTC_TRACE(kTraceStream, kTraceVoice, VoEId(_instanceId, _channelId),
-               "Channel::RecordFileEnded(id=%d)", id);
-
-  assert(id == _outputFileRecorderId);
-
-  rtc::CritScope cs(&_fileCritSect);
-
-  _outputFileRecording = false;
-  WEBRTC_TRACE(kTraceStateInfo, kTraceVoice, VoEId(_instanceId, _channelId),
-               "Channel::RecordFileEnded() => output file recorder module is"
-               " shutdown");
-}
-
-Channel::Channel(int32_t channelId,
-                 uint32_t instanceId,
-                 const VoEBase::ChannelConfig& config)
-    : _instanceId(instanceId),
-      _channelId(channelId),
-      event_log_proxy_(new RtcEventLogProxy()),
-      rtcp_rtt_stats_proxy_(new RtcpRttStatsProxy()),
-      rtp_header_parser_(RtpHeaderParser::Create()),
-      rtp_payload_registry_(new RTPPayloadRegistry()),
-      rtp_receive_statistics_(
-          ReceiveStatistics::Create(Clock::GetRealTimeClock())),
-      rtp_receiver_(
-          RtpReceiver::CreateAudioReceiver(Clock::GetRealTimeClock(),
-                                           this,
-                                           this,
-                                           rtp_payload_registry_.get())),
-      telephone_event_handler_(rtp_receiver_->GetTelephoneEventHandler()),
-      _outputAudioLevel(),
-      _externalTransport(false),
-      // Avoid conflict with other channels by adding 1024 - 1026,
-      // won't use as much as 1024 channels.
-      _inputFilePlayerId(VoEModuleId(instanceId, channelId) + 1024),
-      _outputFilePlayerId(VoEModuleId(instanceId, channelId) + 1025),
-      _outputFileRecorderId(VoEModuleId(instanceId, channelId) + 1026),
-      _outputFileRecording(false),
-      _timeStamp(0),  // This is just an offset, RTP module will add it's own
-                      // random offset
-      ntp_estimator_(Clock::GetRealTimeClock()),
-      playout_timestamp_rtp_(0),
-      playout_delay_ms_(0),
-      send_sequence_number_(0),
-      rtp_ts_wraparound_handler_(new rtc::TimestampWrapAroundHandler()),
-      capture_start_rtp_time_stamp_(-1),
-      capture_start_ntp_time_ms_(-1),
-      _engineStatisticsPtr(NULL),
-      _outputMixerPtr(NULL),
-      _moduleProcessThreadPtr(NULL),
-      _audioDeviceModulePtr(NULL),
-      _voiceEngineObserverPtr(NULL),
-      _callbackCritSectPtr(NULL),
-      _transportPtr(NULL),
-      input_mute_(false),
-      previous_frame_muted_(false),
-      _outputGain(1.0f),
-      _mixFileWithMicrophone(false),
-      _includeAudioLevelIndication(false),
-      transport_overhead_per_packet_(0),
-      rtp_overhead_per_packet_(0),
-      _outputSpeechType(AudioFrame::kNormalSpeech),
-      rtcp_observer_(new VoERtcpObserver(this)),
-      associate_send_channel_(ChannelOwner(nullptr)),
-      pacing_enabled_(config.enable_voice_pacing),
-      feedback_observer_proxy_(new TransportFeedbackProxy()),
-      seq_num_allocator_proxy_(new TransportSequenceNumberProxy()),
-      rtp_packet_sender_proxy_(new RtpPacketSenderProxy()),
-      retransmission_rate_limiter_(new RateLimiter(Clock::GetRealTimeClock(),
-                                                   kMaxRetransmissionWindowMs)),
-      decoder_factory_(config.acm_config.decoder_factory),
-      use_twcc_plr_for_ana_(
-          webrtc::field_trial::FindFullName("UseTwccPlrForAna") == "Enabled") {
-  WEBRTC_TRACE(kTraceMemory, kTraceVoice, VoEId(_instanceId, _channelId),
-               "Channel::Channel() - ctor");
-  AudioCodingModule::Config acm_config(config.acm_config);
-  acm_config.id = VoEModuleId(instanceId, channelId);
-  acm_config.neteq_config.enable_muted_state = true;
-  audio_coding_.reset(AudioCodingModule::Create(acm_config));
-
-  _outputAudioLevel.Clear();
-
-  RtpRtcp::Configuration configuration;
-  configuration.audio = true;
-  configuration.outgoing_transport = this;
-  configuration.overhead_observer = this;
-  configuration.receive_statistics = rtp_receive_statistics_.get();
-  configuration.bandwidth_callback = rtcp_observer_.get();
-  if (pacing_enabled_) {
-    configuration.paced_sender = rtp_packet_sender_proxy_.get();
-    configuration.transport_sequence_number_allocator =
-        seq_num_allocator_proxy_.get();
-    configuration.transport_feedback_callback = feedback_observer_proxy_.get();
-  }
-  configuration.event_log = &(*event_log_proxy_);
-  configuration.rtt_stats = &(*rtcp_rtt_stats_proxy_);
-  configuration.retransmission_rate_limiter =
-      retransmission_rate_limiter_.get();
-
-  _rtpRtcpModule.reset(RtpRtcp::CreateRtpRtcp(configuration));
-  _rtpRtcpModule->SetSendingMediaStatus(false);
-}
-
-Channel::~Channel() {
-  RTC_DCHECK(!channel_state_.Get().sending);
-  RTC_DCHECK(!channel_state_.Get().playing);
-}
-
-int32_t Channel::Init() {
-  RTC_DCHECK(construction_thread_.CalledOnValidThread());
-  WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId, _channelId),
-               "Channel::Init()");
-
-  channel_state_.Reset();
-
-  // --- Initial sanity
-
-  if ((_engineStatisticsPtr == NULL) || (_moduleProcessThreadPtr == NULL)) {
-    WEBRTC_TRACE(kTraceError, kTraceVoice, VoEId(_instanceId, _channelId),
-                 "Channel::Init() must call SetEngineInformation() first");
-    return -1;
-  }
-
-  // --- Add modules to process thread (for periodic schedulation)
-
-  _moduleProcessThreadPtr->RegisterModule(_rtpRtcpModule.get(), RTC_FROM_HERE);
-
-  // --- ACM initialization
-
-  if (audio_coding_->InitializeReceiver() == -1) {
-    _engineStatisticsPtr->SetLastError(
-        VE_AUDIO_CODING_MODULE_ERROR, kTraceError,
-        "Channel::Init() unable to initialize the ACM - 1");
-    return -1;
-  }
-
-  // --- RTP/RTCP module initialization
-
-  // Ensure that RTCP is enabled by default for the created channel.
-  // Note that, the module will keep generating RTCP until it is explicitly
-  // disabled by the user.
-  // After StopListen (when no sockets exists), RTCP packets will no longer
-  // be transmitted since the Transport object will then be invalid.
-  telephone_event_handler_->SetTelephoneEventForwardToDecoder(true);
-  // RTCP is enabled by default.
-  _rtpRtcpModule->SetRTCPStatus(RtcpMode::kCompound);
-  // --- Register all permanent callbacks
-  if (audio_coding_->RegisterTransportCallback(this) == -1) {
-    _engineStatisticsPtr->SetLastError(
-        VE_CANNOT_INIT_CHANNEL, kTraceError,
-        "Channel::Init() callbacks not registered");
-    return -1;
-  }
-
-  // Register a default set of send codecs.
-  const int nSupportedCodecs = AudioCodingModule::NumberOfCodecs();
-  for (int idx = 0; idx < nSupportedCodecs; idx++) {
-    CodecInst codec;
-    RTC_CHECK_EQ(0, audio_coding_->Codec(idx, &codec));
-
-    // Ensure that PCMU is used as default send codec.
-    if (STR_CASE_CMP(codec.plname, "PCMU") == 0 && codec.channels == 1) {
-      SetSendCodec(codec);
-    }
-
-    // Register default PT for 'telephone-event'
-    if (STR_CASE_CMP(codec.plname, "telephone-event") == 0) {
-      if (_rtpRtcpModule->RegisterSendPayload(codec) == -1) {
-        WEBRTC_TRACE(kTraceWarning, kTraceVoice, VoEId(_instanceId, _channelId),
-                     "Channel::Init() failed to register outband "
-                     "'telephone-event' (%d/%d) correctly",
-                     codec.pltype, codec.plfreq);
-      }
-    }
-
-    if (STR_CASE_CMP(codec.plname, "CN") == 0) {
-      if (!codec_manager_.RegisterEncoder(codec) ||
-          !codec_manager_.MakeEncoder(&rent_a_codec_, audio_coding_.get()) ||
-          _rtpRtcpModule->RegisterSendPayload(codec) == -1) {
-        WEBRTC_TRACE(kTraceWarning, kTraceVoice, VoEId(_instanceId, _channelId),
-                     "Channel::Init() failed to register CN (%d/%d) "
-                     "correctly - 1",
-                     codec.pltype, codec.plfreq);
-      }
-    }
-  }
-
-  return 0;
-}
-
-void Channel::RegisterLegacyReceiveCodecs() {
-  const int nSupportedCodecs = AudioCodingModule::NumberOfCodecs();
-  for (int idx = 0; idx < nSupportedCodecs; idx++) {
-    CodecInst codec;
-    RTC_CHECK_EQ(0, audio_coding_->Codec(idx, &codec));
-
-    // Open up the RTP/RTCP receiver for all supported codecs
-    if (rtp_receiver_->RegisterReceivePayload(codec) == -1) {
-      WEBRTC_TRACE(kTraceWarning, kTraceVoice, VoEId(_instanceId, _channelId),
-                   "Channel::Init() unable to register %s "
-                   "(%d/%d/%" PRIuS "/%d) to RTP/RTCP receiver",
-                   codec.plname, codec.pltype, codec.plfreq, codec.channels,
-                   codec.rate);
-    } else {
-      WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId, _channelId),
-                   "Channel::Init() %s (%d/%d/%" PRIuS
-                   "/%d) has been "
-                   "added to the RTP/RTCP receiver",
-                   codec.plname, codec.pltype, codec.plfreq, codec.channels,
-                   codec.rate);
-    }
-
-    // Register default PT for 'telephone-event'
-    if (STR_CASE_CMP(codec.plname, "telephone-event") == 0) {
-      if (!audio_coding_->RegisterReceiveCodec(codec.pltype,
-                                               CodecInstToSdp(codec))) {
-        WEBRTC_TRACE(kTraceWarning, kTraceVoice, VoEId(_instanceId, _channelId),
-                     "Channel::Init() failed to register inband "
-                     "'telephone-event' (%d/%d) correctly",
-                     codec.pltype, codec.plfreq);
-      }
-    }
-
-    if (STR_CASE_CMP(codec.plname, "CN") == 0) {
-      if (!audio_coding_->RegisterReceiveCodec(codec.pltype,
-                                               CodecInstToSdp(codec))) {
-        WEBRTC_TRACE(kTraceWarning, kTraceVoice, VoEId(_instanceId, _channelId),
-                     "Channel::Init() failed to register CN (%d/%d) "
-                     "correctly - 1",
-                     codec.pltype, codec.plfreq);
-      }
-    }
-  }
-}
-
-void Channel::Terminate() {
-  RTC_DCHECK(construction_thread_.CalledOnValidThread());
-  // Must be called on the same thread as Init().
-  WEBRTC_TRACE(kTraceMemory, kTraceVoice, VoEId(_instanceId, _channelId),
-               "Channel::Terminate");
-
-  rtp_receive_statistics_->RegisterRtcpStatisticsCallback(NULL);
-
-  StopSend();
-  StopPlayout();
-
-  {
-    rtc::CritScope cs(&_fileCritSect);
-    if (input_file_player_) {
-      input_file_player_->RegisterModuleFileCallback(NULL);
-      input_file_player_->StopPlayingFile();
-    }
-    if (output_file_player_) {
-      output_file_player_->RegisterModuleFileCallback(NULL);
-      output_file_player_->StopPlayingFile();
-    }
-    if (output_file_recorder_) {
-      output_file_recorder_->RegisterModuleFileCallback(NULL);
-      output_file_recorder_->StopRecording();
-    }
-  }
-
-  // The order to safely shutdown modules in a channel is:
-  // 1. De-register callbacks in modules
-  // 2. De-register modules in process thread
-  // 3. Destroy modules
-  if (audio_coding_->RegisterTransportCallback(NULL) == -1) {
-    WEBRTC_TRACE(kTraceWarning, kTraceVoice, VoEId(_instanceId, _channelId),
-                 "Terminate() failed to de-register transport callback"
-                 " (Audio coding module)");
-  }
-
-  if (audio_coding_->RegisterVADCallback(NULL) == -1) {
-    WEBRTC_TRACE(kTraceWarning, kTraceVoice, VoEId(_instanceId, _channelId),
-                 "Terminate() failed to de-register VAD callback"
-                 " (Audio coding module)");
-  }
-
-  // De-register modules in process thread
-  if (_moduleProcessThreadPtr)
-    _moduleProcessThreadPtr->DeRegisterModule(_rtpRtcpModule.get());
-
-  // End of modules shutdown
-}
-
-int32_t Channel::SetEngineInformation(Statistics& engineStatistics,
-                                      OutputMixer& outputMixer,
-                                      ProcessThread& moduleProcessThread,
-                                      AudioDeviceModule& audioDeviceModule,
-                                      VoiceEngineObserver* voiceEngineObserver,
-                                      rtc::CriticalSection* callbackCritSect,
-                                      rtc::TaskQueue* encoder_queue) {
-  RTC_DCHECK(encoder_queue);
-  RTC_DCHECK(!encoder_queue_);
-  WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId, _channelId),
-               "Channel::SetEngineInformation()");
-  _engineStatisticsPtr = &engineStatistics;
-  _outputMixerPtr = &outputMixer;
-  _moduleProcessThreadPtr = &moduleProcessThread;
-  _audioDeviceModulePtr = &audioDeviceModule;
-  _voiceEngineObserverPtr = voiceEngineObserver;
-  _callbackCritSectPtr = callbackCritSect;
-  encoder_queue_ = encoder_queue;
-  return 0;
-}
-
-void Channel::SetSink(std::unique_ptr<AudioSinkInterface> sink) {
-  rtc::CritScope cs(&_callbackCritSect);
-  audio_sink_ = std::move(sink);
-}
-
-const rtc::scoped_refptr<AudioDecoderFactory>&
-Channel::GetAudioDecoderFactory() const {
-  return decoder_factory_;
-}
-
-int32_t Channel::StartPlayout() {
-  WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId, _channelId),
-               "Channel::StartPlayout()");
-  if (channel_state_.Get().playing) {
-    return 0;
-  }
-
-  // Add participant as candidates for mixing.
-  if (_outputMixerPtr->SetMixabilityStatus(*this, true) != 0) {
-    _engineStatisticsPtr->SetLastError(
-        VE_AUDIO_CONF_MIX_MODULE_ERROR, kTraceError,
-        "StartPlayout() failed to add participant to mixer");
-    return -1;
-  }
-
-  channel_state_.SetPlaying(true);
-  if (RegisterFilePlayingToMixer() != 0)
-    return -1;
-
-  return 0;
-}
-
-int32_t Channel::StopPlayout() {
-  WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId, _channelId),
-               "Channel::StopPlayout()");
-  if (!channel_state_.Get().playing) {
-    return 0;
-  }
-
-  // Remove participant as candidates for mixing
-  if (_outputMixerPtr->SetMixabilityStatus(*this, false) != 0) {
-    _engineStatisticsPtr->SetLastError(
-        VE_AUDIO_CONF_MIX_MODULE_ERROR, kTraceError,
-        "StopPlayout() failed to remove participant from mixer");
-    return -1;
-  }
-
-  channel_state_.SetPlaying(false);
-  _outputAudioLevel.Clear();
-
-  return 0;
-}
-
-int32_t Channel::StartSend() {
-  WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId, _channelId),
-               "Channel::StartSend()");
-  if (channel_state_.Get().sending) {
-    return 0;
-  }
-  channel_state_.SetSending(true);
-  {
-    // It is now OK to start posting tasks to the encoder task queue.
-    rtc::CritScope cs(&encoder_queue_lock_);
-    encoder_queue_is_active_ = true;
-  }
-  // Resume the previous sequence number which was reset by StopSend(). This
-  // needs to be done before |sending| is set to true on the RTP/RTCP module.
-  if (send_sequence_number_) {
-    _rtpRtcpModule->SetSequenceNumber(send_sequence_number_);
-  }
-  _rtpRtcpModule->SetSendingMediaStatus(true);
-  if (_rtpRtcpModule->SetSendingStatus(true) != 0) {
-    _engineStatisticsPtr->SetLastError(
-        VE_RTP_RTCP_MODULE_ERROR, kTraceError,
-        "StartSend() RTP/RTCP failed to start sending");
-    _rtpRtcpModule->SetSendingMediaStatus(false);
-    rtc::CritScope cs(&_callbackCritSect);
-    channel_state_.SetSending(false);
-    return -1;
-  }
-
-  return 0;
-}
-
-void Channel::StopSend() {
-  WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId, _channelId),
-               "Channel::StopSend()");
-  if (!channel_state_.Get().sending) {
-    return;
-  }
-  channel_state_.SetSending(false);
-
-  // Post a task to the encoder thread which sets an event when the task is
-  // executed. We know that no more encoding tasks will be added to the task
-  // queue for this channel since sending is now deactivated. It means that,
-  // if we wait for the event to bet set, we know that no more pending tasks
-  // exists and it is therfore guaranteed that the task queue will never try
-  // to acccess and invalid channel object.
-  RTC_DCHECK(encoder_queue_);
-
-  rtc::Event flush(false, false);
-  {
-    // Clear |encoder_queue_is_active_| under lock to prevent any other tasks
-    // than this final "flush task" to be posted on the queue.
-    rtc::CritScope cs(&encoder_queue_lock_);
-    encoder_queue_is_active_ = false;
-    encoder_queue_->PostTask([&flush]() { flush.Set(); });
-  }
-  flush.Wait(rtc::Event::kForever);
-
-  // Store the sequence number to be able to pick up the same sequence for
-  // the next StartSend(). This is needed for restarting device, otherwise
-  // it might cause libSRTP to complain about packets being replayed.
-  // TODO(xians): Remove this workaround after RtpRtcpModule's refactoring
-  // CL is landed. See issue
-  // https://code.google.com/p/webrtc/issues/detail?id=2111 .
-  send_sequence_number_ = _rtpRtcpModule->SequenceNumber();
-
-  // Reset sending SSRC and sequence number and triggers direct transmission
-  // of RTCP BYE
-  if (_rtpRtcpModule->SetSendingStatus(false) == -1) {
-    _engineStatisticsPtr->SetLastError(
-        VE_RTP_RTCP_MODULE_ERROR, kTraceWarning,
-        "StartSend() RTP/RTCP failed to stop sending");
-  }
-  _rtpRtcpModule->SetSendingMediaStatus(false);
-}
-
-bool Channel::SetEncoder(int payload_type,
-                         std::unique_ptr<AudioEncoder> encoder) {
-  RTC_DCHECK_GE(payload_type, 0);
-  RTC_DCHECK_LE(payload_type, 127);
-  // TODO(ossu): Make CodecInsts up, for now: one for the RTP/RTCP module and
-  // one for for us to keep track of sample rate and number of channels, etc.
-
-  // The RTP/RTCP module needs to know the RTP timestamp rate (i.e. clockrate)
-  // as well as some other things, so we collect this info and send it along.
-  CodecInst rtp_codec;
-  rtp_codec.pltype = payload_type;
-  strncpy(rtp_codec.plname, "audio", sizeof(rtp_codec.plname));
-  rtp_codec.plname[sizeof(rtp_codec.plname) - 1] = 0;
-  // Seems unclear if it should be clock rate or sample rate. CodecInst
-  // supposedly carries the sample rate, but only clock rate seems sensible to
-  // send to the RTP/RTCP module.
-  rtp_codec.plfreq = encoder->RtpTimestampRateHz();
-  rtp_codec.pacsize = rtc::CheckedDivExact(
-      static_cast<int>(encoder->Max10MsFramesInAPacket() * rtp_codec.plfreq),
-      100);
-  rtp_codec.channels = encoder->NumChannels();
-  rtp_codec.rate = 0;
-
-  // For audio encoding we need, instead, the actual sample rate of the codec.
-  // The rest of the information should be the same.
-  CodecInst send_codec = rtp_codec;
-  send_codec.plfreq = encoder->SampleRateHz();
-  cached_send_codec_.emplace(send_codec);
-
-  if (_rtpRtcpModule->RegisterSendPayload(rtp_codec) != 0) {
-    _rtpRtcpModule->DeRegisterSendPayload(payload_type);
-    if (_rtpRtcpModule->RegisterSendPayload(rtp_codec) != 0) {
-      WEBRTC_TRACE(
-          kTraceError, kTraceVoice, VoEId(_instanceId, _channelId),
-          "SetEncoder() failed to register codec to RTP/RTCP module");
-      return false;
-    }
-  }
-
-  audio_coding_->SetEncoder(std::move(encoder));
-  codec_manager_.UnsetCodecInst();
-  return true;
-}
-
-void Channel::ModifyEncoder(
-    rtc::FunctionView<void(std::unique_ptr<AudioEncoder>*)> modifier) {
-  audio_coding_->ModifyEncoder(modifier);
-}
-
-int32_t Channel::RegisterVoiceEngineObserver(VoiceEngineObserver& observer) {
-  WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId, _channelId),
-               "Channel::RegisterVoiceEngineObserver()");
-  rtc::CritScope cs(&_callbackCritSect);
-
-  if (_voiceEngineObserverPtr) {
-    _engineStatisticsPtr->SetLastError(
-        VE_INVALID_OPERATION, kTraceError,
-        "RegisterVoiceEngineObserver() observer already enabled");
-    return -1;
-  }
-  _voiceEngineObserverPtr = &observer;
-  return 0;
-}
-
-int32_t Channel::DeRegisterVoiceEngineObserver() {
-  WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId, _channelId),
-               "Channel::DeRegisterVoiceEngineObserver()");
-  rtc::CritScope cs(&_callbackCritSect);
-
-  if (!_voiceEngineObserverPtr) {
-    _engineStatisticsPtr->SetLastError(
-        VE_INVALID_OPERATION, kTraceWarning,
-        "DeRegisterVoiceEngineObserver() observer already disabled");
-    return 0;
-  }
-  _voiceEngineObserverPtr = NULL;
-  return 0;
-}
-
-int32_t Channel::GetSendCodec(CodecInst& codec) {
-  if (cached_send_codec_) {
-    codec = *cached_send_codec_;
-    return 0;
-  } else {
-    const CodecInst* send_codec = codec_manager_.GetCodecInst();
-    if (send_codec) {
-      codec = *send_codec;
-      return 0;
-    }
-  }
-  return -1;
-}
-
-int32_t Channel::GetRecCodec(CodecInst& codec) {
-  return (audio_coding_->ReceiveCodec(&codec));
-}
-
-int32_t Channel::SetSendCodec(const CodecInst& codec) {
-  WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId, _channelId),
-               "Channel::SetSendCodec()");
-
-  if (!codec_manager_.RegisterEncoder(codec) ||
-      !codec_manager_.MakeEncoder(&rent_a_codec_, audio_coding_.get())) {
-    WEBRTC_TRACE(kTraceError, kTraceVoice, VoEId(_instanceId, _channelId),
-                 "SetSendCodec() failed to register codec to ACM");
-    return -1;
-  }
-
-  if (_rtpRtcpModule->RegisterSendPayload(codec) != 0) {
-    _rtpRtcpModule->DeRegisterSendPayload(codec.pltype);
-    if (_rtpRtcpModule->RegisterSendPayload(codec) != 0) {
-      WEBRTC_TRACE(kTraceError, kTraceVoice, VoEId(_instanceId, _channelId),
-                   "SetSendCodec() failed to register codec to"
-                   " RTP/RTCP module");
-      return -1;
-    }
-  }
-
-  cached_send_codec_.reset();
-
-  return 0;
-}
-
-void Channel::SetBitRate(int bitrate_bps, int64_t probing_interval_ms) {
-  WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId, _channelId),
-               "Channel::SetBitRate(bitrate_bps=%d)", bitrate_bps);
-  audio_coding_->ModifyEncoder([&](std::unique_ptr<AudioEncoder>* encoder) {
-    if (*encoder) {
-      (*encoder)->OnReceivedUplinkBandwidth(
-          bitrate_bps, rtc::Optional<int64_t>(probing_interval_ms));
-    }
-  });
-  retransmission_rate_limiter_->SetMaxRate(bitrate_bps);
-}
-
-void Channel::OnTwccBasedUplinkPacketLossRate(float packet_loss_rate) {
-  if (!use_twcc_plr_for_ana_)
-    return;
-  audio_coding_->ModifyEncoder([&](std::unique_ptr<AudioEncoder>* encoder) {
-    if (*encoder) {
-      (*encoder)->OnReceivedUplinkPacketLossFraction(packet_loss_rate);
-    }
-  });
-}
-
-void Channel::OnRecoverableUplinkPacketLossRate(
-    float recoverable_packet_loss_rate) {
-  audio_coding_->ModifyEncoder([&](std::unique_ptr<AudioEncoder>* encoder) {
-    if (*encoder) {
-      (*encoder)->OnReceivedUplinkRecoverablePacketLossFraction(
-          recoverable_packet_loss_rate);
-    }
-  });
-}
-
-void Channel::OnUplinkPacketLossRate(float packet_loss_rate) {
-  if (use_twcc_plr_for_ana_)
-    return;
-  audio_coding_->ModifyEncoder([&](std::unique_ptr<AudioEncoder>* encoder) {
-    if (*encoder) {
-      (*encoder)->OnReceivedUplinkPacketLossFraction(packet_loss_rate);
-    }
-  });
-}
-
-int32_t Channel::SetVADStatus(bool enableVAD,
-                              ACMVADMode mode,
-                              bool disableDTX) {
-  WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId, _channelId),
-               "Channel::SetVADStatus(mode=%d)", mode);
-  RTC_DCHECK(!(disableDTX && enableVAD));  // disableDTX mode is deprecated.
-  if (!codec_manager_.SetVAD(enableVAD, mode) ||
-      !codec_manager_.MakeEncoder(&rent_a_codec_, audio_coding_.get())) {
-    _engineStatisticsPtr->SetLastError(VE_AUDIO_CODING_MODULE_ERROR,
-                                       kTraceError,
-                                       "SetVADStatus() failed to set VAD");
-    return -1;
-  }
-  return 0;
-}
-
-int32_t Channel::GetVADStatus(bool& enabledVAD,
-                              ACMVADMode& mode,
-                              bool& disabledDTX) {
-  const auto* params = codec_manager_.GetStackParams();
-  enabledVAD = params->use_cng;
-  mode = params->vad_mode;
-  disabledDTX = !params->use_cng;
-  return 0;
-}
-
-void Channel::SetReceiveCodecs(const std::map<int, SdpAudioFormat>& codecs) {
-  rtp_payload_registry_->SetAudioReceivePayloads(codecs);
-  audio_coding_->SetReceiveCodecs(codecs);
-}
-
-int32_t Channel::SetRecPayloadType(const CodecInst& codec) {
-  return SetRecPayloadType(codec.pltype, CodecInstToSdp(codec));
-}
-
-int32_t Channel::SetRecPayloadType(int payload_type,
-                                   const SdpAudioFormat& format) {
-  WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId, _channelId),
-               "Channel::SetRecPayloadType()");
-
-  if (channel_state_.Get().playing) {
-    _engineStatisticsPtr->SetLastError(
-        VE_ALREADY_PLAYING, kTraceError,
-        "SetRecPayloadType() unable to set PT while playing");
-    return -1;
-  }
-
-  const CodecInst codec = SdpToCodecInst(payload_type, format);
-
-  if (payload_type == -1) {
-    // De-register the selected codec (RTP/RTCP module and ACM)
-
-    int8_t pltype(-1);
-    CodecInst rxCodec = codec;
-
-    // Get payload type for the given codec
-    rtp_payload_registry_->ReceivePayloadType(rxCodec, &pltype);
-    rxCodec.pltype = pltype;
-
-    if (rtp_receiver_->DeRegisterReceivePayload(pltype) != 0) {
-      _engineStatisticsPtr->SetLastError(
-          VE_RTP_RTCP_MODULE_ERROR, kTraceError,
-          "SetRecPayloadType() RTP/RTCP-module deregistration "
-          "failed");
-      return -1;
-    }
-    if (audio_coding_->UnregisterReceiveCodec(rxCodec.pltype) != 0) {
-      _engineStatisticsPtr->SetLastError(
-          VE_AUDIO_CODING_MODULE_ERROR, kTraceError,
-          "SetRecPayloadType() ACM deregistration failed - 1");
-      return -1;
-    }
-    return 0;
-  }
-
-  if (rtp_receiver_->RegisterReceivePayload(codec) != 0) {
-    // First attempt to register failed => de-register and try again
-    // TODO(kwiberg): Retrying is probably not necessary, since
-    // AcmReceiver::AddCodec also retries.
-    rtp_receiver_->DeRegisterReceivePayload(codec.pltype);
-    if (rtp_receiver_->RegisterReceivePayload(codec) != 0) {
-      _engineStatisticsPtr->SetLastError(
-          VE_RTP_RTCP_MODULE_ERROR, kTraceError,
-          "SetRecPayloadType() RTP/RTCP-module registration failed");
-      return -1;
-    }
-  }
-  if (!audio_coding_->RegisterReceiveCodec(payload_type, format)) {
-    audio_coding_->UnregisterReceiveCodec(payload_type);
-    if (!audio_coding_->RegisterReceiveCodec(payload_type, format)) {
-      _engineStatisticsPtr->SetLastError(
-          VE_AUDIO_CODING_MODULE_ERROR, kTraceError,
-          "SetRecPayloadType() ACM registration failed - 1");
-      return -1;
-    }
-  }
-  return 0;
-}
-
-int32_t Channel::GetRecPayloadType(CodecInst& codec) {
-  int8_t payloadType(-1);
-  if (rtp_payload_registry_->ReceivePayloadType(codec, &payloadType) != 0) {
-    _engineStatisticsPtr->SetLastError(
-        VE_RTP_RTCP_MODULE_ERROR, kTraceWarning,
-        "GetRecPayloadType() failed to retrieve RX payload type");
-    return -1;
-  }
-  codec.pltype = payloadType;
-  return 0;
-}
-
-int32_t Channel::SetSendCNPayloadType(int type, PayloadFrequencies frequency) {
-  WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId, _channelId),
-               "Channel::SetSendCNPayloadType()");
-
-  CodecInst codec;
-  int32_t samplingFreqHz(-1);
-  const size_t kMono = 1;
-  if (frequency == kFreq32000Hz)
-    samplingFreqHz = 32000;
-  else if (frequency == kFreq16000Hz)
-    samplingFreqHz = 16000;
-
-  if (audio_coding_->Codec("CN", &codec, samplingFreqHz, kMono) == -1) {
-    _engineStatisticsPtr->SetLastError(
-        VE_AUDIO_CODING_MODULE_ERROR, kTraceError,
-        "SetSendCNPayloadType() failed to retrieve default CN codec "
-        "settings");
-    return -1;
-  }
-
-  // Modify the payload type (must be set to dynamic range)
-  codec.pltype = type;
-
-  if (!codec_manager_.RegisterEncoder(codec) ||
-      !codec_manager_.MakeEncoder(&rent_a_codec_, audio_coding_.get())) {
-    _engineStatisticsPtr->SetLastError(
-        VE_AUDIO_CODING_MODULE_ERROR, kTraceError,
-        "SetSendCNPayloadType() failed to register CN to ACM");
-    return -1;
-  }
-
-  if (_rtpRtcpModule->RegisterSendPayload(codec) != 0) {
-    _rtpRtcpModule->DeRegisterSendPayload(codec.pltype);
-    if (_rtpRtcpModule->RegisterSendPayload(codec) != 0) {
-      _engineStatisticsPtr->SetLastError(
-          VE_RTP_RTCP_MODULE_ERROR, kTraceError,
-          "SetSendCNPayloadType() failed to register CN to RTP/RTCP "
-          "module");
-      return -1;
-    }
-  }
-  return 0;
-}
-
-int Channel::SetOpusMaxPlaybackRate(int frequency_hz) {
-  WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId, _channelId),
-               "Channel::SetOpusMaxPlaybackRate()");
-
-  if (audio_coding_->SetOpusMaxPlaybackRate(frequency_hz) != 0) {
-    _engineStatisticsPtr->SetLastError(
-        VE_AUDIO_CODING_MODULE_ERROR, kTraceError,
-        "SetOpusMaxPlaybackRate() failed to set maximum playback rate");
-    return -1;
-  }
-  return 0;
-}
-
-int Channel::SetOpusDtx(bool enable_dtx) {
-  WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId, _channelId),
-               "Channel::SetOpusDtx(%d)", enable_dtx);
-  int ret = enable_dtx ? audio_coding_->EnableOpusDtx()
-                       : audio_coding_->DisableOpusDtx();
-  if (ret != 0) {
-    _engineStatisticsPtr->SetLastError(VE_AUDIO_CODING_MODULE_ERROR,
-                                       kTraceError, "SetOpusDtx() failed");
-    return -1;
-  }
-  return 0;
-}
-
-int Channel::GetOpusDtx(bool* enabled) {
-  int success = -1;
-  audio_coding_->QueryEncoder([&](AudioEncoder const* encoder) {
-    if (encoder) {
-      *enabled = encoder->GetDtx();
-      success = 0;
-    }
-  });
-  return success;
-}
-
-bool Channel::EnableAudioNetworkAdaptor(const std::string& config_string) {
-  bool success = false;
-  audio_coding_->ModifyEncoder([&](std::unique_ptr<AudioEncoder>* encoder) {
-    if (*encoder) {
-      success = (*encoder)->EnableAudioNetworkAdaptor(config_string,
-                                                      event_log_proxy_.get());
-    }
-  });
-  return success;
-}
-
-void Channel::DisableAudioNetworkAdaptor() {
-  audio_coding_->ModifyEncoder([&](std::unique_ptr<AudioEncoder>* encoder) {
-    if (*encoder)
-      (*encoder)->DisableAudioNetworkAdaptor();
-  });
-}
-
-void Channel::SetReceiverFrameLengthRange(int min_frame_length_ms,
-                                          int max_frame_length_ms) {
-  audio_coding_->ModifyEncoder([&](std::unique_ptr<AudioEncoder>* encoder) {
-    if (*encoder) {
-      (*encoder)->SetReceiverFrameLengthRange(min_frame_length_ms,
-                                              max_frame_length_ms);
-    }
-  });
-}
-
-int32_t Channel::RegisterExternalTransport(Transport* transport) {
-  WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId, _channelId),
-               "Channel::RegisterExternalTransport()");
-
-  rtc::CritScope cs(&_callbackCritSect);
-  if (_externalTransport) {
-    _engineStatisticsPtr->SetLastError(
-        VE_INVALID_OPERATION, kTraceError,
-        "RegisterExternalTransport() external transport already enabled");
-    return -1;
-  }
-  _externalTransport = true;
-  _transportPtr = transport;
-  return 0;
-}
-
-int32_t Channel::DeRegisterExternalTransport() {
-  WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId, _channelId),
-               "Channel::DeRegisterExternalTransport()");
-
-  rtc::CritScope cs(&_callbackCritSect);
-  if (_transportPtr) {
-    WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId, _channelId),
-                 "DeRegisterExternalTransport() all transport is disabled");
-  } else {
-    _engineStatisticsPtr->SetLastError(
-        VE_INVALID_OPERATION, kTraceWarning,
-        "DeRegisterExternalTransport() external transport already "
-        "disabled");
-  }
-  _externalTransport = false;
-  _transportPtr = NULL;
-  return 0;
-}
-
-// TODO(nisse): Delete this method together with ReceivedRTPPacket.
-// It's a temporary hack to support both ReceivedRTPPacket and
-// OnRtpPacket interfaces without too much code duplication.
-bool Channel::OnRtpPacketWithHeader(const uint8_t* received_packet,
-                                    size_t length,
-                                    RTPHeader *header) {
-  // Store playout timestamp for the received RTP packet
-  UpdatePlayoutTimestamp(false);
-
-  header->payload_type_frequency =
-      rtp_payload_registry_->GetPayloadTypeFrequency(header->payloadType);
-  if (header->payload_type_frequency < 0)
-    return false;
-  bool in_order = IsPacketInOrder(*header);
-  rtp_receive_statistics_->IncomingPacket(
-      *header, length, IsPacketRetransmitted(*header, in_order));
-  rtp_payload_registry_->SetIncomingPayloadType(*header);
-
-  return ReceivePacket(received_packet, length, *header, in_order);
-}
-
-int32_t Channel::ReceivedRTPPacket(const uint8_t* received_packet,
-                                   size_t length,
-                                   const PacketTime& packet_time) {
-  WEBRTC_TRACE(kTraceStream, kTraceVoice, VoEId(_instanceId, _channelId),
-               "Channel::ReceivedRTPPacket()");
-
-  RTPHeader header;
-  if (!rtp_header_parser_->Parse(received_packet, length, &header)) {
-    WEBRTC_TRACE(webrtc::kTraceDebug, webrtc::kTraceVoice, _channelId,
-                 "Incoming packet: invalid RTP header");
-    return -1;
-  }
-  return OnRtpPacketWithHeader(received_packet, length, &header) ? 0 : -1;
-}
-
-void Channel::OnRtpPacket(const RtpPacketReceived& packet) {
-  WEBRTC_TRACE(kTraceStream, kTraceVoice, VoEId(_instanceId, _channelId),
-               "Channel::ReceivedRTPPacket()");
-
-  RTPHeader header;
-  packet.GetHeader(&header);
-  OnRtpPacketWithHeader(packet.data(), packet.size(), &header);
-}
-
-bool Channel::ReceivePacket(const uint8_t* packet,
-                            size_t packet_length,
-                            const RTPHeader& header,
-                            bool in_order) {
-  const uint8_t* payload = packet + header.headerLength;
-  assert(packet_length >= header.headerLength);
-  size_t payload_length = packet_length - header.headerLength;
-  PayloadUnion payload_specific;
-  if (!rtp_payload_registry_->GetPayloadSpecifics(header.payloadType,
-                                                  &payload_specific)) {
-    return false;
-  }
-  return rtp_receiver_->IncomingRtpPacket(header, payload, payload_length,
-                                          payload_specific, in_order);
-}
-
-bool Channel::IsPacketInOrder(const RTPHeader& header) const {
-  StreamStatistician* statistician =
-      rtp_receive_statistics_->GetStatistician(header.ssrc);
-  if (!statistician)
-    return false;
-  return statistician->IsPacketInOrder(header.sequenceNumber);
-}
-
-bool Channel::IsPacketRetransmitted(const RTPHeader& header,
-                                    bool in_order) const {
-  StreamStatistician* statistician =
-      rtp_receive_statistics_->GetStatistician(header.ssrc);
-  if (!statistician)
-    return false;
-  // Check if this is a retransmission.
-  int64_t min_rtt = 0;
-  _rtpRtcpModule->RTT(rtp_receiver_->SSRC(), NULL, NULL, &min_rtt, NULL);
-  return !in_order && statistician->IsRetransmitOfOldPacket(header, min_rtt);
-}
-
-int32_t Channel::ReceivedRTCPPacket(const uint8_t* data, size_t length) {
-  WEBRTC_TRACE(kTraceStream, kTraceVoice, VoEId(_instanceId, _channelId),
-               "Channel::ReceivedRTCPPacket()");
-  // Store playout timestamp for the received RTCP packet
-  UpdatePlayoutTimestamp(true);
-
-  // Deliver RTCP packet to RTP/RTCP module for parsing
-  _rtpRtcpModule->IncomingRtcpPacket(data, length);
-
-  int64_t rtt = GetRTT(true);
-  if (rtt == 0) {
-    // Waiting for valid RTT.
-    return 0;
-  }
-
-  int64_t nack_window_ms = rtt;
-  if (nack_window_ms < kMinRetransmissionWindowMs) {
-    nack_window_ms = kMinRetransmissionWindowMs;
-  } else if (nack_window_ms > kMaxRetransmissionWindowMs) {
-    nack_window_ms = kMaxRetransmissionWindowMs;
-  }
-  retransmission_rate_limiter_->SetWindowSize(nack_window_ms);
-
-  // Invoke audio encoders OnReceivedRtt().
-  audio_coding_->ModifyEncoder([&](std::unique_ptr<AudioEncoder>* encoder) {
-    if (*encoder)
-      (*encoder)->OnReceivedRtt(rtt);
-  });
-
-  uint32_t ntp_secs = 0;
-  uint32_t ntp_frac = 0;
-  uint32_t rtp_timestamp = 0;
-  if (0 !=
-      _rtpRtcpModule->RemoteNTP(&ntp_secs, &ntp_frac, NULL, NULL,
-                                &rtp_timestamp)) {
-    // Waiting for RTCP.
-    return 0;
-  }
-
-  {
-    rtc::CritScope lock(&ts_stats_lock_);
-    ntp_estimator_.UpdateRtcpTimestamp(rtt, ntp_secs, ntp_frac, rtp_timestamp);
-  }
-  return 0;
-}
-
-int Channel::StartPlayingFileLocally(const char* fileName,
-                                     bool loop,
-                                     FileFormats format,
-                                     int startPosition,
-                                     float volumeScaling,
-                                     int stopPosition,
-                                     const CodecInst* codecInst) {
-  WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId, _channelId),
-               "Channel::StartPlayingFileLocally(fileNameUTF8[]=%s, loop=%d,"
-               " format=%d, volumeScaling=%5.3f, startPosition=%d, "
-               "stopPosition=%d)",
-               fileName, loop, format, volumeScaling, startPosition,
-               stopPosition);
-
-  if (channel_state_.Get().output_file_playing) {
-    _engineStatisticsPtr->SetLastError(
-        VE_ALREADY_PLAYING, kTraceError,
-        "StartPlayingFileLocally() is already playing");
-    return -1;
-  }
-
-  {
-    rtc::CritScope cs(&_fileCritSect);
-
-    if (output_file_player_) {
-      output_file_player_->RegisterModuleFileCallback(NULL);
-      output_file_player_.reset();
-    }
-
-    output_file_player_ = FilePlayer::CreateFilePlayer(
-        _outputFilePlayerId, (const FileFormats)format);
-
-    if (!output_file_player_) {
-      _engineStatisticsPtr->SetLastError(
-          VE_INVALID_ARGUMENT, kTraceError,
-          "StartPlayingFileLocally() filePlayer format is not correct");
-      return -1;
-    }
-
-    const uint32_t notificationTime(0);
-
-    if (output_file_player_->StartPlayingFile(
-            fileName, loop, startPosition, volumeScaling, notificationTime,
-            stopPosition, (const CodecInst*)codecInst) != 0) {
-      _engineStatisticsPtr->SetLastError(
-          VE_BAD_FILE, kTraceError,
-          "StartPlayingFile() failed to start file playout");
-      output_file_player_->StopPlayingFile();
-      output_file_player_.reset();
-      return -1;
-    }
-    output_file_player_->RegisterModuleFileCallback(this);
-    channel_state_.SetOutputFilePlaying(true);
-  }
-
-  if (RegisterFilePlayingToMixer() != 0)
-    return -1;
-
-  return 0;
-}
-
-int Channel::StartPlayingFileLocally(InStream* stream,
-                                     FileFormats format,
-                                     int startPosition,
-                                     float volumeScaling,
-                                     int stopPosition,
-                                     const CodecInst* codecInst) {
-  WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId, _channelId),
-               "Channel::StartPlayingFileLocally(format=%d,"
-               " volumeScaling=%5.3f, startPosition=%d, stopPosition=%d)",
-               format, volumeScaling, startPosition, stopPosition);
-
-  if (stream == NULL) {
-    _engineStatisticsPtr->SetLastError(
-        VE_BAD_FILE, kTraceError,
-        "StartPlayingFileLocally() NULL as input stream");
-    return -1;
-  }
-
-  if (channel_state_.Get().output_file_playing) {
-    _engineStatisticsPtr->SetLastError(
-        VE_ALREADY_PLAYING, kTraceError,
-        "StartPlayingFileLocally() is already playing");
-    return -1;
-  }
-
-  {
-    rtc::CritScope cs(&_fileCritSect);
-
-    // Destroy the old instance
-    if (output_file_player_) {
-      output_file_player_->RegisterModuleFileCallback(NULL);
-      output_file_player_.reset();
-    }
-
-    // Create the instance
-    output_file_player_ = FilePlayer::CreateFilePlayer(
-        _outputFilePlayerId, (const FileFormats)format);
-
-    if (!output_file_player_) {
-      _engineStatisticsPtr->SetLastError(
-          VE_INVALID_ARGUMENT, kTraceError,
-          "StartPlayingFileLocally() filePlayer format isnot correct");
-      return -1;
-    }
-
-    const uint32_t notificationTime(0);
-
-    if (output_file_player_->StartPlayingFile(stream, startPosition,
-                                              volumeScaling, notificationTime,
-                                              stopPosition, codecInst) != 0) {
-      _engineStatisticsPtr->SetLastError(VE_BAD_FILE, kTraceError,
-                                         "StartPlayingFile() failed to "
-                                         "start file playout");
-      output_file_player_->StopPlayingFile();
-      output_file_player_.reset();
-      return -1;
-    }
-    output_file_player_->RegisterModuleFileCallback(this);
-    channel_state_.SetOutputFilePlaying(true);
-  }
-
-  if (RegisterFilePlayingToMixer() != 0)
-    return -1;
-
-  return 0;
-}
-
-int Channel::StopPlayingFileLocally() {
-  WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId, _channelId),
-               "Channel::StopPlayingFileLocally()");
-
-  if (!channel_state_.Get().output_file_playing) {
-    return 0;
-  }
-
-  {
-    rtc::CritScope cs(&_fileCritSect);
-
-    if (output_file_player_->StopPlayingFile() != 0) {
-      _engineStatisticsPtr->SetLastError(
-          VE_STOP_RECORDING_FAILED, kTraceError,
-          "StopPlayingFile() could not stop playing");
-      return -1;
-    }
-    output_file_player_->RegisterModuleFileCallback(NULL);
-    output_file_player_.reset();
-    channel_state_.SetOutputFilePlaying(false);
-  }
-  // _fileCritSect cannot be taken while calling
-  // SetAnonymousMixibilityStatus. Refer to comments in
-  // StartPlayingFileLocally(const char* ...) for more details.
-  if (_outputMixerPtr->SetAnonymousMixabilityStatus(*this, false) != 0) {
-    _engineStatisticsPtr->SetLastError(
-        VE_AUDIO_CONF_MIX_MODULE_ERROR, kTraceError,
-        "StopPlayingFile() failed to stop participant from playing as"
-        "file in the mixer");
-    return -1;
-  }
-
-  return 0;
-}
-
-int Channel::IsPlayingFileLocally() const {
-  return channel_state_.Get().output_file_playing;
-}
-
-int Channel::RegisterFilePlayingToMixer() {
-  // Return success for not registering for file playing to mixer if:
-  // 1. playing file before playout is started on that channel.
-  // 2. starting playout without file playing on that channel.
-  if (!channel_state_.Get().playing ||
-      !channel_state_.Get().output_file_playing) {
-    return 0;
-  }
-
-  // |_fileCritSect| cannot be taken while calling
-  // SetAnonymousMixabilityStatus() since as soon as the participant is added
-  // frames can be pulled by the mixer. Since the frames are generated from
-  // the file, _fileCritSect will be taken. This would result in a deadlock.
-  if (_outputMixerPtr->SetAnonymousMixabilityStatus(*this, true) != 0) {
-    channel_state_.SetOutputFilePlaying(false);
-    rtc::CritScope cs(&_fileCritSect);
-    _engineStatisticsPtr->SetLastError(
-        VE_AUDIO_CONF_MIX_MODULE_ERROR, kTraceError,
-        "StartPlayingFile() failed to add participant as file to mixer");
-    output_file_player_->StopPlayingFile();
-    output_file_player_.reset();
-    return -1;
-  }
-
-  return 0;
-}
-
-int Channel::StartPlayingFileAsMicrophone(const char* fileName,
-                                          bool loop,
-                                          FileFormats format,
-                                          int startPosition,
-                                          float volumeScaling,
-                                          int stopPosition,
-                                          const CodecInst* codecInst) {
-  WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId, _channelId),
-               "Channel::StartPlayingFileAsMicrophone(fileNameUTF8[]=%s, "
-               "loop=%d, format=%d, volumeScaling=%5.3f, startPosition=%d, "
-               "stopPosition=%d)",
-               fileName, loop, format, volumeScaling, startPosition,
-               stopPosition);
-
-  rtc::CritScope cs(&_fileCritSect);
-
-  if (channel_state_.Get().input_file_playing) {
-    _engineStatisticsPtr->SetLastError(
-        VE_ALREADY_PLAYING, kTraceWarning,
-        "StartPlayingFileAsMicrophone() filePlayer is playing");
-    return 0;
-  }
-
-  // Destroy the old instance
-  if (input_file_player_) {
-    input_file_player_->RegisterModuleFileCallback(NULL);
-    input_file_player_.reset();
-  }
-
-  // Create the instance
-  input_file_player_ = FilePlayer::CreateFilePlayer(_inputFilePlayerId,
-                                                    (const FileFormats)format);
-
-  if (!input_file_player_) {
-    _engineStatisticsPtr->SetLastError(
-        VE_INVALID_ARGUMENT, kTraceError,
-        "StartPlayingFileAsMicrophone() filePlayer format isnot correct");
-    return -1;
-  }
-
-  const uint32_t notificationTime(0);
-
-  if (input_file_player_->StartPlayingFile(
-          fileName, loop, startPosition, volumeScaling, notificationTime,
-          stopPosition, (const CodecInst*)codecInst) != 0) {
-    _engineStatisticsPtr->SetLastError(
-        VE_BAD_FILE, kTraceError,
-        "StartPlayingFile() failed to start file playout");
-    input_file_player_->StopPlayingFile();
-    input_file_player_.reset();
-    return -1;
-  }
-  input_file_player_->RegisterModuleFileCallback(this);
-  channel_state_.SetInputFilePlaying(true);
-
-  return 0;
-}
-
-int Channel::StartPlayingFileAsMicrophone(InStream* stream,
-                                          FileFormats format,
-                                          int startPosition,
-                                          float volumeScaling,
-                                          int stopPosition,
-                                          const CodecInst* codecInst) {
-  WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId, _channelId),
-               "Channel::StartPlayingFileAsMicrophone(format=%d, "
-               "volumeScaling=%5.3f, startPosition=%d, stopPosition=%d)",
-               format, volumeScaling, startPosition, stopPosition);
-
-  if (stream == NULL) {
-    _engineStatisticsPtr->SetLastError(
-        VE_BAD_FILE, kTraceError,
-        "StartPlayingFileAsMicrophone NULL as input stream");
-    return -1;
-  }
-
-  rtc::CritScope cs(&_fileCritSect);
-
-  if (channel_state_.Get().input_file_playing) {
-    _engineStatisticsPtr->SetLastError(
-        VE_ALREADY_PLAYING, kTraceWarning,
-        "StartPlayingFileAsMicrophone() is playing");
-    return 0;
-  }
-
-  // Destroy the old instance
-  if (input_file_player_) {
-    input_file_player_->RegisterModuleFileCallback(NULL);
-    input_file_player_.reset();
-  }
-
-  // Create the instance
-  input_file_player_ = FilePlayer::CreateFilePlayer(_inputFilePlayerId,
-                                                    (const FileFormats)format);
-
-  if (!input_file_player_) {
-    _engineStatisticsPtr->SetLastError(
-        VE_INVALID_ARGUMENT, kTraceError,
-        "StartPlayingInputFile() filePlayer format isnot correct");
-    return -1;
-  }
-
-  const uint32_t notificationTime(0);
-
-  if (input_file_player_->StartPlayingFile(stream, startPosition, volumeScaling,
-                                           notificationTime, stopPosition,
-                                           codecInst) != 0) {
-    _engineStatisticsPtr->SetLastError(VE_BAD_FILE, kTraceError,
-                                       "StartPlayingFile() failed to start "
-                                       "file playout");
-    input_file_player_->StopPlayingFile();
-    input_file_player_.reset();
-    return -1;
-  }
-
-  input_file_player_->RegisterModuleFileCallback(this);
-  channel_state_.SetInputFilePlaying(true);
-
-  return 0;
-}
-
-int Channel::StopPlayingFileAsMicrophone() {
-  WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId, _channelId),
-               "Channel::StopPlayingFileAsMicrophone()");
-
-  rtc::CritScope cs(&_fileCritSect);
-
-  if (!channel_state_.Get().input_file_playing) {
-    return 0;
-  }
-
-  if (input_file_player_->StopPlayingFile() != 0) {
-    _engineStatisticsPtr->SetLastError(
-        VE_STOP_RECORDING_FAILED, kTraceError,
-        "StopPlayingFile() could not stop playing");
-    return -1;
-  }
-  input_file_player_->RegisterModuleFileCallback(NULL);
-  input_file_player_.reset();
-  channel_state_.SetInputFilePlaying(false);
-
-  return 0;
-}
-
-int Channel::IsPlayingFileAsMicrophone() const {
-  return channel_state_.Get().input_file_playing;
-}
-
-int Channel::StartRecordingPlayout(const char* fileName,
-                                   const CodecInst* codecInst) {
-  WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId, _channelId),
-               "Channel::StartRecordingPlayout(fileName=%s)", fileName);
-
-  if (_outputFileRecording) {
-    WEBRTC_TRACE(kTraceWarning, kTraceVoice, VoEId(_instanceId, -1),
-                 "StartRecordingPlayout() is already recording");
-    return 0;
-  }
-
-  FileFormats format;
-  const uint32_t notificationTime(0);  // Not supported in VoE
-  CodecInst dummyCodec = {100, "L16", 16000, 320, 1, 320000};
-
-  if ((codecInst != NULL) &&
-      ((codecInst->channels < 1) || (codecInst->channels > 2))) {
-    _engineStatisticsPtr->SetLastError(
-        VE_BAD_ARGUMENT, kTraceError,
-        "StartRecordingPlayout() invalid compression");
-    return (-1);
-  }
-  if (codecInst == NULL) {
-    format = kFileFormatPcm16kHzFile;
-    codecInst = &dummyCodec;
-  } else if ((STR_CASE_CMP(codecInst->plname, "L16") == 0) ||
-             (STR_CASE_CMP(codecInst->plname, "PCMU") == 0) ||
-             (STR_CASE_CMP(codecInst->plname, "PCMA") == 0)) {
-    format = kFileFormatWavFile;
-  } else {
-    format = kFileFormatCompressedFile;
-  }
-
-  rtc::CritScope cs(&_fileCritSect);
-
-  // Destroy the old instance
-  if (output_file_recorder_) {
-    output_file_recorder_->RegisterModuleFileCallback(NULL);
-    output_file_recorder_.reset();
-  }
-
-  output_file_recorder_ = FileRecorder::CreateFileRecorder(
-      _outputFileRecorderId, (const FileFormats)format);
-  if (!output_file_recorder_) {
-    _engineStatisticsPtr->SetLastError(
-        VE_INVALID_ARGUMENT, kTraceError,
-        "StartRecordingPlayout() fileRecorder format isnot correct");
-    return -1;
-  }
-
-  if (output_file_recorder_->StartRecordingAudioFile(
-          fileName, (const CodecInst&)*codecInst, notificationTime) != 0) {
-    _engineStatisticsPtr->SetLastError(
-        VE_BAD_FILE, kTraceError,
-        "StartRecordingAudioFile() failed to start file recording");
-    output_file_recorder_->StopRecording();
-    output_file_recorder_.reset();
-    return -1;
-  }
-  output_file_recorder_->RegisterModuleFileCallback(this);
-  _outputFileRecording = true;
-
-  return 0;
-}
-
-int Channel::StartRecordingPlayout(OutStream* stream,
-                                   const CodecInst* codecInst) {
-  WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId, _channelId),
-               "Channel::StartRecordingPlayout()");
-
-  if (_outputFileRecording) {
-    WEBRTC_TRACE(kTraceWarning, kTraceVoice, VoEId(_instanceId, -1),
-                 "StartRecordingPlayout() is already recording");
-    return 0;
-  }
-
-  FileFormats format;
-  const uint32_t notificationTime(0);  // Not supported in VoE
-  CodecInst dummyCodec = {100, "L16", 16000, 320, 1, 320000};
-
-  if (codecInst != NULL && codecInst->channels != 1) {
-    _engineStatisticsPtr->SetLastError(
-        VE_BAD_ARGUMENT, kTraceError,
-        "StartRecordingPlayout() invalid compression");
-    return (-1);
-  }
-  if (codecInst == NULL) {
-    format = kFileFormatPcm16kHzFile;
-    codecInst = &dummyCodec;
-  } else if ((STR_CASE_CMP(codecInst->plname, "L16") == 0) ||
-             (STR_CASE_CMP(codecInst->plname, "PCMU") == 0) ||
-             (STR_CASE_CMP(codecInst->plname, "PCMA") == 0)) {
-    format = kFileFormatWavFile;
-  } else {
-    format = kFileFormatCompressedFile;
-  }
-
-  rtc::CritScope cs(&_fileCritSect);
-
-  // Destroy the old instance
-  if (output_file_recorder_) {
-    output_file_recorder_->RegisterModuleFileCallback(NULL);
-    output_file_recorder_.reset();
-  }
-
-  output_file_recorder_ = FileRecorder::CreateFileRecorder(
-      _outputFileRecorderId, (const FileFormats)format);
-  if (!output_file_recorder_) {
-    _engineStatisticsPtr->SetLastError(
-        VE_INVALID_ARGUMENT, kTraceError,
-        "StartRecordingPlayout() fileRecorder format isnot correct");
-    return -1;
-  }
-
-  if (output_file_recorder_->StartRecordingAudioFile(stream, *codecInst,
-                                                     notificationTime) != 0) {
-    _engineStatisticsPtr->SetLastError(VE_BAD_FILE, kTraceError,
-                                       "StartRecordingPlayout() failed to "
-                                       "start file recording");
-    output_file_recorder_->StopRecording();
-    output_file_recorder_.reset();
-    return -1;
-  }
-
-  output_file_recorder_->RegisterModuleFileCallback(this);
-  _outputFileRecording = true;
-
-  return 0;
-}
-
-int Channel::StopRecordingPlayout() {
-  WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId, -1),
-               "Channel::StopRecordingPlayout()");
-
-  if (!_outputFileRecording) {
-    WEBRTC_TRACE(kTraceError, kTraceVoice, VoEId(_instanceId, -1),
-                 "StopRecordingPlayout() isnot recording");
-    return -1;
-  }
-
-  rtc::CritScope cs(&_fileCritSect);
-
-  if (output_file_recorder_->StopRecording() != 0) {
-    _engineStatisticsPtr->SetLastError(
-        VE_STOP_RECORDING_FAILED, kTraceError,
-        "StopRecording() could not stop recording");
-    return (-1);
-  }
-  output_file_recorder_->RegisterModuleFileCallback(NULL);
-  output_file_recorder_.reset();
-  _outputFileRecording = false;
-
-  return 0;
-}
-
-void Channel::SetMixWithMicStatus(bool mix) {
-  rtc::CritScope cs(&_fileCritSect);
-  _mixFileWithMicrophone = mix;
-}
-
-int Channel::GetSpeechOutputLevel() const {
-  return _outputAudioLevel.Level();
-}
-
-int Channel::GetSpeechOutputLevelFullRange() const {
-  return _outputAudioLevel.LevelFullRange();
-}
-
-double Channel::GetTotalOutputEnergy() const {
-  return _outputAudioLevel.TotalEnergy();
-}
-
-double Channel::GetTotalOutputDuration() const {
-  return _outputAudioLevel.TotalDuration();
-}
-
-void Channel::SetInputMute(bool enable) {
-  rtc::CritScope cs(&volume_settings_critsect_);
-  input_mute_ = enable;
-}
-
-bool Channel::InputMute() const {
-  rtc::CritScope cs(&volume_settings_critsect_);
-  return input_mute_;
-}
-
-void Channel::SetChannelOutputVolumeScaling(float scaling) {
-  rtc::CritScope cs(&volume_settings_critsect_);
-  _outputGain = scaling;
-}
-
-int Channel::SendTelephoneEventOutband(int event, int duration_ms) {
-  WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId, _channelId),
-               "Channel::SendTelephoneEventOutband(...)");
-  RTC_DCHECK_LE(0, event);
-  RTC_DCHECK_GE(255, event);
-  RTC_DCHECK_LE(0, duration_ms);
-  RTC_DCHECK_GE(65535, duration_ms);
-  if (!Sending()) {
-    return -1;
-  }
-  if (_rtpRtcpModule->SendTelephoneEventOutband(
-      event, duration_ms, kTelephoneEventAttenuationdB) != 0) {
-    _engineStatisticsPtr->SetLastError(
-        VE_SEND_DTMF_FAILED, kTraceWarning,
-        "SendTelephoneEventOutband() failed to send event");
-    return -1;
-  }
-  return 0;
-}
-
-int Channel::SetSendTelephoneEventPayloadType(int payload_type,
-                                              int payload_frequency) {
-  WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId, _channelId),
-               "Channel::SetSendTelephoneEventPayloadType()");
-  RTC_DCHECK_LE(0, payload_type);
-  RTC_DCHECK_GE(127, payload_type);
-  CodecInst codec = {0};
-  codec.pltype = payload_type;
-  codec.plfreq = payload_frequency;
-  memcpy(codec.plname, "telephone-event", 16);
-  if (_rtpRtcpModule->RegisterSendPayload(codec) != 0) {
-    _rtpRtcpModule->DeRegisterSendPayload(codec.pltype);
-    if (_rtpRtcpModule->RegisterSendPayload(codec) != 0) {
-      _engineStatisticsPtr->SetLastError(
-          VE_RTP_RTCP_MODULE_ERROR, kTraceError,
-          "SetSendTelephoneEventPayloadType() failed to register send"
-          "payload type");
-      return -1;
-    }
-  }
-  return 0;
-}
-
-int Channel::SetLocalSSRC(unsigned int ssrc) {
-  WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId, _channelId),
-               "Channel::SetLocalSSRC()");
-  if (channel_state_.Get().sending) {
-    _engineStatisticsPtr->SetLastError(VE_ALREADY_SENDING, kTraceError,
-                                       "SetLocalSSRC() already sending");
-    return -1;
-  }
-  _rtpRtcpModule->SetSSRC(ssrc);
-  return 0;
-}
-
-int Channel::GetLocalSSRC(unsigned int& ssrc) {
-  ssrc = _rtpRtcpModule->SSRC();
-  return 0;
-}
-
-int Channel::GetRemoteSSRC(unsigned int& ssrc) {
-  ssrc = rtp_receiver_->SSRC();
-  return 0;
-}
-
-int Channel::SetSendAudioLevelIndicationStatus(bool enable, unsigned char id) {
-  _includeAudioLevelIndication = enable;
-  return SetSendRtpHeaderExtension(enable, kRtpExtensionAudioLevel, id);
-}
-
-int Channel::SetReceiveAudioLevelIndicationStatus(bool enable,
-                                                  unsigned char id) {
-  rtp_header_parser_->DeregisterRtpHeaderExtension(kRtpExtensionAudioLevel);
-  if (enable &&
-      !rtp_header_parser_->RegisterRtpHeaderExtension(kRtpExtensionAudioLevel,
-                                                      id)) {
-    return -1;
-  }
-  return 0;
-}
-
-void Channel::EnableSendTransportSequenceNumber(int id) {
-  int ret =
-      SetSendRtpHeaderExtension(true, kRtpExtensionTransportSequenceNumber, id);
-  RTC_DCHECK_EQ(0, ret);
-}
-
-void Channel::EnableReceiveTransportSequenceNumber(int id) {
-  rtp_header_parser_->DeregisterRtpHeaderExtension(
-      kRtpExtensionTransportSequenceNumber);
-  bool ret = rtp_header_parser_->RegisterRtpHeaderExtension(
-      kRtpExtensionTransportSequenceNumber, id);
-  RTC_DCHECK(ret);
-}
-
-void Channel::RegisterSenderCongestionControlObjects(
-    RtpTransportControllerSendInterface* transport,
-    RtcpBandwidthObserver* bandwidth_observer) {
-  RtpPacketSender* rtp_packet_sender = transport->packet_sender();
-  TransportFeedbackObserver* transport_feedback_observer =
-      transport->transport_feedback_observer();
-  PacketRouter* packet_router = transport->packet_router();
-
-  RTC_DCHECK(rtp_packet_sender);
-  RTC_DCHECK(transport_feedback_observer);
-  RTC_DCHECK(packet_router);
-  RTC_DCHECK(!packet_router_);
-  rtcp_observer_->SetBandwidthObserver(bandwidth_observer);
-  feedback_observer_proxy_->SetTransportFeedbackObserver(
-      transport_feedback_observer);
-  seq_num_allocator_proxy_->SetSequenceNumberAllocator(packet_router);
-  rtp_packet_sender_proxy_->SetPacketSender(rtp_packet_sender);
-  _rtpRtcpModule->SetStorePacketsStatus(true, 600);
-  constexpr bool remb_candidate = false;
-  packet_router->AddSendRtpModule(_rtpRtcpModule.get(), remb_candidate);
-  packet_router_ = packet_router;
-}
-
-void Channel::RegisterReceiverCongestionControlObjects(
-    PacketRouter* packet_router) {
-  RTC_DCHECK(packet_router);
-  RTC_DCHECK(!packet_router_);
-  constexpr bool remb_candidate = false;
-  packet_router->AddReceiveRtpModule(_rtpRtcpModule.get(), remb_candidate);
-  packet_router_ = packet_router;
-}
-
-void Channel::ResetSenderCongestionControlObjects() {
-  RTC_DCHECK(packet_router_);
-  _rtpRtcpModule->SetStorePacketsStatus(false, 600);
-  rtcp_observer_->SetBandwidthObserver(nullptr);
-  feedback_observer_proxy_->SetTransportFeedbackObserver(nullptr);
-  seq_num_allocator_proxy_->SetSequenceNumberAllocator(nullptr);
-  packet_router_->RemoveSendRtpModule(_rtpRtcpModule.get());
-  packet_router_ = nullptr;
-  rtp_packet_sender_proxy_->SetPacketSender(nullptr);
-}
-
-void Channel::ResetReceiverCongestionControlObjects() {
-  RTC_DCHECK(packet_router_);
-  packet_router_->RemoveReceiveRtpModule(_rtpRtcpModule.get());
-  packet_router_ = nullptr;
-}
-
-void Channel::SetRTCPStatus(bool enable) {
-  WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId, _channelId),
-               "Channel::SetRTCPStatus()");
-  _rtpRtcpModule->SetRTCPStatus(enable ? RtcpMode::kCompound : RtcpMode::kOff);
-}
-
-int Channel::GetRTCPStatus(bool& enabled) {
-  RtcpMode method = _rtpRtcpModule->RTCP();
-  enabled = (method != RtcpMode::kOff);
-  return 0;
-}
-
-int Channel::SetRTCP_CNAME(const char cName[256]) {
-  WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId, _channelId),
-               "Channel::SetRTCP_CNAME()");
-  if (_rtpRtcpModule->SetCNAME(cName) != 0) {
-    _engineStatisticsPtr->SetLastError(
-        VE_RTP_RTCP_MODULE_ERROR, kTraceError,
-        "SetRTCP_CNAME() failed to set RTCP CNAME");
-    return -1;
-  }
-  return 0;
-}
-
-int Channel::GetRemoteRTCP_CNAME(char cName[256]) {
-  if (cName == NULL) {
-    _engineStatisticsPtr->SetLastError(
-        VE_INVALID_ARGUMENT, kTraceError,
-        "GetRemoteRTCP_CNAME() invalid CNAME input buffer");
-    return -1;
-  }
-  char cname[RTCP_CNAME_SIZE];
-  const uint32_t remoteSSRC = rtp_receiver_->SSRC();
-  if (_rtpRtcpModule->RemoteCNAME(remoteSSRC, cname) != 0) {
-    _engineStatisticsPtr->SetLastError(
-        VE_CANNOT_RETRIEVE_CNAME, kTraceError,
-        "GetRemoteRTCP_CNAME() failed to retrieve remote RTCP CNAME");
-    return -1;
-  }
-  strcpy(cName, cname);
-  return 0;
-}
-
-int Channel::SendApplicationDefinedRTCPPacket(
-    unsigned char subType,
-    unsigned int name,
-    const char* data,
-    unsigned short dataLengthInBytes) {
-  WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId, _channelId),
-               "Channel::SendApplicationDefinedRTCPPacket()");
-  if (!channel_state_.Get().sending) {
-    _engineStatisticsPtr->SetLastError(
-        VE_NOT_SENDING, kTraceError,
-        "SendApplicationDefinedRTCPPacket() not sending");
-    return -1;
-  }
-  if (NULL == data) {
-    _engineStatisticsPtr->SetLastError(
-        VE_INVALID_ARGUMENT, kTraceError,
-        "SendApplicationDefinedRTCPPacket() invalid data value");
-    return -1;
-  }
-  if (dataLengthInBytes % 4 != 0) {
-    _engineStatisticsPtr->SetLastError(
-        VE_INVALID_ARGUMENT, kTraceError,
-        "SendApplicationDefinedRTCPPacket() invalid length value");
-    return -1;
-  }
-  RtcpMode status = _rtpRtcpModule->RTCP();
-  if (status == RtcpMode::kOff) {
-    _engineStatisticsPtr->SetLastError(
-        VE_RTCP_ERROR, kTraceError,
-        "SendApplicationDefinedRTCPPacket() RTCP is disabled");
-    return -1;
-  }
-
-  // Create and schedule the RTCP APP packet for transmission
-  if (_rtpRtcpModule->SetRTCPApplicationSpecificData(
-          subType, name, (const unsigned char*)data, dataLengthInBytes) != 0) {
-    _engineStatisticsPtr->SetLastError(
-        VE_SEND_ERROR, kTraceError,
-        "SendApplicationDefinedRTCPPacket() failed to send RTCP packet");
-    return -1;
-  }
-  return 0;
-}
-
-int Channel::GetRemoteRTCPReportBlocks(
-    std::vector<ReportBlock>* report_blocks) {
-  if (report_blocks == NULL) {
-    _engineStatisticsPtr->SetLastError(
-        VE_INVALID_ARGUMENT, kTraceError,
-        "GetRemoteRTCPReportBlock()s invalid report_blocks.");
-    return -1;
-  }
-
-  // Get the report blocks from the latest received RTCP Sender or Receiver
-  // Report. Each element in the vector contains the sender's SSRC and a
-  // report block according to RFC 3550.
-  std::vector<RTCPReportBlock> rtcp_report_blocks;
-  if (_rtpRtcpModule->RemoteRTCPStat(&rtcp_report_blocks) != 0) {
-    return -1;
-  }
-
-  if (rtcp_report_blocks.empty())
-    return 0;
-
-  std::vector<RTCPReportBlock>::const_iterator it = rtcp_report_blocks.begin();
-  for (; it != rtcp_report_blocks.end(); ++it) {
-    ReportBlock report_block;
-    report_block.sender_SSRC = it->sender_ssrc;
-    report_block.source_SSRC = it->source_ssrc;
-    report_block.fraction_lost = it->fraction_lost;
-    report_block.cumulative_num_packets_lost = it->packets_lost;
-    report_block.extended_highest_sequence_number =
-        it->extended_highest_sequence_number;
-    report_block.interarrival_jitter = it->jitter;
-    report_block.last_SR_timestamp = it->last_sender_report_timestamp;
-    report_block.delay_since_last_SR = it->delay_since_last_sender_report;
-    report_blocks->push_back(report_block);
-  }
-  return 0;
-}
-
-int Channel::GetRTPStatistics(CallStatistics& stats) {
-  // --- RtcpStatistics
-
-  // The jitter statistics is updated for each received RTP packet and is
-  // based on received packets.
-  RtcpStatistics statistics;
-  StreamStatistician* statistician =
-      rtp_receive_statistics_->GetStatistician(rtp_receiver_->SSRC());
-  if (statistician) {
-    statistician->GetStatistics(&statistics,
-                                _rtpRtcpModule->RTCP() == RtcpMode::kOff);
-  }
-
-  stats.fractionLost = statistics.fraction_lost;
-  stats.cumulativeLost = statistics.packets_lost;
-  stats.extendedMax = statistics.extended_highest_sequence_number;
-  stats.jitterSamples = statistics.jitter;
-
-  // --- RTT
-  stats.rttMs = GetRTT(true);
-
-  // --- Data counters
-
-  size_t bytesSent(0);
-  uint32_t packetsSent(0);
-  size_t bytesReceived(0);
-  uint32_t packetsReceived(0);
-
-  if (statistician) {
-    statistician->GetDataCounters(&bytesReceived, &packetsReceived);
-  }
-
-  if (_rtpRtcpModule->DataCountersRTP(&bytesSent, &packetsSent) != 0) {
-    WEBRTC_TRACE(kTraceWarning, kTraceVoice, VoEId(_instanceId, _channelId),
-                 "GetRTPStatistics() failed to retrieve RTP datacounters =>"
-                 " output will not be complete");
-  }
-
-  stats.bytesSent = bytesSent;
-  stats.packetsSent = packetsSent;
-  stats.bytesReceived = bytesReceived;
-  stats.packetsReceived = packetsReceived;
-
-  // --- Timestamps
-  {
-    rtc::CritScope lock(&ts_stats_lock_);
-    stats.capture_start_ntp_time_ms_ = capture_start_ntp_time_ms_;
-  }
-  return 0;
-}
-
-int Channel::SetCodecFECStatus(bool enable) {
-  WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId, _channelId),
-               "Channel::SetCodecFECStatus()");
-
-  if (!codec_manager_.SetCodecFEC(enable) ||
-      !codec_manager_.MakeEncoder(&rent_a_codec_, audio_coding_.get())) {
-    _engineStatisticsPtr->SetLastError(
-        VE_AUDIO_CODING_MODULE_ERROR, kTraceError,
-        "SetCodecFECStatus() failed to set FEC state");
-    return -1;
-  }
-  return 0;
-}
-
-bool Channel::GetCodecFECStatus() {
-  return codec_manager_.GetStackParams()->use_codec_fec;
-}
-
-void Channel::SetNACKStatus(bool enable, int maxNumberOfPackets) {
-  // None of these functions can fail.
-  // If pacing is enabled we always store packets.
-  if (!pacing_enabled_)
-    _rtpRtcpModule->SetStorePacketsStatus(enable, maxNumberOfPackets);
-  rtp_receive_statistics_->SetMaxReorderingThreshold(maxNumberOfPackets);
-  if (enable)
-    audio_coding_->EnableNack(maxNumberOfPackets);
-  else
-    audio_coding_->DisableNack();
-}
-
-// Called when we are missing one or more packets.
-int Channel::ResendPackets(const uint16_t* sequence_numbers, int length) {
-  return _rtpRtcpModule->SendNACK(sequence_numbers, length);
-}
-
-void Channel::ProcessAndEncodeAudio(const AudioFrame& audio_input) {
-  // Avoid posting any new tasks if sending was already stopped in StopSend().
-  rtc::CritScope cs(&encoder_queue_lock_);
-  if (!encoder_queue_is_active_) {
-    return;
-  }
-  std::unique_ptr<AudioFrame> audio_frame(new AudioFrame());
-  // TODO(henrika): try to avoid copying by moving ownership of audio frame
-  // either into pool of frames or into the task itself.
-  audio_frame->CopyFrom(audio_input);
-  audio_frame->id_ = ChannelId();
-  encoder_queue_->PostTask(std::unique_ptr<rtc::QueuedTask>(
-      new ProcessAndEncodeAudioTask(std::move(audio_frame), this)));
-}
-
-void Channel::ProcessAndEncodeAudio(const int16_t* audio_data,
-                                    int sample_rate,
-                                    size_t number_of_frames,
-                                    size_t number_of_channels) {
-  // Avoid posting as new task if sending was already stopped in StopSend().
-  rtc::CritScope cs(&encoder_queue_lock_);
-  if (!encoder_queue_is_active_) {
-    return;
-  }
-  CodecInst codec;
-  const int result = GetSendCodec(codec);
-  std::unique_ptr<AudioFrame> audio_frame(new AudioFrame());
-  audio_frame->id_ = ChannelId();
-  // TODO(ossu): Investigate how this could happen. b/62909493
-  if (result == 0) {
-    audio_frame->sample_rate_hz_ = std::min(codec.plfreq, sample_rate);
-    audio_frame->num_channels_ = std::min(number_of_channels, codec.channels);
-  } else {
-    audio_frame->sample_rate_hz_ = sample_rate;
-    audio_frame->num_channels_ = number_of_channels;
-    LOG(LS_WARNING) << "Unable to get send codec for channel " << ChannelId();
-    RTC_NOTREACHED();
-  }
-  RemixAndResample(audio_data, number_of_frames, number_of_channels,
-                   sample_rate, &input_resampler_, audio_frame.get());
-  encoder_queue_->PostTask(std::unique_ptr<rtc::QueuedTask>(
-      new ProcessAndEncodeAudioTask(std::move(audio_frame), this)));
-}
-
-void Channel::ProcessAndEncodeAudioOnTaskQueue(AudioFrame* audio_input) {
-  RTC_DCHECK_RUN_ON(encoder_queue_);
-  RTC_DCHECK_GT(audio_input->samples_per_channel_, 0);
-  RTC_DCHECK_LE(audio_input->num_channels_, 2);
-  RTC_DCHECK_EQ(audio_input->id_, ChannelId());
-
-  if (channel_state_.Get().input_file_playing) {
-    MixOrReplaceAudioWithFile(audio_input);
-  }
-
-  bool is_muted = InputMute();
-  AudioFrameOperations::Mute(audio_input, previous_frame_muted_, is_muted);
-
-  if (_includeAudioLevelIndication) {
-    size_t length =
-        audio_input->samples_per_channel_ * audio_input->num_channels_;
-    RTC_CHECK_LE(length, AudioFrame::kMaxDataSizeBytes);
-    if (is_muted && previous_frame_muted_) {
-      rms_level_.AnalyzeMuted(length);
-    } else {
-      rms_level_.Analyze(
-          rtc::ArrayView<const int16_t>(audio_input->data(), length));
-    }
-  }
-  previous_frame_muted_ = is_muted;
-
-  // Add 10ms of raw (PCM) audio data to the encoder @ 32kHz.
-
-  // The ACM resamples internally.
-  audio_input->timestamp_ = _timeStamp;
-  // This call will trigger AudioPacketizationCallback::SendData if encoding
-  // is done and payload is ready for packetization and transmission.
-  // Otherwise, it will return without invoking the callback.
-  if (audio_coding_->Add10MsData(*audio_input) < 0) {
-    LOG(LS_ERROR) << "ACM::Add10MsData() failed for channel " << _channelId;
-    return;
-  }
-
-  _timeStamp += static_cast<uint32_t>(audio_input->samples_per_channel_);
-}
-
-void Channel::set_associate_send_channel(const ChannelOwner& channel) {
-  RTC_DCHECK(!channel.channel() ||
-             channel.channel()->ChannelId() != _channelId);
-  rtc::CritScope lock(&assoc_send_channel_lock_);
-  associate_send_channel_ = channel;
-}
-
-void Channel::DisassociateSendChannel(int channel_id) {
-  rtc::CritScope lock(&assoc_send_channel_lock_);
-  Channel* channel = associate_send_channel_.channel();
-  if (channel && channel->ChannelId() == channel_id) {
-    // If this channel is associated with a send channel of the specified
-    // Channel ID, disassociate with it.
-    ChannelOwner ref(NULL);
-    associate_send_channel_ = ref;
-  }
-}
-
-void Channel::SetRtcEventLog(RtcEventLog* event_log) {
-  event_log_proxy_->SetEventLog(event_log);
-}
-
-void Channel::SetRtcpRttStats(RtcpRttStats* rtcp_rtt_stats) {
-  rtcp_rtt_stats_proxy_->SetRtcpRttStats(rtcp_rtt_stats);
-}
-
-void Channel::UpdateOverheadForEncoder() {
-  size_t overhead_per_packet =
-      transport_overhead_per_packet_ + rtp_overhead_per_packet_;
-  audio_coding_->ModifyEncoder([&](std::unique_ptr<AudioEncoder>* encoder) {
-    if (*encoder) {
-      (*encoder)->OnReceivedOverhead(overhead_per_packet);
-    }
-  });
-}
-
-void Channel::SetTransportOverhead(size_t transport_overhead_per_packet) {
-  rtc::CritScope cs(&overhead_per_packet_lock_);
-  transport_overhead_per_packet_ = transport_overhead_per_packet;
-  UpdateOverheadForEncoder();
-}
-
-// TODO(solenberg): Make AudioSendStream an OverheadObserver instead.
-void Channel::OnOverheadChanged(size_t overhead_bytes_per_packet) {
-  rtc::CritScope cs(&overhead_per_packet_lock_);
-  rtp_overhead_per_packet_ = overhead_bytes_per_packet;
-  UpdateOverheadForEncoder();
-}
-
-int Channel::GetNetworkStatistics(NetworkStatistics& stats) {
-  return audio_coding_->GetNetworkStatistics(&stats);
-}
-
-void Channel::GetDecodingCallStatistics(AudioDecodingCallStats* stats) const {
-  audio_coding_->GetDecodingCallStatistics(stats);
-}
-
-ANAStats Channel::GetANAStatistics() const {
-  return audio_coding_->GetANAStats();
-}
-
-uint32_t Channel::GetDelayEstimate() const {
-  rtc::CritScope lock(&video_sync_lock_);
-  return audio_coding_->FilteredCurrentDelayMs() + playout_delay_ms_;
-}
-
-int Channel::SetMinimumPlayoutDelay(int delayMs) {
-  WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId, _channelId),
-               "Channel::SetMinimumPlayoutDelay()");
-  if ((delayMs < kVoiceEngineMinMinPlayoutDelayMs) ||
-      (delayMs > kVoiceEngineMaxMinPlayoutDelayMs)) {
-    _engineStatisticsPtr->SetLastError(
-        VE_INVALID_ARGUMENT, kTraceError,
-        "SetMinimumPlayoutDelay() invalid min delay");
-    return -1;
-  }
-  if (audio_coding_->SetMinimumPlayoutDelay(delayMs) != 0) {
-    _engineStatisticsPtr->SetLastError(
-        VE_AUDIO_CODING_MODULE_ERROR, kTraceError,
-        "SetMinimumPlayoutDelay() failed to set min playout delay");
-    return -1;
-  }
-  return 0;
-}
-
-int Channel::GetPlayoutTimestamp(unsigned int& timestamp) {
-  uint32_t playout_timestamp_rtp = 0;
-  {
-    rtc::CritScope lock(&video_sync_lock_);
-    playout_timestamp_rtp = playout_timestamp_rtp_;
-  }
-  if (playout_timestamp_rtp == 0) {
-    _engineStatisticsPtr->SetLastError(
-        VE_CANNOT_RETRIEVE_VALUE, kTraceStateInfo,
-        "GetPlayoutTimestamp() failed to retrieve timestamp");
-    return -1;
-  }
-  timestamp = playout_timestamp_rtp;
-  return 0;
-}
-
-int Channel::GetRtpRtcp(RtpRtcp** rtpRtcpModule,
-                        RtpReceiver** rtp_receiver) const {
-  *rtpRtcpModule = _rtpRtcpModule.get();
-  *rtp_receiver = rtp_receiver_.get();
-  return 0;
-}
-
-// TODO(andrew): refactor Mix functions here and in transmit_mixer.cc to use
-// a shared helper.
-int32_t Channel::MixOrReplaceAudioWithFile(AudioFrame* audio_input) {
-  RTC_DCHECK_RUN_ON(encoder_queue_);
-  std::unique_ptr<int16_t[]> fileBuffer(new int16_t[640]);
-  size_t fileSamples(0);
-  const int mixingFrequency = audio_input->sample_rate_hz_;
-  {
-    rtc::CritScope cs(&_fileCritSect);
-
-    if (!input_file_player_) {
-      WEBRTC_TRACE(kTraceWarning, kTraceVoice, VoEId(_instanceId, _channelId),
-                   "Channel::MixOrReplaceAudioWithFile() fileplayer"
-                   " doesnt exist");
-      return -1;
-    }
-
-    if (input_file_player_->Get10msAudioFromFile(fileBuffer.get(), &fileSamples,
-                                                 mixingFrequency) == -1) {
-      WEBRTC_TRACE(kTraceWarning, kTraceVoice, VoEId(_instanceId, _channelId),
-                   "Channel::MixOrReplaceAudioWithFile() file mixing "
-                   "failed");
-      return -1;
-    }
-    if (fileSamples == 0) {
-      WEBRTC_TRACE(kTraceWarning, kTraceVoice, VoEId(_instanceId, _channelId),
-                   "Channel::MixOrReplaceAudioWithFile() file is ended");
-      return 0;
-    }
-  }
-
-  RTC_DCHECK_EQ(audio_input->samples_per_channel_, fileSamples);
-
-  if (_mixFileWithMicrophone) {
-    // Currently file stream is always mono.
-    // TODO(xians): Change the code when FilePlayer supports real stereo.
-    MixWithSat(audio_input->mutable_data(), audio_input->num_channels_,
-               fileBuffer.get(), 1, fileSamples);
-  } else {
-    // Replace ACM audio with file.
-    // Currently file stream is always mono.
-    // TODO(xians): Change the code when FilePlayer supports real stereo.
-    audio_input->UpdateFrame(
-        _channelId, 0xFFFFFFFF, fileBuffer.get(), fileSamples, mixingFrequency,
-        AudioFrame::kNormalSpeech, AudioFrame::kVadUnknown, 1);
-  }
-  return 0;
-}
-
-int32_t Channel::MixAudioWithFile(AudioFrame& audioFrame, int mixingFrequency) {
-  assert(mixingFrequency <= 48000);
-
-  std::unique_ptr<int16_t[]> fileBuffer(new int16_t[960]);
-  size_t fileSamples(0);
-
-  {
-    rtc::CritScope cs(&_fileCritSect);
-
-    if (!output_file_player_) {
-      WEBRTC_TRACE(kTraceWarning, kTraceVoice, VoEId(_instanceId, _channelId),
-                   "Channel::MixAudioWithFile() file mixing failed");
-      return -1;
-    }
-
-    // We should get the frequency we ask for.
-    if (output_file_player_->Get10msAudioFromFile(
-            fileBuffer.get(), &fileSamples, mixingFrequency) == -1) {
-      WEBRTC_TRACE(kTraceWarning, kTraceVoice, VoEId(_instanceId, _channelId),
-                   "Channel::MixAudioWithFile() file mixing failed");
-      return -1;
-    }
-  }
-
-  if (audioFrame.samples_per_channel_ == fileSamples) {
-    // Currently file stream is always mono.
-    // TODO(xians): Change the code when FilePlayer supports real stereo.
-    MixWithSat(audioFrame.mutable_data(), audioFrame.num_channels_,
-               fileBuffer.get(), 1, fileSamples);
-  } else {
-    WEBRTC_TRACE(kTraceWarning, kTraceVoice, VoEId(_instanceId, _channelId),
-                 "Channel::MixAudioWithFile() samples_per_channel_(%" PRIuS
-                 ") != "
-                 "fileSamples(%" PRIuS ")",
-                 audioFrame.samples_per_channel_, fileSamples);
-    return -1;
-  }
-
-  return 0;
-}
-
-void Channel::UpdatePlayoutTimestamp(bool rtcp) {
-  jitter_buffer_playout_timestamp_ = audio_coding_->PlayoutTimestamp();
-
-  if (!jitter_buffer_playout_timestamp_) {
-    // This can happen if this channel has not received any RTP packets. In
-    // this case, NetEq is not capable of computing a playout timestamp.
-    return;
-  }
-
-  uint16_t delay_ms = 0;
-  if (_audioDeviceModulePtr->PlayoutDelay(&delay_ms) == -1) {
-    WEBRTC_TRACE(kTraceWarning, kTraceVoice, VoEId(_instanceId, _channelId),
-                 "Channel::UpdatePlayoutTimestamp() failed to read playout"
-                 " delay from the ADM");
-    _engineStatisticsPtr->SetLastError(
-        VE_CANNOT_RETRIEVE_VALUE, kTraceError,
-        "UpdatePlayoutTimestamp() failed to retrieve playout delay");
-    return;
-  }
-
-  RTC_DCHECK(jitter_buffer_playout_timestamp_);
-  uint32_t playout_timestamp = *jitter_buffer_playout_timestamp_;
-
-  // Remove the playout delay.
-  playout_timestamp -= (delay_ms * (GetRtpTimestampRateHz() / 1000));
-
-  WEBRTC_TRACE(kTraceStream, kTraceVoice, VoEId(_instanceId, _channelId),
-               "Channel::UpdatePlayoutTimestamp() => playoutTimestamp = %lu",
-               playout_timestamp);
-
-  {
-    rtc::CritScope lock(&video_sync_lock_);
-    if (!rtcp) {
-      playout_timestamp_rtp_ = playout_timestamp;
-    }
-    playout_delay_ms_ = delay_ms;
-  }
-}
-
-void Channel::RegisterReceiveCodecsToRTPModule() {
-  WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId, _channelId),
-               "Channel::RegisterReceiveCodecsToRTPModule()");
-
-  CodecInst codec;
-  const uint8_t nSupportedCodecs = AudioCodingModule::NumberOfCodecs();
-
-  for (int idx = 0; idx < nSupportedCodecs; idx++) {
-    // Open up the RTP/RTCP receiver for all supported codecs
-    if ((audio_coding_->Codec(idx, &codec) == -1) ||
-        (rtp_receiver_->RegisterReceivePayload(codec) == -1)) {
-      WEBRTC_TRACE(kTraceWarning, kTraceVoice, VoEId(_instanceId, _channelId),
-                   "Channel::RegisterReceiveCodecsToRTPModule() unable"
-                   " to register %s (%d/%d/%" PRIuS
-                   "/%d) to RTP/RTCP "
-                   "receiver",
-                   codec.plname, codec.pltype, codec.plfreq, codec.channels,
-                   codec.rate);
-    } else {
-      WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId, _channelId),
-                   "Channel::RegisterReceiveCodecsToRTPModule() %s "
-                   "(%d/%d/%" PRIuS
-                   "/%d) has been added to the RTP/RTCP "
-                   "receiver",
-                   codec.plname, codec.pltype, codec.plfreq, codec.channels,
-                   codec.rate);
-    }
-  }
-}
-
-int Channel::SetSendRtpHeaderExtension(bool enable,
-                                       RTPExtensionType type,
-                                       unsigned char id) {
-  int error = 0;
-  _rtpRtcpModule->DeregisterSendRtpHeaderExtension(type);
-  if (enable) {
-    error = _rtpRtcpModule->RegisterSendRtpHeaderExtension(type, id);
-  }
-  return error;
-}
-
-int Channel::GetRtpTimestampRateHz() const {
-  const auto format = audio_coding_->ReceiveFormat();
-  // Default to the playout frequency if we've not gotten any packets yet.
-  // TODO(ossu): Zero clockrate can only happen if we've added an external
-  // decoder for a format we don't support internally. Remove once that way of
-  // adding decoders is gone!
-  return (format && format->clockrate_hz != 0)
-             ? format->clockrate_hz
-             : audio_coding_->PlayoutFrequency();
-}
-
-int64_t Channel::GetRTT(bool allow_associate_channel) const {
-  RtcpMode method = _rtpRtcpModule->RTCP();
-  if (method == RtcpMode::kOff) {
-    return 0;
-  }
-  std::vector<RTCPReportBlock> report_blocks;
-  _rtpRtcpModule->RemoteRTCPStat(&report_blocks);
-
-  int64_t rtt = 0;
-  if (report_blocks.empty()) {
-    if (allow_associate_channel) {
-      rtc::CritScope lock(&assoc_send_channel_lock_);
-      Channel* channel = associate_send_channel_.channel();
-      // Tries to get RTT from an associated channel. This is important for
-      // receive-only channels.
-      if (channel) {
-        // To prevent infinite recursion and deadlock, calling GetRTT of
-        // associate channel should always use "false" for argument:
-        // |allow_associate_channel|.
-        rtt = channel->GetRTT(false);
-      }
-    }
-    return rtt;
-  }
-
-  uint32_t remoteSSRC = rtp_receiver_->SSRC();
-  std::vector<RTCPReportBlock>::const_iterator it = report_blocks.begin();
-  for (; it != report_blocks.end(); ++it) {
-    if (it->sender_ssrc == remoteSSRC)
-      break;
-  }
-  if (it == report_blocks.end()) {
-    // We have not received packets with SSRC matching the report blocks.
-    // To calculate RTT we try with the SSRC of the first report block.
-    // This is very important for send-only channels where we don't know
-    // the SSRC of the other end.
-    remoteSSRC = report_blocks[0].sender_ssrc;
-  }
-
-  int64_t avg_rtt = 0;
-  int64_t max_rtt = 0;
-  int64_t min_rtt = 0;
-  if (_rtpRtcpModule->RTT(remoteSSRC, &rtt, &avg_rtt, &min_rtt, &max_rtt) !=
-      0) {
-    return 0;
-  }
-  return rtt;
-}
-
-}  // namespace voe
-}  // namespace webrtc
diff --git a/voice_engine/channel.h b/voice_engine/channel.h
deleted file mode 100644
index e5209f5..0000000
--- a/voice_engine/channel.h
+++ /dev/null
@@ -1,562 +0,0 @@
-/*
- *  Copyright (c) 2012 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_VOICE_ENGINE_CHANNEL_H_
-#define WEBRTC_VOICE_ENGINE_CHANNEL_H_
-
-#include <memory>
-
-#include "webrtc/api/audio/audio_mixer.h"
-#include "webrtc/api/audio_codecs/audio_encoder.h"
-#include "webrtc/api/call/audio_sink.h"
-#include "webrtc/api/optional.h"
-#include "webrtc/common_audio/resampler/include/push_resampler.h"
-#include "webrtc/common_types.h"
-#include "webrtc/modules/audio_coding/acm2/codec_manager.h"
-#include "webrtc/modules/audio_coding/acm2/rent_a_codec.h"
-#include "webrtc/modules/audio_coding/include/audio_coding_module.h"
-#include "webrtc/modules/audio_conference_mixer/include/audio_conference_mixer_defines.h"
-#include "webrtc/modules/audio_processing/rms_level.h"
-#include "webrtc/modules/rtp_rtcp/include/remote_ntp_time_estimator.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_header_parser.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_receiver.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/event.h"
-#include "webrtc/rtc_base/thread_checker.h"
-#include "webrtc/voice_engine/audio_level.h"
-#include "webrtc/voice_engine/file_player.h"
-#include "webrtc/voice_engine/file_recorder.h"
-#include "webrtc/voice_engine/include/voe_base.h"
-#include "webrtc/voice_engine/include/voe_network.h"
-#include "webrtc/voice_engine/shared_data.h"
-#include "webrtc/voice_engine/voice_engine_defines.h"
-
-namespace rtc {
-class TimestampWrapAroundHandler;
-}
-
-namespace webrtc {
-
-class AudioDeviceModule;
-class FileWrapper;
-class PacketRouter;
-class ProcessThread;
-class RateLimiter;
-class ReceiveStatistics;
-class RemoteNtpTimeEstimator;
-class RtcEventLog;
-class RTPPayloadRegistry;
-class RTPReceiverAudio;
-class RtpPacketReceived;
-class RtpRtcp;
-class RtpTransportControllerSendInterface;
-class TelephoneEventHandler;
-class VoERTPObserver;
-class VoiceEngineObserver;
-
-struct CallStatistics;
-struct ReportBlock;
-struct SenderInfo;
-
-namespace voe {
-
-class OutputMixer;
-class RtcEventLogProxy;
-class RtcpRttStatsProxy;
-class RtpPacketSenderProxy;
-class Statistics;
-class TransportFeedbackProxy;
-class TransportSequenceNumberProxy;
-class VoERtcpObserver;
-
-// Helper class to simplify locking scheme for members that are accessed from
-// multiple threads.
-// Example: a member can be set on thread T1 and read by an internal audio
-// thread T2. Accessing the member via this class ensures that we are
-// safe and also avoid TSan v2 warnings.
-class ChannelState {
- public:
-  struct State {
-    bool output_file_playing = false;
-    bool input_file_playing = false;
-    bool playing = false;
-    bool sending = false;
-  };
-
-  ChannelState() {}
-  virtual ~ChannelState() {}
-
-  void Reset() {
-    rtc::CritScope lock(&lock_);
-    state_ = State();
-  }
-
-  State Get() const {
-    rtc::CritScope lock(&lock_);
-    return state_;
-  }
-
-  void SetOutputFilePlaying(bool enable) {
-    rtc::CritScope lock(&lock_);
-    state_.output_file_playing = enable;
-  }
-
-  void SetInputFilePlaying(bool enable) {
-    rtc::CritScope lock(&lock_);
-    state_.input_file_playing = enable;
-  }
-
-  void SetPlaying(bool enable) {
-    rtc::CritScope lock(&lock_);
-    state_.playing = enable;
-  }
-
-  void SetSending(bool enable) {
-    rtc::CritScope lock(&lock_);
-    state_.sending = enable;
-  }
-
- private:
-  rtc::CriticalSection lock_;
-  State state_;
-};
-
-class Channel
-    : public RtpData,
-      public RtpFeedback,
-      public FileCallback,  // receiving notification from file player &
-                            // recorder
-      public Transport,
-      public AudioPacketizationCallback,  // receive encoded packets from the
-                                          // ACM
-      public MixerParticipant,  // supplies output mixer with audio frames
-      public OverheadObserver {
- public:
-  friend class VoERtcpObserver;
-
-  enum { KNumSocketThreads = 1 };
-  enum { KNumberOfSocketBuffers = 8 };
-  virtual ~Channel();
-  static int32_t CreateChannel(Channel*& channel,
-                               int32_t channelId,
-                               uint32_t instanceId,
-                               const VoEBase::ChannelConfig& config);
-  Channel(int32_t channelId,
-          uint32_t instanceId,
-          const VoEBase::ChannelConfig& config);
-  int32_t Init();
-  void RegisterLegacyReceiveCodecs();
-  void Terminate();
-  int32_t SetEngineInformation(Statistics& engineStatistics,
-                               OutputMixer& outputMixer,
-                               ProcessThread& moduleProcessThread,
-                               AudioDeviceModule& audioDeviceModule,
-                               VoiceEngineObserver* voiceEngineObserver,
-                               rtc::CriticalSection* callbackCritSect,
-                               rtc::TaskQueue* encoder_queue);
-
-  void SetSink(std::unique_ptr<AudioSinkInterface> sink);
-
-  // TODO(ossu): Don't use! It's only here to confirm that the decoder factory
-  // passed into AudioReceiveStream is the same as the one set when creating the
-  // ADM. Once Channel creation is moved into Audio{Send,Receive}Stream this can
-  // go.
-  const rtc::scoped_refptr<AudioDecoderFactory>& GetAudioDecoderFactory() const;
-
-  void SetReceiveCodecs(const std::map<int, SdpAudioFormat>& codecs);
-
-  // Send using this encoder, with this payload type.
-  bool SetEncoder(int payload_type, std::unique_ptr<AudioEncoder> encoder);
-  void ModifyEncoder(
-      rtc::FunctionView<void(std::unique_ptr<AudioEncoder>*)> modifier);
-
-  // API methods
-
-  // VoEBase
-  int32_t StartPlayout();
-  int32_t StopPlayout();
-  int32_t StartSend();
-  void StopSend();
-  int32_t RegisterVoiceEngineObserver(VoiceEngineObserver& observer);
-  int32_t DeRegisterVoiceEngineObserver();
-
-  // VoECodec
-  int32_t GetSendCodec(CodecInst& codec);
-  int32_t GetRecCodec(CodecInst& codec);
-  int32_t SetSendCodec(const CodecInst& codec);
-  void SetBitRate(int bitrate_bps, int64_t probing_interval_ms);
-  int32_t SetVADStatus(bool enableVAD, ACMVADMode mode, bool disableDTX);
-  int32_t GetVADStatus(bool& enabledVAD, ACMVADMode& mode, bool& disabledDTX);
-  int32_t SetRecPayloadType(const CodecInst& codec);
-  int32_t SetRecPayloadType(int payload_type, const SdpAudioFormat& format);
-  int32_t GetRecPayloadType(CodecInst& codec);
-  int32_t SetSendCNPayloadType(int type, PayloadFrequencies frequency);
-  int SetOpusMaxPlaybackRate(int frequency_hz);
-  int SetOpusDtx(bool enable_dtx);
-  int GetOpusDtx(bool* enabled);
-  bool EnableAudioNetworkAdaptor(const std::string& config_string);
-  void DisableAudioNetworkAdaptor();
-  void SetReceiverFrameLengthRange(int min_frame_length_ms,
-                                   int max_frame_length_ms);
-
-  // VoENetwork
-  int32_t RegisterExternalTransport(Transport* transport);
-  int32_t DeRegisterExternalTransport();
-  int32_t ReceivedRTPPacket(const uint8_t* received_packet,
-                            size_t length,
-                            const PacketTime& packet_time);
-  // TODO(nisse, solenberg): Delete when VoENetwork is deleted.
-  int32_t ReceivedRTCPPacket(const uint8_t* data, size_t length);
-  void OnRtpPacket(const RtpPacketReceived& packet);
-
-  // VoEFile
-  int StartPlayingFileLocally(const char* fileName,
-                              bool loop,
-                              FileFormats format,
-                              int startPosition,
-                              float volumeScaling,
-                              int stopPosition,
-                              const CodecInst* codecInst);
-  int StartPlayingFileLocally(InStream* stream,
-                              FileFormats format,
-                              int startPosition,
-                              float volumeScaling,
-                              int stopPosition,
-                              const CodecInst* codecInst);
-  int StopPlayingFileLocally();
-  int IsPlayingFileLocally() const;
-  int RegisterFilePlayingToMixer();
-  int StartPlayingFileAsMicrophone(const char* fileName,
-                                   bool loop,
-                                   FileFormats format,
-                                   int startPosition,
-                                   float volumeScaling,
-                                   int stopPosition,
-                                   const CodecInst* codecInst);
-  int StartPlayingFileAsMicrophone(InStream* stream,
-                                   FileFormats format,
-                                   int startPosition,
-                                   float volumeScaling,
-                                   int stopPosition,
-                                   const CodecInst* codecInst);
-  int StopPlayingFileAsMicrophone();
-  int IsPlayingFileAsMicrophone() const;
-  int StartRecordingPlayout(const char* fileName, const CodecInst* codecInst);
-  int StartRecordingPlayout(OutStream* stream, const CodecInst* codecInst);
-  int StopRecordingPlayout();
-
-  void SetMixWithMicStatus(bool mix);
-
-  // Muting, Volume and Level.
-  void SetInputMute(bool enable);
-  void SetChannelOutputVolumeScaling(float scaling);
-  int GetSpeechOutputLevel() const;
-  int GetSpeechOutputLevelFullRange() const;
-  // See description of "totalAudioEnergy" in the WebRTC stats spec:
-  // https://w3c.github.io/webrtc-stats/#dom-rtcmediastreamtrackstats-totalaudioenergy
-  double GetTotalOutputEnergy() const;
-  double GetTotalOutputDuration() const;
-
-  // Stats.
-  int GetNetworkStatistics(NetworkStatistics& stats);
-  void GetDecodingCallStatistics(AudioDecodingCallStats* stats) const;
-  ANAStats GetANAStatistics() const;
-
-  // Audio+Video Sync.
-  uint32_t GetDelayEstimate() const;
-  int SetMinimumPlayoutDelay(int delayMs);
-  int GetPlayoutTimestamp(unsigned int& timestamp);
-  int GetRtpRtcp(RtpRtcp** rtpRtcpModule, RtpReceiver** rtp_receiver) const;
-
-  // DTMF.
-  int SendTelephoneEventOutband(int event, int duration_ms);
-  int SetSendTelephoneEventPayloadType(int payload_type, int payload_frequency);
-
-  // VoERTP_RTCP
-  int SetLocalSSRC(unsigned int ssrc);
-  int GetLocalSSRC(unsigned int& ssrc);
-  int GetRemoteSSRC(unsigned int& ssrc);
-  int SetSendAudioLevelIndicationStatus(bool enable, unsigned char id);
-  int SetReceiveAudioLevelIndicationStatus(bool enable, unsigned char id);
-  void EnableSendTransportSequenceNumber(int id);
-  void EnableReceiveTransportSequenceNumber(int id);
-
-  void RegisterSenderCongestionControlObjects(
-      RtpTransportControllerSendInterface* transport,
-      RtcpBandwidthObserver* bandwidth_observer);
-  void RegisterReceiverCongestionControlObjects(PacketRouter* packet_router);
-  void ResetSenderCongestionControlObjects();
-  void ResetReceiverCongestionControlObjects();
-  void SetRTCPStatus(bool enable);
-  int GetRTCPStatus(bool& enabled);
-  int SetRTCP_CNAME(const char cName[256]);
-  int GetRemoteRTCP_CNAME(char cName[256]);
-  int SendApplicationDefinedRTCPPacket(unsigned char subType,
-                                       unsigned int name,
-                                       const char* data,
-                                       unsigned short dataLengthInBytes);
-  int GetRemoteRTCPReportBlocks(std::vector<ReportBlock>* report_blocks);
-  int GetRTPStatistics(CallStatistics& stats);
-  int SetCodecFECStatus(bool enable);
-  bool GetCodecFECStatus();
-  void SetNACKStatus(bool enable, int maxNumberOfPackets);
-
-  // From AudioPacketizationCallback in the ACM
-  int32_t SendData(FrameType frameType,
-                   uint8_t payloadType,
-                   uint32_t timeStamp,
-                   const uint8_t* payloadData,
-                   size_t payloadSize,
-                   const RTPFragmentationHeader* fragmentation) override;
-
-  // From RtpData in the RTP/RTCP module
-  int32_t OnReceivedPayloadData(const uint8_t* payloadData,
-                                size_t payloadSize,
-                                const WebRtcRTPHeader* rtpHeader) override;
-
-  // From RtpFeedback in the RTP/RTCP module
-  int32_t OnInitializeDecoder(int8_t payloadType,
-                              const char payloadName[RTP_PAYLOAD_NAME_SIZE],
-                              int frequency,
-                              size_t channels,
-                              uint32_t rate) override;
-  void OnIncomingSSRCChanged(uint32_t ssrc) override;
-  void OnIncomingCSRCChanged(uint32_t CSRC, bool added) override;
-
-  // From Transport (called by the RTP/RTCP module)
-  bool SendRtp(const uint8_t* data,
-               size_t len,
-               const PacketOptions& packet_options) override;
-  bool SendRtcp(const uint8_t* data, size_t len) override;
-
-  // From MixerParticipant
-  MixerParticipant::AudioFrameInfo GetAudioFrameWithMuted(
-      int32_t id,
-      AudioFrame* audioFrame) override;
-  int32_t NeededFrequency(int32_t id) const override;
-
-  // From AudioMixer::Source.
-  AudioMixer::Source::AudioFrameInfo GetAudioFrameWithInfo(
-      int sample_rate_hz,
-      AudioFrame* audio_frame);
-
-  // From FileCallback
-  void PlayNotification(int32_t id, uint32_t durationMs) override;
-  void RecordNotification(int32_t id, uint32_t durationMs) override;
-  void PlayFileEnded(int32_t id) override;
-  void RecordFileEnded(int32_t id) override;
-
-  uint32_t InstanceId() const { return _instanceId; }
-  int32_t ChannelId() const { return _channelId; }
-  bool Playing() const { return channel_state_.Get().playing; }
-  bool Sending() const { return channel_state_.Get().sending; }
-  bool ExternalTransport() const {
-    rtc::CritScope cs(&_callbackCritSect);
-    return _externalTransport;
-  }
-  RtpRtcp* RtpRtcpModulePtr() const { return _rtpRtcpModule.get(); }
-  int8_t OutputEnergyLevel() const { return _outputAudioLevel.Level(); }
-
-  // ProcessAndEncodeAudio() creates an audio frame copy and posts a task
-  // on the shared encoder task queue, wich in turn calls (on the queue)
-  // ProcessAndEncodeAudioOnTaskQueue() where the actual processing of the
-  // audio takes place. The processing mainly consists of encoding and preparing
-  // the result for sending by adding it to a send queue.
-  // The main reason for using a task queue here is to release the native,
-  // OS-specific, audio capture thread as soon as possible to ensure that it
-  // can go back to sleep and be prepared to deliver an new captured audio
-  // packet.
-  void ProcessAndEncodeAudio(const AudioFrame& audio_input);
-
-  // This version of ProcessAndEncodeAudio() is used by PushCaptureData() in
-  // VoEBase and the audio in |audio_data| has not been subject to any APM
-  // processing. Some extra steps are therfore needed when building up the
-  // audio frame copy before using the same task as in the default call to
-  // ProcessAndEncodeAudio(const AudioFrame& audio_input).
-  void ProcessAndEncodeAudio(const int16_t* audio_data,
-                             int sample_rate,
-                             size_t number_of_frames,
-                             size_t number_of_channels);
-
-  // Associate to a send channel.
-  // Used for obtaining RTT for a receive-only channel.
-  void set_associate_send_channel(const ChannelOwner& channel);
-  // Disassociate a send channel if it was associated.
-  void DisassociateSendChannel(int channel_id);
-
-  // Set a RtcEventLog logging object.
-  void SetRtcEventLog(RtcEventLog* event_log);
-
-  void SetRtcpRttStats(RtcpRttStats* rtcp_rtt_stats);
-  void SetTransportOverhead(size_t transport_overhead_per_packet);
-
-  // From OverheadObserver in the RTP/RTCP module
-  void OnOverheadChanged(size_t overhead_bytes_per_packet) override;
-
-  // The existence of this function alongside OnUplinkPacketLossRate is
-  // a compromise. We want the encoder to be agnostic of the PLR source, but
-  // we also don't want it to receive conflicting information from TWCC and
-  // from RTCP-XR.
-  void OnTwccBasedUplinkPacketLossRate(float packet_loss_rate);
-
-  void OnRecoverableUplinkPacketLossRate(float recoverable_packet_loss_rate);
-
-  std::vector<RtpSource> GetSources() const {
-    return rtp_receiver_->GetSources();
-  }
-
- private:
-  class ProcessAndEncodeAudioTask;
-
-  void OnUplinkPacketLossRate(float packet_loss_rate);
-  bool InputMute() const;
-  bool OnRtpPacketWithHeader(const uint8_t* received_packet,
-                             size_t length,
-                             RTPHeader *header);
-  bool OnRecoveredPacket(const uint8_t* packet, size_t packet_length);
-
-  bool ReceivePacket(const uint8_t* packet,
-                     size_t packet_length,
-                     const RTPHeader& header,
-                     bool in_order);
-  bool IsPacketInOrder(const RTPHeader& header) const;
-  bool IsPacketRetransmitted(const RTPHeader& header, bool in_order) const;
-  int ResendPackets(const uint16_t* sequence_numbers, int length);
-  int32_t MixOrReplaceAudioWithFile(AudioFrame* audio_frame);
-  int32_t MixAudioWithFile(AudioFrame& audioFrame, int mixingFrequency);
-  void UpdatePlayoutTimestamp(bool rtcp);
-  void RegisterReceiveCodecsToRTPModule();
-
-  int SetSendRtpHeaderExtension(bool enable,
-                                RTPExtensionType type,
-                                unsigned char id);
-
-  void UpdateOverheadForEncoder()
-      RTC_EXCLUSIVE_LOCKS_REQUIRED(overhead_per_packet_lock_);
-
-  int GetRtpTimestampRateHz() const;
-  int64_t GetRTT(bool allow_associate_channel) const;
-
-  // Called on the encoder task queue when a new input audio frame is ready
-  // for encoding.
-  void ProcessAndEncodeAudioOnTaskQueue(AudioFrame* audio_input);
-
-  uint32_t _instanceId;
-  int32_t _channelId;
-
-  rtc::CriticalSection _fileCritSect;
-  rtc::CriticalSection _callbackCritSect;
-  rtc::CriticalSection volume_settings_critsect_;
-
-  ChannelState channel_state_;
-
-  std::unique_ptr<voe::RtcEventLogProxy> event_log_proxy_;
-  std::unique_ptr<voe::RtcpRttStatsProxy> rtcp_rtt_stats_proxy_;
-
-  std::unique_ptr<RtpHeaderParser> rtp_header_parser_;
-  std::unique_ptr<RTPPayloadRegistry> rtp_payload_registry_;
-  std::unique_ptr<ReceiveStatistics> rtp_receive_statistics_;
-  std::unique_ptr<RtpReceiver> rtp_receiver_;
-  TelephoneEventHandler* telephone_event_handler_;
-  std::unique_ptr<RtpRtcp> _rtpRtcpModule;
-  std::unique_ptr<AudioCodingModule> audio_coding_;
-  acm2::CodecManager codec_manager_;
-  acm2::RentACodec rent_a_codec_;
-  std::unique_ptr<AudioSinkInterface> audio_sink_;
-  AudioLevel _outputAudioLevel;
-  bool _externalTransport;
-  // Downsamples to the codec rate if necessary.
-  PushResampler<int16_t> input_resampler_;
-  std::unique_ptr<FilePlayer> input_file_player_;
-  std::unique_ptr<FilePlayer> output_file_player_;
-  std::unique_ptr<FileRecorder> output_file_recorder_;
-  int _inputFilePlayerId;
-  int _outputFilePlayerId;
-  int _outputFileRecorderId;
-  bool _outputFileRecording;
-  uint32_t _timeStamp RTC_ACCESS_ON(encoder_queue_);
-
-  RemoteNtpTimeEstimator ntp_estimator_ RTC_GUARDED_BY(ts_stats_lock_);
-
-  // Timestamp of the audio pulled from NetEq.
-  rtc::Optional<uint32_t> jitter_buffer_playout_timestamp_;
-
-  rtc::CriticalSection video_sync_lock_;
-  uint32_t playout_timestamp_rtp_ RTC_GUARDED_BY(video_sync_lock_);
-  uint32_t playout_delay_ms_ RTC_GUARDED_BY(video_sync_lock_);
-  uint16_t send_sequence_number_;
-
-  rtc::CriticalSection ts_stats_lock_;
-
-  std::unique_ptr<rtc::TimestampWrapAroundHandler> rtp_ts_wraparound_handler_;
-  // The rtp timestamp of the first played out audio frame.
-  int64_t capture_start_rtp_time_stamp_;
-  // The capture ntp time (in local timebase) of the first played out audio
-  // frame.
-  int64_t capture_start_ntp_time_ms_ RTC_GUARDED_BY(ts_stats_lock_);
-
-  // uses
-  Statistics* _engineStatisticsPtr;
-  OutputMixer* _outputMixerPtr;
-  ProcessThread* _moduleProcessThreadPtr;
-  AudioDeviceModule* _audioDeviceModulePtr;
-  VoiceEngineObserver* _voiceEngineObserverPtr;  // owned by base
-  rtc::CriticalSection* _callbackCritSectPtr;    // owned by base
-  Transport* _transportPtr;  // WebRtc socket or external transport
-  RmsLevel rms_level_ RTC_ACCESS_ON(encoder_queue_);
-  bool input_mute_ RTC_GUARDED_BY(volume_settings_critsect_);
-  bool previous_frame_muted_ RTC_ACCESS_ON(encoder_queue_);
-  float _outputGain RTC_GUARDED_BY(volume_settings_critsect_);
-  // VoEBase
-  bool _mixFileWithMicrophone;
-  // VoeRTP_RTCP
-  // TODO(henrika): can today be accessed on the main thread and on the
-  // task queue; hence potential race.
-  bool _includeAudioLevelIndication;
-  size_t transport_overhead_per_packet_
-      RTC_GUARDED_BY(overhead_per_packet_lock_);
-  size_t rtp_overhead_per_packet_ RTC_GUARDED_BY(overhead_per_packet_lock_);
-  rtc::CriticalSection overhead_per_packet_lock_;
-  // VoENetwork
-  AudioFrame::SpeechType _outputSpeechType;
-  // RtcpBandwidthObserver
-  std::unique_ptr<VoERtcpObserver> rtcp_observer_;
-  // An associated send channel.
-  rtc::CriticalSection assoc_send_channel_lock_;
-  ChannelOwner associate_send_channel_ RTC_GUARDED_BY(assoc_send_channel_lock_);
-
-  bool pacing_enabled_;
-  PacketRouter* packet_router_ = nullptr;
-  std::unique_ptr<TransportFeedbackProxy> feedback_observer_proxy_;
-  std::unique_ptr<TransportSequenceNumberProxy> seq_num_allocator_proxy_;
-  std::unique_ptr<RtpPacketSenderProxy> rtp_packet_sender_proxy_;
-  std::unique_ptr<RateLimiter> retransmission_rate_limiter_;
-
-  // TODO(ossu): Remove once GetAudioDecoderFactory() is no longer needed.
-  rtc::scoped_refptr<AudioDecoderFactory> decoder_factory_;
-
-  rtc::Optional<CodecInst> cached_send_codec_;
-
-  rtc::ThreadChecker construction_thread_;
-
-  const bool use_twcc_plr_for_ana_;
-
-  rtc::CriticalSection encoder_queue_lock_;
-
-  bool encoder_queue_is_active_ RTC_GUARDED_BY(encoder_queue_lock_) = false;
-
-  rtc::TaskQueue* encoder_queue_ = nullptr;
-};
-
-}  // namespace voe
-}  // namespace webrtc
-
-#endif  // WEBRTC_VOICE_ENGINE_CHANNEL_H_
diff --git a/voice_engine/channel_manager.cc b/voice_engine/channel_manager.cc
deleted file mode 100644
index ff7a802..0000000
--- a/voice_engine/channel_manager.cc
+++ /dev/null
@@ -1,157 +0,0 @@
-/*
- *  Copyright (c) 2011 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/voice_engine/channel_manager.h"
-
-#include "webrtc/rtc_base/timeutils.h"
-#include "webrtc/voice_engine/channel.h"
-
-namespace webrtc {
-namespace voe {
-
-ChannelOwner::ChannelOwner(class Channel* channel)
-    : channel_ref_(new ChannelRef(channel)) {}
-
-ChannelOwner::ChannelOwner(const ChannelOwner& channel_owner)
-    : channel_ref_(channel_owner.channel_ref_) {
-  ++channel_ref_->ref_count;
-}
-
-ChannelOwner::~ChannelOwner() {
-  if (--channel_ref_->ref_count == 0)
-    delete channel_ref_;
-}
-
-ChannelOwner& ChannelOwner::operator=(const ChannelOwner& other) {
-  if (other.channel_ref_ == channel_ref_)
-    return *this;
-
-  if (--channel_ref_->ref_count == 0)
-    delete channel_ref_;
-
-  channel_ref_ = other.channel_ref_;
-  ++channel_ref_->ref_count;
-
-  return *this;
-}
-
-ChannelOwner::ChannelRef::ChannelRef(class Channel* channel)
-    : channel(channel), ref_count(1) {}
-
-ChannelManager::ChannelManager(uint32_t instance_id)
-    : instance_id_(instance_id),
-      last_channel_id_(-1),
-      random_(rtc::TimeNanos()) {}
-
-ChannelOwner ChannelManager::CreateChannel(
-    const VoEBase::ChannelConfig& config) {
-  Channel* channel;
-  Channel::CreateChannel(channel, ++last_channel_id_, instance_id_, config);
-  // TODO(solenberg): Delete this, users should configure ssrc
-  // explicitly.
-  channel->SetLocalSSRC(random_.Rand<uint32_t>());
-
-  ChannelOwner channel_owner(channel);
-
-  rtc::CritScope crit(&lock_);
-
-  channels_.push_back(channel_owner);
-
-  return channel_owner;
-}
-
-ChannelOwner ChannelManager::GetChannel(int32_t channel_id) {
-  rtc::CritScope crit(&lock_);
-
-  for (size_t i = 0; i < channels_.size(); ++i) {
-    if (channels_[i].channel()->ChannelId() == channel_id)
-      return channels_[i];
-  }
-  return ChannelOwner(NULL);
-}
-
-void ChannelManager::GetAllChannels(std::vector<ChannelOwner>* channels) {
-  rtc::CritScope crit(&lock_);
-
-  *channels = channels_;
-}
-
-void ChannelManager::DestroyChannel(int32_t channel_id) {
-  assert(channel_id >= 0);
-  // Holds a reference to a channel, this is used so that we never delete
-  // Channels while holding a lock, but rather when the method returns.
-  ChannelOwner reference(NULL);
-  {
-    rtc::CritScope crit(&lock_);
-    std::vector<ChannelOwner>::iterator to_delete = channels_.end();
-    for (auto it = channels_.begin(); it != channels_.end(); ++it) {
-      Channel* channel = it->channel();
-      // For channels associated with the channel to be deleted, disassociate
-      // with that channel.
-      channel->DisassociateSendChannel(channel_id);
-
-      if (channel->ChannelId() == channel_id) {
-        to_delete = it;
-      }
-    }
-    if (to_delete != channels_.end()) {
-      reference = *to_delete;
-      channels_.erase(to_delete);
-    }
-  }
-  if (reference.channel()) {
-    // Ensure the channel is torn down now, on this thread, since a reference
-    // may still be held on a different thread (e.g. in the audio capture
-    // thread).
-    reference.channel()->Terminate();
-  }
-}
-
-void ChannelManager::DestroyAllChannels() {
-  // Holds references so that Channels are not destroyed while holding this
-  // lock, but rather when the method returns.
-  std::vector<ChannelOwner> references;
-  {
-    rtc::CritScope crit(&lock_);
-    references = channels_;
-    channels_.clear();
-  }
-  for (auto& owner : references) {
-    if (owner.channel())
-      owner.channel()->Terminate();
-  }
-}
-
-size_t ChannelManager::NumOfChannels() const {
-  rtc::CritScope crit(&lock_);
-  return channels_.size();
-}
-
-ChannelManager::Iterator::Iterator(ChannelManager* channel_manager)
-    : iterator_pos_(0) {
-  channel_manager->GetAllChannels(&channels_);
-}
-
-Channel* ChannelManager::Iterator::GetChannel() {
-  if (iterator_pos_ < channels_.size())
-    return channels_[iterator_pos_].channel();
-  return NULL;
-}
-
-bool ChannelManager::Iterator::IsValid() {
-  return iterator_pos_ < channels_.size();
-}
-
-void ChannelManager::Iterator::Increment() {
-  ++iterator_pos_;
-}
-
-}  // namespace voe
-}  // namespace webrtc
diff --git a/voice_engine/channel_manager.h b/voice_engine/channel_manager.h
deleted file mode 100644
index 11a44cf..0000000
--- a/voice_engine/channel_manager.h
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- *  Copyright (c) 2011 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_VOICE_ENGINE_CHANNEL_MANAGER_H
-#define WEBRTC_VOICE_ENGINE_CHANNEL_MANAGER_H
-
-#include <memory>
-#include <vector>
-
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/random.h"
-#include "webrtc/rtc_base/scoped_ref_ptr.h"
-#include "webrtc/system_wrappers/include/atomic32.h"
-#include "webrtc/typedefs.h"
-#include "webrtc/voice_engine/include/voe_base.h"
-
-namespace webrtc {
-
-class AudioDecoderFactory;
-
-namespace voe {
-
-class Channel;
-
-// Shared-pointer implementation for keeping track of Channels. The underlying
-// shared instance will be dropped when no more ChannelOwners point to it.
-//
-// One common source of ChannelOwner instances are
-// ChannelManager::CreateChannel() and ChannelManager::GetChannel(...).
-// It has a similar use case to shared_ptr in C++11. Should this move to C++11
-// in the future, this class should be replaced by exactly that.
-//
-// To access the underlying Channel, use .channel().
-// IsValid() implements a convenience method as an alternative for checking
-// whether the underlying pointer is NULL or not.
-//
-// Channel channel_owner = channel_manager.GetChannel(channel_id);
-// if (channel_owner.IsValid())
-//   channel_owner.channel()->...;
-//
-class ChannelOwner {
- public:
-  explicit ChannelOwner(Channel* channel);
-  ChannelOwner(const ChannelOwner& channel_owner);
-
-  ~ChannelOwner();
-
-  ChannelOwner& operator=(const ChannelOwner& other);
-
-  Channel* channel() const { return channel_ref_->channel.get(); }
-  bool IsValid() { return channel_ref_->channel.get() != NULL; }
-  int use_count() const { return channel_ref_->ref_count.Value(); }
- private:
-  // Shared instance of a Channel. Copying ChannelOwners increase the reference
-  // count and destroying ChannelOwners decrease references. Channels are
-  // deleted when no references to them are held.
-  struct ChannelRef {
-    ChannelRef(Channel* channel);
-    const std::unique_ptr<Channel> channel;
-    Atomic32 ref_count;
-  };
-
-  ChannelRef* channel_ref_;
-};
-
-class ChannelManager {
- public:
-  ChannelManager(uint32_t instance_id);
-
-  // Upon construction of an Iterator it will grab a copy of the channel list of
-  // the ChannelManager. The iteration will then occur over this state, not the
-  // current one of the ChannelManager. As the Iterator holds its own references
-  // to the Channels, they will remain valid even if they are removed from the
-  // ChannelManager.
-  class Iterator {
-   public:
-    explicit Iterator(ChannelManager* channel_manager);
-
-    Channel* GetChannel();
-    bool IsValid();
-
-    void Increment();
-
-   private:
-    size_t iterator_pos_;
-    std::vector<ChannelOwner> channels_;
-
-    RTC_DISALLOW_COPY_AND_ASSIGN(Iterator);
-  };
-
-  // CreateChannel will always return a valid ChannelOwner instance.
-  ChannelOwner CreateChannel(const VoEBase::ChannelConfig& config);
-
-  // ChannelOwner.channel() will be NULL if channel_id is invalid or no longer
-  // exists. This should be checked with ChannelOwner::IsValid().
-  ChannelOwner GetChannel(int32_t channel_id);
-  void GetAllChannels(std::vector<ChannelOwner>* channels);
-
-  void DestroyChannel(int32_t channel_id);
-  void DestroyAllChannels();
-
-  size_t NumOfChannels() const;
-
- private:
-  uint32_t instance_id_;
-
-  Atomic32 last_channel_id_;
-
-  rtc::CriticalSection lock_;
-  std::vector<ChannelOwner> channels_;
-
-  // For generation of random ssrc:s.
-  webrtc::Random random_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(ChannelManager);
-};
-}  // namespace voe
-}  // namespace webrtc
-
-#endif  // WEBRTC_VOICE_ENGINE_CHANNEL_MANAGER_H
diff --git a/voice_engine/channel_proxy.cc b/voice_engine/channel_proxy.cc
deleted file mode 100644
index 5f4f98a..0000000
--- a/voice_engine/channel_proxy.cc
+++ /dev/null
@@ -1,353 +0,0 @@
-/*
- *  Copyright (c) 2015 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/voice_engine/channel_proxy.h"
-
-#include <utility>
-
-#include "webrtc/api/call/audio_sink.h"
-#include "webrtc/call/rtp_transport_controller_send_interface.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/safe_minmax.h"
-#include "webrtc/voice_engine/channel.h"
-
-namespace webrtc {
-namespace voe {
-ChannelProxy::ChannelProxy() : channel_owner_(nullptr) {}
-
-ChannelProxy::ChannelProxy(const ChannelOwner& channel_owner) :
-    channel_owner_(channel_owner) {
-  RTC_CHECK(channel_owner_.channel());
-  module_process_thread_checker_.DetachFromThread();
-}
-
-ChannelProxy::~ChannelProxy() {}
-
-bool ChannelProxy::SetEncoder(int payload_type,
-                              std::unique_ptr<AudioEncoder> encoder) {
-  RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-  return channel()->SetEncoder(payload_type, std::move(encoder));
-}
-
-void ChannelProxy::ModifyEncoder(
-    rtc::FunctionView<void(std::unique_ptr<AudioEncoder>*)> modifier) {
-  RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-  channel()->ModifyEncoder(modifier);
-}
-
-void ChannelProxy::SetRTCPStatus(bool enable) {
-  RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-  channel()->SetRTCPStatus(enable);
-}
-
-void ChannelProxy::SetLocalSSRC(uint32_t ssrc) {
-  RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-  int error = channel()->SetLocalSSRC(ssrc);
-  RTC_DCHECK_EQ(0, error);
-}
-
-void ChannelProxy::SetRTCP_CNAME(const std::string& c_name) {
-  RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-  // Note: VoERTP_RTCP::SetRTCP_CNAME() accepts a char[256] array.
-  std::string c_name_limited = c_name.substr(0, 255);
-  int error = channel()->SetRTCP_CNAME(c_name_limited.c_str());
-  RTC_DCHECK_EQ(0, error);
-}
-
-void ChannelProxy::SetNACKStatus(bool enable, int max_packets) {
-  RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-  channel()->SetNACKStatus(enable, max_packets);
-}
-
-void ChannelProxy::SetSendAudioLevelIndicationStatus(bool enable, int id) {
-  RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-  int error = channel()->SetSendAudioLevelIndicationStatus(enable, id);
-  RTC_DCHECK_EQ(0, error);
-}
-
-void ChannelProxy::SetReceiveAudioLevelIndicationStatus(bool enable, int id) {
-  RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-  int error = channel()->SetReceiveAudioLevelIndicationStatus(enable, id);
-  RTC_DCHECK_EQ(0, error);
-}
-
-void ChannelProxy::EnableSendTransportSequenceNumber(int id) {
-  RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-  channel()->EnableSendTransportSequenceNumber(id);
-}
-
-void ChannelProxy::EnableReceiveTransportSequenceNumber(int id) {
-  RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-  channel()->EnableReceiveTransportSequenceNumber(id);
-}
-
-void ChannelProxy::RegisterSenderCongestionControlObjects(
-    RtpTransportControllerSendInterface* transport,
-    RtcpBandwidthObserver* bandwidth_observer) {
-  RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-  channel()->RegisterSenderCongestionControlObjects(transport,
-                                                    bandwidth_observer);
-}
-
-void ChannelProxy::RegisterReceiverCongestionControlObjects(
-    PacketRouter* packet_router) {
-  RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-  channel()->RegisterReceiverCongestionControlObjects(packet_router);
-}
-
-void ChannelProxy::ResetSenderCongestionControlObjects() {
-  RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-  channel()->ResetSenderCongestionControlObjects();
-}
-
-void ChannelProxy::ResetReceiverCongestionControlObjects() {
-  RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-  channel()->ResetReceiverCongestionControlObjects();
-}
-
-CallStatistics ChannelProxy::GetRTCPStatistics() const {
-  RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-  CallStatistics stats = {0};
-  int error = channel()->GetRTPStatistics(stats);
-  RTC_DCHECK_EQ(0, error);
-  return stats;
-}
-
-std::vector<ReportBlock> ChannelProxy::GetRemoteRTCPReportBlocks() const {
-  RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-  std::vector<webrtc::ReportBlock> blocks;
-  int error = channel()->GetRemoteRTCPReportBlocks(&blocks);
-  RTC_DCHECK_EQ(0, error);
-  return blocks;
-}
-
-NetworkStatistics ChannelProxy::GetNetworkStatistics() const {
-  RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-  NetworkStatistics stats = {0};
-  int error = channel()->GetNetworkStatistics(stats);
-  RTC_DCHECK_EQ(0, error);
-  return stats;
-}
-
-AudioDecodingCallStats ChannelProxy::GetDecodingCallStatistics() const {
-  RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-  AudioDecodingCallStats stats;
-  channel()->GetDecodingCallStatistics(&stats);
-  return stats;
-}
-
-ANAStats ChannelProxy::GetANAStatistics() const {
-  RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-  return channel()->GetANAStatistics();
-}
-
-int ChannelProxy::GetSpeechOutputLevel() const {
-  RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-  return channel()->GetSpeechOutputLevel();
-}
-
-int ChannelProxy::GetSpeechOutputLevelFullRange() const {
-  RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-  return channel()->GetSpeechOutputLevelFullRange();
-}
-
-double ChannelProxy::GetTotalOutputEnergy() const {
-  RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-  return channel()->GetTotalOutputEnergy();
-}
-
-double ChannelProxy::GetTotalOutputDuration() const {
-  RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-  return channel()->GetTotalOutputDuration();
-}
-
-uint32_t ChannelProxy::GetDelayEstimate() const {
-  RTC_DCHECK(worker_thread_checker_.CalledOnValidThread() ||
-             module_process_thread_checker_.CalledOnValidThread());
-  return channel()->GetDelayEstimate();
-}
-
-bool ChannelProxy::SetSendTelephoneEventPayloadType(int payload_type,
-                                                    int payload_frequency) {
-  RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-  return channel()->SetSendTelephoneEventPayloadType(payload_type,
-                                                     payload_frequency) == 0;
-}
-
-bool ChannelProxy::SendTelephoneEventOutband(int event, int duration_ms) {
-  RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-  return channel()->SendTelephoneEventOutband(event, duration_ms) == 0;
-}
-
-void ChannelProxy::SetBitrate(int bitrate_bps, int64_t probing_interval_ms) {
-  // This method can be called on the worker thread, module process thread
-  // or on a TaskQueue via VideoSendStreamImpl::OnEncoderConfigurationChanged.
-  // TODO(solenberg): Figure out a good way to check this or enforce calling
-  // rules.
-  // RTC_DCHECK(worker_thread_checker_.CalledOnValidThread() ||
-  //            module_process_thread_checker_.CalledOnValidThread());
-  channel()->SetBitRate(bitrate_bps, probing_interval_ms);
-}
-
-void ChannelProxy::SetRecPayloadType(int payload_type,
-                                     const SdpAudioFormat& format) {
-  RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-  const int result = channel()->SetRecPayloadType(payload_type, format);
-  RTC_DCHECK_EQ(0, result);
-}
-
-void ChannelProxy::SetReceiveCodecs(
-    const std::map<int, SdpAudioFormat>& codecs) {
-  RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-  channel()->SetReceiveCodecs(codecs);
-}
-
-void ChannelProxy::SetSink(std::unique_ptr<AudioSinkInterface> sink) {
-  RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-  channel()->SetSink(std::move(sink));
-}
-
-void ChannelProxy::SetInputMute(bool muted) {
-  RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-  channel()->SetInputMute(muted);
-}
-
-void ChannelProxy::RegisterExternalTransport(Transport* transport) {
-  RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-  int error = channel()->RegisterExternalTransport(transport);
-  RTC_DCHECK_EQ(0, error);
-}
-
-void ChannelProxy::DeRegisterExternalTransport() {
-  RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-  channel()->DeRegisterExternalTransport();
-}
-
-void ChannelProxy::OnRtpPacket(const RtpPacketReceived& packet) {
-  // May be called on either worker thread or network thread.
-  channel()->OnRtpPacket(packet);
-}
-
-bool ChannelProxy::ReceivedRTCPPacket(const uint8_t* packet, size_t length) {
-  // May be called on either worker thread or network thread.
-  return channel()->ReceivedRTCPPacket(packet, length) == 0;
-}
-
-const rtc::scoped_refptr<AudioDecoderFactory>&
-    ChannelProxy::GetAudioDecoderFactory() const {
-  RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-  return channel()->GetAudioDecoderFactory();
-}
-
-void ChannelProxy::SetChannelOutputVolumeScaling(float scaling) {
-  RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-  channel()->SetChannelOutputVolumeScaling(scaling);
-}
-
-void ChannelProxy::SetRtcEventLog(RtcEventLog* event_log) {
-  RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-  channel()->SetRtcEventLog(event_log);
-}
-
-AudioMixer::Source::AudioFrameInfo ChannelProxy::GetAudioFrameWithInfo(
-    int sample_rate_hz,
-    AudioFrame* audio_frame) {
-  RTC_DCHECK_RUNS_SERIALIZED(&audio_thread_race_checker_);
-  return channel()->GetAudioFrameWithInfo(sample_rate_hz, audio_frame);
-}
-
-int ChannelProxy::NeededFrequency() const {
-  RTC_DCHECK_RUNS_SERIALIZED(&audio_thread_race_checker_);
-  return static_cast<int>(channel()->NeededFrequency(-1));
-}
-
-void ChannelProxy::SetTransportOverhead(int transport_overhead_per_packet) {
-  RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-  channel()->SetTransportOverhead(transport_overhead_per_packet);
-}
-
-void ChannelProxy::AssociateSendChannel(
-    const ChannelProxy& send_channel_proxy) {
-  RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-  channel()->set_associate_send_channel(send_channel_proxy.channel_owner_);
-}
-
-void ChannelProxy::DisassociateSendChannel() {
-  RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-  channel()->set_associate_send_channel(ChannelOwner(nullptr));
-}
-
-void ChannelProxy::GetRtpRtcp(RtpRtcp** rtp_rtcp,
-                              RtpReceiver** rtp_receiver) const {
-  RTC_DCHECK(module_process_thread_checker_.CalledOnValidThread());
-  RTC_DCHECK(rtp_rtcp);
-  RTC_DCHECK(rtp_receiver);
-  int error = channel()->GetRtpRtcp(rtp_rtcp, rtp_receiver);
-  RTC_DCHECK_EQ(0, error);
-}
-
-uint32_t ChannelProxy::GetPlayoutTimestamp() const {
-  RTC_DCHECK_RUNS_SERIALIZED(&video_capture_thread_race_checker_);
-  unsigned int timestamp = 0;
-  int error = channel()->GetPlayoutTimestamp(timestamp);
-  RTC_DCHECK(!error || timestamp == 0);
-  return timestamp;
-}
-
-void ChannelProxy::SetMinimumPlayoutDelay(int delay_ms) {
-  RTC_DCHECK(module_process_thread_checker_.CalledOnValidThread());
-  // Limit to range accepted by both VoE and ACM, so we're at least getting as
-  // close as possible, instead of failing.
-  delay_ms = rtc::SafeClamp(delay_ms, 0, 10000);
-  int error = channel()->SetMinimumPlayoutDelay(delay_ms);
-  if (0 != error) {
-    LOG(LS_WARNING) << "Error setting minimum playout delay.";
-  }
-}
-
-void ChannelProxy::SetRtcpRttStats(RtcpRttStats* rtcp_rtt_stats) {
-  RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-  channel()->SetRtcpRttStats(rtcp_rtt_stats);
-}
-
-bool ChannelProxy::GetRecCodec(CodecInst* codec_inst) const {
-  RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-  return channel()->GetRecCodec(*codec_inst) == 0;
-}
-
-void ChannelProxy::OnTwccBasedUplinkPacketLossRate(float packet_loss_rate) {
-  RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-  channel()->OnTwccBasedUplinkPacketLossRate(packet_loss_rate);
-}
-
-void ChannelProxy::OnRecoverableUplinkPacketLossRate(
-    float recoverable_packet_loss_rate) {
-  RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-  channel()->OnRecoverableUplinkPacketLossRate(recoverable_packet_loss_rate);
-}
-
-void ChannelProxy::RegisterLegacyReceiveCodecs() {
-  RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-  channel()->RegisterLegacyReceiveCodecs();
-}
-
-std::vector<RtpSource> ChannelProxy::GetSources() const {
-  RTC_DCHECK(worker_thread_checker_.CalledOnValidThread());
-  return channel()->GetSources();
-}
-
-Channel* ChannelProxy::channel() const {
-  RTC_DCHECK(channel_owner_.channel());
-  return channel_owner_.channel();
-}
-
-}  // namespace voe
-}  // namespace webrtc
diff --git a/voice_engine/channel_proxy.h b/voice_engine/channel_proxy.h
deleted file mode 100644
index 826117b..0000000
--- a/voice_engine/channel_proxy.h
+++ /dev/null
@@ -1,152 +0,0 @@
-/*
- *  Copyright (c) 2015 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_VOICE_ENGINE_CHANNEL_PROXY_H_
-#define WEBRTC_VOICE_ENGINE_CHANNEL_PROXY_H_
-
-#include "webrtc/api/audio/audio_mixer.h"
-#include "webrtc/api/audio_codecs/audio_encoder.h"
-#include "webrtc/api/rtpreceiverinterface.h"
-#include "webrtc/call/rtp_packet_sink_interface.h"
-#include "webrtc/rtc_base/constructormagic.h"
-#include "webrtc/rtc_base/race_checker.h"
-#include "webrtc/rtc_base/thread_checker.h"
-#include "webrtc/voice_engine/channel_manager.h"
-#include "webrtc/voice_engine/include/voe_rtp_rtcp.h"
-
-#include <memory>
-#include <string>
-#include <vector>
-
-namespace webrtc {
-
-class AudioSinkInterface;
-class PacketRouter;
-class RtcEventLog;
-class RtcpBandwidthObserver;
-class RtcpRttStats;
-class RtpPacketSender;
-class RtpPacketReceived;
-class RtpReceiver;
-class RtpRtcp;
-class RtpTransportControllerSendInterface;
-class Transport;
-class TransportFeedbackObserver;
-
-namespace voe {
-
-class Channel;
-
-// This class provides the "view" of a voe::Channel that we need to implement
-// webrtc::AudioSendStream and webrtc::AudioReceiveStream. It serves two
-// purposes:
-//  1. Allow mocking just the interfaces used, instead of the entire
-//     voe::Channel class.
-//  2. Provide a refined interface for the stream classes, including assumptions
-//     on return values and input adaptation.
-class ChannelProxy : public RtpPacketSinkInterface {
- public:
-  ChannelProxy();
-  explicit ChannelProxy(const ChannelOwner& channel_owner);
-  virtual ~ChannelProxy();
-
-  virtual bool SetEncoder(int payload_type,
-                          std::unique_ptr<AudioEncoder> encoder);
-  virtual void ModifyEncoder(
-      rtc::FunctionView<void(std::unique_ptr<AudioEncoder>*)> modifier);
-
-  virtual void SetRTCPStatus(bool enable);
-  virtual void SetLocalSSRC(uint32_t ssrc);
-  virtual void SetRTCP_CNAME(const std::string& c_name);
-  virtual void SetNACKStatus(bool enable, int max_packets);
-  virtual void SetSendAudioLevelIndicationStatus(bool enable, int id);
-  virtual void SetReceiveAudioLevelIndicationStatus(bool enable, int id);
-  virtual void EnableSendTransportSequenceNumber(int id);
-  virtual void EnableReceiveTransportSequenceNumber(int id);
-  virtual void RegisterSenderCongestionControlObjects(
-      RtpTransportControllerSendInterface* transport,
-      RtcpBandwidthObserver* bandwidth_observer);
-  virtual void RegisterReceiverCongestionControlObjects(
-      PacketRouter* packet_router);
-  virtual void ResetSenderCongestionControlObjects();
-  virtual void ResetReceiverCongestionControlObjects();
-  virtual CallStatistics GetRTCPStatistics() const;
-  virtual std::vector<ReportBlock> GetRemoteRTCPReportBlocks() const;
-  virtual NetworkStatistics GetNetworkStatistics() const;
-  virtual AudioDecodingCallStats GetDecodingCallStatistics() const;
-  virtual ANAStats GetANAStatistics() const;
-  virtual int GetSpeechOutputLevel() const;
-  virtual int GetSpeechOutputLevelFullRange() const;
-  // See description of "totalAudioEnergy" in the WebRTC stats spec:
-  // https://w3c.github.io/webrtc-stats/#dom-rtcmediastreamtrackstats-totalaudioenergy
-  virtual double GetTotalOutputEnergy() const;
-  virtual double GetTotalOutputDuration() const;
-  virtual uint32_t GetDelayEstimate() const;
-  virtual bool SetSendTelephoneEventPayloadType(int payload_type,
-                                                int payload_frequency);
-  virtual bool SendTelephoneEventOutband(int event, int duration_ms);
-  virtual void SetBitrate(int bitrate_bps, int64_t probing_interval_ms);
-  virtual void SetRecPayloadType(int payload_type,
-                                 const SdpAudioFormat& format);
-  virtual void SetReceiveCodecs(const std::map<int, SdpAudioFormat>& codecs);
-  virtual void SetSink(std::unique_ptr<AudioSinkInterface> sink);
-  virtual void SetInputMute(bool muted);
-  virtual void RegisterExternalTransport(Transport* transport);
-  virtual void DeRegisterExternalTransport();
-
-  // Implements RtpPacketSinkInterface
-  void OnRtpPacket(const RtpPacketReceived& packet) override;
-  virtual bool ReceivedRTCPPacket(const uint8_t* packet, size_t length);
-  virtual const rtc::scoped_refptr<AudioDecoderFactory>&
-      GetAudioDecoderFactory() const;
-  virtual void SetChannelOutputVolumeScaling(float scaling);
-  virtual void SetRtcEventLog(RtcEventLog* event_log);
-  virtual AudioMixer::Source::AudioFrameInfo GetAudioFrameWithInfo(
-      int sample_rate_hz,
-      AudioFrame* audio_frame);
-  virtual int NeededFrequency() const;
-  virtual void SetTransportOverhead(int transport_overhead_per_packet);
-  virtual void AssociateSendChannel(const ChannelProxy& send_channel_proxy);
-  virtual void DisassociateSendChannel();
-  virtual void GetRtpRtcp(RtpRtcp** rtp_rtcp,
-                          RtpReceiver** rtp_receiver) const;
-  virtual uint32_t GetPlayoutTimestamp() const;
-  virtual void SetMinimumPlayoutDelay(int delay_ms);
-  virtual void SetRtcpRttStats(RtcpRttStats* rtcp_rtt_stats);
-  virtual bool GetRecCodec(CodecInst* codec_inst) const;
-  virtual void OnTwccBasedUplinkPacketLossRate(float packet_loss_rate);
-  virtual void OnRecoverableUplinkPacketLossRate(
-      float recoverable_packet_loss_rate);
-  virtual void RegisterLegacyReceiveCodecs();
-  virtual std::vector<webrtc::RtpSource> GetSources() const;
-
- private:
-  Channel* channel() const;
-
-  // Thread checkers document and lock usage of some methods on voe::Channel to
-  // specific threads we know about. The goal is to eventually split up
-  // voe::Channel into parts with single-threaded semantics, and thereby reduce
-  // the need for locks.
-  rtc::ThreadChecker worker_thread_checker_;
-  rtc::ThreadChecker module_process_thread_checker_;
-  // Methods accessed from audio and video threads are checked for sequential-
-  // only access. We don't necessarily own and control these threads, so thread
-  // checkers cannot be used. E.g. Chromium may transfer "ownership" from one
-  // audio thread to another, but access is still sequential.
-  rtc::RaceChecker audio_thread_race_checker_;
-  rtc::RaceChecker video_capture_thread_race_checker_;
-  ChannelOwner channel_owner_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(ChannelProxy);
-};
-}  // namespace voe
-}  // namespace webrtc
-
-#endif  // WEBRTC_VOICE_ENGINE_CHANNEL_PROXY_H_
diff --git a/voice_engine/channel_unittest.cc b/voice_engine/channel_unittest.cc
deleted file mode 100644
index e040b77..0000000
--- a/voice_engine/channel_unittest.cc
+++ /dev/null
@@ -1,15 +0,0 @@
-/*
- *  Copyright (c) 2011 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/test/gtest.h"
-#include "webrtc/voice_engine/channel.h"
-
-// Empty test just to get coverage metrics.
-TEST(ChannelTest, EmptyTestToGetCodeCoverage) {}
diff --git a/voice_engine/coder.cc b/voice_engine/coder.cc
deleted file mode 100644
index 6337e10..0000000
--- a/voice_engine/coder.cc
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- *  Copyright (c) 2012 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/voice_engine/coder.h"
-
-#include "webrtc/api/audio_codecs/builtin_audio_decoder_factory.h"
-#include "webrtc/common_types.h"
-#include "webrtc/modules/audio_coding/codecs/audio_format_conversion.h"
-#include "webrtc/modules/include/module_common_types.h"
-
-namespace webrtc {
-namespace {
-AudioCodingModule::Config GetAcmConfig(uint32_t id) {
-  AudioCodingModule::Config config;
-  // This class does not handle muted output.
-  config.neteq_config.enable_muted_state = false;
-  config.id = id;
-  config.decoder_factory = CreateBuiltinAudioDecoderFactory();
-  return config;
-}
-}  // namespace
-
-AudioCoder::AudioCoder(uint32_t instance_id)
-    : acm_(AudioCodingModule::Create(GetAcmConfig(instance_id))),
-      receive_codec_(),
-      encode_timestamp_(0),
-      encoded_data_(nullptr),
-      encoded_length_in_bytes_(0),
-      decode_timestamp_(0) {
-  acm_->InitializeReceiver();
-  acm_->RegisterTransportCallback(this);
-}
-
-AudioCoder::~AudioCoder() {}
-
-int32_t AudioCoder::SetEncodeCodec(const CodecInst& codec_inst) {
-  const bool success = codec_manager_.RegisterEncoder(codec_inst) &&
-                       codec_manager_.MakeEncoder(&rent_a_codec_, acm_.get());
-  return success ? 0 : -1;
-}
-
-int32_t AudioCoder::SetDecodeCodec(const CodecInst& codec_inst) {
-  if (!acm_->RegisterReceiveCodec(codec_inst.pltype,
-                                  CodecInstToSdp(codec_inst))) {
-    return -1;
-  }
-  memcpy(&receive_codec_, &codec_inst, sizeof(CodecInst));
-  return 0;
-}
-
-int32_t AudioCoder::Decode(AudioFrame* decoded_audio,
-                           uint32_t samp_freq_hz,
-                           const int8_t* incoming_payload,
-                           size_t payload_length) {
-  if (payload_length > 0) {
-    const uint8_t payload_type = receive_codec_.pltype;
-    decode_timestamp_ += receive_codec_.pacsize;
-    if (acm_->IncomingPayload((const uint8_t*)incoming_payload, payload_length,
-                              payload_type, decode_timestamp_) == -1) {
-      return -1;
-    }
-  }
-  bool muted;
-  int32_t ret =
-      acm_->PlayoutData10Ms((uint16_t)samp_freq_hz, decoded_audio, &muted);
-  RTC_DCHECK(!muted);
-  return ret;
-}
-
-int32_t AudioCoder::PlayoutData(AudioFrame* decoded_audio,
-                                uint16_t samp_freq_hz) {
-  bool muted;
-  int32_t ret = acm_->PlayoutData10Ms(samp_freq_hz, decoded_audio, &muted);
-  RTC_DCHECK(!muted);
-  return ret;
-}
-
-int32_t AudioCoder::Encode(const AudioFrame& audio,
-                           int8_t* encoded_data,
-                           size_t* encoded_length_in_bytes) {
-  // Fake a timestamp in case audio doesn't contain a correct timestamp.
-  // Make a local copy of the audio frame since audio is const
-  AudioFrame audio_frame;
-  audio_frame.CopyFrom(audio);
-  audio_frame.timestamp_ = encode_timestamp_;
-  encode_timestamp_ += static_cast<uint32_t>(audio_frame.samples_per_channel_);
-
-  // For any codec with a frame size that is longer than 10 ms the encoded
-  // length in bytes should be zero until a a full frame has been encoded.
-  encoded_length_in_bytes_ = 0;
-  encoded_data_ = encoded_data;
-  if (acm_->Add10MsData((AudioFrame&)audio_frame) == -1) {
-    return -1;
-  }
-
-  *encoded_length_in_bytes = encoded_length_in_bytes_;
-  return 0;
-}
-
-int32_t AudioCoder::SendData(FrameType /* frame_type */,
-                             uint8_t /* payload_type */,
-                             uint32_t /* time_stamp */,
-                             const uint8_t* payload_data,
-                             size_t payload_size,
-                             const RTPFragmentationHeader* /* fragmentation*/) {
-  memcpy(encoded_data_, payload_data, sizeof(uint8_t) * payload_size);
-  encoded_length_in_bytes_ = payload_size;
-  return 0;
-}
-
-}  // namespace webrtc
diff --git a/voice_engine/coder.h b/voice_engine/coder.h
deleted file mode 100644
index 5e16b0a..0000000
--- a/voice_engine/coder.h
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- *  Copyright (c) 2011 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_VOICE_ENGINE_CODER_H_
-#define WEBRTC_VOICE_ENGINE_CODER_H_
-
-#include <memory>
-
-#include "webrtc/common_types.h"
-#include "webrtc/modules/audio_coding/acm2/codec_manager.h"
-#include "webrtc/modules/audio_coding/acm2/rent_a_codec.h"
-#include "webrtc/modules/audio_coding/include/audio_coding_module.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-class AudioFrame;
-
-class AudioCoder : public AudioPacketizationCallback {
- public:
-  explicit AudioCoder(uint32_t instance_id);
-  ~AudioCoder();
-
-  int32_t SetEncodeCodec(const CodecInst& codec_inst);
-
-  int32_t SetDecodeCodec(const CodecInst& codec_inst);
-
-  int32_t Decode(AudioFrame* decoded_audio,
-                 uint32_t samp_freq_hz,
-                 const int8_t* incoming_payload,
-                 size_t payload_length);
-
-  int32_t PlayoutData(AudioFrame* decoded_audio, uint16_t samp_freq_hz);
-
-  int32_t Encode(const AudioFrame& audio,
-                 int8_t* encoded_data,
-                 size_t* encoded_length_in_bytes);
-
- protected:
-  int32_t SendData(FrameType frame_type,
-                   uint8_t payload_type,
-                   uint32_t time_stamp,
-                   const uint8_t* payload_data,
-                   size_t payload_size,
-                   const RTPFragmentationHeader* fragmentation) override;
-
- private:
-  std::unique_ptr<AudioCodingModule> acm_;
-  acm2::CodecManager codec_manager_;
-  acm2::RentACodec rent_a_codec_;
-
-  CodecInst receive_codec_;
-
-  uint32_t encode_timestamp_;
-  int8_t* encoded_data_;
-  size_t encoded_length_in_bytes_;
-
-  uint32_t decode_timestamp_;
-};
-}  // namespace webrtc
-
-#endif  // WEBRTC_VOICE_ENGINE_CODER_H_
diff --git a/voice_engine/file_player.cc b/voice_engine/file_player.cc
deleted file mode 100644
index 8c5824d..0000000
--- a/voice_engine/file_player.cc
+++ /dev/null
@@ -1,397 +0,0 @@
-/*
- *  Copyright (c) 2012 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/voice_engine/file_player.h"
-
-#include "webrtc/common_audio/resampler/include/resampler.h"
-#include "webrtc/common_types.h"
-#include "webrtc/modules/media_file/media_file.h"
-#include "webrtc/modules/media_file/media_file_defines.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/typedefs.h"
-#include "webrtc/voice_engine/coder.h"
-
-namespace webrtc {
-
-namespace {
-
-class FilePlayerImpl : public FilePlayer {
- public:
-  FilePlayerImpl(uint32_t instanceID, FileFormats fileFormat);
-  ~FilePlayerImpl() override;
-
-  int Get10msAudioFromFile(int16_t* outBuffer,
-                           size_t* lengthInSamples,
-                           int frequencyInHz) override;
-  int32_t RegisterModuleFileCallback(FileCallback* callback) override;
-  int32_t StartPlayingFile(const char* fileName,
-                           bool loop,
-                           uint32_t startPosition,
-                           float volumeScaling,
-                           uint32_t notification,
-                           uint32_t stopPosition,
-                           const CodecInst* codecInst) override;
-  int32_t StartPlayingFile(InStream* sourceStream,
-                           uint32_t startPosition,
-                           float volumeScaling,
-                           uint32_t notification,
-                           uint32_t stopPosition,
-                           const CodecInst* codecInst) override;
-  int32_t StopPlayingFile() override;
-  bool IsPlayingFile() const override;
-  int32_t GetPlayoutPosition(uint32_t* durationMs) override;
-  int32_t AudioCodec(CodecInst* audioCodec) const override;
-  int32_t Frequency() const override;
-  int32_t SetAudioScaling(float scaleFactor) override;
-
- private:
-  int32_t SetUpAudioDecoder();
-
-  const FileFormats _fileFormat;
-  MediaFile& _fileModule;
-
-  uint32_t _decodedLengthInMS;
-
-  AudioCoder _audioDecoder;
-
-  CodecInst _codec;
-  int32_t _numberOf10MsPerFrame;
-  int32_t _numberOf10MsInDecoder;
-
-  Resampler _resampler;
-  float _scaling;
-};
-
-FilePlayerImpl::FilePlayerImpl(const uint32_t instanceID,
-                               const FileFormats fileFormat)
-    : _fileFormat(fileFormat),
-      _fileModule(*MediaFile::CreateMediaFile(instanceID)),
-      _decodedLengthInMS(0),
-      _audioDecoder(instanceID),
-      _codec(),
-      _numberOf10MsPerFrame(0),
-      _numberOf10MsInDecoder(0),
-      _resampler(),
-      _scaling(1.0) {
-  _codec.plfreq = 0;
-}
-
-FilePlayerImpl::~FilePlayerImpl() {
-  MediaFile::DestroyMediaFile(&_fileModule);
-}
-
-int32_t FilePlayerImpl::Frequency() const {
-  if (_codec.plfreq == 0) {
-    return -1;
-  }
-  // Make sure that sample rate is 8,16 or 32 kHz. E.g. WAVE files may have
-  // other sampling rates.
-  if (_codec.plfreq == 11000) {
-    return 16000;
-  } else if (_codec.plfreq == 22000) {
-    return 32000;
-  } else if (_codec.plfreq == 44000) {
-    return 32000;
-  } else if (_codec.plfreq == 48000) {
-    return 48000;
-  } else {
-    return _codec.plfreq;
-  }
-}
-
-int32_t FilePlayerImpl::AudioCodec(CodecInst* audioCodec) const {
-  *audioCodec = _codec;
-  return 0;
-}
-
-int32_t FilePlayerImpl::Get10msAudioFromFile(int16_t* outBuffer,
-                                             size_t* lengthInSamples,
-                                             int frequencyInHz) {
-  if (_codec.plfreq == 0) {
-    LOG(LS_WARNING) << "Get10msAudioFromFile() playing not started!"
-                    << " codec freq = " << _codec.plfreq
-                    << ", wanted freq = " << frequencyInHz;
-    return -1;
-  }
-
-  AudioFrame unresampledAudioFrame;
-  if (STR_CASE_CMP(_codec.plname, "L16") == 0) {
-    unresampledAudioFrame.sample_rate_hz_ = _codec.plfreq;
-
-    // L16 is un-encoded data. Just pull 10 ms.
-    size_t lengthInBytes = AudioFrame::kMaxDataSizeBytes;
-    if (_fileModule.PlayoutAudioData(
-            reinterpret_cast<int8_t*>(unresampledAudioFrame.mutable_data()),
-            lengthInBytes) == -1) {
-      // End of file reached.
-      return -1;
-    }
-    if (lengthInBytes == 0) {
-      *lengthInSamples = 0;
-      return 0;
-    }
-    // One sample is two bytes.
-    unresampledAudioFrame.samples_per_channel_ = lengthInBytes >> 1;
-
-  } else {
-    // Decode will generate 10 ms of audio data. PlayoutAudioData(..)
-    // expects a full frame. If the frame size is larger than 10 ms,
-    // PlayoutAudioData(..) data should be called proportionally less often.
-    int16_t encodedBuffer[MAX_AUDIO_BUFFER_IN_SAMPLES];
-    size_t encodedLengthInBytes = 0;
-    if (++_numberOf10MsInDecoder >= _numberOf10MsPerFrame) {
-      _numberOf10MsInDecoder = 0;
-      size_t bytesFromFile = sizeof(encodedBuffer);
-      if (_fileModule.PlayoutAudioData(reinterpret_cast<int8_t*>(encodedBuffer),
-                                       bytesFromFile) == -1) {
-        // End of file reached.
-        return -1;
-      }
-      encodedLengthInBytes = bytesFromFile;
-    }
-    if (_audioDecoder.Decode(&unresampledAudioFrame, frequencyInHz,
-                             reinterpret_cast<int8_t*>(encodedBuffer),
-                             encodedLengthInBytes) == -1) {
-      return -1;
-    }
-  }
-
-  size_t outLen = 0;
-  if (_resampler.ResetIfNeeded(unresampledAudioFrame.sample_rate_hz_,
-                               frequencyInHz, 1)) {
-    LOG(LS_WARNING) << "Get10msAudioFromFile() unexpected codec.";
-
-    // New sampling frequency. Update state.
-    outLen = static_cast<size_t>(frequencyInHz / 100);
-    memset(outBuffer, 0, outLen * sizeof(int16_t));
-    return 0;
-  }
-  _resampler.Push(unresampledAudioFrame.data(),
-                  unresampledAudioFrame.samples_per_channel_, outBuffer,
-                  MAX_AUDIO_BUFFER_IN_SAMPLES, outLen);
-
-  *lengthInSamples = outLen;
-
-  if (_scaling != 1.0) {
-    for (size_t i = 0; i < outLen; i++) {
-      outBuffer[i] = (int16_t)(outBuffer[i] * _scaling);
-    }
-  }
-  _decodedLengthInMS += 10;
-  return 0;
-}
-
-int32_t FilePlayerImpl::RegisterModuleFileCallback(FileCallback* callback) {
-  return _fileModule.SetModuleFileCallback(callback);
-}
-
-int32_t FilePlayerImpl::SetAudioScaling(float scaleFactor) {
-  if ((scaleFactor >= 0) && (scaleFactor <= 2.0)) {
-    _scaling = scaleFactor;
-    return 0;
-  }
-  LOG(LS_WARNING) << "SetAudioScaling() non-allowed scale factor.";
-  return -1;
-}
-
-int32_t FilePlayerImpl::StartPlayingFile(const char* fileName,
-                                         bool loop,
-                                         uint32_t startPosition,
-                                         float volumeScaling,
-                                         uint32_t notification,
-                                         uint32_t stopPosition,
-                                         const CodecInst* codecInst) {
-  if (_fileFormat == kFileFormatPcm16kHzFile ||
-      _fileFormat == kFileFormatPcm8kHzFile ||
-      _fileFormat == kFileFormatPcm32kHzFile) {
-    CodecInst codecInstL16;
-    strncpy(codecInstL16.plname, "L16", 32);
-    codecInstL16.pltype = 93;
-    codecInstL16.channels = 1;
-
-    if (_fileFormat == kFileFormatPcm8kHzFile) {
-      codecInstL16.rate = 128000;
-      codecInstL16.plfreq = 8000;
-      codecInstL16.pacsize = 80;
-    } else if (_fileFormat == kFileFormatPcm16kHzFile) {
-      codecInstL16.rate = 256000;
-      codecInstL16.plfreq = 16000;
-      codecInstL16.pacsize = 160;
-    } else if (_fileFormat == kFileFormatPcm32kHzFile) {
-      codecInstL16.rate = 512000;
-      codecInstL16.plfreq = 32000;
-      codecInstL16.pacsize = 320;
-    } else if (_fileFormat == kFileFormatPcm48kHzFile) {
-      codecInstL16.rate = 768000;
-      codecInstL16.plfreq = 48000;
-      codecInstL16.pacsize = 480;
-    } else {
-      LOG(LS_ERROR) << "StartPlayingFile() sample frequency not "
-                    << "supported for PCM format.";
-      return -1;
-    }
-
-    if (_fileModule.StartPlayingAudioFile(fileName, notification, loop,
-                                          _fileFormat, &codecInstL16,
-                                          startPosition, stopPosition) == -1) {
-      LOG(LS_WARNING) << "StartPlayingFile() failed to initialize "
-                      << "pcm file " << fileName;
-      return -1;
-    }
-    SetAudioScaling(volumeScaling);
-  } else if (_fileFormat == kFileFormatPreencodedFile) {
-    if (_fileModule.StartPlayingAudioFile(fileName, notification, loop,
-                                          _fileFormat, codecInst) == -1) {
-      LOG(LS_WARNING) << "StartPlayingFile() failed to initialize "
-                      << "pre-encoded file " << fileName;
-      return -1;
-    }
-  } else {
-    CodecInst* no_inst = NULL;
-    if (_fileModule.StartPlayingAudioFile(fileName, notification, loop,
-                                          _fileFormat, no_inst, startPosition,
-                                          stopPosition) == -1) {
-      LOG(LS_WARNING) << "StartPlayingFile() failed to initialize file "
-                      << fileName;
-      return -1;
-    }
-    SetAudioScaling(volumeScaling);
-  }
-  if (SetUpAudioDecoder() == -1) {
-    StopPlayingFile();
-    return -1;
-  }
-  return 0;
-}
-
-int32_t FilePlayerImpl::StartPlayingFile(InStream* sourceStream,
-                                         uint32_t startPosition,
-                                         float volumeScaling,
-                                         uint32_t notification,
-                                         uint32_t stopPosition,
-                                         const CodecInst* codecInst) {
-  if (_fileFormat == kFileFormatPcm16kHzFile ||
-      _fileFormat == kFileFormatPcm32kHzFile ||
-      _fileFormat == kFileFormatPcm8kHzFile ||
-      _fileFormat == kFileFormatPcm48kHzFile) {
-    CodecInst codecInstL16;
-    strncpy(codecInstL16.plname, "L16", 32);
-    codecInstL16.pltype = 93;
-    codecInstL16.channels = 1;
-
-    if (_fileFormat == kFileFormatPcm8kHzFile) {
-      codecInstL16.rate = 128000;
-      codecInstL16.plfreq = 8000;
-      codecInstL16.pacsize = 80;
-    } else if (_fileFormat == kFileFormatPcm16kHzFile) {
-      codecInstL16.rate = 256000;
-      codecInstL16.plfreq = 16000;
-      codecInstL16.pacsize = 160;
-    } else if (_fileFormat == kFileFormatPcm32kHzFile) {
-      codecInstL16.rate = 512000;
-      codecInstL16.plfreq = 32000;
-      codecInstL16.pacsize = 320;
-    } else if (_fileFormat == kFileFormatPcm48kHzFile) {
-      codecInstL16.rate = 768000;
-      codecInstL16.plfreq = 48000;
-      codecInstL16.pacsize = 480;
-    } else {
-      LOG(LS_ERROR) << "StartPlayingFile() sample frequency not "
-                    << "supported for PCM format.";
-      return -1;
-    }
-    if (_fileModule.StartPlayingAudioStream(
-            *sourceStream, notification, _fileFormat, &codecInstL16,
-            startPosition, stopPosition) == -1) {
-      LOG(LS_ERROR) << "StartPlayingFile() failed to initialize stream "
-                    << "playout.";
-      return -1;
-    }
-
-  } else if (_fileFormat == kFileFormatPreencodedFile) {
-    if (_fileModule.StartPlayingAudioStream(*sourceStream, notification,
-                                            _fileFormat, codecInst) == -1) {
-      LOG(LS_ERROR) << "StartPlayingFile() failed to initialize stream "
-                    << "playout.";
-      return -1;
-    }
-  } else {
-    CodecInst* no_inst = NULL;
-    if (_fileModule.StartPlayingAudioStream(*sourceStream, notification,
-                                            _fileFormat, no_inst, startPosition,
-                                            stopPosition) == -1) {
-      LOG(LS_ERROR) << "StartPlayingFile() failed to initialize stream "
-                    << "playout.";
-      return -1;
-    }
-  }
-  SetAudioScaling(volumeScaling);
-
-  if (SetUpAudioDecoder() == -1) {
-    StopPlayingFile();
-    return -1;
-  }
-  return 0;
-}
-
-int32_t FilePlayerImpl::StopPlayingFile() {
-  memset(&_codec, 0, sizeof(CodecInst));
-  _numberOf10MsPerFrame = 0;
-  _numberOf10MsInDecoder = 0;
-  return _fileModule.StopPlaying();
-}
-
-bool FilePlayerImpl::IsPlayingFile() const {
-  return _fileModule.IsPlaying();
-}
-
-int32_t FilePlayerImpl::GetPlayoutPosition(uint32_t* durationMs) {
-  return _fileModule.PlayoutPositionMs(*durationMs);
-}
-
-int32_t FilePlayerImpl::SetUpAudioDecoder() {
-  if ((_fileModule.codec_info(_codec) == -1)) {
-    LOG(LS_WARNING) << "Failed to retrieve codec info of file data.";
-    return -1;
-  }
-  if (STR_CASE_CMP(_codec.plname, "L16") != 0 &&
-      _audioDecoder.SetDecodeCodec(_codec) == -1) {
-    LOG(LS_WARNING) << "SetUpAudioDecoder() codec " << _codec.plname
-                    << " not supported.";
-    return -1;
-  }
-  _numberOf10MsPerFrame = _codec.pacsize / (_codec.plfreq / 100);
-  _numberOf10MsInDecoder = 0;
-  return 0;
-}
-
-}  // namespace
-
-std::unique_ptr<FilePlayer> FilePlayer::CreateFilePlayer(
-    uint32_t instanceID,
-    FileFormats fileFormat) {
-  switch (fileFormat) {
-    case kFileFormatWavFile:
-    case kFileFormatCompressedFile:
-    case kFileFormatPreencodedFile:
-    case kFileFormatPcm16kHzFile:
-    case kFileFormatPcm8kHzFile:
-    case kFileFormatPcm32kHzFile:
-    case kFileFormatPcm48kHzFile:
-      // audio formats
-      return std::unique_ptr<FilePlayer>(
-          new FilePlayerImpl(instanceID, fileFormat));
-    default:
-      assert(false);
-      return nullptr;
-  }
-}
-
-}  // namespace webrtc
diff --git a/voice_engine/file_player.h b/voice_engine/file_player.h
deleted file mode 100644
index cb14c8f..0000000
--- a/voice_engine/file_player.h
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- *  Copyright (c) 2012 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_VOICE_ENGINE_FILE_PLAYER_H_
-#define WEBRTC_VOICE_ENGINE_FILE_PLAYER_H_
-
-#include <memory>
-
-#include "webrtc/common_types.h"
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-class FileCallback;
-
-class FilePlayer {
- public:
-  // The largest decoded frame size in samples (60ms with 48kHz sample rate).
-  enum { MAX_AUDIO_BUFFER_IN_SAMPLES = 60 * 48 };
-  enum { MAX_AUDIO_BUFFER_IN_BYTES = MAX_AUDIO_BUFFER_IN_SAMPLES * 2 };
-
-  // Note: will return NULL for unsupported formats.
-  static std::unique_ptr<FilePlayer> CreateFilePlayer(
-      const uint32_t instanceID,
-      const FileFormats fileFormat);
-
-  virtual ~FilePlayer() = default;
-
-  // Read 10 ms of audio at |frequencyInHz| to |outBuffer|. |lengthInSamples|
-  // will be set to the number of samples read (not the number of samples per
-  // channel).
-  virtual int Get10msAudioFromFile(int16_t* outBuffer,
-                                   size_t* lengthInSamples,
-                                   int frequencyInHz) = 0;
-
-  // Register callback for receiving file playing notifications.
-  virtual int32_t RegisterModuleFileCallback(FileCallback* callback) = 0;
-
-  // API for playing audio from fileName to channel.
-  // Note: codecInst is used for pre-encoded files.
-  virtual int32_t StartPlayingFile(const char* fileName,
-                                   bool loop,
-                                   uint32_t startPosition,
-                                   float volumeScaling,
-                                   uint32_t notification,
-                                   uint32_t stopPosition,
-                                   const CodecInst* codecInst) = 0;
-
-  // Note: codecInst is used for pre-encoded files.
-  virtual int32_t StartPlayingFile(InStream* sourceStream,
-                                   uint32_t startPosition,
-                                   float volumeScaling,
-                                   uint32_t notification,
-                                   uint32_t stopPosition,
-                                   const CodecInst* codecInst) = 0;
-
-  virtual int32_t StopPlayingFile() = 0;
-
-  virtual bool IsPlayingFile() const = 0;
-
-  virtual int32_t GetPlayoutPosition(uint32_t* durationMs) = 0;
-
-  // Set audioCodec to the currently used audio codec.
-  virtual int32_t AudioCodec(CodecInst* audioCodec) const = 0;
-
-  virtual int32_t Frequency() const = 0;
-
-  // Note: scaleFactor is in the range [0.0 - 2.0]
-  virtual int32_t SetAudioScaling(float scaleFactor) = 0;
-};
-}  // namespace webrtc
-#endif  // WEBRTC_VOICE_ENGINE_FILE_PLAYER_H_
diff --git a/voice_engine/file_player_unittests.cc b/voice_engine/file_player_unittests.cc
deleted file mode 100644
index 8762957..0000000
--- a/voice_engine/file_player_unittests.cc
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- *  Copyright (c) 2014 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.
- */
-
-// Unit tests for FilePlayer.
-
-#include "webrtc/voice_engine/file_player.h"
-
-#include <stdio.h>
-
-#include <memory>
-#include <string>
-
-#include "webrtc/rtc_base/flags.h"
-#include "webrtc/rtc_base/md5digest.h"
-#include "webrtc/rtc_base/stringencode.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/testsupport/fileutils.h"
-
-DEFINE_bool(file_player_output, false, "Generate reference files.");
-
-namespace webrtc {
-
-class FilePlayerTest : public ::testing::Test {
- protected:
-  static const uint32_t kId = 0;
-  static const FileFormats kFileFormat = kFileFormatWavFile;
-  static const int kSampleRateHz = 8000;
-
-  FilePlayerTest()
-      : player_(FilePlayer::CreateFilePlayer(kId, kFileFormat)),
-        output_file_(NULL) {}
-
-  void SetUp() override {
-    if (FLAG_file_player_output) {
-      std::string output_file =
-          webrtc::test::OutputPath() + "file_player_unittest_out.pcm";
-      output_file_ = fopen(output_file.c_str(), "wb");
-      ASSERT_TRUE(output_file_ != NULL);
-    }
-  }
-
-  void TearDown() override {
-    if (output_file_)
-      fclose(output_file_);
-  }
-
-  void PlayFileAndCheck(const std::string& input_file,
-                        const std::string& ref_checksum,
-                        int output_length_ms) {
-    const float kScaling = 1;
-    ASSERT_EQ(0, player_->StartPlayingFile(input_file.c_str(), false, 0,
-                                           kScaling, 0, 0, NULL));
-    rtc::Md5Digest checksum;
-    for (int i = 0; i < output_length_ms / 10; ++i) {
-      int16_t out[10 * kSampleRateHz / 1000] = {0};
-      size_t num_samples;
-      EXPECT_EQ(
-          0, player_->Get10msAudioFromFile(out, &num_samples, kSampleRateHz));
-      checksum.Update(out, num_samples * sizeof(out[0]));
-      if (FLAG_file_player_output) {
-        ASSERT_EQ(num_samples,
-                  fwrite(out, sizeof(out[0]), num_samples, output_file_));
-      }
-    }
-    char checksum_result[rtc::Md5Digest::kSize];
-    EXPECT_EQ(rtc::Md5Digest::kSize,
-              checksum.Finish(checksum_result, rtc::Md5Digest::kSize));
-    EXPECT_EQ(ref_checksum,
-              rtc::hex_encode(checksum_result, sizeof(checksum_result)));
-  }
-
-  std::unique_ptr<FilePlayer> player_;
-  FILE* output_file_;
-};
-
-#if defined(WEBRTC_IOS)
-#define MAYBE_PlayWavPcmuFile DISABLED_PlayWavPcmuFile
-#else
-#define MAYBE_PlayWavPcmuFile PlayWavPcmuFile
-#endif
-TEST_F(FilePlayerTest, MAYBE_PlayWavPcmuFile) {
-  const std::string kFileName =
-      test::ResourcePath("utility/encapsulated_pcmu_8khz", "wav");
-  // The file is longer than this, but keeping the output shorter limits the
-  // runtime for the test.
-  const int kOutputLengthMs = 10000;
-  const std::string kRefChecksum = "c74e7fd432d439b1311e1c16815b3e9a";
-
-  PlayFileAndCheck(kFileName, kRefChecksum, kOutputLengthMs);
-}
-
-#if defined(WEBRTC_IOS)
-#define MAYBE_PlayWavPcm16File DISABLED_PlayWavPcm16File
-#else
-#define MAYBE_PlayWavPcm16File PlayWavPcm16File
-#endif
-TEST_F(FilePlayerTest, MAYBE_PlayWavPcm16File) {
-  const std::string kFileName =
-      test::ResourcePath("utility/encapsulated_pcm16b_8khz", "wav");
-  // The file is longer than this, but keeping the output shorter limits the
-  // runtime for the test.
-  const int kOutputLengthMs = 10000;
-  const std::string kRefChecksum = "e41d7e1dac8aeae9f21e8e03cd7ecd71";
-
-  PlayFileAndCheck(kFileName, kRefChecksum, kOutputLengthMs);
-}
-
-}  // namespace webrtc
diff --git a/voice_engine/file_recorder.cc b/voice_engine/file_recorder.cc
deleted file mode 100644
index 1d35be9..0000000
--- a/voice_engine/file_recorder.cc
+++ /dev/null
@@ -1,260 +0,0 @@
-/*
- *  Copyright (c) 2012 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/voice_engine/file_recorder.h"
-
-#include <list>
-
-#include "webrtc/audio/utility/audio_frame_operations.h"
-#include "webrtc/common_audio/resampler/include/resampler.h"
-#include "webrtc/common_types.h"
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/modules/media_file/media_file.h"
-#include "webrtc/modules/media_file/media_file_defines.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/rtc_base/platform_thread.h"
-#include "webrtc/system_wrappers/include/event_wrapper.h"
-#include "webrtc/typedefs.h"
-#include "webrtc/voice_engine/coder.h"
-
-namespace webrtc {
-
-namespace {
-
-// The largest decoded frame size in samples (60ms with 32kHz sample rate).
-enum { MAX_AUDIO_BUFFER_IN_SAMPLES = 60 * 32 };
-enum { MAX_AUDIO_BUFFER_IN_BYTES = MAX_AUDIO_BUFFER_IN_SAMPLES * 2 };
-enum { kMaxAudioBufferQueueLength = 100 };
-
-class FileRecorderImpl : public FileRecorder {
- public:
-  FileRecorderImpl(uint32_t instanceID, FileFormats fileFormat);
-  ~FileRecorderImpl() override;
-
-  // FileRecorder functions.
-  int32_t RegisterModuleFileCallback(FileCallback* callback) override;
-  FileFormats RecordingFileFormat() const override;
-  int32_t StartRecordingAudioFile(const char* fileName,
-                                  const CodecInst& codecInst,
-                                  uint32_t notificationTimeMs) override;
-  int32_t StartRecordingAudioFile(OutStream* destStream,
-                                  const CodecInst& codecInst,
-                                  uint32_t notificationTimeMs) override;
-  int32_t StopRecording() override;
-  bool IsRecording() const override;
-  int32_t codec_info(CodecInst* codecInst) const override;
-  int32_t RecordAudioToFile(const AudioFrame& frame) override;
-
- private:
-  int32_t WriteEncodedAudioData(const int8_t* audioBuffer, size_t bufferLength);
-
-  int32_t SetUpAudioEncoder();
-
-  uint32_t _instanceID;
-  FileFormats _fileFormat;
-  MediaFile* _moduleFile;
-
-  CodecInst codec_info_;
-  int8_t _audioBuffer[MAX_AUDIO_BUFFER_IN_BYTES];
-  AudioCoder _audioEncoder;
-  Resampler _audioResampler;
-};
-
-FileRecorderImpl::FileRecorderImpl(uint32_t instanceID, FileFormats fileFormat)
-    : _instanceID(instanceID),
-      _fileFormat(fileFormat),
-      _moduleFile(MediaFile::CreateMediaFile(_instanceID)),
-      codec_info_(),
-      _audioBuffer(),
-      _audioEncoder(instanceID),
-      _audioResampler() {}
-
-FileRecorderImpl::~FileRecorderImpl() {
-  MediaFile::DestroyMediaFile(_moduleFile);
-}
-
-FileFormats FileRecorderImpl::RecordingFileFormat() const {
-  return _fileFormat;
-}
-
-int32_t FileRecorderImpl::RegisterModuleFileCallback(FileCallback* callback) {
-  if (_moduleFile == NULL) {
-    return -1;
-  }
-  return _moduleFile->SetModuleFileCallback(callback);
-}
-
-int32_t FileRecorderImpl::StartRecordingAudioFile(const char* fileName,
-                                                  const CodecInst& codecInst,
-                                                  uint32_t notificationTimeMs) {
-  if (_moduleFile == NULL) {
-    return -1;
-  }
-  codec_info_ = codecInst;
-  int32_t retVal = 0;
-  retVal = _moduleFile->StartRecordingAudioFile(fileName, _fileFormat,
-                                                codecInst, notificationTimeMs);
-
-  if (retVal == 0) {
-    retVal = SetUpAudioEncoder();
-  }
-  if (retVal != 0) {
-    LOG(LS_WARNING) << "Failed to initialize file " << fileName
-                    << " for recording.";
-
-    if (IsRecording()) {
-      StopRecording();
-    }
-  }
-  return retVal;
-}
-
-int32_t FileRecorderImpl::StartRecordingAudioFile(OutStream* destStream,
-                                                  const CodecInst& codecInst,
-                                                  uint32_t notificationTimeMs) {
-  codec_info_ = codecInst;
-  int32_t retVal = _moduleFile->StartRecordingAudioStream(
-      *destStream, _fileFormat, codecInst, notificationTimeMs);
-
-  if (retVal == 0) {
-    retVal = SetUpAudioEncoder();
-  }
-  if (retVal != 0) {
-    LOG(LS_WARNING) << "Failed to initialize outStream for recording.";
-
-    if (IsRecording()) {
-      StopRecording();
-    }
-  }
-  return retVal;
-}
-
-int32_t FileRecorderImpl::StopRecording() {
-  memset(&codec_info_, 0, sizeof(CodecInst));
-  return _moduleFile->StopRecording();
-}
-
-bool FileRecorderImpl::IsRecording() const {
-  return _moduleFile->IsRecording();
-}
-
-int32_t FileRecorderImpl::RecordAudioToFile(
-    const AudioFrame& incomingAudioFrame) {
-  if (codec_info_.plfreq == 0) {
-    LOG(LS_WARNING) << "RecordAudioToFile() recording audio is not "
-                    << "turned on.";
-    return -1;
-  }
-  AudioFrame tempAudioFrame;
-  tempAudioFrame.samples_per_channel_ = 0;
-  if (incomingAudioFrame.num_channels_ == 2 && !_moduleFile->IsStereo()) {
-    // Recording mono but incoming audio is (interleaved) stereo.
-    tempAudioFrame.num_channels_ = 1;
-    tempAudioFrame.sample_rate_hz_ = incomingAudioFrame.sample_rate_hz_;
-    tempAudioFrame.samples_per_channel_ =
-        incomingAudioFrame.samples_per_channel_;
-    if (!incomingAudioFrame.muted()) {
-      AudioFrameOperations::StereoToMono(
-          incomingAudioFrame.data(), incomingAudioFrame.samples_per_channel_,
-          tempAudioFrame.mutable_data());
-    }
-  } else if (incomingAudioFrame.num_channels_ == 1 && _moduleFile->IsStereo()) {
-    // Recording stereo but incoming audio is mono.
-    tempAudioFrame.num_channels_ = 2;
-    tempAudioFrame.sample_rate_hz_ = incomingAudioFrame.sample_rate_hz_;
-    tempAudioFrame.samples_per_channel_ =
-        incomingAudioFrame.samples_per_channel_;
-    if (!incomingAudioFrame.muted()) {
-      AudioFrameOperations::MonoToStereo(
-          incomingAudioFrame.data(), incomingAudioFrame.samples_per_channel_,
-          tempAudioFrame.mutable_data());
-    }
-  }
-
-  const AudioFrame* ptrAudioFrame = &incomingAudioFrame;
-  if (tempAudioFrame.samples_per_channel_ != 0) {
-    // If ptrAudioFrame is not empty it contains the audio to be recorded.
-    ptrAudioFrame = &tempAudioFrame;
-  }
-
-  // Encode the audio data before writing to file. Don't encode if the codec
-  // is PCM.
-  // NOTE: stereo recording is only supported for WAV files.
-  // TODO(hellner): WAV expect PCM in little endian byte order. Not
-  // "encoding" with PCM coder should be a problem for big endian systems.
-  size_t encodedLenInBytes = 0;
-  if (_fileFormat == kFileFormatPreencodedFile ||
-      STR_CASE_CMP(codec_info_.plname, "L16") != 0) {
-    if (_audioEncoder.Encode(*ptrAudioFrame, _audioBuffer,
-                             &encodedLenInBytes) == -1) {
-      LOG(LS_WARNING) << "RecordAudioToFile() codec " << codec_info_.plname
-                      << " not supported or failed to encode stream.";
-      return -1;
-    }
-  } else {
-    size_t outLen = 0;
-    _audioResampler.ResetIfNeeded(ptrAudioFrame->sample_rate_hz_,
-                                  codec_info_.plfreq,
-                                  ptrAudioFrame->num_channels_);
-    // TODO(yujo): skip resample if frame is muted.
-    _audioResampler.Push(
-        ptrAudioFrame->data(),
-        ptrAudioFrame->samples_per_channel_ * ptrAudioFrame->num_channels_,
-        reinterpret_cast<int16_t*>(_audioBuffer), MAX_AUDIO_BUFFER_IN_BYTES,
-        outLen);
-    encodedLenInBytes = outLen * sizeof(int16_t);
-  }
-
-  // Codec may not be operating at a frame rate of 10 ms. Whenever enough
-  // 10 ms chunks of data has been pushed to the encoder an encoded frame
-  // will be available. Wait until then.
-  if (encodedLenInBytes) {
-    if (WriteEncodedAudioData(_audioBuffer, encodedLenInBytes) == -1) {
-      return -1;
-    }
-  }
-  return 0;
-}
-
-int32_t FileRecorderImpl::SetUpAudioEncoder() {
-  if (_fileFormat == kFileFormatPreencodedFile ||
-      STR_CASE_CMP(codec_info_.plname, "L16") != 0) {
-    if (_audioEncoder.SetEncodeCodec(codec_info_) == -1) {
-      LOG(LS_ERROR) << "SetUpAudioEncoder() codec " << codec_info_.plname
-                    << " not supported.";
-      return -1;
-    }
-  }
-  return 0;
-}
-
-int32_t FileRecorderImpl::codec_info(CodecInst* codecInst) const {
-  if (codec_info_.plfreq == 0) {
-    return -1;
-  }
-  *codecInst = codec_info_;
-  return 0;
-}
-
-int32_t FileRecorderImpl::WriteEncodedAudioData(const int8_t* audioBuffer,
-                                                size_t bufferLength) {
-  return _moduleFile->IncomingAudioData(audioBuffer, bufferLength);
-}
-
-}  // namespace
-
-std::unique_ptr<FileRecorder> FileRecorder::CreateFileRecorder(
-    uint32_t instanceID,
-    FileFormats fileFormat) {
-  return std::unique_ptr<FileRecorder>(
-      new FileRecorderImpl(instanceID, fileFormat));
-}
-
-}  // namespace webrtc
diff --git a/voice_engine/file_recorder.h b/voice_engine/file_recorder.h
deleted file mode 100644
index c4195d0..0000000
--- a/voice_engine/file_recorder.h
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- *  Copyright (c) 2012 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_VOICE_ENGINE_FILE_RECORDER_H_
-#define WEBRTC_VOICE_ENGINE_FILE_RECORDER_H_
-
-#include <memory>
-
-#include "webrtc/common_types.h"
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/modules/media_file/media_file_defines.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-class FileRecorder {
- public:
-  // Note: will return NULL for unsupported formats.
-  static std::unique_ptr<FileRecorder> CreateFileRecorder(
-      const uint32_t instanceID,
-      const FileFormats fileFormat);
-
-  virtual ~FileRecorder() = default;
-
-  virtual int32_t RegisterModuleFileCallback(FileCallback* callback) = 0;
-
-  virtual FileFormats RecordingFileFormat() const = 0;
-
-  virtual int32_t StartRecordingAudioFile(const char* fileName,
-                                          const CodecInst& codecInst,
-                                          uint32_t notification) = 0;
-
-  virtual int32_t StartRecordingAudioFile(OutStream* destStream,
-                                          const CodecInst& codecInst,
-                                          uint32_t notification) = 0;
-
-  // Stop recording.
-  virtual int32_t StopRecording() = 0;
-
-  // Return true if recording.
-  virtual bool IsRecording() const = 0;
-
-  virtual int32_t codec_info(CodecInst* codecInst) const = 0;
-
-  // Write frame to file. Frame should contain 10ms of un-ecoded audio data.
-  virtual int32_t RecordAudioToFile(const AudioFrame& frame) = 0;
-};
-
-}  // namespace webrtc
-#endif  // WEBRTC_VOICE_ENGINE_FILE_RECORDER_H_
diff --git a/voice_engine/include/voe_base.h b/voice_engine/include/voe_base.h
deleted file mode 100644
index 6e93da5..0000000
--- a/voice_engine/include/voe_base.h
+++ /dev/null
@@ -1,206 +0,0 @@
-/*
- *  Copyright (c) 2012 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.
- */
-
-// This sub-API supports the following functionalities:
-//
-//  - Enables full duplex VoIP sessions via RTP using G.711 (mu-Law or A-Law).
-//  - Initialization and termination.
-//  - Trace information on text files or via callbacks.
-//  - Multi-channel support (mixing, sending to multiple destinations etc.).
-//
-// To support other codecs than G.711, the VoECodec sub-API must be utilized.
-//
-// Usage example, omitting error checking:
-//
-//  using namespace webrtc;
-//  VoiceEngine* voe = VoiceEngine::Create();
-//  VoEBase* base = VoEBase::GetInterface(voe);
-//  base->Init();
-//  int ch = base->CreateChannel();
-//  base->StartPlayout(ch);
-//  ...
-//  base->DeleteChannel(ch);
-//  base->Terminate();
-//  base->Release();
-//  VoiceEngine::Delete(voe);
-//
-#ifndef WEBRTC_VOICE_ENGINE_VOE_BASE_H
-#define WEBRTC_VOICE_ENGINE_VOE_BASE_H
-
-#include "webrtc/api/audio_codecs/audio_decoder_factory.h"
-#include "webrtc/common_types.h"
-#include "webrtc/modules/audio_coding/include/audio_coding_module.h"
-#include "webrtc/rtc_base/scoped_ref_ptr.h"
-
-namespace webrtc {
-
-class AudioDeviceModule;
-class AudioProcessing;
-class AudioTransport;
-namespace voe {
-class TransmitMixer;
-}  // namespace voe
-
-// VoiceEngineObserver
-class WEBRTC_DLLEXPORT VoiceEngineObserver {
- public:
-  // This method will be called after the occurrence of any runtime error
-  // code, or warning notification, when the observer interface has been
-  // installed using VoEBase::RegisterVoiceEngineObserver().
-  virtual void CallbackOnError(int channel, int errCode) = 0;
-
- protected:
-  virtual ~VoiceEngineObserver() {}
-};
-
-// VoiceEngine
-class WEBRTC_DLLEXPORT VoiceEngine {
- public:
-  // Creates a VoiceEngine object, which can then be used to acquire
-  // sub-APIs. Returns NULL on failure.
-  static VoiceEngine* Create();
-
-  // Deletes a created VoiceEngine object and releases the utilized resources.
-  // Note that if there are outstanding references held via other interfaces,
-  // the voice engine instance will not actually be deleted until those
-  // references have been released.
-  static bool Delete(VoiceEngine*& voiceEngine);
-
-  // Specifies the amount and type of trace information which will be
-  // created by the VoiceEngine.
-  static int SetTraceFilter(unsigned int filter);
-
-  // Sets the name of the trace file and enables non-encrypted trace messages.
-  static int SetTraceFile(const char* fileNameUTF8,
-                          bool addFileCounter = false);
-
-  // Installs the TraceCallback implementation to ensure that the user
-  // receives callbacks for generated trace messages.
-  static int SetTraceCallback(TraceCallback* callback);
-
-  static std::string GetVersionString();
-
- protected:
-  VoiceEngine() {}
-  ~VoiceEngine() {}
-};
-
-// VoEBase
-class WEBRTC_DLLEXPORT VoEBase {
- public:
-  struct ChannelConfig {
-    AudioCodingModule::Config acm_config;
-    bool enable_voice_pacing = false;
-  };
-
-  // Factory for the VoEBase sub-API. Increases an internal reference
-  // counter if successful. Returns NULL if the API is not supported or if
-  // construction fails.
-  static VoEBase* GetInterface(VoiceEngine* voiceEngine);
-
-  // Releases the VoEBase sub-API and decreases an internal reference
-  // counter. Returns the new reference count. This value should be zero
-  // for all sub-APIs before the VoiceEngine object can be safely deleted.
-  virtual int Release() = 0;
-
-  // Installs the observer class to enable runtime error control and
-  // warning notifications. Returns -1 in case of an error, 0 otherwise.
-  virtual int RegisterVoiceEngineObserver(VoiceEngineObserver& observer) = 0;
-
-  // Removes and disables the observer class for runtime error control
-  // and warning notifications. Returns 0.
-  virtual int DeRegisterVoiceEngineObserver() = 0;
-
-  // Initializes all common parts of the VoiceEngine; e.g. all
-  // encoders/decoders, the sound card and core receiving components.
-  // This method also makes it possible to install some user-defined external
-  // modules:
-  // - The Audio Device Module (ADM) which implements all the audio layer
-  // functionality in a separate (reference counted) module.
-  // - The AudioProcessing module handles capture-side processing.
-  // - An AudioDecoderFactory - used to create audio decoders.
-  // If NULL is passed for either of ADM or AudioDecoderFactory, VoiceEngine
-  // will create its own. Returns -1 in case of an error, 0 otherwise.
-  // TODO(ajm): Remove default NULLs.
-  virtual int Init(AudioDeviceModule* external_adm = NULL,
-                   AudioProcessing* external_apm = nullptr,
-                   const rtc::scoped_refptr<AudioDecoderFactory>&
-                       decoder_factory = nullptr) = 0;
-  // This method is WIP - DO NOT USE!
-  // Returns NULL before Init() is called.
-  virtual AudioDeviceModule* audio_device_module() = 0;
-
-  // This method is WIP - DO NOT USE!
-  // Returns NULL before Init() is called.
-  virtual voe::TransmitMixer* transmit_mixer() = 0;
-
-  // Terminates all VoiceEngine functions and releases allocated resources.
-  // Returns 0.
-  virtual int Terminate() = 0;
-
-  // Creates a new channel and allocates the required resources for it.
-  // The second version accepts a |config| struct which includes an Audio Coding
-  // Module config and an option to enable voice pacing. Note that the
-  // decoder_factory member of the ACM config will be ignored (the decoder
-  // factory set through Init() will always be used).
-  // Returns channel ID or -1 in case of an error.
-  virtual int CreateChannel() = 0;
-  virtual int CreateChannel(const ChannelConfig& config) = 0;
-
-  // Deletes an existing channel and releases the utilized resources.
-  // Returns -1 in case of an error, 0 otherwise.
-  virtual int DeleteChannel(int channel) = 0;
-
-  // Prepares and initiates the VoiceEngine for reception of
-  // incoming RTP/RTCP packets on the specified |channel|.
-  virtual int StartReceive(int channel) = 0;
-
-  // Stops receiving incoming RTP/RTCP packets on the specified |channel|.
-  virtual int StopReceive(int channel)  { return 0; }
-
-  // Starts forwarding the packets to the mixer/soundcard for a
-  // specified |channel|.
-  virtual int StartPlayout(int channel) = 0;
-
-  // Stops forwarding the packets to the mixer/soundcard for a
-  // specified |channel|.
-  virtual int StopPlayout(int channel) = 0;
-
-  // Starts sending packets to an already specified IP address and
-  // port number for a specified |channel|.
-  virtual int StartSend(int channel) = 0;
-
-  // Stops sending packets from a specified |channel|.
-  virtual int StopSend(int channel) = 0;
-
-  // Gets the version information for VoiceEngine and its components.
-  virtual int GetVersion(char version[1024]) = 0;
-
-  // Gets the last VoiceEngine error code.
-  virtual int LastError() = 0;
-
-  // TODO(xians): Make the interface pure virtual after libjingle
-  // implements the interface in its FakeWebRtcVoiceEngine.
-  virtual AudioTransport* audio_transport() { return NULL; }
-
-  // Associate a send channel to a receive channel.
-  // Used for obtaining RTT for a receive-only channel.
-  // One should be careful not to crate a circular association, e.g.,
-  // 1 <- 2 <- 1.
-  virtual int AssociateSendChannel(int channel, int accociate_send_channel) = 0;
-
- protected:
-  VoEBase() {}
-  virtual ~VoEBase() {}
-};
-
-}  // namespace webrtc
-
-#endif  //  WEBRTC_VOICE_ENGINE_VOE_BASE_H
diff --git a/voice_engine/include/voe_codec.h b/voice_engine/include/voe_codec.h
deleted file mode 100644
index cedf47d..0000000
--- a/voice_engine/include/voe_codec.h
+++ /dev/null
@@ -1,147 +0,0 @@
-/*
- *  Copyright (c) 2012 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.
- */
-
-// This sub-API supports the following functionalities:
-//
-//  - Support of non-default codecs (e.g. iLBC, iSAC, etc.).
-//  - Voice Activity Detection (VAD) on a per channel basis.
-//  - Possibility to specify how to map received payload types to codecs.
-//
-// Usage example, omitting error checking:
-//
-//  using namespace webrtc;
-//  VoiceEngine* voe = VoiceEngine::Create();
-//  VoEBase* base = VoEBase::GetInterface(voe);
-//  VoECodec* codec = VoECodec::GetInterface(voe);
-//  base->Init();
-//  int num_of_codecs = codec->NumOfCodecs()
-//  ...
-//  base->Terminate();
-//  base->Release();
-//  codec->Release();
-//  VoiceEngine::Delete(voe);
-//
-#ifndef WEBRTC_VOICE_ENGINE_VOE_CODEC_H
-#define WEBRTC_VOICE_ENGINE_VOE_CODEC_H
-
-#include "webrtc/common_types.h"
-
-namespace webrtc {
-
-class VoiceEngine;
-
-class WEBRTC_DLLEXPORT VoECodec {
- public:
-  // Factory for the VoECodec sub-API. Increases an internal
-  // reference counter if successful. Returns NULL if the API is not
-  // supported or if construction fails.
-  static VoECodec* GetInterface(VoiceEngine* voiceEngine);
-
-  // Releases the VoECodec sub-API and decreases an internal
-  // reference counter. Returns the new reference count. This value should
-  // be zero for all sub-API:s before the VoiceEngine object can be safely
-  // deleted.
-  virtual int Release() = 0;
-
-  // Gets the number of supported codecs.
-  virtual int NumOfCodecs() = 0;
-
-  // Get the |codec| information for a specified list |index|.
-  virtual int GetCodec(int index, CodecInst& codec) = 0;
-
-  // Sets the |codec| for the |channel| to be used for sending.
-  virtual int SetSendCodec(int channel, const CodecInst& codec) = 0;
-
-  // Gets the |codec| parameters for the sending codec on a specified
-  // |channel|.
-  virtual int GetSendCodec(int channel, CodecInst& codec) = 0;
-
-  // Sets the bitrate on a specified |channel| to the specified value
-  // (in bits/sec). If the value is not supported by the codec, the codec will
-  // choose an appropriate value.
-  // Returns -1 on failure and 0 on success.
-  virtual int SetBitRate(int channel, int bitrate_bps) = 0;
-
-  // Gets the currently received |codec| for a specific |channel|.
-  virtual int GetRecCodec(int channel, CodecInst& codec) = 0;
-
-  // Sets the dynamic payload type number for a particular |codec| or
-  // disables (ignores) a codec for receiving. For instance, when receiving
-  // an invite from a SIP-based client, this function can be used to change
-  // the dynamic payload type number to match that in the INVITE SDP-
-  // message. The utilized parameters in the |codec| structure are:
-  // plname, plfreq, pltype and channels.
-  virtual int SetRecPayloadType(int channel, const CodecInst& codec) = 0;
-
-  // Gets the actual payload type that is set for receiving a |codec| on a
-  // |channel|. The value it retrieves will either be the default payload
-  // type, or a value earlier set with SetRecPayloadType().
-  virtual int GetRecPayloadType(int channel, CodecInst& codec) = 0;
-
-  // Sets the payload |type| for the sending of SID-frames with background
-  // noise estimation during silence periods detected by the VAD.
-  virtual int SetSendCNPayloadType(
-      int channel,
-      int type,
-      PayloadFrequencies frequency = kFreq16000Hz) = 0;
-
-  // Sets the codec internal FEC (forward error correction) status for a
-  // specified |channel|. Returns 0 if success, and -1 if failed.
-  // TODO(minyue): Make SetFECStatus() pure virtual when fakewebrtcvoiceengine
-  // in talk is ready.
-  virtual int SetFECStatus(int channel, bool enable) { return -1; }
-
-  // Gets the codec internal FEC status for a specified |channel|. Returns 0
-  // with the status stored in |enabled| if success, and -1 if encountered
-  // error.
-  // TODO(minyue): Make GetFECStatus() pure virtual when fakewebrtcvoiceengine
-  // in talk is ready.
-  virtual int GetFECStatus(int channel, bool& enabled) { return -1; }
-
-  // Sets the VAD/DTX (silence suppression) status and |mode| for a
-  // specified |channel|. Disabling VAD (through |enable|) will also disable
-  // DTX; it is not necessary to explictly set |disableDTX| in this case.
-  virtual int SetVADStatus(int channel,
-                           bool enable,
-                           VadModes mode = kVadConventional,
-                           bool disableDTX = false) = 0;
-
-  // Gets the VAD/DTX status and |mode| for a specified |channel|.
-  virtual int GetVADStatus(int channel,
-                           bool& enabled,
-                           VadModes& mode,
-                           bool& disabledDTX) = 0;
-
-  // If send codec is Opus on a specified |channel|, sets the maximum playback
-  // rate the receiver will render: |frequency_hz| (in Hz).
-  // TODO(minyue): Make SetOpusMaxPlaybackRate() pure virtual when
-  // fakewebrtcvoiceengine in talk is ready.
-  virtual int SetOpusMaxPlaybackRate(int channel, int frequency_hz) {
-    return -1;
-  }
-
-  // If send codec is Opus on a specified |channel|, set its DTX. Returns 0 if
-  // success, and -1 if failed.
-  virtual int SetOpusDtx(int channel, bool enable_dtx) = 0;
-
-  // If send codec is Opus on a specified |channel|, return its DTX status.
-  // Returns 0 on success, and -1 if failed.
-  // TODO(ivoc): Make GetOpusDtxStatus() pure virtual when all deriving classes
-  // are updated.
-  virtual int GetOpusDtxStatus(int channel, bool* enabled) { return -1; }
-
- protected:
-  VoECodec() {}
-  virtual ~VoECodec() {}
-};
-
-}  // namespace webrtc
-
-#endif  //  WEBRTC_VOICE_ENGINE_VOE_CODEC_H
diff --git a/voice_engine/include/voe_errors.h b/voice_engine/include/voe_errors.h
deleted file mode 100644
index f48319e..0000000
--- a/voice_engine/include/voe_errors.h
+++ /dev/null
@@ -1,165 +0,0 @@
-/*
- *  Copyright (c) 2011 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_VOICE_ENGINE_VOE_ERRORS_H
-#define WEBRTC_VOICE_ENGINE_VOE_ERRORS_H
-
-// Warnings
-#define VE_PORT_NOT_DEFINED 8001
-#define VE_CHANNEL_NOT_VALID 8002
-#define VE_FUNC_NOT_SUPPORTED 8003
-#define VE_INVALID_LISTNR 8004
-#define VE_INVALID_ARGUMENT 8005
-#define VE_INVALID_PORT_NMBR 8006
-#define VE_INVALID_PLNAME 8007
-#define VE_INVALID_PLFREQ 8008
-#define VE_INVALID_PLTYPE 8009
-#define VE_INVALID_PACSIZE 8010
-#define VE_NOT_SUPPORTED 8011
-#define VE_ALREADY_LISTENING 8012
-#define VE_CHANNEL_NOT_CREATED 8013
-#define VE_MAX_ACTIVE_CHANNELS_REACHED 8014
-#define VE_REC_CANNOT_PREPARE_HEADER 8015
-#define VE_REC_CANNOT_ADD_BUFFER 8016
-#define VE_PLAY_CANNOT_PREPARE_HEADER 8017
-#define VE_ALREADY_SENDING 8018
-#define VE_INVALID_IP_ADDRESS 8019
-#define VE_ALREADY_PLAYING 8020
-#define VE_NOT_ALL_VERSION_INFO 8021
-// 8022 is not used
-#define VE_INVALID_CHANNELS 8023
-#define VE_SET_PLTYPE_FAILED 8024
-// 8025 is not used
-#define VE_NOT_INITED 8026
-#define VE_NOT_SENDING 8027
-#define VE_EXT_TRANSPORT_NOT_SUPPORTED 8028
-#define VE_EXTERNAL_TRANSPORT_ENABLED 8029
-#define VE_STOP_RECORDING_FAILED 8030
-#define VE_INVALID_RATE 8031
-#define VE_INVALID_PACKET 8032
-#define VE_NO_GQOS 8033
-#define VE_INVALID_TIMESTAMP 8034
-#define VE_RECEIVE_PACKET_TIMEOUT 8035
-// 8036 is not used
-#define VE_INIT_FAILED_WRONG_EXPIRY 8037
-#define VE_SENDING 8038
-#define VE_ENABLE_IPV6_FAILED 8039
-#define VE_FUNC_NO_STEREO 8040
-// Range 8041-8080 is not used
-#define VE_FW_TRAVERSAL_ALREADY_INITIALIZED 8081
-#define VE_PACKET_RECEIPT_RESTARTED 8082
-#define VE_NOT_ALL_INFO 8083
-#define VE_CANNOT_SET_SEND_CODEC 8084
-#define VE_CODEC_ERROR 8085
-#define VE_NETEQ_ERROR 8086
-#define VE_RTCP_ERROR 8087
-#define VE_INVALID_OPERATION 8088
-#define VE_CPU_INFO_ERROR 8089
-#define VE_SOUNDCARD_ERROR 8090
-#define VE_SPEECH_LEVEL_ERROR 8091
-#define VE_SEND_ERROR 8092
-#define VE_CANNOT_REMOVE_CONF_CHANNEL 8093
-#define VE_PLTYPE_ERROR 8094
-#define VE_SET_RED_FAILED 8095
-#define VE_CANNOT_GET_PLAY_DATA 8096
-#define VE_APM_ERROR 8097
-#define VE_RUNTIME_PLAY_WARNING 8098
-#define VE_RUNTIME_REC_WARNING 8099
-#define VE_NOT_PLAYING 8100
-#define VE_SOCKETS_NOT_INITED 8101
-#define VE_CANNOT_GET_SOCKET_INFO 8102
-#define VE_INVALID_MULTICAST_ADDRESS 8103
-#define VE_DESTINATION_NOT_INITED 8104
-#define VE_RECEIVE_SOCKETS_CONFLICT 8105
-#define VE_SEND_SOCKETS_CONFLICT 8106
-#define VE_TYPING_NOISE_WARNING 8107
-#define VE_NOISE_WARNING 8109
-#define VE_CANNOT_GET_SEND_CODEC 8110
-#define VE_CANNOT_GET_REC_CODEC 8111
-#define VE_ALREADY_INITED 8112
-#define VE_CANNOT_SET_SECONDARY_SEND_CODEC 8113
-#define VE_CANNOT_GET_SECONDARY_SEND_CODEC 8114
-#define VE_CANNOT_REMOVE_SECONDARY_SEND_CODEC 8115
-#define VE_TYPING_NOISE_OFF_WARNING 8116
-
-// Errors causing limited functionality
-#define VE_RTCP_SOCKET_ERROR 9001
-#define VE_MIC_VOL_ERROR 9002
-#define VE_SPEAKER_VOL_ERROR 9003
-#define VE_CANNOT_ACCESS_MIC_VOL 9004
-#define VE_CANNOT_ACCESS_SPEAKER_VOL 9005
-#define VE_GET_MIC_VOL_ERROR 9006
-#define VE_GET_SPEAKER_VOL_ERROR 9007
-#define VE_THREAD_RTCP_ERROR 9008
-#define VE_CANNOT_INIT_APM 9009
-#define VE_SEND_SOCKET_TOS_ERROR 9010
-#define VE_CANNOT_RETRIEVE_DEVICE_NAME 9013
-#define VE_SRTP_ERROR 9014
-// 9015 is not used
-#define VE_INTERFACE_NOT_FOUND 9016
-#define VE_TOS_GQOS_CONFLICT 9017
-#define VE_CANNOT_ADD_CONF_CHANNEL 9018
-#define VE_BUFFER_TOO_SMALL 9019
-#define VE_CANNOT_EXECUTE_SETTING 9020
-#define VE_CANNOT_RETRIEVE_SETTING 9021
-// 9022 is not used
-#define VE_RTP_KEEPALIVE_FAILED 9023
-#define VE_SEND_DTMF_FAILED 9024
-#define VE_CANNOT_RETRIEVE_CNAME 9025
-// 9026 is not used
-// 9027 is not used
-#define VE_CANNOT_RETRIEVE_RTP_STAT 9028
-#define VE_GQOS_ERROR 9029
-#define VE_BINDING_SOCKET_TO_LOCAL_ADDRESS_FAILED 9030
-#define VE_TOS_INVALID 9031
-#define VE_TOS_ERROR 9032
-#define VE_CANNOT_RETRIEVE_VALUE 9033
-
-// Critical errors that stops voice functionality
-#define VE_PLAY_UNDEFINED_SC_ERR 10001
-#define VE_REC_CANNOT_OPEN_SC 10002
-#define VE_SOCKET_ERROR 10003
-#define VE_MMSYSERR_INVALHANDLE 10004
-#define VE_MMSYSERR_NODRIVER 10005
-#define VE_MMSYSERR_NOMEM 10006
-#define VE_WAVERR_UNPREPARED 10007
-#define VE_WAVERR_STILLPLAYING 10008
-#define VE_UNDEFINED_SC_ERR 10009
-#define VE_UNDEFINED_SC_REC_ERR 10010
-#define VE_THREAD_ERROR 10011
-#define VE_CANNOT_START_RECORDING 10012
-#define VE_PLAY_CANNOT_OPEN_SC 10013
-#define VE_NO_WINSOCK_2 10014
-#define VE_SEND_SOCKET_ERROR 10015
-#define VE_BAD_FILE 10016
-#define VE_EXPIRED_COPY 10017
-#define VE_NOT_AUTHORISED 10018
-#define VE_RUNTIME_PLAY_ERROR 10019
-#define VE_RUNTIME_REC_ERROR 10020
-#define VE_BAD_ARGUMENT 10021
-#define VE_LINUX_API_ONLY 10022
-#define VE_REC_DEVICE_REMOVED 10023
-#define VE_NO_MEMORY 10024
-#define VE_BAD_HANDLE 10025
-#define VE_RTP_RTCP_MODULE_ERROR 10026
-#define VE_AUDIO_CODING_MODULE_ERROR 10027
-#define VE_AUDIO_DEVICE_MODULE_ERROR 10028
-#define VE_CANNOT_START_PLAYOUT 10029
-#define VE_CANNOT_STOP_RECORDING 10030
-#define VE_CANNOT_STOP_PLAYOUT 10031
-#define VE_CANNOT_INIT_CHANNEL 10032
-#define VE_RECV_SOCKET_ERROR 10033
-#define VE_SOCKET_TRANSPORT_MODULE_ERROR 10034
-#define VE_AUDIO_CONF_MIX_MODULE_ERROR 10035
-
-// Warnings for other platforms (reserved range 8061-8080)
-#define VE_IGNORED_FUNCTION 8061
-
-#endif  //  WEBRTC_VOICE_ENGINE_VOE_ERRORS_H
diff --git a/voice_engine/include/voe_file.h b/voice_engine/include/voe_file.h
deleted file mode 100644
index f3a3a1f..0000000
--- a/voice_engine/include/voe_file.h
+++ /dev/null
@@ -1,144 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-// This sub-API supports the following functionalities:
-//
-//  - File playback.
-//  - File recording.
-//  - File conversion.
-//
-// Usage example, omitting error checking:
-//
-//  using namespace webrtc;
-//  VoiceEngine* voe = VoiceEngine::Create();
-//  VoEBase* base = VoEBase::GetInterface(voe);
-//  VoEFile* file  = VoEFile::GetInterface(voe);
-//  base->Init();
-//  int ch = base->CreateChannel();
-//  ...
-//  base->StartPlayout(ch);
-//  file->StartPlayingFileAsMicrophone(ch, "data_file_16kHz.pcm", true);
-//  ...
-//  file->StopPlayingFileAsMicrophone(ch);
-//  base->StopPlayout(ch);
-//  ...
-//  base->DeleteChannel(ch);
-//  base->Terminate();
-//  base->Release();
-//  file->Release();
-//  VoiceEngine::Delete(voe);
-//
-#ifndef WEBRTC_VOICE_ENGINE_VOE_FILE_H
-#define WEBRTC_VOICE_ENGINE_VOE_FILE_H
-
-#include "webrtc/common_types.h"
-
-namespace webrtc {
-
-class VoiceEngine;
-
-class WEBRTC_DLLEXPORT VoEFile {
- public:
-  // Factory for the VoEFile sub-API. Increases an internal
-  // reference counter if successful. Returns NULL if the API is not
-  // supported or if construction fails.
-  static VoEFile* GetInterface(VoiceEngine* voiceEngine);
-
-  // Releases the VoEFile sub-API and decreases an internal
-  // reference counter. Returns the new reference count. This value should
-  // be zero for all sub-API:s before the VoiceEngine object can be safely
-  // deleted.
-  virtual int Release() = 0;
-
-  // Starts playing and mixing files with the local speaker signal for
-  // playout.
-  virtual int StartPlayingFileLocally(
-      int channel,
-      const char fileNameUTF8[1024],
-      bool loop = false,
-      FileFormats format = kFileFormatPcm16kHzFile,
-      float volumeScaling = 1.0,
-      int startPointMs = 0,
-      int stopPointMs = 0) = 0;
-
-  // Starts playing and mixing streams with the local speaker signal for
-  // playout.
-  virtual int StartPlayingFileLocally(
-      int channel,
-      InStream* stream,
-      FileFormats format = kFileFormatPcm16kHzFile,
-      float volumeScaling = 1.0,
-      int startPointMs = 0,
-      int stopPointMs = 0) = 0;
-
-  // Stops playback of a file on a specific |channel|.
-  virtual int StopPlayingFileLocally(int channel) = 0;
-
-  // Returns the current file playing state for a specific |channel|.
-  virtual int IsPlayingFileLocally(int channel) = 0;
-
-  // Starts reading data from a file and transmits the data either
-  // mixed with or instead of the microphone signal.
-  virtual int StartPlayingFileAsMicrophone(
-      int channel,
-      const char fileNameUTF8[1024],
-      bool loop = false,
-      bool mixWithMicrophone = false,
-      FileFormats format = kFileFormatPcm16kHzFile,
-      float volumeScaling = 1.0) = 0;
-
-  // Starts reading data from a stream and transmits the data either
-  // mixed with or instead of the microphone signal.
-  virtual int StartPlayingFileAsMicrophone(
-      int channel,
-      InStream* stream,
-      bool mixWithMicrophone = false,
-      FileFormats format = kFileFormatPcm16kHzFile,
-      float volumeScaling = 1.0) = 0;
-
-  // Stops playing of a file as microphone signal for a specific |channel|.
-  virtual int StopPlayingFileAsMicrophone(int channel) = 0;
-
-  // Returns whether the |channel| is currently playing a file as microphone.
-  virtual int IsPlayingFileAsMicrophone(int channel) = 0;
-
-  // Starts recording the mixed playout audio.
-  virtual int StartRecordingPlayout(int channel,
-                                    const char* fileNameUTF8,
-                                    CodecInst* compression = NULL,
-                                    int maxSizeBytes = -1) = 0;
-
-  // Stops recording the mixed playout audio.
-  virtual int StopRecordingPlayout(int channel) = 0;
-
-  virtual int StartRecordingPlayout(int channel,
-                                    OutStream* stream,
-                                    CodecInst* compression = NULL) = 0;
-
-  // Starts recording the microphone signal to a file.
-  virtual int StartRecordingMicrophone(const char* fileNameUTF8,
-                                       CodecInst* compression = NULL,
-                                       int maxSizeBytes = -1) = 0;
-
-  // Starts recording the microphone signal to a stream.
-  virtual int StartRecordingMicrophone(OutStream* stream,
-                                       CodecInst* compression = NULL) = 0;
-
-  // Stops recording the microphone signal.
-  virtual int StopRecordingMicrophone() = 0;
-
- protected:
-  VoEFile() {}
-  virtual ~VoEFile() {}
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_VOICE_ENGINE_VOE_FILE_H
diff --git a/voice_engine/include/voe_network.h b/voice_engine/include/voe_network.h
deleted file mode 100644
index e659394..0000000
--- a/voice_engine/include/voe_network.h
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- *  Copyright (c) 2011 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.
- */
-
-// This sub-API supports the following functionalities:
-//
-//  - External protocol support.
-//  - Packet timeout notification.
-//  - Dead-or-Alive connection observations.
-//
-// Usage example, omitting error checking:
-//
-//  using namespace webrtc;
-//  VoiceEngine* voe = VoiceEngine::Create();
-//  VoEBase* base = VoEBase::GetInterface(voe);
-//  VoENetwork* netw  = VoENetwork::GetInterface(voe);
-//  base->Init();
-//  int ch = base->CreateChannel();
-//  ...
-//  netw->SetPeriodicDeadOrAliveStatus(ch, true);
-//  ...
-//  base->DeleteChannel(ch);
-//  base->Terminate();
-//  base->Release();
-//  netw->Release();
-//  VoiceEngine::Delete(voe);
-//
-#ifndef WEBRTC_VOICE_ENGINE_VOE_NETWORK_H
-#define WEBRTC_VOICE_ENGINE_VOE_NETWORK_H
-
-#include "webrtc/api/call/transport.h"
-#include "webrtc/common_types.h"
-
-namespace webrtc {
-
-class VoiceEngine;
-
-// VoENetwork
-class WEBRTC_DLLEXPORT VoENetwork {
- public:
-  // Factory for the VoENetwork sub-API. Increases an internal
-  // reference counter if successful. Returns NULL if the API is not
-  // supported or if construction fails.
-  static VoENetwork* GetInterface(VoiceEngine* voiceEngine);
-
-  // Releases the VoENetwork sub-API and decreases an internal
-  // reference counter. Returns the new reference count. This value should
-  // be zero for all sub-API:s before the VoiceEngine object can be safely
-  // deleted.
-  virtual int Release() = 0;
-
-  // Installs and enables a user-defined external transport protocol for a
-  // specified |channel|. Returns -1 in case of an error, 0 otherwise.
-  virtual int RegisterExternalTransport(int channel, Transport& transport) = 0;
-
-  // Removes and disables a user-defined external transport protocol for a
-  // specified |channel|. Returns -1 in case of an error, 0 otherwise.
-  virtual int DeRegisterExternalTransport(int channel) = 0;
-
-  // The packets received from the network should be passed to this
-  // function when external transport is enabled. Note that the data
-  // including the RTP-header must also be given to the VoiceEngine.
-  //  Returns -1 in case of an error, 0 otherwise.
-  virtual int ReceivedRTPPacket(int channel,
-                                const void* data,
-                                size_t length) = 0;
-  virtual int ReceivedRTPPacket(int channel,
-                                const void* data,
-                                size_t length,
-                                const PacketTime& packet_time) {
-    return 0;
-  }
-
-  // The packets received from the network should be passed to this
-  // function when external transport is enabled. Note that the data
-  // including the RTCP-header must also be given to the VoiceEngine.
-  //  Returns -1 in case of an error, 0 otherwise.
-  virtual int ReceivedRTCPPacket(int channel,
-                                 const void* data,
-                                 size_t length) = 0;
-
- protected:
-  VoENetwork() {}
-  virtual ~VoENetwork() {}
-};
-
-}  // namespace webrtc
-
-#endif  //  WEBRTC_VOICE_ENGINE_VOE_NETWORK_H
diff --git a/voice_engine/include/voe_rtp_rtcp.h b/voice_engine/include/voe_rtp_rtcp.h
deleted file mode 100644
index b53deae..0000000
--- a/voice_engine/include/voe_rtp_rtcp.h
+++ /dev/null
@@ -1,151 +0,0 @@
-/*
- *  Copyright (c) 2012 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.
- */
-
-// This sub-API supports the following functionalities:
-//
-//  - Callbacks for RTP and RTCP events such as modified SSRC or CSRC.
-//  - SSRC handling.
-//  - Transmission of RTCP sender reports.
-//  - Obtaining RTCP data from incoming RTCP sender reports.
-//  - RTP and RTCP statistics (jitter, packet loss, RTT etc.).
-//  - Redundant Coding (RED)
-//  - Writing RTP and RTCP packets to binary files for off-line analysis of
-//    the call quality.
-//
-// Usage example, omitting error checking:
-//
-//  using namespace webrtc;
-//  VoiceEngine* voe = VoiceEngine::Create();
-//  VoEBase* base = VoEBase::GetInterface(voe);
-//  VoERTP_RTCP* rtp_rtcp  = VoERTP_RTCP::GetInterface(voe);
-//  base->Init();
-//  int ch = base->CreateChannel();
-//  ...
-//  rtp_rtcp->SetLocalSSRC(ch, 12345);
-//  ...
-//  base->DeleteChannel(ch);
-//  base->Terminate();
-//  base->Release();
-//  rtp_rtcp->Release();
-//  VoiceEngine::Delete(voe);
-//
-#ifndef WEBRTC_VOICE_ENGINE_VOE_RTP_RTCP_H
-#define WEBRTC_VOICE_ENGINE_VOE_RTP_RTCP_H
-
-#include <vector>
-#include "webrtc/common_types.h"
-
-namespace webrtc {
-
-class VoiceEngine;
-
-// VoERTPObserver
-class WEBRTC_DLLEXPORT VoERTPObserver {
- public:
-  virtual void OnIncomingCSRCChanged(int channel,
-                                     unsigned int CSRC,
-                                     bool added) = 0;
-
-  virtual void OnIncomingSSRCChanged(int channel, unsigned int SSRC) = 0;
-
- protected:
-  virtual ~VoERTPObserver() {}
-};
-
-// CallStatistics
-struct CallStatistics {
-  unsigned short fractionLost;
-  unsigned int cumulativeLost;
-  unsigned int extendedMax;
-  unsigned int jitterSamples;
-  int64_t rttMs;
-  size_t bytesSent;
-  int packetsSent;
-  size_t bytesReceived;
-  int packetsReceived;
-  // The capture ntp time (in local timebase) of the first played out audio
-  // frame.
-  int64_t capture_start_ntp_time_ms_;
-};
-
-// See section 6.4.1 in http://www.ietf.org/rfc/rfc3550.txt for details.
-struct SenderInfo {
-  uint32_t NTP_timestamp_high;
-  uint32_t NTP_timestamp_low;
-  uint32_t RTP_timestamp;
-  uint32_t sender_packet_count;
-  uint32_t sender_octet_count;
-};
-
-// See section 6.4.2 in http://www.ietf.org/rfc/rfc3550.txt for details.
-struct ReportBlock {
-  uint32_t sender_SSRC;  // SSRC of sender
-  uint32_t source_SSRC;
-  uint8_t fraction_lost;
-  uint32_t cumulative_num_packets_lost;
-  uint32_t extended_highest_sequence_number;
-  uint32_t interarrival_jitter;
-  uint32_t last_SR_timestamp;
-  uint32_t delay_since_last_SR;
-};
-
-// VoERTP_RTCP
-class WEBRTC_DLLEXPORT VoERTP_RTCP {
- public:
-  // Factory for the VoERTP_RTCP sub-API. Increases an internal
-  // reference counter if successful. Returns NULL if the API is not
-  // supported or if construction fails.
-  static VoERTP_RTCP* GetInterface(VoiceEngine* voiceEngine);
-
-  // Releases the VoERTP_RTCP sub-API and decreases an internal
-  // reference counter. Returns the new reference count. This value should
-  // be zero for all sub-API:s before the VoiceEngine object can be safely
-  // deleted.
-  virtual int Release() = 0;
-
-  // Sets the local RTP synchronization source identifier (SSRC) explicitly.
-  virtual int SetLocalSSRC(int channel, unsigned int ssrc) = 0;
-
-  // Gets the local RTP SSRC of a specified |channel|.
-  virtual int GetLocalSSRC(int channel, unsigned int& ssrc) = 0;
-
-  // Gets the SSRC of the incoming RTP packets.
-  virtual int GetRemoteSSRC(int channel, unsigned int& ssrc) = 0;
-
-  // Sets the status of rtp-audio-level-indication on a specific |channel|.
-  virtual int SetSendAudioLevelIndicationStatus(int channel,
-                                                bool enable,
-                                                unsigned char id = 1) = 0;
-
-  // Sets the RTCP status on a specific |channel|.
-  virtual int SetRTCPStatus(int channel, bool enable) = 0;
-
-  // Gets the RTCP status on a specific |channel|.
-  virtual int GetRTCPStatus(int channel, bool& enabled) = 0;
-
-  // Sets the canonical name (CNAME) parameter for RTCP reports on a
-  // specific |channel|.
-  virtual int SetRTCP_CNAME(int channel, const char cName[256]) = 0;
-
-  // Gets the canonical name (CNAME) parameter for incoming RTCP reports
-  // on a specific channel.
-  virtual int GetRemoteRTCP_CNAME(int channel, char cName[256]) = 0;
-
-  // Gets RTCP statistics for a specific |channel|.
-  virtual int GetRTCPStatistics(int channel, CallStatistics& stats) = 0;
-
- protected:
-  VoERTP_RTCP() {}
-  virtual ~VoERTP_RTCP() {}
-};
-
-}  // namespace webrtc
-
-#endif  // #ifndef WEBRTC_VOICE_ENGINE_VOE_RTP_RTCP_H
diff --git a/voice_engine/mock/mock_voe_observer.h b/voice_engine/mock/mock_voe_observer.h
deleted file mode 100644
index 9abc2eb..0000000
--- a/voice_engine/mock/mock_voe_observer.h
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- *  Copyright (c) 2012 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_VOICE_ENGINE_MOCK_VOE_OBSERVER_H_
-#define WEBRTC_VOICE_ENGINE_MOCK_VOE_OBSERVER_H_
-
-#include "webrtc/test/gmock.h"
-#include "webrtc/voice_engine/include/voe_base.h"
-
-namespace webrtc {
-
-class MockVoEObserver: public VoiceEngineObserver {
- public:
-  MockVoEObserver() {}
-  virtual ~MockVoEObserver() {}
-
-  MOCK_METHOD2(CallbackOnError, void(int channel, int error_code));
-};
-
-}
-
-#endif  // WEBRTC_VOICE_ENGINE_MOCK_VOE_OBSERVER_H_
diff --git a/voice_engine/monitor_module.h b/voice_engine/monitor_module.h
deleted file mode 100644
index ea29d93..0000000
--- a/voice_engine/monitor_module.h
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- *  Copyright (c) 2012 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_VOICE_ENGINE_MONITOR_MODULE_H
-#define WEBRTC_VOICE_ENGINE_MONITOR_MODULE_H
-
-#include "webrtc/modules/include/module.h"
-
-namespace webrtc {
-namespace voe {
-
-// When associated with a ProcessThread, calls a callback method
-// |OnPeriodicProcess()| implemented by the |Observer|.
-// TODO(tommi): This could be replaced with PostDelayedTask().
-// Better yet, delete it and delete code related to |_saturationWarning|
-// in TransmitMixer (and the OnPeriodicProcess callback).
-template <typename Observer>
-class MonitorModule : public Module {
- public:
-  explicit MonitorModule(Observer* observer) : observer_(observer) {}
-  ~MonitorModule() override {}
-
- private:
-  int64_t TimeUntilNextProcess() override { return 1000; }
-  void Process() override { observer_->OnPeriodicProcess(); }
-
-  Observer* const observer_;
-};
-
-}  // namespace voe
-}  // namespace webrtc
-
-#endif  // VOICE_ENGINE_MONITOR_MODULE
diff --git a/voice_engine/output_mixer.cc b/voice_engine/output_mixer.cc
deleted file mode 100644
index c497cc1..0000000
--- a/voice_engine/output_mixer.cc
+++ /dev/null
@@ -1,392 +0,0 @@
-/*
- *  Copyright (c) 2012 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/voice_engine/output_mixer.h"
-
-#include "webrtc/modules/audio_processing/include/audio_processing.h"
-#include "webrtc/rtc_base/format_macros.h"
-#include "webrtc/system_wrappers/include/file_wrapper.h"
-#include "webrtc/system_wrappers/include/trace.h"
-#include "webrtc/voice_engine/statistics.h"
-#include "webrtc/voice_engine/utility.h"
-
-namespace webrtc {
-namespace voe {
-
-void
-OutputMixer::NewMixedAudio(int32_t id,
-                           const AudioFrame& generalAudioFrame,
-                           const AudioFrame** uniqueAudioFrames,
-                           uint32_t size)
-{
-    WEBRTC_TRACE(kTraceStream, kTraceVoice, VoEId(_instanceId,-1),
-                 "OutputMixer::NewMixedAudio(id=%d, size=%u)", id, size);
-
-    _audioFrame.CopyFrom(generalAudioFrame);
-    _audioFrame.id_ = id;
-}
-
-void OutputMixer::PlayNotification(int32_t id, uint32_t durationMs)
-{
-    WEBRTC_TRACE(kTraceStream, kTraceVoice, VoEId(_instanceId,-1),
-                 "OutputMixer::PlayNotification(id=%d, durationMs=%d)",
-                 id, durationMs);
-    // Not implement yet
-}
-
-void OutputMixer::RecordNotification(int32_t id,
-                                     uint32_t durationMs)
-{
-    WEBRTC_TRACE(kTraceStream, kTraceVoice, VoEId(_instanceId,-1),
-                 "OutputMixer::RecordNotification(id=%d, durationMs=%d)",
-                 id, durationMs);
-
-    // Not implement yet
-}
-
-void OutputMixer::PlayFileEnded(int32_t id)
-{
-    WEBRTC_TRACE(kTraceStream, kTraceVoice, VoEId(_instanceId,-1),
-                 "OutputMixer::PlayFileEnded(id=%d)", id);
-
-    // not needed
-}
-
-void OutputMixer::RecordFileEnded(int32_t id)
-{
-    WEBRTC_TRACE(kTraceStream, kTraceVoice, VoEId(_instanceId,-1),
-                 "OutputMixer::RecordFileEnded(id=%d)", id);
-    assert(id == _instanceId);
-
-    rtc::CritScope cs(&_fileCritSect);
-    _outputFileRecording = false;
-    WEBRTC_TRACE(kTraceStateInfo, kTraceVoice, VoEId(_instanceId,-1),
-                 "OutputMixer::RecordFileEnded() =>"
-                 "output file recorder module is shutdown");
-}
-
-int32_t
-OutputMixer::Create(OutputMixer*& mixer, uint32_t instanceId)
-{
-    WEBRTC_TRACE(kTraceMemory, kTraceVoice, instanceId,
-                 "OutputMixer::Create(instanceId=%d)", instanceId);
-    mixer = new OutputMixer(instanceId);
-    if (mixer == NULL)
-    {
-        WEBRTC_TRACE(kTraceMemory, kTraceVoice, instanceId,
-                     "OutputMixer::Create() unable to allocate memory for"
-                     "mixer");
-        return -1;
-    }
-    return 0;
-}
-
-OutputMixer::OutputMixer(uint32_t instanceId) :
-    _mixerModule(*AudioConferenceMixer::Create(instanceId)),
-    _instanceId(instanceId),
-    _mixingFrequencyHz(8000),
-    _outputFileRecording(false)
-{
-    WEBRTC_TRACE(kTraceMemory, kTraceVoice, VoEId(_instanceId,-1),
-                 "OutputMixer::OutputMixer() - ctor");
-
-    if (_mixerModule.RegisterMixedStreamCallback(this) == -1)
-    {
-        WEBRTC_TRACE(kTraceError, kTraceVoice, VoEId(_instanceId,-1),
-                     "OutputMixer::OutputMixer() failed to register mixer"
-                     "callbacks");
-    }
-}
-
-void
-OutputMixer::Destroy(OutputMixer*& mixer)
-{
-    if (mixer)
-    {
-        delete mixer;
-        mixer = NULL;
-    }
-}
-
-OutputMixer::~OutputMixer()
-{
-    WEBRTC_TRACE(kTraceMemory, kTraceVoice, VoEId(_instanceId,-1),
-                 "OutputMixer::~OutputMixer() - dtor");
-    {
-        rtc::CritScope cs(&_fileCritSect);
-        if (output_file_recorder_) {
-          output_file_recorder_->RegisterModuleFileCallback(NULL);
-          output_file_recorder_->StopRecording();
-        }
-    }
-    _mixerModule.UnRegisterMixedStreamCallback();
-    delete &_mixerModule;
-}
-
-int32_t
-OutputMixer::SetEngineInformation(voe::Statistics& engineStatistics)
-{
-    WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId,-1),
-                 "OutputMixer::SetEngineInformation()");
-    _engineStatisticsPtr = &engineStatistics;
-    return 0;
-}
-
-int32_t
-OutputMixer::SetAudioProcessingModule(AudioProcessing* audioProcessingModule)
-{
-    WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId,-1),
-                 "OutputMixer::SetAudioProcessingModule("
-                 "audioProcessingModule=0x%x)", audioProcessingModule);
-    _audioProcessingModulePtr = audioProcessingModule;
-    return 0;
-}
-
-int32_t
-OutputMixer::SetMixabilityStatus(MixerParticipant& participant,
-                                 bool mixable)
-{
-    return _mixerModule.SetMixabilityStatus(&participant, mixable);
-}
-
-int32_t
-OutputMixer::SetAnonymousMixabilityStatus(MixerParticipant& participant,
-                                          bool mixable)
-{
-    return _mixerModule.SetAnonymousMixabilityStatus(&participant, mixable);
-}
-
-int32_t
-OutputMixer::MixActiveChannels()
-{
-    _mixerModule.Process();
-    return 0;
-}
-
-int OutputMixer::StartRecordingPlayout(const char* fileName,
-                                       const CodecInst* codecInst)
-{
-    WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId,-1),
-                 "OutputMixer::StartRecordingPlayout(fileName=%s)", fileName);
-
-    if (_outputFileRecording)
-    {
-        WEBRTC_TRACE(kTraceWarning, kTraceVoice, VoEId(_instanceId,-1),
-                     "StartRecordingPlayout() is already recording");
-        return 0;
-    }
-
-    FileFormats format;
-    const uint32_t notificationTime(0);
-    CodecInst dummyCodec={100,"L16",16000,320,1,320000};
-
-    if ((codecInst != NULL) &&
-      ((codecInst->channels < 1) || (codecInst->channels > 2)))
-    {
-        _engineStatisticsPtr->SetLastError(
-            VE_BAD_ARGUMENT, kTraceError,
-            "StartRecordingPlayout() invalid compression");
-        return(-1);
-    }
-    if(codecInst == NULL)
-    {
-        format = kFileFormatPcm16kHzFile;
-        codecInst=&dummyCodec;
-    }
-    else if((STR_CASE_CMP(codecInst->plname,"L16") == 0) ||
-        (STR_CASE_CMP(codecInst->plname,"PCMU") == 0) ||
-        (STR_CASE_CMP(codecInst->plname,"PCMA") == 0))
-    {
-        format = kFileFormatWavFile;
-    }
-    else
-    {
-        format = kFileFormatCompressedFile;
-    }
-
-    rtc::CritScope cs(&_fileCritSect);
-
-    // Destroy the old instance
-    if (output_file_recorder_) {
-      output_file_recorder_->RegisterModuleFileCallback(NULL);
-      output_file_recorder_.reset();
-    }
-
-    output_file_recorder_ = FileRecorder::CreateFileRecorder(
-        _instanceId, (const FileFormats)format);
-    if (!output_file_recorder_) {
-      _engineStatisticsPtr->SetLastError(
-          VE_INVALID_ARGUMENT, kTraceError,
-          "StartRecordingPlayout() fileRecorder format isnot correct");
-      return -1;
-    }
-
-    if (output_file_recorder_->StartRecordingAudioFile(
-            fileName, (const CodecInst&)*codecInst, notificationTime) != 0) {
-      _engineStatisticsPtr->SetLastError(
-          VE_BAD_FILE, kTraceError,
-          "StartRecordingAudioFile() failed to start file recording");
-      output_file_recorder_->StopRecording();
-      output_file_recorder_.reset();
-      return -1;
-    }
-    output_file_recorder_->RegisterModuleFileCallback(this);
-    _outputFileRecording = true;
-
-    return 0;
-}
-
-int OutputMixer::StartRecordingPlayout(OutStream* stream,
-                                       const CodecInst* codecInst)
-{
-    WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId,-1),
-                 "OutputMixer::StartRecordingPlayout()");
-
-    if (_outputFileRecording)
-    {
-        WEBRTC_TRACE(kTraceWarning, kTraceVoice, VoEId(_instanceId,-1),
-                     "StartRecordingPlayout() is already recording");
-        return 0;
-    }
-
-    FileFormats format;
-    const uint32_t notificationTime(0);
-    CodecInst dummyCodec={100,"L16",16000,320,1,320000};
-
-    if (codecInst != NULL && codecInst->channels != 1)
-    {
-        _engineStatisticsPtr->SetLastError(
-            VE_BAD_ARGUMENT, kTraceError,
-            "StartRecordingPlayout() invalid compression");
-        return(-1);
-    }
-    if(codecInst == NULL)
-    {
-        format = kFileFormatPcm16kHzFile;
-        codecInst=&dummyCodec;
-    }
-    else if((STR_CASE_CMP(codecInst->plname,"L16") == 0) ||
-        (STR_CASE_CMP(codecInst->plname,"PCMU") == 0) ||
-        (STR_CASE_CMP(codecInst->plname,"PCMA") == 0))
-    {
-        format = kFileFormatWavFile;
-    }
-    else
-    {
-        format = kFileFormatCompressedFile;
-    }
-
-    rtc::CritScope cs(&_fileCritSect);
-
-    // Destroy the old instance
-    if (output_file_recorder_) {
-      output_file_recorder_->RegisterModuleFileCallback(NULL);
-      output_file_recorder_.reset();
-    }
-
-    output_file_recorder_ = FileRecorder::CreateFileRecorder(
-        _instanceId, (const FileFormats)format);
-    if (!output_file_recorder_) {
-      _engineStatisticsPtr->SetLastError(
-          VE_INVALID_ARGUMENT, kTraceError,
-          "StartRecordingPlayout() fileRecorder format isnot correct");
-      return -1;
-    }
-
-    if (output_file_recorder_->StartRecordingAudioFile(stream, *codecInst,
-                                                       notificationTime) != 0) {
-      _engineStatisticsPtr->SetLastError(
-          VE_BAD_FILE, kTraceError,
-          "StartRecordingAudioFile() failed to start file recording");
-      output_file_recorder_->StopRecording();
-      output_file_recorder_.reset();
-      return -1;
-    }
-
-    output_file_recorder_->RegisterModuleFileCallback(this);
-    _outputFileRecording = true;
-
-    return 0;
-}
-
-int OutputMixer::StopRecordingPlayout()
-{
-    WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId,-1),
-                 "OutputMixer::StopRecordingPlayout()");
-
-    if (!_outputFileRecording)
-    {
-        WEBRTC_TRACE(kTraceError, kTraceVoice, VoEId(_instanceId,-1),
-                     "StopRecordingPlayout() file isnot recording");
-        return -1;
-    }
-
-    rtc::CritScope cs(&_fileCritSect);
-
-    if (output_file_recorder_->StopRecording() != 0) {
-      _engineStatisticsPtr->SetLastError(
-          VE_STOP_RECORDING_FAILED, kTraceError,
-          "StopRecording(), could not stop recording");
-      return -1;
-    }
-    output_file_recorder_->RegisterModuleFileCallback(NULL);
-    output_file_recorder_.reset();
-    _outputFileRecording = false;
-
-    return 0;
-}
-
-int OutputMixer::GetMixedAudio(int sample_rate_hz,
-                               size_t num_channels,
-                               AudioFrame* frame) {
-  WEBRTC_TRACE(
-      kTraceStream, kTraceVoice, VoEId(_instanceId,-1),
-      "OutputMixer::GetMixedAudio(sample_rate_hz=%d, num_channels=%" PRIuS ")",
-      sample_rate_hz, num_channels);
-
-  // --- Record playout if enabled
-  {
-    rtc::CritScope cs(&_fileCritSect);
-    if (_outputFileRecording && output_file_recorder_)
-      output_file_recorder_->RecordAudioToFile(_audioFrame);
-  }
-
-  frame->num_channels_ = num_channels;
-  frame->sample_rate_hz_ = sample_rate_hz;
-  // TODO(andrew): Ideally the downmixing would occur much earlier, in
-  // AudioCodingModule.
-  RemixAndResample(_audioFrame, &resampler_, frame);
-  return 0;
-}
-
-int32_t
-OutputMixer::DoOperationsOnCombinedSignal(bool feed_data_to_apm)
-{
-    if (_audioFrame.sample_rate_hz_ != _mixingFrequencyHz)
-    {
-        WEBRTC_TRACE(kTraceStream, kTraceVoice, VoEId(_instanceId,-1),
-                     "OutputMixer::DoOperationsOnCombinedSignal() => "
-                     "mixing frequency = %d", _audioFrame.sample_rate_hz_);
-        _mixingFrequencyHz = _audioFrame.sample_rate_hz_;
-    }
-
-    // --- Far-end Voice Quality Enhancement (AudioProcessing Module)
-    if (feed_data_to_apm) {
-      if (_audioProcessingModulePtr->ProcessReverseStream(&_audioFrame) != 0) {
-        WEBRTC_TRACE(kTraceWarning, kTraceVoice, VoEId(_instanceId, -1),
-                     "AudioProcessingModule::ProcessReverseStream() => error");
-        RTC_NOTREACHED();
-      }
-    }
-
-    return 0;
-}
-}  // namespace voe
-}  // namespace webrtc
diff --git a/voice_engine/output_mixer.h b/voice_engine/output_mixer.h
deleted file mode 100644
index fe0cb30..0000000
--- a/voice_engine/output_mixer.h
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- *  Copyright (c) 2012 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_VOICE_ENGINE_OUTPUT_MIXER_H_
-#define WEBRTC_VOICE_ENGINE_OUTPUT_MIXER_H_
-
-#include <memory>
-
-#include "webrtc/common_audio/resampler/include/push_resampler.h"
-#include "webrtc/common_types.h"
-#include "webrtc/modules/audio_conference_mixer/include/audio_conference_mixer.h"
-#include "webrtc/modules/audio_conference_mixer/include/audio_conference_mixer_defines.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/voice_engine/file_recorder.h"
-
-namespace webrtc {
-
-class AudioProcessing;
-class FileWrapper;
-
-namespace voe {
-
-class Statistics;
-
-class OutputMixer : public AudioMixerOutputReceiver,
-                    public FileCallback
-{
-public:
-    static int32_t Create(OutputMixer*& mixer, uint32_t instanceId);
-
-    static void Destroy(OutputMixer*& mixer);
-
-    int32_t SetEngineInformation(Statistics& engineStatistics);
-
-    int32_t SetAudioProcessingModule(
-        AudioProcessing* audioProcessingModule);
-
-    int32_t MixActiveChannels();
-
-    int32_t DoOperationsOnCombinedSignal(bool feed_data_to_apm);
-
-    int32_t SetMixabilityStatus(MixerParticipant& participant,
-                                bool mixable);
-
-    int32_t SetAnonymousMixabilityStatus(MixerParticipant& participant,
-                                         bool mixable);
-
-    int GetMixedAudio(int sample_rate_hz, size_t num_channels,
-                      AudioFrame* audioFrame);
-
-    // VoEFile
-    int StartRecordingPlayout(const char* fileName,
-                              const CodecInst* codecInst);
-
-    int StartRecordingPlayout(OutStream* stream,
-                              const CodecInst* codecInst);
-    int StopRecordingPlayout();
-
-    virtual ~OutputMixer();
-
-    // from AudioMixerOutputReceiver
-    virtual void NewMixedAudio(
-        int32_t id,
-        const AudioFrame& generalAudioFrame,
-        const AudioFrame** uniqueAudioFrames,
-        uint32_t size);
-
-    // For file recording
-    void PlayNotification(int32_t id, uint32_t durationMs);
-
-    void RecordNotification(int32_t id, uint32_t durationMs);
-
-    void PlayFileEnded(int32_t id);
-    void RecordFileEnded(int32_t id);
-
-private:
-    OutputMixer(uint32_t instanceId);
-
-    // uses
-    Statistics* _engineStatisticsPtr;
-    AudioProcessing* _audioProcessingModulePtr;
-
-    // Protects output_file_recorder_ and _outputFileRecording.
-    rtc::CriticalSection _fileCritSect;
-    AudioConferenceMixer& _mixerModule;
-    AudioFrame _audioFrame;
-    // Converts mixed audio to the audio device output rate.
-    PushResampler<int16_t> resampler_;
-    // Converts mixed audio to the audio processing rate.
-    PushResampler<int16_t> audioproc_resampler_;
-    int _instanceId;
-    int _mixingFrequencyHz;
-    std::unique_ptr<FileRecorder> output_file_recorder_;
-    bool _outputFileRecording;
-};
-
-}  // namespace voe
-
-}  // namespace werbtc
-
-#endif  // VOICE_ENGINE_OUTPUT_MIXER_H_
diff --git a/voice_engine/shared_data.cc b/voice_engine/shared_data.cc
deleted file mode 100644
index 464374e..0000000
--- a/voice_engine/shared_data.cc
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- *  Copyright (c) 2012 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/voice_engine/shared_data.h"
-
-#include "webrtc/modules/audio_processing/include/audio_processing.h"
-#include "webrtc/system_wrappers/include/trace.h"
-#include "webrtc/voice_engine/channel.h"
-#include "webrtc/voice_engine/output_mixer.h"
-#include "webrtc/voice_engine/transmit_mixer.h"
-
-namespace webrtc {
-
-namespace voe {
-
-static int32_t _gInstanceCounter = 0;
-
-SharedData::SharedData()
-    : _instanceId(++_gInstanceCounter),
-      _channelManager(_gInstanceCounter),
-      _engineStatistics(_gInstanceCounter),
-      _audioDevicePtr(NULL),
-      _moduleProcessThreadPtr(ProcessThread::Create("VoiceProcessThread")),
-      encoder_queue_("AudioEncoderQueue") {
-  Trace::CreateTrace();
-  if (OutputMixer::Create(_outputMixerPtr, _gInstanceCounter) == 0) {
-    _outputMixerPtr->SetEngineInformation(_engineStatistics);
-  }
-  if (TransmitMixer::Create(_transmitMixerPtr, _gInstanceCounter) == 0) {
-    _transmitMixerPtr->SetEngineInformation(*_moduleProcessThreadPtr,
-                                            _engineStatistics, _channelManager);
-  }
-}
-
-SharedData::~SharedData()
-{
-    OutputMixer::Destroy(_outputMixerPtr);
-    TransmitMixer::Destroy(_transmitMixerPtr);
-    if (_audioDevicePtr) {
-        _audioDevicePtr->Release();
-    }
-    _moduleProcessThreadPtr->Stop();
-    Trace::ReturnTrace();
-}
-
-rtc::TaskQueue* SharedData::encoder_queue() {
-  RTC_DCHECK_RUN_ON(&construction_thread_);
-  return &encoder_queue_;
-}
-
-void SharedData::set_audio_device(
-    const rtc::scoped_refptr<AudioDeviceModule>& audio_device) {
-  _audioDevicePtr = audio_device;
-}
-
-void SharedData::set_audio_processing(AudioProcessing* audioproc) {
-  _transmitMixerPtr->SetAudioProcessingModule(audioproc);
-  _outputMixerPtr->SetAudioProcessingModule(audioproc);
-}
-
-int SharedData::NumOfSendingChannels() {
-  ChannelManager::Iterator it(&_channelManager);
-  int sending_channels = 0;
-
-  for (ChannelManager::Iterator it(&_channelManager); it.IsValid();
-       it.Increment()) {
-    if (it.GetChannel()->Sending())
-      ++sending_channels;
-  }
-
-  return sending_channels;
-}
-
-int SharedData::NumOfPlayingChannels() {
-  ChannelManager::Iterator it(&_channelManager);
-  int playout_channels = 0;
-
-  for (ChannelManager::Iterator it(&_channelManager); it.IsValid();
-       it.Increment()) {
-    if (it.GetChannel()->Playing())
-      ++playout_channels;
-  }
-
-  return playout_channels;
-}
-
-void SharedData::SetLastError(int32_t error) const {
-  _engineStatistics.SetLastError(error);
-}
-
-void SharedData::SetLastError(int32_t error,
-                              TraceLevel level) const {
-  _engineStatistics.SetLastError(error, level);
-}
-
-void SharedData::SetLastError(int32_t error, TraceLevel level,
-                              const char* msg) const {
-  _engineStatistics.SetLastError(error, level, msg);
-}
-
-}  // namespace voe
-
-}  // namespace webrtc
diff --git a/voice_engine/shared_data.h b/voice_engine/shared_data.h
deleted file mode 100644
index 7251c6a..0000000
--- a/voice_engine/shared_data.h
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- *  Copyright (c) 2012 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_VOICE_ENGINE_SHARED_DATA_H
-#define WEBRTC_VOICE_ENGINE_SHARED_DATA_H
-
-#include <memory>
-
-#include "webrtc/modules/audio_device/include/audio_device.h"
-#include "webrtc/modules/audio_processing/include/audio_processing.h"
-#include "webrtc/modules/utility/include/process_thread.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/scoped_ref_ptr.h"
-#include "webrtc/rtc_base/task_queue.h"
-#include "webrtc/rtc_base/thread_annotations.h"
-#include "webrtc/rtc_base/thread_checker.h"
-#include "webrtc/voice_engine/channel_manager.h"
-#include "webrtc/voice_engine/statistics.h"
-#include "webrtc/voice_engine/voice_engine_defines.h"
-
-class ProcessThread;
-
-namespace webrtc {
-namespace voe {
-
-class TransmitMixer;
-class OutputMixer;
-
-class SharedData
-{
-public:
-    // Public accessors.
-    uint32_t instance_id() const { return _instanceId; }
-    Statistics& statistics() { return _engineStatistics; }
-    ChannelManager& channel_manager() { return _channelManager; }
-    AudioDeviceModule* audio_device() { return _audioDevicePtr.get(); }
-    void set_audio_device(
-        const rtc::scoped_refptr<AudioDeviceModule>& audio_device);
-    void set_audio_processing(AudioProcessing* audio_processing);
-    TransmitMixer* transmit_mixer() { return _transmitMixerPtr; }
-    OutputMixer* output_mixer() { return _outputMixerPtr; }
-    rtc::CriticalSection* crit_sec() { return &_apiCritPtr; }
-    ProcessThread* process_thread() { return _moduleProcessThreadPtr.get(); }
-    rtc::TaskQueue* encoder_queue();
-
-    int NumOfSendingChannels();
-    int NumOfPlayingChannels();
-
-    // Convenience methods for calling statistics().SetLastError().
-    void SetLastError(int32_t error) const;
-    void SetLastError(int32_t error, TraceLevel level) const;
-    void SetLastError(int32_t error, TraceLevel level,
-                      const char* msg) const;
-
-protected:
- rtc::ThreadChecker construction_thread_;
- const uint32_t _instanceId;
- rtc::CriticalSection _apiCritPtr;
- ChannelManager _channelManager;
- Statistics _engineStatistics;
- rtc::scoped_refptr<AudioDeviceModule> _audioDevicePtr;
- OutputMixer* _outputMixerPtr;
- TransmitMixer* _transmitMixerPtr;
- std::unique_ptr<ProcessThread> _moduleProcessThreadPtr;
- // |encoder_queue| is defined last to ensure all pending tasks are cancelled
- // and deleted before any other members.
- rtc::TaskQueue encoder_queue_ RTC_ACCESS_ON(construction_thread_);
-
- SharedData();
- virtual ~SharedData();
-};
-
-}  // namespace voe
-}  // namespace webrtc
-#endif // WEBRTC_VOICE_ENGINE_SHARED_DATA_H
diff --git a/voice_engine/statistics.cc b/voice_engine/statistics.cc
deleted file mode 100644
index 0d8250f..0000000
--- a/voice_engine/statistics.cc
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- *  Copyright (c) 2012 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 <assert.h>
-#include <stdio.h>
-
-#include "webrtc/voice_engine/statistics.h"
-
-#include "webrtc/system_wrappers/include/trace.h"
-
-namespace webrtc {
-
-namespace voe {
-
-Statistics::Statistics(uint32_t instanceId) :
-    _instanceId(instanceId),
-    _lastError(0),
-    _isInitialized(false)
-{
-}
-
-Statistics::~Statistics()
-{
-}
-
-int32_t Statistics::SetInitialized()
-{
-    _isInitialized = true;
-    return 0;
-}
-
-int32_t Statistics::SetUnInitialized()
-{
-    _isInitialized = false;
-    return 0;
-}
-
-bool Statistics::Initialized() const
-{
-    return _isInitialized;
-}
-
-int32_t Statistics::SetLastError(int32_t error) const
-{
-    rtc::CritScope cs(&lock_);
-    _lastError = error;
-    return 0;
-}
-
-int32_t Statistics::SetLastError(int32_t error,
-                                 TraceLevel level) const
-{
-    WEBRTC_TRACE(level, kTraceVoice, VoEId(_instanceId,-1),
-                 "error code is set to %d",
-                 error);
-    rtc::CritScope cs(&lock_);
-    _lastError = error;
-    return 0;
-}
-
-int32_t Statistics::SetLastError(
-    int32_t error,
-    TraceLevel level, const char* msg) const
-{
-    char traceMessage[KTraceMaxMessageSize];
-    assert(strlen(msg) < KTraceMaxMessageSize);
-    sprintf(traceMessage, "%s (error=%d)", msg, error);
-
-    WEBRTC_TRACE(level, kTraceVoice, VoEId(_instanceId,-1), "%s",
-                 traceMessage);
-
-    rtc::CritScope cs(&lock_);
-    _lastError = error;
-    return 0;
-}
-
-int32_t Statistics::LastError() const
-{
-    int32_t ret;
-    {
-        rtc::CritScope cs(&lock_);
-        ret = _lastError;
-    }
-    WEBRTC_TRACE(kTraceStateInfo, kTraceVoice, VoEId(_instanceId, -1),
-                 "LastError() => %d", ret);
-    return ret;
-}
-
-}  // namespace voe
-
-}  // namespace webrtc
diff --git a/voice_engine/statistics.h b/voice_engine/statistics.h
deleted file mode 100644
index e0aa248..0000000
--- a/voice_engine/statistics.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- *  Copyright (c) 2011 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_VOICE_ENGINE_STATISTICS_H
-#define WEBRTC_VOICE_ENGINE_STATISTICS_H
-
-#include "webrtc/common_types.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/typedefs.h"
-#include "webrtc/voice_engine/include/voe_errors.h"
-#include "webrtc/voice_engine/voice_engine_defines.h"
-
-namespace webrtc {
-namespace voe {
-
-class Statistics
-{
- public:
-    enum {KTraceMaxMessageSize = 256};
- public:
-    Statistics(uint32_t instanceId);
-    ~Statistics();
-
-    int32_t SetInitialized();
-    int32_t SetUnInitialized();
-    bool Initialized() const;
-    int32_t SetLastError(int32_t error) const;
-    int32_t SetLastError(int32_t error, TraceLevel level) const;
-    int32_t SetLastError(int32_t error,
-                         TraceLevel level,
-                         const char* msg) const;
-    int32_t LastError() const;
-
- private:
-    rtc::CriticalSection lock_;
-    const uint32_t _instanceId;
-    mutable int32_t _lastError;
-    bool _isInitialized;
-};
-
-}  // namespace voe
-
-}  // namespace webrtc
-
-#endif // WEBRTC_VOICE_ENGINE_STATISTICS_H
diff --git a/voice_engine/test/auto_test/automated_mode.cc b/voice_engine/test/auto_test/automated_mode.cc
deleted file mode 100644
index 098c574..0000000
--- a/voice_engine/test/auto_test/automated_mode.cc
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- *  Copyright (c) 2011 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/test/gtest.h"
-#include "webrtc/test/testsupport/fileutils.h"
-
-namespace webrtc {
-namespace voetest {
-
-void InitializeGoogleTest(int* argc, char** argv) {
-  // Initialize WebRTC testing framework so paths to resources can be resolved.
-  webrtc::test::SetExecutablePath(argv[0]);
-  testing::InitGoogleTest(argc, argv);
-}
-
-int RunInAutomatedMode() {
-  return RUN_ALL_TESTS();
-}
-
-}  // namespace voetest
-}  // namespace webrtc
diff --git a/voice_engine/test/auto_test/automated_mode.h b/voice_engine/test/auto_test/automated_mode.h
deleted file mode 100644
index 0d673a4..0000000
--- a/voice_engine/test/auto_test/automated_mode.h
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- *  Copyright (c) 2011 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 SRC_VOICE_ENGINE_MAIN_TEST_AUTO_TEST_AUTOMATED_MODE_H_
-#define SRC_VOICE_ENGINE_MAIN_TEST_AUTO_TEST_AUTOMATED_MODE_H_
-
-namespace webrtc {
-namespace voetest {
-
-void InitializeGoogleTest(int* argc, char** argv);
-int RunInAutomatedMode();
-
-}  // namespace voetest
-}  // namespace webrtc
-
-#endif  // SRC_VOICE_ENGINE_MAIN_TEST_AUTO_TEST_AUTOMATED_MODE_H_
diff --git a/voice_engine/test/auto_test/fixtures/after_initialization_fixture.cc b/voice_engine/test/auto_test/fixtures/after_initialization_fixture.cc
deleted file mode 100644
index efdf633..0000000
--- a/voice_engine/test/auto_test/fixtures/after_initialization_fixture.cc
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- *  Copyright (c) 2011 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_processing/include/audio_processing.h"
-#include "webrtc/voice_engine/test/auto_test/fixtures/after_initialization_fixture.h"
-
-class TestErrorObserver : public webrtc::VoiceEngineObserver {
- public:
-  TestErrorObserver() {}
-  virtual ~TestErrorObserver() {}
-  void CallbackOnError(int channel, int error_code) {
-    ADD_FAILURE() << "Unexpected error on channel " << channel <<
-        ": error code " << error_code;
-  }
-};
-
-AfterInitializationFixture::AfterInitializationFixture()
-    : error_observer_(new TestErrorObserver()) {
-  webrtc::Config config;
-  config.Set<webrtc::ExperimentalAgc>(new webrtc::ExperimentalAgc(false));
-  webrtc::AudioProcessing* audioproc = webrtc::AudioProcessing::Create(config);
-
-  EXPECT_EQ(0, voe_base_->Init(NULL, audioproc));
-  EXPECT_EQ(0, voe_base_->RegisterVoiceEngineObserver(*error_observer_));
-}
-
-AfterInitializationFixture::~AfterInitializationFixture() {
-  EXPECT_EQ(0, voe_base_->DeRegisterVoiceEngineObserver());
-}
diff --git a/voice_engine/test/auto_test/fixtures/after_initialization_fixture.h b/voice_engine/test/auto_test/fixtures/after_initialization_fixture.h
deleted file mode 100644
index cb36f61..0000000
--- a/voice_engine/test/auto_test/fixtures/after_initialization_fixture.h
+++ /dev/null
@@ -1,169 +0,0 @@
-/*
- *  Copyright (c) 2011 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 SRC_VOICE_ENGINE_MAIN_TEST_AUTO_TEST_STANDARD_TEST_BASE_AFTER_INIT_H_
-#define SRC_VOICE_ENGINE_MAIN_TEST_AUTO_TEST_STANDARD_TEST_BASE_AFTER_INIT_H_
-
-#include <deque>
-#include <memory>
-
-#include "webrtc/common_types.h"
-#include "webrtc/modules/rtp_rtcp/source/byte_io.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/platform_thread.h"
-#include "webrtc/system_wrappers/include/atomic32.h"
-#include "webrtc/system_wrappers/include/event_wrapper.h"
-#include "webrtc/system_wrappers/include/sleep.h"
-#include "webrtc/voice_engine/test/auto_test/fixtures/before_initialization_fixture.h"
-
-class TestErrorObserver;
-
-class LoopBackTransport : public webrtc::Transport {
- public:
-  LoopBackTransport(webrtc::VoENetwork* voe_network, int channel)
-      : packet_event_(webrtc::EventWrapper::Create()),
-        thread_(NetworkProcess, this, "LoopBackTransport"),
-        channel_(channel),
-        voe_network_(voe_network),
-        transmitted_packets_(0) {
-    thread_.Start();
-  }
-
-  ~LoopBackTransport() { thread_.Stop(); }
-
-  bool SendRtp(const uint8_t* data,
-               size_t len,
-               const webrtc::PacketOptions& options) override {
-    StorePacket(Packet::Rtp, data, len);
-    return true;
-  }
-
-  bool SendRtcp(const uint8_t* data, size_t len) override {
-    StorePacket(Packet::Rtcp, data, len);
-    return true;
-  }
-
-  void WaitForTransmittedPackets(int32_t packet_count) {
-    enum {
-      kSleepIntervalMs = 10
-    };
-    int32_t limit = transmitted_packets_.Value() + packet_count;
-    while (transmitted_packets_.Value() < limit) {
-      webrtc::SleepMs(kSleepIntervalMs);
-    }
-  }
-
-  void AddChannel(uint32_t ssrc, int channel) {
-    rtc::CritScope lock(&crit_);
-    channels_[ssrc] = channel;
-  }
-
- private:
-  struct Packet {
-    enum Type { Rtp, Rtcp, } type;
-
-    Packet() : len(0) {}
-    Packet(Type type, const void* data, size_t len)
-        : type(type), len(len) {
-      assert(len <= 1500);
-      memcpy(this->data, data, len);
-    }
-
-    uint8_t data[1500];
-    size_t len;
-  };
-
-  void StorePacket(Packet::Type type,
-                   const void* data,
-                   size_t len) {
-    {
-      rtc::CritScope lock(&crit_);
-      packet_queue_.push_back(Packet(type, data, len));
-    }
-    packet_event_->Set();
-  }
-
-  static bool NetworkProcess(void* transport) {
-    return static_cast<LoopBackTransport*>(transport)->SendPackets();
-  }
-
-  bool SendPackets() {
-    switch (packet_event_->Wait(10)) {
-      case webrtc::kEventSignaled:
-        break;
-      case webrtc::kEventTimeout:
-        break;
-      case webrtc::kEventError:
-        // TODO(pbos): Log a warning here?
-        return true;
-    }
-
-    while (true) {
-      Packet p;
-      int channel = channel_;
-      {
-        rtc::CritScope lock(&crit_);
-        if (packet_queue_.empty())
-          break;
-        p = packet_queue_.front();
-        packet_queue_.pop_front();
-
-        if (p.type == Packet::Rtp) {
-          uint32_t ssrc =
-              webrtc::ByteReader<uint32_t>::ReadBigEndian(&p.data[8]);
-          if (channels_[ssrc] != 0)
-            channel = channels_[ssrc];
-        }
-        // TODO(pbos): Add RTCP SSRC muxing/demuxing if anything requires it.
-      }
-
-      // Minimum RTP header size.
-      if (p.len < 12)
-        continue;
-
-      switch (p.type) {
-        case Packet::Rtp:
-          voe_network_->ReceivedRTPPacket(channel, p.data, p.len,
-                                          webrtc::PacketTime());
-          break;
-        case Packet::Rtcp:
-          voe_network_->ReceivedRTCPPacket(channel, p.data, p.len);
-          break;
-      }
-      ++transmitted_packets_;
-    }
-    return true;
-  }
-
-  rtc::CriticalSection crit_;
-  const std::unique_ptr<webrtc::EventWrapper> packet_event_;
-  rtc::PlatformThread thread_;
-  std::deque<Packet> packet_queue_ RTC_GUARDED_BY(crit_);
-  const int channel_;
-  std::map<uint32_t, int> channels_ RTC_GUARDED_BY(crit_);
-  webrtc::VoENetwork* const voe_network_;
-  webrtc::Atomic32 transmitted_packets_;
-};
-
-// This fixture initializes the voice engine in addition to the work
-// done by the before-initialization fixture. It also registers an error
-// observer which will fail tests on error callbacks. This fixture is
-// useful to tests that want to run before we have started any form of
-// streaming through the voice engine.
-class AfterInitializationFixture : public BeforeInitializationFixture {
- public:
-  AfterInitializationFixture();
-  virtual ~AfterInitializationFixture();
-
- protected:
-  std::unique_ptr<TestErrorObserver> error_observer_;
-};
-
-#endif  // SRC_VOICE_ENGINE_MAIN_TEST_AUTO_TEST_STANDARD_TEST_BASE_AFTER_INIT_H_
diff --git a/voice_engine/test/auto_test/fixtures/after_streaming_fixture.cc b/voice_engine/test/auto_test/fixtures/after_streaming_fixture.cc
deleted file mode 100644
index 715c059..0000000
--- a/voice_engine/test/auto_test/fixtures/after_streaming_fixture.cc
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- *  Copyright (c) 2012 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/voice_engine/test/auto_test/fixtures/after_streaming_fixture.h"
-#include "webrtc/voice_engine/voice_engine_impl.h"
-
-AfterStreamingFixture::AfterStreamingFixture()
-    : BeforeStreamingFixture() {
-  webrtc::VoiceEngineImpl* voe_impl =
-      static_cast<webrtc::VoiceEngineImpl*>(voice_engine_);
-  channel_proxy_ = voe_impl->GetChannelProxy(channel_);
-  channel_proxy_->RegisterLegacyReceiveCodecs();
-  ResumePlaying();
-}
diff --git a/voice_engine/test/auto_test/fixtures/after_streaming_fixture.h b/voice_engine/test/auto_test/fixtures/after_streaming_fixture.h
deleted file mode 100644
index 1762e01..0000000
--- a/voice_engine/test/auto_test/fixtures/after_streaming_fixture.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- *  Copyright (c) 2012 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 SRC_VOICE_ENGINE_MAIN_TEST_AUTO_TEST_STANDARD_AFTER_STREAMING_H_
-#define SRC_VOICE_ENGINE_MAIN_TEST_AUTO_TEST_STANDARD_AFTER_STREAMING_H_
-
-#include <memory>
-
-#include "webrtc/voice_engine/channel_proxy.h"
-#include "webrtc/voice_engine/test/auto_test/fixtures/before_streaming_fixture.h"
-
-// This fixture will, in addition to the work done by its superclasses,
-// start play back on construction.
-class AfterStreamingFixture : public BeforeStreamingFixture {
- public:
-  AfterStreamingFixture();
-  virtual ~AfterStreamingFixture() {}
-
- protected:
-  std::unique_ptr<webrtc::voe::ChannelProxy> channel_proxy_;
-};
-
-#endif  // SRC_VOICE_ENGINE_MAIN_TEST_AUTO_TEST_STANDARD_AFTER_STREAMING_H_
diff --git a/voice_engine/test/auto_test/fixtures/before_initialization_fixture.cc b/voice_engine/test/auto_test/fixtures/before_initialization_fixture.cc
deleted file mode 100644
index acfc150..0000000
--- a/voice_engine/test/auto_test/fixtures/before_initialization_fixture.cc
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- *  Copyright (c) 2012 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/voice_engine/test/auto_test/fixtures/before_initialization_fixture.h"
-
-#include "webrtc/system_wrappers/include/sleep.h"
-
-BeforeInitializationFixture::BeforeInitializationFixture()
-    : voice_engine_(webrtc::VoiceEngine::Create()) {
-  EXPECT_TRUE(voice_engine_ != NULL);
-
-  voe_base_ = webrtc::VoEBase::GetInterface(voice_engine_);
-  voe_codec_ = webrtc::VoECodec::GetInterface(voice_engine_);
-  voe_rtp_rtcp_ = webrtc::VoERTP_RTCP::GetInterface(voice_engine_);
-  voe_network_ = webrtc::VoENetwork::GetInterface(voice_engine_);
-  voe_file_ = webrtc::VoEFile::GetInterface(voice_engine_);
-}
-
-BeforeInitializationFixture::~BeforeInitializationFixture() {
-  voe_base_->Release();
-  voe_codec_->Release();
-  voe_rtp_rtcp_->Release();
-  voe_network_->Release();
-  voe_file_->Release();
-
-  EXPECT_TRUE(webrtc::VoiceEngine::Delete(voice_engine_));
-}
-
-void BeforeInitializationFixture::Sleep(long milliseconds) {
-  webrtc::SleepMs(milliseconds);
-}
diff --git a/voice_engine/test/auto_test/fixtures/before_initialization_fixture.h b/voice_engine/test/auto_test/fixtures/before_initialization_fixture.h
deleted file mode 100644
index ce35141..0000000
--- a/voice_engine/test/auto_test/fixtures/before_initialization_fixture.h
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- *  Copyright (c) 2011 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 SRC_VOICE_ENGINE_MAIN_TEST_AUTO_TEST_STANDARD_TEST_BASE_H_
-#define SRC_VOICE_ENGINE_MAIN_TEST_AUTO_TEST_STANDARD_TEST_BASE_H_
-
-#include "webrtc/common_types.h"
-#include "webrtc/test/gmock.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/typedefs.h"
-#include "webrtc/voice_engine/include/voe_base.h"
-#include "webrtc/voice_engine/include/voe_codec.h"
-#include "webrtc/voice_engine/include/voe_errors.h"
-#include "webrtc/voice_engine/include/voe_file.h"
-#include "webrtc/voice_engine/include/voe_network.h"
-#include "webrtc/voice_engine/include/voe_rtp_rtcp.h"
-#include "webrtc/voice_engine/test/auto_test/voe_test_common.h"
-
-// This convenient fixture sets up all voice engine interfaces automatically for
-// use by testing subclasses. It allocates each interface and releases it once
-// which means that if a tests allocates additional interfaces from the voice
-// engine and forgets to release it, this test will fail in the destructor.
-// It will not call any init methods.
-//
-// Implementation note:
-// The interface fetching is done in the constructor and not SetUp() since
-// this relieves our subclasses from calling SetUp in the superclass if they
-// choose to override SetUp() themselves. This is fine as googletest will
-// construct new test objects for each method.
-class BeforeInitializationFixture : public testing::Test {
- public:
-  BeforeInitializationFixture();
-  virtual ~BeforeInitializationFixture();
-
- protected:
-  // Use this sleep function to sleep in tests.
-  void Sleep(long milliseconds);
-
-  webrtc::VoiceEngine*        voice_engine_;
-  webrtc::VoEBase*            voe_base_;
-  webrtc::VoECodec*           voe_codec_;
-  webrtc::VoERTP_RTCP*        voe_rtp_rtcp_;
-  webrtc::VoENetwork*         voe_network_;
-  webrtc::VoEFile*            voe_file_;
-};
-
-#endif  // SRC_VOICE_ENGINE_MAIN_TEST_AUTO_TEST_STANDARD_TEST_BASE_H_
diff --git a/voice_engine/test/auto_test/fixtures/before_streaming_fixture.cc b/voice_engine/test/auto_test/fixtures/before_streaming_fixture.cc
deleted file mode 100644
index c3dba83..0000000
--- a/voice_engine/test/auto_test/fixtures/before_streaming_fixture.cc
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- *  Copyright (c) 2014 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/test/testsupport/fileutils.h"
-#include "webrtc/voice_engine/test/auto_test/fixtures/before_streaming_fixture.h"
-
-BeforeStreamingFixture::BeforeStreamingFixture()
-    : channel_(voe_base_->CreateChannel()),
-      transport_(NULL) {
-  EXPECT_GE(channel_, 0);
-
-  fake_microphone_input_file_ =
-      webrtc::test::ResourcePath("voice_engine/audio_long16", "pcm");
-
-  SetUpLocalPlayback();
-  RestartFakeMicrophone();
-}
-
-BeforeStreamingFixture::~BeforeStreamingFixture() {
-  voe_file_->StopPlayingFileAsMicrophone(channel_);
-  PausePlaying();
-
-  EXPECT_EQ(0, voe_network_->DeRegisterExternalTransport(channel_));
-  voe_base_->DeleteChannel(channel_);
-  delete transport_;
-}
-
-void BeforeStreamingFixture::SwitchToManualMicrophone() {
-  EXPECT_EQ(0, voe_file_->StopPlayingFileAsMicrophone(channel_));
-
-  TEST_LOG("You need to speak manually into the microphone for this test.\n");
-  TEST_LOG("Please start speaking now.\n");
-  Sleep(1000);
-}
-
-void BeforeStreamingFixture::RestartFakeMicrophone() {
-  EXPECT_EQ(0, voe_file_->StartPlayingFileAsMicrophone(
-        channel_, fake_microphone_input_file_.c_str(), true, true));
-}
-
-void BeforeStreamingFixture::PausePlaying() {
-  EXPECT_EQ(0, voe_base_->StopSend(channel_));
-  EXPECT_EQ(0, voe_base_->StopPlayout(channel_));
-}
-
-void BeforeStreamingFixture::ResumePlaying() {
-  EXPECT_EQ(0, voe_base_->StartPlayout(channel_));
-  EXPECT_EQ(0, voe_base_->StartSend(channel_));
-}
-
-void BeforeStreamingFixture::WaitForTransmittedPackets(int32_t packet_count) {
-  transport_->WaitForTransmittedPackets(packet_count);
-}
-
-void BeforeStreamingFixture::SetUpLocalPlayback() {
-  transport_ = new LoopBackTransport(voe_network_, channel_);
-  EXPECT_EQ(0, voe_network_->RegisterExternalTransport(channel_, *transport_));
-
-  webrtc::CodecInst codec;
-  codec.channels = 1;
-  codec.pacsize = 160;
-  codec.plfreq = 8000;
-  codec.pltype = 0;
-  codec.rate = 64000;
-#if defined(_MSC_VER) && defined(_WIN32)
-  _snprintf(codec.plname, RTP_PAYLOAD_NAME_SIZE - 1, "PCMU");
-#else
-  snprintf(codec.plname, RTP_PAYLOAD_NAME_SIZE, "PCMU");
-#endif
-  voe_codec_->SetSendCodec(channel_, codec);
-}
diff --git a/voice_engine/test/auto_test/fixtures/before_streaming_fixture.h b/voice_engine/test/auto_test/fixtures/before_streaming_fixture.h
deleted file mode 100644
index 0ff4a06..0000000
--- a/voice_engine/test/auto_test/fixtures/before_streaming_fixture.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- *  Copyright (c) 2014 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 SRC_VOICE_ENGINE_MAIN_TEST_AUTO_TEST_STANDARD_BEFORE_STREAMING_H_
-#define SRC_VOICE_ENGINE_MAIN_TEST_AUTO_TEST_STANDARD_BEFORE_STREAMING_H_
-
-#include <string>
-#include "webrtc/voice_engine/test/auto_test/fixtures/after_initialization_fixture.h"
-
-// This fixture will, in addition to the work done by its superclasses,
-// create a channel and prepare playing a file through the fake microphone
-// to simulate microphone input. The purpose is to make it convenient
-// to write tests that require microphone input.
-class BeforeStreamingFixture : public AfterInitializationFixture {
- public:
-  BeforeStreamingFixture();
-  virtual ~BeforeStreamingFixture();
-
- protected:
-  int             channel_;
-  std::string     fake_microphone_input_file_;
-
-  // Shuts off the fake microphone for this test.
-  void SwitchToManualMicrophone();
-
-  // Restarts the fake microphone if it's been shut off earlier.
-  void RestartFakeMicrophone();
-
-  // Stops all sending and playout.
-  void PausePlaying();
-
-  // Resumes all sending and playout.
-  void ResumePlaying();
-
-  // Waits until packet_count packetes have been processed by recipient.
-  void WaitForTransmittedPackets(int32_t packet_count);
-
- private:
-  void SetUpLocalPlayback();
-
-  LoopBackTransport* transport_;
-};
-
-
-#endif  // SRC_VOICE_ENGINE_MAIN_TEST_AUTO_TEST_STANDARD_BEFORE_STREAMING_H_
diff --git a/voice_engine/test/auto_test/standard/codec_before_streaming_test.cc b/voice_engine/test/auto_test/standard/codec_before_streaming_test.cc
deleted file mode 100644
index 961824b..0000000
--- a/voice_engine/test/auto_test/standard/codec_before_streaming_test.cc
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- *  Copyright (c) 2011 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/voice_engine/channel_proxy.h"
-#include "webrtc/voice_engine/test/auto_test/fixtures/after_initialization_fixture.h"
-#include "webrtc/voice_engine/voice_engine_impl.h"
-
-class CodecBeforeStreamingTest : public AfterInitializationFixture {
- protected:
-  void SetUp() {
-    memset(&codec_instance_, 0, sizeof(codec_instance_));
-    codec_instance_.channels = 1;
-    codec_instance_.plfreq = 16000;
-    codec_instance_.pacsize = 480;
-
-    channel_ = voe_base_->CreateChannel();
-    static_cast<webrtc::VoiceEngineImpl*>(voice_engine_)
-        ->GetChannelProxy(channel_)
-        ->RegisterLegacyReceiveCodecs();
-  }
-
-  void TearDown() {
-    voe_base_->DeleteChannel(channel_);
-  }
-
-  webrtc::CodecInst codec_instance_;
-  int channel_;
-};
-
-// TODO(phoglund): add test which verifies default pltypes for various codecs.
-
-TEST_F(CodecBeforeStreamingTest, GetRecPayloadTypeFailsForInvalidCodecName) {
-  strcpy(codec_instance_.plname, "SomeInvalidCodecName");
-
-  // Should fail since the codec name is invalid.
-  EXPECT_NE(0, voe_codec_->GetRecPayloadType(channel_, codec_instance_));
-}
-
-TEST_F(CodecBeforeStreamingTest, GetRecPayloadTypeRecognizesISAC) {
-  strcpy(codec_instance_.plname, "iSAC");
-  EXPECT_EQ(0, voe_codec_->GetRecPayloadType(channel_, codec_instance_));
-  strcpy(codec_instance_.plname, "ISAC");
-  EXPECT_EQ(0, voe_codec_->GetRecPayloadType(channel_, codec_instance_));
-}
-
-TEST_F(CodecBeforeStreamingTest, SetRecPayloadTypeCanChangeISACPayloadType) {
-  strcpy(codec_instance_.plname, "ISAC");
-  codec_instance_.rate = 32000;
-
-  codec_instance_.pltype = 123;
-  EXPECT_EQ(0, voe_codec_->SetRecPayloadType(channel_, codec_instance_));
-  EXPECT_EQ(0, voe_codec_->GetRecPayloadType(channel_, codec_instance_));
-  EXPECT_EQ(123, codec_instance_.pltype);
-
-  codec_instance_.pltype = 104;
-  EXPECT_EQ(0, voe_codec_->SetRecPayloadType(channel_, codec_instance_));
-  EXPECT_EQ(0, voe_codec_->GetRecPayloadType(channel_, codec_instance_));
-
-  EXPECT_EQ(104, codec_instance_.pltype);
-}
-
-TEST_F(CodecBeforeStreamingTest, SetRecPayloadTypeCanChangeILBCPayloadType) {
-  strcpy(codec_instance_.plname, "iLBC");
-  codec_instance_.plfreq = 8000;
-  codec_instance_.pacsize = 240;
-  codec_instance_.rate = 13300;
-
-  EXPECT_EQ(0, voe_codec_->GetRecPayloadType(channel_, codec_instance_));
-  int original_pltype = codec_instance_.pltype;
-  codec_instance_.pltype = 123;
-  EXPECT_EQ(0, voe_codec_->SetRecPayloadType(channel_, codec_instance_));
-  EXPECT_EQ(0, voe_codec_->GetRecPayloadType(channel_, codec_instance_));
-
-  EXPECT_EQ(123, codec_instance_.pltype);
-
-  codec_instance_.pltype = original_pltype;
-  EXPECT_EQ(0, voe_codec_->SetRecPayloadType(channel_, codec_instance_));
-  EXPECT_EQ(0, voe_codec_->GetRecPayloadType(channel_, codec_instance_));
-
-  EXPECT_EQ(original_pltype, codec_instance_.pltype);
-}
diff --git a/voice_engine/test/auto_test/standard/codec_test.cc b/voice_engine/test/auto_test/standard/codec_test.cc
deleted file mode 100644
index 27c3b0e..0000000
--- a/voice_engine/test/auto_test/standard/codec_test.cc
+++ /dev/null
@@ -1,216 +0,0 @@
-/*
- *  Copyright (c) 2011 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 <stdio.h>
-#include <string>
-
-#include "webrtc/test/testsupport/fileutils.h"
-#include "webrtc/voice_engine/test/auto_test/fixtures/after_streaming_fixture.h"
-#include "webrtc/voice_engine/voice_engine_defines.h"
-
-class CodecTest : public AfterStreamingFixture {
- protected:
-  void SetUp() {
-    memset(&codec_instance_, 0, sizeof(codec_instance_));
-    apm_ = webrtc::AudioProcessing::Create();
-    voe_base_->Init(nullptr, apm_.get(), nullptr);
-  }
-
-  void SetArbitrarySendCodec() {
-    // Just grab the first codec.
-    EXPECT_EQ(0, voe_codec_->GetCodec(0, codec_instance_));
-    EXPECT_EQ(0, voe_codec_->SetSendCodec(channel_, codec_instance_));
-  }
-
-  rtc::scoped_refptr<webrtc::AudioProcessing> apm_;
-  webrtc::CodecInst codec_instance_;
-};
-
-static void SetRateIfILBC(webrtc::CodecInst* codec_instance, int packet_size) {
-  if (!STR_CASE_CMP(codec_instance->plname, "ilbc")) {
-    if (packet_size == 160 || packet_size == 320) {
-      codec_instance->rate = 15200;
-    } else {
-      codec_instance->rate = 13300;
-    }
-  }
-}
-
-static bool IsNotViableSendCodec(const char* codec_name) {
-  return !STR_CASE_CMP(codec_name, "CN") ||
-         !STR_CASE_CMP(codec_name, "telephone-event") ||
-         !STR_CASE_CMP(codec_name, "red");
-}
-
-TEST_F(CodecTest, PcmuIsDefaultCodecAndHasTheRightValues) {
-  EXPECT_EQ(0, voe_codec_->GetSendCodec(channel_, codec_instance_));
-  EXPECT_EQ(1u, codec_instance_.channels);
-  EXPECT_EQ(160, codec_instance_.pacsize);
-  EXPECT_EQ(8000, codec_instance_.plfreq);
-  EXPECT_EQ(0, codec_instance_.pltype);
-  EXPECT_EQ(64000, codec_instance_.rate);
-  EXPECT_STRCASEEQ("PCMU", codec_instance_.plname);
-}
-
-TEST_F(CodecTest, VoiceActivityDetectionIsOffByDefault) {
-  bool vad_enabled = false;
-  bool dtx_disabled = false;
-  webrtc::VadModes vad_mode = webrtc::kVadAggressiveMid;
-
-  voe_codec_->GetVADStatus(channel_, vad_enabled, vad_mode, dtx_disabled);
-
-  EXPECT_FALSE(vad_enabled);
-  EXPECT_TRUE(dtx_disabled);
-  EXPECT_EQ(webrtc::kVadConventional, vad_mode);
-}
-
-TEST_F(CodecTest, VoiceActivityDetectionCanBeEnabled) {
-  EXPECT_EQ(0, voe_codec_->SetVADStatus(channel_, true));
-
-  bool vad_enabled = false;
-  bool dtx_disabled = false;
-  webrtc::VadModes vad_mode = webrtc::kVadAggressiveMid;
-
-  voe_codec_->GetVADStatus(channel_, vad_enabled, vad_mode, dtx_disabled);
-
-  EXPECT_TRUE(vad_enabled);
-  EXPECT_EQ(webrtc::kVadConventional, vad_mode);
-  EXPECT_FALSE(dtx_disabled);
-}
-
-TEST_F(CodecTest, VoiceActivityDetectionTypeSettingsCanBeChanged) {
-  bool vad_enabled = false;
-  bool dtx_disabled = false;
-  webrtc::VadModes vad_mode = webrtc::kVadAggressiveMid;
-
-  EXPECT_EQ(0, voe_codec_->SetVADStatus(
-      channel_, true, webrtc::kVadAggressiveLow, false));
-  EXPECT_EQ(0, voe_codec_->GetVADStatus(
-      channel_, vad_enabled, vad_mode, dtx_disabled));
-  EXPECT_EQ(vad_mode, webrtc::kVadAggressiveLow);
-  EXPECT_FALSE(dtx_disabled);
-
-  EXPECT_EQ(0, voe_codec_->SetVADStatus(
-      channel_, true, webrtc::kVadAggressiveMid, false));
-  EXPECT_EQ(0, voe_codec_->GetVADStatus(
-      channel_, vad_enabled, vad_mode, dtx_disabled));
-  EXPECT_EQ(vad_mode, webrtc::kVadAggressiveMid);
-  EXPECT_FALSE(dtx_disabled);
-
-  // The fourth argument is the DTX disable flag, which is always supposed to
-  // be false.
-  EXPECT_EQ(0, voe_codec_->SetVADStatus(channel_, true,
-                                        webrtc::kVadAggressiveHigh, false));
-  EXPECT_EQ(0, voe_codec_->GetVADStatus(
-      channel_, vad_enabled, vad_mode, dtx_disabled));
-  EXPECT_EQ(vad_mode, webrtc::kVadAggressiveHigh);
-  EXPECT_FALSE(dtx_disabled);
-
-  EXPECT_EQ(0, voe_codec_->SetVADStatus(channel_, true,
-                                        webrtc::kVadConventional, false));
-  EXPECT_EQ(0, voe_codec_->GetVADStatus(
-      channel_, vad_enabled, vad_mode, dtx_disabled));
-  EXPECT_EQ(vad_mode, webrtc::kVadConventional);
-}
-
-TEST_F(CodecTest, VoiceActivityDetectionCanBeTurnedOff) {
-  EXPECT_EQ(0, voe_codec_->SetVADStatus(channel_, true));
-
-  // VAD is always on when DTX is on, so we need to turn off DTX too.
-  EXPECT_EQ(0, voe_codec_->SetVADStatus(
-      channel_, false, webrtc::kVadConventional, true));
-
-  bool vad_enabled = false;
-  bool dtx_disabled = false;
-  webrtc::VadModes vad_mode = webrtc::kVadAggressiveMid;
-
-  voe_codec_->GetVADStatus(channel_, vad_enabled, vad_mode, dtx_disabled);
-
-  EXPECT_FALSE(vad_enabled);
-  EXPECT_TRUE(dtx_disabled);
-  EXPECT_EQ(webrtc::kVadConventional, vad_mode);
-}
-
-TEST_F(CodecTest, OpusMaxPlaybackRateCanBeSet) {
-  for (int i = 0; i < voe_codec_->NumOfCodecs(); ++i) {
-    voe_codec_->GetCodec(i, codec_instance_);
-    if (STR_CASE_CMP("opus", codec_instance_.plname)) {
-      continue;
-    }
-    voe_codec_->SetSendCodec(channel_, codec_instance_);
-    // SetOpusMaxPlaybackRate can handle any integer as the bandwidth. Following
-    // tests some most commonly used numbers.
-    EXPECT_EQ(0, voe_codec_->SetOpusMaxPlaybackRate(channel_, 48000));
-    EXPECT_EQ(0, voe_codec_->SetOpusMaxPlaybackRate(channel_, 32000));
-    EXPECT_EQ(0, voe_codec_->SetOpusMaxPlaybackRate(channel_, 16000));
-    EXPECT_EQ(0, voe_codec_->SetOpusMaxPlaybackRate(channel_, 8000));
-  }
-}
-
-TEST_F(CodecTest, OpusDtxCanBeSetForOpus) {
-  for (int i = 0; i < voe_codec_->NumOfCodecs(); ++i) {
-    voe_codec_->GetCodec(i, codec_instance_);
-    if (STR_CASE_CMP("opus", codec_instance_.plname)) {
-      continue;
-    }
-    voe_codec_->SetSendCodec(channel_, codec_instance_);
-    EXPECT_EQ(0, voe_codec_->SetOpusDtx(channel_, false));
-    EXPECT_EQ(0, voe_codec_->SetOpusDtx(channel_, true));
-  }
-}
-
-TEST_F(CodecTest, OpusDtxCannotBeSetForNonOpus) {
-  for (int i = 0; i < voe_codec_->NumOfCodecs(); ++i) {
-    voe_codec_->GetCodec(i, codec_instance_);
-    if (!STR_CASE_CMP("opus", codec_instance_.plname)) {
-      continue;
-    }
-    voe_codec_->SetSendCodec(channel_, codec_instance_);
-    EXPECT_EQ(-1, voe_codec_->SetOpusDtx(channel_, true));
-  }
-}
-
-// TODO(xians, phoglund): Re-enable when issue 372 is resolved.
-TEST_F(CodecTest, DISABLED_ManualVerifySendCodecsForAllPacketSizes) {
-  for (int i = 0; i < voe_codec_->NumOfCodecs(); ++i) {
-    voe_codec_->GetCodec(i, codec_instance_);
-    if (IsNotViableSendCodec(codec_instance_.plname)) {
-      TEST_LOG("Skipping %s.\n", codec_instance_.plname);
-      continue;
-    }
-    EXPECT_NE(-1, codec_instance_.pltype) <<
-        "The codec database should suggest a payload type.";
-
-    // Test with default packet size:
-    TEST_LOG("%s (pt=%d): default packet size(%d), accepts sizes ",
-             codec_instance_.plname, codec_instance_.pltype,
-             codec_instance_.pacsize);
-    voe_codec_->SetSendCodec(channel_, codec_instance_);
-    Sleep(CODEC_TEST_TIME);
-
-    // Now test other reasonable packet sizes:
-    bool at_least_one_succeeded = false;
-    for (int packet_size = 80; packet_size < 1000; packet_size += 80) {
-      SetRateIfILBC(&codec_instance_, packet_size);
-      codec_instance_.pacsize = packet_size;
-
-      if (voe_codec_->SetSendCodec(channel_, codec_instance_) != -1) {
-        // Note that it's fine for SetSendCodec to fail - what packet sizes
-        // it accepts depends on the codec. It should accept one at minimum.
-        TEST_LOG("%d ", packet_size);
-        TEST_LOG_FLUSH;
-        at_least_one_succeeded = true;
-        Sleep(CODEC_TEST_TIME);
-      }
-    }
-    TEST_LOG("\n");
-    EXPECT_TRUE(at_least_one_succeeded);
-  }
-}
diff --git a/voice_engine/test/auto_test/standard/dtmf_test.cc b/voice_engine/test/auto_test/standard/dtmf_test.cc
deleted file mode 100644
index 2e6c733..0000000
--- a/voice_engine/test/auto_test/standard/dtmf_test.cc
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- *  Copyright (c) 2011 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/voice_engine/test/auto_test/fixtures/after_streaming_fixture.h"
-#include "webrtc/voice_engine/voice_engine_defines.h"
-
-class DtmfTest : public AfterStreamingFixture {
- protected:
-  void RunSixteenDtmfEvents() {
-    TEST_LOG("Sending telephone events:\n");
-    for (int i = 0; i < 16; i++) {
-      TEST_LOG("%d ", i);
-      TEST_LOG_FLUSH;
-      EXPECT_TRUE(channel_proxy_->SendTelephoneEventOutband(i, 160));
-      Sleep(500);
-    }
-    TEST_LOG("\n");
-  }
-};
-
-TEST_F(DtmfTest, ManualSuccessfullySendsOutOfBandTelephoneEvents) {
-  RunSixteenDtmfEvents();
-}
-
-TEST_F(DtmfTest, TestTwoNonDtmfEvents) {
-  EXPECT_TRUE(channel_proxy_->SendTelephoneEventOutband(32, 160));
-  EXPECT_TRUE(channel_proxy_->SendTelephoneEventOutband(110, 160));
-}
-
-// This test modifies the DTMF payload type from the default 106 to 88
-// and then runs through 16 DTMF out.of-band events.
-TEST_F(DtmfTest, ManualCanChangeDtmfPayloadType) {
-  webrtc::CodecInst codec_instance = webrtc::CodecInst();
-
-  TEST_LOG("Changing DTMF payload type.\n");
-
-  // Start by modifying the receiving side.
-  for (int i = 0; i < voe_codec_->NumOfCodecs(); i++) {
-    EXPECT_EQ(0, voe_codec_->GetCodec(i, codec_instance));
-    if (!STR_CASE_CMP("telephone-event", codec_instance.plname)) {
-      codec_instance.pltype = 88;  // Use 88 instead of default 106.
-      EXPECT_EQ(0, voe_base_->StopSend(channel_));
-      EXPECT_EQ(0, voe_base_->StopPlayout(channel_));
-      EXPECT_EQ(0, voe_codec_->SetRecPayloadType(channel_, codec_instance));
-      EXPECT_EQ(0, voe_base_->StartPlayout(channel_));
-      EXPECT_EQ(0, voe_base_->StartSend(channel_));
-      break;
-    }
-  }
-
-  Sleep(500);
-
-  // Next, we must modify the sending side as well.
-  EXPECT_TRUE(
-      channel_proxy_->SetSendTelephoneEventPayloadType(codec_instance.pltype,
-                                                       codec_instance.plfreq));
-
-  RunSixteenDtmfEvents();
-}
diff --git a/voice_engine/test/auto_test/standard/rtp_rtcp_before_streaming_test.cc b/voice_engine/test/auto_test/standard/rtp_rtcp_before_streaming_test.cc
deleted file mode 100644
index b0d9112..0000000
--- a/voice_engine/test/auto_test/standard/rtp_rtcp_before_streaming_test.cc
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- *  Copyright (c) 2012 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/voice_engine/test/auto_test/fixtures/after_initialization_fixture.h"
-
-using namespace webrtc;
-using namespace testing;
-
-class RtpRtcpBeforeStreamingTest : public AfterInitializationFixture {
- protected:
-  void SetUp();
-  void TearDown();
-
-  int channel_;
-};
-
-void RtpRtcpBeforeStreamingTest::SetUp() {
-  EXPECT_THAT(channel_ = voe_base_->CreateChannel(), Not(Lt(0)));
-}
-
-void RtpRtcpBeforeStreamingTest::TearDown() {
-  EXPECT_EQ(0, voe_base_->DeleteChannel(channel_));
-}
-
-TEST_F(RtpRtcpBeforeStreamingTest,
-       GetRtcpStatusReturnsTrueByDefaultAndObeysSetRtcpStatus) {
-  bool on = false;
-  EXPECT_EQ(0, voe_rtp_rtcp_->GetRTCPStatus(channel_, on));
-  EXPECT_TRUE(on);
-  EXPECT_EQ(0, voe_rtp_rtcp_->SetRTCPStatus(channel_, false));
-  EXPECT_EQ(0, voe_rtp_rtcp_->GetRTCPStatus(channel_, on));
-  EXPECT_FALSE(on);
-  EXPECT_EQ(0, voe_rtp_rtcp_->SetRTCPStatus(channel_, true));
-  EXPECT_EQ(0, voe_rtp_rtcp_->GetRTCPStatus(channel_, on));
-  EXPECT_TRUE(on);
-}
-
-TEST_F(RtpRtcpBeforeStreamingTest, GetLocalSsrcObeysSetLocalSsrc) {
-  EXPECT_EQ(0, voe_rtp_rtcp_->SetLocalSSRC(channel_, 1234));
-  unsigned int result = 0;
-  EXPECT_EQ(0, voe_rtp_rtcp_->GetLocalSSRC(channel_, result));
-  EXPECT_EQ(1234u, result);
-}
diff --git a/voice_engine/test/auto_test/standard/rtp_rtcp_extensions.cc b/voice_engine/test/auto_test/standard/rtp_rtcp_extensions.cc
deleted file mode 100644
index 7b343cb..0000000
--- a/voice_engine/test/auto_test/standard/rtp_rtcp_extensions.cc
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- *  Copyright (c) 2014 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 <memory>
-
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/modules/rtp_rtcp/include/rtp_header_parser.h"
-#include "webrtc/system_wrappers/include/atomic32.h"
-#include "webrtc/system_wrappers/include/sleep.h"
-#include "webrtc/voice_engine/test/auto_test/fixtures/before_streaming_fixture.h"
-
-using ::testing::_;
-using ::testing::AtLeast;
-using ::testing::Eq;
-using ::testing::Field;
-
-class ExtensionVerifyTransport : public webrtc::Transport {
- public:
-  ExtensionVerifyTransport()
-      : parser_(webrtc::RtpHeaderParser::Create()),
-        received_packets_(0),
-        bad_packets_(0),
-        audio_level_id_(-1),
-        absolute_sender_time_id_(-1) {}
-
-  bool SendRtp(const uint8_t* data,
-               size_t len,
-               const webrtc::PacketOptions& options) override {
-    webrtc::RTPHeader header;
-    if (parser_->Parse(reinterpret_cast<const uint8_t*>(data), len, &header)) {
-      bool ok = true;
-      if (audio_level_id_ >= 0 &&
-          !header.extension.hasAudioLevel) {
-        ok = false;
-      }
-      if (absolute_sender_time_id_ >= 0 &&
-          !header.extension.hasAbsoluteSendTime) {
-        ok = false;
-      }
-      if (!ok) {
-        // bad_packets_ count packets we expected to have an extension but
-        // didn't have one.
-        ++bad_packets_;
-      }
-    }
-    // received_packets_ count all packets we receive.
-    ++received_packets_;
-    return true;
-  }
-
-  bool SendRtcp(const uint8_t* data, size_t len) override {
-    return true;
-  }
-
-  void SetAudioLevelId(int id) {
-    audio_level_id_ = id;
-    parser_->RegisterRtpHeaderExtension(webrtc::kRtpExtensionAudioLevel, id);
-  }
-
-  void SetAbsoluteSenderTimeId(int id) {
-    absolute_sender_time_id_ = id;
-    parser_->RegisterRtpHeaderExtension(webrtc::kRtpExtensionAbsoluteSendTime,
-                                        id);
-  }
-
-  bool Wait() {
-    // Wait until we've received to specified number of packets.
-    while (received_packets_.Value() < kPacketsExpected) {
-      webrtc::SleepMs(kSleepIntervalMs);
-    }
-    // Check whether any were 'bad' (didn't contain an extension when they
-    // where supposed to).
-    return bad_packets_.Value() == 0;
-  }
-
- private:
-  enum {
-    kPacketsExpected = 10,
-    kSleepIntervalMs = 10
-  };
-  std::unique_ptr<webrtc::RtpHeaderParser> parser_;
-  webrtc::Atomic32 received_packets_;
-  webrtc::Atomic32 bad_packets_;
-  int audio_level_id_;
-  int absolute_sender_time_id_;
-};
-
-class SendRtpRtcpHeaderExtensionsTest : public BeforeStreamingFixture {
- protected:
-  void SetUp() override {
-    EXPECT_EQ(0, voe_network_->DeRegisterExternalTransport(channel_));
-    EXPECT_EQ(0, voe_network_->RegisterExternalTransport(channel_,
-                                                         verifying_transport_));
-  }
-  void TearDown() override { PausePlaying(); }
-
-  ExtensionVerifyTransport verifying_transport_;
-};
-
-TEST_F(SendRtpRtcpHeaderExtensionsTest, SentPacketsIncludeNoAudioLevel) {
-  verifying_transport_.SetAudioLevelId(0);
-  ResumePlaying();
-  EXPECT_FALSE(verifying_transport_.Wait());
-}
-
-TEST_F(SendRtpRtcpHeaderExtensionsTest, SentPacketsIncludeAudioLevel) {
-  EXPECT_EQ(0, voe_rtp_rtcp_->SetSendAudioLevelIndicationStatus(channel_, true,
-                                                                9));
-  verifying_transport_.SetAudioLevelId(9);
-  ResumePlaying();
-  EXPECT_TRUE(verifying_transport_.Wait());
-}
-
diff --git a/voice_engine/test/auto_test/standard/rtp_rtcp_test.cc b/voice_engine/test/auto_test/standard/rtp_rtcp_test.cc
deleted file mode 100644
index 24bb0a7..0000000
--- a/voice_engine/test/auto_test/standard/rtp_rtcp_test.cc
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- *  Copyright (c) 2012 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 <memory>
-
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/rtc_base/flags.h"
-#include "webrtc/system_wrappers/include/event_wrapper.h"
-#include "webrtc/test/testsupport/fileutils.h"
-#include "webrtc/voice_engine/test/auto_test/fixtures/after_streaming_fixture.h"
-#include "webrtc/voice_engine/test/auto_test/voe_standard_test.h"
-
-DECLARE_bool(include_timing_dependent_tests);
-
-class TestRtpObserver : public webrtc::VoERTPObserver {
- public:
-  TestRtpObserver() : changed_ssrc_event_(webrtc::EventWrapper::Create()) {}
-  virtual ~TestRtpObserver() {}
-  virtual void OnIncomingCSRCChanged(int channel,
-                                     unsigned int CSRC,
-                                     bool added) {}
-  virtual void OnIncomingSSRCChanged(int channel,
-                                     unsigned int SSRC);
-  void WaitForChangedSsrc() {
-    // 10 seconds should be enough.
-    EXPECT_EQ(webrtc::kEventSignaled, changed_ssrc_event_->Wait(10*1000));
-  }
-  void SetIncomingSsrc(unsigned int ssrc) {
-    rtc::CritScope lock(&crit_);
-    incoming_ssrc_ = ssrc;
-  }
- public:
-  rtc::CriticalSection crit_;
-  unsigned int incoming_ssrc_;
-  std::unique_ptr<webrtc::EventWrapper> changed_ssrc_event_;
-};
-
-void TestRtpObserver::OnIncomingSSRCChanged(int channel,
-                                            unsigned int SSRC) {
-  char msg[128];
-  sprintf(msg, "\n=> OnIncomingSSRCChanged(channel=%d, SSRC=%u)\n", channel,
-          SSRC);
-  TEST_LOG("%s", msg);
-
-  {
-    rtc::CritScope lock(&crit_);
-    if (incoming_ssrc_ == SSRC)
-      changed_ssrc_event_->Set();
-  }
-}
-
-static const char* const RTCP_CNAME = "Whatever";
-
-class RtpRtcpTest : public AfterStreamingFixture {
- protected:
-  void SetUp() {
-    // We need a second channel for this test, so set it up.
-    second_channel_ = voe_base_->CreateChannel();
-    EXPECT_GE(second_channel_, 0);
-
-    transport_ = new LoopBackTransport(voe_network_, second_channel_);
-    EXPECT_EQ(0, voe_network_->RegisterExternalTransport(second_channel_,
-                                                         *transport_));
-
-    EXPECT_EQ(0, voe_base_->StartPlayout(second_channel_));
-    EXPECT_EQ(0, voe_rtp_rtcp_->SetLocalSSRC(second_channel_, 5678));
-    EXPECT_EQ(0, voe_base_->StartSend(second_channel_));
-
-    // We'll set up the RTCP CNAME and SSRC to something arbitrary here.
-    voe_rtp_rtcp_->SetRTCP_CNAME(channel_, RTCP_CNAME);
-  }
-
-  void TearDown() {
-    EXPECT_EQ(0, voe_network_->DeRegisterExternalTransport(second_channel_));
-    voe_base_->DeleteChannel(second_channel_);
-    delete transport_;
-  }
-
-  int second_channel_;
-  LoopBackTransport* transport_;
-};
-
-TEST_F(RtpRtcpTest, RemoteRtcpCnameHasPropagatedToRemoteSide) {
-  if (!FLAG_include_timing_dependent_tests) {
-    TEST_LOG("Skipping test - running in slow execution environment...\n");
-    return;
-  }
-
-  // We need to sleep a bit here for the name to propagate. For
-  // instance, 200 milliseconds is not enough, 1 second still flaky,
-  // so we'll go with five seconds here.
-  Sleep(5000);
-
-  char char_buffer[256];
-  voe_rtp_rtcp_->GetRemoteRTCP_CNAME(channel_, char_buffer);
-  EXPECT_STREQ(RTCP_CNAME, char_buffer);
-}
-
-TEST_F(RtpRtcpTest, SSRCPropagatesCorrectly) {
-  unsigned int local_ssrc = 1234;
-  EXPECT_EQ(0, voe_base_->StopSend(channel_));
-  EXPECT_EQ(0, voe_rtp_rtcp_->SetLocalSSRC(channel_, local_ssrc));
-  EXPECT_EQ(0, voe_base_->StartSend(channel_));
-
-  Sleep(1000);
-
-  unsigned int ssrc;
-  EXPECT_EQ(0, voe_rtp_rtcp_->GetLocalSSRC(channel_, ssrc));
-  EXPECT_EQ(local_ssrc, ssrc);
-
-  EXPECT_EQ(0, voe_rtp_rtcp_->GetRemoteSSRC(channel_, ssrc));
-  EXPECT_EQ(local_ssrc, ssrc);
-}
diff --git a/voice_engine/test/auto_test/voe_standard_test.cc b/voice_engine/test/auto_test/voe_standard_test.cc
deleted file mode 100644
index 545be71..0000000
--- a/voice_engine/test/auto_test/voe_standard_test.cc
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- *  Copyright (c) 2012 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/voice_engine/test/auto_test/voe_standard_test.h"
-
-#include <assert.h>
-#include <stdio.h>
-#include <string.h>
-
-#include "webrtc/rtc_base/flags.h"
-#include "webrtc/system_wrappers/include/event_wrapper.h"
-#include "webrtc/typedefs.h"
-#include "webrtc/voice_engine/test/auto_test/automated_mode.h"
-#include "webrtc/voice_engine/test/auto_test/voe_test_defines.h"
-#include "webrtc/voice_engine/voice_engine_defines.h"
-
-DEFINE_bool(include_timing_dependent_tests, true,
-            "If true, we will include tests / parts of tests that are known "
-            "to break in slow execution environments (such as valgrind).");
-DEFINE_bool(automated, false,
-            "If true, we'll run the automated tests we have in noninteractive "
-            "mode.");
-DEFINE_bool(help, false, "Print this message.");
-
-namespace webrtc {
-namespace voetest {
-
-int dummy = 0;  // Dummy used in different functions to avoid warnings
-
-void SubAPIManager::DisplayStatus() const {
-  TEST_LOG("Supported sub APIs:\n\n");
-  if (_base)
-    TEST_LOG("  Base\n");
-  if (_codec)
-    TEST_LOG("  Codec\n");
-  if (_file)
-    TEST_LOG("  File\n");
-  if (_hardware)
-    TEST_LOG("  Hardware\n");
-  if (_network)
-    TEST_LOG("  Network\n");
-  if (_rtp_rtcp)
-    TEST_LOG("  RTP_RTCP\n");
-  if (_apm)
-    TEST_LOG("  AudioProcessing\n");
-  ANL();
-  TEST_LOG("Excluded sub APIs:\n\n");
-  if (!_base)
-    TEST_LOG("  Base\n");
-  if (!_codec)
-    TEST_LOG("  Codec\n");
-  if (!_file)
-    TEST_LOG("  File\n");
-  if (!_hardware)
-    TEST_LOG("  Hardware\n");
-  if (!_network)
-    TEST_LOG("  Network\n");
-  if (!_rtp_rtcp)
-    TEST_LOG("  RTP_RTCP\n");
-  if (!_apm)
-    TEST_LOG("  AudioProcessing\n");
-  ANL();
-}
-
-int RunInManualMode() {
-  SubAPIManager api_manager;
-  api_manager.DisplayStatus();
-
-  printf("----------------------------\n");
-  printf("Select type of test\n\n");
-  printf(" (0)  Quit\n");
-  printf(" (1)  Standard test\n");
-  printf("\n: ");
-
-  int selection(0);
-  dummy = scanf("%d", &selection);
-
-  switch (selection) {
-    case 0:
-      return 0;
-    case 1:
-      TEST_LOG("\n\n+++ Running standard tests +++\n\n");
-      // Currently, all googletest-rewritten tests are in the "automated" suite.
-      return RunInAutomatedMode();
-    default:
-      TEST_LOG("Invalid selection!\n");
-      return 0;
-  }
-}
-
-}  // namespace voetest
-}  // namespace webrtc
-
-#if !defined(WEBRTC_IOS)
-int main(int argc, char** argv) {
-  // This function and RunInAutomatedMode is defined in automated_mode.cc
-  // to avoid macro clashes with googletest (for instance ASSERT_TRUE).
-  webrtc::voetest::InitializeGoogleTest(&argc, argv);
-  if (rtc::FlagList::SetFlagsFromCommandLine(&argc, argv, true)) {
-    return 1;
-  }
-  if (FLAG_help) {
-    rtc::FlagList::Print(nullptr, false);
-    return 0;
-  }
-
-  if (FLAG_automated) {
-    return webrtc::voetest::RunInAutomatedMode();
-  }
-
-  return webrtc::voetest::RunInManualMode();
-}
-#endif //#if !defined(WEBRTC_IOS)
diff --git a/voice_engine/test/auto_test/voe_standard_test.h b/voice_engine/test/auto_test/voe_standard_test.h
deleted file mode 100644
index 9eaed1c..0000000
--- a/voice_engine/test/auto_test/voe_standard_test.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- *  Copyright (c) 2012 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_VOICE_ENGINE_VOE_STANDARD_TEST_H
-#define WEBRTC_VOICE_ENGINE_VOE_STANDARD_TEST_H
-
-#include <stdio.h>
-#include <string>
-
-#include "webrtc/test/testsupport/fileutils.h"
-#include "webrtc/voice_engine/test/auto_test/voe_test_common.h"
-
-namespace webrtc {
-namespace voetest {
-
-class SubAPIManager {
- public:
-  SubAPIManager()
-    : _base(true),
-      _codec(false),
-      _file(false),
-      _hardware(false),
-      _network(false),
-      _rtp_rtcp(false),
-      _apm(false) {
-      _codec = true;
-      _file = true;
-      _hardware = true;
-      _network = true;
-      _rtp_rtcp = true;
-      _apm = true;
-  }
-
-  void DisplayStatus() const;
-
- private:
-  bool _base, _codec;
-  bool _file, _hardware;
-  bool _network, _rtp_rtcp, _apm;
-};
-
-}  // namespace voetest
-}  // namespace webrtc
-
-#endif // WEBRTC_VOICE_ENGINE_VOE_STANDARD_TEST_H
diff --git a/voice_engine/test/auto_test/voe_test_common.h b/voice_engine/test/auto_test/voe_test_common.h
deleted file mode 100644
index 67478ff..0000000
--- a/voice_engine/test/auto_test/voe_test_common.h
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- *  Copyright (c) 2012 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_VOICE_ENGINE_VOE_TEST_COMMON_H_
-#define WEBRTC_VOICE_ENGINE_VOE_TEST_COMMON_H_
-
-#ifdef WEBRTC_ANDROID
-#include <android/log.h>
-#define ANDROID_LOG_TAG "VoiceEngine Auto Test"
-#define TEST_LOG(...) \
-    __android_log_print(ANDROID_LOG_DEBUG, ANDROID_LOG_TAG, __VA_ARGS__)
-#define TEST_LOG_ERROR(...) \
-    __android_log_print(ANDROID_LOG_ERROR, ANDROID_LOG_TAG, __VA_ARGS__)
-#define TEST_LOG_FLUSH
-#else
-#define TEST_LOG printf
-#define TEST_LOG_ERROR printf
-#define TEST_LOG_FLUSH fflush(NULL)
-#endif
-
-// Time in ms to test each packet size for each codec
-#define CODEC_TEST_TIME 400
-
-#endif  // WEBRTC_VOICE_ENGINE_VOE_TEST_COMMON_H_
diff --git a/voice_engine/test/auto_test/voe_test_defines.h b/voice_engine/test/auto_test/voe_test_defines.h
deleted file mode 100644
index 7264ffe..0000000
--- a/voice_engine/test/auto_test/voe_test_defines.h
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- *  Copyright (c) 2012 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_VOICE_ENGINE_VOE_TEST_DEFINES_H
-#define WEBRTC_VOICE_ENGINE_VOE_TEST_DEFINES_H
-
-#include "webrtc/voice_engine/test/auto_test/voe_test_common.h"
-
-// Select the tests to execute, list order below is same as they will be
-// executed. Note that, all settings below will be overriden by sub-API
-// settings in voice_engine_configurations.h.
-#define _TEST_BASE_
-#define _TEST_RTP_RTCP_
-#define _TEST_CODEC_
-#define _TEST_FILE_
-#define _TEST_NETWORK_
-
-// Enable this when running instrumentation of some kind to exclude tests
-// that will not pass due to slowed down execution.
-// #define _INSTRUMENTATION_TESTING_
-
-// Some parts can cause problems while running Insure
-#ifdef __INSURE__
-#define _INSTRUMENTATION_TESTING_
-#endif
-
-#define MARK() TEST_LOG("."); fflush(NULL);             // Add test marker
-#define ANL() TEST_LOG("\n")                            // Add New Line
-#define AOK() TEST_LOG("[Test is OK]"); fflush(NULL);   // Add OK
-#if defined(_WIN32)
-#define PAUSE                                      \
-    {                                               \
-        TEST_LOG("Press any key to continue...");   \
-        _getch();                                   \
-        TEST_LOG("\n");                             \
-    }
-#else
-#define PAUSE                                          \
-    {                                                   \
-        TEST_LOG("Continuing (pause not supported)\n"); \
-    }
-#endif
-
-#define TEST(s)                         \
-    {                                   \
-        TEST_LOG("Testing: %s", #s);    \
-    }                                   \
-
-#ifdef _INSTRUMENTATION_TESTING_
-// Don't stop execution if error occurs
-#define TEST_MUSTPASS(expr)                                               \
-    {                                                                     \
-        if ((expr))                                                       \
-        {                                                                 \
-            TEST_LOG_ERROR("Error at line:%i, %s \n",__LINE__, #expr);    \
-            TEST_LOG_ERROR("Error code: %i\n",voe_base_->LastError());    \
-        }                                                                 \
-    }
-#define TEST_ERROR(code)                                                \
-    {                                                                   \
-        int err = voe_base_->LastError();                               \
-        if (err != code)                                                \
-        {                                                               \
-            TEST_LOG_ERROR("Invalid error code (%d, should be %d) at line %d\n",
-                           code, err, __LINE__);
-}
-}
-#else
-#define ASSERT_TRUE(expr) TEST_MUSTPASS(!(expr))
-#define ASSERT_FALSE(expr) TEST_MUSTPASS(expr)
-#define TEST_MUSTFAIL(expr) TEST_MUSTPASS(!((expr) == -1))
-#define TEST_MUSTPASS(expr)                                              \
-    {                                                                    \
-        if ((expr))                                                      \
-        {                                                                \
-            TEST_LOG_ERROR("\nError at line:%i, %s \n",__LINE__, #expr); \
-            TEST_LOG_ERROR("Error code: %i\n", voe_base_->LastError());  \
-            PAUSE                                                        \
-            return -1;                                                   \
-        }                                                                \
-    }
-#define TEST_ERROR(code) \
-    {																                                         \
-      int err = voe_base_->LastError();                                      \
-      if (err != code)                                                       \
-      {                                                                      \
-        TEST_LOG_ERROR("Invalid error code (%d, should be %d) at line %d\n", \
-                       err, code, __LINE__);                                 \
-        PAUSE                                                                \
-        return -1;                                                           \
-      }															                                         \
-    }
-#endif  // #ifdef _INSTRUMENTATION_TESTING_
-#define EXCLUDE()                                                   \
-    {                                                               \
-        TEST_LOG("\n>>> Excluding test at line: %i <<<\n\n",__LINE__);  \
-    }
-
-#define INCOMPLETE()                                                \
-    {                                                               \
-        TEST_LOG("\n>>> Incomplete test at line: %i <<<\n\n",__LINE__);  \
-    }
-
-#endif // WEBRTC_VOICE_ENGINE_VOE_TEST_DEFINES_H
diff --git a/voice_engine/transmit_mixer.cc b/voice_engine/transmit_mixer.cc
deleted file mode 100644
index 32f4848..0000000
--- a/voice_engine/transmit_mixer.cc
+++ /dev/null
@@ -1,1041 +0,0 @@
-/*
- *  Copyright (c) 2012 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/voice_engine/transmit_mixer.h"
-
-#include <memory>
-
-#include "webrtc/audio/utility/audio_frame_operations.h"
-#include "webrtc/rtc_base/format_macros.h"
-#include "webrtc/rtc_base/location.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/system_wrappers/include/event_wrapper.h"
-#include "webrtc/system_wrappers/include/trace.h"
-#include "webrtc/voice_engine/channel.h"
-#include "webrtc/voice_engine/channel_manager.h"
-#include "webrtc/voice_engine/statistics.h"
-#include "webrtc/voice_engine/utility.h"
-#include "webrtc/voice_engine/voe_base_impl.h"
-
-namespace webrtc {
-namespace voe {
-
-#if WEBRTC_VOICE_ENGINE_TYPING_DETECTION
-// TODO(ajm): The thread safety of this is dubious...
-void TransmitMixer::OnPeriodicProcess()
-{
-    WEBRTC_TRACE(kTraceStream, kTraceVoice, VoEId(_instanceId, -1),
-                 "TransmitMixer::OnPeriodicProcess()");
-
-    bool send_typing_noise_warning = false;
-    bool typing_noise_detected = false;
-    {
-      rtc::CritScope cs(&_critSect);
-      if (_typingNoiseWarningPending) {
-        send_typing_noise_warning = true;
-        typing_noise_detected = _typingNoiseDetected;
-        _typingNoiseWarningPending = false;
-      }
-    }
-    if (send_typing_noise_warning) {
-        rtc::CritScope cs(&_callbackCritSect);
-        if (_voiceEngineObserverPtr) {
-            if (typing_noise_detected) {
-                WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId, -1),
-                             "TransmitMixer::OnPeriodicProcess() => "
-                             "CallbackOnError(VE_TYPING_NOISE_WARNING)");
-                _voiceEngineObserverPtr->CallbackOnError(
-                    -1,
-                    VE_TYPING_NOISE_WARNING);
-            } else {
-                WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId, -1),
-                             "TransmitMixer::OnPeriodicProcess() => "
-                             "CallbackOnError(VE_TYPING_NOISE_OFF_WARNING)");
-                _voiceEngineObserverPtr->CallbackOnError(
-                    -1,
-                    VE_TYPING_NOISE_OFF_WARNING);
-            }
-        }
-    }
-}
-#endif  // WEBRTC_VOICE_ENGINE_TYPING_DETECTION
-
-void TransmitMixer::PlayNotification(int32_t id,
-                                     uint32_t durationMs)
-{
-    WEBRTC_TRACE(kTraceStream, kTraceVoice, VoEId(_instanceId, -1),
-                 "TransmitMixer::PlayNotification(id=%d, durationMs=%d)",
-                 id, durationMs);
-
-    // Not implement yet
-}
-
-void TransmitMixer::RecordNotification(int32_t id,
-                                       uint32_t durationMs)
-{
-    WEBRTC_TRACE(kTraceStream, kTraceVoice, VoEId(_instanceId,-1),
-                 "TransmitMixer::RecordNotification(id=%d, durationMs=%d)",
-                 id, durationMs);
-
-    // Not implement yet
-}
-
-void TransmitMixer::PlayFileEnded(int32_t id)
-{
-    WEBRTC_TRACE(kTraceStream, kTraceVoice, VoEId(_instanceId, -1),
-                 "TransmitMixer::PlayFileEnded(id=%d)", id);
-
-    assert(id == _filePlayerId);
-
-    rtc::CritScope cs(&_critSect);
-
-    _filePlaying = false;
-    WEBRTC_TRACE(kTraceStateInfo, kTraceVoice, VoEId(_instanceId, -1),
-                 "TransmitMixer::PlayFileEnded() =>"
-                 "file player module is shutdown");
-}
-
-void
-TransmitMixer::RecordFileEnded(int32_t id)
-{
-    WEBRTC_TRACE(kTraceStream, kTraceVoice, VoEId(_instanceId, -1),
-                 "TransmitMixer::RecordFileEnded(id=%d)", id);
-
-    if (id == _fileRecorderId)
-    {
-        rtc::CritScope cs(&_critSect);
-        _fileRecording = false;
-        WEBRTC_TRACE(kTraceStateInfo, kTraceVoice, VoEId(_instanceId, -1),
-                     "TransmitMixer::RecordFileEnded() => fileRecorder module"
-                     "is shutdown");
-    } else if (id == _fileCallRecorderId)
-    {
-        rtc::CritScope cs(&_critSect);
-        _fileCallRecording = false;
-        WEBRTC_TRACE(kTraceStateInfo, kTraceVoice, VoEId(_instanceId, -1),
-                     "TransmitMixer::RecordFileEnded() => fileCallRecorder"
-                     "module is shutdown");
-    }
-}
-
-int32_t
-TransmitMixer::Create(TransmitMixer*& mixer, uint32_t instanceId)
-{
-    WEBRTC_TRACE(kTraceMemory, kTraceVoice, VoEId(instanceId, -1),
-                 "TransmitMixer::Create(instanceId=%d)", instanceId);
-    mixer = new TransmitMixer(instanceId);
-    if (mixer == NULL)
-    {
-        WEBRTC_TRACE(kTraceMemory, kTraceVoice, VoEId(instanceId, -1),
-                     "TransmitMixer::Create() unable to allocate memory"
-                     "for mixer");
-        return -1;
-    }
-    return 0;
-}
-
-void
-TransmitMixer::Destroy(TransmitMixer*& mixer)
-{
-    if (mixer)
-    {
-        delete mixer;
-        mixer = NULL;
-    }
-}
-
-TransmitMixer::TransmitMixer(uint32_t instanceId) :
-    // Avoid conflict with other channels by adding 1024 - 1026,
-    // won't use as much as 1024 channels.
-    _filePlayerId(instanceId + 1024),
-    _fileRecorderId(instanceId + 1025),
-    _fileCallRecorderId(instanceId + 1026),
-#if WEBRTC_VOICE_ENGINE_TYPING_DETECTION
-    _monitorModule(this),
-#endif
-    _instanceId(instanceId)
-{
-    WEBRTC_TRACE(kTraceMemory, kTraceVoice, VoEId(_instanceId, -1),
-                 "TransmitMixer::TransmitMixer() - ctor");
-}
-
-TransmitMixer::~TransmitMixer()
-{
-    WEBRTC_TRACE(kTraceMemory, kTraceVoice, VoEId(_instanceId, -1),
-                 "TransmitMixer::~TransmitMixer() - dtor");
-#if WEBRTC_VOICE_ENGINE_TYPING_DETECTION
-    if (_processThreadPtr)
-        _processThreadPtr->DeRegisterModule(&_monitorModule);
-#endif
-    {
-        rtc::CritScope cs(&_critSect);
-        if (file_recorder_) {
-          file_recorder_->RegisterModuleFileCallback(NULL);
-          file_recorder_->StopRecording();
-        }
-        if (file_call_recorder_) {
-          file_call_recorder_->RegisterModuleFileCallback(NULL);
-          file_call_recorder_->StopRecording();
-        }
-        if (file_player_) {
-          file_player_->RegisterModuleFileCallback(NULL);
-          file_player_->StopPlayingFile();
-        }
-    }
-}
-
-int32_t
-TransmitMixer::SetEngineInformation(ProcessThread& processThread,
-                                    Statistics& engineStatistics,
-                                    ChannelManager& channelManager)
-{
-    WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId, -1),
-                 "TransmitMixer::SetEngineInformation()");
-
-    _processThreadPtr = &processThread;
-    _engineStatisticsPtr = &engineStatistics;
-    _channelManagerPtr = &channelManager;
-
-#if WEBRTC_VOICE_ENGINE_TYPING_DETECTION
-    _processThreadPtr->RegisterModule(&_monitorModule, RTC_FROM_HERE);
-#endif
-    return 0;
-}
-
-int32_t
-TransmitMixer::RegisterVoiceEngineObserver(VoiceEngineObserver& observer)
-{
-    WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId, -1),
-                 "TransmitMixer::RegisterVoiceEngineObserver()");
-    rtc::CritScope cs(&_callbackCritSect);
-
-    if (_voiceEngineObserverPtr)
-    {
-        _engineStatisticsPtr->SetLastError(
-            VE_INVALID_OPERATION, kTraceError,
-            "RegisterVoiceEngineObserver() observer already enabled");
-        return -1;
-    }
-    _voiceEngineObserverPtr = &observer;
-    return 0;
-}
-
-int32_t
-TransmitMixer::SetAudioProcessingModule(AudioProcessing* audioProcessingModule)
-{
-    WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId, -1),
-                 "TransmitMixer::SetAudioProcessingModule("
-                 "audioProcessingModule=0x%x)",
-                 audioProcessingModule);
-    audioproc_ = audioProcessingModule;
-    return 0;
-}
-
-void TransmitMixer::GetSendCodecInfo(int* max_sample_rate,
-                                     size_t* max_channels) {
-  *max_sample_rate = 8000;
-  *max_channels = 1;
-  for (ChannelManager::Iterator it(_channelManagerPtr); it.IsValid();
-       it.Increment()) {
-    Channel* channel = it.GetChannel();
-    if (channel->Sending()) {
-      CodecInst codec;
-      // TODO(ossu): Investigate how this could happen. b/62909493
-      if (channel->GetSendCodec(codec) == 0) {
-        *max_sample_rate = std::max(*max_sample_rate, codec.plfreq);
-        *max_channels = std::max(*max_channels, codec.channels);
-      } else {
-        LOG(LS_WARNING) << "Unable to get send codec for channel "
-                        << channel->ChannelId();
-        RTC_NOTREACHED();
-      }
-    }
-  }
-}
-
-int32_t
-TransmitMixer::PrepareDemux(const void* audioSamples,
-                            size_t nSamples,
-                            size_t nChannels,
-                            uint32_t samplesPerSec,
-                            uint16_t totalDelayMS,
-                            int32_t clockDrift,
-                            uint16_t currentMicLevel,
-                            bool keyPressed)
-{
-    WEBRTC_TRACE(kTraceStream, kTraceVoice, VoEId(_instanceId, -1),
-                 "TransmitMixer::PrepareDemux(nSamples=%" PRIuS ", "
-                 "nChannels=%" PRIuS ", samplesPerSec=%u, totalDelayMS=%u, "
-                 "clockDrift=%d, currentMicLevel=%u)",
-                 nSamples, nChannels, samplesPerSec, totalDelayMS, clockDrift,
-                 currentMicLevel);
-
-    // --- Resample input audio and create/store the initial audio frame
-    GenerateAudioFrame(static_cast<const int16_t*>(audioSamples),
-                       nSamples,
-                       nChannels,
-                       samplesPerSec);
-
-    // --- Near-end audio processing.
-    ProcessAudio(totalDelayMS, clockDrift, currentMicLevel, keyPressed);
-
-    if (swap_stereo_channels_ && stereo_codec_)
-      // Only bother swapping if we're using a stereo codec.
-      AudioFrameOperations::SwapStereoChannels(&_audioFrame);
-
-    // --- Annoying typing detection (utilizes the APM/VAD decision)
-#if WEBRTC_VOICE_ENGINE_TYPING_DETECTION
-    TypingDetection(keyPressed);
-#endif
-
-    // --- Mix with file (does not affect the mixing frequency)
-    if (_filePlaying)
-    {
-        MixOrReplaceAudioWithFile(_audioFrame.sample_rate_hz_);
-    }
-
-    // --- Record to file
-    bool file_recording = false;
-    {
-        rtc::CritScope cs(&_critSect);
-        file_recording =  _fileRecording;
-    }
-    if (file_recording)
-    {
-        RecordAudioToFile(_audioFrame.sample_rate_hz_);
-    }
-
-    // --- Measure audio level of speech after all processing.
-    double sample_duration = static_cast<double>(nSamples) / samplesPerSec;
-    _audioLevel.ComputeLevel(_audioFrame, sample_duration);
-
-    return 0;
-}
-
-void TransmitMixer::ProcessAndEncodeAudio() {
-  RTC_DCHECK_GT(_audioFrame.samples_per_channel_, 0);
-  for (ChannelManager::Iterator it(_channelManagerPtr); it.IsValid();
-       it.Increment()) {
-    Channel* const channel = it.GetChannel();
-    if (channel->Sending()) {
-      channel->ProcessAndEncodeAudio(_audioFrame);
-    }
-  }
-}
-
-uint32_t TransmitMixer::CaptureLevel() const
-{
-    return _captureLevel;
-}
-
-int32_t
-TransmitMixer::StopSend()
-{
-    WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId, -1),
-               "TransmitMixer::StopSend()");
-    _audioLevel.Clear();
-    return 0;
-}
-
-int TransmitMixer::StartPlayingFileAsMicrophone(const char* fileName,
-                                                bool loop,
-                                                FileFormats format,
-                                                int startPosition,
-                                                float volumeScaling,
-                                                int stopPosition,
-                                                const CodecInst* codecInst)
-{
-    WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId, -1),
-                 "TransmitMixer::StartPlayingFileAsMicrophone("
-                 "fileNameUTF8[]=%s,loop=%d, format=%d, volumeScaling=%5.3f,"
-                 " startPosition=%d, stopPosition=%d)", fileName, loop,
-                 format, volumeScaling, startPosition, stopPosition);
-
-    if (_filePlaying)
-    {
-        _engineStatisticsPtr->SetLastError(
-            VE_ALREADY_PLAYING, kTraceWarning,
-            "StartPlayingFileAsMicrophone() is already playing");
-        return 0;
-    }
-
-    rtc::CritScope cs(&_critSect);
-
-    // Destroy the old instance
-    if (file_player_) {
-      file_player_->RegisterModuleFileCallback(NULL);
-      file_player_.reset();
-    }
-
-    // Dynamically create the instance
-    file_player_ =
-        FilePlayer::CreateFilePlayer(_filePlayerId, (const FileFormats)format);
-
-    if (!file_player_) {
-      _engineStatisticsPtr->SetLastError(
-          VE_INVALID_ARGUMENT, kTraceError,
-          "StartPlayingFileAsMicrophone() filePlayer format isnot correct");
-      return -1;
-    }
-
-    const uint32_t notificationTime(0);
-
-    if (file_player_->StartPlayingFile(
-            fileName, loop, startPosition, volumeScaling, notificationTime,
-            stopPosition, (const CodecInst*)codecInst) != 0) {
-      _engineStatisticsPtr->SetLastError(
-          VE_BAD_FILE, kTraceError,
-          "StartPlayingFile() failed to start file playout");
-      file_player_->StopPlayingFile();
-      file_player_.reset();
-      return -1;
-    }
-
-    file_player_->RegisterModuleFileCallback(this);
-    _filePlaying = true;
-
-    return 0;
-}
-
-int TransmitMixer::StartPlayingFileAsMicrophone(InStream* stream,
-                                                FileFormats format,
-                                                int startPosition,
-                                                float volumeScaling,
-                                                int stopPosition,
-                                                const CodecInst* codecInst)
-{
-    WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId,-1),
-                 "TransmitMixer::StartPlayingFileAsMicrophone(format=%d,"
-                 " volumeScaling=%5.3f, startPosition=%d, stopPosition=%d)",
-                 format, volumeScaling, startPosition, stopPosition);
-
-    if (stream == NULL)
-    {
-        _engineStatisticsPtr->SetLastError(
-            VE_BAD_FILE, kTraceError,
-            "StartPlayingFileAsMicrophone() NULL as input stream");
-        return -1;
-    }
-
-    if (_filePlaying)
-    {
-        _engineStatisticsPtr->SetLastError(
-            VE_ALREADY_PLAYING, kTraceWarning,
-            "StartPlayingFileAsMicrophone() is already playing");
-        return 0;
-    }
-
-    rtc::CritScope cs(&_critSect);
-
-    // Destroy the old instance
-    if (file_player_) {
-      file_player_->RegisterModuleFileCallback(NULL);
-      file_player_.reset();
-    }
-
-    // Dynamically create the instance
-    file_player_ =
-        FilePlayer::CreateFilePlayer(_filePlayerId, (const FileFormats)format);
-
-    if (!file_player_) {
-      _engineStatisticsPtr->SetLastError(
-          VE_INVALID_ARGUMENT, kTraceWarning,
-          "StartPlayingFileAsMicrophone() filePlayer format isnot correct");
-      return -1;
-    }
-
-    const uint32_t notificationTime(0);
-
-    if (file_player_->StartPlayingFile(stream, startPosition, volumeScaling,
-                                       notificationTime, stopPosition,
-                                       (const CodecInst*)codecInst) != 0) {
-      _engineStatisticsPtr->SetLastError(
-          VE_BAD_FILE, kTraceError,
-          "StartPlayingFile() failed to start file playout");
-      file_player_->StopPlayingFile();
-      file_player_.reset();
-      return -1;
-    }
-    file_player_->RegisterModuleFileCallback(this);
-    _filePlaying = true;
-
-    return 0;
-}
-
-int TransmitMixer::StopPlayingFileAsMicrophone()
-{
-    WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId,-1),
-                 "TransmitMixer::StopPlayingFileAsMicrophone()");
-
-    if (!_filePlaying)
-    {
-        return 0;
-    }
-
-    rtc::CritScope cs(&_critSect);
-
-    if (file_player_->StopPlayingFile() != 0) {
-      _engineStatisticsPtr->SetLastError(
-          VE_CANNOT_STOP_PLAYOUT, kTraceError,
-          "StopPlayingFile() couldnot stop playing file");
-      return -1;
-    }
-
-    file_player_->RegisterModuleFileCallback(NULL);
-    file_player_.reset();
-    _filePlaying = false;
-
-    return 0;
-}
-
-int TransmitMixer::IsPlayingFileAsMicrophone() const
-{
-    WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId, -1),
-                 "TransmitMixer::IsPlayingFileAsMicrophone()");
-    return _filePlaying;
-}
-
-int TransmitMixer::StartRecordingMicrophone(const char* fileName,
-                                            const CodecInst* codecInst)
-{
-    WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId, -1),
-                 "TransmitMixer::StartRecordingMicrophone(fileName=%s)",
-                 fileName);
-
-    rtc::CritScope cs(&_critSect);
-
-    if (_fileRecording)
-    {
-        WEBRTC_TRACE(kTraceWarning, kTraceVoice, VoEId(_instanceId, -1),
-                     "StartRecordingMicrophone() is already recording");
-        return 0;
-    }
-
-    FileFormats format;
-    const uint32_t notificationTime(0); // Not supported in VoE
-    CodecInst dummyCodec = { 100, "L16", 16000, 320, 1, 320000 };
-
-    if (codecInst != NULL && codecInst->channels > 2)
-    {
-        _engineStatisticsPtr->SetLastError(
-            VE_BAD_ARGUMENT, kTraceError,
-            "StartRecordingMicrophone() invalid compression");
-        return (-1);
-    }
-    if (codecInst == NULL)
-    {
-        format = kFileFormatPcm16kHzFile;
-        codecInst = &dummyCodec;
-    } else if ((STR_CASE_CMP(codecInst->plname,"L16") == 0) ||
-        (STR_CASE_CMP(codecInst->plname,"PCMU") == 0) ||
-        (STR_CASE_CMP(codecInst->plname,"PCMA") == 0))
-    {
-        format = kFileFormatWavFile;
-    } else
-    {
-        format = kFileFormatCompressedFile;
-    }
-
-    // Destroy the old instance
-    if (file_recorder_) {
-      file_recorder_->RegisterModuleFileCallback(NULL);
-      file_recorder_.reset();
-    }
-
-    file_recorder_ = FileRecorder::CreateFileRecorder(
-        _fileRecorderId, (const FileFormats)format);
-    if (!file_recorder_) {
-      _engineStatisticsPtr->SetLastError(
-          VE_INVALID_ARGUMENT, kTraceError,
-          "StartRecordingMicrophone() fileRecorder format isnot correct");
-      return -1;
-    }
-
-    if (file_recorder_->StartRecordingAudioFile(
-            fileName, (const CodecInst&)*codecInst, notificationTime) != 0) {
-      _engineStatisticsPtr->SetLastError(
-          VE_BAD_FILE, kTraceError,
-          "StartRecordingAudioFile() failed to start file recording");
-      file_recorder_->StopRecording();
-      file_recorder_.reset();
-      return -1;
-    }
-    file_recorder_->RegisterModuleFileCallback(this);
-    _fileRecording = true;
-
-    return 0;
-}
-
-int TransmitMixer::StartRecordingMicrophone(OutStream* stream,
-                                            const CodecInst* codecInst)
-{
-    WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId, -1),
-               "TransmitMixer::StartRecordingMicrophone()");
-
-    rtc::CritScope cs(&_critSect);
-
-    if (_fileRecording)
-    {
-        WEBRTC_TRACE(kTraceWarning, kTraceVoice, VoEId(_instanceId, -1),
-                   "StartRecordingMicrophone() is already recording");
-        return 0;
-    }
-
-    FileFormats format;
-    const uint32_t notificationTime(0); // Not supported in VoE
-    CodecInst dummyCodec = { 100, "L16", 16000, 320, 1, 320000 };
-
-    if (codecInst != NULL && codecInst->channels != 1)
-    {
-        _engineStatisticsPtr->SetLastError(
-            VE_BAD_ARGUMENT, kTraceError,
-            "StartRecordingMicrophone() invalid compression");
-        return (-1);
-    }
-    if (codecInst == NULL)
-    {
-        format = kFileFormatPcm16kHzFile;
-        codecInst = &dummyCodec;
-    } else if ((STR_CASE_CMP(codecInst->plname,"L16") == 0) ||
-        (STR_CASE_CMP(codecInst->plname,"PCMU") == 0) ||
-        (STR_CASE_CMP(codecInst->plname,"PCMA") == 0))
-    {
-        format = kFileFormatWavFile;
-    } else
-    {
-        format = kFileFormatCompressedFile;
-    }
-
-    // Destroy the old instance
-    if (file_recorder_) {
-      file_recorder_->RegisterModuleFileCallback(NULL);
-      file_recorder_.reset();
-    }
-
-    file_recorder_ = FileRecorder::CreateFileRecorder(
-        _fileRecorderId, (const FileFormats)format);
-    if (!file_recorder_) {
-      _engineStatisticsPtr->SetLastError(
-          VE_INVALID_ARGUMENT, kTraceError,
-          "StartRecordingMicrophone() fileRecorder format isnot correct");
-      return -1;
-    }
-
-    if (file_recorder_->StartRecordingAudioFile(stream, *codecInst,
-                                                notificationTime) != 0) {
-      _engineStatisticsPtr->SetLastError(
-          VE_BAD_FILE, kTraceError,
-          "StartRecordingAudioFile() failed to start file recording");
-      file_recorder_->StopRecording();
-      file_recorder_.reset();
-      return -1;
-    }
-
-    file_recorder_->RegisterModuleFileCallback(this);
-    _fileRecording = true;
-
-    return 0;
-}
-
-
-int TransmitMixer::StopRecordingMicrophone()
-{
-    WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId, -1),
-                 "TransmitMixer::StopRecordingMicrophone()");
-
-    rtc::CritScope cs(&_critSect);
-
-    if (!_fileRecording)
-    {
-        WEBRTC_TRACE(kTraceWarning, kTraceVoice, VoEId(_instanceId, -1),
-                   "StopRecordingMicrophone() isnot recording");
-        return 0;
-    }
-
-    if (file_recorder_->StopRecording() != 0) {
-      _engineStatisticsPtr->SetLastError(
-          VE_STOP_RECORDING_FAILED, kTraceError,
-          "StopRecording(), could not stop recording");
-      return -1;
-    }
-    file_recorder_->RegisterModuleFileCallback(NULL);
-    file_recorder_.reset();
-    _fileRecording = false;
-
-    return 0;
-}
-
-int TransmitMixer::StartRecordingCall(const char* fileName,
-                                      const CodecInst* codecInst)
-{
-    WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId, -1),
-                 "TransmitMixer::StartRecordingCall(fileName=%s)", fileName);
-
-    if (_fileCallRecording)
-    {
-        WEBRTC_TRACE(kTraceWarning, kTraceVoice, VoEId(_instanceId, -1),
-                     "StartRecordingCall() is already recording");
-        return 0;
-    }
-
-    FileFormats format;
-    const uint32_t notificationTime(0); // Not supported in VoE
-    CodecInst dummyCodec = { 100, "L16", 16000, 320, 1, 320000 };
-
-    if (codecInst != NULL && codecInst->channels != 1)
-    {
-        _engineStatisticsPtr->SetLastError(
-            VE_BAD_ARGUMENT, kTraceError,
-            "StartRecordingCall() invalid compression");
-        return (-1);
-    }
-    if (codecInst == NULL)
-    {
-        format = kFileFormatPcm16kHzFile;
-        codecInst = &dummyCodec;
-    } else if ((STR_CASE_CMP(codecInst->plname,"L16") == 0) ||
-        (STR_CASE_CMP(codecInst->plname,"PCMU") == 0) ||
-        (STR_CASE_CMP(codecInst->plname,"PCMA") == 0))
-    {
-        format = kFileFormatWavFile;
-    } else
-    {
-        format = kFileFormatCompressedFile;
-    }
-
-    rtc::CritScope cs(&_critSect);
-
-    // Destroy the old instance
-    if (file_call_recorder_) {
-      file_call_recorder_->RegisterModuleFileCallback(NULL);
-      file_call_recorder_.reset();
-    }
-
-    file_call_recorder_ = FileRecorder::CreateFileRecorder(
-        _fileCallRecorderId, (const FileFormats)format);
-    if (!file_call_recorder_) {
-      _engineStatisticsPtr->SetLastError(
-          VE_INVALID_ARGUMENT, kTraceError,
-          "StartRecordingCall() fileRecorder format isnot correct");
-      return -1;
-    }
-
-    if (file_call_recorder_->StartRecordingAudioFile(
-            fileName, (const CodecInst&)*codecInst, notificationTime) != 0) {
-      _engineStatisticsPtr->SetLastError(
-          VE_BAD_FILE, kTraceError,
-          "StartRecordingAudioFile() failed to start file recording");
-      file_call_recorder_->StopRecording();
-      file_call_recorder_.reset();
-      return -1;
-    }
-    file_call_recorder_->RegisterModuleFileCallback(this);
-    _fileCallRecording = true;
-
-    return 0;
-}
-
-int TransmitMixer::StartRecordingCall(OutStream* stream,
-                                      const  CodecInst* codecInst)
-{
-    WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId, -1),
-                 "TransmitMixer::StartRecordingCall()");
-
-    if (_fileCallRecording)
-    {
-        WEBRTC_TRACE(kTraceWarning, kTraceVoice, VoEId(_instanceId, -1),
-                     "StartRecordingCall() is already recording");
-        return 0;
-    }
-
-    FileFormats format;
-    const uint32_t notificationTime(0); // Not supported in VoE
-    CodecInst dummyCodec = { 100, "L16", 16000, 320, 1, 320000 };
-
-    if (codecInst != NULL && codecInst->channels != 1)
-    {
-        _engineStatisticsPtr->SetLastError(
-            VE_BAD_ARGUMENT, kTraceError,
-            "StartRecordingCall() invalid compression");
-        return (-1);
-    }
-    if (codecInst == NULL)
-    {
-        format = kFileFormatPcm16kHzFile;
-        codecInst = &dummyCodec;
-    } else if ((STR_CASE_CMP(codecInst->plname,"L16") == 0) ||
-        (STR_CASE_CMP(codecInst->plname,"PCMU") == 0) ||
-        (STR_CASE_CMP(codecInst->plname,"PCMA") == 0))
-    {
-        format = kFileFormatWavFile;
-    } else
-    {
-        format = kFileFormatCompressedFile;
-    }
-
-    rtc::CritScope cs(&_critSect);
-
-    // Destroy the old instance
-    if (file_call_recorder_) {
-      file_call_recorder_->RegisterModuleFileCallback(NULL);
-      file_call_recorder_.reset();
-    }
-
-    file_call_recorder_ = FileRecorder::CreateFileRecorder(
-        _fileCallRecorderId, (const FileFormats)format);
-    if (!file_call_recorder_) {
-      _engineStatisticsPtr->SetLastError(
-          VE_INVALID_ARGUMENT, kTraceError,
-          "StartRecordingCall() fileRecorder format isnot correct");
-      return -1;
-    }
-
-    if (file_call_recorder_->StartRecordingAudioFile(stream, *codecInst,
-                                                     notificationTime) != 0) {
-      _engineStatisticsPtr->SetLastError(
-          VE_BAD_FILE, kTraceError,
-          "StartRecordingAudioFile() failed to start file recording");
-      file_call_recorder_->StopRecording();
-      file_call_recorder_.reset();
-      return -1;
-    }
-
-    file_call_recorder_->RegisterModuleFileCallback(this);
-    _fileCallRecording = true;
-
-    return 0;
-}
-
-int TransmitMixer::StopRecordingCall()
-{
-    WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId, -1),
-                 "TransmitMixer::StopRecordingCall()");
-
-    if (!_fileCallRecording)
-    {
-        WEBRTC_TRACE(kTraceError, kTraceVoice, VoEId(_instanceId, -1),
-                     "StopRecordingCall() file isnot recording");
-        return -1;
-    }
-
-    rtc::CritScope cs(&_critSect);
-
-    if (file_call_recorder_->StopRecording() != 0) {
-      _engineStatisticsPtr->SetLastError(
-          VE_STOP_RECORDING_FAILED, kTraceError,
-          "StopRecording(), could not stop recording");
-      return -1;
-    }
-
-    file_call_recorder_->RegisterModuleFileCallback(NULL);
-    file_call_recorder_.reset();
-    _fileCallRecording = false;
-
-    return 0;
-}
-
-void
-TransmitMixer::SetMixWithMicStatus(bool mix)
-{
-    _mixFileWithMicrophone = mix;
-}
-
-int8_t TransmitMixer::AudioLevel() const
-{
-    // Speech + file level [0,9]
-    return _audioLevel.Level();
-}
-
-int16_t TransmitMixer::AudioLevelFullRange() const
-{
-    // Speech + file level [0,32767]
-    return _audioLevel.LevelFullRange();
-}
-
-double TransmitMixer::GetTotalInputEnergy() const {
-  return _audioLevel.TotalEnergy();
-}
-
-double TransmitMixer::GetTotalInputDuration() const {
-  return _audioLevel.TotalDuration();
-}
-
-bool TransmitMixer::IsRecordingCall()
-{
-    return _fileCallRecording;
-}
-
-bool TransmitMixer::IsRecordingMic()
-{
-    rtc::CritScope cs(&_critSect);
-    return _fileRecording;
-}
-
-void TransmitMixer::GenerateAudioFrame(const int16_t* audio,
-                                       size_t samples_per_channel,
-                                       size_t num_channels,
-                                       int sample_rate_hz) {
-  int codec_rate;
-  size_t num_codec_channels;
-  GetSendCodecInfo(&codec_rate, &num_codec_channels);
-  stereo_codec_ = num_codec_channels == 2;
-
-  // We want to process at the lowest rate possible without losing information.
-  // Choose the lowest native rate at least equal to the input and codec rates.
-  const int min_processing_rate = std::min(sample_rate_hz, codec_rate);
-  for (size_t i = 0; i < AudioProcessing::kNumNativeSampleRates; ++i) {
-    _audioFrame.sample_rate_hz_ = AudioProcessing::kNativeSampleRatesHz[i];
-    if (_audioFrame.sample_rate_hz_ >= min_processing_rate) {
-      break;
-    }
-  }
-  _audioFrame.num_channels_ = std::min(num_channels, num_codec_channels);
-  RemixAndResample(audio, samples_per_channel, num_channels, sample_rate_hz,
-                   &resampler_, &_audioFrame);
-}
-
-int32_t TransmitMixer::RecordAudioToFile(
-    uint32_t mixingFrequency)
-{
-    rtc::CritScope cs(&_critSect);
-    if (!file_recorder_) {
-      WEBRTC_TRACE(kTraceWarning, kTraceVoice, VoEId(_instanceId, -1),
-                   "TransmitMixer::RecordAudioToFile() filerecorder doesnot"
-                   "exist");
-      return -1;
-    }
-
-    if (file_recorder_->RecordAudioToFile(_audioFrame) != 0) {
-      WEBRTC_TRACE(kTraceWarning, kTraceVoice, VoEId(_instanceId, -1),
-                   "TransmitMixer::RecordAudioToFile() file recording"
-                   "failed");
-      return -1;
-    }
-
-    return 0;
-}
-
-int32_t TransmitMixer::MixOrReplaceAudioWithFile(
-    int mixingFrequency)
-{
-    std::unique_ptr<int16_t[]> fileBuffer(new int16_t[640]);
-
-    size_t fileSamples(0);
-    {
-        rtc::CritScope cs(&_critSect);
-        if (!file_player_) {
-          WEBRTC_TRACE(kTraceWarning, kTraceVoice, VoEId(_instanceId, -1),
-                       "TransmitMixer::MixOrReplaceAudioWithFile()"
-                       "fileplayer doesnot exist");
-          return -1;
-        }
-
-        if (file_player_->Get10msAudioFromFile(fileBuffer.get(), &fileSamples,
-                                               mixingFrequency) == -1) {
-          WEBRTC_TRACE(kTraceWarning, kTraceVoice, VoEId(_instanceId, -1),
-                       "TransmitMixer::MixOrReplaceAudioWithFile() file"
-                       " mixing failed");
-          return -1;
-        }
-    }
-
-    assert(_audioFrame.samples_per_channel_ == fileSamples);
-
-    if (_mixFileWithMicrophone)
-    {
-        // Currently file stream is always mono.
-        // TODO(xians): Change the code when FilePlayer supports real stereo.
-        MixWithSat(_audioFrame.mutable_data(),
-                   _audioFrame.num_channels_,
-                   fileBuffer.get(),
-                   1,
-                   fileSamples);
-    } else
-    {
-        // Replace ACM audio with file.
-        // Currently file stream is always mono.
-        // TODO(xians): Change the code when FilePlayer supports real stereo.
-        _audioFrame.UpdateFrame(-1,
-                                0xFFFFFFFF,
-                                fileBuffer.get(),
-                                fileSamples,
-                                mixingFrequency,
-                                AudioFrame::kNormalSpeech,
-                                AudioFrame::kVadUnknown,
-                                1);
-    }
-    return 0;
-}
-
-void TransmitMixer::ProcessAudio(int delay_ms, int clock_drift,
-                                 int current_mic_level, bool key_pressed) {
-  if (audioproc_->set_stream_delay_ms(delay_ms) != 0) {
-    // Silently ignore this failure to avoid flooding the logs.
-  }
-
-  GainControl* agc = audioproc_->gain_control();
-  if (agc->set_stream_analog_level(current_mic_level) != 0) {
-    LOG(LS_ERROR) << "set_stream_analog_level failed: current_mic_level = "
-                  << current_mic_level;
-    assert(false);
-  }
-
-  EchoCancellation* aec = audioproc_->echo_cancellation();
-  if (aec->is_drift_compensation_enabled()) {
-    aec->set_stream_drift_samples(clock_drift);
-  }
-
-  audioproc_->set_stream_key_pressed(key_pressed);
-
-  int err = audioproc_->ProcessStream(&_audioFrame);
-  if (err != 0) {
-    LOG(LS_ERROR) << "ProcessStream() error: " << err;
-    assert(false);
-  }
-
-  // Store new capture level. Only updated when analog AGC is enabled.
-  _captureLevel = agc->stream_analog_level();
-}
-
-#if WEBRTC_VOICE_ENGINE_TYPING_DETECTION
-void TransmitMixer::TypingDetection(bool keyPressed)
-{
-  // We let the VAD determine if we're using this feature or not.
-  if (_audioFrame.vad_activity_ == AudioFrame::kVadUnknown) {
-    return;
-  }
-
-  bool vadActive = _audioFrame.vad_activity_ == AudioFrame::kVadActive;
-  if (_typingDetection.Process(keyPressed, vadActive)) {
-    rtc::CritScope cs(&_critSect);
-    _typingNoiseWarningPending = true;
-    _typingNoiseDetected = true;
-  } else {
-    rtc::CritScope cs(&_critSect);
-    // If there is already a warning pending, do not change the state.
-    // Otherwise set a warning pending if last callback was for noise detected.
-    if (!_typingNoiseWarningPending && _typingNoiseDetected) {
-      _typingNoiseWarningPending = true;
-      _typingNoiseDetected = false;
-    }
-  }
-}
-#endif
-
-void TransmitMixer::EnableStereoChannelSwapping(bool enable) {
-  swap_stereo_channels_ = enable;
-}
-
-bool TransmitMixer::IsStereoChannelSwappingEnabled() {
-  return swap_stereo_channels_;
-}
-
-}  // namespace voe
-}  // namespace webrtc
diff --git a/voice_engine/transmit_mixer.h b/voice_engine/transmit_mixer.h
deleted file mode 100644
index 0ba99cf..0000000
--- a/voice_engine/transmit_mixer.h
+++ /dev/null
@@ -1,220 +0,0 @@
-/*
- *  Copyright (c) 2012 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_VOICE_ENGINE_TRANSMIT_MIXER_H
-#define WEBRTC_VOICE_ENGINE_TRANSMIT_MIXER_H
-
-#include <memory>
-
-#include "webrtc/common_audio/resampler/include/push_resampler.h"
-#include "webrtc/common_types.h"
-#include "webrtc/modules/audio_processing/typing_detection.h"
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/voice_engine/audio_level.h"
-#include "webrtc/voice_engine/file_player.h"
-#include "webrtc/voice_engine/file_recorder.h"
-#include "webrtc/voice_engine/include/voe_base.h"
-#include "webrtc/voice_engine/monitor_module.h"
-#include "webrtc/voice_engine/voice_engine_defines.h"
-
-#if !defined(WEBRTC_ANDROID) && !defined(WEBRTC_IOS)
-#define WEBRTC_VOICE_ENGINE_TYPING_DETECTION 1
-#else
-#define WEBRTC_VOICE_ENGINE_TYPING_DETECTION 0
-#endif
-
-namespace webrtc {
-class AudioProcessing;
-class ProcessThread;
-
-namespace voe {
-
-class ChannelManager;
-class MixedAudio;
-class Statistics;
-
-class TransmitMixer : public FileCallback {
-public:
-    static int32_t Create(TransmitMixer*& mixer, uint32_t instanceId);
-
-    static void Destroy(TransmitMixer*& mixer);
-
-    int32_t SetEngineInformation(ProcessThread& processThread,
-                                 Statistics& engineStatistics,
-                                 ChannelManager& channelManager);
-
-    int32_t SetAudioProcessingModule(
-        AudioProcessing* audioProcessingModule);
-
-    int32_t PrepareDemux(const void* audioSamples,
-                         size_t nSamples,
-                         size_t nChannels,
-                         uint32_t samplesPerSec,
-                         uint16_t totalDelayMS,
-                         int32_t  clockDrift,
-                         uint16_t currentMicLevel,
-                         bool keyPressed);
-
-    void ProcessAndEncodeAudio();
-
-    // Must be called on the same thread as PrepareDemux().
-    uint32_t CaptureLevel() const;
-
-    int32_t StopSend();
-
-    // TODO(solenberg): Remove, once AudioMonitor is gone.
-    int8_t AudioLevel() const;
-
-    // 'virtual' to allow mocking.
-    virtual int16_t AudioLevelFullRange() const;
-
-    // See description of "totalAudioEnergy" in the WebRTC stats spec:
-    // https://w3c.github.io/webrtc-stats/#dom-rtcmediastreamtrackstats-totalaudioenergy
-    // 'virtual' to allow mocking.
-    virtual double GetTotalInputEnergy() const;
-
-    // 'virtual' to allow mocking.
-    virtual double GetTotalInputDuration() const;
-
-    bool IsRecordingCall();
-
-    bool IsRecordingMic();
-
-    int StartPlayingFileAsMicrophone(const char* fileName,
-                                     bool loop,
-                                     FileFormats format,
-                                     int startPosition,
-                                     float volumeScaling,
-                                     int stopPosition,
-                                     const CodecInst* codecInst);
-
-    int StartPlayingFileAsMicrophone(InStream* stream,
-                                     FileFormats format,
-                                     int startPosition,
-                                     float volumeScaling,
-                                     int stopPosition,
-                                     const CodecInst* codecInst);
-
-    int StopPlayingFileAsMicrophone();
-
-    int IsPlayingFileAsMicrophone() const;
-
-    int StartRecordingMicrophone(const char* fileName,
-                                 const CodecInst* codecInst);
-
-    int StartRecordingMicrophone(OutStream* stream,
-                                 const CodecInst* codecInst);
-
-    int StopRecordingMicrophone();
-
-    int StartRecordingCall(const char* fileName, const CodecInst* codecInst);
-
-    int StartRecordingCall(OutStream* stream, const CodecInst* codecInst);
-
-    int StopRecordingCall();
-
-    void SetMixWithMicStatus(bool mix);
-
-    int32_t RegisterVoiceEngineObserver(VoiceEngineObserver& observer);
-
-    virtual ~TransmitMixer();
-
-#if WEBRTC_VOICE_ENGINE_TYPING_DETECTION
-    // Periodic callback from the MonitorModule.
-    void OnPeriodicProcess();
-#endif
-
-    // FileCallback
-    void PlayNotification(const int32_t id,
-                          const uint32_t durationMs);
-
-    void RecordNotification(const int32_t id,
-                            const uint32_t durationMs);
-
-    void PlayFileEnded(const int32_t id);
-
-    void RecordFileEnded(const int32_t id);
-
-  // Virtual to allow mocking.
-  virtual void EnableStereoChannelSwapping(bool enable);
-  bool IsStereoChannelSwappingEnabled();
-
-protected:
-#if WEBRTC_VOICE_ENGINE_TYPING_DETECTION
-    TransmitMixer() : _monitorModule(this) {}
-#else
-    TransmitMixer() = default;
-#endif
-
-private:
-    TransmitMixer(uint32_t instanceId);
-
-    // Gets the maximum sample rate and number of channels over all currently
-    // sending codecs.
-    void GetSendCodecInfo(int* max_sample_rate, size_t* max_channels);
-
-    void GenerateAudioFrame(const int16_t audioSamples[],
-                            size_t nSamples,
-                            size_t nChannels,
-                            int samplesPerSec);
-    int32_t RecordAudioToFile(uint32_t mixingFrequency);
-
-    int32_t MixOrReplaceAudioWithFile(
-        int mixingFrequency);
-
-    void ProcessAudio(int delay_ms, int clock_drift, int current_mic_level,
-                      bool key_pressed);
-
-#if WEBRTC_VOICE_ENGINE_TYPING_DETECTION
-    void TypingDetection(bool keyPressed);
-#endif
-
-    // uses
-    Statistics* _engineStatisticsPtr = nullptr;
-    ChannelManager* _channelManagerPtr = nullptr;
-    AudioProcessing* audioproc_ = nullptr;
-    VoiceEngineObserver* _voiceEngineObserverPtr = nullptr;
-    ProcessThread* _processThreadPtr = nullptr;
-
-    // owns
-    AudioFrame _audioFrame;
-    PushResampler<int16_t> resampler_;  // ADM sample rate -> mixing rate
-    std::unique_ptr<FilePlayer> file_player_;
-    std::unique_ptr<FileRecorder> file_recorder_;
-    std::unique_ptr<FileRecorder> file_call_recorder_;
-    int _filePlayerId = 0;
-    int _fileRecorderId = 0;
-    int _fileCallRecorderId = 0;
-    bool _filePlaying = false;
-    bool _fileRecording = false;
-    bool _fileCallRecording = false;
-    voe::AudioLevel _audioLevel;
-    // protect file instances and their variables in MixedParticipants()
-    rtc::CriticalSection _critSect;
-    rtc::CriticalSection _callbackCritSect;
-
-#if WEBRTC_VOICE_ENGINE_TYPING_DETECTION
-    MonitorModule<TransmitMixer> _monitorModule;
-    webrtc::TypingDetection _typingDetection;
-    bool _typingNoiseWarningPending = false;
-    bool _typingNoiseDetected = false;
-#endif
-
-    int _instanceId = 0;
-    bool _mixFileWithMicrophone = false;
-    uint32_t _captureLevel = 0;
-    bool stereo_codec_ = false;
-    bool swap_stereo_channels_ = false;
-};
-}  // namespace voe
-}  // namespace webrtc
-
-#endif  // WEBRTC_VOICE_ENGINE_TRANSMIT_MIXER_H
diff --git a/voice_engine/transport_feedback_packet_loss_tracker.cc b/voice_engine/transport_feedback_packet_loss_tracker.cc
deleted file mode 100644
index 86ca61e..0000000
--- a/voice_engine/transport_feedback_packet_loss_tracker.cc
+++ /dev/null
@@ -1,368 +0,0 @@
-/*
- *  Copyright (c) 2017 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/voice_engine/transport_feedback_packet_loss_tracker.h"
-
-#include <limits>
-#include <utility>
-
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/transport_feedback.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/mod_ops.h"
-
-namespace {
-constexpr uint16_t kSeqNumHalf = 0x8000u;
-void UpdateCounter(size_t* counter, bool increment) {
-  if (increment) {
-    RTC_DCHECK_LT(*counter, std::numeric_limits<std::size_t>::max());
-    ++(*counter);
-  } else {
-    RTC_DCHECK_GT(*counter, 0);
-    --(*counter);
-  }
-}
-}  // namespace
-
-namespace webrtc {
-
-TransportFeedbackPacketLossTracker::TransportFeedbackPacketLossTracker(
-    int64_t max_window_size_ms,
-    size_t plr_min_num_acked_packets,
-    size_t rplr_min_num_acked_pairs)
-    : max_window_size_ms_(max_window_size_ms),
-      ref_packet_status_(packet_status_window_.begin()),
-      plr_state_(plr_min_num_acked_packets),
-      rplr_state_(rplr_min_num_acked_pairs) {
-  RTC_DCHECK_GT(max_window_size_ms, 0);
-  RTC_DCHECK_GT(plr_min_num_acked_packets, 0);
-  RTC_DCHECK_GT(rplr_min_num_acked_pairs, 0);
-  Reset();
-}
-
-void TransportFeedbackPacketLossTracker::Reset() {
-  acked_packets_ = 0;
-  plr_state_.Reset();
-  rplr_state_.Reset();
-  packet_status_window_.clear();
-  ref_packet_status_ = packet_status_window_.begin();
-}
-
-uint16_t TransportFeedbackPacketLossTracker::ReferenceSequenceNumber() const {
-  RTC_DCHECK(!packet_status_window_.empty());
-  return ref_packet_status_->first;
-}
-
-uint16_t TransportFeedbackPacketLossTracker::NewestSequenceNumber() const {
-  RTC_DCHECK(!packet_status_window_.empty());
-  return PreviousPacketStatus(packet_status_window_.end())->first;
-}
-
-void TransportFeedbackPacketLossTracker::OnPacketAdded(uint16_t seq_num,
-                                                       int64_t send_time_ms) {
-  // Sanity - time can't flow backwards.
-  RTC_DCHECK(
-      packet_status_window_.empty() ||
-      PreviousPacketStatus(packet_status_window_.end())->second.send_time_ms <=
-          send_time_ms);
-
-  if (packet_status_window_.find(seq_num) != packet_status_window_.end() ||
-      (!packet_status_window_.empty() &&
-       ForwardDiff(seq_num, NewestSequenceNumber()) <= kSeqNumHalf)) {
-    // The only way for these two to happen is when the stream lies dormant for
-    // long enough for the sequence numbers to wrap. Everything in the window in
-    // such a case would be too old to use.
-    Reset();
-  }
-
-  // Maintain a window where the newest sequence number is at most 0x7fff away
-  // from the oldest, so that would could still distinguish old/new.
-  while (!packet_status_window_.empty() &&
-         ForwardDiff(ref_packet_status_->first, seq_num) >= kSeqNumHalf) {
-    RemoveOldestPacketStatus();
-  }
-
-  SentPacket sent_packet(send_time_ms, PacketStatus::Unacked);
-  packet_status_window_.insert(packet_status_window_.end(),
-                               std::make_pair(seq_num, sent_packet));
-
-  if (packet_status_window_.size() == 1) {
-    ref_packet_status_ = packet_status_window_.cbegin();
-  }
-}
-
-void TransportFeedbackPacketLossTracker::OnPacketFeedbackVector(
-    const std::vector<PacketFeedback>& packet_feedback_vector) {
-  for (const PacketFeedback& packet : packet_feedback_vector) {
-    const auto& it = packet_status_window_.find(packet.sequence_number);
-
-    // Packets which aren't at least marked as unacked either do not belong to
-    // this media stream, or have been shifted out of window.
-    if (it == packet_status_window_.end())
-      continue;
-
-    const bool lost = packet.arrival_time_ms == PacketFeedback::kNotReceived;
-    const PacketStatus packet_status =
-        lost ? PacketStatus::Lost : PacketStatus::Received;
-
-    UpdatePacketStatus(it, packet_status);
-  }
-}
-
-rtc::Optional<float>
-TransportFeedbackPacketLossTracker::GetPacketLossRate() const {
-  return plr_state_.GetMetric();
-}
-
-rtc::Optional<float>
-TransportFeedbackPacketLossTracker::GetRecoverablePacketLossRate() const {
-  return rplr_state_.GetMetric();
-}
-
-void TransportFeedbackPacketLossTracker::UpdatePacketStatus(
-    SentPacketStatusMap::iterator it,
-    PacketStatus new_status) {
-  if (it->second.status != PacketStatus::Unacked) {
-    // Normally, packets are sent (inserted into window as "unacked"), then we
-    // receive one feedback for them.
-    // But it is possible that a packet would receive two feedbacks. Then:
-    if (it->second.status == PacketStatus::Lost &&
-        new_status == PacketStatus::Received) {
-      // If older status said that the packet was lost but newer one says it
-      // is received, we take the newer one.
-      UpdateMetrics(it, false);
-      it->second.status =
-          PacketStatus::Unacked;  // For clarity; overwritten shortly.
-    } else {
-      // If the value is unchanged or if older status said that the packet was
-      // received but the newer one says it is lost, we ignore it.
-      // The standard allows for previously-reported packets to carry
-      // no report when the reports overlap, which also looks like the
-      // packet is being reported as lost.
-      return;
-    }
-  }
-
-  // Change from UNACKED to RECEIVED/LOST.
-  it->second.status = new_status;
-  UpdateMetrics(it, true);
-
-  // Remove packets from the beginning of the window until we only hold packets,
-  // be they acked or unacked, which are not more than |max_window_size_ms|
-  // older from the newest packet. (If the packet we're now inserting into the
-  // window isn't the newest, it would not trigger any removals; the newest
-  // already removed all relevant.)
-  while (ref_packet_status_ != packet_status_window_.end() &&
-         (it->second.send_time_ms - ref_packet_status_->second.send_time_ms) >
-             max_window_size_ms_) {
-    RemoveOldestPacketStatus();
-  }
-}
-
-void TransportFeedbackPacketLossTracker::RemoveOldestPacketStatus() {
-  UpdateMetrics(ref_packet_status_, false);
-  const auto it = ref_packet_status_;
-  ref_packet_status_ = NextPacketStatus(it);
-  packet_status_window_.erase(it);
-}
-
-void TransportFeedbackPacketLossTracker::UpdateMetrics(
-    ConstPacketStatusIterator it,
-    bool apply /* false = undo */) {
-  RTC_DCHECK(it != packet_status_window_.end());
-  // Metrics are dependent on feedbacks from the other side. We don't want
-  // to update the metrics each time a packet is sent, except for the case
-  // when it shifts old sent-but-unacked-packets out of window.
-  RTC_DCHECK(!apply || it->second.status != PacketStatus::Unacked);
-
-  if (it->second.status != PacketStatus::Unacked) {
-    UpdateCounter(&acked_packets_, apply);
-  }
-
-  UpdatePlr(it, apply);
-  UpdateRplr(it, apply);
-}
-
-void TransportFeedbackPacketLossTracker::UpdatePlr(
-    ConstPacketStatusIterator it,
-    bool apply /* false = undo */) {
-  switch (it->second.status) {
-    case PacketStatus::Unacked:
-      return;
-    case PacketStatus::Received:
-      UpdateCounter(&plr_state_.num_received_packets_, apply);
-      break;
-    case PacketStatus::Lost:
-      UpdateCounter(&plr_state_.num_lost_packets_, apply);
-      break;
-    default:
-      RTC_NOTREACHED();
-  }
-}
-
-void TransportFeedbackPacketLossTracker::UpdateRplr(
-    ConstPacketStatusIterator it,
-    bool apply /* false = undo */) {
-  if (it->second.status == PacketStatus::Unacked) {
-    // Unacked packets cannot compose a pair.
-    return;
-  }
-
-  // Previous packet and current packet might compose a pair.
-  if (it != ref_packet_status_) {
-    const auto& prev = PreviousPacketStatus(it);
-    if (prev->second.status != PacketStatus::Unacked) {
-      UpdateCounter(&rplr_state_.num_acked_pairs_, apply);
-      if (prev->second.status == PacketStatus::Lost &&
-          it->second.status == PacketStatus::Received) {
-        UpdateCounter(
-            &rplr_state_.num_recoverable_losses_, apply);
-      }
-    }
-  }
-
-  // Current packet and next packet might compose a pair.
-  const auto& next = NextPacketStatus(it);
-  if (next != packet_status_window_.end() &&
-      next->second.status != PacketStatus::Unacked) {
-    UpdateCounter(&rplr_state_.num_acked_pairs_, apply);
-    if (it->second.status == PacketStatus::Lost &&
-        next->second.status == PacketStatus::Received) {
-      UpdateCounter(&rplr_state_.num_recoverable_losses_, apply);
-    }
-  }
-}
-
-TransportFeedbackPacketLossTracker::ConstPacketStatusIterator
-TransportFeedbackPacketLossTracker::PreviousPacketStatus(
-    ConstPacketStatusIterator it) const {
-  RTC_DCHECK(it != ref_packet_status_);
-  if (it == packet_status_window_.end()) {
-    // This is to make PreviousPacketStatus(packet_status_window_.end()) point
-    // to the last element.
-    it = ref_packet_status_;
-  }
-
-  if (it == packet_status_window_.begin()) {
-    // Due to the circular nature of sequence numbers, we let the iterator
-    // go to the end.
-    it = packet_status_window_.end();
-  }
-  return --it;
-}
-
-TransportFeedbackPacketLossTracker::ConstPacketStatusIterator
-TransportFeedbackPacketLossTracker::NextPacketStatus(
-    ConstPacketStatusIterator it) const {
-  RTC_DCHECK(it != packet_status_window_.end());
-  ++it;
-  if (it == packet_status_window_.end()) {
-    // Due to the circular nature of sequence numbers, we let the iterator
-    // goes back to the beginning.
-    it = packet_status_window_.begin();
-  }
-  if (it == ref_packet_status_) {
-    // This is to make the NextPacketStatus of the last element to return the
-    // beyond-the-end iterator.
-    it = packet_status_window_.end();
-  }
-  return it;
-}
-
-// TODO(minyue): This method checks the states of this class do not misbehave.
-// The method is used both in unit tests and a fuzzer test. The fuzzer test
-// is present to help finding potential errors. Once the fuzzer test shows no
-// error after long period, we can remove the fuzzer test, and move this method
-// to unit test.
-void TransportFeedbackPacketLossTracker::Validate() const {  // Testing only!
-  RTC_CHECK_EQ(plr_state_.num_received_packets_ + plr_state_.num_lost_packets_,
-               acked_packets_);
-  RTC_CHECK_LE(acked_packets_, packet_status_window_.size());
-  RTC_CHECK_LE(rplr_state_.num_recoverable_losses_,
-               rplr_state_.num_acked_pairs_);
-  RTC_CHECK_LE(rplr_state_.num_acked_pairs_, acked_packets_ - 1);
-
-  size_t unacked_packets = 0;
-  size_t received_packets = 0;
-  size_t lost_packets = 0;
-  size_t acked_pairs = 0;
-  size_t recoverable_losses = 0;
-
-  if (!packet_status_window_.empty()) {
-    ConstPacketStatusIterator it = ref_packet_status_;
-    do {
-      switch (it->second.status) {
-        case PacketStatus::Unacked:
-          ++unacked_packets;
-          break;
-        case PacketStatus::Received:
-          ++received_packets;
-          break;
-        case PacketStatus::Lost:
-          ++lost_packets;
-          break;
-        default:
-          RTC_NOTREACHED();
-      }
-
-      auto next = std::next(it);
-      if (next == packet_status_window_.end())
-        next = packet_status_window_.begin();
-
-      if (next != ref_packet_status_) {  // If we have a next packet...
-        RTC_CHECK_GE(next->second.send_time_ms, it->second.send_time_ms);
-
-        if (it->second.status != PacketStatus::Unacked &&
-            next->second.status != PacketStatus::Unacked) {
-          ++acked_pairs;
-          if (it->second.status == PacketStatus::Lost &&
-              next->second.status == PacketStatus::Received) {
-            ++recoverable_losses;
-          }
-        }
-      }
-
-      RTC_CHECK_LT(ForwardDiff(ReferenceSequenceNumber(), it->first),
-                   kSeqNumHalf);
-
-      it = next;
-    } while (it != ref_packet_status_);
-  }
-
-  RTC_CHECK_EQ(plr_state_.num_received_packets_, received_packets);
-  RTC_CHECK_EQ(plr_state_.num_lost_packets_, lost_packets);
-  RTC_CHECK_EQ(packet_status_window_.size(),
-               unacked_packets + received_packets + lost_packets);
-  RTC_CHECK_EQ(rplr_state_.num_acked_pairs_, acked_pairs);
-  RTC_CHECK_EQ(rplr_state_.num_recoverable_losses_, recoverable_losses);
-}
-
-rtc::Optional<float>
-TransportFeedbackPacketLossTracker::PlrState::GetMetric() const {
-  const size_t total = num_lost_packets_ + num_received_packets_;
-  if (total < min_num_acked_packets_) {
-    return rtc::Optional<float>();
-  } else {
-    return rtc::Optional<float>(
-        static_cast<float>(num_lost_packets_) / total);
-  }
-}
-
-rtc::Optional<float>
-TransportFeedbackPacketLossTracker::RplrState::GetMetric() const {
-  if (num_acked_pairs_ < min_num_acked_pairs_) {
-    return rtc::Optional<float>();
-  } else {
-    return rtc::Optional<float>(
-        static_cast<float>(num_recoverable_losses_) / num_acked_pairs_);
-  }
-}
-
-}  // namespace webrtc
diff --git a/voice_engine/transport_feedback_packet_loss_tracker.h b/voice_engine/transport_feedback_packet_loss_tracker.h
deleted file mode 100644
index 8168216..0000000
--- a/voice_engine/transport_feedback_packet_loss_tracker.h
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- *  Copyright (c) 2017 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_VOICE_ENGINE_TRANSPORT_FEEDBACK_PACKET_LOSS_TRACKER_H_
-#define WEBRTC_VOICE_ENGINE_TRANSPORT_FEEDBACK_PACKET_LOSS_TRACKER_H_
-
-#include <map>
-
-#include "webrtc/api/optional.h"
-#include "webrtc/modules/include/module_common_types.h"
-
-namespace webrtc {
-
-namespace rtcp {
-class TransportFeedback;
-}
-
-struct PacketFeedback;
-
-class TransportFeedbackPacketLossTracker final {
- public:
-  // * We count up to |max_window_size_ms| from the sent
-  //   time of the latest acked packet for the calculation of the metrics.
-  // * PLR (packet-loss-rate) is reliably computable once the statuses of
-  //   |plr_min_num_acked_packets| packets are known.
-  // * RPLR (recoverable-packet-loss-rate) is reliably computable once the
-  //   statuses of |rplr_min_num_acked_pairs| pairs are known.
-  TransportFeedbackPacketLossTracker(int64_t max_window_size_ms,
-                                     size_t plr_min_num_acked_packets,
-                                     size_t rplr_min_num_acked_pairs);
-
-  void OnPacketAdded(uint16_t seq_num, int64_t send_time_ms);
-
-  void OnPacketFeedbackVector(
-      const std::vector<PacketFeedback>& packet_feedbacks_vector);
-
-  // Returns the packet loss rate, if the window has enough packet statuses to
-  // reliably compute it. Otherwise, returns empty.
-  rtc::Optional<float> GetPacketLossRate() const;
-
-  // Returns the first-order-FEC recoverable packet loss rate, if the window has
-  // enough status pairs to reliably compute it. Otherwise, returns empty.
-  rtc::Optional<float> GetRecoverablePacketLossRate() const;
-
-  // Verifies that the internal states are correct. Only used for tests.
-  void Validate() const;
-
- private:
-  // When a packet is sent, we memorize its association with the stream by
-  // marking it as (sent-but-so-far-) unacked. If we ever receive a feedback
-  // that reports it as received/lost, we update the state and
-  // metrics accordingly.
-
-  enum class PacketStatus { Unacked = 0, Received = 1, Lost = 2 };
-  struct SentPacket {
-    SentPacket(int64_t send_time_ms, PacketStatus status)
-        : send_time_ms(send_time_ms), status(status) {}
-    int64_t send_time_ms;
-    PacketStatus status;
-  };
-  typedef std::map<uint16_t, SentPacket> SentPacketStatusMap;
-  typedef SentPacketStatusMap::const_iterator ConstPacketStatusIterator;
-
-  void Reset();
-
-  // ReferenceSequenceNumber() provides a sequence number that defines the
-  // order of packet reception info stored in |packet_status_window_|. In
-  // particular, given any sequence number |x|,
-  // (2^16 + x - ref_seq_num_) % 2^16 defines its actual position in
-  // |packet_status_window_|.
-  uint16_t ReferenceSequenceNumber() const;
-  uint16_t NewestSequenceNumber() const;
-  void UpdatePacketStatus(SentPacketStatusMap::iterator it,
-                          PacketStatus new_status);
-  void RemoveOldestPacketStatus();
-
-  void UpdateMetrics(ConstPacketStatusIterator it,
-                     bool apply /* false = undo */);
-  void UpdatePlr(ConstPacketStatusIterator it, bool apply /* false = undo */);
-  void UpdateRplr(ConstPacketStatusIterator it, bool apply /* false = undo */);
-
-  ConstPacketStatusIterator PreviousPacketStatus(
-      ConstPacketStatusIterator it) const;
-  ConstPacketStatusIterator NextPacketStatus(
-      ConstPacketStatusIterator it) const;
-
-  const int64_t max_window_size_ms_;
-  size_t acked_packets_;
-
-  SentPacketStatusMap packet_status_window_;
-  // |ref_packet_status_| points to the oldest item in |packet_status_window_|.
-  ConstPacketStatusIterator ref_packet_status_;
-
-  // Packet-loss-rate calculation (lost / all-known-packets).
-  struct PlrState {
-    explicit PlrState(size_t min_num_acked_packets)
-        : min_num_acked_packets_(min_num_acked_packets) {
-      Reset();
-    }
-    void Reset() {
-      num_received_packets_ = 0;
-      num_lost_packets_ = 0;
-    }
-    rtc::Optional<float> GetMetric() const;
-    const size_t min_num_acked_packets_;
-    size_t num_received_packets_;
-    size_t num_lost_packets_;
-  } plr_state_;
-
-  // Recoverable packet loss calculation (first-order-FEC recoverable).
-  struct RplrState {
-    explicit RplrState(size_t min_num_acked_pairs)
-        : min_num_acked_pairs_(min_num_acked_pairs) {
-      Reset();
-    }
-    void Reset() {
-      num_acked_pairs_ = 0;
-      num_recoverable_losses_ = 0;
-    }
-    rtc::Optional<float> GetMetric() const;
-    // Recoverable packets are those which were lost, but immediately followed
-    // by a properly received packet. If that second packet carried FEC,
-    // the data from the former (lost) packet could be recovered.
-    // The RPLR is calculated as the fraction of such pairs (lost-received) out
-    // of all pairs of consecutive acked packets.
-    const size_t min_num_acked_pairs_;
-    size_t num_acked_pairs_;
-    size_t num_recoverable_losses_;
-  } rplr_state_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_VOICE_ENGINE_TRANSPORT_FEEDBACK_PACKET_LOSS_TRACKER_H_
diff --git a/voice_engine/transport_feedback_packet_loss_tracker_unittest.cc b/voice_engine/transport_feedback_packet_loss_tracker_unittest.cc
deleted file mode 100644
index b3fa25b..0000000
--- a/voice_engine/transport_feedback_packet_loss_tracker_unittest.cc
+++ /dev/null
@@ -1,600 +0,0 @@
-/*
- *  Copyright (c) 2017 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 <limits>
-#include <memory>
-#include <numeric>
-#include <vector>
-
-#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
-#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/transport_feedback.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/test/gmock.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/voice_engine/transport_feedback_packet_loss_tracker.h"
-
-namespace webrtc {
-
-namespace {
-
-constexpr int64_t kDefaultSendIntervalMs = 10;
-constexpr int64_t kDefaultMaxWindowSizeMs = 500 * kDefaultSendIntervalMs;
-
-class TransportFeedbackPacketLossTrackerTest
-    : public ::testing::TestWithParam<uint16_t> {
- public:
-  TransportFeedbackPacketLossTrackerTest() = default;
-  virtual ~TransportFeedbackPacketLossTrackerTest() = default;
-
- protected:
-  void SendPackets(TransportFeedbackPacketLossTracker* tracker,
-                   const std::vector<uint16_t>& sequence_numbers,
-                   int64_t send_time_interval_ms,
-                   bool validate_all = true) {
-    RTC_CHECK_GE(send_time_interval_ms, 0);
-    for (uint16_t sequence_number : sequence_numbers) {
-      tracker->OnPacketAdded(sequence_number, time_ms_);
-      if (validate_all) {
-        tracker->Validate();
-      }
-      time_ms_ += send_time_interval_ms;
-    }
-
-    // We've either validated after each packet, or, for making sure the UT
-    // doesn't run too long, we might validate only at the end of the range.
-    if (!validate_all) {
-      tracker->Validate();
-    }
-  }
-
-  void SendPackets(TransportFeedbackPacketLossTracker* tracker,
-                   uint16_t first_seq_num,
-                   size_t num_of_packets,
-                   int64_t send_time_interval_ms,
-                   bool validate_all = true) {
-    RTC_CHECK_GE(send_time_interval_ms, 0);
-    std::vector<uint16_t> sequence_numbers(num_of_packets);
-    std::iota(sequence_numbers.begin(), sequence_numbers.end(), first_seq_num);
-    SendPackets(tracker, sequence_numbers, send_time_interval_ms, validate_all);
-  }
-
-  void AdvanceClock(int64_t time_delta_ms) {
-    RTC_CHECK_GT(time_delta_ms, 0);
-    time_ms_ += time_delta_ms;
-  }
-
-  void AddTransportFeedbackAndValidate(
-      TransportFeedbackPacketLossTracker* tracker,
-      uint16_t base_sequence_num,
-      const std::vector<bool>& reception_status_vec) {
-    // Any positive integer signals reception. kNotReceived signals loss.
-    // Other values are just illegal.
-    constexpr int64_t kArrivalTimeMs = 1234;
-
-    std::vector<PacketFeedback> packet_feedback_vector;
-    uint16_t seq_num = base_sequence_num;
-    for (bool received : reception_status_vec) {
-      packet_feedback_vector.emplace_back(PacketFeedback(
-          received ? kArrivalTimeMs : PacketFeedback::kNotReceived, seq_num));
-      ++seq_num;
-    }
-
-    tracker->OnPacketFeedbackVector(packet_feedback_vector);
-    tracker->Validate();
-  }
-
-  // Checks that validty is as expected. If valid, checks also that
-  // value is as expected.
-  void ValidatePacketLossStatistics(
-      const TransportFeedbackPacketLossTracker& tracker,
-      rtc::Optional<float> expected_plr,
-      rtc::Optional<float> expected_rplr) {
-    // TODO(eladalon): Comparing the rtc::Optional<float> directly would have
-    // given concise code, but less readable error messages. If we modify
-    // the way rtc::Optional is printed, we can get rid of this.
-    rtc::Optional<float> plr = tracker.GetPacketLossRate();
-    EXPECT_EQ(static_cast<bool>(expected_plr), static_cast<bool>(plr));
-    if (expected_plr && plr) {
-      EXPECT_EQ(*expected_plr, *plr);
-    }
-
-    rtc::Optional<float> rplr = tracker.GetRecoverablePacketLossRate();
-    EXPECT_EQ(static_cast<bool>(expected_rplr), static_cast<bool>(rplr));
-    if (expected_rplr && rplr) {
-      EXPECT_EQ(*expected_rplr, *rplr);
-    }
-  }
-
-  // Convenience function for when both are valid, and explicitly stating
-  // the rtc::Optional<float> constructor is just cumbersome.
-  void ValidatePacketLossStatistics(
-      const TransportFeedbackPacketLossTracker& tracker,
-      float expected_plr,
-      float expected_rplr) {
-    ValidatePacketLossStatistics(tracker, rtc::Optional<float>(expected_plr),
-                                 rtc::Optional<float>(expected_rplr));
-  }
-
-  uint16_t base_{GetParam()};
-
- private:
-  int64_t time_ms_{0};
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(TransportFeedbackPacketLossTrackerTest);
-};
-
-}  // namespace
-
-// Sanity check on an empty window.
-TEST_P(TransportFeedbackPacketLossTrackerTest, EmptyWindow) {
-  TransportFeedbackPacketLossTracker tracker(kDefaultMaxWindowSizeMs, 5, 5);
-
-  // PLR and RPLR reported as unknown before reception of first feedback.
-  ValidatePacketLossStatistics(tracker,
-                               rtc::Optional<float>(),
-                               rtc::Optional<float>());
-}
-
-// A feedback received for an empty window has no effect.
-TEST_P(TransportFeedbackPacketLossTrackerTest, EmptyWindowFeedback) {
-  TransportFeedbackPacketLossTracker tracker(kDefaultMaxWindowSizeMs, 3, 2);
-
-  // Feedback doesn't correspond to any packets - ignored.
-  AddTransportFeedbackAndValidate(&tracker, base_, {true, false, true});
-  ValidatePacketLossStatistics(tracker,
-                               rtc::Optional<float>(),
-                               rtc::Optional<float>());
-
-  // After the packets are transmitted, acking them would have an effect.
-  SendPackets(&tracker, base_, 3, kDefaultSendIntervalMs);
-  AddTransportFeedbackAndValidate(&tracker, base_, {true, false, true});
-  ValidatePacketLossStatistics(tracker, 1.0f / 3.0f, 0.5f);
-}
-
-// Sanity check on partially filled window.
-TEST_P(TransportFeedbackPacketLossTrackerTest, PartiallyFilledWindow) {
-  TransportFeedbackPacketLossTracker tracker(kDefaultMaxWindowSizeMs, 5, 4);
-
-  // PLR unknown before minimum window size reached.
-  // RPLR unknown before minimum pairs reached.
-  // Expected window contents: [] -> [1001].
-  SendPackets(&tracker, base_, 3, kDefaultSendIntervalMs);
-  AddTransportFeedbackAndValidate(&tracker, base_, {true, false, false, true});
-  ValidatePacketLossStatistics(tracker,
-                               rtc::Optional<float>(),
-                               rtc::Optional<float>());
-}
-
-// Sanity check on minimum filled window - PLR known, RPLR unknown.
-TEST_P(TransportFeedbackPacketLossTrackerTest, PlrMinimumFilledWindow) {
-  TransportFeedbackPacketLossTracker tracker(kDefaultMaxWindowSizeMs, 5, 5);
-
-  // PLR correctly calculated after minimum window size reached.
-  // RPLR not necessarily known at that time (not if min-pairs not reached).
-  // Expected window contents: [] -> [10011].
-  SendPackets(&tracker, base_, 5, kDefaultSendIntervalMs);
-  AddTransportFeedbackAndValidate(&tracker, base_,
-                                  {true, false, false, true, true});
-  ValidatePacketLossStatistics(tracker,
-                               rtc::Optional<float>(2.0f / 5.0f),
-                               rtc::Optional<float>());
-}
-
-// Sanity check on minimum filled window - PLR unknown, RPLR known.
-TEST_P(TransportFeedbackPacketLossTrackerTest, RplrMinimumFilledWindow) {
-  TransportFeedbackPacketLossTracker tracker(kDefaultMaxWindowSizeMs, 6, 4);
-
-  // RPLR correctly calculated after minimum pairs reached.
-  // PLR not necessarily known at that time (not if min window not reached).
-  // Expected window contents: [] -> [10011].
-  SendPackets(&tracker, base_, 5, kDefaultSendIntervalMs);
-  AddTransportFeedbackAndValidate(&tracker, base_,
-                                  {true, false, false, true, true});
-  ValidatePacketLossStatistics(tracker,
-                               rtc::Optional<float>(),
-                               rtc::Optional<float>(1.0f / 4.0f));
-}
-
-// If packets are sent close enough together that the clock reading for both
-// is the same, that's handled properly.
-TEST_P(TransportFeedbackPacketLossTrackerTest, SameSentTime) {
-  TransportFeedbackPacketLossTracker tracker(kDefaultMaxWindowSizeMs, 3, 2);
-
-  // Expected window contents: [] -> [101].
-  SendPackets(&tracker, base_, 3, 0);  // Note: time interval = 0ms.
-  AddTransportFeedbackAndValidate(&tracker, base_, {true, false, true});
-
-  ValidatePacketLossStatistics(tracker, 1.0f / 3.0f, 0.5f);
-}
-
-// Additional reports update PLR and RPLR.
-TEST_P(TransportFeedbackPacketLossTrackerTest, ExtendWindow) {
-  TransportFeedbackPacketLossTracker tracker(kDefaultMaxWindowSizeMs, 5, 5);
-
-  SendPackets(&tracker, base_, 25, kDefaultSendIntervalMs);
-
-  // Expected window contents: [] -> [10011].
-  AddTransportFeedbackAndValidate(&tracker, base_,
-                                  {true, false, false, true, true});
-  ValidatePacketLossStatistics(tracker,
-                               rtc::Optional<float>(2.0f / 5.0f),
-                               rtc::Optional<float>());
-
-  // Expected window contents: [10011] -> [1001110101].
-  AddTransportFeedbackAndValidate(&tracker, base_ + 5,
-                                  {true, false, true, false, true});
-  ValidatePacketLossStatistics(tracker, 4.0f / 10.0f, 3.0f / 9.0f);
-
-  // Expected window contents: [1001110101] -> [1001110101-GAP-10001].
-  AddTransportFeedbackAndValidate(&tracker, base_ + 20,
-                                  {true, false, false, false, true});
-  ValidatePacketLossStatistics(tracker, 7.0f / 15.0f, 4.0f / 13.0f);
-}
-
-// Correct calculation with different packet lengths.
-TEST_P(TransportFeedbackPacketLossTrackerTest, DifferentSentIntervals) {
-  TransportFeedbackPacketLossTracker tracker(kDefaultMaxWindowSizeMs, 5, 4);
-
-  int64_t frames[] = {20, 60, 120, 20, 60};
-  for (size_t i = 0; i < sizeof(frames) / sizeof(frames[0]); i++) {
-    SendPackets(&tracker, {static_cast<uint16_t>(base_ + i)}, frames[i]);
-  }
-
-  // Expected window contents: [] -> [10011].
-  AddTransportFeedbackAndValidate(&tracker, base_,
-                                  {true, false, false, true, true});
-  ValidatePacketLossStatistics(tracker, 2.0f / 5.0f, 1.0f / 4.0f);
-}
-
-// The window retains information up to sent times that exceed the the max
-// window size. The oldest packets get shifted out of window to make room
-// for the newer ones.
-TEST_P(TransportFeedbackPacketLossTrackerTest, MaxWindowSize) {
-  TransportFeedbackPacketLossTracker tracker(4 * kDefaultSendIntervalMs, 5, 1);
-
-  SendPackets(&tracker, base_, 6, kDefaultSendIntervalMs, true);
-
-  // Up to the maximum time-span retained (first + 4 * kDefaultSendIntervalMs).
-  // Expected window contents: [] -> [01001].
-  AddTransportFeedbackAndValidate(&tracker, base_,
-                                  {false, true, false, false, true});
-  ValidatePacketLossStatistics(tracker, 3.0f / 5.0f, 2.0f / 4.0f);
-
-  // After the maximum time-span, older entries are discarded to accommodate
-  // newer ones.
-  // Expected window contents: [01001] -> [10011].
-  AddTransportFeedbackAndValidate(&tracker, base_ + 5, {true});
-  ValidatePacketLossStatistics(tracker, 2.0f / 5.0f, 1.0f / 4.0f);
-}
-
-// All packets received.
-TEST_P(TransportFeedbackPacketLossTrackerTest, AllReceived) {
-  TransportFeedbackPacketLossTracker tracker(kDefaultMaxWindowSizeMs, 5, 4);
-
-  // Expected window contents: [] -> [11111].
-  SendPackets(&tracker, base_, 5, kDefaultSendIntervalMs);
-  AddTransportFeedbackAndValidate(&tracker, base_,
-                                  {true, true, true, true, true});
-  ValidatePacketLossStatistics(tracker, 0.0f, 0.0f);
-}
-
-// All packets lost.
-TEST_P(TransportFeedbackPacketLossTrackerTest, AllLost) {
-  TransportFeedbackPacketLossTracker tracker(kDefaultMaxWindowSizeMs, 5, 4);
-
-  // Note: The last packet in the feedback does not belong to the stream.
-  // It's only there because we're not allowed to end a feedback with a loss.
-  // Expected window contents: [] -> [00000].
-  SendPackets(&tracker, base_, 5, kDefaultSendIntervalMs);
-  AddTransportFeedbackAndValidate(&tracker, base_,
-                                  {false, false, false, false, false, true});
-  ValidatePacketLossStatistics(tracker, 1.0f, 0.0f);
-}
-
-// Repeated reports are ignored.
-TEST_P(TransportFeedbackPacketLossTrackerTest, ReportRepetition) {
-  TransportFeedbackPacketLossTracker tracker(kDefaultMaxWindowSizeMs, 5, 4);
-
-  SendPackets(&tracker, base_, 5, kDefaultSendIntervalMs);
-
-  // Expected window contents: [] -> [10011].
-  AddTransportFeedbackAndValidate(&tracker, base_,
-                                  {true, false, false, true, true});
-  ValidatePacketLossStatistics(tracker, 2.0f / 5.0f, 1.0f / 4.0f);
-
-  // Repeat entire previous feedback
-  // Expected window contents: [10011] -> [10011].
-  AddTransportFeedbackAndValidate(&tracker, base_,
-                                  {true, false, false, true, true});
-  ValidatePacketLossStatistics(tracker, 2.0f / 5.0f, 1.0f / 4.0f);
-}
-
-// Report overlap.
-TEST_P(TransportFeedbackPacketLossTrackerTest, ReportOverlap) {
-  TransportFeedbackPacketLossTracker tracker(kDefaultMaxWindowSizeMs, 5, 1);
-
-  SendPackets(&tracker, base_, 15, kDefaultSendIntervalMs);
-
-  // Expected window contents: [] -> [10011].
-  AddTransportFeedbackAndValidate(&tracker, base_,
-                                  {true, false, false, true, true});
-  ValidatePacketLossStatistics(tracker, 2.0f / 5.0f, 1.0f / 4.0f);
-
-  // Expected window contents: [10011] -> [1001101].
-  AddTransportFeedbackAndValidate(&tracker, base_ + 3,
-                                  {true, true, false, true});
-  ValidatePacketLossStatistics(tracker, 3.0f / 7.0f, 2.0f / 6.0f);
-}
-
-// Report conflict.
-TEST_P(TransportFeedbackPacketLossTrackerTest, ReportConflict) {
-  TransportFeedbackPacketLossTracker tracker(kDefaultMaxWindowSizeMs, 5, 4);
-
-  SendPackets(&tracker, base_, 15, 10);
-
-  // Expected window contents: [] -> [01001].
-  AddTransportFeedbackAndValidate(&tracker, base_,
-                                  {false, true, false, false, true});
-  ValidatePacketLossStatistics(tracker, 3.0f / 5.0f, 2.0f / 4.0f);
-
-  // Expected window contents: [01001] -> [11101].
-  // While false->true will be applied, true -> false will be ignored.
-  AddTransportFeedbackAndValidate(&tracker, base_, {true, false, true});
-  ValidatePacketLossStatistics(tracker, 1.0f / 5.0f, 1.0f / 4.0f);
-}
-
-// Skipped packets treated as unknown (not lost).
-TEST_P(TransportFeedbackPacketLossTrackerTest, SkippedPackets) {
-  TransportFeedbackPacketLossTracker tracker(200 * kDefaultSendIntervalMs, 5,
-                                             1);
-
-  SendPackets(&tracker, base_, 200, kDefaultSendIntervalMs);
-
-  // Expected window contents: [] -> [10011].
-  AddTransportFeedbackAndValidate(&tracker, base_,
-                                  {true, false, false, true, true});
-  ValidatePacketLossStatistics(tracker, 2.0f / 5.0f, 1.0f / 4.0f);
-
-  // Expected window contents: [10011] -> [10011-GAP-101].
-  AddTransportFeedbackAndValidate(&tracker, base_ + 100, {true, false, true});
-  ValidatePacketLossStatistics(tracker, 3.0f / 8.0f, 2.0f / 6.0f);
-}
-
-// Moving a window, if it excludes some old acked messages, can leave
-// in-window unacked messages intact, and ready to be used later.
-TEST_P(TransportFeedbackPacketLossTrackerTest, MovedWindowRetainsRelevantInfo) {
-  constexpr int64_t max_window_size_ms = 100;
-  TransportFeedbackPacketLossTracker tracker(max_window_size_ms, 5, 1);
-
-  // Note: All messages in this test are sent 1ms apart from each other.
-  // Therefore, the delta in sequence numbers equals the timestamps delta.
-  SendPackets(&tracker, base_, 4 * max_window_size_ms, 1);
-
-  // Expected window contents: [] -> [10101].
-  AddTransportFeedbackAndValidate(&tracker, base_,
-                                  {true, false, true, false, true});
-  ValidatePacketLossStatistics(tracker, 2.0f / 5.0f, 2.0f / 4.0f);
-
-  // Expected window contents: [10101] -> [100011].
-  const int64_t moved_oldest_acked = base_ + 2 * max_window_size_ms;
-  const std::vector<bool> feedback = {true, false, false, false, true, true};
-  AddTransportFeedbackAndValidate(&tracker, moved_oldest_acked, feedback);
-  ValidatePacketLossStatistics(tracker, 3.0f / 6.0f, 1.0f / 5.0f);
-
-  // Having acked |feedback.size()| starting with |moved_oldest_acked|, the
-  // newest of the acked ones is now:
-  const int64_t moved_newest_acked = moved_oldest_acked + feedback.size() - 1;
-
-  // Messages that *are* more than the span-limit away from the newest
-  // acked message *are* too old. Acking them would have no effect.
-  AddTransportFeedbackAndValidate(
-      &tracker, moved_newest_acked - max_window_size_ms - 1, {true});
-  ValidatePacketLossStatistics(tracker, 3.0f / 6.0f, 1.0f / 5.0f);
-
-  // Messages that are *not* more than the span-limit away from the newest
-  // acked message are *not* too old. Acking them would have an effect.
-  AddTransportFeedbackAndValidate(
-      &tracker, moved_newest_acked - max_window_size_ms, {true});
-  ValidatePacketLossStatistics(tracker, 3.0f / 7.0f, 1.0f / 5.0f);
-}
-
-// Inserting feedback into the middle of a window works correctly - can
-// complete two pairs.
-TEST_P(TransportFeedbackPacketLossTrackerTest, InsertionCompletesTwoPairs) {
-  TransportFeedbackPacketLossTracker tracker(150 * kDefaultSendIntervalMs, 5,
-                                             1);
-
-  SendPackets(&tracker, base_, 15, kDefaultSendIntervalMs);
-
-  // Expected window contents: [] -> [10111].
-  AddTransportFeedbackAndValidate(&tracker, base_,
-                                  {true, false, true, true, true});
-  ValidatePacketLossStatistics(tracker, 1.0f / 5.0f, 1.0f / 4.0f);
-
-  // Expected window contents: [10111] -> [10111-GAP-10101].
-  AddTransportFeedbackAndValidate(&tracker, base_ + 7,
-                                  {true, false, true, false, true});
-  ValidatePacketLossStatistics(tracker, 3.0f / 10.0f, 3.0f / 8.0f);
-
-  // Insert in between, closing the gap completely.
-  // Expected window contents: [10111-GAP-10101] -> [101110110101].
-  AddTransportFeedbackAndValidate(&tracker, base_ + 5, {false, true});
-  ValidatePacketLossStatistics(tracker, 4.0f / 12.0f, 4.0f / 11.0f);
-}
-
-// Sequence number gaps are not gaps in reception. However, gaps in reception
-// are still possible, if a packet which WAS sent on the stream is not acked.
-TEST_P(TransportFeedbackPacketLossTrackerTest, SanityGapsInSequenceNumbers) {
-  TransportFeedbackPacketLossTracker tracker(50 * kDefaultSendIntervalMs, 5, 1);
-
-  SendPackets(&tracker,
-              {static_cast<uint16_t>(base_),
-               static_cast<uint16_t>(base_ + 2),
-               static_cast<uint16_t>(base_ + 4),
-               static_cast<uint16_t>(base_ + 6),
-               static_cast<uint16_t>(base_ + 8)},
-              kDefaultSendIntervalMs);
-
-  // Gaps in sequence numbers not considered as gaps in window, because  only
-  // those sequence numbers which were associated with the stream count.
-  // Expected window contents: [] -> [11011].
-  AddTransportFeedbackAndValidate(
-      // Note: Left packets belong to this stream, right ones ignored.
-      &tracker, base_, {true, false,
-                        true, false,
-                        false, false,
-                        true, false,
-                        true, true});
-  ValidatePacketLossStatistics(tracker, 1.0f / 5.0f, 1.0f / 4.0f);
-
-  // Create gap by sending [base + 10] but not acking it.
-  // Note: Acks for [base + 11] and [base + 13] ignored (other stream).
-  // Expected window contents: [11011] -> [11011-GAP-01].
-  SendPackets(&tracker,
-              {static_cast<uint16_t>(base_ + 10),
-               static_cast<uint16_t>(base_ + 12),
-               static_cast<uint16_t>(base_ + 14)},
-              kDefaultSendIntervalMs);
-  AddTransportFeedbackAndValidate(&tracker, base_ + 11,
-                                  {false, false, false, true, true});
-  ValidatePacketLossStatistics(tracker, 2.0f / 7.0f, 2.0f / 5.0f);
-}
-
-// The window cannot span more than 0x8000 in sequence numbers, regardless
-// of time stamps and ack/unacked status.
-TEST_P(TransportFeedbackPacketLossTrackerTest, MaxUnackedPackets) {
-  TransportFeedbackPacketLossTracker tracker(0x10000, 4, 1);
-
-  SendPackets(&tracker, base_, 0x2000, 1, false);
-
-  // Expected window contents: [] -> [10011].
-  AddTransportFeedbackAndValidate(&tracker, base_,
-                                  {true, false, false, true, true});
-  ValidatePacketLossStatistics(tracker, 2.0f / 5.0f, 1.0f / 4.0f);
-
-  // Sending more unacked packets, up to 0x7fff from the base, does not
-  // move the window or discard any information.
-  SendPackets(&tracker, static_cast<uint16_t>(base_ + 0x8000 - 0x2000), 0x2000,
-              1, false);
-  ValidatePacketLossStatistics(tracker, 2.0f / 5.0f, 1.0f / 4.0f);
-
-  // Sending more unacked packets, up to 0x7fff from the base, does not
-  // move the window or discard any information.
-  // Expected window contents: [10011] -> [0011].
-  SendPackets(&tracker, static_cast<uint16_t>(base_ + 0x8000), 1, 1);
-  ValidatePacketLossStatistics(tracker, 2.0f / 4.0f, 1.0f / 3.0f);
-}
-
-// The window holds acked packets up until the difference in timestamps between
-// the oldest and newest reaches the configured maximum. Once this maximum
-// is exceeded, old packets are shifted out of window until the maximum is
-// once again observed.
-TEST_P(TransportFeedbackPacketLossTrackerTest, TimeDifferenceMaximumObserved) {
-  constexpr int64_t max_window_size_ms = 500;
-  TransportFeedbackPacketLossTracker tracker(max_window_size_ms, 3, 1);
-
-  // Note: All messages in this test are sent 1ms apart from each other.
-  // Therefore, the delta in sequence numbers equals the timestamps delta.
-
-  // Baseline - window has acked messages.
-  // Expected window contents: [] -> [01101].
-  const std::vector<bool> feedback = {false, true, true, false, true};
-  SendPackets(&tracker, base_, feedback.size(), 1);
-  AddTransportFeedbackAndValidate(&tracker, base_, feedback);
-  ValidatePacketLossStatistics(tracker, 2.0f / 5.0f, 2.0f / 4.0f);
-
-  // Test - window base not moved.
-  // Expected window contents: [01101] -> [011011].
-  AdvanceClock(max_window_size_ms - feedback.size());
-  SendPackets(&tracker, static_cast<uint16_t>(base_ + feedback.size()), 1, 1);
-  AddTransportFeedbackAndValidate(
-      &tracker, static_cast<uint16_t>(base_ + feedback.size()), {true});
-  ValidatePacketLossStatistics(tracker, 2.0f / 6.0f, 2.0f / 5.0f);
-
-  // Another packet, sent 1ms later, would already be too late. The window will
-  // be moved, but only after the ACK is received.
-  const uint16_t new_packet_seq_num =
-      static_cast<uint16_t>(base_ + feedback.size() + 1);
-  SendPackets(&tracker, {new_packet_seq_num}, 1);
-  ValidatePacketLossStatistics(tracker, 2.0f / 6.0f, 2.0f / 5.0f);
-  // Expected window contents: [011011] -> [110111].
-  AddTransportFeedbackAndValidate(&tracker, new_packet_seq_num, {true});
-  ValidatePacketLossStatistics(tracker, 1.0f / 6.0f, 1.0f / 5.0f);
-}
-
-TEST_P(TransportFeedbackPacketLossTrackerTest, RepeatedSeqNumResetsWindow) {
-  TransportFeedbackPacketLossTracker tracker(50 * kDefaultSendIntervalMs, 2, 1);
-
-  // Baseline - window has acked messages.
-  // Expected window contents: [] -> [01101].
-  SendPackets(&tracker, base_, 5, kDefaultSendIntervalMs);
-  AddTransportFeedbackAndValidate(&tracker, base_,
-                                  {false, true, true, false, true});
-  ValidatePacketLossStatistics(tracker, 2.0f / 5.0f, 2.0f / 4.0f);
-
-  // A reset occurs.
-  SendPackets(&tracker, {static_cast<uint16_t>(base_ + 2)},
-              kDefaultSendIntervalMs);
-  ValidatePacketLossStatistics(tracker,
-                               rtc::Optional<float>(),
-                               rtc::Optional<float>());
-}
-
-// The window is reset by the sending of a packet which is 0x8000 or more
-// away from the newest packet acked/unacked packet.
-TEST_P(TransportFeedbackPacketLossTrackerTest,
-       SendAfterLongSuspensionResetsWindow) {
-  TransportFeedbackPacketLossTracker tracker(50 * kDefaultSendIntervalMs, 2, 1);
-
-  // Baseline - window has acked messages.
-  // Expected window contents: [] -> [01101].
-  SendPackets(&tracker, base_, 5, kDefaultSendIntervalMs);
-  AddTransportFeedbackAndValidate(&tracker, base_,
-                                  {false, true, true, false, true});
-  ValidatePacketLossStatistics(tracker, 2.0f / 5.0f, 2.0f / 4.0f);
-
-  // A reset occurs.
-  SendPackets(&tracker, {static_cast<uint16_t>(base_ + 5 + 0x8000)},
-              kDefaultSendIntervalMs);
-  ValidatePacketLossStatistics(tracker,
-                               rtc::Optional<float>(),
-                               rtc::Optional<float>());
-}
-
-#if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID)
-TEST(TransportFeedbackPacketLossTrackerTest, InvalidConfigMaxWindowSize) {
-  EXPECT_DEATH(TransportFeedbackPacketLossTracker tracker(0, 20, 10), "");
-}
-
-TEST(TransportFeedbackPacketLossTrackerTest, InvalidConfigPlrMinAcked) {
-  EXPECT_DEATH(TransportFeedbackPacketLossTracker tracker(5000, 0, 10), "");
-}
-
-TEST(TransportFeedbackPacketLossTrackerTest, InvalidConfigRplrMinPairs) {
-  EXPECT_DEATH(TransportFeedbackPacketLossTracker tracker(5000, 20, 0), "");
-}
-
-TEST(TransportFeedbackPacketLossTrackerTest, TimeCantFlowBackwards) {
-  TransportFeedbackPacketLossTracker tracker(5000, 2, 1);
-  tracker.OnPacketAdded(100, 0);
-  tracker.OnPacketAdded(101, 2);
-  EXPECT_DEATH(tracker.OnPacketAdded(102, 1), "");
-}
-#endif
-
-// All tests are run multiple times with various baseline sequence number,
-// to weed out potential bugs with wrap-around handling.
-constexpr uint16_t kBases[] = {0x0000, 0x3456, 0xc032, 0xfffe};
-
-INSTANTIATE_TEST_CASE_P(_,
-                        TransportFeedbackPacketLossTrackerTest,
-                        testing::ValuesIn(kBases));
-
-}  // namespace webrtc
diff --git a/voice_engine/utility.cc b/voice_engine/utility.cc
deleted file mode 100644
index 345acbd..0000000
--- a/voice_engine/utility.cc
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- *  Copyright (c) 2012 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/voice_engine/utility.h"
-
-#include "webrtc/audio/utility/audio_frame_operations.h"
-#include "webrtc/common_audio/resampler/include/push_resampler.h"
-#include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
-#include "webrtc/common_types.h"
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/voice_engine/voice_engine_defines.h"
-
-namespace webrtc {
-namespace voe {
-
-void RemixAndResample(const AudioFrame& src_frame,
-                      PushResampler<int16_t>* resampler,
-                      AudioFrame* dst_frame) {
-  RemixAndResample(src_frame.data(), src_frame.samples_per_channel_,
-                   src_frame.num_channels_, src_frame.sample_rate_hz_,
-                   resampler, dst_frame);
-  dst_frame->timestamp_ = src_frame.timestamp_;
-  dst_frame->elapsed_time_ms_ = src_frame.elapsed_time_ms_;
-  dst_frame->ntp_time_ms_ = src_frame.ntp_time_ms_;
-}
-
-void RemixAndResample(const int16_t* src_data,
-                      size_t samples_per_channel,
-                      size_t num_channels,
-                      int sample_rate_hz,
-                      PushResampler<int16_t>* resampler,
-                      AudioFrame* dst_frame) {
-  const int16_t* audio_ptr = src_data;
-  size_t audio_ptr_num_channels = num_channels;
-  int16_t downmixed_audio[AudioFrame::kMaxDataSizeSamples];
-
-  // Downmix before resampling.
-  if (num_channels > dst_frame->num_channels_) {
-    RTC_DCHECK(num_channels == 2 || num_channels == 4)
-        << "num_channels: " << num_channels;
-    RTC_DCHECK(dst_frame->num_channels_ == 1 || dst_frame->num_channels_ == 2)
-        << "dst_frame->num_channels_: " << dst_frame->num_channels_;
-
-    AudioFrameOperations::DownmixChannels(
-        src_data, num_channels, samples_per_channel, dst_frame->num_channels_,
-        downmixed_audio);
-    audio_ptr = downmixed_audio;
-    audio_ptr_num_channels = dst_frame->num_channels_;
-  }
-
-  if (resampler->InitializeIfNeeded(sample_rate_hz, dst_frame->sample_rate_hz_,
-                                    audio_ptr_num_channels) == -1) {
-    FATAL() << "InitializeIfNeeded failed: sample_rate_hz = " << sample_rate_hz
-            << ", dst_frame->sample_rate_hz_ = " << dst_frame->sample_rate_hz_
-            << ", audio_ptr_num_channels = " << audio_ptr_num_channels;
-  }
-
-  // TODO(yujo): for muted input frames, don't resample. Either 1) allow
-  // resampler to return output length without doing the resample, so we know
-  // how much to zero here; or 2) make resampler accept a hint that the input is
-  // zeroed.
-  const size_t src_length = samples_per_channel * audio_ptr_num_channels;
-  int out_length = resampler->Resample(audio_ptr, src_length,
-                                       dst_frame->mutable_data(),
-                                       AudioFrame::kMaxDataSizeSamples);
-  if (out_length == -1) {
-    FATAL() << "Resample failed: audio_ptr = " << audio_ptr
-            << ", src_length = " << src_length
-            << ", dst_frame->mutable_data() = " << dst_frame->mutable_data();
-  }
-  dst_frame->samples_per_channel_ = out_length / audio_ptr_num_channels;
-
-  // Upmix after resampling.
-  if (num_channels == 1 && dst_frame->num_channels_ == 2) {
-    // The audio in dst_frame really is mono at this point; MonoToStereo will
-    // set this back to stereo.
-    dst_frame->num_channels_ = 1;
-    AudioFrameOperations::MonoToStereo(dst_frame);
-  }
-}
-
-void MixWithSat(int16_t target[],
-                size_t target_channel,
-                const int16_t source[],
-                size_t source_channel,
-                size_t source_len) {
-  RTC_DCHECK_GE(target_channel, 1);
-  RTC_DCHECK_LE(target_channel, 2);
-  RTC_DCHECK_GE(source_channel, 1);
-  RTC_DCHECK_LE(source_channel, 2);
-
-  if (target_channel == 2 && source_channel == 1) {
-    // Convert source from mono to stereo.
-    int32_t left = 0;
-    int32_t right = 0;
-    for (size_t i = 0; i < source_len; ++i) {
-      left = source[i] + target[i * 2];
-      right = source[i] + target[i * 2 + 1];
-      target[i * 2] = WebRtcSpl_SatW32ToW16(left);
-      target[i * 2 + 1] = WebRtcSpl_SatW32ToW16(right);
-    }
-  } else if (target_channel == 1 && source_channel == 2) {
-    // Convert source from stereo to mono.
-    int32_t temp = 0;
-    for (size_t i = 0; i < source_len / 2; ++i) {
-      temp = ((source[i * 2] + source[i * 2 + 1]) >> 1) + target[i];
-      target[i] = WebRtcSpl_SatW32ToW16(temp);
-    }
-  } else {
-    int32_t temp = 0;
-    for (size_t i = 0; i < source_len; ++i) {
-      temp = source[i] + target[i];
-      target[i] = WebRtcSpl_SatW32ToW16(temp);
-    }
-  }
-}
-
-}  // namespace voe
-}  // namespace webrtc
diff --git a/voice_engine/utility.h b/voice_engine/utility.h
deleted file mode 100644
index 4139f05..0000000
--- a/voice_engine/utility.h
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- *  Copyright (c) 2012 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.
- */
-
-/*
- *  Contains functions often used by different parts of VoiceEngine.
- */
-
-#ifndef WEBRTC_VOICE_ENGINE_UTILITY_H_
-#define WEBRTC_VOICE_ENGINE_UTILITY_H_
-
-#include "webrtc/common_audio/resampler/include/push_resampler.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-class AudioFrame;
-
-namespace voe {
-
-// Upmix or downmix and resample the audio to |dst_frame|. Expects |dst_frame|
-// to have its sample rate and channels members set to the desired values.
-// Updates the |samples_per_channel_| member accordingly.
-//
-// This version has an AudioFrame |src_frame| as input and sets the output
-// |timestamp_|, |elapsed_time_ms_| and |ntp_time_ms_| members equals to the
-// input ones.
-void RemixAndResample(const AudioFrame& src_frame,
-                      PushResampler<int16_t>* resampler,
-                      AudioFrame* dst_frame);
-
-// This version has a pointer to the samples |src_data| as input and receives
-// |samples_per_channel|, |num_channels| and |sample_rate_hz| of the data as
-// parameters.
-void RemixAndResample(const int16_t* src_data,
-                      size_t samples_per_channel,
-                      size_t num_channels,
-                      int sample_rate_hz,
-                      PushResampler<int16_t>* resampler,
-                      AudioFrame* dst_frame);
-
-void MixWithSat(int16_t target[],
-                size_t target_channel,
-                const int16_t source[],
-                size_t source_channel,
-                size_t source_len);
-
-}  // namespace voe
-}  // namespace webrtc
-
-#endif  // WEBRTC_VOICE_ENGINE_UTILITY_H_
diff --git a/voice_engine/utility_unittest.cc b/voice_engine/utility_unittest.cc
deleted file mode 100644
index fc4f399..0000000
--- a/voice_engine/utility_unittest.cc
+++ /dev/null
@@ -1,276 +0,0 @@
-/*
- *  Copyright (c) 2012 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 <math.h>
-
-#include "webrtc/common_audio/resampler/include/push_resampler.h"
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/rtc_base/arraysize.h"
-#include "webrtc/rtc_base/format_macros.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/voice_engine/utility.h"
-#include "webrtc/voice_engine/voice_engine_defines.h"
-
-namespace webrtc {
-namespace voe {
-namespace {
-
-class UtilityTest : public ::testing::Test {
- protected:
-  UtilityTest() {
-    src_frame_.sample_rate_hz_ = 16000;
-    src_frame_.samples_per_channel_ = src_frame_.sample_rate_hz_ / 100;
-    src_frame_.num_channels_ = 1;
-    dst_frame_.CopyFrom(src_frame_);
-    golden_frame_.CopyFrom(src_frame_);
-  }
-
-  void RunResampleTest(int src_channels,
-                       int src_sample_rate_hz,
-                       int dst_channels,
-                       int dst_sample_rate_hz);
-
-  PushResampler<int16_t> resampler_;
-  AudioFrame src_frame_;
-  AudioFrame dst_frame_;
-  AudioFrame golden_frame_;
-};
-
-// Sets the signal value to increase by |data| with every sample. Floats are
-// used so non-integer values result in rounding error, but not an accumulating
-// error.
-void SetMonoFrame(float data, int sample_rate_hz, AudioFrame* frame) {
-  frame->Mute();
-  frame->num_channels_ = 1;
-  frame->sample_rate_hz_ = sample_rate_hz;
-  frame->samples_per_channel_ = rtc::CheckedDivExact(sample_rate_hz, 100);
-  int16_t* frame_data = frame->mutable_data();
-  for (size_t i = 0; i < frame->samples_per_channel_; i++) {
-    frame_data[i] = static_cast<int16_t>(data * i);
-  }
-}
-
-// Keep the existing sample rate.
-void SetMonoFrame(float data, AudioFrame* frame) {
-  SetMonoFrame(data, frame->sample_rate_hz_, frame);
-}
-
-// Sets the signal value to increase by |left| and |right| with every sample in
-// each channel respectively.
-void SetStereoFrame(float left,
-                    float right,
-                    int sample_rate_hz,
-                    AudioFrame* frame) {
-  frame->Mute();
-  frame->num_channels_ = 2;
-  frame->sample_rate_hz_ = sample_rate_hz;
-  frame->samples_per_channel_ = rtc::CheckedDivExact(sample_rate_hz, 100);
-  int16_t* frame_data = frame->mutable_data();
-  for (size_t i = 0; i < frame->samples_per_channel_; i++) {
-    frame_data[i * 2] = static_cast<int16_t>(left * i);
-    frame_data[i * 2 + 1] = static_cast<int16_t>(right * i);
-  }
-}
-
-// Keep the existing sample rate.
-void SetStereoFrame(float left, float right, AudioFrame* frame) {
-  SetStereoFrame(left, right, frame->sample_rate_hz_, frame);
-}
-
-// Sets the signal value to increase by |ch1|, |ch2|, |ch3|, |ch4| with every
-// sample in each channel respectively.
-void SetQuadFrame(float ch1,
-                  float ch2,
-                  float ch3,
-                  float ch4,
-                  int sample_rate_hz,
-                  AudioFrame* frame) {
-  frame->Mute();
-  frame->num_channels_ = 4;
-  frame->sample_rate_hz_ = sample_rate_hz;
-  frame->samples_per_channel_ = rtc::CheckedDivExact(sample_rate_hz, 100);
-  int16_t* frame_data = frame->mutable_data();
-  for (size_t i = 0; i < frame->samples_per_channel_; i++) {
-    frame_data[i * 4] = static_cast<int16_t>(ch1 * i);
-    frame_data[i * 4 + 1] = static_cast<int16_t>(ch2 * i);
-    frame_data[i * 4 + 2] = static_cast<int16_t>(ch3 * i);
-    frame_data[i * 4 + 3] = static_cast<int16_t>(ch4 * i);
-  }
-}
-
-void VerifyParams(const AudioFrame& ref_frame, const AudioFrame& test_frame) {
-  EXPECT_EQ(ref_frame.num_channels_, test_frame.num_channels_);
-  EXPECT_EQ(ref_frame.samples_per_channel_, test_frame.samples_per_channel_);
-  EXPECT_EQ(ref_frame.sample_rate_hz_, test_frame.sample_rate_hz_);
-}
-
-// Computes the best SNR based on the error between |ref_frame| and
-// |test_frame|. It allows for up to a |max_delay| in samples between the
-// signals to compensate for the resampling delay.
-float ComputeSNR(const AudioFrame& ref_frame, const AudioFrame& test_frame,
-                 size_t max_delay) {
-  VerifyParams(ref_frame, test_frame);
-  float best_snr = 0;
-  size_t best_delay = 0;
-  for (size_t delay = 0; delay <= max_delay; delay++) {
-    float mse = 0;
-    float variance = 0;
-    const int16_t* ref_frame_data = ref_frame.data();
-    const int16_t* test_frame_data = test_frame.data();
-    for (size_t i = 0; i < ref_frame.samples_per_channel_ *
-        ref_frame.num_channels_ - delay; i++) {
-      int error = ref_frame_data[i] - test_frame_data[i + delay];
-      mse += error * error;
-      variance += ref_frame_data[i] * ref_frame_data[i];
-    }
-    float snr = 100;  // We assign 100 dB to the zero-error case.
-    if (mse > 0)
-      snr = 10 * log10(variance / mse);
-    if (snr > best_snr) {
-      best_snr = snr;
-      best_delay = delay;
-    }
-  }
-  printf("SNR=%.1f dB at delay=%" PRIuS "\n", best_snr, best_delay);
-  return best_snr;
-}
-
-void VerifyFramesAreEqual(const AudioFrame& ref_frame,
-                          const AudioFrame& test_frame) {
-  VerifyParams(ref_frame, test_frame);
-  const int16_t* ref_frame_data = ref_frame.data();
-  const int16_t* test_frame_data  = test_frame.data();
-  for (size_t i = 0;
-       i < ref_frame.samples_per_channel_ * ref_frame.num_channels_; i++) {
-    EXPECT_EQ(ref_frame_data[i], test_frame_data[i]);
-  }
-}
-
-void UtilityTest::RunResampleTest(int src_channels,
-                                  int src_sample_rate_hz,
-                                  int dst_channels,
-                                  int dst_sample_rate_hz) {
-  PushResampler<int16_t> resampler;  // Create a new one with every test.
-  const int16_t kSrcCh1 = 30;  // Shouldn't overflow for any used sample rate.
-  const int16_t kSrcCh2 = 15;
-  const int16_t kSrcCh3 = 22;
-  const int16_t kSrcCh4 = 8;
-  const float resampling_factor = (1.0 * src_sample_rate_hz) /
-      dst_sample_rate_hz;
-  const float dst_ch1 = resampling_factor * kSrcCh1;
-  const float dst_ch2 = resampling_factor * kSrcCh2;
-  const float dst_ch3 = resampling_factor * kSrcCh3;
-  const float dst_ch4 = resampling_factor * kSrcCh4;
-  const float dst_stereo_to_mono = (dst_ch1 + dst_ch2) / 2;
-  const float dst_quad_to_mono = (dst_ch1 + dst_ch2 + dst_ch3 + dst_ch4) / 4;
-  const float dst_quad_to_stereo_ch1 = (dst_ch1 + dst_ch2) / 2;
-  const float dst_quad_to_stereo_ch2 = (dst_ch3 + dst_ch4) / 2;
-  if (src_channels == 1)
-    SetMonoFrame(kSrcCh1, src_sample_rate_hz, &src_frame_);
-  else if (src_channels == 2)
-    SetStereoFrame(kSrcCh1, kSrcCh2, src_sample_rate_hz, &src_frame_);
-  else
-    SetQuadFrame(kSrcCh1, kSrcCh2, kSrcCh3, kSrcCh4, src_sample_rate_hz,
-                 &src_frame_);
-
-  if (dst_channels == 1) {
-    SetMonoFrame(0, dst_sample_rate_hz, &dst_frame_);
-    if (src_channels == 1)
-      SetMonoFrame(dst_ch1, dst_sample_rate_hz, &golden_frame_);
-    else if (src_channels == 2)
-      SetMonoFrame(dst_stereo_to_mono, dst_sample_rate_hz, &golden_frame_);
-    else
-      SetMonoFrame(dst_quad_to_mono, dst_sample_rate_hz, &golden_frame_);
-  } else {
-    SetStereoFrame(0, 0, dst_sample_rate_hz, &dst_frame_);
-    if (src_channels == 1)
-      SetStereoFrame(dst_ch1, dst_ch1, dst_sample_rate_hz, &golden_frame_);
-    else if (src_channels == 2)
-      SetStereoFrame(dst_ch1, dst_ch2, dst_sample_rate_hz, &golden_frame_);
-    else
-      SetStereoFrame(dst_quad_to_stereo_ch1, dst_quad_to_stereo_ch2,
-                     dst_sample_rate_hz, &golden_frame_);
-  }
-
-  // The sinc resampler has a known delay, which we compute here. Multiplying by
-  // two gives us a crude maximum for any resampling, as the old resampler
-  // typically (but not always) has lower delay.
-  static const size_t kInputKernelDelaySamples = 16;
-  const size_t max_delay = static_cast<size_t>(
-      static_cast<double>(dst_sample_rate_hz) / src_sample_rate_hz *
-      kInputKernelDelaySamples * dst_channels * 2);
-  printf("(%d, %d Hz) -> (%d, %d Hz) ",  // SNR reported on the same line later.
-      src_channels, src_sample_rate_hz, dst_channels, dst_sample_rate_hz);
-  RemixAndResample(src_frame_, &resampler, &dst_frame_);
-
-  if (src_sample_rate_hz == 96000 && dst_sample_rate_hz == 8000) {
-    // The sinc resampler gives poor SNR at this extreme conversion, but we
-    // expect to see this rarely in practice.
-    EXPECT_GT(ComputeSNR(golden_frame_, dst_frame_, max_delay), 14.0f);
-  } else {
-    EXPECT_GT(ComputeSNR(golden_frame_, dst_frame_, max_delay), 46.0f);
-  }
-}
-
-TEST_F(UtilityTest, RemixAndResampleCopyFrameSucceeds) {
-  // Stereo -> stereo.
-  SetStereoFrame(10, 10, &src_frame_);
-  SetStereoFrame(0, 0, &dst_frame_);
-  RemixAndResample(src_frame_, &resampler_, &dst_frame_);
-  VerifyFramesAreEqual(src_frame_, dst_frame_);
-
-  // Mono -> mono.
-  SetMonoFrame(20, &src_frame_);
-  SetMonoFrame(0, &dst_frame_);
-  RemixAndResample(src_frame_, &resampler_, &dst_frame_);
-  VerifyFramesAreEqual(src_frame_, dst_frame_);
-}
-
-TEST_F(UtilityTest, RemixAndResampleMixingOnlySucceeds) {
-  // Stereo -> mono.
-  SetStereoFrame(0, 0, &dst_frame_);
-  SetMonoFrame(10, &src_frame_);
-  SetStereoFrame(10, 10, &golden_frame_);
-  RemixAndResample(src_frame_, &resampler_, &dst_frame_);
-  VerifyFramesAreEqual(dst_frame_, golden_frame_);
-
-  // Mono -> stereo.
-  SetMonoFrame(0, &dst_frame_);
-  SetStereoFrame(10, 20, &src_frame_);
-  SetMonoFrame(15, &golden_frame_);
-  RemixAndResample(src_frame_, &resampler_, &dst_frame_);
-  VerifyFramesAreEqual(golden_frame_, dst_frame_);
-}
-
-TEST_F(UtilityTest, RemixAndResampleSucceeds) {
-  const int kSampleRates[] = {8000, 16000, 32000, 44100, 48000, 96000};
-  const int kSampleRatesSize = arraysize(kSampleRates);
-  const int kSrcChannels[] = {1, 2, 4};
-  const int kSrcChannelsSize = arraysize(kSrcChannels);
-  const int kDstChannels[] = {1, 2};
-  const int kDstChannelsSize = arraysize(kDstChannels);
-
-  for (int src_rate = 0; src_rate < kSampleRatesSize; src_rate++) {
-    for (int dst_rate = 0; dst_rate < kSampleRatesSize; dst_rate++) {
-      for (int src_channel = 0; src_channel < kSrcChannelsSize;
-           src_channel++) {
-        for (int dst_channel = 0; dst_channel < kDstChannelsSize;
-             dst_channel++) {
-          RunResampleTest(kSrcChannels[src_channel], kSampleRates[src_rate],
-                          kDstChannels[dst_channel], kSampleRates[dst_rate]);
-        }
-      }
-    }
-  }
-}
-
-}  // namespace
-}  // namespace voe
-}  // namespace webrtc
diff --git a/voice_engine/voe_base_impl.cc b/voice_engine/voe_base_impl.cc
deleted file mode 100644
index 51585a0..0000000
--- a/voice_engine/voe_base_impl.cc
+++ /dev/null
@@ -1,748 +0,0 @@
-/*
- *  Copyright (c) 2012 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/voice_engine/voe_base_impl.h"
-
-#include "webrtc/api/audio_codecs/builtin_audio_decoder_factory.h"
-#include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
-#include "webrtc/modules/audio_coding/include/audio_coding_module.h"
-#include "webrtc/modules/audio_device/audio_device_impl.h"
-#include "webrtc/modules/audio_processing/include/audio_processing.h"
-#include "webrtc/rtc_base/format_macros.h"
-#include "webrtc/rtc_base/location.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/system_wrappers/include/file_wrapper.h"
-#include "webrtc/voice_engine/channel.h"
-#include "webrtc/voice_engine/include/voe_errors.h"
-#include "webrtc/voice_engine/output_mixer.h"
-#include "webrtc/voice_engine/transmit_mixer.h"
-#include "webrtc/voice_engine/utility.h"
-#include "webrtc/voice_engine/voice_engine_impl.h"
-
-namespace webrtc {
-
-VoEBase* VoEBase::GetInterface(VoiceEngine* voiceEngine) {
-  if (nullptr == voiceEngine) {
-    return nullptr;
-  }
-  VoiceEngineImpl* s = static_cast<VoiceEngineImpl*>(voiceEngine);
-  s->AddRef();
-  return s;
-}
-
-VoEBaseImpl::VoEBaseImpl(voe::SharedData* shared)
-    : voiceEngineObserverPtr_(nullptr),
-      shared_(shared) {}
-
-VoEBaseImpl::~VoEBaseImpl() {
-  TerminateInternal();
-}
-
-void VoEBaseImpl::OnErrorIsReported(const ErrorCode error) {
-  rtc::CritScope cs(&callbackCritSect_);
-  int errCode = 0;
-  if (error == AudioDeviceObserver::kRecordingError) {
-    errCode = VE_RUNTIME_REC_ERROR;
-    LOG_F(LS_ERROR) << "VE_RUNTIME_REC_ERROR";
-  } else if (error == AudioDeviceObserver::kPlayoutError) {
-    errCode = VE_RUNTIME_PLAY_ERROR;
-    LOG_F(LS_ERROR) << "VE_RUNTIME_PLAY_ERROR";
-  }
-  if (voiceEngineObserverPtr_) {
-    // Deliver callback (-1 <=> no channel dependency)
-    voiceEngineObserverPtr_->CallbackOnError(-1, errCode);
-  }
-}
-
-void VoEBaseImpl::OnWarningIsReported(const WarningCode warning) {
-  rtc::CritScope cs(&callbackCritSect_);
-  int warningCode = 0;
-  if (warning == AudioDeviceObserver::kRecordingWarning) {
-    warningCode = VE_RUNTIME_REC_WARNING;
-    LOG_F(LS_WARNING) << "VE_RUNTIME_REC_WARNING";
-  } else if (warning == AudioDeviceObserver::kPlayoutWarning) {
-    warningCode = VE_RUNTIME_PLAY_WARNING;
-    LOG_F(LS_WARNING) << "VE_RUNTIME_PLAY_WARNING";
-  }
-  if (voiceEngineObserverPtr_) {
-    // Deliver callback (-1 <=> no channel dependency)
-    voiceEngineObserverPtr_->CallbackOnError(-1, warningCode);
-  }
-}
-
-int32_t VoEBaseImpl::RecordedDataIsAvailable(
-    const void* audio_data,
-    const size_t number_of_frames,
-    const size_t bytes_per_sample,
-    const size_t number_of_channels,
-    const uint32_t sample_rate,
-    const uint32_t audio_delay_milliseconds,
-    const int32_t clock_drift,
-    const uint32_t volume,
-    const bool key_pressed,
-    uint32_t& new_mic_volume) {
-  RTC_DCHECK_EQ(2 * number_of_channels, bytes_per_sample);
-  RTC_DCHECK(shared_->transmit_mixer() != nullptr);
-  RTC_DCHECK(shared_->audio_device() != nullptr);
-
-  uint32_t max_volume = 0;
-  uint16_t voe_mic_level = 0;
-  // Check for zero to skip this calculation; the consumer may use this to
-  // indicate no volume is available.
-  if (volume != 0) {
-    // Scale from ADM to VoE level range
-    if (shared_->audio_device()->MaxMicrophoneVolume(&max_volume) == 0) {
-      if (max_volume) {
-        voe_mic_level = static_cast<uint16_t>(
-            (volume * kMaxVolumeLevel + static_cast<int>(max_volume / 2)) /
-            max_volume);
-      }
-    }
-    // We learned that on certain systems (e.g Linux) the voe_mic_level
-    // can be greater than the maxVolumeLevel therefore
-    // we are going to cap the voe_mic_level to the maxVolumeLevel
-    // and change the maxVolume to volume if it turns out that
-    // the voe_mic_level is indeed greater than the maxVolumeLevel.
-    if (voe_mic_level > kMaxVolumeLevel) {
-      voe_mic_level = kMaxVolumeLevel;
-      max_volume = volume;
-    }
-  }
-
-  // Perform channel-independent operations
-  // (APM, mix with file, record to file, mute, etc.)
-  shared_->transmit_mixer()->PrepareDemux(
-      audio_data, number_of_frames, number_of_channels, sample_rate,
-      static_cast<uint16_t>(audio_delay_milliseconds), clock_drift,
-      voe_mic_level, key_pressed);
-
-  // Copy the audio frame to each sending channel and perform
-  // channel-dependent operations (file mixing, mute, etc.), encode and
-  // packetize+transmit the RTP packet.
-  shared_->transmit_mixer()->ProcessAndEncodeAudio();
-
-  // Scale from VoE to ADM level range.
-  uint32_t new_voe_mic_level = shared_->transmit_mixer()->CaptureLevel();
-  if (new_voe_mic_level != voe_mic_level) {
-    // Return the new volume if AGC has changed the volume.
-    return static_cast<int>((new_voe_mic_level * max_volume +
-                             static_cast<int>(kMaxVolumeLevel / 2)) /
-                            kMaxVolumeLevel);
-  }
-
-  return 0;
-}
-
-int32_t VoEBaseImpl::NeedMorePlayData(const size_t nSamples,
-                                      const size_t nBytesPerSample,
-                                      const size_t nChannels,
-                                      const uint32_t samplesPerSec,
-                                      void* audioSamples,
-                                      size_t& nSamplesOut,
-                                      int64_t* elapsed_time_ms,
-                                      int64_t* ntp_time_ms) {
-  GetPlayoutData(static_cast<int>(samplesPerSec), nChannels, nSamples, true,
-                 audioSamples, elapsed_time_ms, ntp_time_ms);
-  nSamplesOut = audioFrame_.samples_per_channel_;
-  return 0;
-}
-
-void VoEBaseImpl::PushCaptureData(int voe_channel, const void* audio_data,
-                                  int bits_per_sample, int sample_rate,
-                                  size_t number_of_channels,
-                                  size_t number_of_frames) {
-  voe::ChannelOwner ch = shared_->channel_manager().GetChannel(voe_channel);
-  voe::Channel* channel = ch.channel();
-  if (!channel)
-    return;
-  if (channel->Sending()) {
-    // Send the audio to each channel directly without using the APM in the
-    // transmit mixer.
-    channel->ProcessAndEncodeAudio(static_cast<const int16_t*>(audio_data),
-                                   sample_rate, number_of_frames,
-                                   number_of_channels);
-  }
-}
-
-void VoEBaseImpl::PullRenderData(int bits_per_sample,
-                                 int sample_rate,
-                                 size_t number_of_channels,
-                                 size_t number_of_frames,
-                                 void* audio_data, int64_t* elapsed_time_ms,
-                                 int64_t* ntp_time_ms) {
-  assert(bits_per_sample == 16);
-  assert(number_of_frames == static_cast<size_t>(sample_rate / 100));
-
-  GetPlayoutData(sample_rate, number_of_channels, number_of_frames, false,
-                 audio_data, elapsed_time_ms, ntp_time_ms);
-}
-
-int VoEBaseImpl::RegisterVoiceEngineObserver(VoiceEngineObserver& observer) {
-  rtc::CritScope cs(&callbackCritSect_);
-  if (voiceEngineObserverPtr_) {
-    shared_->SetLastError(
-        VE_INVALID_OPERATION, kTraceError,
-        "RegisterVoiceEngineObserver() observer already enabled");
-    return -1;
-  }
-
-  // Register the observer in all active channels
-  for (voe::ChannelManager::Iterator it(&shared_->channel_manager());
-       it.IsValid(); it.Increment()) {
-    it.GetChannel()->RegisterVoiceEngineObserver(observer);
-  }
-
-  shared_->transmit_mixer()->RegisterVoiceEngineObserver(observer);
-  voiceEngineObserverPtr_ = &observer;
-  return 0;
-}
-
-int VoEBaseImpl::DeRegisterVoiceEngineObserver() {
-  rtc::CritScope cs(&callbackCritSect_);
-  if (!voiceEngineObserverPtr_) {
-    shared_->SetLastError(
-        VE_INVALID_OPERATION, kTraceError,
-        "DeRegisterVoiceEngineObserver() observer already disabled");
-    return 0;
-  }
-  voiceEngineObserverPtr_ = nullptr;
-
-  // Deregister the observer in all active channels
-  for (voe::ChannelManager::Iterator it(&shared_->channel_manager());
-       it.IsValid(); it.Increment()) {
-    it.GetChannel()->DeRegisterVoiceEngineObserver();
-  }
-
-  return 0;
-}
-
-int VoEBaseImpl::Init(
-    AudioDeviceModule* external_adm,
-    AudioProcessing* audio_processing,
-    const rtc::scoped_refptr<AudioDecoderFactory>& decoder_factory) {
-  RTC_DCHECK(audio_processing);
-  rtc::CritScope cs(shared_->crit_sec());
-  WebRtcSpl_Init();
-  if (shared_->statistics().Initialized()) {
-    return 0;
-  }
-  if (shared_->process_thread()) {
-    shared_->process_thread()->Start();
-  }
-
-  // Create an internal ADM if the user has not added an external
-  // ADM implementation as input to Init().
-  if (external_adm == nullptr) {
-#if !defined(WEBRTC_INCLUDE_INTERNAL_AUDIO_DEVICE)
-    return -1;
-#else
-    // Create the internal ADM implementation.
-    shared_->set_audio_device(AudioDeviceModule::Create(
-        VoEId(shared_->instance_id(), -1),
-        AudioDeviceModule::kPlatformDefaultAudio));
-    if (shared_->audio_device() == nullptr) {
-      shared_->SetLastError(VE_NO_MEMORY, kTraceCritical,
-                            "Init() failed to create the ADM");
-      return -1;
-    }
-#endif  // WEBRTC_INCLUDE_INTERNAL_AUDIO_DEVICE
-  } else {
-    // Use the already existing external ADM implementation.
-    shared_->set_audio_device(external_adm);
-    LOG_F(LS_INFO)
-        << "An external ADM implementation will be used in VoiceEngine";
-  }
-
-  // Register the ADM to the process thread, which will drive the error
-  // callback mechanism
-  if (shared_->process_thread()) {
-    shared_->process_thread()->RegisterModule(shared_->audio_device(),
-                                              RTC_FROM_HERE);
-  }
-
-  bool available = false;
-
-  // --------------------
-  // Reinitialize the ADM
-
-  // Register the AudioObserver implementation
-  if (shared_->audio_device()->RegisterEventObserver(this) != 0) {
-    shared_->SetLastError(
-        VE_AUDIO_DEVICE_MODULE_ERROR, kTraceWarning,
-        "Init() failed to register event observer for the ADM");
-  }
-
-  // Register the AudioTransport implementation
-  if (shared_->audio_device()->RegisterAudioCallback(this) != 0) {
-    shared_->SetLastError(
-        VE_AUDIO_DEVICE_MODULE_ERROR, kTraceWarning,
-        "Init() failed to register audio callback for the ADM");
-  }
-
-  // ADM initialization
-  if (shared_->audio_device()->Init() != 0) {
-    shared_->SetLastError(VE_AUDIO_DEVICE_MODULE_ERROR, kTraceError,
-                          "Init() failed to initialize the ADM");
-    return -1;
-  }
-
-  // Initialize the default speaker
-  if (shared_->audio_device()->SetPlayoutDevice(
-          WEBRTC_VOICE_ENGINE_DEFAULT_DEVICE) != 0) {
-    shared_->SetLastError(VE_AUDIO_DEVICE_MODULE_ERROR, kTraceInfo,
-                          "Init() failed to set the default output device");
-  }
-  if (shared_->audio_device()->InitSpeaker() != 0) {
-    shared_->SetLastError(VE_CANNOT_ACCESS_SPEAKER_VOL, kTraceInfo,
-                          "Init() failed to initialize the speaker");
-  }
-
-  // Initialize the default microphone
-  if (shared_->audio_device()->SetRecordingDevice(
-          WEBRTC_VOICE_ENGINE_DEFAULT_DEVICE) != 0) {
-    shared_->SetLastError(VE_SOUNDCARD_ERROR, kTraceInfo,
-                          "Init() failed to set the default input device");
-  }
-  if (shared_->audio_device()->InitMicrophone() != 0) {
-    shared_->SetLastError(VE_CANNOT_ACCESS_MIC_VOL, kTraceInfo,
-                          "Init() failed to initialize the microphone");
-  }
-
-  // Set number of channels
-  if (shared_->audio_device()->StereoPlayoutIsAvailable(&available) != 0) {
-    shared_->SetLastError(VE_SOUNDCARD_ERROR, kTraceWarning,
-                          "Init() failed to query stereo playout mode");
-  }
-  if (shared_->audio_device()->SetStereoPlayout(available) != 0) {
-    shared_->SetLastError(VE_SOUNDCARD_ERROR, kTraceWarning,
-                          "Init() failed to set mono/stereo playout mode");
-  }
-
-  // TODO(andrew): These functions don't tell us whether stereo recording
-  // is truly available. We simply set the AudioProcessing input to stereo
-  // here, because we have to wait until receiving the first frame to
-  // determine the actual number of channels anyway.
-  //
-  // These functions may be changed; tracked here:
-  // http://code.google.com/p/webrtc/issues/detail?id=204
-  shared_->audio_device()->StereoRecordingIsAvailable(&available);
-  if (shared_->audio_device()->SetStereoRecording(available) != 0) {
-    shared_->SetLastError(VE_SOUNDCARD_ERROR, kTraceWarning,
-                          "Init() failed to set mono/stereo recording mode");
-  }
-
-  shared_->set_audio_processing(audio_processing);
-
-  // Set the error state for any failures in this block.
-  shared_->SetLastError(VE_APM_ERROR);
-  // Configure AudioProcessing components.
-  // TODO(peah): Move this initialization to webrtcvoiceengine.cc.
-  if (audio_processing->high_pass_filter()->Enable(true) != 0) {
-    LOG_F(LS_ERROR) << "Failed to enable high pass filter.";
-    return -1;
-  }
-  if (audio_processing->echo_cancellation()->enable_drift_compensation(false) !=
-      0) {
-    LOG_F(LS_ERROR) << "Failed to disable drift compensation.";
-    return -1;
-  }
-  if (audio_processing->noise_suppression()->set_level(kDefaultNsMode) != 0) {
-    LOG_F(LS_ERROR) << "Failed to set noise suppression level: "
-        << kDefaultNsMode;
-    return -1;
-  }
-  GainControl* agc = audio_processing->gain_control();
-  if (agc->set_analog_level_limits(kMinVolumeLevel, kMaxVolumeLevel) != 0) {
-    LOG_F(LS_ERROR) << "Failed to set analog level limits with minimum: "
-        << kMinVolumeLevel << " and maximum: " << kMaxVolumeLevel;
-    return -1;
-  }
-  if (agc->set_mode(kDefaultAgcMode) != 0) {
-    LOG_F(LS_ERROR) << "Failed to set mode: " << kDefaultAgcMode;
-    return -1;
-  }
-  if (agc->Enable(kDefaultAgcState) != 0) {
-    LOG_F(LS_ERROR) << "Failed to set agc state: " << kDefaultAgcState;
-    return -1;
-  }
-  shared_->SetLastError(0);  // Clear error state.
-
-#ifdef WEBRTC_VOICE_ENGINE_AGC
-  bool agc_enabled =
-      agc->mode() == GainControl::kAdaptiveAnalog && agc->is_enabled();
-  if (shared_->audio_device()->SetAGC(agc_enabled) != 0) {
-    LOG_F(LS_ERROR) << "Failed to set agc to enabled: " << agc_enabled;
-    shared_->SetLastError(VE_AUDIO_DEVICE_MODULE_ERROR);
-    // TODO(ajm): No error return here due to
-    // https://code.google.com/p/webrtc/issues/detail?id=1464
-  }
-#endif
-
-  if (decoder_factory)
-    decoder_factory_ = decoder_factory;
-  else
-    decoder_factory_ = CreateBuiltinAudioDecoderFactory();
-
-  return shared_->statistics().SetInitialized();
-}
-
-int VoEBaseImpl::Terminate() {
-  rtc::CritScope cs(shared_->crit_sec());
-  return TerminateInternal();
-}
-
-int VoEBaseImpl::CreateChannel() {
-  return CreateChannel(ChannelConfig());
-}
-
-int VoEBaseImpl::CreateChannel(const ChannelConfig& config) {
-  rtc::CritScope cs(shared_->crit_sec());
-  if (!shared_->statistics().Initialized()) {
-    shared_->SetLastError(VE_NOT_INITED, kTraceError);
-    return -1;
-  }
-
-  ChannelConfig config_copy(config);
-  config_copy.acm_config.decoder_factory = decoder_factory_;
-  voe::ChannelOwner channel_owner =
-      shared_->channel_manager().CreateChannel(config_copy);
-  return InitializeChannel(&channel_owner);
-}
-
-int VoEBaseImpl::InitializeChannel(voe::ChannelOwner* channel_owner) {
-  if (channel_owner->channel()->SetEngineInformation(
-          shared_->statistics(), *shared_->output_mixer(),
-          *shared_->process_thread(), *shared_->audio_device(),
-          voiceEngineObserverPtr_, &callbackCritSect_,
-          shared_->encoder_queue()) != 0) {
-    shared_->SetLastError(
-        VE_CHANNEL_NOT_CREATED, kTraceError,
-        "CreateChannel() failed to associate engine and channel."
-        " Destroying channel.");
-    shared_->channel_manager().DestroyChannel(
-        channel_owner->channel()->ChannelId());
-    return -1;
-  } else if (channel_owner->channel()->Init() != 0) {
-    shared_->SetLastError(
-        VE_CHANNEL_NOT_CREATED, kTraceError,
-        "CreateChannel() failed to initialize channel. Destroying"
-        " channel.");
-    shared_->channel_manager().DestroyChannel(
-        channel_owner->channel()->ChannelId());
-    return -1;
-  }
-  return channel_owner->channel()->ChannelId();
-}
-
-int VoEBaseImpl::DeleteChannel(int channel) {
-  rtc::CritScope cs(shared_->crit_sec());
-  if (!shared_->statistics().Initialized()) {
-    shared_->SetLastError(VE_NOT_INITED, kTraceError);
-    return -1;
-  }
-
-  {
-    voe::ChannelOwner ch = shared_->channel_manager().GetChannel(channel);
-    voe::Channel* channelPtr = ch.channel();
-    if (channelPtr == nullptr) {
-      shared_->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError,
-                            "DeleteChannel() failed to locate channel");
-      return -1;
-    }
-  }
-
-  shared_->channel_manager().DestroyChannel(channel);
-  if (StopSend() != 0) {
-    return -1;
-  }
-  if (StopPlayout() != 0) {
-    return -1;
-  }
-  return 0;
-}
-
-int VoEBaseImpl::StartReceive(int channel) {
-  rtc::CritScope cs(shared_->crit_sec());
-  if (!shared_->statistics().Initialized()) {
-    shared_->SetLastError(VE_NOT_INITED, kTraceError);
-    return -1;
-  }
-  voe::ChannelOwner ch = shared_->channel_manager().GetChannel(channel);
-  voe::Channel* channelPtr = ch.channel();
-  if (channelPtr == nullptr) {
-    shared_->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError,
-                          "StartReceive() failed to locate channel");
-    return -1;
-  }
-  return 0;
-}
-
-int VoEBaseImpl::StartPlayout(int channel) {
-  rtc::CritScope cs(shared_->crit_sec());
-  if (!shared_->statistics().Initialized()) {
-    shared_->SetLastError(VE_NOT_INITED, kTraceError);
-    return -1;
-  }
-  voe::ChannelOwner ch = shared_->channel_manager().GetChannel(channel);
-  voe::Channel* channelPtr = ch.channel();
-  if (channelPtr == nullptr) {
-    shared_->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError,
-                          "StartPlayout() failed to locate channel");
-    return -1;
-  }
-  if (channelPtr->Playing()) {
-    return 0;
-  }
-  if (StartPlayout() != 0) {
-    shared_->SetLastError(VE_AUDIO_DEVICE_MODULE_ERROR, kTraceError,
-                          "StartPlayout() failed to start playout");
-    return -1;
-  }
-  return channelPtr->StartPlayout();
-}
-
-int VoEBaseImpl::StopPlayout(int channel) {
-  rtc::CritScope cs(shared_->crit_sec());
-  if (!shared_->statistics().Initialized()) {
-    shared_->SetLastError(VE_NOT_INITED, kTraceError);
-    return -1;
-  }
-  voe::ChannelOwner ch = shared_->channel_manager().GetChannel(channel);
-  voe::Channel* channelPtr = ch.channel();
-  if (channelPtr == nullptr) {
-    shared_->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError,
-                          "StopPlayout() failed to locate channel");
-    return -1;
-  }
-  if (channelPtr->StopPlayout() != 0) {
-    LOG_F(LS_WARNING) << "StopPlayout() failed to stop playout for channel "
-                      << channel;
-  }
-  return StopPlayout();
-}
-
-int VoEBaseImpl::StartSend(int channel) {
-  rtc::CritScope cs(shared_->crit_sec());
-  if (!shared_->statistics().Initialized()) {
-    shared_->SetLastError(VE_NOT_INITED, kTraceError);
-    return -1;
-  }
-  voe::ChannelOwner ch = shared_->channel_manager().GetChannel(channel);
-  voe::Channel* channelPtr = ch.channel();
-  if (channelPtr == nullptr) {
-    shared_->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError,
-                          "StartSend() failed to locate channel");
-    return -1;
-  }
-  if (channelPtr->Sending()) {
-    return 0;
-  }
-  if (StartSend() != 0) {
-    shared_->SetLastError(VE_AUDIO_DEVICE_MODULE_ERROR, kTraceError,
-                          "StartSend() failed to start recording");
-    return -1;
-  }
-  return channelPtr->StartSend();
-}
-
-int VoEBaseImpl::StopSend(int channel) {
-  rtc::CritScope cs(shared_->crit_sec());
-  if (!shared_->statistics().Initialized()) {
-    shared_->SetLastError(VE_NOT_INITED, kTraceError);
-    return -1;
-  }
-  voe::ChannelOwner ch = shared_->channel_manager().GetChannel(channel);
-  voe::Channel* channelPtr = ch.channel();
-  if (channelPtr == nullptr) {
-    shared_->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError,
-                          "StopSend() failed to locate channel");
-    return -1;
-  }
-  channelPtr->StopSend();
-  return StopSend();
-}
-
-int VoEBaseImpl::GetVersion(char version[1024]) {
-  if (version == nullptr) {
-    shared_->SetLastError(VE_INVALID_ARGUMENT, kTraceError);
-    return -1;
-  }
-
-  std::string versionString = VoiceEngine::GetVersionString();
-  RTC_DCHECK_GT(1024, versionString.size() + 1);
-  char* end = std::copy(versionString.cbegin(), versionString.cend(), version);
-  end[0] = '\n';
-  end[1] = '\0';
-  return 0;
-}
-
-int VoEBaseImpl::LastError() { return (shared_->statistics().LastError()); }
-
-int32_t VoEBaseImpl::StartPlayout() {
-  if (!shared_->audio_device()->Playing()) {
-    if (shared_->audio_device()->InitPlayout() != 0) {
-      LOG_F(LS_ERROR) << "Failed to initialize playout";
-      return -1;
-    }
-    if (shared_->audio_device()->StartPlayout() != 0) {
-      LOG_F(LS_ERROR) << "Failed to start playout";
-      return -1;
-    }
-  }
-  return 0;
-}
-
-int32_t VoEBaseImpl::StopPlayout() {
-  // Stop audio-device playing if no channel is playing out
-  if (shared_->NumOfPlayingChannels() == 0) {
-    if (shared_->audio_device()->StopPlayout() != 0) {
-      shared_->SetLastError(VE_CANNOT_STOP_PLAYOUT, kTraceError,
-                            "StopPlayout() failed to stop playout");
-      return -1;
-    }
-  }
-  return 0;
-}
-
-int32_t VoEBaseImpl::StartSend() {
-  if (!shared_->audio_device()->RecordingIsInitialized() &&
-      !shared_->audio_device()->Recording()) {
-    if (shared_->audio_device()->InitRecording() != 0) {
-      LOG_F(LS_ERROR) << "Failed to initialize recording";
-      return -1;
-    }
-  }
-  if (!shared_->audio_device()->Recording()) {
-    if (shared_->audio_device()->StartRecording() != 0) {
-      LOG_F(LS_ERROR) << "Failed to start recording";
-      return -1;
-    }
-  }
-  return 0;
-}
-
-int32_t VoEBaseImpl::StopSend() {
-  if (shared_->NumOfSendingChannels() == 0 &&
-      !shared_->transmit_mixer()->IsRecordingMic()) {
-    // Stop audio-device recording if no channel is recording
-    if (shared_->audio_device()->StopRecording() != 0) {
-      shared_->SetLastError(VE_CANNOT_STOP_RECORDING, kTraceError,
-                            "StopSend() failed to stop recording");
-      return -1;
-    }
-    shared_->transmit_mixer()->StopSend();
-  }
-
-  return 0;
-}
-
-int32_t VoEBaseImpl::TerminateInternal() {
-  // Delete any remaining channel objects
-  shared_->channel_manager().DestroyAllChannels();
-
-  if (shared_->process_thread()) {
-    if (shared_->audio_device()) {
-      shared_->process_thread()->DeRegisterModule(shared_->audio_device());
-    }
-    shared_->process_thread()->Stop();
-  }
-
-  if (shared_->audio_device()) {
-    if (shared_->audio_device()->StopPlayout() != 0) {
-      shared_->SetLastError(VE_SOUNDCARD_ERROR, kTraceWarning,
-                            "TerminateInternal() failed to stop playout");
-    }
-    if (shared_->audio_device()->StopRecording() != 0) {
-      shared_->SetLastError(VE_SOUNDCARD_ERROR, kTraceWarning,
-                            "TerminateInternal() failed to stop recording");
-    }
-    if (shared_->audio_device()->RegisterEventObserver(nullptr) != 0) {
-      shared_->SetLastError(
-          VE_AUDIO_DEVICE_MODULE_ERROR, kTraceWarning,
-          "TerminateInternal() failed to de-register event observer "
-          "for the ADM");
-    }
-    if (shared_->audio_device()->RegisterAudioCallback(nullptr) != 0) {
-      shared_->SetLastError(
-          VE_AUDIO_DEVICE_MODULE_ERROR, kTraceWarning,
-          "TerminateInternal() failed to de-register audio callback "
-          "for the ADM");
-    }
-    if (shared_->audio_device()->Terminate() != 0) {
-      shared_->SetLastError(VE_AUDIO_DEVICE_MODULE_ERROR, kTraceError,
-                            "TerminateInternal() failed to terminate the ADM");
-    }
-    shared_->set_audio_device(nullptr);
-  }
-
-  shared_->set_audio_processing(nullptr);
-
-  return shared_->statistics().SetUnInitialized();
-}
-
-void VoEBaseImpl::GetPlayoutData(int sample_rate, size_t number_of_channels,
-                                 size_t number_of_frames, bool feed_data_to_apm,
-                                 void* audio_data, int64_t* elapsed_time_ms,
-                                 int64_t* ntp_time_ms) {
-  assert(shared_->output_mixer() != nullptr);
-
-  // TODO(andrew): if the device is running in mono, we should tell the mixer
-  // here so that it will only request mono from AudioCodingModule.
-  // Perform mixing of all active participants (channel-based mixing)
-  shared_->output_mixer()->MixActiveChannels();
-
-  // Additional operations on the combined signal
-  shared_->output_mixer()->DoOperationsOnCombinedSignal(feed_data_to_apm);
-
-  // Retrieve the final output mix (resampled to match the ADM)
-  shared_->output_mixer()->GetMixedAudio(sample_rate, number_of_channels,
-                                         &audioFrame_);
-
-  assert(number_of_frames == audioFrame_.samples_per_channel_);
-  assert(sample_rate == audioFrame_.sample_rate_hz_);
-
-  // Deliver audio (PCM) samples to the ADM
-  memcpy(audio_data, audioFrame_.data(),
-         sizeof(int16_t) * number_of_frames * number_of_channels);
-
-  *elapsed_time_ms = audioFrame_.elapsed_time_ms_;
-  *ntp_time_ms = audioFrame_.ntp_time_ms_;
-}
-
-int VoEBaseImpl::AssociateSendChannel(int channel,
-                                      int accociate_send_channel) {
-  rtc::CritScope cs(shared_->crit_sec());
-
-  if (!shared_->statistics().Initialized()) {
-      shared_->SetLastError(VE_NOT_INITED, kTraceError);
-      return -1;
-  }
-
-  voe::ChannelOwner ch = shared_->channel_manager().GetChannel(channel);
-  voe::Channel* channel_ptr = ch.channel();
-  if (channel_ptr == NULL) {
-    shared_->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError,
-        "AssociateSendChannel() failed to locate channel");
-    return -1;
-  }
-
-  ch = shared_->channel_manager().GetChannel(accociate_send_channel);
-  voe::Channel* accociate_send_channel_ptr = ch.channel();
-  if (accociate_send_channel_ptr == NULL) {
-    shared_->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError,
-        "AssociateSendChannel() failed to locate accociate_send_channel");
-    return -1;
-  }
-
-  channel_ptr->set_associate_send_channel(ch);
-  return 0;
-}
-
-}  // namespace webrtc
diff --git a/voice_engine/voe_base_impl.h b/voice_engine/voe_base_impl.h
deleted file mode 100644
index 3c85eba..0000000
--- a/voice_engine/voe_base_impl.h
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- *  Copyright (c) 2012 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_VOICE_ENGINE_VOE_BASE_IMPL_H
-#define WEBRTC_VOICE_ENGINE_VOE_BASE_IMPL_H
-
-#include "webrtc/voice_engine/include/voe_base.h"
-
-#include "webrtc/modules/include/module_common_types.h"
-#include "webrtc/rtc_base/criticalsection.h"
-#include "webrtc/voice_engine/shared_data.h"
-
-namespace webrtc {
-
-class ProcessThread;
-
-class VoEBaseImpl : public VoEBase,
-                    public AudioTransport,
-                    public AudioDeviceObserver {
- public:
-  int RegisterVoiceEngineObserver(VoiceEngineObserver& observer) override;
-  int DeRegisterVoiceEngineObserver() override;
-
-  int Init(
-      AudioDeviceModule* external_adm,
-      AudioProcessing* audio_processing,
-      const rtc::scoped_refptr<AudioDecoderFactory>& decoder_factory) override;
-  AudioDeviceModule* audio_device_module() override {
-    return shared_->audio_device();
-  }
-  voe::TransmitMixer* transmit_mixer() override {
-    return shared_->transmit_mixer();
-  }
-  int Terminate() override;
-
-  int CreateChannel() override;
-  int CreateChannel(const ChannelConfig& config) override;
-  int DeleteChannel(int channel) override;
-
-  int StartReceive(int channel) override;
-  int StartPlayout(int channel) override;
-  int StartSend(int channel) override;
-  int StopPlayout(int channel) override;
-  int StopSend(int channel) override;
-
-  int GetVersion(char version[1024]) override;
-
-  int LastError() override;
-
-  AudioTransport* audio_transport() override { return this; }
-
-  int AssociateSendChannel(int channel, int accociate_send_channel) override;
-
-  // AudioTransport
-  int32_t RecordedDataIsAvailable(const void* audio_data,
-                                  const size_t number_of_frames,
-                                  const size_t bytes_per_sample,
-                                  const size_t number_of_channels,
-                                  const uint32_t sample_rate,
-                                  const uint32_t audio_delay_milliseconds,
-                                  const int32_t clock_drift,
-                                  const uint32_t volume,
-                                  const bool key_pressed,
-                                  uint32_t& new_mic_volume) override;
-  int32_t NeedMorePlayData(const size_t nSamples,
-                           const size_t nBytesPerSample,
-                           const size_t nChannels,
-                           const uint32_t samplesPerSec,
-                           void* audioSamples,
-                           size_t& nSamplesOut,
-                           int64_t* elapsed_time_ms,
-                           int64_t* ntp_time_ms) override;
-  void PushCaptureData(int voe_channel,
-                       const void* audio_data,
-                       int bits_per_sample,
-                       int sample_rate,
-                       size_t number_of_channels,
-                       size_t number_of_frames) override;
-  void PullRenderData(int bits_per_sample,
-                      int sample_rate,
-                      size_t number_of_channels,
-                      size_t number_of_frames,
-                      void* audio_data,
-                      int64_t* elapsed_time_ms,
-                      int64_t* ntp_time_ms) override;
-
-  // AudioDeviceObserver
-  void OnErrorIsReported(const ErrorCode error) override;
-  void OnWarningIsReported(const WarningCode warning) override;
-
- protected:
-  VoEBaseImpl(voe::SharedData* shared);
-  ~VoEBaseImpl() override;
-
- private:
-  int32_t StartPlayout();
-  int32_t StopPlayout();
-  int32_t StartSend();
-  int32_t StopSend();
-  int32_t TerminateInternal();
-
-  void GetPlayoutData(int sample_rate, size_t number_of_channels,
-                      size_t number_of_frames, bool feed_data_to_apm,
-                      void* audio_data, int64_t* elapsed_time_ms,
-                      int64_t* ntp_time_ms);
-
-  // Initialize channel by setting Engine Information then initializing
-  // channel.
-  int InitializeChannel(voe::ChannelOwner* channel_owner);
-  VoiceEngineObserver* voiceEngineObserverPtr_;
-  rtc::CriticalSection callbackCritSect_;
-  rtc::scoped_refptr<AudioDecoderFactory> decoder_factory_;
-
-  AudioFrame audioFrame_;
-  voe::SharedData* shared_;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_VOICE_ENGINE_VOE_BASE_IMPL_H
diff --git a/voice_engine/voe_base_unittest.cc b/voice_engine/voe_base_unittest.cc
deleted file mode 100644
index 55f9634..0000000
--- a/voice_engine/voe_base_unittest.cc
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- *  Copyright (c) 2013 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/voice_engine/include/voe_base.h"
-
-#include "webrtc/modules/audio_processing/include/audio_processing.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/voice_engine/channel_manager.h"
-#include "webrtc/voice_engine/shared_data.h"
-#include "webrtc/voice_engine/voice_engine_fixture.h"
-#include "webrtc/voice_engine/voice_engine_impl.h"
-
-namespace webrtc {
-
-class VoEBaseTest : public VoiceEngineFixture {};
-
-TEST_F(VoEBaseTest, InitWithExternalAudioDevice) {
-  EXPECT_EQ(0, base_->Init(&adm_, apm_.get()));
-  EXPECT_EQ(0, base_->LastError());
-}
-
-TEST_F(VoEBaseTest, CreateChannelBeforeInitShouldFail) {
-  int channelID = base_->CreateChannel();
-  EXPECT_EQ(channelID, -1);
-}
-
-TEST_F(VoEBaseTest, CreateChannelAfterInit) {
-  EXPECT_EQ(0, base_->Init(&adm_, apm_.get(), nullptr));
-  int channelID = base_->CreateChannel();
-  EXPECT_NE(channelID, -1);
-  EXPECT_EQ(0, base_->DeleteChannel(channelID));
-}
-
-TEST_F(VoEBaseTest, AssociateSendChannel) {
-  EXPECT_EQ(0, base_->Init(&adm_, apm_.get()));
-
-  const int channel_1 = base_->CreateChannel();
-
-  // Associating with a channel that does not exist should fail.
-  EXPECT_EQ(-1, base_->AssociateSendChannel(channel_1, channel_1 + 1));
-
-  const int channel_2 = base_->CreateChannel();
-
-  // Let the two channels associate with each other. This is not a normal use
-  // case. Actually, circular association should be avoided in practice. This
-  // is just to test that no crash is caused.
-  EXPECT_EQ(0, base_->AssociateSendChannel(channel_1, channel_2));
-  EXPECT_EQ(0, base_->AssociateSendChannel(channel_2, channel_1));
-
-  voe::SharedData* shared_data = static_cast<voe::SharedData*>(
-      static_cast<VoiceEngineImpl*>(voe_));
-  voe::ChannelOwner reference = shared_data->channel_manager()
-      .GetChannel(channel_1);
-  EXPECT_EQ(0, base_->DeleteChannel(channel_1));
-  // Make sure that the only use of the channel-to-delete is |reference|
-  // at this point.
-  EXPECT_EQ(1, reference.use_count());
-
-  reference = shared_data->channel_manager().GetChannel(channel_2);
-  EXPECT_EQ(0, base_->DeleteChannel(channel_2));
-  EXPECT_EQ(1, reference.use_count());
-}
-
-TEST_F(VoEBaseTest, GetVersion) {
-  char v1[1024] = {75};
-  base_->GetVersion(v1);
-  std::string v2 = VoiceEngine::GetVersionString() + "\n";
-  EXPECT_EQ(v2, v1);
-}
-}  // namespace webrtc
diff --git a/voice_engine/voe_codec_impl.cc b/voice_engine/voe_codec_impl.cc
deleted file mode 100644
index cdd2403..0000000
--- a/voice_engine/voe_codec_impl.cc
+++ /dev/null
@@ -1,391 +0,0 @@
-/*
- *  Copyright (c) 2012 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/voice_engine/voe_codec_impl.h"
-
-#include "webrtc/modules/audio_coding/include/audio_coding_module.h"
-#include "webrtc/rtc_base/format_macros.h"
-#include "webrtc/system_wrappers/include/trace.h"
-#include "webrtc/voice_engine/channel.h"
-#include "webrtc/voice_engine/include/voe_errors.h"
-#include "webrtc/voice_engine/voice_engine_impl.h"
-
-namespace webrtc {
-
-VoECodec* VoECodec::GetInterface(VoiceEngine* voiceEngine) {
-  if (NULL == voiceEngine) {
-    return NULL;
-  }
-  VoiceEngineImpl* s = static_cast<VoiceEngineImpl*>(voiceEngine);
-  s->AddRef();
-  return s;
-}
-
-VoECodecImpl::VoECodecImpl(voe::SharedData* shared) : _shared(shared) {
-  WEBRTC_TRACE(kTraceMemory, kTraceVoice, VoEId(_shared->instance_id(), -1),
-               "VoECodecImpl() - ctor");
-}
-
-VoECodecImpl::~VoECodecImpl() {
-  WEBRTC_TRACE(kTraceMemory, kTraceVoice, VoEId(_shared->instance_id(), -1),
-               "~VoECodecImpl() - dtor");
-}
-
-int VoECodecImpl::NumOfCodecs() {
-  // Number of supported codecs in the ACM
-  uint8_t nSupportedCodecs = AudioCodingModule::NumberOfCodecs();
-  return (nSupportedCodecs);
-}
-
-int VoECodecImpl::GetCodec(int index, CodecInst& codec) {
-  if (AudioCodingModule::Codec(index, &codec) == -1) {
-    _shared->SetLastError(VE_INVALID_LISTNR, kTraceError,
-                          "GetCodec() invalid index");
-    return -1;
-  }
-  return 0;
-}
-
-int VoECodecImpl::SetSendCodec(int channel, const CodecInst& codec) {
-  WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
-               "SetSendCodec(channel=%d, codec)", channel);
-  WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_shared->instance_id(), -1),
-               "codec: plname=%s, pacsize=%d, plfreq=%d, pltype=%d, "
-               "channels=%" PRIuS ", rate=%d",
-               codec.plname, codec.pacsize, codec.plfreq, codec.pltype,
-               codec.channels, codec.rate);
-  if (!_shared->statistics().Initialized()) {
-    _shared->SetLastError(VE_NOT_INITED, kTraceError);
-    return -1;
-  }
-  // External sanity checks performed outside the ACM
-  if ((STR_CASE_CMP(codec.plname, "L16") == 0) && (codec.pacsize >= 960)) {
-    _shared->SetLastError(VE_INVALID_ARGUMENT, kTraceError,
-                          "SetSendCodec() invalid L16 packet size");
-    return -1;
-  }
-  if (!STR_CASE_CMP(codec.plname, "CN") ||
-      !STR_CASE_CMP(codec.plname, "TELEPHONE-EVENT") ||
-      !STR_CASE_CMP(codec.plname, "RED")) {
-    _shared->SetLastError(VE_INVALID_ARGUMENT, kTraceError,
-                          "SetSendCodec() invalid codec name");
-    return -1;
-  }
-  if ((codec.channels != 1) && (codec.channels != 2)) {
-    _shared->SetLastError(VE_INVALID_ARGUMENT, kTraceError,
-                          "SetSendCodec() invalid number of channels");
-    return -1;
-  }
-  voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel);
-  voe::Channel* channelPtr = ch.channel();
-  if (channelPtr == NULL) {
-    _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError,
-                          "GetSendCodec() failed to locate channel");
-    return -1;
-  }
-  if (!AudioCodingModule::IsCodecValid(codec)) {
-    _shared->SetLastError(VE_INVALID_ARGUMENT, kTraceError,
-                          "SetSendCodec() invalid codec");
-    return -1;
-  }
-  if (channelPtr->SetSendCodec(codec) != 0) {
-    _shared->SetLastError(VE_CANNOT_SET_SEND_CODEC, kTraceError,
-                          "SetSendCodec() failed to set send codec");
-    return -1;
-  }
-
-  return 0;
-}
-
-int VoECodecImpl::GetSendCodec(int channel, CodecInst& codec) {
-  if (!_shared->statistics().Initialized()) {
-    _shared->SetLastError(VE_NOT_INITED, kTraceError);
-    return -1;
-  }
-  voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel);
-  voe::Channel* channelPtr = ch.channel();
-  if (channelPtr == NULL) {
-    _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError,
-                          "GetSendCodec() failed to locate channel");
-    return -1;
-  }
-  if (channelPtr->GetSendCodec(codec) != 0) {
-    _shared->SetLastError(VE_CANNOT_GET_SEND_CODEC, kTraceError,
-                          "GetSendCodec() failed to get send codec");
-    return -1;
-  }
-  return 0;
-}
-
-int VoECodecImpl::SetBitRate(int channel, int bitrate_bps) {
-  WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
-               "SetBitRate(bitrate_bps=%d)", bitrate_bps);
-  if (!_shared->statistics().Initialized()) {
-    _shared->SetLastError(VE_NOT_INITED, kTraceError);
-    return -1;
-  }
-  constexpr int64_t kDefaultProbingIntervalMs = 3000;
-  _shared->channel_manager().GetChannel(channel).channel()->SetBitRate(
-      bitrate_bps, kDefaultProbingIntervalMs);
-  return 0;
-}
-
-int VoECodecImpl::GetRecCodec(int channel, CodecInst& codec) {
-  if (!_shared->statistics().Initialized()) {
-    _shared->SetLastError(VE_NOT_INITED, kTraceError);
-    return -1;
-  }
-  voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel);
-  voe::Channel* channelPtr = ch.channel();
-  if (channelPtr == NULL) {
-    _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError,
-                          "GetRecCodec() failed to locate channel");
-    return -1;
-  }
-  return channelPtr->GetRecCodec(codec);
-}
-
-int VoECodecImpl::SetRecPayloadType(int channel, const CodecInst& codec) {
-  WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
-               "SetRecPayloadType(channel=%d, codec)", channel);
-  WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_shared->instance_id(), -1),
-               "codec: plname=%s, plfreq=%d, pltype=%d, channels=%" PRIuS ", "
-               "pacsize=%d, rate=%d",
-               codec.plname, codec.plfreq, codec.pltype, codec.channels,
-               codec.pacsize, codec.rate);
-  if (!_shared->statistics().Initialized()) {
-    _shared->SetLastError(VE_NOT_INITED, kTraceError);
-    return -1;
-  }
-  voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel);
-  voe::Channel* channelPtr = ch.channel();
-  if (channelPtr == NULL) {
-    _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError,
-                          "GetRecPayloadType() failed to locate channel");
-    return -1;
-  }
-  return channelPtr->SetRecPayloadType(codec);
-}
-
-int VoECodecImpl::GetRecPayloadType(int channel, CodecInst& codec) {
-  if (!_shared->statistics().Initialized()) {
-    _shared->SetLastError(VE_NOT_INITED, kTraceError);
-    return -1;
-  }
-  voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel);
-  voe::Channel* channelPtr = ch.channel();
-  if (channelPtr == NULL) {
-    _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError,
-                          "GetRecPayloadType() failed to locate channel");
-    return -1;
-  }
-  return channelPtr->GetRecPayloadType(codec);
-}
-
-int VoECodecImpl::SetSendCNPayloadType(int channel,
-                                       int type,
-                                       PayloadFrequencies frequency) {
-  WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
-               "SetSendCNPayloadType(channel=%d, type=%d, frequency=%d)",
-               channel, type, frequency);
-  if (!_shared->statistics().Initialized()) {
-    _shared->SetLastError(VE_NOT_INITED, kTraceError);
-    return -1;
-  }
-  if (type < 96 || type > 127) {
-    // Only allow dynamic range: 96 to 127
-    _shared->SetLastError(VE_INVALID_PLTYPE, kTraceError,
-                          "SetSendCNPayloadType() invalid payload type");
-    return -1;
-  }
-  if ((frequency != kFreq16000Hz) && (frequency != kFreq32000Hz)) {
-    // It is not possible to modify the payload type for CN/8000.
-    // We only allow modification of the CN payload type for CN/16000
-    // and CN/32000.
-    _shared->SetLastError(VE_INVALID_PLFREQ, kTraceError,
-                          "SetSendCNPayloadType() invalid payload frequency");
-    return -1;
-  }
-  voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel);
-  voe::Channel* channelPtr = ch.channel();
-  if (channelPtr == NULL) {
-    _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError,
-                          "SetSendCNPayloadType() failed to locate channel");
-    return -1;
-  }
-  return channelPtr->SetSendCNPayloadType(type, frequency);
-}
-
-int VoECodecImpl::SetFECStatus(int channel, bool enable) {
-  WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
-               "SetCodecFECStatus(channel=%d, enable=%d)", channel, enable);
-  if (!_shared->statistics().Initialized()) {
-    _shared->SetLastError(VE_NOT_INITED, kTraceError);
-    return -1;
-  }
-  voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel);
-  voe::Channel* channelPtr = ch.channel();
-  if (channelPtr == NULL) {
-    _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError,
-                          "SetCodecFECStatus() failed to locate channel");
-    return -1;
-  }
-  return channelPtr->SetCodecFECStatus(enable);
-}
-
-int VoECodecImpl::GetFECStatus(int channel, bool& enabled) {
-  if (!_shared->statistics().Initialized()) {
-    _shared->SetLastError(VE_NOT_INITED, kTraceError);
-    return -1;
-  }
-  voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel);
-  voe::Channel* channelPtr = ch.channel();
-  if (channelPtr == NULL) {
-    _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError,
-                          "GetFECStatus() failed to locate channel");
-    return -1;
-  }
-  enabled = channelPtr->GetCodecFECStatus();
-  return 0;
-}
-
-int VoECodecImpl::SetVADStatus(int channel,
-                               bool enable,
-                               VadModes mode,
-                               bool disableDTX) {
-  WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
-               "SetVADStatus(channel=%i, enable=%i, mode=%i, disableDTX=%i)",
-               channel, enable, mode, disableDTX);
-
-  if (!_shared->statistics().Initialized()) {
-    _shared->SetLastError(VE_NOT_INITED, kTraceError);
-    return -1;
-  }
-  voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel);
-  voe::Channel* channelPtr = ch.channel();
-  if (channelPtr == NULL) {
-    _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError,
-                          "SetVADStatus failed to locate channel");
-    return -1;
-  }
-
-  ACMVADMode vadMode(VADNormal);
-  switch (mode) {
-    case kVadConventional:
-      vadMode = VADNormal;
-      break;
-    case kVadAggressiveLow:
-      vadMode = VADLowBitrate;
-      break;
-    case kVadAggressiveMid:
-      vadMode = VADAggr;
-      break;
-    case kVadAggressiveHigh:
-      vadMode = VADVeryAggr;
-      break;
-  }
-  return channelPtr->SetVADStatus(enable, vadMode, disableDTX);
-}
-
-int VoECodecImpl::GetVADStatus(int channel,
-                               bool& enabled,
-                               VadModes& mode,
-                               bool& disabledDTX) {
-  if (!_shared->statistics().Initialized()) {
-    _shared->SetLastError(VE_NOT_INITED, kTraceError);
-    return -1;
-  }
-  voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel);
-  voe::Channel* channelPtr = ch.channel();
-  if (channelPtr == NULL) {
-    _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError,
-                          "GetVADStatus failed to locate channel");
-    return -1;
-  }
-
-  ACMVADMode vadMode;
-  int ret = channelPtr->GetVADStatus(enabled, vadMode, disabledDTX);
-
-  if (ret != 0) {
-    _shared->SetLastError(VE_INVALID_OPERATION, kTraceError,
-                          "GetVADStatus failed to get VAD mode");
-    return -1;
-  }
-  switch (vadMode) {
-    case VADNormal:
-      mode = kVadConventional;
-      break;
-    case VADLowBitrate:
-      mode = kVadAggressiveLow;
-      break;
-    case VADAggr:
-      mode = kVadAggressiveMid;
-      break;
-    case VADVeryAggr:
-      mode = kVadAggressiveHigh;
-      break;
-  }
-
-  return 0;
-}
-
-int VoECodecImpl::SetOpusMaxPlaybackRate(int channel, int frequency_hz) {
-  WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
-               "SetOpusMaxPlaybackRate(channel=%d, frequency_hz=%d)", channel,
-               frequency_hz);
-  if (!_shared->statistics().Initialized()) {
-    _shared->SetLastError(VE_NOT_INITED, kTraceError);
-    return -1;
-  }
-  voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel);
-  voe::Channel* channelPtr = ch.channel();
-  if (channelPtr == NULL) {
-    _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError,
-                          "SetOpusMaxPlaybackRate failed to locate channel");
-    return -1;
-  }
-  return channelPtr->SetOpusMaxPlaybackRate(frequency_hz);
-}
-
-int VoECodecImpl::SetOpusDtx(int channel, bool enable_dtx) {
-  WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
-               "SetOpusDtx(channel=%d, enable_dtx=%d)", channel, enable_dtx);
-  if (!_shared->statistics().Initialized()) {
-    _shared->SetLastError(VE_NOT_INITED, kTraceError);
-    return -1;
-  }
-  voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel);
-  voe::Channel* channelPtr = ch.channel();
-  if (channelPtr == NULL) {
-    _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError,
-                          "SetOpusDtx failed to locate channel");
-    return -1;
-  }
-  return channelPtr->SetOpusDtx(enable_dtx);
-}
-
-int VoECodecImpl::GetOpusDtxStatus(int channel, bool* enabled) {
-  WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
-               "GetOpusDtx(channel=%d)", channel);
-  if (!_shared->statistics().Initialized()) {
-    _shared->SetLastError(VE_NOT_INITED, kTraceError);
-    return -1;
-  }
-  voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel);
-  voe::Channel* channelPtr = ch.channel();
-  if (channelPtr == NULL) {
-    _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError,
-                          "GetOpusDtx failed to locate channel");
-    return -1;
-  }
-  return channelPtr->GetOpusDtx(enabled);
-}
-
-}  // namespace webrtc
diff --git a/voice_engine/voe_codec_impl.h b/voice_engine/voe_codec_impl.h
deleted file mode 100644
index d24bbac..0000000
--- a/voice_engine/voe_codec_impl.h
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- *  Copyright (c) 2012 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_VOICE_ENGINE_VOE_CODEC_IMPL_H
-#define WEBRTC_VOICE_ENGINE_VOE_CODEC_IMPL_H
-
-#include "webrtc/voice_engine/include/voe_codec.h"
-
-#include "webrtc/voice_engine/shared_data.h"
-
-namespace webrtc {
-
-class VoECodecImpl : public VoECodec {
- public:
-  int NumOfCodecs() override;
-
-  int GetCodec(int index, CodecInst& codec) override;
-
-  int SetSendCodec(int channel, const CodecInst& codec) override;
-
-  int GetSendCodec(int channel, CodecInst& codec) override;
-
-  int SetBitRate(int channel, int bitrate_bps) override;
-
-  int GetRecCodec(int channel, CodecInst& codec) override;
-
-  int SetSendCNPayloadType(
-      int channel,
-      int type,
-      PayloadFrequencies frequency = kFreq16000Hz) override;
-
-  int SetRecPayloadType(int channel, const CodecInst& codec) override;
-
-  int GetRecPayloadType(int channel, CodecInst& codec) override;
-
-  int SetFECStatus(int channel, bool enable) override;
-
-  int GetFECStatus(int channel, bool& enabled) override;
-
-  int SetVADStatus(int channel,
-                   bool enable,
-                   VadModes mode = kVadConventional,
-                   bool disableDTX = false) override;
-
-  int GetVADStatus(int channel,
-                   bool& enabled,
-                   VadModes& mode,
-                   bool& disabledDTX) override;
-
-  int SetOpusMaxPlaybackRate(int channel, int frequency_hz) override;
-
-  int SetOpusDtx(int channel, bool enable_dtx) override;
-
-  int GetOpusDtxStatus(int channel, bool* enabled) override;
-
- protected:
-  VoECodecImpl(voe::SharedData* shared);
-  ~VoECodecImpl() override;
-
- private:
-  voe::SharedData* _shared;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_VOICE_ENGINE_VOE_CODEC_IMPL_H
diff --git a/voice_engine/voe_codec_unittest.cc b/voice_engine/voe_codec_unittest.cc
deleted file mode 100644
index 7d27785..0000000
--- a/voice_engine/voe_codec_unittest.cc
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- *  Copyright (c) 2012 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 <memory>
-
-#include "webrtc/voice_engine/include/voe_codec.h"
-
-#include "webrtc/modules/audio_device/include/fake_audio_device.h"
-#include "webrtc/modules/audio_processing/include/audio_processing.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/voice_engine/include/voe_base.h"
-#include "webrtc/voice_engine/voice_engine_defines.h"
-
-namespace webrtc {
-namespace voe {
-namespace {
-
-TEST(VoECodecInst, TestCompareCodecInstances) {
-  CodecInst codec1, codec2;
-  memset(&codec1, 0, sizeof(CodecInst));
-  memset(&codec2, 0, sizeof(CodecInst));
-
-  codec1.pltype = 101;
-  strncpy(codec1.plname, "isac", 4);
-  codec1.plfreq = 8000;
-  codec1.pacsize = 110;
-  codec1.channels = 1;
-  codec1.rate = 8000;
-  memcpy(&codec2, &codec1, sizeof(CodecInst));
-  // Compare two codecs now.
-  EXPECT_TRUE(codec1 == codec2);
-  EXPECT_FALSE(codec1 != codec2);
-
-  // Changing pltype.
-  codec2.pltype = 102;
-  EXPECT_FALSE(codec1 == codec2);
-  EXPECT_TRUE(codec1 != codec2);
-
-  // Reset to codec2 to codec1 state.
-  memcpy(&codec2, &codec1, sizeof(CodecInst));
-  // payload name should be case insensitive.
-  strncpy(codec2.plname, "ISAC", 4);
-  EXPECT_TRUE(codec1 == codec2);
-
-  // Test modifying the |plfreq|
-  codec2.plfreq = 16000;
-  EXPECT_FALSE(codec1 == codec2);
-
-  // Reset to codec2 to codec1 state.
-  memcpy(&codec2, &codec1, sizeof(CodecInst));
-  // Test modifying the |pacsize|.
-  codec2.pacsize = 440;
-  EXPECT_FALSE(codec1 == codec2);
-
-  // Reset to codec2 to codec1 state.
-  memcpy(&codec2, &codec1, sizeof(CodecInst));
-  // Test modifying the |channels|.
-  codec2.channels = 2;
-  EXPECT_FALSE(codec1 == codec2);
-
-  // Reset to codec2 to codec1 state.
-  memcpy(&codec2, &codec1, sizeof(CodecInst));
-  // Test modifying the |rate|.
-  codec2.rate = 0;
-  EXPECT_FALSE(codec1 == codec2);
-}
-
-// This is a regression test for
-// https://bugs.chromium.org/p/webrtc/issues/detail?id=6020
-// The Opus DTX setting was being forgotten after unrelated VoE calls.
-TEST(VoECodecInst, RememberOpusDtxAfterSettingChange) {
-  VoiceEngine* voe(VoiceEngine::Create());
-  VoEBase* base(VoEBase::GetInterface(voe));
-  VoECodec* voe_codec(VoECodec::GetInterface(voe));
-  std::unique_ptr<FakeAudioDeviceModule> adm(new FakeAudioDeviceModule);
-  std::unique_ptr<AudioProcessing> apm(AudioProcessing::Create());
-
-  base->Init(adm.get(), apm.get());
-
-  CodecInst codec = {111, "opus", 48000, 960, 1, 32000};
-
-  int channel = base->CreateChannel();
-
-  bool DTX = false;
-
-  EXPECT_EQ(0, voe_codec->SetSendCodec(channel, codec));
-  EXPECT_EQ(0, voe_codec->SetOpusDtx(channel, true));
-  EXPECT_EQ(0, voe_codec->SetFECStatus(channel, true));
-  EXPECT_EQ(0, voe_codec->GetOpusDtxStatus(channel, &DTX));
-  EXPECT_TRUE(DTX);
-
-  base->DeleteChannel(channel);
-  base->Terminate();
-  base->Release();
-  voe_codec->Release();
-  VoiceEngine::Delete(voe);
-}
-
-}  // namespace
-}  // namespace voe
-}  // namespace webrtc
diff --git a/voice_engine/voe_file_impl.cc b/voice_engine/voe_file_impl.cc
deleted file mode 100644
index 5519c1e..0000000
--- a/voice_engine/voe_file_impl.cc
+++ /dev/null
@@ -1,466 +0,0 @@
-/*
- *  Copyright (c) 2012 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/voice_engine/voe_file_impl.h"
-
-#include "webrtc/system_wrappers/include/file_wrapper.h"
-#include "webrtc/system_wrappers/include/trace.h"
-#include "webrtc/voice_engine/channel.h"
-#include "webrtc/voice_engine/include/voe_errors.h"
-#include "webrtc/voice_engine/output_mixer.h"
-#include "webrtc/voice_engine/transmit_mixer.h"
-#include "webrtc/voice_engine/voice_engine_impl.h"
-
-namespace webrtc {
-
-VoEFile* VoEFile::GetInterface(VoiceEngine* voiceEngine) {
-  if (NULL == voiceEngine) {
-    return NULL;
-  }
-  VoiceEngineImpl* s = static_cast<VoiceEngineImpl*>(voiceEngine);
-  s->AddRef();
-  return s;
-}
-
-VoEFileImpl::VoEFileImpl(voe::SharedData* shared) : _shared(shared) {
-  WEBRTC_TRACE(kTraceMemory, kTraceVoice, VoEId(_shared->instance_id(), -1),
-               "VoEFileImpl::VoEFileImpl() - ctor");
-}
-
-VoEFileImpl::~VoEFileImpl() {
-  WEBRTC_TRACE(kTraceMemory, kTraceVoice, VoEId(_shared->instance_id(), -1),
-               "VoEFileImpl::~VoEFileImpl() - dtor");
-}
-
-int VoEFileImpl::StartPlayingFileLocally(int channel,
-                                         const char fileNameUTF8[1024],
-                                         bool loop,
-                                         FileFormats format,
-                                         float volumeScaling,
-                                         int startPointMs,
-                                         int stopPointMs) {
-  WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
-               "StartPlayingFileLocally(channel=%d, fileNameUTF8[]=%s, "
-               "loop=%d, format=%d, volumeScaling=%5.3f, startPointMs=%d,"
-               " stopPointMs=%d)",
-               channel, fileNameUTF8, loop, format, volumeScaling, startPointMs,
-               stopPointMs);
-  static_assert(1024 == FileWrapper::kMaxFileNameSize, "");
-  if (!_shared->statistics().Initialized()) {
-    _shared->SetLastError(VE_NOT_INITED, kTraceError);
-    return -1;
-  }
-  voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel);
-  voe::Channel* channelPtr = ch.channel();
-  if (channelPtr == NULL) {
-    _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError,
-                          "StartPlayingFileLocally() failed to locate channel");
-    return -1;
-  }
-
-  return channelPtr->StartPlayingFileLocally(fileNameUTF8, loop, format,
-                                             startPointMs, volumeScaling,
-                                             stopPointMs, NULL);
-}
-
-int VoEFileImpl::StartPlayingFileLocally(int channel,
-                                         InStream* stream,
-                                         FileFormats format,
-                                         float volumeScaling,
-                                         int startPointMs,
-                                         int stopPointMs) {
-  WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
-               "StartPlayingFileLocally(channel=%d, stream, format=%d, "
-               "volumeScaling=%5.3f, startPointMs=%d, stopPointMs=%d)",
-               channel, format, volumeScaling, startPointMs, stopPointMs);
-
-  if (!_shared->statistics().Initialized()) {
-    _shared->SetLastError(VE_NOT_INITED, kTraceError);
-    return -1;
-  }
-
-  voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel);
-  voe::Channel* channelPtr = ch.channel();
-  if (channelPtr == NULL) {
-    _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError,
-                          "StartPlayingFileLocally() failed to locate channel");
-    return -1;
-  }
-
-  return channelPtr->StartPlayingFileLocally(stream, format, startPointMs,
-                                             volumeScaling, stopPointMs, NULL);
-}
-
-int VoEFileImpl::StopPlayingFileLocally(int channel) {
-  WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
-               "StopPlayingFileLocally()");
-  if (!_shared->statistics().Initialized()) {
-    _shared->SetLastError(VE_NOT_INITED, kTraceError);
-    return -1;
-  }
-  voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel);
-  voe::Channel* channelPtr = ch.channel();
-  if (channelPtr == NULL) {
-    _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError,
-                          "StopPlayingFileLocally() failed to locate channel");
-    return -1;
-  }
-  return channelPtr->StopPlayingFileLocally();
-}
-
-int VoEFileImpl::IsPlayingFileLocally(int channel) {
-  if (!_shared->statistics().Initialized()) {
-    _shared->SetLastError(VE_NOT_INITED, kTraceError);
-    return -1;
-  }
-  voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel);
-  voe::Channel* channelPtr = ch.channel();
-  if (channelPtr == NULL) {
-    _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError,
-                          "StopPlayingFileLocally() failed to locate channel");
-    return -1;
-  }
-  return channelPtr->IsPlayingFileLocally();
-}
-
-int VoEFileImpl::StartPlayingFileAsMicrophone(int channel,
-                                              const char fileNameUTF8[1024],
-                                              bool loop,
-                                              bool mixWithMicrophone,
-                                              FileFormats format,
-                                              float volumeScaling) {
-  WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
-               "StartPlayingFileAsMicrophone(channel=%d, fileNameUTF8=%s, "
-               "loop=%d, mixWithMicrophone=%d, format=%d, "
-               "volumeScaling=%5.3f)",
-               channel, fileNameUTF8, loop, mixWithMicrophone, format,
-               volumeScaling);
-  static_assert(1024 == FileWrapper::kMaxFileNameSize, "");
-  if (!_shared->statistics().Initialized()) {
-    _shared->SetLastError(VE_NOT_INITED, kTraceError);
-    return -1;
-  }
-
-  const uint32_t startPointMs(0);
-  const uint32_t stopPointMs(0);
-
-  if (channel == -1) {
-    int res = _shared->transmit_mixer()->StartPlayingFileAsMicrophone(
-        fileNameUTF8, loop, format, startPointMs, volumeScaling, stopPointMs,
-        NULL);
-    if (res) {
-      WEBRTC_TRACE(
-          kTraceError, kTraceVoice, VoEId(_shared->instance_id(), -1),
-          "StartPlayingFileAsMicrophone() failed to start playing file");
-      return (-1);
-    } else {
-      _shared->transmit_mixer()->SetMixWithMicStatus(mixWithMicrophone);
-      return (0);
-    }
-  } else {
-    // Add file after demultiplexing <=> affects one channel only
-    voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel);
-    voe::Channel* channelPtr = ch.channel();
-    if (channelPtr == NULL) {
-      _shared->SetLastError(
-          VE_CHANNEL_NOT_VALID, kTraceError,
-          "StartPlayingFileAsMicrophone() failed to locate channel");
-      return -1;
-    }
-
-    int res = channelPtr->StartPlayingFileAsMicrophone(
-        fileNameUTF8, loop, format, startPointMs, volumeScaling, stopPointMs,
-        NULL);
-    if (res) {
-      WEBRTC_TRACE(
-          kTraceError, kTraceVoice, VoEId(_shared->instance_id(), -1),
-          "StartPlayingFileAsMicrophone() failed to start playing file");
-      return -1;
-    } else {
-      channelPtr->SetMixWithMicStatus(mixWithMicrophone);
-      return 0;
-    }
-  }
-}
-
-int VoEFileImpl::StartPlayingFileAsMicrophone(int channel,
-                                              InStream* stream,
-                                              bool mixWithMicrophone,
-                                              FileFormats format,
-                                              float volumeScaling) {
-  WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
-               "StartPlayingFileAsMicrophone(channel=%d, stream,"
-               " mixWithMicrophone=%d, format=%d, volumeScaling=%5.3f)",
-               channel, mixWithMicrophone, format, volumeScaling);
-
-  if (!_shared->statistics().Initialized()) {
-    _shared->SetLastError(VE_NOT_INITED, kTraceError);
-    return -1;
-  }
-
-  const uint32_t startPointMs(0);
-  const uint32_t stopPointMs(0);
-
-  if (channel == -1) {
-    int res = _shared->transmit_mixer()->StartPlayingFileAsMicrophone(
-        stream, format, startPointMs, volumeScaling, stopPointMs, NULL);
-    if (res) {
-      WEBRTC_TRACE(kTraceError, kTraceVoice, VoEId(_shared->instance_id(), -1),
-                   "StartPlayingFileAsMicrophone() failed to start "
-                   "playing stream");
-      return (-1);
-    } else {
-      _shared->transmit_mixer()->SetMixWithMicStatus(mixWithMicrophone);
-      return (0);
-    }
-  } else {
-    // Add file after demultiplexing <=> affects one channel only
-    voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel);
-    voe::Channel* channelPtr = ch.channel();
-    if (channelPtr == NULL) {
-      _shared->SetLastError(
-          VE_CHANNEL_NOT_VALID, kTraceError,
-          "StartPlayingFileAsMicrophone() failed to locate channel");
-      return -1;
-    }
-
-    int res = channelPtr->StartPlayingFileAsMicrophone(
-        stream, format, startPointMs, volumeScaling, stopPointMs, NULL);
-    if (res) {
-      WEBRTC_TRACE(kTraceError, kTraceVoice, VoEId(_shared->instance_id(), -1),
-                   "StartPlayingFileAsMicrophone() failed to start "
-                   "playing stream");
-      return -1;
-    } else {
-      channelPtr->SetMixWithMicStatus(mixWithMicrophone);
-      return 0;
-    }
-  }
-}
-
-int VoEFileImpl::StopPlayingFileAsMicrophone(int channel) {
-  WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
-               "StopPlayingFileAsMicrophone(channel=%d)", channel);
-  if (!_shared->statistics().Initialized()) {
-    _shared->SetLastError(VE_NOT_INITED, kTraceError);
-    return -1;
-  }
-  if (channel == -1) {
-    // Stop adding file before demultiplexing <=> affects all channels
-    return _shared->transmit_mixer()->StopPlayingFileAsMicrophone();
-  } else {
-    // Stop adding file after demultiplexing <=> affects one channel only
-    voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel);
-    voe::Channel* channelPtr = ch.channel();
-    if (channelPtr == NULL) {
-      _shared->SetLastError(
-          VE_CHANNEL_NOT_VALID, kTraceError,
-          "StopPlayingFileAsMicrophone() failed to locate channel");
-      return -1;
-    }
-    return channelPtr->StopPlayingFileAsMicrophone();
-  }
-}
-
-int VoEFileImpl::IsPlayingFileAsMicrophone(int channel) {
-  WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
-               "IsPlayingFileAsMicrophone(channel=%d)", channel);
-  if (!_shared->statistics().Initialized()) {
-    _shared->SetLastError(VE_NOT_INITED, kTraceError);
-    return -1;
-  }
-  if (channel == -1) {
-    return _shared->transmit_mixer()->IsPlayingFileAsMicrophone();
-  } else {
-    // Stop adding file after demultiplexing <=> affects one channel only
-    voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel);
-    voe::Channel* channelPtr = ch.channel();
-    if (channelPtr == NULL) {
-      _shared->SetLastError(
-          VE_CHANNEL_NOT_VALID, kTraceError,
-          "IsPlayingFileAsMicrophone() failed to locate channel");
-      return -1;
-    }
-    return channelPtr->IsPlayingFileAsMicrophone();
-  }
-}
-
-int VoEFileImpl::StartRecordingPlayout(int channel,
-                                       const char* fileNameUTF8,
-                                       CodecInst* compression,
-                                       int maxSizeBytes) {
-  WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
-               "StartRecordingPlayout(channel=%d, fileNameUTF8=%s, "
-               "compression, maxSizeBytes=%d)",
-               channel, fileNameUTF8, maxSizeBytes);
-  static_assert(1024 == FileWrapper::kMaxFileNameSize, "");
-
-  if (!_shared->statistics().Initialized()) {
-    _shared->SetLastError(VE_NOT_INITED, kTraceError);
-    return -1;
-  }
-  if (channel == -1) {
-    return _shared->output_mixer()->StartRecordingPlayout(fileNameUTF8,
-                                                          compression);
-  } else {
-    // Add file after demultiplexing <=> affects one channel only
-    voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel);
-    voe::Channel* channelPtr = ch.channel();
-    if (channelPtr == NULL) {
-      _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError,
-                            "StartRecordingPlayout() failed to locate channel");
-      return -1;
-    }
-    return channelPtr->StartRecordingPlayout(fileNameUTF8, compression);
-  }
-}
-
-int VoEFileImpl::StartRecordingPlayout(int channel,
-                                       OutStream* stream,
-                                       CodecInst* compression) {
-  WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
-               "StartRecordingPlayout(channel=%d, stream, compression)",
-               channel);
-  if (!_shared->statistics().Initialized()) {
-    _shared->SetLastError(VE_NOT_INITED, kTraceError);
-    return -1;
-  }
-  if (channel == -1) {
-    return _shared->output_mixer()->StartRecordingPlayout(stream, compression);
-  } else {
-    voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel);
-    voe::Channel* channelPtr = ch.channel();
-    if (channelPtr == NULL) {
-      _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError,
-                            "StartRecordingPlayout() failed to locate channel");
-      return -1;
-    }
-    return channelPtr->StartRecordingPlayout(stream, compression);
-  }
-}
-
-int VoEFileImpl::StopRecordingPlayout(int channel) {
-  WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
-               "StopRecordingPlayout(channel=%d)", channel);
-  if (!_shared->statistics().Initialized()) {
-    _shared->SetLastError(VE_NOT_INITED, kTraceError);
-    return -1;
-  }
-  if (channel == -1) {
-    return _shared->output_mixer()->StopRecordingPlayout();
-  } else {
-    voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel);
-    voe::Channel* channelPtr = ch.channel();
-    if (channelPtr == NULL) {
-      _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError,
-                            "StopRecordingPlayout() failed to locate channel");
-      return -1;
-    }
-    return channelPtr->StopRecordingPlayout();
-  }
-}
-
-int VoEFileImpl::StartRecordingMicrophone(const char* fileNameUTF8,
-                                          CodecInst* compression,
-                                          int maxSizeBytes) {
-  WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
-               "StartRecordingMicrophone(fileNameUTF8=%s, compression, "
-               "maxSizeBytes=%d)",
-               fileNameUTF8, maxSizeBytes);
-  static_assert(1024 == FileWrapper::kMaxFileNameSize, "");
-
-  if (!_shared->statistics().Initialized()) {
-    _shared->SetLastError(VE_NOT_INITED, kTraceError);
-    return -1;
-  }
-  if (_shared->transmit_mixer()->StartRecordingMicrophone(fileNameUTF8,
-                                                          compression)) {
-    WEBRTC_TRACE(kTraceError, kTraceVoice, VoEId(_shared->instance_id(), -1),
-                 "StartRecordingMicrophone() failed to start recording");
-    return -1;
-  }
-  if (!_shared->audio_device()->Recording()) {
-    if (_shared->audio_device()->InitRecording() != 0) {
-      WEBRTC_TRACE(kTraceError, kTraceVoice, VoEId(_shared->instance_id(), -1),
-                   "StartRecordingMicrophone() failed to initialize recording");
-      return -1;
-    }
-    if (_shared->audio_device()->StartRecording() != 0) {
-      WEBRTC_TRACE(kTraceError, kTraceVoice, VoEId(_shared->instance_id(), -1),
-                   "StartRecordingMicrophone() failed to start recording");
-      return -1;
-    }
-  }
-  return 0;
-}
-
-int VoEFileImpl::StartRecordingMicrophone(OutStream* stream,
-                                          CodecInst* compression) {
-  WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
-               "StartRecordingMicrophone(stream, compression)");
-
-  if (!_shared->statistics().Initialized()) {
-    _shared->SetLastError(VE_NOT_INITED, kTraceError);
-    return -1;
-  }
-  if (_shared->transmit_mixer()->StartRecordingMicrophone(stream,
-                                                          compression) == -1) {
-    WEBRTC_TRACE(kTraceError, kTraceVoice, VoEId(_shared->instance_id(), -1),
-                 "StartRecordingMicrophone() failed to start recording");
-    return -1;
-  }
-  if (!_shared->audio_device()->Recording()) {
-    if (_shared->audio_device()->InitRecording() != 0) {
-      WEBRTC_TRACE(kTraceError, kTraceVoice, VoEId(_shared->instance_id(), -1),
-                   "StartRecordingMicrophone() failed to initialize recording");
-      return -1;
-    }
-    if (_shared->audio_device()->StartRecording() != 0) {
-      WEBRTC_TRACE(kTraceError, kTraceVoice, VoEId(_shared->instance_id(), -1),
-                   "StartRecordingMicrophone() failed to start recording");
-      return -1;
-    }
-  }
-  return 0;
-}
-
-int VoEFileImpl::StopRecordingMicrophone() {
-  WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
-               "StopRecordingMicrophone()");
-  if (!_shared->statistics().Initialized()) {
-    _shared->SetLastError(VE_NOT_INITED, kTraceError);
-    return -1;
-  }
-
-  int err = 0;
-
-  // TODO(xians): consider removing Start/StopRecording() in
-  // Start/StopRecordingMicrophone() if no channel is recording.
-  if (_shared->NumOfSendingChannels() == 0 &&
-      _shared->audio_device()->Recording()) {
-    // Stop audio-device recording if no channel is recording
-    if (_shared->audio_device()->StopRecording() != 0) {
-      _shared->SetLastError(
-          VE_CANNOT_STOP_RECORDING, kTraceError,
-          "StopRecordingMicrophone() failed to stop recording");
-      err = -1;
-    }
-  }
-
-  if (_shared->transmit_mixer()->StopRecordingMicrophone() != 0) {
-    WEBRTC_TRACE(kTraceError, kTraceVoice, VoEId(_shared->instance_id(), -1),
-                 "StopRecordingMicrophone() failed to stop recording to mixer");
-    err = -1;
-  }
-
-  return err;
-}
-
-}  // namespace webrtc
diff --git a/voice_engine/voe_file_impl.h b/voice_engine/voe_file_impl.h
deleted file mode 100644
index 5d28947..0000000
--- a/voice_engine/voe_file_impl.h
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- *  Copyright (c) 2012 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_VOICE_ENGINE_VOE_FILE_IMPL_H
-#define WEBRTC_VOICE_ENGINE_VOE_FILE_IMPL_H
-
-#include "webrtc/voice_engine/include/voe_file.h"
-#include "webrtc/voice_engine/shared_data.h"
-
-namespace webrtc {
-
-class VoEFileImpl : public VoEFile {
- public:
-  // Playout file locally
-
-  int StartPlayingFileLocally(int channel,
-                              const char fileNameUTF8[1024],
-                              bool loop = false,
-                              FileFormats format = kFileFormatPcm16kHzFile,
-                              float volumeScaling = 1.0,
-                              int startPointMs = 0,
-                              int stopPointMs = 0) override;
-
-  int StartPlayingFileLocally(int channel,
-                              InStream* stream,
-                              FileFormats format = kFileFormatPcm16kHzFile,
-                              float volumeScaling = 1.0,
-                              int startPointMs = 0,
-                              int stopPointMs = 0) override;
-
-  int StopPlayingFileLocally(int channel) override;
-
-  int IsPlayingFileLocally(int channel) override;
-
-  // Use file as microphone input
-
-  int StartPlayingFileAsMicrophone(int channel,
-                                   const char fileNameUTF8[1024],
-                                   bool loop = false,
-                                   bool mixWithMicrophone = false,
-                                   FileFormats format = kFileFormatPcm16kHzFile,
-                                   float volumeScaling = 1.0) override;
-
-  int StartPlayingFileAsMicrophone(int channel,
-                                   InStream* stream,
-                                   bool mixWithMicrophone = false,
-                                   FileFormats format = kFileFormatPcm16kHzFile,
-                                   float volumeScaling = 1.0) override;
-
-  int StopPlayingFileAsMicrophone(int channel) override;
-
-  int IsPlayingFileAsMicrophone(int channel) override;
-
-  // Record speaker signal to file
-
-  int StartRecordingPlayout(int channel,
-                            const char* fileNameUTF8,
-                            CodecInst* compression = NULL,
-                            int maxSizeBytes = -1) override;
-
-  int StartRecordingPlayout(int channel,
-                            OutStream* stream,
-                            CodecInst* compression = NULL) override;
-
-  int StopRecordingPlayout(int channel) override;
-
-  // Record microphone signal to file
-
-  int StartRecordingMicrophone(const char* fileNameUTF8,
-                               CodecInst* compression = NULL,
-                               int maxSizeBytes = -1) override;
-
-  int StartRecordingMicrophone(OutStream* stream,
-                               CodecInst* compression = NULL) override;
-
-  int StopRecordingMicrophone() override;
-
- protected:
-  VoEFileImpl(voe::SharedData* shared);
-  ~VoEFileImpl() override;
-
- private:
-  voe::SharedData* _shared;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_VOICE_ENGINE_VOE_FILE_IMPL_H
diff --git a/voice_engine/voe_network_impl.cc b/voice_engine/voe_network_impl.cc
deleted file mode 100644
index 26ad417..0000000
--- a/voice_engine/voe_network_impl.cc
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- *  Copyright (c) 2012 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/voice_engine/voe_network_impl.h"
-
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/rtc_base/format_macros.h"
-#include "webrtc/rtc_base/logging.h"
-#include "webrtc/voice_engine/channel.h"
-#include "webrtc/voice_engine/include/voe_errors.h"
-#include "webrtc/voice_engine/voice_engine_impl.h"
-
-namespace webrtc {
-
-VoENetwork* VoENetwork::GetInterface(VoiceEngine* voiceEngine) {
-  if (!voiceEngine) {
-    return nullptr;
-  }
-  VoiceEngineImpl* s = static_cast<VoiceEngineImpl*>(voiceEngine);
-  s->AddRef();
-  return s;
-}
-
-VoENetworkImpl::VoENetworkImpl(voe::SharedData* shared) : _shared(shared) {
-}
-
-VoENetworkImpl::~VoENetworkImpl() = default;
-
-int VoENetworkImpl::RegisterExternalTransport(int channel,
-                                              Transport& transport) {
-  RTC_DCHECK(_shared->statistics().Initialized());
-  voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel);
-  voe::Channel* channelPtr = ch.channel();
-  if (!channelPtr) {
-    LOG_F(LS_ERROR) << "Failed to locate channel: " << channel;
-    return -1;
-  }
-  return channelPtr->RegisterExternalTransport(&transport);
-}
-
-int VoENetworkImpl::DeRegisterExternalTransport(int channel) {
-  RTC_CHECK(_shared->statistics().Initialized());
-  voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel);
-  voe::Channel* channelPtr = ch.channel();
-  if (!channelPtr) {
-    LOG_F(LS_ERROR) << "Failed to locate channel: " << channel;
-    return -1;
-  }
-  return channelPtr->DeRegisterExternalTransport();
-}
-
-int VoENetworkImpl::ReceivedRTPPacket(int channel,
-                                      const void* data,
-                                      size_t length) {
-  return ReceivedRTPPacket(channel, data, length, webrtc::PacketTime());
-}
-
-int VoENetworkImpl::ReceivedRTPPacket(int channel,
-                                      const void* data,
-                                      size_t length,
-                                      const PacketTime& packet_time) {
-  RTC_CHECK(_shared->statistics().Initialized());
-  RTC_CHECK(data);
-  // L16 at 32 kHz, stereo, 10 ms frames (+12 byte RTP header) -> 1292 bytes
-  if ((length < 12) || (length > 1292)) {
-    LOG_F(LS_ERROR) << "Invalid packet length: " << length;
-    return -1;
-  }
-  voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel);
-  voe::Channel* channelPtr = ch.channel();
-  if (!channelPtr) {
-    LOG_F(LS_ERROR) << "Failed to locate channel: " << channel;
-    return -1;
-  }
-  if (!channelPtr->ExternalTransport()) {
-    LOG_F(LS_ERROR) << "No external transport for channel: " << channel;
-    return -1;
-  }
-  return channelPtr->ReceivedRTPPacket(static_cast<const uint8_t*>(data),
-                                       length, packet_time);
-}
-
-int VoENetworkImpl::ReceivedRTCPPacket(int channel,
-                                       const void* data,
-                                       size_t length) {
-  RTC_CHECK(_shared->statistics().Initialized());
-  RTC_CHECK(data);
-  if (length < 4) {
-    LOG_F(LS_ERROR) << "Invalid packet length: " << length;
-    return -1;
-  }
-  voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel);
-  voe::Channel* channelPtr = ch.channel();
-  if (!channelPtr) {
-    LOG_F(LS_ERROR) << "Failed to locate channel: " << channel;
-    return -1;
-  }
-  if (!channelPtr->ExternalTransport()) {
-    LOG_F(LS_ERROR) << "No external transport for channel: " << channel;
-    return -1;
-  }
-  return channelPtr->ReceivedRTCPPacket(static_cast<const uint8_t*>(data),
-                                        length);
-}
-
-}  // namespace webrtc
diff --git a/voice_engine/voe_network_impl.h b/voice_engine/voe_network_impl.h
deleted file mode 100644
index d3601e3..0000000
--- a/voice_engine/voe_network_impl.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- *  Copyright (c) 2012 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_VOICE_ENGINE_VOE_NETWORK_IMPL_H
-#define WEBRTC_VOICE_ENGINE_VOE_NETWORK_IMPL_H
-
-#include "webrtc/voice_engine/include/voe_network.h"
-
-#include "webrtc/voice_engine/shared_data.h"
-
-namespace webrtc {
-
-class VoENetworkImpl : public VoENetwork {
- public:
-  int RegisterExternalTransport(int channel, Transport& transport) override;
-  int DeRegisterExternalTransport(int channel) override;
-
-  int ReceivedRTPPacket(int channel, const void* data, size_t length) override;
-  int ReceivedRTPPacket(int channel,
-                        const void* data,
-                        size_t length,
-                        const PacketTime& packet_time) override;
-
-  int ReceivedRTCPPacket(int channel, const void* data, size_t length) override;
-
- protected:
-  VoENetworkImpl(voe::SharedData* shared);
-  ~VoENetworkImpl() override;
-
- private:
-  voe::SharedData* _shared;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_VOICE_ENGINE_VOE_NETWORK_IMPL_H
diff --git a/voice_engine/voe_network_unittest.cc b/voice_engine/voe_network_unittest.cc
deleted file mode 100644
index 1124c3b..0000000
--- a/voice_engine/voe_network_unittest.cc
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- *  Copyright (c) 2015 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/voice_engine/include/voe_network.h"
-
-#include "webrtc/test/gtest.h"
-#include "webrtc/voice_engine/include/voe_errors.h"
-#include "webrtc/voice_engine/voice_engine_fixture.h"
-
-namespace webrtc {
-
-enum {
-  kMinValidSizeOfRtcpPacketInBytes = 4,
-  kMinValidSizeOfRtpPacketInBytes = 12,
-  kMaxValidSizeOfRtpPacketInBytes = 1292
-};
-
-// A packet with a valid header for both RTP and RTCP.
-// Methods that are tested in this file are checking only packet header.
-static const uint8_t kPacket[kMinValidSizeOfRtpPacketInBytes] = {0x80};
-static const uint8_t kPacketJunk[kMinValidSizeOfRtpPacketInBytes] = {};
-
-static const int kNonExistingChannel = 1234;
-
-class VoENetworkTest : public VoiceEngineFixture {
- protected:
-  int CreateChannelAndRegisterExternalTransport() {
-    EXPECT_EQ(0, base_->Init(&adm_, apm_.get(), nullptr));
-    int channelID = base_->CreateChannel();
-    EXPECT_NE(channelID, -1);
-    EXPECT_EQ(0, network_->RegisterExternalTransport(channelID, transport_));
-    return channelID;
-  }
-};
-
-TEST_F(VoENetworkTest, RegisterAndDeRegisterExternalTransport) {
-  int channelID = CreateChannelAndRegisterExternalTransport();
-  EXPECT_EQ(0, network_->DeRegisterExternalTransport(channelID));
-}
-
-TEST_F(VoENetworkTest,
-       RegisterExternalTransportOnNonExistingChannelShouldFail) {
-  EXPECT_EQ(0, base_->Init(&adm_, apm_.get(), nullptr));
-  EXPECT_NE(
-      0, network_->RegisterExternalTransport(kNonExistingChannel, transport_));
-}
-
-TEST_F(VoENetworkTest,
-       DeRegisterExternalTransportOnNonExistingChannelShouldFail) {
-  EXPECT_EQ(0, base_->Init(&adm_, apm_.get(), nullptr));
-  EXPECT_NE(0, network_->DeRegisterExternalTransport(kNonExistingChannel));
-}
-
-TEST_F(VoENetworkTest, DeRegisterExternalTransportBeforeRegister) {
-  EXPECT_EQ(0, base_->Init(&adm_, apm_.get(), nullptr));
-  int channelID = base_->CreateChannel();
-  EXPECT_NE(channelID, -1);
-  EXPECT_EQ(0, network_->DeRegisterExternalTransport(channelID));
-}
-
-TEST_F(VoENetworkTest, ReceivedRTPPacketWithJunkDataShouldFail) {
-  int channelID = CreateChannelAndRegisterExternalTransport();
-  EXPECT_EQ(-1, network_->ReceivedRTPPacket(channelID, kPacketJunk,
-                                            sizeof(kPacketJunk)));
-}
-
-TEST_F(VoENetworkTest, ReceivedRTPPacketOnNonExistingChannelShouldFail) {
-  EXPECT_EQ(0, base_->Init(&adm_, apm_.get(), nullptr));
-  EXPECT_EQ(-1, network_->ReceivedRTPPacket(kNonExistingChannel, kPacket,
-                                            sizeof(kPacket)));
-}
-
-TEST_F(VoENetworkTest, ReceivedRTPPacketOnChannelWithoutTransportShouldFail) {
-  EXPECT_EQ(0, base_->Init(&adm_, apm_.get(), nullptr));
-  int channelID = base_->CreateChannel();
-  EXPECT_NE(channelID, -1);
-  EXPECT_EQ(-1,
-            network_->ReceivedRTPPacket(channelID, kPacket, sizeof(kPacket)));
-}
-
-TEST_F(VoENetworkTest, ReceivedTooSmallRTPPacketShouldFail) {
-  int channelID = CreateChannelAndRegisterExternalTransport();
-  EXPECT_EQ(-1, network_->ReceivedRTPPacket(
-                    channelID, kPacket, kMinValidSizeOfRtpPacketInBytes - 1));
-}
-
-TEST_F(VoENetworkTest, ReceivedTooLargeRTPPacketShouldFail) {
-  int channelID = CreateChannelAndRegisterExternalTransport();
-  EXPECT_EQ(-1, network_->ReceivedRTPPacket(
-                    channelID, kPacket, kMaxValidSizeOfRtpPacketInBytes + 1));
-}
-
-TEST_F(VoENetworkTest, ReceivedRTCPPacketOnNonExistingChannelShouldFail) {
-  EXPECT_EQ(0, base_->Init(&adm_, apm_.get(), nullptr));
-  EXPECT_EQ(-1, network_->ReceivedRTCPPacket(kNonExistingChannel, kPacket,
-                                             sizeof(kPacket)));
-}
-
-TEST_F(VoENetworkTest, ReceivedRTCPPacketOnChannelWithoutTransportShouldFail) {
-  EXPECT_EQ(0, base_->Init(&adm_, apm_.get(), nullptr));
-  int channelID = base_->CreateChannel();
-  EXPECT_NE(channelID, -1);
-  EXPECT_EQ(-1,
-            network_->ReceivedRTCPPacket(channelID, kPacket, sizeof(kPacket)));
-}
-
-TEST_F(VoENetworkTest, ReceivedTooSmallRTCPPacket4ShouldFail) {
-  int channelID = CreateChannelAndRegisterExternalTransport();
-  EXPECT_EQ(-1, network_->ReceivedRTCPPacket(
-                    channelID, kPacket, kMinValidSizeOfRtcpPacketInBytes - 1));
-}
-
-}  // namespace webrtc
diff --git a/voice_engine/voe_rtp_rtcp_impl.cc b/voice_engine/voe_rtp_rtcp_impl.cc
deleted file mode 100644
index b69ddf3..0000000
--- a/voice_engine/voe_rtp_rtcp_impl.cc
+++ /dev/null
@@ -1,201 +0,0 @@
-/*
- *  Copyright (c) 2012 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/system_wrappers/include/file_wrapper.h"
-#include "webrtc/system_wrappers/include/trace.h"
-#include "webrtc/voice_engine/include/voe_errors.h"
-#include "webrtc/voice_engine/voe_rtp_rtcp_impl.h"
-#include "webrtc/voice_engine/voice_engine_impl.h"
-
-#include "webrtc/voice_engine/channel.h"
-#include "webrtc/voice_engine/transmit_mixer.h"
-
-namespace webrtc {
-
-VoERTP_RTCP* VoERTP_RTCP::GetInterface(VoiceEngine* voiceEngine) {
-  if (NULL == voiceEngine) {
-    return NULL;
-  }
-  VoiceEngineImpl* s = static_cast<VoiceEngineImpl*>(voiceEngine);
-  s->AddRef();
-  return s;
-}
-
-VoERTP_RTCPImpl::VoERTP_RTCPImpl(voe::SharedData* shared) : _shared(shared) {
-  WEBRTC_TRACE(kTraceMemory, kTraceVoice, VoEId(_shared->instance_id(), -1),
-               "VoERTP_RTCPImpl::VoERTP_RTCPImpl() - ctor");
-}
-
-VoERTP_RTCPImpl::~VoERTP_RTCPImpl() {
-  WEBRTC_TRACE(kTraceMemory, kTraceVoice, VoEId(_shared->instance_id(), -1),
-               "VoERTP_RTCPImpl::~VoERTP_RTCPImpl() - dtor");
-}
-
-int VoERTP_RTCPImpl::SetLocalSSRC(int channel, unsigned int ssrc) {
-  WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
-               "SetLocalSSRC(channel=%d, %lu)", channel, ssrc);
-  if (!_shared->statistics().Initialized()) {
-    _shared->SetLastError(VE_NOT_INITED, kTraceError);
-    return -1;
-  }
-  voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel);
-  voe::Channel* channelPtr = ch.channel();
-  if (channelPtr == NULL) {
-    _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError,
-                          "SetLocalSSRC() failed to locate channel");
-    return -1;
-  }
-  return channelPtr->SetLocalSSRC(ssrc);
-}
-
-int VoERTP_RTCPImpl::GetLocalSSRC(int channel, unsigned int& ssrc) {
-  if (!_shared->statistics().Initialized()) {
-    _shared->SetLastError(VE_NOT_INITED, kTraceError);
-    return -1;
-  }
-  voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel);
-  voe::Channel* channelPtr = ch.channel();
-  if (channelPtr == NULL) {
-    _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError,
-                          "GetLocalSSRC() failed to locate channel");
-    return -1;
-  }
-  return channelPtr->GetLocalSSRC(ssrc);
-}
-
-int VoERTP_RTCPImpl::GetRemoteSSRC(int channel, unsigned int& ssrc) {
-  if (!_shared->statistics().Initialized()) {
-    _shared->SetLastError(VE_NOT_INITED, kTraceError);
-    return -1;
-  }
-  voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel);
-  voe::Channel* channelPtr = ch.channel();
-  if (channelPtr == NULL) {
-    _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError,
-                          "GetRemoteSSRC() failed to locate channel");
-    return -1;
-  }
-  return channelPtr->GetRemoteSSRC(ssrc);
-}
-
-int VoERTP_RTCPImpl::SetSendAudioLevelIndicationStatus(int channel,
-                                                       bool enable,
-                                                       unsigned char id) {
-  WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
-               "SetSendAudioLevelIndicationStatus(channel=%d, enable=%d,"
-               " ID=%u)",
-               channel, enable, id);
-  if (!_shared->statistics().Initialized()) {
-    _shared->SetLastError(VE_NOT_INITED, kTraceError);
-    return -1;
-  }
-  if (enable && (id < kVoiceEngineMinRtpExtensionId ||
-                 id > kVoiceEngineMaxRtpExtensionId)) {
-    // [RFC5285] The 4-bit id is the local identifier of this element in
-    // the range 1-14 inclusive.
-    _shared->SetLastError(
-        VE_INVALID_ARGUMENT, kTraceError,
-        "SetSendAudioLevelIndicationStatus() invalid ID parameter");
-    return -1;
-  }
-
-  // Set state and id for the specified channel.
-  voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel);
-  voe::Channel* channelPtr = ch.channel();
-  if (channelPtr == NULL) {
-    _shared->SetLastError(
-        VE_CHANNEL_NOT_VALID, kTraceError,
-        "SetSendAudioLevelIndicationStatus() failed to locate channel");
-    return -1;
-  }
-  return channelPtr->SetSendAudioLevelIndicationStatus(enable, id);
-}
-
-int VoERTP_RTCPImpl::SetRTCPStatus(int channel, bool enable) {
-  WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
-               "SetRTCPStatus(channel=%d, enable=%d)", channel, enable);
-  if (!_shared->statistics().Initialized()) {
-    _shared->SetLastError(VE_NOT_INITED, kTraceError);
-    return -1;
-  }
-  voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel);
-  voe::Channel* channelPtr = ch.channel();
-  if (channelPtr == NULL) {
-    _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError,
-                          "SetRTCPStatus() failed to locate channel");
-    return -1;
-  }
-  channelPtr->SetRTCPStatus(enable);
-  return 0;
-}
-
-int VoERTP_RTCPImpl::GetRTCPStatus(int channel, bool& enabled) {
-  if (!_shared->statistics().Initialized()) {
-    _shared->SetLastError(VE_NOT_INITED, kTraceError);
-    return -1;
-  }
-  voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel);
-  voe::Channel* channelPtr = ch.channel();
-  if (channelPtr == NULL) {
-    _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError,
-                          "GetRTCPStatus() failed to locate channel");
-    return -1;
-  }
-  return channelPtr->GetRTCPStatus(enabled);
-}
-
-int VoERTP_RTCPImpl::SetRTCP_CNAME(int channel, const char cName[256]) {
-  WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
-               "SetRTCP_CNAME(channel=%d, cName=%s)", channel, cName);
-  if (!_shared->statistics().Initialized()) {
-    _shared->SetLastError(VE_NOT_INITED, kTraceError);
-    return -1;
-  }
-  voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel);
-  voe::Channel* channelPtr = ch.channel();
-  if (channelPtr == NULL) {
-    _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError,
-                          "SetRTCP_CNAME() failed to locate channel");
-    return -1;
-  }
-  return channelPtr->SetRTCP_CNAME(cName);
-}
-
-int VoERTP_RTCPImpl::GetRemoteRTCP_CNAME(int channel, char cName[256]) {
-  if (!_shared->statistics().Initialized()) {
-    _shared->SetLastError(VE_NOT_INITED, kTraceError);
-    return -1;
-  }
-  voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel);
-  voe::Channel* channelPtr = ch.channel();
-  if (channelPtr == NULL) {
-    _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError,
-                          "GetRemoteRTCP_CNAME() failed to locate channel");
-    return -1;
-  }
-  return channelPtr->GetRemoteRTCP_CNAME(cName);
-}
-
-int VoERTP_RTCPImpl::GetRTCPStatistics(int channel, CallStatistics& stats) {
-  if (!_shared->statistics().Initialized()) {
-    _shared->SetLastError(VE_NOT_INITED, kTraceError);
-    return -1;
-  }
-  voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel);
-  voe::Channel* channelPtr = ch.channel();
-  if (channelPtr == NULL) {
-    _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError,
-                          "GetRTPStatistics() failed to locate channel");
-    return -1;
-  }
-  return channelPtr->GetRTPStatistics(stats);
-}
-
-}  // namespace webrtc
diff --git a/voice_engine/voe_rtp_rtcp_impl.h b/voice_engine/voe_rtp_rtcp_impl.h
deleted file mode 100644
index 8b75682..0000000
--- a/voice_engine/voe_rtp_rtcp_impl.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- *  Copyright (c) 2012 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_VOICE_ENGINE_VOE_RTP_RTCP_IMPL_H
-#define WEBRTC_VOICE_ENGINE_VOE_RTP_RTCP_IMPL_H
-
-#include "webrtc/voice_engine/include/voe_rtp_rtcp.h"
-
-#include "webrtc/voice_engine/shared_data.h"
-
-namespace webrtc {
-
-class VoERTP_RTCPImpl : public VoERTP_RTCP {
- public:
-  // RTCP
-  int SetRTCPStatus(int channel, bool enable) override;
-
-  int GetRTCPStatus(int channel, bool& enabled) override;
-
-  int SetRTCP_CNAME(int channel, const char cName[256]) override;
-
-  int GetRemoteRTCP_CNAME(int channel, char cName[256]) override;
-
-  // SSRC
-  int SetLocalSSRC(int channel, unsigned int ssrc) override;
-
-  int GetLocalSSRC(int channel, unsigned int& ssrc) override;
-
-  int GetRemoteSSRC(int channel, unsigned int& ssrc) override;
-
-  // RTP Header Extension for Client-to-Mixer Audio Level Indication
-  int SetSendAudioLevelIndicationStatus(int channel,
-                                        bool enable,
-                                        unsigned char id) override;
-
-  int GetRTCPStatistics(int channel, CallStatistics& stats) override;
-
- protected:
-  VoERTP_RTCPImpl(voe::SharedData* shared);
-  ~VoERTP_RTCPImpl() override;
-
- private:
-  voe::SharedData* _shared;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_VOICE_ENGINE_VOE_RTP_RTCP_IMPL_H
diff --git a/voice_engine/voice_engine_defines.h b/voice_engine/voice_engine_defines.h
deleted file mode 100644
index 3b86c6a..0000000
--- a/voice_engine/voice_engine_defines.h
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- *  Copyright (c) 2012 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.
- */
-
-/*
- *  This file contains common constants for VoiceEngine, as well as
- *  platform specific settings.
- */
-
-#ifndef WEBRTC_VOICE_ENGINE_VOICE_ENGINE_DEFINES_H
-#define WEBRTC_VOICE_ENGINE_VOICE_ENGINE_DEFINES_H
-
-#include "webrtc/common_types.h"
-#include "webrtc/modules/audio_processing/include/audio_processing.h"
-#include "webrtc/typedefs.h"
-
-namespace webrtc {
-
-// VolumeControl
-enum { kMinVolumeLevel = 0 };
-enum { kMaxVolumeLevel = 255 };
-// Min scale factor for per-channel volume scaling
-const float kMinOutputVolumeScaling = 0.0f;
-// Max scale factor for per-channel volume scaling
-const float kMaxOutputVolumeScaling = 10.0f;
-// Min scale factor for output volume panning
-const float kMinOutputVolumePanning = 0.0f;
-// Max scale factor for output volume panning
-const float kMaxOutputVolumePanning = 1.0f;
-
-// Audio processing
-const NoiseSuppression::Level kDefaultNsMode = NoiseSuppression::kModerate;
-const GainControl::Mode kDefaultAgcMode =
-#if defined(WEBRTC_ANDROID) || defined(WEBRTC_IOS)
-    GainControl::kAdaptiveDigital;
-#else
-    GainControl::kAdaptiveAnalog;
-#endif
-const bool kDefaultAgcState =
-#if defined(WEBRTC_ANDROID) || defined(WEBRTC_IOS)
-    false;
-#else
-    true;
-#endif
-const GainControl::Mode kDefaultRxAgcMode = GainControl::kAdaptiveDigital;
-
-// VideoSync
-// Lowest minimum playout delay
-enum { kVoiceEngineMinMinPlayoutDelayMs = 0 };
-// Highest minimum playout delay
-enum { kVoiceEngineMaxMinPlayoutDelayMs = 10000 };
-
-// RTP/RTCP
-// Min 4-bit ID for RTP extension (see section 4.2 in RFC 5285)
-enum { kVoiceEngineMinRtpExtensionId = 1 };
-// Max 4-bit ID for RTP extension
-enum { kVoiceEngineMaxRtpExtensionId = 14 };
-
-}  // namespace webrtc
-
-#define NOT_SUPPORTED(stat)                 \
-  LOG_F(LS_ERROR) << "not supported";       \
-  stat.SetLastError(VE_FUNC_NOT_SUPPORTED); \
-  return -1;
-
-namespace webrtc {
-
-inline int VoEId(int veId, int chId) {
-  if (chId == -1) {
-    const int dummyChannel(99);
-    return (int)((veId << 16) + dummyChannel);
-  }
-  return (int)((veId << 16) + chId);
-}
-
-inline int VoEModuleId(int veId, int chId) {
-  return (int)((veId << 16) + chId);
-}
-
-// Convert module ID to internal VoE channel ID
-inline int VoEChannelId(int moduleId) {
-  return (int)(moduleId & 0xffff);
-}
-
-}  // namespace webrtc
-
-#if defined(_WIN32)
-#define WEBRTC_VOICE_ENGINE_DEFAULT_DEVICE \
-  AudioDeviceModule::kDefaultCommunicationDevice
-#else
-#define WEBRTC_VOICE_ENGINE_DEFAULT_DEVICE 0
-#endif  // #if (defined(_WIN32)
-
-#endif  // WEBRTC_VOICE_ENGINE_VOICE_ENGINE_DEFINES_H
diff --git a/voice_engine/voice_engine_fixture.cc b/voice_engine/voice_engine_fixture.cc
deleted file mode 100644
index 3cb613d..0000000
--- a/voice_engine/voice_engine_fixture.cc
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- *  Copyright (c) 2015 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/voice_engine/voice_engine_fixture.h"
-#include "webrtc/modules/audio_processing/include/mock_audio_processing.h"
-
-namespace webrtc {
-
-VoiceEngineFixture::VoiceEngineFixture()
-    : voe_(VoiceEngine::Create()),
-      base_(VoEBase::GetInterface(voe_)),
-      network_(VoENetwork::GetInterface(voe_)) {
-  EXPECT_NE(nullptr, base_);
-  EXPECT_NE(nullptr, network_);
-  EXPECT_EQ(0, base_->RegisterVoiceEngineObserver(observer_));
-  apm_ = new rtc::RefCountedObject<test::MockAudioProcessing>();
-}
-
-VoiceEngineFixture::~VoiceEngineFixture() {
-  EXPECT_EQ(2, network_->Release());
-  EXPECT_EQ(0, base_->DeRegisterVoiceEngineObserver());
-  EXPECT_EQ(0, base_->Terminate());
-  EXPECT_EQ(1, base_->Release());
-  EXPECT_TRUE(VoiceEngine::Delete(voe_));
-}
-
-}  // namespace webrtc
diff --git a/voice_engine/voice_engine_fixture.h b/voice_engine/voice_engine_fixture.h
deleted file mode 100644
index 9f2f316..0000000
--- a/voice_engine/voice_engine_fixture.h
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- *  Copyright (c) 2015 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_device/include/fake_audio_device.h"
-#include "webrtc/modules/audio_processing/include/audio_processing.h"
-#include "webrtc/test/gtest.h"
-#include "webrtc/test/mock_transport.h"
-#include "webrtc/voice_engine/include/voe_base.h"
-#include "webrtc/voice_engine/include/voe_network.h"
-#include "webrtc/voice_engine/mock/mock_voe_observer.h"
-
-namespace webrtc {
-
-class VoiceEngineFixture : public ::testing::Test {
- protected:
-  VoiceEngineFixture();
-  ~VoiceEngineFixture();
-
-  VoiceEngine* voe_;
-  VoEBase* base_;
-  VoENetwork* network_;
-  MockVoEObserver observer_;
-  FakeAudioDeviceModule adm_;
-  MockTransport transport_;
-  rtc::scoped_refptr<AudioProcessing> apm_;
-};
-
-}  // namespace webrtc
diff --git a/voice_engine/voice_engine_impl.cc b/voice_engine/voice_engine_impl.cc
deleted file mode 100644
index d2d0fdd..0000000
--- a/voice_engine/voice_engine_impl.cc
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- *  Copyright (c) 2012 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.
- */
-
-#if defined(WEBRTC_ANDROID)
-#include "webrtc/modules/audio_device/android/audio_device_template.h"
-#include "webrtc/modules/audio_device/android/audio_record_jni.h"
-#include "webrtc/modules/audio_device/android/audio_track_jni.h"
-#endif
-
-#include "webrtc/modules/audio_coding/include/audio_coding_module.h"
-#include "webrtc/rtc_base/checks.h"
-#include "webrtc/system_wrappers/include/trace.h"
-#include "webrtc/voice_engine/channel_proxy.h"
-#include "webrtc/voice_engine/voice_engine_impl.h"
-
-namespace webrtc {
-
-// Counter to be ensure that we can add a correct ID in all static trace
-// methods. It is not the nicest solution, especially not since we already
-// have a counter in VoEBaseImpl. In other words, there is room for
-// improvement here.
-static int32_t gVoiceEngineInstanceCounter = 0;
-
-VoiceEngine* GetVoiceEngine() {
-  VoiceEngineImpl* self = new VoiceEngineImpl();
-  if (self != NULL) {
-    self->AddRef();  // First reference.  Released in VoiceEngine::Delete.
-    gVoiceEngineInstanceCounter++;
-  }
-  return self;
-}
-
-int VoiceEngineImpl::AddRef() {
-  return ++_ref_count;
-}
-
-// This implements the Release() method for all the inherited interfaces.
-int VoiceEngineImpl::Release() {
-  int new_ref = --_ref_count;
-  assert(new_ref >= 0);
-  if (new_ref == 0) {
-    WEBRTC_TRACE(kTraceApiCall, kTraceVoice, -1,
-                 "VoiceEngineImpl self deleting (voiceEngine=0x%p)", this);
-
-    // Clear any pointers before starting destruction. Otherwise worker-
-    // threads will still have pointers to a partially destructed object.
-    // Example: AudioDeviceBuffer::RequestPlayoutData() can access a
-    // partially deconstructed |_ptrCbAudioTransport| during destruction
-    // if we don't call Terminate here.
-    Terminate();
-    delete this;
-  }
-
-  return new_ref;
-}
-
-std::unique_ptr<voe::ChannelProxy> VoiceEngineImpl::GetChannelProxy(
-    int channel_id) {
-  RTC_DCHECK(channel_id >= 0);
-  rtc::CritScope cs(crit_sec());
-  RTC_DCHECK(statistics().Initialized());
-  return std::unique_ptr<voe::ChannelProxy>(
-      new voe::ChannelProxy(channel_manager().GetChannel(channel_id)));
-}
-
-VoiceEngine* VoiceEngine::Create() {
-  return GetVoiceEngine();
-}
-
-int VoiceEngine::SetTraceFilter(unsigned int filter) {
-  WEBRTC_TRACE(kTraceApiCall, kTraceVoice,
-               VoEId(gVoiceEngineInstanceCounter, -1),
-               "SetTraceFilter(filter=0x%x)", filter);
-
-  // Remember old filter
-  uint32_t oldFilter = Trace::level_filter();
-  Trace::set_level_filter(filter);
-
-  // If previous log was ignored, log again after changing filter
-  if (kTraceNone == oldFilter) {
-    WEBRTC_TRACE(kTraceApiCall, kTraceVoice, -1, "SetTraceFilter(filter=0x%x)",
-                 filter);
-  }
-
-  return 0;
-}
-
-int VoiceEngine::SetTraceFile(const char* fileNameUTF8, bool addFileCounter) {
-  int ret = Trace::SetTraceFile(fileNameUTF8, addFileCounter);
-  WEBRTC_TRACE(kTraceApiCall, kTraceVoice,
-               VoEId(gVoiceEngineInstanceCounter, -1),
-               "SetTraceFile(fileNameUTF8=%s, addFileCounter=%d)", fileNameUTF8,
-               addFileCounter);
-  return (ret);
-}
-
-int VoiceEngine::SetTraceCallback(TraceCallback* callback) {
-  WEBRTC_TRACE(kTraceApiCall, kTraceVoice,
-               VoEId(gVoiceEngineInstanceCounter, -1),
-               "SetTraceCallback(callback=0x%x)", callback);
-  return (Trace::SetTraceCallback(callback));
-}
-
-bool VoiceEngine::Delete(VoiceEngine*& voiceEngine) {
-  if (voiceEngine == NULL)
-    return false;
-
-  VoiceEngineImpl* s = static_cast<VoiceEngineImpl*>(voiceEngine);
-  // Release the reference that was added in GetVoiceEngine.
-  int ref = s->Release();
-  voiceEngine = NULL;
-
-  if (ref != 0) {
-    WEBRTC_TRACE(
-        kTraceWarning, kTraceVoice, -1,
-        "VoiceEngine::Delete did not release the very last reference.  "
-        "%d references remain.",
-        ref);
-  }
-
-  return true;
-}
-
-std::string VoiceEngine::GetVersionString() {
-  std::string version = "VoiceEngine 4.1.0";
-#ifdef WEBRTC_EXTERNAL_TRANSPORT
-  version += " (External transport build)";
-#endif
-  return version;
-}
-
-}  // namespace webrtc
diff --git a/voice_engine/voice_engine_impl.h b/voice_engine/voice_engine_impl.h
deleted file mode 100644
index a224271..0000000
--- a/voice_engine/voice_engine_impl.h
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- *  Copyright (c) 2012 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_VOICE_ENGINE_VOICE_ENGINE_IMPL_H
-#define WEBRTC_VOICE_ENGINE_VOICE_ENGINE_IMPL_H
-
-#include <memory>
-
-#include "webrtc/system_wrappers/include/atomic32.h"
-#include "webrtc/typedefs.h"
-#include "webrtc/voice_engine/voe_base_impl.h"
-#include "webrtc/voice_engine/voe_codec_impl.h"
-#include "webrtc/voice_engine/voe_file_impl.h"
-#include "webrtc/voice_engine/voe_network_impl.h"
-#include "webrtc/voice_engine/voe_rtp_rtcp_impl.h"
-
-namespace webrtc {
-namespace voe {
-class ChannelProxy;
-}  // namespace voe
-
-class VoiceEngineImpl : public voe::SharedData,  // Must be the first base class
-                        public VoiceEngine,
-                        public VoECodecImpl,
-                        public VoEFileImpl,
-                        public VoENetworkImpl,
-                        public VoERTP_RTCPImpl,
-                        public VoEBaseImpl {
- public:
-  VoiceEngineImpl()
-      : SharedData(),
-        VoECodecImpl(this),
-        VoEFileImpl(this),
-        VoENetworkImpl(this),
-        VoERTP_RTCPImpl(this),
-        VoEBaseImpl(this),
-        _ref_count(0) {}
-  ~VoiceEngineImpl() override { assert(_ref_count.Value() == 0); }
-
-  int AddRef();
-
-  // This implements the Release() method for all the inherited interfaces.
-  int Release() override;
-
-  // Backdoor to access a voe::Channel object without a channel ID. This is only
-  // to be used while refactoring the VoE API!
-  virtual std::unique_ptr<voe::ChannelProxy> GetChannelProxy(int channel_id);
-
- // This is *protected* so that FakeVoiceEngine can inherit from the class and
- // manipulate the reference count. See: fake_voice_engine.h.
- protected:
-  Atomic32 _ref_count;
-};
-
-}  // namespace webrtc
-
-#endif  // WEBRTC_VOICE_ENGINE_VOICE_ENGINE_IMPL_H
diff --git a/webrtc.gni b/webrtc.gni
deleted file mode 100644
index af4d6f9..0000000
--- a/webrtc.gni
+++ /dev/null
@@ -1,391 +0,0 @@
-# Copyright (c) 2014 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.
-
-import("//build/config/arm.gni")
-import("//build/config/features.gni")
-import("//build/config/mips.gni")
-import("//build/config/sanitizers/sanitizers.gni")
-import("//build/config/ui.gni")
-import("//build_overrides/build.gni")
-import("//testing/test.gni")
-
-if (!build_with_chromium && is_component_build) {
-  print("The Gn argument `is_component_build` is currently " +
-        "ignored for WebRTC builds.")
-  print("Component builds are supported by Chromium and the argument " +
-        "`is_component_build` makes it possible to create shared libraries " +
-        "instead of static libraries.")
-  print("If an app depends on WebRTC it makes sense to just depend on the " +
-        "WebRTC static library, so there is no difference between " +
-        "`is_component_build=true` and `is_component_build=false`.")
-  print(
-      "More info about component builds at: " + "https://chromium.googlesource.com/chromium/src/+/master/docs/component_build.md")
-  assert(!is_component_build, "Component builds are not supported in WebRTC.")
-}
-
-if (is_ios) {
-  import("//build/config/ios/rules.gni")
-}
-
-declare_args() {
-  # Disable this to avoid building the Opus audio codec.
-  rtc_include_opus = true
-
-  # Enable this if the Opus version upon which WebRTC is built supports direct
-  # encoding of 120 ms packets.
-  rtc_opus_support_120ms_ptime = true
-
-  # Enable this to let the Opus audio codec change complexity on the fly.
-  rtc_opus_variable_complexity = false
-
-  # Used to specify an external Jsoncpp include path when not compiling the
-  # library that comes with WebRTC (i.e. rtc_build_json == 0).
-  rtc_jsoncpp_root = "//third_party/jsoncpp/source/include"
-
-  # Used to specify an external OpenSSL include path when not compiling the
-  # library that comes with WebRTC (i.e. rtc_build_ssl == 0).
-  rtc_ssl_root = ""
-
-  # Selects fixed-point code where possible.
-  rtc_prefer_fixed_point = false
-
-  # Enables the use of protocol buffers for debug recordings.
-  rtc_enable_protobuf = true
-
-  # Disable the code for the intelligibility enhancer by default.
-  rtc_enable_intelligibility_enhancer = false
-
-  # Enable when an external authentication mechanism is used for performing
-  # packet authentication for RTP packets instead of libsrtp.
-  rtc_enable_external_auth = build_with_chromium
-
-  # Selects whether debug dumps for the audio processing module
-  # should be generated.
-  apm_debug_dump = false
-
-  # Set this to true to enable BWE test logging.
-  rtc_enable_bwe_test_logging = false
-
-  # Set this to disable building with support for SCTP data channels.
-  rtc_enable_sctp = true
-
-  # Disable these to not build components which can be externally provided.
-  rtc_build_json = true
-  rtc_build_libsrtp = true
-  rtc_build_libvpx = true
-  rtc_libvpx_build_vp9 = true
-  rtc_build_libyuv = true
-  rtc_build_openmax_dl = true
-  rtc_build_opus = true
-  rtc_build_ssl = true
-  rtc_build_usrsctp = true
-
-  # Enable to use the Mozilla internal settings.
-  build_with_mozilla = false
-
-  rtc_enable_android_opensl = false
-
-  # Link-Time Optimizations.
-  # Executes code generation at link-time instead of compile-time.
-  # https://gcc.gnu.org/wiki/LinkTimeOptimization
-  rtc_use_lto = false
-
-  # Set to "func", "block", "edge" for coverage generation.
-  # At unit test runtime set UBSAN_OPTIONS="coverage=1".
-  # It is recommend to set include_examples=0.
-  # Use llvm's sancov -html-report for human readable reports.
-  # See http://clang.llvm.org/docs/SanitizerCoverage.html .
-  rtc_sanitize_coverage = ""
-
-  # Links a default implementation of task queues to targets
-  # that depend on the target rtc_task_queue. Set to false to
-  # use an external implementation.
-  rtc_link_task_queue_impl = true
-
-  # Enable libevent task queues on platforms that support it.
-  # rtc_link_task_queue_impl must be set to true for this to
-  # have an effect.
-  if (is_win || is_mac || is_ios || is_nacl) {
-    rtc_enable_libevent = false
-    rtc_build_libevent = false
-  } else {
-    rtc_enable_libevent = true
-    rtc_build_libevent = true
-  }
-
-  if (current_cpu == "arm" || current_cpu == "arm64") {
-    rtc_prefer_fixed_point = true
-  }
-
-  if (!is_ios && (current_cpu != "arm" || arm_version >= 7) &&
-      current_cpu != "mips64el") {
-    rtc_use_openmax_dl = true
-  } else {
-    rtc_use_openmax_dl = false
-  }
-
-  # Determines whether NEON code will be built.
-  rtc_build_with_neon =
-      (current_cpu == "arm" && arm_use_neon) || current_cpu == "arm64"
-
-  # Enable this to build OpenH264 encoder/FFmpeg decoder. This is supported on
-  # all platforms except Android and iOS. Because FFmpeg can be built
-  # with/without H.264 support, |ffmpeg_branding| has to separately be set to a
-  # value that includes H.264, for example "Chrome". If FFmpeg is built without
-  # H.264, compilation succeeds but |H264DecoderImpl| fails to initialize. See
-  # also: |rtc_initialize_ffmpeg|.
-  # CHECK THE OPENH264, FFMPEG AND H.264 LICENSES/PATENTS BEFORE BUILDING.
-  # http://www.openh264.org, https://www.ffmpeg.org/
-  rtc_use_h264 = proprietary_codecs && !is_android && !is_ios
-
-  # Determines whether QUIC code will be built.
-  rtc_use_quic = false
-
-  # By default, use normal platform audio support or dummy audio, but don't
-  # use file-based audio playout and record.
-  rtc_use_dummy_audio_file_devices = false
-
-  # When set to true, replace the audio output with a sinus tone at 440Hz.
-  # The ADM will ask for audio data from WebRTC but instead of reading real
-  # audio samples from NetEQ, a sinus tone will be generated and replace the
-  # real audio samples.
-  rtc_audio_device_plays_sinus_tone = false
-
-  # When set to true, test targets will declare the files needed to run memcheck
-  # as data dependencies. This is to enable memcheck execution on swarming bots.
-  rtc_use_memcheck = false
-
-  # FFmpeg must be initialized for |H264DecoderImpl| to work. This can be done
-  # by WebRTC during |H264DecoderImpl::InitDecode| or externally. FFmpeg must
-  # only be initialized once. Projects that initialize FFmpeg externally, such
-  # as Chromium, must turn this flag off so that WebRTC does not also
-  # initialize.
-  rtc_initialize_ffmpeg = !build_with_chromium
-
-  # Build sources requiring GTK. NOTICE: This is not present in Chrome OS
-  # build environments, even if available for Chromium builds.
-  rtc_use_gtk = !build_with_chromium
-}
-
-# A second declare_args block, so that declarations within it can
-# depend on the possibly overridden variables in the first
-# declare_args block.
-declare_args() {
-  # Include the iLBC audio codec?
-  rtc_include_ilbc = !(build_with_chromium || build_with_mozilla)
-
-  rtc_restrict_logging = build_with_chromium
-
-  # Excluded in Chromium since its prerequisites don't require Pulse Audio.
-  rtc_include_pulse_audio = !build_with_chromium
-
-  # Chromium uses its own IO handling, so the internal ADM is only built for
-  # standalone WebRTC.
-  rtc_include_internal_audio_device = !build_with_chromium
-
-  # Include tests in standalone checkout.
-  rtc_include_tests = !build_with_chromium
-}
-
-# Make it possible to provide custom locations for some libraries (move these
-# up into declare_args should we need to actually use them for the GN build).
-rtc_libvpx_dir = "//third_party/libvpx"
-rtc_libyuv_dir = "//third_party/libyuv"
-rtc_opus_dir = "//third_party/opus"
-
-# Desktop capturer is supported only on Windows, OSX and Linux.
-rtc_desktop_capture_supported = is_win || is_mac || (is_linux && use_x11)
-
-###############################################################################
-# Templates
-#
-
-# Points to //webrtc/ in webrtc stand-alone or to //third_party/webrtc/ in
-# chromium.
-# We need absolute paths for all configs in templates as they are shared in
-# different subdirectories.
-webrtc_root = get_path_info(".", "abspath")
-
-# Global configuration that should be applied to all WebRTC targets.
-# You normally shouldn't need to include this in your target as it's
-# automatically included when using the rtc_* templates.
-# It sets defines, include paths and compilation warnings accordingly,
-# both for WebRTC stand-alone builds and for the scenario when WebRTC
-# native code is built as part of Chromium.
-rtc_common_configs = [ webrtc_root + ":common_config" ]
-
-if (is_mac || is_ios) {
-  rtc_common_configs += [ "//build/config/compiler:enable_arc" ]
-}
-
-# Global public configuration that should be applied to all WebRTC targets. You
-# normally shouldn't need to include this in your target as it's automatically
-# included when using the rtc_* templates. It set the defines, include paths and
-# compilation warnings that should be propagated to dependents of the targets
-# depending on the target having this config.
-rtc_common_inherited_config = webrtc_root + ":common_inherited_config"
-
-# Common configs to remove or add in all rtc targets.
-rtc_remove_configs = []
-rtc_add_configs = rtc_common_configs
-
-set_defaults("rtc_test") {
-  configs = rtc_add_configs
-  suppressed_configs = []
-}
-
-set_defaults("rtc_source_set") {
-  configs = rtc_add_configs
-  suppressed_configs = []
-}
-
-set_defaults("rtc_executable") {
-  configs = rtc_add_configs
-  suppressed_configs = []
-}
-
-set_defaults("rtc_static_library") {
-  configs = rtc_add_configs
-  suppressed_configs = []
-}
-
-set_defaults("rtc_shared_library") {
-  configs = rtc_add_configs
-  suppressed_configs = []
-}
-
-template("rtc_test") {
-  test(target_name) {
-    forward_variables_from(invoker,
-                           "*",
-                           [
-                             "configs",
-                             "public_configs",
-                             "suppressed_configs",
-                           ])
-    configs += invoker.configs
-    configs -= rtc_remove_configs
-    configs -= invoker.suppressed_configs
-    public_configs = [ rtc_common_inherited_config ]
-    if (defined(invoker.public_configs)) {
-      public_configs += invoker.public_configs
-    }
-    if (!build_with_chromium && is_android) {
-      android_manifest = webrtc_root + "test/android/AndroidManifest.xml"
-      deps += [ webrtc_root + "test:native_test_java" ]
-    }
-  }
-}
-
-template("rtc_source_set") {
-  source_set(target_name) {
-    forward_variables_from(invoker,
-                           "*",
-                           [
-                             "configs",
-                             "public_configs",
-                             "suppressed_configs",
-                           ])
-    configs += invoker.configs
-    configs -= rtc_remove_configs
-    configs -= invoker.suppressed_configs
-    public_configs = [ rtc_common_inherited_config ]
-    if (defined(invoker.public_configs)) {
-      public_configs += invoker.public_configs
-    }
-  }
-}
-
-template("rtc_executable") {
-  executable(target_name) {
-    forward_variables_from(invoker,
-                           "*",
-                           [
-                             "deps",
-                             "configs",
-                             "public_configs",
-                             "suppressed_configs",
-                           ])
-    configs += invoker.configs
-    configs -= rtc_remove_configs
-    configs -= invoker.suppressed_configs
-    deps = [
-      "//build/config:exe_and_shlib_deps",
-    ]
-    deps += invoker.deps
-
-    public_configs = [ rtc_common_inherited_config ]
-    if (defined(invoker.public_configs)) {
-      public_configs += invoker.public_configs
-    }
-  }
-}
-
-template("rtc_static_library") {
-  static_library(target_name) {
-    forward_variables_from(invoker,
-                           "*",
-                           [
-                             "configs",
-                             "public_configs",
-                             "suppressed_configs",
-                           ])
-    configs += invoker.configs
-    configs -= rtc_remove_configs
-    configs -= invoker.suppressed_configs
-    public_configs = [ rtc_common_inherited_config ]
-    if (defined(invoker.public_configs)) {
-      public_configs += invoker.public_configs
-    }
-  }
-}
-
-template("rtc_shared_library") {
-  shared_library(target_name) {
-    forward_variables_from(invoker,
-                           "*",
-                           [
-                             "configs",
-                             "public_configs",
-                             "suppressed_configs",
-                           ])
-    configs += invoker.configs
-    configs -= rtc_remove_configs
-    configs -= invoker.suppressed_configs
-    public_configs = [ rtc_common_inherited_config ]
-    if (defined(invoker.public_configs)) {
-      public_configs += invoker.public_configs
-    }
-  }
-}
-
-if (is_ios) {
-  set_defaults("rtc_ios_xctest_test") {
-    configs = rtc_add_configs
-    suppressed_configs = []
-  }
-
-  template("rtc_ios_xctest_test") {
-    ios_xctest_test(target_name) {
-      forward_variables_from(invoker,
-                             "*",
-                             [
-                               "configs",
-                               "public_configs",
-                               "suppressed_configs",
-                             ])
-      configs += invoker.configs
-      configs -= rtc_remove_configs
-      configs -= invoker.suppressed_configs
-      public_configs = [ rtc_common_inherited_config ]
-      if (defined(invoker.public_configs)) {
-        public_configs += invoker.public_configs
-      }
-    }
-  }
-}
diff --git a/whitespace.txt b/whitespace.txt
deleted file mode 100644
index fbd9531..0000000
--- a/whitespace.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-You can modify this file to create no-op changelists.
-Try to write something funny. And please don't add trailing whitespace.
-
-Once upon a time there was an elephant in Stockholm.
-
